ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTgyYzk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ij4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3NzZS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJmMzBlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotanNwbW9kZWwuamFyCi1kZXYucHJvcGVydGllcwotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlXzYuMC4wLmphcgotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmVfNi4wLjAuemlwCi1qc3Btb2RlbHNyYy56aXAKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YTJjOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWc9dHJ1ZQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RyYWNlZmlsdGVyPQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcGluZGV4bWFuYWdlcj1mYWxzZQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHRyYW5zbGF0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwdHJhbnNsYXRpb25zdG9kaXNrPWZhbHNlCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwc2VhcmNoPWZhbHNlCi0KLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS90YWdsaWIvcmVzb2x2ZT1mYWxzZQotCi0KLSMgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNvbnRlbnRtb2RlbC50bGQuVExEQ01Eb2N1bWVudE1hbmFnZXIuX2RlYnVnCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGxkY21kb2N1bWVudC9tYW5hZ2VyPWZhbHNlCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGxkY21kb2N1bWVudC9jYWNoZT1mYWxzZQotCi0jIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jb250ZW50bW9kZWwudGxkLkNNRG9jdW1lbnRGYWN0b3J5VExELl9kZWJ1Zwotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RsZGNtZG9jdW1lbnQvZmFjdG9yeT1mYWxzZQotCi0jb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9qZWN0RGVzY3JpcHRpb24uX2RlYnVnSW5kZXhDcmVhdGlvbgotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3RhZ2xpYi9pbmRleGNyZWF0aW9uPWZhbHNlCi0jb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9qZWN0RGVzY3JpcHRpb24uX2RlYnVnSW5kZXhUaW1lCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL2luZGV4dGltZT1mYWxzZQotCi0jb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJJbmRleC5fZGVidWdFdmVudHMKLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS90YWdsaWIvZXZlbnRzPWZhbHNlCi0jb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJJbmRleC5fZGVidWdJbmRleENyZWF0aW9uCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL2luZGV4Y3JlYXRpb249ZmFsc2UKLSNvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkluZGV4Ll9kZWJ1Z1Jlc29sdXRpb24KLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS90YWdsaWIvcmVzb2x2ZT1mYWxzZQotCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwamF2YW1hcHBpbmc9ZmFsc2UKLQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHZhbGlkYXRvcj1mYWxzZQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RhZ2xpYnZhcnM9ZmFsc2UKLQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RhZ2xpYmNsYXNzbG9hZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxMGI3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkZGM2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jV2VkIE1hciAyOCAwMjo1NjoxMiBFRFQgMjAwNw0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjINCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDANCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MjJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9DU1NKU1BQYXJzZXIvSG93VG9HZW4uaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L0NTU0pTUFBhcnNlci9Ib3dUb0dlbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTQzOWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L0NTU0pTUFBhcnNlci9Ib3dUb0dlbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotPHA+Ci1KU1BlZENTU1Rva2VuaXplciBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IDxhIGhyZWY9Imh0dHA6Ly93d3cuamZsZXguZGUvIj5KRmxleDwvYT4gMS40LjEgCi1mcm9tIHRoZSBKU1BlZENTU1Rva2VuaXplci5mbGV4IGdyYW1tZXIgZmlsZS4KLUFmdGVyIGdlbmVyYXRpbmcgdGhlIHNjYW5uZXIsIEkgcmVtb3ZlZCB1bnVzZWQgcHJpdmF0ZSBmaWVsZCBlcnJvcnMuCi08L3A+Ci08L2JvZHk+Ci08aHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L0NTU0pTUFBhcnNlci9KU1BlZENTU1Rva2VuaXplci5mbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvRGV2VGltZVN1cHBvcnQvQ1NTSlNQUGFyc2VyL0pTUGVkQ1NTVG9rZW5pemVyLmZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ODE5NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvRGV2VGltZVN1cHBvcnQvQ1NTSlNQUGFyc2VyL0pTUGVkQ1NTVG9rZW5pemVyLmZsZXgKKysrIC9kZXYvbnVsbApAQCAtMSw1OTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXI7DQotDQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkpTUGVkQ1NTUmVnaW9uQ29udGV4dHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTUmVnaW9uVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5JQ1NTVG9rZW5pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuQ1NTVGV4dFJlZ2lvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247DQotDQotJSUNCi0NCi0lcHVibGljDQotJWNsYXNzIEpTUGVkQ1NTVG9rZW5pemVyDQotJWltcGxlbWVudHMgSlNQZWRDU1NSZWdpb25Db250ZXh0cywgSUNTU1Rva2VuaXplcg0KLSVmdW5jdGlvbiBwcmltR2V0TmV4dFRva2VuDQotJXR5cGUgU3RyaW5nDQotJWNoYXINCi0lbGluZQ0KLSV1bmljb2RlDQotJWNhc2VsZXNzDQotJXBhY2sNCi0NCi0lew0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVU5ERUZJTkVEID0gInVuZGVmaW5lZCI7DQotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOw0KLQlwcml2YXRlIGludCBmQnVmZmVyZWRTdGFydDsNCi0vLwlwcml2YXRlIGludCBmQnVmZmVyZWRUZXh0TGVuZ3RoOw0KLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGg7DQotLy8JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZkJ1ZmZlcmVkVGV4dCA9IG51bGw7DQotCXByaXZhdGUgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBDU1NUZXh0UmVnaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOw0KLQlwcml2YXRlIGludCBmSW5pdGlhbFN0YXRlID0gWVlJTklUSUFMOw0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCVUZGRVJfU0laRV9OT1JNQUwgPSAxNjM4NDsNCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfU01BTEwgPSAyNTY7DQotCXByaXZhdGUgaW50IGZJbml0aWFsQnVmZmVyU2l6ZSA9IEJVRkZFUl9TSVpFX05PUk1BTDsNCi0NCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFN0YXRlKGludCBzdGF0ZSkgew0KLQkJZkluaXRpYWxTdGF0ZSA9IHN0YXRlOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsQnVmZmVyU2l6ZShpbnQgc2l6ZSkgew0KLQkJZkluaXRpYWxCdWZmZXJTaXplID0gc2l6ZTsNCi0JfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLSAgCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJU3RyaW5nIGNvbnRleHQ7DQotCQlTdHJpbmcgbmV4dFRva2VuVHlwZTsNCi0JCWJvb2xlYW4gc3BhY2VGb2xsb3dzOw0KLS8vCQlTdHJpbmdCdWZmZXIgdGV4dDsNCi0JCWludCBzdGFydDsNCi0JCWludCB0ZXh0TGVuZ3RoOw0KLQkJaW50IGxlbmd0aDsNCi0JCWlmIChmQnVmZmVyZWRDb250ZXh0ICE9IG51bGwpIHsNCi0JCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsNCi0vLwkJCXRleHQgPSBmQnVmZmVyZWRUZXh0Ow0KLQkJCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7DQotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsNCi0NCi0JCQlmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsNCi0JCX0gZWxzZSB7DQotCQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0vLwkJCXRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsNCi0JCQlzdGFydCA9IHl5Y2hhcjsNCi0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCX0NCi0NCi0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsNCi0JCQlpZiAoY29udGV4dCA9PSBDU1NfSlNQX1NDUklQVExFVCB8fCBjb250ZXh0ID09IENTU19KU1BfRUwpew0KLQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQl3aGlsZSAobmV4dFRva2VuVHlwZSAhPSBDU1NfSlNQX0VORCAmJiBuZXh0VG9rZW5UeXBlICE9IENTU19FTF9FTkQgJiYgbmV4dFRva2VuVHlwZSAhPSBDU1NfSlNQX0NPTU1FTlQpIHsNCi0vLwkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOw0KLQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOw0KLQkJCQkJbGVuZ3RoID0gdGV4dExlbmd0aDsNCi0JCQkJCWlmIChjb250ZXh0LmVxdWFscyhDU1NfSlNQX1NDUklQVExFVCkgJiYgKHl5c3RhdGUoKSA9PSBTVF9KU1BfRElSRUNUSVZFIHx8IHl5c3RhdGUoKSA9PSBTVF9KU1BfRVhQIHx8IHl5c3RhdGUoKSA9PSBTVF9KU1BfREVDTEFSQVRJT04pKXsNCi0JCQkJCQljb250ZXh0ID0gbmV4dFRva2VuVHlwZTsNCi0JCQkJCX0NCi0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCQlpZiAobmV4dFRva2VuVHlwZSA9PSBudWxsKXsNCi0JCQkJCQlicmVhazsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlpZiAoY29udGV4dCA9PSBDU1NfSlNQX1NDUklQVExFVCl7DQotCQkJCQl3aGlsZSAobmV4dFRva2VuVHlwZSAhPSBDU1NfSlNQX0NPTU1FTlRfRU5EKSB7DQotLy8JCQkJCQl0ZXh0LmFwcGVuZCh5eXRleHQoKSk7DQotCQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOw0KLQkJCQkJCWxlbmd0aCA9IHRleHRMZW5ndGg7DQotCQkJCQkJaWYgKGNvbnRleHQuZXF1YWxzKENTU19KU1BfU0NSSVBUTEVUKSAmJiB5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpew0KLQkJCQkJCQljb250ZXh0ID0gbmV4dFRva2VuVHlwZTsNCi0JCQkJCQl9DQotDQotCQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJCQlpZiAobmV4dFRva2VuVHlwZSA9PSBudWxsKXsNCi0JCQkJCQkJYnJlYWs7DQotCQkJCQkJfQ0KLQkJCQkJfQkJCQkNCi0JCQkJCWlmIChjb250ZXh0ID09IENTU19KU1BfQ09NTUVOVCl7DQotCQkJCQkJY29udGV4dCA9IENTU19DT01NRU5UOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCXRleHRMZW5ndGggKz0geXlsZW5ndGgoKTsNCi0JCQkJbGVuZ3RoID0gdGV4dExlbmd0aDsNCi0JCQkJDQotCQkJfQ0KLQkJCWlmIChjb250ZXh0ID09IFVOREVGSU5FRCkgew0KLQkJCQkvLyB1bmRlZiAtPiBjb25jYXRlbmF0ZSB1bmRlZidzDQotCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCXdoaWxlIChuZXh0VG9rZW5UeXBlID09IFVOREVGSU5FRCkgew0KLS8vCQkJCQl0ZXh0LmFwcGVuZCh5eXRleHQoKSk7DQotCQkJCQl0ZXh0TGVuZ3RoICs9IHl5bGVuZ3RoKCk7DQotCQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOw0KLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJfQ0KLQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsNCi0vLwkJCQlmQnVmZmVyZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7DQotCQkJCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOw0KLQkJCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJCX0gZWxzZSB7DQotCQkJCW5leHRUb2tlblR5cGUgPSBudWxsOw0KLQkJCQlzcGFjZUZvbGxvd3MgPSBmYWxzZTsNCi0JCQkJaWYgKENTU1JlZ2lvblV0aWwuaXNEZWNsYXJhdGlvblZhbHVlVHlwZShjb250ZXh0KSkgeyAvLyBkZWNsYXJhdGlvbiB2YWx1ZSBjYW4gY29udGFpbiBWQUxVRV9TDQotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQkJc3BhY2VGb2xsb3dzID0gKG5leHRUb2tlblR5cGUgPT0gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MpOw0KLQkJCQl9IGVsc2UgaWYgKGNhbkNvbnRhaW5TcGFjZShjb250ZXh0KSkgew0KLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJCXNwYWNlRm9sbG93cyA9IChuZXh0VG9rZW5UeXBlID09IENTU19TKTsNCi0JCQkJfQ0KLQkJCQlpZiAobmV4dFRva2VuVHlwZSAhPSBudWxsKSB7IC8vIG5leHRUb2tlbiBpcyByZXRyaWV2ZWQNCi0JCQkJCWlmIChzcGFjZUZvbGxvd3MpIHsNCi0JCQkJCQkvLyBuZXh0IGlzIHNwYWNlIC0+IGFwcGVuZA0KLS8vCQkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOw0KLQkJCQkJCWxlbmd0aCArPSB5eWxlbmd0aCgpOw0KLQkJCQkJfSBlbHNlIHsNCi0JCQkJCQkvLyBuZXh0IGlzIE5PVCBzcGFjZSAtPiBwdXNoIHRoaXMgZm9yIG5leHQgdGltZSwgcmV0dXJuIGl0c2VsZg0KLQkJCQkJCWZCdWZmZXJlZENvbnRleHQgPSBuZXh0VG9rZW5UeXBlOw0KLS8vCQkJCQkJZkJ1ZmZlcmVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOw0KLQkJCQkJCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOw0KLQkJCQkJCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQlpZiAoY29udGV4dCAhPSBudWxsKSB7DQotCQkJaWYgKGNvbnRleHQgPT0gVU5ERUZJTkVEKSB7DQotCQkJCWNvbnRleHQgPSBDU1NfVU5LTk9XTjsNCi0JCQl9DQotCQkJcmV0dXJuIGZSZWdpb25GYWN0b3J5LmNyZWF0ZVJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsNCi0JCX0gZWxzZSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotICAJfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQkvKiBmb3Igc3RhbmRhbG9uZSB1c2UgKi8NCi0gIAlwdWJsaWMgZmluYWwgTGlzdCBwYXJzZVRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgCQlMaXN0IHRva2VucyA9IG5ldyBBcnJheUxpc3QoKTsNCi0NCi0gIAkJQ1NTVGV4dFRva2VuIHRva2VuOw0KLQkJZm9yIChTdHJpbmcga2luZCA9IHByaW1HZXROZXh0VG9rZW4oKTsga2luZCAhPSBudWxsOyBraW5kID0gcHJpbUdldE5leHRUb2tlbigpKSB7DQotCQkJdG9rZW4gPSBuZXcgQ1NTVGV4dFRva2VuKCk7DQotCQkJdG9rZW4ua2luZCA9IGtpbmQ7ICAJCQkJDQotCQkJdG9rZW4uc3RhcnQgPSB5eWNoYXI7DQotCQkJdG9rZW4ubGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCQl0b2tlbi5pbWFnZSA9IHl5dGV4dCgpOw0KLQkJCXRva2Vucy5hZGQodG9rZW4pOw0KLQkJfQ0KLQ0KLSAgCQlyZXR1cm4gdG9rZW5zOw0KLSAgCX0NCi0gIAkNCi0gIAkvKiB1c2VyIG1ldGhvZCAqLw0KLSAgCXByaXZhdGUgYm9vbGVhbiBjYW5Db250YWluU3BhY2UoU3RyaW5nIHR5cGUpIHsNCi0gIAkJaWYgKHR5cGUgPT0gQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7DQotICAJCQlyZXR1cm4gZmFsc2U7DQotICAJCX0gZWxzZSB7DQotICAJCQlyZXR1cm4gdHJ1ZTsNCi0gIAkJfQ0KLSAgCX0NCi0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGZpbmFsIGludCBnZXRPZmZzZXQoKSB7DQotCQlyZXR1cm4geXljaGFyOw0KLQl9DQotCQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VPRigpIHsNCi0JCXJldHVybiB6ekF0RU9GOw0KLQl9DQotDQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsNCi0JCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgMCk7DQotCX0NCi0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGZpbmFsIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4sIGludCBuZXdPZmZzZXQpIHsNCi0JCS8qKiB0aGUgaW5wdXQgZGV2aWNlICovDQotCQl6elJlYWRlciA9IGluOw0KLQ0KLQkJLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8NCi0JCXp6U3RhdGUgPSAwOw0KLQ0KLQkJLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8NCi0JCXp6TGV4aWNhbFN0YXRlID0gZkluaXRpYWxTdGF0ZTsgLy9ZWUlOSVRJQUw7DQotDQotCQkvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcw0KLQkJCXRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLw0KLQkJaWYgKHp6QnVmZmVyLmxlbmd0aCAhPSBmSW5pdGlhbEJ1ZmZlclNpemUpIHsNCi0JCQl6ekJ1ZmZlciA9IG5ldyBjaGFyW2ZJbml0aWFsQnVmZmVyU2l6ZV07DQotCQl9DQotCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoenpCdWZmZXIsIChjaGFyKTApOw0KLQ0KLQkJLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovDQotCQl6ek1hcmtlZFBvcyA9IDA7DQotDQotCQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8NCi0JCXp6UHVzaGJhY2tQb3MgPSAwOw0KLQ0KLQkJLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLw0KLQkJenpDdXJyZW50UG9zID0gMDsNCi0NCi0JCS8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8NCi0JCXp6U3RhcnRSZWFkID0gMDsNCi0NCi0JCS8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQNCi0JCQlmcm9tIGlucHV0ICovDQotCQl6ekVuZFJlYWQgPSAwOw0KLQ0KLQkJLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLQkJeXlsaW5lID0gMDsNCi0NCi0JCS8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0JCXl5Y2hhciA9IDA7DQotDQotCQkvKioNCi0JCSAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSANCi0JCSAqIG1hdGNoZWQgdGV4dA0KLQkJICovDQotCQl5eWNvbHVtbiA9IDA7IA0KLQ0KLQkJLyoqIA0KLQkJICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lDQotCQkgKi8NCi0JCXp6QXRCT0wgPSBmYWxzZTsNCi0JCQ0KLQkJLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8NCi0JCXp6QXRFT0YgPSBmYWxzZTsNCi0NCi0JCS8qIHVzZXIgdmFyaWFibGVzICovDQotCQkvLwkJZlVuZGVmaW5lZC5kZWxldGUoMCwgZlVuZGVmaW5lZC5sZW5ndGgoKSk7DQotCX0NCi0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIEpTUGVkQ1NTVG9rZW5pemVyKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBpbnQgZkpTUFByZXZpb3VzU3RhdGUgPSBmSW5pdGlhbFN0YXRlOw0KLQlwcml2YXRlIHZvaWQgeXlKc3BCZWdpbihpbnQgbmV3c3RhdGUpew0KLQkJZkpTUFByZXZpb3VzU3RhdGUgPSB5eXN0YXRlKCk7DQotCQl5eWJlZ2luKG5ld3N0YXRlKTsNCi0JfQ0KLQlwcml2YXRlIHZvaWQgeXlKc3BFbmQoKXsNCi0JCXl5YmVnaW4oZkpTUFByZXZpb3VzU3RhdGUpOw0KLQl9DQotJX0NCi0NCi0lc3RhdGUgU1RfQ0hBUlNFVF9OQU1FDQotJXN0YXRlIFNUX0NIQVJTRVRfREVMSU1JVEVSDQotJXN0YXRlIFNUX0lNUE9SVF9VUkkNCi0lc3RhdGUgU1RfSU1QT1JUX01FRElVTQ0KLSVzdGF0ZSBTVF9JTVBPUlRfREVMSU1JVEVSDQotJXN0YXRlIFNUX01FRElBX01FRElVTQ0KLSVzdGF0ZSBTVF9NRURJQV9ERUxJTUlURVINCi0lc3RhdGUgU1RfUEFHRV9QU0VVRE9fUEFHRQ0KLSVzdGF0ZSBTVF9QQUdFX0RFTElNSVRFUg0KLSVzdGF0ZSBTVF9GT05UX0ZBQ0VfREVMSU1JVEVSDQotJXN0YXRlIFNUX1NFTEVDVE9SDQotJXN0YXRlIFNUX1NFTEVDVE9SX01PRElGSUVSDQotJXN0YXRlIFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FDQotJXN0YXRlIFNUX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUg0KLSVzdGF0ZSBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUNCi0lc3RhdGUgU1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORA0KLSVzdGF0ZSBTVF9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1INCi0lc3RhdGUgU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFDQotJXN0YXRlIFNUX0RFQ0xBUkFUSU9OX1ZBTFVFDQotJXN0YXRlIFNUX0pTUF9TQ1JJUFRMRVQNCi0lc3RhdGUgU1RfSlNQX0RJUkVDVElWRQ0KLSVzdGF0ZSBTVF9KU1BfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfSlNQX0VYUA0KLSVzdGF0ZSBTVF9KU1BfRUwNCi0lc3RhdGUgU1RfSlNQX0NPTU1FTlQNCi0NCi0NCi1oID0gWzAtOWEtZl0NCi1ub25hc2NpaSA9IFtcdTAwODAtXHVmZmZmXQ0KLXVuaWNvZGUgPSBcXHtofXsxLDZ9WyBcdFxyXG5cZl0/DQotZXNjYXBlID0ge3VuaWNvZGV9fFxcWyAtflx1MDA4MC1cdWZmZmZdDQotbm1zdGFydCA9IFtfYS16QS1aLV18e25vbmFzY2lpfXx7ZXNjYXBlfQ0KLW5tY2hhciA9IFtfYS16QS1aMC05LV18e25vbmFzY2lpfXx7ZXNjYXBlfQ0KLXN0cmluZzEgPSBcIihbXHQgISMkJSYoLX5dfFxce25sfXxcJ3x7bm9uYXNjaWl9fHtlc2NhcGV9KSpcIg0KLXN0cmluZzIgPSBcJyhbXHQgISMkJSYoLX5dfFxce25sfXxcInx7bm9uYXNjaWl9fHtlc2NhcGV9KSpcJw0KLQ0KLWlkZW50ID0ge25tc3RhcnR9e25tY2hhcn0qDQotbmFtZSA9IHtubWNoYXJ9Kw0KLW51bSA9IFsrLV0/KFswLTldK3xbMC05XSoiLiJbMC05XSspDQotc3RyaW5nID0ge3N0cmluZzF9fHtzdHJpbmcyfQ0KLXVybCA9IChbICEjJCUmKi1+XXx7bm9uYXNjaWl9fHtlc2NhcGV9KSoNCi1zID0gWyBcdFxyXG5cZl0NCi13ID0ge3N9Kg0KLW5sID0gXG58XHJcbnxccnxcZg0KLXJhbmdlID0gXD97MSw2fXx7aH0oXD97MCw1fXx7aH0oXD97MCw0fXx7aH0oXD97MCwzfXx7aH0oXD97MCwyfXx7aH0oXD8/fHtofSkpKSkpDQotDQotaGFzaCA9ICIjIntuYW1lfQ0KLXVyaSA9ICgidXJsKCJ7d317c3RyaW5nfXt3fSIpInwidXJsKCJ7d317dXJsfXt3fSIpIikNCi1mdW5jdGlvbiA9IHtpZGVudH0iKCINCi11bmljb2RlX3JhbmdlID0gIlUiXCtbMC05YS1mQS1GP117MSw2fSgiLSJbMC05YS1mQS1GP117MSw2fSk/DQotDQotU1MgPSBbXHgyMFx4MDlceDBEXHgwQV0NCi1qc3BzdGFydCA9ICI8IntTU30qIiUie1NTfSoNCi1qc3BlbmQgPSAiJSJ7U1N9KiI+Ig0KLWVsc3RhcnQgPSAiJCJ7U1N9KiJ7Ig0KLWVsZW5kID0gIn0iDQotDQotJSUNCi0NCi0NCi0NCi08WVlJTklUSUFMPiB7DQotIHtqc3BzdGFydH0gICAgICAgICAge3l5SnNwQmVnaW4oU1RfSlNQX1NDUklQVExFVCk7ICByZXR1cm4gQ1NTX0pTUF9TQ1JJUFRMRVQ7fQ0KLSB7ZWxzdGFydH0gICAgICAgICAge3l5SnNwQmVnaW4oU1RfSlNQX0VMKTsgIHJldHVybiBDU1NfSlNQX0VMO30NCi19DQotDQotPFNUX0pTUF9TQ1JJUFRMRVQ+IHsNCi0gIkAiCXt5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkUpOyByZXR1cm4gQ1NTX0pTUF9ESVJFQ1RJVkU7fQ0KLSAiPSIJe3l5YmVnaW4oU1RfSlNQX0VYUCk7IHJldHVybiBDU1NfSlNQX0VYUDt9DQotICIhIgl7eXliZWdpbihTVF9KU1BfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0pTUF9ERUNMO30NCi0ge2pzcGVuZH0ge3l5SnNwRW5kKCk7ICByZXR1cm4gQ1NTX0pTUF9FTkQ7fQ0KLSAiLS0iIHsgeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7IHJldHVybiBDU1NfSlNQX0NPTU1FTlQ7fQ0KLX0NCi0NCi0vKiBvdmVycmlkZSBnbG9iYWwgIn0iICovDQotPFNUX0pTUF9FTD4gew0KLSB7ZWxlbmR9IHt5eUpzcEVuZCgpOyByZXR1cm4gQ1NTX0VMX0VORDsgfQ0KLX0NCi0NCi08U1RfSlNQX0RJUkVDVElWRSwgU1RfSlNQX0VYUCwgU1RfSlNQX0RFQ0xBUkFUSU9OPiB7DQotIHtqc3BlbmR9IHt5eUpzcEVuZCgpOyAgcmV0dXJuIENTU19KU1BfRU5EO30NCi19DQotDQotPFNUX0pTUF9DT01NRU5UPiB7DQotIC0rLXtqc3BlbmR9IHsgeXlKc3BFbmQoKTsgcmV0dXJuIENTU19KU1BfQ09NTUVOVF9FTkQ7IH0NCi0gIn0iICAgICAgICAgeyByZXR1cm4gVU5ERUZJTkVEOyB9DQotfQ0KLQ0KLQ0KLS8qDQotICogKioqIGdsb2JhbCAqKioNCi0gKi8NCi0NCi17c30rIHsgcmV0dXJuIENTU19TOyB9DQotIjwhLS0iIHsgcmV0dXJuIENTU19DRE87IH0NCi0iLS0+IiB7IHJldHVybiBDU1NfQ0RDOyB9DQotIn0iIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX1JCUkFDRTsgfQ0KLVwvXCpbXipdKlwqKyhbXi8qXVteKl0qXCorKSpcLyB7IHJldHVybiBDU1NfQ09NTUVOVDsgfQ0KLS8vXDxcJS0tW14tfV0qW31dKltefV0qLSstXCVcPiB7IHJldHVybiBDU1NfQ09NTUVOVDsgfQ0KLQ0KLQ0KLS8vPFlZSU5JVElBTD4gew0KLS8vCSJAaW1wb3J0IiB7CXl5YmVnaW4oU1RfSU1QT1JUX1VSSSk7IHJldHVybiBDU1NfSU1QT1JUOyB9DQotLy99DQotDQotLyoNCi0gKiAqKiogY2hhcnNldCBydWxlICoqKg0KLSAqIENIQVJTRVRfU1lNIFMqIFNUUklORyBTKiAnOycNCi0gKi8NCi0NCi0iQGNoYXJzZXQiIHsgeXliZWdpbihTVF9DSEFSU0VUX05BTUUpOyByZXR1cm4gQ1NTX0NIQVJTRVQ7IH0NCi0NCi08U1RfQ0hBUlNFVF9OQU1FPiB7DQotCXtzdHJpbmd9IHsgeXliZWdpbihTVF9DSEFSU0VUX0RFTElNSVRFUik7IHJldHVybiBDU1NfU1RSSU5HOyB9DQotfQ0KLQ0KLTxTVF9DSEFSU0VUX0RFTElNSVRFUj4gew0KLQkiOyIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfREVMSU1JVEVSOyB9DQotfQ0KLQ0KLS8qDQotICogKioqIGltcG9ydCBydWxlICoqKg0KLSAqIElNUE9SVF9TWU0gUyogW1NUUklOR3xVUkldIFMqIFsgbWVkaXVtIFsgQ09NTUEgUyogbWVkaXVtXSogXT8gJzsnIFMqDQotICovDQotDQotIkBpbXBvcnQiIHsgeXliZWdpbihTVF9JTVBPUlRfVVJJKTsgcmV0dXJuIENTU19JTVBPUlQ7IH0NCi0NCi08U1RfSU1QT1JUX1VSST4gew0KLQl7c3RyaW5nfSB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfU1RSSU5HOyB9DQotCS8vCSJ1cmwoInt3fXtzdHJpbmd9e3d9IikiIHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19VUkk7IH0NCi0JLy8JInVybCgie3d9e3VybH17d30iKSIgeyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX1VSSTsgfQ0KLQl7dXJpfSB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfVVJJOyB9DQotCSI7IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19ERUxJTUlURVI7IH0NCi19DQotDQotPFNUX0lNUE9SVF9NRURJVU0+IHsNCi0Je2lkZW50fSB7IHl5YmVnaW4oU1RfSU1QT1JUX0RFTElNSVRFUik7IHJldHVybiBDU1NfTUVESVVNOyB9DQotCSI7IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19ERUxJTUlURVI7IH0NCi19DQotDQotPFNUX0lNUE9SVF9ERUxJTUlURVI+IHsNCi0JIjsiIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0RFTElNSVRFUjsgfQ0KLQkiLCIgeyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBX1NFUEFSQVRPUjsgfQ0KLX0NCi0NCi0vKg0KLSAqICoqKiBtZWRpYSBydWxlICoqKg0KLSAqIE1FRElBX1NZTSBTKiBtZWRpdW0gWyBDT01NQSBTKiBtZWRpdW0gXSogTEJSQUNFIFMqIHJ1bGVzZXQqICd9JyBTKg0KLSAqLw0KLQ0KLSJAbWVkaWEiIHsgeXliZWdpbihTVF9NRURJQV9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBOyB9DQotDQotLyogDQotICogbWVkaXVtDQotICogSURFTlQgUyoNCi0gKi8NCi08U1RfTUVESUFfTUVESVVNPiB7DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX01FRElBX0RFTElNSVRFUik7IHJldHVybiBDU1NfTUVESVVNOyB9DQotfQ0KLQ0KLTxTVF9NRURJQV9ERUxJTUlURVI+IHsNCi0JInsiIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0xCUkFDRTsgfQ0KLQkiLCIgeyB5eWJlZ2luKFNUX01FRElBX01FRElVTSk7IHJldHVybiBDU1NfTUVESUFfU0VQQVJBVE9SOyB9DQotfQ0KLQ0KLS8qDQotICogKioqIHBhZ2UgcnVsZSAqKg0KLSAqIFBBR0VfU1lNIFMqIHBzZXVkb19wYWdlPyBTKiBMQlJBQ0UgUyogZGVjbGFyYXRpb24gWyAnOycgUyogZGVjbGFyYXRpb24gXSogJ30nIFMqDQotICovDQotDQotIkBwYWdlIiB7IHl5YmVnaW4oU1RfUEFHRV9QU0VVRE9fUEFHRSk7IHJldHVybiBDU1NfUEFHRTsgfQ0KLSANCi0vKg0KLSAqIHBzZXVkb19wYWdlDQotICogJzonIElERU5UDQotICovDQotDQotPFNUX1BBR0VfUFNFVURPX1BBR0U+IHsNCi0JIjoiP3tpZGVudH0geyB5eWJlZ2luKFNUX1BBR0VfREVMSU1JVEVSKTsgcmV0dXJuIENTU19QQUdFX1NFTEVDVE9SOyB9DQotCSJ7IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0xCUkFDRTsgfQ0KLX0NCi0NCi08U1RfUEFHRV9ERUxJTUlURVI+IHsNCi0JInsiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfTEJSQUNFOyB9DQotfQ0KLQ0KLS8qDQotICogZm9udC1mYWNlDQotICogRk9OVF9GQUNFX1NZTSBTKiAneycgUyogZGVjbGFyYXRpb24gWyAnOycgUyogZGVjbGFyYXRpb24gJyogJ30nIFMqDQotICovDQotDQotIkBmb250LWZhY2UiIHsgeXliZWdpbihTVF9GT05UX0ZBQ0VfREVMSU1JVEVSKTsgcmV0dXJuIENTU19GT05UX0ZBQ0U7IH0NCi0NCi08U1RfRk9OVF9GQUNFX0RFTElNSVRFUj4gew0KLQkieyIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19MQlJBQ0U7IH0NCi19DQotDQotLyoNCi0gKiBzZWxlY3Rvcg0KLSAqIHNpbXBsZV9zZWxlY3RvciBbIGNvbWJpbmF0b3Igc2ltcGxlX3NlbGVjdG9yIF0qDQotICovDQotDQotLyoNCi0gKiBzaW1wbGVfc2VsZWN0b3INCi0gKiBlbGVtZW50X25hbWUgWyBIQVNIIHwgY2xhc3MgfCBhdHRyaWIgfCBwc2V1ZG8gXSogfCBbIEhBU0ggfCBjbGFzcyB8IGF0dHJpYiB8IHBzZXVkbyBdKw0KLSAqLw0KLQ0KLTxZWUlOSVRJQUwsIFNUX1NFTEVDVE9SX01PRElGSUVSLCBTVF9TRUxFQ1RPUj4gew0KLQkiKiIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9VTklWRVJTQUw7IH0NCi0Je2hhc2h9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfSUQ7IH0NCi0vLwkiOiJ7aWRlbnR9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfUFNFVURPOyB9DQotCSI6IntpZGVudH0oIigie3N9KntpZGVudH17c30qIikiKT8geyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9QU0VVRE87IH0NCi0JIi4ie25hbWV9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ0xBU1M7IH0NCi0JIlsiIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSk7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUOyB9DQotfQ0KLQ0KLTxZWUlOSVRJQUwsIFNUX1NFTEVDVE9SPiB7DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUU7IH0NCi19DQotDQotPFNUX1NFTEVDVE9SX01PRElGSUVSPiB7DQotCSIsIiB7IHl5YmVnaW4oU1RfU0VMRUNUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1NFUEFSQVRPUjsgfQ0KLQkvLyB1c2luZyBMT09LQUhFQUQNCi0Je3N9Ky9bXis+XHtdIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ09NQklOQVRPUjsgfQ0KLQkiKyJ8Ij4iIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ09NQklOQVRPUjsgfQ0KLQkieyIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19MQlJBQ0U7IH0NCi19DQotDQotLyoNCi0gKiBhdHRyaWINCi0gKiAnWycgUyogSURFTlQgUyogWyBbICc9JyB8IElOQ0xVREVTIHwgREFTSE1BVENIIF0gUyogWyBJREVOVCB8IFNUUklORyBdIFMqIF0/ICddJw0KLSAqLw0KLQ0KLTxTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRT4gew0KLQl7aWRlbnR9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FOyB9DQotfQ0KLQ0KLTxTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1I+IHsNCi0JIj0ifCJ+PSJ8Inw9IiB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1I7IH0NCi0JIl0iIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORDsgfQ0KLX0NCi0NCi08U1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFPiB7DQotCXtpZGVudH18e3N0cmluZ30geyB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRTsgfQ0KLX0NCi0NCi08U1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORD4gew0KLQkiXSIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EOyB9DQotfQ0KLQ0KLS8qDQotICogZGVjbGFyYXRpb24NCi0gKiBwcm9wZXJ0eSAnOicgUyogZXhwciBwcmlvPyB8IC8vIGVtcHR5IC8vDQotICovDQotDQotPFNUX0RFQ0xBUkFUSU9OPiB7DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUik7IHJldHVybiBDU1NfREVDTEFSQVRJT05fUFJPUEVSVFk7IH0NCi0gICAge2pzcHN0YXJ0fSAgICAgICAgICB7eXlKc3BCZWdpbihTVF9KU1BfU0NSSVBUTEVUKTsgIHJldHVybiBDU1NfSlNQX1NDUklQVExFVDt9DQotICAgIHtlbHN0YXJ0fSAgICAgICAgICB7eXlKc3BCZWdpbihTVF9KU1BfRUwpOyAgcmV0dXJuIENTU19KU1BfRUw7fQ0KLX0NCi0NCi08U1RfREVDTEFSQVRJT05fU0VQQVJBVE9SPiB7DQotCSI6IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9TRVBBUkFUT1I7IH0NCi0gICAge2pzcHN0YXJ0fSAgICAgICAgICB7eXlKc3BCZWdpbihTVF9KU1BfU0NSSVBUTEVUKTsgIHJldHVybiBDU1NfSlNQX1NDUklQVExFVDt9DQotICAgIHtlbHN0YXJ0fSAgICAgICAgICB7eXlKc3BCZWdpbihTVF9KU1BfRUwpOyAgcmV0dXJuIENTU19KU1BfRUw7fSAgICANCi19DQotDQotPFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSwgU1RfREVDTEFSQVRJT05fVkFMVUU+IHsNCi0JIiEie3N9KiJpbXBvcnRhbnQiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5UOyB9DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVDsgfQ0KLQkiKSIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRTsgfQ0KLQl7bnVtfXtpZGVudH0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT047IH0NCi0Je251bX0iJSIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFOyB9DQotCXtudW19IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSOyB9DQotCXtmdW5jdGlvbn0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTjsgfQ0KLQl7c3RyaW5nfSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORzsgfQ0KLQl7dXJpfSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSTsgfQ0KLQkiIyJ7bmFtZX0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIOyB9DQotCXt1bmljb2RlX3JhbmdlfSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0U7IH0NCi0JWywvXSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SOyB9DQotICAgIHtqc3BzdGFydH0gICAgICAgICAge3l5SnNwQmVnaW4oU1RfSlNQX1NDUklQVExFVCk7ICByZXR1cm4gQ1NTX0pTUF9TQ1JJUFRMRVQ7fQ0KLSAgICB7ZWxzdGFydH0gICAgICAgICAge3l5SnNwQmVnaW4oU1RfSlNQX0VMKTsgIHJldHVybiBDU1NfSlNQX0VMO30gICAgDQotfQ0KLQ0KLTxTVF9ERUNMQVJBVElPTl9WQUxVRT4gew0KLQl7c30rL1teO31dIHsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9TOyB9DQotICAgIHtqc3BzdGFydH0gICAgICAgICAge3l5SnNwQmVnaW4oU1RfSlNQX1NDUklQVExFVCk7ICByZXR1cm4gQ1NTX0pTUF9TQ1JJUFRMRVQ7fQ0KLSAgICB7ZWxzdGFydH0gICAgICAgICAge3l5SnNwQmVnaW4oU1RfSlNQX0VMKTsgIHJldHVybiBDU1NfSlNQX0VMO30NCi19DQotDQotPFNUX0RFQ0xBUkFUSU9OLCBTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1IsIFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSwgU1RfREVDTEFSQVRJT05fVkFMVUU+IHsNCi0JIjsiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSOyB9DQotCS8vCSJ9IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19SQlJBQ0U7IH0NCi19DQotDQotDQotLy88WVlJTklUSUFMLCBTVF9JTVBPUlRfVVJJLCBTVF9JTVBPUlRfTUVESVVNLCBTVF9JTVBPUlRfREVMSU1JVEVSPiB7DQotLy8JXC9cKlteKl0qXCorKFteLypdW14qXSpcKispKlwvIHsgcmV0dXJuIENTU19DT01NRU5UOyB9DQotLy8Je3N9KyB7IHJldHVybiBDU1NfUzsgfQ0KLS8vCS4geyByZXR1cm4gVU5ERUZJTkVEOyB9DQotLy99DQotDQotLy88WVlJTklUSUFMLCBTVF9JTVBPUlRfVVJJLCBTVF9JTVBPUlRfTUVESVVNLCBTVF9JTVBPUlRfREVMSU1JVEVSPiB7DQotLy8JW14gXHRcclxuXGZdKyB7IHJldHVybiBDU1NfVU5LTk9XTjsgfQ0KLS8vfQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLS4gew0KLQlyZXR1cm4gVU5ERUZJTkVEOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9KU1BIZWFkVG9rZW5pemVyLmpGbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSlNQSGVhZFRva2VuaXplci5qRmxleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU4ZGQyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9KU1BIZWFkVG9rZW5pemVyLmpGbGV4CisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsKLQotCi0KLQotCi0lJQotCi0lewotCi0KLQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZwotICAgICAgICBwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1hIVE1MOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNXTUw7Ci0KLQotICAgICAgICBwdWJsaWMgSlNQSGVhZFRva2VuaXplcigpIHsKLSAgICAgICAgICAgICAgICBzdXBlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgICBwdWJsaWMgdm9pZCByZXNldCAoUmVhZGVyIGluKSB7Ci0gICAgICAgICAgICAgICAgLyogdGhlIGlucHV0IGRldmljZSAqLwotICAgICAgICAgICAgICAgIHp6UmVhZGVyID0gaW47Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gICAgICAgICAgICAgICAgenpTdGF0ZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gICAgICAgICAgICAgICAgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICAgICAgICAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheXMuZmlsbCh6ekJ1ZmZlciwgKGNoYXIpMCk7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgIHp6TWFya2VkUG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gICAgICAgICAgICAgICAgenpQdXNoYmFja1BvcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICB6ekN1cnJlbnRQb3MgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgenpTdGFydFJlYWQgPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICAgICAgICAgICAgICogZnJvbSBpbnB1dAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHp6RW5kUmVhZCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgICAgICAgICAgICAgICAvL3l5bGluZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgICAgICAgICAgICAgICB5eWNoYXIgPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgICAgICAgICAgICAgICAgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgLy95eWNvbHVtbiA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZwotICAgICAgICAgICAgICAgICAqIG9mIGEgbGluZQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHp6QXRCT0wgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICAgICAgICAgICAgICAgIHp6QXRFT0YgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIC8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICAgICAgICAgICAgICAgIHp6RU9GRG9uZSA9IGZhbHNlOwotCi0KLSAgICAgICAgICAgICAgICBmU3RhdGVTdGFjay5jbGVhcigpOwotCi0gICAgICAgICAgICAgICAgaGFzTW9yZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaXNYSFRNTD1mYWxzZTsKLSAgICAgICAgICAgICAgICBpc1dNTD1mYWxzZTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICBIZWFkUGFyc2VyVG9rZW4gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVGV4dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLSAgICAgICAgICAgICAgICBmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLSAgICAgICAgfQotIAotICAgICAgICBwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0gICAgICAgICAgICAgICAgeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzWEhUTUwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNYSFRNTDsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dNTCgpIHsKLSAgICAgICAgICAgIHJldHVybiBpc1dNTDsKLSAgICAgICAgfSAgICAgICAgCi0KLSV9Ci0KLSVlb2Z7Ci0gICAgICAgIGhhc01vcmU9ZmFsc2U7Ci0lZW9mfQotCi0lcHVibGljCi0lY2xhc3MgSlNQSGVhZFRva2VuaXplcgotJWZ1bmN0aW9uIHByaW1HZXROZXh0VG9rZW4KLSV0eXBlIFN0cmluZwotJWNoYXIKLSV1bmljb2RlCi0laWdub3JlY2FzZQotLy8lZGVidWcKLSVzd2l0Y2gKLSVidWZmZXIgODE5MgotCi0KLVVURjE2QkUgPSBceEZFXHhGRgotVVRGMTZMRSA9IFx4RkZceEZFCi1VVEY4M0J5dGVCT00gPSBceEVGXHhCQlx4QkYKLQotLy8gU3BhY2VDaGFyID0gW1x4MjBceDA5XQotCi0KLS8vIFszXSBTIDo6PSAoMHgyMCB8IDB4OSB8IDB4RCB8IDB4QSkrCi1TID0gW1x4MjBceDA5XHgwRFx4MEFdCi0KLUJlZ2luQXR0cmlidXRlZVZhbHVlID0ge1N9KiBcPSB7U30qCi0KLUxpbmVUZXJtaW5hdG9yID0gXHJ8XG4KLQotCi0lc3RhdGUgU1RfWE1MRGVjbAotJXN0YXRlIFNUX1BBR0VfRElSRUNUSVZFCi0lc3RhdGUgUXVvdGVkQXR0cmlidXRlVmFsdWUKLSVzdGF0ZSBEUV9TVFJJTkcKLSVzdGF0ZSBTUV9TVFJJTkcKLSVzdGF0ZSBVbkRlbGltaXRlZFN0cmluZwotCi0lJQotCi0KLTxZWUlOSVRJQUw+Ci17Ci0gICAgICAgICAvLyBmb3JjZSB0byBzdGFydCBhdCBiZWdpbm5pbmcgb2YgbGluZSAoXikgYW5kIGF0IGJlZ2lubmluZyBvZiBmaWxlICh5eWNoYXIgPT0gMCkKLSAgICAgICAgXiB7VVRGMTZCRX0gICAgICAgICAgIHtpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTt9fQotICAgICAgICBeIHtVVEYxNkxFfSAgICAgICAgICAge2lmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFO319Ci0gICAgICAgIF4ge1VURjgzQnl0ZUJPTX0gICAgICAge2lmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007fX0KLSAgICAgICAgCi0gICAgICAgIC8vIGZvcmNlIHRvIGJlIHN0YXJ0ZWQgb24gZmlyc3QgbGluZSwgYnV0IHdlIGRvIGFsbG93IHByZWNlZWRpbmcgc3BhY2VzCi0gICAgICAgIF4ge1N9KiAiPFw/eG1sIiB7U30rIHtpZiAoeXljaGFyID09IDAgKSB7eXliZWdpbihTVF9YTUxEZWNsKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0O319Ci0KLQotICAgICAgICAvLyBmb2xsb3dpbmcgYXJlIHNvbWUgc2ltcGx5IHJ1bGVzIHRvIGlkZW50aWZ5IEpTUCBjb250ZW50IGFzICJYSFRNTCIKLSAgICAgICAgLy8gc2VlIGh0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzMyMzYudHh0Ci0gICAgICAgICI8IURPQ1RZUEUiIHtTfSogImh0bWwiIHtTfSogIlBVQkxJQyIgLiogIi8vRFREIFhIVE1MIiAgICAgICAgICAgICAgICB7aXNYSFRNTCA9IHRydWU7fQotICAgICAgICAiPGh0bWwiIHtTfSogInhtbG5zIiB7U30qICI9IiB7U30qIChcIiB8IFwnKSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgICAgIHtpc1hIVE1MID0gdHJ1ZTt9Ci0gICAgICAgICAvLyBhbm90aGVyIGNhc2UgdGhhdCdzIHBhcnQgb2YgdGhlICJIVE1MIGZhbWlseSIgaXMgV01MIDEuMCAoV01MIDIuMCBpcyBwYXJ0IG9mIFhIVE1MKQotICAgICAgICAgIjwhRE9DVFlQRSIge1N9KiAid21sIiB7U30qICJQVUJMSUMiIC4qICIvL0RURCBXTUwiICAgICAgICAgICAgICAgICAgIHtpc1dNTCA9IHRydWU7fQotCi0gICAgICAgICI8JSIge1N9KiAiQCIge1N9KiAoInBhZ2UifCJ0YWciKSB7U30rICAge3l5YmVnaW4oU1RfUEFHRV9ESVJFQ1RJVkUpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlRGlyZWN0aXZlU3RhcnQ7fQotICAgICAgICAoIjxqc3A6ZGlyZWN0aXZlLnBhZ2UifCI8anNwOmRpcmVjdGl2ZS50YWciKSB7U30rICAgICAgICAgICB7eXliZWdpbihTVF9QQUdFX0RJUkVDVElWRSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VEaXJlY3RpdmVTdGFydDt9Ci0KLQotfQotCi08U1RfWE1MRGVjbD4KLXsKLSAgICAgICAgInZlcnNpb24iIHtCZWdpbkF0dHJpYnV0ZWVWYWx1ZX0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xWZXJzaW9uO30KLSAgICAgICAgImVuY29kaW5nIiB7QmVnaW5BdHRyaWJ1dGVlVmFsdWV9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZzt9Ci0gICAgICAgIC8vIG5vdGUgdGhlICJmb3JjZWQgZW5kIiAodmlhICdoYXNNb3JlPWZhbHNlJykgb25jZSB0aGUgZW5kIG9mIFhNTCBEZWNsYXJhdGlvbiBmb3VuZAotICAgICAgICAvLyBUaGlzIGlzIHNpbmNlIG5vbi1hc2NpaSBjaGFycyBtYXkgZm9sbG93IGFuZCBtYXkgY2F1c2UgSU9FeGNlcHRpb25zIHdoaWNoIHdvdWxkIG5vdCBvY2N1ciBvbmNlIHN0cmVhbSBpcwotICAgICAgICAvLyByZWFkIHdpdGggaW5jb3JyZWN0IGVuY29kaW5nIChzdWNoIGFzIGlmIHBsYXRmb3JtIGVuY29kaW5nIGlzIGluIGVmZmVjdCB1bnRpbCB0cnVlIGVuY29kaW5nIGRldGVjdGVkKS4KLSAgICAgICAgLy8gQlVULCB0aGUgaGFzTW9yZT1mYWxzZSB3YXMgcmVtb3ZlZCBmb3IgdGhpcyBKU1AgY2FzZSAocHJvYmFibHkgc3RpbGwgb2sgZm9yIHB1cmUgWE1MKSBiZWNhdXNlCi0gICAgICAgIC8vIGluIGEgSlNQLCB3ZSBtdXN0IHBhcnNlIHBhc3QgeG1sRGVjbCB0byBnZXQgYXQgSlNQIHBhZ2UgZGlyZWN0aXZlLgotICAgICAgICAvLyBXZSdsbCBhc3N1bWUgYWxsIGNoYXJzIGluIHRoaXMgYXJlYSBhcmUgInJlYWRhYmxlIiBhcyBpcy4KLSAgICAgICAge1N9KiAiXD8+IiAgICB7eXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kO30KLX0KLQotPFNUX1BBR0VfRElSRUNUSVZFPgotewotLy8gIHJlbW92ZWQgJ2xhbmd1YWdlJyBzaW5jZSBpdCByZWFsbHkgY2FuIGJlIGhhbmRsZWQgc2VwZXJhdGVseSBmcm9tIGVuY29kaW5nLCBidXQgbWF5IGFkZCBpdCBiYWNrIGxhdGVyIGZvciBzaW1wbGUgcmUtdXNlLgotICAgICAgICAibGFuZ3VhZ2UiICAgICB7QmVnaW5BdHRyaWJ1dGVlVmFsdWV9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlTGFuZ3VhZ2U7fQotICAgICAgICAiY29udGVudFR5cGUiIHtCZWdpbkF0dHJpYnV0ZWVWYWx1ZX0gIHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlQ29udGVudFR5cGU7fQotICAgICAgICAicGFnZUVuY29kaW5nIiB7QmVnaW5BdHRyaWJ1dGVlVmFsdWV9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlRW5jb2Rpbmc7fQotICAgICAgICAvLyBub3RlIHRoZSAiZm9yY2VkIGVuZCIgKHZpYSAnaGFzTW9yZT1mYWxzZScpIG9uY2UgdGhlIGVuZCBvZiBYTUwgRGVjbGFyYXRpb24gZm91bmQKLSAgICAgICAgLy8gVGhpcyBpcyBzaW5jZSBub24tYXNjaWkgY2hhcnMgbWF5IGZvbGxvdyBhbmQgbWF5IGNhdXNlIElPRXhjZXB0aW9ucyB3aGljaCB3b3VsZCBub3Qgb2NjdXIgb25jZSBzdHJlYW0gaXMKLSAgICAgICAgLy8gcmVhZCBpbiBjb3JyZWN0IGVuY29kaW5nLgotCi0gICAgICAgIC8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00MjA1IGRlbW9uc3RyYXRlcyBob3cgd2UgbmVlZCB0byBrZWVwIHBhcnNpbmcsCi0gICAgICAgIC8vIGV2ZW4gaWYgY29tZSB0byBlbmQgb2Ygb25lIHBhZ2UgZGlyZWN0aXZlLCBzbyBoYXNNb3JlPWZhbHNlIHdhcyByZW1vdmVkIGZyb20gdGhlc2UgcnVsZXMuCi0gICAgICAgICIlPiIgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7ICByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlRGlyZWN0aXZlRW5kO30KLSAgICAgICAgIlwvPiIgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VEaXJlY3RpdmVFbmQ7fQotfQotCi0KLTxRdW90ZWRBdHRyaWJ1dGVWYWx1ZT4KLXsKLSAgICAgICAgXCIgICAgICAgICAgICAgICAgICAgICAgeyB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLSAgICAgICAgXCcgICAgICAgICAgICAgICAgICAgICAgeyB5eWJlZ2luKFNRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLSAgICAgICAgLy8gaW4gdGhpcyBzdGF0ZSwgYW55dGhpbmcgb3RoZXIgdGhhbiBhIHNwYWNlIGNoYXJhY3RlciBjYW4gc3RhcnQgYW4gdW5kZWxpbWl0ZWQgc3RyaW5nCi0gICAgICAgIHtTfSouICAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApO30KLQotfQotCi0KLTxEUV9TVFJJTkc+Ci17Ci0KLSAgICAgICAgXCIgICAgICAgICAgICAgICAgICAgICAgeyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIHtMaW5lVGVybWluYXRvcn0gICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotICAgICAgICAiXD8+IiAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0gICAgICAgICc8JyAgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICB7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0KLQotICAgICAgICAiJT4iICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQotCi19Ci0KLTxTUV9TVFJJTkc+Ci17Ci0KLSAgICAgICAgXCcgICAgICAgICAgICAgICAgICAgICAgeyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlO30KLSAgICAgICAge0xpbmVUZXJtaW5hdG9yfSAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0gICAgICAgICIlPiIgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotICAgICAgICAnPCcgICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLSAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9Ci0gICAgICAgICIlPiIgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCi0KLX0KLQotPFVuRGVsaW1pdGVkU3RyaW5nPgotewotCi0KLSAgICAgICAge1N9ICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICB7TGluZVRlcm1pbmF0b3J9ICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLSAgICAgICAgIlw/PiIgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKDIpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0gICAgICAgICc8JyAgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotICAgICAgICAvLyB0aGVzZSBhcmUgYSBiaXQgc3BlY2lhbCwgc2luY2Ugd2Ugc3RhcnRlZCBhbiB1bmRlbGltaXQgc3RyaW5nLCBidXQgZm91bmQgYSBxdW90ZSAuLi4gcHJvYmFibHkgaW5kaWNhdGVzIGEgbWlzc2luZyBiZWdpbm5pbmcgcXVvdGUKLSAgICAgICAgXCcgICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9Ci0gICAgICAgIFwiICAgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7fQotCi0gICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgIHsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQotICAgICAgICAiJT4iICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQotfQotCi0vLyBUaGUgIm1hdGNoIGFueXRoaW5nIiBydWxlIHNob3VsZCBhbHdheXMgYmUgaW4gZWZmZWN0IGV4Y2VwdCBmb3Igd2hlbiBsb29raW5nIGZvciBlbmQgb2Ygc3RyaW5nCi0vLyAoVGhhdCBpcywgcmVtZW1iZXIgdG8gdXBkYXRlIHN0YXRlIGxpc3QgaWYvd2hlbiBuZXcgc3RhdGVzIGFkZGVkKQotPFlZSU5JVElBTCwgU1RfWE1MRGVjbCwgUXVvdGVkQXR0cmlidXRlVmFsdWUsIFNUX1BBR0VfRElSRUNUSVZFPgotewotLy8gdGhpcyBpcyB0aGUgZmFsbGJhY2sgKG1hdGNoICJhbnl0aGluZyIpIHJ1bGUgIChmb3IgdGhpcyBzY2FubmVyLCBpbnB1dCBpcyBpZ25vcmVkLCBhbmQgcG9zaXRpb24gYWR2YW5jZWQsIGlmIG5vdCByZWNvZ25pemVkKQotLnxcbiAgICAgICAgICAgICAge2lmICh5eWNoYXIgPiBNQVhfVE9fU0NBTikge2hhc01vcmU9ZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5NQVhfQ0hBUlNfUkVBQ0hFRDt9fQotfQotCi0vLyB0aGlzIHJ1bGUgYWx3YXlzIGluIGVmZmVjdAotPDxFT0Y+PiAgICAgICAgIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7fQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9idWlsZFBhcnNlci54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9idWlsZFBhcnNlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYmUxODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGRQYXJzZXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9InRva2VuaXplciIgZGVmYXVsdD0iSGVhZFRva2VuaXplciI+Ci0JCi0JPCEtLSBOb3RlOiBmb3IgRWNsaXBzZSBlbnYuLCB0aGUgSkZsZXggMS40IGphciBzaG91bGQgYmUgYWRkZWQgCi0JdG8gdGhlIGFudCBnbG9iYWwgZW50cmllcyAgLS0+Ci0JPHRhc2tkZWYgY2xhc3NuYW1lPSJKRmxleC5hbnR0YXNrLkpGbGV4VGFzayIgbmFtZT0iamZsZXgiIC8+Ci0JCQotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZmlsZSIgdmFsdWU9IkpTUEhlYWRUb2tlbml6ZXIuakZsZXgiLz4JCQkKLQkJPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiIHZhbHVlPSJIZWFkUGFyc2VycyIvPgotCQk8cHJvcGVydHkgbmFtZT0iZGVzdC5kaXIiIHZhbHVlPSIuLi9zcmMiLz4KLQkJPCEtLSB0b3VjaCBjYXVzZXMgdG8gYWx3YXlzIGJ1aWxkLCByZW1vdmUgZm9yIHJlYWwgJ21ha2UnIGJlaGF2aW9yIC0tPgotCQk8dG91Y2ggZmlsZT0iJHtzcmMuZGlyfS8ke3NyYy5maWxlfSIvPgotCQkJCQkKLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iSGVhZFRva2VuaXplciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxhbnRjYWxsIHRhcmdldD0icnVuLWpmbGV4Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InJ1bi1qZmxleCIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxqZmxleAotCSAgICAJZmlsZT0iJHtzcmMuZGlyfS8ke3NyYy5maWxlfSIKLQkgICAgCWRlc3RkaXI9IiR7ZGVzdC5kaXJ9IgotCQkJdmVyYm9zZT0idHJ1ZSIKLQkJCW5vYmFrPSJ0cnVlIgotCQkJdGltZT0ib24iCi0JICAgIC8+Ci0JPC90YXJnZXQ+Ci0JCi0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTNiY2ZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9tZG9jdW1lbnQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmVuY29kaW5nO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9uczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGFnbGliO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YXNrczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZWwsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dCwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5lbmNvZGluZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6O3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuOC4xLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCwzLjUuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAxLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIsCi0gamF2YXguc2VydmxldC5qc3A7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5OyBleGNsdWRlOj0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlZjQ0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sLFwKLSAgICAgICAgICAgICAgIERldlRpbWVTdXBwb3J0LyxcCi0gICAgICAgICAgICAgICBzY2hlbWEvCi1zb3VyY2UuLiA9IHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjg4ZmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuanNwIj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJJSmFyUmVjb3JkIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotCQk8dHlwZSBuYW1lPSJJVGFnRGlyUmVjb3JkIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotCQk8dHlwZSBuYW1lPSJJVGFnbGliSW5kZXhEZWx0YSIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLQkJPHR5cGUgbmFtZT0iSVRhZ2xpYkluZGV4TGlzdGVuZXIiIGltcGxlbWVudD0idHJ1ZSIgLz4KLQkJPHR5cGUgbmFtZT0iSVRhZ2xpYkRlc2NyaXB0b3IiIGltcGxlbWVudD0iZmFsc2UiIC8+Ci0JCTx0eXBlIG5hbWU9IklUYWdsaWJSZWNvcmQiIGltcGxlbWVudD0iZmFsc2UiIC8+Ci0JCTwhLS0gPHR5cGUgbmFtZT0iSVRhZ2xpYlJlY29yZEV2ZW50IiBpbXBsZW1lbnQ9ImZhbHNlIiAvPiAtLT4KLQkJPHR5cGUgbmFtZT0iSVRMRFJlY29yZCIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLQkJPHR5cGUgbmFtZT0iSVVSTFJlY29yZCIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLQkJPHR5cGUgbmFtZT0iVGFnbGliSW5kZXgiIHN1YmNsYXNzPSJmYWxzZSIgaW5zdGFudGlhdGU9ImZhbHNlIiAvPgotCQk8dHlwZSBuYW1lPSJUYWdsaWJJbmRleERlbHRhIiBzdWJjbGFzcz0iZmFsc2UiIGluc3RhbnRpYXRlPSJmYWxzZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1AiIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS52aWV3cy5jb250ZW50b3V0bGluZSIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IkpTUENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vZWNsaXBzZS5vcmcvd2VidG9vbHMvanN0L2NvbXBvbmVudHMvanNwL292ZXJ2aWV3Lmh0bWwiIC8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmZkZjFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVN0cnVjdHVyZWQgU291cmNlIEpTUCBNb2RlbAotU3RydWN0dXJlZF9KU1BfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZT1TdHJ1Y3R1cmVkIEpTUCBEb2N1bWVudCBGYWN0b3J5IEV4dGVuc2lvbgotSlNQX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUpTUAotSlNQX1RhZ19Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1KU1AgVGFnIERlZmluaXRpb24KLUpTUF9UYWdYX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUpTUCBUYWcgRGVmaW5pdGlvbiAoWE1MKQotSlNQX1RMRF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1UYWcgTGlicmFyeSBEZXNjcmlwdG9yCi1KU1BfRnJhZ21lbnRfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SlNQIEZyYWdtZW50Ci1KU1BfU3ludGF4X1ZhbGlkYXRvci5uYW1lPUpTUCBTeW50YXggVmFsaWRhdG9yCi1KU1BfRGlyZWN0aXZlX1ZhbGlkYXRvci5uYW1lPUpTUCBEaXJlY3RpdmUgVmFsaWRhdG9yCi1FTF9TeW50YXhfVmFsaWRhdG9yLm5hbWU9RUwgU3ludGF4IFZhbGlkYXRvcgotSlNQX0NvbnRlbnRfVmFsaWRhdG9yLm5hbWU9SlNQIENvbnRlbnQgVmFsaWRhdG9yCi1TdHJ1Y3R1cmVkX0pTUF9Eb2N1bWVudF9TZXR1cF9wYXJ0aWNpcGFudC5uYW1lPVN0cnVjdHVyZWQgSlNQIERvY3VtZW50IFNldHVwIFBhcnRpY2lwYW50Ci1fdmFsaWRhdGlvbk1hcmtlci5uYW1lPUpTUCBQcm9ibGVtCi1fdGFza01hcmtlci5uYW1lPUpTUCBUYXNrCi0KLWV4dGVuc2lvbi1wb2ludC5uYW1lLjAgPSBKU1AgRUwgVHJhbnNsYXRvcgotCi1jb250ZW50VHlwZUNTU0pTUE5hbWU9Q1NTIEpTUAotY29udGVudFR5cGVDU1NKU1BGTmFtZT1DU1MgSlNQIEZyYWdtZW50Ci0KLWNvbnRlbnRUeXBlQ1NTRG9jdW1lbnRGYWN0b3J5TmFtZT1Db250ZW50IFR5cGUgQ1NTIEpTUCBkb2N1bWVudCBmYWN0b3J5IGV4dGVuc2lvbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjE1M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVsVHJhbnNsYXRvciIgbmFtZT0iJWV4dGVuc2lvbi1wb2ludC5uYW1lLjAiIHNjaGVtYT0ic2NoZW1hL2VsdHJhbnNsYXRvci5leHNkIi8+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxIYW5kbGVyIj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9ySlNQIgotCQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlciI+Ci0JCTwvbW9kZWxIYW5kbGVyPgotCQk8bW9kZWxIYW5kbGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JKU1AiCi0JCQlhc3NvY2lhdGVkQ29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcGZyYWdtZW50c291cmNlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIiPgotCQk8L21vZGVsSGFuZGxlcj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9yVGFnIgotCQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdzb3VyY2UiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci50YWciPgotCQk8L21vZGVsSGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudEZhY3RvcmllcyI+Ci0JCTxmYWN0b3J5Ci0JCQl0eXBlPSJ0bGQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuQ01Eb2N1bWVudEZhY3RvcnlUTEQiPgotCQk8L2ZhY3Rvcnk+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGFza3NjYW5uZXIiPgotCQk8c2Nhbm5lcgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YXNrcy5KU1BGaWxlVGFza1NjYW5uZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhc2tzLkpTUEZpbGVUYXNrU2Nhbm5lcjpvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFza01hcmtlciIKLQkJCWNvbnRlbnRUeXBlSWRzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJaWQ9InRhc2tNYXJrZXIiCi0JCW5hbWU9IiVfdGFza01hcmtlci5uYW1lIgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0gICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMudGFza21hcmtlciIvPgotCQk8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgotCTwvZXh0ZW5zaW9uPgotIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJ2YWxpZGF0aW9uTWFya2VyIgotICAgICAgICAgbmFtZT0iJV92YWxpZGF0aW9uTWFya2VyLm5hbWUiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0gICAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24ucHJvYmxlbW1hcmtlciIvPgotICAgICAgPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KLSA8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5kb2N1bWVudGZhY3RvcmllcyIKLQkJbmFtZT0iJVN0cnVjdHVyZWRfSlNQX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRTZXR1cCIKLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5kb2N1bWVudHNldHVwIgotCQluYW1lPSIlU3RydWN0dXJlZF9KU1BfRG9jdW1lbnRfU2V0dXBfcGFydGljaXBhbnQubmFtZSI+Ci0JCTxwYXJ0aWNpcGFudAotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkNvbnRyb2xsZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudGVhbS5jb3JlLmZpbGVUeXBlcyI+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249ImpzcCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJqc3BmIiAvPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJqc3B4IiAvPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJqc2YiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0ianN2Ij4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249Imp0cGwiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0idGxkIiAvPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJ0YWciIC8+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249InRhZ3giIC8+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249InRhZ2YiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdFByb2Nlc3NvcnMiPgotCQk8cHJvY2Vzc29yCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQuSFRNTEZvcm1hdFByb2Nlc3NvckltcGwiCi0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLQkJPC9wcm9jZXNzb3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLQkJPCEtLSBjcmVhdGUgY29udGVudCB0eXBlIGZvciBKU1AgZmlsZXMgLS0+Ci0JCTxjb250ZW50LXR5cGUKLQkJCWZpbGUtZXh0ZW5zaW9ucz0ianNwLGpzdixqdHBsLGpzcHgiCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVKU1BfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQlpZD0ianNwc291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUudGV4dCIKLQkJCWRlZmF1bHQtY2hhcnNldD0iSVNPLTg4NTktMSI+Ci0JCQk8ZGVzY3JpYmVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5Db250ZW50RGVzY3JpYmVyRm9ySlNQIiAvPgotCQk8L2NvbnRlbnQtdHlwZT4KLQkJPCEtLSBjcmVhdGUgY29udGVudCB0eXBlIGZvciBKU1AgZnJhZ21lbnQgZmlsZXMgLS0+Ci0JCTxjb250ZW50LXR5cGUKLQkJCWZpbGUtZXh0ZW5zaW9ucz0ianNwZixqc2YiCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVKU1BfRnJhZ21lbnRfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQlpZD0ianNwZnJhZ21lbnRzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiCi0JCQlkZWZhdWx0LWNoYXJzZXQ9IklTTy04ODU5LTEiPgotCQkJPGRlc2NyaWJlcgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuQ29udGVudERlc2NyaWJlckZvckpTUCIgLz4KLQkJPC9jb250ZW50LXR5cGU+Ci0JCTwhLS0gY3JlYXRlIGNvbnRlbnQgdHlwZSBmb3IgSlNQIDIuMCBUYWcgZmlsZSB0eXBlcyAtLT4KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJ0YWcsdGFneCx0YWdmIgotCQkJcHJpb3JpdHk9ImhpZ2giCi0JCQluYW1lPSIlSlNQX1RhZ19Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWlkPSJ0YWdzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiCi0JCQlkZWZhdWx0LWNoYXJzZXQ9IklTTy04ODU5LTEiLz4KLQkJPCEtLSBjcmVhdGUgY29udGVudCB0eXBlIGZvciAudGxkIGZpbGVzIC0tPgotCQk8Y29udGVudC10eXBlCi0JCQlmaWxlLWV4dGVuc2lvbnM9InRsZCIKLQkJCXByaW9yaXR5PSJoaWdoIgotCQkJbmFtZT0iJUpTUF9UTERfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQlpZD0idGxkc291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJZGVmYXVsdC1jaGFyc2V0PSJVVEYtOCIvPgotCi0gIAk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIG1pbmltYWwgY29udGVudC10eXBlIGNzcyBqc3Agc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgICAgICAgPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJqc3AiCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVjb250ZW50VHlwZUNTU0pTUE5hbWUiCi0JCQlpZD0iY3NzanNwc291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLQkJCTxkZXNjcmliZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5Db250ZW50RGVzY3JpYmVyRm9ySlNQZWRDU1MiIC8+Ci0JCTwvY29udGVudC10eXBlPgotICAgICAgICA8Y29udGVudC10eXBlCi0JICAgICAgICBmaWxlLWV4dGVuc2lvbnM9ImpzcGYiCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVjb250ZW50VHlwZUNTU0pTUEZOYW1lIgotCQkJaWQ9ImNzc2pzcGZyYWdtZW50c291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIj4KLQkJCTxkZXNjcmliZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5Db250ZW50RGVzY3JpYmVyRm9ySlNQZWRDU1MiIC8+Ci0JCTwvY29udGVudC10eXBlPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBpbml0aWFsaXplIGpzcCBjb3JlIHByZWZlcmVuY2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBKU1AgYmF0Y2ggdmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCSAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICA8ZXh0ZW5zaW9uIGlkPSJKU1BCYXRjaFZhbGlkYXRvciIgbmFtZT0iJUpTUF9TeW50YXhfVmFsaWRhdG9yLm5hbWUiIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JWMiI+Ci0gICAgICA8dmFsaWRhdG9yCi0gICAgICAgICAgICBidWlsZD0idHJ1ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KU1BCYXRjaFZhbGlkYXRvciIKLSAgICAgICAgICAgIG1hbnVhbD0idHJ1ZSIKLSAgICAgICAgICAgIHZlcnNpb249IjEiCi0gICAgICAgICAgICBtYXJrZXJJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnZhbGlkYXRpb25NYXJrZXIiPgotICAgICAgICAgPGluY2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0JICAgICAgICAgICA8cHJvamVjdE5hdHVyZSBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIvPgotICAgICAgICAgICAgPC9ydWxlcz4KLSAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgICAgIDxpbmNsdWRlPgotICAgICAgICAgICAgPHJ1bGVzPgotCQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIvPgotCQkJCTwhLS0gbmVlZGVkIHVudGlsIGJ1ZyAxODE0NDMgaXMgaW1wbGVtZW50ZWQgLS0+Ci0JCQkJPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZnJhZ21lbnRzb3VyY2UiLz4KLQkJCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0Ci0gICAgICAgICAgICAgICAgICAgICBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgIGV4dD0ianNwIj4KLSAgICAgICAgICAgICAgIDwvZmlsZWV4dD4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0Ci0gICAgICAgICAgICAgICAgICAgICBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgIGV4dD0ianNwZiI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9ImpzZiI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9InRhZyI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9InRhZ2YiPgotICAgICAgICAgICAgICAgPC9maWxlZXh0PgotICAgICAgICAgICAgICAgPGZpbGVleHQKLSAgICAgICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICAgZXh0PSJqc3YiPgotICAgICAgICAgICAgICAgPC9maWxlZXh0PgotICAgICAgICAgICAgICAgPGZpbGVleHQKLSAgICAgICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICAgZXh0PSJqdHBsIj4KLSAgICAgICAgICAgICAgIDwvZmlsZWV4dD4KLSAgICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgICA8Z3JvdXAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5zdHJ1Y3R1cmVkTW9kZWxHcm91cCIvPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLQkKLSAgIDxleHRlbnNpb24gaWQ9IkpTUENvbnRlbnRWYWxpZGF0b3IiIG5hbWU9IiVKU1BfQ29udGVudF9WYWxpZGF0b3IubmFtZSIgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvclYyIj4KLSAgICAgIDx2YWxpZGF0b3IKLSAgICAgICAgICAgIGJ1aWxkPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUENvbnRlbnRWYWxpZGF0b3IiCi0gICAgICAgICAgICBtYW51YWw9InRydWUiCi0gICAgICAgICAgICB2ZXJzaW9uPSIxIgotICAgICAgICAgICAgbWFya2VySWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS52YWxpZGF0aW9uTWFya2VyIj4KLSAgICAgICAgIDxpbmNsdWRlPgotICAgICAgICAgICAgPHJ1bGVzPgotCQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIvPgotCQkJCTwhLS0gbmVlZGVkIHVudGlsIGJ1ZyAxODE0NDMgaXMgaW1wbGVtZW50ZWQgLS0+Ci0JCQkJPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZnJhZ21lbnRzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0Ci0gICAgICAgICAgICAgICAgICAgICBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgIGV4dD0ianNwIj4KLSAgICAgICAgICAgICAgIDwvZmlsZWV4dD4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0Ci0gICAgICAgICAgICAgICAgICAgICBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgIGV4dD0ianNwZiI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9ImpzZiI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9InRhZyI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9InRhZ2YiPgotICAgICAgICAgICAgICAgPC9maWxlZXh0PgotICAgICAgICAgICAgICAgPGZpbGVleHQKLSAgICAgICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICAgZXh0PSJqc3YiPgotICAgICAgICAgICAgICAgPC9maWxlZXh0PgotICAgICAgICAgICAgICAgPGZpbGVleHQKLSAgICAgICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICAgZXh0PSJqdHBsIj4KLSAgICAgICAgICAgICAgIDwvZmlsZWV4dD4KLSAgICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgICA8Z3JvdXAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5zdHJ1Y3R1cmVkTW9kZWxHcm91cCIvPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLQkJCi0gICAgPGV4dGVuc2lvbgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuZWxUcmFuc2xhdG9yIj4KLSAgICAgICA8ZWxUcmFuc2xhdG9yCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsLkpTUEVMVHJhbnNsYXRvciIKLSAgICAgICAgICBuYW1lPSJEZWZhdWx0IEpTUCAyLjAgRUwgVHJhbnNsYXRvciIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5kZWZhdWx0SlNQMjAiLz4KLSAgICA8L2V4dGVuc2lvbj4KLSAgICAKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxIYW5kbGVyIj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckpTUGVkQ1NTIgotCQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3Bzb3VyY2UiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5tb2RlbGhhbmRsZXIiPgotCQk8L21vZGVsSGFuZGxlcj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckpTUGVkQ1NTIgotCQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3BmcmFnbWVudHNvdXJjZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLm1vZGVsaGFuZGxlciI+Ci0JCTwvbW9kZWxIYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnRmYWN0b3JpZXMiCi0JCW5hbWU9IiVjb250ZW50VHlwZUNTU0RvY3VtZW50RmFjdG9yeU5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRTZXR1cCIKLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuZG9jdW1lbnRzZXR1cCIKLQkJbmFtZT0iJVN0cnVjdHVyZWRfSlNQX0RvY3VtZW50X1NldHVwX3BhcnRpY2lwYW50Lm5hbWUiPgotCQk8cGFydGljaXBhbnQKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3Bzb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSlNQZWRDU1NUYWdsaWJDb250cm9sbGVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmRvY3VtZW50Q3JlYXRpb24iCi0JCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50ZmFjdG9yaWVzLmZyYWdtZW50IgotCQluYW1lPSIlY29udGVudFR5cGVDU1NEb2N1bWVudEZhY3RvcnlOYW1lIj4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3BmcmFnbWVudHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgkKLQktLT4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc2NoZW1hL2VsdHJhbnNsYXRvci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc2NoZW1hL2VsdHJhbnNsYXRvci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGU0MTJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NjaGVtYS9lbHRyYW5zbGF0b3IuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZSIgaWQ9ImVsVHJhbnNsYXRvciIgbmFtZT0iSlNQIEVMIFRyYW5zbGF0b3IiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRXh0ZW5zaW9uIHBvaW50IHRvIGN1c3RvbWVyIEpTUCBFeHByZXNzaW9uIExhbmd1YWdlIEdlbmVyYXRpb24KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZWxUcmFuc2xhdG9yIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJlbFRyYW5zbGF0b3IiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgRnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIHRoZSBFTCBUcmFuc2xhdG9yLiAgTXVzdCBiZSBhbiBpbXBsZW1lbnRvciBvZiBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZWwuSUpTUEVMVHJhbnNsYXRvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBFTCB0cmFuc2xhdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgdW5pcXVlIHN0cmluZyBpZGVudGlmaWVyIGZvciBhbiBFTCBUcmFuc2xhdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9Bc3NlcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvQXNzZXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZDhlMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9Bc3NlcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsOwotCi0KLQotLyoqCi0gKiA8Y29kZT5Bc3NlcnQ8L2NvZGU+IGlzIHVzZWZ1bCBmb3IgZm9yIGVtYmVkZGluZyBydW50aW1lIHNhbml0eSBjaGVja3MgaW4KLSAqIGNvZGUuIFRoZSBwcmVkaWNhdGUgbWV0aG9kcyBhbGwgdGVzdCBhIGNvbmRpdGlvbiBhbmQgdGhyb3cgc29tZSB0eXBlIG9mCi0gKiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlmIHRoZSBjb25kaXRpb24gZG9lcyBub3QgaG9sZC4KLSAqIDxwPgotICogQXNzZXJ0aW9uIGZhaWx1cmUgZXhjZXB0aW9ucywgbGlrZSBtb3N0IHJ1bnRpbWUgZXhjZXB0aW9ucywgYXJlIHRocm93biB3aGVuCi0gKiBzb21ldGhpbmcgaXMgbWlzYmVoYXZpbmcuIEFzc2VydGlvbiBmYWlsdXJlcyBhcmUgaW52YXJpYWJseSB1bnNwZWNpZmllZAotICogYmVoYXZpb3I7IGNvbnNlcXVlbnRseSwgY2xpZW50cyBzaG91bGQgbmV2ZXIgcmVseSBvbiB0aGVzZSBiZWluZyB0aHJvd24KLSAqIChhbmQgY2VydGFpbmx5IHNob3VsZCBub3QgYmVpbmcgY2F0Y2hpbmcgdGhlbSBzcGVjaWZpY2FsbHkpLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXNzZXJ0IHsKLQotCS8qKgotCSAqIDxjb2RlPkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjwvY29kZT4gaXMgYSBydW50aW1lIGV4Y2VwdGlvbiB0aHJvd24KLQkgKiBieSBzb21lIG9mIHRoZSBtZXRob2RzIGluIDxjb2RlPkFzc2VydDwvY29kZT4uCi0JICogPHA+Ci0JICogVGhpcyBjbGFzcyBpcyBub3QgZGVjbGFyZWQgcHVibGljIHRvIHByZXZlbnQgc29tZSBtaXN1c2VzOyBwcm9ncmFtcwotCSAqIHRoYXQgY2F0Y2ggb3Igb3RoZXJ3aXNlIGRlcGVuZCBvbiBhc3NlcnRpb24gZmFpbHVyZXMgYXJlIHN1c2NlcHRpYmxlIHRvCi0JICogdW5leHBlY3RlZCBicmVha2FnZSB3aGVuIGFzc2VydGlvbnMgaW4gdGhlIGNvZGUgYXJlIGFkZGVkIG9yIHJlbW92ZWQuCi0JICogPC9wPgotCSAqLwotCWNsYXNzIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbi4KLQkJICovCi0JCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuCi0JCSAqLwotCQlwdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKFN0cmluZyBkZXRhaWwpIHsKLQkJCXN1cGVyKGRldGFpbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgYW4gYXJndW1lbnQgaXMgbGVnYWwuIElmIHRoZSBnaXZlbiBib29sZWFuIGlzIG5vdAotCSAqIDxjb2RlPnRydWU8L2NvZGU+LCBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+IGlzCi0JICogdGhyb3duLiBUaGUgZ2l2ZW4gbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkCi0JICogZGVidWdnaW5nLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4gaWYgdGhlCi0JICogICAgICAgICBjaGVjayBmYWlscykKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBsZWdhbGl0eSB0ZXN0IGZhaWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xlZ2FsKGJvb2xlYW4gZXhwcmVzc2lvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKCFleHByZXNzaW9uKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtZXNzYWdlKTsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGlzIGlzCi0JICogbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoZSBnaXZlbgotCSAqIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHRlc3QKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGlzTm90TnVsbChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAob2JqZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBBc3NlcnQoKS5uZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBib29sZWFuIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiB0aGlzIGlzIG5vdAotCSAqIHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlCi0JICogaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pIHsKLQkJCXRocm93IG5ldyBBc3NlcnQoKS5uZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQl9Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZC4gKi8KLQlwcml2YXRlIEFzc2VydCgpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0pTUENvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9KU1BDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhNzJmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0pTUENvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IEpTUCBDb3JlCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSlNQQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BBY3Rpb25WYWxpZGF0b3JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BJbmRleE1hbmFnZXJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BJbmRleE1hbmFnZXJfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BfU2VhcmNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEVMX1N5bnRheDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BFTF9Ub2tlbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEb2N1bWVudExvYWRlcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9Qcm9ibGVtc19VcGRhdGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BCYXRjaFZhbGlkYXRvcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ2xpYkhlbHBlcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ2xpYkhlbHBlcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ2xpYkhlbHBlcl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ2xpYkhlbHBlcl8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFRyYW5zbGF0b3JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BUcmFuc2xhdG9yXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQVHJhbnNsYXRvcl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFRyYW5zbGF0b3JfMzsKLQkKLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfSlNQX1ZBTElEQVRJTkdfTUVTU0FHRV9VSV87Ci0JCi0JcHJpdmF0ZSBKU1BDb3JlTWVzc2FnZXMoKSB7Ci0JfQotCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSlNQQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0pTUENvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvSlNQQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGEyOWQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvSlNQQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuVGFnbGliQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BJbmRleE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhZ2xpYi5UYWdsaWJIZWxwZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuVGFnbGliSW5kZXg7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEpTUENvcmVQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBKU1BDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtIHdpbGwgYmUgcmVtb3ZlZC4gQ3VycmVudGx5IHVzZWQgdG8gZ2V0ICJtb2RlbAotCSAqICAgICAgICAgICAgIHByZWZlcmVuY2VzIiwgYnV0IHRoZXJlIGFyZSBvdGhlciwgYmV0dGVyIHdheXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBKU1BDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCi0JCS8qCi0JCSAqIEpTUEluZGV4TWFuYWdlciBkZXBlbmRzIG9uIFRhZ2xpYkNvbnRyb2xsZXIsIHNvIFRhZ2xpYkNvbnRyb2xsZXIKLQkJICogc2hvdWxkIGJlIHN0YXJ0ZWQgZmlyc3QKLQkJICovCi0JCVRhZ2xpYkluZGV4LnN0YXJ0dXAoKTsKLQkJVGFnbGliQ29udHJvbGxlci5zdGFydHVwKCk7Ci0KLQkJLy8gbGlzdGVuIGZvciBjbGFzc3BhdGggY2hhbmdlcwotCQlKYXZhQ29yZS5hZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKFRhZ2xpYkhlbHBlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKSk7Ci0KLQotCQlKU1BJbmRleE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pbml0aWFsaXplKCk7Ci0KLQkJLy8gbGlzdGVuIGZvciByZXNvdXJjZSBjaGFuZ2VzIHRvIHVwZGF0ZSBjb250ZW50IHByb3BlcnRpZXMga2V5cwotCQlKU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLnN0YXJ0dXAoKTsKLQotCQlEZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGUuc3RhcnQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCURlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZS5zdG9wKCk7Ci0KLQkJLyoKLQkJICogc3RvcCBsaXN0ZW5pbmcgZm9yIHJlc291cmNlIGNoYW5nZXMgdG8gdXBkYXRlIGNvbnRlbnQgcHJvcGVydGllcwotCQkgKiBrZXlzCi0JCSAqLwotCQlKU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLnNodXRkb3duKCk7Ci0KLQkJLy8gc3RvcCBhbnkgaW5kZXhpbmcKLQkJSlNQSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkuc2h1dGRvd24oKTsKLQotCQkvLyBzdG9wIGxpc3RlbmluZyBmb3IgY2xhc3NwYXRoIGNoYW5nZXMKLQkJSmF2YUNvcmUucmVtb3ZlRWxlbWVudENoYW5nZWRMaXN0ZW5lcihUYWdsaWJIZWxwZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkpOwotCi0JCS8vIHN0b3AgdGFnbGliIGNvbnRyb2xsZXIKLQkJVGFnbGliQ29udHJvbGxlci5zaHV0ZG93bigpOwotCQlUYWdsaWJJbmRleC5zaHV0ZG93bigpOwotCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9KU1BDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0pTUENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmNTFlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0pTUENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUpTUEluZGV4TWFuYWdlcl8wPVVwZGF0aW5nIEpTUCBJbmRleAotSlNQSW5kZXhNYW5hZ2VyXzI9SlNQIEluZGV4ZXIgaW5kZXhpbmcgezB9IGZpbGVzCi1KU1BfU2VhcmNoPUpTUCBTZWFyY2ggLSAKLUpTUERvY3VtZW50TG9hZGVyXzE9UHJvZ3JhbSBFcnJvcjogc3RydWN0dXJlZCBtb2RlbCBoYWQgbm8gc3RydWN0dXJlZERvY3VtZW50Ci1KU1BFTF9TeW50YXg9RUwgU3ludGF4IEVycm9yIAotSlNQRUxfVG9rZW49VW5hYmxlIHRvIGFuYWx5emUgRUwgZXhwcmVzc2lvbiBkdWUgdG8gbGV4aWNhbCBhbmFseXNpcyBlcnJvcgotTUVTU0FHRV9KU1BfVkFMSURBVElOR19NRVNTQUdFX1VJXz1KU1AgVmFsaWRhdG9yIHZhbGlkYXRpbmcgezB9Ci1KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nPVVwZGF0aW5nIEpTUCBGcmFnbWVudCBDb250ZW50IFNldHRpbmdzCi1KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1Byb2JsZW1zX1VwZGF0aW5nPVByb2JsZW0gc2F2aW5nIEpTUCBGcmFnbWVudCBDb250ZW50IFNldHRpbmdzIGZvciB7MH0KLUpTUERpcmVjdGl2ZVZhbGlkYXRvcl8wPXswfSBpcyBhIHJlc2VydmVkIHByZWZpeC4gIFRyeSBhbm90aGVyCi1KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMT1DYW5ub3QgZmluZCB0aGUgdGFnIGxpYnJhcnkgZGVzY3JpcHRvciBmb3IgInswfSIKLUpTUERpcmVjdGl2ZVZhbGlkYXRvcl8yPVRoZSBwcmVmaXggInswfSAiaXMgdXNlZCBtb3JlIHRoYW4gb25jZQotSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzM9QSB7MH0gdmFsdWUgaXMgcmVxdWlyZWQgaW4gdGhpcyBkaXJlY3RpdmUKLUpTUERpcmVjdGl2ZVZhbGlkYXRvcl80PUZyYWdtZW50ICJ7MH0iIHdhcyBub3QgYmUgZm91bmQgYXQgZXhwZWN0ZWQgcGF0aCB7MX0KLUpTUERpcmVjdGl2ZVZhbGlkYXRvcl81PU1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlICJ7MH0iCi1KU1BEaXJlY3RpdmVWYWxpZGF0b3JfNj1VbmRlZmluZWQgYXR0cmlidXRlIG5hbWUgInswfSIKLUpTUERpcmVjdGl2ZVZhbGlkYXRvcl83PUEgezB9IG9yIHsxfSB2YWx1ZSBpcyByZXF1aXJlZCBpbiB0aGlzIGRpcmVjdGl2ZQotSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzg9VGhlIHN1cGVyY2xhc3MgInswfSIgd2FzIG5vdCBmb3VuZCBvbiB0aGUgYnVpbGQgcGF0aAotSlNQQWN0aW9uVmFsaWRhdG9yXzA9VGFnICh7MH0pIG11c3QgYmUgZW1wdHkKLUpTUEJhdGNoVmFsaWRhdG9yXzA9R2F0aGVyaW5nIGZpbGVzIGluIHswfQotVGFnbGliSGVscGVyXzA9VGhlIFRhZ0V4dHJhSW5mbyBjbGFzcyBmb3IgezB9ICh7MX0pIHdhcyBub3QgZm91bmQgb24gdGhlIGJ1aWxkIHBhdGgKLVRhZ2xpYkhlbHBlcl8xPVRoZSBUYWdFeHRyYUluZm8gY2xhc3MgZm9yIHswfSAoezF9KSBjb3VsZCBub3QgYmUgaW5zdGFudGlhdGVkCi1UYWdsaWJIZWxwZXJfMj1BIHByb2JsZW0gd2FzIGVuY291bnRlcmVkIHVzaW5nIFRhZ0V4dHJhSW5mbyBjbGFzcyB7MX0gZm9yIHswfSAKLVRhZ2xpYkhlbHBlcl8zPVRoZSB0YWcgaGFuZGxlciBjbGFzcyBmb3IgezB9ICh7MX0pIHdhcyBub3QgZm91bmQgb24gdGhlIGJ1aWxkIHBhdGgKLUpTUFRyYW5zbGF0b3JfMD1JbnZhbGlkIGlkZW50aWZpZXI6ICJ7MH0iCi1KU1BUcmFuc2xhdG9yXzE9VW5kZWZpbmVkIHR5cGU6IHswfQotSlNQVHJhbnNsYXRvcl8yPUNhbm5vdCBkZWNsYXJlIGJvdGggImNsYXNzIiBhbmQgImJlYW5OYW1lIiBhdHRyaWJ1dGVzCi1KU1BUcmFuc2xhdG9yXzM9VW5rbm93biB0eXBlIGZvciBpZGVudGlmaWVyICJ7MH0iCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJkMDJhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZiBkZXNpcmVkLAotICogdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMgcGx1Z2luLiBPdGhlcgotICogcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIEBwYXJhbSBsZXZlbCBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoT0ssIElORk8sIFdBUk5JTkcsIEVSUk9SLCBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24gZXhjZXB0aW9uIHRocm93bgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGxldmVsID09IE9LX0RFQlVHIHx8IGxldmVsID09IElORk9fREVCVUcgfHwgbGV2ZWwgPT0gV0FSTklOR19ERUJVRyB8fCBsZXZlbCA9PSBFUlJPUl9ERUJVRykgewotCQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JCXN3aXRjaCAobGV2ZWwpIHsKLQkJCWNhc2UgSU5GT19ERUJVRyA6Ci0JCQljYXNlIElORk8gOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXQVJOSU5HX0RFQlVHIDoKLQkJCWNhc2UgV0FSTklORyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLldBUk5JTkc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVSUk9SX0RFQlVHIDoKLQkJCWNhc2UgRVJST1IgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5FUlJPUjsKLQkJfQotCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgbWVzc2FnZSB0byBsb2cgaWYgY2F0ZWdvcnkgbWF0Y2hlcyAvZGVidWcvdHJhY2VmaWx0ZXIgb3B0aW9uLgotCSAqIEBwYXJhbSBtZXNzYWdlIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGggL2RlYnVnL3RyYWNlZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF90cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChpc1RyYWNpbmcoY2F0ZWdvcnkpKSB7Ci0JCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBpcyBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgY3VycmVudGx5IHRyYWNpbmcgYSBjYXRlZ29yeQotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFjaW5nIGNhdGVnb3J5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnRXcmFwcGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Db250ZW50V3JhcHBlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE3MDdiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnRXcmFwcGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBDTUNvbnRlbnRXcmFwcGVySW1wbCBleHRlbmRzIENNTm9kZVdyYXBwZXJJbXBsIGltcGxlbWVudHMgQ01Db250ZW50IHsKLQotCXByaXZhdGUgQ01Db250ZW50IGZDTUNvbnRlbnQgPSBudWxsOwotCi0JLyoqCi0JICogQ01Db250ZW50V3JhcHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBwcmVmaXggamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBub2RlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHVibGljIENNQ29udGVudFdyYXBwZXJJbXBsKFN0cmluZyBwcmVmaXgsIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50IG5vZGUpIHsKLQkJc3VwZXIocHJlZml4LCBub2RlKTsKLQkJZkNNQ29udGVudCA9IG5vZGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWF4T2NjdXIgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIElmIC0xLCBpdCdzIFVOQk9VTkRFRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1heE9jY3VyKCkgewotCQlyZXR1cm4gZkNNQ29udGVudC5nZXRNYXhPY2N1cigpOwotCX0KLQotCS8qKgotCSAqIGdldE1pbk9jY3VyIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBJZiAwLCBpdCdzIE9QVElPTkFMLgotCSAqIElmIDEsIGl0J3MgUkVRVUlSRUQuCi0JICovCi0JcHVibGljIGludCBnZXRNaW5PY2N1cigpIHsKLQkJcmV0dXJuIGZDTUNvbnRlbnQuZ2V0TWluT2NjdXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ01Ob2RlIGdldE9yaWdpbk5vZGUoKSB7Ci0JCXJldHVybiBmQ01Db250ZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnRXcmFwcGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudFdyYXBwZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMzBmOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudFdyYXBwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVXcmFwcGVyOwotCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudFdyYXBwZXJJbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudCwgQ01Ob2RlV3JhcHBlciB7Ci0KLQljbGFzcyBDTU5hbWVkTm9kZU1hcEltcGwgaW1wbGVtZW50cyBDTU5hbWVkTm9kZU1hcCB7Ci0KLQkJcHJvdGVjdGVkIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCUhhc2h0YWJsZSBnZXRIYXNodGFibGUoKSB7Ci0JCQlyZXR1cm4gdGFibGU7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCXJldHVybiB0YWJsZS5zaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIChDTU5vZGUpIHRhYmxlLmdldChuYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQkJaW50IHNpemUgPSB0YWJsZS5zaXplKCk7Ci0JCQlpZiAoaW5kZXggPCBzaXplKSB7Ci0JCQkJSXRlcmF0b3IgdmFsdWVzID0gaXRlcmF0b3IoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8PSBpbmRleDsgaSsrKSB7Ci0JCQkJCXJlc3VsdCA9IHZhbHVlcy5uZXh0KCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIChDTU5vZGUpIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJCXJldHVybiB0YWJsZS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lLCBDTU5vZGUgYU5vZGUpIHsKLQkJCWlmIChuYW1lICE9IG51bGwgJiYgYU5vZGUgIT0gbnVsbCkKLQkJCQl0YWJsZS5wdXQobmFtZSwgYU5vZGUpOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIENNTmFtZXNwYWNlSW1wbCBpbXBsZW1lbnRzIENNTmFtZXNwYWNlIHsKLQkJcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJCXJldHVybiBDTURvY3VtZW50V3JhcHBlckltcGwudGhpcy5nZXRVUkkoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQlyZXR1cm4gQ01Ob2RlLk5BTUVfU1BBQ0U7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJCXJldHVybiBDTURvY3VtZW50V3JhcHBlckltcGwudGhpcy5nZXRQcmVmaXgoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkgewotCQkJcmV0dXJuIENNRG9jdW1lbnRXcmFwcGVySW1wbC50aGlzLmdldFVSSSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIGZlYXR1cmUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ01Eb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBDTU5hbWVkTm9kZU1hcCBmRWxlbWVudHMgPSBudWxsOwotCXByaXZhdGUgQ01OYW1lZE5vZGVNYXAgZkVudGl0aWVzID0gbnVsbDsKLQlwcml2YXRlIENNTmFtZXNwYWNlIGZOYW1lc3BhY2UgPSBuZXcgQ01OYW1lc3BhY2VJbXBsKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgZlByZWZpeDsKLQlwcml2YXRlIFN0cmluZyBmVVJJOwotCi0JcHVibGljIENNRG9jdW1lbnRXcmFwcGVySW1wbChTdHJpbmcgbmV3VVJJLCBTdHJpbmcgbmV3UHJlZml4LCBDTURvY3VtZW50IHRsZCkgewotCQlmVVJJID0gbmV3VVJJOwotCQlmUHJlZml4ID0gbmV3UHJlZml4OwotCQlmRG9jdW1lbnQgPSB0bGQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbGVtZW50cyBtZXRob2QKLQkgKiBAcmV0dXJuIENNTmFtZWROb2RlTWFwCi0JICoKLQkgKiBSZXR1cm5zIENNTmFtZWROb2RlTWFwIG9mIEVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpIHsKLQkJaWYgKGZFbGVtZW50cyA9PSBudWxsKSB7Ci0JCQlpbnQgbGVuZ3RoID0gZ2V0RG9jdW1lbnQoKS5nZXRFbGVtZW50cygpLmdldExlbmd0aCgpOwotCQkJQ01OYW1lZE5vZGVNYXBJbXBsIGVsZW1lbnRzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbmV3IENNRWxlbWVudERlY2xhcmF0aW9uV3JhcHBlckltcGwoZlByZWZpeCwgKENNRWxlbWVudERlY2xhcmF0aW9uKSBnZXREb2N1bWVudCgpLmdldEVsZW1lbnRzKCkuaXRlbShpKSk7Ci0JCQkJZWxlbWVudHMuc2V0TmFtZWRJdGVtKGVkLmdldE5vZGVOYW1lKCksIGVkKTsKLQkJCX0KLQkJCWZFbGVtZW50cyA9IGVsZW1lbnRzOwotCQl9Ci0JCXJldHVybiBmRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogZ2V0RW50aXRpZXMgbWV0aG9kCi0JICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotCSAqCi0JICogUmV0dXJucyBDTU5hbWVkTm9kZU1hcCBvZiBFbnRpdHlEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpIHsKLQkJaWYgKGZFbnRpdGllcyA9PSBudWxsKSB7Ci0JCQlmRW50aXRpZXMgPSBnZXREb2N1bWVudCgpLmdldEVudGl0aWVzKCk7Ci0JCX0KLQkJcmV0dXJuIGZFbnRpdGllczsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lc3BhY2UgbWV0aG9kCi0JICogQHJldHVybiBDTU5hbWVzcGFjZQotCSAqLwotCXB1YmxpYyBDTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBmTmFtZXNwYWNlOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBnZXREb2N1bWVudCgpLmdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBnZXREb2N1bWVudCgpLmdldE5vZGVUeXBlKCk7Ci0JfQotCi0JcHVibGljIENNTm9kZSBnZXRPcmlnaW5Ob2RlKCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlyZXR1cm4gZlByZWZpeDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKgotCSAqIFJldHVybnMgdGhlIG9iamVjdCBwcm9wZXJ0eSBkZXNjaXBlZCBieSB0aGUgcHJvcGVydHlOYW1lCi0JICoKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIGdldERvY3VtZW50KCkuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJcmV0dXJuIGZVUkk7Ci0JfQotCi0JLyoqCi0JICogc3VwcG9ydHMgbWV0aG9kCi0JICogQHJldHVybiBib29sZWFuCi0JICoKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIENNTm9kZSBzdXBwb3J0cyBhIHNwZWNpZmllZCBwcm9wZXJ0eQotCSAqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gZ2V0RG9jdW1lbnQoKS5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRWxlbWVudERlY2xhcmF0aW9uV3JhcHBlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRWxlbWVudERlY2xhcmF0aW9uV3JhcHBlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjllZWNhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUVsZW1lbnREZWNsYXJhdGlvbldyYXBwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBDTUVsZW1lbnREZWNsYXJhdGlvbldyYXBwZXJJbXBsIGV4dGVuZHMgQ01Ob2RlV3JhcHBlckltcGwgaW1wbGVtZW50cyBDTUVsZW1lbnREZWNsYXJhdGlvbiB7Ci0JcHJpdmF0ZSBDTUNvbnRlbnQgZkNNQ29udGVudCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZkVsZW1lbnREZWNsID0gbnVsbDsKLQotCS8qKgotCSAqIENNRWxlbWVudERlY2xhcmF0aW9uV3JhcHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBwcmVmaXggamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBub2RlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uV3JhcHBlckltcGwoU3RyaW5nIHByZWZpeCwgQ01FbGVtZW50RGVjbGFyYXRpb24gbm9kZSkgewotCQlzdXBlcihwcmVmaXgsIG5vZGUpOwotCQlmRWxlbWVudERlY2wgPSBub2RlOwotCX0KLQotCS8qKgotCSAqIGdldEF0dHJpYnV0ZXMgbWV0aG9kCi0JICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotCSAqCi0JICogUmV0dXJucyBDTU5hbWVkTm9kZU1hcCBvZiBBdHRyaWJ1dGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gZkVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDTUNvbnRlbnQgbWV0aG9kCi0JICogQHJldHVybiBDTUNvbnRlbnQKLQkgKgotCSAqIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGlzIGVsZW1lbnQncyBjb250ZW50IG1vZGVsLgotCSAqIFRoaXMgY2FuIGJlIGFuIENNRWxlbWVudERlY2xhcmF0aW9uIG9yIGEgQ01Hcm91cAotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJaWYgKGZDTUNvbnRlbnQgPT0gbnVsbCkgewotCQkJQ01Db250ZW50IGNvbnRlbnQgPSBmRWxlbWVudERlY2wuZ2V0Q29udGVudCgpOwotCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgQ01Hcm91cCkKLQkJCQlmQ01Db250ZW50ID0gbmV3IENNR3JvdXBXcmFwcGVySW1wbChmUHJlZml4LCAoQ01Hcm91cCkgY29udGVudCk7Ci0JCQllbHNlCi0JCQkJZkNNQ29udGVudCA9IG5ldyBDTUNvbnRlbnRXcmFwcGVySW1wbChmUHJlZml4LCBjb250ZW50KTsKLQkJfQotCQlyZXR1cm4gZkNNQ29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDb250ZW50VHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBmRWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ01EYXRhVHlwZSBnZXREYXRhVHlwZSgpIHsKLQkJcmV0dXJuIGZFbGVtZW50RGVjbC5nZXREYXRhVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIGdldEVsZW1lbnROYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIGdldExvY2FsRWxlbWVudHMgbWV0aG9kCi0JICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotCSAqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgbG9jYWxseSBkZWZpbmVkIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRMb2NhbEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZkVsZW1lbnREZWNsLmdldExvY2FsRWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRNYXhPY2N1ciBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogSWYgLTEsIGl0J3MgVU5CT1VOREVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKSB7Ci0JCXJldHVybiBmRWxlbWVudERlY2wuZ2V0TWF4T2NjdXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRNaW5PY2N1ciBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogSWYgMCwgaXQncyBPUFRJT05BTC4KLQkgKiBJZiAxLCBpdCdzIFJFUVVJUkVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKSB7Ci0JCXJldHVybiBmRWxlbWVudERlY2wuZ2V0TWluT2NjdXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ01Ob2RlIGdldE9yaWdpbk5vZGUoKSB7Ci0JCXJldHVybiBmRWxlbWVudERlY2w7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Hcm91cFdyYXBwZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUdyb3VwV3JhcHBlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4NjE5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUdyb3VwV3JhcHBlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDTUdyb3VwV3JhcHBlckltcGwgZXh0ZW5kcyBDTUNvbnRlbnRXcmFwcGVySW1wbCBpbXBsZW1lbnRzIENNR3JvdXAgewotCWNsYXNzIENNTm9kZUxpc3RJbXBsIGltcGxlbWVudHMgQ01Ob2RlTGlzdCB7Ci0JCXByaXZhdGUgTGlzdCBub2RlcyA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIENNTm9kZUxpc3RJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JCSAqLwotCQlwdWJsaWMgQ01Ob2RlTGlzdEltcGwoKSB7Ci0JCQlzdXBlcigpOwotCQkJbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCQkgKiBAcGFyYW0gbm9kZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCQkgKi8KLQkJcHVibGljIHZvaWQgYXBwZW5kSXRlbShDTU5vZGUgbm9kZSkgewotCQkJbm9kZXMuYWRkKG5vZGUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGdldExlbmd0aCBtZXRob2QKLQkJICogQHJldHVybiBpbnQKLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIG5vZGVzLnNpemUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBpdGVtIG1ldGhvZAotCQkgKiBAcmV0dXJuIENNTm9kZQotCQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JCSAqLwotCQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG5vZGVzLnNpemUoKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiAoQ01Ob2RlKSBub2Rlcy5nZXQoaW5kZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDTU5vZGVMaXN0IGZDaGlsZE5vZGVzID0gbnVsbDsKLQlwcml2YXRlIENNR3JvdXAgZkdyb3VwID0gbnVsbDsKLQotCS8qKgotCSAqIENNR3JvdXBXcmFwcGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIHByZWZpeCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG5vZGUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgQ01Hcm91cFdyYXBwZXJJbXBsKFN0cmluZyBwcmVmaXgsIENNR3JvdXAgbm9kZSkgewotCQlzdXBlcihwcmVmaXgsIG5vZGUpOwotCX0KLQotCS8qKgotCSAqIGdldENoaWxkTm9kZXMgbWV0aG9kCi0JICogQHJldHVybiBDTU5vZGVMaXN0Ci0JICoKLQkgKiBSZXR1cm5zIGNoaWxkIENNTm9kZUxpc3QsIHdoaWNoIGluY2x1ZGVzIEVsZW1lbnREZWZpbml0aW9uIG9yIENNRWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Ob2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotCQlpZiAoZkNoaWxkTm9kZXMgPT0gbnVsbCkgewotCQkJQ01Ob2RlTGlzdEltcGwgY2hpbGROb2RlcyA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotCQkJQ01Ob2RlTGlzdCBjaGlsZHJlbiA9IGZHcm91cC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlDTU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIENNR3JvdXApCi0JCQkJCWNoaWxkTm9kZXMuYXBwZW5kSXRlbShuZXcgQ01Hcm91cFdyYXBwZXJJbXBsKGZQcmVmaXgsIChDTUdyb3VwKSBjaGlsZCkpOwotCQkJCWVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgQ01FbGVtZW50RGVjbGFyYXRpb24pCi0JCQkJCWNoaWxkTm9kZXMuYXBwZW5kSXRlbShuZXcgQ01FbGVtZW50RGVjbGFyYXRpb25XcmFwcGVySW1wbChmUHJlZml4LCAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNoaWxkKSk7Ci0JCQkJZWxzZQotCQkJCQkvLyBlcnJvcj8KLQkJCQkJY2hpbGROb2Rlcy5hcHBlbmRJdGVtKG5ldyBDTU5vZGVXcmFwcGVySW1wbChmUHJlZml4LCBjaGlsZCkpOwotCQkJfQotCQkJZkNoaWxkTm9kZXMgPSBjaGlsZE5vZGVzOwotCQl9Ci0JCXJldHVybiBmQ2hpbGROb2RlczsKLQl9Ci0KLQkvKioKLQkgKiBnZXRPcGVyYXRpb24gbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiBBTE9ORSAoYSksIFNFUVVFTkNFIChhLGIpLCBDSE9JQ0UgKGF8YiksIEFMTCAoYSZiKS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE9wZXJhdG9yKCkgewotCQlyZXR1cm4gZkdyb3VwLmdldE9wZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIENNTm9kZSBnZXRPcmlnaW5Ob2RlKCkgewotCQlyZXR1cm4gZkdyb3VwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZVdyYXBwZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVXcmFwcGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGI3ZDIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZVdyYXBwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNTm9kZVdyYXBwZXI7Ci0KLXB1YmxpYyBjbGFzcyBDTU5vZGVXcmFwcGVySW1wbCBpbXBsZW1lbnRzIENNTm9kZSwgQ01Ob2RlV3JhcHBlciB7Ci0JcHJpdmF0ZSBDTU5vZGUgZk5vZGUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZOb2RlTmFtZSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZQcmVmaXggPSBudWxsOwotCi0JLyoqCi0JICogQ01Ob2RlV3JhcHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTU5vZGVXcmFwcGVySW1wbChTdHJpbmcgcHJlZml4LCBDTU5vZGUgbm9kZSkgewotCQlzdXBlcigpOwotCQlmUHJlZml4ID0gcHJlZml4OwotCQlmTm9kZSA9IG5vZGU7Ci0KLQkJZk5vZGVOYW1lID0gZlByZWZpeCArICI6IiArIGZOb2RlLmdldE5vZGVOYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gZk5vZGVOYW1lOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICoKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gZk5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgQ01Ob2RlIGdldE9yaWdpbk5vZGUoKSB7Ci0JCXJldHVybiBmTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKgotCSAqIFJldHVybnMgdGhlIG9iamVjdCBwcm9wZXJ0eSBkZXNjaXBlZCBieSB0aGUgcHJvcGVydHlOYW1lCi0JICoKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIGZOb2RlLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogc3VwcG9ydHMgbWV0aG9kCi0JICogQHJldHVybiBib29sZWFuCi0JICoKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIENNTm9kZSBzdXBwb3J0cyBhIHNwZWNpZmllZCBwcm9wZXJ0eQotCSAqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gZk5vZGUuc3VwcG9ydHMocHJvcGVydHlOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BDTURvY3VtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQQ01Eb2N1bWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliMmIzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BDTURvY3VtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Eb2NUeXBlOwotCi0vKioKLSAqIENNRG9jdW1lbnQgZmFjdG9yeSBmb3IgSlNQIGRvY3VtZW50cyAod2hpY2ggZm9yIG5vdyBsaXZlIGluIHRoZSBIVE1MIENvcmUKLSAqIHBsdWdpbikuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKU1BDTURvY3VtZW50RmFjdG9yeSB7Ci0KLQlwcml2YXRlIEpTUENNRG9jdW1lbnRGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkgewotCQlyZXR1cm4gZ2V0Q01Eb2N1bWVudChDTURvY1R5cGUuSlNQMjBfRE9DX1RZUEUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50Ci0JICogQHBhcmFtIGNtdHlwZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KFN0cmluZyBjbXR5cGUpIHsKLQkJaWYgKGNtdHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIGdldENNRG9jdW1lbnQoKTsKLQkJcmV0dXJuIEhUTUxDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KGNtdHlwZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoZmxvYXQganNwVmVyc2lvbikgewotCQlpZiAoanNwVmVyc2lvbiA+PSAyKQotCQkJcmV0dXJuIGdldENNRG9jdW1lbnQoQ01Eb2NUeXBlLkpTUDIwX0RPQ19UWVBFKTsKLQkJaWYgKGpzcFZlcnNpb24gPj0gMS4yKQotCQkJcmV0dXJuIGdldENNRG9jdW1lbnQoQ01Eb2NUeXBlLkpTUDEyX0RPQ19UWVBFKTsKLQkJaWYgKGpzcFZlcnNpb24gPj0gMSkKLQkJCXJldHVybiBnZXRDTURvY3VtZW50KENNRG9jVHlwZS5KU1AxMV9ET0NfVFlQRSk7Ci0JCXJldHVybiBnZXRDTURvY3VtZW50KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvVGFnbGliQ29udHJvbGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvVGFnbGliQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDQ1NGNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1RhZ2xpYkNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklEb2N1bWVudFNldHVwUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRG9jdW1lbnRTZXR1cFBhcnRpY2lwYW50RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuTG9jYXRpb25LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuVExEQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnbGliSW5kZXhEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUYWdsaWJJbmRleExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuVGFnbGliSW5kZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci0KLS8qKgotICogUHJvdmlkZXMgYSBkaXJlY3QgbWFwcGluZyBmcm9tIElTdHJ1Y3R1cmVkRG9jdW1lbnQgdG8gc3VwcG9ydGluZwotICogVExEQ01Eb2N1bWVudE1hbmFnZXIuCi0gKiAKLSAqIExpc3RlbnMgdG8gdGhlIGNyZWF0aW9uIG9mIEpTUCB0eXBlIFRleHRGaWxlQnVmZmVycyBhbmQgZm9yY2VzIGEgdGV4dC1sZXNzCi0gKiByZXBhcnNlIGFmdGVyIGNvbm5lY3RpbmcgdGFnbGliLXN1cHBvcnRpbmcgbGlzdGVuZXJzLiBDb25uZWN0aW5nIHRoZQotICogbGlzdGVuZXJzIGJlZm9yZSB0aGUgdGV4dCBpcyBzZXQgd291bGQgYmUgaWRlYWwsIGJ1dCB0aGVyZSBpcyBubyB3YXkgdG8KLSAqIGxvb2sgdXAgdGFnbGliIHJlZmVyZW5jZXMgc2luY2UgdGhlIGxvY2F0aW9uIGlzIG5vdCB5ZXQga25vd2FibGUuIFNpbmNlCi0gKiB0YWdsaWJzIGNhbiBhZmZlY3QgdGhlIHBhcnNpbmcgb2YgdGhlIGRvY3VtZW50LCBhIHJlcGFyc2UgaXMgY3VycmVudGx5Ci0gKiByZXF1aXJlZCB0byByZWFjdCB0byBjdXN0b20gdGFncyB3aXRoIHRhZ2RlcGVuZGVudCBjb250ZW50LgotICogCi0gKiBUT0RPOiBSZW1vdmUgdGhlIHJlcGFyc2UgcGVuYWx0eS4KLSAqLwotcHVibGljIGNsYXNzIFRhZ2xpYkNvbnRyb2xsZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRTZXR1cFBhcnRpY2lwYW50LCBJRG9jdW1lbnRTZXR1cFBhcnRpY2lwYW50RXh0ZW5zaW9uIHsKLQotCWNsYXNzIERvY3VtZW50SW5mbyBpbXBsZW1lbnRzIElUYWdsaWJJbmRleExpc3RlbmVyIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudDsKLQkJSVRleHRGaWxlQnVmZmVyIHRleHRGaWxlQnVmZmVyOwotCQlJUGF0aCBsb2NhdGlvbjsKLQkJTG9jYXRpb25LaW5kIGxvY2F0aW9uS2luZDsKLQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgdGxkRG9jdW1lbnRNYW5hZ2VyOwotCi0JCXB1YmxpYyB2b2lkIGluZGV4Q2hhbmdlZChJVGFnbGliSW5kZXhEZWx0YSBkZWx0YSkgewotCQkJaW50IHR5cGUgPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCQlpZiAodHlwZSA9PSBJVGFnbGliSW5kZXhEZWx0YS5DSEFOR0VEIHx8IHR5cGUgPT0gSVRhZ2xpYkluZGV4RGVsdGEuUkVNT1ZFRCkgewotCQkJCUlUYWdsaWJJbmRleERlbHRhW10gZGVsdGFzID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJCWJvb2xlYW4gYWZmZWN0ZWQgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJCQlPYmplY3Qga2V5ID0gVExEQ01Eb2N1bWVudE1hbmFnZXIuZ2V0VW5pcXVlSWRlbnRpZmllcihkZWx0YXNbaV0uZ2V0VGFnbGliUmVjb3JkKCkpOwotCQkJCQlpZiAodGxkRG9jdW1lbnRNYW5hZ2VyLmdldERvY3VtZW50cygpLmNvbnRhaW5zS2V5KGtleSkpIHsKLQkJCQkJCWFmZmVjdGVkID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoYWZmZWN0ZWQpIHsKLQkJCQkJaWYgKF9kZWJ1Z0NhY2hlKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnRNYW5hZ2VyIGNsZWFyZWQgaXRzIHByaXZhdGUgQ01Eb2N1bWVudCBjYWNoZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJdGxkRG9jdW1lbnRNYW5hZ2VyLmdldERvY3VtZW50cygpLmNsZWFyKCk7Ci0JCQkJCXRsZERvY3VtZW50TWFuYWdlci5nZXRTb3VyY2VQYXJzZXIoKS5yZXNldEhhbmRsZXJzKCk7Ci0KLQkJCQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KS5yZXBhcnNlKHRoaXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdGxkRG9jdW1lbnRNYW5hZ2VyLmluZGV4Q2hhbmdlZChkZWx0YSk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWdDYWNoZSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGxkY21kb2N1bWVudC9jYWNoZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQljbGFzcyBGaWxlQnVmZmVyTGlzdGVuZXIgaW1wbGVtZW50cyBJRmlsZUJ1ZmZlckxpc3RlbmVyIHsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lciNidWZmZXJDb250ZW50QWJvdXRUb0JlUmVwbGFjZWQob3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGJ1ZmZlckNvbnRlbnRBYm91dFRvQmVSZXBsYWNlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyI2J1ZmZlckNvbnRlbnRSZXBsYWNlZChvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYnVmZmVyQ29udGVudFJlcGxhY2VkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXIjYnVmZmVyQ3JlYXRlZChvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYnVmZmVyQ3JlYXRlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJCWlmIChidWZmZXIgaW5zdGFuY2VvZiBJVGV4dEZpbGVCdWZmZXIpIHsKLQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSAoKElUZXh0RmlsZUJ1ZmZlcikgYnVmZmVyKS5nZXREb2N1bWVudCgpOwotCQkJCS8vIGlnbm9yZSBub24tSlNQIGRvY3VtZW50cwotCQkJCXN5bmNocm9uaXplZCAoX2luc3RhbmNlLmZKU1Bkb2N1bWVudHMpIHsKLQkJCQkJaWYgKCFfaW5zdGFuY2UuZkpTUGRvY3VtZW50cy5jb250YWlucyhkb2N1bWVudCkpCi0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCUFzc2VydC5pc1RydWUoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50LCBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgU2V0dXBQYXJ0aWNpcGFudCB3YXMgY2FsbGVkIGZvciBub24tSVN0cnVjdHVyZWREb2N1bWVudCIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQlEb2N1bWVudEluZm8gaW5mbyA9IG51bGw7Ci0JCQkJc3luY2hyb25pemVkIChfaW5zdGFuY2UuZkRvY3VtZW50TWFwKSB7Ci0JCQkJCWluZm8gPSAoRG9jdW1lbnRJbmZvKSBfaW5zdGFuY2UuZkRvY3VtZW50TWFwLmdldChkb2N1bWVudCk7Ci0JCQkJfQotCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJLy8gcmVtZW1iZXIgdGhlIGJ1ZmZlciBub3cKLQkJCQkJaW5mby50ZXh0RmlsZUJ1ZmZlciA9IChJVGV4dEZpbGVCdWZmZXIpIGJ1ZmZlcjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWluZm8gPSBuZXcgRG9jdW1lbnRJbmZvKCk7Ci0JCQkJCWluZm8uZG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQ7Ci0JCQkJCWluZm8udGV4dEZpbGVCdWZmZXIgPSAoSVRleHRGaWxlQnVmZmVyKSBidWZmZXI7Ci0JCQkJCWluZm8ubG9jYXRpb24gPSBidWZmZXIuZ2V0TG9jYXRpb24oKTsKLQkJCQkJaW5mby5sb2NhdGlvbktpbmQgPSBMb2NhdGlvbktpbmQuTk9STUFMSVpFOwotCQkJCQlpbmZvLnRsZERvY3VtZW50TWFuYWdlciA9IG5ldyBUTERDTURvY3VtZW50TWFuYWdlcigpOwotCQkJCQlpbmZvLnRsZERvY3VtZW50TWFuYWdlci5zZXRTb3VyY2VQYXJzZXIoKEpTUFNvdXJjZVBhcnNlcikgaW5mby5kb2N1bWVudC5nZXRQYXJzZXIoKSk7Ci0JCQkJCXN5bmNocm9uaXplZCAoX2luc3RhbmNlLmZEb2N1bWVudE1hcCkgewotCQkJCQkJX2luc3RhbmNlLmZEb2N1bWVudE1hcC5wdXQoZG9jdW1lbnQsIGluZm8pOwotCQkJCQl9Ci0JCQkJCVRhZ2xpYkluZGV4LmFkZFRhZ2xpYkluZGV4TGlzdGVuZXIoaW5mbyk7Ci0JCQkJCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIEJhc2ljU3RydWN0dXJlZERvY3VtZW50ICYmIGRvY3VtZW50LmdldExlbmd0aCgpID4gMCkgewotCQkJCQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpLnJlcGFyc2UodGhpcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lciNidWZmZXJEaXNwb3NlZChvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYnVmZmVyRGlzcG9zZWQoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCQlpZiAoYnVmZmVyIGluc3RhbmNlb2YgSVRleHRGaWxlQnVmZmVyKSB7Ci0JCQkJSURvY3VtZW50IGRvY3VtZW50ID0gKChJVGV4dEZpbGVCdWZmZXIpIGJ1ZmZlcikuZ2V0RG9jdW1lbnQoKTsKLQkJCQlzeW5jaHJvbml6ZWQgKF9pbnN0YW5jZS5mSlNQZG9jdW1lbnRzKSB7Ci0JCQkJCWlmICghX2luc3RhbmNlLmZKU1Bkb2N1bWVudHMucmVtb3ZlKGRvY3VtZW50KSkKLQkJCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlEb2N1bWVudEluZm8gaW5mbyA9IG51bGw7Ci0JCQlzeW5jaHJvbml6ZWQgKGZEb2N1bWVudE1hcCkgewotCQkJCU1hcC5FbnRyeVtdIGVudHJpZXMgPSAoTWFwLkVudHJ5W10pIGZEb2N1bWVudE1hcC5lbnRyeVNldCgpLnRvQXJyYXkobmV3IE1hcC5FbnRyeVtmRG9jdW1lbnRNYXAuc2l6ZSgpXSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWluZm8gPSAoRG9jdW1lbnRJbmZvKSBlbnRyaWVzW2ldLmdldFZhbHVlKCk7Ci0JCQkJCS8qKgotCQkJCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjIyMTM3Ci0JCQkJCSAqIAotCQkJCQkgKiBNaWdodCBiZSBudWxsIGlmIHNldHVwKCkgaGFzIGJlZW4gY2FsbGVkIGJ1dAotCQkJCQkgKiBidWZmZXJDcmVhdGVkKCkgaGFzIG5vdCwgeWV0LgotCQkJCQkgKi8KLQkJCQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLnRleHRGaWxlQnVmZmVyICE9IG51bGwgJiYgaW5mby50ZXh0RmlsZUJ1ZmZlci5lcXVhbHMoYnVmZmVyKSkgewotCQkJCQkJZkRvY3VtZW50TWFwLnJlbW92ZShlbnRyaWVzW2ldLmdldEtleSgpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCWluZm8udGxkRG9jdW1lbnRNYW5hZ2VyLmNsZWFyQ2FjaGUoKTsKLQkJCQlUYWdsaWJJbmRleC5yZW1vdmVUYWdsaWJJbmRleExpc3RlbmVyKGluZm8pOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXIjZGlydHlTdGF0ZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlciwKLQkJICogICAgICBib29sZWFuKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlydHlTdGF0ZUNoYW5nZWQoSUZpbGVCdWZmZXIgYnVmZmVyLCBib29sZWFuIGlzRGlydHkpIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyI3N0YXRlQ2hhbmdlRmFpbGVkKG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZUZhaWxlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyI3N0YXRlQ2hhbmdpbmcob3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdpbmcoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lciNzdGF0ZVZhbGlkYXRpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXIsCi0JCSAqICAgICAgYm9vbGVhbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHN0YXRlVmFsaWRhdGlvbkNoYW5nZWQoSUZpbGVCdWZmZXIgYnVmZmVyLCBib29sZWFuIGlzU3RhdGVWYWxpZGF0ZWQpIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyI3VuZGVybHlpbmdGaWxlRGVsZXRlZChvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgdW5kZXJseWluZ0ZpbGVEZWxldGVkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXIjdW5kZXJseWluZ0ZpbGVNb3ZlZChvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHVuZGVybHlpbmdGaWxlTW92ZWQoSUZpbGVCdWZmZXIgYnVmZmVyLCBJUGF0aCBwYXRoKSB7Ci0JCX0KLQotCi0JfQotCi0Jc3RhdGljIFRhZ2xpYkNvbnRyb2xsZXIgX2luc3RhbmNlID0gbnVsbDsKLQlzdGF0aWMgcHJpdmF0ZSBib29sZWFuIGZJc1NodXRkb3duID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldExvY2F0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlzeW5jaHJvbml6ZWQgKF9pbnN0YW5jZS5mRG9jdW1lbnRNYXApIHsKLQkJCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgX2luc3RhbmNlLmZEb2N1bWVudE1hcC5nZXQoZG9jdW1lbnQpOwotCQkJaWYgKGluZm8gIT0gbnVsbCkKLQkJCQlyZXR1cm4gaW5mby5sb2NhdGlvbjsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1hbmFnZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRMb2NhdGlvbihUTERDTURvY3VtZW50TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCS8vIGlmIF9pbnN0YW5jZSBpcyBudWxsLCB3ZSBhcmUgYWxyZWFkeSBzaHV0dGluZyBkb253Ci0JCWlmIChfaW5zdGFuY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlQYXRoIGxvY2F0aW9uID0gbnVsbDsKLQkJc3luY2hyb25pemVkIChfaW5zdGFuY2UuZkRvY3VtZW50TWFwKSB7Ci0JCQlJdGVyYXRvciBkb2NJbmZvcyA9IF9pbnN0YW5jZS5mRG9jdW1lbnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChkb2NJbmZvcy5oYXNOZXh0KCkgJiYgbG9jYXRpb24gPT0gbnVsbCkgewotCQkJCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZG9jSW5mb3MubmV4dCgpOwotCQkJCWlmIChpbmZvLnRsZERvY3VtZW50TWFuYWdlci5lcXVhbHMobWFuYWdlcikpCi0JCQkJCWxvY2F0aW9uID0gaW5mby5sb2NhdGlvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUTERDTURvY3VtZW50TWFuYWdlciBnZXRUTERDTURvY3VtZW50TWFuYWdlcihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gaWYgX2luc3RhbmNlIGlzIG51bGwsIHdlIGFyZSBhbHJlYWR5IHNodXR0aW5nIGRvd24KLQkJaWYgKF9pbnN0YW5jZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXN5bmNocm9uaXplZCAoX2luc3RhbmNlLmZEb2N1bWVudE1hcCkgewotCQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBfaW5zdGFuY2UuZkRvY3VtZW50TWFwLmdldChkb2N1bWVudCk7Ci0JCQlpZiAoaW5mbyAhPSBudWxsKQotCQkJCXJldHVybiBpbmZvLnRsZERvY3VtZW50TWFuYWdlcjsKLQkJCXJldHVybiBudWxsOwotCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1NodXRkb3duKCkgewotCQlyZXR1cm4gZklzU2h1dGRvd247Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc2V0U2h1dGRvd24oYm9vbGVhbiBpc1NodXRkb3duKSB7Ci0JCWZJc1NodXRkb3duID0gaXNTaHV0ZG93bjsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHNodXRkb3duKCkgewotCQlzZXRTaHV0ZG93bih0cnVlKTsKLQkJRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCkucmVtb3ZlRmlsZUJ1ZmZlckxpc3RlbmVyKF9pbnN0YW5jZS5mQnVmZmVyTGlzdGVuZXIpOwotCQlfaW5zdGFuY2UgPSBudWxsOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgc3RhcnR1cCgpIHsKLQkJaWYgKF9pbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlfaW5zdGFuY2UgPSBuZXcgVGFnbGliQ29udHJvbGxlcigpOwotCQkJRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCkuYWRkRmlsZUJ1ZmZlckxpc3RlbmVyKF9pbnN0YW5jZS5mQnVmZmVyTGlzdGVuZXIpOwotCQl9Ci0JCXNldFNodXRkb3duKGZhbHNlKTsKLQl9Ci0KLQlJRmlsZUJ1ZmZlckxpc3RlbmVyIGZCdWZmZXJMaXN0ZW5lcjsKLQotCU1hcCBmRG9jdW1lbnRNYXA7Ci0KLQlMaXN0IGZKU1Bkb2N1bWVudHM7Ci0KLQkvKgotCSAqIFRoaXMgY29uc3RydWN0b3IgaXMgb25seSB0byBiZSBjYWxsZWQgYXMgcGFydCBvZiB0aGUgRmlsZUJ1ZmZlcgotCSAqIGZyYW1ld29yawotCSAqLwotCXB1YmxpYyBUYWdsaWJDb250cm9sbGVyKCkgewotCQlzdXBlcigpOwotCQlmQnVmZmVyTGlzdGVuZXIgPSBuZXcgRmlsZUJ1ZmZlckxpc3RlbmVyKCk7Ci0JCWZKU1Bkb2N1bWVudHMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQlmRG9jdW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgxKTsKLQl9Ci0KLQotCS8qCi0JICogVGhpcyBtZXRob2QgaXMgb25seSB0byBiZSBjYWxsZWQgYXMgcGFydCBvZiB0aGUgRmlsZUJ1ZmZlciBmcmFtZXdvcmsKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklEb2N1bWVudFNldHVwUGFydGljaXBhbnQjc2V0dXAob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0dXAoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIGlmIHdlJ3ZlIGFscmVhZHkgc2h1dGRvd24sIGp1c3QgaWdub3JlCi0JCWlmIChpc1NodXRkb3duKCkpCi0JCQlyZXR1cm47Ci0JCS8vIHJlZmVyZW5jZSB0aGUgc2hhcmVkIGluc3RhbmNlJ3MgZG9jdW1lbnRzIGRpcmVjdGx5Ci0JCXN5bmNocm9uaXplZCAoX2luc3RhbmNlLmZKU1Bkb2N1bWVudHMpIHsKLQkJCV9pbnN0YW5jZS5mSlNQZG9jdW1lbnRzLmFkZChkb2N1bWVudCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSURvY3VtZW50U2V0dXBQYXJ0aWNpcGFudEV4dGVuc2lvbiNzZXR1cChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuTG9jYXRpb25LaW5kKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldHVwKElEb2N1bWVudCBkb2N1bWVudCwgSVBhdGggbG9jYXRpb24sIExvY2F0aW9uS2luZCBsb2NhdGlvbktpbmQpIHsKLQkJLy8gaWYgd2UndmUgYWxyZWFkeSBzaHV0ZG93biwganVzdCBpZ25vcmUKLQkJaWYgKGlzU2h1dGRvd24oKSkKLQkJCXJldHVybjsKLQkJLy8gcmVmZXJlbmNlIHRoZSBzaGFyZWQgaW5zdGFuY2UncyBkb2N1bWVudHMgZGlyZWN0bHkKLQkJc3luY2hyb25pemVkIChfaW5zdGFuY2UuZkpTUGRvY3VtZW50cykgewotCQkJX2luc3RhbmNlLmZKU1Bkb2N1bWVudHMuYWRkKGRvY3VtZW50KTsKLQkJfQotCi0JCURvY3VtZW50SW5mbyBpbmZvID0gbmV3IERvY3VtZW50SW5mbygpOwotCQlpbmZvLmRvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50OwotCQlpbmZvLnRleHRGaWxlQnVmZmVyID0gbnVsbDsgLy8gd2lsbCBiZSBzdXBwbGllZCBsYXRlcgotCQlpbmZvLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JCWluZm8ubG9jYXRpb25LaW5kID0gbG9jYXRpb25LaW5kOwotCQlpbmZvLnRsZERvY3VtZW50TWFuYWdlciA9IG5ldyBUTERDTURvY3VtZW50TWFuYWdlcigpOwotCQlzeW5jaHJvbml6ZWQgKF9pbnN0YW5jZS5mRG9jdW1lbnRNYXApIHsKLQkJCV9pbnN0YW5jZS5mRG9jdW1lbnRNYXAucHV0KGRvY3VtZW50LCBpbmZvKTsKLQkJfQotCQlpbmZvLnRsZERvY3VtZW50TWFuYWdlci5zZXRTb3VyY2VQYXJzZXIoKEpTUFNvdXJjZVBhcnNlcikgaW5mby5kb2N1bWVudC5nZXRQYXJzZXIoKSk7Ci0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIEJhc2ljU3RydWN0dXJlZERvY3VtZW50ICYmIGRvY3VtZW50LmdldExlbmd0aCgpID4gMCkgewotCQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpLnJlcGFyc2UodGhpcyk7Ci0JCX0KLQkJVGFnbGliSW5kZXguYWRkVGFnbGliSW5kZXhMaXN0ZW5lcihpbmZvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWQ3ZWQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMlRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMRERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi1wdWJsaWMgY2xhc3MgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwgaW1wbGVtZW50cyBUTERBdHRyaWJ1dGVEZWNsYXJhdGlvbiB7Ci0KLQlwcml2YXRlIENNRGF0YVR5cGUgYXR0clR5cGUgPSBuZXcgQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JcHJpdmF0ZSBTdHJpbmcgZkRlc2NyaXB0aW9uOwotCi0JLy8KLQlwcml2YXRlIGJvb2xlYW4gZklzRnJhZ21lbnQgPSBmYWxzZTsKLQotCXByaXZhdGUgQ01Eb2N1bWVudCBmT3duZXJEb2N1bWVudDsKLQkvLyBvcHRpb25hbCBpZAotCXByaXZhdGUgU3RyaW5nIGlkID0gbnVsbDsKLQotCS8vIHJlcXVpcmVkIG5hbWUKLQlwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKLQkvLyBvcHRpb25hbCAicmVxdWlyZWQiIGVsZW1lbnQgcHJlc2VudCwgZGVmYXVsdHMgdG8gbm90IHByZXNlbnQKLQlwcml2YXRlIGJvb2xlYW4gcmVxdWlyZWQgPSBmYWxzZTsKLQotCS8vIG9wdGlvbmFsIHJ1bi10aW1lIChzY3JpcGxldCBkZXJpdmVkKSB2YWx1ZSBvZiBhdHRyaWJ1dGVzLCBkZWZhdWx0cyB0bwotCS8vIG5vbmUvZmFsc2UKLQlwcml2YXRlIFN0cmluZyBydGV4cHJ2YWx1ZSA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyB0eXBlID0gbnVsbDsKLQotCS8qKgotCSAqIENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsKENNRG9jdW1lbnQgb3duZXIpIHsKLQkJc3VwZXIoKTsKLQkJZk93bmVyRG9jdW1lbnQgPSBvd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJOYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIENNRGF0YVR5cGUKLQkgKi8KLQlwdWJsaWMgQ01EYXRhVHlwZSBnZXRBdHRyVHlwZSgpIHsKLQkJcmV0dXJuIGF0dHJUeXBlOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGluIHN1cGVyY2xhc3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGluIHN1cGVyY2xhc3MKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gZ2V0RW51bUF0dHIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIAotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jb250ZW50bW9kZWwudGxkLlRMREF0dHJpYnV0ZURlY2xhcmF0aW9uI2dldE93bmVyRG9jdW1lbnQoKQotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmT3duZXJEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKiAKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgcHJvcGVydHkgZGVzY2lwZWQgYnkgdGhlIHByb3BlcnR5TmFtZQotCSAqIAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lICE9IG51bGwgJiYgcHJvcGVydHlOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSkgewotCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7IC8vIHJldHVybiBhdHRyaWJ1dGUgZGVzY3JpcHRpb24KLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFRMRERvY3VtZW50LkNNX0tJTkQpKSB7Ci0JCQlyZXR1cm4gVExERG9jdW1lbnQuSlNQX1RMRDsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuU01BTExfSUNPTikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkxBUkdFX0lDT04pKSB7Ci0JCQlyZXR1cm4gZ2V0T3duZXJEb2N1bWVudCgpLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UnRleHBydmFsdWUoKSB7Ci0JCXJldHVybiBydGV4cHJ2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIGdldFVzYWdlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50IE9QVElPTkFMfFJFUVVJUkVECi0JICovCi0JcHVibGljIGludCBnZXRVc2FnZSgpIHsKLQkJcmV0dXJuIHJlcXVpcmVkID8gUkVRVUlSRUQgOiBPUFRJT05BTDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzRnJhZ21lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGcmFnbWVudCgpIHsKLQkJcmV0dXJuIGZJc0ZyYWdtZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKSB7Ci0JCXJldHVybiByZXF1aXJlZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCWZEZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpc0ZyYWdtZW50Ci0JICogICAgICAgICAgICBUaGUgaXNGcmFnbWVudCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RnJhZ21lbnQoYm9vbGVhbiBpc0ZyYWdtZW50KSB7Ci0JCWZJc0ZyYWdtZW50ID0gaXNGcmFnbWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3SWQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKLQkJaWQgPSBuZXdJZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb2RlTmFtZShTdHJpbmcgc3RyaW5nKSB7Ci0JCW5hbWUgPSBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1JlcXVpcmVkCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoYm9vbGVhbiBuZXdSZXF1aXJlZCkgewotCQlyZXF1aXJlZCA9IG5ld1JlcXVpcmVkOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdSZXF1aXJlZAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVkU3RyaW5nKFN0cmluZyBuZXdSZXF1aXJlZCkgewotCQlpZiAobmV3UmVxdWlyZWQgIT0gbnVsbCkgewotCQkJaWYgKG5ld1JlcXVpcmVkLmVxdWFsc0lnbm9yZUNhc2UoSlNQMTJUTEROYW1lcy5UUlVFKSB8fCBuZXdSZXF1aXJlZC5lcXVhbHNJZ25vcmVDYXNlKEpTUDEyVExETmFtZXMuWUVTKSkKLQkJCQlzZXRSZXF1aXJlZCh0cnVlKTsKLQkJCWVsc2UgaWYgKG5ld1JlcXVpcmVkLmVxdWFsc0lnbm9yZUNhc2UoSlNQMTJUTEROYW1lcy5GQUxTRSkgfHwgbmV3UmVxdWlyZWQuZXF1YWxzSWdub3JlQ2FzZShKU1AxMlRMRE5hbWVzLk5PKSkKLQkJCQlzZXRSZXF1aXJlZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3UnRleHBydmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSdGV4cHJ2YWx1ZShTdHJpbmcgbmV3UnRleHBydmFsdWUpIHsKLQkJcnRleHBydmFsdWUgPSBuZXdSdGV4cHJ2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JLyoqCi0JICogc3VwcG9ydHMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBDTU5vZGUgc3VwcG9ydHMgYSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWUgPT0gbnVsbCB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoVExERG9jdW1lbnQuQ01fS0lORCkgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlNNQUxMX0lDT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCJcblx0ICIgKyBzdXBlci50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IG5hbWU6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXROb2RlTmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gQm9vbGVhbi50b1N0cmluZyhib29sZWFuKSBpcyBpbnRyb2R1Y2VkIGluIDEuNAotCQkvLyBidWZmZXIuYXBwZW5kKCJcblx0IHJlcXVpcmVkOiIgKwotCQkvLyBTdHJpbmdVdGlscy5lc2NhcGUoQm9vbGVhbi50b1N0cmluZyhpc1JlcXVpcmVkKCkpKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgcmVxdWlyZWQ6IiArIFN0cmluZ1V0aWxzLnRvU3RyaW5nKGlzUmVxdWlyZWQoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgcnRleHByOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0UnRleHBydmFsdWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCWlmIChnZXRJZCgpICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKCJcblx0IGlkOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0SWQoKSkpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01EYXRhVHlwZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTURhdGFUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzMyNWEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTURhdGFUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBDTURhdGFUeXBlSW1wbCBpbXBsZW1lbnRzIENNRGF0YVR5cGUgewotCi0JcHJvdGVjdGVkIFN0cmluZyBkYXRhVHlwZU5hbWU7Ci0KLQlwdWJsaWMgQ01EYXRhVHlwZUltcGwoU3RyaW5nIGRhdGFUeXBlTmFtZSkgewotCQl0aGlzLmRhdGFUeXBlTmFtZSA9IGRhdGFUeXBlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUeXBlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBzdWl0YWJsZSBkZWZhdWx0IHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBhbiBpbnN0YW5jZSBvZiB0aGUgZGF0YSB0eXBlIGlzIGNyZWF0ZWQuCi0JICogVGhpcyByZXR1cm5zIG51bGwgb2YgYSBzdWl0YWJsZSBkZWZhdWx0IGlzIG5vdCBhdmFpbGFibGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUluc3RhbmNlVmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGVOYW1lKCkgewotCQlyZXR1cm4gZGF0YVR5cGVOYW1lOwotCX0KLQotCS8qKgotCSAqIGdldFR5cGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0JICoKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RW51bWVyYXRlZFZhbHVlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nICAKLQkgKgotCSAqIFJldHVybnMgdGhlIGltcGxpZWQgdmFsdWUgb3IgbnVsbCBpZiBub25lIGV4aXN0cy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEltcGxpZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0SW1wbGllZFZhbHVlS2luZCBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIElNUExJRURfVkFMVUVfTk9ORSwgSU1QTElFRF9WQUxVRV9GSVhFRCwgSU1QTElFRF9WQUxVRV9ERUZBVUxULgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW1wbGllZFZhbHVlS2luZCgpIHsKLQkJcmV0dXJuIElNUExJRURfVkFMVUVfTk9ORTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gZGF0YVR5cGVOYW1lOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuREFUQV9UWVBFOwotCX0KLQotCS8qKgotCSAqIGdldFByb3BlcnR5IG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqCi0JICogUmV0dXJucyB0aGUgb2JqZWN0IHByb3BlcnR5IGRlc2NyaWJlZCBieSB0aGUgcHJvcGVydHlOYW1lCi0JICoKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogc3VwcG9ydHMgbWV0aG9kCi0JICogQHJldHVybiBib29sZWFuCi0JICoKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIENNTm9kZSBzdXBwb3J0cyBhIHNwZWNpZmllZCBwcm9wZXJ0eQotCSAqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRG9jdW1lbnRGYWN0b3J5VExELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01Eb2N1bWVudEZhY3RvcnlUTEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1YWNlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01Eb2N1bWVudEZhY3RvcnlUTEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDExVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTJUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AyMFRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMRERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERGdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERJbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExETGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExEVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMRFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMjBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWwuRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5GYWNldE1vZHVsZUNvcmVTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSUphclJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUTERSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnRGlyUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRhZ2xpYlJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklVUkxSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkphclV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuZmFjdG9yeS5DTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiBDTURvY3VtZW50QnVpbGRlciBmb3IgVGFnbGliIERlc2NyaXB0b3JzCi0gKiAKLSAqIFJldHVybnMgbmFtZXNwYWNlLWxlc3MgQ01Eb2N1bWVudHMgZm9yIGEgdGFnbGliIGRlc2NyaXB0b3IsIGxvYWRpbmcgaXQKLSAqIGRpcmVjdGx5IGZyb20gYSBmaWxlIG9yIGV4dHJhY3RlZCBmcm9tIGEgSkFSIGFyY2hpdmUuIENvbnRlbnQgTW9kZWwgb2JqZWN0cwotICogd2lsbCBpbXBsZW1lbnQgdGhlIFRMRENNRG9jdW1lbnQsIFRMREVsZW1lbnREZWNsYXJhdGlvbiwgYW5kCi0gKiBUTERBdHRyaWJ1dGVEZWNsYXJhdGlvbiBpbnRlcmZhY2VzIGZvciBleHRlbmRlZCBwcm9wZXJ0aWVzLgotICovCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudEZhY3RvcnlUTEQgaW1wbGVtZW50cyBDTURvY3VtZW50RmFjdG9yeSB7Ci0KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWcgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RsZGNtZG9jdW1lbnQvZmFjdG9yeSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBDTURvY3VtZW50RmFjdG9yeVRMRCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50RmFjdG9yeVRMRCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBOT1QgQVBJCi0JICogCi0JICogQHBhcmFtIGJhc2Vsb2NhdGlvbgotCSAqIEBwYXJhbSBpbnB1dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnQoU3RyaW5nIGJhc2Vsb2NhdGlvbiwgSW5wdXRTdHJlYW0gaW5wdXQpIHsKLQkJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBEb2N1bWVudFByb3ZpZGVyKCk7Ci0JCXByb3ZpZGVyLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQlwcm92aWRlci5zZXRSb290RWxlbWVudE5hbWUoSlNQMTFUTEROYW1lcy5UQUdMSUIpOwotCQlwcm92aWRlci5zZXRJbnB1dFN0cmVhbShpbnB1dCk7Ci0JCWlmIChiYXNlbG9jYXRpb24gIT0gbnVsbCkKLQkJCXByb3ZpZGVyLnNldEJhc2VSZWZlcmVuY2UoYmFzZWxvY2F0aW9uKTsKLQkJcmV0dXJuIGxvYWREb2N1bWVudChiYXNlbG9jYXRpb24sIHByb3ZpZGVyLmdldFJvb3RFbGVtZW50KCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIENNRG9jdW1lbnRJbXBsIGJ1aWxkQ01Eb2N1bWVudEZyb21Gb2xkZXIoSVBhdGggcGF0aCkgewotCQlpZiAoX2RlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInRhZ2RpciBsb2FkaW5nIGZvciAiICsgcGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBFQk5GIGlzIGxpc3RlZCBhdCAxLjMuMTAKLQkJQ01Eb2N1bWVudEltcGwgZG9jdW1lbnQgPSBuZXcgQ01Eb2N1bWVudEltcGwoKTsKLQkJZG9jdW1lbnQuc2V0QmFzZUxvY2F0aW9uKHBhdGgudG9TdHJpbmcoKSk7Ci0JCWRvY3VtZW50LnNldFRsaWJ2ZXJzaW9uKCIxLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlJRm9sZGVyIGZvbGRlciA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0Rm9sZGVyKHBhdGgpOwotCQlJUmVzb3VyY2VbXSB0YWdmaWxlczsKLQkJdHJ5IHsKLQkJCXRhZ2ZpbGVzID0gZm9sZGVyLm1lbWJlcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFnZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodGFnZmlsZXNbaV0uZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJCWlmICh0YWdmaWxlc1tpXS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJU3RyaW5nIGV4dGVuc2lvbiA9IHRhZ2ZpbGVzW2ldLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsICYmIChleHRlbnNpb24uZXF1YWxzKCJ0YWciKSB8fCBleHRlbnNpb24uZXF1YWxzKCJ0YWd4IikpKSB7Ci0JCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGNyZWF0ZUVsZW1lbnREZWNsYXJhdGlvbihkb2N1bWVudCwgKElGaWxlKSB0YWdmaWxlc1tpXSk7Ci0JCQkJCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJCQkJCWRvY3VtZW50LmZFbGVtZW50cy5zZXROYW1lZEl0ZW0oZWQuZ2V0Tm9kZU5hbWUoKSwgZWQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIE5PVCBBUEkKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIENNRG9jdW1lbnQgYnVpbGRDTURvY3VtZW50RnJvbUZpbGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCS8vIGxvYWQgdGhlIHRhZ2xpYiBkZXNjcmlwdG9yIGZpbGUKLQkJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBEb2N1bWVudFByb3ZpZGVyKCk7Ci0JCXByb3ZpZGVyLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQlwcm92aWRlci5zZXRCYXNlUmVmZXJlbmNlKGZpbGVOYW1lKTsKLQkJcHJvdmlkZXIuc2V0Um9vdEVsZW1lbnROYW1lKEpTUDExVExETmFtZXMuVEFHTElCKTsKLQkJcHJvdmlkZXIuc2V0RmlsZU5hbWUoZmlsZU5hbWUpOwotCQlOb2RlIHJvb3RFbGVtZW50ID0gcHJvdmlkZXIuZ2V0Um9vdEVsZW1lbnQoKTsKLQkJcmV0dXJuIGxvYWREb2N1bWVudChmaWxlTmFtZSwgcm9vdEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkcyBhIENNRG9jdW1lbnQgYXNzdW1pbmcgdGhlIEpTUCB2MS4xIGRlZmF1bHQgcGF0aAotCSAqIAotCSAqIEBwYXJhbSBqYXJGaWxlTmFtZSAtCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29udGFpbmluZyBKQVIgZmlsZQotCSAqLwotCXByb3RlY3RlZCBDTURvY3VtZW50IGJ1aWxkQ01Eb2N1bWVudEZyb21KYXIoU3RyaW5nIGphckZpbGVOYW1lKSB7Ci0JCS8vIGxvYWQgdGhlIHRhZ2xpYiBkZXNjcmlwdG9yIGZpbGUKLQkJcmV0dXJuIGJ1aWxkQ01Eb2N1bWVudEZyb21KYXIoamFyRmlsZU5hbWUsIEphclV0aWxpdGllcy5KU1AxMV9UQUdMSUIpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkcyBhIENNRG9jdW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gamFyRmlsZU5hbWUgLQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5pbmcgSkFSIGZpbGUKLQkgKiBAcGFyYW0gY29udGVudEZpbGVOYW1lIC0KLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHdpdGhpbiB0aGUgSkFSIGZvciBhIHZhbGlkIHRhZ2xpYiBkZXNjcmlwdG9yCi0JICovCi0JcHJvdGVjdGVkIENNRG9jdW1lbnQgYnVpbGRDTURvY3VtZW50RnJvbUphcihTdHJpbmcgamFyRmlsZU5hbWUsIFN0cmluZyBjb250ZW50RmlsZU5hbWUpIHsKLQkJLy8gbG9hZCB0aGUgdGFnbGliIGRlc2NyaXB0b3IgZmlsZQotCQlEb2N1bWVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IERvY3VtZW50UHJvdmlkZXIoKTsKLQkJcHJvdmlkZXIuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0JCXByb3ZpZGVyLnNldEJhc2VSZWZlcmVuY2UoamFyRmlsZU5hbWUpOwotCQlwcm92aWRlci5zZXRSb290RWxlbWVudE5hbWUoSlNQMTFUTEROYW1lcy5UQUdMSUIpOwotCQlwcm92aWRlci5zZXRKYXJGaWxlTmFtZShqYXJGaWxlTmFtZSk7Ci0JCXByb3ZpZGVyLnNldEZpbGVOYW1lKGNvbnRlbnRGaWxlTmFtZSk7Ci0JCUNNRG9jdW1lbnQgZG9jdW1lbnQgPSBsb2FkRG9jdW1lbnQoImphcjpmaWxlOi8vIiArIGphckZpbGVOYW1lICsgIiEiICsgY29udGVudEZpbGVOYW1lLCBwcm92aWRlci5nZXRSb290RWxlbWVudCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCS8vIFRPRE86IEFkZCB0aGUgdGFncyBkZWNsYXJlZCBpbiBNRVRBLUlORi90YWdzLCBzZWUgSlNQIDIuMCBzZWN0aW9uCi0JCS8vIDguNC4xCi0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbihDTURvY3VtZW50IGRvY3VtZW50LCBOb2RlIGF0dHJOb2RlKSB7Ci0JCUNNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsIGF0dHIgPSBuZXcgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwoZG9jdW1lbnQpOwotCi0JCU5vZGUgY2hpbGQgPSBhdHRyTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCWlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMVRMRE5hbWVzLk5BTUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlhdHRyLnNldE5vZGVOYW1lKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWF0dHIuc2V0RGVzY3JpcHRpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMVRMRE5hbWVzLklEKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJYXR0ci5zZXRJZChnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDExVExETmFtZXMuUkVRVUlSRUQpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlhdHRyLnNldFJlcXVpcmVkU3RyaW5nKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTFUTEROYW1lcy5SVEVYUFJWQUxVRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWF0dHIuc2V0UnRleHBydmFsdWUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AyMFRMRE5hbWVzLkZSQUdNRU5UKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJYXR0ci5zZXRGcmFnbWVudChCb29sZWFuLnZhbHVlT2YoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZHMgYSBDTURvY3VtZW50IGZyb20gYSB0YWdsaWIgZGVzY3JpcHRvcgotCSAqIAotCSAqIEBwYXJhbSB1cmkgLQotCSAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIG9mIGEgdmFsaWQgdGFnbGliIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBjcmVhdGVDTURvY3VtZW50KFN0cmluZyB1cmkpIHsKLQkJQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQlVUkwgdXJsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVybCA9IG5ldyBVUkwodXJpKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZUNNRG9jdW1lbnRGcm9tRmlsZSh1cmkpOwotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCAmJiB1cmwgIT0gbnVsbCkgewotCQkJaWYgKHVybC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQgPSBjcmVhdGVDTURvY3VtZW50RnJvbUZpbGUodXJsLmdldEZpbGUoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKioKLQkJCQkgKiBTa2lwIGFueXRoaW5nIGVsc2Ugc2luY2UgdHJ5aW5nIHRvIGxvYWQgYSBUTEQgZnJvbSBhIHJlbW90ZQotCQkJCSAqIGxvY2F0aW9uIGhhcyB1bnByZWRpY3RhYmxlIHBlcmZvcm1hbmNlIGltcGFjdC4KLQkJCQkgKi8KLQkJCX0KLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBuZXcgQ01Eb2N1bWVudEltcGwoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBDTURvY3VtZW50IGNyZWF0ZUNNRG9jdW1lbnRGcm9tRmlsZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQlpZiAoZmlsZU5hbWUuZW5kc1dpdGgoIi5qYXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQgPSBidWlsZENNRG9jdW1lbnRGcm9tSmFyKGZpbGVOYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCQlyZXN1bHQgPSBidWlsZENNRG9jdW1lbnRGcm9tRGlyZWN0b3J5KGZpbGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0ID0gYnVpbGRDTURvY3VtZW50RnJvbUZpbGUoZmlsZU5hbWUpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmVzdWx0ID0gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnRGcm9tRGlyZWN0b3J5KEZpbGUgZmlsZSkgewotCQlJRmlsZVtdIGZvdW5kRmlsZXNGb3JMb2NhdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24obmV3IFBhdGgoZmlsZS5nZXRQYXRoKCkpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmb3VuZEZpbGVzRm9yTG9jYXRpb24ubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmb3VuZEZpbGVzRm9yTG9jYXRpb25baV0uaXNBY2Nlc3NpYmxlKCkgJiYgZm91bmRGaWxlc0ZvckxvY2F0aW9uW2ldLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7Ci0JCQkJcmV0dXJuIGJ1aWxkQ01Eb2N1bWVudEZyb21Gb2xkZXIoZm91bmRGaWxlc0ZvckxvY2F0aW9uW2ldLmdldEZ1bGxQYXRoKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVFbGVtZW50RGVjbGFyYXRpb24oQ01Eb2N1bWVudEltcGwgZG9jdW1lbnQsIEVsZW1lbnQgdGFnRmlsZU5vZGUsIFN0cmluZyBwYXRoKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uSW1wbCBlZCA9IG5ldyBDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwoZG9jdW1lbnQpOwotCQkvKgotCQkgKiBQcmVsb2FkIHdpdGggaW5mb3JtYXRpb24gZnJvbSB0aGUgdGFnIGZpbGUtLWl0IGNhbiBiZSBvdmVyd3JpdHRlbgotCQkgKiBieSB0aGUgdmFsdWVzIGZyb20gdGhlIFRMRAotCQkgKi8KLQkJSVBhdGggdGFnUGF0aCA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQucmVzb2x2ZShuZXcgUGF0aChkb2N1bWVudC5nZXRCYXNlTG9jYXRpb24oKSksIHBhdGgpOwotCQlpZiAodGFnUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCUlGaWxlIHRhZ0ZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUodGFnUGF0aCk7Ci0JCQlpZiAodGFnRmlsZS5pc0FjY2Vzc2libGUoKSkgewotCQkJCWVkLnNldFBhdGgodGFnRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJCWlmICh0YWdQYXRoLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoInRhZyIpKSB7Ci0JCQkJCWxvYWRUYWdGaWxlKGVkLCB0YWdGaWxlLCB0cnVlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodGFnUGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKCJ0YWd4IikpIHsKLQkJCQkJbG9hZFRhZ1hGaWxlKGVkLCB0YWdGaWxlLCB0cnVlKTsKLQkJCQl9Ci0KLQkJCQlpZiAodGFnRmlsZS5nZXRMb2NhdGlvbigpICE9IG51bGwgJiYgZWQuZ2V0U21hbGxJY29uKCkgIT0gbnVsbCkgewotCQkJCQllZC5zZXRTbWFsbEljb25VUkwoVVJJSGVscGVyLm5vcm1hbGl6ZShlZC5nZXRTbWFsbEljb24oKSwgImZpbGU6IiArIHRhZ0ZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpLCB0YWdGaWxlLmdldExvY2F0aW9uKCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBsb2FkIGluZm9ybWF0aW9uIGRlY2xhcmVkIHdpdGhpbiB0aGUgLnRsZAotCQlOb2RlIGNoaWxkID0gdGFnRmlsZU5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlTdHJpbmcgbm9kZU5hbWUgPSBjaGlsZC5nZXROb2RlTmFtZSgpOwotCQkJCWlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldERlc2NyaXB0aW9uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuRElTUExBWV9OQU1FKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0RGlzcGxheU5hbWUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5FWEFNUExFKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0RXhhbXBsZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLklDT04pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllZC5zZXRTbWFsbEljb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5OQU1FKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0Tm9kZU5hbWUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5QQVRIKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0UGF0aChnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLlRBR19FWFRFTlNJT04pKSB7Ci0JCQkJCWVkLmdldEV4dGVuc2lvbnMoKS5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQkKLQkJcmV0dXJuIGVkOwotCX0KLQotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVFbGVtZW50RGVjbGFyYXRpb24oQ01Eb2N1bWVudCBkb2N1bWVudCwgTm9kZSB0YWdOb2RlKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uSW1wbCBlZCA9IG5ldyBDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwoZG9jdW1lbnQpOwotCi0JCU5vZGUgY2hpbGQgPSB0YWdOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJLy8gdGFnIGluZm9ybWF0aW9uCi0JCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuTkFNRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldE5vZGVOYW1lKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLlRBR0NMQVNTKSB8fCBub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5UQUdfQ0xBU1MpKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0VGFnY2xhc3MoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmICgobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuVEVJQ0xBU1MpIHx8IG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlRFSV9DTEFTUykpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllZC5zZXRUZWljbGFzcyhnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5CT0RZQ09OVEVOVCkgfHwgbm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuQk9EWV9DT05URU5UKSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCVN0cmluZyBib2R5Y29udGVudCA9IGdldENvbnRhaW5lZFRleHQoY2hpbGQpOwotCQkJCQkvLyBBcHBhcmVudGx5LCBBcGFjaGUgVG9tY2F0IGlzIG5vdCBjYXNlIHNlbnNpdGl2ZSBhYm91dAotCQkJCQkvLyB0aGVzZSB2YWx1ZXMKLQkJCQkJaWYgKGJvZHljb250ZW50LmVxdWFsc0lnbm9yZUNhc2UoSlNQMTFUTEROYW1lcy5DT05URU5UX0pTUCkpCi0JCQkJCQllZC5zZXRCb2R5Y29udGVudChKU1AxMVRMRE5hbWVzLkNPTlRFTlRfSlNQKTsKLQkJCQkJZWxzZSBpZiAoYm9keWNvbnRlbnQuZXF1YWxzSWdub3JlQ2FzZShKU1AxMVRMRE5hbWVzLkNPTlRFTlRfVEFHREVQRU5ERU5UKSkKLQkJCQkJCWVkLnNldEJvZHljb250ZW50KEpTUDExVExETmFtZXMuQ09OVEVOVF9UQUdERVBFTkRFTlQpOwotCQkJCQllbHNlIGlmIChib2R5Y29udGVudC5lcXVhbHNJZ25vcmVDYXNlKEpTUDExVExETmFtZXMuQ09OVEVOVF9FTVBUWSkpCi0JCQkJCQllZC5zZXRCb2R5Y29udGVudChKU1AxMVRMRE5hbWVzLkNPTlRFTlRfRU1QVFkpOwotCQkJCQllbHNlIGlmIChib2R5Y29udGVudC5lcXVhbHNJZ25vcmVDYXNlKEpTUDIwVExETmFtZXMuQ09OVEVOVF9TQ1JJUFRMRVNTKSkKLQkJCQkJCWVkLnNldEJvZHljb250ZW50KEpTUDIwVExETmFtZXMuQ09OVEVOVF9TQ1JJUFRMRVNTKTsKLQkJCQl9Ci0JCQkJLy8gaW5mbyAoMS4xIG9ubHkpIG9yIGRlc2NyaXB0aW9uICgxLjIgb25seSkKLQkJCQllbHNlIGlmICgobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuSU5GTykgfHwgbm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0RGVzY3JpcHRpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQkvLyBhdHRyaWJ1dGVzCi0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuQVRUUklCVVRFKSkgewotCQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbihkb2N1bWVudCwgY2hpbGQpOwotCQkJCQllZC5mQXR0cmlidXRlcy5zZXROYW1lZEl0ZW0oYXR0ci5nZXRBdHRyTmFtZSgpLCBhdHRyKTsKLQkJCQl9Ci0JCQkJLy8gdmFyaWFibGVzCi0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFSSUFCTEUpKSB7Ci0JCQkJCWVkLmdldFZhcmlhYmxlcygpLmFkZChjcmVhdGVWYXJpYWJsZShjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0TGFyZ2VJY29uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuU01BTExfSUNPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldFNtYWxsSWNvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLlRBR19FWFRFTlNJT04pICYmIGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJZWQuZ2V0RXh0ZW5zaW9ucygpLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBlZDsKLQl9Ci0KLQlwcml2YXRlIENNRWxlbWVudERlY2xhcmF0aW9uIGNyZWF0ZUVsZW1lbnREZWNsYXJhdGlvbihDTURvY3VtZW50IGRvY3VtZW50LCBJRmlsZSB0YWdGaWxlKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uSW1wbCBlZCA9IG5ldyBDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwoZG9jdW1lbnQpOwotCQkvLyBpbiB0YWcgZmlsZXMsIHRoZSBkZWZhdWx0IGJvZHkgY29udGVudCBpcyBzY3JpcHRsZXNzIGluc3RlYWQgb2YgSlNQCi0JCWVkLnNldEJvZHljb250ZW50KEpTUDIwVExETmFtZXMuQ09OVEVOVF9TQ1JJUFRMRVNTKTsKLQkJU3RyaW5nIHNob3J0RmlsZW5hbWUgPSB0YWdGaWxlLmdldE5hbWUoKTsKLQkJU3RyaW5nIGZpbGVFeHRlbnNpb24gPSB0YWdGaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJaWYgKGZpbGVFeHRlbnNpb24gIT0gbnVsbCAmJiBmaWxlRXh0ZW5zaW9uLmxlbmd0aCgpID4gMCkgewotCQkJc2hvcnRGaWxlbmFtZSA9IHNob3J0RmlsZW5hbWUuc3Vic3RyaW5nKDAsIHNob3J0RmlsZW5hbWUubGVuZ3RoKCkgLSBmaWxlRXh0ZW5zaW9uLmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJZWQuc2V0Tm9kZU5hbWUoc2hvcnRGaWxlbmFtZSk7Ci0JCWVkLnNldFBhdGgodGFnRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQlpZiAoZmlsZUV4dGVuc2lvbi5lcXVhbHMoInRhZyIpKSB7Ci0JCQlsb2FkVGFnRmlsZShlZCwgdGFnRmlsZSwgdHJ1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAoZmlsZUV4dGVuc2lvbi5lcXVhbHMoInRhZ3giKSkgewotCQkJbG9hZFRhZ1hGaWxlKGVkLCB0YWdGaWxlLCB0cnVlKTsKLQkJfQotCi0JCWlmICh0YWdGaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCAmJiBlZC5nZXRTbWFsbEljb24oKSAhPSBudWxsKSB7Ci0JCQllZC5zZXRTbWFsbEljb25VUkwoVVJJSGVscGVyLm5vcm1hbGl6ZShlZC5nZXRTbWFsbEljb24oKSwgImZpbGU6IiArIHRhZ0ZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpLCB0YWdGaWxlLmdldExvY2F0aW9uKCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCkpKTsKLQkJfQotCQlyZXR1cm4gZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIFRMREZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uKENNRG9jdW1lbnQgZG9jdW1lbnQsIE5vZGUgZnVuY3Rpb25Ob2RlKSB7Ci0JCVRMREZ1bmN0aW9uSW1wbCBmdW5jdGlvbiA9IG5ldyBUTERGdW5jdGlvbkltcGwoZG9jdW1lbnQpOwotCQlib29sZWFuIGhhc05hbWUgPSBmYWxzZTsKLQotCQlOb2RlIGNoaWxkID0gZnVuY3Rpb25Ob2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJLy8gdGFnIGluZm9ybWF0aW9uCi0JCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlmdW5jdGlvbi5zZXREZXNjcmlwdGlvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRJU1BMQVlfTkFNRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWZ1bmN0aW9uLnNldE5hbWUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5FWEFNUExFKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZnVuY3Rpb24uc2V0RXhhbXBsZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLkZVTkNUSU9OX0NMQVNTKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZnVuY3Rpb24uc2V0Q2xhc3NOYW1lKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuRlVOQ1RJT05fRVhURU5TSU9OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZnVuY3Rpb24uZ2V0RXh0ZW5zaW9ucygpLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLkZVTkNUSU9OX1NJR05BVFVSRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWZ1bmN0aW9uLnNldFNpZ25hdHVyZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLklDT04pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlmdW5jdGlvbi5zZXRJY29uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuTkFNRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWZ1bmN0aW9uLnNldE5hbWUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCQloYXNOYW1lID0gZnVuY3Rpb24uZ2V0TmFtZSgpLnRyaW0oKS5sZW5ndGgoKSA+IDA7Ci0JCQkJfQotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCWlmIChoYXNOYW1lKSB7Ci0JCQlyZXR1cm4gZnVuY3Rpb247Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFRMREluaXRQYXJhbSBjcmVhdGVJbml0UGFyYW0oTm9kZSBpbml0UGFyYW1Ob2RlKSB7Ci0JCVRMREluaXRQYXJhbUltcGwgaW5pdFBhcmFtID0gbmV3IFRMREluaXRQYXJhbUltcGwoKTsKLQkJTm9kZSBjaGlsZCA9IGluaXRQYXJhbU5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlTdHJpbmcgbm9kZU5hbWUgPSBjaGlsZC5nZXROb2RlTmFtZSgpOwotCQkJCWlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5WQUxJREFUT1JfUEFSQU1fTkFNRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWluaXRQYXJhbS5zZXROYW1lKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFMSURBVE9SX1BBUkFNX1ZBTFVFKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJaW5pdFBhcmFtLnNldFZhbHVlKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlpbml0UGFyYW0uc2V0RGVzY3JpcHRpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCX0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gaW5pdFBhcmFtOwotCX0KLQotCXByb3RlY3RlZCBUTERMaXN0ZW5lciBjcmVhdGVMaXN0ZW5lcihOb2RlIGxpc3RlbmVyTm9kZSkgewotCQlUTERMaXN0ZW5lckltcGwgbGlzdGVuZXIgPSBuZXcgVExETGlzdGVuZXJJbXBsKCk7Ci0JCU5vZGUgY2hpbGQgPSBsaXN0ZW5lck5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlTdHJpbmcgbm9kZU5hbWUgPSBjaGlsZC5nZXROb2RlTmFtZSgpOwotCQkJCWlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5MSVNURU5FUl9DTEFTUykgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWxpc3RlbmVyLnNldExpc3RlbmVyQ2xhc3MoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCX0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gbGlzdGVuZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFRMRFZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoTm9kZSB2YWxpZGF0b3JOb2RlKSB7Ci0JCVRMRFZhbGlkYXRvckltcGwgdmFsaWRhdG9yID0gbmV3IFRMRFZhbGlkYXRvckltcGwoKTsKLQkJTm9kZSBjaGlsZCA9IHZhbGlkYXRvck5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlTdHJpbmcgbm9kZU5hbWUgPSBjaGlsZC5nZXROb2RlTmFtZSgpOwotCQkJCWlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5WQUxJREFUT1JfQ0xBU1MpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQl2YWxpZGF0b3Iuc2V0VmFsaWRhdG9yQ2xhc3MoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5WQUxJREFUT1JfSU5JVF9QQVJBTSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCXZhbGlkYXRvci5nZXRJbml0UGFyYW1zKCkuYWRkKGNyZWF0ZUluaXRQYXJhbShjaGlsZCkpOwotCQkJCX0KLQkJCX0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLQotCXByb3RlY3RlZCBUTERWYXJpYWJsZSBjcmVhdGVWYXJpYWJsZShOb2RlIHZhcmlhYmxlTm9kZSkgewotCQlUTERWYXJpYWJsZUltcGwgdmFyaWFibGUgPSBuZXcgVExEVmFyaWFibGVJbXBsKCk7Ci0JCU5vZGUgY2hpbGQgPSB2YXJpYWJsZU5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlTdHJpbmcgbm9kZU5hbWUgPSBjaGlsZC5nZXROb2RlTmFtZSgpOwotCQkJCWlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9DTEFTUykgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCXZhcmlhYmxlLnNldFZhcmlhYmxlQ2xhc3MoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9ERUNMQVJFKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJdmFyaWFibGUuc2V0RGVjbGFyZVN0cmluZyhnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlZBUklBQkxFX05BTUVfRlJPTV9BVFRSSUJVVEUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQl2YXJpYWJsZS5zZXROYW1lRnJvbUF0dHJpYnV0ZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlZBUklBQkxFX05BTUVfR0lWRU4pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQl2YXJpYWJsZS5zZXROYW1lR2l2ZW4oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9TQ09QRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCXZhcmlhYmxlLnNldFNjb3BlKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQl2YXJpYWJsZS5zZXREZXNjcmlwdGlvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiB2YXJpYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRhaW5lZFRleHQoTm9kZSBwYXJlbnQpIHsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAoY2hpbGRyZW4uZ2V0TGVuZ3RoKCkgPT0gMSkgewotCQkJcmV0dXJuIGNoaWxkcmVuLml0ZW0oMCkuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFKSB7Ci0JCQkJU3RyaW5nIHJlZmVyZW5jZSA9ICgoRW50aXR5UmVmZXJlbmNlKSBjaGlsZCkuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJaWYgKHJlZmVyZW5jZSA9PSBudWxsICYmIGNoaWxkLmdldE5vZGVOYW1lKCkgIT0gbnVsbCkgewotCQkJCQlyZWZlcmVuY2UgPSAiJiIgKyBjaGlsZC5nZXROb2RlTmFtZSgpICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQkJCXMuYXBwZW5kKHJlZmVyZW5jZS50cmltKCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXMuYXBwZW5kKGNoaWxkLmdldE5vZGVWYWx1ZSgpLnRyaW0oKSk7Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHMudG9TdHJpbmcoKS50cmltKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNCdWlsZGVyRm9yR3JhbW1hcihTdHJpbmcgZ3JhbW1hckZpbGVOYW1lKSB7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGdyYW1tYXJGaWxlTmFtZS50b0xvd2VyQ2FzZSgpOwotCQlyZXR1cm4gZmlsZU5hbWUuZW5kc1dpdGgoIi50bGQiKSB8fCBmaWxlTmFtZS5lbmRzV2l0aCgiLmphciIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgQ01Eb2N1bWVudCBsb2FkRG9jdW1lbnQoU3RyaW5nIGJhc2VMb2NhdGlvbiwgTm9kZSB0YWdsaWIpIHsKLQkJTm9kZSByb290ID0gdGFnbGliOwotCi0JCS8vIGNyZWF0ZSB0aGUgQ01Eb2N1bWVudAotCQlDTURvY3VtZW50SW1wbCBkb2N1bWVudCA9IG5ldyBDTURvY3VtZW50SW1wbCgpOwotCQlkb2N1bWVudC5zZXRCYXNlTG9jYXRpb24oYmFzZUxvY2F0aW9uKTsKLQotCQlpZiAocm9vdCA9PSBudWxsKSB7Ci0JCQlpZiAoX2RlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJudWxsIFwidGFnbGliXCIgZWxlbWVudCBmb3IgVExEICIgKyBiYXNlTG9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JCX0KLQotCQkvLyBwb3B1bGF0ZSB0aGUgQ01Eb2N1bWVudAotCQlOb2RlIGNoaWxkID0gcm9vdC5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyBub2RlTmFtZSA9IGNoaWxkLmdldE5vZGVOYW1lKCk7Ci0JCQlpZihub2RlTmFtZS5pbmRleE9mKCc6JykgPiAwKSB7Ci0JCQkJbm9kZU5hbWUgPSBub2RlTmFtZS5zdWJzdHJpbmcobm9kZU5hbWUuaW5kZXhPZignOicpKTsKLQkJCX0KLQkJCS8vIHRhZwotCQkJaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLlRBRykpIHsKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGNyZWF0ZUVsZW1lbnREZWNsYXJhdGlvbihkb2N1bWVudCwgY2hpbGQpOwotCQkJCWlmIChlZCAhPSBudWxsKSB7Ci0JCQkJCWRvY3VtZW50LmZFbGVtZW50cy5zZXROYW1lZEl0ZW0oZWQuZ2V0Tm9kZU5hbWUoKSwgZWQpOwotCQkJCX0KLQkJCX0KLQkJCS8vIHRhZy1maWxlCi0JCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5UQUdfRklMRSkgJiYgY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQlFbGVtZW50IHRhZ0ZpbGVFbGVtZW50ID0gKEVsZW1lbnQpIGNoaWxkOwotCQkJCU5vZGUgcGF0aCA9IHRhZ0ZpbGVFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCQl3aGlsZSAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCWlmIChwYXRoLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgKEpTUDIwVExETmFtZXMuUEFUSC5lcXVhbHMocGF0aC5nZXROb2RlTmFtZSgpKSB8fCBKU1AyMFRMRE5hbWVzLlBBVEguZXF1YWxzKHBhdGguZ2V0TG9jYWxOYW1lKCkpKSkgewotCQkJCQkJU3RyaW5nIHBhdGhWYWx1ZSA9IGdldENvbnRhaW5lZFRleHQocGF0aCk7Ci0JCQkJCQlpZiAocGF0aFZhbHVlICE9IG51bGwgJiYgcGF0aFZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uSW1wbCBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwpIGNyZWF0ZUVsZW1lbnREZWNsYXJhdGlvbihkb2N1bWVudCwgdGFnRmlsZUVsZW1lbnQsIHBhdGhWYWx1ZSk7Ci0JCQkJCQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCQkJCQkJZG9jdW1lbnQuZkVsZW1lbnRzLnNldE5hbWVkSXRlbShlZC5nZXROb2RlTmFtZSgpLCBlZCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXBhdGggPSBwYXRoLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfQotCQkJfQotCQkJLy8gb3RoZXIgb25lLW9mLWEta2luZCBjaGlsZHJlbgotCQkJLy8gSlNQIHZlcnNpb24KLQkJCWVsc2UgaWYgKChub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5KU1BWRVJTSU9OKSB8fCBub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5KU1BfVkVSU0lPTikpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCWRvY3VtZW50LnNldEpzcHZlcnNpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJfQotCQkJLy8gdGFnIGxpYnJhcnkgdmVyc2lvbgotCQkJZWxzZSBpZiAoKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLlRMSUJWRVJTSU9OKSB8fCBub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5UTElCX1ZFUlNJT04pKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQlkb2N1bWVudC5zZXRUbGlidmVyc2lvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQl9Ci0JCQkvLyBzaG9ydCBuYW1lCi0JCQllbHNlIGlmICgobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuU0hPUlROQU1FKSB8fCBub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5TSE9SVF9OQU1FKSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJZG9jdW1lbnQuc2V0U2hvcnRuYW1lKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCX0KLQkJCS8vIFVSSS9VUk4KLQkJCWVsc2UgaWYgKChub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5VUkkpIHx8IG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLlVSTikpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJZG9jdW1lbnQuc2V0VXJpKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCX0KLQkJCS8vIGluZm8KLQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLklORk8pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCWRvY3VtZW50LnNldEluZm8oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJfQotCQkJLy8gTmV3IEpTUCAxLjIKLQkJCS8vIGRlc2NyaXB0aW9uCi0JCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikpIHsKLQkJCQlkb2N1bWVudC5zZXREZXNjcmlwdGlvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQl9Ci0JCQkvLyBkaXNwbGF5IG5hbWUKLQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRJU1BMQVlfTkFNRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJZG9jdW1lbnQuc2V0RGlzcGxheU5hbWUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJfQotCQkJLy8gbGFyZ2UgaWNvbgotCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJZG9jdW1lbnQuc2V0TGFyZ2VJY29uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCX0KLQkJCS8vIHNtYWxsIGljb24KLQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlNNQUxMX0lDT04pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCWRvY3VtZW50LnNldFNtYWxsSWNvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQl9Ci0JCQkvLyB2YWxpZGF0b3IKLQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlZBTElEQVRPUikpIHsKLQkJCQlkb2N1bWVudC5zZXRWYWxpZGF0b3IoY3JlYXRlVmFsaWRhdG9yKGNoaWxkKSk7Ci0JCQl9Ci0JCQkvLyBsaXN0ZW5lcgotCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuTElTVEVORVIpKSB7Ci0JCQkJZG9jdW1lbnQuZ2V0TGlzdGVuZXJzKCkuYWRkKGNyZWF0ZUxpc3RlbmVyKGNoaWxkKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5GVU5DVElPTikpIHsKLQkJCQlUTERGdW5jdGlvbiBmdW5jdGlvbiA9IGNyZWF0ZUZ1bmN0aW9uKGRvY3VtZW50LCBjaGlsZCk7Ci0JCQkJaWYgKGZ1bmN0aW9uICE9IG51bGwpIHsKLQkJCQkJZG9jdW1lbnQuZ2V0RnVuY3Rpb25zKCkuYWRkKGZ1bmN0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5UQUdMSUJfRVhURU5TSU9OKSkgewotCQkJCWRvY3VtZW50LmdldEV4dGVuc2lvbnMoKS5hZGQoY2hpbGQpOwotCQkJfQotCi0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkVGFnWEZpbGUoZmluYWwgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsIGVkLCBJRmlsZSB0YWd4RmlsZSwgYm9vbGVhbiBhbGxvd0luY2x1ZGVzKSB7Ci0JCWVkLnNldFBhdGgodGFneEZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJZWQuc2V0VGFnU291cmNlKFRMREVsZW1lbnREZWNsYXJhdGlvbi5TT1VSQ0VfVEFHX0ZJTEUpOwotCQl0cnkgewotCQkJU0FYUGFyc2VyIHBhcnNlciA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdTQVhQYXJzZXIoKTsKLQkJCUlucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHRhZ3hGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQlJbnB1dFN0cmVhbSBpbnB1dCA9IHRhZ3hGaWxlLmdldENvbnRlbnRzKGZhbHNlKTsKLQkJCWlucHV0U291cmNlLnNldEJ5dGVTdHJlYW0oaW5wdXQpOwotCQkJcGFyc2VyLnBhcnNlKGlucHV0U291cmNlLCBuZXcgRGVmYXVsdEhhbmRsZXIoKSB7Ci0JCQkJcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCQlJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZTIgPSBuZXcgSW5wdXRTb3VyY2Uoc3lzdGVtSWQpOwotCQkJCQlpbnB1dFNvdXJjZTIuc2V0Qnl0ZVN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pKTsKLQkJCQkJcmV0dXJuIGlucHV0U291cmNlMjsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCQlzdXBlci5zdGFydEVsZW1lbnQodXJpLCBsb2NhbE5hbWUsIHFOYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQkJaWYgKHFOYW1lLmVxdWFscyhKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVEFHKSkgewotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5ESVNQTEFZX05BTUUpID49IDApCi0JCQkJCQkJZWQuc2V0RGlzcGxheU5hbWUoYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AxMlRMRE5hbWVzLkRJU1BMQVlfTkFNRSkpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5CT0RZX0NPTlRFTlQpID49IDApCi0JCQkJCQkJZWQuc2V0Qm9keWNvbnRlbnQoYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AxMlRMRE5hbWVzLkJPRFlfQ09OVEVOVCkpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMjBUTEROYW1lcy5EWU5BTUlDX0FUVFJJQlVURVMpID49IDApCi0JCQkJCQkJZWQuc2V0RHluYW1pY0F0dHJpYnV0ZXMoYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AyMFRMRE5hbWVzLkRZTkFNSUNfQVRUUklCVVRFUykpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OKSA+PSAwKQotCQkJCQkJCWVkLnNldFNtYWxsSWNvbihhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDEyVExETmFtZXMuU01BTExfSUNPTikpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OKSA+PSAwKQotCQkJCQkJCWVkLnNldExhcmdlSWNvbihhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTikpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikgPj0gMCkKLQkJCQkJCQllZC5zZXREZXNjcmlwdGlvbihhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzLmdldEluZGV4KEpTUDIwVExETmFtZXMuRVhBTVBMRSkgPj0gMCkKLQkJCQkJCQllZC5zZXRFeGFtcGxlKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSlNQMjBUTEROYW1lcy5FWEFNUExFKSk7Ci0JCQkJCQlpZiAoYXR0cmlidXRlcy5nZXRJbmRleChKU1AyMFRMRE5hbWVzLlNDUklQVElOR19MQU5HVUFHRSkgPj0gMCkKLQkJCQkJCQllZC5zZXRTY3JpcHRpbmdMYW5ndWFnZShhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDIwVExETmFtZXMuU0NSSVBUSU5HX0xBTkdVQUdFKSk7Ci0JCQkJCQlpZiAoYXR0cmlidXRlcy5nZXRJbmRleChKU1AyMFRMRE5hbWVzLklNUE9SVCkgPj0gMCkKLQkJCQkJCQllZC5zZXRJbXBvcnQoYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AyMFRMRE5hbWVzLklNUE9SVCkpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMjBUTEROYW1lcy5QQUdFX0VOQ09ESU5HKSA+PSAwKQotCQkJCQkJCWVkLnNldFBhZ2VFbmNvZGluZyhhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDIwVExETmFtZXMuUEFHRV9FTkNPRElORykpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMjBUTEROYW1lcy5JU19FTF9JR05PUkVEKSA+PSAwKQotCQkJCQkJCWVkLnNldElzRUxJZ25vcmVkKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSlNQMjBUTEROYW1lcy5JU19FTF9JR05PUkVEKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocU5hbWUuZXF1YWxzKEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9BVFRSSUJVVEUpKSB7Ci0JCQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCBhdHRyaWJ1dGUgPSBuZXcgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwoZWQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCQkJCVN0cmluZyBuYW1lVmFsdWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDEyVExETmFtZXMuTkFNRSk7Ci0JCQkJCQlhdHRyaWJ1dGUuc2V0Tm9kZU5hbWUobmFtZVZhbHVlKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzLmdldEluZGV4KEpTUDIwVExETmFtZXMuRlJBR01FTlQpID49IDApCi0JCQkJCQkJYXR0cmlidXRlLnNldEZyYWdtZW50KEJvb2xlYW4udmFsdWVPZihhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDIwVExETmFtZXMuRlJBR01FTlQpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJCQlpZiAoYXR0cmlidXRlcy5nZXRJbmRleChKU1AxMlRMRE5hbWVzLlJURVhQUlZBTFVFKSA+PSAwKQotCQkJCQkJCWF0dHJpYnV0ZS5zZXRSdGV4cHJ2YWx1ZShhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDEyVExETmFtZXMuUlRFWFBSVkFMVUUpKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzLmdldEluZGV4KEpTUDIwVExETmFtZXMuVFlQRSkgPj0gMCkKLQkJCQkJCQlhdHRyaWJ1dGUuc2V0VHlwZShhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDIwVExETmFtZXMuVFlQRSkpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikgPj0gMCkKLQkJCQkJCQlhdHRyaWJ1dGUuc2V0RGVzY3JpcHRpb24oYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSk7Ci0JCQkJCQlpZiAoYXR0cmlidXRlcy5nZXRJbmRleChKU1AxMlRMRE5hbWVzLlJFUVVJUkVEKSA+PSAwKQotCQkJCQkJCWF0dHJpYnV0ZS5zZXRSZXF1aXJlZFN0cmluZyhhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDEyVExETmFtZXMuUkVRVUlSRUQpKTsKLQkJCQkJCWlmIChuYW1lVmFsdWUgIT0gbnVsbCAmJiBuYW1lVmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJZWQuZkF0dHJpYnV0ZXMuc2V0TmFtZWRJdGVtKG5hbWVWYWx1ZSwgYXR0cmlidXRlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChxTmFtZS5lcXVhbHMoSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1ZBUklBQkxFKSkgewotCQkJCQkJVExEVmFyaWFibGVJbXBsIHZhcmlhYmxlID0gbmV3IFRMRFZhcmlhYmxlSW1wbCgpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9OQU1FX0dJVkVOKSA+PSAwKQotCQkJCQkJCXZhcmlhYmxlLnNldE5hbWVHaXZlbihhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDEyVExETmFtZXMuVkFSSUFCTEVfTkFNRV9HSVZFTikpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9OQU1FX0ZST01fQVRUUklCVVRFKSA+PSAwKQotCQkJCQkJCXZhcmlhYmxlLnNldE5hbWVGcm9tQXR0cmlidXRlKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9OQU1FX0ZST01fQVRUUklCVVRFKSk7Ci0JCQkJCQlpZiAoYXR0cmlidXRlcy5nZXRJbmRleChKU1AyMFRMRE5hbWVzLlZBUklBQkxFX0FMSUFTKSA+PSAwKQotCQkJCQkJCXZhcmlhYmxlLnNldEFsaWFzKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSlNQMjBUTEROYW1lcy5WQVJJQUJMRV9BTElBUykpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9DTEFTUykgPj0gMCkKLQkJCQkJCQl2YXJpYWJsZS5zZXRWYXJpYWJsZUNsYXNzKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9DTEFTUykpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5WQVJJQUJMRV9ERUNMQVJFKSA+PSAwKQotCQkJCQkJCXZhcmlhYmxlLnNldERlY2xhcmVTdHJpbmcoYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AxMlRMRE5hbWVzLlZBUklBQkxFX0RFQ0xBUkUpKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVzLmdldEluZGV4KEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9TQ09QRSkgPj0gMCkKLQkJCQkJCQl2YXJpYWJsZS5zZXRTY29wZShhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9TQ09QRSkpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0SW5kZXgoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikgPj0gMCkKLQkJCQkJCQl2YXJpYWJsZS5zZXREZXNjcmlwdGlvbihhdHRyaWJ1dGVzLmdldFZhbHVlKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pKTsKLQkJCQkJCWlmICh2YXJpYWJsZS5nZXRBbGlhcygpICE9IG51bGwgfHwgdmFyaWFibGUuZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKSAhPSBudWxsIHx8IHZhcmlhYmxlLmdldE5hbWVHaXZlbigpICE9IG51bGwpIHsKLQkJCQkJCQllZC5nZXRWYXJpYWJsZXMoKS5hZGQodmFyaWFibGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHFOYW1lLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfSU5DTFVERSkpIHsKLQkJCQkJCUlQYXRoIGZpbGVQYXRoID0gbnVsbDsKLQkJCQkJCVN0cmluZyB0ZXh0ID0gYXR0cmlidXRlcy5nZXRWYWx1ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfRklMRSk7Ci0JCQkJCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQkJCQkJZmlsZVBhdGggPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LnJlc29sdmUobmV3IFBhdGgoKChDTURvY3VtZW50SW1wbCkgZWQuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRCYXNlTG9jYXRpb24oKSksIHRleHQpOwotCQkJCQkJCUlGaWxlIGluY2x1ZGVkRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCQkJCQkJaWYgKGluY2x1ZGVkRmlsZS5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkJCQlsb2FkVGFnWEZpbGUoZWQsIGluY2x1ZGVkRmlsZSwgZmFsc2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJaW5wdXQuY2xvc2UoKTsKLQkJfQotCQljYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWVkLnNldExvY2F0aW9uU3RyaW5nKHRhZ3hGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRUYWdGaWxlKENNRWxlbWVudERlY2xhcmF0aW9uSW1wbCBlZCwgSUZpbGUgdGFnRmlsZSwgYm9vbGVhbiBhbGxvd0luY2x1ZGVzKSB7Ci0JCXRyeSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIG5ldyBNb2RlbEhhbmRsZXJGb3JKU1AoKS5nZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCh0YWdGaWxlKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJZWQuc2V0UGF0aCh0YWdGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQllZC5zZXRUYWdTb3VyY2UoVExERWxlbWVudERlY2xhcmF0aW9uLlNPVVJDRV9UQUdfRklMRSk7Ci0JCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCWlmIChkb2N1bWVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkpIHsKLQkJCQkJaWYgKGRvY3VtZW50UmVnaW9uLmdldE51bWJlck9mUmVnaW9ucygpID4gMikgewotCQkJCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQkJCQlTdHJpbmcgZGlyZWN0aXZlTmFtZSA9IGRvY3VtZW50UmVnaW9uLmdldFRleHQocmVnaW9ucy5nZXQoMSkpOwotCQkJCQkJaWYgKEpTUDEyVExETmFtZXMuVEFHLmVxdWFscyhkaXJlY3RpdmVOYW1lKSkgewotCQkJCQkJCS8vIDguNS4xCi0JCQkJCQkJU3RyaW5nIGF0dHJOYW1lID0gbnVsbDsKLQkJCQkJCQlmb3IgKGludCBpID0gMjsgaSA8IGRvY3VtZW50UmVnaW9uLmdldE51bWJlck9mUmVnaW9ucygpOyBpKyspIHsKLQkJCQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCQkJCVN0cmluZyB0ZXh0ID0gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dChyZWdpb24pOwotCQkJCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQkJCQkJCWF0dHJOYW1lID0gdGV4dDsKLQkJCQkJCQkJfQotCQkJCQkJCQkvLyBwcm9jZXNzIHZhbHVlCi0JCQkJCQkJCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJCQkJdGV4dCA9IFN0cmluZ1V0aWxzLnN0cmlwKHRleHQpOwotCQkJCQkJCQkJaWYgKEpTUDEyVExETmFtZXMuRElTUExBWV9OQU1FLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQllZC5zZXREaXNwbGF5TmFtZSh0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDEyVExETmFtZXMuQk9EWV9DT05URU5ULmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQllZC5zZXRCb2R5Y29udGVudCh0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDIwVExETmFtZXMuRFlOQU1JQ19BVFRSSUJVVEVTLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQllZC5zZXREeW5hbWljQXR0cmlidXRlcyh0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDEyVExETmFtZXMuU01BTExfSUNPTi5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJZWQuc2V0U21hbGxJY29uKHRleHQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQllZC5zZXRMYXJnZUljb24odGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQllZC5zZXREZXNjcmlwdGlvbih0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDIwVExETmFtZXMuRVhBTVBMRS5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJZWQuc2V0RXhhbXBsZSh0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDIwVExETmFtZXMuU0NSSVBUSU5HX0xBTkdVQUdFLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQllZC5zZXRTY3JpcHRpbmdMYW5ndWFnZSh0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDIwVExETmFtZXMuSU1QT1JULmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQllZC5zZXRJbXBvcnQodGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AyMFRMRE5hbWVzLlBBR0VfRU5DT0RJTkcuZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCQkJCQkJCWVkLnNldFBhZ2VFbmNvZGluZyh0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDIwVExETmFtZXMuSVNfRUxfSUdOT1JFRC5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJZWQuc2V0SXNFTElnbm9yZWQodGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChKU1AxMlRMRE5hbWVzLkFUVFJJQlVURS5lcXVhbHMoZGlyZWN0aXZlTmFtZSkpIHsKLQkJCQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCBhdHRyaWJ1dGUgPSBuZXcgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwoZWQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCQkJCQkvLyA4LjUuMgotCQkJCQkJCVN0cmluZyBhdHRyTmFtZSA9IG51bGw7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDI7IGkgPCBkb2N1bWVudFJlZ2lvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKTsgaSsrKSB7Ci0JCQkJCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQkJCQlTdHJpbmcgdGV4dCA9IGRvY3VtZW50UmVnaW9uLmdldFRleHQocmVnaW9uKTsKLQkJCQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCQkJCQlhdHRyTmFtZSA9IHRleHQ7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJLy8gcHJvY2VzcyB2YWx1ZQotCQkJCQkJCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUgJiYgYXR0ck5hbWUgIT0gbnVsbCkgewotCQkJCQkJCQkJdGV4dCA9IFN0cmluZ1V0aWxzLnN0cmlwKHRleHQpOwotCQkJCQkJCQkJaWYgKEpTUDEyVExETmFtZXMuTkFNRS5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJYXR0cmlidXRlLnNldE5vZGVOYW1lKHRleHQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoSlNQMjBUTEROYW1lcy5GUkFHTUVOVC5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJYXR0cmlidXRlLnNldEZyYWdtZW50KEJvb2xlYW4udmFsdWVPZih0ZXh0KS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AxMlRMRE5hbWVzLlJURVhQUlZBTFVFLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQlhdHRyaWJ1dGUuc2V0UnRleHBydmFsdWUodGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AyMFRMRE5hbWVzLlRZUEUuZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCQkJCQkJCWF0dHJpYnV0ZS5zZXRUeXBlKHRleHQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTi5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJYXR0cmlidXRlLnNldERlc2NyaXB0aW9uKHRleHQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoSlNQMTJUTEROYW1lcy5SRVFVSVJFRC5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJYXR0cmlidXRlLnNldFJlcXVpcmVkU3RyaW5nKHRleHQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChhdHRyaWJ1dGUuZ2V0Tm9kZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCWVkLmZBdHRyaWJ1dGVzLnNldE5hbWVkSXRlbShhdHRyaWJ1dGUuZ2V0Tm9kZU5hbWUoKSwgYXR0cmlidXRlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChKU1AxMlRMRE5hbWVzLlZBUklBQkxFLmVxdWFscyhkaXJlY3RpdmVOYW1lKSkgewotCQkJCQkJCVRMRFZhcmlhYmxlSW1wbCB2YXJpYWJsZSA9IG5ldyBUTERWYXJpYWJsZUltcGwoKTsKLQkJCQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBudWxsOwotCQkJCQkJCWZvciAoaW50IGkgPSAyOyBpIDwgZG9jdW1lbnRSZWdpb24uZ2V0TnVtYmVyT2ZSZWdpb25zKCk7IGkrKykgewotCQkJCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkJCQkJU3RyaW5nIHRleHQgPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCQkJCQkJYXR0ck5hbWUgPSB0ZXh0OwotCQkJCQkJCQl9Ci0JCQkJCQkJCS8vIHByb2Nlc3MgdmFsdWUKLQkJCQkJCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFICYmIGF0dHJOYW1lICE9IG51bGwpIHsKLQkJCQkJCQkJCXRleHQgPSBTdHJpbmdVdGlscy5zdHJpcCh0ZXh0KTsKLQkJCQkJCQkJCWlmIChKU1AxMlRMRE5hbWVzLlZBUklBQkxFX05BTUVfR0lWRU4uZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCQkJCQkJCXZhcmlhYmxlLnNldE5hbWVHaXZlbih0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDEyVExETmFtZXMuVkFSSUFCTEVfTkFNRV9GUk9NX0FUVFJJQlVURS5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJdmFyaWFibGUuc2V0TmFtZUZyb21BdHRyaWJ1dGUodGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AyMFRMRE5hbWVzLlZBUklBQkxFX0FMSUFTLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQl2YXJpYWJsZS5zZXRBbGlhcyh0ZXh0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEpTUDEyVExETmFtZXMuVkFSSUFCTEVfQ0xBU1MuZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCQkJCQkJCXZhcmlhYmxlLnNldFZhcmlhYmxlQ2xhc3ModGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AxMlRMRE5hbWVzLlZBUklBQkxFX0RFQ0xBUkUuZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCQkJCQkJCXZhcmlhYmxlLnNldERlY2xhcmVTdHJpbmcodGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfU0NPUEUuZXF1YWxzKGF0dHJOYW1lKSkgewotCQkJCQkJCQkJCXZhcmlhYmxlLnNldFNjb3BlKHRleHQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTi5lcXVhbHMoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCQkJdmFyaWFibGUuc2V0RGVzY3JpcHRpb24odGV4dCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHZhcmlhYmxlLmdldEFsaWFzKCkgIT0gbnVsbCB8fCB2YXJpYWJsZS5nZXROYW1lRnJvbUF0dHJpYnV0ZSgpICE9IG51bGwgfHwgdmFyaWFibGUuZ2V0TmFtZUdpdmVuKCkgIT0gbnVsbCkgewotCQkJCQkJCQllZC5nZXRWYXJpYWJsZXMoKS5hZGQodmFyaWFibGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKCJpbmNsdWRlIi5lcXVhbHMoZGlyZWN0aXZlTmFtZSkgJiYgYWxsb3dJbmNsdWRlcykgewotCQkJCQkJCVN0cmluZyBhdHRyTmFtZSA9IG51bGw7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDI7IGkgPCBkb2N1bWVudFJlZ2lvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKTsgaSsrKSB7Ci0JCQkJCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQkJCQlTdHJpbmcgdGV4dCA9IGRvY3VtZW50UmVnaW9uLmdldFRleHQocmVnaW9uKTsKLQkJCQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCQkJCQlhdHRyTmFtZSA9IHRleHQ7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJLy8gcHJvY2VzcyB2YWx1ZQotCQkJCQkJCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUgJiYgYXR0ck5hbWUgIT0gbnVsbCkgewotCQkJCQkJCQkJdGV4dCA9IFN0cmluZ1V0aWxzLnN0cmlwKHRleHQpOwotCQkJCQkJCQkJaWYgKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9GSUxFLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQkJCQkJCQlJUGF0aCBmaWxlUGF0aCA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQucmVzb2x2ZShuZXcgUGF0aCgoKENNRG9jdW1lbnRJbXBsKSBlZC5nZXRPd25lckRvY3VtZW50KCkpLmdldEJhc2VMb2NhdGlvbigpKSwgdGV4dCk7Ci0KLQkJCQkJCQkJCQlJRmlsZSBpbmNsdWRlZEZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZmlsZVBhdGgpOwotCQkJCQkJCQkJCWlmIChpbmNsdWRlZEZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCQkJCQkJbG9hZFRhZ0ZpbGUoZWQsIGluY2x1ZGVkRmlsZSwgZmFsc2UpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0TmV4dCgpOwotCQkJfQotCi0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oInByb2JsZW0gcGFyc2luZyAiICsgdGFnRmlsZSwgZSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigicHJvYmxlbSBwYXJzaW5nICIgKyB0YWdGaWxlLCBlKTsKLQkJfQotCQllZC5zZXRMb2NhdGlvblN0cmluZyh0YWdGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlZmVyZW5jZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBjcmVhdGVDTURvY3VtZW50KElUYWdsaWJSZWNvcmQgcmVmZXJlbmNlKSB7Ci0JCUNNRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gbnVsbDsKLQkJc3dpdGNoIChyZWZlcmVuY2UuZ2V0UmVjb3JkVHlwZSgpKSB7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLlRMRCkgOiB7Ci0JCQkJSVRMRFJlY29yZCByZWNvcmQgPSAoSVRMRFJlY29yZCkgcmVmZXJlbmNlOwotCQkJCUlSZXNvdXJjZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHJlY29yZC5nZXRQYXRoKCkpOwotCQkJCWlmIChmaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlkb2N1bWVudCA9IChDTURvY3VtZW50SW1wbCkgYnVpbGRDTURvY3VtZW50RnJvbUZpbGUoZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQkJCQlkb2N1bWVudC5zZXRMb2NhdGlvblN0cmluZyhyZWNvcmQuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJCQlpZiAoX2RlYnVnICYmIGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudHMoKS5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZhaWx1cmUgcGFyc2luZyAiICsgcmVjb3JkLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCi0JCQkJCWlmIChkb2N1bWVudC5nZXRTbWFsbEljb24oKSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgaWNvblBhdGggPSBVUklIZWxwZXIubm9ybWFsaXplKCgoVExERG9jdW1lbnQpIGRvY3VtZW50KS5nZXRTbWFsbEljb24oKSwgZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCksICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWRvY3VtZW50LnNldFByb3BlcnR5KEpTUDEyVExETmFtZXMuU01BTExfSUNPTiwgImZpbGU6IiArIGljb25QYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWlmIChkb2N1bWVudC5nZXRMYXJnZUljb24oKSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgaWNvblBhdGggPSBVUklIZWxwZXIubm9ybWFsaXplKCgoVExERG9jdW1lbnQpIGRvY3VtZW50KS5nZXRMYXJnZUljb24oKSwgZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCksICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWRvY3VtZW50LnNldFByb3BlcnR5KEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTiwgImZpbGU6IiArIGljb25QYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5KQVIpIDogewotCQkJCUlKYXJSZWNvcmQgcmVjb3JkID0gKElKYXJSZWNvcmQpIHJlZmVyZW5jZTsKLQkJCQlkb2N1bWVudCA9IChDTURvY3VtZW50SW1wbCkgYnVpbGRDTURvY3VtZW50RnJvbUphcihyZWNvcmQuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKLQkJCQlkb2N1bWVudC5zZXRMb2NhdGlvblN0cmluZygiamFyOmZpbGU6IiArIHJlY29yZC5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkgKyAiIS9NRVRBLUlORi90YWdsaWIudGxkIik7Ci0JCQkJaWYgKGRvY3VtZW50LmdldFNtYWxsSWNvbigpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGljb25QYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZSgoKFRMRERvY3VtZW50KSBkb2N1bWVudCkuZ2V0U21hbGxJY29uKCksIHJlY29yZC5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkgKyAiIS9NRVRBLUlORi8iLCAiLyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJZG9jdW1lbnQuc2V0UHJvcGVydHkoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OLCAiamFyOmZpbGU6IiArIGljb25QYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAoZG9jdW1lbnQuZ2V0TGFyZ2VJY29uKCkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgaWNvblBhdGggPSBVUklIZWxwZXIubm9ybWFsaXplKCgoVExERG9jdW1lbnQpIGRvY3VtZW50KS5nZXRMYXJnZUljb24oKSwgcmVjb3JkLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSArICIhL01FVEEtSU5GLyIsICIvIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlkb2N1bWVudC5zZXRQcm9wZXJ0eShKU1AxMlRMRE5hbWVzLkxBUkdFX0lDT04sICJqYXI6ZmlsZToiICsgaWNvblBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50LmdldEVsZW1lbnRzKCkuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZhaWx1cmUgcGFyc2luZyAiICsgcmVjb3JkLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5UQUdESVIpIDogewotCQkJCUlUYWdEaXJSZWNvcmQgcmVjb3JkID0gKElUYWdEaXJSZWNvcmQpIHJlZmVyZW5jZTsKLQkJCQlkb2N1bWVudCA9IGJ1aWxkQ01Eb2N1bWVudEZyb21Gb2xkZXIocmVjb3JkLmdldFBhdGgoKSk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLlVSTCkgOiB7Ci0JCQkJSVVSTFJlY29yZCByZWNvcmQgPSAoSVVSTFJlY29yZCkgcmVmZXJlbmNlOwotCQkJCUlucHV0U3RyZWFtIHVybENvbnRlbnRzID0gbnVsbDsKLQkJCQlVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWNvbm5lY3Rpb24gPSByZWNvcmQuZ2V0VVJMKCkub3BlbkNvbm5lY3Rpb24oKTsKLQkJCQkJaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCkgewotCQkJCQkJY29ubmVjdGlvbi5zZXRVc2VDYWNoZXMoZmFsc2UpOwotCQkJCQkJdXJsQ29udGVudHMgPSBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJCQlkb2N1bWVudCA9IChDTURvY3VtZW50SW1wbCkgYnVpbGRDTURvY3VtZW50KHJlY29yZC5nZXRCYXNlTG9jYXRpb24oKSwgdXJsQ29udGVudHMpOwotCQkJCQkJZG9jdW1lbnQuc2V0TG9jYXRpb25TdHJpbmcocmVjb3JkLmdldFVSTCgpLnRvU3RyaW5nKCkpOwotCQkJCQkJaWYgKGRvY3VtZW50LmdldFNtYWxsSWNvbigpICE9IG51bGwpIHsKLQkJCQkJCQlTdHJpbmcgaWNvblBhdGggPSBVUklIZWxwZXIubm9ybWFsaXplKCgoVExERG9jdW1lbnQpIGRvY3VtZW50KS5nZXRTbWFsbEljb24oKSwgcmVjb3JkLmdldFVSTCgpLnRvU3RyaW5nKCksICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlkb2N1bWVudC5zZXRQcm9wZXJ0eShKU1AxMlRMRE5hbWVzLlNNQUxMX0lDT04sIGljb25QYXRoKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChkb2N1bWVudC5nZXRMYXJnZUljb24oKSAhPSBudWxsKSB7Ci0JCQkJCQkJU3RyaW5nIGljb25QYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZSgoKFRMRERvY3VtZW50KSBkb2N1bWVudCkuZ2V0TGFyZ2VJY29uKCksIHJlY29yZC5nZXRVUkwoKS50b1N0cmluZygpLCAiLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJZG9jdW1lbnQuc2V0UHJvcGVydHkoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OLCBpY29uUGF0aCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gbm90IHVuY29tbW9uIGdpdmVuIGludmFsaWQgVVJMcwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKHVybENvbnRlbnRzICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdXJsQ29udGVudHMuY2xvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTURvY3VtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRG9jdW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNjY4NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRG9jdW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMRERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMRFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ29udGVudE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmFubm90YXRpb24uQW5ub3RhdGlvbk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb24uQW5ub3RhdGlvbkZpbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmlsZVBhcnNlcjsKLQotcHVibGljIGNsYXNzIENNRG9jdW1lbnRJbXBsIGltcGxlbWVudHMgVExERG9jdW1lbnQgewotCQotCS8qKiBDb250YWlucyB0YWdpbmZvIGFuZC9vciBhbnkgb3RoZXIgbWlzYyBwcm9wZXJ0aWVzKi8KLQlwcml2YXRlIEFubm90YXRpb25NYXAgZkFubm90YXRpb25NYXAgPSBudWxsOwotCQotCXByaXZhdGUgTWFwIGZQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoMCk7Ci0KLQkvKioKLQkgKiBSZWNvcmRzIGZyb20gd2hlcmUgdGhpcyBkb2N1bWVudCB3YXMgY3JlYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZCYXNlTG9jYXRpb247Ci0JLyoqIAotCSAqIHNpbmNlIEpTUCAxLjIKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmRGVzY3JpcHRpb247Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZkRpc3BsYXlOYW1lOwotCi0JLyoqCi0JICogTk9UIHB1YmxpYyBBUEkKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsIGZFbGVtZW50cyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCXByaXZhdGUgTGlzdCBmRnVuY3Rpb25zID0gbmV3IEFycmF5TGlzdCgwKTsKLQkKLQkvLyBpZCBvZiB0aGUgdGFnbGliCi0JcHJpdmF0ZSBTdHJpbmcgZklkID0gbnVsbDsKLQkvKioKLQkgKiBDaGlsZHJlbiBvZiAidGFnbGliIiB3aXRoaW4gYSAudGxkIGZpbGUgZWFjaCBhbGxvdwotCSAqIG9uZSBUZXh0IG5vZGUgKCNQQ0RBVEEpIGJlbmVhdGggdGhlbS4gIFN0b3JlIHRoZSB2YWx1ZXMKLQkgKiBoZXJlIGZvciBzaW1wbGljaXR5LgotCSAqLwotCS8vIFRoZSBKU1Agc3BlY2lmaWNhdGlvbiByZXF1aXJlZCBmb3IgdGhpcyB0YWdsaWIgdG8gZnVuY3Rpb24KLQlwcml2YXRlIFN0cmluZyBmSlNQVmVyc2lvbiA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZkxhcmdlSWNvbjsKLQotCXByaXZhdGUgTGlzdCBmTGlzdGVuZXJzOwotCQotCXByaXZhdGUgU3RyaW5nIGZQYXJlbnRVUkkgPSBudWxsOwotCS8vIEEgc2hvcnQgbmFtZSBzdWdnZXN0ZWQgYXMgdGhlIGRlZmF1bHQgcHJlZml4IGZvciB0YWdzIHdpdGhpbiB0aGUgbGliCi0JcHJpdmF0ZSBTdHJpbmcgZlNob3J0TmFtZSA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZlNtYWxsSWNvbjsKLQkKLQkvKioKLQkgKiBzaW5jZSBKU1AgMi4wCi0JICogCi0JICogVGhlIGVudGlyZSBlbGVtZW50IGlzIHN0b3JlZCBoZXJlIHNpbmNlIGl0cyBsYXlvdXQgaXMgdW5kZWZpbmVkIAotCSAqLwotCXByaXZhdGUgTGlzdCBmVGFnbGliRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCi0JLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHRhZ2xpYiBpdHNlbGYKLQlwcml2YXRlIFN0cmluZyBmVExpYlZlcnNpb24gPSBudWxsOwotCQotCS8vIEEgdW5pcXVlIHB1YmxpYyBVUkkgZGVzY3JpYmluZyB0aGlzIHRhZ2xpYi4gIFJlY29tbWVuZGVkIHRvIGJlIHRoZSBVUkwKLQkvLyB0byB0aGUgZGVzY3JpcHRvcgotCXByaXZhdGUgU3RyaW5nIGZVUkkgPSBudWxsOwotCQotCXByaXZhdGUgU3RyaW5nIGZMb2NhdGlvblN0cmluZzsKLQotCXByb3RlY3RlZCBUTERWYWxpZGF0b3IgdmFsaWRhdG9yOwotCQotCS8qKgotCSAqIENNRG9jdW1lbnRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgYW5ub3RhdGlvbiBtYXAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuICBMYXppbHkgY3JlYXRlcwotCSAqIGFuZCBsb2FkcyBhbm5vdGF0aW9uIG1hcC4KLQkgKiBAcmV0dXJuIEFubm90YXRpb25NYXAKLQkgKi8KLQlwcml2YXRlIEFubm90YXRpb25NYXAgZ2V0QW5ub3RhdGlvbk1hcCgpIHsKLQkJLy8gY3JlYXRlIGEgbmV3IGFubm90YXRpb24gbWFwIGFuZCBsb2FkIGl0IHVwCi0JCWlmIChmQW5ub3RhdGlvbk1hcCA9PSBudWxsKSB7Ci0JCQlmQW5ub3RhdGlvbk1hcCA9IG5ldyBBbm5vdGF0aW9uTWFwKCk7Ci0JCQkKLQkJCUxpc3QgYW5ub3RhdGlvbkZpbGVzID0gQ29udGVudE1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEFubm90YXRpb25GaWxlc0luZm9zKGdldFVyaSgpKTsKLQkJICAgIGZvciAoSXRlcmF0b3IgaSA9IGFubm90YXRpb25GaWxlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJICAgIAl0cnkgewotCQkgICAgCQlBbm5vdGF0aW9uRmlsZUluZm8gZmlsZUluZm8gPSAoQW5ub3RhdGlvbkZpbGVJbmZvKSBpLm5leHQoKTsKLQkJICAgIAkJQW5ub3RhdGlvbkZpbGVQYXJzZXIgcGFyc2VyID0gbmV3IEFubm90YXRpb25GaWxlUGFyc2VyKCk7Ci0JCSAgICAJCXBhcnNlci5wYXJzZShmQW5ub3RhdGlvbk1hcCwgZmlsZUluZm8pOwotCQkgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCSAgICAgICAgCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJFeGNlcHRpb24gdGhyb3duIGluIENNRG9jdW1lbnRJbXBsI2dldEFubm90YXRpb25NYXAiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkgICAgICAgIH0KLQkJICAgIH0KLQkJfQotCQlyZXR1cm4gZkFubm90YXRpb25NYXA7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYmFzZUxvY2F0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZUxvY2F0aW9uKCkgewotCQlyZXR1cm4gZkJhc2VMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZXNjcmlwdGlvbi4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc3BsYXlOYW1lLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBmRGlzcGxheU5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0RWxlbWVudHMgbWV0aG9kCi0JICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotCSAqCi0JICogUmV0dXJucyBDTU5hbWVkTm9kZU1hcCBvZiBFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RWxlbWVudHMoKSB7Ci0JCXJldHVybiBmRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogZ2V0RW50aXRpZXMgbWV0aG9kCi0JICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotCSAqCi0JICogUmV0dXJucyBDTU5hbWVkTm9kZU1hcCBvZiBFbnRpdHlEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldEV4dGVuc2lvbnMoKSB7Ci0JCXJldHVybiBmVGFnbGliRXh0ZW5zaW9uczsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmdW5jdGlvbnMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0RnVuY3Rpb25zKCkgewotCQlyZXR1cm4gZkZ1bmN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpZC4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZklkOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKLQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKc3B2ZXJzaW9uKCkgewotCQlyZXR1cm4gZkpTUFZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGFyZ2VJY29uLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFyZ2VJY29uKCkgewotCQlyZXR1cm4gZkxhcmdlSWNvbjsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChmTGlzdGVuZXJzID09IG51bGwpCi0JCQlmTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gZkxpc3RlbmVyczsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lc3BhY2UgbWV0aG9kCi0JICogQHJldHVybiBDTU5hbWVzcGFjZQotCSAqLwotCXB1YmxpYyBDTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiAiI2NtZG9jdW1lbnQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuRE9DVU1FTlQ7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFyZW50VVJJLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50VVJJKCkgewotCQlyZXR1cm4gZlBhcmVudFVSSTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKgotCSAqIFJldHVybnMgdGhlIG9iamVjdCBwcm9wZXJ0eSBkZXNjaXBlZCBieSB0aGUgcHJvcGVydHlOYW1lCi0JICoKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVExERG9jdW1lbnQuQ01fS0lORCkpIHsKLQkJCXJldHVybiBUTEREb2N1bWVudC5KU1BfVExEOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImFubm90YXRpb25NYXAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbk1hcCgpOwotCQl9Ci0JCXJldHVybiBmUHJvcGVydGllcy5nZXQocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNob3J0bmFtZSgpIHsKLQkJcmV0dXJuIGZTaG9ydE5hbWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc21hbGxJY29uLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U21hbGxJY29uKCkgewotCQlyZXR1cm4gZlNtYWxsSWNvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRsaWJ2ZXJzaW9uKCkgewotCQlyZXR1cm4gZlRMaWJWZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJpKCkgewotCQlyZXR1cm4gZlVSSTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgVExERG9jdW1lbnQjZ2V0VmFsaWRhdG9yKCkKLQkgKi8KLQlwdWJsaWMgVExEVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGJhc2VMb2NhdGlvbiBUaGUgYmFzZUxvY2F0aW9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYXNlTG9jYXRpb24oU3RyaW5nIGJhc2VMb2NhdGlvbikgewotCQlmQmFzZUxvY2F0aW9uID0gYmFzZUxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRlc2NyaXB0aW9uLgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMuZkRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGlzcGxheU5hbWUuCi0JICogQHBhcmFtIGRpc3BsYXlOYW1lIFRoZSBkaXNwbGF5TmFtZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgZGlzcGxheU5hbWUpIHsKLQkJdGhpcy5mRGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpZC4KLQkgKiBAcGFyYW0gaWQgVGhlIGlkIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQl0aGlzLmZJZCA9IGlkOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdJbmZvIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmZvKFN0cmluZyBuZXdJbmZvKSB7Ci0JCXNldERlc2NyaXB0aW9uKG5ld0luZm8pOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdKc3B2ZXJzaW9uIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKc3B2ZXJzaW9uKFN0cmluZyBuZXdKc3B2ZXJzaW9uKSB7Ci0JCWZKU1BWZXJzaW9uID0gbmV3SnNwdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYXJnZUljb24uCi0JICogQHBhcmFtIGxhcmdlSWNvbiBUaGUgbGFyZ2VJY29uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhcmdlSWNvbihTdHJpbmcgbGFyZ2VJY29uKSB7Ci0JCXRoaXMuZkxhcmdlSWNvbiA9IGxhcmdlSWNvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lcnMoTGlzdCBsaXN0ZW5lcnMpIHsKLQkJdGhpcy5mTGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50VVJJIFRoZSBwYXJlbnRVUkkgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudFVSSShTdHJpbmcgcGFyZW50VVJJKSB7Ci0JCWZQYXJlbnRVUkkgPSBwYXJlbnRVUkk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWZQcm9wZXJ0aWVzLnB1dChwcm9wZXJ0eSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdTaG9ydG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNob3J0bmFtZShTdHJpbmcgbmV3U2hvcnRuYW1lKSB7Ci0JCWZTaG9ydE5hbWUgPSBuZXdTaG9ydG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc21hbGxJY29uLgotCSAqIEBwYXJhbSBzbWFsbEljb24gVGhlIHNtYWxsSWNvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTbWFsbEljb24oU3RyaW5nIHNtYWxsSWNvbikgewotCQl0aGlzLmZTbWFsbEljb24gPSBzbWFsbEljb247Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1RsaWJ2ZXJzaW9uIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUbGlidmVyc2lvbihTdHJpbmcgbmV3VGxpYnZlcnNpb24pIHsKLQkJZlRMaWJWZXJzaW9uID0gbmV3VGxpYnZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1VyaSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJpKFN0cmluZyBuZXdVcmkpIHsKLQkJZlVSSSA9IG5ld1VyaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoVExEVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBzdXBwb3J0cyBtZXRob2QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChUTEREb2N1bWVudC5DTV9LSU5ELmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8ICJhbm5vdGF0aW9uTWFwIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmUHJvcGVydGllcy5jb250YWluc0tleShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgc2hvcnQgbmFtZToiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldFNob3J0bmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBkaXNwbGF5IG5hbWU6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXREaXNwbGF5TmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBkZXNjcmlwdGlvbiAoaW5mbyk6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXREZXNjcmlwdGlvbigpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBVUkk6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRVcmkoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQganNwIHZlcnNpb246IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRKc3B2ZXJzaW9uKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IHRhZ2xpYiB2ZXJzaW9uOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0VGxpYnZlcnNpb24oKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgc21hbGwgaWNvbjoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldFNtYWxsSWNvbigpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBsYXJnZSBpY29uOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0TGFyZ2VJY29uKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZ2V0VmFsaWRhdG9yKCkgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoIlxuXHQgdmFsaWRhdG9yOiIgKyBTdHJpbmdVdGlscy5yZXBsYWNlKGdldFZhbGlkYXRvcigpLnRvU3RyaW5nKCksICJcbiIsICJcblx0XHQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgbGlzdGVuZXJzOiIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0TGlzdGVuZXJzKCkuc2l6ZSgpOyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIlxuIiArIFN0cmluZ1V0aWxzLnJlcGxhY2UoZ2V0TGlzdGVuZXJzKCkuZ2V0KGkpLnRvU3RyaW5nKCksICJcbiIsICJcblx0XHQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBlbGVtZW50czoiKTsgLy8kTk9OLU5MUy0xJAotCQlDTU5hbWVkTm9kZU1hcCBlbGVtZW50cyA9IGdldEVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZChTdHJpbmdVdGlscy5yZXBsYWNlKGVsZW1lbnRzLml0ZW0oaSkudG9TdHJpbmcoKSwgIlxuIiwgIlxuXHRcdCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25TdHJpbmcoKSB7Ci0JCXJldHVybiBmTG9jYXRpb25TdHJpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb25TdHJpbmcoU3RyaW5nIHVybCkgewotCQlmTG9jYXRpb25TdHJpbmcgPSB1cmw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRWxlbWVudERlY2xhcmF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRWxlbWVudERlY2xhcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmQwMTM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTUVsZW1lbnREZWNsYXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDExVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTJUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTEREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmFubm90YXRpb24uQW5ub3RhdGlvbk1hcDsKLQotcHVibGljIGNsYXNzIENNRWxlbWVudERlY2xhcmF0aW9uSW1wbCBpbXBsZW1lbnRzIFRMREVsZW1lbnREZWNsYXJhdGlvbiB7Ci0KLQkvLyBvcHRpb25hbCBhdHRyaWJ1dGVzCi0JQ01OYW1lZE5vZGVNYXBJbXBsIGZBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCS8vIChlbXB0eXxKU1B8dGFnZGVwZW5kYW50fHNjcmlwdGxlc3MpIC0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIEpTUAotCXByaXZhdGUgU3RyaW5nIGJvZHljb250ZW50ID0gSlNQMTFUTEROYW1lcy5DT05URU5UX0pTUDsKLQotCS8qKgotCSAqIHNpbmNlIEpTUCAxLjIKLQkgKiAKLQkgKiBVc2FnZSBpbmZvcm1hdGlvbgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JLyoqCi0JICogc2luY2UgSlNQIDEuMgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRpc3BsYXlOYW1lOwotCi0JcHJpdmF0ZSBDTURvY3VtZW50IGZPd25lckRvY3VtZW50OwotCi0JcHJpdmF0ZSBTdHJpbmcgZlBhdGggPSBudWxsOwotCi0JcHJpdmF0ZSBMaXN0IGZUYWdFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgwKTsKLQkvKioKLQkgKiBzaW5jZSBKU1AgMS4yCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbGFyZ2VJY29uOwotCi0KLQlwcml2YXRlIGludCBtYXhPY2N1ciA9IC0xOwotCXByaXZhdGUgaW50IG1pbk9jY3VyID0gMDsKLQotCS8vIHJlcXVpcmVkIHRhZyBuYW1lCi0JcHJpdmF0ZSBTdHJpbmcgbm9kZU5hbWUgPSBudWxsOwotCi0JLyoqCi0JICogc2luY2UgSlNQIDEuMgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHNtYWxsSWNvbjsKLQotCS8vIHRhZyBoYW5kbGVyIGNsYXNzIC0gcmVxdWlyZWQKLQlwcml2YXRlIFN0cmluZyB0YWdjbGFzcyA9IG51bGw7Ci0KLQkvLyB0YWcgZXh0cmEgaW5mbyBjbGFzcyAoc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AuVGFnRXh0cmFJbmZvKSAtCi0JLy8gb3B0aW9uYWwKLQlwcml2YXRlIFN0cmluZyB0ZWljbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBzaW5jZSBKU1AgMS4yCi0JICovCi0JcHJpdmF0ZSBMaXN0IHZhcmlhYmxlczsKLQotCS8qKgotCSAqIHNpbmNlIEpTUCAyLjAKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmRXhhbXBsZTsKLQlwcml2YXRlIFN0cmluZyBmSW1wb3J0OwotCXByaXZhdGUgU3RyaW5nIGZTY3JpcHRpbmdMYW5ndWFnZTsKLQlwcml2YXRlIFN0cmluZyBmRHluYW1pY0F0dHJpYnV0ZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgZklzRUxJZ25vcmVkOwotCXByaXZhdGUgU3RyaW5nIGZQYWdlRW5jb2Rpbmc7Ci0JcHJpdmF0ZSBTdHJpbmcgZlRhZ1NvdXJjZTsKLQotCXByaXZhdGUgU3RyaW5nIGZMb2NhdGlvblN0cmluZzsKLQlwcml2YXRlIFN0cmluZyBzbWFsbEljb25VUkw7Ci0KLQkvKioKLQkgKiBDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsKENNRG9jdW1lbnQgb3duZXIpIHsKLQkJc3VwZXIoKTsKLQkJZk93bmVyRG9jdW1lbnQgPSBvd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyaWJ1dGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKiAKLQkgKiBSZXR1cm5zIENNTmFtZWROb2RlTWFwIG9mIEF0dHJpYnV0ZURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBmQXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvZHljb250ZW50KCkgewotCQlyZXR1cm4gYm9keWNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q01Db250ZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01Db250ZW50Ci0JICogCi0JICogUmV0dXJucyB0aGUgcm9vdCBub2RlIG9mIHRoaXMgZWxlbWVudCdzIGNvbnRlbnQgbW9kZWwuIFRoaXMgY2FuIGJlIGFuCi0JICogQ01FbGVtZW50RGVjbGFyYXRpb24gb3IgYSBDTUdyb3VwCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDb250ZW50VHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIAotCSAqIFJldHVybnMgb25lIG9mIDogQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEuCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJaWYgKGdldEJvZHljb250ZW50KCkuZXF1YWxzKEpTUDExVExETmFtZXMuQ09OVEVOVF9FTVBUWSkpCi0JCQlyZXR1cm4gRU1QVFk7Ci0JCWlmIChnZXRCb2R5Y29udGVudCgpLmVxdWFscyhKU1AxMVRMRE5hbWVzLkNPTlRFTlRfVEFHREVQRU5ERU5UKSkKLQkJCXJldHVybiBQQ0RBVEE7Ci0JCWVsc2UKLQkJCS8vIEpTUAotCQkJcmV0dXJuIEFOWTsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ01EYXRhVHlwZSBnZXREYXRhVHlwZSgpIHsKLQkJcmV0dXJuIG5ldyBDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGlzcGxheU5hbWUuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIGRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqIGdldEVsZW1lbnROYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZXhhbXBsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4YW1wbGUoKSB7Ci0JCXJldHVybiBmRXhhbXBsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4dGVuc2lvbnMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0RXh0ZW5zaW9ucygpIHsKLQkJcmV0dXJuIGZUYWdFeHRlbnNpb25zOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKLQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGFyZ2VJY29uLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFyZ2VJY29uKCkgewotCQlyZXR1cm4gbGFyZ2VJY29uOwotCX0KLQotCS8qKgotCSAqIGdldExvY2FsRWxlbWVudHMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotCSAqIAotCSAqIFJldHVybnMgYSBsaXN0IG9mIGxvY2FsbHkgZGVmaW5lZCBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0TG9jYWxFbGVtZW50cygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWF4T2NjdXIgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiAKLQkgKiBJZiAtMSwgaXQncyBVTkJPVU5ERUQuCi0JICovCi0JcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJcmV0dXJuIG1heE9jY3VyOwotCX0KLQotCS8qKgotCSAqIGdldE1pbk9jY3VyIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogCi0JICogSWYgMCwgaXQncyBPUFRJT05BTC4gSWYgMSwgaXQncyBSRVFVSVJFRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQlyZXR1cm4gbWluT2NjdXI7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIG5vZGVOYW1lOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZPd25lckRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGF0aC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JCXJldHVybiBmUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKiAKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgcHJvcGVydHkgZGVzY3JpYmVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUKLQkgKiAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKCJ0YWdJbmZvIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZ2V0VGFnSW5mbygpOyAvLyByZXR1cm4gdGFnIGluZm8KLQkJCS8vIGJ1Zzg4MzM2IG5vIG5lZWQgdG8gcmVzdG9yZSBtYXJrZXJzCi0JCQkvLyByZXR1cm4gU3RyaW5nVXRpbHMucmVzdG9yZU1hcmtlcnMoZ2V0VGFnSW5mbygpKTsgLy8gcmV0dXJuIHRhZwotCQkJLy8gZGVzY3JpcHRpb24KLQkJfQotCQkvLyBCdWcgMTU1ODAwCi0JCWVsc2UgaWYgKCJuYW1lIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQkJfQotCQllbHNlIGlmICgiZGVzY3JpcHRpb24iLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJLy8gYnVnODgzMzYgbm8gbmVlZCB0byByZXN0b3JlIG1hcmtlcnMKLQkJCS8vIHJldHVybiBTdHJpbmdVdGlscy5yZXN0b3JlTWFya2VycyhnZXREZXNjcmlwdGlvbigpKTsgLy8gcmV0dXJuCi0JCQkvLyB0YWcgZGVzY3JpcHRpb24KLQkJfQotCQllbHNlIGlmIChUTEREb2N1bWVudC5DTV9LSU5ELmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gVExERG9jdW1lbnQuSlNQX1RMRDsKLQkJfQotCQllbHNlIGlmIChUTERFbGVtZW50RGVjbGFyYXRpb24uVEFHX1NPVVJDRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIChmVGFnU291cmNlICE9IG51bGwgPyBmVGFnU291cmNlIDpUTERFbGVtZW50RGVjbGFyYXRpb24uU09VUkNFX0pTUF9UTEQpOwotCQl9Ci0JCWVsc2UgaWYgKEpTUDEyVExETmFtZXMuU01BTExfSUNPTi5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCBKU1AxMlRMRE5hbWVzLkxBUkdFX0lDT04uZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCWlmIChzbWFsbEljb25VUkwgIT0gbnVsbCkgewotCQkJCXJldHVybiBzbWFsbEljb25VUkw7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0T3duZXJEb2N1bWVudCgpLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc21hbGxJY29uLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U21hbGxJY29uKCkgewotCQlyZXR1cm4gc21hbGxJY29uOwotCX0KLQotCVN0cmluZyBnZXRTbWFsbEljb25VUkwoKSB7Ci0JCXJldHVybiBzbWFsbEljb25VUkw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgWFBhdGggb2YgdGhpcyBlbGVtZW50IChjdXJyZW50bHkganVzdCByZXR1cm5zIHRoZSBub2RlCi0JICogbmFtZSkKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3BlYygpIHsKLQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWdjbGFzcygpIHsKLQkJcmV0dXJuIHRhZ2NsYXNzOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdGFnaW5mbyBmb3IgdGhpcyBjdXJyZW50IGVsZW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0YWdpbmZvIGlmIGl0IGV4aXN0cywgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRUYWdJbmZvKCkgewotCQlpZiAoZ2V0T3duZXJEb2N1bWVudCgpLnN1cHBvcnRzKCJhbm5vdGF0aW9uTWFwIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJQW5ub3RhdGlvbk1hcCBtYXAgPSAoQW5ub3RhdGlvbk1hcCkgZ2V0T3duZXJEb2N1bWVudCgpLmdldFByb3BlcnR5KCJhbm5vdGF0aW9uTWFwIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBzcGVjID0gZ2V0U3BlYygpOwotCQkJU3RyaW5nIHJlc3VsdCA9IG1hcC5nZXRQcm9wZXJ0eShzcGVjLCAidGFnSW5mbyIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gcmVzdWx0OwotCQkJLy8gYnVnODgzMzYgbm8gbmVlZCB0byByZXN0b3JlIG1hcmtlcnMKLQkJCS8vIHJldHVybiBTdHJpbmdVdGlscy5yZXN0b3JlTWFya2VycyhyZXN1bHQpOyAvLyByZXR1cm4gdGFnIGluZm8KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRlaWNsYXNzKCkgewotCQlyZXR1cm4gdGVpY2xhc3M7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdmFyaWFibGVzLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRWYXJpYWJsZXMoKSB7Ci0JCWlmICh2YXJpYWJsZXMgPT0gbnVsbCkgewotCQkJdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiB2YXJpYWJsZXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0JvZHljb250ZW50Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9keWNvbnRlbnQoU3RyaW5nIG5ld0JvZHljb250ZW50KSB7Ci0JCWJvZHljb250ZW50ID0gbmV3Qm9keWNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBUaGUgZGVzY3JpcHRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkaXNwbGF5TmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzcGxheU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBkaXNwbGF5TmFtZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgZGlzcGxheU5hbWUpIHsKLQkJdGhpcy5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBleGFtcGxlCi0JICogICAgICAgICAgICBUaGUgZXhhbXBsZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhhbXBsZShTdHJpbmcgZXhhbXBsZSkgewotCQlmRXhhbXBsZSA9IGV4YW1wbGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFyZ2VJY29uLgotCSAqIAotCSAqIEBwYXJhbSBsYXJnZUljb24KLQkgKiAgICAgICAgICAgIFRoZSBsYXJnZUljb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGFyZ2VJY29uKFN0cmluZyBsYXJnZUljb24pIHsKLQkJdGhpcy5sYXJnZUljb24gPSBsYXJnZUljb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm9kZU5hbWUoU3RyaW5nIHN0cmluZykgewotCQlub2RlTmFtZSA9IHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGggdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJZlBhdGggPSBwYXRoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNtYWxsSWNvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc21hbGxJY29uCi0JICogICAgICAgICAgICBUaGUgc21hbGxJY29uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNtYWxsSWNvbihTdHJpbmcgc21hbGxJY29uKSB7Ci0JCXRoaXMuc21hbGxJY29uID0gc21hbGxJY29uOwotCX0KLQotCXZvaWQgc2V0U21hbGxJY29uVVJMKFN0cmluZyB1cmwpIHsKLQkJc21hbGxJY29uVVJMID0gdXJsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdUYWdjbGFzcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZ2NsYXNzKFN0cmluZyBuZXdUYWdjbGFzcykgewotCQl0YWdjbGFzcyA9IG5ld1RhZ2NsYXNzOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdUYWdjbGFzcwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZ1NvdXJjZShTdHJpbmcgc291cmNlS2luZCkgewotCQlmVGFnU291cmNlID0gc291cmNlS2luZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGVpY2xhc3MKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZWljbGFzcyhTdHJpbmcgbmV3VGVpY2xhc3MpIHsKLQkJdGVpY2xhc3MgPSBuZXdUZWljbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YXJpYWJsZXMuCi0JICogCi0JICogQHBhcmFtIHZhcmlhYmxlcwotCSAqICAgICAgICAgICAgVGhlIHZhcmlhYmxlcyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZXMoTGlzdCB2YXJpYWJsZXMpIHsKLQkJdGhpcy52YXJpYWJsZXMgPSB2YXJpYWJsZXM7Ci0JfQotCi0JLyoqCi0JICogc3VwcG9ydHMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBDTU5vZGUgc3VwcG9ydHMgYSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWUgPT0gbnVsbCB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKCJ0YWdJbmZvIikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFRMRERvY3VtZW50LkNNX0tJTkQpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhUTERFbGVtZW50RGVjbGFyYXRpb24uVEFHX1NPVVJDRSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCAiICsgc3VwZXIudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBuYW1lOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0Tm9kZU5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgdGFnIGNsYXNzOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0VGFnY2xhc3MoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgdGVpIGNsYXNzOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0VGVpY2xhc3MoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgYm9keSBjb250ZW50OiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0Qm9keWNvbnRlbnQoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgZGVzY3JpcHRpb24gKGluZm8pOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0RGVzY3JpcHRpb24oKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgYXR0cmlidXRlczoiKTsgLy8kTk9OLU5MUy0xJAotCQlDTU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZ2V0QXR0cmlidXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZCgiXG5cdFx0IiArIFN0cmluZ1V0aWxzLnJlcGxhY2UoYXR0cmlidXRlcy5pdGVtKGkpLnRvU3RyaW5nKCksICJcbiIsICJcblx0XHQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCB2YXJpYWJsZXM6Iik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRWYXJpYWJsZXMoKS5zaXplKCk7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZCgiXG5cdFx0IiArIFN0cmluZ1V0aWxzLnJlcGxhY2UoZ2V0VmFyaWFibGVzKCkuZ2V0KGkpLnRvU3RyaW5nKCksICJcbiIsICJcblx0XHQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wb3J0KCkgewotCQlyZXR1cm4gZkltcG9ydDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNjcmlwdGluZ0xhbmd1YWdlKCkgewotCQlyZXR1cm4gZlNjcmlwdGluZ0xhbmd1YWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RHluYW1pY0F0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBmRHluYW1pY0F0dHJpYnV0ZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW1wb3J0KFN0cmluZyBpbXBvcnQxKSB7Ci0JCWZJbXBvcnQgPSBpbXBvcnQxOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNjcmlwdGluZ0xhbmd1YWdlKFN0cmluZyBzY3JpcHRpbmdMYW5ndWFnZSkgewotCQlmU2NyaXB0aW5nTGFuZ3VhZ2UgPSBzY3JpcHRpbmdMYW5ndWFnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREeW5hbWljQXR0cmlidXRlcyhTdHJpbmcgZHluYW1pY0F0dHJpYnV0ZXMpIHsKLQkJZkR5bmFtaWNBdHRyaWJ1dGVzID0gZHluYW1pY0F0dHJpYnV0ZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJc0VMSWdub3JlZCgpIHsKLQkJcmV0dXJuIGZJc0VMSWdub3JlZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VFbmNvZGluZygpIHsKLQkJcmV0dXJuIGZQYWdlRW5jb2Rpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXNFTElnbm9yZWQoU3RyaW5nIGlzRUxJZ25vcmVkKSB7Ci0JCWZJc0VMSWdub3JlZCA9IGlzRUxJZ25vcmVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhZ2VFbmNvZGluZyhTdHJpbmcgcGFnZUVuY29kaW5nKSB7Ci0JCWZQYWdlRW5jb2RpbmcgPSBwYWdlRW5jb2Rpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvblN0cmluZygpIHsKLQkJaWYgKGZMb2NhdGlvblN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuICgoQ01Eb2N1bWVudEltcGwpIGZPd25lckRvY3VtZW50KS5nZXRMb2NhdGlvblN0cmluZygpOwotCQlyZXR1cm4gZkxvY2F0aW9uU3RyaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uU3RyaW5nKFN0cmluZyB1cmwpIHsKLQkJZkxvY2F0aW9uU3RyaW5nID0gdXJsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTU5hbWVkTm9kZU1hcEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTU5hbWVkTm9kZU1hcEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhmMzc4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi1wdWJsaWMgY2xhc3MgQ01OYW1lZE5vZGVNYXBJbXBsIGltcGxlbWVudHMgQ01OYW1lZE5vZGVNYXAgewotCi0JcHVibGljIHN0YXRpYyBDTU5hbWVkTm9kZU1hcEltcGwgRU1QVFlfTkFNRURfTk9ERV9NQVAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JcHJvdGVjdGVkIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotCS8qKgotCSAqIENNTmFtZWROb2RlTWFwSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JSGFzaHRhYmxlIGdldEhhc2h0YWJsZSgpIHsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGFibGUuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIGdldE5hbWVkSXRlbSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZQotCSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKENNTm9kZSkgdGFibGUuZ2V0KG5hbWUpOwotCX0KLQotCS8qKgotCSAqIGl0ZW0gbWV0aG9kCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJaW50IHNpemUgPSB0YWJsZS5zaXplKCk7Ci0JCWlmIChpbmRleCA8IHNpemUpIHsKLQkJCUl0ZXJhdG9yIHZhbHVlcyA9IGl0ZXJhdG9yKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8PSBpbmRleDsgaSsrKSB7Ci0JCQkJcmVzdWx0ID0gdmFsdWVzLm5leHQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKENNTm9kZSkgcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRhYmxlLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZWRJdGVtIG1ldGhvZAotCSAqIEByZXR1cm4KLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGFOb2RlIENNTm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWVkSXRlbShTdHJpbmcgbmFtZSwgQ01Ob2RlIGFOb2RlKSB7Ci0JCWlmIChuYW1lICE9IG51bGwgJiYgYU5vZGUgIT0gbnVsbCkKLQkJCXRhYmxlLnB1dChuYW1lLCBhTm9kZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNTm9kZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01Ob2RlTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4YzYxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01Ob2RlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDTU5vZGVMaXN0SW1wbCBpbXBsZW1lbnRzIENNTm9kZUxpc3QgewotCXN0YXRpYyBDTU5vZGVMaXN0SW1wbCBFTVBUWV9OT0RFX0xJU1QgPSBuZXcgQ01Ob2RlTGlzdEltcGwoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7Ci0JcHJvdGVjdGVkIExpc3QgbGlzdDsKLQotCXB1YmxpYyBDTU5vZGVMaXN0SW1wbCgpIHsKLQkJdGhpcyhuZXcgQXJyYXlMaXN0KCkpOwotCX0KLQotCXB1YmxpYyBDTU5vZGVMaXN0SW1wbChMaXN0IGxpc3QpIHsKLQkJdGhpcy5saXN0ID0gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhcHBlbmRJdGVtKENNTm9kZSBub2RlKSB7Ci0JCWxpc3QuYWRkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gbGlzdC5zaXplKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TGlzdCgpIHsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogaXRlbSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZQotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCXJldHVybiAoQ01Ob2RlKSBsaXN0LmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbGlzdC5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERDTURvY3VtZW50TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRENNRG9jdW1lbnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZGEzYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRENNRG9jdW1lbnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuVGFnbGliQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMVRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDEyVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMjBUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTEREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkRlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLlByb3BlcnR5R3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDEyTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsLkZhY2V0TW9kdWxlQ29yZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWwuRmlsZUNvbnRlbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5aZXJvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSUphclJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUTERSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnRGlyUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRhZ2xpYkluZGV4RGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnbGliSW5kZXhMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUYWdsaWJSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVVJMUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuVGFnbGliSW5kZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuVGFnTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIFRMRENNRG9jdW1lbnRNYW5hZ2VyIGltcGxlbWVudHMgSVRhZ2xpYkluZGV4TGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIGNsYXNzIERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgaW1wbGVtZW50cyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyLCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uIHsKLQkJLyoqCi0JCSAqIEFkZHMgYSBibG9jayB0YWduYW1lIChmdWxseSBuYW1lc3BhY2UgcXVhbGlmaWVkKSBpbnRvIHRoZSBsaXN0IG9mCi0JCSAqIGJsb2NrIHRhZyBuYW1lcyBmb3IgdGhlIHBhcnNlci4gVGhlIG1hcmtlcgotCQkgKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFsb25nIHdpdGggcG9zaXRpb24gY3VlcyBkdXJpbmcgcmVwYXJzZXMKLQkJICogYWxsb3cgdGhlIEpTUFNvdXJjZVBhcnNlciB0byBlbmFibGUvaWdub3JlIHRoZSB0YWdzIGFzIGJsb2Nrcy4KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGFkZEJsb2NrVGFnKFN0cmluZyB0YWduYW1lTlMsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBtYXJrZXIpIHsKLQkJCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWlmIChnZXRQYXJzZXIoKS5nZXRCbG9ja01hcmtlcih0YWduYW1lTlMpID09IG51bGwpIHsKLQkJCQlnZXRQYXJzZXIoKS5hZGRCbG9ja01hcmtlcihuZXcgQmxvY2tNYXJrZXIodGFnbmFtZU5TLCBtYXJrZXIsIERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCwgdHJ1ZSwgZmFsc2UpKTsKLQkJCQlpZiAoX2RlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVExEQ01Eb2N1bWVudE1hbmFnZXIgYWRkZWQgYmxvY2sgbWFya2VyOiAiICsgdGFnbmFtZU5TICsgIkAiICsgbWFya2VyLmdldFN0YXJ0T2Zmc2V0KCkpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGFkZFRhZ2xpYlRyYWNrZXIoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIENNRG9jdW1lbnQgdGxkQ01Eb2N1bWVudCkgewotCQkJZ2V0VGFnbGliVHJhY2tlcnMoKS5hZGQobmV3IFRhZ2xpYlRyYWNrZXIodXJpLCBwcmVmaXgsIHRsZENNRG9jdW1lbnQsIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEVuYWJsZXMgYSBUTEQgb3duaW5nIHRoZSBnaXZlbiBwcmVmaXggbG9hZGVkIGZyb20gdGhlIGdpdmVuIFVSSSBhdAotCQkgKiB0aGUgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLiBUaGUgbGlzdCBvZgotCQkgKiBhZGRpdGlvbmFsQ01Eb2N1bWVudHMgd2lsbCBjbGFpbSB0byBub3Qga25vdyBhbnkgb2YgaXRzIHRhZ3MgYXQKLQkJICogcG9zaXRpb25zIGVhcmxpZXIgdGhhbiB0aGF0IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ncyBwb3NpdGlvbi4KLQkJICogCi0JCSAqIEZvciB0YWdsaWIgZGlyZWN0aXZlcywgdGhlIHRhZ2xpYiBpcyB0aGUgYW5jaG9yIHdoaWxlIHRhZ2xpYnMKLQkJICogcmVnaXN0ZXJlZCB0aHJvdWdoIGluY2x1ZGUgZGlyZWN0aXZlcyB1c2UgdGhlIHBhcmVudCBkb2N1bWVudCdzCi0JCSAqIGluY2x1ZGUgZGlyZWN0aXZlIGFzIHRoZWlyIGFuY2hvci4KLQkJICogCi0JCSAqIEBwYXJhbSBwcmVmaXgKLQkJICogQHBhcmFtIHVyaQotCQkgKiBAcGFyYW0gYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVUYWdsaWJGcm9tVVJJKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmksIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQllbmFibGVUYWdzKHByZWZpeCwgdXJpLCBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJaWYgKF9kZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVExEQ01Eb2N1bWVudE1hbmFnZXIgcmVnaXN0ZXJlZCBhIHRyYWNrZXIgZm9yICIgKyB1cmkgKyAiIHdpdGggcHJlZml4ICIgKyBwcmVmaXgpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGVuYWJsZVRhZ3MoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCWlmIChwcmVmaXggPT0gbnVsbCB8fCB1cmkgPT0gbnVsbCB8fCBiYW5uZWRQcmVmaXhlcy5jb250YWlucyhwcmVmaXgpKQotCQkJCXJldHVybjsKLQkJCS8vIFRyeSB0byBsb2FkIHRoZSBDTURvY3VtZW50IGZvciB0aGlzIFVSSQotCQkJQ01Eb2N1bWVudCB0bGQgPSBnZXRDTURvY3VtZW50KHVyaSk7Ci0JCQlpZiAodGxkID09IG51bGwgfHwgISh0bGQgaW5zdGFuY2VvZiBUTEREb2N1bWVudCkpIHsKLQkJCQlpZiAoX2RlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVExEQ01Eb2N1bWVudE1hbmFnZXIgZmFpbGVkIHRvIGNyZWF0ZSBhIENNRG9jdW1lbnQgZm9yICIgKyB1cmkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCXJlZ2lzdGVyVGFnbGliKHByZWZpeCwgdXJpLCBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHRsZCk7Ci0JCX0KLQotCQkvKioKLQkJICogRW5hYmxlcyBhIFRMRCBvd25pbmcgdGhlIGdpdmVuIHByZWZpeCBsb2FkZWQgZnJvbSB0aGUgZ2l2ZW4gVVJJIGF0Ci0JCSAqIHRoZSBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uIFRoZSBsaXN0IG9mCi0JCSAqIGFkZGl0aW9uYWxDTURvY3VtZW50cyB3aWxsIGNsYWltIHRvIG5vdCBrbm93IGFueSBvZiBpdHMgdGFncyBhdAotCQkgKiBwb3NpdGlvbnMgZWFybGllciB0aGFuIHRoYXQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbidzIHBvc2l0aW9uLgotCQkgKiAKLQkJICogRm9yIHRhZ2xpYiBkaXJlY3RpdmVzLCB0aGUgdGFnbGliIGlzIHRoZSBhbmNob3Igd2hpbGUgdGFnbGlicwotCQkgKiByZWdpc3RlcmVkIHRocm91Z2ggaW5jbHVkZSBkaXJlY3RpdmVzIHVzZSB0aGUgcGFyZW50IGRvY3VtZW50J3MKLQkJICogaW5jbHVkZSBkaXJlY3RpdmUgYXMgdGhlaXIgYW5jaG9yLgotCQkgKiAKLQkJICogQHBhcmFtIHByZWZpeAotCQkgKiBAcGFyYW0gdXJpCi0JCSAqIEBwYXJhbSB0YWdsaWJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGVuYWJsZVRhZ3NJbkRpcihTdHJpbmcgcHJlZml4LCBTdHJpbmcgdGFnZGlyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJZW5hYmxlVGFncyhwcmVmaXgsIHRhZ2RpciwgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCWlmIChfZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnRNYW5hZ2VyIHJlZ2lzdGVyZWQgYSB0cmFja2VyIGZvciBkaXJlY3RvcnkiICsgdGFnZGlyICsgIiB3aXRoIHByZWZpeCAiICsgcHJlZml4KTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1JlZ2lvbkNvbGxlY3Rpb24oSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbkNvbGxlY3Rpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBKU1BTb3VyY2VQYXJzZXIgdGV4dFNvdXJjZSkgewotCQkJLyoKLQkJCSAqIFdvdWxkIHRlc3QgPiAxLCBidXQgc2luY2Ugd2Ugb25seSBjYXJlIGlmIHRoZXJlIGFyZSA4ICg8JUAsCi0JCQkgKiB0YWdsaWIsIHVyaSwgPSwgd2hlcmUsIHByZWZpeCwgPSwgd2hhdCkgW29yIDQgZm9yIGluY2x1ZGUKLQkJCSAqIGRpcmVjdGl2ZXNdCi0JCQkgKi8KLQkJCWlmIChyZWdpb25Db2xsZWN0aW9uLmdldE51bWJlck9mUmVnaW9ucygpID4gNCAmJiByZWdpb25Db2xsZWN0aW9uLmdldFJlZ2lvbnMoKS5nZXQoMSkuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCUlUZXh0UmVnaW9uIG5hbWUgPSByZWdpb25Db2xsZWN0aW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQkJYm9vbGVhbiB0YWdsaWJEZXRlY3RlZCA9IGZhbHNlOwotCQkJCWJvb2xlYW4gdGFnbGliRGlyZWN0aXZlRGV0ZWN0ZWQgPSBmYWxzZTsKLQkJCQlib29sZWFuIGluY2x1ZGVEZXRlY3RlZCA9IGZhbHNlOwotCQkJCWJvb2xlYW4gaW5jbHVkZURpcmVjdGl2ZURldGVjdGVkID0gZmFsc2U7Ci0JCQkJaW50IHN0YXJ0T2Zmc2V0ID0gcmVnaW9uQ29sbGVjdGlvbi5nZXRTdGFydE9mZnNldChuYW1lKTsKLQkJCQlpbnQgdGV4dExlbmd0aCA9IG5hbWUuZ2V0VGV4dExlbmd0aCgpOwotCi0JCQkJdGFnbGliRGV0ZWN0ZWQgPSB0ZXh0U291cmNlLnJlZ2lvbk1hdGNoZXMoc3RhcnRPZmZzZXQsIHRleHRMZW5ndGgsIEpTUDEyVExETmFtZXMuVEFHTElCKTsKLQkJCQlpZiAoIXRhZ2xpYkRldGVjdGVkKQotCQkJCQl0YWdsaWJEaXJlY3RpdmVEZXRlY3RlZCA9IHRleHRTb3VyY2UucmVnaW9uTWF0Y2hlcyhzdGFydE9mZnNldCwgdGV4dExlbmd0aCwgSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQik7Ci0JCQkJaWYgKCF0YWdsaWJEaXJlY3RpdmVEZXRlY3RlZCkKLQkJCQkJaW5jbHVkZURldGVjdGVkID0gdGV4dFNvdXJjZS5yZWdpb25NYXRjaGVzKHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoLCBKU1AxMlRMRE5hbWVzLklOQ0xVREUpOwotCQkJCWlmICghaW5jbHVkZURldGVjdGVkKQotCQkJCQlpbmNsdWRlRGlyZWN0aXZlRGV0ZWN0ZWQgPSB0ZXh0U291cmNlLnJlZ2lvbk1hdGNoZXMoc3RhcnRPZmZzZXQsIHRleHRMZW5ndGgsIEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9JTkNMVURFKTsKLQkJCQlpZiAodGFnbGliRGV0ZWN0ZWQgfHwgdGFnbGliRGlyZWN0aXZlRGV0ZWN0ZWQpIHsKLQkJCQkJcHJvY2Vzc1RhZ2xpYihyZWdpb25Db2xsZWN0aW9uLCBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHRleHRTb3VyY2UpOwotCQkJCX0KLQkJCQllbHNlIGlmIChpbmNsdWRlRGV0ZWN0ZWQgfHwgaW5jbHVkZURpcmVjdGl2ZURldGVjdGVkKSB7Ci0JCQkJCXByb2Nlc3NJbmNsdWRlKHJlZ2lvbkNvbGxlY3Rpb24sIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgdGV4dFNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uQ29sbGVjdGlvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDEgJiYgRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4uZXF1YWxzKHJlZ2lvbkNvbGxlY3Rpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkpKSB7Ci0JCQkJcHJvY2Vzc1hNTFN0YXJ0VGFnKHJlZ2lvbkNvbGxlY3Rpb24sIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgdGV4dFNvdXJjZSk7Ci0JCQl9CQkJCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBub2RlUGFyc2VkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQlpZiAoIXByZWx1ZGVzSGFuZGxlZCkgewotCQkJCWhhbmRsZVByZWx1ZGVzKCk7Ci0JCQkJcHJlbHVkZXNIYW5kbGVkID0gdHJ1ZTsKLQkJCX0KLQkJCXByb2Nlc3NSZWdpb25Db2xsZWN0aW9uKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBnZXRQYXJzZXIoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUHJvY2VzcyBhbiBpbmNsdWRlIGRpcmVjdGl2ZSBmb3VuZCBieSB0aGUgdGV4dFNvdXJjZSBwYXJzZXIgYW5kCi0JCSAqIGFuY2hvciBhbnkgdGFnbGlicyBmb3VuZCB3aXRoaW4gYXQgdGhlCi0JCSAqIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi4gSW5jbHVkZXMgdXNlIHRoZSBpbmNsdWRpbmcgZmlsZSBhcwotCQkgKiB0aGUgcG9pbnQgb2YgcmVmZXJlbmNlLCBub3QgbmVjZXNzYXJpbHkgdGhlICJ0b3AiIGZpbGUuCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSW5jbHVkZShJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gaW5jbHVkZURpcmVjdGl2ZUNvbGxlY3Rpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBKU1BTb3VyY2VQYXJzZXIgdGV4dFNvdXJjZSkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBpbmNsdWRlRGlyZWN0aXZlQ29sbGVjdGlvbi5nZXRSZWdpb25zKCk7Ci0JCQlTdHJpbmcgaW5jbHVkZWRGaWxlID0gbnVsbDsKLQkJCWJvb2xlYW4gaXNGaWxlbmFtZSA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlmb3IgKGludCBpID0gMjsgaW5jbHVkZWRGaWxlID09IG51bGwgJiYgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCQkJaWYgKHRleHRTb3VyY2UucmVnaW9uTWF0Y2hlcyhpbmNsdWRlRGlyZWN0aXZlQ29sbGVjdGlvbi5nZXRTdGFydE9mZnNldChyZWdpb24pLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBKU1AxMlRMRE5hbWVzLkZJTEUpKSB7Ci0JCQkJCQkJaXNGaWxlbmFtZSA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlpc0ZpbGVuYW1lID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNGaWxlbmFtZSAmJiByZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCWluY2x1ZGVkRmlsZSA9IHRleHRTb3VyY2UuZ2V0VGV4dChpbmNsdWRlRGlyZWN0aXZlQ29sbGVjdGlvbi5nZXRTdGFydE9mZnNldChyZWdpb24pLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQkJCWlzRmlsZW5hbWUgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNpb29iRXhjKSB7Ci0JCQkJLy8gbm90aGluZyB0byBiZSBkb25lCi0JCQkJaW5jbHVkZWRGaWxlID0gbnVsbDsKLQkJCX0KLQotCQkJaWYgKGZQcm9jZXNzSW5jbHVkZXMgJiYgaW5jbHVkZWRGaWxlICE9IG51bGwpIHsKLQkJCQkvLyBzdHJpcCBhbnkgZXh0cmFuZW91cyBxdW90ZXMgYW5kIHdoaXRlIHNwYWNlCi0JCQkJaW5jbHVkZWRGaWxlID0gU3RyaW5nVXRpbHMuc3RyaXAoaW5jbHVkZWRGaWxlKS50cmltKCk7Ci0JCQkJSVBhdGggZmlsZVBhdGggPSBudWxsOwotCQkJCS8qCi0JCQkJICogVGhlIHJlc29sdXRpb24gb2YgdGhlIGluY2x1ZGVkIGZyYWdtZW50IHNob3VsZCB1c2UgdGhlIGZpbGUKLQkJCQkgKiBjb250YWluaW5nIHRoZSBkaXJlY3RpdmUgYXMgdGhlIGJhc2UgcmVmZXJlbmNlLCBub3QgYWx3YXlzCi0JCQkJICogdGhlIG1haW4gSlNQIGJlaW5nIGludm9rZWQuIFZlcmlmaWVkIGJlaGF2aW9yIHdpdGggQXBhY2hlCi0JCQkJICogVG9tY2F0IDUuNS4yMC4KLQkJCQkgKi8KLQkJCQlJUGF0aCBtb2RlbEJhc2VMb2NhdGlvbiA9IFRhZ2xpYkNvbnRyb2xsZXIuZ2V0TG9jYXRpb24oVExEQ01Eb2N1bWVudE1hbmFnZXIudGhpcyk7Ci0JCQkJaWYobW9kZWxCYXNlTG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQlpZiAoZ2V0SW5jbHVkZXMoKS5pc0VtcHR5KCkpCi0JCQkJCQlmaWxlUGF0aCA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQucmVzb2x2ZShtb2RlbEJhc2VMb2NhdGlvbiwgaW5jbHVkZWRGaWxlKTsKLQkJCQkJZWxzZQotCQkJCQkJZmlsZVBhdGggPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LnJlc29sdmUoKElQYXRoKSBnZXRJbmNsdWRlcygpLnBlZWsoKSwgaW5jbHVkZWRGaWxlKTsKLQkJCQl9Ci0KLQkJCQkvLyBjaGVjayBmb3IgImxvb3BzIgotCQkJCWlmIChmaWxlUGF0aCAhPSBudWxsICYmICFnZXRJbmNsdWRlcygpLmNvbnRhaW5zKGZpbGVQYXRoKSAmJiAhZmlsZVBhdGguZXF1YWxzKG1vZGVsQmFzZUxvY2F0aW9uKSkgewotCQkJCQkvKgotCQkJCQkgKiBQcmV2ZW50IHNsb3cgcGVyZm9ybWFuY2Ugd2hlbiBlZGl0aW5nIHNjcmlwdGxldCBwYXJ0IG9mCi0JCQkJCSAqIHRoZSBKU1AgYnkgb25seSBwcm9jZXNzaW5nIGluY2x1ZGVzIGlmIHRoZXkndmUgYmVlbgotCQkJCQkgKiBtb2RpZmllZC4gVGhlIEluY2x1ZGVIZWxwZXIgcmVtZW1iZXJzIGFueSBDTURvY3VtZW50cwotCQkJCQkgKiBjcmVhdGVkIGZyb20gdGhlIGZpbGVzIGl0IHBhcnNlcy4gQ2FjaGluZyB0aGUgVVJJIGFuZAotCQkJCQkgKiBwcmVmaXgvdGFnZGlyIGFsbG93cyB1cyB0byBqdXN0IGVuYWJsZSB0aGUgQ01Eb2N1bWVudAotCQkJCQkgKiB3aGVuIHRoZSBwcmV2aW91c2x5IHBhcnNlZCBmaWxlcy4KLQkJCQkJICogCi0JCQkJCSAqIFJFTUFJTklORyBQUk9CTEVNOiBmVExEQ01SZWZlcmVuY2VzTWFwIGRvZXMgbm90IG1hcAotCQkJCQkgKiBmcm9tIGEgZnJhZ21lbnQncyBwYXRoIGFuZCBhbHNvIGluY2x1ZGUgYWxsIG9mIHRoZSBDTQotCQkJCQkgKiByZWZlcmVuY2VzIGluIGZyYWdtZW50cyB0aGF0ICppdCogaW5jbHVkZXMuIFRoZQotCQkJCQkgKiBmcmFnbWVudHMgdGhhdCBpdCBpbmNsdWRlcyB3b24ndCBoYXZlIGl0cyBDTSByZWZlcmVuY2VzCi0JCQkJCSAqIGxvYWRlZCwgYnV0IHRoZW4gd2UnZCBuZWVkIHRvIHJlY29yZCB0aGUgVVJJIGFuZAotCQkJCQkgKiBsb2NhdGlvbiBvZiB0aGUgaW5jbHVkZWQgZnJhZ21lbnQgdG8gcmVzb2x2ZSB0aGVtCi0JCQkJCSAqIGNvcnJlY3RseSwgbW9kaWZ5aW5nIGVuYWJsZVRhZ2xpYigpIHRvIGFsc28gdGFrZSBhIGJhc2UKLQkJCQkJICogcGF0aCBhbmQgcmVzb2x2ZSB0aGUgVVJJIGFwcHJvcHJpYXRlbHkuCi0JCQkJCSAqLwotCQkJCQlpZiAoaGFzQW55SW5jbHVkZUJlZW5Nb2RpZmllZChmaWxlUGF0aCkpIHsKLQkJCQkJCWdldEluY2x1ZGVzKCkucHVzaChmaWxlUGF0aCk7Ci0KLQkJCQkJCUluY2x1ZGVIZWxwZXIgaW5jbHVkZUhlbHBlciA9IG5ldyBJbmNsdWRlSGVscGVyKGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgZ2V0UGFyc2VyKCkpOwotCQkJCQkJaW5jbHVkZUhlbHBlci5wYXJzZShmaWxlUGF0aCk7Ci0JCQkJCQlMaXN0IHJlZmVyZW5jZXMgPSBpbmNsdWRlSGVscGVyLnRhZ2xpYlJlZmVyZW5jZXM7Ci0JCQkJCQlmVExEQ01SZWZlcmVuY2VzTWFwLnB1dChmaWxlUGF0aCwgcmVmZXJlbmNlcyk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgcmVmZXJlbmNlcyAhPSBudWxsICYmIGkgPCByZWZlcmVuY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJVExEQ01Eb2N1bWVudFJlZmVyZW5jZSByZWZlcmVuY2UgPSAoVExEQ01Eb2N1bWVudFJlZmVyZW5jZSkgcmVmZXJlbmNlcy5nZXQoaSk7Ci0JCQkJCQkJZ2V0UGFyc2VyKCkuYWRkTmVzdGFibGVQcmVmaXgobmV3IFRhZ01hcmtlcihyZWZlcmVuY2UucHJlZml4ICsgIjoiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCS8qCi0JCQkJCQkgKiBUT0RPOiB3YWxrIHVwIHRoZSBpbmNsdWRlIGhpZXJhcmNoeSBhbmQgYWRkCi0JCQkJCQkgKiB0aGVzZSByZWZlcmVuY2VzIHRvIGVhY2ggb2YgdGhlIHBhcmVudHM/Ci0JCQkJCQkgKi8KLQotCQkJCQkJZ2V0SW5jbHVkZXMoKS5wb3AoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIEFkZCBmcm9tIHRoYXQgc2F2ZWQgbGlzdCBvZiB1cmlzL3ByZWZpeGVzL2RvY3VtZW50cwotCQkJCQkJTGlzdCByZWZlcmVuY2VzID0gKExpc3QpIGZUTERDTVJlZmVyZW5jZXNNYXAuZ2V0KGZpbGVQYXRoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyByZWZlcmVuY2VzICE9IG51bGwgJiYgaSA8IHJlZmVyZW5jZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQlUTERDTURvY3VtZW50UmVmZXJlbmNlIHJlZmVyZW5jZSA9IChUTERDTURvY3VtZW50UmVmZXJlbmNlKSByZWZlcmVuY2VzLmdldChpKTsKLQkJCQkJCQkvKgotCQkJCQkJCSAqIFRoZSB1cmkgbWlnaHQgbm90IGJlIHJlc29sdmVkIHByb3Blcmx5IGlmCi0JCQkJCQkJICogcmVsYXRpdmUgdG8gdGhlIEpTUCBmcmFnbWVudC4KLQkJCQkJCQkgKi8KLQkJCQkJCQllbmFibGVUYWdsaWJGcm9tVVJJKHJlZmVyZW5jZS5wcmVmaXgsIHJlZmVyZW5jZS51cmksIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJZ2V0UGFyc2VyKCkuYWRkTmVzdGFibGVQcmVmaXgobmV3IFRhZ01hcmtlcihyZWZlcmVuY2UucHJlZml4ICsgIjoiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChnZXRJbmNsdWRlcygpLmNvbnRhaW5zKGZpbGVQYXRoKSkgewotCQkJCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxPT1AgSU4gQElOQ0xVREVTIEZPVU5EOiAiICsgZmlsZVBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1hNTFN0YXJ0VGFnKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBzdGFydFRhZ1JlZ2lvbkNvbGxlY3Rpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBKU1BTb3VyY2VQYXJzZXIgdGV4dFNvdXJjZSkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdGFydFRhZ1JlZ2lvbkNvbGxlY3Rpb24uZ2V0UmVnaW9ucygpOwotCQkJU3RyaW5nIHVyaSA9IG51bGw7Ci0JCQlTdHJpbmcgcHJlZml4ID0gbnVsbDsKLQkJCWJvb2xlYW4gaXNUYWdsaWJWYWx1ZSA9IGZhbHNlOwotCQkJLy8gc2tpcCB0aGUgZmlyc3QgdHdvLCB0aGV5J3JlIHRoZSBvcGVuIGJyYWNrZXQgYW5kIG5hbWUKLQkJCWZvciAoaW50IGkgPSAyOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHsKLQkJCQkJLy8gSGFuZGxlIG5lc3RlZCBkaXJlY3RpdmVzCi0JCQkJCXByb2Nlc3NSZWdpb25Db2xsZWN0aW9uKChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHJlZ2lvbiwgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCB0ZXh0U291cmNlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIEhhbmRsZSB4bWxuczp4eHg9eXl5Ci0JCQkJCWludCByZWdpb25TdGFydE9mZnNldCA9IHN0YXJ0VGFnUmVnaW9uQ29sbGVjdGlvbi5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQlpbnQgcmVnaW9uVGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCQkJaWYgKHJlZ2lvblRleHRMZW5ndGggPiBYTUxOU19MRU5HVEggJiYgdGV4dFNvdXJjZS5yZWdpb25NYXRjaGVzKHJlZ2lvblN0YXJ0T2Zmc2V0LCBYTUxOU19MRU5HVEgsIFhNTE5TKSkgewotCQkJCQkJCXByZWZpeCA9IHRleHRTb3VyY2UuZ2V0VGV4dChyZWdpb25TdGFydE9mZnNldCArIFhNTE5TX0xFTkdUSCwgcmVnaW9uVGV4dExlbmd0aCAtIFhNTE5TX0xFTkdUSCk7Ci0JCQkJCQkJaWYgKCFiYW5uZWRQcmVmaXhlcy5jb250YWlucyhwcmVmaXgpKQotCQkJCQkJCQlpc1RhZ2xpYlZhbHVlID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXByZWZpeCA9IG51bGw7Ci0JCQkJCQkJaXNUYWdsaWJWYWx1ZSA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzVGFnbGliVmFsdWUgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgewotCQkJCQkJCXVyaSA9IHRleHRTb3VyY2UuZ2V0VGV4dChyZWdpb25TdGFydE9mZnNldCwgcmVnaW9uVGV4dExlbmd0aCk7Ci0JCQkJCQkJdXJpID0gU3RyaW5nVXRpbHMuc3RyaXAodXJpKTsKLQkJCQkJCQlpbnQgdXJpTGVuZ3RoID0gdXJpLmxlbmd0aCgpOwotCQkJCQkJCWlmICh1cmkgIT0gbnVsbCAmJiB1cmlMZW5ndGggPiAwKSB7Ci0JCQkJCQkJCWlmICh1cmlMZW5ndGggPiBVUk5fVExEX0xFTkdUSCAmJiB1cmkuc3RhcnRzV2l0aChVUk5fVExEKSkgewotCQkJCQkJCQkJdXJpID0gdXJpLnN1YnN0cmluZyhVUk5fVExEX0xFTkdUSCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSBpZiAodXJpTGVuZ3RoID4gVVJOX1RBR0RJUl9MRU5HVEggJiYgdXJpLnN0YXJ0c1dpdGgoVVJOX1RBR0RJUikpIHsKLQkJCQkJCQkJCXVyaSA9IHVyaS5zdWJzdHJpbmcoVVJOX1RBR0RJUl9MRU5HVEgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVuYWJsZVRhZ3MocHJlZml4LCB1cmksIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJCXVyaSA9IG51bGw7Ci0JCQkJCQkJCXByZWZpeCA9IG51bGw7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFB1bGxzIHRoZSBVUkkgYW5kIHByZWZpeCBmcm9tIHRoZSBnaXZlbiB0YWdsaWIgZGlyZWN0aXZlCi0JCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5kIG1ha2VzIHN1cmUgdGhlIHRhZ3MgYXJlIGtub3duLgotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1RhZ2xpYihJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gdGFnbGliRGlyZWN0aXZlQ29sbGVjdGlvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIEpTUFNvdXJjZVBhcnNlciB0ZXh0U291cmNlKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHRhZ2xpYkRpcmVjdGl2ZUNvbGxlY3Rpb24uZ2V0UmVnaW9ucygpOwotCQkJU3RyaW5nIHVyaSA9IG51bGw7Ci0JCQlTdHJpbmcgcHJlZml4ID0gbnVsbDsKLQkJCVN0cmluZyB0YWdkaXIgPSBudWxsOwotCQkJU3RyaW5nIGF0dHJOYW1lID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDI7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQkvLyByZW1lbWJlciBhdHRyaWJ1dGUgbmFtZQotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSB0YWdsaWJEaXJlY3RpdmVDb2xsZWN0aW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCWludCB0ZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCQkvLyBTdHJpbmcgbmFtZSA9IHRleHRTb3VyY2UuZ2V0VGV4dChzdGFydE9mZnNldCwKLQkJCQkJCS8vIHRleHRMZW5ndGgpOwotCQkJCQkJaWYgKHRleHRTb3VyY2UucmVnaW9uTWF0Y2hlcyhzdGFydE9mZnNldCwgdGV4dExlbmd0aCwgSlNQMTFUTEROYW1lcy5QUkVGSVgpKSB7Ci0JCQkJCQkJYXR0ck5hbWUgPSBKU1AxMVRMRE5hbWVzLlBSRUZJWDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKHRleHRTb3VyY2UucmVnaW9uTWF0Y2hlcyhzdGFydE9mZnNldCwgdGV4dExlbmd0aCwgSlNQMTJUTEROYW1lcy5VUkkpKSB7Ci0JCQkJCQkJYXR0ck5hbWUgPSBKU1AxMVRMRE5hbWVzLlVSSTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKHRleHRTb3VyY2UucmVnaW9uTWF0Y2hlcyhzdGFydE9mZnNldCwgdGV4dExlbmd0aCwgSlNQMjBUTEROYW1lcy5UQUdESVIpKSB7Ci0JCQkJCQkJYXR0ck5hbWUgPSBKU1AyMFRMRE5hbWVzLlRBR0RJUjsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWF0dHJOYW1lID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBwcm9jZXNzIHZhbHVlCi0JCQkJCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJaWYgKEpTUDExVExETmFtZXMuUFJFRklYLmVxdWFscyhhdHRyTmFtZSkpCi0JCQkJCQkJcHJlZml4ID0gU3RyaW5nVXRpbHMuc3RyaXAodGV4dFNvdXJjZS5nZXRUZXh0KHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoKSk7Ci0JCQkJCQllbHNlIGlmIChKU1AxMVRMRE5hbWVzLlVSSS5lcXVhbHMoYXR0ck5hbWUpKQotCQkJCQkJCXVyaSA9IFN0cmluZ1V0aWxzLnN0cmlwKHRleHRTb3VyY2UuZ2V0VGV4dChzdGFydE9mZnNldCwgdGV4dExlbmd0aCkpOwotCQkJCQkJZWxzZSBpZiAoSlNQMjBUTEROYW1lcy5UQUdESVIuZXF1YWxzKGF0dHJOYW1lKSkKLQkJCQkJCQl0YWdkaXIgPSBTdHJpbmdVdGlscy5zdHJpcCh0ZXh0U291cmNlLmdldFRleHQoc3RhcnRPZmZzZXQsIHRleHRMZW5ndGgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNpb29iRXhjKSB7Ci0JCQkJLy8gbm90aGluZyB0byBiZSBkb25lCi0JCQkJdXJpID0gbnVsbDsKLQkJCQlwcmVmaXggPSBudWxsOwotCQkJfQotCQkJaWYgKHVyaSAhPSBudWxsICYmIHByZWZpeCAhPSBudWxsICYmIHVyaS5sZW5ndGgoKSA+IDAgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgewotCQkJCWVuYWJsZVRhZ2xpYkZyb21VUkkocHJlZml4LCBTdHJpbmdVdGlscy5zdHJpcCh1cmkpLCBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJfQotCQkJZWxzZSBpZiAodGFnZGlyICE9IG51bGwgJiYgcHJlZml4ICE9IG51bGwgJiYgdGFnZGlyLmxlbmd0aCgpID4gMCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZW5hYmxlVGFnc0luRGlyKFN0cmluZ1V0aWxzLnN0cmlwKHByZWZpeCksIFN0cmluZ1V0aWxzLnN0cmlwKHRhZ2RpciksIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJUYWdsaWIoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIENNRG9jdW1lbnQgdGxkKSB7Ci0JCQlDTU5hbWVkTm9kZU1hcCBlbGVtZW50cyA9IHRsZC5nZXRFbGVtZW50cygpOwotCQkJLyoKLQkJCSAqIEdvIHRocm91Z2ggdGhlIENNRG9jdW1lbnQgZm9yIGFueSB0YWdzIHRoYXQgbXVzdCBiZSBtYXJrZWQgYXMKLQkJCSAqIGJsb2NrIHRhZ3Mgc3RhcnRpbmcgYXQgdGhlIGFuY2hvcmluZyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLgotCQkJICogQXMgdGhlIGRvY3VtZW50IGlzIGVkaXRlZCBhbmQgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCSAqIG1vdmVkIGFyb3VuZCwgdGhlIGJsb2NrIHRhZyBlbmFibGVtZW50IHdpbGwgYXV0b21hdGljYWxseQotCQkJICogZm9sbG93IGl0LgotCQkJICovCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlUTERFbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoVExERWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50cy5pdGVtKGkpOwotCQkJCWlmIChlZC5nZXRCb2R5Y29udGVudCgpID09IEpTUDEyVExETmFtZXMuQ09OVEVOVF9UQUdERVBFTkRFTlQpCi0JCQkJCWFkZEJsb2NrVGFnKHByZWZpeCArICI6IiArIGVkLmdldE5vZGVOYW1lKCksIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8qCi0JCQkgKiBTaW5jZSBtb2RpZmljYXRpb25zIHRvIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgYWRqYWNlbnQgdG8gYQotCQkJICogdGFnbGliIGRpcmVjdGl2ZSBjYW4gY2F1c2UgdGhhdCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRvIGJlCi0JCQkgKiByZXBvcnRlZCwgZmlsdGVyIG91dCBhbnkgZHVwbGljYXRlZCBVUklzLiBXaGVuIHRoZSB0YWdsaWIgaXMKLQkJCSAqIGFjdHVhbGx5IG1vZGlmaWVkLCBhIGZ1bGwgcmVidWlsZCB3aWxsIG9jY3VyIGFuZCBubyBkdXBsaWNhdGVzCi0JCQkgKiB3aWxsL3Nob3VsZCBiZSBmb3VuZC4KLQkJCSAqLwotCQkJYm9vbGVhbiBkb1RyYWNrID0gdHJ1ZTsKLQkJCUxpc3QgdHJhY2tlcnMgPSBnZXRUYWdsaWJUcmFja2VycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFja2Vycy5zaXplKCk7IGkrKykgewotCQkJCVRhZ2xpYlRyYWNrZXIgdHJhY2tlciA9IChUYWdsaWJUcmFja2VyKSB0cmFja2Vycy5nZXQoaSk7Ci0JCQkJaWYgKHRyYWNrZXIuZ2V0UHJlZml4KCkuZXF1YWxzKHByZWZpeCkgJiYgdHJhY2tlci5nZXRVUkkoKS5lcXVhbHModXJpKSkgewotCQkJCQlkb1RyYWNrID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRvVHJhY2spIHsKLQkJCQlhZGRUYWdsaWJUcmFja2VyKHByZWZpeCwgdXJpLCBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHRsZCk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcmVzZXRCbG9ja1RhZ3MoKSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlJdGVyYXRvciBuYW1lcyA9IGdldFBhcnNlcigpLmdldEJsb2NrTWFya2VycygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7Ci0JCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKSBuYW1lcy5uZXh0KCk7Ci0JCQkJaWYgKCFtYXJrZXIuaXNHbG9iYWwoKSAmJiBtYXJrZXIuZ2V0Q29udGV4dCgpID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJCQlpZiAoX2RlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnRNYW5hZ2VyIHJlbW92aW5nIGJsb2NrIHRhZyBuYW1lZDogIiArIG1hcmtlci5nZXRUYWdOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJbmFtZXMucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVzZXROb2RlcygpIHsKLQkJCWlmIChEZWJ1Zy5kZWJ1Z1RhZ2xpYnMpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogcmVzZXR0aW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJCWdldEluY2x1ZGVzKCkuY2xlYXIoKTsKLQkJCXJlc2V0QmxvY2tUYWdzKCk7Ci0JCQlyZXNldFRhZ2xpYlRyYWNrZXJzKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBuZXdEb2N1bWVudCkgewotCQkJQXNzZXJ0LmlzVHJ1ZShuZXdEb2N1bWVudCAhPSBudWxsLCAibnVsbCBkb2N1bWVudCIpOyAvLyROT04tTkxTLTEkCi0JCQlBc3NlcnQuaXNUcnVlKG5ld0RvY3VtZW50LmdldFBhcnNlcigpICE9IG51bGwsICJudWxsIGRvY3VtZW50IHBhcnNlciIpOyAvLyROT04tTkxTLTEkCi0JCQlBc3NlcnQuaXNUcnVlKG5ld0RvY3VtZW50LmdldFBhcnNlcigpIGluc3RhbmNlb2YgSlNQU291cmNlUGFyc2VyLCAiY2FuIG9ubHkgbGlzdGVuIHRvIGRvY3VtZW50IHdpdGggYSBKU1BTb3VyY2VQYXJzZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJZ2V0U291cmNlUGFyc2VyKCkucmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcih0aGlzKTsKLQkJCXNldFNvdXJjZVBhcnNlcigoSlNQU291cmNlUGFyc2VyKSBuZXdEb2N1bWVudC5nZXRQYXJzZXIoKSk7Ci0JCQlnZXRTb3VyY2VQYXJzZXIoKS5hZGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKHRoaXMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEluY2x1ZGVIZWxwZXIgZXh0ZW5kcyBEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIHsKLQkJcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZkFuY2hvciA9IG51bGw7Ci0JCXByb3RlY3RlZCBKU1BTb3VyY2VQYXJzZXIgZkxvY2FsUGFyc2VyID0gbnVsbDsKLQkJcHJvdGVjdGVkIEpTUFNvdXJjZVBhcnNlciBmUGFyZW50UGFyc2VyID0gbnVsbDsKLQkJTGlzdCB0YWdsaWJSZWZlcmVuY2VzID0gbnVsbDsKLQotCQlwdWJsaWMgSW5jbHVkZUhlbHBlcihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuY2hvciwgSlNQU291cmNlUGFyc2VyIHJvb3RQYXJzZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQlmQW5jaG9yID0gYW5jaG9yOwotCQkJZlBhcmVudFBhcnNlciA9IHJvb3RQYXJzZXI7Ci0JCQl0YWdsaWJSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGFkZFRhZ2xpYlRyYWNrZXIoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIENNRG9jdW1lbnQgdGxkQ01Eb2N1bWVudCkgewotCQkJc3VwZXIuYWRkVGFnbGliVHJhY2tlcihwcmVmaXgsIHVyaSwgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCB0bGRDTURvY3VtZW50KTsKLQkJCVRMRENNRG9jdW1lbnRSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IFRMRENNRG9jdW1lbnRSZWZlcmVuY2UoKTsKLQkJCXJlZmVyZW5jZS5wcmVmaXggPSBwcmVmaXg7Ci0JCQlyZWZlcmVuY2UudXJpID0gdXJpOwotCQkJdGFnbGliUmVmZXJlbmNlcy5hZGQocmVmZXJlbmNlKTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudHMoSVBhdGggZmlsZVBhdGgpIHsKLQkJCXJldHVybiBGaWxlQ29udGVudENhY2hlLmdldEluc3RhbmNlKCkuZ2V0Q29udGVudHMoZmlsZVBhdGgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm9kZVBhcnNlZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJcHJvY2Vzc1JlZ2lvbkNvbGxlY3Rpb24oc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBmQW5jaG9yLCBmTG9jYWxQYXJzZXIpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBwYXRoIC0KLQkJICogICAgICAgICAgICB0aGUgZnVsbHBhdGggZm9yIHRoZSByZXNvdXJjZSB0byBiZSBwYXJzZWQKLQkJICovCi0JCXZvaWQgcGFyc2UoSVBhdGggcGF0aCkgewotCQkJSlNQU291cmNlUGFyc2VyIHAgPSBuZXcgSlNQU291cmNlUGFyc2VyKCk7Ci0JCQlmTG9jYWxQYXJzZXIgPSBwOwotCQkJU3RyaW5nIHMgPSBnZXRDb250ZW50cyhwYXRoKTsKLQkJCS8vIFNob3VsZCB3ZSBjb25zaWRlciBwcmVsdWRlcyBvbiB0aGlzIHNlZ21lbnQ/Ci0JCQlmTG9jYWxQYXJzZXIuYWRkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihJbmNsdWRlSGVscGVyLnRoaXMpOwotCQkJZkxvY2FsUGFyc2VyLnJlc2V0KHMpOwotCQkJTGlzdCBibG9ja1RhZ3MgPSBmUGFyZW50UGFyc2VyLmdldEJsb2NrTWFya2VycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBibG9ja1RhZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpIGJsb2NrVGFncy5nZXQoaSk7Ci0JCQkJZkxvY2FsUGFyc2VyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcihtYXJrZXIuZ2V0VGFnTmFtZSgpLCBudWxsLCBtYXJrZXIuZ2V0Q29udGV4dCgpLCBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpKTsKLQkJCX0KLQkJCVRhZ01hcmtlcltdIGtub3duUHJlZml4ZXMgPSAoVGFnTWFya2VyW10pIGZQYXJlbnRQYXJzZXIuZ2V0TmVzdGFibGVQcmVmaXhlcygpLnRvQXJyYXkobmV3IFRhZ01hcmtlclswXSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGtub3duUHJlZml4ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlmTG9jYWxQYXJzZXIuYWRkTmVzdGFibGVQcmVmaXgobmV3IFRhZ01hcmtlcihrbm93blByZWZpeGVzW2ldLmdldFRhZ05hbWUoKSwgbnVsbCkpOwotCQkJfQotCQkJLy8gZm9yY2UgcGFyc2UKLQkJCWZMb2NhbFBhcnNlci5nZXREb2N1bWVudFJlZ2lvbnMoKTsKLQkJCWZMb2NhbFBhcnNlciA9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZXNldE5vZGVzKCkgewotCQl9Ci0JfQotCi0JLyoqCi0JICogQW4gZW50cnkgaW4gdGhlIHNoYXJlZCBjYWNoZSBtYXAKLQkgKi8KLQlzdGF0aWMgY2xhc3MgVExEQ2FjaGVFbnRyeSB7Ci0JCUNNRG9jdW1lbnQgZG9jdW1lbnQ7Ci0JCWxvbmcgbW9kaWZpY2F0aW9uU3RhbXA7Ci0JCWludCByZWZlcmVuY2VDb3VudDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUTERDTURvY3VtZW50RGVzY3JpcHRvciB7Ci0JCU9iamVjdCBjYWNoZUtleTsKLQkJQ01Eb2N1bWVudCBkb2N1bWVudDsKLQotCQlUTERDTURvY3VtZW50RGVzY3JpcHRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRMRENNRG9jdW1lbnRSZWZlcmVuY2UgewotCQlTdHJpbmcgcHJlZml4OwotCQlTdHJpbmcgdXJpOwotCX0KLQotCXN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1ZyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGxkY21kb2N1bWVudC9tYW5hZ2VyIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWdDYWNoZSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGxkY21kb2N1bWVudC9jYWNoZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLy8gd2lsbCBob2xkIHRoZSBwcmVmaXhlcyBiYW5uZWQgYnkgdGhlIHNwZWNpZmljYXRpb247IHRhZ2xpYnMgbWF5IG5vdCB1c2UKLQkvLyB0aGVtCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGJhbm5lZFByZWZpeGVzID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBmQ2FjaGUgPSBudWxsOwotCWZpbmFsIFN0cmluZyBYTUxOUyA9ICJ4bWxuczoiOyAvLyROT04tTkxTLTEkIAotCWZpbmFsIFN0cmluZyBVUk5fVEFHRElSID0gInVybjpqc3B0YWdkaXI6IjsKLQlmaW5hbCBTdHJpbmcgVVJOX1RMRCA9ICJ1cm46anNwdGxkOiI7Ci0KLQlmaW5hbCBpbnQgWE1MTlNfTEVOR1RIID0gWE1MTlMubGVuZ3RoKCk7Ci0JZmluYWwgaW50IFVSTl9UQUdESVJfTEVOR1RIID0gVVJOX1RBR0RJUi5sZW5ndGgoKTsKLQlmaW5hbCBpbnQgVVJOX1RMRF9MRU5HVEggPSBVUk5fVExELmxlbmd0aCgpOwotCi0Jc3RhdGljIHsKLQkJYmFubmVkUHJlZml4ZXMgPSBuZXcgQXJyYXlMaXN0KDcpOwotCQliYW5uZWRQcmVmaXhlcy5hZGQoImpzcCIpOyAvLyROT04tTkxTLTEkCi0JCWJhbm5lZFByZWZpeGVzLmFkZCgianNweCIpOyAvLyROT04tTkxTLTEkCi0JCWJhbm5lZFByZWZpeGVzLmFkZCgiamF2YSIpOyAvLyROT04tTkxTLTEkCi0JCWJhbm5lZFByZWZpeGVzLmFkZCgiamF2YXgiKTsgLy8kTk9OLU5MUy0xJAotCQliYW5uZWRQcmVmaXhlcy5hZGQoInNlcnZsZXQiKTsgLy8kTk9OLU5MUy0xJAotCQliYW5uZWRQcmVmaXhlcy5hZGQoInN1biIpOyAvLyROT04tTkxTLTEkCi0JCWJhbm5lZFByZWZpeGVzLmFkZCgic3VudyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgb2YgdGhlIGtub3duIGRvY3VtZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBIYXNodGFibGUgb2YgZWl0aGVyIFRMRENhY2hlRW50cnlzIG9yIFdlYWtSZWZlcmVuY2VzCi0JICogICAgICAgICB0byBUTEQgQ01Eb2N1bWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEhhc2h0YWJsZSBnZXRTaGFyZWREb2N1bWVudENhY2hlKCkgewotCQlpZiAoZkNhY2hlID09IG51bGwpIHsKLQkJCWZDYWNoZSA9IG5ldyBIYXNodGFibGUoKTsKLQkJfQotCQlyZXR1cm4gZkNhY2hlOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0VW5pcXVlSWRlbnRpZmllcihJVGFnbGliUmVjb3JkIHJlZmVyZW5jZSkgewotCQlpZiAocmVmZXJlbmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJT2JqZWN0IGlkZW50aWZpZXIgPSBudWxsOwotCQlzd2l0Y2ggKHJlZmVyZW5jZS5nZXRSZWNvcmRUeXBlKCkpIHsKLQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVExEKSA6IHsKLQkJCQlJVExEUmVjb3JkIHJlY29yZCA9IChJVExEUmVjb3JkKSByZWZlcmVuY2U7Ci0JCQkJaWRlbnRpZmllciA9IHJlY29yZC5nZXRQYXRoKCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLkpBUikgOiB7Ci0JCQkJSUphclJlY29yZCByZWNvcmQgPSAoSUphclJlY29yZCkgcmVmZXJlbmNlOwotCQkJCWlkZW50aWZpZXIgPSByZWNvcmQuZ2V0TG9jYXRpb24oKTsKLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVEFHRElSKSA6IHsKLQkJCQlJVGFnRGlyUmVjb3JkIHJlY29yZCA9IChJVGFnRGlyUmVjb3JkKSByZWZlcmVuY2U7Ci0JCQkJaWRlbnRpZmllciA9IHJlY29yZC5nZXRQYXRoKCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLlVSTCkgOiB7Ci0JCQkJSVVSTFJlY29yZCByZWNvcmQgPSAoSVVSTFJlY29yZCkgcmVmZXJlbmNlOwotCQkJCWlkZW50aWZpZXIgPSByZWNvcmQuZ2V0VVJMKCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlpZGVudGlmaWVyID0gcmVmZXJlbmNlOwotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBpZGVudGlmaWVyOwotCX0KLQotCXByaXZhdGUgQ01Eb2N1bWVudEZhY3RvcnlUTEQgZkNNRG9jdW1lbnRCdWlsZGVyID0gbnVsbDsKLQotCXByaXZhdGUgRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBmRGlyZWN0aXZlSGFuZGxlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgbG9jYWxseS1rbm93IGxpc3Qgb2YgQ01Eb2N1bWVudHMKLQkgKi8KLQlwcml2YXRlIEhhc2h0YWJsZSBmRG9jdW1lbnRzID0gbnVsbDsKLQotCS8vIHRpbWVzdGFtcCBjYWNoZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSByZXBhcnNpbmcKLQkvLyBvZiBpbmNsdWRlZCBmaWxlcwotCS8vIElQYXRoIChmaWxlcGF0aCkgPiBMb25nIChtb2RpZmljYXRpb24gc3RhbXApCi0JSGFzaE1hcCBmSW5jbHVkZTJUaW1lc3RhbXBNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBTdGFjayBmSW5jbHVkZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBKU1BTb3VyY2VQYXJzZXIgZlBhcnNlciA9IG51bGw7Ci0KLQlwcml2YXRlIExpc3QgZlRhZ2xpYlRyYWNrZXJzID0gbnVsbDsKLQotCU1hcCBmVExEQ01SZWZlcmVuY2VzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlib29sZWFuIGZQcm9jZXNzSW5jbHVkZXMgPSB0cnVlOwotCWJvb2xlYW4gcHJlbHVkZXNIYW5kbGVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgVExEQ01Eb2N1bWVudE1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJDYWNoZSgpIHsKLQkJaWYgKF9kZWJ1Z0NhY2hlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnRNYW5hZ2VyIGNsZWFyZWQgaXRzIHByaXZhdGUgQ01Eb2N1bWVudCBjYWNoZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0RG9jdW1lbnRzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qga2V5ID0gaXRlci5uZXh0KCk7Ci0JCQlzeW5jaHJvbml6ZWQgKGdldFNoYXJlZERvY3VtZW50Q2FjaGUoKSkgewotCQkJCU9iamVjdCBvID0gZ2V0U2hhcmVkRG9jdW1lbnRDYWNoZSgpLmdldChrZXkpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgVExEQ2FjaGVFbnRyeSkgewotCQkJCQlUTERDYWNoZUVudHJ5IGVudHJ5ID0gKFRMRENhY2hlRW50cnkpIG87Ci0JCQkJCWVudHJ5LnJlZmVyZW5jZUNvdW50LS07Ci0JCQkJCWlmIChlbnRyeS5yZWZlcmVuY2VDb3VudCA8PSAwKSB7Ci0JCQkJCQlnZXRTaGFyZWREb2N1bWVudENhY2hlKCkucHV0KGtleSwgbmV3IFdlYWtSZWZlcmVuY2UoZW50cnkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERlcml2ZXMgYW4gdW5pcXVlIGNhY2hlIGtleSBmb3IgdGhlIGdpdmUgVVJJLiBUaGUgVVJJIGlzICJyZXNvbHZlZCIgYW5kCi0JICogYSB1bmlxdWUgdmFsdWUgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdC4gVGhpcyBlbnN1cmVzIHRoYXQgdHdvCi0JICogZGlmZmVyZW50IHJlbGF0aXZlIHJlZmVyZW5jZXMgZnJvbSBkaWZmZXJlbnQgZmlsZXMgZG8gbm90IGhhdmUKLQkgKiBvdmVybGFwcGluZyBUTEQgcmVjb3JkcyBpbiB0aGUgc2hhcmVkIGNhY2hlIGlmIHRoZXkgZG9uJ3QgcmVzb2x2ZSB0bwotCSAqIHRoZSBzYW1lIFRMRC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q2FjaGVLZXkoU3RyaW5nIHVyaSkgewotCQlJVGFnbGliUmVjb3JkIHJlY29yZCA9IFRhZ2xpYkluZGV4LnJlc29sdmUoZ2V0Q3VycmVudFBhcnNlclBhdGgoKS50b1N0cmluZygpLCB1cmksIGZhbHNlKTsKLQkJaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VW5pcXVlSWRlbnRpZmllcihyZWNvcmQpOwotCQl9Ci0JCVN0cmluZyBsb2NhdGlvbiA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShnZXRDdXJyZW50QmFzZUxvY2F0aW9uKCkudG9TdHJpbmcoKSwgbnVsbCwgdXJpKTsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgQ01Eb2N1bWVudCBhdCB0aGUgdXJpIChjYWNoZWQpCi0JICovCi0JcHJvdGVjdGVkIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChTdHJpbmcgdXJpKSB7Ci0JCWlmICh1cmkgPT0gbnVsbCB8fCB1cmkubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcmVmZXJlbmNlID0gdXJpOwotCQlPYmplY3QgY2FjaGVLZXkgPSBnZXRDYWNoZUtleShyZWZlcmVuY2UpOwotCQlsb25nIGxhc3RNb2RpZmllZCA9IGdldE1vZGlmaWNhdGlvblN0YW1wKHJlZmVyZW5jZSk7Ci0JCUNNRG9jdW1lbnQgZG9jID0gKENNRG9jdW1lbnQpIGdldERvY3VtZW50cygpLmdldChjYWNoZUtleSk7Ci0JCWlmIChkb2MgPT0gbnVsbCkgewotCQkJLyoKLQkJCSAqIElmIGhhc24ndCBiZWVuIG1vdmVkIGludG8gdGhlIGxvY2FsIHRhYmxlLCBkbyBzbyBhbmQgaW5jcmVtZW50Ci0JCQkgKiB0aGUgY291bnQuIEEgbG9jYWwgVVJJIHJlZmVyZW5jZSBjYW4gYmUgZGlmZmVyZW50IGRlcGVuZGluZyBvbgotCQkJICogdGhlIGZpbGUgZnJvbSB3aGljaCBpdCB3YXMgcmVmZXJlbmNlZC4gVXNlIGEgY29tcHV0ZWQga2V5IHRvCi0JCQkgKiBrZWVwIHRoZW0gc3RyYWlnaHQuCi0JCQkgKi8KLQkJCU9iamVjdCBvID0gZ2V0U2hhcmVkRG9jdW1lbnRDYWNoZSgpLmdldChjYWNoZUtleSk7Ci0JCQlpZiAobyAhPSBudWxsKSB7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBUTERDYWNoZUVudHJ5KSB7Ci0JCQkJCVRMRENhY2hlRW50cnkgZW50cnkgPSAoVExEQ2FjaGVFbnRyeSkgbzsKLQkJCQkJaWYgKF9kZWJ1Z0NhY2hlKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnQgY2FjaGUgaGl0IG9uICIgKyBjYWNoZUtleSk7Ci0JCQkJCX0KLQkJCQkJaWYgKGVudHJ5ICE9IG51bGwgJiYgZW50cnkubW9kaWZpY2F0aW9uU3RhbXAgIT0gSVJlc291cmNlLk5VTExfU1RBTVAgJiYgZW50cnkubW9kaWZpY2F0aW9uU3RhbXAgPj0gbGFzdE1vZGlmaWVkKSB7Ci0JCQkJCQlkb2MgPSBlbnRyeS5kb2N1bWVudDsKLQkJCQkJCWVudHJ5LnJlZmVyZW5jZUNvdW50Kys7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlnZXRTaGFyZWREb2N1bWVudENhY2hlKCkucmVtb3ZlKGNhY2hlS2V5KTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChvIGluc3RhbmNlb2YgUmVmZXJlbmNlKSB7Ci0JCQkJCVRMRENhY2hlRW50cnkgZW50cnkgPSAoVExEQ2FjaGVFbnRyeSkgKChSZWZlcmVuY2UpIG8pLmdldCgpOwotCQkJCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJCQkJaWYgKGVudHJ5Lm1vZGlmaWNhdGlvblN0YW1wICE9IElSZXNvdXJjZS5OVUxMX1NUQU1QICYmIGVudHJ5Lm1vZGlmaWNhdGlvblN0YW1wID49IGxhc3RNb2RpZmllZCkgewotCQkJCQkJCWRvYyA9IGVudHJ5LmRvY3VtZW50OwotCQkJCQkJCWVudHJ5LnJlZmVyZW5jZUNvdW50ID0gMTsKLQkJCQkJCQlnZXRTaGFyZWREb2N1bWVudENhY2hlKCkucHV0KGNhY2hlS2V5LCBlbnRyeSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlnZXRTaGFyZWREb2N1bWVudENhY2hlKCkucmVtb3ZlKGNhY2hlS2V5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8qIE5vIGRvY3VtZW50IHdhcyBmb3VuZCBjYWNoZWQsIGNyZWF0ZSBhIG5ldyBvbmUgYW5kIHNoYXJlIGl0ICovCi0JCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCQlpZiAoX2RlYnVnQ2FjaGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUTERDTURvY3VtZW50IGNhY2hlIG1pc3Mgb24gIiArIGNhY2hlS2V5KTsKLQkJCQl9Ci0JCQkJVExEQ01Eb2N1bWVudERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGxvYWRUYWdsaWIocmVmZXJlbmNlKTsKLQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCVRMRENhY2hlRW50cnkgZW50cnkgPSBuZXcgVExEQ2FjaGVFbnRyeSgpOwotCQkJCQlkb2MgPSBlbnRyeS5kb2N1bWVudCA9IGRlc2NyaXB0b3IuZG9jdW1lbnQ7Ci0JCQkJCWVudHJ5LnJlZmVyZW5jZUNvdW50ID0gMTsKLQkJCQkJZW50cnkubW9kaWZpY2F0aW9uU3RhbXAgPSBnZXRNb2RpZmljYXRpb25TdGFtcChyZWZlcmVuY2UpOwotCQkJCQlnZXRTaGFyZWREb2N1bWVudENhY2hlKCkucHV0KGNhY2hlS2V5LCBlbnRyeSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQkJZ2V0RG9jdW1lbnRzKCkucHV0KGNhY2hlS2V5LCBkb2MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkb2M7Ci0JfQotCi0JcHJpdmF0ZSBsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKFN0cmluZyByZWZlcmVuY2UpIHsKLQkJSVRhZ2xpYlJlY29yZCByZWNvcmQgPSBUYWdsaWJJbmRleC5yZXNvbHZlKGdldEN1cnJlbnRQYXJzZXJQYXRoKCkudG9TdHJpbmcoKSwgcmVmZXJlbmNlLCBmYWxzZSk7Ci0JCWxvbmcgbW9kaWZpY2F0aW9uU3RhbXAgPSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQkJaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0JCQlzd2l0Y2ggKHJlY29yZC5nZXRSZWNvcmRUeXBlKCkpIHsKLQkJCQljYXNlIChJVGFnbGliUmVjb3JkLlRMRCkgOiB7Ci0JCQkJCUlGaWxlIHRsZGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoKChJVExEUmVjb3JkKSByZWNvcmQpLmdldFBhdGgoKSk7Ci0JCQkJCWlmICh0bGRmaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQltb2RpZmljYXRpb25TdGFtcCA9IHRsZGZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5KQVIpIDogewotCQkJCQlGaWxlIGphcmZpbGUgPSBuZXcgRmlsZSgoKElKYXJSZWNvcmQpIHJlY29yZCkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotCQkJCQlpZiAoamFyZmlsZS5leGlzdHMoKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQltb2RpZmljYXRpb25TdGFtcCA9IGphcmZpbGUubGFzdE1vZGlmaWVkKCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJCQkJCW1vZGlmaWNhdGlvblN0YW1wID0gSVJlc291cmNlLk5VTExfU1RBTVA7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVEFHRElSKSA6IHsKLQkJCQkJSUZvbGRlciB0YWdGb2xkZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcigoKElUYWdEaXJSZWNvcmQpIHJlY29yZCkuZ2V0UGF0aCgpKTsKLQkJCQkJaWYgKHRhZ0ZvbGRlci5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkJSVJlc291cmNlW10gbWVtYmVyczsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbWVtYmVycyA9IHRhZ0ZvbGRlci5tZW1iZXJzKCk7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCW1vZGlmaWNhdGlvblN0YW1wID0gTWF0aC5tYXgobW9kaWZpY2F0aW9uU3RhbXAsIG1lbWJlcnNbaV0uZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCW1vZGlmaWNhdGlvblN0YW1wID0gSVJlc291cmNlLk5VTExfU1RBTVA7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVVJMKSA6IHsKLQkJCQkJbW9kaWZpY2F0aW9uU3RhbXAgPSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpY2F0aW9uU3RhbXA7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBjTURvY3VtZW50QnVpbGRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBDTURvY3VtZW50RmFjdG9yeVRMRCwgc2luY2UgaXQgaGFzIG1vcmUgYnVpbGRlcgotCSAqICAgICAgICAgbWV0aG9kcwotCSAqLwotCXByb3RlY3RlZCBDTURvY3VtZW50RmFjdG9yeVRMRCBnZXRDTURvY3VtZW50QnVpbGRlcigpIHsKLQkJaWYgKGZDTURvY3VtZW50QnVpbGRlciA9PSBudWxsKQotCQkJZkNNRG9jdW1lbnRCdWlsZGVyID0gbmV3IENNRG9jdW1lbnRGYWN0b3J5VExEKCk7Ci0JCXJldHVybiBmQ01Eb2N1bWVudEJ1aWxkZXI7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Q01Eb2N1bWVudFRyYWNrZXJzKGludCBvZmZzZXQpIHsKLQkJTGlzdCB2YWxpZERvY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGFsbGRvY3MgPSBnZXRUYWdsaWJUcmFja2VycygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChhbGxkb2NzLmhhc05leHQoKSkgewotCQkJVGFnbGliVHJhY2tlciBhVHJhY2tlciA9IChUYWdsaWJUcmFja2VyKSBhbGxkb2NzLm5leHQoKTsKLQkJCWlmIChhVHJhY2tlci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpIDw9IG9mZnNldCB8fCBvZmZzZXQgPCAwKSB7Ci0JCQkJdmFsaWREb2NzLmFkZChhVHJhY2tlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbGlkRG9jczsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDTURvY3VtZW50VHJhY2tlcnMoU3RyaW5nIHByZWZpeCwgaW50IG9mZnNldCkgewotCQlMaXN0IHZhbGlkRG9jcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgYWxsZG9jcyA9IGdldFRhZ2xpYlRyYWNrZXJzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGFsbGRvY3MuaGFzTmV4dCgpKSB7Ci0JCQlUYWdsaWJUcmFja2VyIGFUcmFja2VyID0gKFRhZ2xpYlRyYWNrZXIpIGFsbGRvY3MubmV4dCgpOwotCQkJLyoqCi0JCQkgKiAnPCcgaXMgdXNlZCB0byBzdXBwb3J0IHRoZSBpbW1lZGlhdGUgdXNlIG9mIGEgY3VzdG9tIHRhZyBpbiBqc3B4IGZpbGVzCi0JCQkgKi8KLQkJCWlmICgoYVRyYWNrZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKSA8PSBvZmZzZXQgfHwgb2Zmc2V0IDwgMCkgJiYgYVRyYWNrZXIuZ2V0UHJlZml4KCkuZXF1YWxzKHByZWZpeCkpIHsKLQkJCQl2YWxpZERvY3MuYWRkKGFUcmFja2VyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsaWREb2NzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlsZXN5c3RlbSBsb2NhdGlvbiBpbiB0aGUgY3VycmVudCBwYXJzZXIuIFRoaXMgbWV0aG9kIGlzCi0JICogY2FsbGVkIHdoaWxlIHJlY3Vyc2luZyB0aHJvdWdoIGluY2x1ZGVkIGZyYWdtZW50cywgc28gaXQgbXVjaCBjaGVjayB0aGUKLQkgKiBpbmNsdWRlIHN0YWNrLiBUaGUgZmlsZXN5c3RlbSBsb2NhdGlvbiBpcyBuZWVkZWQgZm9yIGNvbW1vbiBVUkkKLQkgKiByZXNvbHV0aW9uIGluIGNhc2UgdGhlIFRhZ2xpYiBJbmRleCBkb2Vzbid0IGtub3cgdGhlIFVSSSBiZWluZyBsb2FkZWQuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUlQYXRoIGdldEN1cnJlbnRCYXNlTG9jYXRpb24oKSB7Ci0JCUlQYXRoIGJhc2VMb2NhdGlvbiA9IG51bGw7Ci0JCUlQYXRoIHBhdGggPSBnZXRDdXJyZW50UGFyc2VyUGF0aCgpOwotCQliYXNlTG9jYXRpb24gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCkuZ2V0TG9jYXRpb24oKTsKLQkJaWYgKGJhc2VMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQliYXNlTG9jYXRpb24gPSBwYXRoOwotCQl9Ci0JCXJldHVybiBiYXNlTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYXRoIHVzZWQgaW4gdGhlIGN1cnJlbnQgcGFyc2VyLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hpbGUKLQkgKiByZWN1cnNpbmcgdGhyb3VnaCBpbmNsdWRlZCBmcmFnbWVudHMsIHNvIGl0IG11Y2ggY2hlY2sgdGhlIGluY2x1ZGUKLQkgKiBzdGFjay4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JSVBhdGggZ2V0Q3VycmVudFBhcnNlclBhdGgoKSB7Ci0JCUlQYXRoIHBhdGggPSBudWxsOwotCQlpZiAoIWdldEluY2x1ZGVzKCkuaXNFbXB0eSgpKSB7Ci0JCQlwYXRoID0gKElQYXRoKSBnZXRJbmNsdWRlcygpLnBlZWsoKTsKLQkJfQotCQllbHNlIHsKLQkJCXBhdGggPSBUYWdsaWJDb250cm9sbGVyLmdldExvY2F0aW9uKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JcHJvdGVjdGVkIERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgZ2V0RGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcigpIHsKLQkJaWYgKGZEaXJlY3RpdmVIYW5kbGVyID09IG51bGwpCi0JCQlmRGlyZWN0aXZlSGFuZGxlciA9IG5ldyBEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKCk7Ci0JCXJldHVybiBmRGlyZWN0aXZlSGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkb2N1bWVudHMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgamF2YS51dGlsLkhhc2h0YWJsZQotCSAqLwotCXB1YmxpYyBIYXNodGFibGUgZ2V0RG9jdW1lbnRzKCkgewotCQlpZiAoZkRvY3VtZW50cyA9PSBudWxsKQotCQkJZkRvY3VtZW50cyA9IG5ldyBIYXNodGFibGUoKTsKLQkJcmV0dXJuIGZEb2N1bWVudHM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5jbHVkZXMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RhY2sKLQkgKi8KLQlwcm90ZWN0ZWQgU3RhY2sgZ2V0SW5jbHVkZXMoKSB7Ci0JCWlmIChmSW5jbHVkZXMgPT0gbnVsbCkKLQkJCWZJbmNsdWRlcyA9IG5ldyBTdGFjaygpOwotCQlyZXR1cm4gZkluY2x1ZGVzOwotCX0KLQotCUpTUFNvdXJjZVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCXJldHVybiBmUGFyc2VyOwotCX0KLQotCXB1YmxpYyBKU1BTb3VyY2VQYXJzZXIgZ2V0U291cmNlUGFyc2VyKCkgewotCQlyZXR1cm4gZlBhcnNlcjsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKCkgewotCQlyZXR1cm4gZ2V0RGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRUYWdsaWJUcmFja2VycygpIHsKLQkJaWYgKGZUYWdsaWJUcmFja2VycyA9PSBudWxsKQotCQkJZlRhZ2xpYlRyYWNrZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gZlRhZ2xpYlRyYWNrZXJzOwotCX0KLQotCXZvaWQgaGFuZGxlUHJlbHVkZXMoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yID0gbmV3IFplcm9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCwgLTEpOwotCQlmUHJvY2Vzc0luY2x1ZGVzID0gZmFsc2U7Ci0KLQkJSVBhdGggY3VycmVudFBhdGggPSBnZXRDdXJyZW50UGFyc2VyUGF0aCgpOwotCQlpZiAoY3VycmVudFBhdGggIT0gbnVsbCkgewotCQkJUHJvcGVydHlHcm91cFtdIHByb3BlcnR5R3JvdXBzID0gRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLmdldEluc3RhbmNlKCkuZ2V0UHJvcGVydHlHcm91cHMoY3VycmVudFBhdGgpOwotCQkJZm9yKGludCBrID0gMDsgayA8IHByb3BlcnR5R3JvdXBzLmxlbmd0aDsgaysrKSB7Ci0JCQkJSVBhdGhbXSBwcmVsdWRlcyA9IHByb3BlcnR5R3JvdXBzW2tdLmdldEluY2x1ZGVQcmVsdWRlKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVsdWRlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoIWdldEluY2x1ZGVzKCkuY29udGFpbnMocHJlbHVkZXNbaV0pICYmICFwcmVsdWRlc1tpXS5lcXVhbHMoY3VycmVudFBhdGgpKSB7Ci0JCQkJCQlnZXRJbmNsdWRlcygpLnB1c2gocHJlbHVkZXNbaV0pOwotCQkJCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCQkJCQlJbmNsdWRlSGVscGVyIGluY2x1ZGVIZWxwZXIgPSBuZXcgSW5jbHVkZUhlbHBlcihhbmNob3IsIGdldFBhcnNlcigpKTsKLQkJCQkJCQlpbmNsdWRlSGVscGVyLnBhcnNlKHByZWx1ZGVzW2ldKTsKLQkJCQkJCQlMaXN0IHJlZmVyZW5jZXMgPSBpbmNsdWRlSGVscGVyLnRhZ2xpYlJlZmVyZW5jZXM7Ci0JCQkJCQkJZlRMRENNUmVmZXJlbmNlc01hcC5wdXQocHJlbHVkZXNbaV0sIHJlZmVyZW5jZXMpOwotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVmZXJlbmNlcy5zaXplKCk7IGorKykgewotCQkJCQkJCQlUTERDTURvY3VtZW50UmVmZXJlbmNlIHJlZmVyZW5jZSA9IChUTERDTURvY3VtZW50UmVmZXJlbmNlKSByZWZlcmVuY2VzLmdldChqKTsKLQkJCQkJCQkJZ2V0UGFyc2VyKCkuYWRkTmVzdGFibGVQcmVmaXgobmV3IFRhZ01hcmtlcihyZWZlcmVuY2UucHJlZml4ICsgIjoiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIldhcm5pbmc6IHBhcnNlciB0ZXh0IHdhcyByZXF1ZXN0ZWQgYnkgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBidXQgbm9uZSB3YXMgYXZhaWxhYmxlOyB0YWdsaWIgc3VwcG9ydCBkaXNhYmxlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWdldEluY2x1ZGVzKCkucG9wKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlmUHJvY2Vzc0luY2x1ZGVzID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmlsZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHRvIGNoZWNrIGZvciBtb2RpZmljYXRpb24KLQkgKi8KLQlib29sZWFuIGhhc0FueUluY2x1ZGVCZWVuTW9kaWZpZWQoSVBhdGggZmlsZVBhdGgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gY2hlY2sgdGhlIHRvcCBsZXZlbAotCQlpZiAoaGFzQmVlbk1vZGlmaWVkKGZpbGVQYXRoKSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGNoZWNrIGFsbCBpbmNsdWRlZXMKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBmSW5jbHVkZTJUaW1lc3RhbXBNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCWlmIChoYXNCZWVuTW9kaWZpZWQoKElQYXRoKSBpdGVyLm5leHQoKSkpIHsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gaGFzQmVlbk1vZGlmaWVkKElQYXRoIGZpbGVQYXRoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIHF1aWNrIGZpbGVuYW1lL3RpbWVzdGFtcCBjYWNoZSBjaGVjayBoZXJlLi4uCi0JCUlGaWxlIGYgPSBudWxsOwotCQlpZiAoZiA9PSBudWxsICYmIGZpbGVQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJZiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCX0KLQkJaWYgKGYgIT0gbnVsbCAmJiBmLmV4aXN0cygpKSB7Ci0JCQlMb25nIGN1cnJlbnRTdGFtcCA9IG5ldyBMb25nKGYuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSk7Ci0JCQlPYmplY3QgbyA9IGZJbmNsdWRlMlRpbWVzdGFtcE1hcC5nZXQoZmlsZVBhdGgpOwotCQkJaWYgKG8gIT0gbnVsbCkgewotCQkJCUxvbmcgcHJldmlvdXNTdGFtcCA9IChMb25nKSBvOwotCQkJCS8vIHN0YW1wcyBkb24ndCBtYXRjaCwgZmlsZSBjaGFuZ2VkCi0JCQkJaWYgKGN1cnJlbnRTdGFtcC5sb25nVmFsdWUoKSAhPSBwcmV2aW91c1N0YW1wLmxvbmdWYWx1ZSgpKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCS8vIHN0b3JlIGZvciBuZXh0IHRpbWUKLQkJCQkJZkluY2x1ZGUyVGltZXN0YW1wTWFwLnB1dChmaWxlUGF0aCwgY3VycmVudFN0YW1wKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyByZXR1cm4gdHJ1ZSwgc2luY2Ugd2UndmUgbm90IGVuY291bnRlcmVkIHRoaXMgZmlsZSB5ZXQuCi0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkvLyBzdG9yZSBmb3IgbmV4dCB0aW1lCi0JCQkJZkluY2x1ZGUyVGltZXN0YW1wTWFwLnB1dChmaWxlUGF0aCwgY3VycmVudFN0YW1wKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIGluZGV4Q2hhbmdlZChJVGFnbGliSW5kZXhEZWx0YSBldmVudCkgewotCQlzeW5jaHJvbml6ZWQgKGdldFNoYXJlZERvY3VtZW50Q2FjaGUoKSkgewotCQkJSXRlcmF0b3IgdmFsdWVzID0gZ2V0U2hhcmVkRG9jdW1lbnRDYWNoZSgpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAodmFsdWVzLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvID0gdmFsdWVzLm5leHQoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIFJlZmVyZW5jZSkgewotCQkJCQl2YWx1ZXMucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgdGhlIHRhZ2xpYiBmcm9tIHRoZSBzcGVjaWZpZWQgVVJJLiBJdCBtdXN0IHBvaW50IHRvIGEgdmFsaWQKLQkgKiB0YWdsaWIgZGVzY3JpcHRvciB0byB3b3JrLgotCSAqLwotCXByb3RlY3RlZCBUTERDTURvY3VtZW50RGVzY3JpcHRvciBsb2FkVGFnbGliKFN0cmluZyB1cmkpIHsKLQkJVExEQ01Eb2N1bWVudERlc2NyaXB0b3IgZW50cnkgPSBudWxsOwotCQlJUGF0aCBjdXJyZW50UGF0aCA9IGdldEN1cnJlbnRQYXJzZXJQYXRoKCk7Ci0JCWlmIChjdXJyZW50UGF0aCAhPSBudWxsKSB7Ci0JCQlDTURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJCUlUYWdsaWJSZWNvcmQgcmVjb3JkID0gVGFnbGliSW5kZXgucmVzb2x2ZShjdXJyZW50UGF0aC50b1N0cmluZygpLCB1cmksIGZhbHNlKTsKLQkJCWlmIChyZWNvcmQgIT0gbnVsbCkgewotCQkJCWRvY3VtZW50ID0gZ2V0Q01Eb2N1bWVudEJ1aWxkZXIoKS5jcmVhdGVDTURvY3VtZW50KHJlY29yZCk7Ci0JCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJZW50cnkgPSBuZXcgVExEQ01Eb2N1bWVudERlc2NyaXB0b3IoKTsKLQkJCQkJZW50cnkuZG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJCQkJZW50cnkuY2FjaGVLZXkgPSBnZXRVbmlxdWVJZGVudGlmaWVyKHJlY29yZCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyogTm90IGEgdmVyeS1vZnRlbiB1c2VkIGNvZGUgcGF0aCAod2UgaG9wZSkgKi8KLQkJCQlJUGF0aCBjdXJyZW50QmFzZUxvY2F0aW9uID0gZ2V0Q3VycmVudEJhc2VMb2NhdGlvbigpOwotCQkJCWlmIChjdXJyZW50QmFzZUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGxvY2F0aW9uID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKGN1cnJlbnRCYXNlTG9jYXRpb24udG9TdHJpbmcoKSwgbnVsbCwgdXJpKTsKLQkJCQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJCWlmIChfZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvYWRpbmcgdGFncyBmcm9tICIgKyB1cmkgKyAiIGF0ICIgKyBsb2NhdGlvbik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlkb2N1bWVudCA9IGdldENNRG9jdW1lbnRCdWlsZGVyKCkuY3JlYXRlQ01Eb2N1bWVudChsb2NhdGlvbik7Ci0JCQkJCQllbnRyeSA9IG5ldyBUTERDTURvY3VtZW50RGVzY3JpcHRvcigpOwotCQkJCQkJZW50cnkuZG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJCQkJCWVudHJ5LmNhY2hlS2V5ID0gbG9jYXRpb247Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc2V0VGFnbGliVHJhY2tlcnMoKSB7Ci0JCWlmIChfZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVExEQ01Eb2N1bWVudE1hbmFnZXIgY2xlYXJlZCBpdHMgdGFnbGliIHRyYWNrZXJzXG4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByZWx1ZGVzSGFuZGxlZCA9IGZhbHNlOwotCQlnZXRUYWdsaWJUcmFja2VycygpLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U291cmNlUGFyc2VyKEpTUFNvdXJjZVBhcnNlciBwYXJzZXIpIHsKLQkJaWYgKGZQYXJzZXIgIT0gbnVsbCkKLQkJCWZQYXJzZXIucmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKCkpOwotCQlmUGFyc2VyID0gcGFyc2VyOwotCQlpZiAoZlBhcnNlciAhPSBudWxsKQotCQkJZlBhcnNlci5hZGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERGdW5jdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERGdW5jdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY0NzExYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExERnVuY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMREZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIFRMREZ1bmN0aW9uSW1wbCBpbXBsZW1lbnRzIFRMREZ1bmN0aW9uIHsKLQlwcml2YXRlIFN0cmluZyBmQ2xhc3NOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmRGVzY3JpcHRpb24gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZEaXNwbGF5TmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkV4YW1wbGUgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JcHJpdmF0ZSBTdHJpbmcgZkljb24gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZOYW1lID0gbnVsbDsKLQotCXByaXZhdGUgQ01Eb2N1bWVudCBmT3duZXJEb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZlNpZ25hdHVyZSA9IG51bGw7Ci0KLQlwdWJsaWMgVExERnVuY3Rpb25JbXBsKENNRG9jdW1lbnQgb3duZXIpIHsKLQkJc3VwZXIoKTsKLQkJZk93bmVyRG9jdW1lbnQgPSBvd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNsYXNzTmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGZDbGFzc05hbWU7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGZEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRpc3BsYXlOYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBmRGlzcGxheU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBleGFtcGxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXhhbXBsZSgpIHsKLQkJcmV0dXJuIGZFeGFtcGxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZXh0ZW5zaW9ucy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFeHRlbnNpb25zKCkgewotCQlyZXR1cm4gZkV4dGVuc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpY29uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWNvbigpIHsKLQkJcmV0dXJuIGZJY29uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBmTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG93bmVyRG9jdW1lbnQuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZPd25lckRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2lnbmF0dXJlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2lnbmF0dXJlKCkgewotCQlyZXR1cm4gZlNpZ25hdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogICAgICAgICAgICBUaGUgY2xhc3NOYW1lIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlmQ2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJZkRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRpc3BsYXlOYW1lCi0JICogICAgICAgICAgICBUaGUgZGlzcGxheU5hbWUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBkaXNwbGF5TmFtZSkgewotCQlmRGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXhhbXBsZQotCSAqICAgICAgICAgICAgVGhlIGV4YW1wbGUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4YW1wbGUoU3RyaW5nIGV4YW1wbGUpIHsKLQkJZkV4YW1wbGUgPSBleGFtcGxlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpY29uCi0JICogICAgICAgICAgICBUaGUgaWNvbiB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWNvbihTdHJpbmcgaWNvbikgewotCQlmSWNvbiA9IGljb247Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZOYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2lnbmF0dXJlCi0JICogICAgICAgICAgICBUaGUgc2lnbmF0dXJlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaWduYXR1cmUoU3RyaW5nIHNpZ25hdHVyZSkgewotCQlmU2lnbmF0dXJlID0gc2lnbmF0dXJlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERJbml0UGFyYW1JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExESW5pdFBhcmFtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWNkZmU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERJbml0UGFyYW1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCA5LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERJbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBUTERJbml0UGFyYW1JbXBsIGltcGxlbWVudHMgVExESW5pdFBhcmFtIHsKLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0JcHVibGljIFRMREluaXRQYXJhbUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBuYW1lOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0TmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBkZXNjcmlwdGlvbjoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldERlc2NyaXB0aW9uKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IHZhbHVlOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0VmFsdWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExETGlzdGVuZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExETGlzdGVuZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZWY5OWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRExpc3RlbmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExETGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBUTERMaXN0ZW5lckltcGwgaW1wbGVtZW50cyBUTERMaXN0ZW5lciB7Ci0JcHJvdGVjdGVkIFN0cmluZyBsaXN0ZW5lckNsYXNzOwotCi0JcHVibGljIFN0cmluZyBnZXRMaXN0ZW5lckNsYXNzKCkgewotCQlyZXR1cm4gbGlzdGVuZXJDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lckNsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJbGlzdGVuZXJDbGFzcyA9IGNsYXNzTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlidWZmZXIuYXBwZW5kKCJcblx0IGxpc3RlbmVyIGNsYXNzOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0TGlzdGVuZXJDbGFzcygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERWYWxpZGF0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExEVmFsaWRhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDZmNzQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERWYWxpZGF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCA5LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExEVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLQotCi1wdWJsaWMgY2xhc3MgVExEVmFsaWRhdG9ySW1wbCBpbXBsZW1lbnRzIFRMRFZhbGlkYXRvciB7Ci0JcHJvdGVjdGVkIExpc3QgaW5pdFBhcmFtczsKLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRvckNsYXNzOwotCi0JcHVibGljIExpc3QgZ2V0SW5pdFBhcmFtcygpIHsKLQkJaWYgKGluaXRQYXJhbXMgPT0gbnVsbCkKLQkJCWluaXRQYXJhbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBpbml0UGFyYW1zOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiB2YWxpZGF0b3JDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbml0UGFyYW1zKExpc3QgaW5pdFBhcmFtcykgewotCQl0aGlzLmluaXRQYXJhbXMgPSBpbml0UGFyYW1zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvckNsYXNzKFN0cmluZyB2YWxpZGF0b3JDbGFzcykgewotCQl0aGlzLnZhbGlkYXRvckNsYXNzID0gdmFsaWRhdG9yQ2xhc3M7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCB2YWxpZGF0b3IgY2xhc3M6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRWYWxpZGF0b3JDbGFzcygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBpbml0LXBhcm1zOiIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0SW5pdFBhcmFtcygpLnNpemUoKTsgaSsrKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCJcbiIgKyBTdHJpbmdVdGlscy5yZXBsYWNlKGdldEluaXRQYXJhbXMoKS5nZXQoaSkudG9TdHJpbmcoKSwgIlxuIiwgIlxuXHRcdCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRFZhcmlhYmxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRFZhcmlhYmxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjdiNzVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERWYXJpYWJsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMlRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMRFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLQotCi1wdWJsaWMgY2xhc3MgVExEVmFyaWFibGVJbXBsIGltcGxlbWVudHMgVExEVmFyaWFibGUgewotCS8vIG9wdGlvbmFsIC0gZGVmYXVsdHMgdG8gdHJ1ZQotCXByaXZhdGUgYm9vbGVhbiBkZWNsYXJlID0gdHJ1ZTsKLQotCXByaXZhdGUgU3RyaW5nIGZEZXNjcmlwdGlvbjsKLQkvLyByZXF1aXJlZAotCXByaXZhdGUgU3RyaW5nIG5hbWVGcm9tQXR0cmlidXRlOwotCS8vIHJlcXVpcmVkCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZUdpdmVuOwotCS8vIG9wdGlvbmFsIC0gZGVmYXVsdHMgdG8gTkVTVEVECi0JcHJpdmF0ZSBTdHJpbmcgc2NvcGUgPSBKU1AxMlRMRE5hbWVzLlZBUklBQkxFX1NDT1BFX05FU1RFRDsKLQkvLyByZXF1aXJlZCAtIGRlZmF1bHRzIHRvIGEgU3RyaW5nCi0JcHJpdmF0ZSBTdHJpbmcgdmFyaWFibGVDbGFzcyA9ICJqYXZhLmxhbmcuU3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgZkFsaWFzOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVjbGFyZSgpIHsKLQkJcmV0dXJuIGRlY2xhcmU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZkRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBuYW1lRnJvbUF0dHJpYnV0ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVHaXZlbigpIHsKLQkJcmV0dXJuIG5hbWVHaXZlbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNjb3BlKCkgewotCQlyZXR1cm4gc2NvcGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYXJpYWJsZUNsYXNzKCkgewotCQlyZXR1cm4gdmFyaWFibGVDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWNsYXJlKGJvb2xlYW4gZGVjbGFyZSkgewotCQl0aGlzLmRlY2xhcmUgPSBkZWNsYXJlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlY2xhcmVTdHJpbmcoU3RyaW5nIGRlY2wpIHsKLQkJaWYgKGRlY2wgIT0gbnVsbCkgewotCQkJc2V0RGVjbGFyZShkZWNsLmVxdWFscyhKU1AxMlRMRE5hbWVzLlRSVUUpIHx8IGRlY2wuZXF1YWxzKEpTUDEyVExETmFtZXMuWUVTKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCWZEZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWVGcm9tQXR0cmlidXRlKFN0cmluZyBuYW1lRnJvbUF0dHJpYnV0ZSkgewotCQl0aGlzLm5hbWVGcm9tQXR0cmlidXRlID0gbmFtZUZyb21BdHRyaWJ1dGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZUdpdmVuKFN0cmluZyBuYW1lR2l2ZW4pIHsKLQkJdGhpcy5uYW1lR2l2ZW4gPSBuYW1lR2l2ZW47Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIHNjb3BlKSB7Ci0JCXRoaXMuc2NvcGUgPSBzY29wZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZUNsYXNzKFN0cmluZyB2YXJpYWJsZUNsYXNzKSB7Ci0JCXRoaXMudmFyaWFibGVDbGFzcyA9IHZhcmlhYmxlQ2xhc3M7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBuYW1lIGdpdmVuOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0TmFtZUdpdmVuKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IG5hbWUgZnJvbSBhdHRyaWJ1dGU6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXROYW1lRnJvbUF0dHJpYnV0ZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gQm9vbGVhbi50b1N0cmluZyhib29sZWFuKSBpcyBpbnRyb2R1Y2VkIGluIEpESyAxLjQKLQkJLy8gYnVmZmVyLmFwcGVuZCgiXG5cdCBkZWNsYXJlOiIgKwotCQkvLyBTdHJpbmdVdGlscy5lc2NhcGUoQm9vbGVhbi50b1N0cmluZyhnZXREZWNsYXJlKCkpKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgZGVjbGFyZToiICsgU3RyaW5nVXRpbHMudG9TdHJpbmcoZ2V0RGVjbGFyZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBzY29wZToiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldFNjb3BlKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IHZhcmlhYmxlIGNsYXNzOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0VmFyaWFibGVDbGFzcygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWxpYXMoKSB7Ci0JCXJldHVybiBmQWxpYXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxpYXMoU3RyaW5nIGFsaWFzKSB7Ci0JCWZBbGlhcyA9IGFsaWFzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UYWdsaWJUcmFja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVGFnbGliVHJhY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODM1MWFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UYWdsaWJUcmFja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50V3JhcHBlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50VHJhY2tlcjsKLQotLyoqCi0gKiBUYWdsaWJUcmFja2VyIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdsaWJUcmFja2VyIGV4dGVuZHMgQ01Eb2N1bWVudFdyYXBwZXJJbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudFRyYWNrZXIgewotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQlwdWJsaWMgVGFnbGliVHJhY2tlcihTdHJpbmcgbmV3VVJJLCBTdHJpbmcgbmV3UHJlZml4LCBDTURvY3VtZW50IHRsZCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCXN1cGVyKG5ld1VSSSwgbmV3UHJlZml4LCB0bGQpOwotCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gYVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKQotCQkJcmV0dXJuIGdldFByZWZpeCgpICsgIkAiICsgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvSlNQMTFUTEROYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL0pTUDExVExETmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI0OTU5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvSlNQMTFUTEROYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsOwotCi1wdWJsaWMgaW50ZXJmYWNlIEpTUDExVExETmFtZXMgewotCi0JU3RyaW5nIFRBR0xJQiA9ICJ0YWdsaWIiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgQ09OVEVOVF9KU1AgPSAiSlNQIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDT05URU5UX0VNUFRZID0gImVtcHR5IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDT05URU5UX1RBR0RFUEVOREVOVCA9ICJ0YWdkZXBlbmRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVEFHID0gInRhZyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQVkVSU0lPTiA9ICJqc3B2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUTElCVkVSU0lPTiA9ICJ0bGlidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU0hPUlROQU1FID0gInNob3J0bmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVVJJID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVVJOID0gInVybiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSU5GTyA9ICJpbmZvIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIE5BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVEVJQ0xBU1MgPSAidGVpY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRBR0NMQVNTID0gInRhZ2NsYXNzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBCT0RZQ09OVEVOVCA9ICJib2R5Y29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUklCVVRFID0gImF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBJRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVRVUlSRUQgPSAicmVxdWlyZWQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJURVhQUlZBTFVFID0gInJ0ZXhwcnZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIFBSRUZJWCA9ICJwcmVmaXgiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgSU5DTFVERSA9ICJpbmNsdWRlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGSUxFID0gImZpbGUiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWUVTID0gInllcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTk8gPSAibm8iOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvSlNQMTJUTEROYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL0pTUDEyVExETmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFiMzEyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvSlNQMTJUTEROYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsOwotCi1wdWJsaWMgaW50ZXJmYWNlIEpTUDEyVExETmFtZXMgewotCi0JU3RyaW5nIFRBR0xJQiA9IEpTUDExVExETmFtZXMuVEFHTElCOwotCi0JU3RyaW5nIENPTlRFTlRfSlNQID0gSlNQMTFUTEROYW1lcy5DT05URU5UX0pTUDsKLQlTdHJpbmcgQ09OVEVOVF9FTVBUWSA9IEpTUDExVExETmFtZXMuQ09OVEVOVF9FTVBUWTsKLQlTdHJpbmcgQ09OVEVOVF9UQUdERVBFTkRFTlQgPSBKU1AxMVRMRE5hbWVzLkNPTlRFTlRfVEFHREVQRU5ERU5UOwotCi0JU3RyaW5nIFRBRyA9IEpTUDExVExETmFtZXMuVEFHOwotCVN0cmluZyBKU1BfVkVSU0lPTiA9ICJqc3AtdmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVExJQl9WRVJTSU9OID0gInRsaWItdmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU0hPUlRfTkFNRSA9ICJzaG9ydC1uYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBVUkkgPSBKU1AxMVRMRE5hbWVzLlVSSTsKLQlTdHJpbmcgVVJOID0gSlNQMTFUTEROYW1lcy5VUk47Ci0KLQlTdHJpbmcgTkFNRSA9IEpTUDExVExETmFtZXMuTkFNRTsKLQlTdHJpbmcgVEVJX0NMQVNTID0gInRlaS1jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVEFHX0NMQVNTID0gInRhZy1jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQk9EWV9DT05URU5UID0gImJvZHktY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUklCVVRFID0gSlNQMTFUTEROYW1lcy5BVFRSSUJVVEU7Ci0KLQlTdHJpbmcgSUQgPSBKU1AxMVRMRE5hbWVzLklEOwotCVN0cmluZyBSRVFVSVJFRCA9IEpTUDExVExETmFtZXMuUkVRVUlSRUQ7Ci0JU3RyaW5nIFJURVhQUlZBTFVFID0gSlNQMTFUTEROYW1lcy5SVEVYUFJWQUxVRTsKLQotCVN0cmluZyBQUkVGSVggPSBKU1AxMVRMRE5hbWVzLlBSRUZJWDsKLQotCVN0cmluZyBJTkNMVURFID0gSlNQMTFUTEROYW1lcy5JTkNMVURFOwotCVN0cmluZyBGSUxFID0gSlNQMTFUTEROYW1lcy5GSUxFOwotCi0JU3RyaW5nIFRSVUUgPSBKU1AxMVRMRE5hbWVzLlRSVUU7Ci0JU3RyaW5nIEZBTFNFID0gSlNQMTFUTEROYW1lcy5GQUxTRTsKLQlTdHJpbmcgWUVTID0gSlNQMTFUTEROYW1lcy5ZRVM7Ci0JU3RyaW5nIE5PID0gSlNQMTFUTEROYW1lcy5OTzsKLQotCS8qCi0JICogQHNlZSBFY2xpcHNlIEpTUCAxLjIKLQkgKi8KLQlTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERJU1BMQVlfTkFNRSA9ICJkaXNwbGF5LW5hbWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNNQUxMX0lDT04gPSAic21hbGwtaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTEFSR0VfSUNPTiA9ICJsYXJnZS1pY29uIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlTdHJpbmcgVkFMSURBVE9SID0gInZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFMSURBVE9SX0NMQVNTID0gInZhbGlkYXRvci1jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFMSURBVE9SX0lOSVRfUEFSQU0gPSAiaW5pdC1wYXJhbSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFMSURBVE9SX1BBUkFNX05BTUUgPSAicGFyYW0tbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFMSURBVE9SX1BBUkFNX1ZBTFVFID0gInBhcmFtLXZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlTdHJpbmcgTElTVEVORVIgPSAibGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIExJU1RFTkVSX0NMQVNTID0gImxpc3RlbmVyLWNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIFZBUklBQkxFID0gInZhcmlhYmxlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQVJJQUJMRV9OQU1FX0dJVkVOID0gIm5hbWUtZ2l2ZW4iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBUklBQkxFX05BTUVfRlJPTV9BVFRSSUJVVEUgPSAibmFtZS1mcm9tLWF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFSSUFCTEVfQ0xBU1MgPSAidmFyaWFibGUtY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBUklBQkxFX0RFQ0xBUkUgPSAiZGVjbGFyZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFSSUFCTEVfU0NPUEUgPSAic2NvcGUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBUklBQkxFX1NDT1BFX05FU1RFRCA9ICJORVNURUQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBUklBQkxFX1NDT1BFX0FUX0JFR0lOID0gIkFUX0JFR0lOIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQVJJQUJMRV9TQ09QRV9BVF9FTkQgPSAiQVRfRU5EIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL0pTUDIwVExETmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9KU1AyMFRMRE5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MmFlNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL0pTUDIwVExETmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbDsKLQotLyogbmxzWFhYICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTUDIwVExETmFtZXMgZXh0ZW5kcyBKU1AxMlRMRE5hbWVzIHsKLQlTdHJpbmcgQ09OVEVOVF9TQ1JJUFRMRVNTID0gInNjcmlwdGxlc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVYQU1QTEUgPSAiZXhhbXBsZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRlJBR01FTlQgPSAiZnJhZ21lbnQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZVTkNUSU9OID0gImZ1bmN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGVU5DVElPTl9DTEFTUyA9ICJmdW5jdGlvbi1jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRlVOQ1RJT05fRVhURU5TSU9OID0gImZ1bmN0aW9uLWV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRlVOQ1RJT05fU0lHTkFUVVJFID0gImZ1bmN0aW9uLXNpZ25hdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSUNPTiA9ICJpY29uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQQVRIID0gInBhdGgiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRBR19FWFRFTlNJT04gPSAidGFnLWV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVEFHX0ZJTEUgPSAidGFnLWZpbGUiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVEFHRElSID0gInRhZ2RpciI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBUQUdMSUJfRVhURU5TSU9OID0gInRhZ2xpYi1leHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgRFlOQU1JQ19BVFRSSUJVVEVTID0gImR5bmFtaWMtYXR0cmlidXRlcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU0NSSVBUSU5HX0xBTkdVQUdFID0gImxhbmd1YWdlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBJTVBPUlQgPSAiaW1wb3J0IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBJU19FTF9JR05PUkVEID0gImlzRUxJZ25vcmVkIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQQUdFX0VOQ09ESU5HID0gInBhZ2VFbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQVJJQUJMRV9BTElBUyA9ICJhbGlhcyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERBdHRyaWJ1dGVEZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNTdlZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGZyb20gYSBUTEQKLSAqLwotcHVibGljIGludGVyZmFjZSBUTERBdHRyaWJ1dGVEZWNsYXJhdGlvbiBleHRlbmRzIENNQXR0cmlidXRlRGVjbGFyYXRpb24gewotCi0JLyoqCi0JICogYSBkZXNjcmlwdGlvbiBvZiB0aGUgYXR0cmlidXRlCi0JICogQHJldHVybiBTdHJpbmcKLQkgKiBAc2VlICBKU1AgMi4wCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0JCi0JLyoqCi0JICogdGhlIGF0dHJpYnV0ZSdzIG5hbWUKLQkgKiBAc2VlICBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQlDTURvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSdzIHZhbHVlIG1heSBiZSBkeW5hbWljYWxseSBjYWxjdWxhdGVkIGF0IHJ1bnRpbWUgYnkgYW4gZXhwcmVzc2lvbgotCSAqIEBzZWUgIEpTUCAxLjEKLQkgKi8KLQlTdHJpbmcgZ2V0UnRleHBydmFsdWUoKTsKLQotCS8qKgotCSAqIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZQotCSAqIEBzZWUgIEpTUCAxLjIKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogd2hldGhlciB0aGlzIGF0dHJpYnV0ZSBpcyBhIGZyYWdtZW50Ci0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBpc0ZyYWdtZW50KCk7Ci0JCi0JLyoqCi0JICogaWYgdGhlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvciBvcHRpb25hbAotCSAqIEBzZWUgIEpTUCAxLjEKLQkgKi8KLQlib29sZWFuIGlzUmVxdWlyZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTEREb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMzUxZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVExERG9jdW1lbnQgZXh0ZW5kcyBDTURvY3VtZW50IHsKLQotCVN0cmluZyBDTV9LSU5EID0gIkNvbnRlbnQgTW9kZWwgS2luZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX1RMRCA9ICJKU1AgVGFnIExpYnJhcnkgRGVzY3JpcHRvciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBzZWUgIEpTUCAyLjAKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGdldEJhc2VMb2NhdGlvbigpOwotCQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gVGhlIGNvbnRlbnRzIG9mIHRoZSAiZGVzY3JpcHRpb24iIGVsZW1lbnQgb2YgYSBKU1AgMS4yIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3I7IGEgc2ltcGxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSAidXNlIiBvZiB0aGlzIHRhZ2xpYiwgc2hvdWxkIGJlIHVzZXIgZGlzY2VybmFibGUuCi0JICogQHNlZSAgSlNQIDEuMgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQHJldHVybiBTdHJpbmcgLSBUaGUgY29udGVudHMgb2YgdGhlICJkaXNwbGF5LW5hbWUiIGVsZW1lbnQgb2YgYSBKU1AgMS4yIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3I7IGl0IGlzIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZCBieSB0b29scwotCSAqIEBzZWUgIEpTUCAxLjIKLQkgKi8KLQlTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gTGlzdCAtIEEgbGlzdCBvZiBleHRlbnNpb24gZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgdGFnIGxpYnJhcnkKLQkgKiBAc2VlICBKU1AgMi4wCi0JICovCi0JTGlzdCBnZXRFeHRlbnNpb25zKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBMaXN0IC0gQSBsaXN0IG9mIFRMREZ1bmN0aW9ucyBkZXNjcmliaW5nIHRoZSBkZWNsYXJlZCBmdW5jdGlvbnMKLQkgKiBAc2VlICBKU1AgMi4wCi0JICovCi0JTGlzdCBnZXRGdW5jdGlvbnMoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIFN0cmluZyAtIFRoZSBjb250ZW50cyBvZiB0aGUgImluZm8iIGVsZW1lbnQgb2YgYSBKU1AgMS4xIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3I7IGEgc2ltcGxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSAidXNlIiBvZiB0aGlzIHRhZ2xpYiwgc2hvdWxkIGJlIHVzZXIgZGlzY2VybmFibGUuCi0JICogQHNlZSAgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRJbmZvKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFN0cmluZyAtIFRoZSB2ZXJzaW9uIG9mIEpTUCB0aGUgdGFnIGxpYnJhcnkgZGVwZW5kcyB1cG9uCi0JICogQHNlZSAgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRKc3B2ZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFN0cmluZyAtIFRoZSBjb250ZW50cyBvZiB0aGUgImxhcmdlLWljb24iIGVsZW1lbnQgb2YgYSBKU1AgMS4yIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3I7IG9wdGlvbmFsIGxhcmdlLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scwotCSAqIEBzZWUgIEpTUCAxLjIKLQkgKi8KLQlTdHJpbmcgZ2V0TGFyZ2VJY29uKCk7Ci0KLQkvKioKLQkgKiBAc2VlICBKU1AgMS4yCi0JICogQHJldHVybiBMaXN0IC0gYSBMaXN0IG9mIFRMRExpc3RlbmVycwotCSAqLwotCUxpc3QgZ2V0TGlzdGVuZXJzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFN0cmluZyAtIEEgc2ltcGxlIGRlZmF1bHQgc2hvcnQgbmFtZSB0aGF0IGNvdWxkIGJlIHVzZWQgYnkgYSBKU1AgYXV0aG9yaW5nIHRvb2wgdG8gY3JlYXRlIG5hbWVzIHdpdGggYSBtbmVtb25pYyB2YWx1ZTsgZm9yIGV4YW1wbGUsIGl0IG1heSBiZSB1c2VkIGFzIHRoZSBwcmVmZXJyZWQgcHJlZml4IHZhbHVlIGluIHRhZ2xpYiBkaXJlY3RpdmVzCi0JICogQHNlZSAgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRTaG9ydG5hbWUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gVGhlIGNvbnRlbnRzIG9mIHRoZSAic21hbGwtaWNvbiIgZWxlbWVudCBvZiBhIEpTUCAxLjIgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcjsgb3B0aW9uYWwgc21hbGwtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0JICogQHNlZSAgSlNQIDEuMgotCSAqLwotCVN0cmluZyBnZXRTbWFsbEljb24oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gVGhlIHZlcnNpb24gb2YgdGhlIHRhZyBsaWJyYXJ5IChpdCdzIGltcGxlbWVudGF0aW9uKQotCSAqIEBzZWUgIEpTUCAxLjEKLQkgKi8KLQlTdHJpbmcgZ2V0VGxpYnZlcnNpb24oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIFVSSSBkZWNsYXJlZCB3aXRoaW4gdGhlIGRlc2NyaXB0b3IKLQkgKiBAc2VlICBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldFVyaSgpOwotCi0JLyoqCi0JICogQHNlZSAgSlNQIDEuMgotCSAqLwotCVRMRFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERFbGVtZW50RGVjbGFyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERFbGVtZW50RGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA1NzE2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExERWxlbWVudERlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBUTERFbGVtZW50RGVjbGFyYXRpb24gZXh0ZW5kcyBDTUVsZW1lbnREZWNsYXJhdGlvbiB7Ci0JU3RyaW5nIFRBR19TT1VSQ0UgPSAiVGFnIERlZmluaXRpb24gU291cmNlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTT1VSQ0VfSlNQX1RMRCA9ICJKU1AgVGFnIExpYnJhcnkgRGVzY3JpcHRvciI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU09VUkNFX1RBR19GSUxFID0gIkpTUCBUYWcgMi4wIEZpbGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgYm9keSBjb250ZW50IHR5cGUKLQkgKiAKLQkgKiBAc2VlIEpTUCAxLjEKLQkgKi8KLQlTdHJpbmcgZ2V0Qm9keWNvbnRlbnQoKTsKLQotCS8qKgotCSAqIE9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbgotCSAqIAotCSAqIEBzZWUgSlNQIDEuMgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzCi0JICogCi0JICogQHNlZSBKU1AgMS4yCi0JICovCi0JU3RyaW5nIGdldERpc3BsYXlOYW1lKCk7Ci0KLQkvKioKLQkgKiBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbiBleGFtcGxlIG9mIGEgdXNlIG9mIHRoaXMgdGFnCi0JICogCi0JICogQHNlZSBKU1AgMi4wCi0JICovCi0JU3RyaW5nIGdldEV4YW1wbGUoKTsKLQotCS8qKgotCSAqIFplcm8gb3IgbW9yZSBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBleHRyYSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhZywKLQkgKiBmb3IgdG9vbCBjb25zdW1wdGlvbgotCSAqIAotCSAqIEBzZWUgSlNQIDIuMAotCSAqLwotCUxpc3QgZ2V0RXh0ZW5zaW9ucygpOwotCi0JLyoqCi0JICogT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCi0JICogCi0JICogQHNlZSBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldEluZm8oKTsKLQotCS8qKgotCSAqIE5hbWUgb2YgYW4gb3B0aW9uYWwgbGFyZ2UgaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0JICogCi0JICogQHNlZSBKU1AgMS4yCi0JICovCi0JU3RyaW5nIGdldExhcmdlSWNvbigpOwotCi0JQ01Eb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBXaGVyZSB0byBmaW5kIHRoZSAudGFnIGZpbGUgaW1wbGVtZW50aW5nIHRoaXMgYWN0aW9uLCByZWxhdGl2ZSB0byB0aGUKLQkgKiByb290IG9mIHRoZSB3ZWIgYXBwbGljYXRpb24gb3IgdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlIGZvciBhIHRhZwotCSAqIGxpYnJhcnkgcGFja2FnZWQgaW4gYSBKQVIuIFRoaXMgbXVzdCBiZWdpbiB3aXRoIC9XRUItSU5GL3RhZ3MgaWYgdGhlCi0JICogLnRhZyBmaWxlIHJlc2lkZXMgaW4gdGhlIFdBUiwgb3IgL01FVEEtSU5GL3RhZ3MgaWYgdGhlIC50YWcgZmlsZQotCSAqIHJlc2lkZXMgaW4gYSBKQVIuCi0JICogCi0JICogCi0JICogQHJldHVybiB0aGUgcGF0aCB0byB0aGUgLnRhZyh4KSBmaWxlIGFzIGRlZmluZWQgaW4gdGhlIC50bGQgZmlsZSwgbnVsbAotCSAqICAgICAgICAgaWYgaW50ZXJuYWwgdG8gdGhlIC50bGQKLQkgKiBAc2VlIEpTUCAyLjAKLQkgKi8KLQlTdHJpbmcgZ2V0UGF0aCgpOwotCi0JLyoqCi0JICogTmFtZSBvZiBhbiBvcHRpb25hbCBzbWFsbCBpY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKLQkgKiAKLQkgKiBAc2VlIEpTUCAxLjIKLQkgKi8KLQlTdHJpbmcgZ2V0U21hbGxJY29uKCk7Ci0KLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgdGFnIGhhbmRsZXIgY2xhc3MgaW1wbGVtZW50aW5nCi0JICogamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZwotCSAqIAotCSAqIEBzZWUgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRUYWdjbGFzcygpOwotCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgYW4gb3B0aW9uYWwgc3ViY2xhc3Mgb2YKLQkgKiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvCi0JICogCi0JICogQHNlZSBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldFRlaWNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAc2VlIEpTUCAxLjIKLQkgKiBAcmV0dXJuIExpc3Qgb2YgVExEVmFyaWFibGVzCi0JICovCi0JTGlzdCBnZXRWYXJpYWJsZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERGdW5jdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREZ1bmN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0M2U5NjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREZ1bmN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLQotcHVibGljIGludGVyZmFjZSBUTERGdW5jdGlvbiB7Ci0KLQlTdHJpbmcgZ2V0Q2xhc3NOYW1lKCk7Ci0JCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQlTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLQotCVN0cmluZyBnZXRFeGFtcGxlKCk7Ci0KLQlMaXN0IGdldEV4dGVuc2lvbnMoKTsKLQotCVN0cmluZyBnZXRJY29uKCk7Ci0KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JQ01Eb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCk7Ci0KLQlTdHJpbmcgZ2V0U2lnbmF0dXJlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExESW5pdFBhcmFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExESW5pdFBhcmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZDA5YWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREluaXRQYXJhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsOwotCi0KLS8qKgotICogQSBuYW1lL3ZhbHVlIHBhaXIgYXMgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW0gYWxvbmcgd2l0aCBhIGRlc2NyaXB0aW9uCi0gKiBAc2VlIEpTUCAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBUTERJbml0UGFyYW0gewotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogVGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBwYXJhbWV0ZXIuCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExETGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDZmMGU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsOwotCi0KLS8qKgotICogRGVmaW5lcyBhbiBvcHRpb25hbCBldmVudCBsaXN0ZW5lciBvYmplY3QgdG8gYmUgaW5zdGFudGlhdGVkIGFuZCByZWdpc3RlcmVkIGF1dG9tYXRpY2FsbHkKLSAqIEBzZWUgSlNQIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRMRExpc3RlbmVyIHsKLQlTdHJpbmcgZ2V0TGlzdGVuZXJDbGFzcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWVlNzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogRGVmaW5lcyBhbiBvcHRpb25hbCB2YWxpZGF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSB0aGUgY29uZm9ybWFuY2Ugb2YgYSBKU1AgcGFnZSB0byB1c2luZyB0aGlzIHRhZyBsaWJyYXJ5Ci0gKiBAc2VlIEpTUCAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBUTERWYWxpZGF0b3IgewotCS8qKgotCSAqIEByZXR1cm4gTGlzdCAtIGEgTGlzdCBvZiBUTERJbml0UGFyYW1zCi0JICovCi0JTGlzdCBnZXRJbml0UGFyYW1zKCk7Ci0KLQlTdHJpbmcgZ2V0VmFsaWRhdG9yQ2xhc3MoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERWYXJpYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRFZhcmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMTM4MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRFZhcmlhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLS8qKgotICogSW5mb3JtYXRpb24gb24gdGhlIHNjcmlwdGluZyB2YXJpYWJsZXMgZGVmaW5lZCBieSB0aGlzIHRhZy4KLSAqIAotICogQHNlZSBKU1AgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVExEVmFyaWFibGUgewotCi0JLyoqCi0JICogV2hldGhlciB0aGUgdmFyaWFibGUgaXMgZGVjbGFyZWQgb3Igbm90LCB0cnVlIGlzIHRoZSBkZWZhdWx0LgotCSAqLwotCWJvb2xlYW4gZ2V0RGVjbGFyZSgpOwotCi0JLyoqCi0JICogQHJldHVybnRoZSB0aGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgdmFyaWFibGUKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZSAodHJhbnNsYXRpb24gdGltZSkgdmFsdWUgd2lsbCBnaXZlIHRoZQotCSAqIG5hbWUgb2YgdGhlIHZhcmlhYmxlLCBvciBudWxsIG9mIHRoZSBuYW1lIGlzIG5vdCB0byBiZSBvYnRhaW5lZCB0aGlzCi0JICogd2F5LgotCSAqLwotCVN0cmluZyBnZXROYW1lRnJvbUF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogVGhlIHZhcmlhYmxlIG5hbWUgZ2l2ZW4gYXMgYSBjb25zdGFudCwgb3IgbnVsbCBvZiB0aGUgbmFtZSBpcyBub3QKLQkgKiBzcGVjaWZpZWQuCi0JICovCi0JU3RyaW5nIGdldE5hbWVHaXZlbigpOwotCi0JLyoqCi0JICogVGhlIHNjb3BlIG9mIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUgZGVmaW5lZC4KLQkgKi8KLQlTdHJpbmcgZ2V0U2NvcGUoKTsKLQotCS8qKgotCSAqIE5hbWUgb2YgdGhlIGNsYXNzIG9mIHRoZSB2YXJpYWJsZSwgamF2YS5sYW5nLlN0cmluZyBpZiBudWxsCi0JICovCi0JU3RyaW5nIGdldFZhcmlhYmxlQ2xhc3MoKTsKLQotCS8qKgotCSAqIEEgbG9jYWxseSBzY29wZWQgYXR0cmlidXRlIHRvIGhvbGQgdGhlIHZhbHVlIG9mIHRoaXMgdmFyaWFibGUKLQkgKi8KLQlTdHJpbmcgZ2V0QWxpYXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0pTUEZDb250ZW50UHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWNlOTA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLS8qKgotICogUHJvcGVydGllcyBjb25zdGFudHMgdXNlZCBieSBKU1AgRnJhZ21lbnRzLiBDbGllbnRzIHNob3VsZCBvbmx5IHJlYWQgYW5kCi0gKiBtb2RpZnkgdGhlIEpTUCBGcmFnbWVudCBwcm9wZXJ0aWVzIHByb2dyYW1tYXRpY2FsbHkgdXNpbmcgdGhpcyBjbGFzcy4KLSAqIAotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzIHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpTUENPUkVfSUQgPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9LRVkgPSAiPHByb2plY3Q+IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBuYW1lZCBrZXkgdGhhdCBjb250cm9scyB0aGUgZGVmYXVsdCBsYW5ndWFnZSBmb3IgSlNQIEZyYWdtZW50cwotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUExBTkdVQUdFID0gImpzcC1sYW5ndWFnZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBBIG5hbWVkIGtleSB0aGF0IGNvbnRyb2xzIHRoZSBkZWZhdWx0IGNvbnRlbnQgdHlwZSBmb3IgSlNQIEZyYWdtZW50cwotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUENPTlRFTlRUWVBFID0gImpzcC1jb250ZW50LXR5cGUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIEpTUCBmcmFnbWVudHMgc2hvdWxkIGJlIGNvbXBpbGVkL3ZhbGlkYXRlZC4gSlNQIGZyYWdtZW50cwotCSAqIHdpbGwgYmUgdmFsaWRhdGVkIHdoZW4gdHJ1ZS4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBzaW5jZSAxLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFURV9GUkFHTUVOVFMgPSAidmFsaWRhdGVGcmFnbWVudHMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEdlbmVyYXRlcyBhIHByZWZlcmVuY2Uga2V5IGJhc2VkIG9uIHJlc291cmNlUGF0aAotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHRoZSBrZXkgd2lsbCBiZSBiYXNlZCBvZmYgb2YKLQkgKiBAcmV0dXJuIHByZWZlcmVuY2Uga2V5IGJhc2VkIG9uIHJlc291cmNlUGF0aCAoYmFzaWNhbGx5IHRoZQotCSAqICAgICAgICAgcmVzb3VyY2VQYXRoIHdpdGhvdXQgdGhlIGZpbGVuYW1lKTsgUFJPSkVDVF9LRVkgaWYgcmVzb3VyY2VQYXRoCi0JICogICAgICAgICBpcyBudWxsCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRLZXlGb3IoSVBhdGggcmVzb3VyY2VQYXRoKSB7Ci0JCVN0cmluZyBrZXkgPSBQUk9KRUNUX0tFWTsKLQkJaWYgKHJlc291cmNlUGF0aCAhPSBudWxsICYmIHJlc291cmNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCWtleSA9IHJlc291cmNlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByZWZlcmVuY2VzIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm9qZWN0IHNjb3BlIGFuZAotCSAqIHByZWZlcmVuY2Uga2V5IChzdWJOb2RlKSBJZiBjcmVhdGUgaXMgdHJ1ZSwgdGhlIHByZWZlcmVuY2Ugbm9kZSB3aWxsIGJlCi0JICogY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICB0aGUgcHJvamVjdCB0aGUgcHJlZmVyZW5jZSBub2RlIGlzIHVuZGVyCi0JICogQHBhcmFtIHByZWZlcmVuY2VLZXkKLQkgKiAgICAgICAgICAgIHRoZSBzdWJub2RlL2NhdGVnb3J5IHRoZSBwcmVmZXJlbmNlIG5vZGUgaXMgbG9jYXRlZCBpbgotCSAqIEBwYXJhbSBjcmVhdGUKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIGEgcHJlZmVyZW5jZSBub2RlIHdpbGwgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QKLQkgKiAgICAgICAgICAgIGFscmVhZHkgZXhpc3QKLQkgKiBAcmV0dXJuIFByZWZlcmVuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJvamVjdCBzY29wZSBhbmQKLQkgKiAgICAgICAgIHByZWZlcmVuY2Uga2V5LiBudWxsIGlmIG9uZSBjb3VsZCBub3QgYmUgZm91bmQgYW5kIGNyZWF0ZSBpcwotCSAqICAgICAgICAgZmFsc2UKLQkgKi8KLQlzdGF0aWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHByZWZlcmVuY2VLZXksIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCWlmIChjcmVhdGUpCi0JCQkvLyBjcmVhdGUgYWxsIG5vZGVzIGRvd24gdG8gdGhlIG9uZSB3ZSBhcmUgaW50ZXJlc3RlZCBpbgotCQkJcmV0dXJuIG5ldyBQcm9qZWN0U2NvcGUocHJvamVjdCkuZ2V0Tm9kZShKU1BDT1JFX0lEKS5ub2RlKHByZWZlcmVuY2VLZXkpOwotCQkvLyBiZSBjYXJlZnVsIGxvb2tpbmcgdXAgZm9yIG91ciBub2RlIHNvIG5vdCB0byBjcmVhdGUgYW55IG5vZGVzIGFzCi0JCS8vIHNpZGUgZWZmZWN0Ci0JCVByZWZlcmVuY2VzIG5vZGUgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRSb290Tm9kZSgpLm5vZGUoUHJvamVjdFNjb3BlLlNDT1BFKTsKLQkJdHJ5IHsKLQkJCS8vIFRPRE8gb25jZSBidWcgOTA1MDAgaXMgZml4ZWQsIHNob3VsZCBiZSBhcyBzaW1wbGUgYXMgdGhpczoKLQkJCS8vIFN0cmluZyBwYXRoID0gcHJvamVjdC5nZXROYW1lKCkgKyBJUGF0aC5TRVBBUkFUT1IgKwotCQkJLy8gUmVzb3VyY2VzUGx1Z2luLlBJX1JFU09VUkNFUyArIElQYXRoLlNFUEFSQVRPUiArCi0JCQkvLyBFTkNPRElOR19QUkVGX05PREU7Ci0JCQkvLyByZXR1cm4gbm9kZS5ub2RlRXhpc3RzKHBhdGgpID8gbm9kZS5ub2RlKHBhdGgpIDogbnVsbDsKLQkJCS8vIGZvciBub3csIHRha2UgdGhlIGxvbmcgd2F5Ci0JCQlpZiAoIW5vZGUubm9kZUV4aXN0cyhwcm9qZWN0LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlub2RlID0gbm9kZS5ub2RlKHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCWlmICghbm9kZS5ub2RlRXhpc3RzKEpTUENPUkVfSUQpKQotCQkJCXJldHVybiBudWxsOwotCQkJbm9kZSA9IG5vZGUubm9kZShKU1BDT1JFX0lEKTsKLQkJCWlmICghbm9kZS5ub2RlRXhpc3RzKHByZWZlcmVuY2VLZXkpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIG5vZGUubm9kZShwcmVmZXJlbmNlS2V5KTsKLQkJfQotCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG5vZGVFeGlzdHMgZmFpbGVkCi0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IHJldHJpZXZlIHByZWZlcmVuY2Ugbm9kZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgaW4gdGhlIGdpdmVuIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIHByb3BlcnR5IGtleQotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgY29udGV4dCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBjb250ZXh0IGlzCi0JICogICAgICAgICAgICBhdmFpbGFibGUgYW5kIHRoZSB3b3Jrc3BhY2Ugc2V0dGluZyBzaG91bGQgYmUgdGFrZW4uIE5vdGUKLQkgKiAgICAgICAgICAgIHRoYXQgcGFzc2luZyA8Y29kZT5udWxsPC9jb2RlPiBzaG91bGQgYmUgYXZvaWRlZC4KLQkgKiBAcGFyYW0gcmVjdXJzZQotCSAqICAgICAgICAgICAgd2hldGhlciB0aGUgcGFyZW50IHNob3VsZCBiZSBxdWVyaWVkIHRpbGwgcHJvcGVydHkgaXMgZm91bmQKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoZSBrZXkuCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBrZXksIElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiByZWN1cnNlKSB7Ci0JCVN0cmluZyB2YWwgPSBudWxsOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFByZWZlcmVuY2VzKHByb2plY3QsIGtleSwgZmFsc2UpOwotCQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJCXZhbCA9IGludGVybmFsR2V0UHJvcGVydHkocmVzb3VyY2UsIHJlY3Vyc2UsIHByZWZlcmVuY2VzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gbm8gcHJlZmVyZW5jZXMgZm91bmQgLSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywKLQkJLy8gc2hvcnQtY2lyY3VpdAotCQkvLyBsb29rdXAgYnkgZmFsbGluZyBiYWNrIHRvIHdvcmtzcGFjZSdzIGRlZmF1bHQKLQkJLy8gc2V0dGluZwotCQlpZiAodmFsID09IG51bGwgJiYgcmVjdXJzZSkKLQkJCXZhbCA9IGdldFdvcmtiZW5jaFByZWZlcmVuY2Uoa2V5KTsKLQkJcmV0dXJuIHZhbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0V29ya2JlbmNoUHJlZmVyZW5jZShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRTdHJpbmcoSlNQQ09SRV9JRCwga2V5LCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgaW50ZXJuYWxHZXRQcm9wZXJ0eShJUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gcmVjdXJzZSwgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMpIHsKLQkJU3RyaW5nIHZhbHVlID0gcHJlZmVyZW5jZXMuZ2V0KGdldEtleUZvcihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSwgbnVsbCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsICYmIHJlc291cmNlICE9IHJlc291cmNlLmdldFByb2plY3QoKSAmJiByZWN1cnNlKSB7Ci0JCQl2YWx1ZSA9IHByZWZlcmVuY2VzLmdldChnZXRLZXlGb3IobnVsbCksIG51bGwpOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5IGluIHRoZSBnaXZlbiBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSBrZXkKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IGNvbnRleHQuIE5vdGUgY29udGV4dCBjYW5ub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGtleS4gSWYgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgICAgIHRoZSBrZXkgaXMgcmVtb3ZlZCBmcm9tIHByb3BlcnRpZXMuCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFByZWZlcmVuY2VzKHByb2plY3QsIGtleSwgdHJ1ZSk7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQkJCXByZWZlcmVuY2VzLnJlbW92ZShnZXRLZXlGb3IocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSkpOwotCQkJCWVsc2UKLQkJCQkJcHJlZmVyZW5jZXMucHV0KGdldEtleUZvcihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSwgdmFsdWUpOwotCQkJCXRyeSB7Ci0JCQkJCS8vIHNhdmUgY2hhbmdlcwotCQkJCQlwcmVmZXJlbmNlcy5mbHVzaCgpOwotCQkJCX0KLQkJCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKU1BDT1JFX0lELCBJU3RhdHVzLkVSUk9SLCAiVW5hYmxlIHRvIHNldCBwcm9wZXJ0eSIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBXb3JrYmVuY2ggcHJlZmVyZW5jZSBtYXkgbm90IGJlIG5lZWRlZCBzbyBsZWF2ZSBvdXQgZm9yIG5vdwotCQkvLyBqdXN0IHNldCBhIHByZWZlcmVuY2UgaW4gdGhlIGluc3RhbmNlIHNjb3BlCi0JCS8vIGlmICghcHJlZmVyZW5jZUZvdW5kKSB7Ci0JCS8vIHNldFdvcmtiZW5jaFByZWZlcmVuY2Uoa2V5KTsKLQkJLy8gfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzY2Q0Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5QcmVmZXJlbmNlczsKLQotcHVibGljIGNsYXNzIEpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXIgewotCXB1YmxpYyBKU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCQlmUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCWZKb2IgPSBuZXcgQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlciBfaW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgZlJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0JQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iIGZKb2I7Ci0KLQkvKioKLQkgKiBUaGlzIGpvYiBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIHRvIGFsbG93IHRoZSByZXNvdXJjZSBjaGFuZ2UgbGlzdGVuZXIKLQkgKiB0byBzY2hlZHVsZSBvcGVyYXRpb25zIHRoYXQgbmVlZCB0byBtb2RpZnkgdGhlIHdvcmtzcGFjZS4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlckpvYiBleHRlbmRzIEpvYiB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUSUVTX1VQREFURV9ERUxBWSA9IDUwMDsKLQkJcHJpdmF0ZSBMaXN0IGFzeW5jQ2hhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iKCkgewotCQkJc3VwZXIoSlNQQ29yZU1lc3NhZ2VzLkpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmcpOwotCQkJc2V0U3lzdGVtKHRydWUpOwotCQkJc2V0UHJpb3JpdHkoSm9iLklOVEVSQUNUSVZFKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZENoYW5nZXMoU2V0IG5ld0NoYW5nZXMpIHsKLQkJCWlmIChuZXdDaGFuZ2VzLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm47Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCWFzeW5jQ2hhbmdlcy5hZGRBbGwobmV3Q2hhbmdlcyk7Ci0JCQkJYXN5bmNDaGFuZ2VzLm5vdGlmeSgpOwotCQkJfQotCQkJc2NoZWR1bGUoUFJPUEVSVElFU19VUERBVEVfREVMQVkpOwotCQl9Ci0KLQkJcHVibGljIElQcm9qZWN0IGdldE5leHRDaGFuZ2UoKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCXJldHVybiBhc3luY0NoYW5nZXMuaXNFbXB0eSgpID8gbnVsbCA6IChJUHJvamVjdCkgYXN5bmNDaGFuZ2VzLnJlbW92ZShhc3luY0NoYW5nZXMuc2l6ZSgpIC0gMSk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlNdWx0aVN0YXR1cyByZXN1bHQgPSBuZXcgTXVsdGlTdGF0dXMoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUENPUkVfSUQsIElSZXNvdXJjZVN0YXR1cy5GQUlMRURfU0VUVElOR19DSEFSU0VULCBKU1BDb3JlTWVzc2FnZXMuSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZywgbnVsbCk7Ci0JCQltb25pdG9yID0gbW9uaXRvciA9PSBudWxsID8gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSA6IG1vbml0b3I7Ci0JCQl0cnkgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKEpTUENvcmVNZXNzYWdlcy5KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nLCBhc3luY0NoYW5nZXMuc2l6ZSgpKTsKLQkJCQl0cnkgewotCQkJCQlJUHJvamVjdCBuZXh0OwotCQkJCQl3aGlsZSAoKG5leHQgPSBnZXROZXh0Q2hhbmdlKCkpICE9IG51bGwpIHsKLQkJCQkJCS8vIGp1c3QgZXhpdCBpZiB0aGUgc3lzdGVtIGlzIHNodXR0aW5nIGRvd24gb3IgaGFzCi0JCQkJCQkvLyBiZWVuIHNodXQgZG93bgotCQkJCQkJLy8gaXQgaXMgdG9vIGxhdGUgdG8gY2hhbmdlIHRoZSB3b3Jrc3BhY2UgYXQgdGhpcwotCQkJCQkJLy8gcG9pbnQgYW55d2F5Ci0JCQkJCQlpZiAoUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5vc2dpIikuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuQUNUSVZFKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIHNhdmUgdGhlIHByZWZlcmVuY2VzIG5vZGVzCi0JCQkJCQkJaWYgKG5leHQuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCQkJLy8gc2F2ZSBjb250ZW50IHR5cGUgcHJlZmVyZW5jZXMKLQkJCQkJCQkJUHJlZmVyZW5jZXMgcHJvamVjdFByZWZzID0gSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmdldFByZWZlcmVuY2VzKG5leHQsIEpTUEZDb250ZW50UHJvcGVydGllcy5KU1BDT05URU5UVFlQRSwgZmFsc2UpOwotCQkJCQkJCQlpZiAocHJvamVjdFByZWZzICE9IG51bGwpCi0JCQkJCQkJCQlwcm9qZWN0UHJlZnMuZmx1c2goKTsKLQkJCQkJCQkJLy8gc2F2ZSBsYW5ndWFnZSBwcmVmZXJlbmNlcwotCQkJCQkJCQlwcm9qZWN0UHJlZnMgPSBKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJlZmVyZW5jZXMobmV4dCwgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUExBTkdVQUdFLCBmYWxzZSk7Ci0JCQkJCQkJCWlmIChwcm9qZWN0UHJlZnMgIT0gbnVsbCkKLQkJCQkJCQkJCXByb2plY3RQcmVmcy5mbHVzaCgpOwotCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gd2UgZ290IGFuIGVycm9yIHNhdmluZwotCQkJCQkJCVN0cmluZyBkZXRhaWxNZXNzYWdlID0gTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmcsIG5leHQuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJCQkJcmVzdWx0LmFkZChuZXcgU3RhdHVzKDEgPDwgKElSZXNvdXJjZVN0YXR1cy5GQUlMRURfU0VUVElOR19DSEFSU0VUICUgMTAwIC8gMzMpLCBSZXNvdXJjZXNQbHVnaW4uUElfUkVTT1VSQ0VTLCBJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX1NFVFRJTkdfQ0hBUlNFVCwgZGV0YWlsTWVzc2FnZSwgZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCX0KLQkJCQljYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3Nob3VsZFJ1bigpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSdW4oKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCXJldHVybiAhYXN5bmNDaGFuZ2VzLmlzRW1wdHkoKTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JCXByaXZhdGUgdm9pZCBwcm9jZXNzRW50cnlDaGFuZ2VzKElSZXNvdXJjZURlbHRhIHByb2plY3REZWx0YSwgU2V0IHByb2plY3RzVG9TYXZlKSB7Ci0JCQkvLyBjaGVjayBlYWNoIHJlc291cmNlIHdpdGgganNwIGZyYWdtZW50IHNldHRpbmcgdG8gc2VlIGlmIGl0IGhhcwotCQkJLy8gYmVlbiBtb3ZlZC9kZWxldGVkCi0JCQlib29sZWFuIHJlc291cmNlQ2hhbmdlcyA9IGZhbHNlOwotCQkJYm9vbGVhbiByZXNvdXJjZUNoYW5nZXMyID0gZmFsc2U7Ci0KLQkJCS8vIHByb2plY3QgYWZmZWN0ZWQKLQkJCUlQcm9qZWN0IGN1cnJlbnRQcm9qZWN0ID0gKElQcm9qZWN0KSBwcm9qZWN0RGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQotCQkJcmVzb3VyY2VDaGFuZ2VzID0gcHJvY2Vzc1ByZWZlcmVuY2VzKGN1cnJlbnRQcm9qZWN0LCBKU1BGQ29udGVudFByb3BlcnRpZXMuSlNQQ09OVEVOVFRZUEUsIHByb2plY3REZWx0YSwgcHJvamVjdHNUb1NhdmUpOwotCQkJcmVzb3VyY2VDaGFuZ2VzMiA9IHByb2Nlc3NQcmVmZXJlbmNlcyhjdXJyZW50UHJvamVjdCwgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUExBTkdVQUdFLCBwcm9qZWN0RGVsdGEsIHByb2plY3RzVG9TYXZlKTsKLQotCQkJLy8gaWYgdGhlcmUgd2FzIGEgcHJlZmVyZW5jZSBrZXkgY2hhbmdlLCBuZWVkIHRvIHNhdmUgcHJlZmVyZW5jZXMKLQkJCWlmIChyZXNvdXJjZUNoYW5nZXMgfHwgcmVzb3VyY2VDaGFuZ2VzMikKLQkJCQlwcm9qZWN0c1RvU2F2ZS5hZGQoY3VycmVudFByb2plY3QpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdvZXMgdGhyb3VnaCBhbGwgdGhlIHJlc291cmNlLWRlcGVuZGVudCBwcmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGgKLQkJICogY3VycmVudFByb2plY3QgJiBrZXkgYW5kIHVwZGF0ZXMgdGhlIHByZWZlcmVuY2Uga2V5cyBpZiBuZWVkZWQKLQkJICogYmFzZWQgb24gcHJvamVjdERlbHRhCi0JCSAqIAotCQkgKiBAcGFyYW0gY3VycmVudFByb2plY3QKLQkJICogICAgICAgICAgICBjdXJyZW50IHByb2plY3Qgb2YgdGhlIHByZWZlcmVuY2VzIHRvIGJlIGxvb2tlZCBhdAotCQkgKiBAcGFyYW0ga2V5Ci0JCSAqICAgICAgICAgICAgY3VycmVudCBrZXkvc3ViY2F0ZWdvcnkgb2YgdGhlIHByZWZlcmVuY2VzIHRvIGJlIGxvb2tlZAotCQkgKiAgICAgICAgICAgIGF0Ci0JCSAqIEBwYXJhbSBwcm9qZWN0RGVsdGEKLQkJICogICAgICAgICAgICB0aGUgY2hhbmdlcyB0byBwcm9jZXNzIHRoZSBwcmVmZXJlbmNlIGtleXMgYWdhaW5zdAotCQkgKiBAcGFyYW0gcHJvamVjdHNUb1NhdmUKLQkJICogICAgICAgICAgICB0aGUgcHJvamVjdHMgdGhhdCBuZWVkIHRvIGJlIHVwZGF0ZWQvc2F2ZWQKLQkJICogQHJldHVybiB0cnVlIGlmIGN1cnJlbnRQcm9qZWN0J3MgcHJlZmVyZW5jZXMgd2VyZSBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NQcmVmZXJlbmNlcyhJUHJvamVjdCBjdXJyZW50UHJvamVjdCwgU3RyaW5nIGtleSwgSVJlc291cmNlRGVsdGEgcHJvamVjdERlbHRhLCBTZXQgcHJvamVjdHNUb1NhdmUpIHsKLQkJCWJvb2xlYW4gcmVzb3VyY2VDaGFuZ2VzID0gZmFsc2U7Ci0KLQkJCS8vIGdldCB0aGUgcHJvamVjdC1rZXkgcHJlZmVyZW5jZSBub2RlCi0JCQlQcmVmZXJlbmNlcyBwcm9qZWN0UHJlZnMgPSBKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJlZmVyZW5jZXMoY3VycmVudFByb2plY3QsIGtleSwgZmFsc2UpOwotCQkJaWYgKHByb2plY3RQcmVmcyA9PSBudWxsKQotCQkJCS8vIG5vIHByZWZlcmVuY2VzIGZvciB0aGlzIHByb2plY3Qta2V5LCBqdXN0IGJhaWwKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlTdHJpbmdbXSBhZmZlY3RlZFJlc291cmNlczsKLQkJCXRyeSB7Ci0JCQkJYWZmZWN0ZWRSZXNvdXJjZXMgPSBwcm9qZWN0UHJlZnMua2V5cygpOwotCQkJfQotCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gcHJvYmxlbXMgd2l0aCB0aGUgcHJvamVjdCBzY29wZS4uLiB3ZSBnb25uYSBtaXNzIHRoZQotCQkJCS8vIGNoYW5nZXMgKGJ1dCB3aWxsIGxvZykKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiUHJvYmxlbSByZXRyZWl2aW5nIEpTUCBGcmFnbWVudCBwcmVmZXJlbmNlcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQkvLyBnbyB0aHJvdWdoIGVhY2ggcHJlZmVyZW5jZSBrZXkgKHdoaWNoIGlzIHJlYWxseSBhIGZpbGUgbmFtZSkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWZmZWN0ZWRSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBzZWUgaWYgcHJlZmVyZW5jZSBrZXkvZmlsZSBuYW1lIHdhcyBmaWxlIHRoYXQgd2FzIGNoYW5nZWQKLQkJCQlJUmVzb3VyY2VEZWx0YSBtZW1iZXJEZWx0YSA9IHByb2plY3REZWx0YS5maW5kTWVtYmVyKG5ldyBQYXRoKGFmZmVjdGVkUmVzb3VyY2VzW2ldKSk7Ci0JCQkJLy8gbm8gY2hhbmdlcyBmb3IgdGhlIGdpdmVuIHJlc291cmNlCi0JCQkJaWYgKG1lbWJlckRlbHRhID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChtZW1iZXJEZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQlyZXNvdXJjZUNoYW5nZXMgPSB0cnVlOwotCQkJCQkvLyByZW1vdmUgdGhlIHNldHRpbmcgZm9yIHRoZSBvcmlnaW5hbCBsb2NhdGlvbgotCQkJCQlTdHJpbmcgY3VycmVudFZhbHVlID0gcHJvamVjdFByZWZzLmdldChhZmZlY3RlZFJlc291cmNlc1tpXSwgbnVsbCk7Ci0JCQkJCXByb2plY3RQcmVmcy5yZW1vdmUoYWZmZWN0ZWRSZXNvdXJjZXNbaV0pOwotCQkJCQlpZiAoKG1lbWJlckRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9UTykgIT0gMCkgewotCQkJCQkJLy8gaWYgbW92aW5nLCBjb3B5IHRoZSBzZXR0aW5nIGZvciB0aGUgbmV3IGxvY2F0aW9uCi0JCQkJCQlJUHJvamVjdCB0YXJnZXRQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KG1lbWJlckRlbHRhLmdldE1vdmVkVG9QYXRoKCkuc2VnbWVudCgwKSk7Ci0JCQkJCQlQcmVmZXJlbmNlcyB0YXJnZXRQcmVmcyA9IEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcmVmZXJlbmNlcyh0YXJnZXRQcm9qZWN0LCBrZXksIHRydWUpOwotCQkJCQkJdGFyZ2V0UHJlZnMucHV0KEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRLZXlGb3IobWVtYmVyRGVsdGEuZ2V0TW92ZWRUb1BhdGgoKSksIGN1cnJlbnRWYWx1ZSk7Ci0JCQkJCQlpZiAodGFyZ2V0UHJvamVjdCAhPSBjdXJyZW50UHJvamVjdCkKLQkJCQkJCQlwcm9qZWN0c1RvU2F2ZS5hZGQodGFyZ2V0UHJvamVjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzb3VyY2VDaGFuZ2VzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEZvciBhbnkgY2hhbmdlIHRvIHRoZSBlbmNvZGluZyBmaWxlIG9yIGFueSByZXNvdXJjZSB3aXRoIGVuY29kaW5nCi0JCSAqIHNldCwganVzdCBkaXNjYXJkIHRoZSBjYWNoZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcHJvamVjdC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJSVJlc291cmNlRGVsdGFbXSBwcm9qZWN0RGVsdGFzID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJLy8gcHJvY2VzcyBlYWNoIHByb2plY3QgaW4gdGhlIGRlbHRhCi0JCQlTZXQgcHJvamVjdHNUb1NhdmUgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0RGVsdGFzLmxlbmd0aDsgaSsrKQotCQkJCS8vIG5vdGhpbmcgdG8gZG8gaWYgYSBwcm9qZWN0IGhhcyBiZWVuIGFkZGVkL3JlbW92ZWQvbW92ZWQKLQkJCQlpZiAocHJvamVjdERlbHRhc1tpXS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiAocHJvamVjdERlbHRhc1tpXS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuT1BFTikgPT0gMCkKLQkJCQkJcHJvY2Vzc0VudHJ5Q2hhbmdlcyhwcm9qZWN0RGVsdGFzW2ldLCBwcm9qZWN0c1RvU2F2ZSk7Ci0JCQlmSm9iLmFkZENoYW5nZXMocHJvamVjdHNUb1NhdmUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBzdGFydHVwKCkgewotCQlfaW5zdGFuY2UgPSBuZXcgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcigpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihfaW5zdGFuY2UuZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHNodXRkb3duKCkgewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihfaW5zdGFuY2UuZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCQlfaW5zdGFuY2UgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MTExOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotCi0vKioKLSAqIFRoaXMgaXMgYW4gImFkYXB0ZXIiIGNsYXNzLCBzaW1wbHkgdG8gZ2V0IGluIGlucHV0IHN0cmVhbSB0byBhY3QgbGlrZSBhCi0gKiByZWFkZXIuIFdlIGNvdWxkIG5vdCB1c2UgSW5wdXRTdHJlYW1SZWFkZXIgZGlyZWN0bHkgYmVjYXVzZSBpdHMgaW50ZXJuYWwKLSAqIGJ1ZmZlcnMgYXJlIG5vdCBjb250cm9sbGFibGUsIGFuZCBpdCBzb21ldGltZXMgcHVsbHMgdG9vIG11Y2ggb3V0IG9mIGlucHV0Ci0gKiBzdHJlYW0gKGV2ZW4gd2hlbiBpdCB3YXNuJ3QgbmVlZGVkIGZvciBvdXIgcHVycG9zZXMpLgotICogCi0gKiBUaGUgdXNlIG9mIHRoaXMgY2xhc3MgaXMgaGlnaGx5IHNwZWNpYWxpemVkIGFuZCBieSBub3QgbWVhbnMgbWVhbnQgdG8gYmUKLSAqIGdlbmVyYWwgcHVycG9zZS4gSXRzIHVzZSBpcyByZXN0cmljdGVkIHRvIHRob3NlIGNhc2VzIHdoZXJlIHRoZSBpbnB1dAotICogc3RyZWFtIGNhbiBiZSByZWdhcmRlZCBhcyBhc2NpaSBqdXN0IGxvbmcgZW5vdWdoIHRvIGRldGVybWluZSB3aGF0IHRoZSByZWFsCi0gKiBlbmNvZGluZyBzaG91bGQgYmUuCi0gKi8KLQotcHVibGljIGNsYXNzIEJ5dGVSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IENvZGVkSU8uTUFYX0JVRl9TSVpFOwotCi0JcHJvdGVjdGVkIGJ5dGVbXSBmQnVmZmVyOwotCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIGZJbnB1dFN0cmVhbTsKLQotCXByb3RlY3RlZCBCeXRlUmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXRoaXMoaW5wdXRTdHJlYW0sIERFRkFVTFRfQlVGRkVSX1NJWkUpOwotCQlpZiAoIWlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVJlYWRlciBpcyByZXF1aXJlZCB0byBoYXZlIGEgcmVzZXR0YWJsZSBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIEJ5dGVSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGludCBzaXplKSB7Ci0JCXRoaXMuZklucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5mQnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZEFoZWFkTGltaXQpIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0ubWFyayhyZWFkQWhlYWRMaW1pdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGIwID0gdGhpcy5mSW5wdXRTdHJlYW0ucmVhZCgpOwotCQlyZXR1cm4gKGIwICYgMHgwMEZGKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoY2hhciBjaFtdLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAobGVuZ3RoID4gdGhpcy5mQnVmZmVyLmxlbmd0aCkgewotCQkJbGVuZ3RoID0gdGhpcy5mQnVmZmVyLmxlbmd0aDsKLQkJfQotCi0JCWludCBjb3VudCA9IHRoaXMuZklucHV0U3RyZWFtLnJlYWQodGhpcy5mQnVmZmVyLCAwLCBsZW5ndGgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJaW50IGIwID0gdGhpcy5mQnVmZmVyW2ldOwotCQkJLy8gdGhlIDB4MDBGRiBpcyB0byAibG9zZSIgdGhlIG5lZ2F0aXZlIGJpdHMgZmlsbGVkIGluIHRoZSBieXRlIHRvCi0JCQkvLyBpbnQgY29udmVyc2lvbgotCQkJLy8gKGFuZCB3aGljaCB3b3VsZCBiZSB0aGVyZSBpZiBjYXN0IGRpcmVjdGx5IGZyb20gYnl0ZSB0byBjaGFyKS4KLQkJCWNoYXIgYzAgPSAoY2hhcikgKGIwICYgMHgwMEZGKTsKLQkJCWNoW29mZnNldCArIGldID0gYzA7Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZklucHV0U3RyZWFtLmF2YWlsYWJsZSgpID4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLnJlc2V0KCk7Ci0JfQotCi0JcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmZJbnB1dFN0cmVhbS5za2lwKG4pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlYzdiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JVGV4dENvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLklDb250ZW50RGVzY3JpcHRpb25Gb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUZhbWlseUZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZW50RGVzY3JpYmVyRm9ySlNQIGltcGxlbWVudHMgSVRleHRDb250ZW50RGVzY3JpYmVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lW10gU1VQUE9SVEVEX09QVElPTlMgPSB7SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCwgSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5DT05URU5UX1RZUEVfQVRUUklCVVRFLCBJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkxBTkdVQUdFX0FUVFJJQlVURSwgSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5DT05URU5UX0ZBTUlMWV9BVFRSSUJVVEV9OwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaWJlciNkZXNjcmliZShqYXZhLmlvLklucHV0U3RyZWFtLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgaW50IGRlc2NyaWJlKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5WQUxJRDsKLQotCQkvLyBpZiBkaXNjcmlwdGlvbiBpcyBudWxsLCB3ZSBhcmUganVzdCBiZWluZyBhc2tlZCB0bwotCQkvLyBhc3Nlc3MgY29udGVudHMgdmFsaWRpdHkKLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGRldGVybWluZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZGV0ZXJtaW5lVmFsaWRpdHkoSW5wdXRTdHJlYW0gY29udGVudHMpIHsKLQkJLy8gVGhlcmUncyBsaXR0bGUgdG8gcHJvdmUsIHZpYSBjb250ZW50cywgdGhhdAotCQkvLyBhIGZpbGUgaXMgSlNQLCBzbyBhbHdheXMgcmV0dXJuIGludGVybWluYW50LCBhbmQKLQkJLy8gbGV0IGZpbGV0eXBlcyBkZWNpZGUuCi0JCXJldHVybiBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyI2Rlc2NyaWJlKGphdmEuaW8uUmVhZGVyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgaW50IGRlc2NyaWJlKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOVkFMSUQ7Ci0KLQkJLy8gaWYgZGlzY3JpcHRpb24gaXMgbnVsbCwgd2UgYXJlIGp1c3QgYmVpbmcgYXNrZWQgdG8KLQkJLy8gYXNzZXNzIGNvbnRlbnRzIHZhbGlkaXR5Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBkZXRlcm1pbmVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgaW50IGRldGVybWluZVZhbGlkaXR5KFJlYWRlciBjb250ZW50cykgewotCQkvLyBUaGVyZSdzIGxpdHRsZSB0byBwcm92ZSwgdmlhIGNvbnRlbnRzLCB0aGF0Ci0JCS8vIGEgZmlsZSBpcyBKU1AsIHNvIGFsd2F5cyByZXR1cm4gaW50ZXJtaW5hbnQsIGFuZAotCQkvLyBsZXQgZmlsZXR5cGVzIGRlY2lkZS4KLQkJcmV0dXJuIElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JfQotCi0JcHVibGljIFF1YWxpZmllZE5hbWVbXSBnZXRTdXBwb3J0ZWRPcHRpb25zKCkgewotCQlyZXR1cm4gU1VQUE9SVEVEX09QVElPTlM7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJCXJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLlZBTElEOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRzCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgaW50IGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoUmVhZGVyIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCWhhbmRsZUNhbGN1bGF0aW9ucyhkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQkJcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuVkFMSUQ7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBnZXREZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2FsY3VsYXRpb25zKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gaGFuZGxlIHN0YW5kYXJkIG9uZXMgZmlyc3QsIHRvIGJlIHN1cmUgZGV0ZWN0b3IgcHJvY2Vzc2VzCi0JCWhhbmRsZVN0YW5kYXJkQ2FsY3VsYXRpb25zKGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCS8vIG5vdyBkbyB0aG9zZSBzcGVjaWZpYyBmb3IgSlNQcwotCQkvLyBub3RlOiBkZXRlY3RvciBzaG91bGQgYWx3YXlzIGJlIG9mIGNvcnJlY3QgaW5zdGFuY2UsIGJ1dCB3ZSdsbAotCQkvLyBjaGVjaywgZm9yIG5vdy4KLQkJaWYgKGRldGVjdG9yIGluc3RhbmNlb2YgSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSB7Ci0JCQlKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IganNwRGV0ZWN0b3IgPSAoSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcjsKLQkJCVN0cmluZyBsYW5ndWFnZSA9IGpzcERldGVjdG9yLmdldExhbmd1YWdlKCk7Ci0JCQlpZiAobGFuZ3VhZ2UgIT0gbnVsbCAmJiBsYW5ndWFnZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkxBTkdVQUdFX0FUVFJJQlVURSwgbGFuZ3VhZ2UpOwotCQkJfQotCQkJLyoKLQkJCSAqIGNvbnRlbnQgdHlwZSBpcyBsaXRlcmFsbHkgdGhlIGNvbnRlbnQgdHlwZSB0aGF0J3MgaW4gdGhlIHBhZ2UKLQkJCSAqIGRpcmVjdGl2ZQotCQkJICovCi0JCQlTdHJpbmcgY29udGVudFR5cGVBdHRyaWJ1dGUgPSBqc3BEZXRlY3Rvci5nZXRDb250ZW50VHlwZSgpOwotCQkJaWYgKGNvbnRlbnRUeXBlQXR0cmlidXRlICE9IG51bGwgJiYgY29udGVudFR5cGVBdHRyaWJ1dGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5DT05URU5UX1RZUEVfQVRUUklCVVRFLCBjb250ZW50VHlwZUF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCQkvKgotCQkJICogY29udGVudCBmYW1pbHkgaXMgdGhlIGdlbmVyYWwgY2xhc3Mgb2YgY29udGVudCwgd2hlbiBpdHMKLQkJCSAqIGRpZmZlcmVudCBmcm9tIHdoYXQncyBkZWZpbmVkIGJ5IGNvbnRlbnQgdHlwZQotCQkJICovCi0JCQlpZiAoanNwRGV0ZWN0b3IuaXNYSFRNTCgpIHx8IGpzcERldGVjdG9yLmlzV01MKCkpIHsKLQkJCQkvLyBJU1NVRTogbG9uZyB0ZXJtIHRoaXMgbG9naWMgYW5kIHZhbHVlIHNob3VsZCBiZSBjb250cmlidXRlZCBieSBleHRlbnNpb24gcG9pbnQKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkNPTlRFTlRfRkFNSUxZX0FUVFJJQlVURSwgQ29udGVudFR5cGVGYW1pbHlGb3JIVE1MLkhUTUxfRkFNSUxZKTsKLQkJCX0KLQotCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0LCBPYmplY3QgamF2YUNoYXJzZXQpIHsKLQkJaWYgKGRldGVjdGVkQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQkvLyBPbmNlIHdlIGRldGVjdGVkIGEgY2hhcnNldCwgd2Ugc2hvdWxkIHNldCB0aGUgcHJvcGVydHkgZXZlbgotCQkJLy8gdGhvdWdoIGl0J3MgdGhlIHNhbWUgYXMgamF2YUNoYXJzZXQKLQkJCS8vIGJlY2F1c2UgdGhlcmUgYXJlIGNsaWVudHMgdGhhdCByZWx5IG9uIHRoaXMgcHJvcGVydHkgdG8KLQkJCS8vIGRldGVybWluZSBpZiB0aGUgY2hhcnNldCBpcyBhY3R1YWxseSBkZXRlY3RlZCBpbiBmaWxlIG9yIG5vdC4KLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBkZXRlY3RlZENoYXJzZXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGRldGVjdG9yCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVTdGFuZGFyZENhbGN1bGF0aW9ucyhJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIG5vdGU6IGlmIHdlJ3JlIGFza2VkIGZvciBvbmUsIHdlIHNldCB0aGVtIGFsbC4gSSBuZWVkIHRvIGJlIHN1cmUgaWYKLQkJLy8gY2FsbGVkCi0JCS8vIG11bGl0aXBsZSB0aW1lcyAob25lIGZvciBlYWNoLCBzYXkpIHRoYXQgd2UgZG9uJ3Qgd2FzdGUgdGltZQotCQkvLyBwcm9jZXNzaW5nIHNhbWUKLQkJLy8gY29udGVudCBhZ2Fpbi4KLQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9ICgoSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcikuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCS8vIFRPRE86IEkgbmVlZCB0byB2ZXJpZnkgdG8gc2VlIGlmIHRoaXMgQk9NIHdvcmsgaXMgYWx3YXlzIGRvbmUKLQkJLy8gYnkgdGV4dCB0eXBlLgotCQlPYmplY3QgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrID0gZW5jb2RpbmdNZW1lbnRvLmdldFVuaWNvZGVCT00oKTsKLQkJaWYgKGRldGVjdGVkQnl0ZU9yZGVyTWFyayAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdCeXRlT3JkZXJNYXJrID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspOwotCQkJLy8gbm90IHN1cmUgd2h5IHdvdWxkIGV2ZXIgYmUgZGlmZmVyZW50LCBzbyBpZiBpcyBkaWZmZXJlbnQsIG1heQotCQkJLy8gbmVlZCB0byAicHVzaCIgdXAgaW50byBiYXNlLgotCQkJaWYgKCFkZXRlY3RlZEJ5dGVPcmRlck1hcmsuZXF1YWxzKGV4aXN0aW5nQnl0ZU9yZGVyTWFyaykpCi0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIGRldGVjdGVkQnl0ZU9yZGVyTWFyayk7Ci0JCX0KLQotCi0JCWlmICghZW5jb2RpbmdNZW1lbnRvLmlzVmFsaWQoKSkgewotCQkJLy8gbm90ZTogYWZ0ZXIgc2V0dGluZyBoZXJlLCBpdHMgdGhlIG1lcmUgcHJlc2VuY2Ugb2YKLQkJCS8vIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUCi0JCQkvLyBpbiB0aGUgcmVzb3VyY2UncyBkZXNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBpZgotCQkJLy8gaW52YWxpZAotCQkJLy8gaW4gdGhvc2UgY2FzZXMsIHRoZSAiZGV0ZWN0ZWQiIHByb3BlcnR5IGNvbnRhaW5zIGFuCi0JCQkvLyAiYXBwcm9wcmlhdGUgZGVmYXVsdCIgdG8gdXNlLgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIGVuY29kaW5nTWVtZW50by5nZXRJbnZhbGlkRW5jb2RpbmcoKSk7Ci0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCwgZW5jb2RpbmdNZW1lbnRvLmdldEFwcHJvcHJpYXRlRGVmYXVsdCgpKTsKLQkJfQotCi0JCU9iamVjdCBkZXRlY3RlZENoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQlPYmplY3QgamF2YUNoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCk7Ci0KLQkJLy8gd2UgYWx3YXlzIGluY2x1ZGUgZGV0ZWN0ZWQsIGlmIGl0cyBkaWZmZXJlbnQgdGhhbiBqYXZhCi0JCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCi0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdDaGFyc2V0ID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKTsKLQkJCWlmIChqYXZhQ2hhcnNldC5lcXVhbHMoZXhpc3RpbmdDaGFyc2V0KSkgewotCQkJCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gd2UgbWF5IG5lZWQgdG8gYWRkIHdoYXQgd2UgZm91bmQsIGJ1dCBvbmx5IG5lZWQgdG8gYWRkCi0JCQkJLy8gaWYgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQuCi0JCQkJT2JqZWN0IGRlZmF1bHRDaGFyc2V0ID0gZGV0ZWN0b3IuZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQkJCWlmIChkZWZhdWx0Q2hhcnNldCAhPSBudWxsKSB7Ci0JCQkJCWlmICghZGVmYXVsdENoYXJzZXQuZXF1YWxzKGphdmFDaGFyc2V0KSkgewotCQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGFzc3VtaW5nIGlmIHRoZXJlIGlzIG5vIHNwZWMgZGVmYXVsdCwgd2UgYWx3YXlzIG5lZWQgdG8KLQkJCQkJLy8gYWRkLCBJJ20gYXNzdW1pbmcKLQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVsZXZlbnQoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSykpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5DT05URU5UX1RZUEVfQVRUUklCVVRFKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuTEFOR1VBR0VfQVRUUklCVVRFKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0RlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTEyODlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5Db21tb25YTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWwuRmFjZXRNb2R1bGVDb3JlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5GaWxlQ29udGVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0KLS8qKgotICogQSBjYWNoZSBmbyBwcm9wZXJ0eSBncm91cCBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gd2ViLnhtbCBmaWxlcy4gSW5mb3JtYXRpb24KLSAqIGlzIG5vdCBwZXJzaXN0ZWQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFByb3BlcnR5R3JvdXBbXSBOT19QUk9QRVJUWV9HUk9VUFMgPSBuZXcgUHJvcGVydHlHcm91cFswXTsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIERlcGxveW1lbnREZXNjcmlwdG9yIHsKLQkJUHJvcGVydHlHcm91cFtdIGdyb3VwczsKLQkJbG9uZyBtb2RpZmljYXRpb25TdGFtcDsKLQkJRmxvYXQgdmVyc2lvbiA9IG5ldyBGbG9hdChkZWZhdWx0V2ViQXBwVmVyc2lvbik7Ci0JfQotCi0JLyoqCi0JICogUmVwcmVzZW50YXRpb24gb2YgdGhlIEpTUCAyLjAgcHJvcGVydHktZ3JvdXAgZGVmaW5pdGlvbnMgZnJvbSBhIHNlcnZsZXQKLQkgKiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm9wZXJ0eUdyb3VwIHsKLQkJc3RhdGljIFByb3BlcnR5R3JvdXAgY3JlYXRlRnJvbShJUGF0aCBwYXRoLCBOb2RlIHByb3BlcnR5R3JvdXBOb2RlLCBpbnQgZ3JvdXBOdW1iZXIpIHsKLQkJCVByb3BlcnR5R3JvdXAgZ3JvdXAgPSBuZXcgUHJvcGVydHlHcm91cChwYXRoLCBncm91cE51bWJlcik7Ci0JCQlOb2RlIHByb3BlcnR5R3JvdXBJRCA9IHByb3BlcnR5R3JvdXBOb2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSUQpOwotCQkJaWYgKHByb3BlcnR5R3JvdXBJRCAhPSBudWxsKSB7Ci0JCQkJZ3JvdXAuc2V0SWQocHJvcGVydHlHcm91cElELmdldE5vZGVWYWx1ZSgpKTsKLQkJCX0KLQkJCU5vZGUgbm9kZSA9IHByb3BlcnR5R3JvdXBOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gbm9kZS5nZXRMb2NhbE5hbWUoKTsKLQkJCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQkJbmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJfQotCQkJCQlpZiAoSVNfWE1MLmVxdWFscyhuYW1lKSkgewotCQkJCQkJZ3JvdXAuc2V0SXNYTUwoZ2V0Q29udGFpbmVkVGV4dChub2RlKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoRUxfSUdOT1JFRC5lcXVhbHMobmFtZSkpIHsKLQkJCQkJCWdyb3VwLnNldEVsaWdub3JlZChnZXRDb250YWluZWRUZXh0KG5vZGUpKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChJTkNMVURFX0NPREEuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCQlncm91cC5hZGRDb2RhKGdldENvbnRhaW5lZFRleHQobm9kZSkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKElOQ0xVREVfUFJFTFVERS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJCWdyb3VwLmFkZFByZWx1ZGUoZ2V0Q29udGFpbmVkVGV4dChub2RlKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoU0NSSVBUSU5HX0lOVkFMSUQuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCQlncm91cC5zZXRTY3JpcHRpbmdJbnZhbGlkKGdldENvbnRhaW5lZFRleHQobm9kZSkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKFBBR0VfRU5DT0RJTkcuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCQlncm91cC5zZXRQYWdlRW5jb2RpbmcoZ2V0Q29udGFpbmVkVGV4dChub2RlKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoVVJMX1BBVFRFUk4uZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCQlncm91cC5zZXRVcmxQYXR0ZXJuKGdldENvbnRhaW5lZFRleHQobm9kZSkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQotCQkJcmV0dXJuIGdyb3VwOwotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGVsX2lnbm9yZWQ7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0KLQkJcHJpdmF0ZSBJUGF0aFtdIGluY2x1ZGVfY29kYSA9IG5ldyBJUGF0aFswXTsKLQotCQlwcml2YXRlIElQYXRoW10gaW5jbHVkZV9wcmVsdWRlID0gbmV3IElQYXRoWzBdOwotCQlwcml2YXRlIGJvb2xlYW4gaXNfeG1sOwotCQlwcml2YXRlIFN0cmluZ01hdGNoZXIgbWF0Y2hlcjsKLQkJcHJpdmF0ZSBTdHJpbmcgcGFnZV9lbmNvZGluZzsKLQkJcHJpdmF0ZSBib29sZWFuIHNjcmlwdGluZ19pbnZhbGlkOwotCQlTdHJpbmcgdXJsX3BhdHRlcm47Ci0JCXByaXZhdGUgSVBhdGggd2VieG1sUGF0aDsKLQotCQlpbnQgbnVtYmVyOwotCi0JCXByaXZhdGUgUHJvcGVydHlHcm91cChJUGF0aCBwYXRoLCBpbnQgbnVtYmVyKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy53ZWJ4bWxQYXRoID0gcGF0aDsKLQkJCXRoaXMubnVtYmVyID0gbnVtYmVyOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGFkZENvZGEoU3RyaW5nIGNvbnRhaW5lZFRleHQpIHsKLQkJCWlmIChjb250YWluZWRUZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJCUlQYXRoW10gY29kYXMgPSBuZXcgSVBhdGhbaW5jbHVkZV9jb2RhLmxlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoaW5jbHVkZV9jb2RhLCAwLCBjb2RhcywgMCwgaW5jbHVkZV9jb2RhLmxlbmd0aCk7Ci0JCQkJY29kYXNbaW5jbHVkZV9jb2RhLmxlbmd0aF0gPSB3ZWJ4bWxQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygyKS5hcHBlbmQoY29udGFpbmVkVGV4dCk7Ci0JCQkJaW5jbHVkZV9jb2RhID0gY29kYXM7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkUHJlbHVkZShTdHJpbmcgY29udGFpbmVkVGV4dCkgewotCQkJaWYgKGNvbnRhaW5lZFRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJSVBhdGhbXSBwcmVsdWRlcyA9IG5ldyBJUGF0aFtpbmNsdWRlX3ByZWx1ZGUubGVuZ3RoICsgMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShpbmNsdWRlX3ByZWx1ZGUsIDAsIHByZWx1ZGVzLCAwLCBpbmNsdWRlX3ByZWx1ZGUubGVuZ3RoKTsKLQkJCQlwcmVsdWRlc1tpbmNsdWRlX3ByZWx1ZGUubGVuZ3RoXSA9IHdlYnhtbFBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDIpLmFwcGVuZChjb250YWluZWRUZXh0KTsKLQkJCQlpbmNsdWRlX3ByZWx1ZGUgPSBwcmVsdWRlczsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQlyZXR1cm4gaWQ7Ci0JCX0KLQotCQlwdWJsaWMgSVBhdGhbXSBnZXRJbmNsdWRlQ29kYSgpIHsKLQkJCXJldHVybiBpbmNsdWRlX2NvZGE7Ci0JCX0KLQotCQlwdWJsaWMgSVBhdGhbXSBnZXRJbmNsdWRlUHJlbHVkZSgpIHsKLQkJCXJldHVybiBpbmNsdWRlX3ByZWx1ZGU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VFbmNvZGluZygpIHsKLQkJCXJldHVybiBwYWdlX2VuY29kaW5nOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVcmxQYXR0ZXJuKCkgewotCQkJcmV0dXJuIHVybF9wYXR0ZXJuOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNFTGlnbm9yZWQoKSB7Ci0JCQlyZXR1cm4gZWxfaWdub3JlZDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzSXNYTUwoKSB7Ci0JCQlyZXR1cm4gaXNfeG1sOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNTY3JpcHRpbmdJbnZhbGlkKCkgewotCQkJcmV0dXJuIHNjcmlwdGluZ19pbnZhbGlkOwotCQl9Ci0KLQkJYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBwYXR0ZXJuLCBib29sZWFuIG9wdGltaXN0aWMpIHsKLQkJCWlmIChtYXRjaGVyID09IG51bGwpCi0JCQkJcmV0dXJuIG9wdGltaXN0aWM7Ci0JCQlyZXR1cm4gbWF0Y2hlci5tYXRjaChwYXR0ZXJuKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBzZXRFbGlnbm9yZWQoU3RyaW5nIGVsX2lnbm9yZWQpIHsKLQkJCXRoaXMuZWxfaWdub3JlZCA9IEJvb2xlYW4udmFsdWVPZihlbF9pZ25vcmVkKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLQkJCXRoaXMuaWQgPSBpZDsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBzZXRJc1hNTChTdHJpbmcgaXNfeG1sKSB7Ci0JCQl0aGlzLmlzX3htbCA9IEJvb2xlYW4udmFsdWVPZihpc194bWwpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHNldFBhZ2VFbmNvZGluZyhTdHJpbmcgcGFnZV9lbmNvZGluZykgewotCQkJdGhpcy5wYWdlX2VuY29kaW5nID0gcGFnZV9lbmNvZGluZzsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBzZXRTY3JpcHRpbmdJbnZhbGlkKFN0cmluZyBzY3JpcHRpbmdfaW52YWxpZCkgewotCQkJdGhpcy5zY3JpcHRpbmdfaW52YWxpZCA9IEJvb2xlYW4udmFsdWVPZihzY3JpcHRpbmdfaW52YWxpZCkuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgc2V0VXJsUGF0dGVybihTdHJpbmcgdXJsX3BhdHRlcm4pIHsKLQkJCXRoaXMudXJsX3BhdHRlcm4gPSB1cmxfcGF0dGVybjsKLQkJCWlmICh1cmxfcGF0dGVybiAhPSBudWxsICYmIHVybF9wYXR0ZXJuLmxlbmd0aCgpID4gMCkgewotCQkJCXRoaXMubWF0Y2hlciA9IG5ldyBTdHJpbmdNYXRjaGVyKHVybF9wYXR0ZXJuKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gbnVtYmVyICsgIjoiICsgdXJsX3BhdHRlcm47Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCWlmIChldmVudC5nZXRUeXBlKCkgIT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpCi0JCQkJcmV0dXJuOwotCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICYmIChkZWx0YS5nZXRGbGFncygpID09IElSZXNvdXJjZURlbHRhLkVOQ09ESU5HIHx8IGRlbHRhLmdldEZsYWdzKCkgPT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUykpCi0JCQkJcmV0dXJuOwotCQkJSVJlc291cmNlRGVsdGFWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSVJlc291cmNlRGVsdGFWaXNpdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQkJCUlQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotCQkJCQkJaW50IHNlZ21lbnRDb3VudCA9IHBhdGguc2VnbWVudENvdW50KCk7Ci0JCQkJCQlpZiAoc2VnbWVudENvdW50ID4gMSAmJiBwYXRoLmxhc3RTZWdtZW50KCkuZXF1YWxzKFdFQl9YTUwpICYmIHBhdGguc2VnbWVudChzZWdtZW50Q291bnQgLSAyKS5lcXVhbHMoV0VCX0lORikpIHsKLQkJCQkJCQlnZXRJbnN0YW5jZSgpLmRlcGxveW1lbnREZXNjcmlwdG9yQ2hhbmdlZChwYXRoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQkJCVN0cmluZyBuYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOwotCQkJCQkJaWYoX2RlYnVnUmVzb2x1dGlvbkNhY2hlKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZW1vdmluZyBEZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGUgcmVzb2x1dGlvbiBjYWNoZSBmb3IgcHJvamVjdCAiICsgbmFtZSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCQl9Ci0JCQkJCQlnZXRJbnN0YW5jZSgpLnJlc29sdmVkTWFwLnJlbW92ZShuYW1lKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9OwotCQkJdHJ5IHsKLQkJCQlkZWx0YS5hY2NlcHQodmlzaXRvcik7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlc291cmNlRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyIHsKLQkJcHJpdmF0ZSBib29sZWFuIGZEb0xvZ0V4Y2VwdGlvbnMgPSBmYWxzZTsKLQkJcHJpdmF0ZSBJUGF0aCBmUGF0aDsKLQotCQlSZXNvdXJjZUVycm9ySGFuZGxlcihib29sZWFuIGxvZ0V4Y2VwdGlvbnMpIHsKLQkJCXN1cGVyKCk7Ci0JCQlmRG9Mb2dFeGNlcHRpb25zID0gbG9nRXhjZXB0aW9uczsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlpZiAoZkRvTG9nRXhjZXB0aW9ucykKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiU0FYUGFyc2VFeGNlcHRpb24gd2l0aCAiICsgZlBhdGggKyAiIChlcnJvcikgd2hpbGUgcmVhZGluZyBkZXNjcmlwdG9yOiAiICsgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlpZiAoZkRvTG9nRXhjZXB0aW9ucykKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiU0FYUGFyc2VFeGNlcHRpb24gd2l0aCAiICsgZlBhdGggKyAiIChmYXRhbEVycm9yKSB3aGlsZSByZWFkaW5nIGRlc2NyaXB0b3I6ICIgKyBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFBhdGgoSVBhdGggcGF0aCkgewotCQkJZlBhdGggPSBwYXRoOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJaWYgKGZEb0xvZ0V4Y2VwdGlvbnMpCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIlNBWFBhcnNlRXhjZXB0aW9uIHdpdGggIiArIGZQYXRoICsgIiAod2FybmluZykgd2hpbGUgcmVhZGluZyBkZXNjcmlwdG9yOiAiICsgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnByb3BlcnR5dGVzdGVyLlN0cmluZ01hdGNoZXIsIGJ1dAotCSAqIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIGEgbW9yZSBhY2N1cmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcnVsZXMgaW4KLQkgKiBTZXJ2bGV0IHNwZWMgU1JWLjExLjIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHJpbmdNYXRjaGVyIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTSU5HTEVfV0lMRF9DQVJEID0gJ1x1MDAwMCc7Ci0KLQkJLyoqCi0JCSAqIEJvdW5kYXJ5IHZhbHVlIGJleW9uZCB3aGljaCB3ZSBkb24ndCBuZWVkIHRvIHNlYXJjaCBpbiB0aGUgdGV4dAotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgYm91bmQgPSAwOwotCi0JCXByaXZhdGUgYm9vbGVhbiBoYXNMZWFkaW5nU3RhcjsKLQotCQlwcml2YXRlIGJvb2xlYW4gaGFzVHJhaWxpbmdTdGFyOwotCi0JCXByaXZhdGUgZmluYWwgU3RyaW5nIHBhdHRlcm47Ci0KLQkJcHJpdmF0ZSBmaW5hbCBpbnQgcGF0dGVybkxlbmd0aDsKLQotCQkvKioKLQkJICogVGhlIHBhdHRlcm4gc3BsaXQgaW50byBzZWdtZW50cyBzZXBhcmF0ZWQgYnkgKgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgc2VnbWVudHNbXTsKLQotCQkvKioKLQkJICogU3RyaW5nTWF0Y2hlciBjb25zdHJ1Y3RvciB0YWtlcyBpbiBhIFN0cmluZyBvYmplY3QgdGhhdCBpcyBhIHNpbXBsZQotCQkgKiBwYXR0ZXJuIHdoaWNoIG1heSBjb250YWluICcqJyBmb3IgMCBhbmQgbWFueSBjaGFyYWN0ZXJzIGFuZCAnPycgZm9yCi0JCSAqIGV4YWN0bHkgb25lIGNoYXJhY3Rlci4KLQkJICogCi0JCSAqIExpdGVyYWwgJyonIGFuZCAnPycgY2hhcmFjdGVycyBtdXN0IGJlIGVzY2FwZWQgaW4gdGhlIHBhdHRlcm4gZS5nLiwKLQkJICogIlwqIiBtZWFucyBsaXRlcmFsICIqIiwgZXRjLgotCQkgKiAKLQkJICogRXNjYXBpbmcgYW55IG90aGVyIGNoYXJhY3RlciAoaW5jbHVkaW5nIHRoZSBlc2NhcGUgY2hhcmFjdGVyCi0JCSAqIGl0c2VsZiksIGp1c3QgcmVzdWx0cyBpbiB0aGF0IGNoYXJhY3RlciBpbiB0aGUgcGF0dGVybi4gZS5nLiwgIlxhIgotCQkgKiBtZWFucyAiYSIgYW5kICJcXCIgbWVhbnMgIlwiCi0JCSAqIAotCQkgKiBJZiBpbnZva2luZyB0aGUgU3RyaW5nTWF0Y2hlciB3aXRoIHN0cmluZyBsaXRlcmFscyBpbiBKYXZhLCBkb24ndAotCQkgKiBmb3JnZXQgZXNjYXBlIGNoYXJhY3RlcnMgYXJlIHJlcHJlc2VudGVkIGJ5ICJcXCIuCi0JCSAqIAotCQkgKiBAcGFyYW0gcGF0dGVybgotCQkgKiAgICAgICAgICAgIHRoZSBwYXR0ZXJuIHRvIG1hdGNoIHRleHQgYWdhaW5zdAotCQkgKi8KLQkJU3RyaW5nTWF0Y2hlcihTdHJpbmcgcGF0dGVybikgewotCQkJaWYgKHBhdHRlcm4gPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQl0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOwotCQkJcGF0dGVybkxlbmd0aCA9IHBhdHRlcm4ubGVuZ3RoKCk7Ci0JCQlwYXJzZVdpbGRDYXJkcygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSB0ZXh0Ci0JCSAqICAgICAgICAgICAgYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF5IG9ubHkgY29udGFpbiAnPycocykKLQkJICogQHBhcmFtIHN0YXJ0Ci0JCSAqICAgICAgICAgICAgdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IGZvciBzZWFyY2gsIGluY2x1c2l2ZQotCQkgKiBAcGFyYW0gZW5kCi0JCSAqICAgICAgICAgICAgdGhlIHN0b3BwaW5nIHBvaW50IG9mIHNlYXJjaCwgZXhjbHVzaXZlCi0JCSAqIEBwYXJhbSBwCi0JCSAqICAgICAgICAgICAgYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF5IGNvbnRhaW4gJz8nCi0JCSAqIEByZXR1cm4gdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IG9mIHRoZSBwYXR0ZXJuICwgb3IgLTEgaWYKLQkJICogICAgICAgICBub3QgZm91bmQKLQkJICovCi0JCXByaXZhdGUgaW50IGZpbmRQb3NpdGlvbihTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBTdHJpbmcgcCkgewotCQkJYm9vbGVhbiBoYXNXaWxkQ2FyZCA9IHAuaW5kZXhPZihTSU5HTEVfV0lMRF9DQVJEKSA+PSAwOwotCQkJaW50IHBsZW4gPSBwLmxlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IHN0YXJ0LCBtYXggPSBlbmQgLSBwbGVuOyBpIDw9IG1heDsgKytpKSB7Ci0JCQkJaWYgKGhhc1dpbGRDYXJkKSB7Ci0JCQkJCWlmIChyZWdFeHBSZWdpb25NYXRjaGVzKHRleHQsIGksIHAsIDAsIHBsZW4pKQotCQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAodGV4dC5yZWdpb25NYXRjaGVzKHRydWUsIGksIHAsIDAsIHBsZW4pKQotCQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdpdmVuIHRoZSBzdGFydGluZyAoaW5jbHVzaXZlKSBhbmQgdGhlIGVuZGluZyAoZXhjbHVzaXZlKSBwb3NpdGlvbnMKLQkJICogaW4gdGhlIDxjb2RlPnRleHQ8L2NvZGU+LCBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHN1YnN0cmluZwotCQkgKiBtYXRjaGVzIHdpdGggYVBhdHRlcm4KLQkJICogCi0JCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHBvcnRpb24gb2YgdGhlIHRleHQgbWF0Y2hlcyB0aGUKLQkJICogICAgICAgICBwYXR0ZXJuCi0JCSAqIEBwYXJhbSB0ZXh0Ci0JCSAqICAgICAgICAgICAgYSBTdHJpbmcgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHN1YnN0cmluZyB0byBtYXRjaAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goU3RyaW5nIHRleHQpIHsKLQkJCWlmICh0ZXh0ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZmluYWwgaW50IGVuZCA9IHRleHQubGVuZ3RoKCk7Ci0JCQlmaW5hbCBpbnQgc2VnbWVudENvdW50ID0gc2VnbWVudHMubGVuZ3RoOwotCQkJaWYgKHNlZ21lbnRDb3VudCA9PSAwICYmIChoYXNMZWFkaW5nU3RhciB8fCBoYXNUcmFpbGluZ1N0YXIpKSAvLyBwYXR0ZXJuCi0JCQkJLy8gY29udGFpbnMKLQkJCQkvLyBvbmx5Ci0JCQkJLy8gJyonKHMpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAoZW5kID09IDApCi0JCQkJcmV0dXJuIHBhdHRlcm5MZW5ndGggPT0gMDsKLQkJCWlmIChwYXR0ZXJuTGVuZ3RoID09IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaW50IGN1cnJlbnRUZXh0UG9zaXRpb24gPSAwOwotCQkJaWYgKChlbmQgLSBib3VuZCkgPCAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWludCBzZWdtZW50SW5kZXggPSAwOwotCQkJU3RyaW5nIGN1cnJlbnQgPSBzZWdtZW50c1tzZWdtZW50SW5kZXhdOwotCi0JCQkvKiBwcm9jZXNzIGZpcnN0IHNlZ21lbnQgKi8KLQkJCWlmICghaGFzTGVhZGluZ1N0YXIpIHsKLQkJCQlpbnQgY3VycmVudExlbmd0aCA9IGN1cnJlbnQubGVuZ3RoKCk7Ci0JCQkJaWYgKCFyZWdFeHBSZWdpb25NYXRjaGVzKHRleHQsIDAsIGN1cnJlbnQsIDAsIGN1cnJlbnRMZW5ndGgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJc2VnbWVudEluZGV4Kys7Ci0JCQkJY3VycmVudFRleHRQb3NpdGlvbiA9IGN1cnJlbnRUZXh0UG9zaXRpb24gKyBjdXJyZW50TGVuZ3RoOwotCQkJfQotCQkJaWYgKChzZWdtZW50Q291bnQgPT0gMSkgJiYgKCFoYXNMZWFkaW5nU3RhcikgJiYgKCFoYXNUcmFpbGluZ1N0YXIpKSB7Ci0JCQkJLy8gb25seSBvbmUgc2VnbWVudCB0byBtYXRjaCwgbm8gd2lsZCBjYXJkcyBzcGVjaWZpZWQKLQkJCQlyZXR1cm4gY3VycmVudFRleHRQb3NpdGlvbiA9PSBlbmQ7Ci0JCQl9Ci0JCQkvKiBwcm9jZXNzIG1pZGRsZSBzZWdtZW50cyAqLwotCQkJd2hpbGUgKHNlZ21lbnRJbmRleCA8IHNlZ21lbnRDb3VudCkgewotCQkJCWN1cnJlbnQgPSBzZWdtZW50c1tzZWdtZW50SW5kZXhdOwotCQkJCWludCBjdXJyZW50TWF0Y2ggPSBmaW5kUG9zaXRpb24odGV4dCwgY3VycmVudFRleHRQb3NpdGlvbiwgZW5kLCBjdXJyZW50KTsKLQkJCQlpZiAoY3VycmVudE1hdGNoIDwgMCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWN1cnJlbnRUZXh0UG9zaXRpb24gPSBjdXJyZW50TWF0Y2ggKyBjdXJyZW50Lmxlbmd0aCgpOwotCQkJCXNlZ21lbnRJbmRleCsrOwotCQkJfQotCi0JCQkvKiBwcm9jZXNzIGZpbmFsIHNlZ21lbnQgKi8KLQkJCWlmICghaGFzVHJhaWxpbmdTdGFyICYmIGN1cnJlbnRUZXh0UG9zaXRpb24gIT0gZW5kKSB7Ci0JCQkJaW50IGN1cnJlbnRMZW5ndGggPSBjdXJyZW50Lmxlbmd0aCgpOwotCQkJCXJldHVybiByZWdFeHBSZWdpb25NYXRjaGVzKHRleHQsIGVuZCAtIGN1cnJlbnRMZW5ndGgsIGN1cnJlbnQsIDAsIGN1cnJlbnRMZW5ndGgpOwotCQkJfQotCQkJcmV0dXJuIHNlZ21lbnRJbmRleCA9PSBzZWdtZW50Q291bnQ7Ci0JCX0KLQotCQkvKioKLQkJICogUGFyc2VzIHRoZSBwYXR0ZXJuIGludG8gc2VnbWVudHMgc2VwYXJhdGVkIGJ5IHdpbGRjYXJkICcqJwotCQkgKiBjaGFyYWN0ZXJzLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHBhcnNlV2lsZENhcmRzKCkgewotCQkJaWYgKHBhdHRlcm4uc3RhcnRzV2l0aCgiKiIpKS8vJE5PTi1OTFMtMSQKLQkJCQloYXNMZWFkaW5nU3RhciA9IHRydWU7Ci0JCQlpZiAocGF0dGVybi5lbmRzV2l0aCgiKiIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCS8qIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbiBlc2NhcGVkIHdpbGRjYXJkICovCi0JCQkJaWYgKHBhdHRlcm5MZW5ndGggPiAxICYmIHBhdHRlcm4uY2hhckF0KHBhdHRlcm5MZW5ndGggLSAyKSAhPSAnXFwnKSB7Ci0JCQkJCWhhc1RyYWlsaW5nU3RhciA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlBcnJheUxpc3QgdGVtcCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJaW50IHBvcyA9IDA7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJd2hpbGUgKHBvcyA8IHBhdHRlcm5MZW5ndGgpIHsKLQkJCQljaGFyIGMgPSBwYXR0ZXJuLmNoYXJBdChwb3MrKyk7Ci0JCQkJc3dpdGNoIChjKSB7Ci0JCQkJCWNhc2UgJ1xcJyA6Ci0JCQkJCQlpZiAocG9zID49IHBhdHRlcm5MZW5ndGgpIHsKLQkJCQkJCQlidWYuYXBwZW5kKGMpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJY2hhciBuZXh0ID0gcGF0dGVybi5jaGFyQXQocG9zKyspOwotCQkJCQkJCS8qIGlmIGl0J3MgYW4gZXNjYXBlIHNlcXVlbmNlICovCi0JCQkJCQkJaWYgKG5leHQgPT0gJyonIHx8IG5leHQgPT0gJz8nIHx8IG5leHQgPT0gJ1xcJykgewotCQkJCQkJCQlidWYuYXBwZW5kKG5leHQpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJLyoKLQkJCQkJCQkJICogbm90IGFuIGVzY2FwZSBzZXF1ZW5jZSwganVzdCBpbnNlcnQKLQkJCQkJCQkJICogbGl0ZXJhbGx5Ci0JCQkJCQkJCSAqLwotCQkJCQkJCQlidWYuYXBwZW5kKGMpOwotCQkJCQkJCQlidWYuYXBwZW5kKG5leHQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlICcqJyA6Ci0JCQkJCQlpZiAoYnVmLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCS8qIG5ldyBzZWdtZW50ICovCi0JCQkJCQkJdGVtcC5hZGQoYnVmLnRvU3RyaW5nKCkpOwotCQkJCQkJCWJvdW5kICs9IGJ1Zi5sZW5ndGgoKTsKLQkJCQkJCQlidWYuc2V0TGVuZ3RoKDApOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJz8nIDoKLQkJCQkJCS8qCi0JCQkJCQkgKiBhcHBlbmQgc3BlY2lhbCBjaGFyYWN0ZXIgcmVwcmVzZW50aW5nIHNpbmdsZSBtYXRjaAotCQkJCQkJICogd2lsZGNhcmQKLQkJCQkJCSAqLwotCQkJCQkJYnVmLmFwcGVuZChTSU5HTEVfV0lMRF9DQVJEKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCWJ1Zi5hcHBlbmQoYyk7Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBhZGQgbGFzdCBidWZmZXIgdG8gc2VnbWVudCBsaXN0ICovCi0JCQlpZiAoYnVmLmxlbmd0aCgpID4gMCkgewotCQkJCXRlbXAuYWRkKGJ1Zi50b1N0cmluZygpKTsKLQkJCQlib3VuZCArPSBidWYubGVuZ3RoKCk7Ci0JCQl9Ci0JCQlzZWdtZW50cyA9IChTdHJpbmdbXSkgdGVtcC50b0FycmF5KG5ldyBTdHJpbmdbdGVtcC5zaXplKCldKTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICogQHJldHVybiBib29sZWFuCi0JCSAqIEBwYXJhbSB0ZXh0Ci0JCSAqICAgICAgICAgICAgYSBTdHJpbmcgdG8gbWF0Y2gKLQkJICogQHBhcmFtIHRTdGFydAotCQkgKiAgICAgICAgICAgIHRoZSBzdGFydGluZyBpbmRleCBvZiBtYXRjaCwgaW5jbHVzaXZlCi0JCSAqIEBwYXJhbSBwCi0JCSAqICAgICAgICAgICAgYSBzaW1wbGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF5IGNvbnRhaW4gJz8nCi0JCSAqIEBwYXJhbSBwU3RhcnQKLQkJICogICAgICAgICAgICBUaGUgc3RhcnQgcG9zaXRpb24gaW4gdGhlIHBhdHRlcm4KLQkJICogQHBhcmFtIHBsZW4KLQkJICogICAgICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBwYXR0ZXJuCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gcmVnRXhwUmVnaW9uTWF0Y2hlcyhTdHJpbmcgdGV4dCwgaW50IHRTdGFydCwgU3RyaW5nIHAsIGludCBwU3RhcnQsIGludCBwbGVuKSB7Ci0JCQl3aGlsZSAocGxlbi0tID4gMCkgewotCQkJCWNoYXIgdGNoYXIgPSB0ZXh0LmNoYXJBdCh0U3RhcnQrKyk7Ci0JCQkJY2hhciBwY2hhciA9IHAuY2hhckF0KHBTdGFydCsrKTsKLQotCQkJCS8vIHByb2Nlc3Mgd2lsZCBjYXJkcywgc2tpcHBpbmcgc2luZ2xlIHdpbGQgY2FyZHMKLQkJCQlpZiAocGNoYXIgPT0gU0lOR0xFX1dJTERfQ0FSRCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKHBjaGFyID09IHRjaGFyKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHRjaGFyKSA9PSBDaGFyYWN0ZXIudG9VcHBlckNhc2UocGNoYXIpKQotCQkJCQljb250aW51ZTsKLQkJCQkvLyBjb21wYXJpbmcgYWZ0ZXIgY29udmVydGluZyB0byB1cHBlciBjYXNlIGRvZXNuJ3QgaGFuZGxlIGFsbAotCQkJCS8vIGNhc2VzOwotCQkJCS8vIGFsc28gY29tcGFyZSBhZnRlciBjb252ZXJ0aW5nIHRvIGxvd2VyIGNhc2UKLQkJCQlpZiAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHRjaGFyKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UocGNoYXIpKQotCQkJCQljb250aW51ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIERlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZSBfaW5zdGFuY2UgPSBuZXcgRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWdSZXNvbHV0aW9uQ2FjaGUgPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IGRlZmF1bHRXZWJBcHBWZXJzaW9uID0gMi40ZjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRUxfSUdOT1JFRCA9ICJlbC1pZ25vcmVkIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSUQgPSAiaWQiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBJTkNMVURFX0NPREEgPSAiaW5jbHVkZS1jb2RhIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSU5DTFVERV9QUkVMVURFID0gImluY2x1ZGUtcHJlbHVkZSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSVNfWE1MID0gImlzLXhtbCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEpTUF9QUk9QRVJUWV9HUk9VUCA9ICJqc3AtcHJvcGVydHktZ3JvdXAiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBQQUdFX0VOQ09ESU5HID0gInBhZ2UtZW5jb2RpbmciOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNDUklQVElOR19JTlZBTElEID0gInNjcmlwdGluZy1pbnZhbGlkIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVVJMX1BBVFRFUk4gPSAidXJsLXBhdHRlcm4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfQVBQX0VMRU1FTlRfTE9DQUxfTkFNRSA9ICI6d2ViLWFwcCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9BUFBfRUxFTUVOVF9OQU1FID0gIndlYi1hcHAiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9BUFBfVkVSU0lPTl9OQU1FID0gInZlcnNpb24iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfSU5GID0gIldFQi1JTkYiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfWE1MID0gIndlYi54bWwiOwotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfSU5GX1dFQl9YTUwgPSBXRUJfSU5GICsgSVBhdGguU0VQQVJBVE9SCi0JLy8gKyBXRUJfWE1MOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTEFTSF9XRUJfSU5GX1dFQl9YTUwgPSBQYXRoLlJPT1QudG9TdHJpbmcoKSArIFdFQl9JTkYgKyBJUGF0aC5TRVBBUkFUT1IgKyBXRUJfWE1MOwotCi0Jc3RhdGljIFN0cmluZyBnZXRDb250YWluZWRUZXh0KE5vZGUgcGFyZW50KSB7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKGNoaWxkcmVuLmdldExlbmd0aCgpID09IDEpIHsKLQkJCXJldHVybiBjaGlsZHJlbi5pdGVtKDApLmdldE5vZGVWYWx1ZSgpLnRyaW0oKTsKLQkJfQotCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTm9kZSBjaGlsZCA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkgewotCQkJCVN0cmluZyByZWZlcmVuY2UgPSAoKEVudGl0eVJlZmVyZW5jZSkgY2hpbGQpLmdldE5vZGVWYWx1ZSgpOwotCQkJCWlmIChyZWZlcmVuY2UgPT0gbnVsbCAmJiBjaGlsZC5nZXROb2RlTmFtZSgpICE9IG51bGwpIHsKLQkJCQkJcmVmZXJlbmNlID0gIiYiICsgY2hpbGQuZ2V0Tm9kZU5hbWUoKSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkgewotCQkJCQlzLmFwcGVuZChyZWZlcmVuY2UudHJpbSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzLmFwcGVuZChjaGlsZC5nZXROb2RlVmFsdWUoKS50cmltKCkpOwotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBzLnRvU3RyaW5nKCkudHJpbSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gX2luc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgYnkgY2xpZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnQoKSB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGdldEluc3RhbmNlKCkuZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHN0b3AoKSB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGdldEluc3RhbmNlKCkuZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgUmVzb3VyY2VFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyOwotCi0JcHJpdmF0ZSBNYXAgZkRlcGxveW1lbnREZXNjcmlwdG9ycyA9IG5ldyBIYXNodGFibGUoKTsKLQotCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpOwotCi0JLy8gZm9yIHVzZSB3aGVuIHJlYWRpbmcgVExEcwotCXByaXZhdGUgRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXI7Ci0JCi0JTWFwIHJlc29sdmVkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBfcGFyc2VEb2N1bWVudChJUGF0aCBwYXRoLCBGbG9hdFtdIHZlcnNpb24sIExpc3QgZ3JvdXBMaXN0LCBTdWJQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvciwgRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJRWxlbWVudCB3ZWJhcHAgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJaWYgKHdlYmFwcCAhPSBudWxsKSB7Ci0JCQlpZiAod2ViYXBwLmdldFRhZ05hbWUoKS5lcXVhbHMoV0VCX0FQUF9FTEVNRU5UX05BTUUpIHx8IHdlYmFwcC5nZXROb2RlTmFtZSgpLmVuZHNXaXRoKFdFQl9BUFBfRUxFTUVOVF9MT0NBTF9OQU1FKSkgewotCQkJCVN0cmluZyB2ZXJzaW9uVmFsdWUgPSB3ZWJhcHAuZ2V0QXR0cmlidXRlKFdFQl9BUFBfVkVSU0lPTl9OQU1FKTsKLQkJCQlpZiAodmVyc2lvblZhbHVlICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXZlcnNpb25bMF0gPSBGbG9hdC52YWx1ZU9mKHZlcnNpb25WYWx1ZSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBkb2Vzbid0IG1hdHRlcgotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCU5vZGVMaXN0IHByb3BlcnR5R3JvdXBFbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKEpTUF9QUk9QRVJUWV9HUk9VUCk7Ci0JCWludCBsZW5ndGggPSBwcm9wZXJ0eUdyb3VwRWxlbWVudHMuZ2V0TGVuZ3RoKCk7Ci0JCXN1Yk1vbml0b3IuYmVnaW5UYXNrKCJSZWFkaW5nIFByb3BlcnR5IEdyb3VwcyIsIGxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCVByb3BlcnR5R3JvdXAgZ3JvdXAgPSBQcm9wZXJ0eUdyb3VwLmNyZWF0ZUZyb20ocGF0aCwgcHJvcGVydHlHcm91cEVsZW1lbnRzLml0ZW0oaSksIGkpOwotCQkJc3ViTW9uaXRvci53b3JrZWQoMSk7Ci0JCQlpZiAoZ3JvdXAgIT0gbnVsbCkgewotCQkJCWdyb3VwTGlzdC5hZGQoZ3JvdXApOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgU1JWIHNwZWMgdmVyc2lvbiB0byB0aGUgSlNQIHNwZWMgdmVyc2lvbgotCSAqLwotCXByaXZhdGUgZmxvYXQgY29udmVydFNwZWNWZXJzaW9ucyhmbG9hdCB2ZXJzaW9uKSB7Ci0JCWlmICh2ZXJzaW9uID4gMCkgewotCQkJaWYgKHZlcnNpb24gPT0gMi41ZikKLQkJCQlyZXR1cm4gMi4xZjsKLQkJCWVsc2UgaWYgKHZlcnNpb24gPT0gMi40ZikKLQkJCQlyZXR1cm4gMi4wZjsKLQkJCWVsc2UgaWYgKHZlcnNpb24gPT0gMi4zZikKLQkJCQlyZXR1cm4gMS4yZjsKLQkJCWVsc2UgaWYgKHZlcnNpb24gPT0gMi4yZikKLQkJCQlyZXR1cm4gMS4xZjsKLQkJCWVsc2UgaWYgKHZlcnNpb24gPT0gMi4xZikKLQkJCQlyZXR1cm4gMS4wZjsKLQkJfQotCQlyZXR1cm4gY29udmVydFNwZWNWZXJzaW9ucyhkZWZhdWx0V2ViQXBwVmVyc2lvbik7Ci0JfQotCi0Jdm9pZCBkZXBsb3ltZW50RGVzY3JpcHRvckNoYW5nZWQoZmluYWwgSVBhdGggZnVsbFBhdGgpIHsKLQkJaWYgKGZEZXBsb3ltZW50RGVzY3JpcHRvcnMuY29udGFpbnNLZXkoZnVsbFBhdGgubWFrZUFic29sdXRlKCkpKSB7Ci0JCQl1cGRhdGVDYWNoZUVudHJ5KGZ1bGxQYXRoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHBhcnNlIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgdXNpbmcgWGVyY2VzLCBhbmQgaWYgdGhhdCBmYWlscywgdXNlIHRoZQotCSAqIFNTRSBYTUwgcGFyc2VyIHRvIGZpbmQgdGhlIHByb3BlcnR5IGdyb3Vwcy4KLQkgKi8KLQlwcml2YXRlIERlcGxveW1lbnREZXNjcmlwdG9yIGZldGNoRGVzY3JpcHRvcihJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJbW9uaXRvci5iZWdpblRhc2soIlJlYWRpbmcgRGVwbG95bWVudCBEZXNjcmlwdG9yIiwgMyk7Ci0JCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0KLQkJUHJvcGVydHlHcm91cCBncm91cHNbXSA9IG51bGw7Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCUxpc3QgZ3JvdXBMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlGbG9hdFtdIHZlcnNpb24gPSBuZXcgRmxvYXRbMV07Ci0JCVN1YlByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAyKTsKLQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBDb21tb25YTUwuZ2V0RG9jdW1lbnRCdWlsZGVyKGZhbHNlKTsKLQkJYnVpbGRlci5zZXRFbnRpdHlSZXNvbHZlcihnZXRFbnRpdHlSZXNvbHZlcigpKTsKLQkJYnVpbGRlci5zZXRFcnJvckhhbmRsZXIoZ2V0RXJyb3JIYW5kbGVyKHBhdGgpKTsKLQkJdHJ5IHsJCQkKLQkJCUlucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKCk7Ci0JCQlTdHJpbmcgcyA9IEZpbGVDb250ZW50Q2FjaGUuZ2V0SW5zdGFuY2UoKS5nZXRDb250ZW50cyhwYXRoKTsKLQkJCWlucHV0U291cmNlLnNldENoYXJhY3RlclN0cmVhbShuZXcgU3RyaW5nUmVhZGVyKHMpKTsKLQkJCWlucHV0U291cmNlLnNldFN5c3RlbUlkKHBhdGgudG9TdHJpbmcoKSk7Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IGJ1aWxkZXIucGFyc2UoaW5wdXRTb3VyY2UpOwotCQkJX3BhcnNlRG9jdW1lbnQocGF0aCwgdmVyc2lvbiwgZ3JvdXBMaXN0LCBzdWJNb25pdG9yLCBkb2N1bWVudCk7Ci0JCX0KLQkJY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlMSkgewotCQkJLyogZW5jb3VudGVyZWQgYSBmYXRhbCBwYXJzaW5nIGVycm9yLCB0cnkgb3VyIG93biBwYXJzZXIgKi8KLQkJCXRyeSB7Ci0JCQkJLyoqCi0JCQkJICogQ2hpZWZseSBiZWNhdXNlIHRoZSB3ZWIueG1sIGZpbGUgaXRzZWxmIGlzIGVkaXRhYmxlLCB1c2UKLQkJCQkgKiBTU0UgdG8gZ2V0IHRoZSBET00gRG9jdW1lbnQgYmVjYXVzZSBpdCBpcyBtb3JlIGZhdWx0Ci0JCQkJICogdG9sZXJhbnQuCi0JCQkJICovCi0JCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmaWxlKTsKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCQlfcGFyc2VEb2N1bWVudChwYXRoLCB2ZXJzaW9uLCBncm91cExpc3QsIHN1Yk1vbml0b3IsIGRvY3VtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJLyogZmlsZSBpcyB1bnJlYWRhYmxlLCBjcmVhdGUgbm8gcHJvcGVydHkgZ3JvdXBzICovCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlncm91cHMgPSAoUHJvcGVydHlHcm91cFtdKSBncm91cExpc3QudG9BcnJheShuZXcgUHJvcGVydHlHcm91cFtncm91cExpc3Quc2l6ZSgpXSk7Ci0JCQlzdWJNb25pdG9yLmRvbmUoKTsKLQkJfQotCi0JCWlmIChncm91cHMgPT0gbnVsbCkgewotCQkJZ3JvdXBzID0gTk9fUFJPUEVSVFlfR1JPVVBTOwotCQl9Ci0KLQkJRGVwbG95bWVudERlc2NyaXB0b3IgZGVwbG95bWVudERlc2NyaXB0b3IgPSBuZXcgRGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJZGVwbG95bWVudERlc2NyaXB0b3IubW9kaWZpY2F0aW9uU3RhbXAgPSBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCWRlcGxveW1lbnREZXNjcmlwdG9yLmdyb3VwcyA9IGdyb3VwczsKLQkJZGVwbG95bWVudERlc2NyaXB0b3IudmVyc2lvbiA9IHZlcnNpb25bMF07Ci0JCW1vbml0b3IuZG9uZSgpOwotCQlmRGVwbG95bWVudERlc2NyaXB0b3JzLnB1dChwYXRoLCBuZXcgU29mdFJlZmVyZW5jZShkZXBsb3ltZW50RGVzY3JpcHRvcikpOwotCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3I7Ci0JfQotCi0JcHJpdmF0ZSBFbnRpdHlSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcigpIHsKLQkJaWYgKHJlc29sdmVyID09IG51bGwpIHsKLQkJCXJlc29sdmVyID0gbmV3IEVudGl0eVJlc29sdmVyKCkgewotCQkJCXB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCQkJCUlucHV0U291cmNlIHJlc3VsdCA9IG5ldyBJbnB1dFNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pKTsKLQkJCQkJcmVzdWx0LnNldFB1YmxpY0lkKHB1YmxpY0lEKTsKLQkJCQkJcmVzdWx0LnNldFN5c3RlbUlkKHN5c3RlbUlEICE9IG51bGwgPyBzeXN0ZW1JRCA6ICIvXyIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiByZXNvbHZlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIEVycm9ySGFuZGxlciB0aGF0IHdpbGwgbm90IHN0b3AgdGhlIHBhcnNlciBvbiByZXBvcnRlZAotCSAqIGVycm9ycwotCSAqLwotCXByaXZhdGUgRXJyb3JIYW5kbGVyIGdldEVycm9ySGFuZGxlcihJUGF0aCBwYXRoKSB7Ci0JCWlmIChlcnJvckhhbmRsZXIgPT0gbnVsbCkgewotCQkJZXJyb3JIYW5kbGVyID0gbmV3IFJlc291cmNlRXJyb3JIYW5kbGVyKGZhbHNlKTsKLQkJfQotCQllcnJvckhhbmRsZXIuc2V0UGF0aChwYXRoKTsKLQkJcmV0dXJuIGVycm9ySGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZnVsbFBhdGgKLQkgKiBAcmV0dXJuIHRoZSBKU1AgdmVyc2lvbiBzdXBwb3J0ZWQgYnkgdGhlIHdlYiBhcHBsaWNhdGlvbiBjb250YWluaW5nIHRoZQotCSAqICAgICAgICAgcGF0aC4gQSB2YWx1ZSBzdGF0ZWQgd2l0aGluIGEgd2ViLnhtbCBmaWxlIHRha2VzIHByaW9yaXR5LgotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRKU1BWZXJzaW9uKElQYXRoIGZ1bGxQYXRoKSB7Ci0JCWZsb2F0IHZlcnNpb24gPSBkZWZhdWx0V2ViQXBwVmVyc2lvbjsKLQkJLyogdHJ5IGFwcGxpY2FibGUgd2ViLnhtbCBmaWxlIGZpcnN0ICovCi0JCUlQYXRoIHdlYnhtbFBhdGggPSBnZXRXZWJYTUxQYXRoKGZ1bGxQYXRoKTsKLQkJaWYgKHdlYnhtbFBhdGggIT0gbnVsbCkgewotCQkJSUZpbGUgd2VieG1sRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZSh3ZWJ4bWxQYXRoKTsKLQkJCWlmICh3ZWJ4bWxGaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJUmVmZXJlbmNlIGRlc2NyaXB0b3JIb2xkZXIgPSAoUmVmZXJlbmNlKSBmRGVwbG95bWVudERlc2NyaXB0b3JzLmdldCh3ZWJ4bWxQYXRoKTsKLQkJCQlEZXBsb3ltZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbnVsbDsKLQotCQkJCWlmIChkZXNjcmlwdG9ySG9sZGVyID09IG51bGwgfHwgKChkZXNjcmlwdG9yID0gKERlcGxveW1lbnREZXNjcmlwdG9yKSBkZXNjcmlwdG9ySG9sZGVyLmdldCgpKSA9PSBudWxsKSB8fCAoZGVzY3JpcHRvci5tb2RpZmljYXRpb25TdGFtcCA9PSBJUmVzb3VyY2UuTlVMTF9TVEFNUCkgfHwgKGRlc2NyaXB0b3IubW9kaWZpY2F0aW9uU3RhbXAgIT0gd2VieG1sRmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpKSkgewotCQkJCQlkZXNjcmlwdG9yID0gZmV0Y2hEZXNjcmlwdG9yKHdlYnhtbFBhdGgsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0KLQotCQkJCWlmIChkZXNjcmlwdG9yLnZlcnNpb24gIT0gbnVsbCkgewotCQkJCQl2ZXJzaW9uID0gZGVzY3JpcHRvci52ZXJzaW9uLmZsb2F0VmFsdWUoKTsKLQkJCQkJcmV0dXJuIGNvbnZlcnRTcGVjVmVyc2lvbnModmVyc2lvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyogY2hlY2sgZmFjZXQgc2V0dGluZ3MgKi8KLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChmdWxsUGF0aC5zZWdtZW50KDApKTsKLQkJdmVyc2lvbiA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQuZ2V0RHluYW1pY1dlYlByb2plY3RWZXJzaW9uKHByb2plY3QpOwotCi0JCXJldHVybiBjb252ZXJ0U3BlY1ZlcnNpb25zKHZlcnNpb24pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBqc3BGaWxlUGF0aAotCSAqIEByZXR1cm4gUHJvcGVydHlHcm91cHMgbWF0Y2hpbmcgdGhlIGZpbGUgYXQgdGhlIGdpdmVuIHBhdGggb3IgYW4gZW1wdHkKLQkgKiAgICAgICAgIGFycmF5IGlmIG5vIHdlYi54bWwgZmlsZSBleGlzdHMgb3Igbm8gbWF0Y2hpbmcgcHJvcGVydHkgZ3JvdXAKLQkgKiAgICAgICAgIHdhcyBkZWZpbmVkLiBBIHJldHVybmVkIFByb3BlcnR5R3JvdXAgb2JqZWN0IHNob3VsZCBiZQotCSAqICAgICAgICAgY29uc2lkZXJlZCBzaG9ydC1saXZlZCBhbmQgbm90IHNhdmVkIGZvciBsYXRlciB1c2UuCi0JICovCi0JcHVibGljIFByb3BlcnR5R3JvdXBbXSBnZXRQcm9wZXJ0eUdyb3VwcyhJUGF0aCBqc3BGaWxlUGF0aCkgewotCQlMaXN0IG1hdGNoaW5nR3JvdXBzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJSVBhdGggd2VieG1sUGF0aCA9IGdldFdlYlhNTFBhdGgoanNwRmlsZVBhdGgpOwotCQlpZiAod2VieG1sUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIE5PX1BST1BFUlRZX0dST1VQUzsKLQotCQlJRmlsZSB3ZWJ4bWxGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHdlYnhtbFBhdGgpOwotCQlpZiAoIXdlYnhtbEZpbGUuaXNBY2Nlc3NpYmxlKCkpCi0JCQlyZXR1cm4gTk9fUFJPUEVSVFlfR1JPVVBTOwotCi0JCVJlZmVyZW5jZSBkZXNjcmlwdG9ySG9sZGVyID0gKFJlZmVyZW5jZSkgZkRlcGxveW1lbnREZXNjcmlwdG9ycy5nZXQod2VieG1sUGF0aCk7Ci0JCURlcGxveW1lbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBudWxsOwotCi0JCWlmIChkZXNjcmlwdG9ySG9sZGVyID09IG51bGwgfHwgKChkZXNjcmlwdG9yID0gKERlcGxveW1lbnREZXNjcmlwdG9yKSBkZXNjcmlwdG9ySG9sZGVyLmdldCgpKSA9PSBudWxsKSB8fCAoZGVzY3JpcHRvci5tb2RpZmljYXRpb25TdGFtcCA9PSBJUmVzb3VyY2UuTlVMTF9TVEFNUCkgfHwgKGRlc2NyaXB0b3IubW9kaWZpY2F0aW9uU3RhbXAgIT0gd2VieG1sRmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpKSkgewotCQkJZGVzY3JpcHRvciA9IGZldGNoRGVzY3JpcHRvcih3ZWJ4bWxQYXRoLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci5ncm91cHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkZXNjcmlwdG9yLmdyb3Vwc1tpXS5tYXRjaGVzKEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQuZ2V0UnVudGltZVBhdGgoanNwRmlsZVBhdGgpLnRvU3RyaW5nKCksIGZhbHNlKSkgewotCQkJCW1hdGNoaW5nR3JvdXBzLmFkZChkZXNjcmlwdG9yLmdyb3Vwc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG1hdGNoaW5nR3JvdXBzLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLmdyb3Vwcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChkZXNjcmlwdG9yLmdyb3Vwc1tpXS5tYXRjaGVzKEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQuZ2V0UnVudGltZVBhdGgoanNwRmlsZVBhdGgpLnRvU3RyaW5nKCksIHRydWUpKSB7Ci0JCQkJCW1hdGNoaW5nR3JvdXBzLmFkZChkZXNjcmlwdG9yLmdyb3Vwc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoUHJvcGVydHlHcm91cFtdKSBtYXRjaGluZ0dyb3Vwcy50b0FycmF5KG5ldyBQcm9wZXJ0eUdyb3VwW21hdGNoaW5nR3JvdXBzLnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgSVBhdGggZ2V0V2ViWE1MUGF0aChJUGF0aCBmdWxsUGF0aCkgewotCQkvKgotCQkgKiBJdCBjYW4gdGFrZSB0aGUgYmV0dGVyIHBhcnQgb2YgYSBmdWxsIHNlY29uZCB0byBkbyB0aGlzLCBzbyBjYWNoZQotCQkgKiB0aGUgcmVzdWx0LgotCQkgKi8KLQkJSVBhdGggcmVzb2x2ZWQgPSBudWxsOwotCQlNYXAgbWFwRm9yUHJvamVjdCA9IG51bGw7Ci0JCW1hcEZvclByb2plY3QgPSAoTWFwKSByZXNvbHZlZE1hcC5nZXQoZnVsbFBhdGguc2VnbWVudCgwKSk7Ci0JCWlmIChtYXBGb3JQcm9qZWN0ICE9IG51bGwpIHsKLQkJCXJlc29sdmVkID0gKElQYXRoKSBtYXBGb3JQcm9qZWN0LmdldChmdWxsUGF0aCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQltYXBGb3JQcm9qZWN0ID0gbmV3IEhhc2hNYXAoKTsKLQkJCXJlc29sdmVkTWFwLnB1dChmdWxsUGF0aC5zZWdtZW50KDApLCBtYXBGb3JQcm9qZWN0KTsKLQkJfQotCi0JCWlmIChyZXNvbHZlZCAhPSBudWxsKSB7Ci0JCQlpZiAoX2RlYnVnUmVzb2x1dGlvbkNhY2hlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJEZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGUgcmVzb2x1dGlvbiBjYWNoZSBoaXQgZm9yICIgKyBmdWxsUGF0aCk7IC8vJE5PTi1OTFMtMSQgCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoX2RlYnVnUmVzb2x1dGlvbkNhY2hlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJEZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGUgcmVzb2x1dGlvbiBjYWNoZSBtaXNzIGZvciAiICsgZnVsbFBhdGgpOyAvLyROT04tTkxTLTEkIAotCQkJfQotCQkJcmVzb2x2ZWQgPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LnJlc29sdmUoZnVsbFBhdGgsIFNMQVNIX1dFQl9JTkZfV0VCX1hNTCk7Ci0JCQltYXBGb3JQcm9qZWN0LnB1dChmdWxsUGF0aCwgcmVzb2x2ZWQpOwotCQl9Ci0JCXJldHVybiByZXNvbHZlZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2FjaGVFbnRyeShJUGF0aCBmdWxsUGF0aCkgewotCQkvKiBkb24ndCB1cGRhdGUgcmlnaHQgbm93OyByZW1vdmUgYW5kIHdhaXQgZm9yIGFub3RoZXIgcXVlcnkgdG8gdXBkYXRlICovCi0JCWZEZXBsb3ltZW50RGVzY3JpcHRvcnMucmVtb3ZlKGZ1bGxQYXRoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IZWFkUGFyc2VyVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE1OGFkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotcHVibGljIGNsYXNzIEhlYWRQYXJzZXJUb2tlbiB7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCi0JcHJpdmF0ZSBTdHJpbmcgZlRleHQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZlR5cGU7Ci0KLQlwcm90ZWN0ZWQgSGVhZFBhcnNlclRva2VuKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBIZWFkUGFyc2VyVG9rZW4oU3RyaW5nIHR5cGUsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJdGhpcygpOwotCQlmVHlwZSA9IHR5cGU7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmVGV4dCA9IHRleHQ7Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBmVGV4dDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gKCJ0ZXh0OiAiICsgZlRleHQgKyAiIG9mZnNldDogIiArIGZTdGFydCArICIgdHlwZTogIiArIGZUeXBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5Yzc0NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JbnRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotLyoKLSAqIAotICogQSBub24tcmVzaXphYmxlIGNsYXNzIGltcGxlbWVudGluZyB0aGUgYmVoYXZpb3Igb2YgamF2YS51dGlsLlN0YWNrLCBidXQKLSAqIGRpcmVjdGx5IGZvciB0aGUgPGNvZGU+IGludGVnZXIgPC9jb2RlPiBwcmltaXRpdmUuCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEludFN0YWNrIHsKLQlwcml2YXRlIGludFtdIGxpc3QgPSBudWxsOwotCi0JcHJpdmF0ZSBpbnQgc2l6ZSA9IDA7Ci0KLQlwdWJsaWMgSW50U3RhY2soKSB7Ci0JCXRoaXMoMTAwKTsKLQl9Ci0KLQlwdWJsaWMgSW50U3RhY2soaW50IG1heGRlcHRoKSB7Ci0JCXN1cGVyKCk7Ci0JCWxpc3QgPSBuZXcgaW50W21heGRlcHRoXTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZW1wdHkoKSB7Ci0JCXJldHVybiBzaXplID09IDA7Ci0JfQotCi0JcHVibGljIGludCBnZXQoaW50IHNsb3QpIHsKLQkJcmV0dXJuIGxpc3Rbc2xvdF07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKLQkJCWxpc3RbaV0gPSAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgd2l0aG91dCByZW1vdmluZyBpdAotCSAqIAotCSAqIEByZXR1cm4gaW50IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5LgotCSAqLwotCXB1YmxpYyBpbnQgcGVlaygpIHsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCXJldHVybiBsaXN0W3NpemUgLSAxXTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFuZCByZXR1cm5zIHRoZSBpbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogQGV4Y2VwdGlvbiBFbXB0eVN0YWNrRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgd2hlbiBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgaW50IHBvcCgpIHsKLQkJaW50IHZhbHVlID0gcGVlaygpOwotCQlsaXN0W3NpemUgLSAxXSA9IC0xOwotCQlzaXplLS07Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQdXNoZXMgYW4gaXRlbSBvbnRvIHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VmFsdWUgLQotCSAqICAgICAgICAgICAgdGhlIGludCB0byBiZSBwdXNoZWQgb250byB0aGlzIHN0YWNrLgotCSAqIEByZXR1cm4gdGhlIDxjb2RlPm5ld1ZhbHVlPC9jb2RlPiBhcmd1bWVudC4KLQkgKi8KLQlwdWJsaWMgaW50IHB1c2goaW50IG5ld1ZhbHVlKSB7Ci0JCWlmIChzaXplID09IGxpc3QubGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgU3RhY2tPdmVyZmxvd0Vycm9yKCk7Ci0JCX0KLQkJbGlzdFtzaXplKytdID0gbmV3VmFsdWU7Ci0JCXJldHVybiBuZXdWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBsaXN0Lmxlbmd0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0pTUEhlYWRUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSlNQSGVhZFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2Y1NDliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSlNQSGVhZFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLQotCi0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuamZsZXguZGUvIj5KRmxleDwvYT4gMS40LjEKLSAqIG9uIDQvMTcvMDcgMTI6MzUgQU0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+RDovZWNsaXBzZS53dHAvd29ya3NwYWNlL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9KU1BIZWFkVG9rZW5pemVyLmpGbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIEpTUEhlYWRUb2tlbml6ZXIgewotCi0gIC8qKiBUaGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBpbml0aWFsIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX0JVRkZFUlNJWkUgPSA4MTkyOwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZWUlOSVRJQUwgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVbkRlbGltaXRlZFN0cmluZyA9IDEyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEUV9TVFJJTkcgPSA4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUV9TVFJJTkcgPSAxMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfWE1MRGVjbCA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1BBR0VfRElSRUNUSVZFID0gNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUXVvdGVkQXR0cmlidXRlVmFsdWUgPSA2OwotCi0gIC8qKgotICAgKiBaWl9MRVhTVEFURVtsXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiBaWl9MRVhTVEFURVtsKzFdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqICAgICAgICAgICAgICAgICAgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICogbCBpcyBvZiB0aGUgZm9ybSBsID0gMiprLCBrIGEgbm9uIG5lZ2F0aXZlIGludGVnZXIKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9MRVhTVEFURVtdID0geyAKLSAgICAgMCwgIDEsICAyLCAgMiwgIDMsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNywgNwotICB9OwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQ01BUF9QQUNLRUQgPSAKLSAgICAiXDExXDBcMVw2XDFcMTFcMlwwXDFcMTBcMjJcMFwxXDM0XDFcMTdcMVwzN1wyXDAiKwotICAgICJcMVw1MVwxXDBcMVw0MFw2XDBcMVw0M1wxXDMzXDFcMFwxXDQ3XDFcMFwxXDQ0IisKLSAgICAiXDVcMFwxXDUwXDFcNDFcMVwwXDFcMTJcMVw3XDFcNTZcMVwxM1wxXDUyXDFcNTMiKwotICAgICJcMVwzMVwxXDIyXDFcMjBcMVwyNlwxXDBcMVw0NlwxXDI3XDFcMzJcMVw1NFwxXDAiKwotICAgICJcMVwxNlwxXDE1XDFcMzVcMVwyMVwxXDI1XDFcMFwxXDQ1XDFcMzZcMVwyM1wxXDMwIisKLSAgICAiXDFcNTVcMVw0MlwxXDE0XDFcMjRcN1wwXDFcNTNcMVwzMVwxXDIyXDFcMjBcMVwyNiIrCi0gICAgIlwxXDBcMVw0NlwxXDI3XDFcMzJcMVw1NFwxXDBcMVwxNlwxXDE1XDFcMzVcMVwyMSIrCi0gICAgIlwxXDI1XDFcMFwxXDQ1XDFcMzZcMVwyM1wxXDMwXDFcNTVcMVw0MlwxXDE0XDFcMjQiKwotICAgICJcMTAxXDBcMVw0XDNcMFwxXDVcMTdcMFwxXDNcMTZcMFwxXDFcMjBcMFwxXDMiKwotICAgICJcMTZcMFwxXDFcMVwyXDE3MFwwXDFcMlx1ZmU4N1wwIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBbXSBaWl9DTUFQID0genpVbnBhY2tDTWFwKFpaX0NNQVBfUEFDS0VEKTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgREZBIHN0YXRlcyB0byBhY3Rpb24gc3dpdGNoIGxhYmVscy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9BQ1RJT04gPSB6elVucGFja0FjdGlvbigpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9BQ1RJT05fUEFDS0VEXzAgPQotICAgICJcMTBcMFwyMFwxXDJcMlwxXDFcMVwzXDFcNFwxXDVcMVw2IisKLSAgICAiXDFcNVwxXDdcMlw1XDFcN1wxXDEwXDJcMTFcNFwwXDFcMTIiKwotICAgICJcMVwxM1w2XDBcMVwxNFw1XDBcMVwxNVwxXDE2XDFcMFwxXDE3IisKLSAgICAiXDFcMFwxXDIwXDRcMFwxXDIxXDQxXDBcMVwyMlw3XDBcMVwyMyIrCi0gICAgIlwxMlwwXDFcMjRcNlwwXDFcMjVcMVwyNlwyMlwwXDFcMjdcNVwwIisKLSAgICAiXDFcMzBcNTJcMFwxXDMxXDVcMFwxXDMyXDEyXDBcMVwzMiI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrQWN0aW9uKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzIxNF07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tBY3Rpb24oWlpfQUNUSU9OX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja0FjdGlvbihTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgICAgICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIHJlc3VsdFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9OT19NQVRDSCA9IDE7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9QVVNIQkFDS18yQklHID0gMjsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB6elJlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB6elN0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHp6QnVmZmVyW10gPSBuZXcgY2hhcltaWl9CVUZGRVJTSVpFXTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgenpNYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHp6UHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6ekN1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6elN0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHp6RW5kUmVhZDsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKiogCi0gICAqIHp6QXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4genpBdEJPTCA9IHRydWU7Ci0KLSAgLyoqIHp6QXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgYXQgdGhlIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4genpBdEVPRjsKLQotICAvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIHByaXZhdGUgYm9vbGVhbiB6ekVPRkRvbmU7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotCi0KLQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZwotICAgICAgICBwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1hIVE1MOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNXTUw7Ci0KLQotICAgICAgICBwdWJsaWMgSlNQSGVhZFRva2VuaXplcigpIHsKLSAgICAgICAgICAgICAgICBzdXBlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgICBwdWJsaWMgdm9pZCByZXNldCAoUmVhZGVyIGluKSB7Ci0gICAgICAgICAgICAgICAgLyogdGhlIGlucHV0IGRldmljZSAqLwotICAgICAgICAgICAgICAgIHp6UmVhZGVyID0gaW47Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gICAgICAgICAgICAgICAgenpTdGF0ZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gICAgICAgICAgICAgICAgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICAgICAgICAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheXMuZmlsbCh6ekJ1ZmZlciwgKGNoYXIpMCk7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgIHp6TWFya2VkUG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gICAgICAgICAgICAgICAgenpQdXNoYmFja1BvcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICB6ekN1cnJlbnRQb3MgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgenpTdGFydFJlYWQgPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICAgICAgICAgICAgICogZnJvbSBpbnB1dAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHp6RW5kUmVhZCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgICAgICAgICAgICAgICAvL3l5bGluZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgICAgICAgICAgICAgICB5eWNoYXIgPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgICAgICAgICAgICAgICAgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgLy95eWNvbHVtbiA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZwotICAgICAgICAgICAgICAgICAqIG9mIGEgbGluZQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHp6QXRCT0wgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICAgICAgICAgICAgICAgIHp6QXRFT0YgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIC8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICAgICAgICAgICAgICAgIHp6RU9GRG9uZSA9IGZhbHNlOwotCi0KLSAgICAgICAgICAgICAgICBmU3RhdGVTdGFjay5jbGVhcigpOwotCi0gICAgICAgICAgICAgICAgaGFzTW9yZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaXNYSFRNTD1mYWxzZTsKLSAgICAgICAgICAgICAgICBpc1dNTD1mYWxzZTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICBIZWFkUGFyc2VyVG9rZW4gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVGV4dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLSAgICAgICAgICAgICAgICBmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLSAgICAgICAgfQotIAotICAgICAgICBwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0gICAgICAgICAgICAgICAgeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzWEhUTUwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNYSFRNTDsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dNTCgpIHsKLSAgICAgICAgICAgIHJldHVybiBpc1dNTDsKLSAgICAgICAgfSAgICAgICAgCi0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBKU1BIZWFkVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0gICAgdGhpcy56elJlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgSlNQSGVhZFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHp6VW5wYWNrQ01hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxOTIpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlZmlsbHMgdGhlIGlucHV0IGJ1ZmZlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgaWZmIHRoZXJlIHdhcyBuZXcgaW5wdXQuCi0gICAqIAotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB6elJlZmlsbCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHp6U3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh6ekJ1ZmZlciwgenpTdGFydFJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgIHp6QnVmZmVyLCAwLAotICAgICAgICAgICAgICAgICAgICAgICB6ekVuZFJlYWQtenpTdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgenpFbmRSZWFkLT0genpTdGFydFJlYWQ7Ci0gICAgICB6ekN1cnJlbnRQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6TWFya2VkUG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6elB1c2hiYWNrUG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6elN0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh6ekN1cnJlbnRQb3MgPj0genpCdWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt6ekN1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHp6QnVmZmVyLmxlbmd0aCk7Ci0gICAgICB6ekJ1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHp6UmVhZGVyLnJlYWQoenpCdWZmZXIsIHp6RW5kUmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenpCdWZmZXIubGVuZ3RoLXp6RW5kUmVhZCk7Ci0KLSAgICBpZiAobnVtUmVhZCA8IDApIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHp6RW5kUmVhZCs9IG51bVJlYWQ7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB6ekF0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHp6RW5kUmVhZCA9IHp6U3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLQotICAgIGlmICh6elJlYWRlciAhPSBudWxsKQotICAgICAgenpSZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc2V0cyB0aGUgc2Nhbm5lciB0byByZWFkIGZyb20gYSBuZXcgaW5wdXQgc3RyZWFtLgotICAgKiBEb2VzIG5vdCBjbG9zZSB0aGUgb2xkIHJlYWRlci4KLSAgICoKLSAgICogQWxsIGludGVybmFsIHZhcmlhYmxlcyBhcmUgcmVzZXQsIHRoZSBvbGQgaW5wdXQgc3RyZWFtIAotICAgKiA8Yj5jYW5ub3Q8L2I+IGJlIHJldXNlZCAoaW50ZXJuYWwgYnVmZmVyIGlzIGRpc2NhcmRlZCBhbmQgbG9zdCkuCi0gICAqIExleGljYWwgc3RhdGUgaXMgc2V0IHRvIDx0dD5aWl9JTklUSUFMPC90dD4uCi0gICAqCi0gICAqIEBwYXJhbSByZWFkZXIgICB0aGUgbmV3IGlucHV0IHN0cmVhbSAKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHl5cmVzZXQoamF2YS5pby5SZWFkZXIgcmVhZGVyKSB7Ci0gICAgenpSZWFkZXIgPSByZWFkZXI7Ci0gICAgenpBdEJPTCAgPSB0cnVlOwotICAgIHp6QXRFT0YgID0gZmFsc2U7Ci0gICAgenpFbmRSZWFkID0genpTdGFydFJlYWQgPSAwOwotICAgIHp6Q3VycmVudFBvcyA9IHp6TWFya2VkUG9zID0genpQdXNoYmFja1BvcyA9IDA7Ci0gICAgeXljaGFyID0gMDsKLSAgICB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4genpMZXhpY2FsU3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHp6TGV4aWNhbFN0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgcHVibGljIGZpbmFsIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHp6QnVmZmVyLCB6elN0YXJ0UmVhZCwgenpNYXJrZWRQb3MtenpTdGFydFJlYWQgKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiA8dHQ+cG9zPC90dD4gZnJvbSB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dC4gCi0gICAqIAotICAgKiBJdCBpcyBlcXVpdmFsZW50IHRvIHl5dGV4dCgpLmNoYXJBdChwb3MpLCBidXQgZmFzdGVyCi0gICAqCi0gICAqIEBwYXJhbSBwb3MgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgdG8gZmV0Y2guIAotICAgKiAgICAgICAgICAgIEEgdmFsdWUgZnJvbSAwIHRvIHl5bGVuZ3RoKCktMS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIHBvcwotICAgKi8KLSAgcHVibGljIGZpbmFsIGNoYXIgeXljaGFyYXQoaW50IHBvcykgewotICAgIHJldHVybiB6ekJ1ZmZlclt6elN0YXJ0UmVhZCtwb3NdOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4genpNYXJrZWRQb3MtenpTdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogSW4gYSB3ZWxsZm9ybWVkIHNjYW5uZXIgKG5vIG9yIG9ubHkgY29ycmVjdCB1c2FnZSBvZiAKLSAgICogeXlwdXNoYmFjayhpbnQpIGFuZCBhIG1hdGNoLWFsbCBmYWxsYmFjayBydWxlKSB0aGlzIG1ldGhvZCAKLSAgICogd2lsbCBvbmx5IGJlIGNhbGxlZCB3aXRoIHRoaW5ncyB0aGF0ICJDYW4ndCBQb3NzaWJseSBIYXBwZW4iLgotICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHNvbWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcKLSAgICogKGUuZy4gYSBKRmxleCBidWcgcHJvZHVjaW5nIGEgZmF1bHR5IHNjYW5uZXIgZXRjLikuCi0gICAqCi0gICAqIFVzdWFsIHN5bnRheC9zY2FubmVyIGxldmVsIGVycm9yIGhhbmRsaW5nIHNob3VsZCBiZSBkb25lCi0gICAqIGluIGVycm9yIGZhbGxiYWNrIHJ1bGVzLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHp6U2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICB0cnkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1tlcnJvckNvZGVdOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbWlpfVU5LTk9XTl9FUlJPUl07Ci0gICAgfQotCi0gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHB1YmxpYyB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgenpTY2FuRXJyb3IoWlpfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB6ek1hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwKLSAgICogd2hlbiB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHp6RG9FT0YoKSB7Ci0gICAgaWYgKCF6ekVPRkRvbmUpIHsKLSAgICAgIHp6RU9GRG9uZSA9IHRydWU7Ci0gICAgICAgICAgICBoYXNNb3JlPWZhbHNlOwotCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHp6SW5wdXQ7Ci0gICAgaW50IHp6QWN0aW9uOwotCi0gICAgLy8gY2FjaGVkIGZpZWxkczoKLSAgICBpbnQgenpDdXJyZW50UG9zTDsKLSAgICBpbnQgenpNYXJrZWRQb3NMOwotICAgIGludCB6ekVuZFJlYWRMID0genpFbmRSZWFkOwotICAgIGNoYXIgW10genpCdWZmZXJMID0genpCdWZmZXI7Ci0gICAgY2hhciBbXSB6ekNNYXBMID0gWlpfQ01BUDsKLQotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHp6TWFya2VkUG9zTCA9IHp6TWFya2VkUG9zOwotCi0gICAgICB5eWNoYXIrPSB6ek1hcmtlZFBvc0wtenpTdGFydFJlYWQ7Ci0KLSAgICAgIGlmICh6ek1hcmtlZFBvc0wgPiB6elN0YXJ0UmVhZCkgewotICAgICAgICBzd2l0Y2ggKHp6QnVmZmVyTFt6ek1hcmtlZFBvc0wtMV0pIHsKLSAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICBjYXNlICdcdTAwMEInOgotICAgICAgICBjYXNlICdcdTAwMEMnOgotICAgICAgICBjYXNlICdcdTAwODUnOgotICAgICAgICBjYXNlICdcdTIwMjgnOgotICAgICAgICBjYXNlICdcdTIwMjknOgotICAgICAgICAgIHp6QXRCT0wgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdccic6IAotICAgICAgICAgIGlmICh6ek1hcmtlZFBvc0wgPCB6ekVuZFJlYWRMKQotICAgICAgICAgICAgenpBdEJPTCA9IHp6QnVmZmVyTFt6ek1hcmtlZFBvc0xdICE9ICdcbic7Ci0gICAgICAgICAgZWxzZSBpZiAoenpBdEVPRikKLSAgICAgICAgICAgIHp6QXRCT0wgPSBmYWxzZTsKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGJvb2xlYW4gZW9mID0genpSZWZpbGwoKTsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zTCA9IHp6TWFya2VkUG9zOwotICAgICAgICAgICAgenpFbmRSZWFkTCA9IHp6RW5kUmVhZDsKLSAgICAgICAgICAgIHp6QnVmZmVyTCA9IHp6QnVmZmVyOwotICAgICAgICAgICAgaWYgKGVvZikgCi0gICAgICAgICAgICAgIHp6QXRCT0wgPSBmYWxzZTsKLSAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgIHp6QXRCT0wgPSB6ekJ1ZmZlckxbenpNYXJrZWRQb3NMXSAhPSAnXG4nOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB6ekF0Qk9MID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHp6QWN0aW9uID0gLTE7Ci0KLSAgICAgIHp6Q3VycmVudFBvc0wgPSB6ekN1cnJlbnRQb3MgPSB6elN0YXJ0UmVhZCA9IHp6TWFya2VkUG9zTDsKLSAgCi0gICAgICBpZiAoenpBdEJPTCkKLSAgICAgICAgenpTdGF0ZSA9IFpaX0xFWFNUQVRFW3p6TGV4aWNhbFN0YXRlKzFdOwotICAgICAgZWxzZQotICAgICAgICB6elN0YXRlID0gWlpfTEVYU1RBVEVbenpMZXhpY2FsU3RhdGVdOwotCi0KLSAgICAgIHp6Rm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0gICAgICAgICAgaWYgKHp6Q3VycmVudFBvc0wgPCB6ekVuZFJlYWRMKQotICAgICAgICAgICAgenpJbnB1dCA9IHp6QnVmZmVyTFt6ekN1cnJlbnRQb3NMKytdOwotICAgICAgICAgIGVsc2UgaWYgKHp6QXRFT0YpIHsKLSAgICAgICAgICAgIHp6SW5wdXQgPSBZWUVPRjsKLSAgICAgICAgICAgIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9ucwotICAgICAgICAgICAgenpDdXJyZW50UG9zICA9IHp6Q3VycmVudFBvc0w7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvcyAgID0genpNYXJrZWRQb3NMOwotICAgICAgICAgICAgYm9vbGVhbiBlb2YgPSB6elJlZmlsbCgpOwotICAgICAgICAgICAgLy8gZ2V0IHRyYW5zbGF0ZWQgcG9zaXRpb25zIGFuZCBwb3NzaWJseSBuZXcgYnVmZmVyCi0gICAgICAgICAgICB6ekN1cnJlbnRQb3NMICA9IHp6Q3VycmVudFBvczsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zTCAgID0genpNYXJrZWRQb3M7Ci0gICAgICAgICAgICB6ekJ1ZmZlckwgICAgICA9IHp6QnVmZmVyOwotICAgICAgICAgICAgenpFbmRSZWFkTCAgICAgPSB6ekVuZFJlYWQ7Ci0gICAgICAgICAgICBpZiAoZW9mKSB7Ci0gICAgICAgICAgICAgIHp6SW5wdXQgPSBZWUVPRjsKLSAgICAgICAgICAgICAgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgenpJbnB1dCA9IHp6QnVmZmVyTFt6ekN1cnJlbnRQb3NMKytdOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICB6eklucHV0ID0genpDTWFwTFt6eklucHV0XTsKLQotICAgICAgICAgIGJvb2xlYW4genpJc0ZpbmFsID0gZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiB6ek5vTG9va0FoZWFkID0gZmFsc2U7Ci0KLSAgICAgICAgICB6ekZvck5leHQ6IHsgc3dpdGNoICh6elN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDExOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDU6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDIwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDIxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDIyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDIzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDI3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDMwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAzMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDMwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDM0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDM1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgICAgICAgY2FzZSA0MTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDM0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAzNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzE6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMzc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDI5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6elN0YXRlID0gMzk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6elN0YXRlID0gNDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQxOiB6elN0YXRlID0gNDE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQ0OiB6elN0YXRlID0gNDI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNDM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNDQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6IHp6U3RhdGUgPSA0NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSA0NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6U3RhdGUgPSA0NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHp6U3RhdGUgPSAzOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSA0MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDE6IHp6U3RhdGUgPSA0MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDQ6IHp6U3RhdGUgPSA0MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6U3RhdGUgPSA0ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSA0OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6U3RhdGUgPSA1MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDY6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB6elN0YXRlID0gNTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gNTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQzOiB6elN0YXRlID0gNTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB6elN0YXRlID0gNTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQzOiB6elN0YXRlID0gNTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ2OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDU3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0NjogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA1ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6eklzRmluYWwgPSB0cnVlOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDI0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDU5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDY6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNjA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6elN0YXRlID0gNjE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ2OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDYyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogenpTdGF0ZSA9IDYxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogenpTdGF0ZSA9IDYxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogenpTdGF0ZSA9IDYzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDY0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDI6IHp6U3RhdGUgPSA2NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHp6U3RhdGUgPSA2NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA2NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6elN0YXRlID0gNDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6elN0YXRlID0gNDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB6elN0YXRlID0gNjg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0NjogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA1MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHp6U3RhdGUgPSA2OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzc6IHp6U3RhdGUgPSA3MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHp6U3RhdGUgPSA3MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHp6U3RhdGUgPSA3MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHp6U3RhdGUgPSA3MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDI0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAzMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSA3NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHp6U3RhdGUgPSA3NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB6elN0YXRlID0gNzY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB6elN0YXRlID0gNzc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB6elN0YXRlID0gNzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB6elN0YXRlID0gNzk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB6elN0YXRlID0gODA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDcwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB6elN0YXRlID0gODE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDcxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM4OiB6elN0YXRlID0gODI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDcyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB6elN0YXRlID0gODM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDczOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gODQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gODU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6elN0YXRlID0gODY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQzOiB6elN0YXRlID0gODc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQzOiB6elN0YXRlID0gODg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB6elN0YXRlID0gODk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6elN0YXRlID0gOTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB6elN0YXRlID0gOTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB6elN0YXRlID0gOTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB6elN0YXRlID0gOTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gOTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gOTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB6elN0YXRlID0gOTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogenpTdGF0ZSA9IDk3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogenpTdGF0ZSA9IDk4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogenpTdGF0ZSA9IDk5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogenpTdGF0ZSA9IDEwMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMDE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB6elN0YXRlID0gMTAyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogenpTdGF0ZSA9IDEwMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDM6IHp6U3RhdGUgPSAxMDQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB6elN0YXRlID0gMTA1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDEwNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSAxMDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB6elN0YXRlID0gMTA4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEwOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSA5ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB6elN0YXRlID0gMTEwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6SXNGaW5hbCA9IHRydWU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDExMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB6elN0YXRlID0gMTEyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHp6U3RhdGUgPSAxMTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDExNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gMTE1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHp6U3RhdGUgPSAxMTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpTdGF0ZSA9IDExNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6eklzRmluYWwgPSB0cnVlOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzc6IHp6U3RhdGUgPSAxMTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogenpTdGF0ZSA9IDExOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTEyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTIwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSAxMjE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDEyMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB6elN0YXRlID0gMTIzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSAxMjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDEyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gMTI2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMjc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogenpJc0ZpbmFsID0gdHJ1ZTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTIxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTI4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSAxMjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogenpTdGF0ZSA9IDEzMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogenpTdGF0ZSA9IDEzMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHp6U3RhdGUgPSAxMzI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogenpTdGF0ZSA9IDEzMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gMTM0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6SXNGaW5hbCA9IHRydWU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogenpJc0ZpbmFsID0gdHJ1ZTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB6elN0YXRlID0gMTM1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6U3RhdGUgPSAxMzY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDEzNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTMyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB6elN0YXRlID0gMTM4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHp6U3RhdGUgPSAxMzk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDE0MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTM1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gMTQxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHp6U3RhdGUgPSAxNDI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogenpTdGF0ZSA9IDE0MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTM4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6elN0YXRlID0gMTQ0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB6elN0YXRlID0gMTQ1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6U3RhdGUgPSAxNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE0NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM4OiB6elN0YXRlID0gMTQ4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHp6U3RhdGUgPSAxNDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHp6U3RhdGUgPSAxNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogenpTdGF0ZSA9IDE1MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ1OiB6elN0YXRlID0gMTUyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6SXNGaW5hbCA9IHRydWU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE1MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogenpTdGF0ZSA9IDE1NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTUwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB6elN0YXRlID0gMTU1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSAxNTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpTdGF0ZSA9IDE1NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTUzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6eklzRmluYWwgPSB0cnVlOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHp6U3RhdGUgPSAxNTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogenpTdGF0ZSA9IDE1OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB6elN0YXRlID0gMTYwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzU6IHp6U3RhdGUgPSAxNjE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogenpTdGF0ZSA9IDE2MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6elN0YXRlID0gMTYzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHp6U3RhdGUgPSAxNjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDc2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogenpTdGF0ZSA9IDc3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHp6U3RhdGUgPSAxNjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogenpTdGF0ZSA9IDE2NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMzOiB6elN0YXRlID0gMTY3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6U3RhdGUgPSAxNjg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogenpTdGF0ZSA9IDE2OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMTcwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHp6U3RhdGUgPSAxNzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDE3MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTcwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMTczOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAxNzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDE3NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDE2OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTczOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB6elN0YXRlID0gMTc2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAxNzc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAxNzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHp6U3RhdGUgPSAxNzg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAxNjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogenpTdGF0ZSA9IDE3OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTc3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogenpTdGF0ZSA9IDE4MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDE3MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTc4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMTcyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDE4MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDE2OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTc5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB6elN0YXRlID0gMTgyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAxNzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB6elN0YXRlID0gMTgzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMTcxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAxNzI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB6elN0YXRlID0gMTg0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMTY5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzU6IHp6U3RhdGUgPSAxODU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDE3NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHp6U3RhdGUgPSAxODY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAxNzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDE3MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAxODc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAxNjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogenpTdGF0ZSA9IDE4ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMTc0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDE4OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDE3MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMTcyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogenpTdGF0ZSA9IDE5MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDE2OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM2OiB6elN0YXRlID0gMTkxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAxNzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB6elN0YXRlID0gMTkyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMTcxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAxNzI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB6elN0YXRlID0gMTkzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMTY5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzU6IHp6U3RhdGUgPSAxOTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDE3NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSAxOTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAxNzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDE3MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxOTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAxNjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNzogenpTdGF0ZSA9IDE5NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTk1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMTc0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDE5ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDE3MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTk2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMTcyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMTY5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzc6IHp6U3RhdGUgPSAxOTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDE3NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHp6U3RhdGUgPSAyMDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAxNzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogenpTdGF0ZSA9IDIwMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMTc0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDIwMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDE3MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMjAzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAxNzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAxNzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOTogenpTdGF0ZSA9IDIwNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQwOiB6elN0YXRlID0gMjA1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDA6IHp6U3RhdGUgPSAyMDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MDogenpTdGF0ZSA9IDIwNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMjA4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6U3RhdGUgPSAyMDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwOToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogenpTdGF0ZSA9IDIxMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjEwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB6elN0YXRlID0gMjExOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHp6U3RhdGUgPSAyMTI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIxMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyMTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGV2ZXIgcmVhY2hlZCwgdGhlcmUgaXMgYSBzZXJpb3VzIGJ1ZyBpbiBKRmxleAotICAgICAgICAgICAgICB6elNjYW5FcnJvcihaWl9VTktOT1dOX0VSUk9SKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSB9Ci0KLSAgICAgICAgICBpZiAoIHp6SXNGaW5hbCApIHsKLSAgICAgICAgICAgIHp6QWN0aW9uID0genpTdGF0ZTsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zTCA9IHp6Q3VycmVudFBvc0w7Ci0gICAgICAgICAgICBpZiAoIHp6Tm9Mb29rQWhlYWQgKSBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbgotICAgICAgenpNYXJrZWRQb3MgPSB6ek1hcmtlZFBvc0w7Ci0KLSAgICAgIHN3aXRjaCAoenpBY3Rpb24gPCAwID8genpBY3Rpb24gOiBaWl9BQ1RJT05benpBY3Rpb25dKSB7Ci0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7fQotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAyNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDI4OiBicmVhazsKLSAgICAgICAgY2FzZSA0OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjk6IGJyZWFrOwotICAgICAgICBjYXNlIDU6IAotICAgICAgICAgIHsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzA6IGJyZWFrOwotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VMYW5ndWFnZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzE6IGJyZWFrOwotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgICB7IGlzWEhUTUwgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZUVuY29kaW5nOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID4gTUFYX1RPX1NDQU4pIHtoYXNNb3JlPWZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuTUFYX0NIQVJTX1JFQUNIRUQ7fQotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7fQotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzY6IGJyZWFrOwotICAgICAgICBjYXNlIDg6IAotICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDM3OiBicmVhazsKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgeyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyAgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZURpcmVjdGl2ZUVuZDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNDA6IGJyZWFrOwotICAgICAgICBjYXNlIDIzOiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VDb250ZW50VHlwZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNDE6IGJyZWFrOwotICAgICAgICBjYXNlIDE4OiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHt5eWJlZ2luKFNUX1hNTERlY2wpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7fQotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICAgIHsgeXlwdXNoYmFjaygyKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogCi0gICAgICAgICAgeyB5eXB1c2hiYWNrKDEpOyB5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsgc3RyaW5nLnNldExlbmd0aCgwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNDU6IGJyZWFrOwotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZURpcmVjdGl2ZUVuZDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNDY6IGJyZWFrOwotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgICB7IGlzV01MID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNDc6IGJyZWFrOwotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfUEFHRV9ESVJFQ1RJVkUpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlRGlyZWN0aXZlU3RhcnQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDQ4OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNDk6IGJyZWFrOwotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xWZXJzaW9uOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA1MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6IAotICAgICAgICAgIHsgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDUxOiBicmVhazsKLSAgICAgICAgY2FzZSAzOiAKLSAgICAgICAgICB7IHl5YmVnaW4oRFFfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNTI6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoenpJbnB1dCA9PSBZWUVPRiAmJiB6elN0YXJ0UmVhZCA9PSB6ekN1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHp6QXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgenpEb0VPRigpOwotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHp6U2NhbkVycm9yKFpaX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9KU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0pTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I3MTY1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0pTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsKLQotcHVibGljIGludGVyZmFjZSBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzIGV4dGVuZHMgWE1MSGVhZFRva2VuaXplckNvbnN0YW50cyB7Ci0JU3RyaW5nIFBhZ2VEaXJlY3RpdmVTdGFydCA9ICJQYWdlRGlyZWN0aXZlU3RhcnQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBhZ2VEaXJlY3RpdmVFbmQgPSAiUGFnZURpcmVjdGl2ZUVuZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUGFnZUxhbmd1YWdlID0gIlBhZ2VMYW5ndWFnZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUGFnZUVuY29kaW5nID0gIlBhZ2VFbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUGFnZUNvbnRlbnRUeXBlID0gIlBhZ2VDb250ZW50VHlwZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0pTUFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzIzNDc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5JbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLk5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIHsKLQotCXByaXZhdGUgU3RyaW5nIGZDaGFyc2V0OwotCi0JcHJpdmF0ZSBTdHJpbmcgZkNvbnRlbnRUeXBlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZkNvbnRlbnRUeXBlVmFsdWU7Ci0KLQlwcml2YXRlIFN0cmluZyBmTGFuZ3VhZ2U7Ci0KLQlwcml2YXRlIFN0cmluZyBmUGFnZUVuY29kaW5nVmFsdWU7Ci0KLQlwcml2YXRlIEpTUEhlYWRUb2tlbml6ZXIgZlRva2VuaXplcjsKLQotCXByaXZhdGUgU3RyaW5nIGZYTUxEZWNFbmNvZGluZ05hbWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdW5pY29kZUNhc2U7Ci0KLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBmRW5jb2RpbmdNZW1lbnRvOwotCi0JcHJpdmF0ZSBib29sZWFuIGZIZWFkZXJQYXJzZWQ7Ci0KLQlwcml2YXRlIFJlYWRlciBmUmVhZGVyOwotCi0JcHJpdmF0ZSBib29sZWFuIGZYSFRNTDsKLQotCXByaXZhdGUgYm9vbGVhbiBmV01MOwotCi0KLQkvKioKLQkgKiBObyBBcmcgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEpTUFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQljbGFzcyBOdWxsTWVtZW50byBleHRlbmRzIEVuY29kaW5nTWVtZW50byB7Ci0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBOdWxsTWVtZW50bygpIHsKLQkJCXN1cGVyKCk7Ci0JCQlTdHJpbmcgZGVmYXVsdENoYXJzZXQgPSBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLnVzZURlZmF1bHROYW1lUnVsZXMobnVsbCk7Ci0JCQlzZXRKYXZhQ2hhcnNldE5hbWUoZGVmYXVsdENoYXJzZXQpOwotCQkJc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGRlZmF1bHRDaGFyc2V0KTsKLQkJCXNldERldGVjdGVkQ2hhcnNldE5hbWUobnVsbCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29udGVudFR5cGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWVuc3VyZUlucHV0U2V0KCk7Ci0JCWlmICghZkhlYWRlclBhcnNlZCkgewotCQkJcGFyc2VJbnB1dCgpOwotCQkJLy8gd2Uga2VlcCB0cmFjayBvZiBpZiBoZWFkZXIncyBhbHJlYWR5IGJlZW4gcGFyc2UsIHNvIGNhbiBtYWtlCi0JCQkvLyBtdWx0aXBsZSAnZ2V0JyBjYWxscywgd2l0aG91dCBjYXVzaW5nIHJlcGFyc2luZy4KLQkJCWZIZWFkZXJQYXJzZWQgPSB0cnVlOwotCQkJLy8gTm90ZTogdGhlcmUgaXMgYSAiaGlkZGVuIGFzc3VtcHRpb24iIGhlcmUgdGhhdCBhbiBlbXB0eQotCQkJLy8gc3RyaW5nIGluIGNvbnRlbnQgc2hvdWxkIGJlIHRyZWF0ZWQgc2FtZSBhcyBub3QgcHJlc2VudC4KLQkJfQotCQlyZXR1cm4gZkNvbnRlbnRUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RW5jb2RpbmdNZW1lbnRvKCkuZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCX0KLQotCS8vIHRvIGVuc3VyZSBjb25zaXN0IG92ZXJhbGwgcnVsZXMgdXNlZCwgd2UnbGwgbWFyayBhcwotCS8vIGZpbmFsLAotCS8vIGFuZCByZXF1aXJlIHN1YmNsYXNzZXMgdG8gcHJvdmlkZSBjZXJ0YWluIHBpZWNlcyBvZgotCS8vIHRoZQotCS8vIGltcGxlbWVudGF0aW9uCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllbnN1cmVJbnB1dFNldCgpOwotCQlpZiAoIWZIZWFkZXJQYXJzZWQpIHsKLQkJCXBhcnNlSW5wdXQoKTsKLQkJCS8vIHdlIGtlZXAgdHJhY2sgb2YgaWYgaGVhZGVyJ3MgYWxyZWFkeSBiZWVuCi0JCQkvLyBwYXJzZSwgc28gY2FuIG1ha2UKLQkJCS8vIG11bHRpcGxlICdnZXQnIGNhbGxzLCB3aXRob3V0IGNhdXNpbmcKLQkJCS8vIHJlcGFyc2luZy4KLQkJCWZIZWFkZXJQYXJzZWQgPSB0cnVlOwotCQkJLy8gTm90ZTogdGhlcmUgaXMgYSAiaGlkZGVuIGFzc3VtcHRpb24iIGhlcmUKLQkJCS8vIHRoYXQgYW4gZW1wdHkKLQkJCS8vIHN0cmluZyBpbiBjb250ZW50IHNob3VsZCBiZSB0cmVhdGVkIHNhbWUgYXMKLQkJCS8vIG5vdCBwcmVzZW50LgotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCWhhbmRsZVNwZWNEZWZhdWx0KCk7Ci0JCX0KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJLy8gc2FmdHkgbmV0Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IE51bGxNZW1lbnRvKCk7Ci0JCX0KLQkJcmV0dXJuIGZFbmNvZGluZ01lbWVudG87Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWVuc3VyZUlucHV0U2V0KCk7Ci0JCWlmICghZkhlYWRlclBhcnNlZCkgewotCQkJcGFyc2VJbnB1dCgpOwotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZMYW5ndWFnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIGJ5IEpTUCBTcGVjCi0JCWZpbmFsIFN0cmluZyBlbmMgPSAiSVNPLTg4NTktMSI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGVuYzsKLQl9Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldFNwZWNEZWZhdWx0RW5jb2RpbmdNZW1lbnRvKCkgewotCQlyZXNldEFsbCgpOwotCQlFbmNvZGluZ01lbWVudG8gcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIGVuYyA9IGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJaWYgKGVuYyAhPSBudWxsKSB7Ci0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVGQVVMVFNfQVNTVU1FRF9GT1JfRU1QVFlfSU5QVVQpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZW5jKTsKLQkJCXJlc3VsdCA9IGZFbmNvZGluZ01lbWVudG87Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJcmVzZXRBbGwoKTsKLQkJZlJlYWRlciA9IG5ldyBCeXRlUmVhZGVyKGlucHV0U3RyZWFtKTsKLQkJdHJ5IHsKLQkJCWZSZWFkZXIubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlLCBzaW5jZSB3ZSBrbm93IEJ5dGVSZWFkZXIKLQkJCS8vIHN1cHBvcnRzIG1hcmtpbmcKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJU3RvcmFnZSBpU3RvcmFnZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXNldEFsbCgpOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGlTdG9yYWdlLmdldENvbnRlbnRzKCk7Ci0JCUlucHV0U3RyZWFtIHJlc2V0dGFibGVTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCQlyZXNldHRhYmxlU3RyZWFtLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJc2V0KHJlc2V0dGFibGVTdHJlYW0pOwotCQkvLyBUT0RPIHdlJ2xsIG5lZWQgdG8gInJlbWVtYmVyIiBJRmlsZSwgb3IKLQkJLy8gZ2V0IGl0cyAob3IgaXRzIHByb2plY3Qncykgc2V0dGluZ3MsIGluIGNhc2UKLQkJLy8gdGhvc2UgYXJlIG5lZWRlZCB0byBoYW5kbGUgY2FzZXMgd2hlbiB0aGUKLQkJLy8gZW5jb2RpbmcgaXMgbm90IGluIHRoZSBmaWxlIHN0cmVhbS4KLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiB0aGlzIGlzIG5vdCBwYXJ0IG9mIGludGVyZmFjZSB0byBoZWxwIGF2b2lkIGNvbmZ1c2lvbiAuLi4gaXQKLQkgKiBleHBlY3RlZCB0aGlzIFJlYWRlciBpcyBhIHdlbGwgZm9ybWVkIGNoYXJhY3RlciByZWFkZXIgLi4uIHRoYXQgaXMsIGl0cwotCSAqIGFsbCByZWFkeSBiZWVuIGRldGVybWluZWQgdG8gbm90IGJlIGEgdW5pY29kZSBtYXJrZWQgaW5wdXQgc3RyZWFtLiBBbmQsCi0JICogaXRzIGFzc3VtZWQgdG8gYmUgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24sIGF0IHBvc2l0aW9uIHplcm8sIHJlYWR5IHRvCi0JICogcmVhZCBmaXJzdCBjaGFyYWN0ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFJlYWRlciByZWFkZXIpIHsKLQkJcmVzZXRBbGwoKTsKLQkJZlJlYWRlciA9IHJlYWRlcjsKLQkJaWYgKCFmUmVhZGVyLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJZlJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmUmVhZGVyKTsKLQkJfQotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2JsZSwgc2luY2Ugd2UganVzdCBjaGVja2VkIGlmIG1hcmthYmxlCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtKFN0cmluZyB0b2tlblR5cGUpIHsKLQkJYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGUgPSBmYWxzZTsKLQkJaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT00pIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRVVEY4M0J5dGVCT01Vc2VkKHRydWUpOwotCQl9Ci0JCWVsc2UgaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGUgPSB0cnVlOwotCQkJU3RyaW5nIGVuYyA9ICJVVEYtMTZCRSI7IC8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTKTsKLQkJfQotCQllbHNlIGlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmMgPSAiVVRGLTE2IjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQl9Ci0JCXJldHVybiBjYW5IYW5kbGVBc1VuaWNvZGU7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogb25jZSB0aGlzIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHRyYWNlIGluZm8gc3RpbGwgbmVlZHMgdG8gYmUKLQkgKiBhcHBlbmRlZCBieSBjYWxsZXIsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCBpdHMgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldERldGVjdGVkQ2hhcnNldE5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIFRPRE86IGlmIGRldGVjdGVkQ2hhcnNldCBhbmQgc3BlYyBkZWZhdWx0IGlzCi0JCS8vIG51bGwsIG5lZWQgdG8gdXNlICJ3b3JrCi0JCS8vIGJlbmNoIGJhc2VkIiBkZWZhdWx0cy4KLQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGVyZSBjYW4gc29tZXRpbWVzIGJlIG11bGl0cGxlICdlbmNvZGluZ3MnIHNwZWNpZmllZCBpbiBhIGZpbGUuIFRoaXMKLQkgKiBpcyBhbiBhdHRlbXB0IHRvIGNlbnRyYWxpemUgdGhlIHJ1bGVzIGZvciBkZWNpZGluZyBiZXR3ZWVuIHRoZW0uCi0JICogUmV0dXJucyBlbmNvZGluZyBhY2NvcmRpbmcgdG8gcHJpb3JpdHk6IDEuIFhNTCBEZWNsYXJhdGlvbiAyLiBwYWdlCi0JICogZGlyZWN0aXZlIHBhZ2VFbmNvZGluZyBuYW1lIDMuIHBhZ2UgZGlyZWN0aXZlIGNvbnRlbnRUeXBlIGNoYXJzZXQgbmFtZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEFwcHJvcHJpYXRlRW5jb2RpbmcoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAoZlhNTERlY0VuY29kaW5nTmFtZSAhPSBudWxsKQotCQkJcmVzdWx0ID0gZlhNTERlY0VuY29kaW5nTmFtZTsKLQkJZWxzZSBpZiAoZlBhZ2VFbmNvZGluZ1ZhbHVlICE9IG51bGwpCi0JCQlyZXN1bHQgPSBmUGFnZUVuY29kaW5nVmFsdWU7Ci0JCWVsc2UgaWYgKGZDaGFyc2V0ICE9IG51bGwpCi0JCQlyZXN1bHQgPSBmQ2hhcnNldDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gcmV0dXJuIG51bGwsIGlmIGludmFsaWQgY2hhcnNldCBuYW1lIChpbiB3aGljaCBjYXNlCi0JICogImFwcHJvcHJpYXRlRGVmYXVsdCIgc2hvdWxkIGJlIHVzZWQsIGlmIGEgbmFtZSBpcyByZWFsbHkgbmVlZCBmb3Igc29tZQotCSAqICJzYXZlIGFueXdheSIgY2FzZXMpLgotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIDEuIENoZWNrIGV4cGxpY2l0IG1hcHBpbmcgb3ZlcnJpZGVzIGZyb20KLQkJLy8gcHJvcGVydHkgZmlsZSAtLSBpdHMgaGVyZSB3ZSBwaWNrIHVwICJydWxlcyIgZm9yIGNhc2VzCi0JCS8vIHRoYXQgYXJlIG5vdCBldmVuIGluIEphdmEKLQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIDIuIFVzZSB0aGUgImNhbm9uaWNhbCIgbmFtZSBmcm9tIEpSRSBtYXBwaW5ncwotCQkvLyBOb3RlOiBzZWUgQ2hhcnNldCBKYXZhRG9jLCB0aGUgbmFtZSB5b3UgZ2V0IG9uZQotCQkvLyB3aXRoIGNhbiBiZSBhbGlhcywKLQkJLy8gdGhlIG5hbWUgeW91IGdldCBiYWNrIGlzICJzdGFuZGFyZCIgbmFtZS4KLQkJQ2hhcnNldCBqYXZhQ2hhcnNldCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlqYXZhQ2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9ubHkgc2V0IGludmFsaWQsIGlmIHJlc3VsdCBpcyBzYW1lIGFzIGRldGVjdGVkIC0tIHRoZXkgd29uJ3QKLQkJCS8vIGJlIGVxdWFsIGlmCi0JCQkvLyBvdmVycmlkZGVuCi0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmVxdWFscyhkZXRlY3RlZENoYXJzZXROYW1lKSkgewotCQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SW52YWxpZEVuY29kaW5nKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gZSkgewotCQkJLy8gb25seSBzZXQgaW52YWxpZCwgaWYgcmVzdWx0IGlzIHNhbWUgYXMgZGV0ZWN0ZWQgLS0gdGhleSB3b24ndAotCQkJLy8gYmUgZXF1YWwgaWYKLQkJCS8vIG92ZXJyaWRkZW4KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldE5hbWUpKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50by5zZXRJbnZhbGlkRW5jb2RpbmcoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gZ2l2ZSBwcmlvcml0eSB0byBqYXZhIGNvbm9uaWNhbCBuYW1lLCBpZiBwcmVzZW50Ci0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBqYXZhQ2hhcnNldC5uYW1lKCk7Ci0JCQkvLyBidXQgc3RpbGwgYWxsb3cgb3ZlcnJpZGVzCi0JCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhyZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBKU1BIZWFkVG9rZW5pemVyIGdldFRva2luaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBKU1BIZWFkVG9rZW5pemVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZUb2tlbml6ZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNwZWNEZWZhdWx0KCkgewotCQlTdHJpbmcgZW5jb2RpbmdOYW1lOwotCQllbmNvZGluZ05hbWUgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmNvZGluZ05hbWUgIT0gbnVsbCkgewotCQkJLy8gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuY29kaW5nTmFtZSwKLQkJCS8vIEVuY29kaW5nTWVtZW50by5VU0VEX0NPTlRFTlRfVFlQRV9ERUZBVUxUKTsKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShlbmNvZGluZ05hbWUpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZW5jb2RpbmdOYW1lKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0xlZ2FsU3RyaW5nKFN0cmluZyB2YWx1ZVRva2VuVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAodmFsdWVUb2tlblR5cGUgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGV4YWN0bHkgdGhlIHNhbWUgYXMgd2hhdCBpcyBpbiAKLQkgKiBKU1BIZWFkVG9rZW5pemVyVGVzdGVyCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlQ29udGVudFR5cGVWYWx1ZShTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCI7XFxzKmNoYXJzZXRcXHMqPVxccyoiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdbXSBwYXJ0cyA9IHBhdHRlcm4uc3BsaXQoY29udGVudFR5cGUpOwotCQlpZiAocGFydHMubGVuZ3RoID4gMCkgewotCQkJLy8gaWYgb25seSBvbmUgaXRlbSwgaXQgY2FuIHN0aWxsIGJlIGNoYXJzZXQgaW5zdGVhZCBvZgotCQkJLy8gY29udGVudFR5cGUKLQkJCWlmIChwYXJ0cy5sZW5ndGggPT0gMSkgewotCQkJCWlmIChwYXJ0c1swXS5sZW5ndGgoKSA+IDYpIHsKLQkJCQkJU3RyaW5nIGNoZWNrRm9yQ2hhcnNldCA9IHBhcnRzWzBdLnN1YnN0cmluZygwLCA3KTsKLQkJCQkJaWYgKGNoZWNrRm9yQ2hhcnNldC5lcXVhbHNJZ25vcmVDYXNlKCJjaGFyc2V0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaW50IGVxcG9zID0gcGFydHNbMF0uaW5kZXhPZignPScpOwotCQkJCQkJZXFwb3MgPSBlcXBvcyArIDE7Ci0JCQkJCQlpZiAoZXFwb3MgPCBwYXJ0c1swXS5sZW5ndGgoKSkgewotCQkJCQkJCWZDaGFyc2V0ID0gcGFydHNbMF0uc3Vic3RyaW5nKGVxcG9zKTsKLQkJCQkJCQlmQ2hhcnNldCA9IGZDaGFyc2V0LnRyaW0oKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWZDb250ZW50VHlwZSA9IHBhcnRzWzBdOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZkNvbnRlbnRUeXBlID0gcGFydHNbMF07Ci0JCQl9Ci0JCX0KLQkJaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHsKLQkJCWZDaGFyc2V0ID0gcGFydHNbMV07Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIExvb2tzIGZvciB3aGF0IGV2ZXIgZW5jb2RpbmcgcHJvcGVydGllcyB0aGUgdG9rZW5pemVyIHJldHVybnMuIEl0cyB0aGUKLQkgKiByZXNwb25zaWJpbGl0eSBvZiB0aGUgdG9rZW5pemVyIHRvIHN0b3Agd2hlbiBhcHByb3ByaWF0ZSBhbmQgbm90IGdvIHRvbwotCSAqIGZhci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFyc2VIZWFkZXIoSlNQSGVhZFRva2VuaXplciB0b2tlbml6ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZQYWdlRW5jb2RpbmdWYWx1ZSA9IG51bGw7Ci0JCWZDaGFyc2V0ID0gbnVsbDsKLQotCQlIZWFkUGFyc2VyVG9rZW4gdG9rZW4gPSBudWxsOwotCQlkbyB7Ci0JCQkvLyBkb24ndCB1c2UgJ2dldCcgaGVyZSAoYXQgbGVhc3QgdW50aWwgcmVzZXQgaXNzdWUgZml4ZWQpCi0JCQl0b2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCVN0cmluZyB0b2tlblR5cGUgPSB0b2tlbi5nZXRUeXBlKCk7Ci0JCQlpZiAoY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtKHRva2VuVHlwZSkpCi0JCQkJdW5pY29kZUNhc2UgPSB0cnVlOwotCQkJZWxzZSB7Ci0KLQkJCQlpZiAodG9rZW5UeXBlID09IFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2RpbmcpIHsKLQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCUhlYWRQYXJzZXJUb2tlbiB2YWx1ZVRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJCQkJU3RyaW5nIHZhbHVlVG9rZW5UeXBlID0gdmFsdWVUb2tlbi5nZXRUeXBlKCk7Ci0JCQkJCQlpZiAoaXNMZWdhbFN0cmluZyh2YWx1ZVRva2VuVHlwZSkpIHsKLQkJCQkJCQlmWE1MRGVjRW5jb2RpbmdOYW1lID0gdmFsdWVUb2tlbi5nZXRUZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAodG9rZW5UeXBlID09IEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZUVuY29kaW5nKSB7Ci0JCQkJCWlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQlIZWFkUGFyc2VyVG9rZW4gdmFsdWVUb2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCQkJCVN0cmluZyB2YWx1ZVRva2VuVHlwZSA9IHZhbHVlVG9rZW4uZ2V0VHlwZSgpOwotCQkJCQkJaWYgKGlzTGVnYWxTdHJpbmcodmFsdWVUb2tlblR5cGUpKSB7Ci0JCQkJCQkJZlBhZ2VFbmNvZGluZ1ZhbHVlID0gdmFsdWVUb2tlbi5nZXRUZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAodG9rZW5UeXBlID09IEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZUNvbnRlbnRUeXBlKSB7Ci0JCQkJCWlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQlIZWFkUGFyc2VyVG9rZW4gdmFsdWVUb2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCQkJCVN0cmluZyB2YWx1ZVRva2VuVHlwZSA9IHZhbHVlVG9rZW4uZ2V0VHlwZSgpOwotCQkJCQkJaWYgKGlzTGVnYWxTdHJpbmcodmFsdWVUb2tlblR5cGUpKSB7Ci0JCQkJCQkJZkNvbnRlbnRUeXBlVmFsdWUgPSB2YWx1ZVRva2VuLmdldFRleHQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICh0b2tlblR5cGUgPT0gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlTGFuZ3VhZ2UpIHsKLQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCUhlYWRQYXJzZXJUb2tlbiB2YWx1ZVRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJCQkJU3RyaW5nIHZhbHVlVG9rZW5UeXBlID0gdmFsdWVUb2tlbi5nZXRUeXBlKCk7Ci0JCQkJCQlpZiAoaXNMZWdhbFN0cmluZyh2YWx1ZVRva2VuVHlwZSkpIHsKLQkJCQkJCQlmTGFuZ3VhZ2UgPSB2YWx1ZVRva2VuLmdldFRleHQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSk7Ci0JCWlmIChmQ29udGVudFR5cGVWYWx1ZSAhPSBudWxsKSB7Ci0JCQlwYXJzZUNvbnRlbnRUeXBlVmFsdWUoZkNvbnRlbnRUeXBlVmFsdWUpOwotCQl9Ci0JCWlmICh0b2tlbml6ZXIuaXNYSFRNTCgpKSB7Ci0JCQlmWEhUTUwgPSB0cnVlOwotCQl9Ci0JCWlmICh0b2tlbml6ZXIuaXNXTUwoKSApIHsKLQkJCWZXTUwgPSB0cnVlOwotCQl9Ci0JCQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlKU1BIZWFkVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2luaXplcigpOwotCQlmUmVhZGVyLnJlc2V0KCk7Ci0JCXRva2VuaXplci5yZXNldChmUmVhZGVyKTsKLQkJcGFyc2VIZWFkZXIodG9rZW5pemVyKTsKLQkJLy8gdW5pY29kZSBzdHJlYW0gY2FzZXMgYXJlIGNyZWF0ZWQgZGlyZWN0bHkgaW4gcGFyc2VIZWFkZXIKLQkJaWYgKCF1bmljb2RlQ2FzZSkgewotCQkJU3RyaW5nIGVuYyA9IGdldEFwcHJvcHJpYXRlRW5jb2RpbmcoKTsKLQkJCWlmIChlbmMgIT0gbnVsbCAmJiBlbmMubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkZPVU5EX0VOQ09ESU5HX0lOX0NPTlRFTlQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QWxsKCkgewotCQlmUmVhZGVyID0gbnVsbDsKLQkJZkhlYWRlclBhcnNlZCA9IGZhbHNlOwotCQlmRW5jb2RpbmdNZW1lbnRvID0gbnVsbDsKLQkJZkNoYXJzZXQgPSBudWxsOwotCQlmQ29udGVudFR5cGVWYWx1ZSA9IG51bGw7Ci0JCWZQYWdlRW5jb2RpbmdWYWx1ZSA9IG51bGw7Ci0JCWZYTUxEZWNFbmNvZGluZ05hbWUgPSBudWxsOwotCQl1bmljb2RlQ2FzZSA9IGZhbHNlOwotCQlmWEhUTUw9ZmFsc2U7Ci0JCWZXTUw9ZmFsc2U7Ci0JfQotCi0KLQotCS8qKgotCSAqIGNvbnZpZW5jZSBtZXRob2QgYWxsIHN1YmNsYXNzZXMgY2FuIHVzZSAoYnV0IG5vdCBvdmVycmlkZSkKLQkgKiAKLQkgKiBAcGFyYW0gZGV0ZWN0ZWRDaGFyc2V0TmFtZQotCSAqIEBwYXJhbSByZWFzb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lLCBTdHJpbmcgcmVhc29uKSB7Ci0JCWNyZWF0ZUVuY29kaW5nTWVtZW50byhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252aWVuY2UgbWV0aG9kIGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UgKGJ1dCBub3Qgb3ZlcnJpZGUpCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZUlucHV0U2V0KCkgewotCQlpZiAoZlJlYWRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnB1dCBtdXN0IGJlIHNldCBiZWZvcmUgdXNlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzV01MKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCQkvLyB3ZSBrZWVwIHRyYWNrIG9mIGlmIGhlYWRlcidzIGFscmVhZHkgYmVlbiBwYXJzZSwgc28gY2FuIG1ha2UKLQkJCS8vIG11bHRpcGxlICdnZXQnIGNhbGxzLCB3aXRob3V0IGNhdXNpbmcgcmVwYXJzaW5nLgotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCQkvLyBOb3RlOiB0aGVyZSBpcyBhICJoaWRkZW4gYXNzdW1wdGlvbiIgaGVyZSB0aGF0IGFuIGVtcHR5Ci0JCQkvLyBzdHJpbmcgaW4gY29udGVudCBzaG91bGQgYmUgdHJlYXRlZCBzYW1lIGFzIG5vdCBwcmVzZW50LgotCQl9Ci0JCXJldHVybiBmV01MOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzWEhUTUwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllbnN1cmVJbnB1dFNldCgpOwotCQlpZiAoIWZIZWFkZXJQYXJzZWQpIHsKLQkJCXBhcnNlSW5wdXQoKTsKLQkJCS8vIHdlIGtlZXAgdHJhY2sgb2YgaWYgaGVhZGVyJ3MgYWxyZWFkeSBiZWVuIHBhcnNlLCBzbyBjYW4gbWFrZQotCQkJLy8gbXVsdGlwbGUgJ2dldCcgY2FsbHMsIHdpdGhvdXQgY2F1c2luZyByZXBhcnNpbmcuCi0JCQlmSGVhZGVyUGFyc2VkID0gdHJ1ZTsKLQkJCS8vIE5vdGU6IHRoZXJlIGlzIGEgImhpZGRlbiBhc3N1bXB0aW9uIiBoZXJlIHRoYXQgYW4gZW1wdHkKLQkJCS8vIHN0cmluZyBpbiBjb250ZW50IHNob3VsZCBiZSB0cmVhdGVkIHNhbWUgYXMgbm90IHByZXNlbnQuCi0JCX0KLQkJcmV0dXJuIGZYSFRNTDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50RmFjdG9yeUZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEZhY3RvcnlGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmOWE3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50RmFjdG9yeUZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLkpTUFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LlN0cnVjdHVyZWREb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlRhZ01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudEZhY3RvcnlGb3JKU1AgaW1wbGVtZW50cyBJRG9jdW1lbnRGYWN0b3J5IHsKLQotCXB1YmxpYyBEb2N1bWVudEZhY3RvcnlGb3JKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklEb2N1bWVudEZhY3RvcnkjY3JlYXRlRG9jdW1lbnQoKQotCSAqLwotCXB1YmxpYyBJRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShuZXcgSlNQU291cmNlUGFyc2VyKCkpOwotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQkvLyByZW1lbWJlciwgdGhlIExvYWRlcgotCQkvLyB3aWxsIG5lZWQgdG8gZmluaXNoIGluaXRpYWxpemF0aW9uIG9mIHBhcnNlcgotCQkvLyBiYXNlZCBvbiAiZW1iZWRkZWQgY29udGVudCIKLQkJSlNQU291cmNlUGFyc2VyIHBhcnNlciA9IG5ldyBKU1BTb3VyY2VQYXJzZXIoKTsKLQkJLy8gYWRkIGRlZmF1bHQgbmVzdGFibGUgdGFnIGxpc3QKLQkJYWRkTmVzdGFibGVQcmVmaXgocGFyc2VyLCBKU1AxMU5hbWVzcGFjZS5KU1BfVEFHX1BSRUZJWCk7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE5lc3RhYmxlUHJlZml4KEpTUFNvdXJjZVBhcnNlciBwYXJzZXIsIFN0cmluZyB0YWdOYW1lKSB7Ci0JCVRhZ01hcmtlciBibSA9IG5ldyBUYWdNYXJrZXIodGFnTmFtZSk7Ci0JCXBhcnNlci5hZGROZXN0YWJsZVByZWZpeChibSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjMyMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLQotLyoqCi0gKiBDbGFzc2VzIHdoaWNoIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBoYXZlIHR3byByZXNwb25zaWJpbGl0aWVzLiAKLSAqIE9uZSBpcyB0byBwcm92aWRlCi0gKiBhbmQgZW1iZWRkZWQgZmFjdG9yeSByZWdpc3RyeSBmb3IgSlNQIEF3YXJlIElOb2RlQWRhcHRlciBGYWN0b3JpZXMKLSAqIHRvIHVzZS4gVGhlIG90aGVyIGlzIHRvIG1vbml0b3IgcGFnZSBkaXJlY3RpdmVzIGFuZCBpZiAKLSAqIGEgY2hhbmdlIGluIGVtYmVkZGVkIHR5cGUgaXMgaXMgbWFkZSwgaXQgd2lsbCBzaWduYWwgCi0gKiB0aGUgc3RydWN0dXJlZE1vZGVsIHRoYXQgaXQgbmVlZHMgdG8gcmVpbml0aWFsaXplIGl0c2VsZi4KLSAqLwotcHVibGljIGludGVyZmFjZSBQYWdlRGlyZWN0aXZlQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCk7Ci0KLQkvKioKLQkgKiBUaGlzIHNldHRlciBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmNlLCBzaG9ydGx5IGFmdGVyCi0JICogaW5pdGlhbGl6YXRpb24uCi0JICovCi0Jdm9pZCBzZXRFbWJlZGRlZFR5cGUoRW1iZWRkZWRUeXBlSGFuZGxlciBoYW5kbGVyKTsKLQotCUVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0RW1iZWRkZWRUeXBlKCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB0byBnaXZlIHRoaXMgYWRhcHRlciBhIGNoYW5jZSB0byB1c2UKLQkgKiB0aGUgQWRhcHRlckZhY3RvcmllcyBmcm9tIHRoZSBFbWJlZGRlZFR5cGVIYW5kbGVyCi0JICogdG8gYWRhcHQgdGhlIG5vZGUuIEl0cyB0byBiZSB1c2VkIGJ5IEpTUEF3YXJlQWRhcHRlckZhY3RvcmllcwotCSAqIHRvIChwb3RlbnRpYWxseSkgYWRhcHQgbm9kZXMgZnJvbSB0aGUgZW1iZWRkZWQgY29udGVudCB0eXBlLgotCSAqLwotCUlOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSk7Ci0KLQl2b2lkIGFkZEVtYmVkZGVkRmFjdG9yeShJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpOwotCi0JLyoqCi0JICogTWV0aG9kIHNldExhbmd1YWdlLgotCSAqIEBwYXJhbSBsYW5ndWFnZQotCSAqLwotCXZvaWQgc2V0TGFuZ3VhZ2UoU3RyaW5nIGxhbmd1YWdlKTsKLQotCUlOb2RlTm90aWZpZXIgZ2V0VGFyZ2V0KCk7Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5ODZkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGFkYXB0cyBkb2N1bWVudCAKLSAqIHdpdGggdGhlIGFuIGluc3RhbmNlIG9mIFBhZ2VEaXJlY3RpdmVBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWdlRGlyZWN0aXZlQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0KLQotCXByaXZhdGUgUGFnZURpcmVjdGl2ZUFkYXB0ZXIgcGFnZURpcmVjdGl2ZUFkYXB0ZXJJbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFnZURpcmVjdGl2ZUFkYXB0ZXJGYWN0b3J5LgotCSAqIE5vdGU6IGl0cyBpbXBvcnRhbnQgbm90IHRvIGJlIGEgc2luZ2xldG9uLCBzaW5jZQotCSAqIHRoaXMgZmFjdG9yeSBuZWVkcyB0byB0cmFjayBpdHMgYWRhcHRlcihzKSBhbmQgcmVsZWFzZQotCSAqIHRoZW0gd2hlbiB0aGV5IGFyZSByZWxlYXNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcktleQotCSAqIEBwYXJhbSByZWdpc3RlckFkYXB0ZXJzCi0JICovCi0JcHJvdGVjdGVkIFBhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCS8qKgotCSAqIFRoZSBubyBhcmd1bWVudCBjb25zdHJ1Y3RvciBhc3N1bWVzIGl0cyBhIAotCSAqIEZhY3RvcnkgZm9yIFBhZ2VEaXJlY3RpdmVBZGFwdGVyCi0JICovCi0JcHVibGljIFBhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeSgpIHsKLQkJdGhpcyhQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgdGFyZ2V0OwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQlyZXN1bHQgPSBnZXRBZGFwdGVySW5zdGFuY2UodGFyZ2V0KTsKLQkJCX0KLQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYgKHBhZ2VEaXJlY3RpdmVBZGFwdGVySW5zdGFuY2UgIT0gbnVsbCkgewotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXJJbnN0YW5jZS5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXZSBhc3N1bWUgdGhpcyBpcyBvbmx5IGNhbGxlZCBmb3IgJ2RvY3VtZW50JyB0YXJnZXQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFnZURpcmVjdGl2ZUFkYXB0ZXIgZ2V0QWRhcHRlckluc3RhbmNlKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCS8vIGlmIG91ciBpbnN0YW5jZSBhbHJlYWR5IGV4aXN0cyB3aXRoIGEgZGlmZmVyZW50Ci0JCS8vIHRhcmdldCwgdGhlbiwgc29tZWhvdywgdGhlIGRvY3VtZW50IG5vZGUgbXVzdCAKLQkJLy8gaGF2ZSBjaGFuZ2VkIGZvciBhIG1vZGVsLCBzbyB3ZSBzaG91bGQgcmVsZWFzZSAKLQkJLy8gb2xkIGFkYXB0ZXIgYW5kIGNyZWF0ZSBuZXcgb25lIGZvciBuZXcgZG9jdW1lbnQgCi0JCS8vIG5vZGUuIFRoaXMgaXMgcHJvYmFibHkgYSBwcm9ncmFtbWluZyBlcnJvci4KLQkJaWYgKHBhZ2VEaXJlY3RpdmVBZGFwdGVySW5zdGFuY2UgIT0gbnVsbCkgewotCQkJaWYgKHRhcmdldCAhPSBwYWdlRGlyZWN0aXZlQWRhcHRlckluc3RhbmNlLmdldFRhcmdldCgpKSB7Ci0JCQkJcmVsZWFzZSgpOwotCQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVySW5zdGFuY2UgPSBuZXcgUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsKHRhcmdldCk7Ci0JCQl9Ci0JCQkvLyBlbHNlIHJldHVybiB0aGUgb25lIHdlIGhhdmUKLQkJfQotCQllbHNlIHsKLQkJCS8vIGlmIGlzIGVxdWFsIHRvIG51bGwsIGNyZWF0ZSBhIG5ldyBvbmUKLQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVySW5zdGFuY2UgPSBuZXcgUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsKHRhcmdldCk7Ci0JCX0KLQkJQXNzZXJ0LmlzTm90TnVsbChwYWdlRGlyZWN0aXZlQWRhcHRlckluc3RhbmNlLCAicGFnZURpcGFnZURpcmVjdGl2ZUFkYXB0ZXJJbnN0YW5jZSB3YXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYWdlRGlyZWN0aXZlQWRhcHRlckluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0KLQkJcmV0dXJuIG5ldyBQYWdlRGlyZWN0aXZlQWRhcHRlckZhY3RvcnkoZ2V0QWRhcHRlcktleSgpLCBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI2YzNhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkpTUEZDb250ZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZVN0YXRlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVGYW1pbHlGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVSZWdpc3RyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBoYXMgdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHByb3ZpZGUgYW4gZW1iZWRkZWQgZmFjdG9yeSByZWdpc3RyeQotICogZm9yIEpTUCBBd2FyZSBJTm9kZUFkYXB0ZXIgRmFjdG9yaWVzIHRvIHVzZS4KLSAqIAotICogVHlwaWNhbGx5LCB0aGUgZW1iZWRkZWQgdHlwZSBpcyB0byBiZSBjb25zaWRlcmVkIGEgZmVhdHVyZSBvZiB0aGUgZG9jdW1lbnQsCi0gKiBzbyBKU1AgQXdhcmUgQWRwYXRlckZhY3RvcmllcyBzaG91bGQgY2FsbAotICogZ2V0QWRhcHRlcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcykgZGlyZWN0b3kgb24gdGhlIGRvY3VtZW50IChvciBvd25pbmcKLSAqIGRvY3VtZW50KSBub2RlLgotICovCi1wdWJsaWMgY2xhc3MgUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsIGltcGxlbWVudHMgUGFnZURpcmVjdGl2ZUFkYXB0ZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSX0NIQVJTRVQgPSAiY2hhcnNldCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBPYmplY3QgYWRhcHRlclR5cGUgPSBQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzczsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWw7Ci0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIEpBVkFTQ1JJUFRfTEFOR1VBR0VfS0VZUyA9IG5ldyBTdHJpbmdbXXsiamF2YXNjcmlwdCIsICJqYXZhc2NyaXB0MS4wIiwgImphdmFzY3JpcHQxLjFfMyIsICJqYXZhc2NyaXB0MS4yIiwgImphdmFzY3JpcHQxLjMiLCAiamF2YXNjcmlwdDEuNCIsICJqYXZhc2NyaXB0MS41IiwgImphdmFzY3JpcHQxLjYiLCAianNjcmlwdCIsICJzYXNoc2NyaXB0In07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JCAvLyROT04tTkxTLTkkIC8vJE5PTi1OTFMtMTAkCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIEpBVkFfTEFOR1VBR0VfS0VZUyA9IG5ldyBTdHJpbmdbXXsiamF2YSJ9OyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsLgotCSAqLwotCXB1YmxpYyBQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJc3VwZXIoKTsKLQkJbm90aWZpZXJBdENyZWF0aW9uID0gdGFyZ2V0OwotCQkvLyB3ZSBuZWVkIHRvIHJlbWVtYmVyIG91ciBpbnN0YW5jZSBvZiBtb2RlbCwKLQkJLy8gaW4gY2FzZSB3ZSBuZWVkIHRvICJzaWduYWwiIGEgcmUtaW5pdCBuZWVkZWQuCi0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgdGFyZ2V0OwotCQkJbW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHBhcnNlcyB0aGUgZnVsbCBjb250ZW50VHlwZSB2YWx1ZSBpbnRvIGl0cyB0d28gcGFydHMgdGhlIGNvbnRlbnRUeXBlLAotCSAqIGFuZCB0aGUgY2hhcnNldCwgaWYgcHJlc2VudC4gTm90ZTogdGhpcyBtZXRob2QgaXMgYSBsaWdodGx5IG1vZGlmaWVkCi0JICogdmVyc2lvbiBvZiBhIG1ldGhvZCBpbiBBYnN0cmFjdEhlYWRQYXJzZXIuIFRoZXJlLCB3ZSdyZSBtb3N0bHkKLQkgKiBpbnRlcmVzdGVkIGluIHRoZSBjaGFyc2V0IHBhcnQgb2YgY29udGVudFR5cGVWYWx1ZS4gSGVyZSwgd2UncmUgbW9zdGx5Ci0JICogaW50ZXJlc3RlZCBpbiB0aGUgbWltZVR5cGUgcGFydC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRNaW1lVHlwZUZyb21Db250ZW50VHlwZVZhbHVlKFN0cmluZyBjb250ZW50VHlwZVZhbHVlKSB7Ci0JCWlmIChjb250ZW50VHlwZVZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIGNsZWFuQ29udGVudFR5cGVWYWx1ZSA9IFN0cmluZ1V0aWxzLnN0cmlwTm9uTGV0dGVyRGlnaXRzKGNvbnRlbnRUeXBlVmFsdWUpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihjbGVhbkNvbnRlbnRUeXBlVmFsdWUsICI7PSBcdFxuXHJcZiIpOyAvLyROT04tTkxTLTEkCi0JCWludCB0TGVuID0gdG9rZW5pemVyLmNvdW50VG9rZW5zKCk7Ci0JCS8vIGlmIGNvbnRhaW5zIGVuY29kaW5nIHNob3VsZCBoYXZlIHRocmVlIHRva2VucywgdGhlIG1pbWV0eXBlLCB0aGUKLQkJLy8gd29yZCAnY2hhcnNldCcsIGFuZCB0aGUgZW5jb2RpbmcgdmFsdWUKLQkJU3RyaW5nW10gdG9rZW5zID0gbmV3IFN0cmluZ1t0TGVuXTsKLQkJaW50IGogPSAwOwotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJdG9rZW5zW2pdID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJaisrOwotCQl9Ci0JCS8vIAotCQkvLyBGb2xsb3dpbmcgaXMgdGhlIGNvbW1vbiBmb3JtIGZvciB0YXJnZXQgZXhwcmVzc2lvbgotCQkvLyA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0JCS8vIEJ1dCBhcHBhcnJlbnRseSBpcyBhbHNvIHZhbGlkIHdpdGhvdXQgdGhlIGNvbnRlbnQgdHlwZSB0aGVyZSwKLQkJLy8ganVzdCB0aGUgY2hhcnNldCwgYXMgZm9sbG93czoKLQkJLy8gPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJjaGFyc2V0PVVURi04Ij4KLQkJLy8gU28gd2UnbGwgbG9vcCB0aHJvdWdoIHRva2VucyBhbmQga2V5IG9mZiBvZiAnY2hhcnNldCcKLQotCQlpbnQgY2hhcnNldFBvcyA9IC0xOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5lcXVhbHNJZ25vcmVDYXNlKFNUUl9DSEFSU0VUKSkgewotCQkJCWNoYXJzZXRQb3MgPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8vIFN0cmluZyBjaGFyc2V0ID0gbnVsbDsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlID0gbnVsbDsKLQkJaWYgKGNoYXJzZXRQb3MgPiAtMSkgewotCQkJLy8gY2FzZSB3aGVyZSBjaGFyc2V0IHdhcyBwcmVzZW50Ci0JCQkvLyBpbnQgY2hhcnNldFZhbHVlUG9zID0gY2hhcnNldFBvcyArIDE7Ci0JCQkvLyBpZiAoY2hhcnNldFZhbHVlUG9zIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJLy8gY2hhcnNldCA9IHRva2Vuc1tjaGFyc2V0VmFsdWVQb3NdOwotCQkJLy8gfQotCQkJaW50IGNvbnRlbnRUeXBlVmFsdWVQb3MgPSBjaGFyc2V0UG9zIC0gMTsKLQkJCWlmIChjb250ZW50VHlwZVZhbHVlUG9zID4gLTEpIHsKLQkJCQljb250ZW50VHlwZSA9IHRva2Vuc1tjb250ZW50VHlwZVZhbHVlUG9zXTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIGNoYXJzZXQgd2FzIG5vdCBwcmVzZW50LCBzbyBpZiB0aGVyZSdzCi0JCQkvLyBhIHZhbHVlLCB3ZSBhc3N1bWUgaXRzIHRoZSBjb250ZW50VHlwZSB2YWx1ZQotCQkJaWYgKHRva2Vucy5sZW5ndGggPiAwKSB7Ci0JCQkJY29udGVudFR5cGUgPSB0b2tlbnNbMF07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRUeXBlOwotCX0KLQotCXByaXZhdGUgRW1iZWRkZWRUeXBlSGFuZGxlciBlbWJlZGRlZFR5cGVIYW5kbGVyOwotCXByaXZhdGUgTGlzdCBlbWJlZGRlZEZhY3RvcnlSZWdpc3RyeSA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIFN0cmluZyBjYWNoZWRMYW5ndWFnZTsKLQlwcml2YXRlIFN0cmluZyBjYWNoZWRDb250ZW50VHlwZTsKLQlwcml2YXRlIElOb2RlTm90aWZpZXIgbm90aWZpZXJBdENyZWF0aW9uOwotCi0JcHJpdmF0ZSBpbnQgZmlyc3RMYW5ndWFnZVBvc2l0aW9uID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZmlyc3RDb250ZW50VHlwZVBvc2l0aW9uID0gLTE7Ci0KLQkvKgotCSAqIEBzZWUgSU5vZGVBZGFwdGVyI2lzQWRhcHRlckZvclR5cGUoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IGFkYXB0ZXJUeXBlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU5vZGVBZGFwdGVyI25vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciwgaW50LCBPYmplY3QsIE9iamVjdCwKLQkgKiAgICAgIE9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVtYmVkZGVkVHlwZShFbWJlZGRlZFR5cGVIYW5kbGVyIGhhbmRsZXIpIHsKLQkJLy8gaWYgcmVhbGx5IHRoZSBzYW1lIGhhbmRsZXIsIG5vIG5lZWQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZwotCQlpZiAoZW1iZWRkZWRUeXBlSGFuZGxlciA9PSBoYW5kbGVyKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gdGhlbiBvbmUgZXhpc3RzLCBhbmQgdGhlIG5ldyBvbmUgaXMgdHJ1ZWx5IGRpZmZlcmVudCwgc28gd2UgbmVlZCB0bwotCQkvLyByZWxlYXNlIGFuZCByZW1vdmUgY3VycmVudCBmYWN0b3JpZXMKLQkJaWYgKGVtYmVkZGVkVHlwZUhhbmRsZXIgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgbGlzdCA9IGVtYmVkZGVkRmFjdG9yeVJlZ2lzdHJ5Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAobGlzdC5oYXNOZXh0KCkpIHsKLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgbGlzdC5uZXh0KCk7Ci0JCQkJZmFjdG9yeS5yZWxlYXNlKCk7Ci0JCQl9Ci0KLQkJCWVtYmVkZGVkRmFjdG9yeVJlZ2lzdHJ5LmNsZWFyKCk7Ci0JCX0KLQotCQllbWJlZGRlZFR5cGVIYW5kbGVyID0gaGFuZGxlcjsKLQkJLy8gd2hlbiB0aGUgaGFuZGxlciBpcyBzZXQsICJ0cmFuc2ZlciIgaXRzIGZhY3RvcmllcyB0byBvdXIgb3duIGxpc3QuCi0JCS8vIG5vdGU6IG91ciBvd24gbGlzdCBtYXkgYWxzbyBiZSBhZGRlZCB0byBlbHNlIHdoZXJlLCBzdWNoIGFzIG9uCi0JCS8vICJlZGl0b3Igc2lkZSIuCi0JCWlmIChlbWJlZGRlZFR5cGVIYW5kbGVyICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZW1iZWRkZWRUeXBlSGFuZGxlci5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWVtYmVkZGVkRmFjdG9yeVJlZ2lzdHJ5LmFkZChmYWN0b3J5KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgUGFnZURpcmVjdGl2ZUFkYXB0ZXIjYWRhcHQoSU5vZGVOb3RpZmllciwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKLQkJSU5vZGVBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0JCS8vIGlmIGVtYmVkZGVkQ29udGVudFR5cGUgaGFzbid0IGJlZW4gc2V0LAotCQkvLyB0aGVuIHdlIGNhbiBub3QgYWRhcHQgaXQuCi0JCWlmIChlbWJlZGRlZFR5cGVIYW5kbGVyICE9IG51bGwpIHsKLQkJCWlmIChlbWJlZGRlZEZhY3RvcnlSZWdpc3RyeSAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbWJlZGRlZEZhY3RvcnlSZWdpc3RyeS5pdGVyYXRvcigpOwotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlmYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKGZhY3RvcnkuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewotCQkJCQkJcmVzdWx0ID0gZmFjdG9yeS5hZGFwdChub3RpZmllcik7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBQYWdlRGlyZWN0aXZlQWRhcHRlciNnZXRFbWJlZGRlZFR5cGUoKQotCSAqLwotCXB1YmxpYyBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEVtYmVkZGVkVHlwZSgpIHsKLQkJaWYgKGVtYmVkZGVkVHlwZUhhbmRsZXIgPT0gbnVsbCkgewotCQkJZW1iZWRkZWRUeXBlSGFuZGxlciA9IGdldERlZmF1bHRFbWJlZGRlZFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZW1iZWRkZWRUeXBlSGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFbWJlZGRlZEZhY3RvcnkoSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCS8vIHNob3VsZCB3ZSBjaGVjayBpZiBhbHJlYWR5IGV4aXN0cyBpbiBsaXN0PwotCQllbWJlZGRlZEZhY3RvcnlSZWdpc3RyeS5hZGQoZmFjdG9yeSk7Ci0JfQotCi0JLy8gLyoqCi0JLy8gKiBVc2VkIGJ5IFBhZ2VEaXJlY3RpdmVXYXRjaGVycyB0byBzaWduYWwgdGhhdCBzb21lIGltcG9ydGFudCBhdHRyaWJ1dGUKLQkvLyBoYXMgY2hhbmdlZCwgYW5kCi0JLy8gKiBhbnkgY2FjaGVkIHZhbHVlcyBzaG91bGQgYmUgcmUtY2FsY3VhdGVkCi0JLy8gKi8KLQkvLyB2b2lkIGNoYW5nZWQoKSB7Ci0JLy8gLy8gd2Ugd29uJ3QgYWN0dWFsbHkgY2hlY2sgaWYgY2hhbmdlIGlzIG5lZWRlZCwgaWYgdGhlIG1vZGVsIHN0YXRlIGlzCi0JLy8gYWxyZWFkeSBjaGFuZ2luZy4KLQkvLyBpZiAoIW1vZGVsLmlzUmVpbml0aWFsaXphdGlvbk5lZWRlZCgpKSB7Ci0JLy8gLy8gZ28gdGhyb3VnaCBvdXIgbGlzdCBvZiBwYWdlIHdhdGNoZXIgYWRhcHRlcnMsIGFuZCB1cGRhdGVzIHRoZQotCS8vIGF0dHJpYnV0ZXMKLQkvLyAvLyB3ZSdyZSBpbnRlcmVzdGVkIGluLCBpZiBhbmQgb25seSBpZiB0aGV5IGFyZSB0aGUgZWFybGllc3Qgb2NjdXJhbmNlCi0JLy8gaW4gdGhlIHJlc291cmNlCi0JLy8gU3RyaW5nIHBvdGVudGlhbENvbnRlbnRUeXBlID0gbnVsbDsKLQkvLyBTdHJpbmcgcG90ZW50aWFsTGFuZ3VhZ2UgPSBudWxsOwotCS8vIGludCBjb250ZW50VHlwZVBvc2l0aW9uID0gLTE7Ci0JLy8gaW50IGxhbmd1YWdlUG9zaXRpb24gPSAtMTsKLQkvLyBJdGVyYXRvciBpdGVyYXRvciA9IHBhZ2VEaXJlY3RpdmVXYXRjaGVycy5pdGVyYXRvcigpOwotCS8vIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkvLyBQYWdlRGlyZWN0aXZlV2F0Y2hlciBwZFdhdGNoZXIgPSAoUGFnZURpcmVjdGl2ZVdhdGNoZXIpCi0JLy8gaXRlcmF0b3IubmV4dCgpOwotCS8vIFN0cmluZyBjb250ZW50VHlwZSA9IHBkV2F0Y2hlci5nZXRDb250ZW50VHlwZSgpOwotCS8vIFN0cmluZyBsYW5ndWFnZSA9IHBkV2F0Y2hlci5nZXRMYW5ndWFnZSgpOwotCS8vIGludCBvZmZzZXQgPSBwZFdhdGNoZXIuZ2V0T2Zmc2V0KCk7Ci0JLy8gaWYgKHBvdGVudGlhbENvbnRlbnRUeXBlID09IG51bGwgfHwgKGhhc1ZhbHVlKGNvbnRlbnRUeXBlKSAmJiAob2Zmc2V0IDwKLQkvLyBjb250ZW50VHlwZVBvc2l0aW9uKSkpIHsKLQkvLyBwb3RlbnRpYWxDb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOwotCS8vIGNvbnRlbnRUeXBlUG9zaXRpb24gPSBvZmZzZXQ7Ci0JLy8gfQotCS8vIH0KLQkvLyAvLyBub3cgd2UgaGF2ZSB0aGUgYmVzdCBjYW5kaWF0ZXMgZm9yIGNhY2hlZCB2YWx1ZXMsIGxldCdzIHNlZSBpZgotCS8vIHRoZXkndmUgcmVhbGx5IGNoYW5nZWQgZnJvbQotCS8vIC8vIHdoYXQgd2UgaGFkLiBJZiBzbywgbm90ZSB3ZSBnbyB0aHJvdWdoIHRoZSBzZXR0ZXJzIHNvIHNpZGUgZWZmZWN0cwotCS8vIGNhbiB0YWtlIHBsYWNlIHRoZXJlLgotCS8vIHBvdGVudGlhbENvbnRlbnRUeXBlID0KLQkvLyBnZXRNaW1lVHlwZUZyb21Db250ZW50VHlwZVZhbHVlKHBvdGVudGlhbENvbnRlbnRUeXBlKTsKLQkvLyBpZiAocG90ZW50aWFsQ29udGVudFR5cGUgPT0gbnVsbCB8fCBwb3RlbnRpYWxDb250ZW50VHlwZS5sZW5ndGgoKSA9PSAwKQotCS8vIHsKLQkvLyAvL3BvdGVudGlhbENvbnRlbnRUeXBlID0gZ2V0RGVmYXVsdENvbnRlbnRUeXBlKCk7Ci0JLy8gfSBlbHNlIHsKLQkvLyBzZXRDYWNoZWRDb250ZW50VHlwZShwb3RlbnRpYWxDb250ZW50VHlwZSk7Ci0JLy8gfQotCS8vCi0JLy8gaWYgKHBvdGVudGlhbExhbmd1YWdlICE9IG51bGwgJiYgaGFzVmFsdWUocG90ZW50aWFsTGFuZ3VhZ2UpKSB7Ci0JLy8gc2V0Q2FjaGVkTGFuZ3VhZ2UocG90ZW50aWFsTGFuZ3VhZ2UpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCXZvaWQgY2hhbmdlZENvbnRlbnRUeXBlKGludCBlbGVtZW50T2Zmc2V0LCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJLy8gb25seSBuZWVkIHRvIHByb2Nlc3MgaWYgdGhpcyBuZXcgdmFsdWUgaXMKLQkJLy8gZWFybGllciBpbiB0aGUgZmlsZSB0aGFuIG91ciBjdXJyZW50IHZhbHVlCi0JCWlmIChmaXJzdENvbnRlbnRUeXBlUG9zaXRpb24gPT0gLTEgfHwgZWxlbWVudE9mZnNldCA8PSBmaXJzdENvbnRlbnRUeXBlUG9zaXRpb24pIHsKLQkJCS8vIGR3X1RPRE86IHVwZGF0ZSBlbWJlZGRlZCBwYXJ0aXRpb25lciBpbiBKU1AgZG9jdW1lbnQKLQkJCS8vIHBhcnRpdGlvbmVyCi0JCQkvLyBuc2RfVE9ETzogdXBkYXRlIGVtYmVkZGVkIHBhcnRpdGlvbmVyIGluIEpTUCBkb2N1bWVudAotCQkJLy8gcGFydGl0aW9uZXIKLQotCQkJLy8gbm8gbmVlZCB0byBjaGFuZ2UgY3VycmVudCB2YWx1ZSwgaWYgd2UncmUgdG9sZCBzb21lCi0JCQkvLyBlYXJsaWVyIHZhbHVlIGlzIG51bGwgb3IgYmxhbmsgKHNvdW5kcyBsaWtlIGFuIGVycm9yLCBhbnl3YXkpCi0JCQlpZiAoaGFzVmFsdWUobmV3VmFsdWUpKSB7Ci0JCQkJZmlyc3RDb250ZW50VHlwZVBvc2l0aW9uID0gZWxlbWVudE9mZnNldDsKLQkJCQlTdHJpbmcgcG90ZW50aWFsQ29udGVudFR5cGUgPSBnZXRNaW1lVHlwZUZyb21Db250ZW50VHlwZVZhbHVlKG5ld1ZhbHVlKTsKLQkJCQkvLyBvbmx5IGRvIHRoZSBzZXQgcHJvY2Vzc2luZyBpZiBkaWZmZXJlbnQKLQkJCQkvLyBmcm9tIHdoYXQgaXQgYWxyZWFkeSBpcwotCQkJCS8vIGlmICghcG90ZW50aWFsQ29udGVudFR5cGUuZXF1YWxzSWdub3JlQ2FzZShjYWNoZWRMYW5ndWFnZSkpCi0JCQkJLy8gewotCQkJCXNldENhY2hlZENvbnRlbnRUeXBlKHBvdGVudGlhbENvbnRlbnRUeXBlKTsKLQkJCQkvLyB9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGJ5IFBhZ2VEaXJlY3RpdmVXYXRjaGVycyB0byBzaWduYWwgdGhhdCBzb21lIGltcG9ydGFudCBhdHRyaWJ1dGUKLQkgKiBoYXMgY2hhbmdlZCwgYW5kIGFueSBjYWNoZWQgdmFsdWVzIHNob3VsZCBiZSByZS1jYWxjdWF0ZWQKLQkgKi8KLQl2b2lkIGNoYW5nZWRMYW5ndWFnZShpbnQgZWxlbWVudE9mZnNldCwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCS8vIG9ubHkgbmVlZCB0byBwcm9jZXNzIGlmIHRoaXMgbmV3IHZhbHVlIGlzCi0JCS8vIGVhcmxpZXIgaW4gdGhlIGZpbGUgdGhhbiBvdXIgY3VycmVudCB2YWx1ZQotCQkvLyBoYXMgdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvLCBpbiBjYXNlIG91ciBwcmV2aW91cyBlYXJsaWVzdCBvbmUsCi0JCS8vIGlzIGl0c2VsZiBjaGFuZ2luZyEKLQkJaWYgKGZpcnN0TGFuZ3VhZ2VQb3NpdGlvbiA9PSAtMSB8fCBlbGVtZW50T2Zmc2V0IDw9IGZpcnN0TGFuZ3VhZ2VQb3NpdGlvbikgewotCi0JCQkvLyBubyBuZWVkIHRvIGNoYW5nZSBjdXJyZW50IHZhbHVlLCBpZiB3ZSdyZSB0b2xkIHNvbWUKLQkJCS8vIGVhcmxpZXIgdmFsdWUgaXMgbnVsbCBvciBibGFuayAoc291bmRzIGxpa2UgYW4gZXJyb3IsIGFueXdheSkKLQkJCWlmIChoYXNWYWx1ZShuZXdWYWx1ZSkpIHsKLQkJCQlmaXJzdExhbmd1YWdlUG9zaXRpb24gPSBlbGVtZW50T2Zmc2V0OwotCQkJCS8vIG9ubHkgZG8gdGhlIHNldCBwcm9jZXNzaW5nIGlmIGRpZmZlcmVudAotCQkJCS8vIGZyb20gd2hhdCBpdCBhbHJlYWR5IGlzCi0JCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKGNhY2hlZExhbmd1YWdlKSkgewotCQkJCQlzZXRDYWNoZWRMYW5ndWFnZShuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBkd19UT0RPOiBzZXQgbGFuZ3VhZ2UgaW4gZG9jdW1lbnQgcGFydGl0aW9uZXIKLQkJCS8vIG5zZF9UT0RPOiBzZXQgbGFuZ3VhZ2UgaW4gZG9jdW1lbnQgcGFydGl0aW9uZXIKLQkJfQotCX0KLQotCS8qKgotCSAqIFVzZWQgYnkgUGFnZURpcmVjdGl2ZVdhdGNoZXJzIHRvIHNpZ25hbCB0aGF0IHNvbWUgaW1wb3J0YW50IGF0dHJpYnV0ZQotCSAqIGhhcyBjaGFuZ2VkLCBhbmQgYW55IGNhY2hlZCB2YWx1ZXMgc2hvdWxkIGJlIHJlLWNhbGN1YXRlZAotCSAqLwotCXZvaWQgY2hhbmdlZFBhZ2VFbmNvZGluZyhpbnQgZWxlbWVudE9mZnNldCwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0KLQkJLy8gd2UgZG9uJ3QgY3VycmVudGx5IHRyYWNrIGFjdGl2ZSB2YWx1ZSwgc2luY2UKLQkJLy8ganVzdCBuZWVkIGR1cmluZyByZWFkIGFuZCB3cml0ZSAod2hlcmUgaXRzCi0JCS8vIGNhbGN1bGF0ZWQuIFdlIHdpbGwgbmVlZCBpbiBmdXR1cmUsIHRvCi0JCS8vIGFjdXJhdGVseSBjbG9uZSBhIG1vZGVsIGFuZCB0byBkaXNwbGF5Ci0JCS8vICJjdXJyZW50IGVuY29kaW5nIiB0byB1c2VyIGluIHN0YXR1cyBiYXIuCi0JfQotCi0JLyoqCi0JICogTWV0aG9kIGhhc1ZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50VHlwZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjYWNoZWRDb250ZW50VHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCWlmIChjYWNoZWRDb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQljYWNoZWRDb250ZW50VHlwZSA9IGdldERlZmF1bHRDb250ZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBjYWNoZWRDb250ZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0RGVmYXVsdENvbnRlbnRUeXBlLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdENvbnRlbnRUeXBlKCkgewotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0JCUlGaWxlIGZpbGUgPSBnZXRGaWxlKG1vZGVsKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJdHlwZSA9IEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShKU1BGQ29udGVudFByb3BlcnRpZXMuSlNQQ09OVEVOVFRZUEUsIGZpbGUsIHRydWUpOwotCQl9Ci0JCS8vIEJVRzEzNjQ2OAotCQlpZiAodHlwZSA9PSBudWxsKQotCQkJdHlwZSA9ICJ0ZXh0L2h0bWwiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNhY2hlZExhbmd1YWdlLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHsKLQkJaWYgKGNhY2hlZExhbmd1YWdlID09IG51bGwpCi0JCQljYWNoZWRMYW5ndWFnZSA9IGdldERlZmF1bHRMYW5ndWFnZSgpOwotCQlyZXR1cm4gY2FjaGVkTGFuZ3VhZ2U7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldERlZmF1bHRMYW5ndWFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRMYW5ndWFnZSgpIHsKLQkJU3RyaW5nIGxhbmd1YWdlID0gbnVsbDsKLQkJSUZpbGUgZmlsZSA9IGdldEZpbGUobW9kZWwpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlsYW5ndWFnZSA9IEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShKU1BGQ29udGVudFByb3BlcnRpZXMuSlNQTEFOR1VBR0UsIGZpbGUsIHRydWUpOwotCQl9Ci0JCS8vIEJVRzEzNjQ2OAotCQlpZiAobGFuZ3VhZ2UgPT0gbnVsbCkKLQkJCWxhbmd1YWdlID0gImphdmEiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBsYW5ndWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjYWNoZWRDb250ZW50VHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gY2FjaGVkQ29udGVudFR5cGUKLQkgKiAgICAgICAgICAgIFRoZSBjYWNoZWRDb250ZW50VHlwZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZWRDb250ZW50VHlwZShTdHJpbmcgbmV3Q29udGVudFR5cGUpIHsKLQkJLyoKLQkJICogaWYgdGhlIHBhc3NlZCBpbiB2YWx1ZSBpcyB0aGUgc2FtZSBhcyBleGlzdGluZywgdGhlcmUncyBub3RoaW5nIHRvCi0JCSAqIGRvLiBpZiBpdHMgZGlmZmVyZW50LCB0aGVuIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBjb250ZW50SGFuZGxlciBhcwotCQkgKiB3ZWxsIGFuZCwgbW9yZSB0byB0aGUgcG9pbnQsIHNpZ25hbCBhIHJlLWluaXRpYWxpenRhdGlvbiBpcyBuZWVkZWQuCi0JCSAqIAotCQkgKiBOb3RlOiBpZiB0aGUgdmFsdWUgd2UncmUgZ2V0dGluZyBzZXQgdG8gZG9lcyBub3QgaGF2ZSBhIGhhbmRsZXIgaW4KLQkJICogdGhlIHJlZ2lzdHJ5LCB3ZSdsbCBhY3R1YWxseSBub3Qgc2V0IGl0IHRvIG51bGwgb3IgYW55dGhpbmcsIHdlJ2xsCi0JCSAqIGp1c3QgY29udGludWUgb24gd2l0aCB0aGUgb25lIHdlIGhhdmUuIFRoaXMgaXMgcHJldHR5IGltcG9ydGFudCB0bwotCQkgKiBhdm9pZCByZS1pbml0aWFsaXppbmcgb24gZXZlcnkga2V5IHN0cm9rZSBpZiBzb21lb25lIGlzIHR5cGluZyBpbiBhCi0JCSAqIG5ldyBjb250ZW50IHR5cGUsIGJ1dCBoYXZlbid0IHlldCBmaW5pc2hlZCB0aGUgd2hvbGUgIndvcmQiLgotCQkgKiBIb3dldmVyLCBpZiBhbiBjb250ZW50VHlwZSBpcyBub3QgcmVjb2duaXplZCwgdGhlIHJlZ2lzdHJ5IHJldHVybnMKLQkJICogdGhlIG9uZSBmb3IgWE1MLgotCQkgKi8KLQkJCi0JCS8qIHNldCB0aGUgYWN0dWFsIHZhbHVlIGZpcnN0LCB0aGUgcmVzdCBpcyAic2lkZSBlZmZlY3QiICovCi0JCXRoaXMuY2FjaGVkQ29udGVudFR5cGUgPSBuZXdDb250ZW50VHlwZTsKLQotCQkvKiBzZWUgaWYgd2UgbmVlZCB0byB1cGRhdGUgZW1iZWRkZWQgaGFuZGxlciAqLwotCi0JCS8qCi0JCSAqIElmIHRoZSBkb2N1bWVudCBpcyBhIHR5cGUgb2YgWEhUTUwsIHdlIGRvIG5vdCB1c2UgdGhlIHBhZ2UKLQkJICogZGlyZWN0aXZlJ3MgY29udGVudFR5cGUgdG8gZGV0ZXJtaW5lIHRoZSBlbWJlZGRlZCB0eXBlIC4uLiBpdHMKLQkJICogWEhUTUwhIC4uLiBhbmQsIGV2ZW50dWFsbHksIHRoZSBET0NUWVBFIGFkYXB0ZXIgc2hvdWxkIGRldGVybWluZQotCQkgKiBpZi93aGVuIGl0IG5lZWRzIHRvIGNoYW5nZS4KLQkJICovCi0KLQkJLyoganVzdCBzYWZldHkgY2hlY2ssIGNhbiBiZSByZW1vdmVkIGxhdGVyLCBlYXJseSBpbiByZWxlYXNlIGN5Y2xlICovCi0JCWlmIChtb2RlbCA9PSBudWxsKSB7Ci0JCQkvLyB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm1vZGVsIHNob3VsZCBuZXZlciBiZSBudWxsIGluCi0JCQkvLyBQYWdlRGlyZWN0aXZlIEFkYXB0ZXIiKTsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAibW9kZWwgc2hvdWxkIG5ldmVyIGJlIG51bGwgaW4gUGFnZURpcmVjdGl2ZSBBZGFwdGVyIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIHBvdGVudGlhbE5ld2FuZGxlciA9IG51bGw7Ci0JCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gZ2V0Q29udGVudERlc2NyaXB0aW9uKG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJT2JqZWN0IHByb3AgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5DT05URU5UX0ZBTUlMWV9BVFRSSUJVVEUpOwotCQlpZiAocHJvcCAhPSBudWxsKSB7Ci0JCQlpZiAoQ29udGVudFR5cGVGYW1pbHlGb3JIVE1MLkhUTUxfRkFNSUxZLmVxdWFscyhwcm9wKSkgewotCQkJCXBvdGVudGlhbE5ld2FuZGxlciA9IEVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpLmdldFR5cGVGb3IoInRleHQvaHRtbCIpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHBvdGVudGlhbE5ld2FuZGxlciA9PSBudWxsKSB7Ci0JCQkvKgotCQkJICogZ2V0SGFuZGxlciBzaG91bGQgYWx3YXlzIHJldHVybiBzb21ldGhpbmcgKG5ldmVyIG51bGwpLCBiYXNlZAotCQkJICogb24gdGhlIHJ1bGVzIGluIHRoZSBmYWN0b3J5LgotCQkJICovCi0JCQlwb3RlbnRpYWxOZXdhbmRsZXIgPSBnZXRIYW5kbGVyRm9yKHRoaXMuY2FjaGVkQ29udGVudFR5cGUpOwotCQl9Ci0JCS8qCi0JCSAqIHdlIGRvIHRoaXMgY2hlY2sgZm9yIHJlLWluaXQgaGVyZSwgaW5zdGVhZCBvZiBpbiBzZXRFbWJlZGRlZFR5cGUsCi0JCSAqIHNpbmNlIHNldEVtYmVkZGVkVHlwZSBpcyBjYWxsZWQgZHVyaW5nIHRoZSBub3JtYWwgaW5pdGlhbGl6dGlvbgotCQkgKiBwcm9jZXNzLCB3aGVuIHJlLWluaXQgaXMgbm90IG5lZWRlZCAoc2luY2UgdGhlcmUgaXMgbm8gY29udGVudCkKLQkJICovCi0JCWlmIChlbWJlZGRlZFR5cGVIYW5kbGVyID09IG51bGwpIHsKLQkJCXNldEVtYmVkZGVkVHlwZShwb3RlbnRpYWxOZXdhbmRsZXIpOwotCQl9Ci0JCWVsc2UgaWYgKHBvdGVudGlhbE5ld2FuZGxlciAhPSBudWxsICYmIGVtYmVkZGVkVHlwZUhhbmRsZXIgIT0gcG90ZW50aWFsTmV3YW5kbGVyKSB7Ci0JCQkvKgotCQkJICogY2hhbmdpbmcgdGhpcyBlbWJlZGRlZCBoYW5kbGVyIGhlcmUgbWF5IGJlIGluIHRoZSBtaWRkbGUgb2YgYQotCQkJICogbm90aWZ5IGxvb3AuIFRoYXQncyB3aHkgd2Ugc2V0IHRoYXQgIml0J3MgbmVlZGVkIi4gVGhlbiB0aGUKLQkJCSAqIG1vZGVsIGRlY2lkZXMgd2hlbiBpdHMgInNhZmUiIHRvIGFjdHVhbGx5IGRvIHRoZSByZS1pbml0LgotCQkJICogCi0JCQkgKiBiZSBzdXJlIHRvIGhvbGQgb2xkSGFuZGxlciBpbiB0ZW1wIHZhciBvciBlbHNlIHNldEVtYmVkZGVkVHlwZQotCQkJICogd2lsbCAicmVzZXQiIGl0IGJlZm9yZSBtb2RlbFJlaW5pdE5lZWRlZChvbGRIYW5kbGVyLCBoYW5kbGVyKQotCQkJICogaXMgY2FsbGVkCi0JCQkgKiAKLQkJCSAqLwotCQkJRW1iZWRkZWRUeXBlSGFuZGxlciBvbGRIYW5kbGVyID0gZW1iZWRkZWRUeXBlSGFuZGxlcjsKLQkJCXNldEVtYmVkZGVkVHlwZShwb3RlbnRpYWxOZXdhbmRsZXIpOwotCQkJbW9kZWxSZWluaXROZWVkZWQob2xkSGFuZGxlciwgcG90ZW50aWFsTmV3YW5kbGVyKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byByZS1pbml0IGJhc2VkIG9uIGVtYmVkZGVkVHlwZUhhbmRsZXIgY2hhbmdpbmcuCi0JICogSXQgaXMgZ2l2ZW4gcHJpb3JpdHkgb3ZlciB0aGUgbGFuZ3VhZ2UgY2hhbmdlLCBzaW5jZSB0aGVyZSBpdHMgbW9yZQotCSAqIGltcG9ydGFudCB0byBoYXZlIG9sZCBhbmQgbmV3IGhhbmRsZXJzJ3MgaW4gdGhlIHN0YXRlRGF0YSBmaWVsZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbW9kZWxSZWluaXROZWVkZWQoRW1iZWRkZWRUeXBlSGFuZGxlciBvbGRIYW5kbGVyLCBFbWJlZGRlZFR5cGVIYW5kbGVyIG5ld0hhbmRsZXIpIHsKLQkJaWYgKG1vZGVsLmlzUmVpbml0aWFsaXphdGlvbk5lZWRlZCgpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImFscmVhZHkgYmVpbmcgaW5pdGlhbGl6ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdHJ5IHsKLQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJbW9kZWwuc2V0UmVpbml0aWFsaXplU3RhdGVEYXRhKG5ldyBFbWJlZGRlZFR5cGVTdGF0ZURhdGEob2xkSGFuZGxlciwgbmV3SGFuZGxlcikpOwotCQkJbW9kZWwuc2V0UmVpbml0aWFsaXplTmVlZGVkKHRydWUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgbW9kZWxSZWluaXROZWVkZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1vZGVsUmVpbml0TmVlZGVkKFN0cmluZyBvbGRsYW5ndWFnZSwgU3RyaW5nIG5ld0xhbmd1YWdlKSB7Ci0JCS8vIGJpdCBvZiBhIHNob3J0IGN1dCBmb3Igbm93IC4uLi4gd2UgZG9udCcgbmVlZCBsYW5ndWFnZSBhdCB0aGUKLQkJLy8gbW9tZW50LAotCQkvLyBidXQgc2hvdWxkIHNldCB0aGUgc3RhdGUgZGF0YQotCQlpZiAobW9kZWwuaXNSZWluaXRpYWxpemF0aW9uTmVlZGVkKCkpIHsKLQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFscmVhZHkgYmVpbmcgaW5pdGlhbGl6ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdHJ5IHsKLQkJCQkvLyBpZiBhbHJlYWR5IGJlaW5nIHJlLWluaXRpYWxpemVkLCB3ZSBkb24ndCB3YW50IHRvCi0JCQkJLy8gcmVzZXQgdGhlIGRhdGEgaW4gdGhlIHN0YXRlRGF0YSBmaWVsZC4KLQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJCQltb2RlbC5zZXRSZWluaXRpYWxpemVTdGF0ZURhdGEobmV3TGFuZ3VhZ2UpOwotCQkJCW1vZGVsLnNldFJlaW5pdGlhbGl6ZU5lZWRlZCh0cnVlKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2FjaGVkTGFuZ3VhZ2UoU3RyaW5nIG5ld0xhbmd1YWdlKSB7Ci0JCWlmIChjYWNoZWRMYW5ndWFnZSAhPSBudWxsICYmIGxhbmd1YWdlU3RhdGVDaGFuZ2VkKGNhY2hlZExhbmd1YWdlLCBuZXdMYW5ndWFnZSkpIHsKLQkJCS8qCi0JCQkgKiBhIGNvbXBsZXRlIHJlLWluaXQgb3ZlcmtpbGwgaW4gY3VycmVudCBzeXN0ZW0sIHNpbmNlIHJlYWxseQotCQkJICoganVzdCBuZWVkIGZvciB0aGUgbGluZSBzdHlsZSBwcm92aWRlcnMsIEJVVCwgYSBjaGFuZ2UgaW4KLQkJCSAqIGxhbmd1YWdlIGNvdWxkIGVmZmVjdCBvdGhlciB0aGluZ3MsIGFuZCB3ZSBkb24ndCBleHBlY3QgdG8KLQkJCSAqIGhhcHBlbiBvZnRlbiBzbyBhIGxpdHRsZSBvdmVya2lsbCBpc24ndCB0b28gYmFkLiBUaGUgZGVlcAotCQkJICogcHJvYmxlbSBpcyB0aGF0IHRoZXJlIGlzIG5vIHdheSB0byBnZXQgYXQgdGhlICJlZGl0IHNpZGUiCi0JCQkgKiBhZHBhcHRlcnMgc3BlY2lmaWNhbGx5IGhlcmUgaW4gbW9kZWwgY2xhc3MuIHdlIGhhdmUgdG8gZG8gdGhlCi0JCQkgKiBtb2RlbCBjaGFuZ2VkIHNlcXVlbmNlIHRvIGdldCB0aGUgc2NyZWVuIHRvIHVwZGF0ZS4gZG8gbm90Ci0JCQkgKiBzaWduYWwgYWdhaW4sIGlmIHNpZ25hbGVkIG9uY2UgKHRoZSByZWluaXQgc3RhdGUgZGF0YSB3aWxsIGJlCi0JCQkgKiB3cm9uZy4gKHRoaXMgbmVlZHMgdG8gYmUgaW1wcm92ZWQgaW4gZnV0dXJlKQotCQkJICovCi0JCQlpZiAoIW1vZGVsLmlzUmVpbml0aWFsaXphdGlvbk5lZWRlZCgpKSB7Ci0JCQkJbW9kZWxSZWluaXROZWVkZWQoY2FjaGVkTGFuZ3VhZ2UsIG5ld0xhbmd1YWdlKTsKLQkJCX0KLQkJfQotCQlzZXRMYW5ndWFnZShuZXdMYW5ndWFnZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBwdWJsaWMgYWNjZXNzIG1ldGhvZCwgdXNlZCBlc3BlY2lhbGx5IGZyb20gbG9hZGVyLCBmb3IgSlNQCi0JICogRnJhZ21lbnQgc3VwcG9ydC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYW5ndWFnZShTdHJpbmcgbmV3TGFuZ3VhZ2UpIHsKLQkJdGhpcy5jYWNoZWRMYW5ndWFnZSA9IG5ld0xhbmd1YWdlOwotCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9ICgoSURvY3VtZW50RXh0ZW5zaW9uMykgbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpLmdldERvY3VtZW50UGFydGl0aW9uZXIoSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORyk7Ci0JCWlmIChwYXJ0aXRpb25lciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1ApIHsKLQkJCSgoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCkgcGFydGl0aW9uZXIpLnNldExhbmd1YWdlKG5ld0xhbmd1YWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBsYW5ndWFnZVN0YXRlQ2hhbmdlLgotCSAqIAotCSAqIEBwYXJhbSBjYWNoZWRMYW5ndWFnZQotCSAqIEBwYXJhbSBuZXdMYW5ndWFnZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBsYW5ndWFnZVN0YXRlQ2hhbmdlZChTdHJpbmcgY2FjaGVkTGFuZ3VhZ2UsIFN0cmluZyBuZXdMYW5ndWFnZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOyAvLyBsYW5ndWFnZXMgYXJlIGVxdWFsLCB0aGVuIG5vIGNoYW5nZSBpbgotCQkvLyBzdGF0ZQotCQlpZiAoIWNhY2hlZExhbmd1YWdlLmVxdWFsc0lnbm9yZUNhc2UobmV3TGFuZ3VhZ2UpKSB7Ci0JCQlib29sZWFuIG9sZExhbmd1YWdlS25vd24gPSBsYW5ndWFnZUtub3duKGNhY2hlZExhbmd1YWdlKTsKLQkJCWJvb2xlYW4gbmV3TGFuZ3VhZ2VLbm93biA9IGxhbmd1YWdlS25vd24obmV3TGFuZ3VhZ2UpOwotCQkJcmVzdWx0ID0gbmV3TGFuZ3VhZ2VLbm93biB8fCAoIW5ld0xhbmd1YWdlS25vd24gJiYgb2xkTGFuZ3VhZ2VLbm93bik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgbGFuZ3VhZ2VLbm93bi4KLQkgKiAKLQkgKiBAcGFyYW0gY2FjaGVkTGFuZ3VhZ2UKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbGFuZ3VhZ2VLbm93bihTdHJpbmcgbGFuZ3VhZ2UpIHsKLQkJcmV0dXJuIChTdHJpbmdVdGlscy5jb250YWlucyhKQVZBX0xBTkdVQUdFX0tFWVMsIGxhbmd1YWdlLCBmYWxzZSkgfHwgU3RyaW5nVXRpbHMuY29udGFpbnMoSkFWQVNDUklQVF9MQU5HVUFHRV9LRVlTLCBsYW5ndWFnZSwgZmFsc2UpKTsKLQl9Ci0KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlTdHJpbmcgbG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChsb2NhdGlvbik7Ci0JCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRIYW5kbGVyRm9yKFN0cmluZyBjb250ZW50VHlwZSkgewotCQlFbWJlZGRlZFR5cGVSZWdpc3RyeSByZWcgPSBnZXRFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkoKTsKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJaWYgKHJlZyAhPSBudWxsKQotCQkJaGFuZGxlciA9IHJlZy5nZXRUeXBlRm9yKGNvbnRlbnRUeXBlKTsKLQkJcmV0dXJuIGhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5LgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeQotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRUeXBlUmVnaXN0cnkgZ2V0RW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogRm9yIEpTUCBmaWxlcywgdGV4dC9odG1sIGlzIHRoZSBkZWZhdWx0IGNvbnRlbnQgdHlwZS4gVGhpcyBtYXkgd2FudAotCSAqIHRoaXMgZGlmZmVyZW50IGZvciB0eXBlcyBsaWtlIGpzdiAoanNwIGZvciB2b2ljZSB4bWwpIEZvciBub3csIGhhcmQKLQkgKiBjb2RlIHRvIG5ldyBpbnN0YW5jZS4gSW4gZnV0dXJlLCBzaG91bGQgZ2V0IGluc3RhbmNlIGZyb20gcmVnaXN0cnkuCi0JICogCi0JICogU3BlY2lmaWNhdGlvbiBjaXRlcyBIVE1MIGFzIHRoZSBkZWZhdWx0IGNvbnRlbnRUeXBlLgotCSAqLwotCXByb3RlY3RlZCBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldERlZmF1bHRFbWJlZGRlZFR5cGUoKSB7Ci0JCXJldHVybiBnZXRIYW5kbGVyRm9yKGdldERlZmF1bHRDb250ZW50VHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgSU5vZGVOb3RpZmllciBnZXRUYXJnZXQoKSB7Ci0JCXJldHVybiBub3RpZmllckF0Q3JlYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYgKGVtYmVkZGVkVHlwZUhhbmRsZXIgIT0gbnVsbCkgewotCQkJaWYgKGVtYmVkZGVkRmFjdG9yeVJlZ2lzdHJ5ICE9IG51bGwpIHsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGVtYmVkZGVkRmFjdG9yeVJlZ2lzdHJ5Lml0ZXJhdG9yKCk7Ci0JCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCWZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlmYWN0b3J5LnJlbGVhc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBwYV9UT0RPOiBwb3NzaWJseSBuZWVkIHRvIHJlbGVhc2UgaGVyZS4uLgotCQkJLy8gb3IgInVuaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeSIKLQkJCS8vIGluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkgd2FzIGNhbGxlZCBmcm9tIEpTUE1vZGVsTG9hZGVyCi0JCQllbWJlZGRlZFR5cGVIYW5kbGVyID0gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgSUNvbnRlbnREZXNjcmlwdGlvbiBnZXRDb250ZW50RGVzY3JpcHRpb24oSURvY3VtZW50IGRvYykgewotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRG9jdW1lbnRSZWFkZXIgaW4gPSBuZXcgRG9jdW1lbnRSZWFkZXIoZG9jKTsKLQkJcmV0dXJuIGdldENvbnRlbnREZXNjcmlwdGlvbihpbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb250ZW50IGRlc2NyaXB0aW9uIGZvciBhbiBpbnB1dCBzdHJlYW0gQXNzdW1lcyBpdCdzIEpTUAotCSAqIGNvbnRlbnQuIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtIHdoZW4gZmluaXNoZWQuCi0JICogCi0JICogQHBhcmFtIGluCi0JICogQHJldHVybiB0aGUgSUNvbnRlbnREZXNjcmlwdGlvbiBmb3IgaW4sIG9yIG51bGwgaWYgaW4gaXMgbnVsbAotCSAqLwotCXByaXZhdGUgSUNvbnRlbnREZXNjcmlwdGlvbiBnZXRDb250ZW50RGVzY3JpcHRpb24oUmVhZGVyIGluKSB7Ci0KLQkJaWYgKGluID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJQ29udGVudERlc2NyaXB0aW9uIGRlc2MgPSBudWxsOwotCQl0cnkgewotCi0JCQlJQ29udGVudFR5cGUgY29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJCWRlc2MgPSBjb250ZW50VHlwZUpTUC5nZXREZXNjcmlwdGlvbkZvcihpbiwgSUNvbnRlbnREZXNjcmlwdGlvbi5BTEwpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpbi5jbG9zZSgpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZXNjOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVXYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVXYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NDNhOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlV2F0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci0KLWludGVyZmFjZSBQYWdlRGlyZWN0aXZlV2F0Y2hlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQlTdHJpbmcgZ2V0Q29udGVudFR5cGUoKTsKLQotCVN0cmluZyBnZXRMYW5ndWFnZSgpOwotCi0JaW50IGdldE9mZnNldCgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZiYjA3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZS5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeSBleHRlbmRzIFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsIGltcGxlbWVudHMgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5LgotCSAqLwotCXB1YmxpYyBQYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3RvcnkoKSB7Ci0JCXRoaXMoUGFnZURpcmVjdGl2ZVdhdGNoZXIuY2xhc3MsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBQYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJLZXkKLQkgKiBAcGFyYW0gcmVnaXN0ZXJBZGFwdGVycwotCSAqLwotCXB1YmxpYyBQYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3RvcnkoT2JqZWN0IGFkYXB0ZXJLZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJUGFnZURpcmVjdGl2ZVdhdGNoZXIgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElET01FbGVtZW50KSB7Ci0JCQlJRE9NRWxlbWVudCB4bWxFbGVtZW50ID0gKElET01FbGVtZW50KSB0YXJnZXQ7Ci0JCQlpZiAoeG1sRWxlbWVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJU3RyaW5nIG5vZGVOYW1lID0geG1sRWxlbWVudC5nZXROb2RlTmFtZSgpOwotCQkJCWlmIChub2RlTmFtZS5lcXVhbHMoImpzcDpkaXJlY3RpdmUucGFnZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmVzdWx0ID0gbmV3IFBhZ2VEaXJlY3RpdmVXYXRjaGVySW1wbCh4bWxFbGVtZW50KTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi1wdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gbmV3IFBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeShnZXRBZGFwdGVyS2V5KCksIGlzU2hvdWxkUmVnaXN0ZXJBZGFwdGVyKCkpOwotCX19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVXYXRjaGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlV2F0Y2hlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA1ODc4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVXYXRjaGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQXR0ckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi0KLQotLyoqIAotICogVGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoaXMgY2xhc3MgaXMgdG8gbW9uaXRvciBwYWdlIGRpcmVjdGl2ZXMgYW5kIGlmIAotICogYSBjaGFuZ2UgaW4gZW1iZWRkZWQgdHlwZSBpcyBpcyBtYWRlLCBpdCB3aWxsIHNpZ25hbCAKLSAqIHRoZSBzdHJ1Y3R1cmVkTW9kZWwgdGhhdCBpdCBuZWVkcyB0byByZWluaXRpYWxpemUgaXRzZWxmLgotICovCi1jbGFzcyBQYWdlRGlyZWN0aXZlV2F0Y2hlckltcGwgaW1wbGVtZW50cyBQYWdlRGlyZWN0aXZlV2F0Y2hlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgYWRhcHRlclR5cGUgPSBQYWdlRGlyZWN0aXZlV2F0Y2hlci5jbGFzczsKLQlJRE9NRWxlbWVudCB0YXJnZXRFbGVtZW50OwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFBhZ2VEaXJlY3RpdmVXYXRjaGVySW1wbC4KLQkgKi8KLQlwdWJsaWMgUGFnZURpcmVjdGl2ZVdhdGNoZXJJbXBsKElET01FbGVtZW50IHRhcmdldCkgewotCQlzdXBlcigpOwotCQl0YXJnZXRFbGVtZW50ID0gdGFyZ2V0OwotCQlTdHJpbmcgY29udGVudFR5cGVWYWx1ZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoImNvbnRlbnRUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNvbnRlbnRUeXBlVmFsdWUgIT0gbnVsbCkgewotCQkJLy8gdXNpbmcgY29uY3JldGUgY2xhc3MgYmVsb3csIHNpbmNlICJjaGFuZ2VkIiBpcyBzb21ldGhpbmcgb2YgYW4gaW50ZXJuYWwgbWV0aG9kCi0JCQlQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwgcGFnZURpcmVjdGl2ZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsKSAoKElET01Eb2N1bWVudCkgdGFyZ2V0RWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2hhbmdlZENvbnRlbnRUeXBlKCgoSW5kZXhlZFJlZ2lvbikgdGFyZ2V0RWxlbWVudCkuZ2V0U3RhcnRPZmZzZXQoKSwgY29udGVudFR5cGVWYWx1ZSk7Ci0JCX0KLQkJU3RyaW5nIGxhbmd1YWdlVmFsdWUgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCJsYW5ndWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChsYW5ndWFnZVZhbHVlICE9IG51bGwpIHsKLQkJCS8vIHVzaW5nIGNvbmNyZXRlIGNsYXNzIGJlbG93LCBzaW5jZSAiY2hhbmdlZCIgaXMgc29tZXRoaW5nIG9mIGFuIGludGVybmFsIG1ldGhvZAotCQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbCkgKChJRE9NRG9jdW1lbnQpIHRhcmdldEVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNoYW5nZWRMYW5ndWFnZSgoKEluZGV4ZWRSZWdpb24pIHRhcmdldEVsZW1lbnQpLmdldFN0YXJ0T2Zmc2V0KCksIGxhbmd1YWdlVmFsdWUpOwotCQl9Ci0KLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IGFkYXB0ZXJUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJLy8gd2Ugc2hvdWxkIG9ubHkgYmUgYWRkZWQgdG8gcGFnZSBkaXJlY3RpdmVzLCBzbyBpZiB3ZSBzZWUgYSBwYWdlIGRpcmVjdGl2ZQotCQkvLyBjaGFuZ2UsIHdlIG5lZWQgdG8gY2hlY2sgaXRzIGF0dHJpYnV0ZXMsIGFuZCBub3RpZnkgdGhlIFBhZ2VEaXJlY3RpdmVBZGFwdGVyIHdoZW4gCi0JCS8vIGNlcnRhaW4gb25lcyBjaGFuZSwgc28gaXQgY2FuIG1ha2UgaXRzICJjZW50cmFsaXplZCIgZGVjaXNpb25zLgotCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCi0JCQlzd2l0Y2ggKGV2ZW50VHlwZSkgewotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5DSEFOR0UgOgotCQkJCQlpZiAoY2hhbmdlZEZlYXR1cmUgaW5zdGFuY2VvZiBBdHRySW1wbCkgewotCQkJCQkJQXR0ckltcGwgYXR0cmlidXRlID0gKEF0dHJJbXBsKSBjaGFuZ2VkRmVhdHVyZTsKLQkJCQkJCVN0cmluZyBuYW1lID0gYXR0cmlidXRlLmdldE5hbWUoKTsKLQkJCQkJCWlmIChuYW1lLmVxdWFscygiY29udGVudFR5cGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJLy8gdXNpbmcgY29uY3JldGUgY2xhc3MgYmVsb3csIHNpbmNlICJjaGFuZ2VkIiBpcyBzb21ldGhpbmcgb2YgYW4gaW50ZXJuYWwgbWV0aG9kCi0JCQkJCQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbCkgKChJRE9NRG9jdW1lbnQpIHRhcmdldEVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJCQkJCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5jaGFuZ2VkQ29udGVudFR5cGUoKChJbmRleGVkUmVnaW9uKSB0YXJnZXRFbGVtZW50KS5nZXRTdGFydE9mZnNldCgpLCAoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobmFtZS5lcXVhbHMoImxhbmd1YWdlIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJLy8gdXNpbmcgY29uY3JldGUgY2xhc3MgYmVsb3csIHNpbmNlICJjaGFuZ2VkIiBpcyBzb21ldGhpbmcgb2YgYW4gaW50ZXJuYWwgbWV0aG9kCi0JCQkJCQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbCkgKChJRE9NRG9jdW1lbnQpIHRhcmdldEVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJCQkJCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5jaGFuZ2VkTGFuZ3VhZ2UoKChJbmRleGVkUmVnaW9uKSB0YXJnZXRFbGVtZW50KS5nZXRTdGFydE9mZnNldCgpLCAoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlicmVhazsKLQkJCQljYXNlIElOb2RlTm90aWZpZXIuUkVNT1ZFIDoKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInJlbW92ZWQiK25ldyBEYXRlKCkudG9TdHJpbmcoKSk7Ci0JCQkJCWJyZWFrOwotCi0KLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCVN0cmluZyBjb250ZW50VHlwZVZhbHVlID0gdGFyZ2V0RWxlbWVudC5nZXRBdHRyaWJ1dGUoImNvbnRlbnRUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNvbnRlbnRUeXBlVmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHsKLQkJU3RyaW5nIGxhbmd1YWdlVmFsdWUgPSB0YXJnZXRFbGVtZW50LmdldEF0dHJpYnV0ZSgibGFuZ3VhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbGFuZ3VhZ2VWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIHRhcmdldEVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvQXR0ckltcGxGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvQXR0ckltcGxGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYzMGM1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0F0dHJJbXBsRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9tZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQXR0ckltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBdHRySW1wbEZvckpTUCBleHRlbmRzIEF0dHJJbXBsIHsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkTGFuZ3VhZ2VPcGVuaW5nKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU47Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHNldE93bmVyRG9jdW1lbnQoRG9jdW1lbnQgb3duZXJEb2N1bWVudCkgewotCQlzdXBlci5zZXRPd25lckRvY3VtZW50KG93bmVyRG9jdW1lbnQpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyLnNldE5hbWUobmFtZSk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCXN1cGVyLnNldE5hbWVzcGFjZVVSSShuYW1lc3BhY2VVUkkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9Db21tZW50SW1wbEZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9Db21tZW50SW1wbEZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWNjYzU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvQ29tbWVudEltcGxGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb21kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Db21tZW50SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIENvbW1lbnRJbXBsRm9ySlNQCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tZW50SW1wbEZvckpTUCBleHRlbmRzIENvbW1lbnRJbXBsIHsKLQlwcm90ZWN0ZWQgQ29tbWVudEltcGxGb3JKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1lbnRJbXBsRm9ySlNQKENvbW1lbnRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDb21tZW50Q2xvc2UoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX0NMT1NFOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ29tbWVudE9wZW5DbG9zZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfT1BFTiB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX0NMT1NFOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE93bmVyRG9jdW1lbnQoRG9jdW1lbnQgb3duZXJEb2N1bWVudCkgewotCQlzdXBlci5zZXRPd25lckRvY3VtZW50KG93bmVyRG9jdW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNvbW1lbnRJbXBsIGNsb25lZCA9IG5ldyBDb21tZW50SW1wbEZvckpTUCh0aGlzKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0RPTURvY3VtZW50Rm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0RPTURvY3VtZW50Rm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYThiYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9ET01Eb2N1bWVudEZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb21kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRTdHlsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBET01Eb2N1bWVudEZvckpTUCBleHRlbmRzIERvY3VtZW50U3R5bGVJbXBsIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBET01Eb2N1bWVudEZvckpTUCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGhhdAotCSAqLwotCXByb3RlY3RlZCBET01Eb2N1bWVudEZvckpTUChEb2N1bWVudEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCURPTURvY3VtZW50Rm9ySlNQIGNsb25lZCA9IG5ldyBET01Eb2N1bWVudEZvckpTUCh0aGlzKTsKLQkJaWYgKGRlZXApCi0JCQljbG9uZWQuaW1wb3J0Q2hpbGROb2Rlcyh0aGlzLCB0cnVlKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0JLyoqCi0JICogY3JlYXRlRWxlbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQljaGVja1RhZ05hbWVWYWxpZGl0eSh0YWdOYW1lKTsKLQotCQlFbGVtZW50SW1wbEZvckpTUCBlbGVtZW50ID0gbmV3IEVsZW1lbnRJbXBsRm9ySlNQKCk7Ci0JCWVsZW1lbnQuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJZWxlbWVudC5zZXRUYWdOYW1lKHRhZ05hbWUpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JLyoqCi0JICogY3JlYXRlQ29tbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkNvbW1lbnQKLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDb21tZW50IGNyZWF0ZUNvbW1lbnQoU3RyaW5nIGRhdGEpIHsKLQkJQ29tbWVudEltcGxGb3JKU1AgY29tbWVudCA9IG5ldyBDb21tZW50SW1wbEZvckpTUCgpOwotCQljb21tZW50LnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWlmIChkYXRhICE9IG51bGwpCi0JCQljb21tZW50LnNldERhdGEoZGF0YSk7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUF0dHJpYnV0ZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBBdHRyIGNyZWF0ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCUF0dHJJbXBsRm9ySlNQIGF0dHIgPSBuZXcgQXR0ckltcGxGb3JKU1AoKTsKLQkJYXR0ci5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlhdHRyLnNldE5hbWUobmFtZSk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBBdHRyIGNyZWF0ZUF0dHJpYnV0ZU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJQXR0ckltcGxGb3JKU1AgYXR0ciA9IG5ldyBBdHRySW1wbEZvckpTUCgpOwotCQlhdHRyLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWF0dHIuc2V0TmFtZShuYW1lKTsKLQkJYXR0ci5zZXROYW1lc3BhY2VVUkkodXJpKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCS8qKgotCSAqIGNyZWF0ZVRleHROb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uVGV4dAotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFRleHQgY3JlYXRlVGV4dE5vZGUoU3RyaW5nIGRhdGEpIHsKLQkJVGV4dEltcGxGb3JKU1AgdGV4dCA9IG5ldyBUZXh0SW1wbEZvckpTUCgpOwotCQl0ZXh0LnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCXRleHQuc2V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHNldE1vZGVsKElET01Nb2RlbCBtb2RlbCkgewotCQlzdXBlci5zZXRNb2RlbChtb2RlbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9ET01Nb2RlbEZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9ET01Nb2RlbEZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2M4Y2UyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvRE9NTW9kZWxGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb21kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRE9NU3R5bGVNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LlhNTE1vZGVsUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5YTUxNb2RlbFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBET01Nb2RlbEZvckpTUCBleHRlbmRzIERPTVN0eWxlTW9kZWxJbXBsIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBET01Nb2RlbEZvckpTUCgpIHsKLQkJc3VwZXIoKTsKLQkJLy8gcmVtZW1iZXIsIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkIGluIHN1cGVyIGNvbnN0cnVjdG9yLCAKLQkJLy8gdmlhIGludGVybmFsQ3JlYXRlRG9jdW1lbnQKLQl9Ci0JLyoqCi0JICogY3JlYXRlRG9jdW1lbnQgbWV0aG9kCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudCBpbnRlcm5hbENyZWF0ZURvY3VtZW50KCkgewotCQlET01Eb2N1bWVudEZvckpTUCBkb2N1bWVudCA9IG5ldyBET01Eb2N1bWVudEZvckpTUCgpOwotCQlkb2N1bWVudC5zZXRNb2RlbCh0aGlzKTsKLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQlwcm90ZWN0ZWQgWE1MTW9kZWxQYXJzZXIgY3JlYXRlTW9kZWxQYXJzZXIoKSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkRE9NTW9kZWxQYXJzZXIodGhpcyk7Ci0JfQotCXByb3RlY3RlZCBYTUxNb2RlbFVwZGF0ZXIgY3JlYXRlTW9kZWxVcGRhdGVyKCkgewotCQlyZXR1cm4gbmV3IE5lc3RET01Nb2RlbFVwZGF0ZXIodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9FbGVtZW50SW1wbEZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9FbGVtZW50SW1wbEZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTY5MTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvRWxlbWVudEltcGxGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb21kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRWxlbWVudFN0eWxlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEVsZW1lbnRJbXBsRm9ySlNQIGV4dGVuZHMgRWxlbWVudFN0eWxlSW1wbCB7Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEVsZW1lbnRJbXBsRm9ySlNQKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aGF0Ci0JICovCi0JcHVibGljIEVsZW1lbnRJbXBsRm9ySlNQKEVsZW1lbnRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRFbmRUYWcoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ2xvc2VkKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9DTE9TRSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDbG9zZWRDb21tZW50KFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9DTE9TRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nsb3NlZE5lc3RlZERpcmVjdGl2ZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9DTE9TRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQpIHsKLQkJc3VwZXIuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWdOYW1lKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXN1cGVyLnNldFRhZ05hbWUodGFnTmFtZSk7Ci0JfQotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJRWxlbWVudEltcGwgY2xvbmVkID0gbmV3IEVsZW1lbnRJbXBsRm9ySlNQKHRoaXMpOwotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvTmVzdERPTU1vZGVsVXBkYXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9OZXN0RE9NTW9kZWxVcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzN2Q3NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9OZXN0RE9NTW9kZWxVcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9tZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRE9NTW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5YTUxNb2RlbFVwZGF0ZXI7Ci0KLQotcHVibGljIGNsYXNzIE5lc3RET01Nb2RlbFVwZGF0ZXIgZXh0ZW5kcyBYTUxNb2RlbFVwZGF0ZXIgewotCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICovCi0JcHVibGljIE5lc3RET01Nb2RlbFVwZGF0ZXIoRE9NTW9kZWxJbXBsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZFRhZ0Nsb3NlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX0NMT1NFOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9OZXN0ZWRET01Nb2RlbFBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9OZXN0ZWRET01Nb2RlbFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmFhNzE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvTmVzdGVkRE9NTW9kZWxQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb21kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRPTU1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSlNQVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5YTUxNb2RlbFBhcnNlcjsKLQotcHVibGljIGNsYXNzIE5lc3RlZERPTU1vZGVsUGFyc2VyIGV4dGVuZHMgWE1MTW9kZWxQYXJzZXIgewotCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICovCi0JcHVibGljIE5lc3RlZERPTU1vZGVsUGFyc2VyKERPTU1vZGVsSW1wbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDb21tZW50T3BlbihTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfT1BFTjsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENvbW1lbnRUZXh0KFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9URVhUOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ29udGVudChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQ7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRUYWcoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTiB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTiB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZFRhZ05hbWUoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZFRhZ09wZW4oU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTiB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTiB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTjsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlTmVzdGVkVGFnKFN0cmluZyByZWdpb25UeXBlLCBTdHJpbmcgdGFnTmFtZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgcmVzdWx0VGFnTmFtZSA9IHRhZ05hbWU7Ci0JCWlmIChyZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTikgewotCQkJcmVzdWx0VGFnTmFtZSA9IEpTUFRhZy5KU1BfU0NSSVBUTEVUOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTikgewotCQkJcmVzdWx0VGFnTmFtZSA9IEpTUFRhZy5KU1BfRVhQUkVTU0lPTjsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOKSB7Ci0JCQlyZXN1bHRUYWdOYW1lID0gSlNQVGFnLkpTUF9ERUNMQVJBVElPTjsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTikgewotCQkJcmVzdWx0VGFnTmFtZSA9IEpTUFRhZy5KU1BfRElSRUNUSVZFOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQlyZXN1bHRUYWdOYW1lICs9ICcuJzsKLQkJCXJlc3VsdFRhZ05hbWUgKz0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQocmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0VGFnTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZFRhZ0Nsb3NlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX0NMT1NFOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9UZXh0SW1wbEZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9UZXh0SW1wbEZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjY3ZjUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvVGV4dEltcGxGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb21kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5UZXh0SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIFRleHRJbXBsRm9ySlNQIGV4dGVuZHMgVGV4dEltcGwgewotCXByb3RlY3RlZCBib29sZWFuIGlzTm90TmVzdGVkQ29udGVudChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgIT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQ7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHNldE93bmVyRG9jdW1lbnQoRG9jdW1lbnQgb3duZXJEb2N1bWVudCkgewotCQlzdXBlci5zZXRPd25lckRvY3VtZW50KG93bmVyRG9jdW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JSlNQSGVhZENvbnRlbnREZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JSlNQSGVhZENvbnRlbnREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTFjNTQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSUpTUEhlYWRDb250ZW50RGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLQotcHVibGljIGludGVyZmFjZSBJSlNQSGVhZENvbnRlbnREZXRlY3RvciBleHRlbmRzIElEb2N1bWVudENoYXJzZXREZXRlY3RvciB7Ci0JU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JU3RyaW5nIGdldExhbmd1YWdlKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0pTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9KU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRjNWU3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0pTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5KU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcGFyc2VzIGJlZ2lubmluZyBwb3J0aW9uIG9mIEpTUCBmaWxlIHRvIGdldCBhdHRyaWJ1dGVzIGluIHBhZ2UKLSAqIGRpcmVjdGlpdmUKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvciBleHRlbmRzIEpTUFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElKU1BIZWFkQ29udGVudERldGVjdG9yIHsKLQotCXB1YmxpYyBKU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlzZXQobmV3IERvY3VtZW50UmVhZGVyKGRvY3VtZW50LCAwKSk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSlNQRG9jdW1lbnRMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSlNQRG9jdW1lbnRMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUxZDNjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0pTUERvY3VtZW50TG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50LlBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLkpTUFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuSlNQU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkFic3RyYWN0RG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZFJlYWRlckNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5CdWZmZXJlZExpbWl0ZWRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5KU1BDYXBhYmxlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5UYWdNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBKU1BEb2N1bWVudExvYWRlciBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnRMb2FkZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX01JTUVfVFlQRSA9ICJ0ZXh0L2h0bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNQRUNfREVGQVVMVF9FTkNPRElORyA9ICJJU08tODg1OS0xIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBJRmlsZSBnZXRGaWxlRm9yKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHBhdGggPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmxlbmd0aCgpID09IDApIHsKLQkJCU9iamVjdCBpZCA9IG1vZGVsLmdldElkKCk7Ci0JCQlpZiAoaWQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXBhdGggPSBpZC50b1N0cmluZygpOwotCQl9Ci0JCS8vIFRPRE8gbmVlZHMgcmV3b3JrIGZvciBsaW5rZWQgcmVzb3VyY2VzCi0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJRmlsZSBmaWxlID0gcm9vdC5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgocGF0aCkpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwcml2YXRlIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGZFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnk7Ci0KLQlwdWJsaWMgSlNQRG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmVzdGFibGVQcmVmaXgoSlNQU291cmNlUGFyc2VyIHBhcnNlciwgU3RyaW5nIHRhZ05hbWUpIHsKLQkJVGFnTWFya2VyIGJtID0gbmV3IFRhZ01hcmtlcih0YWdOYW1lKTsKLQkJcGFyc2VyLmFkZE5lc3RhYmxlUHJlZml4KGJtKTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgcHVibGljIElFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBjcmVhdGVDb2RlZERvY3VtZW50KGlGaWxlKTsKLQotCQkJRW1iZWRkZWRUeXBlSGFuZGxlciBlbWJlZGRlZFR5cGUgPSBnZXRFbWJlZGRlZFR5cGUoaUZpbGUpOwotCQkJaWYgKGVtYmVkZGVkVHlwZSAhPSBudWxsKQotCQkJCWVtYmVkZGVkVHlwZS5pbml0aWFsaXplUGFyc2VyKChKU1BDYXBhYmxlUGFyc2VyKSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCi0JCQlmRnVsbFByZXBhcmVkUmVhZGVyLnJlc2V0KCk7Ci0JCQlzZXREb2N1bWVudENvbnRlbnRzRnJvbVJlYWRlcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZGdWxsUHJlcGFyZWRSZWFkZXIpOwotCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoZkZ1bGxQcmVwYXJlZFJlYWRlciAhPSBudWxsKSB7Ci0JCQkJZkZ1bGxQcmVwYXJlZFJlYWRlci5jbG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZUNvZGVkRG9jdW1lbnQoSUZpbGUgaUZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCWdldENvZGVkUmVhZGVyQ3JlYXRvcigpLnNldChpRmlsZSk7Ci0KLQkJZkZ1bGxQcmVwYXJlZFJlYWRlciA9IGdldENvZGVkUmVhZGVyQ3JlYXRvcigpLmdldENvZGVkUmVhZGVyKCk7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBnZXRDb2RlZFJlYWRlckNyZWF0b3IoKS5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0RW5jb2RpbmdNZW1lbnRvKGdldENvZGVkUmVhZGVyQ3JlYXRvcigpLmdldEVuY29kaW5nTWVtZW50bygpKTsKLQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZiAoZmlsZW5hbWUgPT0gbnVsbCAmJiBpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4gbm90IGhhdmUgYm90aCBudWxsIGZpbGVuYW1lIGFuZCBpbnB1dHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSUVuY29kZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29kZWRSZWFkZXJDcmVhdG9yIGNvZGVkUmVhZGVyQ3JlYXRvciA9IG5ldyBDb2RlZFJlYWRlckNyZWF0b3IoKTsKLQkJdHJ5IHsKLQkJCWNvZGVkUmVhZGVyQ3JlYXRvci5zZXQoZmlsZW5hbWUsIGlucHV0U3RyZWFtKTsKLQkJCWZGdWxsUHJlcGFyZWRSZWFkZXIgPSBjb2RlZFJlYWRlckNyZWF0b3IuZ2V0Q29kZWRSZWFkZXIoKTsKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBjb2RlZFJlYWRlckNyZWF0b3IuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0RW5jb2RpbmdNZW1lbnRvKGZFbmNvZGluZ01lbWVudG8pOwotCQkJLy8gdGhlIGZhY3QgdGhhdCBmaWxlIGlzIG51bGwgbWVhbnMgdGhpcyBtZXRob2QvY29kZSBwYXRoIGlzIG5vCi0JCQkvLyBnb29kIGZvciBKU1AgZnJhZ21lbnRzCi0JCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkVHlwZSA9IGdldEVtYmVkZGVkVHlwZSgoSUZpbGUpIG51bGwpOwotCQkJZkZ1bGxQcmVwYXJlZFJlYWRlci5yZXNldCgpOwotCQkJaWYgKGVtYmVkZGVkVHlwZSAhPSBudWxsKQotCQkJCWVtYmVkZGVkVHlwZS5pbml0aWFsaXplUGFyc2VyKChKU1BDYXBhYmxlUGFyc2VyKSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHN0cnVjdHVyZWREb2N1bWVudCkuZ2V0UGFyc2VyKCkpOwotCQkJc2V0RG9jdW1lbnRDb250ZW50c0Zyb21SZWFkZXIoc3RydWN0dXJlZERvY3VtZW50LCBmRnVsbFByZXBhcmVkUmVhZGVyKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlIGluIHRoaXMgY29udGV4dAotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKGZGdWxsUHJlcGFyZWRSZWFkZXIgIT0gbnVsbCkgewotCQkJCWZGdWxsUHJlcGFyZWRSZWFkZXIuY2xvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCi0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyLgotCSAqIAotCSAqIEByZXR1cm4gSURvY3VtZW50UGFydGl0aW9uZXIKLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgZ2V0RGVmYXVsdERvY3VtZW50UGFydGl0aW9uZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCgpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXREZWZhdWx0TWltZVR5cGUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0TWltZVR5cGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX01JTUVfVFlQRTsKLQl9Ci0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlpZiAoZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9PSBudWxsKSB7Ci0JCQlmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID0gbmV3IEpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvcigpOwotCQl9Ci0JCXJldHVybiBmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkKLQkgKi8KLQlwcml2YXRlIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGdldEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSgpIHsKLQkJaWYgKGZFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJZkVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSA9IEVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBmRW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSB0aGUgTUlNRSBjb250ZW50IHR5cGUgc3BlY2lmaWVkIGluIGEgcGFnZSBkaXJlY3RpdmUuIFRoaXMKLQkgKiBzaG91bGQgYXBwZWFyICJhcyBlYXJseSBhcyBwb3NzaWJsZSBpbiB0aGUgSlNQIHBhZ2UiIGFjY29yZGluZyB0byB0aGUKLQkgKiBKU1AgdjEuMiBzcGVjaWZpY2F0aW9uLgotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRFbWJlZGRlZFR5cGUoSUZpbGUgZmlsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJaWYgKGZGdWxsUHJlcGFyZWRSZWFkZXIgPT0gbnVsbCkgewotCQkJaGFuZGxlciA9IGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBtaW1lVHlwZSA9IG51bGw7Ci0KLQkJCUlEb2N1bWVudENoYXJzZXREZXRlY3RvciBqc3BQcm92aWRlciA9IGdldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpOwotCQkJUmVhZGVyIGZ1bGxQcmVwYXJlZFJlYWRlciA9IGdldEZ1bGxQcmVwYXJlZFJlYWRlcigpOwotCQkJQnVmZmVyZWRMaW1pdGVkUmVhZGVyIGxpbWl0ZWRSZWFkZXIgPSBuZXcgQnVmZmVyZWRMaW1pdGVkUmVhZGVyKGZ1bGxQcmVwYXJlZFJlYWRlciwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCQkJanNwUHJvdmlkZXIuc2V0KGxpbWl0ZWRSZWFkZXIpOwotCQkJaWYgKGpzcFByb3ZpZGVyIGluc3RhbmNlb2YgSUpTUEhlYWRDb250ZW50RGV0ZWN0b3IpIHsKLQkJCQltaW1lVHlwZSA9ICgoSUpTUEhlYWRDb250ZW50RGV0ZWN0b3IpIGpzcFByb3ZpZGVyKS5nZXRDb250ZW50VHlwZSgpOwotCQkJCWZ1bGxQcmVwYXJlZFJlYWRlci5yZXNldCgpOwotCQkJfQotCi0JCQlFbWJlZGRlZFR5cGVSZWdpc3RyeSByZWcgPSBnZXRFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkoKTsKLQkJCWlmIChtaW1lVHlwZSA9PSBudWxsIHx8IG1pbWVUeXBlLmxlbmd0aCgpID09IDApIHsKLQkJCQloYW5kbGVyID0gZ2V0SlNQRGVmYXVsdEVtYmVkZGVkVHlwZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaGFuZGxlciA9IHJlZy5nZXRUeXBlRm9yKG1pbWVUeXBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgSlNQIGZpbGVzLCB0ZXh0L2h0bWwgaXMgdGhlIGRlZmF1bHQgY29udGVudCB0eXBlLiBUaGlzIG1heSB3YW50Ci0JICogdGhpcyBkaWZmZXJlbnQgZm9yIHR5cGVzIGxpa2UganN2IChqc3AgZm9yIHZvaWNlIHhtbCkgRm9yIG5vdywgaGFyZAotCSAqIGNvZGUgdG8gbmV3IGluc3RhbmNlLiBJbiBmdXR1cmUsIHNob3VsZCBnZXQgaW5zdGFuY2UgZnJvbSByZWdpc3RyeS4KLQkgKiBTcGVjaWZpY2F0aW9uIGNpdGVzIEhUTUwgYXMgdGhlIGRlZmF1bHQgY29udGVudFR5cGUuCi0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKSB7Ci0JCUVtYmVkZGVkVHlwZVJlZ2lzdHJ5IHJlZyA9IGdldEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSgpOwotCQlyZXR1cm4gcmVnLmdldFR5cGVGb3IoZ2V0RGVmYXVsdE1pbWVUeXBlKCkpOwotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQkvLyByZW1lbWJlciwgdGhlIExvYWRlcgotCQkvLyB3aWxsIG5lZWQgdG8gZmluaXNoIGluaXRpYWxpemF0aW9uIG9mIHBhcnNlcgotCQkvLyBiYXNlZCBvbiAiZW1iZWRkZWQgY29udGVudCIKLQkJSlNQU291cmNlUGFyc2VyIHBhcnNlciA9IG5ldyBKU1BTb3VyY2VQYXJzZXIoKTsKLQkJLy8gYWRkIGRlZmF1bHQgbmVzdGFibGUgdGFnIGxpc3QKLQkJYWRkTmVzdGFibGVQcmVmaXgocGFyc2VyLCBKU1AxMU5hbWVzcGFjZS5KU1BfVEFHX1BSRUZJWCk7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKElGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIGRlbGltaXRlciA9IENvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcy5nZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotCQlpZiAoZGVsaW1pdGVyID09IG51bGwpCi0JCQlkZWxpbWl0ZXIgPSBzdXBlci5nZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKGZpbGUpOwotCQlyZXR1cm4gZGVsaW1pdGVyOwotCX0KLQotCS8qKgotCSAqIFNwZWNpZmljYXRpb24gY2l0ZXMgSVNPLTg4NTktMS9MYXRpbi0xIGFzIHRoZSBkZWZhdWx0IGNoYXJzZXQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQlyZXR1cm4gU1BFQ19ERUZBVUxUX0VOQ09ESU5HOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQsIHRoYXQgaGFzCi0JICogYmVlbiBpbml0aWFsaXplZCB3aXRoIGFwcHJvcHJpYXRlIHBhcnNlci4gRm9yIG1hbnkgbG9hZGVycywgdGhlCi0JICogKGRlZmF1bHQpIHBhcnNlciB1c2VkIGlzIGtub3duIGZvciBhbnkgaW5wdXQuIEZvciBvdGhlcnMsIHRoZSBjb3JyZWN0Ci0JICogcGFyc2VyIChhbmQgaXRzIGluaXRpYWxpemF0aW9uKSBpcyBub3JtYWxsIGRlcGVuZGVudCBvbiB0aGUgY29udGVudCBvZgotCSAqIHRoZSBmaWxlLiBUaGlzIG5vLWFyZ3VtZW50IG1ldGhvZCBzaG91bGQgYXNzdW1lICJlbXB0eSBpbnB1dCIgYW5kIHdvdWxkCi0JICogdGhlcmVmb3JlIHJldHVybiB0aGUgZGVmYXVsdCBwYXJzZXIgZm9yIHRoZSBkZWZhdWx0IGNvbnRlbnRUeXBlLiBJZiB0aGUKLQkgKiBwYXJzZXIgaXMgdG8gaGFuZGxlIHRhZyBsaWJyYXJpZXMsIGl0IG11c3QgaGF2ZSBhIFRhZ2xpYlN1cHBvcnQgb2JqZWN0Ci0JICogd2l0aCBhIHZhbGlkIFVSSVJlc29sdmVyIGFuZCB0aGlzIElTdHJ1Y3R1cmVkRG9jdW1lbnQgYXR0YWNoZWQgdG8gaXQKLQkgKiBiZWZvcmUgdGhlIGNvbnRlbnRzIGFyZSBzZXQgb24gdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIElFbmNvZGVkRG9jdW1lbnQgbmV3RW5jb2RlZERvY3VtZW50KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoZ2V0UGFyc2VyKCkpOwotCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLnNldFJlUGFyc2VyKG5ldyBKU1BSZVBhcnNlcigpKTsKLQkJLy8gc3RydWN0dXJlZERvY3VtZW50LnNldERvY3VtZW50UGFydGl0aW9uZXIobmV3Ci0JCS8vIEpTUEphdmFEb2N1bWVudFBhcnRpb25lcigpKTsKLQkJLy8gZXZlbiB0aG91Z2ggdGhpcyBpcyBhbiAiZW1wdHkgbW9kZWwiIC4uLiB3ZSB3YW50IGl0IHRvIGhhdmUgYXQKLQkJLy8gbGVhc3QKLQkJLy8gdGhlCi0JCS8vIGRlZmF1bHQgZW1iZWRkZWRlZCBjb250ZW50IHR5cGUgaGFuZGxlcgotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkVHlwZSA9IGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKTsKLQkJZW1iZWRkZWRUeXBlLmluaXRpYWxpemVQYXJzZXIoKEpTUENhcGFibGVQYXJzZXIpIHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKSk7Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBKU1BEb2N1bWVudExvYWRlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZUxvYWRBZGFwdChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWw7Ci0JCS8vCi0JCS8vIGRvY3VtZW50IG11c3QgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0IGZvciB0aGlzIHRvCi0JCS8vIHdvcmsuCi0JCURvY3VtZW50IGRvY3VtZW50ID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChkb2N1bWVudCwgSlNQQ29yZU1lc3NhZ2VzLkpTUERvY3VtZW50TG9hZGVyXzEpOwotCQkvLyBpZiB0aGVyZSBpcyBhIG1vZGVsIGluIHRoZSBhZGFwdGVyLCB0aGlzIHdpbGwgYWRhcHQgaXQgdG8KLQkJLy8gZmlyc3Qgbm9kZS4gQWZ0ZXIgdGhhdCB0aGUgUHJvcGFnYXRpbmdBZGF0ZXIgc3ByZWFkcyBvdmVyIHRoZQotCQkvLyBjaGlsZHJlbiBiZWluZwotCQkvLyBjcmVhdGVkLiBFYWNoIHRpbWUgdGhhdCBoYXBwZW5kcywgYSBzaWRlIGVmZmVjdCBpcyB0bwotCQkvLyBhbHNvICJzcHJlYWQiIHNwcmVjaWZpYyByZWdpc3RlcmVkIGFkYXB0ZXJzLAotCQkvLyB0aGV5IHR3byBjYW4gcHJvcGlnYXRlIGlzIG5lZWRlZC4KLQkJLy8gVGhpcyAnZ2V0JyBjYXVzZXMgZmlyc3QgdG8gYmUgYmUgYXR0YWNoZWQuCi0JCVByb3BhZ2F0aW5nQWRhcHRlciBwcm9wYWdhdGluZ0FkYXB0ZXIgPSAoUHJvcGFnYXRpbmdBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCS8vIG1heSBtYWtlIHRoaXMgZWFzaWVyIHRvIHVzZSBpbiBmdXR1ZQotCQlwcm9wYWdhdGluZ0FkYXB0ZXIuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkobmV3IFBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeSgpKTsKLQkJLy8gRm9yIEpTUHMsIHRoZSBNb2RlbFF1ZXJ5QWRhcHRlciBtdXN0IGJlICJhdHRhY2hlZCIgdG8gdGhlIGRvY3VtZW50Ci0JCS8vIGJlZm9yZSBjb250ZW50IGlzIHNldCBpbiB0aGUgbW9kZWwsIHNvIHRhZ2xpYiBpbml0aXphdGlvbiBjYW4KLQkJLy8gdGFrZSBwbGFjZS4KLQkJKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9Db21waWxhdGlvblVuaXRIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9Db21waWxhdGlvblVuaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRmNTUyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvQ29tcGlsYXRpb25Vbml0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuV29ya2luZ0NvcHlPd25lcjsKLQotLyoqCi0gKiBUbyBlbnN1cmUgdGhlcmUgaXMgb25seSBvbmUgaW5zdGFuY2Ugb2YgUHJvYmxlbVJlcXVlc3RvciBhbmQgV29ya2luZ0NvcHlPd25lcgotICogZm9yIEpTUCBwbHVnaW5zLiAgVGhlc2Ugd2VyZSByZW1vdmVkIGZyb20gSlNQVHJhbnNsYXRpb24gdG8gZW5zdXJlIHRoYXQgdGhlCi0gKiBKU1BUcmFuc2xhdGlvbiB3YXMgbm90IGhlbGQgaW4gbWVtb3J5IGJ5IGFueSB0eXBlIG9mIEpEVCBsaXN0cyAoY2FjaGluZwotICogc2VhcmNoIHJlc3VsdHMsIGV0Yy4uLikKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIENvbXBpbGF0aW9uVW5pdEhlbHBlciB7Ci0KLSAgICBwcml2YXRlIEpTUFByb2JsZW1SZXF1ZXN0b3IgZlByb2JsZW1SZXF1ZXN0b3IgPSBudWxsOwotICAgIHByaXZhdGUgV29ya2luZ0NvcHlPd25lciBmV29ya2luZ0NvcHlPd25lciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ29tcGlsYXRpb25Vbml0SGVscGVyIGluc3RhbmNlOwotCi0gICAgcHJpdmF0ZSBDb21waWxhdGlvblVuaXRIZWxwZXIoKSB7Ci0gICAgICAgIC8vIGZvcmNlIHVzZSBvZiBpbnN0YW5jZQotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIGZpbmFsIENvbXBpbGF0aW9uVW5pdEhlbHBlciBnZXRJbnN0YW5jZSgpIHsKLQotICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IENvbXBpbGF0aW9uVW5pdEhlbHBlcigpOwotICAgICAgICByZXR1cm4gaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgcHVibGljIEpTUFByb2JsZW1SZXF1ZXN0b3IgZ2V0UHJvYmxlbVJlcXVlc3RvcigpIHsKLQotICAgICAgICBpZiAoZlByb2JsZW1SZXF1ZXN0b3IgPT0gbnVsbCkKLSAgICAgICAgICAgIGZQcm9ibGVtUmVxdWVzdG9yID0gbmV3IEpTUFByb2JsZW1SZXF1ZXN0b3IoKTsKLSAgICAgICAgcmV0dXJuIGZQcm9ibGVtUmVxdWVzdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBXb3JraW5nQ29weU93bmVyIGdldFdvcmtpbmdDb3B5T3duZXIoKSB7Ci0KLSAgICAgICAgaWYgKGZXb3JraW5nQ29weU93bmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGZXb3JraW5nQ29weU93bmVyID0gbmV3IFdvcmtpbmdDb3B5T3duZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJKU1AgV29ya2luZyBjb3B5IG93bmVyIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZXb3JraW5nQ29weU93bmVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9Fc2NhcGVkVGV4dFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9Fc2NhcGVkVGV4dFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ2NTM1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvRXNjYXBlZFRleHRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0vKioKLSAqIGNsYXNzIHRvIGhhbmRsZSBjaHVua3Mgb2YgdGV4dC9yZWdpb25zCi0gKiB3aXRoIGVzY2FwZWQgY2hhcmFjdGVyIGRhdGEKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBFc2NhcGVkVGV4dFV0aWwgewotCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0aWVzIGZYTUx0b0phdmFMb29rdXAgPSBudWxsOwotCi0JLyoqCi0JICogQHJldHVybiB1bmVzY2FwZWQgZnVsbCB0ZXh0IG9mIHRoYXQgcmVnaW9uLCAiIiBpZiB0aGVyZSBpcyBubyB0ZXh0Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VW5lc2NhcGVkVGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgSVRleHRSZWdpb24gcikgewotCQlTdHJpbmcgdGVzdCA9IChwYXJlbnQgIT0gcikgPyBwYXJlbnQuZ2V0RnVsbFRleHQocikgOiBwYXJlbnQuZ2V0RnVsbFRleHQoKTsKLQkJcmV0dXJuIGdldFVuZXNjYXBlZFRleHQodGVzdCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VW5lc2NhcGVkVGV4dChTdHJpbmcgdGVzdCkgewotCQlpbml0TG9va3VwKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmICh0ZXN0ICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGVzdCwgIiY7IiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyB0b2sxLCB0b2syLCB0b2szLCB0cmFuc1N0cmluZzsKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQl0b2sxID0gdG9rMiA9IHRvazMgPSB0cmFuc1N0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJdG9rMSA9IHN0Lm5leHRUb2tlbigpOwotCQkJCWlmICh0b2sxLmVxdWFscygiJiIpICYmIHN0Lmhhc01vcmVUb2tlbnMoKSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJdG9rMiA9IHN0Lm5leHRUb2tlbigpOwotCQkJCQlpZiAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQl0b2szID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCEodHJhbnNTdHJpbmcgPSBmWE1MdG9KYXZhTG9va3VwLmdldFByb3BlcnR5KHRvazEgKyB0b2syICsgdG9rMywgIiIpKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQodHJhbnNTdHJpbmcpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCh0b2sxICsgdG9rMiArIHRvazMpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBpbml0aWFsaXplIGxvb2t1cCB0YWJsZXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRMb29rdXAoKSB7Ci0JCWZYTUx0b0phdmFMb29rdXAgPSBuZXcgUHJvcGVydGllcygpOwotCQlmWE1MdG9KYXZhTG9va3VwLnNldFByb3BlcnR5KCImYXBvczsiLCAiJyIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJZlhNTHRvSmF2YUxvb2t1cC5zZXRQcm9wZXJ0eSgiJnF1b3Q7IiwgIlwiIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQlmWE1MdG9KYXZhTG9va3VwLnNldFByb3BlcnR5KCImYW1wOyIsICImIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQlmWE1MdG9KYXZhTG9va3VwLnNldFByb3BlcnR5KCImbHQ7IiwgIjwiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCWZYTUx0b0phdmFMb29rdXAuc2V0UHJvcGVydHkoIiZndDsiLCAiPiIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJZlhNTHRvSmF2YUxvb2t1cC5zZXRQcm9wZXJ0eSgiJm5ic3A7IiwgIiAiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gZW50aXR5IHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0cmFuc2xhdGVFbnRpdHlSZWZlcmVuY2UoU3RyaW5nIGVudGl0eSkgewotCQlyZXR1cm4gZlhNTHRvSmF2YUxvb2t1cC5nZXRQcm9wZXJ0eShlbnRpdHksIGVudGl0eSk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSUpTUFByb2JsZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9JSlNQUHJvYmxlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjk4NmNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9JSlNQUHJvYmxlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwotCi1wdWJsaWMgaW50ZXJmYWNlIElKU1BQcm9ibGVtIGV4dGVuZHMgSVByb2JsZW0gewotCi0JaW50IEZfUFJPQkxFTV9JRF9MSVRFUkFMID0gMHhBMDAwMDAwMDsKLQkKLQlpbnQgVEVJQ2xhc3NOb3RGb3VuZCA9IEZfUFJPQkxFTV9JRF9MSVRFUkFMICsgMTsKLQlpbnQgVEVJVmFsaWRhdGlvbk1lc3NhZ2UgPSBGX1BST0JMRU1fSURfTElURVJBTCArIDI7Ci0JaW50IFRFSUNsYXNzTm90SW5zdGFudGlhdGVkID0gRl9QUk9CTEVNX0lEX0xJVEVSQUwgKyAzOwotCWludCBURUlDbGFzc01pc2MgPSBGX1BST0JMRU1fSURfTElURVJBTCArIDQ7CQotCWludCBUYWdDbGFzc05vdEZvdW5kID0gRl9QUk9CTEVNX0lEX0xJVEVSQUwgKyA1OwotCWludCBVc2VCZWFuSW52YWxpZElEID0gRl9QUk9CTEVNX0lEX0xJVEVSQUwgKyA2OwotCWludCBVc2VCZWFuTWlzc2luZ1R5cGVJbmZvID0gRl9QUk9CTEVNX0lEX0xJVEVSQUwgKyA3OwotCWludCBVc2VCZWFuQW1iaWd1b3VzVHlwZSAgPSBGX1BST0JMRU1fSURfTElURVJBTCArIDg7Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgSUQgb2YgdGhpcyBKU1AgcHJvYmxlbQotCSAqLwotCWludCBnZXRFSUQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0lKU1BUcmFuc2xhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0lKU1BUcmFuc2xhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2Y2NDFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9JSlNQVHJhbnNsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotCi0vKioKLSAqIEFuIG9iamVjdCB0aGF0IGhvbGRzIGEgdHJhbnNsYXRlZCBKU1AgU3RyaW5nIGFsb25nIHdpdGgKLSAqIHBvc2l0aW9uIG1hcHBpbmcgZnJvbSBKYXZhIHRvIEpTUCwgYW5kIEpTUCB0byBKYXZhLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUpTUFRyYW5zbGF0aW9uIHsKLQotCS8qKgotCSAqIFRoZSBzdHJpbmcgY29udGVudHMgb2YgdGhlIHRyYW5zbGF0ZWQgZG9jdW1lbnQuCi0JICogQHJldHVybiAgdGhlIHN0cmluZyBjb250ZW50cyBvZiB0aGUgdHJhbnNsYXRlZCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFUZXh0KCk7Ci0KLQkvKioKLQkgKiBUaGUgY29ycmVzcG9uZGluZyBqYXZhIG9mZnNldCBpbiB0aGUgdHJhbnNsYXRlZCBkb2N1bWVudCBmb3IgYSBnaXZlbiBqc3Agb2Zmc2V0LgotCSAqIEBwYXJhbSBqc3BQb3NpdGlvbgotCSAqIEByZXR1cm4gdGhlIGphdmEgb2Zmc2V0IHRoYXQgbWFwcyB0byBqc3BPZmZzZXQsIC0xIGlmIHRoZSBwb3NpdGlvbiBoYXMgbm8gbWFwcGluZy4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEphdmFPZmZzZXQoaW50IGpzcE9mZnNldCk7Ci0KLQkvKioKLQkgKiBUaGUgY29ycmVzcG9uZGluZyBqc3Agb2Zmc2V0IGluIHRoZSBzb3VyY2UgZG9jdW1lbnQgZm9yIGEgZ2l2ZW4ganNwIG9mZnNldCBpbiB0aGUgdHJhbnNsYXRlZCBkb2N1bWVudC4KLQkgKiBAcGFyYW0gamF2YVBvc2l0aW9uCi0JICogQHJldHVybiB0aGUganNwIG9mZnNldCB0aGF0IG1hcHMgdG8gamF2YU9mZnNldCwgLTEgaWYgdGhlIHBvc2l0aW9uIGhhcyBubyBtYXBwaW5nLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SnNwT2Zmc2V0KGludCBqYXZhT2Zmc2V0KTsKLQotCS8qKgotCSAqIFRoZSBjb3JyZXNwb25kaW5nIENvbXBpbGF0aW9uVW5pdCBmb3IgdGhlIHRyYW5zbGF0ZWQgSlNQIGRvY3VtZW50Ci0JICogQHJldHVybiBhbiBJQ29tcGlsYXRpb25Vbml0IG9mIHRoZSB0cmFuc2xhdGlvbgotCSAqLwotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUphdmFFbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBKU1AgcmFuZ2UgaW4gdGhlIEpTUCBTdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0ganNwU3RhcnQgc3RhcmluZyBvZmZzZXQgaW4gdGhlIEpTUCBkb2N1bWVudAotCSAqIEBwYXJhbSBqc3BFbmQgZW5kaW5nIG9mZnNldCBpbiB0aGUgSlNQIGRvY3VtZW50Ci0JICogQHJldHVybiBJSmF2YUVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEpTUCBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgSUphdmFFbGVtZW50W10gZ2V0RWxlbWVudHNGcm9tSnNwUmFuZ2UoaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kKTsKLQotCS8qKgotCSAqIEBwYXJhbSBqYXZhT2Zmc2V0Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBvZmZzZXQgd2l0aGluIHRoZSB0cmFuc2xhdGVkIEphdmEgc291cmNlIG1hcHMKLQkgKiAgICAgICAgIGRpcmVjdGx5IHRvIGEgc2NyaXB0aW5nIHJlZ2lvbiBpbiB0aGUgb3JpZ2luYWwgSlNQCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbmRpcmVjdChpbnQgamF2YU9mZnNldCk7Ci0JCi0JLyoqCi0JICogTXVzdCBiZSBzZXQgdHJ1ZSBpbiBvcmRlciBmb3IgcHJvYmxlbXMgdG8gYmUgY29sbGVjdGVkIGR1cmluZyByZWNvbmNpbGUuCi0JICogSWYgc2V0IGZhbHNlLCBwcm9ibGVtcyB3aWxsIGJlIGlnbm9yZWQgZHVyaW5nIHJlY29uY2lsZS4KLQkgKiBAcGFyYW0gY29sbGVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2JsZW1Db2xsZWN0aW5nQWN0aXZlKGJvb2xlYW4gY29sbGVjdCk7Ci0KLQkvKioKLQkgKiBSZWNvbmNpbGVzIHRoZSBjb21waWxhdGlvbiB1bml0IGZvciB0aGlzIEpTUFRyYW5zbGF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcmVjb25jaWxlQ29tcGlsYXRpb25Vbml0KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBMaXN0IG9mIHByb2JsZW1zIGNvbGxlY3RlZCBkdXJpbmcgcmVjb25jaWxlIG9mIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvYmxlbXMoKTsKLQkKLQkvLyBhZGQgdGhlc2UgQVBJIG9uY2UgZmluYWxpemVkCi0JLy8gZ2V0SnNwRWRpdHMoVGV4dEVkaXQgamF2YUVkaXQpCi0JLy8gZ2V0SmF2YVJhbmdlcygpCi0gICAgLy8gZ2V0SmF2YURvY3VtZW50KCkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQMlNlcnZsZXROYW1lVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUDJTZXJ2bGV0TmFtZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ2ZTk0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQMlNlcnZsZXROYW1lVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQMlNlcnZsZXROYW1lVXRpbCB7Ci0JCi0JLyoqCi0JICogV0FTIG1hbmdsZXMgVG9tJkplcnJ5IGFzOiBfVG9tXzI2X0plcnJ5OyB0aGlzIHRha2VzIGluIHRoZSBtYW5nbGVkIG5hbWUKLQkgKiBhbmQgcmV0dXJucyB0aGUgb3JpZ2luYWwgbmFtZS4KLQkgKiAKLQkgKiBVbm1hbmdsZXMgdGhlIHF1YWxpZmllZCB0eXBlIG5hbWUuICBJZiBhbiB1bmRlcnNjb3JlIGlzIGZvdW5kCi0JICogaXQgaXMgYXNzdW1lZCB0byBiZSBhIG1hbmdsZWQgcmVwcmVzZW50YXRpb24gb2YgYSBub24tYWxwaGEsIAotCSAqIG5vbi1kaWdpdCBjaGFyYWN0ZXIgb2YgdGhlIGZvcm0gX05OXywgd2hlcmUgTk4gYXJlIGhleCBkaWdpdHMKLQkgKiByZXByZXNlbnRpbmcgdGhlIGVuY29kZWQgY2hhcmFjdGVyLiAgVGhpcyByb3V0aW5lIGNvbnZlcnRzIGl0Ci0JICogYmFjayB0byB0aGUgb3JpZ2luYWwgY2hhcmFjdGVyLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIHVubWFuZ2xlKFN0cmluZyBxdWFsaWZpZWRUeXBlTmFtZSkgewotCQlpZihxdWFsaWZpZWRUeXBlTmFtZS5jaGFyQXQoMCkgIT0gJ18nKQotCQkJcmV0dXJuIHF1YWxpZmllZFR5cGVOYW1lOwotCQkKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIHBvc3NpYmxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkJLy8gcmVtb3ZlIHRoZSAuamF2YSBleHRlbnNpb24gaWYgdGhlcmUgaXMgb25lCi0JCWlmKHF1YWxpZmllZFR5cGVOYW1lLmVuZHNXaXRoKCIuamF2YSIpKS8vJE5PTi1OTFMtMSQKLQkJCXF1YWxpZmllZFR5cGVOYW1lID0gcXVhbGlmaWVkVHlwZU5hbWUuc3Vic3RyaW5nKDAsIHF1YWxpZmllZFR5cGVOYW1lLmxlbmd0aCgpIC0gNSk7Ci0JCQotCQlmb3IoaW50IGkgPSAxOyBpIDwgcXVhbGlmaWVkVHlwZU5hbWUubGVuZ3RoKCk7IGkrKykgeyAgLy8gc3RhcnQgYXQgaW5kZXggMSBiL2MgMXN0IGNoYXIgaXMgYWx3YXlzICdfJwotCQkJY2hhciBjID0gcXVhbGlmaWVkVHlwZU5hbWUuY2hhckF0KGkpOwotCQkJaWYoYyA9PSAnXycpIHsKLQkJCQlpbnQgZW5kSW5kZXggPSBxdWFsaWZpZWRUeXBlTmFtZS5pbmRleE9mKCdfJywgaSsxKTsKLQkJCQlpZihlbmRJbmRleCA9PSAtMSkKLQkJCQkJYnVmLmFwcGVuZChjKTsKLQkJCQllbHNlIHsKLQkJCQkJY2hhciB1bm1hbmdsZWQ7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwb3NzaWJsZSA9IHF1YWxpZmllZFR5cGVOYW1lLnN1YnN0cmluZyhpKzEsIGVuZEluZGV4KTsgCi0JCQkJCSAgICBpZihpc1ZhbGlkKHBvc3NpYmxlKSkgewotCQkJCQkJCXVubWFuZ2xlZCA9IChjaGFyKUludGVnZXIuZGVjb2RlKCIweCIgKyBwb3NzaWJsZSkuaW50VmFsdWUoKTsvLyROT04tTkxTLTEkCi0JCQkJCQkJaSA9IGVuZEluZGV4OwotCQkJCQkgICAgfQotCQkJCQkgICAgZWxzZSB7IAotCQkJCQkgICAgICAgIHVubWFuZ2xlZCA9IGM7Ci0JCQkJCSAgICB9Ci0JCQkJCQkKLQkJCQkJfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQkJdW5tYW5nbGVkID0gYzsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHVubWFuZ2xlZCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlidWYuYXBwZW5kKGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgZ2l2ZW4gc3RyaW5nIGlzIGEgdmFsaWQgSGV4IHJlcHJlc2VudGF0aW9uIG9mIGFuIEFTQ0lJIGNoYXJhY3RlciAoZWcuIDJGIC0+IC8pCi0JICogQHBhcmFtIHBvc3NpYmxlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgcG9zc2libGUpIHsKLQkgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkgICAgaWYocG9zc2libGUubGVuZ3RoKCkgPT0gMil7CSAgICAKLQkgICAgICAgIGNoYXIgYzEgPSBwb3NzaWJsZS5jaGFyQXQoMCk7Ci0JICAgICAgICBjaGFyIGMyID0gcG9zc2libGUuY2hhckF0KDEpOwotCSAgICAgICAgLy8gMXN0IGNoYXJhY3RlciBtdXN0IGJlIGEgZGlnaXQKLQkgICAgICAgIGlmKENoYXJhY3Rlci5pc0RpZ2l0KGMxKSkgewotCSAgICAgICAgICAgIC8vIDJuZCBjaGFyYWN0ZXIgbXVzdCBiZSBkaWdpdCBvciB1cHBlciBjYXNlIGxldHRlciBBLUYKLQkgICAgICAgICAgICBpZihDaGFyYWN0ZXIuaXNEaWdpdChjMikpIHsKLQkgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgZWxzZSBpZihDaGFyYWN0ZXIuaXNVcHBlckNhc2UoYzIpICYmIChjMiA9PSAnQScgfHwgYzIgPT0gJ0InIHx8IGMyID09ICAnQyd8fCBjMiA9PSAgJ0QnfHwgYzIgPT0gICdFJ3x8IGMyID09ICdGJykpIHsKLQkgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogTWFuZ2xlIHN0cmluZyB0byBXQVMtbGlrZSBzcGVjaWZpY2F0aW9ucwotCSAqCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgbWFuZ2xlKFN0cmluZyBuYW1lKSB7CSAgCi0JICBTdHJpbmdCdWZmZXIgbW9kaWZpZWROYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCSAgCi0JICAvLyBleHRlbnNpb24gKC5qc3AsIC5qc3BmLCAuanNweCwgZXRjLi4uKSBzaG91bGQgYWxyZWFkeSBiZSBlbmNvZGVkIGluIG5hbWUKLQkgIAotCSAgaW50IGxlbmd0aCA9IG5hbWUubGVuZ3RoKCk7Ci0JICAvLyBpbiBjYXNlIG5hbWUgaXMgZm9yYmlkZGVuIChhIG51bWJlciwgY2xhc3MsIGZvciwgZXRjLi4uKQotCSAgbW9kaWZpZWROYW1lLmFwcGVuZCgnXycpOwotCQotCSAgLy8gZW5zdXJlIHJlc3Qgb2YgY2hhcmFjdGVycyBhcmUgdmFsaWQJCi0JICBmb3IgKGludCBpPTA7IGk8IGxlbmd0aDsgaSsrKSB7Ci0JCSAgY2hhciBjdXJyZW50Q2hhciA9IG5hbWUuY2hhckF0KGkpOwotCQkgIGlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoY3VycmVudENoYXIpID09IHRydWUgICkgeyAKLQkJCSAgbW9kaWZpZWROYW1lLmFwcGVuZChjdXJyZW50Q2hhcik7Ci0JCSAgfSBlbHNlIHsKLQkJCSAgbW9kaWZpZWROYW1lLmFwcGVuZChtYW5nbGVDaGFyKGN1cnJlbnRDaGFyKSk7Ci0JCSAgfQotCSAgfQotCSAgcmV0dXJuIG1vZGlmaWVkTmFtZS50b1N0cmluZygpOwotCSAgCi0JfQotCi0JLyoqCi0JICogdGFrZSBhIGNoYXJhY3RlciBhbmQgcmV0dXJuIGl0cyBoZXggZXF1aXZhbGVudAotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBtYW5nbGVDaGFyKGNoYXIgY2gpIHsKLQkgIGlmICggY2ggPT0gRmlsZS5zZXBhcmF0b3JDaGFyICkgewotCQkgIGNoID0gJy8nOwotCSAgfQotCQotCSAgaWYgKCBDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGNoKSA9PSB0cnVlICkgewotCQkgIHJldHVybiAiIiArIGNoOyAvLyROT04tTkxTLTEkCi0JICB9Ci0JICByZXR1cm4gIl8iICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkudG9VcHBlckNhc2UoKSArICJfIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUEluY2x1ZGVSZWdpb25IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BJbmNsdWRlUmVnaW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMTE1YzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUEluY2x1ZGVSZWdpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi0vKioKLSAqIEV4dGVuc2lvbiBvZiBYTUxKU1BSZWdpb25IZWxwZXIgaW50ZWRlZCB0byBwYXJzZSBlbnRpcmUgaW5jbHVkZWQgSlNQIGZpbGVzLgotICogQmFzaWNhbGx5IGl0IGV4cGFuZHMgdGhlIHJ1bGVzIGZvciB3aGF0IHRhZ3MgYXJlIHBhcnNlZCBhcyBKU1AuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLWNsYXNzIEpTUEluY2x1ZGVSZWdpb25IZWxwZXIgZXh0ZW5kcyBYTUxKU1BSZWdpb25IZWxwZXIgewotCS8qKgotCSAqIEBwYXJhbSBKU1BUcmFuc2xhdG9yCi0JICovCi0JcHVibGljIEpTUEluY2x1ZGVSZWdpb25IZWxwZXIoSlNQVHJhbnNsYXRvciB0cmFuc2xhdG9yLCBib29sZWFuIGFwcGVuZEFzSW5kaXJlY3RTb3VyY2UpIHsKLQkJc3VwZXIodHJhbnNsYXRvciwgYXBwZW5kQXNJbmRpcmVjdFNvdXJjZSk7Ci0JfQotCi0JLy8gdGhlc2UgbWV0aG9kcyBkZXRlcm1pbmUgd2hhdCBjb250ZW50IGdldHMgYWRkZWQgdG8gdGhlIGxvY2FsIHNjcmlwbGV0LCBleHByZXNzaW9uLCBkZWNsYXJhdGlvbiBidWZmZXJzCi0JLyoKLQkgKiByZXR1cm4gdHJ1ZSBmb3IgZWxlbWVudHMgd2hvc2UgY29udGVudHMgd2UgbWlnaHQgd2FudCB0byBhZGQgdG8gdGhlIGphdmEgZmlsZSB3ZSBhcmUgYnVpbGRpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0pTUFN0YXJ0UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJU3RyaW5nIHR5cGUgPSBzZFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKTsKLQkJcmV0dXJuIHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTiB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4gfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4gfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4gfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWNsYXJhdGlvbihTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZGVjbGFyYXRpb24iKSAvLyROT04tTkxTLTEkCQkKLQkJCQkJfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCI8JSEiKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHByZXNzaW9uKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpleHByZXNzaW9uIikgLy8kTk9OLU5MUy0xJAkJCi0JCQkJCXx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgiPCU9Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NjcmlwdGxldChTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6c2NyaXB0bGV0IikgLy8kTk9OLU5MUy0xJAkJCi0JCQkJCXx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgiPCUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSW5jbHVkZURpcmVjdGl2ZShTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZGlyZWN0aXZlLmluY2x1ZGUiKSB8fCAvLyROT04tTkxTLTEkCi0JCQkJCXRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgiaW5jbHVkZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNUYWdsaWJEaXJlY3RpdmUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgianNwOmRpcmVjdGl2ZS50YWdsaWIiKSAvLyROT04tTkxTLTEkCi0JCQkJCXx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgidGFnbGliIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhZ2VEaXJlY3RpdmUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgianNwOmRpcmVjdGl2ZS5wYWdlIikgLy8kTk9OLU5MUy0xJAotCQkJCQl8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoInBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIGRpZmZlcmVudCBidHduIFhNTC1KU1AgYW5kIEpTUCB0YWdzCQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlZ2lvbk5hbWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gbnVsbDsKLQkJU3RyaW5nIG5hbWVTdHIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgc2l6ZSA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5zaXplKCk7Ci0JCWlmIChzaXplID4gMSkgewotCQkJLy8gcHJlc3VtYWJseSBYTUwtSlNQIDxqc3A6c2NyaXB0bGV0PiB8IDxqc3A6ZXhwcmVzc2lvbj4gfCA8anNwOmRlY2xhcmF0aW9uPgotCQkJbmFtZVJlZ2lvbiA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCX0KLQkJZWxzZSBpZiAoc2l6ZSA9PSAxKSB7Ci0JCQkvLyBwcmVzdW1hYmx5IEpTUCBvcGVuIDwlIHwgPCU9IHwgPCUhCi0JCQluYW1lUmVnaW9uID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgwKTsKLQkJfQotCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsKQotCQkJbmFtZVN0ciA9IGZUZXh0VG9QYXJzZS5zdWJzdHJpbmcoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZVJlZ2lvbiksIHNkUmVnaW9uLmdldFRleHRFbmRPZmZzZXQobmFtZVJlZ2lvbikpOwotCQlyZXR1cm4gbmFtZVN0ci50cmltKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc090aGVyUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCXByb2Nlc3NJbmNsdWRlRGlyZWN0aXZlKHNkUmVnaW9uKTsKLQkJcHJvY2Vzc1BhZ2VEaXJlY3RpdmUoc2RSZWdpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BQcm9ibGVtUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQUHJvYmxlbVJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjQ3NjgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BQcm9ibGVtUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUHJvYmxlbVJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKLQotY2xhc3MgSlNQUHJvYmxlbVJlcXVlc3RvciBpbXBsZW1lbnRzIElQcm9ibGVtUmVxdWVzdG9yIHsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBmSXNBY3RpdmUgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBmSXNSdW5uaW5nID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIExpc3QgZkNvbGxlY3RlZFByb2JsZW1zOwotCi0gICAgcHVibGljIHZvaWQgYmVnaW5SZXBvcnRpbmcoKSB7Ci0KLSAgICAgICAgZklzUnVubmluZyA9IHRydWU7Ci0gICAgICAgIGZDb2xsZWN0ZWRQcm9ibGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhY2NlcHRQcm9ibGVtKElQcm9ibGVtIHByb2JsZW0pIHsKLQotICAgICAgICBpZiAoaXNBY3RpdmUoKSkKLSAgICAgICAgICAgIGZDb2xsZWN0ZWRQcm9ibGVtcy5hZGQocHJvYmxlbSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kUmVwb3J0aW5nKCkgewotCi0gICAgICAgIGZJc1J1bm5pbmcgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQotICAgICAgICByZXR1cm4gZklzQWN0aXZlICYmIGZDb2xsZWN0ZWRQcm9ibGVtcyAhPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGlzIHByb2JsZW0gcmVxdWVzdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpc0FjdGl2ZQotICAgICAqICAgICAgICAgICAgdGhlIHN0YXRlIG9mIHRoaXMgcHJvYmxlbSByZXF1ZXN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJc0FjdGl2ZShib29sZWFuIGlzQWN0aXZlKSB7Ci0KLSAgICAgICAgaWYgKGZJc0FjdGl2ZSAhPSBpc0FjdGl2ZSkgewotICAgICAgICAgICAgZklzQWN0aXZlID0gaXNBY3RpdmU7Ci0gICAgICAgICAgICBpZiAoZklzQWN0aXZlKQotICAgICAgICAgICAgICAgIHN0YXJ0Q29sbGVjdGluZ1Byb2JsZW1zKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc3RvcENvbGxlY3RpbmdQcm9ibGVtcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVsbHMgdGhpcyBhbm5vdGF0aW9uIG1vZGVsIHRvIGNvbGxlY3QgdGVtcG9yYXJ5IHByb2JsZW1zIGZyb20gbm93IG9uLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzdGFydENvbGxlY3RpbmdQcm9ibGVtcygpIHsKLQotICAgICAgICBmQ29sbGVjdGVkUHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVsbHMgdGhpcyBhbm5vdGF0aW9uIG1vZGVsIHRvIG5vIGxvbmdlciBjb2xsZWN0IHRlbXBvcmFyeSBwcm9ibGVtcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc3RvcENvbGxlY3RpbmdQcm9ibGVtcygpIHsKLQotICAgICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBjb2xsZWN0ZWQgcHJvYmxlbXMKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRDb2xsZWN0ZWRQcm9ibGVtcygpIHsKLQotICAgICAgICByZXR1cm4gZkNvbGxlY3RlZFByb2JsZW1zOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKLQotICAgICAgICByZXR1cm4gZklzUnVubmluZzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDMwOTQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLldvcmtpbmdDb3B5T3duZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLS8qKgotICogPHA+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBJSlNQVHJhbnNsYXRpb24uICAKLSAqIDxicj4KLSAqIFRoaXMgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGphdmEgdHJhbnNsYXRpb24gb2YgCi0gKiBhIEpTUCBmaWxlIGFzIHdlbGwgYXMgYSBtYXBwaW5nIG9mIHJhbmdlcyBmcm9tIHRoZSB0cmFuc2xhdGVkIEphdmEgdG8gdGhlIEpTUCBzb3VyY2UsIAotICogYW5kIG1hcHBpbmcgZnJvbSBKU1Agc291cmNlIGJhY2sgdG8gdGhlIHRyYW5zbGF0ZWQgSmF2YS4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBZb3UgbWF5IGFsc28gdXNlIEpTUFRyYW5zbGF0aW9uIHRvIGRvIENvbXBpbGF0aW9uVW5pdC1lc3F1ZSB0aGluZ3Mgc3VjaCBhczoKLSAqIDx1bD4KLSAqIAk8bGk+Y29kZSBzZWxlY3QgKGdldCBqYXZhIGVsZW1lbnRzIGZvciBqc3Agc2VsZWN0aW9uKTwvbGk+Ci0gKiAgPGxpPnJlY29uY2lsZTwvbGk+Ci0gKiAgPGxpPmdldCBqYXZhIHJlZ2lvbnMgZm9yIGpzcCBzZWxlY3Rpb248L2xpPgotICogIDxsaT5nZXQgYSBKU1AgdGV4dCBlZGl0IGJhc2VkIG9uIGEgSmF2YSB0ZXh0IGVkaXQ8L2xpPgotICogIDxsaT5kZXRlcm1pbmUgaWYgYSBqYXZhIG9mZnNldCBmYWxscyB3aXRoaW4gYSBqc3A6dXNlQmVhbiByYW5nZTwvbGk+Ci0gKiAgPGxpPmRldGVybWluZSBpZiBhIGphdmEgb2Zmc2V0IGZhbGxzIHdpdGhpbiBhIGpzcCBpbXBvcnQgc3RhdG1lbnQ8L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFRyYW5zbGF0aW9uIGltcGxlbWVudHMgSUpTUFRyYW5zbGF0aW9uIHsKLQkKLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWU9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwdHJhbnNsYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRz0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiogdGhlIG5hbWUgb2YgdGhlIGNsYXNzICh3L291dCBleHRlbnNpb24pICoqLwotCXByaXZhdGUgU3RyaW5nIGZDbGFzc25hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSUphdmFQcm9qZWN0IGZKYXZhUHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZKYXZhMkpzcE1hcCA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZKc3AySmF2YU1hcCA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZKYXZhMkpzcEltcG9ydHNNYXAgPSBudWxsOwotCXByaXZhdGUgSGFzaE1hcCBmSmF2YTJKc3BVc2VCZWFuTWFwID0gbnVsbDsKLQlwcml2YXRlIEhhc2hNYXAgZkphdmEySnNwSW5kaXJlY3RNYXAgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmRUxQcm9ibGVtcyA9IG51bGw7Ci0JCi0JLy8gZG9uJ3Qgd2FudCB0byBob2xkIG9udG8gbW9kZWwgKHZpYSB0cmFuc2xhdG9yKQotCS8vIGFsbCByZWxldmFudCBpbmZvIGlzIGV4dHJhY3RlZCBpbiB0aGUgY29uc3RydWN0b3IuCi0JLy9wcml2YXRlIEpTUFRyYW5zbGF0b3IgZlRyYW5zbGF0b3IgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZKYXZhVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgZkpzcFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBmQ29tcGlsYXRpb25Vbml0ID0gbnVsbDsKLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0JLyoqIGxvY2sgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIHRoZSBjb21waWxhdGlvbiB1bml0ICoqLwotCXByaXZhdGUgYnl0ZVtdIGZMb2NrID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmTWFuZ2xlZE5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZkpzcE5hbWU7Ci0JcHJpdmF0ZSBMaXN0IGZUcmFuc2xhdGlvblByb2JsZW1zOwotCXByaXZhdGUgQ29sbGVjdGlvbiBmSW5jbHVkZWRQYXRoczsKLQotCXB1YmxpYyBKU1BUcmFuc2xhdGlvbihJSmF2YVByb2plY3QgamF2YVByb2osIEpTUFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgewotCi0JCWZMb2NrID0gbmV3IGJ5dGVbMF07Ci0JCWZKYXZhUHJvamVjdCA9IGphdmFQcm9qOwotCQkvL2ZUcmFuc2xhdG9yID0gdHJhbnNsYXRvcjsKLQkJCi0JCS8vIGNhbiBiZSBudWxsIGlmIGl0J3MgYW4gZW1wdHkgZG9jdW1lbnQgKHcvIE51bGxKU1BUcmFuc2xhdGlvbikKLQkJaWYodHJhbnNsYXRvciAhPSBudWxsKSB7Ci0JCSAgICBmSmF2YVRleHQgPSB0cmFuc2xhdG9yLmdldFRyYW5zbGF0aW9uKCkudG9TdHJpbmcoKTsKLQkJICAgIGZKc3BUZXh0ID0gdHJhbnNsYXRvci5nZXRKc3BUZXh0KCk7Ci0JCQlmQ2xhc3NuYW1lID0gdHJhbnNsYXRvci5nZXRDbGFzc25hbWUoKTsKLQkJCWZKYXZhMkpzcE1hcCA9IHRyYW5zbGF0b3IuZ2V0SmF2YTJKc3BSYW5nZXMoKTsKLQkJCWZKc3AySmF2YU1hcCA9IHRyYW5zbGF0b3IuZ2V0SnNwMkphdmFSYW5nZXMoKTsKLQkJCWZKYXZhMkpzcEltcG9ydHNNYXAgPSB0cmFuc2xhdG9yLmdldEphdmEySnNwSW1wb3J0UmFuZ2VzKCk7Ci0JCQlmSmF2YTJKc3BVc2VCZWFuTWFwID0gdHJhbnNsYXRvci5nZXRKYXZhMkpzcFVzZUJlYW5SYW5nZXMoKTsKLQkJCWZKYXZhMkpzcEluZGlyZWN0TWFwID0gdHJhbnNsYXRvci5nZXRKYXZhMkpzcEluZGlyZWN0UmFuZ2VzKCk7Ci0JCQlmRUxQcm9ibGVtcyA9IHRyYW5zbGF0b3IuZ2V0RUxQcm9ibGVtcygpOwotCQkJZlRyYW5zbGF0aW9uUHJvYmxlbXMgPSB0cmFuc2xhdG9yLmdldFRyYW5zbGF0aW9uUHJvYmxlbXMoKTsKLQkJCWZJbmNsdWRlZFBhdGhzID0gdHJhbnNsYXRvci5nZXRJbmNsdWRlZFBhdGhzKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIGZKYXZhUHJvamVjdDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5JSlNQVHJhbnNsYXRpb24jZ2V0SmF2YVRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVRleHQoKSB7Ci0JCS8vcmV0dXJuIChmVHJhbnNsYXRvciAhPSBudWxsKSA/IGZUcmFuc2xhdG9yLmdldFRyYW5zbGF0aW9uKCkudG9TdHJpbmcoKSA6ICIiOyAgLy8kTk9OLU5MUy0xJCAKLQkJcmV0dXJuIGZKYXZhVGV4dDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRKc3BUZXh0KCkgewotCQkvL3JldHVybiAoZlRyYW5zbGF0b3IgIT0gbnVsbCkgPyBmVHJhbnNsYXRvci5nZXRKc3BUZXh0KCkgOiAiIjsgIC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGZKc3BUZXh0OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEphdmFQYXRoKCkgewotCQkvLyBjcmVhdGUgaWYgbmVjZXNzYXJ5Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKLQkJcmV0dXJuIChjdSAhPSBudWxsKSA/IGN1LmdldFBhdGgoKS50b1N0cmluZygpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBKYXZhIG9mZnNldCBmb3IgYSBnaXZlIEpTUCBvZmZzZXQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEphdmFPZmZzZXQoaW50IGpzcE9mZnNldCkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWludCBvZmZzZXRJblJhbmdlID0gMDsKLQkJUG9zaXRpb24ganNwUG9zLCBqYXZhUG9zID0gbnVsbDsKLQotCQkvLyBpdGVyYXRlIGFsbCBtYXBwZWQganNwIHJhbmdlcwotCQlJdGVyYXRvciBpdCA9IGZKc3AySmF2YU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlqc3BQb3MgPSAoUG9zaXRpb24pIGl0Lm5leHQoKTsKLQkJCS8vIG5lZWQgdG8gY291bnQgdGhlIGxhc3QgcG9zaXRpb24gYXMgaW5jbHVkZWQKLQkJCWlmICghanNwUG9zLmluY2x1ZGVzKGpzcE9mZnNldCkgJiYgIShqc3BQb3Mub2Zmc2V0K2pzcFBvcy5sZW5ndGggPT0ganNwT2Zmc2V0KSkKLQkJCQljb250aW51ZTsKLQotCQkJb2Zmc2V0SW5SYW5nZSA9IGpzcE9mZnNldCAtIGpzcFBvcy5vZmZzZXQ7Ci0JCQlqYXZhUG9zID0gKFBvc2l0aW9uKSBmSnNwMkphdmFNYXAuZ2V0KGpzcFBvcyk7Ci0JCQlpZihqYXZhUG9zICE9IG51bGwpCi0JCQkJcmVzdWx0ID0gamF2YVBvcy5vZmZzZXQgKyBvZmZzZXRJblJhbmdlOwotCQkJZWxzZSAgewotCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJKYXZhUG9zaXRpb24gd2FzIG51bGwhIiArIGpzcE9mZnNldCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBKU1Agb2Zmc2V0IGZvciBhIGdpdmUgSmF2YSBvZmZzZXQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEpzcE9mZnNldChpbnQgamF2YU9mZnNldCkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWludCBvZmZzZXRJblJhbmdlID0gMDsKLQkJUG9zaXRpb24ganNwUG9zLCBqYXZhUG9zID0gbnVsbDsKLQotCQkvLyBpdGVyYXRlIGFsbCBtYXBwZWQgamF2YSByYW5nZXMKLQkJSXRlcmF0b3IgaXQgPSBmSmF2YTJKc3BNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJamF2YVBvcyA9IChQb3NpdGlvbikgaXQubmV4dCgpOwotCQkJLy8gbmVlZCB0byBjb3VudCB0aGUgbGFzdCBwb3NpdGlvbiBhcyBpbmNsdWRlZAotCQkJaWYgKCFqYXZhUG9zLmluY2x1ZGVzKGphdmFPZmZzZXQpICYmICEoamF2YVBvcy5vZmZzZXQramF2YVBvcy5sZW5ndGggPT0gamF2YU9mZnNldCkpCi0JCQkJY29udGludWU7Ci0KLQkJCW9mZnNldEluUmFuZ2UgPSBqYXZhT2Zmc2V0IC0gamF2YVBvcy5vZmZzZXQ7Ci0JCQlqc3BQb3MgPSAoUG9zaXRpb24pIGZKYXZhMkpzcE1hcC5nZXQoamF2YVBvcyk7Ci0JCQkKLQkJCWlmKGpzcFBvcyAhPSBudWxsKQotCQkJCXJlc3VsdCA9IGpzcFBvcy5vZmZzZXQgKyBvZmZzZXRJblJhbmdlOwotCQkJZWxzZSAgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAianNwUG9zaXRpb24gd2FzIG51bGwhIiArIGphdmFPZmZzZXQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlicmVhazsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQkKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRJbmNsdWRlZFBhdGhzKCkgewotCQlyZXR1cm4gZkluY2x1ZGVkUGF0aHM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBhIG1hcCBvZiBQb3NpdGlvbnMgaW4gdGhlIEphdmEgZG9jdW1lbnQgdG8gY29ycmVzcG9uZGluZyBQb3NpdGlvbnMgaW4gdGhlIEpTUCBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBIYXNoTWFwIGdldEphdmEySnNwTWFwKCkgewotCQlyZXR1cm4gZkphdmEySnNwTWFwOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgb2YgUG9zaXRpb25zIGluIHRoZSBKU1AgZG9jdW1lbnQgdG8gY29ycmVzcG9uZGluZyBQb3NpdGlvbnMgaW4gdGhlIEphdmEgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSGFzaE1hcCBnZXRKc3AySmF2YU1hcCgpIHsKLQkJcmV0dXJuIGZKc3AySmF2YU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBqYXZhIHJhbmdlIGNvdmVycyBtb3JlIHRoYW4gb25lIHBhcnRpdGlvbiBpbiB0aGUgSlNQIGZpbGUuCi0JICogCi0JICogPHA+Ci0JICogZXguCi0JICogPGNvZGU+Ci0JICogPCUKLQkgKiAJaWYoc3VibWl0KQotCSAqICB7Ci0JICogJT4KLQkgKiAgICA8cD4gcHJpbnQgdGhpcy4uLjwvcD4KLQkgKiAKLQkgKiA8JQotCSAqICB9Ci0JICogIGVsc2UKLQkgKiAgewotCSAqICU+Ci0JICogCSAgIDxwPiBwcmludCB0aGF0Li4uPC9wPgotCSAqIDwlCi0JICogIH0KLQkgKiAlPgotCSAqIDwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogdGhlIGlmIGVsc2Ugc3RhdGVtZW50IGFib3ZlIHNwYW5zIDMgSlNQIHBhcnRpdGlvbnMsIHNvIGl0IHdvdWxkIHJldHVybiB0cnVlLgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgamF2YSBjb2RlIHNwYW5zIG11bHRpcGxlIEpTUCBwYXJ0aXRpb25zLCBvdGhlcndpc2UgZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gamF2YVNwYW5zTXVsdGlwbGVKc3BQYXJ0aXRpb25zKGludCBqYXZhT2Zmc2V0LCBpbnQgamF2YUxlbmd0aCkgewotCQlIYXNoTWFwIGphdmEyanNwID0gZ2V0SmF2YTJKc3BNYXAoKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJSXRlcmF0b3IgaXQgPSBqYXZhMmpzcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlQb3NpdGlvbiBqYXZhUmFuZ2UgPSBudWxsOwotCQl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLQkJCWphdmFSYW5nZSA9IChQb3NpdGlvbilpdC5uZXh0KCk7Ci0JCQlpZihqYXZhUmFuZ2Uub3ZlcmxhcHNXaXRoKGphdmFPZmZzZXQsIGphdmFMZW5ndGgpKQotCQkJCWNvdW50Kys7Ci0JCQlpZihjb3VudCA+IDEpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKYXZhIHBvc2l0aW9ucyBmb3IgdGhlIGdpdmVuIHJhbmdlIGluIHRoZSBKYXZhIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBQb3NpdGlvbltdIGdldEphdmFSYW5nZXMoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCi0JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXQgPSBnZXRKYXZhMkpzcE1hcCgpLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCVBvc2l0aW9uIHAgPSBudWxsOwotCQl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLQkJCXAgPSAoUG9zaXRpb24paXQubmV4dCgpOwotCQkJaWYocC5vdmVybGFwc1dpdGgob2Zmc2V0LCBsZW5ndGgpKQotCQkJCXJlc3VsdHMuYWRkKHApOwotCQl9Ci0JCXJldHVybiAoUG9zaXRpb25bXSlyZXN1bHRzLnRvQXJyYXkobmV3IFBvc2l0aW9uW3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIEluZGljYXRlcyBpZiB0aGUgamF2YSBPZmZzZXQgZmFsbHMgd2l0aGluIHRoZSB1c2VyIGltcG9ydCByYW5nZXMKLQkgKiBAcGFyYW0gamF2YU9mZnNldAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgamF2YSBPZmZzZXQgZmFsbHMgd2l0aGluIHRoZSB1c2VyIGltcG9ydCByYW5nZXMsIG90aGVyd2lzZSBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW1wb3J0KGludCBqYXZhT2Zmc2V0KSB7Ci0JCXJldHVybiBpc0luUmFuZ2VzKGphdmFPZmZzZXQsIGZKYXZhMkpzcEltcG9ydHNNYXApOwotCX0KLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiB0aGUgamF2YSBvZmZzZXQgZmFsbHMgd2l0aGluIHRoZSB1c2UgYmVhbiByYW5nZXMKLQkgKiBAcGFyYW0gamF2YU9mZnNldAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgamF2YSBvZmZzZXQgZmFsbHMgd2l0aGluIHRoZSB1c2VyIGltcG9ydCByYW5nZXMsIG90aGVyd2lzZSBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXNlQmVhbihpbnQgamF2YU9mZnNldCkgewotCQlyZXR1cm4gaXNJblJhbmdlcyhqYXZhT2Zmc2V0LCBmSmF2YTJKc3BVc2VCZWFuTWFwKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGphdmFQb3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbmRpcmVjdChpbnQgamF2YU9mZnNldCkgewotCQlyZXR1cm4gaXNJblJhbmdlcyhqYXZhT2Zmc2V0LCBmSmF2YTJKc3BJbmRpcmVjdE1hcCwgZmFsc2UpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNJblJhbmdlcyhpbnQgamF2YU9mZnNldCwgSGFzaE1hcCByYW5nZXMpIHsKLQkJcmV0dXJuIGlzSW5SYW5nZXMoamF2YU9mZnNldCwgcmFuZ2VzLCB0cnVlKTsKLQl9Ci0JLyoqCi0JICogVGVsbHMgeW91IGlmIHRoZSBnaXZlbiBvZmZzZXQgaXMgaW5jbHVkZWQgaW4gYW55IG9mIHRoZSByYW5nZXMgKFBvc2l0aW9ucykgcGFzc2VkIGluLgotCSAqIGluY2x1ZGVFbmRPZmZzZXQgdGVsbHMgd2hldGhlciBvciBub3QgdG8gaW5jbHVkZSB0aGUgZW5kIG9mZnNldCBvZiBlYWNoIHJhbmdlIGluIHRoZSB0ZXN0LgotCSAqIAotCSAqIEBwYXJhbSBqYXZhT2Zmc2V0Ci0JICogQHBhcmFtIHJhbmdlcwotCSAqIEBwYXJhbSBpbmNsdWRlRW5kT2Zmc2V0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luUmFuZ2VzKGludCBqYXZhT2Zmc2V0LCBIYXNoTWFwIHJhbmdlcywgYm9vbGVhbiBpbmNsdWRlRW5kT2Zmc2V0KSB7Ci0JCQotCQlJdGVyYXRvciBpdCA9IHJhbmdlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLQkJCVBvc2l0aW9uIGphdmFQb3MgPSAoUG9zaXRpb24paXQubmV4dCgpOwotCQkJLy8gYWxzbyBpbmNsdWRlIHRoZSBzdGFydCBhbmQgZW5kIG9mZnNldCAob25seSBpZiByZXF1ZXN0ZWQpCi0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODE2ODcKLQkJCWlmKGphdmFQb3MuaW5jbHVkZXMoamF2YU9mZnNldCkgfHwgKGluY2x1ZGVFbmRPZmZzZXQgJiYgamF2YVBvcy5vZmZzZXQramF2YVBvcy5sZW5ndGggPT0gamF2YU9mZnNldCkpIAotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgQ29tcGlsYXRpb25Vbml0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIEpTUFRyYW5zbGF0aW9uICh0aGlzIHBhcnRpY3VsYXIgbW9kZWwpCi0JICogV2hlbiB1c2luZyBtZXRob2RzIG9uIHRoZSBDVSwgaXQncyByZWNjb21lbmRlZCB0byBzeW5jaHJvbml6ZSBvbiB0aGUgQ1UgZm9yIHJlbGlhYmxlCi0JICogcmVzdWx0cy4KLQkgKiAKLQkgKiBUaGUgbWV0aG9kIGlzIHN5bmNocm9uaXplZCB0byBlbnN1cmUgdGhhdCA8Y29kZT5jcmVhdGVDb21wbGlsYXRpb25Vbml0PC9jb2RlPiBkb2Vzbid0Ci0JICogZ2V0IGVudGVyZWQgMiBvciBtb3JlIHRpbWVzIHNpbXVsdGFuZW91c2x5LiAgQSBzaWRlIGVmZmVjdCBvZiB0aGF0IGlzIDIgY29tcGlsYXRpb24gdW5pdHMKLQkgKiBjYW4gYmUgY3JlYXRlZCBpbiB0aGUgSmF2YU1vZGVsTWFuYWdlciwgYnV0IHdlIG9ubHkgaG9sZCBvbmUgcmVmZXJlbmNlIHRvIGl0IGluIAotCSAqIGZDb21waWxhdGlvblVuaXQuICBUaGlzIHdvdWxkIGxlYWQgdG8gYSBsZWFrIHNpbmNlIG9ubHkgb25lIGluc3RhbmNlIG9mIHRoZSBDVSBpcwotCSAqIGRpc2NhcmRlZCBpbiB0aGUgPGNvZGU+cmVsZWFzZSgpPC9jb2RlPiBtZXRob2QuCi0JICogCi0JICogQHJldHVybiBhIENvbXBpbGF0aW9uVW5pdCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEpTUFRyYW5zbGF0aW9uCi0JICovCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCkgewotCQlzeW5jaHJvbml6ZWQoZkxvY2spIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZDb21waWxhdGlvblVuaXQgPT0gbnVsbCkgewotCQkJCQlmQ29tcGlsYXRpb25Vbml0ID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCQlpZihERUJVRykKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXJyb3IgY3JlYXRpbmcgSlNQIHdvcmtpbmcgY29weS4uLiAiLCBqbWUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZDb21waWxhdGlvblVuaXQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWFuZ2xlZE5hbWUoKSB7Ci0JCXJldHVybiBmTWFuZ2xlZE5hbWU7Ci0JfQotCXByaXZhdGUgdm9pZCBzZXRNYW5nbGVkTmFtZShTdHJpbmcgbWFuZ2xlZE5hbWUpIHsKLQkJZk1hbmdsZWROYW1lID0gbWFuZ2xlZE5hbWU7Ci0JfQotCXByaXZhdGUgU3RyaW5nIGdldEpzcE5hbWUoKSB7Ci0JCXJldHVybiBmSnNwTmFtZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0SnNwTmFtZShTdHJpbmcganNwTmFtZSkgewotCQlmSnNwTmFtZSA9IGpzcE5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZXMgbWFuZ2xlZCAoc2VydmxldCkgbmFtZSB3aXRoIGpzcCBmaWxlIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGRpc3BsYXlTdHJpbmcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBmaXh1cE1hbmdsZWROYW1lKFN0cmluZyBkaXNwbGF5U3RyaW5nKSB7Ci0JCQotCQlpZihkaXNwbGF5U3RyaW5nID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWlmKGdldEpzcE5hbWUoKSA9PSBudWxsIHx8IGdldE1hbmdsZWROYW1lKCkgPT0gbnVsbCkgewotCQkJLy8gbmFtZXMgbm90IHNldCB5ZXQKLQkJCWluaXRKc3BBbmRTZXJ2bGV0TmFtZXMoKTsKLQkJfQotCQlyZXR1cm4gZGlzcGxheVN0cmluZy5yZXBsYWNlQWxsKGdldE1hbmdsZWROYW1lKCksIGdldEpzcE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRKc3BBbmRTZXJ2bGV0TmFtZXMoKSB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKLQkJaWYoY3UgIT0gbnVsbCkgewotCQkJU3RyaW5nIGN1TmFtZSA9IG51bGw7Ci0JCQlzeW5jaHJvbml6ZWQoY3UpIHsKLQkJCQkvLyBzZXQgc29tZSBuYW1lcyBmb3IgZml4aW5nIHVwIG1hbmdsZWQgbmFtZSBpbiBwcm9wb3NhbHMKLQkJCQkvLyBzZXQgbWFuZ2xlZCAoc2VydmxldCkgbmFtZQotCQkJCSBjdU5hbWUgPSBjdS5nZXRQYXRoKCkubGFzdFNlZ21lbnQoKTsKLQkJCX0KLQkJCWlmKGN1TmFtZSAhPSBudWxsKSB7Ci0JCQkJc2V0TWFuZ2xlZE5hbWUoY3VOYW1lLnN1YnN0cmluZygwLCBjdU5hbWUubGFzdEluZGV4T2YoJy4nKSkpOwotCQkJCS8vIHNldCBuYW1lIG9mIGpzcCBmaWxlCi0JCQkJU3RyaW5nIHVubWFuZ2xlZCA9IEpTUDJTZXJ2bGV0TmFtZVV0aWwudW5tYW5nbGUoY3VOYW1lKTsKLQkJCQlzZXRKc3BOYW1lKHVubWFuZ2xlZC5zdWJzdHJpbmcodW5tYW5nbGVkLmxhc3RJbmRleE9mKCcvJykgKyAxLCB1bm1hbmdsZWQubGFzdEluZGV4T2YoJy4nKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogT3JpZ2luYWxseSBmcm9tIFJlY29uY2lsZVN0ZXBGb3JKYXZhLiAgQ3JlYXRlcyBhbiBJQ29tcGlsYXRpb25Vbml0IGZyb20gdGhlIGNvbnRlbnRzIG9mIHRoZSBKU1AgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiBhbiBJQ29tcGlsYXRpb25Vbml0IGZyb20gdGhlIGNvbnRlbnRzIG9mIHRoZSBKU1AgZG9jdW1lbnQKLQkgKi8KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQotCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IG51bGw7Ci0JCUlKYXZhRWxlbWVudCBqZSA9IGdldEphdmFQcm9qZWN0KCk7Ci0KLQkJaWYgKGplID09IG51bGwgfHwgIWplLmV4aXN0cygpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJc3dpdGNoIChqZS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UIDoKLQkJCQlqZSA9IGplLmdldFBhcmVudCgpOwotCQkJLy8gZmFsbCB0aHJvdWdoCi0KLQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCA6Ci0JCQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgamU7Ci0JCQkJcGFja2FnZUZyYWdtZW50ID0gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoSVBhY2thZ2VGcmFnbWVudFJvb3QuREVGQVVMVF9QQUNLQUdFUk9PVF9QQVRIKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUIDoKLQkJCQlJSmF2YVByb2plY3QgalByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBqZTsKLQotCQkJCWlmICghalByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKiogQWJvcnQgY3JlYXRlIHdvcmtpbmcgY29weTogY2Fubm90IGNyZWF0ZSB3b3JraW5nIGNvcHk6IEpTUCBpcyBub3QgaW4gYSBKYXZhIHByb2plY3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXBhY2thZ2VGcmFnbWVudFJvb3QgPSBudWxsOwotCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcGFja2FnZUZyYWdtZW50Um9vdHMgPSBqUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQkJCWludCBpID0gMDsKLQkJCQl3aGlsZSAoaSA8IHBhY2thZ2VGcmFnbWVudFJvb3RzLmxlbmd0aCkgewotCQkJCQlpZiAoIXBhY2thZ2VGcmFnbWVudFJvb3RzW2ldLmlzQXJjaGl2ZSgpICYmICFwYWNrYWdlRnJhZ21lbnRSb290c1tpXS5pc0V4dGVybmFsKCkpIHsKLQkJCQkJCXBhY2thZ2VGcmFnbWVudFJvb3QgPSBwYWNrYWdlRnJhZ21lbnRSb290c1tpXTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQkJaWYgKHBhY2thZ2VGcmFnbWVudFJvb3QgPT0gbnVsbCkgewotCQkJCQlpZihERUJVRykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiBBYm9ydCBjcmVhdGUgd29ya2luZyBjb3B5OiBjYW5ub3QgY3JlYXRlIHdvcmtpbmcgY29weTogSlNQIGlzIG5vdCBpbiBhIEphdmEgcHJvamVjdCB3aXRoIHNvdXJjZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlwYWNrYWdlRnJhZ21lbnQgPSBwYWNrYWdlRnJhZ21lbnRSb290LmdldFBhY2thZ2VGcmFnbWVudChJUGFja2FnZUZyYWdtZW50Um9vdC5ERUZBVUxUX1BBQ0tBR0VST09UX1BBVEgpOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHBhY2thZ2VGcmFnbWVudC5nZXRDb21waWxhdGlvblVuaXQoZ2V0Q2xhc3NuYW1lKCkgKyAiLmphdmEiKS5nZXRXb3JraW5nQ29weShnZXRXb3JraW5nQ29weU93bmVyKCksIGdldFByb2JsZW1SZXF1ZXN0b3IoKSwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOyAvLyROT04tTkxTLTEkCi0JCXNldENvbnRlbnRzKGN1KTsKLQotCQlpZihERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKCspIEpTUFRyYW5zbGF0aW9uIFsiKyB0aGlzICsgIl0gZmluaXNoZWQgY3JlYXRpbmcgQ29tcGlsYXRpb25Vbml0OiAiICsgY3UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCXJldHVybiBjdTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9ibGVtIHJlcXVlc3RvciBmb3IgdGhlIENvbXBpbGF0aW9uVW5pdCBpbiB0aGlzIEpTUFRyYW5zbGF0aW9uCi0JICovCi0JcHJpdmF0ZSBKU1BQcm9ibGVtUmVxdWVzdG9yIGdldFByb2JsZW1SZXF1ZXN0b3IoKSB7Ci0JICAgIHJldHVybiBDb21waWxhdGlvblVuaXRIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRQcm9ibGVtUmVxdWVzdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgSVdvcmtpbmdDb3B5T3duZXIgZm9yIHRoaXMgQ29tcGlsYXRpb25Vbml0IGluIHRoaXMgSlNQVHJhbnNsYXRpb24KLQkgKi8KLQlwdWJsaWMgV29ya2luZ0NvcHlPd25lciBnZXRXb3JraW5nQ29weU93bmVyKCkgewotCSAgICByZXR1cm4gQ29tcGlsYXRpb25Vbml0SGVscGVyLmdldEluc3RhbmNlKCkuZ2V0V29ya2luZ0NvcHlPd25lcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb2dyZXNzIG1vbml0b3IgdXNlZCBpbiBsb25nIG9wZXJhdGlvbnMgKHJlY29uY2lsZSwgY3JlYXRpbmcgdGhlIENvbXBpbGF0aW9uVW5pdC4uLikgaW4gdGhpcyBKU1BUcmFuc2xhdGlvbgotCSAqLwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCWlmIChmUHJvZ3Jlc3NNb25pdG9yID09IG51bGwpCi0JCQlmUHJvZ3Jlc3NNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJcmV0dXJuIGZQcm9ncmVzc01vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgTGlzdCBvZiBwcm9ibGVtcyBjb2xsZWN0ZWQgZHVyaW5nIHJlY29uY2lsZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb2JsZW1zKCkgewotCQlMaXN0IHByb2JsZW1zID0gZ2V0UHJvYmxlbVJlcXVlc3RvcigpLmdldENvbGxlY3RlZFByb2JsZW1zKCk7Ci0JCWlmIChwcm9ibGVtcyAhPSBudWxsKSB7Ci0JCQlpZiAoZlRyYW5zbGF0aW9uUHJvYmxlbXMuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuIHByb2JsZW1zOwotCQkJfQotCQkJTGlzdCBjb21iaW5lZFByb2JsZW1zID0gbmV3IEFycmF5TGlzdChwcm9ibGVtcyk7Ci0JCQljb21iaW5lZFByb2JsZW1zLmFkZEFsbChmVHJhbnNsYXRpb25Qcm9ibGVtcyk7Ci0JCQlyZXR1cm4gY29tYmluZWRQcm9ibGVtczsKLQkJfQotCQlyZXR1cm4gZlRyYW5zbGF0aW9uUHJvYmxlbXM7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIExpc3Qgb2YgcHJvYmxlbXMgY29sbGVjdGVkIGR1cmluZyByZWNvbmNpbGUgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFTFByb2JsZW1zKCkgewotCQlyZXR1cm4gZkVMUHJvYmxlbXMgIT0gbnVsbCA/IGZFTFByb2JsZW1zIDogbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCi0JLyoqCi0JICogTXVzdCBiZSBzZXQgdHJ1ZSBpbiBvcmRlciBmb3IgcHJvYmxlbXMgdG8gYmUgY29sbGVjdGVkIGR1cmluZyByZWNvbmNpbGUuCi0JICogSWYgc2V0IGZhbHNlLCBwcm9ibGVtcyB3aWxsIGJlIGlnbm9yZWQgZHVyaW5nIHJlY29uY2lsZS4KLQkgKiBAcGFyYW0gY29sbGVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2JsZW1Db2xsZWN0aW5nQWN0aXZlKGJvb2xlYW4gY29sbGVjdCkgewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCWlmKGN1ICE9IG51bGwpIHsJCi0JCQlnZXRQcm9ibGVtUmVxdWVzdG9yKCkuc2V0SXNBY3RpdmUoY29sbGVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWNvbmNpbGVzIHRoZSBjb21waWxhdGlvbiB1bml0IGZvciB0aGlzIEpTUFRyYW5zbGF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcmVjb25jaWxlQ29tcGlsYXRpb25Vbml0KCkgewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCWlmIChjdSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXN5bmNocm9uaXplZChjdSkgewotCQkJCQljdS5tYWtlQ29uc2lzdGVudChnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCWN1LnJlY29uY2lsZShJQ29tcGlsYXRpb25Vbml0Lk5PX0FTVCwgdHJ1ZSwgZ2V0V29ya2luZ0NvcHlPd25lcigpLCBnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCBjb250ZW50cyBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCB0byB0aGUgdHJhbnNsYXRlZCBqc3AgdGV4dC4KLQkgKiBAcGFyYW0gdGhlIElDb21waWxhdGlvblVuaXQgb24gd2hpY2ggdG8gc2V0IHRoZSBidWZmZXIgY29udGVudHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0Q29udGVudHMoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlpZiAoY3UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCXN5bmNocm9uaXplZCAoY3UpIHsKLQkJCUlCdWZmZXIgYnVmZmVyOwotCQkJdHJ5IHsKLQkJCQkKLQkJCQlidWZmZXIgPSBjdS5nZXRCdWZmZXIoKTsKLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJYnVmZmVyID0gbnVsbDsKLQkJCX0KLQkKLQkJCWlmIChidWZmZXIgIT0gbnVsbCkKLQkJCQlidWZmZXIuc2V0Q29udGVudHMoZ2V0SmF2YVRleHQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJSmF2YUVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEpTUCByYW5nZSBpbiB0aGUgSlNQIFN0cnVjdHVyZWREb2N1bWVudAotCSAqIAotCSAqIEBwYXJhbSBqc3BTdGFydCBzdGFyaW5nIG9mZnNldCBpbiB0aGUgSlNQIGRvY3VtZW50Ci0JICogQHBhcmFtIGpzcEVuZCBlbmRpbmcgb2Zmc2V0IGluIHRoZSBKU1AgZG9jdW1lbnQKLQkgKiBAcmV0dXJuIElKYXZhRWxlbWVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgSlNQIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBJSmF2YUVsZW1lbnRbXSBnZXRFbGVtZW50c0Zyb21Kc3BSYW5nZShpbnQganNwU3RhcnQsIGludCBqc3BFbmQpIHsKLQotCQlpbnQgamF2YVBvc2l0aW9uU3RhcnQgPSBnZXRKYXZhT2Zmc2V0KGpzcFN0YXJ0KTsKLQkJaW50IGphdmFQb3NpdGlvbkVuZCA9IGdldEphdmFPZmZzZXQoanNwRW5kKTsKLQotCQlJSmF2YUVsZW1lbnRbXSBFTVRQWV9SRVNVTFRfU0VUID0gbmV3IElKYXZhRWxlbWVudFswXTsKLQkJSUphdmFFbGVtZW50W10gcmVzdWx0ID0gRU1UUFlfUkVTVUxUX1NFVDsKLQkJdHJ5IHsKLQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCWlmIChjdSAhPSBudWxsKSB7Ci0JCQkJc3luY2hyb25pemVkIChjdSkgewotCQkJCQlpbnQgY3VEb2NMZW5ndGggPSBjdS5nZXRCdWZmZXIoKS5nZXRMZW5ndGgoKTsKLQkJCQkJaW50IGphdmFMZW5ndGggPSBqYXZhUG9zaXRpb25FbmQgLSBqYXZhUG9zaXRpb25TdGFydDsKLQkJCQkJaWYgKGN1RG9jTGVuZ3RoID4gMCAmJiBqYXZhUG9zaXRpb25TdGFydCA+PSAwICYmIGphdmFMZW5ndGggPj0gMCAmJiBqYXZhUG9zaXRpb25FbmQgPCBjdURvY0xlbmd0aCkgewotCQkJCQkJcmVzdWx0ID0gY3UuY29kZVNlbGVjdChqYXZhUG9zaXRpb25TdGFydCwgamF2YUxlbmd0aCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQubGVuZ3RoID09IDApCi0JCQkJcmV0dXJuIEVNVFBZX1JFU1VMVF9TRVQ7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiB4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKHgpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzbmFtZSgpIHsKLQkJcmV0dXJuIGZDbGFzc25hbWU7Ci0JfQotCi0JLyoqCi0JICogTXVzdCBkaXNjYXJkIGNvbXBpbGF0aW9uIHVuaXQsIG9yIGVsc2UgdGhleSBjYW4gbGVhayBpbiB0aGUgSmF2YU1vZGVsTWFuYWdlcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCQotCQlzeW5jaHJvbml6ZWQoZkxvY2spIHsKLQkJCWlmKGZDb21waWxhdGlvblVuaXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlmKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigtKSBKU1BUcmFuc2xhdGlvbiBbIiArIHRoaXMgKyJdIGRpc2NhcmRpbmcgQ29tcGlsYXRpb25Vbml0OiAiICsgZkNvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWZDb21waWxhdGlvblVuaXQuZGlzY2FyZFdvcmtpbmdDb3B5KCk7CQotCQkJCX0gCi0JCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHdlJ3JlIGRvbmUgdy8gaXQgYW55d2F5Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGI2Yzg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLS8qKgotICogQW4gYWRhcHRlciBmb3IgZ2V0dGluZyBhIEpTUFRyYW5zbGF0aW9uIG9mIHRoZSBkb2N1bWVudC4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFRyYW5zbGF0aW9uQWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciwgSURvY3VtZW50TGlzdGVuZXIgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHRyYW5zbGF0aW9uIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIElEb2N1bWVudCBmSnNwRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgSURvY3VtZW50IGZKYXZhRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgSlNQVHJhbnNsYXRpb25FeHRlbnNpb24gZkpTUFRyYW5zbGF0aW9uID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZkRvY3VtZW50SXNEaXJ0eSA9IHRydWU7Ci0JcHJpdmF0ZSBJRE9NTW9kZWwgZlhNTE1vZGVsOwotCXByaXZhdGUgSlNQVHJhbnNsYXRvciBmVHJhbnNsYXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBOdWxsUHJvZ3Jlc3NNb25pdG9yIGZUcmFuc2xhdGlvbk1vbml0b3IgPSBudWxsOwotCi0JcHVibGljIEpTUFRyYW5zbGF0aW9uQWRhcHRlcihJRE9NTW9kZWwgeG1sTW9kZWwpIHsKLQkJc2V0WE1MTW9kZWwoeG1sTW9kZWwpOwotCQlpbml0aWFsaXplSmF2YVBsdWdpbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSByZXF1aXJlZCBKYXZhIFBsdWdpbnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSmF2YVBsdWdpbnMoKSB7Ci0JCUphdmFDb3JlLmdldFBsdWdpbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUuZXF1YWxzKElKU1BUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci0KLQkvKioKLQkgKiBBdXRvbWF0aWNhbGx5IHNldCB0aHJvdWdoIHRoZSBzZXRYTUxNb2RlbChYTUxNb2RlbCkKLQkgKiAKLQkgKiBAcGFyYW0gZG9jCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2MpIHsKLQkJaWYgKGZKc3BEb2N1bWVudCAhPSBudWxsKQotCQkJZkpzcERvY3VtZW50LnJlbW92ZURvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JCWlmIChkb2MgIT0gbnVsbCkgewotCQkJZG9jLmFkZERvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JCQlmSnNwRG9jdW1lbnQgPSBkb2M7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIjZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyI2RvY3VtZW50Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJLy8gbWFyayB0cmFuc2xhdGlvbiBmb3IgcmVidWlsZGluZwotCQlmRG9jdW1lbnRJc0RpcnR5ID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCi0JCWlmIChmSnNwRG9jdW1lbnQgIT0gbnVsbCkKLQkJCWZKc3BEb2N1bWVudC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCi0JCWlmIChmVHJhbnNsYXRpb25Nb25pdG9yICE9IG51bGwpCi0JCQlmVHJhbnNsYXRpb25Nb25pdG9yLnNldENhbmNlbGVkKHRydWUpOwotCi0JCWlmIChmSlNQVHJhbnNsYXRpb24gIT0gbnVsbCkgewotCi0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgcmVsZWFzaW5nOiIgKyBmSlNQVHJhbnNsYXRpb24pOyAvLyROT04tTkxTLTEkCi0KLQkJCWZKU1BUcmFuc2xhdGlvbi5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKU1BUcmFuc2xhdGlvbiBmb3IgdGhpcyBhZGFwdGVyLgotCSAqIAotCSAqIEByZXR1cm4gYSBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSlNQVHJhbnNsYXRpb25FeHRlbnNpb24gZ2V0SlNQVHJhbnNsYXRpb24oKSB7Ci0KLQkJaWYgKGZKU1BUcmFuc2xhdGlvbiA9PSBudWxsIHx8IGZEb2N1bWVudElzRGlydHkpIHsKLQkJCUpTUFRyYW5zbGF0b3IgdHJhbnNsYXRvciA9IG51bGw7Ci0JCQlpZiAoZ2V0WE1MTW9kZWwoKSAhPSBudWxsICYmIGdldFhNTE1vZGVsKCkuZ2V0SW5kZXhlZFJlZ2lvbigwKSAhPSBudWxsKSB7Ci0JCQkJdHJhbnNsYXRvciA9IGdldFRyYW5zbGF0b3IoKElET01Ob2RlKSBnZXRYTUxNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24oMCkpOwotCQkJCXRyYW5zbGF0b3IudHJhbnNsYXRlKCk7Ci0JCQkJU3RyaW5nQnVmZmVyIGphdmFDb250ZW50cyA9IHRyYW5zbGF0b3IuZ2V0VHJhbnNsYXRpb24oKTsKLQkJCQlmSmF2YURvY3VtZW50ID0gbmV3IERvY3VtZW50KGphdmFDb250ZW50cy50b1N0cmluZygpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGVtcHR5IGRvY3VtZW50IGNhc2UKLQkJCQl0cmFuc2xhdG9yID0gY3JlYXRlVHJhbnNsYXRvcigpOwotCQkJCVN0cmluZ0J1ZmZlciBlbXB0eUNvbnRlbnRzID0gdHJhbnNsYXRvci5nZXRFbXB0eVRyYW5zbGF0aW9uKCk7Ci0JCQkJZkphdmFEb2N1bWVudCA9IG5ldyBEb2N1bWVudChlbXB0eUNvbnRlbnRzLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJLy8gaXQncyBnb2luZyB0byBiZSByZWJ1aWx0LCBzbyB3ZSByZWxlYXNlIGl0IGhlcmUKLQkJCWlmIChmSlNQVHJhbnNsYXRpb24gIT0gbnVsbCkgewotCQkJCWlmIChERUJVRykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgcmVsZWFzaW5nOiIgKyBmSlNQVHJhbnNsYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJZkpTUFRyYW5zbGF0aW9uLnJlbGVhc2UoKTsKLQkJCX0KLQkJCWZKU1BUcmFuc2xhdGlvbiA9IG5ldyBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbihnZXRYTUxNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBmSmF2YURvY3VtZW50LCBnZXRKYXZhUHJvamVjdCgpLCB0cmFuc2xhdG9yKTsKLQkJCWZEb2N1bWVudElzRGlydHkgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZkpTUFRyYW5zbGF0aW9uOwotCX0KLQotCUpTUFRyYW5zbGF0b3IgY3JlYXRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBKU1BUcmFuc2xhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSlNQVHJhbnNsYXRvciBmb3IgdGhpcyBhZGFwdGVyLiBJZiBpdCdzIG51bGwsIGEgbmV3Ci0JICogdHJhbnNsYXRvciBpcyBjcmVhdGVkIHdpdGggdGhlIHhtbE5vZGUuIE90aGVyd2lzZSB0aGUKLQkgKiB0cmFuc2xhdG9yLnJlc2V0KHhtbE5vZGUpIGlzIGNhbGxlZCB0byByZXNldCB0aGUgY3VycmVudCBsb2NhbAotCSAqIHRyYW5zbGF0b3IuCi0JICogCi0JICogQHBhcmFtIHhtbE5vZGUKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBub2RlIG9mIHRoZSBKU1AgZG9jdW1lbnQgdG8gYmUgdHJhbnNsYXRlZAotCSAqIEByZXR1cm4gdGhlIEpTUFRyYW5zbGF0b3IgZm9yIHRoaXMgYWRhcHRlciAoY3JlYXRlcyBpZiBudWxsKQotCSAqLwotCXByaXZhdGUgSlNQVHJhbnNsYXRvciBnZXRUcmFuc2xhdG9yKElET01Ob2RlIHhtbE5vZGUpIHsKLQkJaWYgKGZUcmFuc2xhdG9yID09IG51bGwpIHsKLQkJCWZUcmFuc2xhdGlvbk1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJZlRyYW5zbGF0b3IgPSBjcmVhdGVUcmFuc2xhdG9yKCk7Ci0JCQlmVHJhbnNsYXRvci5yZXNldCh4bWxOb2RlLCBmVHJhbnNsYXRpb25Nb25pdG9yKTsKLQkJfQotCQllbHNlCi0JCQlmVHJhbnNsYXRvci5yZXNldCh4bWxOb2RlLCBmVHJhbnNsYXRpb25Nb25pdG9yKTsKLQkJcmV0dXJuIGZUcmFuc2xhdG9yOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgWE1MTW9kZWwgZm9yIHRoaXMgYWRhcHRlci4gTXVzdCBiZSBjYWxsZWQuCi0JICogCi0JICogQHBhcmFtIHhtbE1vZGVsCi0JICovCi0JcHVibGljIHZvaWQgc2V0WE1MTW9kZWwoSURPTU1vZGVsIHhtbE1vZGVsKSB7Ci0JCWZYTUxNb2RlbCA9IHhtbE1vZGVsOwotCQlzZXREb2N1bWVudChmWE1MTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIFhNTE1vZGVsIGZvciB0aGlzIGFkYXB0ZXIuCi0JICovCi0JcHJpdmF0ZSBJRE9NTW9kZWwgZ2V0WE1MTW9kZWwoKSB7Ci0JCXJldHVybiBmWE1MTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyAob3IgY3JlYXRlcyB2aWEgSmF2YUNvcmUpIGEgSmF2YVByb2plY3QgYmFzZWQgb24gdGhlIGxvY2F0aW9uIG9mCi0JICogdGhpcyBhZGFwdGVyJ3MgWE1MTW9kZWwuIFJldHVybnMgbnVsbCBmb3Igbm9uIElGaWxlIGJhc2VkIG1vZGVscy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBqYXZhIHByb2plY3Qgd2hlcmUKLQkgKi8KLQlwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCi0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gZ2V0WE1MTW9kZWwoKS5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCS8vIDIwMDQxMTI5IChwYSkgdGhlIGJhc2UgbG9jYXRpb24gY2hhbmdlZCBmb3IgWE1MIG1vZGVsCi0JCQkvLyBiZWNhdXNlIG9mIEZpbGVCdWZmZXJzLCBzbyB0aGlzIGNvZGUgaGFkIHRvIGJlIHVwZGF0ZWQKLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03OTY4NgotCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQlJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKGJhc2VMb2NhdGlvbik7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJCWlmIChmaWxlUGF0aC5zZWdtZW50Q291bnQoKSA+IDApIHsKLQkJCQlwcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KGZpbGVQYXRoLnNlZ21lbnQoMCkpOwotCQkJfQotLy8JCQlJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihuZXcgUGF0aChiYXNlTG9jYXRpb24pKTsKLS8vCQkJZm9yIChpbnQgaSA9IDA7IHByb2plY3QgPT0gbnVsbCAmJiBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLS8vCQkJCWlmIChmaWxlc1tpXS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLS8vCQkJCQlwcm9qZWN0ID0gZmlsZXNbaV0uZ2V0UHJvamVjdCgpOwotLy8JCQkJCWJyZWFrOwotLy8JCQkJfQotLy8JCQl9Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGdldFhNTE1vZGVsKCkgIT0gbnVsbCkKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCIoSlNQVHJhbnNsYXRpb25BZGFwdGVyKSBwcm9ibGVtIGdldHRpbmcgamF2YSBwcm9qZWN0IGZyb20gdGhlIFhNTE1vZGVsJ3MgYmFzZUxvY2F0aW9uID4gIiArIGdldFhNTE1vZGVsKCkuZ2V0QmFzZUxvY2F0aW9uKCksIGV4KTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIihKU1BUcmFuc2xhdGlvbkFkYXB0ZXIpIHByb2JsZW0gZ2V0dGluZyBqYXZhIHByb2plY3QiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gamF2YVByb2plY3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZTBiNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJzLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICogIAotICovCi1wdWJsaWMgY2xhc3MgSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgewotCi0JcHJpdmF0ZSBKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgZkFkYXB0ZXIgPSBudWxsOwotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gQm9vbGVhbi52YWx1ZU9mKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwdHJhbnNsYXRpb24iKSkuYm9vbGVhblZhbHVlKCk7IC8vJE5PTi1OTFMtMSQ7Ci0JCi0JcHVibGljIEpTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKElKU1BUcmFuc2xhdGlvbi5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIG5ldyBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRE9NTm9kZSAmJiBmQWRhcHRlciA9PSBudWxsKSB7Ci0JCQlmQWRhcHRlciA9IG5ldyBKU1BUcmFuc2xhdGlvbkFkYXB0ZXIoKChJRE9NTm9kZSkgdGFyZ2V0KS5nZXRNb2RlbCgpKTsKLQkJCWlmKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIoKykgSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSBbIiArIHRoaXMgKyAiXSBjcmVhdGVkIGFkYXB0ZXI6ICIgKyBmQWRhcHRlcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JCXJldHVybiBmQWRhcHRlcjsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChmQWRhcHRlciAhPSBudWxsKSB7Ci0JCQlpZihERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKC0pIEpTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkgWyIgKyB0aGlzICsgIl0gcmVsZWFzaW5nIGFkYXB0ZXI6ICIgKyBmQWRhcHRlcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJZkFkYXB0ZXIucmVsZWFzZSgpOwotCQl9Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb25FeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbkV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmVkNDA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbkV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlRvb2xGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5Db2RlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5EZWxldGVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuSW5zZXJ0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlVuZG9FZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLQotLyoqCi0gKiBBZGRzIHRoZSBub3Rpb24gb2YgSURvY3VtZW50cyAoanNwIERvY3VtZW50IGFuZCBqYXZhIERvY3VtZW50KSBVc2VkIGZvcgotICogVGV4dEVkaXQgdHJhbnNsYXRpb24KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uIGV4dGVuZHMgSlNQVHJhbnNsYXRpb24gewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3B0cmFuc2xhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBqdXN0IGEgY29udmVuaWVuY2UgZGF0YSBzdHJ1Y3R1cmUKLQkvLyB0byBrZWVwIHRyYWNrIG9mIGphdmEgcG9zaXRpb24gZGVsdGFzCi0JcHJpdmF0ZSBjbGFzcyBQb3NpdGlvbkRlbHRhIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQgPSBmYWxzZTsKLQkJcHVibGljIGludCBwcmVPZmZzZXQgPSAwOwotCQlwdWJsaWMgaW50IHByZUxlbmd0aCA9IDA7Ci0JCXB1YmxpYyBpbnQgcG9zdE9mZnNldCA9IDA7Ci0JCXB1YmxpYyBpbnQgcG9zdExlbmd0aCA9IDA7Ci0KLQkJcHVibGljIFBvc2l0aW9uRGVsdGEoaW50IHByZU9mZnNldCwgaW50IHByZUxlbmd0aCkgewotCQkJdGhpcy5wcmVPZmZzZXQgPSBwcmVPZmZzZXQ7Ci0JCQl0aGlzLnByZUxlbmd0aCA9IHByZUxlbmd0aDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFBvc3RFZGl0RGF0YShpbnQgcG9zdE9mZnNldCwgaW50IHBvc3RMZW5ndGgsIGJvb2xlYW4gaXNEZWxldGVkKSB7Ci0JCQl0aGlzLnBvc3RPZmZzZXQgPSBwb3N0T2Zmc2V0OwotCQkJdGhpcy5wb3N0TGVuZ3RoID0gcG9zdExlbmd0aDsKLQkJCXRoaXMuaXNEZWxldGVkID0gaXNEZWxldGVkOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkpzcERvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIElEb2N1bWVudCBmSmF2YURvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIENvZGVGb3JtYXR0ZXIgZkNvZGVGb3JtYXR0ZXIgPSBudWxsOwotCi0JcHVibGljIEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uKElEb2N1bWVudCBqc3BEb2N1bWVudCwgSURvY3VtZW50IGphdmFEb2N1bWVudCwgSUphdmFQcm9qZWN0IGphdmFQcm9qLCBKU1BUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJc3VwZXIoamF2YVByb2osIHRyYW5zbGF0b3IpOwotCQlmSnNwRG9jdW1lbnQgPSBqc3BEb2N1bWVudDsKLQkJZkphdmFEb2N1bWVudCA9IGphdmFEb2N1bWVudDsKLQotCQkvLyBtYWtlIHN1cmUgcG9zaXRpb25zIGFyZSBhZGRlZCB0byBKYXZhIGFuZCBKU1AgZG9jdW1lbnRzCi0JCS8vIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciB0ZXh0IGVkaXRzCi0JCWFkZFBvc2l0aW9uc1RvRG9jdW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudCBnZXRKc3BEb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZKc3BEb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50IGdldEphdmFEb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZKYXZhRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhVGV4dCgpIHsKLQkJcmV0dXJuIGdldEphdmFEb2N1bWVudCgpICE9IG51bGwgPyBnZXRKYXZhRG9jdW1lbnQoKS5nZXQoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvcnJlc3BvbmRpbmcgVGV4dEVkaXQgZm9yIHRoZSBKU1AgZmlsZSBnaXZlbiBhIFRleHRFZGl0IGZvcgotCSAqIGEgSmF2YSBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBqYXZhRWRpdAotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgSlNQIGVkaXRzIChub3QgYXBwbGllZCB0byB0aGUgZG9jdW1lbnQgeWV0KQotCSAqLwotCXB1YmxpYyBUZXh0RWRpdCBnZXRKc3BFZGl0KFRleHRFZGl0IGphdmFFZGl0KSB7Ci0KLQkJaWYgKGphdmFFZGl0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlMaXN0IGpzcEVkaXRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWludCBvZmZzZXQgPSBqYXZhRWRpdC5nZXRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aCA9IGphdmFFZGl0LmdldExlbmd0aCgpOwotCi0JCWlmIChqYXZhRWRpdCBpbnN0YW5jZW9mIE11bHRpVGV4dEVkaXQgJiYgamF2YUVkaXQuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPiAwKSB7Ci0KLQkJCUlSZWdpb24gciA9IFRleHRFZGl0LmdldENvdmVyYWdlKGdldEFsbEVkaXRzKGphdmFFZGl0KSk7Ci0JCQlvZmZzZXQgPSByLmdldE9mZnNldCgpOwotCQkJbGVuZ3RoID0gci5nZXRMZW5ndGgoKTsKLQkJfQotCi0JCS8vIGdldCBqYXZhIHJhbmdlcyB0aGF0IHdpbGwgYmUgYWZmZWN0ZWQgYnkgdGhlIGVkaXQKLQkJUG9zaXRpb25bXSBqYXZhUG9zaXRpb25zID0gZ2V0SmF2YVJhbmdlcyhvZmZzZXQsIGxlbmd0aCk7Ci0KLQkJLy8gcmVjb3JkIHBvc2l0aW9uIGRhdGEgYmVmb3JlIHRoZSBjaGFuZ2UKLQkJUG9zaXRpb25bXSBqc3BQb3NpdGlvbnMgPSBuZXcgUG9zaXRpb25bamF2YVBvc2l0aW9ucy5sZW5ndGhdOwotCQlQb3NpdGlvbkRlbHRhW10gZGVsdGFzID0gbmV3IFBvc2l0aW9uRGVsdGFbamF2YVBvc2l0aW9ucy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGphdmFQb3NpdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWRlbHRhc1tpXSA9IG5ldyBQb3NpdGlvbkRlbHRhKGphdmFQb3NpdGlvbnNbaV0ub2Zmc2V0LCBqYXZhUG9zaXRpb25zW2ldLmxlbmd0aCk7Ci0JCQkvLyBpc0luZGlyZWN0IG1lYW5zIHRoZSBwb3NpdGlvbiBkb2Vzbid0IGFjdHVhbGx5IGV4aXN0IGFzIGV4YWN0Ci0JCQkvLyB0ZXh0Ci0JCQkvLyBtYXBwaW5nIGZyb20gamF2YSA8LT4ganNwIChlZy4gYW4gaW1wb3J0IHN0YXRlbWVudCkKLQkJCWlmICghaXNJbmRpcmVjdChqYXZhUG9zaXRpb25zW2ldLm9mZnNldCkpCi0JCQkJanNwUG9zaXRpb25zW2ldID0gKFBvc2l0aW9uKSBnZXRKYXZhMkpzcE1hcCgpLmdldChqYXZhUG9zaXRpb25zW2ldKTsKLQkJfQotCi0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJkZWx0YXM6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBqYXZhVGV4dCA9IGdldEphdmFUZXh0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInBvc1siICsgZGVsdGFzW2ldLnByZU9mZnNldCArICI6IiArIGRlbHRhc1tpXS5wcmVMZW5ndGggKyAiXSIgKyBqYXZhVGV4dC5zdWJzdHJpbmcoZGVsdGFzW2ldLnByZU9mZnNldCwgZGVsdGFzW2ldLnByZU9mZnNldCArIGRlbHRhc1tpXS5wcmVMZW5ndGgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVVuZG9FZGl0IHVuZG8gPSBudWxsOwotCQkvLyBhcHBseSB0aGUgZWRpdCB0byB0aGUgamF2YSBkb2N1bWVudAotCQl0cnkgewotCQkJdW5kbyA9IGphdmFFZGl0LmFwcGx5KGdldEphdmFEb2N1bWVudCgpKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCS8vIG5vdyBhdCB0aGlzIHBvaW50IEphdmEgcG9zaXRpb25zIGFyZSB1bnJlbGlhYmxlIHNpbmNlIHRoZXkgd2VyZQotCQkvLyB1cGRhdGVkIGFmdGVyIGFwcGx5aW5nIGphdmEgZWRpdC4KLQotCQlTdHJpbmcgbmV3SmF2YVRleHQgPSBnZXRKYXZhRG9jdW1lbnQoKS5nZXQoKTsKLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJqYXZhIHBvc3QgZm9ybWF0IHRleHQ6XG4iICsgbmV3SmF2YVRleHQpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gcmVjb3JkIHBvc3QgZWRpdCBkYXRhCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgamF2YVBvc2l0aW9ucy5sZW5ndGg7IGkrKykKLQkJCWRlbHRhc1tpXS5zZXRQb3N0RWRpdERhdGEoamF2YVBvc2l0aW9uc1tpXS5vZmZzZXQsIGphdmFQb3NpdGlvbnNbaV0ubGVuZ3RoLCBqYXZhUG9zaXRpb25zW2ldLmlzRGVsZXRlZCk7Ci0KLQkJLy8gY3JlYXRlIGFwcHJvcHJpYXRlIHRleHQgZWRpdHMgZm9yIGRlbHRhcwotCQlQb3NpdGlvbiBqc3BQb3MgPSBudWxsOwotCQlTdHJpbmcgcmVwbGFjZVRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJanNwUG9zID0ganNwUG9zaXRpb25zW2ldOwotCQkJLy8gY2FuIGJlIG51bGwgaWYgaXQncyBhbiBpbmRpcmVjdCBtYXBwaW5nIHBvc2l0aW9uCi0JCQkvLyBvciBpZiBzb21ldGhpbmcgd2FzIGFkZGVkIGludG8gamF2YSB0aGF0IHdhcyBub3Qgb3JpZ2luYWxseSBpbgotCQkJLy8gSlNQIChsaWtlIGEgbmV3IGltcG9ydC4uLikKLQotCQkJaWYgKGpzcFBvcyAhPSBudWxsKSB7Ci0JCQkJaWYgKGRlbHRhc1tpXS5pc0RlbGV0ZWQpIHsKLQkJCQkJanNwRWRpdHMuYWRkKG5ldyBEZWxldGVFZGl0KGpzcFBvcy5vZmZzZXQsIGpzcFBvcy5sZW5ndGgpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlcGxhY2VUZXh0ID0gbmV3SmF2YVRleHQuc3Vic3RyaW5nKGRlbHRhc1tpXS5wb3N0T2Zmc2V0LCBkZWx0YXNbaV0ucG9zdE9mZnNldCArIGRlbHRhc1tpXS5wb3N0TGVuZ3RoKTsKLQotCQkJCQkvLyBnZXQgcmlkIG9mIHByZSBhbmQgcG9zdCB3aGl0ZSBzcGFjZSBvciBmaW5lIHR1bmVkCi0JCQkJCS8vIGFkanVzdG1lbnQgbGF0ZXIuCi0JCQkJCS8vIGZpeCB0ZXh0IGhlcmUuLi4KLQkJCQkJcmVwbGFjZVRleHQgPSBmaXhKc3BSZXBsYWNlVGV4dChyZXBsYWNlVGV4dCwganNwUG9zLm9mZnNldCk7Ci0KLQkJCQkJanNwRWRpdHMuYWRkKG5ldyBSZXBsYWNlRWRpdChqc3BQb3Mub2Zmc2V0LCBqc3BQb3MubGVuZ3RoLCByZXBsYWNlVGV4dCkpOwotCQkJCX0KLQkJCQlpZiAoREVCVUcpCi0JCQkJCWRlYnVnUmVwbGFjZShkZWx0YXMsIGpzcFBvcywgcmVwbGFjZVRleHQsIGkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gdGhlIG5ldyBKYXZhIHRleHQgaGFzIG5vIGNvcnJlc3BvbmRpbmcgSlNQIHBvc2l0aW9uCi0JCQkJLy8gcG9zc2libGUgbmV3IGltcG9ydD8KLQkJCQlpZiAoaXNJbXBvcnQoamF2YVBvc2l0aW9uc1tpXS5nZXRPZmZzZXQoKSkgJiYgcmVwbGFjZVRleHQubGFzdEluZGV4T2YoImltcG9ydCAiKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXJlcGxhY2VUZXh0ID0gbmV3SmF2YVRleHQuc3Vic3RyaW5nKGRlbHRhc1tpXS5wb3N0T2Zmc2V0LCBkZWx0YXNbaV0ucG9zdE9mZnNldCArIGRlbHRhc1tpXS5wb3N0TGVuZ3RoKTsKLQkJCQkJU3RyaW5nIGltcG9ydFRleHQgPSByZXBsYWNlVGV4dC5zdWJzdHJpbmcocmVwbGFjZVRleHQubGFzdEluZGV4T2YoImltcG9ydCAiKSwgcmVwbGFjZVRleHQuaW5kZXhPZigiOyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCS8vIGV2ZW51dGFsbHkgbmVlZCB0byBjaGVjayBpZiBpdCdzIFhNTC1KU1AKLQkJCQkJaW1wb3J0VGV4dCA9ICI8JUBwYWdlIGltcG9ydD1cIiIgKyBpbXBvcnRUZXh0ICsgIlwiICU+XG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJanNwRWRpdHMuYWRkKG5ldyBJbnNlcnRFZGl0KDAsIGltcG9ydFRleHQpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJVGV4dEVkaXQgYWxsSnNwRWRpdHMgPSBjcmVhdGVNdWx0aVRleHRFZGl0KChUZXh0RWRpdFtdKSBqc3BFZGl0cy50b0FycmF5KG5ldyBUZXh0RWRpdFtqc3BFZGl0cy5zaXplKCldKSk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTYzMgotCQkvLyB1bmRvIHRoZSBqYXZhIGVkaXQKLQkJLy8gKHNvIHRoZSB1bmRlcmx5aW5nIEphdmEgZG9jdW1lbnQgc3RpbGwgcmVwcmVzZW50cyB3aGF0J3MgaW4gdGhlCi0JCS8vIGVkaXRvcikKLQkJaWYgKHVuZG8gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl1bmRvLmFwcGx5KGdldEphdmFEb2N1bWVudCgpKTsKLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGFsbEpzcEVkaXRzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGZpeEpzcFJlcGxhY2VUZXh0KFN0cmluZyByZXBsYWNlVGV4dCwgaW50IGpzcE9mZnNldCkgewotCi0JCS8vIHJlc3VsdCBpcyB0aGUgdGV4dCBpbmJldHdlZW4gdGhlIGRlbGltaXRlcnMKLQkJLy8gZWcuCi0JCS8vIAotCQkvLyA8JSByZXN1bHQKLQkJLy8gJT4KLQkJU3RyaW5nIHJlc3VsdCA9IHJlcGxhY2VUZXh0LnRyaW0oKTsKLQkJU3RyaW5nIHByZURlbGltaXRlcldoaXRlc3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCUlEb2N1bWVudCBqc3BEb2MgPSBnZXRKc3BEb2N1bWVudCgpOwotCQlpZiAoanNwRG9jIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzRG9jID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGpzcERvYzsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSByZWdpb25zID0gc0RvYy5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKDAsIGpzcE9mZnNldCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zW3JlZ2lvbnMubGVuZ3RoIC0gMV07Ci0KLQkJCS8vIG9ubHkgc3BlY2lmaWNhbGx5IG1vZGlmeSBzY3JpcHRsZXRzCi0JCQlpZiAobGFzdFJlZ2lvbiAhPSBudWxsICYmIGxhc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTikgewotCQkJCWZvciAoaW50IGkgPSByZWdpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gcmVnaW9uc1tpXTsKLQotCQkJCQkvLyBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gY2hlY2sgd2hpdGVzcGFjZT8KLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCAmJiByZWdpb24uZ2V0RnVsbFRleHQoKS50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCXByZURlbGltaXRlcldoaXRlc3BhY2UgPSByZWdpb24uZ2V0RnVsbFRleHQoKTsKLQkJCQkJCXByZURlbGltaXRlcldoaXRlc3BhY2UgPSBwcmVEZWxpbWl0ZXJXaGl0ZXNwYWNlLnJlcGxhY2VBbGwoIlxyIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCXByZURlbGltaXRlcldoaXRlc3BhY2UgPSBwcmVEZWxpbWl0ZXJXaGl0ZXNwYWNlLnJlcGxhY2VBbGwoIlxuIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJCQkJLy8gbmVlZCB0byBkZXRlcm1pbmUgaW5kZW50IGZvciB0aGF0IGZpcnN0IGxpbmUuLi4KLQkJCQkJCVN0cmluZyBpbml0aWFsSW5kZW50ID0gZ2V0SW5pdGlhbEluZGVudChyZXN1bHQpOwotCi0JCQkJCQkvLyBmaXggdGhlIGZpcnN0IGxpbmUgb2YgamF2YSBjb2RlCi0JCQkJCQlyZXN1bHQgPSBUZXh0VXRpbGl0aWVzLmdldERlZmF1bHRMaW5lRGVsaW1pdGVyKHNEb2MpICsgaW5pdGlhbEluZGVudCArIHJlc3VsdDsKLQotCQkJCQkJcmVzdWx0ID0gYWRqdXN0SW5kZW50KHJlc3VsdCwgcHJlRGVsaW1pdGVyV2hpdGVzcGFjZSwgVGV4dFV0aWxpdGllcy5nZXREZWZhdWx0TGluZURlbGltaXRlcihzRG9jKSk7Ci0KLQkJCQkJCS8vIGFkZCB3aGl0ZXNwYWNlIGJlZm9yZSBsYXN0IGRlbGltaXRlciB0byBtYXRjaAotCQkJCQkJLy8gaXQgdy8gdGhlIG9wZW5pbmcgZGVsaW1pdGVyCi0JCQkJCQlyZXN1bHQgPSByZXN1bHQgKyBUZXh0VXRpbGl0aWVzLmdldERlZmF1bHRMaW5lRGVsaW1pdGVyKHNEb2MpICsgcHJlRGVsaW1pdGVyV2hpdGVzcGFjZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYWRqdXN0SW5kZW50KFN0cmluZyB0ZXh0QmVmb3JlLCBTdHJpbmcgaW5kZW50LCBTdHJpbmcgZGVsaW0pIHsKLQotCQkvLyBmaXJzdCByZXBsYWNlIG11bHRpcGxlIGluZGVudCB3aXRoIHNpbmdsZSBpbmRlbnQKLQkJLy8gdGhlIHRyaXBsZSBpbmRlbnQgb2NjdXJzIGJlY2F1c2UgdGhlIHNjcmlwdGxldCBjb2RlCi0JCS8vIGFjdHVhbGx5IG9jY3VycyB1bmRlcjoKLQkJLy8gCi0JCS8vIGNsYXNzCi0JCS8vIG1ldGhvZAotCQkvLyBjb2RlCi0JCS8vIAotCQkvLyBpbiB0aGUgdHJhbnNsYXRlZCBqYXZhIGRvY3VtZW50Ci0JCS8vIEJVRzE4ODYzNiAtIGp1c3QgZ2V0IGluZGVudCBpbmZvIGZyb20gY29kZSBmb3JtYXR0ZXIKLQkJU3RyaW5nIGxldmVsMSA9IGdldENvZGVGb3JtYXR0ZXIoKS5jcmVhdGVJbmRlbnRhdGlvblN0cmluZygxKTsKLQkJU3RyaW5nIGxldmVsMyA9IGdldENvZGVGb3JtYXR0ZXIoKS5jcmVhdGVJbmRlbnRhdGlvblN0cmluZygzKTsKLQkJU3RyaW5nIHRoZU9sZCA9ICJcbiIgKyBsZXZlbDM7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHRoZU5ldyA9ICJcbiIgKyBsZXZlbDE7IC8vJE5PTi1OTFMtMSQKLQkJdGV4dEJlZm9yZSA9IHRleHRCZWZvcmUucmVwbGFjZUFsbCh0aGVPbGQsIHRoZU5ldyk7Ci0KLQkJLy8gZ2V0IGluZGVudCBhZnRlciAybmQgbGluZSBicmVhawotCQlTdHJpbmdCdWZmZXIgdGV4dEFmdGVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkvLyB3aWxsIHRoaXMgd29yayBvbiBtYWM/Ci0JCXRleHRCZWZvcmUgPSB0ZXh0QmVmb3JlLnJlcGxhY2VBbGwoIlxyIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih0ZXh0QmVmb3JlLCAiXG4iLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rID0gc3QubmV4dFRva2VuKCk7Ci0JCQlpZiAodG9rLmVxdWFscygiXG4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdGV4dEFmdGVyLmFwcGVuZChkZWxpbSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBwcmVwZW5kIGVhY2ggbGluZSB3LyBzcGVjaWZpZWQgaW5kZW50Ci0JCQkJdGV4dEFmdGVyLmFwcGVuZChpbmRlbnQpOwotCQkJCXRleHRBZnRlci5hcHBlbmQodG9rKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGV4dEFmdGVyLnRvU3RyaW5nKCk7Ci0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRJbml0aWFsSW5kZW50KFN0cmluZyByZXN1bHQpIHsKLQkJLy8gQlVHMTg4NjM2IC0ganVzdCBnZXQgaW5pdGlhbCBpbmRlbnQgZnJvbSBjb2RlIGZvcm1hdHRlcgotCQlTdHJpbmcgaW5kZW50ID0gZ2V0Q29kZUZvcm1hdHRlcigpLmNyZWF0ZUluZGVudGF0aW9uU3RyaW5nKDEpOwotCQkvLyAvLyBnZXQgaW5kZW50IGFmdGVyIDJuZCBsaW5lIGJyZWFrCi0JCS8vIFN0cmluZyBpbmRlbnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHJlc3VsdCwgIlxyXG4iLCBmYWxzZSk7Ci0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJLy8gaWYgKHN0LmNvdW50VG9rZW5zKCkgPiAxKSB7Ci0JCS8vIFN0cmluZyB0b2sgPSBzdC5uZXh0VG9rZW4oKTsKLQkJLy8gdG9rID0gc3QubmV4dFRva2VuKCk7Ci0JCS8vIGludCBpbmRleCA9IDA7Ci0JCS8vIGlmICh0b2sgIT0gbnVsbCkgewotCQkvLyB3aGlsZSAodG9rLmNoYXJBdChpbmRleCkgPT0gJyAnIHx8IHRvay5jaGFyQXQoaW5kZXgpID09ICdcdCcpIHsKLQkJLy8gaW5kZW50ICs9IHRvay5jaGFyQXQoaW5kZXgpOwotCQkvLyBpbmRleCsrOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQlyZXR1cm4gaW5kZW50OwotCX0KLQotCXByaXZhdGUgQ29kZUZvcm1hdHRlciBnZXRDb2RlRm9ybWF0dGVyKCkgewotCQlpZiAoZkNvZGVGb3JtYXR0ZXIgPT0gbnVsbCkKLQkJCWZDb2RlRm9ybWF0dGVyID0gVG9vbEZhY3RvcnkuY3JlYXRlQ29kZUZvcm1hdHRlcihudWxsKTsKLQkJcmV0dXJuIGZDb2RlRm9ybWF0dGVyOwotCX0KLQotCi0JLyoqCi0JICogQ29tYmluZXMgYW4gYXJyYXkgb2YgZWRpdHMgaW50byBvbmUgTXVsdGlUZXh0RWRpdCAod2l0aCB0aGUgYXBwcm9wcmlhdGUKLQkgKiBjb3ZlcmFnZSByZWdpb24pCi0JICogCi0JICogQHBhcmFtIGVkaXRzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVGV4dEVkaXQgY3JlYXRlTXVsdGlUZXh0RWRpdChUZXh0RWRpdFtdIGVkaXRzKSB7Ci0KLQkJaWYgKGVkaXRzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0KLQkJSVJlZ2lvbiByZWdpb24gPSBUZXh0RWRpdC5nZXRDb3ZlcmFnZShlZGl0cyk7Ci0JCU11bHRpVGV4dEVkaXQgbXVsdGlFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQocmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhZGRUb011bHRpRWRpdChlZGl0c1tpXSwgbXVsdGlFZGl0KTsKLQkJfQotCQlyZXR1cm4gbXVsdGlFZGl0OwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGFkZFRvTXVsdGlFZGl0KFRleHRFZGl0IGVkaXQsIE11bHRpVGV4dEVkaXQgbXVsdGlFZGl0KSB7Ci0KLQkJLy8gY2hlY2sgZm9yIG92ZXJsYXAgaGVyZQotCQkvLyBkaXNjYXJkIG92ZXJsYXBwaW5nIGVkaXRzLi4KLQkJLy8gcG9zc2libGUgZXhwb25lbnRpYWwgcGVyZm9ybWFuY2UgaGl0Li4uIG5lZWQgYSBiZXR0ZXIgd2F5Li4uCi0JCVRleHRFZGl0W10gY2hpbGRyZW4gPSBtdWx0aUVkaXQuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNoaWxkcmVuW2ldLmNvdmVycyhlZGl0KSkKLQkJCQkvLyBkb24ndCBhZGQKLQkJCQlyZXR1cm47Ci0JCX0KLQkJbXVsdGlFZGl0LmFkZENoaWxkKGVkaXQpOwotCX0KLQotCi0JLyoqCi0JICogQHBhcmFtIHRyYW5zbGF0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFBvc2l0aW9uc1RvRG9jdW1lbnRzKCkgewotCi0JCS8vIGNhbiBiZSBudWxsIGlmIGl0J3MgYSBOdWxsSlNQVHJhbnNsYXRpb24KLQkJaWYgKGdldEphdmFEb2N1bWVudCgpICE9IG51bGwgJiYgZ2V0SnNwRG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0KLQkJCUhhc2hNYXAgamF2YTJqc3AgPSBnZXRKYXZhMkpzcE1hcCgpOwotCQkJSXRlcmF0b3IgaXQgPSBqYXZhMmpzcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJUG9zaXRpb24gamF2YVBvcyA9IG51bGw7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJamF2YVBvcyA9IChQb3NpdGlvbikgaXQubmV4dCgpOwotCQkJCXRyeSB7Ci0KLQkJCQkJZkphdmFEb2N1bWVudC5hZGRQb3NpdGlvbihqYXZhUG9zKTsKLQotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidHlyaW5nIHRvIGFkZCBKYXZhIFBvc2l0aW9uOlsiICsgamF2YVBvcy5vZmZzZXQgKyAiOiIgKyBqYXZhUG9zLmxlbmd0aCArICJdIHRvICIgKyBnZXRKYXZhUGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQJCQkJCQotCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzdWJzdHJpbmcgOlsiICsKLQkJCQkJCS8vIGZKYXZhRG9jdW1lbnQuZ2V0KCkuc3Vic3RyaW5nKGphdmFQb3Mub2Zmc2V0KSArCi0JCQkJCQkvLyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQl0cnkgewotCi0JCQkJCWZKc3BEb2N1bWVudC5hZGRQb3NpdGlvbigoUG9zaXRpb24pIGphdmEyanNwLmdldChqYXZhUG9zKSk7Ci0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInR5cmluZyB0byBhZGQgSlNQIFBvc2l0aW9uOlsiICsgKChQb3NpdGlvbikgamF2YTJqc3AuZ2V0KGphdmFQb3MpKS5vZmZzZXQgKyAiOiIgKyAoKFBvc2l0aW9uKSBqYXZhMmpzcC5nZXQoamF2YVBvcykpLmxlbmd0aCArICJdIHRvICIgKyBnZXRKYXZhUGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWN1cnNpdmVseSBnZXRzIGFsbCBjaGlsZCBlZGl0cwotCSAqIAotCSAqIEBwYXJhbSBqYXZhRWRpdAotCSAqIEByZXR1cm4gYWxsIGNoaWxkIGVkaXRzCi0JICovCi0JcHJpdmF0ZSBUZXh0RWRpdFtdIGdldEFsbEVkaXRzKFRleHRFZGl0IGphdmFFZGl0KSB7Ci0KLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChqYXZhRWRpdCBpbnN0YW5jZW9mIE11bHRpVGV4dEVkaXQpIHsKLQkJCVRleHRFZGl0W10gY2hpbGRyZW4gPSBqYXZhRWRpdC5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLQkJCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QoZ2V0QWxsRWRpdHMoY2hpbGRyZW5baV0pKSk7Ci0JCX0KLQkJZWxzZQotCQkJcmVzdWx0LmFkZChqYXZhRWRpdCk7Ci0JCXJldHVybiAoVGV4dEVkaXRbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFRleHRFZGl0W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVsdGFzCi0JICogQHBhcmFtIGpzcFBvcwotCSAqIEBwYXJhbSByZXBsYWNlVGV4dAotCSAqIEBwYXJhbSBqc3BUZXh0Ci0JICogQHBhcmFtIGkKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGVidWdSZXBsYWNlKFBvc2l0aW9uRGVsdGFbXSBkZWx0YXMsIFBvc2l0aW9uIGpzcFBvcywgU3RyaW5nIHJlcGxhY2VUZXh0LCBpbnQgaSkgewotCQlTdHJpbmcganNwQ2h1bms7Ci0JCWpzcENodW5rID0gZ2V0SnNwRG9jdW1lbnQoKS5nZXQoKS5zdWJzdHJpbmcoanNwUG9zLm9mZnNldCwganNwUG9zLm9mZnNldCArIGpzcFBvcy5sZW5ndGgpOwotCQlpZiAoIWRlbHRhc1tpXS5pc0RlbGV0ZWQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVwbGFjaW5nOiIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImpzcDpbIiArIGpzcENodW5rICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIncvIDpbIiArIHJlcGxhY2VUZXh0ICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvblV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ3MmMzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkNvcHlTb3VyY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuQ29weVRhcmdldEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5EZWxldGVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuSW5zZXJ0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1vdmVTb3VyY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTW92ZVRhcmdldEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBKU1BUcmFuc2xhdGlvblV0aWwgewotCXByb3RlY3RlZCBJRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgSlNQVHJhbnNsYXRpb25FeHRlbnNpb24gZlRyYW5zbGF0aW9uID0gbnVsbDsKLQotCXB1YmxpYyBKU1BUcmFuc2xhdGlvblV0aWwoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBUZXh0RWRpdCB0cmFuc2xhdGVUZXh0RWRpdChUZXh0RWRpdCB0ZXh0RWRpdCkgewotCQlUZXh0RWRpdCB0cmFuc2xhdGVkVGV4dEVkaXQgPSBudWxsOwotCi0JCWludCBqYXZhT2Zmc2V0ID0gdGV4dEVkaXQuZ2V0T2Zmc2V0KCk7Ci0JCWludCBqc3BPZmZzZXQgPSBnZXRUcmFuc2xhdGlvbigpLmdldEpzcE9mZnNldCh0ZXh0RWRpdC5nZXRPZmZzZXQoKSk7Ci0JCWludCBsZW5ndGggPSB0ZXh0RWRpdC5nZXRMZW5ndGgoKTsKLQotCQlpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBNdWx0aVRleHRFZGl0KSB7Ci0JCQl0cmFuc2xhdGVkVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQkJVGV4dEVkaXRbXSBjaGlsZHJlbiA9ICgoTXVsdGlUZXh0RWRpdCkgdGV4dEVkaXQpLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVGV4dEVkaXQgdHJhbnNsYXRlZENoaWxkVGV4dEVkaXQgPSB0cmFuc2xhdGVUZXh0RWRpdChjaGlsZHJlbltpXSk7Ci0JCQkJaWYgKHRyYW5zbGF0ZWRDaGlsZFRleHRFZGl0ICE9IG51bGwpCi0JCQkJCSgoTXVsdGlUZXh0RWRpdCkgdHJhbnNsYXRlZFRleHRFZGl0KS5hZGRDaGlsZCh0cmFuc2xhdGVkQ2hpbGRUZXh0RWRpdCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBSZXBsYWNlRWRpdCkgewotCQkJaWYgKGpzcE9mZnNldCA9PSAtMSkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJaWYgKCFnZXRUcmFuc2xhdGlvbigpLmphdmFTcGFuc011bHRpcGxlSnNwUGFydGl0aW9ucyhqYXZhT2Zmc2V0LCBsZW5ndGgpKQotCQkJCXRyYW5zbGF0ZWRUZXh0RWRpdCA9IG5ldyBSZXBsYWNlRWRpdChqc3BPZmZzZXQsIGxlbmd0aCwgKChSZXBsYWNlRWRpdCkgdGV4dEVkaXQpLmdldFRleHQoKSk7Ci0JCX0KLQkJZWxzZSBpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBJbnNlcnRFZGl0KSB7Ci0JCQl0cmFuc2xhdGVkVGV4dEVkaXQgPSBuZXcgSW5zZXJ0RWRpdChqc3BPZmZzZXQsICgoSW5zZXJ0RWRpdCkgdGV4dEVkaXQpLmdldFRleHQoKSk7Ci0JCX0KLQkJZWxzZSBpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBEZWxldGVFZGl0KSB7Ci0JCQl0cmFuc2xhdGVkVGV4dEVkaXQgPSBuZXcgRGVsZXRlRWRpdChqc3BPZmZzZXQsIGxlbmd0aCk7Ci0JCQlUZXh0RWRpdFtdIGNoaWxkcmVuID0gKChEZWxldGVFZGl0KSB0ZXh0RWRpdCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlUZXh0RWRpdCB0cmFuc2xhdGVkQ2hpbGRUZXh0RWRpdCA9IHRyYW5zbGF0ZVRleHRFZGl0KGNoaWxkcmVuW2ldKTsKLQkJCQlpZiAodHJhbnNsYXRlZENoaWxkVGV4dEVkaXQgIT0gbnVsbCkKLQkJCQkJKChEZWxldGVFZGl0KSB0cmFuc2xhdGVkVGV4dEVkaXQpLmFkZENoaWxkKHRyYW5zbGF0ZWRDaGlsZFRleHRFZGl0KTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICh0ZXh0RWRpdCBpbnN0YW5jZW9mIENvcHlTb3VyY2VFZGl0KSB7Ci0JCQl0cmFuc2xhdGVkVGV4dEVkaXQgPSBuZXcgQ29weVNvdXJjZUVkaXQoanNwT2Zmc2V0LCBsZW5ndGgpOwotCQkJKChDb3B5U291cmNlRWRpdCkgdHJhbnNsYXRlZFRleHRFZGl0KS5zZXRUYXJnZXRFZGl0KCgoQ29weVNvdXJjZUVkaXQpIHRleHRFZGl0KS5nZXRUYXJnZXRFZGl0KCkpOwotCQkJKChDb3B5U291cmNlRWRpdCkgdHJhbnNsYXRlZFRleHRFZGl0KS5zZXRTb3VyY2VNb2RpZmllcigoKENvcHlTb3VyY2VFZGl0KSB0ZXh0RWRpdCkuZ2V0U291cmNlTW9kaWZpZXIoKSk7Ci0JCX0KLQkJZWxzZSBpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBDb3B5VGFyZ2V0RWRpdCkgewotCQkJdHJhbnNsYXRlZFRleHRFZGl0ID0gbmV3IENvcHlUYXJnZXRFZGl0KGpzcE9mZnNldCk7Ci0JCQkoKENvcHlUYXJnZXRFZGl0KSB0ZXh0RWRpdCkuZ2V0U291cmNlRWRpdCgpLnNldFRhcmdldEVkaXQoKENvcHlUYXJnZXRFZGl0KSB0cmFuc2xhdGVkVGV4dEVkaXQpOwotCQl9Ci0JCWVsc2UgaWYgKHRleHRFZGl0IGluc3RhbmNlb2YgTW92ZVNvdXJjZUVkaXQpIHsKLQkJCXRyYW5zbGF0ZWRUZXh0RWRpdCA9IG5ldyBNb3ZlU291cmNlRWRpdChqc3BPZmZzZXQsIGxlbmd0aCk7Ci0JCQkoKE1vdmVTb3VyY2VFZGl0KSB0cmFuc2xhdGVkVGV4dEVkaXQpLnNldFRhcmdldEVkaXQoKChNb3ZlU291cmNlRWRpdCkgdGV4dEVkaXQpLmdldFRhcmdldEVkaXQoKSk7Ci0JCX0KLQkJZWxzZSBpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBNb3ZlVGFyZ2V0RWRpdCkgewotCQkJdHJhbnNsYXRlZFRleHRFZGl0ID0gbmV3IE1vdmVUYXJnZXRFZGl0KGpzcE9mZnNldCk7Ci0JCQkoKE1vdmVUYXJnZXRFZGl0KSB0ZXh0RWRpdCkuZ2V0U291cmNlRWRpdCgpLnNldFRhcmdldEVkaXQoKE1vdmVUYXJnZXRFZGl0KSB0cmFuc2xhdGVkVGV4dEVkaXQpOwotCQl9Ci0JCWVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJOZWVkIHRvIHRyYW5zbGF0ZSAiICsgdGV4dEVkaXQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gdHJhbnNsYXRlZFRleHRFZGl0OwotCX0KLQotCXB1YmxpYyBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbiBnZXRUcmFuc2xhdGlvbigpIHsKLQkJaWYgKGZUcmFuc2xhdGlvbiA9PSBudWxsKSB7Ci0JCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJTW9kZWxIYW5kbGVyRm9ySlNQLmVuc3VyZVRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkoeG1sTW9kZWwpOwotCQkJdHJ5IHsKLQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQotCQkJCUpTUFRyYW5zbGF0aW9uQWRhcHRlciB0cmFuc2xhdGlvbkFkYXB0ZXIgPSAoSlNQVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSlNQVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJCWlmICh0cmFuc2xhdGlvbkFkYXB0ZXIgIT0gbnVsbCkKLQkJCQkJZlRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb25BZGFwdGVyLmdldEpTUFRyYW5zbGF0aW9uKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZlRyYW5zbGF0aW9uOwotCX0KLQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpIHsKLQkJcmV0dXJuIGdldFRyYW5zbGF0aW9uKCkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIElNb2RlbE1hbmFnZXIgZ2V0TW9kZWxNYW5hZ2VyKCkgewotCQlyZXR1cm4gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwMDkzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5WYXJpYWJsZUluZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuVExEQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTJUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkRlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLlByb3BlcnR5R3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGFnbGliLlRhZ2xpYkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGFnbGliLlRhZ2xpYkhlbHBlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhZ2xpYi5UYWdsaWJWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5GYWNldE1vZHVsZUNvcmVTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsLlplcm9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcGVsLklKU1BFTFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5KU1AyME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5UYWdNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNvbnRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50VHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIFRyYW5zbGF0ZXMgYSBKU1AgZG9jdW1lbnQgaW50byBhIEh0dHBTZXJ2bGV0LiBLZWVwcyB0d28gd2F5IG1hcHBpbmcgZnJvbQotICogSmF2YSB0cmFuc2xhdGlvbiB0byB0aGUgb3JpZ2luYWwgSlNQIHNvdXJjZSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIHRocm91Z2gKLSAqIGdldEphdmEySnNwUmFuZ2VzKCkgYW5kIGdldEpzcDJKYXZhUmFuZ2VzKCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUcmFuc2xhdG9yIHsKLQotCS8vIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IGluIHRoZSBleHRlbnNpb24gcG9pbnQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfVFJBTlNMQVRPUl9FWFRFTlNJT05fTkFNRSA9ICJlbFRyYW5zbGF0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxUUkFOU0xBVE9SX1BST1BfTkFNRSA9ICJFTFRyYW5zbGF0b3IiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBEZWZhdWx0IEVMIFRyYW5zbGF0b3IKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9KU1BfRUxfVFJBTlNMQVRPUl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLmRlZmF1bHRKU1AyMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGhhbmR5IHBsdWdpbiBJRCBjb25zdGFudAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQ09SRV9QTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcGphdmFtYXBwaW5nIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19TQVZFX09VVFBVVCA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwdHJhbnNsYXRpb25zdG9kaXNrIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIElKU1BFTFRyYW5zbGF0b3IgZkVMVHJhbnNsYXRvciA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRMID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIGZDbGFzc0hlYWRlciA9IG51bGw7Ci0JU3RyaW5nIGZDbGFzc25hbWUgPSBudWxsOwotCi0JU3RyaW5nIGZJbXBsaWNpdEltcG9ydHMgPSBudWxsOwotCi0JU3RyaW5nIGZTZXJ2aWNlSGVhZGVyID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIGZTZXNzaW9uVmFyaWFibGVEZWNsYXJhdGlvbiA9ICJqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7IiArIEVOREw7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBmRm9vdGVyID0gIn19IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGZFeGNlcHRpb24gPSAiVGhyb3dhYmxlIGV4Y2VwdGlvbiA9IG51bGw7IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fUFJFRklYID0gIm91dC5wcmludChcIlwiKyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OX1NVRkZJWCA9ICIpOyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgZlN1cGVyY2xhc3MgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgZlRyeUNhdGNoU3RhcnQgPSBFTkRMICsgInRyeSB7IiArIEVOREw7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIExpc3QgZlRyYW5zbGF0aW9uUHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBTdHJpbmcgZlRyeUNhdGNoRW5kID0gIiB9IGNhdGNoIChqYXZhLmxhbmcuRXhjZXB0aW9uIGUpIHt9ICIgKyBFTkRMOyAvLyROT04tTkxTLTEkCi0KLQkvKiogZlNvdXJjZVBvc2l0aW9uID0gcG9zaXRpb24gaW4gSlNQIHNvdXJjZSAqLwotCXByaXZhdGUgaW50IGZTb3VyY2VQb3NpdGlvbiA9IC0xOwotCS8qKiBmUmVsYXRpdmVPZmZlc3QgPSBvZmZzZXQgaW4gdGhlIGJ1ZmZlciB0aGVyZSB0aGUgY3Vyc29yIGlzICovCi0JcHJpdmF0ZSBpbnQgZlJlbGF0aXZlT2Zmc2V0ID0gLTE7Ci0JLyoqIGZDdXJzb3JQb3NpdGlvbiA9IG9mZnNldCBpbiB0aGUgdHJhbnNsYXRlZCBqYXZhIGRvY3VtZW50ICovCi0JcHJpdmF0ZSBpbnQgZkN1cnNvclBvc2l0aW9uID0gLTE7Ci0KLQkvKiogc29tZSBwYWdlIGRpcmVjdGl2ZSBhdHRyaWJ1dGVzICovCi0JcHJpdmF0ZSBib29sZWFuIGZJc0Vycm9yUGFnZSwgZkN1cnNvckluRXhwcmVzc2lvbiA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSXNJbkFTZXNzaW9uID0gdHJ1ZTsKLQotCS8qKiB1c2VyIGphdmEgY29kZSBpbiBib2R5IG9mIHRoZSBzZXJ2aWNlIG1ldGhvZCAqLwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZVc2VyQ29kZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvKiogdXNlciBFTCBFeHByZXNzaW9uICovCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZlVzZXJFTEV4cHJlc3Npb25zID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8qKiB1c2VyIGRlZmluZWQgdmFycyBkZWNsYXJlZCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjbGFzcyAqLwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZVc2VyRGVjbGFyYXRpb25zID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JLyoqIHVzZXIgZGVmaW5lZCBpbXBvcnRzICovCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZlVzZXJJbXBvcnRzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JLyoqCi0JICogQSBtYXAgb2YgdGFnIG5hbWVzIHRvIHRhZyBsaWJyYXJ5IHZhcmlhYmxlIGluZm9ybWF0aW9uOyB1c2VkIHRvIHN0b3JlCi0JICogdGhlIG9uZXMgbmVlZGVkIGZvciBBVF9FTkQgdmFyaWFibGUgc3VwcG9ydC4KLQkgKi8KLQlwcml2YXRlIFN0YWNrTWFwIGZUYWdUb1ZhcmlhYmxlTWFwID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZSZXN1bHQ7IC8vIHRoZSBmaW5hbCB0cmFzbGF0ZWQgamF2YSBkb2N1bWVudAotCS8vIHN0cmluZyBidWZmZXIKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBmQ3Vyc29yT3duZXIgPSBudWxsOyAvLyB0aGUgYnVmZmVyIHdoZXJlIHRoZSBjdXJzb3IKLQkvLyBpcwotCi0JcHJpdmF0ZSBJRE9NTW9kZWwgZlN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmQ3VycmVudE5vZGU7Ci0JcHJpdmF0ZSBib29sZWFuIGZJbkNvZGVSZWdpb24gPSBmYWxzZTsgLy8gZmxhZyBmb3IgaWYgY3Vyc29yIGlzIGluIHRoZQotCS8vIGN1cnJlbnQgcmVnaW9uIGJlaW5nIHRyYW5zbGF0ZWQKLQotCS8qKgotCSAqIHRoZXNlIGNvbnN0YW50cyBhcmUgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIHRoZSBjb2RlIGluIHF1ZXN0aW9uIGlzCi0JICogZW1iZWRkZWQgKEpTUCBhcyBhbiBhdHRyaWJ1dGUgb3Igd2l0aGluIGNvbW1lbnQgdGFncykgb3IgaXMganVzdAotCSAqIHN0YW5kYXJkIEpTUCBjb2RlLCBvciBpZGVudGlmaWVzIGlmIGl0J3MgYW4gZXhwcmVzc2lvbgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IFNUQU5EQVJEX0pTUCA9IDA7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgRU1CRURERURfSlNQID0gMTsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBERUNMQVJBVElPTiA9IDI7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgRVhQUkVTU0lPTiA9IDQ7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgU0NSSVBUTEVUID0gODsKLQotCS8qKiB1c2VkIHRvIGF2b2lkIGluZmluaXRlIGxvb3BpbmcgaW5jbHVkZSBmaWxlcyAqLwotCXByaXZhdGUgU3RhY2sgZkluY2x1ZGVzID0gbnVsbDsKLQlwcml2YXRlIFNldCBmSW5jbHVkZWRQYXRocyA9IG5ldyBIYXNoU2V0KDIpOwotCXByaXZhdGUgYm9vbGVhbiBmUHJvY2Vzc0luY2x1ZGVzID0gdHJ1ZTsKLQkvKiogbW9zdGx5IGZvciBoZWxwZXIgY2xhc3Nlcywgc28gdGhleSBwYXJzZSBjb3JyZWN0bHkgKi8KLQlwcml2YXRlIEFycmF5TGlzdCBmQmxvY2tNYXJrZXJzID0gbnVsbDsKLQkvKioKLQkgKiBmb3Iga2VlcGluZyB0cmFjayBvZiBvZmZzZXQgaW4gdXNlciBidWZmZXJzIHdoaWxlIGRvY3VtZW50IGlzIGJlaW5nCi0JICogYnVpbHQKLQkgKi8KLQlwcml2YXRlIGludCBmT2Zmc2V0SW5Vc2VySW1wb3J0cyA9IDA7Ci0JcHJpdmF0ZSBpbnQgZk9mZnNldEluVXNlckRlY2xhcmF0aW9ucyA9IDA7Ci0JcHJpdmF0ZSBpbnQgZk9mZnNldEluVXNlckNvZGUgPSAwOwotCi0JLyoqIGNvcnJlbGF0ZXMgcmFuZ2VzIChwb3NpdGlvbnMpIGluIGphdmEgdG8gcmFuZ2VzIGluIGpzcCAqLwotCXByaXZhdGUgSGFzaE1hcCBmSmF2YTJKc3BSYW5nZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogbWFwIG9mIHJhbmdlcyBpbiBmVXNlckltcG9ydHMgKHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyKSB0bwotCSAqIHJhbmdlcyBpbiBzb3VyY2UgSlNQIGJ1ZmZlci4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZkltcG9ydFJhbmdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JLyoqCi0JICogbWFwIG9mIHJhbmdlcyBpbiBmVXNlckNvZGUgKHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyKSB0bwotCSAqIHJhbmdlcyBpbiBzb3VyY2UgSlNQIGJ1ZmZlci4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZkNvZGVSYW5nZXMgPSBuZXcgSGFzaE1hcCgpOwotCS8qKgotCSAqIG1hcCBvZiByYW5nZXMgaW4gZlVzZXJEZWNsYXJhdGlvbnMgKHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUKLQkgKiBidWZmZXIpIHRvIHJhbmdlcyBpbiBzb3VyY2UgSlNQIGJ1ZmZlci4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZkRlY2xhcmF0aW9uUmFuZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgSGFzaE1hcCBmVXNlQmVhblJhbmdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIEhhc2hNYXAgZlVzZXJFTFJhbmdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiByYW5nZXMgdGhhdCBkb24ndCBkaXJlY3RseSBtYXAgZnJvbSBqYXZhIGNvZGUgdG8gSlNQIGNvZGUgKGVnLgotCSAqIDwlQGluY2x1ZGUgZmlsZT0iaW5jbHVkZWQuanNwIiU+Ci0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGZJbmRpcmVjdFJhbmdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0KLQkvKioKLQkgKiBzYXZlIEpTUCBkb2N1bWVudCB0ZXh0IGZvciBsYXRlciB1c2UgbWF5IGp1c3Qgd2FudCB0byByZWFkIHRoaXMgZnJvbQotCSAqIHRoZSBmaWxlIG9yIHN0cnVjZHR1cmVkIGRvY3VtZW50IGRlcGVuZGluZyB3aGF0IGlzIGF2YWlsYWJsZQotCSAqLwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZKc3BUZXh0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0KLQkvKioKLQkgKiBMaXN0IG9mIEVMIHByb2JsZW1zIHRvIGJlIHRyYW5zbGF0ZWQKLQkgKi8KLQlwcml2YXRlIEFycmF5TGlzdCBmRUxQcm9ibGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIEVMIFRyYW5zbGF0b3IgSUQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmRUxUcmFuc2xhdG9ySUQ7Ci0KLQlwdWJsaWMgSlNQVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIGNvbmZpZ3VyZSB1c2luZyBhbiBYTUxOb2RlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmUoSURPTU5vZGUgbm9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJZlByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7Ci0JCWZTdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCVN0cmluZyBiYXNlTG9jYXRpb24gPSBmU3RydWN0dXJlZE1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCi0JCWZFTFRyYW5zbGF0b3JJRCA9IGdldEVMVHJhbnNsYXRvclByb3BlcnR5KGJhc2VMb2NhdGlvbik7Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudCA9IGZTdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNyZWF0ZUNsYXNzbmFtZShub2RlKTsKLQkJaWYgKGNsYXNzTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCXNldENsYXNzbmFtZShjbGFzc05hbWUpOwotCQkJZkNsYXNzSGVhZGVyID0gInB1YmxpYyBjbGFzcyAiICsgY2xhc3NOYW1lICsgIiBleHRlbmRzICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBtZW1vcnkgc2F2aW5nIGNvbmZpZ3VyZSAobm8gU3RydWN0dXJlZERvY3VtZW50IGluIG1lbW9yeSkgY3VycmVudGx5Ci0JICogZG9lc24ndCBoYW5kbGUgaW5jbHVkZWQgZmlsZXMKLQkgKiAKLQkgKiBAcGFyYW0ganNwRmlsZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZShJRmlsZSBqc3BGaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gd2hlbiBjb25maWd1cmVkIG9uIGEgZmlsZQotCQkvLyBmU3RydWN0dXJlZE1vZGVsLCBmUG9zaXRpb25Ob2RlLCBmTW9kZWxRdWVyeSwgZlN0cnVjdHVyZWREb2N1bWVudAotCQkvLyBhcmUgYWxsIG51bGwKLQkJZlByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7Ci0KLQkJZkVMVHJhbnNsYXRvcklEID0gZ2V0RUxUcmFuc2xhdG9yUHJvcGVydHkoanNwRmlsZSk7Ci0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNyZWF0ZUNsYXNzbmFtZShqc3BGaWxlKTsKLQkJaWYgKGNsYXNzTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCXNldENsYXNzbmFtZShjbGFzc05hbWUpOwotCQkJZkNsYXNzSGVhZGVyID0gInB1YmxpYyBjbGFzcyAiICsgY2xhc3NOYW1lICsgIiBleHRlbmRzICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBqc3AgdGV4dCBmcm9tIGFuIElGaWxlCi0JICogCi0JICogQHBhcmFtIGpzcEZpbGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0SnNwVGV4dChJRmlsZSBqc3BGaWxlKSB7Ci0JCXRyeSB7Ci0JCQlCdWZmZXJlZElucHV0U3RyZWFtIGluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oanNwRmlsZS5nZXRDb250ZW50cygpKTsKLQkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLQkJCVN0cmluZyBsaW5lID0gbnVsbDsKLQkJCXdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJZkpzcFRleHRCdWZmZXIuYXBwZW5kKGxpbmUpOwotCQkJCWZKc3BUZXh0QnVmZmVyLmFwcGVuZChFTkRMKTsKLQkJCX0KLQkJCXJlYWRlci5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBFTFRyYW5zbGF0b3IgcHJvcGVydHkgZnJvbSBhIHdvcmtzcGFjZSByZWxhdGl2ZQotCSAqIHBhdGggc3RyaW5nCi0JICogCi0JICogQHBhcmFtIGJhc2VMb2NhdGlvbgotCSAqICAgICAgICAgICAgV29ya3NwYWNlLXJlbGF0aXZlIHN0cmluZyBwYXRoCi0JICogQHJldHVybiBWYWx1ZSBvZiB0aGUgRUxUcmFuc2xhdG9yIHByb3BlcnR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRFTFRyYW5zbGF0b3JQcm9wZXJ0eShTdHJpbmcgYmFzZUxvY2F0aW9uKSB7Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlTdHJpbmcgZWxUcmFuc2xhdG9yVmFsdWUgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlKG5ldyBQYXRoKGJhc2VMb2NhdGlvbikpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQllbFRyYW5zbGF0b3JWYWx1ZSA9IGdldEVMVHJhbnNsYXRvclByb3BlcnR5KGZpbGUpOwotCQl9Ci0JCXJldHVybiBlbFRyYW5zbGF0b3JWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBFTFRyYW5zbGF0b3IgcHJvcGVydHkgZnJvbSBhbiBJRmlsZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBJRmlsZQotCSAqIEByZXR1cm4gVmFsdWUgb2YgdGhlIEVMVHJhbnNsYXRvciBwcm9wZXJ0eSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RUxUcmFuc2xhdG9yUHJvcGVydHkoSUZpbGUgZmlsZSkgewotCQlTdHJpbmcgZWxUcmFuc2xhdG9yVmFsdWUgPSBudWxsOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCXRyeSB7Ci0JCQkJCWVsVHJhbnNsYXRvclZhbHVlID0gZmlsZS5nZXRQZXJzaXN0ZW50UHJvcGVydHkobmV3IFF1YWxpZmllZE5hbWUoSlNQX0NPUkVfUExVR0lOX0lELCBFTFRSQU5TTEFUT1JfUFJPUF9OQU1FKSk7Ci0JCQkJCWlmIChudWxsID09IGVsVHJhbnNsYXRvclZhbHVlKSB7Ci0KLQkJCQkJCWVsVHJhbnNsYXRvclZhbHVlID0gZmlsZS5nZXRQcm9qZWN0KCkuZ2V0UGVyc2lzdGVudFByb3BlcnR5KG5ldyBRdWFsaWZpZWROYW1lKEpTUF9DT1JFX1BMVUdJTl9JRCwgRUxUUkFOU0xBVE9SX1BST1BfTkFNRSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gSVNTVUU6IHdoeSBkbyB3ZSBsb2cgdGhpcyBoZXJlPyBJbnN0ZWFkIG9mIGFsbG93aW5nIHRvCi0JCQkJCS8vIHRocm93dXA/Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsVHJhbnNsYXRvclZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGNyZWF0ZUNsYXNzbmFtZShJRE9NTm9kZSBub2RlKSB7Ci0JCVN0cmluZyBjbGFzc25hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgYmFzZSA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCWNsYXNzbmFtZSA9IEpTUDJTZXJ2bGV0TmFtZVV0aWwubWFuZ2xlKGJhc2UpOwotCQl9Ci0JCXJldHVybiBjbGFzc25hbWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGpzcEZpbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlQ2xhc3NuYW1lKElGaWxlIGpzcEZpbGUpIHsKLQotCQlTdHJpbmcgY2xhc3NuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGpzcEZpbGUgIT0gbnVsbCkgewotCQkJY2xhc3NuYW1lID0gSlNQMlNlcnZsZXROYW1lVXRpbC5tYW5nbGUoanNwRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBjbGFzc25hbWU7Ci0JfQotCi0JcHJpdmF0ZSBJSlNQUHJvYmxlbSBjcmVhdGVKU1BQcm9ibGVtKGZpbmFsIGludCBwcm9ibGVtRUlELCBmaW5hbCBpbnQgcHJvYmxlbUlELCBmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgZW5kKSB7Ci0JCWZpbmFsIGludCBsaW5lID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoc3RhcnQpOwotCQlmaW5hbCBjaGFyW10gY2xhc3NuYW1lID0gZkNsYXNzbmFtZS50b0NoYXJBcnJheSgpOwotCi0JCS8qCi0JCSAqIE5vdGU6IHRoZXNlIHByb2JsZW1zIHdvdWxkIHJlc3VsdCBpbiB0cmFuc2xhdGlvbiBlcnJvcnMgb24gdGhlCi0JCSAqIHNlcnZlciwgc28gdGhlIHNldmVyaXR5IGlzIG5vdCBtZWFudCB0byBiZSBjb250cm9sbGFibGUKLQkJICovCi0JCXJldHVybiBuZXcgSUpTUFByb2JsZW0oKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VTdGFydChpbnQgc291cmNlU3RhcnQpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0U291cmNlTGluZU51bWJlcihpbnQgbGluZU51bWJlcikgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VFbmQoaW50IHNvdXJjZUVuZCkgewotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc1dhcm5pbmcoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0Vycm9yKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldFNvdXJjZVN0YXJ0KCkgewotCQkJCXJldHVybiBzdGFydDsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRTb3VyY2VMaW5lTnVtYmVyKCkgewotCQkJCXJldHVybiBsaW5lOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldFNvdXJjZUVuZCgpIHsKLQkJCQlyZXR1cm4gZW5kOwotCQkJfQotCi0JCQlwdWJsaWMgY2hhcltdIGdldE9yaWdpbmF0aW5nRmlsZU5hbWUoKSB7Ci0JCQkJcmV0dXJuIGNsYXNzbmFtZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQkJCXJldHVybiBtZXNzYWdlOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldElEKCkgewotCQkJCXJldHVybiBwcm9ibGVtSUQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRBcmd1bWVudHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0RUlEKCkgewotCQkJCXJldHVybiBwcm9ibGVtRUlEOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsYXNzbmFtZShTdHJpbmcgY2xhc3NuYW1lKSB7Ci0JCXRoaXMuZkNsYXNzbmFtZSA9IGNsYXNzbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzbmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZkNsYXNzbmFtZSAhPSBudWxsID8gdGhpcy5mQ2xhc3NuYW1lIDogIkdlbmVyaWNKc3BTZXJ2bGV0IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFNvIHRoYXQgdGhlIEpTUFRyYW5zbGF0b3IgY2FuIGJlIHJldXNlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChJRE9NTm9kZSBub2RlLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB7Ci0KLQkJLy8gaW5pdGlhbGl6ZSBzb21lIHRoaW5ncyBvbiBub2RlCi0JCWNvbmZpZ3VyZShub2RlLCBwcm9ncmVzcyk7Ci0JCXJlc2V0KCk7Ci0JCS8vIHNldCB0aGUganNwIHRleHQgYnVmZmVyCi0JCWZKc3BUZXh0QnVmZmVyLmFwcGVuZChmU3RydWN0dXJlZERvY3VtZW50LmdldCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zZXJ2YXRpdmUgdmVyc2lvbiAobm8gU3RydWN0dXJlZERvY3VtZW50L01vZGVsKQotCSAqIAotCSAqIEBwYXJhbSBqc3BGaWxlCi0JICogQHBhcmFtIHByb2dyZXNzCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoSUZpbGUganNwRmlsZSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgewotCi0JCS8vIGluaXRpYWxpemUgc29tZSB0aGluZ3Mgb24gbm9kZQotCQljb25maWd1cmUoanNwRmlsZSwgcHJvZ3Jlc3MpOwotCQlyZXNldCgpOwotCQkvLyBzZXQgdGhlIGpzcCB0ZXh0IGJ1ZmZlcgotCQlzZXRKc3BUZXh0KGpzcEZpbGUpOwotCX0KLQotCS8qKgotCSAqIFJlaW5pdGlhbGl6ZSBzb21lIGZpZWxkcwotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldCgpIHsKLQotCQkvLyByZXNldCBwcm9ncmVzcyBtb25pdG9yCi0JCWlmIChmUHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpCi0JCQlmUHJvZ3Jlc3NNb25pdG9yLnNldENhbmNlbGVkKGZhbHNlKTsKLQotCQkvLyByZWluaXQgZmllbGRzCi0JCWZTb3VyY2VQb3NpdGlvbiA9IC0xOwotCQlmUmVsYXRpdmVPZmZzZXQgPSAtMTsKLQkJZkN1cnNvclBvc2l0aW9uID0gLTE7Ci0KLQkJZklzRXJyb3JQYWdlID0gZkN1cnNvckluRXhwcmVzc2lvbiA9IGZhbHNlOwotCi0JCWZVc2VyQ29kZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZlVzZXJEZWNsYXJhdGlvbnMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZVc2VySW1wb3J0cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZlVzZXJFTEV4cHJlc3Npb25zID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWZSZXN1bHQgPSBudWxsOwotCQlmQ3Vyc29yT3duZXIgPSBudWxsOyAvLyB0aGUgYnVmZmVyIHdoZXJlIHRoZSBjdXJzb3IgaXMKLQotCQlmQ3VycmVudE5vZGUgPSBudWxsOwotCQlmSW5Db2RlUmVnaW9uID0gZmFsc2U7IC8vIGZsYWcgZm9yIGlmIGN1cnNvciBpcyBpbiB0aGUgY3VycmVudCByZWdpb24KLQkJLy8gYmVpbmcgdHJhbnNsYXRlZAotCi0JCWlmIChmSW5jbHVkZXMgIT0gbnVsbCkKLQkJCWZJbmNsdWRlcy5jbGVhcigpOwotCi0JCWZCbG9ja01hcmtlcnMgPSBudWxsOwotCi0JCWZPZmZzZXRJblVzZXJJbXBvcnRzID0gMDsKLQkJZk9mZnNldEluVXNlckRlY2xhcmF0aW9ucyA9IDA7Ci0JCWZPZmZzZXRJblVzZXJDb2RlID0gMDsKLQotCQlmSmF2YTJKc3BSYW5nZXMuY2xlYXIoKTsKLQkJZkltcG9ydFJhbmdlcy5jbGVhcigpOwotCQlmQ29kZVJhbmdlcy5jbGVhcigpOwotCQlmVXNlQmVhblJhbmdlcy5jbGVhcigpOwotCQlmRGVjbGFyYXRpb25SYW5nZXMuY2xlYXIoKTsKLQkJZlVzZXJFTFJhbmdlcy5jbGVhcigpOwotCQlmSW5kaXJlY3RSYW5nZXMuY2xlYXIoKTsKLQkJZkluY2x1ZGVkUGF0aHMuY2xlYXIoKTsKLQotCQlmSnNwVGV4dEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlmRUxQcm9ibGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4ganVzdCB0aGUgInNoZWxsIiBvZiBhIHNlcnZsZXQsIG5vdGhpbmcgY29udHJpYnV0ZWQgZnJvbSB0aGUgSlNQCi0JICogICAgICAgICBkb2MKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nQnVmZmVyIGdldEVtcHR5VHJhbnNsYXRpb24oKSB7Ci0JCXJlc2V0KCk7Ci0JCWJ1aWxkUmVzdWx0KCk7Ci0JCXJldHVybiBnZXRUcmFuc2xhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIHB1dCB0aGUgZmluYWwgamF2YSBkb2N1bWVudCB0b2dldGhlcgotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBidWlsZFJlc3VsdCgpIHsKLQkJLy8gdG8gYnVpbGQgdGhlIGphdmEgZG9jdW1lbnQgdGhpcyBpcyB0aGUgb3JkZXI6Ci0JCS8vIAotCQkvLyArIGRlZmF1bHQgaW1wb3J0cwotCQkvLyArIHVzZXIgaW1wb3J0cwotCQkvLyArIGNsYXNzIGhlYWRlcgotCQkvLyBbKyBlcnJvciBwYWdlXQotCQkvLyArIHVzZXIgZGVjbGFyYXRpb25zCi0JCS8vICsgc2VydmljZSBtZXRob2QgaGVhZGVyCi0JCS8vICsgdHJ5L2NhdGNoIHN0YXJ0Ci0JCS8vICsgdXNlciBjb2RlCi0JCS8vICsgdHJ5L2NhdGNoIGVuZAotCQkvLyArIHNlcnZpY2UgbWV0aG9kIGZvb3RlcgotCQlmUmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihmSW1wbGljaXRJbXBvcnRzLmxlbmd0aCgpICsgZlVzZXJJbXBvcnRzLmxlbmd0aCgpICsgZkNsYXNzSGVhZGVyLmxlbmd0aCgpICsgZlVzZXJEZWNsYXJhdGlvbnMubGVuZ3RoKCkgKyBmU2VydmljZUhlYWRlci5sZW5ndGgoKSArIGZUcnlDYXRjaFN0YXJ0Lmxlbmd0aCgpIC8vIHRyeS9jYXRjaAotCQkJCQkvLyBzdGFydAotCQkJCQkrIGZVc2VyQ29kZS5sZW5ndGgoKSArIGZUcnlDYXRjaEVuZC5sZW5ndGgoKSAvLyB0cnkvY2F0Y2gKLQkJCQkJLy8gZW5kCi0JCQkJCSsgZkZvb3Rlci5sZW5ndGgoKSk7Ci0KLQkJaW50IGphdmFPZmZzZXQgPSAwOwotCi0JCWZSZXN1bHQuYXBwZW5kKGZJbXBsaWNpdEltcG9ydHMpOwotCQlqYXZhT2Zmc2V0ICs9IGZJbXBsaWNpdEltcG9ydHMubGVuZ3RoKCk7Ci0KLQkJLy8gdXBkYXRlUmFuZ2VzKGZJbmRpcmVjdEltcG9ydHMsIGphdmFPZmZzZXQpOwotCQl1cGRhdGVSYW5nZXMoZkltcG9ydFJhbmdlcywgamF2YU9mZnNldCk7Ci0JCS8vIHVzZXIgaW1wb3J0cwotCQlhcHBlbmQoZlVzZXJJbXBvcnRzKTsKLQkJamF2YU9mZnNldCArPSBmVXNlckltcG9ydHMubGVuZ3RoKCk7Ci0KLQkJLy8gY2xhc3MgaGVhZGVyCi0JCWZSZXN1bHQuYXBwZW5kKGZDbGFzc0hlYWRlcik7IC8vJE5PTi1OTFMtMSQKLQkJamF2YU9mZnNldCArPSBmQ2xhc3NIZWFkZXIubGVuZ3RoKCk7Ci0JCWZSZXN1bHQuYXBwZW5kKGZTdXBlcmNsYXNzICsgInsiICsgRU5ETCk7IC8vJE5PTi1OTFMtMSQKLQkJamF2YU9mZnNldCArPSBmU3VwZXJjbGFzcy5sZW5ndGgoKSArIDI7Ci0KLQkJdXBkYXRlUmFuZ2VzKGZEZWNsYXJhdGlvblJhbmdlcywgamF2YU9mZnNldCk7Ci0JCS8vIHVzZXIgZGVjbGFyYXRpb25zCi0JCWFwcGVuZChmVXNlckRlY2xhcmF0aW9ucyk7Ci0JCWphdmFPZmZzZXQgKz0gZlVzZXJEZWNsYXJhdGlvbnMubGVuZ3RoKCk7Ci0KLQkJdXBkYXRlUmFuZ2VzKGZVc2VyRUxSYW5nZXMsIGphdmFPZmZzZXQpOwotCQlhcHBlbmQoZlVzZXJFTEV4cHJlc3Npb25zKTsKLQkJamF2YU9mZnNldCArPSBmVXNlckVMRXhwcmVzc2lvbnMubGVuZ3RoKCk7Ci0KLQkJZlJlc3VsdC5hcHBlbmQoZlNlcnZpY2VIZWFkZXIpOwotCQlqYXZhT2Zmc2V0ICs9IGZTZXJ2aWNlSGVhZGVyLmxlbmd0aCgpOwotCQkvLyBzZXNzaW9uIHBhcnRpY2lwYW50Ci0JCWlmIChmSXNJbkFTZXNzaW9uKSB7Ci0JCQlmUmVzdWx0LmFwcGVuZChmU2Vzc2lvblZhcmlhYmxlRGVjbGFyYXRpb24pOwotCQkJamF2YU9mZnNldCArPSBmU2Vzc2lvblZhcmlhYmxlRGVjbGFyYXRpb24ubGVuZ3RoKCk7Ci0JCX0KLQkJLy8gZXJyb3IgcGFnZQotCQlpZiAoZklzRXJyb3JQYWdlKSB7Ci0JCQlmUmVzdWx0LmFwcGVuZChmRXhjZXB0aW9uKTsKLQkJCWphdmFPZmZzZXQgKz0gZkV4Y2VwdGlvbi5sZW5ndGgoKTsKLQkJfQotCi0KLQkJZlJlc3VsdC5hcHBlbmQoZlRyeUNhdGNoU3RhcnQpOwotCQlqYXZhT2Zmc2V0ICs9IGZUcnlDYXRjaFN0YXJ0Lmxlbmd0aCgpOwotCi0JCXVwZGF0ZVJhbmdlcyhmQ29kZVJhbmdlcywgamF2YU9mZnNldCk7Ci0KLQkJLy8gdXNlciBjb2RlCi0JCWFwcGVuZChmVXNlckNvZGUpOwotCQlqYXZhT2Zmc2V0ICs9IGZVc2VyQ29kZS5sZW5ndGgoKTsKLQotCi0JCWZSZXN1bHQuYXBwZW5kKGZUcnlDYXRjaEVuZCk7Ci0JCWphdmFPZmZzZXQgKz0gZlRyeUNhdGNoRW5kLmxlbmd0aCgpOwotCi0JCS8vIGZvb3RlcgotCQlmUmVzdWx0LmFwcGVuZChmRm9vdGVyKTsKLQkJamF2YU9mZnNldCArPSBmRm9vdGVyLmxlbmd0aCgpOwotCi0JCWZKYXZhMkpzcFJhbmdlcy5wdXRBbGwoZkltcG9ydFJhbmdlcyk7Ci0JCWZKYXZhMkpzcFJhbmdlcy5wdXRBbGwoZkRlY2xhcmF0aW9uUmFuZ2VzKTsKLQkJZkphdmEySnNwUmFuZ2VzLnB1dEFsbChmQ29kZVJhbmdlcyk7Ci0JCWZKYXZhMkpzcFJhbmdlcy5wdXRBbGwoZlVzZXJFTFJhbmdlcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gamF2YVJhbmdlcwotCSAqIEBwYXJhbSBvZmZzZXRJbkphdmEKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlUmFuZ2VzKEhhc2hNYXAgcmFuZ2VNYXAsIGludCBvZmZzZXRJbkphdmEpIHsKLQkJLy8ganVzdCBuZWVkIHRvIHVwZGF0ZSBqYXZhIHJhbmdlcyB3LyB0aGUgb2Zmc2V0IHdlIG5vdyBrbm93Ci0JCUl0ZXJhdG9yIGl0ID0gcmFuZ2VNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkKLQkJCSgoUG9zaXRpb24pIGl0Lm5leHQoKSkub2Zmc2V0ICs9IG9mZnNldEluSmF2YTsKLQl9Ci0KLQkvKioKLQkgKiBtYXAgb2YgcmFuZ2VzIChwb3NpdGlvbnMpIGluIGphdmEgZG9jdW1lbnQgdG8gcmFuZ2VzIGluIGpzcCBkb2N1bWVudAotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgb2YgamF2YSBwb3NpdGlvbnMgdG8ganNwIHBvc2l0aW9ucy4KLQkgKi8KLQlwdWJsaWMgSGFzaE1hcCBnZXRKYXZhMkpzcFJhbmdlcygpIHsKLQkJcmV0dXJuIGZKYXZhMkpzcFJhbmdlczsKLQl9Ci0KLQkvKioKLQkgKiBtYXAgb2YgcmFuZ2VzIGluIGpzcCBkb2N1bWVudCB0byByYW5nZXMgaW4gamF2YSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIG9mIGpzcCBwb3NpdGlvbnMgdG8gamF2YSBwb3NpdGlvbnMsIG9yIG51bGwgaWYgbm8KLQkgKiAgICAgICAgIHRyYW5zbGF0aW9uIGhhcyBvY2N1cmVkIHlldCAodGhlIG1hcCBoYXNuJ3QgYmVlbiBidWlsdCkuCi0JICovCi0JcHVibGljIEhhc2hNYXAgZ2V0SnNwMkphdmFSYW5nZXMoKSB7Ci0JCWlmIChmSmF2YTJKc3BSYW5nZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlIYXNoTWFwIGZsaXBGbG9wcGVkID0gbmV3IEhhc2hNYXAoKTsKLQkJSXRlcmF0b3Iga2V5cyA9IGZKYXZhMkpzcFJhbmdlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlPYmplY3QgcmFuZ2UgPSBudWxsOwotCQl3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLQkJCXJhbmdlID0ga2V5cy5uZXh0KCk7Ci0JCQlmbGlwRmxvcHBlZC5wdXQoZkphdmEySnNwUmFuZ2VzLmdldChyYW5nZSksIHJhbmdlKTsKLQkJfQotCQlyZXR1cm4gZmxpcEZsb3BwZWQ7Ci0JfQotCi0JcHVibGljIEhhc2hNYXAgZ2V0SmF2YTJKc3BJbXBvcnRSYW5nZXMoKSB7Ci0JCXJldHVybiBmSW1wb3J0UmFuZ2VzOwotCX0KLQotCXB1YmxpYyBIYXNoTWFwIGdldEphdmEySnNwVXNlQmVhblJhbmdlcygpIHsKLQkJcmV0dXJuIGZVc2VCZWFuUmFuZ2VzOwotCX0KLQotCXB1YmxpYyBIYXNoTWFwIGdldEphdmEySnNwSW5kaXJlY3RSYW5nZXMoKSB7Ci0JCXJldHVybiBmSW5kaXJlY3RSYW5nZXM7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0byB0aGUganNwPC0+amF2YSBtYXAgYnkgZGVmYXVsdAotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgYSBjb21tYSBkZWxpbWl0ZWQgbGlzdCBvZiBpbXBvcnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW1wb3J0cyhTdHJpbmcgdmFsdWUpIHsKLQkJYWRkSW1wb3J0cyh2YWx1ZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUGFzcyBpbiBhIGNvbW1hIGRlbGltaXRlZCBsaXN0IG9mIGltcG9ydCB2YWx1ZXMsIGFwcGVuZHMgZWFjaCB0byB0aGUKLQkgKiBmaW5hbCByZXN1bHQgYnVmZmVyCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBhIGNvbW1hIGRlbGltaXRlZCBsaXN0IG9mIGltcG9ydHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbXBvcnRzKFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBhZGRUb01hcCkgewotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODE2ODcKLQkJLy8gYWRkZWQgdGhlICJhZGRUb01hcCIgcGFyYW1ldGVyIHRvIGV4Y2x1ZGUgaW1wb3J0cyBvcmlnaW5hdGluZwotCQkvLyBmcm9tIGluY2x1ZGVkIEpTUCBmaWxlcyB0byBiZSBhZGRlZCB0byB0aGUganNwPC0+amF2YSBtYXBwaW5nCi0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsICIsIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0b2sgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBTdHJpbmcgYXBwZW5kYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJdG9rID0gc3QubmV4dFRva2VuKCk7Ci0JCQlhcHBlbmRJbXBvcnRUb0J1ZmZlcih0b2ssIGZDdXJyZW50Tm9kZSwgYWRkVG9NYXApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogLyoga2VlcCB0cmFjayBvZiBjdXJzb3IgcG9zaXRpb24gaW5zaWRlIHRoZSBidWZmZXIgLyogYXBwZW5kcyBidWZmZXIgdG8KLQkgKiB0aGUgZmluYWwgcmVzdWx0IGJ1ZmZlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFwcGVuZChTdHJpbmdCdWZmZXIgYnVmKSB7Ci0JCWlmIChnZXRDdXJzb3JPd25lcigpID09IGJ1ZikgewotCQkJZkN1cnNvclBvc2l0aW9uID0gZlJlc3VsdC5sZW5ndGgoKSArIGdldFJlbGF0aXZlT2Zmc2V0KCk7Ci0JCX0KLQkJZlJlc3VsdC5hcHBlbmQoYnVmLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIE9ubHkgdmFsaWQgYWZ0ZXIgYSBjb25maWd1cmUoLi4uKSwgdHJhbnNsYXRlKC4uLikgb3IKLQkgKiB0cmFuc2xhdGVGcm9tRmlsZSguLi4pIGNhbGwKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHJlc3VsdCAoamF2YSB0cmFuc2xhdGlvbikgYnVmZmVyCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZ0J1ZmZlciBnZXRUcmFuc2xhdGlvbigpIHsKLQotCQlpZiAoREVCVUcpIHsKLQkJCVN0cmluZ0J1ZmZlciBkZWJ1Z1N0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXRyeSB7Ci0JCQkJSXRlcmF0b3IgaXQgPSBmSmF2YTJKc3BSYW5nZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCVBvc2l0aW9uIGphdmEgPSAoUG9zaXRpb24pIGl0Lm5leHQoKTsKLQkJCQkJZGVidWdTdHJpbmcuYXBwZW5kKCJKYXZhIHJhbmdlOlsiICsgamF2YS5vZmZzZXQgKyAiOiIgKyBqYXZhLmxlbmd0aCArICJdXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJZGVidWdTdHJpbmcuYXBwZW5kKCJbIiArIGZSZXN1bHQudG9TdHJpbmcoKS5zdWJzdHJpbmcoamF2YS5vZmZzZXQsIGphdmEub2Zmc2V0ICsgamF2YS5sZW5ndGgpICsgIl1cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJZGVidWdTdHJpbmcuYXBwZW5kKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZGVidWdTdHJpbmcuYXBwZW5kKCJ8bWFwcyB0by4uLnxcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCVBvc2l0aW9uIGpzcCA9IChQb3NpdGlvbikgZkphdmEySnNwUmFuZ2VzLmdldChqYXZhKTsKLQkJCQkJZGVidWdTdHJpbmcuYXBwZW5kKCJKU1AgcmFuZ2U6WyIgKyBqc3Aub2Zmc2V0ICsgIjoiICsganNwLmxlbmd0aCArICJdXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJZGVidWdTdHJpbmcuYXBwZW5kKCJbIiArIGZKc3BUZXh0QnVmZmVyLnRvU3RyaW5nKCkuc3Vic3RyaW5nKGpzcC5vZmZzZXQsIGpzcC5vZmZzZXQgKyBqc3AubGVuZ3RoKSArICJdXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlkZWJ1Z1N0cmluZy5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJKU1BUcmFuc2xhdGlvbiBlcnJvciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCBkZWJ1Z1N0cmluZy50b1N0cmluZygpKTsKLQkJfQotCi0JCWlmIChERUJVR19TQVZFX09VVFBVVCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IGdldEZpbGUoKS5nZXRQcm9qZWN0KCk7Ci0JCQlTdHJpbmcgc2hvcnRlbmVkQ2xhc3NuYW1lID0gU3RyaW5nVXRpbHMucmVwbGFjZShnZXRGaWxlKCkuZ2V0TmFtZSgpLCAiLiIsICJfIik7Ci0JCQlTdHJpbmcgZmlsZW5hbWUgPSBzaG9ydGVuZWRDbGFzc25hbWUgKyAiLmphdmEiOwotCQkJSVBhdGggcGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKS5hcHBlbmQoInNyYy8iICsgZmlsZW5hbWUpOwotCQkJdHJ5IHsKLQkJCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQkJCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJCQlmaWxlLmNyZWF0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9Ci0JCQkJSVRleHRGaWxlQnVmZmVyTWFuYWdlciB0ZXh0RmlsZUJ1ZmZlck1hbmFnZXIgPSBGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKTsKLQkJCQl0ZXh0RmlsZUJ1ZmZlck1hbmFnZXIuY29ubmVjdChwYXRoLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlJVGV4dEZpbGVCdWZmZXIgamF2YU91dHB1dEJ1ZmZlciA9IHRleHRGaWxlQnVmZmVyTWFuYWdlci5nZXRUZXh0RmlsZUJ1ZmZlcihwYXRoKTsKLQkJCQlqYXZhT3V0cHV0QnVmZmVyLmdldERvY3VtZW50KCkuc2V0KFN0cmluZ1V0aWxzLnJlcGxhY2UoZlJlc3VsdC50b1N0cmluZygpLCBnZXRDbGFzc25hbWUoKSwgc2hvcnRlbmVkQ2xhc3NuYW1lKSk7Ci0JCQkJamF2YU91dHB1dEJ1ZmZlci5jb21taXQobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdHJ1ZSk7Ci0JCQkJdGV4dEZpbGVCdWZmZXJNYW5hZ2VyLmRpc2Nvbm5lY3QocGF0aCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB0aGlzIGlzIGp1c3QgZm9yIGRlYnVnZ2luZywgaWdub3JlCi0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVwZGF0ZWQgdHJhbnNsYXRpb246ICIgKyBwYXRoKTsKLQkJfQotCi0JCXJldHVybiBmUmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFRyYW5zbGF0aW9uUHJvYmxlbXMoKSB7Ci0JCXJldHVybiBmVHJhbnNsYXRpb25Qcm9ibGVtczsKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHZhbGlkIGFmdGVyIGEgY29uZmlndXJlKC4uLiksIHRyYW5zbGF0ZSguLi4pIG9yCi0JICogdHJhbnNsYXRlRnJvbUZpbGUoLi4uKSBjYWxsCi0JICogCi0JICogQHJldHVybiB0aGUgdGV4dCBpbiB0aGUgSlNQIGZpbGUKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldEpzcFRleHQoKSB7Ci0JCXJldHVybiBmSnNwVGV4dEJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICogQHBhcmFtIHRhZ1RvQWRkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFnbGliVmFyaWFibGVzKFN0cmluZyB0YWdUb0FkZCkgewotCQlhZGRUYWdsaWJWYXJpYWJsZXModGFnVG9BZGQsIGdldEN1cnJlbnROb2RlKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ2xpYlZhcmlhYmxlcyhTdHJpbmcgdGFnVG9BZGQsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjdXN0b21UYWcpIHsKLQkJSUZpbGUgZiA9IGdldEZpbGUoKTsKLQotCQlpZiAoZiA9PSBudWxsIHx8ICFmLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCi0JCVRhZ2xpYkhlbHBlciBoZWxwZXIgPSBUYWdsaWJIZWxwZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0VGFnbGliSGVscGVyKGYpOwotCQkvKgotCQkgKiBWYXJpYWJsZXMgY2FuIGRlY2xhcmUgYXMgYXZhaWxhYmxlIHdoZW4gTkVTVEVELCBBVF9CRUdJTiwgb3IKLQkJICogQVRfRU5ELiBGb3IgQVRfRU5EIHZhcmlhYmxlcywgc3RvcmUgdGhlIGVudGlyZSBsaXN0IG9mIHZhcmlhYmxlcyBpbgotCQkgKiB0aGUgbWFwIGZpZWxkIHNvIGl0IGNhbiBiZSB1c2VkIG9uIHRoZSBlbmQgdGFnLgotCQkgKi8KLQkJU3RyaW5nIGRlY2wgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY3VzdG9tVGFnLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikpIHsKLQkJCVRhZ2xpYlZhcmlhYmxlW10gdGFnbGliVmFycyA9IGhlbHBlci5nZXRUYWdsaWJWYXJpYWJsZXModGFnVG9BZGQsIGdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBjdXN0b21UYWcpOwotCQkJZlRyYW5zbGF0aW9uUHJvYmxlbXMuYWRkQWxsKGhlbHBlci5nZXRQcm9ibGVtcyhmLmdldEZ1bGxQYXRoKCkpKTsKLQkJCS8qCi0JCQkgKiBUaGVzZSBsb29wcyBhcmUgZHVwbGljYXRlZCBpbnRlbnRpb25hbGx5IHRvIGtlZXAgdGhlIG5lc3RpbmcKLQkJCSAqIHNjb3BlZCB2YXJpYWJsZXMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIHRoZSBvdGhlcnMKLQkJCSAqLwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdsaWJWYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHRhZ2xpYlZhcnNbaV0uZ2V0U2NvcGUoKSA9PSBWYXJpYWJsZUluZm8uQVRfQkVHSU4pIHsKLQkJCQkJZGVjbCA9IHRhZ2xpYlZhcnNbaV0uZ2V0RGVjbGFyYXRpb25TdHJpbmcoKTsKLQkJCQkJYXBwZW5kVG9CdWZmZXIoZGVjbCwgZlVzZXJDb2RlLCBmYWxzZSwgY3VzdG9tVGFnKTsKLQkJCQl9Ci0JCQkJaWYgKHRhZ2xpYlZhcnNbaV0uZ2V0U2NvcGUoKSA9PSBWYXJpYWJsZUluZm8uQVRfRU5EKSB7Ci0JCQkJCWRlY2wgPSB0YWdsaWJWYXJzW2ldLmdldERlY2xhcmF0aW9uU3RyaW5nKCk7Ci0JCQkJCWZUYWdUb1ZhcmlhYmxlTWFwLnB1c2godGFnVG9BZGQsIHRhZ2xpYlZhcnMpOwotCQkJCX0KLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFnbGliVmFycy5sZW5ndGg7IGkrKykgewotCQkJCWlmICh0YWdsaWJWYXJzW2ldLmdldFNjb3BlKCkgPT0gVmFyaWFibGVJbmZvLk5FU1RFRCkgewotCQkJCQlkZWNsID0gdGFnbGliVmFyc1tpXS5nZXREZWNsYXJhdGlvblN0cmluZygpOwotCQkJCQlhcHBlbmRUb0J1ZmZlcigieyIsIGZVc2VyQ29kZSwgZmFsc2UsIGN1c3RvbVRhZyk7Ci0JCQkJCWFwcGVuZFRvQnVmZmVyKGRlY2wsIGZVc2VyQ29kZSwgZmFsc2UsIGN1c3RvbVRhZyk7Ci0JCQkJCWZUYWdUb1ZhcmlhYmxlTWFwLnB1c2godGFnVG9BZGQsIHRhZ2xpYlZhcnMpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjdXN0b21UYWcuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSkgewotCQkJCS8qCi0JCQkJICogUHJvY2VzcyBORVNURUQgdmFyaWFibGVzIGJhY2t3YXJkcyBzbyB0aGUgc2NvcGVzICJ1bnJvbGwiCi0JCQkJICogY29ycmVjdGx5LgotCQkJCSAqLwotCQkJCWZvciAoaW50IGkgPSB0YWdsaWJWYXJzLmxlbmd0aDsgaSA+IDA7IGktLSkgewotCQkJCQlpZiAodGFnbGliVmFyc1tpIC0gMV0uZ2V0U2NvcGUoKSA9PSBWYXJpYWJsZUluZm8uTkVTVEVEKSB7Ci0JCQkJCQlhcHBlbmRUb0J1ZmZlcigifSIsIGZVc2VyQ29kZSwgZmFsc2UsIGN1c3RvbVRhZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLyogVHJlYXQgdGhpcyBhcyB0aGUgZW5kIGZvciBlbXB0eSB0YWdzICovCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdsaWJWYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICh0YWdsaWJWYXJzW2ldLmdldFNjb3BlKCkgPT0gVmFyaWFibGVJbmZvLkFUX0VORCkgewotCQkJCQkJZGVjbCA9IHRhZ2xpYlZhcnNbaV0uZ2V0RGVjbGFyYXRpb25TdHJpbmcoKTsKLQkJCQkJCWFwcGVuZFRvQnVmZmVyKGRlY2wsIGZVc2VyQ29kZSwgZmFsc2UsIGN1c3RvbVRhZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLyoKLQkJICogUHJvY2VzcyBORVNURUQgdmFyaWFibGVzIGZvciBhbiBlbmQgdGFnIGJhY2t3YXJkcyBzbyB0aGUgc2NvcGVzCi0JCSAqICJ1bnJvbGwiIGNvcnJlY3RseS4KLQkJICovCi0JCWVsc2UgaWYgKGN1c3RvbVRhZy5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSkgewotCQkJVGFnbGliVmFyaWFibGVbXSB0YWdsaWJWYXJzID0gKFRhZ2xpYlZhcmlhYmxlW10pIGZUYWdUb1ZhcmlhYmxlTWFwLnBvcCh0YWdUb0FkZCk7Ci0JCQlpZiAodGFnbGliVmFycyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IHRhZ2xpYlZhcnMubGVuZ3RoOyBpID4gMDsgaS0tKSB7Ci0JCQkJCWlmICh0YWdsaWJWYXJzW2kgLSAxXS5nZXRTY29wZSgpID09IFZhcmlhYmxlSW5mby5ORVNURUQpIHsKLQkJCQkJCWFwcGVuZFRvQnVmZmVyKCJ9IiwgZlVzZXJDb2RlLCBmYWxzZSwgY3VzdG9tVGFnKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRhZ2xpYlZhcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKHRhZ2xpYlZhcnNbaV0uZ2V0U2NvcGUoKSA9PSBWYXJpYWJsZUluZm8uQVRfRU5EKSB7Ci0JCQkJCQlkZWNsID0gdGFnbGliVmFyc1tpXS5nZXREZWNsYXJhdGlvblN0cmluZygpOwotCQkJCQkJYXBwZW5kVG9CdWZmZXIoZGVjbCwgZlVzZXJDb2RlLCBmYWxzZSwgY3VzdG9tVGFnKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJSUZpbGUgZiA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCXRyeSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlQYXRoIHBhdGggPSBuZXcgUGF0aChzTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpOwotCQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCQlmID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQkJCX0KLQkJCQlpZiAoZiAhPSBudWxsICYmIGYuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJcmV0dXJuIGY7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiB1c2VkIGJ5IGlubmVyIGhlbHBlciBjbGFzcyAoWE1MSlNQUmVnaW9uSGVscGVyLCBKU1BJbmNsdWRlUmVnaW9uSGVscGVyKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsKLQkJaWYgKGZCbG9ja01hcmtlcnMgPT0gbnVsbCkKLQkJCWZCbG9ja01hcmtlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBmQmxvY2tNYXJrZXJzOwotCX0KLQotCS8qKgotCSAqIC8qIHRoZSBtYWluIGNvbnRyb2wgbG9vcCBmb3IgdHJhbnNsYXRpbmcgdGhlIGRvY3VtZW50LCBkcml2ZW4gYnkgdGhlCi0JICogc3RydWN0dXJlZERvY3VtZW50IG5vZGVzCi0JICovCi0JcHVibGljIHZvaWQgdHJhbnNsYXRlKCkgewotCQlpZiAoZlRhZ1RvVmFyaWFibGVNYXAgPT0gbnVsbCkgewotCQkJZlRhZ1RvVmFyaWFibGVNYXAgPSBuZXcgU3RhY2tNYXAoKTsKLQkJfQotCQlmVHJhbnNsYXRpb25Qcm9ibGVtcy5jbGVhcigpOwotCi0JCXNldEN1cnJlbnROb2RlKG5ldyBaZXJvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIDApKTsKLQkJdHJhbnNsYXRlUHJlbHVkZXMoKTsKLQotCQlzZXRDdXJyZW50Tm9kZShmU3RydWN0dXJlZERvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCi0JCXdoaWxlIChnZXRDdXJyZW50Tm9kZSgpICE9IG51bGwgJiYgIWlzQ2FuY2VsZWQoKSkgewotCi0JCQkvLyBpbnRlcmNlcHQgSFRNTCBjb21tZW50IGZsYXQgbm9kZQotCQkJLy8gYWxzbyBoYW5kbGVzIFVOREVGSU5FRCAod2hpY2ggaXMgd2hhdCBDREFUQSBjb21lcyBpbiBhcykKLQkJCS8vIGJhc2ljYWxseSB0aGlzIHBhcnQgd2lsbCBoYW5kbGUgYW55ICJlbWJlZGRlZCIgSlNQIGNvbnRhaW5lcnMKLQkJCWlmIChnZXRDdXJyZW50Tm9kZSgpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQgfHwgZ2V0Q3VycmVudE5vZGUoKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCB8fCBnZXRDdXJyZW50Tm9kZSgpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCkgewotCQkJCXRyYW5zbGF0ZVhNTENvbW1lbnROb2RlKGdldEN1cnJlbnROb2RlKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gaXRlcmF0ZSB0aHJvdWdoIGVhY2ggcmVnaW9uIGluIHRoZSBmbGF0IG5vZGUKLQkJCQl0cmFuc2xhdGVSZWdpb25Db250YWluZXIoZ2V0Q3VycmVudE5vZGUoKSwgU1RBTkRBUkRfSlNQKTsKLQkJCX0KLQkJCWlmIChnZXRDdXJyZW50Tm9kZSgpICE9IG51bGwpCi0JCQkJYWR2YW5jZU5leHROb2RlKCk7Ci0JCX0KLQotCQlzZXRDdXJyZW50Tm9kZShuZXcgWmVyb1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmU3RydWN0dXJlZERvY3VtZW50LCBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKSk7Ci0JCXRyYW5zbGF0ZUNvZGFzKCk7Ci0KLQkJYnVpbGRSZXN1bHQoKTsKLQotCQlmVGFnVG9WYXJpYWJsZU1hcC5jbGVhcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50Q29udGVudChJRG9jdW1lbnQgZG9jdW1lbnQsIElucHV0U3RyZWFtIGNvbnRlbnRTdHJlYW0sIFN0cmluZyBjaGFyc2V0KSB7Ci0JCVJlYWRlciBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoY29udGVudFN0cmVhbSwgY2hhcnNldCksIDIwNDgpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoMjA0OCk7Ci0JCQljaGFyW10gcmVhZEJ1ZmZlciA9IG5ldyBjaGFyWzIwNDhdOwotCQkJaW50IG4gPSBpbi5yZWFkKHJlYWRCdWZmZXIpOwotCQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChyZWFkQnVmZmVyLCAwLCBuKTsKLQkJCQluID0gaW4ucmVhZChyZWFkQnVmZmVyKTsKLQkJCX0KLQkJCWRvY3VtZW50LnNldChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKGluICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbi5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlmQ2xhc3NIZWFkZXIgPSAicHVibGljIGNsYXNzIF9KU1BTZXJ2bGV0IGV4dGVuZHMgIjsgLy8kTk9OLU5MUy0xJAotCQlmQ2xhc3NuYW1lID0gIl9KU1BTZXJ2bGV0IjsgLy8kTk9OLU5MUy0xJAotCi0JCWZJbXBsaWNpdEltcG9ydHMgPSAiaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkJImltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkJImltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC4qOyIgKyBFTkRMICsgRU5ETDsgLy8kTk9OLU5MUy0xJAotCi0JCWZTZXJ2aWNlSGVhZGVyID0gInB1YmxpYyB2b2lkIF9qc3BTZXJ2aWNlKGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkiIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCQkJCQkiXHRcdHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb24geyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCQkJCQkiamF2YXguc2VydmxldC5qc3AuUGFnZUNvbnRleHQgcGFnZUNvbnRleHQgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCQkJCQkiamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dCBhcHBsaWNhdGlvbiA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JCQkJCSJqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWcgY29uZmlnID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQgCi0JCQkJCSJqYXZheC5zZXJ2bGV0LmpzcC5Kc3BXcml0ZXIgb3V0ID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkJIk9iamVjdCBwYWdlID0gbnVsbDsiICsgRU5ETDsgLy8kTk9OLU5MUy0xJAotCQlmU3VwZXJjbGFzcyA9ICJqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSB0cmFuc2xhdG9yJ3MgcHJvZ3JzcyBtb25pdG9yLCBmYWxzZSBpZiB0aGUKLQkgKiAgICAgICAgIG1vbml0b3IgaXMgbnVsbAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotCQlyZXR1cm4gKGZQcm9ncmVzc01vbml0b3IgPT0gbnVsbCkgPyBmYWxzZSA6IGZQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZHZhbmNlTmV4dE5vZGUoKSB7Ci0JCXNldEN1cnJlbnROb2RlKGdldEN1cnJlbnROb2RlKCkuZ2V0TmV4dCgpKTsKLQkJaWYgKGdldEN1cnJlbnROb2RlKCkgIT0gbnVsbCkKLQkJCXNldFNvdXJjZVJlZmVyZW5jZVBvaW50KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNvdXJjZVJlZmVyZW5jZVBvaW50KCkgewotCQlpZiAoaXNKU1AoZ2V0Q3VycmVudE5vZGUoKS5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSkpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gZ2V0Q3VycmVudE5vZGUoKS5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCXIgPSAoSVRleHRSZWdpb24pIGl0Lm5leHQoKTsKLQkJCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQgfHwgci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkKLQkJCQkJYnJlYWs7Ci0JCQkJZWxzZSBpZiAoci5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKQotCQkJCQlicmVhazsKLQkJCQllbHNlIGlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFICYmIGdldEN1cnJlbnROb2RlKCkuZ2V0RnVsbFRleHQocikudHJpbSgpLmVxdWFscygiaW1wb3J0IikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB0cmFuc2xhdGVzIGEgcmVnaW9uIGNvbnRhaW5lciAoYW5kIFhNTCBKU1AgY29udGFpbmVyLCBvciA8JSBKU1AKLQkgKiBjb250YWluZXIpCi0JICogCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIHRoaXMgY2xhc3MgYW5kIGZvciBjb250YWluZXJzIGluCi0JICogdGhlIHByaW1hcnkgc3RydWN0dXJlZCBkb2N1bWVudCBhcyBhbGwgYnVmZmVyIGFwcGVuZHMgd2lsbCBiZSBkaXJlY3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVSZWdpb25Db250YWluZXIoSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbnRhaW5lciwgaW50IEpTUFR5cGUpIHsKLQotCQlJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29udGFpbmVyUmVnaW9uID0gY29udGFpbmVyOwotCi0JCS8vIGN1c3RvbSB0YWdzIG5lZWQgdGhlaXIgb3duIHNjb3BlIHt9Ci0JCWhhbmRsZVNjb3BpbmdJZk5lY2Vzc2FyeShjb250YWluZXJSZWdpb24pOwotCi0JCUl0ZXJhdG9yIHJlZ2lvbnMgPSBjb250YWluZXJSZWdpb24uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSkgewotCi0JCQlyZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCi0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0KLQkJCS8vIGNvbnRlbnQgYXNzaXN0IHdhcyBub3Qgc2hvd2luZyB1cCBpbiBKU1AgaW5zaWRlIGEgamF2YXNjcmlwdAotCQkJLy8gcmVnaW9uCi0JCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCQkvLyBjaGVjayBpZiBpdCdzIG5lc3RlZCBqc3AgaW4gYSBzY3JpcHQgdGFnLi4uCi0JCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCS8vIHBhc3MgaW4gYmxvY2sgdGV4dCdzIGNvbnRhaW5lciAmIGl0ZXJhdG9yCi0JCQkJCUl0ZXJhdG9yIHJlZ2lvbkl0ZXJhdG9yID0gKChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHJlZ2lvbikuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJCXRyYW5zbGF0ZUpTUE5vZGUocmVnaW9uLCByZWdpb25JdGVyYXRvciwgdHlwZSwgRU1CRURERURfSlNQKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8qKgotCQkJCQkgKiBMSU1JVEFUSU9OIC0gTm9ybWFsbHkgdGhlIHNjcmlwdCBjb250ZW50IHdpdGhpbiBhCi0JCQkJCSAqIHNjcmlwdCB0YWcgaXMgYSBzaW5nbGUgZG9jdW1lbnQgcmVnaW9uIHdpdGggYSBzaW5nbGUKLQkJCQkJICogQkxPQ0tfVEVYVCB0ZXh0IHJlZ2lvbiB3aXRoaW4gaXQuIEFueSBKU1Agc2NyaXB0aW5nCi0JCQkJCSAqIHdpbGwgYmUgd2l0aGluIGl0cyBvd24gcmVnaW9uIGNvbnRhaW5lciAoZm9yIHRoZSBzYWtlCi0JCQkJCSAqIG9mIGtlZXBpbmcgdGhlIHNjcmlwdGluZyBvcGVuL2NvbnRlbnQvZW5kIGFzIGEgZ3JvdXApCi0JCQkJCSAqIGFsc28gb2YgQkxPQ0tfVEVYVC4gVGhhdCBpZ25vcmVzIGN1c3RvbSB0YWdzIHRoYXQgbWlnaHQKLQkJCQkJICogYmUgaW4gdGhlcmUsIHRob3VnaCwgYXMgdGhleSByZXF1aXJlIHByb3BlciBzY29waW5nIGFuZAotCQkJCQkgKiB2YXJpYWJsZSBkZWNsYXJhdGlvbiB0byBiZSBwZXJmb3JtZWQgZXZlbiB0aG91Z2gKLQkJCQkJICogdGhleSdyZSBub3QgcHJvcGVyIG5vZGVzIGluIHRoZSBET00uIFRoZSBvbmx5IHdheSB0bwotCQkJCQkgKiByZWFsbHkgZG8gdGhpcyBpcyB0byB0cmVhdCB0aGUgZW50aXJlIHNjcmlwdCBjb250ZW50IGFzCi0JCQkJCSAqIEpTUCBjb250ZW50IG9uIGl0cyBvd24sIGFraW4gdG8gYW4gaW5jbHVkZWQgc2VnbWVudC4KLQkJCQkJICogRnVydGhlciBjb21wbGljYXRpbmcgdGhpcyBzb2x1dGlvbiBpcyB0aGF0IHRhZ2RlcGVuZGVudAotCQkJCQkgKiBjdXN0b20gdGFncyBoYXZlIHRoZWlyIGNvbW1lbnQgbWFya2VkIGFzIEJMT0NLX1RFWFQgYXMKLQkJCQkJICogd2VsbCwgc28gdGhlcmUncyBubyBjbGVhciB3YXkgdG8gdGVsbCB0aGUgdHdvIGNhc2VzCi0JCQkJCSAqIGFwYXJ0LgotCQkJCQkgKi8KLQotCQkJCQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkJCQkvLyBUSElTIEVNQkVEREVEIEpTUCBURVhUIFdJTEwgQ09NRSBPVVQgTEFURVIgV0hFTgotCQkJCQkvLyBQQVJUSVRJT05JTkcgSEFTCi0JCQkJCS8vIFNVUFBPUlQgRk9SIE5FU1RFRCBYTUwtSlNQCi0JCQkJCS8vIENNVkMgMjQxODgyCi0JCQkJCWRlY29kZVNjcmlwdEJsb2NrKGNvbnRhaW5lclJlZ2lvbi5nZXRGdWxsVGV4dChyZWdpb24pLCBjb250YWluZXJSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCQkJfQotCQkJfQotCQkJLy8gaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbiAmJgotCQkJLy8gKChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHJlZ2lvbikuZ2V0TnVtYmVyT2ZSZWdpb25zKCkgPiAwKSB7Ci0JCQkvLyB0cmFuc2xhdGVSZWdpb25Db250YWluZXIoKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgcmVnaW9uLAotCQkJLy8gRU1CRURERURfSlNQKTsKLQkJCS8vIH0KLQkJCWlmICh0eXBlICE9IG51bGwgJiYgaXNKU1AodHlwZSkpIC8vIDwlLCA8JT0sIDwlISwgPCVACi0JCQl7Ci0JCQkJLy8gdHJhbnNsYXRlSlNQTm9kZShyZWdpb24sIHJlZ2lvbnMsIHR5cGUsIEpTUFR5cGUpOwotCQkJCXRyYW5zbGF0ZUpTUE5vZGUoY29udGFpbmVyUmVnaW9uLCByZWdpb25zLCB0eXBlLCBKU1BUeXBlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgIT0gbnVsbCAmJiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiB8fCB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikpIHsKLQkJCQl0cmFuc2xhdGVYTUxOb2RlKGNvbnRhaW5lclJlZ2lvbiwgcmVnaW9ucyk7Ci0JCQl9Ci0JCX0KLQkJLy8gfQotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTY29waW5nSWZOZWNlc3NhcnkoSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbnRhaW5lclJlZ2lvbikgewotCQkvKgotCQkgKiAxOTkwNDcgLSBCcmFjZXMgbWlzc2luZyBmcm9tIHRyYW5zbGF0aW9uIG9mIGN1c3RvbSB0YWdzIG5vdAotCQkgKiBkZWZpbmluZyB2YXJpYWJsZXMKLQkJICovCi0KLQkJLy8gY29kZSB3aXRoaW4gYSBjdXN0b20gdGFnIGdldHMgaXRzIG93biBzY29wZQotCQkvLyBzbyBpZiB3ZSBlbmNvdW50ZXIgYSBzdGFydCBvZiBhIGN1c3RvbSB0YWcsIHdlIGFkZCAneycKLQkJLy8gYW5kIGZvciB0aGUgZW5kIG9mIGEgY3VzdG9tIHRhZyB3ZSBhZGQgJ30nCi0JCWlmIChjb250YWluZXJSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHsKLQkJCS8vIGRvbid0IGFkZCAneycgaWYgaXQncyBhIHNlbGYgY2xvc2luZyB0YWcKLQkJCWlmICghaXNTZWxmQ2xvc2luZ1RhZyhjb250YWluZXJSZWdpb24pKSB7Ci0JCQkJaWYgKGlzQ3VzdG9tVGFnKGNvbnRhaW5lclJlZ2lvbikpIHsKLQkJCQkJc3RhcnRTY29wZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChjb250YWluZXJSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQlpZiAoaXNDdXN0b21UYWcoY29udGFpbmVyUmVnaW9uKSkgewotCQkJCWVuZFNjb3BlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRTY29wZSgpIHsKLQkJLy8gZlNjb3BlRGVwdGgrKzsKLQkJU3RyaW5nQnVmZmVyIHRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCS8vIGZvcihpbnQgaT0wOyBpPGZTY29wZURlcHRoOyBpKyspIHRleHQuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJdGV4dC5hcHBlbmQoInsgLy8gPCIpOyAvLyROT04tTkxTLTEkCi0JCXRleHQuYXBwZW5kKGdldFJlZ2lvbk5hbWUoZkN1cnJlbnROb2RlKSk7Ci0JCXRleHQuYXBwZW5kKCI+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQlhcHBlbmRUb0J1ZmZlcih0ZXh0LnRvU3RyaW5nKCksIGZVc2VyQ29kZSwgZmFsc2UsIGZDdXJyZW50Tm9kZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5kU2NvcGUoKSB7Ci0JCVN0cmluZ0J1ZmZlciB0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0ZXh0LmFwcGVuZCgifSAvLyA8LyIpOyAvLyROT04tTkxTLTEkCi0JCXRleHQuYXBwZW5kKGdldFJlZ2lvbk5hbWUoZkN1cnJlbnROb2RlKSk7Ci0JCXRleHQuYXBwZW5kKCI+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQlhcHBlbmRUb0J1ZmZlcih0ZXh0LnRvU3RyaW5nKCksIGZVc2VyQ29kZSwgZmFsc2UsIGZDdXJyZW50Tm9kZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTZWxmQ2xvc2luZ1RhZyhJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29udGFpbmVyUmVnaW9uKSB7Ci0KLQkJaWYgKGNvbnRhaW5lclJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gY29udGFpbmVyUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCXJldHVybiByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3VzdG9tVGFnKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXJSZWdpb24pIHsKLQkJU3RyaW5nIHRhZ05hbWUgPSBnZXRSZWdpb25OYW1lKGNvbnRhaW5lclJlZ2lvbik7Ci0KLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlKU1BTb3VyY2VQYXJzZXIgcGFyc2VyID0gKEpTUFNvdXJjZVBhcnNlcikgZlN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKTsKLQkJaW50IGNvbG9uSW5kZXggPSB0YWdOYW1lLmluZGV4T2YoIjoiKTsKLQkJaWYgKGNvbG9uSW5kZXggPiAwKSB7Ci0JCQlTdHJpbmcgcHJlZml4ID0gdGFnTmFtZS5zdWJzdHJpbmcoMCwgY29sb25JbmRleCk7Ci0JCQlpZiAocHJlZml4LmVxdWFscygianNwIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCVRhZ01hcmtlcltdIHByZWZpeGVzID0gKFRhZ01hcmtlcltdKSBwYXJzZXIuZ2V0TmVzdGFibGVQcmVmaXhlcygpLnRvQXJyYXkobmV3IFRhZ01hcmtlclswXSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHByZWZpeC5lcXVhbHMocHJlZml4ZXNbaV0uZ2V0VGFnTmFtZSgpKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UmVnaW9uTmFtZShJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29udGFpbmVyUmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gY29udGFpbmVyUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gciA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJbmFtZVJlZ2lvbiA9IHI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWVSZWdpb24gIT0gbnVsbCA/IGNvbnRhaW5lclJlZ2lvbi5nZXRUZXh0KG5hbWVSZWdpb24pLnRyaW0oKSA6IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICoqCi0JICogVEVNUCBXT1JLQVJPVU5EIEZPUiBDTVZDIDI0MTg4MiBUYWtlcyBhIFN0cmluZyBhbmQgYmxvY2tzIG91dAotCSAqIGpzcDpzY3JpcHRsZXQsIGpzcDpleHByZXNzaW9uLCBhbmQganNwOmRlY2xhcmF0aW9uIEBwYXJhbSBibG9ja1RleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlY29kZVNjcmlwdEJsb2NrKFN0cmluZyBibG9ja1RleHQsIGludCBzdGFydE9mQmxvY2spIHsKLQkJWE1MSlNQUmVnaW9uSGVscGVyIGhlbHBlciA9IG5ldyBYTUxKU1BSZWdpb25IZWxwZXIodGhpcywgZmFsc2UpOwotCQloZWxwZXIuYWRkQmxvY2tNYXJrZXIobmV3IEJsb2NrTWFya2VyKCJqc3A6c2NyaXB0bGV0IiwgbnVsbCwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKLQkJaGVscGVyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcigianNwOmV4cHJlc3Npb24iLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAotCQloZWxwZXIuYWRkQmxvY2tNYXJrZXIobmV3IEJsb2NrTWFya2VyKCJqc3A6ZGVjbGFyYXRpb24iLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAotCQloZWxwZXIuYWRkQmxvY2tNYXJrZXIobmV3IEJsb2NrTWFya2VyKCJqc3A6ZGlyZWN0aXZlLmluY2x1ZGUiLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAotCQloZWxwZXIuYWRkQmxvY2tNYXJrZXIobmV3IEJsb2NrTWFya2VyKCJqc3A6ZGlyZWN0aXZlLnRhZ2xpYiIsIG51bGwsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5ULCBmYWxzZSkpOyAvLyROT04tTkxTLTEkCi0JCWhlbHBlci5yZXNldChibG9ja1RleHQsIHN0YXJ0T2ZCbG9jayk7Ci0JCS8vIGZvcmNlIHBhcnNlCi0JCWhlbHBlci5mb3JjZVBhcnNlKCk7Ci0JfQotCi0JLyoKLQkgKiByZXR1cm5zIHN0cmluZyBtaW51cyBDREFUQSBvcGVuIGFuZCBjbG9zZSB0ZXh0Ci0JICovCi0JZmluYWwgcHVibGljIFN0cmluZyBzdHJpcENEQVRBKFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyByZXN1bHRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIENEQVRBX09QRU4gPSAiPCFbQ0RBVEFbIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgQ0RBVEFfQ0xPU0UgPSAiXV0+IjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgc3RhcnQgPSAwOwotCQlpbnQgZW5kID0gdGV4dC5sZW5ndGgoKTsKLQkJd2hpbGUgKHN0YXJ0IDwgdGV4dC5sZW5ndGgoKSkgewotCQkJaWYgKHRleHQuaW5kZXhPZihDREFUQV9PUEVOLCBzdGFydCkgPiAtMSkgewotCQkJCWVuZCA9IHRleHQuaW5kZXhPZihDREFUQV9PUEVOLCBzdGFydCk7Ci0JCQkJcmVzdWx0VGV4dCArPSB0ZXh0LnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLQkJCQlzdGFydCA9IGVuZCArIENEQVRBX09QRU4ubGVuZ3RoKCk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0ZXh0LmluZGV4T2YoQ0RBVEFfQ0xPU0UsIHN0YXJ0KSA+IC0xKSB7Ci0JCQkJZW5kID0gdGV4dC5pbmRleE9mKENEQVRBX0NMT1NFLCBzdGFydCk7Ci0JCQkJcmVzdWx0VGV4dCArPSB0ZXh0LnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLQkJCQlzdGFydCA9IGVuZCArIENEQVRBX0NMT1NFLmxlbmd0aCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZW5kID0gdGV4dC5sZW5ndGgoKTsKLQkJCQlyZXN1bHRUZXh0ICs9IHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHRUZXh0OwotCX0KLQotCS8vIEVORCBPRiBXT1JLQVJPVU5EIENPREUuLi4KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLyoqCi0JICogZGV0ZXJtaW5lcyBpZiB0aGUgdHlwZSBpcyBhIHB1cmUgSlNQIHR5cGUgKG5vdCBYTUwpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNKU1AoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICgodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4gfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4gfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4gfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9PUEVOKSAmJiB0eXBlICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKTsKLQkJLy8gY2hlY2tpbmcgWE1MX1RBR19PUEVOIHNvIDxqc3A6ZGlyZWN0aXZlLnh4eC8+IGdldHMgdHJlYXRlZCBsaWtlCi0JCS8vIG90aGVyIFhNTCBqc3AgdGFncwotCX0KLQotCS8qKgotCSAqIHRyYW5zbGF0ZXMgdGhlIHZhcmlvdXMgWE1MSlNQIHR5cGUgbm9kZXMKLQkgKiAKLQkgKiBAcGFyYW0gcmVnaW9ucwotCSAqICAgICAgICAgICAgdGhlIHJlZ2lvbnMgb2YgdGhlIFhNTE5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVYTUxOb2RlKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXIsIEl0ZXJhdG9yIHJlZ2lvbnMpIHsKLQkJLy8gY29udGVudHMgbXVzdCBiZSB2YWxpZCBYSFRNTCwgdHJhbnNsYXRlIGVzY2FwZWQgQ0RBVEEgaW50byB3aGF0IGl0Ci0JCS8vIHJlYWxseSBpcy4uLgotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJaWYgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQlyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCS8vIDxqc3A6ZGlyZWN0aXZlLnh4eCA+IGNvbWVzIGluIGFzIHRoaXMKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCByLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpCi0KLQkJCXsKLQkJCQlTdHJpbmcgZnVsbFRhZ05hbWUgPSBjb250YWluZXIuZ2V0VGV4dChyKTsKLQkJCQlpZiAoZnVsbFRhZ05hbWUuaW5kZXhPZignOicpID4gLTEpIHsKLQkJCQkJYWRkVGFnbGliVmFyaWFibGVzKGZ1bGxUYWdOYW1lLCBjb250YWluZXIpOyAvLyBpdAotCQkJCQkvLyBtYXkKLQkJCQkJLy8gYmUgYQotCQkJCQkvLyBjdXN0b20KLQkJCQkJLy8gdGFnCi0JCQkJfQotCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZnVsbFRhZ05hbWUsICI6LiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChzdC5oYXNNb3JlVG9rZW5zKCkgJiYgc3QubmV4dFRva2VuKCkuZXF1YWxzKCJqc3AiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJaWYgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJU3RyaW5nIGpzcFRhZ05hbWUgPSBzdC5uZXh0VG9rZW4oKTsKLQotCQkJCQkJaWYgKGpzcFRhZ05hbWUuZXF1YWxzKCJzY3JpcHRsZXQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJewotCQkJCQkJCXRyYW5zbGF0ZVhNTEpTUENvbnRlbnQoU0NSSVBUTEVUKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGpzcFRhZ05hbWUuZXF1YWxzKCJleHByZXNzaW9uIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXsKLQkJCQkJCQl0cmFuc2xhdGVYTUxKU1BDb250ZW50KEVYUFJFU1NJT04pOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoanNwVGFnTmFtZS5lcXVhbHMoImRlY2xhcmF0aW9uIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXsKLQkJCQkJCQl0cmFuc2xhdGVYTUxKU1BDb250ZW50KERFQ0xBUkFUSU9OKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGpzcFRhZ05hbWUuZXF1YWxzKCJkaXJlY3RpdmUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJewotCQkJCQkJCWlmIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCQkJU3RyaW5nIGRpcmVjdGl2ZU5hbWUgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQkJCQkJaWYgKGRpcmVjdGl2ZU5hbWUuZXF1YWxzKCJ0YWdsaWIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl3aGlsZSAociAhPSBudWxsICYmIHJlZ2lvbnMuaGFzTmV4dCgpICYmICFyLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSkgewotCQkJCQkJCQkJCXIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJCQkJCQkJCWlmIChjb250YWluZXIuZ2V0VGV4dChyKS5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1BSRUZJWCkpIHsKLQkJCQkJCQkJCQkJU3RyaW5nIHByZWZpeCA9IGdldEF0dHJpYnV0ZVZhbHVlKHIsIHJlZ2lvbnMpOwotCQkJCQkJCQkJCQlpZiAocHJlZml4ICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJCWhhbmRsZVRhZ2xpYihwcmVmaXgpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgaWYgKGRpcmVjdGl2ZU5hbWUuZXF1YWxzKCJpbmNsdWRlIikpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQkJCQlTdHJpbmcgZmlsZUxvY2F0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkJCQkJLy8gc2tpcCB0byByZXF1aXJlZCAiZmlsZSIgYXR0cmlidXRlLAotCQkJCQkJCQkJLy8gc2hvdWxkIGJlIHNhZmUgYmVjYXVzZQotCQkJCQkJCQkJLy8gImZpbGUiIGlzIHRoZSBvbmx5IGF0dHJpYnV0ZSBmb3IgdGhlCi0JCQkJCQkJCQkvLyBpbmNsdWRlIGRpcmVjdGl2ZQotCQkJCQkJCQkJd2hpbGUgKHIgIT0gbnVsbCAmJiByZWdpb25zLmhhc05leHQoKSAmJiAhci5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpIHsKLQkJCQkJCQkJCQlyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWZpbGVMb2NhdGlvbiA9IGdldEF0dHJpYnV0ZVZhbHVlKHIsIHJlZ2lvbnMpOwotCQkJCQkJCQkJaWYgKGZpbGVMb2NhdGlvbiAhPSBudWxsKQotCQkJCQkJCQkJCWhhbmRsZUluY2x1ZGVGaWxlKGZpbGVMb2NhdGlvbik7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSBpZiAoZGlyZWN0aXZlTmFtZS5lcXVhbHMoInBhZ2UiKSkgeyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCQkJCS8vIGJhZCBpZiBjdXJyZW50Tm9kZSBpcyByZWZlcmVuY2VkIGFmdGVyCi0JCQkJCQkJCQkvLyBoZXJlIHcvIHRoZSBjdXJyZW50IGxpc3QKLQkJCQkJCQkJCS8vIHNlZToKLQkJCQkJCQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zMDM1Ci0JCQkJCQkJCQkvLyBzZXRDdXJyZW50Tm9kZShnZXRDdXJyZW50Tm9kZSgpLmdldE5leHQoKSk7Ci0JCQkJCQkJCQlpZiAoZ2V0Q3VycmVudE5vZGUoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJLy8gJ3JlZ2lvbnMnIGNvbnRhaW4gdGhlIGF0dHJzCi0JCQkJCQkJCQkJdHJhbnNsYXRlUGFnZURpcmVjdGl2ZUF0dHJpYnV0ZXMocmVnaW9ucywgZ2V0Q3VycmVudE5vZGUoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSBpZiAoZGlyZWN0aXZlTmFtZS5lcXVhbHMoInRhZyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXRyYW5zbGF0ZVBhZ2VEaXJlY3RpdmVBdHRyaWJ1dGVzKHJlZ2lvbnMsIGdldEN1cnJlbnROb2RlKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgaWYgKGRpcmVjdGl2ZU5hbWUuZXF1YWxzKCJ2YXJpYWJsZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXRyYW5zbGF0ZVZhcmlhYmxlRGlyZWN0aXZlQXR0cmlidXRlcyhyZWdpb25zKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGpzcFRhZ05hbWUuZXF1YWxzKCJpbmNsdWRlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIDxqc3A6aW5jbHVkZSBwYWdlPSJmaWxlbmFtZSIpIC8+Ci0JCQkJCQkJY2hlY2tBdHRyaWJ1dGVWYWx1ZUNvbnRhaW5lcihyZWdpb25zLCAicGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChqc3BUYWdOYW1lLmVxdWFscygiZm9yd2FyZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQljaGVja0F0dHJpYnV0ZVZhbHVlQ29udGFpbmVyKHJlZ2lvbnMsICJwYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGpzcFRhZ05hbWUuZXF1YWxzKCJwYXJhbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQljaGVja0F0dHJpYnV0ZVZhbHVlQ29udGFpbmVyKHJlZ2lvbnMsICJ2YWx1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChqc3BUYWdOYW1lLmVxdWFscygic2V0UHJvcGVydHkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJY2hlY2tBdHRyaWJ1dGVWYWx1ZUNvbnRhaW5lcihyZWdpb25zLCAidmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoanNwVGFnTmFtZS5lcXVhbHMoInVzZUJlYW4iKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJewotCQkJCQkJCWNoZWNrQXR0cmlidXRlVmFsdWVDb250YWluZXIocmVnaW9ucywgIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDMwMDQKLQkJCQkJCQkvLyBhZHZhbmNlTmV4dE5vZGUoKTsgLy8gZ2V0IHRoZSBjb250ZW50Ci0JCQkJCQkJaWYgKGdldEN1cnJlbnROb2RlKCkgIT0gbnVsbCkgewotCQkJCQkJCQl0cmFuc2xhdGVVc2VCZWFuKGNvbnRhaW5lcik7IC8vICdyZWdpb25zJwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljaGVja0FsbEF0dHJpYnV0ZVZhbHVlQ29udGFpbmVycyhyZWdpb25zKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB0cmFuc2xhdGVzIGVtYmVkZGVkIGNvbnRhaW5lcnMgZm9yIEFMTCBhdHRyaWJ1dGUgdmFsdWVzCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tBbGxBdHRyaWJ1dGVWYWx1ZUNvbnRhaW5lcnMoSXRlcmF0b3IgcmVnaW9ucykgewotCQkvLyB0YWcgbmFtZSBpcyBub3QganNwCi0JCS8vIGhhbmRsZSBlbWJlZGRlZCBqc3AgYXR0cmlidXRlcy4uLgotCQlJVGV4dFJlZ2lvbiBlbWJlZGRlZCA9IG51bGw7Ci0JCS8vIEl0ZXJhdG9yIGF0dHJSZWdpb25zID0gbnVsbDsKLQkJLy8gSVRleHRSZWdpb24gYXR0ckNodW5rID0gbnVsbDsKLQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQllbWJlZGRlZCA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQlpZiAoZW1iZWRkZWQgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCS8vIHBhcnNlIG91dCBjb250YWluZXIKLQotCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzA2MDYKLQkJCQkvLyBmaXggZXhwb25lbnRpYWwgaXRlcmF0aW9uIHByb2JsZW0gdy8gZW1iZWRkZWQgZXhwcmVzc2lvbnMKLQkJCQl0cmFuc2xhdGVFbWJlZGRlZEpTUEluQXR0cmlidXRlKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgZW1iZWRkZWQpOwotCQkJCS8vIGF0dHJSZWdpb25zID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikKLQkJCQkvLyBlbWJlZGRlZCkuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJLy8gd2hpbGUgKGF0dHJSZWdpb25zLmhhc05leHQoKSkgewotCQkJCS8vIGF0dHJDaHVuayA9IChJVGV4dFJlZ2lvbikgYXR0clJlZ2lvbnMubmV4dCgpOwotCQkJCS8vIFN0cmluZyB0eXBlID0gYXR0ckNodW5rLmdldFR5cGUoKTsKLQkJCQkvLyAvLyBlbWJlZGRlZCBKU1AgaW4gYXR0cmlidXRlIHN1cHBvcnQgb25seSB3YW50IHRvCi0JCQkJLy8gLy8gdHJhbnNsYXRlIG9uZSB0aW1lIHBlcgotCQkJCS8vIC8vIGVtYmVkZGVkIHJlZ2lvbiBzbyB3ZSBvbmx5IHRyYW5zbGF0ZSBvbiB0aGUgSlNQIG9wZW4KLQkJCQkvLyAvLyB0YWdzIChub3QgY29udGVudCkKLQkJCQkvLyBpZiAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOIHx8Ci0JCQkJLy8gdHlwZSA9PQotCQkJCS8vIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTiB8fCB0eXBlID09Ci0JCQkJLy8gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4gfHwgdHlwZSA9PQotCQkJCS8vIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiB8fCB0eXBlID09Ci0JCQkJLy8gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX09QRU4pIHsKLQkJCQkvLyAvLyBub3cgY2FsbCBqc3B0cmFuc2xhdGUKLQkJCQkvLyB0cmFuc2xhdGVFbWJlZGRlZEpTUEluQXR0cmlidXRlKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikKLQkJCQkvLyBlbWJlZGRlZCk7Ci0JCQkJLy8gYnJlYWs7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHRyYW5zbGF0ZXMgZW1iZWRkZWQgY29udGFpbmVyIGZvciBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbnMKLQkgKiBAcGFyYW0gYXR0ck5hbWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tBdHRyaWJ1dGVWYWx1ZUNvbnRhaW5lcihJdGVyYXRvciByZWdpb25zLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSkgewotCQkJciA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FICYmIGdldEN1cnJlbnROb2RlKCkuZ2V0VGV4dChyKS5lcXVhbHMoYXR0ck5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBza2lwIHRvIGF0dHJpYnV0ZSB2YWx1ZQotCQkJCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCkpICE9IG51bGwpIHsKLQkJCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLy8gZm9yY2VzIGVtYmVkZGVkIHJlZ2lvbiB0byBiZSB0cmFuc2xhdGVkCi0JCQkJaWYgKHIgaW5zdGFuY2VvZiBDb250ZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCXRyYW5zbGF0ZUVtYmVkZGVkSlNQSW5BdHRyaWJ1dGUoKENvbnRleHRSZWdpb25Db250YWluZXIpIHIpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogZXhhbXBsZToKLQkgKiAKLQkgKiA8anNwOnNjcmlwdGxldD5zY3JpcHRsZXQganNwLWphdmEgY29udGVudCA8IVtDREFUQVsgbW9yZSBqc3AgamF2YSBdXT4KLQkgKiBqc3AtamF2YSBjb250ZW50Li4uIDwhW0NEQVRBWyBtb3JlIGpzcCBqYXZhIF1dPiA8L2pzcDpzY3JpcHRsZXQ+Ci0JICogCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkzMzY2Ci0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg4NTkwIHRyYW5zbGF0ZQotCSAqIGV2ZXJ5dGhpbmcgaW5iZXR3ZWVuIDxzY3JpcHRsZXQ+IHRhZ3MsIHdoaWNoIG1heSBiZSBtb3JlIHRoYW4gb25lCi0JICogcmVnaW9uIChlc3AuIENEQVRBKQotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB0cmFuc2xhdGVYTUxKU1BDb250ZW50KGludCB0eXBlKSB7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZHIgPSBnZXRDdXJyZW50Tm9kZSgpLmdldE5leHQoKTsKLQkJaW50IHN0YXJ0ID0gc2RyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSBzZHIuZ2V0RW5kT2Zmc2V0KCk7Ci0JCVN0cmluZyBzZHJUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyByZWFkIHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9ucyB1bnRpbAotCQkvLyA8L2pzcDpzY3JpcHRsZXQ+IG9yIEVPRgotCQl3aGlsZSAoc2RyICE9IG51bGwgJiYgc2RyLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCi0JCQkvLyBzZXR1cCBmb3IgbmV4dCByZWdpb24KLQkJCXN0YXJ0ID0gc2RyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlzZHJUZXh0ID0gc2RyLmdldFRleHQoKTsKLQotCQkJaWYgKHNkci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCkgewotCi0JCQkJLy8ganVzdCB0byBiZSBzYWZlLCBtYWtlIHN1cmUgQ0RBVEEgc3RhcnQgJiBlbmQgYXJlIHRoZXJlCi0JCQkJaWYgKHNkclRleHQuc3RhcnRzV2l0aCgiPCFbQ0RBVEFbIikgJiYgc2RyVGV4dC5lbmRzV2l0aCgiXV0+IikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkJc3RhcnQgPSBzZHIuZ2V0U3RhcnRPZmZzZXQoKSArIDk7IC8vIDwhW0NEQVRBWwotCQkJCQllbmQgPSBzZHIuZ2V0RW5kT2Zmc2V0KCkgLSAzOyAvLyBdXT4KLQkJCQkJc2RyVGV4dCA9IHNkclRleHQuc3Vic3RyaW5nKDksIHNkclRleHQubGVuZ3RoKCkgLSAzKTsKLQkJCQkJd3JpdGVUb0J1ZmZlcih0eXBlLCBzZHJUZXh0LCBzdGFydCwgZW5kKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQotCQkJCS8vIGhhbmRsZSBlbnRpdHkgcmVmZXJlbmNlcwotCQkJCXNkclRleHQgPSBFc2NhcGVkVGV4dFV0aWwuZ2V0VW5lc2NhcGVkVGV4dChzZHJUZXh0KTsKLQkJCQllbmQgPSBzZHIuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJd3JpdGVUb0J1ZmZlcih0eXBlLCBzZHJUZXh0LCBzdGFydCwgZW5kKTsKLQkJCX0KLQkJCXNkciA9IHNkci5nZXROZXh0KCk7Ci0JCX0KLQkJc2V0Q3VycmVudE5vZGUoc2RyKTsKLQkJc2V0U291cmNlUmVmZXJlbmNlUG9pbnQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVUb0J1ZmZlcihpbnQgdHlwZSwgU3RyaW5nIGNvbnRlbnQsIGludCBqc3BTdGFydCwgaW50IGpzcEVuZCkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgU0NSSVBUTEVUIDoKLQkJCQl0cmFuc2xhdGVTY3JpcHRsZXRTdHJpbmcoY29udGVudCwgZ2V0Q3VycmVudE5vZGUoKSwganNwU3RhcnQsIGpzcEVuZCAtIGpzcFN0YXJ0LCBmYWxzZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVYUFJFU1NJT04gOgotCQkJCXRyYW5zbGF0ZUV4cHJlc3Npb25TdHJpbmcoY29udGVudCwgZ2V0Q3VycmVudE5vZGUoKSwganNwU3RhcnQsIGpzcEVuZCAtIGpzcFN0YXJ0LCBmYWxzZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERFQ0xBUkFUSU9OIDoKLQkJCQl0cmFuc2xhdGVEZWNsYXJhdGlvblN0cmluZyhjb250ZW50LCBnZXRDdXJyZW50Tm9kZSgpLCBqc3BTdGFydCwganNwRW5kIC0ganNwU3RhcnQsIGZhbHNlKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdvZXMgdGhyb3VnaCBjb21tZW50IHJlZ2lvbnMsIGNoZWNrcyBpZiBhbnkgYXJlIGFuIGVtYmVkZGVkIEpTUAotCSAqIGNvbnRhaW5lciBpZiBpdCBmaW5kcyBvbmUsIGl0J3Mgc2VuZHMgdGhlIGNvbnRhaW5lciBpbnRvIHRoZQotCSAqIHRyYW5zbGF0aW9uIHJvdXRpbmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVYTUxDb21tZW50Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJSXRlcmF0b3IgaXQgPSBub2RlLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiBjb21tZW50UmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKGl0ICE9IG51bGwgJiYgaXQuaGFzTmV4dCgpKSB7Ci0JCQljb21tZW50UmVnaW9uID0gKElUZXh0UmVnaW9uKSBpdC5uZXh0KCk7Ci0JCQlpZiAoY29tbWVudFJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJdHJhbnNsYXRlUmVnaW9uQ29udGFpbmVyKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgY29tbWVudFJlZ2lvbiwgRU1CRURERURfSlNQKTsgLy8gaXQncwotCQkJCS8vIGVtYmVkZGVkCi0JCQkJLy8ganNwLi4uaXRlcmF0ZQotCQkJCS8vIHJlZ2lvbnMuLi4KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGRldGVybWluZXMgd2hpY2ggdHlwZSBvZiBKU1Agbm9kZSB0byB0cmFuc2xhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVKU1BOb2RlKElUZXh0UmVnaW9uIHJlZ2lvbiwgSXRlcmF0b3IgcmVnaW9ucywgU3RyaW5nIHR5cGUsIGludCBKU1BUeXBlKSB7Ci0JCWlmICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiAmJiByZWdpb25zICE9IG51bGwpIHsKLQkJCXRyYW5zbGF0ZURpcmVjdGl2ZShyZWdpb25zKTsKLQkJfQotCQllbHNlIHsKLQkJCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250ZW50UmVnaW9uID0gbnVsbDsKLQkJCWlmIChKU1BUeXBlID09IFNUQU5EQVJEX0pTUCAmJiAoc2V0Q3VycmVudE5vZGUoZ2V0Q3VycmVudE5vZGUoKS5nZXROZXh0KCkpKSAhPSBudWxsKSB7Ci0JCQkJY29udGVudFJlZ2lvbiA9IGdldEN1cnJlbnROb2RlKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChKU1BUeXBlID09IEVNQkVEREVEX0pTUCAmJiByZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHsKLQkJCQl0cmFuc2xhdGVFbWJlZGRlZEpTUEluQmxvY2soKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgcmVnaW9uLCByZWdpb25zKTsKLQkJCQkvLyBlbnN1cmUgdGhlIHJlc3Qgb2YgdGhpcyBtZXRob2Qgd29uJ3QgYmUgY2FsbGVkCi0JCQl9Ci0JCQlpZiAoY29udGVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTikgewotCQkJCQl0cmFuc2xhdGVFeHByZXNzaW9uKGNvbnRlbnRSZWdpb24pOwotCQkJCX0KLQkJCQllbHNlIGlmICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOKSB7Ci0JCQkJCXRyYW5zbGF0ZURlY2xhcmF0aW9uKGNvbnRlbnRSZWdpb24pOwotCQkJCX0KLQkJCQllbHNlIGlmICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOKSB7Ci0JCQkJCXRyYW5zbGF0ZVNjcmlwdGxldChjb250ZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB0aGlzIGlzIHRoZSBjYXNlIG9mIGFuIGF0dHJpYnV0ZSB3LyBubyByZWdpb24gPHAKLQkJCQkvLyBhbGlnbj0iPCUlPiI+Ci0JCQkJc2V0Q3Vyc29yT3duZXIoZ2V0SlNQVHlwZUZvclJlZ2lvbihyZWdpb24pKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIHRyYW5zbGF0ZUVMKFN0cmluZyBlbFRleHQsIFN0cmluZyBkZWxpbSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSwgaW50IGNvbnRlbnRTdGFydCwgaW50IGNvbnRlbnRMZW5ndGgpIHsKLQkJSUpTUEVMVHJhbnNsYXRvciB0cmFuc2xhdG9yID0gZ2V0RUxUcmFuc2xhdG9yKCk7Ci0JCWlmIChudWxsICE9IHRyYW5zbGF0b3IpIHsKLQkJCXRyYW5zbGF0b3IudHJhbnNsYXRlRUwoZWxUZXh0LCBkZWxpbSwgY3VycmVudE5vZGUsIGNvbnRlbnRTdGFydCwgY29udGVudExlbmd0aCwgZlVzZXJFTEV4cHJlc3Npb25zLCBmVXNlckVMUmFuZ2VzLCBmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc2NvdmVyIGFuZCBpbnN0YW50aWF0ZSBhbiBFTCB0cmFuc2xhdG9yLgotCSAqLwotCXB1YmxpYyBJSlNQRUxUcmFuc2xhdG9yIGdldEVMVHJhbnNsYXRvcigpIHsKLQkJaWYgKGZFTFRyYW5zbGF0b3IgPT0gbnVsbCkgewotCi0JCQkvKgotCQkJICogbmFtZSBvZiBwbHVnaW4gdGhhdCBleHBvc2VzIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ci0JCQkgKi8KLQkJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoSlNQX0NPUkVfUExVR0lOX0lELCBFTF9UUkFOU0xBVE9SX0VYVEVOU0lPTl9OQU1FKTsgLy8gLQotCQkJLy8gZXh0ZW5zaW9uCi0JCQkvLyBpZAotCi0JCQkvLyBJdGVyYXRlIG92ZXIgYWxsIGRlY2xhcmVkIGV4dGVuc2lvbnMgb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuCi0JCQkvLyBBIHNpbmdsZSBwbHVnaW4gbWF5IGV4dGVuZCB0aGUgZXh0ZW5zaW9uIHBvaW50IG1vcmUgdGhhbiBvbmNlLAotCQkJLy8gYWx0aG91Z2ggaXQncyBub3QgcmVjb21tZW5kZWQuCi0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgYmVzdFRyYW5zbGF0b3IgPSBudWxsOwotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBjdXJFeHRlbnNpb24gPSAwOyBjdXJFeHRlbnNpb24gPCBleHRlbnNpb25zLmxlbmd0aDsgY3VyRXh0ZW5zaW9uKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbY3VyRXh0ZW5zaW9uXTsKLQotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHRyYW5zbGF0b3JzID0gZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGN1clRyYW5zbGF0b3IgPSAwOyBjdXJUcmFuc2xhdG9yIDwgdHJhbnNsYXRvcnMubGVuZ3RoOyBjdXJUcmFuc2xhdG9yKyspIHsKLQotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxUcmFuc2xhdG9yID0gdHJhbnNsYXRvcnNbY3VyVHJhbnNsYXRvcl07Ci0KLQkJCQkJaWYgKCFFTF9UUkFOU0xBVE9SX0VYVEVOU0lPTl9OQU1FLmVxdWFscyhlbFRyYW5zbGF0b3IuZ2V0TmFtZSgpKSkgeyAvLyAtCi0JCQkJCQkvLyBuYW1lCi0JCQkJCQkvLyBvZgotCQkJCQkJLy8gY29uZmlnRWxlbWVudAotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlTdHJpbmcgaWRTdHJpbmcgPSBlbFRyYW5zbGF0b3IuZ2V0QXR0cmlidXRlKCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChudWxsICE9IGlkU3RyaW5nICYmIGlkU3RyaW5nLmVxdWFscyhmRUxUcmFuc2xhdG9ySUQpIHx8IChudWxsID09IGJlc3RUcmFuc2xhdG9yICYmIERFRkFVTFRfSlNQX0VMX1RSQU5TTEFUT1JfSUQuZXF1YWxzKGlkU3RyaW5nKSkpIHsKLQkJCQkJCWJlc3RUcmFuc2xhdG9yID0gZWxUcmFuc2xhdG9yOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobnVsbCAhPSBiZXN0VHJhbnNsYXRvcikgewotCQkJCXRyeSB7Ci0JCQkJCU9iamVjdCBleGVjRXh0ID0gYmVzdFRyYW5zbGF0b3IuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoZXhlY0V4dCBpbnN0YW5jZW9mIElKU1BFTFRyYW5zbGF0b3IpIHsKLQkJCQkJCXJldHVybiBmRUxUcmFuc2xhdG9yID0gKElKU1BFTFRyYW5zbGF0b3IpIGV4ZWNFeHQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZkVMVHJhbnNsYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBQYXNzIHRoZSBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gd2hpY2ggaXMgdGhlIGVtYmVkZGVkIHJlZ2lvbgotCSAqIAotCSAqIEBwYXJhbSByZWdpb25zCi0JICogICAgICAgICAgICBpdGVyYXRvciBmb3IgY29sbGVjdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCB0cmFuc2xhdGVFbWJlZGRlZEpTUEluQmxvY2soSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbGxlY3Rpb24sIEl0ZXJhdG9yIHJlZ2lvbnMpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQlyZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJaWYgKGlzSlNQKHJlZ2lvbi5nZXRUeXBlKCkpKQotCQkJCWJyZWFrOwotCQkJcmVnaW9uID0gbnVsbDsKLQkJfQotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCXRyYW5zbGF0ZUVtYmVkZGVkSlNQSW5BdHRyaWJ1dGUoY29sbGVjdGlvbik7Ci0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI2Mzc3Ci0JCQkvLyBhbGwgb2YgY29sbGVjdGlvbiB3YXMgdHJhbnNsYXRlZCBzbyBqdXN0IGZpbmlzaCBvZmYgaXRlcmF0b3IKLQkJCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSkKLQkJCQlyZWdpb25zLm5leHQoKTsKLQkJfQotCX0KLQotCS8qCi0JICogVHJhbnNsYXRlcyBhbGwgZW1iZWRkZWQganNwIHJlZ2lvbnMgaW4gZW1iZWRkZWRDb250YWluZXIgZm9yIGV4YW1wbGU6Ci0JICogPGEgaHJlZj0iaW5kZXguanNwP3A9PCU9YWJjJT5iPTwlPXh5eiU+Ij5hYmM8L2E+Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHRyYW5zbGF0ZUVtYmVkZGVkSlNQSW5BdHRyaWJ1dGUoSVRleHRSZWdpb25Db2xsZWN0aW9uIGVtYmVkZGVkQ29udGFpbmVyKSB7Ci0JCS8vIFRISVMgTUVUSE9EIElTIEEgRklYIEZPUgotCQkvLyBqc3AgZW1iZWRkZWQgaW4gYXR0cmlidXRlIHJlZ2lvbnMKLQkJLy8gbG9vcCBhbGwgcmVnaW9ucwotCQlJVGV4dFJlZ2lvbkxpc3QgZW1iZWRkZWRSZWdpb25zID0gZW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiBkZWxpbSA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIGNvbnRlbnQgPSBudWxsOwotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW1iZWRkZWRSZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0KLQkJCS8vIHBvc3NpYmxlIGRlbGltaXRlciwgY2hlY2sgbGF0ZXIKLQkJCWRlbGltID0gZW1iZWRkZWRSZWdpb25zLmdldChpKTsKLQkJCXR5cGUgPSBkZWxpbS5nZXRUeXBlKCk7Ci0KLQkJCS8vIGNoZWNrIG5leHQgcmVnaW9uIHRvIHNlZSBpZiBpdCdzIGNvbnRlbnQKLQkJCWlmIChpICsgMSA8IGVtYmVkZGVkUmVnaW9ucy5zaXplKCkpIHsKLQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IGVtYmVkZGVkUmVnaW9ucy5nZXQoaSArIDEpLmdldFR5cGUoKTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9DT05URU5UKQotCQkJCQljb250ZW50ID0gZW1iZWRkZWRSZWdpb25zLmdldChpICsgMSk7Ci0KLQkJCX0KLQotCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotCQkJCWludCBjb250ZW50U3RhcnQgPSBlbWJlZGRlZENvbnRhaW5lci5nZXRTdGFydE9mZnNldChjb250ZW50KTsKLQkJCQlpbnQgclN0YXJ0ID0gZkN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgKyBjb250ZW50U3RhcnQ7Ci0JCQkJaW50IHJFbmQgPSBmQ3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSArIGVtYmVkZGVkQ29udGFpbmVyLmdldEVuZE9mZnNldChjb250ZW50KTsKLQotCQkJCWJvb2xlYW4gaW5UaGlzUmVnaW9uID0gclN0YXJ0IDw9IGZTb3VyY2VQb3NpdGlvbiAmJiByRW5kID49IGZTb3VyY2VQb3NpdGlvbjsKLQkJCQkvLyBpbnQganNwUG9zaXRpb25TdGFydCA9IGZDdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpICsKLQkJCQkvLyBjb250ZW50U3RhcnQ7Ci0KLQkJCQlpZiAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOKSB7Ci0JCQkJCWZMYXN0SlNQVHlwZSA9IEVYUFJFU1NJT047Ci0JCQkJCS8vIHRyYW5zbGF0ZUV4cHJlc3Npb25TdHJpbmcoZW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dChjb250ZW50KSwKLQkJCQkJLy8gZkN1cnJlbnROb2RlLCBjb250ZW50U3RhcnQsIGNvbnRlbnQuZ2V0TGVuZ3RoKCkpOwotCQkJCQl0cmFuc2xhdGVFeHByZXNzaW9uU3RyaW5nKGVtYmVkZGVkQ29udGFpbmVyLmdldFRleHQoY29udGVudCksIGVtYmVkZGVkQ29udGFpbmVyLCBjb250ZW50U3RhcnQsIGNvbnRlbnQuZ2V0TGVuZ3RoKCksIGZhbHNlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4pIHsKLQkJCQkJZkxhc3RKU1BUeXBlID0gU0NSSVBUTEVUOwotCQkJCQkvLyB0cmFuc2xhdGVTY3JpcHRsZXRTdHJpbmcoZW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dChjb250ZW50KSwKLQkJCQkJLy8gZkN1cnJlbnROb2RlLCBjb250ZW50U3RhcnQsIGNvbnRlbnQuZ2V0TGVuZ3RoKCkpOwotCQkJCQl0cmFuc2xhdGVTY3JpcHRsZXRTdHJpbmcoZW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dChjb250ZW50KSwgZW1iZWRkZWRDb250YWluZXIsIGNvbnRlbnRTdGFydCwgY29udGVudC5nZXRMZW5ndGgoKSwgZmFsc2UpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOKSB7Ci0JCQkJCWZMYXN0SlNQVHlwZSA9IERFQ0xBUkFUSU9OOwotCQkJCQkvLyB0cmFuc2xhdGVEZWNsYXJhdGlvblN0cmluZyhlbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0KGNvbnRlbnQpLAotCQkJCQkvLyBmQ3VycmVudE5vZGUsIGNvbnRlbnRTdGFydCwgY29udGVudC5nZXRMZW5ndGgoKSk7Ci0JCQkJCXRyYW5zbGF0ZURlY2xhcmF0aW9uU3RyaW5nKGVtYmVkZGVkQ29udGFpbmVyLmdldFRleHQoY29udGVudCksIGVtYmVkZGVkQ29udGFpbmVyLCBjb250ZW50U3RhcnQsIGNvbnRlbnQuZ2V0TGVuZ3RoKCksIGZhbHNlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfT1BFTikgewotCQkJCQlmTGFzdEpTUFR5cGUgPSBFWFBSRVNTSU9OOwotCQkJCQl0cmFuc2xhdGVFTChlbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0KGNvbnRlbnQpLCBlbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0KGRlbGltKSwgZkN1cnJlbnROb2RlLCBjb250ZW50U3RhcnQsIGNvbnRlbnQuZ2V0TGVuZ3RoKCkpOwotCQkJCX0KLQotCQkJCS8vIGNhbGN1bGF0ZSByZWxhdGl2ZSBvZmZzZXQgaW4gYnVmZmVyCi0JCQkJaWYgKGluVGhpc1JlZ2lvbikgewotCQkJCQlzZXRDdXJzb3JPd25lcihmTGFzdEpTUFR5cGUpOwotCQkJCQlpbnQgY3VycmVudEJ1ZmZlckxlbmd0aCA9IGdldEN1cnNvck93bmVyKCkubGVuZ3RoKCk7Ci0JCQkJCXNldFJlbGF0aXZlT2Zmc2V0KChmU291cmNlUG9zaXRpb24gLSBjb250ZW50U3RhcnQpICsgY3VycmVudEJ1ZmZlckxlbmd0aCk7Ci0JCQkJCWlmIChmTGFzdEpTUFR5cGUgPT0gRVhQUkVTU0lPTikgewotCQkJCQkJLy8gaWYgYW4gZXhwcmVzc2lvbiwgYWRkIHRoZW4gbGVuZ3RoIG9mIHRoZSBlbmNsb3NpbmcKLQkJCQkJCS8vIHBhcmVuLi4KLQkJCQkJCXNldEN1cnNvckluRXhwcmVzc2lvbih0cnVlKTsKLQkJCQkJCXNldFJlbGF0aXZlT2Zmc2V0KGdldFJlbGF0aXZlT2Zmc2V0KCkgKyBFWFBSRVNTSU9OX1BSRUZJWC5sZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0eXBlID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGZMYXN0SlNQVHlwZSA9IFNDUklQVExFVDsKLQotCS8qKgotCSAqIEpTUFR5cGUgaXMgb25seSB1c2VkIGludGVybmFsbHkgaW4gdGhpcyBjbGFzcyB0byBkZXNjcmliZSB0eWUgdHlwZSBvZgotCSAqIHJlZ2lvbiB0byBiZSB0cmFuc2xhdGVkCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0SlNQVHlwZUZvclJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpbnQgdHlwZSA9IFNDUklQVExFVDsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOKQotCQkJdHlwZSA9IFNDUklQVExFVDsKLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOKQotCQkJdHlwZSA9IEVYUFJFU1NJT047Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4pCi0JCQl0eXBlID0gREVDTEFSQVRJT047Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpCi0JCQl0eXBlID0gZkxhc3RKU1BUeXBlOwotCQkvLyByZW1lbWJlciB0aGUgbGFzdCB0eXBlLCBpbiBjYXNlIHRoZSBuZXh0IHR5cGUgdGhhdCBjb21lcyBpbiBpcwotCQkvLyBKU1BfQ09OVEVOVAotCQlmTGFzdEpTUFR5cGUgPSB0eXBlOwotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiAvKiA8JUAgJT4gLyogbmVlZCB0byBwYXNzIGluIHRoZSBkaXJlY3RpdmUgdGFnIHJlZ2lvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZURpcmVjdGl2ZShJdGVyYXRvciByZWdpb25zKSB7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlTdHJpbmcgcmVnaW9uVGV4dCwgYXR0clZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpICYmIChyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKSkgIT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHsgLy8gY291bGQKLQkJCS8vIGJlCi0JCQkvLyBYTUxfQ09OVEVOVAotCQkJLy8gPQotCQkJLy8gIiIsCi0JCQkvLyBza2lwcwotCQkJLy8gYXR0cnM/Ci0JCQlyZWdpb25UZXh0ID0gZ2V0Q3VycmVudE5vZGUoKS5nZXRUZXh0KHIpOwotCQkJaWYgKHJlZ2lvblRleHQuZXF1YWxzKCJ0YWdsaWIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJLy8gYWRkIGN1c3RvbSB0YWcgYmxvY2sgbWFya2VycyBoZXJlCi0JCQkJaGFuZGxlVGFnbGliKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVGV4dC5lcXVhbHMoImluY2x1ZGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGZpbGVMb2NhdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJLy8gQ01WQyAyNTgzMTEKLQkJCQkvLyBQTVIgMTgzNjgsIEI2NjMKLQkJCQkvLyBza2lwIHRvIHJlcXVpcmVkICJmaWxlIiBhdHRyaWJ1dGUsIHNob3VsZCBiZSBzYWZlIGJlY2F1c2UKLQkJCQkvLyAiZmlsZSIgaXMgdGhlIG9ubHkgYXR0cmlidXRlIGZvciB0aGUgaW5jbHVkZSBkaXJlY3RpdmUKLQkJCQl3aGlsZSAociAhPSBudWxsICYmIHJlZ2lvbnMuaGFzTmV4dCgpICYmICFyLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSkgewotCQkJCQlyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCQl9Ci0JCQkJZmlsZUxvY2F0aW9uID0gZ2V0QXR0cmlidXRlVmFsdWUociwgcmVnaW9ucyk7Ci0JCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsKQotCQkJCQloYW5kbGVJbmNsdWRlRmlsZShmaWxlTG9jYXRpb24pOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVGV4dC5lcXVhbHMoInBhZ2UiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdHJhbnNsYXRlUGFnZURpcmVjdGl2ZUF0dHJpYnV0ZXMocmVnaW9ucywgZ2V0Q3VycmVudE5vZGUoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UZXh0LmVxdWFscygidGFnIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIHNvbWUgYXR0cmlidXRlcyBvdmVybGFwLCBzbyBib3RoIGFyZSBoYW5kbGVkIGluIHRoaXMgbWV0aG9kCi0JCQkJdHJhbnNsYXRlUGFnZURpcmVjdGl2ZUF0dHJpYnV0ZXMocmVnaW9ucywgZ2V0Q3VycmVudE5vZGUoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UZXh0LmVxdWFscygidmFyaWFibGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdHJhbnNsYXRlVmFyaWFibGVEaXJlY3RpdmVBdHRyaWJ1dGVzKHJlZ2lvbnMpOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVGV4dC5lcXVhbHMoImF0dHJpYnV0ZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cmFuc2xhdGVBdHRyaWJ1dGVEaXJlY3RpdmVBdHRyaWJ1dGVzKHJlZ2lvbnMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRyYW5zbGF0ZUF0dHJpYnV0ZURpcmVjdGl2ZUF0dHJpYnV0ZXMoSXRlcmF0b3IgcmVnaW9ucykgewotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJU3RyaW5nIGF0dHJOYW1lLCBhdHRyVmFsdWU7Ci0KLQkJU3RyaW5nIHZhclR5cGUgPSAiamF2YS5sYW5nLlN0cmluZyI7IC8vJE5PTi1OTFMtMSQgLy8gdGhlIGRlZmF1bHQgY2xhc3MuLi4KLQkJU3RyaW5nIHZhck5hbWUgPSBudWxsOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiIjsvLyROT04tTkxTLTEkIAotCQlib29sZWFuIGlzRnJhZ21lbnQgPSBmYWxzZTsKLQotCQkvLyBpdGVyYXRlIGFsbCBhdHRyaWJ1dGVzCi0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCkpICE9IG51bGwgJiYgci5nZXRUeXBlKCkgIT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSB7Ci0JCQlhdHRyTmFtZSA9IGF0dHJWYWx1ZSA9IG51bGw7Ci0JCQlpZiAoci5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpIHsKLQkJCQlhdHRyTmFtZSA9IGdldEN1cnJlbnROb2RlKCkuZ2V0VGV4dChyKS50cmltKCk7Ci0JCQkJaWYgKGF0dHJOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCQlpZiAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJCQlpZiAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCQlhdHRyVmFsdWUgPSBTdHJpbmdVdGlscy5zdHJpcChnZXRDdXJyZW50Tm9kZSgpLmdldFRleHQocikpOwotCQkJCQkJfQotCQkJCQkJLy8gaGFzIGVxdWFscywgYnV0IG5vIHZhbHVlPwotCQkJCQl9Ci0JCQkJCWlmIChhdHRyTmFtZS5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUpKSB7Ci0JCQkJCQl2YXJUeXBlID0gYXR0clZhbHVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscyhKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRlJBR01FTlQpKSB7Ci0JCQkJCQlpc0ZyYWdtZW50ID0gQm9vbGVhbi52YWx1ZU9mKGF0dHJWYWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FKSkgewotCQkJCQkJdmFyTmFtZSA9IGF0dHJWYWx1ZTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RFU0NSSVBUSU9OKSkgewotCQkJCQkJZGVzY3JpcHRpb24gPSBhdHRyVmFsdWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHZhck5hbWUgIT0gbnVsbCkgewotCQkJaWYgKGlzRnJhZ21lbnQpIHsKLQkJCQkvLyAyLjA6SlNQLjguNS4yCi0JCQkJdmFyVHlwZSA9ICJqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuSnNwRnJhZ21lbnQiOwotCQkJfQotCQkJU3RyaW5nIGRlY2xhcmF0aW9uID0gbmV3IFRhZ2xpYlZhcmlhYmxlKHZhclR5cGUsIHZhck5hbWUsICIiLCBkZXNjcmlwdGlvbikuZ2V0RGVjbGFyYXRpb25TdHJpbmcodHJ1ZSwgVGFnbGliVmFyaWFibGUuTV9QUklWQVRFKTsKLQkJCWFwcGVuZFRvQnVmZmVyKGRlY2xhcmF0aW9uLCBmVXNlckRlY2xhcmF0aW9ucywgZmFsc2UsIGZDdXJyZW50Tm9kZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdHJhbnNsYXRlVmFyaWFibGVEaXJlY3RpdmVBdHRyaWJ1dGVzKEl0ZXJhdG9yIHJlZ2lvbnMpIHsKLQkJLyoKLQkJICogU2hvdWxkbid0IGNyZWF0ZSBhIHNjcmlwdGluZyB2YXJpYWJsZSBpbiAqdGhpcyogdGFnIGZpbGUncwotCQkgKiB0cmFuc2xhdGlvbiwgb25seSBpbiBKU1AgZmlsZXMgdGhhdCB1c2UgaXQgLQotCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg4NzgwCi0JCSAqLwotCX0KLQotCS8qCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGlkZWFsbHkgb25seSBiZSBjYWxsZWQgb25jZSBwZXIgcnVuIHRocm91Z2gKLQkgKiBKU1BUcmFuc2xhdG9yIFRoaXMgaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBpbm5lciBoZWxwZXIgY2xhc3NlcyB0aGF0Ci0JICogbmVlZCB0byBhZGQgYmxvY2sgbWFya2VycyB0byB0aGVpciBvd24gcGFyc2Vycy4gVGhpcyBtZXRob2Qgb25seSBhZGRzCi0JICogbWFya2VycyB0aGF0IGNhbWUgZnJvbSA8QHRhZ2xpYj4gZGlyZWN0aXZlcywgKG5vdCA8QGluY2x1ZGU+KSwgc2luY2UKLQkgKiBpbmNsdWRlIGZpbGUgdGFnbGlicyBhcmUgaGFuZGxlZCBvbiB0aGUgZmx5IHdoZW4gdGhleSBhcmUgZW5jb3VudGVyZWQuICoKLQkgKiBAcGFyYW0gcmVnaW9ucwotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gZG9lcyBub3QgcHJvcGVybHkgaGFuZGxlIHByZWZpeGVzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlVGFnbGliKCkgewotCQkvLyBnZXQvY3JlYXRlIFRMRENNRG9jdW1lbnQKLQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgbWdyID0gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcihmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJaWYgKG1nciAhPSBudWxsKSB7Ci0JCQlMaXN0IHRyYWNrZXJzID0gbWdyLmdldENNRG9jdW1lbnRUcmFja2VycyhnZXRDdXJyZW50Tm9kZSgpLmdldEVuZCgpKTsKLQkJCUl0ZXJhdG9yIGl0ID0gdHJhY2tlcnMuaXRlcmF0b3IoKTsKLQkJCUNNRG9jdW1lbnRUcmFja2VyIHRyYWNrZXIgPSBudWxsOwotCQkJSXRlcmF0b3IgdGFnbGliUmVnaW9ucyA9IG51bGw7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gbnVsbDsKLQkJCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCXRyYWNrZXIgPSAoQ01Eb2N1bWVudFRyYWNrZXIpIGl0Lm5leHQoKTsKLQkJCQlzZFJlZ2lvbiA9IHRyYWNrZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJLy8gc2luY2UgbWF5IGJlIGNhbGwgZnJvbSBhbm90aGVyIHRocmVhZCAobGlrZSBhIGJhY2tncm91bmQKLQkJCQkvLyBqb2IpCi0JCQkJLy8gdGhpcyBjaGVjayBpcyB0byBiZSBzYWZlcgotCQkJCWlmIChzZFJlZ2lvbiAhPSBudWxsICYmICFzZFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJCQl0YWdsaWJSZWdpb25zID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlICghc2RSZWdpb24uaXNEZWxldGVkKCkgJiYgdGFnbGliUmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCQkJCXIgPSAoSVRleHRSZWdpb24pIHRhZ2xpYlJlZ2lvbnMubmV4dCgpOwotCQkJCQkJaWYgKHIuZ2V0VHlwZSgpLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpKSB7Ci0JCQkJCQkJU3RyaW5nIHRleHQgPSBzZFJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJCQkJCWlmIChKU1AxMlRMRE5hbWVzLlRBR0xJQi5lcXVhbHModGV4dCkgfHwgSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQi5lcXVhbHModGV4dCkpIHsKLQkJCQkJCQkJYWRkQmxvY2tNYXJrZXJzKHRyYWNrZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgaWRlYWxseSBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBydW4gdGhyb3VnaAotCSAqIEpTUFRyYW5zbGF0b3IgVGhpcyBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IGlubmVyIGhlbHBlciBjbGFzc2VzIHRoYXQKLQkgKiBuZWVkIHRvIGFkZCBibG9jayBtYXJrZXJzIHRvIHRoZWlyIG93biBwYXJzZXJzLiBUaGlzIG1ldGhvZCBvbmx5IGFkZHMKLQkgKiBtYXJrZXJzIHRoYXQgY2FtZSBmcm9tIDxAdGFnbGliPiBkaXJlY3RpdmVzLCAobm90IDxAaW5jbHVkZT4pLCBzaW5jZQotCSAqIGluY2x1ZGUgZmlsZSB0YWdsaWJzIGFyZSBoYW5kbGVkIG9uIHRoZSBmbHkgd2hlbiB0aGV5IGFyZSBlbmNvdW50ZXJlZC4gKgotCSAqIEBwYXJhbSByZWdpb25zCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVRhZ2xpYihTdHJpbmcgcHJlZml4KSB7Ci0JCS8vIGdldC9jcmVhdGUgVExEQ01Eb2N1bWVudAotCQlUTERDTURvY3VtZW50TWFuYWdlciBtZ3IgPSBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKGZTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQlpZiAobWdyICE9IG51bGwpIHsKLQkJCS8vIGdldCB0cmFja2VycyBmb3IgdGhlIENNRG9jdW1lbnRzIGVuYWJsZWQgYXQgdGhpcyBvZmZzZXQKLQkJCUxpc3QgdHJhY2tlcnMgPSBtZ3IuZ2V0Q01Eb2N1bWVudFRyYWNrZXJzKGdldEN1cnJlbnROb2RlKCkuZ2V0RW5kKCkpOwotCQkJSXRlcmF0b3IgaXQgPSB0cmFja2Vycy5pdGVyYXRvcigpOwotCQkJQ01Eb2N1bWVudFRyYWNrZXIgdHJhY2tlciA9IG51bGw7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJdHJhY2tlciA9IChDTURvY3VtZW50VHJhY2tlcikgaXQubmV4dCgpOwotCQkJCWFkZEJsb2NrTWFya2VycyhwcmVmaXggKyAiOiIsIHRyYWNrZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIGFkZHMgYmxvY2sgbWFya2VycyB0byBKU1BUcmFuc2xhdG9yJ3MgYmxvY2sgbWFya2VyIGxpc3QgZm9yIGFsbAotCSAqIGVsZW1lbnRzIGluIGRvYyBAcGFyYW0gZG9jCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQmxvY2tNYXJrZXJzKENNRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChkb2MuZ2V0RWxlbWVudHMoKS5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCUl0ZXJhdG9yIGVsZW1lbnRzID0gZG9jLmdldEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkJCUNNTm9kZSBub2RlID0gbnVsbDsKLQkJCXdoaWxlIChlbGVtZW50cy5oYXNOZXh0KCkpIHsKLQkJCQlub2RlID0gKENNTm9kZSkgZWxlbWVudHMubmV4dCgpOwotCQkJCWdldEJsb2NrTWFya2VycygpLmFkZChuZXcgQmxvY2tNYXJrZXIobm9kZS5nZXROb2RlTmFtZSgpLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgdHJ1ZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBhZGRzIGJsb2NrIG1hcmtlcnMgdG8gSlNQVHJhbnNsYXRvcidzIGJsb2NrIG1hcmtlciBsaXN0IGZvciBhbGwKLQkgKiBlbGVtZW50cyBpbiBkb2MgQHBhcmFtIGRvYwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJsb2NrTWFya2VycyhTdHJpbmcgcHJlZml4LCBDTURvY3VtZW50IGRvYykgewotCQlpZiAoZG9jLmdldEVsZW1lbnRzKCkuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlJdGVyYXRvciBlbGVtZW50cyA9IGRvYy5nZXRFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JCQlDTU5vZGUgbm9kZSA9IG51bGw7Ci0JCQl3aGlsZSAoZWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0JCQkJbm9kZSA9IChDTU5vZGUpIGVsZW1lbnRzLm5leHQoKTsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIFRMREVsZW1lbnREZWNsYXJhdGlvbiAmJiAoKFRMREVsZW1lbnREZWNsYXJhdGlvbikgbm9kZSkuZ2V0Qm9keWNvbnRlbnQoKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5DT05URU5UX1RBR0RFUEVOREVOVCkpCi0JCQkJCWdldEJsb2NrTWFya2VycygpLmFkZChuZXcgQmxvY2tNYXJrZXIocHJlZml4ICsgbm9kZS5nZXROb2RlTmFtZSgpLCBudWxsLCBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQsIHRydWUpKTsKLQkJCQllbHNlCi0JCQkJCWdldEJsb2NrTWFya2VycygpLmFkZChuZXcgQmxvY2tNYXJrZXIocHJlZml4ICsgbm9kZS5nZXROb2RlTmFtZSgpLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgdHJ1ZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgciBpcyBhbiBhdHRyaWJ1dGUgbmFtZSByZWdpb24sIHRoaXMgbWV0aG9kIHdpbGwgc2FmZWx5IHJldHVybiB0aGUKLQkgKiB2YWx1ZSBmb3IgdGhhdCBhdHRyaWJ1dGUuCi0JICogCi0JICogQHBhcmFtIHIKLQkgKiBAcGFyYW0gcmVtYWluaW5nUmVnaW9ucwotCSAqIEByZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIG5hbWUgKHIpLCBvciBudWxsIGlmIGlzbid0IG9uZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoSVRleHRSZWdpb24gciwgSXRlcmF0b3IgcmVtYWluaW5nUmVnaW9ucykgewotCQlpZiAoci5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpIHsKLQkJCWlmIChyZW1haW5pbmdSZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVtYWluaW5nUmVnaW9ucy5uZXh0KCkpICE9IG51bGwgJiYgci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQlpZiAocmVtYWluaW5nUmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlbWFpbmluZ1JlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJcmV0dXJuIFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzKGdldEN1cnJlbnROb2RlKCkuZ2V0VGV4dChyKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHRha2VzIGFuIGl0ZXJhdG9yIG9mIHRoZSBhdHRyaWJ1dGVzIG9mIGEgcGFnZSBkaXJlY3RpdmUgYW5kIHRoZQotCSAqIGRpcmVjdGl2ZSBpdHNlbGYuIFRoZSBpdGVyYXRvciBpcyB1c2VkIGluIGNhc2UgaXQgY2FuIGJlIG9wdGltaXplZCwgYnV0Ci0JICogdGhlIGRvY3VtZW50UmVnaW9uIGlzIHN0aWxsIHJlcXVpcmVkIHRvIGVuc3VyZSB0aGF0IHRoZSB2YWx1ZXMgYXJlCi0JICogZXh0cmFjdGVkIGZyb20gdGhlIGNvcnJlY3QgdGV4dC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVQYWdlRGlyZWN0aXZlQXR0cmlidXRlcyhJdGVyYXRvciByZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlTdHJpbmcgYXR0ck5hbWUsIGF0dHJWYWx1ZTsKLQkJLy8gaXRlcmF0ZSBhbGwgYXR0cmlidXRlcwotCQl3aGlsZSAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIHIuZ2V0VHlwZSgpICE9IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSkgewotCQkJYXR0ck5hbWUgPSBhdHRyVmFsdWUgPSBudWxsOwotCQkJaWYgKHIuZ2V0VHlwZSgpLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpKSB7Ci0KLQkJCQlhdHRyTmFtZSA9IGRvY3VtZW50UmVnaW9uLmdldFRleHQocikudHJpbSgpOwotCQkJCWlmIChhdHRyTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJaWYgKHJlZ2lvbnMuaGFzTmV4dCgpICYmIChyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKSkgIT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCQkJaWYgKHJlZ2lvbnMuaGFzTmV4dCgpICYmIChyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKSkgIT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0KLQkJCQkJCQlhdHRyVmFsdWUgPSBTdHJpbmdVdGlscy5zdHJpcChkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHIpKTsKLQkJCQkJCX0KLQkJCQkJCS8vIGhhcyBlcXVhbHMsIGJ1dCBubyB2YWx1ZT8KLQkJCQkJfQotCQkJCQlzZXREaXJlY3RpdmVBdHRyaWJ1dGUoYXR0ck5hbWUsIGF0dHJWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogc2V0cyB0aGUgYXBwcm9wcmlhdGUgcGFnZS90YWcgZGlyZWN0aXZlIGF0dHJpYnV0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERpcmVjdGl2ZUF0dHJpYnV0ZShTdHJpbmcgYXR0ck5hbWUsIFN0cmluZyBhdHRyVmFsdWUpIHsKLQkJaWYgKGF0dHJWYWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyB1c2VzIGRlZmF1bHQgKGlmIHRoZXJlIHdhcyBvbmUpCi0JCWlmIChhdHRyTmFtZS5lcXVhbHMoImV4dGVuZHMiKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlmU3VwZXJjbGFzcyA9IGF0dHJWYWx1ZTsKLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoImltcG9ydCIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCWFkZEltcG9ydHMoYXR0clZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoInNlc3Npb24iKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlmSXNJbkFTZXNzaW9uID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoYXR0clZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoImJ1ZmZlciIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCS8vIGlnbm9yZSBmb3Igbm93Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKCJhdXRvRmx1c2giKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQkvLyBpZ25vcmUgZm9yIG5vdwotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscygiaXNUaHJlYWRTYWZlIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJLy8gZlRocmVhZFNhZmUgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShhdHRyVmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKCJpc0Vycm9yUGFnZSIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCWZJc0Vycm9yUGFnZSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKGF0dHJWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVJbmNsdWRlRmlsZShTdHJpbmcgZmlsZW5hbWUpIHsKLQkJaWYgKGZpbGVuYW1lICE9IG51bGwgJiYgZlByb2Nlc3NJbmNsdWRlcykgewotCQkJSVBhdGggbW9kZWxQYXRoID0gZ2V0TW9kZWxQYXRoKCk7Ci0JCQlJUGF0aCBiYXNlUGF0aCA9IG1vZGVsUGF0aDsKLQkJCWlmIChiYXNlUGF0aCAhPSBudWxsKSB7Ci0JCQkJLyoKLQkJCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI3NTc2Ci0JCQkJICogCi0JCQkJICogVGhlIHJlc29sdXRpb24gb2YgdGhlIGluY2x1ZGVkIGZyYWdtZW50IHNob3VsZCB1c2UgdGhlIGZpbGUKLQkJCQkgKiBjb250YWluaW5nIHRoZSBkaXJlY3RpdmUgYXMgdGhlIGJhc2UgcmVmZXJlbmNlLCBub3QgYWx3YXlzCi0JCQkJICogdGhlIG1haW4gSlNQIGJlaW5nIGludm9rZWQuIFZlcmlmaWVkIGJlaGF2aW9yIHdpdGggQXBhY2hlCi0JCQkJICogVG9tY2F0IDUuNS4yMC4KLQkJCQkgKi8KLQkJCQlpZiAoIWdldEluY2x1ZGVzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCWJhc2VQYXRoID0gbmV3IFBhdGgoKFN0cmluZykgZ2V0SW5jbHVkZXMoKS5wZWVrKCkpOwotCQkJCX0KLQkJCQlTdHJpbmcgZmlsZVBhdGhTdHJpbmcgPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LnJlc29sdmUoYmFzZVBhdGgsIGZpbGVuYW1lKS50b1N0cmluZygpOwotCQkJCWZJbmNsdWRlZFBhdGhzLmFkZChmaWxlUGF0aFN0cmluZyk7Ci0KLQkJCQlpZiAoIWdldEluY2x1ZGVzKCkuY29udGFpbnMoZmlsZVBhdGhTdHJpbmcpICYmICFmaWxlUGF0aFN0cmluZy5lcXVhbHMobW9kZWxQYXRoLnRvU3RyaW5nKCkpKSB7Ci0JCQkJCWdldEluY2x1ZGVzKCkucHVzaChmaWxlUGF0aFN0cmluZyk7Ci0JCQkJCUpTUEluY2x1ZGVSZWdpb25IZWxwZXIgaGVscGVyID0gbmV3IEpTUEluY2x1ZGVSZWdpb25IZWxwZXIodGhpcywgdHJ1ZSk7Ci0JCQkJCS8vIFNob3VsZCB3ZSBjb25zaWRlciBwcmVsdWRlcyBvbiB0aGlzIHNlZ21lbnQ/Ci0JCQkJCWhlbHBlci5wYXJzZShmaWxlUGF0aFN0cmluZyk7Ci0JCQkJCWdldEluY2x1ZGVzKCkucG9wKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdGFjayBnZXRJbmNsdWRlcygpIHsKLQkJaWYgKGZJbmNsdWRlcyA9PSBudWxsKQotCQkJZkluY2x1ZGVzID0gbmV3IFN0YWNrKCk7Ci0JCXJldHVybiBmSW5jbHVkZXM7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0SW5jbHVkZWRQYXRocygpIHsKLQkJcmV0dXJuIGZJbmNsdWRlZFBhdGhzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZUV4cHJlc3Npb25TdHJpbmcoU3RyaW5nIG5ld1RleHQsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBlbWJlZGRlZENvbnRhaW5lciwgaW50IGpzcFBvc2l0aW9uU3RhcnQsIGludCBqc3BQb3NpdGlvbkxlbmd0aCwgYm9vbGVhbiBpc0luZGlyZWN0KSB7Ci0JCWFwcGVuZFRvQnVmZmVyKEVYUFJFU1NJT05fUFJFRklYLCBmVXNlckNvZGUsIGZhbHNlLCBlbWJlZGRlZENvbnRhaW5lcik7Ci0JCWFwcGVuZFRvQnVmZmVyKG5ld1RleHQsIGZVc2VyQ29kZSwgdHJ1ZSwgZW1iZWRkZWRDb250YWluZXIsIGpzcFBvc2l0aW9uU3RhcnQsIGpzcFBvc2l0aW9uTGVuZ3RoLCBpc0luZGlyZWN0KTsKLQkJYXBwZW5kVG9CdWZmZXIoRVhQUkVTU0lPTl9TVUZGSVgsIGZVc2VyQ29kZSwgZmFsc2UsIGVtYmVkZGVkQ29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVEZWNsYXJhdGlvblN0cmluZyhTdHJpbmcgbmV3VGV4dCwgSVRleHRSZWdpb25Db2xsZWN0aW9uIGVtYmVkZGVkQ29udGFpbmVyLCBpbnQganNwUG9zaXRpb25TdGFydCwgaW50IGpzcFBvc2l0aW9uTGVuZ3RoLCBib29sZWFuIGlzSW5kaXJlY3QpIHsKLQkJYXBwZW5kVG9CdWZmZXIobmV3VGV4dCwgZlVzZXJEZWNsYXJhdGlvbnMsIHRydWUsIGVtYmVkZGVkQ29udGFpbmVyLCBqc3BQb3NpdGlvblN0YXJ0LCBqc3BQb3NpdGlvbkxlbmd0aCwgaXNJbmRpcmVjdCk7Ci0JCWFwcGVuZFRvQnVmZmVyKEVOREwsIGZVc2VyRGVjbGFyYXRpb25zLCBmYWxzZSwgZW1iZWRkZWRDb250YWluZXIpOwotCX0KLQotCS8qKgotCSAqIHVzZWQgYnkgWE1MSlNQUmVnaW9uSGVscGVyIGZvciBpbmNsdWRlZCBKU1AgZmlsZXMKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqIEBwYXJhbSBlbWJlZGRlZENvbnRhaW5lcgotCSAqIEBwYXJhbSBqc3BQb3NpdGlvblN0YXJ0Ci0JICogQHBhcmFtIGpzcFBvc2l0aW9uTGVuZ3RoCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdHJhbnNsYXRlU2NyaXB0bGV0U3RyaW5nKFN0cmluZyBuZXdUZXh0LCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gZW1iZWRkZWRDb250YWluZXIsIGludCBqc3BQb3NpdGlvblN0YXJ0LCBpbnQganNwUG9zaXRpb25MZW5ndGgsIGJvb2xlYW4gaXNJbmRpcmVjdCkgewotCQlhcHBlbmRUb0J1ZmZlcihuZXdUZXh0LCBmVXNlckNvZGUsIHRydWUsIGVtYmVkZGVkQ29udGFpbmVyLCBqc3BQb3NpdGlvblN0YXJ0LCBqc3BQb3NpdGlvbkxlbmd0aCwgaXNJbmRpcmVjdCk7Ci0JfQotCi0JLy8gdGhlIGZvbGxvd2luZyAzIG1ldGhvZHMgZGV0ZXJtaW5lIHRoZSBjdXJzb3IgcG9zaXRpb24KLQkvLyA8JT0gJT4KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVFeHByZXNzaW9uKElUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb24pIHsKLQkJU3RyaW5nIG5ld1RleHQgPSBnZXRVbmVzY2FwZWRSZWdpb25UZXh0KHJlZ2lvbiwgRVhQUkVTU0lPTik7Ci0JCWFwcGVuZFRvQnVmZmVyKEVYUFJFU1NJT05fUFJFRklYLCBmVXNlckNvZGUsIGZhbHNlLCByZWdpb24pOwotCQlhcHBlbmRUb0J1ZmZlcihuZXdUZXh0LCBmVXNlckNvZGUsIHRydWUsIGZDdXJyZW50Tm9kZSk7Ci0JCWFwcGVuZFRvQnVmZmVyKEVYUFJFU1NJT05fU1VGRklYLCBmVXNlckNvZGUsIGZhbHNlLCByZWdpb24pOwotCX0KLQotCS8vCi0JLy8gPCUhICU+Ci0JcHJvdGVjdGVkIHZvaWQgdHJhbnNsYXRlRGVjbGFyYXRpb24oSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbikgewotCQlTdHJpbmcgbmV3VGV4dCA9IGdldFVuZXNjYXBlZFJlZ2lvblRleHQocmVnaW9uLCBERUNMQVJBVElPTik7Ci0JCWFwcGVuZFRvQnVmZmVyKG5ld1RleHQsIGZVc2VyRGVjbGFyYXRpb25zLCB0cnVlLCByZWdpb24pOwotCQlhcHBlbmRUb0J1ZmZlcihFTkRMLCBmVXNlckRlY2xhcmF0aW9ucywgZmFsc2UsIHJlZ2lvbik7Ci0JfQotCi0JLy8KLQkvLyA8JSAlPgotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZVNjcmlwdGxldChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyBuZXdUZXh0ID0gZ2V0VW5lc2NhcGVkUmVnaW9uVGV4dChyZWdpb24sIFNDUklQVExFVCk7Ci0JCWFwcGVuZFRvQnVmZmVyKG5ld1RleHQsIGZVc2VyQ29kZSwgdHJ1ZSwgcmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdXNpbmcgYSByZWdpb24sIHByb2JhYmx5IGluZGlyZWN0IG1hcHBpbmcgKGVnLiA8JUBwYWdlCi0JICogaW5jbHVkZT0iIiU+KQotCSAqIAotCSAqIEBwYXJhbSBuZXdUZXh0Ci0JICogQHBhcmFtIGJ1ZmZlcgotCSAqIEBwYXJhbSBhZGRUb01hcAotCSAqIEBwYXJhbSBqc3BSZWZlcmVuY2VSZWdpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kVG9CdWZmZXIoU3RyaW5nIG5ld1RleHQsIFN0cmluZ0J1ZmZlciBidWZmZXIsIGJvb2xlYW4gYWRkVG9NYXAsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBqc3BSZWZlcmVuY2VSZWdpb24pIHsKLQkJaW50IHN0YXJ0ID0gMCwgbGVuZ3RoID0gMDsKLQkJaWYgKGpzcFJlZmVyZW5jZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlzdGFydCA9IGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJbGVuZ3RoID0ganNwUmVmZXJlbmNlUmVnaW9uLmdldExlbmd0aCgpOwotCQl9Ci0JCWFwcGVuZFRvQnVmZmVyKG5ld1RleHQsIGJ1ZmZlciwgYWRkVG9NYXAsIGpzcFJlZmVyZW5jZVJlZ2lvbiwgc3RhcnQsIGxlbmd0aCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgbmV3VGV4dCB0byB0aGUgYnVmZmVyIHBhc3NlZCBpbiwgYW5kIGFkZHMgdG8gdHJhbnNsYXRpb24gbWFwcGluZwotCSAqIGFzIHNwZWNpZmllZCBieSB0aGUgYWRkVG9NYXAgZmxhZy4gc29tZSBzcGVjaWFsIGNhc2VzIHRvIGNvbnNpZGVyICh0aGF0Ci0JICogbWF5IGJlIGFmZmVjdGVkIGJ5IGNoYW5nZXMgdG8gdGhpcyBtZXRob2QpOiBpbmNsdWRlZCBmaWxlcyBzY3JpcGxldHMgaW4KLQkgKiBhbiBhdHRyaWJ1dGUgdmFsdWUgcmVmYWN0b3JpbmcKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqIEBwYXJhbSBidWZmZXIKLQkgKiBAcGFyYW0gYWRkVG9NYXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kVG9CdWZmZXIoU3RyaW5nIG5ld1RleHQsIFN0cmluZ0J1ZmZlciBidWZmZXIsIGJvb2xlYW4gYWRkVG9NYXAsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBqc3BSZWZlcmVuY2VSZWdpb24sIGludCBqc3BQb3NpdGlvblN0YXJ0LCBpbnQganNwUG9zaXRpb25MZW5ndGgsIGJvb2xlYW4gaXNJbmRpcmVjdCkgewotCi0JCWludCBvcmlnTmV3VGV4dExlbmd0aCA9IG5ld1RleHQubGVuZ3RoKCk7Ci0KLQkJLy8gbm90aGluZyB0byBhcHBlbmQKLQkJaWYgKGpzcFJlZmVyZW5jZVJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGFkZCBhIG5ld2xpbmUgc28gdHJhbnNsYXRpb24gbG9va3MgY2xlYW5lcgotCQlpZiAoIW5ld1RleHQuZW5kc1dpdGgoRU5ETCkpCi0JCQluZXdUZXh0ICs9IEVOREw7Ci0KLQkJaWYgKGJ1ZmZlciA9PSBmVXNlckNvZGUpIHsKLQkJCWJ1ZmZlci5hcHBlbmQobmV3VGV4dCk7Ci0JCQlpZiAoYWRkVG9NYXApIHsKLQkJCQlpZiAoaXNVc2ViZWFuVGFnKGpzcFJlZmVyZW5jZVJlZ2lvbikpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIHJlcXVpcmVzIHNwZWNpYWwgbWFwcGluZwotCQkJCQkJYXBwZW5kVXNlQmVhblRvQnVmZmVyKG5ld1RleHQsIGpzcFJlZmVyZW5jZVJlZ2lvbiwgaXNJbmRpcmVjdCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBzdGlsbCB3b3JraW5nIG91dCBraW5rcwotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gYWxsIG90aGVyIGNhc2VzCi0JCQkJCVBvc2l0aW9uIGphdmFSYW5nZSA9IG5ldyBQb3NpdGlvbihmT2Zmc2V0SW5Vc2VyQ29kZSwgb3JpZ05ld1RleHRMZW5ndGgpOwotCQkJCQlQb3NpdGlvbiBqc3BSYW5nZSA9IG5ldyBQb3NpdGlvbihqc3BQb3NpdGlvblN0YXJ0LCBqc3BQb3NpdGlvbkxlbmd0aCk7Ci0KLQkJCQkJZkNvZGVSYW5nZXMucHV0KGphdmFSYW5nZSwganNwUmFuZ2UpOwotCQkJCQlpZiAoaXNJbmRpcmVjdCkKLQkJCQkJCWZJbmRpcmVjdFJhbmdlcy5wdXQoamF2YVJhbmdlLCBqc3BSYW5nZSk7Ci0JCQkJfQotCQkJfQotCQkJZk9mZnNldEluVXNlckNvZGUgKz0gbmV3VGV4dC5sZW5ndGgoKTsKLQkJfQotCQllbHNlIGlmIChidWZmZXIgPT0gZlVzZXJEZWNsYXJhdGlvbnMpIHsKLQkJCWJ1ZmZlci5hcHBlbmQobmV3VGV4dCk7Ci0JCQlpZiAoYWRkVG9NYXApIHsKLQkJCQlQb3NpdGlvbiBqYXZhUmFuZ2UgPSBuZXcgUG9zaXRpb24oZk9mZnNldEluVXNlckRlY2xhcmF0aW9ucywgbmV3VGV4dC5sZW5ndGgoKSk7Ci0JCQkJUG9zaXRpb24ganNwUmFuZ2UgPSBuZXcgUG9zaXRpb24oanNwUG9zaXRpb25TdGFydCwganNwUG9zaXRpb25MZW5ndGgpOwotCi0JCQkJZkRlY2xhcmF0aW9uUmFuZ2VzLnB1dChqYXZhUmFuZ2UsIGpzcFJhbmdlKTsKLQkJCQlpZiAoaXNJbmRpcmVjdCkKLQkJCQkJZkluZGlyZWN0UmFuZ2VzLnB1dChqYXZhUmFuZ2UsIGpzcFJhbmdlKTsKLQkJCX0KLQkJCWZPZmZzZXRJblVzZXJEZWNsYXJhdGlvbnMgKz0gbmV3VGV4dC5sZW5ndGgoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBqc3BSZWZlcmVuY2VSZWdpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVXNlYmVhblRhZyhJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0ganNwUmVmZXJlbmNlUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCWJvb2xlYW4gaXNVc2VCZWFuID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJciA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyODQ5MAotCQkJLy8gbGVuZ3RoIG9mIDExIGlzIHRoZSBsZW5ndGggb2YganNwOnVzZUJlYW4KLQkJCS8vIGFuZCBzYXZlcyB0aGUgZXhwZW5zaXZlIGdldFRleHQuZXF1YWxzIGNhbGwKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCWlmIChyLmdldFRleHRMZW5ndGgoKSA9PSAxMSAmJiBqc3BSZWZlcmVuY2VSZWdpb24uZ2V0VGV4dChyKS5lcXVhbHMoImpzcDp1c2VCZWFuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlpc1VzZUJlYW4gPSB0cnVlOwotCQkJCX0KLQkJCQkvLyBicmVhayBubyBtYXR0ZXIgd2hhdCBpZiB5b3UgaGl0IHRhZ25hbWUKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNVc2VCZWFuOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbXBvcnROYW1lCi0JICogICAgICAgICAgICBzaG91bGQgYmUganVzdCB0aGUgcGFja2FnZSBwbHVzIHRoZSB0eXBlIGVnLiBqYXZhLnV0aWwuTGlzdAotCSAqICAgICAgICAgICAgb3IgamF2YS51dGlsLioKLQkgKiBAcGFyYW0ganNwUmVmZXJlbmNlUmVnaW9uCi0JICogICAgICAgICAgICBzaG91bGQgYmUgdGhlIDwlQCBwYWdlIGltcG9ydCA9ICJqYXZhLnV0aWwuTGlzdCIlPiByZWdpb24KLQkgKiBAcGFyYW0gYWRkVG9NYXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kSW1wb3J0VG9CdWZmZXIoU3RyaW5nIGltcG9ydE5hbWUsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBqc3BSZWZlcmVuY2VSZWdpb24sIGJvb2xlYW4gYWRkVG9NYXApIHsKLQkJU3RyaW5nIGphdmFJbXBvcnRTdHJpbmcgPSAiaW1wb3J0ICIgKyBpbXBvcnROYW1lICsgIjsiICsgRU5ETDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZVc2VySW1wb3J0cy5hcHBlbmQoamF2YUltcG9ydFN0cmluZyk7Ci0JCWlmIChhZGRUb01hcCkgewotCQkJYWRkSW1wb3J0VG9NYXAoaW1wb3J0TmFtZSwganNwUmVmZXJlbmNlUmVnaW9uKTsKLQkJfQotCQlmT2Zmc2V0SW5Vc2VySW1wb3J0cyArPSBqYXZhSW1wb3J0U3RyaW5nLmxlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIG5ldyB0ZXh0IGNhbiBiZSBzb21ldGhpbmcgbGlrZTogImltcG9ydCBqYXZhLmxhbmcuT2JqZWN0O1xuIgotCSAqIAotCSAqIGJ1dCB0aGUgcmVmZXJlbmNlIHJlZ2lvbiBjb3VsZCBoYXZlIGJlZW4gc29tZXRoaW5nIGxpa2U6IDwlQHBhZ2UKLQkgKiBpbXBvcnQ9ImphdmEubGFuZy5PYmplY3QsIGphdmEuaW8uKiwgamF2YS51dGlsLkxpc3QiJT4KLQkgKiAKLQkgKiBzbyB0aGUgZXhhY3QgbWFwcGluZyBoYXMgdG8gYmUgY2FsY3VsYXRlZCBjYXJlZnVsbHkuCi0JICogCi0JICogaXNJbmRpcmVjdCBtZWFucyB0aGF0IHRoZSBpbXBvcnQgY2FtZSBmcm9tIGFuIGluY2x1ZGVkIGZpbGUgKGlmIHRydWUpCi0JICogCi0JICogQHBhcmFtIGltcG9ydE5hbWUKLQkgKiBAcGFyYW0ganNwUmVmZXJlbmNlUmVnaW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEltcG9ydFRvTWFwKFN0cmluZyBpbXBvcnROYW1lLCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uKSB7Ci0KLQkJLy8gbWFzc2FnZSB0ZXh0Ci0JCS8vIFN0cmluZyBqc3BUZXh0ID0gaW1wb3J0TmFtZS5zdWJzdHJpbmcoaW1wb3J0TmFtZS5pbmRleE9mKCJpbXBvcnQgIikKLQkJLy8gKyA3LCBpbXBvcnROYW1lLmluZGV4T2YoJzsnKSk7Ci0JCS8vIFN0cmluZyBqc3BUZXh0ID0gaW1wb3J0TmFtZS50cmltKCk7Ci0KLQkJLy8gdGhlc2UgcG9zaXRpb25zIHdpbGwgYmUgdXBkYXRlZCBiZWxvdwotCQlQb3NpdGlvbiBqYXZhUmFuZ2UgPSBuZXcgUG9zaXRpb24oZk9mZnNldEluVXNlckltcG9ydHMgKyA3LCAxKTsKLQkJUG9zaXRpb24ganNwUmFuZ2UgPSBuZXcgUG9zaXRpb24oanNwUmVmZXJlbmNlUmVnaW9uLmdldFN0YXJ0KCksIGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0KLQkJLy8gY2FsY3VsYXRlIEpTUCByYW5nZSBieSBmaW5kaW5nICJpbXBvcnQiIGF0dHJpYnV0ZQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCWludCBzaXplID0gcmVnaW9ucy5zaXplKCk7Ci0KLQkJaW50IHN0YXJ0ID0gLTE7Ci0JCWludCBsZW5ndGggPSAtMTsKLQotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpCi0JCQkJaWYgKGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRUZXh0KHIpLnRyaW0oKS5lcXVhbHMoImltcG9ydCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gZ2V0IHRoZSBhdHRyIHZhbHVlIHJlZ2lvbgotCQkJCQlpZiAoc2l6ZSA+IGkgKyAyKSB7Ci0JCQkJCQlyID0gcmVnaW9ucy5nZXQoaSArIDIpOwotCQkJCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQotCQkJCQkJCVN0cmluZyBqc3BJbXBvcnRUZXh0ID0ganNwUmVmZXJlbmNlUmVnaW9uLmdldFRleHQocik7Ci0KLQkJCQkJCQkvLyB0aGUgcG9zaXRpb24gaW4gcXVlc3Rpb24gKGluIHRoZSBKU1ApIGlzIHdoYXQKLQkJCQkJCQkvLyBpcyBicmFja2V0ZWQgYmVsb3cKLQkJCQkJCQkvLyBpbmNsdWRlcyB3aGl0ZXNwYWNlCi0JCQkJCQkJLy8gPCVAcGFnZSBpbXBvcnQ9ImphdmEubGFuZy5PYmplY3QsWyBqYXZhLmlvLiogXSwKLQkJCQkJCQkvLyBqYXZhLnV0aWwuTGlzdCIlPgotCi0JCQkJCQkJLy8gaW4gdGhlIGphdmEgZmlsZQotCQkJCQkJCS8vIGltcG9ydCBbIGphdmEuaW8uKiBdOwotCi0JCQkJCQkJc3RhcnQgPSBqc3BJbXBvcnRUZXh0LmluZGV4T2YoaW1wb3J0TmFtZSk7Ci0JCQkJCQkJbGVuZ3RoID0gaW1wb3J0TmFtZS5sZW5ndGgoKTsKLQotCQkJCQkJCS8vIHNhZmV0eSwgZG9uJ3QgYWRkIHRvIG1hcCBpZiBiYWQgcG9zaXRpb25pbmcKLQkJCQkJCQlpZiAoc3RhcnQgPT0gLTEgfHwgbGVuZ3RoIDwgMSkKLQkJCQkJCQkJYnJlYWs7Ci0KLQkJCQkJCQkvLyB1cGRhdGUganNwIHJhbmdlCi0JCQkJCQkJanNwUmFuZ2Uuc2V0T2Zmc2V0KGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRTdGFydE9mZnNldChyKSArIHN0YXJ0KTsKLQkJCQkJCQlqc3BSYW5nZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCQkJCS8vIHVwZGF0ZSBqYXZhIHJhbmdlCi0JCQkJCQkJamF2YVJhbmdlLnNldExlbmd0aChsZW5ndGgpOwotCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCX0KLQotCQkvLyBzYWZldHkgZm9yIGJhZCByYW5nZXMKLQkJaWYgKHN0YXJ0ICE9IC0xICYmIGxlbmd0aCA+IDEpIHsKLQkJCS8vIHB1dCByYW5nZXMgaW4gamF2YSAtPiBqc3AgcmFuZ2UgbWFwCi0JCQlmSW1wb3J0UmFuZ2VzLnB1dChqYXZhUmFuZ2UsIGpzcFJhbmdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHRlbXAgZml4IGZvciAyODIyOTUgdW50aWwgYmV0dGVyIG1hcHBpbmcgaXMgaW4gcGxhY2UKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqIEBwYXJhbSBqc3BSZWZlcmVuY2VSZWdpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kVXNlQmVhblRvQnVmZmVyKFN0cmluZyBuZXdUZXh0LCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uLCBib29sZWFuIGlzSW5kaXJlY3QpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBqYXZhIHN0cmluZyBsb29rcyBsaWtlIHRoaXMgKHRva2VuaXplZCkKLQkJLy8gVHlwZSBpZCA9IG5ldyBDbGFzc25hbWUoKTtcbgotCQkvLyAwIDEgMiAzIDQKLQkJLy8gb3IKLQkJLy8gVHlwZSBpZCA9IG51bGw7XG4gLy8gaWYgdGhlcmUgaXMgbm8gY2xhc3NuYW1lCi0JCS8vIDAgMSAyIDMKLQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vIGNhbGN1bGF0ZSBqYXZhIHJhbmdlcwotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobmV3VGV4dCwgIiAiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGkgPSAwOwotCQlTdHJpbmdbXSBwYXJzZWRKYXZhID0gbmV3IFN0cmluZ1tzdC5jb3VudFRva2VucygpXTsKLQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLQkJCXBhcnNlZEphdmFbaSsrXSA9IHN0Lm5leHRUb2tlbigpOwotCi0JCVN0cmluZyB0eXBlID0gcGFyc2VkSmF2YVswXSAhPSBudWxsID8gcGFyc2VkSmF2YVswXSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBpZCA9IHBhcnNlZEphdmFbMV0gIT0gbnVsbCA/IHBhcnNlZEphdmFbMV0gOiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY2xhc3NOYW1lID0gcGFyc2VkSmF2YS5sZW5ndGggPiA0ID8gcGFyc2VkSmF2YVs0XSA6ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJUG9zaXRpb24gamF2YVR5cGVSYW5nZSA9IG5ldyBQb3NpdGlvbihmT2Zmc2V0SW5Vc2VyQ29kZSwgdHlwZS5sZW5ndGgoKSk7Ci0JCVBvc2l0aW9uIGphdmFJZFJhbmdlID0gbmV3IFBvc2l0aW9uKGZPZmZzZXRJblVzZXJDb2RlICsgdHlwZS5sZW5ndGgoKSArIDEsIGlkLmxlbmd0aCgpKTsKLQkJUG9zaXRpb24gamF2YUNsYXNzUmFuZ2UgPSBuZXcgUG9zaXRpb24oZk9mZnNldEluVXNlckNvZGUgKyB0eXBlLmxlbmd0aCgpICsgMSArIGlkLmxlbmd0aCgpICsgNywgMCk7Ci0JCS8qCi0JCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTIyNDIgLSBDaGVjayBmb3IKLQkJICogdGhlIGV4aXN0ZW5jZSBvZiAnKCcgZmlyc3QuCi0JCSAqLwotCQlpbnQgcGFyZW5Qb3MgPSAtMTsKLQkJaWYgKGNsYXNzTmFtZS5sZW5ndGgoKSA+PSA0ICYmIChwYXJlblBvcyA9IGNsYXNzTmFtZS5pbmRleE9mKCcoJykpID49IDApIHsKLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NjEzMgotCQkJaW50IGNsYXNzTmFtZUxlbmd0aCA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgcGFyZW5Qb3MpLmxlbmd0aCgpOwotCQkJamF2YUNsYXNzUmFuZ2UgPSBuZXcgUG9zaXRpb24oZk9mZnNldEluVXNlckNvZGUgKyB0eXBlLmxlbmd0aCgpICsgMSArIGlkLmxlbmd0aCgpICsgNywgY2xhc3NOYW1lTGVuZ3RoKTsKLQkJfQotCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyBjYWxjdWxhdGUganNwIHJhbmdlcwotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBqc3BSZWZlcmVuY2VSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJU3RyaW5nIGF0dHJOYW1lID0gIiIsIGF0dHJWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW50IHF1b3RlT2Zmc2V0ID0gMDsKLQkJUG9zaXRpb24ganNwVHlwZVJhbmdlID0gbnVsbDsKLQkJUG9zaXRpb24ganNwSWRSYW5nZSA9IG51bGw7Ci0JCVBvc2l0aW9uIGpzcENsYXNzUmFuZ2UgPSBudWxsOwotCi0JCWZvciAoaW50IGogPSAwOyBqIDwgcmVnaW9ucy5zaXplKCk7IGorKykgewotCQkJciA9IHJlZ2lvbnMuZ2V0KGopOwotCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCWF0dHJOYW1lID0ganNwUmVmZXJlbmNlUmVnaW9uLmdldFRleHQocik7Ci0JCQkJaWYgKHJlZ2lvbnMuc2l6ZSgpID4gaiArIDIgJiYgcmVnaW9ucy5nZXQoaiArIDIpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCS8vIGdldCBhdHRyIHZhbHVlCi0JCQkJCXIgPSByZWdpb25zLmdldChqICsgMik7Ci0JCQkJCWF0dHJWYWx1ZSA9IGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRUZXh0KHIpOwotCi0JCQkJCS8vIG1heSBoYXZlIHF1b3RlcwotCQkJCQlxdW90ZU9mZnNldCA9IChhdHRyVmFsdWUuc3RhcnRzV2l0aCgiXCIiKSB8fCBhdHRyVmFsdWUuc3RhcnRzV2l0aCgiJyIpKSA/IDEgOiAwOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJCQlpZiAoYXR0ck5hbWUuZXF1YWxzKCJ0eXBlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWpzcFR5cGVSYW5nZSA9IG5ldyBQb3NpdGlvbihqc3BSZWZlcmVuY2VSZWdpb24uZ2V0U3RhcnRPZmZzZXQocikgKyBxdW90ZU9mZnNldCwgU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXNMZWF2ZUluc2lkZVNwYWNlKGF0dHJWYWx1ZSkubGVuZ3RoKCkpOwotCQkJCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoImlkIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWpzcElkUmFuZ2UgPSBuZXcgUG9zaXRpb24oanNwUmVmZXJlbmNlUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHIpICsgcXVvdGVPZmZzZXQsIFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzTGVhdmVJbnNpZGVTcGFjZShhdHRyVmFsdWUpLmxlbmd0aCgpKTsKLQkJCQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKCJjbGFzcyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQlqc3BDbGFzc1JhbmdlID0gbmV3IFBvc2l0aW9uKGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRTdGFydE9mZnNldChyKSArIHF1b3RlT2Zmc2V0LCBTdHJpbmdVdGlscy5zdHJpcFF1b3Rlc0xlYXZlSW5zaWRlU3BhY2UoYXR0clZhbHVlKS5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gcHV0IHJhbmdlcyBpbiBqYXZhIC0+IGpzcCByYW5nZSBtYXAKLQkJaWYgKCF0eXBlLmVxdWFscygiIikgJiYganNwVHlwZVJhbmdlICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJZkNvZGVSYW5nZXMucHV0KGphdmFUeXBlUmFuZ2UsIGpzcFR5cGVSYW5nZSk7Ci0JCQkvLyBub3RlOiBkb24ndCB1cGRhdGUgb2Zmc2V0cyBmb3IgdGhpcyBtYXAgd2hlbiByZXN1bHQgaXMgYnVpbHQKLQkJCS8vIHRoZXknbGwgYmUgdXBkYXRlZCB3aGVuIGNvZGUgcmFuZ2VzIG9mZnNldHMgYXJlIHVwZGF0ZWQKLQkJCWZVc2VCZWFuUmFuZ2VzLnB1dChqYXZhVHlwZVJhbmdlLCBqc3BUeXBlUmFuZ2UpOwotCQkJaWYgKGlzSW5kaXJlY3QpCi0JCQkJZkluZGlyZWN0UmFuZ2VzLnB1dChqYXZhVHlwZVJhbmdlLCBqc3BUeXBlUmFuZ2UpOwotCQl9Ci0JCWlmICghaWQuZXF1YWxzKCIiKSAmJiBqc3BJZFJhbmdlICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJZkNvZGVSYW5nZXMucHV0KGphdmFJZFJhbmdlLCBqc3BJZFJhbmdlKTsKLQkJCS8vIG5vdGU6IGRvbid0IHVwZGF0ZSBvZmZzZXRzIGZvciB0aGlzIG1hcCB3aGVuIHJlc3VsdCBpcyBidWlsdAotCQkJLy8gdGhleSdsbCBiZSB1cGRhdGVkIHdoZW4gY29kZSByYW5nZXMgb2Zmc2V0cyBhcmUgdXBkYXRlZAotCQkJZlVzZUJlYW5SYW5nZXMucHV0KGphdmFJZFJhbmdlLCBqc3BUeXBlUmFuZ2UpOwotCQkJaWYgKGlzSW5kaXJlY3QpCi0JCQkJZkluZGlyZWN0UmFuZ2VzLnB1dChqYXZhSWRSYW5nZSwganNwVHlwZVJhbmdlKTsKLQkJfQotCQlpZiAoIWNsYXNzTmFtZS5lcXVhbHMoIiIpICYmIGpzcENsYXNzUmFuZ2UgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlmQ29kZVJhbmdlcy5wdXQoamF2YUNsYXNzUmFuZ2UsIGpzcENsYXNzUmFuZ2UpOwotCQkJLy8gbm90ZTogZG9uJ3QgdXBkYXRlIG9mZnNldHMgZm9yIHRoaXMgbWFwIHdoZW4gcmVzdWx0IGlzIGJ1aWx0Ci0JCQkvLyB0aGV5J2xsIGJlIHVwZGF0ZWQgd2hlbiBjb2RlIHJhbmdlcyBvZmZzZXRzIGFyZSB1cGRhdGVkCi0JCQlmVXNlQmVhblJhbmdlcy5wdXQoamF2YUNsYXNzUmFuZ2UsIGpzcFR5cGVSYW5nZSk7Ci0JCQlpZiAoaXNJbmRpcmVjdCkKLQkJCQlmSW5kaXJlY3RSYW5nZXMucHV0KGphdmFDbGFzc1JhbmdlLCBqc3BUeXBlUmFuZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBidWZmZXIgdG8gdGhlIGN1cnJlbnQgSlNQVHlwZTogU1RBTkRBUkRfSlNQLCBFTUJFRERFRF9KU1AsCi0JICogREVDTEFSQVRJT04sIEVYUFJFU1NJT04sIFNDUklQVExFVCAoZm9yIGtlZXB0aW5nIHRyYWNrIG9mIGN1cnNvcgotCSAqIHBvc2l0aW9uIHdoZW4gdGhlIGZpbmFsIGRvY3VtZW50IGlzIGJ1aWx0KQotCSAqIAotCSAqIEBwYXJhbSBKU1BUeXBlCi0JICogICAgICAgICAgICB0aGUgSlNQIHR5cGUgdGhhdCB0aGUgY3Vyc29yIGlzIGluCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3Vyc29yT3duZXIoaW50IEpTUFR5cGUpIHsKLQkJc3dpdGNoIChKU1BUeXBlKSB7Ci0JCQljYXNlIERFQ0xBUkFUSU9OIDoKLQkJCQlzZXRDdXJzb3JPd25lcihmVXNlckRlY2xhcmF0aW9ucyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVYUFJFU1NJT04gOgotCQkJY2FzZSBTQ1JJUFRMRVQgOgotCQkJCXNldEN1cnNvck93bmVyKGZVc2VyQ29kZSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlzZXRDdXJzb3JPd25lcihmVXNlckNvZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogdGhpcyBwaWVjZSBvZiBjb2RlIGl0ZXJhdGVzIHRocm91Z2ggZkN1cnJlbnROb2RlcyBhbmQgY2x1bXBzIHRoZW0KLQkgKiB0b2dldGhlciBpbiBhIGJpZyB0ZXh0IHN0cmluZyAtIHVuZXNjYXBpbmcgY2hhcmFjdGVycyBpZiB0aGV5IGFyZSBub3QKLQkgKiBDREFUQSAtIHNpbXBseSBhcHBlbmRpbmcgaWYgdGhleSBhcmUgQ0RBVEEgaXQgc3RvcHMgaXRlcmF0aW9uIHdoZW4gaXQKLQkgKiBoaXRzIGEgbm9kZSB0aGF0IGlzIGFuIFhNTF9UQUdfTkFNRSAod2hpY2ggc2hvdWxkIGJlIHRoZSByZWdpb24gY2xvc2luZwotCSAqIHRhZykKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVuZXNjYXBlZFJlZ2lvblRleHQoSVRleHRSZWdpb25Db2xsZWN0aW9uIHN0UmVnaW9uLCBpbnQgSlNQVHlwZSkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgc3RhcnQgPSBzdFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gc3RSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCS8vIGFkanVzdG1lbnQgbmVjZXNzYXJ5IGZvciBlbWJlZGRlZCByZWdpb24gY29udGFpbmVycwotCQlpZiAoc3RSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lciAmJiBzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQlpZiAoc3RSZWdpb24uZ2V0UmVnaW9ucygpICE9IG51bGwgJiYgc3RSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA+IDEpIHsKLQkJCQlJVGV4dFJlZ2lvbiBqc3BDb250ZW50ID0gc3RSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKTsgLy8gc2hvdWxkCi0JCQkJLy8gYmUKLQkJCQkvLyBqc3BDb250ZW50Ci0JCQkJLy8gcmVnaW9uCi0JCQkJc3RhcnQgPSBzdFJlZ2lvbi5nZXRTdGFydE9mZnNldChqc3BDb250ZW50KTsKLQkJCQllbmQgPSBzdFJlZ2lvbi5nZXRFbmRPZmZzZXQoanNwQ29udGVudCk7Ci0JCQl9Ci0JCX0KLQkJaW50IENEQVRBT2Zmc2V0ID0gMDsgLy8gbnVtYmVyIG9mIGNoYXJhY3RlcnMgbG9zdCBpbiBjb252ZXJzaW9uCi0JCWludCBidWZmZXJTaXplID0gMDsKLQkJaWYgKHN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCB8fCBzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUIC8vIG5lZWQKLQkJCQkJLy8gdGhpcwotCQkJCQkvLyBmb3IKLQkJCQkJLy8gZW1iZWRkZWQKLQkJCQkJLy8gSlNQCi0JCQkJCS8vIHJlZ2lvbnMKLQkJCQkJfHwgc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSAvLyBuZWVkCi0JCS8vIHRoaXMKLQkJLy8gaW4KLQkJLy8gY2FzZQotCQkvLyB0aGVyZSdzCi0JCS8vIG5vCi0JCS8vIHJlZ2lvbi4uLgotCQl7Ci0JCQlmSW5Db2RlUmVnaW9uID0gKHN0YXJ0IDw9IGZTb3VyY2VQb3NpdGlvbiAmJiBmU291cmNlUG9zaXRpb24gPD0gZW5kKTsKLQkJCWlmIChmSW5Db2RlUmVnaW9uKSB7Ci0JCQkJc2V0Q3Vyc29yT3duZXIoSlNQVHlwZSk7Ci0JCQkJc2V0UmVsYXRpdmVPZmZzZXQoKGZTb3VyY2VQb3NpdGlvbiAtIHN0YXJ0KSArIGdldEN1cnNvck93bmVyKCkubGVuZ3RoKCkpOwotCQkJCWlmIChKU1BUeXBlID09IEVYUFJFU1NJT04pIHsKLQkJCQkJLy8gaWYgYW4gZXhwcmVzc2lvbiwgYWRkIHRoZW4gbGVuZ3RoIG9mIHRoZSBlbmNsb3NpbmcKLQkJCQkJLy8gcGFyZW4uLgotCQkJCQlzZXRDdXJzb3JJbkV4cHJlc3Npb24odHJ1ZSk7Ci0JCQkJCXNldFJlbGF0aXZlT2Zmc2V0KGdldFJlbGF0aXZlT2Zmc2V0KCkgKyBFWFBSRVNTSU9OX1BSRUZJWC5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQkJSVRleHRSZWdpb24ganNwQ29udGVudCA9IG51bGw7Ci0JCQlpZiAoc3RSZWdpb24uZ2V0UmVnaW9ucygpICE9IG51bGwgJiYgc3RSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA+IDEpCi0JCQkJanNwQ29udGVudCA9IHN0UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQlyZXR1cm4gKGpzcENvbnRlbnQgIT0gbnVsbCkgPyBzdFJlZ2lvbi5nZXRGdWxsVGV4dChqc3BDb250ZW50KSA6IHN0UmVnaW9uLmdldEZ1bGxUZXh0KCk7IC8vIGRvbid0Ci0JCQkvLyB1bmVzY2FwZQotCQkJLy8gaWYKLQkJCS8vIGl0J3MKLQkJCS8vIG5vdAotCQkJLy8gYW4KLQkJCS8vIFhNTEpTUAotCQkJLy8gdGFnCi0JCX0KLQkJZWxzZSBpZiAoc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSkgewotCQkJLy8gbmVlZCB0byBkZXRlcm1pbmUgY3Vyc29yIG93bmVyIHNvIHRoYXQgdGhlIGZDdXJvc29yUG9zaXRpb24KLQkJCS8vIHdpbGwgYmUKLQkJCS8vIGNvcnJlY3QgZXZlbiBpZiB0aGVyZSBpcyBubyByZWdpb24gYWZ0ZXIgdGhlIGN1cnNvciBpbiB0aGUgSlNQCi0JCQkvLyBmaWxlCi0JCQlzZXRDdXJzb3JPd25lcihKU1BUeXBlKTsKLQkJfQotCQkvLyBpdGVyYXRlIFhNTENPTlRFTlQgYW5kIENEQVRBIHJlZ2lvbnMKLQkJLy8gbG9vcCBmQ3VycmVudE5vZGUgdW50aWwgeW91IGhpdCA8L2pzcDpzY3JpcHRsZXQ+IChvciBvdGhlciBjbG9zaW5nCi0JCS8vIHRhZyBuYW1lKQotCQl3aGlsZSAoZ2V0Q3VycmVudE5vZGUoKSAhPSBudWxsICYmIGdldEN1cnJlbnROb2RlKCkuZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSAvLyBuZWVkCi0JCS8vIHRvCi0JCS8vIHN0b3AKLQkJLy8gb24KLQkJLy8gdGhlCi0JCS8vIGVuZGluZwotCQkvLyB0YWcKLQkJLy8gbmFtZS4uLgotCQl7Ci0JCQlzdGFydCA9IGdldEN1cnJlbnROb2RlKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWVuZCA9IGdldEN1cnJlbnROb2RlKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlidWZmZXJTaXplID0gYnVmZmVyLmxlbmd0aCgpOwotCQkJQ0RBVEFPZmZzZXQgPSB1bmVzY2FwZVJlZ2lvbihnZXRDdXJyZW50Tm9kZSgpLCBidWZmZXIpOwotCQkJZkluQ29kZVJlZ2lvbiA9IChzdGFydCA8PSBmU291cmNlUG9zaXRpb24gJiYgZlNvdXJjZVBvc2l0aW9uIDw9IGVuZCk7Ci0JCQlpZiAoZkluQ29kZVJlZ2lvbikgewotCQkJCXNldEN1cnNvck93bmVyKEpTUFR5cGUpOwotCQkJCS8vIHRoaXMgb2Zmc2V0IGlzIHNvcnQgb2YgY29tcGxpY2F0ZWQuLi4KLQkJCQkvLyBpdCdzIGNvbXBvc2VkIG9mOgotCQkJCS8vIDEuIHRoZSBsZW5ndGggb2YgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHJlZ2lvbiB1cCB0aWxsCi0JCQkJLy8gd2hlcmUgdGhlIGN1cnNvciBpcwotCQkJCS8vIDIuIG1pbnVzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBsb3N0IGluIENEQVRBIHRyYW5zbGF0aW9uCi0JCQkJLy8gMy4gcGx1cyB0aGUgbGVuZ3RoIG9mIHRoZSBlc2NhcGVkIGJ1ZmZlciBiZWZvcmUgdGhlIGN1cnJlbnQKLQkJCQkvLyByZWdpb24sIGJ1dAotCQkJCS8vIGlzIHN0aWxsIHdpdGhpbiB0aGUganNwIHRhZwotCQkJCXNldFJlbGF0aXZlT2Zmc2V0KChmU291cmNlUG9zaXRpb24gLSBnZXRDdXJyZW50Tm9kZSgpLmdldFN0YXJ0T2Zmc2V0KCkpICsgZ2V0Q3Vyc29yT3duZXIoKS5sZW5ndGgoKSAtIENEQVRBT2Zmc2V0ICsgYnVmZmVyU2l6ZSk7Ci0JCQkJaWYgKEpTUFR5cGUgPT0gRVhQUkVTU0lPTikgewotCQkJCQlzZXRDdXJzb3JJbkV4cHJlc3Npb24odHJ1ZSk7Ci0JCQkJCS8vIGlmIGFuIGV4cHJlc3Npb24sIGFkZCB0aGVuIGxlbmd0aCBvZiB0aGUgZW5jbG9zaW5nCi0JCQkJCS8vIHBhcmVuLi4KLQkJCQkJc2V0UmVsYXRpdmVPZmZzZXQoZ2V0UmVsYXRpdmVPZmZzZXQoKSArIEVYUFJFU1NJT05fUFJFRklYLmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZ2V0Q3VycmVudE5vZGUoKSAhPSBudWxsKQotCQkJCWFkdmFuY2VOZXh0Tm9kZSgpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcgotCSAqICAgICAgICAgICAgdGhlIHJlZ2lvbiB0byBiZSB1bmVzY2FwZWQgKFhNTENvbnRlbnQsIFhNTCBFTlRJVFkKLQkgKiAgICAgICAgICAgIFJFRkVSRU5DRSwgb3IgQ0RBVEEpCi0JICogQHBhcmFtIHNiCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nYnVmZmVyIHRvIGFwcGVuZCB0aGUgdGV4dCB0bwotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlbW92ZWQgaW4gdW5lc2NhcGluZyB0aGlzIHRleHQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHVuZXNjYXBlUmVnaW9uKElUZXh0UmVnaW9uIHIsIFN0cmluZ0J1ZmZlciBzYikgewotCQlTdHJpbmcgcyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBsZW5ndGhCZWZvcmUgPSAwLCBsZW5ndGhBZnRlciA9IDAsIGNkYXRhX3RhZ3NfbGVuZ3RoID0gMDsKLQkJaWYgKHIgIT0gbnVsbCAmJiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCB8fCByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFKSkgewotCQkJbGVuZ3RoQmVmb3JlID0gKGdldEN1cnJlbnROb2RlKCkgIT0gcikgPyBnZXRDdXJyZW50Tm9kZSgpLmdldEZ1bGxUZXh0KHIpLmxlbmd0aCgpIDogZ2V0Q3VycmVudE5vZGUoKS5nZXRGdWxsVGV4dCgpLmxlbmd0aCgpOwotCQkJcyA9IEVzY2FwZWRUZXh0VXRpbC5nZXRVbmVzY2FwZWRUZXh0KGdldEN1cnJlbnROb2RlKCksIHIpOwotCQkJbGVuZ3RoQWZ0ZXIgPSBzLmxlbmd0aCgpOwotCQkJc2IuYXBwZW5kKHMpOwotCQl9Ci0JCWVsc2UgaWYgKHIgIT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUKSB7Ci0JCQlpZiAociBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSAvLyBvbmx5IGludGVyZXN0ZWQgaW4KLQkJCS8vIGNvbnRlbnRzCi0JCQl7Ci0JCQkJLy8gbmF2aWdhdGUgdG8gbmV4dCByZWdpb24gY29udGFpbmVyICh3aGljaCBzaG91bGQgYmUgYSBKU1AKLQkJCQkvLyByZWdpb24pCi0JCQkJSXRlcmF0b3IgaXQgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByKS5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCQlJVGV4dFJlZ2lvbiB0ZW1wID0gbnVsbDsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCXRlbXAgPSAoSVRleHRSZWdpb24pIGl0Lm5leHQoKTsKLQkJCQkJaWYgKHRlbXAgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lciB8fCB0ZW1wLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUKSB7Ci0JCQkJCQlzYi5hcHBlbmQoZ2V0Q3VycmVudE5vZGUoKS5nZXRGdWxsVGV4dCh0ZW1wKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAodGVtcC5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTiB8fCB0ZW1wLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRSkgewotCQkJCQkJY2RhdGFfdGFnc19sZW5ndGggKz0gdGVtcC5nZXRMZW5ndGgoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKGxlbmd0aEJlZm9yZSAtIGxlbmd0aEFmdGVyICsgY2RhdGFfdGFnc19sZW5ndGgpOwotCX0KLQotCS8vCi0JLy8gPGpzcDp1c2VCZWFuPgotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZVVzZUJlYW4oSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbnRhaW5lcikgewotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJU3RyaW5nIGF0dHJOYW1lID0gbnVsbDsKLQkJU3RyaW5nIGF0dHJWYWx1ZSA9IG51bGw7Ci0JCVN0cmluZyBpZCA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIGlkUmVnaW9uID0gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCQlJVGV4dFJlZ2lvbiB0eXBlUmVnaW9uID0gbnVsbDsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIGNsYXNzbmFtZVJlZ2lvbiA9IG51bGw7Ci0JCVN0cmluZyBiZWFuTmFtZSA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIGJlYW5OYW1lUmVnaW9uID0gbnVsbDsKLQotCQlJdGVyYXRvciByZWdpb25zID0gY29udGFpbmVyLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIChyLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UgfHwgci5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSkgewotCQkJYXR0ck5hbWUgPSBhdHRyVmFsdWUgPSBudWxsOwotCQkJaWYgKHIuZ2V0VHlwZSgpLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpKSB7Ci0JCQkJYXR0ck5hbWUgPSBjb250YWluZXIuZ2V0VGV4dChyKS50cmltKCk7Ci0JCQkJaWYgKHJlZ2lvbnMuaGFzTmV4dCgpICYmIChyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKSkgIT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCQlpZiAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCWF0dHJWYWx1ZSA9IFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzKGNvbnRhaW5lci5nZXRUZXh0KHIpKTsKLQkJCQkJfQotCQkJCQkvLyBoYXMgZXF1YWxzLCBidXQgbm8gdmFsdWU/Ci0JCQkJfQotCQkJCS8vIGFuIGF0dHJpYnV0ZSB3aXRoIG5vIGVxdWFscz8KLQkJCX0KLQkJCS8vIChwYSkgbWlnaHQgbmVlZCBkaWZmZXJlbnQgbG9naWMgaGVyZSBpZiB3ZSB3YW5uYSBzdXBwb3J0IG1vcmUKLQkJCWlmIChhdHRyTmFtZSAhPSBudWxsICYmIGF0dHJWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGF0dHJOYW1lLmVxdWFscygiaWQiKSkgey8vJE5PTi1OTFMtMSQKLQkJCQkJaWQgPSBhdHRyVmFsdWU7Ci0JCQkJCWlkUmVnaW9uID0gcjsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKCJjbGFzcyIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQljbGFzc05hbWUgPSBhdHRyVmFsdWU7Ci0JCQkJCWNsYXNzbmFtZVJlZ2lvbiA9IHI7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscygidHlwZSIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQl0eXBlID0gYXR0clZhbHVlOwotCQkJCQl0eXBlUmVnaW9uID0gcjsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKCJiZWFuTmFtZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYmVhbk5hbWUgPSBhdHRyVmFsdWU7Ci0JCQkJCWJlYW5OYW1lUmVnaW9uID0gcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJLy8gVGhlIGlkIGlzIG5vdCBhIHZhbGlkIEphdmEgaWRlbnRpZmllcgotCQkJaWYgKCFpc1ZhbGlkSmF2YUlkZW50aWZpZXIoaWQpICYmIGlkUmVnaW9uICE9IG51bGwpIHsKLQkJCQlPYmplY3QgcHJvYmxlbSA9IGNyZWF0ZUpTUFByb2JsZW0oSUpTUFByb2JsZW0uVXNlQmVhbkludmFsaWRJRCwgSVByb2JsZW0uUGFyc2luZ0Vycm9ySW52YWxpZFRva2VuLCBNZXNzYWdlRm9ybWF0LmZvcm1hdChKU1BDb3JlTWVzc2FnZXMuSlNQVHJhbnNsYXRvcl8wLCBuZXcgU3RyaW5nW117aWR9KSwgY29udGFpbmVyLmdldFN0YXJ0T2Zmc2V0KGlkUmVnaW9uKSwgY29udGFpbmVyLmdldFRleHRFbmRPZmZzZXQoaWRSZWdpb24pIC0gMSk7Ci0JCQkJZlRyYW5zbGF0aW9uUHJvYmxlbXMuYWRkKHByb2JsZW0pOwotCQkJfQotCQkJLy8gTm8gVHlwZSBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZAotCQkJaWYgKCgodHlwZSA9PSBudWxsICYmIGNsYXNzTmFtZSA9PSBudWxsKSB8fCAodHlwZSA9PSBudWxsICYmIGJlYW5OYW1lICE9IG51bGwpKSAmJiBpZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IHByb2JsZW0gPSBjcmVhdGVKU1BQcm9ibGVtKElKU1BQcm9ibGVtLlVzZUJlYW5NaXNzaW5nVHlwZUluZm8sIElQcm9ibGVtLlVuZGVmaW5lZFR5cGUsIE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BUcmFuc2xhdG9yXzMsIG5ldyBTdHJpbmdbXXtpZH0pLCBjb250YWluZXIuZ2V0U3RhcnRPZmZzZXQoaWRSZWdpb24pLCBjb250YWluZXIuZ2V0VGV4dEVuZE9mZnNldChpZFJlZ2lvbikgLSAxKTsKLQkJCQlmVHJhbnNsYXRpb25Qcm9ibGVtcy5hZGQocHJvYmxlbSk7Ci0JCQl9Ci0JCQkvLyBDYW5ub3Qgc3BlY2lmeSBib3RoIGEgY2xhc3MgYW5kIGEgYmVhbk5hbWUKLQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCAmJiBiZWFuTmFtZSAhPSBudWxsICYmIGJlYW5OYW1lUmVnaW9uICE9IG51bGwpIHsKLQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gY29udGFpbmVyLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQkJT2JqZWN0IHByb2JsZW0gPSBjcmVhdGVKU1BQcm9ibGVtKElKU1BQcm9ibGVtLlVzZUJlYW5BbWJpZ3VvdXNUeXBlLCBJUHJvYmxlbS5BbWJpZ3VvdXNUeXBlLCBKU1BDb3JlTWVzc2FnZXMuSlNQVHJhbnNsYXRvcl8yLCBjb250YWluZXIuZ2V0U3RhcnRPZmZzZXQobmFtZVJlZ2lvbiksIGNvbnRhaW5lci5nZXRUZXh0RW5kT2Zmc2V0KG5hbWVSZWdpb24pIC0gMSk7Ci0JCQkJZlRyYW5zbGF0aW9uUHJvYmxlbXMuYWRkKHByb2JsZW0pOwotCQkJfQotCQkJLy8gT25seSBoYXZlIGEgY2xhc3Mgb3IgYSBiZWFuTmFtZSBhdCB0aGlzIHBvaW50LCBhbmQgcG90ZW50aWFsbHkKLQkJCS8vIGEgdHlwZQotCQkJLy8gaGFzIGlkIHcvIHR5cGUgYW5kL29yIGNsYXNzbmFtZS9iZWFuTmFtZQotCQkJLy8gVHlwZSBpZCA9IG5ldyBDbGFzc25hbWUvQmVhbm5hbWUoKTsKLQkJCS8vIG9yCi0JCQkvLyBUeXBlIGlkID0gbnVsbDsgLy8gaWYgdGhlcmUgaXMgbm8gY2xhc3NuYW1lIG9yIGJlYW5uYW1lCi0JCQlpZiAoKHR5cGUgIT0gbnVsbCB8fCBjbGFzc05hbWUgIT0gbnVsbCkpIHsKLQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCXR5cGUgPSBjbGFzc05hbWU7Ci0JCQkJCXR5cGVSZWdpb24gPSBjbGFzc25hbWVSZWdpb247Ci0JCQkJfQotCi0JCQkJaWYgKCFpc1R5cGVGb3VuZCh0eXBlKSkgewotCQkJCQlPYmplY3QgcHJvYmxlbSA9IGNyZWF0ZUpTUFByb2JsZW0oSUpTUFByb2JsZW0uRl9QUk9CTEVNX0lEX0xJVEVSQUwsIElQcm9ibGVtLlVuZGVmaW5lZFR5cGUsIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpTUENvcmVNZXNzYWdlcy5KU1BUcmFuc2xhdG9yXzEsIG5ldyBTdHJpbmdbXXt0eXBlfSksIGNvbnRhaW5lci5nZXRTdGFydE9mZnNldCh0eXBlUmVnaW9uKSwgY29udGFpbmVyLmdldFRleHRFbmRPZmZzZXQodHlwZVJlZ2lvbikgLSAxKTsKLQkJCQkJZlRyYW5zbGF0aW9uUHJvYmxlbXMuYWRkKHByb2JsZW0pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJU3RyaW5nIHByZWZpeCA9IHR5cGUgKyAiICIgKyBpZCArICIgPSAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJU3RyaW5nIHN1ZmZpeCA9ICJudWxsOyIgKyBFTkRMOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCkKLQkJCQkJCXN1ZmZpeCA9ICJuZXcgIiArIGNsYXNzTmFtZSArICIoKTsiICsgRU5ETDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWVsc2UgaWYgKGJlYW5OYW1lICE9IG51bGwpCi0JCQkJCQlzdWZmaXggPSAiKCIgKyB0eXBlICsgIikgamF2YS5iZWFucy5CZWFucy5pbnN0YW50aWF0ZShnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCksIFwiIiArIGJlYW5OYW1lICsgIlwiKTsiICsgRU5ETDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJYXBwZW5kVG9CdWZmZXIocHJlZml4ICsgc3VmZml4LCBmVXNlckNvZGUsIHRydWUsIGZDdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVHlwZUZvdW5kKFN0cmluZyB0eXBlTmFtZSkgewotCQlJVHlwZSB0eXBlID0gbnVsbDsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldEZpbGUoKS5nZXRQcm9qZWN0KCk7Ci0JCXRyeSB7Ci0JCQlJSmF2YVByb2plY3QgcCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWlmIChwLmV4aXN0cygpKSB7Ci0JCQkJaWYgKHR5cGVOYW1lLmluZGV4T2YoJzwnKSA+IDAgJiYgdHlwZU5hbWUuaW5kZXhPZignPicpID4gMCkgewotCQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHR5cGVOYW1lKTsKLQkJCQkJU3RyaW5nIGdlbmVyaWMgPSB0b2tlci5uZXh0VG9rZW4oIjwiKTsKLQkJCQkJU3RyaW5nIGVsZW1lbnQgPSB0b2tlci5uZXh0VG9rZW4oIj4iKTsKLQkJCQkJSVR5cGUgZ2VuZXJpY1R5cGUgPSBwLmZpbmRUeXBlKGdlbmVyaWMpOwotCQkJCQlJVHlwZSBlbGVtZW50VHlwZSA9IHAuZmluZFR5cGUoZWxlbWVudCk7Ci0JCQkJCXJldHVybiBnZW5lcmljVHlwZSE9IG51bGwgJiYgZ2VuZXJpY1R5cGUuZXhpc3RzKCkgJiYgZWxlbWVudFR5cGUhPSBudWxsICYmIGVsZW1lbnRUeXBlLmV4aXN0cygpOwotCQkJCX0KLQkJCQl0eXBlID0gcC5maW5kVHlwZSh0eXBlTmFtZSk7Ci0JCQkJcmV0dXJuIHR5cGUgIT0gbnVsbCAmJiB0eXBlLmV4aXN0cygpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJLy8gTm90IGEgSmF2YSBQcm9qZWN0Ci0JCX0KLQkJY2F0Y2goTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTdHJpbmdUb2tlbml6ZXIgZmFpbHVyZSB3aXRoIHVuc3VwcG9ydGVkIHN5bnRheAotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkSmF2YUlkZW50aWZpZXIoU3RyaW5nIGlkKSB7Ci0JCWNoYXJbXSBpZENoYXJzID0gaWQudG9DaGFyQXJyYXkoKTsKLQkJaWYgKGlkQ2hhcnMubGVuZ3RoIDwgMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJYm9vbGVhbiBpc1ZhbGlkID0gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChpZENoYXJzWzBdKTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBpZENoYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpc1ZhbGlkID0gaXNWYWxpZCAmJiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoaWRDaGFyc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGlzVmFsaWQ7Ci0JfQotCi0JZmluYWwgcHVibGljIGludCBnZXRDdXJzb3JQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZDdXJzb3JQb3NpdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0N1cnNvckluRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIGZDdXJzb3JJbkV4cHJlc3Npb247Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3Vyc29ySW5FeHByZXNzaW9uKGJvb2xlYW4gaW4pIHsKLQkJZkN1cnNvckluRXhwcmVzc2lvbiA9IGluOwotCX0KLQotCWZpbmFsIHB1YmxpYyB2b2lkIHNldFNvdXJjZUN1cnNvcihpbnQgaSkgewotCQlmU291cmNlUG9zaXRpb24gPSBpOwotCX0KLQotCWZpbmFsIHB1YmxpYyBpbnQgZ2V0U291cmNlUG9zaXRpb24oKSB7Ci0JCXJldHVybiBmU291cmNlUG9zaXRpb247Ci0JfQotCi0JZmluYWwgcHVibGljIFRMRENNRG9jdW1lbnRNYW5hZ2VyIGdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKCkgewotCQlyZXR1cm4gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcihmU3RydWN0dXJlZERvY3VtZW50KTsKLQl9Ci0KLQlmaW5hbCBwdWJsaWMgdm9pZCBzZXRSZWxhdGl2ZU9mZnNldChpbnQgcmVsYXRpdmVPZmZzZXQpIHsKLQkJdGhpcy5mUmVsYXRpdmVPZmZzZXQgPSByZWxhdGl2ZU9mZnNldDsKLQl9Ci0KLQlmaW5hbCBwdWJsaWMgaW50IGdldFJlbGF0aXZlT2Zmc2V0KCkgewotCQlyZXR1cm4gZlJlbGF0aXZlT2Zmc2V0OwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDdXJzb3JPd25lcihTdHJpbmdCdWZmZXIgY3Vyc29yT3duZXIpIHsKLQkJdGhpcy5mQ3Vyc29yT3duZXIgPSBjdXJzb3JPd25lcjsKLQl9Ci0KLQlmaW5hbCBwdWJsaWMgU3RyaW5nQnVmZmVyIGdldEN1cnNvck93bmVyKCkgewotCQlyZXR1cm4gZkN1cnNvck93bmVyOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZXRDdXJyZW50Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlKSB7Ci0JCXJldHVybiB0aGlzLmZDdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlOwotCX0KLQotCWZpbmFsIHB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEN1cnJlbnROb2RlKCkgewotCQlyZXR1cm4gZkN1cnJlbnROb2RlOwotCX0KLQotCXB1YmxpYyBBcnJheUxpc3QgZ2V0RUxQcm9ibGVtcygpIHsKLQkJcmV0dXJuIGZFTFByb2JsZW1zOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBnZXRNb2RlbFBhdGgoKSB7Ci0JCUlQYXRoIHBhdGggPSBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQl0cnkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXBhdGggPSBuZXcgUGF0aChzTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdHJhbnNsYXRlQ29kYXMoKSB7Ci0JCWZQcm9jZXNzSW5jbHVkZXMgPSBmYWxzZTsKLQkJSVBhdGggbW9kZWxwYXRoID0gZ2V0TW9kZWxQYXRoKCk7Ci0JCWlmIChtb2RlbHBhdGggIT0gbnVsbCkgewotCQkJUHJvcGVydHlHcm91cFtdIHByb3BlcnR5R3JvdXBzID0gRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLmdldEluc3RhbmNlKCkuZ2V0UHJvcGVydHlHcm91cHMobW9kZWxwYXRoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvcGVydHlHcm91cHMubGVuZ3RoOyBqKyspIHsKLQkJCQlJUGF0aFtdIGNvZGFzID0gcHJvcGVydHlHcm91cHNbal0uZ2V0SW5jbHVkZUNvZGEoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvZGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICghZ2V0SW5jbHVkZXMoKS5jb250YWlucyhjb2Rhc1tpXS50b1N0cmluZygpKSAmJiAhY29kYXNbaV0uZXF1YWxzKG1vZGVscGF0aCkpIHsKLQkJCQkJCWdldEluY2x1ZGVzKCkucHVzaChjb2Rhc1tpXSk7Ci0JCQkJCQlKU1BJbmNsdWRlUmVnaW9uSGVscGVyIGhlbHBlciA9IG5ldyBKU1BJbmNsdWRlUmVnaW9uSGVscGVyKHRoaXMsIHRydWUpOwotCQkJCQkJaGVscGVyLnBhcnNlKGNvZGFzW2ldLnRvU3RyaW5nKCkpOwotCQkJCQkJZ2V0SW5jbHVkZXMoKS5wb3AoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmUHJvY2Vzc0luY2x1ZGVzID0gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdHJhbnNsYXRlUHJlbHVkZXMoKSB7Ci0JCWZQcm9jZXNzSW5jbHVkZXMgPSBmYWxzZTsKLQkJSVBhdGggbW9kZWxwYXRoID0gZ2V0TW9kZWxQYXRoKCk7Ci0JCWlmIChtb2RlbHBhdGggIT0gbnVsbCkgewotCQkJUHJvcGVydHlHcm91cFtdIHByb3BlcnR5R3JvdXBzID0gRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLmdldEluc3RhbmNlKCkuZ2V0UHJvcGVydHlHcm91cHMobW9kZWxwYXRoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvcGVydHlHcm91cHMubGVuZ3RoOyBqKyspIHsKLQkJCQlJUGF0aFtdIHByZWx1ZGVzID0gcHJvcGVydHlHcm91cHNbal0uZ2V0SW5jbHVkZVByZWx1ZGUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByZWx1ZGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICghZ2V0SW5jbHVkZXMoKS5jb250YWlucyhwcmVsdWRlc1tpXS50b1N0cmluZygpKSAmJiAhcHJlbHVkZXNbaV0uZXF1YWxzKG1vZGVscGF0aCkpIHsKLQkJCQkJCWdldEluY2x1ZGVzKCkucHVzaChwcmVsdWRlc1tpXSk7Ci0JCQkJCQlKU1BJbmNsdWRlUmVnaW9uSGVscGVyIGhlbHBlciA9IG5ldyBKU1BJbmNsdWRlUmVnaW9uSGVscGVyKHRoaXMsIHRydWUpOwotCQkJCQkJaGVscGVyLnBhcnNlKHByZWx1ZGVzW2ldLnRvU3RyaW5nKCkpOwotCQkJCQkJZ2V0SW5jbHVkZXMoKS5wb3AoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmUHJvY2Vzc0luY2x1ZGVzID0gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvU3RhY2tNYXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9TdGFja01hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2Q0MmEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9TdGFja01hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotLyoqCi0gKiBAYXV0aG9yIG5pdGluCi0gKiAKLSAqLwotY2xhc3MgU3RhY2tNYXAgewotCi0JcHJpdmF0ZSBNYXAgZkludGVybmFsTWFwID0gbnVsbDsKLQotCXB1YmxpYyBTdGFja01hcCgpIHsKLQkJZkludGVybmFsTWFwID0gbmV3IEhhc2hNYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFsbCBtYXBwaW5ncyBmcm9tIHRoaXMgU3RhY2tNYXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJZkludGVybmFsTWFwLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9zdCByZWNlbnRseSBwdXNoZWQgdmFsdWUgdG8gd2hpY2ggdGhpcyBtYXAgbWFwcyB0aGUKLQkgKiBzcGVjaWZpZWQga2V5LiBSZXR1cm5zIDx0dD5udWxsPC90dD4gaWYgdGhlIG1hcCBjb250YWlucyBubyBtYXBwaW5nCi0JICogZm9yIHRoaXMga2V5LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIGtleSB3aG9zZSBhc3NvY2lhdGVkIHZhbHVlIGlzIHRvIGJlIHJldHVybmVkLgotCSAqIEByZXR1cm4gdGhlIG1vc3QgcmVjZW50bHkgcHV0IHZhbHVlIHRvIHdoaWNoIHRoaXMgbWFwIG1hcHMgdGhlCi0JICogICAgICAgICBzcGVjaWZpZWQga2V5LCBvciA8dHQ+bnVsbDwvdHQ+IGlmIHRoZSBtYXAgY29udGFpbnMgbm8KLQkgKiAgICAgICAgIG1hcHBpbmcgZm9yIHRoaXMga2V5LgotCSAqLwotCXB1YmxpYyBPYmplY3QgcGVlayhPYmplY3Qga2V5KSB7Ci0JCVN0YWNrIHN0YWNrID0gKFN0YWNrKSBmSW50ZXJuYWxNYXAuZ2V0KGtleSk7Ci0JCWlmIChzdGFjayAhPSBudWxsKSB7Ci0JCQlPYmplY3QgbyA9IHN0YWNrLnBlZWsoKTsKLQkJCWlmIChzdGFjay5pc0VtcHR5KCkpIHsKLQkJCQlmSW50ZXJuYWxNYXAucmVtb3ZlKGtleSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBc3NvY2lhdGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGlzIG1hcC4gSWYKLQkgKiB0aGUgbWFwIHByZXZpb3VzbHkgY29udGFpbmVkIGEgbWFwcGluZyBmb3IgdGhpcyBrZXksIHRoZSBvbGQgdmFsdWUgaXMKLQkgKiBwdXNoZWQgb250byB0aGUgdG9wIG9mIHRoaXMga2V5J3MgcHJpdmF0ZSBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBrZXkgd2l0aCB3aGljaCB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIHRvIGJlIGFzc29jaWF0ZWQuCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCi0JICogQHJldHVybiBuZXdlc3QgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHNwZWNpZmllZCBrZXkKLQkgKiAKLQkgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIDx0dD5wdXQ8L3R0PiBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzCi0JICogICAgICAgICAgICAgU3RhY2tNYXAuCi0JICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgY2xhc3Mgb2YgdGhlIHNwZWNpZmllZCBrZXkgb3IgdmFsdWUgcHJldmVudHMgaXQgZnJvbQotCSAqICAgICAgICAgICAgIGJlaW5nIHN0b3JlZCBpbiB0aGlzIFN0YWNrTWFwLgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgc29tZSBhc3BlY3Qgb2YgdGhpcyBrZXkgb3IgdmFsdWUgcHJldmVudHMgaXQgZnJvbSBiZWluZwotCSAqICAgICAgICAgICAgIHN0b3JlZCBpbiB0aGlzIFN0YWNrTWFwLgotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24sCi0JICogICAgICAgICAgICAgYXMgdGhpcyBtYXAgZG9lcyBub3QgcGVybWl0IDx0dD5udWxsPC90dD4ga2V5cyBvciB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHB1c2goT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCVN0YWNrIHN0YWNrID0gKFN0YWNrKSBmSW50ZXJuYWxNYXAuZ2V0KGtleSk7Ci0JCWlmIChzdGFjayA9PSBudWxsKSB7Ci0JCQlzdGFjayA9IG5ldyBTdGFjaygpOwotCQkJZkludGVybmFsTWFwLnB1dChrZXksIHN0YWNrKTsKLQkJfQotCQlPYmplY3QgbyA9IHN0YWNrLnB1c2godmFsdWUpOwotCQlyZXR1cm4gbzsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBtb3N0LXJlY2VudCBtYXBwaW5nIGZvciB0aGlzIGtleSBmcm9tIHRoaXMgU3RhY2tNYXAgaWYgaXQKLQkgKiBpcyBwcmVzZW50LgotCSAqIAotCSAqIDxwPgotCSAqIFJldHVybnMgdGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBtYXAgcHJldmlvdXNseSBhc3NvY2lhdGVkIHRoZSBrZXksIG9yCi0JICogPHR0Pm51bGw8L3R0PiBpZiB0aGUgbWFwIGNvbnRhaW5lZCBubyBtYXBwaW5nIGZvciB0aGlzIGtleS4gVGhlIG1hcAotCSAqIHdpbGwgbm90IGNvbnRhaW4gYSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIGtleSBvbmNlIHRoZSBjYWxsIHJldHVybnMuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAga2V5IHdob3NlIHN0YWNrIGlzIHRvIGJlIHBvcHBlZAotCSAqIEByZXR1cm4gbW9zdC1yZWNlbnRseSBwdXNoZWQgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHNwZWNpZmllZCBrZXksIG9yCi0JICogICAgICAgICA8dHQ+bnVsbDwvdHQ+IGlmIHRoZXJlIHdhcyBubyBtYXBwaW5nIGZvciBrZXkuCi0JICogCi0JICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUga2V5IGlzIG9mIGFuIGluYXBwcm9wcmlhdGUgdHlwZSBmb3IgdGhpcyBtYXAuCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBrZXkgaXMgPHR0Pm51bGw8L3R0PiBhcyB0aGlzIGNsYXNzIGRvZXMgbm90IHBlcm1pdAotCSAqICAgICAgICAgICAgIDx0dD5udWxsPC90dD4ga2V5cwotCSAqLwotCXB1YmxpYyBPYmplY3QgcG9wKE9iamVjdCBrZXkpIHsKLQkJU3RhY2sgc3RhY2sgPSAoU3RhY2spIGZJbnRlcm5hbE1hcC5nZXQoa2V5KTsKLQkJaWYgKHN0YWNrICE9IG51bGwpIHsKLQkJCU9iamVjdCBvID0gc3RhY2sucG9wKCk7Ci0JCQlpZiAoc3RhY2suaXNFbXB0eSgpKSB7Ci0JCQkJZkludGVybmFsTWFwLnJlbW92ZShrZXkpOwotCQkJfQotCQkJcmV0dXJuIG87Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL1RhZ1RyYW5zbGF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL1RhZ1RyYW5zbGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTI1ZmNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9UYWdUcmFuc2xhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi1jbGFzcyBUYWdUcmFuc2xhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgewotCVRhZ1RyYW5zbGF0aW9uQWRhcHRlcihJRE9NTW9kZWwgeG1sTW9kZWwpIHsKLQkJc3VwZXIoeG1sTW9kZWwpOwotCX0KLQotCUpTUFRyYW5zbGF0b3IgY3JlYXRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUYWdUcmFuc2xhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL1RhZ1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9UYWdUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0M2U5MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL1RhZ1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotcHVibGljIGNsYXNzIFRhZ1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IHsKLQotCXByaXZhdGUgVGFnVHJhbnNsYXRpb25BZGFwdGVyIGZBZGFwdGVyID0gbnVsbDsKLQotCXB1YmxpYyBUYWdUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgVGFnVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURPTU5vZGUgJiYgZkFkYXB0ZXIgPT0gbnVsbCkgewotCQkJZkFkYXB0ZXIgPSBuZXcgVGFnVHJhbnNsYXRpb25BZGFwdGVyKCgoSURPTU5vZGUpIHRhcmdldCkuZ2V0TW9kZWwoKSk7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigrKSBUYWdUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IFsiICsgdGhpcyArICJdIGNyZWF0ZWQgYWRhcHRlcjogIiArIGZBZGFwdGVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZBZGFwdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChmQWRhcHRlciAhPSBudWxsKSB7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigtKSBUYWdUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IFsiICsgdGhpcyArICJdIHJlbGVhc2luZyBhZGFwdGVyOiAiICsgZkFkYXB0ZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWZBZGFwdGVyLnJlbGVhc2UoKTsKLQkJfQotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL1RhZ1RyYW5zbGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9UYWdUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkN2MxN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL1RhZ1RyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWNsYXNzIFRhZ1RyYW5zbGF0b3IgZXh0ZW5kcyBKU1BUcmFuc2xhdG9yIHsKLQotCXB1YmxpYyBUYWdUcmFuc2xhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlmQ2xhc3NIZWFkZXIgPSAicHVibGljIGNsYXNzIF9UYWdIYW5kbGVyIGV4dGVuZHMgIjsgLy8kTk9OLU5MUy0xJAotCQlmQ2xhc3NuYW1lID0gIl9UYWdIYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JCWZJbXBsaWNpdEltcG9ydHMgPSAiaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkJImltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkJImltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC4qOyIgKyBFTkRMICsgRU5ETDsgLy8kTk9OLU5MUy0xJAotCi0JCWZTZXJ2aWNlSGVhZGVyID0gInB1YmxpYyB2b2lkIGRvVGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBTa2lwUGFnZUV4Y2VwdGlvbiB7IiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJImphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkJImphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JCQkJCSJKc3BDb250ZXh0IGpzcENvbnRleHQgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCQkJCQkiamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dCBhcHBsaWNhdGlvbiA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JCQkJCSJqYXZheC5zZXJ2bGV0LmpzcC5Kc3BXcml0ZXIgb3V0ID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkJImphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZyBjb25maWcgPSBudWxsOyIgKyBFTkRMOyAvLyROT04tTkxTLTEkIAotCi0JCWZTdXBlcmNsYXNzID0gImphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5TaW1wbGVUYWdTdXBwb3J0IjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9YTUxKU1BSZWdpb25IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9YTUxKU1BSZWdpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzNWIzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvWE1MSlNQUmVnaW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRhZ2xpYlRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsLkZpbGVDb250ZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LlN0cnVjdHVyZWREb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5UYWdNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogUGFyc2VyL2hlbHBlciBjbGFzcyBmb3IgSlNQVHJhbnNsYXRvci4gVXNlZCBmb3IgcGFyc2luZyBYTUwtSlNQIHJlZ2lvbnMgKGluCi0gKiBhIHNjcmlwdCBibG9jaykgQSBsb3Qgb2YgbG9naWMgYm9ycm93ZWQgZnJvbSBUTERDTURvY3VtZW50TWFuYWdlci4gVGhlcmUKLSAqIHNob3VsZCBiZSBvbmx5IG9uZSBYTUxKU1BSZWdpb25IZWxwZXIgcGVyIHRleHQgZmlsZQotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1jbGFzcyBYTUxKU1BSZWdpb25IZWxwZXIgaW1wbGVtZW50cyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIHsKLQlwcml2YXRlIGZpbmFsIEpTUFRyYW5zbGF0b3IgZlRyYW5zbGF0b3I7Ci0JcHJvdGVjdGVkIEpTUFNvdXJjZVBhcnNlciBmTG9jYWxQYXJzZXIgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgZlRleHRUb1BhcnNlID0gbnVsbDsKLQkvLyBuZWVkIHRoaXMgaWYgbm90IGF0IHRoZSBzdGFydCBvZiB0aGUgZG9jdW1lbnQgKGVnLiBwYXJzaW5nIGp1c3QgYQotCS8vIHNjcmlwdCBibG9jaykKLQlwcm90ZWN0ZWQgaW50IGZTdGFydE9mVGV4dFRvUGFyc2UgPSAwOwotCS8vIG5hbWUgb2YgdGhlIG9wZW4gdGFnIHRoYXQgd2FzIGxhc3QgaGFuZGxlZCAoaWYgd2UgYXJlIGludGVyZXN0ZWQgaW4gaXQpCi0JcHJvdGVjdGVkIFN0cmluZyBmVGFnbmFtZSA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBmVGV4dEJlZm9yZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBmVW5lc2NhcGVkVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBmU3RyaXBwZWRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBmb3IgcmVjb25jaWxpbmcgY3Vyc29yIHBvc2l0aW9uIGxhdGVyCi0JaW50IGZQb3NzaWJsZU93bmVyID0gSlNQVHJhbnNsYXRvci5TQ1JJUFRMRVQ7Ci0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRyYW5zbGF0ZWQgc291cmNlIGFwcGVuZHMgYXJlIGluZGljYXRlZCBhcwotCSAqICJpbmRpcmVjdCIsIGFmZmVjdGluZyBob3cgb2Zmc2V0cyBhcmUgbWFwcGVkLgotCSAqLwotCWJvb2xlYW4gZkFwcGVuZEFzSW5kaXJlY3RTb3VyY2U7Ci0KLQlwdWJsaWMgWE1MSlNQUmVnaW9uSGVscGVyKEpTUFRyYW5zbGF0b3IgdHJhbnNsYXRvciwgYm9vbGVhbiBhcHBlbmRBc0luZGlyZWN0U291cmNlKSB7Ci0JCWdldExvY2FsUGFyc2VyKCkuYWRkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcih0aGlzKTsKLQkJdGhpcy5mVHJhbnNsYXRvciA9IHRyYW5zbGF0b3I7Ci0JCWZBcHBlbmRBc0luZGlyZWN0U291cmNlID0gYXBwZW5kQXNJbmRpcmVjdFNvdXJjZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSlNQU291cmNlUGFyc2VyIGdldExvY2FsUGFyc2VyKCkgewotCQlpZiAoZkxvY2FsUGFyc2VyID09IG51bGwpCi0JCQlmTG9jYWxQYXJzZXIgPSBuZXcgSlNQU291cmNlUGFyc2VyKCk7Ci0JCXJldHVybiBmTG9jYWxQYXJzZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JCWZMb2NhbFBhcnNlci5hZGRCbG9ja01hcmtlcihtYXJrZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFN0cmluZyB0ZXh0VG9QYXJzZSkgewotCQlyZXNldCh0ZXh0VG9QYXJzZSwgMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIHRleHRUb1BhcnNlLCBpbnQgc3RhcnQpIHsKLQkJZlN0YXJ0T2ZUZXh0VG9QYXJzZSA9IHN0YXJ0OwotCQlnZXRMb2NhbFBhcnNlcigpLnJlc2V0KHRleHRUb1BhcnNlKTsKLQkJZlRleHRUb1BhcnNlID0gdGV4dFRvUGFyc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgZm9yY2VQYXJzZSgpIHsKLQkJZ2V0TG9jYWxQYXJzZXIoKS5nZXREb2N1bWVudFJlZ2lvbnMoKTsKLQkJZkxvY2FsUGFyc2VyID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIHBhcnNlIGFuIGVudGlyZSBmaWxlCi0JICogCi0JICogQHBhcmFtIGZpbGVuYW1lIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwYXJzZShTdHJpbmcgZmlsZVBhdGgpIHsKLQkJZ2V0TG9jYWxQYXJzZXIoKS5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKHRoaXMpOwotCQkvLyBmcm9tIG91dGVyIGNsYXNzCi0JCUxpc3QgYmxvY2tNYXJrZXJzID0gdGhpcy5mVHJhbnNsYXRvci5nZXRCbG9ja01hcmtlcnMoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCA9IFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoZ2V0TG9jYWxQYXJzZXIoKSk7Ci0JCVN0cmluZyBjb250ZW50cyA9IGdldENvbnRlbnRzKGZpbGVQYXRoKTsKLQkJaWYgKGNvbnRlbnRzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIHRoaXMgYWRkcyB0aGUgY3VycmVudCBtYXJrZXJzIGZyb20gdGhlIG91dGVyIGNsYXNzIGxpc3QKLQkJLy8gdG8gdGhpcyBwYXJzZXIgc28gcGFyc2luZyB3b3JrcyBjb3JyZWN0bHkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBibG9ja01hcmtlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCWFkZEJsb2NrTWFya2VyKChCbG9ja01hcmtlcikgYmxvY2tNYXJrZXJzLmdldChpKSk7Ci0JCX0KLQkJLy8gUkFUTEMwMTEzOTc3MAotLy8JCWdldExvY2FsUGFyc2VyKCkuZ2V0TmVzdGFibGVQcmVmaXhlcygpLmFkZEFsbCgoKEpTUFNvdXJjZVBhcnNlcilmVHJhbnNsYXRvci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRQYXJzZXIoKSkuZ2V0TmVzdGFibGVQcmVmaXhlcygpKTsKLQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgZG9jdW1lbnRNYW5hZ2VyID0gdGhpcy5mVHJhbnNsYXRvci5nZXRUTERDTURvY3VtZW50TWFuYWdlcigpOwotCQlpZiAoZG9jdW1lbnRNYW5hZ2VyICE9IG51bGwpIHsKLQkJCUxpc3QgdHJhY2tlcnMgPSBkb2N1bWVudE1hbmFnZXIuZ2V0VGFnbGliVHJhY2tlcnMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB0cmFja2Vycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFnbGliVHJhY2tlciB0cmFja2VyID0gKFRhZ2xpYlRyYWNrZXIpIGl0Lm5leHQoKTsKLQkJCQlTdHJpbmcgcHJlZml4ID0gdHJhY2tlci5nZXRQcmVmaXgoKTsKLQkJCQlnZXRMb2NhbFBhcnNlcigpLmdldE5lc3RhYmxlUHJlZml4ZXMoKS5hZGQobmV3IFRhZ01hcmtlcihwcmVmaXgpKTsKLQkJCX0KLQkJfQotCi0JCXJlc2V0KGNvbnRlbnRzKTsKLQkJLy8gZm9yY2VQYXJzZSgpOwotCQlkb2N1bWVudC5zZXQoY29udGVudHMpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnNvciA9IGRvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCXdoaWxlIChjdXJzb3IgIT0gbnVsbCkgewotCQkJbm9kZVBhcnNlZChjdXJzb3IpOwotCQkJY3Vyc29yID0gY3Vyc29yLmdldE5leHQoKTsKLQkJfQotCQlnZXRMb2NhbFBhcnNlcigpLmFkZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIodGhpcyk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JLyoKLQkgKiBsaXN0ZW5zIHRvIHBhcnNlciBub2RlIHBhcnNlZCBldmVudHMgYWRkcyB0byBsb2NhbCBzY3JpcGxldCwKLQkgKiBleHByZXNzaW9uLCBkZWNsYXJhdGlvbiBidWZmZXJzIGRldGVybWluZXMgd2hpY2ggdHlwZSBvZiByZWdpb24gdGhlCi0JICogY3Vyc29yIGlzIGluLCBhbmQgYWRqdXN0cyBjdXJzb3Igb2Zmc2V0IGFjY29yZGluZ2x5Ci0JICovCi0JcHVibGljIHZvaWQgbm9kZVBhcnNlZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0KLQkJdHJ5IHsKLQotCQkJaGFuZGxlU2NvcGluZ0lmTmVjZXNzYXJ5KHNkUmVnaW9uKTsKLQkJCWlmIChpc0pTUEVuZFJlZ2lvbihzZFJlZ2lvbikpIHsKLQkJCQlTdHJpbmcgbmFtZVN0ciA9IGdldFJlZ2lvbk5hbWUoc2RSZWdpb24pOwotCQkJCWlmIChpc1Bvc3NpYmxlQ3VzdG9tVGFnKG5hbWVTdHIpKSB7Ci0JCQkJCS8vIHRoaXMgY3VzdG9tIHRhZyBtYXkgZGVmaW5lIHZhcmlhYmxlcwotCQkJCQl0aGlzLmZUcmFuc2xhdG9yLmFkZFRhZ2xpYlZhcmlhYmxlcyhuYW1lU3RyLCBzZFJlZ2lvbik7Ci0JCQkJfQotCQkJCWZUYWduYW1lID0gbnVsbDsKLQkJCX0KLQkJCWVsc2UgaWYgKGlzSlNQU3RhcnRSZWdpb24oc2RSZWdpb24pKSB7Ci0JCQkJU3RyaW5nIG5hbWVTdHIgPSBnZXRSZWdpb25OYW1lKHNkUmVnaW9uKTsKLQkJCQlpZiAoc2RSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHsKLQkJCQkJaWYgKGlzUG9zc2libGVDdXN0b21UYWcobmFtZVN0cikpIHsKLQkJCQkJCS8vIHRoaXMgY3VzdG9tIHRhZyBtYXkgZGVmaW5lIHZhcmlhYmxlcwotCQkJCQkJdGhpcy5mVHJhbnNsYXRvci5hZGRUYWdsaWJWYXJpYWJsZXMobmFtZVN0ciwgc2RSZWdpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChpc0pTUFJlZ2lvbihuYW1lU3RyKSkKLQkJCQkJZlRhZ25hbWUgPSBuYW1lU3RyOwotCQkJCWVsc2UKLQkJCQkJZlRhZ25hbWUgPSBudWxsOwotCi0KLQkJCQkvLyB0aGlzIHNlY3Rpb24gYXNzdW1lcyBpbXBvcnRhbnQgY29udGVudCAodG8gdHJhbnNsYXRlKQotCQkJCS8vIElTIHRoZSBvcGVuaW5nIHRhZwotCi0JCQkJLy8gaGFuZGxlIGluY2x1ZGUgYW5kIGRpcmVjdGl2ZQotCQkJCWlmIChmVGFnbmFtZSAhPSBudWxsICYmIHNkUmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTikgewotCQkJCQlwcm9jZXNzT3RoZXJSZWdpb25zKHNkUmVnaW9uKTsKLQkJCQl9Ci0KLQotCQkJCS8vIGhhbmRsZSBqc3A6dXNlQmVhbgotCQkJCWlmIChmVGFnbmFtZSAhPSBudWxsICYmIGZUYWduYW1lLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOKSkgewotCQkJCQlwcm9jZXNzVXNlQmVhbihzZFJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoc2RSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQgfHwgc2RSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgewotCQkJCS8vIHRoaXMgc2VjdGlvbiBhc3N1bWVzIGltcG9ydGFudCBjb250ZW50ICh0byB0cmFuc2xhdGUpCi0JCQkJLy8gaXMgQUZURVIgdGhlIG9wZW5pbmcgdGFnCi0JCQkJaWYgKGZUYWduYW1lICE9IG51bGwpIHsKLQkJCQkJLy8gYXNzaWduIGNvbnRlbnRzIHRvIG9uZSBvZiB0aGUgdGFibGVzCi0JCQkJCWlmIChpc1NjcmlwdGxldChmVGFnbmFtZSkpIHsKLQkJCQkJCXByb2Nlc3NTY3JpcHRsZXQoc2RSZWdpb24pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzRXhwcmVzc2lvbihmVGFnbmFtZSkpIHsKLQkJCQkJCXByb2Nlc3NFeHByZXNzaW9uKHNkUmVnaW9uKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc0RlY2xhcmF0aW9uKGZUYWduYW1lKSkgewotCQkJCQkJcHJvY2Vzc0RlY2xhcmF0aW9uKHNkUmVnaW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWZUYWduYW1lID0gbnVsbDsKLQkJCX0KLQkJCS8vIHRoaXMgdXBkYXRlcyBjdXJzb3IgcG9zaXRpb24KLQkJCWNoZWNrQ3Vyc29ySW5SZWdpb24oc2RSZWdpb24pOwotCQl9Ci0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2dnaW5nIHRoaXMgZXhjZXB0aW9uIHRoYXQgSSd2ZSBzZWVuIGEgY291cGxlIG9mIHRpbWVzLi4uCi0JCQkvLyBzZWVtcyB0byBoYXBwZW4gZHVyaW5nIHNodXRkb3duIG9mIHVuaXQgdGVzdHMsIGF0IHdoaWNoCi0JCQkvLyBwb2ludCBMb2dnZXIgaGFzIGFscmVhZHkgYmVlbiB1bmxvYWRlZAotCQkJdHJ5IHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJYTUxKU1BSZWdpb25IZWxwZXI6IGV4Y2VwdGlvbiBpbiBub2RlIHBhcnNpbmciLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGV4KSB7Ci0JCQkJLy8gZG8gbm90aGluZywgc2luY2Ugd2UncmUganVzdCBlbmRpbmcKLQkJCX0KLQkJfQotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNjb3BpbmdJZk5lY2Vzc2FyeShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCS8qIDE5OTA0NyAtIEJyYWNlcyBtaXNzaW5nIGZyb20gdHJhbnNsYXRpb24gb2YgY3VzdG9tIHRhZ3Mgbm90IGRlZmluaW5nIHZhcmlhYmxlcyAqLwotCQkvLyBmaXggdG8gbWFrZSBzdXJlIGN1c3RvbSB0YWcgYmxvY2sgaGF2ZSB0aGVpciBvd24gc2NvcGUKLQkJLy8gd2UgYWRkICd7JyBmb3IgY3VzdG9tIHRhZyBvcGVuIGFuZCAnfScgZm9yIGN1c3RvbSB0YWcgY2xvc2UKLQkJLy8gaW4gdGhlIHRyYW5zbGF0aW9uCi0JCWlmIChzZFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgewotCQkJaWYgKCFpc1NlbGZDbG9zaW5nVGFnKHNkUmVnaW9uKSkgewotCQkJCVN0cmluZyBuYW1lU3RyID0gZ2V0UmVnaW9uTmFtZShzZFJlZ2lvbik7Ci0JCQkJaWYgKGlzUG9zc2libGVDdXN0b21UYWcobmFtZVN0cikpIHsKLQkJCQkJc3RhcnRTY29wZShuYW1lU3RyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoc2RSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQlTdHJpbmcgbmFtZVN0ciA9IGdldFJlZ2lvbk5hbWUoc2RSZWdpb24pOwotCQkJaWYgKGlzUG9zc2libGVDdXN0b21UYWcobmFtZVN0cikpIHsKLQkJCQllbmRTY29wZShuYW1lU3RyKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1NlbGZDbG9zaW5nVGFnKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXJSZWdpb24pIHsKLQotCQlpZiAoY29udGFpbmVyUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBjb250YWluZXJSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiByID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJcmV0dXJuIHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRTY29wZShTdHJpbmcgdGFnTmFtZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gZlRyYW5zbGF0b3IuZ2V0Q3VycmVudE5vZGUoKTsKLQkJU3RyaW5nQnVmZmVyIHRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXRleHQuYXBwZW5kKCJ7IC8vIDwiKTsgLy8kTk9OLU5MUy0xJAotCQl0ZXh0LmFwcGVuZCh0YWdOYW1lKTsKLQkJdGV4dC5hcHBlbmQoIj5cbiIpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZlRyYW5zbGF0b3IudHJhbnNsYXRlU2NyaXB0bGV0U3RyaW5nKHRleHQudG9TdHJpbmcoKSwgY3VycmVudE5vZGUsIGN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGN1cnJlbnROb2RlLmdldExlbmd0aCgpLCBmQXBwZW5kQXNJbmRpcmVjdFNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXByaXZhdGUgdm9pZCBlbmRTY29wZShTdHJpbmcgdGFnTmFtZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gZlRyYW5zbGF0b3IuZ2V0Q3VycmVudE5vZGUoKTsKLQkJU3RyaW5nQnVmZmVyIHRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXRleHQuYXBwZW5kKCJ9IC8vIDwvIik7IC8vJE5PTi1OTFMtMSQKLQkJdGV4dC5hcHBlbmQodGFnTmFtZSk7Ci0JCXRleHQuYXBwZW5kKCI+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmZUcmFuc2xhdG9yLnRyYW5zbGF0ZVNjcmlwdGxldFN0cmluZyh0ZXh0LnRvU3RyaW5nKCksIGN1cnJlbnROb2RlLCBjdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpLCBjdXJyZW50Tm9kZS5nZXRMZW5ndGgoKSwgZkFwcGVuZEFzSW5kaXJlY3RTb3VyY2UpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldE5vZGVzKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ3Vyc29ySW5SZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQkvLyBpZiBjdXJzb3IgaXMgaW4gdGhpcyByZWdpb24uLi4KLQkJaWYgKHRoaXMuZlRyYW5zbGF0b3IuZ2V0U291cmNlUG9zaXRpb24oKSA+PSBmU3RhcnRPZlRleHRUb1BhcnNlICsgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSAmJiB0aGlzLmZUcmFuc2xhdG9yLmdldFNvdXJjZVBvc2l0aW9uKCkgPD0gZlN0YXJ0T2ZUZXh0VG9QYXJzZSArIHNkUmVnaW9uLmdldEVuZE9mZnNldCgpKSB7Ci0JCQlpbnQgZW5kT2ZOYW1lVGFnID0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWludCBvZmZzZXQgPSBmVGV4dEJlZm9yZS5sZW5ndGgoKSAtIGZTdHJpcHBlZFRleHQubGVuZ3RoKCk7Ci0JCQkvLyBvZmZzZXQgaW4gYWRkdGlvbiB0byB3aGF0J3MgYWxyZWFkeSBpbiB0aGUgYnVmZmVyCi0JCQl0aGlzLmZUcmFuc2xhdG9yLnNldFJlbGF0aXZlT2Zmc2V0KHRoaXMuZlRyYW5zbGF0b3IuZ2V0U291cmNlUG9zaXRpb24oKSAtIChmU3RhcnRPZlRleHRUb1BhcnNlICsgZW5kT2ZOYW1lVGFnKSAtIG9mZnNldCk7Ci0JCQkvLyBvdXRlciBjbGFzcyBtZXRob2QKLQkJCXRoaXMuZlRyYW5zbGF0b3Iuc2V0Q3Vyc29yT3duZXIoZlBvc3NpYmxlT3duZXIpOwotCQkJLy8gYWRkIGxlbmd0aCBvZiB3aGF0J3MgYWxyZWFkeSBpbiB0aGUgYnVmZmVyCi0JCQl0aGlzLmZUcmFuc2xhdG9yLnNldFJlbGF0aXZlT2Zmc2V0KHRoaXMuZlRyYW5zbGF0b3IuZ2V0UmVsYXRpdmVPZmZzZXQoKSArIHRoaXMuZlRyYW5zbGF0b3IuZ2V0Q3Vyc29yT3duZXIoKS5sZW5ndGgoKSk7Ci0JCQlpZiAoZlBvc3NpYmxlT3duZXIgPT0gSlNQVHJhbnNsYXRvci5FWFBSRVNTSU9OKSB7Ci0JCQkJLy8gYWRkIGxlbmd0aCBvZiBleHByZXNzaW9uIHByZWZpeCBpZiBuZWNlc3NhcnkuLi4KLQkJCQl0aGlzLmZUcmFuc2xhdG9yLnNldFJlbGF0aXZlT2Zmc2V0KHRoaXMuZlRyYW5zbGF0b3IuZ2V0UmVsYXRpdmVPZmZzZXQoKSArIEpTUFRyYW5zbGF0b3IuRVhQUkVTU0lPTl9QUkVGSVgubGVuZ3RoKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0RlY2xhcmF0aW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJcHJlcGFyZVRleHQoc2RSZWdpb24pOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gZlRyYW5zbGF0b3IuZ2V0Q3VycmVudE5vZGUoKTsKLQkJdGhpcy5mVHJhbnNsYXRvci50cmFuc2xhdGVEZWNsYXJhdGlvblN0cmluZyhmU3RyaXBwZWRUZXh0LCBjdXJyZW50Tm9kZSwgY3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgY3VycmVudE5vZGUuZ2V0TGVuZ3RoKCksIGZBcHBlbmRBc0luZGlyZWN0U291cmNlKTsKLQkJZlBvc3NpYmxlT3duZXIgPSBKU1BUcmFuc2xhdG9yLkRFQ0xBUkFUSU9OOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NFeHByZXNzaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJcHJlcGFyZVRleHQoc2RSZWdpb24pOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gZlRyYW5zbGF0b3IuZ2V0Q3VycmVudE5vZGUoKTsKLQkJdGhpcy5mVHJhbnNsYXRvci50cmFuc2xhdGVFeHByZXNzaW9uU3RyaW5nKGZTdHJpcHBlZFRleHQsIGN1cnJlbnROb2RlLCBjdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpLCBjdXJyZW50Tm9kZS5nZXRMZW5ndGgoKSwgZkFwcGVuZEFzSW5kaXJlY3RTb3VyY2UpOwotCQlmUG9zc2libGVPd25lciA9IEpTUFRyYW5zbGF0b3IuRVhQUkVTU0lPTjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzU2NyaXB0bGV0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJcHJlcGFyZVRleHQoc2RSZWdpb24pOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gZlRyYW5zbGF0b3IuZ2V0Q3VycmVudE5vZGUoKTsKLQkJdGhpcy5mVHJhbnNsYXRvci50cmFuc2xhdGVTY3JpcHRsZXRTdHJpbmcoZlN0cmlwcGVkVGV4dCwgY3VycmVudE5vZGUsIGN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGN1cnJlbnROb2RlLmdldExlbmd0aCgpLCBmQXBwZW5kQXNJbmRpcmVjdFNvdXJjZSk7Ci0JCWZQb3NzaWJsZU93bmVyID0gSlNQVHJhbnNsYXRvci5TQ1JJUFRMRVQ7Ci0JfQotCi0JLyoKLQkgKiBTdWJzdGl0dXRlcyB2YWx1ZXMgZm9yIGVudGl0eSByZWZlcmVuY2VzLCBzdHJpcHMgQ0RBVEEgdGFncywgYW5kIGtlZXBzCi0JICogdHJhY2sgb2Ygc3RyaW5nIGxlbmd0aChzKSBmb3IgY3Vyc29yIHBvc2l0aW9uIGNhbGN1bGF0aW9uIGxhdGVyLiBAcGFyYW0KLQkgKiBzZFJlZ2lvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByZXBhcmVUZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJZlRleHRCZWZvcmUgPSBmVGV4dFRvUGFyc2Uuc3Vic3RyaW5nKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIHNkUmVnaW9uLmdldEVuZE9mZnNldCgpKTsKLQkJZlVuZXNjYXBlZFRleHQgPSBFc2NhcGVkVGV4dFV0aWwuZ2V0VW5lc2NhcGVkVGV4dChmVGV4dEJlZm9yZSk7Ci0JCWZTdHJpcHBlZFRleHQgPSB0aGlzLmZUcmFuc2xhdG9yLnN0cmlwQ0RBVEEoZlVuZXNjYXBlZFRleHQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NVc2VCZWFuKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJaWYgKGZUYWduYW1lICE9IG51bGwgJiYgaXNVc2VCZWFuKGZUYWduYW1lKSkgewotCi0JCQlTdHJpbmcgYmVhbkNsYXNzLCBiZWFuVHlwZSwgYmVhbklkLCBiZWFuRGVjbCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQliZWFuQ2xhc3MgPSBnZXRBdHRyaWJ1dGVWYWx1ZSgiY2xhc3MiLCBzZFJlZ2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCWJlYW5UeXBlID0gZ2V0QXR0cmlidXRlVmFsdWUoInR5cGUiLCBzZFJlZ2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCWJlYW5JZCA9IGdldEF0dHJpYnV0ZVZhbHVlKCJpZCIsIHNkUmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoYmVhbklkICE9IG51bGwgJiYgKGJlYW5UeXBlICE9IG51bGwgfHwgYmVhbkNsYXNzICE9IG51bGwpKSB7Ci0JCQkJU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0JCQkJaWYgKGJlYW5UeXBlLmxlbmd0aCgpICE9IDApIHsKLQkJCQkJLyogYSB0eXBlIHdhcyBzcGVjaWZpZWQgKi8KLQkJCQkJcHJlZml4ID0gYmVhblR5cGUgKyAiICIgKyBiZWFuSWQgKyAiID0gIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvKiBubyB0eXBlIHdhcyBzcGVjaWZpZWQsIHVzZSB0aGUgY29uY3JldGUgY2xhc3MgdmFsdWUgKi8KLQkJCQkJcHJlZml4ID0gYmVhbkNsYXNzICsgIiAiICsgYmVhbklkICsgIiA9ICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQkvKgotCQkJCSAqIERlZmluZSBhcyBudWxsIGJ5IGRlZmF1bHQuIElmIGEgY29uY3JldGUgY2xhc3Mgd2FzCi0JCQkJICogc3BlY2lmaWVkLCBzdXBwbHkgYSBkZWZhdWx0IGNvbnN0cnVjdG9yIGludm9jYXRpb24gaW5zdGVhZC4KLQkJCQkgKi8KLQkJCQlTdHJpbmcgc3VmZml4ID0gIm51bGw7XG4iOyAvLyROT04tTkxTLTEkCi0JCQkJLy8gMTg2NzcxIC0gSlNQIFZhbGlkYXRvciBwcm9ibGVtIHdpdGggaW5jbHVkZWQgdXNlQmVhbgotCQkJCWlmIChiZWFuQ2xhc3MubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXN1ZmZpeCA9ICJuZXcgIiArIGJlYW5DbGFzcyArICIoKTtcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQliZWFuRGVjbCA9IHByZWZpeCArIHN1ZmZpeDsKLQkJCX0KLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSA9IGZUcmFuc2xhdG9yLmdldEN1cnJlbnROb2RlKCk7Ci0JCQl0aGlzLmZUcmFuc2xhdG9yLnRyYW5zbGF0ZVNjcmlwdGxldFN0cmluZyhiZWFuRGVjbCwgY3VycmVudE5vZGUsIGN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGN1cnJlbnROb2RlLmdldExlbmd0aCgpLCBmQXBwZW5kQXNJbmRpcmVjdFNvdXJjZSk7Ci0JCQlmUG9zc2libGVPd25lciA9IEpTUFRyYW5zbGF0b3IuU0NSSVBUTEVUOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc090aGVyUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCXByb2Nlc3NJbmNsdWRlRGlyZWN0aXZlKHNkUmVnaW9uKTsKLQkJcHJvY2Vzc1BhZ2VEaXJlY3RpdmUoc2RSZWdpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NJbmNsdWRlRGlyZWN0aXZlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJaWYgKGlzSW5jbHVkZURpcmVjdGl2ZShmVGFnbmFtZSkpIHsKLQkJCS8vIHRoZSBkaXJlY3RpdmUgbmFtZSByZWdpb24gaXRzZWxmIGNvbnRhaW5zIHRoZSBhdHRycy4uLgotCQkJaWYgKHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpCi0JCQkJc2RSZWdpb24gPSBzZFJlZ2lvbi5nZXRQcmV2aW91cygpOwotCQkJU3RyaW5nIGZpbGVMb2NhdGlvbiA9IGdldEF0dHJpYnV0ZVZhbHVlKCJmaWxlIiwgc2RSZWdpb24pOyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLmZUcmFuc2xhdG9yLmhhbmRsZUluY2x1ZGVGaWxlKGZpbGVMb2NhdGlvbik7Ci0JCX0KLQkJZWxzZSBpZiAoaXNQb3NzaWJsZUN1c3RvbVRhZyhmVGFnbmFtZSkpIHsKLQkJCS8vIHRoaXMgY3VzdG9tIHRhZyBtYXkgZGVmaW5lIHZhcmlhYmxlcwotCQkJdGhpcy5mVHJhbnNsYXRvci5hZGRUYWdsaWJWYXJpYWJsZXMoZlRhZ25hbWUpOwotCQl9Ci0JCWVsc2UgaWYgKGlzVGFnbGliRGlyZWN0aXZlKGZUYWduYW1lKSkgewotCQkJLy8gYWxzbyBhZGQgdGhlIG9uZXMgY3JlYXRlZCBoZXJlIHRvIHRoZSBwYXJlbnQgZG9jdW1lbnQKLQkJCVN0cmluZyBwcmVmaXggPSBnZXRBdHRyaWJ1dGVWYWx1ZSgicHJlZml4Iiwgc2RSZWdpb24pOyAvLyROT04tTkxTLTEkCi0JCQlUTERDTURvY3VtZW50TWFuYWdlciBkb2N1bWVudE1hbmFnZXIgPSB0aGlzLmZUcmFuc2xhdG9yLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0JCQlpZiAoZG9jdW1lbnRNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlMaXN0IGRvY3MgPSBkb2N1bWVudE1hbmFnZXIuZ2V0Q01Eb2N1bWVudFRyYWNrZXJzKHByZWZpeCwgdGhpcy5mVHJhbnNsYXRvci5nZXRDdXJyZW50Tm9kZSgpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCUl0ZXJhdG9yIGl0ID0gZG9jcy5pdGVyYXRvcigpOwotCQkJCUl0ZXJhdG9yIGVsZW1lbnRzID0gbnVsbDsKLQkJCQlDTU5vZGUgbm9kZSA9IG51bGw7Ci0JCQkJQ01Eb2N1bWVudCBkb2MgPSBudWxsOwotCQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IG51bGw7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlkb2MgPSAoQ01Eb2N1bWVudCkgaXQubmV4dCgpOwotCQkJCQllbGVtZW50cyA9IGRvYy5nZXRFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChlbGVtZW50cy5oYXNOZXh0KCkpIHsKLQkJCQkJCW5vZGUgPSAoQ01Ob2RlKSBlbGVtZW50cy5uZXh0KCk7Ci0JCQkJCQltYXJrZXIgPSBuZXcgQmxvY2tNYXJrZXIobm9kZS5nZXROb2RlTmFtZSgpLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgdHJ1ZSk7Ci0JCQkJCQkvLyBnbG9iYWwgc2NvcGUgaXMgT0sgYmVjYXVzZSB3ZSBoYXZlIGVuY291bnRlcmVkIHRoaXMKLQkJCQkJCS8vIDxAdGFnbGliPiBkaXJlY3RpdmUKLQkJCQkJCS8vIHNvIGl0IGFsbCBtYXJrZXJzIGZyb20gaXQgc2hvdWxkIHdpbGwgYmUgaW4gc2NvcGUKLQkJCQkJCS8vIGFkZCB0byB0aGlzIGxvY2FsIHBhcnNlcgotCQkJCQkJYWRkQmxvY2tNYXJrZXIobWFya2VyKTsKLQkJCQkJCS8vIGFkZCB0byBvdXRlciBjbGFzcyBtYXJrZXIgbGlzdCwgZm9yCi0JCQkJCQl0aGlzLmZUcmFuc2xhdG9yLmdldEJsb2NrTWFya2VycygpLmFkZChtYXJrZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1BhZ2VEaXJlY3RpdmUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlpZiAoaXNQYWdlRGlyZWN0aXZlKGZUYWduYW1lKSkgewotCQkJdGhpcy5mVHJhbnNsYXRvci50cmFuc2xhdGVQYWdlRGlyZWN0aXZlQXR0cmlidXRlcyhzZFJlZ2lvbi5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKSwgc2RSZWdpb24pOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBjb252ZW5pZW5jZSBtZXRob2QgdG8gZ2V0IGFuIGF0dHJpYnV0ZSB2YWx1ZSBmcm9tIGF0dHJpYnV0ZSBuYW1lCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgYXR0ck5hbWUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJU3RyaW5nIHNkUmVnaW9uVGV4dCA9IGZUZXh0VG9QYXJzZS5zdWJzdHJpbmcoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgc2RSZWdpb24uZ2V0RW5kT2Zmc2V0KCkpOwotCQlTdHJpbmcgdGV4dFJlZ2lvblRleHQsIGF0dHJWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUl0ZXJhdG9yIGl0ID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24sIHZhbHVlUmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJbmFtZVJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaXQubmV4dCgpOwotCQkJaWYgKG5hbWVSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCXRleHRSZWdpb25UZXh0ID0gc2RSZWdpb25UZXh0LnN1YnN0cmluZyhuYW1lUmVnaW9uLmdldFN0YXJ0KCksIG5hbWVSZWdpb24uZ2V0VGV4dEVuZCgpKTsKLQkJCQlpZiAodGV4dFJlZ2lvblRleHQuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpIHsKLQkJCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQkJdmFsdWVSZWdpb24gPSAoSVRleHRSZWdpb24pIGl0Lm5leHQoKTsKLQkJCQkJCWlmICh2YWx1ZVJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJCWF0dHJWYWx1ZSA9IHNkUmVnaW9uVGV4dC5zdWJzdHJpbmcodmFsdWVSZWdpb24uZ2V0U3RhcnQoKSwgdmFsdWVSZWdpb24uZ2V0RW5kKCkpOwotCQkJCQkJCWJyZWFrOyAvLyBpbm5lcgotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOyAvLyBvdXRlcgotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXMoYXR0clZhbHVlKTsKLQl9Ci0KLQkvLyB0aGVzZSBtZXRob2RzIGRldGVybWluZSB3aGF0IGNvbnRlbnQgZ2V0cyBhZGRlZCB0byB0aGUgbG9jYWwgc2NyaXBsZXQsCi0JLy8gZXhwcmVzc2lvbiwgZGVjbGFyYXRpb24gYnVmZmVycwotCS8qCi0JICogcmV0dXJuIHRydWUgZm9yIGVsZW1lbnRzIHdob3NlIGNvbnRlbnRzIHdlIG1pZ2h0IHdhbnQgdG8gYWRkIHRvIHRoZQotCSAqIGphdmEgZmlsZSB3ZSBhcmUgYnVpbGRpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0pTUFN0YXJ0UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJcmV0dXJuIChzZFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiB8fCBzZFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0pTUEVuZFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCXJldHVybiAoc2RSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0pTUFJlZ2lvbihTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gaXNEZWNsYXJhdGlvbih0YWdOYW1lKSB8fCBpc0V4cHJlc3Npb24odGFnTmFtZSkgfHwgaXNTY3JpcHRsZXQodGFnTmFtZSkgfHwgaXNVc2VCZWFuKHRhZ05hbWUpIHx8IGlzSW5jbHVkZURpcmVjdGl2ZSh0YWdOYW1lKSB8fCBpc1Bvc3NpYmxlQ3VzdG9tVGFnKHRhZ05hbWUpIHx8IGlzVGFnbGliRGlyZWN0aXZlKHRhZ05hbWUpIHx8IGlzUGFnZURpcmVjdGl2ZSh0YWdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlY2xhcmF0aW9uKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpkZWNsYXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4cHJlc3Npb24oU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgianNwOmV4cHJlc3Npb24iKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTY3JpcHRsZXQoU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgianNwOnNjcmlwdGxldCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNVc2VCZWFuKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDp1c2VCZWFuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luY2x1ZGVEaXJlY3RpdmUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgianNwOmRpcmVjdGl2ZS5pbmNsdWRlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Bvc3NpYmxlQ3VzdG9tVGFnKFN0cmluZyB0YWdOYW1lKSB7Ci0JCWludCBjb2xvbkluZGV4ID0gdGFnTmFtZS5pbmRleE9mKCI6Iik7Ci0JCWlmIChjb2xvbkluZGV4ID4gMCkgewotCQkJU3RyaW5nIHByZWZpeCA9IHRhZ05hbWUuc3Vic3RyaW5nKDAsIGNvbG9uSW5kZXgpOwotCQkJaWYgKHByZWZpeC5lcXVhbHMoImpzcCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAocHJlZml4Lmxlbmd0aCgpID4gMCkgewotCQkJCVRhZ01hcmtlcltdIHByZWZpeGVzID0gKFRhZ01hcmtlcltdKSBmTG9jYWxQYXJzZXIuZ2V0TmVzdGFibGVQcmVmaXhlcygpLnRvQXJyYXkobmV3IFRhZ01hcmtlclswXSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAocHJlZml4LmVxdWFscyhwcmVmaXhlc1tpXS5nZXRUYWdOYW1lKCkpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNUYWdsaWJEaXJlY3RpdmUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgianNwOmRpcmVjdGl2ZS50YWdsaWIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUGFnZURpcmVjdGl2ZShTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZGlyZWN0aXZlLnBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVnaW9uTmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0KLQkJU3RyaW5nIG5hbWVTdHIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQluYW1lU3RyID0gZlRleHRUb1BhcnNlLnN1YnN0cmluZyhzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChyKSwgc2RSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChyKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWVTdHIudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgY29udGVudHMgb2YgYSBmaWxlIGFzIGEgU3RyaW5nCi0JICogCi0JICogQHBhcmFtIGZpbGVQYXRoIC0gdGhlIHBhdGggdG8gdGhlIGZpbGUKLQkgKiBAcmV0dXJuIHRoZSBjb250ZW50cywgbnVsbCBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRzKFN0cmluZyBmaWxlUGF0aCkgewotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoZmlsZVBhdGgpOwotCQlyZXR1cm4gRmlsZUNvbnRlbnRDYWNoZS5nZXRJbnN0YW5jZSgpLmdldENvbnRlbnRzKHBhdGgubWFrZUFic29sdXRlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQWRkRXhwcmVzcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEFkZEV4cHJlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjNmE2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQWRkRXhwcmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEFkZEV4cHJlc3MuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUQWRkRXhwcmVzcyBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUQWRkRXhwcmVzcyhpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQWRkRXhwcmVzcyhKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEFkZEV4cHJlc3Npb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RBZGRFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYjZlYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEFkZEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RBZGRFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVEFkZEV4cHJlc3Npb24gZXh0ZW5kcyBBU1RPcGVyYXRvckV4cHJlc3Npb24gewotICBwdWJsaWMgQVNUQWRkRXhwcmVzc2lvbihpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQWRkRXhwcmVzc2lvbihKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEFuZEV4cHJlc3Npb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RBbmRFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZmU0MDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEFuZEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RBbmRFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVEFuZEV4cHJlc3Npb24gZXh0ZW5kcyBBU1RPcGVyYXRvckV4cHJlc3Npb24gewotICBwdWJsaWMgQVNUQW5kRXhwcmVzc2lvbihpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQW5kRXhwcmVzc2lvbihKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVENob2ljZUV4cHJlc3Npb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RDaG9pY2VFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3OTA3OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVENob2ljZUV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RDaG9pY2VFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVENob2ljZUV4cHJlc3Npb24gZXh0ZW5kcyBTaW1wbGVOb2RlIHsKLSAgcHVibGljIEFTVENob2ljZUV4cHJlc3Npb24oaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVENob2ljZUV4cHJlc3Npb24oSlNQRUxQYXJzZXIgcCwgaW50IGlkKSB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RFcXVhbGl0eUV4cHJlc3Npb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RFcXVhbGl0eUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEwNjExMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNURXF1YWxpdHlFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURXF1YWxpdHlFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVEVxdWFsaXR5RXhwcmVzc2lvbiBleHRlbmRzIEFTVE9wZXJhdG9yRXhwcmVzc2lvbiB7Ci0gIHB1YmxpYyBBU1RFcXVhbGl0eUV4cHJlc3Npb24oaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEVxdWFsaXR5RXhwcmVzc2lvbihKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEV4cHJlc3Npb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOTNmMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVEV4cHJlc3Npb24gZXh0ZW5kcyBTaW1wbGVOb2RlIHsKLSAgcHVibGljIEFTVEV4cHJlc3Npb24oaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEV4cHJlc3Npb24oSlNQRUxQYXJzZXIgcCwgaW50IGlkKSB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RGdW5jdGlvbkludm9jYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RGdW5jdGlvbkludm9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBjYWQ5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNURnVuY3Rpb25JbnZvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURnVuY3Rpb25JbnZvY2F0aW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVEZ1bmN0aW9uSW52b2NhdGlvbiBleHRlbmRzIFNpbXBsZU5vZGUgewotICBTdHJpbmcgZnVsbEZ1bmN0aW9uTmFtZTsgCi0gIAotICBwdWJsaWMgQVNURnVuY3Rpb25JbnZvY2F0aW9uKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RGdW5jdGlvbkludm9jYXRpb24oSlNQRUxQYXJzZXIgcCwgaW50IGlkKSB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLQotcHVibGljIFN0cmluZyBnZXRGdWxsRnVuY3Rpb25OYW1lKCkgewotCXJldHVybiBmdWxsRnVuY3Rpb25OYW1lOwotfQotCi1wdWJsaWMgdm9pZCBzZXRGdWxsRnVuY3Rpb25OYW1lKFN0cmluZyBmdWxsRnVuY3Rpb25OYW1lKSB7Ci0JdGhpcy5mdWxsRnVuY3Rpb25OYW1lID0gZnVsbEZ1bmN0aW9uTmFtZTsKLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RHVE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RHVE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwMDA1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUR1ROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUR1ROb2RlLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVEdUTm9kZSBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUR1ROb2RlKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RHVE5vZGUoSlNQRUxQYXJzZXIgcCwgaW50IGlkKSB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RJbXBsaWNpdE9iamVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEltcGxpY2l0T2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNDlhZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEltcGxpY2l0T2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUSW1wbGljaXRPYmplY3QuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUSW1wbGljaXRPYmplY3QgZXh0ZW5kcyBTaW1wbGVOb2RlIHsKLSAgcHVibGljIEFTVEltcGxpY2l0T2JqZWN0KGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RJbXBsaWNpdE9iamVjdChKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVExpdGVyYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RMaXRlcmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMzM0ZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVExpdGVyYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RMaXRlcmFsLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVExpdGVyYWwgZXh0ZW5kcyBTaW1wbGVOb2RlIHsKLSAgcHVibGljIEFTVExpdGVyYWwoaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVExpdGVyYWwoSlNQRUxQYXJzZXIgcCwgaW50IGlkKSB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RNdWx0aXBseUV4cHJlc3Npb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RNdWx0aXBseUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q4ZjYwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUTXVsdGlwbHlFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUTXVsdGlwbHlFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVE11bHRpcGx5RXhwcmVzc2lvbiBleHRlbmRzIEFTVE9wZXJhdG9yRXhwcmVzc2lvbiB7Ci0gIHB1YmxpYyBBU1RNdWx0aXBseUV4cHJlc3Npb24oaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVE11bHRpcGx5RXhwcmVzc2lvbihKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVE9wZXJhdG9yRXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVE9wZXJhdG9yRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGE2Yjc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RPcGVyYXRvckV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBBU1RPcGVyYXRvckV4cHJlc3Npb24gZXh0ZW5kcyBTaW1wbGVOb2RlIHsKLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IG9wZXJhdG9yVG9rZW5zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIEFTVE9wZXJhdG9yRXhwcmVzc2lvbihpbnQgaSkgewotCQlzdXBlcihpKTsKLQl9Ci0JCi0JcHVibGljIEFTVE9wZXJhdG9yRXhwcmVzc2lvbihKU1BFTFBhcnNlciBwLCBpbnQgaSkgewotCQl0aGlzKGkpOwotCQlwYXJzZXIgPSBwOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE9wZXJhdG9yVG9rZW4oVG9rZW4gb3BUb2tlbikgewotCQlvcGVyYXRvclRva2Vucy5hZGQob3BUb2tlbik7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldE9wZXJhdG9yVG9rZW5zKCkgewotCQlyZXR1cm4gb3BlcmF0b3JUb2tlbnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVE9yRXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVE9yRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2JiNzZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RPckV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RPckV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUT3JFeHByZXNzaW9uIGV4dGVuZHMgQVNUT3BlcmF0b3JFeHByZXNzaW9uIHsKLSAgcHVibGljIEFTVE9yRXhwcmVzc2lvbihpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUT3JFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUUmVsYXRpb25hbEV4cHJlc3Npb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RSZWxhdGlvbmFsRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDIzODQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RSZWxhdGlvbmFsRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uIGV4dGVuZHMgQVNUT3BlcmF0b3JFeHByZXNzaW9uIHsKLSAgcHVibGljIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbihKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFN0YXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUU3RhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZlMWU1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUU3RhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBBU1RTdGFydCBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUU3RhcnQoaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFN0YXJ0KEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUVW5hcnlFeHByZXNzaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUVW5hcnlFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ODcwYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFVuYXJ5RXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFVuYXJ5RXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBBU1RVbmFyeUV4cHJlc3Npb24gZXh0ZW5kcyBTaW1wbGVOb2RlIHsKLSAgcHVibGljIEFTVFVuYXJ5RXhwcmVzc2lvbihpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVW5hcnlFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUVmFsdWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDZhMzZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFZhbHVlLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVFZhbHVlIGV4dGVuZHMgU2ltcGxlTm9kZSB7Ci0gIHB1YmxpYyBBU1RWYWx1ZShpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVmFsdWUoSlNQRUxQYXJzZXIgcCwgaW50IGlkKSB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RWYWx1ZVByZWZpeC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFZhbHVlUHJlZml4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMmJmMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFZhbHVlUHJlZml4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVmFsdWVQcmVmaXguamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUVmFsdWVQcmVmaXggZXh0ZW5kcyBTaW1wbGVOb2RlIHsKLSAgcHVibGljIEFTVFZhbHVlUHJlZml4KGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RWYWx1ZVByZWZpeChKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFZhbHVlU3VmZml4LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUVmFsdWVTdWZmaXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMxNzI2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUVmFsdWVTdWZmaXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RWYWx1ZVN1ZmZpeC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBBU1RWYWx1ZVN1ZmZpeCBleHRlbmRzIFNpbXBsZU5vZGUgewotCQotICBwcm90ZWN0ZWQgVG9rZW4gcHJvcGVydHlOYW1lVG9rZW47Ci0gIAotICBwdWJsaWMgQVNUVmFsdWVTdWZmaXgoaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFZhbHVlU3VmZml4KEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci0KLXB1YmxpYyBUb2tlbiBnZXRQcm9wZXJ0eU5hbWVUb2tlbigpIHsKLQlyZXR1cm4gcHJvcGVydHlOYW1lVG9rZW47Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZVRva2VuKFRva2VuIHByb3BlcnR5TmFtZVRva2VuKSB7Ci0JdGhpcy5wcm9wZXJ0eU5hbWVUb2tlbiA9IHByb3BlcnR5TmFtZVRva2VuOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0VMR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvRUxHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY0MGE5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvRUxHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci0KLS8qKgotICogVGhlIGNvZGUgY2hlY2tlciBmb3IgdGhlIGpzZi9qc3AgRUwuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFTEdlbmVyYXRvciB7Ci0JLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbG9jYXRvciBBIHZhbGlkIEVMTG9jYXRvciBpbnN0YW5jZSwgbWF5IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBFTEdlbmVyYXRvcigpIHsKLSAgICB9IC8vIGNvbnN0cnVjdG9yCi0JCi0KLSAgICAvKioKLSAgICAgKiBDaGVjayB0aGUgbmV0dWllbCBBU1QgYW5kIHNldCBkaWFnbm9zdGljcyBhcyBuZWNlc3NhcnkuCi0gICAgICogQHBhcmFtIHRyYW5zbGF0b3IgVE9ETwotICAgICAqIEBwYXJhbSBqc3BSZWZlcmVuY2VSZWdpb24gVE9ETwotICAgICAqIEBwYXJhbSBjb250ZW50U3RhcnQgCi0gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGUoQVNURXhwcmVzc2lvbiByb290LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlLCBTdHJpbmdCdWZmZXIgcmVzdWx0LCBNYXAgY29kZU1hcCwgSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgSVRleHRSZWdpb25Db2xsZWN0aW9uIGpzcFJlZmVyZW5jZVJlZ2lvbiwgaW50IGNvbnRlbnRTdGFydCwgaW50IGNvbnRlbnRMZW5ndGgpIHsKLQkJRUxHZW5lcmF0b3JWaXNpdG9yIHZpc2l0b3IgPSBuZXcgRUxHZW5lcmF0b3JWaXNpdG9yKHJlc3VsdCwgY3VycmVudE5vZGUsIGNvZGVNYXAsIGRvY3VtZW50LCBqc3BSZWZlcmVuY2VSZWdpb24sIGNvbnRlbnRTdGFydCk7Ci0JCXJvb3Quamp0QWNjZXB0KHZpc2l0b3IsIG51bGwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9FTEdlbmVyYXRvclZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9FTEdlbmVyYXRvclZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjYjNhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvRUxHZW5lcmF0b3JWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIEJ1ZyAxNTQ0NzQgRUw6ICdhbmQnLCAnb3InLCAuLi4gb3BlcmF0b3IKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NDc0Ci0gKiAgICAgQmVybmhhcmQgSHVlbWVyIDxiZXJuaGFyZC5odWVtZXJAZ21haWwuY29tPgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuVGFnbGliQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5DTURvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UTERDTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UYWdsaWJUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMREZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBFTEdlbmVyYXRvclZpc2l0b3IgaW1wbGVtZW50cyBKU1BFTFBhcnNlclZpc2l0b3IgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRMID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBmRXhwcmVzc2lvbkhlYWRlcjEgPSAicHVibGljIFN0cmluZyBfZWxFeHByZXNzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBmRXhwcmVzc2lvbkhlYWRlcjIgPSAiKCkiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkiXHRcdHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb24geyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJqYXZheC5zZXJ2bGV0LmpzcC5QYWdlQ29udGV4dCBwYWdlQ29udGV4dCA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmEudXRpbC5NYXAgcGFyYW0gPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJqYXZhLnV0aWwuTWFwIHBhcmFtVmFsdWVzID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkiamF2YS51dGlsLk1hcCBoZWFkZXIgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJCAKLQkiamF2YS51dGlsLk1hcCBoZWFkZXJWYWx1ZXMgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJqYXZhLnV0aWwuTWFwIGNvb2tpZSA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkIAotCSJqYXZhLnV0aWwuTWFwIGluaXRQYXJhbSA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmEudXRpbC5NYXAgcGFnZVNjb3BlID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkiamF2YS51dGlsLk1hcCByZXF1ZXN0U2NvcGUgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJqYXZhLnV0aWwuTWFwIHNlc3Npb25TY29wZSA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmEudXRpbC5NYXAgYXBwbGljYXRpb25TY29wZSA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JInJldHVybiBcIlwiKyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZkpzcEltcGxpY2l0T2JqZWN0c1tdID0geyAicGFnZUNvbnRleHQiIH07IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZkpzcEltcGxpY2l0TWFwc1tdID0geyAJInBhcmFtIiwgInBhcmFtVmFsdWVzIiwgImhlYWRlciIsICJoZWFkZXJWYWx1ZXMiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJCQkJCQkJCQkJCSJjb29raWUiLCAiaW5pdFBhcmFtIiwgInBhZ2VTY29wZSIsICJyZXF1ZXN0U2NvcGUiLCAic2Vzc2lvblNjb3BlIiwgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJCQkJCQkJCQkJCQkiYXBwbGljYXRpb25TY29wZSIgfTsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXAgZkpTUEltcGxpY2l0T2JqZWN0TWFwID0gbmV3IEhhc2hNYXAoZkpzcEltcGxpY2l0T2JqZWN0cy5sZW5ndGgpOwotCXN0YXRpYyB7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBmSnNwSW1wbGljaXRPYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmSlNQSW1wbGljaXRPYmplY3RNYXAucHV0KGZKc3BJbXBsaWNpdE9iamVjdHNbaV0sIG5ldyBCb29sZWFuKHRydWUpKTsKLQkJfQotCQkKLQkJZm9yKGludCBpID0gMDsgaSA8IGZKc3BJbXBsaWNpdE1hcHMubGVuZ3RoOyBpKyspIHsKLQkJCWZKU1BJbXBsaWNpdE9iamVjdE1hcC5wdXQoZkpzcEltcGxpY2l0TWFwc1tpXSwgbmV3IEJvb2xlYW4oZmFsc2UpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZkZvb3RlciA9ICIgOyIgKyBFTkRMICsgIn0iICsgRU5ETDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBmUmVzdWx0OwotCXByaXZhdGUgTWFwIGZDb2RlTWFwOwotCXByaXZhdGUgaW50IGZPZmZzZXRJblVzZXJDb2RlOwotCXByaXZhdGUgc3RhdGljIGludCBtZXRob2RDb3VudGVyID0gMDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIGludCBmQ29udGVudFN0YXJ0OwotCXByaXZhdGUgc3RhdGljIE1hcCBmT3BlcmF0b3JNYXA7Ci0JCi0JLy8gdGhpcyBmbGFnIGxldHMgdXMga25vdyBpZiB3ZSB3ZXJlIHVuYWJsZSB0byBnZW5lcmF0ZSBmb3Igc29tZSByZWFzb24uICBPbmUgcG9zc2libGUgcmVhc29uIGlzIHRoYXQgdGhlIGV4cHJlc3Npb24gCi0JLy8gY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYSB2YXJpYWJsZSBmb3Igd2hpY2ggaW5mb3JtYXRpb24gaXMgb25seSBhdmFpbGFibGUgYXQgcnVudGltZS4KLQlwcml2YXRlIGJvb2xlYW4gZkNhbkdlbmVyYXRlID0gdHJ1ZTsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmQ3VycmVudE5vZGU7Ci0KLQkvKioKLQkgKiBUcmFubHNhdGlvbiBvZiBYTUwtc3R5bGUgb3BlcmF0b3JzIHRvIGphdmEKLQkgKi8KLQlzdGF0aWMgewotCQlmT3BlcmF0b3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmT3BlcmF0b3JNYXAucHV0KCJndCIsICI+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmT3BlcmF0b3JNYXAucHV0KCJsdCIsICI8Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmT3BlcmF0b3JNYXAucHV0KCJnZSIsICI+PSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZk9wZXJhdG9yTWFwLnB1dCgibGUiLCAiPD0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZPcGVyYXRvck1hcC5wdXQoIm1vZCIsICIlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmT3BlcmF0b3JNYXAucHV0KCJlcSIsICI9PSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZk9wZXJhdG9yTWFwLnB1dCgiYW5kIiwgIiYmIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmT3BlcmF0b3JNYXAucHV0KCJvciIsICJ8fCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZk9wZXJhdG9yTWFwLnB1dCgibm90IiwgIiEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvciBzcXVpcnJlbHMgYXdheSBhIGZldyB0aGluZ3Mgd2UnbGwgbmVlZCBsYXRlcgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHQKLQkgKiBAcGFyYW0gY29kZU1hcAotCSAqIEBwYXJhbSB0cmFuc2xhdG9yCi0JICogQHBhcmFtIGpzcFJlZmVyZW5jZVJlZ2lvbgotCSAqIEBwYXJhbSBjb250ZW50U3RhcnQKLQkgKi8KLQlwdWJsaWMgRUxHZW5lcmF0b3JWaXNpdG9yKFN0cmluZ0J1ZmZlciByZXN1bHQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUsIE1hcCBjb2RlTWFwLCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uLCBpbnQgY29udGVudFN0YXJ0KQotCXsKLQkJZlJlc3VsdCA9IHJlc3VsdDsKLQkJZkNvZGVNYXAgPSBjb2RlTWFwOwotCQlmT2Zmc2V0SW5Vc2VyQ29kZSA9IHJlc3VsdC5sZW5ndGgoKTsKLQkJZkNvbnRlbnRTdGFydCA9IGNvbnRlbnRTdGFydDsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWZDdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCBhIHRva2VuIHRvIHRoZSBvdXRwdXQgc3RyZWFtLiAgQXV0b21hdGljYWxseSBjYWxjdWxhdGluZyBtYXBwaW5nLgotCSAqIAotCSAqIEBwYXJhbSB0b2tlbgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmQoVG9rZW4gdG9rZW4pCi0JewotCQlhcHBlbmQodG9rZW4uaW1hZ2UsIHRva2VuLmJlZ2luQ29sdW1uIC0gMSwgdG9rZW4uZW5kQ29sdW1uKTsKLQl9Ci0JCi0JLyoqCi0JICogQXBwZW5kIGEgdHJhbnNsYXRpb24gZm9yIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IHRva2VuLgotCSAqIAotCSAqIEBwYXJhbSB0cmFuc2xhdGVkCi0JICogQHBhcmFtIHRva2VuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZChTdHJpbmcgdHJhbnNsYXRlZCwgVG9rZW4gdG9rZW4pCi0JewotCQlhcHBlbmQodHJhbnNsYXRlZCwgdG9rZW4uYmVnaW5Db2x1bW4gLSAxLCB0b2tlbi5lbmRDb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCBhIHN0cmluZyBleHBsaWNpdGx5IGdpdmluZyB0aGUgaW5wdXQgbWFwcGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqIEBwYXJhbSBqc3BQb3NpdGlvblN0YXJ0Ci0JICogQHBhcmFtIGpzcFBvc2l0aW9uRW5kCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZChTdHJpbmcgbmV3VGV4dCwgaW50IGpzcFBvc2l0aW9uU3RhcnQsIGludCBqc3BQb3NpdGlvbkVuZCkKLQl7Ci0JCWZSZXN1bHQuYXBwZW5kKG5ld1RleHQpOwotCQlQb3NpdGlvbiBqYXZhUmFuZ2UgPSBuZXcgUG9zaXRpb24oZk9mZnNldEluVXNlckNvZGUsIG5ld1RleHQubGVuZ3RoKCkpOwotCQlQb3NpdGlvbiBqc3BSYW5nZSA9IG5ldyBQb3NpdGlvbihmQ29udGVudFN0YXJ0ICsganNwUG9zaXRpb25TdGFydCwganNwUG9zaXRpb25FbmQgLSBqc3BQb3NpdGlvblN0YXJ0KTsKLQotCQlmQ29kZU1hcC5wdXQoamF2YVJhbmdlLCBqc3BSYW5nZSk7Ci0JCWZPZmZzZXRJblVzZXJDb2RlICs9IG5ld1RleHQubGVuZ3RoKCk7Ci0JfQotCQotCS8qKgotCSAqIEFwcGVuZCB0ZXh0IHRoYXQgd2lsbCBiZSB1bm1hcHBlZCBhbmQgdGhlcmVmb3JlIHdpbGwgbm90IGJlIGF2YWlsYWJsZSBmb3IgY29tcGxldGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmQoU3RyaW5nIG5ld1RleHQpCi0JewotCQlmUmVzdWx0LmFwcGVuZChuZXdUZXh0KTsKLQkJZk9mZnNldEluVXNlckNvZGUgKz0gbmV3VGV4dC5sZW5ndGgoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2VuZXJhdGUgYSBmdW5jdGlvbiBpbnZvY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBmdWxsRnVuY3Rpb25OYW1lCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2VuRnVuY3Rpb24oU3RyaW5nIGZ1bGxGdW5jdGlvbk5hbWUpIHsKLQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgZG9jTWdyID0gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcihmRG9jdW1lbnQpOwotCQlpbnQgY29sb25JbmRleCA9IGZ1bGxGdW5jdGlvbk5hbWUuaW5kZXhPZignOicpOwotCQlTdHJpbmcgcHJlZml4ID0gZnVsbEZ1bmN0aW9uTmFtZS5zdWJzdHJpbmcoMCwgY29sb25JbmRleCk7Ci0JCVN0cmluZyBmdW5jdGlvbk5hbWUgPSBmdWxsRnVuY3Rpb25OYW1lLnN1YnN0cmluZyhjb2xvbkluZGV4ICsgMSk7Ci0JCWlmIChkb2NNZ3IgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJSXRlcmF0b3IgdGFnbGlicyA9IGRvY01nci5nZXRDTURvY3VtZW50VHJhY2tlcnMoZkN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlICh0YWdsaWJzLmhhc05leHQoKSkgewotCQkJVGFnbGliVHJhY2tlciB0cmFja2VyID0gKFRhZ2xpYlRyYWNrZXIpdGFnbGlicy5uZXh0KCk7Ci0JCQlpZih0cmFja2VyLmdldFByZWZpeCgpLmVxdWFscyhwcmVmaXgpKSB7Ci0JCQkJQ01Eb2N1bWVudEltcGwgZG9jID0gKENNRG9jdW1lbnRJbXBsKXRyYWNrZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCQkKLQkJCQlMaXN0IGZ1bmN0aW9ucyA9IGRvYy5nZXRGdW5jdGlvbnMoKTsKLQkJCQlmb3IoSXRlcmF0b3IgaXQgPSBmdW5jdGlvbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQkJVExERnVuY3Rpb24gZnVuY3Rpb24gPSAoVExERnVuY3Rpb24paXQubmV4dCgpOwotCQkJCQlpZihmdW5jdGlvbi5nZXROYW1lKCkuZXF1YWxzKGZ1bmN0aW9uTmFtZSkpIHsKLQkJCQkJCXJldHVybiBmdW5jdGlvbi5nZXRDbGFzc05hbWUoKSArICIuIiArIGZ1bmN0aW9uLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBhIHNpbXBsZSBub2RlIC0tIGZhbGxiYWNrCi0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChTaW1wbGVOb2RlIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybihub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIGRhdGEpKTsKLQl9Ci0KLQlzdGF0aWMgc3luY2hyb25pemVkIGludCBnZXRNZXRob2RDb3VudGVyKCkgewotCQlyZXR1cm4gbWV0aG9kQ291bnRlcisrOwotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGUgdG9wLWxldmVsIGV4cHJlc3Npb24KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJaW50IHN0YXJ0ID0gbm9kZS5nZXRGaXJzdFRva2VuKCkuYmVnaW5Db2x1bW4gLSAxOwotCQlpbnQgZW5kID0gbm9kZS5sYXN0VG9rZW4uZW5kQ29sdW1uIC0gMTsKLQkJYXBwZW5kKGZFeHByZXNzaW9uSGVhZGVyMSwgc3RhcnQsIHN0YXJ0KTsKLQkJYXBwZW5kKEludGVnZXIudG9TdHJpbmcoZ2V0TWV0aG9kQ291bnRlcigpKSwgc3RhcnQsIHN0YXJ0KTsKLQkJYXBwZW5kKGZFeHByZXNzaW9uSGVhZGVyMiwgc3RhcnQsIHN0YXJ0KTsKLQkJCi0JCU9iamVjdCByZXR2YWwgPSBub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIGRhdGEpOwotCi0JCWFwcGVuZChmRm9vdGVyLCBlbmQsIGVuZCk7Ci0JCQotCQkvLyBzb21ldGhpbmcgaXMgcHJldmVudGluZyBnb29kIGNvZGUgZ2VuZXJhdGlvbiBzbyBlbXB0eSBvdXQgdGhlIHJlc3VsdCBhbmQgdGhlIG1hcC4KLQkJaWYoIWZDYW5HZW5lcmF0ZSkgewotCQkJZlJlc3VsdC5kZWxldGUoMCwgZlJlc3VsdC5sZW5ndGgoKSk7Ci0JCQlmQ29kZU1hcC5jbGVhcigpOwkJCQotCQl9Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJpY2FsbHkgZ2VuZXJhdGUgYW4gb3BlcmF0b3Igbm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBkYXRhCi0JICovCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlT3BlcmF0b3JOb2RlKEFTVE9wZXJhdG9yRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlmb3IoaW50IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJbm9kZS5jaGlsZHJlbltpXS5qanRBY2NlcHQodGhpcywgZGF0YSk7Ci0JCQlpZiggbm9kZS5jaGlsZHJlbi5sZW5ndGggLSBpID4gMSkgewotCQkJCWFwcGVuZE9wZXJhdG9yKChUb2tlbilub2RlLmdldE9wZXJhdG9yVG9rZW5zKCkuZ2V0KGkpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBcHBlbmQgYW4gb3BlcmF0b3IgdG8gdGhlIG91dHB1dCBzdHJlYW0gYWZ0ZXIgdHJhbnNsYXRpb24gKGlmIGFueSkKLQkgKiAKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgYXBwZW5kT3BlcmF0b3IoVG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHRva2VuSW1hZ2UgPSB0b2tlbi5pbWFnZS50cmltKCk7Ci0JCVN0cmluZyB0cmFuc2xhdGVkID0gKFN0cmluZylmT3BlcmF0b3JNYXAuZ2V0KHRva2VuSW1hZ2UpOwotCQlpZihudWxsICE9IHRyYW5zbGF0ZWQpIHsKLQkJCWFwcGVuZCh0cmFuc2xhdGVkLCB0b2tlbik7Ci0JCX0gZWxzZSB7Ci0JCQlhcHBlbmQodG9rZW4pOwotCQl9Ci0JCXJldHVybih0cmFuc2xhdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgb3IgRXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUT3JFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCWdlbmVyYXRlT3BlcmF0b3JOb2RlKG5vZGUsIGRhdGEpOwotCQlyZXR1cm4obnVsbCk7Ci0JfQotCi0KLQkvKioKLQkgKiBIYW5kbGUgYW5kIGV4cHJlc3Npb24gCi0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RBbmRFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCWdlbmVyYXRlT3BlcmF0b3JOb2RlKG5vZGUsIGRhdGEpOwotCQlyZXR1cm4obnVsbCk7Ci0JfQotCi0KLQkvKioKLQkgKiBIYW5kbGUgZXF1YWxpdHkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEVxdWFsaXR5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlnZW5lcmF0ZU9wZXJhdG9yTm9kZShub2RlLCBkYXRhKTsKLQkJcmV0dXJuKG51bGwpOwotCX0KLQotCi0JLyoqCi0JICogSGFuZGxlIFJlbGF0aW9uYWwKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCWdlbmVyYXRlT3BlcmF0b3JOb2RlKG5vZGUsIGRhdGEpOwotCQlyZXR1cm4obnVsbCk7Ci0JfQotCi0KLQkvKioKLQkgKiBIYW5kbGUgYWRkaXRpb24KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFkZEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJZ2VuZXJhdGVPcGVyYXRvck5vZGUobm9kZSwgZGF0YSk7Ci0JCXJldHVybihudWxsKTsKLQl9Ci0KLQotCS8qKgotCSAqIEhhbmRsZSBtdWx0aXBseQotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTXVsdGlwbHlFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCWdlbmVyYXRlT3BlcmF0b3JOb2RlKG5vZGUsIGRhdGEpOwotCQlyZXR1cm4obnVsbCk7Ci0JfQotCi0KLQkvKiogCi0JICogQ2hvaWNlIEV4cHJlc3Npb24gKHRlcm5hcnkgb3BlcmF0b3IpCi0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RDaG9pY2VFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCW5vZGUuY2hpbGRyZW5bMF0uamp0QWNjZXB0KHRoaXMsIGRhdGEpOwotCQlhcHBlbmQoIj8iKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlLmNoaWxkcmVuWzFdLmpqdEFjY2VwdCh0aGlzLCBkYXRhKTsKLQkJYXBwZW5kKCI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZS5jaGlsZHJlblsyXS5qanRBY2NlcHQodGhpcyxkYXRhKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBIYW5kbGUgdW5hcnkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFVuYXJ5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlpZihKU1BFTFBhcnNlckNvbnN0YW50cy5FTVBUWSA9PSBub2RlLmZpcnN0VG9rZW4ua2luZCkgewotCQkJYXBwZW5kKCIoKG51bGwgPT0gIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgZGF0YSk7Ci0JCQlhcHBlbmQoIikgfHwgKCIpOyAvLyROT04tTkxTLTEkCi0JCQlub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIGRhdGEpOwotCQkJYXBwZW5kKCIpLmlzRW1wdHkoKSkiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYoSlNQRUxQYXJzZXJDb25zdGFudHMuTk9UMSA9PSBub2RlLmZpcnN0VG9rZW4ua2luZCB8fCBKU1BFTFBhcnNlckNvbnN0YW50cy5OT1QyID09IG5vZGUuZmlyc3RUb2tlbi5raW5kKSB7Ci0JCQlhcHBlbmQoIighIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgZGF0YSk7Ci0JCQlhcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYoSlNQRUxQYXJzZXJDb25zdGFudHMuTUlOVVMgPT0gbm9kZS5maXJzdFRva2VuLmtpbmQpIHsKLQkJCWFwcGVuZCgiKC0iKTsgLy8kTk9OLU5MUy0xJAotCQkJbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBkYXRhKTsKLQkJCWFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIGRhdGEpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoqCi0JICogVmFsdWUgbm9kZQotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFsdWUgbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJaWYobm9kZS5qanRHZXROdW1DaGlsZHJlbigpID49IDIpIHsKLQkJCWlmKG5vZGUuamp0R2V0Q2hpbGQoMCkgaW5zdGFuY2VvZiBBU1RWYWx1ZVByZWZpeCAmJiBub2RlLmpqdEdldENoaWxkKDEpIGluc3RhbmNlb2YgQVNUVmFsdWVTdWZmaXgpIHsKLQkJCQlBU1RWYWx1ZVByZWZpeCBwcmVmaXggPSAoQVNUVmFsdWVQcmVmaXgpIG5vZGUuamp0R2V0Q2hpbGQoMCk7Ci0JCQkJQVNUVmFsdWVTdWZmaXggc3VmZml4ID0gKEFTVFZhbHVlU3VmZml4KSBub2RlLmpqdEdldENoaWxkKDEpOwotCQkJCWlmKHByZWZpeC5maXJzdFRva2VuLmltYWdlLmVxdWFscygicGFnZUNvbnRleHQiKSAmJiBzdWZmaXguZ2V0UHJvcGVydHlOYW1lVG9rZW4oKS5pbWFnZS5lcXVhbHMoInJlcXVlc3QiKSkgewotCQkJCQlhcHBlbmQoIigoSFRUUFNlcnZsZXRSZXF1ZXN0KSIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBkYXRhKTsJCi0JfQotCi0KLQkvKioKLQkgKiBWYWx1ZSBQcmVmaXgKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhbHVlUHJlZml4IG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCS8vIHRoaXMgaXMgYSByYXcgaWRlbnRpZmllci4gIE1heSBzdXJlIGl0J3MgYW4gaW1wbGljaXQgb2JqZWN0LgotCQkvLyBUaGlzIGlzIHRoZSBwcmltYXJ5IHBsYWUgd2hlcmUgbW9kaWZpY2F0aW9uIGlzIG5lZWRlZCB0byAKLQkJLy8gc3VwcG9ydCBKU0YgYmFja2luZyBiZWFucy4KLQkJaWYobnVsbCA9PSBub2RlLmNoaWxkcmVuKSB7Ci0JCQlpZihpc0NvbXBsZXRpbmdPYmplY3Qobm9kZS5maXJzdFRva2VuLmltYWdlKSkgewotCQkJCWFwcGVuZChub2RlLmZpcnN0VG9rZW4pOwotCQkJfSBlbHNlIHsKLQkJCQlmQ2FuR2VuZXJhdGUgPSBmYWxzZTsKLQkJCX0KLQkJCXJldHVybihudWxsKTsKLQkJfQotCQlyZXR1cm4gbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBkYXRhKTsKLQl9Ci0KLQotCS8qKgotCSAqIEZ1bmN0aW9uIGZvciB0ZXN0aW5nIGltcGxpY2l0IG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGltYWdlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NvbXBsZXRpbmdPYmplY3QoU3RyaW5nIGltYWdlKSB7Ci0JCUJvb2xlYW4gdmFsdWUgPSAoQm9vbGVhbilmSlNQSW1wbGljaXRPYmplY3RNYXAuZ2V0KGltYWdlKTsKLQkJcmV0dXJuIG51bGwgPT0gdmFsdWUgPyBmYWxzZSA6IHZhbHVlLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIFZhbHVlIHN1ZmZpeAotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFsdWVTdWZmaXggbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJaWYoSlNQRUxQYXJzZXJDb25zdGFudHMuTEJSQUNLRVQgPT0gbm9kZS5maXJzdFRva2VuLmtpbmQpIHsKLQkJCWZDYW5HZW5lcmF0ZSA9IGZhbHNlOwotCQl9IGVsc2UgaWYobnVsbCAhPSBub2RlLmdldFByb3BlcnR5TmFtZVRva2VuKCkpIHsKLQkJCVRva2VuIHN1ZmZpeCA9IG5vZGUuZ2V0UHJvcGVydHlOYW1lVG9rZW4oKTsKLQkJCVN0cmluZyB1Y2FzZU5hbWUgPSBzdWZmaXguaW1hZ2Uuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBzdWZmaXguaW1hZ2Uuc3Vic3RyaW5nKDEsIHN1ZmZpeC5pbWFnZS5sZW5ndGgoKSk7IAotCi0JCQkvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLiAgTm90ZSB0aGF0IHRoZSB0eXBlIHN5c3RlbSwgbm8gbWF0dGVyIGhvdyBtdWNoIHR5cGUgaW5mb3JtYXRpb24KLQkJCS8vIHdlIHdvdWxkIGhhdmUgd291bGRuJ3QgZ2l2ZSB1cyB0aGUgY29ycmVjdCByZXN1bHQuICBXZSdyZSBsb29raW5nIGZvciAicGFnZUNvbnRleHQucmVxdWVzdCIgCi0JCQkvLyBoZXJlIGFuZCB3aWxsIGFkZCBhIGRvd25jYXN0IHRvIChIVFRQU2VydmxldFJlcXVlc3QpCi0JCQkKLQkJCWFwcGVuZChub2RlLmZpcnN0VG9rZW4pOwotCQkJYXBwZW5kKCJnZXQiICsgdWNhc2VOYW1lICsgIigpIiwgc3VmZml4KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkKLQkJCVNpbXBsZU5vZGUgcGFyZW50ID0gKFNpbXBsZU5vZGUpIG5vZGUuamp0R2V0UGFyZW50KCk7Ci0JCQlpZihzdWZmaXguaW1hZ2UuZXF1YWxzKCJyZXF1ZXN0IikgJiYgcGFyZW50IGluc3RhbmNlb2YgQVNUVmFsdWUgJiYgLy8kTk9OLU5MUy0xJAotCQkJCQlwYXJlbnQuamp0R2V0UGFyZW50KCkgaW5zdGFuY2VvZiBBU1RVbmFyeUV4cHJlc3Npb24gJiYgcGFyZW50LmZpcnN0VG9rZW4uaW1hZ2UuZXF1YWxzKCJwYWdlQ29udGV4dCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlhcHBlbmQoIikiKTsKLQkJCX0gCi0KLQotCQl9IGVsc2UgewotCQkJYXBwZW5kKG5vZGUuZmlyc3RUb2tlbik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBGdW5jdGlvbiBpbnZvY2F0aW9uCi0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RGdW5jdGlvbkludm9jYXRpb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJU3RyaW5nIGZ1bmN0aW9uVHJhbnNsYXRpb24gPSBnZW5GdW5jdGlvbihub2RlLmdldEZ1bGxGdW5jdGlvbk5hbWUoKSk7Ci0JCWlmKG51bGwgIT0gZnVuY3Rpb25UcmFuc2xhdGlvbikKLQkJewotCQkJYXBwZW5kKGZ1bmN0aW9uVHJhbnNsYXRpb24gKyAiKCIsIG5vZGUuZ2V0Rmlyc3RUb2tlbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yKGludCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlub2RlLmNoaWxkcmVuW2ldLmpqdEFjY2VwdCh0aGlzLCBkYXRhKTsKLQkJCQlpZiggbm9kZS5jaGlsZHJlbi5sZW5ndGggLSBpID4gMSl7Ci0JCQkJCWFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBMaXRlcmFsCi0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RMaXRlcmFsIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCS8vIFRPRE8gYW55IGZ1cnRoZXIgdHJhbnNsYXRpb24gbmVlZGVkPwotCQlhcHBlbmQobm9kZS5maXJzdFRva2VuKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0ZpbmRGdW5jdGlvbkludm9jYXRpb25WaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvRmluZEZ1bmN0aW9uSW52b2NhdGlvblZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1YzU2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvRmluZEZ1bmN0aW9uSW52b2NhdGlvblZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBGaW5kRnVuY3Rpb25JbnZvY2F0aW9uVmlzaXRvciBpbXBsZW1lbnRzIEpTUEVMUGFyc2VyVmlzaXRvciB7Ci0JcHJvdGVjdGVkIGludCBmQ3Vyc29yUG9zaXRpb247Ci0JCi0JcHVibGljIEZpbmRGdW5jdGlvbkludm9jYXRpb25WaXNpdG9yKGludCBjdXJzb3JQb3NpdGlvbikKLQl7Ci0JCWZDdXJzb3JQb3NpdGlvbiA9IGN1cnNvclBvc2l0aW9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuY2xvc2luZyhTaW1wbGVOb2RlIG5vZGUpIHsKLQkJcmV0dXJuKG5vZGUuZmlyc3RUb2tlbi5iZWdpbkNvbHVtbiA8IGZDdXJzb3JQb3NpdGlvbiAmJiBub2RlLmxhc3RUb2tlbi5lbmRDb2x1bW4gPj0gZkN1cnNvclBvc2l0aW9uKTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IHZpc2l0RW5jbG9zaW5nQ2hpbGQoU2ltcGxlTm9kZSBub2RlLCBPYmplY3QgZGF0YSkJewotCQlpZihudWxsID09IG5vZGUuY2hpbGRyZW4pCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihpc0VuY2xvc2luZyhub2RlKSkgCi0JCQkJcmV0dXJuIG5vZGUuY2hpbGRyZW5baV0uamp0QWNjZXB0KHRoaXMsIGRhdGEpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoU2ltcGxlTm9kZSBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RPckV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RBbmRFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXF1YWxpdHlFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUmVsYXRpb25hbEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RBZGRFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTXVsdGlwbHlFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ2hvaWNlRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFVuYXJ5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhbHVlIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFsdWVQcmVmaXggbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RWYWx1ZVN1ZmZpeCBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZ1bmN0aW9uSW52b2NhdGlvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlPYmplY3QgbmVzdGVkSW52b2NhdGlvbiA9IHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JCWlmKG51bGwgIT0gbmVzdGVkSW52b2NhdGlvbikKLQkJCXJldHVybiBuZXN0ZWRJbnZvY2F0aW9uOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVExpdGVyYWwgbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pKVEpTUEVMUGFyc2VyU3RhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KSlRKU1BFTFBhcnNlclN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNzQzNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pKVEpTUEVMUGFyc2VyU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gSkpUSlNQRUxQYXJzZXJTdGF0ZS5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLWNsYXNzIEpKVEpTUEVMUGFyc2VyU3RhdGUgewotICBwcml2YXRlIGphdmEudXRpbC5TdGFjayBub2RlczsKLSAgcHJpdmF0ZSBqYXZhLnV0aWwuU3RhY2sgbWFya3M7Ci0KLSAgcHJpdmF0ZSBpbnQgc3A7CQkvLyBudW1iZXIgb2Ygbm9kZXMgb24gc3RhY2sKLSAgcHJpdmF0ZSBpbnQgbWs7CQkvLyBjdXJyZW50IG1hcmsKLSAgcHJpdmF0ZSBib29sZWFuIG5vZGVfY3JlYXRlZDsKLQotICBKSlRKU1BFTFBhcnNlclN0YXRlKCkgewotICAgIG5vZGVzID0gbmV3IGphdmEudXRpbC5TdGFjaygpOwotICAgIG1hcmtzID0gbmV3IGphdmEudXRpbC5TdGFjaygpOwotICAgIHNwID0gMDsKLSAgICBtayA9IDA7Ci0gIH0KLQotICAvKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgbm9kZSB3YXMgYWN0dWFsbHkgY2xvc2VkIGFuZAotICAgICBwdXNoZWQuICBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpbiB0aGUgZmluYWwgdXNlciBhY3Rpb24gb2YgYQotICAgICBub2RlIHNjb3BlLiAgKi8KLSAgYm9vbGVhbiBub2RlQ3JlYXRlZCgpIHsKLSAgICByZXR1cm4gbm9kZV9jcmVhdGVkOwotICB9Ci0KLSAgLyogQ2FsbCB0aGlzIHRvIHJlaW5pdGlhbGl6ZSB0aGUgbm9kZSBzdGFjay4gIEl0IGlzIGNhbGxlZAotICAgICBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBwYXJzZXIncyBSZUluaXQoKSBtZXRob2QuICovCi0gIHZvaWQgcmVzZXQoKSB7Ci0gICAgbm9kZXMucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICBtYXJrcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgIHNwID0gMDsKLSAgICBtayA9IDA7Ci0gIH0KLQotICAvKiBSZXR1cm5zIHRoZSByb290IG5vZGUgb2YgdGhlIEFTVC4gIEl0IG9ubHkgbWFrZXMgc2Vuc2UgdG8gY2FsbAotICAgICB0aGlzIGFmdGVyIGEgc3VjY2Vzc2Z1bCBwYXJzZS4gKi8KLSAgTm9kZSByb290Tm9kZSgpIHsKLSAgICByZXR1cm4gKE5vZGUpbm9kZXMuZWxlbWVudEF0KDApOwotICB9Ci0KLSAgLyogUHVzaGVzIGEgbm9kZSBvbiB0byB0aGUgc3RhY2suICovCi0gIHZvaWQgcHVzaE5vZGUoTm9kZSBuKSB7Ci0gICAgbm9kZXMucHVzaChuKTsKLSAgICArK3NwOwotICB9Ci0KLSAgLyogUmV0dXJucyB0aGUgbm9kZSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjaywgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZQotICAgICBzdGFjay4gICovCi0gIE5vZGUgcG9wTm9kZSgpIHsKLSAgICBpZiAoLS1zcCA8IG1rKSB7Ci0gICAgICBtayA9ICgoSW50ZWdlciltYXJrcy5wb3AoKSkuaW50VmFsdWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIChOb2RlKW5vZGVzLnBvcCgpOwotICB9Ci0KLSAgLyogUmV0dXJucyB0aGUgbm9kZSBjdXJyZW50bHkgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suICovCi0gIE5vZGUgcGVla05vZGUoKSB7Ci0gICAgcmV0dXJuIChOb2RlKW5vZGVzLnBlZWsoKTsKLSAgfQotCi0gIC8qIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvbiB0aGUgc3RhY2sgaW4gdGhlIGN1cnJlbnQgbm9kZQotICAgICBzY29wZS4gKi8KLSAgaW50IG5vZGVBcml0eSgpIHsKLSAgICByZXR1cm4gc3AgLSBtazsKLSAgfQotCi0KLSAgdm9pZCBjbGVhck5vZGVTY29wZShOb2RlIG4pIHsKLSAgICB3aGlsZSAoc3AgPiBtaykgewotICAgICAgcG9wTm9kZSgpOwotICAgIH0KLSAgICBtayA9ICgoSW50ZWdlciltYXJrcy5wb3AoKSkuaW50VmFsdWUoKTsKLSAgfQotCi0KLSAgdm9pZCBvcGVuTm9kZVNjb3BlKE5vZGUgbikgewotICAgIG1hcmtzLnB1c2gobmV3IEludGVnZXIobWspKTsKLSAgICBtayA9IHNwOwotICAgIG4uamp0T3BlbigpOwotICB9Ci0KLQotICAvKiBBIGRlZmluaXRlIG5vZGUgaXMgY29uc3RydWN0ZWQgZnJvbSBhIHNwZWNpZmllZCBudW1iZXIgb2YKLSAgICAgY2hpbGRyZW4uICBUaGF0IG51bWJlciBvZiBub2RlcyBhcmUgcG9wcGVkIGZyb20gdGhlIHN0YWNrIGFuZAotICAgICBtYWRlIHRoZSBjaGlsZHJlbiBvZiB0aGUgZGVmaW5pdGUgbm9kZS4gIFRoZW4gdGhlIGRlZmluaXRlIG5vZGUKLSAgICAgaXMgcHVzaGVkIG9uIHRvIHRoZSBzdGFjay4gKi8KLSAgdm9pZCBjbG9zZU5vZGVTY29wZShOb2RlIG4sIGludCBudW0pIHsKLSAgICBtayA9ICgoSW50ZWdlciltYXJrcy5wb3AoKSkuaW50VmFsdWUoKTsKLSAgICB3aGlsZSAobnVtLS0gPiAwKSB7Ci0gICAgICBOb2RlIGMgPSBwb3BOb2RlKCk7Ci0gICAgICBjLmpqdFNldFBhcmVudChuKTsKLSAgICAgIG4uamp0QWRkQ2hpbGQoYywgbnVtKTsKLSAgICB9Ci0gICAgbi5qanRDbG9zZSgpOwotICAgIHB1c2hOb2RlKG4pOwotICAgIG5vZGVfY3JlYXRlZCA9IHRydWU7Ci0gIH0KLQotCi0gIC8qIEEgY29uZGl0aW9uYWwgbm9kZSBpcyBjb25zdHJ1Y3RlZCBpZiBpdHMgY29uZGl0aW9uIGlzIHRydWUuICBBbGwKLSAgICAgdGhlIG5vZGVzIHRoYXQgaGF2ZSBiZWVuIHB1c2hlZCBzaW5jZSB0aGUgbm9kZSB3YXMgb3BlbmVkIGFyZQotICAgICBtYWRlIGNoaWxkcmVuIG9mIHRoZSB0aGUgY29uZGl0aW9uYWwgbm9kZSwgd2hpY2ggaXMgdGhlbiBwdXNoZWQKLSAgICAgb24gdG8gdGhlIHN0YWNrLiAgSWYgdGhlIGNvbmRpdGlvbiBpcyBmYWxzZSB0aGUgbm9kZSBpcyBub3QKLSAgICAgY29uc3RydWN0ZWQgYW5kIHRoZXkgYXJlIGxlZnQgb24gdGhlIHN0YWNrLiAqLwotICB2b2lkIGNsb3NlTm9kZVNjb3BlKE5vZGUgbiwgYm9vbGVhbiBjb25kaXRpb24pIHsKLSAgICBpZiAoY29uZGl0aW9uKSB7Ci0gICAgICBpbnQgYSA9IG5vZGVBcml0eSgpOwotICAgICAgbWsgPSAoKEludGVnZXIpbWFya3MucG9wKCkpLmludFZhbHVlKCk7Ci0gICAgICB3aGlsZSAoYS0tID4gMCkgewotCU5vZGUgYyA9IHBvcE5vZGUoKTsKLQljLmpqdFNldFBhcmVudChuKTsKLQluLmpqdEFkZENoaWxkKGMsIGEpOwotICAgICAgfQotICAgICAgbi5qanRDbG9zZSgpOwotICAgICAgcHVzaE5vZGUobik7Ci0gICAgICBub2RlX2NyZWF0ZWQgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICBtayA9ICgoSW50ZWdlciltYXJrcy5wb3AoKSkuaW50VmFsdWUoKTsKLSAgICAgIG5vZGVfY3JlYXRlZCA9IGZhbHNlOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMLmpqIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMLmpqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTM4M2I0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTC5qagorKysgL2Rldi9udWxsCkBAIC0xLDY3NSArMCwwIEBACi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbg0KLSAqICAgICANCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKkBiZ2VuKGpqdHJlZSkgR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBKU1BFTC5qaiAqLw0KLS8qQGVnZW4qLy8qIEkga25vdyB0aGF0IGhhaW5nIHNvbWUgb2YgdGhlc2Ugb3B0aW9ucyBvbiBvbmUgbGluZSBpcyBydWRlIGJ1dCANCi0gKiBpZiB3ZSBkb24ndCBkbyB0aGF0IHRoZSBsaW5lIG51bWJlciByZXBvcnRlZCBmcm9tIGphdmFjYyBhcmUgb2ZmDQotICogd2hpY2gsIHRydXN0IG1lLCBpcyBmYXIgbW9yZSBhbm5veWluZy4gIC0tdGNhcnJvbGxAYmVhLmNvbQ0KLSAqLw0KLW9wdGlvbnMgew0KLSAgSkFWQV9VTklDT0RFX0VTQ0FQRSA9IGZhbHNlOw0KLSAgVU5JQ09ERV9JTlBVVCA9IHRydWU7DQotICBTVEFUSUMgPSBmYWxzZTsNCi0gIE9QVElNSVpFX1RPS0VOX01BTkFHRVIgPSB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLX0NCi0NCi1QQVJTRVJfQkVHSU4oSlNQRUxQYXJzZXIpDQotDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsNCi0NCi1wdWJsaWMgY2xhc3MgSlNQRUxQYXJzZXIvKkBiZ2VuKGpqdHJlZSkqL2ltcGxlbWVudHMgSlNQRUxQYXJzZXJUcmVlQ29uc3RhbnRzLypAZWdlbiovIHsvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgcHJvdGVjdGVkIEpKVEpTUEVMUGFyc2VyU3RhdGUgamp0cmVlID0gbmV3IEpKVEpTUEVMUGFyc2VyU3RhdGUoKTsNCi0NCi0vKkBlZ2VuKi8NCi0gIA0KLSAgdm9pZCBqanRyZWVPcGVuTm9kZVNjb3BlKE5vZGUgbikNCi0gIHsNCi0gICAgICAgICAgKChTaW1wbGVOb2RlKW4pLnNldEZpcnN0VG9rZW4oZ2V0VG9rZW4oMSkpOw0KLSAgfQ0KLQ0KLSAgdm9pZCBqanRyZWVDbG9zZU5vZGVTY29wZShOb2RlIG4pDQotICB7DQotICAgICgoU2ltcGxlTm9kZSluKS5zZXRMYXN0VG9rZW4oZ2V0VG9rZW4oMCkpOw0KLSAgfQ0KLSAgDQotICBwdWJsaWMgc3RhdGljIEpTUEVMUGFyc2VyIGNyZWF0ZVBhcnNlcihqYXZhLmxhbmcuU3RyaW5nIGlucHV0KSB7DQotICAgICAgICAgIGphdmEuaW8uU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcihpbnB1dCk7DQotICAgICAgICAgIHJldHVybiBuZXcgSlNQRUxQYXJzZXIocmVhZGVyKTsNCi0gIH0NCi0gIA0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEubGFuZy5TdHJpbmcgaW5wdXQpIHsNCi0gICAgICAgICAgIGphdmEuaW8uU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcihpbnB1dCk7DQotICAgICAgICAgICBSZUluaXQocmVhZGVyKTsNCi0gIH0NCi0gIA0KLX0NCi0NCi1QQVJTRVJfRU5EKEpTUEVMUGFyc2VyKQ0KLQ0KLVNLSVAgOg0KLXsNCi0gICIgIg0KLXwgIlx0Ig0KLXwgIlxuIg0KLXwgIlxyIg0KLX0NCi0NCi1UT0tFTiA6DQotew0KLS8qIExpdGVyYWxzICovDQotICA8IElOVEVHRVJfTElURVJBTDogWyIwIi0iOSJdIChbIjAiLSI5Il0pKiA+DQotfA0KLSAgPCBGTE9BVElOR19QT0lOVF9MSVRFUkFMOg0KLSAgICAgICAgKFsiMCItIjkiXSkrICIuIiAoWyIwIi0iOSJdKSogKDxFWFBPTkVOVD4pPw0KLSAgICAgIHwgIi4iIChbIjAiLSI5Il0pKyAoPEVYUE9ORU5UPik/DQotICAgICAgfCAoWyIwIi0iOSJdKSsgPEVYUE9ORU5UPg0KLSAgPg0KLXwNCi0gIDwgI0VYUE9ORU5UOiBbImUiLCJFIl0gKFsiKyIsIi0iXSk/IChbIjAiLSI5Il0pKyA+DQotfA0KLSAgPCBTVFJJTkdfTElURVJBTDoNCi0gICAgICAoIlwiIiAoKH5bIlwiIiwiXFwiXSkgfCAoIlxcIiAoIFsiXFwiLCJcIiJdICkpKSogIlwiIikgfA0KLSAgICAgICgiXCciICgoflsiXCciLCJcXCJdKSB8ICgiXFwiICggWyJcXCIsIlwnIl0gKSkpKiAiXCciKQ0KLSAgPg0KLXwNCi0gIDwgQkFETFlfRVNDQVBFRF9TVFJJTkdfTElURVJBTDoNCi0gICAgICAoIlwiIiAoflsiXCIiLCJcXCJdKSogKCJcXCIgKCB+WyJcXCIsIlwiIl0gKSkpIHwNCi0gICAgICAoIlwnIiAoflsiXCciLCJcXCJdKSogKCJcXCIgKCB+WyJcXCIsIlwnIl0gKSkpDQotICA+DQotDQotLyogUmVzZXJ2ZWQgV29yZHMgYW5kIFN5bWJvbHMgKi8NCi18IDwgVFJVRTogInRydWUiID4NCi18IDwgRkFMU0U6ICJmYWxzZSIgPg0KLXwgPCBOVUxMOiAibnVsbCIgPg0KLXwgPCBET1Q6ICIuIiA+DQotfCA8IEdUMTogIj4iID4NCi18IDwgR1QyOiAiZ3QiID4NCi18IDwgTFQxOiAiPCIgPg0KLXwgPCBMVDI6ICJsdCIgPg0KLXwgPCBFUTE6ICI9PSIgPg0KLXwgPCBFUTI6ICJlcSIgPg0KLXwgPCBMRTE6ICI8PSIgPg0KLXwgPCBMRTI6ICJsZSIgPg0KLXwgPCBHRTE6ICI+PSIgPg0KLXwgPCBHRTI6ICJnZSIgPg0KLXwgPCBORVExOiAiIT0iID4NCi18IDwgTkVRMjogIm5lIiA+DQotfCA8IExQQVJFTjogIigiID4NCi18IDwgUlBBUkVOOiAiKSIgPg0KLXwgPCBDT01NQTogIiwiID4NCi18IDwgQ09MT046ICI6IiA+DQotfCA8IExCUkFDS0VUOiAiWyIgPg0KLXwgPCBSQlJBQ0tFVDogIl0iID4NCi18IDwgUExVUzogIisiID4NCi18IDwgTUlOVVM6ICItIiA+DQotfCA8IE1VTFRJUExZOiAiKiIgPg0KLXwgPCBESVZJREUxOiAiLyIgPg0KLXwgPCBESVZJREUyOiAiZGl2IiA+DQotfCA8IE1PRFVMVVMxOiAiJSIgPg0KLXwgPCBNT0RVTFVTMjogIm1vZCIgPg0KLXwgPCBOT1QxOiAibm90IiA+DQotfCA8IE5PVDI6ICIhIiA+DQotfCA8IEFORDE6ICJhbmQiID4NCi18IDwgQU5EMjogIiYmIiA+DQotfCA8IE9SMTogIm9yIiA+DQotfCA8IE9SMjogInx8IiA+DQotfCA8IEVNUFRZOiAiZW1wdHkiID4NCi18IDwgQ09ORDogIj8iID4NCi0NCi0vKiBJZGVudGlmaWVycyAqLw0KLQ0KLXwgPCBJREVOVElGSUVSOiAoPExFVFRFUj58PElNUExfT0JKX1NUQVJUPikgKDxMRVRURVI+fDxESUdJVD4pKiA+DQotfCA8ICNJTVBMX09CSl9TVEFSVDogIiMiID4NCi18DQotICA8ICNMRVRURVI6DQotICAgICAgWw0KLSAgICAgICAiJCIsDQotICAgICAgICJBIi0iWiIsDQotICAgICAgICJfIiwNCi0gICAgICAgImEiLSJ6IiwNCi0gICAgICAgIlx1MDBjMCItIlx1MDBkNiIsDQotICAgICAgICJcdTAwZDgiLSJcdTAwZjYiLA0KLSAgICAgICAiXHUwMGY4Ii0iXHUwMGZmIiwNCi0gICAgICAgIlx1MDEwMCItIlx1MWZmZiIsDQotICAgICAgICJcdTMwNDAiLSJcdTMxOGYiLA0KLSAgICAgICAiXHUzMzAwIi0iXHUzMzdmIiwNCi0gICAgICAgIlx1MzQwMCItIlx1M2QyZCIsDQotICAgICAgICJcdTRlMDAiLSJcdTlmZmYiLA0KLSAgICAgICAiXHVmOTAwIi0iXHVmYWZmIg0KLSAgICAgIF0NCi0gID4NCi18DQotICA8ICNESUdJVDoNCi0gICAgICBbDQotICAgICAgICIwIi0iOSIsDQotICAgICAgICJcdTA2NjAiLSJcdTA2NjkiLA0KLSAgICAgICAiXHUwNmYwIi0iXHUwNmY5IiwNCi0gICAgICAgIlx1MDk2NiItIlx1MDk2ZiIsDQotICAgICAgICJcdTA5ZTYiLSJcdTA5ZWYiLA0KLSAgICAgICAiXHUwYTY2Ii0iXHUwYTZmIiwNCi0gICAgICAgIlx1MGFlNiItIlx1MGFlZiIsDQotICAgICAgICJcdTBiNjYiLSJcdTBiNmYiLA0KLSAgICAgICAiXHUwYmU3Ii0iXHUwYmVmIiwNCi0gICAgICAgIlx1MGM2NiItIlx1MGM2ZiIsDQotICAgICAgICJcdTBjZTYiLSJcdTBjZWYiLA0KLSAgICAgICAiXHUwZDY2Ii0iXHUwZDZmIiwNCi0gICAgICAgIlx1MGU1MCItIlx1MGU1OSIsDQotICAgICAgICJcdTBlZDAiLSJcdTBlZDkiLA0KLSAgICAgICAiXHUxMDQwIi0iXHUxMDQ5Ig0KLSAgICAgIF0NCi0gID4NCi19DQotDQotQVNURXhwcmVzc2lvbiBFeHByZXNzaW9uKCkgOiB7LypAYmdlbihqanRyZWUpIEV4cHJlc3Npb24gKi8NCi0gIEFTVEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RFeHByZXNzaW9uKEpKVEVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgKExPT0tBSEVBRCgiPyIpIENob2ljZUV4cHJlc3Npb24oKSB8IE9yRXhwcmVzc2lvbigpKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotLypAZWdlbiovIHsgcmV0dXJuIGpqdG4wMDA7IH0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIE9yRXhwcmVzc2lvbigpICAgICAgICAgICAgICAgICAgIDogDQotey8qQGJnZW4oamp0cmVlKSAjT3JFeHByZXNzaW9uKD4gMSkgKi8NCi0gICAgICAgIEFTVE9yRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVE9yRXhwcmVzc2lvbihKSlRPUkVYUFJFU1NJT04pOw0KLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFRva2VuIHQ7DQotfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgI09yRXhwcmVzc2lvbig+IDEpICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgQW5kRXhwcmVzc2lvbigpICgodCA9IDxPUjE+IHwgdCA9IDxPUjI+KSB7IGpqdG4wMDAuYWRkT3BlcmF0b3JUb2tlbih0KTsgfQ0KLSAgICAgICAgQW5kRXhwcmVzc2lvbigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCBqanRyZWUubm9kZUFyaXR5KCkgPiAxKTsNCi0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEFuZEV4cHJlc3Npb24oKSAgICAgICAgICAgICAgICAgICAgOiANCi17LypAYmdlbihqanRyZWUpICNBbmRFeHByZXNzaW9uKD4gMSkgKi8NCi0gICAgICAgIEFTVEFuZEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RBbmRFeHByZXNzaW9uKEpKVEFOREVYUFJFU1NJT04pOw0KLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFRva2VuIHQ7DQotfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgI0FuZEV4cHJlc3Npb24oPiAxKSAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEVxdWFsaXR5RXhwcmVzc2lvbigpICgodCA9IDxBTkQxPiB8IHQgPSA8QU5EMj4pIHsgamp0bjAwMC5hZGRPcGVyYXRvclRva2VuKHQpOyB9DQotICAgICAgICBFcXVhbGl0eUV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgamp0cmVlLm5vZGVBcml0eSgpID4gMSk7DQotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8gICAgICAgIA0KLX0NCi0NCi12b2lkIEVxdWFsaXR5RXhwcmVzc2lvbigpICAgICAgICAgICAgICAgICAgICAgICAgIDogDQotey8qQGJnZW4oamp0cmVlKSAjRXF1YWxpdHlFeHByZXNzaW9uKD4gMSkgKi8NCi0gICAgICAgIEFTVEVxdWFsaXR5RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEVxdWFsaXR5RXhwcmVzc2lvbihKSlRFUVVBTElUWUVYUFJFU1NJT04pOw0KLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFRva2VuIHQ7DQotfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgI0VxdWFsaXR5RXhwcmVzc2lvbig+IDEpICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgUmVsYXRpb25hbEV4cHJlc3Npb24oKSANCi0gICAgICAgICgodCA9IDxFUTE+IHwgdCA9IDxFUTI+IHwgdCA9IDxORVExPiB8IHQgPSA8TkVRMj4pIHsgamp0bjAwMC5hZGRPcGVyYXRvclRva2VuKHQpOyB9DQotICAgICAgICBSZWxhdGlvbmFsRXhwcmVzc2lvbigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCBqanRyZWUubm9kZUFyaXR5KCkgPiAxKTsNCi0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFJlbGF0aW9uYWxFeHByZXNzaW9uKCkgICAgICAgICAgICAgICAgICAgICAgICAgICA6DQotey8qQGJnZW4oamp0cmVlKSAjUmVsYXRpb25hbEV4cHJlc3Npb24oPiAxKSAqLw0KLSAgICAgICAgQVNUUmVsYXRpb25hbEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbihKSlRSRUxBVElPTkFMRVhQUkVTU0lPTik7DQotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qLw0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotey8qQGJnZW4oamp0cmVlKSAjUmVsYXRpb25hbEV4cHJlc3Npb24oPiAxKSAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEFkZEV4cHJlc3Npb24oKSANCi0gICAgICAgICgNCi0gICAgICAgICAgICAgICAgKHQgPSA8TFQxPiB8IHQgPSA8TFQyPiB8IHQgPSA8R1QxPiB8IHQgPSA8R1QyPiB8IHQgPSA8R0UxPiB8IHQgPSA8R0UyPiB8IHQgPSA8TEUxPiB8IHQgPSA8TEUyPikgIHsgamp0bjAwMC5hZGRPcGVyYXRvclRva2VuKHQpOyB9DQotICAgICAgICAgICAgICAgIEFkZEV4cHJlc3Npb24oKQ0KLSAgICAgICAgKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCBqanRyZWUubm9kZUFyaXR5KCkgPiAxKTsNCi0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEFkZEV4cHJlc3Npb24oKSAgICAgICAgICAgICAgICAgICAgOiANCi17LypAYmdlbihqanRyZWUpICNBZGRFeHByZXNzaW9uKD4gMSkgKi8NCi0gICAgICAgIEFTVEFkZEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RBZGRFeHByZXNzaW9uKEpKVEFEREVYUFJFU1NJT04pOw0KLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFRva2VuIHQ7DQotfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgI0FkZEV4cHJlc3Npb24oPiAxKSAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIE11bHRpcGx5RXhwcmVzc2lvbigpICgodCA9IDxQTFVTPiB8IHQgPSA8TUlOVVM+KSB7IGpqdG4wMDAuYWRkT3BlcmF0b3JUb2tlbih0KTsgfQ0KLSAgICAgICAgTXVsdGlwbHlFeHByZXNzaW9uKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIGpqdHJlZS5ub2RlQXJpdHkoKSA+IDEpOw0KLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgTXVsdGlwbHlFeHByZXNzaW9uKCkgICAgICAgICAgICAgICAgICAgICAgICAgOiANCi17LypAYmdlbihqanRyZWUpICNNdWx0aXBseUV4cHJlc3Npb24oPiAxKSAqLw0KLSAgICAgICAgQVNUTXVsdGlwbHlFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUTXVsdGlwbHlFeHByZXNzaW9uKEpKVE1VTFRJUExZRVhQUkVTU0lPTik7DQotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qLw0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotey8qQGJnZW4oamp0cmVlKSAjTXVsdGlwbHlFeHByZXNzaW9uKD4gMSkgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBVbmFyeUV4cHJlc3Npb24oKSAoDQotICAgICAgICAgICAgICAgICggdCA9IDxNVUxUSVBMWT4gfCB0ID0gPERJVklERTE+IHwgdCA9IDxESVZJREUyPiB8IHQgPSA8TU9EVUxVUzE+IHwgdCA9IDxNT0RVTFVTMj4pIHsgamp0bjAwMC5hZGRPcGVyYXRvclRva2VuKHQpOyB9DQotICAgICAgICAgICAgICAgIFVuYXJ5RXhwcmVzc2lvbigpICAgICAgICANCi0gICAgICAgICkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgamp0cmVlLm5vZGVBcml0eSgpID4gMSk7DQotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBDaG9pY2VFeHByZXNzaW9uKCkgOiB7LypAYmdlbihqanRyZWUpIENob2ljZUV4cHJlc3Npb24gKi8NCi0gIEFTVENob2ljZUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RDaG9pY2VFeHByZXNzaW9uKEpKVENIT0lDRUVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBDaG9pY2VFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgT3JFeHByZXNzaW9uKCkgPENPTkQ+IE9yRXhwcmVzc2lvbigpIDxDT0xPTj4gT3JFeHByZXNzaW9uKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFVuYXJ5RXhwcmVzc2lvbigpIDogey8qQGJnZW4oamp0cmVlKSBVbmFyeUV4cHJlc3Npb24gKi8NCi0gIEFTVFVuYXJ5RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVFVuYXJ5RXhwcmVzc2lvbihKSlRVTkFSWUVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBVbmFyeUV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICAoKDxOT1QxPiB8IDxOT1QyPiB8IDxNSU5VUz4gfCA8RU1QVFk+KSBVbmFyeUV4cHJlc3Npb24oKSkNCi0gICAgICAgIHwgVmFsdWUoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotICAgICAgICANCi19DQotDQotdm9pZCBWYWx1ZSgpIDogey8qQGJnZW4oamp0cmVlKSBWYWx1ZSAqLw0KLSAgQVNUVmFsdWUgamp0bjAwMCA9IG5ldyBBU1RWYWx1ZShKSlRWQUxVRSk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFZhbHVlICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgVmFsdWVQcmVmaXgoKSAoVmFsdWVTdWZmaXgoKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBWYWx1ZVByZWZpeCgpIDogey8qQGJnZW4oamp0cmVlKSBWYWx1ZVByZWZpeCAqLw0KLSAgQVNUVmFsdWVQcmVmaXggamp0bjAwMCA9IG5ldyBBU1RWYWx1ZVByZWZpeChKSlRWQUxVRVBSRUZJWCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFZhbHVlUHJlZml4ICovDQotICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgIExpdGVyYWwoKSB8ICg8TFBBUkVOPiBFeHByZXNzaW9uKCkgPFJQQVJFTj4pIHwgTE9PS0FIRUFEKDMpIEZ1bmN0aW9uSW52b2NhdGlvbigpIHwgPElERU5USUZJRVI+LypAYmdlbihqanRyZWUpKi8NCi0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgIH0gZWxzZSB7DQotICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgIH0NCi0gICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgfQ0KLSAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgIH0NCi0gICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgfSBmaW5hbGx5IHsNCi0gICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgfQ0KLSAgICB9DQotLypAZWdlbiovIA0KLX0NCi0NCi12b2lkIFZhbHVlU3VmZml4KCkgOiANCi17LypAYmdlbihqanRyZWUpIFZhbHVlU3VmZml4ICovDQotICAgICAgICBBU1RWYWx1ZVN1ZmZpeCBqanRuMDAwID0gbmV3IEFTVFZhbHVlU3VmZml4KEpKVFZBTFVFU1VGRklYKTsNCi0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovDQotICAgICAgICBUb2tlbiB0ID0gbnVsbDsNCi19DQotey8qQGJnZW4oamp0cmVlKSBWYWx1ZVN1ZmZpeCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgICg8RE9UPiAodCA9IDxJREVOVElGSUVSPik/KS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLS8qQGVnZW4qLyB7IGpqdG4wMDAuc2V0UHJvcGVydHlOYW1lVG9rZW4odCk7IH0NCi0gICAgICAgIHwgKDxMQlJBQ0tFVD4gRXhwcmVzc2lvbigpIDxSQlJBQ0tFVD4pLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBGdW5jdGlvbkludm9jYXRpb24oKSA6IA0KLXsvKkBiZ2VuKGpqdHJlZSkgRnVuY3Rpb25JbnZvY2F0aW9uICovDQotICAgICAgICBBU1RGdW5jdGlvbkludm9jYXRpb24gamp0bjAwMCA9IG5ldyBBU1RGdW5jdGlvbkludm9jYXRpb24oSkpURlVOQ1RJT05JTlZPQ0FUSU9OKTsNCi0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovDQotICAgICAgICBUb2tlbiBwcmVmaXggPSBudWxsLCBuYW1lID0gbnVsbDsNCi19DQotey8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbkludm9jYXRpb24gKi8NCi0gICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgKHByZWZpeCA9IDxJREVOVElGSUVSPiA8Q09MT04+KSB7IGpqdG4wMDAuc2V0RnVsbEZ1bmN0aW9uTmFtZShwcmVmaXguaW1hZ2UgKyAiOiIpOyB9DQotICAgICAgICAobmFtZSA9IDxJREVOVElGSUVSPik/IHsNCi0gICAgICAgICAgICBpZihudWxsICE9IHByZWZpeCAmJiBudWxsICE9IG5hbWUpDQotICAgICAgICAgICAgICAgICAgICBqanRuMDAwLnNldEZ1bGxGdW5jdGlvbk5hbWUocHJlZml4LmltYWdlICsgIjoiICsgKG51bGwgPT0gbmFtZSA/ICIiIDogbmFtZS5pbWFnZSkpOw0KLSAgICAgICAgICAgIGVsc2UgaWYobnVsbCAhPSBuYW1lKQ0KLSAgICAgICAgICAgICAgICAgICAgamp0bjAwMC5zZXRGdWxsRnVuY3Rpb25OYW1lKG5hbWUuaW1hZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgKDxMUEFSRU4+IEV4cHJlc3Npb24oKSAoPENPTU1BPiBFeHByZXNzaW9uKCkpKiB0cnkgIHsgKDxSUEFSRU4+KSB9IGNhdGNoIChFeGNlcHRpb24gZSkge30gKT8vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgfQ0KLSAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICB9DQotICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgfQ0KLSAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICB9IGZpbmFsbHkgew0KLSAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICB9DQotICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBMaXRlcmFsKCkgOiB7LypAYmdlbihqanRyZWUpIExpdGVyYWwgKi8NCi0gIEFTVExpdGVyYWwgamp0bjAwMCA9IG5ldyBBU1RMaXRlcmFsKEpKVExJVEVSQUwpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBMaXRlcmFsICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPFRSVUU+IHwgPEZBTFNFPiB8IDxJTlRFR0VSX0xJVEVSQUw+IHwgPEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw+IHwgPFNUUklOR19MSVRFUkFMPiB8IDxOVUxMPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUwuamp0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMLmpqdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZkNDBkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUwuamp0CisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotICogICAgIA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qIEkga25vdyB0aGF0IGhhdmluZyBzb21lIG9mIHRoZXNlIG9wdGlvbnMgb24gb25lIGxpbmUgaXMgcnVkZSBidXQgDQotICogaWYgd2UgZG9uJ3QgZG8gdGhhdCB0aGUgbGluZSBudW1iZXIgcmVwb3J0ZWQgZnJvbSBqYXZhY2MgYXJlIG9mZg0KLSAqIHdoaWNoLCB0cnVzdCBtZSwgaXMgZmFyIG1vcmUgYW5ub3lpbmcuICAtLXRjYXJyb2xsQGJlYS5jb20NCi0gKi8NCi1vcHRpb25zIHsNCi0gIEpBVkFfVU5JQ09ERV9FU0NBUEUgPSBmYWxzZTsNCi0gIFVOSUNPREVfSU5QVVQgPSB0cnVlOw0KLSAgU1RBVElDID0gZmFsc2U7DQotICBPUFRJTUlaRV9UT0tFTl9NQU5BR0VSID0gdHJ1ZTsgTVVMVEkgPSB0cnVlOyBWSVNJVE9SID0gdHJ1ZTsgTk9ERV9QQUNLQUdFID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsIjsgTk9ERV9TQ09QRV9IT09LID0gdHJ1ZTsNCi19DQotDQotUEFSU0VSX0JFR0lOKEpTUEVMUGFyc2VyKQ0KLQ0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7DQotDQotcHVibGljIGNsYXNzIEpTUEVMUGFyc2VyIHsNCi0gIA0KLSAgdm9pZCBqanRyZWVPcGVuTm9kZVNjb3BlKE5vZGUgbikNCi0gIHsNCi0gICAgICAgICAgKChTaW1wbGVOb2RlKW4pLnNldEZpcnN0VG9rZW4oZ2V0VG9rZW4oMSkpOw0KLSAgfQ0KLQ0KLSAgdm9pZCBqanRyZWVDbG9zZU5vZGVTY29wZShOb2RlIG4pDQotICB7DQotICAgICgoU2ltcGxlTm9kZSluKS5zZXRMYXN0VG9rZW4oZ2V0VG9rZW4oMCkpOw0KLSAgfQ0KLSAgDQotICBwdWJsaWMgc3RhdGljIEpTUEVMUGFyc2VyIGNyZWF0ZVBhcnNlcihqYXZhLmxhbmcuU3RyaW5nIGlucHV0KSB7DQotICAgICAgICAgIGphdmEuaW8uU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcihpbnB1dCk7DQotICAgICAgICAgIHJldHVybiBuZXcgSlNQRUxQYXJzZXIocmVhZGVyKTsNCi0gIH0NCi0gIA0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEubGFuZy5TdHJpbmcgaW5wdXQpIHsNCi0gICAgICAgICAgIGphdmEuaW8uU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcihpbnB1dCk7DQotICAgICAgICAgICBSZUluaXQocmVhZGVyKTsNCi0gIH0NCi0gIA0KLX0NCi0NCi1QQVJTRVJfRU5EKEpTUEVMUGFyc2VyKQ0KLQ0KLVNLSVAgOg0KLXsNCi0gICIgIg0KLXwgIlx0Ig0KLXwgIlxuIg0KLXwgIlxyIg0KLX0NCi0NCi1UT0tFTiA6DQotew0KLS8qIExpdGVyYWxzICovDQotICA8IElOVEVHRVJfTElURVJBTDogWyIwIi0iOSJdIChbIjAiLSI5Il0pKiA+DQotfA0KLSAgPCBGTE9BVElOR19QT0lOVF9MSVRFUkFMOg0KLSAgICAgICAgKFsiMCItIjkiXSkrICIuIiAoWyIwIi0iOSJdKSogKDxFWFBPTkVOVD4pPw0KLSAgICAgIHwgIi4iIChbIjAiLSI5Il0pKyAoPEVYUE9ORU5UPik/DQotICAgICAgfCAoWyIwIi0iOSJdKSsgPEVYUE9ORU5UPg0KLSAgPg0KLXwNCi0gIDwgI0VYUE9ORU5UOiBbImUiLCJFIl0gKFsiKyIsIi0iXSk/IChbIjAiLSI5Il0pKyA+DQotfA0KLSAgPCBTVFJJTkdfTElURVJBTDoNCi0gICAgICAoIlwiIiAoKH5bIlwiIiwiXFwiXSkgfCAoIlxcIiAoIFsiXFwiLCJcIiJdICkpKSogIlwiIikgfA0KLSAgICAgICgiXCciICgoflsiXCciLCJcXCJdKSB8ICgiXFwiICggWyJcXCIsIlwnIl0gKSkpKiAiXCciKQ0KLSAgPg0KLXwNCi0gIDwgQkFETFlfRVNDQVBFRF9TVFJJTkdfTElURVJBTDoNCi0gICAgICAoIlwiIiAoflsiXCIiLCJcXCJdKSogKCJcXCIgKCB+WyJcXCIsIlwiIl0gKSkpIHwNCi0gICAgICAoIlwnIiAoflsiXCciLCJcXCJdKSogKCJcXCIgKCB+WyJcXCIsIlwnIl0gKSkpDQotICA+DQotDQotLyogUmVzZXJ2ZWQgV29yZHMgYW5kIFN5bWJvbHMgKi8NCi18IDwgVFJVRTogInRydWUiID4NCi18IDwgRkFMU0U6ICJmYWxzZSIgPg0KLXwgPCBOVUxMOiAibnVsbCIgPg0KLXwgPCBET1Q6ICIuIiA+DQotfCA8IEdUMTogIj4iID4NCi18IDwgR1QyOiAiZ3QiID4NCi18IDwgTFQxOiAiPCIgPg0KLXwgPCBMVDI6ICJsdCIgPg0KLXwgPCBFUTE6ICI9PSIgPg0KLXwgPCBFUTI6ICJlcSIgPg0KLXwgPCBMRTE6ICI8PSIgPg0KLXwgPCBMRTI6ICJsZSIgPg0KLXwgPCBHRTE6ICI+PSIgPg0KLXwgPCBHRTI6ICJnZSIgPg0KLXwgPCBORVExOiAiIT0iID4NCi18IDwgTkVRMjogIm5lIiA+DQotfCA8IExQQVJFTjogIigiID4NCi18IDwgUlBBUkVOOiAiKSIgPg0KLXwgPCBDT01NQTogIiwiID4NCi18IDwgQ09MT046ICI6IiA+DQotfCA8IExCUkFDS0VUOiAiWyIgPg0KLXwgPCBSQlJBQ0tFVDogIl0iID4NCi18IDwgUExVUzogIisiID4NCi18IDwgTUlOVVM6ICItIiA+DQotfCA8IE1VTFRJUExZOiAiKiIgPg0KLXwgPCBESVZJREUxOiAiLyIgPg0KLXwgPCBESVZJREUyOiAiZGl2IiA+DQotfCA8IE1PRFVMVVMxOiAiJSIgPg0KLXwgPCBNT0RVTFVTMjogIm1vZCIgPg0KLXwgPCBOT1QxOiAibm90IiA+DQotfCA8IE5PVDI6ICIhIiA+DQotfCA8IEFORDE6ICJhbmQiID4NCi18IDwgQU5EMjogIiYmIiA+DQotfCA8IE9SMTogIm9yIiA+DQotfCA8IE9SMjogInx8IiA+DQotfCA8IEVNUFRZOiAiZW1wdHkiID4NCi18IDwgQ09ORDogIj8iID4NCi0NCi0vKiBJZGVudGlmaWVycyAqLw0KLQ0KLXwgPCBJREVOVElGSUVSOiAoPExFVFRFUj58PElNUExfT0JKX1NUQVJUPikgKDxMRVRURVI+fDxESUdJVD4pKiA+DQotfCA8ICNJTVBMX09CSl9TVEFSVDogIiMiID4NCi18DQotICA8ICNMRVRURVI6DQotICAgICAgWw0KLSAgICAgICAiXHUwMDI0IiwNCi0gICAgICAgIlx1MDA0MSItIlx1MDA1YSIsDQotICAgICAgICJcdTAwNWYiLA0KLSAgICAgICAiXHUwMDYxIi0iXHUwMDdhIiwNCi0gICAgICAgIlx1MDBjMCItIlx1MDBkNiIsDQotICAgICAgICJcdTAwZDgiLSJcdTAwZjYiLA0KLSAgICAgICAiXHUwMGY4Ii0iXHUwMGZmIiwNCi0gICAgICAgIlx1MDEwMCItIlx1MWZmZiIsDQotICAgICAgICJcdTMwNDAiLSJcdTMxOGYiLA0KLSAgICAgICAiXHUzMzAwIi0iXHUzMzdmIiwNCi0gICAgICAgIlx1MzQwMCItIlx1M2QyZCIsDQotICAgICAgICJcdTRlMDAiLSJcdTlmZmYiLA0KLSAgICAgICAiXHVmOTAwIi0iXHVmYWZmIg0KLSAgICAgIF0NCi0gID4NCi18DQotICA8ICNESUdJVDoNCi0gICAgICBbDQotICAgICAgICJcdTAwMzAiLSJcdTAwMzkiLA0KLSAgICAgICAiXHUwNjYwIi0iXHUwNjY5IiwNCi0gICAgICAgIlx1MDZmMCItIlx1MDZmOSIsDQotICAgICAgICJcdTA5NjYiLSJcdTA5NmYiLA0KLSAgICAgICAiXHUwOWU2Ii0iXHUwOWVmIiwNCi0gICAgICAgIlx1MGE2NiItIlx1MGE2ZiIsDQotICAgICAgICJcdTBhZTYiLSJcdTBhZWYiLA0KLSAgICAgICAiXHUwYjY2Ii0iXHUwYjZmIiwNCi0gICAgICAgIlx1MGJlNyItIlx1MGJlZiIsDQotICAgICAgICJcdTBjNjYiLSJcdTBjNmYiLA0KLSAgICAgICAiXHUwY2U2Ii0iXHUwY2VmIiwNCi0gICAgICAgIlx1MGQ2NiItIlx1MGQ2ZiIsDQotICAgICAgICJcdTBlNTAiLSJcdTBlNTkiLA0KLSAgICAgICAiXHUwZWQwIi0iXHUwZWQ5IiwNCi0gICAgICAgIlx1MTA0MCItIlx1MTA0OSINCi0gICAgICBdDQotICA+DQotfQ0KLQ0KLUFTVEV4cHJlc3Npb24gRXhwcmVzc2lvbigpIDoge30NCi17DQotICAgICAgICAoTE9PS0FIRUFEKCI/IikgQ2hvaWNlRXhwcmVzc2lvbigpIHwgT3JFeHByZXNzaW9uKCkpIHsgcmV0dXJuIGpqdFRoaXM7IH0NCi19DQotDQotdm9pZCBPckV4cHJlc3Npb24oKSAjT3JFeHByZXNzaW9uKD4xKSA6IA0KLXsNCi0gICAgICAgIFRva2VuIHQ7DQotfQ0KLXsNCi0gICAgICAgIEFuZEV4cHJlc3Npb24oKSAoKHQgPSA8T1IxPiB8IHQgPSA8T1IyPikgeyBqanRUaGlzLmFkZE9wZXJhdG9yVG9rZW4odCk7IH0NCi0gICAgICAgIEFuZEV4cHJlc3Npb24oKSkqDQotfQ0KLQ0KLXZvaWQgQW5kRXhwcmVzc2lvbigpICNBbmRFeHByZXNzaW9uKD4xKSA6IA0KLXsNCi0gICAgICAgIFRva2VuIHQ7DQotfQ0KLXsNCi0gICAgICAgIEVxdWFsaXR5RXhwcmVzc2lvbigpICgodCA9IDxBTkQxPiB8IHQgPSA8QU5EMj4pIHsgamp0VGhpcy5hZGRPcGVyYXRvclRva2VuKHQpOyB9DQotICAgICAgICBFcXVhbGl0eUV4cHJlc3Npb24oKSkqICAgICAgICANCi19DQotDQotdm9pZCBFcXVhbGl0eUV4cHJlc3Npb24oKSAjRXF1YWxpdHlFeHByZXNzaW9uKD4xKSA6IA0KLXsNCi0gICAgICAgIFRva2VuIHQ7DQotfQ0KLXsNCi0gICAgICAgIFJlbGF0aW9uYWxFeHByZXNzaW9uKCkgDQotICAgICAgICAoKHQgPSA8RVExPiB8IHQgPSA8RVEyPiB8IHQgPSA8TkVRMT4gfCB0ID0gPE5FUTI+KSB7IGpqdFRoaXMuYWRkT3BlcmF0b3JUb2tlbih0KTsgfQ0KLSAgICAgICAgUmVsYXRpb25hbEV4cHJlc3Npb24oKSkqDQotfQ0KLQ0KLXZvaWQgUmVsYXRpb25hbEV4cHJlc3Npb24oKSAjUmVsYXRpb25hbEV4cHJlc3Npb24oPjEpIDoNCi17DQotICAgICAgICBUb2tlbiB0Ow0KLX0NCi17DQotICAgICAgICBBZGRFeHByZXNzaW9uKCkgDQotICAgICAgICAoDQotICAgICAgICAgICAgICAgICh0ID0gPExUMT4gfCB0ID0gPExUMj4gfCB0ID0gPEdUMT4gfCB0ID0gPEdUMj4gfCB0ID0gPEdFMT4gfCB0ID0gPEdFMj4gfCB0ID0gPExFMT4gfCB0ID0gPExFMj4pICB7IGpqdFRoaXMuYWRkT3BlcmF0b3JUb2tlbih0KTsgfQ0KLSAgICAgICAgICAgICAgICBBZGRFeHByZXNzaW9uKCkNCi0gICAgICAgICkqDQotfQ0KLQ0KLXZvaWQgQWRkRXhwcmVzc2lvbigpICNBZGRFeHByZXNzaW9uKD4xKSA6IA0KLXsNCi0gICAgICAgIFRva2VuIHQ7DQotfQ0KLXsNCi0gICAgICAgIE11bHRpcGx5RXhwcmVzc2lvbigpICgodCA9IDxQTFVTPiB8IHQgPSA8TUlOVVM+KSB7IGpqdFRoaXMuYWRkT3BlcmF0b3JUb2tlbih0KTsgfQ0KLSAgICAgICAgTXVsdGlwbHlFeHByZXNzaW9uKCkpKg0KLX0NCi0NCi12b2lkIE11bHRpcGx5RXhwcmVzc2lvbigpICNNdWx0aXBseUV4cHJlc3Npb24oPjEpIDogDQotew0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotew0KLSAgICAgICAgVW5hcnlFeHByZXNzaW9uKCkgKA0KLSAgICAgICAgICAgICAgICAoIHQgPSA8TVVMVElQTFk+IHwgdCA9IDxESVZJREUxPiB8IHQgPSA8RElWSURFMj4gfCB0ID0gPE1PRFVMVVMxPiB8IHQgPSA8TU9EVUxVUzI+KSB7IGpqdFRoaXMuYWRkT3BlcmF0b3JUb2tlbih0KTsgfQ0KLSAgICAgICAgICAgICAgICBVbmFyeUV4cHJlc3Npb24oKSAgICAgICAgDQotICAgICAgICApKg0KLX0NCi0NCi12b2lkIENob2ljZUV4cHJlc3Npb24oKSA6IHt9DQotew0KLSAgICAgICAgT3JFeHByZXNzaW9uKCkgPENPTkQ+IE9yRXhwcmVzc2lvbigpIDxDT0xPTj4gT3JFeHByZXNzaW9uKCkNCi19DQotDQotdm9pZCBVbmFyeUV4cHJlc3Npb24oKSA6IHt9DQotew0KLSAgICAgICAgKCg8Tk9UMT4gfCA8Tk9UMj4gfCA8TUlOVVM+IHwgPEVNUFRZPikgVW5hcnlFeHByZXNzaW9uKCkpDQotICAgICAgICB8IFZhbHVlKCkNCi0gICAgICAgIA0KLX0NCi0NCi12b2lkIFZhbHVlKCkgOiB7fQ0KLXsNCi0gICAgICAgIFZhbHVlUHJlZml4KCkgKFZhbHVlU3VmZml4KCkpKg0KLX0NCi0NCi12b2lkIFZhbHVlUHJlZml4KCkgOiB7fQ0KLXsNCi0gICAgTGl0ZXJhbCgpIHwgKDxMUEFSRU4+IEV4cHJlc3Npb24oKSA8UlBBUkVOPikgfCBMT09LQUhFQUQoMykgRnVuY3Rpb25JbnZvY2F0aW9uKCkgfCA8SURFTlRJRklFUj4gDQotfQ0KLQ0KLXZvaWQgVmFsdWVTdWZmaXgoKSA6IA0KLXsNCi0gICAgICAgIFRva2VuIHQgPSBudWxsOw0KLX0NCi17DQotICAgICAgICAoPERPVD4gKHQgPSA8SURFTlRJRklFUj4pPykgeyBqanRUaGlzLnNldFByb3BlcnR5TmFtZVRva2VuKHQpOyB9DQotICAgICAgICB8ICg8TEJSQUNLRVQ+IEV4cHJlc3Npb24oKSA8UkJSQUNLRVQ+KQ0KLX0NCi0NCi12b2lkIEZ1bmN0aW9uSW52b2NhdGlvbigpIDogDQotew0KLSAgICAgICAgVG9rZW4gcHJlZml4ID0gbnVsbCwgbmFtZSA9IG51bGw7DQotfQ0KLXsNCi0gICAgKHByZWZpeCA9IDxJREVOVElGSUVSPiA8Q09MT04+KSB7IGpqdFRoaXMuc2V0RnVsbEZ1bmN0aW9uTmFtZShwcmVmaXguaW1hZ2UgKyAiOiIpOyB9DQotICAgICAgICAobmFtZSA9IDxJREVOVElGSUVSPik/IHsNCi0gICAgICAgICAgICBpZihudWxsICE9IHByZWZpeCAmJiBudWxsICE9IG5hbWUpDQotICAgICAgICAgICAgICAgICAgICBqanRUaGlzLnNldEZ1bGxGdW5jdGlvbk5hbWUocHJlZml4LmltYWdlICsgIjoiICsgKG51bGwgPT0gbmFtZSA/ICIiIDogbmFtZS5pbWFnZSkpOw0KLSAgICAgICAgICAgIGVsc2UgaWYobnVsbCAhPSBuYW1lKQ0KLSAgICAgICAgICAgICAgICAgICAgamp0VGhpcy5zZXRGdWxsRnVuY3Rpb25OYW1lKG5hbWUuaW1hZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgKDxMUEFSRU4+IEV4cHJlc3Npb24oKSAoPENPTU1BPiBFeHByZXNzaW9uKCkpKiB0cnkgIHsgKDxSUEFSRU4+KSB9IGNhdGNoIChFeGNlcHRpb24gZSkge30gKT8NCi19DQotDQotdm9pZCBMaXRlcmFsKCkgOiB7fQ0KLXsNCi0gICAgICAgIDxUUlVFPiB8IDxGQUxTRT4gfCA8SU5URUdFUl9MSVRFUkFMPiB8IDxGTE9BVElOR19QT0lOVF9MSVRFUkFMPiB8IDxTVFJJTkdfTElURVJBTD4gfCA8TlVMTD4NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwMWJhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlJkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBKU1BFTFBhcnNlci5qYXZhICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgSlNQRUxQYXJzZXIvKkBiZ2VuKGpqdHJlZSkqL2ltcGxlbWVudHMgSlNQRUxQYXJzZXJUcmVlQ29uc3RhbnRzLCBKU1BFTFBhcnNlckNvbnN0YW50cyB7LypAYmdlbihqanRyZWUpKi8KLSAgcHJvdGVjdGVkIEpKVEpTUEVMUGFyc2VyU3RhdGUgamp0cmVlID0gbmV3IEpKVEpTUEVMUGFyc2VyU3RhdGUoKTsKLSAgdm9pZCBqanRyZWVPcGVuTm9kZVNjb3BlKE5vZGUgbikKLSAgewotICAgICAgICAgICgoU2ltcGxlTm9kZSluKS5zZXRGaXJzdFRva2VuKGdldFRva2VuKDEpKTsKLSAgfQotCi0gIHZvaWQgamp0cmVlQ2xvc2VOb2RlU2NvcGUoTm9kZSBuKQotICB7Ci0gICAgKChTaW1wbGVOb2RlKW4pLnNldExhc3RUb2tlbihnZXRUb2tlbigwKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIEpTUEVMUGFyc2VyIGNyZWF0ZVBhcnNlcihqYXZhLmxhbmcuU3RyaW5nIGlucHV0KSB7Ci0gICAgICAgICAgamF2YS5pby5TdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKGlucHV0KTsKLSAgICAgICAgICByZXR1cm4gbmV3IEpTUEVMUGFyc2VyKHJlYWRlcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5sYW5nLlN0cmluZyBpbnB1dCkgewotICAgICAgICAgICBqYXZhLmlvLlN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoaW5wdXQpOwotICAgICAgICAgICBSZUluaXQocmVhZGVyKTsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyBBU1RFeHByZXNzaW9uIEV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypAYmdlbihqanRyZWUpIEV4cHJlc3Npb24gKi8KLSAgQVNURXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEV4cHJlc3Npb24oSkpURVhQUkVTU0lPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBpZiAoampfMl8xKDIxNDc0ODM2NDcpKSB7Ci0gICAgICAgIENob2ljZUV4cHJlc3Npb24oKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKLSAgICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgICBjYXNlIFRSVUU6Ci0gICAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICAgIGNhc2UgTlVMTDoKLSAgICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgIGNhc2UgTk9UMToKLSAgICAgICAgY2FzZSBOT1QyOgotICAgICAgICBjYXNlIEVNUFRZOgotICAgICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgICAgT3JFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzBdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIGpqdG4wMDA7fQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOwotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgT3JFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgI09yRXhwcmVzc2lvbig+IDEpICovCi0gICAgICAgIEFTVE9yRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVE9yRXhwcmVzc2lvbihKSlRPUkVYUFJFU1NJT04pOwotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTtUb2tlbiB0OwotICAgIHRyeSB7Ci0gICAgICBBbmRFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF8xOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgT1IxOgotICAgICAgICBjYXNlIE9SMjoKLSAgICAgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMV0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBPUjE6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oT1IxKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPUjI6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oT1IyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMl0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdG4wMDAuYWRkT3BlcmF0b3JUb2tlbih0KTsKLSAgICAgICAgQW5kRXhwcmVzc2lvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIGpqdHJlZS5ub2RlQXJpdHkoKSA+IDEpOwotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEFuZEV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSAjQW5kRXhwcmVzc2lvbig+IDEpICovCi0gICAgICAgIEFTVEFuZEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RBbmRFeHByZXNzaW9uKEpKVEFOREVYUFJFU1NJT04pOwotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTtUb2tlbiB0OwotICAgIHRyeSB7Ci0gICAgICBFcXVhbGl0eUV4cHJlc3Npb24oKTsKLSAgICAgIGxhYmVsXzI6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBBTkQxOgotICAgICAgICBjYXNlIEFORDI6Ci0gICAgICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzNdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzI7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQU5EMToKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihBTkQxKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBTkQyOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKEFORDIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs0XSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdG4wMDAuYWRkT3BlcmF0b3JUb2tlbih0KTsKLSAgICAgICAgRXF1YWxpdHlFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgamp0cmVlLm5vZGVBcml0eSgpID4gMSk7Ci0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRXF1YWxpdHlFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgI0VxdWFsaXR5RXhwcmVzc2lvbig+IDEpICovCi0gICAgICAgIEFTVEVxdWFsaXR5RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEVxdWFsaXR5RXhwcmVzc2lvbihKSlRFUVVBTElUWUVYUFJFU1NJT04pOwotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTtUb2tlbiB0OwotICAgIHRyeSB7Ci0gICAgICBSZWxhdGlvbmFsRXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfMzoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEVRMToKLSAgICAgICAgY2FzZSBFUTI6Ci0gICAgICAgIGNhc2UgTkVRMToKLSAgICAgICAgY2FzZSBORVEyOgotICAgICAgICAgIAotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs1XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8zOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEVRMToKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihFUTEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVRMjoKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihFUTIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5FUTE6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oTkVRMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTkVRMjoKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihORVEyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNl0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRuMDAwLmFkZE9wZXJhdG9yVG9rZW4odCk7Ci0gICAgICAgIFJlbGF0aW9uYWxFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgamp0cmVlLm5vZGVBcml0eSgpID4gMSk7Ci0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgUmVsYXRpb25hbEV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSAjUmVsYXRpb25hbEV4cHJlc3Npb24oPiAxKSAqLwotICAgICAgICBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uKEpKVFJFTEFUSU9OQUxFWFBSRVNTSU9OKTsKLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7VG9rZW4gdDsKLSAgICB0cnkgewotICAgICAgQWRkRXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfNDoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEdUMToKLSAgICAgICAgY2FzZSBHVDI6Ci0gICAgICAgIGNhc2UgTFQxOgotICAgICAgICBjYXNlIExUMjoKLSAgICAgICAgY2FzZSBMRTE6Ci0gICAgICAgIGNhc2UgTEUyOgotICAgICAgICBjYXNlIEdFMToKLSAgICAgICAgY2FzZSBHRTI6Ci0gICAgICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzddID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzQ7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgTFQxOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKExUMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTFQyOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKExUMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1QxOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKEdUMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1QyOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKEdUMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR0UxOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKEdFMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR0UyOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKEdFMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTEUxOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKExFMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTEUyOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKExFMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzhdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0bjAwMC5hZGRPcGVyYXRvclRva2VuKHQpOwotICAgICAgICBBZGRFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgamp0cmVlLm5vZGVBcml0eSgpID4gMSk7Ci0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgQWRkRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpICNBZGRFeHByZXNzaW9uKD4gMSkgKi8KLSAgICAgICAgQVNUQWRkRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEFkZEV4cHJlc3Npb24oSkpUQURERVhQUkVTU0lPTik7Ci0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApO1Rva2VuIHQ7Ci0gICAgdHJ5IHsKLSAgICAgIE11bHRpcGx5RXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfNToKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIFBMVVM6Ci0gICAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzldID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzU7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgUExVUzoKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihQTFVTKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNSU5VUzoKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihNSU5VUyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzEwXSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRuMDAwLmFkZE9wZXJhdG9yVG9rZW4odCk7Ci0gICAgICAgIE11bHRpcGx5RXhwcmVzc2lvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIGpqdHJlZS5ub2RlQXJpdHkoKSA+IDEpOwotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIE11bHRpcGx5RXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpICNNdWx0aXBseUV4cHJlc3Npb24oPiAxKSAqLwotICAgICAgICBBU1RNdWx0aXBseUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RNdWx0aXBseUV4cHJlc3Npb24oSkpUTVVMVElQTFlFWFBSRVNTSU9OKTsKLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7VG9rZW4gdDsKLSAgICB0cnkgewotICAgICAgVW5hcnlFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF82OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgTVVMVElQTFk6Ci0gICAgICAgIGNhc2UgRElWSURFMToKLSAgICAgICAgY2FzZSBESVZJREUyOgotICAgICAgICBjYXNlIE1PRFVMVVMxOgotICAgICAgICBjYXNlIE1PRFVMVVMyOgotICAgICAgICAgIAotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxMV0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfNjsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBNVUxUSVBMWToKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihNVUxUSVBMWSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRElWSURFMToKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihESVZJREUxKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBESVZJREUyOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKERJVklERTIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1PRFVMVVMxOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKE1PRFVMVVMxKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNT0RVTFVTMjoKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihNT0RVTFVTMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzEyXSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0bjAwMC5hZGRPcGVyYXRvclRva2VuKHQpOwotICAgICAgICBVbmFyeUV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCBqanRyZWUubm9kZUFyaXR5KCkgPiAxKTsKLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBDaG9pY2VFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qQGJnZW4oamp0cmVlKSBDaG9pY2VFeHByZXNzaW9uICovCi0gIEFTVENob2ljZUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RDaG9pY2VFeHByZXNzaW9uKEpKVENIT0lDRUVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgT3JFeHByZXNzaW9uKCk7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKENPTkQpOwotICAgICAgT3JFeHByZXNzaW9uKCk7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKENPTE9OKTsKLSAgICAgIE9yRXhwcmVzc2lvbigpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFVuYXJ5RXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qQGJnZW4oamp0cmVlKSBVbmFyeUV4cHJlc3Npb24gKi8KLSAgQVNUVW5hcnlFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUVW5hcnlFeHByZXNzaW9uKEpKVFVOQVJZRVhQUkVTU0lPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICBjYXNlIE5PVDE6Ci0gICAgICBjYXNlIE5PVDI6Ci0gICAgICBjYXNlIEVNUFRZOgotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBOT1QxOgotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTk9UMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTk9UMjoKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKE5PVDIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1JTlVTOgotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTUlOVVMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVNUFRZOgotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRU1QVFkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxM10gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgVW5hcnlFeHByZXNzaW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBJTlRFR0VSX0xJVEVSQUw6Ci0gICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgY2FzZSBUUlVFOgotICAgICAgY2FzZSBGQUxTRToKLSAgICAgIGNhc2UgTlVMTDoKLSAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICBWYWx1ZSgpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxNF0gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBWYWx1ZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgLypAYmdlbihqanRyZWUpIFZhbHVlICovCi0gIEFTVFZhbHVlIGpqdG4wMDAgPSBuZXcgQVNUVmFsdWUoSkpUVkFMVUUpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgVmFsdWVQcmVmaXgoKTsKLSAgICAgIGxhYmVsXzc6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBET1Q6Ci0gICAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzE1XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF83OwotICAgICAgICB9Ci0gICAgICAgIFZhbHVlU3VmZml4KCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVmFsdWVQcmVmaXgoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgIC8qQGJnZW4oamp0cmVlKSBWYWx1ZVByZWZpeCAqLwotICBBU1RWYWx1ZVByZWZpeCBqanRuMDAwID0gbmV3IEFTVFZhbHVlUHJlZml4KEpKVFZBTFVFUFJFRklYKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBJTlRFR0VSX0xJVEVSQUw6Ci0gICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgY2FzZSBUUlVFOgotICAgICAgY2FzZSBGQUxTRToKLSAgICAgIGNhc2UgTlVMTDoKLSAgICAgICAgTGl0ZXJhbCgpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7Ci0gICAgICAgIEV4cHJlc3Npb24oKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxNl0gPSBqal9nZW47Ci0gICAgICAgIGlmIChqal8yXzIoMykpIHsKLSAgICAgICAgICBGdW5jdGlvbkludm9jYXRpb24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKElERU5USUZJRVIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGpqX2xhMVsxN10gPSBqal9nZW47Ci0gICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICB9Ci0gICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgIH0KLSAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICB9Ci0gICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBWYWx1ZVN1ZmZpeCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFZhbHVlU3VmZml4ICovCi0gICAgICAgIEFTVFZhbHVlU3VmZml4IGpqdG4wMDAgPSBuZXcgQVNUVmFsdWVTdWZmaXgoSkpUVkFMVUVTVUZGSVgpOwotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTtUb2tlbiB0ID0gbnVsbDsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIERPVDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihET1QpOwotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKElERU5USUZJRVIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxOF0gPSBqal9nZW47Ci0gICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRuMDAwLnNldFByb3BlcnR5TmFtZVRva2VuKHQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTEJSQUNLRVQpOwotICAgICAgICBFeHByZXNzaW9uKCk7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUkJSQUNLRVQpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxOV0gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBGdW5jdGlvbkludm9jYXRpb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbkludm9jYXRpb24gKi8KLSAgICAgICAgQVNURnVuY3Rpb25JbnZvY2F0aW9uIGpqdG4wMDAgPSBuZXcgQVNURnVuY3Rpb25JbnZvY2F0aW9uKEpKVEZVTkNUSU9OSU5WT0NBVElPTik7Ci0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApO1Rva2VuIHByZWZpeCA9IG51bGwsIG5hbWUgPSBudWxsOwotICAgIHRyeSB7Ci0gICAgICBwcmVmaXggPSBqal9jb25zdW1lX3Rva2VuKElERU5USUZJRVIpOwotICAgICAgampfY29uc3VtZV90b2tlbihDT0xPTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdG4wMDAuc2V0RnVsbEZ1bmN0aW9uTmFtZShwcmVmaXguaW1hZ2UgKyAiOiIpOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgIG5hbWUgPSBqal9jb25zdW1lX3Rva2VuKElERU5USUZJRVIpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsyMF0gPSBqal9nZW47Ci0gICAgICAgIAotICAgICAgfQotICAgICAgICAgICAgaWYobnVsbCAhPSBwcmVmaXggJiYgbnVsbCAhPSBuYW1lKQotICAgICAgICAgICAgICAgICAgICBqanRuMDAwLnNldEZ1bGxGdW5jdGlvbk5hbWUocHJlZml4LmltYWdlICsgIjoiICsgKG51bGwgPT0gbmFtZSA/ICIiIDogbmFtZS5pbWFnZSkpOwotICAgICAgICAgICAgZWxzZSBpZihudWxsICE9IG5hbWUpCi0gICAgICAgICAgICAgICAgICAgIGpqdG4wMDAuc2V0RnVsbEZ1bmN0aW9uTmFtZShuYW1lLmltYWdlKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKLSAgICAgICAgRXhwcmVzc2lvbigpOwotICAgICAgICBsYWJlbF84OgotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICAgIGNhc2UgQ09NTUE6Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBqal9sYTFbMjFdID0gampfZ2VuOwotICAgICAgICAgICAgYnJlYWsgbGFiZWxfODsKLSAgICAgICAgICB9Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7Ci0gICAgICAgICAgRXhwcmVzc2lvbigpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMjJdID0gampfZ2VuOwotICAgICAgICAKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgfQotICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICB9Ci0gICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgfQotICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgTGl0ZXJhbCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAvKkBiZ2VuKGpqdHJlZSkgTGl0ZXJhbCAqLwotICBBU1RMaXRlcmFsIGpqdG4wMDAgPSBuZXcgQVNUTGl0ZXJhbChKSlRMSVRFUkFMKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBUUlVFOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFRSVUUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRkFMU0UpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSU5URUdFUl9MSVRFUkFMOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKElOVEVHRVJfTElURVJBTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEZMT0FUSU5HX1BPSU5UX0xJVEVSQUwpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1RSSU5HX0xJVEVSQUwpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTlVMTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihOVUxMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMjNdID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzEoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18xKCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMCwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMihpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzIoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgxLCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTAoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzkoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oSURFTlRJRklFUikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTE9OKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNDcpKSBqal9zY2FucG9zID0geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzEwKCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMigpIHsKLSAgICBpZiAoampfM1JfOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18xKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTkQpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIgdG9rZW5fc291cmNlOwotICBTaW1wbGVDaGFyU3RyZWFtIGpqX2lucHV0X3N0cmVhbTsKLSAgcHVibGljIFRva2VuIHRva2VuLCBqal9udDsKLSAgcHJpdmF0ZSBpbnQgampfbnRrOwotICBwcml2YXRlIFRva2VuIGpqX3NjYW5wb3MsIGpqX2xhc3Rwb3M7Ci0gIHByaXZhdGUgaW50IGpqX2xhOwotICBwdWJsaWMgYm9vbGVhbiBsb29raW5nQWhlYWQgPSBmYWxzZTsKLS8vICBwcml2YXRlIGJvb2xlYW4gampfc2VtTEE7Ci0gIHByaXZhdGUgaW50IGpqX2dlbjsKLSAgZmluYWwgcHJpdmF0ZSBpbnRbXSBqal9sYTEgPSBuZXcgaW50WzI0XTsKLSAgc3RhdGljIHByaXZhdGUgaW50W10gampfbGExXzA7Ci0gIHN0YXRpYyBwcml2YXRlIGludFtdIGpqX2xhMV8xOwotICBzdGF0aWMgewotICAgICAgampfbGExXzAoKTsKLSAgICAgIGpqX2xhMV8xKCk7Ci0gICB9Ci0gICBwcml2YXRlIHN0YXRpYyB2b2lkIGpqX2xhMV8wKCkgewotICAgICAgampfbGExXzAgPSBuZXcgaW50W10gezB4NDAwMWQ2MCwweDAsMHgwLDB4MCwweDAsMHgzMGMwMDAwLDB4MzBjMDAwMCwweGYzYzAwMCwweGYzYzAwMCwweDAsMHgwLDB4MCwweDAsMHgwLDB4NDAwMWQ2MCwweDQwMDAyMDAwLDB4NDAwMWQ2MCwweDAsMHgwLDB4NDAwMDIwMDAsMHgwLDB4MTAwMDAwMDAsMHg0MDAwMDAwLDB4MWQ2MCx9OwotICAgfQotICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBqal9sYTFfMSgpIHsKLSAgICAgIGpqX2xhMV8xID0gbmV3IGludFtdIHsweGExODIsMHgxODAwLDB4MTgwMCwweDYwMCwweDYwMCwweDAsMHgwLDB4MCwweDAsMHgzLDB4MywweDdjLDB4N2MsMHgyMTgyLDB4YTE4MiwweDAsMHgwLDB4ODAwMCwweDgwMDAsMHgwLDB4ODAwMCwweDAsMHgwLDB4MCx9OwotICAgfQotICBmaW5hbCBwcml2YXRlIEpKQ2FsbHNbXSBqal8yX3J0bnMgPSBuZXcgSkpDYWxsc1syXTsKLSAgcHJpdmF0ZSBib29sZWFuIGpqX3Jlc2NhbiA9IGZhbHNlOwotICBwcml2YXRlIGludCBqal9nYyA9IDA7Ci0KLSAgcHVibGljIEpTUEVMUGFyc2VyKGphdmEuaW8uSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0gICAgampfaW5wdXRfc3RyZWFtID0gbmV3IFNpbXBsZUNoYXJTdHJlYW0oc3RyZWFtLCAxLCAxKTsKLSAgICB0b2tlbl9zb3VyY2UgPSBuZXcgSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIoampfaW5wdXRfc3RyZWFtKTsKLSAgICB0b2tlbiA9IG5ldyBUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICAgIGpqX2dlbiA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNDsgaSsrKSBqal9sYTFbaV0gPSAtMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIHN0cmVhbSkgewotICAgIGpqX2lucHV0X3N0cmVhbS5SZUluaXQoc3RyZWFtLCAxLCAxKTsKLSAgICB0b2tlbl9zb3VyY2UuUmVJbml0KGpqX2lucHV0X3N0cmVhbSk7Ci0gICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgICBqanRyZWUucmVzZXQoKTsKLSAgICBqal9nZW4gPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjQ7IGkrKykgampfbGExW2ldID0gLTE7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIGpqXzJfcnRuc1tpXSA9IG5ldyBKSkNhbGxzKCk7Ci0gIH0KLQotICBwdWJsaWMgSlNQRUxQYXJzZXIoamF2YS5pby5SZWFkZXIgc3RyZWFtKSB7Ci0gICAgampfaW5wdXRfc3RyZWFtID0gbmV3IFNpbXBsZUNoYXJTdHJlYW0oc3RyZWFtLCAxLCAxKTsKLSAgICB0b2tlbl9zb3VyY2UgPSBuZXcgSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIoampfaW5wdXRfc3RyZWFtKTsKLSAgICB0b2tlbiA9IG5ldyBUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICAgIGpqX2dlbiA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNDsgaSsrKSBqal9sYTFbaV0gPSAtMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLlJlYWRlciBzdHJlYW0pIHsKLSAgICBqal9pbnB1dF9zdHJlYW0uUmVJbml0KHN0cmVhbSwgMSwgMSk7Ci0gICAgdG9rZW5fc291cmNlLlJlSW5pdChqal9pbnB1dF9zdHJlYW0pOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgamp0cmVlLnJlc2V0KCk7Ci0gICAgampfZ2VuID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI0OyBpKyspIGpqX2xhMVtpXSA9IC0xOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOwotICB9Ci0KLSAgcHVibGljIEpTUEVMUGFyc2VyKEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyIHRtKSB7Ci0gICAgdG9rZW5fc291cmNlID0gdG07Ci0gICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgICBqal9nZW4gPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjQ7IGkrKykgampfbGExW2ldID0gLTE7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIGpqXzJfcnRuc1tpXSA9IG5ldyBKSkNhbGxzKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIgdG0pIHsKLSAgICB0b2tlbl9zb3VyY2UgPSB0bTsKLSAgICB0b2tlbiA9IG5ldyBUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICAgIGpqdHJlZS5yZXNldCgpOwotICAgIGpqX2dlbiA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNDsgaSsrKSBqal9sYTFbaV0gPSAtMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgVG9rZW4gampfY29uc3VtZV90b2tlbihpbnQga2luZCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICBUb2tlbiBvbGRUb2tlbjsKLSAgICBpZiAoKG9sZFRva2VuID0gdG9rZW4pLm5leHQgIT0gbnVsbCkgdG9rZW4gPSB0b2tlbi5uZXh0OwotICAgIGVsc2UgdG9rZW4gPSB0b2tlbi5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICAgIGlmICh0b2tlbi5raW5kID09IGtpbmQpIHsKLSAgICAgIGpqX2dlbisrOwotICAgICAgaWYgKCsrampfZ2MgPiAxMDApIHsKLSAgICAgICAgampfZ2MgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgIEpKQ2FsbHMgYyA9IGpqXzJfcnRuc1tpXTsKLSAgICAgICAgICB3aGlsZSAoYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoYy5nZW4gPCBqal9nZW4pIGMuZmlyc3QgPSBudWxsOwotICAgICAgICAgICAgYyA9IGMubmV4dDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB0b2tlbjsKLSAgICB9Ci0gICAgdG9rZW4gPSBvbGRUb2tlbjsKLSAgICBqal9raW5kID0ga2luZDsKLSAgICB0aHJvdyBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uKCk7Ci0gIH0KLQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBjbGFzcyBMb29rYWhlYWRTdWNjZXNzIGV4dGVuZHMgamF2YS5sYW5nLkVycm9yIHsgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7IAotICB9Ci0gIGZpbmFsIHByaXZhdGUgTG9va2FoZWFkU3VjY2VzcyBqal9scyA9IG5ldyBMb29rYWhlYWRTdWNjZXNzKCk7Ci0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal9zY2FuX3Rva2VuKGludCBraW5kKSB7Ci0gICAgaWYgKGpqX3NjYW5wb3MgPT0gampfbGFzdHBvcykgewotICAgICAgampfbGEtLTsKLSAgICAgIGlmIChqal9zY2FucG9zLm5leHQgPT0gbnVsbCkgewotICAgICAgICBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IGpqX3NjYW5wb3MubmV4dCA9IHRva2VuX3NvdXJjZS5nZXROZXh0VG9rZW4oKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gampfc2NhbnBvcy5uZXh0OwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBqal9zY2FucG9zID0gampfc2NhbnBvcy5uZXh0OwotICAgIH0KLSAgICBpZiAoampfcmVzY2FuKSB7Ci0gICAgICBpbnQgaSA9IDA7IFRva2VuIHRvayA9IHRva2VuOwotICAgICAgd2hpbGUgKHRvayAhPSBudWxsICYmIHRvayAhPSBqal9zY2FucG9zKSB7IGkrKzsgdG9rID0gdG9rLm5leHQ7IH0KLSAgICAgIGlmICh0b2sgIT0gbnVsbCkgampfYWRkX2Vycm9yX3Rva2VuKGtpbmQsIGkpOwotICAgIH0KLSAgICBpZiAoampfc2NhbnBvcy5raW5kICE9IGtpbmQpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9sYSA9PSAwICYmIGpqX3NjYW5wb3MgPT0gampfbGFzdHBvcykgdGhyb3cgampfbHM7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHVibGljIFRva2VuIGdldE5leHRUb2tlbigpIHsKLSAgICBpZiAodG9rZW4ubmV4dCAhPSBudWxsKSB0b2tlbiA9IHRva2VuLm5leHQ7Ci0gICAgZWxzZSB0b2tlbiA9IHRva2VuLm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgampfZ2VuKys7Ci0gICAgcmV0dXJuIHRva2VuOwotICB9Ci0KLSAgZmluYWwgcHVibGljIFRva2VuIGdldFRva2VuKGludCBpbmRleCkgewotICAgIFRva2VuIHQgPSBsb29raW5nQWhlYWQgPyBqal9zY2FucG9zIDogdG9rZW47Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7Ci0gICAgICBpZiAodC5uZXh0ICE9IG51bGwpIHQgPSB0Lm5leHQ7Ci0gICAgICBlbHNlIHQgPSB0Lm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7Ci0gICAgfQotICAgIHJldHVybiB0OwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBpbnQgampfbnRrKCkgewotICAgIGlmICgoampfbnQ9dG9rZW4ubmV4dCkgPT0gbnVsbCkKLSAgICAgIHJldHVybiAoampfbnRrID0gKHRva2VuLm5leHQ9dG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpKS5raW5kKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gKGpqX250ayA9IGpqX250LmtpbmQpOwotICB9Ci0KLSAgcHJpdmF0ZSBqYXZhLnV0aWwuVmVjdG9yIGpqX2V4cGVudHJpZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICBwcml2YXRlIGludFtdIGpqX2V4cGVudHJ5OwotICBwcml2YXRlIGludCBqal9raW5kID0gLTE7Ci0gIHByaXZhdGUgaW50W10gampfbGFzdHRva2VucyA9IG5ldyBpbnRbMTAwXTsKLSAgcHJpdmF0ZSBpbnQgampfZW5kcG9zOwotCi0gIHByaXZhdGUgdm9pZCBqal9hZGRfZXJyb3JfdG9rZW4oaW50IGtpbmQsIGludCBwb3MpIHsKLSAgICBpZiAocG9zID49IDEwMCkgcmV0dXJuOwotICAgIGlmIChwb3MgPT0gampfZW5kcG9zICsgMSkgewotICAgICAgampfbGFzdHRva2Vuc1tqal9lbmRwb3MrK10gPSBraW5kOwotICAgIH0gZWxzZSBpZiAoampfZW5kcG9zICE9IDApIHsKLSAgICAgIGpqX2V4cGVudHJ5ID0gbmV3IGludFtqal9lbmRwb3NdOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal9lbmRwb3M7IGkrKykgewotICAgICAgICBqal9leHBlbnRyeVtpXSA9IGpqX2xhc3R0b2tlbnNbaV07Ci0gICAgICB9Ci0gICAgICBib29sZWFuIGV4aXN0cyA9IGZhbHNlOwotICAgICAgZm9yIChqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IGpqX2V4cGVudHJpZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgaW50W10gb2xkZW50cnkgPSAoaW50W10pKGUubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgIGlmIChvbGRlbnRyeS5sZW5ndGggPT0gampfZXhwZW50cnkubGVuZ3RoKSB7Ci0gICAgICAgICAgZXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqX2V4cGVudHJ5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAob2xkZW50cnlbaV0gIT0gampfZXhwZW50cnlbaV0pIHsKLSAgICAgICAgICAgICAgZXhpc3RzID0gZmFsc2U7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZXhpc3RzKSBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKCFleGlzdHMpIGpqX2V4cGVudHJpZXMuYWRkRWxlbWVudChqal9leHBlbnRyeSk7Ci0gICAgICBpZiAocG9zICE9IDApIGpqX2xhc3R0b2tlbnNbKGpqX2VuZHBvcyA9IHBvcykgLSAxXSA9IGtpbmQ7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFBhcnNlRXhjZXB0aW9uIGdlbmVyYXRlUGFyc2VFeGNlcHRpb24oKSB7Ci0gICAgampfZXhwZW50cmllcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgIGJvb2xlYW5bXSBsYTF0b2tlbnMgPSBuZXcgYm9vbGVhbls1MV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MTsgaSsrKSB7Ci0gICAgICBsYTF0b2tlbnNbaV0gPSBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKGpqX2tpbmQgPj0gMCkgewotICAgICAgbGExdG9rZW5zW2pqX2tpbmRdID0gdHJ1ZTsKLSAgICAgIGpqX2tpbmQgPSAtMTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNDsgaSsrKSB7Ci0gICAgICBpZiAoampfbGExW2ldID09IGpqX2dlbikgewotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDMyOyBqKyspIHsKLSAgICAgICAgICBpZiAoKGpqX2xhMV8wW2ldICYgKDE8PGopKSAhPSAwKSB7Ci0gICAgICAgICAgICBsYTF0b2tlbnNbal0gPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoKGpqX2xhMV8xW2ldICYgKDE8PGopKSAhPSAwKSB7Ci0gICAgICAgICAgICBsYTF0b2tlbnNbMzIral0gPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDUxOyBpKyspIHsKLSAgICAgIGlmIChsYTF0b2tlbnNbaV0pIHsKLSAgICAgICAgampfZXhwZW50cnkgPSBuZXcgaW50WzFdOwotICAgICAgICBqal9leHBlbnRyeVswXSA9IGk7Ci0gICAgICAgIGpqX2V4cGVudHJpZXMuYWRkRWxlbWVudChqal9leHBlbnRyeSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGpqX2VuZHBvcyA9IDA7Ci0gICAgampfcmVzY2FuX3Rva2VuKCk7Ci0gICAgampfYWRkX2Vycm9yX3Rva2VuKDAsIDApOwotICAgIGludFtdW10gZXhwdG9rc2VxID0gbmV3IGludFtqal9leHBlbnRyaWVzLnNpemUoKV1bXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqX2V4cGVudHJpZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGV4cHRva3NlcVtpXSA9IChpbnRbXSlqal9leHBlbnRyaWVzLmVsZW1lbnRBdChpKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBQYXJzZUV4Y2VwdGlvbih0b2tlbiwgZXhwdG9rc2VxLCB0b2tlbkltYWdlKTsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIGVuYWJsZV90cmFjaW5nKCkgewotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgZGlzYWJsZV90cmFjaW5nKCkgewotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSB2b2lkIGpqX3Jlc2Nhbl90b2tlbigpIHsKLSAgICBqal9yZXNjYW4gPSB0cnVlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgICBKSkNhbGxzIHAgPSBqal8yX3J0bnNbaV07Ci0gICAgICBkbyB7Ci0gICAgICAgIGlmIChwLmdlbiA+IGpqX2dlbikgewotICAgICAgICAgIGpqX2xhID0gcC5hcmc7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gcC5maXJzdDsKLSAgICAgICAgICBzd2l0Y2ggKGkpIHsKLSAgICAgICAgICAgIGNhc2UgMDogampfM18xKCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOiBqal8zXzIoKTsgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHAgPSBwLm5leHQ7Ci0gICAgICB9IHdoaWxlIChwICE9IG51bGwpOwotICAgIH0KLSAgICBqal9yZXNjYW4gPSBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgdm9pZCBqal9zYXZlKGludCBpbmRleCwgaW50IHhsYSkgewotICAgIEpKQ2FsbHMgcCA9IGpqXzJfcnRuc1tpbmRleF07Ci0gICAgd2hpbGUgKHAuZ2VuID4gampfZ2VuKSB7Ci0gICAgICBpZiAocC5uZXh0ID09IG51bGwpIHsgcCA9IHAubmV4dCA9IG5ldyBKSkNhbGxzKCk7IGJyZWFrOyB9Ci0gICAgICBwID0gcC5uZXh0OwotICAgIH0KLSAgICBwLmdlbiA9IGpqX2dlbiArIHhsYSAtIGpqX2xhOyBwLmZpcnN0ID0gdG9rZW47IHAuYXJnID0geGxhOwotICB9Ci0KLSAgc3RhdGljIGZpbmFsIGNsYXNzIEpKQ2FsbHMgewotICAgIGludCBnZW47Ci0gICAgVG9rZW4gZmlyc3Q7Ci0gICAgaW50IGFyZzsKLSAgICBKSkNhbGxzIG5leHQ7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMUGFyc2VyQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXJDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY0ZTNhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWUmSmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEpTUEVMUGFyc2VyQ29uc3RhbnRzLmphdmEgKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQRUxQYXJzZXJDb25zdGFudHMgewotCi0gIGludCBFT0YgPSAwOwotICBpbnQgSU5URUdFUl9MSVRFUkFMID0gNTsKLSAgaW50IEZMT0FUSU5HX1BPSU5UX0xJVEVSQUwgPSA2OwotICBpbnQgRVhQT05FTlQgPSA3OwotICBpbnQgU1RSSU5HX0xJVEVSQUwgPSA4OwotICBpbnQgQkFETFlfRVNDQVBFRF9TVFJJTkdfTElURVJBTCA9IDk7Ci0gIGludCBUUlVFID0gMTA7Ci0gIGludCBGQUxTRSA9IDExOwotICBpbnQgTlVMTCA9IDEyOwotICBpbnQgRE9UID0gMTM7Ci0gIGludCBHVDEgPSAxNDsKLSAgaW50IEdUMiA9IDE1OwotICBpbnQgTFQxID0gMTY7Ci0gIGludCBMVDIgPSAxNzsKLSAgaW50IEVRMSA9IDE4OwotICBpbnQgRVEyID0gMTk7Ci0gIGludCBMRTEgPSAyMDsKLSAgaW50IExFMiA9IDIxOwotICBpbnQgR0UxID0gMjI7Ci0gIGludCBHRTIgPSAyMzsKLSAgaW50IE5FUTEgPSAyNDsKLSAgaW50IE5FUTIgPSAyNTsKLSAgaW50IExQQVJFTiA9IDI2OwotICBpbnQgUlBBUkVOID0gMjc7Ci0gIGludCBDT01NQSA9IDI4OwotICBpbnQgQ09MT04gPSAyOTsKLSAgaW50IExCUkFDS0VUID0gMzA7Ci0gIGludCBSQlJBQ0tFVCA9IDMxOwotICBpbnQgUExVUyA9IDMyOwotICBpbnQgTUlOVVMgPSAzMzsKLSAgaW50IE1VTFRJUExZID0gMzQ7Ci0gIGludCBESVZJREUxID0gMzU7Ci0gIGludCBESVZJREUyID0gMzY7Ci0gIGludCBNT0RVTFVTMSA9IDM3OwotICBpbnQgTU9EVUxVUzIgPSAzODsKLSAgaW50IE5PVDEgPSAzOTsKLSAgaW50IE5PVDIgPSA0MDsKLSAgaW50IEFORDEgPSA0MTsKLSAgaW50IEFORDIgPSA0MjsKLSAgaW50IE9SMSA9IDQzOwotICBpbnQgT1IyID0gNDQ7Ci0gIGludCBFTVBUWSA9IDQ1OwotICBpbnQgQ09ORCA9IDQ2OwotICBpbnQgSURFTlRJRklFUiA9IDQ3OwotICBpbnQgSU1QTF9PQkpfU1RBUlQgPSA0ODsKLSAgaW50IExFVFRFUiA9IDQ5OwotICBpbnQgRElHSVQgPSA1MDsKLQotICBpbnQgREVGQVVMVCA9IDA7Ci0KLSAgU3RyaW5nW10gdG9rZW5JbWFnZSA9IHsKLSAgICAiPEVPRj4iLAotICAgICJcIiBcIiIsCi0gICAgIlwiXFx0XCIiLAotICAgICJcIlxcblwiIiwKLSAgICAiXCJcXHJcIiIsCi0gICAgIjxJTlRFR0VSX0xJVEVSQUw+IiwKLSAgICAiPEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw+IiwKLSAgICAiPEVYUE9ORU5UPiIsCi0gICAgIjxTVFJJTkdfTElURVJBTD4iLAotICAgICI8QkFETFlfRVNDQVBFRF9TVFJJTkdfTElURVJBTD4iLAotICAgICJcInRydWVcIiIsCi0gICAgIlwiZmFsc2VcIiIsCi0gICAgIlwibnVsbFwiIiwKLSAgICAiXCIuXCIiLAotICAgICJcIj5cIiIsCi0gICAgIlwiZ3RcIiIsCi0gICAgIlwiPFwiIiwKLSAgICAiXCJsdFwiIiwKLSAgICAiXCI9PVwiIiwKLSAgICAiXCJlcVwiIiwKLSAgICAiXCI8PVwiIiwKLSAgICAiXCJsZVwiIiwKLSAgICAiXCI+PVwiIiwKLSAgICAiXCJnZVwiIiwKLSAgICAiXCIhPVwiIiwKLSAgICAiXCJuZVwiIiwKLSAgICAiXCIoXCIiLAotICAgICJcIilcIiIsCi0gICAgIlwiLFwiIiwKLSAgICAiXCI6XCIiLAotICAgICJcIltcIiIsCi0gICAgIlwiXVwiIiwKLSAgICAiXCIrXCIiLAotICAgICJcIi1cIiIsCi0gICAgIlwiKlwiIiwKLSAgICAiXCIvXCIiLAotICAgICJcImRpdlwiIiwKLSAgICAiXCIlXCIiLAotICAgICJcIm1vZFwiIiwKLSAgICAiXCJub3RcIiIsCi0gICAgIlwiIVwiIiwKLSAgICAiXCJhbmRcIiIsCi0gICAgIlwiJiZcIiIsCi0gICAgIlwib3JcIiIsCi0gICAgIlwifHxcIiIsCi0gICAgIlwiZW1wdHlcIiIsCi0gICAgIlwiP1wiIiwKLSAgICAiPElERU5USUZJRVI+IiwKLSAgICAiXCIjXCIiLAotICAgICI8TEVUVEVSPiIsCi0gICAgIjxESUdJVD4iLAotICB9OwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlclRva2VuTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGIwNGQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlclRva2VuTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZSZKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIuamF2YSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyIGltcGxlbWVudHMgSlNQRUxQYXJzZXJDb25zdGFudHMKLXsKLSAgcHVibGljICBqYXZhLmlvLlByaW50U3RyZWFtIGRlYnVnU3RyZWFtID0gU3lzdGVtLm91dDsKLSAgcHVibGljICB2b2lkIHNldERlYnVnU3RyZWFtKGphdmEuaW8uUHJpbnRTdHJlYW0gZHMpIHsgZGVidWdTdHJlYW0gPSBkczsgfQotcHJpdmF0ZSBmaW5hbCBpbnQgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKGludCBwb3MsIGxvbmcgYWN0aXZlMCkKLXsKLSAgIHN3aXRjaCAocG9zKQotICAgewotICAgICAgY2FzZSAwOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyYWQwMDJhYTljMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA0NzsKLSAgICAgICAgICAgIHJldHVybiA2OwotICAgICAgICAgfQotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgIHJldHVybiAtMTsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjJkMDAwMDAxYzAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNDc7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxOwotICAgICAgICAgICAgcmV0dXJuIDY7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAyYWE4MDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gNjsKLSAgICAgICAgIHJldHVybiAtMTsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAxYzAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNDc7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAyOwotICAgICAgICAgICAgcmV0dXJuIDY7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDJkMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gNjsKLSAgICAgICAgIHJldHVybiAtMTsKLSAgICAgIGNhc2UgMzoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwODAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNDc7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAzOwotICAgICAgICAgICAgcmV0dXJuIDY7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDE0MDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiA2OwotICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICByZXR1cm4gLTE7Ci0gICB9Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqalN0YXJ0TmZhXzAoaW50IHBvcywgbG9uZyBhY3RpdmUwKQotewotICAgcmV0dXJuIGpqTW92ZU5mYV8wKGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMChwb3MsIGFjdGl2ZTApLCBwb3MgKyAxKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqU3RvcEF0UG9zKGludCBwb3MsIGludCBraW5kKQotewotICAgamptYXRjaGVkS2luZCA9IGtpbmQ7Ci0gICBqam1hdGNoZWRQb3MgPSBwb3M7Ci0gICByZXR1cm4gcG9zICsgMTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoaW50IHBvcywgaW50IGtpbmQsIGludCBzdGF0ZSkKLXsKLSAgIGpqbWF0Y2hlZEtpbmQgPSBraW5kOwotICAgamptYXRjaGVkUG9zID0gcG9zOwotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsgcmV0dXJuIHBvcyArIDE7IH0KLSAgIHJldHVybiBqak1vdmVOZmFfMChzdGF0ZSwgcG9zICsgMSk7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMF8wKCkKLXsKLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSAzMzoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA0MDsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MTAwMDAwMEwpOwotICAgICAgY2FzZSAzNzoKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAzNyk7Ci0gICAgICBjYXNlIDM4OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg0MDAwMDAwMDAwMEwpOwotICAgICAgY2FzZSA0MDoKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAyNik7Ci0gICAgICBjYXNlIDQxOgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDI3KTsKLSAgICAgIGNhc2UgNDI6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMzQpOwotICAgICAgY2FzZSA0MzoKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAzMik7Ci0gICAgICBjYXNlIDQ0OgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDI4KTsKLSAgICAgIGNhc2UgNDU6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMzMpOwotICAgICAgY2FzZSA0NjoKLSAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDAsIDEzLCAxKTsKLSAgICAgIGNhc2UgNDc6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMzUpOwotICAgICAgY2FzZSA1ODoKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAyOSk7Ci0gICAgICBjYXNlIDYwOgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDE2OwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgxMDAwMDBMKTsKLSAgICAgIGNhc2UgNjE6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMDAwTCk7Ci0gICAgICBjYXNlIDYyOgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDE0OwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg0MDAwMDBMKTsKLSAgICAgIGNhc2UgNjM6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgNDYpOwotICAgICAgY2FzZSA5MToKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAzMCk7Ci0gICAgICBjYXNlIDkzOgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDMxKTsKLSAgICAgIGNhc2UgOTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDIwMDAwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDEwMDoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MTAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDIwMDAwMDA4MDAwMEwpOwotICAgICAgY2FzZSAxMDI6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDgwMEwpOwotICAgICAgY2FzZSAxMDM6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDgwODAwMEwpOwotICAgICAgY2FzZSAxMDg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDIyMDAwMEwpOwotICAgICAgY2FzZSAxMDk6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMDAwMDAwMDBMKTsKLSAgICAgIGNhc2UgMTEwOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg4MDAyMDAxMDAwTCk7Ci0gICAgICBjYXNlIDExMToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4ODAwMDAwMDAwMDBMKTsKLSAgICAgIGNhc2UgMTE2OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg0MDBMKTsKLSAgICAgIGNhc2UgMTI0OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgxMDAwMDAwMDAwMDBMKTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDAsIDApOwotICAgfQotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMChsb25nIGFjdGl2ZTApCi17Ci0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDAsIGFjdGl2ZTApOwotICAgICAgcmV0dXJuIDE7Ci0gICB9Ci0gICBzd2l0Y2goY3VyQ2hhcikKLSAgIHsKLSAgICAgIGNhc2UgMzg6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgNDIpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDYxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDE4KTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHgxMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAyMCk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMjIpOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAyNCk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgOTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDgwMEwpOwotICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMSwgMjEsIDYpOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMSwgMjMsIDYpOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDEsIDI1LCA2KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMDU6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDEwMDAwMDAwMDBMKTsKLSAgICAgIGNhc2UgMTA5OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgyMDAwMDAwMDAwMDBMKTsKLSAgICAgIGNhc2UgMTEwOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgyMDAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTE6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweGMwMDAwMDAwMDBMKTsKLSAgICAgIGNhc2UgMTEzOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMSwgMTksIDYpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDExNDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDEsIDQzLCA2KTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4NDAwTCk7Ci0gICAgICBjYXNlIDExNjoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMSwgMTUsIDYpOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxLCAxNywgNik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTE3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgxMDAwTCk7Ci0gICAgICBjYXNlIDEyNDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgNDQpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqU3RhcnROZmFfMCgwLCBhY3RpdmUwKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCi17Ci0gICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKLSAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoMCwgb2xkMCk7IAotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgxLCBhY3RpdmUwKTsKLSAgICAgIHJldHVybiAyOwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDEwMDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMiwgMzgsIDYpOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgyLCA0MSwgNik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTA4OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgxODAwTCk7Ci0gICAgICBjYXNlIDExMjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4MjAwMDAwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDExNjoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMiwgMzksIDYpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDExNzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4NDAwTCk7Ci0gICAgICBjYXNlIDExODoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMiwgMzYsIDYpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqU3RhcnROZmFfMCgxLCBhY3RpdmUwKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCi17Ci0gICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKLSAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoMSwgb2xkMCk7IAotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgyLCBhY3RpdmUwKTsKLSAgICAgIHJldHVybiAzOwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCAxMCwgNik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTA4OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCAxMiwgNik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTE1OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHg4MDBMKTsKLSAgICAgIGNhc2UgMTE2OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgyMDAwMDAwMDAwMDBMKTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampTdGFydE5mYV8wKDIsIGFjdGl2ZTApOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQotICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgyLCBvbGQwKTsgCi0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDMsIGFjdGl2ZTApOwotICAgICAgcmV0dXJuIDQ7Ci0gICB9Ci0gICBzd2l0Y2goY3VyQ2hhcikKLSAgIHsKLSAgICAgIGNhc2UgMTAxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDQsIDExLCA2KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMjE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNCwgNDUsIDYpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqU3RhcnROZmFfMCgzLCBhY3RpdmUwKTsKLX0KLXByaXZhdGUgZmluYWwgdm9pZCBqakNoZWNrTkFkZChpbnQgc3RhdGUpCi17Ci0gICBpZiAoampyb3VuZHNbc3RhdGVdICE9IGpqcm91bmQpCi0gICB7Ci0gICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSBzdGF0ZTsKLSAgICAgIGpqcm91bmRzW3N0YXRlXSA9IGpqcm91bmQ7Ci0gICB9Ci19Ci1wcml2YXRlIGZpbmFsIHZvaWQgampBZGRTdGF0ZXMoaW50IHN0YXJ0LCBpbnQgZW5kKQotewotICAgZG8gewotICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gampuZXh0U3RhdGVzW3N0YXJ0XTsKLSAgIH0gd2hpbGUgKHN0YXJ0KysgIT0gZW5kKTsKLX0KLXByaXZhdGUgZmluYWwgdm9pZCBqakNoZWNrTkFkZFR3b1N0YXRlcyhpbnQgc3RhdGUxLCBpbnQgc3RhdGUyKQotewotICAgampDaGVja05BZGQoc3RhdGUxKTsKLSAgIGpqQ2hlY2tOQWRkKHN0YXRlMik7Ci19Ci1wcml2YXRlIGZpbmFsIHZvaWQgampDaGVja05BZGRTdGF0ZXMoaW50IHN0YXJ0LCBpbnQgZW5kKQotewotICAgZG8gewotICAgICAgampDaGVja05BZGQoampuZXh0U3RhdGVzW3N0YXJ0XSk7Ci0gICB9IHdoaWxlIChzdGFydCsrICE9IGVuZCk7Ci19Ci0vL3ByaXZhdGUgZmluYWwgdm9pZCBqakNoZWNrTkFkZFN0YXRlcyhpbnQgc3RhcnQpCi0vL3sKLS8vICAgampDaGVja05BZGQoampuZXh0U3RhdGVzW3N0YXJ0XSk7Ci0vLyAgIGpqQ2hlY2tOQWRkKGpqbmV4dFN0YXRlc1tzdGFydCArIDFdKTsKLS8vfQotc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzAgPSB7Ci0gICAweDFmZjAwMDAwZmZmZmZmZmVMLCAweGZmZmZmZmZmZmZmZmMwMDBMLCAweGZmZmZmZmZmTCwgMHg2MDAwMDAwMDAwMDAwMDBMCi19Owotc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzIgPSB7Ci0gICAweDBMLCAweDBMLCAweDBMLCAweGZmN2ZmZmZmZmY3ZmZmZmZMCi19Owotc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzMgPSB7Ci0gICAweDBMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMCi19Owotc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzQgPSB7Ci0gICAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZMLCAweDBMCi19Owotc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzUgPSB7Ci0gICAweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmZmZmZmZmZmZMLCAweDBMLCAweDBMCi19Owotc3RhdGljIGZpbmFsIGxvbmdbXSBqamJpdFZlYzYgPSB7Ci0gICAweDNmZmZmZmZmZmZmZkwsIDB4MEwsIDB4MEwsIDB4MEwKLX07Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNyA9IHsKLSAgIDB4ZmZmZmZmZmZmZmZmZmZmZUwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwKLX07Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjOCA9IHsKLSAgIDB4MEwsIDB4MEwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwKLX07Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVOZmFfMChpbnQgc3RhcnRTdGF0ZSwgaW50IGN1clBvcykKLXsKLSAgIGludCBzdGFydHNBdCA9IDA7Ci0gICBqam5ld1N0YXRlQ250ID0gMzU7Ci0gICBpbnQgaSA9IDE7Ci0gICBqanN0YXRlU2V0WzBdID0gc3RhcnRTdGF0ZTsKLSAgIGludCBraW5kID0gMHg3ZmZmZmZmZjsKLSAgIGZvciAoOzspCi0gICB7Ci0gICAgICBpZiAoKytqanJvdW5kID09IDB4N2ZmZmZmZmYpCi0gICAgICAgICBSZUluaXRSb3VuZHMoKTsKLSAgICAgIGlmIChjdXJDaGFyIDwgNjQpCi0gICAgICB7Ci0gICAgICAgICBsb25nIGwgPSAxTCA8PCBjdXJDaGFyOwotICAgICAgICAvLyBNYXRjaExvb3A6IAotICAgICAgICAJIGRvCi0gICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goampzdGF0ZVNldFstLWldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA1OwotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMCwgNCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmICgoMHgxODAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA0NykKLSAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA0NzsKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDYpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSAzOSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDUsIDkpOwotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSAzNCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDEwLCAxNCk7Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDQ2KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMSwgMik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyODAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDE4MDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNDcpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNDc7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg2KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMTAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA0NykKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA0NzsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDYpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDUpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNTsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDAsIDQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDUpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNTsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoOSwgMTApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgIT0gNDYpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMTEsIDEyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMTEsIDEyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyODAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxNCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDYpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDE0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygxNSwgMTYpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDI4MDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDE4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxODoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE5OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzQpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxMCwgMTQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZiZmZmZmZmZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxNSwgMTcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzQpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxNSwgMTcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDIzOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzQgJiYga2luZCA+IDgpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gODsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyNDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmYmZmZmZmZmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMjQsIDI1KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyNjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmYmZmZmZmZmZmTCAmIGwpICE9IDBMICYmIGtpbmQgPiA5KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjc6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAzOSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDUsIDkpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZjdmZmZmZmZmZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxOCwgMjApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDMwOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzkpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxOCwgMjApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDMxOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzkgJiYga2luZCA+IDgpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gODsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmY3ZmZmZmZmZmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMzIsIDMzKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzNDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmY3ZmZmZmZmZmZmTCAmIGwpICE9IDBMICYmIGtpbmQgPiA5KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGRlZmF1bHQgOiBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0gd2hpbGUoaSAhPSBzdGFydHNBdCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjdXJDaGFyIDwgMTI4KQotICAgICAgewotICAgICAgICAgbG9uZyBsID0gMUwgPDwgKGN1ckNoYXIgJiAwNzcpOwotICAgICAgICAgLy9NYXRjaExvb3A6IAotICAgICAgICAJIGRvCi0gICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goampzdGF0ZVNldFstLWldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDdmZmZmZmU4N2ZmZmZmZUwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA0NykKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA0NzsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDYpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjAwMDAwMDAyMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDIxLCAyMik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjAwMDAwMDAyMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDIzLCAyNCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjAwMDAwMDAyMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDI1LCAyNik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmZlZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDE1LCAxNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjE6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDIyOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxNSwgMTcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZmZWZmZmZmZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygyNywgMjgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI1OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAyNjsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyNjoKLSAgICAgICAgICAgICAgIGNhc2UgMzQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmZlZmZmZmZmZkwgJiBsKSAhPSAwTCAmJiBraW5kID4gOSkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA5OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZmZWZmZmZmZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxOCwgMjApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI5OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAzMDsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDkyKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTgsIDIwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmZmVmZmZmZmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMjksIDMwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzMzoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDkyKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMzQ7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGRlZmF1bHQgOiBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0gd2hpbGUoaSAhPSBzdGFydHNBdCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBpbnQgaGlCeXRlID0gY3VyQ2hhciA+PiA4OwotICAgICAgICAgaW50IGkxID0gaGlCeXRlID4+IDY7Ci0gICAgICAgICBsb25nIGwxID0gMUwgPDwgKGhpQnl0ZSAmIDA3Nyk7Ci0gICAgICAgICBpbnQgaTIgPSAoY3VyQ2hhciAmIDB4ZmYpID4+IDY7Ci0gICAgICAgICBsb25nIGwyID0gMUwgPDwgKGN1ckNoYXIgJiAwNzcpOwotICAgICAgICAgLy9NYXRjaExvb3A6IAotICAgICAgICAJIGRvCi0gICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goampzdGF0ZVNldFstLWldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICAgICAgaWYgKCFqakNhbk1vdmVfMChoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA0NykKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA0NzsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDYpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgICAgICAgaWYgKGpqQ2FuTW92ZV8xKGhpQnl0ZSwgaTEsIGkyLCBsMSwgbDIpKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMTUsIDE3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyNDoKLSAgICAgICAgICAgICAgICAgIGlmIChqakNhbk1vdmVfMShoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDI3LCAyOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgICAgICBjYXNlIDM0OgotICAgICAgICAgICAgICAgICAgaWYgKGpqQ2FuTW92ZV8xKGhpQnl0ZSwgaTEsIGkyLCBsMSwgbDIpICYmIGtpbmQgPiA5KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjg6Ci0gICAgICAgICAgICAgICAgICBpZiAoampDYW5Nb3ZlXzEoaGlCeXRlLCBpMSwgaTIsIGwxLCBsMikpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygxOCwgMjApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgICAgICAgaWYgKGpqQ2FuTW92ZV8xKGhpQnl0ZSwgaTEsIGkyLCBsMSwgbDIpKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMjksIDMwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgZGVmYXVsdCA6IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgfSB3aGlsZShpICE9IHN0YXJ0c0F0KTsKLSAgICAgIH0KLSAgICAgIGlmIChraW5kICE9IDB4N2ZmZmZmZmYpCi0gICAgICB7Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0ga2luZDsKLSAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IGN1clBvczsKLSAgICAgICAgIGtpbmQgPSAweDdmZmZmZmZmOwotICAgICAgfQotICAgICAgKytjdXJQb3M7Ci0gICAgICBpZiAoKGkgPSBqam5ld1N0YXRlQ250KSA9PSAoc3RhcnRzQXQgPSAzNSAtIChqam5ld1N0YXRlQ250ID0gc3RhcnRzQXQpKSkKLSAgICAgICAgIHJldHVybiBjdXJQb3M7Ci0gICAgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgICAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeyByZXR1cm4gY3VyUG9zOyB9Ci0gICB9Ci19Ci1zdGF0aWMgZmluYWwgaW50W10gampuZXh0U3RhdGVzID0gewotICAgOCwgOSwgMTAsIDE1LCAxNiwgMjgsIDI5LCAzMSwgMzIsIDMzLCAyMCwgMjEsIDIzLCAyNCwgMjUsIDIwLCAKLSAgIDIxLCAyMywgMjgsIDI5LCAzMSwgMywgNCwgMTMsIDE0LCAxNywgMTgsIDI0LCAyNSwgMzIsIDMzLCAKLX07Ci1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGpqQ2FuTW92ZV8wKGludCBoaUJ5dGUsIGludCBpMSwgaW50IGkyLCBsb25nIGwxLCBsb25nIGwyKQotewotICAgc3dpdGNoKGhpQnl0ZSkKLSAgIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMltpMl0gJiBsMikgIT0gMEwpOwotICAgICAgY2FzZSA0ODoKLSAgICAgICAgIHJldHVybiAoKGpqYml0VmVjM1tpMl0gJiBsMikgIT0gMEwpOwotICAgICAgY2FzZSA0OToKLSAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNFtpMl0gJiBsMikgIT0gMEwpOwotICAgICAgY2FzZSA1MToKLSAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNVtpMl0gJiBsMikgIT0gMEwpOwotICAgICAgY2FzZSA2MToKLSAgICAgICAgIHJldHVybiAoKGpqYml0VmVjNltpMl0gJiBsMikgIT0gMEwpOwotICAgICAgZGVmYXVsdCA6IAotICAgICAgICAgaWYgKChqamJpdFZlYzBbaTFdICYgbDEpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICB9Ci19Ci1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGpqQ2FuTW92ZV8xKGludCBoaUJ5dGUsIGludCBpMSwgaW50IGkyLCBsb25nIGwxLCBsb25nIGwyKQotewotICAgc3dpdGNoKGhpQnl0ZSkKLSAgIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgIHJldHVybiAoKGpqYml0VmVjOFtpMl0gJiBsMikgIT0gMEwpOwotICAgICAgZGVmYXVsdCA6IAotICAgICAgICAgaWYgKChqamJpdFZlYzdbaTFdICYgbDEpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICB9Ci19Ci1wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGpqc3RyTGl0ZXJhbEltYWdlcyA9IHsKLSIiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiXDE2NFwxNjJcMTY1XDE0NSIsIAotIlwxNDZcMTQxXDE1NFwxNjNcMTQ1IiwgIlwxNTZcMTY1XDE1NFwxNTQiLCAiXDU2IiwgIlw3NiIsICJcMTQ3XDE2NCIsICJcNzQiLCAiXDE1NFwxNjQiLCAiXDc1XDc1IiwgCi0iXDE0NVwxNjEiLCAiXDc0XDc1IiwgIlwxNTRcMTQ1IiwgIlw3Nlw3NSIsICJcMTQ3XDE0NSIsICJcNDFcNzUiLCAiXDE1NlwxNDUiLCAiXDUwIiwgCi0iXDUxIiwgIlw1NCIsICJcNzIiLCAiXDEzMyIsICJcMTM1IiwgIlw1MyIsICJcNTUiLCAiXDUyIiwgIlw1NyIsICJcMTQ0XDE1MVwxNjYiLCAKLSJcNDUiLCAiXDE1NVwxNTdcMTQ0IiwgIlwxNTZcMTU3XDE2NCIsICJcNDEiLCAiXDE0MVwxNTZcMTQ0IiwgIlw0Nlw0NiIsICJcMTU3XDE2MiIsIAotIlwxNzRcMTc0IiwgIlwxNDVcMTU1XDE2MFwxNjRcMTcxIiwgIlw3NyIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIH07Ci1wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGxleFN0YXRlTmFtZXMgPSB7Ci0gICAiREVGQVVMVCIsIAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gamp0b1Rva2VuID0gewotICAgMHhmZmZmZmZmZmZmNjFMLCAKLX07Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqdG9Ta2lwID0gewotICAgMHgxZUwsIAotfTsKLXByb3RlY3RlZCBTaW1wbGVDaGFyU3RyZWFtIGlucHV0X3N0cmVhbTsKLXByaXZhdGUgZmluYWwgaW50W10gampyb3VuZHMgPSBuZXcgaW50WzM1XTsKLXByaXZhdGUgZmluYWwgaW50W10gampzdGF0ZVNldCA9IG5ldyBpbnRbNzBdOwotcHJvdGVjdGVkIGNoYXIgY3VyQ2hhcjsKLXB1YmxpYyBKU1BFTFBhcnNlclRva2VuTWFuYWdlcihTaW1wbGVDaGFyU3RyZWFtIHN0cmVhbSkKLXsKLSAgIGlmIChTaW1wbGVDaGFyU3RyZWFtLnN0YXRpY0ZsYWcpCi0gICAgICB0aHJvdyBuZXcgRXJyb3IoIkVSUk9SOiBDYW5ub3QgdXNlIGEgc3RhdGljIENoYXJTdHJlYW0gY2xhc3Mgd2l0aCBhIG5vbi1zdGF0aWMgbGV4aWNhbCBhbmFseXplci4iKTsKLSAgIGlucHV0X3N0cmVhbSA9IHN0cmVhbTsKLX0KLXB1YmxpYyBKU1BFTFBhcnNlclRva2VuTWFuYWdlcihTaW1wbGVDaGFyU3RyZWFtIHN0cmVhbSwgaW50IGxleFN0YXRlKQotewotICAgdGhpcyhzdHJlYW0pOwotICAgU3dpdGNoVG8obGV4U3RhdGUpOwotfQotcHVibGljIHZvaWQgUmVJbml0KFNpbXBsZUNoYXJTdHJlYW0gc3RyZWFtKQotewotICAgamptYXRjaGVkUG9zID0gampuZXdTdGF0ZUNudCA9IDA7Ci0gICBjdXJMZXhTdGF0ZSA9IGRlZmF1bHRMZXhTdGF0ZTsKLSAgIGlucHV0X3N0cmVhbSA9IHN0cmVhbTsKLSAgIFJlSW5pdFJvdW5kcygpOwotfQotcHJpdmF0ZSBmaW5hbCB2b2lkIFJlSW5pdFJvdW5kcygpCi17Ci0gICBpbnQgaTsKLSAgIGpqcm91bmQgPSAweDgwMDAwMDAxOwotICAgZm9yIChpID0gMzU7IGktLSA+IDA7KQotICAgICAgampyb3VuZHNbaV0gPSAweDgwMDAwMDAwOwotfQotcHVibGljIHZvaWQgUmVJbml0KFNpbXBsZUNoYXJTdHJlYW0gc3RyZWFtLCBpbnQgbGV4U3RhdGUpCi17Ci0gICBSZUluaXQoc3RyZWFtKTsKLSAgIFN3aXRjaFRvKGxleFN0YXRlKTsKLX0KLXB1YmxpYyB2b2lkIFN3aXRjaFRvKGludCBsZXhTdGF0ZSkKLXsKLSAgIGlmIChsZXhTdGF0ZSA+PSAxIHx8IGxleFN0YXRlIDwgMCkKLSAgICAgIHRocm93IG5ldyBUb2tlbk1nckVycm9yKCJFcnJvcjogSWdub3JpbmcgaW52YWxpZCBsZXhpY2FsIHN0YXRlIDogIiArIGxleFN0YXRlICsgIi4gU3RhdGUgdW5jaGFuZ2VkLiIsIFRva2VuTWdyRXJyb3IuSU5WQUxJRF9MRVhJQ0FMX1NUQVRFKTsKLSAgIGVsc2UKLSAgICAgIGN1ckxleFN0YXRlID0gbGV4U3RhdGU7Ci19Ci0KLXByb3RlY3RlZCBUb2tlbiBqakZpbGxUb2tlbigpCi17Ci0gICBUb2tlbiB0ID0gVG9rZW4ubmV3VG9rZW4oamptYXRjaGVkS2luZCk7Ci0gICB0LmtpbmQgPSBqam1hdGNoZWRLaW5kOwotICAgU3RyaW5nIGltID0gampzdHJMaXRlcmFsSW1hZ2VzW2pqbWF0Y2hlZEtpbmRdOwotICAgdC5pbWFnZSA9IChpbSA9PSBudWxsKSA/IGlucHV0X3N0cmVhbS5HZXRJbWFnZSgpIDogaW07Ci0gICB0LmJlZ2luTGluZSA9IGlucHV0X3N0cmVhbS5nZXRCZWdpbkxpbmUoKTsKLSAgIHQuYmVnaW5Db2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0QmVnaW5Db2x1bW4oKTsKLSAgIHQuZW5kTGluZSA9IGlucHV0X3N0cmVhbS5nZXRFbmRMaW5lKCk7Ci0gICB0LmVuZENvbHVtbiA9IGlucHV0X3N0cmVhbS5nZXRFbmRDb2x1bW4oKTsKLSAgIHJldHVybiB0OwotfQotCi1pbnQgY3VyTGV4U3RhdGUgPSAwOwotaW50IGRlZmF1bHRMZXhTdGF0ZSA9IDA7Ci1pbnQgampuZXdTdGF0ZUNudDsKLWludCBqanJvdW5kOwotaW50IGpqbWF0Y2hlZFBvczsKLWludCBqam1hdGNoZWRLaW5kOwotCi1wdWJsaWMgVG9rZW4gZ2V0TmV4dFRva2VuKCkgCi17Ci0gIFRva2VuIG1hdGNoZWRUb2tlbjsKLSAgaW50IGN1clBvcyA9IDA7Ci0KLSAgRU9GTG9vcCA6Ci0gIGZvciAoOzspCi0gIHsgICAKLSAgIHRyeSAgIAotICAgeyAgICAgCi0gICAgICBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLkJlZ2luVG9rZW4oKTsKLSAgIH0gICAgIAotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKQotICAgeyAgICAgICAgCi0gICAgICBqam1hdGNoZWRLaW5kID0gMDsKLSAgICAgIG1hdGNoZWRUb2tlbiA9IGpqRmlsbFRva2VuKCk7Ci0gICAgICByZXR1cm4gbWF0Y2hlZFRva2VuOwotICAgfQotCi0gICB0cnkgeyBpbnB1dF9zdHJlYW0uYmFja3VwKDApOwotICAgICAgd2hpbGUgKGN1ckNoYXIgPD0gMzIgJiYgKDB4MTAwMDAyNjAwTCAmICgxTCA8PCBjdXJDaGFyKSkgIT0gMEwpCi0gICAgICAgICBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLkJlZ2luVG9rZW4oKTsKLSAgIH0KLSAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUxKSB7IGNvbnRpbnVlIEVPRkxvb3A7IH0KLSAgIGpqbWF0Y2hlZEtpbmQgPSAweDdmZmZmZmZmOwotICAgamptYXRjaGVkUG9zID0gMDsKLSAgIGN1clBvcyA9IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEwXzAoKTsKLSAgIGlmIChqam1hdGNoZWRLaW5kICE9IDB4N2ZmZmZmZmYpCi0gICB7Ci0gICAgICBpZiAoamptYXRjaGVkUG9zICsgMSA8IGN1clBvcykKLSAgICAgICAgIGlucHV0X3N0cmVhbS5iYWNrdXAoY3VyUG9zIC0gamptYXRjaGVkUG9zIC0gMSk7Ci0gICAgICBpZiAoKGpqdG9Ub2tlbltqam1hdGNoZWRLaW5kID4+IDZdICYgKDFMIDw8IChqam1hdGNoZWRLaW5kICYgMDc3KSkpICE9IDBMKQotICAgICAgewotICAgICAgICAgbWF0Y2hlZFRva2VuID0gampGaWxsVG9rZW4oKTsKLSAgICAgICAgIHJldHVybiBtYXRjaGVkVG9rZW47Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBjb250aW51ZSBFT0ZMb29wOwotICAgICAgfQotICAgfQotICAgaW50IGVycm9yX2xpbmUgPSBpbnB1dF9zdHJlYW0uZ2V0RW5kTGluZSgpOwotICAgaW50IGVycm9yX2NvbHVtbiA9IGlucHV0X3N0cmVhbS5nZXRFbmRDb2x1bW4oKTsKLSAgIFN0cmluZyBlcnJvcl9hZnRlciA9IG51bGw7Ci0gICBib29sZWFuIEVPRlNlZW4gPSBmYWxzZTsKLSAgIHRyeSB7IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyBpbnB1dF9zdHJlYW0uYmFja3VwKDEpOyB9Ci0gICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlMSkgewotICAgICAgRU9GU2VlbiA9IHRydWU7Ci0gICAgICBlcnJvcl9hZnRlciA9IGN1clBvcyA8PSAxID8gIiIgOiBpbnB1dF9zdHJlYW0uR2V0SW1hZ2UoKTsKLSAgICAgIGlmIChjdXJDaGFyID09ICdcbicgfHwgY3VyQ2hhciA9PSAnXHInKSB7Ci0gICAgICAgICBlcnJvcl9saW5lKys7Ci0gICAgICAgICBlcnJvcl9jb2x1bW4gPSAwOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICAgZXJyb3JfY29sdW1uKys7Ci0gICB9Ci0gICBpZiAoIUVPRlNlZW4pIHsKLSAgICAgIGlucHV0X3N0cmVhbS5iYWNrdXAoMSk7Ci0gICAgICBlcnJvcl9hZnRlciA9IGN1clBvcyA8PSAxID8gIiIgOiBpbnB1dF9zdHJlYW0uR2V0SW1hZ2UoKTsKLSAgIH0KLSAgIHRocm93IG5ldyBUb2tlbk1nckVycm9yKEVPRlNlZW4sIGN1ckxleFN0YXRlLCBlcnJvcl9saW5lLCBlcnJvcl9jb2x1bW4sIGVycm9yX2FmdGVyLCBjdXJDaGFyLCBUb2tlbk1nckVycm9yLkxFWElDQUxfRVJST1IpOwotICB9Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlclRyZWVDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlclRyZWVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhNmU0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXJUcmVlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gSlNQRUxQYXJzZXJUcmVlQ29uc3RhbnRzLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGludGVyZmFjZSBKU1BFTFBhcnNlclRyZWVDb25zdGFudHMKLXsKLSAgcHVibGljIGludCBKSlRFWFBSRVNTSU9OID0gMDsKLSAgcHVibGljIGludCBKSlRPUkVYUFJFU1NJT04gPSAxOwotICBwdWJsaWMgaW50IEpKVEFOREVYUFJFU1NJT04gPSAyOwotICBwdWJsaWMgaW50IEpKVEVRVUFMSVRZRVhQUkVTU0lPTiA9IDM7Ci0gIHB1YmxpYyBpbnQgSkpUUkVMQVRJT05BTEVYUFJFU1NJT04gPSA0OwotICBwdWJsaWMgaW50IEpKVEFEREVYUFJFU1NJT04gPSA1OwotICBwdWJsaWMgaW50IEpKVE1VTFRJUExZRVhQUkVTU0lPTiA9IDY7Ci0gIHB1YmxpYyBpbnQgSkpUQ0hPSUNFRVhQUkVTU0lPTiA9IDc7Ci0gIHB1YmxpYyBpbnQgSkpUVU5BUllFWFBSRVNTSU9OID0gODsKLSAgcHVibGljIGludCBKSlRWQUxVRSA9IDk7Ci0gIHB1YmxpYyBpbnQgSkpUVkFMVUVQUkVGSVggPSAxMDsKLSAgcHVibGljIGludCBKSlRWQUxVRVNVRkZJWCA9IDExOwotICBwdWJsaWMgaW50IEpKVEZVTkNUSU9OSU5WT0NBVElPTiA9IDEyOwotICBwdWJsaWMgaW50IEpKVExJVEVSQUwgPSAxMzsKLQotCi0gIHB1YmxpYyBTdHJpbmdbXSBqanROb2RlTmFtZSA9IHsKLSAgICAiRXhwcmVzc2lvbiIsCi0gICAgIk9yRXhwcmVzc2lvbiIsCi0gICAgIkFuZEV4cHJlc3Npb24iLAotICAgICJFcXVhbGl0eUV4cHJlc3Npb24iLAotICAgICJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsCi0gICAgIkFkZEV4cHJlc3Npb24iLAotICAgICJNdWx0aXBseUV4cHJlc3Npb24iLAotICAgICJDaG9pY2VFeHByZXNzaW9uIiwKLSAgICAiVW5hcnlFeHByZXNzaW9uIiwKLSAgICAiVmFsdWUiLAotICAgICJWYWx1ZVByZWZpeCIsCi0gICAgIlZhbHVlU3VmZml4IiwKLSAgICAiRnVuY3Rpb25JbnZvY2F0aW9uIiwKLSAgICAiTGl0ZXJhbCIsCi0gIH07Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXJWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXJWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmY2Y0OTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMUGFyc2VyVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEpTUEVMUGFyc2VyVmlzaXRvci5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQRUxQYXJzZXJWaXNpdG9yCi17Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoU2ltcGxlTm9kZSBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUT3JFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBbmRFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFcXVhbGl0eUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBZGRFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RNdWx0aXBseUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVENob2ljZUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFVuYXJ5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFsdWUgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhbHVlUHJlZml4IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYWx1ZVN1ZmZpeCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURnVuY3Rpb25JbnZvY2F0aW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RMaXRlcmFsIG5vZGUsIE9iamVjdCBkYXRhKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFRyYW5zbGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ1ZjllNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcGVsLkVMUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZWwuSUpTUEVMVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQkKLXB1YmxpYyBjbGFzcyBKU1BFTFRyYW5zbGF0b3IgaW1wbGVtZW50cyBJSlNQRUxUcmFuc2xhdG9yIHsKLQkvKioKLQkgKiBKU1AgRXhwcmVzc2lvbiBMYW5ndWFnZSBQYXJzZXIuCi0JICovCi0JcHJpdmF0ZSBKU1BFTFBhcnNlciBlbFBhcnNlciA9IG51bGw7Ci0JCi0JcHVibGljIExpc3QgdHJhbnNsYXRlRUwoU3RyaW5nIGVsVGV4dCwgU3RyaW5nIGRlbGltLAotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSwgaW50IGNvbnRlbnRTdGFydCwKLQkJCWludCBjb250ZW50TGVuZ3RoLCBTdHJpbmdCdWZmZXIgZlVzZXJFTEV4cHJlc3Npb25zLAotCQkJSGFzaE1hcCBmVXNlckVMUmFuZ2VzLCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCQotCQlBcnJheUxpc3QgZWxQcm9ibGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZWQodGhpcykgewotCQkJCWlmKG51bGwgPT0gZWxQYXJzZXIpIHsKLQkJCQkJZWxQYXJzZXIgPSBKU1BFTFBhcnNlci5jcmVhdGVQYXJzZXIoZWxUZXh0KTsKLQkJCQl9IGVsc2UgewotCQkJCQllbFBhcnNlci5SZUluaXQoZWxUZXh0KTsKLQkJCQl9Ci0JCQkKLQkJCQlBU1RFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBlbFBhcnNlci5FeHByZXNzaW9uKCk7Ci0JCQkJRUxHZW5lcmF0b3IgZ2VuID0gbmV3IEVMR2VuZXJhdG9yKCk7Ci0JCQkJZ2VuLmdlbmVyYXRlKGV4cHJlc3Npb24sIGN1cnJlbnROb2RlLCBmVXNlckVMRXhwcmVzc2lvbnMsIGZVc2VyRUxSYW5nZXMsIGRvY3VtZW50LCBjdXJyZW50Tm9kZSwgY29udGVudFN0YXJ0LCBjb250ZW50TGVuZ3RoKTsKLQkJCX0KLQkJfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotCQkJVG9rZW4gY3VyVG9rID0gZS5jdXJyZW50VG9rZW47Ci0JCQlpbnQgcHJvYmxlbVN0YXJ0T2Zmc2V0OwotCQkJaW50IHByb2JsZW1FbmRPZmZzZXQ7Ci0JCQlQb3NpdGlvbiBwb3MgPSBudWxsOwotCQkJcHJvYmxlbVN0YXJ0T2Zmc2V0ID0gIGNvbnRlbnRTdGFydCArIGN1clRvay5iZWdpbkNvbHVtbjsKLQkJCXByb2JsZW1FbmRPZmZzZXQgPSBjb250ZW50U3RhcnQgKyBjdXJUb2suZW5kQ29sdW1uOwotCQkJCi0JCQlwb3MgPSBuZXcgUG9zaXRpb24ocHJvYmxlbVN0YXJ0T2Zmc2V0LCBwcm9ibGVtRW5kT2Zmc2V0IC0gcHJvYmxlbVN0YXJ0T2Zmc2V0ICsgMSk7Ci0JCQllbFByb2JsZW1zLmFkZChuZXcgRUxQcm9ibGVtKHBvcywgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpKTsKLQkJfSBjYXRjaCAoVG9rZW5NZ3JFcnJvciB0ZSkgewotCQkJUG9zaXRpb24gcG9zID0gbmV3IFBvc2l0aW9uKGNvbnRlbnRTdGFydCwgY29udGVudExlbmd0aCk7Ci0JCQllbFByb2JsZW1zLmFkZChuZXcgRUxQcm9ibGVtKHBvcywgSlNQQ29yZU1lc3NhZ2VzLkpTUEVMX1Rva2VuKSk7Ci0JCX0KLQkJcmV0dXJuIGVsUHJvYmxlbXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL05vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YTE4NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL05vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBOb2RlLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotLyogQWxsIEFTVCBub2RlcyBtdXN0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4gIEl0IHByb3ZpZGVzIGJhc2ljCi0gICBtYWNoaW5lcnkgZm9yIGNvbnN0cnVjdGluZyB0aGUgcGFyZW50IGFuZCBjaGlsZCByZWxhdGlvbnNoaXBzCi0gICBiZXR3ZWVuIG5vZGVzLiAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIE5vZGUgewotCi0gIC8qKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIG5vZGUgaGFzIGJlZW4gbWFkZSB0aGUgY3VycmVudAotICAgIG5vZGUuICBJdCBpbmRpY2F0ZXMgdGhhdCBjaGlsZCBub2RlcyBjYW4gbm93IGJlIGFkZGVkIHRvIGl0LiAqLwotICBwdWJsaWMgdm9pZCBqanRPcGVuKCk7Ci0KLSAgLyoqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlIGNoaWxkIG5vZGVzIGhhdmUgYmVlbgotICAgIGFkZGVkLiAqLwotICBwdWJsaWMgdm9pZCBqanRDbG9zZSgpOwotCi0gIC8qKiBUaGlzIHBhaXIgb2YgbWV0aG9kcyBhcmUgdXNlZCB0byBpbmZvcm0gdGhlIG5vZGUgb2YgaXRzCi0gICAgcGFyZW50LiAqLwotICBwdWJsaWMgdm9pZCBqanRTZXRQYXJlbnQoTm9kZSBuKTsKLSAgcHVibGljIE5vZGUgamp0R2V0UGFyZW50KCk7Ci0KLSAgLyoqIFRoaXMgbWV0aG9kIHRlbGxzIHRoZSBub2RlIHRvIGFkZCBpdHMgYXJndW1lbnQgdG8gdGhlIG5vZGUncwotICAgIGxpc3Qgb2YgY2hpbGRyZW4uICAqLwotICBwdWJsaWMgdm9pZCBqanRBZGRDaGlsZChOb2RlIG4sIGludCBpKTsKLQotICAvKiogVGhpcyBtZXRob2QgcmV0dXJucyBhIGNoaWxkIG5vZGUuICBUaGUgY2hpbGRyZW4gYXJlIG51bWJlcmVkCi0gICAgIGZyb20gemVybywgbGVmdCB0byByaWdodC4gKi8KLSAgcHVibGljIE5vZGUgamp0R2V0Q2hpbGQoaW50IGkpOwotCi0gIC8qKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGUgbm9kZSBoYXMuICovCi0gIHB1YmxpYyBpbnQgamp0R2V0TnVtQ2hpbGRyZW4oKTsKLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9QYXJzZUV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1BhcnNlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZDUwODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1BhcnNlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFBhcnNlRXhjZXB0aW9uLmphdmEgVmVyc2lvbiAzLjAgKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLS8qKgotICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gcGFyc2UgZXJyb3JzIGFyZSBlbmNvdW50ZXJlZC4KLSAqIFlvdSBjYW4gZXhwbGljaXRseSBjcmVhdGUgb2JqZWN0cyBvZiB0aGlzIGV4Y2VwdGlvbiB0eXBlIGJ5Ci0gKiBjYWxsaW5nIHRoZSBtZXRob2QgZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbiBpbiB0aGUgZ2VuZXJhdGVkCi0gKiBwYXJzZXIuCi0gKgotICogWW91IGNhbiBtb2RpZnkgdGhpcyBjbGFzcyB0byBjdXN0b21pemUgeW91ciBlcnJvciByZXBvcnRpbmcKLSAqIG1lY2hhbmlzbXMgc28gbG9uZyBhcyB5b3UgcmV0YWluIHRoZSBwdWJsaWMgZmllbGRzLgotICovCi1wdWJsaWMgY2xhc3MgUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gIC8qKgotCSAqIERlZmF1bHQgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgbWV0aG9kICJnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uIgotICAgKiBpbiB0aGUgZ2VuZXJhdGVkIHBhcnNlci4gIENhbGxpbmcgdGhpcyBjb25zdHJ1Y3RvciBnZW5lcmF0ZXMKLSAgICogYSBuZXcgb2JqZWN0IG9mIHRoaXMgdHlwZSB3aXRoIHRoZSBmaWVsZHMgImN1cnJlbnRUb2tlbiIsCi0gICAqICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiwgYW5kICJ0b2tlbkltYWdlIiBzZXQuICBUaGUgYm9vbGVhbgotICAgKiBmbGFnICJzcGVjaWFsQ29uc3RydWN0b3IiIGlzIGFsc28gc2V0IHRvIHRydWUgdG8gaW5kaWNhdGUgdGhhdAotICAgKiB0aGlzIGNvbnN0cnVjdG9yIHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGlzIG9iamVjdC4KLSAgICogVGhpcyBjb25zdHJ1Y3RvciBjYWxscyBpdHMgc3VwZXIgY2xhc3Mgd2l0aCB0aGUgZW1wdHkgc3RyaW5nCi0gICAqIHRvIGZvcmNlIHRoZSAidG9TdHJpbmciIG1ldGhvZCBvZiBwYXJlbnQgY2xhc3MgIlRocm93YWJsZSIgdG8KLSAgICogcHJpbnQgdGhlIGVycm9yIG1lc3NhZ2UgaW4gdGhlIGZvcm06Ci0gICAqICAgICBQYXJzZUV4Y2VwdGlvbjogPHJlc3VsdCBvZiBnZXRNZXNzYWdlPgotICAgKi8KLSAgcHVibGljIFBhcnNlRXhjZXB0aW9uKFRva2VuIGN1cnJlbnRUb2tlblZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludFtdW10gZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHRva2VuSW1hZ2VWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgKQotICB7Ci0gICAgc3VwZXIoIiIpOwotICAgIHNwZWNpYWxDb25zdHJ1Y3RvciA9IHRydWU7Ci0gICAgY3VycmVudFRva2VuID0gY3VycmVudFRva2VuVmFsOwotICAgIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMgPSBleHBlY3RlZFRva2VuU2VxdWVuY2VzVmFsOwotICAgIHRva2VuSW1hZ2UgPSB0b2tlbkltYWdlVmFsOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBmb2xsb3dpbmcgY29uc3RydWN0b3JzIGFyZSBmb3IgdXNlIGJ5IHlvdSBmb3Igd2hhdGV2ZXIKLSAgICogcHVycG9zZSB5b3UgY2FuIHRoaW5rIG9mLiAgQ29uc3RydWN0aW5nIHRoZSBleGNlcHRpb24gaW4gdGhpcwotICAgKiBtYW5uZXIgbWFrZXMgdGhlIGV4Y2VwdGlvbiBiZWhhdmUgaW4gdGhlIG5vcm1hbCB3YXkgLSBpLmUuLCBhcwotICAgKiBkb2N1bWVudGVkIGluIHRoZSBjbGFzcyAiVGhyb3dhYmxlIi4gIFRoZSBmaWVsZHMgImVycm9yVG9rZW4iLAotICAgKiAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIsIGFuZCAidG9rZW5JbWFnZSIgZG8gbm90IGNvbnRhaW4KLSAgICogcmVsZXZhbnQgaW5mb3JtYXRpb24uICBUaGUgSmF2YUNDIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IHVzZQotICAgKiB0aGVzZSBjb25zdHJ1Y3RvcnMuCi0gICAqLwotCi0gIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbigpIHsKLSAgICBzdXBlcigpOwotICAgIHNwZWNpYWxDb25zdHJ1Y3RvciA9IGZhbHNlOwotICB9Ci0KLSAgcHVibGljIFBhcnNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgc3BlY2lhbENvbnN0cnVjdG9yID0gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyB2YXJpYWJsZSBkZXRlcm1pbmVzIHdoaWNoIGNvbnN0cnVjdG9yIHdhcyB1c2VkIHRvIGNyZWF0ZQotICAgKiB0aGlzIG9iamVjdCBhbmQgdGhlcmVieSBhZmZlY3RzIHRoZSBzZW1hbnRpY3Mgb2YgdGhlCi0gICAqICJnZXRNZXNzYWdlIiBtZXRob2QgKHNlZSBiZWxvdykuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzcGVjaWFsQ29uc3RydWN0b3I7Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgdGhlIGxhc3QgdG9rZW4gdGhhdCBoYXMgYmVlbiBjb25zdW1lZCBzdWNjZXNzZnVsbHkuICBJZgotICAgKiB0aGlzIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkIGR1ZSB0byBhIHBhcnNlIGVycm9yLCB0aGUgdG9rZW4KLSAgICogZm9sbG93bmcgdGhpcyB0b2tlbiB3aWxsICh0aGVyZWZvcmUpIGJlIHRoZSBmaXJzdCBlcnJvciB0b2tlbi4KLSAgICovCi0gIHB1YmxpYyBUb2tlbiBjdXJyZW50VG9rZW47Ci0KLSAgLyoqCi0gICAqIEVhY2ggZW50cnkgaW4gdGhpcyBhcnJheSBpcyBhbiBhcnJheSBvZiBpbnRlZ2Vycy4gIEVhY2ggYXJyYXkKLSAgICogb2YgaW50ZWdlcnMgcmVwcmVzZW50cyBhIHNlcXVlbmNlIG9mIHRva2VucyAoYnkgdGhlaXIgb3JkaW5hbAotICAgKiB2YWx1ZXMpIHRoYXQgaXMgZXhwZWN0ZWQgYXQgdGhpcyBwb2ludCBvZiB0aGUgcGFyc2UuCi0gICAqLwotICBwdWJsaWMgaW50W11bXSBleHBlY3RlZFRva2VuU2VxdWVuY2VzOwotCi0gIC8qKgotICAgKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSAidG9rZW5JbWFnZSIgYXJyYXkgb2YgdGhlIGdlbmVyYXRlZAotICAgKiBwYXJzZXIgd2l0aGluIHdoaWNoIHRoZSBwYXJzZSBlcnJvciBvY2N1cnJlZC4gIFRoaXMgYXJyYXkgaXMKLSAgICogZGVmaW5lZCBpbiB0aGUgZ2VuZXJhdGVkIC4uLkNvbnN0YW50cyBpbnRlcmZhY2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gdG9rZW5JbWFnZTsKLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgaGFzIHRoZSBzdGFuZGFyZCBiZWhhdmlvciB3aGVuIHRoaXMgb2JqZWN0IGhhcyBiZWVuCi0gICAqIGNyZWF0ZWQgdXNpbmcgdGhlIHN0YW5kYXJkIGNvbnN0cnVjdG9ycy4gIE90aGVyd2lzZSwgaXQgdXNlcwotICAgKiAiY3VycmVudFRva2VuIiBhbmQgImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiIHRvIGdlbmVyYXRlIGEgcGFyc2UKLSAgICogZXJyb3IgbWVzc2FnZSBhbmQgcmV0dXJucyBpdC4gIElmIHRoaXMgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQKLSAgICogZHVlIHRvIGEgcGFyc2UgZXJyb3IsIGFuZCB5b3UgZG8gbm90IGNhdGNoIGl0IChpdCBnZXRzIHRocm93bgotICAgKiBmcm9tIHRoZSBwYXJzZXIpLCB0aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBkdXJpbmcgdGhlIHByaW50aW5nCi0gICAqIG9mIHRoZSBmaW5hbCBzdGFjayB0cmFjZSwgYW5kIGhlbmNlIHRoZSBjb3JyZWN0IGVycm9yIG1lc3NhZ2UKLSAgICogZ2V0cyBkaXNwbGF5ZWQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0gICAgaWYgKCFzcGVjaWFsQ29uc3RydWN0b3IpIHsKLSAgICAgIHJldHVybiBzdXBlci5nZXRNZXNzYWdlKCk7Ci0gICAgfQotICAgIFN0cmluZyBleHBlY3RlZCA9ICIiOwotICAgIGludCBtYXhTaXplID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgIGlmIChtYXhTaXplIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGgpIHsKLSAgICAgICAgbWF4U2l6ZSA9IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoOwotICAgICAgfQotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgIGV4cGVjdGVkICs9IHRva2VuSW1hZ2VbZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXVtqXV0gKyAiICI7Ci0gICAgICB9Ci0gICAgICBpZiAoZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXVtleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aCAtIDFdICE9IDApIHsKLSAgICAgICAgZXhwZWN0ZWQgKz0gIi4uLiI7Ci0gICAgICB9Ci0gICAgICBleHBlY3RlZCArPSBlb2wgKyAiICAgICI7Ci0gICAgfQotICAgIFN0cmluZyByZXR2YWwgPSAiRW5jb3VudGVyZWQgXCIiOwotICAgIFRva2VuIHRvayA9IGN1cnJlbnRUb2tlbi5uZXh0OwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4U2l6ZTsgaSsrKSB7Ci0gICAgICBpZiAoaSAhPSAwKSByZXR2YWwgKz0gIiAiOwotICAgICAgaWYgKHRvay5raW5kID09IDApIHsKLSAgICAgICAgcmV0dmFsICs9IHRva2VuSW1hZ2VbMF07Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgcmV0dmFsICs9IGFkZF9lc2NhcGVzKHRvay5pbWFnZSk7Ci0gICAgICB0b2sgPSB0b2submV4dDsgCi0gICAgfQotICAgIHJldHZhbCArPSAiXCIgYXQgbGluZSAiICsgY3VycmVudFRva2VuLm5leHQuYmVnaW5MaW5lICsgIiwgY29sdW1uICIgKyBjdXJyZW50VG9rZW4ubmV4dC5iZWdpbkNvbHVtbjsKLSAgICByZXR2YWwgKz0gIi4iICsgZW9sOwotICAgIGlmIChleHBlY3RlZFRva2VuU2VxdWVuY2VzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICByZXR2YWwgKz0gIldhcyBleHBlY3Rpbmc6IiArIGVvbCArICIgICAgIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dmFsICs9ICJXYXMgZXhwZWN0aW5nIG9uZSBvZjoiICsgZW9sICsgIiAgICAiOwotICAgIH0KLSAgICByZXR2YWwgKz0gZXhwZWN0ZWQ7Ci0gICAgcmV0dXJuIHJldHZhbDsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgZW5kIG9mIGxpbmUgc3RyaW5nIGZvciB0aGlzIG1hY2hpbmUuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGVvbCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLCAiXG4iKTsKLSAKLSAgLyoqCi0gICAqIFVzZWQgdG8gY29udmVydCByYXcgY2hhcmFjdGVycyB0byB0aGVpciBlc2NhcGVkIHZlcnNpb24KLSAgICogd2hlbiB0aGVzZSByYXcgdmVyc2lvbiBjYW5ub3QgYmUgdXNlZCBhcyBwYXJ0IG9mIGFuIEFTQ0lJCi0gICAqIHN0cmluZyBsaXRlcmFsLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBhZGRfZXNjYXBlcyhTdHJpbmcgc3RyKSB7Ci0gICAgICBTdHJpbmdCdWZmZXIgcmV0dmFsID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgY2hhciBjaDsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgc3dpdGNoIChzdHIuY2hhckF0KGkpKQotICAgICAgICB7Ci0gICAgICAgICAgIGNhc2UgMCA6Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcYic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcYiIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXHQnOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHQiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxuIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcZic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcZiIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHIiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1wiJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcIiIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXCcnOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwnIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXFwiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIGlmICgoY2ggPSBzdHIuY2hhckF0KGkpKSA8IDB4MjAgfHwgY2ggPiAweDdlKSB7Ci0gICAgICAgICAgICAgICAgIFN0cmluZyBzID0gIjAwMDAiICsgSW50ZWdlci50b1N0cmluZyhjaCwgMTYpOwotICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHUiICsgcy5zdWJzdHJpbmcocy5sZW5ndGgoKSAtIDQsIHMubGVuZ3RoKCkpKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXR2YWwudG9TdHJpbmcoKTsKLSAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1NpbXBsZUNoYXJTdHJlYW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9TaW1wbGVDaGFyU3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMjFiNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1NpbXBsZUNoYXJTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gU2ltcGxlQ2hhclN0cmVhbS5qYXZhIFZlcnNpb24gMy4wICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGludGVyZmFjZSBDaGFyU3RyZWFtLCB3aGVyZSB0aGUgc3RyZWFtIGlzIGFzc3VtZWQgdG8KLSAqIGNvbnRhaW4gb25seSBBU0NJSSBjaGFyYWN0ZXJzICh3aXRob3V0IHVuaWNvZGUgcHJvY2Vzc2luZykuCi0gKi8KLQotcHVibGljIGNsYXNzIFNpbXBsZUNoYXJTdHJlYW0KLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHN0YXRpY0ZsYWcgPSBmYWxzZTsKLSAgaW50IGJ1ZnNpemU7Ci0gIGludCBhdmFpbGFibGU7Ci0gIGludCB0b2tlbkJlZ2luOwotICBwdWJsaWMgaW50IGJ1ZnBvcyA9IC0xOwotICBwcm90ZWN0ZWQgaW50IGJ1ZmxpbmVbXTsKLSAgcHJvdGVjdGVkIGludCBidWZjb2x1bW5bXTsKLQotICBwcm90ZWN0ZWQgaW50IGNvbHVtbiA9IDA7Ci0gIHByb3RlY3RlZCBpbnQgbGluZSA9IDE7Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJldkNoYXJJc0NSID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBib29sZWFuIHByZXZDaGFySXNMRiA9IGZhbHNlOwotCi0gIHByb3RlY3RlZCBqYXZhLmlvLlJlYWRlciBpbnB1dFN0cmVhbTsKLQotICBwcm90ZWN0ZWQgY2hhcltdIGJ1ZmZlcjsKLSAgcHJvdGVjdGVkIGludCBtYXhOZXh0Q2hhckluZCA9IDA7Ci0gIHByb3RlY3RlZCBpbnQgaW5CdWYgPSAwOwotCi0gIHByb3RlY3RlZCB2b2lkIEV4cGFuZEJ1ZmYoYm9vbGVhbiB3cmFwQXJvdW5kKQotICB7Ci0gICAgIGNoYXJbXSBuZXdidWZmZXIgPSBuZXcgY2hhcltidWZzaXplICsgMjA0OF07Ci0gICAgIGludCBuZXdidWZsaW5lW10gPSBuZXcgaW50W2J1ZnNpemUgKyAyMDQ4XTsKLSAgICAgaW50IG5ld2J1ZmNvbHVtbltdID0gbmV3IGludFtidWZzaXplICsgMjA0OF07Ci0KLSAgICAgdHJ5Ci0gICAgIHsKLSAgICAgICAgaWYgKHdyYXBBcm91bmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIHRva2VuQmVnaW4sIG5ld2J1ZmZlciwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOwotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgMCwgbmV3YnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmc2l6ZSAtIHRva2VuQmVnaW4sIGJ1ZnBvcyk7Ci0gICAgICAgICAgIGJ1ZmZlciA9IG5ld2J1ZmZlcjsKLQotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmxpbmUsIHRva2VuQmVnaW4sIG5ld2J1ZmxpbmUsIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZsaW5lLCAwLCBuZXdidWZsaW5lLCBidWZzaXplIC0gdG9rZW5CZWdpbiwgYnVmcG9zKTsKLSAgICAgICAgICAgYnVmbGluZSA9IG5ld2J1ZmxpbmU7Ci0KLSAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZjb2x1bW4sIHRva2VuQmVnaW4sIG5ld2J1ZmNvbHVtbiwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOwotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmNvbHVtbiwgMCwgbmV3YnVmY29sdW1uLCBidWZzaXplIC0gdG9rZW5CZWdpbiwgYnVmcG9zKTsKLSAgICAgICAgICAgYnVmY29sdW1uID0gbmV3YnVmY29sdW1uOwotCi0gICAgICAgICAgIG1heE5leHRDaGFySW5kID0gKGJ1ZnBvcyArPSAoYnVmc2l6ZSAtIHRva2VuQmVnaW4pKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIHRva2VuQmVnaW4sIG5ld2J1ZmZlciwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOwotICAgICAgICAgICBidWZmZXIgPSBuZXdidWZmZXI7Ci0KLSAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZsaW5lLCB0b2tlbkJlZ2luLCBuZXdidWZsaW5lLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgICAgIGJ1ZmxpbmUgPSBuZXdidWZsaW5lOwotCi0gICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmY29sdW1uLCB0b2tlbkJlZ2luLCBuZXdidWZjb2x1bW4sIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgICAgYnVmY29sdW1uID0gbmV3YnVmY29sdW1uOwotCi0gICAgICAgICAgIG1heE5leHRDaGFySW5kID0gKGJ1ZnBvcyAtPSB0b2tlbkJlZ2luKTsKLSAgICAgICAgfQotICAgICB9Ci0gICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgewotICAgICAgICB0aHJvdyBuZXcgRXJyb3IodC5nZXRNZXNzYWdlKCkpOwotICAgICB9Ci0KLQotICAgICBidWZzaXplICs9IDIwNDg7Ci0gICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemU7Ci0gICAgIHRva2VuQmVnaW4gPSAwOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgRmlsbEJ1ZmYoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICB7Ci0gICAgIGlmIChtYXhOZXh0Q2hhckluZCA9PSBhdmFpbGFibGUpCi0gICAgIHsKLSAgICAgICAgaWYgKGF2YWlsYWJsZSA9PSBidWZzaXplKQotICAgICAgICB7Ci0gICAgICAgICAgIGlmICh0b2tlbkJlZ2luID4gMjA0OCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICBidWZwb3MgPSBtYXhOZXh0Q2hhckluZCA9IDA7Ci0gICAgICAgICAgICAgIGF2YWlsYWJsZSA9IHRva2VuQmVnaW47Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZSBpZiAodG9rZW5CZWdpbiA8IDApCi0gICAgICAgICAgICAgIGJ1ZnBvcyA9IG1heE5leHRDaGFySW5kID0gMDsKLSAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBFeHBhbmRCdWZmKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhdmFpbGFibGUgPiB0b2tlbkJlZ2luKQotICAgICAgICAgICBhdmFpbGFibGUgPSBidWZzaXplOwotICAgICAgICBlbHNlIGlmICgodG9rZW5CZWdpbiAtIGF2YWlsYWJsZSkgPCAyMDQ4KQotICAgICAgICAgICBFeHBhbmRCdWZmKHRydWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgIGF2YWlsYWJsZSA9IHRva2VuQmVnaW47Ci0gICAgIH0KLQotICAgICBpbnQgaTsKLSAgICAgdHJ5IHsKLSAgICAgICAgaWYgKChpID0gaW5wdXRTdHJlYW0ucmVhZChidWZmZXIsIG1heE5leHRDaGFySW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIC0gbWF4TmV4dENoYXJJbmQpKSA9PSAtMSkKLSAgICAgICAgewotICAgICAgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgbWF4TmV4dENoYXJJbmQgKz0gaTsKLSAgICAgICAgcmV0dXJuOwotICAgICB9Ci0gICAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICAtLWJ1ZnBvczsKLSAgICAgICAgYmFja3VwKDApOwotICAgICAgICBpZiAodG9rZW5CZWdpbiA9PSAtMSkKLSAgICAgICAgICAgdG9rZW5CZWdpbiA9IGJ1ZnBvczsKLSAgICAgICAgdGhyb3cgZTsKLSAgICAgfQotICB9Ci0KLSAgcHVibGljIGNoYXIgQmVnaW5Ub2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gIHsKLSAgICAgdG9rZW5CZWdpbiA9IC0xOwotICAgICBjaGFyIGMgPSByZWFkQ2hhcigpOwotICAgICB0b2tlbkJlZ2luID0gYnVmcG9zOwotCi0gICAgIHJldHVybiBjOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgVXBkYXRlTGluZUNvbHVtbihjaGFyIGMpCi0gIHsKLSAgICAgY29sdW1uKys7Ci0KLSAgICAgaWYgKHByZXZDaGFySXNMRikKLSAgICAgewotICAgICAgICBwcmV2Q2hhcklzTEYgPSBmYWxzZTsKLSAgICAgICAgbGluZSArPSAoY29sdW1uID0gMSk7Ci0gICAgIH0KLSAgICAgZWxzZSBpZiAocHJldkNoYXJJc0NSKQotICAgICB7Ci0gICAgICAgIHByZXZDaGFySXNDUiA9IGZhbHNlOwotICAgICAgICBpZiAoYyA9PSAnXG4nKQotICAgICAgICB7Ci0gICAgICAgICAgIHByZXZDaGFySXNMRiA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICBsaW5lICs9IChjb2x1bW4gPSAxKTsKLSAgICAgfQotCi0gICAgIHN3aXRjaCAoYykKLSAgICAgewotICAgICAgICBjYXNlICdccicgOgotICAgICAgICAgICBwcmV2Q2hhcklzQ1IgPSB0cnVlOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXG4nIDoKLSAgICAgICAgICAgcHJldkNoYXJJc0xGID0gdHJ1ZTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1x0JyA6Ci0gICAgICAgICAgIGNvbHVtbi0tOwotICAgICAgICAgICBjb2x1bW4gKz0gKDggLSAoY29sdW1uICYgMDcpKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICBicmVhazsKLSAgICAgfQotCi0gICAgIGJ1ZmxpbmVbYnVmcG9zXSA9IGxpbmU7Ci0gICAgIGJ1ZmNvbHVtbltidWZwb3NdID0gY29sdW1uOwotICB9Ci0KLSAgcHVibGljIGNoYXIgcmVhZENoYXIoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICB7Ci0gICAgIGlmIChpbkJ1ZiA+IDApCi0gICAgIHsKLSAgICAgICAgLS1pbkJ1ZjsKLQotICAgICAgICBpZiAoKytidWZwb3MgPT0gYnVmc2l6ZSkKLSAgICAgICAgICAgYnVmcG9zID0gMDsKLQotICAgICAgICByZXR1cm4gYnVmZmVyW2J1ZnBvc107Ci0gICAgIH0KLQotICAgICBpZiAoKytidWZwb3MgPj0gbWF4TmV4dENoYXJJbmQpCi0gICAgICAgIEZpbGxCdWZmKCk7Ci0KLSAgICAgY2hhciBjID0gYnVmZmVyW2J1ZnBvc107Ci0KLSAgICAgVXBkYXRlTGluZUNvbHVtbihjKTsKLSAgICAgcmV0dXJuIChjKTsKLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZCAKLSAgICogQHNlZSAjZ2V0RW5kQ29sdW1uCi0gICAqLwotCi0gIHB1YmxpYyBpbnQgZ2V0Q29sdW1uKCkgewotICAgICByZXR1cm4gYnVmY29sdW1uW2J1ZnBvc107Ci0gIH0KLQotICAvKioKLSAgICogQGRlcHJlY2F0ZWQgCi0gICAqIEBzZWUgI2dldEVuZExpbmUKLSAgICovCi0KLSAgcHVibGljIGludCBnZXRMaW5lKCkgewotICAgICByZXR1cm4gYnVmbGluZVtidWZwb3NdOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRFbmRDb2x1bW4oKSB7Ci0gICAgIHJldHVybiBidWZjb2x1bW5bYnVmcG9zXTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0RW5kTGluZSgpIHsKLSAgICAgcmV0dXJuIGJ1ZmxpbmVbYnVmcG9zXTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0QmVnaW5Db2x1bW4oKSB7Ci0gICAgIHJldHVybiBidWZjb2x1bW5bdG9rZW5CZWdpbl07Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEJlZ2luTGluZSgpIHsKLSAgICAgcmV0dXJuIGJ1ZmxpbmVbdG9rZW5CZWdpbl07Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBiYWNrdXAoaW50IGFtb3VudCkgewotCi0gICAgaW5CdWYgKz0gYW1vdW50OwotICAgIGlmICgoYnVmcG9zIC09IGFtb3VudCkgPCAwKQotICAgICAgIGJ1ZnBvcyArPSBidWZzaXplOwotICB9Ci0KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5SZWFkZXIgZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKLSAgewotICAgIGlucHV0U3RyZWFtID0gZHN0cmVhbTsKLSAgICBsaW5lID0gc3RhcnRsaW5lOwotICAgIGNvbHVtbiA9IHN0YXJ0Y29sdW1uIC0gMTsKLQotICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemUgPSBidWZmZXJzaXplOwotICAgIGJ1ZmZlciA9IG5ldyBjaGFyW2J1ZmZlcnNpemVdOwotICAgIGJ1ZmxpbmUgPSBuZXcgaW50W2J1ZmZlcnNpemVdOwotICAgIGJ1ZmNvbHVtbiA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLlJlYWRlciBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4pCi0gIHsKLSAgICAgdGhpcyhkc3RyZWFtLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uUmVhZGVyIGRzdHJlYW0pCi0gIHsKLSAgICAgdGhpcyhkc3RyZWFtLCAxLCAxLCA0MDk2KTsKLSAgfQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKLSAgewotICAgIGlucHV0U3RyZWFtID0gZHN0cmVhbTsKLSAgICBsaW5lID0gc3RhcnRsaW5lOwotICAgIGNvbHVtbiA9IHN0YXJ0Y29sdW1uIC0gMTsKLQotICAgIGlmIChidWZmZXIgPT0gbnVsbCB8fCBidWZmZXJzaXplICE9IGJ1ZmZlci5sZW5ndGgpCi0gICAgewotICAgICAgYXZhaWxhYmxlID0gYnVmc2l6ZSA9IGJ1ZmZlcnNpemU7Ci0gICAgICBidWZmZXIgPSBuZXcgY2hhcltidWZmZXJzaXplXTsKLSAgICAgIGJ1ZmxpbmUgPSBuZXcgaW50W2J1ZmZlcnNpemVdOwotICAgICAgYnVmY29sdW1uID0gbmV3IGludFtidWZmZXJzaXplXTsKLSAgICB9Ci0gICAgcHJldkNoYXJJc0xGID0gcHJldkNoYXJJc0NSID0gZmFsc2U7Ci0gICAgdG9rZW5CZWdpbiA9IGluQnVmID0gbWF4TmV4dENoYXJJbmQgPSAwOwotICAgIGJ1ZnBvcyA9IC0xOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uUmVhZGVyIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikKLSAgewotICAgICBSZUluaXQoZHN0cmVhbSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgZHN0cmVhbSkKLSAgewotICAgICBSZUluaXQoZHN0cmVhbSwgMSwgMSwgNDA5Nik7Ci0gIH0KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQotICB7Ci0gICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoZHN0cmVhbSksIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4pCi0gIHsKLSAgICAgdGhpcyhkc3RyZWFtLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSkKLSAgewotICAgICB0aGlzKGRzdHJlYW0sIDEsIDEsIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKLSAgewotICAgICBSZUluaXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoZHN0cmVhbSksIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSkKLSAgewotICAgICBSZUluaXQoZHN0cmVhbSwgMSwgMSwgNDA5Nik7Ci0gIH0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uKQotICB7Ci0gICAgIFJlSW5pdChkc3RyZWFtLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKLSAgfQotICBwdWJsaWMgU3RyaW5nIEdldEltYWdlKCkKLSAgewotICAgICBpZiAoYnVmcG9zID49IHRva2VuQmVnaW4pCi0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZmZlciwgdG9rZW5CZWdpbiwgYnVmcG9zIC0gdG9rZW5CZWdpbiArIDEpOwotICAgICBlbHNlCi0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZmZlciwgdG9rZW5CZWdpbiwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcoYnVmZmVyLCAwLCBidWZwb3MgKyAxKTsKLSAgfQotCi0gIHB1YmxpYyBjaGFyW10gR2V0U3VmZml4KGludCBsZW4pCi0gIHsKLSAgICAgY2hhcltdIHJldCA9IG5ldyBjaGFyW2xlbl07Ci0KLSAgICAgaWYgKChidWZwb3MgKyAxKSA+PSBsZW4pCi0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBidWZwb3MgLSBsZW4gKyAxLCByZXQsIDAsIGxlbik7Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgYnVmc2l6ZSAtIChsZW4gLSBidWZwb3MgLSAxKSwgcmV0LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtIGJ1ZnBvcyAtIDEpOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgMCwgcmV0LCBsZW4gLSBidWZwb3MgLSAxLCBidWZwb3MgKyAxKTsKLSAgICAgfQotCi0gICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBEb25lKCkKLSAgewotICAgICBidWZmZXIgPSBudWxsOwotICAgICBidWZsaW5lID0gbnVsbDsKLSAgICAgYnVmY29sdW1uID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgdG8gYWRqdXN0IGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzIGZvciB0aGUgc3RhcnQgb2YgYSB0b2tlbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkanVzdEJlZ2luTGluZUNvbHVtbihpbnQgbmV3TGluZSwgaW50IG5ld0NvbCkKLSAgewotICAgICBpbnQgc3RhcnQgPSB0b2tlbkJlZ2luOwotICAgICBpbnQgbGVuOwotCi0gICAgIGlmIChidWZwb3MgPj0gdG9rZW5CZWdpbikKLSAgICAgewotICAgICAgICBsZW4gPSBidWZwb3MgLSB0b2tlbkJlZ2luICsgaW5CdWYgKyAxOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgICBsZW4gPSBidWZzaXplIC0gdG9rZW5CZWdpbiArIGJ1ZnBvcyArIDEgKyBpbkJ1ZjsKLSAgICAgfQotCi0gICAgIGludCBpID0gMCwgaiA9IDAsIGsgPSAwOwotICAgICBpbnQgbmV4dENvbERpZmYgPSAwLCBjb2x1bW5EaWZmID0gMDsKLQotICAgICB3aGlsZSAoaSA8IGxlbiAmJgotICAgICAgICAgICAgYnVmbGluZVtqID0gc3RhcnQgJSBidWZzaXplXSA9PSBidWZsaW5lW2sgPSArK3N0YXJ0ICUgYnVmc2l6ZV0pCi0gICAgIHsKLSAgICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmU7Ci0gICAgICAgIG5leHRDb2xEaWZmID0gY29sdW1uRGlmZiArIGJ1ZmNvbHVtbltrXSAtIGJ1ZmNvbHVtbltqXTsKLSAgICAgICAgYnVmY29sdW1uW2pdID0gbmV3Q29sICsgY29sdW1uRGlmZjsKLSAgICAgICAgY29sdW1uRGlmZiA9IG5leHRDb2xEaWZmOwotICAgICAgICBpKys7Ci0gICAgIH0gCi0KLSAgICAgaWYgKGkgPCBsZW4pCi0gICAgIHsKLSAgICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmUrKzsKLSAgICAgICAgYnVmY29sdW1uW2pdID0gbmV3Q29sICsgY29sdW1uRGlmZjsKLQotICAgICAgICB3aGlsZSAoaSsrIDwgbGVuKQotICAgICAgICB7Ci0gICAgICAgICAgIGlmIChidWZsaW5lW2ogPSBzdGFydCAlIGJ1ZnNpemVdICE9IGJ1ZmxpbmVbKytzdGFydCAlIGJ1ZnNpemVdKQotICAgICAgICAgICAgICBidWZsaW5lW2pdID0gbmV3TGluZSsrOwotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lOwotICAgICAgICB9Ci0gICAgIH0KLQotICAgICBsaW5lID0gYnVmbGluZVtqXTsKLSAgICAgY29sdW1uID0gYnVmY29sdW1uW2pdOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9TaW1wbGVOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvU2ltcGxlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWM0NzNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9TaW1wbGVOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFNpbXBsZU5vZGUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlTm9kZSBpbXBsZW1lbnRzIE5vZGUgewotICBwcm90ZWN0ZWQgTm9kZSBwYXJlbnQ7Ci0gIHByb3RlY3RlZCBOb2RlW10gY2hpbGRyZW47Ci0gIHByb3RlY3RlZCBpbnQgaWQ7Ci0gIHByb3RlY3RlZCBKU1BFTFBhcnNlciBwYXJzZXI7Ci0gIHByb3RlY3RlZCBUb2tlbiBmaXJzdFRva2VuOwotICBwcm90ZWN0ZWQgVG9rZW4gbGFzdFRva2VuOwotCi0gIHB1YmxpYyBTaW1wbGVOb2RlKGludCBpKSB7Ci0gICAgaWQgPSBpOwotICB9Ci0KLSAgcHVibGljIFNpbXBsZU5vZGUoSlNQRUxQYXJzZXIgcCwgaW50IGkpIHsKLSAgICB0aGlzKGkpOwotICAgIHBhcnNlciA9IHA7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBqanRPcGVuKCkgewotICB9Ci0KLSAgcHVibGljIHZvaWQgamp0Q2xvc2UoKSB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGpqdFNldFBhcmVudChOb2RlIG4pIHsgcGFyZW50ID0gbjsgfQotICBwdWJsaWMgTm9kZSBqanRHZXRQYXJlbnQoKSB7IHJldHVybiBwYXJlbnQ7IH0KLQotICBwdWJsaWMgdm9pZCBqanRBZGRDaGlsZChOb2RlIG4sIGludCBpKSB7Ci0gICAgaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLSAgICAgIGNoaWxkcmVuID0gbmV3IE5vZGVbaSArIDFdOwotICAgIH0gZWxzZSBpZiAoaSA+PSBjaGlsZHJlbi5sZW5ndGgpIHsKLSAgICAgIE5vZGUgY1tdID0gbmV3IE5vZGVbaSArIDFdOwotICAgICAgU3lzdGVtLmFycmF5Y29weShjaGlsZHJlbiwgMCwgYywgMCwgY2hpbGRyZW4ubGVuZ3RoKTsKLSAgICAgIGNoaWxkcmVuID0gYzsKLSAgICB9Ci0gICAgY2hpbGRyZW5baV0gPSBuOwotICB9Ci0KLSAgcHVibGljIE5vZGUgamp0R2V0Q2hpbGQoaW50IGkpIHsKLSAgICByZXR1cm4gY2hpbGRyZW5baV07Ci0gIH0KLQotICBwdWJsaWMgaW50IGpqdEdldE51bUNoaWxkcmVuKCkgewotICAgIHJldHVybiAoY2hpbGRyZW4gPT0gbnVsbCkgPyAwIDogY2hpbGRyZW4ubGVuZ3RoOwotICB9Ci0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3QgY2hpbGRyZW5BY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgY2hpbGRyZW5baV0uamp0QWNjZXB0KHZpc2l0b3IsIGRhdGEpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIC8qIFlvdSBjYW4gb3ZlcnJpZGUgdGhlc2UgdHdvIG1ldGhvZHMgaW4gc3ViY2xhc3NlcyBvZiBTaW1wbGVOb2RlIHRvCi0gICAgIGN1c3RvbWl6ZSB0aGUgd2F5IHRoZSBub2RlIGFwcGVhcnMgd2hlbiB0aGUgdHJlZSBpcyBkdW1wZWQuICBJZgotICAgICB5b3VyIG91dHB1dCB1c2VzIG1vcmUgdGhhbiBvbmUgbGluZSB5b3Ugc2hvdWxkIG92ZXJyaWRlCi0gICAgIHRvU3RyaW5nKFN0cmluZyksIG90aGVyd2lzZSBvdmVycmlkaW5nIHRvU3RyaW5nKCkgaXMgcHJvYmFibHkgYWxsCi0gICAgIHlvdSBuZWVkIHRvIGRvLiAqLwotCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiBKU1BFTFBhcnNlclRyZWVDb25zdGFudHMuamp0Tm9kZU5hbWVbaWRdOyB9Ci0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nIHByZWZpeCkgeyByZXR1cm4gcHJlZml4ICsgdG9TdHJpbmcoKTsgfQotCi0gIC8qIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHlvdSB3YW50IHRvIGN1c3RvbWl6ZSBob3cgdGhlIG5vZGUgZHVtcHMKLSAgICAgb3V0IGl0cyBjaGlsZHJlbi4gKi8KLQotICBwdWJsaWMgdm9pZCBkdW1wKFN0cmluZyBwcmVmaXgpIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4odG9TdHJpbmcocHJlZml4KSk7Ci0gICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLQlTaW1wbGVOb2RlIG4gPSAoU2ltcGxlTm9kZSljaGlsZHJlbltpXTsKLQlpZiAobiAhPSBudWxsKSB7Ci0JICBuLmR1bXAocHJlZml4ICsgIiAiKTsKLQl9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFRva2VuIGdldEZpcnN0VG9rZW4oKSB7Ci0gICAgcmV0dXJuIGZpcnN0VG9rZW47Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGaXJzdFRva2VuKFRva2VuIGZpcnN0VG9rZW4pIHsKLSAgICB0aGlzLmZpcnN0VG9rZW4gPSBmaXJzdFRva2VuOwotICB9Ci0KLSAgcHVibGljIFRva2VuIGdldExhc3RUb2tlbigpIHsKLSAgICByZXR1cm4gbGFzdFRva2VuOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TGFzdFRva2VuKFRva2VuIGxhc3RUb2tlbikgewotICAgIHRoaXMubGFzdFRva2VuID0gbGFzdFRva2VuOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9Ub2tlbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1Rva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNTk4MjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1Rva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gVG9rZW4uamF2YSBWZXJzaW9uIDMuMCAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIGlucHV0IHRva2VuIHN0cmVhbS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgVG9rZW4gewotCi0gIC8qKgotICAgKiBBbiBpbnRlZ2VyIHRoYXQgZGVzY3JpYmVzIHRoZSBraW5kIG9mIHRoaXMgdG9rZW4uICBUaGlzIG51bWJlcmluZwotICAgKiBzeXN0ZW0gaXMgZGV0ZXJtaW5lZCBieSBKYXZhQ0NQYXJzZXIsIGFuZCBhIHRhYmxlIG9mIHRoZXNlIG51bWJlcnMgaXMKLSAgICogc3RvcmVkIGluIHRoZSBmaWxlIC4uLkNvbnN0YW50cy5qYXZhLgotICAgKi8KLSAgcHVibGljIGludCBraW5kOwotCi0gIC8qKgotICAgKiBiZWdpbkxpbmUgYW5kIGJlZ2luQ29sdW1uIGRlc2NyaWJlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICAqIG9mIHRoaXMgdG9rZW47IGVuZExpbmUgYW5kIGVuZENvbHVtbiBkZXNjcmliZSB0aGUgcG9zaXRpb24gb2YgdGhlCi0gICAqIGxhc3QgY2hhcmFjdGVyIG9mIHRoaXMgdG9rZW4uCi0gICAqLwotICBwdWJsaWMgaW50IGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbjsKLQotICAvKioKLSAgICogVGhlIHN0cmluZyBpbWFnZSBvZiB0aGUgdG9rZW4uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGltYWdlOwotCi0gIC8qKgotICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbmV4dCByZWd1bGFyIChub24tc3BlY2lhbCkgdG9rZW4gZnJvbSB0aGUgaW5wdXQKLSAgICogc3RyZWFtLiAgSWYgdGhpcyBpcyB0aGUgbGFzdCB0b2tlbiBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIG9yIGlmIHRoZQotICAgKiB0b2tlbiBtYW5hZ2VyIGhhcyBub3QgcmVhZCB0b2tlbnMgYmV5b25kIHRoaXMgb25lLCB0aGlzIGZpZWxkIGlzCi0gICAqIHNldCB0byBudWxsLiAgVGhpcyBpcyB0cnVlIG9ubHkgaWYgdGhpcyB0b2tlbiBpcyBhbHNvIGEgcmVndWxhcgotICAgKiB0b2tlbi4gIE90aGVyd2lzZSwgc2VlIGJlbG93IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjb250ZW50cyBvZgotICAgKiB0aGlzIGZpZWxkLgotICAgKi8KLSAgcHVibGljIFRva2VuIG5leHQ7Ci0KLSAgLyoqCi0gICAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byBhY2Nlc3Mgc3BlY2lhbCB0b2tlbnMgdGhhdCBvY2N1ciBwcmlvciB0byB0aGlzCi0gICAqIHRva2VuLCBidXQgYWZ0ZXIgdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyByZWd1bGFyIChub24tc3BlY2lhbCkgdG9rZW4uCi0gICAqIElmIHRoZXJlIGFyZSBubyBzdWNoIHNwZWNpYWwgdG9rZW5zLCB0aGlzIGZpZWxkIGlzIHNldCB0byBudWxsLgotICAgKiBXaGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHN1Y2ggc3BlY2lhbCB0b2tlbiwgdGhpcyBmaWVsZCByZWZlcnMKLSAgICogdG8gdGhlIGxhc3Qgb2YgdGhlc2Ugc3BlY2lhbCB0b2tlbnMsIHdoaWNoIGluIHR1cm4gcmVmZXJzIHRvIHRoZSBuZXh0Ci0gICAqIHByZXZpb3VzIHNwZWNpYWwgdG9rZW4gdGhyb3VnaCBpdHMgc3BlY2lhbFRva2VuIGZpZWxkLCBhbmQgc28gb24KLSAgICogdW50aWwgdGhlIGZpcnN0IHNwZWNpYWwgdG9rZW4gKHdob3NlIHNwZWNpYWxUb2tlbiBmaWVsZCBpcyBudWxsKS4KLSAgICogVGhlIG5leHQgZmllbGRzIG9mIHNwZWNpYWwgdG9rZW5zIHJlZmVyIHRvIG90aGVyIHNwZWNpYWwgdG9rZW5zIHRoYXQKLSAgICogaW1tZWRpYXRlbHkgZm9sbG93IGl0ICh3aXRob3V0IGFuIGludGVydmVuaW5nIHJlZ3VsYXIgdG9rZW4pLiAgSWYgdGhlcmUKLSAgICogaXMgbm8gc3VjaCB0b2tlbiwgdGhpcyBmaWVsZCBpcyBudWxsLgotICAgKi8KLSAgcHVibGljIFRva2VuIHNwZWNpYWxUb2tlbjsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgaW1hZ2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgICByZXR1cm4gaW1hZ2U7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBUb2tlbiBvYmplY3QsIGJ5IGRlZmF1bHQuIEhvd2V2ZXIsIGlmIHlvdSB3YW50LCB5b3UKLSAgICogY2FuIGNyZWF0ZSBhbmQgcmV0dXJuIHN1YmNsYXNzIG9iamVjdHMgYmFzZWQgb24gdGhlIHZhbHVlIG9mIG9mS2luZC4KLSAgICogU2ltcGx5IGFkZCB0aGUgY2FzZXMgdG8gdGhlIHN3aXRjaCBmb3IgYWxsIHRob3NlIHNwZWNpYWwgY2FzZXMuCi0gICAqIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIHN1YmNsYXNzIG9mIFRva2VuIGNhbGxlZCBJRFRva2VuIHRoYXQKLSAgICogeW91IHdhbnQgdG8gY3JlYXRlIGlmIG9mS2luZCBpcyBJRCwgc2ltbHB5IGFkZCBzb21ldGhpbmcgbGlrZSA6Ci0gICAqCi0gICAqICAgIGNhc2UgTXlQYXJzZXJDb25zdGFudHMuSUQgOiByZXR1cm4gbmV3IElEVG9rZW4oKTsKLSAgICoKLSAgICogdG8gdGhlIGZvbGxvd2luZyBzd2l0Y2ggc3RhdGVtZW50LiBUaGVuIHlvdSBjYW4gY2FzdCBtYXRjaGVkVG9rZW4KLSAgICogdmFyaWFibGUgdG8gdGhlIGFwcHJvcHJpYXRlIHR5cGUgYW5kIHVzZSBpdCBpbiB5b3VyIGxleGljYWwgYWN0aW9ucy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgVG9rZW4gbmV3VG9rZW4oaW50IG9mS2luZCkKLSAgewotICAgICBzd2l0Y2gob2ZLaW5kKQotICAgICB7Ci0gICAgICAgZGVmYXVsdCA6IHJldHVybiBuZXcgVG9rZW4oKTsKLSAgICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9Ub2tlbk1nckVycm9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvVG9rZW5NZ3JFcnJvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTUzZGMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9Ub2tlbk1nckVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFRva2VuTWdyRXJyb3IuamF2YSBWZXJzaW9uIDMuMCAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIFRva2VuTWdyRXJyb3IgZXh0ZW5kcyBFcnJvcgotewotICAgLyoKLSAgICAqIE9yZGluYWxzIGZvciB2YXJpb3VzIHJlYXNvbnMgd2h5IGFuIEVycm9yIG9mIHRoaXMgdHlwZSBjYW4gYmUgdGhyb3duLgotICAgICovCi0KLSAgIC8qKgotCSAqIERlZmF1bHQgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotLyoqCi0gICAgKiBMZXhpY2FsIGVycm9yIG9jY3VyZWQuCi0gICAgKi8KLSAgIHN0YXRpYyBmaW5hbCBpbnQgTEVYSUNBTF9FUlJPUiA9IDA7Ci0KLSAgIC8qKgotICAgICogQW4gYXR0ZW1wdCB3YXNzIG1hZGUgdG8gY3JlYXRlIGEgc2Vjb25kIGluc3RhbmNlIG9mIGEgc3RhdGljIHRva2VuIG1hbmFnZXIuCi0gICAgKi8KLSAgIHN0YXRpYyBmaW5hbCBpbnQgU1RBVElDX0xFWEVSX0VSUk9SID0gMTsKLQotICAgLyoqCi0gICAgKiBUcmllZCB0byBjaGFuZ2UgdG8gYW4gaW52YWxpZCBsZXhpY2FsIHN0YXRlLgotICAgICovCi0gICBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfTEVYSUNBTF9TVEFURSA9IDI7Ci0KLSAgIC8qKgotICAgICogRGV0ZWN0ZWQgKGFuZCBiYWlsZWQgb3V0IG9mKSBhbiBpbmZpbml0ZSBsb29wIGluIHRoZSB0b2tlbiBtYW5hZ2VyLgotICAgICovCi0gICBzdGF0aWMgZmluYWwgaW50IExPT1BfREVURUNURUQgPSAzOwotCi0gICAvKioKLSAgICAqIEluZGljYXRlcyB0aGUgcmVhc29uIHdoeSB0aGUgZXhjZXB0aW9uIGlzIHRocm93bi4gSXQgd2lsbCBoYXZlCi0gICAgKiBvbmUgb2YgdGhlIGFib3ZlIDQgdmFsdWVzLgotICAgICovCi0gICBpbnQgZXJyb3JDb2RlOwotCi0gICAvKioKLSAgICAqIFJlcGxhY2VzIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMgYnkgdGhlaXIgZXNwYWNlZCAob3IgdW5pY29kZSBlc2NhcGVkKQotICAgICogZXF1aXZhbGVudHMgaW4gdGhlIGdpdmVuIHN0cmluZwotICAgICovCi0gICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBhZGRFc2NhcGVzKFN0cmluZyBzdHIpIHsKLSAgICAgIFN0cmluZ0J1ZmZlciByZXR2YWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBjaGFyIGNoOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykgewotICAgICAgICBzd2l0Y2ggKHN0ci5jaGFyQXQoaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgY2FzZSAwIDoKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xiJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxiIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcdCc6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcdCIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXG4iKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xmJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxmIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcciIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXCInOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwiIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcJyc6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCciKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcXCIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgaWYgKChjaCA9IHN0ci5jaGFyQXQoaSkpIDwgMHgyMCB8fCBjaCA+IDB4N2UpIHsKLSAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSAiMDAwMCIgKyBJbnRlZ2VyLnRvU3RyaW5nKGNoLCAxNik7Ci0gICAgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcdSIgKyBzLnN1YnN0cmluZyhzLmxlbmd0aCgpIC0gNCwgcy5sZW5ndGgoKSkpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJldHZhbC50b1N0cmluZygpOwotICAgfQotCi0gICAvKioKLSAgICAqIFJldHVybnMgYSBkZXRhaWxlZCBtZXNzYWdlIGZvciB0aGUgRXJyb3Igd2hlbiBpdCBpcyB0aHJvd24gYnkgdGhlCi0gICAgKiB0b2tlbiBtYW5hZ2VyIHRvIGluZGljYXRlIGEgbGV4aWNhbCBlcnJvci4KLSAgICAqIFBhcmFtZXRlcnMgOiAKLSAgICAqICAgIEVPRlNlZW4gICAgIDogaW5kaWNhdGVzIGlmIEVPRiBjYXVzZWQgdGhlIGxleGljbCBlcnJvcgotICAgICogICAgY3VyTGV4U3RhdGUgOiBsZXhpY2FsIHN0YXRlIGluIHdoaWNoIHRoaXMgZXJyb3Igb2NjdXJlZAotICAgICogICAgZXJyb3JMaW5lICAgOiBsaW5lIG51bWJlciB3aGVuIHRoZSBlcnJvciBvY2N1cmVkCi0gICAgKiAgICBlcnJvckNvbHVtbiA6IGNvbHVtbiBudW1iZXIgd2hlbiB0aGUgZXJyb3Igb2NjdXJlZAotICAgICogICAgZXJyb3JBZnRlciAgOiBwcmVmaXggdGhhdCB3YXMgc2VlbiBiZWZvcmUgdGhpcyBlcnJvciBvY2N1cmVkCi0gICAgKiAgICBjdXJjaGFyICAgICA6IHRoZSBvZmZlbmRpbmcgY2hhcmFjdGVyCi0gICAgKiBOb3RlOiBZb3UgY2FuIGN1c3RvbWl6ZSB0aGUgbGV4aWNhbCBlcnJvciBtZXNzYWdlIGJ5IG1vZGlmeWluZyB0aGlzIG1ldGhvZC4KLSAgICAqLwotICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgTGV4aWNhbEVycm9yKGJvb2xlYW4gRU9GU2VlbiwgaW50IGxleFN0YXRlLCBpbnQgZXJyb3JMaW5lLCBpbnQgZXJyb3JDb2x1bW4sIFN0cmluZyBlcnJvckFmdGVyLCBjaGFyIGN1ckNoYXIpIHsKLSAgICAgIHJldHVybigiTGV4aWNhbCBlcnJvciBhdCBsaW5lICIgKwotICAgICAgICAgICBlcnJvckxpbmUgKyAiLCBjb2x1bW4gIiArCi0gICAgICAgICAgIGVycm9yQ29sdW1uICsgIi4gIEVuY291bnRlcmVkOiAiICsKLSAgICAgICAgICAgKEVPRlNlZW4gPyAiPEVPRj4gIiA6ICgiXCIiICsgYWRkRXNjYXBlcyhTdHJpbmcudmFsdWVPZihjdXJDaGFyKSkgKyAiXCIiKSArICIgKCIgKyAoaW50KWN1ckNoYXIgKyAiKSwgIikgKwotICAgICAgICAgICAiYWZ0ZXIgOiBcIiIgKyBhZGRFc2NhcGVzKGVycm9yQWZ0ZXIpICsgIlwiIik7Ci0gICB9Ci0KLSAgIC8qKgotICAgICogWW91IGNhbiBhbHNvIG1vZGlmeSB0aGUgYm9keSBvZiB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgeW91ciBlcnJvciBtZXNzYWdlcy4KLSAgICAqIEZvciBleGFtcGxlLCBjYXNlcyBsaWtlIExPT1BfREVURUNURUQgYW5kIElOVkFMSURfTEVYSUNBTF9TVEFURSBhcmUgbm90Ci0gICAgKiBvZiBlbmQtdXNlcnMgY29uY2Vybiwgc28geW91IGNhbiByZXR1cm4gc29tZXRoaW5nIGxpa2UgOiAKLSAgICAqCi0gICAgKiAgICAgIkludGVybmFsIEVycm9yIDogUGxlYXNlIGZpbGUgYSBidWcgcmVwb3J0IC4uLi4gIgotICAgICoKLSAgICAqIGZyb20gdGhpcyBtZXRob2QgZm9yIHN1Y2ggY2FzZXMgaW4gdGhlIHJlbGVhc2UgdmVyc2lvbiBvZiB5b3VyIHBhcnNlci4KLSAgICAqLwotICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotICAgICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2UoKTsKLSAgIH0KLQotICAgLyoKLSAgICAqIENvbnN0cnVjdG9ycyBvZiB2YXJpb3VzIGZsYXZvcnMgZm9sbG93LgotICAgICovCi0KLSAgIHB1YmxpYyBUb2tlbk1nckVycm9yKCkgewotICAgfQotCi0gICBwdWJsaWMgVG9rZW5NZ3JFcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IHJlYXNvbikgewotICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgICBlcnJvckNvZGUgPSByZWFzb247Ci0gICB9Ci0KLSAgIHB1YmxpYyBUb2tlbk1nckVycm9yKGJvb2xlYW4gRU9GU2VlbiwgaW50IGxleFN0YXRlLCBpbnQgZXJyb3JMaW5lLCBpbnQgZXJyb3JDb2x1bW4sIFN0cmluZyBlcnJvckFmdGVyLCBjaGFyIGN1ckNoYXIsIGludCByZWFzb24pIHsKLSAgICAgIHRoaXMoTGV4aWNhbEVycm9yKEVPRlNlZW4sIGxleFN0YXRlLCBlcnJvckxpbmUsIGVycm9yQ29sdW1uLCBlcnJvckFmdGVyLCBjdXJDaGFyKSwgcmVhc29uKTsKLSAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9maXhwYXJzZXIuc2VkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL2ZpeHBhcnNlci5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYTVlNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL2ZpeHBhcnNlci5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIS91c3IvYmluL3NlZA0KLQ0KLSMNCi0jIFRoZSBTU0UgZ2VuZXJhbGx5IHVzZXMgY29tcGlsZXIgc2V0dGluZyB0byB0dXJuICBtb3N0IHdhcm5pbmdzIGludG8gZXJyb3JzLiAgDQotIyBUaGlzIGlzIGEgbGl0dGxlIHByb2JsZW1hdGljIGZvciBKYXZhQ0MgZ2VuZXJhdGVkIGZpbGVzLiAgV2UgZG9uJ3Qgd2FudCANCi0jIHRvIGRpc3RyaWJ1dGUgYSBjdXN0b21pemVkIHZlcnNpb24gb2YgSmF2YUNDIG5vciBpcyB0aGVyZSBhbnkgInRlbXBsYXRlIiANCi0jIG1lY2hhbmlzbS4gIFNvLCB0aGlzIHNpbXBsZSBzZWQgc2NyaXB0IGdvZXMgdGhyb3VnaCB0aGUgZ2VuZXJhdGVkIHRva2VuDQotIyBtYW5hZ2VyIGFuZCBmaXhlcyBhIGZldyB0aGluZ3MuICBJZiBKYXZhQ0MgY2hhbmdlcyB0aGUgZ2VuZXJhdGVkIGNvZGUsIA0KLSMgaXQncyBsaWtlbHkgdGhhdCB0aGlzIHNjcmlwdCB3aWxsIG5vIGxvbmdlciBkbyB0aGUgcmlnaHQgdGhpbmcuICBEaXR0byB3aXRoDQotIyBhbnkgdmVyc2lvbiBvZiBKYXZhQ0MgYmVzaWRlcyAzLjIuIEFsc28sIHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyANCi0jIHNjcmlwdCB3aWxsIGV2ZW4gd29yayB3aXRoIGFuIGFyYml0cmFyeSBKYXZhQ0MgZ3JhbW1hci4gIEl0J3Mgb25seSBiZWVuIHRlc3RlZA0KLSMgd2l0aCB0aGUgY3VycmVudCBKU1AgRUwgZ3JhbW1hci4NCi0jDQotIyBBdXRob3I6IFRlZCBBLiBDYXJyb2xsICh0Y2Fycm9sbEBiZWEuY29tKQ0KLSMNCi0NCi1zL3N0YXRpYyBwcml2YXRlIGZpbmFsIGNsYXNzIExvb2thaGVhZFN1Y2Nlc3MgZXh0ZW5kcyBqYXZhLmxhbmcuRXJyb3IgeyB9L3N0YXRpYyBwcml2YXRlIGZpbmFsIGNsYXNzIExvb2thaGVhZFN1Y2Nlc3MgZXh0ZW5kcyBqYXZhLmxhbmcuRXJyb3IgeyBcbiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsgXG4gIH0vZw0KLQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9maXh0bS5zZWQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvZml4dG0uc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzFkZWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9maXh0bS5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIS91c3IvYmluL3NlZA0KLQ0KLSMNCi0jIFRoZSBTU0UgZ2VuZXJhbGx5IHVzZXMgY29tcGlsZXIgc2V0dGluZyB0byB0dXJuICBtb3N0IHdhcm5pbmdzIGludG8gZXJyb3JzLiAgDQotIyBUaGlzIGlzIGEgbGl0dGxlIHByb2JsZW1hdGljIGZvciBKYXZhQ0MgZ2VuZXJhdGVkIGZpbGVzLiAgV2UgZG9uJ3Qgd2FudCANCi0jIHRvIGRpc3RyaWJ1dGUgYSBjdXN0b21pemVkIHZlcnNpb24gb2YgSmF2YUNDIG5vciBpcyB0aGVyZSBhbnkgInRlbXBsYXRlIiANCi0jIG1lY2hhbmlzbS4gIFNvLCB0aGlzIHNpbXBsZSBzZWQgc2NyaXB0IGdvZXMgdGhyb3VnaCB0aGUgZ2VuZXJhdGVkIHRva2VuDQotIyBtYW5hZ2VyIGFuZCBmaXhlcyBhIGZldyB0aGluZ3MuICBJZiBKYXZhQ0MgY2hhbmdlcyB0aGUgZ2VuZXJhdGVkIGNvZGUsIA0KLSMgaXQncyBsaWtlbHkgdGhhdCB0aGlzIHNjcmlwdCB3aWxsIG5vIGxvbmdlciBkbyB0aGUgcmlnaHQgdGhpbmcuICBEaXR0byB3aXRoDQotIyBhbnkgdmVyc2lvbiBvZiBKYXZhQ0MgYmVzaWRlcyAzLjIuIEFsc28sIHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyANCi0jIHNjcmlwdCB3aWxsIGV2ZW4gd29yayB3aXRoIGFuIGFyYml0cmFyeSBKYXZhQ0MgZ3JhbW1hci4gIEl0J3Mgb25seSBiZWVuIHRlc3RlZA0KLSMgd2l0aCB0aGUgY3VycmVudCBKU1AgRUwgZ3JhbW1hci4NCi0jDQotIyBBdXRob3I6IFRlZCBBLiBDYXJyb2xsICh0Y2Fycm9sbEBiZWEuY29tKQ0KLSMNCi0NCi1zLyhpbnQpKGN1ckNoYXIgPj4gOCkvY3VyQ2hhciA+PiA4L2cNCi0NCi0vXnB1YmxpYyBUb2tlbiBnZXROZXh0VG9rZW4oKS8sIC9FT0ZMb29wL3sNCi0JL2ludCBraW5kOy8ge2R9DQotCS9Ub2tlbiBzcGVjaWFsVG9rZW4gPSBudWxsOy97ZH0NCi19DQotDQotL15wcml2YXRlIGZpbmFsIGludCBqak1vdmVOZmFfMChpbnQgc3RhcnRTdGF0ZSwgaW50IGN1clBvcykvLCAvZm9yKDs7KS97DQotCXMvaW50IGosIGtpbmQgPSAweDdmZmZmZmZmOy9pbnQga2luZCA9IDB4N2ZmZmZmZmY7L2cNCi0JL2ludFxbXF0gbmV4dFN0YXRlczsve2R9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9nby5zaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9nby5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNkNWFhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvZ28uc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSMhL3Vzci9iaW4vc2gNCi0NCi0jIFNldCBKQVZBQ0NfSE9NRSB0byB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBqYXZhY2MgMy4yDQotJEpBVkFDQ19IT01FL2Jpbi9qanRyZWUuYmF0IEpTUEVMLmpqdA0KLSRKQVZBQ0NfSE9NRS9iaW4vamF2YWNjLmJhdCBKU1BFTC5qag0KLXNlZCAtZiBmaXh0bS5zZWQgLWkuYmFrIEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmENCi1kaWZmIC13IEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEgSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIuamF2YS5iYWsNCi1zZWQgLWYgZml4cGFyc2VyLnNlZCAtaS5iYWsgSlNQRUxQYXJzZXIuamF2YQ0KLWRpZmYgLXcgSlNQRUxQYXJzZXIuamF2YSBKU1BFTFBhcnNlci5qYXZhLmJhaw0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSW5kZXhXb3Jrc3BhY2VKb2IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSW5kZXhXb3Jrc3BhY2VKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJkM2ZmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0luZGV4V29ya3NwYWNlSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci0KLS8qKgotICogUmUtaW5kZXhlcyB0aGUgZW50aXJlIHdvcmtzcGFjZS4KLSAqIEVuc3VyZXMgdGhlIEpTUCBJbmRleCBpcyBpbiBhIHN0YWJsZSBzdGF0ZSBiZWZvcmUgcGVyZm9ybWluZyBhIHNlYXJjaC4KLSAqIChsaWtlIGFmdGVyIGEgY3Jhc2ggb3IgaWYgcHJldmlvdXMgaW5kZXhpbmcgd2FzIGNhbmNlbGVkKQotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSW5kZXhXb3Jrc3BhY2VKb2IgZXh0ZW5kcyBKb2IgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZT0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3BpbmRleG1hbmFnZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRz0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogVmlzaXRvciB0aGF0IHJldHJpZXZlcyBqc3AgcHJvamVjdCBwYXRocyBmb3IgYWxsIGpzcCBmaWxlcyBpbiB0aGUgd29ya3NwYWNlLAotCSAqIGFuZCBhZGRzIHRoZSBmaWxlcyB0byBiZSBpbmRleGVkIGFzIHRoZXkgYXJlIGVuY291bnRlcmVkCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBKU1BGaWxlVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZVByb3h5VmlzaXRvciB7Ci0JICAgIHByaXZhdGUgTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsgCi0JCQotCQkvLyBtb25pdG9yIGZyb20gdGhlIEpvYgotCQlJUHJvZ3Jlc3NNb25pdG9yIGZJbm5lck1vbml0b3IgPSBudWxsOwotCQlwdWJsaWMgSlNQRmlsZVZpc2l0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQl0aGlzLmZJbm5lck1vbml0b3IgPSBtb25pdG9yOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCi0JCQkvLyBjaGVjayBqb2IgY2FuY2VsZWQKLQkJCWlmICh0aGlzLmZJbm5lck1vbml0b3IgIT0gbnVsbCAmJiB0aGlzLmZJbm5lck1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJc2V0Q2FuY2VsZWRTdGF0ZSgpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJLy8gY2hlY2sgc2VhcmNoIHN1cHBvcnQgY2FuY2VsZWQKLQkJCWlmKEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCQlzZXRDYW5jZWxlZFN0YXRlKCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlpZiAocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJCi0JCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM1NTMKLQkJCQkvLyBjaGVjayB0aGlzIGJlZm9yZSBkZXNjcmlwdGlvbgotCQkJCS8vIGNoZWNrIG5hbWUgYmVmb3JlIGFjdHVhbGx5IGdldHRpbmcgdGhlIGZpbGUgKGxlc3Mgd29yaykKLQkJCQlpZihnZXRKc3BDb250ZW50VHlwZSgpLmlzQXNzb2NpYXRlZFdpdGgocHJveHkuZ2V0TmFtZSgpKSkgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKLQkJCQkJaWYoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJCi0JCQkJCQlpZihERUJVRykKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigrKSBJbmRleFdvcmtzcGFjZUpvYiBhZGRpbmcgZmlsZTogIiArIGZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8gdGhpcyBjYWxsIHdpbGwgY2hlY2sgdGhlIENvbnRlbnRUeXBlRGVzY3JpcHRpb24sIHNvIGRvbid0IG5lZWQgdG8gZG8gaXQgaGVyZS4KLQkJCQkJCS8vSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmFkZEpzcEZpbGUoZmlsZSk7Ci0JCQkJCQl0aGlzLmZpbGVzLmFkZChmaWxlKTsKLQkJCQkJCXRoaXMuZklubmVyTW9uaXRvci5zdWJUYXNrKHByb3h5LmdldE5hbWUoKSk7Ci0JCQkJCQkKLQkJCQkJCS8vIGRvbid0IHNlYXJjaCBkZWVwZXIgZm9yIGZpbGVzCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHVibGljIGZpbmFsIElGaWxlW10gZ2V0RmlsZXMoKSB7Ci0JCSAgICByZXR1cm4gKElGaWxlW10pdGhpcy5maWxlcy50b0FycmF5KG5ldyBJRmlsZVt0aGlzLmZpbGVzLnNpemUoKV0pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGZDb250ZW50VHlwZUpTUCA9IG51bGw7Ci0JCi0JcHVibGljIEluZGV4V29ya3NwYWNlSm9iKCkgewotCQkvLyBwYV9UT0RPIG1heSB3YW50IHRvIHNheSBzb21ldGhpbmcgbGlrZSAiUmVidWlsZGluZyBKU1AgSW5kZXgiIHRvIGJlIG1vcmUKLQkJLy8gZGVzY3JpcHRpdmUgaW5zdGVhZCBvZiAiVXBkYXRpbmcgSlNQIEluZGV4IiBzaW5jZSB0aGV5IGFyZSAyIGRpZmZlcmVudCB0aGluZ3MKLQkJc3VwZXIoSlNQQ29yZU1lc3NhZ2VzLkpTUEluZGV4TWFuYWdlcl8wKTsKLQkJc2V0UHJpb3JpdHkoSm9iLkxPTkcpOwotCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JfQotCi0JSUNvbnRlbnRUeXBlIGdldEpzcENvbnRlbnRUeXBlKCkgewotCQlpZih0aGlzLmZDb250ZW50VHlwZUpTUCA9PSBudWxsKQotCQkJdGhpcy5mQ29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJcmV0dXJuIHRoaXMuZkNvbnRlbnRUeXBlSlNQOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZyBlY2xpcHNlLmNvcmUuaW50ZXJuYWwuam9icy5JbnRlcm5hbEpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpIAotCSAqIGZvciBzaW1pbGFyIG1ldGhvZAotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCi0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCi0JCWlmKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlzZXRDYW5jZWxlZFN0YXRlKCk7Ci0JCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCX0KLQkJCi0JCWlmKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgXiBJbmRleFdvcmtzcGFjZUpvYiBzdGFydGVkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkKLQkJdHJ5IHsKLQkJICAgIEpTUEZpbGVWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSlNQRmlsZVZpc2l0b3IobW9uaXRvcik7Ci0JCSAgICAvLyBjb2xsZWN0IGFsbCBqc3AgZmlsZXMKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuYWNjZXB0KHZpc2l0b3IsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCQkvLyByZXF1ZXN0IGluZGV4aW5nCi0JCQkvLyB0aGlzIGlzIHByZXR0eSBtdWNoIGxpa2UgZmFraW5nIGFuIGVudGlyZSB3b3Jrc3BhY2UgcmVzb3VyY2UgZGVsdGEKLQkJCUpTUEluZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLmluZGV4RmlsZXModmlzaXRvci5nZXRGaWxlcygpKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZihERUJVRykKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJbG9uZyBmaW5pc2ggPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJaWYoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiBeIEluZGV4V29ya3NwYWNlSm9iIGZpbmlzaGVkXG4gICB0b3RhbCB0aW1lIHJ1bm5pbmc6ICIgKyAoZmluaXNoIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0Jdm9pZCBzZXRDYW5jZWxlZFN0YXRlKCkgewotCQlKU1BJbmRleE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zZXRJbmRleFN0YXRlKEpTUEluZGV4TWFuYWdlci5TX0NBTkNFTEVEKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUEluZGV4TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BJbmRleE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q5NzZlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUEluZGV4TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuaW5kZXguSW5kZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nLkluZGV4TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFJlc3BvbnNpYmxlIGZvciBrZWVwaW5nIHRoZSBKU1AgaW5kZXggdXAgdG8gZGF0ZS4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUEluZGV4TWFuYWdlciB7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0JLy8gVE9ETyBtb3ZlIHRoaXMgdG8gTG9nZ2VyLCBhcyB3ZSBoYXZlIGluIFNTRQotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwaW5kZXhtYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0VZX0lOREVYX1NUQVRFID0gImpzcEluZGV4U3RhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEluZGV4V29ya3NwYWNlSm9iIGluZGV4aW5nSm9iID0gbmV3IEluZGV4V29ya3NwYWNlSm9iKCk7Ci0KLQotCi0JLy8gVE9ETzogY29uc2lkZXIgZW51bWVyYXRpb24gZm9yIHRoZXNlIGludCBjb25zdGFudHMKLQkvLyBzZXQgdG8gU19VUERBVElORyBvbmNlIGEgcmVzb3VyY2UgY2hhbmdlIGNvbWVzIGluCi0JLy8gc2V0IHRvIFNfU1RBQkxFIGlmOgotCS8vIC0gd2Uga25vdyB3ZSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiB0aGUgcmVzb3VyY2UgY2hhbmdlCi0JLy8gLSBvciB0aGUgUHJvY2Vzc0ZpbGVzSm9iIGNvbXBsZXRlcwotCS8vIHNldCB0byBTX0NBTkNFTEVEIGlmIGFuIGluZGV4aW5nIGpvYiBpcyBjYW5jZWxlZAotCS8vIHNldCB0byBTX1JFQlVJTERJTkcgaWYgcmUtaW5kZXhpbmcgdGhlIGVudGlyZSB3b3Jrc3BhY2UKLQotCS8vIHRoZSBpbnQgJzAnIGlzIHJlc2VydmVkIGZvciB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBhIHByZWZlcmVuY2UgaXMgbm90Ci0JLy8gdGhlcmUKLQkvKiogaW5kZXggaXMgcmVsaWFibGUgdG8gdXNlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU19TVEFCTEUgPSAxOwotCS8qKiBpbmRleCBpcyBiZWluZyB1cGRhdGVkIChmcm9tIGEgcmVzb3VyY2UgZGVsdGEpICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU19VUERBVElORyA9IDI7Ci0JLyoqIGVudGlyZSBpbmRleCBpcyBiZWluZyByZWJ1aWx0ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU19SRUJVSUxESU5HID0gMzsKLQkvKioKLQkgKiBpbmRleGluZyBqb2Igd2FzIGNhbmNlbGVkIGluIHRoZSBtaWRkbGUgb2YgaXQsIGluZGV4IG5lZWRzIHRvIGJlCi0JICogcmVidWlsdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfQ0FOQ0VMRUQgPSA0OwotCi0JLyoqIHN5bWJvbGljIG5hbWUgZm9yIE9TR0kgZnJhbWV3b3JrICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT1NHSV9GUkFNRVdPUktfSUQgPSAib3JnLmVjbGlwc2Uub3NnaSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbGxlY3RzIEpTUCBmaWxlcyBmcm9tIGEgcmVzb3VyY2UgZGVsdGEuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBKU1BSZXNvdXJjZVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCQkvLyB1c2luZyBoYXNoIG1hcCBlbnN1cmVzIG9ubHkgb25lIG9mIGVhY2ggZmlsZQotCQkvLyBtdXN0IGJlIHJlc2V0IGJlZm9yZSBldmVyeSB1c2UKLQkJcHJpdmF0ZSBIYXNoTWFwIGpzcEZpbGVzID0gbnVsbDsKLQotCQlwdWJsaWMgSlNQUmVzb3VyY2VWaXNpdG9yKCkgewotCQkJdGhpcy5qc3BGaWxlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCQkvLyBpbiBjYXNlIEpTUCBzZWFyY2ggd2FzIGNhbmNlbGVkIChlZy4gd2hlbiBjbG9zaW5nIHRoZSBlZGl0b3IpCi0JCQlpZiAoSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSB8fCBmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpKSB7Ci0JCQkJc2V0Q2FuY2VsZWRTdGF0ZSgpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlpZiAoIWlzSGlkZGVuUmVzb3VyY2UoZGVsdGEuZ2V0RnVsbFBhdGgoKSkpIHsKLQotCQkJCQlpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJCQkJYm9vbGVhbiBhZGRlZCA9IChraW5kICYgSVJlc291cmNlRGVsdGEuQURERUQpID09IElSZXNvdXJjZURlbHRhLkFEREVEOwotCQkJCQlib29sZWFuIGlzSW50ZXJlc3RpbmdDaGFuZ2UgPSBmYWxzZTsKLQkJCQkJaWYgKChraW5kICYgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgewotCQkJCQkJaW50IGZsYWdzID0gZGVsdGEuZ2V0RmxhZ3MoKTsKLQkJCQkJCS8vIGlnbm9yZSB0aGluZ3MgbGlrZSBtYXJrZXIgY2hhbmdlcwotCQkJCQkJaXNJbnRlcmVzdGluZ0NoYW5nZSA9IChmbGFncyAmIElSZXNvdXJjZURlbHRhLkNPTlRFTlQpID09IElSZXNvdXJjZURlbHRhLkNPTlRFTlQgfHwgKGZsYWdzICYgSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpID09IElSZXNvdXJjZURlbHRhLlJFUExBQ0VEOwotCQkJCQl9Ci0JCQkJCWJvb2xlYW4gcmVtb3ZlZCA9IChraW5kICYgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRDsKLQkJCQkJaWYgKGFkZGVkIHx8IGlzSW50ZXJlc3RpbmdDaGFuZ2UpIHsKLQotCQkJCQkJdmlzaXRBZGRlZChkZWx0YSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocmVtb3ZlZCkgewotCQkJCQkJdmlzaXRSZW1vdmVkKGRlbHRhKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIG5lZWQgdG8gc2V0IHN0YXRlIGhlcmUgc29tZWhvdywgYW5kIHJlaW5kZXgKLQkJCQkvLyBvdGhlcndpc2UgaW5kZXggd2lsbCBiZSB1bnJlbGlhYmxlCi0JCQkJaWYgKERFQlVHKQotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJEZWx0YSBhbmFseXNpcyBtYXkgbm90IGJlIGNvbXBsZXRlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIGlmIHRoZSBkZWx0YSBoYXMgY2hpbGRyZW4sIGNvbnRpbnVlIHRvIGFkZC9yZW1vdmUgZmlsZXMKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHZpc2l0UmVtb3ZlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJLy8gaGFuZGxlIGNsZWFudXAKLQkJCWlmIChkZWx0YS5nZXRSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQlJUmVzb3VyY2UgciA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJaWYgKHIuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIgJiYgci5leGlzdHMoKSkgewotCQkJCQlkZWxldGVJbmRleCgoSUZpbGUpIHIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCB2aXNpdEFkZGVkKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzU1MwotCQkJLy8gcXVpY2sgY2hlY2sgaWYgaXQncyBldmVuIEpTUCByZWxhdGVkIHRvIGltcHJvdmUKLQkJCS8vIHBlcmZvcm1hbmNlCi0JCQkvLyBjaGVja2luZyBuYW1lIGZyb20gdGhlIGRlbHRhIGJlZm9yZSBnZXR0aW5nCi0JCQkvLyByZXNvdXJjZSBiZWNhdXNlIGl0J3MgbGlnaHRlcgotCQkJU3RyaW5nIGZpbGVuYW1lID0gZGVsdGEuZ2V0RnVsbFBhdGgoKS5sYXN0U2VnbWVudCgpOwotCQkJaWYgKGZpbGVuYW1lICE9IG51bGwgJiYgZ2V0SnNwQ29udGVudFR5cGUoKS5pc0Fzc29jaWF0ZWRXaXRoKGZpbGVuYW1lKSkgewotCQkJCUlSZXNvdXJjZSByID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCQlpZiAociAhPSBudWxsICYmIHIuZXhpc3RzKCkgJiYgci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQkJdGhpcy5qc3BGaWxlcy5wdXQoci5nZXRGdWxsUGF0aCgpLCByKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTM0NjMKLQkJcHJpdmF0ZSBib29sZWFuIGlzSGlkZGVuUmVzb3VyY2UoSVBhdGggcCkgewotCQkJU3RyaW5nW10gc2VnbWVudHMgPSBwLnNlZ21lbnRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHNlZ21lbnRzW2ldLnN0YXJ0c1dpdGgoIi4iKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBkZWxldGVJbmRleChJRmlsZSBmb2xkZXIpIHsKLQkJCS8vIGNsZWFudXAgaW5kZXgKLQkJCUluZGV4TWFuYWdlciBpbSA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SW5kZXhNYW5hZ2VyKCk7Ci0JCQlJUGF0aCBmb2xkZXJQYXRoID0gZm9sZGVyLmdldEZ1bGxQYXRoKCk7Ci0JCQlJUGF0aCBpbmRleExvY2F0aW9uID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmNvbXB1dGVJbmRleExvY2F0aW9uKGZvbGRlclBhdGgpOwotCQkJaW0ucmVtb3ZlSW5kZXgoaW5kZXhMb2NhdGlvbik7Ci0JCQkvLyBpbS5pbmRleExvY2F0aW9ucy5yZW1vdmVLZXkoZm9sZGVyUGF0aCk7Ci0JCQkvLyBpbS5pbmRleExvY2F0aW9ucy5yZW1vdmVWYWx1ZShpbmRleExvY2F0aW9uKTsKLQkJCUZpbGUgZiA9IGluZGV4TG9jYXRpb24udG9GaWxlKCk7Ci0JCQlmLmRlbGV0ZSgpOwotCQl9Ci0KLQkJcHVibGljIElGaWxlW10gZ2V0RmlsZXMoKSB7Ci0JCQlyZXR1cm4gKElGaWxlW10pIHRoaXMuanNwRmlsZXMudmFsdWVzKCkudG9BcnJheShuZXcgSUZpbGVbdGhpcy5qc3BGaWxlcy5zaXplKCldKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQkJdGhpcy5qc3BGaWxlcy5jbGVhcigpOwotCQl9Ci0JfQotCi0JLy8gZW5kIGNsYXNzIEpTUFJlc291cmNlVmlzaXRvcgotCi0JLyoqCi0JICogc2NoZWR1bGVzIEpTUCBmaWxlcyBmb3IgaW5kZXhpbmcgYnkgSmF2YSBjb3JlCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQcm9jZXNzRmlsZXNKb2IgZXh0ZW5kcyBKb2IgewotCQlMaXN0IGZpbGVMaXN0ID0gbnVsbDsKLQkJLy8ga2VlcCB0cmFjayBvZiBob3cgbWFueSBmaWxlcyB3ZSd2ZSBpbmRleGVkCi0JCWludCBsYXN0RmlsZUN1cnNvciA9IDA7Ci0KLQkJUHJvY2Vzc0ZpbGVzSm9iKFN0cmluZyB0YXNrTmFtZSkgewotCQkJc3VwZXIodGFza05hbWUpOwotCQkJZmlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQotCQlzeW5jaHJvbml6ZWQgdm9pZCBwcm9jZXNzKElGaWxlW10gZmlsZXMpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlmaWxlTGlzdC5hZGQoZmlsZXNbaV0pOwotCQkJfQotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BJbmRleE1hbmFnZXIgcXVldWluZyAiICsgZmlsZXMubGVuZ3RoICsgIiBmaWxlcyIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXN5bmNocm9uaXplZCBJRmlsZVtdIGdldEZpbGVzKCkgewotCQkJcmV0dXJuIChJRmlsZVtdKSBmaWxlTGlzdC50b0FycmF5KG5ldyBJRmlsZVtmaWxlTGlzdC5zaXplKCldKTsKLQkJfQotCi0JCXN5bmNocm9uaXplZCB2b2lkIGNsZWFyRmlsZXMoKSB7Ci0JCQlmaWxlTGlzdC5jbGVhcigpOwotCQkJbGFzdEZpbGVDdXJzb3IgPSAwOwotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImNsZWFyZWQgZmlsZXMiKTsKLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaW5kZXhlciBtb25pdG9yIiArIG1vbml0b3IpOwotCQkJaWYgKGlzQ2FuY2VsZWQobW9uaXRvcikgfHwgZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkgewotCQkJCXNldENhbmNlbGVkU3RhdGUoKTsKLQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQl9Ci0KLQkJCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQkJdHJ5IHsKLQkJCQlJRmlsZVtdIGZpbGVzVG9CZVByb2Nlc3NlZCA9IGdldEZpbGVzKCk7Ci0KLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BJbmRleE1hbmFnZXIgaW5kZXhpbmcgIiArIGZpbGVzVG9CZVByb2Nlc3NlZC5sZW5ndGggKyAiIGZpbGVzIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQkvLyBBUEkgaW5kaWNhdGVzIHRoYXQgbW9uaXRvciBpcyBuZXZlciBudWxsCi0JCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIGZpbGVzVG9CZVByb2Nlc3NlZC5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQkJSlNQU2VhcmNoU3VwcG9ydCBzcyA9IEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJCQlTdHJpbmcgcHJvY2Vzc2luZ05GaWxlcyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQotCQkJCWZvciAoO2xhc3RGaWxlQ3Vyc29yIDwgZmlsZXNUb0JlUHJvY2Vzc2VkLmxlbmd0aDsgbGFzdEZpbGVDdXJzb3IrKykgewotCi0JCQkJCWlmIChpc0NhbmNlbGVkKG1vbml0b3IpIHx8IGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpIHsKLQkJCQkJCXNldENhbmNlbGVkU3RhdGUoKTsKLQkJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJfQotCQkJCQlJRmlsZSBmaWxlID0gZmlsZXNUb0JlUHJvY2Vzc2VkW2xhc3RGaWxlQ3Vyc29yXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJCQkJCWlmIChwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCQkJc3MuYWRkSnNwRmlsZShmaWxlKTsKLQkJCQkJCQkvLyBKU1AgSW5kZXhlciBwcm9jZXNzaW5nIG4gZmlsZXMKLQkJCQkJCQlwcm9jZXNzaW5nTkZpbGVzID0gTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUEluZGV4TWFuYWdlcl8yLCBuZXcgU3RyaW5nW117SW50ZWdlci50b1N0cmluZygoZmlsZXNUb0JlUHJvY2Vzc2VkLmxlbmd0aCAtIGxhc3RGaWxlQ3Vyc29yKSl9KTsKLQkJCQkJCQltb25pdG9yLnN1YlRhc2socHJvY2Vzc2luZ05GaWxlcyArICIgLSAiICsgZmlsZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0KLQkJCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BJbmRleE1hbmFnZXIgSm9iIGFkZGVkIGZpbGU6ICIgKyBmaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBSQVRMQzAwMjg0Nzc2Ci0JCQkJCQkvLyBJU1NVRTogd2UgcHJvYmFibHkgc2hvdWxkbid0IGJlIGNhdGNoaW5nIEVWRVJZCi0JCQkJCQkvLyBleGNlcHRpb24sIGJ1dAotCQkJCQkJLy8gdGhlIGZyYW1ld29yayBvbmx5IGFsbG93cyB0byByZXR1cm4gSVN0YXR1cyBpbgotCQkJCQkJLy8gb3JkZXIgdG8gY29tbXVuaWNhdGUKLQkJCQkJCS8vIHRoYXQgc29tZXRoaW5nIHdlbnQgd3JvbmcsIHdoaWNoIG1lYW5zIHRoZSBsb29wCi0JCQkJCQkvLyB3b24ndCBjb21wbGV0ZSwgYW5kIHdlIHdvdWxkIGhpdCB0aGUgc2FtZSBwcm9ibGVtCi0JCQkJCQkvLyB0aGUgbmV4dCB0aW1lLgotCQkJCQkJLy8gCi0JCQkJCQkvLyBhIHBvc3NpYmxlIHNvbHV0aW9uIGlzIHRvIGtlZXAgdHJhY2sgb2YgdGhlCi0JCQkJCQkvLyBleGNlcHRpb25zIGxvZ2dlZAotCQkJCQkJLy8gYW5kIG9ubHkgbG9nIGEgY2VydGFpbiBhbXQgb2YgdGhlIHNhbWUgb25lLAotCQkJCQkJLy8gb3RoZXJ3aXNlIHNraXAgaXQuCi0JCQkJCQlpZiAoIWZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpIHsKLQkJCQkJCQlTdHJpbmcgZmlsZW5hbWUgPSBmaWxlICE9IG51bGwgPyBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiSlNQSW5kZXhlciBwcm9ibGVtIGluZGV4aW5nOiIgKyBmaWxlbmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gLy8gZW5kIGZvcgotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJLy8ganVzdCBpbiBjYXNlIHNvbWV0aGluZyBkaWRuJ3QgZm9sbG93IEFQSSAobW9uaXRvciBpcyBudWxsKQotCQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCi0JCQkvLyBzdWNjZXNzZnVsbHkgZmluaXNoZWQsIGNsZWFyIGZpbGVzIGxpc3QKLQkJCWNsZWFyRmlsZXMoKTsKLQkJCQotCQkJbG9uZyBmaW5pc2ggPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWxvbmcgZGlmZiA9IGZpbmlzaCAtIHN0YXJ0OwotCQkJaWYgKERFQlVHKSB7Ci0JCQkJZlRvdGFsVGltZSArPSBkaWZmOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0aGlzIHRpbWU6ICIgKyBkaWZmICsgIiBjdW11bGF0aXZlIHRpbWUgZm9yIHJlc291cmNlIGNoYW5nZWQ6ICIgKyBmVG90YWxUaW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGlzQ2FuY2VsZWQoSVByb2dyZXNzTW9uaXRvciBydW5Nb25pdG9yKSB7Ci0KLQkJCWJvb2xlYW4gY2FuY2VsZWQgPSBmYWxzZTsKLQkJCS8vIGNoZWNrIHNwZWNpZmljIG1vbml0b3IgcGFzc2VkIGludG8gcnVuIG1ldGhvZCAodGhlIHByb2dyZXNzCi0JCQkvLyBncm91cCBpbiB0aGlzIGNhc2UpCi0JCQkvLyBjaGVjayBtYWluIHNlYXJjaCBzdXBwb3J0IGNhbmNlbGVkCi0JCQlpZiAocnVuTW9uaXRvciAhPSBudWxsICYmIHJ1bk1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCWNhbmNlbGVkID0gdHJ1ZTsKLQkJCWVsc2UgaWYgKEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCQljYW5jZWxlZCA9IHRydWU7Ci0JCQkJaWYgKHJ1bk1vbml0b3IgIT0gbnVsbCkgewotCQkJCQlydW5Nb25pdG9yLnNldENhbmNlbGVkKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjYW5jZWxlZDsKLQkJfQotCQkKLQl9Ci0KLQkvLyBlbmQgY2xhc3MgUHJvY2Vzc0ZpbGVzSm9iCi0KLQlwcml2YXRlIHN0YXRpYyBKU1BJbmRleE1hbmFnZXIgZlNpbmdsZXRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkOwotCXByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXppbmcgPSB0cnVlOwotCi0JcHJpdmF0ZSBJbmRleEpvYkNvb3JkaW5hdG9yIGluZGV4Sm9iQ29vcmRpbmF0b3I7Ci0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBqc3BSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBKU1BSZXNvdXJjZVZpc2l0b3IgZlZpc2l0b3IgPSBudWxsOwotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGZDb250ZW50VHlwZUpTUCA9IG51bGw7Ci0KLQlzdGF0aWMgbG9uZyBmVG90YWxUaW1lID0gMDsKLQotCS8vIEpvYiBmb3IgcHJvY2Vzc2luZyByZXNvdXJjZSBkZWx0YQotCXByaXZhdGUgUHJvY2Vzc0ZpbGVzSm9iIHByb2Nlc3NGaWxlc0pvYiA9IG51bGw7Ci0KLQlwcml2YXRlIEpTUEluZGV4TWFuYWdlcigpIHsKLQkJcHJvY2Vzc0ZpbGVzSm9iID0gbmV3IFByb2Nlc3NGaWxlc0pvYihKU1BDb3JlTWVzc2FnZXMuSlNQSW5kZXhNYW5hZ2VyXzApOwotCQkvLyBvbmx5IHNob3cgaW4gdmVyYm9zZSBtb2RlCi0JCXByb2Nlc3NGaWxlc0pvYi5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCXByb2Nlc3NGaWxlc0pvYi5zZXRQcmlvcml0eShKb2IuTE9ORyk7Ci0JCXByb2Nlc3NGaWxlc0pvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJc3VwZXIuZG9uZShldmVudCk7Ci0JCQkJc2V0U3RhYmxlU3RhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSlNQSW5kZXhNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCi0JCWlmIChmU2luZ2xldG9uID09IG51bGwpCi0JCQlmU2luZ2xldG9uID0gbmV3IEpTUEluZGV4TWFuYWdlcigpOwotCQlyZXR1cm4gZlNpbmdsZXRvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCi0JCUpTUEluZGV4TWFuYWdlciBzaW5nbGVJbnN0YW5jZSA9IGdldEluc3RhbmNlKCk7Ci0KLQotCQlpZiAoIXNpbmdsZUluc3RhbmNlLmluaXRpYWxpemVkKSB7Ci0JCQlzaW5nbGVJbnN0YW5jZS5pbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJCXNpbmdsZUluc3RhbmNlLmluZGV4Sm9iQ29vcmRpbmF0b3IgPSBuZXcgSW5kZXhKb2JDb29yZGluYXRvcigpOwotCQkJc2luZ2xlSW5zdGFuY2UuanNwUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBKU1BSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCk7Ci0KLQkJCS8vIGFkZGVkIGFzIEpvYkNoYW5nZSBsaXN0ZW5lciBzbyBKU1BJbmRleE1hbmFnZXIgY2FuIGJlIHNtYXJ0ZXIKLQkJCS8vIGFib3V0IHdoZW4gaXQgcnVucwotCQkJUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLmFkZEpvYkNoYW5nZUxpc3RlbmVyKHNpbmdsZUluc3RhbmNlLmluZGV4Sm9iQ29vcmRpbmF0b3IpOwotCi0JCQkvLyBhZGQgSlNQSW5kZXhNYW5hZ2VyIHRvIGtlZXAgSlNQIEluZGV4IHVwIHRvIGRhdGUKLQkJCS8vIGxpc3RlbmluZyBmb3IgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSBhbmQKLQkJCS8vIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFCi0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihqc3BSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0KLQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD01MDkxCi0JCQkvLyBtYWtlcyBzdXJlIEluZGV4TWFuYWdlciBpcyBhd2FyZSBvZiBvdXIgaW5kZXhlcwotCQkJc2F2ZUluZGV4ZXMoKTsKLQkJCXNpbmdsZUluc3RhbmNlLmluaXRpYWxpemluZyA9IGZhbHNlOwotCi0JCX0KLQotCX0KLQkKLQlzeW5jaHJvbml6ZWQgdm9pZCBzZXRJbmRleFN0YXRlKGludCBzdGF0ZSkgewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQSW5kZXhNYW5hZ2VyIHNldHRpbmcgaW5kZXggc3RhdGUgdG86ICIgKyBzdGF0ZTJTdHJpbmcoc3RhdGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVBsdWdpbiBqc3BNb2RlbFBsdWdpbiA9IEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlqc3BNb2RlbFBsdWdpbi5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKFBLRVlfSU5ERVhfU1RBVEUsIHN0YXRlKTsKLQkJanNwTW9kZWxQbHVnaW4uc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBzdGF0ZTJTdHJpbmcoaW50IHN0YXRlKSB7Ci0JCVN0cmluZyBzID0gIlVOS05PV04iOyAvLyROT04tTkxTLTEkCi0JCXN3aXRjaCAoc3RhdGUpIHsKLQkJCWNhc2UgKFNfU1RBQkxFKSA6Ci0JCQkJcyA9ICJTX1NUQUJMRSI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgKFNfVVBEQVRJTkcpIDoKLQkJCQlzID0gIlNfVVBEQVRJTkciOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIChTX0NBTkNFTEVEKSA6Ci0JCQkJcyA9ICJTX0NBTkNFTEVEIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAoU19SRUJVSUxESU5HKSA6Ci0JCQkJcyA9ICJTX1JFQlVJTERJTkciOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIHM7Ci0JfQotCi0JaW50IGdldEluZGV4U3RhdGUoKSB7Ci0JCXJldHVybiBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChQS0VZX0lOREVYX1NUQVRFKTsKLQl9Ci0KLQl2b2lkIHNldFVwZGF0aW5nU3RhdGUoKSB7Ci0JCS8vaWYgKGdldEluZGV4U3RhdGUoKSAhPSBTX0NBTkNFTEVEKQotCQlzZXRJbmRleFN0YXRlKFNfVVBEQVRJTkcpOwotCX0KLQotCXZvaWQgc2V0Q2FuY2VsZWRTdGF0ZSgpIHsKLQkJc2V0SW5kZXhTdGF0ZShKU1BJbmRleE1hbmFnZXIuU19DQU5DRUxFRCk7Ci0JfQotCi0Jdm9pZCBzZXRTdGFibGVTdGF0ZSgpIHsKLQkJLy9pZiAoZ2V0SW5kZXhTdGF0ZSgpICE9IFNfQ0FOQ0VMRUQpCi0JCXNldEluZGV4U3RhdGUoU19TVEFCTEUpOwotCX0KLQotCXZvaWQgc2V0UmVidWlsZGluZ1N0YXRlKCkgewotCQlzZXRJbmRleFN0YXRlKFNfUkVCVUlMRElORyk7Ci0JfQotCi0Jc3luY2hyb25pemVkIHZvaWQgcmVidWlsZEluZGV4SWZOZWVkZWQoKSB7Ci0JCWlmIChnZXRJbmRleFN0YXRlKCkgIT0gU19TVEFCTEUpIHsKLQkJCXJlYnVpbGRJbmRleCgpOwotCQl9Ci0JfQotCi0Jdm9pZCByZWJ1aWxkSW5kZXgoKSB7Ci0KLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiogSlNQIEluZGV4IHVuc3RhYmxlLCByZXF1ZXN0aW5nIHJlLWluZGV4aW5nIik7IC8vJE5PTi1OTFMtMSQKLQotCQlnZXRJbmRleGluZ0pvYigpLmFkZEpvYkNoYW5nZUxpc3RlbmVyKG5ldyBKb2JDaGFuZ2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgYWJvdXRUb1J1bihJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlzdXBlci5hYm91dFRvUnVuKGV2ZW50KTsKLQkJCQlzZXRSZWJ1aWxkaW5nU3RhdGUoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlzdXBlci5kb25lKGV2ZW50KTsKLQkJCQlzZXRTdGFibGVTdGF0ZSgpOwotCQkJCWdldEluZGV4aW5nSm9iKCkucmVtb3ZlSm9iQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQl9Ci0JCX0pOwotCQkvLyB3ZSdyZSBhYm91dCB0byByZWluZGV4IGV2ZXJ5dGhpbmcgYW55d2F5Ci0JCWdldFByb2Nlc3NGaWxlc0pvYigpLmNsZWFyRmlsZXMoKTsKLQkJZ2V0SW5kZXhpbmdKb2IoKS5zY2hlZHVsZSgpOwotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgc2NoZWR1bGVzIGEgSm9iIHRvIHByb2Nlc3MgY29sbGVjdGVkIGZpbGVzLiBBbGwgSlNQCi0JICogaW5kZXhpbmcgc2hvdWxkIGJlIGRvbmUgdGhyb3VnaCB0aGlzIG1ldGhvZCBvciBwcm9jZXNzRmlsZXMoSUZpbGUgZmlsZSkKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZXMKLQkgKi8KLQlmaW5hbCB2b2lkIGluZGV4RmlsZXMoSUZpbGVbXSBmaWxlcykgewotCQkvLyBkb24ndCB1c2UgdGhpcyBydWxlCi0JCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00OTMxCi0JCS8vIHByb2Nlc3NGaWxlcy5zZXRSdWxlKG5ldyBJbmRleEZpbGVSdWxlKCkpOwotCQlwcm9jZXNzRmlsZXNKb2IucHJvY2VzcyhmaWxlcyk7Ci0JfQotCi0KLQkvKioKLQkgKiBQYWNrYWdlIHByb3RlY3RlZCBmb3IgYWNjZXNzIGJ5IGlubmVyIEpvYiBjbGFzcyBpbiByZXNvdXJjZUNoYW5nZWQoLi4uKQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlKU1BSZXNvdXJjZVZpc2l0b3IgZ2V0VmlzaXRvcigpIHsKLQotCQlpZiAodGhpcy5mVmlzaXRvciA9PSBudWxsKSB7Ci0JCQl0aGlzLmZWaXNpdG9yID0gbmV3IEpTUFJlc291cmNlVmlzaXRvcigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmZWaXNpdG9yOwotCX0KLQotCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD01MDkxCi0JLy8gbWFrZXMgc3VyZSBJbmRleE1hbmFnZXIgaXMgYXdhcmUgb2Ygb3VyIGluZGV4ZXMKLQl2b2lkIHNhdmVJbmRleGVzKCkgewotCQlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRJbmRleE1hbmFnZXIoKTsKLQkJSVBhdGgganNwTW9kZWxXb3JraW5nTG9jYXRpb24gPSBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuZ2V0TW9kZWxKc3BQbHVnaW5Xb3JraW5nTG9jYXRpb24oKTsKLQotCQlGaWxlIGZvbGRlciA9IG5ldyBGaWxlKGpzcE1vZGVsV29ya2luZ0xvY2F0aW9uLnRvT1NTdHJpbmcoKSk7Ci0JCVN0cmluZ1tdIGZpbGVzID0gZm9sZGVyLmxpc3QoKTsKLQkJU3RyaW5nIGxvY2F5ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJSW5kZXggaW5kZXggPSBudWxsOwotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmaWxlc1tpXS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuaW5kZXgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWxvY2F5ID0ganNwTW9kZWxXb3JraW5nTG9jYXRpb24udG9TdHJpbmcoKSArICIvIiArIGZpbGVzW2ldOyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIHJldXNlIGluZGV4IGZpbGUKLQkJCQkJaW5kZXggPSBuZXcgSW5kZXgobG9jYXksICJJbmRleCBmb3IgIiArIGxvY2F5LCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpbmRleE1hbmFnZXIuc2F2ZUluZGV4KGluZGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB3ZSBzaG91bGQgYmUgc2h1dHRpbmcgZG93biwgd2FudCB0byBzaHV0IGRvd24gcXVpZXRseQotCQkJaWYgKERFQlVHKQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlJQ29udGVudFR5cGUgZ2V0SnNwQ29udGVudFR5cGUoKSB7Ci0JCWlmICh0aGlzLmZDb250ZW50VHlwZUpTUCA9PSBudWxsKQotCQkJdGhpcy5mQ29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJcmV0dXJuIHRoaXMuZkNvbnRlbnRUeXBlSlNQOwotCX0KLQotCS8qKgotCSAqIEEgY2hlY2sgdG8gc2VlIGlmIHRoZSBPU0dJIGZyYW1ld29yayBpcyBzaHV0dGluZyBkb3duLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgU3lzdGVtIEJ1bmRsZSBpcyBzdG9wcGVkIChpZS4gdGhlIGZyYW1ld29yayBpcwotCSAqICAgICAgICAgc2h1dHRpbmcgZG93bikKLQkgKi8KLQlib29sZWFuIGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkgewotCQkvLyBpbiB0aGUgRnJhbWV3b3JrIGNsYXNzIHRoZXJlJ3MgYSBub3RlOgotCQkvLyBzZXQgdGhlIHN0YXRlIG9mIHRoZSBTeXN0ZW0gQnVuZGxlIHRvIFNUT1BQSU5HLgotCQkvLyB0aGlzIG11c3QgYmUgZG9uZSBmaXJzdCBhY2NvcmRpbmcgdG8gc2VjdGlvbiA0LjE5LjIgZnJvbSB0aGUgT1NHaQotCQkvLyBSMyBzcGVjLgotCQlib29sZWFuIHNodXR0aW5nRG93biA9IFBsYXRmb3JtLmdldEJ1bmRsZShPU0dJX0ZSQU1FV09SS19JRCkuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuU1RPUFBJTkc7Ci0JCWlmIChERUJVRyAmJiBzaHV0dGluZ0Rvd24pIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQSW5kZXhNYW5hZ2VyOiBzeXN0ZW0gaXMgc2h1dHRpbmcgZG93biEiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzaHV0dGluZ0Rvd247Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKLQotCQkvLyBzdG9wIGxpc3RlbmluZwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihqc3BSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQotCi0JCS8vIHN0b3AgYW55IHNlYXJjaGluZwotCQlKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0KLQkJLy8gc3RvcCBsaXN0ZW5pbmcgdG8gam9icwotCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkucmVtb3ZlSm9iQ2hhbmdlTGlzdGVuZXIoaW5kZXhKb2JDb29yZGluYXRvcik7Ci0KLQotCQlpbnQgbWF4d2FpdCA9IDUwMDA7Ci0JCWlmIChwcm9jZXNzRmlsZXNKb2IgIT0gbnVsbCkgewotCQkJcHJvY2Vzc0ZpbGVzSm9iLmNhbmNlbCgpOwotCQl9Ci0JCS8vIGF0dGVtcHQgdG8gbWFrZSBzdXJlIHRoaXMgaW5kZXhpbmcgam9iIGlzIGxpdHRlcmFsbHkKLQkJLy8gZG9uZSBiZWZvcmUgY29udGludWluZywgc2luY2Ugd2UgYXJlIHNodXR0aW5nIGRvd24KLQkJd2FpdFRpbGxOb3RSdW5uaW5nKG1heHdhaXQsIHByb2Nlc3NGaWxlc0pvYik7Ci0KLQkJaWYgKGluZGV4aW5nSm9iICE9IG51bGwpIHsKLQkJCWluZGV4aW5nSm9iLmNhbmNlbCgpOwotCQl9Ci0JCXdhaXRUaWxsTm90UnVubmluZyhtYXh3YWl0LCBwcm9jZXNzRmlsZXNKb2IpOwotCX0KLQotCXByaXZhdGUgdm9pZCB3YWl0VGlsbE5vdFJ1bm5pbmcoaW50IG1heFNlY29uZHMsIEpvYiBqb2IpIHsKLQkJaW50IHBhdXNlVGltZSA9IDEwOwotCQlpbnQgbWF4dHJpZXMgPSBtYXhTZWNvbmRzIC8gcGF1c2VUaW1lOwotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZSAoY291bnQrKyA8IG1heHRyaWVzICYmIGpvYi5nZXRTdGF0ZSgpID09IEpvYi5SVU5OSU5HKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcChwYXVzZVRpbWUpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY291bnQ6ICIgKyBjb3VudCArICIgbWF4OiAiICsKLQkJCQkvLyBtYXh0cmllcyk7Ci0JCQl9Ci0JCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEluZGV4Sm9iQ29vcmRpbmF0b3IgZXh0ZW5kcyBKb2JDaGFuZ2VBZGFwdGVyIHsKLQkJCi0JCXB1YmxpYyB2b2lkIGFib3V0VG9SdW4oSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlKb2Igam9iVG9Db29yZGluYXRlID0gZXZlbnQuZ2V0Sm9iKCk7Ci0JCQlpZiAoaXNKb2JUb0F2b2lkKGpvYlRvQ29vcmRpbmF0ZSkpIHsKLQkJCQkvLyBqb2Igd2lsbCBiZSByZXNjaGVkdWxlZCB3aGVuIHRoZSBqb2Igd2UKLQkJCQkvLyBhcmUgYXZvaWRpbmcgKGVnLiBidWlsZCkgaXMgZG9uZQotCQkJCWdldFByb2Nlc3NGaWxlc0pvYigpLmNhbmNlbCgpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJjYW5jZWw6IiArIGpvYlRvQ29vcmRpbmF0ZS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQotCQkJSm9iIGpvYlRvQ29vcmRpbmF0ZSA9IGV2ZW50LmdldEpvYigpOwotCQkJaWYgKGlzSm9iVG9Bdm9pZChqb2JUb0Nvb3JkaW5hdGUpKSB7Ci0JCQkJaWYgKGdldFByb2Nlc3NGaWxlc0pvYigpLmdldEZpbGVzKCkubGVuZ3RoID4gMCkgewotCQkJCQlnZXRQcm9jZXNzRmlsZXNKb2IoKS5zY2hlZHVsZSg1MDApOwotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigic2NoZWR1bGU6IiArIGpvYlRvQ29vcmRpbmF0ZS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCQkJCi0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBpc0pvYlRvQXZvaWQoSm9iIGpvYlRvQ29vcmRpbmF0ZSkgewotCQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCWlmIChqb2JUb0Nvb3JkaW5hdGUuYmVsb25nc1RvKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCkgfHwgam9iVG9Db29yZGluYXRlLmJlbG9uZ3NUbyhSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX01BTlVBTF9CVUlMRCkgfHwgam9iVG9Db29yZGluYXRlLmJlbG9uZ3NUbyhSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fUkVGUkVTSCkpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEpTUFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQotCQkJaWYgKGlzSW5pdGlhbGl6aW5nKCkpCi0JCQkJcmV0dXJuOwotCi0JCQkvLyBpZ25vcmUgcmVzb3VyY2UgY2hhbmdlcyBpZiBhbHJlYWR5IHJlYnVpbGRpbmcKLQkJCWlmIChnZXRJbmRleFN0YXRlKCkgPT0gU19SRUJVSUxESU5HKQotCQkJCXJldHVybjsKLQkJCS8vIHByZXZpb3VzbHkgY2FuY2VsZWQsIG5lZWRzIGVudGlyZSBpbmRleCByZWJ1aWxkCi0JCQlpZiAoZ2V0SW5kZXhTdGF0ZSgpID09IFNfQ0FOQ0VMRUQpIHsKLQkJCQkvLyByZWJ1aWxkSW5kZXgoKTsKLQkJCQkvLyBqdXN0IHJlc3VtZSBpbmRleGluZwotCQkJCWdldFByb2Nlc3NGaWxlc0pvYigpLnNjaGVkdWxlKDUwMCk7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInNjaGVkdWxlOiByZXNvdXJjZSBjaGFuZ2VkLCBwcmV2aW91c2x5IGNhbmNlbGVkIik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCQlpZiAoZGVsdGEgIT0gbnVsbCkgewotCQkJCS8vIG9ubHkgY2FyZSBhYm91dCBhZGRzIG9yIGNoYW5nZXMgcmlnaHQgbm93Li4uCi0JCQkJaW50IGtpbmQgPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCQkJYm9vbGVhbiBhZGRlZCA9IChraW5kICYgSVJlc291cmNlRGVsdGEuQURERUQpID09IElSZXNvdXJjZURlbHRhLkFEREVEOwotCQkJCWJvb2xlYW4gY2hhbmdlZCA9IChraW5kICYgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRDsKLQkJCQlpZiAoYWRkZWQgfHwgY2hhbmdlZCkgewotCi0JCQkJCS8vIG9ubHkgYW5hbHl6ZSB0aGUgZnVsbCAoc3RhcnRpbmcgYXQgcm9vdCkgZGVsdGEKLQkJCQkJLy8gaGllcmFyY2h5Ci0JCQkJCWlmIChkZWx0YS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuZXF1YWxzKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdHJ5IHsKLQkJCQkJCQlKU1BSZXNvdXJjZVZpc2l0b3IgdiA9IGdldFZpc2l0b3IoKTsKLQkJCQkJCQkvLyBjbGVhciBmcm9tIGxhc3QgcnVuCi0JCQkJCQkJdi5yZXNldCgpOwotCQkJCQkJCS8vIGNvdW50IGZpbGVzLCBwb3NzaWJseSBkbyB0aGlzIGluIGEgam9iIHRvby4uLgotCQkJCQkJCS8vIGRvbid0IGluY2x1ZGUgUEhBTlRPTSByZXNvdXJjZXMKLQkJCQkJCQlkZWx0YS5hY2NlcHQodiwgZmFsc2UpOwotCi0JCQkJCQkJLy8gcHJvY2VzcyBmaWxlcyBmcm9tIHRoaXMgZGVsdGEKLQkJCQkJCQlJRmlsZVtdIGZpbGVzID0gdi5nZXRGaWxlcygpOwotCQkJCQkJCWlmIChmaWxlcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJCS8qCi0JCQkJCQkJCSAqIEpvYiBjaGFuZ2UgbGlzdGVuZXIgc2hvdWxkIHNldCBiYWNrIHRvCi0JCQkJCQkJCSAqIHN0YWJsZSB3aGVuIGZpbmlzaGVkCi0JCQkJCQkJCSAqLwotCQkJCQkJCQlzZXRVcGRhdGluZ1N0YXRlKCk7Ci0JCQkJCQkJCS8vIHByb2Nlc3NGaWxlcyhmaWxlcyk7Ci0JCQkJCQkJCWluZGV4RmlsZXMoZmlsZXMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBuZWVkIHRvIHNldCBzdGF0ZSBoZXJlIHNvbWVob3csIGFuZCByZWluZGV4Ci0JCQkJCQkJLy8gb3RoZXJ3aXNlIGluZGV4IHdpbGwgYmUgdW5yZWxpYWJsZQotCQkJCQkJCWlmIChERUJVRykKLQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIG5lZWQgdG8gc2V0IHN0YXRlIGhlcmUgc29tZWhvdywgYW5kIHJlaW5kZXgKLQkJCQkJCQkvLyBvdGhlcndpc2UgaW5kZXggd2lsbCBiZSB1bnJlbGlhYmxlCi0JCQkJCQkJaWYgKERFQlVHKQotCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQotCX0KLQotCUluZGV4V29ya3NwYWNlSm9iIGdldEluZGV4aW5nSm9iKCkgewotCQlyZXR1cm4gaW5kZXhpbmdKb2I7Ci0JfQotCi0JUHJvY2Vzc0ZpbGVzSm9iIGdldFByb2Nlc3NGaWxlc0pvYigpIHsKLQkJcmV0dXJuIHByb2Nlc3NGaWxlc0pvYjsKLQl9Ci0KLQlib29sZWFuIGlzSW5pdGlhbGl6aW5nKCkgewotCQlyZXR1cm4gaW5pdGlhbGl6aW5nOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BQYXRoSW5kZXhlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BQYXRoSW5kZXhlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWZkZGE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQUGF0aEluZGV4ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotCi0vKioKLSAqIHBhX1RPRE8gU3RpbGwgbmVlZCB0byB0YWtlIGludG8gY29uc2lkZXJhdGlvbjoKLSAqIAktIGZvY3VzIGluIHdvcmtzcGFjZQotICogIC0gc2VhcmNoIHBhdHRlcm4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFBhdGhJbmRleGVyIHsKLQotCS8vIGZvciBkZWJ1Z2dpbmcKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWU9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwc2VhcmNoIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUc9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8vIHZpc2l0b3IgdGhhdCByZXRyaWV2ZXMganNwIHByb2plY3QgcGF0aHMgZm9yIGFsbCBqc3AgZmlsZXMgaW4gdGhlIHdvcmtzcGFjZQotCWNsYXNzIEpTUEZpbGVWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlUHJveHlWaXNpdG9yIHsKLQkJLy8gaGFzaCBtYXAgZm9yY2VzIG9ubHkgb25lIG9mIGVhY2ggZmlsZQotCQlwcml2YXRlIEhhc2hNYXAgZlBhdGhzID0gbmV3IEhhc2hNYXAoKTsKLQkJSUphdmFTZWFyY2hTY29wZSBmU2NvcGUgPSBudWxsOwotCQlTZWFyY2hQYXR0ZXJuIGZQYXR0ZXJuID0gbnVsbDsKLQotCQlwdWJsaWMgSlNQRmlsZVZpc2l0b3IoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlKSB7Ci0JCQl0aGlzLmZQYXR0ZXJuID0gcGF0dGVybjsKLQkJCXRoaXMuZlNjb3BlID0gc2NvcGU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCi0JCQlpZihKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQkJaWYgKHByb3h5LmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCi0JCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlSlNQID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0JCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM1NTMKLQkJCQkvLyBjaGVjayB0aGlzIGJlZm9yZSBkZXNjcmlwdGlvbgotCQkJCS8vIGNoZWNrIG5hbWUgYmVmb3JlIGFjdHVhbGx5IGdldHRpbmcgdGhlIGZpbGUgKGxlc3Mgd29yaykKLQkJCQlpZihjb250ZW50VHlwZUpTUC5pc0Fzc29jaWF0ZWRXaXRoKHByb3h5LmdldE5hbWUoKSkpIHsKLQkJCQkJCi0JCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpcHJveHkucmVxdWVzdFJlc291cmNlKCk7Ci0JCQkJCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQkJU3RyaW5nIGN0SWQgPSBudWxsOwotCQkJCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCWN0SWQgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKS5nZXRJZCgpOwotCQkJCQl9Ci0JCQkJCWlmIChDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQLmVxdWFscyhjdElkKSkgewotCQkJCQkJaWYgKHRoaXMuZlNjb3BlLmVuY2xvc2VzKHByb3h5LnJlcXVlc3RGdWxsUGF0aCgpLnRvU3RyaW5nKCkpKSB7Ci0JCi0JCQkJCQkJaWYgKERFQlVHKQotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFkZGluZyBzZWxlY3RlZCBpbmRleCBwYXRoOiIgKyBmaWxlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCQlmUGF0aHMucHV0KGZpbGUuZ2V0UGFyZW50KCkuZ2V0RnVsbFBhdGgoKSwgSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmNvbXB1dGVJbmRleExvY2F0aW9uKGZpbGUuZ2V0UGFyZW50KCkuZ2V0RnVsbFBhdGgoKSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIGRvbid0IHNlYXJjaCBkZWVwZXIgZm9yIGZpbGVzCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgSVBhdGhbXSBnZXRQYXRocygpIHsKLQkJCXJldHVybiAoSVBhdGhbXSkgZlBhdGhzLnZhbHVlcygpLnRvQXJyYXkobmV3IElQYXRoW2ZQYXRocy5zaXplKCldKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJUGF0aFtdIGdldFZpc2libGVKc3BQYXRocyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUpIHsKLQotCQlKU1BGaWxlVmlzaXRvciBqc3BGaWxlVmlzaXRvciA9IG5ldyBKU1BGaWxlVmlzaXRvcihwYXR0ZXJuLCBzY29wZSk7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmFjY2VwdChqc3BGaWxlVmlzaXRvciwgMCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4ganNwRmlsZVZpc2l0b3IuZ2V0UGF0aHMoKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgzMzJkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5JSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5leGNlcHRpb25zLlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0KLS8qKgotICogQ3JlYXRlZCB3aXRoIGEgLmpzcCBmaWxlLCBidXQgc2hvdWxkIGFwcGVhciB0byBiZSBhIC5qYXZhIGZpbGUgZm9yIGluZGV4aW5nCi0gKiBhbmQgc2VhcmNoaW5nIHB1cnBvc2VzLiBUaGVyZSBhcmUgcHVycG9zZWx5IGZldyBmaWVsZHMgaW4gdGhpcyBjbGFzcywgYW5kCi0gKiB0aG9zZSBmaWVsZHMgYXJlIGxpZ2h0d2VpZ2h0IHNpbmNlIGl0J3MgcG9zc2libGUgZm9yIG1hbnkgSlNQIHNlYXJjaAotICogZG9jdW1lbnRzIHRvIGV4aXN0IGluIG1lbW9yeSBhdCBvbmUgdGltZSAoZWcuIGFmdGVyIGltcG9ydGluZyBhIHByb2plY3QKLSAqIHdpdGggYSBsYXJnZSBudW1iZXIgb2YgSlNQIGZpbGVzKQotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQU2VhcmNoRG9jdW1lbnQgewotCi0JcHJpdmF0ZSBTdHJpbmcgVU5LTk9XTl9QQVRIID0gIioqcGF0aCB1bmtub3duKioiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgZkpTUFBhdGhTdHJpbmcgPSBVTktOT1dOX1BBVEg7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNVUGF0aCA9IFVOS05PV05fUEFUSDsKLQlwcml2YXRlIFNlYXJjaFBhcnRpY2lwYW50IGZQYXJ0aWNpcGFudCA9IG51bGw7Ci0JcHJpdmF0ZSBsb25nIGZMYXN0TW9kaWZpZWRTdGFtcDsKLQlwcml2YXRlIGNoYXJbXSBmQ2FjaGVkQ2hhckNvbnRlbnRzOwotCQotCS8qKgotCSAqIEBwYXJhbSBmaWxlCi0JICogQHBhcmFtIHBhcnRpY2lwYW50Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIEpTUFNlYXJjaERvY3VtZW50KFN0cmluZyBmaWxlUGF0aCwgU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQpIHsKLQotCQl0aGlzLmZKU1BQYXRoU3RyaW5nID0gZmlsZVBhdGg7Ci0JCXRoaXMuZlBhcnRpY2lwYW50ID0gcGFydGljaXBhbnQ7Ci0JfQotCi0JcHVibGljIFNlYXJjaFBhcnRpY2lwYW50IGdldFBhcnRpY2lwYW50KCkgewotCQlyZXR1cm4gdGhpcy5mUGFydGljaXBhbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQjZ2V0Q2hhckNvbnRlbnRzKCkKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENoYXJDb250ZW50cygpIHsKLQkJCi0JCWlmKGZDYWNoZWRDaGFyQ29udGVudHMgPT0gbnVsbCB8fCBpc0RpcnR5KCkpIHsKLQkJICAgIEpTUFRyYW5zbGF0aW9uIHRyYW5zID0gZ2V0SlNQVHJhbnNsYXRpb24oKTsgICAgCi0JCSAgICBmQ2FjaGVkQ2hhckNvbnRlbnRzID0gdHJhbnMgIT0gbnVsbCA/IHRyYW5zLmdldEphdmFUZXh0KCkudG9DaGFyQXJyYXkoKSA6IG5ldyBjaGFyWzBdOwotCQkgICAgZkNVUGF0aCA9IHRyYW5zLmdldEphdmFQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIGZDYWNoZWRDaGFyQ29udGVudHM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhVGV4dCgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoZ2V0Q2hhckNvbnRlbnRzKCkpOwotCX0KLQotCXByaXZhdGUgSU1vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKSB7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCX0KLQotCS8qKgotCSAqIEl0J3Mgbm90IHJlY29tbWVuZGVkIGZvciBjbGllbnRzIHRvIGhvbGQgb24gdG8gdGhpcyBKU1BUcmFuc2xhdGlvbgotCSAqIHNpbmNlIGl0J3Mga2luZCBvZiBsYXJnZS4gSWYgcG9zc2libGUsIGhvbGQgb24gdG8gdGhlCi0JICogSlNQU2VhcmNoRG9jdW1lbnQsIHdoaWNoIGlzIG1vcmUgb2YgYSBsaWdodHdlaWdodCBwcm94eS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBKU1BUcmFuc2xhdGlvbiBmb3IgdGhlIGpzcCBmaWxlLCBvciBudWxsIGlmIGl0J3MgYW4KLQkgKiAgICAgICAgIHVuc3VwcG9ydGVkIGZpbGUuCi0JICovCi0JcHVibGljIGZpbmFsIEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uIGdldEpTUFRyYW5zbGF0aW9uKCkgewotCQlKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbiB0cmFuc2xhdGlvbiA9IG51bGw7Ci0JCUlGaWxlIGpzcEZpbGUgPSBnZXRGaWxlKCk7Ci0JCWlmICghSlNQU2VhcmNoU3VwcG9ydC5pc0pzcChqc3BGaWxlKSkKLQkJCXJldHVybiB0cmFuc2xhdGlvbjsKLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGdldCBleGlzdGluZyBtb2RlbCBmb3IgcmVhZCwgdGhlbiBnZXQgZG9jdW1lbnQgZnJvbSBpdAotCQkJSU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBnZXRNb2RlbE1hbmFnZXIoKTsKLQkJCWlmIChtb2RlbE1hbmFnZXIgIT0gbnVsbCkgewotCQkJCWpzcEZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQltb2RlbCA9IG1vZGVsTWFuYWdlci5nZXRNb2RlbEZvclJlYWQoanNwRmlsZSk7Ci0JCQl9Ci0JCQkvLyBoYW5kbGUgdW5zdXBwb3J0ZWQKLQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCUlET01Nb2RlbCB4bWxNb2RlbCA9IChJRE9NTW9kZWwpbW9kZWw7Ci0JCQkJc2V0dXBBZGFwdGVyRmFjdG9yeSh4bWxNb2RlbCk7Ci0JCQkJSURPTURvY3VtZW50IGRvYyA9IHhtbE1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQkJSlNQVHJhbnNsYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSlNQVHJhbnNsYXRpb25BZGFwdGVyKSBkb2MuZ2V0QWRhcHRlckZvcihJSlNQVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJCXRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbigpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWwgZSkgewotCQkJLy8gbm8gbmVlZCB0byBsb2cgdGhpcy4gSnVzdCBjb25zaWRlciBpdCBhbiBpbnZhbGlkIGZpbGUgZm9yIG91cgotCQkJLy8gcHVycG9zZXMuCi0JCQkvLyBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIHRyYW5zbGF0aW9uOwotCX0KLQotCS8qKgotCSAqIGFkZCB0aGUgZmFjdG9yeSBmb3IgSlNQVHJhbnNsYXRpb25BZGFwdGVyIGhlcmUKLQkgKiAKLQkgKiBAcGFyYW0gc20KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0dXBBZGFwdGVyRmFjdG9yeShJU3RydWN0dXJlZE1vZGVsIHNtKSB7Ci0JCU1vZGVsSGFuZGxlckZvckpTUC5lbnN1cmVUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KHNtKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgcGF0aCB0byB0aGUgSmF2YSBjb21waWxhdGlvbiB1bml0Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQjZ2V0UGF0aCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotCSAgICAvLyBjYWNoaW5nIHRoZSBwYXRoIHNpbmNlIGl0J3MgZXhwZW5zaXZlIHRvIGdldCB0cmFuc2xhdGlvbgotCQkvLyBpbXBvcnRhbnQgdGhhdCBpc0RpcnR5KCkgY2hlY2sgaXMgc2Vjb25kIHRvIGNhY2hlIG1vZGlmaWNhdGlvbiBzdGFtcAotCSAgICBpZih0aGlzLmZDVVBhdGggPT0gbnVsbCB8fCBpc0RpcnR5KCkgfHwgdGhpcy5mQ1VQYXRoID09IFVOS05PV05fUEFUSCkgewotCSAgICAgICAgSlNQVHJhbnNsYXRpb24gdHJhbnMgPSBnZXRKU1BUcmFuc2xhdGlvbigpOwotCSAgICAgICAgaWYodHJhbnMgIT0gbnVsbCkgewotCSAgICAgICAgICAgIHRoaXMuZkNVUGF0aCA9IHRyYW5zLmdldEphdmFQYXRoKCk7Ci0JICAgICAgICAgICAgLy8gc2F2ZSBzaW5jZSBpdCdzIGV4cGVuc2l2ZSB0byBjYWxjdWxhdGUgYWdhaW4gbGF0ZXIKLQkgICAgICAgICAgICBmQ2FjaGVkQ2hhckNvbnRlbnRzID0gdHJhbnMuZ2V0SmF2YVRleHQoKS50b0NoYXJBcnJheSgpOwotCSAgICAgICAgfQotCSAgICB9Ci0JCXJldHVybiBmQ1VQYXRoICE9IG51bGwgPyBmQ1VQYXRoIDogVU5LTk9XTl9QQVRIOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SnNwT2Zmc2V0KGludCBqYXZhT2Zmc2V0KSB7Ci0JCS8vIGNvcGllZCBmcm9tIEpTUFRyYW5zbGF0aW9uCi0JCWludCByZXN1bHQgPSAtMTsKLQkJaW50IG9mZnNldEluUmFuZ2UgPSAwOwotCQlQb3NpdGlvbiBqc3BQb3MsIGphdmFQb3MgPSBudWxsOwotCQlKU1BUcmFuc2xhdGlvbiB0cmFucyA9IGdldEpTUFRyYW5zbGF0aW9uKCk7Ci0JCWlmICh0cmFucyAhPSBudWxsKSB7Ci0JCQlIYXNoTWFwIGphdmEyanNwTWFwID0gdHJhbnMuZ2V0SmF2YTJKc3BNYXAoKTsKLQotCQkJLy8gaXRlcmF0ZSBhbGwgbWFwcGVkIGphdmEgcmFuZ2VzCi0JCQlJdGVyYXRvciBpdCA9IGphdmEyanNwTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJamF2YVBvcyA9IChQb3NpdGlvbikgaXQubmV4dCgpOwotCQkJCS8vIG5lZWQgdG8gY291bnQgdGhlIGxhc3QgcG9zaXRpb24gYXMgaW5jbHVkZWQKLQkJCQlpZiAoIWphdmFQb3MuaW5jbHVkZXMoamF2YU9mZnNldCkgJiYgIShqYXZhUG9zLm9mZnNldCArIGphdmFQb3MubGVuZ3RoID09IGphdmFPZmZzZXQpKQotCQkJCQljb250aW51ZTsKLQotCQkJCW9mZnNldEluUmFuZ2UgPSBqYXZhT2Zmc2V0IC0gamF2YVBvcy5vZmZzZXQ7Ci0JCQkJanNwUG9zID0gKFBvc2l0aW9uKSBqYXZhMmpzcE1hcC5nZXQoamF2YVBvcyk7Ci0KLQkJCQlpZiAoanNwUG9zICE9IG51bGwpCi0JCQkJCXJlc3VsdCA9IGpzcFBvcy5vZmZzZXQgKyBvZmZzZXRJblJhbmdlOwotCQkJCWVsc2UgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgImpzcFBvc2l0aW9uIHdhcyBudWxsISIgKyBqYXZhT2Zmc2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSVBhdGgganNwUGF0aCA9IG5ldyBQYXRoKHRoaXMuZkpTUFBhdGhTdHJpbmcpOwotCQlJRmlsZSBqc3BGaWxlID0gcm9vdC5nZXRGaWxlKGpzcFBhdGgpOwotCQlpZiAoIWpzcEZpbGUuZXhpc3RzKCkpIHsKLQkJCS8vIHBvc3NpYmx5IG91dHNpZGUgd29ya3NwYWNlCi0JCQlqc3BGaWxlID0gcm9vdC5nZXRGaWxlRm9yTG9jYXRpb24oanNwUGF0aCk7Ci0JCX0KLQkJcmV0dXJuIGpzcEZpbGU7Ci0JfQotCi0JCi0JcHJpdmF0ZSBib29sZWFuIGlzRGlydHkoKSB7Ci0JCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJSUZpbGUgZiA9IGdldEZpbGUoKTsKLQkJaWYoZiAhPSBudWxsKSB7Ci0JCQlsb25nIGN1cnJlbnRTdGFtcCA9IGYuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJCWlmKGN1cnJlbnRTdGFtcCAhPSBmTGFzdE1vZGlmaWVkU3RhbXApCi0JCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJZkxhc3RNb2RpZmllZFN0YW1wID0gY3VycmVudFN0YW1wOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gbm90aGluZyB0byBkbyBub3cgc2luY2UgSlNQVHJhbnNsYXRpb24gaXMgY3JlYXRlZCBvbiB0aGUgZmx5Ci0JfQotCi0JLyoqCi0JICogZm9yIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiW0pTUFNlYXJjaERvY3VtZW50OiIgKyB0aGlzLmZKU1BQYXRoU3RyaW5nICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50I2dldEVuY29kaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50I2dldEJ5dGVDb250ZW50cygpCi0JICovCi0JcHVibGljIGJ5dGVbXSBnZXRCeXRlQ29udGVudHMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTg0YjJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci0KLS8qKgotICogSW50ZWdyYXRpb24gb2YgSlNQIHcvIGphdmEgc2VhcmNoLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQU2VhcmNoUGFydGljaXBhbnQgZXh0ZW5kcyBTZWFyY2hQYXJ0aWNpcGFudCB7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGNhbGN1bGF0ZVZhbHVlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNhbGN1bGF0ZVZhbHVlKCkgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHNlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gZGVidWcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZGVidWc7Ci0JfQotCi0JLyoqCi0JICogSW1wb3J0YW50IHRvIG5ldmVyIHJldHVybiBudWxsIGhlcmUgb3IgZWxzZSBKYXZhIHNlYXJjaCBwYXJ0aWNpcGF0aW9uCi0JICogd2lsbCBicmVhay4KLQkgKi8KLQlwdWJsaWMgU2VhcmNoRG9jdW1lbnQgZ2V0RG9jdW1lbnQoU3RyaW5nIGRvY3VtZW50UGF0aCkgewotCQlTZWFyY2hEb2N1bWVudCBzRG9jID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFNlYXJjaERvY3VtZW50KGRvY3VtZW50UGF0aCk7Ci0KLQkJaWYgKHNEb2MgPT0gbnVsbCkgewotCQkJLy8gcmV0dXJuIGEgZHVtbXkgZG9jIGhlcmUgc28gc2VhcmNoIHBhcnRpY2lwYXRpb24gZG9lc24ndCBicmVhawotCQkJcmV0dXJuIG5ldyBOdWxsU2VhcmNoRG9jdW1lbnQoZG9jdW1lbnRQYXRoKTsKLQkJfQotCQlyZXR1cm4gc0RvYzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIkpTUCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVBhdGhbXSBzZWxlY3RJbmRleGVzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUphdmFTZWFyY2hTY29wZSBzY29wZSkgewotCQlKU1BQYXRoSW5kZXhlciBpbmRleGVyID0gbmV3IEpTUFBhdGhJbmRleGVyKCk7Ci0JCXJldHVybiBpbmRleGVyLmdldFZpc2libGVKc3BQYXRocyhwYXR0ZXJuLCBzY29wZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5kZXhEb2N1bWVudChTZWFyY2hEb2N1bWVudCBkb2N1bWVudCwgSVBhdGggaW5kZXhQYXRoKSB7Ci0JCWlmICghKGRvY3VtZW50IGluc3RhbmNlb2YgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUpKQotCQkJcmV0dXJuOwotCi0JCS8vIHVzZSBKYXZhIHNlYXJjaCBpbmRleGluZwotCQlTZWFyY2hFbmdpbmUuZ2V0RGVmYXVsdFNlYXJjaFBhcnRpY2lwYW50KCkuaW5kZXhEb2N1bWVudChkb2N1bWVudCwgaW5kZXhQYXRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2NhdGVNYXRjaGVzKFNlYXJjaERvY3VtZW50W10gaW5kZXhNYXRjaGVzLCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZmlsdGVyIG91dCBudWxsIG1hdGNoZXMKLQkJTGlzdCBmaWx0ZXJlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU2VhcmNoRG9jdW1lbnQgbWF0Y2ggPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4TWF0Y2hlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgcG9zc2libGUgbWF0Y2hpbmcgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGU6ICIgKyBpbmRleE1hdGNoZXNbaV0pOyAvLyROT04tTkxTLTEkCi0JCQltYXRjaCA9IGluZGV4TWF0Y2hlc1tpXTsKLQkJCWlmIChtYXRjaCAhPSBudWxsKSB7Ci0JCQkJLy8gc29tZSBtYXRjaGVzIG1heSBiZSBudWxsLCBvciBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGRhdGUsCi0JCQkJLy8gdGhlIGZpbGUgbWF5IG5vdCBldmVuIGV4aXN0Ci0JCQkJaWYgKG1hdGNoIGluc3RhbmNlb2YgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgJiYgKChKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSkgbWF0Y2gpLmdldEZpbGUoKS5leGlzdHMoKSkKLQkJCQkJZmlsdGVyZWQuYWRkKG1hdGNoKTsKLQkJCX0KLQkJfQotCi0JCWluZGV4TWF0Y2hlcyA9IChTZWFyY2hEb2N1bWVudFtdKSBmaWx0ZXJlZC50b0FycmF5KG5ldyBTZWFyY2hEb2N1bWVudFtmaWx0ZXJlZC5zaXplKCldKTsKLQkJU2VhcmNoRW5naW5lLmdldERlZmF1bHRTZWFyY2hQYXJ0aWNpcGFudCgpLmxvY2F0ZU1hdGNoZXMoaW5kZXhNYXRjaGVzLCBwYXR0ZXJuLCBzY29wZSwgcmVxdWVzdG9yLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudCNnZXREb2N1bWVudChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSkKLQkgKi8KLQlwdWJsaWMgU2VhcmNoRG9jdW1lbnQgZ2V0RG9jdW1lbnQoSUZpbGUgZmlsZSkgewotCQkvLyBuZXZlciBnZXRzIGNhbGxlZD8KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hTY29wZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hTY29wZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTVjZDRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoU2NvcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLQotLyoqCi0gKiBVc2VkIHRvIGNvbnN0cmFpbiBKU1AvamF2YSBzZWFyY2ggdG8gY2VydGFpbiBwYXRocyBhbmQgZWxlbWVudHMuCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQU2VhcmNoU2NvcGUgaW1wbGVtZW50cyBJSmF2YVNlYXJjaFNjb3BlIHsKLQotCXByaXZhdGUgYm9vbGVhbiBmRW5jbG9zZXNBbGwgPSBmYWxzZTsKLQlwcml2YXRlIExpc3QgZlJlc291cmNlUGF0aHMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmSmF2YUVsZW1lbnRzID0gbnVsbDsKLQotCXB1YmxpYyBKU1BTZWFyY2hTY29wZSgpIHsKLQkJLy8gZW1wdHkgY29uc3RydWN0b3IganVzdCByZXR1cm5zIHRydWUgZm9yIGV2ZXJ5dGhpbmcKLQkJLy8gZXZlcnl0aGluZyBpcyBpbiBzY29wZQotCQl0aGlzLmZFbmNsb3Nlc0FsbCA9IHRydWU7Ci0JCWluaXQoKTsKLQl9Ci0KLQlwdWJsaWMgSlNQU2VhcmNoU2NvcGUoU3RyaW5nW10gcmVzb3VyY2VTdHJpbmdQYXRoKSB7Ci0JCWluaXQoKTsKLQkJZlJlc291cmNlUGF0aHMuYWRkQWxsKEFycmF5cy5hc0xpc3QocmVzb3VyY2VTdHJpbmdQYXRoKSk7Ci0JfQotCi0JcHVibGljIEpTUFNlYXJjaFNjb3BlKElKYXZhRWxlbWVudFtdIGphdmFFbGVtZW50KSB7Ci0JCWluaXQoKTsKLQkJZkphdmFFbGVtZW50cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChqYXZhRWxlbWVudCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQl0aGlzLmZSZXNvdXJjZVBhdGhzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0aGlzLmZKYXZhRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZW5jbG9zZXMoU3RyaW5nIHJlc291cmNlUGF0aFN0cmluZykgewotCi0JCWlmICh0aGlzLmZFbmNsb3Nlc0FsbCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChlbmNsb3Nlc1BhdGgocmVzb3VyY2VQYXRoU3RyaW5nKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbmNsb3NlcyhJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCi0JCS8vIHBhX1RPRCBpbXBsZW1lbnQKLQkJaWYgKHRoaXMuZkVuY2xvc2VzQWxsKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZW5jbG9zZXMoSVJlc291cmNlUHJveHkgZWxlbWVudCkgewotCi0JCWlmICh0aGlzLmZFbmNsb3Nlc0FsbCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChlbmNsb3Nlc1BhdGgoZWxlbWVudC5yZXF1ZXN0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGF0aChTdHJpbmcgcGF0aCkgewotCQl0aGlzLmZSZXNvdXJjZVBhdGhzLmFkZChwYXRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFbGVtZW50KElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZkphdmFFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGVuY2xvc2VzUGF0aChTdHJpbmcgcG9zc2libGUpIHsKLQotCQlTdHJpbmdbXSBwYXRocyA9IChTdHJpbmdbXSkgZlJlc291cmNlUGF0aHMudG9BcnJheShuZXcgU3RyaW5nW2ZSZXNvdXJjZVBhdGhzLnNpemUoKV0pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocG9zc2libGUuZXF1YWxzKHBhdGhzW2ldKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQotCQlyZXR1cm4gIkpTUFNlYXJjaFNjb3BlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJUGF0aFtdIGVuY2xvc2luZ1Byb2plY3RzQW5kSmFycygpIHsKLQkJcmV0dXJuIChJUGF0aFtdKSBmUmVzb3VyY2VQYXRocy50b0FycmF5KG5ldyBJUGF0aFtmUmVzb3VyY2VQYXRocy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlc0JpbmFyaWVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZXNDbGFzc3BhdGhzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5jbHVkZXNCaW5hcmllcyhib29sZWFuIGluY2x1ZGVzQmluYXJpZXMpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluY2x1ZGVzQ2xhc3NwYXRocyhib29sZWFuIGluY2x1ZGVzQ2xhc3NwYXRocykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hTdXBwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4OTgyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1AyU2VydmxldE5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotCi0vKioKLSAqIENlbnRyYWwgYWNjZXNzIHRvIGphdmEgaW5kZXhpbmcgYW5kIHNlYXJjaC4gQWxsIGNvbnRhY3QgYmV0d2VlbiBKRFQgaW5kZXhpbmcKLSAqIGFuZCBTZWFyY2hpbmcgc2hvdWxkIGJlIGRvbmUgdGhyb3VnaCBoZXJlLgotICogCi0gKiBDbGllbnRzIHNob3VsZCBhY2Nlc3MgdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyB2aWEgdGhlIHNpbmdsZSBpbnN0YW5jZSB2aWEKLSAqIDxjb2RlPmdldEluc3RhbmNlKCk8L2NvZGU+LgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQU2VhcmNoU3VwcG9ydCB7Ci0KLSAgICAvLyBmb3IgZGVidWdnaW5nCi0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3BzZWFyY2giKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSlNQU2VhcmNoU3VwcG9ydCBzaW5nbGV0b24gPSBudWxsOwotCi0gICAgcHJpdmF0ZSBKU1BTZWFyY2hQYXJ0aWNpcGFudCBmUGFydGljaXBhbnQgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBJUGF0aCBmSnNwUGx1Z2luTG9jYXRpb24gPSBudWxsOwotCi0gICAgLy8gcGFfVE9ETyBtYXkgYmUgc2xvdyAoZXNwIGZvciBpbmRleGluZyBlbnRpcmUgd29ya3NwYWNlKQotICAgIHByaXZhdGUgZmluYWwgQ1JDMzIgZkNoZWNrc3VtQ2FsY3VsYXRvciA9IG5ldyBDUkMzMigpOwotCi0gICAgLyoqIG1haW4gY2FuY2VsIG1vbnRpb3IgZm9yIGFsbCBzZWFyY2ggc3VwcG9ydCAqLwotICAgIHByaXZhdGUgZmluYWwgSVByb2dyZXNzTW9uaXRvciBmTW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0KLSAgICBwcml2YXRlIEpTUFNlYXJjaFN1cHBvcnQoKSB7Ci0gICAgICAgIC8vIGZvcmNlIHVzZSBvZiBzaW5nbGUgaW5zdGFuY2UKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG9wZXJhdGlvbiBlbnN1cmVzIHRoYXQgdGhlIGxpdmUgcmVzb3VyY2UncyBzZWFyY2ggbWFya2VycyBzaG93IHVwIGluCi0gICAgICogdGhlIG9wZW4gZWRpdG9yLiBJdCBhbHNvIGFsbG93cyB0aGUgYWJpbGl0eSB0byBwYXNzIGluIGEgUHJvZ3Jlc3NNb25pdG9yCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBTZWFyY2hKb2IgZXh0ZW5kcyBKb2IgaW1wbGVtZW50cyBJSmF2YVNlYXJjaENvbnN0YW50cyB7Ci0KLSAgICAgICAgU3RyaW5nIGZTZWFyY2hUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBJSmF2YVNlYXJjaFNjb3BlIGZTY29wZSA9IG51bGw7Ci0KLSAgICAgICAgaW50IGZTZWFyY2hGb3IgPSBGSUVMRDsKLQotICAgICAgICBpbnQgZkxpbWl0VG8gPSBBTExfT0NDVVJSRU5DRVM7Ci0KLSAgICAgICAgaW50IGZNYXRjaE1vZGUgPSBTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSDsKLQotICAgICAgICBib29sZWFuIGZJc0Nhc2VTZW5zaXRpdmUgPSBmYWxzZTsKLQotICAgICAgICBTZWFyY2hSZXF1ZXN0b3IgZlJlcXVlc3RvciA9IG51bGw7Ci0KLSAgICAgICAgSUphdmFFbGVtZW50IGZFbGVtZW50ID0gbnVsbDsKLQotICAgICAgICAvLyBjb25zdHJ1Y3RvciB3LyBqYXZhIGVsZW1lbnQKLSAgICAgICAgcHVibGljIFNlYXJjaEpvYihJSmF2YUVsZW1lbnQgZWxlbWVudCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgICAgICBzdXBlcihKU1BDb3JlTWVzc2FnZXMuSlNQX1NlYXJjaCArIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICB0aGlzLmZFbGVtZW50ID0gZWxlbWVudDsKLSAgICAgICAgICAgIHRoaXMuZlNjb3BlID0gc2NvcGU7Ci0gICAgICAgICAgICB0aGlzLmZSZXF1ZXN0b3IgPSByZXF1ZXN0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjb25zdHJ1Y3RvciB3LyBzZWFyY2ggdGV4dAotICAgICAgICBwdWJsaWMgU2VhcmNoSm9iKFN0cmluZyBzZWFyY2hUZXh0LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCBpbnQgc2VhcmNoRm9yLCBpbnQgbGltaXRUbywgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICAgICAgc3VwZXIoSlNQQ29yZU1lc3NhZ2VzLkpTUF9TZWFyY2ggKyBzZWFyY2hUZXh0KTsKLSAgICAgICAgICAgIHRoaXMuZlNlYXJjaFRleHQgPSBzZWFyY2hUZXh0OwotICAgICAgICAgICAgdGhpcy5mU2NvcGUgPSBzY29wZTsKLSAgICAgICAgICAgIHRoaXMuZlNlYXJjaEZvciA9IHNlYXJjaEZvcjsKLSAgICAgICAgICAgIHRoaXMuZkxpbWl0VG8gPSBsaW1pdFRvOwotICAgICAgICAgICAgdGhpcy5mTWF0Y2hNb2RlID0gbWF0Y2hNb2RlOwotICAgICAgICAgICAgdGhpcy5mSXNDYXNlU2Vuc2l0aXZlID0gaXNDYXNlU2Vuc2l0aXZlOwotICAgICAgICAgICAgdGhpcy5mUmVxdWVzdG9yID0gcmVxdWVzdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3Igam9iTW9uaXRvcikgewotCi0gICAgICAgICAgICBpZiAoam9iTW9uaXRvciAhPSBudWxsICYmIGpvYk1vbml0b3IuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLSAgICAgICAgICAgIGlmIChKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQotICAgICAgICAgICAgU2VhcmNoUGF0dGVybiBqYXZhU2VhcmNoUGF0dGVybiA9IG51bGw7Ci0gICAgICAgICAgICAvLyBpZiBhbiBlbGVtZW50IGlzIGF2YWlsYWJsZSwgdXNlIHRoYXQgdG8gY3JlYXRlIHNlYXJjaCBwYXR0ZXJuCi0gICAgICAgICAgICAvLyAoZWcuIExvY2FsVmFyaWFibGUpCi0gICAgICAgICAgICAvLyBvdGhlcndpc2UgdXNlIHRoZSB0ZXh0IGFuZCBvdGhlciBwYXJhbXRlcnMKLSAgICAgICAgICAgIGlmICh0aGlzLmZFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgamF2YVNlYXJjaFBhdHRlcm4gPSBTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4odGhpcy5mRWxlbWVudCwgdGhpcy5mTGltaXRUbyk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgamF2YVNlYXJjaFBhdHRlcm4gPSBTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4odGhpcy5mU2VhcmNoVGV4dCwgdGhpcy5mU2VhcmNoRm9yLCB0aGlzLmZMaW1pdFRvLCB0aGlzLmZNYXRjaE1vZGUpOwotCi0gICAgICAgICAgICBpZiAoamF2YVNlYXJjaFBhdHRlcm4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEpTUFNlYXJjaFBhcnRpY2lwYW50W10gcGFydGljaXBhbnRzID0geyBnZXRTZWFyY2hQYXJ0aWNpcGFudCgpIH07Ci0gICAgICAgICAgICAgICAgU2VhcmNoRW5naW5lIGVuZ2luZSA9IG5ldyBTZWFyY2hFbmdpbmUoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoam9iTW9uaXRvciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgam9iTW9uaXRvci5iZWdpblRhc2soIiIsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgZW5naW5lLnNlYXJjaChqYXZhU2VhcmNoUGF0dGVybiwgcGFydGljaXBhbnRzLCB0aGlzLmZTY29wZSwgdGhpcy5mUmVxdWVzdG9yLCBqb2JNb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKQotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gbm9uLUNvcmVFeGNlcHRpb25zIHdpbGwgcGVybWFuZW50bHkgc3RhbGwgdGhlIFdvcmtlciB0aHJlYWQKLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKQotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoam9iTW9uaXRvciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgam9iTW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBlbmQgU2VhcmNoSm9iCi0gICAgLyoqCi0gICAgICogUnVubmFibGUgZm9yY2VzIGNhbGxlciB0byB3YWl0IHVudGlsIGZpbmlzaGVkIChhcyBvcHBvc2VkIHRvIHVzaW5nIGEgSm9iKQotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgU2VhcmNoUnVubmFibGUgaW1wbGVtZW50cyBJV29ya3NwYWNlUnVubmFibGUsIElKYXZhU2VhcmNoQ29uc3RhbnRzIHsKLQotICAgICAgICBTdHJpbmcgZlNlYXJjaFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIElKYXZhU2VhcmNoU2NvcGUgZlNjb3BlID0gbnVsbDsKLQotICAgICAgICBpbnQgZlNlYXJjaEZvciA9IEZJRUxEOwotCi0gICAgICAgIGludCBmTGltaXRUbyA9IEFMTF9PQ0NVUlJFTkNFUzsKLQotICAgICAgICBpbnQgZk1hdGNoTW9kZSA9IFNlYXJjaFBhdHRlcm4uUl9QQVRURVJOX01BVENIOwotCi0gICAgICAgIGJvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZSA9IGZhbHNlOwotCi0gICAgICAgIFNlYXJjaFJlcXVlc3RvciBmUmVxdWVzdG9yID0gbnVsbDsKLQotICAgICAgICBJSmF2YUVsZW1lbnQgZkVsZW1lbnQgPSBudWxsOwotCi0gICAgICAgIC8vIGNvbnN0cnVjdG9yIHcvIGphdmEgZWxlbWVudAotICAgICAgICBwdWJsaWMgU2VhcmNoUnVubmFibGUoSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICAgICAgdGhpcy5mRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgICAgICAgICB0aGlzLmZTY29wZSA9IHNjb3BlOwotICAgICAgICAgICAgdGhpcy5mUmVxdWVzdG9yID0gcmVxdWVzdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29uc3RydWN0b3Igdy8gc2VhcmNoIHRleHQKLSAgICAgICAgcHVibGljIFNlYXJjaFJ1bm5hYmxlKFN0cmluZyBzZWFyY2hUZXh0LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCBpbnQgc2VhcmNoRm9yLCBpbnQgbGltaXRUbywgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICAgICAgdGhpcy5mU2VhcmNoVGV4dCA9IHNlYXJjaFRleHQ7Ci0gICAgICAgICAgICB0aGlzLmZTY29wZSA9IHNjb3BlOwotICAgICAgICAgICAgdGhpcy5mU2VhcmNoRm9yID0gc2VhcmNoRm9yOwotICAgICAgICAgICAgdGhpcy5mTGltaXRUbyA9IGxpbWl0VG87Ci0gICAgICAgICAgICB0aGlzLmZNYXRjaE1vZGUgPSBtYXRjaE1vZGU7Ci0gICAgICAgICAgICB0aGlzLmZJc0Nhc2VTZW5zaXRpdmUgPSBpc0Nhc2VTZW5zaXRpdmU7Ci0gICAgICAgICAgICB0aGlzLmZSZXF1ZXN0b3IgPSByZXF1ZXN0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgaWYgKEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBTZWFyY2hQYXR0ZXJuIGphdmFTZWFyY2hQYXR0ZXJuID0gbnVsbDsKLSAgICAgICAgICAgIC8vIGlmIGFuIGVsZW1lbnQgaXMgYXZhaWxhYmxlLCB1c2UgdGhhdCB0byBjcmVhdGUgc2VhcmNoIHBhdHRlcm4KLSAgICAgICAgICAgIC8vIChlZy4gTG9jYWxWYXJpYWJsZSkKLSAgICAgICAgICAgIC8vIG90aGVyd2lzZSB1c2UgdGhlIHRleHQgYW5kIG90aGVyIHBhcmFtdGVycwotICAgICAgICAgICAgaWYgKHRoaXMuZkVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBqYXZhU2VhcmNoUGF0dGVybiA9IFNlYXJjaFBhdHRlcm4uY3JlYXRlUGF0dGVybih0aGlzLmZFbGVtZW50LCBmTGltaXRUbyk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgamF2YVNlYXJjaFBhdHRlcm4gPSBTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4oZlNlYXJjaFRleHQsIGZTZWFyY2hGb3IsIGZMaW1pdFRvLCBmTWF0Y2hNb2RlKTsKLQotICAgICAgICAgICAgaWYgKGphdmFTZWFyY2hQYXR0ZXJuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBKU1BTZWFyY2hQYXJ0aWNpcGFudFtdIHBhcnRpY2lwYW50cyA9IHsgZ2V0U2VhcmNoUGFydGljaXBhbnQoKSB9OwotICAgICAgICAgICAgICAgIFNlYXJjaEVuZ2luZSBlbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCIiLCAwKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBlbmdpbmUuc2VhcmNoKGphdmFTZWFyY2hQYXR0ZXJuLCBwYXJ0aWNpcGFudHMsIGZTY29wZSwgZlJlcXVlc3RvciwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gbm9uLUNvcmVFeGNlcHRpb25zIHdpbGwgcGVybWFuZW50bHkgc3RhbGwgdGhlIFdvcmtlciB0aHJlYWQKLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gZW5kIFNlYXJjaFJ1bm5hYmxlCi0KLSAgICAvKioKLSAgICAgKiBDbGllbnRzIHNob3VsZCBhY2Nlc3MgdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyB2aWEgdGhlIHNpbmdsZSBpbnN0YW5jZQotICAgICAqIHZpYSBnZXRJbnN0YW5jZSgpCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEpTUFNlYXJjaFN1cHBvcnQgZ2V0SW5zdGFuY2UoKSB7Ci0KLSAgICAgICAgaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotICAgICAgICAgICAgc2luZ2xldG9uID0gbmV3IEpTUFNlYXJjaFN1cHBvcnQoKTsKLSAgICAgICAgcmV0dXJuIHNpbmdsZXRvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBjaGVjayBpZiBhIGZpbGUgaXMgYSBqc3AgZmlsZSAoc2luY2UgdGhpcyBpcyBkb25lCi0gICAgICogZnJlcXVlbnRseSkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKc3AoSUZpbGUgZmlsZSkgewotICAgIAkvLyAocGEpIDIwMDUxMDI1IHJlbW92aW5nIGRlZXAgY29udGVudCB0eXBlIGNoZWNrCi0gICAgCS8vIGJlY2F1c2UgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyZXF1ZW50bHkKLSAgICAJLy8gYW5kIElPIGlzIGV4cGVuc2l2ZQotICAgICAgICBib29sZWFuIGlzSnNwID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgIAkKLSAgICAgICAgICAgIElDb250ZW50VHlwZSBjb250ZW50VHlwZUpTUCA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotICAgICAgICAgICAgLy8gY2hlY2sgdGhpcyBiZWZvcmUgZGVzY3JpcHRpb24sIGl0J3MgbGVzcyBleHBlbnNpdmUKLSAgICAgICAgICAgIGlmIChjb250ZW50VHlwZUpTUC5pc0Fzc29jaWF0ZWRXaXRoKGZpbGUuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgCWlzSnNwID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpc0pzcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzY2hlZHVsZXMgYSBzZWFyY2ggZG9jdW1lbnQgcmVwcmVzZW50aW5nIHRoaXMgSlNQIGZpbGUgZm9yIGluZGV4aW5nIChieQotICAgICAqIHRoZSBqYXZhIGluZGV4ZXIpCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBKU1AgZmlsZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpbmRleGluZyB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFNlYXJjaERvY3VtZW50IGFkZEpzcEZpbGUoSUZpbGUgZmlsZSkgewotICAgICAgICBpZiAoSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSB8fCAhZmlsZS5pc0FjY2Vzc2libGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoREVCVUcpCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFkZGluZyBKU1AgZmlsZToiICsgZmlsZS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIC8vIGNyZWF0ZQotICAgICAgICBTZWFyY2hEb2N1bWVudCBkZWxlZ2F0ZSA9IGNyZWF0ZVNlYXJjaERvY3VtZW50KGZpbGUpOwotICAgICAgICAvLyBudWxsIGlmIG5vdCBhIGpzcCBmaWxlCi0gICAgICAgIGlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGdldFNlYXJjaFBhcnRpY2lwYW50KCkuc2NoZWR1bGVEb2N1bWVudEluZGV4aW5nKGRlbGVnYXRlLCBjb21wdXRlSW5kZXhMb2NhdGlvbihmaWxlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgZmFpbHVyZSBoZXJlIGRvZXNuJ3Qga2VlcCBvdGhlciBkb2N1bWVudHMgZnJvbQotICAgICAgICAgICAgICAgIC8vIGJlaW5nIGluZGV4ZWQKLSAgICAgICAgICAgICAgICAvLyBpZiBwZWZvcm1lZCBpbiBhIGJhdGNoIGNhbGwgKGxpa2UgSlNQSW5kZXhNYW5hZ2VyKQotICAgICAgICAgICAgICAgIGlmIChERUJVRykKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChERUJVRykKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2NoZWR1bGVkIiArIGRlbGVnYXRlICsgImZvciBpbmRleGluZyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgICByZXR1cm4gZGVsZWdhdGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFBlcmZvcm0gYSBqYXZhIHNlYXJjaCB3LyB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4gUnVucyBpbiBhIGJhY2tncm91bmQgSm9iCi0gICAgICogKHJlc3VsdHMgbWF5IHN0aWxsIGNvbWUgaW4gYWZ0ZXIgdGhpcyBtZXRob2QgY2FsbCkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VhcmNoVGV4dAotICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyBvZiB0ZXh0IHRvIHNlYXJjaCBvbgotICAgICAqIEBwYXJhbSBzZWFyY2hGb3IKLSAgICAgKiAgICAgICAgICAgIElKYXZhU2VhcmNoQ29uc3RhbnRzLlRZUEUsIE1FVEhPRCwgRklFTEQsIFBBQ0tBR0UsIGV0Yy4uLgotICAgICAqIEBwYXJhbSBsaW1pdFRvCi0gICAgICogICAgICAgICAgICBJSmF2YVNlYXJjaENvbnN0YW50cy5ERUNMQVJBVElPTlMsCi0gICAgICogICAgICAgICAgICBJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTLAotICAgICAqICAgICAgICAgICAgSUphdmFTZWFyY2hDb25zdGFudHMuSU1QTEVNRU5UT1JTLCBvcgotICAgICAqICAgICAgICAgICAgSUphdmFTZWFyY2hDb25zdGFudHMuQUxMX09DQ1VSUkVOQ0VTCi0gICAgICogQHBhcmFtIG1hdGNoTW9kZQotICAgICAqICAgICAgICAgICAgYWxsb3cgKiB3aWxkY2FyZHMgb3Igbm90Ci0gICAgICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZQotICAgICAqIEBwYXJhbSByZXF1ZXN0b3IKLSAgICAgKiAgICAgICAgICAgIHBhc3NlZCBpbiB0byBhY2NlcHQgc2VhcmNoIG1hdGNoZXMgKGFuZCBkbyAic29tZXRoaW5nIiB3aXRoCi0gICAgICogICAgICAgICAgICB0aGVtKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlYXJjaChTdHJpbmcgc2VhcmNoVGV4dCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgaW50IHNlYXJjaEZvciwgaW50IGxpbWl0VG8sIGludCBtYXRjaE1vZGUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0KLSAgICAgICAgSlNQSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVidWlsZEluZGV4SWZOZWVkZWQoKTsKLQotICAgICAgICBTZWFyY2hKb2Igam9iID0gbmV3IFNlYXJjaEpvYihzZWFyY2hUZXh0LCBzY29wZSwgc2VhcmNoRm9yLCBsaW1pdFRvLCBtYXRjaE1vZGUsIGlzQ2FzZVNlbnNpdGl2ZSwgcmVxdWVzdG9yKTsKLSAgICAgICAgc2V0Q2FuY2VsZWQoZmFsc2UpOwotICAgICAgICBqb2Iuc2V0VXNlcih0cnVlKTsKLSAgICAgICAgLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUwMzIKLSAgICAgICAgLy8gcG9wcyB1cCB1c2VyIG9wZXJhdGlvbiBibG9ja2VkIGRpYWxvZyBpZiB5b3UgcGVyZm9ybSBhIGxvbmcgc2VhcmNoLAotICAgICAgICAvLyB0aGVuIG9wZW4gYSBmaWxlIGJlY2F1c2UgaXQgbG9ja3MgdGhlIHdvcmtzcGFjZQotICAgICAgICAvL2pvYi5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotICAgICAgICBqb2Iuc2NoZWR1bGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2ggZm9yIGFuIElKYXZhRWxlbWVudCwgY29uc3RyYWluZWQgYnkgdGhlIGdpdmVuIHBhcmFtZXRlcnMuIFJ1bnMgaW4KLSAgICAgKiBhIGJhY2tncm91bmQgSm9iIChyZXN1bHRzIG1heSBzdGlsbCBjb21lIGluIGFmdGVyIHRoaXMgbWV0aG9kIGNhbGwpCi0gICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gc2NvcGUKLSAgICAgKiBAcGFyYW0gcmVxdWVzdG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VhcmNoKElKYXZhRWxlbWVudCBlbGVtZW50LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0KLSAgICAgICAgSlNQSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVidWlsZEluZGV4SWZOZWVkZWQoKTsKLQotICAgICAgICBTZWFyY2hKb2Igam9iID0gbmV3IFNlYXJjaEpvYihlbGVtZW50LCBzY29wZSwgcmVxdWVzdG9yKTsKLSAgICAgICAgc2V0Q2FuY2VsZWQoZmFsc2UpOwotICAgICAgICBqb2Iuc2V0VXNlcih0cnVlKTsKLSAgICAgICAgLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUwMzIKLSAgICAgICAgLy9qb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLSAgICAgICAgam9iLnNjaGVkdWxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoIGZvciBhbiBJSmF2YUVsZW1lbnQsIGNvbnN0cmFpbmVkIGJ5IHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiBSdW5zIGluCi0gICAgICogYW4gSVdvcmtzcGFjZSBydW5uYWJsZSAocmVzdWx0cyB3aWxsIGJlIHJlcG9ydGVkIGJ5IHRoZSBlbmQgb2YgdGhpcwotICAgICAqIG1ldGhvZCkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqIEBwYXJhbSBzY29wZQotICAgICAqIEBwYXJhbSByZXF1ZXN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWFyY2hSdW5uYWJsZShJSmF2YUVsZW1lbnQgZWxlbWVudCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgIEpTUEluZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlYnVpbGRJbmRleElmTmVlZGVkKCk7Ci0KLSAgICAgICAgU2VhcmNoUnVubmFibGUgc2VhcmNoUnVubmFibGUgPSBuZXcgU2VhcmNoUnVubmFibGUoZWxlbWVudCwgc2NvcGUsIHJlcXVlc3Rvcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXRDYW5jZWxlZChmYWxzZSk7Ci0gICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHNlYXJjaFJ1bm5hYmxlLCBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0ganNwRmlsZQotICAgICAqIEByZXR1cm4gU2VhcmNoRG9jdW1lbnQgaWYgdGhlIGZpbGUgaXMgbm90IG51bGwsIGV4aXN0cywgYW5kIGlzIGEgSlNQCi0gICAgICogICAgICAgICBmaWxlLCBvdGhlcndpc2UgbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFNlYXJjaERvY3VtZW50IGNyZWF0ZVNlYXJjaERvY3VtZW50KElGaWxlIGpzcEZpbGUpIHsKLQotICAgICAgICBKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBkZWxlZ2F0ZSA9IG51bGw7Ci0gICAgICAgIGlmIChqc3BGaWxlICE9IG51bGwgJiYganNwRmlsZS5leGlzdHMoKSAmJiBpc0pzcChqc3BGaWxlKSkgewotCi0gICAgICAgICAgICBkZWxlZ2F0ZSA9IG5ldyBKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZShuZXcgSlNQU2VhcmNoRG9jdW1lbnQoanNwRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGdldFNlYXJjaFBhcnRpY2lwYW50KCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVsZWdhdGU7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDZW50cmFsaXplZCBwbGFjZSB0byBhY2Nlc3MgSlNQU2VhcmNoRG9jdW1lbnRzICh1c2VkIGJ5Ci0gICAgICogSlNQU2VhcmNoUGFydGljaXBhbnQgYW5kIEpTUFNlYXJjaFJlcXVlc3RvcikKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VhcmNoRG9jUGF0aAotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcmV0dXJuIHRoZSBKU1BTZWFyY2hEb2N1bWVudCBvciBudWxsIGlmIG9uZSBpcyBub3QgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgU2VhcmNoRG9jdW1lbnQgZ2V0U2VhcmNoRG9jdW1lbnQoU3RyaW5nIHNlYXJjaERvY1BhdGgpIHsKLSAgICAgICAgIAotICAgICAgICBTZWFyY2hEb2N1bWVudCBkZWxlZ2F0ZSA9IG51bGw7Ci0gICAgICAgIElGaWxlIGYgPSBmaWxlRm9yQ1VQYXRoKHNlYXJjaERvY1BhdGgpOwotICAgICAgICBpZiAoZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkZWxlZ2F0ZSA9IGNyZWF0ZVNlYXJjaERvY3VtZW50KGYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaGFuZGxlIGZhaWx1cmUgY2FzZS4uLiAoZmlsZSBkZWxldGVkIG1heWJlPykKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVsZWdhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVW5tYW5nbGVzIHRoZSBzZWFyY2hEb2NQYXRoIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIEpTUCBmaWxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZWFyY2hEb2NQYXRoCi0gICAgICovCi0gICAgcHJpdmF0ZSBJRmlsZSBmaWxlRm9yQ1VQYXRoKFN0cmluZyBzZWFyY2hEb2NQYXRoKSB7Ci0gICAgCi0gICAgICAgIFN0cmluZ1tdIHNwbGl0ID0gc2VhcmNoRG9jUGF0aC5zcGxpdCgiLyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSBzcGxpdFtzcGxpdC5sZW5ndGggLSAxXTsKLQotICAgICAgICAvLyBpZ25vcmUgYW55dGhpbmcgYnV0IC5qYXZhIG1hdGNoZXMgKGxpa2UgLmNsYXNzIGJpbmFyeSBtYXRjaGVzKQotICAgICAgICBpZighc2VhcmNoRG9jUGF0aC5lbmRzV2l0aCgiLmphdmEiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IEpTUDJTZXJ2bGV0TmFtZVV0aWwudW5tYW5nbGUoY2xhc3NuYW1lKTsKLSAgICAgICAKLSAgICAgICAgLy8gdHJ5IGFic29sdXRlIHBhdGgKLSAgICAgICAgSUZpbGUgZiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKGZpbGVQYXRoKSk7Ci0gICAgICAgIC8vIHdvcmtzcGFjZSByZWxhdGl2ZSB0aGVuCi0gICAgICAgIGlmKGYgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2MDA5Ci0gICAgICAgICAgICAvLyBtdXN0IGhhdmUgYSBwcm9qZWN0IG5hbWUgYXMgd2VsbAotICAgICAgICAgICAgLy8gd2hpY2ggd291bGQgbWVhbiA+PSAyIHBhdGggc2VnbWVudHMKLSAgICAgICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlUGF0aCk7Ci0gICAgICAgICAgICBpZihwYXRoLnNlZ21lbnRDb3VudCgpID49IDIpIHsKLSAgICAgICAgICAgICAgICBmID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmOwotICAgIH0KLQotICAgIEpTUFNlYXJjaFBhcnRpY2lwYW50IGdldFNlYXJjaFBhcnRpY2lwYW50KCkgewotCi0gICAgICAgIGlmICh0aGlzLmZQYXJ0aWNpcGFudCA9PSBudWxsKQotICAgICAgICAgICAgdGhpcy5mUGFydGljaXBhbnQgPSBuZXcgSlNQU2VhcmNoUGFydGljaXBhbnQoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuZlBhcnRpY2lwYW50OwotICAgIH0KLQotICAgIC8vIFRoaXMgaXMgY2FsbGVkIGZyb20gSlNQUGF0aEluZGV4ZXIKLSAgICAvLyBwYV9UT0RPCi0gICAgLy9ob3cgY2FuIHdlIG1ha2Ugc3VyZSBwYXJ0aWNpcGFudCBpbmRleExvY2F0aW9ucyBhcmUgdXBkYXRlZCBhdCBzdGFydHVwPwotICAgIHB1YmxpYyBmaW5hbCBJUGF0aCBjb21wdXRlSW5kZXhMb2NhdGlvbihJUGF0aCBjb250YWluZXJQYXRoKSB7Ci0KLSAgICAgICAgSVBhdGggaW5kZXhMb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gaW5hZHZlcnRlbnRseSB1c2UgYSBKRFQgSW5kZXgKLSAgICAgICAgLy8gd2Ugd2FudCB0byBiZSBzdXJlIHRvIHVzZSB0aGUgSW5kZXggZnJvbSB0aGUgSlNQIGxvY2F0aW9uCi0gICAgICAgIC8vT2JqZWN0IG9iaiA9IGluZGV4TG9jYXRpb25zLmdldChjb250YWluZXJQYXRoKTsKLSAgICAgICAgLy9pZiAob2JqICE9IG51bGwpIHsKLSAgICAgICAgLy8gICAgaW5kZXhMb2NhdGlvbiA9IChTdHJpbmcpIG9iajsKLSAgICAgICAgLy99IGVsc2UgewotICAgICAgICAgICAgLy8gY3JlYXRlIGluZGV4IGVudHJ5Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aFN0cmluZyA9IGNvbnRhaW5lclBhdGgudG9PU1N0cmluZygpOwotICAgICAgICAgICAgdGhpcy5mQ2hlY2tzdW1DYWxjdWxhdG9yLnJlc2V0KCk7Ci0gICAgICAgICAgICB0aGlzLmZDaGVja3N1bUNhbGN1bGF0b3IudXBkYXRlKHBhdGhTdHJpbmcuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBMb25nLnRvU3RyaW5nKHRoaXMuZkNoZWNrc3VtQ2FsY3VsYXRvci5nZXRWYWx1ZSgpKSArICIuaW5kZXgiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBvbmx5IGRpZmZlcmVuY2UgZnJvbQotICAgICAgICAgICAgLy8gSW5kZXhNYW5hZ2VyI2NvbXB1dGVJbmRleExvY2F0aW9uKC4uLikKLSAgICAgICAgICAgIGluZGV4TG9jYXRpb24gPSBnZXRNb2RlbEpzcFBsdWdpbldvcmtpbmdMb2NhdGlvbigpLmFwcGVuZChmaWxlTmFtZSk7Ci0KLSAgICAgICAgICAgIC8vIHBhX1RPRE8gbmVlZCB0byBhZGQgdG8gamF2YSBwYXRoIHRvbywgc28gSkRUIHNlYXJjaCBzdXBwb3J0IGtub3dzCi0gICAgICAgICAgICAvLyB0aGVyZSBzaG91bGQgYmUgYSBub24gaW50ZXJuYWwgd2F5IHRvIGRvIHRoaXMuCi0gICAgICAgICAgICAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NjQKLSAgICAgICAgICAgIEphdmFNb2RlbE1hbmFnZXIuZ2V0SW5kZXhNYW5hZ2VyKCkuaW5kZXhMb2NhdGlvbnMucHV0KGNvbnRhaW5lclBhdGgsIGluZGV4TG9jYXRpb24pOwotICAgICAgICAvL30KLSAgICAgICAgcmV0dXJuIGluZGV4TG9jYXRpb247Ci0gICAgfQotCi0gICAgLy8gY29waWVkIGZyb20gSkRUIEluZGV4TWFuYWdlcgotICAgIHB1YmxpYyBJUGF0aCBnZXRNb2RlbEpzcFBsdWdpbldvcmtpbmdMb2NhdGlvbigpIHsKLQotICAgICAgICBpZiAodGhpcy5mSnNwUGx1Z2luTG9jYXRpb24gIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmZKc3BQbHVnaW5Mb2NhdGlvbjsKLQotICAgICAgICAvLyBBcHBlbmQgdGhlIGZvbGRlciBuYW1lICJqc3BzZWFyY2giIHRvIGtlZXAgdGhlIHN0YXRlIGxvY2F0aW9uIGFyZWEgY2xlYW5lcgotICAgICAgICBJUGF0aCBzdGF0ZUxvY2F0aW9uID0gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZCgianNwc2VhcmNoIik7Ci0KLSAgICAgICAgLy8gcGFfVE9ETyB3b3JrYXJvdW5kIGZvcgotICAgICAgICAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjIyNjcKLSAgICAgICAgLy8gY29waWVkIGZyb20gSW5kZXhNYW5hZ2VyCi0gICAgICAgIFN0cmluZyBkZXZpY2UgPSBzdGF0ZUxvY2F0aW9uLmdldERldmljZSgpOwotICAgICAgICBpZiAoZGV2aWNlICE9IG51bGwgJiYgZGV2aWNlLmNoYXJBdCgwKSA9PSAnLycpCi0gICAgICAgICAgICBzdGF0ZUxvY2F0aW9uID0gc3RhdGVMb2NhdGlvbi5zZXREZXZpY2UoZGV2aWNlLnN1YnN0cmluZygxKSk7Ci0KLSAgICAgICAgLy8gZW5zdXJlIHRoYXQgaXQgZXhpc3RzIG9uIGRpc2sKLSAgICAgICAgRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShzdGF0ZUxvY2F0aW9uLnRvT1NTdHJpbmcoKSk7Ci0JCWlmICghZm9sZGVyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCXRyeSB7Ci0JCQkJZm9sZGVyLm1rZGlyKCk7Ci0JCQl9Ci0JCQljYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMuZkpzcFBsdWdpbkxvY2F0aW9uID0gc3RhdGVMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKU1AgSW5kZXhpbmcgYW5kIFNlYXJjaCBqb2JzIGNoZWNrIHRoaXMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBmaW5hbCB2b2lkIHNldENhbmNlbGVkKGJvb2xlYW4gY2FuY2VsKSB7Ci0gICAgCS8vU3lzdGVtLm91dC5wcmludGxuKCJzZWFyY2ggc3VwcG9ydCBtb25pdG9yIiArIGZNb25pdG9yKTsKLSAgICAgICAgZk1vbml0b3Iuc2V0Q2FuY2VsZWQoY2FuY2VsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKU1AgSW5kZXhpbmcgYW5kIFNlYXJjaCBqb2JzIGNoZWNrIHRoaXMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBmaW5hbCBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0KLSAgICAgICAgcmV0dXJuIGZNb25pdG9yLmlzQ2FuY2VsZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKU1AgSW5kZXhpbmcgYW5kIFNlYXJjaCBqb2JzIGNoZWNrIHRoaXMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCi0gICAgICAgIHJldHVybiB0aGlzLmZNb25pdG9yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUwNzE0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0phdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uOwotCi0KLS8qKgotICogV3JhcHBlciBtZXRob2QgdG8gc2V0IGdldFBhdGgoKSBwYXRoIHRvIGJlIHRoZSBwYXRoIG9mIHRoZSBjb21waWxhdGlvbiB1bml0IAotICogZm9yIHRoZSBqc3AgZmlsZS4gKHNpbmNlIGl0J3MgYSBmaW5hbCBtZXRob2QsIGl0IG5lZWRzIHRvIGJlIHNldCB2aWEgY29uc3RydWN0b3IpCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBleHRlbmRzIFNlYXJjaERvY3VtZW50IHsKLQkKLQlwcml2YXRlIEpTUFNlYXJjaERvY3VtZW50IGZKU1BTZWFyY2hEb2MgPSBudWxsOwotCQotCXB1YmxpYyBKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZShKU1BTZWFyY2hEb2N1bWVudCBqc3BTZWFyY2hEb2MpIHsKLQkJCi0JCXN1cGVyKGpzcFNlYXJjaERvYy5nZXRQYXRoKCksIGpzcFNlYXJjaERvYy5nZXRQYXJ0aWNpcGFudCgpKTsKLQkJdGhpcy5mSlNQU2VhcmNoRG9jID0ganNwU2VhcmNoRG9jOwotCX0KLQotCXB1YmxpYyBieXRlW10gZ2V0Qnl0ZUNvbnRlbnRzKCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZkpTUFNlYXJjaERvYy5nZXRCeXRlQ29udGVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgY2hhcltdIGdldENoYXJDb250ZW50cygpIHsKLQkJCi0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0Q2hhckNvbnRlbnRzKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVRleHQoKSB7Ci0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0SmF2YVRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZkpTUFNlYXJjaERvYy5nZXRFbmNvZGluZygpOwotCX0KLQkKLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJCi0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0RmlsZSgpOwotCX0KLQkKLQlwdWJsaWMgSlNQVHJhbnNsYXRpb25FeHRlbnNpb24gZ2V0SnNwVHJhbnNsYXRpb24oKSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldEpTUFRyYW5zbGF0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0SnNwT2Zmc2V0KGludCBqYXZhT2Zmc2V0KSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldEpzcE9mZnNldChqYXZhT2Zmc2V0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJdGhpcy5mSlNQU2VhcmNoRG9jLnJlbGVhc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL051bGxTZWFyY2hEb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9OdWxsU2VhcmNoRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5OWExMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL051bGxTZWFyY2hEb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRvcjsKLQotCi0KLS8qKgotICogQW4gZW1wdHkgc2VydmxldCwgc2FmZSBmb3IgSmF2YSBzZWFyY2ggcGFydGljaXBhdGlvbgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgTnVsbFNlYXJjaERvY3VtZW50IGV4dGVuZHMgU2VhcmNoRG9jdW1lbnQgewotCQotCVN0cmluZ0J1ZmZlciBmRW1wdHlTZXJ2bGV0QnVmZmVyID0gbnVsbDsKLQkKLQlwdWJsaWMgTnVsbFNlYXJjaERvY3VtZW50KFN0cmluZyBkb2N1bWVudFBhdGgpIHsKLQkJc3VwZXIoZG9jdW1lbnRQYXRoLCBuZXcgSlNQU2VhcmNoUGFydGljaXBhbnQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5mRW1wdHlTZXJ2bGV0QnVmZmVyID0gbmV3IEpTUFRyYW5zbGF0b3IoKS5nZXRFbXB0eVRyYW5zbGF0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBieXRlW10gZ2V0Qnl0ZUNvbnRlbnRzKCkgewotCQlyZXR1cm4gdGhpcy5mRW1wdHlTZXJ2bGV0QnVmZmVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKTsKLQl9Ci0JCi0JcHVibGljIGNoYXJbXSBnZXRDaGFyQ29udGVudHMoKSB7Ci0JCXJldHVybiB0aGlzLmZFbXB0eVNlcnZsZXRCdWZmZXIudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVN0YXRlRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlU3RhdGVEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZThhNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlU3RhdGVEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgb25seSBmb3IgcmVtZW1iZXJpbmcgb2xkIGFuZCBuZXcgZW1iZWRkZWQgaGFuZGxlcnMsIAotICogaW4gdGhlIGV2ZW50IGEgcmUtaW5pdCBpcyBuZWVkZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZFR5cGVTdGF0ZURhdGEgewotCi0KLQlFbWJlZGRlZFR5cGVIYW5kbGVyIG9sZEhhbmRsZXI7Ci0JRW1iZWRkZWRUeXBlSGFuZGxlciBuZXdIYW5kbGVyOwotCi0JcHVibGljIEVtYmVkZGVkVHlwZVN0YXRlRGF0YShFbWJlZGRlZFR5cGVIYW5kbGVyIG9sZEhhbmRsZXIsIEVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3SGFuZGxlcikgewotCQl0aGlzLm9sZEhhbmRsZXIgPSBvbGRIYW5kbGVyOwotCQl0aGlzLm5ld0hhbmRsZXIgPSBuZXdIYW5kbGVyOwotCX0KLQotCXB1YmxpYyBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldE5ld0hhbmRsZXIoKSB7Ci0JCXJldHVybiBuZXdIYW5kbGVyOwotCX0KLQotCXB1YmxpYyBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldE9sZEhhbmRsZXIoKSB7Ci0JCXJldHVybiBvbGRIYW5kbGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvSlNQTW9kZWxMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0pTUE1vZGVsTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZjIxM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvSlNQTW9kZWxMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSlNQRkNvbnRlbnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5QYWdlRGlyZWN0aXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuUGFnZURpcmVjdGl2ZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5QYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvbWRvY3VtZW50LkRPTU1vZGVsRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JSlNQSGVhZENvbnRlbnREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSlNQRG9jdW1lbnRIZWFkQ29udGVudERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5KU1BEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5KU1BNb2RlbFF1ZXJ5QWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuSlNQUmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLklDb250ZW50RGVzY3JpcHRpb25Gb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlRmFtaWx5Rm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuSlNQQ2FwYWJsZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5EZWJ1Z0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5ET01Nb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZS5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIEpTUE1vZGVsTG9hZGVyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbExvYWRlciB7Ci0JcHJvdGVjdGVkIGZpbmFsIGludCBNQVhfQlVGRkVSRURfU0laRV9GT1JfUkVTRVRfTUFSSyA9IDIwMDAwMDsKLQotCS8qKgotCSAqIERNVyAtIE5vdGU6IEkgdGhpbmsgdGhlIGVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGluIElNb2RlbE1hbmFnZXIgY2FuIGJlCi0JICogcmVtb3ZlZAotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRUeXBlUmVnaXN0cnkgZW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5OwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX01JTUVfVFlQRSA9ICJ0ZXh0L2h0bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfTEFOR1VBR0UgPSAiamF2YSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBKU1BNb2RlbExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBlbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5Ci0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVSZWdpc3RyeSBnZXRFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkoKSB7Ci0JCWlmIChlbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJZW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5ID0gRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsLmdldEluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCgpIHsKLQkJRE9NTW9kZWxGb3JKU1AgbW9kZWwgPSBuZXcgRE9NTW9kZWxGb3JKU1AoKTsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIEZvciBKU1AgZmlsZXMsIHRleHQvaHRtbCBpcyB0aGUgZGVmYXVsdCBjb250ZW50IHR5cGUuIFRoaXMgbWF5IHdhbnQKLQkgKiB0aGlzIGRpZmZlcmVudCBmb3IgdHlwZXMgbGlrZSBqc3YgKGpzcCBmb3Igdm9pY2UgeG1sKSBGb3Igbm93LCBoYXJkCi0JICogY29kZSB0byBuZXcgaW5zdGFuY2UuIEluIGZ1dHVyZSwgc2hvdWxkIGdldCBpbnN0YW5jZSBmcm9tIHJlZ2lzdHJ5LgotCSAqIAotCSAqIFNwZWNpZmljYXRpb24gY2l0ZXMgSFRNTCBhcyB0aGUgZGVmYXVsdCBjb250ZW50VHlwZS4KLQkgKi8KLQlwcml2YXRlIEVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0SlNQRGVmYXVsdEVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCUVtYmVkZGVkVHlwZVJlZ2lzdHJ5IHJlZyA9IGdldEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSgpOwotCi0JCVN0cmluZyBtaW1lVHlwZSA9IG51bGw7Ci0JCS8vIGRlZmF1bHQgZW1iZWRkZWQgdHlwZSBmb3IgZnJhZ21lbnRzCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShtb2RlbCk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJbWltZVR5cGUgPSBKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUENPTlRFTlRUWVBFLCBmaWxlLCB0cnVlKTsKLQkJCX0KLQkJfQotCQltaW1lVHlwZSA9IG1pbWVUeXBlID09IG51bGwgPyBnZXREZWZhdWx0TWltZVR5cGUoKSA6IG1pbWVUeXBlOwotCQlyZXR1cm4gcmVnLmdldFR5cGVGb3IobWltZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXREZWZhdWx0TWltZVR5cGUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0TWltZVR5cGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX01JTUVfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBJU3RydWN0dXJlZERvY3VtZW50LCB0aGF0IGhhcwotCSAqIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhcHByb3ByaWF0ZSBwYXJzZXIuIEZvciBtYW55IGxvYWRlcnMsIHRoZQotCSAqIChkZWZhdWx0KSBwYXJzZXIgdXNlZCBpcyBrbm93biBmb3IgYW55IGlucHV0LiBGb3Igb3RoZXJzLCB0aGUgY29ycmVjdAotCSAqIHBhcnNlciAoYW5kIGl0cyBpbml0aWFsaXphdGlvbikgaXMgbm9ybWFsbCBkZXBlbmRlbnQgb24gdGhlIGNvbnRlbnQgb2YKLQkgKiB0aGUgZmlsZS4gVGhpcyBuby1hcmd1bWVudCBtZXRob2Qgc2hvdWxkIGFzc3VtZSAiZW1wdHkgaW5wdXQiIGFuZCB3b3VsZAotCSAqIHRoZXJlZm9yZSByZXR1cm4gdGhlIGRlZmF1bHQgcGFyc2VyIGZvciB0aGUgZGVmYXVsdCBjb250ZW50VHlwZS4KLQkgKiAKLQkgKiBJZiB0aGUgcGFyc2VyIGlzIHRvIGhhbmRsZSB0YWcgbGlicmFyaWVzLCBpdCBtdXN0IGhhdmUgYSBUYWdsaWJTdXBwb3J0Ci0JICogb2JqZWN0IHdpdGggYSB2YWxpZCBVUklSZXNvbHZlciBhbmQgdGhpcyBJU3RydWN0dXJlZERvY3VtZW50IGF0dGFjaGVkCi0JICogdG8gaXQgYmVmb3JlIHRoZSBjb250ZW50cyBhcmUgc2V0IG9uIHRoZSBJU3RydWN0dXJlZERvY3VtZW50LgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IG5ld1N0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKGdldFBhcnNlcigpKTsKLQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KS5zZXRSZVBhcnNlcihuZXcgSlNQUmVQYXJzZXIoKSk7Ci0JCS8vIHN0cnVjdHVyZWREb2N1bWVudC5zZXREb2N1bWVudFBhcnRpdGlvbmVyKG5ldwotCQkvLyBKU1BKYXZhRG9jdW1lbnRQYXJ0aW9uZXIoKSk7Ci0JCS8vIGV2ZW4gdGhvdWdoIHRoaXMgaXMgYW4gImVtcHR5IG1vZGVsIiAuLi4gd2Ugd2FudCBpdCB0byBoYXZlIGF0Ci0JCS8vIGxlYXN0IHRoZQotCQkvLyBkZWZhdWx0IGVtYmVkZGVkZWQgY29udGVudCB0eXBlIGhhbmRsZXIKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBlbWJlZGRlZFR5cGUgPSBnZXRKU1BEZWZhdWx0RW1iZWRkZWRUeXBlKG51bGwpOwotCQllbWJlZGRlZFR5cGUuaW5pdGlhbGl6ZVBhcnNlcigoSlNQQ2FwYWJsZVBhcnNlcikgc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpKTsKLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJLy8gcmVtZW1iZXIsIHRoZSBMb2FkZXIKLQkJLy8gd2lsbCBuZWVkIHRvIGZpbmlzaCBpbml0aWFsaXphdGlvbiBvZiBwYXJzZXIKLQkJLy8gYmFzZWQgb24gImVtYmVkZGVkIGNvbnRlbnQiCi0JCXJldHVybiBuZXcgSlNQU291cmNlUGFyc2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlTG9hZEFkYXB0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCXN1cGVyLnByZUxvYWRBZGFwdChzdHJ1Y3R1cmVkTW9kZWwpOwotCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWw7Ci0JCS8vCi0JCS8vIGRvY3VtZW50IG11c3QgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0IGZvciB0aGlzIHRvCi0JCS8vIHdvcmsuCi0JCURvY3VtZW50IGRvY3VtZW50ID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChkb2N1bWVudCk7Ci0JCS8vIGlmIHRoZXJlIGlzIGEgbW9kZWwgaW4gdGhlIGFkYXB0ZXIsIHRoaXMgd2lsbCBhZGFwdCBpdCB0bwotCQkvLyBmaXJzdCBub2RlLiBBZnRlciB0aGF0IHRoZSBQcm9wYWdhdGluZ0FkYXRlciBzcHJlYWRzIG92ZXIgdGhlCi0JCS8vIGNoaWxkcmVuIGJlaW5nCi0JCS8vIGNyZWF0ZWQuIEVhY2ggdGltZSB0aGF0IGhhcHBlbmRzLCBhIHNpZGUgZWZmZWN0IGlzIHRvCi0JCS8vIGFsc28gInNwcmVhZCIgc3ByZWNpZmljIHJlZ2lzdGVyZWQgYWRhcHRlcnMsCi0JCS8vIHRoZXkgdHdvIGNhbiBwcm9waWdhdGUgaXMgbmVlZGVkLgotCQkvLyBUaGlzICdnZXQnIGNhdXNlcyBmaXJzdCB0byBiZSBiZSBhdHRhY2hlZC4KLQkJUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJLy8gbWF5IG1ha2UgdGhpcyBlYXNpZXIgdG8gdXNlIGluIGZ1dHVlCi0JCXByb3BhZ2F0aW5nQWRhcHRlci5hZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeShuZXcgUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5KCkpOwotCQlpZiAoRGVidWcuZGVidWdOb3RpZmljYXRpb25BbmRFdmVudHMpIHsKLQkJCXByb3BhZ2F0aW5nQWRhcHRlci5hZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeShuZXcgRGVidWdBZGFwdGVyRmFjdG9yeSgpKTsKLQkJfQotCQkvLyBGb3IgSlNQcywgdGhlIE1vZGVsUXVlcnlBZGFwdGVyIG11c3QgYmUgImF0dGFjaGVkIiB0byB0aGUgZG9jdW1lbnQKLQkJLy8gYmVmb3JlIGNvbnRlbnQgaXMgc2V0IGluIHRoZSBtb2RlbCwgc28gdGFnbGliIGluaXRpemF0aW9uIGNhbgotCQkvLyB0YWtlIHBsYWNlLgotCQkoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJLy8KLQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHRob3NlIGZhY3RvcmllcyB3aGljaCBtdXN0IGJlIGF0dGFjaGVkIHRvIHRoZQotCSAqIHN0cnVjdHVyZWRNb2RlbCBiZWZvcmUgY29udGVudCBpcyBhcHBsaWVkLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQkvLwotCQlmYWN0b3J5ID0gbmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUCgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQlmYWN0b3J5ID0gbmV3IFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCWZhY3RvcnkgPSBuZXcgUGFnZURpcmVjdGl2ZUFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBJSlNQSGVhZENvbnRlbnREZXRlY3RvciBnZXRIZWFkUGFyc2VyKCkgewotCQlyZXR1cm4gbmV3IEpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvcigpOwotCX0KLQotCXByaXZhdGUgSUNvbnRlbnREZXNjcmlwdGlvbiBnZXRDb250ZW50RGVzY3JpcHRpb24oSURvY3VtZW50IGRvYykgewotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRG9jdW1lbnRSZWFkZXIgcmVhZGVyID0gbmV3IERvY3VtZW50UmVhZGVyKGRvYyk7Ci0JCXJldHVybiBnZXRDb250ZW50RGVzY3JpcHRpb24ocmVhZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFuIGlucHV0IHN0cmVhbSBBc3N1bWVzIGl0J3MgSlNQCi0JICogY29udGVudC4gQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0gd2hlbiBmaW5pc2hlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVhZGVyCi0JICogQHJldHVybiB0aGUgSUNvbnRlbnREZXNjcmlwdGlvbiBmb3IgaW4sIG9yIG51bGwgaWYgaW4gaXMgbnVsbAotCSAqLwotCXByaXZhdGUgSUNvbnRlbnREZXNjcmlwdGlvbiBnZXRDb250ZW50RGVzY3JpcHRpb24oUmVhZGVyIHJlYWRlcikgewotCi0JCWlmIChyZWFkZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlDb250ZW50RGVzY3JpcHRpb24gZGVzYyA9IG51bGw7Ci0JCXRyeSB7Ci0KLQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZUpTUCA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotCQkJZGVzYyA9IGNvbnRlbnRUeXBlSlNQLmdldERlc2NyaXB0aW9uRm9yKHJlYWRlciwgSUNvbnRlbnREZXNjcmlwdGlvbi5BTEwpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHJlYWRlciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVhZGVyLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBkZXNjOwotCX0KLQotCXByaXZhdGUgSUZpbGUgZ2V0RmlsZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGxvY2F0aW9uKTsKLQkJCQlpZiAoIXBhdGgudG9GaWxlKCkuZXhpc3RzKCkgJiYgcGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldExhbmd1YWdlLgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TGFuZ3VhZ2UoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gZmlyc3QgY2hlY2sgdGhlIG1vZGVsIChkb2N1bWVudCBpdHNlbGYpIHRvIHNlZSBpZiBjb250YWlucwotCQlyZXN1bHQgPSBnZXRMYW5ndWFnZUZyb21TdHJ1Y3R1cmVkRG9jdW1lbnQobW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkvLyBOb3RlOiBpZiBtb2RlbCBjb250YWlucyBhbiB1bnN1cHBvcnRlZAotCQkvLyBsYW5ndWFnZSwgd2UnbGwgZXZlbiByZXR1cm4gaXQsCi0JCS8vIHNpbmNlIHdobyBrbm93cyB3aGF0IGZ1dHVyZSBob2xkcy4KLQotCQkvLyBnZXQgZGVmYXVsdCBsYW5ndWFnZSBzcGVjaWZpZWQgaW4gcHJvcGVydGllcyBwYWdlCi0JCUlGaWxlIGZpbGUgPSBnZXRGaWxlKG1vZGVsKTsKLQkJcmVzdWx0ID0gSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KEpTUEZDb250ZW50UHJvcGVydGllcy5KU1BMQU5HVUFHRSwgZmlsZSwgdHJ1ZSk7Ci0KLQkJLy8gYWx3YXlzIHJldHVybiBzb21ldGhpbmcKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBERUZBVUxUX0xBTkdVQUdFOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldExhbmd1YWdlRnJvbVN0cnVjdHVyZWREb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRMYW5ndWFnZUZyb21TdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyBiYXNjaWFsbHkgc2FtZSBhbGdvcml0aG0gYXMgZ2V0IGVuY29kaW5nIG9yCi0JCS8vIGdldCBjb250ZW50IHR5cGUgZnJvbSBzdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JCUlKU1BIZWFkQ29udGVudERldGVjdG9yIGxvY2FsSGVhZFBhcnNlciA9IGdldEhlYWRQYXJzZXIoKTsKLQkJLy8gd2UgY2FuIGJlIGFzc3VyZWQgdGhhdCBpdHMgYWxyZWFkeSBiZWVuCi0JCS8vIHBhcnNlZC4gSWYgbm90IGNhbGwgcGFyc2VIZWFkZXJGb3JQYWdlRGlyZWN0aXZlKCkKLQkJLy8gYmVmb3JlIGNhbGxpbmcgZ2V0TGFuZ3VhZ2U7Ci0JCWxvY2FsSGVhZFBhcnNlci5zZXQoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGxvY2FsSGVhZFBhcnNlci5nZXRMYW5ndWFnZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlCi0JCQkvLyBUT0RPIG5lZWQgdG8gcmVjb25zaWRlciBkZXNpZ24gdG8gYXZvaWQKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgInJlaW5pdGlhbGl6ZSIgc2luY2UgdGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBhdCBsZWFzdCB0aGUKLQkgKiBkZWZhdWx0IG9uZSBhc3NpZ25lZCwgYmVmb3JlIHdlIHN0YXJ0IGNoZWNraW5nIHRoZSBzdHJlYW0KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVJbml0aWFsaXplRW1iZWRkZWRUeXBlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIEVtYmVkZGVkVHlwZUhhbmRsZXIgb2xkRW1iZWRkZWRDb250ZW50VHlwZSwgRW1iZWRkZWRUeXBlSGFuZGxlciBuZXdFbWJlZGRlZENvbnRlbnRUeXBlKSB7Ci0JCS8vIGNoZWNrIHByb2dyYW0gbG9naWMKLQkJQXNzZXJ0LmlzTm90TnVsbChvbGRFbWJlZGRlZENvbnRlbnRUeXBlLCAiUHJvZ3JhbSBlcnJvcjogaW52YWxpZCBjYWxsIGR1cmluZyBtb2RlbCBpbml0aWFsaXphdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIG9uY2Ugd2Uga25vdyB0aGUgZW1iZWRkZWQgY29udGVudCB0eXBlLCB3ZSBuZWVkIHRvIHNldCBpdCBpbiB0aGUKLQkJLy8gUGFnZURpcmVjdGl2ZUFkYXB0ZXIgLi4uIHRoZSBvcmRlciBvZiBpbml0aWFsaXphdGlvbiBpcwotCQkvLyBjcml0aWNhbCBoZXJlLCB0aGUgZG9jIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQsIGJ1dCBpdHMgY29udGVudHMgbm90Ci0JCS8vIHNldCB5ZXQsCi0JCS8vIGFuZCBhbGwgZmFjdG9yaWVzIG11c3QgaGF2ZSBiZWVuIHNldCB1cCBhbHNvLgotCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBtb2RlbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXIgcGFnZURpcmVjdGl2ZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXIpIGRvY3VtZW50LmdldEV4aXN0aW5nQWRhcHRlcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCS8vID09PiAvLyBQcm9wYWdhdGluZ0FkYXB0ZXIgcHJvcGFnYXRpbmdBZGFwdGVyID0gKFByb3BhZ2F0aW5nQWRhcHRlcikKLQkJLy8gKChJTm9kZU5vdGlmaWVyKQotCQkvLyBkb2N1bWVudCkuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCS8vID09PiAvLyBNb2RlbFF1ZXJ5QWRhcHRlciBtb2RlbFF1ZXJ5QWRhcHRlciA9IChNb2RlbFF1ZXJ5QWRhcHRlcikKLQkJLy8gKChJTm9kZU5vdGlmaWVyKQotCQkvLyBkb2N1bWVudCkuZ2V0RXhpc3RpbmdBZGFwdGVyKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJb2xkRW1iZWRkZWRDb250ZW50VHlwZS51bmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkobW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCQlvbGRFbWJlZGRlZENvbnRlbnRUeXBlLnVuaW5pdGlhbGl6ZVBhcnNlcigoSlNQQ2FwYWJsZVBhcnNlcikgc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpKTsKLQkJLy8gc2luY2UgJ2RvY3VtZW50JyBpcyBub3QgcmVjcmVhdGVkIGluIHRoaXMKLQkJLy8gcmVpbml0IHBhdGgsIHdlIG5lZWQgdG8gcmVtb3ZlIGFsbCBhZGFwdGVycywKLQkJLy8gZXhjZXB0IGZvciB0aGUgcHJvcGFnYXRlZCBhZGFwdGVycyAoaW5jbHVkaW5nIHBhZ2UKLQkJLy8gZGlyZWN0aXZlIGFkYXB0ZXIsIGFuZCBtb2RlbCBxdWVyeSBhZGFwdGVyKS4KLQkJLy8gdG8gYWNjb21wbGlzaCB0aGlzLCB3ZSdsbCBqdXN0IHJlbW92ZSBhbGwsIHRoZW4KLQkJLy8gYWRkIGJhY2sgd2l0aCBhIGNhbGwgdG8gcHJlLWxvYWQgYWRhcHQuCi0JCS8vIGxldCBjbGllbnRzIGRlY2lkZSB0byB1bmxvYWQgYWRhcHRlcnMgZnJvbSBkb2N1bWVudAotCQkvLyBDb2xsZWN0aW9uIG9sZEFkYXB0ZXJzID0gZG9jdW1lbnQuZ2V0QWRhcHRlcnMoKTsKLQkJLy8gSXRlcmF0b3Igb2xkQWRhcHRlcnNJdGVyYXRvciA9IG9sZEFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCS8vIHdoaWxlIChvbGRBZGFwdGVyc0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkvLyBJTm9kZUFkYXB0ZXIgb2xkQWRhcHRlciA9IChJTm9kZUFkYXB0ZXIpCi0JCS8vIG9sZEFkYXB0ZXJzSXRlcmF0b3IubmV4dCgpOwotCQkvLyBpZiAob2xkQWRhcHRlciAhPSBwYWdlRGlyZWN0aXZlQWRhcHRlciAmJiBvbGRBZGFwdGVyICE9Ci0JCS8vIHByb3BhZ2F0aW5nQWRhcHRlciAmJiBvbGRBZGFwdGVyICE9IG1vZGVsUXVlcnlBZGFwdGVyKSB7Ci0JCS8vIC8vIERPIE5PVCByZW1vdmUgZGlyZWN0bHkhCi0JCS8vIC8vIGNhbiBjaGFuZ2UgY29udGVudHMgd2hpbGUgaW4gbm90aWZpdHkgbG9vcCEKLQkJLy8gLy9vbGRBZGFwdGVyc0l0ZXJhdG9yLnJlbW92ZSgpOwotCQkvLyBkb2N1bWVudC5yZW1vdmVBZGFwdGVyKG9sZEFkYXB0ZXIpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gRE1XOiBJIGJlbGlldmUgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyBpcyBuZWVkZWQsCi0JCS8vIHNpbmNlIHJlbGVhc2VzIGNhY2hlZCBhZGFwdGVycwotCQkvLyBpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBEb2N1bWVudEltcGwpIHsKLQkJLy8gKChEb2N1bWVudEltcGwpIGRvY3VtZW50KS5yZWxlYXNlRG9jdW1lbnRUeXBlKCk7Ci0JCS8vICgoRG9jdW1lbnRJbXBsKSBkb2N1bWVudCkucmVsZWFzZVN0eWxlU2hlZXRzKCk7Ci0JCS8vIH0KLQkJLy8gcmVtZW1iZXIsIGVtYmVkZGVkIHR5cGUgZmFjdG9yaWVzIGFyZSBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgd2hlbgotCQkvLyBlbWJlZGVkVHlwZSBjaGFuZ2VkCi0JCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLnNldEVtYmVkZGVkVHlwZShuZXdFbWJlZGRlZENvbnRlbnRUeXBlKTsKLQkJLy8gLy8gYnV0IHN0aWxsIG5lZWQgdG8gY2xlYXIgdGhlIHBhZ2UgZGlyZWN0aXZlIHdhdGNoZXJzLCBhbmQgbGV0Ci0JCS8vIHRoZW0gYmUgcmVkaXNjb3ZlcmVkICh3aXRoIG5ldywgYWNjdXJhdGUgbm9kZSBhcyB0YXJnZXQpCi0JCS8vIHBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsZWFyUGFnZVdhdGNoZXJzKCk7Ci0JCWlmIChuZXdFbWJlZGRlZENvbnRlbnRUeXBlICE9IG51bGwpIHsKLQotCQkJLy8gbmVlZCB0byBudWxsIG91dCBvciBlbHNlIE1vZGVsUGFyc2VyQWRhcHRlcgotCQkJLy8gd29uJ3QgZ2V0IHJlaW5pdGlhbGl6ZWQKLQkJCSgoRE9NTW9kZWxJbXBsKSBtb2RlbCkuc2V0TW9kZWxQYXJzZXIobnVsbCk7Ci0KLQkJCW5ld0VtYmVkZGVkQ29udGVudFR5cGUuaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeShtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKSk7Ci0JCQluZXdFbWJlZGRlZENvbnRlbnRUeXBlLmluaXRpYWxpemVQYXJzZXIoKEpTUENhcGFibGVQYXJzZXIpIHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKSk7Ci0KLQkJCS8vIHBhcnRpdGlvbmVyIHNldHVwIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGlzIGxvYWRlcgotCQkJSURvY3VtZW50UGFydGl0aW9uZXIgZG9jdW1lbnRQYXJ0aXRpb25lciA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXREb2N1bWVudFBhcnRpdGlvbmVyKCk7Ci0JCQkvLyBJU1NVRTogdGhpcyBsb2dpYyBpcyBmbGF3ZWQsIG5vdCBzdXJlIG9mIG9yaWdpbmFsIGludGVudCwgYnV0Ci0JCQkvLyBhZGRlZCBudWxsL3R5cGUgY2hlY2tzIGZvciBzYWZldHkuCi0JCQlpZiAoZG9jdW1lbnRQYXJ0aXRpb25lciAhPSBudWxsICYmIGRvY3VtZW50UGFydGl0aW9uZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQKSB7Ci0JCQkJaWYgKG5ld0VtYmVkZGVkQ29udGVudFR5cGUuZ2V0RmFtaWx5SWQoKS5lcXVhbHMoQ29udGVudFR5cGVJZEZvclhNTC5Db250ZW50VHlwZUlEX1hNTCkpIHsKLQkJCQkJKChTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQKSBkb2N1bWVudFBhcnRpdGlvbmVyKS5zZXRFbWJlZGRlZFBhcnRpdGlvbmVyKG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MKCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChuZXdFbWJlZGRlZENvbnRlbnRUeXBlLmdldEZhbWlseUlkKCkuZXF1YWxzKENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTCkpIHsKLQkJCQkJKChTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQKSBkb2N1bWVudFBhcnRpdGlvbmVyKS5zZXRFbWJlZGRlZFBhcnRpdGlvbmVyKG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gYWRkaW5nIGxhbmd1YWdlIGhlcmUsIGluIHRoaXMgY29udmllbmVudCBjZW50cmFsCi0JCS8vIGxvY2F0aW9uLCBidXQgc29tZSBvYnZpb3VzIHJlbmFtaW5nIG9yIHJlZmFjdG9yaW5nCi0JCS8vIHdvdWxkbid0IGh1cnQsIGluIGZ1dHVyZS4KLQkJLy8gSSBuZWVkZWQgdG8gYWRkIHRoaXMgbGFuZ3VhZ2Ugc2V0dGluZyBmb3IgSlNQIEZyYWdtZW50IHN1cHBvcnQKLQkJLy8gTm90ZTogdGhpcyBpcyB0aGUgb25lIHRoYXQgY291bnRzLCBzaW5jZSBhdCB0aGlzIHBvaW50LAotCQkvLyB0aGUgbW9kZWwgaGFzIGFuIElELCBzbyB3ZSBjYW4gbG9vayB1cCBJRmlsZSwgZXRjLgotCQlTdHJpbmcgbGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZShtb2RlbCk7Ci0JCWlmIChsYW5ndWFnZSAhPSBudWxsICYmIGxhbmd1YWdlLmxlbmd0aCgpID4gMCkgewotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyAicmVpbml0aWFsaXplIiBzaW5jZSB0aGVyZSBzaG91bGQgYWx3YXlzIGJlIGF0IGxlYXN0IHRoZQotCSAqIGRlZmF1bHQgb25lIGFzc2lnbmVkLCBiZWZvcmUgd2Ugc3RhcnQgY2hlY2tpbmcgdGhlIHN0cmVhbQotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0Q2xvbmVPZkVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBFbWJlZGRlZFR5cGVIYW5kbGVyIG9sZEVtYmVkZGVkQ29udGVudFR5cGUsIEVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3RW1iZWRkZWRDb250ZW50VHlwZSkgewotCQkvLyBjaGVjayBwcm9ncmFtIGxvZ2ljCi0JCUFzc2VydC5pc05vdE51bGwob2xkRW1iZWRkZWRDb250ZW50VHlwZSwgIlByb2dyYW0gZXJyb3I6IGludmFsaWQgY2FsbCBkdXJpbmcgbW9kZWwgaW5pdGlhbGl6YXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBvbmNlIHdlIGtub3cgdGhlIGVtYmVkZGVkIGNvbnRlbnQgdHlwZSwgd2UgbmVlZCB0byBzZXQgaXQgaW4gdGhlCi0JCS8vIFBhZ2VEaXJlY3RpdmVBZGFwdGVyIC4uLiB0aGUgb3JkZXIgb2YgaW5pdGlhbGl6YXRpb24gaXMKLQkJLy8gY3JpdGljYWwgaGVyZSwgdGhlIGRvYyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBidXQgaXRzIGNvbnRlbnRzIG5vdAotCQkvLyBzZXQgeWV0LAotCQkvLyBhbmQgYWxsIGZhY3RvcmllcyBtdXN0IGhhdmUgYmVlbiBzZXQgdXAgYWxzby4KLQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgbW9kZWw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IGRvbU1vZGVsLmdldERvY3VtZW50KCk7Ci0JCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVyKSBkb2N1bWVudC5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJLy8gPT0+IC8vIFByb3BhZ2F0aW5nQWRhcHRlciBwcm9wYWdhdGluZ0FkYXB0ZXIgPSAoUHJvcGFnYXRpbmdBZGFwdGVyKQotCQkvLyAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCS8vID09PiAvLyBNb2RlbFF1ZXJ5QWRhcHRlciBtb2RlbFF1ZXJ5QWRhcHRlciA9IChNb2RlbFF1ZXJ5QWRhcHRlcikKLQkJLy8gKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCS8vIGJlY2F1c2UsIGV2ZW4gaW4gdGhlIGNsb25lIGNhc2UsIHRoZSBtb2RlbCBoYXMgYmVlbiBwYXJpdGFsbHkKLQkJLy8gaW50aWFsaXplZCB3aXRoCi0JCS8vIHRoZSBvbGQgZW1iZWRkZWQgdHlwZSAoZHVyaW5nIGNyZWF0ZU1vZGVsKSwgd2UgbmVlZCB0byB1bml0aWFsaXplCi0JCS8vIHBhcnRzIG9mIGl0LCBiYXNlZCBvbiB0aGUgb2xkIChvciBkZWZhdWx0KSBvbmVzCi0JCW9sZEVtYmVkZGVkQ29udGVudFR5cGUudW5pbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpKTsKLQkJb2xkRW1iZWRkZWRDb250ZW50VHlwZS51bmluaXRpYWxpemVQYXJzZXIoKEpTUENhcGFibGVQYXJzZXIpIHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKSk7Ci0JCS8vIHJlbWVtYmVyLCBlbWJlZGRlZCB0eXBlIGZhY3RvcmllcyBhcmUgYXV0b21hdGljYWxseSBjbGVhcmVkIHdoZW4KLQkJLy8gZW1iZWRlZFR5cGUgY2hhbmdlZAotCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5zZXRFbWJlZGRlZFR5cGUobmV3RW1iZWRkZWRDb250ZW50VHlwZSk7Ci0JCWlmIChuZXdFbWJlZGRlZENvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCW5ld0VtYmVkZGVkQ29udGVudFR5cGUuaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeShtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKSk7Ci0JCQluZXdFbWJlZGRlZENvbnRlbnRUeXBlLmluaXRpYWxpemVQYXJzZXIoKEpTUENhcGFibGVQYXJzZXIpIHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKSk7Ci0JCX0KLQkJLy8gYWRkaW5nIGxhbmd1YWdlIGhlcmUsIGluIHRoaXMgY29udmllbmVudCBjZW50cmFsCi0JCS8vIGxvY2F0aW9uLCBidXQgc29tZSBvYnZpb3VzIHJlbmFtaW5nIG9yIHJlZmFjdG9yaW5nCi0JCS8vIHdvdWxkbid0IGh1cnQsIGluIGZ1dHVyZS4KLQkJLy8gSSBuZWVkZWQgdG8gYWRkIHRoaXMgbGFuZ3VhZ2Ugc2V0dGluZyBmb3IgSlNQIEZyYWdtZW50IHN1cHBvcnQKLQkJLy8gTm90ZTogdGhpcyBpcyB0aGUgb25lIHRoYXQgY291bnRzLCBzaW5jZSBhdCB0aGlzIHBvaW50LAotCQkvLyB0aGUgbW9kZWwgaGFzIGFuIElELCBzbyB3ZSBjYW4gbG9vayB1cCBJRmlsZSwgZXRjLgotCQlTdHJpbmcgbGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZShtb2RlbCk7Ci0JCWlmIChsYW5ndWFnZSAhPSBudWxsICYmIGxhbmd1YWdlLmxlbmd0aCgpID4gMCkgewotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCURvY3VtZW50IGRvYyA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXIgcGFnZURpcmVjdGl2ZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9jKS5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBlbWJlZGRlZEhhbmRsZXIgPSBwYWdlRGlyZWN0aXZlQWRhcHRlci5nZXRFbWJlZGRlZFR5cGUoKTsKLQkJcmV0dXJuIGVtYmVkZGVkSGFuZGxlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RW1iZWRkZWRUeXBlUHJlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQotCQkvLyBub3RlOiB0aGlzIHdpbGwgY3VycmVudGx5IG9ubHkgd29yayBmb3IgbW9kZWxzIGJhY2tlZCBieSBmaWxlcwotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkQ29udGVudFR5cGUgPSBudWxsOwotCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBtb2RlbDsKLQotCQlpZiAoZW1iZWRkZWRDb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlJQ29udGVudERlc2NyaXB0aW9uIGRlc2MgPSBnZXRDb250ZW50RGVzY3JpcHRpb24obW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCU9iamVjdCBwcm9wID0gbnVsbDsKLQotCQkJCXByb3AgPSBkZXNjLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuQ09OVEVOVF9GQU1JTFlfQVRUUklCVVRFKTsKLQkJCQlpZiAocHJvcCAhPSBudWxsKSB7Ci0JCQkJCWlmIChDb250ZW50VHlwZUZhbWlseUZvckhUTUwuSFRNTF9GQU1JTFkuZXF1YWxzKHByb3ApKSB7Ci0JCQkJCQllbWJlZGRlZENvbnRlbnRUeXBlID0gRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsLmdldEluc3RhbmNlKCkuZ2V0VHlwZUZvcigidGV4dC9odG1sIik7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoZW1iZWRkZWRDb250ZW50VHlwZSA9PSBudWxsKSB7Ci0KLQkJCQkJcHJvcCA9IGRlc2MuZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5DT05URU5UX1RZUEVfQVRUUklCVVRFKTsKLQkJCQkJaWYgKHByb3AgIT0gbnVsbCkgewotCQkJCQkJZW1iZWRkZWRDb250ZW50VHlwZSA9IEVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpLmdldFR5cGVGb3IoKFN0cmluZykgcHJvcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQlQYWdlRGlyZWN0aXZlQWRhcHRlciBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0KLQkJaWYgKGVtYmVkZGVkQ29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuc2V0RW1iZWRkZWRUeXBlKGVtYmVkZGVkQ29udGVudFR5cGUpOwotCQkJZW1iZWRkZWRDb250ZW50VHlwZS5pbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHVzZSBkZWZhdWx0IGVtYmVkZGVkVHlwZSBpZiBpdCBjb3VsZG4ndCBkZXRlcm1pbmUgb25lCi0JCQllbWJlZGRlZENvbnRlbnRUeXBlID0gZ2V0SlNQRGVmYXVsdEVtYmVkZGVkVHlwZShtb2RlbCk7Ci0JCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5zZXRFbWJlZGRlZFR5cGUoZW1iZWRkZWRDb250ZW50VHlwZSk7Ci0JCQllbWJlZGRlZENvbnRlbnRUeXBlLmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkobW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVtYmVkZGVkVHlwZVBvc3QoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkvLyBzaG91bGQgYWxyZWFkeSBiZSBpbml0aWFsaXplZCAoZnJvbSBpbml0RW1iZWRkZWRUeXBlUHJlKQotCQkvLyB2aWEgSUNvbnRlbnREZXNjcmlwdGlvbgotCQlzZXRMYW5ndWFnZUluUGFnZURpcmVjdGl2ZShtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGluaXRFbWJlZGRlZFR5cGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgZXhpc3RpbmdFbWJlZGRlZFR5cGUgPSBnZXRFbWJlZGRlZFR5cGUob2xkTW9kZWwpOwotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIG5ld0VtYmVkZGVkQ29udGVudFR5cGUgPSBleGlzdGluZ0VtYmVkZGVkVHlwZS5uZXdJbnN0YW5jZSgpOwotCQlpZiAoZXhpc3RpbmdFbWJlZGRlZFR5cGUgPT0gbnVsbCkgewotCQkJaW5pdEVtYmVkZGVkVHlwZVByZShuZXdNb2RlbCk7Ci0JCQlpbml0RW1iZWRkZWRUeXBlUG9zdChuZXdNb2RlbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBpbml0RW1iZWRkZWRUeXBlKG5ld01vZGVsKTsKLQkJCWluaXRDbG9uZU9mRW1iZWRkZWRUeXBlKG5ld01vZGVsLCBleGlzdGluZ0VtYmVkZGVkVHlwZSwgbmV3RW1iZWRkZWRDb250ZW50VHlwZSk7Ci0JCQlzZXRMYW5ndWFnZUluUGFnZURpcmVjdGl2ZShuZXdNb2RlbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYW5ndWFnZUluUGFnZURpcmVjdGl2ZShJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCWlmIChuZXdNb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gKChJRE9NTW9kZWwpIG5ld01vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXIgcGFnZURpcmVjdGl2ZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXIpIGRvY3VtZW50LmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkJU3RyaW5nIGxhbmd1YWdlID0gZ2V0TGFuZ3VhZ2UobmV3TW9kZWwpOwotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpOwotCQl9Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgcmVpbml0aWFsaXplKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBvbGRIYW5kbGVyID0gbnVsbDsKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBuZXdIYW5kbGVyID0gbnVsbDsKLQkJT2JqZWN0IHJlaW5pdFN0YXRlRGF0YSA9IG1vZGVsLmdldFJlaW5pdGlhbGl6ZVN0YXRlRGF0YSgpOwotCQlpZiAocmVpbml0U3RhdGVEYXRhIGluc3RhbmNlb2YgRW1iZWRkZWRUeXBlU3RhdGVEYXRhKSB7Ci0JCQlFbWJlZGRlZFR5cGVTdGF0ZURhdGEgb2xkU3RhdGVEYXRhID0gKEVtYmVkZGVkVHlwZVN0YXRlRGF0YSkgcmVpbml0U3RhdGVEYXRhOwotCQkJb2xkSGFuZGxlciA9IG9sZFN0YXRlRGF0YS5nZXRPbGRIYW5kbGVyKCk7Ci0JCQluZXdIYW5kbGVyID0gb2xkU3RhdGVEYXRhLmdldE5ld0hhbmRsZXIoKTsKLQkJCS8vIG5vdGUuIFdlIHNob3VsZCBhbHJlYWR5IGhhdmUgdGhlIG5ldyBoYW5kbGVyIGluIHRoZSBtb2RlbCdzCi0JCQkvLyAoZG9jdW1lbnRzKSBhZGFwdGVycywKLQkJCS8vIHNvIG5lZWQgbmVlZCB0byB1c2UgdGhlIG9sZCBvbmUgdG8gdW5kbyB0aGUgb2xkIHN0YXRlIGRhdGEKLQkJCXJlSW5pdGlhbGl6ZUVtYmVkZGVkVHlwZShtb2RlbCwgb2xkSGFuZGxlciwgbmV3SGFuZGxlcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBmb3IgbGFuZ3VhZ2UgLi4uIHdlIHNvbWVkYXkgTUlHSFQgaGF2ZSB0byBkbyBzb21ldGhpbmcKLQkJCS8vIGhlcmUsIGJ1dCBmb3Igbm93LCB3ZSBkb24ndCBoYXZlIGFueSBtb2RlbC1zaWRlIGxhbmd1YWdlCi0JCQkvLyBzZW5zaXRpdmUgYWRhcHRlcnMuCi0JCX0KLQkJcmV0dXJuIHN1cGVyLnJlaW5pdGlhbGl6ZShtb2RlbCk7Ci0JfQotCi0JcHVibGljIElNb2RlbExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBKU1BNb2RlbExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCWlmIChkb2N1bWVudExvYWRlckluc3RhbmNlID09IG51bGwpIHsKLQkJCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBuZXcgSlNQRG9jdW1lbnRMb2FkZXIoKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnRMb2FkZXJJbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmVzIHRoYXQgYW4gSW5wdXRTdHJlYW0gaGFzIG1hcmsvcmVzZXQgc3VwcG9ydC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oSW5wdXRTdHJlYW0gb3JpZ2luYWwpIHsKLQkJaWYgKG9yaWdpbmFsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG9yaWdpbmFsLm1hcmtTdXBwb3J0ZWQoKSkKLQkJCXJldHVybiBvcmlnaW5hbDsKLQkJcmV0dXJuIG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG9yaWdpbmFsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGdldEJ5dGVzKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBpbnQgbWF4KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlieXRlW10gc21hbGxCdWZmZXIgPSBuZXcgYnl0ZVttYXhdOwotCQlieXRlW10gcmV0dXJuQnVmZmVyID0gbnVsbDsKLQkJaW50IG5SZWFkID0gaW5wdXRTdHJlYW0ucmVhZChzbWFsbEJ1ZmZlciwgMCwgbWF4KTsKLQkJaWYgKG5SZWFkIDwgbWF4KSB7Ci0JCQkvLyBlbXB0eSBmaWxlIHdpbGwgcmV0dXJuIC0xOwotCQkJaWYgKG5SZWFkIDwgMCkKLQkJCQluUmVhZCA9IDA7Ci0JCQlieXRlW10gc21hbGxlckJ1ZmZlciA9IG5ldyBieXRlW25SZWFkXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoc21hbGxCdWZmZXIsIDAsIHNtYWxsZXJCdWZmZXIsIDAsIG5SZWFkKTsKLQkJCXJldHVybkJ1ZmZlciA9IHNtYWxsZXJCdWZmZXI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm5CdWZmZXIgPSBzbWFsbEJ1ZmZlcjsKLQkJfQotCQlyZXR1cm4gcmV0dXJuQnVmZmVyOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IHN1cGVyLmNyZWF0ZU1vZGVsKG9sZE1vZGVsKTsKLQkJLy8gRm9yIEpTUHMsIHRoZSBNb2RlbFF1ZXJ5QWRhcHRlciBtdXN0IGJlICJhdHRhY2hlZCIgdG8gdGhlIGRvY3VtZW50Ci0JCS8vIGJlZm9yZSBjb250ZW50IGlzIHNldCBpbiB0aGUgbW9kZWwsIHNvIHRhZ2xpYiBpbml0aXphdGlvbiBjYW4KLQkJLy8gdGFrZSBwbGFjZS4KLQkJLy8gSW4gdGhpcyAiY2xvbmUgbW9kZWwiIGNhc2UsIHdlIGNyZWF0ZSBhIE1vZGVsUXVlcnkgYWRhcHRlcgotCQkvLyBjcmVhdGUgYSBuZXcgaW5zdGFuY2UgZnJvbSB0aGUgb2xkIGRhdGEuIE5vdGU6IEkgdGhpbmsgdGhpcwotCQkvLyAiZm9yY2VkIGZpdCIgb25seSB3b3JrcyBoZXJlIHNpbmNlIHRoZSBpbXBsaW1lbnRhaXRvbiBvZgotCQkvLyBNb2RlbFF1ZXJ5QWRhdHBlciBkb2VzIG5vdAotCQkvLyBoYXZlIHRvIGJlIHJlbGVhc2VkLgotCi0JCU1vZGVsUXVlcnlBZGFwdGVyIG1vZGVsUXVlcnlBZGFwdGVyID0gZ2V0TW9kZWxRdWVyeUFkYXB0ZXIobW9kZWwpOwotCQlpZiAobW9kZWxRdWVyeUFkYXB0ZXIgPT0gbnVsbCkgewotCQkJbW9kZWxRdWVyeUFkYXB0ZXIgPSBnZXRNb2RlbFF1ZXJ5QWRhcHRlcihvbGRNb2RlbCk7Ci0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQlkb2N1bWVudC5hZGRBZGFwdGVyKG5ldyBKU1BNb2RlbFF1ZXJ5QWRhcHRlckltcGwobW9kZWxRdWVyeUFkYXB0ZXIuZ2V0Q01Eb2N1bWVudENhY2hlKCksIG1vZGVsUXVlcnlBZGFwdGVyLmdldE1vZGVsUXVlcnkoKSwgbW9kZWxRdWVyeUFkYXB0ZXIuZ2V0SWRSZXNvbHZlcigpKSk7Ci0KLQkJfQotCi0KLQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBNb2RlbFF1ZXJ5QWRhcHRlciBnZXRNb2RlbFF1ZXJ5QWRhcHRlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCUlET01Eb2N1bWVudCBkb2N1bWVudCA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQotCQlNb2RlbFF1ZXJ5QWRhcHRlciBtb2RlbFF1ZXJ5QWRhcHRlciA9IChNb2RlbFF1ZXJ5QWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMzlmMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSlNQRG9jdW1lbnRIZWFkQ29udGVudERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5KU1BEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5JSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5UYWdUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuSlNQU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5BYnN0cmFjdE1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi1wdWJsaWMgY2xhc3MgTW9kZWxIYW5kbGVyRm9ySlNQIGV4dGVuZHMgQWJzdHJhY3RNb2RlbEhhbmRsZXIgewotCi0JLyoqCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuCi0JICogYXQgcnVuIHRpbWUgd2l0aCB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIEFzc29jaWF0ZWRDb250ZW50VHlwZUlEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuCi0JICogYXQgcnVuIHRpbWUgd2l0aCB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTW9kZWxIYW5kbGVySUQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLm1vZGVsaGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIE1vZGVsSGFuZGxlckZvckpTUCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0SWQoTW9kZWxIYW5kbGVySUQpOwotCQlzZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChBc3NvY2lhdGVkQ29udGVudFR5cGVJRCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSlNQVGFnTmFtZShKU1BTb3VyY2VQYXJzZXIgcGFyc2VyLCBTdHJpbmcgdGFnbmFtZSkgewotCQlCbG9ja01hcmtlciBibSA9IG5ldyBCbG9ja01hcmtlcih0YWduYW1lLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgdHJ1ZSk7Ci0JCXBhcnNlci5hZGRCbG9ja01hcmtlcihibSk7Ci0JfQotCi0JcHVibGljIElNb2RlbExvYWRlciBnZXRNb2RlbExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKU1BNb2RlbExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlyZXR1cm4gbmV3IEpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgSlNQRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5zdXJlVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeShJU3RydWN0dXJlZE1vZGVsIHNtKSB7Ci0JCWlmIChzbS5nZXRGYWN0b3J5UmVnaXN0cnkoKS5nZXRGYWN0b3J5Rm9yKElKU1BUcmFuc2xhdGlvbi5jbGFzcykgPT0gbnVsbCkgewotCQkJLyoKLQkJCSAqIENoZWNrIGZvciB0YWcvdGFneCBmaWxlcywgb3RoZXJ3aXNlIGFkZCB0aGUgSlNQIHRyYW5zbGF0aW9uCi0JCQkgKiBmYWN0b3J5IGZvciBiZXR0ZXIgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIHBvc3NpYmxlIHN1YnR5cGVzCi0JCQkgKiBvZiBKU1AuCi0JCQkgKi8KLQkJCUlDb250ZW50VHlwZSB0aGlzQ29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShzbS5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKSk7Ci0JCQlJQ29udGVudFR5cGUgdGFnQ29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQVEFHKTsKLQkJCWlmICh0aGlzQ29udGVudFR5cGUuaXNLaW5kT2YodGFnQ29udGVudFR5cGUpKSB7Ci0JCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFRhZ1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkoKTsKLQkJCQlzbS5nZXRGYWN0b3J5UmVnaXN0cnkoKS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLS8vCQkJCWlmIChmYWxzZSkgewotLy8JCQkJCUlDb250ZW50VHlwZSB0ZXh0Q29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShJQ29udGVudFR5cGVNYW5hZ2VyLkNUX1RFWFQpOwotLy8JCQkJCUlDb250ZW50VHlwZSBqc3BDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotLy8JCQkJCS8qCi0vLwkJCQkJICogVGhpcyBJQWRhcHRlck1hbmFnZXIgY2FsbCBpcyB0ZW1wb3JhcnkgcGxhY2Vob2xkZXIgY29kZQotLy8JCQkJCSAqIHRoYXQgc2hvdWxkIG5vdCBiZSByZWxpZWQgdXBvbiBpbiBhbnkgd2F5IQotLy8JCQkJCSAqLwotLy8JCQkJCWlmICh0aGlzQ29udGVudFR5cGUuaXNLaW5kT2YoanNwQ29udGVudFR5cGUpKSB7Ci0vLwkJCQkJCUlDb250ZW50VHlwZSB0ZXN0Q29udGVudFR5cGUgPSB0aGlzQ29udGVudFR5cGU7Ci0vLwkJCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgaG9sZEZhY3RvcnkgPSBudWxsOwotLy8JCQkJCQl3aGlsZSAoIXRlc3RDb250ZW50VHlwZS5lcXVhbHModGV4dENvbnRlbnRUeXBlKSAmJiBob2xkRmFjdG9yeSA9PSBudWxsKSB7Ci0vLwkJCQkJCQlob2xkRmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGVzdENvbnRlbnRUeXBlLmdldElkKCksIElKU1BUcmFuc2xhdGlvbi5jbGFzcy5nZXROYW1lKCkpOwotLy8JCQkJCQkJdGVzdENvbnRlbnRUeXBlID0gdGVzdENvbnRlbnRUeXBlLmdldEJhc2VUeXBlKCk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0JCQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQlmYWN0b3J5ID0gbmV3IEpTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkoKTsKLQkJCQl9Ci0KLQkJCQlzbS5nZXRGYWN0b3J5UmVnaXN0cnkoKS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9yVGFnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNiNWY2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLQotcHVibGljIGNsYXNzIE1vZGVsSGFuZGxlckZvclRhZyBleHRlbmRzIE1vZGVsSGFuZGxlckZvckpTUCB7Ci0KLQkvKioKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4KLQkgKiBhdCBydW4gdGltZSB3aXRoIHdoYXQncyBpbiByZWdpc3RyeSEgKHNvIHNob3VsZCBuZXZlciBiZSAnZmluYWwnKQotCSAqLwotCXN0YXRpYyBTdHJpbmcgQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ3NvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4KLQkgKiBhdCBydW4gdGltZSB3aXRoIHdoYXQncyBpbiByZWdpc3RyeSEgKHNvIHNob3VsZCBuZXZlciBiZSAnZmluYWwnKQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNb2RlbEhhbmRsZXJJRCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUubW9kZWxoYW5kbGVyLnRhZyI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIE1vZGVsSGFuZGxlckZvclRhZygpIHsKLQkJc3VwZXIoKTsKLQkJc2V0SWQoTW9kZWxIYW5kbGVySUQpOwotCQlzZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChBc3NvY2lhdGVkQ29udGVudFR5cGVJRCk7Ci0JfQotCi0JcHVibGljIElNb2RlbExvYWRlciBnZXRNb2RlbExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYWdNb2RlbExvYWRlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL1RhZ01vZGVsTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9UYWdNb2RlbExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTNkYTc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL1RhZ01vZGVsTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBUYWdNb2RlbExvYWRlciBleHRlbmRzIEpTUE1vZGVsTG9hZGVyIHsKLQotCXB1YmxpYyBUYWdNb2RlbExvYWRlcigpIHsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkgewotCQlMaXN0IGZhY3RvcmllcyA9IHN1cGVyLmdldEFkYXB0ZXJGYWN0b3JpZXMoKTsKLQkJLyoKLQkJICogUmVwbGFjZSB0aGUgZGVmYXVsdCBKU1AgbW9kZWwgcXVlcnkgYnkgdXNpbmcgb3VyIG93biBmYWN0b3J5Ci0JCSAqLwotCi0JCUl0ZXJhdG9yIGkgPSBmYWN0b3JpZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoKChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBpLm5leHQoKSkuaXNGYWN0b3J5Rm9yVHlwZShNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcykpIHsKLQkJCQlpLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0KLQkJZmFjdG9yaWVzLmFkZChuZXcgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yVGFnKCkpOwotCQlyZXR1cm4gZmFjdG9yaWVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5QWRhcHRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5QWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM1MGU1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSlNQTW9kZWxRdWVyeUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVySW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgSlNQTW9kZWxRdWVyeUFkYXB0ZXJJbXBsIGV4dGVuZHMgTW9kZWxRdWVyeUFkYXB0ZXJJbXBsIHsKLQlwdWJsaWMgSlNQTW9kZWxRdWVyeUFkYXB0ZXJJbXBsKENNRG9jdW1lbnRDYWNoZSBjbURvY3VtZW50Q2FjaGUsIE1vZGVsUXVlcnkgbW9kZWxRdWVyeSwgVVJJUmVzb2x2ZXIgaWRSZXNvbHZlcikgewotCQlzdXBlcihjbURvY3VtZW50Q2FjaGUsIG1vZGVsUXVlcnksIGlkUmVzb2x2ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ODlmNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLlNpbXBsZUFzc29jaWF0aW9uUHJvdmlkZXI7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpTUE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGV4dGVuZHMgU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWxRdWVyeUNNUHJvdmlkZXIKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5Q01Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBKU1BNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcigpIHsKLQkJc3VwZXIobmV3IEpTUE1vZGVsUXVlcnlDTVByb3ZpZGVyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNzdhNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSlNQQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5EZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlDTVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQ01Eb2N1bWVudCBwcm92aWRlciBmb3IgSFRNTCBhbmQgSlNQIGRvY3VtZW50cy4KLSAqLwotcHVibGljIGNsYXNzIEpTUE1vZGVsUXVlcnlDTVByb3ZpZGVyIGltcGxlbWVudHMgTW9kZWxRdWVyeUNNUHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIEpTUE1vZGVsUXVlcnlDTVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIENNRG9jdW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgRE9NIE5vZGUuIG9yIG51bGwgaWYgbm8KLQkgKiBDTURvY3VtZW50IGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgRE9NIE5vZGUuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoTm9kZSBub2RlKSB7Ci0JCUNNRG9jdW1lbnQgamNtZG9jID0gbnVsbDsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJSURPTU1vZGVsIG1vZGVsID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0TW9kZWwoKTsKLQkJCVN0cmluZyBtb2RlbFBhdGggPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCWlmIChtb2RlbFBhdGggIT0gbnVsbCAmJiAhSU1vZGVsTWFuYWdlci5VTk1BTkFHRURfTU9ERUwuZXF1YWxzKG1vZGVsUGF0aCkpIHsKLQkJCQlmbG9hdCB2ZXJzaW9uID0gRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLmdldEluc3RhbmNlKCkuZ2V0SlNQVmVyc2lvbihuZXcgUGF0aChtb2RlbFBhdGgpKTsKLQkJCQlqY21kb2MgPSBKU1BDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KHZlcnNpb24pOwotCQkJfQotCQl9Ci0JCWlmIChqY21kb2MgPT0gbnVsbCkgewotCQkJamNtZG9jID0gSlNQQ01Eb2N1bWVudEZhY3RvcnkuZ2V0Q01Eb2N1bWVudCgpOwotCQl9Ci0JCQotCQlDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJU3RyaW5nIGVsZW1lbnROYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCi0JCQkJLy8gdGVzdCB0byBzZWUgaWYgdGhpcyBub2RlIGJlbG9uZ3MgdG8gSlNQJ3MgQ01Eb2N1bWVudCAoY2FzZQotCQkJCS8vIHNlbnNpdGl2ZSkKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWMgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGpjbWRvYy5nZXRFbGVtZW50cygpLmdldE5hbWVkSXRlbShlbGVtZW50TmFtZSk7Ci0JCQkJaWYgKGRlYyAhPSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IGpjbWRvYzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCVN0cmluZyBwcmVmaXggPSBub2RlLmdldFByZWZpeCgpOwotCi0JCQlpZiAocmVzdWx0ID09IG51bGwgJiYgcHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCAmJiBub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQkvLyBjaGVjayBwb3NpdGlvbiBkZXBlbmRlbnQKLQkJCQlJRE9NTm9kZSB4bWxOb2RlID0gKElET01Ob2RlKSBub2RlOwotCQkJCVRMRENNRG9jdW1lbnRNYW5hZ2VyIHRsZG1nciA9IFRhZ2xpYkNvbnRyb2xsZXIuZ2V0VExEQ01Eb2N1bWVudE1hbmFnZXIoeG1sTm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQkJaWYgKHRsZG1nciAhPSBudWxsKSB7Ci0JCQkJCUxpc3QgZG9jdW1lbnRzID0gdGxkbWdyLmdldENNRG9jdW1lbnRUcmFja2Vycyhub2RlLmdldFByZWZpeCgpLCB4bWxOb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQkvLyB0aGVyZSBzaG91bGRuJ3QgYmUgbW9yZSB0aGFuIG9uZSBjbWRvY3VtZW50IHJldHVybmVkCi0JCQkJCWlmIChkb2N1bWVudHMgIT0gbnVsbCAmJiBkb2N1bWVudHMuc2l6ZSgpID4gMCkKLQkJCQkJCXJlc3VsdCA9IChDTURvY3VtZW50KSBkb2N1bWVudHMuZ2V0KDApOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSlNQTW9kZWxRdWVyeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGVlNTc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuUGFnZURpcmVjdGl2ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlRmFtaWx5Rm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5Nb2RlbFF1ZXJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLlNpbXBsZUFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBKU1BNb2RlbFF1ZXJ5SW1wbCBleHRlbmRzIE1vZGVsUXVlcnlJbXBsIHsKLQotCS8vIElTU1VFOiBqc3BNb2RlbCBkb2Vzbid0IHNlZW0gdXNlZD8KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBqc3BNb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNoTWFwIGVtYmVkZGVkTW9kZWxRdWVyaWVzID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBKU1BNb2RlbFF1ZXJ5SW1wbChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBVUklSZXNvbHZlciByZXNvbHZlcikgewotCQlzdXBlcihuZXcgU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlcihuZXcgSlNQTW9kZWxRdWVyeUNNUHJvdmlkZXIoKSkpOwotCQlqc3BNb2RlbCA9IG1vZGVsOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2RlbFF1ZXJ5I2dldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQpCi0JICovCi0JcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBzdXBlci5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlNb2RlbFF1ZXJ5IHF1ZXJ5ID0gZ2V0RW1iZWRkZWRNb2RlbFF1ZXJ5KGVsZW1lbnQpOwotCQkJaWYgKHF1ZXJ5ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBxdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogQHNlZSBNb2RlbFF1ZXJ5I2dldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KE5vZGUpCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoTm9kZSBub2RlKSB7Ci0JCUNNRG9jdW1lbnQgZG9jID0gc3VwZXIuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQobm9kZSk7Ci0JCWlmIChkb2MgPT0gbnVsbCkgewotCQkJTW9kZWxRdWVyeSBxdWVyeSA9IGdldEVtYmVkZGVkTW9kZWxRdWVyeShub2RlKTsKLQkJCWlmIChxdWVyeSAhPSBudWxsKSB7Ci0JCQkJZG9jID0gcXVlcnkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kZWxRdWVyeSNnZXRDTU5vZGUoTm9kZSkKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGdldENNTm9kZShOb2RlIG5vZGUpIHsKLQkJQ01Ob2RlIHJlc3VsdCA9IHN1cGVyLmdldENNTm9kZShub2RlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlNb2RlbFF1ZXJ5IHF1ZXJ5ID0gZ2V0RW1iZWRkZWRNb2RlbFF1ZXJ5KG5vZGUpOwotCQkJaWYgKHF1ZXJ5ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBxdWVyeS5nZXRDTU5vZGUobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVDb250ZW50KEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmNsdWRlT3B0aW9ucykgewotCQlNb2RlbFF1ZXJ5IGVtcSA9IGdldEVtYmVkZGVkTW9kZWxRdWVyeShlbGVtZW50KTsKLQkJaWYgKGVtcSAhPSBudWxsKQotCQkJcmV0dXJuIGVtcS5nZXRBdmFpbGFibGVDb250ZW50KGVsZW1lbnQsIGVkLCBpbmNsdWRlT3B0aW9ucyk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRBdmFpbGFibGVDb250ZW50KGVsZW1lbnQsIGVkLCBpbmNsdWRlT3B0aW9ucyk7Ci0JfQotCi0JLy8gSVNTVUU6IHNob3VsZG4ndCB0aGlzIGJlIHByaXZhdGU/Ci0JcHJvdGVjdGVkIE1vZGVsUXVlcnkgZ2V0RW1iZWRkZWRNb2RlbFF1ZXJ5KE5vZGUgbm9kZSkgewotCQlNb2RlbFF1ZXJ5IGVtYmVkZGVkTW9kZWxRdWVyeSA9IG51bGw7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7IAotCQkJTm9kZSBvd25lck5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCWlmIChvd25lck5vZGUgPT0gbnVsbCkgewotCQkJCS8vIHRoZW4gbXVzdCBiZSB0aGUgZG9jdW1lbnQgaXRzZWxmCi0JCQkJb3duZXJOb2RlID0gbm9kZTsgCi0JCQl9Ci0JCQlQYWdlRGlyZWN0aXZlQWRhcHRlciBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBvd25lck5vZGUpLmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKHBhZ2VEaXJlY3RpdmVBZGFwdGVyICE9IG51bGwpIHsKLQotCQkJCVN0cmluZyBlZmZlY3RpdmVDb250ZW50VHlwZSA9IG51bGw7Ci0JCQkJTW9kZWxRdWVyeSBwb3RlbnRpYWxNb2RlbFF1ZXJ5T2JqZWN0ID0gbnVsbDsKLQotCQkJCVN0cmluZyBmYW1pbHlJZCA9IHBhZ2VEaXJlY3RpdmVBZGFwdGVyLmdldEVtYmVkZGVkVHlwZSgpLmdldEZhbWlseUlkKCk7Ci0JCQkJaWYgKENvbnRlbnRUeXBlRmFtaWx5Rm9ySFRNTC5IVE1MX0ZBTUlMWS5lcXVhbHMoZmFtaWx5SWQpKSB7Ci0JCQkJCWVmZmVjdGl2ZUNvbnRlbnRUeXBlID0gInRleHQvaHRtbCI7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQllZmZlY3RpdmVDb250ZW50VHlwZSA9IHBhZ2VEaXJlY3RpdmVBZGFwdGVyLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJfQotCQkJCQotCQkJCXBvdGVudGlhbE1vZGVsUXVlcnlPYmplY3QgPSAoTW9kZWxRdWVyeSkgZW1iZWRkZWRNb2RlbFF1ZXJpZXMuZ2V0KGVmZmVjdGl2ZUNvbnRlbnRUeXBlKTsKLQkJCQkKLQkJCQlpZiAocG90ZW50aWFsTW9kZWxRdWVyeU9iamVjdCA9PSBudWxsKSB7Ci0JCQkJCU1vZGVsUXVlcnlBZGFwdGVyIGVtYmVkZGVkQWRhcHRlciA9IChNb2RlbFF1ZXJ5QWRhcHRlcikgcGFnZURpcmVjdGl2ZUFkYXB0ZXIuYWRhcHQoKElOb2RlTm90aWZpZXIpIG5vZGUsIE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJCQkJaWYgKGVtYmVkZGVkQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQkvLyB3ZSB3aWxsIGNhY2hlIG9uZSBtb2RlbCBxdWVyeSBwZXIgY29udGVudCB0eXBlCi0JCQkJCQllbWJlZGRlZE1vZGVsUXVlcnkgPSBlbWJlZGRlZEFkYXB0ZXIuZ2V0TW9kZWxRdWVyeSgpOwotCQkJCQkJZW1iZWRkZWRNb2RlbFF1ZXJpZXMucHV0KGVmZmVjdGl2ZUNvbnRlbnRUeXBlLCBlbWJlZGRlZE1vZGVsUXVlcnkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQllbWJlZGRlZE1vZGVsUXVlcnkgPSBwb3RlbnRpYWxNb2RlbFF1ZXJ5T2JqZWN0OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZW1iZWRkZWRNb2RlbFF1ZXJ5OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnkjZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihvcmcudzNjLmRvbS5BdHRyKQotCSAqLwotCXB1YmxpYyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oQXR0ciBhdHRyKSB7Ci0JCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gcmVzdWx0ID0gc3VwZXIuZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlNb2RlbFF1ZXJ5IHF1ZXJ5ID0gZ2V0RW1iZWRkZWRNb2RlbFF1ZXJ5KGF0dHIpOwotCQkJaWYgKHF1ZXJ5ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBxdWVyeS5nZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIE5PVCBBUEkgLS0gdGhpcyBpcyBwcm92aWRlZCwgYW5kIGlzIHB1YmxpYywgb25seSB0byBtYWtlIHNvbWUgSlVuaXQgdGVzdGluZyAKLQkgKiBtb3JlIHN0cmFpZ2h0Zm9yd2FyZC4gSXQgd2lsbCBiZSBjaGFuZ2VkIGluIGZ1dHVyZSwgYW5kIGZyb20gcmVsZWFzZSB0byByZWxlYXNlLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBNb2RlbFF1ZXJ5IGludGVybmFsVGVzdE9ubHlfZ2V0RW1iZWRkZWRNb2RlbFF1ZXJ5KE5vZGUgbm9kZSkgewotCQlyZXR1cm4gZ2V0RW1iZWRkZWRNb2RlbFF1ZXJ5KG5vZGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE0OTc3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbFN0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5LlhNTENhdGFsb2dJZFJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLQotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUCBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJTW9kZWxTdGF0ZUxpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBKU1BNb2RlbFF1ZXJ5QWRhcHRlckltcGwgbW9kZWxRdWVyeUFkYXB0ZXJJbXBsOwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkTW9kZWwgc3RhdGVOb3RpZmllciA9IG51bGw7Ci0KLQlwdWJsaWMgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySlNQKCkgewotCQl0aGlzKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcktleQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqIEBwYXJhbSByZWdpc3RlckFkYXB0ZXJzCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUChPYmplY3Qga2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoa2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gbmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUChnZXRBZGFwdGVyS2V5KCksIGlzU2hvdWxkUmVnaXN0ZXJBZGFwdGVyKCkpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUFkYXB0ZXIgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCWlmIChEZWJ1Zy5kaXNwbGF5SW5mbykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AuY3JlYXRlQWRhcHRlciIgKyB0YXJnZXQpOyAvLyROT04tTkxTLTEkCi0JCWlmIChtb2RlbFF1ZXJ5QWRhcHRlckltcGwgPT0gbnVsbCkgewotCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJSURPTU5vZGUgeG1sTm9kZSA9IChJRE9NTm9kZSkgdGFyZ2V0OwotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBzdGF0ZU5vdGlmaWVyID0geG1sTm9kZS5nZXRNb2RlbCgpOwotCQkJCWlmIChtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCXN0YXRlTm90aWZpZXIuYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQkJCX0KLQotCQkJCW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlVSSVJlc29sdmVyIHJlc29sdmVyID0gbW9kZWwuZ2V0UmVzb2x2ZXIoKTsKLQkJCQlpZiAoRGVidWcuZGlzcGxheUluZm8pCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLU1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUC4uLiBiYXNlTG9jYXRpb24gOiAiICsgcmVzb2x2ZXIuZ2V0RmlsZUJhc2VMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJLyoqCi0JCQkJICogWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIgY3VycmVudGx5IHJlcXVpcmVzIGEgZmlsZXN5c3RlbQotCQkJCSAqIGxvY2F0aW9uIHN0cmluZy4gQ3VzdG9tYXJpbHkgdGhpcyB3aWxsIGJlIHdoYXQgaXMgaW4gdGhlCi0JCQkJICogZGVwcmVjYXRlZCBTU0UgVVJJUmVzb2x2ZXIgYW5kIHJlcXVpcmVkIGJ5IHRoZSBDb21tb24gVVJJCi0JCQkJICogUmVzb2x2ZXIuCi0JCQkJICovCi0JCQkJVVJJUmVzb2x2ZXIgaWRSZXNvbHZlciA9IG51bGw7Ci0JCQkJaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLQkJCQkJaWRSZXNvbHZlciA9IG5ldyBYTUxDYXRhbG9nSWRSZXNvbHZlcihyZXNvbHZlci5nZXRGaWxlQmFzZUxvY2F0aW9uKCksIHJlc29sdmVyKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8qCi0JCQkJCSAqIDIwMzY0OSAtIHRoaXMgYmxvY2sgbWF5IGJlIG5lY2Vzc2FyeSBkdWUgdG8gb3JkZXJpbmcgb2YKLQkJCQkJICogc2V0dGluZyB0aGUgcmVzb2x2ZXIgaW50byB0aGUgbW9kZWwKLQkJCQkJICovCi0JCQkJCVN0cmluZyBiYXNlTG9jYXRpb24gPSBudWxsOwotCQkJCQlTdHJpbmcgbW9kZWxzQmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkJCWlmIChtb2RlbHNCYXNlTG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQkJRmlsZSBmaWxlID0gbmV3IFBhdGgobW9kZWxzQmFzZUxvY2F0aW9uKS50b0ZpbGUoKTsKLQkJCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJYmFzZUxvY2F0aW9uID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCUlQYXRoIGJhc2VQYXRoID0gbmV3IFBhdGgobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpOwotCQkJCQkJCUlSZXNvdXJjZSBkZXJpdmVkUmVzb3VyY2UgPSBudWxsOwotCQkJCQkJCWlmIChiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpCi0JCQkJCQkJCWRlcml2ZWRSZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShiYXNlUGF0aCk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlkZXJpdmVkUmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoYmFzZVBhdGguc2VnbWVudCgwKSk7Ci0JCQkJCQkJSVBhdGggZGVyaXZlZFBhdGggPSBkZXJpdmVkUmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCQlpZiAoZGVyaXZlZFBhdGggIT0gbnVsbCkgewotCQkJCQkJCQliYXNlTG9jYXRpb24gPSBkZXJpdmVkUGF0aC50b1N0cmluZygpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJVVJJIHVyaSA9IGRlcml2ZWRSZXNvdXJjZS5nZXRMb2NhdGlvblVSSSgpOwotCQkJCQkJCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQkJCQkJCWJhc2VMb2NhdGlvbiA9IHVyaS50b1N0cmluZygpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYoYmFzZUxvY2F0aW9uID09IG51bGwpIHsKLQkJCQkJCQliYXNlTG9jYXRpb24gPSBtb2RlbHNCYXNlTG9jYXRpb247Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWRSZXNvbHZlciA9IG5ldyBYTUxDYXRhbG9nSWRSZXNvbHZlcihiYXNlTG9jYXRpb24sIG51bGwpOwotCQkJCX0KLQotCQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IGNyZWF0ZU1vZGVsUXVlcnkobW9kZWwsIGlkUmVzb2x2ZXIpOwotCQkJCW1vZGVsUXVlcnkuc2V0RWRpdE1vZGUoTW9kZWxRdWVyeS5FRElUX01PREVfVU5DT05TVFJBSU5FRCk7Ci0JCQkJbW9kZWxRdWVyeUFkYXB0ZXJJbXBsID0gbmV3IEpTUE1vZGVsUXVlcnlBZGFwdGVySW1wbChuZXcgQ01Eb2N1bWVudENhY2hlKCksIG1vZGVsUXVlcnksIGlkUmVzb2x2ZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlckltcGw7Ci0JfQotCi0JTW9kZWxRdWVyeSBjcmVhdGVNb2RlbFF1ZXJ5KElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFVSSVJlc29sdmVyIHJlc29sdmVyKSB7Ci0JCXJldHVybiBuZXcgSlNQTW9kZWxRdWVyeUltcGwobW9kZWwsIHJlc29sdmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxBYm91dFRvQmVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsLAotCSAqICAgICAgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNEaXJ0eSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VEZWxldGVkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwsCi0JICogICAgICBJU3RydWN0dXJlZE1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCS8vIGlmIG9sZE1vZGVsICE9IG5ld01vZGVsLCBiYWQgdGhpbmdzIG1pZ2h0IGhhcHBlbiB3aXRoIHRoZSBhZGFwdGVyCi0JCXN0YXRlTm90aWZpZXIucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQlzdGF0ZU5vdGlmaWVyID0gbmV3TW9kZWw7Ci0JCXVwZGF0ZVJlc29sdmVyKHN0YXRlTm90aWZpZXIpOwotCQlzdGF0ZU5vdGlmaWVyLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQkJaWYgKHN0YXRlTm90aWZpZXIgIT0gbnVsbCkgewotCQkJc3RhdGVOb3RpZmllci5yZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJc3RhdGVOb3RpZmllciA9IG51bGw7Ci0JCWlmIChtb2RlbFF1ZXJ5QWRhcHRlckltcGwgIT0gbnVsbCkgewotCQkJbW9kZWxRdWVyeUFkYXB0ZXJJbXBsLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVJlc29sdmVyKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQlJRmlsZSBiYXNlRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSkpOwotCQlpZiAoYmFzZUZpbGUgIT0gbnVsbCkgewotCQkJaWYgKGJhc2VGaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJCWJhc2VMb2NhdGlvbiA9IGJhc2VGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWlmIChiYXNlTG9jYXRpb24gPT0gbnVsbCAmJiBiYXNlRmlsZS5nZXRMb2NhdGlvblVSSSgpICE9IG51bGwpIHsKLQkJCQliYXNlTG9jYXRpb24gPSBiYXNlRmlsZS5nZXRMb2NhdGlvblVSSSgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlpZiAoYmFzZUxvY2F0aW9uID09IG51bGwpIHsKLQkJCQliYXNlTG9jYXRpb24gPSBiYXNlRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQliYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJfQotCQltb2RlbFF1ZXJ5QWRhcHRlckltcGwuc2V0SWRSZXNvbHZlcihuZXcgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoYmFzZUxvY2F0aW9uLCBtb2RlbC5nZXRSZXNvbHZlcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGVsUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQl1cGRhdGVSZXNvbHZlcihzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yVGFnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0M2M4ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5Nb2RlbFF1ZXJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLlNpbXBsZUFzc29jaWF0aW9uUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JUYWcgZXh0ZW5kcyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AgewotCi0JcHVibGljIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclRhZygpIHsKLQl9Ci0KLQlwdWJsaWMgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yVGFnKE9iamVjdCBrZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihrZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yVGFnKGdldEFkYXB0ZXJLZXkoKSwgaXNTaG91bGRSZWdpc3RlckFkYXB0ZXIoKSk7Ci0JfQotCi0JTW9kZWxRdWVyeSBjcmVhdGVNb2RlbFF1ZXJ5KElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFVSSVJlc29sdmVyIHJlc29sdmVyKSB7Ci0JCXJldHVybiBuZXcgTW9kZWxRdWVyeUltcGwobmV3IFNpbXBsZUFzc29jaWF0aW9uUHJvdmlkZXIobmV3IFRhZ01vZGVsUXVlcnlDTVByb3ZpZGVyKCkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvVGFnTW9kZWxRdWVyeUNNUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9UYWdNb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDExNDY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9UYWdNb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUNNUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQ01Eb2N1bWVudCBwcm92aWRlciBmb3IgSFRNTCBhbmQgSlNQIGRvY3VtZW50cy4KLSAqLwotcHVibGljIGNsYXNzIFRhZ01vZGVsUXVlcnlDTVByb3ZpZGVyIGltcGxlbWVudHMgTW9kZWxRdWVyeUNNUHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIFRhZ01vZGVsUXVlcnlDTVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIENNRG9jdW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgRE9NIE5vZGUuIG9yIG51bGwgaWYgbm8KLQkgKiBDTURvY3VtZW50IGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgRE9NIE5vZGUuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoTm9kZSBub2RlKSB7Ci0JCUNNRG9jdW1lbnQgdGFnZG9jID0gSFRNTENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoQ01Eb2NUeXBlLlRBRzIwX0RPQ19UWVBFKTsKLQotCQlDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJU3RyaW5nIGVsZW1lbnROYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCi0JCQkJLy8gdGVzdCB0byBzZWUgaWYgdGhpcyBub2RlIGJlbG9uZ3MgdG8gSlNQJ3MgQ01Eb2N1bWVudCAoY2FzZQotCQkJCS8vIHNlbnNpdGl2ZSkKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWMgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIHRhZ2RvYy5nZXRFbGVtZW50cygpLmdldE5hbWVkSXRlbShlbGVtZW50TmFtZSk7Ci0JCQkJaWYgKGRlYyAhPSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IHRhZ2RvYzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCVN0cmluZyBwcmVmaXggPSBub2RlLmdldFByZWZpeCgpOwotCi0JCQlpZiAocmVzdWx0ID09IG51bGwgJiYgcHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCAmJiBub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQkvLyBjaGVjayBwb3NpdGlvbiBkZXBlbmRlbnQKLQkJCQlJRE9NTm9kZSB4bWxOb2RlID0gKElET01Ob2RlKSBub2RlOwotCQkJCVRMRENNRG9jdW1lbnRNYW5hZ2VyIHRsZG1nciA9IFRhZ2xpYkNvbnRyb2xsZXIuZ2V0VExEQ01Eb2N1bWVudE1hbmFnZXIoeG1sTm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQkJaWYgKHRsZG1nciAhPSBudWxsKSB7Ci0JCQkJCUxpc3QgZG9jdW1lbnRzID0gdGxkbWdyLmdldENNRG9jdW1lbnRUcmFja2Vycyhub2RlLmdldFByZWZpeCgpLCB4bWxOb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQkvLyB0aGVyZSBzaG91bGRuJ3QgYmUgbW9yZSB0aGFuIG9uZSBjbWRvY3VtZW50IHJldHVybmVkCi0JCQkJCWlmIChkb2N1bWVudHMgIT0gbnVsbCAmJiBkb2N1bWVudHMuc2l6ZSgpID4gMCkKLQkJCQkJCXJlc3VsdCA9IChDTURvY3VtZW50KSBkb2N1bWVudHMuZ2V0KDApOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSB0YWdkb2M7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9KU1BEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjNhNzBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQuWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi1wdWJsaWMgY2xhc3MgSlNQRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGV4dGVuZHMgWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHsKLQkvKioKLQkgKiBKU1BEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSlNQRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBhcnNlKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIFRoaXMgaXMgYSBsYW5ndWFnZSBzcGVjaWZpYyBtZXRob2QgKGUuZy4gSFRNTCwgSmF2YSwgUHJvbG9nLCBldGMuKSBzbwotCS8vIGNvdWxkL3Nob3VsZCBiZSBtYWRlIGNvbmZpZ3VyYWJsZS4KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlTW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdG5vZGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQUmVQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUFJlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYjA2NDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQUmVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTFUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTJOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkNvcmVOb2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBKU1BSZVBhcnNlciBleHRlbmRzIFhNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIHsKLQotCS8qKgotCSAqIEFsbG93IGEgcmVwYXJzZXIgdG8gY2hlY2sgZm9yIGV4dHJhIHN5bnRhY3RpYyBjYXNlcyB0aGF0IHJlcXVpcmUKLQkgKiBwYXJzaW5nIGJleW9uZCB0aGUgZmxhdE5vZGUgYm91bmRhcnkuCi0JICogCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhZGRzIEpTUCBsYW5ndWFnZSBtYXJrZXJzIChjb21tZW50cyBhcmUgaGFuZGxlZAotCSAqIGVsc2V3aGVyZSkuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yQ3Jvc3NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25TeW50YXgoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IHN1cGVyLmNoZWNrRm9yQ3Jvc3NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25TeW50YXgoKTsKLQkJLy8gTm9uZSBvZiB0aGUgc3VwZXJjbGFzcycgY2FzZXMgd2VyZSB2YWxpZCwgc28gY2hlY2sgZm9yIEpTUCBjYXNlcwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNoZWNrRm9ySlNQKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBBIGNoYW5nZSB0byBhIEpTUCB0YWcgY2FuIHJlc3VsdCBpbiBhbGwgYmVpbmcgcmVwYXJzZWQuCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckpTUCgpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJcmVzdWx0ID0gY2hlY2tGb3JDcml0aWNhbEtleSgiPCUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8JT0iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8JSEiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCIlPiIpOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBJZiBhIGNvbW1lbnQgc3RhcnQgb3IgZW5kIHRhZyBpcyBiZWluZyBhZGRlZCBvciBkZWxldGVkLCB3ZSdsbCByZXNjYW4KLQkgKiB0aGUgd2hvbGUgZG9jdW1lbnQuIFRoZSByZWFzb24gaXMgdGhhdCBjb250ZW50IHRoYXQgaXMgcmV2ZWFsZWQgb3IKLQkgKiBjb21tZW50ZWQgb3V0IGNhbiBlZmZlY3QgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSByZXN0IG9mIHRoZQotCSAqIGRvY3VtZW50LiBOb3RlOiBmb3Igbm93IHRoaXMgaXMgdmVyeSBYTUwvSlNQIHNwZWNpZmljLCBjYW4KLQkgKiByZWZhY3Rvci9pbXByb3ZlIGxhdGVyLgotCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNvbW1lbnRzKCkgewotCi0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IHN1cGVyLmNoZWNrRm9yQ29tbWVudHMoKTsKLQotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8JS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmVzdWx0ID0gY2hlY2tGb3JDcml0aWNhbEtleSgiLS0lPiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIHdlJ2xsIGFsc28gY2hlY2sgZm9yIHRoZXNlIGRlZ2VuZXJhdGUgY2FzZXMKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmVzdWx0ID0gY2hlY2tGb3JDcml0aWNhbEtleSgiPCUtLS0lPiIpOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29yZSByZXBhcnNpbmcgbWV0aG9kIC4uLiBhZnRlciB0aGUgZGlydHkgc3RhcnQgYW5kIGRpcnR5IGVuZCBoYXZlCi0JICogYmVlbiBjYWxjdWxhdGVkIGVsc2V3aGVyZS4gLSB0aGlzIG1ldGhvZCBvdmVycmlkZXMsIGRvZXMgbm90IGV4dGVuZAotCSAqIHN1cGVyJ3MgbWV0aG9kLiBjaGFuZ2VzL2ZpeGVzIHRvIHN1cGVyIG1heSBoYXZlIHRvIGJlIG1hZGUgaGVyZSBhcwotCSAqIHdlbGwuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGFyc2UoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkaXJ0eVN0YXJ0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5RW5kKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCWludCByZXNjYW5TdGFydCA9IC0xOwotCQlpbnQgcmVzY2FuRW5kID0gLTE7Ci0JCWJvb2xlYW4gZmlyc3RUaW1lID0gZmFsc2U7Ci0JCWJvb2xlYW4gZGV0ZWN0ZWRCcmVha2luZ0NoYW5nZSA9IGZhbHNlOwotCi0JCS8vCi0JCS8vICJzYXZlIiB0aGUgb2xkTm9kZXMgKHRoYXQgbWF5IGJlIHJlcGxhY2VkKSBpbiBhIGxpc3QKLQkJQ29yZU5vZGVMaXN0IG9sZE5vZGVzID0gZm9ybU9sZE5vZGVzKGRpcnR5U3RhcnQsIGRpcnR5RW5kKTsKLQotCQlpZiAoY29udGFpbnNCcmVha2luZ0NoYW5nZShvbGROb2RlcykgfHwgaXNCcmVha2luZ1dpdGhOZXN0ZWRUYWcoZGlydHlTdGFydCwgZGlydHlFbmQpKSB7Ci0JCQlpZiAoRGVidWcuZGVidWdUYWdsaWJzKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVwYXJzZTogaXMgdGFnbGliIG9yIGluY2x1ZGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJZGV0ZWN0ZWRCcmVha2luZ0NoYW5nZSA9IHRydWU7Ci0JCQlyZXNjYW5TdGFydCA9IDA7Ci0JCQlyZXNjYW5FbmQgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpICsgZkxlbmd0aERpZmZlcmVuY2U7Ci0JCQlvbGROb2RlcyA9IGZvcm1PbGROb2RlcyhmU3RydWN0dXJlZERvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCksIGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJCWNsZWFyVGFnbGliSW5mbygpOwotCQl9Ci0JCWVsc2UgaWYgKGRpcnR5U3RhcnQgPT0gbnVsbCB8fCBkaXJ0eUVuZCA9PSBudWxsKSB7Ci0JCQkvLyBkaXJ0eVN0YXJ0IG9yIGRpcnR5IGVuZCBhcmUgbnVsbCwgdGhlbiB0aGF0IG1lYW5zIHdlIGRpZG4ndAotCQkJLy8gaGF2ZSBhCi0JCQkvLyBjYWNoZWQgbm9kZSwgd2hpY2ggbWVhbnMgd2UgaGF2ZSBhbiBlbXB0eSBkb2N1bWVudCwgc28gd2UKLQkJCS8vIGp1c3QgbmVlZCB0byByZXNjYW4gdGhlIGNoYW5nZXMKLQkJCXJlc2NhblN0YXJ0ID0gMDsKLQkJCXJlc2NhbkVuZCA9IGZDaGFuZ2VzLmxlbmd0aCgpOwotCQkJZmlyc3RUaW1lID0gdHJ1ZTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHNldCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgdG8gcmVzY2FuCi0JCQlyZXNjYW5TdGFydCA9IGRpcnR5U3RhcnQuZ2V0U3RhcnQoKTsKLQkJCS8vCi0JCQkvLyBzZXQgdGhlIGVuZCBvZiB0aGUgdGV4dCB0byByZXNjYW4KLQkJCS8vIG5vdGljZSB3ZSB1c2UgdGhlIHNhbWUgcmF0aW9uYWxlIGFzIGZvciB0aGUgcmVzY2FuU3RhcnQsCi0JCQkvLyB3aXRoIHRoZSBhZGRlZCBjYXZlYXQgdGhhdCBsZW5ndGggaGFzIHRvIGJlIGFkZGVkIHRvIGl0LAotCQkJLy8gdG8gY29tcGVuc2F0ZSBmb3IgdGhlIG5ldyB0ZXh0IHdoaWNoIGhhcyBiZWVuIGFkZGVkIG9yIGRlbGV0ZWQuCi0JCQkvLyBJZiBjaGFuZ2VzIGhhcyB6ZXJvIGxlbmd0aCwgdGhlbiAibGVuZ3RoIiB3aWxsIGJlIG5lZ2F0aXZlLAotCQkJLy8gc2luY2UKLQkJCS8vIHdlIGFyZSBkZWxldGluZyB0ZXh0LiBPdGhlcndpc2UsIHVzZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi0JCQkvLyB3aGF0J3Mgc2VsZWN0ZWQgdG8gYmUgcmVwbGFjZWQgYW5kIHRoZSBsZW5ndGggb2YgdGhlIG5ldyB0ZXh0LgotCQkJcmVzY2FuRW5kID0gZGlydHlFbmQuZ2V0RW5kKCkgKyBmTGVuZ3RoRGlmZmVyZW5jZTsKLQkJfQotCi0JCS8vIG5vdyB0aGF0IHdlIGhhdmUgdGhlIG9sZCBzdHVmZiAic2F2ZWQiIGF3YXksIHVwZGF0ZSB0aGUgZG9jdW1lbnQKLQkJLy8gd2l0aCB0aGUgY2hhbmdlcy4KLQkJZlN0cnVjdHVyZWREb2N1bWVudC51cGRhdGVEb2N1bWVudERhdGEoZlN0YXJ0LCBmTGVuZ3RoVG9SZXBsYWNlLCBmQ2hhbmdlcyk7Ci0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLSBub3cgdGhlIHJlYWwgd29yawotCQlyZXN1bHQgPSBjb3JlX3JlcGFyc2UocmVzY2FuU3RhcnQsIHJlc2NhbkVuZCwgb2xkTm9kZXMsIGZpcnN0VGltZSk7Ci0JCS8vCi0KLQkJLy8gaWYgd2UgZGlkIG5vdCBkZXRlY3QgYSBicmVha2luZyB0eXBlIG9mIGNoYW5nZSBhdCB0aGUgYmVnaW5uaW5nLAotCQkvLyBidXQKLQkJLy8gZG8gbm93LCB0aGVuIHJlcGFyc2UgYWxsISBJZiB3ZSBkaWQgZGV0ZWN0IHRoZW0sIHRoZW4gd2UgbWF5IG9yIG1heQotCQkvLyBub3QgZGV0ZWN0IGFnYWluLCBidXQgcHJlc3VtYWJseSB3ZSd2ZSBhbHJlYWR5IHNldCB1cCB0byByZS1wYXJzZWQKLQkJLy8gZXZlcnRoaW5nLCBzbyBubyBuZWVkIHRvIGRvIGFnYWluLgotCQlpZiAoKCFkZXRlY3RlZEJyZWFraW5nQ2hhbmdlKSAmJiAoY29udGFpbnNCcmVha2luZ0NoYW5nZShvbGROb2RlcykpKSB7Ci0JCQljbGVhclRhZ2xpYkluZm8oKTsKLQkJCS8vIHJlcGFyc2UgYWxsCi0JCQlvbGROb2RlcyA9IGZvcm1PbGROb2RlcyhmU3RydWN0dXJlZERvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCksIGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJCXJlc3VsdCA9IGNvcmVfcmVwYXJzZSgwLCBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpLCBvbGROb2RlcywgZmlyc3RUaW1lKTsKLQkJfQotCi0JCS8vIGV2ZW50IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIsIGluY2FzZSB0aGVyZSBpcwotCQkvLyBzb21lIG9wdGltaXphdGlvbiB0aGV5IGNhbiBkbwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgdGhlIHJlZ2lvbnMgZ2l2ZW4sIHJlcHJlc2VudGluZyB0aGUgY29udGVudHMgb2YgYQotCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGNvbnRhaW4gcmVnaW9ucyB0aGF0IGNvdWxkIGFsdGVyIHRoZQotCSAqIGJlaGF2aW9yIG9mIHRoZSBwYXJzZXIgb3IgdGhlIHBhcnNpbmcgb2YgYXJlYXMgb3V0c2lkZSBvZiB0aGUgcmVnaW9ucwotCSAqIGdpdmVuLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0JyZWFraW5nQ2hhbmdlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSwgSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJcmV0dXJuIGlzVGFnbGliT3JJbmNsdWRlKG5vZGUsIHJlZ2lvbnMpIHx8IGlzSnNwUm9vdChyZWdpb25zKTsKLQl9Ci0KLQkvKioKLQkgKiBWZXJpZmllcyB0aGF0IHRoZSByZWdpb25zIGdpdmVuLCByZXByZXNlbnRpbmcgdGhlIHJlZ2lvbnMgdG91Y2hlZCBieSBhCi0JICogdGV4dCBjaGFuZ2UgaGF2ZTogMSkgLi4uYW4gaW5zZXJ0aW9uIGF0IHRoZSB0ZXh0RW5kT2Zmc2V0IG9mIGFuCi0JICogWE1MX1RBR19PUEVOIHRoYXQncyBpbiBpdCdzIG93biBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuZCBwcmVjZWRlZAotCSAqIGJ5IGFuIHVuZW5kZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAyKSAuLi5hIGRlbGV0aW9uIGhhcHBlbmluZyBpbgotCSAqIGFuIFhNTF9FTVBUWV9UQUdfQ0xPU0UgdGhhdCBlbmRzIGEgSVRleHRSZWdpb25Db250YWluZXIgMykgLi4uYW4KLQkgKiBpbnNlcnRpb24gaGFwcGVuaW5nIHdpdGggYSAnIDwnIGNoYXJhY3RlciBzb21ld2hlcmUgaW4gYW4gWE1MIGF0dHJpYnV0ZQotCSAqIG5hbWUgb3IgdmFsdWUgNCkgLi4uYSBkZWxldGlvbiBvZiBhIG5vcm1hbCBYTUxfVEFHX0NMT1NFIHNpbmNlCi0JICogc3Vic2VxdWVudCB0YWdzIGJlY29tZSBhdHRyaWJ1dGUgdmFsdWVzCi0JICovCi0KLQlwcml2YXRlIGJvb2xlYW4gaXNCcmVha2luZ1dpdGhOZXN0ZWRUYWcoYm9vbGVhbiBjaGFuZ2VzSW5jbHVkZUFfbHQsIGJvb2xlYW4gZGVsc0luY2x1ZGVBX2d0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91cyA9IHBhcmVudC5nZXRQcmV2aW91cygpOwotCQkvLyBjYXNlIDEgdGVzdAotCQlpZiAocGFyZW50LmdldFJlZ2lvbnMoKS5zaXplKCkgPT0gMSAmJiByZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOICYmIChwcmV2aW91cyA9PSBudWxsIHx8ICghcHJldmlvdXMuaXNFbmRlZCgpIHx8IHByZXZpb3VzLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSkpIHsKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQkJLy8gY2FzZSAyIHRlc3QKLQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlJVGV4dFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoSVRleHRSZWdpb25Db250YWluZXIpIHJlZ2lvbjsKLQkJCUlUZXh0UmVnaW9uIGludGVybmFsID0gY29udGFpbmVyLmdldFJlZ2lvbnMoKS5nZXQoY29udGFpbmVyLmdldFJlZ2lvbnMoKS5zaXplKCkgLSAxKTsKLQkJCWlmIChpbnRlcm5hbC5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRSAmJiBjb250YWluZXIuZ2V0UmVnaW9ucygpLnNpemUoKSA+PSAyKQotCQkJCWludGVybmFsID0gY29udGFpbmVyLmdldFJlZ2lvbnMoKS5nZXQoY29udGFpbmVyLmdldFJlZ2lvbnMoKS5zaXplKCkgLSAyKTsKLQkJCWlmIChpbnRlcm5hbC5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkvLyBjYXNlIDMgdGVzdAotCQlpZiAoY2hhbmdlc0luY2x1ZGVBX2x0ICYmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSB8fCByZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpKSB7Ci0JCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0JCS8vIGNhc2UgNCB0ZXN0Ci0JCWlmIChkZWxzSW5jbHVkZUFfZ3QgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWZXJpZmllcyB0aGF0IHRoZSByZWdpb25zIGdpdmVuLCByZXByZXNlbnRpbmcgdGhlIGNvbnRlbnRzIG9mIGEKLQkgKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpbmNsdWRlcyBhIGpzcDpyb290IHRhZwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0pzcFJvb3QoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJcmV0dXJuIHJlZ2lvbnMuc2l6ZSgpID4gMSAmJiByZWdpb25zLmdldCgwKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gJiYgcmVnaW9ucy5nZXQoMSkuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FOwotCX0KLQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgdGhlIHJlZ2lvbnMgZ2l2ZW4sIHJlcHJlc2VudGluZyB0aGUgY29udGVudHMgb2YgYQotCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGluY2x1ZGVzIGEgdmFsaWQgdGFnbGliIGRpcmVjdGl2ZSBvciBpbmNsdWRlCi0JICogZGlyZWN0aXZlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVGFnbGliT3JJbmNsdWRlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSwgSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJYm9vbGVhbiBzaXplQW5kVHlwZXNNYXRjaCA9IChyZWdpb25zLnNpemUoKSA+IDEpICYmIChyZWdpb25zLmdldCgxKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSAmJiAocmVnaW9ucy5nZXQoMCkuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiB8fCByZWdpb25zLmdldCgwKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pOwotCQlpZiAoIXNpemVBbmRUeXBlc01hdGNoKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldCgxKTsKLQkJU3RyaW5nIGRpcmVjdGl2ZU5hbWUgPSBub2RlLmdldFRleHQocmVnaW9uKTsKLQkJcmV0dXJuIHNpemVBbmRUeXBlc01hdGNoICYmIChkaXJlY3RpdmVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLlRBR0xJQikgfHwgZGlyZWN0aXZlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5JTkNMVURFKSB8fCBkaXJlY3RpdmVOYW1lLmVxdWFscyhKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVEFHTElCKSB8fCBkaXJlY3RpdmVOYW1lLmVxdWFscyhKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfSU5DTFVERSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhclRhZ2xpYkluZm8oKSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1RhZ2xpYnMpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImNsZWFyaW5nIHRhZ2xpYiBpbmZvIik7IC8vJE5PTi1OTFMtMSQKLQkJUmVnaW9uUGFyc2VyIHBhcnNlciA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCk7Ci0JCWlmIChwYXJzZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIpCi0JCQkoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcikgcGFyc2VyKS5yZXNldEhhbmRsZXJzKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zQnJlYWtpbmdDaGFuZ2UoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbGlzdCkgewotCQlib29sZWFuIGNvbnRhaW5zID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBsaXN0Lml0ZW0oaSk7Ci0JCQlpZiAoaXNCcmVha2luZ0NoYW5nZShub2RlLCBub2RlLmdldFJlZ2lvbnMoKSkpIHsKLQkJCQljb250YWlucyA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5zOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpbmREaXJ0eUVuZChpbnQgZW5kKSB7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXN1bHQgPSBzdXBlci5maW5kRGlydHlFbmQoZW5kKTsKLQotCQkvLyBpZiBub3Qgd2VsbCBmb3JtZWQsIGdldCBvbmUgcGFzdCwgaWYgaXRzIG5vdCBudWxsCi0KLQkJLy8gbm93LCBpZiBhbnkgb2YgdG8tYmUtc2Nhbm5lZCBmbGF0bm9kZXMgYXJlIHRoZSBzdGFydCBvZiBhIGpzcAotCQkvLyByZWdpb24sIHdlJ2xsCi0JCS8vIHJlcGFyc2UgYWxsIHRoZSB3YXkgdG8gdGhlIGVuZCwgdG8gYmUgc3VyZSB3ZSBkZXRlY3QgZW1iZWRkZWQKLQkJLy8gcmVnaW9ucyAob3Igbm90LWVtYmVkZGVkIHJlZ2lvbnMpIGNvcnJlY3RseS4KLQkJLy8gbm90aWNlIHdlIGRvbid0IG5lZWQgdG8gZG8gaWYgd2UncmUgb25seSBwcm9jZXNzaW5nIG9uZSBub2RlLgotCQkvLyBub3RpY2UgdG9vIHdlIGhhdmUgYSBzdHJvbmcgYXNzdW1wdGlvbiBoZXJlIHRoYXQgZGlydHlTdGFydCBoYXMKLQkJLy8gYWxyZWFkeSBiZWVuIGZvdW5kIQotCQkvLwotCQkvLyBub3RlIHRoYXQgZGlydHlFbmQgaXMgbm90IGNoZWNrZWQgaW4gdGhlIGRvLWJsb2NrIGJlbG93LCBzbyB3ZSdsbAotCQkvLyBjaGVjayBpdCBmaXJzdC4KLQkJaWYgKGlzSlNQRW1iZWRkZWRTdGFydE9yRW5kKHJlc3VsdCkpIHsKLQkJCXJlc3VsdCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gd2hlbiBlbmQgbm9kZSBhbmQgc3RhcnQgbm9kZSBhcmUgdGhlIHNhbWUsIHdlIG9ubHkgbmVlZCB0aGUKLQkJCS8vIGFib3ZlCi0JCQkvLyBjaGVjaywgb3RoZXJ3aXNlLCB0aGVyZSdzIGEgZmV3IGNhc2VzIHRoYXQgd2UnbGwgc2VhcmNoIHRoZQotCQkJLy8gcmVzdCBvZiB0aGUKLQkJCS8vIGZsYXRub2RlcyBuZWVkbGVzc2x5LgotCQkJaWYgKHJlc3VsdCAhPSBkaXJ0eVN0YXJ0KSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZWFyY2hOb2RlID0gZGlydHlTdGFydDsKLQkJCQlkbyB7Ci0JCQkJCWlmIChpc0pTUEVtYmVkZGVkU3RhcnRPckVuZChzZWFyY2hOb2RlKSkgewotCQkJCQkJcmVzdWx0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXNlYXJjaE5vZGUgPSBzZWFyY2hOb2RlLmdldE5leHQoKTsKLQkJCQkJfQotCQkJCQkvLyBpZiB3ZSBnZXQgdG8gdGhlIGN1cnJlbnQgZGlydHkgZW5kLCBvciBlbmQgb2YKLQkJCQkJLy8gZmxhdG5vZGVzLCB3aXRob3V0IGZpbmRpbmcgSlNQIHJlZ2lvbiB0aGVuIHdlCi0JCQkJCS8vIGRvbid0IG5lZWQgdG8gY2hlY2sgZnVydGhlcgotCQkJCX0KLQkJCQl3aGlsZSAoKHNlYXJjaE5vZGUgIT0gcmVzdWx0KSAmJiAoc2VhcmNoTm9kZSAhPSBudWxsKSk7Ci0JCQl9Ci0JCX0KLQkJLy8gcmVzdWx0IHNob3VsZCBuZXZlciBiZSBudWxsLCBidXQgY2FjaGVkTm9kZSBuZWVkcyB0byBiZSBwcm90ZWN0ZWQKLQkJLy8gZnJvbSBiZWluZyBjaGFuZ2VkIHRvIG51bGwKLQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRDYWNoZWREb2N1bWVudFJlZ2lvbihyZXN1bHQpOwotCQlkaXJ0eUVuZCA9IHJlc3VsdDsKLQkJcmV0dXJuIGRpcnR5RW5kOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0JyZWFraW5nV2l0aE5lc3RlZFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlib29sZWFuIGNoYW5nZXNJbmNsdWRlQV9sdCA9IGZDaGFuZ2VzICE9IG51bGwgJiYgZkNoYW5nZXMuaW5kZXhPZignPCcpID49IDA7Ci0JCWJvb2xlYW4gZGVsc0luY2x1ZGVBX2d0ID0gZkRlbGV0ZWRUZXh0ICE9IG51bGwgJiYgZkRlbGV0ZWRUZXh0LmluZGV4T2YoJz4nKSA+PSAwOwotCi0JCS8vIExpc3QgcmVnaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gc3RhcnQ7Ci0JCWludCBlbmRSZXBsYWNlID0gZlN0YXJ0ICsgZkxlbmd0aFRvUmVwbGFjZTsKLQkJd2hpbGUgKGVuZCAhPSBudWxsICYmIG5vZGUgIT0gZW5kLmdldE5leHQoKSkgewotCQkJSXRlcmF0b3IgaSA9IG5vZGUuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGkubmV4dCgpOwotCQkJCWlmIChpbnRlcnNlY3RzKG5vZGUsIHJlZ2lvbiwgZlN0YXJ0LCBlbmRSZXBsYWNlKSkgewotCi0JCQkJCXJlc3VsdCA9IGlzQnJlYWtpbmdXaXRoTmVzdGVkVGFnKGNoYW5nZXNJbmNsdWRlQV9sdCwgZGVsc0luY2x1ZGVBX2d0LCBub2RlLCByZWdpb24pOwotCi0JCQkJCWlmIChyZXN1bHQpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlub2RlID0gbm9kZS5nZXROZXh0KCk7Ci0JCQlpZiAocmVzdWx0KQotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGludGVyc2VjdHMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlLCBJVGV4dFJlZ2lvbiByZWdpb24sIGludCBsb3csIGludCBoaWdoKSB7Ci0JCWludCBzdGFydCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJaW50IGVuZCA9IG5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCXJldHVybiAoZW5kID49IGxvdyAmJiBzdGFydCA8PSBoaWdoKSB8fCAoc3RhcnQgPD0gbG93ICYmIGVuZCA+PSBsb3cpIHx8IChzdGFydCA8PSBoaWdoICYmIGVuZCA+PSBoaWdoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgcG90ZW50aWFsbHkgY291bGQgYmUgYSBqc3AgZW1iZWRkZWQgcmVnaW9uLiBUaGluZ3MgbGlrZQotCSAqIEpTUCBEZWNsYXJhdGlvbiBjYW4ndCBiZSBlbWJlZGRlZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNKU1BFbWJlZGRlZFN0YXJ0T3JFbmQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlTdHJpbmcgdHlwZSA9IGZsYXROb2RlLmdldFR5cGUoKTsKLQkJcmVzdWx0ID0gKCh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4pKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBleHRlbmRzIHN1cGVyIGNsYXNzIGJlaGF2aW9yCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJ0T2ZCbG9ja1JlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCVN0cmluZyB0eXBlID0gZmxhdE5vZGUuZ2V0VHlwZSgpOwotCQlyZXN1bHQgPSAoKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCkgfHwgc3VwZXIuaXNQYXJ0T2ZCbG9ja1JlZ2lvbihmbGF0Tm9kZSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBKU1BSZVBhcnNlcigpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBxdWlja0NoZWNrKCkgewotCQlpZiAoY29udGFpbnNCcmVha2luZ0NoYW5nZShuZXcgQ29yZU5vZGVMaXN0KGRpcnR5U3RhcnQsIGRpcnR5RW5kKSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHN1cGVyLnF1aWNrQ2hlY2soKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUFNvdXJjZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQU291cmNlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MGUzZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQU291cmNlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMlRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuaW50ZXJuYWwuSlNQVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5KU1BDYXBhYmxlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlRhZ01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LklSZWdpb25Db21wYXJpYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0vKioKLSAqIFRha2VzIGlucHV0IGZyb20gdGhlIEpTUFRva2VuaXplciBhbmQgY3JlYXRlcyBhIHRhZyBsaXN0Ci0gKi8KLQotcHVibGljIGNsYXNzIEpTUFNvdXJjZVBhcnNlciBleHRlbmRzIFhNTFNvdXJjZVBhcnNlciBpbXBsZW1lbnRzIEpTUENhcGFibGVQYXJzZXIgewotCXByb3RlY3RlZCBjbGFzcyBOZXN0YWJsZVByZWZpeEhhbmRsZXIgaW1wbGVtZW50cyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyLCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uIHsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlMgPSAieG1sbnM6IjsgLy8kTk9OLU5MUy0xJAotCi0JCS8qKgotCQkgKiBFbmFibGVzIGEgVExEIG93bmluZyB0aGUgZ2l2ZW4gcHJlZml4IGxvYWRlZCBmcm9tIHRoZSBnaXZlbiBVUkkgYXQKLQkJICogdGhlIGFuY2hvckZsYXROb2RlLiBUaGUgbGlzdCBvZiBhZGRpdGlvbmFsQ01Eb2N1bWVudHMgd2lsbCBjbGFpbSB0bwotCQkgKiBub3Qga25vdyBhbnkgb2YgaXRzIHRhZ3MgYXQgcG9zaXRpb25zIGVhcmxpZXIgdGhhbiB0aGF0Ci0JCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ncyBwb3NpdGlvbi4KLQkJICogCi0JCSAqIEZvciB0YWdsaWIgZGlyZWN0aXZlcywgdGhlIHRhZ2xpYiBpcyB0aGUgYW5jaG9yIHdoaWxlIHRhZ2xpYnMKLQkJICogcmVnaXN0ZXJlZCB0aHJvdWdoIGluY2x1ZGUgZGlyZWN0aXZlcyB1c2UgdGhlIHByaW1hcnkgaW5jbHVkZQotCQkgKiBkaXJlY3RpdmUgYXMgdGhlaXIgYW5jaG9yLgotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgZW5hYmxlRm9yVGFnbGliKFN0cmluZyBwcmVmaXgsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yRmxhdE5vZGUpIHsKLQkJCWlmIChwcmVmaXggPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlMaXN0IHRhZ21hcmtlcnMgPSAoKEpTUFRva2VuaXplcikgZ2V0VG9rZW5pemVyKCkpLmdldE5lc3RhYmxlUHJlZml4ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFnbWFya2Vycy5zaXplKCk7IGkrKykgewotCQkJCWlmICgoKFRhZ01hcmtlcikgdGFnbWFya2Vycy5nZXQoaSkpLmdldFRhZ05hbWUoKS5lcXVhbHMocHJlZml4KSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJKChKU1BUb2tlbml6ZXIpIGdldFRva2VuaXplcigpKS5nZXROZXN0YWJsZVByZWZpeGVzKCkuYWRkKG5ldyBUYWdNYXJrZXIocHJlZml4LCBhbmNob3JGbGF0Tm9kZSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm9kZVBhcnNlZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFDb3JlRmxhdE5vZGUpIHsKLQkJCS8vIGNvdWxkIHRlc3QgPiAxLCBidXQgc2luY2Ugd2Ugb25seSBjYXJlIGlmIHRoZXJlIGFyZSA4ICg8JUAsCi0JCQkvLyB0YWdsaWIsIHVyaSwgPSwgd2hlcmUsIHByZWZpeCwgPSwgd2hhdCkgW29yIDQgZm9yIGluY2x1ZGVzXQotCQkJaWYgKGFDb3JlRmxhdE5vZGUuZ2V0TnVtYmVyT2ZSZWdpb25zKCkgPiA0ICYmIGFDb3JlRmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgxKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJSVRleHRSZWdpb24gbmFtZSA9IGFDb3JlRmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCQl0cnkgewotCQkJCQlpbnQgb2Zmc2V0ID0gYUNvcmVGbGF0Tm9kZS5nZXRTdGFydE9mZnNldChuYW1lKTsKLQkJCQkJaW50IGxlbmd0aCA9IG5hbWUuZ2V0VGV4dExlbmd0aCgpOwotCQkJCQlib29sZWFuIHRhZ2xpYmRldGVjdGVkID0gZmFsc2U7Ci0JCQkJCWJvb2xlYW4gdGFnbGliZGlyZWN0aXZlZGV0ZWN0ZWQgPSBmYWxzZTsKLQkJCQkJaWYgKGZDaGFyU2VxdWVuY2VTb3VyY2UgaW5zdGFuY2VvZiBJUmVnaW9uQ29tcGFyaWJsZSkgewotCQkJCQkJdGFnbGliZGV0ZWN0ZWQgPSAoKElSZWdpb25Db21wYXJpYmxlKSBmQ2hhclNlcXVlbmNlU291cmNlKS5yZWdpb25NYXRjaGVzKG9mZnNldCwgbGVuZ3RoLCBKU1AxMlRMRE5hbWVzLlRBR0xJQik7Ci0JCQkJCQl0YWdsaWJkaXJlY3RpdmVkZXRlY3RlZCA9ICgoSVJlZ2lvbkNvbXBhcmlibGUpIGZDaGFyU2VxdWVuY2VTb3VyY2UpLnJlZ2lvbk1hdGNoZXMob2Zmc2V0LCBsZW5ndGgsIEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUdMSUIpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gb2xkIGZhc2hpb25lZCB3YXkKLQkJCQkJCVN0cmluZyBkaXJlY3RpdmVOYW1lID0gZ2V0VGV4dChvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCQl0YWdsaWJkZXRlY3RlZCA9IGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVEFHTElCKTsKLQkJCQkJCXRhZ2xpYmRpcmVjdGl2ZWRldGVjdGVkID0gZGlyZWN0aXZlTmFtZS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQik7Ci0JCQkJCX0KLQkJCQkJYm9vbGVhbiBwcm9jZXNzRGlyZWN0aXZlTmFtZSA9IHRhZ2xpYmRldGVjdGVkIHx8IHRhZ2xpYmRpcmVjdGl2ZWRldGVjdGVkOwotCQkJCQlpZiAocHJvY2Vzc0RpcmVjdGl2ZU5hbWUpIHsKLQkJCQkJCXByb2Nlc3NUYWdsaWIoYUNvcmVGbGF0Tm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc2lvb2JFeGMpIHsKLQkJCQkJLy8gZG8gbm90aGluZwotCQkJCX0KLQkJCX0KLQkJCS8vIGNvdWxkIHRlc3QgPiAxLCBidXQgc2luY2Ugd2Ugb25seSBjYXJlIGlmIHRoZXJlIGFyZSA1ICg8LAotCQkJLy8ganNwOnJvb3QsIHhtbG5zOnByZWZpeCwgPSwgd2hlcmUpCi0JCQllbHNlIGlmIChhQ29yZUZsYXROb2RlLmdldE51bWJlck9mUmVnaW9ucygpID4gNCAmJiAoYUNvcmVGbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDEpKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUUpIHsKLQkJCQlwcm9jZXNzSlNQUm9vdChhQ29yZUZsYXROb2RlKTsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKU1BSb290KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdGFnbGliRmxhdE5vZGUpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gdGFnbGliRmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0JCQlib29sZWFuIHRhZ2xpYiA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCQkJaW50IG9mZnNldCA9IHRhZ2xpYkZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCQlpbnQgbGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQotCQkJCQkJU3RyaW5nIG5hbWUgPSBnZXRUZXh0KG9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoWE1MTlMpICYmIG5hbWUubGVuZ3RoKCkgPiBYTUxOUy5sZW5ndGgoKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJcHJlZml4ID0gbmFtZS5zdWJzdHJpbmcoNik7Ci0JCQkJCQkJdGFnbGliID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXByZWZpeCA9IG51bGw7Ci0JCQkJCQkJdGFnbGliID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAodGFnbGliICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJcHJlZml4ID0gU3RyaW5nVXRpbHMuc3RyaXAocHJlZml4KTsKLQkJCQkJCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJZW5hYmxlRm9yVGFnbGliKHByZWZpeCwgdGFnbGliRmxhdE5vZGUpOwotCQkJCQkJCXByZWZpeCA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBzaW9vYkV4YykgewotCQkJCS8vIG5vdGhpbmcgdG8gYmUgZG9uZQotCQkJCXByZWZpeCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUHVsbHMgdGhlIHByZWZpeCBmcm9tIHRoZSBnaXZlbiB0YWdsaWIgZGlyZWN0aXZlCi0JCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5kIG1ha2VzIHN1cmUgdGhlIHByZWZpeCBpcyBuZXN0YWJsZS4KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NUYWdsaWIoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB0YWdsaWJGbGF0Tm9kZSkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSB0YWdsaWJGbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQlTdHJpbmcgcHJlZml4ID0gbnVsbDsKLQkJCWJvb2xlYW4gcHJlZml4bmFtZSA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCQkJaWYgKGZDaGFyU2VxdWVuY2VTb3VyY2UgIT0gbnVsbCAmJiBmQ2hhclNlcXVlbmNlU291cmNlIGluc3RhbmNlb2YgSVJlZ2lvbkNvbXBhcmlibGUpIHsKLQkJCQkJCQlpbnQgb2Zmc2V0ID0gdGFnbGliRmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJCQlpbnQgbGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJCQlwcmVmaXhuYW1lID0gKChJUmVnaW9uQ29tcGFyaWJsZSkgZkNoYXJTZXF1ZW5jZVNvdXJjZSkucmVnaW9uTWF0Y2hlcyhvZmZzZXQsIGxlbmd0aCwgSlNQMTJUTEROYW1lcy5QUkVGSVgpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gb2xkIGZhc2hpb25lZCB3YXkKLQkJCQkJCQlwcmVmaXhuYW1lID0gKGdldFRleHQodGFnbGliRmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSwgcmVnaW9uLmdldFRleHRMZW5ndGgoKSkuZXF1YWxzKEpTUDEyVExETmFtZXMuUFJFRklYKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocHJlZml4bmFtZSAmJiByZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCXByZWZpeCA9IGdldFRleHQodGFnbGliRmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSwgcmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBzaW9vYkV4YykgewotCQkJCS8vIG5vdGhpbmcgdG8gYmUgZG9uZQotCQkJCXByZWZpeCA9IG51bGw7Ci0JCQl9Ci0JCQlwcmVmaXggPSBTdHJpbmdVdGlscy5zdHJpcChwcmVmaXgpOwotCQkJaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApIHsKLQkJCQllbmFibGVGb3JUYWdsaWIocHJlZml4LCB0YWdsaWJGbGF0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZXNldE5vZGVzKCkgewotCQkJSXRlcmF0b3IgdGFnbWFya2VycyA9ICgoSlNQVG9rZW5pemVyKSBnZXRUb2tlbml6ZXIoKSkuZ2V0TmVzdGFibGVQcmVmaXhlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAodGFnbWFya2Vycy5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoISgoVGFnTWFya2VyKSB0YWdtYXJrZXJzLm5leHQoKSkuaXNHbG9iYWwoKSkKLQkJCQkJdGFnbWFya2Vycy5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IG5ld0RvY3VtZW50KSB7Ci0JCQlyZXNldE5vZGVzKCk7Ci0JCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCWlmIChuZXdEb2N1bWVudCAhPSBudWxsICYmIG5ld0RvY3VtZW50LmdldFBhcnNlcigpIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyKSB7Ci0JCQkJKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIpIG5ld0RvY3VtZW50LmdldFBhcnNlcigpKS5hZGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSlNQU291cmNlUGFyc2VyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEpTUFNvdXJjZVBhcnNlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGROZXN0YWJsZVByZWZpeChUYWdNYXJrZXIgbWFya2VyKSB7Ci0JCSgoSlNQVG9rZW5pemVyKSBnZXRUb2tlbml6ZXIoKSkuYWRkTmVzdGFibGVQcmVmaXgobWFya2VyKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXROZXN0YWJsZVByZWZpeGVzKCkgewotCQlyZXR1cm4gKChKU1BUb2tlbml6ZXIpIGdldFRva2VuaXplcigpKS5nZXROZXN0YWJsZVByZWZpeGVzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEJsb2NrVG9rZW5pemVyIGdldFRva2VuaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBKU1BUb2tlbml6ZXIoKTsKLQkJCWdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKCkuYWRkKG5ldyBOZXN0YWJsZVByZWZpeEhhbmRsZXIoKSk7Ci0JCX0KLQkJcmV0dXJuIGZUb2tlbml6ZXI7Ci0JfQotCi0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlKU1BTb3VyY2VQYXJzZXIgbmV3SW5zdGFuY2UgPSBuZXcgSlNQU291cmNlUGFyc2VyKCk7Ci0JCW5ld0luc3RhbmNlLnNldFRva2VuaXplcihnZXRUb2tlbml6ZXIoKS5uZXdJbnN0YW5jZSgpKTsKLQkJcmV0dXJuIG5ld0luc3RhbmNlOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcnNlTm9kZXMoKSB7Ci0JCS8vIHJlZ2lvbnMgYXJlIGluaXRpYWxseSByZXBvcnRlZCBhcyBjb21wbGV0ZSBvZmZzZXRzIHdpdGhpbiB0aGUKLQkJLy8gc2Nhbm5lZCBpbnB1dAotCQkvLyB0aGV5IGFyZSBhZGp1c3RlZCBoZXJlIHRvIGJlIGluZGV4ZXMgZnJvbSB0aGUgY3VycmVudE5vZGUncyBzdGFydAotCQkvLyBvZmZzZXQKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSBudWxsOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQkvLyBETVc6IDIvMTIvMDMuIE1hZGUgY3VycmVudCBub2RlIGxvY2FsIHZhcmlhYmxlLCBzaW5jZQotCQkvLyB3ZSBjaGFuZ2VkIGNsYXNzIHRvIG5vdCByZXF1aXJlIHN0YXRlCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUgPSBudWxsOwotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0KLQkJd2hpbGUgKChyZWdpb24gPSBnZXROZXh0UmVnaW9uKCkpICE9IG51bGwpIHsKLQkJCXR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJLy8gdGhlc2UgdHlwZXMgKG1pZ2h0KSBkZW1hbmQgYSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZvciBlYWNoCi0JCQkvLyBvZiB0aGVtCi0JCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJCQkvLyBtdWx0aXBsZSBibG9jayB0ZXh0cyBpbmRpY2F0ZWQgZW1iZWRkZWQgY29udGFpbmVyczsgbm8KLQkJCQkJLy8gbmV3IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCQkoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZWdpb24pLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG5vdCBjb250aW51aW5nIGEgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCQkJLy8gZW5zdXJlIHRoYXQgYW55IGV4aXN0aW5nIG5vZGUgaXMgYXQgbGVhc3QKLQkJCQkJCS8vIHRlcm1pbmF0ZWQKLQkJCQkJCWlmICghY3VycmVudE5vZGUuaXNFbmRlZCgpKSB7Ci0JCQkJCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCQkJLy8gZkN1cnJlbnROb2RlLnNldFRleHRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgLQotCQkJCQkJCS8vIGZDdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJCX0KLQkJCQkJCWxhc3ROb2RlID0gY3VycmVudE5vZGU7Ci0JCQkJCX0KLQkJCQkJZmlyZU5vZGVQYXJzZWQoY3VycmVudE5vZGUpOwotCQkJCQljdXJyZW50Tm9kZSA9IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0eXBlKTsKLQkJCQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCQkJCWxhc3ROb2RlLnNldE5leHQoY3VycmVudE5vZGUpOwotCQkJCQl9Ci0JCQkJCWN1cnJlbnROb2RlLnNldFByZXZpb3VzKGxhc3ROb2RlKTsKLQkJCQkJY3VycmVudE5vZGUuc2V0U3RhcnQocmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJY3VycmVudE5vZGUuc2V0RW5kZWQodHJ1ZSk7Ci0JCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCQkoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZWdpb24pLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQkJCS8vIHRoZSBmb2xsb3dpbmcgY29udGV4dHMgT1BFTiBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCQkJZWxzZSBpZiAoKGN1cnJlbnROb2RlICE9IG51bGwgJiYgY3VycmVudE5vZGUuaXNFbmRlZCgpKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4pIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSkgfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfT1BFTikgewotCQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCS8vIGVuc3VyZSB0aGF0IGFueSBleGlzdGluZyBub2RlIGlzIGF0IGxlYXN0IHRlcm1pbmF0ZWQKLQkJCQkJaWYgKCFjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHsKLQkJCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkJLy8gZkN1cnJlbnROb2RlLnNldFRleHRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgLQotCQkJCQkJLy8gZkN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQl9Ci0JCQkJCWxhc3ROb2RlID0gY3VycmVudE5vZGU7Ci0JCQkJfQotCQkJCWZpcmVOb2RlUGFyc2VkKGN1cnJlbnROb2RlKTsKLQkJCQljdXJyZW50Tm9kZSA9IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0eXBlKTsKLQkJCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCQlsYXN0Tm9kZS5zZXROZXh0KGN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQkJY3VycmVudE5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJCWN1cnJlbnROb2RlLnNldFN0YXJ0KHJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCSgoSVRleHRSZWdpb25Db250YWluZXIpIHJlZ2lvbikuc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQl9Ci0KLQkJCX0KLQkJCS8vIHRoZSBmb2xsb3dpbmcgY29udGV4dHMgTkVJVEhFUiBvcGVuIG5vciBjbG9zZQotCQkJLy8gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uczsganVzdCBhZGQgdG8gdGhlbQotCQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ09OVEVOVCkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX1RFWFQpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX0NPTlRFTlQpIHsKLQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCSgoSVRleHRSZWdpb25Db250YWluZXIpIHJlZ2lvbikuc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyB0aGUgZm9sbG93aW5nIGNvbnRleHRzIGNsb3NlIG9mZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zCi0JCQkvLyBjbGVhbmx5Ci0JCQllbHNlIGlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0UpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX0NMT1NFKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9DTE9TRSkgfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfQ0xPU0UpIHsKLQkJCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCSgoSVRleHRSZWdpb25Db250YWluZXIpIHJlZ2lvbikuc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyB0aGlzIGlzIGV4dHJlbWVseSByYXJlLCBidXQgdmFsaWQKLQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRSkgewotCQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSBjdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCk7Ci0JCQkJLy8gcGFjayB0aGUgZW1iZWRkZWQgY29udGFpbmVyIHdpdGggdGhpcyByZWdpb24KLQkJCQlpZiAobGFzdFJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCUlUZXh0UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgbGFzdFJlZ2lvbjsKLQkJCQkJY29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQocmVnaW9uKTsKLQkJCQkJLy8gRFcsIDQvMTYvMjAwMyBjb250YWluZXIgcmVnaW9ucyBoYXZlIHBhcmVudC4gUHJvYmFibHkgYQotCQkJCQkvLyBiZXR0ZXIgcGxhY2UgdG8gc2V0LAotCQkJCQkvLyBidXQgZm9yIG5vdywgd2lsbCAocmUpc2V0IGVhY2ggdGltZSB0aHJvdWdoCi0JCQkJCWNvbnRhaW5lci5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGNvbnRhaW5lcik7Ci0JCQkJCXJlZ2lvbi5hZGp1c3RTdGFydChjb250YWluZXIuZ2V0TGVuZ3RoKCkgLSByZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJfQotCQkJCWN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKS5hZGp1c3RMZW5ndGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQljdXJyZW50Tm9kZS5hZGp1c3RMZW5ndGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQgJiYgY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCS8vIHNraXAgb24gYSB2ZXJ5LWZpcnN0IHJlZ2lvbiBzaXR1YXRpb24gYXMgdGhlIGRlZmF1bHQKLQkJCQkvLyBiZWhhdmlvciBpcyBnb29kIGVub3VnaAotCQkJCS8vIGNvbWJpbmUgd2l0aCBwcmV2aW91cyBpZiBhbHNvIHVuZGVmaW5lZAotCQkJCWlmIChjdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEKSB7Ci0JCQkJCWN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKS5hZGp1c3RMZW5ndGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQkJY3VycmVudE5vZGUuYWRqdXN0TGVuZ3RoKHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJCS8vIHByZXZpb3VzIHdhc24ndCB1bmRlZmluZWQKLQkJCQllbHNlIHsKLQkJCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCX0KLQkJCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uKS5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGlmIGFuIHVua25vd24gdHlwZSBpcyB0aGUgZmlyc3QgcmVnaW9uIGluIHRoZSBkb2N1bWVudCwKLQkJCQkvLyBlbnN1cmUgdGhhdCBhIG5vZGUgZXhpc3RzCi0JCQkJaWYgKGN1cnJlbnROb2RlID09IG51bGwpIHsKLQkJCQkJY3VycmVudE5vZGUgPSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odHlwZSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldFN0YXJ0KHJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCQl9Ci0JCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQkoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZWdpb24pLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCi0JCQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZvdW5kIHJlZ2lvbiBvZiBub3Qgc3BlY2lmaWNhbGx5IGhhbmRsZWQgdHlwZSAiICsgcmVnaW9uLmdldFR5cGUoKSArICIgQCAiICsgcmVnaW9uLmdldFN0YXJ0KCkgKyAiWyIgKyByZWdpb24uZ2V0TGVuZ3RoKCkgKyAiXSIpOy8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQotCQkJfQotCi0JCQkvLyB0aGVzZSByZWdpb25zIGFsc28gZ2V0IHRoZWlyIG93biBub2RlLCBzbyBjbG9zZSB0aGVtIGNsZWFubHkKLQkJCS8vIE5PVEU6IHRoZXNlIHJlZ2lvbnMgaGF2ZSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyBjcmVhdGVkCi0JCQkvLyBmb3IgdGhlbSBhYm92ZTsgaXQgbWF5Ci0JCQkvLyBiZSBtb3JlIHJlYWRhYmxlIGlmIHRoYXQgaXMgaGFuZGxlZCBoZXJlIGFzIHdlbGwsIGJ1dCB0aGUKLQkJCS8vIGN1cnJlbnQgbGF5b3V0Ci0JCQkvLyBlbnN1cmVzIHRoYXQgdGhleSBvcGVuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgdGhlIHNhbWUgd2F5Ci0JCQlpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4pIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0UpKSB7Ci0JCQkJY3VycmVudE5vZGUuc2V0RW5kZWQodHJ1ZSk7Ci0JCQl9Ci0JCQlpZiAoaGVhZE5vZGUgPT0gbnVsbCAmJiBjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJaGVhZE5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJCX0KLQkJfQotCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJZmlyZU5vZGVQYXJzZWQoY3VycmVudE5vZGUpOwotCQkJY3VycmVudE5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQl9Ci0JCXByaW1SZXNldCgpOwotCQlyZXR1cm4gaGVhZE5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTmVzdGFibGVQcmVmaXgoU3RyaW5nIHRhZ05hbWUpIHsKLQkJKChKU1BUb2tlbml6ZXIpIGdldFRva2VuaXplcigpKS5yZW1vdmVOZXN0YWJsZVByZWZpeCh0YWdOYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL2ludGVybmFsL0pTUFBhcnNlclJlZ2lvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL2ludGVybmFsL0pTUFBhcnNlclJlZ2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzNmRhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9pbnRlcm5hbC9KU1BQYXJzZXJSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXIuRm9yZWlnblJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuWE1MUGFyc2VyUmVnaW9uRmFjdG9yeTsKLQotLyoqCi0gKiAKLSAqIFRoaXMgcmVnaW9uIGZhY3RvcnkgaXMgdmVyeSBzcGVjaWZpYyB0byB0aGUgcGFyc2VyIG91dHB1dCwgYW5kIHRoZSBzcGVjaWZpYwotICogaW1wbGVtZW50YXRpb24gY2xhc3NlcyBmb3IgdmFyaW91cyByZWdpb25zLgotICovCi1wdWJsaWMgY2xhc3MgSlNQUGFyc2VyUmVnaW9uRmFjdG9yeSBleHRlbmRzIFhNTFBhcnNlclJlZ2lvbkZhY3RvcnkgewotCXB1YmxpYyBKU1BQYXJzZXJSZWdpb25GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCwgU3RyaW5nIGxhbmcsIFN0cmluZyBzdXJyb3VuZGluZ1RhZykgewotCQlJVGV4dFJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQlpZiAoY29udGV4dCA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCkgewotCQkJbmV3UmVnaW9uID0gbmV3IEZvcmVpZ25SZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJZWxzZQotCQkJbmV3UmVnaW9uID0gc3VwZXIuY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbGFuZywgc3Vycm91bmRpbmdUYWcpOwotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL2ludGVybmFsL0pTUFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9pbnRlcm5hbC9KU1BTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OThlZDk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL2ludGVybmFsL0pTUFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuSlNQRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5YTUxTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeTsKLQotLyoqCi0gKiBBIHNpbXBsZSBjbGFzcyB0byBnZW5lcmF0ZSBpbnN0YW5jZXMgb2YgU3RydWN0dXJlZFJlZ2lvbnMuIAotICovCi1wdWJsaWMgY2xhc3MgSlNQU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkgZXh0ZW5kcyBYTUxTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeSB7Ci0KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3JlYXRlUmVnaW9uKGludCB0eXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2UgPSBudWxsOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgSlNQX0RJUkVDVElWRSA6Ci0JCQkJaW5zdGFuY2UgPSBuZXcgSlNQRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlpbnN0YW5jZSA9IFhNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5LmNyZWF0ZVJlZ2lvbih0eXBlKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9pbnRlcm5hbC9KU1BUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL2ludGVybmFsL0pTUFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDI0NDc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL2ludGVybmFsL0pTUFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgzOCArMCwwIEBACi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjIuMiBvbiAxMC8yNC8wNyA1OjE2IEFNICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tUb2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuVGFnTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5Db250ZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuSW50U3RhY2s7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUvfmtsZWluZy9qZmxleC8iPkpGbGV4PC9hPiAxLjIuMgotICogb24gMTAvMjQvMDcgNToxNiBBTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9lY2xpcHNlLnd0cC93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvSlNQVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIEpTUFRva2VuaXplciBpbXBsZW1lbnRzIEJsb2NrVG9rZW5pemVyLCBET01KU1BSZWdpb25Db250ZXh0cyB7Ci0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9WQkxfRFFVT1RFUyA9IDUxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfVkJMX1NRVU9URVMgPSA1MDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1ZCTF9TUVVPVEVTX0VORCA9IDUyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQ09NTUVOVF9FTkQgPSA0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9WQUxVRSA9IDIxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRUxfU1FVT1RFU19FTkQgPSA0NTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0VMX0RRVU9URVMgPSA0NDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0VMID0gNDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0JMT0NLX1RBR19TQ0FOID0gMzY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9FTF9TUVVPVEVTID0gNDM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRSA9IDE0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfQVRUUklCVVRFX05BTUUgPSA4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9UQUdfQ0xPU0UgPSAxNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEID0gNDE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0VRVUFMUyA9IDEzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUgPSAyNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1ZCTCA9IDQ5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfU1FVT1RFRF9WQkwgPSA1NTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEID0gNDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSA9IDIzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRVFVQUxTID0gMjQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUgPSAxOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0NPTlRFTlQgPSAxNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNID0gMzE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OID0gMzI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSA9IDI3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX0VRVUFMUyA9IDIwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfVkJMX0RRVU9URVNfRU5EID0gNTM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9EUVVPVEVEX0VMID0gNDc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OID0gMjg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0NEQVRBX0VORCA9IDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJX1dTID0gNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0RBVEFfVEVYVCA9IDE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9ESVJFQ1RJVkVfTkFNRV9XSElURVNQQUNFID0gMTg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQgPSAzMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04gPSAzNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0VMX0RRVU9URVNfRU5EID0gNDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9TUVVPVEVEX0VMID0gNDg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9DT01NRU5UX0VORCA9IDM5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfRVFVQUxTID0gOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVCA9IDM1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMgPSAzMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RRVU9URURfVkJMID0gNTQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FID0gMTI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0FCT1JUX0VNQkVEREVEID0gMzc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEID0gMjk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9DT01NRU5UID0gMzg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJX0NPTlRFTlQgPSA3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTiA9IDM3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSSA9IDU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ERUNMQVJBVElPTiA9IDI2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX05BTUUgPSAxNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1RBR19OQU1FID0gMjI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9UQUdfQ0xPU0UgPSAxMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0NPTU1FTlQgPSAzOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXljbWFwX3BhY2tlZCA9IAotICAgICJcMTFcMFwxXDVcMVwyNlwyXDBcMVwxN1wyMlwwXDFcMTdcMVwyNVwxXDEyXDFcNjUiKwotICAgICJcMVwxNVwxXDIyXDFcMTNcMVwxNFwxXDI0XDFcMjRcMVwyNFwxXDI0XDFcMjRcMVw3IisKLSAgICAiXDFcNlwxXDNcMTJcMjBcMVwxMVwxXDcyXDFcMVwxXDUxXDFcMlwxXDRcMVwyMSIrCi0gICAgIlwxXDQwXDFcNzNcMVwzNlwxXDM3XDFcNTVcMVw3MFwxXDYyXDFcNjJcMVw2M1wxXDYyIisKLSAgICAiXDFcNjJcMVwzM1wxXDMxXDFcNjRcMVw1MlwxXDU0XDFcNjJcMVw2N1wxXDY2XDFcNDEiKwotICAgICJcMVw3MVwyXDYyXDFcMjdcMVw1M1wxXDYyXDFcMzVcMVwxMDRcMVwyM1wxXDBcMVwxMCIrCi0gICAgIlwxXDBcMVw1N1wxXDEwM1wxXDc0XDFcNjBcMVw0M1wxXDcwXDFcNzVcMVwxMDZcMVw0NiIrCi0gICAgIlwxXDEwMFwxXDYyXDFcMzRcMVwzMlwxXDUwXDFcNDdcMVwxMDFcMVw2MlwxXDQ0XDFcNDUiKwotICAgICJcMVw1NlwxXDEwMlwxXDQyXDFcNjJcMVwzMFwxXDYxXDFcNjJcMVwxNlwxXDBcMVwxMDUiKwotICAgICJcNzFcMFwxXDc3XDEwXDBcMjdcNzZcMVwwXDM3XDc2XDFcMFw3Mlw3NlwyXDBcMTNcNzYiKwotICAgICJcMlwwXDEwXDc2XDFcMFw2NVw3NlwxXDBcMTA0XDc2XDExXDBcNDRcNzZcM1wwXDJcNzYiKwotICAgICJcNFwwXDM2XDc2XDcwXDBcMTMxXDc2XDIyXDBcN1w3NlwxNlwwXDJcNzdcNTZcMFwxMDZcNzciKwotICAgICJcMzJcMFwyXDc3XDQ0XDBcMVw3NlwxXDc3XDNcNzZcMVwwXDFcNzZcMVwwXDI0XDc2IisKLSAgICAiXDFcMFw1NFw3NlwxXDBcN1w3NlwzXDBcMVw3NlwxXDBcMVw3NlwxXDBcMVw3NiIrCi0gICAgIlwxXDBcMVw3NlwxXDBcMjJcNzZcMTVcMFwxNFw3NlwxXDBcMTAyXDc2XDFcMFwxNFw3NiIrCi0gICAgIlwxXDBcNDRcNzZcMVwwXDRcNzdcMTFcMFw2NVw3NlwyXDBcMlw3NlwyXDBcMlw3NiIrCi0gICAgIlwzXDBcMzRcNzZcMlwwXDEwXDc2XDJcMFwyXDc2XDY3XDBcNDZcNzZcMlwwXDFcNzYiKwotICAgICJcN1wwXDQ2XDc2XDEyXDBcMjFcNzdcMVwwXDI3XDc3XDFcMFwzXDc3XDFcMFwxXDc3IisKLSAgICAiXDFcMFwyXDc3XDFcMFwxXDc3XDEzXDBcMzNcNzZcNVwwXDNcNzZcNTZcMFwzMlw3NiIrCi0gICAgIlw1XDBcMVw3N1wxMlw3NlwxMFw3N1wxNVwwXDEyXDc3XDZcMFwxXDc3XDEwN1w3NlwyXDAiKwotICAgICJcNVw3NlwxXDBcMTdcNzZcMVwwXDRcNzZcMVwwXDFcNzZcMTdcNzdcMlw3NlwyXDc3IisKLSAgICAiXDFcMFw0XDc3XDJcMFwxMlw3N1x1MDIwN1wwXDNcNzdcMVwwXDY1XDc2XDJcMFwxXDc3IisKLSAgICAiXDFcNzZcMjBcNzdcM1wwXDRcNzdcM1wwXDEyXDc2XDJcNzdcMlwwXDEyXDc3XDIxXDAiKwotICAgICJcM1w3N1wxXDBcMTBcNzZcMlwwXDJcNzZcMlwwXDI2XDc2XDFcMFw3XDc2XDFcMCIrCi0gICAgIlwxXDc2XDNcMFw0XDc2XDJcMFwxXDc3XDFcMFw3XDc3XDJcMFwyXDc3XDJcMCIrCi0gICAgIlwzXDc3XDExXDBcMVw3N1w0XDBcMlw3NlwxXDBcM1w3NlwyXDc3XDJcMFwxMlw3NyIrCi0gICAgIlwyXDc2XDIwXDBcMVw3N1wyXDBcNlw3Nlw0XDBcMlw3NlwyXDBcMjZcNzZcMVwwIisKLSAgICAiXDdcNzZcMVwwXDJcNzZcMVwwXDJcNzZcMVwwXDJcNzZcMlwwXDFcNzdcMVwwIisKLSAgICAiXDVcNzdcNFwwXDJcNzdcMlwwXDNcNzdcMTNcMFw0XDc2XDFcMFwxXDc2XDdcMCIrCi0gICAgIlwxMlw3N1wyXDc3XDNcNzZcMTRcMFwzXDc3XDFcMFw3XDc2XDFcMFwxXDc2XDFcMCIrCi0gICAgIlwzXDc2XDFcMFwyNlw3NlwxXDBcN1w3NlwxXDBcMlw3NlwxXDBcNVw3NlwyXDAiKwotICAgICJcMVw3N1wxXDc2XDEwXDc3XDFcMFwzXDc3XDFcMFwzXDc3XDIyXDBcMVw3Nlw1XDAiKwotICAgICJcMTJcNzdcMjFcMFwzXDc3XDFcMFwxMFw3NlwyXDBcMlw3NlwyXDBcMjZcNzZcMVwwIisKLSAgICAiXDdcNzZcMVwwXDJcNzZcMlwwXDRcNzZcMlwwXDFcNzdcMVw3Nlw2XDc3XDNcMCIrCi0gICAgIlwyXDc3XDJcMFwzXDc3XDEwXDBcMlw3N1w0XDBcMlw3NlwxXDBcM1w3Nlw0XDAiKwotICAgICJcMTJcNzdcMjJcMFwyXDc3XDFcMFw2XDc2XDNcMFwzXDc2XDFcMFw0XDc2XDNcMCIrCi0gICAgIlwyXDc2XDFcMFwxXDc2XDFcMFwyXDc2XDNcMFwyXDc2XDNcMFwzXDc2XDNcMCIrCi0gICAgIlwxMFw3NlwxXDBcM1w3Nlw0XDBcNVw3N1wzXDBcM1w3N1wxXDBcNFw3N1wxMVwwIisKLSAgICAiXDFcNzdcMTdcMFwxMVw3N1wyMVwwXDNcNzdcMVwwXDEwXDc2XDFcMFwzXDc2XDFcMCIrCi0gICAgIlwyN1w3NlwxXDBcMTJcNzZcMVwwXDVcNzZcNFwwXDdcNzdcMVwwXDNcNzdcMVwwIisKLSAgICAiXDRcNzdcN1wwXDJcNzdcMTFcMFwyXDc2XDRcMFwxMlw3N1wyMlwwXDJcNzdcMVwwIisKLSAgICAiXDEwXDc2XDFcMFwzXDc2XDFcMFwyN1w3NlwxXDBcMTJcNzZcMVwwXDVcNzZcNFwwIisKLSAgICAiXDdcNzdcMVwwXDNcNzdcMVwwXDRcNzdcN1wwXDJcNzdcN1wwXDFcNzZcMVwwIisKLSAgICAiXDJcNzZcNFwwXDEyXDc3XDIyXDBcMlw3N1wxXDBcMTBcNzZcMVwwXDNcNzZcMVwwIisKLSAgICAiXDI3XDc2XDFcMFwyMFw3Nlw0XDBcNlw3N1wyXDBcM1w3N1wxXDBcNFw3N1wxMVwwIisKLSAgICAiXDFcNzdcMTBcMFwyXDc2XDRcMFwxMlw3N1wyMjFcMFw1Nlw3NlwxXDBcMVw3NlwxXDc3IisKLSAgICAiXDJcNzZcN1w3N1w1XDBcNlw3NlwxXDc3XDEwXDc3XDFcMFwxMlw3N1w0N1wwXDJcNzYiKwotICAgICJcMVwwXDFcNzZcMlwwXDJcNzZcMVwwXDFcNzZcMlwwXDFcNzZcNlwwXDRcNzYiKwotICAgICJcMVwwXDdcNzZcMVwwXDNcNzZcMVwwXDFcNzZcMVwwXDFcNzZcMlwwXDJcNzYiKwotICAgICJcMVwwXDJcNzZcMVwwXDFcNzZcMVw3N1wyXDc2XDZcNzdcMVwwXDJcNzdcMVw3NiIrCi0gICAgIlwyXDBcNVw3NlwxXDBcMVw3N1wxXDBcNlw3N1wyXDBcMTJcNzdcNzZcMFwyXDc3IisKLSAgICAiXDZcMFwxMlw3N1wxM1wwXDFcNzdcMVwwXDFcNzdcMVwwXDFcNzdcNFwwXDJcNzciKwotICAgICJcMTBcNzZcMVwwXDQxXDc2XDdcMFwyNFw3N1wxXDBcNlw3N1w0XDBcNlw3N1wxXDAiKwotICAgICJcMVw3N1wxXDBcMjVcNzdcM1wwXDdcNzdcMVwwXDFcNzdcMzQ2XDBcNDZcNzZcMTJcMCIrCi0gICAgIlw0N1w3NlwxMVwwXDFcNzZcMVwwXDJcNzZcMVwwXDNcNzZcMVwwXDFcNzZcMVwwIisKLSAgICAiXDJcNzZcMVwwXDVcNzZcNTFcMFwxXDc2XDFcMFwxXDc2XDFcMFwxXDc2XDEzXDAiKwotICAgICJcMVw3NlwxXDBcMVw3NlwxXDBcMVw3NlwzXDBcMlw3NlwzXDBcMVw3Nlw1XDAiKwotICAgICJcM1w3NlwxXDBcMVw3NlwxXDBcMVw3NlwxXDBcMVw3NlwxXDBcMVw3NlwzXDAiKwotICAgICJcMlw3NlwzXDBcMlw3NlwxXDBcMVw3Nlw1MFwwXDFcNzZcMTFcMFwxXDc2XDJcMCIrCi0gICAgIlwxXDc2XDJcMFwyXDc2XDdcMFwyXDc2XDFcMFwxXDc2XDFcMFw3XDc2XDUwXDAiKwotICAgICJcMVw3Nlw0XDBcMVw3NlwxMFwwXDFcNzZcdTBjMDZcMFwyMzRcNzZcNFwwXDEzMlw3Nlw2XDAiKwotICAgICJcMjZcNzZcMlwwXDZcNzZcMlwwXDQ2XDc2XDJcMFw2XDc2XDJcMFwxMFw3NlwxXDAiKwotICAgICJcMVw3NlwxXDBcMVw3NlwxXDBcMVw3NlwxXDBcMzdcNzZcMlwwXDY1XDc2XDFcMCIrCi0gICAgIlw3XDc2XDFcMFwxXDc2XDNcMFwzXDc2XDFcMFw3XDc2XDNcMFw0XDc2XDJcMCIrCi0gICAgIlw2XDc2XDRcMFwxNVw3Nlw1XDBcM1w3NlwxXDBcN1w3NlwzMjNcMFwxNVw3N1w0XDAiKwotICAgICJcMVw3N1wxMDRcMFwxXDc2XDNcMFwyXDc2XDJcMFwxXDc2XDEyMVwwXDNcNzZcdTBlODJcMCIrCi0gICAgIlwxXDc3XDFcMFwxXDc2XDMxXDBcMTFcNzZcNlw3N1wxXDBcNVw3N1wxM1wwXDEyNFw3NiIrCi0gICAgIlw0XDBcMlw3N1wyXDBcMlw3N1wyXDBcMTMyXDc2XDFcMFwzXDc3XDZcMFw1MFw3NiIrCi0gICAgIlx1MWNkM1wwXHU1MWE2XDc2XHUwYzVhXDBcdTJiYTRcNzZcMTM0XDBcdTA4MDBcMFx1MWZmZVwwXDJcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eV9yb3dNYXAgW10gPSB7IAotICAgICAgICAwLCAgICA3MSwgICAxNDIsICAgMjEzLCAgIDI4NCwgICAzNTUsICAgNDI2LCAgIDQ5NywgICA1NjgsICAgNjM5LCAKLSAgICAgIDcxMCwgICA3ODEsICAgODUyLCAgIDkyMywgICA5OTQsICAxMDY1LCAgMTEzNiwgIDEyMDcsICAxMjc4LCAgMTM0OSwgCi0gICAgIDE0MjAsICAxNDkxLCAgMTU2MiwgIDE2MzMsICAxNzA0LCAgMTc3NSwgIDE4NDYsICAxOTE3LCAgMTk4OCwgIDIwNTksIAotICAgICAyMTMwLCAgMjIwMSwgIDIyNzIsICAyMzQzLCAgMjQxNCwgIDI0ODUsICAyNTU2LCAgMjYyNywgIDI2OTgsICAyNzY5LCAKLSAgICAgMjg0MCwgIDI5MTEsICAyOTgyLCAgMzA1MywgIDMxMjQsICAzMTk1LCAgMzI2NiwgIDMzMzcsICAzNDA4LCAgMzQ3OSwgCi0gICAgIDM1NTAsICAzNjIxLCAgMzY5MiwgIDM3NjMsICAzODM0LCAgMzkwNSwgIDM5NzYsICA0MDQ3LCAgNDExOCwgIDQxODksIAotICAgICA0MjYwLCAgNDMzMSwgIDQ0MDIsICA0NDczLCAgNDQwMiwgIDQ0NzMsICA0NTQ0LCAgNDQwMiwgIDQ0MDIsICA0NDczLCAKLSAgICAgNDYxNSwgIDQ2ODYsICA0NzU3LCAgNDgyOCwgIDQ4OTksICA0OTcwLCAgNTA0MSwgIDUxMTIsICA0NDAyLCAgNDQ3MywgCi0gICAgIDUxODMsICA1MjU0LCAgNTMyNSwgIDQ0MDIsICA1Mzk2LCAgNTM5NiwgIDU0NjcsICA1NTM4LCAgNTYwOSwgIDUxODMsIAotICAgICA0NDAyLCAgNTY4MCwgIDU3NTEsICA0NDAyLCAgNTgyMiwgIDU4OTMsICA1OTY0LCAgNjAzNSwgIDQ0MDIsICA0NDczLCAKLSAgICAgNjEwNiwgIDYxNzcsICA2MjQ4LCAgNjMxOSwgIDYzOTAsICA2NDYxLCAgNDQwMiwgIDY1MzIsICA2NTMyLCAgNjYwMywgCi0gICAgIDY2NzQsICA2NzQ1LCAgNjgxNiwgIDY4ODcsICA0NDAyLCAgNjk1OCwgIDcwMjksICA3MTAwLCAgNzE3MSwgIDcyNDIsIAotICAgICA3MzEzLCAgNDQwMiwgIDczODQsICA3NDU1LCAgNzUyNiwgIDc1OTcsICA3NjY4LCAgNzczOSwgIDc4MTAsICA3ODgxLCAKLSAgICAgNDQwMiwgIDc5NTIsICA4MDIzLCAgODA5NCwgIDgxNjUsICA4MjM2LCAgODMwNywgIDgzNzgsICA4NDQ5LCAgODQ0OSwgCi0gICAgIDg1MjAsICA4NTkxLCAgODY2MiwgIDg3MzMsICA4NzMzLCAgODgwNCwgIDg4NzUsICA4OTQ2LCAgOTAxNywgIDkwMTcsIAotICAgICA5MDg4LCAgOTE1OSwgIDkyMzAsICA5MzAxLCAgNDQwMiwgIDkzNzIsICA5MzcyLCAgOTQ0MywgIDk1MTQsICA5NTg1LCAKLSAgICAgOTY1NiwgIDQ0MDIsICA0NDAyLCAgNDQ3MywgIDQ0MDIsICA0NDczLCAgOTcyNywgIDk3OTgsICA5ODY5LCAgOTk0MCwgCi0gICAgIDQ0MDIsIDEwMDExLCAxMDA4MiwgMTAxNTMsIDEwMjI0LCAgNDQwMiwgMTAyOTUsIDEwMzY2LCAxMDQzNywgMTA1MDgsIAotICAgICA0NDAyLCAgNDQwMiwgMTA1NzksICA0NDAyLCAxMDY1MCwgMTA3MjEsIDEwNjUwLCAxMDc5MiwgMTA4NjMsIDEwNzkyLCAKLSAgICAgNDQwMiwgIDQ0MDIsIDEwOTM0LCAxMTAwNSwgMTEwNzYsICA0NDAyLCAxMTE0NywgMTEyMTgsIDExMjg5LCAxMTM2MCwgCi0gICAgMTE0MzEsICA0NDAyLCAgNDQwMiwgMTE1MDIsICA0NDAyLCAxMTU3MywgMTE2NDQsIDExNTczLCAxMTcxNSwgMTE3ODYsIAotICAgIDExNzE1LCAgNDQwMiwgIDQ0MDIsIDExODU3LCAxMTkyOCwgMTE5OTksICA0NDAyLCAxMjA3MCwgMTIxNDEsIDEyMjEyLCAKLSAgICAgNDQwMiwgIDQ0MDIsIDEyMjgzLCAxMjM1NCwgMTI0MjUsIDEyNDk2LCAxMjU2NywgIDQ0MDIsIDEyNjM4LCAxMjcwOSwgCi0gICAgMTI3ODAsIDEyODUxLCAxMjkyMiwgMTI5OTMsIDEzMDY0LCAxMzEzNSwgIDQ0MDIsIDEzMjA2LCAxMzI3NywgMTMzNDgsIAotICAgICA0NDAyLCAgNDQwMiwgIDUzOTYsICA1NTM4LCAgNDQwMiwgMTM0MTksICA1NjA5LCAxMzQ5MCwgIDU2ODAsICA1ODIyLCAKLSAgICAgNTg5MywgMTM1NjEsICA1OTY0LCAgNDQwMiwgMTM2MzIsIDEzNzAzLCAgNjAzNSwgMTM3NzQsICA0NDAyLCAxMjM1NCwgCi0gICAgIDQ0MDIsICA2NTMyLCAgNjYwMywgIDQ0MDIsIDEzODQ1LCAgNjY3NCwgMTM5MTYsICA0NDAyLCAxMzk4NywgMTQwNTgsIAotICAgICA3Mzg0LCAxNDEyOSwgIDc1OTcsICA0NDAyLCAxNDIwMCwgIDc2NjgsIDE0MjcxLCAxNDM0MiwgMTQ0MTMsIDE0NDg0LCAKLSAgICAxNDU1NSwgMTQ2MjYsICA4MTY1LCAgNDQwMiwgMTQ2OTcsIDE0NzY4LCAgODQ0OSwgIDg1MjAsICA0NDAyLCAxNDgzOSwgCi0gICAgMTQ5MTAsIDE0OTgxLCAxNTA1MiwgMTUxMjMsICA4NjYyLCAgODQ0OSwgIDg3MzMsICA4ODA0LCAgNDQwMiwgIDg4NzUsIAotICAgICA4OTQ2LCAgODczMywgIDkwMTcsICA5MDg4LCAgNDQwMiwgMTUxOTQsIDE1MjY1LCAxNTMzNiwgMTU0MDcsIDE1NDc4LCAKLSAgICAxNTU0OSwgMTU2MjAsICA5MzcyLCAgOTQ0MywgIDQ0MDIsIDE1NjkxLCAxNTc2MiwgMTU4MzMsIDE1OTA0LCAxNTk3NSwgCi0gICAgMTYwNDYsIDE2MTE3LCAxNjE4OCwgMTYyNTksICA0NDAyLCAgNDQwMiwgIDQ0MDIsIDE2MzMwLCAgNDQwMiwgIDQ0MDIsIAotICAgIDE2NDAxLCAxNjQ3MiwgMTY1NDMsIDE2NjE0LCAxMDY1MCwgIDQ0MDIsIDE2Njg1LCAxNjc1NiwgMTA3OTIsICA0NDAyLCAKLSAgICAxNjgyNywgMTY4OTgsIDE2OTY5LCAxNzA0MCwgMTcxMTEsIDE3MTgyLCAxNzI1MywgMTczMjQsIDE3Mzk1LCAxMTM2MCwgCi0gICAgMTE1NzMsICA0NDAyLCAxNzQ2NiwgMTc1MzcsIDExNzE1LCAgNDQwMiwgMTc2MDgsIDE3Njc5LCAxNzc1MCwgMTc4MjEsIAotICAgIDE3ODkyLCAxNzk2MywgMTgwMzQsIDE4MTA1LCAxODE3NiwgIDQ0MDIsICA0NDAyLCAgNDQwMiwgMTgyNDcsIDE4MzE4LCAKLSAgICAxODM4OSwgMTg0NjAsIDE4NTMxLCAgNDQwMiwgMTg2MDIsIDE4NjczLCAgNDQwMiwgIDQ0MDIsICA0NDAyLCAgNDQwMiwgCi0gICAgIDQ0MDIsICA0ODI4LCAxODc0NCwgMTg4MTUsIDE4ODg2LCAxODk1NywgMTkwMjgsIDE5MDk5LCAxOTE3MCwgMTkwOTksIAotICAgIDE5MjQxLCAxOTMxMiwgMTkyNDEsIDE5MzgzLCAxOTQ1NCwgMTk1MjUsIDE5NTk2LCAxOTY2NywgMTk3MzgsIDE5ODA5LCAKLSAgICAxOTgwOSwgMTk4ODAsIDE5OTUxLCAxOTk1MSwgMjAwMjIsICA5MjMwLCAgOTIzMCwgIDkyMzAsIDIwMDkzLCAyMDE2NCwgCi0gICAgMjAyMzUsIDIwMjM1LCAyMDMwNiwgIDk1ODUsICA5NTg1LCAgOTU4NSwgMjAzNzcsIDIwNDQ4LCAxNjU0MywgMjA1MTksIAotICAgIDEwNDM3LCAxMDQzNywgMTA0MzcsIDIwNTkwLCAyMDY2MSwgMTA2NTAsIDEwNjUwLCAxMDY1MCwgMjA3MzIsIDIwODAzLCAKLSAgICAxMDc5MiwgMTA3OTIsIDEwNzkyLCAyMDg3NCwgMjA5NDUsIDEwOTM0LCAxMDkzNCwgMTA5MzQsIDE3MTExLCAyMTAxNiwgCi0gICAgMjEwODcsIDExMTQ3LCAxMTE0NywgMTExNDcsIDE3MzI0LCAyMTE1OCwgMjEyMjksIDExMzYwLCAxMTM2MCwgMTEzNjAsIAotICAgIDIxMzAwLCAxMTU3MywgMTE1NzMsIDExNTczLCAyMTM3MSwgMjE0NDIsIDExNzE1LCAxMTcxNSwgMTE3MTUsIDIxNTEzLCAKLSAgICAyMTU4NCwgMTE4NTcsIDExODU3LCAxMTg1NywgMTc4OTIsIDIxNjU1LCAyMTcyNiwgMTIwNzAsIDEyMDcwLCAxMjA3MCwgCi0gICAgMTgxMDUsIDIxNzk3LCAgNDQwMiwgIDQ0MDIsIDIxODY4LCAyMTkzOSwgIDQ0MDIsIDIyMDEwLCAyMjA4MSwgMjIxNTIsIAotICAgIDIyMjIzLCAgNzM4NCwgIDQ0MDIsICA0NDAyLCAyMjI5NCwgMjIzNjUsIDIyNDM2LCAyMjUwNywgMjI1NzgsIDE1MDUyLCAKLSAgICAxNTQwNywgIDkyMzAsIDIyNjQ5LCAxNTkwNCwgIDk1ODUsIDIyNzIwLCAgNDQwMiwgMTA0MzcsIDEwNjUwLCAyMjc5MSwgCi0gICAgMTA3OTIsIDIyODYyLCAxMDkzNCwgMjI5MzMsICA0NDAyLCAxMTE0NywgMjMwMDQsIDExMzYwLCAxMTU3MywgMjMwNzUsIAotICAgIDExNzE1LCAyMzE0NiwgMTE4NTcsIDIzMjE3LCAgNDQwMiwgMTIwNzAsIDIzMjg4LCAyMzM1OSwgMjM0MzAsIDIzNTAxLCAKLSAgICAyMzU3MiwgMjM2NDMsIDIzNzE0LCAyMzc4NSwgMjM4NTYsIDIzOTI3LCAyMzk5OCwgMjQwNjksIDI0MTQwLCAyNDIxMSwgCi0gICAgMjQyODIsIDI0MzUzLCAyNDQyNCwgMjQ0OTUsIDI0NTY2LCAyNDYzNywgMjQ3MDgsIDI0Nzc5LCAyNDg1MCwgIDQ4MjgsIAotICAgIDI0OTIxLCAyNDk5MiwgMjUwNjMsIDI1MTM0LCAyNTIwNSwgIDQ0MDIsICA0NDAyLCAyNTI3NiwgMjUzNDcsIDI1NDE4LCAKLSAgICAyNTQ4OSwgMTcxMTEsIDE3MzI0LCAyNTU2MCwgMjU2MzEsIDE3ODkyLCAxODEwNSwgMjU3MDIsIDI1NzczLCAyNTg0NCwgCi0gICAgMjU5MTUsICA0NDAyLCAgNDQwMiwgIDQ0MDIsIDI1OTg2LCAyNjA1NywgMjYxMjgsIDI2MTk5LCAyNjI3MCwgMjYzNDEsIAotICAgIDI2NDEyLCAyNjQ4MywgIDcxMDAsIDI2NTU0LCAyNjYyNSwgMjY2OTYsIDI2NzY3LCAyNjgzOCwgMjY5MDksIDI2OTgwLCAKLSAgICAgNDQwMiwgMjcwNTEsIDI3MTIyLCAgOTIzMCwgIDk1ODUsIDEwNjUwLCAxMDc5MiwgMTE1NzMsIDExNzE1LCAyNzE5MywgCi0gICAgMjcyNjQsIDI3MzM1LCAyNzQwNiwgMjc0NzcsIDI3NTQ4LCAyNzYxOSwgMjc2OTAsICA0ODI4LCAyNzc2MSwgMjc4MzIsIAotICAgIDI3OTAzLCAyNzk3NCwgMjgwNDUsIDI4MTE2LCAyODE4NywgMjgyNTgsIDI4MzI5LCAyODQwMCwgMjg0NzEsIDI4NTQyLCAKLSAgICAyODYxMywgMjg2ODQsIDI4NzU1LCAyODgyNiwgMjg4OTcsIDI4OTY4LCAyOTAzOSwgMjkxMTAsIDI5MTgxLCAyOTI1MiwgCi0gICAgMjkzMjMsIDI5Mzk0LCAyOTQ2NSwgMjk1MzYsIDI5NjA3LCAyOTY3OCwgMjk3NDksIDI5ODIwLCAyOTg5MSwgMjk5NjIsIAotICAgIDMwMDMzLCAzMDEwNCwgMzAxNzUsIDMwMjQ2LCAgNDQwMiwgMzAzMTcsIDMwMzg4LCAzMDQ1OSwgMzA1MzAsICA3MTAwLCAKLSAgICAzMDYwMSwgMzA2NzIsIDMwNzQzLCAzMDgxNCwgMzA4ODUsIDMwOTU2LCAzMTAyNywgMzEwOTgsIDMxMTY5LCAzMTI0MCwgCi0gICAgMzEzMTEsIDMxMzgyLCAzMTQ1MywgMzE1MjQKLSAgfTsKLQotICAvKiogCi0gICAqIFRoZSBwYWNrZWQgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXlfcGFja2VkID0gCi0gICAgIlwxXDcxXDFcNzJcMTFcNzFcMVw3M1wxXDcxXDFcNzRcNFw3MVwxXDc1IisKLSAgICAiXDQyXDcxXDFcNzZcMjFcNzFcMVw3N1wxXDEwMFwxMDVcNzdcMVwxMDFcMVwxMDIiKwotICAgICJcMjFcMTAxXDFcMTAzXDJcMTAxXDFcMTA0XDYwXDEwMVwxXDEwNVwxXDEwNlwxMDVcMTA1IisKLSAgICAiXDFcMTAxXDFcMTAyXDVcMTAxXDFcMTA3XDE2XDEwMVwxXDEwNFw2MVwxMDFcMVwxMDIiKwotICAgICJcMlwxMDFcMVwxMTBcMVwxMTFcMlwxMDFcMlwxMTJcNVwxMDFcMVwxMTFcNlwxMDEiKwotICAgICJcMVwxMTFcMVwxMTNcMVwxMTRcNFwxMTJcMVwxMDFcMTBcMTEyXDFcMTE1XDJcMTEyIisKLSAgICAiXDFcMTAxXDExXDExMlwxXDExNVwxXDExMlwxXDEwMVw0XDExMlwxXDEwMVw0XDExMiIrCi0gICAgIlwxXDEwMVw0XDExMlwyXDEwMVwxXDExMlwxXDEwMVwxXDEwMlwyXDEwMVwxXDExMCIrCi0gICAgIlwxXDExNlwxMVwxMDFcMVwxMTZcNlwxMDFcMVwxMTZcNjBcMTAxXDFcMTE3XDFcMTIwIisKLSAgICAiXDJcMTE3XDFcMTIxXDIxXDExN1wxXDEwNFw2MFwxMTdcMVwxMDFcMVwxMDJcMlwxMDEiKwotICAgICJcMVwxMjJcMVwxMTFcMlwxMDFcMlwxMjNcNVwxMDFcMVwxMTFcNlwxMDFcMVwxMTEiKwotICAgICJcNlwxMjNcMVwxMDFcMTNcMTIzXDFcMTAxXDEzXDEyM1wxXDEwMVw0XDEyM1wxXDEwMSIrCi0gICAgIlw0XDEyM1wxXDEwMVw0XDEyM1wyXDEwMVwxXDEyM1wxXDEwMVwxXDEwMlwyXDEwMSIrCi0gICAgIlwxXDEyMlwxXDExMVwyXDEwMVwyXDEyM1w1XDEwMVwxXDExMVw2XDEwMVwxXDExMSIrCi0gICAgIlw2XDEyM1wxXDEwMVwxM1wxMjNcMVwxMjRcMTNcMTIzXDFcMTAxXDRcMTIzXDFcMTAxIisKLSAgICAiXDRcMTIzXDFcMTAxXDRcMTIzXDJcMTAxXDFcMTIzXDFcMTI1XDFcMTAyXDFcMTAxIisKLSAgICAiXDFcMTI2XDFcMTI3XDFcMTExXDRcMTI1XDFcMTMwXDFcMTI1XDFcMTMxXDJcMTI1IisKLSAgICAiXDFcMTExXDZcMTI1XDFcMTExXDYwXDEyNVwxXDEwMVwxXDEwMlwyXDEwMVwxXDEzMiIrCi0gICAgIlwyMVwxMDFcMVwxMDRcNjFcMTAxXDFcMTAyXDFcMTMzXDFcMTM0XDFcMTAxXDFcMTExIisKLSAgICAiXDJcMTAxXDJcMTM1XDVcMTAxXDFcMTExXDZcMTAxXDFcMTExXDZcMTM1XDFcMTAxIisKLSAgICAiXDEzXDEzNVwxXDEwMVwxM1wxMzVcMVwxMDFcNFwxMzVcMVwxMDFcNFwxMzVcMVwxMDEiKwotICAgICJcNFwxMzVcMlwxMDFcMVwxMzVcMVwxMDFcMVwxMDJcMVwxMzNcMVwxMzRcMVwxMDEiKwotICAgICJcMVwxMTFcMlwxMDFcMlwxMzVcNVwxMDFcMVwxMTFcNlwxMDFcMVwxMTFcNlwxMzUiKwotICAgICJcMVwxMDFcMTNcMTM1XDFcMTM2XDEzXDEzNVwxXDEwMVw0XDEzNVwxXDEwMVw0XDEzNSIrCi0gICAgIlwxXDEwMVw0XDEzNVwyXDEwMVwxXDEzNVwxXDEzN1wxXDEwMlwxXDEzM1wxXDE0MCIrCi0gICAgIlwxXDEzN1wxXDExMVw0XDEzN1wxXDE0MVwxXDEzN1wxXDE0MlwyXDEzN1wxXDExMSIrCi0gICAgIlw2XDEzN1wxXDExMVw2MFwxMzdcMVwxMDFcMVwxMDJcM1wxMDFcMVwxMTFcMTFcMTAxIisKLSAgICAiXDFcMTExXDZcMTAxXDFcMTExXDYwXDEwMVwxXDE0M1wxXDE0NFwyMFwxNDNcMVwxNDUiKwotICAgICJcNjRcMTQzXDFcMTAxXDFcMTQ2XDNcMTAxXDFcMTExXDJcMTAxXDJcMTQ3XDVcMTAxIisKLSAgICAiXDFcMTExXDJcMTAxXDFcMTUwXDNcMTAxXDFcMTExXDZcMTQ3XDFcMTAxXDEzXDE0NyIrCi0gICAgIlwxXDEwMVwxM1wxNDdcMVwxMDFcNFwxNDdcMVwxMDFcNFwxNDdcMVwxMDFcNFwxNDciKwotICAgICJcMlwxMDFcMVwxNDdcMVwxMDFcMVwxNDZcM1wxMDFcMVwxNTFcMTFcMTAxXDFcMTUxIisKLSAgICAiXDJcMTAxXDFcMTUwXDNcMTAxXDFcMTUxXDYxXDEwMVwxXDE0NlwzXDEwMVwxXDExMSIrCi0gICAgIlwyXDEwMVwyXDE1Mlw1XDEwMVwxXDExMVwyXDEwMVwxXDE1MFwzXDEwMVwxXDExMSIrCi0gICAgIlw2XDE1MlwxXDEwMVwxM1wxNTJcMVwxMDFcMTNcMTUyXDFcMTAxXDRcMTUyXDFcMTAxIisKLSAgICAiXDRcMTUyXDFcMTAxXDRcMTUyXDJcMTAxXDFcMTUyXDFcMTAxXDFcMTQ2XDNcMTAxIisKLSAgICAiXDFcMTExXDJcMTAxXDJcMTUyXDVcMTAxXDFcMTExXDJcMTAxXDFcMTUwXDNcMTAxIisKLSAgICAiXDFcMTExXDZcMTUyXDFcMTAxXDEzXDE1MlwxXDE1M1wxM1wxNTJcMVwxMDFcNFwxNTIiKwotICAgICJcMVwxMDFcNFwxNTJcMVwxMDFcNFwxNTJcMlwxMDFcMVwxNTJcMVwxNTRcMVwxNDYiKwotICAgICJcMVwxMDFcMVwxNTVcMVwxNTRcMVwxMTFcNFwxNTRcMVwxNTZcMVwxNTRcMVwxNTciKwotICAgICJcMlwxNTRcMVwxMTFcMlwxNTRcMVwxNjBcM1wxNTRcMVwxMTFcNjBcMTU0XDFcMTYxIisKLSAgICAiXDFcMTYyXDFcMTYzXDFcMTY0XDRcMTYxXDJcMTY1XDE1XDE2MVw2XDE2NlwxXDE2MSIrCi0gICAgIlwxM1wxNjZcMVwxNjFcMTNcMTY2XDFcMTYxXDRcMTY2XDFcMTYxXDRcMTY2XDFcMTYxIisKLSAgICAiXDFcMTY3XDNcMTY2XDJcMTYxXDFcMTY2XDFcMTAxXDFcMTcwXDFcMTYzXDFcMTY0IisKLSAgICAiXDFcMTAxXDFcMTExXDJcMTAxXDJcMTcxXDVcMTAxXDFcMTExXDZcMTAxXDFcMTExIisKLSAgICAiXDZcMTcxXDFcMTAxXDEzXDE3MVwxXDEwMVwxM1wxNzFcMVwxMDFcNFwxNzFcMVwxMDEiKwotICAgICJcNFwxNzFcMVwxMDFcNFwxNzFcMlwxMDFcMVwxNzFcMVwxMDFcMVwxNzBcMVwxNjMiKwotICAgICJcMVwxNjRcMVwxMDFcMVwxMTFcMlwxMDFcMlwxNzFcNVwxMDFcMVwxMTFcNlwxMDEiKwotICAgICJcMVwxMTFcNlwxNzFcMVwxMDFcMTNcMTcxXDFcMTcyXDEzXDE3MVwxXDEwMVw0XDE3MSIrCi0gICAgIlwxXDEwMVw0XDE3MVwxXDEwMVw0XDE3MVwyXDEwMVwxXDE3MVwxXDE3M1wxXDE3NCIrCi0gICAgIlwxXDE2M1wxXDE3NVwxXDE3M1wxXDExMVw0XDE3M1wxXDE3NlwxXDE3M1wxXDE3NyIrCi0gICAgIlwxXDIwMFwxXDE3M1wxXDExMVw2XDE3M1wxXDExMVwzNlwxNzNcMVwyMDFcMjFcMTczIisKLSAgICAiXDFcMTAxXDFcMjAyXDFcMjAzXDJcMTAxXDFcMTExXDExXDEwMVwxXDExMVw2XDEwMSIrCi0gICAgIlwxXDExMVwxMFwxMDFcMVwyMDRcMVwyMDVcMlwxMDFcMVwyMDZcMTFcMTAxXDFcMjA2IisKLSAgICAiXDFcMTAxXDFcMjA1XDFcMjA0XDI3XDEwMVwxXDEwMlwxXDIwM1wyXDEwMVwxXDExMSIrCi0gICAgIlwxMVwxMDFcMVwxMTFcNlwxMDFcMVwxMTFcNlwxMDFcMVwyMDdcNTJcMTAxXDFcMTAyIisKLSAgICAiXDFcMjAzXDJcMTAxXDFcMTExXDJcMTAxXDJcMjEwXDVcMTAxXDFcMTExXDZcMTAxIisKLSAgICAiXDFcMTExXDZcMjEwXDFcMjA3XDEzXDIxMFwxXDEwMVwxM1wyMTBcMVwxMDFcNFwyMTAiKwotICAgICJcMVwxMDFcNFwyMTBcMVwxMDFcNFwyMTBcMlwxMDFcMVwyMTBcMVwxMDFcMVwxMDIiKwotICAgICJcMVwyMDNcMlwxMDFcMVwxMTFcMTFcMTAxXDFcMTExXDZcMTAxXDFcMTExXDZcMTAxIisKLSAgICAiXDFcMjA3XDdcMTAxXDFcMjExXDZcMTAxXDFcMjEyXDExXDEwMVwxXDIxMVwxMlwxMDEiKwotICAgICJcMVwyMTJcNVwxMDFcMVwyMTNcMVwxMDJcMVwyMDNcMVwyMTRcMVwyMTNcMVwxMTEiKwotICAgICJcNFwyMTNcMVwyMTVcMVwyMTNcMVwyMTZcMlwyMTNcMVwxMTFcNlwyMTNcMVwxMTEiKwotICAgICJcNlwyMTNcMVwyMTdcNTFcMjEzXDFcMjIwXDFcMTAyXDFcMjAzXDFcMjIxXDFcMjIwIisKLSAgICAiXDFcMTExXDRcMjIwXDFcMjIyXDFcMjIwXDFcMjIzXDJcMjIwXDFcMTExXDZcMjIwIisKLSAgICAiXDFcMTExXDZcMjIwXDFcMjI0XDUxXDIyMFwxXDIyNVwxXDEwMlwxXDIwM1wxXDIyNiIrCi0gICAgIlwxXDIyNVwxXDExMVw0XDIyNVwxXDIyN1wxXDIyNVwxXDIzMFwyXDIyNVwxXDExMSIrCi0gICAgIlw2XDIyNVwxXDExMVw2MFwyMjVcMVwyMzFcMVwyMzJcMVwyMzNcMTA0XDIzMVwxXDIzNCIrCi0gICAgIlwxXDEwMlwxXDIwM1wxXDIzNVwxXDIzNFwxXDExMVw0XDIzNFwxXDIzNlwxXDIzNCIrCi0gICAgIlwxXDIzN1wyXDIzNFwxXDExMVw2XDIzNFwxXDExMVw2MFwyMzRcMVwyNDBcMVwyNDEiKwotICAgICJcMVwyNDJcMTA0XDI0MFwxXDI0M1wxXDI0NFwxMDVcMjQzXDFcMTAxXDFcMTAyXDI0XDEwMSIrCi0gICAgIlwxXDEwNFw2MFwxMDFcMVwyNDVcMVwyNDZcMTA1XDI0NVwxXDEwMVwxXDEwMlw1XDEwMSIrCi0gICAgIlwxXDI0N1wxNlwxMDFcMVwxMDRcNjBcMTAxXDFcMjUwXDFcMjUxXDNcMjUwXDFcMjUyIisKLSAgICAiXDZcMjUwXDFcMjUzXDFcMjU0XDFcMjUwXDFcMjUyXDZcMjUwXDFcMjUyXDM2XDI1MCIrCi0gICAgIlwxXDI1NVwyMVwyNTBcMVwyNTZcMVwyNTFcM1wyNTZcMVwyNTdcNFwyNTZcMVwyNjAiKwotICAgICJcMlwyNTZcMVwyNjFcMVwyNTZcMVwyNTdcNlwyNTZcMVwyNTdcMzZcMjU2XDFcMjYyIisKLSAgICAiXDIxXDI1NlwxXDI2M1wxXDI2NFwxMFwyNjNcMVwyNjVcMVwyNjNcMVwyNjZcMVwyNjciKwotICAgICJcNjdcMjYzXDFcMjcwXDFcMjYzXDFcMjcxXDFcMjcyXDEyXDI3MVwxXDEwMVwxMVwyNzEiKwotICAgICJcMVwyNzNcNjBcMjcxXDFcMjc0XDFcMjc1XDEwXDI3NFwxXDEwMVwxM1wyNzRcMVwyNzYiKwotICAgICJcNjBcMjc0XDFcMTAxXDFcMTAyXDEyXDEwMVwxXDI3N1wxMVwxMDFcMVwxMDRcNjFcMTAxIisKLSAgICAiXDFcMTAyXDEwXDEwMVwxXDMwMFwxM1wxMDFcMVwxMDRcNjBcMTAxXDFcMzAxXDFcMzAyIisKLSAgICAiXDEwXDMwMVwxXDI2MFw3MVwzMDFcMVwzMDNcMVwzMDRcMVwzMDFcMVwzMDVcMVwzMDYiKwotICAgICJcMTJcMzA1XDFcMjUzXDY3XDMwNVwxXDMwN1wxXDMwNFwxXDMwNVwxXDMxMFwxXDMxMSIrCi0gICAgIlwxMFwzMTBcMVwzMTJcMVwzMTBcMVwzMTNcNTBcMzEwXDFcMzE0XDE3XDMxMFwxXDMxNSIrCi0gICAgIlwxXDMxMFwxXDMxNlwxXDMxN1wxMlwzMTZcMVwxMDFcMTFcMzE2XDFcMzIwXDYwXDMxNiIrCi0gICAgIlwxXDMyMVwxXDMyMlwxMFwzMjFcMVwxMDFcMTNcMzIxXDFcMzIzXDYwXDMyMVwxXDEwMSIrCi0gICAgIlwxXDEwMlwxMlwxMDFcMVwzMjRcMTFcMTAxXDFcMTA0XDYxXDEwMVwxXDEwMlwxMFwxMDEiKwotICAgICJcMVwzMjVcMTNcMTAxXDFcMTA0XDYwXDEwMVwxXDMyNlwxXDMyN1wxMFwzMjZcMVwyNjAiKwotICAgICJcNzFcMzI2XDFcMzMwXDFcMzMxXDFcMzI2XDFcMzMyXDFcMzMzXDEyXDMzMlwxXDI1MyIrCi0gICAgIlw2N1wzMzJcMVwzMzRcMVwzMzFcMVwzMzJcMVw3MVwxXDBcMTFcNzFcMVwwIisKLSAgICAiXDFcNzFcMVwwXDRcNzFcMVwwXDQyXDcxXDFcMFwyMVw3MVwzXDAiKwotICAgICJcMVwzMzVcMVwzMzZcMTVcMFwxXDMzN1wyXDBcMVwzNDBcNjZcMFwxXDM0MSIrCi0gICAgIlwyXDBcMlwzNDJcNVwwXDFcMzQxXDZcMFwxXDM0MVw2XDM0MlwxXDAiKwotICAgICJcMTNcMzQyXDFcMFwxM1wzNDJcMVwzNDNcNFwzNDJcMVwwXDRcMzQyXDFcMCIrCi0gICAgIlw0XDM0MlwyXDBcMVwzNDJcMVwzNDRcMVwwXDExXDM0NFwxXDBcMVwzNDQiKwotICAgICJcMVwzNDVcMVwzNDZcM1wzNDRcMVwwXDY0XDM0NFw1XDBcMVwzNDFcMlwwIisKLSAgICAiXDJcMzQ3XDVcMFwxXDM0MVw2XDBcMVwzNDFcNlwzNDdcMVwwXDEzXDM0NyIrCi0gICAgIlwxXDBcMTNcMzQ3XDFcMFw0XDM0N1wxXDBcNFwzNDdcMVwwXDRcMzQ3IisKLSAgICAiXDJcMFwxXDM0N1wxXDM0NFwxXDBcMTFcMzQ0XDFcMFwyXDM0NFwxXDM1MCIrCi0gICAgIlwzXDM0NFwxXDBcNDJcMzQ0XDFcMzUxXDIxXDM0NFwxMzFcMFwxXDMzN1wyXDAiKwotICAgICJcMVwzNTJcMTA0XDBcMVwzNTNcNzJcMFwxXDM1NFwxMDFcMFwxXDM1NVwxMTFcMCIrCi0gICAgIlwxXDExMVwxMVwwXDFcMTExXDZcMFwxXDExMVw2NlwwXDRcMTEyXDZcMCIrCi0gICAgIlwxXDExMlw2XDBcNlwxMTJcMVwwXDEzXDExMlwxXDBcMTNcMTEyXDFcMCIrCi0gICAgIlw0XDExMlwxXDBcMTFcMTEyXDJcMFwxXDExMlw2XDBcNFwxMTJcNlwwIisKLSAgICAiXDFcMTEyXDZcMFwyXDExMlwyXDM1NlwyXDExMlwxXDBcMTNcMTEyXDFcMCIrCi0gICAgIlwxM1wxMTJcMVwwXDRcMTEyXDFcMFwxMVwxMTJcMlwwXDFcMTEyXDZcMCIrCi0gICAgIlw0XDExMlw2XDBcMVwxMTJcNlwwXDJcMTEyXDFcMzU2XDFcMzU3XDJcMTEyIisKLSAgICAiXDFcMFwxM1wxMTJcMVwwXDEzXDExMlwxXDBcNFwxMTJcMVwwXDExXDExMiIrCi0gICAgIlwyXDBcMVwxMTJcNlwwXDRcMTEyXDZcMFwxXDExMlw2XDBcMlwxMTIiKwotICAgICJcMlwzNjBcMlwxMTJcMVwwXDEzXDExMlwxXDBcMTNcMTEyXDFcMFw0XDExMiIrCi0gICAgIlwxXDBcMTFcMTEyXDJcMFwxXDExMlw1XDBcMVwxMTZcMTFcMFwxXDExNiIrCi0gICAgIlw2XDBcMVwxMTZcNjJcMFwxXDM2MVwxMDZcMFwxXDM2MlwxMTJcMFw0XDEyMyIrCi0gICAgIlw2XDBcMVwxMjNcNlwwXDZcMTIzXDFcMFwxM1wxMjNcMVwwXDEzXDEyMyIrCi0gICAgIlwxXDBcNFwxMjNcMVwwXDExXDEyM1wyXDBcMVwxMjNcMVwxMjVcMlwwIisKLSAgICAiXDFcMzYzXDFcMTI1XDFcMFw0XDEyNVwxXDBcMVwxMjVcMVwwXDJcMTI1IisKLSAgICAiXDFcMFw2XDEyNVwxXDBcNjFcMTI1XDFcMFwxXDM2MlwxXDM2M1wxXDEyNSIrCi0gICAgIlwxXDBcNFwxMjVcMVwwXDFcMTI1XDFcMFwyXDEyNVwxXDBcNlwxMjUiKwotICAgICJcMVwwXDYwXDEyNVwxXDM2NFwxXDBcMTBcMzY0XDFcMzY1XDJcMzY0XDFcMzY2IisKLSAgICAiXDQ3XDM2NFwxXDM2NlwyMVwzNjRcMVwzNjdcMVwwXDEyXDM2N1wxXDM2NVwxXDM3MCIrCi0gICAgIlw0N1wzNjdcMVwzNzBcMjFcMzY3XDJcMFwxXDEzM1wxXDM3MVwxMTFcMFw0XDEzNSIrCi0gICAgIlw2XDBcMVwxMzVcNlwwXDZcMTM1XDFcMFwxM1wxMzVcMVwwXDEzXDEzNSIrCi0gICAgIlwxXDBcNFwxMzVcMVwwXDExXDEzNVwyXDBcMVwxMzVcMVwxMzdcMlwwIisKLSAgICAiXDFcMzcyXDFcMTM3XDFcMFw0XDEzN1wxXDBcMVwxMzdcMVwwXDJcMTM3IisKLSAgICAiXDFcMFw2XDEzN1wxXDBcNjFcMTM3XDFcMFwxXDEzM1wxXDM3M1wxXDEzNyIrCi0gICAgIlwxXDBcNFwxMzdcMVwwXDFcMTM3XDFcMFwyXDEzN1wxXDBcNlwxMzciKwotICAgICJcMVwwXDYwXDEzN1wxXDE0MVwxXDBcMVwzNzRcMVwzNzVcMVwxNDFcMVwzNzQiKwotICAgICJcNFwxNDFcMVwzNzZcMVwxNDFcMVwzNzRcMVwzNzdcMVwxNDFcMVwzNzRcNlwxNDEiKwotICAgICJcMVwzNzRcMzZcMTQxXDFcMzc3XDIxXDE0MVwxXDE0MlwxXDBcMVx1MDEwMFwxXHUwMTAxIisKLSAgICAiXDFcMTQyXDFcdTAxMDBcNFwxNDJcMVx1MDEwMFwxXDE0MlwxXDM3NlwxXHUwMTAyXDFcMTQyIisKLSAgICAiXDFcdTAxMDBcNlwxNDJcMVx1MDEwMFwzNlwxNDJcMVx1MDEwMlwyMVwxNDJcMlwwXDFcdTAxMDMiKwotICAgICJcMTI2XDBcMVwzMzdcMlwwXDFcdTAxMDRcNjdcMFw0XDE0N1w2XDBcMVwxNDciKwotICAgICJcNlwwXDZcMTQ3XDFcMFwxM1wxNDdcMVwwXDEzXDE0N1wxXDBcNFwxNDciKwotICAgICJcMVwwXDExXDE0N1wyXDBcMVwxNDdcMlwwXDFcdTAxMDVcMTExXDBcMVwxNTEiKwotICAgICJcMTFcMFwxXDE1MVw2XDBcMVwxNTFcNjZcMFw0XDE1Mlw2XDBcMVwxNTIiKwotICAgICJcNlwwXDZcMTUyXDFcMFwxM1wxNTJcMVwwXDEzXDE1MlwxXDBcNFwxNTIiKwotICAgICJcMVwwXDExXDE1MlwyXDBcMVwxNTJcMVwxNTRcMlwwXDFcdTAxMDZcMVwxNTQiKwotICAgICJcMVwwXDRcMTU0XDFcMFwxXDE1NFwxXDBcMlwxNTRcMVwwXDZcMTU0IisKLSAgICAiXDFcMFw2MFwxNTRcMVx1MDEwN1wxXDBcMTBcdTAxMDdcMVx1MDEwOFwyXHUwMTA3XDFcdTAxMDkiKwotICAgICJcNDdcdTAxMDdcMVx1MDEwOVwyMVx1MDEwN1wxXHUwMTBhXDFcMFwxMlx1MDEwYVwxXHUwMTA4XDFcdTAxMGIiKwotICAgICJcNDdcdTAxMGFcMVx1MDEwYlwyMVx1MDEwYVwxXDE1NFwxXDBcMVx1MDEwNVwxXHUwMTA2XDFcMTU0IisKLSAgICAiXDFcMFw0XDE1NFwxXDBcMVwxNTRcMVwwXDJcMTU0XDFcMFw2XDE1NCIrCi0gICAgIlwxXDBcNjBcMTU0XDFcMTYxXDNcMFwyM1wxNjFcNlwwXDFcMTYxXDEzXDAiKwotICAgICJcMVwxNjFcMTNcMFwxXDE2MVw0XDBcMVwxNjFcNFwwXDFcMTYxXDRcMCIrCi0gICAgIlwyXDE2MVw0XDBcMVwzMzVcMTZcMFwxXDMzN1wyXDBcMVwzNDBcNjNcMCIrCi0gICAgIlwxXHUwMTBjXDEwNFwwXDFcMTYxXDNcMFwyXDE2MVw0XDE2NVw2XDE2MVwxXDE2NSIrCi0gICAgIlw2XDE2MVw2XDE2NlwxXDE2MVwxM1wxNjZcMVwxNjFcMTNcMTY2XDFcMTYxXDRcMTY2IisKLSAgICAiXDFcMTYxXDRcMTY2XDFcMTY1XDRcMTY2XDJcMTYxXDFcMTY2XDZcMFw0XDE2NiIrCi0gICAgIlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMFwxM1wxNjZcMVwwXDEzXDE2NiIrCi0gICAgIlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTY2IisKLSAgICAiXDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwXDdcMTY2XDFcdTAxMGRcM1wxNjYiKwotICAgICJcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjYiKwotICAgICJcM1wwXDFcMzM1XDRcMFwyXHUwMTBlXDEwXDBcMVwzMzdcMlwwXDFcMzQwIisKLSAgICAiXDFcMFw2XHUwMTBlXDFcMFwxM1x1MDEwZVwxXDBcMTNcdTAxMGVcMVwwXDRcdTAxMGUiKwotICAgICJcMVwwXDRcdTAxMGVcMVwwXDRcdTAxMGVcMlwwXDFcdTAxMGVcNlwwXDRcMTcxIisKLSAgICAiXDZcMFwxXDE3MVw2XDBcNlwxNzFcMVwwXDEzXDE3MVwxXDBcMTNcMTcxIisKLSAgICAiXDFcMFw0XDE3MVwxXDBcMTFcMTcxXDJcMFwxXDE3MVwxXDE3M1wyXDAiKwotICAgICJcMVx1MDEwZlwxXDE3M1wxXDBcNFwxNzNcMVwwXDFcMTczXDFcMFwyXDE3MyIrCi0gICAgIlwxXDBcNlwxNzNcMVwwXDYwXDE3M1wzXDBcMVwzMzVcNFwwXDJcdTAxMTAiKwotICAgICJcMTBcMFwxXDMzN1wyXDBcMVwzNDBcMVwwXDZcdTAxMTBcMVwwXDEzXHUwMTEwIisKLSAgICAiXDFcMFwxM1x1MDExMFwxXDBcNFx1MDExMFwxXDBcNFx1MDExMFwxXDBcNFx1MDExMCIrCi0gICAgIlwyXDBcMVx1MDExMFwxXDE3M1wxXDBcMVx1MDEwY1wxXHUwMTBmXDFcMTczXDFcMCIrCi0gICAgIlw0XDE3M1wxXDBcMVwxNzNcMVwwXDJcMTczXDFcMFw2XDE3M1wxXDAiKwotICAgICJcNjBcMTczXDFcdTAxMTFcMVwwXDEwXHUwMTExXDFcdTAxMTJcMlx1MDExMVwxXHUwMTEzXDQ3XHUwMTExIisKLSAgICAiXDFcdTAxMTNcMjFcdTAxMTFcMVx1MDExNFwxXDBcMTJcdTAxMTRcMVx1MDExMlwxXHUwMTE1XDQ3XHUwMTE0IisKLSAgICAiXDFcdTAxMTVcMjFcdTAxMTRcMVwxNzNcMlwwXDFcdTAxMGZcMVwxNzNcMVwwXDRcMTczIisKLSAgICAiXDFcMFwxXDE3M1wxXDBcMVwxNzNcMVx1MDExNlwxXDBcNlwxNzNcMVwwIisKLSAgICAiXDYxXDE3M1wyXDBcMVx1MDEwZlwxXDE3M1wxXDBcNFwxNzNcMVwwXDFcMTczIisKLSAgICAiXDFcMFwxXDE3M1wxXHUwMTE3XDFcMFw2XDE3M1wxXDBcNjBcMTczXDNcMCIrCi0gICAgIlwxXDMzNVwxNlwwXDFcMzM3XDJcMFwxXHUwMTA0XDEzMFwwXDFcdTAxMThcMlwwIisKLSAgICAiXDFcdTAxMThcNzVcMFwxXHUwMTE5XDE0XDBcMVx1MDExOVw2M1wwXDJcdTAxMWFcNTJcMCIrCi0gICAgIlwyM1x1MDExYlwxXHUwMTFjXDYzXHUwMTFiXDZcMFw0XDIxMFw2XDBcMVwyMTBcNlwwIisKLSAgICAiXDZcMjEwXDFcMFwxM1wyMTBcMVwwXDEzXDIxMFwxXDBcNFwyMTBcMVwwIisKLSAgICAiXDExXDIxMFwyXDBcMVwyMTBcNTNcMFwxXHUwMTFkXDVcMFwxXHUwMTFkXDExNlwwIisKLSAgICAiXDFcdTAxMWVcMTBcMFwxXHUwMTFlXDRcMFwxXDIxM1wyXDBcMVx1MDExZlwxXDIxMyIrCi0gICAgIlwxXDBcNFwyMTNcMVwwXDFcMjEzXDFcMFwyXDIxM1wxXDBcNlwyMTMiKwotICAgICJcMVwwXDYwXDIxM1wxXHUwMTIwXDFcMFwxMFx1MDEyMFwxXHUwMTIxXDJcdTAxMjBcMVx1MDEyMiIrCi0gICAgIlw0N1x1MDEyMFwxXHUwMTIyXDIxXHUwMTIwXDFcdTAxMjNcMVwwXDFcdTAxMjNcMlx1MDEyNFwxXHUwMTIzIisKLSAgICAiXDRcdTAxMjRcMlx1MDEyM1wxXHUwMTI1XDFcdTAxMjZcMVx1MDEyM1w0XHUwMTI0XDFcdTAxMjNcMTFcdTAxMjQiKwotICAgICJcMVx1MDEyM1wyN1x1MDEyNFwxXHUwMTI2XDEwXHUwMTI0XDJcdTAxMjNcNFx1MDEyNFwyXHUwMTIzXDFcdTAxMjQiKwotICAgICJcMVwyMTdcMlx1MDExYlwxXHUwMTI3XDFcMjE3XDFcdTAxMWJcNFwyMTdcMVx1MDExYlwxXDIxNyIrCi0gICAgIlwxXHUwMTFiXDJcMjE3XDFcdTAxMWJcM1wyMTdcMVx1MDEyOFwyXDIxN1wxXHUwMTFiXDYwXDIxNyIrCi0gICAgIlwxXDIyMFwyXDBcMVx1MDEyOVwxXDIyMFwxXDBcNFwyMjBcMVwwXDFcMjIwIisKLSAgICAiXDFcMFwyXDIyMFwxXDBcNlwyMjBcMVwwXDYwXDIyMFwxMlx1MDEyYVwxXHUwMTJiIisKLSAgICAiXDc0XHUwMTJhXDE0XHUwMTJjXDFcdTAxMmJcNzJcdTAxMmNcMVwyMjRcMlx1MDExYlwxXHUwMTJkXDFcMjI0IisKLSAgICAiXDFcdTAxMWJcNFwyMjRcMVx1MDExYlwxXDIyNFwxXHUwMTFiXDJcMjI0XDFcdTAxMWJcM1wyMjQiKwotICAgICJcMVx1MDEyZVwyXDIyNFwxXHUwMTFiXDYwXDIyNFwxXDIyNVwyXDBcMVx1MDEyZlwxXDIyNSIrCi0gICAgIlwxXDBcNFwyMjVcMVwwXDFcMjI1XDFcMFwyXDIyNVwxXDBcNlwyMjUiKwotICAgICJcMVwwXDYwXDIyNVwxXHUwMTMwXDFcMFwxMFx1MDEzMFwxXHUwMTMxXDJcdTAxMzBcMVx1MDEzMiIrCi0gICAgIlw0N1x1MDEzMFwxXHUwMTMyXDIxXHUwMTMwXDFcdTAxMzNcMVwwXDFcdTAxMzNcMlx1MDEzNFwxXHUwMTMzIisKLSAgICAiXDRcdTAxMzRcMlx1MDEzM1wxXHUwMTM1XDFcdTAxMzZcMVx1MDEzM1w0XHUwMTM0XDFcdTAxMzNcMTFcdTAxMzQiKwotICAgICJcMVx1MDEzM1wyN1x1MDEzNFwxXHUwMTM2XDEwXHUwMTM0XDJcdTAxMzNcNFx1MDEzNFwyXHUwMTMzXDFcdTAxMzQiKwotICAgICJcMlwyMzFcMVwwXDEwNlwyMzFcMVwwXDE3XDIzMVwxXHUwMTM3XDJcMjMxXDFcdTAxMzgiKwotICAgICJcNjFcMjMxXDFcMjM0XDJcMFwxXHUwMTM5XDFcMjM0XDFcMFw0XDIzNFwxXDAiKwotICAgICJcMVwyMzRcMVwwXDJcMjM0XDFcMFw2XDIzNFwxXDBcNjBcMjM0XDFcdTAxM2EiKwotICAgICJcMVwwXDEwXHUwMTNhXDFcdTAxM2JcMlx1MDEzYVwxXHUwMTNjXDQ3XHUwMTNhXDFcdTAxM2NcMjFcdTAxM2EiKwotICAgICJcMVx1MDEzZFwxXDBcMVx1MDEzZFwyXHUwMTNlXDFcdTAxM2RcNFx1MDEzZVwyXHUwMTNkXDFcdTAxM2YiKwotICAgICJcMVx1MDE0MFwxXHUwMTNkXDRcdTAxM2VcMVx1MDEzZFwxMVx1MDEzZVwxXHUwMTNkXDI3XHUwMTNlXDFcdTAxNDAiKwotICAgICJcMTBcdTAxM2VcMlx1MDEzZFw0XHUwMTNlXDJcdTAxM2RcMVx1MDEzZVwyXDI0MFwxXDBcMTA2XDI0MCIrCi0gICAgIlwxXDBcMTdcMjQwXDFcdTAxNDFcMlwyNDBcMVx1MDE0Mlw2MVwyNDBcN1wwXDFcdTAxNDMiKwotICAgICJcNzdcMFwxXDI1MFwxXDBcMTJcMjUwXDFcMFwxXHUwMTQ0XDQ3XDI1MFwxXHUwMTQ0IisKLSAgICAiXDIxXDI1MFwzXDBcMVx1MDE0NVwxNlwwXDFcMzM3XDJcMFwxXDM1Mlw2MVwwIisKLSAgICAiXDFcMjUwXDFcMFwzXDI1MFwxXDI1Mlw2XDI1MFwxXDBcMVx1MDE0NFwxXDI1MCIrCi0gICAgIlwxXDI1Mlw2XDI1MFwxXDI1MlwzNlwyNTBcMVx1MDE0NFwzN1wyNTBcMVx1MDE0NlwxMDZcMjUwIisKLSAgICAiXDFcdTAxNDdcNzBcMjUwXDFcMjU2XDFcMFwxMFwyNTZcMVwwXDJcMjU2XDFcdTAxNDgiKwotICAgICJcNDdcMjU2XDFcdTAxNDhcMjJcMjU2XDFcMFwzXDI1NlwxXDI1N1w0XDI1NlwxXDAiKwotICAgICJcMlwyNTZcMVx1MDE0OFwxXDI1NlwxXDI1N1w2XDI1NlwxXDI1N1wzNlwyNTZcMVx1MDE0OCIrCi0gICAgIlwzN1wyNTZcMVx1MDE0OVwxMDZcMjU2XDFcdTAxNGFcNzBcMjU2XDEyXDI2M1wxXDBcMVwyNjMiKwotICAgICJcMVwwXDFcdTAxNGJcNjdcMjYzXDFcMFwxM1wyNjNcMVwwXDFcMjYzXDFcMCIrCi0gICAgIlwxXHUwMTRiXDRcMjYzXDFcdTAxNGNcNjJcMjYzXDFcMFwxM1wyNjNcMVwwXDFcMjYzIisKLSAgICAiXDFcMFwxXDI2M1wxXHUwMTRkXDY2XDI2M1wxXHUwMTRlXDFcMjYzXDE0XHUwMTRmXDFcdTAxNTAiKwotICAgICJcMTA2XHUwMTRmXDFcdTAxNTBcNVx1MDE0ZlwxXHUwMTUxXDJcdTAxNGZcMVx1MDE1Mlw2MVx1MDE0ZlwxMlx1MDE1MyIrCi0gICAgIlwxXHUwMTU0XDEwNlx1MDE1M1wxXHUwMTU0XDdcdTAxNTNcMVx1MDE1NVwyXHUwMTUzXDFcdTAxNTZcNjFcdTAxNTMiKwotICAgICJcMTJcMzAxXDFcMFw3MVwzMDFcMVx1MDE1N1wxXDBcMTNcMzAxXDFcMFw3XDMwMSIrCi0gICAgIlwxXHUwMTU4XDYxXDMwMVwxXHUwMTU3XDFcMFwxM1wzMDFcMVx1MDE1OVw3NFwzMDFcMTRcMzA1IisKLSAgICAiXDFcMFw2N1wzMDVcMVx1MDE1YVwxXDBcMTVcMzA1XDFcMFw1XDMwNVwxXHUwMTViIisKLSAgICAiXDYxXDMwNVwxXHUwMTVhXDFcMFwxNVwzMDVcMVx1MDE1Y1w3MlwzMDVcMTJcMzEwXDFcMCIrCi0gICAgIlwxXDMxMFwxXDBcNzBcMzEwXDFcMFwxM1wzMTBcMVwwXDFcMzEwXDFcMCIrCi0gICAgIlw1XDMxMFwxXHUwMTVkXDYyXDMxMFwxXDBcMTNcMzEwXDFcMFwxXDMxMFwxXDAiKwotICAgICJcMVwzMTBcMVx1MDE1ZVw2NlwzMTBcMVwwXDFcMzEwXDE0XHUwMTVmXDFcdTAxNjBcMTA2XHUwMTVmIisKLSAgICAiXDFcdTAxNjBcNVx1MDE1ZlwxXHUwMTYxXDJcdTAxNWZcMVx1MDE2Mlw2MVx1MDE1ZlwxMlx1MDE2M1wxXHUwMTY0IisKLSAgICAiXDEwNlx1MDE2M1wxXHUwMTY0XDdcdTAxNjNcMVx1MDE2NVwyXHUwMTYzXDFcdTAxNjZcNjFcdTAxNjNcMTJcMzI2IisKLSAgICAiXDFcMFw3MVwzMjZcMVx1MDE2N1wxXDBcMTNcMzI2XDFcMFw3XDMyNlwxXHUwMTY4IisKLSAgICAiXDYxXDMyNlwxXHUwMTY3XDFcMFwxM1wzMjZcMVx1MDE2OVw3NFwzMjZcMTRcMzMyXDFcMCIrCi0gICAgIlw2N1wzMzJcMVx1MDE2YVwxXDBcMTVcMzMyXDFcMFw1XDMzMlwxXHUwMTZiXDYxXDMzMiIrCi0gICAgIlwxXHUwMTZhXDFcMFwxNVwzMzJcMVx1MDE2Y1w3MlwzMzJcN1wwXDFcdTAxNmRcMTFcMCIrCi0gICAgIlwxXHUwMTZlXDNcMFwxXHUwMTZmXDIzXDBcMVx1MDE3MFw0NFwwXDFcdTAxNzFcMjVcMCIrCi0gICAgIlwxXHUwMTcyXDU2XDBcMVwzNDFcMlwwXDJcdTAxNzNcNVwwXDFcMzQxXDZcMCIrCi0gICAgIlwxXDM0MVw2XHUwMTczXDFcMFwxM1x1MDE3M1wxXDBcMTNcdTAxNzNcMVwwXDRcdTAxNzMiKwotICAgICJcMVwwXDRcdTAxNzNcMVwwXDRcdTAxNzNcMlwwXDFcdTAxNzNcMVx1MDE3NFwxXDAiKwotICAgICJcM1x1MDE3NFwxXHUwMTc1XDRcMzQyXDFcdTAxNzRcMVwwXDNcdTAxNzRcMVx1MDE3NVwxXDM0MiIrCi0gICAgIlwxXHUwMTc0XDFcMFwzXHUwMTc0XDFcdTAxNzVcNlwzNDJcMVx1MDE3NFwxM1wzNDJcMVx1MDE3NCIrCi0gICAgIlwxM1wzNDJcMVx1MDE3NFw0XDM0MlwxXHUwMTc2XDExXDM0MlwyXHUwMTc0XDFcMzQyXDIwXDAiKwotICAgICJcMVx1MDE3N1w3XDBcMVx1MDE3OFw3M1wwXDFcMzQ1XDcxXDBcMTA1XDM0NlwxXHUwMTc5IisKLSAgICAiXDFcMzQ2XDFcdTAxNzRcMVwwXDNcdTAxNzRcMVx1MDE3NVw0XDM0N1wxXHUwMTc0XDFcMCIrCi0gICAgIlwzXHUwMTc0XDFcdTAxNzVcMVwzNDdcMVx1MDE3NFwxXDBcM1x1MDE3NFwxXHUwMTc1XDZcMzQ3IisKLSAgICAiXDFcdTAxNzRcMTNcMzQ3XDFcdTAxNzRcMTNcMzQ3XDFcdTAxNzRcNFwzNDdcMVx1MDE3YVwxMVwzNDciKwotICAgICJcMlx1MDE3NFwxXDM0N1wxMDVcMzUwXDFcdTAxN2JcMVwzNTBcNjVcMFwxXDM1MVw1NlwwIisKLSAgICAiXDFcdTAxNzJcNTNcMFwxXHUwMTdjXDEwNlwwXDFcdTAxN2RcMTEyXDBcNFwxMTJcNlwwIisKLSAgICAiXDFcMTEyXDZcMFw0XDExMlwyXHUwMTdlXDFcMFwxM1wxMTJcMVwwXDEzXDExMiIrCi0gICAgIlwxXDBcNFwxMTJcMVwwXDExXDExMlwyXDBcMVwxMTJcNlwwXDRcMTEyIisKLSAgICAiXDZcMFwxXDExMlw2XDBcNFwxMTJcMVx1MDE3ZVwxXHUwMTdmXDFcMFwxM1wxMTIiKwotICAgICJcMVwwXDEzXDExMlwxXDBcNFwxMTJcMVwwXDExXDExMlwyXDBcMVwxMTIiKwotICAgICJcNlwwXDRcMTEyXDZcMFwxXDExMlw2XDBcNlwxMTJcMVwwXDEzXDExMiIrCi0gICAgIlwxXDBcMlwxMTJcMVx1MDE4MFwxMFwxMTJcMVwwXDRcMTEyXDFcMFw2XDExMiIrCi0gICAgIlwxXHUwMTgwXDJcMTEyXDJcMFwxXDExMlwxMlwzNjRcMVwzNjVcM1wzNjRcMVwwIisKLSAgICAiXDcwXDM2NFwxNFwzNjdcMVwzNjVcMVwzNjdcMVwwXDcwXDM2N1wxXDM3NFwxXDAiKwotICAgICJcMTBcMzc0XDFcMzc2XDJcMzc0XDFcdTAxODFcNDdcMzc0XDFcdTAxODFcMjFcMzc0XDFcMTQxIisKLSAgICAiXDJcMzc0XDFcMzc1XDFcMTQxXDFcMzc0XDRcMTQxXDFcMzc2XDFcMTQxXDFcMzc0IisKLSAgICAiXDFcMTQxXDFcMTM3XDFcMzc0XDZcMTQxXDFcMzc0XDYwXDE0MVwxXHUwMTAwXDFcMCIrCi0gICAgIlwxMlx1MDEwMFwxXDM3NlwxXHUwMTgyXDQ3XHUwMTAwXDFcdTAxODJcMjFcdTAxMDBcMVwxNDJcMlx1MDEwMCIrCi0gICAgIlwxXHUwMTAxXDFcMTQyXDFcdTAxMDBcNFwxNDJcMVx1MDEwMFwxXDE0MlwxXDM3NlwxXDE0MiIrCi0gICAgIlwxXDEzN1wxXHUwMTAwXDZcMTQyXDFcdTAxMDBcNjBcMTQyXDEyXHUwMTA3XDFcdTAxMDhcM1x1MDEwNyIrCi0gICAgIlwxXDBcNzBcdTAxMDdcMTRcdTAxMGFcMVx1MDEwOFwxXHUwMTBhXDFcMFw3MFx1MDEwYVw2XDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlwxM1wxNjZcMVwwXDRcMTY2XDFcMFw2XDE2NlwxXHUwMTgzXDJcMTY2XDJcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNFx1MDEwZVw2XDBcMVx1MDEwZVw2XDBcNlx1MDEwZVwxXDAiKwotICAgICJcMTNcdTAxMGVcMVwwXDEzXHUwMTBlXDFcMFw0XHUwMTBlXDFcMFwxMVx1MDEwZVwyXDAiKwotICAgICJcMVx1MDEwZVw2XDBcNFx1MDExMFw2XDBcMVx1MDExMFw2XDBcNlx1MDExMFwxXDAiKwotICAgICJcMTNcdTAxMTBcMVwwXDEzXHUwMTEwXDFcMFw0XHUwMTEwXDFcMFwxMVx1MDExMFwyXDAiKwotICAgICJcMVx1MDExMFwxMlx1MDExMVwxXHUwMTEyXDNcdTAxMTFcMVwwXDcwXHUwMTExXDE0XHUwMTE0XDFcdTAxMTIiKwotICAgICJcMVx1MDExNFwxXDBcNzBcdTAxMTRcMVx1MDE4NFwyXHUwMTg1XDFcdTAxODZcMVx1MDE4NFwxXHUwMTg1IisKLSAgICAiXDRcdTAxODRcMVx1MDE4NVwxXHUwMTg0XDFcdTAxODVcMlx1MDE4NFwxXHUwMTg1XDZcdTAxODRcMVx1MDE4NSIrCi0gICAgIlw1Nlx1MDE4NFwxXDE3M1wxXHUwMTg0XDFcdTAxODdcMlx1MDE4OFwxXHUwMTg5XDFcdTAxODdcMVx1MDE4OCIrCi0gICAgIlw0XHUwMTg3XDFcdTAxODhcMVx1MDE4N1wxXHUwMTg4XDJcdTAxODdcMVx1MDE4OFw2XHUwMTg3XDFcdTAxODgiKwotICAgICJcNTZcdTAxODdcMVwxNzNcMVx1MDE4N1wzNlwwXDFcdTAxOGFcMzVcMFwxXHUwMThhXDUzXDAiKwotICAgICJcMVx1MDE4YlwxNFwwXDFcdTAxOGJcNzNcMFwxXHUwMThjXDExXDBcMVx1MDE4Y1w3NlwwIisKLSAgICAiXDFcdTAxOGRcMjBcMFwxXHUwMThkXDExM1wwXDFcdTAxOGVcN1wwXDFcdTAxOGVcM1wwIisKLSAgICAiXDEyXHUwMTIwXDFcdTAxMjFcM1x1MDEyMFwxXDBcNzBcdTAxMjBcMVx1MDEyM1wxXDBcMTJcdTAxMjMiKwotICAgICJcMVx1MDEyMVwxXHUwMThmXDQ3XHUwMTIzXDFcdTAxOGZcMjJcdTAxMjNcMVwwXDEyXHUwMTIzXDFcdTAxOTAiKwotICAgICJcMVx1MDE4Zlw0N1x1MDEyM1wxXHUwMThmXDIxXHUwMTIzXDE0XDBcMVx1MDE5MVw3MlwwXDE0XHUwMTIzIisKLSAgICAiXDFcdTAxOTBcMVx1MDEyM1wxXDBcNzBcdTAxMjNcMTJcdTAxMzBcMVx1MDEzMVwzXHUwMTMwXDFcMCIrCi0gICAgIlw3MFx1MDEzMFwxXHUwMTMzXDFcMFwxMlx1MDEzM1wxXHUwMTMxXDFcdTAxOTJcNDdcdTAxMzNcMVx1MDE5MiIrCi0gICAgIlwyMlx1MDEzM1wxXDBcMTJcdTAxMzNcMVx1MDE5M1wxXHUwMTkyXDQ3XHUwMTMzXDFcdTAxOTJcMjFcdTAxMzMiKwotICAgICJcMTRcMFwxXHUwMTk0XDcyXDBcMTRcdTAxMzNcMVx1MDE5M1wxXHUwMTMzXDFcMFw3MFx1MDEzMyIrCi0gICAgIlwyXDIzMVwxXDBcNFwyMzFcMVx1MDE5NVwxMVwyMzFcMVx1MDE5NlwzXDIzMVwxXHUwMTk3IisKLSAgICAiXDIzXDIzMVwxXHUwMTk4XDM3XDIzMVwxXDBcMzJcMjMxXDFcdTAxOTlcNTFcMjMxXDEyXHUwMTNhIisKLSAgICAiXDFcdTAxM2JcM1x1MDEzYVwxXDBcNzBcdTAxM2FcMVx1MDEzZFwxXDBcMTJcdTAxM2RcMVx1MDEzYiIrCi0gICAgIlwxXHUwMTlhXDQ3XHUwMTNkXDFcdTAxOWFcMjJcdTAxM2RcMVwwXDEyXHUwMTNkXDFcdTAxOWJcMVx1MDE5YSIrCi0gICAgIlw0N1x1MDEzZFwxXHUwMTlhXDIxXHUwMTNkXDE0XDBcMVx1MDE5Y1w3MlwwXDE0XHUwMTNkXDFcdTAxOWIiKwotICAgICJcMVx1MDEzZFwxXDBcNzBcdTAxM2RcMlwyNDBcMVwwXDRcMjQwXDFcdTAxOWRcMTFcMjQwIisKLSAgICAiXDFcdTAxOWVcM1wyNDBcMVx1MDE5ZlwyM1wyNDBcMVx1MDFhMFwzN1wyNDBcMVwwXDMyXDI0MCIrCi0gICAgIlwxXHUwMWExXDUxXDI0MFwyMlwwXDFcdTAxYTJcNjRcMFwxNlwyNTBcMVwwXDcwXDI1MCIrCi0gICAgIlwxNlwyNTZcMVwwXDcwXDI1NlwxMlwyNjNcMVwwXDFcMjYzXDFcMFwxXDI2MyIrCi0gICAgIlwxXHUwMWEzXDY2XDI2M1wxXHUwMTRlXDEwXDI2M1wxXHUwMWE0XDJcMjYzXDFcMFwxXDI2MyIrCi0gICAgIlwxXDBcMVx1MDE0YlwzXDI2M1wxXHUwMWE1XDNcMjYzXDFcdTAxYTZcMjNcMjYzXDFcdTAxYTciKwotICAgICJcMzNcMjYzXDFcMFwxXDI2M1wxMlx1MDFhM1wxXDBcMVx1MDFhM1wxXDBcNzBcdTAxYTMiKwotICAgICJcMVwwXDFcdTAxYTNcMTJcdTAxNGVcMVwwXDFcdTAxNGVcMVwwXDFcdTAxYThcNjdcdTAxNGUiKwotICAgICJcMVwwXDFcdTAxNGVcN1x1MDE0ZlwxXHUwMWE5XDRcdTAxNGZcMVx1MDE1MFw0XHUwMTRmXDFcdTAxYWEiKwotICAgICJcM1x1MDE0ZlwxXHUwMWFiXDIzXHUwMTRmXDFcdTAxYWNcNTFcdTAxNGZcMVx1MDE1MFwyMFx1MDE0ZlwxXHUwMWFkIisKLSAgICAiXDUxXHUwMTRmXDdcdTAxNTNcMVx1MDFhZVwyXHUwMTUzXDFcdTAxNTRcNlx1MDE1M1wxXHUwMWFmXDNcdTAxNTMiKwotICAgICJcMVx1MDFiMFwyM1x1MDE1M1wxXHUwMWIxXDQ3XHUwMTUzXDFcdTAxNTRcMjJcdTAxNTNcMVx1MDFiMlw1MVx1MDE1MyIrCi0gICAgIlwxMlwzMDFcMVwwXDEwM1wzMDFcMVx1MDFiM1wyXDMwMVwxXDBcNlwzMDFcMVx1MDFiNCIrCi0gICAgIlwzXDMwMVwxXHUwMWI1XDIzXDMwMVwxXHUwMWI2XDMyXDMwMVwxXHUwMTU3XDFcMFwxXDMwMSIrCi0gICAgIlwxMDRcdTAxYjdcMVx1MDFiOFwyXHUwMWI3XDE0XDMwNVwxXDBcMTAxXDMwNVwxXHUwMWI5XDRcMzA1IisKLSAgICAiXDFcMFw0XDMwNVwxXHUwMWJhXDNcMzA1XDFcdTAxYmJcMjNcMzA1XDFcdTAxYmNcMzJcMzA1IisKLSAgICAiXDFcdTAxNWFcMVwwXDFcMzA1XDEwNFx1MDFiZFwxXHUwMWJlXDJcdTAxYmRcN1wzMTBcMVx1MDFiZiIrCi0gICAgIlwyXDMxMFwxXDBcMVwzMTBcMVwwXDRcMzEwXDFcdTAxYzBcM1wzMTBcMVx1MDFjMSIrCi0gICAgIlwyM1wzMTBcMVx1MDFjMlwzM1wzMTBcMVwwXDFcMzEwXDdcdTAxNWZcMVx1MDFjM1w0XHUwMTVmIisKLSAgICAiXDFcdTAxNjBcNFx1MDE1ZlwxXHUwMWM0XDNcdTAxNWZcMVx1MDFjNVwyM1x1MDE1ZlwxXHUwMWM2XDUxXHUwMTVmIisKLSAgICAiXDFcdTAxNjBcMjBcdTAxNWZcMVx1MDFjN1w1MVx1MDE1Zlw3XHUwMTYzXDFcdTAxYzhcMlx1MDE2M1wxXHUwMTY0IisKLSAgICAiXDZcdTAxNjNcMVx1MDFjOVwzXHUwMTYzXDFcdTAxY2FcMjNcdTAxNjNcMVx1MDFjYlw0N1x1MDE2M1wxXHUwMTY0IisKLSAgICAiXDIyXHUwMTYzXDFcdTAxY2NcNTFcdTAxNjNcMTJcMzI2XDFcMFwxMDNcMzI2XDFcdTAxY2RcMlwzMjYiKwotICAgICJcMVwwXDZcMzI2XDFcdTAxY2VcM1wzMjZcMVx1MDFjZlwyM1wzMjZcMVx1MDFkMFwzMlwzMjYiKwotICAgICJcMVx1MDE2N1wxXDBcMVwzMjZcMTA0XHUwMWQxXDFcdTAxZDJcMlx1MDFkMVwxNFwzMzJcMVwwIisKLSAgICAiXDEwMVwzMzJcMVx1MDFkM1w0XDMzMlwxXDBcNFwzMzJcMVx1MDFkNFwzXDMzMlwxXHUwMWQ1IisKLSAgICAiXDIzXDMzMlwxXHUwMWQ2XDMyXDMzMlwxXHUwMTZhXDFcMFwxXDMzMlwxMDRcdTAxZDdcMVx1MDFkOCIrCi0gICAgIlwyXHUwMWQ3XDdcMFwxXHUwMWQ5XDEwNlwwXDFcdTAxZGFcMTM1XDBcMVx1MDFkYlw1MFwwIisKLSAgICAiXDFcdTAxNzNcMVwwXDExXHUwMTczXDFcMFw2XHUwMTczXDFcMFw2NFx1MDE3M1wxXHUwMTc0IisKLSAgICAiXDFcMFwxMVx1MDE3NFwxXDBcNlx1MDE3NFwxXDBcNDdcdTAxNzRcMVwwXDE1XHUwMTc0IisKLSAgICAiXDFcMFwzXHUwMTc0XDFcdTAxNzVcNVx1MDE3NFwxXDBcM1x1MDE3NFwxXHUwMTc1XDJcdTAxNzQiKwotICAgICJcMVwwXDNcdTAxNzRcMVx1MDE3NVw0M1x1MDE3NFwxXHUwMWRjXDE0XHUwMTc0XDIwXDBcMVx1MDE3NyIrCi0gICAgIlw1MVwwXDFcdTAxZGRcMzRcMFwxXHUwMWRlXDE1XDBcM1x1MDFkZVwyXDBcMVx1MDFkZSIrCi0gICAgIlwxMVwwXDFcdTAxZGVcMVwwXDJcdTAxZGVcN1wwXDFcdTAxZGVcMlwwXDJcdTAxZGUiKwotICAgICJcNlwwXDFcdTAxZGVcMTFcMFwxXDExMlwxXHUwMWRmXDJcMTEyXDZcMFwxXDExMiIrCi0gICAgIlw2XDBcNlwxMTJcMVwwXDEzXDExMlwxXDBcMTNcMTEyXDFcMFw0XDExMiIrCi0gICAgIlwxXDBcMTFcMTEyXDJcMFwxXDExMlw2XDBcNFwxMTJcNlwwXDFcMTEyIisKLSAgICAiXDZcMFw2XDExMlwxXDBcMTFcMTEyXDFcdTAxZTBcMVwxMTJcMVwwXDFcdTAxZTAiKwotICAgICJcMTJcMTEyXDFcMFw0XDExMlwxXDBcMTFcMTEyXDJcMFwxXDExMlwxMlwzNzQiKwotICAgICJcMVwzNzZcM1wzNzRcMVwwXDcwXDM3NFwxNFx1MDEwMFwxXDM3NlwxXHUwMTAwXDFcMCIrCi0gICAgIlw3MFx1MDEwMFw2XDBcM1wxNjZcMVx1MDFlMVw2XDBcMVwxNjZcNlwwXDZcMTY2IisKLSAgICAiXDFcMFwxM1wxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NiIrCi0gICAgIlwyXDBcMVwxNjZcMVx1MDE4NFwyXHUwMTg1XDFcdTAxODZcMVx1MDE4NFwxXHUwMTg1XDRcdTAxODQiKwotICAgICJcMVx1MDE4NVwxXHUwMTg0XDFcdTAxODVcMlx1MDE4NFwxXHUwMTg1XDZcdTAxODRcMVx1MDE4NVw1Nlx1MDE4NCIrCi0gICAgIlwxXHUwMWUyXDFcdTAxODRcMTA1XHUwMTg1XDFcdTAxZTNcMVx1MDE4NVwxXHUwMTg3XDJcdTAxODhcMVx1MDE4OSIrCi0gICAgIlwxXHUwMTg3XDFcdTAxODhcNFx1MDE4N1wxXHUwMTg4XDFcdTAxODdcMVx1MDE4OFwyXHUwMTg3XDFcdTAxODgiKwotICAgICJcNlx1MDE4N1wxXHUwMTg4XDU2XHUwMTg3XDFcdTAxZTJcMVx1MDE4N1wxMDVcdTAxODhcMVx1MDFlNFwxXHUwMTg4IisKLSAgICAiXDQxXDBcMVx1MDFlNVwxNFwwXDFcdTAxZTVcNjNcMFwyXHUwMWU2XDEwM1wwXDJcdTAxZTciKwotICAgICJcMTE1XDBcMVx1MDFlOFwxNFwwXDFcdTAxZThcNjNcMFwyXHUwMWU5XDUyXDBcMTRcdTAxMjMiKwotICAgICJcMVx1MDEyMVwxXHUwMTIzXDFcMFw3MFx1MDEyM1wzXDBcMlx1MDFlYVwxXDBcNFx1MDFlYSIrCi0gICAgIlwyXDBcMVx1MDEyNVwxXHUwMWVhXDFcMFw0XHUwMWVhXDFcMFwxMVx1MDFlYVwxXDAiKwotICAgICJcNDBcdTAxZWFcMlwwXDRcdTAxZWFcMlwwXDFcdTAxZWFcMTRcdTAxMzNcMVx1MDEzMVwxXHUwMTMzIisKLSAgICAiXDFcMFw3MFx1MDEzM1wzXDBcMlx1MDFlYlwxXDBcNFx1MDFlYlwyXDBcMVx1MDEzNSIrCi0gICAgIlwxXHUwMWViXDFcMFw0XHUwMWViXDFcMFwxMVx1MDFlYlwxXDBcNDBcdTAxZWJcMlwwIisKLSAgICAiXDRcdTAxZWJcMlwwXDFcdTAxZWJcMlwyMzFcMVwwXDRcMjMxXDFcdTAxZWNcMTAxXDIzMSIrCi0gICAgIlwxXDBcMzNcMjMxXDFcdTAxZWRcNTBcMjMxXDE0XHUwMTNkXDFcdTAxM2JcMVx1MDEzZFwxXDAiKwotICAgICJcNzBcdTAxM2RcM1wwXDJcdTAxZWVcMVwwXDRcdTAxZWVcMlwwXDFcdTAxM2ZcMVx1MDFlZSIrCi0gICAgIlwxXDBcNFx1MDFlZVwxXDBcMTFcdTAxZWVcMVwwXDQwXHUwMWVlXDJcMFw0XHUwMWVlIisKLSAgICAiXDJcMFwxXHUwMWVlXDJcMjQwXDFcMFw0XDI0MFwxXHUwMWVmXDEwMVwyNDBcMVwwIisKLSAgICAiXDMzXDI0MFwxXHUwMWYwXDUwXDI0MFwyXDBcMVx1MDFmMVwxMDRcMFw3XDI2M1wxXHUwMWYyIisKLSAgICAiXDJcMjYzXDFcMFwxXDI2M1wxXDBcMVx1MDE0Ylw2N1wyNjNcMVwwXDFcMjYzIisKLSAgICAiXDEyXHUwMTRlXDFcMFwxXHUwMTRlXDFcMFwxXHUwMTRlXDFcMFw3MFx1MDE0ZVw3XHUwMTRmIisKLSAgICAiXDFcdTAxZjNcNFx1MDE0ZlwxXHUwMTUwXDEwNlx1MDE0ZlwxXHUwMTUwXDIxXHUwMTRmXDFcdTAxZjRcNTBcdTAxNGYiKwotICAgICJcN1x1MDE1M1wxXHUwMWY1XDJcdTAxNTNcMVx1MDE1NFwxMDZcdTAxNTNcMVx1MDE1NFwyM1x1MDE1M1wxXHUwMWY2IisKLSAgICAiXDUwXHUwMTUzXDdcMzAxXDFcdTAxZjdcMlwzMDFcMVwwXDcxXDMwMVwxXHUwMTU3XDFcMCIrCi0gICAgIlwxXDMwMVwxMlx1MDFmOFwxXHUwMWY5XDcyXHUwMWY4XDFcMFwxXHUwMWY4XDdcMzA1XDFcdTAxZmEiKwotICAgICJcNFwzMDVcMVwwXDY3XDMwNVwxXHUwMTVhXDFcMFwxXDMwNVwxNFx1MDFmYlwxXHUwMWY5IisKLSAgICAiXDcwXHUwMWZiXDFcMFwxXHUwMWZiXDdcMzEwXDFcdTAxZmNcMlwzMTBcMVwwXDFcMzEwIisKLSAgICAiXDFcMFw3MFwzMTBcMVwwXDFcMzEwXDdcdTAxNWZcMVx1MDFmZFw0XHUwMTVmXDFcdTAxNjAiKwotICAgICJcMTA2XHUwMTVmXDFcdTAxNjBcMjFcdTAxNWZcMVx1MDFmZVw1MFx1MDE1Zlw3XHUwMTYzXDFcdTAxZmZcMlx1MDE2MyIrCi0gICAgIlwxXHUwMTY0XDEwNlx1MDE2M1wxXHUwMTY0XDIzXHUwMTYzXDFcdTAyMDBcNTBcdTAxNjNcN1wzMjZcMVx1MDIwMSIrCi0gICAgIlwyXDMyNlwxXDBcNzFcMzI2XDFcdTAxNjdcMVwwXDFcMzI2XDEyXHUwMjAyXDFcdTAyMDMiKwotICAgICJcNzJcdTAyMDJcMVwwXDFcdTAyMDJcN1wzMzJcMVx1MDIwNFw0XDMzMlwxXDBcNjdcMzMyIisKLSAgICAiXDFcdTAxNmFcMVwwXDFcMzMyXDE0XHUwMjA1XDFcdTAyMDNcNzBcdTAyMDVcMVwwXDFcdTAyMDUiKwotICAgICJcMzdcMFwxXHUwMjA2XDE0MVwwXDFcdTAxZGNcMzRcMFwxXHUwMWRlXDE1XDBcM1x1MDFkZSIrCi0gICAgIlwyXDBcMVx1MDFkZVwxMVwwXDFcdTAxZGVcMVwwXDJcdTAxZGVcN1wwXDFcdTAxZGUiKwotICAgICJcMVwwXDFcdTAxZGRcMlx1MDFkZVw2XDBcMVx1MDFkZVwxMVwwXDRcMTEyXDZcMCIrCi0gICAgIlwxXDExMlw2XDBcNlwxMTJcMVwwXDdcMTEyXDFcdTAyMDdcM1wxMTJcMVwwIisKLSAgICAiXDEzXDExMlwxXDBcNFwxMTJcMVwwXDExXDExMlwyXDBcMVwxMTJcNlwwIisKLSAgICAiXDRcMTEyXDZcMFwxXDExMlw2XDBcNlwxMTJcMVwwXDZcMTEyXDFcdTAyMDgiKwotICAgICJcNFwxMTJcMVwwXDEzXDExMlwxXDBcMVwxMTJcMVx1MDIwOFwyXDExMlwxXDAiKwotICAgICJcMTFcMTEyXDJcMFwxXDExMlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw2XDE2NlwxXDBcNlwxNjZcMVx1MDIwOVw0XDE2NlwxXDBcNlwxNjZcMVx1MDIwYSIrCi0gICAgIlw0XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNTNcMCIrCi0gICAgIlwxXHUwMjBiXDVcMFwxXHUwMjBiXDczXDBcMVx1MDIwY1wxNFwwXDFcdTAyMGNcNjZcMCIrCi0gICAgIlwxXHUwMjBkXDExXDBcMVx1MDIwZFw3NFwwXDFcdTAyMGVcMTFcMFwxXHUwMjBlXDc3XDAiKwotICAgICJcMVx1MDIwZlwxNFwwXDFcdTAyMGZcMjNcMFwyXDIzMVwxXDBcMzRcMjMxXDFcdTAyMTAiKwotICAgICJcNDdcMjMxXDJcMjQwXDFcMFwzNFwyNDBcMVx1MDIxMVw0N1wyNDBcMTRcdTAxNGZcMVx1MDE1MCIrCi0gICAgIlwyMlx1MDE0ZlwxXHUwMjEyXDQ3XHUwMTRmXDEyXHUwMTUzXDFcdTAxNTRcMjRcdTAxNTNcMVx1MDIxM1w0N1x1MDE1MyIrCi0gICAgIlwxMlx1MDFmOFwxXHUwMWI3XDcxXHUwMWY4XDFcdTAyMTRcMVx1MDFiN1wxXHUwMWY4XDE0XHUwMWZiXDFcdTAxYmQiKwotICAgICJcNjdcdTAxZmJcMVx1MDIxNVwxXHUwMWJkXDFcdTAxZmJcMTRcdTAxNWZcMVx1MDE2MFwyMlx1MDE1ZlwxXHUwMjE2IisKLSAgICAiXDQ3XHUwMTVmXDEyXHUwMTYzXDFcdTAxNjRcMjRcdTAxNjNcMVx1MDIxN1w0N1x1MDE2M1wxMlx1MDIwMlwxXHUwMWQxIisKLSAgICAiXDcxXHUwMjAyXDFcdTAyMThcMVx1MDFkMVwxXHUwMjAyXDE0XHUwMjA1XDFcdTAxZDdcNjdcdTAyMDVcMVx1MDIxOSIrCi0gICAgIlwxXHUwMWQ3XDFcdTAyMDVcNDBcMFwxXHUwMjFhXDU0XDBcNFwxMTJcNlwwXDFcMTEyIisKLSAgICAiXDZcMFw2XDExMlwxXDBcMTNcMTEyXDFcMFw0XDExMlwxXHUwMjFiXDZcMTEyIisKLSAgICAiXDFcMFw0XDExMlwxXDBcMTFcMTEyXDJcMFwxXDExMlw2XDBcNFwxMTIiKwotICAgICJcNlwwXDFcMTEyXDZcMFw2XDExMlwxXDBcM1wxMTJcMVx1MDIxY1w3XDExMiIrCi0gICAgIlwxXDBcNFwxMTJcMVx1MDIxY1w2XDExMlwxXDBcNFwxMTJcMVwwXDExXDExMiIrCi0gICAgIlwyXDBcMVwxMTJcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjYiKwotICAgICJcMVwwXDExXDE2NlwxXHUwMjFkXDFcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2IisKLSAgICAiXDFcMFwxMVwxNjZcMlwwXDFcMTY2XDZcMFw0XDE2Nlw2XDBcMVwxNjYiKwotICAgICJcNlwwXDZcMTY2XDFcMFwxMFwxNjZcMVx1MDIxZVwyXDE2NlwxXDBcMTNcMTY2IisKLSAgICAiXDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw1NFwwXDFcdTAyMWYiKwotICAgICJcMjRcMFwxXHUwMjFmXDUyXDBcMVx1MDIyMFwyMFwwXDFcdTAyMjBcNzBcMFwxXHUwMjIxIisKLSAgICAiXDEzXDBcMVx1MDIyMVw1M1wwXDJcdTAyMjJcMTEyXDBcMVx1MDIyM1wzNVwwXDFcdTAyMjMiKwotICAgICJcMTJcMFwyXDIzMVwxXDBcMzVcMjMxXDFcdTAyMjRcNDZcMjMxXDJcMjQwXDFcMCIrCi0gICAgIlwzNVwyNDBcMVx1MDIyNVw0NlwyNDBcMTRcdTAxNGZcMVx1MDE1MFwyM1x1MDE0ZlwxXHUwMjI2XDQ2XHUwMTRmIisKLSAgICAiXDEyXHUwMTUzXDFcdTAxNTRcMjVcdTAxNTNcMVx1MDIyN1w0Nlx1MDE1M1wxMlx1MDFmOFwxXHUwMjI4XDcxXHUwMWY4IisKLSAgICAiXDFcdTAyMTRcMVx1MDFiN1wxXHUwMWY4XDE0XHUwMWZiXDFcdTAyMjlcNjdcdTAxZmJcMVx1MDIxNVwxXHUwMWJkIisKLSAgICAiXDFcdTAxZmJcMTRcdTAxNWZcMVx1MDE2MFwyM1x1MDE1ZlwxXHUwMjJhXDQ2XHUwMTVmXDEyXHUwMTYzXDFcdTAxNjQiKwotICAgICJcMjVcdTAxNjNcMVx1MDIyYlw0Nlx1MDE2M1wxMlx1MDIwMlwxXHUwMjJjXDcxXHUwMjAyXDFcdTAyMThcMVx1MDFkMSIrCi0gICAgIlwxXHUwMjAyXDE0XHUwMjA1XDFcdTAyMmRcNjdcdTAyMDVcMVx1MDIxOVwxXHUwMWQ3XDFcdTAyMDVcNDFcMCIrCi0gICAgIlwxXHUwMjJlXDUzXDBcNFwxMTJcNlwwXDFcMTEyXDZcMFw2XDExMlwxXDAiKwotICAgICJcMTNcMTEyXDFcMFw3XDExMlwxXHUwMjJmXDNcMTEyXDFcMFw0XDExMlwxXDAiKwotICAgICJcMTFcMTEyXDJcMFwxXDExMlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw2XDE2NlwxXDBcMTFcMTY2XDFcdTAyMzBcMVwxNjZcMVwwXDEzXDE2NlwxXDAiKwotICAgICJcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNlwxNjZcMVwwXDZcMTY2XDFcdTAyMzFcNFwxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNDNcMCIrCi0gICAgIlwxXHUwMjMyXDExXDBcMVx1MDIzMlw3MlwwXDFcdTAyMzNcMTRcMFwxXHUwMjMzXDcxXDAiKwotICAgICJcMVx1MDIzNFwxNFwwXDFcdTAyMzRcMzBcMFwyXDIzMVwxXDBcMzZcMjMxXDFcdTAyMzUiKwotICAgICJcNDVcMjMxXDJcMjQwXDFcMFwzNlwyNDBcMVx1MDIzNlw0NVwyNDBcMTRcdTAxNGZcMVx1MDE1MCIrCi0gICAgIlwyNFx1MDE0ZlwxXHUwMjM3XDQ1XHUwMTRmXDEyXHUwMTUzXDFcdTAxNTRcMjZcdTAxNTNcMVx1MDIzOFw0NVx1MDE1MyIrCi0gICAgIlwxNFx1MDE1ZlwxXHUwMTYwXDI0XHUwMTVmXDFcdTAyMzlcNDVcdTAxNWZcMTJcdTAxNjNcMVx1MDE2NFwyNlx1MDE2MyIrCi0gICAgIlwxXHUwMjNhXDQ1XHUwMTYzXDQwXDBcMVx1MDIzYlw1NFwwXDRcMTEyXDZcMFwxXDExMiIrCi0gICAgIlw2XDBcNVwxMTJcMVx1MDIzY1wxXDBcMTNcMTEyXDFcMFwxM1wxMTJcMVwwIisKLSAgICAiXDRcMTEyXDFcMFwxMVwxMTJcMlwwXDFcMTEyXDZcMFw0XDE2Nlw2XDAiKwotICAgICJcMVwxNjZcNlwwXDZcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcdTAyM2QiKwotICAgICJcNlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwXDFcMTY2XDZcMCIrCi0gICAgIlw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMFw1XDE2NlwxXHUwMjNlIisKLSAgICAiXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwIisKLSAgICAiXDFcMTY2XDJcMjMxXDFcMFwzNVwyMzFcMVx1MDIzZlw0NlwyMzFcMlwyNDBcMVwwIisKLSAgICAiXDM1XDI0MFwxXHUwMjQwXDQ2XDI0MFwxNFx1MDE0ZlwxXHUwMTUwXDIzXHUwMTRmXDFcdTAyNDFcNDZcdTAxNGYiKwotICAgICJcMTJcdTAxNTNcMVx1MDE1NFwyNVx1MDE1M1wxXHUwMjQyXDQ2XHUwMTUzXDE0XHUwMTVmXDFcdTAxNjBcMjNcdTAxNWYiKwotICAgICJcMVx1MDI0M1w0Nlx1MDE1ZlwxMlx1MDE2M1wxXHUwMTY0XDI1XHUwMTYzXDFcdTAyNDRcNDZcdTAxNjNcMzVcMCIrCi0gICAgIlwxXHUwMjQ1XDU3XDBcNFwxMTJcNlwwXDFcMTEyXDZcMFw2XDExMlwxXDAiKwotICAgICJcNVwxMTJcMVx1MDI0Nlw1XDExMlwxXDBcMTNcMTEyXDFcMFw0XDExMlwxXDAiKwotICAgICJcMTFcMTEyXDJcMFwxXDExMlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw2XDE2NlwxXDBcMTNcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMCIrCi0gICAgIlwxXDE2NlwxXHUwMjQ3XDdcMTY2XDJcMFwxXDE2NlwyXDIzMVwxXDBcMzJcMjMxIisKLSAgICAiXDFcdTAyNDhcNTFcMjMxXDJcMjQwXDFcMFwzMlwyNDBcMVx1MDI0OVw1MVwyNDBcMTRcdTAxNGYiKwotICAgICJcMVx1MDE1MFwyMFx1MDE0ZlwxXHUwMjRhXDUxXHUwMTRmXDEyXHUwMTUzXDFcdTAxNTRcMjJcdTAxNTNcMVx1MDI0YiIrCi0gICAgIlw1MVx1MDE1M1wxNFx1MDE1ZlwxXHUwMTYwXDIwXHUwMTVmXDFcdTAyNGNcNTFcdTAxNWZcMTJcdTAxNjNcMVx1MDE2NCIrCi0gICAgIlwyMlx1MDE2M1wxXHUwMjRkXDUxXHUwMTYzXDZcMFw0XDExMlw2XDBcMVwxMTJcNlwwIisKLSAgICAiXDZcMTEyXDFcMFw3XDExMlwxXHUwMjRlXDNcMTEyXDFcMFwxM1wxMTJcMVwwIisKLSAgICAiXDRcMTEyXDFcMFwxMVwxMTJcMlwwXDFcMTEyXDZcMFw0XDE2Nlw2XDAiKwotICAgICJcMVwxNjZcNlwwXDZcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcdTAyNGYiKwotICAgICJcNlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwXDFcMTY2XDZcMCIrCi0gICAgIlw0XDExMlw2XDBcMVwxMTJcNlwwXDZcMTEyXDFcMFwxM1wxMTJcMVwwIisKLSAgICAiXDEzXDExMlwxXDBcNFwxMTJcMVwwXDExXDExMlwyXDBcMVx1MDI1MFw2XDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTBcMTY2XDFcdTAyNTEiKwotICAgICJcMlwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDAiKwotICAgICJcMVwxNjZcNlwwXDRcMTEyXDZcMFwxXDExMlw2XDBcNlwxMTJcMVwwIisKLSAgICAiXDVcMTEyXDFcdTAyNTJcNVwxMTJcMVwwXDEzXDExMlwxXDBcNFwxMTJcMVwwIisKLSAgICAiXDExXDExMlwyXDBcMVwxMTJcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNlwxNjZcMVwwXDRcMTY2XDFcdTAyNTNcNlwxNjZcMVwwXDEzXDE2NlwxXDAiKwotICAgICJcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTEyXDZcMCIrCi0gICAgIlwxXDExMlw2XDBcNlwxMTJcMVwwXDVcMTEyXDFcdTAyNTRcNVwxMTJcMVwwIisKLSAgICAiXDEzXDExMlwxXDBcNFwxMTJcMVwwXDExXDExMlwyXDBcMVwxMTJcNlwwIisKLSAgICAiXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwXDVcMTY2XDFcdTAyNTUiKwotICAgICJcNVwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDAiKwotICAgICJcMVwxNjZcNlwwXDRcMTEyXDZcMFwxXDExMlw2XDBcNlwxMTJcMVwwIisKLSAgICAiXDEzXDExMlwxXDBcNFwxMTJcMVx1MDI1Nlw2XDExMlwxXDBcNFwxMTJcMVwwIisKLSAgICAiXDExXDExMlwyXDBcMVwxMTJcNlx1MDI1N1w0XHUwMjU4XDZcdTAyNTdcMVx1MDI1OFw1XHUwMjU3IisKLSAgICAiXDFcMFw2XHUwMjU4XDFcdTAyNTdcMTNcdTAyNThcMVx1MDI1N1wxM1x1MDI1OFwxXHUwMjU3XDRcdTAyNTgiKwotICAgICJcMVx1MDI1N1wxMVx1MDI1OFwyXHUwMjU3XDFcdTAyNThcNDJcMFwxXHUwMjU5XDNcMFwxXHUwMjVhIisKLSAgICAiXDdcMFwxXHUwMjViXDFcdTAyNWNcMjFcMFwxXHUwMjVkXDEzXDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw2XDE2NlwxXDBcNFwxNjZcMVx1MDI1ZVwzXDE2NlwxXHUwMjVmIisKLSAgICAiXDJcMTY2XDFcMFw0XDE2NlwxXHUwMjYwXDFcdTAyNjFcNVwxNjZcMVwwXDRcMTY2IisKLSAgICAiXDFcMFw2XDE2NlwxXHUwMjYyXDJcMTY2XDJcMFwxXDE2Nlw1N1wwXDFcdTAyNjMiKwotICAgICJcNzdcMFwxXHUwMjY0XDExNVwwXDFcdTAyNjVcMTA1XDBcMVx1MDI2NlwxMDdcMFwxXHUwMjY3IisKLSAgICAiXDM1XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTNcMTY2IisKLSAgICAiXDFcMFw1XDE2NlwxXHUwMjY4XDVcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2IisKLSAgICAiXDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NiIrCi0gICAgIlwxXDBcMTJcMTY2XDFcdTAyNjlcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDExXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNlwxNjZcMVwwXDEzXDE2NlwxXDBcNVwxNjZcMVx1MDI2YVw1XDE2NlwxXDAiKwotICAgICJcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVx1MDI2YiIrCi0gICAgIlw2XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNlwwIisKLSAgICAiXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NlwxXDAiKwotICAgICJcNVwxNjZcMVx1MDI2Y1w1XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDAiKwotICAgICJcMVwxNjZcNDRcMFwxXHUwMjZkXDEzNlwwXDFcdTAyNmVcMTA3XDBcMVx1MDI2Zlw2N1wwIisKLSAgICAiXDFcdTAyNzBcMTI1XDBcMVx1MDI3MVwxN1wwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNlwxNjZcMVwwXDZcMTY2XDFcdTAyNzJcNFwxNjZcMVwwXDEzXDE2NlwxXDAiKwotICAgICJcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXDBcMVwxNjZcMVx1MDI3M1w3XDE2NlwyXDBcMVwxNjZcNlwwIisKLSAgICAiXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMlwxNjZcMVx1MDI3NFw2XDE2NlwyXDAiKwotICAgICJcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcNFwxNjZcMVx1MDI3NVw2XDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDExXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNlwxNjZcMVwwXDEzXDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDAiKwotICAgICJcMlwxNjZcMVx1MDI3Nlw2XDE2NlwyXDBcMVwxNjZcNDZcMFwxXHUwMjc3XDc0XDAiKwotICAgICJcMVx1MDI3OFwxMDZcMFwxXHUwMjc5XDExNlwwXDFcdTAyN2FcMTA1XDBcMVx1MDI3Ylw1MVwwIisKLSAgICAiXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEwXDE2NlwxXHUwMjdjIisKLSAgICAiXDJcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwIisKLSAgICAiXDFcMTY2XDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcdTAyN2QiKwotICAgICJcMVwwXDEzXDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2IisKLSAgICAiXDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NiIrCi0gICAgIlwxXHUwMjdlXDFcMFwxM1wxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDExXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNlwxNjZcMVwwXDZcMTY2XDFcdTAyN2ZcNFwxNjZcMVwwXDEzXDE2NlwxXDAiKwotICAgICJcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNlwxNjZcMVwwXDVcMTY2XDFcdTAyODBcNVwxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcNTdcMCIrCi0gICAgIlwxXHUwMjgxXDEzMVwwXDFcdTAyODJcNTJcMFwxXHUwMjgzXDEwNlwwXDFcdTAyODRcNDZcMCIrCi0gICAgIlw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMFwxM1wxNjZcMVwwIisKLSAgICAiXDVcMTY2XDFcdTAyODVcNVwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwIisKLSAgICAiXDFcMTY2XDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMCIrCi0gICAgIlwxM1wxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDdcMTY2XDFcdTAyODYiKwotICAgICJcMVwxNjZcMlwwXDFcMTY2XDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDZcMTY2XDFcMFwxMFwxNjZcMVx1MDI4N1wyXDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXDBcMTFcMTY2XDJcMFwxXDE2Nlw2XDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTBcMTY2XDFcdTAyODhcMlwxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjZcMTAzXDAiKwotICAgICJcMVx1MDI4OVw2M1wwXDFcdTAyNzFcMTMxXDBcMVx1MDI3YlwxMDZcMFwxXHUwMjhhXDExXDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw2XDE2NlwxXDBcMTNcMTY2XDFcMCIrCi0gICAgIlwxM1wxNjZcMVwwXDRcMTY2XDFcMFwxMFwxNjZcMVx1MDI4YlwyXDBcMVwxNjYiKwotICAgICJcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NiIrCi0gICAgIlwxXDBcNlwxNjZcMVx1MDI3Nlw0XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NiIrCi0gICAgIlwyXDBcMVwxNjZcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNlwxNjYiKwotICAgICJcMVwwXDEzXDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXDBcMTBcMTY2IisKLSAgICAiXDFcdTAyODBcMlwwXDFcMTY2XDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDZcMTY2XDFcMFwxM1wxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDEwXDE2NlwxXHUwMjhjXDJcMFwxXDE2NlwzNFwwXDFcdTAyNzFcMTU0XDBcMVx1MDI4ZCIrCi0gICAgIlwxMlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVx1MDI3NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwIisKLSAgICAiXDFcMTY2XDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDZcMTY2XDFcMCIrCi0gICAgIlwxM1wxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVwwXDdcMTY2XDFcdTAyOGUiKwotICAgICJcMVwxNjZcMlwwXDFcMTY2XDU2XDBcMVx1MDI3MVwzNlwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNlwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVx1MDI3NiIrCi0gICAgIlw2XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwyXDBcMVwxNjYiOwotCi0gIC8qKiAKLSAgICogVGhlIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5dHJhbnMgW10gPSB5eV91bnBhY2soeXlfcGFja2VkKTsKLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLSAgLy8gZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAkJLy8kTk9OLU5MUy0xJAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCS8vJE5PTi1OTFMtMSQKLSAgfTsKLQotICAvKioKLSAgICogWVlfQVRUUklCVVRFW2FTdGF0ZV0gY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgb2Ygc3RhdGUgPGNvZGU+YVN0YXRlPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBZWV9BVFRSSUJVVEVbXSA9IHsKLSAgICAgMSwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgCi0gICAgIDksICAxLCAgMSwgIDksICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsIAotICAgICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgOSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICA5LCAgOSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDksIAotICAgICAxLCAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAgOSwgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDksICA5LCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAgOSwgIDMsICAzLCAgMywgCi0gICAgIDMsICAzLCAgMywgIDksICA5LCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDksICA5LCAgMSwgIDEsIAotICAgICAwLCAgMSwgIDAsICA5LCAgMSwgIDIsICAxLCAgMiwgIDEsICAwLCAgMCwgIDAsICA5LCAgMSwgIDEsICAxLCAKLSAgICAgOSwgIDksICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDksICAxLCAgMCwgCi0gICAgIDAsICAxLCAgOSwgIDAsICA5LCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgOSwgIDEsICAxLCAgMCwgIDEsIAotICAgICAwLCAgOSwgIDAsICAwLCAgMCwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAKLSAgICAgOSwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDEsICAwLCAgMCwgIDksICAwLCAgMCwgIDEsICAwLCAgMCwgCi0gICAgIDksICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAxLCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMSwgIDAsIAotICAgICAxLCAgMSwgIDAsICAwLCAgOSwgIDksICA5LCAgMCwgIDksICA5LCAgMSwgIDEsICAxLCAgMSwgIDIsIDEzLCAKLSAgICAgMywgIDIsICAyLCAxMywgIDMsICAyLCAgMCwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAyLCAxMywgCi0gICAgIDMsICAyLCAgMiwgMTMsICAzLCAgMiwgIDAsICAxLCAgMSwgIDAsICAxLCAgMSwgIDAsICA5LCAgOSwgIDksIAotICAgICAwLCAgMCwgIDEsICAxLCAgMSwgIDksICAwLCAgMCwgMTMsICA5LCAxMywgIDksICA5LCAgMSwgIDEsICAxLCAKLSAgICAgMCwgIDAsICAxLCAgMywgIDIsICAyLCAgMywgIDIsICAyLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgCi0gICAgIDAsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDIsICAzLCAgMywgIDMsICAyLCAgMiwgIDMsICAzLCAKLSAgICAgMywgIDIsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMiwgIDMsICAzLCAgMywgIDIsICAyLCAgMywgIDMsICAzLCAgMiwgIDEsICAxLCAgMSwgIDEsIAotICAgICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDksICA5LCAgMCwgIDEsICA5LCAgMCwgIDEsICAxLCAKLSAgICAgMSwgIDUsIDEzLCAxMywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDAsICAxLCAgMSwgCi0gICAgIDksICAxLCAgMywgIDIsICAzLCAgMiwgIDEsICAwLCAgOSwgIDEsICAwLCAgMSwgIDMsICAyLCAgMywgIDIsIAotICAgICAxLCAgMCwgIDksICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAKLSAgICAgMSwgIDIsICAyLCAgMCwgIDAsICAyLCAgMiwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgCi0gICAgIDAsICA5LCAgOSwgIDEsICAxLCAgMiwgIDIsICAxLCAgMSwgIDIsICAyLCAgMSwgIDEsICAwLCAgMSwgIDEsIAotICAgICAxLCAgOSwgIDksICA5LCAgMSwgIDEsICAyLCAgMiwgIDIsICAyLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMiwgIDIsICAyLCAgMiwgIDksICAxLCAgMSwgIDEsICAxLCAgMywgIDMsICAzLCAgMywgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAwLCAKLSAgICAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgIDAsICAxCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgLy8gcHJpdmF0ZSBpbnQgeXljb2x1bW47IAotCi0gIC8qKiAKLSAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICAvLyBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2VvZl9kb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQlwcml2YXRlIGludCBmVG9rZW5Db3VudCA9IDA7Ci0gCi0JLy8gcmVxdWlyZWQgaG9sZGVycyBmb3Igd2hpdGUtc3BhY2UgY29tcGFjdGluZwotCXByaXZhdGUgYm9vbGVhbiBmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQgPSAxOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBDb250ZXh0UmVnaW9uQ29udGFpbmVyIGZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmX2NvbnRleHQgPSBudWxsOwotCi0JLy8gc3RhdGUgc3RhY2sgZm9yIGhhbmRsaW5nIGVtYmVkZGVkIHJlZ2lvbnMKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JLy8gYSAiaGludCIgYXMgdG8gd2hhdCBhbiBlbWJlZGRlZCByZWdpb24gc2hvdWxkIGJlIGV2YWx1YXRlZAotCXByaXZhdGUgU3RyaW5nIGZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JLy8gYSAiaGludCIgYXMgdG8gd2hhdCBzdGF0ZSB0byBlbnRlciBvbmNlIGFuIGVtYmVkZGVkIHJlZ2lvbiBoYXMKLQkvLyAgIGJlZW4gY29tcGxldGVkCi0JcHJpdmF0ZSBpbnQgZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCS8vIHRoZSBjb250YWluZXIgdXNlZCB0byBjcmVhdGUgZW1iZWRkZWQgcmVnaW9ucwotCXByaXZhdGUgQ29udGV4dFJlZ2lvbkNvbnRhaW5lciBmRW1iZWRkZWRDb250YWluZXIgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9DT05URVhUID0gIlBST1hZX0NPTlRFWFQiOwotCi0JcHJpdmF0ZSBTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgc3RhcnQgPSAwOwotCXByaXZhdGUgaW50IHRleHRMZW5ndGggPSAwOwotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0KLQkvLyBvZmZzZXQgZm9yIHRyYWNraW5nIHBvc2l0aW9uIHNwZWNpZmljIGJsb2NrIHRhZ3MKLQlwcml2YXRlIGludCBmT2Zmc2V0ID0gMDsKLQkKLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgYmVpbmcgb3BlbmVkCi0JcHJpdmF0ZSBTdHJpbmcgZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQotCS8vIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRhZyBpbnNpZGUgb2YgYW4gZW1iZWRkZWQgcmVnaW9uCi0JcHJpdmF0ZSBTdHJpbmcgaW50ZXJuYWxUYWdOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBpbnRlcm5hbENvbnRleHQgPSBudWxsOwotCi0JLy8gdGhlIGxpc3Qgb2YgdGFnIG5hbWUgQmxvY2tNYXJrZXJzCi0JcHJpdmF0ZSBMaXN0IGZCbG9ja01hcmtlcnMgPSBuZXcgQXJyYXlMaXN0KDApOwotCXByaXZhdGUgTGlzdCBmTmVzdGFibGVQcmVmaXhlcyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCi0JLy8gd2hlcmUgdGhlIGxhc3QgaW50ZXJuYWwgY29udGFpbmVyIGJsb2NrIHdhcyBmb3VuZAotCXByaXZhdGUgaW50IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0gLTE7Ci0KLQkvLyByZXF1aXJlZCB0byBub3Qgc2VlayB0ZXh0IGJsb2NrcyBvbiBhbiBlbmQgdGFnCi0JcHJpdmF0ZSBib29sZWFuIGZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSB0cnVlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBmRm9yYmlkSlNQID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBpbnQgZkVMbGV2ZWwgPSAwOwotCi0JcHJpdmF0ZSBKU1BQYXJzZXJSZWdpb25GYWN0b3J5IGZSZWdpb25GYWN0b3J5ID0gbmV3IEpTUFBhcnNlclJlZ2lvbkZhY3RvcnkoKTsKLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFkZEJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgewotCQlpZihjb250YWluc1RhZ05hbWUobWFya2VyLmdldFRhZ05hbWUoKSkpCi0JCQlyZXR1cm47Ci0JCWZCbG9ja01hcmtlcnMuYWRkKG1hcmtlcik7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkTmVzdGFibGVQcmVmaXgoVGFnTWFya2VyIG1hcmtlcikgewotCQlmTmVzdGFibGVQcmVmaXhlcy5hZGQobWFya2VyKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgTGlzdCBnZXROZXN0YWJsZVByZWZpeGVzKCkgewotCQlyZXR1cm4gZk5lc3RhYmxlUHJlZml4ZXM7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTmVzdGFibGUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJLy9JdGVyYXRvciBibG9ja3MgPSBmTmVzdGFibGVQcmVmaXhlcy5pdGVyYXRvcigpOwotCQkvL3doaWxlKGJsb2Nrcy5oYXNOZXh0KCkpIHsKLQkJLy8JVGFnTWFya2VyIG1hcmtlciA9IChUYWdNYXJrZXIpYmxvY2tzLm5leHQoKTsKLQkJLy8JU3RyaW5nIG1hcmtlck5hbWUgPSBtYXJrZXIuZ2V0VGFnTmFtZSgpOwotCQkvLwlpZih0YWdOYW1lLmxlbmd0aCgpID4gbWFya2VyTmFtZS5sZW5ndGgoKSArIDEgJiYgdGFnTmFtZS5zdGFydHNXaXRoKG1hcmtlck5hbWUpICYmIHRhZ05hbWUuY2hhckF0KG1hcmtlck5hbWUubGVuZ3RoKCkpID09ICc6JykgewotCQkvLwkJcmV0dXJuIG1hcmtlci5pc0dsb2JhbCgpIHx8IGdldE9mZnNldCgpID49IG1hcmtlci5nZXRNYXJrZXIoKS5nZXRTdGFydCgpOwotCQkvLwl9Ci0JCS8vfQotCQkvL3JldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZU5lc3RhYmxlUHJlZml4KFN0cmluZyBuYW1lKSB7Ci0JCWlmIChmTmVzdGFibGVQcmVmaXhlcyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBuZXN0YWJsZXMgPSBmTmVzdGFibGVQcmVmaXhlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKG5lc3RhYmxlcy5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoKChUYWdNYXJrZXIpIG5lc3RhYmxlcy5uZXh0KCkpLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotCQkJCQluZXN0YWJsZXMucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JCWZCbG9ja01hcmtlcnMucmVtb3ZlKG1hcmtlcik7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKFN0cmluZyB0YWduYW1lKSB7Ci0JCWlmIChmQmxvY2tNYXJrZXJzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGJsb2NrcyA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChibG9ja3MuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKCgoQmxvY2tNYXJrZXIpIGJsb2Nrcy5uZXh0KCkpLmdldFRhZ05hbWUoKS5lcXVhbHModGFnbmFtZSkpCi0JCQkJCWJsb2Nrcy5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkVGFnU2VxdWVuY2UoU3RyaW5nIHN0YXJ0VHlwZSwgU3RyaW5nIGVuZFRhZ05hbWUpIHsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihzdGFydFR5cGUsIG51bGwsIGVuZFRhZ05hbWUpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZ1tdIGVuZFR5cGVzKSB7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoc3RhcnRUeXBlLCBlbmRUeXBlcywgbnVsbCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoU3RyaW5nIHN0YXJ0VHlwZSwgU3RyaW5nIGVuZFR5cGUpIHsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihzdGFydFR5cGUsIG5ldyBTdHJpbmdbXXtlbmRUeXBlfSwgbnVsbCk7Ci0JfQotCS8qKgotCSAqICB1c2VyIG1ldGhvZCAKLQkgKiAKLQkgKiBBc3NlbWJsZXMgYW4gZW1iZWRkZWQgY29udGFpbmVyIGJlZ2lubmluZyB3aXRoIHRoZSBnaXZlbiBzdGFydFR5cGUgYXMKLQkgKiB0aGUgZmlyc3QgQ29udGV4dFJlZ2lvbiB3aXRoaW4gaXQgYW5kIG9mIHRoZSB0eXBlIGZFbWJlZGRlZEhpbnQuICBUaGUKLQkgKiBlbmRUeXBlc1tdIGFycmF5IGNvbnRhaW5zIHRoZSBjb250ZXh0IHR5cGVzIHRoYXQgd2lsbCBjYXVzZSBhIHN1Y2Nlc3NmdWwKLQkgKiBleGl0LiAgVXNlIG9mIHRoZSBlbmRUYWdOYW1lIHBhcmFtZXRlciBhbHRlcnMgdGhpcyBiZWhhdmlvciB0byBmb3JjZSBhbgotCSAqIGV4aXQgb24gYW4gWE1MX1RBR19DTE9TRSBhZnRlciBzZWVpbmcgYW4gWE1MX1RBR19OQU1FIHdob3NlIHNpZ25pZmljYW50Ci0JICogdGV4dCBtYXRjaGVzIHRoZSBlbmRUYWdOYW1lIFN0cmluZy4gIEFsbCBjb250ZW50cyBpbiBiZXR3ZWVuIGFyZQotCSAqIGluc2lnbmlmaWNhbnQsIGFuZCB5ZXMsIHRoaXMgbWVhbnMgY29tbWVudHMgYXJlIGFsbG93ZWQgaW5zaWRlLgotCSAqKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmdbXSBlbmRUeXBlcywgU3RyaW5nIGVuZFRhZ05hbWUpIHsKLQkJLy8gdGhlIGNvbnRleHQgb2YgdGhlIHJlZ2lvbiBiZWluZyBhZGRlZCB0byB0aGUgZW1iZWRkZWQgY29udGFpbmVyCi0JCWludGVybmFsQ29udGV4dCA9IHN0YXJ0VHlwZTsKLQkJLy8ga2VlcCB0cmFjayBvZiB3aGVyZSB0aGlzIGNvbnRhaW5lciBiZWdhbjsgdG8gcHJvdmlkZSByZWxhdGl2ZSBpbmRlY2VzIGZvciB0aGUgcmVnaW9ucwotCQlpbnQgY29udGFpbmVyU3RhcnQgPSB5eWNoYXI7Ci0JCWJvb2xlYW4gbm90RmluaXNoZWQgPSB0cnVlOwotCQkvLyBrZWVwIHRyYWNrIG9mIHdoZXJlIHdlIHNlZW0gdG8gYmUgc28gdGhhdCB0aGUgZW5kVGFnTmFtZSBjYW4gYmUgY2hlY2tlZAotCQlib29sZWFuIGlzSW5FbmRUYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpc0luRmlyc3RUYWcgPSB0cnVlOwotCQkvLyBjcmVhdGUgdGhlIGVtYmVkZGVkIGNvbnRhaW5lciBhbmQgc2V0dXAgaXRzICJ0eXBlIgotCQlpZiAoZkVtYmVkZGVkQ29udGFpbmVyID09IG51bGwpIHsKLQkJCWZFbWJlZGRlZENvbnRhaW5lciA9IG5ldyBDb250ZXh0UmVnaW9uQ29udGFpbmVyKCk7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VHlwZShmRW1iZWRkZWRIaW50KTsKLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRTdGFydChjb250YWluZXJTdGFydCk7Ci0JCQkvLyBUT0RPOiBwYXJlbnQgcmVnaW9uIG5lZWRzIHRvIGJlIHNldCAuLi4uIGJ1dCBub3Qgc3VyZSB3aGVyZSB0byBnZXQgaXQgZnJvbSAKLQkJCS8vCQlmRW1iZWRkZWRDb250YWluZXIuc2V0UGFyZW50KHBhcmVudFJlZ2lvbik7Ci0JCX0KLQkJY29udGFpbmVyU3RhcnQgPSBmRW1iZWRkZWRDb250YWluZXIuZ2V0U3RhcnQoKTsKLQkJd2hpbGUgKG5vdEZpbmlzaGVkKSB7Ci0JCQkvLyBhZGQgdGhlIHJlZ2lvbiB0byB0aGUgY29udGFpbmVyCi0JCQlpZiAoaW50ZXJuYWxDb250ZXh0ICE9IG51bGwgJiYgaW50ZXJuYWxDb250ZXh0ICE9IFBST1hZX0NPTlRFWFQpIHsKLQkJCQlJVGV4dFJlZ2lvbiBuZXdUb2tlbiA9IGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGludGVybmFsQ29udGV4dCwgeXljaGFyIC0gY29udGFpbmVyU3RhcnQsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOwotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKG5ld1Rva2VuKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUZXh0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vbmV3VG9rZW4uc2V0UGFyZW50KGZFbWJlZGRlZENvbnRhaW5lcik7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCS8vIGxvbmdzY2FuIGRldGVybWluZXMgd2hldGhlciB0byBhdHRlbXB0IGEgYmxvY2tUYWdTY2FuIHdpdGhpbiB0aGUgZW1iZWRkZWQgY29udGFpbmVyCi0JCQkJYm9vbGVhbiBsb25nc2NhbiA9IGZhbHNlOwotCQkJCS8vIHNhdmUgdGhlIHRva2VuaXplciBzdGF0ZSBpbiBjYXNlIG9mIGEgYmxvY2sgdGFnIHNjYW4KLQkJCQlpbnQgcHJldmlvdXNTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQlTdHJpbmcgcHJldmlvdXNDdXJyZW50VGFnTmFtZSA9IGZDdXJyZW50VGFnTmFtZTsKLQkJCQlpbnQgcHJldmlvdXNQb3N0U3RhdGUgPSBmRW1iZWRkZWRQb3N0U3RhdGU7Ci0JCQkJU3RyaW5nIHByZXZpb3VzRW1iZWRkZWRIaW50ID0gZkVtYmVkZGVkSGludDsKLQkJCQkvLyBkZXRlcm1pbmUgaWYgYSBibG9jayB0YWcgc2NhbiBpcyBuZWNlc3NhcnkKLQkJCQlpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgewotCQkJCQlpbnRlcm5hbFRhZ05hbWUgPSB5eXRleHQoKTsKLQkJCQkJaWYoIWlzTmVzdGFibGUoaW50ZXJuYWxUYWdOYW1lKSkgewotCQkJCQkJaW50ZXJuYWxUYWdOYW1lID0gbnVsbDsKLQkJCQkJCS8vIHNuYWdnZWQgYSB0YWcgbmFtZSB3ZSBzaG91bGRuJ3QgaGF2ZQotCQkJCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQUJPUlRfRU1CRURERUQ7Ci0JCQkJCQlub3RGaW5pc2hlZCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX09QRU4gfHwgaW50ZXJuYWxDb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQkJaW50ZXJuYWxUYWdOYW1lID0gbnVsbDsKLQkJCQl9Ci0JCQkJLy8gZG8gdXBrZWVwIGZvciBlbmRUYWdOYW1lIHVzYWdlOyBtdXN0IGJlIGhlcmUgc2luY2UgdGhlIG5leHQgdG9rZW4gY291bGQgYmUgdGhlIGNsb3NlCi0JCQkJaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQkJCWlzSW5FbmRUYWcgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9UQUdfQ0xPU0UpIHsKLQkJCQkJaXNJbkZpcnN0VGFnID0gaXNJbkVuZFRhZyA9IGZhbHNlOwotCQkJCX0gZWxzZSB7Ci0JCQkJIAlJVGV4dFJlZ2lvbkxpc3QgZW1iZWRkZWRSZWdpb25zID0gZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKTsKLQkJCQkJaWYgKGVtYmVkZGVkUmVnaW9ucy5zaXplKCkgPiAyICYmIChlbWJlZGRlZFJlZ2lvbnMuZ2V0KGVtYmVkZGVkUmVnaW9ucy5zaXplKCktMSkpLmdldFR5cGUoKSA9PSBYTUxfVEFHX0NMT1NFICYmIChlbWJlZGRlZFJlZ2lvbnMuZ2V0KGVtYmVkZGVkUmVnaW9ucy5zaXplKCkgLSAzKSkuZ2V0VHlwZSgpID09IFhNTF9UQUdfT1BFTiAmJiBpbnRlcm5hbFRhZ05hbWUgIT0gbnVsbCkgewotCQkJCQkJaWYgKGNvbnRhaW5zVGFnTmFtZShpbnRlcm5hbFRhZ05hbWUpKSB7Ci0JCQkJCQkJbG9uZ3NjYW4gPSB0cnVlOwotCQkJCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChsb25nc2NhbikKLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gaW50ZXJuYWxUYWdOYW1lOwotCQkJCS8vIHJlYWQgdGhlIG5leHQgcmVnaW9uIGFuZCBjb250ZXh0Ci0JCQkJaW50ZXJuYWxDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCWlmIChsb25nc2NhbikgewotCQkJCQkvLyBSZXR1cm5pbmcgZnJvbSBhIGJsb2NrIHRhZyBzY2FuIHJlcXVpcmVzIHJlc3RvcmluZyBzb21lIHN0YXRlIHZhcmlhYmxlcwotCQkJCQkvLyBhcyB3ZWxsIGFzIGhhbmRsaW5nIHRoZSBibG9jayByZWdpb24gYW5kIHNldHRpbmcgdXAgZm9yIG5vcm1hbCBzY2FubmluZwotCQkJCQkvLyBpbnNpZGUgdGhlIGVtYmVkZGVkIGNvbnRhaW5lcgotCQkJCQlJVGV4dFJlZ2lvbiBuZXdUb2tlbiA9IGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGludGVybmFsQ29udGV4dCwgeXljaGFyIC0gY29udGFpbmVyU3RhcnQsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOwotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUZXh0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkJLy8gbmV3VG9rZW4uc2V0UGFyZW50KGZFbWJlZGRlZENvbnRhaW5lcik7Ci0JCQkJCWxvbmdzY2FuID0gZmFsc2U7Ci0JCQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IHByZXZpb3VzUG9zdFN0YXRlOwotCQkJCQlmRW1iZWRkZWRIaW50ID0gcHJldmlvdXNFbWJlZGRlZEhpbnQ7Ci0JCQkJCWZDdXJyZW50VGFnTmFtZSA9IHByZXZpb3VzQ3VycmVudFRhZ05hbWU7Ci0JCQkJCXl5YmVnaW4ocHJldmlvdXNTdGF0ZSk7Ci0JCQkJCWludGVybmFsQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gcHJpbUdldE5leHRUb2tlbigpIGNhbGxzIG1heSB0aHJvdyBhbiBJT0V4Y2VwdGlvbgotCQkJCS8vIGNhdGNoIGFuZCBkbyBub3RoaW5nIHNpbmNlIHRoZSBpc0VPRiBjaGVjayBiZWxvdwotCQkJCS8vIHdpbGwgcHJvcGVybHkgZXhpdCBpZiB0aGUgaW5wdXQgd2FzIHRvbyBzaG9ydAotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGYpIHsKLQkJCQkvLyBzb21lIG90aGVyIGV4Y2VwdGlvbiBoYXBwZW5lZDsgbmV2ZXIgc2hvdWxkCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihmKTsKLQkJCX0KLQkJCWJvb2xlYW4gaXNFbmRpbmdUeXBlID0geXlzdGF0ZSgpID09IFNUX0FCT1JUX0VNQkVEREVEOwotCQkJaWYoIWlzRW5kaW5nVHlwZSkgewotCQkJCS8vIGNoZWNrIGZvciBlbmRpbmcgY29udGV4dAotCQkJCWlmIChlbmRUYWdOYW1lID09IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbmRUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJaXNFbmRpbmdUeXBlID0gaXNFbmRpbmdUeXBlIHx8IChpbnRlcm5hbENvbnRleHQgPT0gZW5kVHlwZXNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpc0VuZGluZ1R5cGUgPSAoKGlzSW5FbmRUYWcgJiYgaW50ZXJuYWxDb250ZXh0ID09IFhNTF9UQUdfQ0xPU0UpIHx8IChpc0luRmlyc3RUYWcgJiYgaW50ZXJuYWxDb250ZXh0ID09IFhNTF9FTVBUWV9UQUdfQ0xPU0UpKSAmJiBpbnRlcm5hbFRhZ05hbWUgIT0gbnVsbCAmJiBpbnRlcm5hbFRhZ05hbWUuZXF1YWxzKGVuZFRhZ05hbWUpOwotCQkJCX0KLQkJCX0KLQkJCUlUZXh0UmVnaW9uTGlzdCBlbWJlZGRlZExpc3QgPSBmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpOwotCQkJbm90RmluaXNoZWQgPSBub3RGaW5pc2hlZCAmJiAoKCFpc0VuZGluZ1R5cGUpICYmICFpc0VPRigpICYmIChlbmRUYWdOYW1lICE9IG51bGwgfHwgaW50ZXJuYWxDb250ZXh0ICE9IFVOREVGSU5FRCkgJiYgIShpbnRlcm5hbENvbnRleHQgPT0gUFJPWFlfQ09OVEVYVCAmJiAoZW1iZWRkZWRMaXN0LmdldChlbWJlZGRlZExpc3Quc2l6ZSgpLTEpKS5nZXRUeXBlKCkgPT0gVU5ERUZJTkVEKSk7Ci0JCX0KLQkJLy8gZmluaXNoIGFkZGluZyB0aGUgbGFzdCBjb250ZXh0Ci0JCWlmIChpbnRlcm5hbENvbnRleHQgIT0gbnVsbCAmJiBpbnRlcm5hbENvbnRleHQgIT0gUFJPWFlfQ09OVEVYVCkgewotCQkJSVRleHRSZWdpb24gbmV3VG9rZW4gPSBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihpbnRlcm5hbENvbnRleHQsIHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0LCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsKLQkJCWZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKG5ld1Rva2VuKTsKLQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkvL25ld1Rva2VuLnNldFBhcmVudChmRW1iZWRkZWRDb250YWluZXIpOwotCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldExlbmd0aCh5eWNoYXIgLSBjb250YWluZXJTdGFydCArIHl5bGVuZ3RoKCkpOwotCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoeXljaGFyIC0gY29udGFpbmVyU3RhcnQgKyB5eWxlbmd0aCgpKTsKLQkJfQotCQl5eWJlZ2luKGZFbWJlZGRlZFBvc3RTdGF0ZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoKSB7Ci0JCXJldHVybiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmc7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZUJsb2NraW5nKGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gbmV3VmFsdWU7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoKSB7Ci0JCXJldHVybiBnZXRCbG9ja01hcmtlckFsbG93c0pTUChmQ3VycmVudFRhZ05hbWUpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKFN0cmluZyBuYW1lKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7Ci0JCQlpZihjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJCXJldHVybiBtYXJrZXIuYWxsb3dzSlNQKCk7Ci0JCQllbHNlIGlmKCFjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKLQkJCQlyZXR1cm4gbWFya2VyLmFsbG93c0pTUCgpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCkgewotCQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoZkN1cnJlbnRUYWdOYW1lKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoU3RyaW5nIG5hbWUpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWJvb2xlYW4gY2FzZXNlbnNpdGl2ZSA9IG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKTsKLQkJCWlmKGNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7Ci0JCQllbHNlIGlmKCFjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKLQkJCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJsb2NrTWFya2VyQ29udGV4dCgpIHsKLQkJcmV0dXJuIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KFN0cmluZyBuYW1lKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCQlyZXR1cm4gbWFya2VyLmdldENvbnRleHQoKTsKLQkJfQotCQlyZXR1cm4gQkxPQ0tfVEVYVDsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgTGlzdCBnZXRCbG9ja01hcmtlcnMoKSB7Ci0JCXJldHVybiBmQmxvY2tNYXJrZXJzOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gZk9mZnNldCArIHl5Y2hhcjsKLQl9Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQmxvY2tNYXJrZXIoKSB7Ci0JCXJldHVybiBpc0Jsb2NrTWFya2VyKGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmICghZklzQmxvY2tpbmdFbmFibGVkKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gY29udGFpbnNUYWdOYW1lKHRhZ05hbWUpOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tUYWdTY2FuKFN0cmluZyBuZXdUYWdOYW1lKSB7Ci0JCWJlZ2luQmxvY2tNYXJrZXJTY2FuKG5ld1RhZ05hbWUsIEJMT0NLX1RFWFQpOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqCi0JICogU3BlY2lhbCB0b2tlbml6ZXIgc2V0dXAuICBBbGxvd3MgdG9rZW5pemF0aW9uIHRvIGJlIGluaXRpYXRlZCBhdCB0aGUKLQkgKiBzdGFydCBvZiBhIHRleHQgYmxvY2sgd2l0aGluIGEgIm5ld1RhZ05hbWUiIHRhZy4KLQkgKgotCSAqIEV4YW1wbGU6IAotCSAqCVRva2VuaXplciB0b2tlciA9IG5ldyBUb2tlbml6ZXIoKTsKLQkgKgl0b2tlci5zZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoZmFsc2UpOwotCSAqCXRva2VyLnJlc2V0KG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcigiYWZpdWhxd2tlamh0YXNpaGdhbGt3aHRxPC9zY3JpcHRlcj48L3Njcj48L3NjcmlwdD5hc2dkYXNnYSIpKTsKLQkgKgl0b2tlci5iZWdpbkJsb2NrTWFya2VyU2Nhbigic2NyaXB0IiwgQkxPQ0tfVEVYVCk7Ci0JICoJdG9rZXIuZ2V0UmVnaW9ucygpOyAKLQkgKgotCSAqIFJldHVybnM6Ci0JICoJQkxPQ0tfVEVYVDogMC00MAotCSAqCVhNTF9FTkRfVEFHX09QRU46IDQxLTQyCi0JICoJWE1MX1RBR19OQU1FOiA0My00OAotCSAqCVhNTF9UQUdfQ0xPU0U6IDQ5LTQ5Ci0JICoJWE1MX0NPTlRFTlQ6IDUwLTU3Ci0JICoKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBiZWdpbkJsb2NrTWFya2VyU2NhbihTdHJpbmcgbmV3VGFnTmFtZSwgU3RyaW5nIGJsb2NrY29udGV4dCkgewotCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJZkN1cnJlbnRUYWdOYW1lID0gbmV3VGFnTmFtZTsKLQl9Ci0KLS8qKgotICogTWV0aG9kIGRvU2Nhbi4KLSAqIAotICogUmV0dXJucyBhIGNvbnRleHQgcmVnaW9uIGZvciBhbGwgb2YgdGhlIHRleHQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiB1cHRvIHRoZSBlbmQgb2YgaW5wdXQgb3IKLSAqIHRvIHJpZ2h0ICpiZWZvcmUqIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2Ygc2VhcmNoU3RyaW5nCi0gKiAKLSAqIEBwYXJhbSBzZWFyY2hTdHJpbmcgLSB0YXJnZXQgc3RyaW5nIHRvIHNlYXJjaCBmb3IgZXguOiAiLS0+IiwgIjwvdGFnbmFtZSIKLSAqIEBwYXJhbSByZXF1aXJlVGFpbFNlcGFyYXRvciAtIHdoZXRoZXIgdGhlIHRhcmdldCBtdXN0IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2Ugb3IgJz4nCi0gKiBAcGFyYW0gYWxsb3dKU1AgLSBjaGVjayBmb3IgYW5kIGFsbG93IGZvciBKU1AgbWFya3VwIDwlJT4KLSAqIEBwYXJhbSBjb250ZXh0IC0gdGhlIGNvbnRleHQgb2YgdGhlIHNjYW5uZWQgcmVnaW9uIGlmIG5vbi16ZXJvIGxlbmd0aAotICogQHBhcmFtIGV4aXRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgcmVnaW9uIHdhcyBvZiBub24temVybyBsZW5ndGgKLSAqIEBwYXJhbSBhYm9ydFN0YXRlIC0gdGhlIHN0YXRlIHRvIGdvIHRvIGlmIHRoZSBzZWFyY2hTdHJpbmcgd2FzIGZvdW5kIGltbWVkaWF0ZWx5Ci0gKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBjb250ZXh0IGZvdW5kOiB0aGUgZGVzaXJlZCBjb250ZXh0IG9uIGEgbm9uLXplcm8gbGVuZ3RoIG1hdGNoLCB0aGUgYWJvcnRDb250ZXh0IG9uIGltbWVkaWF0ZSBzdWNjZXNzCi0gKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvU2NhbihTdHJpbmcgc2VhcmNoU3RyaW5nLCBib29sZWFuIHJlcXVpcmVUYWlsU2VwYXJhdG9yLCBib29sZWFuIGFsbG93SlNQLCBib29sZWFuIGFsbG93Q0RBVEEsIFN0cmluZyBzZWFyY2hDb250ZXh0LCBpbnQgZXhpdFN0YXRlLCBpbnQgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlib29sZWFuIHN0aWxsU2VhcmNoaW5nID0gdHJ1ZTsKLQkvLyBEaXNhYmxlIGZ1cnRoZXIgYmxvY2sgKHByb2JhYmx5KQotCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCWludCBzZWFyY2hTdHJpbmdMZW5ndGggPSBzZWFyY2hTdHJpbmcubGVuZ3RoKCk7Ci0JaW50IG4gPSAwOwotCWNoYXIgbGFzdENoZWNrQ2hhcjsKLQlpbnQgaTsKLQlib29sZWFuIHNhbWUgPSBmYWxzZTsKLQkvLyBDaGVjayBmb3IgSlNQIHN0YXJ0cyAoIjwlIikgaWYgdGhlIHRhZyBpcyBnbG9iYWwgbGlrZSBTQ1JJUFQgb3IgU1RZTEUKLQlib29sZWFuIGNoZWNrSlNQcyA9IGFsbG93SlNQICYmICFmRm9yYmlkSlNQOwotCWJvb2xlYW4gY2hlY2tlZEZvckpTUHNPbmNlID0gIWNoZWNrSlNQczsKLQlib29sZWFuIGNoZWNrZWRKU1BzQXRTdGFydE9uY2UgPSBmYWxzZTsKLQkKLQl3aGlsZSAoc3RpbGxTZWFyY2hpbmcpIHsKLQkJbiA9IDA7Ci0JCS8vIEVuc3VyZSB0aGF0IGVub3VnaCBkYXRhIGZyb20gdGhlIGlucHV0IGV4aXN0cyB0byBjb21wYXJlIGFnYWluc3QgdGhlIHNlYXJjaCBTdHJpbmcuCi0JCW4gPSB5eV9hZHZhbmNlKCk7Ci0JCXdoaWxlKG4gIT0gWVlFT0YgJiYgeXlfY3VycmVudFBvcyA8IHNlYXJjaFN0cmluZ0xlbmd0aCkKLQkJCW4gPSB5eV9hZHZhbmNlKCk7Ci0vLwkJYyA9IChjaGFyKSBuOwotCQkvLyBJZiB0aGUgaW5wdXQgd2FzIHRvbyBzaG9ydCBvciB3ZSd2ZSBleGhhdXN0ZWQgdGhlIGlucHV0LCBzdG9wIGltbWVkaWF0ZWx5LgotCQlpZiAobiA9PSBZWUVPRiAmJiBjaGVja2VkRm9ySlNQc09uY2UpIHsKLQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKioKLQkJCSAqIExvb2sgZm9yIHN0YXJ0aW5nIEpTUHMgIjwlIgotCQkJICovCi0JCQljaGVja2VkRm9ySlNQc09uY2UgPSB0cnVlOwotCQkJLy8gMSkgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCA6IFRoZXJlJ3MgYXQgbGVhc3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgb25jZSB0aGF0J3MgcmVhZCwgY2hlY2sgZm9yIEpTUHMKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGF0IGN1cnJlbnQtc2VhcmNoU3RyaW5nTGVuZ3RoOyBpZiBzbywgYmFja3VwIGFuZCBzd2l0Y2ggc2Nhbm5lciBzdGF0ZXMgdG8gaGFuZGxlIGl0LgotCQkJLy8gRW5zdXJlIHRoYXQgd2UndmUgbm90IGVuY291bnRlcmVkIGEgY29tcGxldGUgYmxvY2sgKDwlJT4pIHRoYXQgd2FzICpzaG9ydGVyKiB0aGFuIHRoZSBjbG9zZVRhZ1N0cmluZyBhbmQKLQkJCS8vIHRodXMgZm91bmQgdHdpY2UgYXQgY3VycmVudC10YXJnZXRMZW5ndGggW3NpbmNlIHRoZSBmaXJzdCBzY2FuIHdvdWxkIGhhdmUgY29tZSBvdXQgdGhpcyBmYXIgYW55d2F5XS4KLQkJCWlmKGNoZWNrSlNQcyAmJiB5eV9jdXJyZW50UG9zID4gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGggIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgCi0JCQkJeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCArIDFdID09ICclJykgewotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsKLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7Ci0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7Ci0JCQkJCXJldHVybiBqc3BDb250ZXh0OwotCQkJCX0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCX0KLQkJCS8vIDIpIHl5X2N1cnJlbnRQb3MgLSBqc3BzdGFydGVyLmxlbmd0aCA6IFRoZXJlJ3Mgbm90IHNlYXJjaFN0cmluZ0xlbmd0aCBvZiBpbnB1dCBhdmFpbGFibGU7IGNoZWNrIGZvciBhIEpTUCAyIHNwb3RzIGJhY2sgaW4gd2hhdCB3ZSBjb3VsZCByZWFkCi0JCQkvLyAtLS0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbjsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uCi0JCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiAqaGF2aW5nKiBjbG9zZVRhZ1N0cmluZ0xlbmd0aCBhbW91bnQgb2YgaW5wdXQgdG8gd29yayBhcyBkZXNpZ25lZC4gIE11c3QgYmUgc3VyZSB3ZSBkb24ndAotCQkJLy8gc3BpbGwgb3ZlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIgd2hpbGUgY2hlY2tpbmcuCi0JCQllbHNlIGlmKGNoZWNrSlNQcyAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfY3VycmVudFBvcyA+IDAgJiYgeXlfY3VycmVudFBvcyA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmCi0JCQkJCXl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gMV0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXSA9PSAnJScpIHsKLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSAxOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsKLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7Ci0JCQkJfQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJfQotCQkJLy8gMykgeXlfY3VycmVudFBvcy4uKHl5X2N1cnJlbnRQb3MranNwU3RhcnRsZW5ndGgtMSkgOiBDaGVjayBhdCB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9uZSB0aW1lCi0JCQkvLyAtLS0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBpbW1lZGlhdGVseSBpbiB0aGUgYmxvY2sgYXJlYTsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uCi0JCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiB5eV9jdXJyZW50UG9zIGVxdWFsaW5nIGV4YWN0bHkgdGhlIHByZXZpb3VzIGVuZCArMSB0byB3b3JrIGFzIGRlc2lnbmVkLgotCQkJZWxzZSBpZihjaGVja0pTUHMgJiYgIWNoZWNrZWRKU1BzQXRTdGFydE9uY2UgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X3N0YXJ0UmVhZCA+IDAgJiYKLQkJCQkJeXlfc3RhcnRSZWFkIDwgeXlfYnVmZmVyLmxlbmd0aCAtIDEgJiYgeXlfYnVmZmVyW3l5X3N0YXJ0UmVhZF0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWQgKyAxXSA9PSAnJScpIHsKLQkJCQljaGVja2VkSlNQc0F0U3RhcnRPbmNlID0gdHJ1ZTsKLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X3N0YXJ0UmVhZDsKLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7Ci0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7Ci0JCQkJCXJldHVybiBqc3BDb250ZXh0OwotCQkJCX0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCX0KLQotCi0JCQkvKioKLQkJCSAqIExvb2sgZm9yIHN0YXJ0aW5nIENEQVRBICI8IVtDREFUQVsiCi0JCQkgKi8KLQkJCS8vIDEpIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg6IFRoZXJlJ3MgYXQgbGVhc3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgb25jZSB0aGF0J3MgcmVhZCwgY2hlY2sgZm9yIENEQVRBCi0JCQkvLyAtLS0KLQkJCS8vIExvb2sgZm9yIGEgQ0RBVEEgYmVnaW5uaW5nIGF0IGN1cnJlbnQtc2VhcmNoU3RyaW5nTGVuZ3RoOyBpZiBzbywgYmFja3VwIGFuZCBzd2l0Y2ggc2Nhbm5lciBzdGF0ZXMgdG8gaGFuZGxlIGl0LgotCQkJLy8gRW5zdXJlIHRoYXQgd2UndmUgbm90IGVuY291bnRlcmVkIGEgY29tcGxldGUgYmxvY2sgKDxbIUNEQVRBW11dPikgdGhhdCB3YXMgKnNob3J0ZXIqIHRoYW4gdGhlIGNsb3NlVGFnU3RyaW5nIGFuZAotCQkJLy8gdGh1cyBmb3VuZCB0d2ljZSBhdCBjdXJyZW50LXRhcmdldExlbmd0aCBbc2luY2UgdGhlIGZpcnN0IHNjYW4gd291bGQgaGF2ZSBjb21lIG91dCB0aGlzIGZhciBhbnl3YXldLgotLyoJCQlpZihjaGVja0NEQVRBICYmIHl5X2N1cnJlbnRQb3MgPiBzZWFyY2hTdHJpbmdMZW5ndGggJiYgeXlfY3VycmVudFBvcyArIHNlYXJjaFN0cmluZ0xlbmd0aCA8IHl5X2J1ZmZlci5sZW5ndGggJiYgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiAKLQkJCQljaGFyc01hdGNoKGNkYXRhU3RhcnRlciwgeXlfYnVmZmVyLCAwLCB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoKSkgewotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsKLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJLy8gZ28gdG8gYSBzdGF0ZSB3aGVyZSBDREFUQSBjYW4gYmUgZm91bmQKLQkJCQlpZiAoZkVtYmVkZGVkQ29udGFpbmVyID09IG51bGwpIHsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbmV3IENvbnRleHRSZWdpb25Db250YWluZXIoKTsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFR5cGUoc2VhcmNoQ29udGV4dCk7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRTdGFydCh5eWNoYXIpOwotCQkJCX0KLQkJCQlJVGV4dFJlZ2lvbiBuZXdUb2tlbiA9IGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKHNlYXJjaENvbnRleHQsIHl5Y2hhciwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQobmV3VG9rZW4pOwotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldFRleHRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCXl5YmVnaW4oWVlJTklUSUFMKTsKLQkJCQlTdHJpbmcgY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQlpZihjb250ZXh0LmVxdWFscyhYTUxSZWdpb25Db250ZXh0cy5YTUxfQ0RBVEFfT1BFTikpIHsKLQkJCQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxSZWdpb25Db250ZXh0cy5YTUxfQ0RBVEFfT1BFTiwgWE1MUmVnaW9uQ29udGV4dHMuWE1MX0NEQVRBX0NMT1NFKTsKLQkJCQl9Ci0JCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7Ci0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQl9Ci0qLy8qCi0JCQkvLyAyKSB5eV9jdXJyZW50UG9zIC0gY2RhdGFTdGFydGVyLmxlbmd0aDogVGhlcmUncyBub3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgY2hlY2sgZm9yIGEgQ0RBVEEgcmlnaHQgaGVyZSBzcG90cyBiYWNrIGluIHdoYXQgd2UgY291bGQgcmVhZAotCQkJLy8gLS0tCi0JCQkvLyBMb29rIGZvciBhIEpTUCBiZWdpbm5pbmcgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb247IHRoaXMgY2FzZSB3b3VsZG4ndCBiZSBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgc2VjdGlvbgotCQkJLy8gc2luY2UgaXQgcmVsaWVzIHVwb24gKmhhdmluZyogY2xvc2VUYWdTdHJpbmdMZW5ndGggYW1vdW50IG9mIGlucHV0IHRvIHdvcmsgYXMgZGVzaWduZWQuICBNdXN0IGJlIHN1cmUgd2UgZG9uJ3QKLQkJCS8vIHNwaWxsIG92ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHdoaWxlIGNoZWNraW5nLgotCQkJZWxzZSBpZihjaGVja0NEQVRBICYmIHl5X3N0YXJ0UmVhZCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiB5eV9jdXJyZW50UG9zID4gMCAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCAtIDEgJiYKLQkJCQkJeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSAxXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdID09ICclJykgewotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIDE7Ci0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOwotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQl9Ci0JCQkvLyAzKSB5eV9jdXJyZW50UG9zIDogQ2hlY2sgYXQgdGhlIHN0YXJ0IG9mIHRoZSBibG9jayBvbmUgdGltZQotCQkJLy8gLS0tCi0JCQkvLyBMb29rIGZvciBhIEpTUCBiZWdpbm5pbmcgaW1tZWRpYXRlbHkgaW4gdGhlIGJsb2NrIGFyZWE7IHRoaXMgY2FzZSB3b3VsZG4ndCBiZSBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgc2VjdGlvbgotCQkJLy8gc2luY2UgaXQgcmVsaWVzIHVwb24geXlfY3VycmVudFBvcyBlcXVhbGluZyBleGFjdGx5IHRoZSBwcmV2aW91cyBlbmQgKzEgdG8gd29yayBhcyBkZXNpZ25lZC4KLQkJCWVsc2UgaWYoY2hlY2tDREFUQSAmJiAhY2hlY2tlZEZvckNEQVRBT25jZSAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfc3RhcnRSZWFkID4gMCAmJgotCQkJCQl5eV9zdGFydFJlYWQgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X3N0YXJ0UmVhZCArIDFdID09ICclJykgewotCQkJCWNoZWNrZWRGb3JDREFUQU9uY2UgPSB0cnVlOwotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfc3RhcnRSZWFkOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsKLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7Ci0JCQkJfQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJfQotKi8KLQkJCS8vIENoZWNrIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSB0YXJnZXQgdmVyc3VzIHRoZSBsYXN0IHRhcmdldExlbmd0aCBjaGFyYWN0ZXJzIHJlYWQgZnJvbSB0aGUgYnVmZmVyCi0JCQkvLyBhbmQgc2VlIGlmIGl0IG1hdGNoZXMKLQkJCWlmIChuID09IFlZRU9GKSB7Ci0JCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNhbWUgPSB0cnVlOwotCQkJCS8vIHNhZmV0eSBjaGVjayBmb3IgYXJyYXkgYWNjZXNzZXMKLQkJCQlpZih5eV9jdXJyZW50UG9zID49IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zIDw9IHl5X2J1ZmZlci5sZW5ndGgpIHsKLQkJCQkJZm9yKGkgPSAwOyBpIDwgc2VhcmNoU3RyaW5nTGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmKHNhbWUgJiYgZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQotCQkJCQkJCXNhbWUgPSB5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdID09IHNlYXJjaFN0cmluZy5jaGFyQXQoaSk7Ci0JCQkJCQllbHNlIGlmKHNhbWUgJiYgIWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykKLQkJCQkJCQlzYW1lID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0pID09IENoYXJhY3Rlci50b0xvd2VyQ2FzZShzZWFyY2hTdHJpbmcuY2hhckF0KGkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBzYWZldHkgY2hlY2sgZmFpbGVkOyBubyBtYXRjaCBpcyBwb3NzaWJsZSByaWdodCBub3cKLQkJCQllbHNlIHsKLQkJCQkJc2FtZSA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChzYW1lICYmIHJlcXVpcmVUYWlsU2VwYXJhdG9yICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoKSB7Ci0JCQkJLy8gQWRkaXRpb25hbCBjaGVjayBmb3IgY2xvc2UgdGFncyB0byBlbnN1cmUgdGhhdCB0YXJnZXRTdHJpbmc9Ijwvc2NyaXB0IiBkb2Vzbid0IG1hdGNoCi0JCQkJLy8gIjwvc2NyaXB0UyIKLQkJCQlsYXN0Q2hlY2tDaGFyID0geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdOwotCQkJCS8vIFN1Y2NlZWQgb24gIjwvc2NyaXB0PiIgYW5kICI8L3NjcmlwdCAiCi0JCQkJaWYobGFzdENoZWNrQ2hhciA9PSAnPicgfHwgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShsYXN0Q2hlY2tDaGFyKSkKLQkJCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0aWxsU2VhcmNoaW5nID0gIXNhbWUgfHwgKHl5X2N1cnJlbnRQb3MgPCB5eV9zdGFydFJlYWQgKyBzZWFyY2hTdHJpbmdMZW5ndGgpOwotCQkJfQotCQl9Ci0JfQotCWlmIChuICE9IFlZRU9GIHx8IHNhbWUpIHsKLQkJLy8gV2UndmUgc3RvcHBlZCBzaG9ydCBvZiB0aGUgZW5kIG9yIGRlZmluaXRlbHkgZm91bmQgYSBtYXRjaAotCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOwotCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJLy8gSWYgdGhlIHNlYXJjaFN0cmluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQotCQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQotCQlpZiAoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJeXliZWdpbihpbW1lZGlhdGVGYWxsYmFja1N0YXRlKTsKLQkJCXJldHVybiBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCS8vIFdlIHJhbiB0aHJvdWdoIHRoZSByZXN0IG9mIHRoZSBpbnB1dAotCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOwotCQl5eV9jdXJyZW50UG9zKys7Ci0JfQotCXl5YmVnaW4oZXhpdFN0YXRlKTsKLQkvLyBJZiB0aGUgZW5kaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlCi0JLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkKLQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKQotCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOwotCXJldHVybiBzZWFyY2hDb250ZXh0OwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqIGRvZXMgYSBsb29rYWhlYWQgZm9yIHRoZSBjdXJyZW50IHRhZyBuYW1lCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvQmxvY2tUYWdTY2FuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eSgpOwotCXJldHVybiBkb1NjYW4oIjwvIiArIGZDdXJyZW50VGFnTmFtZSwgdHJ1ZSwgZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoKSwgdHJ1ZSwgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSksIFlZSU5JVElBTCwgWVlJTklUSUFMKTsKLX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqCi0JICogQ29udmVydHMgdGhlIHJhdyBjb250ZXh0IFN0cmluZyByZXR1cm5lZCBieSB0aGUgcHJpbUdldE5leHRUb2tlbigpCi0JICogbWV0aG9kIGludG8gYSBmdWxsIElUZXh0UmVnaW9uIGJ5IHB1bGxpbmcgaW4gdmFsdWVzIGZvciB0aGUKLQkgKiBjdXJyZW50IG9mZnNldCB3aXRoaW4gdGhlIHNjYW5uaW5nIHRleHQuCi0JICoKLQkgKiBSZXR1cm5zIG51bGwgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgYW5kIGF0dGFjaGVzIGludGVybWl0dGVudGx5Ci0JICogZGlzY292ZXJlZCB3aGl0ZXNwYWNlIG9udG8gdGhlIGVuZCBvZiB1c2VmdWwgcmVnaW9ucy4KLQkgKgotCSAqIE5vdGUgdGhhdCB0aGlzIGFsZ29yaXRobSBjYWNoZXMgdGhlIHRva2VuIGZvbGxvd2luZyB0aGUgb25lIGJlaW5nIHJldHVybmVkCi0JICogc28gdGhhdCB3aGl0ZXNwYWNlIGNhbiBiZSBjb2xsYXBzZWQuCi0JICovCi0JcHVibGljIGZpbmFsIElUZXh0UmVnaW9uIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7Ci0JCS8vIGxvYWQgdGhlIHN0YXJ0aW5nIG5vbi13aGl0ZXNwYWNlIHRva2VuIChhc3N1bWUgdGhhdCBpdCBpcyBzbykKLQkJaWYgKGZTaG91bGRMb2FkQnVmZmVyZWQpIHsKLQkJCWlmIChmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJSVRleHRSZWdpb24gY29udGFpbmVyID0gZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXI7Ci0JCQkJZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBudWxsOwotCQkJCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQkJCQlyZXR1cm4gY29udGFpbmVyOwotCQkJfQotCQkJY29udGV4dCA9IGZCdWZmZXJlZENvbnRleHQ7Ci0JCQlzdGFydCA9IGZCdWZmZXJlZFN0YXJ0OwotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsKLQkJCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQlpZiAoY29udGV4dCA9PSBQUk9YWV9DT05URVhUKSB7Ci0JCQkJcmV0dXJuIGZFbWJlZGRlZENvbnRhaW5lcjsKLQkJCX0gZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ST09UX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsKLQkJCQllbHNlCi0JCQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0JCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7Ci0JCQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JCQl9Ci0JCQlzdGFydCA9IHl5Y2hhcjsKLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOwotCQkJaWYgKHl5X2F0RU9GKSB7Ci0JCQkJZlRva2VuQ291bnQrKzsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQkvLyBzdG9yZSB0aGUgbmV4dCB0b2tlbgotCQlmX2NvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCWlmIChmX2NvbnRleHQgPT0gUFJPWFlfQ09OVEVYVCkgewotCQkJZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBmRW1iZWRkZWRDb250YWluZXI7Ci0JCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfUk9PVF9UQUdfTkFNRSB8fCBmX2NvbnRleHQgPT0gSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQotCQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOwotCQkJZWxzZQotCQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0JCX0gZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfT1BFTikgewotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JCX0KLQkJZkJ1ZmZlcmVkQ29udGV4dCA9IGZfY29udGV4dDsKLQkJZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7Ci0JCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSB0cnVlOwotCQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCA9PSBXSElURV9TUEFDRSkgewotCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCQkJbGVuZ3RoICs9IGZCdWZmZXJlZExlbmd0aDsKLQkJfQotCQlpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0JCQkvLyBFT0YKLQkJCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZGlzY292ZXJlZCAiICsgZlRva2VuQ291bnQgKyAiIHRva2Vucy4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZUb2tlbkNvdW50Kys7Ci0JCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBmQ3VycmVudFRhZ05hbWUpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBKU1BUb2tlbml6ZXIoKXsKLQkJc3VwZXIoKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgSlNQVG9rZW5pemVyKGNoYXJbXSBjaGFyQXJyYXkpewotCQkJdGhpcyhuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSkpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsKLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5LCBpbnQgbmV3T2Zmc2V0KSB7Ci0JCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgbmV3T2Zmc2V0KTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0JCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgMCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbiwgaW50IG5ld09mZnNldCkgewotCQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIG5ld09mZnNldCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4pIHsKLQkJcmVzZXQoaW4sIDApOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAqCi0JICoKLQkgKiBSZXNldCBpbnRlcm5hbCBjb3VudGVycyBhbmQgdmFycyB0byAibmV3bHkgY3JlYXRlZCIgdmFsdWVzLCBpbiB0aGUgaG9wZXMKLQkgKiB0aGF0IHJlc2V0dGluZyBhIHByZS1leGlzdGluZyB0b2tlbml6ZXIgaXMgZmFzdGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgb25lLgotCSAqCi0JICogVGhpcyBtZXRob2QgY29udGFpbnMgY29kZSBibG9ja3MgdGhhdCB3ZXJlIGVzc2VudGlhbGx5IGR1cGxpY2F0ZWQgZnJvbSB0aGUKLQkgKiA8ZW0+Z2VuZXJhdGVkPC9lbT4gb3V0cHV0IG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBiZWZvcmUgdGhpcyBtZXRob2Qgd2FzCi0JICogYWRkZWQuICBUaG9zZSBjb2RlIGJsb2NrcyB3ZXJlIHVuZGVyIHRoZSBhYm92ZSBjb3B5cmlnaHQuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4sIGludCBuZXdPZmZzZXQpIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlc2V0dGluZyB0b2tlbml6ZXIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJZk9mZnNldCA9IG5ld09mZnNldDsKLQkKLQkJLyogdGhlIGlucHV0IGRldmljZSAqLwotCQl5eV9yZWFkZXIgPSBpbjsKLQkKLQkJLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotCQl5eV9zdGF0ZSA9IDA7Ci0JCi0JCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLQkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQkKLQkJLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotCQl0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLQkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0JCi0JCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0JCXl5X21hcmtlZFBvcyA9IDA7Ci0JCi0JCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0JCXl5X3B1c2hiYWNrUG9zID0gMDsKLQkKLQkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JCXl5X2N1cnJlbnRQb3MgPSAwOwotCQotCQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLQkJeXlfc3RhcnRSZWFkID0gMDsKLQkKLQkJLyoqIAotCQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLQkJICogZnJvbSBpbnB1dCAKLQkJICovCi0JCXl5X2VuZFJlYWQgPSAwOwotCQotCQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkJeXlsaW5lID0gMDsKLQkKLQkJLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCXl5Y2hhciA9IDA7Ci0JCi0JCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQkJeXlfYXRFT0YgPSBmYWxzZTsKLQkKLQkJLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0JCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0JCi0JCi0JCS8qIHVzZXIgdmFyczogKi8KLQkJZlRva2VuQ291bnQgPSAwOwotCSAKLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCQlmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsKLQkJZkJ1ZmZlcmVkU3RhcnQgPSAxOwotCQlmQnVmZmVyZWRMZW5ndGggPSAwOwotCQlmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCQotCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IC0xOwotCQotCQljb250ZXh0ID0gbnVsbDsKLQkJc3RhcnQgPSAwOwotCQl0ZXh0TGVuZ3RoID0gMDsKLQkJbGVuZ3RoID0gMDsKLQkKLQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsKLQkJCi0JCWZFTGxldmVsID0gMDsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKgotCSAqLwotCXB1YmxpYyBCbG9ja1Rva2VuaXplciBuZXdJbnN0YW5jZSgpIHsKLQkJSlNQVG9rZW5pemVyIG5ld0luc3RhbmNlID0gbmV3IEpTUFRva2VuaXplcigpOwotCQkvLyBnbG9iYWwgdGFnbWFya2VycyBjYW4gYmUgc2hhcmVkOyB0aGV5IGhhdmUgbm8gc3RhdGUgYW5kIAotCQkvLyBhcmUgbmV2ZXIgZGVzdHJveWVkIChlLmcuICdyZWxlYXNlJykKLQkJZm9yKGludCBpID0gMDsgaSA8IGZCbG9ja01hcmtlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCUJsb2NrTWFya2VyIGJsb2NrTWFya2VyID0gKEJsb2NrTWFya2VyKSBmQmxvY2tNYXJrZXJzLmdldChpKTsKLQkJCWlmKGJsb2NrTWFya2VyLmlzR2xvYmFsKCkpCi0JCQkJbmV3SW5zdGFuY2UuYWRkQmxvY2tNYXJrZXIoYmxvY2tNYXJrZXIpOwotCQl9Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBmTmVzdGFibGVQcmVmaXhlcy5zaXplKCk7IGkrKykgewotCQkJVGFnTWFya2VyIG1hcmtlciA9IChUYWdNYXJrZXIpIGZOZXN0YWJsZVByZWZpeGVzLmdldChpKTsKLQkJCWlmKG1hcmtlci5pc0dsb2JhbCgpKQotCQkJCW5ld0luc3RhbmNlLmFkZE5lc3RhYmxlUHJlZml4KG1hcmtlcik7Ci0JCX0KLQkJcmV0dXJuIG5ld0luc3RhbmNlOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHNjYW5YTUxDb21tZW50VGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFNjYW4gZm9yICctLT4nIGFuZCByZXR1cm4gdGhlIHRleHQgdXAgdG8gdGhhdCBwb2ludCBhcwotCQkvLyAgIFhNTF9DT01NRU5UX1RFWFQgdW5sZXNzIHRoZSBzdHJpbmcgb2NjdXJzIElNTUVESUFURUxZLCBpbiB3aGljaAotCQkvLyAgY2FzZSBjaGFuZ2UgdG8gdGhlIFNUX1hNTF9DT01NRU5UX0VORCBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXh0Ci0JCS8vICBjb250ZXh0IGFzIHVzdWFsLgotCQlyZXR1cm4gZG9TY2FuKCItLT4iLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgWE1MX0NPTU1FTlRfVEVYVCwgU1RfWE1MX0NPTU1FTlRfRU5ELCBTVF9YTUxfQ09NTUVOVF9FTkQpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHNjYW5KU1BDb21tZW50VGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFNjYW4gZm9yICctLSU+JyBhbmQgcmV0dXJuIHRoZSB0ZXh0IHVwIHRvIHRoYXQgcG9pbnQgYXMKLQkJLy8gICBKU1BfQ09NTUVOVF9URVhUIHVubGVzcyB0aGUgc3RyaW5nIG9jY3VycyBJTU1FRElBVEVMWSwgaW4gd2hpY2gKLQkJLy8gIGNhc2UgY2hhbmdlIHRvIHRoZSBTVF9KU1BfQ09NTUVOVF9FTkQgc3RhdGUgYW5kIHJldHVybiB0aGUgbmV4dAotCQkvLyAgY29udGV4dCBhcyB1c3VhbC4KLQkJcmV0dXJuIGRvU2NhbigiLS0lPiIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgSlNQX0NPTU1FTlRfVEVYVCwgU1RfSlNQX0NPTU1FTlRfRU5ELCBTVF9KU1BfQ09NTUVOVF9FTkQpOwotCX0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBKU1BUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnl5X3JlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgSlNQVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgREZBIHRyYW5zaXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBpbnQgW10geXlfdW5wYWNrKFN0cmluZyBwYWNrZWQpIHsKLSAgICBpbnQgW10gdHJhbnMgPSBuZXcgaW50WzMxNTk1XTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCA4MjA2KSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICB2YWx1ZS0tOwotICAgICAgZG8gdHJhbnNbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gdHJhbnM7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTM3NikgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotICAgIC8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8gCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICAvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsKLQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOwotCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLSAgICB5eV9yZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgLSBmcm9tIHRoZSBTRUQgSkZsZXggc2tlbGV0b24KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIHRyeSB7Ci0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotICAgIH0KLSAgICAvLyBETyBOT1QgRVhJVCB0aGUgVk0gb24gYW4gZXJyb3IKLSAgICAvLyBTeXN0ZW0uZXhpdCgxKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNvbnRhaW5zVGFnTmFtZShjaGFyW10gbWFya2VyVGFnTmFtZSwgaW50IG9mZnNldCwgaW50IHRhZ25hbWVMZW5ndGgpIHsKLQkJZm9yKGludCBqID0gMDsgaiA8IGZCbG9ja01hcmtlcnMuc2l6ZSgpOyBqKyspIHsKLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilmQmxvY2tNYXJrZXJzLmdldChqKTsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkubGVuZ3RoKCkgPT0gdGFnbmFtZUxlbmd0aCkgewotCQkJCWJvb2xlYW4gbWF0Y2hlc1NvRmFyID0gdHJ1ZTsKLQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgdGFnbmFtZUxlbmd0aCAmJiBtYXRjaGVzU29GYXI7IGkrKykgewotCQkJCQlpZihtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuY2hhckF0KGkpICE9IG1hcmtlclRhZ05hbWVbaSArIG9mZnNldF0pCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZihDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkpICE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXJUYWdOYW1lW2kgKyBvZmZzZXRdKSkKLQkJCQkJCQltYXRjaGVzU29GYXIgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihtYXRjaGVzU29GYXIpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqCi0JICogUmV0dXJuIEFMTCBvZiB0aGUgcmVnaW9ucyBzY2FubmFibGUgd2l0aGluIHRoZSByZW1haW5pbmcgdGV4dAotCSAqIE5vdGU6IGZvciB2ZXJpZmljYXRpb24gdXNlCi0JICovCi0JcHVibGljIGZpbmFsIExpc3QgZ2V0UmVnaW9ucygpIHsKLQkJTGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsKLQkJCXdoaWxlKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCXRva2Vucy5hZGQocmVnaW9uKTsKLQkJCQl9Ci0JCQkJcmVnaW9uID0gZ2V0TmV4dFRva2VuKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFN0YWNrT3ZlcmZsb3dFcnJvciBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpKyI6IGlucHV0IGNvdWxkIG5vdCBiZSB0b2tlbml6ZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRPZmZzZXQoKSwgZSk7Ly8kTk9OLU5MUy0xJAotCQkJdGhyb3cgZTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFNpbmNlIHRoaXMgaXMgY29udmVuaWVuY2UgbWV0aG9kIGFuZCBOT1QgdGhlIHJlY29tbWVuZGVkIAotCQkJLy8gd2F5IG9mIGdldHRpbmcgdG9rZW5zLCBtYW55IGVycm9ycyBhcmUgc2ltcGx5IGhpZGRlbgotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIG5vdCBoYW5kbGVkIHJldHJpZXZpbmcgcmVnaW9uczogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRva2VuczsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgZHVtcChTdHJpbmcgcykgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzICsgIiAoIiArIHl5Y2hhciArICItIiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJKHl5bGVuZ3RoKCkgKyB5eWNoYXIpICsgIik6XCciICsvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1V0aWxzLmVzY2FwZSh5eXRleHQoKSkgKyAiXCciKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JLyogdXNlciBtZXRob2QgIC0gc2tlbGV0b24uc2VkICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFT0YoKSB7Ci0JCXJldHVybiB5eV9hdEVPRjsKLQl9Ci0vKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZCAqLwotcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29udGFpbnNUYWdOYW1lKFN0cmluZyBtYXJrZXJUYWdOYW1lKSB7Ci0JSXRlcmF0b3IgYmxvY2tzID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCXdoaWxlKGJsb2Nrcy5oYXNOZXh0KCkpIHsKLQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWJsb2Nrcy5uZXh0KCk7Ci0JCWlmKG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobWFya2VyVGFnTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobWFya2VyVGFnTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0gIC8qKgotICAgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwKLSAgICogd2hlbiB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X2RvX2VvZigpIHsKLSAgICBpZiAoIXl5X2VvZl9kb25lKSB7Ci0gICAgICB5eV9lb2ZfZG9uZSA9IHRydWU7Ci0gICAgLy8gZG8gbm90aGluZywgdGhpcyBpcyB0aGUgZG93bnN0cmVhbSBwYXJzZXIncyBqb2IKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotICAgIHl5X3B1c2hiYWNrUG9zID0gLTE7Ci0gICAgYm9vbGVhbiB5eV93YXNfcHVzaGJhY2s7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICBib29sZWFuIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgIGZvciAoeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZDsgeXlfY3VycmVudFBvcyA8IHl5X21hcmtlZFBvczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2N1cnJlbnRQb3MrKykgewotICAgICAgICBzd2l0Y2ggKHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXSkgewotICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgeXlfY291bnRlZCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICBpZiAoeXlfY291bnRlZCkKLSAgICAgICAgICAgIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHl5X2NvdW50ZWQpIHsKLSAgICAgICAgaWYgKCB5eV9hZHZhbmNlKCkgPT0gJ1xuJyApIHl5bGluZS0tOwotICAgICAgICBpZiAoICF5eV9hdEVPRiApIHl5X2N1cnJlbnRQb3MtLTsKLSAgICAgIH0KLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIHl5X3N0YXRlID0geXlfbGV4aWNhbF9zdGF0ZTsKLQotICAgICAgeXlfd2FzX3B1c2hiYWNrID0gZmFsc2U7Ci0KLSAgICAgIHl5X2ZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgIAotICAgICAgICAgIHl5X2lucHV0ID0geXlfYWR2YW5jZSgpOwotCi0gICAgICAgICAgaWYgKCB5eV9pbnB1dCA9PSBZWUVPRiApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLQotICAgICAgICAgIGludCB5eV9uZXh0ID0geXl0cmFuc1sgeXlfcm93TWFwW3l5X3N0YXRlXSArIHl5Y21hcFt5eV9pbnB1dF0gXTsKLSAgICAgICAgICBpZiAoeXlfbmV4dCA9PSAtMSkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIHl5X3N0YXRlID0geXlfbmV4dDsKLQotICAgICAgICAgIGludCB5eV9hdHRyaWJ1dGVzID0gWVlfQVRUUklCVVRFW3l5X3N0YXRlXTsKLSAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgMikgPiAwICkKLSAgICAgICAgICAgIHl5X3B1c2hiYWNrUG9zID0geXlfY3VycmVudFBvczsKLQotICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiAxKSA+IDAgKSB7Ci0gICAgICAgICAgICB5eV93YXNfcHVzaGJhY2sgPSAoeXlfYXR0cmlidXRlcyAmIDQpID4gMDsKLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IAotICAgICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDgpID4gMCApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoeXlfd2FzX3B1c2hiYWNrKQotICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9wdXNoYmFja1BvczsKLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsgICAgCi0KLSAgICAgICAgY2FzZSA2MjI6IAotICAgICAgICBjYXNlIDYyNzogCi0gICAgICAgIGNhc2UgNjM0OiAKLSAgICAgICAgY2FzZSA2Mzk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImpzcCBkaXJlY3RpdmUgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gSlNQX0RJUkVDVElWRV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2NTU6IGJyZWFrOwotICAgICAgICBjYXNlIDU5NzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWFNMIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjU2OiBicmVhazsKLSAgICAgICAgY2FzZSA1ODA6IAotICAgICAgICBjYXNlIDU4MzogCi0gICAgICAgIGNhc2UgNTg0OiAKLSAgICAgICAgY2FzZSA1ODU6IAotICAgICAgICBjYXNlIDU4NjogCi0gICAgICAgIGNhc2UgNTg3OiAKLSAgICAgICAgY2FzZSA1ODg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuQ0RBVEEgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCXl5YmVnaW4oU1RfQ0RBVEFfVEVYVCk7Ci0JcmV0dXJuIFhNTF9DREFUQV9PUEVOOwotIH0KLSAgICAgICAgY2FzZSA2NTc6IGJyZWFrOwotICAgICAgICBjYXNlIDU3MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgianNwOnJvb3QgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gSlNQX1JPT1RfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDY1ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTYzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgNjU5OiBicmVhazsKLSAgICAgICAgY2FzZSA1NjI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSA2NjA6IGJyZWFrOwotICAgICAgICBjYXNlIDU2MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDY2MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTQ2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7Ci0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMpOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUM7Ci0gfQotICAgICAgICBjYXNlIDY2MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTQ1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUY7Ci0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU07Ci0gfQotICAgICAgICBjYXNlIDY2MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTM5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjY0OiBicmVhazsKLSAgICAgICAgY2FzZSA1MTQ6IAotICAgICAgICBjYXNlIDU1NTogCi0gICAgICAgIGNhc2UgNTU2OiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfVkJMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2NjU6IGJyZWFrOwotICAgICAgICBjYXNlIDUwNDogCi0gICAgICAgIGNhc2UgNTUxOiAKLSAgICAgICAgY2FzZSA1NTI6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9FTF9RVU9URURfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjY2OiBicmVhazsKLSAgICAgICAgY2FzZSA0OTY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuSlNQIGNvbW1lbnQgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihZWUlOSVRJQUwpOwotCXJldHVybiBKU1BfQ09NTUVOVF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNjY3OiBicmVhazsKLSAgICAgICAgY2FzZSA0ODM6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZih5eWxlbmd0aCgpID4gMikKLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0yKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiVkJMIGluIGF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9KU1BfVkJMKTsKLQlmRUxsZXZlbCsrOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1ZCTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX1ZCTF9DTE9TRX0pOwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2Njg6IGJyZWFrOwotICAgICAgICBjYXNlIDQ4MjogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKHl5bGVuZ3RoKCkgPiAyKQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLTIpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJFTCBpbiBhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfSlNQX0VMKTsKLQlmRUxsZXZlbCsrOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0V9KTsKLQlmU3RhdGVTdGFjay5wb3AoKTsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjY5OiBicmVhazsKLSAgICAgICAgY2FzZSA0NzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuQ2hhclJlZiIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0NIQVJfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSA2NzA6IGJyZWFrOwotICAgICAgICBjYXNlIDQ3MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5jb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09NTUVOVF9URVhUOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9DT01NRU5UOwotCXl5YmVnaW4oU1RfWE1MX0NPTU1FTlQpOwotCXJldHVybiBYTUxfQ09NTUVOVF9PUEVOOwotIH0KLSAgICAgICAgY2FzZSA2NzE6IGJyZWFrOwotICAgICAgICBjYXNlIDQ3MjogCi0gICAgICAgIGNhc2UgNDkxOiAKLSAgICAgICAgY2FzZSA0OTQ6IAotICAgICAgICBjYXNlIDQ5NzogCi0gICAgICAgIGNhc2UgNDk4OiAKLSAgICAgICAgY2FzZSA1MDA6IAotICAgICAgICBjYXNlIDUwMjogCi0gICAgICAgIGNhc2UgNTA1OiAKLSAgICAgICAgY2FzZSA1MDc6IAotICAgICAgICBjYXNlIDUwODogCi0gICAgICAgIGNhc2UgNTEwOiAKLSAgICAgICAgY2FzZSA1MTI6IAotICAgICAgICBjYXNlIDUxNTogCi0gICAgICAgICAgeyAKLQkvKiBKU1AgY29tbWVudCBiZWd1biAoYW55d2hlcmUpCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUKLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cwotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkCi0JICovCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgewotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyEKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIEpTUF9DT05URU5UOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgewotCQl5eXB1c2hiYWNrKDQpOwotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjayg0KTsKLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDQpOwotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSAgewotCQl5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfQ09NTUVOVF9PUEVOLCBKU1BfQ09NTUVOVF9DTE9TRSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0JLy8gZmluaXNoZWQgc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKT09WVlJTklUSUFMKSB7Ci0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhIHJlZ3VsYXIgc2NyaXB0bGV0IG91dCBpbiBjb250ZW50Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiXG5KU1AgY29tbWVudCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7Ci0JCXJldHVybiBKU1BfQ09NTUVOVF9PUEVOOwotCX0KLQllbHNlIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIkpTUCBjb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JCX0KLQkJeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7Ci0JCS8vIHRoZSBjb21tZW50IGNvbnRhaW5lciBpdHNlbGYgd2lsbCBhY3QgYXMgY29tbWVudCB0ZXh0Ci0JCWZFbWJlZGRlZEhpbnQgPSBKU1BfQ09NTUVOVF9URVhUOwotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9DT01NRU5UX09QRU4sIEpTUF9DT01NRU5UX0NMT1NFKTsKLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7Ci0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJCXJldHVybiBCTE9DS19URVhUOwotCQl9Ci0JCS8qCi0JCSAqIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9uczsgbWFyayB0aGlzIG9uZSBhcyBhCi0JCSAqIGNvbW1lbnQgc28gaXQgd2lsbCBiZSBvdGhlcndpc2UgaWdub3JlZCBidXQgcHJlc2VydmVkICh3aGljaCBpcyB3aHkKLQkJICogd2UgY2FuJ3QgdXNlIHdoaXRlLXNwYWNlKQotCQkgKi8KLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQllbHNlIGlmKCh5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IHl5c3RhdGUoKSA9PSBTVF9YTUxfRVFVQUxTKSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCQl9Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0gfQotICAgICAgICBjYXNlIDY3MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzgxOiAKLSAgICAgICAgY2FzZSAzODI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDY3MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzgwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJjb21tZW50IGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCXl5YmVnaW4oWVlJTklUSUFMKTsKLQlyZXR1cm4gWE1MX0NPTU1FTlRfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDY3NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJDREFUQSBlbmQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9DREFUQV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNjc1OiBicmVhazsKLSAgICAgICAgY2FzZSAzNzg6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMKTsKLQlpZih5eWxlbmd0aCgpID4gMikKLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0gMik7Ci0JZkVMbGV2ZWwrKzsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1ZCTF9PUEVOLCBKU1BfVkJMX0NMT1NFKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7Ci0JeXliZWdpbihZWUlOSVRJQUwpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2NzY6IGJyZWFrOwotICAgICAgICBjYXNlIDM3NzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5QRVJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX1BFX1JFRkVSRU5DRTsKLSB9Ci0gICAgICAgIGNhc2UgNjc3OiBicmVhazsKLSAgICAgICAgY2FzZSAzNzY6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUwpOwotCWlmKHl5bGVuZ3RoKCkgPiAyKQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAyKTsKLQlmRUxsZXZlbCsrOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgSlNQX0VMX0NMT1NFKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7Ci0JeXliZWdpbihZWUlOSVRJQUwpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2Nzg6IGJyZWFrOwotICAgICAgICBjYXNlIDM3MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5FbnRpdHlSZWYiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9FTlRJVFlfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSA2Nzk6IGJyZWFrOwotICAgICAgICBjYXNlIDM2NzogCi0gICAgICAgIGNhc2UgNDA3OiAKLSAgICAgICAgY2FzZSA0MTU6IAotICAgICAgICBjYXNlIDQyMjogCi0gICAgICAgIGNhc2UgNDI3OiAKLSAgICAgICAgY2FzZSA0MzI6IAotICAgICAgICBjYXNlIDQzNzogCi0gICAgICAgIGNhc2UgNDQzOiAKLSAgICAgICAgY2FzZSA0NDk6IAotICAgICAgICBjYXNlIDQ1MzogCi0gICAgICAgIGNhc2UgNDU4OiAKLSAgICAgICAgY2FzZSA0NjM6IAotICAgICAgICBjYXNlIDQ2OTogCi0gICAgICAgICAgeyAKLQkvKiBKU1AgZXhwcmVzc2lvbiBiZWd1biAoYW55d2hlcmUpCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUKLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cwotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkCi0JICovCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgewotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyEKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIEpTUF9DT05URU5UOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0JfQotCS8vIGVuZCBzYW5pdHkgY2hlY2tzCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7Ci0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhbiBleHByZXNzaW9uIG91dCBpbiBjb250ZW50Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiXG5KU1AgZXhwcmVzc2lvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7Ci0JCXJldHVybiBKU1BfRVhQUkVTU0lPTl9PUEVOOwotCX0KLQllbHNlIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIkpTUCBleHByZXNzaW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JCX0KLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VYUFJFU1NJT05fT1BFTiwgSlNQX0NMT1NFKTsKLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7Ci0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJCXJldHVybiBCTE9DS19URVhUOwotCQl9Ci0JCS8vIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9ucwotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX1RBR19OQU1FKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JCX0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCXJldHVybiBQUk9YWV9DT05URVhUOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNjgwOiBicmVhazsKLSAgICAgICAgY2FzZSAzNjY6IAotICAgICAgICBjYXNlIDQwNjogCi0gICAgICAgIGNhc2UgNDE0OiAKLSAgICAgICAgY2FzZSA0MjE6IAotICAgICAgICBjYXNlIDQyNjogCi0gICAgICAgIGNhc2UgNDMxOiAKLSAgICAgICAgY2FzZSA0MzY6IAotICAgICAgICBjYXNlIDQ0MjogCi0gICAgICAgIGNhc2UgNDQ4OiAKLSAgICAgICAgY2FzZSA0NTI6IAotICAgICAgICBjYXNlIDQ1NzogCi0gICAgICAgIGNhc2UgNDYyOiAKLSAgICAgICAgY2FzZSA0Njg6IAotICAgICAgICAgIHsgCi0JLyogSlNQIGRlY2xhcmF0aW9uIGJlZ3VuIChhbnl3aGVyZSkKLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzCi0JICogIGR1ZSB0byB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBnZW5lcmF0ZWQKLQkgKi8KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzCi0JaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT05URU5UKSB7Ci0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQotCQl5eXB1c2hiYWNrKDIpOwotCQlyZXR1cm4gSlNQX0NPTlRFTlQ7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsKLQl9Ci0JLy8gZW5kIHNhbml0eSBjaGVja3MKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsKLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgZGVjbGFyYXRpb24gb3V0IGluIGNvbnRlbnQKLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJcbkpTUCBkZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7Ci0JCXJldHVybiBKU1BfREVDTEFSQVRJT05fT1BFTjsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJKU1AgZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgewotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsKLQkJfQotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfREVDTEFSQVRJT05fT1BFTiwgSlNQX0NMT1NFKTsKLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7Ci0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJCXJldHVybiBCTE9DS19URVhUOwotCQl9Ci0JCS8vIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9ucwotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX1RBR19OQU1FKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JCX0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCQl9Ci0JCXJldHVybiBQUk9YWV9DT05URVhUOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNjgxOiBicmVhazsKLSAgICAgICAgY2FzZSAzNjU6IAotICAgICAgICBjYXNlIDQwNTogCi0gICAgICAgIGNhc2UgNDEzOiAKLSAgICAgICAgY2FzZSA0MjA6IAotICAgICAgICBjYXNlIDQyNTogCi0gICAgICAgIGNhc2UgNDMwOiAKLSAgICAgICAgY2FzZSA0MzU6IAotICAgICAgICBjYXNlIDQ0MTogCi0gICAgICAgIGNhc2UgNDQ3OiAKLSAgICAgICAgY2FzZSA0NTE6IAotICAgICAgICBjYXNlIDQ1NjogCi0gICAgICAgIGNhc2UgNDYxOiAKLSAgICAgICAgY2FzZSA0Njc6IAotICAgICAgICAgIHsgCi0JLyogSlNQIGRpcmVjdGl2ZSBiZWd1biAoYW55d2hlcmUpCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUKLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cwotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkCi0JICovCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgewotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyEKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIEpTUF9DT05URU5UOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0JfQotCS8vIGVuZCBzYW5pdHkgY2hlY2tzCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7Ci0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhIGRlY2xhcmF0aW9uIG91dCBpbiBjb250ZW50Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiXG5KU1AgZGlyZWN0aXZlIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSk7Ci0JCXJldHVybiBKU1BfRElSRUNUSVZFX09QRU47Ci0JfQotCWVsc2UgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiSlNQIGRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JCX0KLQkJeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX05BTUUpOwotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9ESVJFQ1RJVkVfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9ESVJFQ1RJVkVfQ0xPU0UsIEpTUF9DTE9TRX0pOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JCX0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQkJfQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2ODI6IGJyZWFrOwotICAgICAgICBjYXNlIDM1NTogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkxfRFFVT1RFU19FTkQpOwotCXJldHVybiBKU1BfVkJMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2ODM6IGJyZWFrOwotICAgICAgICBjYXNlIDM1MTogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkxfU1FVT1RFU19FTkQpOwotCXJldHVybiBKU1BfVkJMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2ODQ6IGJyZWFrOwotICAgICAgICBjYXNlIDM0OTogCi0gICAgICAgICAgeyAKLQlmRUxsZXZlbCsrOwotCWlmKGZFTGxldmVsID09IDEpIHsKLQkJcmV0dXJuIEpTUF9WQkxfT1BFTjsKLQl9Ci0gfQotICAgICAgICBjYXNlIDY4NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM5OiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMX0RRVU9URVNfRU5EKTsKLQlyZXR1cm4gSlNQX0VMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2ODY6IGJyZWFrOwotICAgICAgICBjYXNlIDMzNTogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTF9TUVVPVEVTX0VORCk7Ci0JcmV0dXJuIEpTUF9FTF9RVU9URURfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjg3OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzM6IAotICAgICAgICAgIHsgCi0JLy9TeXN0ZW0ub3V0LnByaW50bG4oSlNQX0VMX0NPTlRFTlQrICI6WyIgKyB5eXRleHQoKSArICJdIik7Ci0JcmV0dXJuIEpTUF9FTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2ODg6IGJyZWFrOwotICAgICAgICBjYXNlIDMzMjogCi0gICAgICAgICAgeyAKLQlmRUxsZXZlbCsrOwotCWlmKGZFTGxldmVsID09IDEpIHsKLQkJcmV0dXJuIEpTUF9FTF9PUEVOOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNjg5OiBicmVhazsKLSAgICAgICAgY2FzZSAzMjk6IAotICAgICAgICAgIHsgCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7Ci0JeXliZWdpbihTVF9KU1BfRFFVT1RFRF9WQkwpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1ZCTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX1ZCTF9DTE9TRSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFfSk7Ci0JLy8gYWJvcnQgZWFybHkgd2hlbiBhbiB1bmVzY2FwZWQgZG91YmxlIHF1b3RlIGlzIGZvdW5kIGluIHRoZSBWQkwKLQlpZihmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFKSkgewotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsKLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCX0KLQllbHNlIHsKLQkJeXliZWdpbihlbnRlclN0YXRlKTsKLQl9Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY5MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI4OiAKLSAgICAgICAgICB7IAotCWludCBlbnRlclN0YXRlID0geXlzdGF0ZSgpOwotCXl5YmVnaW4oU1RfSlNQX0RRVU9URURfRUwpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URX0pOwotCS8vIGFib3J0IGVhcmx5IHdoZW4gYW4gdW5lc2NhcGVkIGRvdWJsZSBxdW90ZSBpcyBmb3VuZCBpbiB0aGUgRUwKLQlpZihmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFKSkgewotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsKLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCX0KLQllbHNlIHsKLQkJeXliZWdpbihlbnRlclN0YXRlKTsKLQl9Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY5MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI2OiAKLSAgICAgICAgICB7IAotCWludCBlbnRlclN0YXRlID0geXlzdGF0ZSgpOwotCXl5YmVnaW4oU1RfSlNQX1NRVU9URURfVkJMKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9WQkxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URX0pOwotCS8vIGFib3J0IGVhcmx5IHdoZW4gYW4gdW5lc2NhcGVkIHNpbmdsZSBxdW90ZSBpcyBmb3VuZCBpbiB0aGUgVkJMCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSkpIHsKLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7Ci0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQl9Ci0JZWxzZSB7Ci0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7Ci0JfQotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2OTI6IGJyZWFrOwotICAgICAgICBjYXNlIDMyNTogCi0gICAgICAgICAgeyAKLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsKLQl5eWJlZ2luKFNUX0pTUF9TUVVPVEVEX0VMKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX0VMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEV9KTsKLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBzaW5nbGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIEVMCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSkpIHsKLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7Ci0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQl9Ci0JZWxzZSB7Ci0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7Ci0JfQotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2OTM6IGJyZWFrOwotICAgICAgICBjYXNlIDMyNDogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWludCBpbmNvbWluZ1N0YXRlID0geXlzdGF0ZSgpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBhdHRyaWJ1dGUgdmFsdWUgc3RhcnQgLSBlbmQgdGFnIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9FTkRfVEFHX09QRU4sIG5ldyBTdHJpbmdbXXtYTUxfVEFHX0NMT1NFLFhNTF9FTVBUWV9UQUdfQ0xPU0V9KTsKLQlpZih5eXN0YXRlKCkgIT0gU1RfQUJPUlRfRU1CRURERUQpCi0gICAgICAgIHl5YmVnaW4oaW5jb21pbmdTdGF0ZSk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY5NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjgzOiAKLSAgICAgICAgY2FzZSAyOTU6IAotICAgICAgICBjYXNlIDMwMTogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUOwotIH0KLSAgICAgICAgY2FzZSA2OTU6IGJyZWFrOwotICAgICAgICBjYXNlIDI3MTogCi0gICAgICAgICAgeyAKLQlTdHJpbmcgdGFnTmFtZSA9IHl5dGV4dCgpLnN1YnN0cmluZygxKTsKLQkvLyBwdXNoYmFjayB0byBqdXN0IGFmdGVyIHRoZSBvcGVuaW5nIGJyYWNrZXQKLQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAxKTsKLQkvKgotCSAqIElmIHRoaXMgdGFnIGNhbiBub3QgYmUgbmVzdGVkIG9yIHdlJ3JlIGFscmVhZHkgc2VhcmNoaW5nIGZvciBhbgotCSAqIGF0dHJpYnV0ZSBuYW1lLCBlcXVhbHMsIG9yIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JaWYgKCFpc05lc3RhYmxlKHRhZ05hbWUpIHx8ICghZlN0YXRlU3RhY2suZW1wdHkoKSAmJiAoZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCBmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0VRVUFMUyB8fCBmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkpKSB7Ci0JCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQkJcmV0dXJuIFhNTF9UQUdfT1BFTjsKLQl9Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBpbiBwbGFjZSBvZiBhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCS8vIGVtYmVkZGVkIGNvbnRhaW5lciBzaG91bGQgYmUgbG9va2luZyBmb3IgdGhlIG5hbWUgKGFnYWluKSBuZXh0Ci0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCWFzc2VtYmxlRW1iZWRkZWRUYWdTZXF1ZW5jZShYTUxfVEFHX09QRU4sIHRhZ05hbWUpOyAvLyA/Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2OTY6IGJyZWFrOwotICAgICAgICBjYXNlIDI2OTogCi0gICAgICAgICAgeyAKLQlTdHJpbmcgdGFnTmFtZSA9IHl5dGV4dCgpLnN1YnN0cmluZygxKTsKLQkvLyBwdXNoYmFjayB0byBqdXN0IGFmdGVyIHRoZSBvcGVuaW5nIGJyYWNrZXQKLQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAxKTsKLQkvKgotCSAqIElmIHRoaXMgdGFnIGNhbiBub3QgYmUgbmVzdGVkIG9yIHdlJ3JlIGFscmVhZHkgc2VhcmNoaW5nIGZvciBhbgotCSAqIGF0dHJpYnV0ZSBuYW1lLCBlcXVhbHMsIG9yIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JaWYgKCFpc05lc3RhYmxlKHRhZ05hbWUpIHx8ICghZlN0YXRlU3RhY2suZW1wdHkoKSAmJiAoZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCBmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0VRVUFMUyB8fCBmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkpKSB7Ci0JCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQkJcmV0dXJuIFhNTF9UQUdfT1BFTjsKLQl9Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBpbiBwbGFjZSBvZiBhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQkvLyBlbWJlZGRlZCBjb250YWluZXIgc2hvdWxkIGJlIGxvb2tpbmcgZm9yIHRoZSBuYW1lIChhZ2FpbikgbmV4dAotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQlhc3NlbWJsZUVtYmVkZGVkVGFnU2VxdWVuY2UoWE1MX1RBR19PUEVOLCB0YWdOYW1lKTsgLy8gPwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCXl5YmVnaW4oU1RfWE1MX0VRVUFMUyk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY5NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY3OiAKLSAgICAgICAgICB7IAotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZW1wdHkgdGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gWE1MX0VNUFRZX1RBR19DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNjk4OiBicmVhazsKLSAgICAgICAgY2FzZSAxMjU6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBhdHRyaWJ1dGUgdmFsdWUgc3RhcnQgLSBjb21wbGV4IGRvdWJsZSBxdW90ZWQiKTsvLyROT04tTkxTLTEkCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSk7Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY5OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIzOiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCB0YWcgZW1iZWRkZWQgbmFtZSBzdGFydCAtIHN0YXJ0IHRhZyIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfVEFHX09QRU4sIG5ldyBTdHJpbmdbXXtYTUxfVEFHX0NMT1NFLFhNTF9FTVBUWV9UQUdfQ0xPU0V9KTsKLQlmU3RhdGVTdGFjay5wb3AoKTsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDcwMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIyOiAKLSAgICAgICAgY2FzZSAxMjc6IAotICAgICAgICBjYXNlIDEyODogCi0gICAgICAgIGNhc2UgMjczOiAKLSAgICAgICAgY2FzZSAyNzc6IAotICAgICAgICBjYXNlIDI3ODogCi0gICAgICAgIGNhc2UgMzg3OiAKLSAgICAgICAgY2FzZSAzOTA6IAotICAgICAgICBjYXNlIDQ4MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgNzAxOiBicmVhazsKLSAgICAgICAgY2FzZSAxMjE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVxdWFscyIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSA3MDI6IGJyZWFrOwotICAgICAgICBjYXNlIDEyMDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0ciBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDcwMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE2OiAKLSAgICAgICAgY2FzZSAxMTc6IAotICAgICAgICBjYXNlIDExODogCi0gICAgICAgIGNhc2UgMjY4OiAKLSAgICAgICAgY2FzZSAzODY6IAotICAgICAgICBjYXNlIDQ4MDogCi0gICAgICAgIGNhc2UgNTIwOiAKLSAgICAgICAgY2FzZSA1MjE6IAotICAgICAgICBjYXNlIDU0MDogCi0gICAgICAgIGNhc2UgNTQxOiAKLSAgICAgICAgY2FzZSA1NTk6IAotICAgICAgICBjYXNlIDU2MDogCi0gICAgICAgIGNhc2UgNTczOiAKLSAgICAgICAgY2FzZSA1ODI6IAotICAgICAgICBjYXNlIDU5MDogCi0gICAgICAgIGNhc2UgNTkyOiAKLSAgICAgICAgY2FzZSA1OTQ6IAotICAgICAgICBjYXNlIDU5NjogCi0gICAgICAgIGNhc2UgNTk5OiAKLSAgICAgICAgY2FzZSA2MDU6IAotICAgICAgICBjYXNlIDYwNjogCi0gICAgICAgIGNhc2UgNjA3OiAKLSAgICAgICAgY2FzZSA2MDg6IAotICAgICAgICBjYXNlIDYwOTogCi0gICAgICAgIGNhc2UgNjE1OiAKLSAgICAgICAgY2FzZSA2MTY6IAotICAgICAgICBjYXNlIDYxNzogCi0gICAgICAgIGNhc2UgNjE4OiAKLSAgICAgICAgY2FzZSA2MTk6IAotICAgICAgICBjYXNlIDYyNTogCi0gICAgICAgIGNhc2UgNjI2OiAKLSAgICAgICAgY2FzZSA2Mjg6IAotICAgICAgICBjYXNlIDYyOTogCi0gICAgICAgIGNhc2UgNjM1OiAKLSAgICAgICAgY2FzZSA2MzY6IAotICAgICAgICBjYXNlIDYzNzogCi0gICAgICAgIGNhc2UgNjM4OiAKLSAgICAgICAgY2FzZSA2NDQ6IAotICAgICAgICBjYXNlIDY0NTogCi0gICAgICAgIGNhc2UgNjQ2OiAKLSAgICAgICAgY2FzZSA2NDc6IAotICAgICAgICBjYXNlIDY1MDogCi0gICAgICAgIGNhc2UgNjUxOiAKLSAgICAgICAgY2FzZSA2NTM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzA0OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWlmKGlzQmxvY2tNYXJrZXIoKSkgewotCQlmRW1iZWRkZWRIaW50ID0gZ2V0QmxvY2tNYXJrZXJDb250ZXh0KCk7Ci0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0JMT0NLX1RBR19TQ0FOOwotICAgICAgICAJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JfQotCWVsc2UKLSAgICAgICAgCXl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDcwNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA3OiAKLSAgICAgICAgY2FzZSAxMTE6IAotICAgICAgICBjYXNlIDI2MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSA3MDY6IGJyZWFrOwotICAgICAgICBjYXNlIDEwNjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZXF1YWxzIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgNzA3OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3MDg6IGJyZWFrOwotICAgICAgICBjYXNlIDEwMjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGRpcmVjdGl2ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0UpOwotCXJldHVybiBKU1BfRElSRUNUSVZFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDcwOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTg6IAotICAgICAgICBjYXNlIDk5OiAKLSAgICAgICAgY2FzZSAxMDA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBjb2RlIGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIGRvU2NhbigiJT4iLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBKU1BfQ09OVEVOVCwgU1RfSlNQX0NPTlRFTlQsIFNUX0pTUF9DT05URU5UKTsKLSB9Ci0gICAgICAgIGNhc2UgNzEwOiBicmVhazsKLSAgICAgICAgY2FzZSA5NDogCi0gICAgICAgIGNhc2UgOTY6IAotICAgICAgICBjYXNlIDk3OiAKLSAgICAgICAgY2FzZSAyNTM6IAotICAgICAgICBjYXNlIDI1NDogCi0gICAgICAgIGNhc2UgMjU3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSA3MTE6IGJyZWFrOwotICAgICAgICBjYXNlIDkzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDcxMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDcxMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzE0OiBicmVhazsKLSAgICAgICAgY2FzZSA4NDogCi0gICAgICAgIGNhc2UgODY6IAotICAgICAgICBjYXNlIDI0NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSA3MTU6IGJyZWFrOwotICAgICAgICBjYXNlIDgzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnPSciKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgNzE2OiBicmVhazsKLSAgICAgICAgY2FzZSA0OTogCi0gICAgICAgIGNhc2UgMTk5OiAKLSAgICAgICAgY2FzZSAyMDA6IAotICAgICAgICBjYXNlIDIwMzogCi0gICAgICAgIGNhc2UgMjEzOiAKLSAgICAgICAgY2FzZSAyMTQ6IAotICAgICAgICBjYXNlIDIxNzogCi0gICAgICAgIGNhc2UgMjE4OiAKLSAgICAgICAgY2FzZSAzNjA6IAotICAgICAgICBjYXNlIDM2MzogCi0gICAgICAgIGNhc2UgNDQ2OiAKLSAgICAgICAgY2FzZSA0NjA6IAotICAgICAgICBjYXNlIDQ2NjogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gSlNQX1ZCTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3MTc6IGJyZWFrOwotICAgICAgICBjYXNlIDQyOiAKLSAgICAgICAgY2FzZSAxNzg6IAotICAgICAgICBjYXNlIDE3OTogCi0gICAgICAgIGNhc2UgMTgyOiAKLSAgICAgICAgY2FzZSAxOTI6IAotICAgICAgICBjYXNlIDE5MzogCi0gICAgICAgIGNhc2UgMTk2OiAKLSAgICAgICAgY2FzZSAxOTc6IAotICAgICAgICBjYXNlIDMzMDogCi0gICAgICAgIGNhc2UgMzQ0OiAKLSAgICAgICAgY2FzZSAzNDc6IAotICAgICAgICBjYXNlIDQxODogCi0gICAgICAgIGNhc2UgNDE5OiAKLSAgICAgICAgY2FzZSA0MzQ6IAotICAgICAgICBjYXNlIDQ0MDogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDcxODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzU6IAotICAgICAgICBjYXNlIDE1OTogCi0gICAgICAgIGNhc2UgMTYwOiAKLSAgICAgICAgY2FzZSAzMjE6IAotICAgICAgICBjYXNlIDQxMjogCi0gICAgICAgIGNhc2UgNDE2OiAKLSAgICAgICAgY2FzZSA0OTU6IAotICAgICAgICBjYXNlIDUyODogCi0gICAgICAgIGNhc2UgNTQ4OiAKLSAgICAgICAgY2FzZSA1NjU6IAotICAgICAgICBjYXNlIDU3NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBjb250ZW50c3BlYyIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3MTk6IGJyZWFrOwotICAgICAgICBjYXNlIDMzOiAKLSAgICAgICAgY2FzZSAxNTI6IAotICAgICAgICBjYXNlIDE1MzogCi0gICAgICAgIGNhc2UgMzExOiAKLSAgICAgICAgY2FzZSA0MDQ6IAotICAgICAgICBjYXNlIDQwODogCi0gICAgICAgIGNhc2UgNDkyOiAKLSAgICAgICAgY2FzZSA1Mjc6IAotICAgICAgICBjYXNlIDU0NzogCi0gICAgICAgIGNhc2UgNTY0OiAKLSAgICAgICAgY2FzZSA1NzQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDcyMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICBjYXNlIDExMjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiaW5hcHByb3ByaWF0ZSB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlpZighZlN0YXRlU3RhY2suZW1wdHkoKSAmJiAoZlN0YXRlU3RhY2sucGVlaygpPT1TVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUR8fGZTdGF0ZVN0YWNrLnBlZWsoKT09U1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKSkgewotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsKLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpLTEpOwotCQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JfQotCXl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3MjE6IGJyZWFrOwotICAgICAgICBjYXNlIDE4OiAKLSAgICAgICAgY2FzZSAxMDQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIndoaXRlIHNwYWNlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfTkFNRSk7Ci0JcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSA3MjI6IGJyZWFrOwotICAgICAgICBjYXNlIDU6IAotICAgICAgICBjYXNlIDg6IAotICAgICAgICBjYXNlIDk6IAotICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgY2FzZSAxNTogCi0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICBjYXNlIDIzOiAKLSAgICAgICAgY2FzZSAyNDogCi0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgIGNhc2UgMjg6IAotICAgICAgICBjYXNlIDI5OiAKLSAgICAgICAgY2FzZSAzMDogCi0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgY2FzZSAzNDogCi0gICAgICAgIGNhc2UgNDA6IAotICAgICAgICBjYXNlIDQxOiAKLSAgICAgICAgY2FzZSA3MjogCi0gICAgICAgIGNhc2UgMTY5OiAKLSAgICAgICAgY2FzZSAxNzQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIndoaXRlIHNwYWNlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDcyMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMDogCi0gICAgICAgIGNhc2UgNTY6IAotICAgICAgICBjYXNlIDU5OiAKLSAgICAgICAgY2FzZSA2MTogCi0gICAgICAgIGNhc2UgMjI1OiAKLSAgICAgICAgY2FzZSAyMjc6IAotICAgICAgICBjYXNlIDIyODogCi0gICAgICAgIGNhc2UgMjMwOiAKLSAgICAgICAgY2FzZSAyMzI6IAotICAgICAgICBjYXNlIDM3MDogCi0gICAgICAgIGNhc2UgMzcxOiAKLSAgICAgICAgY2FzZSAzNzI6IAotICAgICAgICBjYXNlIDQ3NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5YTUwgY29udGVudCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDcyNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTc6IAotICAgICAgICBjYXNlIDEwMTogCi0gICAgICAgIGNhc2UgMTEzOiAKLSAgICAgICAgY2FzZSAxMTk6IAotICAgICAgICBjYXNlIDEyOTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5zdGFydCB0YWcgb3BlbiIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19PUEVOOwotIH0KLSAgICAgICAgY2FzZSA3MjU6IGJyZWFrOwotICAgICAgICBjYXNlIDU4OiAKLSAgICAgICAgY2FzZSA2MDogCi0gICAgICAgIGNhc2UgNjQ6IAotICAgICAgICBjYXNlIDY1OiAKLSAgICAgICAgY2FzZSA2NjogCi0gICAgICAgIGNhc2UgNzA6IAotICAgICAgICBjYXNlIDcxOiAKLSAgICAgICAgY2FzZSA4MTogCi0gICAgICAgIGNhc2UgODU6IAotICAgICAgICBjYXNlIDg3OiAKLSAgICAgICAgY2FzZSA4ODogCi0gICAgICAgIGNhc2UgODk6IAotICAgICAgICBjYXNlIDkxOiAKLSAgICAgICAgY2FzZSA5NTogCi0gICAgICAgIGNhc2UgMTAzOiAKLSAgICAgICAgY2FzZSAxMDg6IAotICAgICAgICBjYXNlIDEwOTogCi0gICAgICAgIGNhc2UgMTEwOiAKLSAgICAgICAgY2FzZSAxMTU6IAotICAgICAgICBjYXNlIDEyNDogCi0gICAgICAgIGNhc2UgMTMxOiAKLSAgICAgICAgY2FzZSAxMzI6IAotICAgICAgICBjYXNlIDEzMzogCi0gICAgICAgIGNhc2UgMTM0OiAKLSAgICAgICAgY2FzZSAxMzY6IAotICAgICAgICBjYXNlIDEzNzogCi0gICAgICAgIGNhc2UgMTM5OiAKLSAgICAgICAgY2FzZSAxNDA6IAotICAgICAgICBjYXNlIDE0MTogCi0gICAgICAgIGNhc2UgMTQ0OiAKLSAgICAgICAgY2FzZSAxNDU6IAotICAgICAgICBjYXNlIDE0NjogCi0gICAgICAgIGNhc2UgMTQ5OiAKLSAgICAgICAgY2FzZSAxNTA6IAotICAgICAgICBjYXNlIDE1MTogCi0gICAgICAgIGNhc2UgMTU2OiAKLSAgICAgICAgY2FzZSAxNTc6IAotICAgICAgICBjYXNlIDE1ODogCi0gICAgICAgIGNhc2UgMTY2OiAKLSAgICAgICAgY2FzZSAxNzE6IAotICAgICAgICBjYXNlIDE3MjogCi0gICAgICAgIGNhc2UgMTc2OiAKLSAgICAgICAgY2FzZSAxNzc6IAotICAgICAgICBjYXNlIDE4NDogCi0gICAgICAgIGNhc2UgMTg1OiAKLSAgICAgICAgY2FzZSAxODc6IAotICAgICAgICBjYXNlIDE4ODogCi0gICAgICAgIGNhc2UgMTk0OiAKLSAgICAgICAgY2FzZSAxOTg6IAotICAgICAgICBjYXNlIDIwNTogCi0gICAgICAgIGNhc2UgMjA2OiAKLSAgICAgICAgY2FzZSAyMDg6IAotICAgICAgICBjYXNlIDIwOTogCi0gICAgICAgIGNhc2UgMjE1OiAKLSAgICAgICAgY2FzZSAyMTk6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiEhIXVuZXhwZWN0ZWQhISE6IFwiIiArIHl5dGV4dCgpICsgIlwiOiIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJeXljaGFyICsgIi0iICsgKHl5Y2hhciArIHl5bGVuZ3RoKCkpKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFVOREVGSU5FRDsKLSB9Ci0gICAgICAgIGNhc2UgNzI2OiBicmVhazsKLSAgICAgICAgY2FzZSA2MjogCi0gICAgICAgIGNhc2UgNjM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkNEQVRBIHRleHQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JU3RyaW5nIHJldHVybmVkQ29udGV4dCA9IGRvU2NhbigiXV0+IiwgZmFsc2UsIHRydWUsIHRydWUsIFhNTF9DREFUQV9URVhULCBTVF9DREFUQV9FTkQsICBTVF9DREFUQV9FTkQpOy8vJE5PTi1OTFMtMSQKLQlpZihyZXR1cm5lZENvbnRleHQgPT0gWE1MX0NEQVRBX1RFWFQpCi0JCXl5YmVnaW4oU1RfQ0RBVEFfRU5EKTsKLQlyZXR1cm4gcmV0dXJuZWRDb250ZXh0OwotIH0KLSAgICAgICAgY2FzZSA3Mjc6IGJyZWFrOwotICAgICAgICBjYXNlIDY3OiAKLSAgICAgICAgY2FzZSAxODY6IAotICAgICAgICBjYXNlIDE4OTogCi0gICAgICAgIGNhc2UgMjA3OiAKLSAgICAgICAgY2FzZSAyMTA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkxJTkUgRkVFRCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDcyODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjg6IAotICAgICAgICBjYXNlIDY5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJjb21tZW50IGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotIH0KLSAgICAgICAgY2FzZSA3Mjk6IGJyZWFrOwotICAgICAgICBjYXNlIDczOiAKLSAgICAgICAgY2FzZSA3NDogCi0gICAgICAgIGNhc2UgNzU6IAotICAgICAgICBjYXNlIDc2OiAKLSAgICAgICAgY2FzZSAyMzc6IAotICAgICAgICBjYXNlIDIzODogCi0gICAgICAgIGNhc2UgMjM5OiAKLSAgICAgICAgY2FzZSAzODM6IAotICAgICAgICBjYXNlIDQ3ODogCi0gICAgICAgIGNhc2UgNDc5OiAKLSAgICAgICAgY2FzZSA1MTg6IAotICAgICAgICBjYXNlIDUxOTogCi0gICAgICAgIGNhc2UgNTM4OiAKLSAgICAgICAgY2FzZSA1NTg6IAotICAgICAgICBjYXNlIDU3MTogCi0gICAgICAgIGNhc2UgNTgxOiAKLSAgICAgICAgY2FzZSA1ODk6IAotICAgICAgICBjYXNlIDU5MTogCi0gICAgICAgIGNhc2UgNTkzOiAKLSAgICAgICAgY2FzZSA1OTU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLSAgICAgICAgeXliZWdpbihTVF9QSV9XUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDczMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzc6IAotICAgICAgICAgIHsgCi0gICAgICAgIHl5YmVnaW4oU1RfUElfQ09OVEVOVCk7Ci0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgNzMxOiBicmVhazsKLSAgICAgICAgY2FzZSA3ODogCi0gICAgICAgIGNhc2UgNzk6IAotICAgICAgICBjYXNlIDgwOiAKLSAgICAgICAgICB7IAotCQkvLyBibG9jayBzY2FuIHVudGlsIGNsb3NlIGlzIGZvdW5kCi0JcmV0dXJuIGRvU2NhbigiPz4iLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBYTUxfUElfQ09OVEVOVCwgU1RfWE1MX1BJX1RBR19DTE9TRSwgU1RfWE1MX1BJX1RBR19DTE9TRSk7Ci0gfQotICAgICAgICBjYXNlIDczMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgODI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzMzOiBicmVhazsKLSAgICAgICAgY2FzZSAxMjY6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBhdHRyaWJ1dGUgdmFsdWUgc3RhcnQgLSBjb21wbGV4IHNpbmdsZSBxdW90ZWQiKTsvLyROT04tTkxTLTEkCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSk7Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA3MzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDEzMDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZGVjbGFyYXRpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzM1OiBicmVhazsKLSAgICAgICAgY2FzZSAxMzU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgdHlwZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzM2OiBicmVhazsKLSAgICAgICAgY2FzZSAxMzg6IAotICAgICAgICBjYXNlIDE0MjogCi0gICAgICAgIGNhc2UgMjg4OiAKLSAgICAgICAgY2FzZSAyOTI6IAotICAgICAgICBjYXNlIDM5OTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBwdWJsaWMgcmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGOwotIH0KLSAgICAgICAgY2FzZSA3Mzc6IGJyZWFrOwotICAgICAgICBjYXNlIDE0MzogCi0gICAgICAgIGNhc2UgMTQ3OiAKLSAgICAgICAgY2FzZSAyOTg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgc3lzdGVtIHJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQl5eWJlZ2luKFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsKLSB9Ci0gICAgICAgIGNhc2UgNzM4OiBicmVhazsKLSAgICAgICAgY2FzZSAxNDg6IAotICAgICAgICBjYXNlIDMwNDogCi0gICAgICAgIGNhc2UgMzA4OiAKLSAgICAgICAgY2FzZSA0MDI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JeXliZWdpbihTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UKTsKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3Mzk6IGJyZWFrOwotICAgICAgICBjYXNlIDE1NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3NDA6IGJyZWFrOwotICAgICAgICBjYXNlIDE1NTogCi0gICAgICAgIGNhc2UgMzE0OiAKLSAgICAgICAgY2FzZSAzMTg6IAotICAgICAgICBjYXNlIDQxMDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCXl5YmVnaW4oU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVCk7Ci0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzQxOiBicmVhazsKLSAgICAgICAgY2FzZSAxNjE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3NDI6IGJyZWFrOwotICAgICAgICBjYXNlIDE2NDogCi0gICAgICAgIGNhc2UgMTY1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkpTUCBjb21tZW50IHRleHQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOwotIH0KLSAgICAgICAgY2FzZSA3NDM6IGJyZWFrOwotICAgICAgICBjYXNlIDE2NzogCi0gICAgICAgIGNhc2UgMTczOiAKLSAgICAgICAgICB7IAotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgNzQ0OiBicmVhazsKLSAgICAgICAgY2FzZSAxNjg6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlpbnQgaW5jb21pbmdTdGF0ZSA9IHl5c3RhdGUoKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgaW5zaWRlIG9mIEpTUCBhdHRyaWJ1dGUgdmFsdWUgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX1RBR19PUEVOLCBuZXcgU3RyaW5nW117WE1MX1RBR19DTE9TRSxYTUxfRU1QVFlfVEFHX0NMT1NFfSk7Ci0JaWYoeXlzdGF0ZSgpICE9IFNUX0FCT1JUX0VNQkVEREVEKQotICAgICAgICB5eWJlZ2luKGluY29taW5nU3RhdGUpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA3NDU6IGJyZWFrOwotICAgICAgICBjYXNlIDE3MDogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3NDY6IGJyZWFrOwotICAgICAgICBjYXNlIDE3NTogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3NDc6IGJyZWFrOwotICAgICAgICBjYXNlIDE4MDogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTF9EUVVPVEVTKTsKLQlyZXR1cm4gSlNQX0VMX0RRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzQ4OiBicmVhazsKLSAgICAgICAgY2FzZSAxODE6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUxfU1FVT1RFUyk7Ci0JcmV0dXJuIEpTUF9FTF9TUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDc0OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTgzOiAKLSAgICAgICAgICB7IAotCWZFTGxldmVsLS07Ci0JaWYoZkVMbGV2ZWwgPT0gMCkgewotCQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JCXJldHVybiBKU1BfRUxfQ0xPU0U7Ci0JfQotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzUwOiBicmVhazsKLSAgICAgICAgY2FzZSAxOTA6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUwpOwotCXJldHVybiBKU1BfRUxfU1FVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3NTE6IGJyZWFrOwotICAgICAgICBjYXNlIDE5MTogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTCk7Ci0JcmV0dXJuIEpTUF9FTF9EUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDc1MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk1OiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfRUxfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDc1MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjAxOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTF9EUVVPVEVTKTsKLQlyZXR1cm4gSlNQX1ZCTF9EUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDc1NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjAyOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTF9TUVVPVEVTKTsKLQlyZXR1cm4gSlNQX1ZCTF9TUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDc1NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA0OiAKLSAgICAgICAgICB7IAotCWZFTGxldmVsLS07Ci0JaWYoZkVMbGV2ZWwgPT0gMCkgewotCQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JCXJldHVybiBKU1BfVkJMX0NMT1NFOwotCX0KLQlyZXR1cm4gSlNQX1ZCTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3NTY6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMTogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkwpOwotCXJldHVybiBKU1BfVkJMX1NRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzU3OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTI6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMKTsKLQlyZXR1cm4gSlNQX1ZCTF9EUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDc1ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE2OiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfVkJMX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3NTk6IGJyZWFrOwotICAgICAgICBjYXNlIDIyMDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5lbmQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9FTkRfVEFHX09QRU47Ci0gfQotICAgICAgICBjYXNlIDc2MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjIxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9QSSk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNzYxOiBicmVhazsKLSAgICAgICAgY2FzZSAyMjI6IAotICAgICAgICBjYXNlIDMxMDogCi0gICAgICAgIGNhc2UgMzIwOiAKLSAgICAgICAgY2FzZSAzMzE6IAotICAgICAgICBjYXNlIDMzNjogCi0gICAgICAgIGNhc2UgMzQwOiAKLSAgICAgICAgY2FzZSAzNDM6IAotICAgICAgICBjYXNlIDM0NjogCi0gICAgICAgIGNhc2UgMzQ4OiAKLSAgICAgICAgY2FzZSAzNTI6IAotICAgICAgICBjYXNlIDM1NjogCi0gICAgICAgIGNhc2UgMzU5OiAKLSAgICAgICAgY2FzZSAzNjI6IAotICAgICAgICAgIHsgCi0JLyogSlNQIHNjcmlwdGxldCBiZWd1biAoYW55d2hlcmUpCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUKLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cwotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkCi0JICovCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgewotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyEKLQkJeXlwdXNoYmFjaygxKTsKLQkJcmV0dXJuIEpTUF9DT05URU5UOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgewotCQl5eXB1c2hiYWNrKDIpOwotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDIpOwotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0JfQotCS8vIGZpbmlzaGVkIHNhbml0eSBjaGVja3MKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsKLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgcmVndWxhciBzY3JpcHRsZXQgb3V0IGluIGNvbnRlbnQKLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJcbkpTUCBzY3JpcHRsZXQgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlyZXR1cm4gSlNQX1NDUklQVExFVF9PUEVOOwotCX0KLQllbHNlIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIkpTUCBzY3JpcHRsZXQgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgewotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsKLQkJfQotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfU0NSSVBUTEVUX09QRU4sIEpTUF9DTE9TRSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgewotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsKLQkJfQotCQkvLyByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnMKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQllbHNlIGlmKCh5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IHl5c3RhdGUoKSA9PSBTVF9YTUxfRVFVQUxTKSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCQl9Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0gfQotICAgICAgICBjYXNlIDc2MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjIzOiAKLSAgICAgICAgICB7IAotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5kZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNzYzOiBicmVhazsKLSAgICAgICAgY2FzZSAyMzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzY0OiBicmVhazsKLSAgICAgICAgY2FzZSAyNDA6IAotICAgICAgICAgIHsgCi0JCS8vIGVuZGVkIHdpdGggbm90aGluZyBpbnNpZGUKLQkJZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3NjU6IGJyZWFrOwotICAgICAgICBjYXNlIDI0MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzY2OiBicmVhazsKLSAgICAgICAgY2FzZSAyNTg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBlbmQiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gSlNQX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3Njc6IGJyZWFrOwotICAgICAgICBjYXNlIDI2MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBKU1BfRElSRUNUSVZFX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3Njg6IGJyZWFrOwotICAgICAgICBjYXNlIDE2MjogCi0gICAgICAgIGNhc2UgMTYzOiAKLSAgICAgICAgICB7IAotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQkgfQotICAgICAgICBjYXNlIDc2OTogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgeXlfZG9fZW9mKCk7Ci0gICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0pTUENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDllZGQ0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0pTUENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkNoYXJzZXROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25NZXNzYWdlOwotCi0vKioKLSAqIFNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIEpTUCBDb3JlIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBub2RlID0gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkpOwotCi0JCS8vIGNvbXBpbGVyL3ZhbGlkYXRpb24gcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXRCb29sZWFuKEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVEVfRlJBR01FTlRTLCB0cnVlKTsKLQotCQkvLyBjb2RlIGdlbmVyYXRpb24gcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkZWZhdWx0RW5jID0gIklTTy04ODU5LTEiOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN5c3RlbUVuYyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5lbmNvZGluZyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzeXN0ZW1FbmMgIT0gbnVsbCkgewotCQkJZGVmYXVsdEVuYyA9IENvbW1vbkNoYXJzZXROYW1lcy5nZXRQcmVmZXJyZWREZWZhdWx0SWFuYU5hbWUoc3lzdGVtRW5jLCAiSVNPLTg4NTktMSIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlub2RlLnB1dChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCwgZGVmYXVsdEVuYyk7Ci0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkVORF9PRl9MSU5FX0NPREUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHRoaXMgY291bGQgYmUgbWFkZSBzbWFydGVyIGJ5IGFjdHVhbGx5IGxvb2tpbmcgdXAgdGhlIGNvbnRlbnQKLQkJLy8gdHlwZSdzIHZhbGlkIGV4dGVuc2lvbnMKLQkJbm9kZS5wdXQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTiwgImpzcCIpOyAvLyROT04tTkxTLTEkCi0KLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfRFVQTElDQVRFX1BSRUZJWEVTX0RJRkZFUkVOVF9VUklTLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX0RVUExJQ0FURV9QUkVGSVhFU19TQU1FX1VSSVMsIFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSk7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX01JU1NJTkdfUFJFRklYLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX01JU1NJTkdfVVJJX09SX1RBR0RJUiwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9VTlJFU09MVkFCTEVfVVJJX09SX1RBR0RJUiwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRElSRUNUSVZFX1BBR0VfU1VQRVJDTEFTU19OT1RfRk9VTkQsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9JTkNMVURFX05PX0ZJTEVfU1BFQ0lGSUVELCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfSU5DTFVERV9GSUxFX05PVF9GT1VORCwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCi0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9KQVZBX0xPQ0FMX1ZBUklBQkxFX05FVkVSX1VTRUQsIFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSk7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9KQVZBX0FSR1VNRU5UX0lTX05FVkVSX1VTRUQsIFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSk7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9KQVZBX05VTExfTE9DQUxfVkFSSUFCTEVfUkVGRVJFTkNFLCBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpOwotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fSkFWQV9QT1RFTlRJQUxfTlVMTF9MT0NBTF9WQVJJQUJMRV9SRUZFUkVOQ0UsIFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSk7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9KQVZBX1VOVVNFRF9JTVBPUlQsIFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSk7Ci0KLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0VMX1NZTlRBWCwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRUxfTEVYRVIsIFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSk7Ci0KLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfTUlTU0lOR19SRVFVSVJFRF9BVFRSSUJVVEUsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfVU5LTk9XTl9BVFRSSUJVVEUsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9OT05fRU1QVFlfSU5MSU5FX1RBRywgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0KLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9WQUxJREFUSU9OX01FU1NBR0UsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9DTEFTU19OT1RfRk9VTkQsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX0NMQVNTX05PVF9JTlNUQU5USUFURUQsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX0NMQVNTX1JVTlRJTUVfRVhDRVBUSU9OLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RBR19IQU5ETEVSX0NMQVNTX05PVF9GT1VORCwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9VU0VCRUFOX0lOVkFMSURfSUQsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJbm9kZS5wdXRJbnQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1VTQkVBTl9NSVNTSU5HX1RZUEVfSU5GTywgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVVNFQkVBTl9BTUJJR1VPVVNfVFlQRV9JTkZPLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0pTUENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTFkYmU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLQotLyoqCi0gKiBDb21tb24gcHJlZmVyZW5jZSBrZXlzIHVzZWQgYnkgSlNQIGNvcmUKLSAqLwotcHVibGljIGNsYXNzIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMgewotCXByaXZhdGUgSlNQQ29yZVByZWZlcmVuY2VOYW1lcygpIHsKLQkJLy8gZW1wdHkgcHJpdmF0ZSBjb25zdHJ1Y3RvciBzbyB1c2VycyBjYW5ub3QgaW5zdGFudGlhdGUgY2xhc3MKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBleHRlbnNpb24gdG8gdXNlIHdoZW4gbm9uZSBpcyBzcGVjaWZpZWQgaW4gdGhlIE5ldyBKU1AgRmlsZQotCSAqIFdpemFyZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVhURU5TSU9OID0gImRlZmF1bHRFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgSlNQIGZyYWdtZW50cyBzaG91bGQgYmUgY29tcGlsZWQvdmFsaWRhdGVkLiBKU1AgZnJhZ21lbnRzCi0JICogd2lsbCBiZSB2YWxpZGF0ZWQgd2hlbiB0cnVlLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRFX0ZSQUdNRU5UUyA9ICJ2YWxpZGF0ZUZyYWdtZW50cyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoYXQgSlNQIHZhbGlkYXRpb24gd2lsbCB1c2UgcGVyLXByb2plY3QgcHJlZmVyZW5jZXMKLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1VTRV9QUk9KRUNUX1NFVFRJTkdTID0gInZhbGlkYXRpb24udXNlLXByb2plY3Qtc2V0dGluZ3MiOwotCi0JLyoqCi0JICogVmFsaWRhdGlvbiBwcmVmZXJlbmNlIGtleXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfRFVQTElDQVRFX1BSRUZJWEVTX0RJRkZFUkVOVF9VUklTPSJ2YWxpZGF0aW9uLmRpcmVjdGl2ZS10YWdsaWItZHVwbGljYXRlLXByZWZpeGVzLWRpZmZlcmVudC11cmlzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX0RVUExJQ0FURV9QUkVGSVhFU19TQU1FX1VSSVM9InZhbGlkYXRpb24uZGlyZWN0aXZlLXRhZ2xpYi1kdXBsaWNhdGUtcHJlZml4ZXMtc2FtZS11cmlzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX01JU1NJTkdfUFJFRklYPSJ2YWxpZGF0aW9uLmRpcmVjdGl2ZS10YWdsaWItbWlzc2luZy1wcmVmaXgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfTUlTU0lOR19VUklfT1JfVEFHRElSPSJ2YWxpZGF0aW9uLmRpcmVjdGl2ZS10YWdsaWItbWlzc2luZy11cmktb3ItdGFnZGlyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX1VOUkVTT0xWQUJMRV9VUklfT1JfVEFHRElSPSJ2YWxpZGF0aW9uLmRpcmVjdGl2ZS10YWdsaWItdW5yZXNvbHZhYmxlLXVyaS1vci10YWdkaXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0RJUkVDVElWRV9QQUdFX1NVUEVSQ0xBU1NfTk9UX0ZPVU5EPSJ2YWxpZGF0aW9uLmRpcmVjdGl2ZS1wYWdlLXN1cGVyY2xhc3Mtbm90LWZvdW5kIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9ESVJFQ1RJVkVfSU5DTFVERV9OT19GSUxFX1NQRUNJRklFRD0idmFsaWRhdGlvbi5kaXJlY3RpdmUtaW5jbHVkZS1mcmFnbWVudC1maWxlLW5vdC1zcGVjaWZpZWQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0RJUkVDVElWRV9JTkNMVURFX0ZJTEVfTk9UX0ZPVU5EPSJ2YWxpZGF0aW9uLmRpcmVjdGl2ZS1pbmNsdWRlLWZyYWdtZW50LWZpbGUtbm90LWZvdW5kIjsvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9KQVZBX0xPQ0FMX1ZBUklBQkxFX05FVkVSX1VTRUQgPSJ2YWxpZGF0aW9uLmphdmEtbG9jYWwtdmFyaWFibGUtaXMtbmV2ZXItdXNlZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9KQVZBX0FSR1VNRU5UX0lTX05FVkVSX1VTRUQgID0idmFsaWRhdGlvbi5qYXZhLSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9KQVZBX05VTExfTE9DQUxfVkFSSUFCTEVfUkVGRVJFTkNFICA9InZhbGlkYXRpb24uamF2YS1udWxsLWxvY2FsLXZhcmlhYmxlLXJlZmVyZW5jZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9KQVZBX1BPVEVOVElBTF9OVUxMX0xPQ0FMX1ZBUklBQkxFX1JFRkVSRU5DRSAgPSJ2YWxpZGF0aW9uLmphdmEtcG90ZW50aWFsLW51bGwtbG9jYWwtdmFyaWFibGUtcmVmZXJlbmNlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0pBVkFfVU5VU0VEX0lNUE9SVCAgPSJ2YWxpZGF0aW9uLmphdmEtdW51c2VkLWltcG9ydCI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9FTF9TWU5UQVggID0idmFsaWRhdGlvbi5lbC1nZW5lcmFsLXN5bnRheCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9FTF9MRVhFUiAgPSJ2YWxpZGF0aW9uLmVsLWxleGljYWwtZmFpbHVyZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfTUlTU0lOR19SRVFVSVJFRF9BVFRSSUJVVEUgPSAidmFsaWRhdGlvbi5hY3Rpb25zLW1pc3NpbmctcmVxdWlyZWQtYXR0cmlidXRlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfVU5LTk9XTl9BVFRSSUJVVEUgPSAidmFsaWRhdGlvbi5hY3Rpb25zLXVua25vd24tYXR0cmlidXRlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfTk9OX0VNUFRZX0lOTElORV9UQUcgPSAidmFsaWRhdGlvbi5hY3Rpb25zLW5vbi1lbXB0eS1pbmxpbmUtdGFnIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9WQUxJREFUSU9OX01FU1NBR0UgPSAidmFsaWRhdGlvbi50cmFuc2xhdGlvbi10ZWktbWVzc2FnZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfTk9UX0ZPVU5EID0gInZhbGlkYXRpb24udHJhbnNsYXRpb24tdGVpLWNsYXNzLW5vdC1mb3VuZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfTk9UX0lOU1RBTlRJQVRFRCA9ICJ2YWxpZGF0aW9uLnRyYW5zbGF0aW9uLXRlaS1jbGFzcy1ub3QtaW5zdGFudGlhdGVkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9DTEFTU19SVU5USU1FX0VYQ0VQVElPTiA9ICJ2YWxpZGF0aW9uLnRyYW5zbGF0aW9uLXRlaS1jbGFzcy1ydW50aW1lLWV4Y2VwdGlvbiI7CQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fVFJBTlNMQVRJT05fVEFHX0hBTkRMRVJfQ0xBU1NfTk9UX0ZPVU5EID0gInZhbGlkYXRpb24udHJhbnNsYXRpb24tdGFnLWNsYXNzLW5vdC1mb3VuZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9UUkFOU0xBVElPTl9VU0VCRUFOX0lOVkFMSURfSUQ9ICJ2YWxpZGF0aW9uLnRyYW5zbGF0aW9uLXVzZWJlYW4taW52YWxpZC1pZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9UUkFOU0xBVElPTl9VU0JFQU5fTUlTU0lOR19UWVBFX0lORk89ICJ2YWxpZGF0aW9uLnRyYW5zbGF0aW9uLXVzZWJlYW4tbWlzc2luZy10eXBlLWluZm8iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fVFJBTlNMQVRJT05fVVNFQkVBTl9BTUJJR1VPVVNfVFlQRV9JTkZPID0gInZhbGlkYXRpb24udHJhbnNsYXRpb24tdXNlYmVhbi1hbWJpZ3VvdXMtdHlwZS1pbmZvIjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSlNQMTFOYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSlNQMTFOYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNkMGY3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0pTUDExTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotCi0vKioKLSAqIEpTUCAxLjEgTmFtZXNwYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSlNQMTFOYW1lc3BhY2UgewotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRWxlbWVudE5hbWUgewotCQkvLyBFbGVtZW50IG5hbWVzCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDUklQVExFVCA9ICJqc3A6c2NyaXB0bGV0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OID0gImpzcDpleHByZXNzaW9uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUNMQVJBVElPTiA9ICJqc3A6ZGVjbGFyYXRpb24iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUkVDVElWRV9QQUdFID0gImpzcDpkaXJlY3RpdmUucGFnZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUSVZFX0lOQ0xVREUgPSAianNwOmRpcmVjdGl2ZS5pbmNsdWRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RJVkVfVEFHTElCID0gImpzcDpkaXJlY3RpdmUudGFnbGliIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VCRUFOID0gImpzcDp1c2VCZWFuIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRQUk9QRVJUWSA9ICJqc3A6c2V0UHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVFBST1BFUlRZID0gImpzcDpnZXRQcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERSA9ICJqc3A6aW5jbHVkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SV0FSRCA9ICJqc3A6Zm9yd2FyZCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOID0gImpzcDpwbHVnaW4iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNUyA9ICJqc3A6cGFyYW1zIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUxMQkFDSyA9ICJqc3A6ZmFsbGJhY2siOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNID0gImpzcDpwYXJhbSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVCA9ICJqc3A6cm9vdCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVCA9ICJqc3A6dGV4dCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1AxMV9VUkkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9UQUdfUFJFRklYID0gImpzcCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBhdHRyaWJ1dGUgbmFtZXMKLQkvLyAgIGRpcmVjdGl2ZS5wYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0xBTkdVQUdFID0gImxhbmd1YWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9FWFRFTkRTID0gImV4dGVuZHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPTlRFTlRfVFlQRSA9ICJjb250ZW50VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSU1QT1JUID0gImltcG9ydCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0VTU0lPTiA9ICJzZXNzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9CVUZGRVIgPSAiYnVmZmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BVVRPRkxVU0ggPSAiYXV0b0ZsdXNoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JU19USFJFQURfU0FGRSA9ICJpc1RocmVhZFNhZmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lORk8gPSAiaW5mbyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRVJST1JfUEFHRSA9ICJlcnJvclBhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lTX0VSUk9SX1BBR0UgPSAiaXNFcnJvclBhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BBR0VfRU5DT0RJTkcgPSAicGFnZUVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgZGlyZWN0aXZlLmluY2x1ZGUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRklMRSA9ICJmaWxlIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgZGlyZWN0aXZlLnRhZ2xpYgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9VUkkgPSAidXJpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QUkVGSVggPSAicHJlZml4IjsgLy8kTk9OLU5MUy0xJAotCS8vICAgdXNlQmVhbgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0NPUEUgPSAic2NvcGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9CRUFOX05BTUUgPSAiYmVhbk5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1RZUEUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIHNldFByb3BlcnR5Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUFJPUEVSVFkgPSAicHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZBTFVFID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QQVJBTSA9ICJwYXJhbSI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIGluY2x1ZGUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUEFHRSA9ICJwYWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9GTFVTSCA9ICJmbHVzaCI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIHBsdWdpbgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT0RFID0gImNvZGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPREVCQVNFID0gImNvZGViYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BTElHTiA9ICJhbGlnbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQVJDSElWRSA9ICJhcmNoaXZlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9IRUlHSFQgPSAiaGVpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9IU1BBQ0UgPSAiaHNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9KUkVWRVJTSU9OID0gImpyZXZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZTUEFDRSA9ICJ2c3BhY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1dJRFRIID0gIndpZHRoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9OU1BMVUdJTlVSTCA9ICJuc3BsdWdpbnVybCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSUVQTFVHSU5VUkwgPSAiaWVwbHVnaW51cmwiOyAvLyROT04tTkxTLTEkCi0JLy8gICByb290Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1hNTE5TX0pTUCA9ICJ4bWxuczpqc3AiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBhdHRyaWJ1dGUgdmFsdWVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9UUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9GQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0pBVkEgPSAiamF2YSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NUX0RFRkFVTFQgPSAidGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiOy8vRDE5NTM2NiAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CVUZTSVpfREVGQVVMVCA9ICI4a2IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9QQUdFID0gInBhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9TRVNTSU9OID0gInNlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SRVFVRVNUID0gInJlcXVlc3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9BUFBMSUNBVElPTiA9ICJhcHBsaWNhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0JFQU4gPSAiYmVhbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0FQUExFVCA9ICJhcHBsZXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9UT1AgPSAidG9wIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTUlERExFID0gIm1pZGRsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0JPVFRPTSA9ICJib3R0b20iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9MRUZUID0gImxlZnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SSUdIVCA9ICJyaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0pWRVIxMSA9ICIxLjEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9YTUxOU19KU1AgPSAiaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSlNQMTJOYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSlNQMTJOYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlmNzZlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0pTUDEyTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi0vKioKLSAqIE5hbWVzIGZvciBKU1AgMS4yIHNwZWMuCi0gKiBDdXJyZW50bHksIGl0IGlzIGp1c3QgdGhlIHNhbWUgYXMgSlNQMTFOYW1lc3BhY2UgaW4gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTUDEyTmFtZXNwYWNlIGV4dGVuZHMgSlNQMTFOYW1lc3BhY2UgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0pTUDIwTmFtZXNwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0pTUDIwTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMWZkZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9KU1AyME5hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotLyoqCi0gKiBOZXcgbmFtZXMgZm9yIEpTUCAyLjAgc3BlYy4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEpTUDIwTmFtZXNwYWNlIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSlNQMjBOYW1lc3BhY2UgewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYyNDZiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzLCB3aXRoIGl0cyBvbmUgZmllbGQsIGlzIGEgY29udmllbmNlIHRvIHByb3ZpZGUgY29tcGlsZS10aW1lCi0gKiBzYWZldHkgd2hlbiByZWZlcmluZyB0byBhIGNvbnRlbnRUeXBlIElELiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkCi0gKiBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluIHBsdWdpbi54bWwgZmlsZS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQ29udGVudFR5cGVJZEZvckpTUCB7Ci0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZCBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluCi0JICogcGx1Z2luLnhtbCBmaWxlLiBOb3RlOiB0aGlzIHZhbHVlIGlzIGludGVudGlhbGx5IHNldCB3aXRoIGRlZmF1bHQKLQkgKiBwcm90ZWN0ZWQgbWV0aG9kIHNvIGl0IHdpbGwgbm90IGJlIGlubGluZWQuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ29udGVudFR5cGVJRF9KU1AgPSBnZXRDb25zdGFudFN0cmluZygpOwotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQgZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbgotCSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBzZXQgd2l0aCBkZWZhdWx0Ci0JICogcHJvdGVjdGVkIG1ldGhvZCBzbyBpdCB3aWxsIG5vdCBiZSBpbmxpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENvbnRlbnRUeXBlSURfSlNQRlJBR01FTlQgPSBnZXRGcmFnbWVudENvbnN0YW50U3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkIGZpZWxkIG11c3QgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgaW4KLQkgKiBwbHVnaW4ueG1sIGZpbGUuIE5vdGU6IHRoaXMgdmFsdWUgaXMgaW50ZW50aWFsbHkgc2V0IHdpdGggZGVmYXVsdAotCSAqIHByb3RlY3RlZCBtZXRob2Qgc28gaXQgd2lsbCBub3QgYmUgaW5saW5lZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDb250ZW50VHlwZUlEX0pTUFRBRyA9IGdldFRhZ0NvbnN0YW50U3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBEb24ndCBhbGxvdyBpbnN0YW50aWF0aW9uLgotCSAqLwotCXByaXZhdGUgQ29udGVudFR5cGVJZEZvckpTUCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlzdGF0aWMgU3RyaW5nIGdldENvbnN0YW50U3RyaW5nKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXN0YXRpYyBTdHJpbmcgZ2V0RnJhZ21lbnRDb25zdGFudFN0cmluZygpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZnJhZ21lbnRzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXN0YXRpYyBTdHJpbmcgZ2V0VGFnQ29uc3RhbnRTdHJpbmcoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ3NvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9JQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5M2RkMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9JQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklDb2RlZFJlc291cmNlUGx1Z2luOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUCB7Ci0JLyoqCi0JICogRXh0cmEgcHJvcGVydGllcyBhcyBwYXJ0IG9mIENvbnRlbnREZXNjcmlwdGlvbiwgaWYgdGhlIGNvbnRlbnQgaXMgSlNQLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZSBDT05URU5UX1RZUEVfQVRUUklCVVRFID0gbmV3IFF1YWxpZmllZE5hbWUoSUNvZGVkUmVzb3VyY2VQbHVnaW4uSUQsICJjb250ZW50VHlwZUF0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lIExBTkdVQUdFX0FUVFJJQlVURSA9IG5ldyBRdWFsaWZpZWROYW1lKElDb2RlZFJlc291cmNlUGx1Z2luLklELCAibGFuZ3VhZ2VBdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZSBDT05URU5UX0ZBTUlMWV9BVFRSSUJVVEUgPSBuZXcgUXVhbGlmaWVkTmFtZShJQ29kZWRSZXNvdXJjZVBsdWdpbi5JRCwgImNvbnRlbnRGYW1pbHlBdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJDsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lKU1BQYXJ0aXRpb25UeXBlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lKU1BQYXJ0aXRpb25UeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWNjMzFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JSlNQUGFydGl0aW9uVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4KLSAqIEl0IGRlZmluZXMgdGhlIHBhcnRpdGlvbiB0eXBlcyBmb3IgSlNQLgotICogQ2xpZW50cyBzaG91bGQgcmVmZXJlbmNlIHRoZSBwYXJ0aXRpb24gdHlwZSBTdHJpbmdzIGRlZmluZWQgaGVyZSBkaXJlY3RseS4KLSAqIAotICogQGRlcHJlY2F0ZWQgdXNlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklKU1BQYXJ0aXRpb25zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUpTUFBhcnRpdGlvblR5cGVzIHsKLQotCVN0cmluZyBKU1BfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLkRFRkFVTFRfSlNQIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfQ09NTUVOVCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLkpTUF9DT01NRU5UIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBKU1BfU0NSSVBUX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLlNDUklQVC4iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9DT05URU5UX0RFTElNSVRFUiA9IEpTUF9TQ1JJUFRfUFJFRklYICsgIkRFTElNSVRFUiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0NPTlRFTlRfSkFWQSA9IEpTUF9TQ1JJUFRfUFJFRklYICsgIkpBVkEiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9DT05URU5UX0pBVkFTQ1JJUFQgPSBKU1BfU0NSSVBUX1BSRUZJWCArICJKQVZBU0NSSVBUIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfREVGQVVMVF9FTCA9IEpTUF9TQ1JJUFRfUFJFRklYICsgIkpTUF9FTCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0RFRkFVTFRfRUwyID0gSlNQX1NDUklQVF9QUkVGSVggKyAiSlNQX0VMMiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgSlNQX0RJUkVDVElWRSA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLkpTUF9ESVJFQ1RJVkUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3JlZ2lvbnMvRE9NSlNQUmVnaW9uQ29udGV4dHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcmVnaW9ucy9ET01KU1BSZWdpb25Db250ZXh0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTNjNTgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcmVnaW9ucy9ET01KU1BSZWdpb25Db250ZXh0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi0vKioKLSAqCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBET01KU1BSZWdpb25Db250ZXh0cyBleHRlbmRzIERPTVJlZ2lvbkNvbnRleHQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9DTE9TRSA9ICJKU1BfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfQ0xPU0UgPSAiSlNQX0NPTU1FTlRfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9PUEVOID0gIkpTUF9DT01NRU5UX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfVEVYVCA9ICJKU1BfQ09NTUVOVF9URVhUIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NPTlRFTlQgPSAiSlNQX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RFQ0xBUkFUSU9OX09QRU4gPSAiSlNQX0RFQ0xBUkFUSU9OX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9DTE9TRSA9ICJKU1BfRElSRUNUSVZFX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ESVJFQ1RJVkVfTkFNRSA9ICJKU1BfRElSRUNUSVZFX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX09QRU4gPSAiSlNQX0RJUkVDVElWRV9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9FTF9DTE9TRSA9ICJKU1BfRUxfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VMX0NPTlRFTlQgPSAiSlNQX0VMX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VMX0RRVU9URSA9ICJKU1BfRUxfRFFVT1RFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VMX09QRU4gPSAiSlNQX0VMX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VMX1FVT1RFRF9DT05URU5UID0gIkpTUF9FTF9RVU9URURfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRUxfU1FVT1RFID0gIkpTUF9FTF9TUVVPVEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VYUFJFU1NJT05fT1BFTiA9ICJKU1BfRVhQUkVTU0lPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1JPT1RfVEFHX05BTUUgPSAiSlNQX1JPT1RfVEFHX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfU0NSSVBUTEVUX09QRU4gPSAiSlNQX1NDUklQVExFVF9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9WQkxfQ0xPU0UgPSAiSlNQX1ZCTF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVkJMX0NPTlRFTlQgPSAiSlNQX1ZCTF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9WQkxfRFFVT1RFID0gIkpTUF9WQkxfRFFVT1RFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9WQkxfT1BFTiA9ICJKU1BfVkJMX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1ZCTF9RVU9URURfQ09OVEVOVCA9ICJKU1BfVkJMX1FVT1RFRF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9WQkxfU1FVT1RFID0gIkpTUF9WQkxfU1FVT1RFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSA9ICJYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUgPSAiWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliQ2xhc3NMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFnbGliL1RhZ2xpYkNsYXNzTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NzA2Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliQ2xhc3NMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhZ2xpYjsKLQotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotCi0vKioKLSAqIEN1c3RvbSBjbGFzc2xvYWRlciB3aGljaCBhbGxvd3MgeW91IHRvIGFkZCBzb3VyY2UgZGlyZWN0b3JpZXMgKGZvbGRlcnMKLSAqIGNvbnRhaW5pbmcgLmNsYXNzIGZpbGVzKSBhbmQgamFycyB0byB0aGUgY2xhc3NwYXRoLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgVGFnbGliQ2xhc3NMb2FkZXIgZXh0ZW5kcyBDbGFzc0xvYWRlciB7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RhZ2xpYmNsYXNzbG9hZGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgTGlzdCBqYXJzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIExpc3QgZGlyc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBMaXN0IHVzZWRKYXJzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTGlzdCB1c2VkRGlycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgTWFwIGZhaWxlZENsYXNzZXMgPSBuZXcgSGFzaE1hcCgpOyAvLyBDTDogYWRkZWQgdG8gb3B0aW1pemUKLQkJCQkJCQkJCQkJCQkvLyBmYWlsZWQgbG9hZGluZwotCi0JLy8gcHJpdmF0ZSBMaXN0IGxvYWRlZENsYXNzRmlsZW5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIFRhZ2xpYkNsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudExvYWRlcikgewotCQlzdXBlcihwYXJlbnRMb2FkZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgamFyIHRvIGNsYXNzcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUgLQotCSAqICAgICAgICAgICAgZnVsbCBwYXRoIHRvIHRoZSBqYXIgZmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEphcihTdHJpbmcgZmlsZW5hbWUpIHsKLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0cnlpbmcgdG8gYWRkOiBbIiArIGZpbGVuYW1lICsgIl0gdG8gY2xhc3NwYXRoIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkvLyBkb24ndCBhZGQgdGhlIHNhbWUgZW50cnkgdHdpY2UsIG9yIHNlYXJjaCB0aW1lcyB3aWxsIGdldCBldmVuIHdvcnNlCi0JCWlmICghamFyc0xpc3QuY29udGFpbnMoZmlsZW5hbWUpKSB7Ci0JCQlqYXJzTGlzdC5hZGQoZmlsZW5hbWUpOwotCQkJZmFpbGVkQ2xhc3NlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgKyBbIiArIGZpbGVuYW1lICsgIl0gYWRkZWQgdG8gY2xhc3NwYXRoIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGphciBmcm9tIHRoZSBjbGFzc3BhdGguCi0JICogCi0JICogQHBhcmFtIGZpbGVuYW1lIC0KLQkgKiAgICAgICAgICAgIGZ1bGwgcGF0aCB0byB0aGUgamFyIGZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVKYXIoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCWphcnNMaXN0LnJlbW92ZShmaWxlbmFtZSk7Ci0JCWZhaWxlZENsYXNzZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlbW92ZWQ6IFsiICsgZmlsZW5hbWUgKyAiXSBmcm9tIGNsYXNzcGF0aCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREaXJlY3RvcnkoU3RyaW5nIGRpclBhdGgpIHsKLQkJaWYgKCFkaXJzTGlzdC5jb250YWlucyhkaXJQYXRoKSkgewotCQkJZGlyc0xpc3QuYWRkKGRpclBhdGgpOwotCQkJZmFpbGVkQ2xhc3NlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJhZGRlZDogWyIgKyBkaXJQYXRoICsgIl0gdG8gY2xhc3NwYXRoIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGRpcmVjdG9yeSBmcm9tIHRoZSBjbGFzc3BhdGguCi0JICogCi0JICogQHBhcmFtIGRpclBhdGggLQotCSAqICAgICAgICAgICAgZnVsbCBwYXRoIG9mIHRoZSBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVEaXJlY3RvcnkoU3RyaW5nIGRpclBhdGgpIHsKLQkJZGlyc0xpc3QucmVtb3ZlKGRpclBhdGgpOwotCQlmYWlsZWRDbGFzc2VzID0gbmV3IEhhc2hNYXAoKTsKLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZW1vdmVkOiBbIiArIGRpclBhdGggKyAiXSBmcm9tIGNsYXNzcGF0aCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIEpBUnMgb24gdGhpcyBsb2FkZXIncyBjbGFzc3BhdGggdGhhdCBjb250YWluCi0JICogY2xhc3NlcyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQuCi0JICogCi0JICogQHJldHVybiBMaXN0IC0gdGhlIGxpc3Qgb2YgSkFScwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEphcnNJblVzZSgpIHsKLQkJcmV0dXJuIHVzZWRKYXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGRpcmVjdG9yaWVzIG9uIHRoaXMgbG9hZGVyJ3MgY2xhc3NwYXRoIHRoYXQgY29udGFpbgotCSAqIGNsYXNzZXMgdGhhdCBoYXZlIGJlZW4gbG9hZGVkLgotCSAqIAotCSAqIEByZXR1cm4gTGlzdCAtIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIChmdWxseS1xdWFsaWZpZWQgZmlsZW5hbWUKLQkgKiAgICAgICAgIFN0cmluZ3MpCi0JICovCi0JcHVibGljIExpc3QgZ2V0RGlyZWN0b3JpZXNJblVzZSgpIHsKLQkJcmV0dXJuIHVzZWREaXJzOwotCX0KLQkKLQlNYXAgZ2V0RmFpbHVyZXMoKSB7Ci0JCXJldHVybiBmYWlsZWRDbGFzc2VzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGZpbGVuYW1lcyBmb3IgbG9vc2UgY2xhc3NlcyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQgb3V0Ci0JICogb2YgZGlyZWN0b3JpZXMuCi0JICogCi0JICogQHJldHVybiBMaXN0IC0gdGhlIGxpc3Qgb2YgY2xhc3MgZmlsZW5hbWVzCi0JICovCi0JLy8gcHVibGljIExpc3QgZ2V0Q2xhc3NGaWxlbmFtZXNGcm9tRGlyZWN0b3JpZXMoKSB7Ci0JLy8gcmV0dXJuIGxvYWRlZENsYXNzRmlsZW5hbWVzOwotCS8vIH0KLQkvKioKLQkgKiBTZWFyY2hlcyBmb3IgdGhlIGdpdmVuIGNsYXNzIG5hbWUgb24gdGhlIGRlZmluZWQgY2xhc3NwYXRoIC0KLQkgKiBkaXJlY3RvcmllcyBhcmUgY2hlY2tlZCBiZWZvcmUgSkFScy4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NOYW1lIC0KLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBmaW5kCi0JICogQHJldHVybiBDbGFzcyAtIHRoZSBsb2FkZWQgY2xhc3MKLQkgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIENsYXNzIGZpbmRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCUNsYXNzIG9sZENsYXNzID0gZmluZExvYWRlZENsYXNzKGNsYXNzTmFtZSk7Ci0JCWlmIChvbGRDbGFzcyAhPSBudWxsKSB7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCI+PiBUYWdsaWJDbGFzc0xvYWRlciAiICsgdGhpcyArICIgcmV0dXJuaW5nIGV4aXN0aW5nIGNsYXNzOiAiICsgY2xhc3NOYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gb2xkQ2xhc3M7Ci0JCX0KLQkJaWYgKGZhaWxlZENsYXNzZXMuY29udGFpbnNLZXkoY2xhc3NOYW1lKSkgewotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPj4gVGFnbGliQ2xhc3NMb2FkZXIgIiArIHRoaXMgKyAiIGtub3duIG1pc3NpbmcgY2xhc3M6ICIgKyBjbGFzc05hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+IFRhZ2xpYkNsYXNzTG9hZGVyICIgKyB0aGlzICsgIiBmaW5kaW5nIGNsYXNzOiAiICsgY2xhc3NOYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJQ2xhc3MgbmV3Q2xhc3MgPSBudWxsOwotCQlKYXJGaWxlIGphcmZpbGUgPSBudWxsOwotCQlKYXJFbnRyeSBlbnRyeSA9IG51bGw7Ci0KLQkJLy8gZ2V0IHRoZSBjb3JyZWN0IG5hbWUgb2YgdGhlIGFjdHVhbCAuY2xhc3MgZmlsZSB0byBzZWFyY2ggZm9yCi0JCVN0cmluZyBmaWxlTmFtZSA9IGNhbGN1bGF0ZUNsYXNzRmlsZW5hbWUoY2xhc3NOYW1lKTsKLQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGZpcnN0IHRyeSBzZWFyY2hpbmcgdGhlIGNsYXNzcGF0aCBkaXJlY3RvcmllcwotCQkJSXRlcmF0b3IgZGlycyA9IGRpcnNMaXN0Lml0ZXJhdG9yKCk7Ci0JCQlGaWxlIGY7Ci0JCQlTdHJpbmcgZGlyTmFtZTsKLQkJCVN0cmluZyBmaWxlVG9GaW5kID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlIChkaXJzLmhhc05leHQoKSkgewotCQkJCWRpck5hbWUgPSAoU3RyaW5nKSBkaXJzLm5leHQoKTsKLQkJCQlmaWxlVG9GaW5kID0gZGlyTmFtZSArICIvIiArIGZpbGVOYW1lOyAvLyROT04tTkxTLTEkCi0KLQkJCQlmID0gbmV3IEZpbGUoZmlsZVRvRmluZCk7Ci0JCQkJaWYgKGYuZXhpc3RzKCkpIHsKLQkJCQkJc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmKTsKLQkJCQkJdXNlZERpcnMuYWRkKGRpck5hbWUpOwotCQkJCQkvLyBsb2FkZWRDbGFzc0ZpbGVuYW1lcy5hZGQoZmlsZVRvRmluZCk7Ci0JCQkJCWlmIChERUJVRykKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPj4gYWRkZWQgZmlsZSBmcm9tIGRpcjogIiArIGRpck5hbWUgKyAiLyIgKyBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlicmVhazsKLQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJLy8gZm91bmQgYSBjbGFzcyBmcm9tIGEgZGlyZWN0b3J5Ci0JCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzIwNDhdOwotCQkJCXdoaWxlIChzdHJlYW0uYXZhaWxhYmxlKCkgPiAwKSB7Ci0JCQkJCWludCBhbW91bnRSZWFkID0gc3RyZWFtLnJlYWQoYnVmZmVyKTsKLQkJCQkJaWYoYW1vdW50UmVhZCA+IDApIHsKLQkJCQkJCWJ5dGVTdHJlYW0ud3JpdGUoYnVmZmVyLCAwLCBhbW91bnRSZWFkKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWJ5dGVbXSBieXRlQXJyYXkgPSBieXRlU3RyZWFtLnRvQnl0ZUFycmF5KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKERFQlVHKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCI+PiBkZWZpbmluZyBuZXdDbGFzczoiICsgY2xhc3NOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQluZXdDbGFzcyA9IGRlZmluZUNsYXNzKGNsYXNzTmFtZSwgYnl0ZUFycmF5LCAwLCBieXRlQXJyYXkubGVuZ3RoKTsKLQkJCQkJcmVzb2x2ZUNsYXNzKG5ld0NsYXNzKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkVycm9yIGxvYWRpbmcgVEVJIGNsYXNzICIgKyBjbGFzc05hbWUsIHQpOwotCi0JCQkJCS8vIGo5IGNhbiBnaXZlIENsYXNzQ2lyY3VsYXJpdHlFcnJvcgotCQkJCQkvLyBwYXJlbnQgc2hvdWxkIGFscmVhZHkgaGF2ZSB0aGUgY2xhc3MgdGhlbgotCQkJCQkvLyB0cnkgcGFyZW50IGxvYWRlcgotCQkJCQl0cnkgewotCQkJCQkJQ2xhc3MgYyA9IGdldFBhcmVudCgpLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJCQkJaWYgKERFQlVHKQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPj4gbG9hZGVkOiAiICsgY2xhc3NOYW1lICsgIiB3aXRoOiAiICsgZ2V0UGFyZW50KCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCXJldHVybiBjOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZikgewotCQkJCQkJaWYgKERFQlVHKQotCQkJCQkJCWNuZi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQotCQkJaWYgKHN0cmVhbSA9PSBudWxsKSB7Ci0JCQkJLy8gc3RpbGwgaGF2ZW4ndCBmb3VuZCB0aGUgY2xhc3MsIHNvIG5vdyB0cnkgc2VhcmNoaW5nIHRoZQotCQkJCS8vIGphcnMKLQkJCQkvLyBzZWFyY2ggZWFjaCBvZiB0aGUgamFycyB1bnRpbCB3ZSBmaW5kIGFuIGVudHJ5IG1hdGNoaW5nIHRoZQotCQkJCS8vIGNsYXNzbmFtZQotCQkJCUl0ZXJhdG9yIGphcnMgPSBqYXJzTGlzdC5pdGVyYXRvcigpOwotCQkJCVN0cmluZyBqYXJOYW1lOwotCQkJCXdoaWxlIChqYXJzLmhhc05leHQoKSkgewotCQkJCQlqYXJOYW1lID0gKFN0cmluZykgamFycy5uZXh0KCk7Ci0KLQkJCQkJLy8gbWFrZSBzdXJlIHRoZSBmaWxlIGV4aXN0cyBvciAibmV3IEphckZpbGUoKSIgd2lsbCB0aHJvdwotCQkJCQkvLyBhbiBleGNlcHRpb24KLQkJCQkJZiA9IG5ldyBGaWxlKGphck5hbWUpOwotCQkJCQlpZiAoIWYuZXhpc3RzKCkpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQlqYXJmaWxlID0gbmV3IEphckZpbGUoamFyTmFtZSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWlmIChERUJVRykKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJiYWQgamFyIGZpbGUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWlmIChqYXJmaWxlID09IG51bGwpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJZW50cnkgPSBqYXJmaWxlLmdldEphckVudHJ5KGZpbGVOYW1lKTsKLQotCQkJCQlpZiAoREVCVUcpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvb2tpbmcgZm9yIGZpbGVuYW1lOiAiICsgZmlsZU5hbWUgKyAiIGluOiAiICsgamFyZmlsZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQkJCWlmIChERUJVRykKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIHRoZSBlbnRyeTogIiArIGVudHJ5ICsgIiBmb3IgZmlsZW5hbWU6ICIgKyBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLy8gZm91bmQgdGhlIGNsYXNzCi0JCQkJCQlpZiAoIXVzZWRKYXJzLmNvbnRhaW5zKGphck5hbWUpKSB7Ci0JCQkJCQkJLy8gYWRkIHRoZSBqYXIgdG8gdGhlIGxpc3Qgb2YgaW4tdXNlIGphcnMKLQkJCQkJCQl1c2VkSmFycy5hZGQoamFyTmFtZSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlqYXJmaWxlLmNsb3NlKCk7Ci0JCQkJfQotCi0JCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQkJLy8gd2UndmUgZm91bmQgYW4gZW50cnkgZm9yIHRoZSBkZXNpcmVkIGNsYXNzCi0JCQkJCXN0cmVhbSA9IGphcmZpbGUuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOwotCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZVN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQkJbG9uZyBieXRlTGVuZ3RoID0gZW50cnkuZ2V0U2l6ZSgpOwotCQkJCQlsb25nIHRvdGFsQnl0ZXNSZWFkID0gMDsKLQkJCQkJaW50IGJ5dGVzUmVhZDsKLQkJCQkJYnl0ZVtdIGJ5dGVCdWZmZXIgPSBuZXcgYnl0ZVsxMDAwMF07Ci0JCQkJCXdoaWxlICh0b3RhbEJ5dGVzUmVhZCA8IGJ5dGVMZW5ndGgpIHsKLQkJCQkJCWJ5dGVzUmVhZCA9IHN0cmVhbS5yZWFkKGJ5dGVCdWZmZXIpOwotCQkJCQkJaWYgKGJ5dGVzUmVhZCA9PSAtMSkgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJdG90YWxCeXRlc1JlYWQgPSB0b3RhbEJ5dGVzUmVhZCArIGJ5dGVzUmVhZDsKLQkJCQkJCWJ5dGVTdHJlYW0ud3JpdGUoYnl0ZUJ1ZmZlciwgMCwgYnl0ZXNSZWFkKTsKLQkJCQkJfQotCi0JCQkJCWJ5dGVbXSBieXRlQXJyYXkgPSBieXRlU3RyZWFtLnRvQnl0ZUFycmF5KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoREVCVUcpCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCI+PiBkZWZpbmluZyBuZXdDbGFzczoiICsgY2xhc3NOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8gZGVmaW5lIHRoZSBjbGFzcyBmcm9tIHRoZSBieXRlIGFycmF5Ci0JCQkJCQluZXdDbGFzcyA9IGRlZmluZUNsYXNzKGNsYXNzTmFtZSwgYnl0ZUFycmF5LCAwLCBieXRlQXJyYXkubGVuZ3RoKTsKLQkJCQkJCXJlc29sdmVDbGFzcyhuZXdDbGFzcyk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFcnJvciBsb2FkaW5nIFRFSSBjbGFzcyAiICsgY2xhc3NOYW1lLCB0KTsKLQkJCQkJCS8vIGo5IGNhbiBnaXZlIENsYXNzQ2lyY3VsYXJpdHlFcnJvcgotCQkJCQkJLy8gcGFyZW50IHNob3VsZCBhbHJlYWR5IGhhdmUgdGhlIGNsYXNzIHRoZW4KLQotCQkJCQkJLy8gdHJ5IHBhcmVudAotCQkJCQkJdHJ5IHsKLQkJCQkJCQlDbGFzcyBjID0gZ2V0UGFyZW50KCkubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JCQkJCQkJaWYgKERFQlVHKQotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+IGxvYWRlZDogIiArIGNsYXNzTmFtZSArICIgd2l0aDogIiArIGdldFBhcmVudCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJcmV0dXJuIGM7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmYpIHsKLQkJCQkJCQlpZiAoREVCVUcpCi0JCQkJCQkJCWNuZi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQlmYWlsZWRDbGFzc2VzLnB1dChjbGFzc05hbWUsIGNuZik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQkJCWphcmZpbGUuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlmYWlsZWRDbGFzc2VzLnB1dChjbGFzc05hbWUsIHQpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChzdHJlYW0gIT0gbnVsbCkgewotCQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCQl9Ci0JCQkJaWYgKGphcmZpbGUgIT0gbnVsbCkgewotCQkJCQlqYXJmaWxlLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCS8vIGlvZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkvLyBqdXN0IHRyeWluZyB0byBjbG9zZSBkb3duIGFueXdheSAtIGlnbm9yZQotCQkJfQotCQl9Ci0KLQkJaWYgKG5ld0NsYXNzICE9IG51bGwpIHsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+IGxvYWRlZDogIiArIG5ld0NsYXNzICsgIiB3aXRoOiAiICsgdGhpcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIG5ld0NsYXNzOwotCQl9Ci0KLS8vCQlmYWlsZWRDbGFzc2VzLmFkZChjbGFzc05hbWUpOwotCQl0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2VzICcuJyBpbiB0aGUgY2xhc3NuYW1lIHdpdGggJy8nIGFuZCBhcHBlbmRzICcuY2xhc3MnIGlmIG5lZWRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBwcm9wZXJseS1mb3JtZWQgY2xhc3MgbmFtZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGNhbGN1bGF0ZUNsYXNzRmlsZW5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZS5yZXBsYWNlKCcuJywgJy8nKSk7Ci0JCWlmICghbmFtZS5lbmRzV2l0aCgiLmNsYXNzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZCgiLmNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFnbGliL1RhZ2xpYkhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODViZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGFnbGliOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnQXR0cmlidXRlSW5mbzsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRGF0YTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdJbmZvOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdMaWJyYXJ5SW5mbzsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlZhcmlhYmxlSW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRhZ2xpYlRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMRFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLklKU1BQcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBoZWxwcyBmaW5kIFRhZ2xpYlZhcmlhYmxlcyBpbiBhIEpTUCBmaWxlLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgVGFnbGliSGVscGVyIHsKLQotCS8vIGZvciBkZWJ1Z2dpbmcKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGFnbGlidmFycyIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIElQcm9qZWN0IGZQcm9qZWN0ID0gbnVsbDsKLQlwcml2YXRlIFRhZ2xpYkNsYXNzTG9hZGVyIGZMb2FkZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBTZXQgZlByb2plY3RFbnRyaWVzID0gbnVsbDsKLQlwcml2YXRlIE1hcCBmVHJhbnNsYXRpb25Qcm9ibGVtcyA9IG51bGw7Ci0JcHJpdmF0ZSBTZXQgZkNvbnRhaW5lckVudHJpZXMgPSBudWxsOwotCXByaXZhdGUgSUphdmFQcm9qZWN0IGZKYXZhUHJvamVjdDsKLQotCXB1YmxpYyBUYWdsaWJIZWxwZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlzZXRQcm9qZWN0KHByb2plY3QpOwotCQlmUHJvamVjdEVudHJpZXMgPSBuZXcgSGFzaFNldCgpOwotCQlmQ29udGFpbmVyRW50cmllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZUcmFuc2xhdGlvblByb2JsZW1zID0gbmV3IEhhc2hNYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFnVG9BZGQKLQkgKiAgICAgICAgICAgIGlzIHRoZSBuYW1lIG9mIHRoZSB0YWcgd2hvc2UgdmFyaWFibGVzIHdlIHdhbnQKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvYwotCSAqICAgICAgICAgICAgaXMgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgd2hlcmUgdGhlIHRhZyBpcyBmb3VuZAotCSAqIEBwYXJhbSBjdXN0b21UYWcKLQkgKiAgICAgICAgICAgIGlzIHRoZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9wZW5pbmcgdGFnIGZvciB0aGUgY3VzdG9tCi0JICogICAgICAgICAgICB0YWcKLQkgKi8KLQlwdWJsaWMgVGFnbGliVmFyaWFibGVbXSBnZXRUYWdsaWJWYXJpYWJsZXMoU3RyaW5nIHRhZ1RvQWRkLCBJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2MsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjdXN0b21UYWcpIHsKLQotCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgcHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1vZGVsUXVlcnkgbXEgPSBnZXRNb2RlbFF1ZXJ5KHN0cnVjdHVyZWREb2MpOwotCQlpZiAobXEgIT0gbnVsbCkgewotCQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgbWdyID0gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcihzdHJ1Y3R1cmVkRG9jKTsKLQotCQkJLy8gVGFnbGliU3VwcG9ydCBzdXBwb3J0ID0gKChUYWdsaWJNb2RlbFF1ZXJ5KQotCQkJLy8gbXEpLmdldFRhZ2xpYlN1cHBvcnQoKTsKLQkJCWlmIChtZ3IgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IFRhZ2xpYlZhcmlhYmxlWzBdOwotCi0JCQlMaXN0IHRyYWNrZXJzID0gbWdyLmdldENNRG9jdW1lbnRUcmFja2VycygtMSk7Ci0JCQlJdGVyYXRvciB0YWdsaWJzID0gdHJhY2tlcnMuaXRlcmF0b3IoKTsKLQotCQkJLy8gVGFnbGliU3VwcG9ydCBzdXBwb3J0ID0gKChUYWdsaWJNb2RlbFF1ZXJ5KQotCQkJLy8gbXEpLmdldFRhZ2xpYlN1cHBvcnQoKTsKLQkJCS8vIGlmIChzdXBwb3J0ID09IG51bGwpCi0JCQkvLyByZXR1cm4gbmV3IFRhZ2xpYlZhcmlhYmxlWzBdOwotCQkJLy8KLQkJCS8vIEl0ZXJhdG9yIHRhZ2xpYnMgPQotCQkJLy8gc3VwcG9ydC5nZXRDTURvY3VtZW50cyhjdXN0b21UYWcuZ2V0U3RhcnRPZmZzZXQoKSkuaXRlcmF0b3IoKTsKLQkJCUNNRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJCUNNTmFtZWROb2RlTWFwIGVsZW1lbnRzID0gbnVsbDsKLQkJCXdoaWxlICh0YWdsaWJzLmhhc05leHQoKSkgewotCQkJCWRvYyA9IChDTURvY3VtZW50KSB0YWdsaWJzLm5leHQoKTsKLQkJCQlDTU5vZGUgbm9kZSA9IG51bGw7Ci0JCQkJaWYgKChlbGVtZW50cyA9IGRvYy5nZXRFbGVtZW50cygpKSAhPSBudWxsICYmIChub2RlID0gZWxlbWVudHMuZ2V0TmFtZWRJdGVtKHRhZ1RvQWRkKSkgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pIHsKLQotCQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIENNTm9kZVdyYXBwZXIpIHsKLQkJCQkJCW5vZGUgPSAoKENNTm9kZVdyYXBwZXIpIG5vZGUpLmdldE9yaWdpbk5vZGUoKTsKLQkJCQkJfQotCQkJCQlUTERFbGVtZW50RGVjbGFyYXRpb24gdGxkRWxlbWVudERlY2wgPSAoVExERWxlbWVudERlY2xhcmF0aW9uKSBub2RlOwotCi0JCQkJCS8qCi0JCQkJCSAqIEFsdGhvdWdoIGNsZWFybHkgbm90IHRoZSByaWdodCBwbGFjZSB0byBhZGQgdmFsaWRhdGlvbgotCQkJCQkgKiBkZXNpZ24td2lzZSwgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIHRoZQotCQkJCQkgKiBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gdmFsaWRhdGUgdGhlIHRhZyBjbGFzcy4KLQkJCQkJICovCi0JCQkJCXZhbGlkYXRlVGFnQ2xhc3Moc3RydWN0dXJlZERvYywgY3VzdG9tVGFnLCB0bGRFbGVtZW50RGVjbCwgcHJvYmxlbXMpOwotCi0JCQkJCS8vIDEuMisgdGFnbGliIHN0eWxlCi0JCQkJCWFkZFZhcmlhYmxlcyhyZXN1bHRzLCBub2RlLCBjdXN0b21UYWcpOwotCi0JCQkJCS8vIGZvciAxLjEgbmVlZCBtb3JlIGluZm8gZnJvbSB0YWdsaWIgdHJhY2tlcgotCQkJCQlpZiAoZG9jIGluc3RhbmNlb2YgVGFnbGliVHJhY2tlcikgewotCQkJCQkJU3RyaW5nIHVyaSA9ICgoVGFnbGliVHJhY2tlcikgZG9jKS5nZXRVUkkoKTsKLQkJCQkJCVN0cmluZyBwcmVmaXggPSAoKFRhZ2xpYlRyYWNrZXIpIGRvYykuZ2V0UHJlZml4KCk7Ci0JCQkJCQkvLyBvbmx5IGZvciAxLjEgdGFnbGlicwotCQkJCQkJYWRkVEVJVmFyaWFibGVzKHN0cnVjdHVyZWREb2MsIGN1c3RvbVRhZywgcmVzdWx0cywgdGxkRWxlbWVudERlY2wsIHByZWZpeCwgdXJpLCBwcm9ibGVtcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJUGF0aCBsb2NhdGlvbiA9IFRhZ2xpYkNvbnRyb2xsZXIuZ2V0TG9jYXRpb24oc3RydWN0dXJlZERvYyk7Ci0JCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQlmVHJhbnNsYXRpb25Qcm9ibGVtcy5wdXQobG9jYXRpb24sIHByb2JsZW1zKTsKLQkJfQotCi0JCXJldHVybiAoVGFnbGliVmFyaWFibGVbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBUYWdsaWJWYXJpYWJsZVtyZXN1bHRzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIEFkZHMgMS4yIHN0eWxlIFRhZ2xpYlZhcmlhYmxlcyB0byB0aGUgcmVzdWx0cyBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRzCi0JICogICAgICAgICAgICBsaXN0IHdoZXJlIHRoZSA8Y29kZT5UYWdsaWJWYXJpYWJsZTwvY29kZT4gcyBhcmUgYWRkZWQKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRWYXJpYWJsZXMoTGlzdCByZXN1bHRzLCBDTU5vZGUgbm9kZSwgSVRleHRSZWdpb25Db2xsZWN0aW9uIGN1c3RvbVRhZykgewotCi0JCUxpc3QgbGlzdCA9ICgoVExERWxlbWVudERlY2xhcmF0aW9uKSBub2RlKS5nZXRWYXJpYWJsZXMoKTsKLQkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVRMRFZhcmlhYmxlIHZhciA9IChUTERWYXJpYWJsZSkgaXQubmV4dCgpOwotCQkJaWYgKCF2YXIuZ2V0RGVjbGFyZSgpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlTdHJpbmcgdmFyTmFtZSA9IHZhci5nZXROYW1lR2l2ZW4oKTsKLQkJCWlmICh2YXJOYW1lID09IG51bGwpIHsKLQkJCQkvLyAyLjAKLQkJCQl2YXJOYW1lID0gdmFyLmdldEFsaWFzKCk7Ci0JCQl9Ci0JCQlpZiAodmFyTmFtZSA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIGF0dHJOYW1lID0gdmFyLmdldE5hbWVGcm9tQXR0cmlidXRlKCk7Ci0JCQkJLyoKLQkJCQkgKiBJdGVyYXRlIHRocm91Z2ggdGhlIGRvY3VtZW50IHJlZ2lvbiB0byBmaW5kIHRoZQotCQkJCSAqIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIG5hbWUsIGFuZCB0aGVuIHVzZSBpdHMgdmFsdWUKLQkJCQkgKi8KLQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGN1c3RvbVRhZy5nZXRSZWdpb25zKCk7Ci0JCQkJYm9vbGVhbiBhdHRyTmFtZUZvdW5kID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaSA9IDI7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQlpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FLmVxdWFscyhyZWdpb24uZ2V0VHlwZSgpKSkgewotCQkJCQkJYXR0ck5hbWVGb3VuZCA9IGF0dHJOYW1lLmVxdWFscyhjdXN0b21UYWcuZ2V0VGV4dChyZWdpb24pKTsKLQkJCQkJfQotCQkJCQlpZiAoYXR0ck5hbWVGb3VuZCAmJiBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFLmVxdWFscyhyZWdpb24uZ2V0VHlwZSgpKSkgewotCQkJCQkJdmFyTmFtZSA9IFN0cmluZ1V0aWxzLnN0cmlwKGN1c3RvbVRhZy5nZXRUZXh0KHJlZ2lvbikpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHZhck5hbWUgIT0gbnVsbCkgewotCQkJCVN0cmluZyB2YXJDbGFzcyA9ICJqYXZhLmxhbmcuU3RyaW5nIjsgLy8gdGhlIGRlZmF1bHQKLQkJCQkJCQkJCQkJCQkJLy8gY2xhc3MuLi4vLyROT04tTkxTLTEkCi0JCQkJaWYgKHZhci5nZXRWYXJpYWJsZUNsYXNzKCkgIT0gbnVsbCkgewotCQkJCQl2YXJDbGFzcyA9IHZhci5nZXRWYXJpYWJsZUNsYXNzKCk7Ci0JCQkJfQotCQkJCXJlc3VsdHMuYWRkKG5ldyBUYWdsaWJWYXJpYWJsZSh2YXJDbGFzcywgdmFyTmFtZSwgdmFyLmdldFNjb3BlKCksIHZhci5nZXREZXNjcmlwdGlvbigpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIDEuMSBzdHlsZSBUYWdsaWJWYXJpYWJsZXMgKGRlZmluZWQgaW4gYSBUYWdFeHRyYUluZm8gY2xhc3MpIHRvIHRoZQotCSAqIHJlc3VsdHMgbGlzdC4gQWxzbyByZXBvcnRzIHByb2JsZW1zIHdpdGggdGhlIHRhZyBhbmQgdGVpIGNsYXNzZXMgaW4KLQkgKiBmVHJhbnNsYXRvclByb2JsZW1zLgotCSAqIAotCSAqIEBwYXJhbSBjdXN0b21UYWcKLQkgKiBAcGFyYW0gcmVzdWx0cwotCSAqICAgICAgICAgICAgbGlzdCB3aGVyZSB0aGUgPGNvZGU+VGFnbGliVmFyaWFibGU8L2NvZGU+IHMgYXJlIGFkZGVkCi0JICogQHBhcmFtIGRlY2wKLQkgKiAgICAgICAgICAgIFRMREVsZW1lbnREZWNsYXJhdGlvbiBmb3IgdGhlIGN1c3RvbSB0YWcKLQkgKiBAcGFyYW0gcHJlZml4Ci0JICogICAgICAgICAgICBjdXN0b20gdGFnIHByZWZpeAotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIFVSSSB3aGVyZSB0aGUgdGxkIGNhbiBiZSBmb3VuZAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRURUlWYXJpYWJsZXMoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgSVRleHRSZWdpb25Db2xsZWN0aW9uIGN1c3RvbVRhZywgTGlzdCByZXN1bHRzLCBUTERFbGVtZW50RGVjbGFyYXRpb24gZGVjbCwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgTGlzdCBwcm9ibGVtcykgewotCQlTdHJpbmcgdGVpQ2xhc3NuYW1lID0gZGVjbC5nZXRUZWljbGFzcygpOwotCQlpZiAodGVpQ2xhc3NuYW1lID09IG51bGwgfHwgdGVpQ2xhc3NuYW1lLmxlbmd0aCgpID09IDAgfHwgZkphdmFQcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJVGFnbGliQ2xhc3NMb2FkZXIgbG9hZGVyID0gZ2V0Q2xhc3Nsb2FkZXIoKTsKLQotCQlDbGFzcyB0ZWlDbGFzcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvKgotCQkJICogSkRUIGNvdWxkIHRlbGwgdXMgYWJvdXQgaXQsIGJ1dCBsb2FkaW5nIGFuZCBjYWxsaW5nIGl0IHdvdWxkCi0JCQkgKiBzdGlsbCB0YWtlIHRpbWUKLQkJCSAqLwotCQkJdGVpQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKHRlaUNsYXNzbmFtZSwgdHJ1ZSwgbG9hZGVyKTsKLQkJCWlmICh0ZWlDbGFzcyAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IHRlaU9iamVjdCA9IHRlaUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0JCQkJaWYgKFRhZ0V4dHJhSW5mby5jbGFzcy5pc0luc3RhbmNlKHRlaU9iamVjdCkpIHsKLQkJCQkJVGFnRXh0cmFJbmZvIHRlaSA9IChUYWdFeHRyYUluZm8pIHRlaU9iamVjdDsKLQkJCQkJSGFzaHRhYmxlIHRhZ0RhdGFUYWJsZSA9IGV4dHJhY3RUYWdEYXRhKGN1c3RvbVRhZyk7Ci0JCQkJCVRhZ0luZm8gaW5mbyA9IGdldFRhZ0luZm8oZGVjbCwgdGVpLCBwcmVmaXgsIHVyaSk7Ci0JCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJCXRlaS5zZXRUYWdJbmZvKGluZm8pOwotCi0JCQkJCQkvLyBhZGQgdG8gcmVzdWx0cwotCQkJCQkJVGFnRGF0YSB0ZCA9IG5ldyBUYWdEYXRhKHRhZ0RhdGFUYWJsZSk7Ci0KLQkJCQkJCVZhcmlhYmxlSW5mb1tdIHZJbmZvcyA9IHRlaS5nZXRWYXJpYWJsZUluZm8odGQpOwotCQkJCQkJaWYgKHZJbmZvcyAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2SW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJcmVzdWx0cy5hZGQobmV3IFRhZ2xpYlZhcmlhYmxlKHZJbmZvc1tpXS5nZXRDbGFzc05hbWUoKSwgdkluZm9zW2ldLmdldFZhck5hbWUoKSwgdkluZm9zW2ldLmdldFNjb3BlKCksIGRlY2wuZ2V0RGVzY3JpcHRpb24oKSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJVmFsaWRhdGlvbk1lc3NhZ2VbXSBtZXNzYWdlcyA9IHRlaS52YWxpZGF0ZSh0ZCk7Ci0JCQkJCQlpZiAobWVzc2FnZXMgIT0gbnVsbCAmJiBtZXNzYWdlcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQlPYmplY3QgY3JlYXRlZFByb2JsZW0gPSBjcmVhdGVWYWxpZGF0aW9uTWVzc2FnZVByb2JsZW0oZG9jdW1lbnQsIGN1c3RvbVRhZywgbWVzc2FnZXNbaV0uZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQkJaWYgKGNyZWF0ZWRQcm9ibGVtICE9IG51bGwpIHsKLQkJCQkJCQkJCXByb2JsZW1zLmFkZChjcmVhdGVkUHJvYmxlbSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCU9iamVjdCBjcmVhdGVkUHJvYmxlbSA9IGNyZWF0ZUpTUFByb2JsZW0oZG9jdW1lbnQsIGN1c3RvbVRhZywgSUpTUFByb2JsZW0uVEVJQ2xhc3NNaXNjLCBKU1BDb3JlTWVzc2FnZXMuVGFnbGliSGVscGVyXzIsIHRlaUNsYXNzbmFtZSwgdHJ1ZSk7Ci0JCQkJCWlmIChjcmVhdGVkUHJvYmxlbSAhPSBudWxsKSB7Ci0JCQkJCQlwcm9ibGVtcy5hZGQoY3JlYXRlZFByb2JsZW0pOwotCQkJCQl9Ci0JCQkJCS8vIHRoaXMgaXMgM3JkIHBhcnR5IGNvZGUsIG5lZWQgdG8gY2F0Y2ggYWxsIGV4Y2VwdGlvbnMKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCB0ZWlDbGFzc25hbWUgKyAiIGlzIG5vdCBhIHN1YmNsYXNzIG9mIFRheEV4dHJhSW5mbyIpOyAvLyROT04tTkxTLTEkIAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCU9iamVjdCBjcmVhdGVkUHJvYmxlbSA9IGNyZWF0ZUpTUFByb2JsZW0oZG9jdW1lbnQsIGN1c3RvbVRhZywgSUpTUFByb2JsZW0uVEVJQ2xhc3NOb3RGb3VuZCwgSlNQQ29yZU1lc3NhZ2VzLlRhZ2xpYkhlbHBlcl8wLCB0ZWlDbGFzc25hbWUsIHRydWUpOwotCQkJaWYgKGNyZWF0ZWRQcm9ibGVtICE9IG51bGwpIHsKLQkJCQlwcm9ibGVtcy5hZGQoY3JlYXRlZFByb2JsZW0pOwotCQkJfQotCQkJLy8gVEVJIGNsYXNzIHdhc24ndCBvbiBidWlsZCBwYXRoCi0JCQlpZiAoREVCVUcpCi0JCQkJbG9nRXhjZXB0aW9uKHRlaUNsYXNzbmFtZSwgZSk7Ci0JCX0KLQkJY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJT2JqZWN0IGNyZWF0ZWRQcm9ibGVtID0gY3JlYXRlSlNQUHJvYmxlbShkb2N1bWVudCwgY3VzdG9tVGFnLCBJSlNQUHJvYmxlbS5URUlDbGFzc05vdEluc3RhbnRpYXRlZCwgSlNQQ29yZU1lc3NhZ2VzLlRhZ2xpYkhlbHBlcl8xLCB0ZWlDbGFzc25hbWUsIHRydWUpOwotCQkJaWYgKGNyZWF0ZWRQcm9ibGVtICE9IG51bGwpIHsKLQkJCQlwcm9ibGVtcy5hZGQoY3JlYXRlZFByb2JsZW0pOwotCQkJfQotCQkJLy8gVEVJIGNsYXNzIGNvdWxkbid0IGJlIGluc3RhbnRpYXRlZAotCQkJaWYgKERFQlVHKQotCQkJCWxvZ0V4Y2VwdGlvbih0ZWlDbGFzc25hbWUsIGUpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChERUJVRykKLQkJCQlsb2dFeGNlcHRpb24odGVpQ2xhc3NuYW1lLCBlKTsKLQkJfQotCQkvLyBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJLy8gLy8gVEVJIGNsYXNzIHdhc24ndCByZWFsbHkgYSBzdWJjbGFzcyBvZiBUYWdFeHRyYUluZm8KLQkJLy8gaWYgKERFQlVHKQotCQkvLyBsb2dFeGNlcHRpb24odGVpQ2xhc3NuYW1lLCBlKTsKLQkJLy8gfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCU9iamVjdCBjcmVhdGVkUHJvYmxlbSA9IGNyZWF0ZUpTUFByb2JsZW0oZG9jdW1lbnQsIGN1c3RvbVRhZywgSUpTUFByb2JsZW0uVEVJQ2xhc3NNaXNjLCBKU1BDb3JlTWVzc2FnZXMuVGFnbGliSGVscGVyXzIsIHRlaUNsYXNzbmFtZSwgdHJ1ZSk7Ci0JCQlpZiAoY3JlYXRlZFByb2JsZW0gIT0gbnVsbCkgewotCQkJCXByb2JsZW1zLmFkZChjcmVhdGVkUHJvYmxlbSk7Ci0JCQl9Ci0JCQkvLyB0aGlzIGlzIDNyZCBwYXJ0eSBjb2RlLCBuZWVkIHRvIGNhdGNoIGFsbCBleGNlcHRpb25zCi0JCQlpZiAoREVCVUcpCi0JCQkJbG9nRXhjZXB0aW9uKHRlaUNsYXNzbmFtZSwgZSk7Ci0JCX0KLQkJY2F0Y2ggKEVycm9yIGUpIHsKLQkJCS8vIHRoaXMgaXMgM3JkIHBhcnR5IGNvZGUsIG5lZWQgdG8gY2F0Y2ggYWxsIGVycm9ycwotCQkJaWYgKERFQlVHKQotCQkJCWxvZ0V4Y2VwdGlvbih0ZWlDbGFzc25hbWUsIGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIob2xkTG9hZGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjdXN0b21UYWcKLQkgKiBAcGFyYW0gdGVpQ2xhc3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgY3JlYXRlSlNQUHJvYmxlbShmaW5hbCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBmaW5hbCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY3VzdG9tVGFnLCBmaW5hbCBpbnQgcHJvYmxlbUlELCBmaW5hbCBTdHJpbmcgbWVzc2FnZUtleSwgZmluYWwgU3RyaW5nIGFyZ3VtZW50LCBib29sZWFuIHByZWZlclZhcnMpIHsKLQkJZmluYWwgU3RyaW5nIHRhZ25hbWUgPSBjdXN0b21UYWcuZ2V0VGV4dChjdXN0b21UYWcuZ2V0UmVnaW9ucygpLmdldCgxKSk7Ci0KLQkJZmluYWwgaW50IHN0YXJ0OwotCQlpZiAoY3VzdG9tVGFnLmdldE51bWJlck9mUmVnaW9ucygpID4gMSkgewotCQkJc3RhcnQgPSBjdXN0b21UYWcuZ2V0U3RhcnRPZmZzZXQoY3VzdG9tVGFnLmdldFJlZ2lvbnMoKS5nZXQoMSkpOwotCQl9Ci0JCWVsc2UgewotCQkJc3RhcnQgPSBjdXN0b21UYWcuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCi0JCWZpbmFsIGludCBlbmQ7Ci0JCWlmIChjdXN0b21UYWcuZ2V0TnVtYmVyT2ZSZWdpb25zKCkgPiAxKSB7Ci0JCQllbmQgPSBjdXN0b21UYWcuZ2V0VGV4dEVuZE9mZnNldChjdXN0b21UYWcuZ2V0UmVnaW9ucygpLmdldCgxKSkgLSAxOwotCQl9Ci0JCWVsc2UgewotCQkJZW5kID0gY3VzdG9tVGFnLmdldFRleHRFbmRPZmZzZXQoKSAtIDE7Ci0JCX0KLQotCQlmaW5hbCBpbnQgbGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0KLQkJZmluYWwgY2hhcltdIG5hbWU7Ci0JCUlQYXRoIGxvY2F0aW9uID0gVGFnbGliQ29udHJvbGxlci5nZXRMb2NhdGlvbihkb2N1bWVudCk7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQluYW1lID0gbmV3IGNoYXJbMF07Ci0JCX0KLQkJZWxzZSB7Ci0JCQluYW1lID0gbG9jYXRpb24udG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOwotCQl9Ci0KLQkJLyoKLQkJICogTm90ZTogdGhlc2UgcHJvYmxlbXMgd291bGQgcmVzdWx0IGluIHRyYW5zbGF0aW9uIGVycm9ycyBvbiB0aGUKLQkJICogc2VydmVyLCBzbyB0aGUgc2V2ZXJpdHkgaXMgbm90IG1lYW50IHRvIGJlIGNvbnRyb2xsYWJsZQotCQkgKi8KLQkJcmV0dXJuIG5ldyBJSlNQUHJvYmxlbSgpIHsKLQkJCXB1YmxpYyB2b2lkIHNldFNvdXJjZVN0YXJ0KGludCBzb3VyY2VTdGFydCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VMaW5lTnVtYmVyKGludCBsaW5lTnVtYmVyKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldFNvdXJjZUVuZChpbnQgc291cmNlRW5kKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzV2FybmluZygpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRXJyb3IoKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0U291cmNlU3RhcnQoKSB7Ci0JCQkJcmV0dXJuIHN0YXJ0OwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldFNvdXJjZUxpbmVOdW1iZXIoKSB7Ci0JCQkJcmV0dXJuIGxpbmU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0U291cmNlRW5kKCkgewotCQkJCXJldHVybiBlbmQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBjaGFyW10gZ2V0T3JpZ2luYXRpbmdGaWxlTmFtZSgpIHsKLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChtZXNzYWdlS2V5LCBuZXcgU3RyaW5nW117dGFnbmFtZSwgYXJndW1lbnR9KTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRJRCgpIHsKLQkJCQlyZXR1cm4gcHJvYmxlbUlEOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nW10gZ2V0QXJndW1lbnRzKCkgewotCQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldEVJRCgpIHsKLQkJCQlyZXR1cm4gcHJvYmxlbUlEOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjdXN0b21UYWcKLQkgKiBAcGFyYW0gdmFsaWRhdGlvbk1lc3NhZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgY3JlYXRlVmFsaWRhdGlvbk1lc3NhZ2VQcm9ibGVtKGZpbmFsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIGZpbmFsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjdXN0b21UYWcsIGZpbmFsIFN0cmluZyB2YWxpZGF0aW9uTWVzc2FnZSkgewotCQlmaW5hbCBpbnQgc3RhcnQ7Ci0JCWlmIChjdXN0b21UYWcuZ2V0TnVtYmVyT2ZSZWdpb25zKCkgPiAzKSB7Ci0JCQlzdGFydCA9IGN1c3RvbVRhZy5nZXRTdGFydE9mZnNldChjdXN0b21UYWcuZ2V0UmVnaW9ucygpLmdldCgyKSk7Ci0JCX0KLQkJZWxzZSBpZiAoY3VzdG9tVGFnLmdldE51bWJlck9mUmVnaW9ucygpID4gMSkgewotCQkJc3RhcnQgPSBjdXN0b21UYWcuZ2V0U3RhcnRPZmZzZXQoY3VzdG9tVGFnLmdldFJlZ2lvbnMoKS5nZXQoMSkpOwotCQl9Ci0JCWVsc2UgewotCQkJc3RhcnQgPSBjdXN0b21UYWcuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCi0JCWZpbmFsIGludCBlbmQ7Ci0JCWlmIChjdXN0b21UYWcuZ2V0TnVtYmVyT2ZSZWdpb25zKCkgPiAzKSB7Ci0JCQllbmQgPSBjdXN0b21UYWcuZ2V0VGV4dEVuZE9mZnNldChjdXN0b21UYWcuZ2V0UmVnaW9ucygpLmdldChjdXN0b21UYWcuZ2V0TnVtYmVyT2ZSZWdpb25zKCkgLSAyKSk7Ci0JCX0KLQkJZWxzZSBpZiAoY3VzdG9tVGFnLmdldE51bWJlck9mUmVnaW9ucygpID4gMSkgewotCQkJZW5kID0gY3VzdG9tVGFnLmdldFRleHRFbmRPZmZzZXQoY3VzdG9tVGFnLmdldFJlZ2lvbnMoKS5nZXQoMSkpIC0gMTsKLQkJfQotCQllbHNlIHsKLQkJCWVuZCA9IGN1c3RvbVRhZy5nZXRUZXh0RW5kT2Zmc2V0KCk7Ci0JCX0KLQotCQlmaW5hbCBpbnQgbGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0KLQkJZmluYWwgY2hhcltdIG5hbWU7Ci0JCUlQYXRoIGxvY2F0aW9uID0gVGFnbGliQ29udHJvbGxlci5nZXRMb2NhdGlvbihkb2N1bWVudCk7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQluYW1lID0gbmV3IGNoYXJbMF07Ci0JCX0KLQkJZWxzZSB7Ci0JCQluYW1lID0gbG9jYXRpb24udG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBJSlNQUHJvYmxlbSgpIHsKLQkJCXB1YmxpYyB2b2lkIHNldFNvdXJjZVN0YXJ0KGludCBzb3VyY2VTdGFydCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VMaW5lTnVtYmVyKGludCBsaW5lTnVtYmVyKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldFNvdXJjZUVuZChpbnQgc291cmNlRW5kKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzV2FybmluZygpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFcnJvcigpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0U291cmNlU3RhcnQoKSB7Ci0JCQkJcmV0dXJuIHN0YXJ0OwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldFNvdXJjZUxpbmVOdW1iZXIoKSB7Ci0JCQkJcmV0dXJuIGxpbmU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0U291cmNlRW5kKCkgewotCQkJCXJldHVybiBlbmQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBjaGFyW10gZ2V0T3JpZ2luYXRpbmdGaWxlTmFtZSgpIHsKLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQkJCXJldHVybiB2YWxpZGF0aW9uTWVzc2FnZTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRJRCgpIHsKLQkJCQlyZXR1cm4gZ2V0RUlEKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRBcmd1bWVudHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0RUlEKCkgewotCQkJCXJldHVybiBJSlNQUHJvYmxlbS5URUlWYWxpZGF0aW9uTWVzc2FnZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVjbAotCSAqIEByZXR1cm4gdGhlIFRhZ0luZm8gZm9yIHRoZSBUTERFTGVtZW50RGVjbGFyYXRpb24gaWYgdGhlIGRlY2xhcmF0aW9uIGlzCi0JICogICAgICAgICB2YWxpZCwgb3RoZXJ3aXNlIG51bGwKLQkgKi8KLQlwcml2YXRlIFRhZ0luZm8gZ2V0VGFnSW5mbyhUTERFbGVtZW50RGVjbGFyYXRpb24gZGVjbCwgVGFnRXh0cmFJbmZvIHRlaSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgewotCi0JCVRhZ0xpYnJhcnlJbmZvIGxpYkluZm8gPSBuZXcgVGFnTGlicmFyeUluZm8ocHJlZml4LCB1cmkpIHsgLyoKLQkJCQkJCQkJCQkJCQkJCQkJICogZHVtbXkKLQkJCQkJCQkJCQkJCQkJCQkJICogaW1wbAotCQkJCQkJCQkJCQkJCQkJCQkgKi8KLQkJfTsKLQotCQlDTU5hbWVkTm9kZU1hcCBhdHRycyA9IGRlY2wuZ2V0QXR0cmlidXRlcygpOwotCQlUYWdBdHRyaWJ1dGVJbmZvW10gYXR0ckluZm9zID0gbmV3IFRhZ0F0dHJpYnV0ZUluZm9bYXR0cnMuZ2V0TGVuZ3RoKCldOwotCQlUTERBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJCAKLQotCQkvLyBnZXQgdGFnIGF0dHJpYnV0ZSBpbmZvcwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWF0dHIgPSAoVExEQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJzLml0ZW0oaSk7Ci0JCQl0eXBlID0gYXR0ci5nZXRUeXBlKCk7Ci0JCQkvLyBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIGlzIFN0cmluZwotCQkJaWYgKGF0dHIuZ2V0VHlwZSgpID09IG51bGwgfHwgYXR0ci5nZXRUeXBlKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJCAKLQkJCQl0eXBlID0gImphdmEubGFuZy5TdHJpbmciOyAvLyROT04tTkxTLTEkIAotCQkJYXR0ckluZm9zW2ldID0gbmV3IFRhZ0F0dHJpYnV0ZUluZm8oYXR0ci5nZXRBdHRyTmFtZSgpLCBhdHRyLmlzUmVxdWlyZWQoKSwgdHlwZSwgZmFsc2UpOwotCQl9Ci0KLQkJU3RyaW5nIHRhZ05hbWUgPSBkZWNsLmdldE5vZGVOYW1lKCk7Ci0JCVN0cmluZyB0YWdDbGFzcyA9IGRlY2wuZ2V0VGFnY2xhc3MoKTsKLQkJU3RyaW5nIGJvZHlDb250ZW50ID0gZGVjbC5nZXRCb2R5Y29udGVudCgpOwotCQlpZiAodGFnTmFtZSAhPSBudWxsICYmIHRhZ0NsYXNzICE9IG51bGwgJiYgYm9keUNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBuZXcgVGFnSW5mbyh0YWdOYW1lLCB0YWdDbGFzcywgYm9keUNvbnRlbnQsIGRlY2wuZ2V0SW5mbygpLCBsaWJJbmZvLCB0ZWksIGF0dHJJbmZvcyk7Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyB0ZWlDbGFzc25hbWUsIFRocm93YWJsZSBlKSB7Ci0KLQkJU3RyaW5nIG1lc3NhZ2UgPSAidGVpQ2xhc3NuYW1lOiBbIjsgLy8kTk9OLU5MUy0xJCAKLQkJaWYgKHRlaUNsYXNzbmFtZSAhPSBudWxsKQotCQkJbWVzc2FnZSArPSB0ZWlDbGFzc25hbWU7Ci0JCW1lc3NhZ2UgKz0gIl0iOyAvLyROT04tTkxTLTEkCi0JCUxvZ2dlci5sb2dFeGNlcHRpb24obWVzc2FnZSwgZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgYXR0cmlidXRlIC0+IHZhbHVlIHBhaXJzIGZvciB0aGUgdGFnIGluIGEgSGFzaHRhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBjdXN0b21UYWcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBIYXNodGFibGUgZXh0cmFjdFRhZ0RhdGEoSVRleHRSZWdpb25Db2xsZWN0aW9uIGN1c3RvbVRhZykgewotCQlIYXNodGFibGUgdGFnRGF0YVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGN1c3RvbVRhZy5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlTdHJpbmcgYXR0ck5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgYXR0clZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDI7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkvLyBjaGVjayBpZiBhdHRyIG5hbWUKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlhdHRyTmFtZSA9IGN1c3RvbVRhZy5nZXRUZXh0KHIpOwotCQkJCS8vIGNoZWNrIGVxdWFscyBpcyBuZXh0IHJlZ2lvbgotCQkJCWlmIChyZWdpb25zLnNpemUoKSA+ICsraSkgewotCQkJCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUyAmJiByZWdpb25zLnNpemUoKSA+ICsraSkgewotCQkJCQkJLy8gZ2V0IGF0dHIgdmFsdWUKLQkJCQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQkJLy8gYXR0cmlidXRlcyBpbiBvdXIgZG9jdW1lbnQgaGF2ZSBxdW90ZXMsIHNvIHdlCi0JCQkJCQkJLy8gbmVlZCB0byBzdHJpcCB0aGVtCi0JCQkJCQkJYXR0clZhbHVlID0gU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXMoY3VzdG9tVGFnLmdldFRleHQocikpOwotCQkJCQkJCXRhZ0RhdGFUYWJsZS5wdXQoYXR0ck5hbWUsIGF0dHJWYWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQl0YWdEYXRhVGFibGUucHV0KCJqc3A6aWQiLCBjdXN0b21UYWcuZ2V0VGV4dChyZWdpb25zLmdldCgxKSkgKyAiXyIgKyBjdXN0b21UYWcuZ2V0U3RhcnRPZmZzZXQoKSk7IC8vJE5PTi1OTFMtMSQgCi0KLQkJcmV0dXJuIHRhZ0RhdGFUYWJsZTsKLQl9Ci0KLQlwcml2YXRlIFRhZ2xpYkNsYXNzTG9hZGVyIGdldENsYXNzbG9hZGVyKCkgewotCQlpZiAoZkxvYWRlciA9PSBudWxsKSB7Ci0JCQlmTG9hZGVyID0gbmV3IFRhZ2xpYkNsYXNzTG9hZGVyKHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLQkJCWZQcm9qZWN0RW50cmllcy5jbGVhcigpOwotCQkJZkNvbnRhaW5lckVudHJpZXMuY2xlYXIoKTsKLQkJCWFkZENsYXNzcGF0aEVudHJpZXNGb3JQcm9qZWN0KGdldFByb2plY3QoKSwgZkxvYWRlcik7Ci0JCX0KLQkJcmV0dXJuIGZMb2FkZXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxvYWRlcgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRDbGFzc3BhdGhFbnRyaWVzRm9yUHJvamVjdChJUHJvamVjdCBwLCBUYWdsaWJDbGFzc0xvYWRlciBsb2FkZXIpIHsKLQotCQkvLyBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24gYW5kIGNsb3NlZCBwcm9qZWN0Ci0JCWlmICghcC5pc0FjY2Vzc2libGUoKSB8fCBmUHJvamVjdEVudHJpZXMuY29udGFpbnMocC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpKQotCQkJcmV0dXJuOwotCQlmUHJvamVjdEVudHJpZXMuYWRkKHAuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQotCQkvLyBhZGQgdGhpbmdzIG9uIGNsYXNzcGF0aCB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluCi0JCXRyeSB7Ci0JCQlpZiAocC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkgewotCi0JCQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocCk7Ci0KLQkJCQl0cnkgewotCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gcHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCQkJYWRkRGVmYXVsdERpckVudHJ5KGxvYWRlciwgcHJvamVjdCk7Ci0JCQkJCWFkZENsYXNzcGF0aEVudHJpZXMobG9hZGVyLCBwcm9qZWN0LCBlbnRyaWVzKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ2xhc3NwYXRoRW50cmllcyhUYWdsaWJDbGFzc0xvYWRlciBsb2FkZXIsIElKYXZhUHJvamVjdCBwcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQotCQkJZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY3VycmVudCBlbnRyeSBpczogIiArIGVudHJ5KTsgLy8kTk9OLU5MUy0xJAotCi0JCQlzd2l0Y2ggKGVudHJ5LmdldEVudHJ5S2luZCgpKSB7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6Ci0JCQkJCWFkZFNvdXJjZUVudHJ5KGxvYWRlciwgZW50cnkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSA6Ci0JCQkJCWFkZExpYnJhcnlFbnRyeShsb2FkZXIsIGVudHJ5LmdldFBhdGgoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUIDoKLQkJCQkJYWRkUHJvamVjdEVudHJ5KGxvYWRlciwgZW50cnkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgOgotCQkJCQlhZGRWYXJpYWJsZUVudHJ5KGxvYWRlciwgZW50cnkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSIDoKLQkJCQkJYWRkQ29udGFpbmVyRW50cnkobG9hZGVyLCBwcm9qZWN0LCBlbnRyeSk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxvYWRlcgotCSAqIEBwYXJhbSBlbnRyeQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRWYXJpYWJsZUVudHJ5KFRhZ2xpYkNsYXNzTG9hZGVyIGxvYWRlciwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7Ci0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIC0+IGFkZGluZyB2YXJpYWJsZSBlbnRyeTogWyIgKyBlbnRyeSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCS8vIHZhcmlhYmxlIHNob3VsZCBlaXRoZXIgYmUgYSBwcm9qZWN0IG9yIGEgbGlicmFyeSBlbnRyeQotCi0JCS8vIEJVRyAxNjk0MzEKLQkJU3RyaW5nIHZhcmlhYmxlTmFtZSA9IGVudHJ5LmdldFBhdGgoKS50b1N0cmluZygpOwotCQlJUGF0aCB2YXJpYWJsZVBhdGggPSBKYXZhQ29yZS5nZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChlbnRyeS5nZXRQYXRoKCkpOwotCQl2YXJpYWJsZVBhdGggPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhWYXJpYWJsZSh2YXJpYWJsZU5hbWUpOwotCi0JCS8vIFJBVExDMDEwNzY4NTQKLQkJLy8gdmFyaWFibGUgcGF0aHMgbWF5IG5vdCBleGlzdAotCQkvLyBpbiB0aGF0IGNhc2UgbnVsbCB3aWxsIGJlIHJldHVybmVkCi0JCWlmICh2YXJpYWJsZVBhdGggIT0gbnVsbCkgewotCQkJaWYgKHZhcmlhYmxlUGF0aC5zZWdtZW50cygpLmxlbmd0aCA9PSAxKSB7Ci0JCQkJSVByb2plY3QgdmFyUHJvaiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCh2YXJpYWJsZVBhdGgudG9TdHJpbmcoKSk7Ci0JCQkJaWYgKHZhclByb2ogIT0gbnVsbCAmJiB2YXJQcm9qLmV4aXN0cygpKSB7Ci0JCQkJCWFkZENsYXNzcGF0aEVudHJpZXNGb3JQcm9qZWN0KHZhclByb2osIGxvYWRlcik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlhZGRMaWJyYXJ5RW50cnkobG9hZGVyLCB2YXJpYWJsZVBhdGgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxvYWRlcgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGVudHJ5Ci0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQ29udGFpbmVyRW50cnkoVGFnbGliQ2xhc3NMb2FkZXIgbG9hZGVyLCBJSmF2YVByb2plY3QgcHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQotCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcihlbnRyeS5nZXRQYXRoKCksIHByb2plY3QpOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCS8vIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbgotCQkJaWYgKCFmQ29udGFpbmVyRW50cmllcy5jb250YWlucyhjb250YWluZXIuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpKSB7Ci0JCQkJZkNvbnRhaW5lckVudHJpZXMuYWRkKGNvbnRhaW5lci5nZXRQYXRoKCkudG9TdHJpbmcoKSk7Ci0KLQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjcGVzID0gY29udGFpbmVyLmdldENsYXNzcGF0aEVudHJpZXMoKTsKLQkJCQkvLyByZWN1cnNpdmUgY2FsbCBoZXJlCi0JCQkJYWRkQ2xhc3NwYXRoRW50cmllcyhsb2FkZXIsIHByb2plY3QsIGNwZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxvYWRlcgotCSAqIEBwYXJhbSBlbnRyeQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRQcm9qZWN0RW50cnkoVGFnbGliQ2xhc3NMb2FkZXIgbG9hZGVyLCBJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKLQotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAtPiBwcm9qZWN0IGVudHJ5OiBbIiArIGVudHJ5ICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJSVBhdGggcGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJSVByb2plY3QgcmVmZXJlbmNlUHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoLnNlZ21lbnQoMCkpOwotCQlpZiAocmVmZXJlbmNlUHJvamVjdCAhPSBudWxsICYmIHJlZmVyZW5jZVByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCWFkZENsYXNzcGF0aEVudHJpZXNGb3JQcm9qZWN0KHJlZmVyZW5jZVByb2plY3QsIGxvYWRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9hZGVyCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gcHJvamVjdExvY2F0aW9uCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkRGVmYXVsdERpckVudHJ5KFRhZ2xpYkNsYXNzTG9hZGVyIGxvYWRlciwgSUphdmFQcm9qZWN0IHByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkvLyBhZGQgZGVmYXVsdCBiaW4gZGlyZWN0b3J5IGZvciB0aGUgcHJvamVjdAotCQlJUGF0aCBvdXRwdXRQYXRoID0gcHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQlTdHJpbmcgb3V0cHV0TG9jYXRpb24gPSBudWxsOwotCQlpZiAoIW91dHB1dFBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCWlmIChvdXRwdXRQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCUlGb2xkZXIgZm9sZGVyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGb2xkZXIob3V0cHV0UGF0aCk7Ci0JCQkJaWYgKGZvbGRlci5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCQkJb3V0cHV0TG9jYXRpb24gPSBmb2xkZXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCUlQcm9qZWN0IGlwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KG91dHB1dFBhdGguc2VnbWVudCgwKSk7Ci0JCQkJaWYgKGlwcm9qZWN0LmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlvdXRwdXRMb2NhdGlvbiA9IGlwcm9qZWN0LmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlvdXRwdXRMb2NhdGlvbiA9IG91dHB1dFBhdGgudG9TdHJpbmcoKTsKLQkJfQotCQlsb2FkZXIuYWRkRGlyZWN0b3J5KG91dHB1dExvY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9hZGVyCi0JICogQHBhcmFtIGVudHJ5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpYnJhcnlFbnRyeShUYWdsaWJDbGFzc0xvYWRlciBsb2FkZXIsIElQYXRoIGxpYlBhdGgpIHsKLQkJU3RyaW5nIGphclBhdGhTdHJpbmcgPSBsaWJQYXRoLnRvU3RyaW5nKCk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGxpYlBhdGgudG9PU1N0cmluZygpKTsKLQotCQkvLyBpZiBub3QgYWJzb2x1dGUgcGF0aCwgaXQncyB3b3Jrc3BhY2UgcmVsYXRpdmUKLQkJaWYgKCFmaWxlLmV4aXN0cygpICYmIGxpYlBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQlJRmlsZSBqYXJGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGxpYlBhdGgpOwotCQkJaWYgKGphckZpbGUuaXNBY2Nlc3NpYmxlKCkgJiYgamFyRmlsZS5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCQlqYXJQYXRoU3RyaW5nID0gamFyRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoamFyUGF0aFN0cmluZyAhPSBudWxsKSB7Ci0JCQlpZiAoamFyUGF0aFN0cmluZy5lbmRzV2l0aCgiLmphciIpKSB7IC8vJE5PTi1OTFMtMSQgCi0JCQkJbG9hZGVyLmFkZEphcihqYXJQYXRoU3RyaW5nKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCS8qCi0JCQkJICogdW5saWtlbHksIHRoZSBVSSBwcmV2ZW50cyBhZGRpbmcgZm9sZGVyIHZhcmlhYmxlcyB0byB0aGUKLQkJCQkgKiBjbGFzc3BhdGggLSBpdCdzIGFjdHVhbGx5IGEgZm9sZGVyIGNvbnRhaW5pbmcgYmluYXJpZXMKLQkJCQkgKi8KLQkJCQlsb2FkZXIuYWRkRGlyZWN0b3J5KGphclBhdGhTdHJpbmcpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxvYWRlcgotCSAqIEBwYXJhbSBlbnRyeQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRTb3VyY2VFbnRyeShUYWdsaWJDbGFzc0xvYWRlciBsb2FkZXIsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCQkvLyBhZGQgYmluIGRpcmVjdG9yeSBmb3Igc3BlY2lmaWMgZW50cnkgaWYgaXQgaGFzCi0JCS8vIG9uZQotCQlJUGF0aCBvdXRwdXRMb2NhdGlvbiA9IGVudHJ5LmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCWlmIChvdXRwdXRMb2NhdGlvbiAhPSBudWxsICYmIG91dHB1dExvY2F0aW9uLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJSUZvbGRlciBmb2xkZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcihvdXRwdXRMb2NhdGlvbik7Ci0JCQlpZiAoZm9sZGVyICE9IG51bGwgJiYgZm9sZGVyLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJb3V0cHV0TG9jYXRpb24gPSBmb2xkZXIuZ2V0TG9jYXRpb24oKTsKLQkJCQlsb2FkZXIuYWRkRGlyZWN0b3J5KG91dHB1dExvY2F0aW9uLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmTW9kZWxRdWVyeS4KLQkgKi8KLQlwdWJsaWMgTW9kZWxRdWVyeSBnZXRNb2RlbFF1ZXJ5KElEb2N1bWVudCBkb2MpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCU1vZGVsUXVlcnkgbXEgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvYyk7Ci0JCQltcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobW9kZWwpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIG1xOwotCX0KLQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmRmlsZS4KLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQotCQlyZXR1cm4gZlByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBmRmlsZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwKSB7Ci0JCWZQcm9qZWN0ID0gcDsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHApOwotCQlpZiAoamF2YVByb2plY3QuZXhpc3RzKCkpIHsKLQkJCWZKYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UHJvYmxlbXMoSVBhdGggcGF0aCkgewotCQlyZXR1cm4gKENvbGxlY3Rpb24pIGZUcmFuc2xhdGlvblByb2JsZW1zLnJlbW92ZShwYXRoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVUYWdDbGFzcyhJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY3VzdG9tVGFnLCBUTERFbGVtZW50RGVjbGFyYXRpb24gZGVjbCwgTGlzdCBwcm9ibGVtcykgewotCQkvLyBza2lwIGlmIGZyb20gYSB0YWcgZmlsZQotCQlpZiAoVExERWxlbWVudERlY2xhcmF0aW9uLlNPVVJDRV9UQUdfRklMRS5lcXVhbHMoZGVjbC5nZXRQcm9wZXJ0eShUTERFbGVtZW50RGVjbGFyYXRpb24uVEFHX1NPVVJDRSkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgdGFnQ2xhc3NuYW1lID0gZGVjbC5nZXRUYWdjbGFzcygpOwotCQlJVHlwZSB0YWdDbGFzcyA9IG51bGw7Ci0JCWlmICh0YWdDbGFzc25hbWUgIT0gbnVsbCAmJiB0YWdDbGFzc25hbWUubGVuZ3RoKCkgPiAwICYmIGZKYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXRhZ0NsYXNzID0gZkphdmFQcm9qZWN0LmZpbmRUeXBlKHRhZ0NsYXNzbmFtZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCWlmICh0YWdDbGFzcyA9PSBudWxsKSB7Ci0JCQlPYmplY3QgY3JlYXRlZFByb2JsZW0gPSBjcmVhdGVKU1BQcm9ibGVtKGRvY3VtZW50LCBjdXN0b21UYWcsIElKU1BQcm9ibGVtLlRhZ0NsYXNzTm90Rm91bmQsIEpTUENvcmVNZXNzYWdlcy5UYWdsaWJIZWxwZXJfMywgdGFnQ2xhc3NuYW1lLCBmYWxzZSk7Ci0JCQlpZiAoY3JlYXRlZFByb2JsZW0gIT0gbnVsbCkgewotCQkJCXByb2JsZW1zLmFkZChjcmVhdGVkUHJvYmxlbSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJIZWxwZXJDYWNoZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliSGVscGVyQ2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNmMWUzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJIZWxwZXJDYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGFnbGliOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBBIHNpbXBsZSBjYWNoZSBmb3IgVGFnbGliSGVscGVycyB0byBhdm9pZCBleGNlc3NpdmUgY3JlYXRpb24gb2YgVGFnbGliQ2xhc3NMb2FkZXJzCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1jbGFzcyBUYWdsaWJIZWxwZXJDYWNoZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGFnbGlidmFycyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIERFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbiBlbnRyeSBmb3IgdGhlIGNhY2hlIChwcm9qZWN0UGF0aCBzdHJpbmcgJiBUYWdsaWJIZWxwZXIpCi0gICAgICovCi0gICAgY2xhc3MgRW50cnkgewotICAgICAgICBwcml2YXRlIFRhZ2xpYkhlbHBlciBmSGVscGVyOwotICAgICAgICBwcml2YXRlIFN0cmluZyBmUHJvamVjdE5hbWU7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgRW50cnkoU3RyaW5nIHByb2plY3ROYW1lLCBUYWdsaWJIZWxwZXIgaGVscGVyKSB7Ci0gICAgICAgICAgICBzZXRQcm9qZWN0TmFtZShwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICBzZXRIZWxwZXIoaGVscGVyKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgVGFnbGliSGVscGVyIGdldEhlbHBlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBmSGVscGVyOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNldEhlbHBlcihUYWdsaWJIZWxwZXIgaGVscGVyKSB7Ci0gICAgICAgICAgICBmSGVscGVyID0gaGVscGVyOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZlByb2plY3ROYW1lOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICAgICAgZlByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiAiVGFnbGliIEhlbHBlciBFbnRyeSBbIiArIGdldFByb2plY3ROYW1lKCkgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTGlzdCBmSGVscGVyczsKLSAgICAvLyBtYXggc2l6ZSBmb3IgdGhlIGNhY2hlCi0gICAgcHJpdmF0ZSBpbnQgTUFYX1NJWkU7Ci0KLSAgICAvKioKLSAgICAgKiBOb3QgaW50ZW5kZWQgdG8gYmUgbGFyZ2Ugc2luY2UgdW5kZXJseWluZyBpbXBsbWVtZW50YXRpb24gdXNlcwotICAgICAqIGEgTGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVGFnbGliSGVscGVyQ2FjaGUoaW50IHNpemUpIHsKLSAgICAgICAgTUFYX1NJWkUgPSBzaXplOwotICAgICAgICBmSGVscGVycyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QobmV3IEFycmF5TGlzdChNQVhfU0laRSkpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvamVjdFBhdGgKLSAgICAgKiBAcGFyYW0gZgotICAgICAqIEBwYXJhbSBtcQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3luY2hyb25pemVkIFRhZ2xpYkhlbHBlciBnZXRIZWxwZXIoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBUYWdsaWJIZWxwZXIgaGVscGVyID0gbnVsbDsKLSAgICAgICAgRW50cnkgZW50cnkgPSBudWxsOwotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBwcm9qZWN0LmdldE5hbWUoKTsKLSAgICAgICAgaW50IHNpemUgPSBmSGVscGVycy5zaXplKCk7Ci0gICAgICAgIC8vIGZpc3QgY2hlY2sgZm9yIGV4aXN0aW5nCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxzaXplOyBpKyspIHsKLSAgICAgICAgICAgIGVudHJ5ID0gKEVudHJ5KWZIZWxwZXJzLmdldChpKTsKLSAgICAgICAgICAgIGlmKGVudHJ5LmdldFByb2plY3ROYW1lKCkuZXF1YWxzKHByb2plY3ROYW1lKSkgewotICAgICAgICAgICAgICAgIC8vIGV4aXN0cwotICAgICAgICAgICAgICAgIGhlbHBlciA9IGVudHJ5LmdldEhlbHBlcigpOwotICAgICAgICAgICAgICAgIC8vIG9ubHkgbW92ZSB0byBmcm9udCBpZiBpdCdzIG5vdCB0aGUgZmlyc3QgZW50cnkKLSAgICAgICAgICAgICAgICBpZihpPjApIHsKLSAgICAgICAgICAgICAgICAgICAgZkhlbHBlcnMucmVtb3ZlKGVudHJ5KTsKLQkgICAgICAgICAgICAgICAgZkhlbHBlcnMuYWRkKDEsIGVudHJ5KTsKLQkgICAgICAgICAgICAgICAgaWYoREVCVUcpIHsKLQkgICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLklORk8sICIoLT4pIFRhZ2xpYkhlbHBlckNhY2hlIG1vdmVkOiAiICsgZW50cnkgKyAiIHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkgICAgICAgICAgICAgICAgICAgIHByaW50Q2FjaGVDb250ZW50cygpOwotCSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIGRpZG4ndCBleGlzdAotICAgICAgICBpZihoZWxwZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaGVscGVyID0gY3JlYXRlTmV3SGVscGVyKHByb2plY3ROYW1lLCBwcm9qZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVscGVyOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcHJvamVjdE5hbWUKLSAgICAgKiBAcGFyYW0gZgotICAgICAqIEBwYXJhbSBtcQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIFRhZ2xpYkhlbHBlciBjcmVhdGVOZXdIZWxwZXIoU3RyaW5nIHByb2plY3ROYW1lLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0KLSAgICAgICAgVGFnbGliSGVscGVyIGhlbHBlcjsKLSAgICAgICAgLy8gY3JlYXRlCi0gICAgICAgIGhlbHBlciA9IG5ldyBUYWdsaWJIZWxwZXIocHJvamVjdCk7Ci0gICAgICAgIEVudHJ5IG5ld0VudHJ5ID0gbmV3IEVudHJ5KHByb2plY3ROYW1lLCBoZWxwZXIpOwotICAgICAgICBmSGVscGVycy5hZGQoMCwgbmV3RW50cnkpOwotICAgICAgICBpZihERUJVRykgewotICAgICAgICAJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIigrKSBUYWdsaWJIZWxwZXJDYWNoZSBhZGRlZDogIiArIG5ld0VudHJ5KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcHJpbnRDYWNoZUNvbnRlbnRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoZkhlbHBlcnMuc2l6ZSgpID4gTUFYX1NJWkUpIHsKLSAgICAgICAgICAgIC8vIG9uZSB0b28gbWFueSwgcmVtb3ZlIGxhc3QKLSAgICAgICAgICAgIE9iamVjdCByZW1vdmVkID0gZkhlbHBlcnMucmVtb3ZlKGZIZWxwZXJzLnNpemUoKS0xKTsKLSAgICAgICAgICAgIGlmKERFQlVHKSB7Ci0gICAgICAgICAgICAJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIigtKSBUYWdsaWJIZWxwZXJDYWNoZSByZW1vdmVkOiAiICsgcmVtb3ZlZCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBwcmludENhY2hlQ29udGVudHMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVscGVyOwotICAgIH0KLSAKLSAgICBwdWJsaWMgZmluYWwgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlSGVscGVyKFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICBFbnRyeSBlbnRyeSA9IG51bGw7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gZkhlbHBlcnMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBlbnRyeSA9IChFbnRyeSlpdC5uZXh0KCk7Ci0gICAgICAgICAgICBpZihlbnRyeS5nZXRQcm9qZWN0TmFtZSgpLmVxdWFscyhwcm9qZWN0TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBmSGVscGVycy5yZW1vdmUoZW50cnkpOwotICAgICAgICAgICAgICAgIGlmKERFQlVHKSB7IAotICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiKC0pIFRhZ2xpYkhlbHBlckNhY2hlIHJlbW92ZWQ6ICIgKyBlbnRyeSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRDYWNoZUNvbnRlbnRzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBwcmludENhY2hlQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBkZWJ1Z1N0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZGVidWdTdHJpbmcuYXBwZW5kKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZGVidWdTdHJpbmcuYXBwZW5kKCJcbmNhY2hlIGNvbnRlbnRzOiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxmSGVscGVycy5zaXplKCk7IGkrKykJCi0gICAgICAgIAlkZWJ1Z1N0cmluZy5hcHBlbmQoIlxuIC0iICsgaSArICItICIgKyBmSGVscGVycy5nZXQoaSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgZGVidWdTdHJpbmcuYXBwZW5kKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZGVidWdTdHJpbmcudG9TdHJpbmcoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliSGVscGVyTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliSGVscGVyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDA5NTgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFnbGliL1RhZ2xpYkhlbHBlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGFnbGliOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklFbGVtZW50Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci0KLS8qKgotICogTWFuYWdlcyBjcmVhdGlvbiBhbmQgY2FjaGluZyAob3JkZXJlZCBNUlUpIG9mIFRhZ2xpYkhlbHBlcnMuCi0gKiBSZW1vdmVzIGhlbHBlcnMgd2hlbiB0aGVpciBjbGFzc3BhdGggY2hhbmdlcyAoc28gdGhleSBhcmUgcmVidWlsdCkuCi0gKiBUaGVyZSBpcyBvbmUgaGVscGVyIHBlciBwcm9qZWN0ICh3aXRoIGEgc3BlY2lmaWMgY2xhc3NwYXRoIGVudHJ5KS4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIFRhZ2xpYkhlbHBlck1hbmFnZXIgaW1wbGVtZW50cyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciB7Ci0gICAKLQotICAgIHByaXZhdGUgc3RhdGljIFRhZ2xpYkhlbHBlck1hbmFnZXIgaW5zdGFuY2UgPSBudWxsOwotICAgIC8vIHVzaW5nIGEgY2FjaGUgb2YganVzdCAzIGxvYWRlcnMKLSAgICBwcml2YXRlIFRhZ2xpYkhlbHBlckNhY2hlIGZDYWNoZSA9IG5ldyBUYWdsaWJIZWxwZXJDYWNoZSgzKTsKLQotICAgIHByaXZhdGUgVGFnbGliSGVscGVyTWFuYWdlcigpIHsKLSAgICAgICAgLy8gdXNlIGluc3RhbmNlCi0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFRhZ2xpYkhlbHBlck1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIGlmKGluc3RhbmNlID09IG51bGwpCi0gICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBUYWdsaWJIZWxwZXJNYW5hZ2VyKCk7Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFRhZ2xpYkhlbHBlciBnZXRUYWdsaWJIZWxwZXIoSUZpbGUgZikgewotICAgICAgICBJUHJvamVjdCBwID0gZi5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIHJldHVybiBnZXRIZWxwZXJGcm9tQ2FjaGUocCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBwcm9qZWN0UGF0aAotICAgICAqLwotICAgIHByaXZhdGUgVGFnbGliSGVscGVyIGdldEhlbHBlckZyb21DYWNoZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBmQ2FjaGUuZ2V0SGVscGVyKHByb2plY3QpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBVcGRhdGUgY2xhc3NwYXRoIGZvciBhcHByb3ByaWF0ZSBsb2FkZXIuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lciNlbGVtZW50Q2hhbmdlZChvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQotICAgICAgICAvLyBoYW5kbGUgY2xhc3NwYXRoIGNoYW5nZXMKLSAgICAgICAgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotICAgICAgICBpZihkZWx0YS5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9NT0RFTCkgewotICAgICAgICAgICAgSUphdmFFbGVtZW50RGVsdGFbXSBjaGFuZ2VkID0gZGVsdGEuZ2V0Q2hhbmdlZENoaWxkcmVuKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYW5nZWQubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoKGNoYW5nZWRbaV0uZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0xBU1NQQVRIX0NIQU5HRUQpICE9IDAgfHwgKGNoYW5nZWRbaV0uZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfUkVPUkRFUikgIT0gMCB8fCAoY2hhbmdlZFtpXS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRVNPTFZFRF9DTEFTU1BBVEhfQ0hBTkdFRCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBJSmF2YUVsZW1lbnQgcHJvaiA9IGNoYW5nZWRbaV0uZ2V0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbGFzc3BhdGhDaGFuZ2UoY2hhbmdlZCwgaSwgcHJvaik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBjaGFuZ2VkCi0gICAgICogQHBhcmFtIGkKLSAgICAgKiBAcGFyYW0gcHJvagotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDbGFzc3BhdGhDaGFuZ2UoSUphdmFFbGVtZW50RGVsdGFbXSBjaGFuZ2VkLCBpbnQgaSwgSUphdmFFbGVtZW50IHByb2opIHsKLSAgICAgICAgaWYgKHByb2ouZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUKSB7Ci0JCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAoKElKYXZhUHJvamVjdCkgcHJvaikuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJCWZDYWNoZS5yZW1vdmVIZWxwZXIocHJvamVjdE5hbWUpOwotCQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliVmFyaWFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFnbGliL1RhZ2xpYlZhcmlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3M2JiYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliVmFyaWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhZ2xpYjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5WYXJpYWJsZUluZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci0KLS8qKgotICogQ29udGFpbnMgaW5mbyBhYm91dCBhIFRhZ2xpYlZhcmlhYmxlOiBjbGFzc25hbWUsIHZhcmlhYmxlbmFtZS4KLSAqLwotcHVibGljIGNsYXNzIFRhZ2xpYlZhcmlhYmxlIHsKLQotCXByaXZhdGUgU3RyaW5nIGZWYXJDbGFzcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZlZhck5hbWUgPSBudWxsOwotCXByaXZhdGUgaW50IGZTY29wZTsKLQlwcml2YXRlIFN0cmluZyBmRGVzY3JpcHRpb247Ci0KLQkvKiogZml4ZWQgZW5kLW9mLWxpbmUgdmFsdWUgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBFTkRMID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUX0VORCA9ICJBVF9FTkQiOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVF9CRUdJTiA9ICJBVF9CRUdJTiI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE5FU1RFRCA9ICJORVNURUQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTV9QUklWQVRFID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNX05PTkUgPSAwOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFRhZ2xpYlZhcmlhYmxlKFN0cmluZyB2YXJDbGFzcywgU3RyaW5nIHZhck5hbWUsIGludCBzY29wZSkgewotCQlzZXRWYXJDbGFzcyh2YXJDbGFzcyk7Ci0JCXNldFZhck5hbWUodmFyTmFtZSk7Ci0JCXNldFNjb3BlKHNjb3BlKTsKLQl9Ci0KLQlwdWJsaWMgVGFnbGliVmFyaWFibGUoU3RyaW5nIHZhckNsYXNzLCBTdHJpbmcgdmFyTmFtZSwgU3RyaW5nIHNjb3BlKSB7Ci0JCXNldFZhckNsYXNzKHZhckNsYXNzKTsKLQkJc2V0VmFyTmFtZSh2YXJOYW1lKTsKLQkJc2V0U2NvcGUoc2NvcGUpOwotCX0KLQotCXB1YmxpYyBUYWdsaWJWYXJpYWJsZShTdHJpbmcgdmFyQ2xhc3MsIFN0cmluZyB2YXJOYW1lLCBTdHJpbmcgc2NvcGUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzZXRWYXJDbGFzcyh2YXJDbGFzcyk7Ci0JCXNldFZhck5hbWUodmFyTmFtZSk7Ci0JCXNldFNjb3BlKHNjb3BlKTsKLQkJc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCX0KLQotCVRhZ2xpYlZhcmlhYmxlKFN0cmluZyB2YXJDbGFzcywgU3RyaW5nIHZhck5hbWUsIGludCBzY29wZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXNldFZhckNsYXNzKHZhckNsYXNzKTsKLQkJc2V0VmFyTmFtZSh2YXJOYW1lKTsKLQkJc2V0U2NvcGUoc2NvcGUpOwotCQlzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmVmFyQ2xhc3MuCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRWYXJDbGFzcygpIHsKLQkJcmV0dXJuIGZWYXJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFyQ2xhc3MKLQkgKiAgICAgICAgICAgIFRoZSBmVmFyQ2xhc3MgdG8gc2V0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFZhckNsYXNzKFN0cmluZyB2YXJDbGFzcykgewotCQlmVmFyQ2xhc3MgPSB2YXJDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZWYXJOYW1lLgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VmFyTmFtZSgpIHsKLQkJcmV0dXJuIGZWYXJOYW1lOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YXJOYW1lCi0JICogICAgICAgICAgICBUaGUgZlZhck5hbWUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFZhck5hbWUoU3RyaW5nIHZhck5hbWUpIHsKLQkJZlZhck5hbWUgPSB2YXJOYW1lOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXREZWNsYXJhdGlvblN0cmluZygpIHsKLQkJcmV0dXJuIGdldERlY2xhcmF0aW9uU3RyaW5nKGZhbHNlLCBNX05PTkUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXREZWNsYXJhdGlvblN0cmluZyhib29sZWFuIGluY2x1ZGVEb2MsIGludCBzdHlsZSkgewotCQlTdHJpbmcgZGVjbGFyYXRpb24gPSBudWxsOwotCQkvKgotCQkgKiBubyBkZXNjcmlwdGlvbiBmb3Igbm93IC0tSkRUIHdvdWxkIG5lZWQgdG8gc2hvdyBpdCBmb3IgbG9jYWwKLQkJICogdmFyaWFibGVzIGFuZCBJTG9jYWxWYXJpYWJsZSBoYXMgbm8gImRvYyByYW5nZSIKLQkJICovCi0JCWlmIChpbmNsdWRlRG9jICYmIGdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkgewotCQkJaWYgKHN0eWxlID09IE1fUFJJVkFURSkgewotCQkJCWRlY2xhcmF0aW9uID0gIi8qKiAiICsgRU5ETCArIFN0cmluZ1V0aWxzLnJlcGxhY2UoZ2V0RGVzY3JpcHRpb24oKSwgIiovIiwgIipcXC8iKSArIEVOREwgKyAiICovICIgKyBFTkRMICsgInByaXZhdGUgIiArIGdldFZhckNsYXNzKCkgKyAiICIgKyBnZXRWYXJOYW1lKCkgKyAiID0gbnVsbDsiICsgRU5ETDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAgLy8kTk9OLU5MUy01JAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZGVjbGFyYXRpb24gPSAiLyoqICIgKyBFTkRMICsgU3RyaW5nVXRpbHMucmVwbGFjZShnZXREZXNjcmlwdGlvbigpLCAiKi8iLCAiKlxcLyIpICsgRU5ETCArICIgKi8gIiArIEVOREwgKyBnZXRWYXJDbGFzcygpICsgIiAiICsgZ2V0VmFyTmFtZSgpICsgIiA9IG51bGw7IiArIEVOREw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgIC8vJE5PTi1OTFMtNSQKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChzdHlsZSA9PSBNX1BSSVZBVEUpIHsKLQkJCQlkZWNsYXJhdGlvbiA9ICJwcml2YXRlICIgKyBnZXRWYXJDbGFzcygpICsgIiAiICsgZ2V0VmFyTmFtZSgpICsgIiA9IG51bGw7IiArIEVOREw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlkZWNsYXJhdGlvbiA9IGdldFZhckNsYXNzKCkgKyAiICIgKyBnZXRWYXJOYW1lKCkgKyAiID0gbnVsbDsiICsgRU5ETDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlY2xhcmF0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBmRGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIGludCBnZXRTY29wZSgpIHsKLQkJcmV0dXJuIGZTY29wZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTY29wZShpbnQgc2NvcGUpIHsKLQkJZlNjb3BlID0gc2NvcGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIHNjb3BlU3RyaW5nKSB7Ci0JCWludCBzY29wZSA9IFZhcmlhYmxlSW5mby5BVF9CRUdJTjsKLQotCQlTdHJpbmcgdHJpbW1lZFNjb3BlID0gc2NvcGVTdHJpbmcudHJpbSgpOwotCQlpZiAoTkVTVEVELmVxdWFscyh0cmltbWVkU2NvcGUpKSB7Ci0JCQlzY29wZSA9IFZhcmlhYmxlSW5mby5ORVNURUQ7Ci0JCX0KLQkJZWxzZSBpZiAoQVRfQkVHSU4uZXF1YWxzKHRyaW1tZWRTY29wZSkpIHsKLQkJCXNjb3BlID0gVmFyaWFibGVJbmZvLkFUX0JFR0lOOwotCQl9Ci0JCWVsc2UgaWYgKEFUX0VORC5lcXVhbHModHJpbW1lZFNjb3BlKSkgewotCQkJc2NvcGUgPSBWYXJpYWJsZUluZm8uQVRfRU5EOwotCQl9Ci0KLQkJZlNjb3BlID0gc2NvcGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCWZEZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFza3MvSlNQRmlsZVRhc2tTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Rhc2tzL0pTUEZpbGVUYXNrU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWY1ZmFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFza3MvSlNQRmlsZVRhc2tTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhc2tzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGFza3MuWE1MRmlsZVRhc2tTY2FubmVyOwotCi1wdWJsaWMgY2xhc3MgSlNQRmlsZVRhc2tTY2FubmVyIGV4dGVuZHMgWE1MRmlsZVRhc2tTY2FubmVyIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIElUZXh0UmVnaW9uIHRleHRSZWdpb24pIHsKLQkJcmV0dXJuIHN1cGVyLmlzQ29tbWVudFJlZ2lvbihyZWdpb24sIHRleHRSZWdpb24pIHx8IHRleHRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9URVhUKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk3NDMyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSlNQRG9jdW1lbnRIZWFkQ29udGVudERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuSlNQU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTJOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRleHQuSUpTUFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5UYWdNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Gb3JlaWduUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUw7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQIGV4dGVuZHMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciB7Ci0JLy8gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB2NS4xLjAsIHdlJ2xsIHJldXNlIFNUX0pTUF9ESVJFQ1RJVkUgZm9yIGFjdGlvbgotCS8vIHRhZ3MKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGZFbmFibGVKU1BBY3Rpb25QYXJ0aXRpb25zID0gdHJ1ZTsKLQkvLyBsaXN0IG9mIHZhbGlkIEpTUCAxLjIgdGFnIGFuZCBhY3Rpb24gbmFtZXMKLQlwcml2YXRlIHN0YXRpYyBMaXN0IGZKU1BBY3Rpb25UYWdOYW1lcyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfTUlNRV9UWVBFID0gInRleHQvaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEhUTUxfTUlNRV9UWVBFID0gInRleHQveGh0bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9NSU1FX1RZUEUgPSAidGV4dC94bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZORF9XQVBfV01MID0gInRleHQvdm5kLndhcC53bWwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbXXtJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVCwgSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFRfRUwsIElKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxUX0VMMiwgSUpTUFBhcnRpdGlvbnMuSlNQX0RJUkVDVElWRSwgSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfREVMSU1JVEVSLCBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBLCBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBULCBJSlNQUGFydGl0aW9ucy5KU1BfQ09NTUVOVH07Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCkgewotCQlyZXR1cm4gZkNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciBmRW1iZWRkZWRQYXJ0aXRpb25lciA9IG51bGw7Ci0JLyoKLQkgKiBTYXZlIGxhc3QgdGFnbGliIHByZWZpeCB0aGF0IHdhcyBjaGVja2VkIChzZWUgaXNBY3Rpb24oKSkgZm9yIGJldHRlcgotCSAqIHBlcmZvcm1hbmNlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZkxhc3RDaGVja2VkUHJlZml4ID0gbnVsbDsKLQotCS8qKgotCSAqIEFzc3VtZSBsYW5ndWFnZT1qYXZhIGJ5IGRlZmF1bHQgLi4uIGNsaWVudCwgc3VjaCBhcwotCSAqIFBhZ2VEaXJlY3RpdmVBZGFwdGVyLCBtdXN0IHNldCBsYW5ndWFnZSBvZiBkb2N1bWVudCBwYXJ0aXRpb25lciwKLQkgKiBpZi93aGVuIGl0IGNoYW5nZXMuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZkxhbmd1YWdlID0gImphdmEiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSlNQRG9jdW1lbnRQYXJ0aW9uZXIuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChmSlNQQWN0aW9uVGFnTmFtZXMgPT0gbnVsbCkgewotCQkJZkpTUEFjdGlvblRhZ05hbWVzID0gbmV3IEFycmF5TGlzdCgpOyAvLyB1c2VzIC5lcXVhbHMoKSBmb3IKLQkJCS8vIGNvbnRhaW5zKCkKLQkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuREVDTEFSQVRJT04pOwotCQkJLy8gZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfSU5DTFVERSk7Ci0JCQkvLyBmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9QQUdFKTsKLQkJCS8vIGZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQik7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVYUFJFU1NJT04pOwotCQkJZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5GQUxMQkFDSyk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUldBUkQpOwotCQkJZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5HRVRQUk9QRVJUWSk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLklOQ0xVREUpOwotCQkJZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5QQVJBTSk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNUyk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBMVUdJTik7Ci0JCQkvLyBmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlJPT1QpOwotCQkJZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFRMRVQpOwotCQkJZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5TRVRQUk9QRVJUWSk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRFWFQpOwotCQkJZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lciNjb25uZWN0KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXN1cGVyLmNvbm5lY3QoZG9jdW1lbnQpOwotCQlmU3VwcG9ydGVkVHlwZXMgPSBudWxsOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgY3JlYXRlU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcihJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCQlJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciByZXN1bHQgPSBudWxsOwotCQkvLyB0aGlzIHNhbWUgZGV0ZWN0b3Igc2hvdWxkIHVuZGVybHkgY29udGVudCBkZXNjcmliZXIsIHRvIGhhdmUgY29uc2lzdGVudCByZXN1bHRzCi0JCUpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvciBqc3BIZWFkQ29udGVudERldGVjdG9yID0gbmV3IEpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvcigpOwotCQlqc3BIZWFkQ29udGVudERldGVjdG9yLnNldChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQlTdHJpbmcgY29udGVudFR5cGUgPSBudWxsOwotCQl0cnkgewotCQkJY29udGVudFR5cGUgPSBqc3BIZWFkQ29udGVudERldGVjdG9yLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkvLyBpZiBYSFRNTCBvciBXTUwsIHRoYXQgdHJ1bXBzIHdoYXQgaXMgaW4gdGhlIHBhZ2UgZGlyZWN0aXZlCi0JCQlpZiAoanNwSGVhZENvbnRlbnREZXRlY3Rvci5pc1hIVE1MKCkgfHwganNwSGVhZENvbnRlbnREZXRlY3Rvci5pc1dNTCgpKSB7Ci0JCQkJY29udGVudFR5cGUgPSAidGV4dC9odG1sIjsKLQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlIGluIHRoaXMgY29udGV4dCwgc2luY2Ugd29ya2luZyB3aXRoIGRvY3VtZW50IHN0cmVhbQotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JCS8vIG51bGwgb3IgZW1wdHksIHRyZWF0IGFzICJkZWZhdWx0IgotCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCB8fCBjb250ZW50VHlwZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQljb250ZW50VHlwZSA9ICJ0ZXh0L2h0bWwiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gd2UgY3VycmVudGx5IG9ubHkgaGF2ZSB0d28gLi4uIGV2ZW50dWFsbHkgc2hvdWxkCi0JCS8vIG1ha2Ugb3IgdGllLWluIHRvIGV4aXN0aW5nIHJlZ2lzdHJ5LgotCQlpZiAoY29udGVudFR5cGUuZXF1YWxzSWdub3JlQ2FzZShIVE1MX01JTUVfVFlQRSkgfHwgY29udGVudFR5cGUuZXF1YWxzSWdub3JlQ2FzZShWTkRfV0FQX1dNTCkpIHsKLQkJCXJlc3VsdCA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTCgpOwotCQkJcmVzdWx0LmNvbm5lY3Qoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKFhIVE1MX01JTUVfVFlQRSkpIHsKLQkJCXJlc3VsdCA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTCgpOwotCQkJcmVzdWx0LmNvbm5lY3Qoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKFhNTF9NSU1FX1RZUEUpIHx8IGNvbnRlbnRUeXBlLmVuZHNXaXRoKCIreG1sIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0ID0gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwoKTsKLQkJCXJlc3VsdC5jb25uZWN0KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcigpOwotCQkJcmVzdWx0LmNvbm5lY3Qoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyI2Rpc2Nvbm5lY3QoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0JCWlmIChmRW1iZWRkZWRQYXJ0aXRpb25lciAhPSBudWxsKSB7Ci0JCQlmRW1iZWRkZWRQYXJ0aXRpb25lci5kaXNjb25uZWN0KCk7Ci0JCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDkwOQotCQkJLyoqCi0JCQkgKiBmb3JjZSByZWNyZWF0aW9uIHdoZW4gcmVjb25uZWN0ZWQKLQkJCSAqLwotCQkJZkVtYmVkZGVkUGFydGl0aW9uZXIgPSBudWxsOwotCQl9Ci0JCS8vIHN1cGVyLmRpc2Nvbm5lY3Qgc2hvdWxkIGNvbWUgYXQgZW5kLCBzaW5jZSBpdCAobWF5KSBzZXQKLQkJLy8gc3RydWN0dXJlZERvY3VtZW50IHRvIG51bGwKLQkJc3VwZXIuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKSB7Ci0JCXJldHVybiBnZXRFbWJlZGRlZFBhcnRpdGlvbmVyKCkuZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbWJlZGRlZFBhcnRpdGlvbmVyLgotCSAqIAotCSAqIEByZXR1cm4gSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgZ2V0RW1iZWRkZWRQYXJ0aXRpb25lcigpIHsKLQkJaWYgKGZFbWJlZGRlZFBhcnRpdGlvbmVyID09IG51bGwpIHsKLQkJCWZFbWJlZGRlZFBhcnRpdGlvbmVyID0gY3JlYXRlU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcihmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJCWZFbWJlZGRlZFBhcnRpdGlvbmVyLmNvbm5lY3QoZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gZkVtYmVkZGVkUGFydGl0aW9uZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFuZ3VhZ2UuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkgewotCQlyZXR1cm4gZkxhbmd1YWdlOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRMb2NhbExlZ2FsQ29udGVudFR5cGVzKCkgewotCQlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlPYmplY3RbXSBjb25maWd1cmVkVHlwZXMgPSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJlZFR5cGVzLmxlbmd0aDsgaSsrKQotCQkJdHlwZXMuYWRkKGNvbmZpZ3VyZWRUeXBlc1tpXSk7Ci0JCXJldHVybiB0eXBlczsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQYXJlbnROYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICJVTktOT1dOIjsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoc2RSZWdpb24gIT0gbnVsbCAmJiBpc1ZhbGlkSnNwQWN0aW9uUmVnaW9uVHlwZShzZFJlZ2lvbi5nZXRUeXBlKCkpKQotCQkJc2RSZWdpb24gPSBzZFJlZ2lvbi5nZXRQcmV2aW91cygpOwotCi0JCWlmIChzZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCS8vIG9ubHkgZmluZCBwYXJlbnQgbmFtZXMgZnJvbSBhIHN0YXJ0IHRhZwotCQkJaWYgKHJlZ2lvbnMuc2l6ZSgpID4gMSkgewotCQkJCUlUZXh0UmVnaW9uIHIgPSByZWdpb25zLmdldCgxKTsKLQkJCQlpZiAocmVnaW9ucy5nZXQoMCkuZ2V0VHlwZSgpLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgJiYgci5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSkgewotCQkJCQlyZXN1bHQgPSBzZFJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShGb3JlaWduUmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gZ2V0RW1iZWRkZWRQYXJ0aXRpb25lcigpLmdldFBhcnRpdGlvblR5cGUocmVnaW9uLCBvZmZzZXQpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJZmluYWwgU3RyaW5nIHJlZ2lvbl90eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSB7Ci0JCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlRm9yRG9jdW1lbnRMYW5ndWFnZSgpOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX1RFWFQgfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfT1BFTiB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9DTE9TRSkKLQkJCXJlc3VsdCA9IElKU1BQYXJ0aXRpb25zLkpTUF9DT01NRU5UOwotCQllbHNlIGlmIChyZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUgfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0UpCi0JCQlyZXN1bHQgPSBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFOwotCQllbHNlIGlmIChyZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0UgfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4gfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4pCi0JCQlyZXN1bHQgPSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9ERUxJTUlURVI7Ci0JCWVsc2UgaWYgKHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FKQotCQkJcmVzdWx0ID0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQ7Ci0JCWVsc2UgaWYgKHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9PUEVOIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9DT05URU5UIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9DTE9TRSB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfRFFVT1RFIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9TUVVPVEUgfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX1FVT1RFRF9DT05URU5UKQotCQkJcmVzdWx0ID0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFRfRUw7Ci0JCWVsc2UgaWYgKHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9WQkxfT1BFTiB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfVkJMX0NPTlRFTlQgfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1ZCTF9DTE9TRSB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfVkJMX0RRVU9URSB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfVkJMX1NRVU9URSB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfVkJMX1FVT1RFRF9DT05URU5UKQotCQkJcmVzdWx0ID0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFRfRUwyOwotCQllbHNlIGlmIChyZWdpb25fdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUKSB7Ci0JCQkvLyBCVUcxMzE0NjM6IHBvc3NpYmx5IGJldHdlZW4gPGpzcDpzY3JpcHRsZXQ+LCA8anNwOmV4cHJlc3Npb24+LAotCQkJLy8gPGpzcDpkZWNsYXJhdGlvbj4KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSB0aGlzLmZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChpc0pzcEphdmFBY3Rpb25OYW1lKGdldFBhcmVudE5hbWUoc2RSZWdpb24pKSkKLQkJCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlRm9yRG9jdW1lbnRMYW5ndWFnZSgpOwotCQkJZWxzZQotCQkJCXJlc3VsdCA9IGdldEVtYmVkZGVkUGFydGl0aW9uZXIoKS5nZXRQYXJ0aXRpb25UeXBlKHJlZ2lvbiwgb2Zmc2V0KTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25fdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB7Ci0JCQkvLyBwb3NzaWJseSBiZXR3ZWVuIDxqc3A6c2NyaXB0bGV0PiwgPGpzcDpleHByZXNzaW9uPiwKLQkJCS8vIDxqc3A6ZGVjbGFyYXRpb24+Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gdGhpcy5mU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlpZiAoaXNKc3BKYXZhQWN0aW9uTmFtZShnZXRQYXJlbnROYW1lKHNkUmVnaW9uKSkpCi0JCQkJcmVzdWx0ID0gZ2V0UGFydGl0aW9uVHlwZUZvckRvY3VtZW50TGFuZ3VhZ2UoKTsKLQkJCWVsc2UKLQkJCQlyZXN1bHQgPSBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gZ2V0RW1iZWRkZWRQYXJ0aXRpb25lcigpLmdldFBhcnRpdGlvblR5cGUocmVnaW9uLCBvZmZzZXQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlQmV0d2VlbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzTm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0Tm9kZSkgewotCQlyZXR1cm4gZ2V0RW1iZWRkZWRQYXJ0aXRpb25lcigpLmdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKHByZXZpb3VzTm9kZSwgbmV4dE5vZGUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFBhcnRpdGlvblR5cGVGb3JEb2N1bWVudExhbmd1YWdlKCkgewotCQlTdHJpbmcgcmVzdWx0OwotCQlpZiAoZkxhbmd1YWdlID09IG51bGwgfHwgZkxhbmd1YWdlLmVxdWFsc0lnbm9yZUNhc2UoImphdmEiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQgPSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBOwotCQl9Ci0JCWVsc2UgaWYgKGZMYW5ndWFnZS5lcXVhbHNJZ25vcmVDYXNlKCJqYXZhc2NyaXB0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0ID0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVDsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IElKU1BQYXJ0aXRpb25zLkpTUF9TQ1JJUFRfUFJFRklYICsgZ2V0TGFuZ3VhZ2UoKS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0TGVnYWxDb250ZW50VHlwZXMoKSB7Ci0JCUxpc3QgY29tYmluZWRUeXBlcyA9IGdldExvY2FsTGVnYWxDb250ZW50VHlwZXMoKTsKLQkJaWYgKGdldEVtYmVkZGVkUGFydGl0aW9uZXIoKSAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBtb3JlVHlwZXMgPSBnZXRFbWJlZGRlZFBhcnRpdGlvbmVyKCkuZ2V0TGVnYWxDb250ZW50VHlwZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9yZVR5cGVzLmxlbmd0aDsgaSsrKQotCQkJCWNvbWJpbmVkVHlwZXMuYWRkKG1vcmVUeXBlc1tpXSk7Ci0JCX0KLQkJZlN1cHBvcnRlZFR5cGVzID0gbmV3IFN0cmluZ1swXTsKLQkJY29tYmluZWRUeXBlcy50b0FycmF5KGZTdXBwb3J0ZWRUeXBlcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNkUmVnaW9uCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNBY3Rpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlpZiAoIXNkUmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvKgotCQkgKiBzaG91bGRuJ3QgZ2V0IGEgdGFnIG5hbWUgcmVnaW9uIHR5cGUgdW5sZXNzIGEgdGFnIG5hbWUgcmVnaW9uCi0JCSAqIGV4aXN0cyBhdCBbMV0KLQkJICovCi0JCUlUZXh0UmVnaW9uIHRhZ05hbWVSZWdpb24gPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQlTdHJpbmcgdGFnTmFtZSA9IHNkUmVnaW9uLmdldFRleHQodGFnTmFtZVJlZ2lvbik7Ci0KLQkJUmVnaW9uUGFyc2VyIHBhcnNlciA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCk7Ci0JCWlmIChwYXJzZXIgaW5zdGFuY2VvZiBKU1BTb3VyY2VQYXJzZXIpIHsKLQkJCWlmICh0YWdOYW1lLmVxdWFscyhmTGFzdENoZWNrZWRQcmVmaXgpKQotCQkJCXJldHVybiB0cnVlOwotCQkJTGlzdCBmQ3VzdG9tQWN0aW9uUHJlZml4ZXMgPSAoKEpTUFNvdXJjZVBhcnNlcikgcGFyc2VyKS5nZXROZXN0YWJsZVByZWZpeGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZDdXN0b21BY3Rpb25QcmVmaXhlcy5zaXplKCk7IGkrKykKLQkJCQlpZiAodGFnTmFtZS5zdGFydHNXaXRoKCgoVGFnTWFya2VyKSBmQ3VzdG9tQWN0aW9uUHJlZml4ZXMuZ2V0KGkpKS5nZXRUYWdOYW1lKCkpKSB7Ci0JCQkJCWZMYXN0Q2hlY2tlZFByZWZpeCA9ICgoVGFnTWFya2VyKSBmQ3VzdG9tQWN0aW9uUHJlZml4ZXMuZ2V0KGkpKS5nZXRUYWdOYW1lKCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEb2N1bWVudFJlZ2lvbkJhc2VkUGFydGl0aW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24sIElUZXh0UmVnaW9uIGNvbnRhaW5lZENoaWxkUmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyBkb2N1bWVudFJlZ2lvbkNvbnRleHQgPSBzZFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmIChjb250YWluZWRDaGlsZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlpZiAoZG9jdW1lbnRSZWdpb25Db250ZXh0LmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHx8IGRvY3VtZW50UmVnaW9uQ29udGV4dC5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUUpKSB7Ci0JCQkJc2V0SW50ZXJuYWxQYXJ0aXRpb24ob2Zmc2V0LCBjb250YWluZWRDaGlsZFJlZ2lvbi5nZXRMZW5ndGgoKSwgSUpTUFBhcnRpdGlvbnMuSlNQX0RJUkVDVElWRSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEzMzQ2Ci0JCQlpZiAoZkVuYWJsZUpTUEFjdGlvblBhcnRpdGlvbnMgJiYgaXNBY3Rpb24oc2RSZWdpb24sIG9mZnNldCkgJiYgIShjb250YWluZWRDaGlsZFJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSkgewotCQkJCS8vIGlmIChmRW5hYmxlSlNQQWN0aW9uUGFydGl0aW9ucyAmJiBpc0FjdGlvbihzZFJlZ2lvbiwKLQkJCQkvLyBvZmZzZXQpKSB7Ci0JCQkJc2V0SW50ZXJuYWxQYXJ0aXRpb24ob2Zmc2V0LCBjb250YWluZWRDaGlsZFJlZ2lvbi5nZXRMZW5ndGgoKSwgSUpTUFBhcnRpdGlvbnMuSlNQX0RJUkVDVElWRSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzRG9jdW1lbnRSZWdpb25CYXNlZFBhcnRpdGlvbihzZFJlZ2lvbiwgY29udGFpbmVkQ2hpbGRSZWdpb24sIG9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBvc3NpYmxlSnNwSmF2YUFjdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNKc3BKYXZhQWN0aW9uTmFtZShTdHJpbmcgcG9zc2libGVKc3BKYXZhQWN0aW9uKSB7Ci0JCXJldHVybiBwb3NzaWJsZUpzcEphdmFBY3Rpb24uZXF1YWxzKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVExFVCkgfHwgcG9zc2libGVKc3BKYXZhQWN0aW9uLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5FWFBSRVNTSU9OKSB8fCBwb3NzaWJsZUpzcEphdmFBY3Rpb24uZXF1YWxzKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRFQ0xBUkFUSU9OKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZEpzcEFjdGlvblJlZ2lvblR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJLy8gdHJ1ZSBmb3IgYW55dGhpbmcgdGhhdCBjYW4gYmUgd2l0aGluIDxqc3A6c2NyaXB0bGV0PiwKLQkJLy8gPGpzcDpleHByZXNzaW9uPiwgPGpzcDpkZWNsYXJhdGlvbj4KLQkJcmV0dXJuIHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCB8fCB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCB8fCB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4gfHwgdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUIHx8IHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0U7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIG5ld0luc3RhbmNlKCkgewotCQlTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQIGluc3RhbmNlID0gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1AoKTsKLQkJaW5zdGFuY2Uuc2V0RW1iZWRkZWRQYXJ0aXRpb25lcihjcmVhdGVTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKGZTdHJ1Y3R1cmVkRG9jdW1lbnQpKTsKLQkJaW5zdGFuY2Uuc2V0TGFuZ3VhZ2UoZkxhbmd1YWdlKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGVtYmVkZGVkUGFydGl0aW9uZXIuCi0JICogCi0JICogQHBhcmFtIGVtYmVkZGVkUGFydGl0aW9uZXIKLQkgKiAgICAgICAgICAgIFRoZSBlbWJlZGRlZFBhcnRpdGlvbmVyIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVtYmVkZGVkUGFydGl0aW9uZXIoSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgZW1iZWRkZWRQYXJ0aXRpb25lcikgewotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDkwOQotCQkvKioKLQkJICogbWFuYWdlIGNvbm5lY3RlZCBzdGF0ZSBvZiBlbWJlZGRlZCBwYXJ0aXRpb25lcgotCQkgKi8KLQkJaWYgKGZFbWJlZGRlZFBhcnRpdGlvbmVyICE9IG51bGwgJiYgZlN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlmRW1iZWRkZWRQYXJ0aXRpb25lci5kaXNjb25uZWN0KCk7Ci0JCX0KLQotCQl0aGlzLmZFbWJlZGRlZFBhcnRpdGlvbmVyID0gZW1iZWRkZWRQYXJ0aXRpb25lcjsKLQotCQlpZiAoZkVtYmVkZGVkUGFydGl0aW9uZXIgIT0gbnVsbCAmJiBmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCWZFbWJlZGRlZFBhcnRpdGlvbmVyLmNvbm5lY3QoZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbFBhcnRpdGlvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdHlwZSkgewotCQkvLyBUT0RPOiBuZWVkIHRvIGNhcnJ5IHRoaXMgc2luZ2xlIGluc3RhbmNlIGlkZWEgZnVydGhlciB0byBiZQotCQkvLyBjb21wbGV0ZSwKLQkJLy8gYnV0IGhvcGVmdWxseSB0aGlzIHdpbGwgYmUgbGVzcyBnYXJiYWdlIHRoYW4gYmVmb3JlIChlc3BlY2lhbGx5IGZvcgotCQkvLyBIVE1MLCBYTUwsCi0JCS8vIG5hdHVyYWxseSEpCi0JCWludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlID0gZ2V0RW1iZWRkZWRQYXJ0aXRpb25lcigpLmNyZWF0ZVBhcnRpdGlvbihvZmZzZXQsIGxlbmd0aCwgdHlwZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYW5ndWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGFuZ3VhZ2UKLQkgKiAgICAgICAgICAgIFRoZSBsYW5ndWFnZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYW5ndWFnZShTdHJpbmcgbGFuZ3VhZ2UpIHsKLQkJdGhpcy5mTGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9Db21tb25YTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9Db21tb25YTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RiMzM2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvQ29tbW9uWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgQ29tbW9uWE1MIHsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIERvY3VtZW50QnVpbGRlciBnZXREb2N1bWVudEJ1aWxkZXIoKSB7Ci0JCURvY3VtZW50QnVpbGRlciByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQl9Ci0JCWNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBEb2N1bWVudEJ1aWxkZXIgZ2V0RG9jdW1lbnRCdWlsZGVyKGJvb2xlYW4gdmFsaWRhdGluZykgewotCQlEb2N1bWVudEJ1aWxkZXIgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgaW5zdGFuY2UgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCQlpbnN0YW5jZS5zZXRWYWxpZGF0aW5nKHZhbGlkYXRpbmcpOwotCQkJaW5zdGFuY2Uuc2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcyhmYWxzZSk7Ci0JCQlpbnN0YW5jZS5zZXRDb2FsZXNjaW5nKHRydWUpOwotCQkJcmVzdWx0ID0gaW5zdGFuY2UubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXJpYWxpemUoRG9jdW1lbnQgZG9jdW1lbnQsIE91dHB1dFN0cmVhbSBvc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTb3VyY2UgZG9tU291cmNlID0gbmV3IERPTVNvdXJjZShkb2N1bWVudCk7Ci0JCXRyeSB7Ci0JCQlUcmFuc2Zvcm1lciBzZXJpYWxpemVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKLQkJCXRyeSB7Ci0JCQkJc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQiLCAiNCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsICJVVEYtMTYiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gdW5zdXBwb3J0ZWQgcHJvcGVydGllcwotCQkJfQotCQkJc2VyaWFsaXplci50cmFuc2Zvcm0oZG9tU291cmNlLCBuZXcgU3RyZWFtUmVzdWx0KG9zdHJlYW0pKTsKLQkJfQotCQljYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJY2F0Y2ggKFRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC91dGlsL0RvY3VtZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9Eb2N1bWVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MDcwODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC91dGlsL0RvY3VtZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5KYXJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogQW4gWE1MIENyZWF0b3IvUmVhZGVyL1dyaXRlciB0aGF0IDEpIElnbm9yZXMgYW55IERvY3VtZW50VHlwZSBOb2RlcyBmb3VuZAotICogd2l0aGluIHRoZSBkb2N1bWVudCAoYXMgd2VsbCBhcyBhbnkgZW50aXRpZXMpIDIpIElnbm9yZXMgYW55Ci0gKiBlcnJvcnMvZXhjZXB0aW9ucyBmcm9tIFhlcmNlcyB3aGVuIGxvYWRpbmcgYSBkb2N1bWVudCAzKSBDYW4gbG9hZCBEb2N1bWVudHMKLSAqIGZyb20gd2l0aGluIGEgLkpBUiBmaWxlICgqKipyZWFkLW9ubHkqKiopCi0gKi8KLQotcHVibGljIGNsYXNzIERvY3VtZW50UHJvdmlkZXIgewotCXByaXZhdGUgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkJhc2VSZWZlcmVuY2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZmlsZU5hbWUgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmVmFsaWRhdGluZyA9IGZhbHNlOwotCXByaXZhdGUgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGphckZpbGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIEVudGl0eVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLQotCXByaXZhdGUgTm9kZSByb290RWxlbWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgcm9vdEVsZW1lbnROYW1lID0gbnVsbDsKLQotCXB1YmxpYyBEb2N1bWVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIF9nZXRGaWxlTmFtZSgpIHsKLQkJaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoaXNKQVIoKSkgewotCQkJcmV0dXJuIGdldEphckZpbGVOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGdldEZpbGVOYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBEb2N1bWVudCBfZ2V0UGFyc2VkRG9jdW1lbnRET00yKCkgewotCQlEb2N1bWVudCByZXN1bHQgPSBudWxsOwotCi0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZ2V0RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQkvLyBET01QYXJzZXIgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpOwotCQkJLy8gcGFyc2VyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9jb250aW51ZS1hZnRlci1mYXRhbC1lcnJvciIsCi0JCQkvLyBmYWxzZSk7Ly8kTk9OLU5MUy0xJAotCQkJLy8gcGFyc2VyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9ub252YWxpZGF0aW5nL2xvYWQtZHRkLWdyYW1tYXIiLAotCQkJLy8gZmFsc2UpOy8vJE5PTi1OTFMtMSQKLQkJCS8vIHBhcnNlci5zZXRFcnJvckhhbmRsZXIoZ2V0TnVsbEVycm9ySGFuZGxlcigpKTsKLQkJCS8vIHBhcnNlci5zZXRFbnRpdHlSZXNvbHZlcihnZXROdWxsRW50aXR5UmVzb2x2ZXIoKSk7Ci0JCQkvLyBpcyA9IGdldElucHV0U3RyZWFtKCk7Ci0JCQlidWlsZGVyLnNldEVudGl0eVJlc29sdmVyKGdldEVudGl0eVJlc29sdmVyKCkpOwotCQkJYnVpbGRlci5zZXRFcnJvckhhbmRsZXIoZ2V0TnVsbEVycm9ySGFuZGxlcigpKTsKLQkJCWlzID0gZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCWlmIChpcyAhPSBudWxsKQotCQkJCXJlc3VsdCA9IGJ1aWxkZXIucGFyc2UoaXMsIGdldEJhc2VSZWZlcmVuY2UoKSk7Ci0JCX0KLQkJY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBwYXJzaW5nIGV4Y2VwdGlvbiwgbm90aWZ5IHRoZSB1c2VyPwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIlNBWEV4Y2VwdGlvbiB3aGlsZSByZWFkaW5nIGRlc2NyaXB0b3IgIiArIF9nZXRGaWxlTmFtZSgpICsgIiAiICsgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gTk9UIGFuICJleGNlcHRpb25hbCBjYXNlIjsgZG8gbm90IExvZwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiSU9FeGNlcHRpb24gd2hpbGUgcmVhZGluZyBkZXNjcmlwdG9yICIgKyBfZ2V0RmlsZU5hbWUoKSArICIgIiArIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChpcyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaXMuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHdoYXQgY2FuIGJlIGRvbmU/Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZVJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIGZCYXNlUmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBnZXREb2N1bWVudCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoYm9vbGVhbiBjcmVhdGVFbXB0eU9uRmFpbHVyZSkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCWxvYWQoY3JlYXRlRW1wdHlPbkZhaWx1cmUpOwotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JVGhyZWFkTG9jYWwgZkRvY3VtZW50QnVpbGRlciA9IG5ldyBUaHJlYWRMb2NhbCgpOwotCQotCXByaXZhdGUgRG9jdW1lbnRCdWlsZGVyIGdldERvY3VtZW50QnVpbGRlcigpIHsKLQkJRG9jdW1lbnRCdWlsZGVyIGRiID0gbnVsbDsKLQotCQlSZWZlcmVuY2UgYnVpbGRlclJlZmVyZW5jZSA9IChSZWZlcmVuY2UpIGZEb2N1bWVudEJ1aWxkZXIuZ2V0KCk7Ci0JCWlmIChidWlsZGVyUmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCWRiID0gKERvY3VtZW50QnVpbGRlcikgYnVpbGRlclJlZmVyZW5jZS5nZXQoKTsKLQkJfQotCQlpZiAoZGIgPT0gbnVsbCkgewotCQkJZGIgPSBDb21tb25YTUwuZ2V0RG9jdW1lbnRCdWlsZGVyKGlzVmFsaWRhdGluZygpKTsKLQkJCWZEb2N1bWVudEJ1aWxkZXIuc2V0KG5ldyBTb2Z0UmVmZXJlbmNlKGRiKSk7Ci0JCX0KLQkJcmV0dXJuIGRiOwotCX0KLQotCXByaXZhdGUgRE9NSW1wbGVtZW50YXRpb24gZ2V0RG9tSW1wbGVtZW50YXRpb24oKSB7Ci0JCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJ1aWxkZXIgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZTEpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTEpOwotCQl9Ci0JCWNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUxKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUxKTsKLQkJfQotCQlET01JbXBsZW1lbnRhdGlvbiBpbXBsID0gYnVpbGRlci5nZXRET01JbXBsZW1lbnRhdGlvbigpOwotCQlyZXR1cm4gaW1wbDsKLQl9Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIFRha2VzIGEgc2luZ2xlIHN0cmluZyBvZiB0aGUgZm9ybSAiYS9iL2MiIGFuZCBlbnN1cmVzIHRoYXQgdGhhdAotCSAqIHN0cnVjdHVyZSBleGlzdHMgYmVsb3cgdGhlIGhlYWQgZWxlbWVudCwgZG93biB0aHJvdWdoICdjJywgYW5kIHJldHVybnMKLQkgKiBhIDxlbT5zaW5nbGU8L2VtPiBlbGVtZW50ICdjJy4gRm9yIG11bHRpcGxlIGVsZW1lbnRzIChzdWNoIGFzCi0JICogbXVsdGlwbGUgJmx0O21hY3JvJmd0OyBlbGVtZW50cyBjb250YWluZWQgd2l0aGluIGEgc2luZ2xlCi0JICogJmx0O21hY3JvcyZndDsgZWxlbWVudCwgZnVsbCBET00gYWNjZXNzIGlzIHJlcXVpcmVkIGZvciBzZWFyY2hpbmcgYW5kCi0JICogY2hpbGQgZWxlbWVudCBtYW5pcHVsYXRpb24uCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50KFN0cmluZyBuYW1lKSB7Ci0JCUVsZW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlsb2FkKGZhbHNlKTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IChFbGVtZW50KSBnZXROb2RlKGdldFJvb3RFbGVtZW50KCksIG5hbWUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBFbnRpdHlSZXNvbHZlciB0aGF0IHdvbid0IHRyeSB0byBsb2FkIGFuZCByZXNvbHZlIEFOWQotCSAqIGVudGl0aWVzCi0JICovCi0JcHJpdmF0ZSBFbnRpdHlSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcigpIHsKLQkJaWYgKHJlc29sdmVyID09IG51bGwpIHsKLQkJCXJlc29sdmVyID0gbmV3IEVudGl0eVJlc29sdmVyKCkgewotCQkJCXB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJRCwgU3RyaW5nIHN5c3RlbUlEKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCQkJCUlucHV0U291cmNlIHJlc3VsdCA9IG51bGw7Ci0JCQkJCWlmIChpc1ZhbGlkYXRpbmcoKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlVUkwgc3BlYyA9IG5ldyBVUkwoImZpbGU6Ly8iICsgZ2V0QmFzZVJlZmVyZW5jZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVVSTCB1cmwgPSBuZXcgVVJMKHNwZWMsIHN5c3RlbUlEKTsKLQkJCQkJCQlpZiAodXJsLmdldFByb3RvY29sKCkuc3RhcnRzV2l0aCgiZmlsZToiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCVVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotCQkJCQkJCQlyZXN1bHQgPSBuZXcgSW5wdXRTb3VyY2Uoc3lzdGVtSUQgIT0gbnVsbCA/IHN5c3RlbUlEIDogIi9fIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXJlc3VsdC5zZXRQdWJsaWNJZChwdWJsaWNJRCk7Ci0JCQkJCQkJCXJlc3VsdC5zZXRCeXRlU3RyZWFtKGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJcmVzdWx0ID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQkJcmVzdWx0ID0gbmV3IElucHV0U291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSkpOwotCQkJCQkJcmVzdWx0LnNldFB1YmxpY0lkKHB1YmxpY0lEKTsKLQkJCQkJCXJlc3VsdC5zZXRTeXN0ZW1JZChzeXN0ZW1JRCAhPSBudWxsID8gc3lzdGVtSUQgOiAiL18iICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiByZXNvbHZlcjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgewotCQlyZXR1cm4gZmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbmQgaW5wdXQgc3RyZWFtIHRvIHVzZSBhcyB0aGUgc291cmNlIG9mIHRoZSBEb2N1bWVudCAxKSBmcm9tCi0JICogYW4gSW5wdXRTdHJlYW0gc2V0IG9uIHRoaXMgaW5zdGFuY2UgMikgZnJvbSBhIEpBUiBmaWxlIHdpdGggdGhlIGdpdmVuCi0JICogZW50cnkgbmFtZSAzKSBmcm9tIGEgbm9ybWFsIGZpbGUKLQkgKiAKLQkgKiBAcmV0dXJuIElucHV0U3RyZWFtCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKQotCQkJcmV0dXJuIGlucHV0U3RyZWFtOwotCQllbHNlIGlmIChpc0pBUigpKSB7Ci0JCQlyZXR1cm4gSmFyVXRpbGl0aWVzLmdldElucHV0U3RyZWFtKGdldEphckZpbGVOYW1lKCksIGdldEZpbGVOYW1lKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZ2V0RmlsZU5hbWUoKSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKYXJGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIGphckZpbGVOYW1lOwotCX0KLQotCXByaXZhdGUgTm9kZSBnZXROYW1lZENoaWxkKE5vZGUgcGFyZW50LCBTdHJpbmcgY2hpbGROYW1lKSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTm9kZUxpc3QgY2hpbGRMaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZExpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKGNoaWxkTGlzdC5pdGVtKGkpLmdldE5vZGVOYW1lKCkuZXF1YWxzKGNoaWxkTmFtZSkpCi0JCQkJcmV0dXJuIGNoaWxkTGlzdC5pdGVtKGkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgRG9jdW1lbnQgZ2V0TmV3RG9jdW1lbnQoKSB7Ci0JCURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBnZXREb21JbXBsZW1lbnRhdGlvbigpLmNyZWF0ZURvY3VtZW50KCJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLCBnZXRSb290RWxlbWVudE5hbWUoKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCU5vZGVMaXN0IGNoaWxkcmVuID0gcmVzdWx0LmdldENoaWxkTm9kZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCXJlc3VsdC5yZW1vdmVDaGlsZChjaGlsZHJlbi5pdGVtKGkpKTsKLQkJCX0KLQkJCS8vIHdlJ3JlIGdvaW5nIHRocm91Z2ggdGhpcyBlZmZvcnQgdG8gYXZvaWQgYSBOUyBlbGVtZW50Ci0JCQlFbGVtZW50IHNldHRpbmdzID0gcmVzdWx0LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwgZ2V0Um9vdEVsZW1lbnROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQuYXBwZW5kQ2hpbGQoc2V0dGluZ3MpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXRjaCAoRE9NRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBUYWtlcyBhIHNpbmdsZSBzdHJpbmcgb2YgdGhlIGZvcm0gImEvYi9jIiBhbmQgZW5zdXJlcyB0aGF0IHRoYXQKLQkgKiBzdHJ1Y3R1cmUgZXhpc3RzIGJlbG93IHRoZSBoZWFkIGVsZW1lbnQsIGRvd24gdGhyb3VnaCAnYycsIGFuZCByZXR1cm5zCi0JICogdGhlIGVsZW1lbnQgJ2MnLgotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JcHJpdmF0ZSBOb2RlIGdldE5vZGUoTm9kZSBub2RlLCBTdHJpbmcgbmFtZSkgewotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihuYW1lLCAiLyIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0b2tlbiA9IG51bGw7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQl0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCWlmIChnZXROYW1lZENoaWxkKG5vZGUsIHRva2VuKSA9PSBudWxsKQotCQkJCW5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0b2tlbikpOwotCQkJbm9kZSA9IGdldE5hbWVkQ2hpbGQobm9kZSwgdG9rZW4pOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gRXJyb3JIYW5kbGVyIHRoYXQgd2lsbCBub3Qgc3RvcCB0aGUgcGFyc2VyIG9uIHJlcG9ydGVkCi0JICogZXJyb3JzCi0JICovCi0JcHJpdmF0ZSBFcnJvckhhbmRsZXIgZ2V0TnVsbEVycm9ySGFuZGxlcigpIHsKLQkJaWYgKGVycm9ySGFuZGxlciA9PSBudWxsKSB7Ci0JCQllcnJvckhhbmRsZXIgPSBuZXcgRXJyb3JIYW5kbGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJTQVhQYXJzZUV4Y2VwdGlvbiB3aXRoICIgKyBmQmFzZVJlZmVyZW5jZSArICIvIiArIGdldEphckZpbGVOYW1lKCkgKyAiLyIgKyBnZXRGaWxlTmFtZSgpICsgIiAoZXJyb3IpIHdoaWxlIHJlYWRpbmcgZGVzY3JpcHRvcjogIiArIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiU0FYUGFyc2VFeGNlcHRpb24gd2l0aCAiICsgZkJhc2VSZWZlcmVuY2UgKyAiLyIgKyBnZXRKYXJGaWxlTmFtZSgpICsgIi8iICsgZ2V0RmlsZU5hbWUoKSArICIgKGZhdGFsRXJyb3IpIHdoaWxlIHJlYWRpbmcgZGVzY3JpcHRvcjogIiArIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIlNBWFBhcnNlRXhjZXB0aW9uIHdpdGggIiArIGZCYXNlUmVmZXJlbmNlICsgIi8iICsgZ2V0SmFyRmlsZU5hbWUoKSArICIvIiArIGdldEZpbGVOYW1lKCkgKyAiICh3YXJuaW5nKSB3aGlsZSByZWFkaW5nIGRlc2NyaXB0b3I6ICIgKyBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBlcnJvckhhbmRsZXI7Ci0JfQotCi0JcHJpdmF0ZSBEb2N1bWVudCBnZXRQYXJzZWREb2N1bWVudCgpIHsKLQkJRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGlucHV0U3RyZWFtID09IG51bGwpIHsKLQkJCUZpbGUgZXhpc3RlbmNlVGVzdGVyID0gbnVsbDsKLQkJCWlmIChpc0pBUigpKQotCQkJCWV4aXN0ZW5jZVRlc3RlciA9IG5ldyBGaWxlKGdldEphckZpbGVOYW1lKCkpOwotCQkJZWxzZQotCQkJCWV4aXN0ZW5jZVRlc3RlciA9IG5ldyBGaWxlKGdldEZpbGVOYW1lKCkpOwotCQkJaWYgKCFleGlzdGVuY2VUZXN0ZXIuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXN1bHQgPSBfZ2V0UGFyc2VkRG9jdW1lbnRET00yKCk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJvb3QgRWxlbWVudCBvZiB0aGUgY3VycmVudCBkb2N1bWVudAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXB1YmxpYyBOb2RlIGdldFJvb3RFbGVtZW50KCkgewotCQlyZXR1cm4gZ2V0Um9vdEVsZW1lbnQoZ2V0RG9jdW1lbnQoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUvYSByb290IEVsZW1lbnQgZm9yIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJpdmF0ZSBOb2RlIGdldFJvb3RFbGVtZW50KERvY3VtZW50IGRvYykgewotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKSAhPSBudWxsKQotCQkJcmV0dXJuIGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJdHJ5IHsKLQkJCUVsZW1lbnQgbmV3Um9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChnZXRSb290RWxlbWVudE5hbWUoKSk7Ci0JCQlkb2MuYXBwZW5kQ2hpbGQobmV3Um9vdEVsZW1lbnQpOwotCQkJcmV0dXJuIG5ld1Jvb3RFbGVtZW50OwotCQl9Ci0JCWNhdGNoIChET01FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSb290RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiByb290RWxlbWVudE5hbWU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSkFSKCkgewotCQlyZXR1cm4gZ2V0SmFyRmlsZU5hbWUoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRpbmcoKSB7Ci0JCXJldHVybiBmVmFsaWRhdGluZzsKLQl9Ci0KLQl2b2lkIGxvYWQoYm9vbGVhbiBjcmVhdGVFbXB0eU9uRmFpbHVyZSkgewotCQkvLyByb290RWxlbWVudE5hbWUgYW5kIGZpbGVOYW1lIGFyZSBleHBlY3RlZCB0byBiZSBkZWZpbmVkIGF0IHRoaXMKLQkJLy8gcG9pbnQKLQkJZG9jdW1lbnQgPSBnZXRQYXJzZWREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKHJvb3RFbGVtZW50TmFtZSAhPSBudWxsKQotCQkJCXJvb3RFbGVtZW50ID0gZ2V0Um9vdEVsZW1lbnQoZG9jdW1lbnQpOwotCQkJZWxzZQotCQkJCXJvb3RFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCX0KLQotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCB8fCByb290RWxlbWVudCA9PSBudWxsKSB7Ci0JCQlpZiAoY3JlYXRlRW1wdHlPbkZhaWx1cmUpIHsKLQkJCQlkb2N1bWVudCA9IGdldE5ld0RvY3VtZW50KCk7Ci0JCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQkJaWYgKGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVOYW1lKCkuZXF1YWxzKGdldFJvb3RFbGVtZW50TmFtZSgpKSkKLQkJCQkJCQlyb290RWxlbWVudCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJCX0KLQkJCQkJaWYgKHJvb3RFbGVtZW50ID09IG51bGwpIHsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQkJCWlmIChjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCQkJcm9vdEVsZW1lbnQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFzZVJlZmVyZW5jZShTdHJpbmcgc3RyaW5nKSB7Ci0JCWZCYXNlUmVmZXJlbmNlID0gc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdGaWxlTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKGphdmEubGFuZy5TdHJpbmcgbmV3RmlsZU5hbWUpIHsKLQkJZmlsZU5hbWUgPSBuZXdGaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbnB1dFN0cmVhbSBmb3Igd2hpY2ggdG8gcHJvdmlkZSBhIERvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dFN0cmVhbQotCSAqICAgICAgICAgICAgVGhlIGlucHV0U3RyZWFtIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElucHV0U3RyZWFtKElucHV0U3RyZWFtIGlTdHJlYW0pIHsKLQkJdGhpcy5pbnB1dFN0cmVhbSA9IGlTdHJlYW07Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0phckZpbGVOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0SmFyRmlsZU5hbWUoamF2YS5sYW5nLlN0cmluZyBuZXdKYXJGaWxlTmFtZSkgewotCQlqYXJGaWxlTmFtZSA9IG5ld0phckZpbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdSb290RWxlbWVudE5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb290RWxlbWVudE5hbWUoamF2YS5sYW5nLlN0cmluZyBuZXdSb290RWxlbWVudE5hbWUpIHsKLQkJcm9vdEVsZW1lbnROYW1lID0gbmV3Um9vdEVsZW1lbnROYW1lOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdGluZyhib29sZWFuIGIpIHsKLQkJZlZhbGlkYXRpbmcgPSBiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9GYWNldE1vZHVsZUNvcmVTdXBwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzVkOWIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9GYWNldE1vZHVsZUNvcmVTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIGFueSB1c2VkIE1vZHVsZSBDb3JlIGFuZCBGYWNldHMgQVBJcyBhbG9uZyB3aXRoCi0gKiBmYWxsYmFja3MgZm9yIHVzZSBvbiBub24tY29tcGxpYW50IHByb2plY3RzIGFuZCB3aGVuIHRob3NlIHNlcnZpY2VzIGFyZSBub3QKLSAqIGF2YWlsYWJsZSBhdCBydW50aW1lLgotICogCi0gKiBCZWNhdXNlIE1vZHVsZUNvcmUgQVBJIGNhbGxzIGNhbiByZXN1bHQgaW4gbG9ja3MgbmVlZGluZyB0byBiZSBhY3F1aXJlZCwKLSAqIG5vbmUgb2YgdGhlc2UgbWV0aG9kcyBzaG91bGQgYmUgY2FsbGVkIHdoaWxlIG90aGVyIHRocmVhZCBsb2NrcyBoYXZlCi0gKiBhbHJlYWR5IGJlZW4gYWNxdWlyZWQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBGYWNldE1vZHVsZUNvcmVTdXBwb3J0IHsKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBfZHVtcF9OQ0RGRSA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfSU5GID0gIldFQi1JTkYiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVBhdGggV0VCX0lORl9QQVRIID0gbmV3IFBhdGgoV0VCX0lORik7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gdGhlIGNvbXB1dGVkIElQYXRoIHRvIHRoZSAicm9vdCIgb2YgdGhlIHdlYiBjb250ZW50cywgZWl0aGVyIGZyb20gZmFjZXQga25vd2xlZGdlIG9yIGh1ZXJpc3RpY3MsIG9yIG51bGwgaWYgb25lIGNhbiBub3QgYmUgZGV0ZXJtaW5lZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggY29tcHV0ZVdlYkNvbnRlbnRSb290UGF0aChJUGF0aCBwYXRoKSB7Ci0JCUlQYXRoIHJvb3QgPSBudWxsOwotCQl0cnkgewotCQkJcm9vdCA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnREZWxlZ2F0ZS5nZXRXZWJDb250ZW50Um9vdFBhdGgoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHBhdGguc2VnbWVudCgwKSkpOwotCQl9Ci0JCWNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0JCQlpZiAoX2R1bXBfTkNERkUpCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlpZihyb290ID09IG51bGwpIHsKLQkJCS8qCi0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjEzMjQ1Ci0JCQkgKiAKLQkJCSAqIE5QRSBpbiBKU1BUYWdsaWJEaXJlY3RpdmVDb250ZW50QXNzaXN0UHJvY2Vzc29yIHdpdGgKLQkJCSAqIG5vbi1mYWNldGVkIHByb2plY3QKLQkJCSAqLwotCQkJcm9vdCA9IGdldExvY2FsUm9vdChwYXRoKTsKLQkJfQotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gLTEgaWYgdGhlIHByb2plY3QgZG9lcyBub3QgaGF2ZSB0aGUgSlNUIFdlYiBmYWNldCwgdGhlIHZlcnNpb24KLQkgKiAgICAgICAgIG51bWJlciBvZiBpdCBvdGhlcndpc2UKLQkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmbG9hdCBnZXREeW5hbWljV2ViUHJvamVjdFZlcnNpb24oSVByb2plY3QgcHJvamVjdCkgewotCQkvLyBJbiB0aGUgYWJzZW5jZSBvZiBhbnkgZmFjZXQgaW5mb3JtYXRpb24sIGFzc3VtZSB0aGUgaGlnaGVzdCBsZXZlbAotCQlmbG9hdCB2ZXJzaW9uID0gMi41ZjsKLQkJdHJ5IHsKLQkJCXZlcnNpb24gPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuZ2V0RHluYW1pY1dlYlByb2plY3RWZXJzaW9uKHByb2plY3QpOwotCQl9Ci0JCWNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0JCQlpZiAoX2R1bXBfTkNERkUpCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gdGhlIElQYXRoIHRvIHRoZSAicm9vdCIgb2YgdGhlIHdlYiBjb250ZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0V2ViQ29udGVudFJvb3RQYXRoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlQYXRoIHBhdGggPSBudWxsOwotCQl0cnkgewotCQkJcGF0aCA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnREZWxlZ2F0ZS5nZXRXZWJDb250ZW50Um9vdFBhdGgocHJvamVjdCk7Ci0JCX0KLQkJY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLQkJCWlmIChfZHVtcF9OQ0RGRSkKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0UnVudGltZVBhdGgoSVBhdGggcGF0aCkgewotCQlJUGF0aCByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0ID0gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmdldFJ1bnRpbWVQYXRoKHBhdGgpOwotCQl9Ci0JCWNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0JCQlpZiAoX2R1bXBfTkNERkUpCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCUlQYXRoIHJvb3QgPSBnZXRMb2NhbFJvb3QocGF0aCk7Ci0JCQlyZXN1bHQgPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMocm9vdC5zZWdtZW50Q291bnQoKSkubWFrZUFic29sdXRlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEeW5hbWljV2ViUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQl0cnkgewotCQkJcmV0dXJuIEZhY2V0TW9kdWxlQ29yZVN1cHBvcnREZWxlZ2F0ZS5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpOwotCQl9Ci0JCWNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0JCQlpZiAoX2R1bXBfTkNERkUpCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYmFzZVBhdGggLQotCSAqICAgICAgICAgICAgdGhlIGZ1bGwgcGF0aCB0byBhIHJlc291cmNlIHdpdGhpbiB0aGUgd29ya3NwYWNlCi0JICogQHBhcmFtIHJlZmVyZW5jZSAtCi0JICogICAgICAgICAgICB0aGUgcmVmZXJlbmNlIHN0cmluZyB0byByZXNvbHZlCi0JICogQHJldHVybiAtIHRoZSBmdWxsIHBhdGggd2l0aGluIHRoZSB3b3Jrc3BhY2UgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUKLQkgKiAgICAgICAgIGdpdmVuIHJlZmVyZW5jZSBhY2NvcmRpbmcgdG8gdGhlIHZpcnR1YWwgcGF0aGluZyBzdXBwb3J0Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCByZXNvbHZlKElQYXRoIGJhc2VQYXRoLCBTdHJpbmcgcmVmZXJlbmNlKSB7Ci0JCUlQYXRoIHJlc29sdmVkUGF0aCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXNvbHZlZFBhdGggPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUucmVzb2x2ZShiYXNlUGF0aCwgcmVmZXJlbmNlKTsKLQkJfQotCQljYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZSkgewotCQkJaWYgKF9kdW1wX05DREZFKQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlpZiAocmVzb2x2ZWRQYXRoID09IG51bGwpIHsKLQkJCUlQYXRoIHJvb3RQYXRoID0gZ2V0TG9jYWxSb290KGJhc2VQYXRoKTsKLQkJCWlmIChyZWZlcmVuY2Uuc3RhcnRzV2l0aChQYXRoLlJPT1QudG9TdHJpbmcoKSkpIHsKLQkJCQlyZXNvbHZlZFBhdGggPSByb290UGF0aC5hcHBlbmQocmVmZXJlbmNlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlc29sdmVkUGF0aCA9IGJhc2VQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hcHBlbmQocmVmZXJlbmNlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXNvbHZlZFBhdGg7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogQHJldHVybiB0aGUgYXBwbGljYWJsZSBXZWIgY29udGV4dCByb290IHBhdGgsIGlmIG9uZSBleGlzdHMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJUGF0aCBnZXRMb2NhbFJvb3QoSVBhdGggYmFzZVBhdGgpIHsKLQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0KLQkJLy8gZXhpc3Rpbmcgd29ya3NwYWNlIHJlc291cmNlcyAtIHRoaXMgaXMgdGhlIDkzJSBjYXNlCi0JCUlSZXNvdXJjZSBmaWxlID0gRmlsZUJ1ZmZlcnMuZ2V0V29ya3NwYWNlRmlsZUF0TG9jYXRpb24oYmFzZVBhdGgpOwotCi0JCS8vIFRyeSB0aGUgYmFzZSBwYXRoIGFzIGEgZm9sZGVyIGZpcnN0Ci0JCWlmIChmaWxlID09IG51bGwgJiYgYmFzZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQlmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRGb2xkZXIoYmFzZVBhdGgpOwotCQl9Ci0JCS8vIElmIG5vdCBhIGZvbGRlciwgdGhlbiB0cnkgYmFzZSBwYXRoIGFzIGEgZmlsZQotCQlpZiAoZmlsZSAhPSBudWxsICYmICFmaWxlLmV4aXN0cygpICYmIGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZShiYXNlUGF0aCk7Ci0JCX0KLQotCQlpZiAoZmlsZSA9PSBudWxsICYmIGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID09IDEpIHsKLQkJCWZpbGUgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QoYmFzZVBhdGguc2VnbWVudCgwKSk7Ci0JCX0KLQotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQkvKgotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNjUyOQotCQkJICogCi0JCQkgKiBUaGlzIG1ldGhvZCBwcm9kdWNlcyBhIGxlc3MgYWNjdXJhdGUgcmVzdWx0LCBidXQgZG9lc24ndAotCQkJICogcmVxdWlyZSB0aGF0IHRoZSBmaWxlIGV4aXN0IHlldC4KLQkJCSAqLwotCQkJSUZpbGVbXSBmaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24oYmFzZVBhdGgpOwotCQkJaWYgKGZpbGVzLmxlbmd0aCA+IDApCi0JCQkJZmlsZSA9IGZpbGVzWzBdOwotCQl9Ci0KLQkJd2hpbGUgKGZpbGUgIT0gbnVsbCkgewotCQkJLyoqCi0JCQkgKiBUcmVhdCBhbnkgcGFyZW50IGZvbGRlciB3aXRoIGEgV0VCLUlORiBzdWJmb2xkZXIgYXMgYSB3ZWItYXBwCi0JCQkgKiByb290Ci0JCQkgKi8KLQkJCUlDb250YWluZXIgZm9sZGVyID0gbnVsbDsKLQkJCWlmICgoZmlsZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuRk9MREVSKSAhPSAwKSB7Ci0JCQkJZm9sZGVyID0gKElDb250YWluZXIpIGZpbGU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmb2xkZXIgPSBmaWxlLmdldFBhcmVudCgpOwotCQkJfQotCQkJLy8gZ2V0Rm9sZGVyIG9uIGEgd29ya3NwYWNlIHJvb3QgbXVzdCB1c2UgYSBmdWxsIHBhdGgsIHNraXAKLQkJCWlmIChmb2xkZXIgIT0gbnVsbCAmJiAoZm9sZGVyLmdldFR5cGUoKSAmIElSZXNvdXJjZS5ST09UKSA9PSAwKSB7Ci0JCQkJSUZvbGRlciB3ZWJpbmYgPSBmb2xkZXIuZ2V0Rm9sZGVyKFdFQl9JTkZfUEFUSCk7Ci0JCQkJaWYgKHdlYmluZiAhPSBudWxsICYmIHdlYmluZi5leGlzdHMoKSkgewotCQkJCQlyZXR1cm4gZm9sZGVyLmdldEZ1bGxQYXRoKCk7Ci0JCQkJfQotCQkJfQotCQkJZmlsZSA9IGZpbGUuZ2V0UGFyZW50KCk7Ci0JCX0KLQotCQlyZXR1cm4gYmFzZVBhdGgudXB0b1NlZ21lbnQoMSk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9GYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9GYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI3ZTI4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIFdyYXBwZXIgY2xhc3MgZm9yIGFsbCBGYWNldC1yZWxhdGVkIGNhbGxzLiBJZiB0aGUgRmFjZXQgb3IgTW9kdWxlQ29yZQotICogYnVuZGxlcyBhcmUgbm90IGF2YWlsYWJsZSwgdGhpcyBjbGFzcyB3aWxsIG5vdCBsb2FkLCBvciBpZiBpdCBkb2VzLCBpdHMKLSAqIG1ldGhvZHMgd2lsbCBjYXVzZSBOb0NsYXNzRGVmRm91bmRFcnJvcnMuIFRoaXMgYWxsb3dzIHVzIHRvCi0gKiBjb21wYXJ0bWVudGFsaXplIHRoZSBkZXBlbmRlbmNpZXMuCi0gKiAKLSAqLwotZmluYWwgY2xhc3MgRmFjZXRNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0xBU0ggPSAiLyI7Ci0KLQkvKioKLQkgKiBDb3BpZWQgdG8gYXZvaWQgdW5uZWVkZWQgZXh0cmEgZGVwZW5kZW5jeSAocGx1cyBpdCdzIHVuY2xlYXIgd2h5IHRoZQotCSAqIHZhbHVlIGlzIGluIHRoYXQgcGx1Zy1pbikuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEpTVF9XRUJfTU9EVUxFID0gImpzdC53ZWIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gLTEgaWYgdGhlIHByb2plY3QgZG9lcyBub3QgaGF2ZSB0aGUgSlNUIFdlYiBmYWNldCwgdGhlIHZlcnNpb24KLQkgKiAgICAgICAgIG51bWJlciBvZiBpdCBvdGhlcndpc2UKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlzdGF0aWMgZmxvYXQgZ2V0RHluYW1pY1dlYlByb2plY3RWZXJzaW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiAyLjVmOwotCi0JCS8vIEluIHRoZSBhYnNlbmNlIG9mIGFueSBmYWNldCBpbmZvcm1hdGlvbiwgYXNzdW1lIHRoZSBoaWdoZXN0IGxldmVsCi0JCWZsb2F0IHZlcnNpb24gPSAyLjVmOwotCQl0cnkgewotCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZiAoZmFjZXRlZCAhPSBudWxsICYmIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZChKU1RfV0VCX01PRFVMRSkpIHsKLQkJCQlJUHJvamVjdEZhY2V0IHdlYk1vZHVsZUZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KEpTVF9XRUJfTU9EVUxFKTsKLQkJCQlpZiAoZmFjZXRlZC5oYXNQcm9qZWN0RmFjZXQod2ViTW9kdWxlRmFjZXQpKSB7Ci0JCQkJCXZlcnNpb24gPSBGbG9hdC5wYXJzZUZsb2F0KGZhY2V0ZWQuZ2V0SW5zdGFsbGVkVmVyc2lvbih3ZWJNb2R1bGVGYWNldCkuZ2V0VmVyc2lvblN0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhdGggLQotCSAqICAgICAgICAgICAgdGhlIGZ1bGwgcGF0aCB0byBhIHJlc291cmNlIHdpdGhpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiAtIHRoZSBydW50aW1lIHBhdGggb2YgdGhlIHJlc291cmNlIGlmIG9uZSBleGlzdHMsIG51bGwKLQkgKiAgICAgICAgIG90aGVyd2lzZQotCSAqLwotCXN0YXRpYyBJUGF0aCBnZXRSdW50aW1lUGF0aChJUGF0aCBwYXRoKSB7Ci0JCWlmIChwYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHBhdGguc2VnbWVudCgwKSk7Ci0KLQkJaWYgKCFNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KHByb2plY3QpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVZpcnR1YWxSZXNvdXJjZVtdIHZpcnR1YWxSZXNvdXJjZXMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZVJlc291cmNlcyhSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCkpOwotCQlpZiAodmlydHVhbFJlc291cmNlcyAhPSBudWxsICYmIHZpcnR1YWxSZXNvdXJjZXMubGVuZ3RoID4gMCkgewotCQkJcmV0dXJuIHZpcnR1YWxSZXNvdXJjZXNbMF0uZ2V0UnVudGltZVBhdGgoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gdGhlIElQYXRoIHRvIHRoZSAicm9vdCIgb2YgdGhlIHdlYiBjb250ZW50cwotCSAqLwotCXN0YXRpYyBJUGF0aCBnZXRXZWJDb250ZW50Um9vdFBhdGgoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKCFNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KHByb2plY3QpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlpZiAoY29tcG9uZW50ICE9IG51bGwgJiYgY29tcG9uZW50LmV4aXN0cygpKSB7Ci0JCQlwYXRoID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKTsKLQkJfQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBpc0R5bmFtaWNXZWJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCXRyeSB7Ci0JCQlpZiAoUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcm9qZWN0RmFjZXREZWZpbmVkKEpTVF9XRUJfTU9EVUxFKSkgewotCQkJCUlGYWNldGVkUHJvamVjdCBmYWNldGVkID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQkJCUlQcm9qZWN0RmFjZXQgd2ViTW9kdWxlRmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSlNUX1dFQl9NT0RVTEUpOwotCQkJCWlmIChmYWNldGVkICE9IG51bGwgJiYgZmFjZXRlZC5oYXNQcm9qZWN0RmFjZXQod2ViTW9kdWxlRmFjZXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYmFzZVBhdGggLQotCSAqICAgICAgICAgICAgdGhlIGZ1bGwgcGF0aCB0byBhIHJlc291cmNlIHdpdGhpbiB0aGUgd29ya3NwYWNlCi0JICogQHBhcmFtIHJlZmVyZW5jZSAtCi0JICogICAgICAgICAgICB0aGUgcmVmZXJlbmNlIHN0cmluZyB0byByZXNvbHZlCi0JICogQHJldHVybiAtIHRoZSBmdWxsIHBhdGggd2l0aGluIHRoZSB3b3Jrc3BhY2UgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUKLQkgKiAgICAgICAgIGdpdmVuIHJlZmVyZW5jZSBhY2NvcmRpbmcgdG8gdGhlIHZpcnR1YWwgcGF0aGluZyBzdXBwb3J0Ci0JICovCi0Jc3RhdGljIElQYXRoIHJlc29sdmUoSVBhdGggYmFzZVBhdGgsIFN0cmluZyByZWZlcmVuY2UpIHsKLQkJaWYgKHJlZmVyZW5jZSA9PSBudWxsIHx8IGJhc2VQYXRoID09IG51bGwgfHwgYmFzZVBhdGguc2VnbWVudENvdW50KCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoYmFzZVBhdGguc2VnbWVudCgwKSk7Ci0KLQkJaWYgKCFNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KHByb2plY3QpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJSUZpbGUgYmFzZUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoYmFzZVBhdGgpOwotCQkJSVZpcnR1YWxSZXNvdXJjZVtdIHZpcnR1YWxSZXNvdXJjZXMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZVJlc291cmNlcyhiYXNlRmlsZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZpcnR1YWxSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUGF0aCBiYXNlUnVudGltZVBhdGggPSB2aXJ0dWFsUmVzb3VyY2VzW2ldLmdldFJ1bnRpbWVQYXRoKCk7Ci0JCQkJSVBhdGggcmVmZXJlbmNlUnVudGltZVBhdGggPSBudWxsOwotCQkJCWlmIChyZWZlcmVuY2Uuc3RhcnRzV2l0aChTTEFTSCkpIHsKLQkJCQkJcmVmZXJlbmNlUnVudGltZVBhdGggPSBuZXcgUGF0aChyZWZlcmVuY2UpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVmZXJlbmNlUnVudGltZVBhdGggPSBiYXNlUnVudGltZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFwcGVuZChyZWZlcmVuY2UpOwotCQkJCX0KLQkJCQlJVmlydHVhbEZpbGUgdmlydHVhbEZpbGUgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUZpbGUocHJvamVjdCwgcmVmZXJlbmNlUnVudGltZVBhdGgpOwotCQkJCWlmICh2aXJ0dWFsRmlsZSAhPSBudWxsICYmIHZpcnR1YWxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCUlGaWxlW10gdW5kZXJseWluZ0ZpbGVzID0gdmlydHVhbEZpbGUuZ2V0VW5kZXJseWluZ0ZpbGVzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdW5kZXJseWluZ0ZpbGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpZiAodW5kZXJseWluZ0ZpbGVzW2pdLmdldFByb2plY3QoKS5lcXVhbHMocHJvamVjdCkgJiYgdW5kZXJseWluZ0ZpbGVzW2pdLmV4aXN0cygpKSB7Ci0JCQkJCQkJcmV0dXJuIHVuZGVybHlpbmdGaWxlc1tqXS5nZXRGdWxsUGF0aCgpOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJVmlydHVhbEZpbGUgdmlydHVhbEZpbGUgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUZpbGUocHJvamVjdCwgbmV3IFBhdGgocmVmZXJlbmNlKSk7Ci0JCQlpZiAodmlydHVhbEZpbGUgIT0gbnVsbCAmJiB2aXJ0dWFsRmlsZS5leGlzdHMoKSkgewotCQkJCXJldHVybiB2aXJ0dWFsRmlsZS5nZXRVbmRlcmx5aW5nRmlsZSgpLmdldEZ1bGxQYXRoKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC91dGlsL0ZpbGVDb250ZW50Q2FjaGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9GaWxlQ29udGVudENhY2hlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MjQzYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC91dGlsL0ZpbGVDb250ZW50Q2FjaGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5Mb2NhdGlvbktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLQotcHVibGljIGNsYXNzIEZpbGVDb250ZW50Q2FjaGUgewotCXByaXZhdGUgc3RhdGljIGNsYXNzIENhY2hlRW50cnkgewotCQlTdHJpbmcgY29udGVudHM7Ci0JCWxvbmcgbW9kaWZpY2F0aW9uU3RhbXAgPSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQkJSVBhdGggcGF0aDsKLQotCQlDYWNoZUVudHJ5KElQYXRoIHBhdGgpIHsKLQkJCXRoaXMucGF0aCA9IHBhdGg7Ci0JCQltb2RpZmljYXRpb25TdGFtcCA9IGdldE1vZGlmaWNhdGlvblN0YW1wKHBhdGgpOwotCQkJY29udGVudHMgPSByZWFkQ29udGVudHMocGF0aCk7Ci0JCX0KLQotCQlwcml2YXRlIElGaWxlIGdldEZpbGUoSVBhdGggcGF0aCkgewotCQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJYm9vbGVhbiBpc1N0YWxlKCkgewotCQkJaWYgKG1vZGlmaWNhdGlvblN0YW1wID09IElSZXNvdXJjZS5OVUxMX1NUQU1QKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlsb25nIG5ld1N0YW1wID0gZ2V0TW9kaWZpY2F0aW9uU3RhbXAocGF0aCk7Ci0JCQlyZXR1cm4gbmV3U3RhbXAgPiBtb2RpZmljYXRpb25TdGFtcDsKLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nIGRldGVjdENoYXJzZXQoSUZpbGUgZmlsZSkgewotCQkJaWYgKGZpbGUuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmIGZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGQgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCS8vIG9wdGltaXplZCBkZXNjcmlwdGlvbiBsb29rdXAsIG1pZ2h0IG5vdCBzdWNjZWVkCi0JCQkJCWQgPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJCQlpZiAoZCAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGQuZ2V0Q2hhcnNldCgpOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHNob3VsZCBub3QgYmUgcG9zc2libGUgZ2l2ZW4gdGhlIGFjY2Vzc2libGUgYW5kIGZpbGUKLQkJCQkJLy8gdHlwZQotCQkJCQkvLyBjaGVjayBhYm92ZQotCQkJCX0KLQkJCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJY29udGVudHMgPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQkJCUlDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXREZXNjcmlwdGlvbkZvcihjb250ZW50cywgZmlsZS5nZXROYW1lKCksIG5ldyBRdWFsaWZpZWROYW1lW117SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUfSk7Ci0JCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gZGVzY3JpcHRpb24uZ2V0Q2hhcnNldCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHdpbGwgdHJ5IHRvIGNsZWFudXAgaW4gZmluYWxseQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQljb250ZW50cy5jbG9zZSgpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gbm90IHN1cmUgaG93IHRvIHJlY292ZXIgYXQgdGhpcyBwb2ludAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRFbmNvZGluZygpOwotCQl9Ci0KLQkJcHJpdmF0ZSBsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKElQYXRoIGZpbGVQYXRoKSB7Ci0JCQlJRmlsZSBmID0gZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCQlpZiAoZiAhPSBudWxsICYmIGYuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlyZXR1cm4gZi5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQkJfQotCQkJRmlsZSBmaWxlID0gZmlsZVBhdGgudG9GaWxlKCk7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQlyZXR1cm4gZmlsZS5sYXN0TW9kaWZpZWQoKTsKLQkJCXJldHVybiBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nIHJlYWRDb250ZW50cyhJUGF0aCBmaWxlUGF0aCkgewotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVhZENvbnRlbnRzOiIgKyBmaWxlUGF0aCk7Ci0JCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJSUZpbGUgZiA9IGdldEZpbGUoZmlsZVBhdGgpOwotCQkJCWlmIChmICE9IG51bGwgJiYgZi5pc0FjY2Vzc2libGUoKSkgewotCQkJCQlTdHJpbmcgY2hhcnNldCA9IGRldGVjdENoYXJzZXQoZik7Ci0JCQkJCWlzID0gZi5nZXRDb250ZW50cygpOwotCQkJCQlSZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCBjaGFyc2V0KTsKLQkJCQkJY2hhcltdIHJlYWRCdWZmZXIgPSBuZXcgY2hhclsyMDQ4XTsKLQkJCQkJaW50IG4gPSByZWFkZXIucmVhZChyZWFkQnVmZmVyKTsKLQkJCQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQkJCQlzLmFwcGVuZChyZWFkQnVmZmVyLCAwLCBuKTsKLQkJCQkJCW4gPSByZWFkZXIucmVhZChyZWFkQnVmZmVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChpcyAhPSBudWxsKSB7Ci0JCQkJCQlpcy5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBub3RoaW5nIHRvIGRvCi0JCQkJfQotCQkJfQotCQkJaWYgKGlzID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKS5jb25uZWN0KGZpbGVQYXRoLCBMb2NhdGlvbktpbmQuTE9DQVRJT04sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQlJVGV4dEZpbGVCdWZmZXIgYnVmZmVyID0gRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCkuZ2V0VGV4dEZpbGVCdWZmZXIoZmlsZVBhdGgsIExvY2F0aW9uS2luZC5MT0NBVElPTik7Ci0JCQkJCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJCQkJcy5hcHBlbmQoYnVmZmVyLmdldERvY3VtZW50KCkuZ2V0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gbm90aGluZyB0byBkbwotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpLmRpc2Nvbm5lY3QoZmlsZVBhdGgsIExvY2F0aW9uS2luZC5MT0NBVElPTiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzLnRvU3RyaW5nKCk7Ci0JCX0KLQotCX0KLQotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLQlzdGF0aWMgRmlsZUNvbnRlbnRDYWNoZSBpbnN0YW5jZSA9IG5ldyBGaWxlQ29udGVudENhY2hlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIEZpbGVDb250ZW50Q2FjaGUgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIEhhc2hNYXAgZkNvbnRlbnRNYXA7Ci0KLQlwcml2YXRlIEZpbGVDb250ZW50Q2FjaGUoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZDb250ZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYW51cCgpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQ29udGVudE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpICE9IG51bGwgJiYgKChSZWZlcmVuY2UpIGVudHJ5LmdldFZhbHVlKCkpLmdldCgpID09IG51bGwpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudHMoSVBhdGggZmlsZVBhdGgpIHsKLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJnZXRDb250ZW50czoiICsgZmlsZVBhdGgpOwotCQlDYWNoZUVudHJ5IGVudHJ5ID0gbnVsbDsKLQkJT2JqZWN0IG8gPSBmQ29udGVudE1hcC5nZXQoZmlsZVBhdGgpOwotCQlpZiAobyBpbnN0YW5jZW9mIFJlZmVyZW5jZSkgewotCQkJZW50cnkgPSAoQ2FjaGVFbnRyeSkgKChSZWZlcmVuY2UpIG8pLmdldCgpOwotCQl9Ci0JCWlmIChlbnRyeSA9PSBudWxsIHx8IGVudHJ5LmlzU3RhbGUoKSkgewotCQkJaWYgKERFQlVHICYmIGVudHJ5ICE9IG51bGwgJiYgZW50cnkuaXNTdGFsZSgpKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic3RhbGUgY29udGVudHM6IiArIGZpbGVQYXRoKTsKLQkJCWVudHJ5ID0gbmV3IENhY2hlRW50cnkoZmlsZVBhdGgpOwotCQkJZkNvbnRlbnRNYXAucHV0KGZpbGVQYXRoLCBuZXcgU29mdFJlZmVyZW5jZShlbnRyeSkpOwotCQl9Ci0JCWNsZWFudXAoKTsKLQkJcmV0dXJuIGVudHJ5LmNvbnRlbnRzOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvWmVyb1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC91dGlsL1plcm9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc3MjQ1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvWmVyb1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuVGV4dFJlZ2lvbkxpc3RJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBaZXJvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB7Ci0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsKLQotCXByaXZhdGUgaW50IG9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZQYXJlbnREb2N1bWVudDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBaZXJvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIGludCBzdGFydCkgewotCQlzdXBlcigpOwotCQlmUGFyZW50RG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJb2Zmc2V0ID0gc3RhcnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVnaW9uKElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3QoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCBpKSB7Ci0JCXJldHVybiBvZmZzZXQgPD0gaSAmJiBpIDwgZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXREZWVwZXN0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gb2Zmc2V0ICsgbGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0RW5kKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldEZpcnN0UmVnaW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KCkgewotCQlyZXR1cm4gZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQlyZXR1cm4gZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoU3RyaW5nIGNvbnRleHQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TGFzdFJlZ2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiB0aGlzLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXROZXh0KCkgewotCQlyZXR1cm4gZ2V0UGFyZW50RG9jdW1lbnQoKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZSZWdpb25zKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gb2Zmc2V0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbkNvbnRhaW5lciBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFBhcmVudERvY3VtZW50KCkgewotCQlyZXR1cm4gZlBhcmVudERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFByZXZpb3VzKCkgewotCQlyZXR1cm4gbnVsbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBudWxsOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uTGlzdCBnZXRSZWdpb25zKCkgewotCQlyZXR1cm4gbmV3IFRleHRSZWdpb25MaXN0SW1wbCgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIHRoaXMub2Zmc2V0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCQlyZXR1cm4gZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoU3RyaW5nIGNvbnRleHQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBnZXRFbmQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRUZXh0RW5kKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoZSB0ZXh0IGxlbmd0aCBpcyBlcXVhbCB0byBsZW5ndGggaWYgdGhlcmUgaXMgbm8gd2hpdGUgc3BhY2UgYXQgdGhlCi0JICogZW5kIG9mIGEgcmVnaW9uLiBPdGhlcndpc2UgaXQgaXMgc21hbGxlciB0aGFuIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBnZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiAiWmVyb1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW5kZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gbmV3UmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWxldGVkKGJvb2xlYW4gZGVsZXRlZCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuZGVkKGJvb2xlYW4gaGFzRW5kKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaGFkIHRvIG1ha2UgcHVibGljLCBkdWUgdG8gQVBJIHRyYW5zaXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBsZW5ndGgpIHsKLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05leHQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHNldE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcmV2aW91cyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1ByZXZpb3VzKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVnaW9ucyhJVGV4dFJlZ2lvbkxpc3QgZW1iZWRkZWRSZWdpb25zKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoaW50IG5ld1N0YXJ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXRub2RlLCBTdHJpbmcgY2hhbmdlcywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0aW9uUmVwb3J0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvblJlcG9ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNzdjMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0aW9uUmVwb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5FcnJvckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLS8qCi0gKiBDb3BpZWQgZnJvbSBodG1sLnVpJ3MgSFRNTFZhbGlkYXRpb25SZXBvcnRlciB3aXRoIHNvbWUgbWlub3IgY2xlYW51cAotICogbW9kaWZpY2F0aW9ucwotICovCi1jbGFzcyBIVE1MVmFsaWRhdGlvblJlcG9ydGVyIGltcGxlbWVudHMgVmFsaWRhdGlvblJlcG9ydGVyIHsKLQotCXByaXZhdGUgSVZhbGlkYXRvciBvd25lciA9IG51bGw7Ci0JcHJpdmF0ZSBJUmVwb3J0ZXIgcmVwb3J0ZXIgPSBudWxsOwotCXByaXZhdGUgSUZpbGUgZmlsZSA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQlwcml2YXRlIE1lc3NhZ2VGYWN0b3J5IGZGYWN0b3J5ID0gbnVsbDsKLQkKLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTFZhbGlkYXRpb25SZXBvcnRlcihJVmFsaWRhdG9yIG93bmVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLnJlcG9ydGVyID0gcmVwb3J0ZXI7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJZkZhY3RvcnkgPSBuZXcgTWVzc2FnZUZhY3RvcnkoZmlsZSAhPSBudWxsID8gZmlsZS5nZXRQcm9qZWN0KCkgOiBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKHRoaXMuZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0KLQkJaWYgKHRoaXMucmVwb3J0ZXIgIT0gbnVsbCkgewotCQkJdGhpcy5yZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh0aGlzLm93bmVyLCB0aGlzLmZpbGUpOwotCQl9Ci0JfQotCi0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlcG9ydChWYWxpZGF0aW9uTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWlmIChtZXNzYWdlID09IG51bGwgfHwgdGhpcy5maWxlID09IG51bGwgfHwgbWVzc2FnZS5nZXRTZXZlcml0eSgpID09IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSkKLQkJCXJldHVybjsKLQkJSU1lc3NhZ2UgbWVzID0gdHJhbnNsYXRlTWVzc2FnZShtZXNzYWdlKTsKLQotCQlpZiAodGhpcy5yZXBvcnRlciAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcy5vd25lciwgbWVzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRyYW5zbGF0ZSBWYWxpZGF0aW9uTWVzc2FnZSB0byBJTWVzc2FnZSBhbmQgZ2VuZXJhdGUgcmVzdWx0IGxvZwotCSAqLwotCXByaXZhdGUgSU1lc3NhZ2UgdHJhbnNsYXRlTWVzc2FnZShWYWxpZGF0aW9uTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWludCBzZXZlcml0eSA9IElNZXNzYWdlLkxPV19TRVZFUklUWTsKLQkJc3dpdGNoIChtZXNzYWdlLmdldFNldmVyaXR5KCkpIHsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IgOgotCQkJCXNldmVyaXR5ID0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyA6Ci0JCQkJc2V2ZXJpdHkgPSBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLklORk9STUFUSU9OIDoKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0KLQkJSU1lc3NhZ2UgbWVzID0gbmV3IExvY2FsaXplZE1lc3NhZ2Uoc2V2ZXJpdHksIG1lc3NhZ2UuZ2V0TWVzc2FnZSgpLCB0aGlzLmZpbGUpOwotCQltZXMuc2V0T2Zmc2V0KG1lc3NhZ2UuZ2V0T2Zmc2V0KCkpOwotCQltZXMuc2V0TGVuZ3RoKG1lc3NhZ2UuZ2V0TGVuZ3RoKCkpOwotCQlpZiAodGhpcy5tb2RlbCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGZsYXRNb2RlbCA9IHRoaXMubW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlpZiAoZmxhdE1vZGVsICE9IG51bGwpIHsKLQkJCQlpbnQgbGluZSA9IGZsYXRNb2RlbC5nZXRMaW5lT2ZPZmZzZXQobWVzc2FnZS5nZXRPZmZzZXQoKSk7Ci0JCQkJbWVzLnNldExpbmVObyhsaW5lICsgMSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlcG9ydChFcnJvckluZm8gaW5mbykgewotCQlyZXBvcnQoZkZhY3RvcnkuY3JlYXRlTWVzc2FnZShpbmZvKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUEFjdGlvblZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUEFjdGlvblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWNiMTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BBY3Rpb25WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRhZ2xpYlRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkpTUENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01OYW1lZE5vZGVNYXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogQ2hlY2tzIGZvcjogbWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzICYgdW5kZWZpbmVkIGF0dHJpYnV0ZXMgaW4ganNwCi0gKiBhY3Rpb24gdGFncyBzdWNoIGFzIGpzcCBkaXJlY3RpdmVzIGFuZCBqc3AgY3VzdG9tIHRhZ3MgYXMgd2VsbCBhcyBub24tZW1wdHkKLSAqIGlubGluZSBqc3AgYWN0aW9uIHRhZ3MKLSAqLwotcHVibGljIGNsYXNzIEpTUEFjdGlvblZhbGlkYXRvciBleHRlbmRzIEpTUFZhbGlkYXRvciB7Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfTk9ERV9RVUFMSUZJRVIgPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQlwcml2YXRlIElWYWxpZGF0b3IgZk1lc3NhZ2VPcmlnaW5hdG9yOwotCXByaXZhdGUgSVByZWZlcmVuY2VzU2VydmljZSBmUHJlZmVyZW5jZXNTZXJ2aWNlID0gbnVsbDsKLQlwcml2YXRlIElTY29wZUNvbnRleHRbXSBmU2NvcGVzID0gbnVsbDsKLQlwcml2YXRlIGludCBmU2V2ZXJpdHlNaXNzaW5nUmVxdWlyZWRBdHRyaWJ1dGUgPSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotCXByaXZhdGUgaW50IGZTZXZlcml0eU5vbkVtcHR5SW5saW5lVGFnID0gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotCXByaXZhdGUgaW50IGZTZXZlcml0eVVua25vd25BdHRyaWJ1dGUgPSBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0KLQlwcml2YXRlIEhhc2hTZXQgZlRhZ2xpYlByZWZpeGVzID0gbmV3IEhhc2hTZXQoKTsKLQotCXB1YmxpYyBKU1BBY3Rpb25WYWxpZGF0b3IoKSB7Ci0JCXRoaXMuZk1lc3NhZ2VPcmlnaW5hdG9yID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgSlNQQWN0aW9uVmFsaWRhdG9yKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRoaXMuZk1lc3NhZ2VPcmlnaW5hdG9yID0gdmFsaWRhdG9yOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja05vbkVtcHR5SW5saW5lVGFnKElET01FbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGNtRWxlbWVudERlY2wsIElSZXBvcnRlciByZXBvcnRlciwgSUZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoY21FbGVtZW50RGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZICYmIGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpID4gMCkgewotCQkJU3RyaW5nIG1zZ1RleHQgPSBOTFMuYmluZChKU1BDb3JlTWVzc2FnZXMuSlNQQWN0aW9uVmFsaWRhdG9yXzAsIGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShmU2V2ZXJpdHlOb25FbXB0eUlubGluZVRhZywgbXNnVGV4dCwgZmlsZSk7Ci0JCQlpbnQgc3RhcnQgPSBlbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpbnQgbGVuZ3RoID0gZWxlbWVudC5nZXRTdGFydEVuZE9mZnNldCgpIC0gc3RhcnQ7Ci0JCQlpbnQgbGluZU5vID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0JCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCi0JCQlyZXBvcnRlci5hZGRNZXNzYWdlKGZNZXNzYWdlT3JpZ2luYXRvciwgbWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tSZXF1aXJlZEF0dHJpYnV0ZXMoSURPTUVsZW1lbnQgZWxlbWVudCwgQ01OYW1lZE5vZGVNYXAgYXR0ck1hcCwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gYXR0ck1hcC5pdGVyYXRvcigpOwotCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBudWxsOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlhdHRyID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGl0Lm5leHQoKTsKLQkJCWlmIChhdHRyLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgewotCQkJCUF0dHIgYSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShhdHRyLmdldEF0dHJOYW1lKCkpOwotCQkJCWlmIChhID09IG51bGwpIHsKLQkJCQkJU3RyaW5nIG1zZ1RleHQgPSBOTFMuYmluZChKU1BDb3JlTWVzc2FnZXMuSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzUsIGF0dHIuZ2V0QXR0ck5hbWUoKSk7Ci0JCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGZTZXZlcml0eU1pc3NpbmdSZXF1aXJlZEF0dHJpYnV0ZSwgbXNnVGV4dCwgZmlsZSk7Ci0JCQkJCWludCBzdGFydCA9IGVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJaW50IGxlbmd0aCA9IGVsZW1lbnQuZ2V0U3RhcnRFbmRPZmZzZXQoKSAtIHN0YXJ0OwotCQkJCQlpbnQgbGluZU5vID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vKTsKLQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCi0JCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tVbmtub3duQXR0cmlidXRlcyhJRE9NRWxlbWVudCBlbGVtZW50LCBDTU5hbWVkTm9kZU1hcCBjbUF0dHJzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24pIHsKLQkJYm9vbGVhbiBmb3VuZGpzcGF0dHJpYnV0ZSA9IGZhbHNlOwotCi0JCU5hbWVkTm9kZU1hcCBhdHRycyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUF0dHIgYSA9IChBdHRyKSBhdHRycy5pdGVtKGkpOwotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGNtQXR0cnMuZ2V0TmFtZWRJdGVtKGEuZ2V0TmFtZSgpKTsKLQkJCWlmIChhZGVjID09IG51bGwpIHsKLQkJCQkvLyBObyBhdHRyIGRlY2xhcmF0aW9uIHdhcyBmb3VuZC4gVGhhdCBpcywgdGhlIGF0dHIgbmFtZSBpcwotCQkJCS8vIHVuZGVmaW5lZC4KLQkJCQkvLyBidXQgbm90IHJlZ2FyZCBpdCBhcyB1bmRlZmluZWQgbmFtZSBpZiBpdCBpbmNsdWRlcyBKU1AKLQkJCQlpZiAoIWhhc0pTUFJlZ2lvbigoKElET01Ob2RlKSBhKS5nZXROYW1lUmVnaW9uKCkpICYmIGZTZXZlcml0eVVua25vd25BdHRyaWJ1dGUgIT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQkJCVN0cmluZyBtc2dUZXh0ID0gTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUERpcmVjdGl2ZVZhbGlkYXRvcl82LCBhLmdldE5hbWUoKSk7Ci0JCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGZTZXZlcml0eVVua25vd25BdHRyaWJ1dGUsIG1zZ1RleHQsIGZpbGUpOwotCQkJCQlpbnQgc3RhcnQgPSAoKElET01BdHRyKSBhKS5nZXROYW1lUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQkJCQkJaW50IGxlbmd0aCA9ICgoSURPTUF0dHIpIGEpLmdldE5hbWVSZWdpb25FbmRPZmZzZXQoKSAtIHN0YXJ0OwotCQkJCQlpbnQgbGluZU5vID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vKTsKLQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCi0JCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZvdW5kanNwYXR0cmlidXRlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZvdW5kanNwYXR0cmlidXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLmNsZWFudXAocmVwb3J0ZXIpOwotCQlmVGFnbGliUHJlZml4ZXMuY2xlYXIoKTsKLQl9Ci0KLQlpbnQgZ2V0TWVzc2FnZVNldmVyaXR5KFN0cmluZyBrZXkpIHsKLQkJaW50IHNldiA9IGZQcmVmZXJlbmNlc1NlcnZpY2UuZ2V0SW50KFBSRUZFUkVOQ0VfTk9ERV9RVUFMSUZJRVIsIGtleSwgSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLCBmU2NvcGVzKTsKLQkJc3dpdGNoIChzZXYpIHsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IgOgotCQkJCXJldHVybiBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HIDoKLQkJCQlyZXR1cm4gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5JTkZPUk1BVElPTiA6Ci0JCQkJcmV0dXJuIElNZXNzYWdlLkxPV19TRVZFUklUWTsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFIDoKLQkJCQlyZXR1cm4gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFOwotCQl9Ci0JCXJldHVybiBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3RhcnRUYWdOYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RyKSB7Ci0JCVN0cmluZyBuYW1lID0gbmV3IFN0cmluZygpOwotCQlJVGV4dFJlZ2lvbkxpc3Qgc3ViUmVnaW9ucyA9IHNkci5nZXRSZWdpb25zKCk7Ci0JCWlmIChzdWJSZWdpb25zLnNpemUoKSA+IDIpIHsKLQkJCUlUZXh0UmVnaW9uIHN1YlJlZ2lvbiA9IHN1YlJlZ2lvbnMuZ2V0KDApOwotCQkJaWYgKHN1YlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHsKLQkJCQlzdWJSZWdpb24gPSBzdWJSZWdpb25zLmdldCgxKTsKLQkJCQlpZiAoc3ViUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCQluYW1lID0gc2RyLmdldFRleHQoc3ViUmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHJpdmF0ZSBIYXNoU2V0IGdldFRhZ2xpYlByZWZpeGVzKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGZUYWdsaWJQcmVmaXhlcy5pc0VtcHR5KCkpIHsKLQkJCS8vIGFkZCBhbGwgcmVzZXJ2ZWQgcHJlZml4ZXMKLQkJCWZUYWdsaWJQcmVmaXhlcy5hZGQoImpzcCIpOyAvLyROT04tTkxTLTEkCi0JCQlmVGFnbGliUHJlZml4ZXMuYWRkKCJqc3B4Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWZUYWdsaWJQcmVmaXhlcy5hZGQoImphdmEiKTsgLy8kTk9OLU5MUy0xJAotCQkJZlRhZ2xpYlByZWZpeGVzLmFkZCgiamF2YXgiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCWZUYWdsaWJQcmVmaXhlcy5hZGQoInNlcnZsZXQiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCWZUYWdsaWJQcmVmaXhlcy5hZGQoInN1biIpOyAvLyROT04tTkxTLTEkIAotCQkJZlRhZ2xpYlByZWZpeGVzLmFkZCgic3VudyIpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIGFkZCBhbGwgdGFnbGliIHByZWZpeGVzCi0JCQlUTERDTURvY3VtZW50TWFuYWdlciBtYW5hZ2VyID0gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcihkb2N1bWVudCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJTGlzdCB0cmFja2VycyA9IG1hbmFnZXIuZ2V0VGFnbGliVHJhY2tlcnMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdHJhY2tlcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlUYWdsaWJUcmFja2VyIHRyYWNrZXIgPSAoVGFnbGliVHJhY2tlcikgaXQubmV4dCgpOwotCQkJCQlTdHJpbmcgcHJlZml4ID0gdHJhY2tlci5nZXRQcmVmaXgoKTsKLQkJCQkJZlRhZ2xpYlByZWZpeGVzLmFkZChwcmVmaXgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZlRhZ2xpYlByZWZpeGVzOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNKU1BSZWdpb24oSVRleHRSZWdpb24gY29udGFpbmVyKSB7Ci0JCWlmICghKGNvbnRhaW5lciBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBjb250YWluZXIpLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gfHwgKGlzTmVzdGVkVGFnTmFtZShyZWdpb25UeXBlKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc05lc3RlZFRhZ05hbWUoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4pIHx8IHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4pIHx8IHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOKSB8fCByZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkUHJlZmVyZW5jZXMoSUZpbGUgZmlsZSkgewotCQlmU2NvcGVzID0gbmV3IElTY29wZUNvbnRleHRbXXtuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OwotCi0JCWZQcmVmZXJlbmNlc1NlcnZpY2UgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlQcm9qZWN0U2NvcGUgcHJvamVjdFNjb3BlID0gbmV3IFByb2plY3RTY29wZShmaWxlLmdldFByb2plY3QoKSk7Ci0JCQlpZiAocHJvamVjdFNjb3BlLmdldE5vZGUoUFJFRkVSRU5DRV9OT0RFX1FVQUxJRklFUikuZ2V0Qm9vbGVhbihKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVVNFX1BST0pFQ1RfU0VUVElOR1MsIGZhbHNlKSkgewotCQkJCWZTY29wZXMgPSBuZXcgSVNjb3BlQ29udGV4dFtde3Byb2plY3RTY29wZSwgbmV3IEluc3RhbmNlU2NvcGUoKSwgbmV3IERlZmF1bHRTY29wZSgpfTsKLQkJCX0KLQkJfQotCi0JCWZTZXZlcml0eU1pc3NpbmdSZXF1aXJlZEF0dHJpYnV0ZSA9IGdldE1lc3NhZ2VTZXZlcml0eShKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9NSVNTSU5HX1JFUVVJUkVEX0FUVFJJQlVURSk7Ci0JCWZTZXZlcml0eU5vbkVtcHR5SW5saW5lVGFnID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9BQ1RJT05TX1NFVkVSSVRZX05PTl9FTVBUWV9JTkxJTkVfVEFHKTsKLQkJZlNldmVyaXR5VW5rbm93bkF0dHJpYnV0ZSA9IGdldE1lc3NhZ2VTZXZlcml0eShKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9VTktOT1dOX0FUVFJJQlVURSk7Ci0JfQotCi0Jdm9pZCBwZXJmb3JtVmFsaWRhdGlvbihJRmlsZSBmLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJZlRhZ2xpYlByZWZpeGVzLmNsZWFyKCk7Ci0JCWludCBsZW5ndGggPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKTsKLQkJcGVyZm9ybVZhbGlkYXRpb24oZiwgcmVwb3J0ZXIsIG1vZGVsLCBuZXcgUmVnaW9uKDAsIGxlbmd0aCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1WYWxpZGF0aW9uKElGaWxlIGYsIElSZXBvcnRlciByZXBvcnRlciwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgSVJlZ2lvbiB2YWxpZGF0ZVJlZ2lvbikgewotCQlsb2FkUHJlZmVyZW5jZXMoZik7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc0RvYyA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCS8vIGl0ZXJhdGUgYWxsIGRvY3VtZW50IHJlZ2lvbnMKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBzRG9jLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHZhbGlkYXRlUmVnaW9uLmdldE9mZnNldCgpKTsKLQkJd2hpbGUgKHJlZ2lvbiAhPSBudWxsICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpICYmIChyZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSA8PSAodmFsaWRhdGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyB2YWxpZGF0ZVJlZ2lvbi5nZXRMZW5ndGgoKSkpKSB7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCQkvLyBvbmx5IGNoZWNraW5nIGRpcmVjdGl2ZXMKLQkJCQlwcm9jZXNzRGlyZWN0aXZlKHJlcG9ydGVyLCBmLCBtb2RlbCwgcmVnaW9uKTsKLQkJCQlmVGFnbGliUHJlZml4ZXMuY2xlYXIoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQkvLyBhbmQganNwIHRhZ3MKLQkJCQlTdHJpbmcgdGFnTmFtZSA9IGdldFN0YXJ0VGFnTmFtZShyZWdpb24pOwotCQkJCWludCBjb2xvblBvc2l0aW9uID0gdGFnTmFtZS5pbmRleE9mKCc6Jyk7Ci0JCQkJaWYgKGNvbG9uUG9zaXRpb24gPiAtMSkgewotCQkJCQkvLyBnZXQgdGFnJ3MgcHJlZml4IGFuZCBjaGVjayBpZiBpdCdzIHJlYWxseSBhIGpzcCBhY3Rpb24KLQkJCQkJLy8gdGFnCi0JCQkJCVN0cmluZyBwcmVmaXggPSB0YWdOYW1lLnN1YnN0cmluZygwLCBjb2xvblBvc2l0aW9uKTsKLQkJCQkJaWYgKGdldFRhZ2xpYlByZWZpeGVzKHNEb2MpLmNvbnRhaW5zKHByZWZpeCkpCi0JCQkJCQlwcm9jZXNzRGlyZWN0aXZlKHJlcG9ydGVyLCBmLCBtb2RlbCwgcmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZWdpb24gPSByZWdpb24uZ2V0TmV4dCgpOwotCQl9Ci0JCXVubG9hZFByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NEaXJlY3RpdmUoSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uKSB7Ci0JCUluZGV4ZWRSZWdpb24gaXIgPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQlpZiAoaXIgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCkgewotCQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgaXI7Ci0JCQlNb2RlbFF1ZXJ5IHF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShtb2RlbCk7Ci0JCQlpZiAocXVlcnkgIT0gbnVsbCkgewotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGNtRWxlbWVudCA9IHF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJCWlmIChjbUVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQlDTU5hbWVkTm9kZU1hcCBjbUF0dHJpYnV0ZXMgPSBjbUVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCi0JCQkJCUNNTmFtZWROb2RlTWFwSW1wbCBhbGxBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbChjbUF0dHJpYnV0ZXMpOwotCQkJCQlMaXN0IG5vZGVzID0gcXVlcnkuZ2V0QXZhaWxhYmxlQ29udGVudChlbGVtZW50LCBjbUVsZW1lbnQsIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBub2Rlcy5zaXplKCk7IGsrKykgewotCQkJCQkJQ01Ob2RlIGNtbm9kZSA9IChDTU5vZGUpIG5vZGVzLmdldChrKTsKLQkJCQkJCWlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCQkJYWxsQXR0cmlidXRlcy5wdXQoY21ub2RlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljbUF0dHJpYnV0ZXMgPSBhbGxBdHRyaWJ1dGVzOwotCi0JCQkJCWJvb2xlYW4gZm91bmRqc3BhdHRyaWJ1dGUgPSBjaGVja1Vua25vd25BdHRyaWJ1dGVzKGVsZW1lbnQsIGNtQXR0cmlidXRlcywgcmVwb3J0ZXIsIGZpbGUsIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBkb2N1bWVudFJlZ2lvbik7Ci0JCQkJCS8vIHJlcXVpcmVkIGF0dHJpYnV0ZXMgY291bGQgYmUgaGlkZGVuIGluIGpzcCByZWdpb25zIGluCi0JCQkJCS8vIHRhZ3MsIHNvIGlmIGpzcCByZWdpb25zIHdlcmUgZGV0ZWN0ZWQsIGRvIG5vdCBjaGVjayBmb3IKLQkJCQkJLy8gbWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzCi0JCQkJCWlmICghZm91bmRqc3BhdHRyaWJ1dGUgJiYgZlNldmVyaXR5TWlzc2luZ1JlcXVpcmVkQXR0cmlidXRlICE9IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSkKLQkJCQkJCWNoZWNrUmVxdWlyZWRBdHRyaWJ1dGVzKGVsZW1lbnQsIGNtQXR0cmlidXRlcywgcmVwb3J0ZXIsIGZpbGUsIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBkb2N1bWVudFJlZ2lvbik7Ci0KLQkJCQkJaWYgKGZTZXZlcml0eU5vbkVtcHR5SW5saW5lVGFnICE9IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSkKLQkJCQkJCWNoZWNrTm9uRW1wdHlJbmxpbmVUYWcoZWxlbWVudCwgY21FbGVtZW50LCByZXBvcnRlciwgZmlsZSwgbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1bmxvYWRQcmVmZXJlbmNlcygpIHsKLQkJZlByZWZlcmVuY2VzU2VydmljZSA9IG51bGw7Ci0JCWZTY29wZXMgPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRmlsZShJRmlsZSBmLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgdmFsaWRhdGluZzogIiArIGYpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmKTsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJCXBlcmZvcm1WYWxpZGF0aW9uKGYsIHJlcG9ydGVyLCBzTW9kZWwpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQQmF0Y2hWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BCYXRjaFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGRkZTlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BCYXRjaFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkpTUEZDb250ZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Qcm9qZWN0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iOwotCi0vKioKLSAqIFBlcmZvcm1zIEpTUCB2YWxpZGF0aW9uIHRhc2tzIGZvciBiYXRjaCB2YWxpZGF0aW9uLiBUaGUgaW5kaXZpZHVhbAotICogdmFsaWRhdG9yIGNsYXNzZXMgd2lsbCBzdGlsbCBiZSB1c2VkIGZvciBzb3VyY2UgdmFsaWRhdGlvbi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEpTUEJhdGNoVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9ySm9iLCBJRXhlY3V0YWJsZUV4dGVuc2lvbiB7Ci0JY2xhc3MgSlNQRmlsZVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VQcm94eVZpc2l0b3IgewotCi0JCXByaXZhdGUgTGlzdCBmRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXByaXZhdGUgSVJlcG9ydGVyIGZSZXBvcnRlciA9IG51bGw7Ci0KLQkJcHVibGljIEpTUEZpbGVWaXNpdG9yKElSZXBvcnRlciByZXBvcnRlcikgewotCQkJZlJlcG9ydGVyID0gcmVwb3J0ZXI7Ci0JCX0KLQotCQlmaW5hbCBJRmlsZVtdIGdldEZpbGVzKCkgewotCQkJcmV0dXJuIChJRmlsZVtdKSBmRmlsZXMudG9BcnJheShuZXcgSUZpbGVbZkZpbGVzLnNpemUoKV0pOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkJLy8gY2hlY2sgdmFsaWRhdGlvbgotCQkJaWYgKGZSZXBvcnRlci5pc0NhbmNlbGxlZCgpKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJaWYgKHByb3h5LmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCi0JCQkJaWYgKGlzSlNQVHlwZShwcm94eS5nZXROYW1lKCkpICYmIHByb3h5LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpOwotCQkJCQlpZiAoREVCVUcpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigrKSBKU1BWYWxpZGF0b3IgYWRkaW5nIGZpbGU6ICIgKyBmaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZkZpbGVzLmFkZChmaWxlKTsKLQotCQkJCQkvLyBkb24ndCBzZWFyY2ggZGVlcGVyIGZvciBmaWxlcwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBCb29sZWFuLnZhbHVlT2YoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3B2YWxpZGF0b3IiKSkuYm9vbGVhblZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSURfSlNQX0NPUkUgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogR2V0cyBjdXJyZW50IHZhbGlkYXRpb24gcHJvamVjdCBjb25maWd1cmF0aW9uIGJhc2VkIG9uIGN1cnJlbnQgcHJvamVjdAotCSAqICh3aGljaCBpcyBiYXNlZCBvbiBjdXJyZW50IGRvY3VtZW50KQotCSAqIAotCSAqIEByZXR1cm4gUHJvamVjdENvbmZpZ3VyYXRpb24KLQkgKi8KLQlzdGF0aWMgcHJpdmF0ZSBQcm9qZWN0Q29uZmlndXJhdGlvbiBnZXRQcm9qZWN0Q29uZmlndXJhdGlvbihJRmlsZSBmaWxlKSB7Ci0JCVByb2plY3RDb25maWd1cmF0aW9uIHByb2plY3RDb25maWd1cmF0aW9uID0gbnVsbDsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXByb2plY3RDb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJCX0KLQkJCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcHJvamVjdENvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHZhbGlkYXRvciBpcyBlbmFibGVkIGFjY29yZGluZyBpbiBWYWxpZGF0aW9uIHByZWZlcmVuY2VzCi0JICogCi0JICogQHBhcmFtIHZtZAotCSAqIEByZXR1cm4KLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBpc0JhdGNoVmFsaWRhdG9yUHJlZmVyZW5jZUVuYWJsZWQoSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0JCVByb2plY3RDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBnZXRQcm9qZWN0Q29uZmlndXJhdGlvbihmaWxlKTsKLQkJaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGEgbWV0YWRhdGEgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEoSlNQQmF0Y2hWYWxpZGF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJCWlmIChjb25maWd1cmF0aW9uICE9IG51bGwgJiYgbWV0YWRhdGEgIT0gbnVsbCkgewotCQkJCWlmICghY29uZmlndXJhdGlvbi5pc0J1aWxkRW5hYmxlZChtZXRhZGF0YSkgJiYgIWNvbmZpZ3VyYXRpb24uaXNNYW51YWxFbmFibGVkKG1ldGFkYXRhKSkKLQkJCQkJZW5hYmxlZCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbmFibGVkOwotCX0KLQotCVN0cmluZyBmQWRkaXRpb25hbENvbnRlbnRUeXBlc0lEc1tdID0gbnVsbDsKLQotCXByaXZhdGUgSUNvbnRlbnRUeXBlW10gZkNvbnRlbnRUeXBlcyA9IG51bGw7Ci0KLQlwcml2YXRlIEpTUERpcmVjdGl2ZVZhbGlkYXRvciBmSlNQRGlyZWN0aXZlVmFsaWRhdG9yID0gbmV3IEpTUERpcmVjdGl2ZVZhbGlkYXRvcih0aGlzKTsKLQotCXByaXZhdGUgSlNQRUxWYWxpZGF0b3IgZkpTUEVMVmFsaWRhdG9yID0gbmV3IEpTUEVMVmFsaWRhdG9yKHRoaXMpOwotCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkpTUEZDb250ZW50VHlwZSA9IG51bGw7Ci0KLQlwcml2YXRlIEpTUEphdmFWYWxpZGF0b3IgZkpTUEphdmFWYWxpZGF0b3IgPSBuZXcgSlNQSmF2YVZhbGlkYXRvcih0aGlzKTsKLQotCXByaXZhdGUgSlNQQWN0aW9uVmFsaWRhdG9yIGZKU1BBY3Rpb25WYWxpZGF0b3IgPSBuZXcgSlNQQWN0aW9uVmFsaWRhdG9yKHRoaXMpOwotCi0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCQlmSlNQRGlyZWN0aXZlVmFsaWRhdG9yLmNsZWFudXAocmVwb3J0ZXIpOwotCQlmSlNQRUxWYWxpZGF0b3IuY2xlYW51cChyZXBvcnRlcik7Ci0JCWZKU1BKYXZhVmFsaWRhdG9yLmNsZWFudXAocmVwb3J0ZXIpOwotCQlmSlNQQWN0aW9uVmFsaWRhdG9yLmNsZWFudXAocmVwb3J0ZXIpOwotCX0KLQotCi0Jdm9pZCBkb1ZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmdbXSB1cmlzID0gaGVscGVyLmdldFVSSXMoKTsKLQkJaWYgKHVyaXMubGVuZ3RoID4gMCkgewotCQkJSVdvcmtzcGFjZVJvb3Qgd3NSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUlGaWxlIGN1cnJlbnRGaWxlID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJpcy5sZW5ndGggJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCk7IGkrKykgewotCQkJCWN1cnJlbnRGaWxlID0gd3NSb290LmdldEZpbGUobmV3IFBhdGgodXJpc1tpXSkpOwotCQkJCWlmIChjdXJyZW50RmlsZSAhPSBudWxsICYmIGN1cnJlbnRGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWlmIChzaG91bGRWYWxpZGF0ZShjdXJyZW50RmlsZSkgJiYgZnJhZ21lbnRDaGVjayhjdXJyZW50RmlsZSkpIHsKLQkJCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkxPV19TRVZFUklUWSwgY3VycmVudEZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLnN1YnN0cmluZygxKSk7Ci0JCQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayh0aGlzLCBtZXNzYWdlKTsKLQkJCQkJCXZhbGlkYXRlRmlsZShjdXJyZW50RmlsZSwgcmVwb3J0ZXIpOwotCQkJCQl9Ci0JCQkJCWlmIChERUJVRykKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidmFsaWRhdGluZzogWyIgKyB1cmlzW2ldICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gaWYgdXJpc1tdIGxlbmd0aCAwIC0+IHZhbGlkYXRlKCkgZ2V0cyBjYWxsZWQgZm9yIGVhY2ggcHJvamVjdAotCQkJaWYgKGhlbHBlciBpbnN0YW5jZW9mIElXb3JrYmVuY2hDb250ZXh0KSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9ICgoSVdvcmtiZW5jaENvbnRleHQpIGhlbHBlcikuZ2V0UHJvamVjdCgpOwotCi0JCQkJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCBOTFMuYmluZChKU1BDb3JlTWVzc2FnZXMuSlNQQmF0Y2hWYWxpZGF0b3JfMCwgcHJvamVjdC5nZXRGdWxsUGF0aCgpKSk7Ci0JCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sodGhpcywgbWVzc2FnZSk7Ci0KLQkJCQlKU1BGaWxlVmlzaXRvciB2aXNpdG9yID0gbmV3IEpTUEZpbGVWaXNpdG9yKHJlcG9ydGVyKTsKLQkJCQl0cnkgewotCQkJCQkvLyBjb2xsZWN0IGFsbCBqc3AgZmlsZXMgZm9yIHRoZSBwcm9qZWN0Ci0JCQkJCXByb2plY3QuYWNjZXB0KHZpc2l0b3IsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKERFQlVHKQotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJSUZpbGVbXSBmaWxlcyA9IHZpc2l0b3IuZ2V0RmlsZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aCAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKTsgaSsrKSB7Ci0JCQkJCWlmIChzaG91bGRWYWxpZGF0ZShmaWxlc1tpXSkgJiYgZnJhZ21lbnRDaGVjayhmaWxlc1tpXSkpIHsKLQotCQkJCQkJbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkxPV19TRVZFUklUWSwgZmlsZXNbaV0uZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLnN1YnN0cmluZygxKSk7Ci0JCQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayh0aGlzLCBtZXNzYWdlKTsKLQotCQkJCQkJdmFsaWRhdGVGaWxlKGZpbGVzW2ldLCByZXBvcnRlcik7Ci0JCQkJCX0KLQkJCQkJaWYgKERFQlVHKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ2YWxpZGF0aW5nOiBbIiArIGZpbGVzW2ldICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGZpbGUgaXMgYSBqc3AgZnJhZ21lbnQgb3Igbm90LiBJZiBzbywgY2hlY2sgaWYgdGhlIGZyYWdtZW50Ci0JICogc2hvdWxkIGJlIHZhbGlkYXRlZCBvciBub3QuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIEFzc3VtZXMgc2hvdWxkVmFsaWRhdGUgd2FzIGFscmVhZHkgY2FsbGVkIG9uIGZpbGUgc28gaXQKLQkgKiAgICAgICAgICAgIHNob3VsZCBub3QgYmUgbnVsbCBhbmQgZG9lcyBleGlzdAotCSAqIEByZXR1cm4gZmFsc2UgaWYgZmlsZSBpcyBhIGZyYWdtZW50IGFuZCBpdCBzaG91bGQgbm90IGJlIHZhbGlkYXRlZCwKLQkgKiAgICAgICAgIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZyYWdtZW50Q2hlY2soSUZpbGUgZmlsZSkgewotCQlib29sZWFuIHNob3VsZFZhbGlkYXRlID0gdHJ1ZTsKLQkJLy8gcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgcG9zc2libHkgYSBqc3AgZnJhZ21lbnQKLQkJaWYgKGdldEpTUEZDb250ZW50VHlwZSgpLmlzQXNzb2NpYXRlZFdpdGgoZmlsZS5nZXROYW1lKCkpKSB7Ci0JCQkvLyBnZXQgcHJlZmVyZW5jZSBmb3IgdmFsaWRhdGUganNwIGZyYWdtZW50cwotCQkJYm9vbGVhbiBzaG91bGRWYWxpZGF0ZUZyYWdtZW50cyA9IEJvb2xlYW4udmFsdWVPZihKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLlZBTElEQVRFX0ZSQUdNRU5UUywgZmlsZSwgdHJ1ZSkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJLyoKLQkJCSAqIGlmIGpzcCBmcmFnbWVudHMgc2hvdWxkIG5vdCBiZSB2YWxpZGF0ZWQsIGNoZWNrIGlmIGZpbGUgaXMKLQkJCSAqIHJlYWxseSBqc3AgZnJhZ21lbnQKLQkJCSAqLwotCQkJaWYgKCFzaG91bGRWYWxpZGF0ZUZyYWdtZW50cykgewotCQkJCWJvb2xlYW4gaXNGcmFnbWVudCA9IGlzRnJhZ21lbnQoZmlsZSk7Ci0JCQkJc2hvdWxkVmFsaWRhdGUgPSAhaXNGcmFnbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2hvdWxkVmFsaWRhdGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBKU1AgZnJhZ21lbnQgY29udGVudCB0eXBlCi0JICogCi0JICogQHJldHVybiBqc3BmIGNvbnRlbnQgdHlwZQotCSAqLwotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGdldEpTUEZDb250ZW50VHlwZSgpIHsKLQkJaWYgKGZKU1BGQ29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJZkpTUEZDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BGUkFHTUVOVCk7Ci0JCX0KLQkJcmV0dXJuIGZKU1BGQ29udGVudFR5cGU7Ci0JfQotCi0JcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyKSB7Ci0JCWlmIChoZWxwZXIgaW5zdGFuY2VvZiBJV29ya2JlbmNoQ29udGV4dCkgewotCQkJLyoKLQkJCSAqIFVzZSBhIHNpbmdsZSBidWlsZCBydWxlIHdoZW4gcnVubmluZyBiYXRjaCB2YWxpZGF0aW9uLgotCQkJICovCi0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkuYnVpbGRSdWxlKCk7Ci0JCX0KLQkJLyoKLQkJICogRm9yIG90aGVyIGtpbmRzIG9mIHZhbGlkYXRpb24sIHVzZSBubyBzcGVjaWZpYyBydWxlCi0JCSAqLwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGxpc3Qgb2YgY29udGVudCB0eXBlcyB0aGlzIHZpc2l0b3IgaXMgaW50ZXJlc3RlZCBpbgotCSAqIAotCSAqIEByZXR1cm4gQWxsIEpTUC1yZWxhdGVkIGNvbnRlbnQgdHlwZXMKLQkgKi8KLQlwcml2YXRlIElDb250ZW50VHlwZVtdIGdldFZhbGlkQ29udGVudFR5cGVzKCkgewotCQlpZiAoZkNvbnRlbnRUeXBlcyA9PSBudWxsKSB7Ci0JCQkvLyBjdXJyZW50bHkgImhhcmQtY29kZWQiIHRvIGJlIGpzcCAmIGpzcGYKLQkJCWZDb250ZW50VHlwZXMgPSBuZXcgSUNvbnRlbnRUeXBlW117UGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCksIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BGUkFHTUVOVCl9OwotCQkJaWYgKGZBZGRpdGlvbmFsQ29udGVudFR5cGVzSURzICE9IG51bGwpIHsKLQkJCQlMaXN0IGFsbFR5cGVzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGZDb250ZW50VHlwZXMpKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZBZGRpdGlvbmFsQ29udGVudFR5cGVzSURzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlDb250ZW50VHlwZSB0eXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoZkFkZGl0aW9uYWxDb250ZW50VHlwZXNJRHNbaV0pOwotCQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCQlhbGxUeXBlcy5hZGQodHlwZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZkNvbnRlbnRUeXBlcyA9IChJQ29udGVudFR5cGVbXSkgYWxsVHlwZXMudG9BcnJheShuZXcgSUNvbnRlbnRUeXBlW2FsbFR5cGVzLnNpemUoKV0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBmQ29udGVudFR5cGVzOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgZmlsZSBpcyBqc3AgZnJhZ21lbnQgb3Igbm90IChkb2VzIGEgZGVlcCwgaW5kZXB0aCBjaGVjaywKLQkgKiBsb29raW5nIGludG8gY29udGVudHMgb2YgZmlsZSkKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgYXNzdW1lcyBmaWxlIGlzIG5vdCBudWxsIGFuZCBleGlzdHMKLQkgKiBAcmV0dXJuIHRydWUgaWYgZmlsZSBpcyBqc3AgZnJhZ21lbnQsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ZyYWdtZW50KElGaWxlIGZpbGUpIHsKLQkJYm9vbGVhbiBpc0ZyYWdtZW50ID0gZmFsc2U7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCS8vIGl0IGNhbiBiZSBudWxsCi0JCQlpZiAoY29udGVudERlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCQlpcyA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQljb250ZW50RGVzY3JpcHRpb24gPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXREZXNjcmlwdGlvbkZvcihpcywgZmlsZS5nZXROYW1lKCksIG5ldyBRdWFsaWZpZWROYW1lW117SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUfSk7Ci0JCQl9Ci0JCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZmlsZUN0SWQgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKS5nZXRJZCgpOwotCQkJCWlzRnJhZ21lbnQgPSAoZmlsZUN0SWQgIT0gbnVsbCAmJiBDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQRlJBR01FTlQuZXF1YWxzKGZpbGVDdElkKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZSwgYXNzdW1lIGl0J3MgaW52YWxpZCBKU1AKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUsIGFzc3VtZSBpdCdzIGludmFsaWQgSlNQCi0JCX0KLQkJZmluYWxseSB7Ci0JCQkvKgotCQkJICogbXVzdCBjbG9zZSBpbnB1dCBzdHJlYW0gaW4gY2FzZSBvdGhlcnMgbmVlZCBpdAotCQkJICogKElGaWxlLmdldENvbnRlbnRzKCkgcmVxdWlyZW1lbnQgYXMgd2VsbCkKLQkJCSAqLwotCQkJaWYgKGlzICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJaXMuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIG5vdCBzdXJlIGhvdyB0byByZWNvdmVyIGF0IHRoaXMgcG9pbnQKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIGlzRnJhZ21lbnQ7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGZpbGVOYW1lIGlzIHNvbWUgdHlwZSBvZiBKU1AgKGluY2x1ZGluZyBKU1AgZnJhZ21lbnRzKQotCSAqIAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBmaWxlbmFtZSBpbmRpY2F0ZXMgc29tZSB0eXBlIG9mIEpTUCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSlNQVHlwZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCi0JCUlDb250ZW50VHlwZVtdIHR5cGVzID0gZ2V0VmFsaWRDb250ZW50VHlwZXMoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IHR5cGVzLmxlbmd0aCAmJiAhdmFsaWQpIHsKLQkJCXZhbGlkID0gdHlwZXNbaV0uaXNBc3NvY2lhdGVkV2l0aChmaWxlTmFtZSk7Ci0JCQkrK2k7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtVmFsaWRhdGlvbihJRmlsZSBmLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKCFyZXBvcnRlci5pc0NhbmNlbGxlZCgpKQotCQkJZkpTUEphdmFWYWxpZGF0b3IucGVyZm9ybVZhbGlkYXRpb24oZiwgcmVwb3J0ZXIsIG1vZGVsKTsKLQkJaWYgKCFyZXBvcnRlci5pc0NhbmNlbGxlZCgpKQotCQkJZkpTUERpcmVjdGl2ZVZhbGlkYXRvci5wZXJmb3JtVmFsaWRhdGlvbihmLCByZXBvcnRlciwgbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQlpZiAoIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpCi0JCQlmSlNQRUxWYWxpZGF0b3IucGVyZm9ybVZhbGlkYXRpb24oZiwgcmVwb3J0ZXIsIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJaWYgKCFyZXBvcnRlci5pc0NhbmNlbGxlZCgpKQotCQkJZkpTUEFjdGlvblZhbGlkYXRvci5wZXJmb3JtVmFsaWRhdGlvbihmLCByZXBvcnRlciwgbW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uI3NldEluaXRpYWxpemF0aW9uRGF0YShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXphdGlvbkRhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZywgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGRhdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZkFkZGl0aW9uYWxDb250ZW50VHlwZXNJRHMgPSBuZXcgU3RyaW5nWzBdOwotCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQlpZiAoZGF0YSBpbnN0YW5jZW9mIFN0cmluZyAmJiBkYXRhLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZkFkZGl0aW9uYWxDb250ZW50VHlwZXNJRHMgPSBTdHJpbmdVdGlscy51bnBhY2soZGF0YS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZShJRmlsZSBmaWxlKSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGZpbGU7Ci0JCWRvIHsKLQkJCWlmIChyZXNvdXJjZS5pc0Rlcml2ZWQoKSB8fCByZXNvdXJjZS5pc1RlYW1Qcml2YXRlTWVtYmVyKCkgfHwgIXJlc291cmNlLmlzQWNjZXNzaWJsZSgpIHx8IHJlc291cmNlLmdldE5hbWUoKS5jaGFyQXQoMCkgPT0gJy4nKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmVzb3VyY2UgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJfQotCQl3aGlsZSAoKHJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5QUk9KRUNUKSA9PSAwKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCWRvVmFsaWRhdGUoaGVscGVyLCByZXBvcnRlcik7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgb25lIGZpbGUuIEl0J3MgYXNzdW1lZCB0aGF0IHRoZSBmaWxlIGhhcyBKU1AgY29udGVudCB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBmCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICovCi0Jdm9pZCB2YWxpZGF0ZUZpbGUoSUZpbGUgZiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXRyeSB7Ci0JCQlmLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGdldCBKU1AgbW9kZWwgb24gYmVoYWxmIG9mIGFsbCBKU1AgdmFsaWRhdG9ycwotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmKTsKLQkJCWlmICghcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSAmJiBtb2RlbCAhPSBudWxsKSB7Ci0JCQkJcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcywgZik7Ci0JCQkJcGVyZm9ybVZhbGlkYXRpb24oZiwgcmVwb3J0ZXIsIG1vZGVsKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKGZpbmFsIElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIGZpbmFsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlKb2IgY3VycmVudEpvYiA9IEpvYi5nZXRKb2JNYW5hZ2VyKCkuY3VycmVudEpvYigpOwotCQlJU2NoZWR1bGluZ1J1bGUgcnVsZSA9IG51bGw7Ci0JCWlmIChjdXJyZW50Sm9iICE9IG51bGwpIHsKLQkJCXJ1bGUgPSBjdXJyZW50Sm9iLmdldFJ1bGUoKTsKLQkJfQotCQlJV29ya3NwYWNlUnVubmFibGUgdmFsaWRhdGlvblJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQlkb1ZhbGlkYXRlKGhlbHBlciwgcmVwb3J0ZXIpOwotCQkJCX0KLQkJCQljYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lEX0pTUF9DT1JFLCAwLCBQTFVHSU5fSURfSlNQX0NPUkUsIGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlKYXZhQ29yZS5ydW4odmFsaWRhdGlvblJ1bm5hYmxlLCBydWxlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgVmFsaWRhdGlvbkV4Y2VwdGlvbikgewotCQkJCXRocm93IChWYWxpZGF0aW9uRXhjZXB0aW9uKSBlLmdldENhdXNlKCk7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5FUlJPUl9BTkRfV0FSTklORywgZS5nZXRNZXNzYWdlKCkpLCBlKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJcmV0dXJuIG51bGw7Ci0JCVZhbGlkYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25SZXN1bHQoKTsKLQkJZmluYWwgSVJlcG9ydGVyIHJlcG9ydGVyID0gcmVzdWx0LmdldFJlcG9ydGVyKG1vbml0b3IpOwotCQlJV29ya3NwYWNlUnVubmFibGUgdmFsaWRhdGlvblJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQl2YWxpZGF0ZUZpbGUoKElGaWxlKSByZXNvdXJjZSwgcmVwb3J0ZXIpOwotCQkJfQotCQl9OwotCQlKb2IgY3VycmVudEpvYiA9IEpvYi5nZXRKb2JNYW5hZ2VyKCkuY3VycmVudEpvYigpOwotCQlJU2NoZWR1bGluZ1J1bGUgcnVsZSA9IG51bGw7Ci0JCWlmIChjdXJyZW50Sm9iICE9IG51bGwpIHsKLQkJCXJ1bGUgPSBjdXJyZW50Sm9iLmdldFJ1bGUoKTsKLQkJfQotCQl0cnkgewotCQkJSmF2YUNvcmUucnVuKHZhbGlkYXRpb25SdW5uYWJsZSwgcnVsZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BDb250ZW50VmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQQ29udGVudFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDlhMTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BDb250ZW50VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50VHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0vKioKLSAqIFRoaXMgdmFsaWRhdG9yIHZhbGlkYXRlcyB0aGUgY29udGVudHMgb2YgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgSlNQLCBsaWtlCi0gKiB0aGUgSFRNTCByZWdpb25zIGluIGEgSlNQIHdpdGggY29udGVudCB0eXBlPSJ0ZXh0L2h0bWwiCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BDb250ZW50VmFsaWRhdG9yIGV4dGVuZHMgSlNQVmFsaWRhdG9yIHsKLQkvKgotCSAqIENvcGllZCBmcm9tIEhUTUxWYWxpZGF0b3IKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzSFRNTEZlYXR1cmUoSURPTURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSBkb2N1bWVudC5nZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYWRhcHRlci5oYXNGZWF0dXJlKEhUTUxEb2N1bWVudFR5cGVDb25zdGFudHMuSFRNTCk7Ci0JfQotCi0JLyoKLQkgKiBDb3BpZWQgZnJvbSBIVE1MVmFsaWRhdG9yCi0JICovCi0JcHJpdmF0ZSBIVE1MVmFsaWRhdGlvblJlcG9ydGVyIGdldFJlcG9ydGVyKElSZXBvcnRlciByZXBvcnRlciwgSUZpbGUgZmlsZSwgSURPTU1vZGVsIG1vZGVsKSB7Ci0JCXJldHVybiBuZXcgSFRNTFZhbGlkYXRpb25SZXBvcnRlcih0aGlzLCByZXBvcnRlciwgZmlsZSwgbW9kZWwpOwotCX0KLQotCS8qCi0JICogTW9zdGx5IGNvcGllZCBmcm9tIEhUTUxWYWxpZGF0b3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGUoSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlLCBJRE9NTW9kZWwgbW9kZWwpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCB8fCBtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSBtb2RlbC5nZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQkvLyBUaGlzIHZhbGlkYXRvciBjdXJyZW50bHkgb25seSBoYW5kbGVzIHZhbGlkYXRpbmcgSFRNTCBjb250ZW50IGluCi0JCS8vIEpTUAotCQlpZiAoaGFzSFRNTEZlYXR1cmUoZG9jdW1lbnQpKSB7Ci0JCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBIVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCQlWYWxpZGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKFZhbGlkYXRpb25BZGFwdGVyKSBmYWN0b3J5LmFkYXB0KGRvY3VtZW50KTsKLQkJCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCQlIVE1MVmFsaWRhdGlvblJlcG9ydGVyIHJlcCA9IGdldFJlcG9ydGVyKHJlcG9ydGVyLCBmaWxlLCBtb2RlbCk7Ci0JCQlyZXAuY2xlYXIoKTsKLQkJCWFkYXB0ZXIuc2V0UmVwb3J0ZXIocmVwKTsKLQkJCWFkYXB0ZXIudmFsaWRhdGUoZG9jdW1lbnQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVGaWxlKElGaWxlIGYsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoZik7Ci0JCQlpZiAoIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkgJiYgbW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQlyZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh0aGlzLCBmKTsKLQkJCQl2YWxpZGF0ZShyZXBvcnRlciwgZiwgKElET01Nb2RlbCkgbW9kZWwpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BEaXJlY3RpdmVWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BEaXJlY3RpdmVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg3ZTk2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQRGlyZWN0aXZlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkpTUENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsLkZhY2V0TW9kdWxlQ29yZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnbGliUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuVGFnbGliSW5kZXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5KU1AyME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotLyoqCi0gKiBDaGVja3MgZm9yOiAtIGR1cGxpY2F0ZSB0YWdsaWIgcHJlZml4IHZhbHVlcyBhbmQgcmVzZXJ2ZWQgdGFnbGliIHByZWZpeAotICogdmFsdWVzIGluIHRoZSBzYW1lIGZpbGUKLSAqLwotcHVibGljIGNsYXNzIEpTUERpcmVjdGl2ZVZhbGlkYXRvciBleHRlbmRzIEpTUFZhbGlkYXRvciB7Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfTk9ERV9RVUFMSUZJRVIgPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIENvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoTG9jYWxlLlVTKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBCb29sZWFuLnZhbHVlT2YoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3B2YWxpZGF0b3IiKSkuYm9vbGVhblZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSVZhbGlkYXRvciBmTWVzc2FnZU9yaWdpbmF0b3I7Ci0JcHJpdmF0ZSBJRWNsaXBzZVByZWZlcmVuY2VzIGZQcmVmZXJlbmNlcyA9IG51bGw7Ci0KLQlwcml2YXRlIElQcmVmZXJlbmNlc1NlcnZpY2UgZlByZWZlcmVuY2VzU2VydmljZSA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZQcmVmaXhWYWx1ZVJlZ2lvblRvRG9jdW1lbnRSZWdpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgSUphdmFQcm9qZWN0IGZQcm9qZWN0ID0gbnVsbDsKLQlwcml2YXRlIEhhc2hNYXAgZlJlc2VydmVkUHJlZml4ZXMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgSVNjb3BlQ29udGV4dFtdIGZTY29wZXMgPSBudWxsOwotCXByaXZhdGUgaW50IGZTZXZlcml0eUluY2x1ZGVGaWxlTWlzc2luZyA9IC0xOwotCXByaXZhdGUgaW50IGZTZXZlcml0eUluY2x1ZGVGaWxlTm90U3BlY2lmaWVkID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZlNldmVyaXR5U3VwZXJDbGFzc05vdEZvdW5kID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZlNldmVyaXR5VGFnZGlyVW5yZXNvbHZhYmxlVVJJID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZlNldmVyaXR5VGFnbGliRHVwbGljYXRlUHJlZml4V2l0aERpZmZlcmVudFVSSXMgPSAtMTsKLQotCXByaXZhdGUgaW50IGZTZXZlcml0eVRhZ2xpYkR1cGxpY2F0ZVByZWZpeFdpdGhTYW1lVVJJcyA9IC0xOwotCXByaXZhdGUgaW50IGZTZXZlcml0eVRhZ2xpYk1pc3NpbmdQcmVmaXggPSAtMTsKLQotCXByaXZhdGUgaW50IGZTZXZlcml0eVRhZ2xpYk1pc3NpbmdVUkkgPSAtMTsKLQotCi0JcHJpdmF0ZSBpbnQgZlNldmVyaXR5VGFnbGliVW5yZXNvbHZhYmxlVVJJID0gLTE7Ci0KLQlwcml2YXRlIEhhc2hNYXAgZlRhZ2xpYlByZWZpeGVzSW5Vc2UgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIEpTUERpcmVjdGl2ZVZhbGlkYXRvcigpIHsKLQkJaW5pdFJlc2VydmVkUHJlZml4ZXMoKTsKLQkJZk1lc3NhZ2VPcmlnaW5hdG9yID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgSlNQRGlyZWN0aXZlVmFsaWRhdG9yKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCWluaXRSZXNlcnZlZFByZWZpeGVzKCk7Ci0JCXRoaXMuZk1lc3NhZ2VPcmlnaW5hdG9yID0gdmFsaWRhdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLmNsZWFudXAocmVwb3J0ZXIpOwotCQlmVGFnbGliUHJlZml4ZXNJblVzZS5jbGVhcigpOwotCQlmUHJlZml4VmFsdWVSZWdpb25Ub0RvY3VtZW50UmVnaW9uTWFwLmNsZWFyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RUYWdsaWJQcmVmaXgoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gdmFsdWVSZWdpb24sIFN0cmluZyB0YWdsaWJQcmVmaXgpIHsKLQkJZlByZWZpeFZhbHVlUmVnaW9uVG9Eb2N1bWVudFJlZ2lvbk1hcC5wdXQodmFsdWVSZWdpb24sIGRvY3VtZW50UmVnaW9uKTsKLQotCQlPYmplY3QgbyA9IGZUYWdsaWJQcmVmaXhlc0luVXNlLmdldCh0YWdsaWJQcmVmaXgpOwotCQlpZiAobyA9PSBudWxsKSB7Ci0JCQkvLyBwcmVmaXggZG9lc24ndCBleGlzdCwgcmVtZW1iZXIgaXQKLQkJCWZUYWdsaWJQcmVmaXhlc0luVXNlLnB1dCh0YWdsaWJQcmVmaXgsIHZhbHVlUmVnaW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgcmVnaW9uTGlzdCA9IG51bGw7Ci0JCQkvLyBhbHJlYWR5IGEgTGlzdAotCQkJaWYgKG8gaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJcmVnaW9uTGlzdCA9IChMaXN0KSBvOwotCQkJfQotCQkJLyoKLQkJCSAqIGEgc2luZ2xlIHZhbHVlIHJlZ2lvbiwgY3JlYXRlIGEgbmV3IExpc3QgYW5kIGFkZCBwcmV2aW91cwotCQkJICogdmFsdWVSZWdpb24KLQkJCSAqLwotCQkJZWxzZSB7Ci0JCQkJcmVnaW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlyZWdpb25MaXN0LmFkZChvKTsKLQkJCQlmVGFnbGliUHJlZml4ZXNJblVzZS5wdXQodGFnbGliUHJlZml4LCByZWdpb25MaXN0KTsKLQkJCX0KLQkJCXJlZ2lvbkxpc3QuYWRkKHZhbHVlUmVnaW9uKTsKLQkJfQotCX0KLQotCWludCBnZXRNZXNzYWdlU2V2ZXJpdHkoU3RyaW5nIGtleSkgewotCQlpbnQgc2V2ID0gZlByZWZlcmVuY2VzU2VydmljZS5nZXRJbnQoUFJFRkVSRU5DRV9OT0RFX1FVQUxJRklFUiwga2V5LCBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIGZTY29wZXMpOwotCQlzd2l0Y2ggKHNldikgewotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUiA6Ci0JCQkJcmV0dXJuIElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcgOgotCQkJCXJldHVybiBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLklORk9STUFUSU9OIDoKLQkJCQlyZXR1cm4gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOwotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUgOgotCQkJCXJldHVybiBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkU7Ci0JCX0KLQkJcmV0dXJuIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGluaXRSZXNlcnZlZFByZWZpeGVzKCkgewotCQlmUmVzZXJ2ZWRQcmVmaXhlcy5wdXQoImpzcCIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZSZXNlcnZlZFByZWZpeGVzLnB1dCgianNweCIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZSZXNlcnZlZFByZWZpeGVzLnB1dCgiamF2YSIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZSZXNlcnZlZFByZWZpeGVzLnB1dCgiamF2YXgiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJZlJlc2VydmVkUHJlZml4ZXMucHV0KCJzZXJ2bGV0IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCWZSZXNlcnZlZFByZWZpeGVzLnB1dCgic3VuIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCWZSZXNlcnZlZFByZWZpeGVzLnB1dCgic3VudyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1Jlc2VydmVkVGFnbGliUHJlZml4KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmUmVzZXJ2ZWRQcmVmaXhlcy5nZXQobmFtZSkgIT0gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRQcmVmZXJlbmNlcyhJRmlsZSBmaWxlKSB7Ci0JCWZTY29wZXMgPSBuZXcgSVNjb3BlQ29udGV4dFtde25ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0KLQkJZlByZWZlcmVuY2VzU2VydmljZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpOwotCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCVByb2plY3RTY29wZSBwcm9qZWN0U2NvcGUgPSBuZXcgUHJvamVjdFNjb3BlKGZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJCWlmIChwcm9qZWN0U2NvcGUuZ2V0Tm9kZShQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSKS5nZXRCb29sZWFuKEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9VU0VfUFJPSkVDVF9TRVRUSU5HUywgZmFsc2UpKSB7Ci0JCQkJZlNjb3BlcyA9IG5ldyBJU2NvcGVDb250ZXh0W117cHJvamVjdFNjb3BlLCBuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OwotCQkJfQotCQl9Ci0KLQkJZlNldmVyaXR5SW5jbHVkZUZpbGVNaXNzaW5nID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfSU5DTFVERV9GSUxFX05PVF9GT1VORCk7Ci0JCWZTZXZlcml0eUluY2x1ZGVGaWxlTm90U3BlY2lmaWVkID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfSU5DTFVERV9OT19GSUxFX1NQRUNJRklFRCk7Ci0JCWZTZXZlcml0eVRhZ2xpYkR1cGxpY2F0ZVByZWZpeFdpdGhEaWZmZXJlbnRVUklzID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX0RVUExJQ0FURV9QUkVGSVhFU19ESUZGRVJFTlRfVVJJUyk7Ci0JCWZTZXZlcml0eVRhZ2xpYkR1cGxpY2F0ZVByZWZpeFdpdGhTYW1lVVJJcyA9IGdldE1lc3NhZ2VTZXZlcml0eShKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9EVVBMSUNBVEVfUFJFRklYRVNfU0FNRV9VUklTKTsKLQkJZlNldmVyaXR5VGFnbGliTWlzc2luZ1ByZWZpeCA9IGdldE1lc3NhZ2VTZXZlcml0eShKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9NSVNTSU5HX1BSRUZJWCk7Ci0JCWZTZXZlcml0eVRhZ2xpYk1pc3NpbmdVUkkgPSBnZXRNZXNzYWdlU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfTUlTU0lOR19VUklfT1JfVEFHRElSKTsKLQkJZlNldmVyaXR5VGFnbGliVW5yZXNvbHZhYmxlVVJJID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX1VOUkVTT0xWQUJMRV9VUklfT1JfVEFHRElSKTsKLQkJZlNldmVyaXR5VGFnZGlyVW5yZXNvbHZhYmxlVVJJID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX1VOUkVTT0xWQUJMRV9VUklfT1JfVEFHRElSKTsKLQkJZlNldmVyaXR5U3VwZXJDbGFzc05vdEZvdW5kID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfUEFHRV9TVVBFUkNMQVNTX05PVF9GT1VORCk7Ci0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVZhbGlkYXRpb24oSUZpbGUgZiwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJU3RydWN0dXJlZERvY3VtZW50IHNEb2MpIHsKLQkJbG9hZFByZWZlcmVuY2VzKGYpOwotCQkKLQkJCi0JCXNldFByb2plY3QoZi5nZXRQcm9qZWN0KCkpOwotCQkvKgotCQkgKiB3aGVuIHZhbGlkYXRpbmcgYW4gZW50aXJlIGZpbGUgbmVlZCB0byBjbGVhciBkdXBlcyBvciBlbHNlIHlvdSdyZQotCQkgKiBjb21wYXJpbmcgYmV0d2VlbiBmaWxlcwotCQkgKi8KLQkJZlByZWZpeFZhbHVlUmVnaW9uVG9Eb2N1bWVudFJlZ2lvbk1hcC5jbGVhcigpOwotCQlmVGFnbGliUHJlZml4ZXNJblVzZS5jbGVhcigpOwotCi0JCS8vIGl0ZXJhdGUgYWxsIGRvY3VtZW50IHJlZ2lvbnMKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBzRG9jLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCXdoaWxlIChyZWdpb24gIT0gbnVsbCAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJLy8gb25seSBjaGVja2luZyBkaXJlY3RpdmVzCi0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCQlwcm9jZXNzRGlyZWN0aXZlKHJlcG9ydGVyLCBmLCBzRG9jLCByZWdpb24pOwotCQkJfQotCQkJcmVnaW9uID0gcmVnaW9uLmdldE5leHQoKTsKLQkJfQotCi0JCWlmICghcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJcmVwb3J0VGFnbGliRHVwbGljYXRlUHJlZml4ZXMoZiwgcmVwb3J0ZXIsIHNEb2MpOwotCQl9Ci0KLQkJZlByZWZpeFZhbHVlUmVnaW9uVG9Eb2N1bWVudFJlZ2lvbk1hcC5jbGVhcigpOwotCQlmVGFnbGliUHJlZml4ZXNJblVzZS5jbGVhcigpOwotCQlzZXRQcm9qZWN0KG51bGwpOwotCQl1bmxvYWRQcmVmZXJlbmNlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzRGlyZWN0aXZlKElSZXBvcnRlciByZXBvcnRlciwgSUZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudCBzRG9jLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uKSB7Ci0JCVN0cmluZyBkaXJlY3RpdmVOYW1lID0gZ2V0RGlyZWN0aXZlTmFtZShkb2N1bWVudFJlZ2lvbik7Ci0JCS8vIHdlIG9ubHkgY2FyZSBhYm91dCB0YWdsaWIgZGlyZWN0aXZlCi0JCWlmIChkaXJlY3RpdmVOYW1lLmVxdWFscygidGFnbGliIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvY2Vzc1RhZ2xpYkRpcmVjdGl2ZShyZXBvcnRlciwgZmlsZSwgc0RvYywgZG9jdW1lbnRSZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKGRpcmVjdGl2ZU5hbWUuZXF1YWxzKCJpbmNsdWRlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvY2Vzc0luY2x1ZGVEaXJlY3RpdmUocmVwb3J0ZXIsIGZpbGUsIHNEb2MsIGRvY3VtZW50UmVnaW9uKTsKLQkJfQotCQllbHNlIGlmIChkaXJlY3RpdmVOYW1lLmVxdWFscygicGFnZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXByb2Nlc3NQYWdlRGlyZWN0aXZlKHJlcG9ydGVyLCBmaWxlLCBzRG9jLCBkb2N1bWVudFJlZ2lvbik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0luY2x1ZGVEaXJlY3RpdmUoSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50IHNEb2MsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24pIHsKLQkJSVRleHRSZWdpb24gZmlsZVZhbHVlUmVnaW9uID0gZ2V0QXR0cmlidXRlVmFsdWVSZWdpb24oZG9jdW1lbnRSZWdpb24sIEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9GSUxFKTsKLQkJaWYgKGZpbGVWYWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBmaWxlIHNwZWNpZmllZAotCQkJU3RyaW5nIGZpbGVWYWx1ZSA9IGRvY3VtZW50UmVnaW9uLmdldFRleHQoZmlsZVZhbHVlUmVnaW9uKTsKLQkJCWZpbGVWYWx1ZSA9IFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzKGZpbGVWYWx1ZSk7Ci0KLQkJCWlmIChmaWxlVmFsdWUubGVuZ3RoKCkgPT0gMCAmJiBmU2V2ZXJpdHlJbmNsdWRlRmlsZU5vdFNwZWNpZmllZCAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCQkvLyBmaWxlIHZhbHVlIGlzIHNwZWNpZmllZCBidXQgZW1wdHkKLQkJCQlTdHJpbmcgbXNnVGV4dCA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMywgSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0ZJTEUpOwotCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGZTZXZlcml0eUluY2x1ZGVGaWxlTm90U3BlY2lmaWVkLCBtc2dUZXh0LCBmaWxlKTsKLQkJCQlpbnQgc3RhcnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmaWxlVmFsdWVSZWdpb24pOwotCQkJCWludCBsZW5ndGggPSBmaWxlVmFsdWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCWludCBsaW5lTm8gPSBzRG9jLmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vKTsKLQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZTZXZlcml0eUluY2x1ZGVGaWxlTWlzc2luZyAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCQlJUGF0aCB0ZXN0UGF0aCA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQucmVzb2x2ZShmaWxlLmdldEZ1bGxQYXRoKCksIGZpbGVWYWx1ZSk7Ci0JCQkJaWYgKHRlc3RQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCQlJRmlsZSB0ZXN0RmlsZSA9IGZpbGUuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUodGVzdFBhdGgpOwotCQkJCQlpZiAoIXRlc3RGaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQkvLyBGaWxlIG5vdCBmb3VuZAotCQkJCQkJU3RyaW5nIG1zZ1RleHQgPSBOTFMuYmluZChKU1BDb3JlTWVzc2FnZXMuSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzQsIG5ldyBTdHJpbmdbXXtmaWxlVmFsdWUsIHRlc3RQYXRoLnRvU3RyaW5nKCl9KTsKLQkJCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGZTZXZlcml0eUluY2x1ZGVGaWxlTWlzc2luZywgbXNnVGV4dCwgZmlsZSk7Ci0JCQkJCQlpbnQgc3RhcnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmaWxlVmFsdWVSZWdpb24pOwotCQkJCQkJaW50IGxlbmd0aCA9IGZpbGVWYWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCQlpbnQgbGluZU5vID0gc0RvYy5nZXRMaW5lT2ZPZmZzZXQoc3RhcnQpOwotCQkJCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vKTsKLQkJCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0KLQkJCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChmU2V2ZXJpdHlJbmNsdWRlRmlsZU5vdFNwZWNpZmllZCAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCS8vIGZpbGUgaXMgbm90IHNwZWNpZmllZCBhdCBhbGwKLQkJCVN0cmluZyBtc2dUZXh0ID0gTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUERpcmVjdGl2ZVZhbGlkYXRvcl8zLCBKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfRklMRSk7Ci0JCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShmU2V2ZXJpdHlJbmNsdWRlRmlsZU5vdFNwZWNpZmllZCwgbXNnVGV4dCwgZmlsZSk7Ci0JCQlpbnQgc3RhcnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGxlbmd0aCA9IGRvY3VtZW50UmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCWludCBsaW5lTm8gPSBzRG9jLmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8pOwotCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZShmTWVzc2FnZU9yaWdpbmF0b3IsIG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcGFyYW0gZG9jCi0JICogQHBhcmFtIGRvY3VtZW50UmVnaW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NQYWdlRGlyZWN0aXZlKElSZXBvcnRlciByZXBvcnRlciwgSUZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudCBkb2MsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24pIHsKLQkJSVRleHRSZWdpb24gc3VwZXJjbGFzc1ZhbHVlUmVnaW9uID0gZ2V0QXR0cmlidXRlVmFsdWVSZWdpb24oZG9jdW1lbnRSZWdpb24sIEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9FWFRFTkRTKTsKLQkJaWYgKHN1cGVyY2xhc3NWYWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBmaWxlIHNwZWNpZmllZAotCQkJU3RyaW5nIHN1cGVyY2xhc3NOYW1lID0gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dChzdXBlcmNsYXNzVmFsdWVSZWdpb24pOwotCQkJc3VwZXJjbGFzc05hbWUgPSBTdHJpbmdVdGlscy5zdHJpcFF1b3RlcyhzdXBlcmNsYXNzTmFtZSk7Ci0KLQkJCUlUeXBlIHN1cGVyQ2xhc3MgPSBudWxsOwotCQkJaWYgKHN1cGVyY2xhc3NOYW1lICE9IG51bGwgJiYgc3VwZXJjbGFzc05hbWUubGVuZ3RoKCkgPiAwICYmIGZQcm9qZWN0ICE9IG51bGwgJiYgZlByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQl0cnkgewotCQkJCQlzdXBlckNsYXNzID0gZlByb2plY3QuZmluZFR5cGUoc3VwZXJjbGFzc05hbWUudHJpbSgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoc3VwZXJDbGFzcyA9PSBudWxsICYmIGZTZXZlcml0eVN1cGVyQ2xhc3NOb3RGb3VuZCAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCQkvLyBmaWxlIHZhbHVlIGlzIHNwZWNpZmllZCBidXQgZW1wdHkKLQkJCQlTdHJpbmcgbXNnVGV4dCA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BEaXJlY3RpdmVWYWxpZGF0b3JfOCwgc3VwZXJjbGFzc05hbWUpOwotCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGZTZXZlcml0eVN1cGVyQ2xhc3NOb3RGb3VuZCwgbXNnVGV4dCwgZmlsZSk7Ci0JCQkJaW50IHN0YXJ0ID0gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoc3VwZXJjbGFzc1ZhbHVlUmVnaW9uKTsKLQkJCQlpbnQgbGVuZ3RoID0gc3VwZXJjbGFzc1ZhbHVlUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQlpbnQgbGluZU5vID0gZG9jLmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vKTsKLQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzVGFnbGliRGlyZWN0aXZlKElSZXBvcnRlciByZXBvcnRlciwgSUZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudCBzRG9jLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uIHByZWZpeFZhbHVlUmVnaW9uID0gbnVsbDsKLQkJSVRleHRSZWdpb24gdXJpVmFsdWVSZWdpb24gPSBnZXRBdHRyaWJ1dGVWYWx1ZVJlZ2lvbihkb2N1bWVudFJlZ2lvbiwgSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1VSSSk7Ci0JCUlUZXh0UmVnaW9uIHRhZ2RpclZhbHVlUmVnaW9uID0gZ2V0QXR0cmlidXRlVmFsdWVSZWdpb24oZG9jdW1lbnRSZWdpb24sIEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQUdESVIpOwotCQlpZiAodXJpVmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJLy8gVVJJIGlzIHNwZWNpZmllZAotCQkJU3RyaW5nIHVyaSA9IGRvY3VtZW50UmVnaW9uLmdldFRleHQodXJpVmFsdWVSZWdpb24pOwotCi0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJdXJpID0gU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXModXJpKTsKLQkJCQlpZiAodXJpLmxlbmd0aCgpID4gMCkgewotCQkJCQlJVGFnbGliUmVjb3JkIHRsZCA9IFRhZ2xpYkluZGV4LnJlc29sdmUoZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHVyaSwgZmFsc2UpOwotCQkJCQlpZiAodGxkID09IG51bGwgJiYgZlNldmVyaXR5VGFnbGliVW5yZXNvbHZhYmxlVVJJICE9IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSkgewotCQkJCQkJLy8gVVJJIHNwZWNpZmllZCBidXQgZG9lcyBub3QgcmVzb2x2ZQotCQkJCQkJU3RyaW5nIG1zZ1RleHQgPSBOTFMuYmluZChKU1BDb3JlTWVzc2FnZXMuSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzEsIHVyaSk7Ci0JCQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShmU2V2ZXJpdHlUYWdsaWJVbnJlc29sdmFibGVVUkksIG1zZ1RleHQsIGZpbGUpOwotCQkJCQkJaW50IHN0YXJ0ID0gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQodXJpVmFsdWVSZWdpb24pOwotCQkJCQkJaW50IGxlbmd0aCA9IHVyaVZhbHVlUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJCWludCBsaW5lTm8gPSBzRG9jLmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8pOwotCQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoIlBST0JMRU1fSUQiLCBuZXcgSW50ZWdlcig2MTEpKTsKLQotCQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZShmTWVzc2FnZU9yaWdpbmF0b3IsIG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGZTZXZlcml0eVRhZ2xpYk1pc3NpbmdVUkkgIT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQkJCS8vIFVSSSBzcGVjaWZpZWQgYnV0IGVtcHR5IHN0cmluZwotCQkJCQlTdHJpbmcgbXNnVGV4dCA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMywgSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1VSSSk7Ci0JCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGZTZXZlcml0eVRhZ2xpYk1pc3NpbmdVUkksIG1zZ1RleHQsIGZpbGUpOwotCQkJCQlpbnQgc3RhcnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCh1cmlWYWx1ZVJlZ2lvbik7Ci0JCQkJCWludCBsZW5ndGggPSB1cmlWYWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCWludCBsaW5lTm8gPSBzRG9jLmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0JCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKGZNZXNzYWdlT3JpZ2luYXRvciwgbWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHRhZ2RpclZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIFVSSSBpcyBzcGVjaWZpZWQKLQkJCVN0cmluZyB0YWdkaXIgPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHRhZ2RpclZhbHVlUmVnaW9uKTsKLQotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCXRhZ2RpciA9IFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzKHRhZ2Rpcik7Ci0JCQkJaWYgKHRhZ2Rpci5sZW5ndGgoKSA8PSAwICYmIGZTZXZlcml0eVRhZ2xpYk1pc3NpbmdVUkkgIT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQkJCS8vIHRhZ2RpciBzcGVjaWZpZWQgYnV0IGVtcHR5IHN0cmluZwotCQkJCQlTdHJpbmcgbXNnVGV4dCA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMywgSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBR0RJUik7Ci0JCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKGZTZXZlcml0eVRhZ2xpYk1pc3NpbmdVUkksIG1zZ1RleHQsIGZpbGUpOwotCQkJCQlpbnQgc3RhcnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCh0YWdkaXJWYWx1ZVJlZ2lvbik7Ci0JCQkJCWludCBsZW5ndGggPSB0YWdkaXJWYWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCWludCBsaW5lTm8gPSBzRG9jLmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0JCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKGZNZXNzYWdlT3JpZ2luYXRvciwgbWVzc2FnZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKFRhZ2xpYkluZGV4LnJlc29sdmUoZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRhZ2RpciwgZmFsc2UpID09IG51bGwgJiYgZlNldmVyaXR5VGFnZGlyVW5yZXNvbHZhYmxlVVJJICE9IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSkgewotCQkJCQkvLyBVUkkgc3BlY2lmaWVkIGJ1dCBkb2VzIG5vdCByZXNvbHZlCi0JCQkJCVN0cmluZyBtc2dUZXh0ID0gTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUERpcmVjdGl2ZVZhbGlkYXRvcl8xLCB0YWdkaXIpOwotCQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShmU2V2ZXJpdHlUYWdsaWJVbnJlc29sdmFibGVVUkksIG1zZ1RleHQsIGZpbGUpOwotCQkJCQlpbnQgc3RhcnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCh0YWdkaXJWYWx1ZVJlZ2lvbik7Ci0JCQkJCWludCBsZW5ndGggPSB0YWdkaXJWYWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCWludCBsaW5lTm8gPSBzRG9jLmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0JCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKGZNZXNzYWdlT3JpZ2luYXRvciwgbWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGZTZXZlcml0eVRhZ2xpYk1pc3NpbmdVUkkgIT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQkvLyBVUkkgbm90IHNwZWNpZmllZCBvciBlbXB0eSBzdHJpbmcKLQkJCVN0cmluZyBtc2dUZXh0ID0gTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUERpcmVjdGl2ZVZhbGlkYXRvcl83LCBuZXcgU3RyaW5nW117SlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBR0RJUiwgSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1VSSX0pOwotCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoZlNldmVyaXR5VGFnbGliTWlzc2luZ1VSSSwgbXNnVGV4dCwgZmlsZSk7Ci0JCQlpbnQgc3RhcnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGxlbmd0aCA9IGRvY3VtZW50UmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCWludCBsaW5lTm8gPSBzRG9jLmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8pOwotCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZShmTWVzc2FnZU9yaWdpbmF0b3IsIG1lc3NhZ2UpOwotCQl9Ci0KLQkJcHJlZml4VmFsdWVSZWdpb24gPSBnZXRBdHRyaWJ1dGVWYWx1ZVJlZ2lvbihkb2N1bWVudFJlZ2lvbiwgSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1BSRUZJWCk7Ci0JCWlmIChwcmVmaXhWYWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBwcmVmaXggc3BlY2lmaWVkCi0JCQlTdHJpbmcgdGFnbGliUHJlZml4ID0gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dChwcmVmaXhWYWx1ZVJlZ2lvbik7Ci0JCQl0YWdsaWJQcmVmaXggPSBTdHJpbmdVdGlscy5zdHJpcFF1b3Rlcyh0YWdsaWJQcmVmaXgpOwotCi0JCQljb2xsZWN0VGFnbGliUHJlZml4KGRvY3VtZW50UmVnaW9uLCBwcmVmaXhWYWx1ZVJlZ2lvbiwgdGFnbGliUHJlZml4KTsKLQotCQkJaWYgKGlzUmVzZXJ2ZWRUYWdsaWJQcmVmaXgodGFnbGliUHJlZml4KSkgewotCQkJCS8vIHByZWZpeCBpcyBhIHJlc2VydmVkIHByZWZpeAotCQkJCVN0cmluZyBtc2dUZXh0ID0gTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUERpcmVjdGl2ZVZhbGlkYXRvcl8wLCB0YWdsaWJQcmVmaXgpOwotCQkJCWludCBzZXYgPSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IChmaWxlID09IG51bGwgPyBuZXcgTG9jYWxpemVkTWVzc2FnZShzZXYsIG1zZ1RleHQpIDogbmV3IExvY2FsaXplZE1lc3NhZ2Uoc2V2LCBtc2dUZXh0LCBmaWxlKSk7Ci0JCQkJaW50IHN0YXJ0ID0gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocHJlZml4VmFsdWVSZWdpb24pOwotCQkJCWludCBsZW5ndGggPSBwcmVmaXhWYWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJaW50IGxpbmVObyA9IHNEb2MuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8pOwotCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCi0JCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZShmTWVzc2FnZU9yaWdpbmF0b3IsIG1lc3NhZ2UpOwotCQkJfQotCQkJaWYgKHRhZ2xpYlByZWZpeC5sZW5ndGgoKSA9PSAwICYmIGZTZXZlcml0eVRhZ2xpYk1pc3NpbmdQcmVmaXggIT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQkJLy8gcHJlZml4IGlzIHNwZWNpZmllZCBidXQgZW1wdHkKLQkJCQlTdHJpbmcgbXNnVGV4dCA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMywgSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1BSRUZJWCk7Ci0JCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoZlNldmVyaXR5VGFnbGliTWlzc2luZ1ByZWZpeCwgbXNnVGV4dCwgZmlsZSk7Ci0JCQkJaW50IHN0YXJ0ID0gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocHJlZml4VmFsdWVSZWdpb24pOwotCQkJCWludCBsZW5ndGggPSBwcmVmaXhWYWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJaW50IGxpbmVObyA9IHNEb2MuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8pOwotCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCi0JCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZShmTWVzc2FnZU9yaWdpbmF0b3IsIG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGZTZXZlcml0eVRhZ2xpYk1pc3NpbmdQcmVmaXggIT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQkvLyBwcmVmaXggaXMgbm90IHNwZWNpZmllZAotCQkJU3RyaW5nIG1zZ1RleHQgPSBOTFMuYmluZChKU1BDb3JlTWVzc2FnZXMuSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzMsIEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9QUkVGSVgpOwotCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoZlNldmVyaXR5VGFnbGliTWlzc2luZ1ByZWZpeCwgbXNnVGV4dCwgZmlsZSk7Ci0JCQlpbnQgc3RhcnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGxlbmd0aCA9IGRvY3VtZW50UmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCWludCBsaW5lTm8gPSBzRG9jLmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8pOwotCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZShmTWVzc2FnZU9yaWdpbmF0b3IsIG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlcG9ydFRhZ2xpYkR1cGxpY2F0ZVByZWZpeGVzKElGaWxlIGZpbGUsIElSZXBvcnRlciByZXBvcnRlciwgSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZlNldmVyaXR5VGFnbGliRHVwbGljYXRlUHJlZml4V2l0aERpZmZlcmVudFVSSXMgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFICYmIGZTZXZlcml0eVRhZ2xpYkR1cGxpY2F0ZVByZWZpeFdpdGhTYW1lVVJJcyA9PSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nW10gcHJlZml4ZXMgPSAoU3RyaW5nW10pIGZUYWdsaWJQcmVmaXhlc0luVXNlLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCWZvciAoaW50IHByZWZpeE51bWJlciA9IDA7IHByZWZpeE51bWJlciA8IHByZWZpeGVzLmxlbmd0aDsgcHJlZml4TnVtYmVyKyspIHsKLQkJCWludCBzZXZlcml0eSA9IGZTZXZlcml0eVRhZ2xpYkR1cGxpY2F0ZVByZWZpeFdpdGhTYW1lVVJJczsKLQotCQkJT2JqZWN0IG8gPSBmVGFnbGliUHJlZml4ZXNJblVzZS5nZXQocHJlZml4ZXNbcHJlZml4TnVtYmVyXSk7Ci0JCQkvKgotCQkJICogT25seSBjYXJlIGlmIGl0J3MgYSBMaXN0IChiZWNhdXNlIHRoZXJlIHdhcyBtb3JlIHRoYW4gb25lCi0JCQkgKiBkaXJlY3RpdmUgd2l0aCB0aGF0IHByZWZpeCkgYW5kIGlmIHdlJ3JlIHN1cHBvc2VkIHRvIHJlcG9ydAotCQkJICogZHVwbGljYXRlcwotCQkJICovCi0JCQlpZiAobyBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQlMaXN0IHZhbHVlUmVnaW9ucyA9IChMaXN0KSBvOwotCQkJCVN0cmluZyB1cmkgPSBudWxsOwotCQkJCWZvciAoaW50IHJlZ2lvbk51bWJlciA9IDA7IHJlZ2lvbk51bWJlciA8IHZhbHVlUmVnaW9ucy5zaXplKCk7IHJlZ2lvbk51bWJlcisrKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZlByZWZpeFZhbHVlUmVnaW9uVG9Eb2N1bWVudFJlZ2lvbk1hcC5nZXQodmFsdWVSZWdpb25zLmdldChyZWdpb25OdW1iZXIpKTsKLQkJCQkJSVRleHRSZWdpb24gdXJpVmFsdWVSZWdpb24gPSBnZXRBdHRyaWJ1dGVWYWx1ZVJlZ2lvbihkb2N1bWVudFJlZ2lvbiwgSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1VSSSk7Ci0JCQkJCWlmICh1cmlWYWx1ZVJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCQl1cmlWYWx1ZVJlZ2lvbiA9IGdldEF0dHJpYnV0ZVZhbHVlUmVnaW9uKGRvY3VtZW50UmVnaW9uLCBKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVEFHRElSKTsKLQkJCQkJfQotCQkJCQlpZiAodXJpVmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIHVyaTIgPSBTdHJpbmdVdGlscy5zdHJpcFF1b3Rlcyhkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHVyaVZhbHVlUmVnaW9uKSk7Ci0JCQkJCQlpZiAodXJpID09IG51bGwpIHsKLQkJCQkJCQl1cmkgPSB1cmkyOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJaWYgKGNvbGxhdG9yLmNvbXBhcmUodXJpLCB1cmkyKSAhPSAwKSB7Ci0JCQkJCQkJCXNldmVyaXR5ID0gZlNldmVyaXR5VGFnbGliRHVwbGljYXRlUHJlZml4V2l0aERpZmZlcmVudFVSSXM7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJU3RyaW5nIG1zZ1RleHQgPSBOTFMuYmluZChKU1BDb3JlTWVzc2FnZXMuSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzIsIHByZWZpeGVzW3ByZWZpeE51bWJlcl0pOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQotCQkJCS8vIFJlcG9ydCBhbiBlcnJvciBpbiBhbGwgZGlyZWN0aXZlcyB1c2luZyB0aGlzIHByZWZpeAotCQkJCWZvciAoaW50IHJlZ2lvbk51bWJlciA9IDA7IHJlZ2lvbk51bWJlciA8IHZhbHVlUmVnaW9ucy5zaXplKCk7IHJlZ2lvbk51bWJlcisrKSB7Ci0KLQkJCQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSAoSVRleHRSZWdpb24pIHZhbHVlUmVnaW9ucy5nZXQocmVnaW9uTnVtYmVyKTsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBmUHJlZml4VmFsdWVSZWdpb25Ub0RvY3VtZW50UmVnaW9uTWFwLmdldCh2YWx1ZVJlZ2lvbik7Ci0JCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IChmaWxlID09IG51bGwgPyBuZXcgTG9jYWxpemVkTWVzc2FnZShzZXZlcml0eSwgbXNnVGV4dCkgOiBuZXcgTG9jYWxpemVkTWVzc2FnZShzZXZlcml0eSwgbXNnVGV4dCwgZmlsZSkpOwotCi0JCQkJCS8vIGlmIHRoZXJlJ3MgYSBtZXNzYWdlLCB0aGVyZSB3YXMgYW4gZXJyb3IgZm91bmQKLQkJCQkJaW50IHN0YXJ0ID0gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQodmFsdWVSZWdpb24pOwotCQkJCQlpbnQgbGVuZ3RoID0gdmFsdWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQlpbnQgbGluZU5vID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vKTsKLQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCi0JCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJYm9vbGVhbiB1c2VQcm9qZWN0ID0gZmFsc2U7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCWZQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJZlByZWZlcmVuY2VzID0gbmV3IFByb2plY3RTY29wZShmUHJvamVjdC5nZXRQcm9qZWN0KCkpLmdldE5vZGUoUFJFRkVSRU5DRV9OT0RFX1FVQUxJRklFUik7Ci0JCQl1c2VQcm9qZWN0ID0gZlByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVNFX1BST0pFQ1RfU0VUVElOR1MsIGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWZQcm9qZWN0ID0gbnVsbDsKLQkJfQotCi0JCWlmICghdXNlUHJvamVjdCkgewotCQkJZlByZWZlcmVuY2VzID0gbmV3IEluc3RhbmNlU2NvcGUoKS5nZXROb2RlKFBSRUZFUkVOQ0VfTk9ERV9RVUFMSUZJRVIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVubG9hZFByZWZlcmVuY2VzKCkgewotCQlmUHJlZmVyZW5jZXNTZXJ2aWNlID0gbnVsbDsKLQkJZlNjb3BlcyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogYmF0Y2ggdmFsaWRhdGlvbiBjYWxsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVGaWxlKElGaWxlIGYsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoREVCVUcpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB2YWxpZGF0aW5nOiAiICsgZik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGYpOwotCQkJaWYgKHNNb2RlbCAhPSBudWxsICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpKSB7Ci0JCQkJcGVyZm9ybVZhbGlkYXRpb24oZiwgcmVwb3J0ZXIsIHNNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BFTFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUEVMVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjE3ZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUEVMVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuSlNQRUxQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuVG9rZW5NZ3JFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlNQQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgSlNQRUxWYWxpZGF0b3IgZXh0ZW5kcyBKU1BWYWxpZGF0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBCb29sZWFuLnZhbHVlT2YoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3B2YWxpZGF0b3IiKSkuYm9vbGVhblZhbHVlKCk7IC8vJE5PTi1OTFMtMSQJCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSID0gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0KLQlwcml2YXRlIElWYWxpZGF0b3IgZk1lc3NhZ2VPcmlnaW5hdG9yOwotCi0JcHVibGljIEpTUEVMVmFsaWRhdG9yKCkgewotCQl0aGlzLmZNZXNzYWdlT3JpZ2luYXRvciA9IHRoaXM7Ci0JfQotCi0JcHVibGljIEpTUEVMVmFsaWRhdG9yKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRoaXMuZk1lc3NhZ2VPcmlnaW5hdG9yID0gdmFsaWRhdG9yOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRmlsZShJRmlsZSBmaWxlLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgdmFsaWRhdGluZzogIiArIGZpbGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoZmlsZSk7Ci0JCQlpZiAoIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkgJiYgbW9kZWwgIT0gbnVsbCkgewotCQkJCXBlcmZvcm1WYWxpZGF0aW9uKGZpbGUsIHJlcG9ydGVyLCBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG51bGwgIT0gbW9kZWwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElQcmVmZXJlbmNlc1NlcnZpY2UgZlByZWZlcmVuY2VzU2VydmljZSA9IG51bGw7Ci0JcHJpdmF0ZSBJU2NvcGVDb250ZXh0W10gZlNjb3BlcyA9IG51bGw7Ci0KLQlwcml2YXRlIHZvaWQgbG9hZFByZWZlcmVuY2VzKElGaWxlIGZpbGUpIHsKLQkJZlNjb3BlcyA9IG5ldyBJU2NvcGVDb250ZXh0W117bmV3IEluc3RhbmNlU2NvcGUoKSwgbmV3IERlZmF1bHRTY29wZSgpfTsKLQotCQlmUHJlZmVyZW5jZXNTZXJ2aWNlID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCk7Ci0JCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc0FjY2Vzc2libGUoKSkgewotCQkJUHJvamVjdFNjb3BlIHByb2plY3RTY29wZSA9IG5ldyBQcm9qZWN0U2NvcGUoZmlsZS5nZXRQcm9qZWN0KCkpOwotCQkJaWYgKHByb2plY3RTY29wZS5nZXROb2RlKFBSRUZFUkVOQ0VfTk9ERV9RVUFMSUZJRVIpLmdldEJvb2xlYW4oSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1VTRV9QUk9KRUNUX1NFVFRJTkdTLCBmYWxzZSkpIHsKLQkJCQlmU2NvcGVzID0gbmV3IElTY29wZUNvbnRleHRbXXtwcm9qZWN0U2NvcGUsIG5ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JaW50IGdldE1lc3NhZ2VTZXZlcml0eShTdHJpbmcga2V5KSB7Ci0JCWludCBzZXYgPSBmUHJlZmVyZW5jZXNTZXJ2aWNlLmdldEludChQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSLCBrZXksIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwgZlNjb3Blcyk7Ci0JCXN3aXRjaCAoc2V2KSB7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SIDoKLQkJCQlyZXR1cm4gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyA6Ci0JCQkJcmV0dXJuIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuSU5GT1JNQVRJT04gOgotCQkJCXJldHVybiBJTWVzc2FnZS5MT1dfU0VWRVJJVFk7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSA6Ci0JCQkJcmV0dXJuIFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRTsKLQkJfQotCQlyZXR1cm4gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdW5sb2FkUHJlZmVyZW5jZXMoKSB7Ci0JCWZQcmVmZXJlbmNlc1NlcnZpY2UgPSBudWxsOwotCQlmU2NvcGVzID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtVmFsaWRhdGlvbihJRmlsZSBmaWxlLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvYykgewotCQlsb2FkUHJlZmVyZW5jZXMoZmlsZSk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VyTm9kZSA9IHN0cnVjdHVyZWREb2MuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJd2hpbGUgKG51bGwgIT0gY3VyTm9kZSAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJaWYgKGN1ck5vZGUuZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCAmJiBjdXJOb2RlLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUICYmIGN1ck5vZGUuZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEKSB7Ci0JCQkJdmFsaWRhdGVSZWdpb25Db250YWluZXIoY3VyTm9kZSwgcmVwb3J0ZXIsIGZpbGUpOwotCQkJfQotCQkJY3VyTm9kZSA9IGN1ck5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXVubG9hZFByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVSZWdpb25Db250YWluZXIoSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbnRhaW5lciwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlKSB7Ci0JCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXJSZWdpb24gPSBjb250YWluZXI7Ci0JCUl0ZXJhdG9yIHJlZ2lvbnMgPSBjb250YWluZXJSZWdpb24uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlICE9IG51bGwgJiYgcmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSB7Ci0JCQkJSVRleHRSZWdpb25Db2xsZWN0aW9uIHBhcmVudFJlZ2lvbiA9ICgoSVRleHRSZWdpb25Db2xsZWN0aW9uKSByZWdpb24pOwotCQkJCUl0ZXJhdG9yIGNoaWxkUmVnaW9ucyA9IHBhcmVudFJlZ2lvbi5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoY2hpbGRSZWdpb25zLmhhc05leHQoKSAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBjaGlsZFJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgY2hpbGRSZWdpb25zLm5leHQoKTsKLQkJCQkJaWYgKGNoaWxkUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfQ09OVEVOVCkKLQkJCQkJCXZhbGlkYXRlWE1MTm9kZShwYXJlbnRSZWdpb24sIGNoaWxkUmVnaW9uLCByZXBvcnRlciwgZmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVYTUxOb2RlKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXIsIElUZXh0UmVnaW9uIHJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBlbFRleHQgPSBjb250YWluZXIuZ2V0VGV4dChyZWdpb24pOwotCQlKU1BFTFBhcnNlciBlbFBhcnNlciA9IEpTUEVMUGFyc2VyLmNyZWF0ZVBhcnNlcihlbFRleHQpOwotCQlpbnQgY29udGVudFN0YXJ0ID0gY29udGFpbmVyLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCWludCBjb250ZW50TGVuZ3RoID0gY29udGFpbmVyLmdldExlbmd0aCgpOwotCQl0cnkgewotCQkJZWxQYXJzZXIuRXhwcmVzc2lvbigpOwotCQl9Ci0JCWNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpbnQgc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9FTF9TWU5UQVgpOwotCQkJaWYgKHNldiAhPSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCQlUb2tlbiBjdXJUb2sgPSBlLmN1cnJlbnRUb2tlbjsKLQkJCQlpbnQgcHJvYmxlbVN0YXJ0T2Zmc2V0ID0gY29udGVudFN0YXJ0ICsgY3VyVG9rLmJlZ2luQ29sdW1uOwotCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKHNldiwgSlNQQ29yZU1lc3NhZ2VzLkpTUEVMX1N5bnRheCk7Ci0JCQkJbWVzc2FnZS5zZXRPZmZzZXQocHJvYmxlbVN0YXJ0T2Zmc2V0KTsKLQkJCQltZXNzYWdlLnNldExlbmd0aChjdXJUb2suZW5kQ29sdW1uIC0gY3VyVG9rLmJlZ2luQ29sdW1uICsgMSk7Ci0JCQkJbWVzc2FnZS5zZXRUYXJnZXRPYmplY3QoZmlsZSk7Ci0JCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZShmTWVzc2FnZU9yaWdpbmF0b3IsIG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChUb2tlbk1nckVycm9yIHRlKSB7Ci0JCQlpbnQgc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9FTF9MRVhFUik7Ci0JCQlpZiAoc2V2ICE9IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSkgewotCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwgSlNQQ29yZU1lc3NhZ2VzLkpTUEVMX1Rva2VuKTsKLQkJCQltZXNzYWdlLnNldE9mZnNldChjb250ZW50U3RhcnQpOwotCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGNvbnRlbnRMZW5ndGgpOwotCQkJCW1lc3NhZ2Uuc2V0VGFyZ2V0T2JqZWN0KGZpbGUpOwotCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BKYXZhVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQSmF2YVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGFlYzg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BKYXZhVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSUpTUFByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSUpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlNQQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotcHVibGljIGNsYXNzIEpTUEphdmFWYWxpZGF0b3IgZXh0ZW5kcyBKU1BWYWxpZGF0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBCb29sZWFuLnZhbHVlT2YoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3B2YWxpZGF0b3IiKSkuYm9vbGVhblZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElWYWxpZGF0b3IgZk1lc3NhZ2VPcmlnaW5hdG9yOwotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZXNTZXJ2aWNlIGZQcmVmZXJlbmNlc1NlcnZpY2UgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSID0gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JcHJpdmF0ZSBJU2NvcGVDb250ZXh0W10gZlNjb3BlcyA9IG51bGw7Ci0KLQlwdWJsaWMgSlNQSmF2YVZhbGlkYXRvcigpIHsKLQkJdGhpcy5mTWVzc2FnZU9yaWdpbmF0b3IgPSB0aGlzOwotCX0KLQotCXB1YmxpYyBKU1BKYXZhVmFsaWRhdG9yKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRoaXMuZk1lc3NhZ2VPcmlnaW5hdG9yID0gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIEFzc3VtZWQgdGhlIG1lc3NhZ2Ugb2Zmc2V0IGlzIGFuIGluZGlyZWN0IHBvc2l0aW9uLiBJbiBvdGhlciB3b3JkcywgYW4KLQkgKiBlcnJvciBmcm9tIGFuIGluY2x1ZGVkIGZpbGUuCi0JICogCi0JICogQHBhcmFtIG0KLQkgKiBAcGFyYW0gdHJhbnNsYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRqdXN0SW5kaXJlY3RQb3NpdGlvbihJTWVzc2FnZSBtLCBJSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24pIHsKLQotCQlpZiAoISh0cmFuc2xhdGlvbiBpbnN0YW5jZW9mIEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uKSkKLQkJCXJldHVybjsKLQotCQlJRG9jdW1lbnQganNwRG9jID0gKChKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbikgdHJhbnNsYXRpb24pLmdldEpzcERvY3VtZW50KCk7Ci0JCWlmICghKGpzcERvYyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc0RvYyA9IChJU3RydWN0dXJlZERvY3VtZW50KSBqc3BEb2M7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSByZWdpb25zID0gc0RvYy5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKDAsIG0uZ2V0T2Zmc2V0KCkgKyBtLmdldExlbmd0aCgpKTsKLQkJLy8gaXRlcmF0ZSBiYWNrd2FyZHMgdW50aWwgeW91IGhpdCB0aGUgaW5jbHVkZSBkaXJlY3RpdmUKLQkJZm9yIChpbnQgaSA9IHJlZ2lvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gcmVnaW9uc1tpXTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCWlmIChnZXREaXJlY3RpdmVOYW1lKHJlZ2lvbikuZXF1YWxzKCJpbmNsdWRlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlJVGV4dFJlZ2lvbiBmaWxlVmFsdWVSZWdpb24gPSBnZXRBdHRyaWJ1dGVWYWx1ZVJlZ2lvbihyZWdpb24sICJmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGZpbGVWYWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQltLnNldE9mZnNldChyZWdpb24uZ2V0U3RhcnRPZmZzZXQoZmlsZVZhbHVlUmVnaW9uKSk7Ci0JCQkJCQltLnNldExlbmd0aChmaWxlVmFsdWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW0uc2V0T2Zmc2V0KHJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJCW0uc2V0TGVuZ3RoKHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJCQl9Ci0JCQkJCS8qKgotCQkJCQkgKiBCdWcgMjE5NzYxIC0gU3ludGF4IGVycm9yIHJlcG9ydGVkIGF0IHdyb25nIGxvY2F0aW9uCi0JCQkJCSAqIChkb24ndCBmb3JnZXQgdG8gYWRqdXN0IHRoZSBsaW5lIG51bWJlciwgdG9vKQotCQkJCQkgKi8KLQkJCQkJbS5zZXRMaW5lTm8oc0RvYy5nZXRMaW5lT2ZPZmZzZXQobS5nZXRPZmZzZXQoKSkgKyAxKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBJTWVzc2FnZSBmcm9tIGFzbiBJUHJvYmxlbQotCSAqIAotCSAqIEBwYXJhbSBwcm9ibGVtCi0JICogQHBhcmFtIGYKLQkgKiBAcGFyYW0gdHJhbnNsYXRpb24KLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvYwotCSAqIEByZXR1cm4gbWVzc2FnZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvYmxlbSwgb3IgbnVsbCBpZiBpdCBjb3VsZCBub3QKLQkgKiAgICAgICAgIGNyZWF0ZSBvbmUKLQkgKi8KLQlwcml2YXRlIElNZXNzYWdlIGNyZWF0ZU1lc3NhZ2VGcm9tUHJvYmxlbShJUHJvYmxlbSBwcm9ibGVtLCBJRmlsZSBmLCBJSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvYykgewotCQlpbnQgc2V2ID0gLTE7Ci0JCWludCBzb3VyY2VTdGFydCA9IC0xOwotCQlpbnQgc291cmNlRW5kID0gLTE7Ci0KLQkJaWYgKHByb2JsZW0gaW5zdGFuY2VvZiBJSlNQUHJvYmxlbSkgewotCQkJc291cmNlU3RhcnQgPSBwcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCk7Ci0JCQlzb3VyY2VFbmQgPSBwcm9ibGVtLmdldFNvdXJjZUVuZCgpOwotCQkJc3dpdGNoICgoKElKU1BQcm9ibGVtKSBwcm9ibGVtKS5nZXRFSUQoKSkgewotCQkJCWNhc2UgSUpTUFByb2JsZW0uVEVJQ2xhc3NOb3RGb3VuZCA6Ci0JCQkJCXNldiA9IGdldE1lc3NhZ2VTZXZlcml0eShKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX0NMQVNTX05PVF9GT1VORCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUpTUFByb2JsZW0uVEVJVmFsaWRhdGlvbk1lc3NhZ2UgOgotCQkJCQlzZXYgPSBnZXRNZXNzYWdlU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9WQUxJREFUSU9OX01FU1NBR0UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElKU1BQcm9ibGVtLlRFSUNsYXNzTm90SW5zdGFudGlhdGVkIDoKLQkJCQkJc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfTk9UX0lOU1RBTlRJQVRFRCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUpTUFByb2JsZW0uVEVJQ2xhc3NNaXNjIDoKLQkJCQkJc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfUlVOVElNRV9FWENFUFRJT04pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElKU1BQcm9ibGVtLlRhZ0NsYXNzTm90Rm91bmQgOgotCQkJCQlzZXYgPSBnZXRNZXNzYWdlU2V2ZXJpdHkoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RBR19IQU5ETEVSX0NMQVNTX05PVF9GT1VORCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUpTUFByb2JsZW0uVXNlQmVhbkludmFsaWRJRCA6Ci0JCQkJCXNldiA9IGdldE1lc3NhZ2VTZXZlcml0eShKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVVNFQkVBTl9JTlZBTElEX0lEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJSlNQUHJvYmxlbS5Vc2VCZWFuTWlzc2luZ1R5cGVJbmZvIDoKLQkJCQkJc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9VU0JFQU5fTUlTU0lOR19UWVBFX0lORk8pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElKU1BQcm9ibGVtLlVzZUJlYW5BbWJpZ3VvdXNUeXBlIDoKLQkJCQkJc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9VU0VCRUFOX0FNQklHVU9VU19UWVBFX0lORk8pOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJc2V2ID0gcHJvYmxlbS5pc0Vycm9yKCkgPyBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZIDogKHByb2JsZW0uaXNXYXJuaW5nKCkgPyBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFkgOiBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpOwotCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzb3VyY2VTdGFydCA9IHRyYW5zbGF0aW9uLmdldEpzcE9mZnNldChwcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCkpOwotCQkJc291cmNlRW5kID0gdHJhbnNsYXRpb24uZ2V0SnNwT2Zmc2V0KHByb2JsZW0uZ2V0U291cmNlRW5kKCkpOwotCQkJc3dpdGNoIChwcm9ibGVtLmdldElEKCkpIHsKLQkJCQljYXNlIElQcm9ibGVtLkxvY2FsVmFyaWFibGVJc05ldmVyVXNlZCA6IHsKLQkJCQkJc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9KQVZBX0xPQ0FMX1ZBUklBQkxFX05FVkVSX1VTRUQpOwotCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUHJvYmxlbS5OdWxsTG9jYWxWYXJpYWJsZVJlZmVyZW5jZSA6IHsKLQkJCQkJc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9KQVZBX05VTExfTE9DQUxfVkFSSUFCTEVfUkVGRVJFTkNFKTsKLQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVByb2JsZW0uQXJndW1lbnRJc05ldmVyVXNlZCA6IHsKLQkJCQkJc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9KQVZBX0FSR1VNRU5UX0lTX05FVkVSX1VTRUQpOwotCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUHJvYmxlbS5Qb3RlbnRpYWxOdWxsTG9jYWxWYXJpYWJsZVJlZmVyZW5jZSA6IHsKLQkJCQkJc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9KQVZBX1BPVEVOVElBTF9OVUxMX0xPQ0FMX1ZBUklBQkxFX1JFRkVSRU5DRSk7Ci0JCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIElQcm9ibGVtLlVudXNlZEltcG9ydCA6IHsKLQkJCQkJc2V2ID0gZ2V0TWVzc2FnZVNldmVyaXR5KEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9KQVZBX1VOVVNFRF9JTVBPUlQpOwotCQkJCX0KLQkJCQkJYnJlYWs7Ci0KLQkJCQlkZWZhdWx0IDogewotCQkJCQlpZiAocHJvYmxlbS5pc0Vycm9yKCkpIHsKLQkJCQkJCXNldiA9IElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlzZXYgPSBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCWlmIChzZXYgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCS8qIHByb2JsZW1zIHdpdGhvdXQgSlNQIHBvc2l0aW9ucyBhcmUgaW4gZ2VuZXJhdGVkIGNvZGUgKi8KLQkJCQkJaWYgKHNvdXJjZVN0YXJ0ID09IC0xKSB7Ci0JCQkJCQlpbnQgcHJvYmxlbUlEID0gcHJvYmxlbS5nZXRJRCgpOwotCQkJCQkJLyoKLQkJCQkJCSAqIFF1b3RpbmcgSVByb2JsZW0gZG9jOiAiV2hlbiBhIHByb2JsZW0gaXMgdGFnZ2VkIGFzCi0JCQkJCQkgKiBJbnRlcm5hbCwgaXQgbWVhbnMgdGhhdCBubyBjaGFuZ2Ugb3RoZXIgdGhhbiBhCi0JCQkJCQkgKiBsb2NhbCBzb3VyY2UgY29kZSBjaGFuZ2UgY2FuIGZpeCB0aGUgY29ycmVzcG9uZGluZwotCQkJCQkJICogcHJvYmxlbS4iIEFzc3VtaW5nIHRoYXQgb3VyIGdlbmVyYXRlZCBjb2RlIGlzCi0JCQkJCQkgKiBjb3JyZWN0LCB0aGF0IHNob3VsZCByZWR1Y2UgdGhlIHJlcG9ydGVkIHByb2JsZW1zCi0JCQkJCQkgKiB0byB0aG9zZSB0aGUgdXNlciBjYW4gY29ycmVjdC4KLQkJCQkJCSAqLwotCQkJCQkJaWYgKCgocHJvYmxlbUlEICYgSVByb2JsZW0uSW50ZXJuYWwpICE9IDApICYmICgocHJvYmxlbUlEICYgSVByb2JsZW0uU3ludGF4KSAhPSAwKSAmJiB0cmFuc2xhdGlvbiBpbnN0YW5jZW9mIEpTUFRyYW5zbGF0aW9uKSB7Ci0JCQkJCQkJLy8gQXR0YWNoIHRvIHRoZSBsYXN0IGNvZGUgc2NyaXB0aW5nIHNlY3Rpb24KLQkJCQkJCQlKU1BUcmFuc2xhdGlvbiBqc3BUcmFuc2xhdGlvbiA9ICgoSlNQVHJhbnNsYXRpb24pIHRyYW5zbGF0aW9uKTsKLQkJCQkJCQlQb3NpdGlvbltdIGpzcFBvc2l0aW9ucyA9IChQb3NpdGlvbltdKSBqc3BUcmFuc2xhdGlvbi5nZXRKc3AySmF2YU1hcCgpLmtleVNldCgpLnRvQXJyYXkobmV3IFBvc2l0aW9uW2pzcFRyYW5zbGF0aW9uLmdldEpzcDJKYXZhTWFwKCkuc2l6ZSgpXSk7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqc3BQb3NpdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJc291cmNlU3RhcnQgPSBNYXRoLm1heChzb3VyY2VTdGFydCwganNwUG9zaXRpb25zW2ldLmdldE9mZnNldCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJSU1lc3NhZ2UgbSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKHNldiwgcHJvYmxlbS5nZXRNZXNzYWdlKCksIGYpOwotCQkJCQkJCW0uc2V0T2Zmc2V0KHNvdXJjZVN0YXJ0KTsKLQkJCQkJCQltLnNldExlbmd0aCgxKTsKLQkJCQkJCQlyZXR1cm4gbTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHNldiA9PSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gbGluZSBudW1iZXIgZm9yIG1hcmtlciBzdGFydHMgQCAxCi0JCS8vIGxpbmUgbnVtYmVyIGZyb20gZG9jdW1lbnQgc3RhcnRzIEAgMAotCQlpbnQgbGluZU5vID0gc3RydWN0dXJlZERvYy5nZXRMaW5lT2ZPZmZzZXQoc291cmNlU3RhcnQpICsgMTsKLQotCQlJTWVzc2FnZSBtID0gbmV3IExvY2FsaXplZE1lc3NhZ2Uoc2V2LCBwcm9ibGVtLmdldE1lc3NhZ2UoKSwgZik7Ci0KLQkJbS5zZXRMaW5lTm8obGluZU5vKTsKLQkJbS5zZXRPZmZzZXQoc291cmNlU3RhcnQpOwotCQltLnNldExlbmd0aChzb3VyY2VFbmQgLSBzb3VyY2VTdGFydCArIDEpOwotCi0JCS8vIG5lZWQgYWRkaXRpb25hbCBhZGp1c3RtZW50IGZvciBwcm9ibGVtcyBmcm9tCi0JCS8vIGluZGlyZWN0IChpbmNsdWRlZCkgZmlsZXMKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExOTYzMwotCQlpZiAodHJhbnNsYXRpb24uaXNJbmRpcmVjdChwcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCkpKSB7Ci0JCQlhZGp1c3RJbmRpcmVjdFBvc2l0aW9uKG0sIHRyYW5zbGF0aW9uKTsKLQkJfQotCi0JCXJldHVybiBtOwotCX0KLQotCWludCBnZXRNZXNzYWdlU2V2ZXJpdHkoU3RyaW5nIGtleSkgewotCQlpbnQgc2V2ID0gZlByZWZlcmVuY2VzU2VydmljZS5nZXRJbnQoUFJFRkVSRU5DRV9OT0RFX1FVQUxJRklFUiwga2V5LCBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIGZTY29wZXMpOwotCQlzd2l0Y2ggKHNldikgewotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUiA6Ci0JCQkJcmV0dXJuIElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcgOgotCQkJCXJldHVybiBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLklORk9STUFUSU9OIDoKLQkJCQlyZXR1cm4gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOwotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUgOgotCQkJCXJldHVybiBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkU7Ci0JCX0KLQkJcmV0dXJuIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZFByZWZlcmVuY2VzKElGaWxlIGZpbGUpIHsKLQkJZlNjb3BlcyA9IG5ldyBJU2NvcGVDb250ZXh0W117bmV3IEluc3RhbmNlU2NvcGUoKSwgbmV3IERlZmF1bHRTY29wZSgpfTsKLQotCQlmUHJlZmVyZW5jZXNTZXJ2aWNlID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCk7Ci0JCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc0FjY2Vzc2libGUoKSkgewotCQkJUHJvamVjdFNjb3BlIHByb2plY3RTY29wZSA9IG5ldyBQcm9qZWN0U2NvcGUoZmlsZS5nZXRQcm9qZWN0KCkpOwotCQkJaWYgKHByb2plY3RTY29wZS5nZXROb2RlKFBSRUZFUkVOQ0VfTk9ERV9RVUFMSUZJRVIpLmdldEJvb2xlYW4oSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1VTRV9QUk9KRUNUX1NFVFRJTkdTLCBmYWxzZSkpIHsKLQkJCQlmU2NvcGVzID0gbmV3IElTY29wZUNvbnRleHRbXXtwcm9qZWN0U2NvcGUsIG5ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHBlcmZvcm1WYWxpZGF0aW9uKElGaWxlIGYsIElSZXBvcnRlciByZXBvcnRlciwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIG1vZGVsOwotCQkJTW9kZWxIYW5kbGVyRm9ySlNQLmVuc3VyZVRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkoZG9tTW9kZWwpOwotCi0JCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCUpTUFRyYW5zbGF0aW9uQWRhcHRlciB0cmFuc2xhdGlvbkFkYXB0ZXIgPSAoSlNQVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSlNQVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJSUpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb25BZGFwdGVyLmdldEpTUFRyYW5zbGF0aW9uKCk7Ci0KLQkJCWlmICghcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJCWxvYWRQcmVmZXJlbmNlcyhmKTsKLQotCQkJCXRyYW5zbGF0aW9uLnNldFByb2JsZW1Db2xsZWN0aW5nQWN0aXZlKHRydWUpOwotCQkJCXRyYW5zbGF0aW9uLnJlY29uY2lsZUNvbXBpbGF0aW9uVW5pdCgpOwotCQkJCUxpc3QgcHJvYmxlbXMgPSB0cmFuc2xhdGlvbi5nZXRQcm9ibGVtcygpOwotCQkJCS8vIGFkZCBuZXcgbWVzc2FnZXMKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2JsZW1zLnNpemUoKSAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKTsgaSsrKSB7Ci0JCQkJCUlNZXNzYWdlIG0gPSBjcmVhdGVNZXNzYWdlRnJvbVByb2JsZW0oKElQcm9ibGVtKSBwcm9ibGVtcy5nZXQoaSksIGYsIHRyYW5zbGF0aW9uLCBkb21Nb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQkJCWlmIChtICE9IG51bGwpCi0JCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKGZNZXNzYWdlT3JpZ2luYXRvciwgbSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXVubG9hZFByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVubG9hZFByZWZlcmVuY2VzKCkgewotCQlmUHJlZmVyZW5jZXNTZXJ2aWNlID0gbnVsbDsKLQkJZlNjb3BlcyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgb25lIGZpbGUuIEl0J3MgYXNzdW1lZCB0aGF0IHRoZSBmaWxlIGhhcyBKU1AgY29udGVudCB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBmCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVGaWxlKElGaWxlIGYsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoREVCVUcpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB2YWxpZGF0aW5nOiAiICsgZik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJLy8gZ2V0IGpzcCBtb2RlbCwgZ2V0IHRyYW5sc2F0aW9uCi0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGYpOwotCQkJaWYgKCFyZXBvcnRlci5pc0NhbmNlbGxlZCgpICYmIG1vZGVsICE9IG51bGwpIHsKLQkJCQkvLyBnZXQganNwIG1vZGVsLCBnZXQgdHJhbnNsYXRpb24KLQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQkJcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXMoZk1lc3NhZ2VPcmlnaW5hdG9yLCBmKTsKLQkJCQkJcGVyZm9ybVZhbGlkYXRpb24oZiwgcmVwb3J0ZXIsIG1vZGVsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWNiZjQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkpTUEZDb250ZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVdvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotLyoqCi0gKiBQZXJmb3JtcyBzb21lIGNvbW1vbiBKU1AgdmFsaWRhdGlvbiB0YXNrcwotICovCi1wdWJsaWMgY2xhc3MgSlNQVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9ySm9iIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSURfSlNQX0NPUkUgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGZKU1BGQ29udGVudFR5cGUgPSBudWxsOwotCi0JcHJvdGVjdGVkIGNsYXNzIExvY2FsaXplZE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHsKLQotCQlwcml2YXRlIFN0cmluZyBfbWVzc2FnZSA9IG51bGw7Ci0KLQkJcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQpIHsKLQkJCXRoaXMoc2V2ZXJpdHksIG1lc3NhZ2VUZXh0LCBudWxsKTsKLQkJfQotCi0JCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0LCBJUmVzb3VyY2UgdGFyZ2V0T2JqZWN0KSB7Ci0JCQl0aGlzKHNldmVyaXR5LCBtZXNzYWdlVGV4dCwgKE9iamVjdCkgdGFyZ2V0T2JqZWN0KTsKLQkJfQotCi0JCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0LCBPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCQlzdXBlcihudWxsLCBzZXZlcml0eSwgbnVsbCk7Ci0JCQlzZXRMb2NhbGl6ZWRNZXNzYWdlKG1lc3NhZ2VUZXh0KTsKLQkJCXNldFRhcmdldE9iamVjdCh0YXJnZXRPYmplY3QpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0TG9jYWxpemVkTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQkJX21lc3NhZ2UgPSBtZXNzYWdlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKCkgewotCQkJcmV0dXJuIF9tZXNzYWdlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChDbGFzc0xvYWRlciBjbCkgewotCQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCkgewotCQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCwgQ2xhc3NMb2FkZXIgY2wpIHsKLQkJCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgSlNQRmlsZVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VQcm94eVZpc2l0b3IgewotCi0JCXByaXZhdGUgTGlzdCBmRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXByaXZhdGUgSUNvbnRlbnRUeXBlW10gZkNvbnRlbnRUeXBlcyA9IG51bGw7Ci0JCXByaXZhdGUgSVJlcG9ydGVyIGZSZXBvcnRlciA9IG51bGw7Ci0KLQkJcHVibGljIEpTUEZpbGVWaXNpdG9yKElSZXBvcnRlciByZXBvcnRlcikgewotCQkJZlJlcG9ydGVyID0gcmVwb3J0ZXI7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCQkvLyBjaGVjayB2YWxpZGF0aW9uCi0JCQlpZiAoZlJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlpZiAocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0KLQkJCQlpZiAoaXNKU1BUeXBlKHByb3h5LmdldE5hbWUoKSkpIHsKLQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcHJveHkucmVxdWVzdFJlc291cmNlKCk7Ci0JCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0KLQkJCQkJCWlmIChERUJVRykKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigrKSBKU1BWYWxpZGF0b3IgYWRkaW5nIGZpbGU6ICIgKyBmaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWZGaWxlcy5hZGQoZmlsZSk7Ci0KLQkJCQkJCS8vIGRvbid0IHNlYXJjaCBkZWVwZXIgZm9yIGZpbGVzCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBmaW5hbCBJRmlsZVtdIGdldEZpbGVzKCkgewotCQkJcmV0dXJuIChJRmlsZVtdKSBmRmlsZXMudG9BcnJheShuZXcgSUZpbGVbZkZpbGVzLnNpemUoKV0pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldHMgbGlzdCBvZiBjb250ZW50IHR5cGVzIHRoaXMgdmlzaXRvciBpcyBpbnRlcmVzdGVkIGluCi0JCSAqIAotCQkgKiBAcmV0dXJuIEFsbCBKU1AtcmVsYXRlZCBjb250ZW50IHR5cGVzCi0JCSAqLwotCQlwcml2YXRlIElDb250ZW50VHlwZVtdIGdldFZhbGlkQ29udGVudFR5cGVzKCkgewotCQkJaWYgKGZDb250ZW50VHlwZXMgPT0gbnVsbCkgewotCQkJCS8vIGN1cnJlbnRseSAiaGFyZC1jb2RlZCIgdG8gYmUganNwICYganNwZgotCQkJCWZDb250ZW50VHlwZXMgPSBuZXcgSUNvbnRlbnRUeXBlW117UGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCksIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BGUkFHTUVOVCl9OwotCQkJfQotCQkJcmV0dXJuIGZDb250ZW50VHlwZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQ2hlY2tzIGlmIGZpbGVOYW1lIGlzIHNvbWUgdHlwZSBvZiBKU1AgKGluY2x1ZGluZyBKU1AgZnJhZ21lbnRzKQotCQkgKiAKLQkJICogQHBhcmFtIGZpbGVOYW1lCi0JCSAqIEByZXR1cm4gdHJ1ZSBpZiBmaWxlbmFtZSBpbmRpY2F0ZXMgc29tZSB0eXBlIG9mIEpTUCwgZmFsc2UKLQkJICogICAgICAgICBvdGhlcndpc2UKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBpc0pTUFR5cGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0KLQkJCUlDb250ZW50VHlwZVtdIHR5cGVzID0gZ2V0VmFsaWRDb250ZW50VHlwZXMoKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdHlwZXMubGVuZ3RoICYmICF2YWxpZCkgewotCQkJCXZhbGlkID0gdHlwZXNbaV0uaXNBc3NvY2lhdGVkV2l0aChmaWxlTmFtZSk7Ci0JCQkJKytpOwotCQkJfQotCQkJcmV0dXJuIHZhbGlkOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmdbXSB1cmlzID0gaGVscGVyLmdldFVSSXMoKTsKLQkJSVdvcmtzcGFjZVJvb3Qgd3NSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJaWYgKHVyaXMubGVuZ3RoID4gMCkgewotCQkJSUZpbGUgY3VycmVudEZpbGUgPSBudWxsOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHVyaXMubGVuZ3RoICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpOyBpKyspIHsKLQkJCQkvLyBtaWdodCBiZSBjYWxsZWQgd2l0aCBqdXN0IHByb2plY3QgcGF0aD8KLQkJCQljdXJyZW50RmlsZSA9IHdzUm9vdC5nZXRGaWxlKG5ldyBQYXRoKHVyaXNbaV0pKTsKLQkJCQlpZiAoY3VycmVudEZpbGUgIT0gbnVsbCAmJiBjdXJyZW50RmlsZS5leGlzdHMoKSkgewotCQkJCQlpZiAoc2hvdWxkVmFsaWRhdGUoY3VycmVudEZpbGUpICYmIGZyYWdtZW50Q2hlY2soY3VycmVudEZpbGUpKSB7Ci0KLQkJCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkxPV19TRVZFUklUWSwgdXJpc1tpXSk7Ci0JCQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayh0aGlzLCBtZXNzYWdlKTsKLQotCQkJCQkJdmFsaWRhdGVGaWxlKGN1cnJlbnRGaWxlLCByZXBvcnRlcik7Ci0JCQkJCX0KLQkJCQkJaWYgKERFQlVHKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ2YWxpZGF0aW5nOiBbIiArIHVyaXNbaV0gKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0KLQkJCS8vIGlmIHVyaXNbXSBsZW5ndGggMCAtPiB2YWxpZGF0ZSgpIGdldHMgY2FsbGVkIGZvciBlYWNoIHByb2plY3QKLQkJCWlmIChoZWxwZXIgaW5zdGFuY2VvZiBJV29ya2JlbmNoQ29udGV4dCkgewotCi0JCQkJSVByb2plY3QgcHJvamVjdCA9ICgoSVdvcmtiZW5jaENvbnRleHQpIGhlbHBlcikuZ2V0UHJvamVjdCgpOwotCQkJCUpTUEZpbGVWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSlNQRmlsZVZpc2l0b3IocmVwb3J0ZXIpOwotCQkJCXRyeSB7Ci0JCQkJCS8vIGNvbGxlY3QgYWxsIGpzcCBmaWxlcyBmb3IgdGhlIHByb2plY3QKLQkJCQkJcHJvamVjdC5hY2NlcHQodmlzaXRvciwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoREVCVUcpCi0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCQlJRmlsZVtdIGZpbGVzID0gdmlzaXRvci5nZXRGaWxlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpOyBpKyspIHsKLQkJCQkJaWYgKHNob3VsZFZhbGlkYXRlKGZpbGVzW2ldKSAmJiBmcmFnbWVudENoZWNrKGZpbGVzW2ldKSkgewotCQkJCQkJaW50IHBlcmNlbnQgPSAoaSAqIDEwMCkgLyBmaWxlcy5sZW5ndGggKyAxOwotCQkJCQkJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCBwZXJjZW50ICsgIiUgIiArIGZpbGVzW2ldLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayh0aGlzLCBtZXNzYWdlKTsKLQotCQkJCQkJdmFsaWRhdGVGaWxlKGZpbGVzW2ldLCByZXBvcnRlcik7Ci0JCQkJCX0KLQkJCQkJaWYgKERFQlVHKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ2YWxpZGF0aW5nOiBbIiArIGZpbGVzW2ldICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgb25lIGZpbGUuIEl0J3MgYXNzdW1lZCB0aGF0IHRoZSBmaWxlIGhhcyBKU1AgY29udGVudCB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBmCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVGaWxlKElGaWxlIGYsIElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBzdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgKGZvciBiYXRjaCB2YWxpZGF0aW9uKQotCX0KLQotCXB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJVmFsaWRhdGlvblJlc3VsdCByZXN1bHQgPSBuZXcgVmFsaWRhdGlvblJlc3VsdCgpOwotCQlmaW5hbCBJUmVwb3J0ZXIgcmVwb3J0ZXIgPSByZXN1bHQuZ2V0UmVwb3J0ZXIobW9uaXRvcik7Ci0JCXZhbGlkYXRlRmlsZSgoSUZpbGUpIHJlc291cmNlLCByZXBvcnRlcik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHNkcgotCSAqIEByZXR1cm4gdGhlIGpzcCBkaXJlY3RpdmUgbmFtZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlyZWN0aXZlTmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkcikgewotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUlUZXh0UmVnaW9uTGlzdCBzdWJSZWdpb25zID0gc2RyLmdldFJlZ2lvbnMoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBzdWJSZWdpb25zLnNpemUoKTsgaisrKSB7Ci0JCQlJVGV4dFJlZ2lvbiBzdWJSZWdpb24gPSBzdWJSZWdpb25zLmdldChqKTsKLQkJCWlmIChzdWJSZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCW5hbWUgPSBzZHIuZ2V0VGV4dChzdWJSZWdpb24pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBzZHIKLQkgKiBAcGFyYW0gYXR0ck5hbWUKLQkgKiBAcmV0dXJuIHRoZSBJVGV4dFJlZ2lvbiBmb3IgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gYXR0cmlidXRlCi0JICogICAgICAgICBuYW1lLCBjYXNlIHNlbnNpdGl2ZSwgbnVsbCBpZiBubyBtYXRjaGluZyBhdHRyaWJ1dGUgaXMgZm91bmQKLQkgKi8KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0QXR0cmlidXRlVmFsdWVSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZHIsIFN0cmluZyBhdHRyTmFtZSkgewotCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCBzdWJSZWdpb25zID0gc2RyLmdldFJlZ2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJSZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiBzdWJSZWdpb24gPSBzdWJSZWdpb25zLmdldChpKTsKLQkJCWlmIChzdWJSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSAmJiBzZHIuZ2V0VGV4dChzdWJSZWdpb24pLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQlmb3IgKGludCBqID0gaTsgaiA8IHN1YlJlZ2lvbnMuc2l6ZSgpOyBqKyspIHsKLQkJCQkJc3ViUmVnaW9uID0gc3ViUmVnaW9ucy5nZXQoaik7Ci0JCQkJCWlmIChzdWJSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCXZhbHVlUmVnaW9uID0gc3ViUmVnaW9uOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbHVlUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZHIsIFN0cmluZyBhdHRyTmFtZSkgewotCQlJVGV4dFJlZ2lvbiByID0gZ2V0QXR0cmlidXRlVmFsdWVSZWdpb24oc2RyLCBhdHRyTmFtZSk7Ci0JCWlmIChyICE9IG51bGwpCi0JCQlyZXR1cm4gc2RyLmdldFRleHQocikudHJpbSgpOwotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGZpbGUgaXMganNwIGZyYWdtZW50IG9yIG5vdCAoZG9lcyBhIGRlZXAsIGluZGVwdGggY2hlY2ssCi0JICogbG9va2luZyBpbnRvIGNvbnRlbnRzIG9mIGZpbGUpCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIGFzc3VtZXMgZmlsZSBpcyBub3QgbnVsbCBhbmQgZXhpc3RzCi0JICogQHJldHVybiB0cnVlIGlmIGZpbGUgaXMganNwIGZyYWdtZW50LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNGcmFnbWVudChJRmlsZSBmaWxlKSB7Ci0JCWJvb2xlYW4gaXNGcmFnbWVudCA9IGZhbHNlOwotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkvLyBpdCBjYW4gYmUgbnVsbAotCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkJaXMgPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQkJY29udGVudERlc2NyaXB0aW9uID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0RGVzY3JpcHRpb25Gb3IoaXMsIGZpbGUuZ2V0TmFtZSgpLCBuZXcgUXVhbGlmaWVkTmFtZVtde0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVH0pOwotCQkJfQotCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGZpbGVDdElkID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCkuZ2V0SWQoKTsKLQkJCQlpc0ZyYWdtZW50ID0gKGZpbGVDdElkICE9IG51bGwgJiYgQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUEZSQUdNRU5ULmVxdWFscyhmaWxlQ3RJZCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUsIGFzc3VtZSBpdCdzIGludmFsaWQgSlNQCi0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlLCBhc3N1bWUgaXQncyBpbnZhbGlkIEpTUAotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gbXVzdCBjbG9zZSBpbnB1dCBzdHJlYW0gaW4gY2FzZSBvdGhlcnMgbmVlZCBpdAotCQkJaWYgKGlzICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJaXMuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIG5vdCBzdXJlIGhvdyB0byByZWNvdmVyIGF0IHRoaXMgcG9pbnQKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIGlzRnJhZ21lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFZhbGlkYXRlKElGaWxlIGZpbGUpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZmlsZTsKLQkJZG8gewotCQkJaWYgKHJlc291cmNlLmlzRGVyaXZlZCgpIHx8IHJlc291cmNlLmlzVGVhbVByaXZhdGVNZW1iZXIoKSB8fCAhcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkgfHwgcmVzb3VyY2UuZ2V0TmFtZSgpLmNoYXJBdCgwKSA9PSAnLicpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXNvdXJjZSA9IHJlc291cmNlLmdldFBhcmVudCgpOwotCQl9Ci0JCXdoaWxlICgocmVzb3VyY2UuZ2V0VHlwZSgpICYgSVJlc291cmNlLlBST0pFQ1QpID09IDApOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3B2YWxpZGF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGZpbGUgaXMgYSBqc3AgZnJhZ21lbnQgb3Igbm90LiBJZiBzbywgY2hlY2sgaWYgdGhlIGZyYWdtZW50Ci0JICogc2hvdWxkIGJlIHZhbGlkYXRlZCBvciBub3QuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIEFzc3VtZXMgc2hvdWxkVmFsaWRhdGUgd2FzIGFscmVhZHkgY2FsbGVkIG9uIGZpbGUgc28gaXQKLQkgKiAgICAgICAgICAgIHNob3VsZCBub3QgYmUgbnVsbCBhbmQgZG9lcyBleGlzdAotCSAqIEByZXR1cm4gZmFsc2UgaWYgZmlsZSBpcyBhIGZyYWdtZW50IGFuZCBpdCBzaG91bGQgbm90IGJlIHZhbGlkYXRlZCwKLQkgKiAgICAgICAgIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZyYWdtZW50Q2hlY2soSUZpbGUgZmlsZSkgewotCQlib29sZWFuIHNob3VsZFZhbGlkYXRlID0gdHJ1ZTsKLQkJLy8gcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgcG9zc2libHkgYSBqc3AgZnJhZ21lbnQKLQkJaWYgKGdldEpTUEZDb250ZW50VHlwZSgpLmlzQXNzb2NpYXRlZFdpdGgoZmlsZS5nZXROYW1lKCkpKSB7Ci0JCQkvLyBnZXQgcHJlZmVyZW5jZSBmb3IgdmFsaWRhdGUganNwIGZyYWdtZW50cwotCQkJYm9vbGVhbiBzaG91bGRWYWxpZGF0ZUZyYWdtZW50cyA9IEJvb2xlYW4udmFsdWVPZihKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLlZBTElEQVRFX0ZSQUdNRU5UUywgZmlsZSwgdHJ1ZSkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJLyoKLQkJCSAqIGlmIGpzcCBmcmFnbWVudHMgc2hvdWxkIG5vdCBiZSB2YWxpZGF0ZWQsIGNoZWNrIGlmIGZpbGUgaXMKLQkJCSAqIHJlYWxseSBqc3AgZnJhZ21lbnQKLQkJCSAqLwotCQkJaWYgKCFzaG91bGRWYWxpZGF0ZUZyYWdtZW50cykgewotCQkJCWJvb2xlYW4gaXNGcmFnbWVudCA9IGlzRnJhZ21lbnQoZmlsZSk7Ci0JCQkJc2hvdWxkVmFsaWRhdGUgPSAhaXNGcmFnbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2hvdWxkVmFsaWRhdGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBKU1AgZnJhZ21lbnQgY29udGVudCB0eXBlCi0JICogCi0JICogQHJldHVybiBqc3BmIGNvbnRlbnQgdHlwZQotCSAqLwotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGdldEpTUEZDb250ZW50VHlwZSgpIHsKLQkJaWYgKGZKU1BGQ29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJZkpTUEZDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BGUkFHTUVOVCk7Ci0JCX0KLQkJcmV0dXJuIGZKU1BGQ29udGVudFR5cGU7Ci0JfQotCi0JcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlSW5Kb2IoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJdHJ5IHsKLQkJCXZhbGlkYXRlKGhlbHBlciwgcmVwb3J0ZXIpOwotCQl9Ci0JCWNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRF9KU1BfQ09SRSwgSVN0YXR1cy5FUlJPUiwgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGUpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9Mb2NhbGl6ZWRNZXNzYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vTG9jYWxpemVkTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmQyZjMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9Mb2NhbGl6ZWRNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci0KLS8qKgotICogU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIE1lc3NhZ2UgYWxsIHZhbGlkYXRvcnMgaW4gcGFja2FnZSBjYW4gdXNlLgotICovCi1jbGFzcyBMb2NhbGl6ZWRNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgX21lc3NhZ2UgPSBudWxsOwotCi0JcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQpIHsKLQkJdGhpcyhzZXZlcml0eSwgbWVzc2FnZVRleHQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0LCBJUmVzb3VyY2UgdGFyZ2V0T2JqZWN0KSB7Ci0JCXRoaXMoc2V2ZXJpdHksIG1lc3NhZ2VUZXh0LCAoT2JqZWN0KSB0YXJnZXRPYmplY3QpOwotCX0KLQotCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0LCBPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCXN1cGVyKG51bGwsIHNldmVyaXR5LCBudWxsKTsKLQkJc2V0TG9jYWxpemVkTWVzc2FnZShtZXNzYWdlVGV4dCk7Ci0JCXNldFRhcmdldE9iamVjdCh0YXJnZXRPYmplY3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2FsaXplZE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX21lc3NhZ2UgPSBtZXNzYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxpemVkTWVzc2FnZSgpIHsKLQkJcmV0dXJuIF9tZXNzYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoQ2xhc3NMb2FkZXIgY2wpIHsKLQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoTG9jYWxlIGwpIHsKLQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoTG9jYWxlIGwsIENsYXNzTG9hZGVyIGNsKSB7Ci0JCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9qc3BlbC9FTFByb2JsZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvanNwZWwvRUxQcm9ibGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTQ4YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9qc3BlbC9FTFByb2JsZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3BlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFTFByb2JsZW0gewotCXByaXZhdGUgUG9zaXRpb24gZlBvczsKLQlwcml2YXRlIFN0cmluZyBmTWVzc2FnZTsKLQkKLQlwdWJsaWMgRUxQcm9ibGVtKFBvc2l0aW9uIHBvcywgU3RyaW5nIG1lc3NhZ2UpCXsKLQkJZlBvcyA9IHBvczsKLQkJZk1lc3NhZ2UgPSBtZXNzYWdlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBmTWVzc2FnZTsKLQl9Ci0JCi0KLQlwdWJsaWMgUG9zaXRpb24gZ2V0UG9zaXRpb24oKSB7Ci0JCXJldHVybiBmUG9zOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvanNwZWwvSUpTUEVMVHJhbnNsYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9qc3BlbC9JSlNQRUxUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZTg0NjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9qc3BlbC9JSlNQRUxUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotcHVibGljIGludGVyZmFjZSBJSlNQRUxUcmFuc2xhdG9yIHsKLQotCS8qKgotCSAqIFRvIG92ZXJyaWRlIHRoZSBFTCB0cmFuc2xhdGlvbiwgcGxlYXNlIHNlZSB0aGUgZXh0ZW5zaW9uIHBvaW50IAotCSAqIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5lbHRyYW5zbGF0b3IuCi0JICogCi0JICogQHBhcmFtIGVsVGV4dCAgVGhlIHRleHQgdG8gYmUgdHJhbnNsYXRlZC4KLQkgKiBAcGFyYW0gZGVsaW0JVGhlIHN0YXJ0aW5nIGRlbGltaXRlcgotCSAqIEBwYXJhbSBjdXJyZW50Tm9kZSBUaGUgY3VycmVudCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIGNvbnRlbnRTdGFydCBUaGUgc3RhcnRpbmcgb2Zmc2V0IG9mIHRoZSBFTCB0byBiZSB0cmFuc2xhdGVkCi0JICogQHBhcmFtIGNvbnRlbnRMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgRUwgY29udGVudCB0byBiZSB0cmFuc2xhdGVkCi0JICogQHBhcmFtIGZVc2VyRUxFeHByZXNzaW9ucyBBIHN0cmluZyBidWZmZXIgdG8gd2hpY2ggZ2VuZXJhdGVkIGNvZGUgY2FuIGJlIGFwcGVuZGVkLgotCSAqCQlUaGUgdGV4dCBhcHBlbmRlZCBoZXJlIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgZ2VuZXJhdGVkIGNsYXNzIGF0IHRoZSB0b3AgbGV2ZWwgCi0JICoJCW5vdCBhdCB0aGUgcG9pbnQgaW4gdGhlIEpTUCB0cmFuc2xhdGlvbiB3aGVyZSB0aGUgRUwgd2FzIGZvdW5kLiAKLQkgKiAKLQkgKiBAcGFyYW0gZlVzZXJFTFJhbmdlcyAgTWFwIG9mIGxvY2F0aW9uIHJhbmdlcyBmcm9tIEpTUCBFTCBvZmZzZXRzIHRvIGdlbmVyYXRlZCBKYXZhIGNvZGUuCi0JICogQHBhcmFtIGRvY3VtZW50IFRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50LgotCSAqIEByZXR1cm4gQSBsaXN0IG9mIEVMUHJvYmxlbXMgdGhhdCBkZXNjcmliZXMgYW55IHN5bnRhY3RpYyBpc3N1ZXMgZm91bmQuCi0JICovCi0JcHVibGljIExpc3QgdHJhbnNsYXRlRUwoU3RyaW5nIGVsVGV4dCwKLQkJCVN0cmluZyBkZWxpbSwKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUsIAotCQkJaW50IGNvbnRlbnRTdGFydCwKLQkJCWludCBjb250ZW50TGVuZ3RoLAotCQkJU3RyaW5nQnVmZmVyIHVzZXJFTEV4cHJlc3Npb25zLAotCQkJSGFzaE1hcCB1c2VyRUxSYW5nZXMsCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lKYXJSZWNvcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lKYXJSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQxNjQ3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JSmFyUmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotLyoqCi0gKiBBIHJlY29yZCB0byBhIC5qYXIgZmlsZSBkaXJlY3RseSByZWZlcmVuY2FibGUgYXMgYSB0YWcgbGlicmFyeS4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUphclJlY29yZCBleHRlbmRzIElUYWdsaWJSZWNvcmQgewotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIC5qYXIgaW4gdGhlIGZpbGUtc3lzdGVtLgotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRMb2NhdGlvbigpOwotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSByZWNvbW1lbmRlZC9kZWZhdWx0IHByZWZpeCBpZiBvbmUgd2FzIGdpdmVuLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSB0aGUgZGVzY3JpcHRvcidzIFVSSSB2YWx1ZQotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdXJpLgotCSAqLwotCVN0cmluZyBnZXRVUkkoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUTERSZWNvcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUTERSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk1ZDNiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVExEUmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotLyoqCi0gKiBBIHJlY29yZCByZXByZXNlbnRpbmcgYSBzdGFuZGFsb25lIC50bGQgZmlsZS4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVExEUmVjb3JkIGV4dGVuZHMgSVRhZ2xpYlJlY29yZCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhdGggd2l0aGluIHRoZSB3b3Jrc3BhY2UuCi0JICovCi0JSVBhdGggZ2V0UGF0aCgpOwotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSByZWNvbW1lbmRlZC9kZWZhdWx0IHByZWZpeCBpZiBvbmUgd2FzIGdpdmVuLgotCSAqLwotCVN0cmluZyBnZXRTaG9ydE5hbWUoKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gdXNlIHRoZSBkZXNjcmlwdG9yJ3MgVVJJIHZhbHVlCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB1cmkuCi0JICovCi0JU3RyaW5nIGdldFVSSSgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnRGlyUmVjb3JkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnRGlyUmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMjA4NjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ0RpclJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLS8qKgotICogQSByZWNvcmQgcmVwcmVzZW50aW5nIGEgZm9sZGVyIG9mIC50YWcvLnRhZ3ggZmlsZXMKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVGFnRGlyUmVjb3JkIGV4dGVuZHMgSVRhZ2xpYlJlY29yZCB7Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXRoIHdpdGhpbiB0aGUgd29ya3NwYWNlIHRvIHRoaXMgZGlyZWN0b3J5LgotCSAqLwotCUlQYXRoIGdldFBhdGgoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdsaWJEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnbGliRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmJhNDc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdsaWJEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWI7Ci0KLS8qKgotICogQSByZXByZXNlbnRhdGlvbiBvZiBpbmZvcm1hdGlvbiB3aXRoaW4gYSB0YWcgbGlicmFyeSBkZXNjcmlwdG9yLiBQcm92aWRlcwotICogbXVjaCBvZiB0aGUgaGlnaC1sZXZlbCBpbmZvcm1hdGlvbiBleHByZXNzZWQgYnkgdGhlIGRlc2NyaXB0b3IuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRhZ2xpYkRlc2NyaXB0b3IgewotCS8qKgotCSAqIEByZXR1cm4gdGhlIGRlc2NyaXB0aW9uIHZhbHVlIG9mIHRoaXMgdGFnIGxpYnJhcnkKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBkaXNwbGF5IG5hbWUgdmFsdWUgb2YgdGhpcyB0YWcgbGlicmFyeQotCSAqLwotCVN0cmluZyBnZXREaXNwbGF5TmFtZSgpOwotCS8qKgotCSAqIEByZXR1cm4gdGhlIHN0YXRlZCByZXF1aXJlZCBKU1AgdmVyc2lvbiBvZiB0aGlzIHRhZyBsaWJyYXJ5Ci0JICovCi0JU3RyaW5nIGdldEpTUFZlcnNpb24oKTsKLQkvKioKLQkgKiBAcmV0dXJuIGEgVVJMIHN0cmluZyB0byB0aGUgbGFyZ2UgaWNvbiBmb3IgdGhpcyB0YWcgbGlicmFyeQotCSAqLwotCVN0cmluZyBnZXRMYXJnZUljb24oKTsKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBzdGF0ZWQgc2hvcnQgbmFtZSBmb3IgdGhpcyB0YWcgbGlicmFyeQotCSAqLwotCVN0cmluZyBnZXRTaG9ydE5hbWUoKTsKLQkvKioKLQkgKiBAcmV0dXJuIGEgVVJMIHN0cmluZyB0byB0aGUgc21hbGwgaWNvbiBmb3IgdGhpcyB0YWcgbGlicmFyeQotCSAqLwotCVN0cmluZyBnZXRTbWFsbEljb24oKTsKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBzdGF0ZWQgdmVyc2lvbiBvZiB0aGlzIHRhZyBsaWJyYXJ5IGlmIHNwZWNpZmllZAotCSAqLwotCVN0cmluZyBnZXRUbGliVmVyc2lvbigpOwotCS8qKgotCSAqIEByZXR1cm4gYSBVUkkgcG9pbnRpbmcgdG8gdGhpcyB0YWcgbGlicmFyeSdzIGRlc2NyaXB0b3IsIG9yIG51bGwKLQkgKi8KLQlTdHJpbmcgZ2V0VVJJKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnbGliSW5kZXhEZWx0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYkluZGV4RGVsdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiM2JiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnbGliSW5kZXhEZWx0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLS8qKgotICogRGVzY3JpYmVzIGNoYW5nZXMgdG8gdGhlIGtub3duIHJlY29yZHMgd2l0aGluIHRoZSBUYWdsaWJJbmRleC4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJVGFnbGliSW5kZXhEZWx0YSB7Ci0KLQkvKioKLQkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IHRoZSByZWNvcmQgaGFzIGJlZW4gYWRkZWQuIE5vdGUgdGhhdCBhbgotCSAqIGFkZGVkIHRhZ2xpYiByZWNvcmQgZGVsdGEgaGFzIG5vIGNoaWxkcmVuLCBhcyB0aGV5IGFyZSBhbGwgaW1wbGljaXRlbHkKLQkgKiBhZGRlZC4KLQkgKi8KLQlwdWJsaWMgaW50IEFEREVEID0gMTsKLQkvKioKLQkgKiBTdGF0dXMgY29uc3RhbnQgaW5kaWNhdGluZyB0aGF0IHRoZSByZWNvcmQgaGFzIGJlZW4gY2hhbmdlZCwgYXMKLQkgKiBkZXNjcmliZWQgYnkgdGhlIGNoYW5nZSBmbGFncy4KLQkgKi8KLQlwdWJsaWMgaW50IENIQU5HRUQgPSA0OwotCS8qKgotCSAqIFN0YXR1cyBjb25zdGFudCBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlY29yZCBoYXMgYmVlbiByZW1vdmVkLiBOb3RlIHRoYXQKLQkgKiBhIHJlbW92ZWQgdGFnbGliIGVsZW1lbnQgZGVsdGEgaGFzIG5vIGNoaWxkcmVuLCBhcyB0aGV5IGFyZSBhbGwKLQkgKiBpbXBsaWNpdGVseSByZW1vdmVkLgotCSAqLwotCXB1YmxpYyBpbnQgUkVNT1ZFRCA9IDI7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgZGVsdGFzIGZvciB0aGUgYWZmZWN0ZWQgKGFkZGVkLCByZW1vdmVkLCBvciBjaGFuZ2VkKSByZWNvcmRzLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlJVGFnbGliSW5kZXhEZWx0YVtdIGdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgY2hhbmdlLCBvbmUgb2YgQURERUQsIENIQU5HRUQsIG9yIFJFTU9WRUQKLQkgKi8KLQlpbnQgZ2V0S2luZCgpOwotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIElQcm9qZWN0IGluIHdoaWNoIHRoaXMgZGVsdGEgb3JpZ2luYXRlZAotCSAqLwotCUlQcm9qZWN0IGdldFByb2plY3QoKTsKLQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgcmVjb3JkIHRoYXQgd2FzIGNoYW5nZWQKLQkgKi8KLQlJVGFnbGliUmVjb3JkIGdldFRhZ2xpYlJlY29yZCgpOwotCi0JLyoqCi0JICogQWNjZXB0cyB0aGUgZ2l2ZW4gdmlzaXRvci4gVGhlIG9ubHkga2luZHMgb2YgaW5kZXggZGVsdGFzIHZpc2l0ZWQgYXJlCi0JICogPGNvZGU+QURERUQ8L2NvZGU+LCA8Y29kZT5SRU1PVkVEPC9jb2RlPiwgYW5kCi0JICogPGNvZGU+Q0hBTkdFRDwvY29kZT4uIFRoZSB2aXNpdG9yJ3MgPGNvZGU+dmlzaXQ8L2NvZGU+IG1ldGhvZCBpcwotCSAqIGNhbGxlZCB3aXRoIHRoaXMgaW5kZXggZGVsdGEgaWYgYXBwbGljYWJsZS4gSWYgdGhlIHZpc2l0b3IgcmV0dXJucwotCSAqIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgcmVzb3VyY2UgZGVsdGEncyBjaGlsZHJlbiBhcmUgYWxzbyB2aXNpdGVkLgotCSAqIAotCSAqIEBwYXJhbSB2aXNpdG9yCi0JICogICAgICAgICAgICB0aGUgdmlzaXRvcgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSB2aXNpdG9yIGZhaWxlZCB3aXRoIHRoaXMgZXhjZXB0aW9uLgotCSAqIEBzZWUgSVJlc291cmNlRGVsdGFWaXNpdG9yI3Zpc2l0KElUYWdsaWJJbmRleERlbHRhVmlzaXRvcikKLQkgKi8KLQkvLyBwdWJsaWMgdm9pZCBhY2NlcHQoSVRhZ2xpYkluZGV4RGVsdGFWaXNpdG9yIHZpc2l0b3IpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYkluZGV4TGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdsaWJJbmRleExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MTAyN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYkluZGV4TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotLyoqCi0gKiBBIGxpc3RlbmVyIGZvciBjaGFuZ2VzIGluIHRoZSBpbmRleCdzIHJlY29yZHMuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRhZ2xpYkluZGV4TGlzdGVuZXIgewotCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IGEgY2hhbmdlIGluIHRoZSBUYWdsaWJJbmRleCwgZGVzY3JpYmVkIGJ5Ci0JICogYW4gSVRhZ2xpYkluZGV4RGVsdGEsIGhhcyBvY2N1cnJlZAotCSAqIAotCSAqIEBwYXJhbSBkZWx0YQotCSAqICAgICAgICAgICAgdGhlIGRlbHRhIG9mIGNoYW5nZXMKLQkgKi8KLQl2b2lkIGluZGV4Q2hhbmdlZChJVGFnbGliSW5kZXhEZWx0YSBkZWx0YSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnbGliUmVjb3JkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnbGliUmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYjY0NjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYlJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWI7Ci0KLS8qKgotICogQSByZXByZXNlbnRhdGlvbiBvZiBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSB0YWcgbGlicmFyeSBkZXNjcmlwdG9yLiBUaGlzCi0gKiBpbnRlcmZhY2UgaXMgY29tbW9uIHRvIGFsbCByZWNvcmQgdHlwZXMuCi0gKiAKLSAqIAotICogQHNlZSBJSmFyUmVjb3JkCi0gKiBAc2VlIElUYWdEaXJSZWNvcmQKLSAqIEBzZWUgSVRMRFJlY29yZAotICogQHNlZSBJVVJMUmVjb3JkCi0gKiAgICAgIDxwPgotICogICAgICBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqICAgICAgPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRhZ2xpYlJlY29yZCB7Ci0JLyoqCi0JICogQSByZWNvcmQgdG8gYSAuamFyIGZpbGUgcmVmZXJyYWJsZSBkaXJlY3RseSwgMS4xIHN0eWxlLCBvciBtZW50aW9uZWQgaW4KLQkgKiBhIHdlYi54bWwgZmlsZS4KLQkgKi8KLQlpbnQgSkFSID0gMSA8PCAxOwotCi0JLyoqCi0JICogQSByZWNvcmQgcmVwcmVzZW50aW5nIGEgZm9sZGVyIG9mIC50YWcvLnRhZ3ggZmlsZXMKLQkgKi8KLQlpbnQgVEFHRElSID0gMSA8PCAzOwotCi0JLyoqCi0JICogQSByZWNvcmQgcmVwcmVzZW50aW5nIGEgc3RhbmRhbG9uZSAudGxkIGZpbGUKLQkgKi8KLQlpbnQgVExEID0gMTsKLQotCS8qKgotCSAqIEEgcmVjb3JkIHJlcHJlc2VudGluZyBhIC50bGQgdGhhdCBpcyBub3QgYSBzdGFuZGFsb25lIGZpbGUKLQkgKi8KLQlpbnQgVVJMID0gMSA8PCAyOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIHJlY29yZC4gVGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgb25lIG9mCi0JICogPGNvZGU+VVJMPC9jb2RlPiwgPGNvZGU+VEFHRElSPC9jb2RlPiwgPGNvZGU+VExEPC9jb2RlPiwgb3IKLQkgKiA8Y29kZT5KQVI8L2NvZGU+LgotCSAqIDxwPgotCSAqIDx1bD4KLQkgKiA8bGk+IEFsbCByZWNvcmRzIG9mIHR5cGUgPGNvZGU+SkFSPC9jb2RlPiBpbXBsZW1lbnQKLQkgKiA8Y29kZT5JSmFyUmVjb3JkPC9jb2RlPi48L2xpPgotCSAqIDxsaT4gQWxsIHJlY29yZHMgb2YgdHlwZSA8Y29kZT5UQUdESVI8L2NvZGU+IGltcGxlbWVudAotCSAqIDxjb2RlPklUYWdEaXJSZWNvcmQ8L2NvZGU+LjwvbGk+Ci0JICogPGxpPiBBbGwgcmVjb3JkcyBvZiB0eXBlIDxjb2RlPlRMRDwvY29kZT4gaW1wbGVtZW50Ci0JICogPGNvZGU+SVRMRFJlY29yZDwvY29kZT4uPC9saT4KLQkgKiA8bGk+IEFsbCByZWNvcmRzIG9mIHR5cGUgPGNvZGU+VVJMPC9jb2RlPiBpbXBsZW1lbnQKLQkgKiA8Y29kZT5JVVJMUmVjb3JkPC9jb2RlPi48L2xpPgotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyByZXNvdXJjZQotCSAqIEBzZWUgI0pBUgotCSAqIEBzZWUgI1RBR0RJUgotCSAqIEBzZWUgI1RMRAotCSAqIEBzZWUgI1VSTAotCSAqLwotCWludCBnZXRSZWNvcmRUeXBlKCk7Ci0JCi0JSVRhZ2xpYkRlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYlJlY29yZEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnbGliUmVjb3JkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFkMTdjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnbGliUmVjb3JkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotCi0vKioKLSAqIERlc2NyaWJlcyBjaGFuZ2VzIHRvIHRoZSBrbm93biByZWNvcmRzIHdpdGhpbiB0aGUgVGFnbGliSW5kZXguCi0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRhZ2xpYlJlY29yZEV2ZW50IHsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHJlY29yZCB0aGF0IHdhcyBjaGFuZ2VkCi0JICovCi0JSVRhZ2xpYlJlY29yZCBnZXRUYWdsaWJSZWNvcmQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgY2hhbmdlLCBvbmUgb2YgQURERUQsIENIQU5HRUQsIG9yIFJFTU9WRUQKLQkgKi8KLQlpbnQgZ2V0VHlwZSgpOwotCi0JaW50IEFEREVEID0gSVJlc291cmNlRGVsdGEuQURERUQ7Ci0JaW50IENIQU5HRUQgPSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEOwotCWludCBSRU1PVkVEID0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lVUkxSZWNvcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lVUkxSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk3NGQzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVVJMUmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBBIHJlY29yZCByZXByZXNlbnRpbmcgYSAudGxkIHRoYXQgaXMgbm90IGEgc3RhbmRhbG9uZSBmaWxlCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVSTFJlY29yZCBleHRlbmRzIElUYWdsaWJSZWNvcmQgewotCi0JLyoqCi0JICogQHJldHVybiB0aGUgYmFzZSBsb2NhdGlvbiB0byB1c2UgZm9yIGZ1cnRoZXIgcmVzb2x1dGlvbiBvZiByZXNvdXJjZXMKLQkgKiAgICAgICAgIGZyb20gdGhlIFRMRAotCSAqLwotCVN0cmluZyBnZXRCYXNlTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2hvcnQtbmFtZSAobm9ybWFsbHkgdHJlYXRlZCBhcyB0aGUKLQkgKiAgICAgICAgIHJlY29tbWVuZGVkL2RlZmF1bHQgcHJlZml4KSwgaWYgb25lIHdhcyBzcGVjaWZpZWQgd2l0aGluIHRoaXMKLQkgKiAgICAgICAgIFRMRCdzIGNvbnRlbnRzLgotCSAqLwotCVN0cmluZyBnZXRTaG9ydE5hbWUoKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gdXNlIHRoZSBkZXNjcmlwdG9yJ3MgVVJJIHZhbHVlCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB1cmkgc3BlY2lmaWVkIHdpdGhpbiB0aGlzIFRMRCdzIGNvbnRlbnRzLgotCSAqLwotCVN0cmluZyBnZXRVUkkoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgVVJMIHRvIHRoaXMgVExEJ3MgY29udGVudHMuCi0JICovCi0JVVJMIGdldFVSTCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvUHJvamVjdERlc2NyaXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9Qcm9qZWN0RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMyNGFjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9Qcm9qZWN0RGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JTG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTFUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMlRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5EZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnV0aWwuRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5GYWNldE1vZHVsZUNvcmVTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuSmFyVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1jbGFzcyBQcm9qZWN0RGVzY3JpcHRpb24gewotCi0JY2xhc3MgRGVsdGFWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICYmIChkZWx0YS5nZXRGbGFncygpID09IElSZXNvdXJjZURlbHRhLkVOQ09ESU5HIHx8IGRlbHRhLmdldEZsYWdzKCkgPT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUykpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWlmIChyZXNvdXJjZS5nZXROYW1lKCkuZW5kc1dpdGgoIi50bGQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQkJcmVtb3ZlVExEKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXVwZGF0ZVRMRChyZXNvdXJjZSwgZGVsdGEuZ2V0S2luZCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChyZXNvdXJjZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQkJcmVtb3ZlSkFSKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXVwZGF0ZUpBUihyZXNvdXJjZSwgZGVsdGEuZ2V0S2luZCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICgidGFnIi5lcXVhbHNJZ25vcmVDYXNlKHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKSkgfHwgInRhZ3giLmVxdWFsc0lnbm9yZUNhc2UocmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7Ci0JCQkJCQlyZW1vdmVUYWcocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdXBkYXRlVGFnKHJlc291cmNlLCBkZWx0YS5nZXRLaW5kKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHJlc291cmNlLmdldE5hbWUoKS5lcXVhbHMoV0VCX1hNTCkgJiYgcmVzb3VyY2UuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpLmVxdWFscyhXRUJfSU5GKSkgewotCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCQkJCXJlbW92ZVdlYlhNTChyZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl1cGRhdGVXZWJYTUwocmVzb3VyY2UsIGRlbHRhLmdldEtpbmQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzb3VyY2UuZ2V0TmFtZSgpLmxlbmd0aCgpICE9IDAgJiYgcmVzb3VyY2UuZ2V0TmFtZSgpLmNoYXJBdCgwKSAhPSAnLic7Ci0JCX0KLQl9Ci0KLQljbGFzcyBJbmRleGVyIGltcGxlbWVudHMgSVJlc291cmNlUHJveHlWaXNpdG9yIHsKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCWJvb2xlYW4gdmlzaXRNZW1iZXJzID0gdHJ1ZTsKLQkJCWlmIChwcm94eS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQlpZiAocHJveHkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIudGxkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQl1cGRhdGVUTEQocHJveHkucmVxdWVzdFJlc291cmNlKCksIElUYWdsaWJJbmRleERlbHRhLkFEREVEKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocHJveHkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQl1cGRhdGVKQVIocHJveHkucmVxdWVzdFJlc291cmNlKCksIElUYWdsaWJJbmRleERlbHRhLkFEREVEKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocHJveHkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIudGFnIikgfHwgcHJveHkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIudGFneCIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl1cGRhdGVUYWdEaXIocHJveHkucmVxdWVzdFJlc291cmNlKCkuZ2V0UGFyZW50KCksIElUYWdsaWJJbmRleERlbHRhLkFEREVEKTsKLQkJCQkJLy8gYW55IGZvbGRlciB3aXRoIHRoZXNlIGZpbGVzIHdpbGwgY3JlYXRlIGEgcmVjb3JkIGZvcgotCQkJCQkvLyB0aGF0IGZvbGRlciBpbiBvbmUgcGFzcwotCQkJCQl2aXNpdE1lbWJlcnMgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocHJveHkuZ2V0TmFtZSgpLmVxdWFscyhXRUJfWE1MKSAmJiBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKS5nZXRQYXJlbnQoKS5nZXROYW1lKCkuZXF1YWxzKFdFQl9JTkYpKSB7Ci0JCQkJCXVwZGF0ZVdlYlhNTChwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKSwgSVRhZ2xpYkluZGV4RGVsdGEuQURERUQpOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyBuYW1lID0gcHJveHkuZ2V0TmFtZSgpOwotCQkJcmV0dXJuIG5hbWUubGVuZ3RoKCkgIT0gMCAmJiBuYW1lLmNoYXJBdCgwKSAhPSAnLicgJiYgdmlzaXRNZW1iZXJzOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIEphclJlY29yZCBpbXBsZW1lbnRzIElKYXJSZWNvcmQgewotCQlib29sZWFuIGhhczExVExEOwotCQlUYWdsaWJJbmZvIGluZm87Ci0KLQkJYm9vbGVhbiBpc0V4cG9ydGVkID0gdHJ1ZTsKLQkJYm9vbGVhbiBpc01hcHBlZEluV2ViWE1MOwotCQlJUGF0aCBsb2NhdGlvbjsKLQkJTGlzdCB1cmxSZWNvcmRzOwotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBKYXJSZWNvcmQpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiAoKEphclJlY29yZCkgb2JqKS5sb2NhdGlvbi5lcXVhbHMobG9jYXRpb24pICYmICgoSmFyUmVjb3JkKSBvYmopLmhhczExVExEID09IGhhczExVExEICYmICgoSmFyUmVjb3JkKSBvYmopLmluZm8uZXF1YWxzKGluZm8pOwotCQl9Ci0KLQkJcHVibGljIElUYWdsaWJEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7Ci0JCQlyZXR1cm4gaW5mbyAhPSBudWxsID8gaW5mbyA6IG5ldyBUYWdsaWJJbmZvKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2NhdGlvbi4KLQkJICovCi0JCXB1YmxpYyBJUGF0aCBnZXRMb2NhdGlvbigpIHsKLQkJCXJldHVybiBsb2NhdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0UmVjb3JkVHlwZSgpIHsKLQkJCXJldHVybiBJVGFnbGliUmVjb3JkLkpBUjsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlY29tbWVuZGVkL2RlZmF1bHQgcHJlZml4IGlmIG9uZSB3YXMgZ2l2ZW4uCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFNob3J0TmFtZSgpIHsKLQkJCWlmIChpbmZvID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gaW5mby5zaG9ydE5hbWU7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSB1cmkuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJCWlmIChpbmZvID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gaW5mby51cmk7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdCBnZXRVUkxSZWNvcmRzKCkgewotCQkJcmV0dXJuIHVybFJlY29yZHM7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCJKYXJSZWNvcmQ6ICIpOy8vJE5PTi1OTFMtMSQgCi0JCQlzLmFwcGVuZChsb2NhdGlvbik7Ci0JCQlpZiAodXJsUmVjb3Jkcy5zaXplKCkgPiAwKSB7Ci0JCQkJcy5hcHBlbmQoJ1xuJyk7Ly8kTk9OLU5MUy0xJCAKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHVybFJlY29yZHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJcy5hcHBlbmQodXJsUmVjb3Jkcy5nZXQoaSkpOwotCQkJCQlzLmFwcGVuZCgnXG4nKTsvLyROT04tTkxTLTEkIAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzLnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVGFnRGlyUmVjb3JkIGltcGxlbWVudHMgSVRhZ0RpclJlY29yZCB7Ci0JCVRhZ2xpYkluZm8gaW5mbzsKLQkJSVBhdGggcGF0aDsKLQkJLy8gYSBMaXN0IGhvbGRpbmcgU3RyaW5ncyBvZiAudGFnIGFuZCAudGFneCBmaWxlbmFtZXMgcmVsYXRpdmUgdG8gdGhlCi0JCS8vIHRhZ2RpcidzIGxvY2F0aW9uCi0JCUxpc3QgdGFncyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFRhZ0RpclJlY29yZCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuICgoVGFnRGlyUmVjb3JkKSBvYmopLnBhdGguZXF1YWxzKHBhdGgpICYmICgoVGFnRGlyUmVjb3JkKSBvYmopLmluZm8uZXF1YWxzKGluZm8pOwotCQl9Ci0KLQkJcHVibGljIElUYWdsaWJEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7Ci0JCQlyZXR1cm4gaW5mbyAhPSBudWxsID8gaW5mbyA6IChpbmZvID0gbmV3IFRhZ2xpYkluZm8oKSk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRhZ0RpclJlY29yZCNnZXRQYXRoKCkKLQkJICovCi0JCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldFJlY29yZFR5cGUoKSB7Ci0JCQlyZXR1cm4gSVRhZ2xpYlJlY29yZC5UQUdESVI7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSB0YWdzLgotCQkgKi8KLQkJcHVibGljIFN0cmluZ1tdIGdldFRhZ0ZpbGVuYW1lcygpIHsKLQkJCXJldHVybiAoU3RyaW5nW10pIHRhZ3MudG9BcnJheShuZXcgU3RyaW5nW3RhZ3Muc2l6ZSgpXSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUYWdkaXJSZWNvcmQ6ICIgKyBwYXRoICsgIiA8LT4gIiArIGluZm8uc2hvcnROYW1lOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIEEgYnJpZWYgcmVwcmVzZW50YXRpb24gb2YgdGhlIGluZm9ybWF0aW9uIGluIGEgVExELgotCSAqLwotCXN0YXRpYyBjbGFzcyBUYWdsaWJJbmZvIGltcGxlbWVudHMgSVRhZ2xpYkRlc2NyaXB0b3IgewotCQkvLyBleHRyYWN0IG9ubHkgd2hlbiBhc2tlZD8KLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gIiI7Ci0JCVN0cmluZyBkaXNwbGF5TmFtZSA9ICIiOwotCQlTdHJpbmcganNwVmVyc2lvbiA9ICIiOwotCQlTdHJpbmcgbGFyZ2VJY29uID0gIiI7Ci0JCVN0cmluZyBzaG9ydE5hbWUgPSAiIjsKLQkJU3RyaW5nIHNtYWxsSWNvbiA9ICIiOwotCQlTdHJpbmcgdGxpYlZlcnNpb24gPSAiIjsKLQkJU3RyaW5nIHVyaSA9ICIiOwotCi0JCXB1YmxpYyBUYWdsaWJJbmZvKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBUYWdsaWJJbmZvKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gKChUYWdsaWJJbmZvKSBvYmopLmpzcFZlcnNpb24gPT0ganNwVmVyc2lvbiAmJiAoKFRhZ2xpYkluZm8pIG9iaikuZGVzY3JpcHRpb24uZXF1YWxzKGRlc2NyaXB0aW9uKSAmJiAoKFRhZ2xpYkluZm8pIG9iaikubGFyZ2VJY29uLmVxdWFscyhsYXJnZUljb24pICYmICgoVGFnbGliSW5mbykgb2JqKS5zaG9ydE5hbWUuZXF1YWxzKHNob3J0TmFtZSkgJiYgKChUYWdsaWJJbmZvKSBvYmopLnNtYWxsSWNvbi5lcXVhbHMoc21hbGxJY29uKSAmJiAoKFRhZ2xpYkluZm8pIG9iaikudGxpYlZlcnNpb24uZXF1YWxzKHRsaWJWZXJzaW9uKSAmJiAoKFRhZ2xpYkluZm8pIG9iaikudXJpLmVxdWFscyh1cmkpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJCXJldHVybiBkZXNjcmlwdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCQlyZXR1cm4gZGlzcGxheU5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEpTUFZlcnNpb24oKSB7Ci0JCQlyZXR1cm4ganNwVmVyc2lvbjsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFyZ2VJY29uKCkgewotCQkJcmV0dXJuIGxhcmdlSWNvbjsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCkgewotCQkJcmV0dXJuIHNob3J0TmFtZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U21hbGxJY29uKCkgewotCQkJcmV0dXJuIHNtYWxsSWNvbjsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGxpYlZlcnNpb24oKSB7Ci0JCQlyZXR1cm4gdGxpYlZlcnNpb247Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJCXJldHVybiB1cmk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUYWdsaWJJbmZvfCIgKyBzaG9ydE5hbWUgKyAifCIgKyB0bGliVmVyc2lvbiArICJ8IiArIHNtYWxsSWNvbiArICJ8IiArIGxhcmdlSWNvbiArICJ8IiArIGpzcFZlcnNpb24gKyAifCIgKyB1cmkgKyAifCIgKyBkZXNjcmlwdGlvbjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JAotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFRMRFJlY29yZCBpbXBsZW1lbnRzIElUTERSZWNvcmQgewotCQlUYWdsaWJJbmZvIGluZm87Ci0JCUlQYXRoIHBhdGg7Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFRMRFJlY29yZCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuICgoVExEUmVjb3JkKSBvYmopLnBhdGguZXF1YWxzKHBhdGgpICYmICgoVExEUmVjb3JkKSBvYmopLmdldFVSSSgpLmVxdWFscyhnZXRVUkkoKSkgJiYgKChUTERSZWNvcmQpIG9iaikuaW5mby5lcXVhbHMoaW5mbyk7Ci0JCX0KLQotCQlwdWJsaWMgSVRhZ2xpYkRlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpIHsKLQkJCXJldHVybiBpbmZvICE9IG51bGwgPyBpbmZvIDogbmV3IFRhZ2xpYkluZm8oKTsKLQkJfQotCi0JCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldFJlY29yZFR5cGUoKSB7Ci0JCQlyZXR1cm4gSVRhZ2xpYlJlY29yZC5UTEQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFNob3J0TmFtZSgpIHsKLQkJCWlmIChpbmZvID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gaW5mby5zaG9ydE5hbWU7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSB1cmkuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJCWlmIChpbmZvID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gaW5mby51cmk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUTERSZWNvcmQ6ICIgKyBnZXRVUkkoKSArICIgPC0+ICIgKyBwYXRoOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBVUkxSZWNvcmQgaW1wbGVtZW50cyBJVVJMUmVjb3JkIHsKLQkJU3RyaW5nIGJhc2VMb2NhdGlvbjsKLQkJVGFnbGliSW5mbyBpbmZvOwotCQlib29sZWFuIGlzRXhwb3J0ZWQgPSB0cnVlOwotCQlVUkwgdXJsOwotCi0JCXB1YmxpYyBVUkxSZWNvcmQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFVSTFJlY29yZCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuICgoVVJMUmVjb3JkKSBvYmopLmJhc2VMb2NhdGlvbi5lcXVhbHMoYmFzZUxvY2F0aW9uKSAmJiAoKFVSTFJlY29yZCkgb2JqKS51cmwuZXF1YWxzKHVybCkgJiYgKChVUkxSZWNvcmQpIG9iaikuaW5mby5lcXVhbHMoaW5mbyk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEJhc2VMb2NhdGlvbigpIHsKLQkJCXJldHVybiBiYXNlTG9jYXRpb247Ci0JCX0KLQotCQlwdWJsaWMgSVRhZ2xpYkRlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpIHsKLQkJCXJldHVybiBpbmZvICE9IG51bGwgPyBpbmZvIDogbmV3IFRhZ2xpYkluZm8oKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0UmVjb3JkVHlwZSgpIHsKLQkJCXJldHVybiBJVGFnbGliUmVjb3JkLlVSTDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlY29tbWVuZGVkL2RlZmF1bHQgcHJlZml4IGlmIG9uZSB3YXMgZ2l2ZW4uCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFNob3J0TmFtZSgpIHsKLQkJCWlmIChpbmZvID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gaW5mby5zaG9ydE5hbWU7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSB1cmkuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJCWlmIChpbmZvID09IG51bGwpCi0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gaW5mby51cmk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBVUkwuCi0JCSAqLwotCQlwdWJsaWMgVVJMIGdldFVSTCgpIHsKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJVUkxSZWNvcmQ6IChleHBvcnRlZD0iICsgaXNFeHBvcnRlZCArICIpICIgKyBiYXNlTG9jYXRpb24gKyAiIDwtPiAiICsgZ2V0VVJJKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFdlYlhNTFJlY29yZCB7Ci0JCVRhZ2xpYkluZm8gaW5mbzsKLQkJSVBhdGggcGF0aDsKLQkJTGlzdCB0bGRSZWNvcmRzID0gbmV3IEFycmF5TGlzdCgwKTsKLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgV2ViWE1MUmVjb3JkKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gKChXZWJYTUxSZWNvcmQpIG9iaikucGF0aC5lcXVhbHMocGF0aCkgJiYgKChXZWJYTUxSZWNvcmQpIG9iaikuaW5mby5lcXVhbHMoaW5mbyk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSByZWNvbW1lbmRlZC9kZWZhdWx0IHByZWZpeCBpZiBvbmUgd2FzIGdpdmVuLgotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGluZm8uc2hvcnROYW1lOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHVibGljIExpc3QgZ2V0VExEUmVjb3JkcygpIHsKLQkJCXJldHVybiB0bGRSZWNvcmRzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2VieG1sLgotCQkgKi8KLQkJcHVibGljIElQYXRoIGdldFdlYlhNTCgpIHsKLQkJCXJldHVybiBwYXRoOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigiV2ViWE1MUmVjb3JkOiAiKTsvLyROT04tTkxTLTEkIAotCQkJcy5hcHBlbmQocGF0aCk7Ci0JCQlpZiAodGxkUmVjb3Jkcy5zaXplKCkgPiAwKSB7Ci0JCQkJcy5hcHBlbmQoJ1xuJyk7Ly8kTk9OLU5MUy0xJCAKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRsZFJlY29yZHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJcy5hcHBlbmQodGxkUmVjb3Jkcy5nZXQoaSkpOwotCQkJCQlzLmFwcGVuZCgnXG4nKTsvLyROT04tTkxTLTEkIAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzLnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgYm9vbGVhbiBfZGVidWdJbmRleENyZWF0aW9uID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS90YWdsaWIvaW5kZXhjcmVhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0Jc3RhdGljIGJvb2xlYW4gX2RlYnVnSW5kZXhUaW1lID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS90YWdsaWIvaW5kZXh0aW1lIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRFBBVEhfRElSVFkgPSAiQlVJTERQQVRIX0RJUlRZIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRFBBVEhfRU5UUklFUyA9ICJCVUlMRFBBVEhfRU5UUklFUyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERQQVRIX1BST0pFQ1QgPSAiQlVJTERQQVRIX1BST0pFQ1QiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfRk9STUFUX1ZFUlNJT04gPSAiVGFnIExpYnJhcnkgSW5kZXggMS4wLjMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9JTkYgPSAiV0VCLUlORiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUGF0aCBXRUJfSU5GX1BBVEggPSBuZXcgUGF0aChXRUJfSU5GKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1hNTCA9ICJ3ZWIueG1sIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTm90ZXMgdGhhdCB0aGUgYnVpbGQgcGF0aCBpbmZvcm1hdGlvbiBpcyBzdGFsZS4gU29tZSBvcGVyYXRpb25zIGNhbiBub3cKLQkgKiBiZSBza2lwcGVkIHVudGlsIGEgcmVzb2x2ZS9nZXRBdmFpbGFibGUgY2FsbCBpcyBtYWRlLgotCSAqLwotCWJvb2xlYW4gZkJ1aWxkUGF0aElzRGlydHkgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvdW50IG9mIGVudHJpZXMgb24gdGhlIGJ1aWxkIHBhdGguIFByaW1hcnkgdXNlIGNhc2UgaXMgZm9yIGNsYXNzcGF0aAotCSAqIGNvbnRhaW5lcnMgdGhhdCBhZGQgYW4gZW50cnkuIFdpdGhvdXQgbm90aWZpY2F0aW9uICgzLjMpLCB3ZSBjYW4gb25seQotCSAqIGNoZWNrIGFmdGVyLXRoZS1mYWN0LgotCSAqLwotCWludCBmQnVpbGRQYXRoRW50cnlDb3VudCA9IDA7Ci0KLQkvKioKLQkgKiBBIGNhY2hlZCBjb3B5IG9mIGFsbCBvZiB0aGUgcmVjb3JkcyBjcmVhdGVhYmxlIGZyb20gdGhlIFhNTENhdGFsb2cuCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGZDYXRhbG9nUmVjb3JkczsKLQotCS8qCi0JICogUmVjb3JkcyBhY3RpdmUgSkFScyBvbiB0aGUgY2xhc3NwYXRoLiBUYWdsaWIgZGVzY3JpcHRvcnMgc2hvdWxkIGJlCi0JICogdXNhYmxlLCBidXQgdGhlIGphcnMgYnkgdGhlbXNlbHZlcyBhcmUgbm90LgotCSAqLwotCUhhc2h0YWJsZSBmQ2xhc3NwYXRoSmFyczsKLQotCS8qKgotCSAqIEEgc2V0IG9mIHRoZSBwcm9qZWN0cyB0aGF0IGFyZSBpbiB0aGlzIHByb2plY3QncyBidWlsZCBwYXRoLgotCSAqIExvb2t1cHMvZW51bWVyYXRpb25zIHdpbGwgYmUgcmVkaXJlY3RlZCB0byB0aGUgY29ycmVzcG9uZGluZwotCSAqIFByb2plY3REZXNjcmlwdGlvbiBpbnN0YW5jZXMKLQkgKi8KLQlTZXQgZkNsYXNzcGF0aFByb2plY3RzID0gbnVsbDsKLQotCS8vIGhvbGRzIHJlZmVyZW5jZXMgYnkgVVJJIHRvIEpBUnMKLQlIYXNodGFibGUgZkNsYXNzcGF0aFJlZmVyZW5jZXM7Ci0KLQkvKgotCSAqIHRoaXMgdGFibGUgaXMgc3BlY2lhbCBpbiB0aGF0IGl0IGhvbGRzIHRhYmxlcyBvZiByZWZlcmVuY2VzIGFjY29yZGluZwotCSAqIHRvIGxvY2FsIHJvb3RzCi0JICovCi0JSGFzaHRhYmxlIGZJbXBsaWNpdFJlZmVyZW5jZXM7Ci0KLQlIYXNodGFibGUgZkpBUlJlZmVyZW5jZXM7Ci0KLQlJUHJvamVjdCBmUHJvamVjdDsKLQotCXByaXZhdGUgU3RyaW5nIGZTYXZlU3RhdGVGaWxlbmFtZTsKLQotCUhhc2h0YWJsZSBmVGFnRGlyUmVmZXJlbmNlczsKLQotCUhhc2h0YWJsZSBmVExEUmVmZXJlbmNlczsKLQotCUlSZXNvdXJjZURlbHRhVmlzaXRvciBmVmlzaXRvcjsKLQlIYXNodGFibGUgZldlYlhNTFJlZmVyZW5jZXM7Ci0KLQlJTG9jayBMT0NLID0gSm9iLmdldEpvYk1hbmFnZXIoKS5uZXdMb2NrKCk7Ci0KLQlwcml2YXRlIGxvbmcgdGltZTA7Ci0KLQlQcm9qZWN0RGVzY3JpcHRpb24oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHNhdmVTdGF0ZUZpbGUpIHsKLQkJc3VwZXIoKTsKLQkJZlByb2plY3QgPSBwcm9qZWN0OwotCQlmU2F2ZVN0YXRlRmlsZW5hbWUgPSBzYXZlU3RhdGVGaWxlOwotCi0JCWZDbGFzc3BhdGhKYXJzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQkJZkpBUlJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmVGFnRGlyUmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZUTERSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQkJZldlYlhNTFJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmSW1wbGljaXRSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQkJZkNsYXNzcGF0aFJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmQ2xhc3NwYXRoUHJvamVjdHMgPSBuZXcgSGFzaFNldCgpOwotCi0JCXJlc3RvcmVSZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIF9nZXRKU1AxMUFuZFdlYlhNTEphclJlZmVyZW5jZXMoQ29sbGVjdGlvbiBhbGxKQVJzKSB7Ci0JCUxpc3QgY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoYWxsSkFScy5zaXplKCkpOwotCQlJdGVyYXRvciBpID0gYWxsSkFScy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUphclJlY29yZCByZWNvcmQgPSAoSmFyUmVjb3JkKSBpLm5leHQoKTsKLQkJCWlmIChyZWNvcmQuaGFzMTFUTEQgfHwgcmVjb3JkLmlzTWFwcGVkSW5XZWJYTUwpIHsKLQkJCQljb2xsZWN0aW9uLmFkZChyZWNvcmQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb2xsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3Qgb2Yga25vd24gcmVmZXJlbmNlcyBmcm9tIHRoaXMgcHJvamVjdCdzIGJ1aWxkIHBhdGggdG8gdGhlCi0JICogbWFwLCBhcHBlbmRpbmcgYW55IHByb2Nlc3NlZCBwcm9qZWN0cyBpbnRvIHRoZSBsaXN0IHRvIGF2b2lkCi0JICogYnVpbGQtcGF0aC1jeWNsZXMuCi0JICogCi0JICogQHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQyNDA4Ci0JICogCi0JICogQHBhcmFtIHJlZmVyZW5jZXMgLQotCSAqICAgICAgICAgICAgdGhlIG1hcCBvZiByZWZlcmVuY2VzIHRvIElUYWdsaWJSZWNvcmRzCi0JICogQHBhcmFtIHByb2plY3RzUHJvY2Vzc2VkIC0KLQkgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIHByb2plY3RzIGFscmVhZHkgY29uc2lkZXJlZAotCSAqIEBwYXJhbSBleHBvcnRlZE9ubHkgLQotCSAqICAgICAgICAgICAgV2hldGhlciB0byBvbmx5IGFkZCByZWZlcmVuY2VzIGRlcml2ZWQgZnJvbSBleHBvcnRlZCBidWlsZAotCSAqICAgICAgICAgICAgcGF0aCBjb250YWluZXJzLiBUaGlzIG1ldGhvZCBjYWxscyBpdHNlbGYgcmVjdXJzaXZlbHkgd2l0aAotCSAqICAgICAgICAgICAgdGhpcyBwYXJhbWV0ZXIgYXMgZmFsc2UuCi0JICovCi0Jdm9pZCBhZGRCdWlsZFBhdGhSZWZlcmVuY2VzKE1hcCByZWZlcmVuY2VzLCBMaXN0IHByb2plY3RzUHJvY2Vzc2VkLCBib29sZWFuIGV4cG9ydGVkT25seSkgewotCQllbnN1cmVVcFRvZGF0ZSgpOwotCi0JCS8vIEFkZCB0aGUgYnVpbGQgcGF0aCByZWZlcmVuY2VzIHRoYXQgYXJlIGV4cG9ydGVkIGZyb20gdGhpcyBwcm9qZWN0Ci0JCUVudW1lcmF0aW9uIGtleXMgPSBmQ2xhc3NwYXRoUmVmZXJlbmNlcy5rZXlzKCk7Ci0JCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlPYmplY3Qga2V5ID0ga2V5cy5uZXh0RWxlbWVudCgpOwotCQkJVVJMUmVjb3JkIHVybFJlY29yZCA9IChVUkxSZWNvcmQpIGZDbGFzc3BhdGhSZWZlcmVuY2VzLmdldChrZXkpOwotCQkJaWYgKGV4cG9ydGVkT25seSkgewotCQkJCWlmICh1cmxSZWNvcmQuaXNFeHBvcnRlZCkgewotCQkJCQlyZWZlcmVuY2VzLnB1dChrZXksIHVybFJlY29yZCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVmZXJlbmNlcy5wdXQoa2V5LCB1cmxSZWNvcmQpOwotCQkJfQotCQl9Ci0JCUlQcm9qZWN0W10gYnVpbGRwYXRoUHJvamVjdHMgPSAoSVByb2plY3RbXSkgZkNsYXNzcGF0aFByb2plY3RzLnRvQXJyYXkobmV3IElQcm9qZWN0W2ZDbGFzc3BhdGhQcm9qZWN0cy5zaXplKCldKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidWlsZHBhdGhQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFwcm9qZWN0c1Byb2Nlc3NlZC5jb250YWlucyhidWlsZHBhdGhQcm9qZWN0c1tpXSkgJiYgYnVpbGRwYXRoUHJvamVjdHNbaV0uaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlwcm9qZWN0c1Byb2Nlc3NlZC5hZGQoYnVpbGRwYXRoUHJvamVjdHNbaV0pOwotCQkJCVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IFRhZ2xpYkluZGV4LmdldEluc3RhbmNlKCkuY3JlYXRlRGVzY3JpcHRpb24oYnVpbGRwYXRoUHJvamVjdHNbaV0pOwotCQkJCWRlc2NyaXB0aW9uLmFkZEJ1aWxkUGF0aFJlZmVyZW5jZXMocmVmZXJlbmNlcywgcHJvamVjdHNQcm9jZXNzZWQsIHRydWUpOwotCi0JCQkJLyoKLQkJCQkgKiAxOTk4NDMgKDE4Mzc1NikgLSBKU1AgVmFsaWRhdGlvbiBDYW5ub3QgRmluZCBUYWcgTGlicmFyeQotCQkJCSAqIERlc2NyaXB0b3IgaW4gUmVmZXJlbmNlZCBQcm9qZWN0cwotCQkJCSAqIAotCQkJCSAqIEFkZCBhbnkgVExEIHJlY29yZHMgaGF2aW5nIFVSSSB2YWx1ZXMgZnJvbSBwcm9qZWN0cyBvbiB0aGUKLQkJCQkgKiBidWlsZCBwYXRoCi0JCQkJICovCi0JCQkJTWFwW10gcm9vdFJlZmVyZW5jZXMgPSAoTWFwW10pIGRlc2NyaXB0aW9uLmZJbXBsaWNpdFJlZmVyZW5jZXMudmFsdWVzKCkudG9BcnJheShuZXcgTWFwW2Rlc2NyaXB0aW9uLmZJbXBsaWNpdFJlZmVyZW5jZXMuc2l6ZSgpXSk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCByb290UmVmZXJlbmNlcy5sZW5ndGg7IGorKykgewotCQkJCQlJdGVyYXRvciBpbXBsaWNpdFJlY29yZHMgPSByb290UmVmZXJlbmNlc1tqXS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaW1wbGljaXRSZWNvcmRzLmhhc05leHQoKSkgewotCQkJCQkJSVRhZ2xpYlJlY29yZCByZWNvcmQgPSAoSVRhZ2xpYlJlY29yZCkgaW1wbGljaXRSZWNvcmRzLm5leHQoKTsKLQkJCQkJCWlmIChyZWNvcmQuZ2V0UmVjb3JkVHlwZSgpID09IElUYWdsaWJSZWNvcmQuVExEICYmICgoSVRMRFJlY29yZCkgcmVjb3JkKS5nZXRVUkkoKSAhPSBudWxsKSB7Ci0JCQkJCQkJcmVmZXJlbmNlcy5wdXQoKChJVExEUmVjb3JkKSByZWNvcmQpLmdldFVSSSgpLCByZWNvcmQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRXJhc2VzIGFsbCBrbm93biB0YWJsZXMKLQkgKi8KLQl2b2lkIGNsZWFyKCkgewotCQlmQ2xhc3NwYXRoSmFycyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZKQVJSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQkJZlRhZ0RpclJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmVExEUmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZXZWJYTUxSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQkJZkltcGxpY2l0UmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZDbGFzc3BhdGhSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xvc2VKYXJGaWxlKFppcEZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJZmlsZS5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIlRhZ2xpYkluZGV4OiBDb3VsZCBub3QgY2xvc2UgemlwIGZpbGUgIiArIGZpbGUuZ2V0TmFtZSgpLCBpb2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2F0YWxvZ0VudHJ5Ci0JICogICAgICAgICAgICBhIFhNTCBjYXRhbG9nIGVudHJ5IHBvaW50aW5nIHRvIGEgLmphciBvciAudGxkIGZpbGUKLQkgKiBAcmV0dXJuIGEgSVRhZ2xpYlJlY29yZCBkZXNjcmliaW5nIGEgVExEIGNvbnRyaWJ1dGVkIHRvIHRoZSBYTUxDYXRhbG9nCi0JICogICAgICAgICBpZiBvbmUgd2FzIGZvdW5kIGF0IHRoZSBnaXZlbiBsb2NhdGlvbiwgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIElUYWdsaWJSZWNvcmQgY3JlYXRlQ2F0YWxvZ1JlY29yZChJQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeSkgewotCQlyZXR1cm4gY3JlYXRlQ2F0YWxvZ1JlY29yZChjYXRhbG9nRW50cnkuZ2V0S2V5KCksIGNhdGFsb2dFbnRyeS5nZXRVUkkoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHVyaSAtCi0JICogICAgICAgICAgICB0aGUga2V5IHZhbHVlIHRoYXQgd2lsbCBiZWNvbWUgdGhlIHJldHVybmVkIHJlY29yZCdzICJVUkkiCi0JICogQHBhcmFtIHVybFN0cmluZyAtCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIGluZGljYXRpbmcgd2hlcmUgdGhlIFRMRCByZWFsbHkgaXMKLQkgKiBAcmV0dXJuIGEgSVRhZ2xpYlJlY29yZCBkZXNjcmliaW5nIGEgVExEIGNvbnRyaWJ1dGVkIHRvIHRoZSBYTUxDYXRhbG9nCi0JICogICAgICAgICBpZiBvbmUgd2FzIGZvdW5kIGF0IHRoZSBnaXZlbiBsb2NhdGlvbiwgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIElUYWdsaWJSZWNvcmQgY3JlYXRlQ2F0YWxvZ1JlY29yZChTdHJpbmcgdXJpLCBTdHJpbmcgdXJsU3RyaW5nKSB7Ci0JCUlUYWdsaWJSZWNvcmQgcmVjb3JkID0gbnVsbDsKLQkJLy8gaGFuZGxlICJmaWxlOiIgVVJMcyB0aGF0IHBvaW50IHRvIGEgLmphciBmaWxlIG9uIGRpc2sgKDEuMSBtb2RlKQotCQlpZiAodXJsU3RyaW5nLnRvTG93ZXJDYXNlKExvY2FsZS5VUykuZW5kc1dpdGgoKCIuamFyIikpICYmIHVybFN0cmluZy5zdGFydHNXaXRoKCJmaWxlOiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3RyaW5nIGZpbGVMb2NhdGlvbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCVVSTCB1cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7Ci0JCQkJZmlsZUxvY2F0aW9uID0gdXJsLmdldEZpbGUoKTsKLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCS8vIG5vdCB3b3J0aCByZXBvcnRpbmcKLQkJCX0KLQkJCWlmIChmaWxlTG9jYXRpb24gIT0gbnVsbCkgewotCQkJCUphclJlY29yZCBqYXJSZWNvcmQgPSBjcmVhdGVKQVJSZWNvcmQoZmlsZUxvY2F0aW9uKTsKLQkJCQlTdHJpbmdbXSBlbnRyaWVzID0gSmFyVXRpbGl0aWVzLmdldEVudHJ5TmFtZXMoZmlsZUxvY2F0aW9uKTsKLQkJCQlmb3IgKGludCBqRW50cnkgPSAwOyBqRW50cnkgPCBlbnRyaWVzLmxlbmd0aDsgakVudHJ5KyspIHsKLQkJCQkJaWYgKGVudHJpZXNbakVudHJ5XS5lbmRzV2l0aCgiLnRsZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChlbnRyaWVzW2pFbnRyeV0uZXF1YWxzKEphclV0aWxpdGllcy5KU1AxMV9UQUdMSUIpKSB7Ci0JCQkJCQkJamFyUmVjb3JkLmhhczExVExEID0gdHJ1ZTsKLQkJCQkJCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IEphclV0aWxpdGllcy5nZXRJbnB1dFN0cmVhbShmaWxlTG9jYXRpb24sIGVudHJpZXNbakVudHJ5XSk7Ci0JCQkJCQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCQkJCQkJVGFnbGliSW5mbyBpbmZvID0gZXh0cmFjdEluZm8oZmlsZUxvY2F0aW9uLCBjb250ZW50cyk7Ci0JCQkJCQkJCS8qCi0JCQkJCQkJCSAqIHRoZSByZWNvcmQncyByZXBvcnRlZCBVUkkgc2hvdWxkIG1hdGNoIHRoZQotCQkJCQkJCQkgKiBjYXRhbG9nIGVudHJ5J3MgImtleSIgc28gcmVwbGFjZSB0aGUKLQkJCQkJCQkJICogZGV0ZWN0ZWQgdmFsdWUKLQkJCQkJCQkJICovCi0JCQkJCQkJCWluZm8udXJpID0gdXJpOwotCQkJCQkJCQlqYXJSZWNvcmQuaW5mbyA9IGluZm87Ci0JCQkJCQkJfQotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChqYXJSZWNvcmQuaGFzMTFUTEQpIHsKLQkJCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiY3JlYXRlZCBjYXRhbG9nIHJlY29yZCBmb3IgIiArIHVybFN0cmluZyArICJAIiArIGphclJlY29yZC5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXJlY29yZCA9IGphclJlY29yZDsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQkvLyBUaGUgcmVzdCBhcmUgVVJMcyBpbnRvIGEgcGx1Zy1pbi4uLnNvbWV3aGVyZQotCQllbHNlIHsKLQkJCVVSTCB1cmwgPSBudWxsOwotCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gY2FjaGVkQ29udGVudHMgPSBudWxsOwotCQkJSW5wdXRTdHJlYW0gdGxkU3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcpOwotCQkJCVVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotCQkJCWNvbm5lY3Rpb24uc2V0RGVmYXVsdFVzZUNhY2hlcyhmYWxzZSk7Ci0JCQkJdGxkU3RyZWFtID0gY29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiByZWFkaW5nIFRMRCBjb250cmlidXRlZCB0byB0aGUgWE1MIENhdGFsb2ciLCBlMSk7Ci0JCQl9Ci0KLQkJCWlmICh0bGRTdHJlYW0gIT0gbnVsbCkgewotCQkJCWludCBjOwotCQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJLy8gYXJyYXkgZGltIHJlc3RyaWN0aW9uPwotCQkJCWJ5dGUgYnl0ZXNbXSA9IG5ldyBieXRlWzIwNDhdOwotCQkJCXRyeSB7Ci0JCQkJCXdoaWxlICgoYyA9IHRsZFN0cmVhbS5yZWFkKGJ5dGVzKSkgPj0gMCkgewotCQkJCQkJYnVmZmVyLndyaXRlKGJ5dGVzLCAwLCBjKTsKLQkJCQkJfQotCQkJCQljYWNoZWRDb250ZW50cyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmZXIudG9CeXRlQXJyYXkoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkJLy8gbm8gY2xlYW51cCBjYW4gYmUgZG9uZQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXRsZFN0cmVhbS5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlVUkxSZWNvcmQgdXJsUmVjb3JkID0gbnVsbDsKLQkJCQlUYWdsaWJJbmZvIGluZm8gPSBleHRyYWN0SW5mbyh1cmxTdHJpbmcsIGNhY2hlZENvbnRlbnRzKTsKLQkJCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIHRoZSByZWNvcmQncyByZXBvcnRlZCBVUkkgc2hvdWxkIG1hdGNoIHRoZSBjYXRhbG9nCi0JCQkJCSAqIGVudHJ5J3MgImtleSIgc28gcmVwbGFjZSB0aGUgZGV0ZWN0ZWQgdmFsdWUKLQkJCQkJICovCi0JCQkJCWluZm8udXJpID0gdXJpOwotCQkJCQl1cmxSZWNvcmQgPSBuZXcgVVJMUmVjb3JkKCk7Ci0JCQkJCXVybFJlY29yZC5pbmZvID0gaW5mbzsKLQkJCQkJdXJsUmVjb3JkLmJhc2VMb2NhdGlvbiA9IHVybFN0cmluZzsKLQkJCQkJdXJsUmVjb3JkLnVybCA9IHVybDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCWNhY2hlZENvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJCXJlY29yZCA9IHVybFJlY29yZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVjb3JkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEphclJlY29yZCBjcmVhdGVKQVJSZWNvcmQoSVJlc291cmNlIGphcikgewotCQlJUGF0aCBsb2NhdGlvbiA9IGphci5nZXRMb2NhdGlvbigpOwotCQlKYXJSZWNvcmQgamFyUmVjb3JkID0gbnVsbDsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCWphclJlY29yZCA9IGNyZWF0ZUpBUlJlY29yZChsb2NhdGlvbi50b1N0cmluZygpKTsKLQkJfQotCQllbHNlIGlmIChqYXIuZ2V0TG9jYXRpb25VUkkoKSAhPSBudWxsKSB7Ci0JCQlqYXJSZWNvcmQgPSBjcmVhdGVKQVJSZWNvcmQoamFyLmdldExvY2F0aW9uVVJJKCkudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIGphclJlY29yZDsKLQl9Ci0KLQlwcml2YXRlIEphclJlY29yZCBjcmVhdGVKQVJSZWNvcmQoU3RyaW5nIGZpbGVMb2NhdGlvbikgewotCQlKYXJSZWNvcmQgcmVjb3JkID0gbmV3IEphclJlY29yZCgpOwotCQlyZWNvcmQuaW5mbyA9IG5ldyBUYWdsaWJJbmZvKCk7Ci0JCXJlY29yZC5sb2NhdGlvbiA9IG5ldyBQYXRoKGZpbGVMb2NhdGlvbik7Ci0JCXJlY29yZC51cmxSZWNvcmRzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJcmV0dXJuIHJlY29yZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUYWdEaXJSZWNvcmQgY3JlYXRlVGFnZGlyUmVjb3JkKElGb2xkZXIgdGFnZGlyKSB7Ci0JCUlQYXRoIHRhZ2RpclBhdGggPSB0YWdkaXIuZ2V0RnVsbFBhdGgoKTsKLQkJVGFnRGlyUmVjb3JkIHJlY29yZCA9IG5ldyBUYWdEaXJSZWNvcmQoKTsKLQkJcmVjb3JkLnBhdGggPSB0YWdkaXIuZ2V0RnVsbFBhdGgoKTsKLQkJcmVjb3JkLmluZm8gPSBuZXcgVGFnbGliSW5mbygpOwotCQkvLyA4LjQuMwotCQlpZiAodGFnZGlyLmdldE5hbWUoKS5lcXVhbHMoInRhZ3MiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmVjb3JkLmluZm8uc2hvcnROYW1lID0gInRhZ3MiOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgewotCQkJYm9vbGVhbiBkZXRlcm1pbmVkID0gZmFsc2U7Ci0JCQlJUGF0aCBwYXRoID0gdGFnZGlyUGF0aDsKLQkJCVN0cmluZ1tdIHNlZ21lbnRzID0gcGF0aC5zZWdtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChzZWdtZW50c1tpIC0gMV0uZXF1YWxzKCJXRUItSU5GIikgJiYgc2VnbWVudHNbaV0uZXF1YWxzKCJ0YWdzIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCUlQYXRoIHRhZ2RpckxvY2FsUGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhpICsgMSk7Ci0JCQkJCXJlY29yZC5pbmZvLnNob3J0TmFtZSA9IFN0cmluZ1V0aWxzLnJlcGxhY2UodGFnZGlyTG9jYWxQYXRoLnRvU3RyaW5nKCksICIvIiwgIi0iKTsKLQkJCQkJZGV0ZXJtaW5lZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFkZXRlcm1pbmVkKSB7Ci0JCQkJcmVjb3JkLmluZm8uc2hvcnROYW1lID0gU3RyaW5nVXRpbHMucmVwbGFjZSh0YWdkaXJQYXRoLnRvU3RyaW5nKCksICIvIiwgIi0iKTsKLQkJCX0KLQkJfQotCQkvLyA4LjQuMwotCQlyZWNvcmQuaW5mby50bGliVmVyc2lvbiA9ICIxLjAiOwotCQlyZWNvcmQuaW5mby5kZXNjcmlwdGlvbiA9ICIiOwotCQlyZWNvcmQuaW5mby5kaXNwbGF5TmFtZSA9ICIiOwotCQlyZWNvcmQuaW5mby5zbWFsbEljb24gPSAiIjsKLQkJcmVjb3JkLmluZm8ubGFyZ2VJY29uID0gIiI7Ci0KLQkJdHJ5IHsKLQkJCUlSZXNvdXJjZVtdIHRhZ2ZpbGVzID0gdGFnZGlyLm1lbWJlcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFnZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodGFnZmlsZXNbaV0uZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJCQljb250aW51ZTsKLQkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gdGFnZmlsZXNbaV0uZ2V0RmlsZUV4dGVuc2lvbigpOwotCQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCAmJiAoZXh0ZW5zaW9uLmVxdWFscygidGFnIikgfHwgZXh0ZW5zaW9uLmVxdWFscygidGFneCIpKSkgewotCQkJCQlyZWNvcmQudGFncy5hZGQodGFnZmlsZXNbaV0uZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCi0JCXJldHVybiByZWNvcmQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVExEUmVjb3JkIGNyZWF0ZVRMRFJlY29yZChJUmVzb3VyY2UgdGxkKSB7Ci0JCVRMRFJlY29yZCByZWNvcmQgPSBuZXcgVExEUmVjb3JkKCk7Ci0JCXJlY29yZC5wYXRoID0gdGxkLmdldEZ1bGxQYXRoKCk7Ci0JCUlucHV0U3RyZWFtIGNvbnRlbnRzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmICh0bGQuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQljb250ZW50cyA9ICgoSUZpbGUpIHRsZCkuZ2V0Q29udGVudHModHJ1ZSk7Ci0JCQkJU3RyaW5nIGJhc2VQYXRoID0gdGxkLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQlUYWdsaWJJbmZvIGluZm8gPSBleHRyYWN0SW5mbyhiYXNlUGF0aCwgY29udGVudHMpOwotCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJcmVjb3JkLmluZm8gPSBpbmZvOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJCQljb250ZW50cy5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlY29yZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5zdXJlVXBUb2RhdGUoKSB7Ci0JCXRyeSB7Ci0JCQlMT0NLLmFjcXVpcmUoKTsKLQotCQkJaWYgKCFmQnVpbGRQYXRoSXNEaXJ0eSkgewotCQkJCS8qCi0JCQkJICogRG91YmxlLWNoZWNrIHRoYXQgdGhlIG51bWJlciBvZiBidWlsZCBwYXRoIGVudHJpZXMgaGFzIG5vdAotCQkJCSAqIGNoYW5nZWQuIFRoaXMgc2hvdWxkIGNvdmVyIG1vc3QgY2FzZXMgc3VjaCBhcyB3aGVuIGEKLQkJCQkgKiBsaWJyYXJ5IGlzIGFkZGVkIGludG8gb3IgcmVtb3ZlZCBmcm9tIGEgY29udGFpbmVyLgotCQkJCSAqLwotCQkJCXRyeSB7Ci0JCQkJCUlKYXZhUHJvamVjdCBqcHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShmUHJvamVjdCk7Ci0JCQkJCWlmIChqcHJvamVjdCAhPSBudWxsICYmIGpwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0ganByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7Ci0JCQkJCQlmQnVpbGRQYXRoSXNEaXJ0eSA9IChmQnVpbGRQYXRoRW50cnlDb3VudCAhPSBlbnRyaWVzLmxlbmd0aCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZCdWlsZFBhdGhJc0RpcnR5KSB7Ci0JCQkJaW5kZXhDbGFzc3BhdGgoKTsKLQkJCQlmQnVpbGRQYXRoSXNEaXJ0eSA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFRhZ2xpYkluZm8gZXh0cmFjdEluZm8oU3RyaW5nIGJhc2VQYXRoLCBJbnB1dFN0cmVhbSB0bGRDb250ZW50cykgewotCQlUYWdsaWJJbmZvIGluZm8gPSBuZXcgVGFnbGliSW5mbygpOwotCQlpZiAodGxkQ29udGVudHMgIT0gbnVsbCkgewotCQkJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBEb2N1bWVudFByb3ZpZGVyKCk7Ci0JCQlwcm92aWRlci5zZXRJbnB1dFN0cmVhbSh0bGRDb250ZW50cyk7Ci0JCQlwcm92aWRlci5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQkJCXByb3ZpZGVyLnNldFJvb3RFbGVtZW50TmFtZShKU1AxMlRMRE5hbWVzLlRBR0xJQik7Ci0JCQlwcm92aWRlci5zZXRCYXNlUmVmZXJlbmNlKGJhc2VQYXRoKTsKLQkJCU5vZGUgY2hpbGQgPSBwcm92aWRlci5nZXRSb290RWxlbWVudCgpOwotCQkJaWYgKGNoaWxkID09IG51bGwgfHwgY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSB8fCAhY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5UQUdMSUIpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDEyVExETmFtZXMuVVJJKSkgewotCQkJCQkJaW5mby51cmkgPSBnZXRUZXh0Q29udGVudHMoY2hpbGQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDEyVExETmFtZXMuU0hPUlRfTkFNRSkgfHwgY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTFUTEROYW1lcy5TSE9SVE5BTUUpKSB7Ci0JCQkJCQlpbmZvLnNob3J0TmFtZSA9IGdldFRleHRDb250ZW50cyhjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikgfHwgY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTFUTEROYW1lcy5JTkZPKSkgewotCQkJCQkJaW5mby5kZXNjcmlwdGlvbiA9IGdldFRleHRDb250ZW50cyhjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ESVNQTEFZX05BTUUpKSB7Ci0JCQkJCQlpbmZvLmRpc3BsYXlOYW1lID0gZ2V0VGV4dENvbnRlbnRzKGNoaWxkKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMlRMRE5hbWVzLkpTUF9WRVJTSU9OKSB8fCBjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMVRMRE5hbWVzLkpTUFZFUlNJT04pKSB7Ci0JCQkJCQlpbmZvLmpzcFZlcnNpb24gPSBnZXRUZXh0Q29udGVudHMoY2hpbGQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDEyVExETmFtZXMuVExJQl9WRVJTSU9OKSB8fCBjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMVRMRE5hbWVzLlRMSUJWRVJTSU9OKSkgewotCQkJCQkJaW5mby50bGliVmVyc2lvbiA9IGdldFRleHRDb250ZW50cyhjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OKSkgewotCQkJCQkJaW5mby5zbWFsbEljb24gPSBnZXRUZXh0Q29udGVudHMoY2hpbGQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTikpIHsKLQkJCQkJCWluZm8ubGFyZ2VJY29uID0gZ2V0VGV4dENvbnRlbnRzKGNoaWxkKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JTGlzdCBnZXRBdmFpbGFibGVUYWdsaWJSZWNvcmRzKElQYXRoIHBhdGgpIHsKLQkJZW5zdXJlVXBUb2RhdGUoKTsKLQkJQ29sbGVjdGlvbiByZWNvcmRzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZsb2F0IGpzcFZlcnNpb24gPSBEZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGUuZ2V0SW5zdGFuY2UoKS5nZXRKU1BWZXJzaW9uKHBhdGgpOwotCQkJTE9DSy5hY3F1aXJlKCk7Ci0KLQkJCUNvbGxlY3Rpb24gaW1wbGljaXRSZWZlcmVuY2VzID0gbmV3IEhhc2hTZXQoZ2V0SW1wbGljaXRSZWZlcmVuY2VzKHBhdGgudG9TdHJpbmcoKSkudmFsdWVzKCkpOwotCQkJcmVjb3JkcyA9IG5ldyBBcnJheUxpc3QoZlRMRFJlZmVyZW5jZXMuc2l6ZSgpICsgZlRhZ0RpclJlZmVyZW5jZXMuc2l6ZSgpICsgZkpBUlJlZmVyZW5jZXMuc2l6ZSgpICsgZldlYlhNTFJlZmVyZW5jZXMuc2l6ZSgpKTsKLQkJCXJlY29yZHMuYWRkQWxsKGZUTERSZWZlcmVuY2VzLnZhbHVlcygpKTsKLQkJCWlmIChqc3BWZXJzaW9uID49IDEuMSkgewotCQkJCXJlY29yZHMuYWRkQWxsKF9nZXRKU1AxMUFuZFdlYlhNTEphclJlZmVyZW5jZXMoZkpBUlJlZmVyZW5jZXMudmFsdWVzKCkpKTsKLQkJCX0KLQotCQkJaWYgKGpzcFZlcnNpb24gPj0gMS4yKSB7Ci0JCQkJcmVjb3Jkcy5hZGRBbGwoaW1wbGljaXRSZWZlcmVuY2VzKTsKLQotCQkJCU1hcCBidWlsZFBhdGhSZWZlcmVuY2VzID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlMaXN0IHByb2plY3RzUHJvY2Vzc2VkID0gbmV3IEFycmF5TGlzdChmQ2xhc3NwYXRoUHJvamVjdHMuc2l6ZSgpICsgMSk7Ci0JCQkJcHJvamVjdHNQcm9jZXNzZWQuYWRkKGZQcm9qZWN0KTsKLQkJCQlhZGRCdWlsZFBhdGhSZWZlcmVuY2VzKGJ1aWxkUGF0aFJlZmVyZW5jZXMsIHByb2plY3RzUHJvY2Vzc2VkLCBmYWxzZSk7Ci0JCQkJcmVjb3Jkcy5hZGRBbGwoYnVpbGRQYXRoUmVmZXJlbmNlcy52YWx1ZXMoKSk7Ci0JCQl9Ci0JCQlpZiAoanNwVmVyc2lvbiA+PSAyLjApIHsKLQkJCQlyZWNvcmRzLmFkZEFsbChmVGFnRGlyUmVmZXJlbmNlcy52YWx1ZXMoKSk7Ci0JCQl9Ci0KLQkJCXJlY29yZHMuYWRkQWxsKGdldENhdGFsb2dSZWNvcmRzKCkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBBcnJheUxpc3QocmVjb3Jkcyk7Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZXMgYSBzdHJlYW0gdG8gYSBsb2NhbCBjb3B5IG9mIHRoZSBpbnB1dCBvciBudWxsIGlmIG5vdCBwb3NzaWJsZQotCSAqLwotCXByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0Q2FjaGVkSW5wdXRTdHJlYW0oWmlwRmlsZSB6aXBGaWxlLCBaaXBFbnRyeSB6aXBFbnRyeSkgewotCQlJbnB1dFN0cmVhbSBjYWNoZSA9IG51bGw7Ci0JCWlmICh6aXBGaWxlICE9IG51bGwpIHsKLQkJCWlmICh6aXBFbnRyeSAhPSBudWxsKSB7Ci0JCQkJSW5wdXRTdHJlYW0gZW50cnlJbnB1dFN0cmVhbSA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJZW50cnlJbnB1dFN0cmVhbSA9IHppcEZpbGUuZ2V0SW5wdXRTdHJlYW0oemlwRW50cnkpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gaW9FeGMpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiVGFnbGliIEluZGV4OiAiICsgemlwRmlsZS5nZXROYW1lKCksIGlvRXhjKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJCWlmIChlbnRyeUlucHV0U3RyZWFtICE9IG51bGwpIHsKLQkJCQkJaW50IGM7Ci0JCQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWZmZXIgPSBudWxsOwotCQkJCQlpZiAoemlwRW50cnkuZ2V0U2l6ZSgpID4gMCkgewotCQkJCQkJYnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgoaW50KSB6aXBFbnRyeS5nZXRTaXplKCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCQl9Ci0JCQkJCS8vIGFycmF5IGRpbSByZXN0cmljdGlvbj8KLQkJCQkJYnl0ZSBieXRlc1tdID0gbmV3IGJ5dGVbMjA0OF07Ci0JCQkJCXRyeSB7Ci0JCQkJCQl3aGlsZSAoKGMgPSBlbnRyeUlucHV0U3RyZWFtLnJlYWQoYnl0ZXMpKSA+PSAwKSB7Ci0JCQkJCQkJYnVmZmVyLndyaXRlKGJ5dGVzLCAwLCBjKTsKLQkJCQkJCX0KLQkJCQkJCWNhY2hlID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZmZlci50b0J5dGVBcnJheSgpKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJCQkvLyBubyBjbGVhbnVwIGNhbiBiZSBkb25lCi0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWVudHJ5SW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2FjaGU7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldENhdGFsb2dSZWNvcmRzKCkgewotCQlpZiAoZkNhdGFsb2dSZWNvcmRzID09IG51bGwpIHsKLQkJCUxpc3QgcmVjb3JkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlDYXRhbG9nIGRlZmF1bHRDYXRhbG9nID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLQkJCWlmIChkZWZhdWx0Q2F0YWxvZyAhPSBudWxsKSB7Ci0JCQkJLy8gUHJvY2VzcyBkZWZhdWx0IGNhdGFsb2cKLQkJCQlJQ2F0YWxvZ0VudHJ5W10gZW50cmllcyA9IGRlZmF1bHRDYXRhbG9nLmdldENhdGFsb2dFbnRyaWVzKCk7Ci0JCQkJZm9yIChpbnQgZW50cnkgPSAwOyBlbnRyeSA8IGVudHJpZXMubGVuZ3RoOyBlbnRyeSsrKSB7Ci0JCQkJCUlUYWdsaWJSZWNvcmQgcmVjb3JkID0gY3JlYXRlQ2F0YWxvZ1JlY29yZChlbnRyaWVzW2VudHJ5XSk7Ci0JCQkJCXJlY29yZHMuYWRkKHJlY29yZCk7Ci0JCQkJfQotCi0JCQkJLy8gUHJvY2VzcyBkZWNsYXJlZCBPQVNJUyBuZXh0Q2F0YWxvZ3MgY2F0YWxvZwotCQkJCUlOZXh0Q2F0YWxvZ1tdIG5leHRDYXRhbG9ncyA9IGRlZmF1bHRDYXRhbG9nLmdldE5leHRDYXRhbG9ncygpOwotCQkJCWZvciAoaW50IG5leHRDYXRhbG9nID0gMDsgbmV4dENhdGFsb2cgPCBuZXh0Q2F0YWxvZ3MubGVuZ3RoOyBuZXh0Q2F0YWxvZysrKSB7Ci0JCQkJCUlDYXRhbG9nIGNhdGFsb2cgPSBuZXh0Q2F0YWxvZ3NbbmV4dENhdGFsb2ddLmdldFJlZmVyZW5jZWRDYXRhbG9nKCk7Ci0JCQkJCUlDYXRhbG9nRW50cnlbXSBlbnRyaWVzMiA9IGNhdGFsb2cuZ2V0Q2F0YWxvZ0VudHJpZXMoKTsKLQkJCQkJZm9yIChpbnQgZW50cnkgPSAwOyBlbnRyeSA8IGVudHJpZXMyLmxlbmd0aDsgZW50cnkrKykgewotCQkJCQkJU3RyaW5nIHVyaSA9IGVudHJpZXMyW2VudHJ5XS5nZXRVUkkoKTsKLQkJCQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCQkJCXVyaSA9IHVyaS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpOwotCQkJCQkJCWlmICh1cmkuZW5kc1dpdGgoKCIuamFyIikpIHx8IHVyaS5lbmRzV2l0aCgoIi50bGQiKSkpIHsKLQkJCQkJCQkJSVRhZ2xpYlJlY29yZCByZWNvcmQgPSBjcmVhdGVDYXRhbG9nUmVjb3JkKGVudHJpZXMyW2VudHJ5XSk7Ci0JCQkJCQkJCWlmIChyZWNvcmQgIT0gbnVsbCkgewotCQkJCQkJCQkJcmVjb3Jkcy5hZGQocmVjb3JkKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZDYXRhbG9nUmVjb3JkcyA9IHJlY29yZHM7Ci0JCX0KLQkJcmV0dXJuIGZDYXRhbG9nUmVjb3JkczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGltcGxpY2l0UmVmZXJlbmNlcyBmb3IgdGhlIGdpdmVuIHBhdGgKLQkgKi8KLQlIYXNodGFibGUgZ2V0SW1wbGljaXRSZWZlcmVuY2VzKFN0cmluZyBwYXRoKSB7Ci0JCVN0cmluZyBsb2NhbFJvb3QgPSBnZXRMb2NhbFJvb3QocGF0aCk7Ci0JCUhhc2h0YWJsZSBpbXBsaWNpdFJlZmVyZW5jZXMgPSAoSGFzaHRhYmxlKSBmSW1wbGljaXRSZWZlcmVuY2VzLmdldChsb2NhbFJvb3QpOwotCQlpZiAoaW1wbGljaXRSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWltcGxpY2l0UmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMSk7Ci0JCQlmSW1wbGljaXRSZWZlcmVuY2VzLnB1dChsb2NhbFJvb3QsIGltcGxpY2l0UmVmZXJlbmNlcyk7Ci0JCX0KLQkJcmV0dXJuIGltcGxpY2l0UmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiBAcmV0dXJuIHRoZSBhcHBsaWNhYmxlIFdlYiBjb250ZXh0IHJvb3QgcGF0aCwgaWYgb25lIGV4aXN0cwotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JSVBhdGggZ2V0TG9jYWxSb290KElQYXRoIGJhc2VQYXRoKSB7Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCi0JCS8vIGV4aXN0aW5nIHdvcmtzcGFjZSByZXNvdXJjZXMgLSB0aGlzIGlzIHRoZSA5MyUgY2FzZQotCQlJUmVzb3VyY2UgZmlsZSA9IEZpbGVCdWZmZXJzLmdldFdvcmtzcGFjZUZpbGVBdExvY2F0aW9uKGJhc2VQYXRoKTsKLQotCQkvLyBUcnkgdGhlIGJhc2UgcGF0aCBhcyBhIGZvbGRlciBmaXJzdAotCQlpZiAoZmlsZSA9PSBudWxsICYmIGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0Rm9sZGVyKGJhc2VQYXRoKTsKLQkJfQotCQkvLyBJZiBub3QgYSBmb2xkZXIsIHRoZW4gdHJ5IGJhc2UgcGF0aCBhcyBhIGZpbGUKLQkJaWYgKGZpbGUgIT0gbnVsbCAmJiAhZmlsZS5leGlzdHMoKSAmJiBiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCWZpbGUgPSB3b3Jrc3BhY2VSb290LmdldEZpbGUoYmFzZVBhdGgpOwotCQl9Ci0KLQkJaWYgKGZpbGUgPT0gbnVsbCAmJiBiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA9PSAxKSB7Ci0JCQlmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0KGJhc2VQYXRoLnNlZ21lbnQoMCkpOwotCQl9Ci0KLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJLyoKLQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTY1MjkKLQkJCSAqIAotCQkJICogVGhpcyBtZXRob2QgcHJvZHVjZXMgYSBsZXNzIGFjY3VyYXRlIHJlc3VsdCwgYnV0IGRvZXNuJ3QKLQkJCSAqIHJlcXVpcmUgdGhhdCB0aGUgZmlsZSBleGlzdCB5ZXQuCi0JCQkgKi8KLQkJCUlGaWxlW10gZmlsZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uKGJhc2VQYXRoKTsKLQkJCWlmIChmaWxlcy5sZW5ndGggPiAwKQotCQkJCWZpbGUgPSBmaWxlc1swXTsKLQkJfQotCi0JCXdoaWxlIChmaWxlICE9IG51bGwpIHsKLQkJCS8qKgotCQkJICogVHJlYXQgYW55IHBhcmVudCBmb2xkZXIgd2l0aCBhIFdFQi1JTkYgc3ViZm9sZGVyIGFzIGEgd2ViLWFwcAotCQkJICogcm9vdAotCQkJICovCi0JCQlJQ29udGFpbmVyIGZvbGRlciA9IG51bGw7Ci0JCQlpZiAoKGZpbGUuZ2V0VHlwZSgpICYgSVJlc291cmNlLkZPTERFUikgIT0gMCkgewotCQkJCWZvbGRlciA9IChJQ29udGFpbmVyKSBmaWxlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZm9sZGVyID0gZmlsZS5nZXRQYXJlbnQoKTsKLQkJCX0KLQkJCS8vIGdldEZvbGRlciBvbiBhIHdvcmtzcGFjZSByb290IG11c3QgdXNlIGEgZnVsbCBwYXRoLCBza2lwCi0JCQlpZiAoZm9sZGVyICE9IG51bGwgJiYgKGZvbGRlci5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuUk9PVCkgPT0gMCkgewotCQkJCUlGb2xkZXIgd2ViaW5mID0gZm9sZGVyLmdldEZvbGRlcihXRUJfSU5GX1BBVEgpOwotCQkJCWlmICh3ZWJpbmYgIT0gbnVsbCAmJiB3ZWJpbmYuZXhpc3RzKCkpIHsKLQkJCQkJcmV0dXJuIGZvbGRlci5nZXRGdWxsUGF0aCgpOwotCQkJCX0KLQkJCX0KLQkJCWZpbGUgPSBmaWxlLmdldFBhcmVudCgpOwotCQl9Ci0KLQkJcmV0dXJuIGZQcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldExvY2FsUm9vdChTdHJpbmcgYmFzZVBhdGgpIHsKLQkJcmV0dXJuIGdldExvY2FsUm9vdChuZXcgUGF0aChiYXNlUGF0aCkpLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dENvbnRlbnRzKE5vZGUgcGFyZW50KSB7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKGNoaWxkcmVuLmdldExlbmd0aCgpID09IDEpIHsKLQkJCXJldHVybiBjaGlsZHJlbi5pdGVtKDApLmdldE5vZGVWYWx1ZSgpLnRyaW0oKTsKLQkJfQotCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTm9kZSBjaGlsZCA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkgewotCQkJCVN0cmluZyByZWZlcmVuY2UgPSAoKEVudGl0eVJlZmVyZW5jZSkgY2hpbGQpLmdldE5vZGVWYWx1ZSgpOwotCQkJCWlmIChyZWZlcmVuY2UgPT0gbnVsbCAmJiBjaGlsZC5nZXROb2RlTmFtZSgpICE9IG51bGwpIHsKLQkJCQkJcmVmZXJlbmNlID0gIiYiICsgY2hpbGQuZ2V0Tm9kZU5hbWUoKSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkgewotCQkJCQlzLmFwcGVuZChyZWZlcmVuY2UudHJpbSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzLmFwcGVuZChjaGlsZC5nZXROb2RlVmFsdWUoKS50cmltKCkpOwotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBzLnRvU3RyaW5nKCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmlzaXRvci4KLQkgKi8KLQlJUmVzb3VyY2VEZWx0YVZpc2l0b3IgZ2V0VmlzaXRvcigpIHsKLQkJaWYgKGZWaXNpdG9yID09IG51bGwpIHsKLQkJCWZWaXNpdG9yID0gbmV3IERlbHRhVmlzaXRvcigpOwotCQl9Ci0JCXJldHVybiBmVmlzaXRvcjsKLQl9Ci0KLQl2b2lkIGhhbmRsZUVsZW1lbnRDaGFuZ2VkKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmIChmQnVpbGRQYXRoSXNEaXJ0eSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgIklKYXZhRWxlbWVudERlbHRhOiAiICsgZGVsdGEpOwotCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGRlbHRhLmdldEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UICYmICgoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQpLmlzQXJjaGl2ZSgpKSB7Ci0JCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UICYmICgoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQpLmlzRXh0ZXJuYWwoKSkgewotCQkJfQotCQkJU3RyaW5nIGxpYkxvY2F0aW9uID0gbnVsbDsKLQkJCWludCB0YWdsaWJSZWNvcmRFdmVudEtpbmQgPSAtMTsKLQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQURERURfVE9fQ0xBU1NQQVRIKSA+IDAgfHwgKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0FSQ0hJVkVfQ09OVEVOVF9DSEFOR0VEKSA+IDAgfHwgKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1JFTU9WRURfRlJPTV9DTEFTU1BBVEgpID4gMCkgewotCQkJCXRhZ2xpYlJlY29yZEV2ZW50S2luZCA9IElUYWdsaWJJbmRleERlbHRhLkFEREVEOwotCQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZWxlbWVudC5nZXRQYXRoKCkpOwotCQkJCWlmIChmaWxlLmlzQWNjZXNzaWJsZSgpICYmIGZpbGUuZ2V0TG9jYXRpb24oKSAhPSBudWxsKQotCQkJCQlsaWJMb2NhdGlvbiA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJCWVsc2UKLQkJCQkJbGliTG9jYXRpb24gPSBlbGVtZW50LmdldFBhdGgoKS50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKGxpYkxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQlib29sZWFuIGZyYWdtZW50aXNFeHBvcnRlZCA9IHRydWU7Ci0JCQkJdHJ5IHsKLQkJCQkJSUNsYXNzcGF0aEVudHJ5IHJhd0NsYXNzcGF0aEVudHJ5ID0gKChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudCkuZ2V0UmF3Q2xhc3NwYXRoRW50cnkoKTsKLQkJCQkJLyoKLQkJCQkJICogbnVsbCBtYXkgYWxzbyBiZSByZXR1cm5lZCBmb3IgZGVsZXRpb25zIGRlcGVuZGluZyBvbgotCQkJCQkgKiByZXNvdXJjZS9idWlsZCBwYXRoIG5vdGlmaWNhdGlvbiBvcmRlci4gSWYgaXQncyBudWxsLAotCQkJCQkgKiBpdCdzIGJlZW4gZGVsZXRlZCBhbmQgd2hldGhlciBpdCdzIGV4cG9ydGVkIHdvbid0Ci0JCQkJCSAqIHJlYWxseSBtYXR0ZXIKLQkJCQkJICovCi0JCQkJCWlmIChyYXdDbGFzc3BhdGhFbnRyeSAhPSBudWxsKSB7Ci0JCQkJCQlmcmFnbWVudGlzRXhwb3J0ZWQgPSByYXdDbGFzc3BhdGhFbnRyeS5pc0V4cG9ydGVkKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIlByb2JsZW0gaGFuZGxpbmcgYnVpbGQgcGF0aCBlbnRyeSBmb3IgIiArIGVsZW1lbnQuZ2V0UGF0aCgpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0FEREVEX1RPX0NMQVNTUEFUSCkgPiAwKSB7Ci0JCQkJCWZCdWlsZFBhdGhFbnRyeUNvdW50Kys7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRIKSA+IDApIHsKLQkJCQkJZkJ1aWxkUGF0aEVudHJ5Q291bnQtLTsKLQkJCQl9Ci0JCQkJdXBkYXRlQ2xhc3NwYXRoTGlicmFyeShsaWJMb2NhdGlvbiwgdGFnbGliUmVjb3JkRXZlbnRLaW5kLCBmcmFnbWVudGlzRXhwb3J0ZWQpOwotCQkJfQotCQkJaWYgKF9kZWJ1Z0luZGV4VGltZSkKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAicHJvY2Vzc2VkIGJ1aWxkIHBhdGggZGVsdGEgZm9yICIgKyBmUHJvamVjdC5nZXROYW1lKCkgKyAiKCIgKyBlbGVtZW50LmdldFBhdGgoKSArICIpIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCX0KLQotCXZvaWQgaW5kZXgoKSB7Ci0JCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJZlRMRFJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJZkpBUlJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJZlRhZ0RpclJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJZldlYlhNTFJlZmVyZW5jZXMuY2xlYXIoKTsKLQotCQl0cnkgewotCQkJZlByb2plY3QuYWNjZXB0KG5ldyBJbmRleGVyKCksIDApOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQotCQlpZiAoX2RlYnVnSW5kZXhUaW1lKQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgImluZGV4ZWQgIiArIGZQcm9qZWN0LmdldE5hbWUoKSArICIgY29udGVudHMgaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCXZvaWQgaW5kZXhDbGFzc3BhdGgoKSB7Ci0JCWlmIChfZGVidWdJbmRleFRpbWUpCi0JCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlmQ2xhc3NwYXRoUHJvamVjdHMuY2xlYXIoKTsKLQkJZkNsYXNzcGF0aFJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJZkNsYXNzcGF0aEphcnMuY2xlYXIoKTsKLQkJZkJ1aWxkUGF0aEVudHJ5Q291bnQgPSAwOwotCi0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShmUHJvamVjdCk7Ci0JCS8qCi0JCSAqIElmIHRoZSBKYXZhIG5hdHVyZSBpc24ndCBwcmVzZW50IChvciBzb21ldGhpbmcgZWxzZSBpcyB3cm9uZyksCi0JCSAqIGRvbid0IGNoZWNrIHRoZSBidWlsZCBwYXRoLgotCQkgKi8KLQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwgJiYgamF2YVByb2plY3QuZXhpc3RzKCkpIHsKLQkJCWluZGV4Q2xhc3NwYXRoKGphdmFQcm9qZWN0KTsKLQkJfQotCQkvLyBlbHNlIHsKLQkJLy8gTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIlRhZ2xpYkluZGV4IHdhcyBhc2tlZCB0byBpbmRleCBub24tSmF2YQotCQkvLyBQcm9qZWN0ICIgKyBmUHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCS8vIH0KLQotCQlpZiAoX2RlYnVnSW5kZXhUaW1lKQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgImluZGV4ZWQgIiArIGZQcm9qZWN0LmdldE5hbWUoKSArICIgY2xhc3NwYXRoIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZW50cnkKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5kZXhDbGFzc3BhdGgoSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7Ci0JCXN3aXRjaCAoZW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgOiB7Ci0JCQkJSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSAoSUNsYXNzcGF0aENvbnRhaW5lcikgZW50cnk7Ci0JCQkJSUNsYXNzcGF0aEVudHJ5W10gY29udGFpbmVkRW50cmllcyA9IGNvbnRhaW5lci5nZXRDbGFzc3BhdGhFbnRyaWVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZWRFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWluZGV4Q2xhc3NwYXRoKGNvbnRhaW5lZEVudHJpZXNbaV0pOwotCQkJCX0KLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDogewotCQkJCS8qCi0JCQkJICogSWdub3JlIGxpYnMgaW4gcmVxdWlyZWQgcHJvamVjdHMgdGhhdCBhcmUgbm90IGV4cG9ydGVkCi0JCQkJICovCi0JCQkJSVBhdGggbGliUGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJCQlpZiAoIWZDbGFzc3BhdGhKYXJzLmNvbnRhaW5zS2V5KGxpYlBhdGgudG9TdHJpbmcoKSkpIHsKLQkJCQkJaWYgKGxpYlBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQkJCXVwZGF0ZUNsYXNzcGF0aExpYnJhcnkobGliUGF0aC50b1N0cmluZygpLCBJVGFnbGliSW5kZXhEZWx0YS5BRERFRCwgZW50cnkuaXNFeHBvcnRlZCgpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8qCi0JCQkJCQkgKiBOb3RlOiAuamFycyBvbiB0aGUgY2xhc3NwYXRoIGluc2lkZSBvZiB0aGUgcHJvamVjdAotCQkJCQkJICogd2lsbCBoYXZlIGR1cGxpY2F0ZSBlbnRyaWVzIGluIHRoZSBKQVIgcmVmZXJlbmNlcwotCQkJCQkJICogdGFibGUgdGhhdCB3aWxsIGUgcmV0dXJuZWQgdG8KLQkJCQkJCSAqIGdldEF2YWlsYWJsZVRhZ2xpYlJlY29yZHMoKS4KLQkJCQkJCSAqLwotCQkJCQkJSUZpbGUgbGliRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShsaWJQYXRoKTsKLQkJCQkJCWlmIChsaWJGaWxlICE9IG51bGwgJiYgbGliRmlsZS5leGlzdHMoKSkgewotCQkJCQkJCXVwZGF0ZUNsYXNzcGF0aExpYnJhcnkobGliRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCksIElUYWdsaWJJbmRleERlbHRhLkFEREVELCBlbnRyeS5pc0V4cG9ydGVkKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOiB7Ci0JCQkJLyoKLQkJCQkgKiBXZSdyZSBjdXJyZW50bHkgaWdub3Jpbmcgd2hldGhlciB0aGUgcHJvamVjdCBleHBvcnRzIGFsbCBvZgotCQkJCSAqIGl0cyBidWlsZCBwYXRoCi0JCQkJICovCi0JCQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChlbnRyeS5nZXRQYXRoKCkubGFzdFNlZ21lbnQoKSk7Ci0JCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCQlmQ2xhc3NwYXRoUHJvamVjdHMuYWRkKHByb2plY3QpOwotCQkJCX0KLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgOgotCQkJCWJyZWFrOwotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFIDogewotCQkJCUlQYXRoIGxpYlBhdGggPSBKYXZhQ29yZS5nZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChlbnRyeS5nZXRQYXRoKCkpOwotCQkJCWlmIChsaWJQYXRoICE9IG51bGwpIHsKLQkJCQkJRmlsZSBmaWxlID0gbGliUGF0aC50b0ZpbGUoKTsKLQotCQkJCQkvLyBmaWxlIGluIGZpbGVzeXN0ZW0KLQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkgJiYgIWZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCQkJdXBkYXRlQ2xhc3NwYXRoTGlicmFyeShsaWJQYXRoLnRvU3RyaW5nKCksIElUYWdsaWJSZWNvcmRFdmVudC5BRERFRCwgZW50cnkuaXNFeHBvcnRlZCgpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIHdvcmtzcGFjZSBmaWxlCi0JCQkJCQlJRmlsZSBqYXJGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGxpYlBhdGgpOwotCQkJCQkJaWYgKGphckZpbGUuaXNBY2Nlc3NpYmxlKCkgJiYgamFyRmlsZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgamFyRmlsZS5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCQkJCQlTdHJpbmcgamFyUGF0aFN0cmluZyA9IGphckZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJCQkJCXVwZGF0ZUNsYXNzcGF0aExpYnJhcnkoamFyUGF0aFN0cmluZywgSVRhZ2xpYlJlY29yZEV2ZW50LkFEREVELCBlbnRyeS5pc0V4cG9ydGVkKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBwcml2YXRlIHZvaWQgcmVtb3ZlQ2xhc3NwYXRoTGlicmFyeShTdHJpbmcgbGlicmFyeUxvY2F0aW9uKSB7IEphclJlY29yZAotCSAqIHJlY29yZCA9IChKYXJSZWNvcmQpIGZDbGFzc3BhdGhKYXJzLnJlbW92ZShsaWJyYXJ5TG9jYXRpb24pOyBpZiAocmVjb3JkICE9Ci0JICogbnVsbCkgeyBVUkxSZWNvcmRbXSByZWNvcmRzID0gKFVSTFJlY29yZFtdKQotCSAqIHJlY29yZC5nZXRVUkxSZWNvcmRzKCkudG9BcnJheShuZXcgVVJMUmVjb3JkWzBdKTsgZm9yIChpbnQgaSA9IDA7IGkgPAotCSAqIHJlY29yZHMubGVuZ3RoOyBpKyspIHsKLQkgKiBmQ2xhc3NwYXRoUmVmZXJlbmNlcy5yZW1vdmUocmVjb3Jkc1tpXS5nZXRVUkkoKSk7IH0KLQkgKiBUYWdsaWJJbmRleC5maXJlVGFnbGliUmVjb3JkRXZlbnQobmV3IFRhZ2xpYlJlY29yZEV2ZW50KHJlY29yZCwKLQkgKiBJVGFnbGliSW5kZXhEZWx0YS5SRU1PVkVEKSk7IH0gfQotCSAqLwotCi0JLyoqCi0JICogQHBhcmFtIGphdmFQcm9qZWN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGluZGV4Q2xhc3NwYXRoKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdC5lcXVhbHMoZlByb2plY3QpKSB7Ci0JCQl0cnkgewotCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKLQkJCQlmQnVpbGRQYXRoRW50cnlDb3VudCA9IGVudHJpZXMubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCQlpbmRleENsYXNzcGF0aChlbnRyaWVzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFcnJvciBzZWFyY2hpbmcgSmF2YSBCdWlsZCBQYXRoICsgKCIgKyBmUHJvamVjdC5nZXROYW1lKCkgKyAiKSBmb3IgdGFnIGxpYnJhcmllcyIsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIHJlYWRUZXh0b2ZDaGlsZChOb2RlIG5vZGUsIFN0cmluZyBjaGlsZE5hbWUpIHsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKGNoaWxkTmFtZSkpIHsKLQkJCQlyZXR1cm4gZ2V0VGV4dENvbnRlbnRzKGNoaWxkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQl2b2lkIHJlbW92ZUpBUihJUmVzb3VyY2UgamFyKSB7Ci0JCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgInJlbW92aW5nIHJlY29yZHMgZm9yIEpBUiAiICsgamFyLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCUphclJlY29yZCByZWNvcmQgPSAoSmFyUmVjb3JkKSBmSkFSUmVmZXJlbmNlcy5yZW1vdmUoamFyLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCWlmIChyZWNvcmQgIT0gbnVsbCkgewotCQkJVVJMUmVjb3JkW10gcmVjb3JkcyA9IChVUkxSZWNvcmRbXSkgcmVjb3JkLmdldFVSTFJlY29yZHMoKS50b0FycmF5KG5ldyBVUkxSZWNvcmRbMF0pOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWNvcmRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5hZGREZWx0YShuZXcgVGFnbGliSW5kZXhEZWx0YShmUHJvamVjdCwgcmVjb3Jkc1tpXSwgSVRhZ2xpYkluZGV4RGVsdGEuUkVNT1ZFRCkpOwotCQkJCWdldEltcGxpY2l0UmVmZXJlbmNlcyhqYXIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKS5yZW1vdmUocmVjb3Jkc1tpXS5nZXRVUkkoKSk7Ci0JCQl9Ci0JCQlpZiAocmVjb3JkLmhhczExVExEKSB7Ci0JCQkJVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5hZGREZWx0YShuZXcgVGFnbGliSW5kZXhEZWx0YShmUHJvamVjdCwgcmVjb3JkLCBJVGFnbGliSW5kZXhEZWx0YS5SRU1PVkVEKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZVRhZyhJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJVGFnRGlyUmVjb3JkIHJlY29yZCA9IChUYWdEaXJSZWNvcmQpIGZUYWdEaXJSZWZlcmVuY2VzLmdldChyZXNvdXJjZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQlpZiAocmVjb3JkICE9IG51bGwpIHsKLQkJCXJlY29yZC50YWdzLnJlbW92ZShyZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5hZGREZWx0YShuZXcgVGFnbGliSW5kZXhEZWx0YShmUHJvamVjdCwgcmVjb3JkLCBJVGFnbGliSW5kZXhEZWx0YS5DSEFOR0VEKSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZVRhZ0RpcihJUmVzb3VyY2UgdGFnZGlyKSB7Ci0JCUlQYXRoIHRhZ2RpclBhdGggPSB0YWdkaXIuZ2V0RnVsbFBhdGgoKTsKLQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAicmVtb3ZpbmcgcmVjb3JkIGZvciAiICsgdGFnZGlyUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJSVRhZ2xpYlJlY29yZCByZWNvcmQgPSAoSVRhZ2xpYlJlY29yZCkgZlRhZ0RpclJlZmVyZW5jZXMucmVtb3ZlKHRhZ2RpclBhdGgudG9TdHJpbmcoKSk7Ci0JCWlmIChyZWNvcmQgIT0gbnVsbCkgewotCQkJVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5hZGREZWx0YShuZXcgVGFnbGliSW5kZXhEZWx0YShmUHJvamVjdCwgcmVjb3JkLCBJVGFnbGliSW5kZXhEZWx0YS5SRU1PVkVEKSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZVRMRChJUmVzb3VyY2UgdGxkKSB7Ci0JCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgInJlbW92aW5nIHJlY29yZCBmb3IgIiArIHRsZC5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQlUTERSZWNvcmQgcmVjb3JkID0gKFRMRFJlY29yZCkgZlRMRFJlZmVyZW5jZXMucmVtb3ZlKHRsZC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQlpZiAocmVjb3JkICE9IG51bGwpIHsKLQkJCWlmIChyZWNvcmQuZ2V0VVJJKCkgIT0gbnVsbCkgewotCQkJCWdldEltcGxpY2l0UmVmZXJlbmNlcyh0bGQuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKS5yZW1vdmUocmVjb3JkLmdldFVSSSgpKTsKLQkJCX0KLQkJCVRhZ2xpYkluZGV4LmdldEluc3RhbmNlKCkuYWRkRGVsdGEobmV3IFRhZ2xpYkluZGV4RGVsdGEoZlByb2plY3QsIHJlY29yZCwgSVRhZ2xpYkluZGV4RGVsdGEuUkVNT1ZFRCkpOwotCQl9Ci0JfQotCi0Jdm9pZCByZW1vdmVXZWJYTUwoSVJlc291cmNlIHdlYnhtbCkgewotCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJyZW1vdmluZyByZWNvcmRzIGZvciAiICsgd2VieG1sLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCVdlYlhNTFJlY29yZCByZWNvcmQgPSAoV2ViWE1MUmVjb3JkKSBmV2ViWE1MUmVmZXJlbmNlcy5yZW1vdmUod2VieG1sLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCWlmIChyZWNvcmQgIT0gbnVsbCkgewotCQkJVExEUmVjb3JkW10gcmVjb3JkcyA9IChUTERSZWNvcmRbXSkgcmVjb3JkLmdldFRMRFJlY29yZHMoKS50b0FycmF5KG5ldyBUTERSZWNvcmRbMF0pOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWNvcmRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJyZW1vdmVkIHJlY29yZCBmb3IgIiArIHJlY29yZHNbaV0uZ2V0VVJJKCkgKyAiQCIgKyByZWNvcmRzW2ldLnBhdGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlnZXRJbXBsaWNpdFJlZmVyZW5jZXMod2VieG1sLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkucmVtb3ZlKHJlY29yZHNbaV0uZ2V0VVJJKCkpOwotCQkJCVRhZ2xpYkluZGV4LmdldEluc3RhbmNlKCkuYWRkRGVsdGEobmV3IFRhZ2xpYkluZGV4RGVsdGEoZlByb2plY3QsIHJlY29yZHNbaV0sIElUYWdsaWJJbmRleERlbHRhLlJFTU9WRUQpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqIEBwYXJhbSByZWZlcmVuY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JSVRhZ2xpYlJlY29yZCByZXNvbHZlKFN0cmluZyBiYXNlUGF0aCwgU3RyaW5nIHJlZmVyZW5jZSkgewotCQllbnN1cmVVcFRvZGF0ZSgpOwotCi0JCUlUYWdsaWJSZWNvcmQgcmVjb3JkID0gbnVsbDsKLQkJU3RyaW5nIHBhdGggPSBudWxsOwotCQl0cnkgewotCQkJZmxvYXQganNwVmVyc2lvbiA9IERlcGxveW1lbnREZXNjcmlwdG9yUHJvcGVydHlDYWNoZS5nZXRJbnN0YW5jZSgpLmdldEpTUFZlcnNpb24obmV3IFBhdGgoYmFzZVBhdGgpKTsKLQotCQkJLyoqCi0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk2MTc3IFN1cHBvcnQKLQkJCSAqIHJlc29sdXRpb24gaW4gZmxleGlibGUgcHJvamVjdHMKLQkJCSAqLwotCQkJSVBhdGggcmVzb3VyY2VQYXRoID0gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5yZXNvbHZlKG5ldyBQYXRoKGJhc2VQYXRoKSwgcmVmZXJlbmNlKTsKLQkJCWlmIChyZXNvdXJjZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJaWYgKHJlc291cmNlUGF0aC50b1N0cmluZygpLnRvTG93ZXJDYXNlKExvY2FsZS5VUykuZW5kc1dpdGgoIi50bGQiKSkgeyAvLyROT04tTkxTLTEkIAotCQkJCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHJlc291cmNlUGF0aCk7Ci0JCQkJCWlmIChmaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQlwYXRoID0gcmVzb3VyY2VQYXRoLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAocmVzb3VyY2VQYXRoLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKS5lbmRzV2l0aCgiLmphciIpKSB7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocmVzb3VyY2VQYXRoKTsKLQkJCQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCXBhdGggPSByZXNvdXJjZVBhdGgudG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJTE9DSy5hY3F1aXJlKCk7Ci0KLQkJCS8qKgotCQkJICogV29ya2Fyb3VuZCBmb3IgcHJvYmxlbSBpbiBVUklIZWxwZXI7IHVyaXMgc3RhcnRpbmcgd2l0aCAnLycgYXJlCi0JCQkgKiByZXR1cm5lZCBhcy1pcy4KLQkJCSAqLwotCQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJCWlmIChyZWZlcmVuY2Uuc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcGF0aCA9IGdldExvY2FsUm9vdChiYXNlUGF0aCkgKyByZWZlcmVuY2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlwYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZShyZWZlcmVuY2UsIGJhc2VQYXRoLCBnZXRMb2NhbFJvb3QoYmFzZVBhdGgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG9yZGVyIGRpY3RhdGVkIGJ5IEpTUCBzcGVjIDIuMCBzZWN0aW9uIDcuMi4zCi0JCQlyZWNvcmQgPSAoSVRhZ2xpYlJlY29yZCkgZkpBUlJlZmVyZW5jZXMuZ2V0KHBhdGgpOwotCi0JCQkvLyBvbmx5IGlmIDEuMSBUTEQgd2FzIGZvdW5kCi0JCQlpZiAoanNwVmVyc2lvbiA8IDEuMSB8fCAocmVjb3JkIGluc3RhbmNlb2YgSmFyUmVjb3JkICYmICEoKEphclJlY29yZCkgcmVjb3JkKS5oYXMxMVRMRCkpIHsKLQkJCQlyZWNvcmQgPSBudWxsOwotCQkJfQotCQkJaWYgKHJlY29yZCA9PSBudWxsKSB7Ci0JCQkJcmVjb3JkID0gKElUYWdsaWJSZWNvcmQpIGZUTERSZWZlcmVuY2VzLmdldChwYXRoKTsKLQkJCX0KLQkJCWlmIChyZWNvcmQgPT0gbnVsbCAmJiBqc3BWZXJzaW9uID49IDEuMikgewotCQkJCXJlY29yZCA9IChJVGFnbGliUmVjb3JkKSBnZXRJbXBsaWNpdFJlZmVyZW5jZXMoYmFzZVBhdGgpLmdldChyZWZlcmVuY2UpOwotCQkJfQotCi0KLQkJCWlmIChyZWNvcmQgPT0gbnVsbCAmJiBqc3BWZXJzaW9uID49IDIuMCkgewotCQkJCXJlY29yZCA9IChJVGFnbGliUmVjb3JkKSBmVGFnRGlyUmVmZXJlbmNlcy5nZXQocGF0aCk7Ci0JCQl9Ci0KLQkJCWlmIChyZWNvcmQgPT0gbnVsbCAmJiBqc3BWZXJzaW9uID49IDEuMikgewotCQkJCXJlY29yZCA9IChJVGFnbGliUmVjb3JkKSBmQ2xhc3NwYXRoUmVmZXJlbmNlcy5nZXQocmVmZXJlbmNlKTsKLQkJCX0KLQkJCWlmIChyZWNvcmQgPT0gbnVsbCAmJiBqc3BWZXJzaW9uID49IDEuMikgewotCQkJCU1hcCBidWlsZFBhdGhSZWZlcmVuY2VzID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlMaXN0IHByb2plY3RzUHJvY2Vzc2VkID0gbmV3IEFycmF5TGlzdChmQ2xhc3NwYXRoUHJvamVjdHMuc2l6ZSgpICsgMSk7Ci0JCQkJcHJvamVjdHNQcm9jZXNzZWQuYWRkKGZQcm9qZWN0KTsKLQkJCQlhZGRCdWlsZFBhdGhSZWZlcmVuY2VzKGJ1aWxkUGF0aFJlZmVyZW5jZXMsIHByb2plY3RzUHJvY2Vzc2VkLCBmYWxzZSk7Ci0JCQkJcmVjb3JkID0gKElUYWdsaWJSZWNvcmQpIGJ1aWxkUGF0aFJlZmVyZW5jZXMuZ2V0KHJlZmVyZW5jZSk7Ci0JCQl9Ci0KLQkJCS8vIENoZWNrIHRoZSBYTUwgQ2F0YWxvZwotCQkJaWYgKHJlY29yZCA9PSBudWxsKSB7Ci0JCQkJSUNhdGFsb2cgY2F0YWxvZyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0JCQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcmVzb2x2ZWRTdHJpbmcgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJLy8gQ2hlY2sgYXMgc3lzdGVtIHJlZmVyZW5jZSBmaXJzdAotCQkJCQkJcmVzb2x2ZWRTdHJpbmcgPSBjYXRhbG9nLnJlc29sdmVTeXN0ZW0ocmVmZXJlbmNlKTsKLQkJCQkJCS8vIENoZWNrIGFzIFVSSQotCQkJCQkJaWYgKHJlc29sdmVkU3RyaW5nID09IG51bGwgfHwgcmVzb2x2ZWRTdHJpbmcudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQlyZXNvbHZlZFN0cmluZyA9IGNhdGFsb2cucmVzb2x2ZVVSSShyZWZlcmVuY2UpOwotCQkJCQkJfQotCQkJCQkJLy8gQ2hlY2sgYXMgcHVibGljIElECi0JCQkJCQlpZiAocmVzb2x2ZWRTdHJpbmcgPT0gbnVsbCB8fCByZXNvbHZlZFN0cmluZy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXJlc29sdmVkU3RyaW5nID0gY2F0YWxvZy5yZXNvbHZlUHVibGljKHJlZmVyZW5jZSwgYmFzZVBhdGgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCQlpZiAocmVzb2x2ZWRTdHJpbmcgIT0gbnVsbCAmJiByZXNvbHZlZFN0cmluZy50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlyZWNvcmQgPSBjcmVhdGVDYXRhbG9nUmVjb3JkKHJlZmVyZW5jZSwgcmVzb2x2ZWRTdHJpbmcpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvKgotCQkJICogSWYgbm8gcmVjb3JkcyB3ZXJlIGZvdW5kIGFuZCBubyBsb2NhbC1yb290IGFwcGxpZXMsIGNoZWNrIEFMTAotCQkJICogb2YgdGhlIHdlYi54bWwgZmlsZXMgYXMgYSBmYWxsYmFjawotCQkJICovCi0JCQlpZiAocmVjb3JkID09IG51bGwgJiYgZlByb2plY3QuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLmVxdWFscyhnZXRMb2NhbFJvb3QoYmFzZVBhdGgpKSkgewotCQkJCVdlYlhNTFJlY29yZFtdIHdlYnhtbHMgPSAoV2ViWE1MUmVjb3JkW10pIGZXZWJYTUxSZWZlcmVuY2VzLnZhbHVlcygpLnRvQXJyYXkobmV3IFdlYlhNTFJlY29yZFswXSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3ZWJ4bWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChyZWNvcmQgIT0gbnVsbCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlyZWNvcmQgPSAoSVRhZ2xpYlJlY29yZCkgZ2V0SW1wbGljaXRSZWZlcmVuY2VzKHdlYnhtbHNbaV0ucGF0aC50b1N0cmluZygpKS5nZXQocmVmZXJlbmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlMT0NLLnJlbGVhc2UoKTsKLQkJfQotCi0JCXJldHVybiByZWNvcmQ7Ci0JfQotCi0JLyoqCi0JICogUmVzdG9yZXMgYW55IHNhdmVkIHJlZmVyZW5jZSB0YWJsZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzdG9yZVJlZmVyZW5jZXMoKSB7Ci0JCWZpbmFsIGJvb2xlYW4gbm90aWZ5T25SZXN0b3JhdGlvbiA9IHRydWU7Ci0JCWlmIChUYWdsaWJJbmRleC5FTkFCTEVEKSB7Ci0JCQkvLyByZXNvdXJjZXMgZmlyc3QKLQkJCWluZGV4KCk7Ci0JCQkvLyBub3cgYnVpbGQgcGF0aAotCi0JCQkvLyA9PT09PT09PT09PT09PT09IHRlc3QgcmVsb2FkIHRpbWUgPT09PT09PT09PT09PT09PT09PT09PT09Ci0JCQlib29sZWFuIHJlc3RvcmVkID0gZmFsc2U7Ci0JCQlGaWxlIHNhdmVkU3RhdGUgPSBuZXcgRmlsZShmU2F2ZVN0YXRlRmlsZW5hbWUpOwotCQkJaWYgKHNhdmVkU3RhdGUuZXhpc3RzKCkpIHsKLQkJCQlSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQlyZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShzYXZlZFN0YXRlKSksICJVVEYtMTYiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJLy8gdXNlIGEgc3RyaW5nIGJ1ZmZlciB0ZW1wb3JhcmlseSB0byByZWR1Y2Ugc3RyaW5nCi0JCQkJCS8vIGNyZWF0aW9uCi0JCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCWNoYXIgYXJyYXlbXSA9IG5ldyBjaGFyWzIwNDhdOwotCQkJCQlpbnQgY2hhcnNSZWFkID0gMDsKLQkJCQkJd2hpbGUgKChjaGFyc1JlYWQgPSByZWFkZXIucmVhZChhcnJheSkpICE9IC0xKSB7Ci0JCQkJCQlpZiAoY2hhcnNSZWFkID4gMCkgewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoYXJyYXksIDAsIGNoYXJzUmVhZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlJRG9jdW1lbnQgZG9jID0gbmV3IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQoKTsKLQkJCQkJZG9jLnNldChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQkJCWludCBsaW5lcyA9IGRvYy5nZXROdW1iZXJPZkxpbmVzKCk7Ci0JCQkJCWlmIChsaW5lcyA+IDApIHsKLQkJCQkJCUlSZWdpb24gbGluZSA9IGRvYy5nZXRMaW5lSW5mb3JtYXRpb24oMCk7Ci0JCQkJCQlTdHJpbmcgbGluZVRleHQgPSBkb2MuZ2V0KGxpbmUuZ2V0T2Zmc2V0KCksIGxpbmUuZ2V0TGVuZ3RoKCkpOwotCQkJCQkJSmFyUmVjb3JkIGxpYnJhcnlSZWNvcmQgPSBudWxsOwotCQkJCQkJaWYgKFNBVkVfRk9STUFUX1ZFUlNJT04uZXF1YWxzKGxpbmVUZXh0LnRyaW0oKSkpIHsKLQkJCQkJCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQotCQkJCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgbGluZXMgJiYgIWZCdWlsZFBhdGhJc0RpcnR5OyBpKyspIHsKLQkJCQkJCQkJbGluZSA9IGRvYy5nZXRMaW5lSW5mb3JtYXRpb24oaSk7Ci0JCQkJCQkJCWxpbmVUZXh0ID0gZG9jLmdldChsaW5lLmdldE9mZnNldCgpLCBsaW5lLmdldExlbmd0aCgpKTsKLQkJCQkJCQkJU3RyaW5nVG9rZW5pemVyIHRva2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaW5lVGV4dCwgInwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlpZiAodG9rZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQkJCQlTdHJpbmcgdG9rZW5UeXBlID0gdG9rZXIubmV4dFRva2VuKCk7Ci0JCQkJCQkJCQlpZiAoIkpBUiIuZXF1YWxzSWdub3JlQ2FzZSh0b2tlblR5cGUpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCWJvb2xlYW4gaGFzMTFUTEQgPSBCb29sZWFuLnZhbHVlT2YodG9rZXIubmV4dFRva2VuKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQkJCQkJCWJvb2xlYW4gZXhwb3J0ZWQgPSBCb29sZWFuLnZhbHVlT2YodG9rZXIubmV4dFRva2VuKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQkJCQkJCS8vIG1ha2UgdGhlIHJlc3QgdGhlIGxpYnJhcnlMb2NhdGlvbgotCQkJCQkJCQkJCVN0cmluZyBsaWJyYXJ5TG9jYXRpb24gPSB0b2tlci5uZXh0VG9rZW4oKTsKLQkJCQkJCQkJCQl3aGlsZSAodG9rZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQkJCQkJCWxpYnJhcnlMb2NhdGlvbiA9IGxpYnJhcnlMb2NhdGlvbiArICJ8IiArIHRva2VyLm5leHRUb2tlbigpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJbGlicmFyeUxvY2F0aW9uID0gbGlicmFyeUxvY2F0aW9uLnRyaW0oKTsKLQkJCQkJCQkJCQlpZiAobGlicmFyeVJlY29yZCAhPSBudWxsICYmIG5vdGlmeU9uUmVzdG9yYXRpb24pIHsKLQkJCQkJCQkJCQkJVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5hZGREZWx0YShuZXcgVGFnbGliSW5kZXhEZWx0YShmUHJvamVjdCwgbGlicmFyeVJlY29yZCwgSVRhZ2xpYkluZGV4RGVsdGEuQURERUQpKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJLy8gQ3JlYXRlIGEgbmV3IEphclJlY29yZAotCQkJCQkJCQkJCWxpYnJhcnlSZWNvcmQgPSBjcmVhdGVKQVJSZWNvcmQobGlicmFyeUxvY2F0aW9uKTsKLQkJCQkJCQkJCQlsaWJyYXJ5UmVjb3JkLmhhczExVExEID0gaGFzMTFUTEQ7Ci0JCQkJCQkJCQkJbGlicmFyeVJlY29yZC5pc0V4cG9ydGVkID0gZXhwb3J0ZWQ7Ci0KLQkJCQkJCQkJCQkvLyBBZGQgYSBVUkxSZWNvcmQgZm9yIHRoZSAxLjEgVExECi0JCQkJCQkJCQkJaWYgKGhhczExVExEKSB7Ci0JCQkJCQkJCQkJCUlucHV0U3RyZWFtIGNvbnRlbnRzID0gSmFyVXRpbGl0aWVzLmdldElucHV0U3RyZWFtKGxpYnJhcnlMb2NhdGlvbiwgSmFyVXRpbGl0aWVzLkpTUDExX1RBR0xJQik7Ci0JCQkJCQkJCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCQlUYWdsaWJJbmZvIGluZm8gPSBleHRyYWN0SW5mbyhsaWJyYXJ5TG9jYXRpb24sIGNvbnRlbnRzKTsKLQotCQkJCQkJCQkJCQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLnVyaSAhPSBudWxsICYmIGluZm8udXJpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQkJCQkJCVVSTFJlY29yZCB1cmxSZWNvcmQgPSBuZXcgVVJMUmVjb3JkKCk7Ci0JCQkJCQkJCQkJCQkJdXJsUmVjb3JkLmluZm8gPSBpbmZvOwotCQkJCQkJCQkJCQkJCXVybFJlY29yZC5pc0V4cG9ydGVkID0gZXhwb3J0ZWQ7Ci0JCQkJCQkJCQkJCQkJdXJsUmVjb3JkLmJhc2VMb2NhdGlvbiA9IGxpYnJhcnlMb2NhdGlvbjsKLQkJCQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQkJCQl1cmxSZWNvcmQudXJsID0gbmV3IFVSTCgiamFyOmZpbGU6IiArIGxpYnJhcnlMb2NhdGlvbiArICIhLyIgKyBKYXJVdGlsaXRpZXMuSlNQMTFfVEFHTElCKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCQkJCWxpYnJhcnlSZWNvcmQudXJsUmVjb3Jkcy5hZGQodXJsUmVjb3JkKTsKLQkJCQkJCQkJCQkJCQkJZkNsYXNzcGF0aFJlZmVyZW5jZXMucHV0KHVybFJlY29yZC5nZXRVUkkoKSwgdXJsUmVjb3JkKTsKLQkJCQkJCQkJCQkJCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQkJCQkJCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiY3JlYXRlZCByZWNvcmQgZm9yICIgKyB1cmxSZWNvcmQuZ2V0VVJJKCkgKyAiQCIgKyB1cmxSZWNvcmQuZ2V0VVJMKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJCQkJCS8qCi0JCQkJCQkJCQkJCQkJCSAqIGRvbid0IHJlY29yZCB0aGlzCi0JCQkJCQkJCQkJCQkJCSAqIFVSSQotCQkJCQkJCQkJCQkJCQkgKi8KLQkJCQkJCQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCi0JCQkJCQkJCQkJZkNsYXNzcGF0aEphcnMucHV0KGxpYnJhcnlMb2NhdGlvbiwgbGlicmFyeVJlY29yZCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmICgiVVJMIi5lcXVhbHNJZ25vcmVDYXNlKHRva2VuVHlwZSkgJiYgbGlicmFyeVJlY29yZCAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkvLyByZWxpZXMgb24gYSBwcmV2aW91c2x5IGRlY2xhcmVkIEpBUgotCQkJCQkJCQkJCS8vIHJlY29yZAotCQkJCQkJCQkJCWJvb2xlYW4gZXhwb3J0ZWQgPSBCb29sZWFuLnZhbHVlT2YodG9rZXIubmV4dFRva2VuKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQkJCQkJCS8vIG1ha2UgdGhlIHJlc3QgdGhlIFVSTAotCQkJCQkJCQkJCVN0cmluZyB1cmxTdHJpbmcgPSB0b2tlci5uZXh0VG9rZW4oKTsKLQkJCQkJCQkJCQl3aGlsZSAodG9rZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQkJCQkJCXVybFN0cmluZyA9IHVybFN0cmluZyArICJ8IiArIHRva2VyLm5leHRUb2tlbigpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJdXJsU3RyaW5nID0gdXJsU3RyaW5nLnRyaW0oKTsKLQkJCQkJCQkJCQkvLyBBcHBlbmQgYSBVUkxyZWNvcmQKLQkJCQkJCQkJCQlVUkxSZWNvcmQgdXJsUmVjb3JkID0gbmV3IFVSTFJlY29yZCgpOwotCQkJCQkJCQkJCXVybFJlY29yZC51cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCXVybFJlY29yZC5pc0V4cG9ydGVkID0gZXhwb3J0ZWQ7Ci0JCQkJCQkJCQkJdXJsUmVjb3JkLmJhc2VMb2NhdGlvbiA9IGxpYnJhcnlSZWNvcmQubG9jYXRpb24udG9TdHJpbmcoKTsKLQkJCQkJCQkJCQlsaWJyYXJ5UmVjb3JkLnVybFJlY29yZHMuYWRkKHVybFJlY29yZCk7Ci0KLQkJCQkJCQkJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBjYWNoZWRDb250ZW50cyA9IG51bGw7Ci0JCQkJCQkJCQkJSW5wdXRTdHJlYW0gdGxkU3RyZWFtID0gbnVsbDsKLQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQlVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSB1cmxSZWNvcmQudXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCQkJCQkJCQkJCWNvbm5lY3Rpb24uc2V0RGVmYXVsdFVzZUNhY2hlcyhmYWxzZSk7Ci0JCQkJCQkJCQkJCXRsZFN0cmVhbSA9IGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTEpOwotCQkJCQkJCQkJCX0KLQotCQkJCQkJCQkJCWludCBjOwotCQkJCQkJCQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlQXJyYXlPdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJCQkJCQkJLy8gYXJyYXkgZGltIHJlc3RyaWN0aW9uPwotCQkJCQkJCQkJCWJ5dGUgYnl0ZXNbXSA9IG5ldyBieXRlWzIwNDhdOwotCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCXdoaWxlICgoYyA9IHRsZFN0cmVhbS5yZWFkKGJ5dGVzKSkgPj0gMCkgewotCQkJCQkJCQkJCQkJYnl0ZUFycmF5T3V0cHV0LndyaXRlKGJ5dGVzLCAwLCBjKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQljYWNoZWRDb250ZW50cyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlQXJyYXlPdXRwdXQudG9CeXRlQXJyYXkoKSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkJCQkJCQkJLy8gbm8gY2xlYW51cCBjYW4gYmUgZG9uZQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJCXRsZFN0cmVhbS5jbG9zZSgpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0KLQkJCQkJCQkJCQlUYWdsaWJJbmZvIGluZm8gPSBleHRyYWN0SW5mbyh1cmxSZWNvcmQudXJsLnRvU3RyaW5nKCksIGNhY2hlZENvbnRlbnRzKTsKLQkJCQkJCQkJCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCXVybFJlY29yZC5pbmZvID0gaW5mbzsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJY2FjaGVkQ29udGVudHMuY2xvc2UoKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJZkNsYXNzcGF0aFJlZmVyZW5jZXMucHV0KHVybFJlY29yZC5nZXRVUkkoKSwgdXJsUmVjb3JkKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEJVSUxEUEFUSF9QUk9KRUNULmVxdWFsc0lnbm9yZUNhc2UodG9rZW5UeXBlKSkgewotCQkJCQkJCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IHRva2VyLm5leHRUb2tlbigpOwotCQkJCQkJCQkJCWlmIChQYXRoLlJPT1QuaXNWYWxpZFNlZ21lbnQocHJvamVjdE5hbWUpKSB7Ci0JCQkJCQkJCQkJCUlQcm9qZWN0IHByb2plY3QgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkJCQkJCQkJCQkvKiBkbyBub3QgY2hlY2sgaWYgIm9wZW4iIGhlcmUgKi8KLQkJCQkJCQkJCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCQkJCQkJCQkJZkNsYXNzcGF0aFByb2plY3RzLmFkZChwcm9qZWN0KTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCS8vIGxhc3Qgc2luY2UgdGhleSBvY2N1ciBvbmNlCi0JCQkJCQkJCQllbHNlIGlmIChCVUlMRFBBVEhfRElSVFkuZXF1YWxzSWdub3JlQ2FzZSh0b2tlblR5cGUpKSB7Ci0JCQkJCQkJCQkJZkJ1aWxkUGF0aElzRGlydHkgPSBCb29sZWFuLnZhbHVlT2YodG9rZXIubmV4dFRva2VuKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSBpZiAoQlVJTERQQVRIX0VOVFJJRVMuZXF1YWxzSWdub3JlQ2FzZSh0b2tlblR5cGUpKSB7Ci0JCQkJCQkJCQkJZkJ1aWxkUGF0aEVudHJ5Q291bnQgPSBJbnRlZ2VyLnZhbHVlT2YodG9rZXIubmV4dFRva2VuKCkpLmludFZhbHVlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKGxpYnJhcnlSZWNvcmQgIT0gbnVsbCAmJiBub3RpZnlPblJlc3RvcmF0aW9uKSB7Ci0JCQkJCQkJCQlUYWdsaWJJbmRleC5nZXRJbnN0YW5jZSgpLmFkZERlbHRhKG5ldyBUYWdsaWJJbmRleERlbHRhKGZQcm9qZWN0LCBsaWJyYXJ5UmVjb3JkLCBJVGFnbGliSW5kZXhEZWx0YS5BRERFRCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCXJlc3RvcmVkID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJUYWcgTGlicmFyeSBJbmRleDogZGlmZmVyZW50IGNhY2hlIGZvcm1hdCBmb3VuZCwgd2FzIFwiIiArIGxpbmVUZXh0ICsgIlwiLCBzdXBwb3J0cyBcIiIgKyBTQVZFX0ZPUk1BVF9WRVJTSU9OICsgIlwiLCByZWluZGV4aW5nIGJ1aWxkIHBhdGgiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoX2RlYnVnSW5kZXhUaW1lKQotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgInRpbWUgc3BlbnQgcmVsb2FkaW5nICIgKyBmUHJvamVjdC5nZXROYW1lKCkgKyAiIGJ1aWxkIHBhdGg6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJlc3RvcmVkID0gZmFsc2U7Ci0JCQkJCWlmIChfZGVidWdJbmRleFRpbWUpCi0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiZmFpbHVyZSByZWxvYWRpbmcgIiArIGZQcm9qZWN0LmdldE5hbWUoKSArICIgYnVpbGQgcGF0aCBpbmRleCIsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlyZWFkZXIuY2xvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vID09PT09PT09PT09PT09PT0gdGVzdCByZWxvYWQgdGltZSAoZW5kKSA9PT09PT09PT09PT09PT09PT0KLQotCi0JCQlpZiAoIXJlc3RvcmVkKSB7Ci0JCQkJc2V0QnVpbGRQYXRoSXNEaXJ0eSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgYW55IHN0b3JhYmxlIHJlZmVyZW5jZXMgdG8gZGlzay4gVGhpcyBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoZQotCSAqIGRlc2NyaXB0aW9uIGlzIGJlaW5nIGNsZWFyZWQgYW5kIG5vdCBhZnRlciBldmVyeSB1cGRhdGUuCi0JICovCi0Jdm9pZCBzYXZlUmVmZXJlbmNlcygpIHsKLQkJLy8gdGhlIGJ1aWxkIHBhdGggaW5mb3JtYXRpb24gaXMgb3V0IG9mIGRhdGUsIHJlbWVtYmVyIHRoYXQKLQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJV3JpdGVyIHdyaXRlciA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIDxwcmU+Ci0JCSAqICAgICAgICAgICAgICAgICAgICAgCQkgMS4wLjEKLQkJICogICAgICAgICAgICAgICAgICAgICAJCSBTYXZlIGNsYXNzcGF0aCBpbmZvcm1hdGlvbiAofCBpcyBmaWVsZCBkZWxpbWl0ZXIpCi0JCSAqICAgICAgICAgICAgICAgICAgICAgCQkgSmFycyBhcmUgc2F2ZWQgYXMgJnF1b3Q7SkFSOiZxdW90OysgaGFzMTFUTEQgKyBqYXIgcGF0aCAKLQkJICogICAgICAgICAgICAgICAgICAgICAJCSBVUkxSZWNvcmRzIGFzICZxdW90O1VSTDomcXVvdDsrVVJMCi0JCSAqIDwvcHJlPgotCQkgKi8KLQkJdHJ5IHsKLQkJCXdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZlNhdmVTdGF0ZUZpbGVuYW1lKSwgIlVURi0xNiIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIud3JpdGUoU0FWRV9GT1JNQVRfVkVSU0lPTik7Ci0JCQl3cml0ZXIud3JpdGUoJ1xuJyk7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci53cml0ZShCVUlMRFBBVEhfRElSVFkgKyAifCIgKyBmQnVpbGRQYXRoSXNEaXJ0eSk7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci53cml0ZSgnXG4nKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLndyaXRlKEJVSUxEUEFUSF9FTlRSSUVTICsgInwiICsgZkJ1aWxkUGF0aEVudHJ5Q291bnQpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIud3JpdGUoJ1xuJyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IChJUHJvamVjdFtdKSBmQ2xhc3NwYXRoUHJvamVjdHMudG9BcnJheShuZXcgSVByb2plY3RbMF0pOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCXdyaXRlci53cml0ZShCVUlMRFBBVEhfUFJPSkVDVCk7Ci0JCQkJd3JpdGVyLndyaXRlKCJ8Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl3cml0ZXIud3JpdGUocHJvamVjdHNbaV0uZ2V0TmFtZSgpKTsKLQkJCQl3cml0ZXIud3JpdGUoJ1xuJyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJRW51bWVyYXRpb24gamFycyA9IGZDbGFzc3BhdGhKYXJzLmtleXMoKTsKLQkJCXdoaWxlIChqYXJzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIGphclBhdGggPSBqYXJzLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKLQkJCQlKYXJSZWNvcmQgamFyUmVjb3JkID0gKEphclJlY29yZCkgZkNsYXNzcGF0aEphcnMuZ2V0KGphclBhdGgpOwotCQkJCXdyaXRlci53cml0ZSgiSkFSfCIpOyAvLyROT04tTkxTLTEkCi0JCQkJd3JpdGVyLndyaXRlKEJvb2xlYW4udG9TdHJpbmcoamFyUmVjb3JkLmhhczExVExEKSk7Ci0JCQkJd3JpdGVyLndyaXRlKCd8Jyk7IC8vJE5PTi1OTFMtMSQKLQkJCQl3cml0ZXIud3JpdGUoQm9vbGVhbi50b1N0cmluZyhqYXJSZWNvcmQuaXNFeHBvcnRlZCkpOwotCQkJCXdyaXRlci53cml0ZSgnfCcpOyAvLyROT04tTkxTLTEkCi0JCQkJd3JpdGVyLndyaXRlKGphclBhdGgpOwotCQkJCXdyaXRlci53cml0ZSgnXG4nKTsgLy8kTk9OLU5MUy0xJAotCQkJCUl0ZXJhdG9yIGkgPSBqYXJSZWNvcmQudXJsUmVjb3Jkcy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCQlVUkxSZWNvcmQgdXJsUmVjb3JkID0gKFVSTFJlY29yZCkgaS5uZXh0KCk7Ci0JCQkJCXdyaXRlci53cml0ZSgiVVJMfCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXdyaXRlci53cml0ZShTdHJpbmcudmFsdWVPZih1cmxSZWNvcmQuaXNFeHBvcnRlZCkpOwotCQkJCQl3cml0ZXIud3JpdGUoInwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl3cml0ZXIud3JpdGUodXJsUmVjb3JkLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJCQl3cml0ZXIud3JpdGUoJ1xuJyk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHdyaXRlciAhPSBudWxsKSB7Ci0JCQkJCXdyaXRlci5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0KLQkJaWYgKF9kZWJ1Z0luZGV4VGltZSkKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJ0aW1lIHNwZW50IHNhdmluZyBpbmRleCBmb3IgIiArIGZQcm9qZWN0LmdldE5hbWUoKSArICI6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jdm9pZCBzZXRCdWlsZFBhdGhJc0RpcnR5KCkgewotCQlmQnVpbGRQYXRoSXNEaXJ0eSA9IHRydWU7Ci0JCWlmIChfZGVidWdJbmRleFRpbWUpCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAibWFya2luZyBidWlsZCBwYXRoIGluZm9ybWF0aW9uIGZvciAiICsgZlByb2plY3QuZ2V0TmFtZSgpICsgIiBhcyBkaXJ0eSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jdm9pZCB1cGRhdGVDbGFzc3BhdGhMaWJyYXJ5KFN0cmluZyBsaWJyYXJ5TG9jYXRpb24sIGludCBkZWx0YUtpbmQsIGJvb2xlYW4gaXNFeHBvcnRlZCkgewotCQlKYXJSZWNvcmQgbGlicmFyeVJlY29yZCA9IG51bGw7Ci0JCWlmIChkZWx0YUtpbmQgPT0gSVRhZ2xpYkluZGV4RGVsdGEuUkVNT1ZFRCB8fCBkZWx0YUtpbmQgPT0gSVRhZ2xpYkluZGV4RGVsdGEuQ0hBTkdFRCkgewotCQkJbGlicmFyeVJlY29yZCA9IChKYXJSZWNvcmQpIGZDbGFzc3BhdGhKYXJzLnJlbW92ZShsaWJyYXJ5TG9jYXRpb24pOwotCQkJaWYgKGxpYnJhcnlSZWNvcmQgIT0gbnVsbCkgewotCQkJCUlVUkxSZWNvcmRbXSB1cmxSZWNvcmRzID0gKElVUkxSZWNvcmRbXSkgbGlicmFyeVJlY29yZC51cmxSZWNvcmRzLnRvQXJyYXkobmV3IElVUkxSZWNvcmRbMF0pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJsUmVjb3Jkcy5sZW5ndGg7IGkrKykgewotCQkJCQlJVGFnbGliUmVjb3JkIHJlY29yZCA9IChJVGFnbGliUmVjb3JkKSBmQ2xhc3NwYXRoUmVmZXJlbmNlcy5yZW1vdmUodXJsUmVjb3Jkc1tpXS5nZXRVUkkoKSk7Ci0JCQkJCWlmIChyZWNvcmQgIT0gbnVsbCkgewotCQkJCQkJVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5hZGREZWx0YShuZXcgVGFnbGliSW5kZXhEZWx0YShmUHJvamVjdCwgcmVjb3JkLCBJVGFnbGliSW5kZXhEZWx0YS5SRU1PVkVEKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGRlbHRhS2luZCA9PSBJVGFnbGliSW5kZXhEZWx0YS5BRERFRCB8fCBkZWx0YUtpbmQgPT0gSVRhZ2xpYkluZGV4RGVsdGEuQ0hBTkdFRCkgewotCQkJbGlicmFyeVJlY29yZCA9IGNyZWF0ZUpBUlJlY29yZChsaWJyYXJ5TG9jYXRpb24pOwotCQkJbGlicmFyeVJlY29yZC5pc0V4cG9ydGVkID0gaXNFeHBvcnRlZDsKLQkJCWZDbGFzc3BhdGhKYXJzLnB1dChsaWJyYXJ5TG9jYXRpb24sIGxpYnJhcnlSZWNvcmQpOwotCi0JCQlaaXBGaWxlIGphcmZpbGUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlqYXJmaWxlID0gbmV3IFppcEZpbGUobGlicmFyeUxvY2F0aW9uKTsKLQkJCQlFbnVtZXJhdGlvbiBlbnRyaWVzID0gamFyZmlsZS5lbnRyaWVzKCk7Ci0JCQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQkJWmlwRW50cnkgeiA9IChaaXBFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJCQlpZiAoIXouaXNEaXJlY3RvcnkoKSkgewotCQkJCQkJaWYgKHouZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKExvY2FsZS5VUykuZW5kc1dpdGgoIi50bGQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKHouZ2V0TmFtZSgpLmVxdWFscyhKYXJVdGlsaXRpZXMuSlNQMTFfVEFHTElCKSkgewotCQkJCQkJCQlsaWJyYXJ5UmVjb3JkLmhhczExVExEID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBnZXRDYWNoZWRJbnB1dFN0cmVhbShqYXJmaWxlLCB6KTsKLQkJCQkJCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJCQkJCQlUYWdsaWJJbmZvIGluZm8gPSBleHRyYWN0SW5mbyhsaWJyYXJ5TG9jYXRpb24sIGNvbnRlbnRzKTsKLQotCQkJCQkJCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8udXJpICE9IG51bGwgJiYgaW5mby51cmkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCQlVUkxSZWNvcmQgdXJsUmVjb3JkID0gbmV3IFVSTFJlY29yZCgpOwotCQkJCQkJCQkJdXJsUmVjb3JkLmluZm8gPSBpbmZvOwotCQkJCQkJCQkJdXJsUmVjb3JkLmJhc2VMb2NhdGlvbiA9IGxpYnJhcnlMb2NhdGlvbjsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJdXJsUmVjb3JkLmlzRXhwb3J0ZWQgPSBpc0V4cG9ydGVkOwotCQkJCQkJCQkJCXVybFJlY29yZC51cmwgPSBuZXcgVVJMKCJqYXI6ZmlsZToiICsgbGlicmFyeUxvY2F0aW9uICsgIiEvIiArIHouZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJbGlicmFyeVJlY29yZC51cmxSZWNvcmRzLmFkZCh1cmxSZWNvcmQpOwotCQkJCQkJCQkJCVRhZ2xpYkluZGV4LmdldEluc3RhbmNlKCkuYWRkRGVsdGEobmV3IFRhZ2xpYkluZGV4RGVsdGEoZlByb2plY3QsIHVybFJlY29yZCwgZGVsdGFLaW5kKSk7Ci0JCQkJCQkJCQkJZkNsYXNzcGF0aFJlZmVyZW5jZXMucHV0KHVybFJlY29yZC5nZXRVUkkoKSwgdXJsUmVjb3JkKTsKLQkJCQkJCQkJCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgImNyZWF0ZWQgcmVjb3JkIGZvciAiICsgdXJsUmVjb3JkLmdldFVSSSgpICsgIkAiICsgdXJsUmVjb3JkLmdldFVSTCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkvLyBkb24ndCByZWNvcmQgdGhpcyBVUkkKLQkJCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQljb250ZW50cy5jbG9zZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoWmlwRXhjZXB0aW9uIHpFeGMpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiVGFnbGliIEluZGV4IFppcEV4Y2VwdGlvbjogIiArIGxpYnJhcnlMb2NhdGlvbiArICIgIiArIHpFeGMuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gaW9FeGMpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiVGFnbGliIEluZGV4IElPRXhjZXB0aW9uOiAiICsgbGlicmFyeUxvY2F0aW9uICsgIiAiICsgaW9FeGMuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQljbG9zZUphckZpbGUoamFyZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGxpYnJhcnlSZWNvcmQgIT0gbnVsbCkgewotCQkJVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5hZGREZWx0YShuZXcgVGFnbGliSW5kZXhEZWx0YShmUHJvamVjdCwgbGlicmFyeVJlY29yZCwgZGVsdGFLaW5kKSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHVwZGF0ZUpBUihJUmVzb3VyY2UgamFyLCBpbnQgZGVsdGFLaW5kKSB7Ci0JCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgImNyZWF0aW5nIHJlY29yZHMgZm9yIEpBUiAiICsgamFyLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIGphckxvY2F0aW9uU3RyaW5nID0gbnVsbDsKLQkJaWYgKGphci5nZXRMb2NhdGlvbigpICE9IG51bGwpCi0JCQlqYXJMb2NhdGlvblN0cmluZyA9IGphci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCWVsc2UKLQkJCWphckxvY2F0aW9uU3RyaW5nID0gamFyLmdldExvY2F0aW9uVVJJKCkudG9TdHJpbmcoKTsKLQkJU3RyaW5nW10gZW50cmllcyA9IEphclV0aWxpdGllcy5nZXRFbnRyeU5hbWVzKGphcik7Ci0JCUphclJlY29yZCBqYXJSZWNvcmQgPSBjcmVhdGVKQVJSZWNvcmQoamFyKTsKLQkJZkpBUlJlZmVyZW5jZXMucHV0KGphci5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGphclJlY29yZCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGVudHJpZXNbaV0uZW5kc1dpdGgoIi50bGQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGVudHJpZXNbaV0uZXF1YWxzKEphclV0aWxpdGllcy5KU1AxMV9UQUdMSUIpKSB7Ci0JCQkJCWphclJlY29yZC5oYXMxMVRMRCA9IHRydWU7Ci0JCQkJfQotCQkJCUlucHV0U3RyZWFtIGNvbnRlbnRzID0gSmFyVXRpbGl0aWVzLmdldElucHV0U3RyZWFtKGphciwgZW50cmllc1tpXSk7Ci0JCQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCQkJVGFnbGliSW5mbyBpbmZvID0gZXh0cmFjdEluZm8oamFyTG9jYXRpb25TdHJpbmcsIGNvbnRlbnRzKTsKLQotCQkJCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8udXJpICE9IG51bGwgJiYgaW5mby51cmkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlVUkxSZWNvcmQgcmVjb3JkID0gbmV3IFVSTFJlY29yZCgpOwotCQkJCQkJcmVjb3JkLmluZm8gPSBpbmZvOwotCQkJCQkJcmVjb3JkLmJhc2VMb2NhdGlvbiA9IGphckxvY2F0aW9uU3RyaW5nOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlyZWNvcmQudXJsID0gbmV3IFVSTCgiamFyOmZpbGU6IiArIGphckxvY2F0aW9uU3RyaW5nICsgIiEvIiArIGVudHJpZXNbaV0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQlqYXJSZWNvcmQudXJsUmVjb3Jkcy5hZGQocmVjb3JkKTsKLQotCQkJCQkJCWludCB0YWdsaWJEZWx0YUtpbmQgPSBJVGFnbGliSW5kZXhEZWx0YS5BRERFRDsKLQkJCQkJCQlIYXNodGFibGUgdGFibGUgPSBnZXRJbXBsaWNpdFJlZmVyZW5jZXMoamFyLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQkJaWYgKHRhYmxlICE9IG51bGwgJiYgdGFibGUuZ2V0KHJlY29yZC5nZXRVUkkoKSkgIT0gbnVsbCkgewotCQkJCQkJCQl0YWdsaWJEZWx0YUtpbmQgPSBJVGFnbGliSW5kZXhEZWx0YS5DSEFOR0VEOwotCQkJCQkJCX0KLQotCQkJCQkJCWdldEltcGxpY2l0UmVmZXJlbmNlcyhqYXIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKS5wdXQocmVjb3JkLmdldFVSSSgpLCByZWNvcmQpOwotCQkJCQkJCVRhZ2xpYkluZGV4LmdldEluc3RhbmNlKCkuYWRkRGVsdGEobmV3IFRhZ2xpYkluZGV4RGVsdGEoZlByb2plY3QsIHJlY29yZCwgdGFnbGliRGVsdGFLaW5kKSk7Ci0JCQkJCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJjcmVhdGVkIHJlY29yZCBmb3IgIiArIHJlY29yZC5nZXRVUkkoKSArICJAIiArIHJlY29yZC5nZXRVUkwoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gZG9uJ3QgcmVjb3JkIHRoaXMgVVJJCi0JCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUl9ERUJVRywgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiY291bGQgbm90IHJlYWQgcmVzb3VyY2UgIiArIGphci5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoamFyUmVjb3JkLmhhczExVExEKSB7Ci0JCQlUYWdsaWJJbmRleC5nZXRJbnN0YW5jZSgpLmFkZERlbHRhKG5ldyBUYWdsaWJJbmRleERlbHRhKGZQcm9qZWN0LCBqYXJSZWNvcmQsIGRlbHRhS2luZCkpOwotCQl9Ci0JfQotCi0KLQl2b2lkIHVwZGF0ZVRhZyhJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kKSB7Ci0JCVRhZ0RpclJlY29yZCByZWNvcmQgPSAoVGFnRGlyUmVjb3JkKSBmVGFnRGlyUmVmZXJlbmNlcy5nZXQocmVzb3VyY2UuZ2V0UGFyZW50KCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJaWYgKHJlY29yZCA9PSBudWxsKSB7Ci0JCQlyZWNvcmQgPSBjcmVhdGVUYWdkaXJSZWNvcmQoKElGb2xkZXIpIHJlc291cmNlLmdldFBhcmVudCgpKTsKLQkJCWZUYWdEaXJSZWZlcmVuY2VzLnB1dChyZXNvdXJjZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHJlY29yZCk7Ci0JCQlUYWdsaWJJbmRleC5nZXRJbnN0YW5jZSgpLmFkZERlbHRhKG5ldyBUYWdsaWJJbmRleERlbHRhKGZQcm9qZWN0LCByZWNvcmQsIElUYWdsaWJJbmRleERlbHRhLkFEREVEKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoIXJlY29yZC50YWdzLmNvbnRhaW5zKHJlc291cmNlLmdldE5hbWUoKSkpIHsKLQkJCQlyZWNvcmQudGFncy5hZGQocmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCVRhZ2xpYkluZGV4LmdldEluc3RhbmNlKCkuYWRkRGVsdGEobmV3IFRhZ2xpYkluZGV4RGVsdGEoZlByb2plY3QsIHJlY29yZCwgSVRhZ2xpYkluZGV4RGVsdGEuQ0hBTkdFRCkpOwotCQl9Ci0JfQotCi0Jdm9pZCB1cGRhdGVUYWdEaXIoSVJlc291cmNlIHRhZ2RpclJlc291cmNlLCBpbnQgZGVsdGFLaW5kKSB7Ci0JCS8qKgotCQkgKiA4LjQuMTogdGFnIGZpbGVzIGFyZSBsb29zZSBmaWxlcyB1bmRlciAvV0VCLUlORi90YWdzCi0JCSAqLwotCQlpZiAoKHRhZ2RpclJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5GT0xERVIpICE9IDApIHsKLQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJjcmVhdGluZyByZWNvcmQgZm9yIGRpcmVjdG9yeSAiICsgdGFnZGlyUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVRhZ0RpclJlY29yZCByZWNvcmQgPSAoVGFnRGlyUmVjb3JkKSBmVGFnRGlyUmVmZXJlbmNlcy5nZXQodGFnZGlyUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJCWlmIChyZWNvcmQgPT0gbnVsbCkgewotCQkJCXJlY29yZCA9IGNyZWF0ZVRhZ2RpclJlY29yZCgoSUZvbGRlcikgdGFnZGlyUmVzb3VyY2UpOwotCQkJCWZUYWdEaXJSZWZlcmVuY2VzLnB1dCh0YWdkaXJSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHJlY29yZCk7Ci0JCQkJVGFnbGliSW5kZXguZ2V0SW5zdGFuY2UoKS5hZGREZWx0YShuZXcgVGFnbGliSW5kZXhEZWx0YShmUHJvamVjdCwgcmVjb3JkLCBkZWx0YUtpbmQpKTsKLQkJCX0KLQkJCWVsc2UgewotCi0JCQl9Ci0JCX0KLQkJLyoqCi0JCSAqIDguNC4xOiB0YWcgZmlsZXMgY2FuIGFsc28gYmUgcGFja2FnZWQgaW4gdGhlIC9NRVRBLUlORi90YWdzIGZvbGRlcgotCQkgKiBvZiBhIGphciBpbiAvV0VCLUlORi9saWIvICg4LjQuMjogYnV0IG11c3QgYmUgbWVudGlvbmVkIGluIGEgLnRsZCkKLQkJICovCi0JCWVsc2UgewotCQkJLy8gdGhlc2UgdGFncyBhcmUgbWVyZWx5IHN1cmZhY2VkIHdoZW4gdGhlIFRMRCBpcyBtb2RlbGxlZAotCQl9Ci0JfQotCi0Jdm9pZCB1cGRhdGVUTEQoSVJlc291cmNlIHRsZCwgaW50IGRlbHRhS2luZCkgewotCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJjcmVhdGluZyByZWNvcmQgZm9yICIgKyB0bGQuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVExEUmVjb3JkIHJlY29yZCA9IGNyZWF0ZVRMRFJlY29yZCh0bGQpOwotCQlmVExEUmVmZXJlbmNlcy5wdXQodGxkLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgcmVjb3JkKTsKLQkJaWYgKHJlY29yZC5nZXRVUkkoKSAhPSBudWxsKSB7Ci0JCQlnZXRJbXBsaWNpdFJlZmVyZW5jZXModGxkLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkucHV0KHJlY29yZC5nZXRVUkkoKSwgcmVjb3JkKTsKLQkJfQotCQlUYWdsaWJJbmRleC5nZXRJbnN0YW5jZSgpLmFkZERlbHRhKG5ldyBUYWdsaWJJbmRleERlbHRhKGZQcm9qZWN0LCByZWNvcmQsIGRlbHRhS2luZCkpOwotCX0KLQotCXZvaWQgdXBkYXRlV2ViWE1MKElSZXNvdXJjZSB3ZWJ4bWwsIGludCBkZWx0YUtpbmQpIHsKLQkJaWYgKHdlYnhtbC5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpCi0JCQlyZXR1cm47Ci0JCUlucHV0U3RyZWFtIHdlYnhtbENvbnRlbnRzID0gbnVsbDsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJd2VieG1sQ29udGVudHMgPSAoKElGaWxlKSB3ZWJ4bWwpLmdldENvbnRlbnRzKHRydWUpOwotCQkJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBEb2N1bWVudFByb3ZpZGVyKCk7Ci0JCQlwcm92aWRlci5zZXRJbnB1dFN0cmVhbSh3ZWJ4bWxDb250ZW50cyk7Ci0JCQlwcm92aWRlci5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQkJCXByb3ZpZGVyLnNldFJvb3RFbGVtZW50TmFtZSgid2ViLWFwcCIpOyAvLyROT04tTkxTLTEkCi0JCQlwcm92aWRlci5zZXRCYXNlUmVmZXJlbmNlKHdlYnhtbC5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJZG9jdW1lbnQgPSBwcm92aWRlci5nZXREb2N1bWVudChmYWxzZSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsICIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHdlYnhtbENvbnRlbnRzICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJd2VieG1sQ29udGVudHMuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJfQotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiY3JlYXRpbmcgcmVjb3JkcyBmb3IgIiArIHdlYnhtbC5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVdlYlhNTFJlY29yZCB3ZWJ4bWxSZWNvcmQgPSBuZXcgV2ViWE1MUmVjb3JkKCk7Ci0JCXdlYnhtbFJlY29yZC5wYXRoID0gd2VieG1sLmdldEZ1bGxQYXRoKCk7Ci0JCWZXZWJYTUxSZWZlcmVuY2VzLnB1dCh3ZWJ4bWxSZWNvcmQuZ2V0V2ViWE1MKCkudG9TdHJpbmcoKSwgd2VieG1sUmVjb3JkKTsKLQkJTm9kZUxpc3QgdGFnbGlicyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKEpTUDEyVExETmFtZXMuVEFHTElCKTsKLQkJZm9yIChpbnQgaVRhZ2xpYiA9IDA7IGlUYWdsaWIgPCB0YWdsaWJzLmdldExlbmd0aCgpOyBpVGFnbGliKyspIHsKLQkJCVN0cmluZyB0YWdsaWJVcmkgPSByZWFkVGV4dG9mQ2hpbGQodGFnbGlicy5pdGVtKGlUYWdsaWIpLCAidGFnbGliLXVyaSIpLnRyaW0oKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gc3BlY2lmaWVkIGxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHJvb3Qgb2YgdGhlIHdlYmFwcAotCQkJU3RyaW5nIHRhZ2xpYkxvY2F0aW9uID0gcmVhZFRleHRvZkNoaWxkKHRhZ2xpYnMuaXRlbShpVGFnbGliKSwgInRhZ2xpYi1sb2NhdGlvbiIpLnRyaW0oKTsgLy8kTk9OLU5MUy0xJAotCQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCQlpZiAodGFnbGliTG9jYXRpb24uc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlwYXRoID0gbmV3IFBhdGgoZ2V0TG9jYWxSb290KHdlYnhtbC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpICsgdGFnbGliTG9jYXRpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGF0aCA9IG5ldyBQYXRoKFVSSUhlbHBlci5ub3JtYWxpemUodGFnbGliTG9jYXRpb24sIHdlYnhtbC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGdldExvY2FsUm9vdCh3ZWJ4bWwuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSkpOwotCQkJfQotCQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJSUZpbGUgcmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCQkJaWYgKHJlc291cmNlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCUlUYWdsaWJSZWNvcmQgcmVjb3JkID0gbnVsbDsKLQkJCQkJLyoKLQkJCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNTk2MAotCQkJCQkgKiAKLQkJCQkJICogQWxzbyBzdXBwb3J0IG1hcHBpbmdzIHRvIC5qYXIgZmlsZXMKLQkJCQkJICovCi0JCQkJCWlmICgiamFyIi5lcXVhbHNJZ25vcmVDYXNlKHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJSmFyUmVjb3JkIGphclJlY29yZCA9IGNyZWF0ZUpBUlJlY29yZChyZXNvdXJjZSk7Ci0JCQkJCQlTdHJpbmdbXSBlbnRyaWVzID0gSmFyVXRpbGl0aWVzLmdldEVudHJ5TmFtZXMocmVzb3VyY2UpOwotCQkJCQkJZm9yIChpbnQgakVudHJ5ID0gMDsgakVudHJ5IDwgZW50cmllcy5sZW5ndGg7IGpFbnRyeSsrKSB7Ci0JCQkJCQkJaWYgKGVudHJpZXNbakVudHJ5XS5lbmRzV2l0aCgiLnRsZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJaWYgKGVudHJpZXNbakVudHJ5XS5lcXVhbHMoSmFyVXRpbGl0aWVzLkpTUDExX1RBR0xJQikpIHsKLQkJCQkJCQkJCWphclJlY29yZC5oYXMxMVRMRCA9IHRydWU7Ci0JCQkJCQkJCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IEphclV0aWxpdGllcy5nZXRJbnB1dFN0cmVhbShyZXNvdXJjZSwgZW50cmllc1tqRW50cnldKTsKLQkJCQkJCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJVGFnbGliSW5mbyBpbmZvID0gZXh0cmFjdEluZm8ocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBjb250ZW50cyk7Ci0JCQkJCQkJCQkJamFyUmVjb3JkLmluZm8gPSBpbmZvOwotCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJcmVjb3JkID0gamFyUmVjb3JkOwotCQkJCQkJLy8gdGhlIHN0b3JlZCBVUkkgc2hvdWxkIHJlZmxlY3QgdGhlIHdlYi54bWwncyB2YWx1ZQotCQkJCQkJaWYgKGphclJlY29yZC5pbmZvID09IG51bGwpIHsKLQkJCQkJCQlqYXJSZWNvcmQuaW5mbyA9IG5ldyBUYWdsaWJJbmZvKCk7Ci0JCQkJCQl9Ci0JCQkJCQlqYXJSZWNvcmQuaW5mby51cmkgPSB0YWdsaWJVcmk7Ci0JCQkJCQlqYXJSZWNvcmQuaXNNYXBwZWRJbldlYlhNTCA9IHRydWU7Ci0JCQkJCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiY3JlYXRlZCB3ZWIueG1sIHJlY29yZCBmb3IgIiArIHRhZ2xpYlVyaSArICJAIiArIGphclJlY29yZC5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlUTERSZWNvcmQgdGxkUmVjb3JkID0gY3JlYXRlVExEUmVjb3JkKHJlc291cmNlKTsKLQkJCQkJCXJlY29yZCA9IHRsZFJlY29yZDsKLQkJCQkJCS8vIHRoZSBzdG9yZWQgVVJJIHNob3VsZCByZWZsZWN0IHRoZSB3ZWIueG1sJ3MgdmFsdWUKLQkJCQkJCXRsZFJlY29yZC5pbmZvLnVyaSA9IHRhZ2xpYlVyaTsKLQkJCQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJjcmVhdGVkIHdlYi54bWwgcmVjb3JkIGZvciAiICsgdGFnbGliVXJpICsgIkAiICsgdGxkUmVjb3JkLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCWlmIChyZWNvcmQgIT0gbnVsbCkgewotCQkJCQkJd2VieG1sUmVjb3JkLnRsZFJlY29yZHMuYWRkKHJlY29yZCk7Ci0JCQkJCQlnZXRJbXBsaWNpdFJlZmVyZW5jZXMod2VieG1sLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkucHV0KHRhZ2xpYlVyaSwgcmVjb3JkKTsKLQkJCQkJCVRhZ2xpYkluZGV4LmdldEluc3RhbmNlKCkuYWRkRGVsdGEobmV3IFRhZ2xpYkluZGV4RGVsdGEoZlByb2plY3QsIHJlY29yZCwgZGVsdGFLaW5kKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9UYWdsaWJJbmRleC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvVGFnbGliSW5kZXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgzNjM0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9UYWdsaWJJbmRleC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UTERDTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIEEgbm9uLWV4dGVuZGFibGUgaW5kZXggbWFuYWdlciBmb3IgdGFnbGlicyBzaW1pbGFyIHRvIHRoZSBwcmV2aW91cyBKMkVFCi0gKiBJVGFnbGliUmVnaXN0cnkgYnV0IGxhY2tpbmcgYW55IHRpZXMgdG8gcHJvamVjdCBuYXR1cmVzLiBFYWNoIHJlY29yZAotICogcmV0dXJuZWQgZnJvbSB0aGUgaW5kZXggcmVwcmVzZW50cyBhIHNpbmdsZSB0YWcgbGlicmFyeSBkZXNjcmlwdG9yLgotICogCi0gKiBJbmRleGluZyBpcyBvbmx5IHBlcnNpc3RlZCBiZXR3ZWVuIHNlc3Npb25zIGZvciBlbnRyaWVzIG9uIHRoZSBKYXZhIEJ1aWxkCi0gKiBQYXRoLiBOZXcgQUREIGV2ZW50cyB3aWxsIGJlIHNlbnQgdG8gSVRhZ2xpYkluZGV4TGlzdGVuZXJzIGR1cmluZyBlYWNoCi0gKiB3b3JrYmVuY2ggc2Vzc2lvbiBmb3IgYm90aCBjYWNoZWQgYW5kIG5ld2x5IGZvdW5kIHJlY29yZHMuIFJFTU9WRSBldmVudHMKLSAqIGFyZSBub3QgZmlyZWQgb24gd29ya2JlbmNoIHNodXRkb3duLiBUaGUgcmVjb3JkJ3MgY29udGVudHMgc2hvdWxkIGJlCi0gKiBleGFtaW5lZCBmb3IgYW55IGZ1cnRoZXIgaW5mb3JtYXRpb24uCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRhZ2xpYkluZGV4IHsKLQljbGFzcyBDbGFzc3BhdGhDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElFbGVtZW50Q2hhbmdlZExpc3RlbmVyIHsKLQkJTGlzdCBwcm9qZWN0c0luZGV4ZWQgPSBuZXcgQXJyYXlMaXN0KDEpOwotCi0JCXB1YmxpYyB2b2lkIGVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCWlmICghaXNJbmRleEF2YWlsYWJsZSgpKQotCQkJCXJldHVybjsKLQkJCXRyeSB7Ci0JCQkJTE9DSy5hY3F1aXJlKCk7Ci0JCQkJaWYgKF9kZWJ1Z0V2ZW50cykgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiVGFnbGliSW5kZXggcmVzcG9uZGluZyB0bzoiICsgZXZlbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXByb2plY3RzSW5kZXhlZC5jbGVhcigpOwotCQkJCWVsZW1lbnRDaGFuZ2VkKGV2ZW50LmdldERlbHRhKCksIHRydWUpOwotCQkJCWZpcmVDdXJyZW50RGVsdGEoZXZlbnQpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgZWxlbWVudENoYW5nZWQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEsIGJvb2xlYW4gZm9yY2VVcGRhdGUpIHsKLQkJCWlmIChmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpKQotCQkJCXJldHVybjsKLQotCQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBkZWx0YS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5KQVZBX01PREVMKSB7Ci0JCQkJSUphdmFFbGVtZW50RGVsdGFbXSBjaGFuZ2VkID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlZC5sZW5ndGg7IGkrKykgewotCQkJCQllbGVtZW50Q2hhbmdlZChjaGFuZ2VkW2ldLCBmb3JjZVVwZGF0ZSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gSGFuZGxlIGFueSBjaGFuZ2VzIGF0IHRoZSBwcm9qZWN0IGxldmVsCi0JCQllbHNlIGlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCkgewotCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0xBU1NQQVRIX0NIQU5HRUQpICE9IDApIHsKLQkJCQkJSUphdmFFbGVtZW50IHByb2ogPSBlbGVtZW50OwotCQkJCQloYW5kbGVDbGFzc3BhdGhDaGFuZ2UoKElKYXZhUHJvamVjdCkgcHJvaiwgZm9yY2VVcGRhdGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJSUphdmFFbGVtZW50RGVsdGFbXSBkZWx0YXMgPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQkJCWlmIChkZWx0YXMubGVuZ3RoID09IDApIHsKLQkJCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCB8fCAoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0xPU0VEKSAhPSAwKSB7Ci0JCQkJCQkJLyoKLQkJCQkJCQkgKiBJZiB0aGUgcHJvamVjdCBpcyBiZWluZyBkZWxldGVkIG9yIGNsb3NlZCwganVzdAotCQkJCQkJCSAqIHJlbW92ZSB0aGUgZGVzY3JpcHRpb24KLQkJCQkJCQkgKi8KLQkJCQkJCQlJSmF2YVByb2plY3QgcHJvaiA9IChJSmF2YVByb2plY3QpIGVsZW1lbnQ7Ci0JCQkJCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKFByb2plY3REZXNjcmlwdGlvbikgZlByb2plY3REZXNjcmlwdGlvbnMucmVtb3ZlKHByb2ouZ2V0UHJvamVjdCgpKTsKLQkJCQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQkJCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikgewotCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgInJlbW92aW5nIGluZGV4IG9mICIgKyBkZXNjcmlwdGlvbi5mUHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJLy8gcmVtb3ZpbmcgdGhlIGluZGV4IGZpbGUgZW5zdXJlcyB0aGF0IHdlCi0JCQkJCQkJCS8vIGRvbid0IGdldCBzdGFsZSBkYXRhIGlmIHRoZSBwcm9qZWN0IGlzCi0JCQkJCQkJCS8vIHJlb3BlbmVkCi0JCQkJCQkJCXJlbW92ZUluZGV4KHByb2ouZ2V0UHJvamVjdCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLyoKLQkJCQkJICogKGVsc2UpIFdpdGhvdXQgdGhlIGNsYXNzcGF0aCBjaGFuZ2luZywgdGhlcmUncyBub3RoaW5nCi0JCQkJCSAqIGVsc2UgdG8gZG8KLQkJCQkJICovCi0JCQkJCWVsc2UgewotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQllbGVtZW50Q2hhbmdlZChkZWx0YXNbaV0sIGZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8qCi0JCQkgKiBPdGhlciBtb2RpZmljYXRpb24gdG8gdGhlIGNsYXNzcGF0aCAoc3VjaCBhcyB3aXRoaW4gYSBjbGFzc3BhdGgKLQkJCSAqIGNvbnRhaW5lciBsaWtlICJXZWIgQXBwIExpYnJhcmllcyIpIGdvIHRvIHRoZSBkZXNjcmlwdGlvbgotCQkJICogaXRzZWxmCi0JCQkgKi8KLQkJCWVsc2UgaWYgKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9BRERFRF9UT19DTEFTU1BBVEgpICE9IDAgfHwgKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1JFTU9WRURfRlJPTV9DTEFTU1BBVEgpICE9IDApIHsKLQkJCQlJSmF2YVByb2plY3QgYWZmZWN0ZWRQcm9qZWN0ID0gZWxlbWVudC5nZXRKYXZhUHJvamVjdCgpOwotCQkJCWlmIChhZmZlY3RlZFByb2plY3QgIT0gbnVsbCkgewotCQkJCQkvKgotCQkJCQkgKiBJZiB0aGUgYWZmZWN0ZWQgcHJvamVjdCBoYXMgYW4gaW5kZXggb24tZGlzaywgaXQncwotCQkJCQkgKiBnb2luZyB0byBiZSBpbnZhbGlkLS13ZSBuZWVkIHRvIGNyZWF0ZS9sb2FkIHRoZQotCQkJCQkgKiBkZXNjcmlwdGlvbiBzbyBpdCB3aWxsIGJlIHVwIHRvIGRhdGUgW2xvYWRpbmcgbm93IGFuZAotCQkJCQkgKiB1cGRhdGluZyBpcyB1c3VhbGx5IGZhc3RlciB0aGFuIHJlZ2VuZXJhdGluZyB0aGUgZW50aXJlCi0JCQkJCSAqIGluZGV4XS4gSWYgdGhlcmUgaXMgbm8gaW5kZXggb24gZGlzaywgZG8gbm90aGluZyBtb3JlLgotCQkJCQkgKi8KLQkJCQkJRmlsZSBpbmRleEZpbGUgPSBuZXcgRmlsZShjb21wdXRlSW5kZXhMb2NhdGlvbihhZmZlY3RlZFByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkpKTsKLQkJCQkJaWYgKGluZGV4RmlsZS5leGlzdHMoKSkgewotCQkJCQkJUHJvamVjdERlc2NyaXB0aW9uIGFmZmVjdGVkRGVzY3JpcHRpb24gPSBjcmVhdGVEZXNjcmlwdGlvbihhZmZlY3RlZFByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJCQkJCWlmIChhZmZlY3RlZERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCQlhZmZlY3RlZERlc2NyaXB0aW9uLmhhbmRsZUVsZW1lbnRDaGFuZ2VkKGRlbHRhKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlwcm9qZWN0c0luZGV4ZWQuYWRkKGFmZmVjdGVkUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBoYW5kbGVDbGFzc3BhdGhDaGFuZ2UoSUphdmFQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gZm9yY2VVcGRhdGUpIHsKLQkJCWlmIChmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpKQotCQkJCXJldHVybjsKLQotCQkJdHJ5IHsKLQkJCQkvKiBIYW5kbGUgbGFyZ2UgY2hhbmdlcyB0byB0aGlzIHByb2plY3QncyBidWlsZCBwYXRoICovCi0JCQkJSVJlc291cmNlIHJlc291cmNlID0gcHJvamVjdC5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUICYmICFwcm9qZWN0c0luZGV4ZWQuY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIFVzZSBnZXQgaW5zdGVhZCBvZiBjcmVhdGUgc2luY2UgdGhlIGRvd25zdHJlYW0KLQkJCQkJICogKHVwc3RyZWFtPykgcHJvamVjdCB3YXNuJ3QgaXRzZWxmIG1vZGlmaWVkLgotCQkJCQkgKi8KLQkJCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gbnVsbDsKLQkJCQkJaWYgKGZvcmNlVXBkYXRlKSB7Ci0JCQkJCQlkZXNjcmlwdGlvbiA9IGNyZWF0ZURlc2NyaXB0aW9uKChJUHJvamVjdCkgcmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZGVzY3JpcHRpb24gPSBnZXREZXNjcmlwdGlvbigoSVByb2plY3QpIHJlc291cmNlKTsKLQkJCQkJfQotCQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCAmJiAhZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkgewotCQkJCQkJcHJvamVjdHNJbmRleGVkLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQlkZXNjcmlwdGlvbi5zZXRCdWlsZFBhdGhJc0RpcnR5KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoIWlzSW5kZXhBdmFpbGFibGUoKSkKLQkJCQlyZXR1cm47Ci0JCQl0cnkgewotCQkJCUxPQ0suYWNxdWlyZSgpOwotCQkJCWlmIChfZGVidWdFdmVudHMpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlRhZ2xpYkluZGV4IHJlc3BvbmRpbmcgdG86IiArIGV2ZW50ICsgIlxuIiArIGV2ZW50LmdldERlbHRhKCkpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJc3dpdGNoIChldmVudC5nZXRUeXBlKCkpIHsKLQkJCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgOgotCQkJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUgOiB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIHBhaXIgZGVsdGFzIHdpdGggcHJvamVjdHMKLQkJCQkJCQlJUmVzb3VyY2VEZWx0YVtdIGRlbHRhcyA9IG5ldyBJUmVzb3VyY2VEZWx0YVtde2V2ZW50LmdldERlbHRhKCl9OwotCQkJCQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSBudWxsOwotCi0JCQkJCQkJaWYgKGRlbHRhcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCQkJCQkJCWlmIChkZWx0YXNbMF0gIT0gbnVsbCkgewotCQkJCQkJCQkJcmVzb3VyY2UgPSBkZWx0YXNbMF0uZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCXJlc291cmNlID0gZXZlbnQuZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCQkJfQotCi0JCQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5ST09UKSB7Ci0JCQkJCQkJCQkJZGVsdGFzID0gZGVsdGFzWzBdLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCQkJCQkJCQlwcm9qZWN0cyA9IG5ldyBJUHJvamVjdFtkZWx0YXMubGVuZ3RoXTsKLQkJCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJCQlpZiAoZGVsdGFzW2ldLmdldFJlc291cmNlKCkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQkJCQkJCQkJCQlwcm9qZWN0c1tpXSA9IChJUHJvamVjdCkgZGVsdGFzW2ldLmdldFJlc291cmNlKCk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQlwcm9qZWN0cyA9IG5ldyBJUHJvamVjdFsxXTsKLQkJCQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQkJCQkJCQkJCXByb2plY3RzWzBdID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQkJcHJvamVjdHNbMF0gPSAoSVByb2plY3QpIHJlc291cmNlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikgewotCQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJUYWdsaWJJbmRleCBub3RpY2VkICIgKyBwcm9qZWN0c1tpXS5nZXROYW1lKCkgKyAiIGlzIGFib3V0IHRvIGJlIGRlbGV0ZWQvY2xvc2VkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJfQotCQkJCQkJCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKFByb2plY3REZXNjcmlwdGlvbikgZlByb2plY3REZXNjcmlwdGlvbnMucmVtb3ZlKHByb2plY3RzW2ldKTsKLQkJCQkJCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pIHsKLQkJCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgInJlbW92aW5nIGluZGV4IG9mICIgKyBkZXNjcmlwdGlvbi5mUHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWRlc2NyaXB0aW9uLmNsZWFyKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyByZXNvdXJjZSBkZWxldGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSA6IHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gcGFpciBkZWx0YXMgd2l0aCBwcm9qZWN0cwotCQkJCQkJCUlSZXNvdXJjZURlbHRhW10gZGVsdGFzID0gbmV3IElSZXNvdXJjZURlbHRhW117ZXZlbnQuZ2V0RGVsdGEoKX07Ci0JCQkJCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IG51bGw7Ci0KLQkJCQkJCQlpZiAoZGVsdGFzLmxlbmd0aCA+IDApIHsKLQkJCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJCQkJCQkJaWYgKGRlbHRhc1swXSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlyZXNvdXJjZSA9IGRlbHRhc1swXS5nZXRSZXNvdXJjZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJcmVzb3VyY2UgPSBldmVudC5nZXRSZXNvdXJjZSgpOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlJPT1QpIHsKLQkJCQkJCQkJCQlkZWx0YXMgPSBkZWx0YXNbMF0uZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJCQkJCQkJCXByb2plY3RzID0gbmV3IElQcm9qZWN0W2RlbHRhcy5sZW5ndGhdOwotCQkJCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQkJCWlmIChkZWx0YXNbaV0uZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQkJCQkJCQkJCXByb2plY3RzW2ldID0gKElQcm9qZWN0KSBkZWx0YXNbaV0uZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCXByb2plY3RzID0gbmV3IElQcm9qZWN0WzFdOwotCQkJCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQkJCQkJCQkJcHJvamVjdHNbMF0gPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCQlwcm9qZWN0c1swXSA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCWlmIChkZWx0YXNbaV0uZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgJiYgKGRlbHRhc1tpXS5nZXRGbGFncygpID09IElSZXNvdXJjZURlbHRhLkVOQ09ESU5HIHx8IGRlbHRhc1tpXS5nZXRGbGFncygpID09IElSZXNvdXJjZURlbHRhLk1BUktFUlMpKQotCQkJCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlpZiAoZGVsdGFzW2ldICE9IG51bGwgJiYgZGVsdGFzW2ldLmdldEtpbmQoKSAhPSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEICYmIHByb2plY3RzW2ldLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQkJCQkJCVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGdldERlc2NyaXB0aW9uKHByb2plY3RzW2ldKTsKLQkJCQkJCQkJCQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwgJiYgIWZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpIHsKLQkJCQkJCQkJCQkJCWRlbHRhc1tpXS5hY2NlcHQoZGVzY3JpcHRpb24uZ2V0VmlzaXRvcigpKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlpZiAoIXByb2plY3RzW2ldLmlzQWNjZXNzaWJsZSgpIHx8IChkZWx0YXNbaV0gIT0gbnVsbCAmJiBkZWx0YXNbaV0uZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpKSB7Ci0JCQkJCQkJCQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKSB7Ci0JCQkJCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiVGFnbGliSW5kZXggbm90aWNlZCAiICsgcHJvamVjdHNbaV0uZ2V0TmFtZSgpICsgIiB3YXMgcmVtb3ZlZCBvciBpcyBubyBsb25nZXIgYWNjZXNzaWJsZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSAoUHJvamVjdERlc2NyaXB0aW9uKSBmUHJvamVjdERlc2NyaXB0aW9ucy5yZW1vdmUocHJvamVjdHNbaV0pOwotCQkJCQkJCQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQkJCQkJCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pIHsKLQkJCQkJCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAicmVtb3ZpbmcgaW5kZXggb2YgIiArIGRlc2NyaXB0aW9uLmZQcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCWRlc2NyaXB0aW9uLmNsZWFyKCk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIHJlc291cmNlIGNoYW5nZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlmaXJlQ3VycmVudERlbHRhKGV2ZW50KTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCUxPQ0sucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0JfQotCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnQ2hhbmdlTGlzdGVuZXIgPSBmYWxzZTsKLQotCXN0YXRpYyBib29sZWFuIF9kZWJ1Z0V2ZW50cyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL2V2ZW50cyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlzdGF0aWMgYm9vbGVhbiBfZGVidWdJbmRleENyZWF0aW9uID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS90YWdsaWIvaW5kZXhjcmVhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWdSZXNvbHV0aW9uID0gInRydWUiLmVxdWFscyhQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3RhZ2xpYi9yZXNvbHZlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXN0YXRpYyBUYWdsaWJJbmRleCBfaW5zdGFuY2UgPSBuZXcgVGFnbGliSW5kZXgoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENSQzMyIGNoZWNrc3VtQ2FsY3VsYXRvciA9IG5ldyBDUkMzMigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFOID0gIkNMRUFOIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSVFkgPSAiRElSVFkiOwotCXN0YXRpYyBib29sZWFuIEVOQUJMRUQgPSBmYWxzZTsKLQotCXN0YXRpYyBJTG9jayBMT0NLID0gSm9iLmdldEpvYk1hbmFnZXIoKS5uZXdMb2NrKCk7Ci0KLQkvKioKLQkgKiBOT1QgQVBJLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIGJlIGFkZGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFRhZ2xpYkluZGV4TGlzdGVuZXIoSVRhZ2xpYkluZGV4TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGdldEluc3RhbmNlKCkuaXNJbml0aWFsaXplZCgpKQotCQkJZ2V0SW5zdGFuY2UoKS5pbnRlcm5hbEFkZFRhZ2xpYkluZGV4TGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXN0YXRpYyB2b2lkIGZpcmVUYWdsaWJEZWx0YShJVGFnbGliSW5kZXhEZWx0YSBkZWx0YSkgewotCQlpZiAoX2RlYnVnRXZlbnRzKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiVGFnbGliSW5kZXggZmlyZWQgZGVsdGE6IiArIGRlbHRhICsgIiBbIiArIGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKS5sZW5ndGggKyAiXVxuIiArICgoVGFnbGliSW5kZXhEZWx0YSkgZGVsdGEpLnRyaWdnZXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLyoKLQkJICogRmx1c2ggYW55IHNoYXJlZCBjYWNoZSBlbnRyaWVzLCB0aGUgVGFnbGliQ29udHJvbGxlcnMgc2hvdWxkIGhhbmRsZQotCQkgKiB1cGRhdGluZyB0aGVpciBkb2N1bWVudHMgYXMgbmVlZGVkLgotCQkgKi8KLQkJSVRhZ2xpYkluZGV4RGVsdGFbXSBkZWx0YXMgPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJVGFnbGliUmVjb3JkIHRhZ2xpYlJlY29yZCA9IGRlbHRhc1tpXS5nZXRUYWdsaWJSZWNvcmQoKTsKLQkJCWlmICh0YWdsaWJSZWNvcmQgIT0gbnVsbCkgewotCQkJCU9iamVjdCB1bmlxdWVJZGVudGlmaWVyID0gVExEQ01Eb2N1bWVudE1hbmFnZXIuZ2V0VW5pcXVlSWRlbnRpZmllcih0YWdsaWJSZWNvcmQpOwotCQkJCWlmICh1bmlxdWVJZGVudGlmaWVyICE9IG51bGwpIHsKLQkJCQkJVExEQ01Eb2N1bWVudE1hbmFnZXIuZ2V0U2hhcmVkRG9jdW1lbnRDYWNoZSgpLnJlbW92ZSh1bmlxdWVJZGVudGlmaWVyKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiaWRlbnRpZmllciBmb3IgIiArIHRhZ2xpYlJlY29yZCArICIgd2FzIG51bGwiKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3luY2hyb25pemVkIChUTERDTURvY3VtZW50TWFuYWdlci5nZXRTaGFyZWREb2N1bWVudENhY2hlKCkpIHsKLQkJCUl0ZXJhdG9yIHZhbHVlcyA9IFRMRENNRG9jdW1lbnRNYW5hZ2VyLmdldFNoYXJlZERvY3VtZW50Q2FjaGUoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHZhbHVlcy5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgbyA9IHZhbHVlcy5uZXh0KCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBSZWZlcmVuY2UpIHsKLQkJCQkJdmFsdWVzLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChfaW5zdGFuY2UuaXNJbml0aWFsaXplZCgpKSB7Ci0JCQlJVGFnbGliSW5kZXhMaXN0ZW5lcltdIGxpc3RlbmVycyA9IF9pbnN0YW5jZS5mVGFnbGliSW5kZXhMaXN0ZW5lcnM7Ci0JCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxpc3RlbmVycy5sZW5ndGg7IGorKykgewotCQkJCQl0cnkgewotCQkJCQkJbGlzdGVuZXJzW2pdLmluZGV4Q2hhbmdlZChkZWx0YSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEZpbmRzIGFsbCBvZiB0aGUgdmlzaWJsZSBJVGFnbGliUmVjb3JkcyBmb3IgdGhlIGdpdmVuIHBhdGggaW4gdGhlCi0JICogd29ya3NwYWNlLiBUYWdsaWIgbWFwcGluZ3MgZnJvbSB3ZWIueG1sIGZpbGVzIGFyZSBvbmx5IHZpc2libGUgdG8gcGF0aHMKLQkgKiB3aXRoaW4gdGhlIHdlYi54bWwncyBjb3JyZXNwb25kaW5nIHdlYiBjb250ZW50IGZvbGRlci4KLQkgKiAKLQkgKiBAcGFyYW0gZnVsbFBhdGggLQotCSAqICAgICAgICAgICAgYSBwYXRoIHdpdGhpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbGwgb2YgdGhlIHZpc2libGUgSVRhZ2xpYlJlY29yZHMgZnJvbSB0aGUgZ2l2ZW4gcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElUYWdsaWJSZWNvcmRbXSBnZXRBdmFpbGFibGVUYWdsaWJSZWNvcmRzKElQYXRoIGZ1bGxQYXRoKSB7Ci0JCWlmICghX2luc3RhbmNlLmlzSW5pdGlhbGl6ZWQoKSkgewotCQkJcmV0dXJuIG5ldyBJVGFnbGliUmVjb3JkWzBdOwotCQl9Ci0JCUlUYWdsaWJSZWNvcmRbXSByZWNvcmRzID0gbnVsbDsKLQkJaWYgKGdldEluc3RhbmNlKCkuaXNJbml0aWFsaXplZCgpKSB7Ci0JCQlyZWNvcmRzID0gZ2V0SW5zdGFuY2UoKS5pbnRlcm5hbEdldEF2YWlsYWJsZVRhZ2xpYlJlY29yZHMoZnVsbFBhdGgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVjb3JkcyA9IG5ldyBJVGFnbGliUmVjb3JkWzBdOwotCQl9Ci0JCWdldEluc3RhbmNlKCkuZmlyZUN1cnJlbnREZWx0YSgiZW51bWVyYXRlOiAiICsgZnVsbFBhdGgpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZWNvcmRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElQYXRoIGNvbnNpZGVyZWQgdG8gYmUgdGhlIHdlYi1hcHAgcm9vdCBmb3IgdGhlIGdpdmVuIHBhdGguCi0JICogQWxsIHJlc29sdXRpb24gZnJvbSB0aGUgZ2l2ZW4gcGF0aCBiZWdpbm5pbmcgd2l0aCAnLycgd2lsbCBiZSByZWxhdGl2ZQotCSAqIHRvIHRoZSBjb21wdXRlZCB3ZWItYXBwIHJvb3QuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLSBpcyBub3QgY29ycmVjdCBpbiBmbGV4aWJsZSBwcm9qZWN0cwotCSAqIEBwYXJhbSBwYXRoIC0KLQkgKiAgICAgICAgICAgIGEgcGF0aCB1bmRlciB0aGUgd2ViLWFwcCByb290Ci0JICogQHJldHVybiB0aGUgSVBhdGggY29uc2lkZXJlZCB0byBiZSB0aGUgd2ViLWFwcCdzIHJvb3QgZm9yIHRoZSBnaXZlbgotCSAqICAgICAgICAgcGF0aCBvciBudWxsIGlmIG9uZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0Q29udGV4dFJvb3QoSVBhdGggcGF0aCkgewotCQl0cnkgewotCQkJTE9DSy5hY3F1aXJlKCk7Ci0JCQlpZiAoZ2V0SW5zdGFuY2UoKS5pc0luaXRpYWxpemVkKCkpIHsKLQkJCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKS5pbnRlcm5hbEdldENvbnRleHRSb290KHBhdGgpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUYWdsaWJJbmRleCBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIF9pbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBOT1QgQVBJLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIGJlIHJlbW92ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlVGFnbGliSW5kZXhMaXN0ZW5lcihJVGFnbGliSW5kZXhMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoIWdldEluc3RhbmNlKCkuaXNJbml0aWFsaXplZCgpKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0SW5zdGFuY2UoKS5pc0luaXRpYWxpemVkKCkpCi0JCQlnZXRJbnN0YW5jZSgpLmludGVybmFsUmVtb3ZlVGFnbGliSW5kZXhMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgYSBtYXRjaGluZyBJVGFnbGliUmVjb3JkIGdpdmVuIHRoZSByZWZlcmVuY2UuIFR5cGljYWxseSB0aGUKLQkgKiByZXN1bHQgd2lsbCBoYXZlIHRvIGJlIGNhc3QgdG8gYSBzdWJpaW50ZXJmYWNlIG9mIElUYWdsaWJSZWNvcmQuCi0JICogCi0JICogQHBhcmFtIGJhc2VQYXRoIC0KLQkgKiAgICAgICAgICAgIHRoZSB3b3Jrc3BhY2UtcmVsYXRpdmUgcGF0aCBmb3IgSVJlc291cmNlcywgZnVsbCBmaWxlc3lzdGVtCi0JICogICAgICAgICAgICBwYXRoIG90aGVyd2lzZQotCSAqIEBwYXJhbSByZWZlcmVuY2UgLQotCSAqICAgICAgICAgICAgdGhlIFVSSSB0byBsb29rdXAsIGZvciBleGFtcGxlIHRoZSB1cmkgdmFsdWUgZnJvbSBhIHRhZ2xpYgotCSAqICAgICAgICAgICAgZGlyZWN0aXZlCi0JICogQHBhcmFtIGNyb3NzUHJvamVjdHMgLQotCSAqICAgICAgICAgICAgd2hldGhlciB0byBzZWFyY2ggYWNyb3NzIHByb2plY3RzIChjdXJyZW50bHkgaWdub3JlZCkKLQkgKiAKLQkgKiBAcmV0dXJuIGEgdmlzaWJsZSBJVGFnbGliUmVjb3JkIG9yIG51bGwgaWYgdGhlIHJlZmVyZW5jZSBwb2ludHMgdG8gbm8KLQkgKiAgICAgICAgIGtub3duIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAU2VlIElUYWdsaWJSZWNvcmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElUYWdsaWJSZWNvcmQgcmVzb2x2ZShTdHJpbmcgYmFzZVBhdGgsIFN0cmluZyByZWZlcmVuY2UsIGJvb2xlYW4gY3Jvc3NQcm9qZWN0cykgewotCQlJVGFnbGliUmVjb3JkIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChnZXRJbnN0YW5jZSgpLmlzSW5pdGlhbGl6ZWQoKSkgewotCQkJcmVzdWx0ID0gZ2V0SW5zdGFuY2UoKS5pbnRlcm5hbFJlc29sdmUoYmFzZVBhdGgsIHJlZmVyZW5jZSwgY3Jvc3NQcm9qZWN0cyk7Ci0JCX0KLQkJZ2V0SW5zdGFuY2UoKS5maXJlQ3VycmVudERlbHRhKCJyZXNvbHZlOiAiICsgcmVmZXJlbmNlKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoX2RlYnVnUmVzb2x1dGlvbikgewotCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlRhZ2xpYkluZGV4IGNvdWxkIG5vdCByZXNvbHZlIFwiIiArIHJlZmVyZW5jZSArICJcIiBmcm9tICIgKyBiYXNlUGF0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3dpdGNoIChyZXN1bHQuZ2V0UmVjb3JkVHlwZSgpKSB7Ci0JCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVExEKSA6IHsKLQkJCQkJCUlUTERSZWNvcmQgcmVjb3JkID0gKElUTERSZWNvcmQpIHJlc3VsdDsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJUYWdsaWJJbmRleCByZXNvbHZlZCAiICsgYmFzZVBhdGggKyAiOiIgKyByZWZlcmVuY2UgKyAiID0gIiArIHJlY29yZC5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5KQVIpIDogewotCQkJCQkJSUphclJlY29yZCByZWNvcmQgPSAoSUphclJlY29yZCkgcmVzdWx0OwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlRhZ2xpYkluZGV4IHJlc29sdmVkICIgKyBiYXNlUGF0aCArICI6IiArIHJlZmVyZW5jZSArICIgPSAiICsgcmVjb3JkLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5UQUdESVIpIDogewotCQkJCQkJSVRhZ0RpclJlY29yZCByZWNvcmQgPSAoSVRhZ0RpclJlY29yZCkgcmVzdWx0OwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlRhZ2xpYkluZGV4IHJlc29sdmVkICIgKyBiYXNlUGF0aCArICI6IiArIHJlZmVyZW5jZSArICIgPSAiICsgcmVjb3JkLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChJVGFnbGliUmVjb3JkLlVSTCkgOiB7Ci0JCQkJCQlJVVJMUmVjb3JkIHJlY29yZCA9IChJVVJMUmVjb3JkKSByZXN1bHQ7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiVGFnbGliSW5kZXggcmVzb2x2ZWQgIiArIGJhc2VQYXRoICsgIjoiICsgcmVmZXJlbmNlICsgIiA9ICIgKyByZWNvcmQuZ2V0VVJMKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBJbnN0cnVjdHMgdGhlIGluZGV4IHRvIHN0b3AgbGlzdGVuaW5nIGZvciByZXNvdXJjZSBhbmQgY2xhc3NwYXRoCi0JICogY2hhbmdlcywgYW5kIHRvIGZvcmdldCBhbGwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHdvcmtzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCXRyeSB7Ci0JCQlMT0NLLmFjcXVpcmUoKTsKLQkJCWlmIChfaW5zdGFuY2UuaXNJbml0aWFsaXplZCgpKSB7Ci0JCQkJX2luc3RhbmNlLnN0b3AoKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCUxPQ0sucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zdHJ1Y3RzIHRoZSBpbmRleCB0byBiZWdpbiBsaXN0ZW5pbmcgZm9yIHJlc291cmNlIGFuZCBjbGFzc3BhdGgKLQkgKiBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydHVwKCkgewotCQlib29sZWFuIHNodXR0aW5nRG93biA9ICFQbGF0Zm9ybS5pc1J1bm5pbmcoKSB8fCBQbGF0Zm9ybS5nZXRCdW5kbGUoT1NHSV9GUkFNRVdPUktfSUQpLmdldFN0YXRlKCkgPT0gQnVuZGxlLlNUT1BQSU5HOwotCQlpZiAoIXNodXR0aW5nRG93bikgewotCQkJdHJ5IHsKLQkJCQlMT0NLLmFjcXVpcmUoKTsKLQkJCQlFTkFCTEVEID0gISJmYWxzZSIuZXF1YWxzSWdub3JlQ2FzZShTeXN0ZW0uZ2V0UHJvcGVydHkoVGFnbGliSW5kZXguY2xhc3MuZ2V0TmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRJbnN0YW5jZSgpLmluaXRpYWxpemVJbnN0YW5jZSgpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENsYXNzcGF0aENoYW5nZUxpc3RlbmVyIGZDbGFzc3BhdGhDaGFuZ2VMaXN0ZW5lciA9IG51bGw7Ci0KLQlwcml2YXRlIFRhZ2xpYkluZGV4RGVsdGEgZkN1cnJlbnRUb3BMZXZlbERlbHRhID0gbnVsbDsKLQotCU1hcCBmUHJvamVjdERlc2NyaXB0aW9ucyA9IG51bGw7Ci0KLQlwcml2YXRlIFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgZlJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0KLQlwcml2YXRlIElUYWdsaWJJbmRleExpc3RlbmVyW10gZlRhZ2xpYkluZGV4TGlzdGVuZXJzID0gbnVsbDsKLQotCS8qKiBzeW1ib2xpYyBuYW1lIGZvciBPU0dJIGZyYW1ld29yayAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBPU0dJX0ZSQU1FV09SS19JRCA9ICJvcmcuZWNsaXBzZS5vc2dpIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBUYWdsaWJJbmRleCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUluc3RhbmNlKCkgewotCi0JCWlmIChpc0luaXRpYWxpemVkKCkpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlMT0NLLmFjcXVpcmUoKTsKLQkJCS8qCi0JCQkgKiBjaGVjayBhZ2FpbiwganVzdCBpbmNhc2UgaXQgd2FzIGluaXRpYWxpemVkIG9uIGFub3RoZXIgdGhyZWFkLAotCQkJICogd2hpbGUgd2Ugd2VyZSB3YWl0aW5nIGZvciB0aGUgbG9jawotCQkJICovCi0JCQlpZiAoIWlzSW5pdGlhbGl6ZWQoKSkgewotCQkJCS8qCi0JCQkJICogT25seSBjb25zaWRlciBhIGNyYXNoIGlmIGEgdmFsdWUgZXhpc3RzIGFuZCBpcyBESVJUWSAobm90IGEKLQkJCQkgKiBuZXcgd29ya3NwYWNlKQotCQkJCSAqLwotCQkJCWlmIChESVJUWS5lcXVhbHNJZ25vcmVDYXNlKGdldFN0YXRlKCkpKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiQSB3b3Jrc3BhY2UgY3Jhc2ggd2FzIGRldGVjdGVkLiBUaGUgcHJldmlvdXMgc2Vzc2lvbiBkaWQgbm90IGV4aXQgbm9ybWFsbHkuIE5vdCB1c2luZyBzYXZlZCB0YWdsaWIgaW5kZXhlcy4iKTsgLy8kTk9OLU5MUy0zJAotCQkJCQlyZW1vdmVJbmRleGVzKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQlmUHJvamVjdERlc2NyaXB0aW9ucyA9IG5ldyBIYXNodGFibGUoKTsKLQkJCQlmUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQkJZkNsYXNzcGF0aENoYW5nZUxpc3RlbmVyID0gbmV3IENsYXNzcGF0aENoYW5nZUxpc3RlbmVyKCk7Ci0JCQkJaWYgKEVOQUJMRUQpIHsKLQkJCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQkJCQkJSmF2YUNvcmUuYWRkRWxlbWVudENoYW5nZWRMaXN0ZW5lcihmQ2xhc3NwYXRoQ2hhbmdlTGlzdGVuZXIpOwotCQkJCX0KLQkJCQlzZXRJbnRpYWxpemVkKHRydWUpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBkZWx0YSBhcyBhIGNoaWxkIHRvIGFuIG92ZXJhbGwgZGVsdGEKLQkgKiAKLQkgKiBAcGFyYW0gZGVsdGEKLQkgKi8KLQl2b2lkIGFkZERlbHRhKElUYWdsaWJJbmRleERlbHRhIGRlbHRhKSB7Ci0JCWVuc3VyZURlbHRhKGRlbHRhLmdldFByb2plY3QoKSkuYWRkQ2hpbGREZWx0YShkZWx0YSk7Ci0JfQotCi0JLyoqCi0JICogQmFzZWQgb24gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLmluZGV4aW5nLkluZGV4TWFuYWdlcgotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXJQYXRoCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBjb21wdXRlSW5kZXhMb2NhdGlvbihJUGF0aCBjb250YWluZXJQYXRoKSB7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGNvbXB1dGVJbmRleE5hbWUoY29udGFpbmVyUGF0aCk7Ci0JCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIi0+IGluZGV4IG5hbWUgZm9yICIgKyBjb250YWluZXJQYXRoICsgIiBpcyAiICsgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3RyaW5nIGluZGV4TG9jYXRpb24gPSBnZXRUYWdsaWJJbmRleFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoZmlsZU5hbWUpLnRvT1NTdHJpbmcoKTsKLQkJcmV0dXJuIGluZGV4TG9jYXRpb247Ci0JfQotCi0JU3RyaW5nIGNvbXB1dGVJbmRleE5hbWUoSVBhdGggY29udGFpbmVyUGF0aCkgewotCQljaGVja3N1bUNhbGN1bGF0b3IucmVzZXQoKTsKLQkJY2hlY2tzdW1DYWxjdWxhdG9yLnVwZGF0ZShjb250YWluZXJQYXRoLnRvT1NTdHJpbmcoKS5nZXRCeXRlcygpKTsKLQkJLy8gdXNlICIuZGF0IiBzbyB3ZSdyZSBub3QgY29uZnVzZWQgd2l0aCBKRFQgaW5kZXhlcwotCQlTdHJpbmcgZmlsZU5hbWUgPSBMb25nLnRvU3RyaW5nKGNoZWNrc3VtQ2FsY3VsYXRvci5nZXRWYWx1ZSgpKSArICIuZGF0IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JUHJvamVjdERlc2NyaXB0aW9uIGNyZWF0ZURlc2NyaXB0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUxPQ0suYWNxdWlyZSgpOwotCQkJZGVzY3JpcHRpb24gPSAoUHJvamVjdERlc2NyaXB0aW9uKSBmUHJvamVjdERlc2NyaXB0aW9ucy5nZXQocHJvamVjdCk7Ci0JCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJCS8vIE9uY2Ugd2UndmUgc3RhcnRlZCBpbmRleGluZywgd2UncmUgZGlydHkgYWdhaW4KLQkJCQlpZiAoZlByb2plY3REZXNjcmlwdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJCXNldFN0YXRlKERJUlRZKTsKLQkJCQl9Ci0JCQkJZGVzY3JpcHRpb24gPSBuZXcgUHJvamVjdERlc2NyaXB0aW9uKHByb2plY3QsIGNvbXB1dGVJbmRleExvY2F0aW9uKHByb2plY3QuZ2V0RnVsbFBhdGgoKSkpOwotCQkJCWZQcm9qZWN0RGVzY3JpcHRpb25zLnB1dChwcm9qZWN0LCBkZXNjcmlwdGlvbik7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlMT0NLLnJlbGVhc2UoKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlcyB0aGF0IGEgZGVsdGEgZXhpc3RzIGZvciBob2xkaW5nIGluZGV4IGNoYW5nZSBpbmZvcm1hdGlvbgotCSAqLwotCXByaXZhdGUgVGFnbGliSW5kZXhEZWx0YSBlbnN1cmVEZWx0YShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCS8qCi0JCSAqIFRoZSBmaXJzdCBkZWx0YSB0byBiZSBhZGRlZCB3aWxsIGRldGVybWluZSB3aGljaCBwcm9qZWN0IHRoZQotCQkgKiB0b3AtbGV2ZWwgZGVsdGEgd2lsbCBjb250YWluLgotCQkgKi8KLQkJaWYgKGZDdXJyZW50VG9wTGV2ZWxEZWx0YSA9PSBudWxsKSB7Ci0JCQlmQ3VycmVudFRvcExldmVsRGVsdGEgPSBuZXcgVGFnbGliSW5kZXhEZWx0YShwcm9qZWN0LCBudWxsLCBJVGFnbGliSW5kZXhEZWx0YS5DSEFOR0VEKTsKLQkJfQotCQlyZXR1cm4gZkN1cnJlbnRUb3BMZXZlbERlbHRhOwotCX0KLQotCXZvaWQgZmlyZUN1cnJlbnREZWx0YShPYmplY3QgdHJpZ2dlcikgewotCQlpZiAoZkN1cnJlbnRUb3BMZXZlbERlbHRhICE9IG51bGwpIHsKLQkJCWZDdXJyZW50VG9wTGV2ZWxEZWx0YS50cmlnZ2VyID0gdHJpZ2dlcjsKLQkJCUlUYWdsaWJJbmRleERlbHRhIGRlbHRhID0gZkN1cnJlbnRUb3BMZXZlbERlbHRhOwotCQkJZkN1cnJlbnRUb3BMZXZlbERlbHRhID0gbnVsbDsKLQkJCWZpcmVUYWdsaWJEZWx0YShkZWx0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIGNoZWNrIHRvIHNlZSBpZiB0aGUgT1NHSSBmcmFtZXdvcmsgaXMgc2h1dHRpbmcgZG93bi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFN5c3RlbSBCdW5kbGUgaXMgc3RvcHBlZCAoaWUuIHRoZSBmcmFtZXdvcmsgaXMKLQkgKiAgICAgICAgIHNodXR0aW5nIGRvd24pCi0JICovCi0JYm9vbGVhbiBmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpIHsKLQkJLy8gaW4gdGhlIEZyYW1ld29yayBjbGFzcyB0aGVyZSdzIGEgbm90ZToKLQkJLy8gc2V0IHRoZSBzdGF0ZSBvZiB0aGUgU3lzdGVtIEJ1bmRsZSB0byBTVE9QUElORy4KLQkJLy8gdGhpcyBtdXN0IGJlIGRvbmUgZmlyc3QgYWNjb3JkaW5nIHRvIHNlY3Rpb24gNC4xOS4yIGZyb20gdGhlIE9TR2kKLQkJLy8gUjMgc3BlYy4KLQkJYm9vbGVhbiBzaHV0dGluZ0Rvd24gPSAhUGxhdGZvcm0uaXNSdW5uaW5nKCkgfHwgUGxhdGZvcm0uZ2V0QnVuZGxlKE9TR0lfRlJBTUVXT1JLX0lEKS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5TVE9QUElORzsKLQkJcmV0dXJuIHNodXR0aW5nRG93bjsKLQl9Ci0KLQlQcm9qZWN0RGVzY3JpcHRpb24gZ2V0RGVzY3JpcHRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOwotCQlpZiAoaXNJbml0aWFsaXplZCgpKSB7Ci0JCQlkZXNjcmlwdGlvbiA9IChQcm9qZWN0RGVzY3JpcHRpb24pIGZQcm9qZWN0RGVzY3JpcHRpb25zLmdldChwcm9qZWN0KTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3RhdGUoKSB7Ci0JCVN0cmluZyBzdGF0ZSA9IEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKFRhZ2xpYkluZGV4LmNsYXNzLmdldE5hbWUoKSk7Ci0JCXJldHVybiBzdGF0ZTsKLQl9Ci0KLQlwcml2YXRlIElQYXRoIGdldFRhZ2xpYkluZGV4U3RhdGVMb2NhdGlvbigpIHsKLQkJcmV0dXJuIEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoInRhZ2xpYmluZGV4LyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbEFkZFRhZ2xpYkluZGV4TGlzdGVuZXIoSVRhZ2xpYkluZGV4TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdHJ5IHsKLQkJCUxPQ0suYWNxdWlyZSgpOwotCQkJaWYgKGZUYWdsaWJJbmRleExpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQkJZlRhZ2xpYkluZGV4TGlzdGVuZXJzID0gbmV3IElUYWdsaWJJbmRleExpc3RlbmVyW117bGlzdGVuZXJ9OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJTGlzdCBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoZlRhZ2xpYkluZGV4TGlzdGVuZXJzKSk7Ci0JCQkJaWYgKCFsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQkJCX0KLQkJCQlmVGFnbGliSW5kZXhMaXN0ZW5lcnMgPSAoSVRhZ2xpYkluZGV4TGlzdGVuZXJbXSkgbGlzdGVuZXJzLnRvQXJyYXkobmV3IElUYWdsaWJJbmRleExpc3RlbmVyWzBdKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCUxPQ0sucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJVGFnbGliUmVjb3JkW10gaW50ZXJuYWxHZXRBdmFpbGFibGVUYWdsaWJSZWNvcmRzKElQYXRoIHBhdGgpIHsKLQkJSVRhZ2xpYlJlY29yZFtdIHJlY29yZHMgPSBuZXcgSVRhZ2xpYlJlY29yZFswXTsKLQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPiAwKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHBhdGguc2VnbWVudCgwKSk7Ci0JCQlpZiAocHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJCVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGNyZWF0ZURlc2NyaXB0aW9uKHByb2plY3QpOwotCQkJCUxpc3QgYXZhaWxhYmxlUmVjb3JkcyA9IGRlc2NyaXB0aW9uLmdldEF2YWlsYWJsZVRhZ2xpYlJlY29yZHMocGF0aCk7Ci0KLQkJCQkvLyBJQ2F0YWxvZyBjYXRhbG9nID0KLQkJCQkvLyBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotCQkJCS8vIHdoaWxlIChjYXRhbG9nICE9IG51bGwpIHsKLQkJCQkvLyBJQ2F0YWxvZ0VudHJ5W10gZW50cmllcyA9IGNhdGFsb2cuZ2V0Q2F0YWxvZ0VudHJpZXMoKTsKLQkJCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oZW50cmllc1tpXS5nZXRVUkkoKSk7Ci0JCQkJLy8gfQotCQkJCS8vIElOZXh0Q2F0YWxvZ1tdIG5leHRDYXRhbG9ncyA9IGNhdGFsb2cuZ2V0TmV4dENhdGFsb2dzKCk7Ci0JCQkJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0Q2F0YWxvZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBJQ2F0YWxvZ0VudHJ5W10gZW50cmllczIgPQotCQkJCS8vIG5leHRDYXRhbG9nc1tpXS5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpLmdldENhdGFsb2dFbnRyaWVzKCk7Ci0JCQkJLy8gZm9yIChpbnQgaiA9IDA7IGogPCBlbnRyaWVzMi5sZW5ndGg7IGorKykgewotCQkJCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbihlbnRyaWVzMltqXS5nZXRVUkkoKSk7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyB9Ci0KLQkJCQlyZWNvcmRzID0gKElUYWdsaWJSZWNvcmRbXSkgYXZhaWxhYmxlUmVjb3Jkcy50b0FycmF5KHJlY29yZHMpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWNvcmRzOwotCX0KLQotCXByaXZhdGUgSVBhdGggaW50ZXJuYWxHZXRDb250ZXh0Um9vdChJUGF0aCBwYXRoKSB7Ci0JCUlGaWxlIGJhc2VSZXNvdXJjZSA9IEZpbGVCdWZmZXJzLmdldFdvcmtzcGFjZUZpbGVBdExvY2F0aW9uKHBhdGgpOwotCQlpZiAoYmFzZVJlc291cmNlICE9IG51bGwgJiYgYmFzZVJlc291cmNlLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IGJhc2VSZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZURlc2NyaXB0aW9uKHByb2plY3QpOwotCQkJSVBhdGggcm9vdFBhdGggPSBkZXNjcmlwdGlvbi5nZXRMb2NhbFJvb3QoYmFzZVJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotCQkJcmV0dXJuIHJvb3RQYXRoOwotCQl9Ci0JCS8vIHRyeSB0byBoYW5kbGUgb3V0LW9mLXdvcmtzcGFjZSBwYXRocwotCQlJUGF0aCByb290ID0gcGF0aC5tYWtlQWJzb2x1dGUoKTsKLQkJd2hpbGUgKHJvb3Quc2VnbWVudENvdW50KCkgPiAwICYmICFyb290LmlzUm9vdCgpKQotCQkJcm9vdCA9IHJvb3QucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxSZW1vdmVUYWdsaWJJbmRleExpc3RlbmVyKElUYWdsaWJJbmRleExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRyeSB7Ci0JCQlMT0NLLmFjcXVpcmUoKTsKLQkJCWlmIChmVGFnbGliSW5kZXhMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCUxpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGZUYWdsaWJJbmRleExpc3RlbmVycykpOwotCQkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQkJCWZUYWdsaWJJbmRleExpc3RlbmVycyA9IChJVGFnbGliSW5kZXhMaXN0ZW5lcltdKSBsaXN0ZW5lcnMudG9BcnJheShuZXcgSVRhZ2xpYkluZGV4TGlzdGVuZXJbMF0pOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElUYWdsaWJSZWNvcmQgaW50ZXJuYWxSZXNvbHZlKFN0cmluZyBiYXNlUGF0aCwgZmluYWwgU3RyaW5nIHJlZmVyZW5jZSwgYm9vbGVhbiBjcm9zc1Byb2plY3RzKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlJVGFnbGliUmVjb3JkIHJlc29sdmVkID0gbnVsbDsKLQotCQlQYXRoIGJhc2VJUGF0aCA9IG5ldyBQYXRoKGJhc2VQYXRoKTsKLQkJSVJlc291cmNlIGJhc2VSZXNvdXJjZSA9IEZpbGVCdWZmZXJzLmdldFdvcmtzcGFjZUZpbGVBdExvY2F0aW9uKGJhc2VJUGF0aCk7Ci0KLQkJaWYgKGJhc2VSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCS8vIFRyeSB0aGUgYmFzZSBwYXRoIGFzIGEgZm9sZGVyIGZpcnN0Ci0JCQlpZiAoYmFzZUlQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCWJhc2VSZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0Rm9sZGVyKGJhc2VJUGF0aCk7Ci0JCQl9Ci0JCQkvLyBJZiBub3QgYSBmb2xkZXIsIHRoZW4gdHJ5IGJhc2UgcGF0aCBhcyBhIGZpbGUKLQkJCWlmIChiYXNlUmVzb3VyY2UgIT0gbnVsbCAmJiAhYmFzZVJlc291cmNlLmV4aXN0cygpICYmIGJhc2VJUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQliYXNlUmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldEZpbGUoYmFzZUlQYXRoKTsKLQkJCX0KLQkJCWlmIChiYXNlUmVzb3VyY2UgPT0gbnVsbCAmJiBiYXNlSVBhdGguc2VnbWVudENvdW50KCkgPT0gMSkgewotCQkJCWJhc2VSZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdChiYXNlSVBhdGguc2VnbWVudCgwKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYmFzZVJlc291cmNlID09IG51bGwpIHsKLQkJCS8qCi0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2NTI5Ci0JCQkgKiAKLQkJCSAqIFRoaXMgbWV0aG9kIHByb2R1Y2VzIGEgbGVzcyBhY2N1cmF0ZSByZXN1bHQsIGJ1dCBkb2Vzbid0Ci0JCQkgKiByZXF1aXJlIHRoYXQgdGhlIGZpbGUgZXhpc3QgeWV0LgotCQkJICovCi0JCQlJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihiYXNlSVBhdGgpOwotCQkJaWYgKGZpbGVzLmxlbmd0aCA+IDApCi0JCQkJYmFzZVJlc291cmNlID0gZmlsZXNbMF07Ci0JCX0KLQkJaWYgKGJhc2VSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGJhc2VJUGF0aC5zZWdtZW50KDApKTsKLQkJCWlmIChwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gY3JlYXRlRGVzY3JpcHRpb24ocHJvamVjdCk7Ci0JCQkJcmVzb2x2ZWQgPSBkZXNjcmlwdGlvbi5yZXNvbHZlKGJhc2VQYXRoLCByZWZlcmVuY2UpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc29sdmVkOwotCX0KLQotCWJvb2xlYW4gaXNJbmRleEF2YWlsYWJsZSgpIHsKLQkJcmV0dXJuIF9pbnN0YW5jZS5pc0luaXRpYWxpemVkKCkgJiYgRU5BQkxFRDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGluZGV4IGZpbGUgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVJbmRleChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUZpbGUgaW5kZXhGaWxlID0gbmV3IEZpbGUoY29tcHV0ZUluZGV4TG9jYXRpb24ocHJvamVjdC5nZXRGdWxsUGF0aCgpKSk7Ci0JCWlmIChpbmRleEZpbGUuZXhpc3RzKCkpIHsKLQkJCWluZGV4RmlsZS5kZWxldGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgaW5kZXggZmlsZXMuIFVzZWQgZm9yIG1haW50ZW5hbmNlIGFuZCBrZWVwaW5nIHRoZSBpbmRleCBmb2xkZXIKLQkgKiBhIG1hbmFnZWFibGUgc2l6ZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhbGVPbmx5IC0KLQkgKiAgICAgICAgICAgIGlmIDxiPnRydWU8L2I+LCByZW1vdmVzIG9ubHkgdGhlIGluZGV4ZXMgZm9yIHByb2plY3RzIG5vdAotCSAqICAgICAgICAgICAgb3BlbiBpbiB0aGUgd29ya3NwYWNlLCBpZiA8Yj5mYWxzZTwvYj4sIHJlbW92ZXMgYWxsIG9mIHRoZQotCSAqICAgICAgICAgICAgaW5kZXhlcwotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVJbmRleGVzKGJvb2xlYW4gc3RhbGVPbmx5KSB7Ci0JCVN0cmluZyBvc1BhdGggPSBnZXRUYWdsaWJJbmRleFN0YXRlTG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCUZpbGUgZm9sZGVyID0gbmV3IEZpbGUob3NQYXRoKTsKLQkJaWYgKCFmb2xkZXIuaXNEaXJlY3RvcnkoKSkgewotCQkJdHJ5IHsKLQkJCQlmb2xkZXIubWtkaXIoKTsKLQkJCX0KLQkJCWNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQotCQkvLyByZW1vdmUgYW55IGV4dHJhbmVvdXMgaW5kZXggZmlsZXMKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJTGlzdCBpbmRleE5hbWVzID0gbmV3IEFycmF5TGlzdChwcm9qZWN0cy5sZW5ndGgpOwotCQlpZiAoc3RhbGVPbmx5KSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHByb2plY3RzW2ldLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCWluZGV4TmFtZXMuYWRkKGNvbXB1dGVJbmRleE5hbWUocHJvamVjdHNbaV0uZ2V0RnVsbFBhdGgoKSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChmb2xkZXIuaXNEaXJlY3RvcnkoKSkgewotCQkJRmlsZVtdIGZpbGVzID0gZm9sZGVyLmxpc3RGaWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGZpbGVzICE9IG51bGwgJiYgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCFpbmRleE5hbWVzLmNvbnRhaW5zKGZpbGVzW2ldLmdldE5hbWUoKSkpCi0JCQkJCWZpbGVzW2ldLmRlbGV0ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFN0YXRlKFN0cmluZyBzdGF0ZSkgewotCQlpZiAoIXN0YXRlLmVxdWFscyhnZXRTdGF0ZSgpKSkgewotCQkJSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShUYWdsaWJJbmRleC5jbGFzcy5nZXROYW1lKCksIHN0YXRlKTsKLQkJCUpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3AoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKCkpIHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQkJCUphdmFDb3JlLnJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkNsYXNzcGF0aENoYW5nZUxpc3RlbmVyKTsKLQotCQkJLyoKLQkJCSAqIENsZWFyaW5nIHRoZSBleGlzdGluZyBzYXZlZCBzdGF0ZXMgaGVscHMgcHJ1bmUgZGVhZCBkYXRhIGZyb20KLQkJCSAqIHRoZSBpbmRleCBmb2xkZXIuCi0JCQkgKi8KLQkJCXJlbW92ZUluZGV4ZXModHJ1ZSk7Ci0KLQkJCUl0ZXJhdG9yIGkgPSBmUHJvamVjdERlc2NyaXB0aW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKFByb2plY3REZXNjcmlwdGlvbikgaS5uZXh0KCk7Ci0JCQkJZGVzY3JpcHRpb24uc2F2ZVJlZmVyZW5jZXMoKTsKLQkJCX0KLQotCQkJZlByb2plY3REZXNjcmlwdGlvbnMuY2xlYXIoKTsKLQotCQkJc2V0U3RhdGUoQ0xFQU4pOwotCQkJZlByb2plY3REZXNjcmlwdGlvbnMgPSBudWxsOwotCQkJZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBudWxsOwotCQkJZkNsYXNzcGF0aENoYW5nZUxpc3RlbmVyID0gbnVsbDsKLQkJCXNldEludGlhbGl6ZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0JCXJldHVybiBpbml0aWFsaXplZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0SW50aWFsaXplZChib29sZWFuIGludGlhbGl6ZWQpIHsKLQkJdGhpcy5pbml0aWFsaXplZCA9IGludGlhbGl6ZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvVGFnbGliSW5kZXhEZWx0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvVGFnbGliSW5kZXhEZWx0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzE0ZDhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL1RhZ2xpYkluZGV4RGVsdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLXB1YmxpYyBjbGFzcyBUYWdsaWJJbmRleERlbHRhIGltcGxlbWVudHMgSVRhZ2xpYkluZGV4RGVsdGEgewotCXByaXZhdGUgQ29sbGVjdGlvbiBmQ2hpbGRyZW47Ci0JcHJpdmF0ZSBpbnQgZkV4cGxpY2l0S2luZCA9IC0xOwotCXByaXZhdGUgaW50IGZJbXBsaWNpdEtpbmQgPSAtMTsKLQlwcml2YXRlIElQcm9qZWN0IGZQcm9qZWN0OwotCXByaXZhdGUgSVRhZ2xpYlJlY29yZCBmVGFnbGliUmVjb3JkID0gbnVsbDsKLQlsb25nIHRpbWU7Ci0JT2JqZWN0IHRyaWdnZXIgPSBudWxsOwotCi0JVGFnbGliSW5kZXhEZWx0YShJUHJvamVjdCBwcm9qZWN0LCBJVGFnbGliUmVjb3JkIHJlY29yZCwgaW50IGtpbmQpIHsKLQkJZlByb2plY3QgPSBwcm9qZWN0OwotCQlmVGFnbGliUmVjb3JkID0gcmVjb3JkOwotCQlmRXhwbGljaXRLaW5kID0ga2luZDsKLQkJdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCX0KLQotCXZvaWQgYWRkQ2hpbGREZWx0YShJVGFnbGliSW5kZXhEZWx0YSBkZWx0YSkgewotCQlpZiAoZkNoaWxkcmVuID09IG51bGwpCi0JCQlmQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZDaGlsZHJlbi5hZGQoZGVsdGEpOwotCQlmSW1wbGljaXRLaW5kID0gLTE7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZUtpbmQoKSB7Ci0JCWludCBhZGRlZCA9IDA7Ci0JCWludCByZW1vdmVkID0gMDsKLQotCQlJVGFnbGliSW5kZXhEZWx0YVtdIGNoaWxkcmVuID0gKElUYWdsaWJJbmRleERlbHRhW10pIGZDaGlsZHJlbi50b0FycmF5KG5ldyBJVGFnbGliSW5kZXhEZWx0YVtmQ2hpbGRyZW4uc2l6ZSgpXSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWludCBraW5kID0gY2hpbGRyZW5baV0uZ2V0S2luZCgpOwotCQkJaWYgKGtpbmQgPT0gSVRhZ2xpYkluZGV4RGVsdGEuQURERUQpCi0JCQkJYWRkZWQrKzsKLQkJCWlmIChraW5kID09IElUYWdsaWJJbmRleERlbHRhLlJFTU9WRUQpCi0JCQkJcmVtb3ZlZCsrOwotCQkJaWYgKGFkZGVkID4gMCAmJiByZW1vdmVkID4gMCkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoYWRkZWQgPiAwICYmIHJlbW92ZWQgPiAwKSB7Ci0JCQlyZXR1cm4gSVRhZ2xpYkluZGV4RGVsdGEuQ0hBTkdFRDsKLQkJfQotCQllbHNlIGlmIChhZGRlZCA+IDApIHsKLQkJCXJldHVybiBJVGFnbGliSW5kZXhEZWx0YS5BRERFRDsKLQkJfQotCQllbHNlIGlmIChyZW1vdmVkID4gMCkgewotCQkJcmV0dXJuIElUYWdsaWJJbmRleERlbHRhLlJFTU9WRUQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gSVRhZ2xpYkluZGV4RGVsdGEuQ0hBTkdFRDsKLQkJfQotCX0KLQotCXB1YmxpYyBJVGFnbGliSW5kZXhEZWx0YVtdIGdldEFmZmVjdGVkQ2hpbGRyZW4oKSB7Ci0JCWlmIChmQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBJVGFnbGliSW5kZXhEZWx0YVswXTsKLQkJfQotCQlyZXR1cm4gKElUYWdsaWJJbmRleERlbHRhW10pIGZDaGlsZHJlbi50b0FycmF5KG5ldyBJVGFnbGliSW5kZXhEZWx0YVtmQ2hpbGRyZW4uc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlpZiAoZkNoaWxkcmVuID09IG51bGwpIHsKLQkJCXJldHVybiBmRXhwbGljaXRLaW5kOwotCQl9Ci0JCWlmIChmSW1wbGljaXRLaW5kID09IC0xKSB7Ci0JCQlmSW1wbGljaXRLaW5kID0gY29tcHV0ZUtpbmQoKTsKLQkJfQotCQlyZXR1cm4gZkltcGxpY2l0S2luZDsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIGZQcm9qZWN0OwotCX0KLQotCXB1YmxpYyBJVGFnbGliUmVjb3JkIGdldFRhZ2xpYlJlY29yZCgpIHsKLQkJcmV0dXJuIGZUYWdsaWJSZWNvcmQ7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0VGltZSgpIHsKLQkJcmV0dXJuIHRpbWU7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRUcmlnZ2VyKCkgewotCQlyZXR1cm4gdHJpZ2dlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZlRhZ2xpYlJlY29yZCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gZlRhZ2xpYlJlY29yZC50b1N0cmluZygpOwotCQkJaW50IGtpbmQgPSBnZXRLaW5kKCk7Ci0JCQlzd2l0Y2ggKGtpbmQpIHsKLQkJCQljYXNlIElUYWdsaWJJbmRleERlbHRhLkFEREVEIDoKLQkJCQkJc3RyaW5nID0gIiBBRERFRCAoIiArIHN0cmluZyArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVRhZ2xpYkluZGV4RGVsdGEuQ0hBTkdFRCA6Ci0JCQkJCXN0cmluZyA9ICIgQ0hBTkdFRCAoIiArIHN0cmluZyArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVRhZ2xpYkluZGV4RGVsdGEuUkVNT1ZFRCA6Ci0JCQkJCXN0cmluZyA9ICIgUkVNT1ZFRCAoIiArIHN0cmluZyArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlzdHJpbmcgPSAiIG90aGVyOiIgKyBraW5kICsgIiAoIiArIHN0cmluZyArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWludCBraW5kID0gZ2V0S2luZCgpOwotCQkJc3dpdGNoIChraW5kKSB7Ci0JCQkJY2FzZSBJVGFnbGliSW5kZXhEZWx0YS5BRERFRCA6Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlRhZ2xpYkluZGV4RGVsdGEoIiArIGZQcm9qZWN0ICsgIik6QURERURcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVRhZ2xpYkluZGV4RGVsdGEuQ0hBTkdFRCA6Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlRhZ2xpYkluZGV4RGVsdGEoIiArIGZQcm9qZWN0ICsgIik6Q0hBTkdFRFxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJVGFnbGliSW5kZXhEZWx0YS5SRU1PVkVEIDoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiVGFnbGliSW5kZXhEZWx0YSgiICsgZlByb2plY3QgKyAiKTpSRU1PVkVEXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCX0KLQkJCUlUYWdsaWJJbmRleERlbHRhW10gY2hpbGRyZW4gPSBnZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnXHQnKTsKLQkJCQlidWZmZXIuYXBwZW5kKGNoaWxkcmVuW2ldLnRvU3RyaW5nKCkpOwotCQkJCWlmIChpIDwgY2hpbGRyZW4ubGVuZ3RoIC0gMSkgewotCQkJCQlidWZmZXIuYXBwZW5kKCdcbicpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RleHQvSUpTUFBhcnRpdGlvbnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGV4dC9JSlNQUGFydGl0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWU0YzNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGV4dC9JSlNQUGFydGl0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXh0OwotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgotICogSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uIHR5cGVzIGZvciBKU1AuCi0gKiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUpTUFBhcnRpdGlvbnMgewotCi0JU3RyaW5nIEpTUF9ERUZBVUxUID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuREVGQVVMVF9KU1AiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9DT01NRU5UID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuSlNQX0NPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIEpTUF9TQ1JJUFRfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuU0NSSVBULiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0NPTlRFTlRfREVMSU1JVEVSID0gSlNQX1NDUklQVF9QUkVGSVggKyAiREVMSU1JVEVSIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfQ09OVEVOVF9KQVZBID0gSlNQX1NDUklQVF9QUkVGSVggKyAiSkFWQSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0NPTlRFTlRfSkFWQVNDUklQVCA9IEpTUF9TQ1JJUFRfUFJFRklYICsgIkpBVkFTQ1JJUFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9ERUZBVUxUX0VMID0gSlNQX1NDUklQVF9QUkVGSVggKyAiSlNQX0VMIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfREVGQVVMVF9FTDIgPSBKU1BfU0NSSVBUX1BSRUZJWCArICJKU1BfRUwyIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBKU1BfRElSRUNUSVZFID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuSlNQX0RJUkVDVElWRSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BlZENTU1RhZ2xpYkNvbnRyb2xsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BlZENTU1RhZ2xpYkNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg0YTVmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQZWRDU1NUYWdsaWJDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklEb2N1bWVudFNldHVwUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBKU1BlZENTU1RhZ2xpYkNvbnRyb2xsZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRTZXR1cFBhcnRpY2lwYW50IHsKLQotCXB1YmxpYyB2b2lkIHNldHVwKElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyBpZ25vcmUgVExEIGluIGNvbnRlbnQgdHlwZSBjc3MganNwCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9ySlNQZWRDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JKU1BlZENTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGFmYTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JKU1BlZENTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5KU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLklDb250ZW50RGVzY3JpcHRpb25Gb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZW50RGVzY3JpYmVyRm9ySlNQZWRDU1MgaW1wbGVtZW50cyBJVGV4dENvbnRlbnREZXNjcmliZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWVbXSBTVVBQT1JURURfT1BUSU9OUyA9IHtJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLLCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxULCBJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkNPTlRFTlRfVFlQRV9BVFRSSUJVVEUsIElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuTEFOR1VBR0VfQVRUUklCVVRFfTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXIjZGVzY3JpYmUoamF2YS5pby5JbnB1dFN0cmVhbSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGludCBkZXNjcmliZShJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOVkFMSUQ7Ci0KLQkJLy8gaWYgZGlzY3JpcHRpb24gaXMgbnVsbCwgd2UgYXJlIGp1c3QgYmVpbmcgYXNrZWQgdG8KLQkJLy8gYXNzZXNzIGNvbnRlbnRzIHZhbGlkaXR5Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBkZXRlcm1pbmVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklUZXh0Q29udGVudERlc2NyaWJlciNkZXNjcmliZShqYXZhLmlvLlJlYWRlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGludCBkZXNjcmliZShSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTlZBTElEOwotCi0JCS8vIGlmIGRpc2NyaXB0aW9uIGlzIG51bGwsIHdlIGFyZSBqdXN0IGJlaW5nIGFza2VkIHRvCi0JCS8vIGFzc2VzcyBjb250ZW50cyB2YWxpZGl0eQotCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhjb250ZW50cywgZGVzY3JpcHRpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gZGV0ZXJtaW5lVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBRdWFsaWZpZWROYW1lW10gZ2V0U3VwcG9ydGVkT3B0aW9ucygpIHsKLQkJcmV0dXJuIFNVUFBPUlRFRF9PUFRJT05TOwotCX0KLQotCXByaXZhdGUgaW50IGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCQlpZiAoaXNSZWxldmVudChkZXNjcmlwdGlvbikpIHsKLQkJCUlSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciA9IGdldERldGVjdG9yKCk7Ci0JCQlkZXRlY3Rvci5zZXQoY29udGVudHMpOwotCQkJaGFuZGxlQ2FsY3VsYXRpb25zKGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCQlyZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5WQUxJRDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50cwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIGludCBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJCXJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLlZBTElEOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZ2V0RGV0ZWN0b3IoKSB7Ci0JCXJldHVybiBuZXcgSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNhbGN1bGF0aW9ucyhJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGhhbmRsZSBzdGFuZGFyZCBvbmVzIGZpcnN0LCB0byBiZSBzdXJlIGRldGVjdG9yIHByb2Nlc3NlcwotCQloYW5kbGVTdGFuZGFyZENhbGN1bGF0aW9ucyhkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQkvLyBub3cgZG8gdGhvc2Ugc3BlY2lmaWMgZm9yIEpTUHMKLQkJLy8gbm90ZTogZGV0ZWN0b3Igc2hvdWxkIGFsd2F5cyBiZSBvZiBjb3JyZWN0IGluc3RhbmNlLCBidXQgd2UnbGwKLQkJLy8gY2hlY2ssIGZvciBub3cuCi0JCWlmIChkZXRlY3RvciBpbnN0YW5jZW9mIEpTUFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgewotCQkJSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGpzcERldGVjdG9yID0gKEpTUFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgZGV0ZWN0b3I7Ci0JCQlTdHJpbmcgbGFuZ3VhZ2UgPSBqc3BEZXRlY3Rvci5nZXRMYW5ndWFnZSgpOwotCQkJaWYgKGxhbmd1YWdlICE9IG51bGwgJiYgbGFuZ3VhZ2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5MQU5HVUFHRV9BVFRSSUJVVEUsIGxhbmd1YWdlKTsKLQkJCX0KLQkJCVN0cmluZyBjb250ZW50VHlwZUF0dHJpYnV0ZSA9IGpzcERldGVjdG9yLmdldENvbnRlbnRUeXBlKCk7Ci0JCQlpZiAoY29udGVudFR5cGVBdHRyaWJ1dGUgIT0gbnVsbCAmJiBjb250ZW50VHlwZUF0dHJpYnV0ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkNPTlRFTlRfVFlQRV9BVFRSSUJVVEUsIGNvbnRlbnRUeXBlQXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIE9iamVjdCBkZXRlY3RlZENoYXJzZXQsIE9iamVjdCBqYXZhQ2hhcnNldCkgewotCQlpZiAoZGV0ZWN0ZWRDaGFyc2V0ICE9IG51bGwpIHsKLQkJCS8vIE9uY2Ugd2UgZGV0ZWN0ZWQgYSBjaGFyc2V0LCB3ZSBzaG91bGQgc2V0IHRoZSBwcm9wZXJ0eSBldmVuCi0JCQkvLyB0aG91Z2ggaXQncyB0aGUgc2FtZSBhcyBqYXZhQ2hhcnNldAotCQkJLy8gYmVjYXVzZSB0aGVyZSBhcmUgY2xpZW50cyB0aGF0IHJlbHkgb24gdGhpcyBwcm9wZXJ0eSB0bwotCQkJLy8gZGV0ZXJtaW5lIGlmIHRoZSBjaGFyc2V0IGlzIGFjdHVhbGx5IGRldGVjdGVkIGluIGZpbGUgb3Igbm90LgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIGRldGVjdGVkQ2hhcnNldCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGV0ZWN0b3IKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVN0YW5kYXJkQ2FsY3VsYXRpb25zKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gbm90ZTogaWYgd2UncmUgYXNrZWQgZm9yIG9uZSwgd2Ugc2V0IHRoZW0gYWxsLiBJIG5lZWQgdG8gYmUgc3VyZSBpZgotCQkvLyBjYWxsZWQKLQkJLy8gbXVsaXRpcGxlIHRpbWVzIChvbmUgZm9yIGVhY2gsIHNheSkgdGhhdCB3ZSBkb24ndCB3YXN0ZSB0aW1lCi0JCS8vIHByb2Nlc3Npbmcgc2FtZQotCQkvLyBjb250ZW50IGFnYWluLgotCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gKChKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IpIGRldGVjdG9yKS5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQkJLy8gVE9ETzogSSBuZWVkIHRvIHZlcmlmeSB0byBzZWUgaWYgdGhpcyBCT00gd29yayBpcyBhbHdheXMgZG9uZQotCQkvLyBieSB0ZXh0IHR5cGUuCi0JCU9iamVjdCBkZXRlY3RlZEJ5dGVPcmRlck1hcmsgPSBlbmNvZGluZ01lbWVudG8uZ2V0VW5pY29kZUJPTSgpOwotCQlpZiAoZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0J5dGVPcmRlck1hcmsgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSyk7Ci0JCQkvLyBub3Qgc3VyZSB3aHkgd291bGQgZXZlciBiZSBkaWZmZXJlbnQsIHNvIGlmIGlzIGRpZmZlcmVudCwgbWF5Ci0JCQkvLyBuZWVkIHRvICJwdXNoIiB1cCBpbnRvIGJhc2UuCi0JCQlpZiAoIWRldGVjdGVkQnl0ZU9yZGVyTWFyay5lcXVhbHMoZXhpc3RpbmdCeXRlT3JkZXJNYXJrKSkKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrKTsKLQkJfQotCi0KLQkJaWYgKCFlbmNvZGluZ01lbWVudG8uaXNWYWxpZCgpKSB7Ci0JCQkvLyBub3RlOiBhZnRlciBzZXR0aW5nIGhlcmUsIGl0cyB0aGUgbWVyZSBwcmVzZW5jZSBvZgotCQkJLy8gSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQKLQkJCS8vIGluIHRoZSByZXNvdXJjZSdzIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmCi0JCQkvLyBpbnZhbGlkCi0JCQkvLyBpbiB0aG9zZSBjYXNlcywgdGhlICJkZXRlY3RlZCIgcHJvcGVydHkgY29udGFpbnMgYW4KLQkJCS8vICJhcHByb3ByaWF0ZSBkZWZhdWx0IiB0byB1c2UuCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgZW5jb2RpbmdNZW1lbnRvLmdldEludmFsaWRFbmNvZGluZygpKTsKLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxULCBlbmNvZGluZ01lbWVudG8uZ2V0QXBwcm9wcmlhdGVEZWZhdWx0KCkpOwotCQl9Ci0KLQkJT2JqZWN0IGRldGVjdGVkQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JCU9iamVjdCBqYXZhQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQotCQkvLyB3ZSBhbHdheXMgaW5jbHVkZSBkZXRlY3RlZCwgaWYgaXRzIGRpZmZlcmVudCB0aGFuIGphdmEKLQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0KLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0NoYXJzZXQgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpOwotCQkJaWYgKGphdmFDaGFyc2V0LmVxdWFscyhleGlzdGluZ0NoYXJzZXQpKSB7Ci0JCQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3ZSBtYXkgbmVlZCB0byBhZGQgd2hhdCB3ZSBmb3VuZCwgYnV0IG9ubHkgbmVlZCB0byBhZGQKLQkJCQkvLyBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdC4KLQkJCQlPYmplY3QgZGVmYXVsdENoYXJzZXQgPSBkZXRlY3Rvci5nZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCQkJaWYgKGRlZmF1bHRDaGFyc2V0ICE9IG51bGwpIHsKLQkJCQkJaWYgKCFkZWZhdWx0Q2hhcnNldC5lcXVhbHMoamF2YUNoYXJzZXQpKSB7Ci0JCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIGphdmFDaGFyc2V0KTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gYXNzdW1pbmcgaWYgdGhlcmUgaXMgbm8gc3BlYyBkZWZhdWx0LCB3ZSBhbHdheXMgbmVlZCB0bwotCQkJCQkvLyBhZGQsIEknbSBhc3N1bWluZwotCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIGphdmFDaGFyc2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNSZWxldmVudChJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkNPTlRFTlRfVFlQRV9BVFRSSUJVVEUpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgZGV0ZXJtaW5lVmFsaWRpdHkoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJcmV0dXJuIElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZGV0ZXJtaW5lVmFsaWRpdHkoUmVhZGVyIHJlYWRlcikgewotCQlyZXR1cm4gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lKU1BDU1NJbXBvcnRSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JSlNQQ1NTSW1wb3J0UnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Zjc0Yjg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lKU1BDU1NJbXBvcnRSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUpTUENTU0ltcG9ydFJ1bGUgZXh0ZW5kcyBJQ1NTSW1wb3J0UnVsZSwgSUpTUENTU05vZGUgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JSlNQQ1NTTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSUpTUENTU05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYyNjc1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JSlNQQ1NTTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElKU1BDU1NOb2RlIGV4dGVuZHMgSUNTU05vZGUgewotCXNob3J0IEpTUF9OT0RFID0gMTY7Ci0JU3RyaW5nIGdldENzc1RleHQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUENTU0ltcG9ydFJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9KU1BDU1NJbXBvcnRSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTlkZDEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUENTU0ltcG9ydFJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTSW1wb3J0UnVsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci0KLXB1YmxpYyBjbGFzcyBKU1BDU1NJbXBvcnRSdWxlSW1wbCBleHRlbmRzIENTU0ltcG9ydFJ1bGVJbXBsIGltcGxlbWVudHMgSUpTUENTU0ltcG9ydFJ1bGUgewotCi0JSlNQQ1NTSW1wb3J0UnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCUpTUENTU0ltcG9ydFJ1bGVJbXBsKEpTUENTU0ltcG9ydFJ1bGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJSlNQQ1NTSW1wb3J0UnVsZUltcGwgY2xvbmVkID0gbmV3IEpTUENTU0ltcG9ydFJ1bGVJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRIcmVmKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKEhSRUYpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChIUkVGLmVxdWFscyhuYW1lKSl7Ci0JCQl2YWx1ZSA9IENTU1V0aWwuZXh0cmFjdFVyaUNvbnRlbnRzKHZhbHVlKTsKLQkJfQotCQlzdXBlci5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUENTU05vZGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9KU1BDU1NOb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmJhNzBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUENTU05vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotCi0KLWNsYXNzIEpTUENTU05vZGVJbXBsIGV4dGVuZHMgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGltcGxlbWVudHMgSUpTUENTU05vZGUgewotCi0KLQlwcml2YXRlIFN0cmluZyBmVGV4dDsKLQotCUpTUENTU05vZGVJbXBsKEpTUENTU05vZGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQl9Ci0KLQlKU1BDU1NOb2RlSW1wbChTdHJpbmcgdGV4dCkgewotCQlzdXBlcigpOwotCQlmVGV4dCA9IHRleHQ7Ci0JfQotCQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUpTUENTU05vZGVJbXBsIGNsb25lZCA9IG5ldyBKU1BDU1NOb2RlSW1wbCh0aGlzKTsKLQotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gSlNQX05PREU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDc3NUZXh0KCkgewotCQlyZXR1cm4gZlRleHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9KU1BlZENTU01vZGVsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSlNQZWRDU1NNb2RlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRkYTBmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9KU1BlZENTU01vZGVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkNTU01vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTTW9kZWxQYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBKU1BlZENTU01vZGVsSW1wbCBleHRlbmRzIENTU01vZGVsSW1wbCB7Ci0JcHJpdmF0ZSBKU1BlZENTU01vZGVsUGFyc2VyIGZQYXJzZXI7Ci0JCi0JcHJvdGVjdGVkIENTU01vZGVsUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKGZQYXJzZXIgPT0gbnVsbCkgewotCQkJaWYgKGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJCWZQYXJzZXIgPSBuZXcgSlNQZWRDU1NNb2RlbFBhcnNlcihnZXREb2N1bWVudCgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlBhcnNlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUGVkQ1NTTW9kZWxQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUGVkQ1NTTW9kZWxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhNzIzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9KU1BlZENTU01vZGVsUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouSlNQZWRDU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkNTU01vZGVsUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NOb2RlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NSdWxlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgSlNQZWRDU1NNb2RlbFBhcnNlciBleHRlbmRzIENTU01vZGVsUGFyc2VyIHsKLQotCXB1YmxpYyBKU1BlZENTU01vZGVsUGFyc2VyKElDU1NEb2N1bWVudCBkb2MpIHsKLQkJc3VwZXIoZG9jKTsKLQl9Ci0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIENTU05vZGVJbXBsIGluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlDU1NNb2RlbENyZWF0aW9uQ29udGV4dCBjcmVhdGlvbkNvbnRleHQgPSBnZXRDcmVhdGlvbkNvbnRleHQoKTsKLQkJaWYgKGNyZWF0aW9uQ29udGV4dCA9PSBudWxsIHx8IHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyB0eXBlID0gKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgcmVnaW9uKS5nZXRUeXBlKCk7Ci0JCUNTU05vZGVJbXBsIG1vZGlmaWVkID0gbnVsbDsKLQotCQkvL0lDU1NOb2RlIHRhcmdldCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQkKLQkJaWYgKHR5cGUgPT0gSlNQZWRDU1NSZWdpb25Db250ZXh0cy5DU1NfSlNQX0RJUkVDVElWRSl7Ci0JCQkKLQkJCWJvb2xlYW4gaXNJbmNsdWRlID0gcmVnaW9uLmdldFRleHQoKS5pbmRleE9mKCJpbmNsdWRlIikgIT0gLTE7Ci0JCQlpZiAoaXNJbmNsdWRlKXsKLQkJCQltb2RpZmllZCA9IGluc2VydFVua25vd25JbXBvcnQocmVnaW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbW9kaWZpZWQgPSBpbnNlcnRVbmtub3duUnVsZShyZWdpb24pOwkJCQkJCi0JCQl9Ci0JCX0KLQotCQkvLyBwb3N0IHByb2Nlc3MKLQkJaWYgKG1vZGlmaWVkICE9IG51bGwpIHsKLQkJCWlmIChtb2RpZmllZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCSgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBtb2RpZmllZCkucHJvcGFnYXRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBtb2RpZmllZCAhPSBudWxsID8gbW9kaWZpZWQgOiBzdXBlci5pbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ocmVnaW9uKTsKLQl9Ci0KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydFVua25vd25JbXBvcnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQgY3JlYXRpb25Db250ZXh0ID0gZ2V0Q3JlYXRpb25Db250ZXh0KCk7Ci0JCUNTU05vZGVJbXBsIHBhcmVudCA9IGNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCUlDU1NEb2N1bWVudCBzaGVldCA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQotCQlTdHJpbmcgdGV4dCA9IHJlZ2lvbi5nZXRUZXh0KCk7Ci0JCVBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiICIpOwotCSAgICBTdHJpbmdbXSBzdHJzID0gcGF0dGVybi5zcGxpdCh0ZXh0KTsKLQkgICAgU3RyaW5nIGhyZWZWYWx1ZSA9IG51bGw7Ci0JICAgIGZvciAoaW50IGk9MDtpPHN0cnMubGVuZ3RoO2krKykgewotCSAgICAJU3RyaW5nIGhyZWZTdHIgPSAiZmlsZT1cIiI7Ci0JICAgICAgaWYgKHN0cnNbaV0uc3RhcnRzV2l0aChocmVmU3RyKSl7Ci0JCQkJaW50IGhyZWZTdHJfbGVuZ3RoID0gaHJlZlN0ci5sZW5ndGgoKTsKLQkJCQkvLyBtaW51cyAxIHRvIGF2b2lkIHF1b3RlPwotCQkJCWludCBocmVmVmFsdWVfbGVuZ3RoID0gc3Ryc1tpXS5sZW5ndGgoKSAtIDE7Ci0JCQkJaWYgKGhyZWZWYWx1ZV9sZW5ndGggPiBocmVmU3RyX2xlbmd0aCkgewotCQkJCQlocmVmVmFsdWUgPSBzdHJzW2ldLnN1YnN0cmluZyhocmVmU3RyX2xlbmd0aCwgaHJlZlZhbHVlX2xlbmd0aCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvKgotCQkJCQkgKiBJU1NVRTogdGhpcyBoYW5kbGVzIGNhc2VzIHdoZXJlLCBlLmcuICJmaWxlPSIgaGFzIG5vCi0JCQkJCSAqIHN1YnNlcXVlbnQgJ3ZhbHVlJyAuLi4gYW5kIGZyb20gY29kZSBpbiBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkJICogSSBiZWxpZXZlIHNob3VsZCByZXR1cm4gbnVsbCwgcmF0aGVyIHRoYW4gZW1wdHkgc3RyaW5nLCBidXQsIHRoaXMgbWF5IAotCQkJCQkgKiBuZWVkIHNvbWUgZmluZSB0dW5pbmcgZXZlbnR1YWxseS4KLQkJCQkJICovCi0JCQkJCWhyZWZWYWx1ZSA9IG51bGw7Ci0JCQkJfQotCSAgICAJICBicmVhazsKLQkgICAgICB9Ci0JICAgIH0KLQkJCi0JCWlmIChocmVmVmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlKU1BDU1NJbXBvcnRSdWxlSW1wbCBydWxlID0gbmV3IEpTUENTU0ltcG9ydFJ1bGVJbXBsKCk7Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudChzaGVldCk7Ci0JCXJ1bGUuYXBwZW5kQ2hpbGQoKENTU05vZGVJbXBsKXNoZWV0LmNyZWF0ZU1lZGlhTGlzdCgpKTsKLQkJcnVsZS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihyZWdpb24sIHJlZ2lvbik7Ci0KLQkJCi0JCWlmICghaXNVcGRhdGVDb250ZXh0QWN0aXZlKCkpIHsKLQkJCXJ1bGUuc2V0SHJlZihocmVmVmFsdWUpOy8vQXR0cmlidXRlKElDU1NJbXBvcnRSdWxlLkhSRUYsIGhyZWZWYWx1ZSk7Ci0JCX0KLQotCi0JCS8vIGluc2VydCB0byB0cmVlCi0JCWlmICghaXNVcGRhdGVDb250ZXh0QWN0aXZlKCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCS8vcHJvcGFnYXRlUmFuZ2VQcmVJbnNlcnQoc2hlZXQsIHJ1bGUpOwotCQkJQ1NTTm9kZUltcGwgbmV4dCA9IGNyZWF0aW9uQ29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCSgoQ1NTTm9kZUltcGwpc2hlZXQpLmluc2VydEJlZm9yZShydWxlLCBuZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCSgoQ1NTTm9kZUltcGwpc2hlZXQpLmFwcGVuZENoaWxkKHJ1bGUpOwotCQkJfQotCQl9Ci0JCS8vY3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUocnVsZSk7Ci0JCXJldHVybiBydWxlOwotCX0KLQotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0VW5rbm93blJ1bGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlDU1NNb2RlbENyZWF0aW9uQ29udGV4dCBjcmVhdGlvbkNvbnRleHQgPSBnZXRDcmVhdGlvbkNvbnRleHQoKTsKLQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gY3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKCFpc1BhcnNlRmxvYXRpbmcoKSAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlKU1BDU1NOb2RlSW1wbCBydWxlID0gbmV3IEpTUENTU05vZGVJbXBsKGZsYXROb2RlLmdldFRleHQoKSk7Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudChwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQotCQkvLyBzZXR1cCBmbGF0IGNvbnRhaW5lcgotCQlydWxlLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlLCBmbGF0Tm9kZSk7Ci0KLQotCQkvLyBpbnNlcnQgdG8gdHJlZQotCQlpZiAoIWlzVXBkYXRlQ29udGV4dEFjdGl2ZSgpICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwcm9wYWdhdGVSYW5nZVByZUluc2VydChwYXJlbnQsIHJ1bGUpOwotCQkJQ1NTTm9kZUltcGwgbmV4dCA9IGNyZWF0aW9uQ29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUocnVsZSwgbmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQocnVsZSk7Ci0JCQl9Ci0JCX0KLQotCQkvL2NyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQkvLyBUYXJnZXROZXh0IGlzIHNldCB0byBudWxsIGF1dG9tYXRpY2FsbHkKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0pTUGVkQ1NTRG9jdW1lbnRMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0pTUGVkQ1NTRG9jdW1lbnRMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg3Y2E3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9KU1BlZENTU0RvY3VtZW50TG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5KU1BlZENTU1NvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ1NTRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBKU1BlZENTU0RvY3VtZW50TG9hZGVyIGV4dGVuZHMgQ1NTRG9jdW1lbnRMb2FkZXIgewotcHVibGljIFJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JcmV0dXJuIG5ldyBKU1BlZENTU1NvdXJjZVBhcnNlcigpOwotfQotcHVibGljIElEb2N1bWVudExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gbmV3IEpTUGVkQ1NTRG9jdW1lbnRMb2FkZXIoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9KU1BlZENTU01vZGVsTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvSlNQZWRDU1NNb2RlbExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDkxNGI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9KU1BlZENTU01vZGVsTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5KU1BlZENTU01vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkpTUGVkQ1NTRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5DU1NNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQotcHVibGljIGNsYXNzIEpTUGVkQ1NTTW9kZWxMb2FkZXIgZXh0ZW5kcyBDU1NNb2RlbExvYWRlciB7Ci1wdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCgpIHsKLQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbmV3IEpTUGVkQ1NTTW9kZWxJbXBsKCk7Ci0JcmV0dXJuIG1vZGVsOwotfQotcHVibGljIElNb2RlbExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQlyZXR1cm4gbmV3IEpTUGVkQ1NTTW9kZWxMb2FkZXIoKTsKLX0KLXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JaWYgKGRvY3VtZW50TG9hZGVySW5zdGFuY2UgPT0gbnVsbCkgewotCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbmV3IEpTUGVkQ1NTRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0JcmV0dXJuIGRvY3VtZW50TG9hZGVySW5zdGFuY2U7Ci19Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckpTUGVkQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9ySlNQZWRDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkMWMyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9ySlNQZWRDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkpTUGVkQ1NTRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkNTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5BYnN0cmFjdE1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci0KLQotcHVibGljIGNsYXNzIE1vZGVsSGFuZGxlckZvckpTUGVkQ1NTIGV4dGVuZHMgQWJzdHJhY3RNb2RlbEhhbmRsZXIgaW1wbGVtZW50cyBJTW9kZWxIYW5kbGVyIHsKLQlzdGF0aWMgU3RyaW5nIEFzc29jaWF0ZWRDb250ZW50VHlwZUlEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3Bzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1vZGVsSGFuZGxlcklEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUubW9kZWxoYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBNb2RlbEhhbmRsZXJGb3JKU1BlZENTUygpewotCQlzdXBlcigpOwotCQlzZXRJZChNb2RlbEhhbmRsZXJJRCk7Ci0JCXNldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKEFzc29jaWF0ZWRDb250ZW50VHlwZUlEKTsKLQl9Ci0JCi0JcHVibGljIElNb2RlbExvYWRlciBnZXRNb2RlbExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKU1BlZENTU01vZGVsTG9hZGVyKCk7Ci0JfQotCQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBDU1NEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgSlNQZWRDU1NEb2N1bWVudExvYWRlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9KU1BlZENTU1NvdXJjZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUGVkQ1NTU291cmNlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MmE4YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUGVkQ1NTU291cmNlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouSlNQZWRDU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1JlZ2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5JQ1NTVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLQotCi1wdWJsaWMgY2xhc3MgSlNQZWRDU1NTb3VyY2VQYXJzZXIgZXh0ZW5kcyBDU1NTb3VyY2VQYXJzZXIgewotCi0JcHJpdmF0ZSBKU1BlZENTU1Rva2VuaXplciBmVG9rZW5pemVyOwotCXByb3RlY3RlZCBib29sZWFuIG11c3RCZVN0YXJ0KFN0cmluZyB0eXBlLCBTdHJpbmcgZG9jUmVnaW9uVHlwZSkgewotCQlyZXR1cm4gKCh0eXBlID09IEpTUGVkQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0pTUF9DT01NRU5UIHx8IHR5cGUgPT0gSlNQZWRDU1NSZWdpb25Db250ZXh0cy5DU1NfSlNQX0RJUkVDVElWRSB8fCB0eXBlID09IEpTUGVkQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0pTUF9FTkQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JUIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1BBR0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfRk9OVF9GQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NIQVJTRVQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQVRLRVlXT1JEIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgfHwgKGRvY1JlZ2lvblR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZICYmIHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpIHx8ICghQ1NTUmVnaW9uVXRpbC5pc1NlbGVjdG9yQmVnZ2luaW5nVHlwZShkb2NSZWdpb25UeXBlKSAmJiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8gfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfSUQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUKSkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG11c3RCZUVuZChTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gSlNQZWRDU1NSZWdpb25Db250ZXh0cy5DU1NfSlNQX0NPTU1FTlQgfHwgdHlwZSA9PSBKU1BlZENTU1JlZ2lvbkNvbnRleHRzLkNTU19KU1BfRElSRUNUSVZFIHx8IHR5cGUgPT0gSlNQZWRDU1NSZWdpb25Db250ZXh0cy5DU1NfSlNQX0VORCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpOwotCX0KLQkKLQlwdWJsaWMgSUNTU1Rva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCWlmIChmVG9rZW5pemVyID09IG51bGwpIHsKLQkJCWZUb2tlbml6ZXIgPSBuZXcgSlNQZWRDU1NUb2tlbml6ZXIoKTsKLQkJfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0JCi0JcHVibGljIFJlZ2lvblBhcnNlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBKU1BlZENTU1NvdXJjZVBhcnNlcigpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9KU1BlZENTU1Rva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUGVkQ1NTVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYjc1ZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUGVkQ1NTVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDc1ICswLDAgQEAKLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuNC4xIG9uIDA2LzA0LzMwIDE1OjQ5ICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouSlNQZWRDU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1JlZ2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5JQ1NTVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9ucy5DU1NUZXh0UmVnaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmpmbGV4LmRlLyI+SkZsZXg8L2E+IDEuNC4xCi0gKiBvbiAwNi8wNC8zMCAxNTo0OSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqLwotcHVibGljIGNsYXNzIEpTUGVkQ1NTVG9rZW5pemVyIGltcGxlbWVudHMgSlNQZWRDU1NSZWdpb25Db250ZXh0cywgSUNTU1Rva2VuaXplciB7Ci0KLSAgLyoqIFRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGluaXRpYWwgc2l6ZSBvZiB0aGUgbG9va2FoZWFkIGJ1ZmZlciAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfQlVGRkVSU0laRSA9IDE2Mzg0OwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9KU1BfRVhQID0gMjE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0pTUF9ESVJFQ1RJVkUgPSAyMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUgPSAxMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfSU1QT1JUX0RFTElNSVRFUiA9IDU7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSA9IDE4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9TRUxFQ1RPUiA9IDEwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9DSEFSU0VUX0RFTElNSVRFUiA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0RFQ0xBUkFUSU9OX1ZBTFVFID0gMTk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1BBR0VfUFNFVURPX1BBR0UgPSA4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9JTVBPUlRfVVJJID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORCA9IDE1OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9KU1BfRUwgPSAyMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SID0gMTM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0pTUF9ERUNMQVJBVElPTiA9IDIxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9ERUNMQVJBVElPTiA9IDE2OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9QQUdFX0RFTElNSVRFUiA9IDk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSA9IDE0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9NRURJQV9NRURJVU0gPSA2OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9KU1BfU0NSSVBUTEVUID0gMjA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0NIQVJTRVRfTkFNRSA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0pTUF9DT01NRU5UID0gMjM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0lNUE9SVF9NRURJVU0gPSA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1IgPSAxNzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfRk9OVF9GQUNFX0RFTElNSVRFUiA9IDk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX01FRElBX0RFTElNSVRFUiA9IDc7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1NFTEVDVE9SX01PRElGSUVSID0gMTE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlZSU5JVElBTCA9IDA7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9DTUFQX1BBQ0tFRCA9IAotICAgICJcMTFcMFwxXDExXDFcMTdcMVwwXDFcNFwxXDIwXDIyXDBcMVw2XDFcNDBcMVwxMCIrCi0gICAgIlwxXDIyXDFcMzNcMVwzMVwxXDE2XDFcNVwxXDI2XDFcMTJcMVw0MlwxXDE0XDFcNjEiKwotICAgICJcMVwxM1wxXDE1XDFcNDFcMTJcMVwxXDY1XDFcNTRcMVwzMFwxXDM3XDFcMzJcMVwyMSIrCi0gICAgIlwxXDM2XDFcNDdcMVwyN1wxXDQ0XDFcNjNcMVw1MlwxXDY3XDFcNjRcMVw0NVwxXDU1IisKLSAgICAiXDJcMlwxXDI1XDFcNTZcMVw3MFwxXDYwXDFcNTdcMVwyXDFcMjRcMVw1MFwxXDUzIisKLSAgICAiXDFcMjNcNVwyXDFcNzFcMVwzXDFcNzNcMVwxNlwxXDJcMVwxNlwxXDQ2XDFcNyIrCi0gICAgIlwxXDQzXDFcNjJcMVw1MVwxXDY2XDFcNjRcMVw0NVwxXDU1XDJcMlwxXDI1XDFcNTYiKwotICAgICJcMVw3MFwxXDYwXDFcNTdcMVwyXDFcMjRcMVw1MFwxXDUzXDFcMjNcNVwyXDFcMzQiKwotICAgICJcMVw3MlwxXDM1XDFcNzJcMVwwXHVmZjgwXDIiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFtdIFpaX0NNQVAgPSB6elVucGFja0NNYXAoWlpfQ01BUF9QQUNLRUQpOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBERkEgc3RhdGVzIHRvIGFjdGlvbiBzd2l0Y2ggbGFiZWxzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX0FDVElPTiA9IHp6VW5wYWNrQWN0aW9uKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0FDVElPTl9QQUNLRURfMCA9Ci0gICAgIlwzMFwwXDFcMVwxXDJcMVwxXDFcM1wxXDJcNFwxXDFcNCIrCi0gICAgIlwyXDFcMVw1XDFcMVwxXDZcNFwxXDFcN1wzXDFcMVwxMCIrCi0gICAgIlwxXDFcMVwxMFwxXDExXDFcMTJcMVwxXDFcMTJcMVwxM1wxXDE0IisKLSAgICAiXDFcMTVcMVwxXDFcMTVcMVwxNlwxXDFcMVwzXDFcMTdcMVwyMCIrCi0gICAgIlwxXDIxXDFcMVwxXDIxXDFcMjJcMVwxXDFcMjNcMVwyNFwzXDEiKwotICAgICJcMVwyNFwxXDI1XDFcMVwxXDI1XDFcMjZcMVwyN1wxXDMwXDFcMzEiKwotICAgICJcM1wxXDFcMzJcMVwzMVwzXDFcMVwzMVwxXDFcMlwzM1wxXDMiKwotICAgICJcMlwxXDFcMzRcMVwzNVwxXDM2XDFcMzdcMVwxXDFcMFwyXDIiKwotICAgICJcMVw0MFwxXDBcMVw0MVwyXDBcMVw0MlwyXDBcMVw0M1w2XDAiKwotICAgICJcMVw0NFwzXDBcMVw0NVw1XDBcMVw0Nlw0XDBcMlwxMFwxXDAiKwotICAgICJcMlwxMlwxXDBcMlwxNVwxXDE3XDFcMFwyXDIxXDFcMFwxXDI0IisKLSAgICAiXDJcMFwxXDI0XDJcMFwxXDI0XDFcMFwyXDI1XDFcNDdcMlwwIisKLSAgICAiXDFcNTBcMVwwXDFcNTFcMVwzMVwyXDBcMVw1MlwyXDBcMlwzMSIrCi0gICAgIlwxXDMwXDFcNTNcMlwwXDFcMzFcMlwwXDFcNTRcMVw1NVwxXDAiKwotICAgICJcMVw1NlwxXDBcMVwyXDFcNTdcMVw0MFwxXDQxXDEwXDBcMVw0NCIrCi0gICAgIlwxXDBcMVw0NVwyXDBcMVw0NVwyXDBcMVw0NlwyXDBcMVw0NiIrCi0gICAgIlwyXDBcMVwxMFwxXDEyXDFcMTVcMVwyMVwxXDI0XDFcMFwxXDI0IisKLSAgICAiXDJcMFwxXDI0XDFcMFwxXDI1XDFcNDdcMVwzMVwxXDBcMVw1MiIrCi0gICAgIlwyXDBcMVw1MlwxXDBcMVw1M1wxXDYwXDFcMzFcM1wwXDFcMiIrCi0gICAgIlwxXDQwXDFcNDFcMVw2MVw1XDBcMVw2MlwyXDBcMVw0NFw1XDAiKwotICAgICJcMVwxMFwxXDEyXDFcMTVcMVwyMVwxXDI0XDJcMFwxXDI1XDFcNDciKwotICAgICJcMVwzMVwyXDBcMVw1M1wxXDYwXDFcMFwxXDUxXDFcMFwxXDYzIisKLSAgICAiXDFcMlwxXDQwXDFcNDFcM1wwXDFcNjRcMlwwXDFcNDRcMVwwIisKLSAgICAiXDFcNDRcMTBcMFwxXDY1XDFcMTBcMVwxMlwxXDE1XDFcMjFcMVwyNCIrCi0gICAgIlwyXDBcMVwyNVwxXDQ3XDFcMzFcMlwwXDFcNTNcMlw2MFw1XDAiKwotICAgICJcMVw2NlwxXDBcMVwyXDFcNDBcMVw0MVwyXDBcMVw2N1wyXDAiKwotICAgICJcMVw0NFw2XDBcMVw2NVwyXDBcMVwxMFwxXDEyXDFcMTVcMVwyMSIrCi0gICAgIlwxXDI0XDJcMFwxXDI1XDFcNDdcMVwzMVwyXDBcMVw1M1wyXDYwIisKLSAgICAiXDJcMFwxXDY2XDNcMFwxXDJcMVw0MFwxXDQxXDFcMFwxXDcwIisKLSAgICAiXDJcMFwxXDQ0XDEzXDBcMVwxMFwxXDEyXDFcMTVcMVwyMVwxXDI0IisKLSAgICAiXDJcMFwxXDI1XDFcNDdcMVwzMVwyXDBcMVw1M1wyXDYwXDEwXDAiKwotICAgICJcMVw0MFwxXDQxXDFcNzFcMlwwXDFcNDRcNlwwXDFcNjVcMVwwIisKLSAgICAiXDFcNjVcMlwwXDFcNDdcMlwwXDFcNTNcMlw2MFwyXDBcMVw2NiIrCi0gICAgIlwxXDBcMVw2Nlw2XDBcMVw2MFw0XDBcMVw3Mlw0XDBcMVw2MCIrCi0gICAgIlwzXDBcMVw3M1wxMlwwIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tBY3Rpb24oKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbNDU1XTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja0FjdGlvbihaWl9BQ1RJT05fUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrQWN0aW9uKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAgICAgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gcmVzdWx0W2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBhIHN0YXRlIHRvIGEgcm93IGluZGV4IGluIHRoZSB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfUk9XTUFQID0genpVbnBhY2tSb3dNYXAoKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfUk9XTUFQX1BBQ0tFRF8wID0KLSAgICAiXDBcMFwwXDc0XDBcMTcwXDBcMjY0XDBcMzYwXDBcdTAxMmNcMFx1MDE2OFwwXHUwMWE0IisKLSAgICAiXDBcdTAxZTBcMFx1MDIxY1wwXHUwMjU4XDBcdTAyOTRcMFx1MDJkMFwwXHUwMzBjXDBcdTAzNDhcMFx1MDM4NCIrCi0gICAgIlwwXHUwM2MwXDBcdTAzZmNcMFx1MDQzOFwwXHUwNDc0XDBcdTA0YjBcMFx1MDRlY1wwXHUwNTI4XDBcdTA1NjQiKwotICAgICJcMFx1MDVhMFwwXHUwNWRjXDBcdTA2MThcMFx1MDY1NFwwXHUwNjkwXDBcdTA2Y2NcMFx1MDcwOFwwXHUwNzQ0IisKLSAgICAiXDBcdTA3ODBcMFx1MDVhMFwwXHUwN2JjXDBcdTA3ZjhcMFx1MDVhMFwwXHUwODM0XDBcdTA1YTBcMFx1MDg3MCIrCi0gICAgIlwwXHUwOGFjXDBcdTA4ZThcMFx1MDkyNFwwXHUwNWEwXDBcdTA5NjBcMFx1MDk5Y1wwXHUwOWQ4XDBcdTBhMTQiKwotICAgICJcMFx1MGE1MFwwXHUwYThjXDBcdTA1YTBcMFx1MGFjOFwwXHUwYjA0XDBcdTBiNDBcMFx1MDVhMFwwXHUwNWEwIisKLSAgICAiXDBcdTBiN2NcMFx1MGJiOFwwXHUwYmY0XDBcdTA1YTBcMFx1MGMzMFwwXHUwYzZjXDBcdTA1YTBcMFx1MDVhMCIrCi0gICAgIlwwXHUwY2E4XDBcdTBjZTRcMFx1MGQyMFwwXHUwNWEwXDBcdTBkNWNcMFx1MDVhMFwwXHUwZDk4XDBcdTBkZDQiKwotICAgICJcMFx1MGUxMFwwXHUwZTRjXDBcdTBlODhcMFx1MGVjNFwwXHUwZjAwXDBcdTBmM2NcMFx1MDVhMFwwXHUwNWEwIisKLSAgICAiXDBcdTBmNzhcMFx1MGZiNFwwXHUwZmYwXDBcdTEwMmNcMFx1MTA2OFwwXHUwNWEwXDBcdTEwYTRcMFx1MTBlMCIrCi0gICAgIlwwXHUxMTFjXDBcdTExNThcMFx1MTE5NFwwXHUxMWQwXDBcdTA3ZjhcMFx1MDVhMFwwXHUxMjBjXDBcdTEyNDgiKwotICAgICJcMFx1MTI4NFwwXHUwN2JjXDBcdTA1YTBcMFx1MDVhMFwwXHUwNWEwXDBcdTEyYzBcMFx1MDYxOFwwXHUxMmZjIisKLSAgICAiXDBcdTEzMzhcMFx1MDZjY1wwXHUxMzc0XDBcdTA3MDhcMFx1MTNiMFwwXHUxM2VjXDBcdTE0MjhcMFx1MTQ2NCIrCi0gICAgIlwwXHUwNzgwXDBcdTA1YTBcMFx1MTRhMFwwXHUxNGRjXDBcdTE1MThcMFx1MTU1NFwwXHUxNTkwXDBcdTE1Y2MiKwotICAgICJcMFx1MTYwOFwwXHUxNjQ0XDBcdTA4NzBcMFx1MTY4MFwwXHUwNWEwXDBcdTA4YWNcMFx1MTZiY1wwXHUxNmY4IisKLSAgICAiXDBcdTA5NjBcMFx1MTczNFwwXHUwNWEwXDBcdTA5OWNcMFx1MTc3MFwwXHUxN2FjXDBcdTBhNTBcMFx1MTdlOCIrCi0gICAgIlwwXHUxODI0XDBcdTBiMDRcMFx1MTg2MFwwXHUxODljXDBcdTBiYjhcMFx1MThkOFwwXHUxOTE0XDBcdTA1YTAiKwotICAgICJcMFx1MGNlNFwwXHUxOTUwXDBcdTE5OGNcMFx1MGRkNFwwXHUxOWM4XDBcdTBlMTBcMFx1MWEwNFwwXHUwNWEwIisKLSAgICAiXDBcdTBlNGNcMFx1MWE0MFwwXHUxYTdjXDBcdTBmMDBcMFx1MWFiOFwwXHUxYWY0XDBcdTFiMzBcMFx1MWI2YyIrCi0gICAgIlwwXHUxMTFjXDBcdTA1YTBcMFx1MGZmMFwwXHUwNWEwXDBcdTFiYThcMFx1MTAyY1wwXHUxYmU0XDBcdTA1YTAiKwotICAgICJcMFx1MTA2OFwwXHUxYzIwXDBcdTFjNWNcMFx1MWM5OFwwXHUxY2Q0XDBcdTExNThcMFx1MWQxMFwwXHUxZDRjIisKLSAgICAiXDBcdTFkODhcMFx1MTFkMFwwXHUxZGM0XDBcdTA1YTBcMFx1MTZmOFwwXHUxMjg0XDBcdTA1YTBcMFx1MWUwMCIrCi0gICAgIlwwXHUxZTNjXDBcdTA1YTBcMFx1MWU3OFwwXHUxZWI0XDBcdTFlZjBcMFx1MWYyY1wwXHUxZjY4XDBcdTFmYTQiKwotICAgICJcMFx1MWZlMFwwXHUyMDFjXDBcdTIwNThcMFx1MjA5NFwwXHUyMGQwXDBcdTIxMGNcMFx1MDg3MFwwXHUyMTQ4IisKLSAgICAiXDBcdTIxODRcMFx1MDhhY1wwXHUyMWMwXDBcdTIxZmNcMFx1MDk2MFwwXHUyMjM4XDBcdTIyNzRcMFx1MDk5YyIrCi0gICAgIlwwXHUyMmIwXDBcdTIyZWNcMFx1MjMyOFwwXHUyMzY0XDBcdTIzYTBcMFx1MjNkY1wwXHUyNDE4XDBcdTI0NTQiKwotICAgICJcMFx1MGUxMFwwXHUyNDkwXDBcdTI0Y2NcMFx1MGU0Y1wwXHUyNTA4XDBcdTI1NDRcMFx1MjU4MFwwXHUyNWJjIisKLSAgICAiXDBcdTI1ZjhcMFx1MTAyY1wwXHUyNjM0XDBcdTI2NzBcMFx1MTA2OFwwXHUyNmFjXDBcdTI2ZThcMFx1MjcyNCIrCi0gICAgIlwwXHUyNzYwXDBcdTI3OWNcMFx1MjdkOFwwXHUyODE0XDBcdTI4NTBcMFx1Mjg4Y1wwXHUyOGM4XDBcdTA1YTAiKwotICAgICJcMFx1MjkwNFwwXHUyOTQwXDBcdTI5N2NcMFx1MjliOFwwXHUyOWY0XDBcdTA1YTBcMFx1MmEzMFwwXHUyYTZjIisKLSAgICAiXDBcdTJhYThcMFx1MmFlNFwwXHUyYjIwXDBcdTJiNWNcMFx1MmI5OFwwXHUyYmQ0XDBcdTJjMTBcMFx1MmM0YyIrCi0gICAgIlwwXHUyYzg4XDBcdTJjYzRcMFx1MmQwMFwwXHUyZDNjXDBcdTJkNzhcMFx1MmRiNFwwXHUyZGYwXDBcdTJlMmMiKwotICAgICJcMFx1MmU2OFwwXHUyZWE0XDBcdTJlZTBcMFx1MmYxY1wwXHUyZjU4XDBcdTJmOTRcMFx1MmZkMFwwXHUwNWEwIisKLSAgICAiXDBcdTMwMGNcMFx1MzA0OFwwXHUzMDg0XDBcdTMwYzBcMFx1MzBmY1wwXHUzMTM4XDBcdTA1YTBcMFx1MzE3NCIrCi0gICAgIlwwXHUzMWIwXDBcdTA1YTBcMFx1MzFlY1wwXHUzMjI4XDBcdTMyNjRcMFx1MzJhMFwwXHUzMmRjXDBcdTMzMTgiKwotICAgICJcMFx1MzM1NFwwXHUzMzkwXDBcdTMzY2NcMFx1MzQwOFwwXHUwNWEwXDBcdTM0NDRcMFx1MzQ4MFwwXHUzNGJjIisKLSAgICAiXDBcdTM0ZjhcMFx1MzUzNFwwXHUzNTcwXDBcdTM1YWNcMFx1MzVlOFwwXHUzNjI0XDBcdTM2NjBcMFx1MzY5YyIrCi0gICAgIlwwXHUzNmQ4XDBcdTM3MTRcMFx1Mzc1MFwwXHUzNzhjXDBcdTM3YzhcMFx1MzgwNFwwXHUyZjk0XDBcdTM4NDAiKwotICAgICJcMFx1Mzg3Y1wwXHUwNWEwXDBcdTM4YjhcMFx1MzhmNFwwXHUzOTMwXDBcdTM5NmNcMFx1MzlhOFwwXHUzOWU0IisKLSAgICAiXDBcdTA1YTBcMFx1M2EyMFwwXHUzYTVjXDBcdTNhOThcMFx1M2FkNFwwXHUzYjEwXDBcdTNiNGNcMFx1M2I4OCIrCi0gICAgIlwwXHUzYmM0XDBcdTNjMDBcMFx1MzM1NFwwXHUzYzNjXDBcdTNjNzhcMFx1M2NiNFwwXHUzY2YwXDBcdTNkMmMiKwotICAgICJcMFx1M2Q2OFwwXHUzZGE0XDBcdTNkZTBcMFx1M2UxY1wwXHUzZTU4XDBcdTNlOTRcMFx1M2VkMFwwXHUzZjBjIisKLSAgICAiXDBcdTNmNDhcMFx1M2Y4NFwwXHUzZmMwXDBcdTNmZmNcMFx1NDAzOFwwXHU0MDc0XDBcdTM3YzhcMFx1NDBiMCIrCi0gICAgIlwwXHU0MGVjXDBcdTQxMjhcMFx1NDE2NFwwXHU0MWEwXDBcdTQxZGNcMFx1NDIxOFwwXHUwNWEwXDBcdTQyNTQiKwotICAgICJcMFx1NDI5MFwwXHU0MmNjXDBcdTQzMDhcMFx1NDM0NFwwXHU0MzgwXDBcdTQzYmNcMFx1NDNmOFwwXHU0NDM0IisKLSAgICAiXDBcdTQ0NzBcMFx1NDRhY1wwXHU0NGU4XDBcdTQ1MjRcMFx1NDU2MFwwXHU0NTljXDBcdTQ1ZDhcMFx1NDYxNCIrCi0gICAgIlwwXHU0NjUwXDBcdTQ2OGNcMFx1NDZjOFwwXHU0NzA0XDBcdTQ3NDBcMFx1NDc3Y1wwXHU0N2I4XDBcdTQ3ZjQiKwotICAgICJcMFx1NDgzMFwwXHU0ODZjXDBcdTQ4YThcMFx1NDhlNFwwXHU0OTIwXDBcdTQ5NWNcMFx1NDk5OFwwXHU0OWQ0IisKLSAgICAiXDBcdTRhMTBcMFx1NGE0Y1wwXHU0YTg4XDBcdTRhYzRcMFx1NGIwMFwwXHU0YjNjXDBcdTA1YTBcMFx1NGI3OCIrCi0gICAgIlwwXHU0YmI0XDBcdTRiZjBcMFx1NGMyY1wwXHU0YzY4XDBcdTRjYTRcMFx1NGNlMFwwXHU0ZDFjXDBcdTRkNTgiKwotICAgICJcMFx1MzNjY1wwXHU0ZDk0XDBcdTM0MDhcMFx1NGRkMFwwXHU0ZTBjXDBcdTRlNDhcMFx1NGU4NFwwXHU0ZWMwIisKLSAgICAiXDBcdTRlZmNcMFx1NGYzOFwwXHU0Zjc0XDBcdTRmYjBcMFx1NGZlY1wwXHUzODQwXDBcdTUwMjhcMFx1Mzg3YyIrCi0gICAgIlwwXHU1MDY0XDBcdTUwYTBcMFx1NTBkY1wwXHU1MTE4XDBcdTUxNTRcMFx1NTE5MFwwXHU1MWNjXDBcdTUyMDgiKwotICAgICJcMFx1NTI0NFwwXHU1MjgwXDBcdTUyYmNcMFx1MDVhMFwwXHU1MmY4XDBcdTUzMzRcMFx1NTM3MFwwXHU1M2FjIisKLSAgICAiXDBcdTA1YTBcMFx1NTNlOFwwXHU1NDI0XDBcdTU0NjBcMFx1MDVhMFwwXHU1NDljXDBcdTU0ZDhcMFx1NTUxNCIrCi0gICAgIlwwXHU1NTUwXDBcdTU1OGNcMFx1NTVjOFwwXHU1NjA0XDBcdTU2NDBcMFx1NTY3Y1wwXHU1NmI4IjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tSb3dNYXAoKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbNDU1XTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja1Jvd01hcChaWl9ST1dNQVBfUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrUm93TWFwKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBoaWdoID0gcGFja2VkLmNoYXJBdChpKyspIDw8IDE2OwotICAgICAgcmVzdWx0W2orK10gPSBoaWdoIHwgcGFja2VkLmNoYXJBdChpKyspOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0gIC8qKiAKLSAgICogVGhlIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX1RSQU5TID0genpVbnBhY2tUcmFucygpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9UUkFOU19QQUNLRURfMCA9Ci0gICAgIlwyXDMxXDFcMzJcMVwzM1wxXDM0XDFcMzFcMVwzNFwxXDMyXDFcMzEiKwotICAgICJcMVwzNFwxXDMxXDFcMzVcMVwzMVwxXDM2XDFcMzFcMlwzNFwxXDMxIisKLSAgICAiXDFcMzdcM1wzMlwxXDMxXDFcMzJcMVw0MFwyXDMxXDFcNDFcMVwzMSIrCi0gICAgIlwxXDQyXDFcNDNcMlwzMVwxXDQ0XDFcNDVcMTFcMzJcMVwzMVw0XDMyIisKLSAgICAiXDFcMzFcM1wzMlwxXDQ2XDNcMzJcMVw0N1w2XDMxXDFcMzRcMVw1MCIrCi0gICAgIlwxXDM0XDFcMzFcMVw1MVwxXDM0XDFcMzFcMVw1MlwzXDMxXDJcMzQiKwotICAgICJcN1wzMVwxXDUzXDRcMzFcMVw0MlwxXDQzXDJcMzFcMVw0NFwzNlwzMSIrCi0gICAgIlwxXDM0XDFcMzFcMVwzNFwyXDMxXDFcMzRcMVwzMVwxXDUyXDNcMzEiKwotICAgICJcMlwzNFw3XDMxXDFcNTNcNFwzMVwxXDQyXDFcNDNcMlwzMVwxXDQ0IisKLSAgICAiXDEyXDMxXDFcNTRcMjNcMzFcMVwzNFwxXDU1XDFcMzRcMVwzMVwxXDU2IisKLSAgICAiXDFcMzRcMVwzMVwxXDUyXDNcMzFcMlwzNFwyXDMxXDFcNTdcNFwzMSIrCi0gICAgIlwxXDUzXDRcMzFcMVw0MlwxXDQzXDJcMzFcMVw0NFwxMlwzMVwxXDU0IisKLSAgICAiXDIxXDMxXDFcNjBcMVw2MVwxXDM0XDFcMzFcMVwzNFwxXDYwXDFcMzEiKwotICAgICJcMVwzNFwxXDMxXDFcNjJcM1wzMVwyXDM0XDJcMzFcM1w2MFwxXDMxIisKLSAgICAiXDFcNjBcMVw1M1w0XDMxXDFcNDJcMVw0M1wyXDMxXDFcNDRcMVwzMSIrCi0gICAgIlwxMVw2MFwxXDU0XDRcNjBcMVwzMVwzXDYwXDFcMzFcM1w2MFw3XDMxIisKLSAgICAiXDFcMzRcMVwzMVwxXDM0XDJcMzFcMVwzNFwxXDMxXDFcNTJcM1wzMSIrCi0gICAgIlwyXDM0XDdcMzFcMVw1M1w0XDMxXDFcNDJcMVw0M1wyXDMxXDFcNDQiKwotICAgICJcMTJcMzFcMVw1NFw0XDMxXDFcNjNcMTRcMzFcMVw2NFwxXDY1XDFcMzQiKwotICAgICJcMVwzMVwxXDM0XDFcNjRcMVwzMVwxXDM0XDFcMzFcMVw2NlwzXDMxIisKLSAgICAiXDJcMzRcMlwzMVwzXDY0XDFcMzFcMVw2NFwxXDUzXDRcMzFcMVw0MiIrCi0gICAgIlwxXDQzXDJcMzFcMVw0NFwxXDMxXDExXDY0XDFcMzFcNFw2NFwxXDMxIisKLSAgICAiXDNcNjRcMVwzMVwzXDY0XDdcMzFcMVwzNFwxXDMxXDFcMzRcMlwzMSIrCi0gICAgIlwxXDM0XDFcMzFcMVw1MlwzXDMxXDJcMzRcN1wzMVwxXDUzXDNcMzEiKwotICAgICJcMVw2N1wxXDQyXDFcNDNcMlwzMVwxXDQ0XDE3XDMxXDFcNzBcMTRcMzEiKwotICAgICJcMVw3MVwxXDcyXDFcMzRcMVwzMVwxXDM0XDFcNzFcMVwzMVwxXDM0IisKLSAgICAiXDFcMzFcMVw3M1wzXDMxXDJcMzRcMlwzMVwzXDcxXDFcMzFcMVw3MSIrCi0gICAgIlwxXDUzXDNcMzFcMVw3NFwxXDQyXDFcNDNcMlwzMVwxXDQ0XDFcMzEiKwotICAgICJcMTFcNzFcMVwzMVw0XDcxXDFcMzFcM1w3MVwxXDc1XDNcNzFcN1wzMSIrCi0gICAgIlwxXDM0XDFcMzFcMVwzNFwyXDMxXDFcMzRcMVwzMVwxXDUyXDNcMzEiKwotICAgICJcMlwzNFw3XDMxXDFcNTNcM1wzMVwxXDc0XDFcNDJcMVw0M1wyXDMxIisKLSAgICAiXDFcNDRcMzRcMzFcMVwzMlwxXDMzXDFcMzRcMVwzMVwxXDM0XDFcMzIiKwotICAgICJcMVwzMVwxXDM0XDFcMzFcMVwzNVwxXDMxXDFcMzZcMVwzMVwyXDM0IisKLSAgICAiXDFcMzFcMVwzN1wzXDMyXDFcMzFcMVwzMlwxXDUzXDRcMzFcMVw0MiIrCi0gICAgIlwxXDQzXDJcMzFcMVw0NFwxXDQ1XDExXDMyXDFcMzFcNFwzMlwxXDMxIisKLSAgICAiXDNcMzJcMVw0NlwzXDMyXDFcNDdcNlwzMVwxXDc2XDFcMzFcMVw3NiIrCi0gICAgIlwyXDMxXDFcNzZcMVwzMVwxXDUyXDFcNzdcMVwzNlwxXDMxXDJcNzYiKwotICAgICJcMVwzMVwxXDM3XDVcMzFcMVw1M1wxXDMxXDFcNzdcMVwzMVwxXDc0IisKLSAgICAiXDFcNDJcMVw0M1wyXDMxXDFcNDRcMVw0NVwxNlwzMVwxXDEwMFwzXDMxIisKLSAgICAiXDFcNDZcM1wzMVwxXDQ3XDRcMzFcMVwxMDFcMVwxMDJcMVwzNFwxXDMxIisKLSAgICAiXDFcMzRcMVwxMDFcMVwzMVwxXDM0XDFcMzFcMVwxMDNcM1wzMVwyXDM0IisKLSAgICAiXDJcMzFcM1wxMDFcMVwzMVwxXDEwMVwxXDUzXDRcMzFcMVw0MlwxXDQzIisKLSAgICAiXDJcMzFcMVw0NFwxXDMxXDExXDEwMVwxXDMxXDRcMTAxXDFcMzFcM1wxMDEiKwotICAgICJcMVwzMVwzXDEwMVw3XDMxXDFcMzRcMVwzMVwxXDM0XDJcMzFcMVwzNCIrCi0gICAgIlwxXDMxXDFcNTJcM1wzMVwyXDM0XDdcMzFcMVw1M1w0XDMxXDFcNDIiKwotICAgICJcMVw0M1wxXDEwNFwxXDMxXDFcNDRcMzBcMzFcMVwxMDVcMVwxMDZcMlwzMSIrCi0gICAgIlwxXDEwN1wxXDExMFwxXDM0XDFcMTExXDFcMzRcMVwxMDdcMVwxMTJcMVwzNCIrCi0gICAgIlwxXDMxXDFcMTEzXDNcMzFcMlwzNFwyXDMxXDNcMTA3XDFcMzFcMVwxMDciKwotICAgICJcMVw1M1w0XDMxXDFcNDJcMVw0M1wyXDMxXDFcNDRcMVwzMVwxMVwxMDciKwotICAgICJcMVwzMVw0XDEwN1wxXDMxXDNcMTA3XDFcMzFcM1wxMDdcN1wzMVwxXDM0IisKLSAgICAiXDFcMzFcMVwzNFwyXDMxXDFcMzRcMVwzMVwxXDUyXDNcMzFcMlwzNCIrCi0gICAgIlw3XDMxXDFcNTNcNFwzMVwxXDQyXDFcNDNcMlwzMVwxXDQ0XDMxXDMxIisKLSAgICAiXDFcMTA2XDJcMzFcMVwxMTRcMVwxMTVcMVwzNFwxXDMxXDFcMzRcMVwxMTQiKwotICAgICJcMVwzMVwxXDM0XDFcMzFcMVwxMTZcM1wzMVwyXDM0XDJcMzFcM1wxMTQiKwotICAgICJcMVwzMVwxXDExNFwxXDQwXDJcMzFcMVw0MVwxXDMxXDFcNDJcMVw0MyIrCi0gICAgIlwyXDMxXDFcNDRcMVwzMVwxMVwxMTRcMVwxMTdcNFwxMTRcMVwzMVwzXDExNCIrCi0gICAgIlwxXDMxXDNcMTE0XDdcMzFcMVwzNFwxXDMxXDFcMzRcMlwzMVwxXDM0IisKLSAgICAiXDFcMzFcMVw1MlwzXDMxXDJcMzRcN1wzMVwxXDQwXDJcMzFcMVw0MSIrCi0gICAgIlwxXDMxXDFcNDJcMVw0M1wyXDMxXDFcNDRcMTJcMzFcMVwxMTdcMTBcMzEiKwotICAgICJcMVwxMjBcN1wzMVwxXDEyMVwxXDEyMlwxXDEyM1wxXDM0XDFcMTI0XDFcMzQiKwotICAgICJcMVwxMjJcMVwxMjVcMVwzNFwxXDEyNlwxXDEyN1wxXDEzMFwxXDEzMVwxXDMxIisKLSAgICAiXDJcMzRcMVwzMVwxXDEzMlwxXDEzM1wyXDEyMlwxXDMxXDFcMTIyXDFcNDAiKwotICAgICJcMlwzMVwxXDQxXDFcMzFcMVw0MlwxXDQzXDFcMzFcMVwxMzRcMVwxMzUiKwotICAgICJcMVwzMVwxMVwxMjJcMVwxMTdcNFwxMjJcMVwxMzZcM1wxMjJcMVwzMVwzXDEyMiIrCi0gICAgIlw0XDMxXDFcMTIxXDFcMTIyXDFcMTIzXDFcMTM3XDFcMTI0XDFcMTM3XDFcMTIyIisKLSAgICAiXDFcMTI1XDFcMTM3XDFcMTI2XDFcMTI3XDFcMTMwXDFcMTMxXDFcMzFcMlwxMzciKwotICAgICJcMVwzMVwxXDEzMlwxXDEzM1wyXDEyMlwxXDMxXDFcMTIyXDFcNDBcMlwzMSIrCi0gICAgIlwxXDQxXDFcMzFcMVw0MlwxXDQzXDFcMzFcMVwxMzRcMVwxMzVcMVwzMSIrCi0gICAgIlwxMVwxMjJcMVwxMTdcNFwxMjJcMVwxMzZcM1wxMjJcMVwzMVwzXDEyMlw3XDMxIisKLSAgICAiXDFcMzRcMVwzMVwxXDM0XDJcMzFcMVwzNFwxXDMxXDFcMTQwXDNcMzEiKwotICAgICJcMlwzNFw3XDMxXDFcNTNcMVwxNDFcM1wzMVwxXDQyXDFcMTQyXDFcMTQzIisKLSAgICAiXDFcMTQ0XDFcNDRcMzZcMzFcMVwzNFwxXDMxXDFcMzRcMlwzMVwxXDM0IisKLSAgICAiXDFcMzFcMVw1MlwzXDMxXDJcMzRcN1wzMVwxXDUzXDFcMTQxXDNcMzEiKwotICAgICJcMVw0MlwxXDQzXDJcMzFcMVw0NFwzNlwzMVwxXDM0XDFcMzFcMVwzNCIrCi0gICAgIlwyXDMxXDFcMzRcMVwzMVwxXDUyXDNcMzFcMlwzNFw3XDMxXDFcNTMiKwotICAgICJcNFwzMVwxXDE0NVwxXDQzXDJcMzFcMVw0NFwzNlwzMVwxXDM0XDFcMzEiKwotICAgICJcMVwzNFwyXDMxXDFcMzRcMVwzMVwxXDE0NlwzXDMxXDJcMzRcN1wzMSIrCi0gICAgIlwxXDUzXDVcMzFcMVw0M1wyXDMxXDFcNDRcMzJcMzFcNzVcMFwyXDMyIisKLSAgICAiXDFcMTQ3XDNcMFwxXDMyXDNcMFwxXDMyXDdcMFwzXDMyXDFcMCIrCi0gICAgIlwxXDMyXDEzXDBcMTFcMzJcMVwwXDRcMzJcMVwwXDNcMzJcMVwwIisKLSAgICAiXDNcMzJcNFwwXDFcMTUwXDJcMzJcMVwwXDJcMzJcMVwxNTBcMVwzMiIrCi0gICAgIlwxXDBcNVwzMlwyXDBcMjJcMzJcMVwxNTBcMlwzMlwxXDE1MFwyXDMyIisKLSAgICAiXDFcMTUwXDEwXDMyXDFcMTUwXDNcMzJcMVwxNTBcNVwzMlw0XDBcMVwzNCIrCi0gICAgIlwxXDBcMVwzNFwyXDBcMVwzNFw1XDBcMlwzNFw1NFwwXDJcMzIiKwotICAgICJcMVwxNDdcM1wwXDFcMzJcM1wwXDFcMTUxXDdcMFwzXDMyXDFcMCIrCi0gICAgIlwxXDMyXDEzXDBcMTFcMzJcMVwwXDRcMzJcMVwwXDNcMzJcMVwwIisKLSAgICAiXDNcMzJcNFwwXDJcMTUyXDFcMTUzXDNcMFwxXDE1MlwzXDBcMVwxNTIiKwotICAgICJcN1wwXDNcMTUyXDFcMFwxXDE1MlwxM1wwXDExXDE1MlwxXDBcNFwxNTIiKwotICAgICJcMVwwXDNcMTUyXDFcMFwzXDE1Mlw0XDBcMlwxNTRcMVwxNTVcM1wwIisKLSAgICAiXDFcMTU0XDNcMFwxXDE1NFw3XDBcM1wxNTRcMVwwXDFcMTU0XDEzXDAiKwotICAgICJcMTFcMTU0XDFcMFw0XDE1NFwxXDBcM1wxNTRcMVwwXDNcMTU0XDExXDAiKwotICAgICJcMVwxNTZcMlwwXDFcMTU2XDVcMFwyXDE1NlwxMFwwXDFcMTU3XDZcMCIrCi0gICAgIlwxXDE2MFw0MVwwXDFcMTYxXDJcMFwxXDE2MVw1XDBcMlwxNjFcMTNcMCIrCi0gICAgIlwxXDE2MlwxMDJcMFwyXDE2M1wxMFwwXDFcMTY0XDFcMTY1XDFcMTY2XDZcMCIrCi0gICAgIlwyXDE2N1w0NlwwXDFcMTcwXDMzXDBcMVwxNzFcMVwxNzJcM1wwXDFcMTcxIisKLSAgICAiXDNcMFwxXDE3MVw3XDBcM1wxNzFcMVwwXDFcMTcxXDEzXDBcMTFcMTcxIisKLSAgICAiXDFcMFw0XDE3MVwxXDBcM1wxNzFcMVwwXDNcMTcxXDRcMFwyXDE3MyIrCi0gICAgIlwxXDE3NFwxXDBcMVwxNzVcMTFcMTczXDJcMFw1M1wxNzNcMVwwXDJcMTc2IisKLSAgICAiXDFcMTc3XDFcMFwzXDE3NlwxXDE3NVw2XDE3NlwyXDBcNTNcMTc2XDEzXDAiKwotICAgICJcMVwyMDBcMTIwXDBcMVwxNjBcMzRcMFwyXDIwMVwxXDIwMlwxXDBcMVwyMDMiKwotICAgICJcMTFcMjAxXDJcMFw1M1wyMDFcMVwwXDJcMjA0XDFcMjA1XDFcMFwzXDIwNCIrCi0gICAgIlwxXDIwM1w2XDIwNFwyXDBcNTNcMjA0XDI0XDBcMVwyMDZcNTBcMFwyXDYwIisKLSAgICAiXDFcMjA3XDNcMFwxXDYwXDNcMFwxXDYwXDdcMFwzXDYwXDFcMCIrCi0gICAgIlwxXDYwXDEzXDBcMTFcNjBcMVwwXDRcNjBcMVwwXDNcNjBcMVwwIisKLSAgICAiXDNcNjBcNFwwXDFcMjEwXDJcNjBcMVwwXDJcNjBcMVwyMTBcMVw2MCIrCi0gICAgIlwxXDBcNVw2MFwyXDBcMjJcNjBcMVwyMTBcMlw2MFwxXDIxMFwyXDYwIisKLSAgICAiXDFcMjEwXDEwXDYwXDFcMjEwXDNcNjBcMVwyMTBcNVw2MFwxXDBcMlw2MCIrCi0gICAgIlwxXDIwN1wzXDBcMVw2MFwzXDBcMVwyMTFcN1wwXDNcNjBcMVwwIisKLSAgICAiXDFcNjBcMTNcMFwxMVw2MFwxXDBcNFw2MFwxXDBcM1w2MFwxXDAiKwotICAgICJcM1w2MFw0XDBcMlw2NFwxXDIxMlwzXDBcMVw2NFwzXDBcMVw2NCIrCi0gICAgIlw3XDBcM1w2NFwxXDBcMVw2NFwxM1wwXDExXDY0XDFcMFw0XDY0IisKLSAgICAiXDFcMFwzXDY0XDFcMFwzXDY0XDRcMFwxXDIxM1wyXDY0XDFcMCIrCi0gICAgIlwyXDY0XDFcMjEzXDFcNjRcMVwwXDVcNjRcMlwwXDIyXDY0XDFcMjEzIisKLSAgICAiXDJcNjRcMVwyMTNcMlw2NFwxXDIxM1wxMFw2NFwxXDIxM1wzXDY0XDFcMjEzIisKLSAgICAiXDVcNjRcMVwwXDJcNjRcMVwyMTJcM1wwXDFcNjRcM1wwXDFcMjE0IisKLSAgICAiXDdcMFwzXDY0XDFcMFwxXDY0XDEzXDBcMTFcNjRcMVwwXDRcNjQiKwotICAgICJcMVwwXDNcNjRcMVwwXDNcNjRcNFwwXDJcNzFcMVwyMTVcM1wwIisKLSAgICAiXDFcNzFcM1wwXDFcNzFcN1wwXDNcNzFcMVwwXDFcNzFcMTNcMCIrCi0gICAgIlwxMVw3MVwxXDBcNFw3MVwxXDBcM1w3MVwxXDBcM1w3MVw0XDAiKwotICAgICJcMVwyMTZcMlw3MVwxXDBcMlw3MVwxXDIxNlwxXDcxXDFcMFw1XDcxIisKLSAgICAiXDJcMFwyMlw3MVwxXDIxNlwyXDcxXDFcMjE2XDJcNzFcMVwyMTZcMTBcNzEiKwotICAgICJcMVwyMTZcM1w3MVwxXDIxNlw1XDcxXDFcMFwyXDcxXDFcMjE1XDNcMCIrCi0gICAgIlwxXDcxXDNcMFwxXDIxN1w3XDBcM1w3MVwxXDBcMVw3MVwxM1wwIisKLSAgICAiXDExXDcxXDFcMFw0XDcxXDFcMFwzXDcxXDFcMFwzXDcxXDVcMCIrCi0gICAgIlwxXDcxXDFcMjE1XDNcMFwxXDcxXDNcMFwxXDcxXDdcMFwzXDcxIisKLSAgICAiXDFcMFwxXDcxXDEzXDBcMTFcNzFcMVwwXDRcNzFcMVwwXDNcNzEiKwotICAgICJcMVwwXDNcNzFcM1wwXDRcMjIwXDFcNzZcMVwyMjBcMVw3NlwyXDIyMCIrCi0gICAgIlwxXDc2XDJcMjIwXDFcMFwyXDIyMFwyXDc2XDExXDIyMFwxXDBcMVwyMjAiKwotICAgICJcMVwwXDM3XDIyMFwxXDBcMlwxMDFcMVwyMjFcM1wwXDFcMTAxXDNcMCIrCi0gICAgIlwxXDEwMVw3XDBcM1wxMDFcMVwwXDFcMTAxXDEzXDBcMTFcMTAxXDFcMCIrCi0gICAgIlw0XDEwMVwxXDBcM1wxMDFcMVwwXDNcMTAxXDRcMFwxXDIyMlwyXDEwMSIrCi0gICAgIlwxXDBcMlwxMDFcMVwyMjJcMVwxMDFcMVwwXDVcMTAxXDJcMFwyMlwxMDEiKwotICAgICJcMVwyMjJcMlwxMDFcMVwyMjJcMlwxMDFcMVwyMjJcMTBcMTAxXDFcMjIyXDNcMTAxIisKLSAgICAiXDFcMjIyXDVcMTAxXDFcMFwyXDEwMVwxXDIyMVwzXDBcMVwxMDFcM1wwIisKLSAgICAiXDFcMjIzXDdcMFwzXDEwMVwxXDBcMVwxMDFcMTNcMFwxMVwxMDFcMVwwIisKLSAgICAiXDRcMTAxXDFcMFwzXDEwMVwxXDBcM1wxMDFcNDJcMFwxXDEwNFwzNVwwIisKLSAgICAiXDJcMTA3XDFcMjI0XDNcMFwxXDEwN1wzXDBcMVwxMDdcN1wwXDNcMTA3IisKLSAgICAiXDFcMFwxXDEwN1wxM1wwXDExXDEwN1wxXDBcNFwxMDdcMVwwXDNcMTA3IisKLSAgICAiXDFcMFwzXDEwN1w0XDBcMVwyMjVcMlwxMDdcMVwwXDJcMTA3XDFcMjI1IisKLSAgICAiXDFcMTA3XDFcMFw1XDEwN1wyXDBcMjJcMTA3XDFcMjI1XDJcMTA3XDFcMjI1IisKLSAgICAiXDJcMTA3XDFcMjI1XDEwXDEwN1wxXDIyNVwzXDEwN1wxXDIyNVw1XDEwN1wxXDAiKwotICAgICJcMlwyMjZcMVwyMjdcMVwwXDFcMjMwXDExXDIyNlwyXDBcNTNcMjI2XDFcMCIrCi0gICAgIlwyXDIzMVwxXDIzMlwxXDBcM1wyMzFcMVwyMzBcNlwyMzFcMlwwXDUzXDIzMSIrCi0gICAgIlwxXDBcMlwxMDdcMVwyMjRcM1wwXDFcMTA3XDNcMFwxXDIzM1w3XDAiKwotICAgICJcM1wxMDdcMVwwXDFcMTA3XDEzXDBcMTFcMTA3XDFcMFw0XDEwN1wxXDAiKwotICAgICJcM1wxMDdcMVwwXDNcMTA3XDRcMFwyXDExNFwxXDIzNFwzXDBcMVwxMTQiKwotICAgICJcM1wwXDFcMTE0XDdcMFwzXDExNFwxXDBcMVwxMTRcMTNcMFwxMVwxMTQiKwotICAgICJcMVwwXDRcMTE0XDFcMFwzXDExNFwxXDBcM1wxMTRcNFwwXDFcMjM1IisKLSAgICAiXDJcMTE0XDFcMFwyXDExNFwxXDIzNVwxXDExNFwxXDBcNVwxMTRcMlwwIisKLSAgICAiXDIyXDExNFwxXDIzNVwyXDExNFwxXDIzNVwyXDExNFwxXDIzNVwxMFwxMTRcMVwyMzUiKwotICAgICJcM1wxMTRcMVwyMzVcNVwxMTRcMVwwXDJcMTE0XDFcMjM0XDNcMFwxXDExNCIrCi0gICAgIlwzXDBcMVwyMzZcN1wwXDNcMTE0XDFcMFwxXDExNFwxM1wwXDExXDExNCIrCi0gICAgIlwxXDBcNFwxMTRcMVwwXDNcMTE0XDFcMFwzXDExNFw0XDBcMVwxMjEiKwotICAgICJcMVwyMzdcMVwyNDBcM1wwXDFcMjM3XDNcMFwxXDIzN1wxXDBcMVwyNDEiKwotICAgICJcNVwwXDNcMjM3XDFcMFwxXDIzN1wxXDBcMVwyNDJcMTFcMFwxMVwyMzciKwotICAgICJcMVwwXDRcMjM3XDFcMFwzXDIzN1wxXDBcM1wyMzdcNFwwXDJcMTIyIisKLSAgICAiXDFcMjQzXDNcMFwxXDEyMlwzXDBcMVwxMjJcN1wwXDNcMTIyXDFcMjQ0IisKLSAgICAiXDFcMTIyXDEzXDBcMTFcMTIyXDFcMFw0XDEyMlwxXDBcM1wxMjJcMVwwIisKLSAgICAiXDNcMTIyXDRcMFwxXDI0NVwyXDEyMlwxXDBcMlwxMjJcMVwyNDVcMVwxMjIiKwotICAgICJcMVwwXDVcMTIyXDJcMFwyMlwxMjJcMVwyNDVcMlwxMjJcMVwyNDVcMlwxMjIiKwotICAgICJcMVwyNDVcMTBcMTIyXDFcMjQ1XDNcMTIyXDFcMjQ1XDVcMTIyXDFcMFwyXDI0NiIrCi0gICAgIlwxXDI0N1wxXDBcMVwyNTBcMTFcMjQ2XDJcMFw1M1wyNDZcMVwwXDJcMjUxIisKLSAgICAiXDFcMjUyXDFcMFwzXDI1MVwxXDI1MFw2XDI1MVwyXDBcNTNcMjUxXDFcMCIrCi0gICAgIlwxXDI1M1wxXDEyMlwxXDI0M1wzXDBcMVwxMjJcM1wwXDFcMjU0XDFcMCIrCi0gICAgIlwxXDI0MVw1XDBcM1wxMjJcMVwyNDRcMVwxMjJcMTNcMFwxMVwxMjJcMVwwIisKLSAgICAiXDRcMTIyXDFcMFwzXDEyMlwxXDBcM1wxMjJcNFwwXDFcMTIxXDEzXDAiKwotICAgICJcMVwyNDFcNTdcMFwxXDI1NVw3M1wwXDJcMjU2XDFcMjU3XDNcMFwxXDI1NiIrCi0gICAgIlwzXDBcMVwyNTZcN1wwXDNcMjU2XDFcMFwxXDI1NlwxM1wwXDExXDI1NiIrCi0gICAgIlwxXDBcNFwyNTZcMVwwXDNcMjU2XDFcMFwzXDI1Nlw0XDBcMlwxMjIiKwotICAgICJcMVwyNDNcM1wwXDFcMTIyXDNcMFwxXDEyMlwxXDI2MFw2XDBcMVwxMjIiKwotICAgICJcMVwyNjFcMVwxMjJcMVwyNDRcMVwxMjJcMTNcMFwxMVwxMjJcMVwwXDRcMTIyIisKLSAgICAiXDFcMFwzXDEyMlwxXDBcM1wxMjJcN1wwXDFcMjYyXDFcMFwxXDI2MiIrCi0gICAgIlwyXDBcMVwyNjJcNVwwXDJcMjYyXDM0XDBcMVwyNjNcMTZcMFw0XDI2NCIrCi0gICAgIlwxXDEzN1wxXDI2NFwxXDEzN1wyXDI2NFwxXDEzN1w1XDI2NFwyXDEzN1wxNFwyNjQiKwotICAgICJcMVwwXDE2XDI2NFwxXDBcMTdcMjY0XDEzXDBcMVwyNjVcNjZcMFwxXDI2NiIrCi0gICAgIlwyXDBcMVwyNjZcNVwwXDJcMjY2XDExXDBcMVwyNjdcNTRcMFwxXDI3MCIrCi0gICAgIlw2MVwwXDFcMjcxXDFcMzJcMVwxNDdcMVwzMlwxXDBcMVwzMlwxXDI3MSIrCi0gICAgIlwxXDBcMVwzMlwxXDBcMVwzMlwzXDBcMlwzMlwyXDBcM1wzMiIrCi0gICAgIlwxXDBcMVwzMlwxM1wwXDFcMjcxXDJcMzJcMVwyNzFcMlwzMlwxXDI3MSIrCi0gICAgIlwyXDMyXDFcMFw0XDMyXDFcMFwxXDI3MVwyXDMyXDFcMFwxXDI3MSIrCi0gICAgIlwyXDMyXDRcMFwyXDMyXDFcMTQ3XDNcMFwxXDMyXDNcMFwxXDMyIisKLSAgICAiXDdcMFwzXDMyXDFcMFwxXDMyXDJcMFwxXDI3MlwxMFwwXDExXDMyIisKLSAgICAiXDFcMFw0XDMyXDFcMFwzXDMyXDFcMFwzXDMyXDRcMFwxXDI3MyIrCi0gICAgIlwyXDE1MlwxXDBcMlwxNTJcMVwyNzNcMVwxNTJcMVwwXDVcMTUyXDJcMCIrCi0gICAgIlwyMlwxNTJcMVwyNzNcMlwxNTJcMVwyNzNcMlwxNTJcMVwyNzNcMTBcMTUyXDFcMjczIisKLSAgICAiXDNcMTUyXDFcMjczXDVcMTUyXDFcMFwxXDI3NFwyXDE1NFwxXDBcMlwxNTQiKwotICAgICJcMVwyNzRcMVwxNTRcMVwwXDVcMTU0XDJcMFwyMlwxNTRcMVwyNzRcMlwxNTQiKwotICAgICJcMVwyNzRcMlwxNTRcMVwyNzRcMTBcMTU0XDFcMjc0XDNcMTU0XDFcMjc0XDVcMTU0IisKLSAgICAiXDZcMFwxXDE1NlwyXDBcMVwxNTZcNVwwXDJcMTU2XDEwXDBcMVwxNTciKwotICAgICJcNTBcMFwxXDE1N1wyXDBcMVwxNTdcNVwwXDJcMTU3XDY2XDBcMVwyNzUiKwotICAgICJcMTI1XDBcMVwyNzZcMTA0XDBcMVwyNzdcNjZcMFwyXDMwMFw2N1wwXDJcMzAxIisKLSAgICAiXDEwNFwwXDFcMzAyXDEzXDBcNDJcMTcwXDFcMzAzXDMxXDE3MFwxXDBcMlwxNzEiKwotICAgICJcMVwxNzJcM1wwXDFcMTcxXDNcMFwxXDE3MVw3XDBcM1wxNzFcMVwzMDQiKwotICAgICJcMVwxNzFcMTNcMFwxMVwxNzFcMVwwXDRcMTcxXDFcMFwzXDE3MVwxXDAiKwotICAgICJcM1wxNzFcNFwwXDFcMzA1XDJcMTcxXDFcMFwyXDE3MVwxXDMwNVwxXDE3MSIrCi0gICAgIlwxXDBcNVwxNzFcMlwwXDIyXDE3MVwxXDMwNVwyXDE3MVwxXDMwNVwyXDE3MSIrCi0gICAgIlwxXDMwNVwxMFwxNzFcMVwzMDVcM1wxNzFcMVwzMDVcNVwxNzFcMVwwXDFcMzA2IisKLSAgICAiXDFcMTczXDFcMTc0XDFcMTczXDFcMzA3XDFcMTczXDFcMzA2XDEwXDE3M1wxXDMxMCIrCi0gICAgIlwyMlwxNzNcMVwzMDZcMlwxNzNcMVwzMDZcMlwxNzNcMVwzMDZcMTBcMTczXDFcMzA2IisKLSAgICAiXDNcMTczXDFcMzA2XDVcMTczXDFcMFwxXDMxMVwxXDE3NlwxXDE3N1wzXDE3NiIrCi0gICAgIlwxXDMxMVwxXDMxMlw3XDE3NlwxXDMxM1wyMlwxNzZcMVwzMTFcMlwxNzZcMVwzMTEiKwotICAgICJcMlwxNzZcMVwzMTFcMTBcMTc2XDFcMzExXDNcMTc2XDFcMzExXDVcMTc2XDMyXDAiKwotICAgICJcMVwyNzJcNDJcMFwxXDMxNFwxXDIwMVwxXDIwMlwxXDIwMVwxXDMxNVwxXDIwMSIrCi0gICAgIlwxXDMxNFwxMFwyMDFcMVwzMTZcMjJcMjAxXDFcMzE0XDJcMjAxXDFcMzE0XDJcMjAxIisKLSAgICAiXDFcMzE0XDEwXDIwMVwxXDMxNFwzXDIwMVwxXDMxNFw1XDIwMVwxXDBcMVwzMTciKwotICAgICJcMVwyMDRcMVwyMDVcM1wyMDRcMVwzMTdcMVwzMjBcN1wyMDRcMVwzMjFcMjJcMjA0IisKLSAgICAiXDFcMzE3XDJcMjA0XDFcMzE3XDJcMjA0XDFcMzE3XDEwXDIwNFwxXDMxN1wzXDIwNCIrCi0gICAgIlwxXDMxN1w1XDIwNFwyNVwwXDFcMzIyXDQ3XDBcMVwzMjNcMVw2MFwxXDIwNyIrCi0gICAgIlwxXDYwXDFcMFwxXDYwXDFcMzIzXDFcMFwxXDYwXDFcMFwxXDYwIisKLSAgICAiXDNcMFwyXDYwXDJcMFwzXDYwXDFcMFwxXDYwXDEzXDBcMVwzMjMiKwotICAgICJcMlw2MFwxXDMyM1wyXDYwXDFcMzIzXDJcNjBcMVwwXDRcNjBcMVwwIisKLSAgICAiXDFcMzIzXDJcNjBcMVwwXDFcMzIzXDJcNjBcNFwwXDJcNjBcMVwyMDciKwotICAgICJcM1wwXDFcNjBcM1wwXDFcNjBcN1wwXDNcNjBcMVwwXDFcNjAiKwotICAgICJcMlwwXDFcMjcyXDEwXDBcMTFcNjBcMVwwXDRcNjBcMVwwXDNcNjAiKwotICAgICJcMVwwXDNcNjBcNFwwXDFcMzI0XDFcNjRcMVwyMTJcMVw2NFwxXDAiKwotICAgICJcMVw2NFwxXDMyNFwxXDBcMVw2NFwxXDBcMVw2NFwzXDBcMlw2NCIrCi0gICAgIlwyXDBcM1w2NFwxXDBcMVw2NFwxM1wwXDFcMzI0XDJcNjRcMVwzMjQiKwotICAgICJcMlw2NFwxXDMyNFwyXDY0XDFcMFw0XDY0XDFcMFwxXDMyNFwyXDY0IisKLSAgICAiXDFcMFwxXDMyNFwyXDY0XDRcMFwyXDY0XDFcMjEyXDNcMFwxXDY0IisKLSAgICAiXDNcMFwxXDY0XDdcMFwzXDY0XDFcMFwxXDY0XDJcMFwxXDI3MiIrCi0gICAgIlwxMFwwXDExXDY0XDFcMFw0XDY0XDFcMFwzXDY0XDFcMFwzXDY0IisKLSAgICAiXDRcMFwxXDMyNVwxXDcxXDFcMjE1XDFcNzFcMVwwXDFcNzFcMVwzMjUiKwotICAgICJcMVwwXDFcNzFcMVwwXDFcNzFcM1wwXDJcNzFcMlwwXDNcNzEiKwotICAgICJcMVwwXDFcNzFcMTNcMFwxXDMyNVwyXDcxXDFcMzI1XDJcNzFcMVwzMjUiKwotICAgICJcMlw3MVwxXDBcNFw3MVwxXDBcMVwzMjVcMlw3MVwxXDBcMVwzMjUiKwotICAgICJcMlw3MVw0XDBcMlw3MVwxXDIxNVwzXDBcMVw3MVwzXDBcMVw3MSIrCi0gICAgIlw3XDBcM1w3MVwxXDBcMVw3MVwyXDBcMVwyNzJcMTBcMFwxMVw3MSIrCi0gICAgIlwxXDBcNFw3MVwxXDBcM1w3MVwxXDBcM1w3MVw0XDBcMVwzMjYiKwotICAgICJcMVwxMDFcMVwyMjFcMVwxMDFcMVwwXDFcMTAxXDFcMzI2XDFcMFwxXDEwMSIrCi0gICAgIlwxXDBcMVwxMDFcM1wwXDJcMTAxXDJcMFwzXDEwMVwxXDBcMVwxMDEiKwotICAgICJcMTNcMFwxXDMyNlwyXDEwMVwxXDMyNlwyXDEwMVwxXDMyNlwyXDEwMVwxXDAiKwotICAgICJcNFwxMDFcMVwwXDFcMzI2XDJcMTAxXDFcMFwxXDMyNlwyXDEwMVw0XDAiKwotICAgICJcMlwxMDFcMVwyMjFcM1wwXDFcMTAxXDNcMFwxXDEwMVw3XDBcM1wxMDEiKwotICAgICJcMVwwXDFcMTAxXDJcMFwxXDI3MlwxMFwwXDExXDEwMVwxXDBcNFwxMDEiKwotICAgICJcMVwwXDNcMTAxXDFcMFwzXDEwMVw0XDBcMVwzMjdcMVwxMDdcMVwyMjQiKwotICAgICJcMVwxMDdcMVwwXDFcMTA3XDFcMzI3XDFcMFwxXDEwN1wxXDBcMVwxMDciKwotICAgICJcM1wwXDJcMTA3XDJcMFwzXDEwN1wxXDBcMVwxMDdcMTNcMFwxXDMyNyIrCi0gICAgIlwyXDEwN1wxXDMyN1wyXDEwN1wxXDMyN1wyXDEwN1wxXDBcNFwxMDdcMVwwIisKLSAgICAiXDFcMzI3XDJcMTA3XDFcMFwxXDMyN1wyXDEwN1w0XDBcMVwzMzBcMVwyMjYiKwotICAgICJcMVwyMjdcMVwyMjZcMVwzMzFcMVwyMjZcMVwzMzBcMTBcMjI2XDFcMzMyXDIyXDIyNiIrCi0gICAgIlwxXDMzMFwyXDIyNlwxXDMzMFwyXDIyNlwxXDMzMFwxMFwyMjZcMVwzMzBcM1wyMjYiKwotICAgICJcMVwzMzBcNVwyMjZcMVwwXDFcMzMzXDFcMjMxXDFcMjMyXDNcMjMxXDFcMzMzIisKLSAgICAiXDFcMzM0XDdcMjMxXDFcMzM1XDIyXDIzMVwxXDMzM1wyXDIzMVwxXDMzM1wyXDIzMSIrCi0gICAgIlwxXDMzM1wxMFwyMzFcMVwzMzNcM1wyMzFcMVwzMzNcNVwyMzFcMVwwXDJcMTA3IisKLSAgICAiXDFcMjI0XDNcMFwxXDEwN1wzXDBcMVwxMDdcN1wwXDNcMTA3XDFcMCIrCi0gICAgIlwxXDEwN1wyXDBcMVwyNzJcMTBcMFwxMVwxMDdcMVwwXDRcMTA3XDFcMCIrCi0gICAgIlwzXDEwN1wxXDBcM1wxMDdcNFwwXDFcMzM2XDFcMTE0XDFcMjM0XDFcMTE0IisKLSAgICAiXDFcMFwxXDExNFwxXDMzNlwxXDBcMVwxMTRcMVwwXDFcMTE0XDNcMCIrCi0gICAgIlwyXDExNFwyXDBcM1wxMTRcMVwwXDFcMTE0XDEzXDBcMVwzMzZcMlwxMTQiKwotICAgICJcMVwzMzZcMlwxMTRcMVwzMzZcMlwxMTRcMVwwXDRcMTE0XDFcMFwxXDMzNiIrCi0gICAgIlwyXDExNFwxXDBcMVwzMzZcMlwxMTRcNFwwXDJcMTE0XDFcMjM0XDNcMCIrCi0gICAgIlwxXDExNFwzXDBcMVwxMTRcN1wwXDNcMTE0XDFcMFwxXDExNFwyXDAiKwotICAgICJcMVwyNzJcMTBcMFwxMVwxMTRcMVwwXDRcMTE0XDFcMFwzXDExNFwxXDAiKwotICAgICJcM1wxMTRcNFwwXDJcMjM3XDFcMjQwXDNcMFwxXDIzN1wzXDBcMVwyMzciKwotICAgICJcN1wwXDNcMjM3XDFcMFwxXDIzN1wxM1wwXDExXDIzN1wxXDBcNFwyMzciKwotICAgICJcMVwwXDNcMjM3XDFcMFwzXDIzN1w0XDBcMVwzMzdcMlwyMzdcMVwwIisKLSAgICAiXDJcMjM3XDFcMzM3XDFcMjM3XDFcMFw1XDIzN1wyXDBcMjJcMjM3XDFcMzM3IisKLSAgICAiXDJcMjM3XDFcMzM3XDJcMjM3XDFcMzM3XDEwXDIzN1wxXDMzN1wzXDIzN1wxXDMzNyIrCi0gICAgIlw1XDIzN1wxXDBcMVwzNDBcMVwxMjJcMVwyNDNcMVwxMjJcMVwwXDFcMTIyIisKLSAgICAiXDFcMzQwXDFcMFwxXDEyMlwxXDBcMVwxMjJcM1wwXDJcMTIyXDJcMCIrCi0gICAgIlwzXDEyMlwxXDI0NFwxXDEyMlwxM1wwXDFcMzQwXDJcMTIyXDFcMzQwXDJcMTIyIisKLSAgICAiXDFcMzQwXDJcMTIyXDFcMFw0XDEyMlwxXDBcMVwzNDBcMlwxMjJcMVwwIisKLSAgICAiXDFcMzQwXDJcMTIyXDRcMFwxXDM0MVwxXDI0NlwxXDI0N1wxXDI0NlwxXDM0MiIrCi0gICAgIlwxXDI0NlwxXDM0MVwxMFwyNDZcMVwzNDNcMjJcMjQ2XDFcMzQxXDJcMjQ2XDFcMzQxIisKLSAgICAiXDJcMjQ2XDFcMzQxXDEwXDI0NlwxXDM0MVwzXDI0NlwxXDM0MVw1XDI0NlwxXDAiKwotICAgICJcMVwzNDRcMVwyNTFcMVwyNTJcM1wyNTFcMVwzNDRcMVwzNDVcN1wyNTFcMVwzNDYiKwotICAgICJcMjJcMjUxXDFcMzQ0XDJcMjUxXDFcMzQ0XDJcMjUxXDFcMzQ0XDEwXDI1MVwxXDM0NCIrCi0gICAgIlwzXDI1MVwxXDM0NFw1XDI1MVwxXDBcMVwyNTNcMVwxMjJcMVwyNDNcM1wwIisKLSAgICAiXDFcMTIyXDNcMFwxXDEyMlwxXDBcMVwyNDFcNVwwXDNcMTIyXDFcMjQ0IisKLSAgICAiXDFcMTIyXDFcMFwxXDI0MlwxMVwwXDExXDEyMlwxXDBcNFwxMjJcMVwwIisKLSAgICAiXDNcMTIyXDFcMFwzXDEyMlw0XDBcMlwxMjJcMVwyNDNcM1wwXDFcMTIyIisKLSAgICAiXDNcMFwxXDEyMlw3XDBcM1wxMjJcMVwyNDRcMVwxMjJcMlwwXDFcMjcyIisKLSAgICAiXDEwXDBcMTFcMTIyXDFcMFw0XDEyMlwxXDBcM1wxMjJcMVwwXDNcMTIyIisKLSAgICAiXDRcMFwxXDI1NVwxXDIzN1wxXDI0MFwzXDBcMVwyMzdcM1wwXDFcMjM3IisKLSAgICAiXDdcMFwzXDIzN1wxXDBcMVwyMzdcMVwwXDFcMjQyXDExXDBcMTFcMjM3IisKLSAgICAiXDFcMFw0XDIzN1wxXDBcM1wyMzdcMVwwXDNcMjM3XDRcMFwxXDM0NyIrCi0gICAgIlwyXDI1NlwxXDBcMlwyNTZcMVwzNDdcMVwyNTZcMVwwXDVcMjU2XDJcMCIrCi0gICAgIlwyMlwyNTZcMVwzNDdcMlwyNTZcMVwzNDdcMlwyNTZcMVwzNDdcMTBcMjU2XDFcMzQ3IisKLSAgICAiXDNcMjU2XDFcMzQ3XDVcMjU2XDFcMFwxXDM1MFw1XDBcMVwzNTBcMTFcMCIrCi0gICAgIlwxXDM1MFw1XDBcMVwzNTBcMTNcMFwyXDM1MFwxXDBcMlwzNTBcMVwwIisKLSAgICAiXDJcMzUwXDdcMFwyXDM1MFwyXDBcMlwzNTBcNVwwXDJcMTIyXDFcMjQzIisKLSAgICAiXDNcMFwxXDEyMlwzXDBcMVwxMjJcN1wwXDJcMTIyXDFcMzUxXDFcMjQ0IisKLSAgICAiXDFcMTIyXDEzXDBcMTFcMTIyXDFcMFw0XDEyMlwxXDBcM1wxMjJcMVwwIisKLSAgICAiXDNcMTIyXDYxXDBcMVwzNTJcMzBcMFwxXDM1M1wxNVwwXDFcMzU0XDFcMjcyIisKLSAgICAiXDQyXDBcMVwzNTVcMVwzMlwxXDE0N1wxXDMyXDFcMFwxXDMyXDFcMzU1IisKLSAgICAiXDFcMFwxXDMyXDFcMFwxXDMyXDNcMFwyXDMyXDJcMFwzXDMyIisKLSAgICAiXDFcMFwxXDMyXDEzXDBcMVwzNTVcMlwzMlwxXDM1NVwyXDMyXDFcMzU1IisKLSAgICAiXDJcMzJcMVwwXDRcMzJcMVwwXDFcMzU1XDJcMzJcMVwwXDFcMzU1IisKLSAgICAiXDJcMzJcNFwwXDFcMzU2XDFcMTUyXDFcMTUzXDFcMTUyXDFcMFwxXDE1MiIrCi0gICAgIlwxXDM1NlwxXDBcMVwxNTJcMVwwXDFcMTUyXDNcMFwyXDE1MlwyXDAiKwotICAgICJcM1wxNTJcMVwwXDFcMTUyXDEzXDBcMVwzNTZcMlwxNTJcMVwzNTZcMlwxNTIiKwotICAgICJcMVwzNTZcMlwxNTJcMVwwXDRcMTUyXDFcMFwxXDM1NlwyXDE1MlwxXDAiKwotICAgICJcMVwzNTZcMlwxNTJcNFwwXDFcMzU3XDFcMTU0XDFcMTU1XDFcMTU0XDFcMCIrCi0gICAgIlwxXDE1NFwxXDM1N1wxXDBcMVwxNTRcMVwwXDFcMTU0XDNcMFwyXDE1NCIrCi0gICAgIlwyXDBcM1wxNTRcMVwwXDFcMTU0XDEzXDBcMVwzNTdcMlwxNTRcMVwzNTciKwotICAgICJcMlwxNTRcMVwzNTdcMlwxNTRcMVwwXDRcMTU0XDFcMFwxXDM1N1wyXDE1NCIrCi0gICAgIlwxXDBcMVwzNTdcMlwxNTRcMTZcMFwxXDM2MFwxMjZcMFwyXDM2MVwxMDNcMCIrCi0gICAgIlwxXDM2Mlw3NlwwXDJcMzYzXDc0XDBcMVwzNjRcNzdcMFwxXDM2NVwzXDAiKwotICAgICJcNDFcMTcwXDFcMzY2XDFcMzAzXDMxXDE3MFwyXDBcMVwzNjdcMVwzNzBcMVwzMDQiKwotICAgICJcMVwwXDFcMzA0XDFcMzY3XDFcMFwxXDMwNFwxXDBcMVwzNjdcM1wwIisKLSAgICAiXDJcMzA0XDJcMFwzXDM2N1wxXDBcMVwzNjdcMTNcMFwxMVwzNjdcMVwwIisKLSAgICAiXDRcMzY3XDFcMFwzXDM2N1wxXDBcM1wzNjdcNFwwXDFcMzcxXDFcMTcxIisKLSAgICAiXDFcMTcyXDFcMTcxXDFcMFwxXDE3MVwxXDM3MVwxXDBcMVwxNzFcMVwwIisKLSAgICAiXDFcMTcxXDNcMFwyXDE3MVwyXDBcM1wxNzFcMVwzMDRcMVwxNzFcMTNcMCIrCi0gICAgIlwxXDM3MVwyXDE3MVwxXDM3MVwyXDE3MVwxXDM3MVwyXDE3MVwxXDBcNFwxNzEiKwotICAgICJcMVwwXDFcMzcxXDJcMTcxXDFcMFwxXDM3MVwyXDE3MVw0XDBcMVwzNzIiKwotICAgICJcMVwxNzNcMVwxNzRcMVwxNzNcMVwxNzVcMVwxNzNcMVwzNzJcMzNcMTczXDFcMzcyIisKLSAgICAiXDJcMTczXDFcMzcyXDJcMTczXDFcMzcyXDEwXDE3M1wxXDM3MlwzXDE3M1wxXDM3MiIrCi0gICAgIlw1XDE3M1wxXDBcMlwxNzNcMVwxNzRcMVwwXDFcMTc1XDEyXDE3M1wxXDAiKwotICAgICJcNTNcMTczXDFcMFwxXDM3M1wxXDE3NlwxXDE3N1wzXDE3NlwxXDM3M1wxXDE3NSIrCi0gICAgIlwzMlwxNzZcMVwzNzNcMlwxNzZcMVwzNzNcMlwxNzZcMVwzNzNcMTBcMTc2XDFcMzczIisKLSAgICAiXDNcMTc2XDFcMzczXDVcMTc2XDFcMFwyXDE3NlwxXDE3N1wxXDBcM1wxNzYiKwotICAgICJcMVwxNzVcN1wxNzZcMVwwXDUzXDE3NlwxXDBcMVwzNzRcMVwyMDFcMVwyMDIiKwotICAgICJcMVwyMDFcMVwyMDNcMVwyMDFcMVwzNzRcMzNcMjAxXDFcMzc0XDJcMjAxXDFcMzc0IisKLSAgICAiXDJcMjAxXDFcMzc0XDEwXDIwMVwxXDM3NFwzXDIwMVwxXDM3NFw1XDIwMVwxXDAiKwotICAgICJcMlwyMDFcMVwyMDJcMVwwXDFcMjAzXDEyXDIwMVwxXDBcNTNcMjAxXDFcMCIrCi0gICAgIlwxXDM3NVwxXDIwNFwxXDIwNVwzXDIwNFwxXDM3NVwxXDIwM1wzMlwyMDRcMVwzNzUiKwotICAgICJcMlwyMDRcMVwzNzVcMlwyMDRcMVwzNzVcMTBcMjA0XDFcMzc1XDNcMjA0XDFcMzc1IisKLSAgICAiXDVcMjA0XDFcMFwyXDIwNFwxXDIwNVwxXDBcM1wyMDRcMVwyMDNcN1wyMDQiKwotICAgICJcMVwwXDUzXDIwNFwyNlwwXDFcMzc2XDQ2XDBcMVwzNzdcMVw2MFwxXDIwNyIrCi0gICAgIlwxXDYwXDFcMFwxXDYwXDFcMzc3XDFcMFwxXDYwXDFcMFwxXDYwIisKLSAgICAiXDNcMFwyXDYwXDJcMFwzXDYwXDFcMFwxXDYwXDEzXDBcMVwzNzciKwotICAgICJcMlw2MFwxXDM3N1wyXDYwXDFcMzc3XDJcNjBcMVwwXDRcNjBcMVwwIisKLSAgICAiXDFcMzc3XDJcNjBcMVwwXDFcMzc3XDJcNjBcNFwwXDFcdTAxMDBcMVw2NCIrCi0gICAgIlwxXDIxMlwxXDY0XDFcMFwxXDY0XDFcdTAxMDBcMVwwXDFcNjRcMVwwIisKLSAgICAiXDFcNjRcM1wwXDJcNjRcMlwwXDNcNjRcMVwwXDFcNjRcMTNcMCIrCi0gICAgIlwxXHUwMTAwXDJcNjRcMVx1MDEwMFwyXDY0XDFcdTAxMDBcMlw2NFwxXDBcNFw2NCIrCi0gICAgIlwxXDBcMVx1MDEwMFwyXDY0XDFcMFwxXHUwMTAwXDJcNjRcNFwwXDFcdTAxMDEiKwotICAgICJcMVw3MVwxXDIxNVwxXDcxXDFcMFwxXDcxXDFcdTAxMDFcMVwwXDFcNzEiKwotICAgICJcMVwwXDFcNzFcM1wwXDJcNzFcMlwwXDNcNzFcMVwwXDFcNzEiKwotICAgICJcMTNcMFwxXHUwMTAxXDJcNzFcMVx1MDEwMVwyXDcxXDFcdTAxMDFcMlw3MVwxXDAiKwotICAgICJcNFw3MVwxXDBcMVx1MDEwMVwyXDcxXDFcMFwxXHUwMTAxXDJcNzFcNFwwIisKLSAgICAiXDFcdTAxMDJcMVwxMDFcMVwyMjFcMVwxMDFcMVwwXDFcMTAxXDFcdTAxMDJcMVwwIisKLSAgICAiXDFcMTAxXDFcMFwxXDEwMVwzXDBcMlwxMDFcMlwwXDNcMTAxXDFcMCIrCi0gICAgIlwxXDEwMVwxM1wwXDFcdTAxMDJcMlwxMDFcMVx1MDEwMlwyXDEwMVwxXHUwMTAyXDJcMTAxIisKLSAgICAiXDFcMFw0XDEwMVwxXDBcMVx1MDEwMlwyXDEwMVwxXDBcMVx1MDEwMlwyXDEwMSIrCi0gICAgIlw0XDBcMVx1MDEwM1wxXDEwN1wxXDIyNFwxXDEwN1wxXDBcMVwxMDdcMVx1MDEwMyIrCi0gICAgIlwxXDBcMVwxMDdcMVwwXDFcMTA3XDNcMFwyXDEwN1wyXDBcM1wxMDciKwotICAgICJcMVwwXDFcMTA3XDEzXDBcMVx1MDEwM1wyXDEwN1wxXHUwMTAzXDJcMTA3XDFcdTAxMDMiKwotICAgICJcMlwxMDdcMVwwXDRcMTA3XDFcMFwxXHUwMTAzXDJcMTA3XDFcMFwxXHUwMTAzIisKLSAgICAiXDJcMTA3XDRcMFwxXHUwMTA0XDFcMjI2XDFcMjI3XDFcMjI2XDFcMjMwXDFcMjI2IisKLSAgICAiXDFcdTAxMDRcMzNcMjI2XDFcdTAxMDRcMlwyMjZcMVx1MDEwNFwyXDIyNlwxXHUwMTA0XDEwXDIyNiIrCi0gICAgIlwxXHUwMTA0XDNcMjI2XDFcdTAxMDRcNVwyMjZcMVwwXDJcMjI2XDFcMjI3XDFcMCIrCi0gICAgIlwxXDIzMFwxMlwyMjZcMVwwXDUzXDIyNlwxXDBcMVx1MDEwNVwxXDIzMVwxXDIzMiIrCi0gICAgIlwzXDIzMVwxXHUwMTA1XDFcMjMwXDMyXDIzMVwxXHUwMTA1XDJcMjMxXDFcdTAxMDVcMlwyMzEiKwotICAgICJcMVx1MDEwNVwxMFwyMzFcMVx1MDEwNVwzXDIzMVwxXHUwMTA1XDVcMjMxXDFcMFwyXDIzMSIrCi0gICAgIlwxXDIzMlwxXDBcM1wyMzFcMVwyMzBcN1wyMzFcMVwwXDUzXDIzMVwxXDAiKwotICAgICJcMVx1MDEwNlwxXDExNFwxXDIzNFwxXDExNFwxXDBcMVwxMTRcMVx1MDEwNlwxXDAiKwotICAgICJcMVwxMTRcMVwwXDFcMTE0XDNcMFwyXDExNFwyXDBcM1wxMTRcMVwwIisKLSAgICAiXDFcMTE0XDEzXDBcMVx1MDEwNlwyXDExNFwxXHUwMTA2XDJcMTE0XDFcdTAxMDZcMlwxMTQiKwotICAgICJcMVwwXDRcMTE0XDFcMFwxXHUwMTA2XDJcMTE0XDFcMFwxXHUwMTA2XDJcMTE0IisKLSAgICAiXDRcMFwxXHUwMTA3XDFcMjM3XDFcMjQwXDFcMjM3XDFcMFwxXDIzN1wxXHUwMTA3IisKLSAgICAiXDFcMFwxXDIzN1wxXDBcMVwyMzdcM1wwXDJcMjM3XDJcMFwzXDIzNyIrCi0gICAgIlwxXDBcMVwyMzdcMTNcMFwxXHUwMTA3XDJcMjM3XDFcdTAxMDdcMlwyMzdcMVx1MDEwNyIrCi0gICAgIlwyXDIzN1wxXDBcNFwyMzdcMVwwXDFcdTAxMDdcMlwyMzdcMVwwXDFcdTAxMDciKwotICAgICJcMlwyMzdcNFwwXDFcdTAxMDhcMVwxMjJcMVwyNDNcMVwxMjJcMVwwXDFcMTIyIisKLSAgICAiXDFcdTAxMDhcMVwwXDFcMTIyXDFcMFwxXDEyMlwzXDBcMlwxMjJcMlwwIisKLSAgICAiXDNcMTIyXDFcMjQ0XDFcMTIyXDEzXDBcMVx1MDEwOFwyXDEyMlwxXHUwMTA4XDJcMTIyIisKLSAgICAiXDFcdTAxMDhcMlwxMjJcMVwwXDRcMTIyXDFcMFwxXHUwMTA4XDJcMTIyXDFcMCIrCi0gICAgIlwxXHUwMTA4XDJcMTIyXDRcMFwxXHUwMTA5XDFcMjQ2XDFcMjQ3XDFcMjQ2XDFcMjUwIisKLSAgICAiXDFcMjQ2XDFcdTAxMDlcMzNcMjQ2XDFcdTAxMDlcMlwyNDZcMVx1MDEwOVwyXDI0NlwxXHUwMTA5IisKLSAgICAiXDEwXDI0NlwxXHUwMTA5XDNcMjQ2XDFcdTAxMDlcNVwyNDZcMVwwXDJcMjQ2XDFcMjQ3IisKLSAgICAiXDFcMFwxXDI1MFwxMlwyNDZcMVwwXDUzXDI0NlwxXDBcMVx1MDEwYVwxXDI1MSIrCi0gICAgIlwxXDI1MlwzXDI1MVwxXHUwMTBhXDFcMjUwXDMyXDI1MVwxXHUwMTBhXDJcMjUxXDFcdTAxMGEiKwotICAgICJcMlwyNTFcMVx1MDEwYVwxMFwyNTFcMVx1MDEwYVwzXDI1MVwxXHUwMTBhXDVcMjUxXDFcMCIrCi0gICAgIlwyXDI1MVwxXDI1MlwxXDBcM1wyNTFcMVwyNTBcN1wyNTFcMVwwXDUzXDI1MSIrCi0gICAgIlwxXDBcMVx1MDEwYlwxXDI1NlwxXDI1N1wxXDI1NlwxXDBcMVwyNTZcMVx1MDEwYiIrCi0gICAgIlwxXDBcMVwyNTZcMVwwXDFcMjU2XDNcMFwyXDI1NlwyXDBcM1wyNTYiKwotICAgICJcMVwwXDFcMjU2XDEzXDBcMVx1MDEwYlwyXDI1NlwxXHUwMTBiXDJcMjU2XDFcdTAxMGIiKwotICAgICJcMlwyNTZcMVwwXDRcMjU2XDFcMFwxXHUwMTBiXDJcMjU2XDFcMFwxXHUwMTBiIisKLSAgICAiXDJcMjU2XDRcMFwxXHUwMTBjXDVcMFwxXHUwMTBjXDNcMFwxXHUwMTBkXDVcMCIrCi0gICAgIlwxXHUwMTBjXDVcMFwxXHUwMTBjXDEzXDBcMlx1MDEwY1wxXDBcMlx1MDEwY1wxXDAiKwotICAgICJcMlx1MDEwY1w3XDBcMlx1MDEwY1wyXDBcMlx1MDEwY1w1XDBcMlwxMjJcMVwyNDMiKwotICAgICJcM1wwXDFcMTIyXDNcMFwxXDEyMlw3XDBcM1wxMjJcMVx1MDEwZVwxXDEyMiIrCi0gICAgIlwxM1wwXDExXDEyMlwxXDBcNFwxMjJcMVwwXDNcMTIyXDFcMFwzXDEyMiIrCi0gICAgIlw2MlwwXDFcdTAxMGZcMjdcMFwxXDM1M1wxNVwwXDFcMzU0XDUwXDBcMVwzNTQiKwotICAgICJcMlwwXDFcMzU0XDVcMFwyXDM1NFwxMVwwXDFcdTAxMTBcNDJcMFwxXHUwMTExIisKLSAgICAiXDFcMzJcMVwxNDdcMVwzMlwxXDBcMVwzMlwxXHUwMTExXDFcMFwxXDMyIisKLSAgICAiXDFcMFwxXDMyXDNcMFwyXDMyXDJcMFwzXDMyXDFcMFwxXDMyIisKLSAgICAiXDEzXDBcMVx1MDExMVwyXDMyXDFcdTAxMTFcMlwzMlwxXHUwMTExXDJcMzJcMVwwIisKLSAgICAiXDRcMzJcMVwwXDFcdTAxMTFcMlwzMlwxXDBcMVx1MDExMVwyXDMyXDRcMCIrCi0gICAgIlwxXHUwMTEyXDFcMTUyXDFcMTUzXDFcMTUyXDFcMFwxXDE1MlwxXHUwMTEyXDFcMCIrCi0gICAgIlwxXDE1MlwxXDBcMVwxNTJcM1wwXDJcMTUyXDJcMFwzXDE1MlwxXDAiKwotICAgICJcMVwxNTJcMTNcMFwxXHUwMTEyXDJcMTUyXDFcdTAxMTJcMlwxNTJcMVx1MDExMlwyXDE1MiIrCi0gICAgIlwxXDBcNFwxNTJcMVwwXDFcdTAxMTJcMlwxNTJcMVwwXDFcdTAxMTJcMlwxNTIiKwotICAgICJcNFwwXDFcdTAxMTNcMVwxNTRcMVwxNTVcMVwxNTRcMVwwXDFcMTU0XDFcdTAxMTMiKwotICAgICJcMVwwXDFcMTU0XDFcMFwxXDE1NFwzXDBcMlwxNTRcMlwwXDNcMTU0IisKLSAgICAiXDFcMFwxXDE1NFwxM1wwXDFcdTAxMTNcMlwxNTRcMVx1MDExM1wyXDE1NFwxXHUwMTEzIisKLSAgICAiXDJcMTU0XDFcMFw0XDE1NFwxXDBcMVx1MDExM1wyXDE1NFwxXDBcMVx1MDExMyIrCi0gICAgIlwyXDE1NFwyN1wwXDFcdTAxMTRcMTI3XDBcMVx1MDExNVw3MFwwXDFcdTAxMTZcNjdcMCIrCi0gICAgIlwyXHUwMTE3XDc0XDBcMVx1MDExOFwyMVwwXDJcMzY3XDFcMzcwXDFcdTAxMTlcMVwwIisKLSAgICAiXDFcdTAxMTlcMVwzNjdcMVwwXDFcdTAxMTlcMVx1MDExYVwxXDM2N1wzXDBcMlx1MDExOSIrCi0gICAgIlwyXDBcM1wzNjdcMVwwXDFcMzY3XDEzXDBcMTFcMzY3XDFcMFw0XDM2NyIrCi0gICAgIlwxXDBcM1wzNjdcMVwwXDNcMzY3XDRcMFwxXHUwMTFiXDJcMzY3XDFcMCIrCi0gICAgIlwyXDM2N1wxXHUwMTFiXDFcMzY3XDFcMFw1XDM2N1wyXDBcMjJcMzY3XDFcdTAxMWIiKwotICAgICJcMlwzNjdcMVx1MDExYlwyXDM2N1wxXHUwMTFiXDEwXDM2N1wxXHUwMTFiXDNcMzY3XDFcdTAxMWIiKwotICAgICJcNVwzNjdcMVwwXDFcdTAxMWNcMVwxNzFcMVwxNzJcMVwxNzFcMVwwXDFcMTcxIisKLSAgICAiXDFcdTAxMWNcMVwwXDFcMTcxXDFcMFwxXDE3MVwzXDBcMlwxNzFcMlwwIisKLSAgICAiXDNcMTcxXDFcMzA0XDFcMTcxXDEzXDBcMVx1MDExY1wyXDE3MVwxXHUwMTFjXDJcMTcxIisKLSAgICAiXDFcdTAxMWNcMlwxNzFcMVwwXDRcMTcxXDFcMFwxXHUwMTFjXDJcMTcxXDFcMCIrCi0gICAgIlwxXHUwMTFjXDJcMTcxXDRcMFwxXHUwMTFkXDFcMTczXDFcMTc0XDFcMTczXDFcMTc1IisKLSAgICAiXDFcMTczXDFcdTAxMWRcMzNcMTczXDFcdTAxMWRcMlwxNzNcMVx1MDExZFwyXDE3M1wxXHUwMTFkIisKLSAgICAiXDEwXDE3M1wxXHUwMTFkXDNcMTczXDFcdTAxMWRcNVwxNzNcMVwwXDFcdTAxMWVcMVwxNzYiKwotICAgICJcMVwxNzdcM1wxNzZcMVx1MDExZVwxXDE3NVwzMlwxNzZcMVx1MDExZVwyXDE3NlwxXHUwMTFlIisKLSAgICAiXDJcMTc2XDFcdTAxMWVcMTBcMTc2XDFcdTAxMWVcM1wxNzZcMVx1MDExZVw1XDE3NlwxXDAiKwotICAgICJcMVx1MDExZlwxXDIwMVwxXDIwMlwxXDIwMVwxXDIwM1wxXDIwMVwxXHUwMTFmXDMzXDIwMSIrCi0gICAgIlwxXHUwMTFmXDJcMjAxXDFcdTAxMWZcMlwyMDFcMVx1MDExZlwxMFwyMDFcMVx1MDExZlwzXDIwMSIrCi0gICAgIlwxXHUwMTFmXDVcMjAxXDFcMFwxXHUwMTIwXDFcMjA0XDFcMjA1XDNcMjA0XDFcdTAxMjAiKwotICAgICJcMVwyMDNcMzJcMjA0XDFcdTAxMjBcMlwyMDRcMVx1MDEyMFwyXDIwNFwxXHUwMTIwXDEwXDIwNCIrCi0gICAgIlwxXHUwMTIwXDNcMjA0XDFcdTAxMjBcNVwyMDRcMVwwXDJcdTAxMjFcMVx1MDEyMlwxXDM3NiIrCi0gICAgIlwxXHUwMTIzXDFcMzc2XDFcdTAxMjFcMVx1MDEyNFwxXDM3NlwxXHUwMTI1XDRcdTAxMjFcMlwzNzYiKwotICAgICJcNVx1MDEyMVwxXDBcNDVcdTAxMjFcMVwwXDFcdTAxMjZcMVw2MFwxXDIwN1wxXDYwIisKLSAgICAiXDFcMFwxXDYwXDFcdTAxMjZcMVwwXDFcNjBcMVwwXDFcNjBcM1wwIisKLSAgICAiXDJcNjBcMlwwXDNcNjBcMVwwXDFcNjBcMTNcMFwxXHUwMTI2XDJcNjAiKwotICAgICJcMVx1MDEyNlwyXDYwXDFcdTAxMjZcMlw2MFwxXDBcNFw2MFwxXDBcMVx1MDEyNiIrCi0gICAgIlwyXDYwXDFcMFwxXHUwMTI2XDJcNjBcNFwwXDFcdTAxMjdcMVw2NFwxXDIxMiIrCi0gICAgIlwxXDY0XDFcMFwxXDY0XDFcdTAxMjdcMVwwXDFcNjRcMVwwXDFcNjQiKwotICAgICJcM1wwXDJcNjRcMlwwXDNcNjRcMVwwXDFcNjRcMTNcMFwxXHUwMTI3IisKLSAgICAiXDJcNjRcMVx1MDEyN1wyXDY0XDFcdTAxMjdcMlw2NFwxXDBcNFw2NFwxXDAiKwotICAgICJcMVx1MDEyN1wyXDY0XDFcMFwxXHUwMTI3XDJcNjRcNFwwXDFcdTAxMjhcMVw3MSIrCi0gICAgIlwxXDIxNVwxXDcxXDFcMFwxXDcxXDFcdTAxMjhcMVwwXDFcNzFcMVwwIisKLSAgICAiXDFcNzFcM1wwXDJcNzFcMlwwXDNcNzFcMVwwXDFcNzFcMTNcMCIrCi0gICAgIlwxXHUwMTI4XDJcNzFcMVx1MDEyOFwyXDcxXDFcdTAxMjhcMlw3MVwxXDBcNFw3MSIrCi0gICAgIlwxXDBcMVx1MDEyOFwyXDcxXDFcMFwxXHUwMTI4XDJcNzFcNFwwXDFcdTAxMjkiKwotICAgICJcMVwxMDFcMVwyMjFcMVwxMDFcMVwwXDFcMTAxXDFcdTAxMjlcMVwwXDFcMTAxIisKLSAgICAiXDFcMFwxXDEwMVwzXDBcMlwxMDFcMlwwXDNcMTAxXDFcMFwxXDEwMSIrCi0gICAgIlwxM1wwXDFcdTAxMjlcMlwxMDFcMVx1MDEyOVwyXDEwMVwxXHUwMTI5XDJcMTAxXDFcMCIrCi0gICAgIlw0XDEwMVwxXDBcMVx1MDEyOVwyXDEwMVwxXDBcMVx1MDEyOVwyXDEwMVw0XDAiKwotICAgICJcMVx1MDEyYVwxXDEwN1wxXDIyNFwxXDEwN1wxXDBcMVwxMDdcMVx1MDEyYVwxXDAiKwotICAgICJcMVwxMDdcMVwwXDFcMTA3XDNcMFwyXDEwN1wyXDBcM1wxMDdcMVwwIisKLSAgICAiXDFcMTA3XDEzXDBcMVx1MDEyYVwyXDEwN1wxXHUwMTJhXDJcMTA3XDFcdTAxMmFcMlwxMDciKwotICAgICJcMVwwXDRcMTA3XDFcMFwxXHUwMTJhXDJcMTA3XDFcMFwxXHUwMTJhXDJcMTA3IisKLSAgICAiXDRcMFwxXHUwMTJiXDFcMjI2XDFcMjI3XDFcMjI2XDFcMjMwXDFcMjI2XDFcdTAxMmIiKwotICAgICJcMzNcMjI2XDFcdTAxMmJcMlwyMjZcMVx1MDEyYlwyXDIyNlwxXHUwMTJiXDEwXDIyNlwxXHUwMTJiIisKLSAgICAiXDNcMjI2XDFcdTAxMmJcNVwyMjZcMVwwXDFcdTAxMmNcMVwyMzFcMVwyMzJcM1wyMzEiKwotICAgICJcMVx1MDEyY1wxXDIzMFwzMlwyMzFcMVx1MDEyY1wyXDIzMVwxXHUwMTJjXDJcMjMxXDFcdTAxMmMiKwotICAgICJcMTBcMjMxXDFcdTAxMmNcM1wyMzFcMVx1MDEyY1w1XDIzMVwxXDBcMVx1MDEyZFwxXDExNCIrCi0gICAgIlwxXDIzNFwxXDExNFwxXDBcMVwxMTRcMVx1MDEyZFwxXDBcMVwxMTRcMVwwIisKLSAgICAiXDFcMTE0XDNcMFwyXDExNFwyXDBcM1wxMTRcMVwwXDFcMTE0XDEzXDAiKwotICAgICJcMVx1MDEyZFwyXDExNFwxXHUwMTJkXDJcMTE0XDFcdTAxMmRcMlwxMTRcMVwwXDRcMTE0IisKLSAgICAiXDFcMFwxXHUwMTJkXDJcMTE0XDFcMFwxXHUwMTJkXDJcMTE0XDRcMFwxXHUwMTJlIisKLSAgICAiXDFcMjM3XDFcMjQwXDFcMjM3XDFcMFwxXDIzN1wxXHUwMTJlXDFcMFwxXDIzNyIrCi0gICAgIlwxXDBcMVwyMzdcM1wwXDJcMjM3XDJcMFwzXDIzN1wxXDBcMVwyMzciKwotICAgICJcMTNcMFwxXHUwMTJlXDJcMjM3XDFcdTAxMmVcMlwyMzdcMVx1MDEyZVwyXDIzN1wxXDAiKwotICAgICJcNFwyMzdcMVwwXDFcdTAxMmVcMlwyMzdcMVwwXDFcdTAxMmVcMlwyMzdcNFwwIisKLSAgICAiXDFcdTAxMmZcMVwxMjJcMVwyNDNcMVwxMjJcMVwwXDFcMTIyXDFcdTAxMmZcMVwwIisKLSAgICAiXDFcMTIyXDFcMFwxXDEyMlwzXDBcMlwxMjJcMlwwXDNcMTIyXDFcMjQ0IisKLSAgICAiXDFcMTIyXDEzXDBcMVx1MDEyZlwyXDEyMlwxXHUwMTJmXDJcMTIyXDFcdTAxMmZcMlwxMjIiKwotICAgICJcMVwwXDRcMTIyXDFcMFwxXHUwMTJmXDJcMTIyXDFcMFwxXHUwMTJmXDJcMTIyIisKLSAgICAiXDRcMFwxXHUwMTMwXDFcMjQ2XDFcMjQ3XDFcMjQ2XDFcMjUwXDFcMjQ2XDFcdTAxMzAiKwotICAgICJcMzNcMjQ2XDFcdTAxMzBcMlwyNDZcMVx1MDEzMFwyXDI0NlwxXHUwMTMwXDEwXDI0NlwxXHUwMTMwIisKLSAgICAiXDNcMjQ2XDFcdTAxMzBcNVwyNDZcMVwwXDFcdTAxMzFcMVwyNTFcMVwyNTJcM1wyNTEiKwotICAgICJcMVx1MDEzMVwxXDI1MFwzMlwyNTFcMVx1MDEzMVwyXDI1MVwxXHUwMTMxXDJcMjUxXDFcdTAxMzEiKwotICAgICJcMTBcMjUxXDFcdTAxMzFcM1wyNTFcMVx1MDEzMVw1XDI1MVwxXDBcMVx1MDEzMlwxXDI1NiIrCi0gICAgIlwxXDI1N1wxXDI1NlwxXDBcMVwyNTZcMVx1MDEzMlwxXDBcMVwyNTZcMVwwIisKLSAgICAiXDFcMjU2XDNcMFwyXDI1NlwyXDBcM1wyNTZcMVwwXDFcMjU2XDEzXDAiKwotICAgICJcMVx1MDEzMlwyXDI1NlwxXHUwMTMyXDJcMjU2XDFcdTAxMzJcMlwyNTZcMVwwXDRcMjU2IisKLSAgICAiXDFcMFwxXHUwMTMyXDJcMjU2XDFcMFwxXHUwMTMyXDJcMjU2XDRcMFwxXHUwMTMzIisKLSAgICAiXDVcMFwxXHUwMTMzXDNcMFwxXHUwMTBkXDVcMFwxXHUwMTMzXDVcMFwxXHUwMTMzIisKLSAgICAiXDEzXDBcMlx1MDEzM1wxXDBcMlx1MDEzM1wxXDBcMlx1MDEzM1w3XDBcMlx1MDEzMyIrCi0gICAgIlwyXDBcMlx1MDEzM1w1XDBcMVx1MDEzNFw1XDBcMVx1MDEzNFwxMVwwXDFcdTAxMzQiKwotICAgICJcNVwwXDFcdTAxMzRcMTNcMFwyXHUwMTM0XDFcMFwyXHUwMTM0XDFcMFwyXHUwMTM0IisKLSAgICAiXDdcMFwyXHUwMTM0XDJcMFwyXHUwMTM0XDVcMFwyXHUwMTM1XDFcdTAxMzZcMVx1MDEzNyIrCi0gICAgIlwxXHUwMTM4XDFcdTAxMzdcMVx1MDEzNVwxXHUwMTM5XDFcdTAxMzdcMVx1MDEzYVw0XHUwMTM1XDJcdTAxMzciKwotICAgICJcNVx1MDEzNVwxXDBcNDVcdTAxMzVcNjBcMFwxXHUwMTNiXDE0XDBcMVx1MDEzY1wxXDMyIisKLSAgICAiXDFcMTQ3XDFcMzJcMVwwXDFcMzJcMVx1MDEzY1wxXDBcMVwzMlwxXDAiKwotICAgICJcMVwzMlwzXDBcMlwzMlwyXDBcM1wzMlwxXDBcMVwzMlwxM1wwIisKLSAgICAiXDFcdTAxM2NcMlwzMlwxXHUwMTNjXDJcMzJcMVx1MDEzY1wyXDMyXDFcMFw0XDMyIisKLSAgICAiXDFcMFwxXHUwMTNjXDJcMzJcMVwwXDFcdTAxM2NcMlwzMlw0XDBcMVx1MDEzZCIrCi0gICAgIlwxXDE1MlwxXDE1M1wxXDE1MlwxXDBcMVwxNTJcMVx1MDEzZFwxXDBcMVwxNTIiKwotICAgICJcMVwwXDFcMTUyXDNcMFwyXDE1MlwyXDBcM1wxNTJcMVwwXDFcMTUyIisKLSAgICAiXDEzXDBcMVx1MDEzZFwyXDE1MlwxXHUwMTNkXDJcMTUyXDFcdTAxM2RcMlwxNTJcMVwwIisKLSAgICAiXDRcMTUyXDFcMFwxXHUwMTNkXDJcMTUyXDFcMFwxXHUwMTNkXDJcMTUyXDRcMCIrCi0gICAgIlwxXHUwMTNlXDFcMTU0XDFcMTU1XDFcMTU0XDFcMFwxXDE1NFwxXHUwMTNlXDFcMCIrCi0gICAgIlwxXDE1NFwxXDBcMVwxNTRcM1wwXDJcMTU0XDJcMFwzXDE1NFwxXDAiKwotICAgICJcMVwxNTRcMTNcMFwxXHUwMTNlXDJcMTU0XDFcdTAxM2VcMlwxNTRcMVx1MDEzZVwyXDE1NCIrCi0gICAgIlwxXDBcNFwxNTRcMVwwXDFcdTAxM2VcMlwxNTRcMVwwXDFcdTAxM2VcMlwxNTQiKwotICAgICJcNTNcMFwxXHUwMTNmXDQ3XDBcMVx1MDE0MFwxMTVcMFwyXHUwMTQxXDM3XDBcMVx1MDE0MiIrCi0gICAgIlw2NFwwXDFcdTAxMTlcMVwwXDFcdTAxMTlcMlwwXDFcdTAxMTlcMVx1MDExYVw0XDAiKwotICAgICJcMlx1MDExOVw1NFwwXDFcdTAxNDNcMVwzNjdcMVwzNzBcMVwzNjdcMVwwXDFcMzY3IisKLSAgICAiXDFcdTAxNDNcMVwwXDFcMzY3XDFcdTAxMWFcMVwzNjdcM1wwXDJcMzY3XDJcMCIrCi0gICAgIlwzXDM2N1wxXDBcMVwzNjdcMTNcMFwxXHUwMTQzXDJcMzY3XDFcdTAxNDNcMlwzNjciKwotICAgICJcMVx1MDE0M1wyXDM2N1wxXDBcNFwzNjdcMVwwXDFcdTAxNDNcMlwzNjdcMVwwIisKLSAgICAiXDFcdTAxNDNcMlwzNjdcNFwwXDFcdTAxNDRcMVwxNzFcMVwxNzJcMVwxNzFcMVwwIisKLSAgICAiXDFcMTcxXDFcdTAxNDRcMVwwXDFcMTcxXDFcMFwxXDE3MVwzXDBcMlwxNzEiKwotICAgICJcMlwwXDNcMTcxXDFcMzA0XDFcMTcxXDEzXDBcMVx1MDE0NFwyXDE3MVwxXHUwMTQ0IisKLSAgICAiXDJcMTcxXDFcdTAxNDRcMlwxNzFcMVwwXDRcMTcxXDFcMFwxXHUwMTQ0XDJcMTcxIisKLSAgICAiXDFcMFwxXHUwMTQ0XDJcMTcxXDRcMFwxXHUwMTQ1XDFcMTczXDFcMTc0XDFcMTczIisKLSAgICAiXDFcMTc1XDFcMTczXDFcdTAxNDVcMzNcMTczXDFcdTAxNDVcMlwxNzNcMVx1MDE0NVwyXDE3MyIrCi0gICAgIlwxXHUwMTQ1XDEwXDE3M1wxXHUwMTQ1XDNcMTczXDFcdTAxNDVcNVwxNzNcMVwwXDFcdTAxNDYiKwotICAgICJcMVwxNzZcMVwxNzdcM1wxNzZcMVx1MDE0NlwxXDE3NVwzMlwxNzZcMVx1MDE0NlwyXDE3NiIrCi0gICAgIlwxXHUwMTQ2XDJcMTc2XDFcdTAxNDZcMTBcMTc2XDFcdTAxNDZcM1wxNzZcMVx1MDE0Nlw1XDE3NiIrCi0gICAgIlwxXDBcMVx1MDE0N1wxXDIwMVwxXDIwMlwxXDIwMVwxXDIwM1wxXDIwMVwxXHUwMTQ3IisKLSAgICAiXDMzXDIwMVwxXHUwMTQ3XDJcMjAxXDFcdTAxNDdcMlwyMDFcMVx1MDE0N1wxMFwyMDFcMVx1MDE0NyIrCi0gICAgIlwzXDIwMVwxXHUwMTQ3XDVcMjAxXDFcMFwxXHUwMTQ4XDFcMjA0XDFcMjA1XDNcMjA0IisKLSAgICAiXDFcdTAxNDhcMVwyMDNcMzJcMjA0XDFcdTAxNDhcMlwyMDRcMVx1MDE0OFwyXDIwNFwxXHUwMTQ4IisKLSAgICAiXDEwXDIwNFwxXHUwMTQ4XDNcMjA0XDFcdTAxNDhcNVwyMDRcMVwwXDJcdTAxMjFcMVx1MDEyMiIrCi0gICAgIlwxXHUwMTQ5XDFcMFwyXHUwMTIxXDFcMFwxXHUwMTQ5XDFcdTAxMjVcNFx1MDEyMVwyXHUwMTQ5IisKLSAgICAiXDVcdTAxMjFcMVwwXDQ1XHUwMTIxXDFcMFwxXHUwMTRhXDFcdTAxMjFcMVx1MDEyMlwxXHUwMTQ5IisKLSAgICAiXDJcdTAxMjFcMVx1MDE0YVwxXHUwMTIxXDFcdTAxNDlcMVx1MDE0Ylw0XHUwMTIxXDJcdTAxNDlcMjJcdTAxMjEiKwotICAgICJcMVx1MDE0YVwyXHUwMTIxXDFcdTAxNGFcMlx1MDEyMVwxXHUwMTRhXDEwXHUwMTIxXDFcdTAxNGFcM1x1MDEyMSIrCi0gICAgIlwxXHUwMTRhXDVcdTAxMjFcMVwwXDJcdTAxMjNcMVx1MDE0Y1wxXDBcMVx1MDE0OVwxMVx1MDEyMyIrCi0gICAgIlwyXDBcNTNcdTAxMjNcMVwwXDJcdTAxMjRcMVx1MDE0ZFwxXDBcM1x1MDEyNFwxXHUwMTQ5IisKLSAgICAiXDZcdTAxMjRcMlwwXDUzXHUwMTI0XDFcMFwxXHUwMTRlXDFcNjBcMVwyMDdcMVw2MCIrCi0gICAgIlwxXDBcMVw2MFwxXHUwMTRlXDFcMFwxXDYwXDFcMFwxXDYwXDNcMCIrCi0gICAgIlwyXDYwXDJcMFwzXDYwXDFcMFwxXDYwXDEzXDBcMVx1MDE0ZVwyXDYwIisKLSAgICAiXDFcdTAxNGVcMlw2MFwxXHUwMTRlXDJcNjBcMVwwXDRcNjBcMVwwXDFcdTAxNGUiKwotICAgICJcMlw2MFwxXDBcMVx1MDE0ZVwyXDYwXDRcMFwxXHUwMTRmXDFcNjRcMVwyMTIiKwotICAgICJcMVw2NFwxXDBcMVw2NFwxXHUwMTRmXDFcMFwxXDY0XDFcMFwxXDY0IisKLSAgICAiXDNcMFwyXDY0XDJcMFwzXDY0XDFcMFwxXDY0XDEzXDBcMVx1MDE0ZiIrCi0gICAgIlwyXDY0XDFcdTAxNGZcMlw2NFwxXHUwMTRmXDJcNjRcMVwwXDRcNjRcMVwwIisKLSAgICAiXDFcdTAxNGZcMlw2NFwxXDBcMVx1MDE0ZlwyXDY0XDRcMFwxXHUwMTUwXDFcNzEiKwotICAgICJcMVwyMTVcMVw3MVwxXDBcMVw3MVwxXHUwMTUwXDFcMFwxXDcxXDFcMCIrCi0gICAgIlwxXDcxXDNcMFwyXDcxXDJcMFwzXDcxXDFcMFwxXDcxXDEzXDAiKwotICAgICJcMVx1MDE1MFwyXDcxXDFcdTAxNTBcMlw3MVwxXHUwMTUwXDJcNzFcMVwwXDRcNzEiKwotICAgICJcMVwwXDFcdTAxNTBcMlw3MVwxXDBcMVx1MDE1MFwyXDcxXDRcMFwxXHUwMTUxIisKLSAgICAiXDFcMTAxXDFcMjIxXDFcMTAxXDFcMFwxXDEwMVwxXHUwMTUxXDFcMFwxXDEwMSIrCi0gICAgIlwxXDBcMVwxMDFcM1wwXDJcMTAxXDJcMFwzXDEwMVwxXDBcMVwxMDEiKwotICAgICJcMTNcMFwxXHUwMTUxXDJcMTAxXDFcdTAxNTFcMlwxMDFcMVx1MDE1MVwyXDEwMVwxXDAiKwotICAgICJcNFwxMDFcMVwwXDFcdTAxNTFcMlwxMDFcMVwwXDFcdTAxNTFcMlwxMDFcNFwwIisKLSAgICAiXDFcdTAxNTJcMVwxMDdcMVwyMjRcMVwxMDdcMVwwXDFcMTA3XDFcdTAxNTJcMVwwIisKLSAgICAiXDFcMTA3XDFcMFwxXDEwN1wzXDBcMlwxMDdcMlwwXDNcMTA3XDFcMCIrCi0gICAgIlwxXDEwN1wxM1wwXDFcdTAxNTJcMlwxMDdcMVx1MDE1MlwyXDEwN1wxXHUwMTUyXDJcMTA3IisKLSAgICAiXDFcMFw0XDEwN1wxXDBcMVx1MDE1MlwyXDEwN1wxXDBcMVx1MDE1MlwyXDEwNyIrCi0gICAgIlw0XDBcMVx1MDE1M1wxXDIyNlwxXDIyN1wxXDIyNlwxXDIzMFwxXDIyNlwxXHUwMTUzIisKLSAgICAiXDMzXDIyNlwxXHUwMTUzXDJcMjI2XDFcdTAxNTNcMlwyMjZcMVx1MDE1M1wxMFwyMjZcMVx1MDE1MyIrCi0gICAgIlwzXDIyNlwxXHUwMTUzXDVcMjI2XDFcMFwxXHUwMTU0XDFcMjMxXDFcMjMyXDNcMjMxIisKLSAgICAiXDFcdTAxNTRcMVwyMzBcMzJcMjMxXDFcdTAxNTRcMlwyMzFcMVx1MDE1NFwyXDIzMVwxXHUwMTU0IisKLSAgICAiXDEwXDIzMVwxXHUwMTU0XDNcMjMxXDFcdTAxNTRcNVwyMzFcMVwwXDFcdTAxNTVcMVwxMTQiKwotICAgICJcMVwyMzRcMVwxMTRcMVwwXDFcMTE0XDFcdTAxNTVcMVwwXDFcMTE0XDFcMCIrCi0gICAgIlwxXDExNFwzXDBcMlwxMTRcMlwwXDNcMTE0XDFcMFwxXDExNFwxM1wwIisKLSAgICAiXDFcdTAxNTVcMlwxMTRcMVx1MDE1NVwyXDExNFwxXHUwMTU1XDJcMTE0XDFcMFw0XDExNCIrCi0gICAgIlwxXDBcMVx1MDE1NVwyXDExNFwxXDBcMVx1MDE1NVwyXDExNFw0XDBcMVx1MDE1NiIrCi0gICAgIlwxXDIzN1wxXDI0MFwxXDIzN1wxXDBcMVwyMzdcMVx1MDE1NlwxXDBcMVwyMzciKwotICAgICJcMVwwXDFcMjM3XDNcMFwyXDIzN1wyXDBcM1wyMzdcMVwwXDFcMjM3IisKLSAgICAiXDEzXDBcMVx1MDE1NlwyXDIzN1wxXHUwMTU2XDJcMjM3XDFcdTAxNTZcMlwyMzdcMVwwIisKLSAgICAiXDRcMjM3XDFcMFwxXHUwMTU2XDJcMjM3XDFcMFwxXHUwMTU2XDJcMjM3XDRcMCIrCi0gICAgIlwxXHUwMTU3XDFcMTIyXDFcMjQzXDFcMTIyXDFcMFwxXDEyMlwxXHUwMTU3XDFcMCIrCi0gICAgIlwxXDEyMlwxXDBcMVwxMjJcM1wwXDJcMTIyXDJcMFwzXDEyMlwxXDI0NCIrCi0gICAgIlwxXDEyMlwxM1wwXDFcdTAxNTdcMlwxMjJcMVx1MDE1N1wyXDEyMlwxXHUwMTU3XDJcMTIyIisKLSAgICAiXDFcMFw0XDEyMlwxXDBcMVx1MDE1N1wyXDEyMlwxXDBcMVx1MDE1N1wyXDEyMiIrCi0gICAgIlw0XDBcMVx1MDE1OFwxXDI0NlwxXDI0N1wxXDI0NlwxXDI1MFwxXDI0NlwxXHUwMTU4IisKLSAgICAiXDMzXDI0NlwxXHUwMTU4XDJcMjQ2XDFcdTAxNThcMlwyNDZcMVx1MDE1OFwxMFwyNDZcMVx1MDE1OCIrCi0gICAgIlwzXDI0NlwxXHUwMTU4XDVcMjQ2XDFcMFwxXHUwMTU5XDFcMjUxXDFcMjUyXDNcMjUxIisKLSAgICAiXDFcdTAxNTlcMVwyNTBcMzJcMjUxXDFcdTAxNTlcMlwyNTFcMVx1MDE1OVwyXDI1MVwxXHUwMTU5IisKLSAgICAiXDEwXDI1MVwxXHUwMTU5XDNcMjUxXDFcdTAxNTlcNVwyNTFcMVwwXDFcdTAxNWFcMVwyNTYiKwotICAgICJcMVwyNTdcMVwyNTZcMVwwXDFcMjU2XDFcdTAxNWFcMVwwXDFcMjU2XDFcMCIrCi0gICAgIlwxXDI1NlwzXDBcMlwyNTZcMlwwXDNcMjU2XDFcMFwxXDI1NlwxM1wwIisKLSAgICAiXDFcdTAxNWFcMlwyNTZcMVx1MDE1YVwyXDI1NlwxXHUwMTVhXDJcMjU2XDFcMFw0XDI1NiIrCi0gICAgIlwxXDBcMVx1MDE1YVwyXDI1NlwxXDBcMVx1MDE1YVwyXDI1Nlw0XDBcMVx1MDE1YiIrCi0gICAgIlw1XDBcMVx1MDE1YlwzXDBcMVx1MDEwZFw1XDBcMVx1MDE1Ylw1XDBcMVx1MDE1YiIrCi0gICAgIlwxM1wwXDJcdTAxNWJcMVwwXDJcdTAxNWJcMVwwXDJcdTAxNWJcN1wwXDJcdTAxNWIiKwotICAgICJcMlwwXDJcdTAxNWJcNVwwXDFcdTAxNWNcNVwwXDFcdTAxNWNcMTFcMFwxXHUwMTVjIisKLSAgICAiXDVcMFwxXHUwMTVjXDEzXDBcMlx1MDE1Y1wxXDBcMlx1MDE1Y1wxXDBcMlx1MDE1YyIrCi0gICAgIlw3XDBcMlx1MDE1Y1wyXDBcMlx1MDE1Y1w1XDBcMlx1MDEzNVwxXHUwMTM2XDFcdTAxNWQiKwotICAgICJcMVwwXDJcdTAxMzVcMVwwXDFcdTAxNWRcMVx1MDEzYVw0XHUwMTM1XDJcdTAxNWRcNVx1MDEzNSIrCi0gICAgIlwxXDBcNDVcdTAxMzVcMVwwXDFcdTAxNWVcMVx1MDEzNVwxXHUwMTM2XDFcdTAxNWRcMlx1MDEzNSIrCi0gICAgIlwxXHUwMTVlXDFcdTAxMzVcMVx1MDE1ZFwxXHUwMTVmXDRcdTAxMzVcMlx1MDE1ZFwyMlx1MDEzNVwxXHUwMTVlIisKLSAgICAiXDJcdTAxMzVcMVx1MDE1ZVwyXHUwMTM1XDFcdTAxNWVcMTBcdTAxMzVcMVx1MDE1ZVwzXHUwMTM1XDFcdTAxNWUiKwotICAgICJcNVx1MDEzNVwxXDBcMlx1MDEzOFwxXHUwMTYwXDFcMFwxXHUwMTVkXDExXHUwMTM4XDJcMCIrCi0gICAgIlw1M1x1MDEzOFwxXDBcMlx1MDEzOVwxXHUwMTYxXDFcMFwzXHUwMTM5XDFcdTAxNWRcNlx1MDEzOSIrCi0gICAgIlwyXDBcNTNcdTAxMzlcMjRcMFwxXHUwMTYyXDUwXDBcMVx1MDE2M1wxXDMyXDFcMTQ3IisKLSAgICAiXDFcMzJcMVwwXDFcMzJcMVx1MDE2M1wxXDBcMVwzMlwxXDBcMVwzMiIrCi0gICAgIlwzXDBcMlwzMlwyXDBcM1wzMlwxXDBcMVwzMlwxM1wwXDFcdTAxNjMiKwotICAgICJcMlwzMlwxXHUwMTYzXDJcMzJcMVx1MDE2M1wyXDMyXDFcMFw0XDMyXDFcMCIrCi0gICAgIlwxXHUwMTYzXDJcMzJcMVwwXDFcdTAxNjNcMlwzMlw0XDBcMVx1MDE2NFwxXDE1MiIrCi0gICAgIlwxXDE1M1wxXDE1MlwxXDBcMVwxNTJcMVx1MDE2NFwxXDBcMVwxNTJcMVwwIisKLSAgICAiXDFcMTUyXDNcMFwyXDE1MlwyXDBcM1wxNTJcMVwwXDFcMTUyXDEzXDAiKwotICAgICJcMVx1MDE2NFwyXDE1MlwxXHUwMTY0XDJcMTUyXDFcdTAxNjRcMlwxNTJcMVwwXDRcMTUyIisKLSAgICAiXDFcMFwxXHUwMTY0XDJcMTUyXDFcMFwxXHUwMTY0XDJcMTUyXDRcMFwxXHUwMTY1IisKLSAgICAiXDFcMTU0XDFcMTU1XDFcMTU0XDFcMFwxXDE1NFwxXHUwMTY1XDFcMFwxXDE1NCIrCi0gICAgIlwxXDBcMVwxNTRcM1wwXDJcMTU0XDJcMFwzXDE1NFwxXDBcMVwxNTQiKwotICAgICJcMTNcMFwxXHUwMTY1XDJcMTU0XDFcdTAxNjVcMlwxNTRcMVx1MDE2NVwyXDE1NFwxXDAiKwotICAgICJcNFwxNTRcMVwwXDFcdTAxNjVcMlwxNTRcMVwwXDFcdTAxNjVcMlwxNTRcNTRcMCIrCi0gICAgIlwyXHUwMTY2XDc0XDBcMVx1MDE2N1wxMDZcMFwyXHUwMTY4XDVcMFwxXHUwMTY5XDFcMzY3IisKLSAgICAiXDFcMzcwXDFcMzY3XDFcMFwxXDM2N1wxXHUwMTY5XDFcMFwxXDM2N1wxXHUwMTFhIisKLSAgICAiXDFcMzY3XDNcMFwyXDM2N1wyXDBcM1wzNjdcMVwwXDFcMzY3XDEzXDAiKwotICAgICJcMVx1MDE2OVwyXDM2N1wxXHUwMTY5XDJcMzY3XDFcdTAxNjlcMlwzNjdcMVwwXDRcMzY3IisKLSAgICAiXDFcMFwxXHUwMTY5XDJcMzY3XDFcMFwxXHUwMTY5XDJcMzY3XDRcMFwxXHUwMTZhIisKLSAgICAiXDFcMTcxXDFcMTcyXDFcMTcxXDFcMFwxXDE3MVwxXHUwMTZhXDFcMFwxXDE3MSIrCi0gICAgIlwxXDBcMVwxNzFcM1wwXDJcMTcxXDJcMFwzXDE3MVwxXDMwNFwxXDE3MSIrCi0gICAgIlwxM1wwXDFcdTAxNmFcMlwxNzFcMVx1MDE2YVwyXDE3MVwxXHUwMTZhXDJcMTcxXDFcMCIrCi0gICAgIlw0XDE3MVwxXDBcMVx1MDE2YVwyXDE3MVwxXDBcMVx1MDE2YVwyXDE3MVw0XDAiKwotICAgICJcMVx1MDE2YlwxXDE3M1wxXDE3NFwxXDE3M1wxXDE3NVwxXDE3M1wxXHUwMTZiXDMzXDE3MyIrCi0gICAgIlwxXHUwMTZiXDJcMTczXDFcdTAxNmJcMlwxNzNcMVx1MDE2YlwxMFwxNzNcMVx1MDE2YlwzXDE3MyIrCi0gICAgIlwxXHUwMTZiXDVcMTczXDFcMFwxXHUwMTZjXDFcMTc2XDFcMTc3XDNcMTc2XDFcdTAxNmMiKwotICAgICJcMVwxNzVcMzJcMTc2XDFcdTAxNmNcMlwxNzZcMVx1MDE2Y1wyXDE3NlwxXHUwMTZjXDEwXDE3NiIrCi0gICAgIlwxXHUwMTZjXDNcMTc2XDFcdTAxNmNcNVwxNzZcMVwwXDFcdTAxNmRcMVwyMDFcMVwyMDIiKwotICAgICJcMVwyMDFcMVwyMDNcMVwyMDFcMVx1MDE2ZFwzM1wyMDFcMVx1MDE2ZFwyXDIwMVwxXHUwMTZkIisKLSAgICAiXDJcMjAxXDFcdTAxNmRcMTBcMjAxXDFcdTAxNmRcM1wyMDFcMVx1MDE2ZFw1XDIwMVwxXDAiKwotICAgICJcMVx1MDE2ZVwxXDIwNFwxXDIwNVwzXDIwNFwxXHUwMTZlXDFcMjAzXDMyXDIwNFwxXHUwMTZlIisKLSAgICAiXDJcMjA0XDFcdTAxNmVcMlwyMDRcMVx1MDE2ZVwxMFwyMDRcMVx1MDE2ZVwzXDIwNFwxXHUwMTZlIisKLSAgICAiXDVcMjA0XDRcMFwxXHUwMTQ5XDFcMFwxXHUwMTQ5XDJcMFwxXHUwMTQ5XDFcdTAxMjUiKwotICAgICJcNFwwXDJcdTAxNDlcNTRcMFwxXHUwMTZmXDFcdTAxMjFcMVx1MDEyMlwxXHUwMTIxXDFcMCIrCi0gICAgIlwxXHUwMTIxXDFcdTAxNmZcMVwwXDFcdTAxMjFcMVx1MDEyNVwxM1x1MDEyMVwxXDBcMTRcdTAxMjEiKwotICAgICJcMVx1MDE2ZlwyXHUwMTIxXDFcdTAxNmZcMlx1MDEyMVwxXHUwMTZmXDEwXHUwMTIxXDFcdTAxNmZcM1x1MDEyMSIrCi0gICAgIlwxXHUwMTZmXDVcdTAxMjFcMVwwXDFcdTAxNzBcMVx1MDEyM1wxXHUwMTRjXDFcdTAxMjNcMVx1MDE3MSIrCi0gICAgIlwxXHUwMTIzXDFcdTAxNzBcMTBcdTAxMjNcMVx1MDE3MlwyMlx1MDEyM1wxXHUwMTcwXDJcdTAxMjNcMVx1MDE3MCIrCi0gICAgIlwyXHUwMTIzXDFcdTAxNzBcMTBcdTAxMjNcMVx1MDE3MFwzXHUwMTIzXDFcdTAxNzBcNVx1MDEyM1wxXDAiKwotICAgICJcMVx1MDE3M1wxXHUwMTI0XDFcdTAxNGRcM1x1MDEyNFwxXHUwMTczXDFcdTAxNzRcN1x1MDEyNFwxXHUwMTc1IisKLSAgICAiXDIyXHUwMTI0XDFcdTAxNzNcMlx1MDEyNFwxXHUwMTczXDJcdTAxMjRcMVx1MDE3M1wxMFx1MDEyNFwxXHUwMTczIisKLSAgICAiXDNcdTAxMjRcMVx1MDE3M1w1XHUwMTI0XDFcMFwxXHUwMTc2XDFcNjBcMVwyMDdcMVw2MCIrCi0gICAgIlwxXDBcMVw2MFwxXHUwMTc2XDFcMFwxXDYwXDFcMFwxXDYwXDNcMCIrCi0gICAgIlwyXDYwXDJcMFwzXDYwXDFcMFwxXDYwXDEzXDBcMVx1MDE3NlwyXDYwIisKLSAgICAiXDFcdTAxNzZcMlw2MFwxXHUwMTc2XDJcNjBcMVwwXDRcNjBcMVwwXDFcdTAxNzYiKwotICAgICJcMlw2MFwxXDBcMVx1MDE3NlwyXDYwXDRcMFwxXHUwMTc3XDFcNjRcMVwyMTIiKwotICAgICJcMVw2NFwxXDBcMVw2NFwxXHUwMTc3XDFcMFwxXDY0XDFcMFwxXDY0IisKLSAgICAiXDNcMFwyXDY0XDJcMFwzXDY0XDFcMFwxXDY0XDEzXDBcMVx1MDE3NyIrCi0gICAgIlwyXDY0XDFcdTAxNzdcMlw2NFwxXHUwMTc3XDJcNjRcMVwwXDRcNjRcMVwwIisKLSAgICAiXDFcdTAxNzdcMlw2NFwxXDBcMVx1MDE3N1wyXDY0XDRcMFwxXHUwMTc4XDFcNzEiKwotICAgICJcMVwyMTVcMVw3MVwxXDBcMVw3MVwxXHUwMTc4XDFcMFwxXDcxXDFcMCIrCi0gICAgIlwxXDcxXDNcMFwyXDcxXDJcMFwzXDcxXDFcMFwxXDcxXDEzXDAiKwotICAgICJcMVx1MDE3OFwyXDcxXDFcdTAxNzhcMlw3MVwxXHUwMTc4XDJcNzFcMVwwXDRcNzEiKwotICAgICJcMVwwXDFcdTAxNzhcMlw3MVwxXDBcMVx1MDE3OFwyXDcxXDRcMFwxXHUwMTc5IisKLSAgICAiXDFcMTAxXDFcMjIxXDFcMTAxXDFcMFwxXDEwMVwxXHUwMTc5XDFcMFwxXDEwMSIrCi0gICAgIlwxXDBcMVwxMDFcM1wwXDJcMTAxXDJcMFwzXDEwMVwxXDBcMVwxMDEiKwotICAgICJcMTNcMFwxXHUwMTc5XDJcMTAxXDFcdTAxNzlcMlwxMDFcMVx1MDE3OVwyXDEwMVwxXDAiKwotICAgICJcNFwxMDFcMVwwXDFcdTAxNzlcMlwxMDFcMVwwXDFcdTAxNzlcMlwxMDFcNFwwIisKLSAgICAiXDFcdTAxN2FcMVwxMDdcMVwyMjRcMVwxMDdcMVwwXDFcMTA3XDFcdTAxN2FcMVwwIisKLSAgICAiXDFcMTA3XDFcMFwxXDEwN1wzXDBcMlwxMDdcMlwwXDNcMTA3XDFcMCIrCi0gICAgIlwxXDEwN1wxM1wwXDFcdTAxN2FcMlwxMDdcMVx1MDE3YVwyXDEwN1wxXHUwMTdhXDJcMTA3IisKLSAgICAiXDFcMFw0XDEwN1wxXDBcMVx1MDE3YVwyXDEwN1wxXDBcMVx1MDE3YVwyXDEwNyIrCi0gICAgIlw0XDBcMVx1MDE3YlwxXDIyNlwxXDIyN1wxXDIyNlwxXDIzMFwxXDIyNlwxXHUwMTdiIisKLSAgICAiXDMzXDIyNlwxXHUwMTdiXDJcMjI2XDFcdTAxN2JcMlwyMjZcMVx1MDE3YlwxMFwyMjZcMVx1MDE3YiIrCi0gICAgIlwzXDIyNlwxXHUwMTdiXDVcMjI2XDFcMFwxXHUwMTdjXDFcMjMxXDFcMjMyXDNcMjMxIisKLSAgICAiXDFcdTAxN2NcMVwyMzBcMzJcMjMxXDFcdTAxN2NcMlwyMzFcMVx1MDE3Y1wyXDIzMVwxXHUwMTdjIisKLSAgICAiXDEwXDIzMVwxXHUwMTdjXDNcMjMxXDFcdTAxN2NcNVwyMzFcMVwwXDFcdTAxN2RcMVwxMTQiKwotICAgICJcMVwyMzRcMVwxMTRcMVwwXDFcMTE0XDFcdTAxN2RcMVwwXDFcMTE0XDFcMCIrCi0gICAgIlwxXDExNFwzXDBcMlwxMTRcMlwwXDNcMTE0XDFcMFwxXDExNFwxM1wwIisKLSAgICAiXDFcdTAxN2RcMlwxMTRcMVx1MDE3ZFwyXDExNFwxXHUwMTdkXDJcMTE0XDFcMFw0XDExNCIrCi0gICAgIlwxXDBcMVx1MDE3ZFwyXDExNFwxXDBcMVx1MDE3ZFwyXDExNFw0XDBcMVx1MDE3ZSIrCi0gICAgIlwxXDIzN1wxXDI0MFwxXDIzN1wxXDBcMVwyMzdcMVx1MDE3ZVwxXDBcMVwyMzciKwotICAgICJcMVwwXDFcMjM3XDNcMFwyXDIzN1wyXDBcM1wyMzdcMVwwXDFcMjM3IisKLSAgICAiXDEzXDBcMVx1MDE3ZVwyXDIzN1wxXHUwMTdlXDJcMjM3XDFcdTAxN2VcMlwyMzdcMVwwIisKLSAgICAiXDRcMjM3XDFcMFwxXHUwMTdlXDJcMjM3XDFcMFwxXHUwMTdlXDJcMjM3XDRcMCIrCi0gICAgIlwxXHUwMTdmXDFcMTIyXDFcMjQzXDFcMTIyXDFcMFwxXDEyMlwxXHUwMTdmXDFcMCIrCi0gICAgIlwxXDEyMlwxXDBcMVwxMjJcM1wwXDJcMTIyXDJcMFwzXDEyMlwxXDI0NCIrCi0gICAgIlwxXDEyMlwxM1wwXDFcdTAxN2ZcMlwxMjJcMVx1MDE3ZlwyXDEyMlwxXHUwMTdmXDJcMTIyIisKLSAgICAiXDFcMFw0XDEyMlwxXDBcMVx1MDE3ZlwyXDEyMlwxXDBcMVx1MDE3ZlwyXDEyMiIrCi0gICAgIlw0XDBcMVx1MDE4MFwxXDI0NlwxXDI0N1wxXDI0NlwxXDI1MFwxXDI0NlwxXHUwMTgwIisKLSAgICAiXDMzXDI0NlwxXHUwMTgwXDJcMjQ2XDFcdTAxODBcMlwyNDZcMVx1MDE4MFwxMFwyNDZcMVx1MDE4MCIrCi0gICAgIlwzXDI0NlwxXHUwMTgwXDVcMjQ2XDFcMFwxXHUwMTgxXDFcMjUxXDFcMjUyXDNcMjUxIisKLSAgICAiXDFcdTAxODFcMVwyNTBcMzJcMjUxXDFcdTAxODFcMlwyNTFcMVx1MDE4MVwyXDI1MVwxXHUwMTgxIisKLSAgICAiXDEwXDI1MVwxXHUwMTgxXDNcMjUxXDFcdTAxODFcNVwyNTFcMVwwXDFcdTAxODJcMVwyNTYiKwotICAgICJcMVwyNTdcMVwyNTZcMVwwXDFcMjU2XDFcdTAxODJcMVwwXDFcMjU2XDFcMCIrCi0gICAgIlwxXDI1NlwzXDBcMlwyNTZcMlwwXDNcMjU2XDFcMFwxXDI1NlwxM1wwIisKLSAgICAiXDFcdTAxODJcMlwyNTZcMVx1MDE4MlwyXDI1NlwxXHUwMTgyXDJcMjU2XDFcMFw0XDI1NiIrCi0gICAgIlwxXDBcMVx1MDE4MlwyXDI1NlwxXDBcMVx1MDE4MlwyXDI1Nlw0XDBcMVx1MDE4MyIrCi0gICAgIlw1XDBcMVx1MDE4M1wzXDBcMVx1MDEwZFw1XDBcMVx1MDE4M1w1XDBcMVx1MDE4MyIrCi0gICAgIlwxM1wwXDJcdTAxODNcMVwwXDJcdTAxODNcMVwwXDJcdTAxODNcN1wwXDJcdTAxODMiKwotICAgICJcMlwwXDJcdTAxODNcNVwwXDFcdTAxODRcNVwwXDFcdTAxODRcMTFcMFwxXHUwMTg0IisKLSAgICAiXDVcMFwxXHUwMTg0XDEzXDBcMlx1MDE4NFwxXDBcMlx1MDE4NFwxXDBcMlx1MDE4NCIrCi0gICAgIlw3XDBcMlx1MDE4NFwyXDBcMlx1MDE4NFwxMFwwXDFcdTAxNWRcMVwwXDFcdTAxNWQiKwotICAgICJcMlwwXDFcdTAxNWRcMVx1MDEzYVw0XDBcMlx1MDE1ZFw1NFwwXDFcdTAxODVcMVx1MDEzNSIrCi0gICAgIlwxXHUwMTM2XDFcdTAxMzVcMVwwXDFcdTAxMzVcMVx1MDE4NVwxXDBcMVx1MDEzNVwxXHUwMTNhIisKLSAgICAiXDEzXHUwMTM1XDFcMFwxNFx1MDEzNVwxXHUwMTg1XDJcdTAxMzVcMVx1MDE4NVwyXHUwMTM1XDFcdTAxODUiKwotICAgICJcMTBcdTAxMzVcMVx1MDE4NVwzXHUwMTM1XDFcdTAxODVcNVx1MDEzNVwxXDBcMVx1MDE4NlwxXHUwMTM4IisKLSAgICAiXDFcdTAxNjBcMVx1MDEzOFwxXHUwMTg3XDFcdTAxMzhcMVx1MDE4NlwxMFx1MDEzOFwxXHUwMTg4XDIyXHUwMTM4IisKLSAgICAiXDFcdTAxODZcMlx1MDEzOFwxXHUwMTg2XDJcdTAxMzhcMVx1MDE4NlwxMFx1MDEzOFwxXHUwMTg2XDNcdTAxMzgiKwotICAgICJcMVx1MDE4Nlw1XHUwMTM4XDFcMFwxXHUwMTg5XDFcdTAxMzlcMVx1MDE2MVwzXHUwMTM5XDFcdTAxODkiKwotICAgICJcMVx1MDE4YVw3XHUwMTM5XDFcdTAxOGJcMjJcdTAxMzlcMVx1MDE4OVwyXHUwMTM5XDFcdTAxODlcMlx1MDEzOSIrCi0gICAgIlwxXHUwMTg5XDEwXHUwMTM5XDFcdTAxODlcM1x1MDEzOVwxXHUwMTg5XDVcdTAxMzlcNTNcMFwxXHUwMThjIisKLSAgICAiXDIxXDBcMlwzMlwxXDE0N1wxXDMyXDFcMFwyXDMyXDFcMFwxXDMyIisKLSAgICAiXDFcMFwxXDMyXDNcMFwyXDMyXDJcMFwzXDMyXDFcMFwxXDMyIisKLSAgICAiXDEzXDBcMTFcMzJcMVwwXDRcMzJcMVwwXDNcMzJcMVwwXDNcMzIiKwotICAgICJcNFwwXDFcdTAxOGRcMVwxNTJcMVwxNTNcMVwxNTJcMVwwXDFcMTUyXDFcdTAxOGQiKwotICAgICJcMVwwXDFcMTUyXDFcMFwxXDE1MlwzXDBcMlwxNTJcMlwwXDNcMTUyIisKLSAgICAiXDFcMFwxXDE1MlwxM1wwXDFcdTAxOGRcMlwxNTJcMVx1MDE4ZFwyXDE1MlwxXHUwMThkIisKLSAgICAiXDJcMTUyXDFcMFw0XDE1MlwxXDBcMVx1MDE4ZFwyXDE1MlwxXDBcMVx1MDE4ZCIrCi0gICAgIlwyXDE1Mlw0XDBcMVx1MDE4ZVwxXDE1NFwxXDE1NVwxXDE1NFwxXDBcMVwxNTQiKwotICAgICJcMVx1MDE4ZVwxXDBcMVwxNTRcMVwwXDFcMTU0XDNcMFwyXDE1NFwyXDAiKwotICAgICJcM1wxNTRcMVwwXDFcMTU0XDEzXDBcMVx1MDE4ZVwyXDE1NFwxXHUwMThlXDJcMTU0IisKLSAgICAiXDFcdTAxOGVcMlwxNTRcMVwwXDRcMTU0XDFcMFwxXHUwMThlXDJcMTU0XDFcMCIrCi0gICAgIlwxXHUwMThlXDJcMTU0XDU2XDBcMVx1MDE4Zlw2NlwwXDJcdTAxOTBcMjVcMFwxXHUwMTkxIisKLSAgICAiXDFcMzY3XDFcMzcwXDFcMzY3XDFcMFwxXDM2N1wxXHUwMTkxXDFcMFwxXDM2NyIrCi0gICAgIlwxXHUwMTFhXDFcMzY3XDNcMFwyXDM2N1wyXDBcM1wzNjdcMVwwXDFcMzY3IisKLSAgICAiXDEzXDBcMVx1MDE5MVwyXDM2N1wxXHUwMTkxXDJcMzY3XDFcdTAxOTFcMlwzNjdcMVwwIisKLSAgICAiXDRcMzY3XDFcMFwxXHUwMTkxXDJcMzY3XDFcMFwxXHUwMTkxXDJcMzY3XDRcMCIrCi0gICAgIlwxXHUwMTkyXDFcMTcxXDFcMTcyXDFcMTcxXDFcMFwxXDE3MVwxXHUwMTkyXDFcMCIrCi0gICAgIlwxXDE3MVwxXDBcMVwxNzFcM1wwXDJcMTcxXDJcMFwzXDE3MVwxXDMwNCIrCi0gICAgIlwxXDE3MVwxM1wwXDFcdTAxOTJcMlwxNzFcMVx1MDE5MlwyXDE3MVwxXHUwMTkyXDJcMTcxIisKLSAgICAiXDFcMFw0XDE3MVwxXDBcMVx1MDE5MlwyXDE3MVwxXDBcMVx1MDE5MlwyXDE3MSIrCi0gICAgIlw0XDBcMVx1MDE5M1wxXDE3M1wxXDE3NFwxXDE3M1wxXDE3NVwxXDE3M1wxXHUwMTkzIisKLSAgICAiXDMzXDE3M1wxXHUwMTkzXDJcMTczXDFcdTAxOTNcMlwxNzNcMVx1MDE5M1wxMFwxNzNcMVx1MDE5MyIrCi0gICAgIlwzXDE3M1wxXHUwMTkzXDVcMTczXDFcMFwxXHUwMTk0XDFcMTc2XDFcMTc3XDNcMTc2IisKLSAgICAiXDFcdTAxOTRcMVwxNzVcMzJcMTc2XDFcdTAxOTRcMlwxNzZcMVx1MDE5NFwyXDE3NlwxXHUwMTk0IisKLSAgICAiXDEwXDE3NlwxXHUwMTk0XDNcMTc2XDFcdTAxOTRcNVwxNzZcMVwwXDFcdTAxOTVcMVwyMDEiKwotICAgICJcMVwyMDJcMVwyMDFcMVwyMDNcMVwyMDFcMVx1MDE5NVwzM1wyMDFcMVx1MDE5NVwyXDIwMSIrCi0gICAgIlwxXHUwMTk1XDJcMjAxXDFcdTAxOTVcMTBcMjAxXDFcdTAxOTVcM1wyMDFcMVx1MDE5NVw1XDIwMSIrCi0gICAgIlwxXDBcMVx1MDE5NlwxXDIwNFwxXDIwNVwzXDIwNFwxXHUwMTk2XDFcMjAzXDMyXDIwNCIrCi0gICAgIlwxXHUwMTk2XDJcMjA0XDFcdTAxOTZcMlwyMDRcMVx1MDE5NlwxMFwyMDRcMVx1MDE5NlwzXDIwNCIrCi0gICAgIlwxXHUwMTk2XDVcMjA0XDFcMFwxXHUwMTk3XDFcdTAxMjFcMVx1MDEyMlwxXHUwMTIxXDFcMCIrCi0gICAgIlwxXHUwMTIxXDFcdTAxOTdcMVwwXDFcdTAxMjFcMVx1MDEyNVwxM1x1MDEyMVwxXDBcMTRcdTAxMjEiKwotICAgICJcMVx1MDE5N1wyXHUwMTIxXDFcdTAxOTdcMlx1MDEyMVwxXHUwMTk3XDEwXHUwMTIxXDFcdTAxOTdcM1x1MDEyMSIrCi0gICAgIlwxXHUwMTk3XDVcdTAxMjFcMVwwXDFcdTAxOThcMVx1MDEyM1wxXHUwMTRjXDFcdTAxMjNcMVx1MDE0OSIrCi0gICAgIlwxXHUwMTIzXDFcdTAxOThcMzNcdTAxMjNcMVx1MDE5OFwyXHUwMTIzXDFcdTAxOThcMlx1MDEyM1wxXHUwMTk4IisKLSAgICAiXDEwXHUwMTIzXDFcdTAxOThcM1x1MDEyM1wxXHUwMTk4XDVcdTAxMjNcMVwwXDJcdTAxMjNcMVx1MDE0YyIrCi0gICAgIlwyXHUwMTQ5XDFcdTAxNzFcMlx1MDEyM1wxXHUwMTcxXDFcdTAxOTlcNFx1MDEyM1wyXHUwMTQ5XDUzXHUwMTIzIisKLSAgICAiXDFcMFwyXHUwMTIzXDFcdTAxNGNcMVwwXDFcdTAxNDlcMTJcdTAxMjNcMVwwXDUzXHUwMTIzIisKLSAgICAiXDFcMFwxXHUwMTlhXDFcdTAxMjRcMVx1MDE0ZFwzXHUwMTI0XDFcdTAxOWFcMVx1MDE0OVwzMlx1MDEyNCIrCi0gICAgIlwxXHUwMTlhXDJcdTAxMjRcMVx1MDE5YVwyXHUwMTI0XDFcdTAxOWFcMTBcdTAxMjRcMVx1MDE5YVwzXHUwMTI0IisKLSAgICAiXDFcdTAxOWFcNVx1MDEyNFwxXDBcMlx1MDEyNFwxXHUwMTRkXDFcdTAxNDlcMVx1MDEyNFwxXHUwMTc0IisKLSAgICAiXDFcdTAxMjRcMVx1MDE0OVwxXHUwMTc0XDFcdTAxOWJcNFx1MDEyNFwyXHUwMTQ5XDUzXHUwMTI0XDFcMCIrCi0gICAgIlwyXHUwMTI0XDFcdTAxNGRcMVwwXDNcdTAxMjRcMVx1MDE0OVw3XHUwMTI0XDFcMFw1M1x1MDEyNCIrCi0gICAgIlwxXDBcMlw2MFwxXDIwN1wxXDYwXDFcMFwyXDYwXDFcMFwxXDYwIisKLSAgICAiXDFcMFwxXDYwXDNcMFwyXDYwXDJcMFwzXDYwXDFcMFwxXDYwIisKLSAgICAiXDEzXDBcMTFcNjBcMVwwXDRcNjBcMVwwXDNcNjBcMVwwXDNcNjAiKwotICAgICJcNFwwXDJcNjRcMVwyMTJcMVw2NFwxXDBcMlw2NFwxXDBcMVw2NCIrCi0gICAgIlwxXDBcMVw2NFwzXDBcMlw2NFwyXDBcM1w2NFwxXDBcMVw2NCIrCi0gICAgIlwxM1wwXDExXDY0XDFcMFw0XDY0XDFcMFwzXDY0XDFcMFwzXDY0IisKLSAgICAiXDRcMFwyXDcxXDFcMjE1XDFcNzFcMVwwXDJcNzFcMVwwXDFcNzEiKwotICAgICJcMVwwXDFcNzFcM1wwXDJcNzFcMlwwXDNcNzFcMVwwXDFcNzEiKwotICAgICJcMTNcMFwxMVw3MVwxXDBcNFw3MVwxXDBcM1w3MVwxXDBcM1w3MSIrCi0gICAgIlw0XDBcMlwxMDFcMVwyMjFcMVwxMDFcMVwwXDJcMTAxXDFcMFwxXDEwMSIrCi0gICAgIlwxXDBcMVwxMDFcM1wwXDJcMTAxXDJcMFwzXDEwMVwxXDBcMVwxMDEiKwotICAgICJcMTNcMFwxMVwxMDFcMVwwXDRcMTAxXDFcMFwzXDEwMVwxXDBcM1wxMDEiKwotICAgICJcNFwwXDJcMTA3XDFcMjI0XDFcMTA3XDFcMFwyXDEwN1wxXDBcMVwxMDciKwotICAgICJcMVwwXDFcMTA3XDNcMFwyXDEwN1wyXDBcM1wxMDdcMVwwXDFcMTA3IisKLSAgICAiXDEzXDBcMTFcMTA3XDFcMFw0XDEwN1wxXDBcM1wxMDdcMVwwXDNcMTA3IisKLSAgICAiXDRcMFwxXHUwMTljXDFcMjI2XDFcMjI3XDFcMjI2XDFcMjMwXDFcMjI2XDFcdTAxOWMiKwotICAgICJcMzNcMjI2XDFcdTAxOWNcMlwyMjZcMVx1MDE5Y1wyXDIyNlwxXHUwMTljXDEwXDIyNlwxXHUwMTljIisKLSAgICAiXDNcMjI2XDFcdTAxOWNcNVwyMjZcMVwwXDFcdTAxOWRcMVwyMzFcMVwyMzJcM1wyMzEiKwotICAgICJcMVx1MDE5ZFwxXDIzMFwzMlwyMzFcMVx1MDE5ZFwyXDIzMVwxXHUwMTlkXDJcMjMxXDFcdTAxOWQiKwotICAgICJcMTBcMjMxXDFcdTAxOWRcM1wyMzFcMVx1MDE5ZFw1XDIzMVwxXDBcMlwxMTRcMVwyMzQiKwotICAgICJcMVwxMTRcMVwwXDJcMTE0XDFcMFwxXDExNFwxXDBcMVwxMTRcM1wwIisKLSAgICAiXDJcMTE0XDJcMFwzXDExNFwxXDBcMVwxMTRcMTNcMFwxMVwxMTRcMVwwIisKLSAgICAiXDRcMTE0XDFcMFwzXDExNFwxXDBcM1wxMTRcNFwwXDFcdTAxOWVcMVwyMzciKwotICAgICJcMVwyNDBcMVwyMzdcMVwwXDFcMjM3XDFcdTAxOWVcMVwwXDFcMjM3XDFcMCIrCi0gICAgIlwxXDIzN1wzXDBcMlwyMzdcMlwwXDNcMjM3XDFcMFwxXDIzN1wxM1wwIisKLSAgICAiXDFcdTAxOWVcMlwyMzdcMVx1MDE5ZVwyXDIzN1wxXHUwMTllXDJcMjM3XDFcMFw0XDIzNyIrCi0gICAgIlwxXDBcMVx1MDE5ZVwyXDIzN1wxXDBcMVx1MDE5ZVwyXDIzN1w0XDBcMlwxMjIiKwotICAgICJcMVwyNDNcMVwxMjJcMVwwXDJcMTIyXDFcMFwxXDEyMlwxXDBcMVwxMjIiKwotICAgICJcM1wwXDJcMTIyXDJcMFwzXDEyMlwxXDI0NFwxXDEyMlwxM1wwXDExXDEyMiIrCi0gICAgIlwxXDBcNFwxMjJcMVwwXDNcMTIyXDFcMFwzXDEyMlw0XDBcMVx1MDE5ZiIrCi0gICAgIlwxXDI0NlwxXDI0N1wxXDI0NlwxXDI1MFwxXDI0NlwxXHUwMTlmXDMzXDI0NlwxXHUwMTlmIisKLSAgICAiXDJcMjQ2XDFcdTAxOWZcMlwyNDZcMVx1MDE5ZlwxMFwyNDZcMVx1MDE5ZlwzXDI0NlwxXHUwMTlmIisKLSAgICAiXDVcMjQ2XDFcMFwxXHUwMWEwXDFcMjUxXDFcMjUyXDNcMjUxXDFcdTAxYTBcMVwyNTAiKwotICAgICJcMzJcMjUxXDFcdTAxYTBcMlwyNTFcMVx1MDFhMFwyXDI1MVwxXHUwMWEwXDEwXDI1MVwxXHUwMWEwIisKLSAgICAiXDNcMjUxXDFcdTAxYTBcNVwyNTFcMVwwXDFcdTAxYTFcMVwyNTZcMVwyNTdcMVwyNTYiKwotICAgICJcMVwwXDFcMjU2XDFcdTAxYTFcMVwwXDFcMjU2XDFcMFwxXDI1NlwzXDAiKwotICAgICJcMlwyNTZcMlwwXDNcMjU2XDFcMFwxXDI1NlwxM1wwXDFcdTAxYTFcMlwyNTYiKwotICAgICJcMVx1MDFhMVwyXDI1NlwxXHUwMWExXDJcMjU2XDFcMFw0XDI1NlwxXDBcMVx1MDFhMSIrCi0gICAgIlwyXDI1NlwxXDBcMVx1MDFhMVwyXDI1Nlw0XDBcMVx1MDFhMlw1XDBcMVx1MDFhMiIrCi0gICAgIlwzXDBcMVx1MDEwZFw1XDBcMVx1MDFhMlw1XDBcMVx1MDFhMlwxM1wwXDJcdTAxYTIiKwotICAgICJcMVwwXDJcdTAxYTJcMVwwXDJcdTAxYTJcN1wwXDJcdTAxYTJcMlwwXDJcdTAxYTIiKwotICAgICJcNVwwXDFcdTAxYTNcNVwwXDFcdTAxYTNcMTFcMFwxXHUwMWEzXDVcMFwxXHUwMWEzIisKLSAgICAiXDEzXDBcMlx1MDFhM1wxXDBcMlx1MDFhM1wxXDBcMlx1MDFhM1w3XDBcMlx1MDFhMyIrCi0gICAgIlwyXDBcMlx1MDFhM1w1XDBcMVx1MDFhNFwxXHUwMTM1XDFcdTAxMzZcMVx1MDEzNVwxXDAiKwotICAgICJcMVx1MDEzNVwxXHUwMWE0XDFcMFwxXHUwMTM1XDFcdTAxM2FcMTNcdTAxMzVcMVwwXDE0XHUwMTM1IisKLSAgICAiXDFcdTAxYTRcMlx1MDEzNVwxXHUwMWE0XDJcdTAxMzVcMVx1MDFhNFwxMFx1MDEzNVwxXHUwMWE0XDNcdTAxMzUiKwotICAgICJcMVx1MDFhNFw1XHUwMTM1XDFcMFwxXHUwMWE1XDFcdTAxMzhcMVx1MDE2MFwxXHUwMTM4XDFcdTAxNWQiKwotICAgICJcMVx1MDEzOFwxXHUwMWE1XDMzXHUwMTM4XDFcdTAxYTVcMlx1MDEzOFwxXHUwMWE1XDJcdTAxMzhcMVx1MDFhNSIrCi0gICAgIlwxMFx1MDEzOFwxXHUwMWE1XDNcdTAxMzhcMVx1MDFhNVw1XHUwMTM4XDFcMFwyXHUwMTM4XDFcdTAxNjAiKwotICAgICJcMlx1MDE1ZFwxXHUwMTg3XDJcdTAxMzhcMVx1MDE4N1wxXHUwMWE2XDRcdTAxMzhcMlx1MDE1ZFw1M1x1MDEzOCIrCi0gICAgIlwxXDBcMlx1MDEzOFwxXHUwMTYwXDFcMFwxXHUwMTVkXDEyXHUwMTM4XDFcMFw1M1x1MDEzOCIrCi0gICAgIlwxXDBcMVx1MDFhN1wxXHUwMTM5XDFcdTAxNjFcM1x1MDEzOVwxXHUwMWE3XDFcdTAxNWRcMzJcdTAxMzkiKwotICAgICJcMVx1MDFhN1wyXHUwMTM5XDFcdTAxYTdcMlx1MDEzOVwxXHUwMWE3XDEwXHUwMTM5XDFcdTAxYTdcM1x1MDEzOSIrCi0gICAgIlwxXHUwMWE3XDVcdTAxMzlcMVwwXDJcdTAxMzlcMVx1MDE2MVwxXHUwMTVkXDFcdTAxMzlcMVx1MDE4YSIrCi0gICAgIlwxXHUwMTM5XDFcdTAxNWRcMVx1MDE4YVwxXHUwMWE4XDRcdTAxMzlcMlx1MDE1ZFw1M1x1MDEzOVwxXDAiKwotICAgICJcMlx1MDEzOVwxXHUwMTYxXDFcMFwzXHUwMTM5XDFcdTAxNWRcN1x1MDEzOVwxXDBcNTNcdTAxMzkiKwotICAgICJcNDZcMFwyXHUwMWE5XDI1XDBcMlwxNTJcMVwxNTNcMVwxNTJcMVwwXDJcMTUyIisKLSAgICAiXDFcMFwxXDE1MlwxXDBcMVwxNTJcM1wwXDJcMTUyXDJcMFwzXDE1MiIrCi0gICAgIlwxXDBcMVwxNTJcMTNcMFwxMVwxNTJcMVwwXDRcMTUyXDFcMFwzXDE1MiIrCi0gICAgIlwxXDBcM1wxNTJcNFwwXDJcMTU0XDFcMTU1XDFcMTU0XDFcMFwyXDE1NCIrCi0gICAgIlwxXDBcMVwxNTRcMVwwXDFcMTU0XDNcMFwyXDE1NFwyXDBcM1wxNTQiKwotICAgICJcMVwwXDFcMTU0XDEzXDBcMTFcMTU0XDFcMFw0XDE1NFwxXDBcM1wxNTQiKwotICAgICJcMVwwXDNcMTU0XDQ2XDBcMlx1MDFhYVwzMFwwXDFcdTAxYWJcMVwzNjdcMVwzNzAiKwotICAgICJcMVwzNjdcMVwwXDFcMzY3XDFcdTAxYWJcMVwwXDFcMzY3XDFcdTAxMWFcMVwzNjciKwotICAgICJcM1wwXDJcMzY3XDJcMFwzXDM2N1wxXDBcMVwzNjdcMTNcMFwxXHUwMWFiIisKLSAgICAiXDJcMzY3XDFcdTAxYWJcMlwzNjdcMVx1MDFhYlwyXDM2N1wxXDBcNFwzNjdcMVwwIisKLSAgICAiXDFcdTAxYWJcMlwzNjdcMVwwXDFcdTAxYWJcMlwzNjdcNFwwXDJcMTcxXDFcMTcyIisKLSAgICAiXDFcMTcxXDFcMFwyXDE3MVwxXDBcMVwxNzFcMVwwXDFcMTcxXDNcMCIrCi0gICAgIlwyXDE3MVwyXDBcM1wxNzFcMVwzMDRcMVwxNzFcMTNcMFwxMVwxNzFcMVwwIisKLSAgICAiXDRcMTcxXDFcMFwzXDE3MVwxXDBcM1wxNzFcNFwwXDJcMTczXDFcMTc0IisKLSAgICAiXDFcMTczXDFcMTc1XDY2XDE3M1wxXDBcMlwxNzZcMVwxNzdcNFwxNzZcMVwxNzUiKwotICAgICJcNjNcMTc2XDFcMFwyXDIwMVwxXDIwMlwxXDIwMVwxXDIwM1w2NlwyMDFcMVwwIisKLSAgICAiXDJcMjA0XDFcMjA1XDRcMjA0XDFcMjAzXDYzXDIwNFwxXDBcMVx1MDFhY1wxXHUwMTIxIisKLSAgICAiXDFcdTAxMjJcMVx1MDEyMVwxXDBcMVx1MDEyMVwxXHUwMWFjXDFcMFwxXHUwMTIxXDFcdTAxMjUiKwotICAgICJcMTNcdTAxMjFcMVwwXDE0XHUwMTIxXDFcdTAxYWNcMlx1MDEyMVwxXHUwMWFjXDJcdTAxMjFcMVx1MDFhYyIrCi0gICAgIlwxMFx1MDEyMVwxXHUwMWFjXDNcdTAxMjFcMVx1MDFhY1w1XHUwMTIxXDFcMFwxXHUwMWFkXDFcdTAxMjMiKwotICAgICJcMVx1MDE0Y1wxXHUwMTIzXDFcdTAxNDlcMVx1MDEyM1wxXHUwMWFkXDMzXHUwMTIzXDFcdTAxYWRcMlx1MDEyMyIrCi0gICAgIlwxXHUwMWFkXDJcdTAxMjNcMVx1MDFhZFwxMFx1MDEyM1wxXHUwMWFkXDNcdTAxMjNcMVx1MDFhZFw1XHUwMTIzIisKLSAgICAiXDFcMFwxXHUwMWFlXDFcdTAxMjRcMVx1MDE0ZFwzXHUwMTI0XDFcdTAxYWVcMVx1MDE0OVwzMlx1MDEyNCIrCi0gICAgIlwxXHUwMWFlXDJcdTAxMjRcMVx1MDFhZVwyXHUwMTI0XDFcdTAxYWVcMTBcdTAxMjRcMVx1MDFhZVwzXHUwMTI0IisKLSAgICAiXDFcdTAxYWVcNVx1MDEyNFwxXDBcMlwyMjZcMVwyMjdcMVwyMjZcMVwyMzBcNjZcMjI2IisKLSAgICAiXDFcMFwyXDIzMVwxXDIzMlw0XDIzMVwxXDIzMFw2M1wyMzFcMVwwXDJcMjM3IisKLSAgICAiXDFcMjQwXDFcMjM3XDFcMFwyXDIzN1wxXDBcMVwyMzdcMVwwXDFcMjM3IisKLSAgICAiXDNcMFwyXDIzN1wyXDBcM1wyMzdcMVwwXDFcMjM3XDEzXDBcMTFcMjM3IisKLSAgICAiXDFcMFw0XDIzN1wxXDBcM1wyMzdcMVwwXDNcMjM3XDRcMFwyXDI0NiIrCi0gICAgIlwxXDI0N1wxXDI0NlwxXDI1MFw2NlwyNDZcMVwwXDJcMjUxXDFcMjUyXDRcMjUxIisKLSAgICAiXDFcMjUwXDYzXDI1MVwxXDBcMlwyNTZcMVwyNTdcMVwyNTZcMVwwXDJcMjU2IisKLSAgICAiXDFcMFwxXDI1NlwxXDBcMVwyNTZcM1wwXDJcMjU2XDJcMFwzXDI1NiIrCi0gICAgIlwxXDBcMVwyNTZcMTNcMFwxMVwyNTZcMVwwXDRcMjU2XDFcMFwzXDI1NiIrCi0gICAgIlwxXDBcM1wyNTZcMTZcMFwxXHUwMTBkXDYxXDBcMVx1MDFhZlw1XDBcMVx1MDFhZiIrCi0gICAgIlwxMVwwXDFcdTAxYWZcNVwwXDFcdTAxYWZcMTNcMFwyXHUwMWFmXDFcMFwyXHUwMWFmIisKLSAgICAiXDFcMFwyXHUwMWFmXDdcMFwyXHUwMWFmXDJcMFwyXHUwMWFmXDVcMFwxXHUwMWIwIisKLSAgICAiXDFcdTAxMzVcMVx1MDEzNlwxXHUwMTM1XDFcMFwxXHUwMTM1XDFcdTAxYjBcMVwwXDFcdTAxMzUiKwotICAgICJcMVx1MDEzYVwxM1x1MDEzNVwxXDBcMTRcdTAxMzVcMVx1MDFiMFwyXHUwMTM1XDFcdTAxYjBcMlx1MDEzNSIrCi0gICAgIlwxXHUwMWIwXDEwXHUwMTM1XDFcdTAxYjBcM1x1MDEzNVwxXHUwMWIwXDVcdTAxMzVcMVwwXDFcdTAxYjEiKwotICAgICJcMVx1MDEzOFwxXHUwMTYwXDFcdTAxMzhcMVx1MDE1ZFwxXHUwMTM4XDFcdTAxYjFcMzNcdTAxMzhcMVx1MDFiMSIrCi0gICAgIlwyXHUwMTM4XDFcdTAxYjFcMlx1MDEzOFwxXHUwMWIxXDEwXHUwMTM4XDFcdTAxYjFcM1x1MDEzOFwxXHUwMWIxIisKLSAgICAiXDVcdTAxMzhcMVwwXDFcdTAxYjJcMVx1MDEzOVwxXHUwMTYxXDNcdTAxMzlcMVx1MDFiMlwxXHUwMTVkIisKLSAgICAiXDMyXHUwMTM5XDFcdTAxYjJcMlx1MDEzOVwxXHUwMWIyXDJcdTAxMzlcMVx1MDFiMlwxMFx1MDEzOVwxXHUwMWIyIisKLSAgICAiXDNcdTAxMzlcMVx1MDFiMlw1XHUwMTM5XDcwXDBcMVx1MDFiM1w1NFwwXDJcdTAxYjRcMjJcMCIrCi0gICAgIlwxXHUwMWI1XDFcMzY3XDFcMzcwXDFcMzY3XDFcMFwxXDM2N1wxXHUwMWI1XDFcMCIrCi0gICAgIlwxXDM2N1wxXHUwMTFhXDFcMzY3XDNcMFwyXDM2N1wyXDBcM1wzNjdcMVwwIisKLSAgICAiXDFcMzY3XDEzXDBcMVx1MDFiNVwyXDM2N1wxXHUwMWI1XDJcMzY3XDFcdTAxYjVcMlwzNjciKwotICAgICJcMVwwXDRcMzY3XDFcMFwxXHUwMWI1XDJcMzY3XDFcMFwxXHUwMWI1XDJcMzY3IisKLSAgICAiXDRcMFwxXHUwMWI2XDFcdTAxMjFcMVx1MDEyMlwxXHUwMTIxXDFcMFwxXHUwMTIxXDFcdTAxYjYiKwotICAgICJcMVwwXDFcdTAxMjFcMVx1MDEyNVwxM1x1MDEyMVwxXDBcMTRcdTAxMjFcMVx1MDFiNlwyXHUwMTIxIisKLSAgICAiXDFcdTAxYjZcMlx1MDEyMVwxXHUwMWI2XDEwXHUwMTIxXDFcdTAxYjZcM1x1MDEyMVwxXHUwMWI2XDVcdTAxMjEiKwotICAgICJcMVwwXDFcdTAxYjdcMVx1MDEyM1wxXHUwMTRjXDFcdTAxMjNcMVx1MDE0OVwxXHUwMTIzXDFcdTAxYjciKwotICAgICJcMzNcdTAxMjNcMVx1MDFiN1wyXHUwMTIzXDFcdTAxYjdcMlx1MDEyM1wxXHUwMWI3XDEwXHUwMTIzXDFcdTAxYjciKwotICAgICJcM1x1MDEyM1wxXHUwMWI3XDVcdTAxMjNcMVwwXDFcdTAxYjhcMVx1MDEyNFwxXHUwMTRkXDNcdTAxMjQiKwotICAgICJcMVx1MDFiOFwxXHUwMTQ5XDMyXHUwMTI0XDFcdTAxYjhcMlx1MDEyNFwxXHUwMWI4XDJcdTAxMjRcMVx1MDFiOCIrCi0gICAgIlwxMFx1MDEyNFwxXHUwMWI4XDNcdTAxMjRcMVx1MDFiOFw1XHUwMTI0XDFcMFwxXHUwMWI5XDVcMCIrCi0gICAgIlwxXHUwMWI5XDExXDBcMVx1MDFiOVw1XDBcMVx1MDFiOVwxM1wwXDJcdTAxYjlcMVwwIisKLSAgICAiXDJcdTAxYjlcMVwwXDJcdTAxYjlcN1wwXDJcdTAxYjlcMlwwXDJcdTAxYjlcNVwwIisKLSAgICAiXDFcdTAxYmFcMVx1MDEzNVwxXHUwMTM2XDFcdTAxMzVcMVwwXDFcdTAxMzVcMVx1MDFiYVwxXDAiKwotICAgICJcMVx1MDEzNVwxXHUwMTNhXDEzXHUwMTM1XDFcMFwxNFx1MDEzNVwxXHUwMWJhXDJcdTAxMzVcMVx1MDFiYSIrCi0gICAgIlwyXHUwMTM1XDFcdTAxYmFcMTBcdTAxMzVcMVx1MDFiYVwzXHUwMTM1XDFcdTAxYmFcNVx1MDEzNVwxXDAiKwotICAgICJcMVx1MDFiYlwxXHUwMTM4XDFcdTAxNjBcMVx1MDEzOFwxXHUwMTVkXDFcdTAxMzhcMVx1MDFiYlwzM1x1MDEzOCIrCi0gICAgIlwxXHUwMWJiXDJcdTAxMzhcMVx1MDFiYlwyXHUwMTM4XDFcdTAxYmJcMTBcdTAxMzhcMVx1MDFiYlwzXHUwMTM4IisKLSAgICAiXDFcdTAxYmJcNVx1MDEzOFwxXDBcMVx1MDFiY1wxXHUwMTM5XDFcdTAxNjFcM1x1MDEzOVwxXHUwMWJjIisKLSAgICAiXDFcdTAxNWRcMzJcdTAxMzlcMVx1MDFiY1wyXHUwMTM5XDFcdTAxYmNcMlx1MDEzOVwxXHUwMWJjXDEwXHUwMTM5IisKLSAgICAiXDFcdTAxYmNcM1x1MDEzOVwxXHUwMWJjXDVcdTAxMzlcNTNcMFwxXHUwMWJkXDIxXDBcMlwzNjciKwotICAgICJcMVwzNzBcMVwzNjdcMVwwXDJcMzY3XDFcMFwxXDM2N1wxXHUwMTFhXDFcMzY3IisKLSAgICAiXDNcMFwyXDM2N1wyXDBcM1wzNjdcMVwwXDFcMzY3XDEzXDBcMTFcMzY3IisKLSAgICAiXDFcMFw0XDM2N1wxXDBcM1wzNjdcMVwwXDNcMzY3XDRcMFwxXHUwMWJlIisKLSAgICAiXDFcdTAxMjFcMVx1MDEyMlwxXHUwMTIxXDFcMFwxXHUwMTIxXDFcdTAxYmVcMVwwXDFcdTAxMjEiKwotICAgICJcMVx1MDEyNVwxM1x1MDEyMVwxXDBcMTRcdTAxMjFcMVx1MDFiZVwyXHUwMTIxXDFcdTAxYmVcMlx1MDEyMSIrCi0gICAgIlwxXHUwMWJlXDEwXHUwMTIxXDFcdTAxYmVcM1x1MDEyMVwxXHUwMWJlXDVcdTAxMjFcMVwwXDFcdTAxYmYiKwotICAgICJcMVx1MDEyM1wxXHUwMTRjXDFcdTAxMjNcMVx1MDE0OVwxXHUwMTIzXDFcdTAxYmZcMzNcdTAxMjNcMVx1MDFiZiIrCi0gICAgIlwyXHUwMTIzXDFcdTAxYmZcMlx1MDEyM1wxXHUwMWJmXDEwXHUwMTIzXDFcdTAxYmZcM1x1MDEyM1wxXHUwMWJmIisKLSAgICAiXDVcdTAxMjNcMVwwXDFcdTAxYzBcMVx1MDEyNFwxXHUwMTRkXDNcdTAxMjRcMVx1MDFjMFwxXHUwMTQ5IisKLSAgICAiXDMyXHUwMTI0XDFcdTAxYzBcMlx1MDEyNFwxXHUwMWMwXDJcdTAxMjRcMVx1MDFjMFwxMFx1MDEyNFwxXHUwMWMwIisKLSAgICAiXDNcdTAxMjRcMVx1MDFjMFw1XHUwMTI0XDFcMFwxXHUwMWMxXDFcdTAxMzVcMVx1MDEzNlwxXHUwMTM1IisKLSAgICAiXDFcMFwxXHUwMTM1XDFcdTAxYzFcMVwwXDFcdTAxMzVcMVx1MDEzYVwxM1x1MDEzNVwxXDAiKwotICAgICJcMTRcdTAxMzVcMVx1MDFjMVwyXHUwMTM1XDFcdTAxYzFcMlx1MDEzNVwxXHUwMWMxXDEwXHUwMTM1XDFcdTAxYzEiKwotICAgICJcM1x1MDEzNVwxXHUwMWMxXDVcdTAxMzVcMVwwXDFcdTAxYzJcMVx1MDEzOFwxXHUwMTYwXDFcdTAxMzgiKwotICAgICJcMVx1MDE1ZFwxXHUwMTM4XDFcdTAxYzJcMzNcdTAxMzhcMVx1MDFjMlwyXHUwMTM4XDFcdTAxYzJcMlx1MDEzOCIrCi0gICAgIlwxXHUwMWMyXDEwXHUwMTM4XDFcdTAxYzJcM1x1MDEzOFwxXHUwMWMyXDVcdTAxMzhcMVwwXDFcdTAxYzMiKwotICAgICJcMVx1MDEzOVwxXHUwMTYxXDNcdTAxMzlcMVx1MDFjM1wxXHUwMTVkXDMyXHUwMTM5XDFcdTAxYzNcMlx1MDEzOSIrCi0gICAgIlwxXHUwMWMzXDJcdTAxMzlcMVx1MDFjM1wxMFx1MDEzOVwxXHUwMWMzXDNcdTAxMzlcMVx1MDFjM1w1XHUwMTM5IisKLSAgICAiXDFcMFwyXHUwMTIxXDFcdTAxMjJcMVx1MDEyMVwxXDBcMlx1MDEyMVwxXDBcMVx1MDEyMSIrCi0gICAgIlwxXHUwMTI1XDEzXHUwMTIxXDFcMFw0NVx1MDEyMVwxXDBcMVx1MDFjNFwxXHUwMTIzXDFcdTAxNGMiKwotICAgICJcMVx1MDEyM1wxXHUwMTQ5XDFcdTAxMjNcMVx1MDFjNFwzM1x1MDEyM1wxXHUwMWM0XDJcdTAxMjNcMVx1MDFjNCIrCi0gICAgIlwyXHUwMTIzXDFcdTAxYzRcMTBcdTAxMjNcMVx1MDFjNFwzXHUwMTIzXDFcdTAxYzRcNVx1MDEyM1wxXDAiKwotICAgICJcMVx1MDFjNVwxXHUwMTI0XDFcdTAxNGRcM1x1MDEyNFwxXHUwMWM1XDFcdTAxNDlcMzJcdTAxMjRcMVx1MDFjNSIrCi0gICAgIlwyXHUwMTI0XDFcdTAxYzVcMlx1MDEyNFwxXHUwMWM1XDEwXHUwMTI0XDFcdTAxYzVcM1x1MDEyNFwxXHUwMWM1IisKLSAgICAiXDVcdTAxMjRcMVwwXDJcdTAxMzVcMVx1MDEzNlwxXHUwMTM1XDFcMFwyXHUwMTM1XDFcMCIrCi0gICAgIlwxXHUwMTM1XDFcdTAxM2FcMTNcdTAxMzVcMVwwXDQ1XHUwMTM1XDFcMFwxXHUwMWM2XDFcdTAxMzgiKwotICAgICJcMVx1MDE2MFwxXHUwMTM4XDFcdTAxNWRcMVx1MDEzOFwxXHUwMWM2XDMzXHUwMTM4XDFcdTAxYzZcMlx1MDEzOCIrCi0gICAgIlwxXHUwMWM2XDJcdTAxMzhcMVx1MDFjNlwxMFx1MDEzOFwxXHUwMWM2XDNcdTAxMzhcMVx1MDFjNlw1XHUwMTM4IisKLSAgICAiXDFcMFwxXHUwMWM3XDFcdTAxMzlcMVx1MDE2MVwzXHUwMTM5XDFcdTAxYzdcMVx1MDE1ZFwzMlx1MDEzOSIrCi0gICAgIlwxXHUwMWM3XDJcdTAxMzlcMVx1MDFjN1wyXHUwMTM5XDFcdTAxYzdcMTBcdTAxMzlcMVx1MDFjN1wzXHUwMTM5IisKLSAgICAiXDFcdTAxYzdcNVx1MDEzOVwxXDBcMlx1MDEyM1wxXHUwMTRjXDFcdTAxMjNcMVx1MDE0OVw2Nlx1MDEyMyIrCi0gICAgIlwxXDBcMlx1MDEyNFwxXHUwMTRkXDRcdTAxMjRcMVx1MDE0OVw2M1x1MDEyNFwxXDBcMlx1MDEzOCIrCi0gICAgIlwxXHUwMTYwXDFcdTAxMzhcMVx1MDE1ZFw2Nlx1MDEzOFwxXDBcMlx1MDEzOVwxXHUwMTYxXDRcdTAxMzkiKwotICAgICJcMVx1MDE1ZFw2M1x1MDEzOSI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrVHJhbnMoKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbMjIyNjBdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrVHJhbnMoWlpfVFJBTlNfUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrVHJhbnMoU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICB2YWx1ZS0tOwotICAgICAgZG8gcmVzdWx0W2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9VTktOT1dOX0VSUk9SID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX05PX01BVENIID0gMTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1BVU0hCQUNLXzJCSUcgPSAyOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIKLSAgfTsKLQotICAvKioKLSAgICogWlpfQVRUUklCVVRFW2FTdGF0ZV0gY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgb2Ygc3RhdGUgPGNvZGU+YVN0YXRlPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX0FUVFJJQlVURSA9IHp6VW5wYWNrQXR0cmlidXRlKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0FUVFJJQlVURV9QQUNLRURfMCA9Ci0gICAgIlwzMFwwXDFcMTFcMTBcMVwxXDExXDJcMVwxXDExXDFcMVwxXDExIisKLSAgICAiXDRcMVwxXDExXDZcMVwxXDExXDNcMVwyXDExXDNcMVwxXDExIisKLSAgICAiXDFcMVwxXDNcMlwxMVwzXDFcMVwxMVwxXDFcMVwxMVwxMFwxIisKLSAgICAiXDJcMTFcNVwxXDFcMTFcN1wxXDFcMTFcMVwzXDNcMVwzXDExIisKLSAgICAiXDFcMVwxXDBcM1wxXDFcMFwxXDFcMlwwXDFcMVwyXDAiKwotICAgICJcMVwxMVw2XDBcMVwxXDNcMFwxXDExXDVcMFwxXDExXDRcMCIrCi0gICAgIlwyXDFcMVwwXDJcMVwxXDBcMlwxXDFcMTVcMVwwXDJcMSIrCi0gICAgIlwxXDBcMVwxXDJcMFwxXDExXDJcMFwxXDFcMVwwXDNcMSIrCi0gICAgIlwyXDBcMVwxMVwxXDBcMVwxMVwxXDFcMlwwXDFcMTFcMlwwIisKLSAgICAiXDRcMVwyXDBcMVwxXDJcMFwxXDE1XDFcMVwxXDBcMVwxMSIrCi0gICAgIlwxXDBcMVwxXDFcMTFcMlwxXDEwXDBcMVwxXDFcMFwxXDEiKwotICAgICJcMlwwXDFcMVwyXDBcMVwxXDJcMFwxXDFcMlwwXDVcMSIrCi0gICAgIlwxXDBcMVwxXDJcMFwxXDFcMVwwXDNcMVwxXDBcMVwxIisKLSAgICAiXDJcMFwxXDFcMVwwXDNcMVwzXDBcM1wxXDFcMTFcNVwwIisKLSAgICAiXDFcMTFcMlwwXDFcMVw1XDBcNVwxXDJcMFwzXDFcMlwwIisKLSAgICAiXDJcMVwxXDBcMVwxXDFcMFwxXDExXDNcMVwzXDBcMVwxMSIrCi0gICAgIlwyXDBcMVwxMVwxXDBcMVwxXDEwXDBcMVwxMVw1XDFcMlwwIisKLSAgICAiXDNcMVwyXDBcM1wxXDVcMFwxXDExXDFcMFwzXDFcMlwwIisKLSAgICAiXDFcMTFcMlwwXDFcMVw2XDBcMVwxXDJcMFw1XDFcMlwwIisKLSAgICAiXDNcMVwyXDBcM1wxXDJcMFwxXDFcM1wwXDNcMVwxXDAiKwotICAgICJcMVwxMVwyXDBcMVwxXDEzXDBcNVwxXDJcMFwzXDFcMlwwIisKLSAgICAiXDNcMVwxMFwwXDJcMVwxXDExXDJcMFwxXDFcNlwwXDFcMSIrCi0gICAgIlwxXDBcMVwxXDJcMFwxXDFcMlwwXDNcMVwyXDBcMVwxIisKLSAgICAiXDFcMFwxXDFcNlwwXDFcMVw0XDBcMVwxMVw0XDBcMVwxMSIrCi0gICAgIlwzXDBcMVwxMVwxMlwwIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tBdHRyaWJ1dGUoKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbNDU1XTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja0F0dHJpYnV0ZShaWl9BVFRSSUJVVEVfUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrQXR0cmlidXRlKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAgICAgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gcmVzdWx0W2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHp6UmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHp6U3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgenpCdWZmZXJbXSA9IG5ldyBjaGFyW1paX0JVRkZFUlNJWkVdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB6ek1hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgenpQdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHp6Q3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHp6U3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgenpFbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgLy9wcml2YXRlIGludCB5eWNvbHVtbjsKLQotICAvKiogCi0gICAqIHp6QXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICAvL3ByaXZhdGUgYm9vbGVhbiB6ekF0Qk9MID0gdHJ1ZTsKLQotICAvKiogenpBdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBhdCB0aGUgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB6ekF0RU9GOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVU5ERUZJTkVEID0gInVuZGVmaW5lZCI7Ci0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQ7Ci0vLwlwcml2YXRlIGludCBmQnVmZmVyZWRUZXh0TGVuZ3RoOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aDsKLS8vCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZCdWZmZXJlZFRleHQgPSBudWxsOwotCXByaXZhdGUgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBDU1NUZXh0UmVnaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCXByaXZhdGUgaW50IGZJbml0aWFsU3RhdGUgPSBZWUlOSVRJQUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfTk9STUFMID0gMTYzODQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfU01BTEwgPSAyNTY7Ci0JcHJpdmF0ZSBpbnQgZkluaXRpYWxCdWZmZXJTaXplID0gQlVGRkVSX1NJWkVfTk9STUFMOwotCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFN0YXRlKGludCBzdGF0ZSkgewotCQlmSW5pdGlhbFN0YXRlID0gc3RhdGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxCdWZmZXJTaXplKGludCBzaXplKSB7Ci0JCWZJbml0aWFsQnVmZmVyU2l6ZSA9IHNpemU7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLSAgCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dDsKLQkJU3RyaW5nIG5leHRUb2tlblR5cGU7Ci0JCWJvb2xlYW4gc3BhY2VGb2xsb3dzOwotLy8JCVN0cmluZ0J1ZmZlciB0ZXh0OwotCQlpbnQgc3RhcnQ7Ci0JCWludCB0ZXh0TGVuZ3RoOwotCQlpbnQgbGVuZ3RoOwotCQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCAhPSBudWxsKSB7Ci0JCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsKLS8vCQkJdGV4dCA9IGZCdWZmZXJlZFRleHQ7Ci0JCQlzdGFydCA9IGZCdWZmZXJlZFN0YXJ0OwotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsKLQotCQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotLy8JCQl0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7Ci0JCQlzdGFydCA9IHl5Y2hhcjsKLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOwotCQl9Ci0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJaWYgKGNvbnRleHQgPT0gQ1NTX0pTUF9TQ1JJUFRMRVQgfHwgY29udGV4dCA9PSBDU1NfSlNQX0VMKXsKLQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCXdoaWxlIChuZXh0VG9rZW5UeXBlICE9IENTU19KU1BfRU5EICYmIG5leHRUb2tlblR5cGUgIT0gQ1NTX0VMX0VORCAmJiBuZXh0VG9rZW5UeXBlICE9IENTU19KU1BfQ09NTUVOVCkgewotLy8JCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQkJCQlpZiAoY29udGV4dC5lcXVhbHMoQ1NTX0pTUF9TQ1JJUFRMRVQpICYmICh5eXN0YXRlKCkgPT0gU1RfSlNQX0RJUkVDVElWRSB8fCB5eXN0YXRlKCkgPT0gU1RfSlNQX0VYUCB8fCB5eXN0YXRlKCkgPT0gU1RfSlNQX0RFQ0xBUkFUSU9OKSl7Ci0JCQkJCQljb250ZXh0ID0gbmV4dFRva2VuVHlwZTsKLQkJCQkJfQotCi0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCWlmIChuZXh0VG9rZW5UeXBlID09IG51bGwpewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGNvbnRleHQgPT0gQ1NTX0pTUF9TQ1JJUFRMRVQpewotCQkJCQl3aGlsZSAobmV4dFRva2VuVHlwZSAhPSBDU1NfSlNQX0NPTU1FTlRfRU5EKSB7Ci0vLwkJCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJCXRleHRMZW5ndGggKz0geXlsZW5ndGgoKTsKLQkJCQkJCWxlbmd0aCA9IHRleHRMZW5ndGg7Ci0JCQkJCQlpZiAoY29udGV4dC5lcXVhbHMoQ1NTX0pTUF9TQ1JJUFRMRVQpICYmIHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCl7Ci0JCQkJCQkJY29udGV4dCA9IG5leHRUb2tlblR5cGU7Ci0JCQkJCQl9Ci0KLQkJCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCQlpZiAobmV4dFRva2VuVHlwZSA9PSBudWxsKXsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQkJCQkKLQkJCQkJaWYgKGNvbnRleHQgPT0gQ1NTX0pTUF9DT01NRU5UKXsKLQkJCQkJCWNvbnRleHQgPSBDU1NfQ09NTUVOVDsKLQkJCQkJfQotCQkJCX0KLQkJCQl0ZXh0TGVuZ3RoICs9IHl5bGVuZ3RoKCk7Ci0JCQkJbGVuZ3RoID0gdGV4dExlbmd0aDsKLQkJCQkKLQkJCX0KLQkJCWlmIChjb250ZXh0ID09IFVOREVGSU5FRCkgewotCQkJCS8vIHVuZGVmIC0+IGNvbmNhdGVuYXRlIHVuZGVmJ3MKLQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCXdoaWxlIChuZXh0VG9rZW5UeXBlID09IFVOREVGSU5FRCkgewotLy8JCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCX0KLQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsKLS8vCQkJCWZCdWZmZXJlZFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsKLQkJCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsKLQkJCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOwotCQkJfSBlbHNlIHsKLQkJCQluZXh0VG9rZW5UeXBlID0gbnVsbDsKLQkJCQlzcGFjZUZvbGxvd3MgPSBmYWxzZTsKLQkJCQlpZiAoQ1NTUmVnaW9uVXRpbC5pc0RlY2xhcmF0aW9uVmFsdWVUeXBlKGNvbnRleHQpKSB7IC8vIGRlY2xhcmF0aW9uIHZhbHVlIGNhbiBjb250YWluIFZBTFVFX1MKLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJc3BhY2VGb2xsb3dzID0gKG5leHRUb2tlblR5cGUgPT0gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MpOwotCQkJCX0gZWxzZSBpZiAoY2FuQ29udGFpblNwYWNlKGNvbnRleHQpKSB7Ci0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXNwYWNlRm9sbG93cyA9IChuZXh0VG9rZW5UeXBlID09IENTU19TKTsKLQkJCQl9Ci0JCQkJaWYgKG5leHRUb2tlblR5cGUgIT0gbnVsbCkgeyAvLyBuZXh0VG9rZW4gaXMgcmV0cmlldmVkCi0JCQkJCWlmIChzcGFjZUZvbGxvd3MpIHsKLQkJCQkJCS8vIG5leHQgaXMgc3BhY2UgLT4gYXBwZW5kCi0vLwkJCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJCWxlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gbmV4dCBpcyBOT1Qgc3BhY2UgLT4gcHVzaCB0aGlzIGZvciBuZXh0IHRpbWUsIHJldHVybiBpdHNlbGYKLQkJCQkJCWZCdWZmZXJlZENvbnRleHQgPSBuZXh0VG9rZW5UeXBlOwotLy8JCQkJCQlmQnVmZmVyZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7Ci0JCQkJCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsKLQkJCQkJCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAoY29udGV4dCA9PSBVTkRFRklORUQpIHsKLQkJCQljb250ZXh0ID0gQ1NTX1VOS05PV047Ci0JCQl9Ci0JCQlyZXR1cm4gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlUmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLSAgCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0JLyogZm9yIHN0YW5kYWxvbmUgdXNlICovCi0gIAlwdWJsaWMgZmluYWwgTGlzdCBwYXJzZVRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAJCUxpc3QgdG9rZW5zID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIAkJQ1NTVGV4dFRva2VuIHRva2VuOwotCQlmb3IgKFN0cmluZyBraW5kID0gcHJpbUdldE5leHRUb2tlbigpOyBraW5kICE9IG51bGw7IGtpbmQgPSBwcmltR2V0TmV4dFRva2VuKCkpIHsKLQkJCXRva2VuID0gbmV3IENTU1RleHRUb2tlbigpOwotCQkJdG9rZW4ua2luZCA9IGtpbmQ7ICAJCQkJCi0JCQl0b2tlbi5zdGFydCA9IHl5Y2hhcjsKLQkJCXRva2VuLmxlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQl0b2tlbi5pbWFnZSA9IHl5dGV4dCgpOwotCQkJdG9rZW5zLmFkZCh0b2tlbik7Ci0JCX0KLQotICAJCXJldHVybiB0b2tlbnM7Ci0gIAl9Ci0gIAkKLSAgCS8qIHVzZXIgbWV0aG9kICovCi0gIAlwcml2YXRlIGJvb2xlYW4gY2FuQ29udGFpblNwYWNlKFN0cmluZyB0eXBlKSB7Ci0gIAkJaWYgKHR5cGUgPT0gQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0gIAkJCXJldHVybiBmYWxzZTsKLSAgCQl9IGVsc2UgewotICAJCQlyZXR1cm4gdHJ1ZTsKLSAgCQl9Ci0gIAl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4geXljaGFyOwotCX0KLQkKLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRU9GKCkgewotCQlyZXR1cm4genpBdEVPRjsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsKLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluLCBpbnQgbmV3T2Zmc2V0KSB7Ci0JCS8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JCXp6UmVhZGVyID0gaW47Ci0KLQkJLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLQkJenpTdGF0ZSA9IDA7Ci0KLQkJLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLQkJenpMZXhpY2FsU3RhdGUgPSBmSW5pdGlhbFN0YXRlOyAvL1lZSU5JVElBTDsKLQotCQkvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotCQkJdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0JCWlmICh6ekJ1ZmZlci5sZW5ndGggIT0gZkluaXRpYWxCdWZmZXJTaXplKSB7Ci0JCQl6ekJ1ZmZlciA9IG5ldyBjaGFyW2ZJbml0aWFsQnVmZmVyU2l6ZV07Ci0JCX0KLQkJamF2YS51dGlsLkFycmF5cy5maWxsKHp6QnVmZmVyLCAoY2hhcikwKTsKLQotCQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLQkJenpNYXJrZWRQb3MgPSAwOwotCi0JCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCQl6elB1c2hiYWNrUG9zID0gMDsKLQotCQkvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JCXp6Q3VycmVudFBvcyA9IDA7Ci0KLQkJLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotCQl6elN0YXJ0UmVhZCA9IDA7Ci0KLQkJLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotCQkJZnJvbSBpbnB1dCAqLwotCQl6ekVuZFJlYWQgPSAwOwotCi0JCS8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkJeXlsaW5lID0gMDsKLQotCQkvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCXl5Y2hhciA9IDA7Ci0KLQkJLyoqCi0JCSAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLQkJICogbWF0Y2hlZCB0ZXh0Ci0JCSAqLwotCQkvL3l5Y29sdW1uID0gMDsgCi0KLQkJLyoqIAotCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLQkJICovCi0JCS8venpBdEJPTCA9IGZhbHNlOwotCQkKLQkJLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQkJenpBdEVPRiA9IGZhbHNlOwotCi0JCS8qIHVzZXIgdmFyaWFibGVzICovCi0JCS8vCQlmVW5kZWZpbmVkLmRlbGV0ZSgwLCBmVW5kZWZpbmVkLmxlbmd0aCgpKTsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBKU1BlZENTU1Rva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgZkpTUFByZXZpb3VzU3RhdGUgPSBmSW5pdGlhbFN0YXRlOwotCXByaXZhdGUgdm9pZCB5eUpzcEJlZ2luKGludCBuZXdzdGF0ZSl7Ci0JCWZKU1BQcmV2aW91c1N0YXRlID0geXlzdGF0ZSgpOwotCQl5eWJlZ2luKG5ld3N0YXRlKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHl5SnNwRW5kKCl7Ci0JCXl5YmVnaW4oZkpTUFByZXZpb3VzU3RhdGUpOwotCX0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBKU1BlZENTU1Rva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMuenpSZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIEpTUGVkQ1NTVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10genpVbnBhY2tDTWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDE3MCkgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogUmVmaWxscyB0aGUgaW5wdXQgYnVmZmVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpZmYgdGhlcmUgd2FzIG5ldyBpbnB1dC4KLSAgICogCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6UmVmaWxsKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoenpTdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCB6elN0YXJ0UmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgenpCdWZmZXIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIHp6RW5kUmVhZC16elN0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB6ekVuZFJlYWQtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6Q3VycmVudFBvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpNYXJrZWRQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6UHVzaGJhY2tQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6U3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHp6Q3VycmVudFBvcyA+PSB6ekJ1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3p6Q3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgenpCdWZmZXIubGVuZ3RoKTsKLSAgICAgIHp6QnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0genpSZWFkZXIucmVhZCh6ekJ1ZmZlciwgenpFbmRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlci5sZW5ndGgtenpFbmRSZWFkKTsKLQotICAgIGlmIChudW1SZWFkIDwgMCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgenpFbmRSZWFkKz0gbnVtUmVhZDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHp6QXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgenpFbmRSZWFkID0genpTdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotCi0gICAgaWYgKHp6UmVhZGVyICE9IG51bGwpCi0gICAgICB6elJlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmVzZXRzIHRoZSBzY2FubmVyIHRvIHJlYWQgZnJvbSBhIG5ldyBpbnB1dCBzdHJlYW0uCi0gICAqIERvZXMgbm90IGNsb3NlIHRoZSBvbGQgcmVhZGVyLgotICAgKgotICAgKiBBbGwgaW50ZXJuYWwgdmFyaWFibGVzIGFyZSByZXNldCwgdGhlIG9sZCBpbnB1dCBzdHJlYW0gCi0gICAqIDxiPmNhbm5vdDwvYj4gYmUgcmV1c2VkIChpbnRlcm5hbCBidWZmZXIgaXMgZGlzY2FyZGVkIGFuZCBsb3N0KS4KLSAgICogTGV4aWNhbCBzdGF0ZSBpcyBzZXQgdG8gPHR0PlpaX0lOSVRJQUw8L3R0Pi4KLSAgICoKLSAgICogQHBhcmFtIHJlYWRlciAgIHRoZSBuZXcgaW5wdXQgc3RyZWFtIAotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgeXlyZXNldChqYXZhLmlvLlJlYWRlciByZWFkZXIpIHsKLSAgICB6elJlYWRlciA9IHJlYWRlcjsKLSAgIC8vIHp6QXRCT0wgID0gdHJ1ZTsKLSAgICB6ekF0RU9GICA9IGZhbHNlOwotICAgIHp6RW5kUmVhZCA9IHp6U3RhcnRSZWFkID0gMDsKLSAgICB6ekN1cnJlbnRQb3MgPSB6ek1hcmtlZFBvcyA9IHp6UHVzaGJhY2tQb3MgPSAwOwotICAgIHl5bGluZSA9IHl5Y2hhciA9IDA7Ly95eWNvbHVtbiA9IDA7Ci0gICAgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBwdWJsaWMgZmluYWwgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHp6TGV4aWNhbFN0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB6ekxleGljYWxTdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB6ekJ1ZmZlciwgenpTdGFydFJlYWQsIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkICk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gPHR0PnBvczwvdHQ+IGZyb20gdGhlIAotICAgKiBtYXRjaGVkIHRleHQuIAotICAgKiAKLSAgICogSXQgaXMgZXF1aXZhbGVudCB0byB5eXRleHQoKS5jaGFyQXQocG9zKSwgYnV0IGZhc3RlcgotICAgKgotICAgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIHRvIGZldGNoLiAKLSAgICogICAgICAgICAgICBBIHZhbHVlIGZyb20gMCB0byB5eWxlbmd0aCgpLTEuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiBwb3MKLSAgICovCi0gIHB1YmxpYyBmaW5hbCBjaGFyIHl5Y2hhcmF0KGludCBwb3MpIHsKLSAgICByZXR1cm4genpCdWZmZXJbenpTdGFydFJlYWQrcG9zXTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEluIGEgd2VsbGZvcm1lZCBzY2FubmVyIChubyBvciBvbmx5IGNvcnJlY3QgdXNhZ2Ugb2YgCi0gICAqIHl5cHVzaGJhY2soaW50KSBhbmQgYSBtYXRjaC1hbGwgZmFsbGJhY2sgcnVsZSkgdGhpcyBtZXRob2QgCi0gICAqIHdpbGwgb25seSBiZSBjYWxsZWQgd2l0aCB0aGluZ3MgdGhhdCAiQ2FuJ3QgUG9zc2libHkgSGFwcGVuIi4KLSAgICogSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBzb21ldGhpbmcgaXMgc2VyaW91c2x5IHdyb25nCi0gICAqIChlLmcuIGEgSkZsZXggYnVnIHByb2R1Y2luZyBhIGZhdWx0eSBzY2FubmVyIGV0Yy4pLgotICAgKgotICAgKiBVc3VhbCBzeW50YXgvc2Nhbm5lciBsZXZlbCBlcnJvciBoYW5kbGluZyBzaG91bGQgYmUgZG9uZQotICAgKiBpbiBlcnJvciBmYWxsYmFjayBydWxlcy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB6elNjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgdHJ5IHsKLSAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbZXJyb3JDb2RlXTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBtZXNzYWdlID0gWlpfRVJST1JfTVNHW1paX1VOS05PV05fRVJST1JdOwotICAgIH0KLQotICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICBwdWJsaWMgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpICB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHp6U2NhbkVycm9yKFpaX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgenpNYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHp6SW5wdXQ7Ci0gICAgaW50IHp6QWN0aW9uOwotCi0gICAgLy8gY2FjaGVkIGZpZWxkczoKLSAgICBpbnQgenpDdXJyZW50UG9zTDsKLSAgICBpbnQgenpNYXJrZWRQb3NMOwotICAgIGludCB6ekVuZFJlYWRMID0genpFbmRSZWFkOwotICAgIGNoYXIgW10genpCdWZmZXJMID0genpCdWZmZXI7Ci0gICAgY2hhciBbXSB6ekNNYXBMID0gWlpfQ01BUDsKLQotICAgIGludCBbXSB6elRyYW5zTCA9IFpaX1RSQU5TOwotICAgIGludCBbXSB6elJvd01hcEwgPSBaWl9ST1dNQVA7Ci0gICAgaW50IFtdIHp6QXR0ckwgPSBaWl9BVFRSSUJVVEU7Ci0gICAgaW50IHp6UHVzaGJhY2tQb3NMID0genpQdXNoYmFja1BvcyA9IC0xOwotICAgIGJvb2xlYW4genpXYXNQdXNoYmFjazsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLQotICAgICAgeXljaGFyKz0genpNYXJrZWRQb3NMLXp6U3RhcnRSZWFkOwotCi0gICAgICBib29sZWFuIHp6UiA9IGZhbHNlOwotICAgICAgZm9yICh6ekN1cnJlbnRQb3NMID0genpTdGFydFJlYWQ7IHp6Q3VycmVudFBvc0wgPCB6ek1hcmtlZFBvc0w7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenpDdXJyZW50UG9zTCsrKSB7Ci0gICAgICAgIHN3aXRjaCAoenpCdWZmZXJMW3p6Q3VycmVudFBvc0xdKSB7Ci0gICAgICAgIGNhc2UgJ1x1MDAwQic6Ci0gICAgICAgIGNhc2UgJ1x1MDAwQyc6Ci0gICAgICAgIGNhc2UgJ1x1MDA4NSc6Ci0gICAgICAgIGNhc2UgJ1x1MjAyOCc6Ci0gICAgICAgIGNhc2UgJ1x1MjAyOSc6Ci0gICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgenpSID0gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICB5eWxpbmUrKzsKLSAgICAgICAgICB6elIgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgaWYgKHp6UikKLSAgICAgICAgICAgIHp6UiA9IGZhbHNlOwotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHp6UiA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh6elIpIHsKLSAgICAgICAgLy8gcGVlayBvbmUgY2hhcmFjdGVyIGFoZWFkIGlmIGl0IGlzIFxuIChpZiB3ZSBoYXZlIGNvdW50ZWQgb25lIGxpbmUgdG9vIG11Y2gpCi0gICAgICAgIGJvb2xlYW4genpQZWVrOwotICAgICAgICBpZiAoenpNYXJrZWRQb3NMIDwgenpFbmRSZWFkTCkKLSAgICAgICAgICB6elBlZWsgPSB6ekJ1ZmZlckxbenpNYXJrZWRQb3NMXSA9PSAnXG4nOwotICAgICAgICBlbHNlIGlmICh6ekF0RU9GKQotICAgICAgICAgIHp6UGVlayA9IGZhbHNlOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBib29sZWFuIGVvZiA9IHp6UmVmaWxsKCk7Ci0gICAgICAgICAgenpFbmRSZWFkTCA9IHp6RW5kUmVhZDsKLSAgICAgICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLSAgICAgICAgICB6ekJ1ZmZlckwgPSB6ekJ1ZmZlcjsKLSAgICAgICAgICBpZiAoZW9mKSAKLSAgICAgICAgICAgIHp6UGVlayA9IGZhbHNlOwotICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICB6elBlZWsgPSB6ekJ1ZmZlckxbenpNYXJrZWRQb3NMXSA9PSAnXG4nOwotICAgICAgICB9Ci0gICAgICAgIGlmICh6elBlZWspIHl5bGluZS0tOwotICAgICAgfQotICAgICAgenpBY3Rpb24gPSAtMTsKLQotICAgICAgenpDdXJyZW50UG9zTCA9IHp6Q3VycmVudFBvcyA9IHp6U3RhcnRSZWFkID0genpNYXJrZWRQb3NMOwotICAKLSAgICAgIHp6U3RhdGUgPSB6ekxleGljYWxTdGF0ZTsKLQotICAgICAgenpXYXNQdXNoYmFjayA9IGZhbHNlOwotCi0gICAgICB6ekZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgIAotICAgICAgICAgIGlmICh6ekN1cnJlbnRQb3NMIDwgenpFbmRSZWFkTCkKLSAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICBlbHNlIGlmICh6ekF0RU9GKSB7Ci0gICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbnMKLSAgICAgICAgICAgIHp6Q3VycmVudFBvcyAgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgenpNYXJrZWRQb3MgICA9IHp6TWFya2VkUG9zTDsKLSAgICAgICAgICAgIHp6UHVzaGJhY2tQb3MgPSB6elB1c2hiYWNrUG9zTDsKLSAgICAgICAgICAgIGJvb2xlYW4gZW9mID0genpSZWZpbGwoKTsKLSAgICAgICAgICAgIC8vIGdldCB0cmFuc2xhdGVkIHBvc2l0aW9ucyBhbmQgcG9zc2libHkgbmV3IGJ1ZmZlcgotICAgICAgICAgICAgenpDdXJyZW50UG9zTCAgPSB6ekN1cnJlbnRQb3M7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgICA9IHp6TWFya2VkUG9zOwotICAgICAgICAgICAgenpCdWZmZXJMICAgICAgPSB6ekJ1ZmZlcjsKLSAgICAgICAgICAgIHp6RW5kUmVhZEwgICAgID0genpFbmRSZWFkOwotICAgICAgICAgICAgenpQdXNoYmFja1Bvc0wgPSB6elB1c2hiYWNrUG9zOwotICAgICAgICAgICAgaWYgKGVvZikgewotICAgICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICAgIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaW50IHp6TmV4dCA9IHp6VHJhbnNMWyB6elJvd01hcExbenpTdGF0ZV0gKyB6ekNNYXBMW3p6SW5wdXRdIF07Ci0gICAgICAgICAgaWYgKHp6TmV4dCA9PSAtMSkgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgenpTdGF0ZSA9IHp6TmV4dDsKLQotICAgICAgICAgIGludCB6ekF0dHJpYnV0ZXMgPSB6ekF0dHJMW3p6U3RhdGVdOwotICAgICAgICAgIGlmICggKHp6QXR0cmlidXRlcyAmIDIpID09IDIgKQotICAgICAgICAgICAgenpQdXNoYmFja1Bvc0wgPSB6ekN1cnJlbnRQb3NMOwotCi0gICAgICAgICAgaWYgKCAoenpBdHRyaWJ1dGVzICYgMSkgPT0gMSApIHsKLSAgICAgICAgICAgIHp6V2FzUHVzaGJhY2sgPSAoenpBdHRyaWJ1dGVzICYgNCkgPT0gNDsKLSAgICAgICAgICAgIHp6QWN0aW9uID0genpTdGF0ZTsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zTCA9IHp6Q3VycmVudFBvc0w7Ci0gICAgICAgICAgICBpZiAoICh6ekF0dHJpYnV0ZXMgJiA4KSA9PSA4ICkgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb24KLSAgICAgIHp6TWFya2VkUG9zID0genpNYXJrZWRQb3NMOwotICAgICAgaWYgKHp6V2FzUHVzaGJhY2spCi0gICAgICAgIHp6TWFya2VkUG9zID0genpQdXNoYmFja1Bvc0w7Ci0KLSAgICAgIHN3aXRjaCAoenpBY3Rpb24gPCAwID8genpBY3Rpb24gOiBaWl9BQ1RJT05benpBY3Rpb25dKSB7Ci0gICAgICAgIGNhc2UgMzg6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19TVFJJTkc7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDYwOiBicmVhazsKLSAgICAgICAgY2FzZSAzOTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT047Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDYxOiBicmVhazsKLSAgICAgICAgY2FzZSA0NDogCi0gICAgICAgICAgeyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1M7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDYyOiBicmVhazsKLSAgICAgICAgY2FzZSA0MTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjM6IGJyZWFrOwotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDY0OiBicmVhazsKLSAgICAgICAgY2FzZSAxOiAKLSAgICAgICAgICB7IHJldHVybiBVTkRFRklORUQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDY1OiBicmVhazsKLSAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfSU1QT1JUX0RFTElNSVRFUik7IHJldHVybiBDU1NfTUVESVVNOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDI6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ0xBU1M7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDY4OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfTEJSQUNFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfUkJSQUNFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9NRURJQV9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX01FRElVTTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzE6IGJyZWFrOwotICAgICAgICBjYXNlIDk6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19NRURJQV9TRVBBUkFUT1I7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDcyOiBicmVhazsKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTg6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9GT05UX0ZBQ0VfREVMSU1JVEVSKTsgcmV0dXJuIENTU19GT05UX0ZBQ0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDc0OiBicmVhazsKLSAgICAgICAgY2FzZSA1NzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0NIQVJTRVRfTkFNRSk7IHJldHVybiBDU1NfQ0hBUlNFVDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzU6IGJyZWFrOwotICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgICB7IHl5SnNwRW5kKCk7IHJldHVybiBDU1NfRUxfRU5EOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDY6IAotICAgICAgICAgIHsgeXlKc3BFbmQoKTsgIHJldHVybiBDU1NfSlNQX0VORDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzc6IGJyZWFrOwotICAgICAgICBjYXNlIDUzOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfVVJJOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzk6IGJyZWFrOwotICAgICAgICBjYXNlIDQ3OiAKLSAgICAgICAgICB7IHJldHVybiBDU1NfQ0RDOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfTEJSQUNFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9VTklWRVJTQUw7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDgyOiBicmVhazsKLSAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODM6IGJyZWFrOwotICAgICAgICBjYXNlIDQ5OiAKLSAgICAgICAgICB7IHJldHVybiBDU1NfQ0RPOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfREVMSU1JVEVSOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDM6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODc6IGJyZWFrOwotICAgICAgICBjYXNlIDUyOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfUEFHRV9QU0VVRE9fUEFHRSk7IHJldHVybiBDU1NfUEFHRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODg6IGJyZWFrOwotICAgICAgICBjYXNlIDI6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9DSEFSU0VUX0RFTElNSVRFUik7IHJldHVybiBDU1NfU1RSSU5HOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzU6IAotICAgICAgICAgIHsgeXlKc3BCZWdpbihTVF9KU1BfRUwpOyAgcmV0dXJuIENTU19KU1BfRUw7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDkxOiBicmVhazsKLSAgICAgICAgY2FzZSAyNDogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVI7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDkyOiBicmVhazsKLSAgICAgICAgY2FzZSAxNTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9DT01CSU5BVE9SOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDg6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfVU5JQ09ERV9SQU5HRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDQwOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDk1OiBicmVhazsKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX01FRElBX01FRElVTSk7IHJldHVybiBDU1NfTUVESUFfU0VQQVJBVE9SOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDk3OiBicmVhazsKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1BBR0VfREVMSU1JVEVSKTsgcmV0dXJuIENTU19QQUdFX1NFTEVDVE9SOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1I7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDk5OiBicmVhazsKLSAgICAgICAgY2FzZSA1MDogCi0gICAgICAgICAgeyByZXR1cm4gQ1NTX0NPTU1FTlQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDEwMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTk6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5UOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMDE6IGJyZWFrOwotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORCk7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMDI6IGJyZWFrOwotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1NFUEFSQVRPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTAzOiBicmVhazsKLSAgICAgICAgY2FzZSAzOiAKLSAgICAgICAgICB7IHJldHVybiBDU1NfUzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTA0OiBicmVhazsKLSAgICAgICAgY2FzZSA1MTogCi0gICAgICAgICAgeyB5eUpzcEVuZCgpOyByZXR1cm4gQ1NTX0pTUF9DT01NRU5UX0VORDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTA1OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9JRDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTA2OiBicmVhazsKLSAgICAgICAgY2FzZSAzMDogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0pTUF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfSlNQX0RFQ0w7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDEwNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTY6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9JTVBPUlRfVVJJKTsgcmV0dXJuIENTU19JTVBPUlQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDEwODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDEwOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTU6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9NRURJQV9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMTA6IGJyZWFrOwotICAgICAgICBjYXNlIDI5OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfSlNQX0VYUCk7IHJldHVybiBDU1NfSlNQX0VYUDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTExOiBicmVhazsKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9ERUxJTUlURVI7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDExMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfUFNFVURPOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMTM6IGJyZWFrOwotICAgICAgICBjYXNlIDIxOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9QUk9QRVJUWTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTE0OiBicmVhazsKLSAgICAgICAgY2FzZSA0NTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsgcmV0dXJuIENTU19KU1BfQ09NTUVOVDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTE1OiBicmVhazsKLSAgICAgICAgY2FzZSAzNDogCi0gICAgICAgICAgeyB5eUpzcEJlZ2luKFNUX0pTUF9TQ1JJUFRMRVQpOyAgcmV0dXJuIENTU19KU1BfU0NSSVBUTEVUOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMTY6IGJyZWFrOwotICAgICAgICBjYXNlIDU0OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTE3OiBicmVhazsKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkUpOyByZXR1cm4gQ1NTX0pTUF9ESVJFQ1RJVkU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDExODogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh6eklucHV0ID09IFlZRU9GICYmIHp6U3RhcnRSZWFkID09IHp6Q3VycmVudFBvcykgewotICAgICAgICAgICAgenpBdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgenpTY2FuRXJyb3IoWlpfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0pTUGVkQ1NTUmVnaW9uQ29udGV4dHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovSlNQZWRDU1NSZWdpb25Db250ZXh0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTFiMTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovSlNQZWRDU1NSZWdpb25Db250ZXh0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLnBhcnNlcno7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLQotcHVibGljIGludGVyZmFjZSBKU1BlZENTU1JlZ2lvbkNvbnRleHRzIGV4dGVuZHMgQ1NTUmVnaW9uQ29udGV4dHMgewkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfSlNQX0VYUCA9ICJDU1NfSlNQX0VYUCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfSlNQX0VMID0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPUkVJR05fRUxFTUVOVDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19KU1BfU0NSSVBUTEVUID0gIkNTU19KU1BfU0NSSVBUTEVUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19KU1BfRElSRUNUSVZFID0gIkNTU19KU1BfRElSRUNUSVZFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19KU1BfREVDTCA9ICJDU1NfSlNQX0RFQ0wiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0pTUF9FTkQgPSAiQ1NTX0pTUF9FTkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0VMX0VORCA9ICJDU1NfRUxfRU5EIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19KU1BfQ09NTUVOVF9FTkQgPSAiQ1NTX0pTUF9DT01NRU5UX0VORCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfSlNQX0NPTU1FTlQgPSAiQ1NTX0pTUF9DT01NRU5UIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2ZTIxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIgotCQlwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40IiAvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iCi0JCXBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlLyoqIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvKioiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS8qKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS8qKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3NzZS91aS8qKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3htbC91aS8qKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS8qKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvKioiIC8+CQkJCQotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvamF2YXNjcmlwdC91aS8qKiIgLz4JCi0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uLyoqIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL2NvbXBvbmVudGNvcmUvaW50ZXJuYWwvdXRpbC9JTW9kdWxlQ29uc3RhbnRzIiAvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIiAvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDBjMjY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLWpzcGVkaXRvci5qYXIKLXRlbXAuZm9sZGVyCi1vcmcuZWNsaXBzZS5qc3QuanNwLnVpXzYuMC4wLmphcgotYnVpbGQueG1sCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNzRkNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2RlYnVnL2pzcGNvbnRlbnRhc3Npc3Q9ZmFsc2UKLW9yZy5lY2xpcHNlLmpzdC5qc3AudWkvcHJvamVjdGlvbnBlcmY9ZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNDJlNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmpzcC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTY5N2RmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jV2VkIE1hciAyOCAwMzoxMTo0NSBFRFQgMjAwNw0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjINCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDANCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWM3YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzUyMmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOWUwZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5qc3AudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4zMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MudWkuaW50ZXJuYWwucmVnaXN0cnk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy51aS5pbnRlcm5hbC52aWV3cy5wcm9wZXJ0aWVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5hdXRvZWRpdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYnJlYWtwb2ludHByb3ZpZGVyczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmRlcml2ZWQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZm9ybWF0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oYW5kbGVyczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2gudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucmVnaXN0cnk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qc3BlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGFnaW5mbzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC52YWxpZGF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCwzLjQuMF0iLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMzAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC40MDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjIuMTAwLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuZGVidWc7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uuc2VhcmNoO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDEsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjguMSw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzBmODdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIHRlbXBsYXRlcy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKLWFkZGl0aW9uYWwuYnVuZGxlcyA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLm1hbmlwdWxhdGlvbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdqc3Bfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3anNwX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZjliMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdqc3Bfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3anNwX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2pzcF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDk0NGFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3anNwX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9jbGFzc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2xhc3Nfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAwMTE4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9jbGFzc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZGVmYXVsdF9jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9kZWZhdWx0X2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlhMTQ2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9kZWZhdWx0X2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2ZpZWxkX2RlZmF1bHRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2ZpZWxkX2RlZmF1bHRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkyOWQzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9kZWZhdWx0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wcml2YXRlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wcml2YXRlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZTA2NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmllbGRfcHJpdmF0ZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmllbGRfcHJvdGVjdGVkX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wcm90ZWN0ZWRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3N2IxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wcm90ZWN0ZWRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2ZpZWxkX3B1YmxpY19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmllbGRfcHVibGljX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0Y2I0MjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmllbGRfcHVibGljX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX2RlZmF1bHRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfZGVmYXVsdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjQ0YTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfZGVmYXVsdF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJjbGFzc19wcml2YXRlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3ByaXZhdGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM5MmYxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3ByaXZhdGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfcHJvdGVjdGVkX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3Byb3RlY3RlZF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTA1NTc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfcHJvdGVjdGVkX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3B1YmxpY19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJjbGFzc19wdWJsaWNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjMmE4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3B1YmxpY19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJpbnRlcmZhY2VfZGVmYXVsdF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJpbnRlcmZhY2VfZGVmYXVsdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjFiNTc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX2RlZmF1bHRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3ByaXZhdGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3ByaXZhdGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFjYmZmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9wcml2YXRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9wcm90ZWN0ZWRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3Byb3RlY3RlZF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNThlZWYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3Byb3RlY3RlZF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJpbnRlcmZhY2VfcHVibGljX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9wdWJsaWNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViYzQ2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9wdWJsaWNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2xvY2FsdmFyaWFibGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2xvY2FsdmFyaWFibGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkY2U5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9sb2NhbHZhcmlhYmxlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wYWNrYWdlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wYWNrYWdlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMWMyOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcGFja2FnZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJpdmF0ZV9jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wcml2YXRlX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI4ODFkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wcml2YXRlX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3Byb3RlY3RlZF9jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm90ZWN0ZWRfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDgzYjk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3Byb3RlY3RlZF9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wdWJsaWMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHVibGljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QyNDcwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wdWJsaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHVibGljX2NvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3B1YmxpY19jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YWY1ZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHVibGljX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWViZGI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZjUxNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWpzcC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctanNwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4NDYwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctanNwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctdGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDFmODFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3anNwZmlsZV93aXoucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld2pzcGZpbGVfd2l6LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEwZmYwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3anNwZmlsZV93aXoucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcGRlY2wuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcGRlY2wuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWY0OGVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9zbmlwcGV0cy9qc3BkZWNsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9zbmlwcGV0cy9qc3BleHAuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcGV4cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNGQ3NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcGV4cC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwaW5jbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwaW5jbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ODRjMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcGluY2wuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcHNjci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwc2NyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc1M2I5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwc2NyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9zbmlwcGV0cy9qc3B0YWdsaWIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcHRhZ2xpYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTVlMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcHRhZ2xpYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvdGFnLWdlbmVyaWMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL3RhZy1nZW5lcmljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3ZmIzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvdGFnLWdlbmVyaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL3RhZy1qc3AuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL3RhZy1qc3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTRkZTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9zbmlwcGV0cy90YWctanNwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU2M2U0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIE1hdHRoaWFzIEZ1ZXNzZWwsIG1hdC5mdWVzc2VsQGdteC5uZXQgLSBbMTc3Mzg3XSB1c2UgYmFzZSBoeXBlcmxpbmtpbmcgZXh0ZW5zaW9uIHBvaW50cwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVNTRSBKU1AgU291cmNlIEVkaXRvcgotSlNQX1NvdXJjZV9QYWdlX0VkaXRvci5uYW1lPUpTUCBFZGl0b3IKLUNTU19KU1BfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWU9Q1NTIEpTUCBFZGl0b3IKLUpTUF9GaWxlcy5uYW1lPUpTUCBGaWxlcwotSlNQX1NvdXJjZS5uYW1lPUVkaXRvcgotSlNQX1RlbXBsYXRlcy5uYW1lPVRlbXBsYXRlcwotSlNQX1N0eWxlcy5uYW1lPVN0eWxlcwotSlNQX1N5bnRheF9Db2xvcmluZz1TeW50YXggQ29sb3JpbmcKLUpTUF9Tb3VyY2VfdGFyZ2V0X25hbWU9SlNQIFNvdXJjZQotSlNQX1ZhbGlkYXRpb249VmFsaWRhdGlvbgotSlNQX1Byb3BlcnR5X3ZhbGlkYXRpb249SlNQIFN5bnRheAotSlNQX1R5cGluZz1UeXBpbmcKLQotIyBTbmlwcGV0cyBjb250cmlidXRpb25zIGZvciBoZWxwaW5nIHdpdGggSlNQIHN5bnRheAotanNwX3NjcmlwdGxldD08JS4uJT4gc2NyaXB0bGV0Ci1qc3Bfc2NyX2NvbnRlbnQ9PCUgICU+Ci1qc3BfaGlkZGVuX2NvbW1lbnQ9PCUtLS4uLS0lPiBjb21tZW50Ci1qc3BfaGlkZGVuX2NvbW1lbnRfY29udGVudD08JS0tICAtLSU+Ci1qc3BfZGVjbGFyYXRpb249PCUhLi4lPiBkZWNsYXJhdGlvbgotanNwX2RlY2xhcmF0aW9uX2NvbnRlbnQ9PCUhICAlPgotanNwX2V4cHJlc3Npb249PCU9Li4lPiBleHByZXNzaW9uCi1qc3BfZXhwcmVzc2lvbl9jb250ZW50PTwlPSAgJT4KLWpzcF9pbmNsdWRlX2RpcmVjdGl2ZT1pbmNsdWRlIGRpcmVjdGl2ZQotanNwX2luY2x1ZGVfZGlyZWN0aXZlX2NvbnRlbnQ9PCVAIGluY2x1ZGUgZmlsZT0iIiAlPgotanNwX3BhZ2VfZGlyZWN0aXZlPXBhZ2UgZGlyZWN0aXZlCi1qc3BfcGFnZV9kaXJlY3RpdmVfY29udGVudD08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PSIgJT4KLWpzcF90YWdsaWJfZGlyZWN0aXZlPXRhZ2xpYiBkaXJlY3RpdmUKLWpzcF90YWdsaWJfZGlyZWN0aXZlX2NvbnRlbnQ9PCVAIHRhZ2xpYiB1cmk9IiR7dXJpfSIgcHJlZml4PSIke3ByZWZpeH0iICU+Ci1qc3BfdGFnbGliX2RpcmVjdGl2ZV91cmk9VVJJIHRvIHRoZSBjb250YWluaW5nIEpBUiBmaWxlIG9yIHRhZ2xpYiBkZXNjcmlwdG9yICgudGxkKQotanNwX3RhZ2xpYl9kaXJlY3RpdmVfcHJlZml4PU5hbWVzcGFjZSBwcmVmaXggZm9yIHRhZ3MgZnJvbSB0aGlzIGxpYnJhcnkKLUpTUEZyYWdtZW50Q29udGVudFNldHRpbmdzLm5hbWU9SlNQIEZyYWdtZW50Ci1jb21tYW5kLmpzcC5yZWZhY3Rvci5yZW5hbWUubmFtZT1SZW5hbWUKLWNvbW1hbmQuanNwLnJlZmFjdG9yLnJlbmFtZS5kZXNjcmlwdGlvbj1SZW5hbWUgYSBKYXZhIEVsZW1lbnQKLWNvbW1hbmQuanNwLnJlZmFjdG9yLm1vdmUubmFtZT1Nb3ZlCi1jb21tYW5kLmpzcC5yZWZhY3Rvci5tb3ZlLmRlc2NyaXB0aW9uPU1vdmUgYSBKYXZhIEVsZW1lbnQgdG8gYW5vdGhlciBwYWNrYWdlCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmpzcC5uYW1lPUVkaXRpbmcgSlNQIFNvdXJjZQotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5qc3AuZGVzY3JpcHRpb249RWRpdGluZyBKU1AgU291cmNlCi1zY29wZS5qc3AuY29yZS5qc3Bzb3VyY2UubmFtZT1KU1AgU291cmNlCi1zY29wZS5qc3AuY29yZS5qc3Bzb3VyY2UuZGVzY3JpcHRpb249SlNQIFNvdXJjZQotSlNQX1R5cGVfUmVuYW1lX1BhcnRpY2lwYW50X0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SlNQIFR5cGUgUmVuYW1lIFBhcnRpY2lwYW50Ci1KU1BfTWV0aG9kX1JlbmFtZV9QYXJ0aWNpcGFudF9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUpTUCBNZXRob2QgUmVuYW1lIFBhcnRpY2lwYW50Ci1KU1BfUGFja2FnZV9SZW5hbWVfUGFydGljaXBhbnRfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1KU1AgUGFja2FnZSBSZW5hbWUgUGFydGljaXBhbnQKLUpTUF9UeXBlX01vdmVfUGFydGljaXBhbnRfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1KU1AgVHlwZSBNb3ZlIFBhcnRpY2lwYW50Ci1BbGxfSlNQX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUFsbCBKU1AKLUpTUF9OZXdfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9TmV3IEpTUAotVGFnX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1OZXcgVGFnCi1KU1BfVGFnX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUpTUCBUYWcKLUpTUF9BdHRyaWJ1dGVfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SlNQIEF0dHJpYnV0ZQotSlNQX0F0dHJpYnV0ZV92YWx1ZV9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1KU1AgQXR0cmlidXRlIHZhbHVlCi1KU1BfUXVlcnlfUGFydGljaXBhbnRfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1KU1AgUXVlcnkgUGFydGljaXBhbnQKLUpTUF9FeHRlbnNpb25fRWxlbWVudC5sYWJlbD1KU1AKLSNvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIGV4dGVuc2lvbiBwb2ludAotX1VJX1dJWkFSRF9OQU1FID0gSlNQCi1fVUlfV0laQVJEX0NSRUFURV9ORVdfRklMRSA9IENyZWF0ZSBhIG5ldyBKYXZhU2VydmVyIFBhZ2UKLV9VSV9XSVpBUkRfVEFHX05BTUUgPSBUYWcKLV9VSV9XSVpBUkRfVEFHX0NSRUFURV9ORVdfRklMRSA9IENyZWF0ZSBhIG5ldyBUYWcgZmlsZQotIyMKLUFkZFRhc2subGFiZWw9QWRkICZUYXNrLi4uCi1BZGRUYXNrLnRvb2x0aXA9QWRkIFRhc2suLi4KLUFkZEJvb2ttYXJrLmxhYmVsPUFkZCBCb28ma21hcmsuLi4KLUFkZEJvb2ttYXJrLnRvb2x0aXA9QWRkIEJvb2ttYXJrLi4uCi1TZWxlY3RSdWxlci5sYWJlbD1TZWxlY3QgUnVsZXIKLSMjIEVMIEVycm9yIE1lc3NhZ2UKLSMjCi1DbGVhbnVwRG9jdW1lbnRfbGFiZWw9Q2xlYW51cCBEb2N1bWVudC4uLgotQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA9Q2xlYW51cCBEb2N1bWVudAotVG9nZ2xlQ29tbWVudF9sYWJlbD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF90b29sdGlwPVRvZ2dsZSBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfbGFiZWw9QWRkIEJsb2NrIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF90b29sdGlwPUFkZCBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwPVJlbW92ZSBCbG9jayBDb21tZW50Ci1GaW5kT2NjdXJyZW5jZXNfbGFiZWw9T2NjdXJyZW5jZXMgaW4gRmlsZQotUmVuYW1lRWxlbWVudF9sYWJlbD1SZW5hbWUKLU1vdmVFbGVtZW50X2xhYmVsPU1vdmUKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbD1FbmNsb3NpbmcgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIGVuY2xvc2luZyBlbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsPU5leHQgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsPVByZXZpb3VzIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWw9UmVzdG9yZSBMYXN0IFNlbGVjdGlvbgotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwPVJlc3RvcmUgbGFzdCBzZWxlY3Rpb24KLSMjCi1wcmVmZXJlbmNlS2V5d29yZHMuZmlsZXM9ZWRpdG9yIGpzcCBjcmVhdGluZyBzYXZpbmcgZmlsZXMgc3VmZml4IHNwZWNpZmllZCBlbmNvZGluZyBpYW5hIHZhbGlkYXRpbmcgdmFsaWRhdGUgZnJhZ21lbnRzCi1wcmVmZXJlbmNlS2V5d29yZHMudGVtcGxhdGVzPWVkaXRvciBqc3AgdGVtcGxhdGVzIHNuaXBwZXQgbWFjcm9zCi1wcmVmZXJlbmNlS2V5d29yZHMuc3R5bGVzPWVkaXRvciBqc3Agc3R5bGUgY3VzdG9taXplIHN5bnRheCBoaWdobGlnaHRpbmcgdHlwZSB0ZXh0IGNvbnRlbnQgZm9yZWdyb3VuZCBiYWNrZ3JvdW5kIGJvbGQgY29sb3IKLXByZWZlcmVuY2VLZXl3b3Jkcy5mcmFnbWVudHM9ZWRpdG9yIGpzcCBmcmFnbWVudCBsYW5ndWFnZSBjb250ZW50IHR5cGUgdmFsaWRhdGUKLXByZWZlcmVuY2VLZXl3b3Jkcy5zZXZlcml0aWVzPWpzcCBlcnJvcnMgd2FybmluZ3MgaWdub3JlIG9wdGlvbnMgc2V2ZXJpdHkgc2V2ZXJpdGllcyBzdXBwcmVzcyBwcm9qZWN0IHNwZWNpZmljIHByb2plY3RzcGVjaWZpYwotCi0jIwotSlNQSmF2YV9oeXBlcmxpbms9SmF2YSBDb250ZW50IEluIEpTUAotVGFnbGliX2h5cGVybGluaz1UYWdsaWIgRGlyZWN0aXZlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2ZiMTYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotCQk8ZWRpdG9yCi0JCQluYW1lPSIlSlNQX1NvdXJjZV9QYWdlX0VkaXRvci5uYW1lIgotCQkJaWNvbj0iJG5sJC9pY29ucy8vZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmIgotCQkJZXh0ZW5zaW9ucz0ianNwLCBqc2YsIGpzcGYsIGpzcHgsIHRhZywgdGFneCwgdGFnZiIKLQkJCWNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkFjdGlvbkNvbnRyaWJ1dG9ySlNQIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IiCi0JCQlzeW1ib2xpY0ZvbnROYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2Uuc291cmNlIj4KLQkJCTxjb250ZW50VHlwZUJpbmRpbmcKLQkJCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCQk8L2VkaXRvcj4KLQkJPGVkaXRvcgotCQkJbmFtZT0iJUNTU19KU1BfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWUiCi0JCQlpY29uPSIkbmwkL2ljb25zLy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYiCi0JCQljb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5BY3Rpb25Db250cmlidXRvckpTUCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIgotCQkJc3ltYm9saWNGb250TmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlLnNvdXJjZSI+Ci0JCQk8Y29udGVudFR5cGVCaW5kaW5nCi0JCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIgLz4KLQkJCTxjb250ZW50VHlwZUJpbmRpbmcKLQkJCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwZnJhZ21lbnRzb3VyY2UiIC8+Ci0JCTwvZWRpdG9yPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLQkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgLz4KLQkJPGNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudmlld3MuY29udGVudG91dGxpbmUuSlNQQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCQk8cHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLnByb3BlcnRpZXMuWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0gIAkJPGRvY3VtZW50YXRpb25UZXh0SG92ZXIKLSAgICAgICAgCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRhZ2luZm8uSlNQVGFnSW5mb0hvdmVyUHJvY2Vzc29yIgotICAgICAgICAJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLkRFRkFVTFRfSlNQLCBvcmcuZWNsaXBzZS5qc3QuanNwLkpTUF9ESVJFQ1RJVkUiPgotICAJCTwvZG9jdW1lbnRhdGlvblRleHRIb3Zlcj4KLSAgCQk8ZG9jdW1lbnRhdGlvblRleHRIb3ZlcgotICAgICAgICAJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGFnaW5mby5KU1BKYXZhSmF2YWRvY0hvdmVyUHJvY2Vzc29yIgotICAgICAgICAJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLlNDUklQVC5KQVZBIj4KLSAgCQk8L2RvY3VtZW50YXRpb25UZXh0SG92ZXI+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9InNvdXJjZWVkaXRpbmd0ZXh0dG9vbHMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSlNQU291cmNlRWRpdGluZ1RleHRUb29scyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0iY2hhcmFjdGVycGFpcm1hdGNoZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZXh0LkpTUERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9InN0cnVjdHVyZWR0ZXh0Zm9sZGluZ3Byb3ZpZGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbi5TdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckpTUCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0icHJlZmVyZW5jZXBhZ2VzIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJlZmVyZW5jZXMuanNwLCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmpzcC5zb3VyY2UsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuanNwLnRlbXBsYXRlcywgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5qc3Auc3R5bGVzLCxvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnByZWZlcmVuY2VzLnZhbGlkYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbERlZmluaXRpb24KLQkJCXR5cGU9InNob3dpbnRhcmdldCIKLQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qZHQudWkuUGFja2FnZUV4cGxvcmVyIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxEZWZpbml0aW9uCi0JCQl0eXBlPSJzcGVsbGluZ3JlZ2lvbnMiCi0JCQl2YWx1ZT0iWE1MX0NPTU1FTlRfVEVYVCwgSlNQX0NPTU1FTlRfVEVYVCwgWE1MX0NPTlRFTlQsIEhUTUxfQ09OVEVOVCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0iYWN0aXZlY29udGV4dHMiCi0JCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSwgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmpzcC5zY29wZSwgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLCBvcmcuZWNsaXBzZS53c3QueG1sLm5hdmlnYXRpb24sIG9yZy5lY2xpcHNlLndzdC54bWwuY29tbWVudHMsIG9yZy5lY2xpcHNlLndzdC54bWwuc2VsZWN0aW9uIgotICAgICAgICAJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBzb3VyY2UgdmFsaWRhdGlvbiBmb3IgSlNQCQkJCQkJCQkJCQkJCQkJICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0idG90YWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSlNQSmF2YVZhbGlkYXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmpzcHNvdXJjZXZhbGlkYXRvciI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLkRFRkFVTFRfSlNQIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuU0NSSVBULkpBVkEiPgotCQkJCTwvcGFydGl0aW9uVHlwZT4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5KU1BfRElSRUNUSVZFIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBzb3VyY2UgKGFzIHlvdSB0eXBlKSB2YWxpZGF0aW9uIGZvciBKU1AgRUwJCQkJCSAgIAkJCQkJCSAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uIj4KLQkJPHZhbGlkYXRvcgotCQkJc2NvcGU9InRvdGFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUEVMVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuanNwZWxzb3VyY2V2YWxpZGF0b3IiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllcgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5TQ1JJUFQuSlNQX0VMIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBzb3VyY2UgKGFzIHlvdSB0eXBlKSB2YWxpZGF0aW9uIGZvciBKU1AgZGlyZWN0aXZlCQkJICAgCQkJCQkJICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0idG90YWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSlNQRGlyZWN0aXZlVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudGxkc291cmNldmFsaWRhdG9yIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuREVGQVVMVF9KU1AiPgotCQkJCTwvcGFydGl0aW9uVHlwZT4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5KU1BfRElSRUNUSVZFIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBzb3VyY2UgKGFzIHlvdSB0eXBlKSB2YWxpZGF0aW9uIGZvciBKU1AgYWN0aW9uIHRhZ3MJCQkgICAJCQkJCSAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uIj4KLQkJPHZhbGlkYXRvcgotCQkJc2NvcGU9InBhcnRpYWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUEFjdGlvblNvdXJjZVZhbGlkYXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnZhbGlkYXRpb24uanNwYWN0aW9udmFsaWRhdG9yIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuREVGQVVMVF9KU1AiPgotCQkJCTwvcGFydGl0aW9uVHlwZT4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5KU1BfRElSRUNUSVZFIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBjdXN0b20gWE1MIHNvdXJjZSAoYXMgeW91IHR5cGUpIHZhbGlkYXRpb24JCQkJCSAgIAkJCQkJCSAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uIj4KLQkJPHZhbGlkYXRvcgotCQkJc2NvcGU9InBhcnRpYWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLk1hcmt1cFZhbGlkYXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnZhbGlkYXRpb24ubWFya3VwdmFsaWRhdG9yIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuSlNQX0RJUkVDVElWRSIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUZBVUxUIi8+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuU1RfREVGQVVMVCIvPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCTwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gSFRNTCAoYXMgeW91IHR5cGUpIHZhbGlkYXRpb24JCQkJCSAgIAkJCQkJCSAgCQkJICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0icGFydGlhbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnZhbGlkYXRpb24uSlNQQ29udGVudFNvdXJjZVZhbGlkYXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnZhbGlkYXRpb24uaHRtbHN5bnRheHZhbGlkYXRvciI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLkpTUF9ESVJFQ1RJVkUiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9ERUZBVUxUIi8+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5TVF9ERUZBVUxUIi8+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIEpTUCBVSSBBZGFwdGVyIGZhY3RvcmllcwkJCQkJICAgCQkJCQkJICAJCQkJICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24iPgotCQk8YWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckpTUCI+Ci0JCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0JCTwvYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuYW5ub3RhdGlvbk1vZGVsQ3JlYXRpb24iPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotCi0JCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCQk8IS0tIEpTUCBQUkVGRVJFTkNFIFBBR0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQkJPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JCTxwYWdlCi0JCQluYW1lPSIlSlNQX0ZpbGVzLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMud2ViIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSlNQRmlsZXNQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnByZWZlcmVuY2VzLmpzcCI+Ci0JCQk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5maWxlcyIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlSlNQX1NvdXJjZS5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJlZmVyZW5jZXMuanNwIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSlNQU291cmNlUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5qc3Auc291cmNlIj4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJUpTUF9UZW1wbGF0ZXMubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmpzcC5zb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5KU1BUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuanNwLnRlbXBsYXRlcyI+Ci0JCQk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMiLz4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJUpTUF9TeW50YXhfQ29sb3JpbmciCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5qc3Auc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSlNQU3ludGF4Q29sb3JpbmdQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuanNwLnN0eWxlcyI+Ci0JCQk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5zdHlsZXMiLz4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJUpTUF9WYWxpZGF0aW9uIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJlZmVyZW5jZXMuanNwIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSlNQVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJlZmVyZW5jZXMudmFsaWRhdGlvbiI+Ci0JCQk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5zZXZlcml0aWVzIi8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVKU1BfVHlwaW5nIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuanNwLnNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkpTUFR5cGluZ1ByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJlZmVyZW5jZXMudHlwaW5nIj4KLQkJPC9wYWdlPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gS2V5d29yZHMgZm9yIHByZWZlcmVuY2UgYW5kIHByb3BlcnRpZXMgcGFnZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkua2V5d29yZHMiPgotCQk8a2V5d29yZAotCQkJbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMuZmlsZXMiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5maWxlcyIvPgotCQk8a2V5d29yZAotCQkJbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMudGVtcGxhdGVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzIi8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy5zdHlsZXMiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5zdHlsZXMiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLmZyYWdtZW50cyIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmZyYWdtZW50cyIvPgotCQk8a2V5d29yZAotCQkJbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMuc2V2ZXJpdGllcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnNldmVyaXRpZXMiLz4KLSAgICA8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gRk9SIEpTUC9KQVZBIFJFTkFNRSBQQVJUSUNJUEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnJlbmFtZVBhcnRpY2lwYW50cyI+Ci0JCTxyZW5hbWVQYXJ0aWNpcGFudAotCQkJbmFtZT0iJUpTUF9UeXBlX1JlbmFtZV9QYXJ0aWNpcGFudF9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BUeXBlUmVuYW1lUGFydGljaXBhbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qYXZhLnJlZmFjdG9yaW5nLkpTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iYWZmZWN0ZWROYXR1cmVzIj4KLQkJCQkJPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkJCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiIC8+Ci0KLQkJCQkJPC9pdGVyYXRlPgotCQkJCTwvd2l0aD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iZWxlbWVudCI+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSIgLz4KLQotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZW5hbWVQYXJ0aWNpcGFudD4KLQotCQk8cmVuYW1lUGFydGljaXBhbnQKLQkJCW5hbWU9IiVKU1BfTWV0aG9kX1JlbmFtZV9QYXJ0aWNpcGFudF9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BNZXRob2RSZW5hbWVQYXJ0aWNpcGFudCIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmphdmEucmVmYWN0b3JpbmcuSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImFmZmVjdGVkTmF0dXJlcyI+Ci0JCQkJCTxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIiAvPgotCi0JCQkJCTwvaXRlcmF0ZT4KLQkJCQk8L3dpdGg+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImVsZW1lbnQiPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCIgLz4KLQotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZW5hbWVQYXJ0aWNpcGFudD4KLQotCQk8cmVuYW1lUGFydGljaXBhbnQKLQkJCW5hbWU9IiVKU1BfUGFja2FnZV9SZW5hbWVfUGFydGljaXBhbnRfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQUGFja2FnZVJlbmFtZVBhcnRpY2lwYW50IgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuamF2YS5yZWZhY3RvcmluZy5KU1BQYWNrYWdlUmVuYW1lUGFydGljaXBhbnQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImFmZmVjdGVkTmF0dXJlcyI+Ci0JCQkJCTxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIiAvPgotCi0JCQkJCTwvaXRlcmF0ZT4KLQkJCQk8L3dpdGg+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImVsZW1lbnQiPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQiIC8+Ci0KLQkJCQk8L3dpdGg+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvcmVuYW1lUGFydGljaXBhbnQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIEZPUiBKU1AvSkFWQSBNT1ZFIFBBUlRJQ0lQQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5tb3ZlUGFydGljaXBhbnRzIj4KLQotCQk8bW92ZVBhcnRpY2lwYW50Ci0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qYXZhLnJlZmFjdG9yaW5nLkpTUFR5cGVNb3ZlUGFydGljaXBhbnQiCi0JCQluYW1lPSIlSlNQX1R5cGVfTW92ZV9QYXJ0aWNpcGFudF9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BUeXBlTW92ZVBhcnRpY2lwYW50Ij4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJhZmZlY3RlZE5hdHVyZXMiPgotCQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIgLz4KLQkJCQkJPC9pdGVyYXRlPgotCQkJCTwvd2l0aD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iZWxlbWVudCI+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSIgLz4KLQotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9tb3ZlUGFydGljaXBhbnQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIGZvciBicmVha3BvaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmJyZWFrcG9pbnQiPgotCQk8YnJlYWtwb2ludENvbnRyaWJ1dGlvbiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5wcm92aWRlcnMiPgotCQkJPHByb3ZpZGVyCi0JCQkJY29udGVudFR5cGVzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmJyZWFrcG9pbnRwcm92aWRlcnMuSmF2YVN0cmF0dW1CcmVha3BvaW50UHJvdmlkZXIiPgotCQkJCTxjbGFzcyBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5icmVha3BvaW50cHJvdmlkZXJzLkphdmFTdHJhdHVtQnJlYWtwb2ludFByb3ZpZGVyIj4KLQkJCQkJPHBhcmFtZXRlciBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiB2YWx1ZT0iKmpzcCxqc3Bfc2VydmxldC5fKiIvPgotCQkJCQk8cGFyYW1ldGVyIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdzb3VyY2UiIHZhbHVlPSIqdGFnLCp0YWd4LHRhZy5fKix0YWd4Ll8qIi8+Ci0JCQkJPC9jbGFzcz4KLQkJCTwvcHJvdmlkZXI+Ci0JCTwvYnJlYWtwb2ludENvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gU25pcHBldCBWaWV3IGNvbnRyaWJ1dGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uc25pcHBldHMuU25pcHBldENvbnRyaWJ1dGlvbnMiPgotCQk8Y2F0ZWdvcnkKLQkJCWxhYmVsPSIlSlNQX0V4dGVuc2lvbl9FbGVtZW50LmxhYmVsIgotCQkJc21hbGxpY29uPSJpY29ucy9zbmlwcGV0cy90YWctanNwLmdpZiIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmNhdGVnb3J5MCIKLQkJCWNvbnRlbnR0eXBlcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0JCQk8aXRlbQotCQkJCWxhYmVsPSIlanNwX2hpZGRlbl9jb21tZW50IgotCQkJCXNtYWxsaWNvbj0iaWNvbnMvc25pcHBldHMvdGFnLWdlbmVyaWMuZ2lmIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmpzcF9oaWRkZW5fY29tbWVudCI+Ci0JCQkJPGNvbnRlbnQ+JWpzcF9oaWRkZW5fY29tbWVudF9jb250ZW50PC9jb250ZW50PgotCQkJPC9pdGVtPgotCQkJPGl0ZW0KLQkJCQlsYWJlbD0iJWpzcF9zY3JpcHRsZXQiCi0JCQkJc21hbGxpY29uPSJpY29ucy9zbmlwcGV0cy9qc3BzY3IuZ2lmIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmpzcF9zY3JpcHRsZXQiPgotCQkJCTxjb250ZW50PiVqc3Bfc2NyX2NvbnRlbnQ8L2NvbnRlbnQ+Ci0JCQk8L2l0ZW0+Ci0JCQk8aXRlbQotCQkJCWxhYmVsPSIlanNwX2V4cHJlc3Npb24iCi0JCQkJc21hbGxpY29uPSJpY29ucy9zbmlwcGV0cy9qc3BleHAuZ2lmIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmpzcF9leHByZXNzaW9uIj4KLQkJCQk8Y29udGVudD4lanNwX2V4cHJlc3Npb25fY29udGVudDwvY29udGVudD4KLQkJCTwvaXRlbT4KLQkJCTxpdGVtCi0JCQkJbGFiZWw9IiVqc3BfZGVjbGFyYXRpb24iCi0JCQkJc21hbGxpY29uPSJpY29ucy9zbmlwcGV0cy9qc3BkZWNsLmdpZiIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qc3BfZGVjbGFyYXRpb24iPgotCQkJCTxjb250ZW50PiVqc3BfZGVjbGFyYXRpb25fY29udGVudDwvY29udGVudD4KLQkJCTwvaXRlbT4KLQkJCTxpdGVtCi0JCQkJbGFiZWw9IiVqc3BfaW5jbHVkZV9kaXJlY3RpdmUiCi0JCQkJc21hbGxpY29uPSJpY29ucy9zbmlwcGV0cy9qc3BpbmNsLmdpZiIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qc3BfaW5jbHVkZV9kaXJlY3RpdmUiPgotCQkJCTxjb250ZW50PiVqc3BfaW5jbHVkZV9kaXJlY3RpdmVfY29udGVudDwvY29udGVudD4KLQkJCTwvaXRlbT4KLQkJCTxpdGVtCi0JCQkJbGFiZWw9IiVqc3BfcGFnZV9kaXJlY3RpdmUiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuanNwX3BhZ2VfZGlyZWN0aXZlIj4KLQkJCQk8Y29udGVudD4lanNwX3BhZ2VfZGlyZWN0aXZlX2NvbnRlbnQ8L2NvbnRlbnQ+Ci0JCQk8L2l0ZW0+Ci0JCQk8aXRlbQotCQkJCWxhYmVsPSIlanNwX3RhZ2xpYl9kaXJlY3RpdmUiCi0JCQkJc21hbGxpY29uPSJpY29ucy9zbmlwcGV0cy9qc3B0YWdsaWIuZ2lmIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmpzcF90YWdsaWJfZGlyZWN0aXZlIj4KLQkJCQk8Y29udGVudD4lanNwX3RhZ2xpYl9kaXJlY3RpdmVfY29udGVudDwvY29udGVudD4KLQkJCQk8dmFyaWFibGUKLQkJCQkJZGVzY3JpcHRpb249IiVqc3BfdGFnbGliX2RpcmVjdGl2ZV91cmkiCi0JCQkJCWlkPSJ1cmkiIC8+Ci0KLQkJCQk8dmFyaWFibGUKLQkJCQkJZGVmYXVsdD0ibXlsaWIiCi0JCQkJCWRlc2NyaXB0aW9uPSIlanNwX3RhZ2xpYl9kaXJlY3RpdmVfcHJlZml4IgotCQkJCQlpZD0icHJlZml4IiAvPgotCi0JCQk8L2l0ZW0+Ci0JCTwvY2F0ZWdvcnk+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIEVkaXRvciBhY3Rpb25zZXRzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldFBhcnRBc3NvY2lhdGlvbnMiPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0LmFjdGlvblNldC5hbm5vdGF0aW9uTmF2aWdhdGlvbiI+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZS5zb3VyY2UiIC8+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuTmF2aWdhdGVBY3Rpb25TZXQiPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2Uuc291cmNlIiAvPgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaEFjdGlvblNldCI+Ci0gICAgICAgICAgICA8cGFydCBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZS5zb3VyY2UiLz4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIEpTUCBFZGl0b3Igc3BlY2lmaWMgYWN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+Ci0JCTwhLS0gcmVuYW1lIHJlZmFjdG9yIC0tPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJWNvbW1hbmQuanNwLnJlZmFjdG9yLnJlbmFtZS5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLmpzcC5yZWZhY3Rvci5yZW5hbWUuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucmVmYWN0b3IucmVuYW1lIiAvPgotCi0JCTwhLS0gbW92ZSByZWZhY3RvciAtLT4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLmpzcC5yZWZhY3Rvci5tb3ZlLm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbW1hbmQuanNwLnJlZmFjdG9yLm1vdmUuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucmVmYWN0b3IubW92ZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIEtleWJpbmRpbmcgc2NvcGUgZm9yIGpzcCBzb3VyY2UgZWRpdG9yIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzIj4KLQkJPGNvbnRleHQKLQkJCW5hbWU9IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmpzcC5uYW1lIgotCQkJcGFyZW50SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWRlc2NyaXB0aW9uPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5qc3AuZGVzY3JpcHRpb24iCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmpzcC5zY29wZSI+Ci0JCTwvY29udGV4dD4KLQkJPGNvbnRleHQKLQkJCW5hbWU9IiVzY29wZS5qc3AuY29yZS5qc3Bzb3VyY2UubmFtZSIKLQkJCXBhcmVudElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQlkZXNjcmlwdGlvbj0iJXNjb3BlLmpzcC5jb3JlLmpzcHNvdXJjZS5kZXNjcmlwdGlvbiIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLQkJPC9jb250ZXh0PgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gS2V5YmluZGluZ3MgZm9yIGpzcCBzb3VyY2UgZWRpdG9yIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmJpbmRpbmdzIj4KLQkgICAgPCEtLSAgd2luMzI6ICBNMT1DVFJMLCBNMj1TSElGVCwgTTM9QUxUIC0tPgotCQk8IS0tIHJlbmFtZSByZWZhY3RvciAtLT4KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0yK00zK1IiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5qc3Auc2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucmVmYWN0b3IucmVuYW1lIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQotCQk8IS0tIG1vdmUgcmVmYWN0b3IgLS0+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMitNMytWIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IuanNwLnNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnJlZmFjdG9yLm1vdmUiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBUZW1wbGF0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZW1wbGF0ZXMiPgotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVBbGxfSlNQX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVKU1AiCi0JCQlpZD0ianNwX2FsbCIgLz4KLQotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVKU1BfTmV3X2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVKU1AiCi0JCQlpZD0ianNwX25ldyIgLz4KLQotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVUYWdfTmV3X2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVKU1AiCi0JCQlpZD0idGFnX25ldyIgLz4KLQotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVKU1BfVGFnX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVKU1AiCi0JCQlpZD0ianNwX3RhZyIgLz4KLQotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVKU1BfQXR0cmlidXRlX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVKU1AiCi0JCQlpZD0ianNwX2F0dHJpYnV0ZSIgLz4KLQotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVKU1BfQXR0cmlidXRlX3ZhbHVlX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVKU1AiCi0JCQlpZD0ianNwX2F0dHJpYnV0ZV92YWx1ZSIgLz4KLQotCQk8aW5jbHVkZQotCQkJZmlsZT0idGVtcGxhdGVzL2pzcGRlZmF1bHQtdGVtcGxhdGVzLnhtbCIKLQkJCXRyYW5zbGF0aW9ucz0iJG5sJC90ZW1wbGF0ZXMvanNwZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcyIgLz4KLQotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBxdWVyeVBhcnRpY2lwYW50IHRvIHBhcnRpY2lwYXRlIGluIGphdmEgc2VyYWNoZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuamR0LnVpLnF1ZXJ5UGFydGljaXBhbnRzIj4KLQkJPHF1ZXJ5UGFydGljaXBhbnQKLQkJCW5hbWU9IiVKU1BfUXVlcnlfUGFydGljaXBhbnRfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCW5hdHVyZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEuc2VhcmNoLnVpLkpTUFF1ZXJ5UGFydGljaXBhbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qYXZhLnNlYXJjaC51aS5KU1BRdWVyeVBhcnRpY2lwYW50IiAvPgotCi0JPC9leHRlbnNpb24+Ci0JPCEtLSBpbml0aWFsaXplIHhtbCB1aSBwcmVmZXJlbmNlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkpTUFVJUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBEb2N1bWVudCBwcm92aWRlciBmb3IgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5kb2N1bWVudFByb3ZpZGVycyI+Ci0JCTxwcm92aWRlcgotCQkJaW5wdXRUeXBlcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbmsuRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRGaWxlRG9jdW1lbnRQcm92aWRlciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkV4dGVybmFsRmlsZURvY3VtZW50UHJvdmlkZXIiIC8+Ci0KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gTmV3IEpTUCB3aXphcmQgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0JCTx3aXphcmQKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLndpemFyZC5OZXdKU1BXaXphcmQiCi0JCQluYW1lPSIlX1VJX1dJWkFSRF9OQU1FIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwud2l6YXJkLk5ld0pTUFdpemFyZCIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIgotCQkJaWNvbj0iJG5sJC9pY29ucy9mdWxsL2V0b29sMTYvbmV3anNwX3dpei5naWYiPgotCQkJPGRlc2NyaXB0aW9uPiVfVUlfV0laQVJEX0NSRUFURV9ORVdfRklMRTwvZGVzY3JpcHRpb24+Ci0JCQk8c2VsZWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiIC8+Ci0JCTwvd2l6YXJkPgotCi0JCTx3aXphcmQKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLndpemFyZC5OZXdUYWdXaXphcmQiCi0JCQluYW1lPSIlX1VJX1dJWkFSRF9UQUdfTkFNRSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLndpemFyZC5OZXdUYWdXaXphcmQiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLQkJCWljb249IiRubCQvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2pzcF93aXouZ2lmIj4KLQkJCTxkZXNjcmlwdGlvbj4lX1VJX1dJWkFSRF9UQUdfQ1JFQVRFX05FV19GSUxFPC9kZXNjcmlwdGlvbj4KLQkJCTxzZWxlY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIgLz4KLQkJPC93aXphcmQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIEFkZCBuZXcgSlNQIHdpemFyZCB0byBQcm9qZWN0IEV4cGxvcmVyIC0tPgotCTxleHRlbnNpb24KLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29tbW9uV2l6YXJkLm5ld0pTUCIKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50Ij4KLQkJPGNvbW1vbldpemFyZAotICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLSAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQuTmV3SlNQV2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0JCQkJCQk8dGVzdAotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC53ZWIiLz4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCQk8dmlld2VyQ29udHJpYnV0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZS5zb3VyY2UuUnVsZXJDb250ZXh0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IucnVsZXIuY29udGV4dC5hY3Rpb25zIj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZFRhc2subGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuQWRkVGFza19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZFRhc2sudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiIgLz4KLQotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkQm9va21hcmsudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iIC8+Ci0KLQkJPC92aWV3ZXJDb250cmlidXRpb24+Ci0JCTx2aWV3ZXJDb250cmlidXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZnJhZ21lbnRzb3VyY2Uuc291cmNlLlJ1bGVyQ29udGV4dCIKLQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnJ1bGVyLmNvbnRleHQuYWN0aW9ucyI+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRUYXNrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLkFkZFRhc2tfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRUYXNrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iIC8+Ci0KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmJvb2ttYXJrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZEJvb2ttYXJrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIiAvPgotCi0JCTwvdmlld2VyQ29udHJpYnV0aW9uPgotCQk8dmlld2VyQ29udHJpYnV0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ3NvdXJjZS5zb3VyY2UuUnVsZXJDb250ZXh0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IucnVsZXIuY29udGV4dC5hY3Rpb25zIj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZFRhc2subGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuQWRkVGFza19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZFRhc2sudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiIgLz4KLQotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkQm9va21hcmsudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iIC8+Ci0KLQkJPC92aWV3ZXJDb250cmlidXRpb24+Ci0JCTx2aWV3ZXJDb250cmlidXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGxkc291cmNlLnNvdXJjZS5SdWxlckNvbnRleHQiCi0JCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5ydWxlci5jb250ZXh0LmFjdGlvbnMiPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkVGFzay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5BZGRUYXNrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkVGFzay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIiAvPgotCi0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRCb29rbWFyay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIgLz4KLQotCQk8L3ZpZXdlckNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMiPgotCTxlZGl0b3JDb250cmlidXRpb24KLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlLnNvdXJjZS5lZGl0b3JBY3Rpb25zIgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2Uuc291cmNlIj4KLQk8IS0tCQk8YWN0aW9uCi0JCQkJaWQ9IkNsZWFudXBEb2N1bWVudCIKLQkJCQlsYWJlbD0iJUNsZWFudXBEb2N1bWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2xlYW51cC5kb2N1bWVudCIKLQkJCQl0b29sdGlwPSIlQ2xlYW51cERvY3VtZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXQudWkuQ2xlYW51cEFjdGlvbkhUTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iQ2xlYW51cERvY3VtZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJUb2dnbGVDb21tZW50IgotCQkJCWxhYmVsPSIlVG9nZ2xlQ29tbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudG9nZ2xlLmNvbW1lbnQiCi0JCQkJdG9vbHRpcD0iJVRvZ2dsZUNvbW1lbnRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLlRvZ2dsZUNvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iVG9nZ2xlQ29tbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iQWRkQmxvY2tDb21tZW50IgotCQkJCWxhYmVsPSIlQWRkQmxvY2tDb21tZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGQuYmxvY2suY29tbWVudCIKLQkJCQl0b29sdGlwPSIlQWRkQmxvY2tDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5BZGRCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iQWRkQmxvY2tDb21tZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJSZW1vdmVCbG9ja0NvbW1lbnQiCi0JCQkJbGFiZWw9IiVSZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnJlbW92ZS5ibG9jay5jb21tZW50IgotCQkJCXRvb2x0aXA9IiVSZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLlJlbW92ZUJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJSZW1vdmVCbG9ja0NvbW1lbnQiPgotCQkJPC9hY3Rpb24+LS0+Ci0JCQk8IS0tPGFjdGlvbgotCQkJCWlkPSJSZW5hbWVFbGVtZW50IgotCQkJCWxhYmVsPSIlUmVuYW1lRWxlbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucmVmYWN0b3IucmVuYW1lIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQUmVuYW1lRWxlbWVudEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJSZW5hbWVFbGVtZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJNb3ZlRWxlbWVudCIKLQkJCQlsYWJlbD0iJU1vdmVFbGVtZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5yZWZhY3Rvci5tb3ZlIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQTW92ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iTW92ZUVsZW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkZpbmRPY2N1cnJlbmNlcyIKLQkJCQlsYWJlbD0iJUZpbmRPY2N1cnJlbmNlc19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkZpbmRPY2N1cnJlbmNlcyI+Ci0JCQk8L2FjdGlvbj4tLT4KLQkJCTwhLS08YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5lbmNsb3NpbmciCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nWE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0TmV4dCIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubmV4dCIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3ROZXh0Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91cyIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LnByZXZpb3VzIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lmxhc3QiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEhpc3RvcnlBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0SGlzdG9yeSI+Ci0JCQk8L2FjdGlvbj4tLT4KLQkJPC9lZGl0b3JDb250cmlidXRpb24+Ci0gICAgICAgIDxlZGl0b3JDb250cmlidXRpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlLnNvdXJjZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlLnJ1bGVyLmFjdGlvbnMiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmJvb2ttYXJrX2FjdGlvbl9jb250ZXh0IgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckRvdWJsZUNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIvPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVTZWxlY3RSdWxlci5sYWJlbCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIgotICAgICAgICAgICAgICAgYWN0aW9uSUQ9IlJ1bGVyQ2xpY2siCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIvPgotICAgICAgICA8L2VkaXRvckNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KLSAgICAgICA8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuUmVuYW1lRWxlbWVudEhhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnJlZmFjdG9yLnJlbmFtZSI+Ci0gICAgICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgCTxyZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuanNwLnVpLmpzcFNvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiI+Ci0gICAgICAgICAgICAgCTwvcmVmZXJlbmNlPgotICAgICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgCTxyZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuanNwLnVpLmpzcFNvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiI+Ci0gICAgICAgICAgICAgCTwvcmVmZXJlbmNlPgotICAgICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5Nb3ZlRWxlbWVudEhhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnJlZmFjdG9yLm1vdmUiPgotICAgICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgIAk8cmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmpzcC51aS5qc3BTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iPgotICAgICAgICAgICAgIAk8L3JlZmVyZW5jZT4KLSAgICAgICAgICAgICA8L2FjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgIAk8cmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmpzcC51aS5qc3BTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iPgotICAgICAgICAgICAgIAk8L3JlZmVyZW5jZT4KLSAgICAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICA8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmhhbmRsZXJzLkpTUEZpbmRPY2N1cnJlbmNlc0hhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzIj4KLSAgICAgICAgICAgICA8YWN0aXZlV2hlbj4KLSAgICAgICAgICAgICAJPHJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5qc3AudWkuanNwU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIj4KLSAgICAgICAgICAgICAJPC9yZWZlcmVuY2U+Ci0gICAgICAgICAgICAgPC9hY3RpdmVXaGVuPgotICAgICAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAJPHJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5qc3AudWkuanNwU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIj4KLSAgICAgICAgICAgICAJPC9yZWZlcmVuY2U+Ci0gICAgICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgICA8L2hhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPCEtLSBKU1AgRnJhZ21lbnQgUHJvcGVydHkgUGFnZSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLQkJPCEtLSBmb3IgajJlZSB3ZWIgcHJvamVjdCAtLT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVKU1BGcmFnbWVudENvbnRlbnRTZXR0aW5ncy5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5Qcm9qZWN0SlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSI+Ci0gICAgICAgICAJPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgICAgCTxhbmQ+Ci0JCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQk8b3I+IAotCQkJCQkJCTx0ZXN0IAotCQkJCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCXZhbHVlPSJqc3Qud2ViIiAvPgotCQkJCQkJPC9vcj4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L2FuZD4gCi0JCQk8L2VuYWJsZWRXaGVuPgotCQkJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuZnJhZ21lbnRzIi8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVKU1BGcmFnbWVudENvbnRlbnRTZXR0aW5ncy5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UiPgotICAgICAgICAgCTxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgIAk8YW5kPgotCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotCQkJCQkJPG9yPiAKLQkJCQkJCQk8dGVzdCAKLQkJCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuY29udGVudFR5cGVJZCIKLQkJCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3BmcmFnbWVudHNvdXJjZSIgLz4KLQkJCQkJCQk8dGVzdCAKLQkJCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuY29udGVudFR5cGVJZCIKLQkJCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3BmcmFnbWVudHNvdXJjZSIgLz4KLQkJCQkJCTwvb3I+Ci0JCQkJCTwvYWRhcHQ+Ci0JCQkJPC9hbmQ+IAotCQkJPC9lbmFibGVkV2hlbj4KLQkJCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmZyYWdtZW50cyIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlSlNQX1Byb3BlcnR5X3ZhbGlkYXRpb24iIAotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSlNQVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJvcGVydHlQYWdlLnByb2plY3QudmFsaWRhdGlvbiIKLQkJCWNhdGVnb3J5PSJWYWxpZGF0aW9uUHJvcGVydGllc1BhZ2UiPgotCQkJPGVuYWJsZWRXaGVuPgotCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9qZWN0TmF0dXJlIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIvPgotCQkJCTwvYWRhcHQ+Ci0JCQk8L2VuYWJsZWRXaGVuPgotCQkJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuc2V2ZXJpdGllcyIvPgotCQk8L3BhZ2U+Ci0JPC9leHRlbnNpb24+CQotCTwhLS0gIGpzcC1mb3ItY3NzIGVkaXRvciBjb25maWd1cmF0aW9ucyAtLT4JCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTxjb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNTU0NvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIgLz4KLQkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIgLz4KLQkJPHByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllcy5KU1BlZENTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJjaGFyYWN0ZXJwYWlybWF0Y2hlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnRleHQuQ1NTRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0ic3RydWN0dXJlZHRleHRmb2xkaW5ncHJvdmlkZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyQ1NTIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxEZWZpbml0aW9uCi0JCQl0eXBlPSJwcmVmZXJlbmNlcGFnZXMiCi0JCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5jc3MsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuY3NzLnNvdXJjZSwgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5wcmVmZXJlbmNlcy50ZW1wbGF0ZXMsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuY3NzLnN0eWxlcyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQkJPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uIj4KLQkJPGFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy51aS5pbnRlcm5hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVySlNQZWRDU1MiPgotCQkJPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIiAvPgotCQk8L2FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IuaHlwZXJsaW5rRGV0ZWN0b3JUYXJnZXRzIj4KLQkJPHRhcmdldAotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiCi0JCQluYW1lPSIlSlNQX1NvdXJjZV90YXJnZXRfbmFtZSI+Ci0JCTwvdGFyZ2V0PgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmh5cGVybGlua0RldGVjdG9ycyI+Ci0JCTxoeXBlcmxpbmtEZXRlY3RvcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rLkpTUEphdmFIeXBlcmxpbmtEZXRlY3RvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluay5KU1BKYXZhSHlwZXJsaW5rRGV0ZWN0b3IiCi0JCQluYW1lPSIlSlNQSmF2YV9oeXBlcmxpbmsiCi0JCQl0YXJnZXRJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0JCTwvaHlwZXJsaW5rRGV0ZWN0b3I+Ci0JCTxoeXBlcmxpbmtEZXRlY3RvcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rLlRhZ2xpYkh5cGVybGlua0RldGVjdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rLlRhZ2xpYkh5cGVybGlua0RldGVjdG9yIgotCQkJbmFtZT0iJVRhZ2xpYl9oeXBlcmxpbmsiCi0JCQl0YXJnZXRJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0JCTwvaHlwZXJsaW5rRGV0ZWN0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9ucyI+Ci0JCTxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS53c3QuanNwLnVpLmpzcFNvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiI+Ci0gICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0iYWN0aXZlQ29udGV4dHMiPgotCSAgICAgICAgICAgPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkgICAgICAgICAgICAgIDxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiLz4KLQkgICAgICAgICAgIDwvaXRlcmF0ZT4KLSAgICAgICAgICAgIDwvd2l0aD4KLQkJPC9kZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KLQkgICAgPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9Im1lbnU6cmVmYWN0b3JNZW51SWQiPgotCSAgICAgICA8c2VwYXJhdG9yIG5hbWU9ImpzcFJlZmFjdG9yQmVnaW4iIHZpc2libGU9ImZhbHNlIj48L3NlcGFyYXRvcj4KLQkgICAgICAgPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnJlZmFjdG9yLnJlbmFtZSIgaWQ9IlJlbmFtZUVsZW1lbnQiIGxhYmVsPSIlY29tbWFuZC5qc3AucmVmYWN0b3IucmVuYW1lLm5hbWUiIHN0eWxlPSJwdXNoIj4KLQkJCSAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5qc3AudWkuanNwU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCQk8L3Zpc2libGVXaGVuPgotCSAgICAgICA8L2NvbW1hbmQ+Ci0JICAgICAgIDxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5yZWZhY3Rvci5tb3ZlIiBpZD0iTW92ZUVsZW1lbnQiIGxhYmVsPSIlY29tbWFuZC5qc3AucmVmYWN0b3IubW92ZS5uYW1lIiBzdHlsZT0icHVzaCI+Ci0JCQkgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuanNwLnVpLmpzcFNvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiI+PC9yZWZlcmVuY2U+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkgICAgICAgPC9jb21tYW5kPgotCSAgICAgICA8c2VwYXJhdG9yIG5hbWU9ImpzcFJlZmFjdG9yQmVnaW4iIHZpc2libGU9ImZhbHNlIj48L3NlcGFyYXRvcj4KLQkJPC9tZW51Q29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gRW5hYmxlIHRoZSBGb3JtYXRIYW5kbGVyIGZvciBKU1AgQ29udGVudCBUeXBlIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KLQkJPGhhbmRsZXIgCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oYW5kbGVycy5Gb3JtYXRIYW5kbGVyIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmZvcm1hdCI+Ci0JCQk8YWN0aXZlV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmpzcC51aS5qc3BDb250ZW50VHlwZS5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCTwvYWN0aXZlV2hlbj4KLQkJCTxlbmFibGVkV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmpzcC51aS5qc3BDb250ZW50VHlwZS5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvaGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIFNldCB1cCBhIGRlZmluaXRpb24gZm9yIEpTUCBDb250ZW50IFR5cGVzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotCQk8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzcC51aS5qc3BDb250ZW50VHlwZS5kZWZpbml0aW9uIj4KLQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotCQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnJlc291cmNlcy5jb250ZW50VHlwZUlkIgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiLz4KLQkJCQk8L2FkYXB0PgotCQkJPC9pdGVyYXRlPgotCQk8L2RlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9KU1BlZENTU1Byb3BlcnR5U291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvSlNQZWRDU1NQcm9wZXJ0eVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWM3ODI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9KU1BlZENTU1Byb3BlcnR5U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkNTU1Byb3BlcnR5U291cmNlOwotCi0KLQotcHVibGljIGNsYXNzIEpTUGVkQ1NTUHJvcGVydHlTb3VyY2UgZXh0ZW5kcyBDU1NQcm9wZXJ0eVNvdXJjZSB7Ci0KLQlwdWJsaWMgSlNQZWRDU1NQcm9wZXJ0eVNvdXJjZShJQ1NTTm9kZSB0YXJnZXQpIHsKLQkJc3VwZXIodGFyZ2V0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCS8vIHdvcmthcm91bmQgdG8gYXZvaWQgRE9NRXhjZXB0aW9uOiBpZiB2YWx1ZSBjb250YWlucyBqc3AgZWxlbWVudCwgbm90aGluZyBoYXBwZW4uCi0JCVN0cmluZyB2ID0gdmFsdWUudG9TdHJpbmcoKTsKLQkJaWYgKHYuaW5kZXhPZigiJHsiKSAhPSAtMSB8fCB2LmluZGV4T2YoIjwlPSIpICE9IC0xKXsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCVN0cmluZyB0aXRsZSA9IEpTUFVJTWVzc2FnZXMuVGl0bGVfSW52YWxpZFZhbHVlOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbWVzc2FnZSA9IEpTUFVJTWVzc2FnZXMuTWVzc2FnZV9JbnZhbGlkVmFsdWU7IC8vJE5PTi1OTFMtMSQKLQkJCU1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcod2luZG93LmdldFNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5zZXRQcm9wZXJ0eVZhbHVlKG5hbWUsIHZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJKU1BlZENTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVySlNQZWRDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA5ZTg3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJKU1BlZENTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy51aS5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckpTUGVkQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJKU1BlZENTUyBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJDU1MgewotCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihJRG9jdW1lbnRUeXBlSGFuZGxlciBjb250ZW50VHlwZURlc2NyaXB0aW9uKSB7Ci0JCXJldHVybiAoY29udGVudFR5cGVEZXNjcmlwdGlvbiBpbnN0YW5jZW9mIE1vZGVsSGFuZGxlckZvckpTUGVkQ1NTKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL0pTUGVkQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvdWkvaW50ZXJuYWwvdmlld3MvcHJvcGVydGllcy9KU1BlZENTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MDM4MTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL0pTUGVkQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLnVpLmludGVybmFsLnZpZXdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MudWkuaW50ZXJuYWwucHJvcGVydGllcy5KU1BlZENTU1Byb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgSlNQZWRDU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiBleHRlbmRzIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIHsKLQlwcml2YXRlIGNsYXNzIENTU1Byb3BlcnR5U2hlZXRSZWZyZXNoQWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciB7Ci0JCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkJaWYgKGZQcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7Ci0JCQkJZ2V0UHJvcGVydGllc1JlZnJlc2hKb2IoKS5hZGRQcm9wZXJ0eVNoZWV0UGFnZShmUHJvcGVydHlTaGVldFBhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDU1NQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlUHJvdmlkZXIgewotCQlwcml2YXRlIElQcm9wZXJ0eVNvdXJjZSBmUHJvcGVydHlTb3VyY2UgPSBudWxsOwotCQlwcml2YXRlIElDU1NOb2RlIGZTb3VyY2UgPSBudWxsOwotCi0JCXB1YmxpYyBJUHJvcGVydHlTb3VyY2UgZ2V0UHJvcGVydHlTb3VyY2UoT2JqZWN0IG9iamVjdCkgewotCQkJaWYgKGZTb3VyY2UgIT0gbnVsbCAmJiBvYmplY3QuZXF1YWxzKGZTb3VyY2UpKSB7Ci0JCQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZTsKLQkJCX0KLQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkJZlNvdXJjZSA9IChJQ1NTTm9kZSlvYmplY3Q7Ci0JCQkJZlByb3BlcnR5U291cmNlID0gbmV3IEpTUGVkQ1NTUHJvcGVydHlTb3VyY2UoZlNvdXJjZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmU291cmNlID0gbnVsbDsKLQkJCQlmUHJvcGVydHlTb3VyY2UgPSBudWxsOwotCQkJfQotCQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgUHJvcGVydGllc1JlZnJlc2hKb2IgZXh0ZW5kcyBVSUpvYiB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQREFURV9ERUxBWSA9IDIwMDsKLQotCQlwcml2YXRlIFNldCBwcm9wZXJ0eVNoZWV0UGFnZXMgPSBudWxsOwotCi0JCXB1YmxpYyBQcm9wZXJ0aWVzUmVmcmVzaEpvYigpIHsKLQkJCXN1cGVyKFhNTFVJTWVzc2FnZXMuSkZhY2VOb2RlQWRhcHRlcl8xKTsKLQkJCXNldFN5c3RlbSh0cnVlKTsKLQkJCXNldFByaW9yaXR5KEpvYi5TSE9SVCk7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZXMgPSBuZXcgSGFzaFNldCgxKTsKLQkJfQotCi0JCXZvaWQgYWRkUHJvcGVydHlTaGVldFBhZ2UoSVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UpIHsKLQkJCXByb3BlcnR5U2hlZXRQYWdlcy5hZGQocGFnZSk7Ci0JCQlzY2hlZHVsZShVUERBVEVfREVMQVkpOwotCQl9Ci0KLQkJcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCU9iamVjdFtdIHBhZ2VzID0gcHJvcGVydHlTaGVldFBhZ2VzLnRvQXJyYXkoKTsKLQkJCXByb3BlcnR5U2hlZXRQYWdlcy5jbGVhcigpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUHJvcGVydHlTaGVldFBhZ2UgcGFnZSA9IChQcm9wZXJ0eVNoZWV0UGFnZSkgcGFnZXNbaV07Ci0JCQkJaWYgKHBhZ2UuZ2V0Q29udHJvbCgpICE9IG51bGwgJiYgIXBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQlwYWdlLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzUmVmcmVzaEpvYiBmUHJvcGVydGllc1JlZnJlc2hKb2IgPSBudWxsOwotCi0JSVByb3BlcnR5U2hlZXRQYWdlIGZQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCXByaXZhdGUgSVByb3BlcnR5U291cmNlUHJvdmlkZXIgZlByb3BlcnR5U291cmNlUHJvdmlkZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBJTm9kZUFkYXB0ZXIgZlJlZnJlc2hBZGFwdGVyID0gbmV3IENTU1Byb3BlcnR5U2hlZXRSZWZyZXNoQWRhcHRlcigpOwotCi0JcHJpdmF0ZSBJTm9kZU5vdGlmaWVyW10gZlNlbGVjdGVkTm90aWZpZXJzOwotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBDU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBKU1BlZENTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJU2VsZWN0aW9uIGdldElucHV0U2VsZWN0aW9uKElXb3JrYmVuY2hQYXJ0IHNlbGVjdGluZ1BhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIHJlbW92ZSBVSSByZWZyZXNoIGFkYXB0ZXJzCi0JCWlmIChmU2VsZWN0ZWROb3RpZmllcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmU2VsZWN0ZWROb3RpZmllcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlmU2VsZWN0ZWROb3RpZmllcnNbaV0ucmVtb3ZlQWRhcHRlcihmUmVmcmVzaEFkYXB0ZXIpOwotCQkJfQotCQkJZlNlbGVjdGVkTm90aWZpZXJzID0gbnVsbDsKLQkJfQotCi0JCUlTZWxlY3Rpb24gcHJlZmVycmVkU2VsZWN0aW9uID0gc3VwZXIuZ2V0SW5wdXRTZWxlY3Rpb24oc2VsZWN0aW5nUGFydCwgc2VsZWN0aW9uKTsKLQkJaWYgKHByZWZlcnJlZFNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlPYmplY3RbXSBzZWxlY3RlZE9iamVjdHMgPSBuZXcgT2JqZWN0WygoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuc2l6ZSgpXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0FycmF5KCksIDAsIHNlbGVjdGVkT2JqZWN0cywgMCwgc2VsZWN0ZWRPYmplY3RzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkT2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChzZWxlY3RlZE9iamVjdHNbaV0gaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJCQlJQ1NTTm9kZSBub2RlID0gKElDU1NOb2RlKSBzZWxlY3RlZE9iamVjdHNbaV07Ci0JCQkJCXdoaWxlIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuUFJJTUlUSVZFVkFMVUVfTk9ERSB8fCBub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVERUNMSVRFTV9OT0RFKSB7Ci0JCQkJCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQlzZWxlY3RlZE9iamVjdHNbaV0gPSBub2RlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvKgotCQkJICogQWRkIFVJIHJlZnJlc2ggYWRhcHRlcnMgYW5kIHJlbWVtYmVyIG5vdGlmaWVycyBmb3IgbGF0ZXIKLQkJCSAqIHJlbW92YWwKLQkJCSAqLwotCQkJaWYgKHNlbGVjdGVkT2JqZWN0cy5sZW5ndGggPiAwKSB7Ci0JCQkJTGlzdCBzZWxlY3RlZE5vdGlmaWVycyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZE9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKHNlbGVjdGVkT2JqZWN0c1tpXSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCQkJCXNlbGVjdGVkTm90aWZpZXJzLmFkZChzZWxlY3RlZE9iamVjdHNbaV0pOwotCQkJCQkJKChJTm9kZU5vdGlmaWVyKSBzZWxlY3RlZE9iamVjdHNbaV0pLmFkZEFkYXB0ZXIoZlJlZnJlc2hBZGFwdGVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmU2VsZWN0ZWROb3RpZmllcnMgPSAoSU5vZGVOb3RpZmllcltdKSBzZWxlY3RlZE5vdGlmaWVycy50b0FycmF5KG5ldyBJTm9kZU5vdGlmaWVyW3NlbGVjdGVkTm90aWZpZXJzLnNpemUoKV0pOwotCQkJfQotCQkJcHJlZmVycmVkU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWRPYmplY3RzKTsKLQkJfQotCQlyZXR1cm4gcHJlZmVycmVkU2VsZWN0aW9uOwotCX0KLQotCVByb3BlcnRpZXNSZWZyZXNoSm9iIGdldFByb3BlcnRpZXNSZWZyZXNoSm9iKCkgewotCQlpZiAoZlByb3BlcnRpZXNSZWZyZXNoSm9iID09IG51bGwpIHsKLQkJCWZQcm9wZXJ0aWVzUmVmcmVzaEpvYiA9IG5ldyBQcm9wZXJ0aWVzUmVmcmVzaEpvYigpOwotCQl9Ci0JCXJldHVybiBmUHJvcGVydGllc1JlZnJlc2hKb2I7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGdldFByb3BlcnR5U291cmNlUHJvdmlkZXIoSVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UpIHsKLQkJaWYgKGZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyID0gbmV3IENTU1Byb3BlcnR5U291cmNlUHJvdmlkZXIoKTsKLQkJCWZQcm9wZXJ0eVNoZWV0UGFnZSA9IHBhZ2U7Ci0JCX0KLQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuY29uZmlndXJlKCkgewotCQlzdXBlci51bmNvbmZpZ3VyZSgpOwotCQlpZiAoZlNlbGVjdGVkTm90aWZpZXJzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlNlbGVjdGVkTm90aWZpZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZlNlbGVjdGVkTm90aWZpZXJzW2ldLnJlbW92ZUFkYXB0ZXIoZlJlZnJlc2hBZGFwdGVyKTsKLQkJCX0KLQkJCWZTZWxlY3RlZE5vdGlmaWVycyA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNDE1OGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgTWF0dGhpYXMgRnVlc3NlbCwgbWF0LmZ1ZXNzZWxAZ214Lm5ldCAtIFsxNzczODddIHVzZSBiYXNlIGh5cGVybGlua2luZyBleHRlbnNpb24gcG9pbnRzICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuSUphdmFQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LkphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHREb3VibGVDbGlja1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUNvbnRlbnRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmF1dG9lZGl0LkF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYXV0b2VkaXQuU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkpTUENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkpTUEVMQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSlNQSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Lk5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmZvcm1hdC5Gb3JtYXR0aW5nU3RyYXRlZ3lKU1BKYXZhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qYXZhLkxpbmVTdHlsZVByb3ZpZGVyRm9ySmF2YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmpzcGVsLkxpbmVTdHlsZVByb3ZpZGVyRm9ySlNQRUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnRleHQuSUNTU1BhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQuSFRNTEZvcm1hdFByb2Nlc3NvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZm9ybWF0LlN0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBhIHNvdXJjZSB2aWV3ZXIgd2hpY2ggc2hvd3MgSlNQIGNvbnRlbnQuCi0gKiA8cD4KLSAqIENsaWVudHMgY2FuIHN1YmNsYXNzIGFuZCBvdmVycmlkZSBqdXN0IHRob3NlIG1ldGhvZHMgd2hpY2ggbXVzdCBiZSBzcGVjaWZpYwotICogdG8gdGhlaXIgbmVlZHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiB7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24gYmVjYXVzZSBub3Qgc291cmNldmlld2VyLXNwZWNpZmljIGFuZAotCSAqIGl0J3MgYSBTdHJpbmcgYXJyYXkKLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGZDb25maWd1cmVkQ29udGVudFR5cGVzOwotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBmTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhOwotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBmTGluZVN0eWxlUHJvdmlkZXJGb3JKU1A7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGZMaW5lU3R5bGVQcm92aWRlckZvckpTUEVMOwotCXByaXZhdGUgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGZIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLQlwcml2YXRlIEphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGZKYXZhU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBmWE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGZTdGF0dXNMaW5lTGFiZWxQcm92aWRlcjsKLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUCgpIHsKLQkJLy8gTXVzdCBoYXZlIGVtcHR5IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24KLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24jZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJQXV0b0VkaXRTdHJhdGVneVtdIGdldEF1dG9FZGl0U3RyYXRlZ2llcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCUlBdXRvRWRpdFN0cmF0ZWd5W10gc3RyYXRlZ2llcyA9IG51bGw7Ci0KLQkJaWYgKGNvbnRlbnRUeXBlID09IElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUKSB7Ci0JCQkvLyB4bWwgYXV0b2VkaXQgc3RyYXRlZ2llcwotCQkJc3RyYXRlZ2llcyA9IGdldFhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRBdXRvRWRpdFN0cmF0ZWdpZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQSkgewotCQkJLy8ganNwIGphdmEgYXV0b2VkaXQgc3RyYXRlZ2llcwotCQkJTGlzdCBhbGxTdHJhdGVnaWVzID0gbmV3IEFycmF5TGlzdCgwKTsKLQotCQkJSUF1dG9FZGl0U3RyYXRlZ3lbXSBqYXZhU3RyYXRlZ2llcyA9IGdldEphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKHNvdXJjZVZpZXdlciwgSUphdmFQYXJ0aXRpb25zLkpBVkFfUEFSVElUSU9OSU5HKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgamF2YVN0cmF0ZWdpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlhbGxTdHJhdGVnaWVzLmFkZChqYXZhU3RyYXRlZ2llc1tpXSk7Ci0JCQl9Ci0JCQkvLyBiZSBzdXJlIHRoaXMgaXMgYWRkZWQgbGFzdCwgYWZ0ZXIgb3RoZXJzLCBzbyBpdCBjYW4gbW9kaWZ5Ci0JCQkvLyByZXN1bHRzIGZyb20gZWFybGllciBzdGVwcy4KLQkJCS8vIGFkZCBhdXRvIGVkaXQgc3RyYXRlZ3kgdGhhdCBoYW5kbGVzIHdoZW4gdGFiIGtleSBpcyBwcmVzc2VkCi0JCQlhbGxTdHJhdGVnaWVzLmFkZChuZXcgQXV0b0VkaXRTdHJhdGVneUZvclRhYnMoKSk7Ci0KLQkJCXN0cmF0ZWdpZXMgPSAoSUF1dG9FZGl0U3RyYXRlZ3lbXSkgYWxsU3RyYXRlZ2llcy50b0FycmF5KG5ldyBJQXV0b0VkaXRTdHJhdGVneVthbGxTdHJhdGVnaWVzLnNpemUoKV0pOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQgfHwgY29udGVudFR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVDTEFSQVRJT04pIHsKLQkJCS8vIGh0bWwgYW5kIGpzcCBhdXRvZWRpdCBzdHJhdGVnaWVzCi0JCQlMaXN0IGFsbFN0cmF0ZWdpZXMgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCQkvLyBhZGQgdGhlIGpzcCBhdXRvZWRpdCBzdHJhdGVneSBmaXJzdCB0aGVuIGFkZCBhbGwgaHRtbCdzCi0JCQlhbGxTdHJhdGVnaWVzLmFkZChuZXcgU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lKU1AoKSk7Ci0KLQkJCUlBdXRvRWRpdFN0cmF0ZWd5W10gaHRtbFN0cmF0ZWdpZXMgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldEF1dG9FZGl0U3RyYXRlZ2llcyhzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaHRtbFN0cmF0ZWdpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlhbGxTdHJhdGVnaWVzLmFkZChodG1sU3RyYXRlZ2llc1tpXSk7Ci0JCQl9Ci0KLQkJCXN0cmF0ZWdpZXMgPSAoSUF1dG9FZGl0U3RyYXRlZ3lbXSkgYWxsU3RyYXRlZ2llcy50b0FycmF5KG5ldyBJQXV0b0VkaXRTdHJhdGVneVthbGxTdHJhdGVnaWVzLnNpemUoKV0pOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gZGVmYXVsdCBhdXRvZWRpdCBzdHJhdGVnaWVzCi0JCQlMaXN0IGFsbFN0cmF0ZWdpZXMgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCQlJQXV0b0VkaXRTdHJhdGVneVtdIHN1cGVyU3RyYXRlZ2llcyA9IHN1cGVyLmdldEF1dG9FZGl0U3RyYXRlZ2llcyhzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJTdHJhdGVnaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYWxsU3RyYXRlZ2llcy5hZGQoc3VwZXJTdHJhdGVnaWVzW2ldKTsKLQkJCX0KLQotCQkJLy8gYmUgc3VyZSB0aGlzIGlzIGFkZGVkIGxhc3QsIGFmdGVyIG90aGVycywgc28gaXQgY2FuIG1vZGlmeQotCQkJLy8gcmVzdWx0cyBmcm9tIGVhcmxpZXIgc3RlcHMuCi0JCQkvLyBhZGQgYXV0byBlZGl0IHN0cmF0ZWd5IHRoYXQgaGFuZGxlcyB3aGVuIHRhYiBrZXkgaXMgcHJlc3NlZAotCQkJYWxsU3RyYXRlZ2llcy5hZGQobmV3IEF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzKCkpOwotCi0JCQlzdHJhdGVnaWVzID0gKElBdXRvRWRpdFN0cmF0ZWd5W10pIGFsbFN0cmF0ZWdpZXMudG9BcnJheShuZXcgSUF1dG9FZGl0U3RyYXRlZ3lbYWxsU3RyYXRlZ2llcy5zaXplKCldKTsKLQkJfQotCi0JCXJldHVybiBzdHJhdGVnaWVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWlmIChmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9PSBudWxsKSB7Ci0JCQkvKgotCQkJICogQSBsaXR0bGUgYml0IG9mIGNoZWF0aW5nIGJlY2F1c2UgYXNzdW1pbmcgaHRtbCdzIGNvbmZpZ3VyZWQKLQkJCSAqIGNvbnRlbnQgdHlwZXMgd2lsbCBhZGQgZGVmYXVsdCwgdW5rbm93biwgYW5kIGFsbCB4bWwgY29uZmlndXJlZAotCQkJICogY29udGVudCB0eXBlcwotCQkJICovCi0JCQlTdHJpbmdbXSBodG1sVHlwZXMgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCVN0cmluZ1tdIGpzcFR5cGVzID0gU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUC5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCk7Ci0JCQlmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbaHRtbFR5cGVzLmxlbmd0aCArIGpzcFR5cGVzLmxlbmd0aF07Ci0KLQkJCWludCBpbmRleCA9IDA7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGh0bWxUeXBlcywgMCwgZkNvbmZpZ3VyZWRDb250ZW50VHlwZXMsIGluZGV4LCBodG1sVHlwZXMubGVuZ3RoKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoanNwVHlwZXMsIDAsIGZDb25maWd1cmVkQ29udGVudFR5cGVzLCBpbmRleCArPSBodG1sVHlwZXMubGVuZ3RoLCBqc3BUeXBlcy5sZW5ndGgpOwotCQl9Ci0KLQkJcmV0dXJuIGZDb25maWd1cmVkQ29udGVudFR5cGVzOwotCX0KLQotCXByb3RlY3RlZCBJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIGdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIHByb2Nlc3NvcnMgPSBudWxsOwotCi0JCWlmIChwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9ucy5TQ1JJUFQpIHsKLQkJCS8vIEhUTUwgSmF2YVNjcmlwdAotCQkJSUNvbnRlbnRBc3Npc3RhbnQgaHRtbENvbnRlbnRBc3Npc3RhbnQgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldENvbnRlbnRBc3Npc3RhbnQoc291cmNlVmlld2VyKTsKLQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IGh0bWxDb250ZW50QXNzaXN0YW50LmdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoSUhUTUxQYXJ0aXRpb25zLlNDUklQVCk7Ci0JCQlwcm9jZXNzb3JzID0gbmV3IElDb250ZW50QXNzaXN0UHJvY2Vzc29yW117cHJvY2Vzc29yfTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElDU1NQYXJ0aXRpb25zLlNUWUxFKSB7Ci0JCQkvLyBIVE1MIENTUwotCQkJSUNvbnRlbnRBc3Npc3RhbnQgaHRtbENvbnRlbnRBc3Npc3RhbnQgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldENvbnRlbnRBc3Npc3RhbnQoc291cmNlVmlld2VyKTsKLQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IGh0bWxDb250ZW50QXNzaXN0YW50LmdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoSUNTU1BhcnRpdGlvbnMuU1RZTEUpOwotCQkJcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde3Byb2Nlc3Nvcn07Ci0JCX0KLQkJLy8gLy8ganNwY29udGVudGFzc2lzdHByb2Nlc3NvciBoYW5kbGVzIHRoaXM/Ci0JCS8vIGVsc2UgaWYgKChwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9uVHlwZXMuSFRNTF9ERUZBVUxUKSB8fAotCQkvLyAocGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvblR5cGVzLkhUTUxfQ09NTUVOVCkpIHsKLQkJLy8gcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde25ldwotCQkvLyBIVE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcigpfTsKLQkJLy8gfQotCQllbHNlIGlmICgocGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfQ09NTUVOVCkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQpIHx8IChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9ESVJFQ1RJVkUpIHx8IChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0RFTElNSVRFUikgfHwgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVCkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTU1FTlQpKSB7Ci0JCQkvLyBqc3AKLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXXtuZXcgSlNQQ29udGVudEFzc2lzdFByb2Nlc3NvcigpfTsKLQkJfQotCQllbHNlIGlmICgocGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfQ0RBVEEpIHx8IChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkEpKSB7Ci0JCQkvLyBqc3AgamF2YQotCQkJcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde25ldyBKU1BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3NvcigpfTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxUX0VMKSB7Ci0JCQkvLyBqc3AgZWwKLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXXtuZXcgSlNQRUxDb250ZW50QXNzaXN0UHJvY2Vzc29yKCl9OwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvblR5cGUgPT0gSVN0cnVjdHVyZWRQYXJ0aXRpb25zLlVOS05PV05fUEFSVElUSU9OKSB7Ci0JCQkvLyB1bmtub3duCi0JCQlwcm9jZXNzb3JzID0gbmV3IElDb250ZW50QXNzaXN0UHJvY2Vzc29yW117bmV3IE5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckpTUCgpfTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzb3JzOwotCX0KLQotCXB1YmxpYyBJQ29udGVudEZvcm1hdHRlciBnZXRDb250ZW50Rm9ybWF0dGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCUlDb250ZW50Rm9ybWF0dGVyIGZvcm1hdHRlciA9IHN1cGVyLmdldENvbnRlbnRGb3JtYXR0ZXIoc291cmNlVmlld2VyKTsKLQkJLy8gc3VwZXIgd2FzIHVuYWJsZSB0byBjcmVhdGUgYSBmb3JtYXR0ZXIsIHByb2JhYmx5IGJlY2F1c2UKLQkJLy8gc291cmNlVmlld2VyIGRvZXMgbm90IGhhdmUgZG9jdW1lbnQgc2V0IHlldCwgc28ganVzdCBjcmVhdGUgYQotCQkvLyBnZW5lcmljIG9uZQotCQlpZiAoIShmb3JtYXR0ZXIgaW5zdGFuY2VvZiBNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyKSkKLQkJCWZvcm1hdHRlciA9IG5ldyBNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyKGdldENvbmZpZ3VyZWREb2N1bWVudFBhcnRpdGlvbmluZyhzb3VyY2VWaWV3ZXIpLCBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCk7Ci0KLQkJTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlciBtdWx0aUZvcm1hdHRlciA9IChNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyKSBmb3JtYXR0ZXI7Ci0JCW11bHRpRm9ybWF0dGVyLnNldE1hc3RlclN0cmF0ZWd5KG5ldyBTdHJ1Y3R1cmVkRm9ybWF0dGluZ1N0cmF0ZWd5KG5ldyBIVE1MRm9ybWF0UHJvY2Vzc29ySW1wbCgpKSk7Ci0JCW11bHRpRm9ybWF0dGVyLnNldFNsYXZlU3RyYXRlZ3kobmV3IEZvcm1hdHRpbmdTdHJhdGVneUpTUEphdmEoKSwgSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQSk7Ci0KLQkJcmV0dXJuIGZvcm1hdHRlcjsKLQl9Ci0KLQlwdWJsaWMgSVRleHREb3VibGVDbGlja1N0cmF0ZWd5IGdldERvdWJsZUNsaWNrU3RyYXRlZ3koSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlJVGV4dERvdWJsZUNsaWNrU3RyYXRlZ3kgc3RyYXRlZ3kgPSBudWxsOwotCi0JCS8vIGh0bWwgb3IgamF2YXNjcmlwdAotCQlpZiAoY29udGVudFR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCB8fCBjb250ZW50VHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKQotCQkJc3RyYXRlZ3kgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldERvdWJsZUNsaWNrU3RyYXRlZ3koc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkEgfHwgY29udGVudFR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVCkKLQkJCS8vIEpTUCBKYXZhIG9yIEpTUCBKYXZhU2NyaXB0Ci0JCQlzdHJhdGVneSA9IGdldEphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0RG91YmxlQ2xpY2tTdHJhdGVneShzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJZWxzZSBpZiAoY29udGVudFR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQpCi0JCQkvLyBKU1AgKGp1c3QgdHJlYXQgbGlrZSBodG1sKQotCQkJc3RyYXRlZ3kgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldERvdWJsZUNsaWNrU3RyYXRlZ3koc291cmNlVmlld2VyLCBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUKTsKLQkJZWxzZQotCQkJc3RyYXRlZ3kgPSBzdXBlci5nZXREb3VibGVDbGlja1N0cmF0ZWd5KHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUpOwotCi0JCXJldHVybiBzdHJhdGVneTsKLQl9Ci0KLQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJaWYgKGZIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0JCQlmSFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCgpOwotCQl9Ci0JCXJldHVybiBmSFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldEluZGVudFByZWZpeGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJU3RyaW5nW10gaW5kZW50YXRpb25zID0gbnVsbDsKLQotCQlpZiAoY29udGVudFR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQpCi0JCQlpbmRlbnRhdGlvbnMgPSBnZXRYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0SW5kZW50UHJlZml4ZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCWVsc2UKLQkJCWluZGVudGF0aW9ucyA9IGdldEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0SW5kZW50UHJlZml4ZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0KLQkJcmV0dXJuIGluZGVudGF0aW9uczsKLQl9Ci0KLQlwcml2YXRlIEphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGdldEphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQlpZiAoZkphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID09IG51bGwpIHsKLQkJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkJLyoKLQkJCSAqIE5PVEU6IG51bGwgdGV4dCBlZGl0b3IgaXMgYmVpbmcgcGFzc2VkIHRvCi0JCQkgKiBKYXZhU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBiZWNhdXNlCi0JCQkgKiBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gZG9lcyBub3Qga25vdyBjdXJyZW50IGVkaXRvci4KLQkJCSAqIHRoaXMgaXMgb2theSBiZWNhdXNlIGVkaXRvciBpcyBub3QgbmVlZGVkIGluIHRoZSBjYXNlcyB3ZSBhcmUKLQkJCSAqIHVzaW5nIGphdmFzb3VyY2V2aWV3ZXJjb25maWd1cmF0aW9uLgotCQkJICovCi0JCQlmSmF2YVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgSmF2YVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oSmF2YVVJLmdldENvbG9yTWFuYWdlcigpLCBzdG9yZSwgbnVsbCwgSUphdmFQYXJ0aXRpb25zLkpBVkFfUEFSVElUSU9OSU5HKTsKLQkJfQotCQlyZXR1cm4gZkphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotCX0KLQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJTGluZVN0eWxlUHJvdmlkZXJbXSBwcm92aWRlcnMgPSBudWxsOwotCi0JCWlmIChwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQgfHwgcGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9DT01NRU5UIHx8IHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVDTEFSQVRJT04pIHsKLQkJCXByb3ZpZGVycyA9IGdldEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCk7Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUIHx8IHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVCkgewotCQkJcHJvdmlkZXJzID0gZ2V0SFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElDU1NQYXJ0aXRpb25zLlNUWUxFKSB7Ci0JCQlwcm92aWRlcnMgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIElDU1NQYXJ0aXRpb25zLlNUWUxFKTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUIHx8IHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0NEQVRBIHx8IHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0NPTU1FTlQgfHwgcGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfREVDTEFSQVRJT04gfHwgcGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfUEkpIHsKLQkJCXByb3ZpZGVycyA9IGdldFhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCk7Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBKSB7Ci0JCQlwcm92aWRlcnMgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJbXXtnZXRMaW5lU3R5bGVQcm92aWRlckZvckphdmEoKX07Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVF9FTCkgewotCQkJcHJvdmlkZXJzID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyW117Z2V0TGluZVN0eWxlUHJvdmlkZXJGb3JKU1BFTCgpfTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT01NRU5UIHx8IHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfREVMSU1JVEVSIHx8IHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQgfHwgcGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFKSB7Ci0JCQlwcm92aWRlcnMgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJbXXtnZXRMaW5lU3R5bGVQcm92aWRlckZvckpTUCgpfTsKLQkJfQotCi0JCXJldHVybiBwcm92aWRlcnM7Ci0JfQotCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBnZXRMaW5lU3R5bGVQcm92aWRlckZvckphdmEoKSB7Ci0JCWlmIChmTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhID09IG51bGwpIHsKLQkJCWZMaW5lU3R5bGVQcm92aWRlckZvckphdmEgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhKCk7Ci0JCX0KLQkJcmV0dXJuIGZMaW5lU3R5bGVQcm92aWRlckZvckphdmE7Ci0JfQotCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBnZXRMaW5lU3R5bGVQcm92aWRlckZvckpTUCgpIHsKLQkJaWYgKGZMaW5lU3R5bGVQcm92aWRlckZvckpTUCA9PSBudWxsKSB7Ci0JCQlmTGluZVN0eWxlUHJvdmlkZXJGb3JKU1AgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JKU1AoKTsKLQkJfQotCQlyZXR1cm4gZkxpbmVTdHlsZVByb3ZpZGVyRm9ySlNQOwotCX0KLQotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZ2V0TGluZVN0eWxlUHJvdmlkZXJGb3JKU1BFTCgpIHsKLQkJaWYgKGZMaW5lU3R5bGVQcm92aWRlckZvckpTUEVMID09IG51bGwpIHsKLQkJCWZMaW5lU3R5bGVQcm92aWRlckZvckpTUEVMID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyRm9ySlNQRUwoKTsKLQkJfQotCQlyZXR1cm4gZkxpbmVTdHlsZVByb3ZpZGVyRm9ySlNQRUw7Ci0JfQotCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGdldFN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWlmIChmU3RhdHVzTGluZUxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyID0gbmV3IEpGYWNlTm9kZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0KLQkJCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCQkJCXJldHVybiBudWxsOwotCi0JCQkJCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgZWxlbWVudDsKLQkJCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQkJCQlzLmluc2VydCgwLCBzdXBlci5nZXRUZXh0KG5vZGUpKTsKLQkJCQkJCX0KLQkJCQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWlmIChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCQkJCXMuaW5zZXJ0KDAsIElQYXRoLlNFUEFSQVRPUik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHMudG9TdHJpbmcoKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGZTdGF0dXNMaW5lTGFiZWxQcm92aWRlcjsKLQl9Ci0KLQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBnZXRYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQlpZiAoZlhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgewotCQkJZlhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MKCk7Ci0JCX0KLQkJcmV0dXJuIGZYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotCX0KLQotCXByb3RlY3RlZCBNYXAgZ2V0SHlwZXJsaW5rRGV0ZWN0b3JUYXJnZXRzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCU1hcCB0YXJnZXRzID0gc3VwZXIuZ2V0SHlwZXJsaW5rRGV0ZWN0b3JUYXJnZXRzKHNvdXJjZVZpZXdlcik7Ci0JCXRhcmdldHMucHV0KENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1AsIG51bGwpOwotCi0JCS8vIGFsc28gYWRkIGh0bWwgJiB4bWwgc2luY2UgdGhlcmUgY291bGQgYmUgaHRtbC94bWwgY29udGVudCBpbiBqc3AKLQkJLy8gKGp1c3QgaG9wZSB0aGUgaHlwZXJsaW5rIGRldGVjdG9ycyB3aWxsIGRvIGFkZGl0aW9uYWwgY2hlY2tpbmcpCi0JCXRhcmdldHMucHV0KENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTCwgbnVsbCk7Ci0JCXRhcmdldHMucHV0KENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwsIG51bGwpOwotCQlyZXR1cm4gdGFyZ2V0czsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSUFjdGlvbkNvbnN0YW50c0pTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0lBY3Rpb25Db25zdGFudHNKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQwMDc4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSUFjdGlvbkNvbnN0YW50c0pTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGlvbkNvbnN0YW50c0pTUCB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfUkVOQU1FX0VMRU1FTlQgPSAiUmVuYW1lRWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9NT1ZFX0VMRU1FTlQgPSAiTW92ZUVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSUFjdGlvbkRlZmluaXRpb25JZHNKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9JQWN0aW9uRGVmaW5pdGlvbklkc0pTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTA2MDdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9JQWN0aW9uRGVmaW5pdGlvbklkc0pTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLmFjdGlvbnMuSUphdmFFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGlvbkRlZmluaXRpb25JZHNKU1AgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTkFNRV9FTEVNRU5UID0gSUphdmFFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLlJFTkFNRV9FTEVNRU5UOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1PVkVfRUxFTUVOVCA9IElKYXZhRWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5NT1ZFX0VMRU1FTlQ7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSlNQVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0pTUFVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM4YmE2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSlNQVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IEpTUCBVSQotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEpTUFVJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZlJlc291cmNlQnVuZGxlOwotCQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBKU1BVSU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKGZSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCWZSZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlmUmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiBmUmVzb3VyY2VCdW5kbGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2FtcGxlX0pTUF9kb2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQX0RlbGltaXRlcnNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlZmFjdG9yX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUVsZW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVFbGVtZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRWxlbWVudFdpemFyZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPSzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BfY2hhbmdlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpb25Db250cmlidXRvckpTUF8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFJlbmFtZUVsZW1lbnRBY3Rpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BNb3ZlRWxlbWVudEFjdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcmVha3BvaW50Tm90QWxsb3dlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19IRUFESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfTkVXX0RFU0NSSVBUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfVEFHX05FV19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX1RBR19ORVdfSEVBRElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX1RBR19ORVdfREVTQ1JJUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0pTUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTklOR19GSUxFX01VU1RfQkVfSU5TSURFX0pBVkFfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3VGFnVGVtcGxhdGVzV2l6YXJkUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3VGFnVGVtcGxhdGVzV2l6YXJkUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X2Rlc2NyaXB0aW9uOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXA7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbjsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfdG9vbHRpcDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaW5kT2NjdXJyZW5jZXNfbGFiZWw7CS8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcnJpZGVfbWV0aG9kX2luOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0aW5nX2ZpbGVzX2VuY29kaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRfQXNzaXN0X25vdF9hdmFpbGFiX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXZhX0NvbnRlbnRfQXNzaXN0X2lzX25vdF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQQ29sb3JQYWdlX2pzcF9jb250ZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZpbGVzUHJlZmVyZW5jZVBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGaWxlc1ByZWZlcmVuY2VQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0SlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRpdGxlX0ludmFsaWRWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXNzYWdlX0ludmFsaWRWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW50YXhDb2xvcmluZ1BhZ2VfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU1RSVUNUVVJFRF9URVhUX0VESVRPUl9QUkVGU19MSU5LOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFR5cGluZ19BdXRvX0NvbXBsZXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFR5cGluZ19Db21wbGV0ZV9TY3JpcHRsZXRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFR5cGluZ19Db21wbGV0ZV9CcmFjZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzA7Ci0KLQkvLyBiZWxvdyBhcmUgdGhlIHN0cmluZ3MgZm9yIHRoZSB2YWxpZGF0aW9uIHBhZ2UKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25fV2FybmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uX0Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25fSWdub3JlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9IRUFERVJfRElSRUNUSVZFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9EVVBMSUNBVEVfUFJFRklYRVNfRElGRkVSRU5UX1VSSVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX0RVUExJQ0FURV9QUkVGSVhFU19TQU1FX1VSSVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX01JU1NJTkdfUFJFRklYOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9NSVNTSU5HX1VSSV9PUl9UQUdESVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX1VOUkVTT0xWQUJMRV9VUklfT1JfVEFHRElSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fRElSRUNUSVZFX1BBR0VfU1VQRVJDTEFTU19OT1RfRk9VTkQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9ESVJFQ1RJVkVfSU5DTFVERV9OT19GSUxFX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0RJUkVDVElWRV9JTkNMVURFX0ZJTEVfTk9UX0ZPVU5EOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fSEVBREVSX0pBVkE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9KQVZBX05PVElDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0pBVkFfTE9DQUxfVkFSSUFCTEVfTkVWRVJfVVNFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0pBVkFfQVJHVU1FTlRfSVNfTkVWRVJfVVNFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0pBVkFfTlVMTF9MT0NBTF9WQVJJQUJMRV9SRUZFUkVOQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9KQVZBX1BPVEVOVElBTF9OVUxMX0xPQ0FMX1ZBUklBQkxFX1JFRkVSRU5DRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0pBVkFfVU5VU0VEX0lNUE9SVDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fSEVBREVSX0VMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fRUxfU1lOVEFYOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fRUxfTEVYRVI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0hFQURFUl9DVVNUT01fQUNUSU9OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfTUlTU0lOR19SRVFVSVJFRF9BVFRSSUJVVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9BQ1RJT05TX1NFVkVSSVRZX1VOS05PV05fQVRUUklCVVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9OT05fRU1QVFlfSU5MSU5FX1RBRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9WQUxJREFUSU9OX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfTk9UX0ZPVU5EOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX0NMQVNTX05PVF9JTlNUQU5USUFURUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfUlVOVElNRV9FWENFUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVElPTl9UUkFOU0xBVElPTl9UQUdfSEFORExFUl9DTEFTU19OT1RfRk9VTkQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFUSU9OX0hFQURFUl9TVEFOREFSRF9BQ1RJT05TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fVFJBTlNMQVRJT05fVVNFQkVBTl9JTlZBTElEX0lEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fVFJBTlNMQVRJT05fVVNCRUFOX01JU1NJTkdfVFlQRV9JTkZPOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRJT05fVFJBTlNMQVRJT05fVVNFQkVBTl9BTUJJR1VPVVNfVFlQRV9JTkZPOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0pTUFVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSlNQVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjY2I4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSlNQVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkpTUFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC50ZW1wbGF0ZXMuQ29udHJpYnV0aW9uVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIEpTUFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC51aSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgSlNQVUlQbHVnaW4gaW5zdGFuY2UgPSBudWxsOwkKLQkKLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBqc3AgZWRpdG9yLiAKLQkgKi8KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlRlbXBsYXRlU3RvcmU7Ci0JCi0JLyoqIAotCSAqIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBqc3AgZWRpdG9yLiAKLQkgKi8KLQlwcml2YXRlIENvbnRleHRUeXBlUmVnaXN0cnkgZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0KLQlwdWJsaWMgSlNQVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEpTUFVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBKU1BVSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5IGdldEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBqc3AgZWRpdG9yIHRlbXBsYXRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIGpzcCBlZGl0b3IgdGVtcGxhdGVzCi0JICovCi0JcHVibGljIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpIHsKLQkJaWYgKGZUZW1wbGF0ZVN0b3JlID09IG51bGwpIHsKLQkJCWZUZW1wbGF0ZVN0b3JlPSBuZXcgQ29udHJpYnV0aW9uVGVtcGxhdGVTdG9yZShnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpLCBnZXRQcmVmZXJlbmNlU3RvcmUoKSwgSlNQVUlQcmVmZXJlbmNlTmFtZXMuVEVNUExBVEVTX0tFWSk7Ci0KLQkJCXRyeSB7Ci0JCQkJZlRlbXBsYXRlU3RvcmUubG9hZCgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0JCQotCQlyZXR1cm4gZlRlbXBsYXRlU3RvcmU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGpzcCBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUganNwIHBsdWdpbgotCSAqLwotCXB1YmxpYyBDb250ZXh0VHlwZVJlZ2lzdHJ5IGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkgewotCQlpZiAoZkNvbnRleHRUeXBlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeSByZWdpc3RyeSA9IG5ldyBDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5KCk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLkFMTCk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLk5FVyk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLlRBRyk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLkFUVFJJQlVURSk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLkFUVFJJQlVURV9WQUxVRSk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLk5FV19UQUcpOwotCQkJCi0JCQlmQ29udGV4dFR5cGVSZWdpc3RyeT0gcmVnaXN0cnk7Ci0JCX0KLQotCQlyZXR1cm4gZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0pTUFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSlNQVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjYTdhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSlNQVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyBUaGUgZm9sbG93aW5nIGxpbmUgaXMgYSBzYW1wbGUgSlNQIGRvY3VtZW50LiAgUGxlYXNlIHRyYW5zbGF0ZSBvbmx5IHRoZSBmb2xsb3dpbmcgcGFydHM6Ci0jIyBVc2UgYmVsb3cgdGFncyBPTkxZIGZvciBKU1AgMS4xCi0jIyBXZWxjb21lIQotIyMgVXNlIGJlbG93IHRhZ3MgT05MWSBmb3IgSlNQIDEuMgotIyMgV2VsY29tZSEKLVNhbXBsZV9KU1BfZG9jPTwlQCBwYWdlIFxuXHRsYW5ndWFnZT1cImphdmFcIiBcblx0Y29udGVudFR5cGU9XCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMVwiXG4lPlxuPGpzcDppbmNsdWRlIGZsdXNoPVwidHJ1ZVwiIHBhZ2U9XCJ0aXRsZUJhci5qc3BcIi8+XG5cbjwlLS0gVXNlIGJlbG93IHRhZ3MgT05MWSBmb3IgSlNQIDEuMSAtLSU+XG48JVxuXHRTeXN0ZW0ub3V0LnByaW50bG4oXCJXZWxjb21lIVwiKTtcbiU+XG48JS0tIFVzZSBiZWxvdyB0YWdzIE9OTFkgZm9yIEpTUCAxLjIgLS0lPlxuPGpzcDpzY3JpcHRsZXQ+XG5cdFN5c3RlbS5vdXQucHJpbnRsbihcIldlbGNvbWUhXCIpO1xuPC9qc3A6c2NyaXB0bGV0PgotSlNQX0RlbGltaXRlcnNfVUlfPVNjcmlwdGluZyBFbGVtZW50IERlbGltaXRlcnMKLVJlZmFjdG9yX2xhYmVsPVJlZmFjdG9yCi1SZW5hbWVFbGVtZW50X2xhYmVsPVJlbmFtZQotTW92ZUVsZW1lbnRfbGFiZWw9TW92ZQotTW92ZUVsZW1lbnRXaXphcmQ9TW92ZSB0aGUgc2VsZWN0ZWQgZWxlbWVudHMKLSMKLU9LPU9LCi1CcmVha3BvaW50Tm90QWxsb3dlZD1BIGJyZWFrcG9pbnQgaXMgbm90IGFsbG93ZWQgb24gdGhpcyBsaW5lCi1KU1BfY2hhbmdlcz1KU1AgY2hhbmdlcwotQWN0aW9uQ29udHJpYnV0b3JKU1BfMD1SZWZhJmN0b3IKLUpTUFJlbmFtZUVsZW1lbnRBY3Rpb25fMD1FZGl0b3Igc2VsZWN0aW9uIGRvZXMgbm90IHJlc29sdmUgdG8gYSByZW5hbWFibGUgSmF2YSBlbGVtZW50Ci1KU1BNb3ZlRWxlbWVudEFjdGlvbl8wPUVkaXRvciBzZWxlY3Rpb24gZG9lcyBub3QgcmVzb2x2ZSB0byBtb3ZhYmxlIEphdmEgZWxlbWVudHMKLUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMD1KU1AgUmVuYW1lCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzE9aW4gZmlsZTogezB9IGxpbmU6IHsxfQotQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8yPU1vdmUgVHlwZSAnJ3swfScnIHRvIHBhY2thZ2UgJyd7MX0nJwotQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8zPVJlbmFtZSBNZXRob2QgJyd7MH0nJyB0byAnJ3sxfScnCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzQ9UmVuYW1lIFR5cGUgJyd7MH0nJyB0byAnJ3sxfScnCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzU9UmVuYW1lIFBhY2thZ2UgJyd7MH0nJyB0byAnJ3sxfScnCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzY9SlNQIFJlbmFtZSBDaGFuZ2UKLSMKLV9VSV9XSVpBUkRfTkVXX1RJVExFID0gTmV3IEphdmFTZXJ2ZXIgUGFnZQotX1VJX1dJWkFSRF9ORVdfSEVBRElORyA9IEphdmFTZXJ2ZXIgUGFnZQotX1VJX1dJWkFSRF9ORVdfREVTQ1JJUFRJT04gPSBDcmVhdGUgYSBuZXcgSmF2YVNlcnZlciBQYWdlLgotX1VJX1dJWkFSRF9UQUdfTkVXX1RJVExFID0gTmV3IFRhZyBGaWxlCi1fVUlfV0laQVJEX1RBR19ORVdfSEVBRElORyA9IFRhZyBGaWxlCi1fVUlfV0laQVJEX1RBR19ORVdfREVTQ1JJUFRJT04gPSBDcmVhdGUgYSBuZXcgVGFnLgotX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0pTUCA9IFRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9ucyB7MH0uIAotX1dBUk5JTkdfRklMRV9NVVNUX0JFX0lOU0lERV9KQVZBX1BST0pFQ1QgPSBKYXZhU2VydmVyIFBhZ2VzIGNyZWF0ZWQgaW4gcHJvamVjdHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBKYXZhIG1pZ2h0IG5vdCB3b3JrIGFzIGV4cGVjdGVkLiAKLV9XQVJOSU5HX0ZPTERFUl9NVVNUX0JFX0lOU0lERV9XRUJfQ09OVEVOVCA9IEZpbGVzIGNyZWF0ZWQgb3V0c2lkZSBvZiB0aGUgV2ViIENvbnRlbnQgZm9sZGVyIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHlvdXIgZGVwbG95ZWQgV2ViIGFwcGxpY2F0aW9uLiAKLVJlc291cmNlR3JvdXBfbmFtZUV4aXN0cyA9IFRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuCi1OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzA9U2VsZWN0IEpTUCBUZW1wbGF0ZQotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8xPVNlbGVjdCBhIHRlbXBsYXRlIGFzIGluaXRpYWwgY29udGVudCBpbiB0aGUgSlNQIHBhZ2UuCi1OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzI9TmFtZQotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8zPURlc2NyaXB0aW9uCi1OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzQ9VXNlIEpTUCBUZW1wbGF0ZQotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV81PVByZXZpZXcKLU5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfNj1UZW1wbGF0ZXMgYXJlICdOZXcgSlNQJyB0ZW1wbGF0ZXMgZm91bmQgaW4gdGhlIDxhPkpTUCBUZW1wbGF0ZXM8L2E+IHByZWZlcmVuY2UgcGFnZS4KLU5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfMD1TZWxlY3QgVGFnIGZpbGUgVGVtcGxhdGUKLU5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfMT1TZWxlY3QgYSB0ZW1wbGF0ZSBhcyBpbml0aWFsIGNvbnRlbnQgaW4gdGhlIFRhZyBmaWxlLgotTmV3VGFnVGVtcGxhdGVzV2l6YXJkUGFnZV8yPU5hbWUKLU5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfMz1EZXNjcmlwdGlvbgotTmV3VGFnVGVtcGxhdGVzV2l6YXJkUGFnZV80PVVzZSBUYWcgZmlsZSBUZW1wbGF0ZQotTmV3VGFnVGVtcGxhdGVzV2l6YXJkUGFnZV81PVByZXZpZXcKLU5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfNj1UZW1wbGF0ZXMgYXJlICdOZXcgVGFnJyB0ZW1wbGF0ZXMgZm91bmQgaW4gdGhlIDxhPkpTUCBUZW1wbGF0ZXM8L2E+IHByZWZlcmVuY2UgcGFnZS4KLSMgQ29waWVkIGZyb20gc3NlLnVpCi1DbGVhbnVwRG9jdW1lbnRfbGFiZWw9Q2xlYW51cCBEb2N1bWVudC4uLgotQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA9Q2xlYW51cCBEb2N1bWVudAotQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uPUNsZWFudXAgRG9jdW1lbnQKLVRvZ2dsZUNvbW1lbnRfbGFiZWw9VG9nZ2xlIENvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfdG9vbHRpcD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF9kZXNjcmlwdGlvbj1Ub2dnbGUgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2xhYmVsPUFkZCBCbG9jayBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfdG9vbHRpcD1BZGQgQmxvY2sgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uPUFkZCBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwPVJlbW92ZSBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb249UmVtb3ZlIEJsb2NrIENvbW1lbnQKLUZpbmRPY2N1cnJlbmNlc19sYWJlbD1PY2N1cnJlbmNlcyBpbiBGaWxlCi1PY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzA9ezB9IC0gezF9IE9jY3VycmVuY2VzIGluIHsyfQotT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8yPWZpbGUKLUNvbnRlbnRfQXNzaXN0X25vdF9hdmFpbGFiX1VJXz1Db250ZW50IEFzc2lzdCBub3QgYXZhaWxhYmxlIGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uCi1KYXZhX0NvbnRlbnRfQXNzaXN0X2lzX25vdF9VSV89SmF2YSBDb250ZW50IEFzc2lzdCBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudCBjdXJzb3IgbG9jYXRpb24KLSMKLU92ZXJyaWRlX21ldGhvZF9pbj1PdmVycmlkZSBtZXRob2QgaW4gJwotQ3JlYXRpbmdfZmlsZXNfZW5jb2Rpbmc9Q3JlYXRpbmcgZmlsZXMgZW5jb2RpbmcgcHJlZmVyZW5jZQotIwotSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMD1KU1AgU291cmNlIHByZWZlcmVuY2VzIGFyZSBiYXNlZCBvbiB0aGUgY29udGVudCB3aXRoaW4gdGhlIEpTUC4KLUpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzE9U2VlIDxhPicnezB9Jyc8L2E+IGZvciBKU1Agd2l0aCBIVE1MIGNvbnRlbnQuCi1KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8yPVNlZSA8YT4nJ3swfScnPC9hPiBmb3IgSlNQIHdpdGggWE1MIGNvbnRlbnQuCi1KU1BDb2xvclBhZ2VfanNwX2NvbnRlbnQ9U2NyaXB0aW5nIEVsZW1lbnRzCi1KU1BGaWxlc1ByZWZlcmVuY2VQYWdlXzA9VmFsaWRhdGluZyBmaWxlcwotSlNQRmlsZXNQcmVmZXJlbmNlUGFnZV8xPVZhbGlkYXRlIEpTUCBmcmFnbWVudHMKLSMgSlNQIEZyYWdtZW50cwotSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wPW5vbmUKLUpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMT1UaGUgcHJvcGVydGllcyB1c2VkIGluc3RlYWQgb2YgdGhlIHBhZ2UgZGlyZWN0aXZlIHRoYXQgY2Fubm90IGJlIHNwZWNpZmllZCBpbiBKU1AgZnJhZ21lbnQgZmlsZXMuICBUaGUgcHJvamVjdCBzZXR0aW5nIGlzIHVzZWQgaWYgeW91IHNwZWNpZnkgIm5vbmUuIgotSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8yPUxhbmd1YWdlOgotSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8zPUNvbnRlbnQgVHlwZToKLUpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfND1FbmFibGUgc3BlY2lmaWMgc2V0dGluZzoKLVByb2plY3RKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzA9VGhlIHByb3BlcnRpZXMgZm9yIEoyRUUgV2ViIHByb2plY3RzIGFjdCBhcyAicHJvamVjdCIgZGVmYXVsdCB0byBiZSBsb29rZWQgdXAgd2hlbiBubyBwcm9wZXJ0aWVzIGFyZSBzcGVjaWZpZWQgZm9yIGEgcGFydGljdWxhciBKU1AgZnJhZ21lbnQgZmlsZS4KLSMgQ1NTIEpTUAotVGl0bGVfSW52YWxpZFZhbHVlPUludmFsaWQgVmFsdWUKLU1lc3NhZ2VfSW52YWxpZFZhbHVlPUludmFsaWQgcHJvcGVydHkgdmFsdWUuCi0KLVN5bnRheENvbG9yaW5nUGFnZV8wPVN5bnRheCBFbGVtZW50OgotU3ludGF4Q29sb3JpbmdQYWdlXzI9RW5hYmxlCi1TeW50YXhDb2xvcmluZ1BhZ2VfMz0mQm9sZAotU3ludGF4Q29sb3JpbmdQYWdlXzQ9Jkl0YWxpYwotU3ludGF4Q29sb3JpbmdQYWdlXzU9JlN0cmlrZXRocm91Z2gKLVN5bnRheENvbG9yaW5nUGFnZV82PSZVbmRlcmxpbmUKLV9VSV9TVFJVQ1RVUkVEX1RFWFRfRURJVE9SX1BSRUZTX0xJTks9SlNQIGVkaXRpbmcgcHJlZmVyZW5jZXMuICBOb3RlIHRoYXQgc29tZSBwcmVmZXJlbmNlcyBtYXkgYmUgc2V0IG9uIHRoZSA8YT57MH08L2E+IHByZWZlcmVuY2UgcGFnZS4KLQotIyBKU1AgVHlwaW5nIFByZWZlcmVuY2UgUGFnZQotSlNQVHlwaW5nX0F1dG9fQ29tcGxldGU9QXV0b21hdGljYWxseSBjbG9zZQotSlNQVHlwaW5nX0NvbXBsZXRlX1NjcmlwdGxldHM9JlNjcmlwdGxldCByZWdpb25zCi1KU1BUeXBpbmdfQ29tcGxldGVfQnJhY2VzPSZCcmFjZXMgaW4gRUwgZXhwcmVzc2lvbnMKLSMgVmFsaWRhdGlvbiBwYWdlIHN0cmluZ3MKLVZhbGlkYXRpb25fZGVzY3JpcHRpb249U2VsZWN0IHRoZSBzZXZlcml0eSBsZXZlbCBmb3IgdGhlIGZvbGxvd2luZyB2YWxpZGF0aW9uIHByb2JsZW1zOgotVmFsaWRhdGlvbl9XYXJuaW5nPVdhcm5pbmcKLVZhbGlkYXRpb25fRXJyb3I9RXJyb3IKLVZhbGlkYXRpb25fSWdub3JlPUlnbm9yZQotSlNQVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzA9RXJyb3JzL1dhcm5pbmdzCi0KLVZBTElEQVRJT05fSEVBREVSX0RJUkVDVElWRT1EaXJlY3RpdmVzCi1WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfRFVQTElDQVRFX1BSRUZJWEVTX0RJRkZFUkVOVF9VUklTPVNhbWUgcHJlZml4IHVzZWQgZm9yIGRpZmZlcmVudCBVUklzIG9yIHRhZ2RpcjoKLVZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9EVVBMSUNBVEVfUFJFRklYRVNfU0FNRV9VUklTPVJlZHVuZGFudCB0YWcgbGlicmFyeSBkaXJlY3RpdmU6Ci1WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfTUlTU0lOR19QUkVGSVg9Tm8gcHJlZml4IHNwZWNpZmllZDoKLVZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9NSVNTSU5HX1VSSV9PUl9UQUdESVI9Tm8gVVJJIG9yIHRhZ2RpciBzcGVjaWZpZWQ6Ci1WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfVU5SRVNPTFZBQkxFX1VSSV9PUl9UQUdESVI9VW5yZXNvbHZhYmxlIFVSSSBvciB0YWdkaXI6Ci1WQUxJREFUSU9OX0RJUkVDVElWRV9QQUdFX1NVUEVSQ0xBU1NfTk9UX0ZPVU5EPVN1cGVyY2xhc3Mgbm90IGZvdW5kOgotVkFMSURBVElPTl9ESVJFQ1RJVkVfSU5DTFVERV9OT19GSUxFX1NQRUNJRklFRD1JbmNsdWRlZCBmcmFnbWVudCBmaWxlIG5vdCBzcGVjaWZpZWQ6Ci1WQUxJREFUSU9OX0RJUkVDVElWRV9JTkNMVURFX0ZJTEVfTk9UX0ZPVU5EPUluY2x1ZGVkIGZyYWdtZW50IGZpbGUgbm90IGZvdW5kOgotCi1WQUxJREFUSU9OX0hFQURFUl9KQVZBPUphdmEKLVZBTElEQVRJT05fSkFWQV9OT1RJQ0U9VGhlc2UgdmFsdWVzIG92ZXJyaWRlIHRob3NlIG9uIHRoZSA8YT4nJ3swfScnPC9hPiBwYWdlOgotVkFMSURBVElPTl9KQVZBX0xPQ0FMX1ZBUklBQkxFX05FVkVSX1VTRUQ9TG9jYWwgdmFyaWFibGUgbmV2ZXIgdXNlZDoKLVZBTElEQVRJT05fSkFWQV9BUkdVTUVOVF9JU19ORVZFUl9VU0VEPVBhcmFtZXRlciBpcyBuZXZlciByZWFkOgotVkFMSURBVElPTl9KQVZBX05VTExfTE9DQUxfVkFSSUFCTEVfUkVGRVJFTkNFPU51bGwgcG9pbnRlciBhY2Nlc3M6Ci1WQUxJREFUSU9OX0pBVkFfUE9URU5USUFMX05VTExfTE9DQUxfVkFSSUFCTEVfUkVGRVJFTkNFPVBvdGVudGlhbCBudWxsIHBvaW50ZXIgYWNjZXNzOgotVkFMSURBVElPTl9KQVZBX1VOVVNFRF9JTVBPUlQ9VW51c2VkIGltcG9ydDoKLQkKLVZBTElEQVRJT05fSEVBREVSX0VMPUV4cHJlc3Npb24gTGFuZ3VhZ2UKLVZBTElEQVRJT05fRUxfU1lOVEFYPUVMIFN5bnRheCBwcm9ibGVtOgotVkFMSURBVElPTl9FTF9MRVhFUj1VbmFibGUgdG8gYW5hbHl6ZSBFTCBleHByZXNzaW9uIGR1ZSB0byBsZXhpY2FsIGFuYWx5c2lzIGVycm9yOiAKLQotVkFMSURBVElPTl9IRUFERVJfQ1VTVE9NX0FDVElPTlM9Q3VzdG9tIGFjdGlvbnMKLVZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9NSVNTSU5HX1JFUVVJUkVEX0FUVFJJQlVURT1NaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZToKLVZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9VTktOT1dOX0FUVFJJQlVURT1Vbmtub3duIGF0dHJpYnV0ZToKLVZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9OT05fRU1QVFlfSU5MSU5FX1RBRz1UYWcgZGVjbGFyZWQgd2l0aCBlbXB0eSBjb250ZW50IGhhcyBjb250ZW50OgotVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfVkFMSURBVElPTl9NRVNTQUdFPVRhZ0V4dHJhSW5mbyB2YWxpZGF0aW9uIG1lc3NhZ2U6Ci1WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9DTEFTU19OT1RfRk9VTkQ9VGFnRXh0cmFJbmZvIGNsYXNzIG5vdCBvbiBKYXZhIEJ1aWxkIFBhdGg6Ci1WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9DTEFTU19OT1RfSU5TVEFOVElBVEVEPUZhaWx1cmUgaW5zdGFudGlhdGluZyBUYWdFeHRyYUluZm8gY2xhc3M6Ci1WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9DTEFTU19SVU5USU1FX0VYQ0VQVElPTj1PdGhlciBwcm9ibGVtcyB3aXRoIFRhZ0V4dHJhSW5mbyBjbGFzczoJCi1WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RBR19IQU5ETEVSX0NMQVNTX05PVF9GT1VORD1DbGFzc2ljIHRhZyBoYW5kbGVyIGNsYXNzIG5vdCBvbiBKYXZhIEJ1aWxkIFBhdGg6Ci0KLVZBTElEQVRJT05fSEVBREVSX1NUQU5EQVJEX0FDVElPTlM9U3RhbmRhcmQgYWN0aW9ucwotVkFMSURBVElPTl9UUkFOU0xBVElPTl9VU0VCRUFOX0lOVkFMSURfSUQ9SW52YWxpZCAnaWQnIHNwZWNpZmllZCBmb3IganNwOnVzZUJlYW46Ci1WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1VTQkVBTl9NSVNTSU5HX1RZUEVfSU5GTz1NaXNzaW5nIHR5cGUgaW5mb3JtYXRpb24gZm9yIGpzcDp1c2VCZWFuOgotVkFMSURBVElPTl9UUkFOU0xBVElPTl9VU0VCRUFOX0FNQklHVU9VU19UWVBFX0lORk89QW1iaWd1b3VzIHR5cGUgaW5mb3JtYXRpb24gZm9yIGpzcDp1c2VCZWFuOgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGYwMGY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmIGRlc2lyZWQsCi0gKiB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcyBwbHVnaW4uIE90aGVyCi0gKiBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AudWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgT0s7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIElORk87Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBFUlJPUjsKLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogQHBhcmFtIGxldmVsIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZSB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbiBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogQHBhcmFtIG1lc3NhZ2UgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeSBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aCAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGlzVHJhY2luZyhjYXRlZ29yeSkpIHsKLQkJCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9hdXRvZWRpdC9BdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlY2JjMDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5hdXRvZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQ29uZmlndXJhYmxlTGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklMaW5lVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLQotLyoqCi0gKiBBdXRvRWRpdFN0cmF0ZWd5IHRvIGhhbmRsZSBjaGFyYWN0ZXJzIGluc2VydGVkIHdoZW4gVGFiIGtleSBpcyBwcmVzc2VkCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicyBpbXBsZW1lbnRzIElBdXRvRWRpdFN0cmF0ZWd5IHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBUQUJfQ0hBUkFDVEVSID0gIlx0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHZvaWQgY3VzdG9taXplRG9jdW1lbnRDb21tYW5kKElEb2N1bWVudCBkb2N1bWVudCwgRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJLy8gaWYgbm90IGluIHNtYXJ0IGluc2VydCBtb2RlIGp1c3QgaWdub3JlCi0JCWlmICghaXNTbWFydEluc2VydE1vZGUoKSkKLQkJCXJldHVybjsKLQotCQkvLyBzcGFjZXMgZm9yIHRhYiBjaGFyYWN0ZXIKLQkJaWYgKGNvbW1hbmQubGVuZ3RoID09IDAgJiYgY29tbWFuZC50ZXh0ICE9IG51bGwgJiYgY29tbWFuZC50ZXh0Lmxlbmd0aCgpID4gMCAmJiBjb21tYW5kLnRleHQuaW5kZXhPZihUQUJfQ0hBUkFDVEVSKSAhPSAtMSkKLQkJCXNtYXJ0SW5zZXJ0Rm9yVGFiKGNvbW1hbmQsIGRvY3VtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgc3BhY2VzIGZvciB0YWJzCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc21hcnRJbnNlcnRGb3JUYWIoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyB0YWIga2V5IHdhcyBwcmVzc2VkLiBub3cgY2hlY2sgcHJlZmVyZW5jZXMgdG8gc2VlIGlmIG5lZWQgdG8gaW5zZXJ0Ci0JCS8vIHNwYWNlcyBpbnN0ZWFkIG9mIHRhYgotCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IGdldEluZGVudGF0aW9uV2lkdGgoKTsKLQkJaWYgKGluZGVudGF0aW9uV2lkdGggPiAtMSkgewotCQkJU3RyaW5nIG9yaWdpbmFsVGV4dCA9IGNvbW1hbmQudGV4dDsKLQkJCVN0cmluZ0J1ZmZlciBuZXdUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcihvcmlnaW5hbFRleHQpOwotCi0JCQkvLyBkZXRlcm1pbmUgd2hlcmUgaW4gbGluZSB0aGlzIGNvbW1hbmQgYmVnaW5zCi0JCQlpbnQgbGluZU9mZnNldCA9IC0xOwotCQkJdHJ5IHsKLQkJCQlJUmVnaW9uIGxpbmVJbmZvID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoY29tbWFuZC5vZmZzZXQpOwotCQkJCWxpbmVPZmZzZXQgPSBjb21tYW5kLm9mZnNldCAtIGxpbmVJbmZvLmdldE9mZnNldCgpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQotCQkJSUxpbmVUcmFja2VyIGxpbmVUcmFja2VyID0gZ2V0TGluZVRyYWNrZXIoZG9jdW1lbnQsIG9yaWdpbmFsVGV4dCk7Ci0KLQkJCWludCBzdGFydEluZGV4ID0gMDsKLQkJCWludCBpbmRleCA9IG5ld1RleHQuaW5kZXhPZihUQUJfQ0hBUkFDVEVSKTsKLQkJCXdoaWxlIChpbmRleCAhPSAtMSkgewotCQkJCVN0cmluZyBpbmRlbnQgPSBnZXRJbmRlbnRTdHJpbmcoaW5kZW50YXRpb25XaWR0aCwgbGluZU9mZnNldCwgbGluZVRyYWNrZXIsIGluZGV4KTsKLQotCQkJCS8vIHJlcGxhY2UgXHQgY2hhcmFjdGVyIHdpdGggc3BhY2VzCi0JCQkJbmV3VGV4dC5yZXBsYWNlKGluZGV4LCBpbmRleCArIDEsIGluZGVudCk7Ci0JCQkJaWYgKGxpbmVUcmFja2VyICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWxpbmVUcmFja2VyLnJlcGxhY2UoaW5kZXgsIDEsIGluZGVudCk7Ci0JCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGggcmVwbGFjaW5nIHRleHQsIGp1c3QKLQkJCQkJCS8vIHJlc2V0IHRvIGN1cnJlbnQgc3RyaW5nCi0JCQkJCQlsaW5lVHJhY2tlci5zZXQobmV3VGV4dC50b1N0cmluZygpKTsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXN0YXJ0SW5kZXggPSBpbmRleCArIGluZGVudC5sZW5ndGgoKTsKLQkJCQlpbmRleCA9IG5ld1RleHQuaW5kZXhPZihUQUJfQ0hBUkFDVEVSLCBzdGFydEluZGV4KTsKLQkJCX0KLQkJCWNvbW1hbmQudGV4dCA9IG5ld1RleHQudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZSBudW1iZXIgb2Ygc3BhY2VzIGZvciBuZXh0IHRhYiBzdG9wCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKGludCBpbmRlbnRhdGlvbldpZHRoLCBpbnQgbGluZU9mZnNldCwgSUxpbmVUcmFja2VyIGxpbmVUcmFja2VyLCBpbnQgaW5kZXgpIHsKLQkJaW50IGluZGVudFNpemUgPSBpbmRlbnRhdGlvbldpZHRoOwotCQlpbnQgb2Zmc2V0SW5MaW5lID0gLTE7Ci0JCWlmIChsaW5lVHJhY2tlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlSZWdpb24gbGluZUluZm8gPSBsaW5lVHJhY2tlci5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChpbmRleCk7Ci0JCQkJaWYgKGxpbmVJbmZvLmdldE9mZnNldCgpID09IDAgJiYgbGluZU9mZnNldCA+IC0xKQotCQkJCQlvZmZzZXRJbkxpbmUgPSBsaW5lT2Zmc2V0ICsgaW5kZXg7Ci0JCQkJZWxzZQotCQkJCQlvZmZzZXRJbkxpbmUgPSBpbmRleCAtIGxpbmVJbmZvLmdldE9mZnNldCgpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChsaW5lT2Zmc2V0ID4gLTEpIHsKLQkJCQlvZmZzZXRJbkxpbmUgPSBsaW5lT2Zmc2V0ICsgaW5kZXg7Ci0JCQl9Ci0JCX0KLQkJaWYgKG9mZnNldEluTGluZSA+IC0xICYmIGluZGVudGF0aW9uV2lkdGggPiAwKSB7Ci0JCQlpbnQgcmVtYWluZGVyID0gb2Zmc2V0SW5MaW5lICUgaW5kZW50YXRpb25XaWR0aDsKLQkJCWluZGVudFNpemUgPSBpbmRlbnRhdGlvbldpZHRoIC0gcmVtYWluZGVyOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRTaXplOyBpKyspCi0JCQlpbmRlbnQuYXBwZW5kKCcgJyk7Ci0JCXJldHVybiBpbmRlbnQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdXAgYSBsaW5lIHRyYWNrZXIgZm9yIHRleHQgd2l0aGluIGNvbW1hbmQgaWYgdGV4dCBpcyBtdWx0aS1saW5lCi0JICovCi0JcHJpdmF0ZSBJTGluZVRyYWNrZXIgZ2V0TGluZVRyYWNrZXIoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgb3JpZ2luYWxUZXh0KSB7Ci0JCUNvbmZpZ3VyYWJsZUxpbmVUcmFja2VyIGxpbmVUcmFja2VyID0gbnVsbDsKLQkJaW50W10gZGVsaW1zID0gVGV4dFV0aWxpdGllcy5pbmRleE9mKGRvY3VtZW50LmdldExlZ2FsTGluZURlbGltaXRlcnMoKSwgb3JpZ2luYWxUZXh0LCAwKTsKLQkJaWYgKGRlbGltc1swXSAhPSAtMSB8fCBkZWxpbXNbMV0gIT0gLTEpIHsKLQkJCWxpbmVUcmFja2VyID0gbmV3IENvbmZpZ3VyYWJsZUxpbmVUcmFja2VyKGRvY3VtZW50LmdldExlZ2FsTGluZURlbGltaXRlcnMoKSk7Ci0JCQlsaW5lVHJhY2tlci5zZXQob3JpZ2luYWxUZXh0KTsKLQkJfQotCQlyZXR1cm4gbGluZVRyYWNrZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYWN0aXZlIGVkaXRvciBpcyBpbiBzbWFydCBpbnNlcnQgbW9kZSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1NtYXJ0SW5zZXJ0TW9kZSgpIHsKLQkJYm9vbGVhbiBpc1NtYXJ0SW5zZXJ0TW9kZSA9IGZhbHNlOwotCi0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQkJCQllbHNlCi0JCQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgc21hcnQgaW5zZXJ0IG1vZGUKLQkJaWYgKHRleHRFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvckV4dGVuc2lvbjMgJiYgKChJVGV4dEVkaXRvckV4dGVuc2lvbjMpIHRleHRFZGl0b3IpLmdldEluc2VydE1vZGUoKSA9PSBJVGV4dEVkaXRvckV4dGVuc2lvbjMuU01BUlRfSU5TRVJUKQotCQkJaXNTbWFydEluc2VydE1vZGUgPSB0cnVlOwotCQlyZXR1cm4gaXNTbWFydEluc2VydE1vZGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpbmRlbnRhdGlvbiB3aWR0aCBpZiB1c2luZyBzcGFjZXMgZm9yIGluZGVudGF0aW9uLCAtMSBvdGhlcndpc2UKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0SW5kZW50YXRpb25XaWR0aCgpIHsKLQkJaW50IHdpZHRoID0gLTE7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFLmVxdWFscyhwcmVmZXJlbmNlcy5nZXRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUikpKQotCQkJd2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJcmV0dXJuIHdpZHRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9hdXRvZWRpdC9TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2F1dG9lZGl0L1N0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5SlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYThmOWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2F1dG9lZGl0L1N0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5SlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYXV0b2VkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkpTUFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5SlNQIGltcGxlbWVudHMgSUF1dG9FZGl0U3RyYXRlZ3kgewotCXB1YmxpYyB2b2lkIGN1c3RvbWl6ZURvY3VtZW50Q29tbWFuZChJRG9jdW1lbnQgZG9jdW1lbnQsIERvY3VtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0JCU9iamVjdCB0ZXh0RWRpdG9yID0gZ2V0QWN0aXZlVGV4dEVkaXRvcigpOwotCQlpZiAoISh0ZXh0RWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3JFeHRlbnNpb24zICYmICgoSVRleHRFZGl0b3JFeHRlbnNpb24zKSB0ZXh0RWRpdG9yKS5nZXRJbnNlcnRNb2RlKCkgPT0gSVRleHRFZGl0b3JFeHRlbnNpb24zLlNNQVJUX0lOU0VSVCkpCi0JCQlyZXR1cm47Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCi0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCWlmIChjb21tYW5kLnRleHQgIT0gbnVsbCkgewotCQkJCQlpZiAoY29tbWFuZC50ZXh0LmVxdWFscygiJSIpICYmIGlzUHJlZmVyZW5jZUVuYWJsZWQoSlNQVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX1NDUklQVExFVFMpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIHNjcmlwdGxldCAtIGFkZCBlbmQgJT4KLQkJCQkJCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIG1vZGVsLmdldEluZGV4ZWRSZWdpb24oY29tbWFuZC5vZmZzZXQpOwotCQkJCQkJaWYgKHByZWZpeGVkV2l0aChkb2N1bWVudCwgY29tbWFuZC5vZmZzZXQsICI8IikgJiYgIW5vZGUuZ2V0U291cmNlKCkuZW5kc1dpdGgoIiU+IikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJY29tbWFuZC50ZXh0ICs9ICIgJT4iOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJY29tbWFuZC5zaGlmdHNDYXJldCA9IGZhbHNlOwotCQkJCQkJCWNvbW1hbmQuY2FyZXRPZmZzZXQgPSBjb21tYW5kLm9mZnNldCArIDE7Ci0JCQkJCQkJY29tbWFuZC5kb2l0ID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGNvbW1hbmQudGV4dC5lcXVhbHMoInsiKSAmJiBpc1ByZWZlcmVuY2VFbmFibGVkKEpTUFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9FTF9CUkFDRVMpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIG1vZGVsLmdldEluZGV4ZWRSZWdpb24oY29tbWFuZC5vZmZzZXQpOwotCQkJCQkJaWYgKChwcmVmaXhlZFdpdGgoZG9jdW1lbnQsIGNvbW1hbmQub2Zmc2V0LCAiJCIpIHx8IHByZWZpeGVkV2l0aChkb2N1bWVudCwgY29tbWFuZC5vZmZzZXQsICIjIikpICYmIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJIW5vZGUuZ2V0U291cmNlKCkuZW5kc1dpdGgoIn0iKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQljb21tYW5kLnRleHQgKz0gIiB9IjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWNvbW1hbmQuc2hpZnRzQ2FyZXQgPSBmYWxzZTsKLQkJCQkJCQljb21tYW5kLmNhcmV0T2Zmc2V0ID0gY29tbWFuZC5vZmZzZXQgKyAxOwotCQkJCQkJCWNvbW1hbmQuZG9pdCA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzUHJlZmVyZW5jZUVuYWJsZWQoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gKGtleSAhPSBudWxsICYmIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKGtleSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWN0aXZlIHRleHQgZWRpdG9yIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgdGhlIGFjdGl2ZSBlZGl0b3IKLQkgKiBwYXJ0LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRBY3RpdmVUZXh0RWRpdG9yKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJCQkJcmV0dXJuIGVkaXRvcjsKLQkJCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHRleHRFZGl0b3I7Ci0JCQkJCXJldHVybiBlZGl0b3I7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwcmVmaXhlZFdpdGgoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBTdHJpbmcgc3RyaW5nKSB7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBkb2N1bWVudC5nZXRMZW5ndGgoKSA+PSBzdHJpbmcubGVuZ3RoKCkgJiYgZG9jdW1lbnQuZ2V0KG9mZnNldCAtIHN0cmluZy5sZW5ndGgoKSwgc3RyaW5nLmxlbmd0aCgpKS5lcXVhbHMoc3RyaW5nKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0Fic3RyYWN0QnJlYWtwb2ludFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYnJlYWtwb2ludHByb3ZpZGVycy9BYnN0cmFjdEJyZWFrcG9pbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2UzNzcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0Fic3RyYWN0QnJlYWtwb2ludFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYnJlYWtwb2ludHByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTJOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5JU291cmNlRWRpdGluZ1RleHRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludC5JQnJlYWtwb2ludFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLklET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBBYnN0cmFjdCBicmVha3BvaW50IHByb3ZpZGVyIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgYnJlYWtwb2ludCBwcm92aWRlcgotICogaW50ZXJmYWNlLgotICogCi0gKiBUaGlzIGlzIGEgdGVtcG9yYXJ5IGNsYXNzIGZvciBKYXZhQnJlYWtwb2ludFByb3ZpZGVyIGFuZAotICogSmF2YVNjcmlwdEJyZWFrcG9pbnRQcm92aWRlciwgYW5kIHNob3VsZCBiZSByZWZhY3RvcmVkIHRvIHNlcGFyYXRlIEphdmEgYW5kCi0gKiBKYXZhU2NyaXB0IHBhcnRzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCcmVha3BvaW50UHJvdmlkZXIgaW1wbGVtZW50cyBJQnJlYWtwb2ludFByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVORF9PRl9MSU5FID0gLTE7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSkFWQSA9IDE7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSkFWQVNDUklQVCA9IDI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gSkFWQVNDUklQVF9MQU5HVUFHRV9LRVlTID0gbmV3IFN0cmluZ1tdeyJqYXZhc2NyaXB0IiwgImphdmFzY3JpcHQxLjAiLCAiamF2YXNjcmlwdDEuMV8zIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkiamF2YXNjcmlwdDEuMiIsICJqYXZhc2NyaXB0MS4zIiwgImphdmFzY3JpcHQxLjQiLCAiamF2YXNjcmlwdDEuNSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkiamF2YXNjcmlwdDEuNiIsICJqc2NyaXB0IiwgInNhc2hzY3JpcHQifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9QQUdFID0gImpzcDpkaXJlY3RpdmUucGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE5PX1ZBTElEX0NPTlRFTlQgPSAtMjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBVTlNVUFBPUlRFRCA9IDA7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nW10gaGF5c3RhY2ssIFN0cmluZyBuZWVkbGUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBoYXlzdGFjay5sZW5ndGg7IGkrKykgewotCQkJaWYgKGhheXN0YWNrW2ldLmVxdWFscyhuZWVkbGUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBwYWdlIGxhbmd1YWdlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgZ2V0UGFnZUxhbmd1YWdlKERvY3VtZW50IGRvYykgewotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm4gVU5TVVBQT1JURUQ7Ci0KLQkJTm9kZUxpc3QgcGFnZURpcmVjdGl2ZXMgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoSlNQX0RJUkVDVElWRV9QQUdFKTsKLQkJLy8gU2VhcmNoIGZvciBmaXJzdCBsYW5ndWFnZSBkaXJlY3RpdmUKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlRGlyZWN0aXZlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkID0gcGFnZURpcmVjdGl2ZXMuaXRlbShpKTsKLQkJCU5vZGUgbGFuZ3VhZ2VBdHRyID0gY2hpbGQuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbSgibGFuZ3VhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGxhbmd1YWdlQXR0ciAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHBhZ2VMYW5ndWFnZSA9IGxhbmd1YWdlQXR0ci5nZXROb2RlVmFsdWUoKTsKLQkJCQlpZiAocGFnZUxhbmd1YWdlID09IG51bGwgfHwgcGFnZUxhbmd1YWdlLmxlbmd0aCgpID09IDApCi0JCQkJCXJldHVybiBVTlNVUFBPUlRFRDsKLQkJCQlwYWdlTGFuZ3VhZ2UgPSBwYWdlTGFuZ3VhZ2UudG9Mb3dlckNhc2UoKTsKLQkJCQlpZiAoY29udGFpbnMoSkFWQVNDUklQVF9MQU5HVUFHRV9LRVlTLCBwYWdlTGFuZ3VhZ2UpKQotCQkJCQlyZXR1cm4gSkFWQVNDUklQVDsKLQkJCQllbHNlIGlmIChwYWdlTGFuZ3VhZ2UuZXF1YWxzKCJqYXZhIikpLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gSkFWQTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiBVTlNVUFBPUlRFRDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gSkFWQTsgLy8gSmF2YSBpcyBkZWZhdWx0IGlmIG5vIGxhbmd1YWdlIGRpcmVjdGl2ZQotCX0KLQotCS8qCi0JICogU2VhcmNoIHRoZSBSZWdpb25Db250YWluZXIncyByZWdpb25zIGxvb2tpbmcgZm9yIEpTUCBjb250ZW50LiBJZiB2YWxpZAotCSAqIGNvbnRlbnQgaXMgZm91bmQsIHJldHVybiB0aGUgcG9zaXRpb24gPj0gMCBJZiBubyB2YWxpZCBjb250ZW50IGlzCi0JICogZm91bmQsIHJldHVybiBOT19WQUxJRF9DT05URU5ULiBJZiBhIHJlZ2lvbiBzdGFydHMgYWZ0ZXIgdGhlIGxpbmUncwotCSAqIGVuZE9mZnNldCwgcmV0dXJuIEVORF9PRl9MSU5FLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRWYWxpZFJlZ2lvblBvc2l0aW9uKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb25Db250YWluZXIsIGludCBzdGFydE9mZnNldCwgaW50IGVuZE9mZnNldCkgewotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gcmVnaW9uQ29udGFpbmVyLmdldFJlZ2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHsKLQkJCQlpbnQgdmFsaWRQb3NpdGlvbiA9IGdldFZhbGlkUmVnaW9uUG9zaXRpb24obW9kZWwsIChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHJlZ2lvbiwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCk7Ci0JCQkJaWYgKHZhbGlkUG9zaXRpb24gPT0gRU5EX09GX0xJTkUgfHwgdmFsaWRQb3NpdGlvbiA+PSAwKQotCQkJCQlyZXR1cm4gdmFsaWRQb3NpdGlvbjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHJlZ2lvbiBtdXN0IGJlIGF0IGxlYXN0IHBhcnRpYWxseSBvbiBzZWxlY3RlZCBsaW5lCi0JCQkJaWYgKHJlZ2lvbkNvbnRhaW5lci5nZXRFbmRPZmZzZXQocmVnaW9uKSA+IHN0YXJ0T2Zmc2V0KSB7Ci0KLQkJCQkJaW50IHJlZ2lvblN0YXJ0T2Zmc2V0ID0gcmVnaW9uQ29udGFpbmVyLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCS8vIGlmIHJlZ2lvbiBzdGFydHMgYWZ0ZXIgbGluZSdzIGVuZE9mZnNldCwgd2UncmUgZG9uZQotCQkJCQkvLyBzZWFyY2hpbmcKLQkJCQkJaWYgKHJlZ2lvblN0YXJ0T2Zmc2V0ID4gZW5kT2Zmc2V0KQotCQkJCQkJcmV0dXJuIEVORF9PRl9MSU5FOwotCi0JCQkJCS8vIElmIHJlZ2lvbiBpcyBKU1AgY29udGVudCwgbWFrZSBzdXJlIHRoZSBsYW5ndWFnZSBpcwotCQkJCQkvLyBKYXZhIG5vdCBKYXZhc2NyaXB0IGJ5Ci0JCQkJCS8vIGNoZWNraW5nIHRoZSBjb250ZW50IGFzc2lzdCBhZGFwdGVyJ3MgdHlwZS4KLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSkgewotCQkJCQkJLy8gRFdNOiB0aGlzIGxvZ2ljIGlzIG5vdCBpbmNvcnJlY3QgLi4uIGdpdmVuIGNoYW5nZXMKLQkJCQkJCS8vIHRvIGFkYXB0ZXJzLCBldGMuCi0JCQkJCQkvLyBidXQgcHJvYmFibHkgZG9uJ3QgbmVlZCBhbnl0aGluZyBoZXJlLCBzaW5jZSBib3RoCi0JCQkJCQkvLyBKYXZhIGFuZCBKYXZhU2NyaXB0Ci0JCQkJCQkvLyBhcmUgc3VwcG9ydGVkIGluIFY1LgotCi0JCQkJCQkvLyBuc2RfVE9ETzogdmVyaWZ5IHRoaXMhISEKLQotCQkJCQkJLy8gSU5vZGVOb3RpZmllciBub3RpZmllciA9Ci0JCQkJCQkvLyAoSU5vZGVOb3RpZmllciltb2RlbC5nZXROb2RlKHJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJCS8vIElBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0KLQkJCQkJCS8vIG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoQ29udGVudEFzc2lzdEFkYXB0ZXIuY2xhc3MpOwotCQkJCQkJLy8gaWYoZmFjdG9yeSBpbnN0YW5jZW9mCi0JCQkJCQkvLyBIVE1MQ29udGVudEFzc2lzdEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJCQkvLyBJTm9kZUFkYXB0ZXIgYWRhcHRlciA9Ci0JCQkJCQkvLyAoKEhUTUxDb250ZW50QXNzaXN0QWRhcHRlckZhY3RvcnkpZmFjdG9yeSkuY3JlYXRlQWRhcHRlcihub3RpZmllciwKLQkJCQkJCS8vIHJlZ2lvbik7Ci0JCQkJCQkvLyBpZihhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlciBpbnN0YW5jZW9mCi0JCQkJCQkvLyBKU1BKYXZhQ29udGVudEFzc2lzdEFkYXB0ZXIpCi0KLQkJCQkJCWlmIChyZWdpb25TdGFydE9mZnNldCA+IHN0YXJ0T2Zmc2V0KQotCQkJCQkJCXJldHVybiByZWdpb25TdGFydE9mZnNldDsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gc3RhcnRPZmZzZXQ7Ci0JCQkJCQkvLyB9Ci0JCQkJCX0KLQkJCQkJLy8gYSBjdXN0b20gdGFnLCBqc3A6dXNlQmVhbiwgZ2V0cHJvcGVydHkgb3Igc2V0cHJvcGVydHkKLQkJCQkJLy8gc3RhdGVtZW50IGlzIGFsc28gYSB2YWxpZCBicmVha3BvaW50IGxvY2F0aW9uCi0JCQkJCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSAmJiAoaXNDdXN0b21UYWdSZWdpb24obW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihyZWdpb25TdGFydE9mZnNldCkpIHx8IHJlZ2lvbkNvbnRhaW5lci5nZXRUZXh0KHJlZ2lvbikuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVTRUJFQU4pIHx8IHJlZ2lvbkNvbnRhaW5lci5nZXRUZXh0KHJlZ2lvbikuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkdFVFBST1BFUlRZKSB8fCByZWdpb25Db250YWluZXIuZ2V0VGV4dChyZWdpb24pLmVxdWFscyhKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5TRVRQUk9QRVJUWSkpKSB7Ci0KLQkJCQkJCWlmIChyZWdpb25TdGFydE9mZnNldCA+IHN0YXJ0T2Zmc2V0KQotCQkJCQkJCXJldHVybiByZWdpb25TdGFydE9mZnNldDsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gc3RhcnRPZmZzZXQ7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBEZWZlY3QgIzI0MTA5MCwgdGhlIFRleHQgTm9kZXMgaW5zaWRlIG9mIEpTUAotCQkJCQkJLy8gc2NyaXB0bGV0cywgZXhwcmVzc2lvbnMsIGFuZCBkZWNsYXJhdGlvbnMgYXJlIHZhbGlkCi0JCQkJCQkvLyBicmVha3BvaW50LWFibGUgbG9jYXRpb25zCi0JCQkJCQlib29sZWFuIGlzQ29kZU5vZGUgPSBmYWxzZTsKLQkJCQkJCUluZGV4ZWRSZWdpb24gbm9kZSA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24ocmVnaW9uU3RhcnRPZmZzZXQpOwotCQkJCQkJaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQkJCU5vZGUgZG9tTm9kZSA9IChOb2RlKSBub2RlOwotCQkJCQkJCU5vZGUgcm9vdCA9IGRvbU5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJCQkJCWlmIChyb290ICE9IG51bGwgJiYgcm9vdC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ST09UKSAmJiBkb21Ob2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgZG9tTm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkgewotCQkJCQkJCQlTdHJpbmcgcGFyZW50TmFtZSA9IGRvbU5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVOYW1lKCk7Ci0JCQkJCQkJCWlzQ29kZU5vZGUgPSBwYXJlbnROYW1lLmVxdWFscyhKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFRMRVQpIHx8IHBhcmVudE5hbWUuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVYUFJFU1NJT04pIHx8IHBhcmVudE5hbWUuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRFQ0xBUkFUSU9OKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoaXNDb2RlTm9kZSkgewotCQkJCQkJCWlmIChyZWdpb25TdGFydE9mZnNldCA+IHN0YXJ0T2Zmc2V0KQotCQkJCQkJCQlyZXR1cm4gcmVnaW9uU3RhcnRPZmZzZXQ7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlyZXR1cm4gc3RhcnRPZmZzZXQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIE5PX1ZBTElEX0NPTlRFTlQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0N1c3RvbVRhZ1JlZ2lvbihJbmRleGVkUmVnaW9uIG5vZGUpIHsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCUVsZW1lbnQgeG1sRWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoeG1sRWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IG1xLmdldENNRWxlbWVudERlY2xhcmF0aW9uKHhtbEVsZW1lbnQpOwotCQkJaWYgKGRlY2wgaW5zdGFuY2VvZiBDTU5vZGVXcmFwcGVyKSB7Ci0JCQkJQ01Ob2RlIGNtTm9kZSA9ICgoQ01Ob2RlV3JhcHBlcikgZGVjbCkuZ2V0T3JpZ2luTm9kZSgpOwotCQkJCXJldHVybiBjbU5vZGUgaW5zdGFuY2VvZiBUTERFbGVtZW50RGVjbGFyYXRpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgZlNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci0KLQotCXByb3RlY3RlZCBJUmVzb3VyY2UgZ2V0RWRpdG9ySW5wdXRSZXNvdXJjZShJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgaW5wdXQuZ2V0QWRhcHRlcihJRmlsZS5jbGFzcyk7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIGlucHV0LmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIGdldFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMoKSB7Ci0JCXJldHVybiBmU291cmNlRWRpdGluZ1RleHRUb29sczsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldFZhbGlkUG9zaXRpb24oSURvY3VtZW50IGlkb2MsIGludCBsaW5lTnVtYmVyKSB7Ci0JCWlmICghKGdldFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMoKSBpbnN0YW5jZW9mIElET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzKSkgewotCQkJcmV0dXJuIE5PX1ZBTElEX0NPTlRFTlQ7Ci0JCX0KLQkJaWYgKGlkb2MgPT0gbnVsbCkKLQkJCXJldHVybiBOT19WQUxJRF9DT05URU5UOwotCi0JCWludCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0OwotCQl0cnkgewotCQkJc3RhcnRPZmZzZXQgPSBpZG9jLmdldExpbmVPZmZzZXQobGluZU51bWJlciAtIDEpOwotCQkJZW5kT2Zmc2V0ID0gaWRvYy5nZXRMaW5lT2Zmc2V0KGxpbmVOdW1iZXIpIC0gMTsKLQotCQkJaWYgKGlkb2MgPT0gbnVsbCkKLQkJCQlyZXR1cm4gTk9fVkFMSURfQ09OVEVOVDsKLQkJCVN0cmluZyBsaW5lVGV4dCA9IGlkb2MuZ2V0KHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCkudHJpbSgpOwotCi0JCQkvLyBibGFuayBsaW5lcyBvciBsaW5lcyB3aXRoIG9ubHkgYW4gb3BlbiBvciBjbG9zZSBicmFjZSBvcgotCQkJLy8gc2NyaXB0bGV0IHRhZyBjYW5ub3QgaGF2ZSBhIGJyZWFrcG9pbnQKLQkJCWlmIChsaW5lVGV4dC5lcXVhbHMoIiIpIHx8IGxpbmVUZXh0LmVxdWFscygieyIpIHx8IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCQlsaW5lVGV4dC5lcXVhbHMoIn0iKSB8fCBsaW5lVGV4dC5lcXVhbHMoIjwlIikpLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gTk9fVkFMSURfQ09OVEVOVDsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIE5PX1ZBTElEX0NPTlRFTlQ7Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKChJU3RydWN0dXJlZERvY3VtZW50KSBpZG9jKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydE9mZnNldCk7Ci0JCS8vIGdvIHRocm91Z2ggdGhlIG5vZGUncyByZWdpb25zIGxvb2tpbmcgZm9yIEpTUCBjb250ZW50Ci0JCS8vIHVudGlsIHJlYWNoaW5nIHRoZSBlbmQgb2YgdGhlIGxpbmUKLQkJd2hpbGUgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCWludCB2YWxpZFBvc2l0aW9uID0gZ2V0VmFsaWRSZWdpb25Qb3NpdGlvbigoKElET01Eb2N1bWVudCkgKChJRE9NU291cmNlRWRpdGluZ1RleHRUb29scykgZ2V0U291cmNlRWRpdGluZ1RleHRUb29scygpKS5nZXRET01Eb2N1bWVudCgpKS5nZXRNb2RlbCgpLCBmbGF0Tm9kZSwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCk7Ci0KLQkJCWlmICh2YWxpZFBvc2l0aW9uID09IEVORF9PRl9MSU5FKQotCQkJCXJldHVybiBOT19WQUxJRF9DT05URU5UOwotCi0JCQlpZiAodmFsaWRQb3NpdGlvbiA+PSAwKQotCQkJCXJldHVybiB2YWxpZFBvc2l0aW9uOwotCi0JCQlmbGF0Tm9kZSA9IGZsYXROb2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gTk9fVkFMSURfQ09OVEVOVDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIHNvdXJjZUVkaXRpbmdUZXh0VG9vbHMpIHsKLQkJZlNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgPSBzb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0phdmFCcmVha3BvaW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0phdmFCcmVha3BvaW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMwNzI1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYnJlYWtwb2ludHByb3ZpZGVycy9KYXZhQnJlYWtwb2ludFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYnJlYWtwb2ludHByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuZGVidWcuY29yZS5KRElEZWJ1Z01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBBIEJyZWFrcG9pbnRQcm92aWRlciBzdXBwb3J0aW5nIHNlcnZlci1zaWRlIEphdmEgYXMgYSBKU1AgbGFuZ3VhZ2UKLSAqIAotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFCcmVha3BvaW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEJyZWFrcG9pbnRQcm92aWRlciB7Ci0KLQkvKgotCSAqIEBwYXJhbSByZXMgQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0VHlwZU5hbWUoSVJlc291cmNlIHJlcykgewotCQlJUGF0aCBwYXRoID0gcmVzLmdldEZ1bGxQYXRoKCk7Ci0JCS8vIEFzc3VtZSB1bmRlciBXZWIgQ29udGVudCBmb2xkZXIgaWYgbW9yZSB0aGFuIDIgc2VnbWVudHMKLQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPiAyKSB7Ci0JCQlwYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDIpOwotCQl9Ci0JCWVsc2UgewotCQkJcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJfQotCQlTdHJpbmcgdHlwZU5hbWUgPSBwYXRoLnRvU3RyaW5nKCkucmVwbGFjZShJUGF0aC5TRVBBUkFUT1IsICcuJyk7Ci0JCWlmIChyZXMuZ2V0RmlsZUV4dGVuc2lvbigpICE9IG51bGwpIHsKLQkJCXR5cGVOYW1lID0gdHlwZU5hbWUuc3Vic3RyaW5nKDAsIHR5cGVOYW1lLmxhc3RJbmRleE9mKCcuJykpOwotCQl9Ci0JCXJldHVybiB0eXBlTmFtZTsKLQl9Ci0KLQotCi0JcHVibGljIElTdGF0dXMgYWRkQnJlYWtwb2ludChJRG9jdW1lbnQgZG9jdW1lbnQsIElFZGl0b3JJbnB1dCBpbnB1dCwgaW50IGxpbmVOdW1iZXIsIGludCBvZmZzZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaW50IHBvcyA9IGdldFZhbGlkUG9zaXRpb24oZG9jdW1lbnQsIGxpbmVOdW1iZXIpOwotCQlpZiAocG9zICE9IE5PX1ZBTElEX0NPTlRFTlQpIHsKLQkJCUlSZXNvdXJjZSByZXMgPSBnZXRFZGl0b3JJbnB1dFJlc291cmNlKGlucHV0KTsKLQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCVN0cmluZyB0eXBlTmFtZSA9IGdldFR5cGVOYW1lKHJlcyk7Ci0JCQkJdHJ5IHsKLQkJCQkJSkRJRGVidWdNb2RlbC5jcmVhdGVMaW5lQnJlYWtwb2ludChyZXMsIHR5cGVOYW1lLCBsaW5lTnVtYmVyLCBwb3MsIHBvcywgMCwgdHJ1ZSwgbnVsbCk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIGUuZ2V0U3RhdHVzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEpTUFVJUGx1Z2luLklELCBJU3RhdHVzLk9LLCBKU1BVSU1lc3NhZ2VzLk9LLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkFkZEJyZWFrcG9pbnQoSURvY3VtZW50IGRvY3VtZW50LCBJRWRpdG9ySW5wdXQgaW5wdXQsIE5vZGUgbm9kZSwgaW50IGxpbmVOdW1iZXIsIGludCBvZmZzZXQpIHsKLQkJSVJlc291cmNlIHJlcyA9IGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCA/ICgoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQpLmdldEZpbGUoKSA6IG51bGw7Ci0JCURvY3VtZW50IGRvYyA9IG51bGw7Ci0JCWlmIChnZXRTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKCkgaW5zdGFuY2VvZiBJRE9NU291cmNlRWRpdGluZ1RleHRUb29scykgewotCQkJZG9jID0gKChJRE9NU291cmNlRWRpdGluZ1RleHRUb29scykgZ2V0U291cmNlRWRpdGluZ1RleHRUb29scygpKS5nZXRET01Eb2N1bWVudCgpOwotCQl9Ci0KLQkJcmV0dXJuIHJlcyAhPSBudWxsICYmICFpc0JyZWFrcG9pbnRFeGlzdChyZXMsIGxpbmVOdW1iZXIpICYmIGlzVmFsaWRQb3NpdGlvbihkb2N1bWVudCwgbGluZU51bWJlcikgJiYgKGdldFBhZ2VMYW5ndWFnZShkb2MpID09IEpBVkEpOwotCX0KLQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXJldHVybiBnZXRFZGl0b3JJbnB1dFJlc291cmNlKGlucHV0KTsKLQl9Ci0KLQkvKgotCSAqIEBwYXJhbSByZXMgQHBhcmFtIGxpbmVOdW1iZXIgQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQnJlYWtwb2ludEV4aXN0KElSZXNvdXJjZSByZXMsIGludCBsaW5lTnVtYmVyKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSkRJRGVidWdNb2RlbC5saW5lQnJlYWtwb2ludEV4aXN0cyhnZXRUeXBlTmFtZShyZXMpLCBsaW5lTnVtYmVyKSAhPSBudWxsOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qCi0JICogQHBhcmFtIGRvYyBAcGFyYW0gaWRvYyBAcGFyYW0gbGluZU51bWJlciBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFBvc2l0aW9uKElEb2N1bWVudCBpZG9jLCBpbnQgbGluZU51bWJlcikgewotCQlyZXR1cm4gZ2V0VmFsaWRQb3NpdGlvbihpZG9jLCBsaW5lTnVtYmVyKSAhPSBOT19WQUxJRF9DT05URU5UOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0phdmFTY3JpcHRCcmVha3BvaW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0phdmFTY3JpcHRCcmVha3BvaW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3YzUxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYnJlYWtwb2ludHByb3ZpZGVycy9KYXZhU2NyaXB0QnJlYWtwb2ludFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5icmVha3BvaW50cHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklCcmVha3BvaW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBBIElCcmVha3BvaW50UHJvdmlkZXIgc3VwcG9ydGluZyBzZXJ2ZXItc2lkZSBKYXZhU2NyaXB0IGFzIGEgSlNQIGxhbmd1YWdlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEphdmFTY3JpcHRCcmVha3BvaW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEJyZWFrcG9pbnRQcm92aWRlciB7Ci0JcHVibGljIGJvb2xlYW4gY2FuQWRkQnJlYWtwb2ludChJRG9jdW1lbnQgZG9jdW1lbnQsIElFZGl0b3JJbnB1dCBpbnB1dCwgaW50IGxpbmVOdW1iZXIsIGludCBvZmZzZXQpIHsKLQkJSVJlc291cmNlIHJlcyA9IGdldEVkaXRvcklucHV0UmVzb3VyY2UoaW5wdXQpOwotCQlEb2N1bWVudCBkb2MgPSBudWxsOwotCQlyZXR1cm4gcmVzICE9IG51bGwgJiYgIWlzQnJlYWtwb2ludEV4aXN0KHJlcywgbGluZU51bWJlcikgJiYgaXNWYWxpZFBvc2l0aW9uKGRvY3VtZW50LCBsaW5lTnVtYmVyKSAmJiAoZ2V0UGFnZUxhbmd1YWdlKGRvYykgIT0gSkFWQSk7Ci0JfQotCi0KLQlwdWJsaWMgSVN0YXR1cyBhZGRCcmVha3BvaW50KElEb2N1bWVudCBkb2N1bWVudCwgSUVkaXRvcklucHV0IGlucHV0LCBpbnQgbGluZU51bWJlciwgaW50IG9mZnNldCkgewotCQlpbnQgcG9zID0gZ2V0VmFsaWRQb3NpdGlvbihkb2N1bWVudCwgbGluZU51bWJlcik7Ci0JCWlmIChwb3MgIT0gTk9fVkFMSURfQ09OVEVOVCAmJiBjYW5BZGRCcmVha3BvaW50KGRvY3VtZW50LCBpbnB1dCwgbGluZU51bWJlciwgb2Zmc2V0KSkgewotCQkJSVJlc291cmNlIHJlcyA9IGdldEVkaXRvcklucHV0UmVzb3VyY2UoaW5wdXQpOwotCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJbmV3IEphdmFzY3JpcHRMaW5lQnJlYWtwb2ludChyZXMsIGxpbmVOdW1iZXIsIHBvcywgcG9zKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKU1BVSVBsdWdpbi5JRCwgSVN0YXR1cy5PSywgSlNQVUlNZXNzYWdlcy5PSywgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIEBwYXJhbSByZXMgQHBhcmFtIGxpbmVOdW1iZXIgQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQnJlYWtwb2ludEV4aXN0KElSZXNvdXJjZSByZXMsIGludCBsaW5lTnVtYmVyKSB7Ci0JCUlCcmVha3BvaW50TWFuYWdlciBtYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCk7Ci0JCUlCcmVha3BvaW50W10gYnJlYWtwb2ludHMgPSBtYW5hZ2VyLmdldEJyZWFrcG9pbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnJlYWtwb2ludHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghKGJyZWFrcG9pbnRzW2ldIGluc3RhbmNlb2YgSmF2YXNjcmlwdExpbmVCcmVha3BvaW50KSkKLQkJCQljb250aW51ZTsKLQkJCUphdmFzY3JpcHRMaW5lQnJlYWtwb2ludCBicmVha3BvaW50ID0gKEphdmFzY3JpcHRMaW5lQnJlYWtwb2ludCkgYnJlYWtwb2ludHNbaV07Ci0JCQl0cnkgewotCQkJCWlmIChicmVha3BvaW50LmdldFJlc291cmNlKCkuZXF1YWxzKHJlcykgJiYgYnJlYWtwb2ludC5nZXRMaW5lTnVtYmVyKCkgPT0gbGluZU51bWJlcikgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHBhcmFtIGRvYyBAcGFyYW0gaWRvYyBAcGFyYW0gbGluZU51bWJlciBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFBvc2l0aW9uKElEb2N1bWVudCBpZG9jLCBpbnQgbGluZU51bWJlcikgewotCQlyZXR1cm4gZ2V0VmFsaWRQb3NpdGlvbihpZG9jLCBsaW5lTnVtYmVyKSAhPSBOT19WQUxJRF9DT05URU5UOwotCX0KLQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXJldHVybiBnZXRFZGl0b3JJbnB1dFJlc291cmNlKGlucHV0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYnJlYWtwb2ludHByb3ZpZGVycy9KYXZhU3RyYXR1bUJyZWFrcG9pbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvSmF2YVN0cmF0dW1CcmVha3BvaW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg5N2ZlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYnJlYWtwb2ludHByb3ZpZGVycy9KYXZhU3RyYXR1bUJyZWFrcG9pbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmJyZWFrcG9pbnRwcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy5jb3JlLkpESURlYnVnTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRleHQuSUpTUFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdG9yYWdlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50LklCcmVha3BvaW50UHJvdmlkZXI7Ci0KLS8qKgotICogQSBJQnJlYWtwb2ludFByb3ZpZGVyIHN1cHBvcnRpbmcgSlNQIGJyZWFrcG9pbnRzIGZvciBhIE5vbi1KYXZhIExhbmd1YWdlCi0gKiBTb3VyY2UgSlNQIHBhZ2UKLSAqLwotcHVibGljIGNsYXNzIEphdmFTdHJhdHVtQnJlYWtwb2ludFByb3ZpZGVyIGltcGxlbWVudHMgSUJyZWFrcG9pbnRQcm92aWRlciwgSUV4ZWN1dGFibGVFeHRlbnNpb24gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NMQVNTX1BBVFRFUk4gPSAiKmpzcCxqc3Bfc2VydmxldC5fKiI7Ci0JcHJpdmF0ZSBPYmplY3QgZkRhdGEgPSBudWxsOwotCi0JcHVibGljIElTdGF0dXMgYWRkQnJlYWtwb2ludChJRG9jdW1lbnQgZG9jdW1lbnQsIElFZGl0b3JJbnB1dCBpbnB1dCwgaW50IGVkaXRvckxpbmVOdW1iZXIsIGludCBvZmZzZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSB2YWxpZCBwb3NpdGlvbiB0byBzZXQgYnJlYWtwb2ludAotCQlpbnQgcG9zID0gZ2V0VmFsaWRQb3NpdGlvbihkb2N1bWVudCwgZWRpdG9yTGluZU51bWJlcik7Ci0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJaWYgKHBvcyA+PSAwKSB7Ci0JCQlJUmVzb3VyY2UgcmVzID0gZ2V0UmVzb3VyY2VGcm9tSW5wdXQoaW5wdXQpOwotCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHBhdGggPSBudWxsOwotCQkJCUlCcmVha3BvaW50IHBvaW50ID0gSkRJRGVidWdNb2RlbC5jcmVhdGVTdHJhdHVtQnJlYWtwb2ludChyZXMsICJKU1AiLCByZXMuZ2V0TmFtZSgpLCBwYXRoLCBnZXRDbGFzc1BhdHRlcm4ocmVzKSwgZWRpdG9yTGluZU51bWJlciwgcG9zLCBwb3MsIDAsIHRydWUsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBvaW50ID09IG51bGwpIHsKLQkJCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKU1BVSVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgInVuc3VwcG9ydGVkIGlucHV0IHR5cGUiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJCS8vIEZvciBub24tcmVzb3VyY2VzLCB1c2UgdGhlIHdvcmtzcGFjZSByb290IGFuZCBhIGNvb3JkaW5hdGVkCi0JCQkJLy8gYXR0cmlidXRlIHRoYXQgaXMgdXNlZCB0bwotCQkJCS8vIHByZXZlbnQgdW53YW50ZWQgKGJyZWFrcG9pbnQpIG1hcmtlcnMgZnJvbSBiZWluZyBsb2FkZWQKLQkJCQkvLyBpbnRvIHRoZSBlZGl0b3JzLgotCQkJCXJlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQkJU3RyaW5nIGlkID0gaW5wdXQuZ2V0TmFtZSgpOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQgJiYgKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U3RvcmFnZSgpICE9IG51bGwgJiYgKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U3RvcmFnZSgpLmdldEZ1bGxQYXRoKCkgIT0gbnVsbCkgewotCQkJCQlpZCA9ICgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgaW5wdXQpLmdldFN0b3JhZ2UoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJCU1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlhdHRyaWJ1dGVzLnB1dChTdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWwuU0VDT05EQVJZX0lEX0tFWSwgaWQpOwotCQkJCVN0cmluZyBwYXRoID0gbnVsbDsKLQkJCQlJQnJlYWtwb2ludCBwb2ludCA9IEpESURlYnVnTW9kZWwuY3JlYXRlU3RyYXR1bUJyZWFrcG9pbnQocmVzLCAiSlNQIiwgaW5wdXQuZ2V0TmFtZSgpLCBwYXRoLCBnZXRDbGFzc1BhdHRlcm4ocmVzKSwgZWRpdG9yTGluZU51bWJlciwgcG9zLCBwb3MsIDAsIHRydWUsIGF0dHJpYnV0ZXMpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBvaW50ID09IG51bGwpIHsKLQkJCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKU1BVSVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgInVuc3VwcG9ydGVkIGlucHV0IHR5cGUiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBKU1BVSVBsdWdpbi5JRCwgSVN0YXR1cy5JTkZPLCBKU1BVSU1lc3NhZ2VzLkJyZWFrcG9pbnROb3RBbGxvd2VkLCBudWxsKTsKLQkJfQotCQlpZiAoc3RhdHVzID09IG51bGwpIHsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSlNQVUlQbHVnaW4uSUQsIElTdGF0dXMuT0ssIEpTUFVJTWVzc2FnZXMuT0ssIG51bGwpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xhc3NQYXR0ZXJuKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJU3RyaW5nIHNob3J0TmFtZSA9IHJlc291cmNlLmdldE5hbWUoKTsKLQkJCVN0cmluZyBleHRlbnNpb24gPSByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwgJiYgZXh0ZW5zaW9uLmxlbmd0aCgpIDwgc2hvcnROYW1lLmxlbmd0aCgpKSB7Ci0JCQkJc2hvcnROYW1lID0gc2hvcnROYW1lLnN1YnN0cmluZygwLCBzaG9ydE5hbWUubGVuZ3RoKCkgLSBleHRlbnNpb24ubGVuZ3RoKCkgLSAxKTsKLQkJCX0KLQkJCWlmIChmRGF0YSBpbnN0YW5jZW9mIFN0cmluZyAmJiBmRGF0YS50b1N0cmluZygpLmxlbmd0aCgpID4gMCkgewotCQkJCS8qCi0JCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDQ3NQotCQkJCSAqLwotCQkJCXJldHVybiBmRGF0YSArICIsXyIgKyBzaG9ydE5hbWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChmRGF0YSBpbnN0YW5jZW9mIE1hcCAmJiByZXNvdXJjZS5pc0FjY2Vzc2libGUoKSAmJiByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQlJQ29udGVudFR5cGVbXSB0eXBlcyA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZXNGb3IocmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQlpZiAodHlwZXMubGVuZ3RoID09IDApIHsKLQkJCQkJLy8gaWYgZmFpbGVkIHRvIGZpbmQgcXVpY2tseSwgYmUgbW9yZSBhZ2dyZXNzaXZlCi0JCQkJCUlDb250ZW50RGVzY3JpcHRpb24gZCA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQkvLyBvcHRpbWl6ZWQgZGVzY3JpcHRpb24gbG9va3VwLCBtaWdodCBub3Qgc3VjY2VlZAotCQkJCQkJZCA9ICgoSUZpbGUpIHJlc291cmNlKS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQkJCWlmIChkICE9IG51bGwpIHsKLQkJCQkJCQl0eXBlcyA9IG5ldyBJQ29udGVudFR5cGVbXXtkLmdldENvbnRlbnRUeXBlKCl9OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8qCi0JCQkJCQkgKiBzaG91bGQgbm90IGJlIHBvc3NpYmxlIGdpdmVuIHRoZSBhY2Nlc3NpYmxlIGFuZAotCQkJCQkJICogZmlsZSB0eXBlIGNoZWNrIGFib3ZlCi0JCQkJCQkgKi8KLQkJCQkJfQotCQkJCX0KLQkJCQkvLyB3YXNuJ3QgZm91bmQgZWFybGllcgotCQkJCWlmICh0eXBlcyA9PSBudWxsKSB7Ci0JCQkJCXR5cGVzID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlc0ZvcihyZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCQlTdHJpbmdCdWZmZXIgcGF0dGVybkJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIl8iICsgc2hvcnROYW1lKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCU9iamVjdCBwYXR0ZXJuID0gKChNYXApIGZEYXRhKS5nZXQodHlwZXNbaV0uZ2V0SWQoKSk7Ci0JCQkJCWlmIChwYXR0ZXJuICE9IG51bGwpIHsKLQkJCQkJCXBhdHRlcm5CdWZmZXIuYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXBhdHRlcm5CdWZmZXIuYXBwZW5kKHBhdHRlcm4pOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBwYXR0ZXJuQnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIERFRkFVTFRfQ0xBU1NfUEFUVEVSTjsKLQl9Ci0KLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VGcm9tSW5wdXQoaW5wdXQpOwotCX0KLQotCXByaXZhdGUgSVJlc291cmNlIGdldFJlc291cmNlRnJvbUlucHV0KElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBpbnB1dC5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXJlc291cmNlID0gKElSZXNvdXJjZSkgaW5wdXQuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBhIHZhbGlkIHBvc2l0aW9uIHNvbWV3aGVyZSBvbiBsaW5lTnVtYmVyIGluIGRvY3VtZW50LCBpZG9jLCB3aGVyZQotCSAqIGEgYnJlYWtwb2ludCBjYW4gYmUgc2V0IGFuZCByZXR1cm5zIHRoYXQgcG9zaXRpb24uIC0xIGlzIHJldHVybmVkIGlmIGEKLQkgKiBwb3NpdGlvbiBjb3VsZCBub3QgYmUgZm91bmQuCi0JICogCi0JICogQHBhcmFtIGlkb2MKLQkgKiBAcGFyYW0gZWRpdG9yTGluZU51bWJlcgotCSAqIEByZXR1cm4gcG9zaXRpb24gdG8gc2V0IGJyZWFrcG9pbnQgb3IgLTEgaWYgbm8gcG9zaXRpb24gY291bGQgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIGludCBnZXRWYWxpZFBvc2l0aW9uKElEb2N1bWVudCBpZG9jLCBpbnQgZWRpdG9yTGluZU51bWJlcikgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWlmIChpZG9jICE9IG51bGwpIHsKLQotCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCWludCBlbmRPZmZzZXQgPSAwOwotCQkJdHJ5IHsKLQkJCQlJUmVnaW9uIGxpbmUgPSBpZG9jLmdldExpbmVJbmZvcm1hdGlvbihlZGl0b3JMaW5lTnVtYmVyIC0gMSk7Ci0JCQkJc3RhcnRPZmZzZXQgPSBsaW5lLmdldE9mZnNldCgpOwotCQkJCWVuZE9mZnNldCA9IE1hdGgubWF4KGxpbmUuZ2V0T2Zmc2V0KCksIGxpbmUuZ2V0T2Zmc2V0KCkgKyBsaW5lLmdldExlbmd0aCgpKTsKLQotCQkJCVN0cmluZyBsaW5lVGV4dCA9IGlkb2MuZ2V0KHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCkudHJpbSgpOwotCi0JCQkJLy8gYmxhbmsgbGluZXMgb3IgbGluZXMgd2l0aCBvbmx5IGFuIG9wZW4gb3IgY2xvc2UgYnJhY2Ugb3IKLQkJCQkvLyBzY3JpcHRsZXQgdGFnIGNhbm5vdCBoYXZlIGEgYnJlYWtwb2ludAotCQkJCWlmIChsaW5lVGV4dC5lcXVhbHMoIiIpIHx8IGxpbmVUZXh0LmVxdWFscygieyIpIHx8IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCWxpbmVUZXh0LmVxdWFscygifSIpIHx8IGxpbmVUZXh0LmVxdWFscygiPCUiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJewotCQkJCQlyZXN1bHQgPSAtMTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGdldCBhbGwgcGFydGl0aW9ucyBmb3IgY3VycmVudCBsaW5lCi0JCQkJCUlUeXBlZFJlZ2lvbltdIHBhcnRpdGlvbnMgPSBudWxsOwotCi0JCQkJCXBhcnRpdGlvbnMgPSBpZG9jLmNvbXB1dGVQYXJ0aXRpb25pbmcoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0KTsKLQotCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9ucy5sZW5ndGg7ICsraSkgewotCQkJCQkJU3RyaW5nIHR5cGUgPSBwYXJ0aXRpb25zW2ldLmdldFR5cGUoKTsKLQkJCQkJCS8vIGlmIGZvdW5kIGpzcCBqYXZhIGNvbnRlbnQsIGpzcCBkaXJlY3RpdmUgdGFncywKLQkJCQkJCS8vIGN1c3RvbQotCQkJCQkJLy8gdGFncywKLQkJCQkJCS8vIHJldHVybiB0aGF0IHBvc2l0aW9uCi0JCQkJCQlpZiAodHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBIHx8IHR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RJUkVDVElWRSkgewotCQkJCQkJCXJlc3VsdCA9IHBhcnRpdGlvbnNbaV0uZ2V0T2Zmc2V0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXJlc3VsdCA9IC0xOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbiNzZXRJbml0aWFsaXphdGlvbkRhdGEob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZEYXRhID0gZGF0YTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIHRvb2xzKSB7Ci0JCS8vIG5vdCB1c2VkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvSmF2YXNjcmlwdExpbmVCcmVha3BvaW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYnJlYWtwb2ludHByb3ZpZGVycy9KYXZhc2NyaXB0TGluZUJyZWFrcG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhZDU5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYnJlYWtwb2ludHByb3ZpZGVycy9KYXZhc2NyaXB0TGluZUJyZWFrcG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVsIDIwLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5icmVha3BvaW50cHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgZGF2aWR3Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhc2NyaXB0TGluZUJyZWFrcG9pbnQgewotCi0JLyoqCi0JICogQHBhcmFtIHJlcwotCSAqIEBwYXJhbSBsaW5lTnVtYmVyCi0JICogQHBhcmFtIHBvcwotCSAqIEBwYXJhbSBwb3MxCi0JICovCi0JcHVibGljIEphdmFzY3JpcHRMaW5lQnJlYWtwb2ludChJUmVzb3VyY2UgcmVzLCBpbnQgbGluZU51bWJlciwgaW50IHBvcywgaW50IHBvczEpIHsKLQotCQkvLyBUT0RPIFNob3VsZCBiZSBkZWxldGVkPyBBbG9uZyB3aXRoIGNhbGxpbmcgY2xhc3M/Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEphdmFzY3JpcHRMaW5lQnJlYWtwb2ludCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIDA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdXRvSW1wb3J0UHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0F1dG9JbXBvcnRQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2U1YTYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0F1dG9JbXBvcnRQcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBHZW51aXRlYywgTExDIC0gRml4IGZvciBidWcgMjAzMzAzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkluc2VydEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBBdXRvSW1wb3J0UHJvcG9zYWwgZXh0ZW5kcyBKU1BDb21wbGV0aW9uUHJvcG9zYWwgewotCQotCS8vIHRoZSBpbXBvcnQgc3RyaW5nLCBubyBxdW90ZXMgb3IgY29sb25zCi0JU3RyaW5nIGZJbXBvcnREZWNsYXJhdGlvbjsKLQkKLQlwdWJsaWMgQXV0b0ltcG9ydFByb3Bvc2FsKFN0cmluZyBpbXBvcnREZWNsYXJhdGlvbiwgU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nLCBpbnQgcmVwbGFjZW1lbnRPZmZzZXQsIGludCByZXBsYWNlbWVudExlbmd0aCwgaW50IGN1cnNvclBvc2l0aW9uLCBJbWFnZSBpbWFnZSwgU3RyaW5nIGRpc3BsYXlTdHJpbmcsIElDb250ZXh0SW5mb3JtYXRpb24gY29udGV4dEluZm9ybWF0aW9uLCBTdHJpbmcgYWRkaXRpb25hbFByb3Bvc2FsSW5mbywgaW50IHJlbGV2YW5jZSwgYm9vbGVhbiB1cGRhdGVSZXBsYWNlbWVudExlbmd0aE9uVmFsaWRhdGUpIHsKLQkJc3VwZXIocmVwbGFjZW1lbnRTdHJpbmcsIHJlcGxhY2VtZW50T2Zmc2V0LCByZXBsYWNlbWVudExlbmd0aCwgY3Vyc29yUG9zaXRpb24sIGltYWdlLCBkaXNwbGF5U3RyaW5nLCBjb250ZXh0SW5mb3JtYXRpb24sIGFkZGl0aW9uYWxQcm9wb3NhbEluZm8sIHJlbGV2YW5jZSwgdXBkYXRlUmVwbGFjZW1lbnRMZW5ndGhPblZhbGlkYXRlKTsKLQkJc2V0SW1wb3J0RGVjbGFyYXRpb24oaW1wb3J0RGVjbGFyYXRpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhcHBseShJVGV4dFZpZXdlciB2aWV3ZXIsIGNoYXIgdHJpZ2dlciwgaW50IHN0YXRlTWFzaywgaW50IG9mZnNldCkgewotCQlzdXBlci5hcHBseSh2aWV3ZXIsIHRyaWdnZXIsIHN0YXRlTWFzaywgb2Zmc2V0KTsKLQkJYWRkSW1wb3J0RGVjbGFyYXRpb24odmlld2VyKTsKLQl9Ci0JLyoqCi0JICogYWRkcyB0aGUgaW1wb3J0IGRlY2xhcmF0aW9uIHRvIHRoZSBkb2N1bWVudCBpbiB0aGUgdmlld2VyIGluIHRoZSBhcHByb3ByaWF0ZSBwb3NpdGlvbgotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkSW1wb3J0RGVjbGFyYXRpb24oSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JCQotCQlJRG9jdW1lbnQgZG9jID0gdmlld2VyLmdldERvY3VtZW50KCk7Ci0JCQotCQkvLyBjYWxjdWxhdGUgb25jZSBhbmQgcGFzcyBhbG9uZwotCQlib29sZWFuIGlzWG1sID0gaXNYbWxGb3JtYXQoZG9jKTsKLQkJCi0JCWludCBpbnNlcnRQb3NpdGlvbiA9IGdldEluc2VydFBvc2l0aW9uKGRvYywgaXNYbWwpOwotCQlTdHJpbmcgaW5zZXJ0VGV4dCA9IGNyZWF0ZUltcG9ydERlY2xhcmF0aW9uKGRvYywgaXNYbWwpOwotCQlJbnNlcnRFZGl0IGluc2VydCA9IG5ldyBJbnNlcnRFZGl0KGluc2VydFBvc2l0aW9uLCBpbnNlcnRUZXh0KTsKLQkJdHJ5IHsKLQkJCWluc2VydC5hcHBseShkb2MpOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJCi0JCS8vIG1ha2Ugc3VyZSB0aGUgY3Vyc29yIHBvc2l0aW9uIGFmdGVyIGlzIGNvcnJlY3QKLQkJc2V0Q3Vyc29yUG9zaXRpb24oZ2V0Q3Vyc29yUG9zaXRpb24oKSArIGluc2VydFRleHQubGVuZ3RoKCkpOwotCX0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZG9jCi0JICogQHBhcmFtIGlzWG1sCi0JICogQHJldHVybiBwb3NpdGlvbiBhZnRlciA8anNwOnJvb3Q+IGlmIHhtbCwgb3RoZXJ3aXNlIHJpZ2h0IGJlZm9yZSB0aGUgZG9jdW1lbnQgZWxlbWVudAotCSAqLwotCXByaXZhdGUgaW50IGdldEluc2VydFBvc2l0aW9uKElEb2N1bWVudCBkb2MsIGJvb2xlYW4gaXNYbWwpIHsKLQkJaW50IHBvcyA9IDA7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2MpOwotCQl0cnkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJaWYgKHNNb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnROb2RlID0gKChJRE9NTW9kZWwpIHNNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJTm9kZSBkb2NFbGVtZW50ID0gZG9jdW1lbnROb2RlLmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJCQlpZiAoZG9jRWxlbWVudCAhPSBudWxsICYmIGRvY0VsZW1lbnQgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCkgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9ICgoSURPTUVsZW1lbnQpIGRvY0VsZW1lbnQpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCQlpZiAoaXNYbWwpIHsKLQkJCQkJCQkvLyBpbnNlcnQgcmlnaHQgYWZ0ZXIgZG9jdW1lbnQgZWxlbWVudAotCQkJCQkJCXBvcyA9IHNkUmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gaW5zZXJ0IGJlZm9yZSBkb2N1bWVudCBlbGVtZW50Ci0JCQkJCQkJcG9zID0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIHBvczsKLQl9Ci0JCi0gCS8vIEdlbnVpdGVjIGJ1ZyAjNjIyNywKLQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAzMzAzCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3VzdG9tVGFnRG9jdW1lbnQoSURvY3VtZW50IGRvYykgewotCQlib29sZWFuIGlzVGFnID0gZmFsc2U7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2MpOwotCQl0cnkgewotCQkJaWYgKHNNb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCVN0cmluZyBjb250ZW50VHlwZSA9ICgoSURPTU1vZGVsKSBzTW9kZWwpLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpOwotCQkJCWlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQkJCUlDb250ZW50VHlwZSBtb2RlbENUID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGUpOwotCQkJCQlJQ29udGVudFR5cGUgdGFnQ1QgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQVEFHKTsKLQkJCQkJaWYgKG1vZGVsQ1QgIT0gbnVsbCAmJiB0YWdDVCAhPSBudWxsKSB7Ci0JCQkJCQlpc1RhZyA9IG1vZGVsQ1QuaXNLaW5kT2YodGFnQ1QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gaXNUYWc7Ci0JfQotCQkgCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGRvYwotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGRvY3VtZW50IGlzIHhtbC1qc3Agc3ludGF4LCBvdGhlcndpc2UgZmFsc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNYbWxGb3JtYXQoSURvY3VtZW50IGRvYykgewotCQlib29sZWFuIGlzWG1sID0gZmFsc2U7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2MpOwotCQl0cnkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJaWYgKCFpc1htbCkgewotCQkJCQlpZiAoc01vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnROb2RlID0gKChJRE9NTW9kZWwpIHNNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJCUVsZW1lbnQgZG9jRWxlbWVudCA9IGRvY3VtZW50Tm9kZS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCQkJCWlzWG1sID0gZG9jRWxlbWVudCAhPSBudWxsICYmICgoZG9jRWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFscygianNwOnJvb3QiKSkgfHwgZG9jRWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKCJ4bWxuczpqc3AiKSAhPSBudWxsIHx8ICgoKChJRE9NTm9kZSkgZG9jRWxlbWVudCkuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsICYmICgoSURPTU5vZGUpIGRvY0VsZW1lbnQpLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpKSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIGlzWG1sOwotCX0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZG9jCi0JICogQHBhcmFtIGlzWG1sCi0JICogQHJldHVybiBhcHByb3ByaWF0ZSBpbXBvcnQgZGVjbGFyYXRpb24gc3RyaW5nIGRlcGVuZGluZyBpZiBkb2N1bWVudCBpcyB4bWwgb3Igbm90Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlSW1wb3J0RGVjbGFyYXRpb24oSURvY3VtZW50IGRvYywgYm9vbGVhbiBpc1htbCkgewotCQlTdHJpbmcgZGVsaW0gPSAoZG9jIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgPyAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvYykuZ2V0TGluZURlbGltaXRlcigpIDogVGV4dFV0aWxpdGllcy5nZXREZWZhdWx0TGluZURlbGltaXRlcihkb2MpOwotCQlib29sZWFuIGlzQ3VzdG9tVGFnID0gaXNDdXN0b21UYWdEb2N1bWVudChkb2MpOwotCQlmaW5hbCBTdHJpbmcgb3BlbmluZzsKLQkJZmluYWwgU3RyaW5nIGNsb3Npbmc7Ci0JCWlmIChpc0N1c3RvbVRhZykgewotCQkJaWYgKGlzWG1sKSB7Ci0JCQkJb3BlbmluZyA9ICI8anNwOmRpcmVjdGl2ZS50YWcgaW1wb3J0PVwiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWNsb3NpbmcgPSAiXCIvPiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCW9wZW5pbmcgPSAiPCVAdGFnIGltcG9ydD1cIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQljbG9zaW5nID0gIlwiJT4iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoaXNYbWwpIHsKLQkJCQlvcGVuaW5nID0gIjxqc3A6ZGlyZWN0aXZlLnBhZ2UgaW1wb3J0PVwiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWNsb3NpbmcgPSAiXCIvPiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCW9wZW5pbmcgPSAiPCVAcGFnZSBpbXBvcnQ9XCIiOyAvLyROT04tTkxTLTEkCi0JCQkJY2xvc2luZyA9ICJcIiU+IjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBkZWxpbSArIG9wZW5pbmcgKyBnZXRJbXBvcnREZWNsYXJhdGlvbigpICsgY2xvc2luZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEltcG9ydERlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gZkltcG9ydERlY2xhcmF0aW9uOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRJbXBvcnREZWNsYXJhdGlvbihTdHJpbmcgaW1wb3J0RGVjbGFyYXRpb24pIHsKLQkJZkltcG9ydERlY2xhcmF0aW9uID0gaW1wb3J0RGVjbGFyYXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQmVhbkluZm9Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQmVhbkluZm9Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MThiZDIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0JlYW5JbmZvUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIE5hdmlnYXRlcyB0aGUgSUphdmFQcm9qZWN0IGNsYXNzcGF0aCAoaW5jbC4gc291cmNlKSBvbiBhIGdpdmVuIHJlc291cmNlIGFuZCBpbmZlcnMgYmVhbiBwcm9wZXJ0aWVzCi0gKiBnaXZlbiBhIGZ1bGx5IHF1YWxpZmllZCBiZWFubmFtZS4gQmVhbiBwcm9wZXJ0aWVzIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmc6Ci0gKiA8Y29kZT5nZXRSdW50aW1lUHJvcGVydGllcyhJUmVzb3VyY2UgYmFzZVJlc291cmNlLCBTdHJpbmcgdHlwZU5hbWUpPC9jb2RlPgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJlYW5JbmZvUHJvdmlkZXIgaW1wbGVtZW50cyBJQmVhbkluZm9Qcm92aWRlciB7Ci0KLQlwdWJsaWMgY2xhc3MgSmF2YVByb3BlcnR5RGVzY3JpcHRvciBpbXBsZW1lbnRzIElKYXZhUHJvcGVydHlEZXNjcmlwdG9yIHsKLQkJU3RyaW5nIGZUeXBlID0gbnVsbDsKLQkJU3RyaW5nIGZOYW1lID0gbnVsbDsKLQkJYm9vbGVhbiBmUmVhZGFibGUgPSB0cnVlOwotCQlib29sZWFuIGZXcml0YWJsZSA9IHRydWU7Ci0KLQkJcHVibGljIEphdmFQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlLCBib29sZWFuIHJlYWRhYmxlLCBib29sZWFuIHdyaXRhYmxlKSB7Ci0JCQlmTmFtZSA9IG5hbWU7Ci0JCQlmVHlwZSA9IHR5cGU7Ci0JCQlmUmVhZGFibGUgPSByZWFkYWJsZTsKLQkJCWZXcml0YWJsZSA9IHdyaXRhYmxlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWNsYXJlZFR5cGUoKSB7Ci0JCQlyZXR1cm4gZlR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQkJcmV0dXJuIGZOYW1lOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIGZOYW1lOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ2V0UmVhZGFibGUoKSB7Ci0JCQlyZXR1cm4gZlJlYWRhYmxlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ2V0V3JpdGVhYmxlKCkgewotCQkJcmV0dXJuIGZXcml0YWJsZTsKLQkJfQotCX0KLQotCS8vIGxvb2tzIHVwIGVuY29kZWQgdHlwZSAoc2VlIENsYXNzLmdldE5hbWUpLCBhbmQgZ2l2ZXMgeW91IGEgZGlzcGxheWFibGUgc3RyaW5nCi0JcHJpdmF0ZSBIYXNoTWFwIGZFbmNvZGVkVHlwZU1hcCA9IG51bGw7Ci0JLy8gdG8gYXZvaWQgcmVwZWF0IHByb3BlcnRpZXMgZnJvbSBzaG93aW5nIHVwCi0JcHJpdmF0ZSBIYXNoU2V0IGZSZXBlYXRNZXRob2RzID0gbnVsbDsKLQotCXB1YmxpYyBCZWFuSW5mb1Byb3ZpZGVyKCkgewotCQlmUmVwZWF0TWV0aG9kcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5mZXJyZWQgcHJvcGVydGllcyBvZiBhIGJlYW4gYmFzZWQgb24gdGhlIHByb2plY3QgZnJvbSB0aGUgYmFzZVJlc291cmNlLAotCSAqIGFuZCB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGJlYW4uCi0JICogCi0JICogQHBhcmFtIGJhc2VSZXNvdXJjZSB0aGUgYmFzZSByZXNvdXJjZSB3aGVyZSB0aGUgYmVhbiBpcyBiZWluZyB1c2VkCi0JICogQHBhcmFtIHR5cGVOYW1lIHRoZSA8aT5mdWxseSBxdWFsaWZpZWQ8L2k+IHR5cGUgbmFtZSAoZWcuIGphdmF4LnN3aW5nLkpCdXR0b24pIG9mIHRoZSBiZWFuCi0JICovCi0JcHVibGljIElKYXZhUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0UnVudGltZVByb3BlcnRpZXMoSVJlc291cmNlIGJhc2VSZXNvdXJjZSwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShiYXNlUmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJUXVhbGlmaWVkTmFtZSB0eXBlUXVhbGlmaWVkTmFtZSA9IGdldFR5cGVRdWFsaWZpZWROYW1lKHR5cGVOYW1lKTsKLQkJTGlzdCBnZXRNZXRob2RSZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGlzTWV0aG9kUmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBzZXRNZXRob2RSZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGRlc2NyaXB0b3JSZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJSVR5cGUgdHlwZSA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKHR5cGVRdWFsaWZpZWROYW1lLmdldFF1YWxpZmllcigpICsgIi4iICsgdHlwZVF1YWxpZmllZE5hbWUuZ2V0TG9jYWxOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkvLyB0eXBlIG11c3QgZXhpc3QKLQkJCWlmKHR5cGUgIT0gbnVsbCkgewotCQkJCUlUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSA9IHR5cGUubmV3VHlwZUhpZXJhcmNoeShudWxsKTsKLQkJCQlJVHlwZVtdIHN1cGVycyA9IGhpZXJhcmNoeS5nZXRBbGxTdXBlcmNsYXNzZXModHlwZSk7Ci0JCi0JCQkJSU1ldGhvZFtdIG1ldGhvZHMgPSB0eXBlLmdldE1ldGhvZHMoKTsKLQkJCQkvLyBpdGVyYXRlIHRoZSBiZWFuJ3MgbWV0aG9kcwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykKLQkJCQkJYWNjZXB0TWV0aG9kKGdldE1ldGhvZFJlc3VsdHMsIGlzTWV0aG9kUmVzdWx0cywgc2V0TWV0aG9kUmVzdWx0cywgbWV0aG9kc1tpXSk7Ci0JCQkJLy8gdGhlIGJlYW4gaGllcmFyY2h5J3MgbWV0aG9kcwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCW1ldGhvZHMgPSBzdXBlcnNbaV0uZ2V0TWV0aG9kcygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1ldGhvZHMubGVuZ3RoOyBqKyspCi0JCQkJCQlhY2NlcHRNZXRob2QoZ2V0TWV0aG9kUmVzdWx0cywgaXNNZXRob2RSZXN1bHRzLCBzZXRNZXRob2RSZXN1bHRzLCBtZXRob2RzW2pdKTsKLQkJCQl9Ci0JCQkJYWRhcHRNZXRob2RzVG9Qcm9wZXJ0eURlc2NyaXB0b3JzKGdldE1ldGhvZFJlc3VsdHMsIGlzTWV0aG9kUmVzdWx0cywgc2V0TWV0aG9kUmVzdWx0cywgZGVzY3JpcHRvclJlc3VsdHMpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1leCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiUHJvYmxlbSBuYXZpZ2F0aW5nIEphdmFQcm9qZWN0IGluIEJlYW5JbmZvUHJvdmlkZXIiLCBqbWV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJSUphdmFQcm9wZXJ0eURlc2NyaXB0b3JbXSBmaW5hbFJlc3VsdHMgPSBuZXcgSUphdmFQcm9wZXJ0eURlc2NyaXB0b3JbZGVzY3JpcHRvclJlc3VsdHMuc2l6ZSgpXTsKLQkJU3lzdGVtLmFycmF5Y29weShkZXNjcmlwdG9yUmVzdWx0cy50b0FycmF5KCksIDAsIGZpbmFsUmVzdWx0cywgMCwgZGVzY3JpcHRvclJlc3VsdHMuc2l6ZSgpKTsKLQkJcmV0dXJuIGZpbmFsUmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmcm9tIG1ldGhvZCBkZWNsYXJhdGlvbiBsaXN0cywgY3JlYXRlcyBhbmQgZmlsbHMgYSBsaXN0IG9mIEphdmFQcm9wZXJ0eURlc2NyaXB0b3JzLgotCSAqIEBwYXJhbSBnZXRNZXRob2RzCi0JICogQHBhcmFtIGlzTWV0aG9kcwotCSAqIEBwYXJhbSBzZXRNZXRob2RzCi0JICogQHBhcmFtIGRlc2NyaXB0b3JSZXN1bHRzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkYXB0TWV0aG9kc1RvUHJvcGVydHlEZXNjcmlwdG9ycyhMaXN0IGdldE1ldGhvZHMsIExpc3QgaXNNZXRob2RzLCBMaXN0IHNldE1ldGhvZHMsIExpc3QgZGVzY3JpcHRvcnMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlMaXN0IHJlYWRhYmxlID0gbmV3IEFycmF5TGlzdCgpOwotCQlIYXNoTWFwIHR5cGVzID0gbmV3IEhhc2hNYXAoKTsKLQotCQkvLyBpdGVyYXRlIHRocm91Z2ggZ2V0KiBhbmQgaXMqIG1ldGhvZHMsIHVwZGF0aW5nICdyZWFkYWJsZScgbGlzdCBhbmQgJ3R5cGVzJyBtYXAKLQkJZmlsdGVyR2V0TWV0aG9kcyhnZXRNZXRob2RzLCByZWFkYWJsZSwgdHlwZXMpOwotCQlmaWx0ZXJJc01ldGhvZHMoaXNNZXRob2RzLCByZWFkYWJsZSwgdHlwZXMpOwotCi0JCS8vIGl0ZXJhdGUgc2V0KiBtZXRob2RzLCBjaGVja2luZyBvdmVybGFwIHcvIHJlYWRhYmxlCi0JCUl0ZXJhdG9yIGl0ID0gc2V0TWV0aG9kcy5pdGVyYXRvcigpOwotCQlJTWV0aG9kIHRlbXAgPSBudWxsOwotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0eXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nW10gZW5jb2RlZFBhcmFtcyA9IG51bGw7Ci0JCVN0cmluZyByZXR1cm5UeXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHBhcmFtMCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJdGVtcCA9IChJTWV0aG9kKSBpdC5uZXh0KCk7Ci0JCQluYW1lID0gY3JlYXRlUHJvcGVydHlOYW1lRnJvbU1ldGhvZCh0ZW1wKTsKLQkJCS8vIGludmFsaWQgbmFtaW5nIGNvbnZlbnRpb24KLQkJCWlmIChuYW1lID09IG51bGwpCi0JCQkJY29udGludWU7Ci0KLQkJCXJldHVyblR5cGUgPSBnZXREZWNvZGVkVHlwZU5hbWUodGVtcC5nZXRSZXR1cm5UeXBlKCkpOwotCQkJLy8gc2V0dGVyIHNob3VsZCBoYXZlIG5vIHJldHVybiB0eXBlCi0JCQlpZiAoIXJldHVyblR5cGUuZXF1YWxzKCJ2b2lkIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQotCQkJLy8gbmVlZCB0byBnZXQgdHlwZSBmcm9tIHBhcmFtZXRlcgotCQkJZW5jb2RlZFBhcmFtcyA9IHRlbXAuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJCWlmIChlbmNvZGVkUGFyYW1zICE9IG51bGwgJiYgZW5jb2RlZFBhcmFtcy5sZW5ndGggPiAwKSB7Ci0JCQkJaWYgKGVuY29kZWRQYXJhbXMubGVuZ3RoID4gMSkgewotCQkJCQkvLyBtdWx0aXBsZSBwYXJhbXMKLQkJCQkJcGFyYW0wID0gZ2V0RGVjb2RlZFR5cGVOYW1lKGVuY29kZWRQYXJhbXNbMF0pOwotCQkJCQlpZiAoIXBhcmFtMC5lcXVhbHMoImludCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBub3QgYSB2YWxpZCBpbmRleGVkIHByb3BlcnR5Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJCi0JCQkJCXR5cGUgPSBnZXREZWNvZGVkVHlwZU5hbWUoZW5jb2RlZFBhcmFtc1sxXSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBvbmUgcGFyYW0sIHJlZ3VsYXIgc2V0dGVyCi0JCQkJCWlmIChpc0FycmF5KGVuY29kZWRQYXJhbXNbMF0pKQotCQkJCQkJdHlwZSA9IGdldERlY29kZWRUeXBlTmFtZShlbmNvZGVkUGFyYW1zWzBdKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChyZWFkYWJsZS5jb250YWlucyhuYW1lKSkgewotCQkJCS8vIHdyaXRhYmxlIGFuZCByZWFkYWJsZQotCQkJCWlmICghZlJlcGVhdE1ldGhvZHMuY29udGFpbnMobmFtZSkpIHsKLQkJCQkJZGVzY3JpcHRvcnMuYWRkKG5ldyBKYXZhUHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIChTdHJpbmcpIHR5cGVzLmdldChuYW1lKSwgdHJ1ZSwgdHJ1ZSkpOwotCQkJCQlyZWFkYWJsZS5yZW1vdmUobmFtZSk7Ci0JCQkJCWZSZXBlYXRNZXRob2RzLmFkZChuYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3YXNuJ3QgcmVhZGFibGUsIGp1c3Qgd3JpdGFibGUKLQkJCQlTdHJpbmdbXSBwYXJhbXMgPSB0ZW1wLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCQkJLy8gY2FuJ3QgYmUgc2V0UHJvcGVydHkgaWYgbm8gcGFyYW1ldGVycwotCQkJCWlmICghKHBhcmFtcy5sZW5ndGggPiAwKSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKCFmUmVwZWF0TWV0aG9kcy5jb250YWlucyhuYW1lKSkgewotCQkJCQl0eXBlID0gZ2V0RGVjb2RlZFR5cGVOYW1lKHBhcmFtc1swXSk7Ci0JCQkJCWRlc2NyaXB0b3JzLmFkZChuZXcgSmF2YVByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCB0eXBlLCBmYWxzZSwgdHJ1ZSkpOwotCQkJCQlmUmVwZWF0TWV0aG9kcy5hZGQobmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGFkZCBsZWZ0b3ZlciBmcm9tIHJlYWRhYmxlLCBnZXQqIGFuZCBpcyogbWV0aG9kcyAocmVhZGFibGUgPSB0cnVlLCB3cml0YWJsZSA9IGZhbHNlKQotCQlpdCA9IHJlYWRhYmxlLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCW5hbWUgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlpZiAoIWZSZXBlYXRNZXRob2RzLmNvbnRhaW5zKG5hbWUpKSB7Ci0JCQkJZGVzY3JpcHRvcnMuYWRkKG5ldyBKYXZhUHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIChTdHJpbmcpIHR5cGVzLmdldChuYW1lKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCQlmUmVwZWF0TWV0aG9kcy5hZGQobmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlsdGVyR2V0TWV0aG9kcyhMaXN0IGdldE1ldGhvZHMsIExpc3QgcmVhZGFibGUsIEhhc2hNYXAgdHlwZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJTWV0aG9kIHRlbXA7Ci0JCVN0cmluZyBuYW1lOwotCQlTdHJpbmcgZW5jb2RlZFJldHVyblR5cGU7Ci0JCVN0cmluZyByZXR1cm5UeXBlOwotCQlJdGVyYXRvciBpdCA9IGdldE1ldGhvZHMuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gZW5jb2RlZFBhcmFtczsKLQkJU3RyaW5nIHBhcmFtVHlwZTsKLQkJLy8gaXRlcmF0ZSBnZXQqIG1ldGhvZHMKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJdGVtcCA9IChJTWV0aG9kKSBpdC5uZXh0KCk7Ci0JCQluYW1lID0gY3JlYXRlUHJvcGVydHlOYW1lRnJvbU1ldGhvZCh0ZW1wKTsKLQkJCS8vIGludmFsaWQgYmVhbiBuYW1pbmcgY29udmVudGlvbgotCQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQotCQkJZW5jb2RlZFJldHVyblR5cGUgPSB0ZW1wLmdldFJldHVyblR5cGUoKTsKLQkJCXJldHVyblR5cGUgPSBnZXREZWNvZGVkVHlwZU5hbWUoZW5jb2RlZFJldHVyblR5cGUpOwotCi0JCQkvLyAgY2FuJ3QgZ2V0IGJlIGEgZ2V0UHJvcGVydHkgaWYgcmV0dXJucyB2b2lkCi0JCQlpZiAocmV0dXJuVHlwZS5lcXVhbHMoInZvaWQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCi0JCQkvLyBjaGVjayBwYXJhbXMgaW4gY2FzZSBpdCdzIGluZGV4ZWQgcHJvcGV0eQotCQkJZW5jb2RlZFBhcmFtcyA9IHRlbXAuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJCWlmIChlbmNvZGVkUGFyYW1zICE9IG51bGwgJiYgZW5jb2RlZFBhcmFtcy5sZW5ndGggPT0gMSkgewotCQkJCXBhcmFtVHlwZSA9IGdldERlY29kZWRUeXBlTmFtZShlbmNvZGVkUGFyYW1zWzBdKTsKLQkJCQkvLyBzeW50YXggaXMgPiBUeXBlIGdldHRlcihpbnQpOwotCQkJCWlmICghcGFyYW1UeXBlLmVxdWFscygiaW50IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkvL2l0J3Mgbm90IGFuIGluZGV4ZWQgcHJvcGVydHkKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCS8vIGl0IGlzIGluZGV4ZWQsIHByb3AgdHlwZSBpcyBhbiBBUlJBWQotCQkJCXJldHVyblR5cGUgKz0gIltdIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlyZWFkYWJsZS5hZGQobmFtZSk7Ci0JCQl0eXBlcy5wdXQobmFtZSwgcmV0dXJuVHlwZSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBmaWx0ZXJJc01ldGhvZHMoTGlzdCBpc01ldGhvZFJlc3VsdHMsIExpc3QgcmVhZGFibGUsIEhhc2hNYXAgdHlwZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJTWV0aG9kIHRlbXA7Ci0JCVN0cmluZyBuYW1lOwotCQlTdHJpbmcgZW5jb2RlZFJldHVyblR5cGU7Ci0JCVN0cmluZyByZXR1cm5UeXBlOwotCQlTdHJpbmdbXSBlbmNvZGVkUGFyYW1zOwotCQlTdHJpbmcgcGFyYW1UeXBlOwotCQkvLyBpdGVyYXRlIGlzKiBtZXRob2RzCi0JCUl0ZXJhdG9yIGl0ID0gaXNNZXRob2RSZXN1bHRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCXRlbXAgPSAoSU1ldGhvZCkgaXQubmV4dCgpOwotCQkJbmFtZSA9IGNyZWF0ZVByb3BlcnR5TmFtZUZyb21NZXRob2QodGVtcCk7Ci0JCQkvLyBpbnZhbGlkIGJlYW4gbmFtaW5nIGNvbnZlbnRpb24KLQkJCWlmIChuYW1lID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQllbmNvZGVkUmV0dXJuVHlwZSA9IHRlbXAuZ2V0UmV0dXJuVHlwZSgpOwotCQkJcmV0dXJuVHlwZSA9IGdldERlY29kZWRUeXBlTmFtZShlbmNvZGVkUmV0dXJuVHlwZSk7Ci0KLQkJCS8vIGlzUHJvcGVydHkgb25seSB2YWxpZCBmb3IgYm9vbGVhbgotCQkJaWYgKCFyZXR1cm5UeXBlLmVxdWFscygiYm9vbGVhbiIpKSAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0KLQkJCS8vIGNoZWNrIHBhcmFtcyBpbiBjYXNlIGl0J3MgaW5kZXhlZCBwcm9wZXR5Ci0JCQllbmNvZGVkUGFyYW1zID0gdGVtcC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQkJaWYgKGVuY29kZWRQYXJhbXMgIT0gbnVsbCAmJiBlbmNvZGVkUGFyYW1zLmxlbmd0aCA9PSAxKSB7Ci0JCQkJcGFyYW1UeXBlID0gZ2V0RGVjb2RlZFR5cGVOYW1lKGVuY29kZWRQYXJhbXNbMF0pOwotCQkJCS8vIHN5bnRheCBpcyA+IFR5cGUgZ2V0dGVyKGludCk7Ci0JCQkJaWYgKCFwYXJhbVR5cGUuZXF1YWxzKCJpbnQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vaXQncyBub3QgYSB2YWxpZCBpbmRleGVkIHByb3BlcnR5Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQotCQkJcmVhZGFibGUuYWRkKG5hbWUpOwotCQkJdHlwZXMucHV0KG5hbWUsIHJldHVyblR5cGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFzcyBpbiBhIGdldCp8c2V0KnxpcyogbWV0aG9kIGFuZCBpdCB3aWxsIHJldHVybiBhbiBpbmZlcnJlZCBwcm9wZXJ0eSBuYW1lIHVzaW5nIDxjb2RlPkludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUoU3RyaW5nKTwvY29kZT4KLQkgKiBAcGFyYW0gdGVtcAotCSAqIEByZXR1cm4gYW4gaW5mZXJyZWQgcHJvcGVydHkgbmFtZSBiYXNlZCBvbiB0aGUgSU1ldGhvZCBuYW1lLCBudWxsIGlmIHRoZSBuYW1lIGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8gYmVhbiBzcGVjCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlUHJvcGVydHlOYW1lRnJvbU1ldGhvZChJTWV0aG9kIHRlbXApIHsKLQkJU3RyaW5nIG5hbWUgPSB0ZW1wLmdldEVsZW1lbnROYW1lKCk7Ci0JCWlmIChuYW1lLnN0YXJ0c1dpdGgoImlzIikpIC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKG5hbWUuc3Vic3RyaW5nKDIpKTsKLQkJZWxzZQotCQkJLy8gbXVzdCBiZSBnZXQgb3Igc2V0Ci0JCQluYW1lID0gSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShuYW1lLnN1YnN0cmluZygzKSk7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWwgZmlsdGVyaW5nIG9mIG1ldGhvZHMuICBDaGVja3MgcHJlZml4IGlmIGl0J3MgdmFsaWQgbGVuZ3RoLiAgSWYgdGhlIHByZWZpeCBpcyAiZ2V0IiB0aGUgIG1ldGhvZCBuYW1lIAotCSAqIGlzIHBsYWNlZCBpbiB0aGUgZ2V0TWV0aG9kUmVzdWx0cyBMaXN0LiAgSWYgdGhlIHByZWZpeCBpcyAiaXMiLCB0aGUgbmFtZSBpcyBhZGRlZCB0byB0aGUgaXNNZXRob2RSZXN1bHRzIGxpc3QuICBJZiB0aGUKLQkgKiBwcmVmaXggaXMgInNldCIsIGl0J3MgYWRkZWQgdG8gdGhlIHNldE1ldGhvZFJlc3VsdHNMaXN0LgotCSAqIAotCSAqIEBwYXJhbSBnZXRNZXRob2RSZXN1bHRzCi0JICogQHBhcmFtIGlzTWV0aG9kUmVzdWx0cwotCSAqIEBwYXJhbSBzZXRNZXRob2RSZXN1bHRzCi0JICogQHBhcmFtIG1ldGhvZAotCSAqLwotCXByaXZhdGUgdm9pZCBhY2NlcHRNZXRob2QoTGlzdCBnZXRNZXRob2RSZXN1bHRzLCBMaXN0IGlzTWV0aG9kUmVzdWx0cywgTGlzdCBzZXRNZXRob2RSZXN1bHRzLCBJTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWlmICghZlJlcGVhdE1ldGhvZHMuY29udGFpbnMobWV0aG9kLmdldEVsZW1lbnROYW1lKCkpKSB7Ci0JCQlmUmVwZWF0TWV0aG9kcy5hZGQobWV0aG9kLmdldEVsZW1lbnROYW1lKCkpOwotCQkJaW50IGZsYWdzID0gbWV0aG9kLmdldEZsYWdzKCk7Ci0JCQlTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpOwotCQkJaWYgKEZsYWdzLmlzUHVibGljKGZsYWdzKSkgewotCQkJCWlmIChtZXRob2ROYW1lLmxlbmd0aCgpID4gMyAmJiBtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImdldCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCWdldE1ldGhvZFJlc3VsdHMuYWRkKG1ldGhvZCk7Ci0JCQkJZWxzZSBpZiAobWV0aG9kTmFtZS5sZW5ndGgoKSA+IDIgJiYgbWV0aG9kTmFtZS5zdGFydHNXaXRoKCJpcyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCWlzTWV0aG9kUmVzdWx0cy5hZGQobWV0aG9kKTsKLQkJCQllbHNlIGlmIChtZXRob2ROYW1lLmxlbmd0aCgpID4gMyAmJiBtZXRob2ROYW1lLnN0YXJ0c1dpdGgoInNldCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXNldE1ldGhvZFJlc3VsdHMuYWRkKG1ldGhvZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdHlwZU5hbWUKLQkgKiBAcmV0dXJuIGEgUXVhbGlmaWVkIG5hbWUgd2l0aCB0aGUgcGFja2FnZSBhcyB0aGUgcXVhbGlmaWVyLCBhbmQgY2xhc3MgbmFtZSBhcyBMb2NhbE5hbWUKLQkgKi8KLQlwcml2YXRlIFF1YWxpZmllZE5hbWUgZ2V0VHlwZVF1YWxpZmllZE5hbWUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHlwZU5hbWUsICIuIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCWludCBsZW5ndGggPSBzdC5jb3VudFRva2VucygpOwotCQlpbnQgY291bnQgPSAwOwotCQlTdHJpbmdCdWZmZXIgcm9vdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJd2hpbGUgKGNvdW50KysgPCBsZW5ndGggLSAxKSB7Ci0JCQlyb290LmFwcGVuZChzdC5uZXh0VG9rZW4oKSk7Ci0JCQlpZiAoY291bnQgPCBsZW5ndGggLSAxKQotCQkJCXJvb3QuYXBwZW5kKCcuJyk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBRdWFsaWZpZWROYW1lKHJvb3QudG9TdHJpbmcoKSwgc3QubmV4dFRva2VuKCkpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBlbmNvZGVkVHlwZU5hbWUgaXMgYW4gYXJyYXkKLQkgKiBAcGFyYW0gZW5jb2RlZFR5cGVOYW1lCi0JICogQHJldHVybiB0cnVlIGlmIGVuY29kZWRUeXBlTmFtZSBpcyBhbiBhcnJheSwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0FycmF5KFN0cmluZyBlbmNvZGVkVHlwZU5hbWUpIHsKLQkJaWYgKGVuY29kZWRUeXBlTmFtZSAhPSBudWxsICYmIGVuY29kZWRUeXBlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCWlmIChlbmNvZGVkVHlwZU5hbWUuY2hhckF0KDApID09ICdbJykKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVjb2RlZCAoZGlzcGxheWFibGUpIG5hbWUgZm8gdGhlIHR5cGUuCi0JICogRWl0aGVyIGEgcHJpbWl0aXZlIHR5cGUgKGludCwgbG9uZywgZmxvYXQuLi4pIE9iamVjdCAoU3RyaW5nKQotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybiBkZWNvZGVkIG5hbWUgZm9yIHRoZSBlbmNvZGVkIHN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERlY29kZWRUeXBlTmFtZShTdHJpbmcgZW5jb2RlZCkgewotCQlIYXNoTWFwIG1hcCA9IGdldEVuY29kZWRUeXBlTWFwKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIGRlY29kZWQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWNoYXIgQlJBQ0tFVCA9ICdbJzsKLQkJU3RyaW5nIEJSQUNLRVRTID0gIltdIjsgLy8kTk9OLU5MUy0xJAotCQljaGFyIGlkZW50aWZpZXIgPSAnICc7Ci0JCWludCBsYXN0ID0gMDsKLQkJLy8gY291bnQgYnJhY2tldHMKLQkJd2hpbGUgKGVuY29kZWQuaW5kZXhPZihCUkFDS0VULCBsYXN0KSAhPSAtMSkgewotCQkJbGFzdCsrOwotCQl9Ci0JCWlkZW50aWZpZXIgPSBlbmNvZGVkLmNoYXJBdChsYXN0KTsKLQkJT2JqZWN0IHByaW1pdGl2ZVR5cGUgPSBtYXAuZ2V0KFN0cmluZy52YWx1ZU9mKGlkZW50aWZpZXIpKTsKLQkJLy8gTCA+IGJpbmFyeSB0eXBlIG5hbWUsIFEgPiBzb3VyY2UgdHlwZSBuYW1lCi0JCWlmIChpZGVudGlmaWVyID09ICdMJyB8fCBpZGVudGlmaWVyID09ICdRJykgewotCQkJLy8gaGFuZGxlIG9iamVjdAotCQkJU3RyaW5nIGNsYXNzbmFtZSA9IGVuY29kZWQuc3Vic3RyaW5nKGxhc3QgKyAxLCBlbmNvZGVkLmxlbmd0aCgpIC0gMSk7Ci0JCQlkZWNvZGVkLmFwcGVuZChjbGFzc25hbWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZVR5cGUgIT0gbnVsbCkgewotCQkJLy8gaGFuZGxlIHByaW1pdGl2ZSB0eXBlIChmcm9tIElGaWVsZC5nZXRTaWduYXR1cmUoKSkKLQkJCWRlY29kZWQuYXBwZW5kKChTdHJpbmcpIHByaW1pdGl2ZVR5cGUpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gaGFuZGxlIHByaW1pdGl2ZSB0eXBlIChmcm9tIENsYXNzLmdldE5hbWUoKSkKLQkJCWRlY29kZWQuYXBwZW5kKGVuY29kZWQpOwotCQl9Ci0JCS8vIGhhbmRsZSBhcnJheXMKLQkJaWYgKGxhc3QgPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxhc3Q7IGkrKykgewotCQkJCWRlY29kZWQuYXBwZW5kKEJSQUNLRVRTKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVjb2RlZC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqCWZyb20gQ2xhc3MuZ2V0TmFtZSgpIGphdmFkb2MKLQkgKglhbHNvIHNlZSBTaWduYXR1cmUgaW4gamR0LmNvcmUgYXBpCi0JICo8cHJlPgotCSAqCQkJQiAgICAgICAgICAgIGJ5dGUKLQkgKgkJCUMgICAgICAgICAgICBjaGFyCi0JICoJCQlEICAgICAgICAgICAgZG91YmxlCi0JICoJCQlGICAgICAgICAgICAgZmxvYXQKLQkgKgkJCUkgICAgICAgICAgICBpbnQKLQkgKgkJCUogICAgICAgICAgICBsb25nCi0JICoJCQlMY2xhc3NuYW1lOyAgY2xhc3Mgb3IgaW50ZXJmYWNlCi0JICoJCQlRc291cmNlbmFtZTsgc291cmNlCi0JICoJCQlTICAgICAgICAgICAgc2hvcnQKLQkgKgkJCVogICAgICAgICAgICBib29sZWFuCi0JICoJCQlWCSAgIAkJIHZvaWQKLQkgKjwvcHJlPgotCSAqCi0JICogQHJldHVybiB0aGUgImVuY29kaW5nIGxldHRlciIgdG8gInR5cGUiIG1hcC4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZ2V0RW5jb2RlZFR5cGVNYXAoKSB7Ci0JCWlmIChmRW5jb2RlZFR5cGVNYXAgPT0gbnVsbCkgewotCQkJZkVuY29kZWRUeXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZFbmNvZGVkVHlwZU1hcC5wdXQoIkIiLCAiYnl0ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZFbmNvZGVkVHlwZU1hcC5wdXQoIkMiLCAiY2hhciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZFbmNvZGVkVHlwZU1hcC5wdXQoIkQiLCAiZG91YmxlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkVuY29kZWRUeXBlTWFwLnB1dCgiRiIsICJmbG9hdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZFbmNvZGVkVHlwZU1hcC5wdXQoIkkiLCAiaW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkVuY29kZWRUeXBlTWFwLnB1dCgiSiIsICJsb25nIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkVuY29kZWRUeXBlTWFwLnB1dCgiUyIsICJzaG9ydCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZFbmNvZGVkVHlwZU1hcC5wdXQoIloiLCAiYm9vbGVhbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZFbmNvZGVkVHlwZU1hcC5wdXQoIlYiLCAidm9pZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gZkVuY29kZWRUeXBlTWFwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbVRlbXBsYXRlUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbVRlbXBsYXRlUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyMTIxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DdXN0b21UZW1wbGF0ZVByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZVByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LklSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWw7Ci0KLS8qKgotICogUHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIG1ha2UgdGhlIGFkZGl0aW9uYWwgcHJvcG9zYWwgaW5mbyBpbnRvIGNvbnRlbnQKLSAqIGZpdCBmb3IgYW4gSFRNTCB2aWV3ZXIgKGJ5IGVzY2FwaW5nIGNoYXJhY3RlcnMpCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1jbGFzcyBDdXN0b21UZW1wbGF0ZVByb3Bvc2FsIGV4dGVuZHMgVGVtcGxhdGVQcm9wb3NhbCBpbXBsZW1lbnRzIElSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0IGluOgotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdAotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QKLQotCXB1YmxpYyBDdXN0b21UZW1wbGF0ZVByb3Bvc2FsKFRlbXBsYXRlIHRlbXBsYXRlLCBUZW1wbGF0ZUNvbnRleHQgY29udGV4dCwgSVJlZ2lvbiByZWdpb24sIEltYWdlIGltYWdlLCBpbnQgcmVsZXZhbmNlKSB7Ci0JCXN1cGVyKHRlbXBsYXRlLCBjb250ZXh0LCByZWdpb24sIGltYWdlLCByZWxldmFuY2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpIHsKLQkJU3RyaW5nIGFkZGl0aW9uYWxJbmZvID0gc3VwZXIuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpOwotCQlyZXR1cm4gU3RyaW5nVXRpbHMuY29udmVydFRvSFRNTENvbnRlbnQoYWRkaXRpb25hbEluZm8pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0lCZWFuSW5mb1Byb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9JQmVhbkluZm9Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWQ5ZWY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0lCZWFuSW5mb1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotCi0vKioKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCZWFuSW5mb1Byb3ZpZGVyIHsKLQlJSmF2YVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFJ1bnRpbWVQcm9wZXJ0aWVzKElSZXNvdXJjZSBiYXNlUmVzb3VyY2UsIFN0cmluZyB0eXBlTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9JSmF2YVByb3BlcnR5RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSUphdmFQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIzZTNmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9JSmF2YVByb3BlcnR5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotLyoqCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSmF2YVByb3BlcnR5RGVzY3JpcHRvciB7Ci0KLQlTdHJpbmcgZ2V0RGVjbGFyZWRUeXBlKCk7Ci0KLQlTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLQotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQlib29sZWFuIGdldFJlYWRhYmxlKCk7Ci0KLQlib29sZWFuIGdldFdyaXRlYWJsZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjNkMjhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUENvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5JSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklSZWxlYXNhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEpTUENvbXBsZXRpb25Qcm9jZXNzb3IgaW1wbGVtZW50cyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciwgSVJlbGVhc2FibGUgewotCS8vIGZvciBkZWJ1Z2dpbmcKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwdHJhbnNsYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpEVF9DT1JFX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qZHQuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBpbnQgZkpzcFNvdXJjZVBvc2l0aW9uLCBmSmF2YVBvc2l0aW9uOwotCXByb3RlY3RlZCBTdHJpbmcgZkVycm9yTWVzc2FnZSA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cnVjdHVyZWRUZXh0Vmlld2VyIGZWaWV3ZXIgPSBudWxsOwotCXByaXZhdGUgSlNQVHJhbnNsYXRpb25BZGFwdGVyIGZUcmFuc2xhdGlvbkFkYXB0ZXIgPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBsb2NhdGlvbgotCSAqIHdpdGhpbiB0aGUgZG9jdW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24KLQkgKiB3aXRoaW4gdGhlIHRleHQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgd2hvc2UgZG9jdW1lbnQgaXMgdXNlZCB0byBjb21wdXRlIHRoZSBwcm9wb3NhbHMKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqICAgICAgICAgICAgYW4gb2Zmc2V0IHdpdGhpbiB0aGUgZG9jdW1lbnQgZm9yIHdoaWNoIGNvbXBsZXRpb25zIHNob3VsZAotCSAqICAgICAgICAgICAgYmUgY29tcHV0ZWQKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCi0JICogICAgICAgICBwcm9wb3NhbHMgYXJlIHBvc3NpYmxlCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBwb3MpIHsKLQkJaW5pdGlhbGl6ZShwb3MpOwotCi0JCUpTUFByb3Bvc2FsQ29sbGVjdG9yIGNvbGxlY3RvciA9IG51bGw7Ci0JCQotCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyKQotCQkJCWZWaWV3ZXIgPSAoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlcjsKLQotCQkJeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0KLQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJaWYgKGZUcmFuc2xhdGlvbkFkYXB0ZXIgPT0gbnVsbCkKLQkJCQlmVHJhbnNsYXRpb25BZGFwdGVyID0gKEpTUFRyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpTUFRyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCWlmIChmVHJhbnNsYXRpb25BZGFwdGVyICE9IG51bGwpIHsKLQotCQkJCUpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gZlRyYW5zbGF0aW9uQWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbigpOwotCQkJCWZKYXZhUG9zaXRpb24gPSB0cmFuc2xhdGlvbi5nZXRKYXZhT2Zmc2V0KGdldERvY3VtZW50UG9zaXRpb24oKSk7Ci0KLQkJCQlpZiAoREVCVUcpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihkZWJ1Zyh0cmFuc2xhdGlvbikpOwotCi0JCQkJdHJ5IHsKLQotCQkJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdHJhbnNsYXRpb24uZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0KLQkJCQkJLy8gY2FuJ3QgZ2V0IGphdmEgcHJvcG9zYWxzIHcvb3V0IGEgY29tcGlsYXRpb24gdW5pdAotCQkJCQkvLyBvciB3aXRob3V0IGEgdmFsaWQgcG9zaXRpb24KLQkJCQkJaWYgKGN1ID09IG51bGwgfHwgLTEgPT0gZkphdmFQb3NpdGlvbikKLQkJCQkJCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJCQkJCi0JCQkJCWNvbGxlY3RvciA9IGdldFByb3Bvc2FsQ29sbGVjdG9yKGN1LCB0cmFuc2xhdGlvbik7Ci0JCQkJCXN5bmNocm9uaXplZCAoY3UpIHsKLQkJCQkJCWN1LmNvZGVDb21wbGV0ZShmSmF2YVBvc2l0aW9uLCBjb2xsZWN0b3IsIG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNvcmVFeCkgewotCQkJCQkvLyBhIHBvc3NpYmxlIEphdmEgTW9kZWwgRXhjZXB0aW9uIGR1ZSB0byBub3QgYmVpbmcgYSBXZWIKLQkJCQkJLy8gKEphdmEpIFByb2plY3QKLQkJCQkJY29yZUV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQkJLy8gdGhyb3cgb3V0IGV4Y2VwdGlvbnMgb24gY29kZSBhc3Npc3QuCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSByZXN1bHRzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCWlmKGNvbGxlY3RvciAhPSBudWxsKSB7Ci0JCQlyZXN1bHRzID0gY29sbGVjdG9yLmdldEpTUENvbXBsZXRpb25Qcm9wb3NhbHMoKTsKLQkJCWlmIChyZXN1bHRzID09IG51bGwgfHwgcmVzdWx0cy5sZW5ndGggPCAxKQotCQkJCWZFcnJvck1lc3NhZ2UgPSBKU1BVSU1lc3NhZ2VzLkphdmFfQ29udGVudF9Bc3Npc3RfaXNfbm90X1VJXzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpTUFByb3Bvc2FsQ29sbGVjdG9yIGdldFByb3Bvc2FsQ29sbGVjdG9yKElDb21waWxhdGlvblVuaXQgY3UsIEpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgSlNQUHJvcG9zYWxDb2xsZWN0b3IoY3UsIHRyYW5zbGF0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogRm9yIGRlYnVnZ2luZyB0cmFuc2xhdGlvbiBtYXBwaW5nIG9ubHkuCi0JICogCi0JICogQHBhcmFtIHRyYW5zbGF0aW9uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVidWcoSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24pIHsKLQkJU3RyaW5nQnVmZmVyIGRlYnVnU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlIYXNoTWFwIGpzcDJqYXZhID0gdHJhbnNsYXRpb24uZ2V0SnNwMkphdmFNYXAoKTsKLQkJU3RyaW5nIGphdmFUZXh0ID0gdHJhbnNsYXRpb24uZ2V0SmF2YVRleHQoKTsKLQkJU3RyaW5nIGpzcFRleHQgPSBmVmlld2VyLmdldERvY3VtZW50KCkuZ2V0KCk7Ci0JCWRlYnVnU3RyaW5nLmFwcGVuZCgiW2pzcDJKYXZhTWFwIGluIEpTUENvbXBsZXRpb25Qcm9jZXNzb3JdXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCWRlYnVnU3RyaW5nLmFwcGVuZCgianNwIGN1cnNvciBwb3NpdGlvbiA+PiAiICsgZlZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuZ2V0Q2FyZXRPZmZzZXQoKSArICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSXRlcmF0b3IgaXQgPSBqc3AyamF2YS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQl0cnkgewotCQkJCVBvc2l0aW9uIGpzcFBvcyA9IChQb3NpdGlvbikgaXQubmV4dCgpOwotCQkJCVBvc2l0aW9uIGphdmFQb3MgPSAoUG9zaXRpb24pIGpzcDJqYXZhLmdldChqc3BQb3MpOwotCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgianNwID4gIiArIGpzcFBvcy5vZmZzZXQgKyAiOiIgKyBqc3BQb3MubGVuZ3RoICsgIjoiICsganNwVGV4dC5zdWJzdHJpbmcoanNwUG9zLm9mZnNldCwganNwUG9zLm9mZnNldCArIGpzcFBvcy5sZW5ndGgpICsgIjpcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJZGVidWdTdHJpbmcuYXBwZW5kKCJqYXZhID4gIiArIGphdmFQb3Mub2Zmc2V0ICsgIjoiICsgamF2YVBvcy5sZW5ndGggKyAiOiIgKyBqYXZhVGV4dC5zdWJzdHJpbmcoamF2YVBvcy5vZmZzZXQsIGphdmFQb3Mub2Zmc2V0ICsgamF2YVBvcy5sZW5ndGgpICsgIjpcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJZGVidWdTdHJpbmcuYXBwZW5kKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gZWF0IGV4Y2VwdGlvbnMsIGl0J3Mgb25seSBmb3IgZGVidWcKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVidWdTdHJpbmcudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHBvc3NpYmxlIGNvbnRleHRzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQKLQkgKiBsb2NhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgY3Vyc29yCi0JICogcG9zaXRpb24gd2l0aGluIHRoZSB0ZXh0IHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdmlld2VyIHdob3NlIGRvY3VtZW50IGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgcG9zc2libGUKLQkgKiAgICAgICAgICAgIGNvbnRleHRzCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24KLQkgKiAgICAgICAgICAgIGFuIG9mZnNldCB3aXRoaW4gdGhlIGRvY3VtZW50IGZvciB3aGljaCBjb250ZXh0IGluZm9ybWF0aW9uCi0JICogICAgICAgICAgICBzaG91bGQgYmUgY29tcHV0ZWQKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNvbnRleHQgaW5mb3JtYXRpb24gb2JqZWN0cyBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgaWYgbm8gY29udGV4dCBjb3VsZCBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbltdIGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBwcmVzc2VkIHNob3VsZCBhdXRvbWF0aWNhbGx5Ci0JICogZGlzcGxheSBjb250ZW50LWFzc2lzdCBwcm9wb3NhbHMuCi0JICogCi0JICogQHJldHVybiBzdHJpbmcgb2YgY2hhcmFjdGVycwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF1dG9Qcm9wb3NhbEludm9jYXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBwcmVzc2VkIHNob3VsZCBhdXRvbWF0aWNhbGx5Ci0JICogZGlzcGxheSBhIGNvbnRlbnQtYXNzaXN0IHRpcC4KLQkgKiAKLQkgKiBAcmV0dXJuIHN0cmluZyBvZiBjaGFyYWN0ZXJzCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXV0b1RpcEludm9jYXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIHdoZW4gZW50ZXJlZCBieSB0aGUgdXNlciBzaG91bGQKLQkgKiBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgdGhlIHByZXNlbnRhdGlvbiBvZiBwb3NzaWJsZSBjb21wbGV0aW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhdXRvIGFjdGl2YXRpb24gY2hhcmFjdGVycyBmb3IgY29tcGxldGlvbiBwcm9wb3NhbCBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYXV0byBhY3RpdmF0aW9uIGlzIGRlc2lyZWQKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hhcmFjdGVycyB3aGljaCB3aGVuIGVudGVyZWQgYnkgdGhlIHVzZXIgc2hvdWxkCi0JICogYXV0b21hdGljYWxseSB0cmlnZ2VyIHRoZSBwcmVzZW50YXRpb24gb2YgY29udGV4dCBpbmZvcm1hdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhdXRvIGFjdGl2YXRpb24gY2hhcmFjdGVycyBmb3IgcHJlc2VudGluZyBjb250ZXh0Ci0JICogICAgICAgICBpbmZvcm1hdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBhdXRvIGFjdGl2YXRpb24gaXMKLQkgKiAgICAgICAgIGRlc2lyZWQKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHZhbGlkYXRvciB1c2VkIHRvIGRldGVybWluZSB3aGVuIGRpc3BsYXllZCBjb250ZXh0Ci0JICogaW5mb3JtYXRpb24gc2hvdWxkIGJlIGRpc21pc3NlZC4gTWF5IG9ubHkgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogdGhlIHByb2Nlc3NvciBpcyBpbmNhcGFibGUgb2YgY29tcHV0aW5nIGNvbnRleHQgaW5mb3JtYXRpb24uCi0JICogCi0JICogQHJldHVybiBhIGNvbnRleHQgaW5mb3JtYXRpb24gdmFsaWRhdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiAgICAgICAgIHByb2Nlc3NvciBpcyBpbmNhcGFibGUgb2YgY29tcHV0aW5nIGNvbnRleHQgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldERvY3VtZW50UG9zaXRpb24oKSB7Ci0JCXJldHVybiBmSnNwU291cmNlUG9zaXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCS8vIFRPRE86IGdldCBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlCi0JCS8vIGlmIChmQ29sbGVjdG9yLmdldEVycm9yTWVzc2FnZSgpICE9IG51bGwgJiYKLQkJLy8gZkNvbGxlY3Rvci5nZXRFcnJvck1lc3NhZ2UoKS5sZW5ndGgoKSA+IDApCi0JCS8vIHJldHVybiBmQ29sbGVjdG9yLmdldEVycm9yTWVzc2FnZSgpOwotCQlyZXR1cm4gZkVycm9yTWVzc2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBjb2RlIGFzc2lzdCBwcm9jZXNzb3IuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShpbnQgcG9zKSB7Ci0JCWluaXRpYWxpemVKYXZhUGx1Z2lucygpOwotCi0JCWZKc3BTb3VyY2VQb3NpdGlvbiA9IHBvczsKLQkJZkVycm9yTWVzc2FnZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgSmF2YSBQbHVnaW5zIHRoYXQgdGhlIEpTUCBwcm9jZXNzb3IgcmVxdWlyZXMuCi0JICogU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDM3NjUKLQkgKiBXZSBzaG91bGQgbm90IGNhbGwgInN0YXJ0IiwgYmVjYXVzZSB0aGF0IHdpbGwgY2F1c2UgdGhhdCAKLQkgKiBzdGF0ZSB0byBiZSByZW1lbWJlcmVkLCBhbmQgcmUtc3RhcnRlZCBhdXRvbWF0aWNhbGx5IGR1cmluZyAKLQkgKiB0aGUgbmV4dCBib290IHVwIHNlcXVlbmNlLiAKLQkgKiAKLQkgKiBJU1NVRTogd2UgbWF5IGJlIGFibGUgdG8gZ2V0IHJpZCBvZiB0aGlzIGFsbCB0b2dldGhlciwgaW4gZnV0dXJlLCAKLQkgKiBzaW5jZSA5OSUgd2UgcHJvYmFibHkgaGF2ZSBhbHJlYWR5IHVzZWQgc29tZSBKRFQgY2xhc3MgYnkgdGhlIHRpbWUgCi0JICogd2UgbmVlZCBKRFQgdG8gYmUgYWN0aXZlIC4uLiBidXQgLi4uIHRoaXMgaXMgdGhlIHNhZmVzdCBmaXggZm9yIAotCSAqIHRoaXMgcG9pbnQgaW4gMS41IHN0cmVhbS4gTmV4dCByZWxlYXNlLCBsZXQncyBqdXN0IHJlbW92ZSB0aGlzLCAKLQkgKiByZS1kaXNjb3ZlciB3aGF0IGV2ZXIgYnVnIHRoaXMgd2FzIGZpeGluZyAoaWYgYW55KSBhbmQgaWYgdGhlcmUgaXMgCi0JICogb25lLCB0aGVuIHdlJ2xsIGVpdGhlciBwdXQgYmFjayBpbiwgYXMgaXMsIG9yIGNvbWUgdXAgd2l0aCBhIAotCSAqIG1vcmUgYXBwcm9wcmlhdGUgZml4LiAKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSmF2YVBsdWdpbnMoKSB7Ci0JCXRyeSB7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKEpEVF9DT1JFX1BMVUdJTl9JRCk7Ci0JCQlidW5kbGUubG9hZENsYXNzKCJkdW1teUNsYXNzTmFtZVRoYXRTaG91bGROZXZlckV4aXN0Iik7Ci0JCX0KLQkJY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gdGhpcyBpcyB0aGUgZXhwZWN0ZWQgcmVzdWx0LCB3ZSBqdXN0IHdhbnQgdG8gCi0JCQkvLyBudWRnZSB0aGUgYnVuZGxlIHRvIGJlIHN1cmUgaXRzIGFjdGl2YXRlZC4gCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlmVHJhbnNsYXRpb25BZGFwdGVyID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BDb21wbGV0aW9uUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUENvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzVlYWRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUENvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIElKYXZhQ29tcGxldGlvblByb3Bvc2FsIGZvciB1c2Ugd2l0aCBKU1BQcm9wb3NhbENvbGxlY3Rvci4KLSAqCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEpTUENvbXBsZXRpb25Qcm9wb3NhbCBleHRlbmRzIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBpbXBsZW1lbnRzIElKYXZhQ29tcGxldGlvblByb3Bvc2FsICB7Ci0KLQkvKgotCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQ0ODMKLQkgKiAKLQkgKiBUaGlzIGlzIGEgd3JhcHBlZCBwcm9wb3NhbCBzbyB3ZSBkb24ndCBuZWVkIHRvIAotCSAqIG1ha2UgInNsb3ciIGNhbGxzIHRvIHRoZSBqYXZhIHByb3Bvc2FsIHVwIGZyb250LCBvbmx5IHdoZW4gbmVlZGVkCi0JICogZm9yIGV4YW1wbGUsIGdldEFkZGl0aW9uYWxJbmZvKCkgcmVhZHMgZXh0ZXJuYWwgamF2YWRvYywgYW5kIGl0IG1ha2VzCi0JICogbm8gc2Vuc2UKLQkgKi8gCi0JSUNvbXBsZXRpb25Qcm9wb3NhbCBmSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCA9IG51bGw7Ci0JCi0JcHVibGljIEpTUENvbXBsZXRpb25Qcm9wb3NhbChTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcsIGludCByZXBsYWNlbWVudE9mZnNldCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBpbnQgY3Vyc29yUG9zaXRpb24sIEltYWdlIGltYWdlLCBTdHJpbmcgZGlzcGxheVN0cmluZywgSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24sIFN0cmluZyBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCBpbnQgcmVsZXZhbmNlLCBib29sZWFuIHVwZGF0ZVJlcGxhY2VtZW50TGVuZ3RoT25WYWxpZGF0ZSkgewotCQlzdXBlcihyZXBsYWNlbWVudFN0cmluZywgcmVwbGFjZW1lbnRPZmZzZXQsIHJlcGxhY2VtZW50TGVuZ3RoLCBjdXJzb3JQb3NpdGlvbiwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIGNvbnRleHRJbmZvcm1hdGlvbiwgYWRkaXRpb25hbFByb3Bvc2FsSW5mbywgcmVsZXZhbmNlLCB1cGRhdGVSZXBsYWNlbWVudExlbmd0aE9uVmFsaWRhdGUpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIGN1cnNvciBwb3NpdGlvbiBhZnRlciBhcHBseWluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseShJVGV4dFZpZXdlciB2aWV3ZXIsIGNoYXIgdHJpZ2dlciwgaW50IHN0YXRlTWFzaywgaW50IG9mZnNldCkgewotCQlzdXBlci5hcHBseSh2aWV3ZXIsIHRyaWdnZXIsIHN0YXRlTWFzaywgb2Zmc2V0KTsKLQl9Ci0KLQlmaW5hbCBwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbCBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FsKCkgewotCQlyZXR1cm4gZkphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci0JfQotCi0JZmluYWwgcHVibGljIHZvaWQgc2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbChJQ29tcGxldGlvblByb3Bvc2FsIGphdmFDb21wbGV0aW9uUHJvcG9zYWwpIHsKLQkJZkphdmFDb21wbGV0aW9uUHJvcG9zYWwgPSBqYXZhQ29tcGxldGlvblByb3Bvc2FsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCQotCQlTdHJpbmcgYWRkaXRpb25hbEluZm8gPSBzdXBlci5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWwgamF2YVByb3Bvc2FsID0gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbCgpOwotCQlpZihqYXZhUHJvcG9zYWwgIT0gbnVsbCkKLQkJCWFkZGl0aW9uYWxJbmZvID0gamF2YVByb3Bvc2FsLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLQkJCi0JCXJldHVybiBhZGRpdGlvbmFsSW5mbzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmN2M1MDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSlNQQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5EZXBsb3ltZW50RGVzY3JpcHRvclByb3BlcnR5Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50LlBhZ2VEaXJlY3RpdmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5QYWdlRGlyZWN0aXZlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMjBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRleHQuSUpTUFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5KU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5KU1BFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ1NTQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkpTUENNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkhUTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklSZWxlYXNhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5JUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5JUmVsZXZhbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNRG9jVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnRUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Ob2RlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5BYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Ob25WYWxpZGF0aW5nTW9kZWxRdWVyeUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuUHJvcG9zYWxDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxSZWxldmFuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogQWRkcyBwcm9wb3NhbHMgbm90IG5vcm1hbGx5IGNvdmVyZWQgYnkgdGhlIGdlbmVyaWMgYmVoYXZpb3Igd2l0aCB0aGUKLSAqIGNvbnRlbnQgbW9kZWwKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BDb250ZW50QXNzaXN0UHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQotCXByb3RlY3RlZCBpbnQgZGVwdGhDb3VudCA9IDA7Ci0JcHJvdGVjdGVkIElUZXh0Vmlld2VyIGZWaWV3ZXIgPSBudWxsOwotCXByb3RlY3RlZCBib29sZWFuIHVzZUVtYmVkZGVkUmVzdWx0cyA9IHRydWU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnRlcm5hbEFkYXB0ZXIgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgSGFzaE1hcCBmTmFtZVRvUHJvY2Vzc29yTWFwID0gbnVsbDsKLQlwcm90ZWN0ZWQgSGFzaE1hcCBmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAgPSBudWxsOwotCXByaXZhdGUgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIEVNUFRZX1BST1BPU0FMX1NFVCA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCXByaXZhdGUgSlNQVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yIGZUZW1wbGF0ZVByb2Nlc3NvciA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZUZW1wbGF0ZUNvbnRleHRzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZkpTQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQotCXB1YmxpYyBKU1BDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkgewotCQlzdXBlcigpOwotCQlpbml0TmFtZVRvUHJvY2Vzc29yTWFwKCk7Ci0JCWluaXRQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpOwotCX0KLQotCS8qKgotCSAqIGluaXQgbWFwIGZvciBleHRyYSBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3JzICh1c2VCZWFuLAotCSAqIGdldC9zZXRQcm9wZXJ0eSkuIHBvaW50cyBbdGFnbmFtZSA+IHByb2Nlc3Nvcl0KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0TmFtZVRvUHJvY2Vzc29yTWFwKCkgewotCQlmTmFtZVRvUHJvY2Vzc29yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJSlNQUHJvcGVydHlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGpzcFByb3BlcnR5Q0FQID0gbmV3IEpTUFByb3BlcnR5Q29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQlmTmFtZVRvUHJvY2Vzc29yTWFwLnB1dChKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5TRVRQUk9QRVJUWSwganNwUHJvcGVydHlDQVApOwotCQlmTmFtZVRvUHJvY2Vzc29yTWFwLnB1dChKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5HRVRQUk9QRVJUWSwganNwUHJvcGVydHlDQVApOwotCQlmTmFtZVRvUHJvY2Vzc29yTWFwLnB1dChKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOLCBuZXcgSlNQVXNlQmVhbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSk7Ci0JCWZOYW1lVG9Qcm9jZXNzb3JNYXAucHV0KEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUdMSUIsIG5ldyBKU1BUYWdsaWJEaXJlY3RpdmVDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkpOwotCX0KLQotCS8qKgotCSAqIGludCBtYXAgdGhhdCBwb2ludHMgW3BhcnRpdGlvbiA+IHByb2Nlc3Nvcl0uIFRoaXMgdGFrZXMgcGxhY2Ugb2YKLQkgKiBlbWJlZGRlZCBhZGFwdGVycyBmb3Igbm93LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpIHsKLQkJZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJSFRNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgaHRtbFByb2Nlc3NvciA9IG5ldyBIVE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQlKU1BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3NvciBqc3BKYXZhUHJvY2Vzc29yID0gbmV3IEpTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0JCVhNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgeG1sUHJvY2Vzc29yID0gbmV3IFhNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKTsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgamF2YXNjcmlwdFByb2Nlc3NvciA9IGdldEpTQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCi0JCWZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5wdXQoSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCwgaHRtbFByb2Nlc3Nvcik7Ci0JCWZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5wdXQoSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQsIHhtbFByb2Nlc3Nvcik7Ci0JCWZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5wdXQoSVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OLCBodG1sUHJvY2Vzc29yKTsKLQkJZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLnB1dChJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVCwganNwSmF2YVByb2Nlc3Nvcik7Ci0JCWZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5wdXQoSUpTUFBhcnRpdGlvbnMuSlNQX0RJUkVDVElWRSwgeG1sUHJvY2Vzc29yKTsKLQkJZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLnB1dChJSFRNTFBhcnRpdGlvbnMuSFRNTF9DT01NRU5ULCBodG1sUHJvY2Vzc29yKTsKLQkJZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLnB1dChJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVF9FTCwganNwSmF2YVByb2Nlc3Nvcik7Ci0JCWlmIChqYXZhc2NyaXB0UHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCWZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5wdXQoSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVCwgamF2YXNjcmlwdFByb2Nlc3Nvcik7Ci0JCQlmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAucHV0KElIVE1MUGFydGl0aW9ucy5TQ1JJUFQsIGphdmFzY3JpcHRQcm9jZXNzb3IpOyAvLyBkZWZhdWx0Ci0JCX0KLQkJLy8gdG8KLQkJLy8gamF2YXNjcmlwdAotCQkvLyBmb3IKLQkJLy8gYWxsCi0JCS8vIHNjcmlwdAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENvbW1lbnRQcm9wb3NhbChDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRG9jVHlwZVByb3Bvc2FsKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCWlmIChDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQVEFHLmVxdWFscygoKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCkpLmdldE1vZGVsKCkuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkpKSB7Ci0JCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuTkVXX1RBRyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuTkVXKTsKLQkJfQotCi0JCXN1cGVyLmFkZEVtcHR5RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQlhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIDApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVuZFRhZ05hbWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFBDREFUQVByb3Bvc2FsKFN0cmluZyBub2RlTmFtZSwgQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ0Nsb3NlUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYTUxQcm9wb3NhbChDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW5kVGFnUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5BVFRSSUJVVEUpOwotCX0KLQotCS8qKgotCSAqIGFkZCBwcm9wb3NhbHMgZm9yIHRhZ3MgaW4gYXR0cmlidXRlIHZhbHVlcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5BVFRSSUJVVEVfVkFMVUUpOwotCi0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKTsKLQotCQkvLyBhZGQgSlNQIGV4dHJhIHByb3Bvc2FscyBmcm9tIEpTUEJlYW5JbmZvQ29udGVudEFzc2lzdFByb2Nlc3NvcgotCQkvLyBKU1BQcm9wZXJ0eUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IKLQotCQkvLyAyLjEKLQkJLy8gZ2V0IHJlc3VsdHMgZnJvbSBKU1BVc2VCZWFuIGFuZCBKU1BQcm9wZXJ0eSBoZXJlCi0JCS8vIChsb29rIHVwIHByb2Nlc3NvciBpbiBhIG1hcCBiYXNlZCBvbiBub2RlIG5hbWUpCi0JCUpTUER1bW15Q29udGVudEFzc2lzdFByb2Nlc3NvciBleHRyYVByb2Nlc3NvciA9IChKU1BEdW1teUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGZOYW1lVG9Qcm9jZXNzb3JNYXAuZ2V0KG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCWlmIChleHRyYVByb2Nlc3NvciAhPSBudWxsICYmIGNvbnRlbnRBc3Npc3RSZXF1ZXN0ICE9IG51bGwpIHsKLQkJCWV4dHJhUHJvY2Vzc29yLmFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJfQotCi0JCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCUNNRG9jdW1lbnQgZG9jID0gbXEuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQobm9kZSk7Ci0JCQkvLyB0aGlzIHNob3VsZG4ndCBoYXZlIHRvIGhhdmUgdGhlIHByZWZpeCBjb2RlZCBpbgotCQkJaWYgKGRvYyBpbnN0YW5jZW9mIEpTUENNRG9jdW1lbnQgfHwgZG9jIGluc3RhbmNlb2YgQ01Ob2RlV3JhcHBlciB8fCBub2RlLmdldE5vZGVOYW1lKCkuc3RhcnRzV2l0aCgianNwOiIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gRmluZCB0aGUgYXR0cmlidXRlIG5hbWUgZm9yIHdoaWNoIHRoaXMgcG9zaXRpb24gc2hvdWxkIGhhdmUgYSB2YWx1ZQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9wZW4gPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCBvcGVuUmVnaW9ucyA9IG9wZW4uZ2V0UmVnaW9ucygpOwotCQlpbnQgaSA9IG9wZW5SZWdpb25zLmluZGV4T2YoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkpOwotCQlpZiAoaSA8IDApCi0JCQlyZXR1cm47Ci0JCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBudWxsOwotCQl3aGlsZSAoaSA+PSAwKSB7Ci0JCQluYW1lUmVnaW9uID0gb3BlblJlZ2lvbnMuZ2V0KGktLSk7Ci0JCQlpZiAobmFtZVJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBudWxsOwotCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsKQotCQkJYXR0cmlidXRlTmFtZSA9IG9wZW4uZ2V0VGV4dChuYW1lUmVnaW9uKTsKLQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IG51bGw7Ci0JCWlmIChhdHRyaWJ1dGVOYW1lICE9IG51bGwpCi0JCQljdXJyZW50VmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oYXR0cmlidXRlTmFtZSkuZ2V0Tm9kZVZhbHVlKCk7Ci0KLQkJLy8gb24gYW4gZW1wdHkgdmFsdWUsIGFkZCBhbGwgdGhlIEpTUCBhbmQgdGFnbGliIHRhZ3MKLQkJaWYgKChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMgJiYgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSA9PSAwKSB8fCAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUgJiYgKGN1cnJlbnRWYWx1ZSA9PSBudWxsIHx8IGN1cnJlbnRWYWx1ZS5sZW5ndGgoKSA9PSAwKSkpIHsKLQkJCUxpc3QgcmVqZWN0RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBUTEVUKTsKLQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5FWFBSRVNTSU9OKTsKLQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERUNMQVJBVElPTik7Ci0JCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX0lOQ0xVREUpOwotCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9QQUdFKTsKLQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVEFHTElCKTsKLQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5GQUxMQkFDSyk7Ci0JCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuVVNFQkVBTik7Ci0JCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0VUUFJPUEVSVFkpOwotCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUldBUkQpOwotCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBMVUdJTik7Ci0JCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRkFMTEJBQ0spOwotCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNUyk7Ci0KLQkJCUxpc3QgYWRkaXRpb25hbEVsZW1lbnRzID0gZ2V0QWRkaXRpb25hbENoaWxkcmVuKG5ldyBBcnJheUxpc3QoKSwgbm9kZSwgLTEpOwotCQkJZm9yIChpID0gMDsgaSA8IGFkZGl0aW9uYWxFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBhZGRpdGlvbmFsRWxlbWVudHMuZ2V0KGkpOwotCQkJCWlmIChyZWplY3RFbGVtZW50cy5jb250YWlucyhlZC5nZXROb2RlTmFtZSgpKSkKLQkJCQkJY29udGludWU7Ci0JCQkJU3RyaW5nIHRhZ25hbWUgPSBnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2V0UmVxdWlyZWROYW1lKG5vZGUsIGVkKTsKLQkJCQlTdHJpbmdCdWZmZXIgY29udGVudHMgPSBuZXcgU3RyaW5nQnVmZmVyKCJcIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJZ2V0Q29udGVudEdlbmVyYXRvcigpLmdlbmVyYXRlVGFnKG5vZGUsIGVkLCBjb250ZW50cyk7Ci0JCQkJY29udGVudHMuYXBwZW5kKCciJyk7Ci0JCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChjb250ZW50cy50b1N0cmluZygpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgY29udGVudHMubGVuZ3RoKCksIEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpLCB0YWduYW1lLCBudWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9KU1BfQVRUUklCVVRFX1ZBTFVFKTsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQl9Ci0JCX0KLQotCQllbHNlIGlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJdHJ5IHsKLQkJCQkvLyBDcmVhdGUgYSBuZXcgbW9kZWwgZm9yIENvbnRlbnQgQXNzaXN0IHRvIG9wZXJhdGUgb24uIFRoaXMKLQkJCQkvLyB3aWxsIHNpbXVsYXRlCi0JCQkJLy8gYSBmdWxsIERvY3VtZW50IGFuZCB0aGVuIGFkanVzdCB0aGUgb2Zmc2V0IG51bWJlcnMgaW4gdGhlCi0JCQkJLy8gbGlzdCBvZiByZXN1bHRzLgotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgaW50ZXJuYWxNb2RlbCA9IG51bGw7Ci0JCQkJSU1vZGVsTWFuYWdlciBtbWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCQkJaW50ZXJuYWxNb2RlbCA9IG1tYW5hZ2VyLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJCQlJRE9NTm9kZSB4bWxOb2RlID0gbnVsbDsKLQkJCQlJRE9NTW9kZWwgeG1sT3V0ZXJNb2RlbCA9IG51bGw7Ci0JCQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJCXhtbE5vZGUgPSAoSURPTU5vZGUpIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKTsKLQkJCQkJeG1sT3V0ZXJNb2RlbCA9IHhtbE5vZGUuZ2V0TW9kZWwoKTsKLQkJCQkJaW50ZXJuYWxNb2RlbC5zZXRSZXNvbHZlcih4bWxPdXRlck1vZGVsLmdldFJlc29sdmVyKCkpOwotCQkJCQlpbnRlcm5hbE1vZGVsLnNldEJhc2VMb2NhdGlvbih4bWxPdXRlck1vZGVsLmdldEJhc2VMb2NhdGlvbigpKTsKLQkJCQl9Ci0JCQkJU3RyaW5nIGNvbnRlbnRzID0gU3RyaW5nVXRpbHMuc3RyaXAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0VGV4dCgpKTsKLQkJCQlpZiAoeG1sTm9kZSAhPSBudWxsICYmIGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCQkJaW50IGFkZGl0aW9uYWxTaGlmdHMgPSAwOwotCQkJCQkvLyBCZSBzdXJlIHRoYXQgY3VzdG9tIHRhZ3MgZnJvbSB0YWdsaWJzIGFsc28gc2hvdyB1cAotCQkJCQkvLyBieQotCQkJCQkvLyBhZGRpbmcgdGFnbGliIGRlY2xhcmF0aW9ucyB0byB0aGUgaW50ZXJuYWwgbW9kZWwuCi0JCQkJCVRMRENNRG9jdW1lbnRNYW5hZ2VyIG1nciA9IFRhZ2xpYkNvbnRyb2xsZXIuZ2V0VExEQ01Eb2N1bWVudE1hbmFnZXIoeG1sT3V0ZXJNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQkJCWlmIChtZ3IgIT0gbnVsbCkgewotCQkJCQkJTGlzdCB0cmFja2VycyA9IG1nci5nZXRDTURvY3VtZW50VHJhY2tlcnMoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkpOwotCQkJCQkJaWYgKHRyYWNrZXJzICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgdHJhY2tlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQkJQ01Eb2N1bWVudFRyYWNrZXIgdHJhY2tlciA9IChDTURvY3VtZW50VHJhY2tlcikgdHJhY2tlcnMuZ2V0KGkpOwotCQkJCQkJCQlTdHJpbmcgZGVjbGFyYXRpb24gPSB0cmFja2VyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoKTsKLQkJCQkJCQkJaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCQkJCQkJCWNvbnRlbnRzID0gZGVjbGFyYXRpb24gKyBjb250ZW50czsKLQkJCQkJCQkJCWFkZGl0aW9uYWxTaGlmdHMgKz0gZGVjbGFyYXRpb24ubGVuZ3RoKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gQWxzbyBjb3B5IGFueSBqc3A6dXNlQmVhbiB0YWdzIHNvIHRoYXQKLQkJCQkJLy8ganNwOltnc11ldFByb3BlcnR5IHdpbGwgZnVuY3Rpb24KLQkJCQkJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJCQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkKLQkJCQkJCWRvYyA9IChEb2N1bWVudCkgbm9kZTsKLQkJCQkJZWxzZQotCQkJCQkJZG9jID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJCU5vZGVMaXN0IHVzZUJlYW5zID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVTRUJFQU4pOwotCQkJCQlmb3IgKGludCBrID0gMDsgayA8IHVzZUJlYW5zLmdldExlbmd0aCgpOyBrKyspIHsKLQkJCQkJCUlET01Ob2RlIHVzZUJlYW4gPSAoSURPTU5vZGUpIHVzZUJlYW5zLml0ZW0oayk7Ci0JCQkJCQlpZiAodXNlQmVhbi5nZXRTdGFydE9mZnNldCgpIDwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkpIHsKLQkJCQkJCQlTdHJpbmdCdWZmZXIgdXNlQmVhblRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCI8anNwOnVzZUJlYW4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdXNlQmVhbi5nZXRBdHRyaWJ1dGVzKCkuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJCQlBdHRyIGF0dHIgPSAoQXR0cikgdXNlQmVhbi5nZXRBdHRyaWJ1dGVzKCkuaXRlbShqKTsKLQkJCQkJCQkJdXNlQmVhblRleHQuYXBwZW5kKCcgJyk7Ci0JCQkJCQkJCXVzZUJlYW5UZXh0LmFwcGVuZChhdHRyLmdldE5hbWUoKSk7Ci0JCQkJCQkJCXVzZUJlYW5UZXh0LmFwcGVuZCgiPVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJdXNlQmVhblRleHQuYXBwZW5kKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQkJCQkJCXVzZUJlYW5UZXh0LmFwcGVuZCgnIicpOwotCQkJCQkJCX0KLQkJCQkJCQl1c2VCZWFuVGV4dC5hcHBlbmQoIi8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlhZGRpdGlvbmFsU2hpZnRzICs9IHVzZUJlYW5UZXh0Lmxlbmd0aCgpOwotCQkJCQkJCWNvbnRlbnRzID0gdXNlQmVhblRleHQudG9TdHJpbmcoKSArIGNvbnRlbnRzOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWludGVybmFsTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuc2V0KGNvbnRlbnRzKTsKLQkJCQkJaW50IGludGVybmFsT2Zmc2V0ID0gMDsKLQkJCQkJYm9vbGVhbiBxdW90ZWQgPSBmYWxzZTsKLQkJCQkJLy8gaWYgcXVvdGVkLCB1c2UgcG9zaXRpb24gaW5zaWRlIGFuZCBzaGlmdCBieSBvbmUKLQkJCQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkgPiAwICYmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmNoYXJBdCgwKSA9PSAnXCcnIHx8IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkuY2hhckF0KDApID09ICciJykpIHsKLQkJCQkJCWludGVybmFsT2Zmc2V0ID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSAtIDEgKyBhZGRpdGlvbmFsU2hpZnRzOwotCQkJCQkJcXVvdGVkID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQkvLyBpZiB1bnF1b3RlZCwgdXNlIHBvc2l0aW9uIGluc2lkZQotCQkJCQllbHNlIGlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpID4gMCAmJiBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmNoYXJBdCgwKSA9PSAnPCcpCi0JCQkJCQlpbnRlcm5hbE9mZnNldCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkgKyBhZGRpdGlvbmFsU2hpZnRzOwotCQkJCQllbHNlCi0JCQkJCQlpbnRlcm5hbE9mZnNldCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpIC0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0U3RhcnRPZmZzZXQoKSArIGFkZGl0aW9uYWxTaGlmdHM7Ci0JCQkJCWRlcHRoQ291bnQrKzsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBpbnRlcm5hbE5vZGUgPSBudWxsOwotCQkJCQlpbnQgdG1wT2Zmc2V0ID0gaW50ZXJuYWxPZmZzZXQ7Ci0JCQkJCXdoaWxlIChpbnRlcm5hbE5vZGUgPT0gbnVsbCAmJiB0bXBPZmZzZXQgPj0gMCkKLQkJCQkJCWludGVybmFsTm9kZSA9IGludGVybmFsTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbih0bXBPZmZzZXQtLSk7Ci0KLQkJCQkJaWYgKGludGVybmFsTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkgIT0gbnVsbCkgewotCQkJCQkJLy8gc2V0IHVwIHRoZSBpbnRlcm5hbCBtb2RlbAotCQkJCQkJaWYgKGludGVybmFsTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeUZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcykgPT0gbnVsbCkgewotCQkJCQkJCWludGVybmFsTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuYWRkRmFjdG9yeShuZXcgUGFnZURpcmVjdGl2ZUFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCQkJfQotCQkJCQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXIgb3V0ZXJFbWJlZGRlZFR5cGVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVyKSB4bWxPdXRlck1vZGVsLmdldERvY3VtZW50KCkuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCQkJCQlQYWdlRGlyZWN0aXZlQWRhcHRlciBpbnRlcm5hbEVtYmVkZGVkVHlwZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgKChOb2RlKSBpbnRlcm5hbE5vZGUpLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCQkJCQlpbnRlcm5hbEVtYmVkZGVkVHlwZUFkYXB0ZXIuc2V0RW1iZWRkZWRUeXBlKG91dGVyRW1iZWRkZWRUeXBlQWRhcHRlci5nZXRFbWJlZGRlZFR5cGUoKSk7Ci0JCQkJCX0KLQotCQkJCQlBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5IGFkYXB0ZXJSZWdpc3RyeSA9IEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCQkJCUl0ZXJhdG9yIGFkYXB0ZXJMaXN0ID0gYWRhcHRlclJlZ2lzdHJ5LmdldEFkYXB0ZXJGYWN0b3JpZXMoKTsKLQkJCQkJLy8gQW5kIGFsbCB0aG9zZSBhcHByb3ByaWF0ZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIHR5cGUKLQkJCQkJLy8gb2YgY29udGVudAotCQkJCQl3aGlsZSAoYWRhcHRlckxpc3QuaGFzTmV4dCgpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgcHJvdmlkZXIgPSAoQWRhcHRlckZhY3RvcnlQcm92aWRlcikgYWRhcHRlckxpc3QubmV4dCgpOwotCQkJCQkJCWlmIChwcm92aWRlci5pc0ZvcihpbnRlcm5hbE1vZGVsLmdldE1vZGVsSGFuZGxlcigpKSkgewotCQkJCQkJCQlwcm92aWRlci5hZGRBZGFwdGVyRmFjdG9yaWVzKGludGVybmFsTW9kZWwpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvKioKLQkJCQkJICogdGhlIGludGVybmFsIGFkYXB0ZXIgZG9lcyBhbGwgdGhlIHJlYWwgd29yayBvZiB1c2luZwotCQkJCQkgKiB0aGUgSlNQIGNvbnRlbnQgbW9kZWwgdG8gZm9ybSBwcm9wb3NhbHMKLQkJCQkJICovCi0JCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSByZXN1bHRzID0gbnVsbDsKLQkJCQkJZGVwdGhDb3VudC0tOwotCQkJCQlpZiAocmVzdWx0cyAhPSBudWxsKSB7Ci0JCQkJCQlmb3IgKGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoKChDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwpIHJlc3VsdHNbaV0pLmdldFJlcGxhY2VtZW50U3RyaW5nKCksICgoQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKSByZXN1bHRzW2ldKS5nZXRSZXBsYWNlbWVudE9mZnNldCgpIC0gYWRkaXRpb25hbFNoaWZ0cyArIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFN0YXJ0T2Zmc2V0KCkgKyAocXVvdGVkID8gMSA6IDApLCAoKEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCkgcmVzdWx0c1tpXSkuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgKChDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwpIHJlc3VsdHNbaV0pLmdldEN1cnNvclBvc2l0aW9uKCksIHJlc3VsdHNbaV0uZ2V0SW1hZ2UoKSwgcmVzdWx0c1tpXS5nZXREaXNwbGF5U3RyaW5nKCksICgoQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKSByZXN1bHRzW2ldKS5nZXRDb250ZXh0SW5mb3JtYXRpb24oKSwgKChDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwpIHJlc3VsdHNbaV0pLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSwgKHJlc3VsdHNbaV0gaW5zdGFuY2VvZiBJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsKSA/ICgoSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCkgcmVzdWx0c1tpXSkuZ2V0UmVsZXZhbmNlKCkgOiBJUmVsZXZhbmNlQ29uc3RhbnRzLlJfTk9ORSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXJyb3IgaW4gZW1iZWRkZWQgSlNQIENvbnRlbnQgQXNzaXN0IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0QWRkaXRpb25hbENoaWxkcmVuKExpc3QgZWxlbWVudERlY2xzLCBOb2RlIG5vZGUsIGludCBjaGlsZEluZGV4KSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCS8qCi0JCQkgKiBmaW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgaW50ZW5kZWQgaW5zZXJ0aW9uIGFzIGl0IHdpbGwgZ2l2ZSB1cwotCQkJICogdGhlIGNvcnJlY3Qgb2Zmc2V0IGZvciBjaGVja2luZyBwb3NpdGlvbiBkZXBlbmRlbnQgQ01Eb2N1bWVudHMKLQkJCSAqLwotCQkJaW50IHRleHRJbnNlcnRpb25PZmZzZXQgPSAwOwotCQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCWlmIChjaGlsZHJlbi5nZXRMZW5ndGgoKSA+PSBjaGlsZEluZGV4ICYmIGNoaWxkSW5kZXggPj0gMCkgewotCQkJCU5vZGUgbm9kZUFscmVhZHlBdEluZGV4ID0gY2hpbGRyZW4uaXRlbShjaGlsZEluZGV4KTsKLQkJCQlpZiAobm9kZUFscmVhZHlBdEluZGV4IGluc3RhbmNlb2YgSURPTU5vZGUpCi0JCQkJCXRleHRJbnNlcnRpb25PZmZzZXQgPSAoKElET01Ob2RlKSBub2RlQWxyZWFkeUF0SW5kZXgpLmdldEVuZE9mZnNldCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGV4dEluc2VydGlvbk9mZnNldCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQl9Ci0JCQlUTERDTURvY3VtZW50TWFuYWdlciBtZ3IgPSBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKCgoSURPTU5vZGUpIG5vZGUpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCWlmIChtZ3IgIT0gbnVsbCkgewotCQkJCUxpc3QgbW9yZUNNRG9jdW1lbnRzID0gbWdyLmdldENNRG9jdW1lbnRUcmFja2Vycyh0ZXh0SW5zZXJ0aW9uT2Zmc2V0KTsKLQkJCQlpZiAobW9yZUNNRG9jdW1lbnRzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb3JlQ01Eb2N1bWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCUNNRG9jdW1lbnQgZG9jID0gKENNRG9jdW1lbnQpIG1vcmVDTURvY3VtZW50cy5nZXQoaSk7Ci0JCQkJCQlDTU5hbWVkTm9kZU1hcCBlbGVtZW50cyA9IGRvYy5nZXRFbGVtZW50cygpOwotCQkJCQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGVsZW1lbnRzLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRzLml0ZW0oaik7Ci0JCQkJCQkJCWVsZW1lbnREZWNscy5hZGQoZWQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gZ2V0IHBvc2l0aW9uIGRlcGVuZGVudCBDTURvY3VtZW50cyBhbmQgaW5zZXJ0IHRoZWlyIHRhZ3MgYXMKLQkJCS8vIHByb3Bvc2FscwotCi0JCQlNb2RlbFF1ZXJ5QWRhcHRlciBtcUFkYXB0ZXIgPSBudWxsOwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQkJbXFBZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKSAoKElET01Ob2RlKSBub2RlKS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJCWVsc2UKLQkJCQltcUFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpICgoSURPTU5vZGUpIG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQotCQkJaWYgKG1xQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJQ01Eb2N1bWVudCBkb2MgPSBtcUFkYXB0ZXIuZ2V0TW9kZWxRdWVyeSgpLmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KG5vZGUpOwotCQkJCWlmIChkb2MgIT0gbnVsbCkgewotCQkJCQlDTURvY3VtZW50IGpjbWRvYyA9IGdldERlZmF1bHRKU1BDTURvY3VtZW50KChJRE9NTm9kZSkgbm9kZSk7Ci0JCQkJCUNNTmFtZWROb2RlTWFwIGpzcGVsZW1lbnRzID0gamNtZG9jLmdldEVsZW1lbnRzKCk7Ci0KLQkJCQkJLyoKLQkJCQkJICogRm9yIGEgYnVpbHQtaW4gSlNQIGFjdGlvbiB0aGUgY29udGVudCBtb2RlbCBpcyBwcm9wZXJseQotCQkJCQkgKiBzZXQgdXAsIHNvIGRvbid0IGp1c3QgYmxpbmRseSBhZGQgdGhlIHJlc3QtLXVubGVzcyB0aGlzCi0JCQkJCSAqIHdpbGwgYmUgYSBkaXJlY3QgY2hpbGQgb2YgdGhlIGRvY3VtZW50Ci0JCQkJCSAqLwotCQkJCQlpZiAoanNwZWxlbWVudHMgIT0gbnVsbCAmJiAoIShkb2MgaW5zdGFuY2VvZiBKU1BDTURvY3VtZW50KSB8fCBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSkgewotCQkJCQkJTGlzdCByZWplY3RFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCQkJLy8gZGV0ZXJtaW5lIGlmIHRoZSBkb2N1bWVudCBpcyBpbiBYTUwgZm9ybQotCQkJCQkJRG9jdW1lbnQgZG9tRG9jID0gbnVsbDsKLQkJCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKQotCQkJCQkJCWRvbURvYyA9IChEb2N1bWVudCkgbm9kZTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlkb21Eb2MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQotCQkJCQkJLy8gU2hvdyBYTUwgdGFnIGZvcm1zIG9mIEpTUCBtYXJrZXJzIGlmIGpzcDpyb290IGlzCi0JCQkJCQkvLyB0aGUgZG9jdW1lbnQgZWxlbWVudCBPUiBpdCdzIEhUTUwgYnV0Ci0JCQkJCQkvLyBpc24ndCByZWFsbHkgaW4gdGhlIHRleHQuCi0JCQkJCQkvLyBJZiB0aGUgZG9jdW1lbnQgaXNuJ3Qgc3RyaWN0bHkgWE1MLCBwdWxsIG91dCB0aGUKLQkJCQkJCS8vIFhNTCB0YWcgZm9ybXMgaXQgaXMgeG1sIGZvcm1hdAotCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVExFVCk7Ci0JCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRVhQUkVTU0lPTik7Ci0JCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuREVDTEFSQVRJT04pOwotCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9JTkNMVURFKTsKLQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfUEFHRSk7Ci0JCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEVYVCk7Ci0JCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQik7Ci0JCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBRyk7Ci0JCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX0FUVFJJQlVURSk7Ci0JCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1ZBUklBQkxFKTsKLQkJCQkJCWlmIChpc1hNTEZvcm1hdChkb21Eb2MpKSB7Ci0JCQkJCQkJLy8ganNwIGFjdGlvbnMKLQkJCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRkFMTEJBQ0spOwotCQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOKTsKLQkJCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuR0VUUFJPUEVSVFkpOwotCQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5TRVRQUk9QRVJUWSk7Ci0JCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLklOQ0xVREUpOwotCQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JXQVJEKTsKLQkJCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUExVR0lOKTsKLQkJCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRkFMTEJBQ0spOwotCQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5QQVJBTSk7Ci0JCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNUyk7Ci0JCQkJCQl9Ci0KLQotCQkJCQkJLy8gZG9uJ3Qgc2hvdyBqc3A6cm9vdCBpZiBhIGRvY3VtZW50IGVsZW1lbnQgYWxyZWFkeQotCQkJCQkJLy8gZXhpc3RzCi0JCQkJCQlFbGVtZW50IGRvY0VsZW1lbnQgPSBkb21Eb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQkJCQlpZiAoZG9jRWxlbWVudCAhPSBudWxsICYmICgoZG9jRWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFscygianNwOnJvb3QiKSkgfHwgKCgoKElET01Ob2RlKSBkb2NFbGVtZW50KS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwgfHwgKChJRE9NTm9kZSkgZG9jRWxlbWVudCkuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkpKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ST09UKTsKLQotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBqc3BlbGVtZW50cy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGpzcGVsZW1lbnRzLml0ZW0oaik7Ci0JCQkJCQkJaWYgKHJlamVjdEVsZW1lbnRzLmNvbnRhaW5zKGVkLmdldE5vZGVOYW1lKCkpKQotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQllbGVtZW50RGVjbHMuYWRkKGVkKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIE5vIGNtIGRvY3VtZW50IChzdWNoIGFzIGZvciB0aGUgRG9jdW1lbnQgKGEgbm9uLUVsZW1lbnQpIG5vZGUgaXRzZWxmKQotCQkJCWVsc2UgewotCQkJCQlDTU5hbWVkTm9kZU1hcCBqc3BFbGVtZW50cyA9IGdldERlZmF1bHRKU1BDTURvY3VtZW50KChJRE9NTm9kZSkgbm9kZSkuZ2V0RWxlbWVudHMoKTsKLQkJCQkJaW50IGxlbmd0aCA9IGpzcEVsZW1lbnRzLmdldExlbmd0aCgpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCQllbGVtZW50RGVjbHMuYWRkKGpzcEVsZW1lbnRzLml0ZW0oaSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50RGVjbHM7Ci0JfQotCi0JLyoqCi0JICogRm9yIEpTUCBmaWxlcyBhbmQgc2VnbWVudHMsIHRoaXMgaXMganVzdCB0aGUgSlNQCi0JICogICAgICAgICBkb2N1bWVudCwgYnV0IHdoZW4gZWRpdGluZyB0YWcgZmlsZXMgYW5kIHRoZWlyIGZyYWdtZW50cywgaXQKLQkgKiAgICAgICAgIHNob3VsZCBiZSB0aGUgdGFnIGRvY3VtZW50LgotCSAqIAotCSAqIEl0IG1heSBhbHNvIHZhcnkgYmFzZWQgb24gdGhlIG1vZGVsIGJlaW5nIGVkaXRlZCBpbiB0aGUgZnV0dXJlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgbm9uLWVtYmVkZGVkIENNRG9jdW1lbnQgZm9yIHRoZSBkb2N1bWVudCBiZWluZwotCSAqICAgICAgICAgZWRpdGVkLiAKLQkgKi8KLQlDTURvY3VtZW50IGdldERlZmF1bHRKU1BDTURvY3VtZW50KElET01Ob2RlIG5vZGUpIHsKLQkJLy8gaGFuZGxlIHRhZyBmaWxlcyBoZXJlCi0JCVN0cmluZyBjb250ZW50VHlwZSA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKTsKLQkJaWYgKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BUQUcuZXF1YWxzKGNvbnRlbnRUeXBlKSkKLQkJCXJldHVybiBKU1BDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KENNRG9jVHlwZS5UQUcyMF9ET0NfVFlQRSk7Ci0KLQkJQ01Eb2N1bWVudCBqY21kb2MgPSBudWxsOwotCQlTdHJpbmcgbW9kZWxQYXRoID0gbm9kZS5nZXRNb2RlbCgpLmdldEJhc2VMb2NhdGlvbigpOwotCQlpZiAobW9kZWxQYXRoICE9IG51bGwgJiYgIUlNb2RlbE1hbmFnZXIuVU5NQU5BR0VEX01PREVMLmVxdWFscyhtb2RlbFBhdGgpKSB7Ci0JCQlmbG9hdCB2ZXJzaW9uID0gRGVwbG95bWVudERlc2NyaXB0b3JQcm9wZXJ0eUNhY2hlLmdldEluc3RhbmNlKCkuZ2V0SlNQVmVyc2lvbihuZXcgUGF0aChtb2RlbFBhdGgpKTsKLQkJCWpjbWRvYyA9IEpTUENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQodmVyc2lvbik7Ci0JCX0KLQkJaWYgKGpjbWRvYyA9PSBudWxsKSB7Ci0JCQlqY21kb2MgPSBKU1BDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KCk7Ci0JCX0KLQotCQlyZXR1cm4gamNtZG9jOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEF2YWlsYWJsZUNoaWxkcmVuQXRJbmRleChFbGVtZW50IHBhcmVudCwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZykgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgYWRkaXRpb25hbEVsZW1lbnRzID0gZ2V0QWRkaXRpb25hbENoaWxkcmVuKG5ldyBBcnJheUxpc3QoKSwgcGFyZW50LCBpbmRleCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkaXRpb25hbEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2RlbFF1ZXJ5QWN0aW9uIGluc2VydEFjdGlvbiA9IG5ldyBOb25WYWxpZGF0aW5nTW9kZWxRdWVyeUFjdGlvbigoQ01FbGVtZW50RGVjbGFyYXRpb24pIGFkZGl0aW9uYWxFbGVtZW50cy5nZXQoaSksIE1vZGVsUXVlcnlBY3Rpb24uSU5TRVJULCAwLCBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpLCBudWxsKTsKLQkJCWxpc3QuYWRkKGluc2VydEFjdGlvbik7Ci0JCX0KLQotCQkvLyBhZGQgYWxsb3dlZCBjaGlsZHJlbiBvZiBpbXBsaWNpdCB0YWdzIHRoYXQgZG9uJ3QgYWxyZWFkeSBleGlzdAotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCUxpc3QgY2hpbGROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQljaGlsZE5hbWVzLmFkZChjaGlsZC5nZXROb2RlTmFtZSgpLnRvTG93ZXJDYXNlKCkpOwotCQkJfQotCQl9Ci0JCUxpc3QgYWxsQWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkocGFyZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1vZGVsUXVlcnlBY3Rpb24gYWN0aW9uID0gKE1vZGVsUXVlcnlBY3Rpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWFsbEFjdGlvbnMuYWRkKGFjdGlvbik7Ci0JCQlpZiAoYWN0aW9uLmdldENNTm9kZSgpIGluc3RhbmNlb2YgSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCUhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgYWN0aW9uLmdldENNTm9kZSgpOwotCQkJCVN0cmluZyBvbW1pc3Npb24gPSAoU3RyaW5nKSBlZC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSk7Ci0JCQkJaWYgKCFjaGlsZE5hbWVzLmNvbnRhaW5zKGVkLmdldE5vZGVOYW1lKCkudG9Mb3dlckNhc2UoKSkgJiYgKChvbW1pc3Npb24gIT0gbnVsbCkgJiYgKG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9CT1RIKSkpKSB7Ci0JCQkJCUxpc3QgaW1wbGljaXRWYWxpZEFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCW1vZGVsUXVlcnkuZ2V0SW5zZXJ0QWN0aW9ucyhwYXJlbnQsIGVkLCAwLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQ0hJTERfTk9ERVMsIE1vZGVsUXVlcnkuVkFMSURJVFlfTk9ORSwgaW1wbGljaXRWYWxpZEFjdGlvbnMpOwotCQkJCQlpZiAoaW1wbGljaXRWYWxpZEFjdGlvbnMgIT0gbnVsbCkgewotCQkJCQkJSXRlcmF0b3IgaW1wbGljaXRWYWxpZEFjdGlvbnNJdGVyYXRvciA9IGltcGxpY2l0VmFsaWRBY3Rpb25zLml0ZXJhdG9yKCk7Ci0JCQkJCQl3aGlsZSAoaW1wbGljaXRWYWxpZEFjdGlvbnNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCQlNb2RlbFF1ZXJ5QWN0aW9uIGluc2VydEFjdGlvbiA9IG5ldyBOb25WYWxpZGF0aW5nTW9kZWxRdWVyeUFjdGlvbigoKE1vZGVsUXVlcnlBY3Rpb24pIGltcGxpY2l0VmFsaWRBY3Rpb25zSXRlcmF0b3IubmV4dCgpKS5nZXRDTU5vZGUoKSwgTW9kZWxRdWVyeUFjdGlvbi5JTlNFUlQsIDAsIHBhcmVudC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCksIG51bGwpOwotCQkJCQkJCWFsbEFjdGlvbnMuYWRkKGluc2VydEFjdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFsbEFjdGlvbnM7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0QXZhaWxhYmxlUm9vdENoaWxkcmVuKERvY3VtZW50IGRvY3VtZW50LCBpbnQgY2hpbGRJbmRleCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghaXNYTUxGb3JtYXQoZG9jdW1lbnQpKQotCQkJZ2V0QWRkaXRpb25hbENoaWxkcmVuKGxpc3QsIGRvY3VtZW50LCBjaGlsZEluZGV4KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0JCWlmIChkZXB0aENvdW50ID09IDApCi0JCQlmRXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGFjdGluZyBhcyBhICJjYXRjaCBhbGwiIGZvciBwdWxsaW5nIHRvZ2V0aGVyIGNvbnRlbnQKLQkgKiBhc3Npc3QgcHJvcG9zYWxzIGZyb20gZGlmZmVyZW50IFByb2Nlc3NvcnMgd2hlbiBkb2N1bWVudCBwYXJ0aXRpb25pbmcKLQkgKiBhbG9uZSBjb3VsZG4ndCBkZXRlcm1pbmUgZGVmaW5pdGl2ZWx5IHdoYXQgY29udGVudCBhc3Npc3Qgc2hvdWxkIHNob3cKLQkgKiB1cCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCWZUZW1wbGF0ZUNvbnRleHRzLmNsZWFyKCk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJZlZpZXdlciA9IHZpZXdlcjsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGpzcFJlc3VsdHMgPSBFTVBUWV9QUk9QT1NBTF9TRVQ7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBlbWJlZGRlZFJlc3VsdHMgPSBFTVBUWV9QUk9QT1NBTF9TRVQ7Ci0KLQkJLy8gY2hlY2sgdGhlIGFjdHVhbCBwYXJ0aXRpb24gdHlwZQotCQlTdHJpbmcgcGFydGl0aW9uVHlwZSA9IGdldFBhcnRpdGlvblR5cGUoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZuID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pOwotCi0JCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJLy8gQU5PVEhFUiBXT1JLQVJPVU5EIFVOVElMIFBBUlRJVElPTklORyBUQUtFUyBDQVJFIE9GIFRISVMKLQkJLy8gY2hlY2sgZm9yIHhtbC1qc3AgdGFncy4uLgotCQlpZiAocGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFICYmIGZuICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcG9zc2libGVYTUxKU1AgPSAoKGZuLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSAmJiBmbi5nZXRQcmV2aW91cygpICE9IG51bGwpID8gZm4uZ2V0UHJldmlvdXMoKSA6IGZuOwotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBwb3NzaWJsZVhNTEpTUC5nZXRSZWdpb25zKCk7Ci0JCQlpZiAocmVnaW9ucy5zaXplKCkgPiAxKSB7Ci0JCQkJLy8gY2hlY2sgYm91bmRzIGNhc2VzCi0JCQkJSVRleHRSZWdpb24geG1sT3Blbk9yQ2xvc2UgPSByZWdpb25zLmdldCgwKTsKLQkJCQlpZiAoeG1sT3Blbk9yQ2xvc2UuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOICYmIGRvY3VtZW50UG9zaXRpb24gPT0gcG9zc2libGVYTUxKU1AuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCQkvLyBkbyByZWd1bGFyIGpzcCBjb250ZW50IGFzc2lzdAotCQkJCX0KLQkJCQllbHNlIGlmICh4bWxPcGVuT3JDbG9zZS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOICYmIGRvY3VtZW50UG9zaXRpb24gPiBwb3NzaWJsZVhNTEpTUC5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCS8vIGRvIHJlZ3VsYXIganNwIGNvbnRlbnQgYXNzaXN0Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBwb3NzaWJsZSB4bWwtanNwCi0JCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSByZWdpb25zLmdldCgxKTsKLQkJCQkJU3RyaW5nIG5hbWUgPSBwb3NzaWJsZVhNTEpTUC5nZXRUZXh0KG5hbWVSZWdpb24pOwotCQkJCQlpZiAobmFtZS5lcXVhbHMoImpzcDpzY3JpcHRsZXQiKSB8fCBuYW1lLmVxdWFscygianNwOmV4cHJlc3Npb24iKSB8fCBuYW1lLmVxdWFscygianNwOmRlY2xhcmF0aW9uIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCXJldHVybiBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkvLyAqKiBUSElTIElTIEEgVEVNUCBGSVggVU5USUwgUEFSVElUSU9OSU5HIFRBS0VTIENBUkUgT0YgVEhJUy4uLgotCQkvLyBjaGVjayBmb3IgWE1MLUpTUCBpbiBhIDxzY3JpcHQ+IHJlZ2lvbgotCQlpZiAocGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBUIHx8IHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVCkgewotCQkJLy8gZm4gc2hvdWxkIGJlIGJsb2NrIHRleHQKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGVjb2RlZFNEUmVnaW9uID0gZGVjb2RlU2NyaXB0QmxvY2soZm4uZ2V0RnVsbFRleHQoKSk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImRlY29kZWQgPiAiICsKLQkJCS8vIGJsb2NrT2ZUZXh0LnN1YnN0cmluZyhkZWNvZGVkU0RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwKLQkJCS8vIGRlY29kZWRTRFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSkpOwotCQkJaWYgKGRlY29kZWRTRFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZHIgPSBkZWNvZGVkU0RSZWdpb247Ci0JCQkJd2hpbGUgKHNkciAhPSBudWxsKSB7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2RyICIgKyBzZHIuZ2V0VHlwZSgpKTsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzZHIgPiAiICsKLQkJCQkJLy8gYmxvY2tPZlRleHQuc3Vic3RyaW5nKHNkci5nZXRTdGFydE9mZnNldCgpLAotCQkJCQkvLyBzZHIuZ2V0RW5kT2Zmc2V0KCkpKTsKLQkJCQkJaWYgKHNkci5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpIHsKLQkJCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID49IGZuLmdldFN0YXJ0T2Zmc2V0KCkgKyBzZHIuZ2V0U3RhcnRPZmZzZXQoKSAmJiBkb2N1bWVudFBvc2l0aW9uIDw9IGZuLmdldFN0YXJ0T2Zmc2V0KCkgKyBzZHIuZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCQkJCQlyZXR1cm4gZ2V0SlNQSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChzZHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+IGZuLmdldFN0YXJ0T2Zmc2V0KCkgKyBzZHIuZ2V0U3RhcnRPZmZzZXQoKSAmJiBkb2N1bWVudFBvc2l0aW9uIDwgZm4uZ2V0U3RhcnRPZmZzZXQoKSArIHNkci5nZXRFbmRPZmZzZXQoKSkgewotCQkJCQkJCXJldHVybiBFTVBUWV9QUk9QT1NBTF9TRVQ7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChkb2N1bWVudFBvc2l0aW9uID09IGZuLmdldFN0YXJ0T2Zmc2V0KCkgKyBzZHIuZ2V0RW5kT2Zmc2V0KCkgJiYgc2RyLmdldE5leHQoKSAhPSBudWxsICYmIHNkci5nZXROZXh0KCkuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSB7Ci0JCQkJCQkJLy8gdGhlIGVuZCBvZiBhbiBvcGVuIHRhZyA8c2NyaXB0PgotCQkJCQkJCS8vIDxqc3A6c2NyaXB0bGV0PnwgYmxhaCA8L2pzcDpzY3JpcHRsZXQ+Ci0JCQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChkb2N1bWVudFBvc2l0aW9uID09IGZuLmdldFN0YXJ0T2Zmc2V0KCkgKyBzZHIuZ2V0U3RhcnRPZmZzZXQoKSAmJiBzZHIuZ2V0UHJldmlvdXMoKSAhPSBudWxsICYmIHNkci5nZXRQcmV2aW91cygpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCQkJCXJldHVybiBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXNkciA9IHNkci5nZXROZXh0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJLy8gY2hlY2sgc3BlY2lhbCBKU1AgZGVsaW1pdGVyIGNhc2VzCi0JCWlmIChmbiAhPSBudWxsICYmIHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfREVMSU1JVEVSKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZuRGVsaW0gPSBmbjsKLQotCQkJLy8gaWYgaXQncyBhIG5lc3RlZCBKU1AgcmVnaW9uLCBuZWVkIHRvIGdldCB0aGUgY29ycmVjdAotCQkJLy8gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkvLyBub3Qgc3VyZSB3aHkgdGhpcyBjaGVjayB3YXMgdGhlcmUuLi4KLQkJCS8vIGlmIChmbkRlbGltLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCUl0ZXJhdG9yIGJsb2NrUmVnaW9ucyA9IGZuRGVsaW0uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQlJVGV4dFJlZ2lvbiB0ZW1wID0gbnVsbDsKLQkJCUlUZXh0UmVnaW9uQ29udGFpbmVyIHRyYzsKLQkJCXdoaWxlIChibG9ja1JlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQkJdGVtcCA9IChJVGV4dFJlZ2lvbikgYmxvY2tSZWdpb25zLm5leHQoKTsKLQkJCQkvLyB3ZSBoaXQgYSBuZXN0ZWQKLQkJCQlpZiAodGVtcCBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCXRyYyA9IChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgdGVtcDsKLQkJCQkJLy8gaXQncyBpbiB0aGlzIHJlZ2lvbgotCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+PSB0cmMuZ2V0U3RhcnRPZmZzZXQoKSAmJiBkb2N1bWVudFBvc2l0aW9uIDwgdHJjLmdldEVuZE9mZnNldCgpKSB7Ci0JCQkJCQlJdGVyYXRvciBuZXN0ZWRKU1BSZWdpb25zID0gdHJjLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJCQkJd2hpbGUgKG5lc3RlZEpTUFJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJdGVtcCA9IChJVGV4dFJlZ2lvbikgbmVzdGVkSlNQUmVnaW9ucy5uZXh0KCk7Ci0JCQkJCQkJaWYgKFhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXMuaXNKU1BPcGVuRGVsaW1pdGVyKHRlbXAuZ2V0VHlwZSgpKSAmJiBkb2N1bWVudFBvc2l0aW9uID09IHRyYy5nZXRTdGFydE9mZnNldCh0ZW1wKSkgewotCQkJCQkJCQkvLyBIVE1MIGNvbnRlbnQgYXNzaXN0Ci0JCQkJCQkJCS8vIHdlIGFjdHVhbGx5IHdhbnQgY29udGVudCBhc3Npc3QgZm9yIHRoZQotCQkJCQkJCQkvLyBwcmV2aW91cyB0eXBlIG9mIHJlZ2lvbiwKLQkJCQkJCQkJLy8gd2VsbCBnZXQgdGhvc2UgcHJvcG9zYWxzIGZyb20gdGhlIGVtYmVkZGVkCi0JCQkJCQkJCS8vIGFkYXB0ZXIKLQkJCQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPiAwKSB7Ci0JCQkJCQkJCQlwYXJ0aXRpb25UeXBlID0gZ2V0UGFydGl0aW9uVHlwZSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbiAtIDEpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAoWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5pc0pTUENsb3NlRGVsaW1pdGVyKHRlbXAuZ2V0VHlwZSgpKSAmJiBkb2N1bWVudFBvc2l0aW9uID09IHRyYy5nZXRTdGFydE9mZnNldCh0ZW1wKSkgewotCQkJCQkJCQkvLyBKU1AgY29udGVudCBhc3Npc3QKLQkJCQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIH0KLQkJCX0KLQotCQkJLy8gdGFrZSBjYXJlIG9mIFhNTC1KU1AgZGVsaW10ZXIgY2FzZXMKLQkJCWlmIChYTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmlzWE1MSlNQRGVsaW1pdGVyKGZuRGVsaW0pKSB7Ci0JCQkJLy8gc2luY2UgaXQncyBhIGRlbGltaXRlciwgd2Uga25vdyBpdCdzIGEgSVRleHRSZWdpb25Db250YWluZXIKLQkJCQlJVGV4dFJlZ2lvbiBmaXJzdFJlZ2lvbiA9IGZuRGVsaW0uZ2V0UmVnaW9ucygpLmdldCgwKTsKLQkJCQlpZiAoZm5EZWxpbS5nZXRTdGFydE9mZnNldCgpID09IGRvY3VtZW50UG9zaXRpb24gJiYgKGZpcnN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikpIHsKLQkJCQkJLy8gfDxqc3A6c2NyaXB0bGV0PiA8L2pzcDpzY3JpcHRsZXQ+Ci0JCQkJCS8vIChwYSkgY29tbWVudGVkIG91dCBzbyB0aGF0IHdlIGdldCByZWd1bGFyIGJlaGF2aW9yIEpTUAotCQkJCQkvLyBtYWNyb3MgZXRjLi4uCi0JCQkJCS8vIHJldHVybiBnZXRIVE1MQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsCi0JCQkJCS8vIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCX0KLQkJCQllbHNlIGlmIChmbkRlbGltLmdldFN0YXJ0T2Zmc2V0KCkgPT0gZG9jdW1lbnRQb3NpdGlvbiAmJiAoZmlyc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikpIHsKLQkJCQkJLy8gPGpzcDpzY3JpcHRsZXQ+IHw8L2pzcDpzY3JpcHRsZXQ+Ci0JCQkJCS8vIGNoZWNrIHByZXZpb3VzIHBhcnRpdGlvbiB0eXBlIHRvIHNlZSBpZiBpdCdzIEpBVkFTQ1JJUFQKLQkJCQkJLy8gaWYgaXQgaXMsIHdlJ3JlIGp1c3QgZ29ubmEgbGV0IHRoZSBlbWJlZGRlZCBKQVZBU0NSSVBUCi0JCQkJCS8vIGFkYXB0ZXIgZ2V0IHRoZSBwcm9wb3NhbHMKLQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPiAwKSB7Ci0JCQkJCQlTdHJpbmcgY2hlY2tUeXBlID0gZ2V0UGFydGl0aW9uVHlwZSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbiAtIDEpOwotCQkJCQkJaWYgKGNoZWNrVHlwZSAhPSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBUKSB7IC8vIHRoaXMKLQkJCQkJCQkvLyBjaGVjawotCQkJCQkJCS8vIGlzCi0JCQkJCQkJLy8gZmFpbGluZwotCQkJCQkJCS8vIGZvcgotCQkJCQkJCS8vIFhNTC1KU1AKLQkJCQkJCQkvLyAocmVnaW9uCi0JCQkJCQkJLy8gaXMKLQkJCQkJCQkvLyBub3QKLQkJCQkJCQkvLyBqYXZhc2NyaXB0Li4uKQotCQkJCQkJCXJldHVybiBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQkJfQotCQkJCQkJcGFydGl0aW9uVHlwZSA9IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkFTQ1JJUFQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKGZpcnN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgJiYgZG9jdW1lbnRQb3NpdGlvbiA+PSBmbkRlbGltLmdldEVuZE9mZnNldCgpKSB7Ci0JCQkJCS8vIGFueXRoaW5nIGVsc2UgaW5iZXR3ZWVuCi0JCQkJCXJldHVybiBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKFhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXMuaXNKU1BEZWxpbWl0ZXIoZm5EZWxpbSkpIHsKLQkJCQkvLyB0aGUgZGVsaW1pdGVyIDwlLCA8JT0sIDwlISwgLi4uCi0JCQkJaWYgKFhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXMuaXNKU1BDbG9zZURlbGltaXRlcihmbkRlbGltKSkgewotCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA9PSBmbkRlbGltLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQkJCS8vIGNoZWNrIHByZXZpb3VzIHBhcnRpdGlvbiB0eXBlIHRvIHNlZSBpZiBpdCdzCi0JCQkJCQkvLyBKQVZBU0NSSVBUCi0JCQkJCQkvLyBpZiBpdCBpcywgd2UncmUganVzdCBnb25uYSBsZXQgdGhlIGVtYmVkZGVkCi0JCQkJCQkvLyBKQVZBU0NSSVBUIGFkYXB0ZXIgZ2V0IHRoZSBwcm9wb3NhbHMKLQkJCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID4gMCkgewotCQkJCQkJCVN0cmluZyBjaGVja1R5cGUgPSBnZXRQYXJ0aXRpb25UeXBlKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyLCBkb2N1bWVudFBvc2l0aW9uIC0gMSk7Ci0JCQkJCQkJaWYgKGNoZWNrVHlwZSAhPSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBUKSB7Ci0JCQkJCQkJCXJldHVybiBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQkJCX0KLQkJCQkJCQlwYXJ0aXRpb25UeXBlID0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChYTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmlzSlNQT3BlbkRlbGltaXRlcihmbkRlbGltKSkgewotCQkJCQkvLyBpZiBpdCdzIHRoZSBmaXJzdCBwb3NpdGlvbiBvZiBvcGVuIGRlbGltaXRlcgotCQkJCQkvLyB1c2UgZW1iZWRkZWQgSFRNTCByZXN1bHRzCi0JCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID09IGZuRGVsaW0uZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCQkJZW1iZWRkZWRSZXN1bHRzID0gZ2V0SFRNTENvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChkb2N1bWVudFBvc2l0aW9uID09IGZuRGVsaW0uZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCQkJCS8vIGl0J3MgYXQgdGhlIEVPRiA8JXwKLQkJCQkJCXJldHVybiBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gbmVlZCB0byBjaGVjayBpZiBpdCdzIEpTUCByZWdpb24gaW5zaWRlIG9mIENEQVRBIHcvIG5vIHJlZ2lvbgotCQkvLyA8IVtDREFUQVsgPCV8JT4gXV0+Ci0JCS8vIG9yIGEgY29tbWVudCByZWdpb24KLQkJLy8gPCEtLSA8JSB8JT4gLS0+Ci0JCWlmIChmbiAhPSBudWxsICYmIChmbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCB8fCBmbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUKSkgewotCQkJaWYgKGZuIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQlPYmplY3RbXSBjZGF0YVJlZ2lvbnMgPSBmbi5nZXRSZWdpb25zKCkudG9BcnJheSgpOwotCQkJCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQkJCUlUZXh0UmVnaW9uIGpzcFJlZ2lvbiA9IG51bGw7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjZGF0YVJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJciA9IChJVGV4dFJlZ2lvbikgY2RhdGFSZWdpb25zW2ldOwotCQkJCQlpZiAociBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCQkvLyBDREFUQSBlbWJlZGRlZCBjb250YWluZXIsIG9yIGNvbW1lbnQgY29udGFpbmVyCi0JCQkJCQlPYmplY3RbXSBqc3BSZWdpb25zID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcikuZ2V0UmVnaW9ucygpLnRvQXJyYXkoKTsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwganNwUmVnaW9ucy5sZW5ndGg7IGorKykgewotCQkJCQkJCWpzcFJlZ2lvbiA9IChJVGV4dFJlZ2lvbikganNwUmVnaW9uc1tqXTsKLQkJCQkJCQlpZiAoanNwUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0UpIHsKLQkJCQkJCQkJaWYgKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGpzcFJlZ2lvbikgPT0gZG9jdW1lbnRQb3NpdGlvbikKLQkJCQkJCQkJCXJldHVybiBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgaXQncyBpbiBhbiBhdHRyaWJ1dGUgdmFsdWUsIGlmIHNvLCBkb24ndCBhZGQgQ0RBVEEKLQkJLy8gcHJvcG9zYWwKLQkJSVRleHRSZWdpb24gYXR0ckNvbnRhaW5lciA9IChmbiAhPSBudWxsKSA/IGZuLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pIDogbnVsbDsKLQkJaWYgKGF0dHJDb250YWluZXIgIT0gbnVsbCAmJiBhdHRyQ29udGFpbmVyIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCWlmIChhdHRyQ29udGFpbmVyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJLy8gdGVzdCBsb2NhdGlvbiBvZiB0aGUgY3Vyc29yCi0JCQkJLy8gcmV0dXJuIG51bGwgaWYgaXQncyBpbiB0aGUgbWlkZGxlIG9mIGFuIG9wZW4vY2xvc2UKLQkJCQkvLyBkZWxpbWV0ZXIKLQkJCQlJdGVyYXRvciBhdHRyUmVnaW9ucyA9ICgoSVRleHRSZWdpb25Db250YWluZXIpIGF0dHJDb250YWluZXIpLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJCUlUZXh0UmVnaW9uIHRlc3RSZWdpb24gPSBudWxsOwotCQkJCXdoaWxlIChhdHRyUmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCQkJdGVzdFJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgYXR0clJlZ2lvbnMubmV4dCgpOwotCQkJCQkvLyBuZWVkIHRvIGNoZWNrIGZvciBvdGhlciB2YWxpZCBhdHRyaWJ1dGUgcmVnaW9ucwotCQkJCQlpZiAoWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5pc0pTUE9wZW5EZWxpbWl0ZXIodGVzdFJlZ2lvbi5nZXRUeXBlKCkpKSB7Ci0JCQkJCQlpZiAoISgoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBhdHRyQ29udGFpbmVyKS5nZXRFbmRPZmZzZXQodGVzdFJlZ2lvbikgPD0gZG9jdW1lbnRQb3NpdGlvbikpCi0JCQkJCQkJcmV0dXJuIEVNUFRZX1BST1BPU0FMX1NFVDsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChYTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmlzSlNQQ2xvc2VEZWxpbWl0ZXIodGVzdFJlZ2lvbi5nZXRUeXBlKCkpKSB7Ci0JCQkJCQlpZiAoISgoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBhdHRyQ29udGFpbmVyKS5nZXRTdGFydE9mZnNldCh0ZXN0UmVnaW9uKSA+PSBkb2N1bWVudFBvc2l0aW9uKSkKLQkJCQkJCQlyZXR1cm4gRU1QVFlfUFJPUE9TQUxfU0VUOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIFRPRE86IGhhbmRsZSBub24tSmF2YSBjb2RlIHN1Y2ggYXMgbmVzdGVkIHRhZ3MKLQkJCQlpZiAodGVzdFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSkKLQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJcmV0dXJuIEVNUFRZX1BST1BPU0FMX1NFVDsKLQkJCX0KLQkJfQotCi0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSAoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5nZXQocGFydGl0aW9uVHlwZSk7Ci0JCWlmIChwICE9IG51bGwpIHsKLQkJCWVtYmVkZGVkUmVzdWx0cyA9IHAuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCS8vIGdldCBiZWFuIG1ldGhvZHMsIG9iamVjdHMsIGFuZCBjb25zdGFudHMgaWYgdGhlcmUgYXJlIGFueS4uLgotCQkJaWYgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVCB8fCBwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9ucy5TQ1JJUFQpIHsKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gYmVhblJlc3VsdHMgPSBnZXRKU1BKYXZhQmVhblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCWlmIChiZWFuUmVzdWx0cyAhPSBudWxsICYmIGJlYW5SZXN1bHRzLmxlbmd0aCA+IDApIHsKLQkJCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGFkZGVkID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbYmVhblJlc3VsdHMubGVuZ3RoICsgZW1iZWRkZWRSZXN1bHRzLmxlbmd0aF07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoYmVhblJlc3VsdHMsIDAsIGFkZGVkLCAwLCBiZWFuUmVzdWx0cy5sZW5ndGgpOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGVtYmVkZGVkUmVzdWx0cywgMCwgYWRkZWQsIGJlYW5SZXN1bHRzLmxlbmd0aCwgZW1iZWRkZWRSZXN1bHRzLmxlbmd0aCk7Ci0JCQkJCWVtYmVkZGVkUmVzdWx0cyA9IGFkZGVkOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIHRoZSBwYXJ0aXRpb24gdHlwZSBpcyBwcm9iYWJseSBub3QgbWFwcGVkCi0JCX0KLQotCQkvLyBmaXggZm9yOgotCQkvLyBIVE1MIGNvbnRlbnQgYXNzaXN0IGdpdmUgSlNQIHRhZ3MgaW4gYmV0d2VlbiBlbXB0eSBzY3JpcHQgdGFncwotCQlpZiAoISgoZ2V0SlNDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkgIT0gbnVsbCAmJiBnZXRKU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKS5nZXRDbGFzcygpLmlzSW5zdGFuY2UocCkpIHx8IHAgaW5zdGFuY2VvZiBDU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yKSkgewotCQkJZlRlbXBsYXRlQ29udGV4dHMuY2xlYXIoKTsKLQkJCWpzcFJlc3VsdHMgPSBzdXBlci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQl9Ci0JCWlmICh1c2VFbWJlZGRlZFJlc3VsdHMpIHsKLQkJCWlmIChlbWJlZGRlZFJlc3VsdHMgIT0gbnVsbCAmJiBlbWJlZGRlZFJlc3VsdHMubGVuZ3RoID4gMCkgewotCQkJCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVtYmVkZGVkUmVzdWx0cy5sZW5ndGg7IGkrKykKLQkJCQkJcmVzdWx0cy5hZGQoZW1iZWRkZWRSZXN1bHRzW2ldKTsKLQkJCQlpZiAoanNwUmVzdWx0cyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwganNwUmVzdWx0cy5sZW5ndGg7IGkrKykKLQkJCQkJCXJlc3VsdHMuYWRkKGpzcFJlc3VsdHNbaV0pOwotCQkJCX0KLQkJCQlqc3BSZXN1bHRzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcmVzdWx0cy5zaXplKCldOwotCQkJCUNvbGxlY3Rpb25zLnNvcnQocmVzdWx0cywgbmV3IFByb3Bvc2FsQ29tcGFyYXRvcigpKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdHMuc2l6ZSgpOyBpKyspCi0JCQkJCWpzcFJlc3VsdHNbaV0gPSAoSUNvbXBsZXRpb25Qcm9wb3NhbCkgcmVzdWx0cy5nZXQoaSk7Ci0KLQkJCX0KLQkJfQotCQlpZiAoanNwUmVzdWx0cyA9PSBudWxsKQotCQkJanNwUmVzdWx0cyA9IEVNUFRZX1BST1BPU0FMX1NFVDsKLQkJc2V0RXJyb3JNZXNzYWdlKGpzcFJlc3VsdHMubGVuZ3RoID09IDAgPyBVTktOT1dOX0NPTlRFWFQgOiBudWxsKTsKLQotCQkvLyBmaXggZm9yOgotCQkvLyBjaGVjayBmb3IgfDwlLS0gLS0lPiBmaXJzdCBwb3NpdGlvbiBvZiBqc3AgY29tbWVudAotCQlpZiAocGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09NTUVOVCkgewotCQkJaWYgKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgPT0gZG9jdW1lbnRQb3NpdGlvbikgewotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBodG1sUmVzdWx0cyA9IGdldEhUTUxDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJanNwUmVzdWx0cyA9IG1lcmdlKGpzcFJlc3VsdHMsIGh0bWxSZXN1bHRzKTsKLQkJCX0KLQkJfQotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NjY1NgotCQlpZiAocGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFKSB7Ci0JCQlJQ29tcGxldGlvblByb3Bvc2FsW10gaW1wb3J0UHJvcG9zYWxzID0gZ2V0SW1wb3J0UHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQlpZiAoaW1wb3J0UHJvcG9zYWxzLmxlbmd0aCA+IDApCi0JCQkJanNwUmVzdWx0cyA9IG1lcmdlKGpzcFJlc3VsdHMsIGltcG9ydFByb3Bvc2Fscyk7Ci0JCX0KLQkJcmV0dXJuIGpzcFJlc3VsdHM7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0SW1wb3J0UHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJTGlzdCBpbXBvcnRQcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3Bvc2Fscy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHByb3Bvc2Fsc1tpXSBpbnN0YW5jZW9mIEpTUENvbXBsZXRpb25Qcm9wb3NhbCkgewotCi0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBpbXBvcnRQcm9wb3NhbCA9IGFkanVzdEltcG9ydFByb3Bvc2FsKChKU1BDb21wbGV0aW9uUHJvcG9zYWwpIHByb3Bvc2Fsc1tpXSk7Ci0JCQkJaW1wb3J0UHJvcG9zYWxzLmFkZChpbXBvcnRQcm9wb3NhbCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIGltcG9ydFByb3Bvc2Fscy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW2ltcG9ydFByb3Bvc2Fscy5zaXplKCldKTsKLQl9Ci0KLQotCXByaXZhdGUgSUNvbXBsZXRpb25Qcm9wb3NhbCBhZGp1c3RJbXBvcnRQcm9wb3NhbChKU1BDb21wbGV0aW9uUHJvcG9zYWwgaW1wb3J0UHJvcG9zYWwpIHsKLQotCQkvLyBqdXN0IG5lZWQgdG8gcmVtb3ZlIHRoZSAiOyIKLQkJLy8gYW5kIGFkanVzdCBvZmZzZXRzIGZvciB0aGUgY2hhbmdlCi0JCVN0cmluZyBuZXdSZXBsYWNlID0gaW1wb3J0UHJvcG9zYWwuZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKS5yZXBsYWNlQWxsKCI7IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW1wb3J0UHJvcG9zYWwuc2V0UmVwbGFjZW1lbnRTdHJpbmcobmV3UmVwbGFjZSk7Ci0KLQkJU3RyaW5nIG5ld0Rpc3BsYXkgPSBpbXBvcnRQcm9wb3NhbC5nZXREaXNwbGF5U3RyaW5nKCkucmVwbGFjZUFsbCgiOyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWltcG9ydFByb3Bvc2FsLnNldERpc3BsYXlTdHJpbmcobmV3RGlzcGxheSk7Ci0KLQkJaW50IG5ld1JlcGxhY2VtZW50TGVuZ3RoID0gaW1wb3J0UHJvcG9zYWwuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSAtIDE7Ci0JCWltcG9ydFByb3Bvc2FsLnNldFJlcGxhY2VtZW50TGVuZ3RoKG5ld1JlcGxhY2VtZW50TGVuZ3RoKTsKLQotCQlpbnQgbmV3Q3Vyc29yUG9zaXRpb24gPSBpbXBvcnRQcm9wb3NhbC5nZXRDdXJzb3JQb3NpdGlvbigpIC0gMTsKLQkJaW1wb3J0UHJvcG9zYWwuc2V0Q3Vyc29yUG9zaXRpb24obmV3Q3Vyc29yUG9zaXRpb24pOwotCi0JCXJldHVybiBpbXBvcnRQcm9wb3NhbDsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIDIgYXJyYXlzIG9mIElDb21wbGV0aW9uUHJvcG9zYWxzIGFuZCBzb3J0cyB0aGVtIHdpdGggYQotCSAqIFByb3Bvc2FsQ29tcGFyYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0ganNwUmVzdWx0cwotCSAqIEBwYXJhbSBodG1sUmVzdWx0cwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElDb21wbGV0aW9uUHJvcG9zYWxbXSBtZXJnZShJQ29tcGxldGlvblByb3Bvc2FsW10ganNwUmVzdWx0cywgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGh0bWxSZXN1bHRzKSB7Ci0JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBqc3BzID0gQXJyYXlzLmFzTGlzdChqc3BSZXN1bHRzKTsKLQkJTGlzdCBodG1scyA9IEFycmF5cy5hc0xpc3QoaHRtbFJlc3VsdHMpOwotCi0JCXJlc3VsdHMuYWRkQWxsKGpzcHMpOwotCQlyZXN1bHRzLmFkZEFsbChodG1scyk7Ci0KLQkJQ29sbGVjdGlvbnMuc29ydChyZXN1bHRzLCBuZXcgUHJvcG9zYWxDb21wYXJhdG9yKCkpOwotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRKU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCWlmIChmSlNDb250ZW50QXNzaXN0UHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZKU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCgpLmdldENvbnRlbnRBc3Npc3RhbnQobnVsbCkuZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKTsKLQkJfQotCQlyZXR1cm4gZkpTQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIEpTUEphdmEgUHJvcG9zYWxzIHRoYXQgYXJlIHJlbGV2YW50IHRvIGFueSBqYXZhCi0JICogYmVhbnMgdGhhdCBpbiBzY29wZSBhdCB0aGUgZG9jdW1lbnRQb3NpdGlvbgotCSAqIAotCSAqIFRPRE8gKHBhKSBhcmUgdGFnbGliIHZhcnMgZ2V0dGluZyBmaWx0ZXJlZD8KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uIEByZXR1cm4gSUNvbXBsZXRpb25Qcm9wb3NhbFtdCi0JICovCi0JcHJpdmF0ZSBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0SlNQSmF2YUJlYW5Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcmVndWxhckpTUFJlc3VsdHMgPSBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQlWZWN0b3IgZmlsdGVyZWRQcm9wb3NhbHMgPSBuZXcgVmVjdG9yKCk7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBmaW5hbFJlc3VsdHMgPSBFTVBUWV9QUk9QT1NBTF9TRVQ7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVndWxhckpTUFJlc3VsdHMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWwgdGVzdCA9IHJlZ3VsYXJKU1BSZXN1bHRzW2ldOwotCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInByb3Bvc2FsID4gIiArIHRlc3QuZ2V0RGlzcGxheVN0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZWxldmFuY2UgPiAiICsgKChDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwpIHRlc3QpLmdldFJlbGV2YW5jZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoaXNSZWxldmFuY2VBbGxvd2VkKCgoQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKSB0ZXN0KS5nZXRSZWxldmFuY2UoKSkpIHsKLQkJCQlmaWx0ZXJlZFByb3Bvc2Fscy5hZGQodGVzdCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpbHRlcmVkUHJvcG9zYWxzLnNpemUoKSA+IDApIHsKLQkJCWZpbmFsUmVzdWx0cyA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW2ZpbHRlcmVkUHJvcG9zYWxzLnNpemUoKV07Ci0JCQlJdGVyYXRvciBpdCA9IGZpbHRlcmVkUHJvcG9zYWxzLml0ZXJhdG9yKCk7Ci0JCQlpbnQgaiA9IDA7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJZmluYWxSZXN1bHRzW2orK10gPSAoSUNvbXBsZXRpb25Qcm9wb3NhbCkgaXQubmV4dCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaW5hbFJlc3VsdHM7Ci0JfQotCi0JLy8gVGhlc2UgYXJlIHRoZSBvbmx5IHRoaW5ncyBJJ20gYWxsb3dpbmcgZm9yIHVzZSBiZWFuIGlmIHRoZSBsYW5ndWFnZSBpcwotCS8vIEpBVkFTQ1JJUFQKLQkvLyBJJ20gZmlsdGVyaW5nIGJhc2VkIG9uIEphdmFDb250ZW50QXNzaXN0UHJvcG9zYWwgcmVsZXZhbmNlCi0JLy8KLQkvLyA0ODUgPiBtZXRob2QgdGhhdCBiZWxvbmdzIHRvIHRoZSBiZWFuCi0JLy8gNDg2ID4gYmVhbiBvYmplY3QKLQkvLyAzODYgPiBiZWFuIENPTlNUQU5UCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVsZXZhbmNlQWxsb3dlZChpbnQgcmVsZXZhbmNlKSB7Ci0JCXJldHVybiAocmVsZXZhbmNlID09IDQ4NSB8fCByZWxldmFuY2UgPT0gNDg2IHx8IHJlbGV2YW5jZSA9PSAzMjYpOwotCX0KLQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICogQHJldHVybiBJQ29tcGxldGlvblByb3Bvc2FsW10KLQkgKi8KLQlwcml2YXRlIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRIVE1MQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0KLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLmdldChJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUKTsKLQkJcmV0dXJuIHAuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24KLQkgKiBAcmV0dXJuIElDb21wbGV0aW9uUHJvcG9zYWxbXQotCSAqLwotCXByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0SlNQSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlKU1BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3NvciBwID0gKEpTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAuZ2V0KElKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxUKTsKLQkJcmV0dXJuIHAuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShTdHJ1Y3R1cmVkVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCVN0cmluZyBwYXJ0aXRpb25UeXBlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBhcnRpdGlvblR5cGUgPSBUZXh0VXRpbGl0aWVzLmdldENvbnRlbnRUeXBlKHZpZXdlci5nZXREb2N1bWVudCgpLCBJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLCB2aWV3ZXIubW9kZWxPZmZzZXQyV2lkZ2V0T2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pLCBmYWxzZSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXBhcnRpdGlvblR5cGUgPSBJRG9jdW1lbnQuREVGQVVMVF9DT05URU5UX1RZUEU7Ci0JCX0KLQkJcmV0dXJuIHBhcnRpdGlvblR5cGU7Ci0JfQotCi0JLyoKLQkgKiAqKiBURU1QIFdPUktBUk9VTkQgRk9SIENNVkMgMjQxODgyIFRha2VzIGEgU3RyaW5nIGFuZCBibG9ja3Mgb3V0Ci0JICoganNwOnNjcmlwdGxldCwganNwOmV4cHJlc3Npb24sIGFuZCBqc3A6ZGVjbGFyYXRpb24gQHBhcmFtIGJsb2NrVGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGVjb2RlU2NyaXB0QmxvY2soU3RyaW5nIGJsb2NrVGV4dCkgewotCQlYTUxTb3VyY2VQYXJzZXIgcGFyc2VyID0gbmV3IFhNTFNvdXJjZVBhcnNlcigpOwotCQkvLyB1c2UgSlNQX0NPTlRFTlQgZm9yIHJlZ2lvbiB0eXBlCi0JCXBhcnNlci5hZGRCbG9ja01hcmtlcihuZXcgQmxvY2tNYXJrZXIoImpzcDpzY3JpcHRsZXQiLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgZmFsc2UsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKLQkJcGFyc2VyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcigianNwOmV4cHJlc3Npb24iLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgZmFsc2UsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKLQkJcGFyc2VyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcigianNwOmRlY2xhcmF0aW9uIiwgbnVsbCwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIGZhbHNlLCBmYWxzZSkpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlci5yZXNldChibG9ja1RleHQpOwotCQlyZXR1cm4gcGFyc2VyLmdldERvY3VtZW50UmVnaW9ucygpOwotCX0KLQotCS8qCi0JICogQHNlZSBDb250ZW50QXNzaXN0QWRhcHRlciNjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKElUZXh0Vmlld2VyLCBpbnQsCi0JICogICAgICBJbmRleGVkUmVnaW9uKQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uW10gY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCwgSW5kZXhlZFJlZ2lvbiBpbmRleGVkTm9kZSkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbih2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ29udGVudEFzc2lzdEFkYXB0ZXIjZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpOwotCX0KLQotCi0JcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSAoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5nZXQoSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCk7Ci0JCXJldHVybiBwLmdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpOwotCX0KLQotCS8qCi0JICogQHNlZSBDb250ZW50QXNzaXN0QWRhcHRlciNnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzWE1MRm9ybWF0KERvY3VtZW50IGRvYykgewotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUVsZW1lbnQgZG9jRWxlbWVudCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJcmV0dXJuIGRvY0VsZW1lbnQgIT0gbnVsbCAmJiAoKGRvY0VsZW1lbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImpzcDpyb290IikpIHx8ICgoKChJRE9NTm9kZSkgZG9jRWxlbWVudCkuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsICYmICgoSURPTU5vZGUpIGRvY0VsZW1lbnQpLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ29udGVudEFzc2lzdEFkYXB0ZXIjcmVsZWFzZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJc3VwZXIucmVsZWFzZSgpOwotCQkvLyByZWxlYXNlICpDb250ZW50QXNzaXN0UHJvY2Vzc29ycyBpbiBtYXBzCi0JCS8vIENNVkMgMjU0MDIzCi0JCXJlbGVhc2VQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpOwotCQlyZWxlYXNlTmFtZVRvUHJvY2Vzc29yTWFwKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZVBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCkgewotCQlyZWxlYXNlTWFwKGZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZU5hbWVUb1Byb2Nlc3Nvck1hcCgpIHsKLQkJcmVsZWFzZU1hcChmTmFtZVRvUHJvY2Vzc29yTWFwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlTWFwKEhhc2hNYXAgbWFwKSB7Ci0JCWlmIChtYXAgIT0gbnVsbCkgewotCQkJaWYgKCFtYXAuaXNFbXB0eSgpKSB7Ci0JCQkJSXRlcmF0b3IgaXQgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCQlPYmplY3Qga2V5ID0gbnVsbDsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCWtleSA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKG1hcC5nZXQoa2V5KSBpbnN0YW5jZW9mIElSZWxlYXNhYmxlKSB7Ci0JCQkJCQkoKElSZWxlYXNhYmxlKSBtYXAuZ2V0KGtleSkpLnJlbGVhc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCW1hcC5jbGVhcigpOwotCQkJbWFwID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yI2NvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGludCwKLQkgKiAgICAgIFN0cmluZywgSVRleHRSZWdpb24sIElET01Ob2RlLCBJRE9NTm9kZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgdHJlZU5vZGUsIElET01Ob2RlIHhtbG5vZGUpIHsKLQotCQlDb250ZW50QXNzaXN0UmVxdWVzdCByZXF1ZXN0ID0gc3VwZXIuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZlRleHRWaWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCi0JCURvY3VtZW50IGRvYyA9IG51bGw7Ci0JCWlmICh4bWxub2RlICE9IG51bGwpIHsKLQkJCWlmICh4bWxub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKQotCQkJCWRvYyA9IChEb2N1bWVudCkgeG1sbm9kZTsKLQkJCWVsc2UKLQkJCQlkb2MgPSB4bWxub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJfQotCQlTdHJpbmdbXSBkaXJlY3RpdmVOYW1lcyA9IHsicGFnZSIsICJpbmNsdWRlIiwgInRhZ2xpYiJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkvLyBzdWdnZXN0IEpTUCBFeHByZXNzaW9uIGluc2lkZSBvZiBYTUwgY29tbWVudHMKLQkJaWYgKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCAmJiAhaXNYTUxGb3JtYXQoZG9jKSkgewotCQkJaWYgKHJlcXVlc3QgPT0gbnVsbCkKLQkJCQlyZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3QodHJlZU5vZGUsIHhtbG5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcXVlc3QuYWRkUHJvcG9zYWwobmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiPCU9ICAlPiIsIGRvY3VtZW50UG9zaXRpb24sIDAsIDQsIEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpLCAianNwOmV4cHJlc3Npb24iLCBudWxsLCAiJmx0OyU9ICUmZ3Q7IiwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfSlNQKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJfQotCQkvLyBoYW5kbGUgcHJvcG9zYWxzIGluIGFuZCBhcm91bmQgSlNQX0RJUkVDVElWRV9PUEVOIGFuZAotCQkvLyBKU1BfRElSRUNUSVZFX05BTUUKLQkJZWxzZSBpZiAoKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiAmJiBkb2N1bWVudFBvc2l0aW9uID49IHNkUmVnaW9uLmdldFRleHRFbmRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpIHx8IChjb21wbGV0aW9uUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUgJiYgZG9jdW1lbnRQb3NpdGlvbiA8PSBzZFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKSkgewotCQkJaWYgKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTikgewotCQkJCWlmIChyZXF1ZXN0ID09IG51bGwpCi0JCQkJCXJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdCh4bWxub2RlLCB4bWxub2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJCUl0ZXJhdG9yIHJlZ2lvbnMgPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCQlTdHJpbmcgbmFtZVN0cmluZyA9IG51bGw7Ci0JCQkJaW50IGJlZ2luID0gcmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKTsKLQkJCQlpbnQgbGVuZ3RoID0gcmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpOwotCQkJCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCQkJCW5hbWVTdHJpbmcgPSBzZFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJCQliZWdpbiA9IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCQlsZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG5hbWVTdHJpbmcgPT0gbnVsbCkKLQkJCQkJbmFtZVN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3RpdmVOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZGlyZWN0aXZlTmFtZXNbaV0uc3RhcnRzV2l0aChuYW1lU3RyaW5nKSB8fCBkb2N1bWVudFBvc2l0aW9uIDw9IGJlZ2luKQotCQkJCQkJcmVxdWVzdC5hZGRQcm9wb3NhbChuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKGRpcmVjdGl2ZU5hbWVzW2ldLCBiZWdpbiwgbGVuZ3RoLCBkaXJlY3RpdmVOYW1lc1tpXS5sZW5ndGgoKSwgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyksIGRpcmVjdGl2ZU5hbWVzW2ldLCBudWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9KU1ApKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsgLy8gYnkgZGVmYXVsdCwgSlNQX0RJUkVDVElWRV9OQU1FCi0JCQkJaWYgKHJlcXVlc3QgPT0gbnVsbCkKLQkJCQkJcmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KHhtbG5vZGUsIHhtbG5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSwgY29tcGxldGlvblJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIG1hdGNoU3RyaW5nKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdGl2ZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChkaXJlY3RpdmVOYW1lc1tpXS5zdGFydHNXaXRoKG1hdGNoU3RyaW5nKSkKLQkJCQkJCXJlcXVlc3QuYWRkUHJvcG9zYWwobmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChkaXJlY3RpdmVOYW1lc1tpXSwgcmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgcmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBkaXJlY3RpdmVOYW1lc1tpXS5sZW5ndGgoKSwgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyksIGRpcmVjdGl2ZU5hbWVzW2ldLCBudWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9KU1ApKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSAmJiBkb2N1bWVudFBvc2l0aW9uID4gc2RSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkgfHwgKGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0UgJiYgZG9jdW1lbnRQb3NpdGlvbiA8PSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkpIHsKLQkJCWlmIChyZXF1ZXN0ID09IG51bGwpCi0JCQkJcmVxdWVzdCA9IGNvbXB1dGVBdHRyaWJ1dGVQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJCXN1cGVyLmFkZFRhZ0Nsb3NlUHJvcG9zYWxzKHJlcXVlc3QpOwotCQkJLy8gQ01WQyAyNzQwMzMsIHRoaXMgaXMgYmVpbmcgYWRkZWQgZm9yIGFsbCA8anNwOiogdGFncwotCQkJLy8gaW4gYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCkKLQkJCS8vIHN1cGVyLmFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMocmVxdWVzdCk7Ci0JCX0KLQkJLy8gbm8gbmFtZT86IDwlQCAlPgotCQllbHNlIGlmIChjb21wbGV0aW9uUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX0NMT1NFICYmIGRvY3VtZW50UG9zaXRpb24gPD0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpIHsKLQkJCWlmIChyZXF1ZXN0ICE9IG51bGwpCi0JCQkJcmVxdWVzdCA9IGNvbXB1dGVBdHRyaWJ1dGVQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJCUl0ZXJhdG9yIHJlZ2lvbnMgPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCVN0cmluZyBuYW1lU3RyaW5nID0gbnVsbDsKLQkJCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJCW5hbWVTdHJpbmcgPSBzZFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChuYW1lU3RyaW5nID09IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpcmVjdGl2ZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXJlcXVlc3QuYWRkUHJvcG9zYWwobmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChkaXJlY3RpdmVOYW1lc1tpXSwgcmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgcmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBkaXJlY3RpdmVOYW1lc1tpXS5sZW5ndGgoKSwgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyksIGRpcmVjdGl2ZU5hbWVzW2ldLCBudWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9KU1ApKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBidWcxMTU5MjcgdXNlIG9yaWdpbmFsIGRvY3VtZW50IHBvc2l0aW9uIGZvciBhbGwvYW55IHJlZ2lvbgotCQkvLyB0ZW1wbGF0ZXMKLQkJYWRkVGVtcGxhdGVzKHJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuQUxMLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJcmV0dXJuIHJlcXVlc3Q7Ci0JfQotCi0JcHJpdmF0ZSBKU1BUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZlRlbXBsYXRlUHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZUZW1wbGF0ZVByb2Nlc3NvciA9IG5ldyBKU1BUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQkJfQotCQlyZXR1cm4gZlRlbXBsYXRlUHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGVtcGxhdGVzIHRvIHRoZSBsaXN0IG9mIHByb3Bvc2FscwotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50QXNzaXN0UmVxdWVzdAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRlbXBsYXRlcyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgU3RyaW5nIGNvbnRleHQpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjb250ZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0ZW1wbGF0ZXMgdG8gdGhlIGxpc3Qgb2YgcHJvcG9zYWxzCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRBc3Npc3RSZXF1ZXN0Ci0JICogQHBhcmFtIGNvbnRleHQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVGVtcGxhdGVzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0T2Zmc2V0KSB7Ci0JCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGlmIGFscmVhZHkgYWRkaW5nIHRlbXBsYXRlIHByb3Bvc2FscyBmb3IgYSBjZXJ0YWluIGNvbnRleHQgdHlwZSwgZG8KLQkJLy8gbm90IGFkZCBhZ2FpbgotCQlpZiAoIWZUZW1wbGF0ZUNvbnRleHRzLmNvbnRhaW5zKGNvbnRleHQpKSB7Ci0JCQlmVGVtcGxhdGVDb250ZXh0cy5hZGQoY29udGV4dCk7Ci0JCQlib29sZWFuIHVzZVByb3Bvc2FsTGlzdCA9ICFjb250ZW50QXNzaXN0UmVxdWVzdC5zaG91bGRTZXBhcmF0ZSgpOwotCi0JCQlpZiAoZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkgIT0gbnVsbCkgewotCQkJCWdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpLnNldENvbnRleHRUeXBlKGNvbnRleHQpOwotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5jb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhmVGV4dFZpZXdlciwgc3RhcnRPZmZzZXQpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcG9zYWxzLmxlbmd0aDsgKytpKSB7Ci0JCQkJCWlmICh1c2VQcm9wb3NhbExpc3QpCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbHNbaV0pOwotCQkJCQllbHNlCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRNYWNybyhwcm9wb3NhbHNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVudGl0eVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgaW50IGRvY3VtZW50UG9zaXRpb24sIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIHRyZWVOb2RlKSB7Ci0JCS8vIGlnbm9yZQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ0luc2VydGlvblByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgaW50IGNoaWxkUG9zaXRpb24pIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLlRBRyk7Ci0KLQkJc3VwZXIuYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjaGlsZFBvc2l0aW9uKTsKLQkJaWYgKGlzSW50ZXJuYWxBZGFwdGVyKQotCQkJdXNlRW1iZWRkZWRSZXN1bHRzID0gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRHVtbXlDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BEdW1teUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY2NDk3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BEdW1teUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgIm51bGwiIHZlcnNpb24gb2YgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSlNQRHVtbXlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCXN1cGVyLmFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCXN1cGVyLmFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENvbW1lbnRQcm9wb3NhbChDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlzdXBlci5hZGRDb21tZW50UHJvcG9zYWwoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29udGVudChMaXN0IGNvbnRlbnRMaXN0LCBDTUNvbnRlbnQgY29udGVudCkgewotCQlzdXBlci5hZGRDb250ZW50KGNvbnRlbnRMaXN0LCBjb250ZW50KTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERvY1R5cGVQcm9wb3NhbChDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlzdXBlci5hZGREb2NUeXBlUHJvcG9zYWwoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW1wdHlEb2N1bWVudFByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlzdXBlci5hZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVuZFRhZ05hbWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJc3VwZXIuYWRkRW5kVGFnTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbmRUYWdQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJc3VwZXIuYWRkRW5kVGFnUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVudGl0eVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgaW50IGRvY3VtZW50UG9zaXRpb24sIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIHRyZWVOb2RlKSB7Ci0JCXN1cGVyLmFkZEVudGl0eVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgZG9jdW1lbnRQb3NpdGlvbiwgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW50aXR5UHJvcG9zYWxzKFZlY3RvciBwcm9wb3NhbHMsIFByb3BlcnRpZXMgbWFwLCBTdHJpbmcga2V5LCBpbnQgbm9kZU9mZnNldCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24pIHsKLQkJc3VwZXIuYWRkRW50aXR5UHJvcG9zYWxzKHByb3Bvc2FscywgbWFwLCBrZXksIG5vZGVPZmZzZXQsIHBhcmVudCwgY29tcGxldGlvblJlZ2lvbik7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQQ0RBVEFQcm9wb3NhbChTdHJpbmcgbm9kZU5hbWUsIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCXN1cGVyLmFkZFBDREFUQVByb3Bvc2FsKG5vZGVOYW1lLCBjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdGFydERvY3VtZW50UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCXN1cGVyLmFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFnQ2xvc2VQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJc3VwZXIuYWRkVGFnQ2xvc2VQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgY2hpbGRQb3NpdGlvbikgewotCQlzdXBlci5hZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNoaWxkUG9zaXRpb24pOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFnTmFtZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgaW50IGNoaWxkUG9zaXRpb24pIHsKLQkJc3VwZXIuYWRkVGFnTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgY2hpbGRQb3NpdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXR0cmlidXRlSW5MaXN0KElET01Ob2RlIG5vZGUsIE5vZGUgcGFyZW50LCBDTU5vZGUgY21ub2RlKSB7Ci0JCXJldHVybiBzdXBlci5hdHRyaWJ1dGVJbkxpc3Qobm9kZSwgcGFyZW50LCBjbW5vZGUpOwotCX0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYmVnaW5zV2l0aChTdHJpbmcgYVN0cmluZywgU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gc3VwZXIuYmVnaW5zV2l0aChhU3RyaW5nLCBwcmVmaXgpOwotCX0KLQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVBdHRyaWJ1dGVQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlQXR0cmlidXRlUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCBub2RlQXRPZmZzZXQsIG5vZGUpOwotCX0KLQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVBdHRyaWJ1dGVWYWx1ZVByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgbm9kZUF0T2Zmc2V0LCBub2RlKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSB0cmVlTm9kZSwgSURPTU5vZGUgeG1sbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQl9Ci0KLQotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRPZmZzZXQpOwotCX0KLQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVDb250ZW50UHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUNvbnRlbnRQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIG5vZGVBdE9mZnNldCwgbm9kZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKHZpZXdlciwgZG9jdW1lbnRPZmZzZXQpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlRW5kVGFnT3BlblByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVFbmRUYWdPcGVuUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCBub2RlQXRPZmZzZXQsIG5vZGUpOwotCX0KLQotCi0JcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlRW50aXR5UmVmZXJlbmNlUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSB0cmVlTm9kZSkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUVudGl0eVJlZmVyZW5jZVByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVFcXVhbHNQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlRXF1YWxzUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCBub2RlQXRPZmZzZXQsIG5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlU3RhcnREb2N1bWVudFByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVTdGFydERvY3VtZW50UHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCBub2RlQXRPZmZzZXQsIG5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlVGFnQ2xvc2VQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlVGFnQ2xvc2VQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIG5vZGVBdE9mZnNldCwgbm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVUYWdOYW1lUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZVRhZ05hbWVQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIG5vZGVBdE9mZnNldCwgbm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVUYWdPcGVuUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZVRhZ09wZW5Qcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIG5vZGVBdE9mZnNldCwgbm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBZGRpdGlvbmFsSW5mbyhDTU5vZGUgcGFyZW50T3JPd25lciwgQ01Ob2RlIGNtbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWRkaXRpb25hbEluZm8ocGFyZW50T3JPd25lciwgY21ub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRBdmFpbGFibGVDaGlsZHJlbkF0SW5kZXgoRWxlbWVudCBwYXJlbnQsIGludCBpbmRleCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEF2YWlsYWJsZUNoaWxkcmVuQXRJbmRleChwYXJlbnQsIGluZGV4LCB2YWxpZGl0eUNoZWNraW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRBdmFpbGFibGVSb290Q2hpbGRyZW4oRG9jdW1lbnQgZG9jdW1lbnQsIGludCBjaGlsZEluZGV4KSB7Ci0JCXJldHVybiBzdXBlci5nZXRBdmFpbGFibGVSb290Q2hpbGRyZW4oZG9jdW1lbnQsIGNoaWxkSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENNRWxlbWVudERlY2xhcmF0aW9uKG5vZGUpOwotCX0KLQotCXB1YmxpYyBjaGFyW10gZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElUZXh0UmVnaW9uIGdldENvbXBsZXRpb25SZWdpb24oaW50IG9mZnNldCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q29tcGxldGlvblJlZ2lvbihvZmZzZXQsIGZsYXROb2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0Q29tcGxldGlvblJlZ2lvbihpbnQgZG9jdW1lbnRQb3NpdGlvbiwgTm9kZSBkb21ub2RlKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDb21wbGV0aW9uUmVnaW9uKGRvY3VtZW50UG9zaXRpb24sIGRvbW5vZGUpOwotCX0KLQotCXB1YmxpYyBYTUxDb250ZW50TW9kZWxHZW5lcmF0b3IgZ2V0Q29udGVudEdlbmVyYXRvcigpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRHZW5lcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgY2hhcltdIGdldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpOwotCX0KLQotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0RWxlbWVudFBvc2l0aW9uKE5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRQb3NpdGlvbihjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0RXJyb3JNZXNzYWdlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEVycm9yTWVzc2FnZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWF0Y2hTdHJpbmcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIElUZXh0UmVnaW9uIGFSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE1hdGNoU3RyaW5nKHBhcmVudCwgYVJlZ2lvbiwgb2Zmc2V0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0TmFtZVJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXJldHVybiBzdXBlci5nZXROYW1lUmVnaW9uKGZsYXROb2RlKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBMaXN0IGdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMoTm9kZSBub2RlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKSB7Ci0JCXJldHVybiBzdXBlci5nZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKG5vZGUsIGFkKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVxdWlyZWROYW1lKE5vZGUgcGFyZW50T3JPd25lciwgQ01Ob2RlIGNtbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVxdWlyZWROYW1lKHBhcmVudE9yT3duZXIsIGNtbm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXF1aXJlZFRleHQoTm9kZSBwYXJlbnRPck93bmVyLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXF1aXJlZFRleHQocGFyZW50T3JPd25lciwgYXR0ckRlY2wpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVxdWlyZWRUZXh0KE5vZGUgcGFyZW50T3JPd25lciwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlcXVpcmVkVGV4dChwYXJlbnRPck93bmVyLCBlbGVtZW50RGVjbCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0VmFsaWRDaGlsZEVsZW1lbnREZWNsYXJhdGlvbnMoRWxlbWVudCBwYXJlbnQsIGludCBjaGlsZFBvc2l0aW9uLCBpbnQga2luZE9mQWN0aW9uKSB7Ci0JCXJldHVybiBzdXBlci5nZXRWYWxpZENoaWxkRWxlbWVudERlY2xhcmF0aW9ucyhwYXJlbnQsIGNoaWxkUG9zaXRpb24sIGtpbmRPZkFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQ2xvc2VSZWdpb24oSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXJldHVybiBzdXBlci5pc0Nsb3NlUmVnaW9uKHJlZ2lvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOYW1lUmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlyZXR1cm4gc3VwZXIuaXNOYW1lUmVnaW9uKHJlZ2lvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNRdW90ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdXBlci5pc1F1b3RlKHN0cmluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnRpZXMgbWFwVG9Qcm9wZXJ0aWVzKENNTmFtZWROb2RlTWFwIG1hcCkgewotCQlyZXR1cm4gc3VwZXIubWFwVG9Qcm9wZXJ0aWVzKG1hcCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKLQkJc3VwZXIuc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBlcnJvck1lc3NhZ2UsIFN0cmluZyBhcHBlbmQpIHsKLQkJc3VwZXIuc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSwgYXBwZW5kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yTWVzc2FnZSwgU3RyaW5nIHByZXBlbmQsIFN0cmluZyBhcHBlbmQpIHsKLQkJc3VwZXIuc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSwgcHJlcGVuZCwgYXBwZW5kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdHJpbmdzRXF1YWwoU3RyaW5nIGEsIFN0cmluZyBiKSB7Ci0JCXJldHVybiBzdXBlci5zdHJpbmdzRXF1YWwoYSwgYik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BFTENvbXBsZXRpb25Qcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEVMQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWY0Yjc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEVMQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSlNQRUxDb21wbGV0aW9uUHJvY2Vzc29yIGV4dGVuZHMgSlNQQ29tcGxldGlvblByb2Nlc3NvciB7Ci0JcHJvdGVjdGVkIEpTUFByb3Bvc2FsQ29sbGVjdG9yIGdldFByb3Bvc2FsQ29sbGVjdG9yKElDb21waWxhdGlvblVuaXQgY3UsIEpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgSlNQRUxQcm9wb3NhbENvbGxlY3RvcihjdSwgdHJhbnNsYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEVMQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRUxDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNWNlMDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRUxDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuQ01Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuVExEQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuVGFnbGliVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERGdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5BU1RFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsLkFTVEZ1bmN0aW9uSW52b2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5GaW5kRnVuY3Rpb25JbnZvY2F0aW9uVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5KU1BFTFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5KU1BFTFBhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5KU1BFTFBhcnNlclRva2VuTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5TaW1wbGVDaGFyU3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsLlRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEpTUEVMQ29udGVudEFzc2lzdFByb2Nlc3NvciBleHRlbmRzIEpTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQlwcm90ZWN0ZWQgY2hhciBlbENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyc1tdID0gbmV3IGNoYXJbXXsnLicsICc6J307Ci0KLQlwcm90ZWN0ZWQgSlNQQ29tcGxldGlvblByb2Nlc3NvciBnZXRKc3BDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IgPSBuZXcgSlNQRUxDb21wbGV0aW9uUHJvY2Vzc29yKCk7Ci0JCX0KLQkJcmV0dXJuIGZKc3BDb21wbGV0aW9uUHJvY2Vzc29yOwotCX0KLQotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCi0KLQkJLy8gZ2V0IHJlc3VsdHMgZnJvbSBKU1AgY29tcGxldGlvbiBwcm9jZXNzb3IKLQkJZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IgPSBnZXRKc3BDb21wbGV0aW9uUHJvY2Vzc29yKCk7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSByZXN1bHRzID0gZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJZkVycm9yTWVzc2FnZSA9IGZKc3BDb21wbGV0aW9uUHJvY2Vzc29yLmdldEVycm9yTWVzc2FnZSgpOwotCQlpZiAocmVzdWx0cy5sZW5ndGggPT0gMCAmJiAoZkVycm9yTWVzc2FnZSA9PSBudWxsIHx8IGZFcnJvck1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCWZFcnJvck1lc3NhZ2UgPSBVTktOT1dOX0NPTlRFWFQ7Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXQgPSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQotCQlpZiAoZmxhdCAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJzb3JSZWdpb24gPSBmbGF0LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pOwotCQkJaWYgKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUgPT0gY3Vyc29yUmVnaW9uLmdldFR5cGUoKSkgewotCQkJCUlUZXh0UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgY3Vyc29yUmVnaW9uOwotCQkJCWN1cnNvclJlZ2lvbiA9IGNvbnRhaW5lci5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQlpZiAoY3Vyc29yUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfQ09OVEVOVCkgewotCQkJCQlTdHJpbmcgZWxUZXh0ID0gY29udGFpbmVyLmdldFRleHQoY3Vyc29yUmVnaW9uKS50cmltKCk7Ci0JCQkJCVN0cmluZyBwcmVmaXggPSBnZXRQcmVmaXgoZG9jdW1lbnRQb3NpdGlvbiAtIGNvbnRhaW5lci5nZXRTdGFydE9mZnNldChjdXJzb3JSZWdpb24pIC0gMSwgZWxUZXh0KTsKLQkJCQkJaWYgKG51bGwgIT0gcHJlZml4KSB7Ci0JCQkJCQlMaXN0IHByb3Bvc2FscyA9IGdldEZ1bmN0aW9uUHJvcG9zYWxzKHByZWZpeCwgKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQkJcmVzdWx0cyA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3Byb3Bvc2Fscy5zaXplKCldOwotCQkJCQkJcHJvcG9zYWxzLnRvQXJyYXkocmVzdWx0cyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCi0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZml4KGludCByZWxhdGl2ZVBvc2l0aW9uLCBTdHJpbmcgZWxUZXh0KSB7Ci0JCWphdmEuaW8uU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcihlbFRleHQpOwotCQlKU1BFTFBhcnNlclRva2VuTWFuYWdlciBzY2FubmVyID0gbmV3IEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyKG5ldyBTaW1wbGVDaGFyU3RyZWFtKHJlYWRlciwgMSwgMSkpOwotCQlUb2tlbiBjdXJUb2tlbiA9IG51bGwsIGxhc3RJZGVudGlmaWVyID0gbnVsbDsKLQkJd2hpbGUgKEpTUEVMUGFyc2VyQ29uc3RhbnRzLkVPRiAhPSAoY3VyVG9rZW4gPSBzY2FubmVyLmdldE5leHRUb2tlbigpKS5raW5kKSB7Ci0JCQlpZiAoSlNQRUxQYXJzZXJDb25zdGFudHMuQ09MT04gPT0gY3VyVG9rZW4ua2luZCAmJiBjdXJUb2tlbi5lbmRDb2x1bW4gPT0gcmVsYXRpdmVQb3NpdGlvbiAmJiBudWxsICE9IGxhc3RJZGVudGlmaWVyKSB7Ci0JCQkJcmV0dXJuIChsYXN0SWRlbnRpZmllci5pbWFnZSk7Ci0JCQl9Ci0KLQkJCWlmIChKU1BFTFBhcnNlckNvbnN0YW50cy5JREVOVElGSUVSID09IGN1clRva2VuLmtpbmQpIHsKLQkJCQlsYXN0SWRlbnRpZmllciA9IGN1clRva2VuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbGFzdElkZW50aWZpZXIgPSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBBU1RGdW5jdGlvbkludm9jYXRpb24gZ2V0SW52b2NhdGlvbihpbnQgcmVsYXRpdmVQb3NpdGlvbiwgU3RyaW5nIGVsVGV4dCkgewotCQlGaW5kRnVuY3Rpb25JbnZvY2F0aW9uVmlzaXRvciB2aXNpdG9yID0gbmV3IEZpbmRGdW5jdGlvbkludm9jYXRpb25WaXNpdG9yKHJlbGF0aXZlUG9zaXRpb24pOwotCQlKU1BFTFBhcnNlciBwYXJzZXIgPSBKU1BFTFBhcnNlci5jcmVhdGVQYXJzZXIoZWxUZXh0KTsKLQkJdHJ5IHsKLQkJCUFTVEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBhcnNlci5FeHByZXNzaW9uKCk7Ci0JCQlyZXR1cm4gKEFTVEZ1bmN0aW9uSW52b2NhdGlvbikgZXhwcmVzc2lvbi5qanRBY2NlcHQodmlzaXRvciwgbnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsgLyogcGFyc2UgZXhjZXB0aW9uID0gbm8gY29tcGxldGlvbiAqLwotCQl9Ci0JCXJldHVybiAobnVsbCk7Ci0JfQotCi0KLQlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIGVsQ29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEZ1bmN0aW9uUHJvcG9zYWxzKFN0cmluZyBwcmVmaXgsIFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlUTERDTURvY3VtZW50TWFuYWdlciBkb2NNZ3IgPSBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKHZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJQXJyYXlMaXN0IGNvbXBsZXRpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZG9jTWdyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJdGVyYXRvciB0YWdsaWJzID0gZG9jTWdyLmdldENNRG9jdW1lbnRUcmFja2VycyhvZmZzZXQpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlICh0YWdsaWJzLmhhc05leHQoKSkgewotCQkJVGFnbGliVHJhY2tlciB0cmFja2VyID0gKFRhZ2xpYlRyYWNrZXIpIHRhZ2xpYnMubmV4dCgpOwotCQkJaWYgKHRyYWNrZXIuZ2V0UHJlZml4KCkuZXF1YWxzKHByZWZpeCkpIHsKLQkJCQlDTURvY3VtZW50SW1wbCBkb2MgPSAoQ01Eb2N1bWVudEltcGwpIHRyYWNrZXIuZ2V0RG9jdW1lbnQoKTsKLQotCQkJCUxpc3QgZnVuY3Rpb25zID0gZG9jLmdldEZ1bmN0aW9ucygpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBmdW5jdGlvbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlUTERGdW5jdGlvbiBmdW5jdGlvbiA9IChUTERGdW5jdGlvbikgaXQubmV4dCgpOwotCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKGZ1bmN0aW9uLmdldE5hbWUoKSArICIoKSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJb2Zmc2V0LCAwLCBmdW5jdGlvbi5nZXROYW1lKCkubGVuZ3RoKCkgKyAxLCBudWxsLCBmdW5jdGlvbi5nZXROYW1lKCkgKyAiIC0gIiArIGZ1bmN0aW9uLmdldFNpZ25hdHVyZSgpLCBudWxsLCBudWxsLCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCWNvbXBsZXRpb25MaXN0LmFkZChwcm9wb3NhbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb21wbGV0aW9uTGlzdDsKLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BFTFByb3Bvc2FsQ29sbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BFTFByb3Bvc2FsQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYTNlYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRUxQcm9wb3NhbENvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgSlNQRUxQcm9wb3NhbENvbGxlY3RvciBleHRlbmRzIEpTUFByb3Bvc2FsQ29sbGVjdG9yIHsKLQotCXB1YmxpYyBKU1BFTFByb3Bvc2FsQ29sbGVjdG9yKElDb21waWxhdGlvblVuaXQgY3UsIEpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uKSB7Ci0JCXN1cGVyKGN1LCB0cmFuc2xhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIElKYXZhQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZUphdmFDb21wbGV0aW9uUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsKSB7Ci0JCUpTUENvbXBsZXRpb25Qcm9wb3NhbCBqc3BQcm9wb3NhbCA9IG51bGw7Ci0JCQotCQlpZihudWxsID09IHByb3Bvc2FsIHx8IG51bGwgPT0gcHJvcG9zYWwuZ2V0TmFtZSgpKQotCQkJcmV0dXJuKG51bGwpOwotCQkKLQkJU3RyaW5nIHJhd05hbWUgPSBuZXcgU3RyaW5nKHByb3Bvc2FsLmdldE5hbWUoKSk7Ci0JCVN0cmluZyBjb21wbGV0aW9uID0gbnVsbDsKLQkJCi0JCWlmKHByb3Bvc2FsLmdldEtpbmQoKSA9PSBDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRiAmJiBwcm9wb3NhbC5maW5kUGFyYW1ldGVyTmFtZXMobnVsbCkubGVuZ3RoID09IDApIHsKLQkJCWlmKHJhd05hbWUubGVuZ3RoKCkgPiAzICYmIHJhd05hbWUuc3RhcnRzV2l0aCgiZ2V0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWNvbXBsZXRpb24gPSByYXdOYW1lLnN1YnN0cmluZygzLDQpLnRvTG93ZXJDYXNlKCkgKyByYXdOYW1lLnN1YnN0cmluZyg0LCByYXdOYW1lLmxlbmd0aCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCS8vIGphdmEgb2Zmc2V0Ci0JCQlpbnQgb2Zmc2V0ID0gcHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCkgKyAxOwotCQkJCi0JCQkvLyByZXBsYWNlbWVudCBsZW5ndGgKLQkJCWludCBsZW5ndGggPSBwcm9wb3NhbC5nZXRSZXBsYWNlRW5kKCkgLSBvZmZzZXQgKyAxOwotCQkJCi0JCQkvLyB0cmFuc2xhdGUgb2Zmc2V0IGZyb20gSmF2YSA+IEpTUAotCQkJb2Zmc2V0ID0gZ2V0VHJhbnNsYXRpb24oKS5nZXRKc3BPZmZzZXQob2Zmc2V0KTsKLQkJCQotCQkJLy8gY3Vyc29yIHBvc2l0aW9uIGFmdGVyIG11c3QgYmUgY2FsY3VsYXRlZAotCQkJaW50IHBvc2l0aW9uQWZ0ZXIgPSBvZmZzZXQgKyBjb21wbGV0aW9uLmxlbmd0aCgpOwotCQkJCQotCQkJLy8gZnJvbSBqYXZhIHByb3Bvc2FsCi0JCQlJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCBqYXZhUHJvcG9zYWwgPSBzdXBlci5jcmVhdGVKYXZhQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCUltYWdlIGltYWdlID0gbnVsbDsKLQkJCVN0cmluZyBsb25nRGlzcGxheVN0cmluZyA9IGphdmFQcm9wb3NhbC5nZXREaXNwbGF5U3RyaW5nKCk7Ci0JCQlpbnQgZmlzdFNwYWNlSW5kZXggPSBsb25nRGlzcGxheVN0cmluZy5pbmRleE9mKCcgJyk7Ci0JCQlTdHJpbmcgc2hvcnREaXNwbGF5U3RyaW5nID0gbG9uZ0Rpc3BsYXlTdHJpbmc7Ci0JCQkKLQkJCWlmKGZpc3RTcGFjZUluZGV4ICE9IC0xKSB7Ci0JCQkJc2hvcnREaXNwbGF5U3RyaW5nID0gbG9uZ0Rpc3BsYXlTdHJpbmcuc3Vic3RyaW5nKGZpc3RTcGFjZUluZGV4KTsKLQkJCX0KLQkJCQkKLQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nID0gY29tcGxldGlvbiArICIgIiArIHNob3J0RGlzcGxheVN0cmluZzsgLy8kTk9OLU5MUy0xJAotCQkJSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24gPSBqYXZhUHJvcG9zYWwuZ2V0Q29udGV4dEluZm9ybWF0aW9uKCk7Ci0JCQlTdHJpbmcgYWRkaXRpb25hbEluZm8gPSBqYXZhUHJvcG9zYWwuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpOwotCQkJaW50IHJlbGV2YW5jZSA9IGphdmFQcm9wb3NhbC5nZXRSZWxldmFuY2UoKTsKLQkJCQotCQkJYm9vbGVhbiB1cGRhdGVMZW5ndGhPblZhbGlkYXRlID0gdHJ1ZTsKLQkJCQotCQkJanNwUHJvcG9zYWwgPSBuZXcgSlNQQ29tcGxldGlvblByb3Bvc2FsKGNvbXBsZXRpb24sIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbkFmdGVyLCBpbWFnZSwgZGlzcGxheVN0cmluZywgY29udGV4dEluZm9ybWF0aW9uLCBhZGRpdGlvbmFsSW5mbywgcmVsZXZhbmNlLCB1cGRhdGVMZW5ndGhPblZhbGlkYXRlKTsKLQkJCQotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDQ4MwotCQkJLy8gc2V0IHdyYXBwZWQgamF2YSBwcm9wb3NhbCBzbyBhZGRpdGlvbmFsIGluZm8gY2FuIGJlIGNhbGN1bGF0ZWQgb24gZGVtYW5kCi0JCQlqc3BQcm9wb3NhbC5zZXRKYXZhQ29tcGxldGlvblByb3Bvc2FsKGphdmFQcm9wb3NhbCk7Ci0JCQkKLQkJCXJldHVybiBqc3BQcm9wb3NhbDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0vLwlwcm90ZWN0ZWQgdm9pZCBhY2NlcHRNZXRob2QoY2hhcltdIGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgY2hhcltdIGRlY2xhcmluZ1R5cGVOYW1lLCBjaGFyW10gbmFtZSwgY2hhcltdW10gcGFyYW1ldGVyUGFja2FnZU5hbWVzLCBjaGFyW11bXSBwYXJhbWV0ZXJUeXBlTmFtZXMsIGNoYXJbXVtdIHBhcmFtZXRlck5hbWVzLCBjaGFyW10gcmV0dXJuVHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gcmV0dXJuVHlwZU5hbWUsIGNoYXJbXSBjb21wbGV0aW9uTmFtZSwgaW50IG1vZGlmaWVycywgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgcmVsZXZhbmNlKSB7Ci0vLwkJU3RyaW5nIHJhd05hbWUgPSBTdHJpbmcudmFsdWVPZihuYW1lKTsKLS8vCQlpZihwYXJhbWV0ZXJOYW1lcy5sZW5ndGggPT0gMCAmJiByYXdOYW1lLmxlbmd0aCgpID4gMyAmJiByYXdOYW1lLnN0YXJ0c1dpdGgoImdldCIpKQotLy8JCXsKLS8vCQkJU3RyaW5nIG1hbmdsZWROYW1lID0gcmF3TmFtZS5zdWJzdHJpbmcoMyw0KS50b0xvd2VyQ2FzZSgpICsgcmF3TmFtZS5zdWJzdHJpbmcoNCwgcmF3TmFtZS5sZW5ndGgoKSk7Ci0vLwkJCXN1cGVyLmFjY2VwdEZpZWxkKGRlY2xhcmluZ1R5cGVQYWNrYWdlTmFtZSwgZGVjbGFyaW5nVHlwZU5hbWUsIG1hbmdsZWROYW1lLnRvQ2hhckFycmF5KCksIHJldHVyblR5cGVQYWNrYWdlTmFtZSwgcmV0dXJuVHlwZU5hbWUsIG1hbmdsZWROYW1lLnRvQ2hhckFycmF5KCksIG1vZGlmaWVycywgc3RhcnQsIGVuZCwgcmVsZXZhbmNlKTsKLS8vCQl9Ci0vLwl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU0YjM5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXh0LklKU1BQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklSZWxlYXNhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuWE1MUmVsZXZhbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5TaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLQotLyoqCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEpTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yIGltcGxlbWVudHMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IsIElSZWxlYXNhYmxlIHsKLQkvKioKLQkgKiBQcmVmZXJlbmNlIGxpc3RlbmVyIHRvIGtlZXAgdHJhY2sgb2YgY2hhbmdlcyB0byBjb250ZW50IGFzc2lzdAotCSAqIHByZWZlcmVuY2VzCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQcmVmZXJlbmNlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCVN0cmluZyBwcm9wZXJ0eSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0SmF2YVByZWZlcmVuY2VTdG9yZSgpOwotCi0JCQlpZiAoUHJlZmVyZW5jZUNvbnN0YW50cy5DT0RFQVNTSVNUX0FVVE9BQ1RJVkFUSU9OLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCQlmQXV0b0FjdGl2YXRlID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkNPREVBU1NJU1RfQVVUT0FDVElWQVRJT04pOwotCQkJfQotCQkJZWxzZSBpZiAoUHJlZmVyZW5jZUNvbnN0YW50cy5DT0RFQVNTSVNUX0FVVE9BQ1RJVkFUSU9OX1RSSUdHRVJTX0pBVkEuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJCVN0cmluZyBhdXRvQ2hhcmFjdGVycyA9IHN0b3JlLmdldFN0cmluZyhQcmVmZXJlbmNlQ29uc3RhbnRzLkNPREVBU1NJU1RfQVVUT0FDVElWQVRJT05fVFJJR0dFUlNfSkFWQSk7Ci0JCQkJY29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzID0gKGF1dG9DaGFyYWN0ZXJzICE9IG51bGwpID8gYXV0b0NoYXJhY3RlcnMudG9DaGFyQXJyYXkoKSA6IG5ldyBjaGFyWzBdOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGZBdXRvQWN0aXZhdGUgPSB0cnVlOwotCXByb3RlY3RlZCBjaGFyIGNvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyc1tdID0gbmV3IGNoYXJbXXsnLid9OwotCXByb3RlY3RlZCBjaGFyIGNvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyc1tdID0gbnVsbDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX0NPTlRFWFQgPSBKU1BVSU1lc3NhZ2VzLkNvbnRlbnRfQXNzaXN0X25vdF9hdmFpbGFiX1VJXzsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZFcnJvck1lc3NhZ2UgPSBudWxsOwotCXByb3RlY3RlZCBKU1BDb21wbGV0aW9uUHJvY2Vzc29yIGZKc3BDb21wbGV0aW9uUHJvY2Vzc29yID0gbnVsbDsKLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZKYXZhUHJlZmVyZW5jZUxpc3RlbmVyOwotCi0JcHVibGljIEpTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgcHJvcG9zZWQgY29kZSBjb21wbGV0aW9ucyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCi0JICogbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGN1cnNvcgotCSAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dC1lZGl0b3IgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqICAgICAgICAgICAgYSBsb2NhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50Ci0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb2RlLWFzc2lzdCBpdGVtcwotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCi0JCUluZGV4ZWRSZWdpb24gdHJlZU5vZGUgPSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0KLQkJLy8gZ2V0IHJlc3VsdHMgZnJvbSBKU1AgY29tcGxldGlvbiBwcm9jZXNzb3IKLQkJZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IgPSBnZXRKc3BDb21wbGV0aW9uUHJvY2Vzc29yKCk7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSByZXN1bHRzID0gZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJZkVycm9yTWVzc2FnZSA9IGZKc3BDb21wbGV0aW9uUHJvY2Vzc29yLmdldEVycm9yTWVzc2FnZSgpOwotCQlpZiAocmVzdWx0cy5sZW5ndGggPT0gMCAmJiAoZkVycm9yTWVzc2FnZSA9PSBudWxsIHx8IGZFcnJvck1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCWZFcnJvck1lc3NhZ2UgPSBVTktOT1dOX0NPTlRFWFQ7Ci0JCX0KLQotCQlJRE9NTm9kZSB4Tm9kZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdCA9IG51bGw7Ci0JCWlmICh0cmVlTm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQl4Tm9kZSA9IChJRE9NTm9kZSkgdHJlZU5vZGU7Ci0JCQlmbGF0ID0geE5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0ICE9IG51bGwgJiYgZmxhdC5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpIHsKLQkJCQlmbGF0ID0gZmxhdC5nZXRQcmV2aW91cygpOwotCQkJfQotCQl9Ci0KLQkJLy8gdGhpcyBpcyBpbiBjYXNlIGl0J3MgYSA8JUAsIGl0IHdpbGwgYmUgYSByZWdpb24gY29udGFpbmVyLi4uCi0JCUlUZXh0UmVnaW9uIG9wZW5SZWdpb24gPSBudWxsOwotCQlpZiAoZmxhdCAhPSBudWxsICYmIGZsYXQgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJSVRleHRSZWdpb25MaXN0IHYgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBmbGF0KS5nZXRSZWdpb25zKCk7Ci0JCQlpZiAodi5zaXplKCkgPiAwKQotCQkJCW9wZW5SZWdpb24gPSB2LmdldCgwKTsKLQkJfQotCi0JCS8vIEFERCBDREFUQSBQUk9QT1NBTCBJRiBJVCdTIEFOIFhNTC1KU1AgVEFHCi0JCWlmIChmbGF0ICE9IG51bGwgJiYgZmxhdC5nZXRUeXBlKCkgIT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOICYmIGZsYXQuZ2V0VHlwZSgpICE9IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOICYmIGZsYXQuZ2V0VHlwZSgpICE9IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4gJiYgZmxhdC5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUICYmIChvcGVuUmVnaW9uICE9IG51bGwgJiYgb3BlblJlZ2lvbi5nZXRUeXBlKCkgIT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOKSAmJiAhaW5BdHRyaWJ1dGVSZWdpb24oZmxhdCwgZG9jdW1lbnRQb3NpdGlvbikpIHsKLQotCQkJLy8gZGV0ZXJtaW5lIGlmIGN1cnNvciBpcyBiZWZvcmUgb3IgYWZ0ZXIgc2VsZWN0ZWQgcmFuZ2UKLQkJCWludCBhZGp1c3RlZERvY1Bvc2l0aW9uID0gZG9jdW1lbnRQb3NpdGlvbjsKLQkJCWludCByZWFsQ2FyZXRQb3NpdGlvbiA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCWludCBzZWxlY3Rpb25MZW5ndGggPSB2aWV3ZXIuZ2V0U2VsZWN0ZWRSYW5nZSgpLnk7Ci0JCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+IHJlYWxDYXJldFBvc2l0aW9uKSB7Ci0JCQkJYWRqdXN0ZWREb2NQb3NpdGlvbiAtPSBzZWxlY3Rpb25MZW5ndGg7Ci0JCQl9Ci0KLQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBjZGF0YVByb3Bvc2FsID0gY3JlYXRlQ0RBVEFQcm9wb3NhbChhZGp1c3RlZERvY1Bvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIG5ld1Jlc3VsdHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtyZXN1bHRzLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShyZXN1bHRzLCAwLCBuZXdSZXN1bHRzLCAwLCByZXN1bHRzLmxlbmd0aCk7Ci0JCQluZXdSZXN1bHRzW3Jlc3VsdHMubGVuZ3RoXSA9IGNkYXRhUHJvcG9zYWw7Ci0JCQlyZXN1bHRzID0gbmV3UmVzdWx0czsKLQkJfQotCi0JCS8vIChwYSkgKiogdGhpcyBpcyBjb2RlIGluIHByb2dyZXNzLi4uCi0JCS8vIGFkZCBlbmRpbmcgJT4gcHJvcG9zYWwgZm9yIG5vbiBjbG9zZWQgSlNQIHRhZ3MKLQkJLy8gU3RyaW5nIHRhZ1RleHQgPSBmbGF0LmdldFRleHQoKTsKLQkJLy8gLy8gVE9ETyBuZWVkIGEgbXVjaCBiZXR0ZXIgY29tcGFyZSAodXNpbmcgY29uc3RhbnRzPykKLQkJLy8JCWlmKHRhZ1RleHQuZXF1YWxzKCI8JSIpIHx8IHRhZ1RleHQuZXF1YWxzKCI8JT0iKSB8fCB0YWdUZXh0LmVxdWFscygiPCUhIikpOwotCQkvLyB7Ci0JCS8vCQkJSUNvbXBsZXRpb25Qcm9wb3NhbCB0ZXN0YWggPSBDb250ZW50QXNzaXN0VXRpbHMuY29tcHV0ZUpTUEVuZFRhZ1Byb3Bvc2FsKHZpZXdlcixkb2N1bWVudFBvc2l0aW9uLCB0cmVlTm9kZSwgIjwlIiAsIFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19PQkpfVEFHX0dFTkVSSUMpOwotCQkvLyBpZih0ZXN0YWggIT0gbnVsbCkKLQkJLy8gewotCQkvLwkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gbmV3UmVzdWx0cyA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3Jlc3VsdHMubGVuZ3RoICsgMV07Ci0JCS8vIFN5c3RlbS5hcnJheWNvcHkoIHJlc3VsdHMsIDAsIG5ld1Jlc3VsdHMsIDAsIHJlc3VsdHMubGVuZ3RoKTsKLQkJLy8gbmV3UmVzdWx0c1tyZXN1bHRzLmxlbmd0aF0gPSB0ZXN0YWg7Ci0JCS8vIHJlc3VsdHMgPSBuZXdSZXN1bHRzOwotCQkvLyB9Ci0JCS8vIH0KLQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQlwcml2YXRlIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVDREFUQVByb3Bvc2FsKGludCBhZGp1c3RlZERvY1Bvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0JCXJldHVybiBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCI8IVtDREFUQVtdXT4iLCAvLyROT04tTkxTLTEkCi0JCQkJCWFkanVzdGVkRG9jUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCwgLy8gc2hvdWxkIGJlIHRoZSBzZWxlY3Rpb24gbGVuZ3RoCi0JCQkJCTksIFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19PQkpfQ0RBVEFTRUNUSU9OKSwgCi0JCQkJCSJDREFUQSBTZWN0aW9uIiwgLy8kTk9OLU5MUy0xJAotCQkJCQludWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9DREFUQSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGluQXR0cmlidXRlUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdCwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJSVRleHRSZWdpb24gYXR0ckNvbnRhaW5lciA9IGZsYXQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWlmIChhdHRyQ29udGFpbmVyICE9IG51bGwgJiYgYXR0ckNvbnRhaW5lciBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlpZiAoYXR0ckNvbnRhaW5lci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIHdoZW4gZW50ZXJlZCBieSB0aGUgdXNlciBzaG91bGQKLQkgKiBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgdGhlIHByZXNlbnRhdGlvbiBvZiBwb3NzaWJsZSBjb21wbGV0aW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhdXRvIGFjdGl2YXRpb24gY2hhcmFjdGVycyBmb3IgY29tcGxldGlvbiBwcm9wb3NhbCBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYXV0byBhY3RpdmF0aW9uIGlzIGRlc2lyZWQKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJLy8gaWYgbm8gbGlzdGVuZXIgaGFzIGJlZW4gY3JlYXRlZCwgcHJlZmVyZW5lcyBoYXZlIG5vdCBiZWVuCi0JCS8vIGluaXRpYWxpemVkCi0JCWlmIChmSmF2YVByZWZlcmVuY2VMaXN0ZW5lciA9PSBudWxsKQotCQkJaW5pdGlhbGl6ZVByZWZlcmVuY2VzKCk7Ci0KLQkJaWYgKGZBdXRvQWN0aXZhdGUpCi0JCQlyZXR1cm4gY29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIHdoZW4gZW50ZXJlZCBieSB0aGUgdXNlciBzaG91bGQKLQkgKiBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgdGhlIHByZXNlbnRhdGlvbiBvZiBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBwcmVzZW50aW5nIGNvbnRleHQKLQkgKiAgICAgICAgIGluZm9ybWF0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGF1dG8gYWN0aXZhdGlvbiBpcwotCSAqICAgICAgICAgZGVzaXJlZAotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gY29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVhc29uIHdoeSBjb21wdXRlUHJvcG9zYWxzIHdhcyBub3QgYWJsZSB0byBmaW5kIGFueQotCSAqIGNvbXBsZXRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gYW4gZXJyb3IgbWVzc2FnZSBvciBudWxsIGlmIG5vIGVycm9yIG9jY3VycmVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBmRXJyb3JNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ29udGVudEFzc2lzdEFkYXB0ZXIjcmVsZWFzZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gcmVtb3ZlIGxpc3RlbmVyIG9uIGphdmEgcHJlZmVyZW5jZXMgaWYgd2UgYWRkZWQgb25lCi0JCWlmIChmSmF2YVByZWZlcmVuY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlnZXRKYXZhUHJlZmVyZW5jZVN0b3JlKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmSmF2YVByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JCX0KLQotCQlpZiAoZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IucmVsZWFzZSgpOwotCQkJZkpzcENvbXBsZXRpb25Qcm9jZXNzb3IgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIEpTUENvbXBsZXRpb25Qcm9jZXNzb3IgZ2V0SnNwQ29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGZKc3BDb21wbGV0aW9uUHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZKc3BDb21wbGV0aW9uUHJvY2Vzc29yID0gbmV3IEpTUENvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQkJfQotCQlyZXR1cm4gZkpzcENvbXBsZXRpb25Qcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uW10gY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIG5lZWQgdG8gY29tcHV0ZSBjb250ZXh0IGluZm8gaGVyZSwgaWYgaXQncyBKU1AsIGNhbGwgamF2YSBjb21wdXRlcgotCQlJRG9jdW1lbnQgZG9jID0gdmlld2VyLmdldERvY3VtZW50KCk7Ci0JCUlEb2N1bWVudFBhcnRpdGlvbmVyIGRwID0gbnVsbDsKLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjMpIHsKLQkJCWRwID0gKChJRG9jdW1lbnRFeHRlbnNpb24zKSBkb2MpLmdldERvY3VtZW50UGFydGl0aW9uZXIoSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORyk7Ci0JCX0KLQkJaWYgKGRwICE9IG51bGwpIHsKLQkJCS8vSURvY3VtZW50UGFydGl0aW9uZXIgZHAgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXREb2N1bWVudFBhcnRpdGlvbmVyKCk7Ci0JCQlTdHJpbmcgdHlwZSA9IGRwLmdldFBhcnRpdGlvbihkb2N1bWVudE9mZnNldCkuZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQgfHwgdHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBKSB7Ci0JCQkJLy8gZ2V0IGNvbnRleHQgaW5mbyBmcm9tIGNvbXBsZXRpb24gcmVzdWx0cy4uLgotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3Bvc2Fscy5sZW5ndGg7IGkrKykgewotCQkJCQlJQ29udGV4dEluZm9ybWF0aW9uIGNpID0gcHJvcG9zYWxzW2ldLmdldENvbnRleHRJbmZvcm1hdGlvbigpOwotCQkJCQlpZiAoY2kgIT0gbnVsbCkKLQkJCQkJCXJlc3VsdHMuYWRkKGNpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJQ29udGV4dEluZm9ybWF0aW9uW10pIHJlc3VsdHMudG9BcnJheShuZXcgSUNvbnRleHRJbmZvcm1hdGlvbltyZXN1bHRzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB2YWxpZGF0b3IgdXNlZCB0byBkZXRlcm1pbmUgd2hlbiBkaXNwbGF5ZWQgY29udGV4dAotCSAqIGluZm9ybWF0aW9uIHNob3VsZCBiZSBkaXNtaXNzZWQuIE1heSBvbmx5IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoZSBwcm9jZXNzb3IgaXMgaW5jYXBhYmxlIG9mIGNvbXB1dGluZyBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb250ZXh0IGluZm9ybWF0aW9uIHZhbGlkYXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogICAgICAgICBwcm9jZXNzb3IgaXMgaW5jYXBhYmxlIG9mIGNvbXB1dGluZyBjb250ZXh0IGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IEphdmFQYXJhbWV0ZXJMaXN0VmFsaWRhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgamF2YSBwcmVmZXJlbmNlIHN0b3JlLiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIGdldHRpbmcgaXQsCi0JICogYWRkIGEgcHJlZmVyZW5jZSBsaXN0ZW5lciB0byBpdC4KLQkgKiAKLQkgKiBAcmV0dXJuIElQcmVmZXJlbmNlU3RvcmUKLQkgKi8KLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZ2V0SmF2YVByZWZlcmVuY2VTdG9yZSgpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFByZWZlcmVuY2VDb25zdGFudHMuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWlmIChmSmF2YVByZWZlcmVuY2VMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmSmF2YVByZWZlcmVuY2VMaXN0ZW5lciA9IG5ldyBQcmVmZXJlbmNlTGlzdGVuZXIoKTsKLQkJCXN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZkphdmFQcmVmZXJlbmNlTGlzdGVuZXIpOwotCQl9Ci0JCXJldHVybiBzdG9yZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHByZWZlcmVuY2UgZm9yIGNvbnRlbnQgYXNzaXN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldEphdmFQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlmQXV0b0FjdGl2YXRlID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkNPREVBU1NJU1RfQVVUT0FDVElWQVRJT04pOwotCQlTdHJpbmcgYXV0b0NoYXJhY3RlcnMgPSBzdG9yZS5nZXRTdHJpbmcoUHJlZmVyZW5jZUNvbnN0YW50cy5DT0RFQVNTSVNUX0FVVE9BQ1RJVkFUSU9OX1RSSUdHRVJTX0pBVkEpOwotCQljb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMgPSAoYXV0b0NoYXJhY3RlcnMgIT0gbnVsbCkgPyBhdXRvQ2hhcmFjdGVycy50b0NoYXJBcnJheSgpIDogbmV3IGNoYXJbMF07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQUHJvcGVydHlDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BQcm9wZXJ0eUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3NzQ0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BQcm9wZXJ0eUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5KU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5KU1BFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxSZWxldmFuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbXB1dGVzIGF0dHJpYnV0ZSB2YWx1ZSBjb21wbGV0aW9uIHByb3Bvc2FscyBmb3IgJmx0O2pzcDpbZ3NdZXRQcm9wZXJ0eSZndDsgdGFncy4KLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSlNQUHJvcGVydHlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGV4dGVuZHMgSlNQRHVtbXlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQlwdWJsaWMgSlNQUHJvcGVydHlDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKTsKLQotCQkvLyBGaW5kIHRoZSBhdHRyaWJ1dGUgbmFtZSBmb3Igd2hpY2ggdGhpcyBwb3NpdGlvbiBzaG91bGQgaGF2ZSBhIHZhbHVlCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb3BlbiA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVRleHRSZWdpb25MaXN0IG9wZW5SZWdpb25zID0gb3Blbi5nZXRSZWdpb25zKCk7Ci0JCWludCBpID0gb3BlblJlZ2lvbnMuaW5kZXhPZihjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSk7Ci0JCWlmIChpIDwgMCkKLQkJCXJldHVybjsKLQotCQkvLyBnZXQgdGhlIGF0dHJpYnV0ZSBpbiBxdWVzdGlvbiAoZmlyc3QgYXR0ciBuYW1lIHRvIHRoZSBsZWZ0IG9mIHRoZSBjdXJzb3IpCi0JCUlUZXh0UmVnaW9uIGF0dHJOYW1lUmVnaW9uID0gbnVsbDsKLQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBudWxsOwotCQl3aGlsZSAoaSA+PSAwKSB7Ci0JCQlhdHRyTmFtZVJlZ2lvbiA9IG9wZW5SZWdpb25zLmdldChpLS0pOwotCQkJaWYgKGF0dHJOYW1lUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGF0dHJOYW1lUmVnaW9uICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVOYW1lID0gb3Blbi5nZXRUZXh0KGF0dHJOYW1lUmVnaW9uKTsKLQotCQkvLyBkZXRlcm1pbmUgZ2V0IG9yIHNldAotCQlJVGV4dFJlZ2lvbiB0YWdOYW1lUmVnaW9uID0gbnVsbDsKLQkJYm9vbGVhbiBpc0dldFByb3BlcnR5ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBvcGVuUmVnaW9ucy5zaXplKCk7IGorKykgewotCQkJdGFnTmFtZVJlZ2lvbiA9IG9wZW5SZWdpb25zLmdldChqKTsKLQkJCWlmICh0YWdOYW1lUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSAmJiBvcGVuLmdldFRleHQodGFnTmFtZVJlZ2lvbikudHJpbSgpLmVxdWFscygianNwOnNldFByb3BlcnR5IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlzR2V0UHJvcGVydHkgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyBjdXJyZW50VmFsdWUgPSBudWxsOwotCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpCi0JCQljdXJyZW50VmFsdWUgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRUZXh0KCk7Ci0JCWVsc2UKLQkJCWN1cnJlbnRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBtYXRjaFN0cmluZyA9IG51bGw7Ci0JCS8vIGZpeHVwcyBzaW5jZSB0aGUgbWF0Y2hTdHJpbmcgY29tcHV0YXRpb25zIGRvbid0IGNhcmUgaWYgdGhlcmUgYXJlIHF1b3RlcyBhcm91bmQgdGhlIHZhbHVlCi0JCWlmIChjdXJyZW50VmFsdWUubGVuZ3RoKCkgPiBTdHJpbmdVdGlscy5zdHJpcChjdXJyZW50VmFsdWUpLmxlbmd0aCgpICYmIChjdXJyZW50VmFsdWUuc3RhcnRzV2l0aCgiXCIiKSB8fCBjdXJyZW50VmFsdWUuc3RhcnRzV2l0aCgiJyIpKSAmJiBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpID4gMCkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQltYXRjaFN0cmluZyA9IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoMSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSk7Ci0JCWVsc2UKLQkJCW1hdGNoU3RyaW5nID0gY3VycmVudFZhbHVlLnN1YnN0cmluZygwLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpKTsKLQotCQkvLyBmb3Igbm93IHdlIGlnbm9yZSBjb21wbGljYXRlZCB2YWx1ZXMgc3VjaCBhcyBqc3AgZW1iZWRkZWQgaW4gYW4gYXR0cmlidXRlCi0JCWJvb2xlYW4gZXhpc3RpbmdDb21wbGljYXRlZFZhbHVlID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkgIT0gbnVsbCAmJiBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyOwotCQlpZiAoZXhpc3RpbmdDb21wbGljYXRlZFZhbHVlKSB7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRQcm9wb3NhbHMoKS5jbGVhcigpOwotCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWFjcm9zKCkuY2xlYXIoKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSkpIHsKLQkJCQlhZGRCZWFuTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgbm9kZSwgbWF0Y2hTdHJpbmcpOwotCQkJfQotCQkJZWxzZSBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1BST1BFUlRZKSkgewotCQkJCWFkZEJlYW5Qcm9wZXJ0eVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgbm9kZSwgaXNHZXRQcm9wZXJ0eSwgbWF0Y2hTdHJpbmcpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEJlYW5Qcm9wZXJ0eVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgSURPTU5vZGUgbm9kZSwgYm9vbGVhbiBpc0dldFByb3BlcnR5LCBTdHJpbmcgbWF0Y2hTdHJpbmcpIHsKLQkJLy8gYXNzdW1lcyB0aGF0IHRoZSBub2RlIGlzIHRoZSBbZ3NdZXRQcm9wZXJ0eSB0YWcKLQkJU3RyaW5nIHVzZUJlYW5OYW1lID0gKChFbGVtZW50KSBub2RlKS5nZXRBdHRyaWJ1dGUoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUpOwotCQkvLyBwcm9wZXJ0aWVzIGNhbiBvbmx5IGJlIHByb3ZpZGVkIGlmIGEgY2xhc3MvdHlwZS9iZWFuTmFtZSBoYXMgYmVlbiBkZWNsYXJlZAotCQlpZiAodXNlQmVhbk5hbWUgIT0gbnVsbCAmJiB1c2VCZWFuTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCU5vZGVMaXN0IHVzZUJlYW5zID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuVVNFQkVBTik7Ci0JCQlpZiAodXNlQmVhbnMgIT0gbnVsbCkgewotCQkJCVN0cmluZyB0eXBlTmFtZSA9IG51bGw7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCB1c2VCZWFucy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJCWlmICh1c2VCZWFucy5pdGVtKGopLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJRWxlbWVudCB1c2VCZWFuID0gKEVsZW1lbnQpIHVzZUJlYW5zLml0ZW0oaik7Ci0JCQkJCWlmICh1c2VCZWFuIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbiAmJiAoKEluZGV4ZWRSZWdpb24pIHVzZUJlYW4pLmdldFN0YXJ0T2Zmc2V0KCkgPCBub2RlLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQkJCWlmICh1c2VCZWFuLmdldEF0dHJpYnV0ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfSUQpLmVxdWFscyh1c2VCZWFuTmFtZSkpIHsKLQkJCQkJCQl0eXBlTmFtZSA9IHVzZUJlYW4uZ2V0QXR0cmlidXRlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9DTEFTUyk7Ci0JCQkJCQkJaWYgKHR5cGVOYW1lID09IG51bGwgfHwgdHlwZU5hbWUubGVuZ3RoKCkgPCAxKSB7Ci0JCQkJCQkJCXR5cGVOYW1lID0gdXNlQmVhbi5nZXRBdHRyaWJ1dGUoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAodHlwZU5hbWUgPT0gbnVsbCB8fCB0eXBlTmFtZS5sZW5ndGgoKSA8IDEpIHsKLQkJCQkJCQkJdHlwZU5hbWUgPSB1c2VCZWFuLmdldEF0dHJpYnV0ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfQkVBTl9OQU1FKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHR5cGVOYW1lICE9IG51bGwgJiYgdHlwZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCS8vIGZpbmQgdGhlIGNsYXNzL3R5cGUvYmVhbk5hbWUgZGVmaW5pdGlvbiBhbmQgb2J0YWluIHRoZSBsaXN0IG9mIHByb3BlcnRpZXMKLQkJCQkJSUJlYW5JbmZvUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgQmVhbkluZm9Qcm92aWRlcigpOwotCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJCUlKYXZhUHJvcGVydHlEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBwcm92aWRlci5nZXRSdW50aW1lUHJvcGVydGllcyhyZXNvdXJjZSwgdHlwZU5hbWUpOwotCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBudWxsOwotCQkJCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlKYXZhUHJvcGVydHlEZXNjcmlwdG9yIHBkID0gZGVzY3JpcHRvcnNbal07Ci0JCQkJCQkvLyBjaGVjayB3aGV0aGVyIGl0J3MgZ2V0IG9yIHNldCBraW5kYSBwcm9wZXJ0eQotCQkJCQkJaWYgKHBkLmdldFJlYWRhYmxlKCkgJiYgaXNHZXRQcm9wZXJ0eSB8fCBwZC5nZXRXcml0ZWFibGUoKSAmJiAhaXNHZXRQcm9wZXJ0eSkgewotCQkJCQkJCS8vIGZpbHRlciBhdHRyIHZhbHVlIG5hbWUKLQkJCQkJCQlpZiAobWF0Y2hTdHJpbmcubGVuZ3RoKCkgPT0gMCB8fCBwZC5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG1hdGNoU3RyaW5nLnRvTG93ZXJDYXNlKCkpKSB7Ci0JCQkJCQkJCWRpc3BsYXlTdHJpbmcgPSBwZC5nZXREaXNwbGF5TmFtZSgpOwotCQkJCQkJCQlpZiAocGQuZ2V0RGVjbGFyZWRUeXBlKCkgIT0gbnVsbCAmJiBwZC5nZXREZWNsYXJlZFR5cGUoKS5sZW5ndGgoKSA+IDApCi0JCQkJCQkJCQlkaXNwbGF5U3RyaW5nICs9ICIgLSAiICsgcGQuZ2V0RGVjbGFyZWRUeXBlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCJcIiIgKyBwZC5nZXROYW1lKCkgKyAiXCIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIHBkLmdldE5hbWUoKS5sZW5ndGgoKSArIDIsIFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19PQkpfQVRUUklCVVRFKSwKLQkJCQkJCQkJCQkJZGlzcGxheVN0cmluZywgbnVsbCwgcGQuZ2V0RGVjbGFyZWRUeXBlKCksIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1hNTF9BVFRSSUJVVEVfVkFMVUUpOwotCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEJlYW5OYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBJRE9NTm9kZSBub2RlLCBTdHJpbmcgbWF0Y2hTdHJpbmcpIHsKLQkJLy8gd2lsbCBub3QgY2F0Y2ggdXNlQmVhbnMgc3BlY2lmaWVkIHVzaW5nIG90aGVyIHRoYW4gYWN0dWFsIERPTSBOb2RlcwotCQlOb2RlTGlzdCB1c2VCZWFucyA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVTRUJFQU4pOwotCQlpZiAodXNlQmVhbnMgIT0gbnVsbCkgewotCQkJU3RyaW5nIGlkID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nID0gbnVsbDsKLQkJCVN0cmluZyBjbGFzc09yVHlwZSA9IG51bGw7Ci0JCQlTdHJpbmcgaW1hZ2VOYW1lID0gSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0xBU1NfT0JKOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCB1c2VCZWFucy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJaWYgKHVzZUJlYW5zLml0ZW0oaikuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJY29udGludWU7Ci0JCQkJRWxlbWVudCB1c2VCZWFuID0gKEVsZW1lbnQpIHVzZUJlYW5zLml0ZW0oaik7Ci0JCQkJaWYgKHVzZUJlYW4gaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uICYmICgoSW5kZXhlZFJlZ2lvbikgdXNlQmVhbikuZ2V0U3RhcnRPZmZzZXQoKSA8IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCQlpZCA9IFN0cmluZ1V0aWxzLnN0cmlwKHVzZUJlYW4uZ2V0QXR0cmlidXRlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9JRCkpOwotCQkJCQlkaXNwbGF5U3RyaW5nID0gbnVsbDsKLQkJCQkJY2xhc3NPclR5cGUgPSBudWxsOwotCQkJCQlpbWFnZU5hbWUgPSBKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DTEFTU19PQko7Ci0JCQkJCS8vIHNldCB0aGUgSW1hZ2UgYmFzZWQgb24gd2hldGhlciB0aGUgY2xhc3MsIHR5cGUsIG9yIGJlYW5OYW1lIGF0dHJpYnV0ZSBpcyBwcmVzZW50Ci0JCQkJCWNsYXNzT3JUeXBlID0gdXNlQmVhbi5nZXRBdHRyaWJ1dGUoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0NMQVNTKTsKLQkJCQkJaWYgKGNsYXNzT3JUeXBlID09IG51bGwgfHwgY2xhc3NPclR5cGUubGVuZ3RoKCkgPCAxKSB7Ci0JCQkJCQljbGFzc09yVHlwZSA9IHVzZUJlYW4uZ2V0QXR0cmlidXRlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFKTsKLQkJCQkJCWltYWdlTmFtZSA9IEpTUEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1BVQkxJQzsKLQkJCQkJfQotCQkJCQlpZiAoY2xhc3NPclR5cGUgPT0gbnVsbCB8fCBjbGFzc09yVHlwZS5sZW5ndGgoKSA8IDEpIHsKLQkJCQkJCWNsYXNzT3JUeXBlID0gdXNlQmVhbi5nZXRBdHRyaWJ1dGUoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0JFQU5fTkFNRSk7Ci0JCQkJCQlpbWFnZU5hbWUgPSBKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9QVUJMSUM7Ci0JCQkJCX0KLQkJCQkJaWYgKGNsYXNzT3JUeXBlICE9IG51bGwgJiYgY2xhc3NPclR5cGUubGVuZ3RoKCkgPiAwKQotCQkJCQkJZGlzcGxheVN0cmluZyA9IGlkICsgIiAtICIgKyBjbGFzc09yVHlwZTsgLy8kTk9OLU5MUy0xJAotCQkJCQllbHNlCi0JCQkJCQlkaXNwbGF5U3RyaW5nID0gaWQ7Ci0KLQkJCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTIzNDEKLQkJCQkJaWYoaWQgIT0gbnVsbCkgewotCQkJCQkgICAgLy8gZmlsdGVyCi0JCQkJCQlpZiAobWF0Y2hTdHJpbmcubGVuZ3RoKCkgPT0gMCB8fCBpZC5zdGFydHNXaXRoKG1hdGNoU3RyaW5nKSkgewotCQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIlwiIiArIGlkICsgIlwiIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLmxlbmd0aCgpICsgMiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShpbWFnZU5hbWUpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5U3RyaW5nLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBwcm9qZWN0IHJlcXVlc3QgaXMgaW4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElSZXNvdXJjZSBnZXRSZXNvdXJjZShDb250ZW50QXNzaXN0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCVN0cmluZyBiYXNlbG9jYXRpb24gPSBudWxsOwotCi0JCWlmIChyZXF1ZXN0ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gcmVxdWVzdC5nZXREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJSURvY3VtZW50IGRvY3VtZW50ID0gcmVnaW9uLmdldFBhcmVudERvY3VtZW50KCk7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCWJhc2Vsb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYmFzZWxvY2F0aW9uICE9IG51bGwpIHsKLQkJCS8vIGNvcGllZCBmcm9tIEpTUFRyYW5zbGF0aW9uQWRhcHRlciNnZXRKYXZhUHJvamVjdAotCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQlJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKGJhc2Vsb2NhdGlvbik7Ci0JCQlJRmlsZSBmaWxlID0gbnVsbDsKLQotCQkJaWYgKGZpbGVQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCWZpbGUgPSByb290LmdldEZpbGUoZmlsZVBhdGgpOwotCQkJfQotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCXJlc291cmNlID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFByb3Bvc2FsQ29sbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BQcm9wb3NhbENvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWU5Y2ViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFByb3Bvc2FsQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuQ29tcGxldGlvblByb3Bvc2FsQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuQ29tcGxldGlvblByb3Bvc2FsQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklKYXZhQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBQYXNzZWQgaW50byBJQ29kZUNvbXBsZXRlI2NvZGVDb21wbGV0ZShpbnQgb2Zmc2V0LCBDb21wbGV0aW9uUmVxdWVzdG9yIHJlcXVlc3RvcikuCi0gKiBBZGFwdHMgSUphdmFDb21wbGV0aW9uUHJvcG9zYWxzIHRvIEpTUENvbXBsZXRpb24gcHJvcG9zYWxzLgotICogVGhpcyBpbmNsdWRlczoKLSAqICAtIHRyYW5zbGF0aW5nIG9mZnNldHMKLSAqICAtICJmaXhpbmciIHVwIGRpc3BsYXkgc3RyaW5ncwotICogIC0gZmlsdGVyaW5nIHNvbWUgdW53YW50ZWQgcHJvcG9zYWxzCi0gKgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQcm9wb3NhbENvbGxlY3RvciBleHRlbmRzIENvbXBsZXRpb25Qcm9wb3NhbENvbGxlY3RvciB7Ci0KLQlwcml2YXRlIEpTUFRyYW5zbGF0aW9uIGZUcmFuc2xhdGlvbjsKLQlwcml2YXRlIENvbXBhcmF0b3IgZkNvbXBhcmF0b3I7Ci0JCi0JcHVibGljIEpTUFByb3Bvc2FsQ29sbGVjdG9yKElDb21waWxhdGlvblVuaXQgY3UsIEpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uKSB7Ci0JCXN1cGVyKGN1KTsKLQkKLQkJaWYodHJhbnNsYXRpb24gPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkpTUFRyYW5zbGF0aW9uIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWZUcmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZXMgdGhhdCB3ZSBvbmx5IHJldHVybiBKU1BDb21wbGV0aW9uUHJvcG9zYWxzLgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgSlNQQ29tcGxldGlvblByb3Bvc2FscwotCSAqLwotCXB1YmxpYyBKU1BDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRKU1BDb21wbGV0aW9uUHJvcG9zYWxzKCkgewotCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlKYXZhQ29tcGxldGlvblByb3Bvc2FsW10gamF2YVByb3Bvc2FscyA9IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKCk7Ci0JCS8vIG5lZWQgdG8gZmlsdGVyIG91dCBub24gSlNQQ29tcGxldGlvblByb3Bvc2FscwotCQkvLyBiZWNhdXNlIHRoZWlyIG9mZnNldHMgaGF2ZW4ndCBiZWVuIHRyYW5zbGF0ZWQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqYXZhUHJvcG9zYWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihqYXZhUHJvcG9zYWxzW2ldIGluc3RhbmNlb2YgSlNQQ29tcGxldGlvblByb3Bvc2FsKQotCQkJCXJlc3VsdHMuYWRkKGphdmFQcm9wb3NhbHNbaV0pOwotCQl9Ci0JCUNvbGxlY3Rpb25zLnNvcnQocmVzdWx0cywgZ2V0Q29tcGFyYXRvcigpKTsKLQkJcmV0dXJuIChKU1BDb21wbGV0aW9uUHJvcG9zYWxbXSlyZXN1bHRzLnRvQXJyYXkobmV3IEpTUENvbXBsZXRpb25Qcm9wb3NhbFtyZXN1bHRzLnNpemUoKV0pOwotCX0KLQkKLQlwcml2YXRlIENvbXBhcmF0b3IgZ2V0Q29tcGFyYXRvcigpIHsKLQkJaWYoZkNvbXBhcmF0b3IgPT0gbnVsbCkKLQkJCWZDb21wYXJhdG9yID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbENvbXBhcmF0b3IoKTsKLQkJcmV0dXJuIGZDb21wYXJhdG9yOwotCX0KLQkKLQkvKioKLQkgKiBPdmVycmlkZGVuIHRvOgotCSAqICAtIHRyYW5zbGF0ZSBKYXZhIC0+IEpTUCBvZmZzZXRzCi0JICogIC0gZml4IGN1cnNvci1wb3NpdGlvbi1hZnRlcgotCSAqICAtIGZpeCBtYW5nbGVkIHNlcnZsZXQgbmFtZSBpbiBkaXNwbGF5IHN0cmluZwotCSAqICAtIHJlbW92ZSB1bndhbnRlZCBwcm9wb3NhbHMgKHNlcnZsZXQgY29uc3RydWN0b3IpCi0JICovCi0JcHJvdGVjdGVkIElKYXZhQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZUphdmFDb21wbGV0aW9uUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsKSB7Ci0JCQotCQlKU1BDb21wbGV0aW9uUHJvcG9zYWwganNwUHJvcG9zYWwgPSBudWxsOwotCQkKLQkJLy8gaWdub3JlIGNvbnN0cnVjdG9yIHByb3Bvc2FscyAodGhleSdyZSBub3QgcmVsZXZhbnQgZm9yIG91ciBKU1AgcHJvcG9zYWwgbGlzdCkKLQkJaWYoIXByb3Bvc2FsLmlzQ29uc3RydWN0b3IoKSkgewotCQkJCi0JCQlpZihwcm9wb3NhbC5nZXRLaW5kKCkgPT0gQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGKSB7Ci0JCQkJU3RyaW5nIHNpZ25hdHVyZSA9IFN0cmluZy52YWx1ZU9mKHByb3Bvc2FsLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCkpOwotCQkJCVN0cmluZyBjb21wbGV0aW9uID0gU3RyaW5nLnZhbHVlT2YocHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpKTsKLQkJCQlpZihjb21wbGV0aW9uLmluZGV4T2Yoc2lnbmF0dXJlKSAhPSAtMSkgewotCQkJCQlqc3BQcm9wb3NhbCA9IGNyZWF0ZUF1dG9JbXBvcnRQcm9wb3NhbChwcm9wb3NhbCk7CQkJCi0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBkZWZhdWx0IGJlaGF2aW9yCi0JCQlpZihqc3BQcm9wb3NhbCA9PSBudWxsKQotCQkJCWpzcFByb3Bvc2FsID0gY3JlYXRlSnNwUHJvcG9zYWwocHJvcG9zYWwpOwkJCi0JCX0KLQkJcmV0dXJuIGpzcFByb3Bvc2FsOwotCX0KLQotCQotCQotCXByaXZhdGUgSlNQQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZUF1dG9JbXBvcnRQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwpIHsKLQkJCi0JCUpTUENvbXBsZXRpb25Qcm9wb3NhbCBqc3BQcm9wb3NhbCA9IG51bGw7Ci0KLQkJU3RyaW5nIHNpZ25hdHVyZSA9IG5ldyBTdHJpbmcocHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKSk7Ci0JCVN0cmluZyBjb21wbGV0aW9uID0gbmV3IFN0cmluZyhwcm9wb3NhbC5nZXRDb21wbGV0aW9uKCkpOwotCQkKLQkJLy8gaXQncyBmdWxseSBxdWFsaWZpZWQgc28gd2Ugc2hvdWxkCi0JCS8vIGFkZCBhbiBpbXBvcnQgc3RhdGVtZW50Ci0JCS8vIGNyZWF0ZSBhbiBhdXRvaW1wb3J0IHByb3Bvc2FsCi0JCVN0cmluZyBuZXdDb21wbGV0aW9uID0gY29tcGxldGlvbi5yZXBsYWNlQWxsKHNpZ25hdHVyZSArICIuIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCi0JCS8vIGphdmEgb2Zmc2V0Ci0JCWludCBvZmZzZXQgPSBwcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKTsKLQkJLy8gcmVwbGFjZW1lbnQgbGVuZ3RoCi0JCWludCBsZW5ndGggPSBwcm9wb3NhbC5nZXRSZXBsYWNlRW5kKCkgLSBvZmZzZXQ7Ci0JCS8vIHRyYW5zbGF0ZSBvZmZzZXQgZnJvbSBKYXZhID4gSlNQCi0JCW9mZnNldCA9IGZUcmFuc2xhdGlvbi5nZXRKc3BPZmZzZXQob2Zmc2V0KTsKLQkJLy8gY3Vyc29yIHBvc2l0aW9uIGFmdGVyIG11c3QgYmUgY2FsY3VsYXRlZAotCQlpbnQgcG9zaXRpb25BZnRlciA9IGNhbGN1bGF0ZVBvc2l0aW9uQWZ0ZXIocHJvcG9zYWwsIG5ld0NvbXBsZXRpb24sIG9mZnNldCk7Ci0JCQotCQkvLyBmcm9tIGphdmEgcHJvcG9zYWwKLQkJSUphdmFDb21wbGV0aW9uUHJvcG9zYWwgamF2YVByb3Bvc2FsID0gc3VwZXIuY3JlYXRlSmF2YUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NhbCk7Ci0JCXByb3Bvc2FsLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCk7Ci0JCUltYWdlIGltYWdlID0gamF2YVByb3Bvc2FsLmdldEltYWdlKCk7Ci0JCVN0cmluZyBkaXNwbGF5U3RyaW5nID0gamF2YVByb3Bvc2FsLmdldERpc3BsYXlTdHJpbmcoKTsKLQkJZGlzcGxheVN0cmluZyA9IGdldFRyYW5zbGF0aW9uKCkuZml4dXBNYW5nbGVkTmFtZShkaXNwbGF5U3RyaW5nKTsKLQkJSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24gPSBqYXZhUHJvcG9zYWwuZ2V0Q29udGV4dEluZm9ybWF0aW9uKCk7Ci0JCS8vIGRvbid0IGRvIHRoaXMsIGl0J3Mgc2xvdwotCQkvLyBTdHJpbmcgYWRkaXRpb25hbEluZm8gPSBqYXZhUHJvcG9zYWwuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpOwotCQlpbnQgcmVsZXZhbmNlID0gamF2YVByb3Bvc2FsLmdldFJlbGV2YW5jZSgpOwotCQkKLQkJYm9vbGVhbiB1cGRhdGVMZW5ndGhPblZhbGlkYXRlID0gdHJ1ZTsKLQkJCi0JCWpzcFByb3Bvc2FsID0gbmV3IEF1dG9JbXBvcnRQcm9wb3NhbChjb21wbGV0aW9uLCBuZXdDb21wbGV0aW9uLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb25BZnRlciwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIGNvbnRleHRJbmZvcm1hdGlvbiwgbnVsbCwgcmVsZXZhbmNlLCB1cGRhdGVMZW5ndGhPblZhbGlkYXRlKTsKLQkJCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQ0ODMKLQkJLy8gc2V0IHdyYXBwZWQgamF2YSBwcm9wb3NhbCBzbyBhZGRpdGlvbmFsIGluZm8gY2FuIGJlIGNhbGN1bGF0ZWQgb24gZGVtYW5kCi0JCWpzcFByb3Bvc2FsLnNldEphdmFDb21wbGV0aW9uUHJvcG9zYWwoamF2YVByb3Bvc2FsKTsKLQkJCi0JCXJldHVybiBqc3BQcm9wb3NhbDsKLQl9Ci0KLQlwcml2YXRlIEpTUENvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVKc3BQcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwpIHsKLQkJCi0JCUpTUENvbXBsZXRpb25Qcm9wb3NhbCBqc3BQcm9wb3NhbDsKLQkJU3RyaW5nIGNvbXBsZXRpb24gPSBTdHJpbmcudmFsdWVPZihwcm9wb3NhbC5nZXRDb21wbGV0aW9uKCkpOwotCQkvLyBqYXZhIG9mZnNldAotCQlpbnQgb2Zmc2V0ID0gcHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCk7Ci0JCS8vIHJlcGxhY2VtZW50IGxlbmd0aAotCQlpbnQgbGVuZ3RoID0gcHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpIC0gb2Zmc2V0OwotCQkvLyB0cmFuc2xhdGUgb2Zmc2V0IGZyb20gSmF2YSA+IEpTUAotCQlvZmZzZXQgPSBmVHJhbnNsYXRpb24uZ2V0SnNwT2Zmc2V0KG9mZnNldCk7Ci0JCS8vIGN1cnNvciBwb3NpdGlvbiBhZnRlciBtdXN0IGJlIGNhbGN1bGF0ZWQKLQkJaW50IHBvc2l0aW9uQWZ0ZXIgPSBjYWxjdWxhdGVQb3NpdGlvbkFmdGVyKHByb3Bvc2FsLCBjb21wbGV0aW9uLCBvZmZzZXQpOwotCQkKLQkJLy8gZnJvbSBqYXZhIHByb3Bvc2FsCi0JCUlKYXZhQ29tcGxldGlvblByb3Bvc2FsIGphdmFQcm9wb3NhbCA9IHN1cGVyLmNyZWF0ZUphdmFDb21wbGV0aW9uUHJvcG9zYWwocHJvcG9zYWwpOwotCQlwcm9wb3NhbC5nZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpOwotCQlJbWFnZSBpbWFnZSA9IGphdmFQcm9wb3NhbC5nZXRJbWFnZSgpOwotCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9IGphdmFQcm9wb3NhbC5nZXREaXNwbGF5U3RyaW5nKCk7Ci0JCWRpc3BsYXlTdHJpbmcgPSBnZXRUcmFuc2xhdGlvbigpLmZpeHVwTWFuZ2xlZE5hbWUoZGlzcGxheVN0cmluZyk7Ci0JCUlDb250ZXh0SW5mb3JtYXRpb24gY29udGV4dEluZm9ybWF0aW9uID0gamF2YVByb3Bvc2FsLmdldENvbnRleHRJbmZvcm1hdGlvbigpOwotCQkvLyBTdHJpbmcgYWRkaXRpb25hbEluZm8gPSBqYXZhUHJvcG9zYWwuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpOwotCQlpbnQgcmVsZXZhbmNlID0gamF2YVByb3Bvc2FsLmdldFJlbGV2YW5jZSgpOwotCQkKLQkJYm9vbGVhbiB1cGRhdGVMZW5ndGhPblZhbGlkYXRlID0gdHJ1ZTsKLQkJCi0JCWpzcFByb3Bvc2FsID0gbmV3IEpTUENvbXBsZXRpb25Qcm9wb3NhbChjb21wbGV0aW9uLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb25BZnRlciwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIGNvbnRleHRJbmZvcm1hdGlvbiwgbnVsbCwgcmVsZXZhbmNlLCB1cGRhdGVMZW5ndGhPblZhbGlkYXRlKTsKLQkJCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQ0ODMKLQkJLy8gc2V0IHdyYXBwZWQgamF2YSBwcm9wb3NhbCBzbyBhZGRpdGlvbmFsIGluZm8gY2FuIGJlIGNhbGN1bGF0ZWQgb24gZGVtYW5kCi0JCWpzcFByb3Bvc2FsLnNldEphdmFDb21wbGV0aW9uUHJvcG9zYWwoamF2YVByb3Bvc2FsKTsKLQkJCi0JCXJldHVybiBqc3BQcm9wb3NhbDsKLQl9Ci0KLQkvKioKLQkgKiBDYWNsdWF0ZXMgdGhlIHdoZXJlIHRoZSBjdXJzb3Igc2hvdWxkIGJlIGFmdGVyIGFwcGx5aW5nIHRoaXMgcHJvcG9zYWwuCi0JICogZWcuIG1ldGhvZCh8KSBpZiB0aGUgbWV0aG9kIHByb3Bvc2FsIGNob3NlbiBoYWQgcGFyYW1zLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wb3NhbAotCSAqIEBwYXJhbSBjb21wbGV0aW9uCi0JICogQHBhcmFtIGN1cnJlbnRDdXJzb3JPZmZzZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgY2FsY3VsYXRlUG9zaXRpb25BZnRlcihDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwsIFN0cmluZyBjb21wbGV0aW9uLCBpbnQgY3VycmVudEN1cnNvck9mZnNldCkgewotCQkvLyBjYWxjdWxhdGUgY3Vyc29yIHBvc2l0aW9uIGFmdGVyCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTgzOTgKLQkJLy9pbnQgcG9zaXRpb25BZnRlciA9IGN1cnJlbnRDdXJzb3JPZmZzZXQrY29tcGxldGlvbi5sZW5ndGgoKTsKLQkJaW50IHBvc2l0aW9uQWZ0ZXIgPSBjb21wbGV0aW9uLmxlbmd0aCgpOwotCQkKLQkJaW50IGtpbmQgPSBwcm9wb3NhbC5nZXRLaW5kKCk7Ci0JCQotCQkvLyBtYXkgbmVlZCBiZXR0ZXIgbG9naWMgaGVyZS4uLgotCQkvLyBwdXQgY3Vyc29yIGluc2lkZSBwYXJlbnRoZXNpcyBpZiB0aGVyZSdzIHBhcmFtcwotCQkvLyBvbmx5IGNoZWNraW5nIGZvciBhbnkga2luZCBvZiBkZWNsYXJhdGlvbgotCQlpZihraW5kID09IENvbXBsZXRpb25Qcm9wb3NhbC5BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT04gfHwga2luZCA9PSBDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX0RFQ0xBUkFUSU9OIHx8IGtpbmQgPT0gQ29tcGxldGlvblByb3Bvc2FsLlBPVEVOVElBTF9NRVRIT0RfREVDTEFSQVRJT04gfHwga2luZCA9PSBDb21wbGV0aW9uUHJvcG9zYWwuTUVUSE9EX1JFRikgewotCQkJU3RyaW5nW10gcGFyYW1zID0gU2lnbmF0dXJlLmdldFBhcmFtZXRlclR5cGVzKFN0cmluZy52YWx1ZU9mKHByb3Bvc2FsLmdldFNpZ25hdHVyZSgpKSk7Ci0JCQlpZihjb21wbGV0aW9uLmxlbmd0aCgpID4gMCAmJiBwYXJhbXMubGVuZ3RoID4gMCkKLQkJCQlwb3NpdGlvbkFmdGVyLS07Ci0JCX0KLQkJcmV0dXJuIHBvc2l0aW9uQWZ0ZXI7Ci0JfQotCQotCXN0YXRpYyBjaGFyW10gZ2V0VHlwZVRyaWdnZXJzKCkgewotCQlyZXR1cm4gVFlQRV9UUklHR0VSUzsKLQl9Ci0KLQlwdWJsaWMgSlNQVHJhbnNsYXRpb24gZ2V0VHJhbnNsYXRpb24oKSB7Ci0JCXJldHVybiBmVHJhbnNsYXRpb247Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFRhZ2xpYkRpcmVjdGl2ZUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFRhZ2xpYkRpcmVjdGl2ZUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJmN2QwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BUYWdsaWJEaXJlY3RpdmVDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5GYWNldE1vZHVsZUNvcmVTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSUphclJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUTERSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnRGlyUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRhZ2xpYkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnbGliUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVVSTFJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLlRhZ2xpYkluZGV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSlNQMjBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LklSZWxldmFuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSlNQVGFnbGliRGlyZWN0aXZlQ29udGVudEFzc2lzdFByb2Nlc3NvciBleHRlbmRzIEpTUER1bW15Q29udGVudEFzc2lzdFByb2Nlc3NvciB7Ci0KLQlwdWJsaWMgSlNQVGFnbGliRGlyZWN0aXZlQ29udGVudEFzc2lzdFByb2Nlc3NvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0U21hbGxJbWFnZVVSTChJVGFnbGliUmVjb3JkIHRhZ2xpYlJlY29yZCkgewotCQlTdHJpbmcgdXJsID0gbnVsbDsKLQkJc3dpdGNoICh0YWdsaWJSZWNvcmQuZ2V0UmVjb3JkVHlwZSgpKSB7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLlRMRCkgOiB7Ci0JCQkJSVRMRFJlY29yZCByZWNvcmQgPSAoSVRMRFJlY29yZCkgdGFnbGliUmVjb3JkOwotCQkJCUlSZXNvdXJjZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHJlY29yZC5nZXRQYXRoKCkpOwotCQkJCWlmIChmaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCAmJiByZWNvcmQuZ2V0RGVzY3JpcHRvcigpLmdldFNtYWxsSWNvbigpLmxlbmd0aCgpID4gMCkgewotCQkJCQl1cmwgPSAiZmlsZToiICsgRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5yZXNvbHZlKGZpbGUuZ2V0RnVsbFBhdGgoKSwgcmVjb3JkLmdldERlc2NyaXB0b3IoKS5nZXRTbWFsbEljb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLkpBUikgOiB7Ci0JCQkJSUphclJlY29yZCByZWNvcmQgPSAoSUphclJlY29yZCkgdGFnbGliUmVjb3JkOwotCQkJCWlmIChyZWNvcmQuZ2V0RGVzY3JpcHRvcigpLmdldFNtYWxsSWNvbigpLmxlbmd0aCgpID4gMCkgewotCQkJCQkvLyB1cmwgPSAiZmlsZToiICsKLQkJCQkJLy8gVVJJSGVscGVyLm5vcm1hbGl6ZShyZWNvcmQuZ2V0RGVzY3JpcHRvcigpLmdldFNtYWxsSWNvbigpLAotCQkJCQkvLyByZWNvcmQuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpLCAiLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5UQUdESVIpIDogewotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5VUkwpIDogewotCQkJCUlVUkxSZWNvcmQgcmVjb3JkID0gKElVUkxSZWNvcmQpIHRhZ2xpYlJlY29yZDsKLQkJCQlpZiAocmVjb3JkLmdldERlc2NyaXB0b3IoKS5nZXRTbWFsbEljb24oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJdXJsID0gVVJJSGVscGVyLm5vcm1hbGl6ZShyZWNvcmQuZ2V0RGVzY3JpcHRvcigpLmdldFNtYWxsSWNvbigpLCByZWNvcmQuZ2V0VVJMKCkudG9TdHJpbmcoKSwgIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJSVBhdGggYmFzZVBhdGggPSBnZXRCYXNlUGF0aChjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCWlmIChiYXNlUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKTsKLQotCQkvLyBGaW5kIHRoZSBhdHRyaWJ1dGUgbmFtZSBmb3Igd2hpY2ggdGhpcyBwb3NpdGlvbiBzaG91bGQgaGF2ZSBhIHZhbHVlCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb3BlbiA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVRleHRSZWdpb25MaXN0IG9wZW5SZWdpb25zID0gb3Blbi5nZXRSZWdpb25zKCk7Ci0JCWludCBpID0gb3BlblJlZ2lvbnMuaW5kZXhPZihjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSk7Ci0JCWlmIChpIDwgMCkKLQkJCXJldHVybjsKLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChpID49IDApIHsKLQkJCW5hbWVSZWdpb24gPSBvcGVuUmVnaW9ucy5nZXQoaS0tKTsKLQkJCWlmIChuYW1lUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IG51bGw7Ci0JCWlmIChuYW1lUmVnaW9uICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVOYW1lID0gb3Blbi5nZXRUZXh0KG5hbWVSZWdpb24pOwotCi0JCVN0cmluZyBjdXJyZW50VmFsdWUgPSBudWxsOwotCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpCi0JCQljdXJyZW50VmFsdWUgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRUZXh0KCk7Ci0JCWVsc2UKLQkJCWN1cnJlbnRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBtYXRjaFN0cmluZyA9IG51bGw7Ci0JCS8vIGZpeHVwcwotCQlpbnQgc3RhcnQgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKTsKLQkJaW50IGxlbmd0aCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCk7Ci0JCWlmIChjdXJyZW50VmFsdWUubGVuZ3RoKCkgPiBTdHJpbmdVdGlscy5zdHJpcChjdXJyZW50VmFsdWUpLmxlbmd0aCgpICYmIChjdXJyZW50VmFsdWUuc3RhcnRzV2l0aCgiXCIiKSB8fCBjdXJyZW50VmFsdWUuc3RhcnRzV2l0aCgiJyIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJJiYgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsKLQkJCW1hdGNoU3RyaW5nID0gY3VycmVudFZhbHVlLnN1YnN0cmluZygxLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpKTsKLQkJfQotCQllbHNlCi0JCQltYXRjaFN0cmluZyA9IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoMCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSk7Ci0JCWJvb2xlYW4gZXhpc3RpbmdDb21wbGljYXRlZFZhbHVlID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkgIT0gbnVsbCAmJiBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyOwotCQlpZiAoZXhpc3RpbmdDb21wbGljYXRlZFZhbHVlKSB7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRQcm9wb3NhbHMoKS5jbGVhcigpOwotCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWFjcm9zKCkuY2xlYXIoKTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBsb3dlckNhc2VNYXRjaCA9IG1hdGNoU3RyaW5nLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7Ci0JCQlpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1VSSSkpIHsKLQkJCQlJVGFnbGliUmVjb3JkW10gYXZhaWxhYmxlVGFnbGliUmVjb3JkcyA9IFRhZ2xpYkluZGV4LmdldEF2YWlsYWJsZVRhZ2xpYlJlY29yZHMoYmFzZVBhdGgpOwotCQkJCS8qCi0JCQkJICogYSBzaW1wbGUgZW5vdWdoIHdheSB0byByZW1vdmUgZHVwbGljYXRlcyAocmVzb2x1dGlvbiBhdAotCQkJCSAqIHJ1bnRpbWUgd291bGQgYmUgbm9uZGV0ZXJtaW5pc3RpYyBhbnl3YXkpCi0JCQkJICovCi0JCQkJTWFwIHVyaVRvUmVjb3JkcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJZm9yIChpbnQgdGFnbGliUmVjb3JkTnVtYmVyID0gMDsgdGFnbGliUmVjb3JkTnVtYmVyIDwgYXZhaWxhYmxlVGFnbGliUmVjb3Jkcy5sZW5ndGg7IHRhZ2xpYlJlY29yZE51bWJlcisrKSB7Ci0JCQkJCUlUYWdsaWJSZWNvcmQgdGFnbGliUmVjb3JkID0gYXZhaWxhYmxlVGFnbGliUmVjb3Jkc1t0YWdsaWJSZWNvcmROdW1iZXJdOwotCQkJCQlJVGFnbGliRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gdGFnbGliUmVjb3JkLmdldERlc2NyaXB0b3IoKTsKLQkJCQkJU3RyaW5nIHVyaSA9IG51bGw7Ci0JCQkJCXN3aXRjaCAodGFnbGliUmVjb3JkLmdldFJlY29yZFR5cGUoKSkgewotCQkJCQkJY2FzZSBJVGFnbGliUmVjb3JkLlVSTCA6Ci0JCQkJCQkJdXJpID0gZGVzY3JpcHRvci5nZXRVUkkoKTsKLQkJCQkJCQl1cmlUb1JlY29yZHMucHV0KHVyaSwgdGFnbGliUmVjb3JkKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgSVRhZ2xpYlJlY29yZC5KQVIgOiB7Ci0JCQkJCQkJSVBhdGggbG9jYXRpb24gPSAoKElKYXJSZWNvcmQpIHRhZ2xpYlJlY29yZCkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCQlJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihsb2NhdGlvbik7Ci0JCQkJCQkJSVBhdGggbG9jYWxDb250ZXh0Um9vdCA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQuY29tcHV0ZVdlYkNvbnRlbnRSb290UGF0aChiYXNlUGF0aCk7Ci0JCQkJCQkJZm9yIChpbnQgZmlsZU51bWJlciA9IDA7IGZpbGVOdW1iZXIgPCBmaWxlcy5sZW5ndGg7IGZpbGVOdW1iZXIrKykgewotCQkJCQkJCQlpZiAobG9jYWxDb250ZXh0Um9vdC5pc1ByZWZpeE9mKGZpbGVzW2ZpbGVOdW1iZXJdLmdldEZ1bGxQYXRoKCkpKSB7Ci0JCQkJCQkJCQl1cmkgPSBJUGF0aC5TRVBBUkFUT1IgKyBmaWxlc1tmaWxlTnVtYmVyXS5nZXRGdWxsUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMobG9jYWxDb250ZXh0Um9vdC5zZWdtZW50Q291bnQoKSkudG9TdHJpbmcoKTsKLQkJCQkJCQkJCXVyaVRvUmVjb3Jkcy5wdXQodXJpLCB0YWdsaWJSZWNvcmQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJdXJpID0gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5nZXRSdW50aW1lUGF0aChmaWxlc1tmaWxlTnVtYmVyXS5nZXRGdWxsUGF0aCgpKS50b1N0cmluZygpOwotCQkJCQkJCQkJdXJpVG9SZWNvcmRzLnB1dCh1cmksIHRhZ2xpYlJlY29yZCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQljYXNlIElUYWdsaWJSZWNvcmQuVExEIDogewotCQkJCQkJCUlQYXRoIHBhdGggPSAoKElUTERSZWNvcmQpIHRhZ2xpYlJlY29yZCkuZ2V0UGF0aCgpOwotCQkJCQkJCUlQYXRoIGxvY2FsQ29udGV4dFJvb3QgPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0LmNvbXB1dGVXZWJDb250ZW50Um9vdFBhdGgoYmFzZVBhdGgpOwotCQkJCQkJCWlmIChsb2NhbENvbnRleHRSb290LmlzUHJlZml4T2YocGF0aCkpIHsKLQkJCQkJCQkJdXJpID0gSVBhdGguU0VQQVJBVE9SICsgcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKGxvY2FsQ29udGV4dFJvb3Quc2VnbWVudENvdW50KCkpLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCXVyaVRvUmVjb3Jkcy5wdXQodXJpLCB0YWdsaWJSZWNvcmQpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJdXJpID0gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5nZXRSdW50aW1lUGF0aChwYXRoKS50b1N0cmluZygpOwotCQkJCQkJCQl1cmlUb1JlY29yZHMucHV0KHVyaSwgdGFnbGliUmVjb3JkKTsKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLyoKLQkJCQkgKiB1c2UgdGhlIHJlY29yZHMgYW5kIHRoZWlyIGRlc2NyaXB0b3JzIHRvIGNvbnN0cnVjdAotCQkJCSAqIHByb3Bvc2FscwotCQkJCSAqLwotCQkJCU9iamVjdFtdIHVyaXMgPSB1cmlUb1JlY29yZHMua2V5U2V0KCkudG9BcnJheSgpOwotCQkJCWZvciAoaW50IHVyaU51bWJlciA9IDA7IHVyaU51bWJlciA8IHVyaXMubGVuZ3RoOyB1cmlOdW1iZXIrKykgewotCQkJCQlTdHJpbmcgdXJpID0gdXJpc1t1cmlOdW1iZXJdLnRvU3RyaW5nKCk7Ci0JCQkJCUlUYWdsaWJSZWNvcmQgdGFnbGliUmVjb3JkID0gKElUYWdsaWJSZWNvcmQpIHVyaVRvUmVjb3Jkcy5nZXQodXJpKTsKLQkJCQkJSVRhZ2xpYkRlc2NyaXB0b3IgZGVzY3JpcHRvciA9ICh0YWdsaWJSZWNvcmQpLmdldERlc2NyaXB0b3IoKTsKLQkJCQkJaWYgKHVyaSAhPSBudWxsICYmIHVyaS5sZW5ndGgoKSA+IDAgJiYgKG1hdGNoU3RyaW5nLmxlbmd0aCgpID09IDAgfHwgdXJpLnRvTG93ZXJDYXNlKExvY2FsZS5VUykuc3RhcnRzV2l0aChsb3dlckNhc2VNYXRjaCkpKSB7Ci0JCQkJCQlTdHJpbmcgdXJsID0gZ2V0U21hbGxJbWFnZVVSTCh0YWdsaWJSZWNvcmQpOwotCQkJCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEpTUFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldERlc2NyaXB0b3IodXJsKTsKLQkJCQkJCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCAmJiB1cmwgIT0gbnVsbCkgewotCQkJCQkJCVVSTCBpbWFnZVVSTDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpbWFnZVVSTCA9IG5ldyBVUkwodXJsKTsKLQkJCQkJCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaW1hZ2VVUkwpOwotCQkJCQkJCQlKU1BVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlUmVnaXN0cnkoKS5wdXQodXJsLCBpbWFnZURlc2NyaXB0b3IpOwotCQkJCQkJCX0KLQkJCQkJCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgYWRkaXRpb25hbEluZm8gPSBkZXNjcmlwdG9yLmdldERlc2NyaXB0aW9uKCkgKyAiPGJyLz4iICsgZGVzY3JpcHRvci5nZXRUbGliVmVyc2lvbigpOwotCQkJCQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpbWFnZSA9IEpTUFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldCh1cmwpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQkJaW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVFJJQlVURSk7Ci0JCQkJCQl9Ci0JCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCJcIiIgKyB1cmkgKyAiXCIiLCBzdGFydCwgbGVuZ3RoLCB1cmkubGVuZ3RoKCkgKyAyLCBpbWFnZSwgdXJpLCBudWxsLCBhZGRpdGlvbmFsSW5mbywgSVJlbGV2YW5jZUNvbnN0YW50cy5SX05PTkUpOwotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBR0RJUikpIHsKLQkJCQlJVGFnbGliUmVjb3JkW10gYXZhaWxhYmxlVGFnbGliUmVjb3JkcyA9IFRhZ2xpYkluZGV4LmdldEF2YWlsYWJsZVRhZ2xpYlJlY29yZHMoYmFzZVBhdGgpOwotCQkJCS8qCi0JCQkJICogYSBzaW1wbGUgZW5vdWdoIHdheSB0byByZW1vdmUgZHVwbGljYXRlcyAocmVzb2x1dGlvbiBhdAotCQkJCSAqIHJ1bnRpbWUgd291bGQgYmUgbm9uZGV0ZXJtaW5pc3RpYyBhbnl3YXkpCi0JCQkJICovCi0JCQkJTWFwIHVyaVRvUmVjb3JkcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJZm9yIChpbnQgdGFnbGliUmVjb3JkTnVtYmVyID0gMDsgdGFnbGliUmVjb3JkTnVtYmVyIDwgYXZhaWxhYmxlVGFnbGliUmVjb3Jkcy5sZW5ndGg7IHRhZ2xpYlJlY29yZE51bWJlcisrKSB7Ci0JCQkJCUlUYWdsaWJSZWNvcmQgdGFnbGliUmVjb3JkID0gYXZhaWxhYmxlVGFnbGliUmVjb3Jkc1t0YWdsaWJSZWNvcmROdW1iZXJdOwotCQkJCQlTdHJpbmcgdXJpID0gbnVsbDsKLQkJCQkJaWYgKHRhZ2xpYlJlY29yZC5nZXRSZWNvcmRUeXBlKCkgPT0gSVRhZ2xpYlJlY29yZC5UQUdESVIpIHsKLQkJCQkJCUlQYXRoIHBhdGggPSAoKElUYWdEaXJSZWNvcmQpIHRhZ2xpYlJlY29yZCkuZ2V0UGF0aCgpOwotCQkJCQkJSVBhdGggbG9jYWxDb250ZXh0Um9vdCA9IFRhZ2xpYkluZGV4LmdldENvbnRleHRSb290KGJhc2VQYXRoKTsKLQkJCQkJCWlmIChsb2NhbENvbnRleHRSb290LmlzUHJlZml4T2YocGF0aCkpIHsKLQkJCQkJCQl1cmkgPSBJUGF0aC5TRVBBUkFUT1IgKyBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMobG9jYWxDb250ZXh0Um9vdC5zZWdtZW50Q291bnQoKSkudG9TdHJpbmcoKTsKLQkJCQkJCQl1cmlUb1JlY29yZHMucHV0KHVyaSwgdGFnbGliUmVjb3JkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkvKgotCQkJCSAqIHVzZSB0aGUgcmVjb3JkcyBhbmQgdGhlaXIgZGVzY3JpcHRvcnMgdG8gY29uc3RydWN0Ci0JCQkJICogcHJvcG9zYWxzCi0JCQkJICovCi0JCQkJT2JqZWN0W10gdXJpcyA9IHVyaVRvUmVjb3Jkcy5rZXlTZXQoKS50b0FycmF5KCk7Ci0JCQkJZm9yIChpbnQgdXJpTnVtYmVyID0gMDsgdXJpTnVtYmVyIDwgdXJpcy5sZW5ndGg7IHVyaU51bWJlcisrKSB7Ci0JCQkJCVN0cmluZyB1cmkgPSB1cmlzW3VyaU51bWJlcl0udG9TdHJpbmcoKTsKLQkJCQkJSVRhZ2xpYlJlY29yZCB0YWdsaWJSZWNvcmQgPSAoSVRhZ2xpYlJlY29yZCkgdXJpVG9SZWNvcmRzLmdldCh1cmkpOwotCQkJCQlJVGFnbGliRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKHRhZ2xpYlJlY29yZCkuZ2V0RGVzY3JpcHRvcigpOwotCQkJCQlpZiAodXJpICE9IG51bGwgJiYgdXJpLmxlbmd0aCgpID4gMCAmJiAobWF0Y2hTdHJpbmcubGVuZ3RoKCkgPT0gMCB8fCB1cmkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKS5zdGFydHNXaXRoKGxvd2VyQ2FzZU1hdGNoKSkpIHsKLQkJCQkJCVN0cmluZyB1cmwgPSBnZXRTbWFsbEltYWdlVVJMKHRhZ2xpYlJlY29yZCk7Ci0JCQkJCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gbnVsbDsKLQkJCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQkJCWltYWdlRGVzY3JpcHRvciA9IEpTUFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldERlc2NyaXB0b3IodXJsKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCAmJiB1cmwgIT0gbnVsbCkgewotCQkJCQkJCVVSTCBpbWFnZVVSTDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpbWFnZVVSTCA9IG5ldyBVUkwodXJsKTsKLQkJCQkJCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaW1hZ2VVUkwpOwotCQkJCQkJCQlKU1BVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlUmVnaXN0cnkoKS5wdXQodXJsLCBpbWFnZURlc2NyaXB0b3IpOwotCQkJCQkJCX0KLQkJCQkJCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgYWRkaXRpb25hbEluZm8gPSBkZXNjcmlwdG9yLmdldERlc2NyaXB0aW9uKCkgKyAiPGJyLz4iICsgZGVzY3JpcHRvci5nZXRUbGliVmVyc2lvbigpOwotCQkJCQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpbWFnZSA9IEpTUFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldCh1cmwpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQkJaW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVFJJQlVURSk7Ci0JCQkJCQl9Ci0JCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCJcIiIgKyB1cmkgKyAiXCIiLCBzdGFydCwgbGVuZ3RoLCB1cmkubGVuZ3RoKCkgKyAyLCBpbWFnZSwgdXJpLCBudWxsLCBhZGRpdGlvbmFsSW5mbywgSVJlbGV2YW5jZUNvbnN0YW50cy5SX05PTkUpOwotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1BSRUZJWCkpIHsKLQkJCQlOb2RlIHVyaUF0dHIgPSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1VSSSk7Ci0JCQkJU3RyaW5nIHVyaSA9IG51bGw7Ci0JCQkJaWYgKHVyaUF0dHIgIT0gbnVsbCkgewotCQkJCQl1cmkgPSB1cmlBdHRyLmdldE5vZGVWYWx1ZSgpOwotCQkJCQlJVGFnbGliUmVjb3JkW10gYXZhaWxhYmxlVGFnbGliUmVjb3JkcyA9IFRhZ2xpYkluZGV4LmdldEF2YWlsYWJsZVRhZ2xpYlJlY29yZHMoYmFzZVBhdGgpOwotCQkJCQlNYXAgcHJlZml4TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkJZm9yIChpbnQgdGFnbGlicmVjb3JkTnVtYmVyID0gMDsgdGFnbGlicmVjb3JkTnVtYmVyIDwgYXZhaWxhYmxlVGFnbGliUmVjb3Jkcy5sZW5ndGg7IHRhZ2xpYnJlY29yZE51bWJlcisrKSB7Ci0JCQkJCQlJVGFnbGliRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gYXZhaWxhYmxlVGFnbGliUmVjb3Jkc1t0YWdsaWJyZWNvcmROdW1iZXJdLmdldERlc2NyaXB0b3IoKTsKLQkJCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwgJiYgZGVzY3JpcHRvci5nZXRVUkkoKSAhPSBudWxsICYmIGRlc2NyaXB0b3IuZ2V0VVJJKCkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKS5lcXVhbHModXJpLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpKSB7Ci0JCQkJCQkJU3RyaW5nIHNob3J0TmFtZSA9IGRlc2NyaXB0b3IuZ2V0U2hvcnROYW1lKCkudHJpbSgpOwotCQkJCQkJCWlmIChzaG9ydE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCWJvb2xlYW4gdmFsaWQgPSB0cnVlOwotCQkJCQkJCQlmb3IgKGludCBjaGFyYWN0ZXIgPSAwOyBjaGFyYWN0ZXIgPCBzaG9ydE5hbWUubGVuZ3RoKCk7IGNoYXJhY3RlcisrKSB7Ci0JCQkJCQkJCQl2YWxpZCA9IHZhbGlkICYmICFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHNob3J0TmFtZS5jaGFyQXQoY2hhcmFjdGVyKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKHZhbGlkKSB7Ci0JCQkJCQkJCQlwcmVmaXhNYXAucHV0KHNob3J0TmFtZSwgZGVzY3JpcHRvcik7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJT2JqZWN0IHByZWZpeGVzW10gPSBwcmVmaXhNYXAua2V5U2V0KCkudG9BcnJheSgpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHByZWZpeGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgcHJlZml4ZXNbal07Ci0JCQkJCQlJVGFnbGliRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKElUYWdsaWJEZXNjcmlwdG9yKSBwcmVmaXhNYXAuZ2V0KHByZWZpeCk7Ci0JCQkJCQlJbWFnZSBpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQVRUUklCVVRFKTsKLQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIlwiIiArIHByZWZpeCArICJcIiIsIHN0YXJ0LCBsZW5ndGgsIHByZWZpeC5sZW5ndGgoKSArIDIsIGltYWdlLCBwcmVmaXgsIG51bGwsIGRlc2NyaXB0b3IuZ2V0RGVzY3JpcHRpb24oKSwgSVJlbGV2YW5jZUNvbnN0YW50cy5SX05PTkUpOwotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlOb2RlIGRpckF0dHIgPSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBR0RJUik7Ci0JCQkJCWlmIChkaXJBdHRyICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBkaXIgPSBkaXJBdHRyLmdldE5vZGVWYWx1ZSgpOwotCQkJCQkJaWYgKGRpciAhPSBudWxsKSB7Ci0JCQkJCQkJSVRhZ2xpYlJlY29yZCByZWNvcmQgPSBUYWdsaWJJbmRleC5yZXNvbHZlKGJhc2VQYXRoLnRvU3RyaW5nKCksIGRpciwgZmFsc2UpOwotCQkJCQkJCWlmIChyZWNvcmQgIT0gbnVsbCkgewotCQkJCQkJCQlJVGFnbGliRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gcmVjb3JkLmdldERlc2NyaXB0b3IoKTsKLQkJCQkJCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQkJCQkJU3RyaW5nIHNob3J0TmFtZSA9IGRlc2NyaXB0b3IuZ2V0U2hvcnROYW1lKCk7Ci0KLQkJCQkJCQkJCUltYWdlIGltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRSSUJVVEUpOwotCQkJCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiXCIiICsgc2hvcnROYW1lICsgIlwiIiwgc3RhcnQsIGxlbmd0aCwgc2hvcnROYW1lLmxlbmd0aCgpICsgMiwgaW1hZ2UsIHNob3J0TmFtZSwgbnVsbCwgZGVzY3JpcHRvci5nZXREZXNjcmlwdGlvbigpLCBJUmVsZXZhbmNlQ29uc3RhbnRzLlJfTk9ORSk7Ci0JCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQlpZiAoZGlyLnN0YXJ0c1dpdGgoIi9XRUItSU5GLyIpKSB7Ci0JCQkJCQkJCQkJZGlyID0gZGlyLnN1YnN0cmluZyg5KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCVN0cmluZyBwcmVmaXggPSBTdHJpbmdVdGlscy5yZXBsYWNlKGRpciwgIi8iLCAiLSIpOwotCi0JCQkJCQkJCQlJbWFnZSBpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQVRUUklCVVRFKTsKLQkJCQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIlwiIiArIHByZWZpeCArICJcIiIsIHN0YXJ0LCBsZW5ndGgsIHByZWZpeC5sZW5ndGgoKSArIDIsIGltYWdlLCBwcmVmaXgsIG51bGwsIG51bGwsIElSZWxldmFuY2VDb25zdGFudHMuUl9OT05FKTsKLQkJCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgcHJvamVjdCByZXF1ZXN0IGlzIGluCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJUGF0aCBnZXRCYXNlUGF0aChDb250ZW50QXNzaXN0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUlQYXRoIGJhc2Vsb2NhdGlvbiA9IG51bGw7Ci0KLQkJaWYgKHJlcXVlc3QgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSByZXF1ZXN0LmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSByZWdpb24uZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkJCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQkJCWJhc2Vsb2NhdGlvbiA9IG5ldyBQYXRoKGxvY2F0aW9uKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJhc2Vsb2NhdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1M2EyMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVQcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSlNQRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBDb21wbGV0aW9uIHByb2Nlc3NvciBmb3IgSlNQIFRlbXBsYXRlcy4gTW9zdCBvZiB0aGUgd29yayBpcyBhbHJlYWR5IGRvbmUgYnkKLSAqIHRoZSBKU1AgQ29udGVudCBBc3Npc3QgcHJvY2Vzc29yLCBzbyBieSB0aGUgdGltZSB0aGUKLSAqIEpTUFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBpcyBhc2tlZCBmb3IgY29udGVudCBhc3Npc3QgcHJvcG9zYWxzLCB0aGUKLSAqIGpzcCBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3IgaGFzIGFscmVhZHkgc2V0IHRoZSBjb250ZXh0IHR5cGUgZm9yCi0gKiB0ZW1wbGF0ZXMuCi0gKi8KLWNsYXNzIEpTUFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBleHRlbmRzIFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUHJvcG9zYWxDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJcmV0dXJuICgoVGVtcGxhdGVQcm9wb3NhbCkgbzIpLmdldFJlbGV2YW5jZSgpIC0gKChUZW1wbGF0ZVByb3Bvc2FsKSBvMSkuZ2V0UmVsZXZhbmNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIGZnUHJvcG9zYWxDb21wYXJhdG9yID0gbmV3IFByb3Bvc2FsQ29tcGFyYXRvcigpOwotCXByaXZhdGUgU3RyaW5nIGZDb250ZXh0VHlwZUlkID0gbnVsbDsKLQotCS8qCi0JICogQ29waWVkIGZyb20gc3VwZXIgY2xhc3MgZXhjZXB0IGluc3RlYWQgb2YgY2FsbGluZyBjcmVhdGVDb250ZXh0KHZpZXdlciwKLQkgKiByZWdpb24pIGNhbGwgY3JlYXRlQ29udGV4dCh2aWV3ZXIsIHJlZ2lvbiwgb2Zmc2V0KSBpbnN0ZWFkCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQotCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCi0JCS8vIGFkanVzdCBvZmZzZXQgdG8gZW5kIG9mIG5vcm1hbGl6ZWQgc2VsZWN0aW9uCi0JCWlmIChzZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgPT0gb2Zmc2V0KQotCQkJb2Zmc2V0ID0gc2VsZWN0aW9uLmdldE9mZnNldCgpICsgc2VsZWN0aW9uLmdldExlbmd0aCgpOwotCi0JCVN0cmluZyBwcmVmaXggPSBleHRyYWN0UHJlZml4KHZpZXdlciwgb2Zmc2V0KTsKLQkJUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24ob2Zmc2V0IC0gcHJlZml4Lmxlbmd0aCgpLCBwcmVmaXgubGVuZ3RoKCkpOwotCQlUZW1wbGF0ZUNvbnRleHQgY29udGV4dCA9IGNyZWF0ZUNvbnRleHQodmlld2VyLCByZWdpb24sIG9mZnNldCk7Ci0JCWlmIChjb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0KLQkJLy8gbmFtZSBvZiB0aGUgc2VsZWN0aW9uIHZhcmlhYmxlcyB7bGluZSwgd29yZH1fc2VsZWN0aW9uCi0JCWNvbnRleHQuc2V0VmFyaWFibGUoInNlbGVjdGlvbiIsIHNlbGVjdGlvbi5nZXRUZXh0KCkpOyAvLyAvLyROT04tTkxTLTEkCi0KLQkJVGVtcGxhdGVbXSB0ZW1wbGF0ZXMgPSBnZXRUZW1wbGF0ZXMoY29udGV4dC5nZXRDb250ZXh0VHlwZSgpLmdldElkKCkpOwotCi0JCUxpc3QgbWF0Y2hlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wbGF0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gdGVtcGxhdGVzW2ldOwotCQkJdHJ5IHsKLQkJCQljb250ZXh0LmdldENvbnRleHRUeXBlKCkudmFsaWRhdGUodGVtcGxhdGUuZ2V0UGF0dGVybigpKTsKLQkJCX0KLQkJCWNhdGNoIChUZW1wbGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAodGVtcGxhdGUubWF0Y2hlcyhwcmVmaXgsIGNvbnRleHQuZ2V0Q29udGV4dFR5cGUoKS5nZXRJZCgpKSkKLQkJCQltYXRjaGVzLmFkZChjcmVhdGVQcm9wb3NhbCh0ZW1wbGF0ZSwgY29udGV4dCwgKElSZWdpb24pIHJlZ2lvbiwgZ2V0UmVsZXZhbmNlKHRlbXBsYXRlLCBwcmVmaXgpKSk7Ci0JCX0KLQotCQlDb2xsZWN0aW9ucy5zb3J0KG1hdGNoZXMsIGZnUHJvcG9zYWxDb21wYXJhdG9yKTsKLQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgbWF0Y2hlcy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW21hdGNoZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbmNyZXRlIHRlbXBsYXRlIGNvbnRleHQgZm9yIHRoZSBnaXZlbiByZWdpb24gaW4gdGhlCi0JICogZG9jdW1lbnQuIFRoaXMgaW52b2x2ZXMgZmluZGluZyBvdXQgd2hpY2ggY29udGV4dCB0eXBlIGlzIHZhbGlkIGF0IHRoZQotCSAqIGdpdmVuIGxvY2F0aW9uLCBhbmQgdGhlbiBjcmVhdGluZyBhIGNvbnRleHQgb2YgdGhpcyB0eXBlLiBUaGUgZGVmYXVsdAotCSAqIGltcGxlbWVudGF0aW9uIHJldHVybnMgYSA8Y29kZT5TbWFydFJlcGxhY2VUZW1wbGF0ZUNvbnRleHQ8L2NvZGU+IGZvcgotCSAqIHRoZSBjb250ZXh0IHR5cGUgYXQgdGhlIGdpdmVuIGxvY2F0aW9uLiBUaGlzIHRha2VzIHRoZSBvZmZzZXQgYXQgd2hpY2gKLQkgKiBjb250ZW50IGFzc2lzdCB3YXMgaW52b2tlZCBpbnRvIGNvbnNpZGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHZpZXdlciBmb3Igd2hpY2ggdGhlIGNvbnRleHQgaXMgY3JlYXRlZAotCSAqIEBwYXJhbSByZWdpb24KLQkgKiAgICAgICAgICAgIHRoZSByZWdpb24gaW50byA8Y29kZT5kb2N1bWVudDwvY29kZT4gZm9yIHdoaWNoIHRoZQotCSAqICAgICAgICAgICAgY29udGV4dCBpcyBjcmVhdGVkCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIG9mZnNldCB3aGVyZSBjb250ZW50IGFzc2lzdCB3YXMgaW52b2tlZAotCSAqIEByZXR1cm4gYSB0ZW1wbGF0ZSBjb250ZXh0IHRoYXQgY2FuIGhhbmRsZSB0ZW1wbGF0ZSBpbnNlcnRpb24gYXQgdGhlCi0JICogICAgICAgICBnaXZlbiBsb2NhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIFRlbXBsYXRlQ29udGV4dCBjcmVhdGVDb250ZXh0KElUZXh0Vmlld2VyIHZpZXdlciwgSVJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQpIHsKLQkJLy8gcHJldHR5IG11Y2ggc2FtZSBjb2RlIGFzIHN1cGVyLmNyZWF0ZUNvbnRleHQgZXhjZXB0IGNyZWF0ZQotCQkvLyBTbWFydFJlcGxhY2VUZW1wbGF0ZUNvbnRleHQKLQkJVGVtcGxhdGVDb250ZXh0VHlwZSBjb250ZXh0VHlwZSA9IGdldENvbnRleHRUeXBlKHZpZXdlciwgcmVnaW9uKTsKLQkJaWYgKGNvbnRleHRUeXBlICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHZpZXdlci5nZXREb2N1bWVudCgpOwotCQkJcmV0dXJuIG5ldyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dChjb250ZXh0VHlwZSwgZG9jdW1lbnQsIHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpLCBvZmZzZXQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZVByb3Bvc2FsKFRlbXBsYXRlIHRlbXBsYXRlLCBUZW1wbGF0ZUNvbnRleHQgY29udGV4dCwgSVJlZ2lvbiByZWdpb24sIGludCByZWxldmFuY2UpIHsKLQkJcmV0dXJuIG5ldyBDdXN0b21UZW1wbGF0ZVByb3Bvc2FsKHRlbXBsYXRlLCBjb250ZXh0LCByZWdpb24sIGdldEltYWdlKHRlbXBsYXRlKSwgcmVsZXZhbmNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGVtcGxhdGVDb250ZXh0VHlwZSBnZXRDb250ZXh0VHlwZShJVGV4dFZpZXdlciB2aWV3ZXIsIElSZWdpb24gcmVnaW9uKSB7Ci0JCVRlbXBsYXRlQ29udGV4dFR5cGUgdHlwZSA9IG51bGw7Ci0KLQkJQ29udGV4dFR5cGVSZWdpc3RyeSByZWdpc3RyeSA9IGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCk7Ci0JCWlmIChyZWdpc3RyeSAhPSBudWxsKQotCQkJdHlwZSA9IHJlZ2lzdHJ5LmdldENvbnRleHRUeXBlKGZDb250ZXh0VHlwZUlkKTsKLQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoVGVtcGxhdGUgdGVtcGxhdGUpIHsKLQkJLy8ganVzdCByZXR1cm4gdGhlIHNhbWUgaW1hZ2UgZm9yIG5vdwotCQlyZXR1cm4gSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfSlNQKTsKLQl9Ci0KLQlwcml2YXRlIENvbnRleHRUeXBlUmVnaXN0cnkgZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGVtcGxhdGVbXSBnZXRUZW1wbGF0ZXMoU3RyaW5nIGNvbnRleHRUeXBlSWQpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGVzW10gPSBudWxsOwotCi0JCVRlbXBsYXRlU3RvcmUgc3RvcmUgPSBnZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWlmIChzdG9yZSAhPSBudWxsKQotCQkJdGVtcGxhdGVzID0gc3RvcmUuZ2V0VGVtcGxhdGVzKGNvbnRleHRUeXBlSWQpOwotCi0JCXJldHVybiB0ZW1wbGF0ZXM7Ci0JfQotCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCXJldHVybiBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVTdG9yZSgpOwotCX0KLQotCXZvaWQgc2V0Q29udGV4dFR5cGUoU3RyaW5nIGNvbnRleHRUeXBlSWQpIHsKLQkJZkNvbnRleHRUeXBlSWQgPSBjb250ZXh0VHlwZUlkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFVzZUJlYW5Db250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BVc2VCZWFuQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjA5ODZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFVzZUJlYW5Db250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCi0vKioKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSlNQVXNlQmVhbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZXh0ZW5kcyBKU1BEdW1teUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgewotCi0JcHVibGljIEpTUFVzZUJlYW5Db250ZW50QXNzaXN0UHJvY2Vzc29yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0KLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpOwotCi0JCS8vIEZpbmQgdGhlIGF0dHJpYnV0ZSBuYW1lIGZvciB3aGljaCB0aGlzIHBvc2l0aW9uIHNob3VsZCBoYXZlIGEgdmFsdWUKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvcGVuID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJVGV4dFJlZ2lvbkxpc3Qgb3BlblJlZ2lvbnMgPSBvcGVuLmdldFJlZ2lvbnMoKTsKLQkJaW50IGkgPSBvcGVuUmVnaW9ucy5pbmRleE9mKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpKTsKLQkJaWYgKGkgPCAwKQotCQkJcmV0dXJuOwotCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKGkgPj0gMCkgewotCQkJbmFtZVJlZ2lvbiA9IG9wZW5SZWdpb25zLmdldChpLS0pOwotCQkJaWYgKG5hbWVSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkKLQkJCQlicmVhazsKLQkJfQotCi0JCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gbnVsbDsKLQkJaWYgKG5hbWVSZWdpb24gIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZU5hbWUgPSBvcGVuLmdldFRleHQobmFtZVJlZ2lvbik7Ci0KLQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IG51bGw7Ci0JCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkKLQkJCWN1cnJlbnRWYWx1ZSA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFRleHQoKTsKLQkJZWxzZQotCQkJY3VycmVudFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG1hdGNoU3RyaW5nID0gbnVsbDsKLQkJLy8gZml4dXBzCi0JCWludCBzdGFydCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpOwotCQlpbnQgbGVuZ3RoID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKTsKLQkJaWYgKGN1cnJlbnRWYWx1ZS5sZW5ndGgoKSA+IFN0cmluZ1V0aWxzLnN0cmlwKGN1cnJlbnRWYWx1ZSkubGVuZ3RoKCkgJiYgKGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCJcIiIpIHx8IGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCInIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkmJiBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpID4gMCkgewotCQkJbWF0Y2hTdHJpbmcgPSBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKDEsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkpOwotCQkJc3RhcnQrKzsKLQkJCWxlbmd0aCA9IG1hdGNoU3RyaW5nLmxlbmd0aCgpOwotCQl9IGVsc2UKLQkJCW1hdGNoU3RyaW5nID0gY3VycmVudFZhbHVlLnN1YnN0cmluZygwLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpKTsKLQkJYm9vbGVhbiBleGlzdGluZ0NvbXBsaWNhdGVkVmFsdWUgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSAhPSBudWxsICYmIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXI7Ci0JCWlmIChleGlzdGluZ0NvbXBsaWNhdGVkVmFsdWUpIHsKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFByb3Bvc2FscygpLmNsZWFyKCk7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYWNyb3MoKS5jbGVhcigpOwotCQl9IGVsc2UgewotCQkJaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9DTEFTUykpIHsKLQkJCQkvLyBjbGFzcyBpcyB0aGUgY29uY3JldGUgaW1wbGVtZW50YXRpb24gY2xhc3MKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNsYXNzUHJvcG9zYWxzID0gSmF2YVR5cGVGaW5kZXIuZ2V0Q2xhc3NQcm9wb3NhbHMocmVzb3VyY2UsIHN0YXJ0LCBsZW5ndGgpOwotCQkJCWlmIChjbGFzc1Byb3Bvc2FscyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2xhc3NQcm9wb3NhbHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gKEphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsKSBjbGFzc1Byb3Bvc2Fsc1tqXTsKLQkJCQkJCWlmIChtYXRjaFN0cmluZy5sZW5ndGgoKSA9PSAwIHx8IHByb3Bvc2FsLmdldFF1YWxpZmllZE5hbWUoKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcudG9Mb3dlckNhc2UoKSkgfHwgcHJvcG9zYWwuZ2V0U2hvcnROYW1lKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG1hdGNoU3RyaW5nLnRvTG93ZXJDYXNlKCkpKQotCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUpKSB7Ci0JCQkJLy8gdHlwZSBpcyB0aGUgbW9yZSBnZW5lcmFsIHR5cGUgZm9yIHRoZSBiZWFuCi0JCQkJLy8gd2hpY2ggbWVhbnMgaXQgbWF5IGJlIGFuIGludGVyZmFjZQotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gdHlwZVByb3Bvc2FscyA9IEphdmFUeXBlRmluZGVyLmdldFR5cGVQcm9wb3NhbHMocmVzb3VyY2UsIHN0YXJ0LCBsZW5ndGgpOwotCQkJCWlmICh0eXBlUHJvcG9zYWxzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB0eXBlUHJvcG9zYWxzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IChKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCkgdHlwZVByb3Bvc2Fsc1tqXTsKLQkJCQkJCWlmIChtYXRjaFN0cmluZy5sZW5ndGgoKSA9PSAwIHx8IHByb3Bvc2FsLmdldFF1YWxpZmllZE5hbWUoKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcudG9Mb3dlckNhc2UoKSkgfHwgcHJvcG9zYWwuZ2V0U2hvcnROYW1lKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG1hdGNoU3RyaW5nLnRvTG93ZXJDYXNlKCkpKQotCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0JFQU5fTkFNRSkpIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGJlYW5OYW1lUHJvcG9zYWxzID0gSmF2YVR5cGVGaW5kZXIuZ2V0QmVhblByb3Bvc2FscyhyZXNvdXJjZSwgc3RhcnQsIGxlbmd0aCk7Ci0JCQkJaWYgKGJlYW5OYW1lUHJvcG9zYWxzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBiZWFuTmFtZVByb3Bvc2Fscy5sZW5ndGg7IGorKykgewotCQkJCQkJaWYgKGJlYW5OYW1lUHJvcG9zYWxzW2pdIGluc3RhbmNlb2YgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKSB7Ci0JCQkJCQkJSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAoSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwpIGJlYW5OYW1lUHJvcG9zYWxzW2pdOwotCQkJCQkJCWlmIChtYXRjaFN0cmluZy5sZW5ndGgoKSA9PSAwIHx8IHByb3Bvc2FsLmdldERpc3BsYXlTdHJpbmcoKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcudG9Mb3dlckNhc2UoKSkpCi0JCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJCX0gZWxzZSBpZiAoYmVhbk5hbWVQcm9wb3NhbHNbal0gaW5zdGFuY2VvZiBKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCkgewotCQkJCQkJCUphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gKEphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsKSBiZWFuTmFtZVByb3Bvc2Fsc1tqXTsKLQkJCQkJCQlpZiAobWF0Y2hTdHJpbmcubGVuZ3RoKCkgPT0gMCB8fCBwcm9wb3NhbC5nZXRRdWFsaWZpZWROYW1lKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG1hdGNoU3RyaW5nLnRvTG93ZXJDYXNlKCkpIHx8IHByb3Bvc2FsLmdldFNob3J0TmFtZSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaFN0cmluZy50b0xvd2VyQ2FzZSgpKSkKLQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBwcm9qZWN0IHJlcXVlc3QgaXMgaW4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElSZXNvdXJjZSBnZXRSZXNvdXJjZShDb250ZW50QXNzaXN0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCVN0cmluZyBiYXNlbG9jYXRpb24gPSBudWxsOwotCi0JCWlmIChyZXF1ZXN0ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gcmVxdWVzdC5nZXREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJSURvY3VtZW50IGRvY3VtZW50ID0gcmVnaW9uLmdldFBhcmVudERvY3VtZW50KCk7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCWJhc2Vsb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYmFzZWxvY2F0aW9uICE9IG51bGwpIHsKLQkJCS8vIGNvcGllZCBmcm9tIEpTUFRyYW5zbGF0aW9uQWRhcHRlciNnZXRKYXZhUHJvamVjdAotCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQlJUGF0aCBmaWxlUGF0aCA9IG5ldyBQYXRoKGJhc2Vsb2NhdGlvbik7Ci0JCQlJRmlsZSBmaWxlID0gbnVsbDsKLQotCQkJaWYgKGZpbGVQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCWZpbGUgPSByb290LmdldEZpbGUoZmlsZVBhdGgpOwotCQkJfQotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCXJlc291cmNlID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSmF2YVBhcmFtZXRlckxpc3RWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0phdmFQYXJhbWV0ZXJMaXN0VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzM2E0YzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSmF2YVBhcmFtZXRlckxpc3RWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotCi0KLS8qKgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUGFyYW1ldGVyTGlzdFZhbGlkYXRvciBpbXBsZW1lbnRzIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IsIElDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIgewotCi0JcHJpdmF0ZSBpbnQgZlBvc2l0aW9uOwotCXByaXZhdGUgSVRleHRWaWV3ZXIgZlZpZXdlcjsKLQlwcml2YXRlIElDb250ZXh0SW5mb3JtYXRpb24gZkluZm9ybWF0aW9uOwotCi0JcHJpdmF0ZSBpbnQgZkN1cnJlbnRQYXJhbWV0ZXI7Ci0KLQkvKioKLQkgKiBAc2VlIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IjaW5zdGFsbChJQ29udGV4dEluZm9ybWF0aW9uLAotCSAqICAgICAgSVRleHRWaWV3ZXIsIGludCkKLQkgKiBAc2VlIElDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIjaW5zdGFsbChJQ29udGV4dEluZm9ybWF0aW9uLAotCSAqICAgICAgSVRleHRWaWV3ZXIsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKElDb250ZXh0SW5mb3JtYXRpb24gaW5mbywgSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlmUG9zaXRpb24gPSBkb2N1bWVudFBvc2l0aW9uOwotCQlmVmlld2VyID0gdmlld2VyOwotCQlmSW5mb3JtYXRpb24gPSBpbmZvOwotCi0JCWZDdXJyZW50UGFyYW1ldGVyID0gLTE7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0Q29tbWVudEVuZChJRG9jdW1lbnQgZCwgaW50IHBvcywgaW50IGVuZCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKHBvcyA8IGVuZCkgewotCQkJY2hhciBjdXJyID0gZC5nZXRDaGFyKHBvcyk7Ci0JCQlwb3MrKzsKLQkJCWlmIChjdXJyID09ICcqJykgewotCQkJCWlmIChwb3MgPCBlbmQgJiYgZC5nZXRDaGFyKHBvcykgPT0gJy8nKSB7Ci0JCQkJCXJldHVybiBwb3MgKyAxOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZW5kOwotCX0KLQotCXByaXZhdGUgaW50IGdldFN0cmluZ0VuZChJRG9jdW1lbnQgZCwgaW50IHBvcywgaW50IGVuZCwgY2hhciBjaCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKHBvcyA8IGVuZCkgewotCQkJY2hhciBjdXJyID0gZC5nZXRDaGFyKHBvcyk7Ci0JCQlwb3MrKzsKLQkJCWlmIChjdXJyID09ICdcXCcpIHsKLQkJCQkvLyBpZ25vcmUgZXNjYXBlZCBjaGFyYWN0ZXJzCi0JCQkJcG9zKys7Ci0JCQl9Ci0JCQllbHNlIGlmIChjdXJyID09IGNoKSB7Ci0JCQkJcmV0dXJuIHBvczsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW5kOwotCX0KLQotCXByaXZhdGUgaW50IGdldENoYXJDb3VudChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBzdGFydCwgaW50IGVuZCwgY2hhciBpbmNyZW1lbnQsIGNoYXIgZGVjcmVtZW50LCBib29sZWFuIGNvbnNpZGVyTmVzdGluZykgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQotCQlBc3NlcnQuaXNUcnVlKChpbmNyZW1lbnQgIT0gMCB8fCBkZWNyZW1lbnQgIT0gMCkgJiYgaW5jcmVtZW50ICE9IGRlY3JlbWVudCk7Ci0KLQkJaW50IG5lc3RpbmdMZXZlbCA9IDA7Ci0JCWludCBjaGFyQ291bnQgPSAwOwotCQl3aGlsZSAoc3RhcnQgPCBlbmQpIHsKLQkJCWNoYXIgY3VyciA9IGRvY3VtZW50LmdldENoYXIoc3RhcnQrKyk7Ci0JCQlzd2l0Y2ggKGN1cnIpIHsKLQkJCQljYXNlICcvJyA6Ci0JCQkJCWlmIChzdGFydCA8IGVuZCkgewotCQkJCQkJY2hhciBuZXh0ID0gZG9jdW1lbnQuZ2V0Q2hhcihzdGFydCk7Ci0JCQkJCQlpZiAobmV4dCA9PSAnKicpIHsKLQkJCQkJCQkvLyBhIGNvbW1lbnQgc3RhcnRzLCBhZHZhbmNlIHRvIHRoZSBjb21tZW50IGVuZAotCQkJCQkJCXN0YXJ0ID0gZ2V0Q29tbWVudEVuZChkb2N1bWVudCwgc3RhcnQgKyAxLCBlbmQpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAobmV4dCA9PSAnLycpIHsKLQkJCQkJCQkvLyAnLy8nLWNvbW1lbnQ6IG5vdGhpbmcgdG8gZG8gYW55bW9yZSBvbiB0aGlzCi0JCQkJCQkJLy8gbGluZQotCQkJCQkJCXN0YXJ0ID0gZW5kOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyonIDoKLQkJCQkJaWYgKHN0YXJ0IDwgZW5kKSB7Ci0JCQkJCQljaGFyIG5leHQgPSBkb2N1bWVudC5nZXRDaGFyKHN0YXJ0KTsKLQkJCQkJCWlmIChuZXh0ID09ICcvJykgewotCQkJCQkJCS8vIHdlIGhhdmUgYmVlbiBpbiBhIGNvbW1lbnQ6IGZvcmdldCB3aGF0IHdlIHJlYWQKLQkJCQkJCQkvLyBiZWZvcmUKLQkJCQkJCQljaGFyQ291bnQgPSAwOwotCQkJCQkJCSsrc3RhcnQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnIicgOgotCQkJCWNhc2UgJ1wnJyA6Ci0JCQkJCXN0YXJ0ID0gZ2V0U3RyaW5nRW5kKGRvY3VtZW50LCBzdGFydCwgZW5kLCBjdXJyKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0KLQkJCQkJaWYgKGNvbnNpZGVyTmVzdGluZykgewotCi0JCQkJCQlpZiAoJygnID09IGN1cnIpCi0JCQkJCQkJKytuZXN0aW5nTGV2ZWw7Ci0JCQkJCQllbHNlIGlmICgnKScgPT0gY3VycikKLQkJCQkJCQktLW5lc3RpbmdMZXZlbDsKLQotCQkJCQkJaWYgKG5lc3RpbmdMZXZlbCAhPSAwKQotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGluY3JlbWVudCAhPSAwKSB7Ci0JCQkJCQlpZiAoY3VyciA9PSBpbmNyZW1lbnQpCi0JCQkJCQkJKytjaGFyQ291bnQ7Ci0JCQkJCX0KLQotCQkJCQlpZiAoZGVjcmVtZW50ICE9IDApIHsKLQkJCQkJCWlmIChjdXJyID09IGRlY3JlbWVudCkKLQkJCQkJCQktLWNoYXJDb3VudDsKLQkJCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNoYXJDb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IjaXNDb250ZXh0SW5mb3JtYXRpb25WYWxpZChpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250ZXh0SW5mb3JtYXRpb25WYWxpZChpbnQgcG9zaXRpb24pIHsKLQotCQl0cnkgewotCQkJaWYgKHBvc2l0aW9uIDwgZlBvc2l0aW9uKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZlZpZXdlci5nZXREb2N1bWVudCgpOwotCQkJSVJlZ2lvbiBsaW5lID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoZlBvc2l0aW9uKTsKLQotCQkJaWYgKHBvc2l0aW9uIDwgbGluZS5nZXRPZmZzZXQoKSB8fCBwb3NpdGlvbiA+PSBkb2N1bWVudC5nZXRMZW5ndGgoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCXJldHVybiAoZ2V0Q2hhckNvdW50KGRvY3VtZW50LCBmUG9zaXRpb24sIHBvc2l0aW9uLCAnKCcsICcpJywgZmFsc2UpID49IDApOwotCi0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlciN1cGRhdGVQcmVzZW50YXRpb24oaW50LAotCSAqICAgICAgVGV4dFByZXNlbnRhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVQcmVzZW50YXRpb24oaW50IHBvc2l0aW9uLCBUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbikgewotCi0JCWludCBjdXJyZW50UGFyYW1ldGVyID0gLTE7Ci0KLQkJdHJ5IHsKLQkJCWN1cnJlbnRQYXJhbWV0ZXIgPSBnZXRDaGFyQ291bnQoZlZpZXdlci5nZXREb2N1bWVudCgpLCBmUG9zaXRpb24sIHBvc2l0aW9uLCAnLCcsIChjaGFyKSAwLCB0cnVlKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGZDdXJyZW50UGFyYW1ldGVyICE9IC0xKSB7Ci0JCQlpZiAoY3VycmVudFBhcmFtZXRlciA9PSBmQ3VycmVudFBhcmFtZXRlcikKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZkluZm9ybWF0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcHJlc2VudGF0aW9uLmNsZWFyKCk7Ci0JCWZDdXJyZW50UGFyYW1ldGVyID0gY3VycmVudFBhcmFtZXRlcjsKLQotCQlTdHJpbmcgcyA9IGZJbmZvcm1hdGlvbi5nZXRJbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcoKTsKLQkJaW50IHN0YXJ0ID0gMDsKLQkJaW50IG9jY3VycmVuY2VzID0gMDsKLQkJd2hpbGUgKG9jY3VycmVuY2VzIDwgZkN1cnJlbnRQYXJhbWV0ZXIpIHsKLQkJCWludCBmb3VuZCA9IHMuaW5kZXhPZignLCcsIHN0YXJ0KTsKLQkJCWlmIChmb3VuZCA9PSAtMSkKLQkJCQlicmVhazsKLQkJCXN0YXJ0ID0gZm91bmQgKyAxOwotCQkJKytvY2N1cnJlbmNlczsKLQkJfQotCi0JCWlmIChvY2N1cnJlbmNlcyA8IGZDdXJyZW50UGFyYW1ldGVyKSB7Ci0JCQlwcmVzZW50YXRpb24uYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZSgwLCBzLmxlbmd0aCgpLCBudWxsLCBudWxsLCBTV1QuTk9STUFMKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWlmIChzdGFydCA9PSAtMSkKLQkJCXN0YXJ0ID0gMDsKLQotCQlpbnQgZW5kID0gcy5pbmRleE9mKCcsJywgc3RhcnQpOwotCQlpZiAoZW5kID09IC0xKQotCQkJZW5kID0gcy5sZW5ndGgoKTsKLQotCQlpZiAoc3RhcnQgPiAwKQotCQkJcHJlc2VudGF0aW9uLmFkZFN0eWxlUmFuZ2UobmV3IFN0eWxlUmFuZ2UoMCwgc3RhcnQsIG51bGwsIG51bGwsIFNXVC5OT1JNQUwpKTsKLQotCQlpZiAoZW5kID4gc3RhcnQpCi0JCQlwcmVzZW50YXRpb24uYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZShzdGFydCwgZW5kIC0gc3RhcnQsIG51bGwsIG51bGwsIFNXVC5CT0xEKSk7Ci0KLQkJaWYgKGVuZCA8IHMubGVuZ3RoKCkpCi0JCQlwcmVzZW50YXRpb24uYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZShlbmQsIHMubGVuZ3RoKCkgLSBlbmQsIG51bGwsIG51bGwsIFNXVC5OT1JNQUwpKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0phdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYThlNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDEyTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5JUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgSUNvbXBsZXRpb25Qcm9wb3NhbCB3aG9zZSB2YWx1ZXMgY2FuIGJlCi0gKiByZWFkIGFmdGVyIGNyZWF0aW9uLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsIGV4dGVuZHMgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIGltcGxlbWVudHMgSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCB7Ci0KLQlwcml2YXRlIGludCBmQ3Vyc29yUG9zaXRpb24gPSAwOwotCXByaXZhdGUgU3RyaW5nIGZMb2NhbERpc3BsYXlTdHJpbmc7Ci0JcHJpdmF0ZSBTdHJpbmcgZlNob3J0TmFtZTsKLQlwcml2YXRlIFN0cmluZyBmUXVhbGlmaWVkTmFtZTsKLQlwcml2YXRlIFN0cmluZyBmQ29udGFpbmVyTmFtZTsKLQotCXB1YmxpYyBKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcsIGludCByZXBsYWNlbWVudE9mZnNldCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSwgSW1hZ2UgaW1hZ2UsIFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIGNvbnRhaW5lck5hbWUsICBpbnQgcmVsZXZlbmNlLCAgYm9vbGVhbiB1cGRhdGVSZXBsYWNlbWVudExlbmd0aE9uVmFsaWRhdGUpIHsKLQkJc3VwZXIocmVwbGFjZW1lbnRTdHJpbmcsIHJlcGxhY2VtZW50T2Zmc2V0LCByZXBsYWNlbWVudExlbmd0aCwgcXVhbGlmaWVkTmFtZS5sZW5ndGgoKSArIDIsIGltYWdlLCAKLSAgICAgICAgICAgICAgICAoY29udGFpbmVyTmFtZSAhPSBudWxsICYmIGNvbnRhaW5lck5hbWUubGVuZ3RoKCkgPiAwKSA/IHR5cGVOYW1lICsgIiAtICIgKyBjb250YWluZXJOYW1lIDogdHlwZU5hbWUsIG51bGwsIG51bGwsIHJlbGV2ZW5jZSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gQ01WQyAyNDM4MTcsIHN1cGVyY2xhc3Mgd2FzIGNvbXBhcmluZyBpbmNvcnJlY3QgZGlzcGxheSBzdHJpbmcgaW4gdmFsaWRhdGUgbWV0aG9kLi4uCi0JCS8vc3VwZXIocmVwbGFjZW1lbnRTdHJpbmcsIHJlcGxhY2VtZW50T2Zmc2V0LCByZXBsYWNlbWVudExlbmd0aCwgaW1hZ2UsIChjb250YWluZXJOYW1lICE9IG51bGwgJiYgY29udGFpbmVyTmFtZS5sZW5ndGgoKSA+IDApPyB0eXBlTmFtZSArICIgLSAiICsgY29udGFpbmVyTmFtZTp0eXBlTmFtZS8qcXVhbGlmaWVkTmFtZSovLCByZWxldmVuY2UpOwotCQlmU2hvcnROYW1lID0gdHlwZU5hbWU7Ci0JCWZRdWFsaWZpZWROYW1lID0gcXVhbGlmaWVkTmFtZTsKLQkJZkNvbnRhaW5lck5hbWUgPSBjb250YWluZXJOYW1lOwotCQlmQ3Vyc29yUG9zaXRpb24gPSBmUXVhbGlmaWVkTmFtZS5sZW5ndGgoKSArIDI7Ci0JCS8vZlByb3Bvc2FsSW5mbyA9IHByb3Bvc2FsSW5mbzsKLQkJaWYgKGNvbnRhaW5lck5hbWUgIT0gbnVsbCAmJiBjb250YWluZXJOYW1lLmxlbmd0aCgpID4gMCkKLQkJCWZMb2NhbERpc3BsYXlTdHJpbmcgPSB0eXBlTmFtZSArICIgLSAiICsgY29udGFpbmVyTmFtZTsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlmTG9jYWxEaXNwbGF5U3RyaW5nID0gdHlwZU5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gZkxvY2FsRGlzcGxheVN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEN1cnNvclBvc2l0aW9uKCkgewotCQlyZXR1cm4gZkN1cnNvclBvc2l0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEN1cnNvclBvc2l0aW9uKGludCBjdXJzb3JQb3NpdGlvbikgewotCQlzdXBlci5zZXRDdXJzb3JQb3NpdGlvbihjdXJzb3JQb3NpdGlvbik7Ci0JCWZDdXJzb3JQb3NpdGlvbiA9IGN1cnNvclBvc2l0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIGZRdWFsaWZpZWROYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpIHsKLQkJLy8JCVN0cmluZyBpbmZvID0gc3VwZXIuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpOwotCQkvLwkJaWYgKGluZm8gPT0gbnVsbCB8fCBpbmZvLmxlbmd0aCgpID09IDAgJiYgZlByb3Bvc2FsSW5mbyAhPSBudWxsKQotCQkvLwkJCXJldHVybiBmUHJvcG9zYWxJbmZvLmdldEluZm8oKTsKLQkJLy8JCXJldHVybiBpbmZvOwotCQlyZXR1cm4gbnVsbDsgLy8gdW5leHBsYWluZWQgTlBFCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTaG9ydE5hbWUoKSB7Ci0JCXJldHVybiBmU2hvcnROYW1lOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW1wb3J0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCVN0cmluZyBpbXBvcnRTcGVjID0gbnVsbDsKLQkJYm9vbGVhbiBpc0ltcG9ydCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJaWYgKGZsYXROb2RlLmdldFRleHQocmVnaW9uKS5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0lNUE9SVCkpIHsKLQkJCQkJaXNJbXBvcnQgPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaXNJbXBvcnQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChpc0ltcG9ydCAmJiByZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQlpbXBvcnRTcGVjID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbXBvcnRTcGVjOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbiBpbXBvcnQgcGFnZSBkaXJlY3RpdmUgZm9yIHRoZSBjdXJyZW50IHR5cGUgbmFtZQotCSAqLwotCXByb3RlY3RlZCBpbnQgYXBwbHlJbXBvcnQoSVN0cnVjdHVyZWREb2N1bWVudCBtb2RlbCkgewotCQkvLyBpZiB0aGUgdHlwZSBpcyBpbiB0aGUgZGVmYXVsdCBwYWNrYWdlIG9yIGphdmEubGFuZywgc2tpcCBpdAotCQlpZiAoZkNvbnRhaW5lck5hbWUgPT0gbnVsbCB8fCBmQ29udGFpbmVyTmFtZS5sZW5ndGgoKSA9PSAwIHx8IGZDb250YWluZXJOYW1lLmVxdWFscygiamF2YS5sYW5nIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiAwOwotCQkvLyBjb2xsZWN0IHBhZ2UgZGlyZWN0aXZlcyBhbmQgc3RvcmUgdGhlaXIgaW1wb3J0IHZhbHVlcwotCQlMaXN0IGltcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IG1vZGVsLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkJLy8gdXNlIHRoZSBsYXN0IHBvc2l0aW9uIG9mIGEgcGFnZSBkaXJlY3RpdmUgYXMgYSBoaW50IGFzIHRvIHdoZXJlIHRvIGFkZAotCQkvLyBhIG5ldyBvbmUKLQkJaW50IGhpbnQgPSAwOwotCQkvLyB3YXRjaCBmb3IganNwOnJvb3Qgc28gdGhhdCB3ZSB1c2UgdGhlIHJpZ2h0IFhNTC9KU1AgZm9ybWF0IGZvciB0aGUgZGlyZWN0aXZlCi0JCWJvb2xlYW4gdXNlWE1MID0gZmFsc2U7Ci0KLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJLy8gQ2FuJ3QganVzdCBsb29rIGZvciBhbGwgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyBzdGFydGluZyB3aXRoIEpTUF9ESVJFQ1RJVkVfT1BFTgotCQkJLy8gc2luY2UgdGhlIFhNTCBmb3JtIGlzIHJlcXVpcmVkLCB0b28KLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gbm9kZS5nZXRSZWdpb25zKCk7Ci0JCQlpZiAocmVnaW9ucy5zaXplKCkgPiAxKSB7Ci0JCQkJSVRleHRSZWdpb24gbmFtZSA9IHJlZ2lvbnMuZ2V0KDEpOwotCQkJCS8vIHZlcmlmeSB0aGF0IHRoaXMgaXMgYSBKU1AgZGlyZWN0aXZlCi0JCQkJaWYgKG5hbWUuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCQkvLyB2ZXJpZnkgdGhhdCB0aGlzIGlzIGEgKnBhZ2UqIGRpcmVjdGl2ZQotCQkJCQlpZiAobm9kZS5nZXRUZXh0KG5hbWUpLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfUEFHRSkgfHwgbm9kZS5nZXRUZXh0KG5hbWUpLmVxdWFscyhKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfUEFHRSkpIHsKLQkJCQkJCWlmIChub2RlLmdldEVuZE9mZnNldCgpIDwgZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSkKLQkJCQkJCQloaW50ID0gbm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCVN0cmluZyBpbXBvcnRTcGVjID0gZ2V0SW1wb3J0KG5vZGUpOwotCQkJCQkJaWYgKGltcG9ydFNwZWMgIT0gbnVsbCkgewotCQkJCQkJCWltcG9ydHMuYWRkKGltcG9ydFNwZWMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBpZiB0aGlzIGlzIGEganNwOnJvb3QgdGFnLCB1c2UgdGhlIFhNTCBmb3JtCi0JCQkJCXVzZVhNTCA9IHVzZVhNTCB8fCBuYW1lLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRTsKLQkJCQl9Ci0JCQl9Ci0JCQlub2RlID0gbm9kZS5nZXROZXh0KCk7Ci0JCX0KLQotCQkvLyBldmFsdWF0ZSByZXF1aXJlbWVudHMgZm9yIGEgIm5ldyIgaW1wb3J0IGRpcmVjdGl2ZQotCQlib29sZWFuIG5lZWRzSW1wb3J0ID0gIWltcG9ydEhhbmRsZXMoZlF1YWxpZmllZE5hbWUsIGltcG9ydHMpOwotCQlpbnQgYWRqdXN0bWVudExlbmd0aCA9IDA7Ci0JCS8vIGluc2VydCAibmV3IiBpbXBvcnQgZGlyZWN0aXZlCi0JCWlmIChuZWVkc0ltcG9ydCkgewotCQkJU3RyaW5nIGRpcmVjdGl2ZSA9IG51bGw7Ci0KLQkJCS8vIHZhcnkgdGhlIFhNTCBiZWhhdmlvcgotCQkJaWYgKHVzZVhNTCkgewotCQkJCWRpcmVjdGl2ZSA9ICI8anNwOmRpcmVjdGl2ZS5wYWdlIGltcG9ydD1cIiIgKyBmUXVhbGlmaWVkTmFtZSArICJcIi8+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlkaXJlY3RpdmUgPSAiPCVAIHBhZ2UgaW1wb3J0PVwiIiArIGZRdWFsaWZpZWROYW1lICsgIlwiICU+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJSVJlZ2lvbiBsaW5lID0gbW9kZWwuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoaGludCk7Ci0JCQkJYm9vbGVhbiBwcmVwZW5kTmV3TGluZSA9IGxpbmUuZ2V0T2Zmc2V0KCkgKyBsaW5lLmdldExlbmd0aCgpID09IGhpbnQ7Ci0JCQkJYm9vbGVhbiBhcHBlbmROZXdMaW5lID0gaGludCA9PSAwOwotCQkJCWlmIChwcmVwZW5kTmV3TGluZSkKLQkJCQkJZGlyZWN0aXZlID0gbW9kZWwuZ2V0TGluZURlbGltaXRlcigpICsgZGlyZWN0aXZlOwotCQkJCWlmIChhcHBlbmROZXdMaW5lKQotCQkJCQlkaXJlY3RpdmUgPSBkaXJlY3RpdmUgKyBtb2RlbC5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCQkJYWRqdXN0bWVudExlbmd0aCA9IGRpcmVjdGl2ZS5sZW5ndGgoKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJbW9kZWwucmVwbGFjZShoaW50LCAwLCBkaXJlY3RpdmUpOwotCi0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIE5vdCB0aGF0IHdlIHNob3VsZCBldmVyIGdldCBhIEJMRSwgYnV0IGlmIHNvLCBvdXIKLQkJCQkvLyByZXBsYWNlbWVudCBvZmZzZXQgZnJvbSB0aGUgQ29udGVudCBBc3Npc3QgY2FsbCBzaG91bGQKLQkJCQkvLyB3b3JrCi0JCQkJdHJ5IHsKLQkJCQkJbW9kZWwucmVwbGFjZShnZXRSZXBsYWNlbWVudE9mZnNldCgpLCAwLCBkaXJlY3RpdmUpOwotCQkJCQlhZGp1c3RtZW50TGVuZ3RoID0gZGlyZWN0aXZlLmxlbmd0aCgpOwotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZTIpIHsKLQkJCQkJLy8gbm93IHdoYXQ/Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhZGp1c3RtZW50TGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFNlZSBpZiB0aGUgaW1wb3J0IHNwZWNpZmljYXRpb24gaXMgYSB3aWxkY2FyZCBpbXBvcnQsIGFuZCBpZiBzbywgdGhhdAotCSAqIGl0IGFwcGxpZXMgdG8gdGhlIGdpdmVuIHR5cGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXaWxkY2FyZE1hdGNoKFN0cmluZyBpbXBvcnRTcGVjLCBTdHJpbmcgdHlwZSkgewotCQlpbnQgc3BlY0xlbmd0aCA9IGltcG9ydFNwZWMubGVuZ3RoKCk7Ci0JCWlmIChpbXBvcnRTcGVjLmVuZHNXaXRoKCIqIikgJiYgc3BlY0xlbmd0aCA+IDIgJiYgdHlwZS5sZW5ndGgoKSA+PSBzcGVjTGVuZ3RoKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIHB1bGwgb3V0IHRoZSBwYWNrYWdlIG5hbWUgaW5jbHVkaW5nIHRoZSBmaW5hbCAnLicKLQkJCVN0cmluZyBjb250YWluZXIgPSBpbXBvcnRTcGVjLnN1YnN0cmluZygwLCBzcGVjTGVuZ3RoIC0gMSk7Ci0JCQkvLyB2ZXJpZnkgdGhhdCB0aGUgdHlwZSBpcyBpbiB0aGUgY29udGFpbmVyJ3MgaGllcmFyY2h5IGFuZCB0aGF0Ci0JCQkvLyB0aGVyZSBhcmUgbm8gb3RoZXIgcGFja2FnZSBzZXBhcmF0b3JzIGFmdGVyd2FyZHMKLQkJCWlmICh0eXBlLnN0YXJ0c1dpdGgoY29udGFpbmVyKSAmJiB0eXBlLmluZGV4T2YoJy4nLCBzcGVjTGVuZ3RoIC0gMSkgPCAwKSB7Ci0JCQkJLy8gY29udGFpbmVyIG1hdGNoZXMKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW1wb3J0SGFuZGxlcyhTdHJpbmcgdHlwZSwgTGlzdCBsaXN0T2ZJbXBvcnRzKSB7Ci0JCUl0ZXJhdG9yIGltcG9ydHMgPSBsaXN0T2ZJbXBvcnRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpbXBvcnRzLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGltcG9ydFNwZWMgPSBTdHJpbmdVdGlscy5zdHJpcChpbXBvcnRzLm5leHQoKS50b1N0cmluZygpKTsKLQkJCWlmIChpbXBvcnRTcGVjLmVxdWFscyh0eXBlKSB8fCBpc1dpbGRjYXJkTWF0Y2goaW1wb3J0U3BlYywgdHlwZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFwcGx5KElEb2N1bWVudCBkb2N1bWVudCwgY2hhciB0cmlnZ2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIElmIHdlIGhhdmUgYSBwYXJzZWQgSVN0cnVjdHVyZWREb2N1bWVudCwgaW5zZXJ0IHRoZSBzaG9ydCBuYW1lIGluc3RlYWQgb2YgdGhlCi0JCS8vIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGFuZCBhIGltcG9ydCBwYWdlIGRpcmVjdGl2ZSBpZgotCQkvLyBuZWVkZWQuICBEbyB0aGUgaW1wb3J0IGZpcnN0IHNvIHRoZSBjdXJzb3IgZ29lcyB0byB0aGUgcmlnaHQgbG9jYXRpb24KLQkJLy8gYW5kIHdlIGRvbid0IHN1cnByaXNlIHRoZSB1c2VyLgotCi0JCWJvb2xlYW4gYWRkU2hvcnRGb3JtID0gZmFsc2U7IC8vZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50ICYmIGZDb250YWluZXJOYW1lICE9IG51bGwgJiYgZkNvbnRhaW5lck5hbWUubGVuZ3RoKCkgPiAwOwotCQlpZiAoYWRkU2hvcnRGb3JtKSB7Ci0JCQlzZXRSZXBsYWNlbWVudFN0cmluZygnIicgKyBmU2hvcnROYW1lICsgJyInKTsKLQkJCWludCBpbXBvcnRMZW5ndGggPSBhcHBseUltcG9ydCgoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpOwotCQkJc2V0UmVwbGFjZW1lbnRPZmZzZXQoZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSArIGltcG9ydExlbmd0aCk7Ci0JCX0KLQotCQlzZXRDdXJzb3JQb3NpdGlvbihnZXRSZXBsYWNlbWVudFN0cmluZygpLmxlbmd0aCgpKTsKLQkJc3VwZXIuYXBwbHkoZG9jdW1lbnQsIHRyaWdnZXIsIG9mZnNldCk7Ci0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24xI2FwcGx5KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsIGNoYXIsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KElUZXh0Vmlld2VyIHZpZXdlciwgY2hhciB0cmlnZ2VyLCBpbnQgc3RhdGVNYXNrLCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIENNVkMgMjQzODE1Ci0JCS8vIChwYSkgdGhpcyBpcyBvdmVycmlkZGVuIHRvIGdldCBhcm91bmQgcmVwbGFjZW1lbnQgbGVuZ3RoIG1vZGlmaWNhdGlvbgotCQkvLyB3aGljaCBpcyBkb25lIGluIHRoZSBzdXBlciAoc2luY2UgZWNsaXBzZSAyLjEpCi0JCWFwcGx5KHZpZXdlci5nZXREb2N1bWVudCgpLCB0cmlnZ2VyLCBvZmZzZXQpOwotCX0KLQotCS8vIGNvZGUgaXMgYm9ycm93ZWQgZnJvbSBKYXZhQ29tcGxldGlvblByb3Bvc2FsCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRzV2l0aChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIFN0cmluZyB3b3JkKSB7Ci0JCWludCB3b3JkTGVuZ3RoID0gd29yZCA9PSBudWxsID8gMCA6IHdvcmQubGVuZ3RoKCk7Ci0JCWlmIChvZmZzZXQgPiBnZXRSZXBsYWNlbWVudE9mZnNldCgpICsgd29yZExlbmd0aCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQl0cnkgewotCQkJaW50IGxlbmd0aCA9IG9mZnNldCAtIGdldFJlcGxhY2VtZW50T2Zmc2V0KCk7Ci0JCQkvLyBDTVZDIDI0MzgxNwotCQkJLy8gc2xpZ2h0bHkgbW9kaWZpZWQgdG8gYmUgYSBsaXR0bGUgbW9yZSBmbGV4aWJsZSBmb3IgYXR0cmlidXRlIHZhbHVlIHN0cmluZyBtYXRjaGluZy4uCi0JCQlTdHJpbmcgc3RhcnQgPSBTdHJpbmdVdGlscy5zdHJpcFF1b3Rlcyhkb2N1bWVudC5nZXQoZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSwgbGVuZ3RoKSk7Ci0JCQlyZXR1cm4gd29yZC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoc3RhcnQudG9Mb3dlckNhc2UoKSkgfHwgZlF1YWxpZmllZE5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHN0YXJ0LnRvTG93ZXJDYXNlKCkpOwotCQkJLy9yZXR1cm4gd29yZC5zdWJzdHJpbmcoMCwgbGVuZ3RoKS5lcXVhbHNJZ25vcmVDYXNlKHN0YXJ0KTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJLy8gaWdub3JlCi0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuamF2YS5KYXZhQ29tcGxldGlvblByb3Bvc2FsI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LCBpbnQsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgLy8JICovCi0JLy8JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkvLwkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKGRvY3VtZW50LCBvZmZzZXQsIGV2ZW50KTsKLQkvLwl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuamF2YS5KYXZhQ29tcGxldGlvblByb3Bvc2FsI3NlbGVjdGVkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0ZWQoSVRleHRWaWV3ZXIgdmlld2VyLCBib29sZWFuIHNtYXJ0VG9nZ2xlKSB7Ci0JCS8vIChwYSkgd2UgY3VycmVudGx5IGRvbid0IHVzZSBzbWFydCB0b2dnbGUuLi4KLQkJc3VwZXIuc2VsZWN0ZWQodmlld2VyLCBmYWxzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KYXZhVHlwZUZpbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSmF2YVR5cGVGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjExYzNiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KYXZhVHlwZUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5JUmVsZXZhbmNlQ29uc3RhbnRzOwotCi0vKioKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVR5cGVGaW5kZXIgewotCi0JcHVibGljIHN0YXRpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0QmVhblByb3Bvc2FscyhJUmVzb3VyY2UgcmVzb3VyY2UsIGludCByZXBsYWNlbWVudFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgpIHsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHR5cGVQcm9wb3NhbHMgPSBnZXRUeXBlUHJvcG9zYWxzKHJlc291cmNlLCByZXBsYWNlbWVudFN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCk7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBzZXJpYWxQcm9wb3NhbHMgPSBnZXRTZXJpYWxpemVkUHJvcG9zYWxzKHJlc291cmNlLCByZXBsYWNlbWVudFN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCk7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBiZWFuUHJvcG9zYWxzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbdHlwZVByb3Bvc2Fscy5sZW5ndGggKyBzZXJpYWxQcm9wb3NhbHMubGVuZ3RoXTsKLQotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgaSA8IHNlcmlhbFByb3Bvc2Fscy5sZW5ndGg7IGkrKykgewotCQkJYmVhblByb3Bvc2Fsc1tpXSA9IHNlcmlhbFByb3Bvc2Fsc1tpXTsKLQkJfQotCQlmb3IgKGkgPSBzZXJpYWxQcm9wb3NhbHMubGVuZ3RoOyBpIDwgc2VyaWFsUHJvcG9zYWxzLmxlbmd0aCArIHR5cGVQcm9wb3NhbHMubGVuZ3RoOyBpKyspIHsKLQkJCWJlYW5Qcm9wb3NhbHNbaV0gPSB0eXBlUHJvcG9zYWxzW2kgLSBzZXJpYWxQcm9wb3NhbHMubGVuZ3RoXTsKLQkJfQotCQlyZXR1cm4gYmVhblByb3Bvc2FsczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldE1lbWJlcnMoSUNvbnRhaW5lciBjb250YWluZXIsIExpc3QgbWVtYmVyc0xpc3QpIHsKLQkJdHJ5IHsKLQkJCUlSZXNvdXJjZVtdIG1lbWJlcnMgPSBjb250YWluZXIubWVtYmVycyh0cnVlKTsKLQkJCWlmIChtZW1iZXJzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKG1lbWJlcnNbaV0uZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotCQkJCQkJbWVtYmVyc0xpc3QuYWRkKG1lbWJlcnNbaV0pOwotCQkJCQllbHNlIGlmIChtZW1iZXJzW2ldLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKQotCQkJCQkJZ2V0TWVtYmVycygoSUNvbnRhaW5lcikgbWVtYmVyc1tpXSwgbWVtYmVyc0xpc3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0U2VyaWFsaXplZFByb3Bvc2FscyhJUmVzb3VyY2UgcmVzb3VyY2UsIGludCByZXBsYWNlbWVudFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgpIHsKLQkJTGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldE1lbWJlcnMocmVzb3VyY2UuZ2V0UHJvamVjdCgpLCByZXNvdXJjZXMpOwotCQlJUmVzb3VyY2UgbWVtYmVyUmVzb3VyY2UgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJbWVtYmVyUmVzb3VyY2UgPSAoSVJlc291cmNlKSByZXNvdXJjZXMuZ2V0KGkpOwotCQkJaWYgKG1lbWJlclJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSAmJiBtZW1iZXJSZXNvdXJjZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5zZXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHBhdGggPSBVUklIZWxwZXIubm9ybWFsaXplKG1lbWJlclJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCByZXNvdXJjZS5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCW5hbWVzLmFkZChuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCJcIiIgKyBwYXRoICsgIlwiIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCXJlcGxhY2VtZW50U3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoLCBwYXRoLmxlbmd0aCgpICsgMiwgbnVsbCwgcGF0aCwgbnVsbCwgbnVsbCwgSVJlbGV2YW5jZUNvbnN0YW50cy5SX05PTkUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIG5hbWVzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbbmFtZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICoKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gcmVwbGFjZW1lbnRTdGFydAotCSAqIEBwYXJhbSByZXBsYWNlbWVudExlbmd0aAotCSAqIEBwYXJhbSBzZWFyY2hGb3IgSUphdmFTZWFyY2hDb25zdGFudHMuVFlQRSwgSUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGZpbmRQcm9wb3NhbHMoSVJlc291cmNlIHJlc291cmNlLCBpbnQgcmVwbGFjZW1lbnRTdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBpbnQgc2VhcmNoRm9yLCBib29sZWFuIGlnbm9yZUFic3RyYWN0Q2xhc3NlcykgewotCi0JCUphdmFUeXBlTmFtZVJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgSmF2YVR5cGVOYW1lUmVxdWVzdG9yKCk7Ci0JCXJlcXVlc3Rvci5zZXRKU1BPZmZzZXQocmVwbGFjZW1lbnRTdGFydCk7Ci0JCXJlcXVlc3Rvci5zZXRSZXBsYWNlbWVudExlbmd0aChyZXBsYWNlbWVudExlbmd0aCk7Ci0JCXJlcXVlc3Rvci5zZXRJZ25vcmVBYnN0cmFjdENsYXNzZXMoaWdub3JlQWJzdHJhY3RDbGFzc2VzKTsKLQotCQl0cnkgewotCQkJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50W117Z2V0SmF2YVByb2plY3QocmVzb3VyY2UpfTsKLQkJCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGVsZW1lbnRzKTsKLQkJCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2hBbGxUeXBlTmFtZXMobnVsbCwgbnVsbCwgU2VhcmNoUGF0dGVybi5SX1BBVFRFUk5fTUFUQ0ggfCBTZWFyY2hQYXR0ZXJuLlJfUFJFRklYX01BVENILCBzZWFyY2hGb3IsIHNjb3BlLCByZXF1ZXN0b3IsIElKYXZhU2VhcmNoQ29uc3RhbnRzLldBSVRfVU5USUxfUkVBRFlfVE9fU0VBUkNILCBudWxsKTsKLQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGMpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjKSB7IAotCQkJLy8gSmF2YU1vZGVsCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Yyk7Ci0JCX0KLQkJcmV0dXJuIHJlcXVlc3Rvci5nZXRQcm9wb3NhbHMoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRUeXBlUHJvcG9zYWxzKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHJlcGxhY2VtZW50U3RhcnQsIGludCByZXBsYWNlbWVudExlbmd0aCkgewotCQlyZXR1cm4gZmluZFByb3Bvc2FscyhyZXNvdXJjZSwgcmVwbGFjZW1lbnRTdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgsIElKYXZhU2VhcmNoQ29uc3RhbnRzLlRZUEUsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0Q2xhc3NQcm9wb3NhbHMoSVJlc291cmNlIHJlc291cmNlLCBpbnQgcmVwbGFjZW1lbnRTdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoKSB7Ci0JCXJldHVybiBmaW5kUHJvcG9zYWxzKHJlc291cmNlLCByZXBsYWNlbWVudFN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgSUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1MsIHRydWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJSVByb2plY3QgcHJvaiA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2opOwotCQlyZXR1cm4gamF2YVByb2plY3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSmF2YVR5cGVOYW1lUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KYXZhVHlwZU5hbWVSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFhMmRkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KYXZhVHlwZU5hbWVSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5UeXBlTmFtZVJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLkNvbXBsZXRpb25Qcm9wb3NhbExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSVJlbGV2YW5jZUNvbnN0YW50czsKLQotLyoqCi0gKiBVc2Ugdy8gSkRUIHNlYXJjaCBlbmdpbmUgdG8gZmluZCBhbGwgdHlwZSBuYW1lcy4KLSAqIENyZWF0ZXMgcHJvcG9zYWxzIGZyb20gbWF0Y2hlcyByZXBvcnRlZC4KLSAqCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFUeXBlTmFtZVJlcXVlc3RvciBleHRlbmRzIFR5cGVOYW1lUmVxdWVzdG9yIHsKLQkKLQlwcml2YXRlIGludCBmSlNQT2Zmc2V0ID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZlJlcGxhY2VtZW50TGVuZ3RoID0gLTE7Ci0JcHJpdmF0ZSBMaXN0IGZQcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBib29sZWFuIGZJZ25vcmVBYnN0cmFjdENsYXNzZXMgPSBmYWxzZTsKLQkKLQlwcml2YXRlIENvbXBsZXRpb25Qcm9wb3NhbExhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXIgPSBuZXcgQ29tcGxldGlvblByb3Bvc2FsTGFiZWxQcm92aWRlcigpOwotCQotCXB1YmxpYyB2b2lkIGFjY2VwdFR5cGUoaW50IG1vZGlmaWVycywgY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywgU3RyaW5nIHBhdGgpIHsKLQotICAgICAgICBpbnQgb2Zmc2V0ID0gZ2V0SlNQT2Zmc2V0KCk7Ci0gICAgICAgIGludCBsZW5ndGggPSBnZXRSZXBsYWNlbWVudExlbmd0aCgpOwotCQkKLQkJLy8gc29tZWhvdyBvZmZzZXQgb3IgbGVuZ3RoIHdhcyBzZXQgaW5jb3JyZWN0bHkKLQkJaWYob2Zmc2V0ID09IC0xIHx8IGxlbmd0aCA9PSAtMSkKLQkJCXJldHVybjsKLQkJLy8gaWdub3JlIGFic3RyYWN0IGNsYXNzZXM/Ci0JCWlmKGlnbm9yZUFic3RyYWN0Q2xhc3NlcygpICYmIEZsYWdzLmlzQWJzdHJhY3QobW9kaWZpZXJzKSkKLQkJCXJldHVybjsKLQkJCi0JCUltYWdlIGltYWdlID0gY2FsY3VsYXRlSW1hZ2UobW9kaWZpZXJzKTsKLQkJCi0gICAgICAgIFN0cmluZyBjb250YWluZXJOYW1lU3RyaW5nID0gbmV3IFN0cmluZyhwYWNrYWdlTmFtZSk7Ci0gICAgICAgIFN0cmluZyB0eXBlTmFtZVN0cmluZyA9IFN0cmluZy52YWx1ZU9mKHNpbXBsZVR5cGVOYW1lKTsKLQkJCQotICAgICAgICAvLyBjb250YWluZXJuYW1lIGNhbiBiZSBudWxsCi0gICAgICAgIFN0cmluZyBmdWxsTmFtZSA9IGNvbmNhdGVuYXRlTmFtZShjb250YWluZXJOYW1lU3RyaW5nLCB0eXBlTmFtZVN0cmluZyk7Ci0KLSAgICAgICAgU3RyaW5nIHNpbXBsZU5hbWUgPSBTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZShmdWxsTmFtZSk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHNpbXBsZU5hbWUpOwotICAgICAgICBTdHJpbmcgdHlwZVF1YWxpZmllciA9IFNpZ25hdHVyZS5nZXRRdWFsaWZpZXIoZnVsbE5hbWUpOwotICAgICAgICBpZiAodHlwZVF1YWxpZmllci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiAtICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBidWYuYXBwZW5kKHR5cGVRdWFsaWZpZXIpOwotICAgICAgICB9Ci0JCQotICAgICAgICBKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChmdWxsTmFtZSwgb2Zmc2V0LCBsZW5ndGgsIGZ1bGxOYW1lLCBpbWFnZSwgdHlwZU5hbWVTdHJpbmcsIHR5cGVRdWFsaWZpZXIsIElSZWxldmFuY2VDb25zdGFudHMuUl9OT05FLCB0cnVlKTsKLSAgICAgICAgcHJvcG9zYWwuc2V0VHJpZ2dlckNoYXJhY3RlcnMoSlNQUHJvcG9zYWxDb2xsZWN0b3IuZ2V0VHlwZVRyaWdnZXJzKCkpOwotCQlmUHJvcG9zYWxzLmFkZChwcm9wb3NhbCk7Ci0JfQotCi0KLQlwcml2YXRlIEltYWdlIGNhbGN1bGF0ZUltYWdlKGludCBtb2RpZmllcnMpIHsKLQkJQ29tcGxldGlvblByb3Bvc2FsIHAgPSBDb21wbGV0aW9uUHJvcG9zYWwuY3JlYXRlKENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRiwgZ2V0SlNQT2Zmc2V0KCkpOwotCQlwLnNldEZsYWdzKG1vZGlmaWVycyk7Ci0JCQotCQkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDIyMDYKLQkJY2hhcltdIHNpZyA9IG5ldyBjaGFyW117U2lnbmF0dXJlLkNfVU5SRVNPTFZFRH07Ci0JCXAuc2V0U2lnbmF0dXJlKHNpZyk7Ci0JCQotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGZMYWJlbFByb3ZpZGVyLmNyZWF0ZUltYWdlRGVzY3JpcHRvcihwKTsKLQkJSW1hZ2UgaW1hZ2UgPSBKU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKGRlc2NyaXB0b3IpOwotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCQotICAgIC8qKgotICAgICAqIENvbmNhdGVuYXRlcyB0d28gbmFtZXMuIFVzZXMgYSBkb3QgZm9yIHNlcGFyYXRpb24uIEJvdGggc3RyaW5ncyBjYW4gYmUKLSAgICAgKiBlbXB0eSBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNvbmNhdGVuYXRlTmFtZShTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBpZiAobmFtZTEgIT0gbnVsbCAmJiBuYW1lMS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQobmFtZTEpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lMiAhPSBudWxsICYmIG5hbWUyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgaWYgKGJ1Zi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCcuJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWYuYXBwZW5kKG5hbWUyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCQotCWludCBnZXRKU1BPZmZzZXQoKSB7Ci0JCXJldHVybiBmSlNQT2Zmc2V0OwotCX0KLQotCXZvaWQgc2V0SlNQT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJZkpTUE9mZnNldCA9IG9mZnNldDsKLQl9Ci0KLQlpbnQgZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSB7Ci0JCXJldHVybiBmUmVwbGFjZW1lbnRMZW5ndGg7Ci0JfQotCi0Jdm9pZCBzZXRSZXBsYWNlbWVudExlbmd0aChpbnQgcmVwbGFjZW1lbnRMZW5ndGgpIHsKLQkJZlJlcGxhY2VtZW50TGVuZ3RoID0gcmVwbGFjZW1lbnRMZW5ndGg7Ci0JfQotCXZvaWQgc2V0SWdub3JlQWJzdHJhY3RDbGFzc2VzKGJvb2xlYW4gaWdub3JlKSB7Ci0JCWZJZ25vcmVBYnN0cmFjdENsYXNzZXMgPSBpZ25vcmU7Ci0JfQotCWJvb2xlYW4gaWdub3JlQWJzdHJhY3RDbGFzc2VzKCkgewotCQlyZXR1cm4gZklnbm9yZUFic3RyYWN0Q2xhc3NlczsKLQl9Ci0JCi0JSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRQcm9wb3NhbHMoKSB7Ci0JCXJldHVybiAoSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWxbXSlmUHJvcG9zYWxzLnRvQXJyYXkobmV3IEphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsW2ZQcm9wb3NhbHMuc2l6ZSgpXSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Ob1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3JGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUzYzhlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Ob1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3JGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRleHQuSUpTUFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Lk5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9uczsKLQotLyoqCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckpTUCBleHRlbmRzIE5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckhUTUwgewotCi0JcHJpdmF0ZSBTdHJpbmdbXSBmSlNQQ29udGV4dHMgPSBudWxsOwotCi0JcHVibGljIE5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckpTUCgpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdEpTUENvbnRleHRzKCk7Ci0JfQotCi0JLyogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Lk5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckhUTUwjaW5pdFBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0UGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKSB7Ci0JCXN1cGVyLmluaXRQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpOwotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBqc3BDb250ZW50QXNzaXN0UHJvY2Vzc29yID0gbmV3IEpTUENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKTsKLQotCQkvLyBKU1AKLQkJYWRkUGFydGl0aW9uUHJvY2Vzc29yKElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTiwganNwQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCwganNwQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxULCBqc3BDb250ZW50QXNzaXN0UHJvY2Vzc29yKTsKLQkJYWRkUGFydGl0aW9uUHJvY2Vzc29yKElIVE1MUGFydGl0aW9ucy5IVE1MX0NPTU1FTlQsIGpzcENvbnRlbnRBc3Npc3RQcm9jZXNzb3IpOwotCQlhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQsIGpzcENvbnRlbnRBc3Npc3RQcm9jZXNzb3IpOwotCQlhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoSUpTUFBhcnRpdGlvbnMuSlNQX0RJUkVDVElWRSwganNwQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9ERUxJTUlURVIsIGpzcENvbnRlbnRBc3Npc3RQcm9jZXNzb3IpOwotCQlhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVCwganNwQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0KLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IganNwSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPSBuZXcgSlNQSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKTsKLQkJYWRkUGFydGl0aW9uUHJvY2Vzc29yKElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkEsIGpzcEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXROYW1lVG9Qcm9jZXNzb3JNYXAoKSB7Ci0JCXN1cGVyLmluaXROYW1lVG9Qcm9jZXNzb3JNYXAoKTsKLQkJSlNQUHJvcGVydHlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGpzcFByb3BlcnR5Q0FQID0gbmV3IEpTUFByb3BlcnR5Q29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQlhZGROYW1lUHJvY2Vzc29yKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFVFBST1BFUlRZLCBqc3BQcm9wZXJ0eUNBUCk7Ci0JCWFkZE5hbWVQcm9jZXNzb3IoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuR0VUUFJPUEVSVFksIGpzcFByb3BlcnR5Q0FQKTsKLQkJYWRkTmFtZVByb2Nlc3NvcihKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOLCBuZXcgSlNQVXNlQmVhbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRKU1BDb250ZXh0cygpIHsKLQkJZkpTUENvbnRleHRzID0gbmV3IFN0cmluZ1tde0RPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU59OwotCX0KLQotCS8qKgotCSAqIFF1aWNrIGNoZWNrIHRvIHNlZSBpZiBjb250ZXh0IChTdHJpbmcpIHNob3VsZCBtYXAgdG8KLQkgKiBKU1BDb250ZW50QXNzaXN0UHJvY2Vzc29yLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogQHJldHVybiBpZiBpdCdzIGEgSlNQIFJlZ2lvbiAoZm9yIHdoaWNoIHdlIG5lZWQgSlNQIENvbnRlbnQgYXNzaXN0KQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0pTUFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCVN0cmluZyBjb250ZXh0ID0gc2RSZWdpb24uZ2V0VHlwZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZKU1BDb250ZXh0cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNvbnRleHQgPT0gZkpTUENvbnRleHRzW2ldKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ3Vlc3NDb250ZW50QXNzaXN0UHJvY2Vzc29yKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSBzdXBlci5ndWVzc0NvbnRlbnRBc3Npc3RQcm9jZXNzb3Iodmlld2VyLCBkb2N1bWVudE9mZnNldCk7Ci0JCWlmIChwID09IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHZpZXdlci5nZXREb2N1bWVudCgpKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2N1bWVudE9mZnNldCk7Ci0JCQlpZiAoaXNKU1BSZWdpb24oc2RSZWdpb24pKQotCQkJCXAgPSBnZXRQYXJ0aXRpb25Qcm9jZXNzb3IoSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQSk7Ci0JCX0KLQkJcmV0dXJuIHA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1JlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNGU5ZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Eb2N1bWVudFRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlRXhjZXB0aW9uOwotCi0vKioKLSAqIEp1c3QgbGlrZSBEb2N1bWVudFRlbXBsYXRlQ29udGV4dCBleGNlcHQgaWYgYW4gaW5zZXJ0IG9mZnNldCBpcyBwYXNzZWQgaW4sCi0gKiBkdXJpbmcgZXZhbHVhdGlvbiwgdGhlICJwcmVmaXgiIGJlZm9yZSB0aGUgdGVtcGxhdGUgd2lsbCBiZSBjaGVja2VkIHRvIHNlZQotICogaWYgaXQgbWF0Y2hlcyB0aGUgdGVtcGxhdGUgbmFtZS4gSWYgc28sIG92ZXJ3cml0ZSB0aGUgdGVtcGxhdGUgbmFtZS4KLSAqIE90aGVyd2lzZSwganVzdCBpbnNlcnQgdGhlIHRlbXBsYXRlIGF0IHRoZSBpbnNlcnQgb2Zmc2V0IGxvY2F0aW9uIChieSBub3QKLSAqIG92ZXJ3cml0aW5nIHRoZSBwcmVmaXggdGV4dCkKLSAqLwotcHVibGljIGNsYXNzIFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0IGV4dGVuZHMgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQgewotCXByaXZhdGUgaW50IGZJbnNlcnRPZmZzZXQgPSAtMTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkb2N1bWVudCB0ZW1wbGF0ZSBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgY29udGV4dCB0eXBlCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgdGhpcyBjb250ZXh0IGFwcGxpZXMgdG8KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkb2N1bWVudCByZWdpb24KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkb2N1bWVudCByZWdpb24KLQkgKi8KLQlwdWJsaWMgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoVGVtcGxhdGVDb250ZXh0VHlwZSB0eXBlLCBJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJdGhpcyh0eXBlLCBkb2N1bWVudCwgbmV3IFBvc2l0aW9uKG9mZnNldCwgbGVuZ3RoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRvY3VtZW50IHRlbXBsYXRlIGNvbnRleHQuIFRoZSBzdXBwbGllZCA8Y29kZT5Qb3NpdGlvbjwvY29kZT4KLQkgKiB3aWxsIGJlIHF1ZXJpZWQgdG8gY29tcHV0ZSB0aGUgPGNvZGU+Z2V0U3RhcnQ8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmdldEVuZDwvY29kZT4gbWV0aG9kcywgd2hpY2ggd2lsbCB0aGVyZWZvcmUgYW5zd2VyIHVwZGF0ZWQKLQkgKiBwb3NpdGlvbiBkYXRhIGlmIGl0IGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IHR5cGUKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCB0aGlzIGNvbnRleHQgYXBwbGllcyB0bwotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIGRlc2NyaWJpbmcgdGhlIGFyZWEgb2YgdGhlIGRvY3VtZW50IHdoaWNoIGZvcm1zCi0JICogICAgICAgICAgICB0aGUgdGVtcGxhdGUgY29udGV4dAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoVGVtcGxhdGVDb250ZXh0VHlwZSB0eXBlLCBJRG9jdW1lbnQgZG9jdW1lbnQsIFBvc2l0aW9uIHBvc2l0aW9uKSB7Ci0JCXN1cGVyKHR5cGUsIGRvY3VtZW50LCBwb3NpdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRvY3VtZW50IHRlbXBsYXRlIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IHR5cGUKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCB0aGlzIGNvbnRleHQgYXBwbGllcyB0bwotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGRvY3VtZW50IHJlZ2lvbgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRvY3VtZW50IHJlZ2lvbgotCSAqIEBwYXJhbSBpbnNlcnRPZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGRvY3VtZW50IHJlZ2lvbiB3aGVyZSBpbnNlcnQgd2FzCi0JICogICAgICAgICAgICBvcmlnaW5hbGx5IHJlcXVlc3RlZAotCSAqLwotCXB1YmxpYyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dChUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUsIElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGluc2VydE9mZnNldCkgewotCQl0aGlzKHR5cGUsIGRvY3VtZW50LCBuZXcgUG9zaXRpb24ob2Zmc2V0LCBsZW5ndGgpKTsKLQkJZkluc2VydE9mZnNldCA9IGluc2VydE9mZnNldDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0I2V2YWx1YXRlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlKQotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZUJ1ZmZlciBldmFsdWF0ZShUZW1wbGF0ZSB0ZW1wbGF0ZSkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBUZW1wbGF0ZUV4Y2VwdGlvbiB7Ci0JCVRlbXBsYXRlQnVmZmVyIGJ1ZmZlciA9IHN1cGVyLmV2YWx1YXRlKHRlbXBsYXRlKTsKLQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQlpZiAoZkluc2VydE9mZnNldCA+IC0xICYmIGZJbnNlcnRPZmZzZXQgPiBnZXRTdGFydCgpKSB7Ci0JCQkJU3RyaW5nIHByZWZpeCA9IGdldERvY3VtZW50KCkuZ2V0KGdldFN0YXJ0KCksIGZJbnNlcnRPZmZzZXQgLSBnZXRTdGFydCgpKTsKLQkJCQlpZiAoIXRlbXBsYXRlLmdldE5hbWUoKS5zdGFydHNXaXRoKHByZWZpeCkpIHsKLQkJCQkJLy8gZ2VuZXJhdGUgYSBuZXcgYnVmZmVyIHRoYXQgYWN0dWFsbHkgY29udGFpbnMgdGhlCi0JCQkJCS8vIHRleHQgdGhhdCB3YXMgZ29pbmcgdG8gYmUgb3ZlcndyaXR0ZW4KLQkJCQkJYnVmZmVyID0gbmV3IFRlbXBsYXRlQnVmZmVyKHByZWZpeCArIGJ1ZmZlci5nZXRTdHJpbmcoKSwgYnVmZmVyLmdldFZhcmlhYmxlcygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0pTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI2MTU5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgU2NobmVpZGVyLCBkYXZpZC5zY2huZWlkZXJAdW5pc3lzLmNvbSAtIFsxNDI1MDBdIFdUUCBwcm9wZXJ0aWVzIHBhZ2VzIGZvbnRzIGRvbid0IGZvbGxvdyBFY2xpcHNlIHByZWZlcmVuY2VzICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5KU1BGQ29udGVudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLQotLyoqCi0gKiBKU1AgRnJhZ21lbnQgUHJvcGVydHkgUGFnZQotICovCi1wdWJsaWMgY2xhc3MgSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9OT05FID0gSlNQVUlNZXNzYWdlcy5KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzA7Ci0KLQkvLyBUT0RPOiBGaWd1cmUgb3V0IHdoYXQgdG8gZG8gd2l0aCB0aGVzZSBzdHJpbmdzL3ZhcmlhYmxlcwotCXByaXZhdGUgU3RyaW5nW10gZkxhbmd1YWdlcyA9IHtTRUxFQ1RfTk9ORSwgImphdmEiLCAvLyROT04tTkxTLTEkCi0JCQkJImphdmFzY3JpcHQifTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nW10gZkNvbnRlbnRUeXBlcyA9IHtTRUxFQ1RfTk9ORSwgImFwcGxpY2F0aW9uL3hodG1sK3htbCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiYXBwbGljYXRpb24veG1sIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJ0ZXh0L2h0bWwiLCAvLyROT04tTkxTLTEkCi0JCQkJInRleHQveG1sIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkidGV4dC9jc3MifTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBjbGFzcyBCdXR0b25MaXN0ZW5lciBleHRlbmRzIFNlbGVjdGlvbkFkYXB0ZXIgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlib29sZWFuIHNwZWNpZmljID0gZlNwZWNpZmljU2V0dGluZy5nZXRTZWxlY3Rpb24oKTsKLQkJCXVwZGF0ZUJ1dHRvbnMoc3BlY2lmaWMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb21ibyBmTGFuZ3VhZ2VDb21ibzsKLQlwcml2YXRlIENvbWJvIGZDb250ZW50VHlwZUNvbWJvOwotCXByaXZhdGUgQnV0dG9uIGZWYWxpZGF0ZUZyYWdtZW50czsKLQlCdXR0b24gZlNwZWNpZmljU2V0dGluZzsKLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGZTcGVjaWZpY0xpc3RlbmVyOwotCi0JcHVibGljIEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldERlc2NyaXB0aW9uKEpTUFVJTWVzc2FnZXMuSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8xKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHByb3BlcnR5UGFnZSA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDIpOwotCi0JCS8vIGZyYWdtZW50IGxhbmd1YWdlIGNvbnRyb2wKLQkJVGV4dCBsYW5ndWFnZUxhYmVsID0gbmV3IFRleHQocHJvcGVydHlQYWdlLCBTV1QuUkVBRF9PTkxZKTsKLQkJbGFuZ3VhZ2VMYWJlbC5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8yKTsKLQkJZkxhbmd1YWdlQ29tYm8gPSBuZXcgQ29tYm8ocHJvcGVydHlQYWdlLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlmTGFuZ3VhZ2VDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmTGFuZ3VhZ2VDb21iby5zZXRJdGVtcyhmTGFuZ3VhZ2VzKTsKLQotCQkvLyBmcmFnbWVudCBjb250ZW50IHR5cGUgY29udHJvbAotCQlUZXh0IGNvbnRlbnRUeXBlTGFiZWwgPSBuZXcgVGV4dChwcm9wZXJ0eVBhZ2UsIFNXVC5SRUFEX09OTFkpOwotCQljb250ZW50VHlwZUxhYmVsLnNldFRleHQoSlNQVUlNZXNzYWdlcy5KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzMpOwotCQlmQ29udGVudFR5cGVDb21ibyA9IG5ldyBDb21ibyhwcm9wZXJ0eVBhZ2UsIFNXVC5OT05FKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWZDb250ZW50VHlwZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZDb250ZW50VHlwZUNvbWJvLnNldEl0ZW1zKGZDb250ZW50VHlwZXMpOwotCi0JCS8vIGNyZWF0ZSBzZXBhcmF0b3IKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocHJvcGVydHlQYWdlLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLnZlcnRpY2FsU3BhbiA9IDg7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gc3BlY2lmaWMgc2V0dGluZwotCQlmU3BlY2lmaWNTZXR0aW5nID0gbmV3IEJ1dHRvbihwcm9wZXJ0eVBhZ2UsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKLQkJZlNwZWNpZmljU2V0dGluZy5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV80KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmU3BlY2lmaWNTZXR0aW5nLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZlNwZWNpZmljTGlzdGVuZXIgPSBuZXcgQnV0dG9uTGlzdGVuZXIoKTsKLQkJZlNwZWNpZmljU2V0dGluZy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihmU3BlY2lmaWNMaXN0ZW5lcik7Ci0KLQkJLy8gdmFsaWRhdGUgZmlsZQotCQlmVmFsaWRhdGVGcmFnbWVudHMgPSBuZXcgQnV0dG9uKHByb3BlcnR5UGFnZSwgU1dULkNIRUNLIHwgU1dULkxFRlQpOwotCQlmVmFsaWRhdGVGcmFnbWVudHMuc2V0VGV4dChKU1BVSU1lc3NhZ2VzLkpTUEZpbGVzUHJlZmVyZW5jZVBhZ2VfMSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gNTsKLQkJZlZhbGlkYXRlRnJhZ21lbnRzLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJaW5pdGlhbGl6ZVZhbHVlcygpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocHJvcGVydHlQYWdlLCBJSGVscENvbnRleHRJZHMuSlNQX0ZSQUdNRU5UX0hFTFBJRCk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJcmV0dXJuIHByb3BlcnR5UGFnZTsKLQl9Ci0KLQl2b2lkIHVwZGF0ZUJ1dHRvbnMoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWZTcGVjaWZpY1NldHRpbmcuc2V0U2VsZWN0aW9uKGVuYWJsZWQpOwotCQlmVmFsaWRhdGVGcmFnbWVudHMuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHJlc291cmNlIHRoaXMgcHJvcGVydGllcyBwYWdlIGlzIGZvcgotCSAqIAotCSAqIEByZXR1cm4gSVJlc291cmNlIGZvciB0aGlzIHByb3BlcnRpZXMgcGFnZSBvciBudWxsIGlmIHRoZXJlIGlzIG5vCi0JICogICAgICAgICBJUmVzb3VyY2UKLQkgKi8KLQlwcml2YXRlIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJSUFkYXB0YWJsZSBhZGFwdGFibGUgPSBnZXRFbGVtZW50KCk7Ci0JCWlmIChhZGFwdGFibGUgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCXJlc291cmNlID0gKElSZXNvdXJjZSkgYWRhcHRhYmxlOwotCQl9IGVsc2UgaWYgKGFkYXB0YWJsZSAhPSBudWxsKSB7Ci0JCQlPYmplY3QgbyA9IGFkYXB0YWJsZS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCXJlc291cmNlID0gKElSZXNvdXJjZSlvOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJU3RyaW5nIGxhbmd1YWdlID0gSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KEpTUEZDb250ZW50UHJvcGVydGllcy5KU1BMQU5HVUFHRSwgZ2V0UmVzb3VyY2UoKSwgZmFsc2UpOwotCQlpZiAobGFuZ3VhZ2UgPT0gbnVsbCB8fCBsYW5ndWFnZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkvLyBpZiBudWxsLCB1c2Ugbm9uZQotCQkJbGFuZ3VhZ2UgPSBTRUxFQ1RfTk9ORTsKLQkJfQotCQkvKgotCQkgKiBJZiBpdGVtIGlzIGFscmVhZHkgcGFydCBvZiBjb21ibywgc2VsZWN0IGl0LiBPdGhlcndpc2UsIGFkZCB0byB0aGUKLQkJICogY29tYm9ib3guCi0JCSAqLwotCQlpbnQgaW5kZXggPSBmTGFuZ3VhZ2VDb21iby5pbmRleE9mKGxhbmd1YWdlKTsKLQkJaWYgKGluZGV4ID4gLTEpCi0JCQlmTGFuZ3VhZ2VDb21iby5zZWxlY3QoaW5kZXgpOwotCQllbHNlCi0JCQlmTGFuZ3VhZ2VDb21iby5zZXRUZXh0KGxhbmd1YWdlKTsKLQotCQlTdHJpbmcgY29udGVudFR5cGUgPSBKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUENPTlRFTlRUWVBFLCBnZXRSZXNvdXJjZSgpLCBmYWxzZSk7Ci0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsIHx8IGNvbnRlbnRUeXBlLmxlbmd0aCgpID09IDApIHsKLQkJCS8vIGlmIG51bGwsIHVzZSBub25lCi0JCQljb250ZW50VHlwZSA9IFNFTEVDVF9OT05FOwotCQl9Ci0JCS8qCi0JCSAqIElmIGl0ZW0gaXMgYWxyZWFkeSBwYXJ0IG9mIGNvbWJvLCBzZWxlY3QgaXQuIE90aGVyd2lzZSwgYWRkIHRvIHRoZQotCQkgKiBjb21ib2JveC4KLQkJICovCi0JCWluZGV4ID0gZkNvbnRlbnRUeXBlQ29tYm8uaW5kZXhPZihjb250ZW50VHlwZSk7Ci0JCWlmIChpbmRleCA+IC0xKQotCQkJZkNvbnRlbnRUeXBlQ29tYm8uc2VsZWN0KGluZGV4KTsKLQkJZWxzZQotCQkJZkNvbnRlbnRUeXBlQ29tYm8uc2V0VGV4dChjb250ZW50VHlwZSk7Ci0KLQkJU3RyaW5nIHZhbGlkYXRlID0gSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KEpTUEZDb250ZW50UHJvcGVydGllcy5WQUxJREFURV9GUkFHTUVOVFMsIGdldFJlc291cmNlKCksIGZhbHNlKTsKLQkJU3RyaW5nIHZhbGlkYXRlMiA9IEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShKU1BGQ29udGVudFByb3BlcnRpZXMuVkFMSURBVEVfRlJBR01FTlRTLCBnZXRSZXNvdXJjZSgpLCB0cnVlKTsKLQkJaWYgKHZhbGlkYXRlID09IG51bGwgfHwgdmFsaWRhdGUubGVuZ3RoKCkgPT0gMCkgewotCQkJdXBkYXRlQnV0dG9ucyhmYWxzZSk7Ci0JCQlmVmFsaWRhdGVGcmFnbWVudHMuc2V0U2VsZWN0aW9uKEJvb2xlYW4udmFsdWVPZih2YWxpZGF0ZTIpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXVwZGF0ZUJ1dHRvbnModHJ1ZSk7Ci0JCQlmVmFsaWRhdGVGcmFnbWVudHMuc2V0U2VsZWN0aW9uKEJvb2xlYW4udmFsdWVPZih2YWxpZGF0ZSkuYm9vbGVhblZhbHVlKCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlpbnQgaW5kZXggPSBmTGFuZ3VhZ2VDb21iby5pbmRleE9mKFNFTEVDVF9OT05FKTsKLQkJaWYgKGluZGV4ID4gLTEpCi0JCQlmTGFuZ3VhZ2VDb21iby5zZWxlY3QoaW5kZXgpOwotCi0JCWluZGV4ID0gZkNvbnRlbnRUeXBlQ29tYm8uaW5kZXhPZihTRUxFQ1RfTk9ORSk7Ci0JCWlmIChpbmRleCA+IC0xKQotCQkJZkNvbnRlbnRUeXBlQ29tYm8uc2VsZWN0KGluZGV4KTsKLQotCQl1cGRhdGVCdXR0b25zKGZhbHNlKTsKLQkJZlZhbGlkYXRlRnJhZ21lbnRzLnNldFNlbGVjdGlvbih0cnVlKTsKLQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXRyeSB7Ci0JCQkvLyBzYXZlIHRoZSBmcmFnbWVudCBsYW5ndWFnZQotCQkJU3RyaW5nIGxhbmd1YWdlID0gZkxhbmd1YWdlQ29tYm8uZ2V0VGV4dCgpOwotCQkJaWYgKGxhbmd1YWdlID09IG51bGwgfHwgbGFuZ3VhZ2UubGVuZ3RoKCkgPT0gMCB8fCBsYW5ndWFnZS5lcXVhbHNJZ25vcmVDYXNlKFNFTEVDVF9OT05FKSkgewotCQkJCS8vIGlmIG5vbmUsIHVzZSBudWxsCi0JCQkJbGFuZ3VhZ2UgPSBudWxsOwotCQkJfQotCQkJSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLnNldFByb3BlcnR5KEpTUEZDb250ZW50UHJvcGVydGllcy5KU1BMQU5HVUFHRSwgZ2V0UmVzb3VyY2UoKSwgbGFuZ3VhZ2UpOwotCi0JCQkvLyBzYXZlIGZyYWdtZW50IGNvbnRlbnQgdHlwZQotCQkJU3RyaW5nIGNvbnRlbnRUeXBlID0gZkNvbnRlbnRUeXBlQ29tYm8uZ2V0VGV4dCgpOwotCQkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwgfHwgY29udGVudFR5cGUubGVuZ3RoKCkgPT0gMCB8fCBjb250ZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKFNFTEVDVF9OT05FKSkgewotCQkJCS8vIGlmIG5vbmUsIHVzZSBudWxsCi0JCQkJY29udGVudFR5cGUgPSBudWxsOwotCQkJfQotCQkJSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLnNldFByb3BlcnR5KEpTUEZDb250ZW50UHJvcGVydGllcy5KU1BDT05URU5UVFlQRSwgZ2V0UmVzb3VyY2UoKSwgY29udGVudFR5cGUpOwotCi0JCQlTdHJpbmcgdmFsaWRhdGUgPSBudWxsOwotCQkJaWYgKGZTcGVjaWZpY1NldHRpbmcuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQl2YWxpZGF0ZSA9IEJvb2xlYW4udG9TdHJpbmcoZlZhbGlkYXRlRnJhZ21lbnRzLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJCUpTUEZDb250ZW50UHJvcGVydGllcy5zZXRQcm9wZXJ0eShKU1BGQ29udGVudFByb3BlcnRpZXMuVkFMSURBVEVfRlJBR01FTlRTLCBnZXRSZXNvdXJjZSgpLCB2YWxpZGF0ZSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gbWF5YmUgaW4gZnV0dXJlLCBsZXQgdXNlciBrbm93IHRoZXJlIHdhcyBhIHByb2JsZW0gc2F2aW5nIGZpbGUKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5wZXJmb3JtT2soKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Qcm9qZWN0SlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTk3NmI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Qcm9qZWN0SlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIHsKLQlwdWJsaWMgUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UoKSB7Ci0JCXNldERlc2NyaXB0aW9uKEpTUFVJTWVzc2FnZXMuUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2Rlcml2ZWQvU2luZ2xlQ2hhclJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2Rlcml2ZWQvU2luZ2xlQ2hhclJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTk4YTI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9kZXJpdmVkL1NpbmdsZUNoYXJSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZGVyaXZlZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLS8qCi0gKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LmphdmFkb2MuU2luZ2xlQ2hhclJlYWRlci4KLSAqIE1vZGlmaWNhdGlvbiB3YXMgbWFkZSB0byBmaXggc3RhdGVtZW50IHVubmVjZXNzYXJpbHkgbmVzdGVkIHdpdGhpbiBlbHNlCi0gKiBjbGF1c2Ugd2FybmluZyBpbiByZWFkKC4uKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNpbmdsZUNoYXJSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjcmVhZCgpCi0JICovCi0JcHVibGljIGFic3RyYWN0IGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjcmVhZChjaGFyW10saW50LGludCkKLQkgKi8KLQlwdWJsaWMgaW50IHJlYWQoY2hhciBjYnVmW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBlbmQgPSBvZmYgKyBsZW47Ci0JCWZvciAoaW50IGkgPSBvZmY7IGkgPCBlbmQ7IGkrKykgewotCQkJaW50IGNoID0gcmVhZCgpOwotCQkJaWYgKGNoID09IC0xKSB7Ci0JCQkJaWYgKGkgPT0gb2ZmKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGkgLSBvZmY7Ci0JCQl9Ci0JCQljYnVmW2ldID0gKGNoYXIpIGNoOwotCQl9Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjcmVhZHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGVudCBhcyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGNoOwotCQl3aGlsZSAoKGNoID0gcmVhZCgpKSAhPSAtMSkgewotCQkJYnVmLmFwcGVuZCgoY2hhcikgY2gpOwotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0FjdGlvbkNvbnRyaWJ1dG9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0FjdGlvbkNvbnRyaWJ1dG9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOTcxNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9BY3Rpb25Db250cmlidXRvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5hY3Rpb25zLlJlZmFjdG9yQWN0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5JQWN0aW9uQ29uc3RhbnRzSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSUFjdGlvbkRlZmluaXRpb25JZHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0LnVpLkFjdGlvbkNvbnRyaWJ1dG9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnMuU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHM7Ci0KLS8qKgotICogQWN0aW9uQ29udHJpYnV0b3JKU1AKLSAqIAotICogVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIHVzZWQgaW5zaWRlIG11bHRpIHBhZ2UgZWRpdG9yJ3MKLSAqIEFjdGlvbkJhckNvbnRyaWJ1dG9yLCBzaW5jZSBjYXNjYWRlZCBpbml0KCkgY2FsbCBmcm9tIHRoZQotICogQWN0aW9uQmFyQ29udHJpYnV0b3Igd2lsbCBjYXVzZXMgZXhjZXB0aW9uIGFuZCBpdCBsZWFkcyB0byBsb3NlIHdob2xlCi0gKiB0b29sYmFycy4KLSAqIAotICogSW5zdGVhZCwgdXNlIFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvciBmb3Igc291cmNlIHBhZ2UgY29udHJpYnV0b3Igb2YKLSAqIG11bHRpIHBhZ2UgZWRpdG9yLgotICogCi0gKiBOb3RlIHRoYXQgdGhpcyBjbGFzcyBpcyBzdGlsbCB2YWxpZCBmb3Igc2luZ2xlIHBhZ2UgZWRpdG9yLgotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uQ29udHJpYnV0b3JKU1AgZXh0ZW5kcyBBY3Rpb25Db250cmlidXRvckhUTUwgewotCi0JcHJpdmF0ZSBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gcmVuYW1lRWxlbWVudEFjdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gbW92ZUVsZW1lbnRBY3Rpb24gPSBudWxsOwotCXByaXZhdGUgSU1lbnVNYW5hZ2VyIHJlZmFjdG9yTWVudSA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFRElUT1JfSURTID0geyJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlLnNvdXJjZSIsICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHVibGljIEFjdGlvbkNvbnRyaWJ1dG9ySlNQKCkgewotCQlzdXBlcigpOwotCi0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IEpTUFVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdGhpcy5yZW5hbWVFbGVtZW50QWN0aW9uID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihidW5kbGUsIElBY3Rpb25Db25zdGFudHNKU1AuQUNUSU9OX05BTUVfUkVOQU1FX0VMRU1FTlQgKyBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRFUlNDT1JFKTsKLQkJdGhpcy5yZW5hbWVFbGVtZW50QWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChJQWN0aW9uRGVmaW5pdGlvbklkc0pTUC5SRU5BTUVfRUxFTUVOVCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5yZW5hbWVFbGVtZW50QWN0aW9uLCBJSGVscENvbnRleHRJZHMuSlNQX1JFRkFDVE9SUkVOQU1FX0hFTFBJRCk7Ci0KLQkJdGhpcy5tb3ZlRWxlbWVudEFjdGlvbiA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24oYnVuZGxlLCBJQWN0aW9uQ29uc3RhbnRzSlNQLkFDVElPTl9OQU1FX01PVkVfRUxFTUVOVCArIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVOREVSU0NPUkUpOwotCQl0aGlzLm1vdmVFbGVtZW50QWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChJQWN0aW9uRGVmaW5pdGlvbklkc0pTUC5NT1ZFX0VMRU1FTlQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMubW92ZUVsZW1lbnRBY3Rpb24sIElIZWxwQ29udGV4dElkcy5KU1BfUkVGQUNUT1JNT1ZFX0hFTFBJRCk7Ci0KLQkJLy8gdGhlIHJlZmFjdG9yIG1lbnUsIGFkZCB0aGUgbWVudSBpdHNlbGYgdG8gYWRkIGFsbCByZWZhY3RvciBhY3Rpb25zCi0JCXRoaXMucmVmYWN0b3JNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKEpTUFVJTWVzc2FnZXMuQWN0aW9uQ29udHJpYnV0b3JKU1BfMCwgUmVmYWN0b3JBY3Rpb25Hcm91cC5NRU5VX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlyZWZhY3Rvck1lbnUuYWRkKHRoaXMucmVuYW1lRWxlbWVudEFjdGlvbik7Ci0JCXJlZmFjdG9yTWVudS5hZGQodGhpcy5tb3ZlRWxlbWVudEFjdGlvbik7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RXh0ZW5zaW9uSURzKCkgewotCQlyZXR1cm4gRURJVE9SX0lEUzsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5hZGRUb01lbnUobWVudSk7Ci0KLQkJbWVudS5pbnNlcnRBZnRlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCwgdGhpcy5yZWZhY3Rvck1lbnUpOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikgewotCi0JCXN1cGVyLnNldEFjdGl2ZUVkaXRvcihhY3RpdmVFZGl0b3IpOwotCQl0aGlzLnJlbmFtZUVsZW1lbnRBY3Rpb24uc2V0QWN0aW9uKGdldEFjdGlvbihnZXRUZXh0RWRpdG9yKGdldEFjdGl2ZUVkaXRvclBhcnQoKSksIElBY3Rpb25Db25zdGFudHNKU1AuQUNUSU9OX05BTUVfUkVOQU1FX0VMRU1FTlQpKTsKLQkJdGhpcy5tb3ZlRWxlbWVudEFjdGlvbi5zZXRBY3Rpb24oZ2V0QWN0aW9uKGdldFRleHRFZGl0b3IoZ2V0QWN0aXZlRWRpdG9yUGFydCgpKSwgSUFjdGlvbkNvbnN0YW50c0pTUC5BQ1RJT05fTkFNRV9NT1ZFX0VMRU1FTlQpKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0KLQkJc3VwZXIuc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChlbmFibGVkKTsKLQkJdGhpcy5yZW5hbWVFbGVtZW50QWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXRoaXMubW92ZUVsZW1lbnRBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAxOTM2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLQotLyoqCi0gKiBIZWxwIGNvbnRleHQgaWRzIGZvciB0aGUgSlNQIFNvdXJjZSBFZGl0b3IuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUKLSAqIGltcGxlbWVudGVkLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUhlbHBDb250ZXh0SWRzIHsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IEpTUFVJUGx1Z2luLklEICsgIi4iOyAvLyROT04tTkxTLTEkCi0KLQotCS8vIC8vIGZpZ3VyZWQgb3V0IG9uIHRoZSBmbHkKLQkvLyAvLyBKU1AgU291cmNlIHBhZ2UgZWRpdG9yCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1NPVVJDRVZJRVdfSEVMUElEID0KLQkvLyBDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQICsiX3NvdXJjZV9IZWxwSWQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBKU1AgRmlsZXMgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1BSRUZXRUJYX0ZJTEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDA1MCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBKU1AgU3R5bGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDUxIjsgLy8kTk9OLU5MUy0xJAotCS8vIEpTUCBUZW1wbGF0ZXMgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwNTIiOyAvLyROT04tTkxTLTEkCi0KLQotCS8vIEpTUCBGcmFnbWVudCBQcm9wZXJ0eSBQYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0ZSQUdNRU5UX0hFTFBJRCA9IFBSRUZJWCArICJqc3BmMTAwMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIEpTUCBTb3VyY2UgRWRpdG9yIENvbnRleHQgTWVudQotCS8vIFJlZmFjdG9yIFJlbmFtZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9SRUZBQ1RPUlJFTkFNRV9IRUxQSUQgPSBQUkVGSVggKyAianNwcjAwMTAiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBSZWZhY3RvciBNb3ZlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1JFRkFDVE9STU9WRV9IRUxQSUQgPSBQUkVGSVggKyAianNwcjAwMjAiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBKU1AgTmV3IEZpbGUgV2l6YXJkIC0gVGVtcGxhdGUgUGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEID0gUFJFRklYICsgImpzcHcwMDEwIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9KU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9KU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGNhOWYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9lZGl0b3IvSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGhhbmRsZSBpbWFnZXMgcHJvdmlkZWQgYnkgdGhpcyBwbHVnLWluLgotICogCi0gKiBOT1RFOiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuIEZvciBpbWFnZXMgdXNlZCBleHRlcm5hbGx5LCBwbGVhc2UgdXNlIHRoZQotICogU2hhcmVkKioqSW1hZ2VIZWxwZXIgY2xhc3MgaW5zdGVhZC4KLSAqIAotICogQGF1dGhvciBhbXl3dQotICovCi1wdWJsaWMgY2xhc3MgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgewotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBMVUdJTklEID0gSlNQVUlQbHVnaW4uSUQ7Ci0JcHJpdmF0ZSBzdGF0aWMgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JLy8JIHNhdmUgYSBkZXNjcmlwdG9yIGZvciBlYWNoIGltYWdlCi0JcHJpdmF0ZSBIYXNoTWFwIGZJbWFnZURlc2NSZWdpc3RyeSA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBKU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZSByZWdpc3RyeS4KLQkgKiBJZiB0aGUgaW1hZ2UgY2Fubm90IGJlIHJldHJpZXZlZCwgYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBhdAotCSAqIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgaW4gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIEltYWdlIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2Ugb3IgbnVsbCBpZiBvbmUgY291bGQKLQkgKiAgICAgICAgIG5vdCBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCS8vIGNyZWF0ZSBhbiBpbWFnZQotCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZShyZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLSAgIAotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgSW1hZ2UgYXNzb2NpYXRlZCB3aXRoIEltYWdlRGVzY3JpcHRvciBmcm9tIHRoZSBpbWFnZQotICAgICAqIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIHRoZSBJbWFnZSBjYW5ub3QgYmUgcmV0cmlldmVkLCBpdCBpcyBjcmVhdGVkCi0gICAgICogZnJvbSB0aGUgSW1hZ2VEZXNjcmlwdG9yCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlc291cmNlCi0gICAgICogICAgICAgICAgICB0aGUgaW1hZ2UgZGVzY3JpcHRvciB0byByZXRyaWV2ZQotICAgICAqIEByZXR1cm4gSW1hZ2UgdGhlIGFzc29jaWF0ZWQgd2l0aCB0aGUgSW1hZ2VEZXNjcmlwdG9yIG9yCi0gICAgICogICAgICAgICB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiBvbmUgY291bGQgbm90IGJlCi0gICAgICogICAgICAgICBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKQotICAgICAgICAgICAgZGVzY3JpcHRvcj0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgIAotICAgICAgICBJbWFnZSByZXN1bHQ9IChJbWFnZSlnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLmdldChkZXNjcmlwdG9yKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgCi0gICAgICAgIHJlc3VsdD0gZGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLnB1dChkZXNjcmlwdG9yLCByZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2UgZnJvbSB0aGUgaW1hZ2UKLQkgKiBkZXNjcmlwdG9yIHJlZ2lzdHJ5LiBJZiB0aGUgaW1hZ2UgZGVzY3JpcHRvciBjYW5ub3QgYmUgcmV0cmlldmVkLAotCSAqIGF0dGVtcHQgdG8gZmluZCBhbmQgbG9hZCB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkCi0JICogaW4gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgZGVzY3JpcHRvciB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jYXRlZCB3aXRoIHJlc291cmNlIG9yCi0JICogICAgICAgICB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiBvbmUgY291bGQgbm90IGJlCi0JICogICAgICAgICBmb3VuZAotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gbnVsbDsKLQkJT2JqZWN0IG8gPSBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLmdldChyZXNvdXJjZSk7Ci0JCWlmIChvID09IG51bGwpIHsKLQkJCS8vY3JlYXRlIGEgZGVzY3JpcHRvcgotCQkJaW1hZ2VEZXNjcmlwdG9yID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IChJbWFnZURlc2NyaXB0b3IpIG87Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEhhc2hNYXAgLSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJaWYgKGZJbWFnZURlc2NSZWdpc3RyeSA9PSBudWxsKQotCQkJZkltYWdlRGVzY1JlZ2lzdHJ5ID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGZJbWFnZURlc2NSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiBJbWFnZVJlZ2lzdHJ5IC0gaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSBJbWFnZVJlZ2lzdHJ5IGdldEltYWdlUmVnaXN0cnkoKSB7Ci0JCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBmcm9tIHRoZSBnaXZlbiByZXNvdXJjZSBhbmQgYWRkcyB0aGUgaW1hZ2UgdG8gdGhlCi0JICogaW1hZ2UgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiBJbWFnZQotCSAqLwotCXByaXZhdGUgSW1hZ2UgY3JlYXRlSW1hZ2UoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBkZXNjID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQkKLQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCQkvLyBkb250IGFkZCB0aGUgbWlzc2luZyBpbWFnZSBkZXNjcmlwdG9yIGltYWdlIHRvIHRoZSBpbWFnZSByZWdpc3RyeQotCQkJaWYgKCFkZXNjLmVxdWFscyhJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKSkKLQkJCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHJlc291cmNlLCBpbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmcm9tIHRoZSBnaXZlbiBpbWFnZUZpbGVQYXRoIGFuZCBhZGRzIHRoZQotCSAqIGltYWdlIGRlc2NyaXB0b3IgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIGFuIGltYWdlCi0JICogZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgY3JlYXRlZCwgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IKLQkgKiBpcyByZXR1cm5lZCBidXQgbm90IGFkZGVkIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVQYXRoCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgaW1hZ2UgZGVzY3JpcHRvciBmb3IgaW1hZ2VGaWxlUGF0aCBvciBkZWZhdWx0Ci0JICogICAgICAgICAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGltYWdlRmlsZVBhdGgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5JRCwgaW1hZ2VGaWxlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5wdXQoaW1hZ2VGaWxlUGF0aCwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9lZGl0b3IvSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0pTUEVkaXRvclBsdWdpbkltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDM4ZjJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9lZGl0b3IvSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yOwotCi0vKioKLSAqIEJ1bmRsZSBvZiBtb3N0IGltYWdlcyB1c2VkIGJ5IHRoZSBKU1AgRWRpdG9yIHBsdWctaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BFZGl0b3JQbHVnaW5JbWFnZXMgeyAJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DTEFTU19PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9jbGFzc19vYmouZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfR0VORVJJQyA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0pTUCA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1qc3AuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfVEVNUExBVEUgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctdGVtcGxhdGUuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9QVUJMSUMgPSAiaWNvbnMvZnVsbC9vYmoxNi9wdWJsaWMuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfUFJPVEVDVEVEX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2ZpZWxkX3Byb3RlY3RlZF9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX1BVQkxJQ19PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wdWJsaWNfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9ERUZBVUxUX09CSj0gImljb25zL2Z1bGwvb2JqMTYvZmllbGRfZGVmYXVsdF9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX1BSSVZBVEVfT0JKID0gImljb25zL2Z1bGwvb2JqMTYvZmllbGRfcHJpdmF0ZV9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ08gPSAiaWNvbnMvZnVsbC9vYmoxNi9kZWZhdWx0X2NvLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9URUNURURfQ08gPSAiaWNvbnMvZnVsbC9vYmoxNi9wcm90ZWN0ZWRfY28uZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19DTyA9ICJpY29ucy9mdWxsL29iajE2L3B1YmxpY19jby5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJVkFURV9DTyA9ICJpY29ucy9mdWxsL29iajE2L3ByaXZhdGVfY28uZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOTkVSQ0xBU1NfREVGQVVMVF9PQko9ICJpY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfZGVmYXVsdF9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOTkVSQ0xBU1NfUFJJVkFURV9PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3ByaXZhdGVfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTk5FUkNMQVNTX1BST1RFQ1RFRF9PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3Byb3RlY3RlZF9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOTkVSQ0xBU1NfUFVCTElDX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfcHVibGljX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ORVJJTlRFUkZBQ0VfREVGQVVMVF9PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9kZWZhdWx0X29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ORVJJTlRFUkZBQ0VfUFJJVkFURV9PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9wcml2YXRlX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ORVJJTlRFUkZBQ0VfUFJPVEVDVEVEX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3Byb3RlY3RlZF9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOTkVSSU5URVJGQUNFX1BVQkxJQ19PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9wdWJsaWNfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX09CSiA9ICJpY29ucy9mdWxsL29iajE2L3BhY2thZ2Vfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9WQVJJQUJMRV9PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9sb2NhbHZhcmlhYmxlX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9XSVpCQU5fTkVXSlNQRklMRSA9ICJpY29ucy9mdWxsL3dpemJhbi9uZXdqc3BmaWxlX3dpei5wbmciOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9XSVpCQU5fTkVXVEFHRklMRSA9ICJpY29ucy9mdWxsL3dpemJhbi9uZXdqc3BmaWxlX3dpei5wbmciOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0pTUFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9lZGl0b3IvSlNQU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzE1ZDVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9lZGl0b3IvSlNQU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5QYWdlRGlyZWN0aXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDEyTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5YTUxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIGludGVyZmFjZQotICovCi1wdWJsaWMgY2xhc3MgSlNQU291cmNlRWRpdGluZ1RleHRUb29scyBleHRlbmRzIFhNTFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgewotCi0JcHVibGljIFN0cmluZyBnZXRQYWdlTGFuZ3VhZ2UoTm9kZSBub2RlKSB7Ci0JCVN0cmluZyBsYW5ndWFnZSA9IG51bGw7Ci0JCURvY3VtZW50IGRvYyA9IG51bGw7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlkb2MgPSAoRG9jdW1lbnQpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkb2MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJfQotCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCWlmIChkb2MgaW5zdGFuY2VvZiBJRE9NRG9jdW1lbnQpIHsKLQkJCQlQYWdlRGlyZWN0aXZlQWRhcHRlciBhZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVyKSAoKElET01Eb2N1bWVudCkgZG9jKS5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCQlsYW5ndWFnZSA9IGFkYXB0ZXIuZ2V0TGFuZ3VhZ2UoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGl0ZXJhdGUgdGhyb3VnaCBhbGwgb2YgdGhlIHBhZ2UgZGlyZWN0aXZlcwotCQkJCU5vZGVMaXN0IHBhZ2VEaXJlY3RpdmVzID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9QQUdFKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VEaXJlY3RpdmVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJRWxlbWVudCBwYWdlRGlyZWN0aXZlID0gKEVsZW1lbnQpIHBhZ2VEaXJlY3RpdmVzLml0ZW0oaSk7Ci0JCQkJCVN0cmluZyBsYW5nVmFsdWUgPSBwYWdlRGlyZWN0aXZlLmdldEF0dHJpYnV0ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfTEFOR1VBR0UpOwotCQkJCQkvLyBsYXN0IG9uZSB0byBkZWNsYXJlIGEgbGFuZ3VhZ2Ugd2lucwotCQkJCQlpZiAobGFuZ1ZhbHVlICE9IG51bGwpCi0JCQkJCQlsYW5ndWFnZSA9IGxhbmdWYWx1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgbm8gbGFuZ3VhZ2Ugd2FzIHNwZWNpZmllZCBhbnl3aGVyZSwgYXNzdW1lIEphdmEKLQkJaWYgKGxhbmd1YWdlID09IG51bGwpCi0JCQlsYW5ndWFnZSA9IEpTUDExTmFtZXNwYWNlLkFUVFJfVkFMVUVfSkFWQTsKLQkJcmV0dXJuIGxhbmd1YWdlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9mb3JtYXQvRm9ybWF0dGluZ1N0cmF0ZWd5SlNQSmF2YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2Zvcm1hdC9Gb3JtYXR0aW5nU3RyYXRlZ3lKU1BKYXZhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOWI5MTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2Zvcm1hdC9Gb3JtYXR0aW5nU3RyYXRlZ3lKU1BKYXZhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZm9ybWF0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlRvb2xGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5Db2RlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVHlwZWRQb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklGb3JtYXR0aW5nQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLQotCi1wdWJsaWMgY2xhc3MgRm9ybWF0dGluZ1N0cmF0ZWd5SlNQSmF2YSBleHRlbmRzIENvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSB7Ci0KLQkvKiogRG9jdW1lbnRzIHRvIGJlIGZvcm1hdHRlZCBieSB0aGlzIHN0cmF0ZWd5ICovCi0JcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0IGZEb2N1bWVudHMgPSBuZXcgTGlua2VkTGlzdCgpOwotCS8qKiBQYXJ0aXRpb25zIHRvIGJlIGZvcm1hdHRlZCBieSB0aGlzIHN0cmF0ZWd5ICovCi0JcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0IGZQYXJ0aXRpb25zID0gbmV3IExpbmtlZExpc3QoKTsKLQlKU1BUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGphdmEgZm9ybWF0dGluZyBzdHJhdGVneS4KLQkgKi8KLQlwdWJsaWMgRm9ybWF0dGluZ1N0cmF0ZWd5SlNQSmF2YSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5I2Zvcm1hdCgpCi0JICovCi0JcHVibGljIHZvaWQgZm9ybWF0KCkgewotCQlzdXBlci5mb3JtYXQoKTsKLQotCQlmaW5hbCBJRG9jdW1lbnQgZG9jdW1lbnQgPSAoSURvY3VtZW50KSBmRG9jdW1lbnRzLnJlbW92ZUZpcnN0KCk7Ci0JCWZpbmFsIFR5cGVkUG9zaXRpb24gcGFydGl0aW9uID0gKFR5cGVkUG9zaXRpb24pIGZQYXJ0aXRpb25zLnJlbW92ZUZpcnN0KCk7Ci0KLQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgcGFydGl0aW9uICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0KLQkJCQlKU1BUcmFuc2xhdGlvblV0aWwgdHJhbnNsYXRpb25VdGlsID0gbmV3IEpTUFRyYW5zbGF0aW9uVXRpbChkb2N1bWVudCk7Ci0JCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRyYW5zbGF0aW9uVXRpbC5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCQlpZiAoY3UgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgY3VTb3VyY2UgPSBjdS5nZXRTb3VyY2UoKTsKLQkJCQkJVGV4dEVkaXQgdGV4dEVkaXQgPSBmb3JtYXRTdHJpbmcoQ29kZUZvcm1hdHRlci5LX0NPTVBJTEFUSU9OX1VOSVQsIGN1U291cmNlLCAwLCBUZXh0VXRpbGl0aWVzLmdldERlZmF1bHRMaW5lRGVsaW1pdGVyKGRvY3VtZW50KSwgZ2V0UHJlZmVyZW5jZXMoKSk7Ci0KLQkJCQkJVGV4dEVkaXQganNwRWRpdCA9IHRyYW5zbGF0aW9uVXRpbC5nZXRUcmFuc2xhdGlvbigpLmdldEpzcEVkaXQodGV4dEVkaXQpOwotCQkJCQlpZiAoanNwRWRpdCAhPSBudWxsICYmIGpzcEVkaXQuaGFzQ2hpbGRyZW4oKSkKLQkJCQkJCWpzcEVkaXQuYXBwbHkoZG9jdW1lbnQpOwotCQkJCX0KLQotCQkJfQotCQkJY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCS8vIENhbiBvbmx5IGhhcHBlbiBvbiBjb25jdXJyZW50IGRvY3VtZW50IG1vZGlmaWNhdGlvbiAtIGxvZwotCQkJCS8vIGFuZCBiYWlsIG91dAotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXR0ZXJTdGFydHMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUZvcm1hdHRpbmdDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIGZvcm1hdHRlclN0YXJ0cyhmaW5hbCBJRm9ybWF0dGluZ0NvbnRleHQgY29udGV4dCkgewotCQlzdXBlci5mb3JtYXR0ZXJTdGFydHMoY29udGV4dCk7Ci0KLQkJZlBhcnRpdGlvbnMuYWRkTGFzdChjb250ZXh0LmdldFByb3BlcnR5KEZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllcy5DT05URVhUX1BBUlRJVElPTikpOwotCQlmRG9jdW1lbnRzLmFkZExhc3QoY29udGV4dC5nZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9NRURJVU0pKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5I2Zvcm1hdHRlclN0b3BzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXR0ZXJTdG9wcygpIHsKLQkJc3VwZXIuZm9ybWF0dGVyU3RvcHMoKTsKLQotCQlmUGFydGl0aW9ucy5jbGVhcigpOwotCQlmRG9jdW1lbnRzLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIFRleHRFZGl0IGZvcm1hdFN0cmluZyhpbnQga2luZCwgU3RyaW5nIHN0cmluZywgaW50IGluZGVudGF0aW9uTGV2ZWwsIFN0cmluZyBsaW5lU2VwYXJhdG9yLCBNYXAgb3B0aW9ucykgewotCQlyZXR1cm4gVG9vbEZhY3RvcnkuY3JlYXRlQ29kZUZvcm1hdHRlcihvcHRpb25zKS5mb3JtYXQoa2luZCwgc3RyaW5nLCAwLCBzdHJpbmcubGVuZ3RoKCksIGluZGVudGF0aW9uTGV2ZWwsIGxpbmVTZXBhcmF0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oYW5kbGVycy9KU1BGaW5kT2NjdXJyZW5jZXNIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaGFuZGxlcnMvSlNQRmluZE9jY3VycmVuY2VzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzQ2N2RhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oYW5kbGVycy9KU1BGaW5kT2NjdXJyZW5jZXNIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc2VhcmNoLkhUTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oYW5kbGVycy5GaW5kT2NjdXJyZW5jZXNIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgSlNQRmluZE9jY3VycmVuY2VzSGFuZGxlciBleHRlbmRzIEZpbmRPY2N1cnJlbmNlc0hhbmRsZXIgewotCXByaXZhdGUgTGlzdCBmUHJvY2Vzc29yczsKLQkKLQlwcm90ZWN0ZWQgTGlzdCBnZXRQcm9jZXNzb3JzKCkgewotCQlpZiAoZlByb2Nlc3NvcnMgPT0gbnVsbCkgewotCQkJZlByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlIVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGh0bWxQcm9jZXNzb3IgPSBuZXcgSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcigpOwotCQkJZlByb2Nlc3NvcnMuYWRkKGh0bWxQcm9jZXNzb3IpOwotLy8JCQkgdGVtcG9yYXJ5LCB3b3JrYXJvdW5kIHRvIGRpc2FibGUgZnVuY3Rpb24sIHNpbmNlIHVzaW5nIHRoZSBmdW5jdGlvbiAKLS8vCQkJIGNhbiBlYXNpbHkgY2F1c2UgZGVhZGxvY2sgdG8gb2NjdXIuCi0vLwkJCQkJIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAzNjYyCi0vLwkJCUpTUEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciBqc3BQcm9jZXNzb3IgPSBuZXcgSlNQRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yKCk7Ci0vLwkJCWZQcm9jZXNzb3JzLmFkZChqc3BQcm9jZXNzb3IpOwotCQl9Ci0JCXJldHVybiBmUHJvY2Vzc29yczsKLQl9Ci0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVFZGl0b3JJbnB1dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjUwMjY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXRoRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUxvY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci0KLS8qKgotICogRWRpdG9ySW5wdXQgZm9yIGV4dGVybmFsIGZpbGVzLiBDb3BpZWQgZnJvbQotICogb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZWRpdG9ycy50ZXh0LkphdmFGaWxlRWRpdG9ySW5wdXQKLSAqLwotY2xhc3MgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJRWRpdG9ySW5wdXQsIElMb2NhdGlvblByb3ZpZGVyIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JCi0JLyoqCi0JICogVGhlIHdvcmtiZW5jaCBhZGFwdGVyIHdoaWNoIHNpbXBseSBwcm92aWRlcyB0aGUgbGFiZWwuCi0JICogCi0JICogQHNlZSAgRWNsaXBzZSAzLjEKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFdvcmtiZW5jaEFkYXB0ZXIgaW1wbGVtZW50cyBJV29ya2JlbmNoQWRhcHRlciB7Ci0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldEltYWdlRGVzY3JpcHRvcihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldExhYmVsKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gKChFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgbykuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgRmlsZSBmRmlsZTsKLQlwcml2YXRlIFdvcmtiZW5jaEFkYXB0ZXIgZldvcmtiZW5jaEFkYXB0ZXIgPSBuZXcgV29ya2JlbmNoQWRhcHRlcigpOwotCi0JcHVibGljIEV4dGVybmFsRmlsZUVkaXRvcklucHV0KEZpbGUgZmlsZSkgewotCQlzdXBlcigpOwotCQlmRmlsZSA9IGZpbGU7Ci0JCWZXb3JrYmVuY2hBZGFwdGVyID0gbmV3IFdvcmtiZW5jaEFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2V4aXN0cygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQlyZXR1cm4gZkZpbGUuZXhpc3RzKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRJbWFnZURlc2NyaXB0b3IoKQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZGaWxlLmdldE5hbWUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFBlcnNpc3RhYmxlKCkKLQkgKi8KLQlwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRUb29sVGlwVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJcmV0dXJuIGZGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoSUxvY2F0aW9uUHJvdmlkZXIuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQotCQkJcmV0dXJuIHRoaXM7Ci0JCWlmIChJV29ya2JlbmNoQWRhcHRlci5jbGFzcy5lcXVhbHMoYWRhcHRlcikpCi0JCQlyZXR1cm4gZldvcmtiZW5jaEFkYXB0ZXI7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5JTG9jYXRpb25Qcm92aWRlciNnZXRQYXRoKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElQYXRoIGdldFBhdGgoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgewotCQkJRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgaW5wdXQgPSAoRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gUGF0aC5mcm9tT1NTdHJpbmcoaW5wdXQuZkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBhdGhFZGl0b3JJbnB1dCNnZXRQYXRoKCkKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0gICAgICAgIHJldHVybiBQYXRoLmZyb21PU1N0cmluZyhmRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgfQotCi0JLyoKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvID09IHRoaXMpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAobyBpbnN0YW5jZW9mIEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCBpbnB1dCA9IChFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgbzsKLQkJCXJldHVybiBmRmlsZS5lcXVhbHMoaW5wdXQuZkZpbGUpOwotCQl9Ci0JCQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIElQYXRoRWRpdG9ySW5wdXQpIHsKLSAgICAgICAgICAgIElQYXRoRWRpdG9ySW5wdXQgaW5wdXQ9IChJUGF0aEVkaXRvcklucHV0KW87Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UGF0aCgpLmVxdWFscyhpbnB1dC5nZXRQYXRoKCkpOwotICAgICAgICB9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZkZpbGUuaGFzaENvZGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg1NzU3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLS8qKgotICogSHlwZXJsaW5rIGZvciBleHRlcm5hbCBmaWxlcy4KLSAqLwotY2xhc3MgRXh0ZXJuYWxGaWxlSHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluawotCQotCXByaXZhdGUgSVJlZ2lvbiBmSHlwZXJsaW5rUmVnaW9uOwotCXByaXZhdGUgRmlsZSBmSHlwZXJsaW5rRmlsZTsKLQotCXB1YmxpYyBFeHRlcm5hbEZpbGVIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIEZpbGUgZmlsZSkgewotCQlmSHlwZXJsaW5rRmlsZSA9IGZpbGU7Ci0JCWZIeXBlcmxpbmtSZWdpb24gPSByZWdpb247Ci0JfQotCQotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsKLQkJcmV0dXJuIGZIeXBlcmxpbmtSZWdpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7Ci0JCXJldHVybiBmSHlwZXJsaW5rRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0JCXJldHVybiBmSHlwZXJsaW5rRmlsZS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJaWYgKGZIeXBlcmxpbmtGaWxlICE9IG51bGwpIHsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dChmSHlwZXJsaW5rRmlsZSk7Ci0JCQlJRWRpdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCQkJdHJ5IHsKLQkJCQlkZXNjcmlwdG9yID0gSURFLmdldEVkaXRvckRlc2NyaXB0b3IoaW5wdXQuZ2V0TmFtZSgpLCB0cnVlKTsKLQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgaW5wdXQsIGRlc2NyaXB0b3IuZ2V0SWQoKSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0pTUEphdmFIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvSlNQSmF2YUh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGQ4MWIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvSlNQSmF2YUh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi0vKioKLSAqIEh5cGVybGluayBmb3IgSlNQIEphdmEgZWxlbWVudHMKLSAqLwotY2xhc3MgSlNQSmF2YUh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgewotCXByaXZhdGUgSVJlZ2lvbiBmUmVnaW9uOwotCXByaXZhdGUgSUphdmFFbGVtZW50IGZFbGVtZW50OwotCi0JcHVibGljIEpTUEphdmFIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZFbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rUmVnaW9uKCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKSB7Ci0JCXJldHVybiBmUmVnaW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRUeXBlTGFiZWwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkgewotCQlyZXR1cm4gZkVsZW1lbnQuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1RleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsKLQkJcmV0dXJuIGZFbGVtZW50LmdldEVsZW1lbnROYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI29wZW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JCXRyeSB7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBKYXZhVUkub3BlbkluRWRpdG9yKGZFbGVtZW50KTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCUphdmFVSS5yZXZlYWxJbkVkaXRvcihlZGl0b3IsIGZFbGVtZW50KTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvSlNQSmF2YUh5cGVybGlua0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0pTUEphdmFIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDZkZWUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvSlNQSmF2YUh5cGVybGlua0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTG9jYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklTb3VyY2VSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JU291cmNlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLkFic3RyYWN0SHlwZXJsaW5rRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5JSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotLyoqCi0gKiBEZXRlY3RzIGh5cGVybGlua3MgaW4gSlNQIEphdmEgY29udGVudAotICovCi1wdWJsaWMgY2xhc3MgSlNQSmF2YUh5cGVybGlua0RldGVjdG9yIGV4dGVuZHMgQWJzdHJhY3RIeXBlcmxpbmtEZXRlY3RvciB7Ci0KLQlwcml2YXRlIElIeXBlcmxpbmsgY3JlYXRlSHlwZXJsaW5rKElKYXZhRWxlbWVudCBlbGVtZW50LCBJUmVnaW9uIHJlZ2lvbiwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlIeXBlcmxpbmsgbGluayA9IG51bGw7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJLy8gb3BlbiBsb2NhbCB2YXJpYWJsZSBpbiB0aGUgSlNQIGZpbGUuLi4KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNvdXJjZVJlZmVyZW5jZSkgewotCQkJCUlGaWxlIGZpbGUgPSBudWxsOwotCQkJCWludCBqc3BPZmZzZXQgPSAwOwotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQotCQkJCS8vIHRyeSB0byBsb2NhdGUgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZQotCQkJCXRyeSB7Ci0JCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJCVVSSVJlc29sdmVyIHJlc29sdmVyID0gc01vZGVsLmdldFJlc29sdmVyKCk7Ci0JCQkJCQlpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotCQkJCQkJCVN0cmluZyB1cmlTdHJpbmcgPSByZXNvbHZlci5nZXRGaWxlQmFzZUxvY2F0aW9uKCk7Ci0JCQkJCQkJZmlsZSA9IGdldEZpbGUodXJpU3RyaW5nKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQotCQkJCS8vIGdldCBKYXZhIHJhbmdlLCB0cmFuc2xhdGUgY29vcmRpbmF0ZSB0byBKU1AKLQotCQkJCXRyeSB7Ci0JCQkJCUlTb3VyY2VSYW5nZSByYW5nZSA9IG51bGw7Ci0JCQkJCUlKU1BUcmFuc2xhdGlvbiBqc3BUcmFuc2xhdGlvbiA9IGdldEpTUFRyYW5zbGF0aW9uKGRvY3VtZW50KTsKLQkJCQkJaWYgKGpzcFRyYW5zbGF0aW9uICE9IG51bGwpIHsKLQkJCQkJCS8vIGxpbmsgdG8gbG9jYWwgdmFyaWFibGUgZGVmaW5pdGlvbnMKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUxvY2FsVmFyaWFibGUpIHsKLQkJCQkJCQlyYW5nZSA9ICgoSUxvY2FsVmFyaWFibGUpIGVsZW1lbnQpLmdldE5hbWVSYW5nZSgpOwotCQkJCQkJfQotCQkJCQkJLy8gbGlua2luZyB0byBmaWVsZHMgb2YgdGhlIHNhbWUgY29tcGlsYXRpb24gdW5pdAotCQkJCQkJZWxzZSBpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5GSUVMRCkgewotCQkJCQkJCU9iamVjdCBjdSA9ICgoSUZpZWxkKSBlbGVtZW50KS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCQkJCQlpZiAoY3UgIT0gbnVsbCAmJiBjdS5lcXVhbHMoanNwVHJhbnNsYXRpb24uZ2V0Q29tcGlsYXRpb25Vbml0KCkpKQotCQkJCQkJCQlyYW5nZSA9ICgoSVNvdXJjZVJlZmVyZW5jZSkgZWxlbWVudCkuZ2V0U291cmNlUmFuZ2UoKTsKLQkJCQkJCX0KLQkJCQkJCS8vIGxpbmtpbmcgdG8gbWV0aG9kcyBvZiB0aGUgc2FtZSBjb21waWxhdGlvbiB1bml0Ci0JCQkJCQllbHNlIGlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCkgewotCQkJCQkJCU9iamVjdCBjdSA9ICgoSU1ldGhvZCkgZWxlbWVudCkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJCQkJaWYgKGN1ICE9IG51bGwgJiYgY3UuZXF1YWxzKGpzcFRyYW5zbGF0aW9uLmdldENvbXBpbGF0aW9uVW5pdCgpKSkKLQkJCQkJCQkJcmFuZ2UgPSAoKElTb3VyY2VSZWZlcmVuY2UpIGVsZW1lbnQpLmdldFNvdXJjZVJhbmdlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAocmFuZ2UgIT0gbnVsbCAmJiBmaWxlICE9IG51bGwpIHsKLQkJCQkJCWpzcE9mZnNldCA9IGpzcFRyYW5zbGF0aW9uLmdldEpzcE9mZnNldChyYW5nZS5nZXRPZmZzZXQoKSk7Ci0JCQkJCQlpZiAoanNwT2Zmc2V0ID49IDApIHsKLQkJCQkJCQlsaW5rID0gbmV3IFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsocmVnaW9uLCBmaWxlLCBuZXcgUmVnaW9uKGpzcE9mZnNldCwgcmFuZ2UuZ2V0TGVuZ3RoKCkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBqbWUuZ2V0TWVzc2FnZSgpLCBqbWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChsaW5rID09IG51bGwpIHsKLQkJCQlsaW5rID0gbmV3IEpTUEphdmFIeXBlcmxpbmsocmVnaW9uLCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtEZXRlY3RvciNkZXRlY3RIeXBlcmxpbmtzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIElIeXBlcmxpbmtbXSBkZXRlY3RIeXBlcmxpbmtzKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gcmVnaW9uLCBib29sZWFuIGNhblNob3dNdWx0aXBsZUh5cGVybGlua3MpIHsKLQkJTGlzdCBoeXBlcmxpbmtzID0gbmV3IEFycmF5TGlzdCgwKTsKLQotCQlpZiAocmVnaW9uICE9IG51bGwgJiYgdGV4dFZpZXdlciAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCk7Ci0KLQkJCS8vIGNoZWNrIGFuZCBtYWtlIHN1cmUgdGhpcyBpcyBhIHZhbGlkIEphdmEgdHlwZQotCQkJSlNQVHJhbnNsYXRpb24ganNwVHJhbnNsYXRpb24gPSBnZXRKU1BUcmFuc2xhdGlvbihkb2N1bWVudCk7Ci0JCQlpZiAoanNwVHJhbnNsYXRpb24gIT0gbnVsbCkgewotCQkJCS8vIGNoZWNrIGlmIHdlIGFyZSBpbiBKU1AgSmF2YSBjb250ZW50Ci0JCQkJaW50IGphdmFPZmZzZXQgPSBqc3BUcmFuc2xhdGlvbi5nZXRKYXZhT2Zmc2V0KHJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJaWYgKGphdmFPZmZzZXQgPiAtMSkgewotCQkJCQkvLyBjaGVjayB0aGF0IHdlIGFyZSBub3QgaW4gaW5kaXJlY3QgSmF2YSBjb250ZW50IChsaWtlCi0JCQkJCS8vIGluY2x1ZGVkIGZpbGVzKQotCQkJCQlpZiAoIWpzcFRyYW5zbGF0aW9uLmlzSW5kaXJlY3QoamF2YU9mZnNldCkpIHsKLQkJCQkJCS8vIGdldCBKYXZhIGVsZW1lbnRzCi0JCQkJCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGpzcFRyYW5zbGF0aW9uLmdldEVsZW1lbnRzRnJvbUpzcFJhbmdlKHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCWlmIChlbGVtZW50cyAhPSBudWxsICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHsKLQkJCQkJCQkvLyBjcmVhdGUgYSBKU1BKYXZhSHlwZXJsaW5rIGZvciBlYWNoIEphdmEgZWxlbWVudAotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJCQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQotCQkJCQkJCQkvLyBmaW5kIGh5cGVybGluayByYW5nZSBmb3IgSmF2YSBlbGVtZW50Ci0JCQkJCQkJCUlSZWdpb24gaHlwZXJsaW5rUmVnaW9uID0gc2VsZWN0V29yZChkb2N1bWVudCwgcmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCQkJCQkJSUh5cGVybGluayBsaW5rID0gY3JlYXRlSHlwZXJsaW5rKGVsZW1lbnQsIGh5cGVybGlua1JlZ2lvbiwgZG9jdW1lbnQpOwotCQkJCQkJCQlpZiAobGluayAhPSBudWxsKSB7Ci0JCQkJCQkJCQloeXBlcmxpbmtzLmFkZChsaW5rKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChoeXBlcmxpbmtzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSUh5cGVybGlua1tdKSBoeXBlcmxpbmtzLnRvQXJyYXkobmV3IElIeXBlcmxpbmtbMF0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gSUZpbGUgZnJvbSB0aGUgZ2l2ZW4gdXJpIGlmIHBvc3NpYmxlLCBudWxsIGlmIGNhbm5vdCBmaW5kCi0JICogZmlsZSBmcm9tIHVyaS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVN0cmluZwotCSAqICAgICAgICAgICAgZmlsZSBzeXN0ZW0gcGF0aAotCSAqIEByZXR1cm4gcmV0dXJucyBJRmlsZSBpZiBmaWxlU3RyaW5nIGV4aXN0cyBpbiB0aGUgd29ya3NwYWNlCi0JICovCi0JcHJpdmF0ZSBJRmlsZSBnZXRGaWxlKFN0cmluZyBmaWxlU3RyaW5nKSB7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCi0JCWlmIChmaWxlU3RyaW5nICE9IG51bGwpIHsKLQkJCVBhdGggZmlsZVBhdGggPSBuZXcgUGF0aChmaWxlU3RyaW5nKTsKLQkJCWlmIChmaWxlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEgJiYgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGZpbGVQYXRoKS5leGlzdHMoKSkgewotCQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZmlsZVBhdGgpOwotCQkJfQotCQkJSUZpbGVbXSBmaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24oZmlsZVBhdGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGggJiYgZmlsZSA9PSBudWxsOyBpKyspCi0JCQkJaWYgKGZpbGVzW2ldLmV4aXN0cygpKQotCQkJCQlmaWxlID0gZmlsZXNbaV07Ci0JCX0KLQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgSlNQIHRyYW5zbGF0aW9uIG9iamVjdAotCSAqIAotCSAqIEByZXR1cm4gSlNQVHJhbnNsYXRpb24gaWYgb25lIGV4aXN0cywgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIEpTUFRyYW5zbGF0aW9uIGdldEpTUFRyYW5zbGF0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlKU1BUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IG51bGw7Ci0KLQkJSURPTU1vZGVsIHhtbE1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCUpTUFRyYW5zbGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKEpTUFRyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpTUFRyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCXRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKQotCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCXJldHVybiB0cmFuc2xhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBKYXZhIGFsd2F5cyBzZWxlY3RzIHdvcmQgd2hlbiBkZWZpbmluZyByZWdpb24KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiBAcGFyYW0gYW5jaG9yCi0JICogQHJldHVybiBJUmVnaW9uCi0JICovCi0JcHJpdmF0ZSBJUmVnaW9uIHNlbGVjdFdvcmQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgYW5jaG9yKSB7Ci0KLQkJdHJ5IHsKLQkJCWludCBvZmZzZXQgPSBhbmNob3I7Ci0JCQljaGFyIGM7Ci0KLQkJCXdoaWxlIChvZmZzZXQgPj0gMCkgewotCQkJCWMgPSBkb2N1bWVudC5nZXRDaGFyKG9mZnNldCk7Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYykpCi0JCQkJCWJyZWFrOwotCQkJCS0tb2Zmc2V0OwotCQkJfQotCi0JCQlpbnQgc3RhcnQgPSBvZmZzZXQ7Ci0KLQkJCW9mZnNldCA9IGFuY2hvcjsKLQkJCWludCBsZW5ndGggPSBkb2N1bWVudC5nZXRMZW5ndGgoKTsKLQotCQkJd2hpbGUgKG9mZnNldCA8IGxlbmd0aCkgewotCQkJCWMgPSBkb2N1bWVudC5nZXRDaGFyKG9mZnNldCk7Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYykpCi0JCQkJCWJyZWFrOwotCQkJCSsrb2Zmc2V0OwotCQkJfQotCi0JCQlpbnQgZW5kID0gb2Zmc2V0OwotCi0JCQlpZiAoc3RhcnQgPT0gZW5kKQotCQkJCXJldHVybiBuZXcgUmVnaW9uKHN0YXJ0LCAwKTsKLQotCQkJcmV0dXJuIG5ldyBSZWdpb24oc3RhcnQgKyAxLCBlbmQgLSBzdGFydCAtIDEpOwotCi0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9UTERGaWxlSHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1RMREZpbGVIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIwNTljNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1RMREZpbGVIeXBlcmxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLWNsYXNzIFRMREZpbGVIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQotCXByaXZhdGUgSVJlc291cmNlIGZSZXNvdXJjZTsKLQlwcml2YXRlIElSZWdpb24gZkh5cGVybGlua1JlZ2lvbjsKLQlwcml2YXRlIFN0cmluZyBmU2VhcmNoTmFtZTsKLQlwcml2YXRlIGludCBmU2VhcmNoVHlwZTsKLQotCXB1YmxpYyBUTERGaWxlSHlwZXJsaW5rKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHNlYXJjaFR5cGUsIFN0cmluZyBzZWFyY2hOYW1lLCBJUmVnaW9uIGh5cGVybGlua1JlZ2lvbikgewotCQlzdXBlcigpOwotCQlmUmVzb3VyY2UgPSByZXNvdXJjZTsKLQkJZlNlYXJjaE5hbWUgPSBzZWFyY2hOYW1lOwotCQlmU2VhcmNoVHlwZSA9IHNlYXJjaFR5cGU7Ci0JCWZIeXBlcmxpbmtSZWdpb24gPSBoeXBlcmxpbmtSZWdpb247Ci0JfQotCi0JcHJpdmF0ZSBJTWFya2VyIGNyZWF0ZU1hcmtlcihJRmlsZSBmaWxlLCBJUmVnaW9uIHJlZ2lvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLk1hcmtlclV0aWxpdGllcy5zZXRDaGFyU3RhcnQoSU1hcmtlciwgaW50KQotCQlJTWFya2VyIG1hcmtlciA9IGZpbGUuY3JlYXRlTWFya2VyKEpTUFVJUGx1Z2luLklEICsgImh5cGVybGluayIpOyAvLyROT04tTkxTLTEkCi0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5UUkFOU0lFTlQsIEJvb2xlYW4uVFJVRSk7Ci0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TT1VSQ0VfSUQsIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfU1RBUlQsIHJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCwgcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKTsKLQkJcmV0dXJuIG1hcmtlcjsKLQl9Ci0KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKSB7Ci0JCXJldHVybiBmSHlwZXJsaW5rUmVnaW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsKLQkJcmV0dXJuIGZSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gSlNQVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChmUmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgZlJlc291cmNlOwotCQkJCUlNYXJrZXIgbWFya2VyID0gbnVsbDsKLQkJCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmaWxlKTsKLQkJCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJCQlkb21Nb2RlbCA9IChJRE9NTW9kZWwpIG1vZGVsOwotCQkJCQkJaWYgKGRvbU1vZGVsICE9IG51bGwpIHsKLQkJCQkJCQlJUmVnaW9uIHRhcmdldFJlZ2lvbiA9IFRhZ2xpYkh5cGVybGlua0RldGVjdG9yLmZpbmREZWZpbml0aW9uKGRvbU1vZGVsLCBmU2VhcmNoTmFtZSwgZlNlYXJjaFR5cGUpOwotCQkJCQkJCWlmICh0YXJnZXRSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJbWFya2VyID0gY3JlYXRlTWFya2VyKGZpbGUsIHRhcmdldFJlZ2lvbik7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAobWFya2VyICE9IG51bGwpIHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCUlERS5vcGVuRWRpdG9yKHBhZ2UsIG1hcmtlcik7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUxKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJbWFya2VyLmRlbGV0ZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCUlERS5vcGVuRWRpdG9yKHBhZ2UsIGZpbGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZTIpIHsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZTIpIHsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChkb21Nb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQlkb21Nb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVGFnbGliSHlwZXJsaW5rRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVGFnbGliSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhYTY3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1RhZ2xpYkh5cGVybGlua0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuQWJzdHJhY3RIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLlVSTEh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRhZ2xpYlRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTFUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDEyTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRMRFJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUYWdsaWJSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5UYWdsaWJJbmRleDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Ob2RlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIERldGVjdHMgaHlwZXJsaW5rcyBmb3IgdGFnbGlicy4KLSAqLwotcHVibGljIGNsYXNzIFRhZ2xpYkh5cGVybGlua0RldGVjdG9yIGV4dGVuZHMgQWJzdHJhY3RIeXBlcmxpbmtEZXRlY3RvciB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSFRUUF9QUk9UT0NPTCA9ICJodHRwOi8vIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSkFSX1BST1RPQ09MID0gImphcjpmaWxlOiI7Ly8kTk9OLU5MUy0xJAotCS8vIHByaXZhdGUgU3RyaW5nIFVSTl9UQUdESVIgPSAidXJuOmpzcHRhZ2RpcjoiOwotCXByaXZhdGUgU3RyaW5nIFVSTl9UTEQgPSAidXJuOmpzcHRsZDoiOwotCXByaXZhdGUgU3RyaW5nIFhNTE5TID0gInhtbG5zOiI7IC8vJE5PTi1OTFMtMSQgCi0JCi0Jc3RhdGljIGZpbmFsIGludCBUQUcgPSAxOwotCXN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFID0gMjsKLQkKLQlzdGF0aWMgSVJlZ2lvbiBmaW5kRGVmaW5pdGlvbihJRE9NTW9kZWwgbW9kZWwsIFN0cmluZyBzZWFyY2hOYW1lLCBpbnQgc2VhcmNoVHlwZSkgewotCQlOb2RlTGlzdCBkZWNsYXJhdGlvbnMgPSBudWxsOwotCQlpZiAoc2VhcmNoVHlwZSA9PSBUQUcpCi0JCQlkZWNsYXJhdGlvbnMgPSBtb2RlbC5nZXREb2N1bWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoIioiLCBKU1AxMVRMRE5hbWVzLlRBRyk7Ci0JCWVsc2UgaWYgKHNlYXJjaFR5cGUgPT0gQVRUUklCVVRFKQotCQkJZGVjbGFyYXRpb25zID0gbW9kZWwuZ2V0RG9jdW1lbnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKCIqIiwgSlNQMTFUTEROYW1lcy5BVFRSSUJVVEUpOwotCQlpZiAoZGVjbGFyYXRpb25zID09IG51bGwgfHwgZGVjbGFyYXRpb25zLmdldExlbmd0aCgpID09IDApIHsKLQkJCWlmIChzZWFyY2hUeXBlID09IFRBRykKLQkJCQlkZWNsYXJhdGlvbnMgPSBtb2RlbC5nZXREb2N1bWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKEpTUDExVExETmFtZXMuVEFHKTsKLQkJCWVsc2UgaWYgKHNlYXJjaFR5cGUgPT0gQVRUUklCVVRFKQotCQkJCWRlY2xhcmF0aW9ucyA9IG1vZGVsLmdldERvY3VtZW50KCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoSlNQMTFUTEROYW1lcy5BVFRSSUJVVEUpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVjbGFyYXRpb25zLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGVMaXN0IG5hbWVzID0gbW9kZWwuZ2V0RG9jdW1lbnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZShKU1AxMVRMRE5hbWVzLk5BTUUpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBuYW1lcy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBnZXRDb250YWluZWRUZXh0KG5hbWVzLml0ZW0oaikpOwotCQkJCWlmIChzZWFyY2hOYW1lLmNvbXBhcmVUbyhuYW1lKSA9PSAwKSB7Ci0JCQkJCWludCBzdGFydCA9IC0xOwotCQkJCQlpbnQgZW5kID0gLTE7Ci0JCQkJCU5vZGUgY2FyZXQgPSBuYW1lcy5pdGVtKGopLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQkJaWYgKGNhcmV0ICE9IG51bGwpIHsKLQkJCQkJCXN0YXJ0ID0gKChJRE9NTm9kZSkgY2FyZXQpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCX0KLQkJCQkJd2hpbGUgKGNhcmV0ICE9IG51bGwpIHsKLQkJCQkJCWVuZCA9ICgoSURPTU5vZGUpIGNhcmV0KS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCWNhcmV0ID0gY2FyZXQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJfQotCQkJCQlpZiAoc3RhcnQgPiAwKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENvbnRhaW5lZFRleHQoTm9kZSBwYXJlbnQpIHsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAoY2hpbGRyZW4uZ2V0TGVuZ3RoKCkgPT0gMSkgewotCQkJcmV0dXJuIGNoaWxkcmVuLml0ZW0oMCkuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFKSB7Ci0JCQkJU3RyaW5nIHJlZmVyZW5jZSA9ICgoRW50aXR5UmVmZXJlbmNlKSBjaGlsZCkuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJaWYgKHJlZmVyZW5jZSA9PSBudWxsICYmIGNoaWxkLmdldE5vZGVOYW1lKCkgIT0gbnVsbCkgewotCQkJCQlyZWZlcmVuY2UgPSAiJiIgKyBjaGlsZC5nZXROb2RlTmFtZSgpICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQkJCXMuYXBwZW5kKHJlZmVyZW5jZS50cmltKCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXMuYXBwZW5kKGNoaWxkLmdldE5vZGVWYWx1ZSgpLnRyaW0oKSk7Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHMudG9TdHJpbmcoKS50cmltKCk7Ci0JfQotCi0JcHVibGljIElIeXBlcmxpbmtbXSBkZXRlY3RIeXBlcmxpbmtzKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gcmVnaW9uLCBib29sZWFuIGNhblNob3dNdWx0aXBsZUh5cGVybGlua3MpIHsKLQkJSUh5cGVybGluayBoeXBlcmxpbmsgPSBudWxsOwotCi0JCWlmICh0ZXh0Vmlld2VyICE9IG51bGwgJiYgcmVnaW9uICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2MgPSB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQkvLyBjaGVjayBpZiBqc3AgdGFnL2RpcmVjdGl2ZSBmaXJzdAotCQkJCQlJVHlwZWRSZWdpb24gcGFydGl0aW9uID0gVGV4dFV0aWxpdGllcy5nZXRQYXJ0aXRpb24oZG9jLCBJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLCByZWdpb24uZ2V0T2Zmc2V0KCksIGZhbHNlKTsKLQkJCQkJaWYgKHBhcnRpdGlvbiAhPSBudWxsICYmIHBhcnRpdGlvbi5nZXRUeXBlKCkgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RJUkVDVElWRSkgewotCQkJCQkJLy8gY2hlY2sgaWYganNwIHRhZ2xpYiBkaXJlY3RpdmUKLQkJCQkJCU5vZGUgY3VycmVudE5vZGUgPSBnZXRDdXJyZW50Tm9kZShkb2MsIHJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQkJU3RyaW5nIGJhc2VMb2NhdGlvbkZvclRhZ2xpYiA9IGdldEJhc2VMb2NhdGlvbkZvclRhZ2xpYihkb2MpOwotCQkJCQkJCWlmIChiYXNlTG9jYXRpb25Gb3JUYWdsaWIgIT0gbnVsbCAmJiBKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVEFHTElCLmVxdWFsc0lnbm9yZUNhc2UoY3VycmVudE5vZGUuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQkJCQkJLyoqCi0JCQkJCQkJCSAqIFRoZSB0YWdsaWIgZGlyZWN0aXZlIGl0c2VsZgotCQkJCQkJCQkgKi8KLQkJCQkJCQkJLy8gZ2V0IHRoZSB1cmkgYXR0cmlidXRlCi0JCQkJCQkJCUF0dHIgdGFnbGliVVJJTm9kZSA9ICgoRWxlbWVudCkgY3VycmVudE5vZGUpLmdldEF0dHJpYnV0ZU5vZGUoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1VSSSk7Ci0JCQkJCQkJCWlmICh0YWdsaWJVUklOb2RlICE9IG51bGwpIHsKLQkJCQkJCQkJCUlUYWdsaWJSZWNvcmQgcmVmZXJlbmNlID0gVGFnbGliSW5kZXgucmVzb2x2ZShiYXNlTG9jYXRpb25Gb3JUYWdsaWIsIHRhZ2xpYlVSSU5vZGUuZ2V0VmFsdWUoKSwgZmFsc2UpOwotCQkJCQkJCQkJLy8gd2hlbiB1c2luZyBhIHRhZ2RpcgotCQkJCQkJCQkJLy8gKElUYWdsaWJSZWNvcmQuVEFHRElSKSwKLQkJCQkJCQkJCS8vIHRoZXJlJ3Mgbm90aGluZyB0byBsaW5rIHRvCi0JCQkJCQkJCQlpZiAocmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCQkJCQkJCQkvLyBoYW5kbGUgdGFnbGlicwotCQkJCQkJCQkJCXN3aXRjaCAocmVmZXJlbmNlLmdldFJlY29yZFR5cGUoKSkgewotCQkJCQkJCQkJCQljYXNlIChJVGFnbGliUmVjb3JkLlRMRCkgOiB7Ci0JCQkJCQkJCQkJCQlJVExEUmVjb3JkIHJlY29yZCA9IChJVExEUmVjb3JkKSByZWZlcmVuY2U7Ci0JCQkJCQkJCQkJCQlTdHJpbmcgdXJpU3RyaW5nID0gcmVjb3JkLmdldFBhdGgoKS50b1N0cmluZygpOwotCQkJCQkJCQkJCQkJSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24gPSBnZXRIeXBlcmxpbmtSZWdpb24odGFnbGliVVJJTm9kZSwgcmVnaW9uKTsKLQkJCQkJCQkJCQkJCWlmIChoeXBlcmxpbmtSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJCQkJCQkJCWh5cGVybGluayA9IGNyZWF0ZUh5cGVybGluayh1cmlTdHJpbmcsIGh5cGVybGlua1JlZ2lvbiwgZG9jLCBudWxsKTsKLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuSkFSKSA6Ci0JCQkJCQkJCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVVJMKSA6IHsKLQkJCQkJCQkJCQkJCUlSZWdpb24gaHlwZXJsaW5rUmVnaW9uID0gZ2V0SHlwZXJsaW5rUmVnaW9uKHRhZ2xpYlVSSU5vZGUsIHJlZ2lvbik7Ci0JCQkJCQkJCQkJCQlpZiAoaHlwZXJsaW5rUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJCQloeXBlcmxpbmsgPSBuZXcgVGFnbGliSmFyVXJpSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgcmVmZXJlbmNlKTsKLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmIChiYXNlTG9jYXRpb25Gb3JUYWdsaWIgIT0gbnVsbCAmJiBKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ST09ULmVxdWFsc0lnbm9yZUNhc2UoY3VycmVudE5vZGUuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQkJCQkJLyoqCi0JCQkJCQkJCSAqIFRoZSBqc3A6cm9vdCBlbGVtZW50Ci0JCQkJCQkJCSAqLwotCQkJCQkJCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBjdXJyZW50Tm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQkJCQkJQXR0ciBhdHRyID0gKEF0dHIpIGF0dHJzLml0ZW0oaSk7Ci0JCQkJCQkJCQlpZiAoYXR0ci5nZXROb2RlTmFtZSgpLnN0YXJ0c1dpdGgoWE1MTlMpKSB7Ci0JCQkJCQkJCQkJU3RyaW5nIHVyaSA9IFN0cmluZ1V0aWxzLnN0cmlwKGF0dHIuZ2V0Tm9kZVZhbHVlKCkpOwotCQkJCQkJCQkJCWlmICh1cmkuc3RhcnRzV2l0aChVUk5fVExEKSkgewotCQkJCQkJCQkJCQl1cmkgPSB1cmkuc3Vic3RyaW5nKFVSTl9UTEQubGVuZ3RoKCkpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlJVGFnbGliUmVjb3JkIHJlZmVyZW5jZSA9IFRhZ2xpYkluZGV4LnJlc29sdmUoYmFzZUxvY2F0aW9uRm9yVGFnbGliLCB1cmksIGZhbHNlKTsKLQkJCQkJCQkJCQkvLyB3aGVuIHVzaW5nIGEgdGFnZGlyCi0JCQkJCQkJCQkJLy8gKElUYWdsaWJSZWNvcmQuVEFHRElSKSwKLQkJCQkJCQkJCQkvLyB0aGVyZSdzIG5vdGhpbmcgdG8gbGluayB0bwotCQkJCQkJCQkJCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkgewotCQkJCQkJCQkJCQkvLyBoYW5kbGUgdGFnbGlicwotCQkJCQkJCQkJCQlzd2l0Y2ggKHJlZmVyZW5jZS5nZXRSZWNvcmRUeXBlKCkpIHsKLQkJCQkJCQkJCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVExEKSA6IHsKLQkJCQkJCQkJCQkJCQlJVExEUmVjb3JkIHJlY29yZCA9IChJVExEUmVjb3JkKSByZWZlcmVuY2U7Ci0JCQkJCQkJCQkJCQkJU3RyaW5nIHVyaVN0cmluZyA9IHJlY29yZC5nZXRQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQkJCQkJCQkJCQlJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiA9IGdldEh5cGVybGlua1JlZ2lvbihhdHRyLCByZWdpb24pOwotCQkJCQkJCQkJCQkJCWlmIChoeXBlcmxpbmtSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJCQkJCQkJCQloeXBlcmxpbmsgPSBjcmVhdGVIeXBlcmxpbmsodXJpU3RyaW5nLCBoeXBlcmxpbmtSZWdpb24sIGRvYywgbnVsbCk7Ci0JCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5KQVIpIDoKLQkJCQkJCQkJCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVVJMKSA6IHsKLQkJCQkJCQkJCQkJCQlJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiA9IGdldEh5cGVybGlua1JlZ2lvbihhdHRyLCByZWdpb24pOwotCQkJCQkJCQkJCQkJCWlmIChoeXBlcmxpbmtSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJCQkJCQkJCQloeXBlcmxpbmsgPSBuZXcgVGFnbGliSmFyVXJpSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgcmVmZXJlbmNlKTsKLQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCS8qKgotCQkJCQkJCQkgKiBIeXBlcmxpbmsgY3VzdG9tIHRhZyB0byBpdHMgVExEIG9yIHRhZyBmaWxlCi0JCQkJCQkJCSAqLwotCQkJCQkJCQlUTERDTURvY3VtZW50TWFuYWdlciBkb2N1bWVudE1hbmFnZXIgPSBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKGRvYyk7Ci0JCQkJCQkJCWlmIChkb2N1bWVudE1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQkJCQkJTGlzdCBkb2N1bWVudFRyYWNrZXJzID0gZG9jdW1lbnRNYW5hZ2VyLmdldENNRG9jdW1lbnRUcmFja2VycyhjdXJyZW50Tm9kZS5nZXRQcmVmaXgoKSwgcmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZG9jdW1lbnRUcmFja2Vycy5zaXplKCk7IGkrKykgewotCQkJCQkJCQkJCVRhZ2xpYlRyYWNrZXIgdHJhY2tlciA9IChUYWdsaWJUcmFja2VyKSBkb2N1bWVudFRyYWNrZXJzLmdldChpKTsKLQkJCQkJCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSB0cmFja2VyLmdldEVsZW1lbnRzKCkuZ2V0TmFtZWRJdGVtKGN1cnJlbnROb2RlLmdldE5vZGVOYW1lKCkpOwotCQkJCQkJCQkJCWlmIChkZWNsICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJZGVjbCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgKChDTU5vZGVXcmFwcGVyKSBkZWNsKS5nZXRPcmlnaW5Ob2RlKCk7Ci0JCQkJCQkJCQkJCWlmIChkZWNsIGluc3RhbmNlb2YgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsKSB7Ci0JCQkJCQkJCQkJCQlTdHJpbmcgYmFzZSA9ICgoQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsKSBkZWNsKS5nZXRMb2NhdGlvblN0cmluZygpOwotCQkJCQkJCQkJCQkJSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24gPSBnZXRIeXBlcmxpbmtSZWdpb24oY3VycmVudE5vZGUsIHJlZ2lvbik7Ci0JCQkJCQkJCQkJCQlpZiAoaHlwZXJsaW5rUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJCQloeXBlcmxpbmsgPSBjcmVhdGVIeXBlcmxpbmsoYmFzZSwgaHlwZXJsaW5rUmVnaW9uLCBkb2MsIGN1cnJlbnROb2RlKTsKLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChoeXBlcmxpbmsgIT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSUh5cGVybGlua1tde2h5cGVybGlua307Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgYmFzZSBsb2NhdGlvbiBmcm9tIHRoZSBjdXJyZW50IG1vZGVsIChpZiB3aXRoaW4gd29ya3NwYWNlLAotCSAqIGxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHdvcmtzcGFjZSwgb3RoZXJ3aXNlLCBmaWxlIHN5c3RlbSBwYXRoKQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEJhc2VMb2NhdGlvbkZvclRhZ2xpYihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJU3RyaW5nIGJhc2VMb2MgPSBudWxsOwotCi0JCS8vIGdldCB0aGUgYmFzZSBsb2NhdGlvbiBmcm9tIHRoZSBjdXJyZW50IG1vZGVsCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJYmFzZUxvYyA9IHNNb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYmFzZUxvYzsKLQl9Ci0KLQkvLyB0aGUgYmVsb3cgbWV0aG9kcyB3ZXJlIGNvcGllZCBmcm9tIFVSSUh5cGVybGlua0RldGVjdG9yCi0KLQlwcml2YXRlIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKE5vZGUgbm9kZSwgSVJlZ2lvbiBib3VuZGluZ1JlZ2lvbikgewotCQlJUmVnaW9uIGh5cGVyUmVnaW9uID0gbnVsbDsKLQotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmIChub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJCS8vIGhhbmRsZSBkb2MgdHlwZSBub2RlCi0JCQkJSURPTU5vZGUgZG9jTm9kZSA9IChJRE9NTm9kZSkgbm9kZTsKLQkJCQloeXBlclJlZ2lvbiA9IG5ldyBSZWdpb24oZG9jTm9kZS5nZXRTdGFydE9mZnNldCgpLCBkb2NOb2RlLmdldEVuZE9mZnNldCgpIC0gZG9jTm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCQkvLyBoYW5kbGUgYXR0cmlidXRlIG5vZGVzCi0JCQkJSURPTUF0dHIgYXR0ID0gKElET01BdHRyKSBub2RlOwotCQkJCS8vIGRvIG5vdCBpbmNsdWRlIHF1b3RlcyBpbiBhdHRyaWJ1dGUgdmFsdWUgcmVnaW9uCi0JCQkJaW50IHJlZ09mZnNldCA9IGF0dC5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCk7Ci0JCQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBhdHQuZ2V0VmFsdWVSZWdpb24oKTsKLQkJCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpbnQgcmVnTGVuZ3RoID0gdmFsdWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQlTdHJpbmcgYXR0VmFsdWUgPSBhdHQuZ2V0VmFsdWVSZWdpb25UZXh0KCk7Ci0JCQkJCWlmIChTdHJpbmdVdGlscy5pc1F1b3RlZChhdHRWYWx1ZSkpIHsKLQkJCQkJCSsrcmVnT2Zmc2V0OwotCQkJCQkJcmVnTGVuZ3RoID0gcmVnTGVuZ3RoIC0gMjsKLQkJCQkJfQotCQkJCQloeXBlclJlZ2lvbiA9IG5ldyBSZWdpb24ocmVnT2Zmc2V0LCByZWdMZW5ndGgpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCS8vIEhhbmRsZSBkb2MgdHlwZSBub2RlCi0JCQkJSURPTU5vZGUgZG9jTm9kZSA9IChJRE9NTm9kZSkgbm9kZTsKLQkJCQloeXBlclJlZ2lvbiA9IGdldE5hbWVSZWdpb24oZG9jTm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJCQlpZiAoaHlwZXJSZWdpb24gPT0gbnVsbCkgewotCQkJCQloeXBlclJlZ2lvbiA9IG5ldyBSZWdpb24oZG9jTm9kZS5nZXRTdGFydE9mZnNldCgpLCBkb2NOb2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLyoqCi0JCSAqIE9ubHkgcmV0dXJuIGEgaHlwZXJsaW5rIHJlZ2lvbiB0aGF0IG92ZXJsYXBzIHRoZSBzZWFyY2ggcmVnaW9uLgotCQkgKiBUaGlzIHdpbGwgaGVscCB1cyB0byBub3QgdW5kZXJsaW5lIGFyZWFzIG5vdCB1bmRlciB0aGUgY3Vyc29yLgotCQkgKi8KLQkJaWYgKGh5cGVyUmVnaW9uICE9IG51bGwgJiYgaW50ZXJzZWN0cyhoeXBlclJlZ2lvbiwgYm91bmRpbmdSZWdpb24pKQotCQkJcmV0dXJuIGh5cGVyUmVnaW9uOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW50ZXJzZWN0cyhJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiwgSVJlZ2lvbiBkZXRlY3Rpb25SZWdpb24pIHsKLQkJaW50IGh5cGVyTGlua1N0YXJ0ID0gaHlwZXJsaW5rUmVnaW9uLmdldE9mZnNldCgpOwotCQlpbnQgaHlwZXJMaW5rRW5kID0gaHlwZXJsaW5rUmVnaW9uLmdldE9mZnNldCgpICsgaHlwZXJsaW5rUmVnaW9uLmdldExlbmd0aCgpOwotCQlpbnQgZGV0ZWN0aW9uU3RhcnQgPSBkZXRlY3Rpb25SZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCWludCBkZXRlY3Rpb25FbmQgPSBkZXRlY3Rpb25SZWdpb24uZ2V0T2Zmc2V0KCkgKyBkZXRlY3Rpb25SZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCXJldHVybiAoaHlwZXJMaW5rU3RhcnQgPD0gZGV0ZWN0aW9uU3RhcnQgJiYgZGV0ZWN0aW9uU3RhcnQgPCBoeXBlckxpbmtFbmQpIHx8IChoeXBlckxpbmtTdGFydCA8PSBkZXRlY3Rpb25FbmQgJiYgZGV0ZWN0aW9uRW5kIDwgaHlwZXJMaW5rRW5kKTsvLyB8fAotCQkvLyAoc3RhcnRPZmZzZXQyCi0JCS8vIDw9Ci0JCS8vIHN0YXJ0T2Zmc2V0MQotCQkvLyAmJgotCQkvLyBzdGFydE9mZnNldDEKLQkJLy8gPD0KLQkJLy8gZW5kT2Zmc2V0MikKLQkJLy8gfHwKLQkJLy8gKHN0YXJ0T2Zmc2V0MgotCQkvLyA8PQotCQkvLyBlbmRPZmZzZXQyCi0JCS8vICYmCi0JCS8vIGVuZE9mZnNldDIKLQkJLy8gPD0KLQkJLy8gZW5kT2Zmc2V0Mik7Ci0JfQotCi0JcHJpdmF0ZSBJUmVnaW9uIGdldE5hbWVSZWdpb24oSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbnRhaW5lclJlZ2lvbikgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGNvbnRhaW5lclJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHIgPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCW5hbWVSZWdpb24gPSByOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChuYW1lUmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IFJlZ2lvbihjb250YWluZXJSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZVJlZ2lvbiksIG5hbWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBoeXBlcmxpbmsKLQkgKiAKLQkgKiBAcGFyYW0gdXJpU3RyaW5nCi0JICogQHBhcmFtIGh5cGVybGlua1JlZ2lvbgotCSAqIEByZXR1cm4gSUh5cGVybGluawotCSAqLwotCXByaXZhdGUgSUh5cGVybGluayBjcmVhdGVIeXBlcmxpbmsoU3RyaW5nIHVyaVN0cmluZywgSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24sIElEb2N1bWVudCBkb2N1bWVudCwgTm9kZSBub2RlKSB7Ci0JCUlIeXBlcmxpbmsgbGluayA9IG51bGw7Ci0KLQkJaWYgKHVyaVN0cmluZyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdGVtcCA9IHVyaVN0cmluZy50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKHRlbXAuc3RhcnRzV2l0aChIVFRQX1BST1RPQ09MKSkgewotCQkJCS8vIHRoaXMgaXMgYSBVUkxIeXBlcmxpbmsgc2luY2UgdGhpcyBpcyBhIHdlYiBhZGRyZXNzCi0JCQkJbGluayA9IG5ldyBVUkxIeXBlcmxpbmsoaHlwZXJsaW5rUmVnaW9uLCB1cmlTdHJpbmcpOwotCQkJfQotCQkJZWxzZSBpZiAodGVtcC5zdGFydHNXaXRoKEpBUl9QUk9UT0NPTCkpIHsKLQkJCQkvLyB0aGlzIGlzIGEgVVJMRmlsZUh5cGVybGluayBzaW5jZSB0aGlzIGlzIGEgbG9jYWwgYWRkcmVzcwotCQkJCXRyeSB7Ci0JCQkJCWxpbmsgPSBuZXcgVVJMRmlsZVJlZ2lvbkh5cGVybGluayhoeXBlcmxpbmtSZWdpb24sIFRBRywgbm9kZS5nZXRMb2NhbE5hbWUoKSwgbmV3IFVSTCh1cmlTdHJpbmcpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB0cnkgdG8gbG9jYXRlIHRoZSBmaWxlIGluIHRoZSB3b3Jrc3BhY2UKLQkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgodXJpU3RyaW5nKTsKLQkJCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCQkJaWYgKGZpbGUuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmIGZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJCQlsaW5rID0gbmV3IFRMREZpbGVIeXBlcmxpbmsoZmlsZSwgVEFHLCBub2RlLmdldExvY2FsTmFtZSgpLCBoeXBlcmxpbmtSZWdpb24pOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJbGluayA9IG5ldyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgZmlsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobGluayA9PSBudWxsKSB7Ci0JCQkJLy8gdGhpcyBpcyBhbiBFeHRlcm5hbEZpbGVIeXBlcmxpbmsgc2luY2UgZmlsZSBkb2VzIG5vdCBleGlzdAotCQkJCS8vIGluIHdvcmtzcGFjZQotCQkJCUZpbGUgZXh0ZXJuYWxGaWxlID0gbmV3IEZpbGUodXJpU3RyaW5nKTsKLQkJCQlsaW5rID0gbmV3IEV4dGVybmFsRmlsZUh5cGVybGluayhoeXBlcmxpbmtSZWdpb24sIGV4dGVybmFsRmlsZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBub2RlIHRoZSBjdXJzb3IgaXMgY3VycmVudGx5IG9uIGluIHRoZSBkb2N1bWVudC4gbnVsbCBpZiBubwotCSAqIG5vZGUgaXMgc2VsZWN0ZWQKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiBOb2RlIGVpdGhlciBlbGVtZW50LCBkb2N0eXBlLCB0ZXh0LCBvciBudWxsCi0JICovCi0JcHJpdmF0ZSBOb2RlIGdldEN1cnJlbnROb2RlKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgewotCQkvLyBnZXQgdGhlIGN1cnJlbnQgbm9kZSBhdCB0aGUgb2Zmc2V0IChyZXR1cm5zIGVpdGhlcjogZWxlbWVudCwKLQkJLy8gZG9jdHlwZSwgdGV4dCkKLQkJSW5kZXhlZFJlZ2lvbiBpbm9kZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJaW5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQpOwotCQkJCWlmIChpbm9kZSA9PSBudWxsKSB7Ci0JCQkJCWlub2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0IC0gMSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCi0JCWlmIChpbm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJldHVybiAoTm9kZSkgaW5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9UYWdsaWJKYXJIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVGFnbGliSmFySHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMzk0NDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9UYWdsaWJKYXJIeXBlcmxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLS8qKgotICogSHlwZXJsaW5rIGZvciB0YWdsaWIgZmlsZXMgaW4gamFycy4KLSAqLwotY2xhc3MgVGFnbGliSmFySHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0Jc3RhdGljIGNsYXNzIFppcFN0b3JhZ2UgaW1wbGVtZW50cyBJU3RvcmFnZSB7Ci0JCUZpbGUgZkZpbGUgPSBudWxsOwotCQlTdHJpbmcgZkVudHJ5TmFtZSA9IG51bGw7Ci0KLQkJWmlwU3RvcmFnZShGaWxlIGZpbGUsIFN0cmluZyBlbnRyeU5hbWUpIHsKLQkJCWZGaWxlID0gZmlsZTsKLQkJCWZFbnRyeU5hbWUgPSBlbnRyeU5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0Q29udGVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlaaXBGaWxlIGZpbGUgPSBuZXcgWmlwRmlsZShmRmlsZSk7Ci0JCQkJWmlwRW50cnkgZW50cnkgPSBmaWxlLmdldEVudHJ5KGZFbnRyeU5hbWUpOwotCQkJCXN0cmVhbSA9IGZpbGUuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuRVJST1IsIGdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgZSkpOwotCQkJfQotCQkJcmV0dXJuIHN0cmVhbTsKLQkJfQotCi0JCXB1YmxpYyBJUGF0aCBnZXRGdWxsUGF0aCgpIHsKLQkJCXJldHVybiBuZXcgUGF0aChmRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArIElQYXRoLlNFUEFSQVRPUiArIGZFbnRyeU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIGZFbnRyeU5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElSZWdpb24gZlJlZ2lvbjsKLQlwcml2YXRlIElQYXRoIGZaaXBGaWxlUGF0aDsKLQotCXB1YmxpYyBUYWdsaWJKYXJIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIElQYXRoIHppcEZpbGVQYXRoKSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZaaXBGaWxlUGF0aCA9IHppcEZpbGVQYXRoOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsKLQkJcmV0dXJuIGZSZWdpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldFR5cGVMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRIeXBlcmxpbmtUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0JCXJldHVybiBmWmlwRmlsZVBhdGgudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgVVJMRmlsZUh5cGVybGluay5TdG9yYWdlRWRpdG9ySW5wdXQobmV3IFppcFN0b3JhZ2UoZlppcEZpbGVQYXRoLnRvRmlsZSgpLCAiTUVUQS1JTkYvdGFnbGliLnRsZCIpKTsgLy8kTk9OLU5MUy0xJAotCQlJRWRpdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCQl0cnkgewotCQkJZGVzY3JpcHRvciA9IElERS5nZXRFZGl0b3JEZXNjcmlwdG9yKGlucHV0LmdldE5hbWUoKSk7Ci0JCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCUlERS5vcGVuRWRpdG9yKHBhZ2UsIGlucHV0LCBkZXNjcmlwdG9yLmdldElkKCksIHRydWUpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1RhZ2xpYkphclVyaUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9UYWdsaWJKYXJVcmlIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMzMzU4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1RhZ2xpYkphclVyaUh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSUphclJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUYWdsaWJSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVVJMUmVjb3JkOwotCi0vKioKLSAqIEh5cGVybGluayBmb3IgdGFnbGliIGZpbGVzIGluIGphcnMgb3Igc3BlY2lmaWVkIGJ5IHVybHMuCi0gKi8KLWNsYXNzIFRhZ2xpYkphclVyaUh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgewotCXByaXZhdGUgSVJlZ2lvbiBmUmVnaW9uOwotCXByaXZhdGUgSVRhZ2xpYlJlY29yZCBmVGFnbGliUmVjb3JkOwotCXByaXZhdGUgSUh5cGVybGluayBmSHlwZXJsaW5rOwotCi0JcHVibGljIFRhZ2xpYkphclVyaUh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgSVRhZ2xpYlJlY29yZCByZWNvcmQpIHsKLQkJZlJlZ2lvbiA9IHJlZ2lvbjsKLQkJZlRhZ2xpYlJlY29yZCA9IHJlY29yZDsKLQl9Ci0KLQlwcml2YXRlIElIeXBlcmxpbmsgZ2V0SHlwZXJsaW5rKCkgewotCQlpZiAoZkh5cGVybGluayA9PSBudWxsICYmIGZUYWdsaWJSZWNvcmQgIT0gbnVsbCkgewotCQkJc3dpdGNoIChmVGFnbGliUmVjb3JkLmdldFJlY29yZFR5cGUoKSkgewotCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuSkFSKSA6IHsKLQkJCQkJSUphclJlY29yZCByZWNvcmQgPSAoSUphclJlY29yZCkgZlRhZ2xpYlJlY29yZDsKLQkJCQkJZkh5cGVybGluayA9IG5ldyBUYWdsaWJKYXJIeXBlcmxpbmsoZlJlZ2lvbiwgcmVjb3JkLmdldExvY2F0aW9uKCkpOwotCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5VUkwpIDogewotCQkJCQlJVVJMUmVjb3JkIHJlY29yZCA9IChJVVJMUmVjb3JkKSBmVGFnbGliUmVjb3JkOwotCQkJCQlmSHlwZXJsaW5rID0gbmV3IFVSTEZpbGVIeXBlcmxpbmsoZlJlZ2lvbiwgcmVjb3JkLmdldFVSTCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZIeXBlcmxpbms7Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlJUmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0KLQkJSUh5cGVybGluayBsaW5rID0gZ2V0SHlwZXJsaW5rKCk7Ci0JCWlmIChsaW5rICE9IG51bGwpIHsKLQkJCXJlZ2lvbiA9IGxpbmsuZ2V0SHlwZXJsaW5rUmVnaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1RleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsKLQkJaWYgKGZUYWdsaWJSZWNvcmQgIT0gbnVsbCkgewotCQkJc3dpdGNoIChmVGFnbGliUmVjb3JkLmdldFJlY29yZFR5cGUoKSkgewotCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuSkFSKSA6IHsKLQkJCQkJSUphclJlY29yZCByZWNvcmQgPSAoSUphclJlY29yZCkgZlRhZ2xpYlJlY29yZDsKLQkJCQkJcmV0dXJuIHJlY29yZC5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVVJMKSA6IHsKLQkJCQkJSVVSTFJlY29yZCByZWNvcmQgPSAoSVVSTFJlY29yZCkgZlRhZ2xpYlJlY29yZDsKLQkJCQkJcmV0dXJuIHJlY29yZC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJSUh5cGVybGluayBsaW5rID0gZ2V0SHlwZXJsaW5rKCk7Ci0JCWlmIChsaW5rICE9IG51bGwpIHsKLQkJCWxpbmsub3BlbigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9VUkxGaWxlSHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1VSTEZpbGVIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFjNGJkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1VSTEZpbGVIeXBlcmxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLQotLyoqCi0gKiBIeXBlcmxpbmsgZm9yIFVSTHMgKG9wZW5zIGluIHJlYWQtb25seSBtb2RlKQotICovCi1jbGFzcyBVUkxGaWxlSHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluawotCi0Jc3RhdGljIGNsYXNzIFN0b3JhZ2VFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElTdG9yYWdlRWRpdG9ySW5wdXQgewotCQlJU3RvcmFnZSBmU3RvcmFnZSA9IG51bGw7Ci0KLQkJU3RvcmFnZUVkaXRvcklucHV0KElTdG9yYWdlIHN0b3JhZ2UpIHsKLQkJCWZTdG9yYWdlID0gc3RvcmFnZTsKLQkJfQotCi0JCXB1YmxpYyBJU3RvcmFnZSBnZXRTdG9yYWdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJcmV0dXJuIGZTdG9yYWdlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQkJcmV0dXJuIGZTdG9yYWdlICE9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJCXJldHVybiBmU3RvcmFnZS5lcXVhbHMoKChTdG9yYWdlRWRpdG9ySW5wdXQpIG9iaikuZlN0b3JhZ2UpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOwotCQl9Ci0KLQkJcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBmU3RvcmFnZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJCXJldHVybiBmU3RvcmFnZS5nZXRGdWxsUGF0aCgpICE9IG51bGwgPyBmU3RvcmFnZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkgOiBmU3RvcmFnZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVVJMU3RvcmFnZSBpbXBsZW1lbnRzIElTdG9yYWdlIHsKLQkJVVJMIGZVUkwgPSBudWxsOwotCi0JCVVSTFN0b3JhZ2UoVVJMIHVybCkgewotCQkJZlVSTCA9IHVybDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVVJMU3RvcmFnZSkgewotCQkJCXJldHVybiBmVVJMLmVxdWFscygoKFVSTFN0b3JhZ2UpIG9iaikuZlVSTCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7Ci0JCX0KLQotCQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0Q29udGVudHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzdHJlYW0gPSBmVVJMLm9wZW5TdHJlYW0oKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLkVSUk9SLCBmVVJMLnRvU3RyaW5nKCksIGUpKTsKLQkJCX0KLQkJCXJldHVybiBzdHJlYW07Ci0JCX0KLQotCQlwdWJsaWMgSVBhdGggZ2V0RnVsbFBhdGgoKSB7Ci0JCQlyZXR1cm4gbmV3IFBhdGgoZlVSTC50b1N0cmluZygpKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBuZXcgUGF0aChmVVJMLmdldEZpbGUoKSkubGFzdFNlZ21lbnQoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBJUmVnaW9uIGZSZWdpb247Ci0JcHJpdmF0ZSBVUkwgZlVSTDsKLQotCXB1YmxpYyBVUkxGaWxlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBVUkwgdXJsKSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZVUkwgPSB1cmw7Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlyZXR1cm4gZlJlZ2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQlyZXR1cm4gZlVSTC50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNvcGVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQlpZiAoZlVSTCAhPSBudWxsKSB7Ci0JCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgU3RvcmFnZUVkaXRvcklucHV0KG5ldyBVUkxTdG9yYWdlKGZVUkwpKTsKLQkJCUlFZGl0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0JCQl0cnkgewotCQkJCWRlc2NyaXB0b3IgPSBJREUuZ2V0RWRpdG9yRGVzY3JpcHRvcihpbnB1dC5nZXROYW1lKCkpOwotCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBpbnB1dCwgZGVzY3JpcHRvci5nZXRJZCgpLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVVJMRmlsZVJlZ2lvbkh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9VUkxGaWxlUmVnaW9uSHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNWViZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9VUkxGaWxlUmVnaW9uSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdG9yYWdlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLS8qKgotICogSHlwZXJsaW5rIGZvciBVUkxzIChvcGVucyBpbiByZWFkLW9ubHkgbW9kZSkKLSAqLwotY2xhc3MgVVJMRmlsZVJlZ2lvbkh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0IGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQotCXN0YXRpYyBjbGFzcyBTdG9yYWdlRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJU3RvcmFnZUVkaXRvcklucHV0IHsKLQkJSVN0b3JhZ2UgZlN0b3JhZ2UgPSBudWxsOwotCi0JCVN0b3JhZ2VFZGl0b3JJbnB1dChJU3RvcmFnZSBzdG9yYWdlKSB7Ci0JCQlmU3RvcmFnZSA9IHN0b3JhZ2U7Ci0JCX0KLQotCQlwdWJsaWMgSVN0b3JhZ2UgZ2V0U3RvcmFnZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCXJldHVybiBmU3RvcmFnZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJCXJldHVybiBmU3RvcmFnZSAhPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdG9yYWdlRWRpdG9ySW5wdXQpIHsKLQkJCQlyZXR1cm4gZlN0b3JhZ2UuZXF1YWxzKCgoU3RvcmFnZUVkaXRvcklucHV0KSBvYmopLmZTdG9yYWdlKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5lcXVhbHMob2JqKTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gZlN0b3JhZ2UuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCQlyZXR1cm4gZlN0b3JhZ2UuZ2V0RnVsbFBhdGgoKSAhPSBudWxsID8gZlN0b3JhZ2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpIDogZlN0b3JhZ2UuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFVSTFN0b3JhZ2UgaW1wbGVtZW50cyBJU3RvcmFnZSB7Ci0JCVVSTCBmVVJMID0gbnVsbDsKLQotCQlVUkxTdG9yYWdlKFVSTCB1cmwpIHsKLQkJCWZVUkwgPSB1cmw7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFVSTFN0b3JhZ2UpIHsKLQkJCQlyZXR1cm4gZlVSTC5lcXVhbHMoKChVUkxTdG9yYWdlKSBvYmopLmZVUkwpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOwotCQl9Ci0KLQkJcHVibGljIElucHV0U3RyZWFtIGdldENvbnRlbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc3RyZWFtID0gZlVSTC5vcGVuU3RyZWFtKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5FUlJPUiwgZlVSTC50b1N0cmluZygpLCBlKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RyZWFtOwotCQl9Ci0KLQkJcHVibGljIElQYXRoIGdldEZ1bGxQYXRoKCkgewotCQkJcmV0dXJuIG5ldyBQYXRoKGZVUkwudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmV3IFBhdGgoZlVSTC5nZXRGaWxlKCkpLmxhc3RTZWdtZW50KCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgSVJlZ2lvbiBmUmVnaW9uOwotCXByaXZhdGUgVVJMIGZVUkw7Ci0JcHJpdmF0ZSBpbnQgZlNlYXJjaFR5cGU7Ci0JcHJpdmF0ZSBTdHJpbmcgZlNlYXJjaE5hbWU7Ci0KLQlwdWJsaWMgVVJMRmlsZVJlZ2lvbkh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgaW50IHNlYXJjaFR5cGUsIFN0cmluZyBzZWFyY2hOYW1lLCBVUkwgdXJsKSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZVUkwgPSB1cmw7Ci0JCWZTZWFyY2hOYW1lID0gc2VhcmNoTmFtZTsKLQkJZlNlYXJjaFR5cGUgPSBzZWFyY2hUeXBlOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsKLQkJcmV0dXJuIGZSZWdpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldFR5cGVMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1RleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsKLQkJcmV0dXJuIGZVUkwudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjb3BlbigpCi0JICovCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJaWYgKGZVUkwgIT0gbnVsbCkgewotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IFN0b3JhZ2VFZGl0b3JJbnB1dChuZXcgVVJMU3RvcmFnZShmVVJMKSk7Ci0JCQlJRWRpdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCQkJdHJ5IHsKLQkJCQlkZXNjcmlwdG9yID0gSURFLmdldEVkaXRvckRlc2NyaXB0b3IoaW5wdXQuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJSUVkaXRvclBhcnQgb3BlbmVkRWRpdG9yID0gSURFLm9wZW5FZGl0b3IocGFnZSwgaW5wdXQsIGRlc2NyaXB0b3IuZ2V0SWQoKSwgdHJ1ZSk7Ci0JCQkJCUlSZWdpb24gZGVmaW5pdGlvblJlZ2lvbiA9IGZpbmREZWZpbml0aW9uUmVnaW9uKG5ldyBVUkxTdG9yYWdlKGZVUkwpKTsKLQkJCQkJaWYgKGRlZmluaXRpb25SZWdpb24gIT0gbnVsbCkgewotCQkJCQkJb3BlbmVkRWRpdG9yLmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNldFNlbGVjdGlvbihuZXcgVGV4dFNlbGVjdGlvbihkZWZpbml0aW9uUmVnaW9uLmdldE9mZnNldCgpLCBkZWZpbml0aW9uUmVnaW9uLmdldExlbmd0aCgpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElSZWdpb24gZmluZERlZmluaXRpb25SZWdpb24oSVN0b3JhZ2Ugc3RvcmFnZSkgewotCQlJUmVnaW9uIGRlZmluaXRpb24gPSBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoc3RvcmFnZS5nZXROYW1lKCksIHN0b3JhZ2UuZ2V0Q29udGVudHMoKSwgbnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQlkZWZpbml0aW9uID0gVGFnbGliSHlwZXJsaW5rRGV0ZWN0b3IuZmluZERlZmluaXRpb24oKElET01Nb2RlbCkgbW9kZWwsIGZTZWFyY2hOYW1lLCBmU2VhcmNoVHlwZSk7Ci0JCQl9Ci0JCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gZGVmaW5pdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1dvcmtzcGFjZUZpbGVIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvV29ya3NwYWNlRmlsZUh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjhjZWI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvV29ya3NwYWNlRmlsZUh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotCi0vKioKLSAqIEh5cGVybGluayBmb3IgZmlsZXMgd2l0aGluIHRoZSB3b3Jrc3BhY2UuIChBcyBsb25nIGFzIHRoZXJlIGlzIGFuIElGaWxlLAotICogdGhpcyBjYW4gYmUgdXNlZCkgT3BlbnMgdGhlIGRlZmF1bHQgZWRpdG9yIGZvciB0aGUgZmlsZS4KLSAqLwotY2xhc3MgV29ya3NwYWNlRmlsZUh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0IGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQotCXByaXZhdGUgSVJlZ2lvbiBmUmVnaW9uOwotCXByaXZhdGUgSUZpbGUgZkZpbGU7Ci0JcHJpdmF0ZSBJUmVnaW9uIGZIaWdobGlnaHRSYW5nZTsKLQotCXB1YmxpYyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBJRmlsZSBmaWxlKSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZGaWxlID0gZmlsZTsKLQl9Ci0KLQlwdWJsaWMgV29ya3NwYWNlRmlsZUh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgSUZpbGUgZmlsZSwgSVJlZ2lvbiByYW5nZSkgewotCQlmUmVnaW9uID0gcmVnaW9uOwotCQlmRmlsZSA9IGZpbGU7Ci0JCWZIaWdobGlnaHRSYW5nZSA9IHJhbmdlOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsKLQkJcmV0dXJuIGZSZWdpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldFR5cGVMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1RleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsKLQkJcmV0dXJuIGZGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQlpZiAoZkZpbGUgIT0gbnVsbCAmJiBmRmlsZS5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gSURFLm9wZW5FZGl0b3IocGFnZSwgZkZpbGUsIHRydWUpOwotCQkJCS8vIGhpZ2hsaWdodCByYW5nZSBpbiBlZGl0b3IgaWYgcG9zc2libGUKLQkJCQlpZiAoZkhpZ2hsaWdodFJhbmdlICE9IG51bGwgJiYgZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCQkJKChJVGV4dEVkaXRvcikgZWRpdG9yKS5zZXRIaWdobGlnaHRSYW5nZShmSGlnaGxpZ2h0UmFuZ2UuZ2V0T2Zmc2V0KCksIGZIaWdobGlnaHRSYW5nZS5nZXRMZW5ndGgoKSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIHBpZS5nZXRNZXNzYWdlKCksIHBpZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0Jhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0Jhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJlYWUwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Eb2N1bWVudENoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZFN0cmVhbUNyZWF0b3I7Ci0KLS8qKgotICogQ3JlYXRlcyBkb2N1bWVudCBjaGFuZ2UocykgZm9yIGFuIElKYXZhRWxlbWVudCByZW5hbWUuCi0gKiBDaGFuZ2VzIGFyZSBjcmVhdGVkIGZvciBldmVyeSB0eXBlICJtYXRjaCIgaW4gdGhlIHdvcmtzcGFjZQotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgZXh0ZW5kcyBTZWFyY2hSZXF1ZXN0b3IgewotCQotCS8qKgotCSAqIFdvcmtzcGFjZSBvcGVyYXRpb24gdG8gcGVyZm9ybSBzYXZlIG9uIG1vZGVsIGZvciB1cGRhdGVkIGRvY3VtZW50cy4KLQkgKiBTaG91bGQgb25seSBiZSBkb25lIG9uIG1vZGVscyBub3Qgb3BlbiBpbiBhbiBlZGl0b3IuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBTYXZlSnNwRmlsZU9wIGV4dGVuZHMgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIHsKLQkJCi0JCXByaXZhdGUgSURvY3VtZW50IGZKU1BEb2MgPSBudWxsOwotCQlwcml2YXRlIElGaWxlIGZKU1BGaWxlID0gbnVsbDsKLQkJCi0JCXB1YmxpYyBTYXZlSnNwRmlsZU9wKElGaWxlIGpzcEZpbGUsIElEb2N1bWVudCBqc3BEb2MpIHsKLQkJCXRoaXMuZkpTUERvYyA9IGpzcERvYzsKLQkJCXRoaXMuZkpTUEZpbGUgPSBqc3BGaWxlOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQotCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM3NjUKLQkJCS8vIHNhdmUgZmlsZSB3LyBubyBpbnRlcm1lZGlhdGUgbW9kZWwgY3JlYXRpb24KLQkJCQotCQkJQ29kZWRTdHJlYW1DcmVhdG9yIGNvZGVkU3RyZWFtQ3JlYXRvciA9IG5ldyBDb2RlZFN0cmVhbUNyZWF0b3IoKTsKLQkJCVJlYWRlciByZWFkZXIgPSBuZXcgRG9jdW1lbnRSZWFkZXIodGhpcy5mSlNQRG9jKTsKLQkJCWNvZGVkU3RyZWFtQ3JlYXRvci5zZXQodGhpcy5mSlNQRmlsZSwgcmVhZGVyKTsKLQkJCQotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGNvZGVkQnl0ZVN0cmVhbSA9IG51bGw7Ci0JCQlJbnB1dFN0cmVhbSBjb2RlZFN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWNvZGVkQnl0ZVN0cmVhbSA9IGNvZGVkU3RyZWFtQ3JlYXRvci5nZXRDb2RlZEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCWNvZGVkU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvZGVkQnl0ZVN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJCQlpZiAodGhpcy5mSlNQRmlsZS5leGlzdHMoKSkKLQkJCQkJdGhpcy5mSlNQRmlsZS5zZXRDb250ZW50cyhjb2RlZFN0cmVhbSwgdHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQkJZWxzZQotCQkJCQl0aGlzLmZKU1BGaWxlLmNyZWF0ZShjb2RlZFN0cmVhbSwgZmFsc2UsIG51bGwpOwotCQkJCQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYoY29kZWRCeXRlU3RyZWFtICE9IG51bGwpCi0JCQkJCQljb2RlZEJ5dGVTdHJlYW0uY2xvc2UoKTsKLQkJCQkJaWYoY29kZWRTdHJlYW0gIT0gbnVsbCkKLQkJCQkJCWNvZGVkU3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKLQkJCQkJLy8gdW5saWtlbHkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JLy8gZW5kIGlubmVyIGNsYXNzIFNhdmVKc3BGaWxlT3AKLQkKLQkvKioKLQkgKiBDaGFuZ2UgY2xhc3MgdGhhdCB3cmFwcyBhIHRleHQgZWRpdCBvbiB0aGUganNwIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBjbGFzcyBSZW5hbWVDaGFuZ2UgZXh0ZW5kcyBEb2N1bWVudENoYW5nZSB7Ci0KLQkJcHJpdmF0ZSBUZXh0RWRpdCBmRWRpdCA9IG51bGw7Ci0JCXByaXZhdGUgSUZpbGUgZkpTUEZpbGUgPSBudWxsOwotCQlwcml2YXRlIElEb2N1bWVudCBmSlNQRG9jID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgZkRlc2NyaXB0aW9uID0gSlNQVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzA7Ci0JCQotCQlwdWJsaWMgUmVuYW1lQ2hhbmdlKElGaWxlIGpzcEZpbGUsIElEb2N1bWVudCBqc3BEb2MsIFRleHRFZGl0IGVkaXQsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJc3VwZXIoSlNQVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzYsIGpzcERvYyk7Ci0JCQl0aGlzLmZFZGl0ID0gZWRpdDsKLQkJCXRoaXMuZkpTUEZpbGUgPSBqc3BGaWxlOwotCQkJdGhpcy5mSlNQRG9jID0ganNwRG9jOwotCQkJdGhpcy5mRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJfQotCQkKLQkJcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJRG9jdW1lbnQgZ2V0UHJldmlld0RvY3VtZW50KElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlEb2N1bWVudCBjb3B5RG9jID0gbmV3IERvY3VtZW50KGZKU1BEb2MuZ2V0KCkpOwotCQkJdHJ5IHsKLQkJCQlmRWRpdC5hcHBseShjb3B5RG9jKTsKLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQlyZXR1cm4gY29weURvYzsKLQkJfQotCQkKLQkJcHVibGljIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCVJlbmFtZUNoYW5nZSB1bmRvQ2hhbmdlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJCi0JCQkJaWYoIWlzT3BlbkluRWRpdG9yKHRoaXMuZkpTUERvYykpIHsKLQkJCQkJLy8gYXBwbHkgZWRpdCB0byBKU1AgZG9jIEFORCBzYXZlIG1vZGVsCi0JCQkJCXVuZG9DaGFuZ2UgPSBuZXcgUmVuYW1lQ2hhbmdlKHRoaXMuZkpTUEZpbGUsIHRoaXMuZkpTUERvYywgdGhpcy5mRWRpdC5hcHBseShmSlNQRG9jKSwgdGhpcy5mRGVzY3JpcHRpb24pOwotCQkJCQlzYXZlRmlsZSh0aGlzLmZKU1BGaWxlLCB0aGlzLmZKU1BEb2MpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8ganVzdCBhcHBseSBlZGl0IHRvIEpTUCBkb2N1bWVudAotCQkJCQl1bmRvQ2hhbmdlID0gbmV3IFJlbmFtZUNoYW5nZSh0aGlzLmZKU1BGaWxlLCB0aGlzLmZKU1BEb2MsIHRoaXMuZkVkaXQuYXBwbHkoZkpTUERvYyksIHRoaXMuZkRlc2NyaXB0aW9uKTsKLQkJCQl9Ci0JCQkJCi0JCQl9IGNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gdW5kb0NoYW5nZTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIFBlcmZvcm1lZCBpbiBhbiBvcGVyYXRpb24gc2luY2UgaXQgbW9kaWZpZXMgcmVzb3VyY2VzIGluIHRoZSB3b3Jrc3BhY2UKLQkJICogQHBhcmFtIGpzcERvYwotCQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkJICovCi0JCXByaXZhdGUgdm9pZCBzYXZlRmlsZShJRmlsZSBqc3BGaWxlLCBJRG9jdW1lbnQganNwRG9jKSB7Ci0JCQkKLQkJCVNhdmVKc3BGaWxlT3Agb3AgID0gbmV3IFNhdmVKc3BGaWxlT3AoanNwRmlsZSwganNwRG9jKTsKLQkJCQotCQkJdHJ5IHsKLQkJCQlvcC5ydW4oSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBDaGVja3MgaWYgYSBkb2N1bWVudCBpcyBvcGVuIGluIGFuIGVkaXRvcgotCQkgKiBAcGFyYW0ganNwRG9jCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBpc09wZW5JbkVkaXRvcihJRG9jdW1lbnQganNwRG9jKSB7Ci0JCQlJV29ya2JlbmNoV2luZG93W10gd2luZG93cyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0V29ya2JlbmNoV2luZG93cygpOwotCQkJSVdvcmtiZW5jaFdpbmRvdyB3ID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgd2luZG93cy5sZW5ndGg7IGkrKykgewotCi0JCQkJdyA9IHdpbmRvd3NbaV07Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHcuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQotCQkJCQlJRWRpdG9yUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IHBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBudWxsOwotCQkJCQlPYmplY3QgbyA9IG51bGw7Ci0JCQkJCUlEb2N1bWVudCBkb2MgPSBudWxsOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZmVyZW5jZXMubGVuZ3RoOyBqKyspIHsKLQotCQkJCQkJZWRpdG9yID0gcmVmZXJlbmNlc1tqXS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQkJCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9Mzc2NAotCQkJCQkJLy8gdXNlIGFkYXB0ZXIgdG8gZ2V0IElUZXh0RWRpdG9yIChmb3IgdGhpbmdzIGxpa2UKLQkJCQkJCS8vIHBhZ2UgZGVzaWduZXIpCi0JCQkJCQlvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCQkJaWYgKG8gIT0gbnVsbCAmJiBvIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQotCQkJCQkJCWRvYyA9ICgoSVRleHRFZGl0b3IpIG8pLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCQkJaWYgKGRvYyAhPSBudWxsICYmIGRvYy5lcXVhbHMoanNwRG9jKSkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mRGVzY3JpcHRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJfQotCX0KLQkvLyBlbmQgaW5uZXIgY2xhc3MgUmVuYW1lQ2hhbmdlCi0JCi0JCi0JLyoqIFRoZSB0eXBlIGJlaW5nIHJlbmFtZWQgKHRoZSBvbGQgdHlwZSkqLwotCUlKYXZhRWxlbWVudCBmRWxlbWVudCA9IG51bGw7Ci0JLyoqIFRoZSBuZXcgbmFtZSBvZiB0aGUgdHlwZSBiZWluZyByZW5hbWVkKi8KLQlwcml2YXRlIFN0cmluZyBmTmV3TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JLyoqIG1hcHMgYSBKU1BTZWFyY2hEb2N1bWVudCBwYXRoIC0+IE11bHRpVGV4dEVkaXQgZm9yIHRoZSBqYXZhIGZpbGUqLwotCXByaXZhdGUgSGFzaE1hcCBmU2VhcmNoRG9jUGF0aDJKYXZhRWRpdE1hcCA9IG51bGw7Ci0JCi0JcHVibGljIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IoSUphdmFFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMuZk5ld05hbWUgPSBuZXdOYW1lOwotCQl0aGlzLmZFbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5mU2VhcmNoRG9jUGF0aDJKYXZhRWRpdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCQotCXB1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbmV3IG5hbWUgZm9yIHRoZSBUeXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROZXdOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5mTmV3TmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yI2FjY2VwdFNlYXJjaE1hdGNoKG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCBqYXZhTWF0Y2gpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCVN0cmluZyBtYXRjaERvY3VtZW50UGF0aCA9IGphdmFNYXRjaC5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJU2VhcmNoRG9jdW1lbnQgc2VhcmNoRG9jID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFNlYXJjaERvY3VtZW50KG1hdGNoRG9jdW1lbnRQYXRoKTsKLQkKLQkJaWYgKHNlYXJjaERvYyAhPSBudWxsICYmIHNlYXJjaERvYyBpbnN0YW5jZW9mIEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKSB7Ci0JCi0JCQlTdHJpbmcgcmVuYW1lVGV4dCA9IGdldFJlbmFtZVRleHQoKEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKXNlYXJjaERvYywgamF2YU1hdGNoKTsKLQkJCQotCQkJLy8gYWRkIGl0IGZvciB0aGUgY29ycmVjdCBkb2N1bWVudAotCQkJYWRkSmF2YUVkaXQoc2VhcmNoRG9jLmdldFBhdGgoKSwgbmV3IFJlcGxhY2VFZGl0KGphdmFNYXRjaC5nZXRPZmZzZXQoKSwgamF2YU1hdGNoLmdldExlbmd0aCgpLCByZW5hbWVUZXh0KSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNlYXJjaERvYwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbmFtZVRleHQoSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgc2VhcmNoRG9jLCBTZWFyY2hNYXRjaCBqYXZhTWF0Y2gpIHsKLQkJcmV0dXJuIGdldE5ld05hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRvIHRoZSBtdWx0aSBlZGl0IGZvciBhIGdpdmUgamF2YSBkb2N1bWVudC4KLQkgKiBAcGFyYW0gamF2YURvY3VtZW50Ci0JICogQHBhcmFtIGphdmFFZGl0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEphdmFFZGl0KFN0cmluZyBzZWFyY2hEb2NQYXRoLCBSZXBsYWNlRWRpdCBqYXZhRWRpdCkgewotCQkKLQkJT2JqZWN0IG8gPSB0aGlzLmZTZWFyY2hEb2NQYXRoMkphdmFFZGl0TWFwLmdldChzZWFyY2hEb2NQYXRoKTsKLQkJaWYobyAhPSBudWxsKSB7Ci0KLQkJCU11bHRpVGV4dEVkaXQgbXVsdGkgPSAoTXVsdGlUZXh0RWRpdClvOwotCQkJbXVsdGkuYWRkQ2hpbGQoamF2YUVkaXQpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gdXNlIGEgbXVsdGkgZWRpdCBzbyBkb2MgcG9zaXRpb24gb2Zmc2V0cyBnZXQgdXBkYXRlZCBhdXRvbWF0aWNhbGx5Ci0JCQkvLyB3aGVuIGFkZGluZyBtdWx0aXBsZSBjaGlsZCBlZGl0cwotCQkJTXVsdGlUZXh0RWRpdCBtdWx0aSA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQltdWx0aS5hZGRDaGlsZChqYXZhRWRpdCk7Ci0JCQl0aGlzLmZTZWFyY2hEb2NQYXRoMkphdmFFZGl0TWFwLnB1dChzZWFyY2hEb2NQYXRoLCBtdWx0aSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiBhbGwgSlNQIGNoYW5nZXMgZm9yIHRoZSBzZWFyY2ggbWF0Y2hlcyBmb3IgdGhlIGdpdmVuIFR5cGUKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlW10gZ2V0Q2hhbmdlcygpIHsKLQkJCi0JCUpTUFNlYXJjaFN1cHBvcnQgc3VwcG9ydCA9IEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJTGlzdCBjaGFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBrZXlzID0gZlNlYXJjaERvY1BhdGgySmF2YUVkaXRNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nIHNlYXJjaERvY1BhdGggPSBudWxsOwotCQlTZWFyY2hEb2N1bWVudCBkZWxlZ2F0ZSA9IG51bGw7Ci0JCQotCQl3aGlsZShrZXlzLmhhc05leHQoKSkgewotCQkJLy8gY3JlYXRlIG9uIHRoZSBmbHkKLQkJCXNlYXJjaERvY1BhdGggPSAoU3RyaW5nKWtleXMubmV4dCgpOwotCQkJTXVsdGlUZXh0RWRpdCBqYXZhRWRpdCA9IChNdWx0aVRleHRFZGl0KWZTZWFyY2hEb2NQYXRoMkphdmFFZGl0TWFwLmdldChzZWFyY2hEb2NQYXRoKTsKLQkJCWRlbGVnYXRlID0gc3VwcG9ydC5nZXRTZWFyY2hEb2N1bWVudChzZWFyY2hEb2NQYXRoKTsKLQkJCQotCQkJaWYoZGVsZWdhdGUgIT0gbnVsbCAmJiBkZWxlZ2F0ZSBpbnN0YW5jZW9mIEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKSB7Ci0JCQkJSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgamF2YURlbGVnYXRlID0gKEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKWRlbGVnYXRlOwotCQkJCWNoYW5nZXMuYWRkKGNyZWF0ZUNoYW5nZShqYXZhRGVsZWdhdGUsIGphdmFEZWxlZ2F0ZS5nZXRKc3BUcmFuc2xhdGlvbigpLmdldEpzcEVkaXQoamF2YUVkaXQpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChDaGFuZ2VbXSljaGFuZ2VzLnRvQXJyYXkobmV3IENoYW5nZVtjaGFuZ2VzLnNpemUoKV0pOwotCX0KLQkKLQlwcml2YXRlIENoYW5nZSBjcmVhdGVDaGFuZ2UoSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgc2VhcmNoRG9jLCBUZXh0RWRpdCBlZGl0KSB7Ci0JCQotCQlJRG9jdW1lbnQgZG9jID0gc2VhcmNoRG9jLmdldEpzcFRyYW5zbGF0aW9uKCkuZ2V0SnNwRG9jdW1lbnQoKTsKLQkJU3RyaW5nIGZpbGUgPSBzZWFyY2hEb2MuZ2V0RmlsZSgpLmdldE5hbWUoKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gZ2V0RGVzY3JpcHRpb24oKTsKLQkJdHJ5IHsKLQkJCS8vIGRvY3VtZW50IGxpbmVzIGFyZSAwIGJhc2VkCi0JCQlTdHJpbmcgbGluZU51bWJlciA9IEludGVnZXIudG9TdHJpbmcoZG9jLmdldExpbmVPZk9mZnNldChlZGl0LmdldE9mZnNldCgpKSArIDEpOwotCQkJZGVzY3JpcHRpb24gKz0gIiAiICsgTkxTLmJpbmQoSlNQVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzEsIG5ldyBTdHJpbmdbXXtmaWxlLCBsaW5lTnVtYmVyfSk7IC8vJE5PTi1OTFMtMSQKLQkJfSAKLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBSZW5hbWVDaGFuZ2Uoc2VhcmNoRG9jLmdldEZpbGUoKSwgZG9jLCBlZGl0LCBkZXNjcmlwdGlvbik7Ci0JfQotCQotCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zMjA1Ci0JLy8gb25seSByZWxldmFudCBmb3IgSVR5cGUgcmVmYWN0b3JpbmdzCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGdWxseVF1YWxpZmllZChTdHJpbmcgbWF0Y2hUZXh0KSB7Ci0JCWlmKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElUeXBlKSB7Ci0JCQlTdHJpbmcgcGtnID0gKChJVHlwZSlnZXRFbGVtZW50KCkpLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCQlyZXR1cm4gbWF0Y2hUZXh0LnN0YXJ0c1dpdGgocGtnKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gYmV0dGVyIGRlc2NyaWJlIHRoZSBjaGFuZ2UuCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUEphdmFTZWxlY3Rpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQSmF2YVNlbGVjdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YjZjOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQSmF2YVNlbGVjdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLklKU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLWNsYXNzIEpTUEphdmFTZWxlY3Rpb25Qcm92aWRlciB7Ci0Jc3RhdGljIElKYXZhRWxlbWVudFtdIGdldFNlbGVjdGlvbihJVGV4dEVkaXRvciB0ZXh0RWRpdG9yKSB7Ci0JCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gbnVsbDsKLQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkvLyBnZXQgdGhlIEpTUCB0cmFuc2xhdGlvbiBvYmplY3QgZm9yIHRoaXMgZWRpdG9yJ3MgZG9jdW1lbnQKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsgCi0JCQl0cnkgewotCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSAoSURPTU1vZGVsKW1vZGVsOwotCQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQotCQkJCQlKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChKU1BUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKU1BUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCUpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbigpOwotCQkJCQkJZWxlbWVudHMgPSB0cmFuc2xhdGlvbi5nZXRFbGVtZW50c0Zyb21Kc3BSYW5nZSh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCWVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFswXTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVDaGFuZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZUNoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWE0Y2FjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZUNoYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUE1ldGhvZFJlbmFtZUNoYW5nZSBleHRlbmRzIENoYW5nZSB7Ci0KLQlwdWJsaWMgc3RhdGljIENoYW5nZVtdIGNyZWF0ZUNoYW5nZXNGb3IoSU1ldGhvZCBtZXRob2QsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCUpTUFNlYXJjaFN1cHBvcnQgc3VwcG9ydCA9IEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJCi0JCS8vIHNob3VsZCBiZSBoYW5kbGVkIGJ5IEpTUEluZGV4TWFuYWdlcgotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzAzNgotCQkvLyBzdXBwb3J0LmluZGV4V29ya3NwYWNlQW5kV2FpdCgpOwotCQkKLQkJQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgSlNQTWV0aG9kUmVuYW1lUmVxdWVzdG9yKG1ldGhvZCwgbmV3TmFtZSk7Ci0JCXN1cHBvcnQuc2VhcmNoUnVubmFibGUobWV0aG9kLCBuZXcgSlNQU2VhcmNoU2NvcGUoKSwgcmVxdWVzdG9yKTsKLQotCQlyZXR1cm4gcmVxdWVzdG9yLmdldENoYW5nZXMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKU1BVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkJLy8gbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBkZWNpZGUgY29ycmVjdCB2YWx1ZSBvZiBpc1ZhbGlkCi0JfQotCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBwYV9UT0RPIGltcGxlbWVudAotCQkvLyBUaGlzIG1ldGhvZCBtdXN0IGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2Ugb2JqZWN0IGlzIHN0aWxsIHZhbGlkLgotCQkvLyBUaGlzIGlzIGluIHBhcnRpY3VsYXIgaW50ZXJlc3Rpbmcgd2hlbiBwZXJmb3JtaW5nIGFuIHVuZG8gY2hhbmdlCi0JCS8vIHNpbmNlIHRoZSB3b3Jrc3BhY2UgY291bGQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSB1bmRvIGNoYW5nZSBoYXMKLQkJLy8gYmVlbiBjcmVhdGVkLgotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCi0JcHVibGljIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gcGFfVE9ETyByZXR1cm4gdGhlICJ1bmRvIiBjaGFuZ2UgaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKLQkJLy8gcGFfVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUyM2JlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQYXJ0aWNpcGFudDsKLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQgZXh0ZW5kcyBSZW5hbWVQYXJ0aWNpcGFudCB7Ci0JCi0JcHJpdmF0ZSBJTWV0aG9kIGZNZXRob2QgPSBudWxsOwotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIElNZXRob2QpIHsKLQkJCXRoaXMuZk1ldGhvZCA9IChJTWV0aG9kKSBlbGVtZW50OwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZih0aGlzLmZNZXRob2QgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQluYW1lID0gdGhpcy5mTWV0aG9kLmdldFNvdXJjZSgpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjaGVja0NvbmRpdGlvbnMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0KQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0NvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSwgQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NyZWF0ZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUNoYW5nZVtdIGNoYW5nZXMgPSBKU1BNZXRob2RSZW5hbWVDaGFuZ2UuY3JlYXRlQ2hhbmdlc0Zvcih0aGlzLmZNZXRob2QsIGdldEFyZ3VtZW50cygpLmdldE5ld05hbWUoKSk7Ci0JCUNvbXBvc2l0ZUNoYW5nZSBtdWx0aUNoYW5nZSA9IG51bGw7IAotCQkJaWYoY2hhbmdlcy5sZW5ndGggPiAwKQotCQkJCW11bHRpQ2hhbmdlICA9IG5ldyBDb21wb3NpdGVDaGFuZ2UoSlNQVUlNZXNzYWdlcy5KU1BfY2hhbmdlcywgY2hhbmdlcyk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG11bHRpQ2hhbmdlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZVJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOGZlNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUE1ldGhvZFJlbmFtZVJlcXVlc3RvciBleHRlbmRzIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgewotCQotCXB1YmxpYyBKU1BNZXRob2RSZW5hbWVSZXF1ZXN0b3IoSUphdmFFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXN1cGVyKGVsZW1lbnQsIG5ld05hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbmFtZVRleHQoSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgc2VhcmNoRG9jLCBTZWFyY2hNYXRjaCBqYXZhTWF0Y2gpIHsKLQkJCi0JCVN0cmluZyBqYXZhVGV4dCA9IHNlYXJjaERvYy5nZXRKc3BUcmFuc2xhdGlvbigpLmdldEphdmFUZXh0KCk7Ci0JCVN0cmluZyBtZXRob2RUZXh0ID0gamF2YVRleHQuc3Vic3RyaW5nKGphdmFNYXRjaC5nZXRPZmZzZXQoKSwgamF2YU1hdGNoLmdldE9mZnNldCgpICsgamF2YU1hdGNoLmdldExlbmd0aCgpKTsKLQkJU3RyaW5nIG1ldGhvZFN1ZmZpeCA9IG1ldGhvZFRleHQuc3Vic3RyaW5nKG1ldGhvZFRleHQuaW5kZXhPZigiKCIpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZ2V0TmV3TmFtZSgpICsgbWV0aG9kU3VmZml4OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJCi0JCVN0cmluZyBtZXRob2ROYW1lID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCVN0cmluZyBuZXdOYW1lID0gZ2V0TmV3TmFtZSgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChKU1BVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMywgbmV3IFN0cmluZ1tde21ldGhvZE5hbWUsIG5ld05hbWV9KTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTW92ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTW92ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjczZGJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1vdmVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5QbGF0Zm9ybVN0YXR1c0xpbmVVdGlsOwotCi0vKioKLSAqIEFuIGFjdGlvbiBkZWxlZ2F0ZSB0aGF0IGxhdW5jaGVzIEpEVCBtb3ZlIGVsZW1lbnQgd2l6YXJkCi0gKiAKLSAqIFN0aWxsIHJlbGllcyBoZWF2aWx5IG9uIGludGVybmFsIEFQSQotICogd2lsbCBjaGFuZ2UgcG9zdCAzLjAgd2l0aCBwdWJsaWMgbW92ZSBzdXBwb3J0Ci0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjE4MTcgCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BNb3ZlRWxlbWVudEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUyLCBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQkvL3ByaXZhdGUgSUVkaXRvclBhcnQgZkVkaXRvcjsKLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJQWN0aW9uIGFjdGlvbiwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCS8vZkVkaXRvciA9IHRhcmdldEVkaXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBudWxsaW5nIG91dCBqdXN0IGluIGNhc2UKLQkJLy9mRWRpdG9yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoSlNQVUlNZXNzYWdlcy5Nb3ZlRWxlbWVudF9sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoSlNQVUlNZXNzYWdlcy5Nb3ZlRWxlbWVudF9sYWJlbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bihhY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQkKLQkJLy8gbm8tb3AgdW50aWwgd2Uga25vdyBob3cgd2UncmUgc3VwcG9zZWQgdG8gdXNlIHRoaXMgCi0JCS8vIGVjbGlwc2UgMy4yTTUKLQkJLy8gcHVibGljIG1vdmUgc3VwcG9ydDogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxODE3Ci0JCQotLy8JCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cygpOwotLy8JCWlmIChlbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0vLwotLy8JCQkvLyBuZWVkIHRvIGNoZWNrIGlmIGl0J3MgbW92YWJsZQotLy8JCQl0cnkgewotLy8JCQkJSmF2YU1vdmVQcm9jZXNzb3IgcHJvY2Vzc29yID0gSmF2YU1vdmVQcm9jZXNzb3IuY3JlYXRlKGdldFJlc291cmNlcyhlbGVtZW50cyksIGVsZW1lbnRzKTsKLS8vCQkJCQotLy8JCQkJU2hlbGwgcGFyZW50ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotLy8JCQkJTW92ZVJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nID0gbmV3IE1vdmVSZWZhY3RvcmluZyhwcm9jZXNzb3IpOwotLy8KLS8vCQkJCVJlZmFjdG9yaW5nV2l6YXJkIHdpemFyZCA9IGNyZWF0ZVdpemFyZChyZWZhY3RvcmluZyk7Ci0vLwotLy8JCQkJLyoKLS8vCQkJCSAqIFdlIHdhbnQgdG8gZ2V0IHRoZSBzaGVsbCBmcm9tIHRoZSByZWZhY3RvcmluZyBkaWFsb2cgYnV0Ci0vLwkJCQkgKiBpdCdzIG5vdCBrbm93biBhdCB0aGlzIHBvaW50LCBzbyB3ZSBwYXNzIHRoZSB3aXphcmQgYW5kCi0vLwkJCQkgKiB0aGVuLCBvbmNlIHRoZSBkaWFsb2cgaXMgb3Blbiwgd2Ugd2lsbCBoYXZlIGFjY2VzcyB0byBpdHMKLS8vCQkJCSAqIHNoZWxsLgotLy8JCQkJICovCi0vLwotLy8JCQkJcHJvY2Vzc29yLnNldENyZWF0ZVRhcmdldFF1ZXJpZXMobmV3IENyZWF0ZVRhcmdldFF1ZXJpZXMod2l6YXJkKSk7Ci0vLwkJCQlwcm9jZXNzb3Iuc2V0UmVvcmdRdWVyaWVzKG5ldyBSZW9yZ1F1ZXJpZXMod2l6YXJkKSk7Ci0vLwkJCQkvLyBTdHJpbmcgb3BlblJlZmFjdG9yaW5nV2l6TXNnID0KLS8vCQkJCS8vIFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJPcGVuUmVmYWN0b3JpbmdXaXphcmRBY3Rpb24ucmVmYWN0b3JpbmciKTsKLS8vCQkJCS8vIC8vJE5PTi1OTFMtMSQKLS8vCQkJCVN0cmluZyBvcGVuUmVmYWN0b3JpbmdXaXpNc2cgPSBKU1BVSU1lc3NhZ2VzLk1vdmVFbGVtZW50V2l6YXJkOyAvLyAiTW92ZQotLy8JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRoZQotLy8JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHNlbGVjdGVkCi0vLwkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZWxlbWVudHMiOwotLy8JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLS8vCQkJCW5ldyBSZWZhY3RvcmluZ1N0YXJ0ZXIoKS5hY3RpdmF0ZShyZWZhY3RvcmluZywgd2l6YXJkLCBwYXJlbnQsIG9wZW5SZWZhY3RvcmluZ1dpek1zZywgdHJ1ZSk7Ci0vLwotLy8JCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5jbGVhclN0YXR1c0xpbmUoKTsKLS8vCi0vLwkJCX0KLS8vCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotLy8JCQl9Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlFcnJvck1lc3NhZ2UoSlNQVUlNZXNzYWdlcy5KU1BNb3ZlRWxlbWVudEFjdGlvbl8wKTsgLy8kTk9OLU5MUy0xJAotLy8JCX0KLQkJCi0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5jbGVhclN0YXR1c0xpbmUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZUNoYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZUNoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmI5ZDAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQYWNrYWdlUmVuYW1lQ2hhbmdlIGV4dGVuZHMgQ2hhbmdlIHsKLQotCXB1YmxpYyBzdGF0aWMgQ2hhbmdlW10gY3JlYXRlQ2hhbmdlc0ZvcihJUGFja2FnZUZyYWdtZW50IHBrZywgU3RyaW5nIG5ld05hbWUpIHsKLQkJSlNQU2VhcmNoU3VwcG9ydCBzdXBwb3J0ID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCQkKLQkJLy8gc2hvdWxkIGJlIGhhbmRsZWQgYnkgSlNQSW5kZXhNYW5hZ2VyCi0JCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zMDM2Ci0JCS8vc3VwcG9ydC5pbmRleFdvcmtzcGFjZUFuZFdhaXQoKTsKLQkJCi0JCUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IEpTUFBhY2thZ2VSZW5hbWVSZXF1ZXN0b3IocGtnLCBuZXdOYW1lKTsKLQkJc3VwcG9ydC5zZWFyY2hSdW5uYWJsZShwa2csIG5ldyBKU1BTZWFyY2hTY29wZSgpLCByZXF1ZXN0b3IpOwotCi0JCXJldHVybiByZXF1ZXN0b3IuZ2V0Q2hhbmdlcygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpTUFVJTWVzc2FnZXMuSlNQX2NoYW5nZXM7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEoSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQkvLyBwYV9UT0RPIGltcGxlbWVudAotCQkvLyBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGRlY2lkZSBjb3JyZWN0IHZhbHVlIG9mIGlzVmFsaWQKLQl9Ci0KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgaXNWYWxpZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JCS8vIFRoaXMgbWV0aG9kIG11c3QgZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBvYmplY3QgaXMgc3RpbGwgdmFsaWQuCi0JCS8vIFRoaXMgaXMgaW4gcGFydGljdWxhciBpbnRlcmVzdGluZyB3aGVuIHBlcmZvcm1pbmcgYW4gdW5kbyBjaGFuZ2UKLQkJLy8gc2luY2UgdGhlIHdvcmtzcGFjZSBjb3VsZCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIHVuZG8gY2hhbmdlIGhhcwotCQkvLyBiZWVuIGNyZWF0ZWQuCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0KLQlwdWJsaWMgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIHJldHVybiB0aGUgInVuZG8iIGNoYW5nZSBoZXJlCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQkKLQkJLy9yZXR1cm4gdGhpcy5wa2c7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZWQ1ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNvbXBvc2l0ZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUGFydGljaXBhbnQ7Ci0KLS8qKgotICogUmVtZW1iZXIgdG8gY2hhbmdlIHRoZSBwbHVnaW4ueG1sIGZpbGUgaWYgdGhlIG5hbWUgb2YgdGhpcyBjbGFzcyBjaGFuZ2VzLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQUGFja2FnZVJlbmFtZVBhcnRpY2lwYW50IGV4dGVuZHMgUmVuYW1lUGFydGljaXBhbnQgewotCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50IGZQa2cgPSBudWxsOwotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpIHsKLQkJCXRoaXMuZlBrZyA9IChJUGFja2FnZUZyYWdtZW50KSBlbGVtZW50OwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZih0aGlzLmZQa2cgIT0gbnVsbCkgewotCQkJbmFtZSA9IHRoaXMuZlBrZy5nZXRFbGVtZW50TmFtZSgpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY2hlY2tDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY3JlYXRlQ2hhbmdlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJIENoYW5nZVtdIGNoYW5nZXMgPSBKU1BQYWNrYWdlUmVuYW1lQ2hhbmdlLmNyZWF0ZUNoYW5nZXNGb3IodGhpcy5mUGtnLCBnZXRBcmd1bWVudHMoKS5nZXROZXdOYW1lKCkpOwotCQkgQ29tcG9zaXRlQ2hhbmdlIG11bHRpQ2hhbmdlID0gbnVsbDsKLQkJIGlmKGNoYW5nZXMubGVuZ3RoID4gMCkKLQkJCW11bHRpQ2hhbmdlID0gbmV3IENvbXBvc2l0ZUNoYW5nZShKU1BVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzLCBjaGFuZ2VzKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgcmV0dXJuIG11bHRpQ2hhbmdlOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyMTFiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BQYWNrYWdlUmVuYW1lUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIE92ZXJyaWRlcyBnZXQgZGVzY3JpcHRpb24KLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQYWNrYWdlUmVuYW1lUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciB7Ci0JCi0JLyoqCi0JICogRWxlbWVudCBpcyB0aGUgb2xkIHBhY2thZ2UuICBuZXdOYW1lIGlzIHRoZSBuZXcgcGFja2FnZSBuYW1lLgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIG5ld05hbWUKLQkgKi8KLQlwdWJsaWMgSlNQUGFja2FnZVJlbmFtZVJlcXVlc3RvcihJSmF2YUVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJc3VwZXIoZWxlbWVudCwgbmV3TmFtZSk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCVN0cmluZyBuZXdOYW1lID0gZ2V0TmV3TmFtZSgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBOTFMuYmluZChKU1BVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNSwgKG5ldyBTdHJpbmdbXXtwYWNrYWdlTmFtZSwgbmV3TmFtZX0pKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUmVuYW1lRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BSZW5hbWVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4N2ZjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BSZW5hbWVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkucmVmYWN0b3JpbmcuUmVuYW1lU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGxhdGZvcm1TdGF0dXNMaW5lVXRpbDsKLQotLyoqCi0gKiBBbiBhY3Rpb24gZGVsZWdhdGUgdGhhdCBsYXVuY2hlcyBKRFQgcmVuYW1lIGVsZW1lbnQgd2l6YXJkCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BSZW5hbWVFbGVtZW50QWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJRWRpdG9yQWN0aW9uRGVsZWdhdGUsIElBY3Rpb25EZWxlZ2F0ZTIsIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgSUVkaXRvclBhcnQgZkVkaXRvcjsKLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG51bGxpbmcgb3V0IGp1c3QgaW4gY2FzZQotCQlmRWRpdG9yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoSlNQVUlNZXNzYWdlcy5SZW5hbWVFbGVtZW50X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChKU1BVSU1lc3NhZ2VzLlJlbmFtZUVsZW1lbnRfbGFiZWwpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZ2V0U2VsZWN0ZWRFbGVtZW50KCk7Ci0JCWlmKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJUmVuYW1lU3VwcG9ydCByZW5hbWVTdXBwb3J0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc3dpdGNoKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJCQljYXNlIElKYXZhRWxlbWVudC5UWVBFOgotCQkJCQkJcmVuYW1lU3VwcG9ydD0gUmVuYW1lU3VwcG9ydC5jcmVhdGUoKElUeXBlKWVsZW1lbnQsIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSwgUmVuYW1lU3VwcG9ydC5VUERBVEVfUkVGRVJFTkNFUyk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJSmF2YUVsZW1lbnQuTUVUSE9EOgotCQkJCQkJcmVuYW1lU3VwcG9ydD0gUmVuYW1lU3VwcG9ydC5jcmVhdGUoKElNZXRob2QpZWxlbWVudCwgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLCBSZW5hbWVTdXBwb3J0LlVQREFURV9SRUZFUkVOQ0VTKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UOgotCQkJCQkJcmVuYW1lU3VwcG9ydD0gUmVuYW1lU3VwcG9ydC5jcmVhdGUoKElQYWNrYWdlRnJhZ21lbnQpZWxlbWVudCwgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLCBSZW5hbWVTdXBwb3J0LlVQREFURV9SRUZFUkVOQ0VTKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZihyZW5hbWVTdXBwb3J0ICE9IG51bGwpIHsKLQkJCQkJcmVuYW1lU3VwcG9ydC5vcGVuRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSk7Ci0JCQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSAgewotCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5kaXNwbGF5RXJyb3JNZXNzYWdlKEpTUFVJTWVzc2FnZXMuSlNQUmVuYW1lRWxlbWVudEFjdGlvbl8wKTsgLy8kTk9OLU5MUy0xJAotCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5hZGRPbmVUaW1lQ2xlYXJMaXN0ZW5lcigpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJpdmF0ZSBJSmF2YUVsZW1lbnQgZ2V0U2VsZWN0ZWRFbGVtZW50KCkgewotCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCWlmIChmRWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gSlNQSmF2YVNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigoSVRleHRFZGl0b3IpZkVkaXRvcik7Ci0JCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDEpCi0JCQkJZWxlbWVudCA9IGVsZW1lbnRzWzBdOwotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlQ2hhbmdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZUNoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDQ4NTQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlQ2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFR5cGVNb3ZlQ2hhbmdlIGV4dGVuZHMgQ2hhbmdlIHsKLQotCXB1YmxpYyBzdGF0aWMgQ2hhbmdlW10gY3JlYXRlQ2hhbmdlc0ZvcihJVHlwZSB0eXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQkKLQkJSlNQU2VhcmNoU3VwcG9ydCBzdXBwb3J0ID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCQkvLyBzaG91bGQgYmUgaGFuZGxlZCBieSBKU1BJbmRleE1hbmFnZXIKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTMwMzYKLQkJLy8gc3VwcG9ydC5pbmRleFdvcmtzcGFjZUFuZFdhaXQoKTsKLQkJCi0JCUpTUFR5cGVNb3ZlUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBKU1BUeXBlTW92ZVJlcXVlc3Rvcih0eXBlLCBuZXdOYW1lKTsKLQkJc3VwcG9ydC5zZWFyY2hSdW5uYWJsZSh0eXBlLCBuZXcgSlNQU2VhcmNoU2NvcGUoKSwgcmVxdWVzdG9yKTsKLQotCQlyZXR1cm4gcmVxdWVzdG9yLmdldENoYW5nZXMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKU1BVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkJLy8gbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBkZWNpZGUgY29ycmVjdCB2YWx1ZSBvZiBpc1ZhbGlkCi0JfQotCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBwYV9UT0RPIGltcGxlbWVudAotCQkvLyBUaGlzIG1ldGhvZCBtdXN0IGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2Ugb2JqZWN0IGlzIHN0aWxsIHZhbGlkLgotCQkvLyBUaGlzIGlzIGluIHBhcnRpY3VsYXIgaW50ZXJlc3Rpbmcgd2hlbiBwZXJmb3JtaW5nIGFuIHVuZG8gY2hhbmdlCi0JCS8vIHNpbmNlIHRoZSB3b3Jrc3BhY2UgY291bGQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSB1bmRvIGNoYW5nZSBoYXMKLQkJLy8gYmVlbiBjcmVhdGVkLgotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCi0JcHVibGljIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyByZXR1cm4gdGhlICJ1bmRvIiBjaGFuZ2UgaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTJlZmUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5Nb3ZlUGFydGljaXBhbnQ7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFR5cGVNb3ZlUGFydGljaXBhbnQgZXh0ZW5kcyBNb3ZlUGFydGljaXBhbnQgewotCQotCUlUeXBlIGZUeXBlID0gbnVsbDsKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNpbml0aWFsaXplKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZShPYmplY3QgZWxlbWVudCkgewotCQkKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKSB7Ci0JCQl0aGlzLmZUeXBlID0gKElUeXBlKWVsZW1lbnQ7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZih0aGlzLmZUeXBlICE9IG51bGwpCi0JCQluYW1lID0gdGhpcy5mVHlwZS5nZXRFbGVtZW50TmFtZSgpOwotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY2hlY2tDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjcmVhdGVDaGFuZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJaWYocG0gIT0gbnVsbCAmJiBwbS5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCUNvbXBvc2l0ZUNoYW5nZSBtdWx0aUNoYW5nZSA9IG51bGw7IAotCQlPYmplY3QgZGVzdCA9IGdldEFyZ3VtZW50cygpLmdldERlc3RpbmF0aW9uKCk7Ci0JCQotCQlpZihkZXN0IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgewkJCi0JCQlDaGFuZ2VbXSBjaGFuZ2VzID0gSlNQVHlwZU1vdmVDaGFuZ2UuY3JlYXRlQ2hhbmdlc0ZvcihmVHlwZSwgKChJUGFja2FnZUZyYWdtZW50KWRlc3QpLmdldEVsZW1lbnROYW1lKCkpOwotCQkJaWYoY2hhbmdlcy5sZW5ndGggPiAwKQotCQkJCW11bHRpQ2hhbmdlID0gbmV3IENvbXBvc2l0ZUNoYW5nZShKU1BVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzLCBjaGFuZ2VzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBtdWx0aUNoYW5nZTsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZVJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1MzAzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZVJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlTW92ZVJlcXVlc3RvciBleHRlbmRzIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gbmV3TmFtZQotCSAqLwotCXB1YmxpYyBKU1BUeXBlTW92ZVJlcXVlc3RvcihJSmF2YUVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5ld1BhY2thZ2UpIHsKLQkJc3VwZXIoZWxlbWVudCwgbmV3UGFja2FnZSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVuYW1lVGV4dChKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBzZWFyY2hEb2MsIFNlYXJjaE1hdGNoIGphdmFNYXRjaCkgewotCQkKLQkJU3RyaW5nIHJlbmFtZVRleHQgPSBnZXRFbGVtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQotCQlKU1BUcmFuc2xhdGlvbiB0cmFucyA9IHNlYXJjaERvYy5nZXRKc3BUcmFuc2xhdGlvbigpOwotCQlTdHJpbmcgbWF0Y2hUZXh0ID0gdHJhbnMuZ2V0SmF2YVRleHQoKS5zdWJzdHJpbmcoamF2YU1hdGNoLmdldE9mZnNldCgpLCBqYXZhTWF0Y2guZ2V0T2Zmc2V0KCkgKyBqYXZhTWF0Y2guZ2V0TGVuZ3RoKCkpOwotCQkKLQkJLy8gaWYgaXQncyBhbiBpbXBvcnQgb3IganNwOnVzZUJlYW4sIHdlIG5lZWQgdG8gYWRkIHRoZSBwYWNrYWdlIG5hbWUgYXMgd2VsbAotCQlpZih0cmFucy5pc0ltcG9ydChqYXZhTWF0Y2guZ2V0T2Zmc2V0KCkpIHx8IHRyYW5zLmlzVXNlQmVhbihqYXZhTWF0Y2guZ2V0T2Zmc2V0KCkpIHx8IGlzRnVsbHlRdWFsaWZpZWQobWF0Y2hUZXh0KSkgewotCQkJaWYoIWdldE5ld05hbWUoKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQkJLy8gZ2V0TmV3TmFtZSgpIGlzIHRoZSBwa2cgbmFtZQotCQkJCXJlbmFtZVRleHQgPSBnZXROZXdOYW1lKCkgKyAiLiIgKyByZW5hbWVUZXh0OyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlbmFtZVRleHQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkKLQkJU3RyaW5nIHR5cGVOYW1lID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCVN0cmluZyBuZXdOYW1lID0gZ2V0TmV3TmFtZSgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChKU1BVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMiwgbmV3IFN0cmluZ1tde3R5cGVOYW1lLCBuZXdOYW1lfSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVDaGFuZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVDaGFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU5YmFmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlUmVuYW1lQ2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQVHlwZVJlbmFtZUNoYW5nZSBleHRlbmRzIENoYW5nZSB7Ci0KLQlwdWJsaWMgc3RhdGljIENoYW5nZVtdIGNyZWF0ZUNoYW5nZXNGb3IoSVR5cGUgdHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJSlNQU2VhcmNoU3VwcG9ydCBzdXBwb3J0ID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCQkKLQkJLy8gc2hvdWxkIGJlIGhhbmRsZWQgYnkgSlNQSW5kZXhNYW5hZ2VyCi0JCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zMDM2Ci0JCS8vIHN1cHBvcnQuaW5kZXhXb3Jrc3BhY2VBbmRXYWl0KCk7Ci0JCi0JCQotCQlKU1BUeXBlUmVuYW1lUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBKU1BUeXBlUmVuYW1lUmVxdWVzdG9yKHR5cGUsIG5ld05hbWUpOwotCQlzdXBwb3J0LnNlYXJjaFJ1bm5hYmxlKHR5cGUsIG5ldyBKU1BTZWFyY2hTY29wZSgpLCByZXF1ZXN0b3IpOwotCi0JCXJldHVybiByZXF1ZXN0b3IuZ2V0Q2hhbmdlcygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpTUFVJTWVzc2FnZXMuSlNQX2NoYW5nZXM7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEoSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQkvLyBwYV9UT0RPIGltcGxlbWVudAotCQkvLyBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGRlY2lkZSBjb3JyZWN0IHZhbHVlIG9mIGlzVmFsaWQKLQl9Ci0KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgaXNWYWxpZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JCS8vIFRoaXMgbWV0aG9kIG11c3QgZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBvYmplY3QgaXMgc3RpbGwgdmFsaWQuCi0JCS8vIFRoaXMgaXMgaW4gcGFydGljdWxhciBpbnRlcmVzdGluZyB3aGVuIHBlcmZvcm1pbmcgYW4gdW5kbyBjaGFuZ2UKLQkJLy8gc2luY2UgdGhlIHdvcmtzcGFjZSBjb3VsZCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIHVuZG8gY2hhbmdlIGhhcwotCQkvLyBiZWVuIGNyZWF0ZWQuCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0KLQlwdWJsaWMgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIHJldHVybiB0aGUgInVuZG8iIGNoYW5nZSBoZXJlCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMzIwNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQYXJ0aWNpcGFudDsKLQotLyoqCi0gKiBSZW1lbWJlciB0byBjaGFuZ2UgdGhlIHBsdWdpbi54bWwgZmlsZSBpZiB0aGUgbmFtZSBvZiB0aGlzIGNsYXNzIGNoYW5nZXMuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlUmVuYW1lUGFydGljaXBhbnQgZXh0ZW5kcyBSZW5hbWVQYXJ0aWNpcGFudCB7Ci0KLQlwcml2YXRlIElUeXBlIGZUeXBlID0gbnVsbDsKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2luaXRpYWxpemUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkgewotCQkJdGhpcy5mVHlwZSA9IChJVHlwZSkgZWxlbWVudDsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYodGhpcy5mVHlwZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW5hbWUgPSB0aGlzLmZUeXBlLmdldFNvdXJjZSgpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY2hlY2tDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY3JlYXRlQ2hhbmdlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQ2hhbmdlW10gY2hhbmdlcyA9ICBKU1BUeXBlUmVuYW1lQ2hhbmdlLmNyZWF0ZUNoYW5nZXNGb3IoZlR5cGUsIGdldEFyZ3VtZW50cygpLmdldE5ld05hbWUoKSk7Ci0JCUNvbXBvc2l0ZUNoYW5nZSBtdWx0aUNoYW5nZSA9IG51bGw7Ci0JCWlmKGNoYW5nZXMubGVuZ3RoID4gMCkKLQkJCW11bHRpQ2hhbmdlID0gbmV3IENvbXBvc2l0ZUNoYW5nZShKU1BVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzLCBjaGFuZ2VzKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbXVsdGlDaGFuZ2U7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmYxODBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotCi0vKioKLSAqIENyZWF0ZXMgZG9jdW1lbnQgY2hhbmdlKHMpIGZvciBhIHR5cGUgcmVuYW1lLgotICogQ2hhbmdlcyBhcmUgY3JlYXRlZCBmb3IgZXZlcnkgdHlwZSAibWF0Y2giIGluIHRoZSB3b3Jrc3BhY2UKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlUmVuYW1lUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciB7Ci0KLQlwdWJsaWMgSlNQVHlwZVJlbmFtZVJlcXVlc3RvcihJVHlwZSB0eXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlzdXBlcih0eXBlLCBuZXdOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gKElUeXBlKWdldEVsZW1lbnQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZW5hbWVUZXh0KEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlIHNlYXJjaERvYywgU2VhcmNoTWF0Y2ggamF2YU1hdGNoKSB7Ci0JCQotCQlTdHJpbmcgcmVuYW1lVGV4dCA9IGdldE5ld05hbWUoKTsKLQkJCi0JCVN0cmluZyBwa2cgPSBnZXRUeXBlKCkuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJSlNQVHJhbnNsYXRpb24gdHJhbnMgPSBzZWFyY2hEb2MuZ2V0SnNwVHJhbnNsYXRpb24oKTsKLQkJU3RyaW5nIG1hdGNoVGV4dCA9IHRyYW5zLmdldEphdmFUZXh0KCkuc3Vic3RyaW5nKGphdmFNYXRjaC5nZXRPZmZzZXQoKSwgamF2YU1hdGNoLmdldE9mZnNldCgpICsgamF2YU1hdGNoLmdldExlbmd0aCgpKTsKLQkJCi0JCS8vIGlmIGl0J3MgYW4gaW1wb3J0IG9yIGpzcDp1c2VCZWFuIG9yIGZ1bGx5IHF1YWxpZmllZCB0eXBlLCB3ZSBuZWVkIHRvIGFkZCB0aGUgcGFja2FnZSBuYW1lIGFzIHdlbGwKLQkJaWYodHJhbnMuaXNJbXBvcnQoamF2YU1hdGNoLmdldE9mZnNldCgpKSB8fCAvKnRyYW5zLmlzVXNlQmVhbihqYXZhTWF0Y2guZ2V0T2Zmc2V0KCkpIHx8Ki8gaXNGdWxseVF1YWxpZmllZChtYXRjaFRleHQpKSB7Ci0JCQlpZighcGtnLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZW5hbWVUZXh0ID0gcGtnICsgIi4iICsgcmVuYW1lVGV4dDsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZW5hbWVUZXh0OwotCX0KLQkKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkKLQkJU3RyaW5nIHR5cGVOYW1lID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCVN0cmluZyBuZXdOYW1lID0gZ2V0TmV3TmFtZSgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChKU1BVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNCwgbmV3IFN0cmluZ1tde3R5cGVOYW1lLCBuZXdOYW1lfSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL01vdmVFbGVtZW50SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvTW92ZUVsZW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYWJiZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvTW92ZUVsZW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci0KLS8qKgotICogQSBoYW5kbGVyIHRoYXQgbGF1bmNoZXMgSkRUIG1vdmUgZWxlbWVudCB3aXphcmQKLSAqIAotICogU3RpbGwgcmVsaWVzIGhlYXZpbHkgb24gaW50ZXJuYWwgQVBJCi0gKiB3aWxsIGNoYW5nZSBwb3N0IDMuMCB3aXRoIHB1YmxpYyBtb3ZlIHN1cHBvcnQKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTgxNyAKLSAqLwotcHVibGljIGNsYXNzIE1vdmVFbGVtZW50SGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0vLwlwcml2YXRlIElFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgYXJnMCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIG5vLW9wIHVudGlsIHdlIGtub3cgaG93IHdlJ3JlIHN1cHBvc2VkIHRvIHVzZSB0aGlzIAotCQkvLyBlY2xpcHNlIDMuMk01Ci0JCS8vIHB1YmxpYyBtb3ZlIHN1cHBvcnQ6IGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTgxNwotCQkKLS8vCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoKTsKLS8vCQlpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkgewotLy8KLS8vCQkJLy8gbmVlZCB0byBjaGVjayBpZiBpdCdzIG1vdmFibGUKLS8vCQkJdHJ5IHsKLS8vCQkJCUphdmFNb3ZlUHJvY2Vzc29yIHByb2Nlc3NvciA9IEphdmFNb3ZlUHJvY2Vzc29yLmNyZWF0ZShnZXRSZXNvdXJjZXMoZWxlbWVudHMpLCBlbGVtZW50cyk7Ci0vLwkJCQkKLS8vCQkJCVNoZWxsIHBhcmVudCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLS8vCQkJCU1vdmVSZWZhY3RvcmluZyByZWZhY3RvcmluZyA9IG5ldyBNb3ZlUmVmYWN0b3JpbmcocHJvY2Vzc29yKTsKLS8vCi0vLwkJCQlSZWZhY3RvcmluZ1dpemFyZCB3aXphcmQgPSBjcmVhdGVXaXphcmQocmVmYWN0b3JpbmcpOwotLy8KLS8vCQkJCS8qCi0vLwkJCQkgKiBXZSB3YW50IHRvIGdldCB0aGUgc2hlbGwgZnJvbSB0aGUgcmVmYWN0b3JpbmcgZGlhbG9nIGJ1dAotLy8JCQkJICogaXQncyBub3Qga25vd24gYXQgdGhpcyBwb2ludCwgc28gd2UgcGFzcyB0aGUgd2l6YXJkIGFuZAotLy8JCQkJICogdGhlbiwgb25jZSB0aGUgZGlhbG9nIGlzIG9wZW4sIHdlIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gaXRzCi0vLwkJCQkgKiBzaGVsbC4KLS8vCQkJCSAqLwotLy8KLS8vCQkJCXByb2Nlc3Nvci5zZXRDcmVhdGVUYXJnZXRRdWVyaWVzKG5ldyBDcmVhdGVUYXJnZXRRdWVyaWVzKHdpemFyZCkpOwotLy8JCQkJcHJvY2Vzc29yLnNldFJlb3JnUXVlcmllcyhuZXcgUmVvcmdRdWVyaWVzKHdpemFyZCkpOwotLy8JCQkJLy8gU3RyaW5nIG9wZW5SZWZhY3RvcmluZ1dpek1zZyA9Ci0vLwkJCQkvLyBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiT3BlblJlZmFjdG9yaW5nV2l6YXJkQWN0aW9uLnJlZmFjdG9yaW5nIik7Ci0vLwkJCQkvLyAvLyROT04tTkxTLTEkCi0vLwkJCQlTdHJpbmcgb3BlblJlZmFjdG9yaW5nV2l6TXNnID0gSlNQVUlNZXNzYWdlcy5Nb3ZlRWxlbWVudFdpemFyZDsgLy8gIk1vdmUKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0aGUKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBzZWxlY3RlZAotLy8JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGVsZW1lbnRzIjsKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0vLwkJCQluZXcgUmVmYWN0b3JpbmdTdGFydGVyKCkuYWN0aXZhdGUocmVmYWN0b3JpbmcsIHdpemFyZCwgcGFyZW50LCBvcGVuUmVmYWN0b3JpbmdXaXpNc2csIHRydWUpOwotLy8KLS8vCQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0vLwotLy8JCQl9Ci0vLwkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotLy8JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLS8vCQkJfQotLy8JCX0KLS8vCQllbHNlIHsKLS8vCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5kaXNwbGF5RXJyb3JNZXNzYWdlKEpTUFVJTWVzc2FnZXMuSlNQTW92ZUVsZW1lbnRBY3Rpb25fMCk7IC8vJE5PTi1OTFMtMSQKLS8vCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvUmVuYW1lRWxlbWVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL1JlbmFtZUVsZW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMDU0YzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvUmVuYW1lRWxlbWVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5yZWZhY3RvcmluZy5SZW5hbWVTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLlBsYXRmb3JtU3RhdHVzTGluZVV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBSZW5hbWVFbGVtZW50SGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0JcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yOwotCQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWZFZGl0b3IgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVFZGl0b3IoZXZlbnQpOwotCQkKLQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBnZXRTZWxlY3RlZEVsZW1lbnQoKTsKLQkJaWYoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlSZW5hbWVTdXBwb3J0IHJlbmFtZVN1cHBvcnQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzd2l0Y2goZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgSUphdmFFbGVtZW50LlRZUEU6Ci0JCQkJCQlyZW5hbWVTdXBwb3J0PSBSZW5hbWVTdXBwb3J0LmNyZWF0ZSgoSVR5cGUpZWxlbWVudCwgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLCBSZW5hbWVTdXBwb3J0LlVQREFURV9SRUZFUkVOQ0VTKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElKYXZhRWxlbWVudC5NRVRIT0Q6Ci0JCQkJCQlyZW5hbWVTdXBwb3J0PSBSZW5hbWVTdXBwb3J0LmNyZWF0ZSgoSU1ldGhvZCllbGVtZW50LCBlbGVtZW50LmdldEVsZW1lbnROYW1lKCksIFJlbmFtZVN1cHBvcnQuVVBEQVRFX1JFRkVSRU5DRVMpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQ6Ci0JCQkJCQlyZW5hbWVTdXBwb3J0PSBSZW5hbWVTdXBwb3J0LmNyZWF0ZSgoSVBhY2thZ2VGcmFnbWVudCllbGVtZW50LCBlbGVtZW50LmdldEVsZW1lbnROYW1lKCksIFJlbmFtZVN1cHBvcnQuVVBEQVRFX1JFRkVSRU5DRVMpOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmKHJlbmFtZVN1cHBvcnQgIT0gbnVsbCkgewotCQkJCQlyZW5hbWVTdXBwb3J0Lm9wZW5EaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpKTsKLQkJCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5jbGVhclN0YXR1c0xpbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQllbHNlICB7Ci0JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlFcnJvck1lc3NhZ2UoSlNQVUlNZXNzYWdlcy5KU1BSZW5hbWVFbGVtZW50QWN0aW9uXzApOyAvLyROT04tTkxTLTEkCi0JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmFkZE9uZVRpbWVDbGVhckxpc3RlbmVyKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIElKYXZhRWxlbWVudCBnZXRTZWxlY3RlZEVsZW1lbnQoKSB7Ci0JCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJaWYgKGZFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBKU1BKYXZhU2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKChJVGV4dEVkaXRvcilmRWRpdG9yKTsKLQkJCWlmIChlbGVtZW50cy5sZW5ndGggPT0gMSkKLQkJCQllbGVtZW50ID0gZWxlbWVudHNbMF07Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvQmFzaWNKU1BTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9CYXNpY0pTUFNlYXJjaFJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWNiN2JlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9CYXNpY0pTUFNlYXJjaFJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGU7Ci0KLS8qKgotICogQWNjZXB0cyBtYXRjaGVzIGZyb20gSlNQU2VhcmNoU3VwcG9ydC5zZWFyY2goLi4uKSByZXF1ZXN0LgotICogQWRhcHRzIHRoZSByZXN1bHRzIGZyb20gamF2YSB0byBKU1AgYW5kIGRpc3BsYXlzIGluIHRoZSBTZWFyY2hSZXN1bHRWaWV3LgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgQmFzaWNKU1BTZWFyY2hSZXF1ZXN0b3IgZXh0ZW5kcyBTZWFyY2hSZXF1ZXN0b3IgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHNlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBNYXBzIGphdmEgc2VhcmNoIGNvb3JkaW5hdGVzIHRvIGNvcnJlc3BvbmRpbmcgSlNQIGNvb3JkaW5hdGVzLgotCSAqIEFkZHMgdGhlIG1hdGNoZXMgdG8gdGhlIFNlYXJjaCBSZXN1bHRzIHZpZXcuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yI2FjY2VwdFNlYXJjaE1hdGNoKG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCBtYXRjaCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmKEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0JCQkJCi0JCVN0cmluZyBtYXRjaERvY3VtZW50UGF0aCA9IG1hdGNoLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQlTZWFyY2hEb2N1bWVudCBzZWFyY2hEb2MgPSBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuZ2V0U2VhcmNoRG9jdW1lbnQobWF0Y2hEb2N1bWVudFBhdGgpOwotCQkKLQkJaWYgKHNlYXJjaERvYyAhPSBudWxsICYmIHNlYXJjaERvYyBpbnN0YW5jZW9mIEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKSB7Ci0JCQlKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBqYXZhU2VhcmNoRG9jID0gKEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlKXNlYXJjaERvYzsKLQkJCWludCBqc3BTdGFydCA9IGphdmFTZWFyY2hEb2MuZ2V0SnNwT2Zmc2V0KG1hdGNoLmdldE9mZnNldCgpKTsKLQkJCWludCBqc3BFbmQgPSBqYXZhU2VhcmNoRG9jLmdldEpzcE9mZnNldChtYXRjaC5nZXRPZmZzZXQoKSArIG1hdGNoLmdldExlbmd0aCgpKTsKLQotCQkJSlNQVHJhbnNsYXRpb24gdHJhbnMgPSBqYXZhU2VhcmNoRG9jLmdldEpzcFRyYW5zbGF0aW9uKCk7Ci0JCQlTdHJpbmcganNwVGV4dCA9IHRyYW5zLmdldEpzcFRleHQoKTsKLQkJCVN0cmluZyBqYXZhVGV4dCA9IGphdmFTZWFyY2hEb2MuZ2V0SmF2YVRleHQoKTsKLQotCQkJaWYgKERFQlVHKSAKLQkJCQlkaXNwbGF5RGVidWdJbmZvKG1hdGNoLCBqc3BTdGFydCwganNwRW5kLCBqc3BUZXh0LCBqYXZhVGV4dCk7Ci0JCQotCQkJaWYgKGpzcFN0YXJ0ID4gLTEgJiYganNwRW5kID4gLTEpCi0JCQkJYWRkU2VhcmNoTWF0Y2gobmV3IERvY3VtZW50KHRyYW5zLmdldEpzcFRleHQoKSksIGphdmFTZWFyY2hEb2MuZ2V0RmlsZSgpLCBqc3BTdGFydCwganNwRW5kLCBqc3BUZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZWFyY2hEb2MKLQkgKiBAcGFyYW0ganNwU3RhcnQKLQkgKiBAcGFyYW0ganNwRW5kCi0JICogQHBhcmFtIGpzcFRyYW5zbGF0aW9uCi0JICogQHBhcmFtIGpzcFRleHQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZWFyY2hNYXRjaChJRG9jdW1lbnQganNwRG9jdW1lbnQsIElGaWxlIGpzcEZpbGUsIGludCBqc3BTdGFydCwgaW50IGpzcEVuZCwgU3RyaW5nIGpzcFRleHQpIHsKLQkJLy8gaW1wbGVtZW50IGluIHN1YmNsYXNzCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yI2JlZ2luUmVwb3J0aW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpblJlcG9ydGluZygpIHsKLQotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUCBTZWFyY2ggcmVxdWVzdG9yOiBiZWdpblJlcG9ydGluZygpIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3IjZW5kUmVwb3J0aW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRSZXBvcnRpbmcoKSB7Ci0KLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1AgU2VhcmNoIHJlcXVlc3RvcjogZW5kUmVwb3J0aW5nKCkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvciNlbnRlclBhcnRpY2lwYW50KG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbnRlclBhcnRpY2lwYW50KFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50KSB7Ci0KLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1AgU2VhcmNoIHJlcXVlc3RvcjogZW50ZXJQYXJ0aWNpcGFudCgpIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3IjZXhpdFBhcnRpY2lwYW50KG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGl0UGFydGljaXBhbnQoU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQpIHsKLQotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUCBTZWFyY2ggcmVxdWVzdG9yOiBleGl0UGFydGljaXBhbnQoKSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogRm9yIGRlYnVnLgotCSAqIEBwYXJhbSBvcmlnTWF0Y2gKLQkgKiBAcGFyYW0ganNwU3RhcnQKLQkgKiBAcGFyYW0ganNwRW5kCi0JICogQHBhcmFtIGpzcFRleHQKLQkgKiBAcGFyYW0gamF2YVRleHQKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzcGxheURlYnVnSW5mbyhTZWFyY2hNYXRjaCBvcmlnTWF0Y2gsIGludCBqc3BTdGFydCwgaW50IGpzcEVuZCwgU3RyaW5nIGpzcFRleHQsIFN0cmluZyBqYXZhVGV4dCkgewotCi0JCWlmIChvcmlnTWF0Y2ggPT0gbnVsbCB8fCBqc3BTdGFydCA9PSAtMSB8fCBqc3BFbmQgPT0gLTEgfHwganNwRW5kIDwganNwU3RhcnQgfHwganNwVGV4dCA9PSBudWxsIHx8IGphdmFUZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKCIrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJhY2NlcHQgcG9zc2libGUgbWF0Y2ggW2pzcERvYzogIiArIG9yaWdNYXRjaC5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpICsgIiAiICsgb3JpZ01hdGNoLmdldE9mZnNldCgpICsgIjoiICsgb3JpZ01hdGNoLmdldE9mZnNldCgpICsgb3JpZ01hdGNoLmdldExlbmd0aCgpICsgIl0/Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJtYXRjaCBpbmZvOiIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigidGhlIGphdmEgdGV4dCBpczoiICsgamF2YVRleHQuc3Vic3RyaW5nKG9yaWdNYXRjaC5nZXRPZmZzZXQoKSwgb3JpZ01hdGNoLmdldE9mZnNldCgpICsgb3JpZ01hdGNoLmdldExlbmd0aCgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJqYXZhIHNlYXJjaCBtYXRjaCB0cmFuc2xhdGVzIHRvIGpzcCBjb29yZHMgW3N0YXJ0OiAiICsganNwU3RhcnQgKyAiIGVuZDoiICsganNwRW5kICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJU3lzdGVtLm91dC5wcmludGxuKCIgdGhlIGpzcCB0ZXh0IGlzOiIgKyBqc3BUZXh0LnN1YnN0cmluZyhqc3BTdGFydCwganNwRW5kKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWFlZWMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc2VhcmNoLkhUTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogU2V0cyB1cCBGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSBmb3IganNwIGZpbmQgb2NjdXJyZW5jZXMgcHJvY2Vzc29ycwotICovCi1wdWJsaWMgY2xhc3MgSlNQRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBMaXN0IGZQcm9jZXNzb3JzOwotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UHJvY2Vzc29ycygpIHsKLQkJaWYgKGZQcm9jZXNzb3JzID09IG51bGwpIHsKLQkJCWZQcm9jZXNzb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciBodG1sUHJvY2Vzc29yID0gbmV3IEhUTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IoKTsKLQkJCWZQcm9jZXNzb3JzLmFkZChodG1sUHJvY2Vzc29yKTsKLS8vCQkJIHRlbXBvcmFyeSwgd29ya2Fyb3VuZCB0byBkaXNhYmxlIGZ1bmN0aW9uLCBzaW5jZSB1c2luZyB0aGUgZnVuY3Rpb24gCi0vLwkJCSBjYW4gZWFzaWx5IGNhdXNlIGRlYWRsb2NrIHRvIG9jY3VyLgotLy8JCQkJCSBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMzY2MgotLy8JCQlKU1BGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IganNwUHJvY2Vzc29yID0gbmV3IEpTUEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcigpOwotLy8JCQlmUHJvY2Vzc29ycy5hZGQoanNwUHJvY2Vzc29yKTsKLQkJfQotCQlyZXR1cm4gZlByb2Nlc3NvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGU4YzNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5JSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXh0LklKU1BQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5GaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLS8qKgotICogQ29uZmlndXJlcyBhIEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciB3aXRoIEpTUCBwYXJ0aXRpb25zIGFuZCByZWdpb25zCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZXh0ZW5kcyBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgewotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFBhcnRpdGlvblR5cGVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0lKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxULCBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UmVnaW9uVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117RE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhULCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVH07Ci0JfQotCi0JcHJvdGVjdGVkIElTZWFyY2hRdWVyeSBnZXRTZWFyY2hRdWVyeShJRmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcmVnaW9uVGV4dCwgU3RyaW5nIHJlZ2lvblR5cGUsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBKU1BTZWFyY2hRdWVyeShmaWxlLCBnZXRKYXZhRWxlbWVudChkb2N1bWVudCwgdGV4dFNlbGVjdGlvbikpOwotCX0KLQotCXByaXZhdGUgSUphdmFFbGVtZW50IGdldEphdmFFbGVtZW50KElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGdldEphdmFFbGVtZW50c0ZvckN1cnJlbnRTZWxlY3Rpb24oZG9jdW1lbnQsIHRleHRTZWxlY3Rpb24pOwotCQlyZXR1cm4gZWxlbWVudHMubGVuZ3RoID4gMCA/IGVsZW1lbnRzWzBdIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB1c2VzIEpTUFRyYW5zbGF0aW9uIHRvIGdldCBjdXJyZW50bHkgc2VsZWN0ZWQgSmF2YSBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIGN1cnJlbnRseSBzZWxlY3RlZCBJSmF2YUVsZW1lbnRzCi0JICovCi0JcHJpdmF0ZSBJSmF2YUVsZW1lbnRbXSBnZXRKYXZhRWxlbWVudHNGb3JDdXJyZW50U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFswXTsKLQkJLy8gZ2V0IEpTUCB0cmFuc2xhdGlvbiBvYmplY3QgZm9yIHRoaXMgdmlld2VyJ3MgZG9jdW1lbnQKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQl0cnkgewotCQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCUpTUFRyYW5zbGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKEpTUFRyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpTUFRyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCUpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbigpOwotCi0JCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDIyMTEKLQkJCQkJZWxlbWVudHMgPSB0cmFuc2xhdGlvbi5nZXRFbGVtZW50c0Zyb21Kc3BSYW5nZShzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUE9jY3VycmVuY2VzU2VhcmNoUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZDRmOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUE9jY3VycmVuY2VzU2VhcmNoUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLk9jY3VycmVuY2VzU2VhcmNoUmVzdWx0OwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdCBleHRlbmRzIE9jY3VycmVuY2VzU2VhcmNoUmVzdWx0IHsKLQkKLQlwdWJsaWMgSlNQT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQoSVNlYXJjaFF1ZXJ5IHF1ZXJ5KSB7Ci0JCXN1cGVyKHF1ZXJ5KTsKLQl9Ci0JCi0JcHVibGljIE1hdGNoW10gZ2V0TWF0Y2hlcygpIHsKLQkJcmV0dXJuICgoSlNQU2VhcmNoUXVlcnkpZ2V0UXVlcnkoKSkuZ2V0TWF0Y2hlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmOGNhMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkJhc2ljU2VhcmNoUXVlcnk7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgPGNvZGU+SVNlYXJjaFF1ZXJ5PC9jb2RlPiBmb3IgPGNvZGU+SUphdmFFbGVtZW50PC9jb2RlPnMgaW4gSlNQIGZpbGVzLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQU2VhcmNoUXVlcnkgZXh0ZW5kcyBCYXNpY1NlYXJjaFF1ZXJ5IHsKLQkKLQkvKiogdGhlIElKYXZhRWxlbWVudCB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZmlsZSAqKi8KLQlwcml2YXRlIElKYXZhRWxlbWVudCBmRWxlbWVudCA9IG51bGw7Ci0JCi0JcHVibGljIEpTUFNlYXJjaFF1ZXJ5KElGaWxlIGZpbGUsIElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKGZpbGUpOwotCQl0aGlzLmZFbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0JCi0JcHVibGljIElKYXZhRWxlbWVudCBnZXRKYXZhRWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZkVsZW1lbnQ7Ci0JfQotCQotCS8vIGZvciBhY2Nlc3MgYnkgaW5uZXIgY2xhc3MKLQlwdWJsaWMgSlNQU2VhcmNoUXVlcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyBkb1F1ZXJ5KCkgewotCQkKLQkJY2xlYXJNYXRjaGVzKCk7Ci0JCQotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCXRyeSB7Ci0JCQlKU1BTZWFyY2hTdXBwb3J0IHN1cHBvcnQgPSBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCQkvLyBpbmRleCB0aGUgZmlsZQotCQkJU2VhcmNoRG9jdW1lbnQgZGVsZWdhdGUgPSAgc3VwcG9ydC5hZGRKc3BGaWxlKGdldEZpbGUoKSk7Ci0JCQkKLQkJCVN0cmluZyBzY29wZVBhdGggPSBkZWxlZ2F0ZS5nZXRQYXRoKCk7Ci0JCQlKU1BTZWFyY2hTY29wZSBzaW5nbGVGaWxlU2NvcGUgPSBuZXcgSlNQU2VhcmNoU2NvcGUobmV3IFN0cmluZ1tde2dldEZpbGUoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHNjb3BlUGF0aH0pOwotCQkJCi0JCQkvLyBwZXJmb3JtIGEgc2VhcmNocwotCQkJLy8gYnkgcGFzc2luZyBpbiB0aGlzIGpzcCBzZWFyY2ggcXVlcnksIHJlcXVzdG9yIGNhbiBhZGQgbWF0Y2hlcwotCQkJc3VwcG9ydC5zZWFyY2hSdW5uYWJsZShnZXRKYXZhRWxlbWVudCgpLCBzaW5nbGVGaWxlU2NvcGUsIG5ldyBKU1BTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yKGdldEluc3RhbmNlKCkpKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aSIsIElTdGF0dXMuT0ssICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldExhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlTdHJpbmdbXSBhcmdzID0ge2dldFNlYXJjaFRleHQoKSwgZ2V0T2NjdXJyZW5jZXNDb3VudFRleHQoKSwgZ2V0RmlsZW5hbWUoKX07Ci0JCXJldHVybiBOTFMuYmluZChKU1BVSU1lc3NhZ2VzLk9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMCwgYXJncyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZW5hbWUoKSB7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IEpTUFVJTWVzc2FnZXMuT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8yOwotCQlpZihnZXRGaWxlKCkgIT0gbnVsbCkKLQkJCWZpbGVuYW1lID0gZ2V0RmlsZSgpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGZpbGVuYW1lOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRPY2N1cnJlbmNlc0NvdW50VGV4dCgpIHsKLQkJU3RyaW5nIGNvdW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcGFfVE9ETyBtYWtlIGR5bmFtaWMKLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VhcmNoVGV4dCgpIHsKLQkJcmV0dXJuIGZFbGVtZW50LmdldEVsZW1lbnROYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhblJlcnVuKCkgewotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeSNjYW5SdW5JbkJhY2tncm91bmQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJ1bkluQmFja2dyb3VuZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldFNlYXJjaFJlc3VsdCgpCi0JICovCi0JcHVibGljIElTZWFyY2hSZXN1bHQgZ2V0U2VhcmNoUmVzdWx0KCkgewotCQkKLQkJcmV0dXJuIG5ldyBKU1BPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdCh0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNiNGFlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuc2VhcmNoLklTZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuTmV3U2VhcmNoVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQU2VhcmNoUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNKU1BTZWFyY2hSZXF1ZXN0b3IgewotCQotCXByaXZhdGUgSVNlYXJjaFJlcXVlc3RvciBmSmF2YVJlcXVlc3RvciA9IG51bGw7Ci0JCi0JcHVibGljIEpTUFNlYXJjaFJlcXVlc3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIEpTUFNlYXJjaFJlcXVlc3RvcihJU2VhcmNoUmVxdWVzdG9yIGphdmFSZXF1ZXN0b3IpIHsKLQkJLy8gbmVlZCB0byByZXBvcnQgbWF0Y2hlcyB0byBqYXZhUmVxdWVzdG9yCi0JCXRoaXMuZkphdmFSZXF1ZXN0b3IgPSBqYXZhUmVxdWVzdG9yOwotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIGFkZFNlYXJjaE1hdGNoKElEb2N1bWVudCBqc3BEb2N1bWVudCwgSUZpbGUganNwRmlsZSwgaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kLCBTdHJpbmcganNwVGV4dCkgewotCQkKLQkJaWYoIWpzcEZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0KLQkJaW50IGxpbmVOdW1iZXIgPSAtMTsKLQkJdHJ5IHsKLQkJCWxpbmVOdW1iZXIgPSBqc3BEb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoanNwU3RhcnQpOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJvZmZzZXQ6ICIgKyBJbnRlZ2VyLnRvU3RyaW5nKGpzcFN0YXJ0KSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljcmVhdGVTZWFyY2hNYXJrZXIoanNwRmlsZSwganNwU3RhcnQsIGpzcEVuZCwgbGluZU51bWJlcik7Ci0JCQotCQlpZih0aGlzLmZKYXZhUmVxdWVzdG9yICE9IG51bGwpIHsKLQkJCU1hdGNoIG1hdGNoID0gbmV3IE1hdGNoKGpzcEZpbGUsIGpzcFN0YXJ0LCBqc3BFbmQgLSBqc3BTdGFydCk7Ci0JCQl0aGlzLmZKYXZhUmVxdWVzdG9yLnJlcG9ydE1hdGNoKG1hdGNoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBqc3BGaWxlCi0JICogQHBhcmFtIGpzcFN0YXJ0Ci0JICogQHBhcmFtIGpzcEVuZAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWFyY2hNYXJrZXIoSUZpbGUganNwRmlsZSwgaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kLCBpbnQgbGluZU51bWJlcikgewotCQkKLQkJdHJ5IHsKLQkJCUlNYXJrZXIgbWFya2VyID0ganNwRmlsZS5jcmVhdGVNYXJrZXIoTmV3U2VhcmNoVUkuU0VBUkNIX01BUktFUik7Ci0JCQlIYXNoTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCg0KTsKLQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgbmV3IEludGVnZXIoanNwU3RhcnQpKTsKLQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9FTkQsIG5ldyBJbnRlZ2VyKGpzcEVuZCkpOwotCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5MSU5FX05VTUJFUiwgbmV3IEludGVnZXIobGluZU51bWJlcikpOwotCQkJbWFya2VyLnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0JCQkKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNpbmdsZUZpbGVTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMDc5MmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNpbmdsZUZpbGVTZWFyY2hSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiA8cD4KLSAqIFNwZWNpYWwgcmVxdWVzdG9yIHRoYXQgYWRkcyBzZWFyY2ggcmVzdWx0cyBmb3Igc2luZ2xlIGZpbGUgc2VhcmNoCi0gKiAoVXNlZCBmb3IgSlNQRmluZE9jY3VycmVuY2VzIGFjdGlvbikuCi0gKiBJdCBncm91cHMgZWFjaCBtYXRjaCBhcyBpdCdzIG93biByZXN1bHQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNKU1BTZWFyY2hSZXF1ZXN0b3IgewotCi0JcHJpdmF0ZSBKU1BTZWFyY2hRdWVyeSBmUXVlcnkgPSBudWxsOwotCQotCXB1YmxpYyBKU1BTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yKEpTUFNlYXJjaFF1ZXJ5IHF1ZXJ5KSB7Ci0JCXRoaXMuZlF1ZXJ5ID0gcXVlcnk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFNlYXJjaE1hdGNoKElEb2N1bWVudCBqc3BEb2N1bWVudCwgSUZpbGUganNwRmlsZSwgaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kLCBTdHJpbmcganNwVGV4dCkgewotCQkvLyBhZGQgbWF0Y2ggdG8gSlNQIHF1ZXJ5Li4uCi0JCXRoaXMuZlF1ZXJ5LmFkZE1hdGNoKGpzcERvY3VtZW50LCBqc3BTdGFydCwganNwRW5kKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvdWkvSlNQTWF0Y2hQcmVzZW50YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC91aS9KU1BNYXRjaFByZXNlbnRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGIxYTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC91aS9KU1BNYXRjaFByZXNlbnRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEuc2VhcmNoLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5JTWF0Y2hQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5CYXNpY1NlYXJjaExhYmVsUHJvdmlkZXI7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUE1hdGNoUHJlc2VudGF0aW9uIGltcGxlbWVudHMgSU1hdGNoUHJlc2VudGF0aW9uIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5JTWF0Y2hQcmVzZW50YXRpb24jY3JlYXRlTGFiZWxQcm92aWRlcigpCi0JICovCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGNyZWF0ZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgQmFzaWNTZWFyY2hMYWJlbFByb3ZpZGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5JTWF0Y2hQcmVzZW50YXRpb24jc2hvd01hdGNoKG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoLCBpbnQsIGludCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93TWF0Y2goTWF0Y2ggbWF0Y2gsIGludCBjdXJyZW50T2Zmc2V0LCBpbnQgY3VycmVudExlbmd0aCwgYm9vbGVhbiBhY3RpdmF0ZSkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJLy8gcGFfVE9ETyBpbXBsZW1lbnQKLS8vCQlPYmplY3Qgb2JqID0gbWF0Y2guZ2V0RWxlbWVudCgpOwotCQkvLyBzaG93IG1hdGNoIGluIEpTUCBlZGl0b3IKLQkJaWYoYWN0aXZhdGUpIHsKLQkJCS8vIHVzZSBzaG93IGluIHRhcmdldD8KLQkJfQotCQllbHNlIHsKLQkJCS8vIGp1c3Qgc2VsZWN0Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvdWkvSlNQUXVlcnlQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL3VpL0pTUFF1ZXJ5UGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1N2VlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvdWkvSlNQUXVlcnlQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2gudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5FbGVtZW50UXVlcnlTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guSU1hdGNoUHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guSVF1ZXJ5UGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5JU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guUGF0dGVyblF1ZXJ5U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuc2VhcmNoLlF1ZXJ5U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hSZXF1ZXN0b3I7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkgCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BRdWVyeVBhcnRpY2lwYW50IGltcGxlbWVudHMgSVF1ZXJ5UGFydGljaXBhbnQgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHNlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guSVF1ZXJ5UGFydGljaXBhbnQjc2VhcmNoKG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guSVNlYXJjaFJlcXVlc3Rvciwgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5RdWVyeVNwZWNpZmljYXRpb24sIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlYXJjaChJU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgUXVlcnlTcGVjaWZpY2F0aW9uIHF1ZXJ5U3BlY2lmaWNhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQkvL2luZGV4SWZOZWVkZWQoKTsKLQkJCi0JCS8vIGRvIHNlYXJjaCBiYXNlZCBvbiB0aGUgcGFydGljdWxhciBKYXZhIHF1ZXJ5Ci0JCWlmKHF1ZXJ5U3BlY2lmaWNhdGlvbiBpbnN0YW5jZW9mIEVsZW1lbnRRdWVyeVNwZWNpZmljYXRpb24pIHsKLQkJCS8vIGVsZW1lbnQgc2VhcmNoIChlZy4gZnJvbSBnbG9iYWwgZmluZCByZWZlcmVuY2VzIGluIEphdmEgZmlsZSkKLQkJCUVsZW1lbnRRdWVyeVNwZWNpZmljYXRpb24gZWxlbWVudFF1ZXJ5ID0gKEVsZW1lbnRRdWVyeVNwZWNpZmljYXRpb24pcXVlcnlTcGVjaWZpY2F0aW9uOwotCQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50UXVlcnkuZ2V0RWxlbWVudCgpOwotCQkJCi0JCQlpZihERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUCBRdWVyeSBQYXJ0aWNpcGFudCBzZWFyY2hpbmcgb24gRUxFTUVOVDogIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCVNlYXJjaFJlcXVlc3RvciBqc3BSZXF1ZXN0b3IgPSBuZXcgSlNQU2VhcmNoUmVxdWVzdG9yKHJlcXVlc3Rvcik7Ci0JCQkKLQkJCS8vIHBhX1RPRE8gbmVlZCB0byBhZGFwdCBKYXZhU2VhcmNoU2NvcGUgdG8gYSBKU1BTZWFyY2hTY29wZQotCQkJSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLnNlYXJjaChlbGVtZW50LCBuZXcgSlNQU2VhcmNoU2NvcGUoKSwganNwUmVxdWVzdG9yKTsKLQkJCQotCQl9Ci0JCWVsc2UgaWYocXVlcnlTcGVjaWZpY2F0aW9uIGluc3RhbmNlb2YgUGF0dGVyblF1ZXJ5U3BlY2lmaWNhdGlvbikgewotCQkJCi0JCQkvLyBwYXR0ZXJuIHNlYXJjaCAoZWcuIGZyb20gSmF2YSBzZWFyY2ggcGFnZSkKLQkJCVBhdHRlcm5RdWVyeVNwZWNpZmljYXRpb24gcGF0dGVyblF1ZXJ5ID0gKFBhdHRlcm5RdWVyeVNwZWNpZmljYXRpb24pcXVlcnlTcGVjaWZpY2F0aW9uOwotCQkJU3RyaW5nIHBhdHRlcm4gPSBwYXR0ZXJuUXVlcnkuZ2V0UGF0dGVybigpOwotCQkJCi0JCQlpZihERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUCBRdWVyeSBQYXJ0aWNpcGFudCBzZWFyY2hpbmcgb24gUEFUVEVSTjogIiArIHBhdHRlcm4pOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCVNlYXJjaFJlcXVlc3RvciBqc3BSZXF1ZXN0b3IgPSBuZXcgSlNQU2VhcmNoUmVxdWVzdG9yKHJlcXVlc3Rvcik7Ci0JCQkKLQkJCUpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5zZWFyY2gocGF0dGVybiwgCi0JCQkJCQkJCQkJCQkJbmV3IEpTUFNlYXJjaFNjb3BlKCksIAotCQkJCQkJCQkJCQkJCXBhdHRlcm5RdWVyeS5nZXRTZWFyY2hGb3IoKSwgCi0JCQkJCQkJCQkJCQkJcGF0dGVyblF1ZXJ5LmdldExpbWl0VG8oKSwgCi0JCQkJCQkJCQkJCQkJU2VhcmNoUGF0dGVybi5SX1BBVFRFUk5fTUFUQ0gsIAotCQkJCQkJCQkJCQkJCWZhbHNlLCAKLQkJCQkJCQkJCQkJCQlqc3BSZXF1ZXN0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkuc2VhcmNoLklRdWVyeVBhcnRpY2lwYW50I2VzdGltYXRlVGlja3Mob3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5RdWVyeVNwZWNpZmljYXRpb24pCi0JICovCi0JcHVibGljIGludCBlc3RpbWF0ZVRpY2tzKFF1ZXJ5U3BlY2lmaWNhdGlvbiBkYXRhKSB7Ci0JCS8vIHBhX1RPRE8gdXNlIHByb2plY3QgZmlsZSBjb3VudGVyIGZyb20gSlNQU2VhcmNoU3VwcG9ydC4uLgotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guSVF1ZXJ5UGFydGljaXBhbnQjZ2V0VUlQYXJ0aWNpcGFudCgpCi0JICovCi0JcHVibGljIElNYXRjaFByZXNlbnRhdGlvbiBnZXRVSVBhcnRpY2lwYW50KCkgewotCQlyZXR1cm4gbmV3IEpTUE1hdGNoUHJlc2VudGF0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlNQVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGU5YjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0KLS8qKgotICogU2V0cyBkZWZhdWx0IHZhbHVlcyBmb3IgSlNQIFVJIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BVSVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCUNvbG9yUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFRoZW1lTWFuYWdlcigpLmdldEN1cnJlbnRUaGVtZSgpLmdldENvbG9yUmVnaXN0cnkoKTsKLQotCQkvLyBzZXR0aW5nIHRoZSBzYW1lIGFzIEhUTUwKLQkJc3RvcmUuc2V0RGVmYXVsdChKU1BVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KEpTUFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFLCAiPD0iKTsvLyROT04tTkxTLTEkCi0KLQkJLy8gSlNQIFN0eWxlIFByZWZlcmVuY2VzCi0JCVN0cmluZyBOT0JBQ0tHUk9VTkRCT0xEID0gIiB8IG51bGwgfCBmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIEpVU1RJVEFMSUMgPSAiIHwgbnVsbCB8IGZhbHNlIHwgdHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FLCAxMjcsIDAsIDEyNykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSwgNDIsIDAsIDI1NSkgKyBKVVNUSVRBTElDOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gIm51bGwiICsgTk9CQUNLR1JPVU5EQk9MRDsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHNwZWNpZmllZCB2YWx1ZSBpcyBibGFjazsgbGVhdmluZyBhcyB3aWRnZXQgZGVmYXVsdAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUywgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUiwgNjMsIDk1LCAxOTEpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIsIHN0eWxlVmFsdWUpOwotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCwgNjMsIDk1LCAxOTEpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhULCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIsIDAsIDEyOCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUsIDYzLCAxMjcsIDEyNykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSLCAxOTEsIDk1LCA2MykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gIm51bGwiICsgTk9CQUNLR1JPVU5EQk9MRDsgLy8kTk9OLU5MUy0xJAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0pTUC5KU1BfQ09OVEVOVCwgc3R5bGVWYWx1ZSk7Ci0JCQotCQkvLyBzZXQgZGVmYXVsdCBuZXcganNwIGZpbGUgdGVtcGxhdGUgdG8gdXNlIGluIG5ldyBmaWxlIHdpemFyZAotCQkvKgotCQkgKiBOZWVkIHRvIGZpbmQgdGVtcGxhdGUgbmFtZSB0aGF0IGdvZXMgd2l0aCBkZWZhdWx0IHRlbXBsYXRlIGlkIChuYW1lCi0JCSAqIG1heSBjaGFuZ2UgZm9yIGRpZmZlcm50IGxhbmd1YWdlKQotCQkgKi8KLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlU3RvcmUoKS5maW5kVGVtcGxhdGVCeUlkKCJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3BodG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpCi0JCQl0ZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSlNQVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSwgdGVtcGxhdGVOYW1lKTsKLQkJCi0JCXN0b3JlLnNldERlZmF1bHQoSlNQVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0VMX0JSQUNFUywgdHJ1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSlNQVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX1NDUklQVExFVFMsIHRydWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0pTUFVJUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlNQVUlQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2N2QxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlNQVUlQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIGtleXMgZm9yIEpTUCBVSQotICovCi1wdWJsaWMgY2xhc3MgSlNQVUlQcmVmZXJlbmNlTmFtZXMgewotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGNvbnRyb2xzIGlmIGNvZGUgYXNzaXN0IGdldHMgYXV0byBhY3RpdmF0ZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19QUk9QT1NFID0gZ2V0QXV0b1Byb3Bvc2VLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBdXRvUHJvcG9zZUtleSgpIHsKLQkJcmV0dXJuICJhdXRvUHJvcG9zZSI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGhvbGRzIHRoZSBjaGFyYWN0ZXJzIHRoYXQgYXV0byBhY3RpdmF0ZSBjb2RlCi0JICogYXNzaXN0LgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4gQWxsIGNoYXJhY3RlcnMgdGhhdCB0cmlnZ2VyCi0JICogYXV0byBjb2RlIGFzc2lzdC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19QUk9QT1NFX0NPREUgPSBnZXRBdXRvUHJvcG9zZUNvZGVLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBdXRvUHJvcG9zZUNvZGVLZXkoKSB7Ci0JCXJldHVybiAiYXV0b1Byb3Bvc2VDb2RlIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSBjdXN0b21pemVkIHRlbXBsYXRlcy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFU19LRVkgPSBnZXRUZW1wbGF0ZXNLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUZW1wbGF0ZXNLZXkoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jdXN0b21fdGVtcGxhdGVzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgdGhlIGxhc3QgdGVtcGxhdGUgbmFtZSB1c2VkIGluIG5ldyBKU1AgZmlsZSB3aXphcmQuCi0JICogVGVtcGxhdGUgbmFtZSBpcyBzdG9yZWQgaW5zdGVhZCBvZiB0ZW1wbGF0ZSBpZCBiZWNhdXNlIHVzZXItY3JlYXRlZAotCSAqIHRlbXBsYXRlcyBkbyBub3QgaGF2ZSB0ZW1wbGF0ZSBpZHMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRklMRV9URU1QTEFURV9OQU1FID0gIm5ld0ZpbGVUZW1wbGF0ZU5hbWUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSB0aGUgb3B0aW9uIGZvciBhdXRvLWNvbXBsZXRpbmcgRUwgYnJhY2VzIGFmdGVyIGVudGVyaW5nCi0JICogPGNvZGU+JHs8L2NvZGU+Ci0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQSU5HX0NPTVBMRVRFX0VMX0JSQUNFUyA9ICJ0eXBpbmdDb21wbGV0ZUVsQnJhY2VzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgdGhlIG9wdGlvbiBmb3IgYXV0by1jb21wbGV0aW5nIHNjcmlwdGxldHMgYWZ0ZXIgZW50ZXJpbmcKLQkgKiA8Y29kZT4mbHQ7JTwvY29kZT4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBJTkdfQ09NUExFVEVfU0NSSVBUTEVUUyA9ICJ0eXBpbmdDb21wbGV0ZVNjcmlwdGxldHMiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RQcm9wZXJ0eVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RQcm9wZXJ0eVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YjkzMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0UHJvcGVydHlQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Db250cm9sRW5hYmxlU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3REaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLlRhc2tUYWdQcmVmZXJlbmNlS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLQotLyoqCi0gKiBCYXNlZCBsb29zZWx5IG9uIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5Qcm9wZXJ0eUFuZFByZWZlcmVuY2VQYWdlCi0gKi8KLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJvcGVydHlQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWdQcmVmZXJlbmNlcyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL3ByZWZlcmVuY2VzLXByb3BlcnRpZXMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qCi0JICogRGlzYWJsZSBsaW5rIGRhdGEsIHByZXZlbnRzIHRoZSBkaXNwbGF5IG9mIGEgIndvcmtzcGFjZSIgb3IgInByb2plY3QiCi0JICogc2V0dGluZ3MgbGluayB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBkaWFsb2cgbGF1bmNoaW5nCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IERJU0FCTEVfTElOSyA9ICJESVNBQkxFX0xJTksiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE1hcCBmRGF0YSA9IG51bGw7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmRW5hYmxlUHJvamVjdFNldHRpbmdzOwotCi0JcHJpdmF0ZSBMaW5rIGZQcm9qZWN0U2V0dGluZ3NMaW5rOwotCQotCXByaXZhdGUgQ29udHJvbCBmQ29tbW9uOwotCQotCXByaXZhdGUgQ29udHJvbEVuYWJsZVN0YXRlIGZFbmFibGVtZW50czsKLQotCXB1YmxpYyBBYnN0cmFjdFByb3BlcnR5UHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgYXBwbHlEYXRhKE9iamVjdCBkYXRhKSB7Ci0JCXN1cGVyLmFwcGx5RGF0YShkYXRhKTsKLQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBNYXApIHsKLQkJCWZEYXRhID0gKE1hcCkgZGF0YTsKLQkJCXVwZGF0ZUxpbmtFbmFibGVtZW50KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29udHJvbCBjcmVhdGVDb21tb25Db250ZW50cyhDb21wb3NpdGUgY29tcG9zaXRlKTsKLQotCXB1YmxpYyBmaW5hbCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJQ29tcG9zaXRlIGNoZWNrTGlua0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWNoZWNrTGlua0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJY2hlY2tMaW5rQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJZkVuYWJsZVByb2plY3RTZXR0aW5ncyA9IG5ldyBCdXR0b24oY2hlY2tMaW5rQ29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQkJZkVuYWJsZVByb2plY3RTZXR0aW5ncy5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuRW5hYmxlUHJvamVjdFNldHRpbmdzKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCWZFbmFibGVQcm9qZWN0U2V0dGluZ3Muc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCQlib29sZWFuIGVuYWJsZWRGb3JQcm9qZWN0ID0gY3JlYXRlUHJlZmVyZW5jZVNjb3BlcygpWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkuZ2V0Qm9vbGVhbihnZXRQcm9qZWN0U2V0dGluZ3NLZXkoKSwgZmFsc2UpOwotCQkJZkVuYWJsZVByb2plY3RTZXR0aW5ncy5zZXRTZWxlY3Rpb24oZW5hYmxlZEZvclByb2plY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGFiZWwgc3BhY2VyID0gbmV3IExhYmVsKGNoZWNrTGlua0NvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJCXNwYWNlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJfQotCi0JCWZQcm9qZWN0U2V0dGluZ3NMaW5rID0gbmV3IExpbmsoY2hlY2tMaW5rQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWZQcm9qZWN0U2V0dGluZ3NMaW5rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5CRUdJTk5JTkcsIHRydWUsIGZhbHNlKSk7Ci0KLQkJLyoKLQkJICogImVsZW1lbnQiIHNob3VsZCBiZSBhIHByb2plY3QsIGlmIG51bGwsIGxpbmsgdG8gcGVyLXByb2plY3QKLQkJICogcHJvcGVydGllcwotCQkgKi8KLQkJaWYgKGdldFByb2plY3QoKSAhPSBudWxsKSB7Ci0JCQlmUHJvamVjdFNldHRpbmdzTGluay5zZXRUZXh0KCI8YT4iICsgU1NFVUlNZXNzYWdlcy5Db25maWd1cmVXb3Jrc3BhY2VTZXR0aW5ncyArICI8L2E+Iik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSB7Ci0JCQlmUHJvamVjdFNldHRpbmdzTGluay5zZXRUZXh0KCI8YT4iICsgU1NFVUlNZXNzYWdlcy5Db25maWd1cmVQcm9qZWN0U2V0dGluZ3MgKyAiPC9hPiIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJdXBkYXRlTGlua0VuYWJsZW1lbnQoKTsKLQotCQlmUHJvamVjdFNldHRpbmdzTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGdldFByb2plY3QoKSA9PSBudWxsKSB7Ci0JCQkJCW9wZW5Qcm9qZWN0U2V0dGluZ3MoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW9wZW5Xb3Jrc3BhY2VTZXR0aW5ncygpOwotCQkJCX0KLQkJCX0KLQotCQl9KTsKLQotCQlpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCUxhYmVsIGxpbmUgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQkJbGluZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJfQotCi0vLwkJZmluYWwgQ29udHJvbCBjb21tb24gPSBjcmVhdGVDb21tb25Db250ZW50cyhjb21wb3NpdGUpOwotCQlmQ29tbW9uID0gY3JlYXRlQ29tbW9uQ29udGVudHMoY29tcG9zaXRlKTsKLQkJCi0JCWZDb21tb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJaWYgKGZFbmFibGVQcm9qZWN0U2V0dGluZ3MgIT0gbnVsbCkgewotCQkJU2VsZWN0aW9uQWRhcHRlciBzZWxlY3Rpb25BZGFwdGVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkJZW5hYmxlUHJlZmVyZW5jZUNvbnRlbnQoZkVuYWJsZVByb2plY3RTZXR0aW5ncy5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfTsKLQkJCXNlbGVjdGlvbkFkYXB0ZXIud2lkZ2V0U2VsZWN0ZWQobnVsbCk7Ci0JCQlmRW5hYmxlUHJvamVjdFNldHRpbmdzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkFkYXB0ZXIpOwotCQl9Ci0JCQotCQlhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVNjb3BlQ29udGV4dFtdIGNyZWF0ZVByZWZlcmVuY2VTY29wZXMoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgSVNjb3BlQ29udGV4dFtde25ldyBQcm9qZWN0U2NvcGUocHJvamVjdCksIG5ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0JCX0KLQkJcmV0dXJuIG5ldyBJU2NvcGVDb250ZXh0W117bmV3IEluc3RhbmNlU2NvcGUoKSwgbmV3IERlZmF1bHRTY29wZSgpfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFByZWZlcmVuY2VQYWdlSUQoKTsKLQotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlpZiAoZ2V0RWxlbWVudCgpICE9IG51bGwpIHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCXJldHVybiAoSVByb2plY3QpIGdldEVsZW1lbnQoKTsKLQkJCX0KLQkJCU9iamVjdCBhZGFwdGVyID0gZ2V0RWxlbWVudCgpLmdldEFkYXB0ZXIoSVByb2plY3QuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCXJldHVybiAoSVByb2plY3QpIGFkYXB0ZXI7Ci0JCQl9Ci0JCQlhZGFwdGVyID0gZ2V0RWxlbWVudCgpLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQlyZXR1cm4gKElQcm9qZWN0KSBhZGFwdGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvamVjdFNldHRpbmdzS2V5KCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFByb3BlcnR5UGFnZUlEKCk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VsZW1lbnRTZXR0aW5nc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBmRW5hYmxlUHJvamVjdFNldHRpbmdzICE9IG51bGwgJiYgZkVuYWJsZVByb2plY3RTZXR0aW5ncy5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQl2b2lkIG9wZW5Qcm9qZWN0U2V0dGluZ3MoKSB7Ci0JCUxpc3REaWFsb2cgZGlhbG9nID0gbmV3IExpc3REaWFsb2coZ2V0U2hlbGwoKSkgewotCi0JCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCQlDb250cm9sIGFyZWEgPSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKGNvbnRhaW5lcik7Ci0JCQkJZ2V0VGFibGVWaWV3ZXIoKS5zZXRTb3J0ZXIobmV3IFJlc291cmNlU29ydGVyKFJlc291cmNlU29ydGVyLk5BTUUpKTsKLQkJCQlyZXR1cm4gYXJlYTsKLQkJCX0KLQkJfTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoU1NFVUlNZXNzYWdlcy5Qcm9wZXJ0eVByZWZlcmVuY2VQYWdlXzAyKTsKLQkJZGlhbG9nLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCXJldHVybiAoKElXb3Jrc3BhY2UpIGlucHV0RWxlbWVudCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJfQotCQl9KTsKLQkJZGlhbG9nLnNldExhYmVsUHJvdmlkZXIobmV3IERlY29yYXRpbmdMYWJlbFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCksIFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKSkpOwotCQlkaWFsb2cuc2V0SW5wdXQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpKTsKLQkJZGlhbG9nLnNldFRpdGxlKFNTRVVJTWVzc2FnZXMuUHJvcGVydHlQcmVmZXJlbmNlUGFnZV8wMSk7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJT2JqZWN0W10gcmVzdWx0ID0gZGlhbG9nLmdldFJlc3VsdCgpOwotCQkJaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQkJCU1hcCBkYXRhID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlkYXRhLnB1dChESVNBQkxFX0xJTkssIEJvb2xlYW4uVFJVRSk7Ci0JCQkJUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByb3BlcnR5RGlhbG9nT24oZ2V0U2hlbGwoKSwgcHJvamVjdCwgZ2V0UHJvcGVydHlQYWdlSUQoKSwgbmV3IFN0cmluZ1tde2dldFByb3BlcnR5UGFnZUlEKCl9LCBkYXRhKS5vcGVuKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIG9wZW5Xb3Jrc3BhY2VTZXR0aW5ncygpIHsKLQkJTWFwIGRhdGEgPSBuZXcgSGFzaE1hcCgpOwotCQlkYXRhLnB1dChESVNBQkxFX0xJTkssIEJvb2xlYW4uVFJVRSk7Ci0JCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwgZ2V0UHJlZmVyZW5jZVBhZ2VJRCgpLCBuZXcgU3RyaW5nW117Z2V0UHJlZmVyZW5jZVBhZ2VJRCgpfSwgZGF0YSkub3BlbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiBvayA9IHN1cGVyLnBlcmZvcm1PaygpOwotCQlJU2NvcGVDb250ZXh0W10gcHJlZmVyZW5jZVNjb3BlcyA9IGNyZWF0ZVByZWZlcmVuY2VTY29wZXMoKTsKLQkJaWYgKGdldFByb2plY3QoKSAhPSBudWxsKSB7Ci0JCQlpZiAoaXNFbGVtZW50U2V0dGluZ3NFbmFibGVkKCkpIHsKLQkJCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBzZXR0aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUEVSX1BST0pFQ1QgKyAiICgiICsgdHJ1ZSArICIpIGluIHNjb3BlICIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5hbWUoKSArICI6IiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgIAotCQkJCX0KLQkJCQlwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucHV0Qm9vbGVhbihnZXRQcm9qZWN0U2V0dGluZ3NLZXkoKSwgZkVuYWJsZVByb2plY3RTZXR0aW5ncy5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiByZW1vdmluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BFUl9QUk9KRUNUICsgIiBmcm9tIHNjb3BlICIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5hbWUoKSArICI6IiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQl9Ci0JCQkJcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnJlbW92ZShnZXRQcm9qZWN0U2V0dGluZ3NLZXkoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9rOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWlmKGdldFByb2plY3QoKSAhPSBudWxsICYmIGZFbmFibGVQcm9qZWN0U2V0dGluZ3MgIT0gbnVsbCkgewotCQkJZkVuYWJsZVByb2plY3RTZXR0aW5ncy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJZW5hYmxlUHJlZmVyZW5jZUNvbnRlbnQoZmFsc2UpOwotCQl9Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVMaW5rRW5hYmxlbWVudCgpIHsKLQkJaWYgKGZEYXRhICE9IG51bGwgJiYgZlByb2plY3RTZXR0aW5nc0xpbmsgIT0gbnVsbCkgewotCQkJZlByb2plY3RTZXR0aW5nc0xpbmsuc2V0RW5hYmxlZCghQm9vbGVhbi5UUlVFLmVxdWFscyhmRGF0YS5nZXQoRElTQUJMRV9MSU5LKSkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnRyb2xzIHRoZSBlbmFibGVtZW50IG9mIHRoZSBjb21tb24gY29udGVudCByZWdpb24KLQkgKiBvZiBhIHByb3BlcnR5IG9yIHByZWZlcmVuY2UgcGFnZQotCSAqIAotCSAqIEBwYXJhbSBlbmFibGUgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIGNvbW1vbiBjb250ZW50Ci0JICogYXJlYQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVByZWZlcmVuY2VDb250ZW50KGJvb2xlYW4gZW5hYmxlKSB7Ci0JCWlmKGVuYWJsZSkgewotCQkJaWYoZkVuYWJsZW1lbnRzICE9IG51bGwpIHsKLQkJCQlmRW5hYmxlbWVudHMucmVzdG9yZSgpOwotCQkJCWZFbmFibGVtZW50cyA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihmRW5hYmxlbWVudHMgPT0gbnVsbCkKLQkJCQlmRW5hYmxlbWVudHMgPSBDb250cm9sRW5hYmxlU3RhdGUuZGlzYWJsZShmQ29tbW9uKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9BYnN0cmFjdFZhbGlkYXRpb25TZXR0aW5nc1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9BYnN0cmFjdFZhbGlkYXRpb25TZXR0aW5nc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2NDg2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RWYWxpZGF0aW9uU2V0dGluZ3NQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lc3NhZ2VCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5FeHBhbnNpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5FeHBhbnNpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU2Nyb2xsZWRQYWdlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEJhc2VkIG9uIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5PcHRpb25zQ29uZmlndXJhdGlvbkJsb2NrCi0gKi8KLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvblNldHRpbmdzUGFnZSBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIExpc3QgZkNvbWJvczsKLQlwcml2YXRlIExpc3QgZkV4cGFuZGFibGVzOwotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBmU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQlwcml2YXRlIElQcmVmZXJlbmNlc1NlcnZpY2UgZlByZWZlcmVuY2VzU2VydmljZSA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUVElOR1NfRVhQQU5ERUQgPSAiZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFZhbGlkYXRpb25GcmFtZXdvcmsgZlZhbGlkYXRpb247Ci0KLQlwcml2YXRlIGNsYXNzIENvbWJvRGF0YSB7Ci0JCXByaXZhdGUgU3RyaW5nIGZLZXk7Ci0JCXByaXZhdGUgaW50W10gZlNldmVyaXRpZXM7Ci0JCXByaXZhdGUgaW50IGZJbmRleDsKLQkJaW50IG9yaWdpbmFsU2V2ZXJpdHkgPSAtMjsKLQotCQlwdWJsaWMgQ29tYm9EYXRhKFN0cmluZyBrZXksIGludFtdIHNldmVyaXRpZXMsIGludCBpbmRleCkgewotCQkJZktleSA9IGtleTsKLQkJCWZTZXZlcml0aWVzID0gc2V2ZXJpdGllczsKLQkJCWZJbmRleCA9IGluZGV4OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCQlyZXR1cm4gZktleTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEluZGV4KGludCBpbmRleCkgewotCQkJZkluZGV4ID0gaW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQkJcmV0dXJuIGZJbmRleDsKLQkJfQotCi0JCS8qKgotCQkgKiBTZXRzIHRoZSBzZXZlcml0eSBpbmRleCBiYXNlZCBvbiA8Y29kZT5zZXZlcml0eTwvY29kZT4uCi0JCSAqIElmIHRoZSBzZXZlcml0eSBkb2Vzbid0IGV4aXN0LCB0aGUgaW5kZXggaXMgc2V0IHRvIC0xLgotCQkgKiAKLQkJICogQHBhcmFtIHNldmVyaXR5IHRoZSBzZXZlcml0eSBsZXZlbAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0U2V2ZXJpdHkoaW50IHNldmVyaXR5KSB7Ci0JCQlmb3IgKGludCBpID0gMDsgZlNldmVyaXRpZXMgIT0gbnVsbCAmJiBpIDwgZlNldmVyaXRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZlNldmVyaXRpZXNbaV0gPT0gc2V2ZXJpdHkpIHsKLQkJCQkJc2V0SW5kZXgoaSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXNldEluZGV4KC0xKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKSB7Ci0JCQlyZXR1cm4gKGZJbmRleCA+PSAwICYmIGZTZXZlcml0aWVzICE9IG51bGwgJiYgZkluZGV4IDwgZlNldmVyaXRpZXMubGVuZ3RoKSA/IGZTZXZlcml0aWVzW2ZJbmRleF0gOiAtMTsKLQkJfQotCi0JCWJvb2xlYW4gaXNDaGFuZ2VkKCkgewotCQkJcmV0dXJuIGZTZXZlcml0aWVzW2ZJbmRleF0gIT0gb3JpZ2luYWxTZXZlcml0eTsKLQkJfQotCX0KLQotCXB1YmxpYyBBYnN0cmFjdFZhbGlkYXRpb25TZXR0aW5nc1BhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZDb21ib3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZFeHBhbmRhYmxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZlByZWZlcmVuY2VzU2VydmljZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpOwotCQlmVmFsaWRhdGlvbiA9IFZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBDb21ibyB3aWRnZXQgaW4gdGhlIGNvbXBvc2l0ZSA8Y29kZT5wYXJlbnQ8L2NvZGU+LiBUaGUgZGF0YQotCSAqIGluIHRoZSBDb21ibyBpcyBhc3NvY2lhdGVkIHdpdGggPGNvZGU+a2V5PC9jb2RlPi4gVGhlIENvbWJvIGRhdGEgaXMKLQkgKiBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlIGludGVnZXIgPGNvZGU+dmFsdWVzPC9jb2RlPiB3aGVyZSB0aGUgaW5kZXgKLQkgKiBvZiA8Y29kZT52YWx1ZXM8L2NvZGU+IGNvcnJlc3BvbmRzIHRvIHRoZSBpbmRleCBvZiA8Y29kZT52YWx1ZUxhYmVsczwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBjb21wb3NpdGUgdG8gY3JlYXRlIHRoZSBjb21ibyBib3ggaW4KLQkgKiBAcGFyYW0gbGFiZWwgdGhlIGxhYmVsIHRvIGdpdmUgdGhlIGNvbWJvIGJveAotCSAqIEBwYXJhbSBrZXkgdGhlIHVuaXF1ZSBrZXkgdG8gaWRlbnRpZnkgdGhlIGNvbWJvIGJveAotCSAqIEBwYXJhbSB2YWx1ZXMgdGhlIHZhbHVlcyByZXByZXNlbnRlZCBieSB0aGUgY29tYm8gb3B0aW9ucwotCSAqIEBwYXJhbSB2YWx1ZUxhYmVscyB0aGUgY2FsdWVzIGRpc3BsYXllZCBpbiB0aGUgY29tYm8gYm94Ci0JICogQHBhcmFtIGluZGVudCBob3cgZmFyIHRvIGluZGVudCB0aGUgY29tYm8gYm94IGxhYmVsCi0JICogCi0JICogQHJldHVybiB0aGUgZ2VuZXJhdGVkIGNvbWJvIGJveAotCSAqLwotCXByb3RlY3RlZCBDb21ibyBhZGRDb21ib0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIFN0cmluZyBrZXksIGludFtdIHZhbHVlcywgU3RyaW5nW10gdmFsdWVMYWJlbHMsIGludCBpbmRlbnQpIHsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWdkLmhvcml6b250YWxJbmRlbnQgPSBpbmRlbnQ7Ci0KLQkJTGFiZWwgbGFiZWxDb250cm9sID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQlsYWJlbENvbnRyb2wuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotCQlsYWJlbENvbnRyb2wuc2V0VGV4dChsYWJlbCk7Ci0JCWxhYmVsQ29udHJvbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlDb21ibyBjb21ib0JveCA9IG5ld0NvbWJvQ29udHJvbChwYXJlbnQsIGtleSwgdmFsdWVzLCB2YWx1ZUxhYmVscyk7Ci0JCWNvbWJvQm94LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCXJldHVybiBjb21ib0JveDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tYm8gYm94IGFuZCBhc3NvY2lhdGVzIHRoZSBjb21ibyBkYXRhIHdpdGggdGhlCi0JICogY29tYm8gYm94LgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUgdGhlIGNvbXBvc2l0ZSB0byBjcmVhdGUgdGhlIGNvbWJvIGJveCBpbgotCSAqIEBwYXJhbSBrZXkgdGhlIHVuaXF1ZSBrZXkgdG8gaWRlbnRpZnkgdGhlIGNvbWJvIGJveAotCSAqIEBwYXJhbSB2YWx1ZXMgdGhlIHZhbHVlcyByZXByZXNlbnRlZCBieSB0aGUgY29tYm8gb3B0aW9ucwotCSAqIEBwYXJhbSB2YWx1ZUxhYmVscyB0aGUgdmFsdWVzIGRpc3BsYXllZCBpbiB0aGUgY29tYm8gYm94Ci0JICogCi0JICogQHJldHVybiB0aGUgZ2VuZXJhdGVkIGNvbWJvIGJveAotCSAqLwotCXByb3RlY3RlZCBDb21ibyBuZXdDb21ib0NvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSwgU3RyaW5nIGtleSwgaW50W10gdmFsdWVzLCBTdHJpbmdbXSB2YWx1ZUxhYmVscykgewotCQlDb21ib0RhdGEgZGF0YSA9IG5ldyBDb21ib0RhdGEoa2V5LCB2YWx1ZXMsIC0xKTsKLQotCQlDb21ibyBjb21ib0JveCA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotCQljb21ib0JveC5zZXRJdGVtcyh2YWx1ZUxhYmVscyk7Ci0JCWNvbWJvQm94LnNldERhdGEoZGF0YSk7Ci0JCWNvbWJvQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQljb21ib0JveC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0KLQkJbWFrZVNjcm9sbGFibGVDb21wb3NpdGVBd2FyZShjb21ib0JveCk7Ci0KLQkJaW50IHNldmVyaXR5ID0gLTE7Ci0JCWlmIChrZXkgIT0gbnVsbCkKLQkJCXNldmVyaXR5ID0gZlByZWZlcmVuY2VzU2VydmljZS5nZXRJbnQoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSwga2V5LCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HLCBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCkpOwotCi0JCWlmIChzZXZlcml0eSA9PSBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUiB8fCBzZXZlcml0eSA9PSBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HIHx8IHNldmVyaXR5ID09IFZhbGlkYXRpb25NZXNzYWdlLklHTk9SRSkgewotCQkJZGF0YS5zZXRTZXZlcml0eShzZXZlcml0eSk7Ci0JCQlkYXRhLm9yaWdpbmFsU2V2ZXJpdHkgPSBzZXZlcml0eTsKLQkJfQotCi0JCWlmIChkYXRhLmdldEluZGV4KCkgPj0gMCkKLQkJCWNvbWJvQm94LnNlbGVjdChkYXRhLmdldEluZGV4KCkpOwotCi0JCWZDb21ib3MuYWRkKGNvbWJvQm94KTsKLQkJcmV0dXJuIGNvbWJvQm94OwotCX0KLQotCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBnZXRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJaWYgKGZTZWxlY3Rpb25MaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0JCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQljb250cm9sQ2hhbmdlZChlLndpZGdldCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gZlNlbGVjdGlvbkxpc3RlbmVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyb2xDaGFuZ2VkKFdpZGdldCB3aWRnZXQpIHsKLQkJQ29tYm9EYXRhIGRhdGEgPSAoQ29tYm9EYXRhKSB3aWRnZXQuZ2V0RGF0YSgpOwotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ29tYm8pIHsKLQkJCWRhdGEuc2V0SW5kZXgoKChDb21ibykgd2lkZ2V0KS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFNldHRpbmdzUGFnZSNzdG9yZVZhbHVlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCWlmIChmQ29tYm9zID09IG51bGwgfHwgZkNvbWJvcy5zaXplKCkgPT0gMCkKLQkJCXJldHVybjsKLQotCQlJdGVyYXRvciBpdCA9IGZDb21ib3MuaXRlcmF0b3IoKTsKLQotCQlJU2NvcGVDb250ZXh0W10gY29udGV4dHMgPSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCk7Ci0KLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJQ29tYm9EYXRhIGRhdGEgPSAoQ29tYm9EYXRhKSAoKENvbWJvKSBpdC5uZXh0KCkpLmdldERhdGEoKTsKLQkJCWlmIChkYXRhLmdldEtleSgpICE9IG51bGwpIHsKLQkJCQljb250ZXh0c1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnB1dEludChkYXRhLmdldEtleSgpLCBkYXRhLmdldFNldmVyaXR5KCkpOwotCQkJfQotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQljb250ZXh0c1tpXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLmZsdXNoKCk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEV4cGFuZGFibGVDb21wb3NpdGUgZ2V0UGFyZW50RXhwYW5kYWJsZUNvbXBvc2l0ZShDb250cm9sIGNvbnRyb2wpIHsKLQkJQ29udHJvbCBwYXJlbnQgPSBjb250cm9sLmdldFBhcmVudCgpOwotCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBFeHBhbmRhYmxlQ29tcG9zaXRlKSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOwotCQl9Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBFeHBhbmRhYmxlQ29tcG9zaXRlKSB7Ci0JCQlyZXR1cm4gKEV4cGFuZGFibGVDb21wb3NpdGUpIHBhcmVudDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRXhwYW5kYWJsZUNvbXBvc2l0ZSBjcmVhdGVTdHlsZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBpbnQgbkNvbHVtbnMpIHsKLQkJRXhwYW5kYWJsZUNvbXBvc2l0ZSBleGNvbXBvc2l0ZSA9IG5ldyBFeHBhbmRhYmxlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUsIEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IEV4cGFuZGFibGVDb21wb3NpdGUuQ0xJRU5UX0lOREVOVCk7Ci0JCWV4Y29tcG9zaXRlLnNldFRleHQobGFiZWwpOwotCQlleGNvbXBvc2l0ZS5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JCWV4Y29tcG9zaXRlLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0Qm9sZChKRmFjZVJlc291cmNlcy5ESUFMT0dfRk9OVCkpOwotCQlleGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSwgbkNvbHVtbnMsIDEpKTsKLQkJZXhjb21wb3NpdGUuYWRkRXhwYW5zaW9uTGlzdGVuZXIobmV3IEV4cGFuc2lvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleHBhbnNpb25TdGF0ZUNoYW5nZWQoRXhwYW5zaW9uRXZlbnQgZSkgewotCQkJCWV4cGFuZGVkU3RhdGVDaGFuZ2VkKChFeHBhbmRhYmxlQ29tcG9zaXRlKSBlLmdldFNvdXJjZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCWZFeHBhbmRhYmxlcy5hZGQoZXhjb21wb3NpdGUpOwotCQltYWtlU2Nyb2xsYWJsZUNvbXBvc2l0ZUF3YXJlKGV4Y29tcG9zaXRlKTsKLQkJcmV0dXJuIGV4Y29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlU3R5bGVTZWN0aW9uV2l0aENvbnRlbnRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBpbnQgbkNvbHVtbnMpIHsKLQkJRXhwYW5kYWJsZUNvbXBvc2l0ZSBleGNvbXBvc2l0ZSA9IG5ldyBFeHBhbmRhYmxlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUsIEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IEV4cGFuZGFibGVDb21wb3NpdGUuQ0xJRU5UX0lOREVOVCk7Ci0JCWV4Y29tcG9zaXRlLnNldFRleHQobGFiZWwpOwotCQlleGNvbXBvc2l0ZS5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JCWV4Y29tcG9zaXRlLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0Qm9sZChKRmFjZVJlc291cmNlcy5ESUFMT0dfRk9OVCkpOwotCQlleGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSwgbkNvbHVtbnMsIDEpKTsKLQkJZXhjb21wb3NpdGUuYWRkRXhwYW5zaW9uTGlzdGVuZXIobmV3IEV4cGFuc2lvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleHBhbnNpb25TdGF0ZUNoYW5nZWQoRXhwYW5zaW9uRXZlbnQgZSkgewotCQkJCWV4cGFuZGVkU3RhdGVDaGFuZ2VkKChFeHBhbmRhYmxlQ29tcG9zaXRlKSBlLmdldFNvdXJjZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCWZFeHBhbmRhYmxlcy5hZGQoZXhjb21wb3NpdGUpOwotCQltYWtlU2Nyb2xsYWJsZUNvbXBvc2l0ZUF3YXJlKGV4Y29tcG9zaXRlKTsKLQotCQlDb21wb3NpdGUgaW5uZXIgPSBuZXcgQ29tcG9zaXRlKGV4Y29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWlubmVyLnNldEZvbnQoZXhjb21wb3NpdGUuZ2V0Rm9udCgpKTsKLQkJaW5uZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KG5Db2x1bW5zLCBmYWxzZSkpOwotCQlleGNvbXBvc2l0ZS5zZXRDbGllbnQoaW5uZXIpOwotCQlyZXR1cm4gaW5uZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZXhwYW5kZWRTdGF0ZUNoYW5nZWQoRXhwYW5kYWJsZUNvbXBvc2l0ZSBleHBhbmRhYmxlKSB7Ci0JCVNjcm9sbGVkUGFnZUNvbnRlbnQgcGFyZW50U2Nyb2xsZWRDb21wb3NpdGUgPSBnZXRQYXJlbnRTY3JvbGxlZENvbXBvc2l0ZShleHBhbmRhYmxlKTsKLQkJaWYgKHBhcmVudFNjcm9sbGVkQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCXBhcmVudFNjcm9sbGVkQ29tcG9zaXRlLnJlZmxvdyh0cnVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBtYWtlU2Nyb2xsYWJsZUNvbXBvc2l0ZUF3YXJlKENvbnRyb2wgY29udHJvbCkgewotCQlTY3JvbGxlZFBhZ2VDb250ZW50IHBhcmVudFNjcm9sbGVkQ29tcG9zaXRlID0gZ2V0UGFyZW50U2Nyb2xsZWRDb21wb3NpdGUoY29udHJvbCk7Ci0JCWlmIChwYXJlbnRTY3JvbGxlZENvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQlwYXJlbnRTY3JvbGxlZENvbXBvc2l0ZS5hZGFwdENoaWxkKGNvbnRyb2wpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFNjcm9sbGVkUGFnZUNvbnRlbnQgZ2V0UGFyZW50U2Nyb2xsZWRDb21wb3NpdGUoQ29udHJvbCBjb250cm9sKSB7Ci0JCUNvbnRyb2wgcGFyZW50ID0gY29udHJvbC5nZXRQYXJlbnQoKTsKLQkJd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgU2Nyb2xsZWRQYWdlQ29udGVudCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKLQkJfQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgU2Nyb2xsZWRQYWdlQ29udGVudCkgewotCQkJcmV0dXJuIChTY3JvbGxlZFBhZ2VDb250ZW50KSBwYXJlbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVTZWN0aW9uRXhwYW5zaW9uU3RhdGVzKElEaWFsb2dTZXR0aW5ncyBzZWN0aW9uKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkV4cGFuZGFibGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlFeHBhbmRhYmxlQ29tcG9zaXRlIGNvbXAgPSAoRXhwYW5kYWJsZUNvbXBvc2l0ZSkgZkV4cGFuZGFibGVzLmdldChpKTsKLQkJCXNlY3Rpb24ucHV0KFNFVFRJTkdTX0VYUEFOREVEICsgU3RyaW5nLnZhbHVlT2YoaSksIGNvbXAuaXNFeHBhbmRlZCgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVTZWN0aW9uRXhwYW5zaW9uU3RhdGVzKElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncykgewotCQlmb3IgKGludCBpPSAwOyBpIDwgZkV4cGFuZGFibGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlFeHBhbmRhYmxlQ29tcG9zaXRlIGV4Y29tcG9zaXRlPSAoRXhwYW5kYWJsZUNvbXBvc2l0ZSkgZkV4cGFuZGFibGVzLmdldChpKTsKLQkJCWlmIChzZXR0aW5ncyA9PSBudWxsKSB7Ci0JCQkJZXhjb21wb3NpdGUuc2V0RXhwYW5kZWQoaSA9PSAwKTsgLy8gb25seSBleHBhbmQgdGhlIGZpcnN0IG5vZGUgYnkgZGVmYXVsdAotCQkJfSBlbHNlIHsKLQkJCQlleGNvbXBvc2l0ZS5zZXRFeHBhbmRlZChzZXR0aW5ncy5nZXRCb29sZWFuKFNFVFRJTkdTX0VYUEFOREVEICsgU3RyaW5nLnZhbHVlT2YoaSkpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc2V0U2V2ZXJpdGllcygpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBkZWZhdWx0Q29udGV4dCA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZDb21ib3Muc2l6ZSgpOyBpKyspIHsKLQkJCUNvbWJvRGF0YSBkYXRhID0gKENvbWJvRGF0YSkgKChDb21ibykgZkNvbWJvcy5nZXQoaSkpLmdldERhdGEoKTsKLQkJCWludCBzZXZlcml0eSA9IGRlZmF1bHRDb250ZXh0LmdldEludChkYXRhLmdldEtleSgpLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJCWRhdGEuc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOwotCQkJKChDb21ibykgZkNvbWJvcy5nZXQoaSkpLnNlbGVjdChkYXRhLmdldEluZGV4KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkUmV2YWxpZGF0ZU9uU2V0dGluZ3NDaGFuZ2UoKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gZkNvbWJvcy5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUNvbWJvRGF0YSBkYXRhID0gKENvbWJvRGF0YSkgKChDb21ibykgaXQubmV4dCgpKS5nZXREYXRhKCk7Ci0JCQlpZiAoZGF0YS5pc0NoYW5nZWQoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlpZihzdXBlci5wZXJmb3JtT2soKSAmJiBzaG91bGRSZXZhbGlkYXRlT25TZXR0aW5nc0NoYW5nZSgpKSB7Ci0JCQlNZXNzYWdlQm94IG1iID0gbmV3IE1lc3NhZ2VCb3godGhpcy5nZXRTaGVsbCgpLCBTV1QuQVBQTElDQVRJT05fTU9EQUwgfCBTV1QuWUVTIHwgU1dULk5PIHwgU1dULkNBTkNFTCB8IFNXVC5JQ09OX0lORk9STUFUSU9OIHwgU1dULlJJR0hUKTsKLQkJCW1iLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVmFsaWRhdGlvbl9UaXRsZSk7Ci0JCQkvKiBDaG9vc2Ugd2hpY2ggbWVzc2FnZSB0byB1c2UgYmFzZWQgb24gaWYgaXRzIHByb2plY3Qgb3Igd29ya3NwYWNlIHNldHRpbmdzICovCi0JCQlTdHJpbmcgbXNnID0gKGdldFByb2plY3QoKSA9PSBudWxsKSA/IEhUTUxVSU1lc3NhZ2VzLlZhbGlkYXRpb25fV29ya3NwYWNlIDogSFRNTFVJTWVzc2FnZXMuVmFsaWRhdGlvbl9Qcm9qZWN0OwotCQkJbWIuc2V0TWVzc2FnZShtc2cpOwotCQkJc3dpdGNoKG1iLm9wZW4oKSkgewotCQkJCWNhc2UgU1dULkNBTkNFTDoKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWNhc2UgU1dULllFUzoKLQkJCQkJVmFsaWRhdGVKb2Igam9iID0gbmV3IFZhbGlkYXRlSm9iKEhUTUxVSU1lc3NhZ2VzLlZhbGlkYXRpb25fam9iTmFtZSk7Ci0JCQkJCWpvYi5zY2hlZHVsZSgpOwotCQkJCWNhc2UgU1dULk5POgotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHZhbGlkYXRpb24gYWZ0ZXIgdmFsaWRhdGlvbiBwcmVmZXJlbmNlcyBoYXZlIGJlZW4gbW9kaWZpZWQuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBWYWxpZGF0ZUpvYiBleHRlbmRzIEpvYiB7Ci0KLQkJcHVibGljIFZhbGlkYXRlSm9iKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcihuYW1lKTsKLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCXRyeSB7Ci0JCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IG51bGw7Ci0JCQkJLyogQ2hhbmdlZCBwcmVmZXJlbmNlcyBmb3IgYSBzaW5nbGUgcHJvamVjdCwgb25seSB2YWxpZGF0ZSBpdCAqLwotCQkJCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkKLQkJCQkJcHJvamVjdHMgPSBuZXcgSVByb2plY3RbXXtnZXRQcm9qZWN0KCl9OwotCQkJCS8qIFdvcmtzcGFjZS13aWRlIHByZWZlcmVuY2VzIGNoYW5nZWQgKi8KLQkJCQllbHNlIHsKLQkJCQkJLyogR2V0IGFsbCBvZiB0aGUgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZSAqLwotCQkJCQlwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJCQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmcyA9IG51bGw7Ci0JCQkJCUxpc3QgcHJvamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCQkJLyogRmlsdGVyIG91dCBwcm9qZWN0cyB0aGF0IHVzZSBwcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzIG9yIGhhdmUgYmVlbiBjbG9zZWQgKi8KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQkJcHJlZnMgPSBuZXcgUHJvamVjdFNjb3BlKHByb2plY3RzW2ldKS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpOwotCQkJCQkJaWYgKHByb2plY3RzW2ldLmlzQWNjZXNzaWJsZSgpICYmICFwcmVmcy5nZXRCb29sZWFuKGdldFByb2plY3RTZXR0aW5nc0tleSgpLCBmYWxzZSkpCi0JCQkJCQkJcHJvamVjdExpc3QuYWRkKHByb2plY3RzW2ldKTsKLQkJCQkJfQotCQkJCQlwcm9qZWN0cyA9IChJUHJvamVjdFtdKSBwcm9qZWN0TGlzdC50b0FycmF5KG5ldyBJUHJvamVjdFtwcm9qZWN0TGlzdC5zaXplKCldKTsKLQkJCQl9Ci0JCQkJZlZhbGlkYXRpb24udmFsaWRhdGUocHJvamVjdHMsIHRydWUsIGZhbHNlLCBtb25pdG9yKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJc3RhdHVzID0gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQl9Ci0KLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUENvbG9yUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUENvbG9yUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ1YTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BDb2xvclBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0hUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU3R5bGVkVGV4dENvbG9yUGlja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb2xvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpTUENvbG9yUGFnZSBleHRlbmRzIFhNTENvbG9yUGFnZSB7Ci0KLQkvKioKLQkgKiBPdmVycmlkZGVuIHRvIHNldCB1cCBTdHlsZWRUZXh0Q29sb3JQaWNrZXIgZGlmZmVyZW50bHkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50c0ZvclBpY2tlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSB0aGUgY29sb3IgcGlja2VyCi0JCWZQaWNrZXIgPSBuZXcgSlNQU3R5bGVkVGV4dENvbG9yUGlja2VyKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWZQaWNrZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlmUGlja2VyLnNldFByZWZlcmVuY2VTdG9yZShmT3ZlcmxheVN0b3JlKTsKLQkJc2V0dXBQaWNrZXIoZlBpY2tlcik7Ci0KLQkJZlBpY2tlci5zZXRUZXh0KGdldFNhbXBsZVRleHQoKSk7Ci0JfQotCQotCS8qKgotCSAqIFNldCB1cCBhbGwgdGhlIHN0eWxlIHByZWZlcmVuY2Uga2V5cyBpbiB0aGUgb3ZlcmxheSBzdG9yZQotCSAqLwotCXByb3RlY3RlZCBPdmVybGF5S2V5W10gY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpIHsKLQkJQXJyYXlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJQXJyYXlMaXN0IHN0eWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW5pdFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCQlJdGVyYXRvciBpID0gc3R5bGVMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5TVFJJTkcsIChTdHJpbmcpaS5uZXh0KCkpKTsJCi0JCX0KLQotCQlPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbXSBrZXlzID0gbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtvdmVybGF5S2V5cy5zaXplKCldOwotCQlvdmVybGF5S2V5cy50b0FycmF5KGtleXMpOwotCQlyZXR1cm4ga2V5czsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNhbXBsZVRleHQoKSB7Ci0JCXJldHVybiBKU1BVSU1lc3NhZ2VzLlNhbXBsZV9KU1BfZG9jOyAvLyROT04tTkxTLTEkID0gIjwlQCBwYWdlIFxuXHRsYW5ndWFnZT1cImphdmFcIiBcblx0Y29udGVudFR5cGU9XCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMVwiXG4lPlxuPGpzcDppbmNsdWRlIGZsdXNoPVwidHJ1ZVwiIHBhZ2U9XCJ0aXRsZUJhci5qc3BcIi8+XG5cbjwlLS0gVXNlIGJlbG93IHRhZ3MgT05MWSBmb3IgSlNQIDEuMSAtLSU+XG48JVxuXHRTeXN0ZW0ub3V0LnByaW50bG4oXCJXZWxjb21lIVwiKTtcbiU+XG48JS0tIFVzZSBiZWxvdyB0YWdzIE9OTFkgZm9yIEpTUCAxLjIgLS0lPlxuPGpzcDpzY3JpcHRsZXQ+XG5cdFN5c3RlbS5vdXQucHJpbnRsbihcIldlbGNvbWUhXCIpO1xuPC9qc3A6c2NyaXB0bGV0PiIKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGV4dFN0eWxlTWFwKERpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwKSB7Ci0KLQkJaW5pdENvbW1vbkNvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCQljb250ZXh0U3R5bGVNYXAucmVtb3ZlKERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpOyAvLyBsZWF2ZSBjb250ZW50IGJldHdlZW4gdGFncyBhbG9uZQotCQljb250ZXh0U3R5bGVNYXAucmVtb3ZlKERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4pOyAvLyB4bWwvaHRtbCBzcGVjaWZpYwotCQljb250ZXh0U3R5bGVNYXAucmVtb3ZlKERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsgLy8geG1sL2h0bWwgc3BlY2lmaWMKLQkJY29udGV4dFN0eWxlTWFwLnJlbW92ZShET01SZWdpb25Db250ZXh0LlhNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OKTsgLy8geG1sL2h0bWwgc3BlY2lmaWMKLQkJY29udGV4dFN0eWxlTWFwLnJlbW92ZShET01SZWdpb25Db250ZXh0LlhNTF9FTEVNRU5UX0RFQ0xfQ0xPU0UpOyAvLyB4bWwvaHRtbCBzcGVjaWZpYwotCi0JCS8vCWNvbnRleHRTdHlsZU1hcC5wdXQoWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIEhUTUxDb2xvck1hbmFnZXIuU0NSSVBUX0FSRUEpOwotCQkvLwljb250ZXh0U3R5bGVNYXAucHV0KFhNTEpTUFJlZ2lvbkNvbnRleHRzLkJMT0NLX1RFWFQsIEhUTUxDb2xvck1hbmFnZXIuU0NSSVBUX0FSRUEpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOLCBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOLCBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTiwgSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiwgSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0UsIElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0UsIElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIElTdHlsZUNvbnN0YW50c0pTUC5KU1BfQ09OVEVOVCk7Ci0JCQotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX1RFWFQsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQkKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RGVzY3JpcHRpb25zKERpY3Rpb25hcnkgZGVzY3JpcHRpb25zKSB7Ci0JCWluaXRDb21tb25EZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQkJZGVzY3JpcHRpb25zLnJlbW92ZShJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQpOyAvLyBsZWF2ZSBjb250ZW50IGJldHdlZW4gdGFncyBhbG9uZQotCQlkZXNjcmlwdGlvbnMucmVtb3ZlKElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7IC8vIHhtbC9odG1sIHNwZWNpZmljCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIsIEpTUFVJTWVzc2FnZXMuSlNQX0RlbGltaXRlcnNfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJKU1AgRGVsaW1pdGVycyIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNKU1AuSlNQX0NPTlRFTlQsIEpTUFVJTWVzc2FnZXMuSlNQQ29sb3JQYWdlX2pzcF9jb250ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0U3R5bGVMaXN0KEFycmF5TGlzdCBsaXN0KSB7Ci0JCWluaXRDb21tb25TdHlsZUxpc3QobGlzdCk7Ci0JCWxpc3QucmVtb3ZlKElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7IC8vIGxlYXZlIGNvbnRlbnQgYmV0d2VlbiB0YWdzIGFsb25lCi0JCWxpc3QucmVtb3ZlKElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7IC8vIHhtbC9odG1sIHNwZWNpZmljCi0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzSlNQLkpTUF9DT05URU5UKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cFBpY2tlcihTdHlsZWRUZXh0Q29sb3JQaWNrZXIgcGlja2VyKSB7Ci0JCUlNb2RlbE1hbmFnZXIgbW1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlwaWNrZXIuc2V0UGFyc2VyKG1tYW5hZ2VyLmNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKS5nZXRQYXJzZXIoKSk7Ci0KLQkJLy8gY3JlYXRlIGRlc2NyaXB0aW9ucyBmb3IgaGlnaGxpZ2h0aW5nIHR5cGVzCi0JCURpY3Rpb25hcnkgZGVzY3JpcHRpb25zID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpbml0RGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0KLQkJLy8gbWFwIHJlZ2lvbiB0eXBlcyB0byBoaWdobGlnaHRpbmcgdHlwZXMKLQkJRGljdGlvbmFyeSBjb250ZXh0U3R5bGVNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWluaXRDb250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQotCQlBcnJheUxpc3Qgc3R5bGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbml0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0KLQkJcGlja2VyLnNldENvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCQlwaWNrZXIuc2V0RGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0JCXBpY2tlci5zZXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlDb250cm9sIGMgPSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGMsIElIZWxwQ29udGV4dElkcy5KU1BfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCk7Ci0JCXJldHVybiBjOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdENvbG9yUGFnZSNzYXZlUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVQcmVmZXJlbmNlcygpIHsKLQkJSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQRmlsZXNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGFiYzY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBKU1BGaWxlc1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2UgewotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMudWkuSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHNGb3JMb2FkaW5nR3JvdXAob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yTG9hZGluZ0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gbm8gbG9hZGluZyBwcmVmZXJlbmNlcwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNkb0dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCkgewotCQlKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gbW9kZWwKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMudWkuSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2UjaW5pdGlhbGl6ZVZhbHVlc0ZvckxvYWRpbmdHcm91cCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvckxvYWRpbmdHcm91cCgpIHsKLQkJLy8gbm8gbG9hZGluZyBwcmVmZXJlbmNlcwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMudWkuSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybURlZmF1bHRzRm9yTG9hZGluZ0dyb3VwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHNGb3JMb2FkaW5nR3JvdXAoKSB7Ci0JCS8vIG5vIGxvYWRpbmcgcHJlZmVyZW5jZXMKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLnVpLkhUTUxGaWxlc1ByZWZlcmVuY2VQYWdlI3N0b3JlVmFsdWVzRm9yTG9hZGluZ0dyb3VwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlc0ZvckxvYWRpbmdHcm91cCgpIHsKLQkJLy8gbm8gbG9hZGluZyBwcmVmZXJlbmNlcwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUFNvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNzZiNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUFNvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5HcmlkRGF0YUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZUxpbmtBcmVhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VzLklXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyOwotCi1wdWJsaWMgY2xhc3MgSlNQU291cmNlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLQotCQluZXcgUHJlZmVyZW5jZUxpbmtBcmVhKGNvbXBvc2l0ZSwgU1dULldSQVAgfCBTV1QuTVVMVEksICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmVkaXRvciIsIEpTUFVJTWVzc2FnZXMuX1VJX1NUUlVDVFVSRURfVEVYVF9FRElUT1JfUFJFRlNfTElOSywvLyROT04tTkxTLTEkCi0JCQkJCShJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcikgZ2V0Q29udGFpbmVyKCksIG51bGwpLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5pbmRlbnQoNSwgMCkuaGludCgxNTAsIFNXVC5ERUZBVUxUKS5jcmVhdGUoKSk7Ci0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5zd3REZWZhdWx0cygpLmNyZWF0ZSgpKTsKLQotCQlUZXh0IGxhYmVsID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKLQkJbGFiZWwuc2V0VGV4dChKU1BVSU1lc3NhZ2VzLkpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzApOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuREVGQVVMVCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJUHJlZmVyZW5jZUxpbmtBcmVhIGZpbGVFZGl0b3JzQXJlYSA9IG5ldyBQcmVmZXJlbmNlTGlua0FyZWEoY29tcG9zaXRlLCBTV1QuTk9ORSwgIm9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLnNvdXJjZSIsIEpTUFVJTWVzc2FnZXMuSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMSwvLyROT04tTkxTLTEkCi0JCQkJCShJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcikgZ2V0Q29udGFpbmVyKCksIG51bGwpOwotCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5ERUZBVUxULCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDU7Ci0JCWZpbGVFZGl0b3JzQXJlYS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlQcmVmZXJlbmNlTGlua0FyZWEgY29udGVudFR5cGVBcmVhID0gbmV3IFByZWZlcmVuY2VMaW5rQXJlYShjb21wb3NpdGUsIFNXVC5OT05FLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy54bWwuc291cmNlIiwgSlNQVUlNZXNzYWdlcy5KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8yLC8vJE5PTi1OTFMtMSQKLQkJCQkJKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyKSBnZXRDb250YWluZXIoKSwgbnVsbCk7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkRFRkFVTFQsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gNTsKLQkJY29udGVudFR5cGVBcmVhLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvL0dyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvL0dyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BTdHlsZWRUZXh0Q29sb3JQaWNrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BTdHlsZWRUZXh0Q29sb3JQaWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTliZDgwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQU3R5bGVkVGV4dENvbG9yUGlja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLlN0eWxlZFRleHRDb2xvclBpY2tlcjsKLQotLyoqCi0qIE92ZXJyaWRlcyBTdHlsZWRUZXh0Q29sb3JQaWNrZXIgZm9yIHNwZWNpYWwgZW5hYmxlbWVudCBiZWhhdmlvciAKLSogZm9yIEpTUENvbnRlbnQgKG9ubHkgYmFja2dyb3VuZCBzZXR0YWJsZSkKLSoqLwotcHVibGljIGNsYXNzIEpTUFN0eWxlZFRleHRDb2xvclBpY2tlciBleHRlbmRzIFN0eWxlZFRleHRDb2xvclBpY2tlciB7Ci0JCi0JcHVibGljIEpTUFN0eWxlZFRleHRDb2xvclBpY2tlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JfQotCQotCS8qKgotCSAqIEFjdGl2YXRlIGNvbnRyb2xzIGJhc2VkIG9uIHRoZSBnaXZlbiBsb2NhbCBjb2xvciB0eXBlLgotCSAqIE92ZXJyaWRkZW4gdG8gZGlzYWJsZSBmb3JlZ3JvdW5kIGNvbG9yLCBib2xkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjdGl2YXRlKFN0cmluZyBuYW1lZFN0eWxlKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkKLQkJaWYobmFtZWRTdHlsZSA9PSBJU3R5bGVDb25zdGFudHNKU1AuSlNQX0NPTlRFTlQpIHsKLQkJCWZGb3JlZ3JvdW5kLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlpZiAoc2hvd0l0YWxpYykKLQkJCQlmSXRhbGljLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkZvcmVncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsJCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQU3ludGF4Q29sb3JpbmdQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQU3ludGF4Q29sb3JpbmdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZDgxMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUFN5bnRheENvbG9yaW5nUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkNvbG9yU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQUNDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotLyoqCi0gKiBBIHByZWZlcmVuY2UgcGFnZSB0byBjb25maWd1cmUgb3VyIFhNTCBzeW50YXggY29sb3IuIEl0IHJlc2VtYmxlcyB0aGUgSkRUCi0gKiBhbmQgQ0RUIHBhZ2VzIGZhciBtb3JlIHRoYW4gb3VyIG9yaWdpbmFsIGNvbG9yIHBhZ2Ugd2hpbGUgcmV0YWluaW5nIHRoZQotICogZXh0cmEgImNsaWNrLXRvLWZpbmQiIGZ1bmN0aW9uYWxpdHkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKU1BTeW50YXhDb2xvcmluZ1BhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmQm9sZDsKLQlwcml2YXRlIExhYmVsIGZGb3JlZ3JvdW5kTGFiZWw7Ci0JcHJpdmF0ZSBMYWJlbCBmQmFja2dyb3VuZExhYmVsOwotCXByaXZhdGUgQnV0dG9uIGZDbGVhclN0eWxlOwotCXByaXZhdGUgTWFwIGZDb250ZXh0VG9TdHlsZU1hcDsKLQlwcml2YXRlIENvbG9yIGZEZWZhdWx0Rm9yZWdyb3VuZCA9IG51bGw7Ci0JcHJpdmF0ZSBDb2xvciBmRGVmYXVsdEJhY2tncm91bmQgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBDb2xvclNlbGVjdG9yIGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3I7Ci0JcHJpdmF0ZSBDb2xvclNlbGVjdG9yIGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3I7Ci0JcHJpdmF0ZSBCdXR0b24gZkl0YWxpYzsKLQlwcml2YXRlIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZk92ZXJsYXlTdG9yZTsKLQlwcml2YXRlIEJ1dHRvbiBmU3RyaWtlOwotCXByaXZhdGUgQ29sbGVjdGlvbiBmU3R5bGVQcmVmZXJlbmNlS2V5czsKLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgZlN0eWxlc1ZpZXdlciA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgZlN0eWxlVG9EZXNjcmlwdGlvbk1hcDsKLQlwcml2YXRlIFN0eWxlZFRleHQgZlRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gZlVuZGVybGluZTsKLQotCi0JLy8gYWN0aXZhdGUgY29udHJvbHMgYmFzZWQgb24gdGhlIGdpdmVuIGxvY2FsIGNvbG9yIHR5cGUKLQlwcml2YXRlIHZvaWQgYWN0aXZhdGUoU3RyaW5nIG5hbWVkU3R5bGUpIHsKLQkJQ29sb3IgZm9yZWdyb3VuZCA9IGZEZWZhdWx0Rm9yZWdyb3VuZDsKLQkJQ29sb3IgYmFja2dyb3VuZCA9IGZEZWZhdWx0QmFja2dyb3VuZDsKLQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkgewotCQkJZkNsZWFyU3R5bGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQm9sZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZJdGFsaWMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmU3RyaWtlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZlVuZGVybGluZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZGb3JlZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQm9sZC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJZkl0YWxpYy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJZlN0cmlrZS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJZlVuZGVybGluZS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGVGb3IobmFtZWRTdHlsZSk7Ci0JCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKHRydWUpOwotCQkJYm9vbGVhbiBlbmFibGVCYWNrZ3JvdW5kT25seSA9IElTdHlsZUNvbnN0YW50c0pTUC5KU1BfQ09OVEVOVC5lcXVhbHMobmFtZWRTdHlsZSk7Ci0JCQlmQm9sZC5zZXRFbmFibGVkKCFlbmFibGVCYWNrZ3JvdW5kT25seSk7Ci0JCQlmSXRhbGljLnNldEVuYWJsZWQoIWVuYWJsZUJhY2tncm91bmRPbmx5KTsKLQkJCWZTdHJpa2Uuc2V0RW5hYmxlZCghZW5hYmxlQmFja2dyb3VuZE9ubHkpOwotCQkJZlVuZGVybGluZS5zZXRFbmFibGVkKCFlbmFibGVCYWNrZ3JvdW5kT25seSk7Ci0JCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoIWVuYWJsZUJhY2tncm91bmRPbmx5KTsKLQkJCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZCghZW5hYmxlQmFja2dyb3VuZE9ubHkpOwotCQkJZkJhY2tncm91bmRMYWJlbC5zZXRFbmFibGVkKHRydWUpOwotCQkJZkJhY2tncm91bmRDb2xvckVkaXRvci5zZXRFbmFibGVkKHRydWUpOwotCQkJZkJvbGQuc2V0U2VsZWN0aW9uKChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFNXVC5CT0xEKSAhPSAwKTsKLQkJCWZJdGFsaWMuc2V0U2VsZWN0aW9uKChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOwotCQkJZlN0cmlrZS5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIKSAhPSAwKTsKLQkJCWZVbmRlcmxpbmUuc2V0U2VsZWN0aW9uKChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FKSAhPSAwKTsKLQkJCWlmIChhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpICE9IG51bGwpIHsKLQkJCQlmb3JlZ3JvdW5kID0gYXR0cmlidXRlLmdldEZvcmVncm91bmQoKTsKLQkJCX0KLQkJCWlmIChhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpICE9IG51bGwpIHsKLQkJCQliYWNrZ3JvdW5kID0gYXR0cmlidXRlLmdldEJhY2tncm91bmQoKTsKLQkJCX0KLQkJfQotCi0JCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0Q29sb3JWYWx1ZShmb3JlZ3JvdW5kLmdldFJHQigpKTsKLQkJZkJhY2tncm91bmRDb2xvckVkaXRvci5zZXRDb2xvclZhbHVlKGJhY2tncm91bmQuZ2V0UkdCKCkpOwotCX0KLQotCS8qKgotCSAqIENvbG9yIHRoZSB0ZXh0IGluIHRoZSBzYW1wbGUgYXJlYSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcHJlZmVyZW5jZXMKLQkgKi8KLQl2b2lkIGFwcGx5U3R5bGVzKCkgewotCQlpZiAoZlRleHQgPT0gbnVsbCB8fCBmVGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBmRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJd2hpbGUgKGRvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCS8vIGxvb2t1cCB0aGUgbG9jYWwgY29sb3JpbmcgdHlwZSBhbmQgYXBwbHkgaXQKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IChTdHJpbmcpIGZDb250ZXh0VG9TdHlsZU1hcC5nZXQoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkpOwotCQkJCWlmIChuYW1lZFN0eWxlID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCVRleHRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlRm9yKG5hbWVkU3R5bGUpOwotCQkJCWlmIChhdHRyaWJ1dGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJU3R5bGVSYW5nZSBzdHlsZSA9IG5ldyBTdHlsZVJhbmdlKGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGN1cnJlbnRSZWdpb24pLCBjdXJyZW50UmVnaW9uLmdldFRleHRMZW5ndGgoKSwgYXR0cmlidXRlLmdldEZvcmVncm91bmQoKSwgYXR0cmlidXRlLmdldEJhY2tncm91bmQoKSwgYXR0cmlidXRlLmdldFN0eWxlKCkpOwotCQkJCXN0eWxlLnN0cmlrZW91dCA9IChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuU1RSSUtFVEhST1VHSCkgIT0gMDsKLQkJCQlzdHlsZS51bmRlcmxpbmUgPSAoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlVOREVSTElORSkgIT0gMDsKLQkJCQlmVGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQkJCX0KLQkJCWRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0TmV4dCgpOwotCQl9Ci0JfQotCi0JQnV0dG9uIGNyZWF0ZUNoZWNrYm94KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGNvbXBvc2l0ZSBjb250cm9sIGFuZCBzZXRzIHRoZSBkZWZhdWx0IGxheW91dCBkYXRhLgotCSAqLwotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvLyBHcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gZmFsc2U7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQotCQlmRGVmYXVsdEZvcmVncm91bmQgPSBwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpOwotCQlmRGVmYXVsdEJhY2tncm91bmQgPSBwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpOwotCQlDb21wb3NpdGUgcGFnZUNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDIpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhZ2VDb21wb25lbnQsIElIZWxwQ29udGV4dElkcy5KU1BfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCk7Ci0KLQkJTGluayBsaW5rID0gbmV3IExpbmsocGFnZUNvbXBvbmVudCwgU1dULldSQVApOwotCQlsaW5rLnNldFRleHQoU1NFVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ19MaW5rKTsKLQkJbGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKHBhcmVudC5nZXRTaGVsbCgpLCBlLnRleHQsIG51bGwsIG51bGwpOwotCQkJfQotCQl9KTsKLQotCQlHcmlkRGF0YSBsaW5rRGF0YT0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQkVHSU5OSU5HLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWxpbmtEYXRhLndpZHRoSGludD0gMTUwOyAvLyBvbmx5IGV4cGFuZCBmdXJ0aGVyIGlmIGFueW9uZSBlbHNlIHJlcXVpcmVzIGl0Ci0JCWxpbmsuc2V0TGF5b3V0RGF0YShsaW5rRGF0YSk7Ci0KLQkJbmV3IExhYmVsKHBhZ2VDb21wb25lbnQsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJbmV3IExhYmVsKHBhZ2VDb21wb25lbnQsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQlTYXNoRm9ybSBlZGl0b3IgPSBuZXcgU2FzaEZvcm0ocGFnZUNvbXBvbmVudCwgU1dULlZFUlRJQ0FMKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEyID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdyaWREYXRhMi5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWVkaXRvci5zZXRMYXlvdXREYXRhKGdyaWREYXRhMik7Ci0JCVNhc2hGb3JtIHRvcCA9IG5ldyBTYXNoRm9ybShlZGl0b3IsIFNXVC5IT1JJWk9OVEFMKTsKLQkJQ29tcG9zaXRlIHN0eWxlRWRpdG9yID0gY3JlYXRlQ29tcG9zaXRlKHRvcCwgMSk7Ci0JCSgoR3JpZExheW91dCkgc3R5bGVFZGl0b3IuZ2V0TGF5b3V0KCkpLm1hcmdpblJpZ2h0ID0gNTsKLQkJKChHcmlkTGF5b3V0KSBzdHlsZUVkaXRvci5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDA7Ci0JCWNyZWF0ZUxhYmVsKHN0eWxlRWRpdG9yLCBKU1BVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV8wKTsKLQkJZlN0eWxlc1ZpZXdlciA9IGNyZWF0ZVN0eWxlc1ZpZXdlcihzdHlsZUVkaXRvcik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZTdHlsZVRvRGVzY3JpcHRpb25NYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gTWF0aC5tYXgoZ3JpZERhdGEud2lkdGhIaW50LCBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoaXRlcmF0b3IubmV4dCgpLnRvU3RyaW5nKCkubGVuZ3RoKCkpKTsKLQkJfQotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJZlN0eWxlc1ZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJQ29tcG9zaXRlIGVkaXRpbmdDb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUodG9wLCAxKTsKLQkJKChHcmlkTGF5b3V0KSBzdHlsZUVkaXRvci5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDU7Ci0JCWNyZWF0ZUxhYmVsKGVkaXRpbmdDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdXR0b24gZW5hYmxlciA9IGNyZWF0ZUNoZWNrYm94KGVkaXRpbmdDb21wb3NpdGUsIEpTUFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzIpOwotCQllbmFibGVyLnNldEVuYWJsZWQoZmFsc2UpOwotCQllbmFibGVyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJQ29tcG9zaXRlIGVkaXRDb250cm9scyA9IGNyZWF0ZUNvbXBvc2l0ZShlZGl0aW5nQ29tcG9zaXRlLCAyKTsKLQkJKChHcmlkTGF5b3V0KSBlZGl0Q29udHJvbHMuZ2V0TGF5b3V0KCkpLm1hcmdpbkxlZnQgPSAyMDsKLQotCQlmRm9yZWdyb3VuZExhYmVsID0gY3JlYXRlTGFiZWwoZWRpdENvbnRyb2xzLCBTU0VVSU1lc3NhZ2VzLkZvcmVncm91bmRfVUlfKTsKLQkJKChHcmlkRGF0YSkgZkZvcmVncm91bmRMYWJlbC5nZXRMYXlvdXREYXRhKCkpLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJZkZvcmVncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yID0gbmV3IENvbG9yU2VsZWN0b3IoZWRpdENvbnRyb2xzKTsKLQkJQnV0dG9uIGZGb3JlZ3JvdW5kQ29sb3IgPSBmRm9yZWdyb3VuZENvbG9yRWRpdG9yLmdldEJ1dHRvbigpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJZkZvcmVncm91bmRDb2xvci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlmQmFja2dyb3VuZExhYmVsID0gY3JlYXRlTGFiZWwoZWRpdENvbnRyb2xzLCBTU0VVSU1lc3NhZ2VzLkJhY2tncm91bmRfVUlfKTsKLQkJKChHcmlkRGF0YSkgZkJhY2tncm91bmRMYWJlbC5nZXRMYXlvdXREYXRhKCkpLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJZkJhY2tncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yID0gbmV3IENvbG9yU2VsZWN0b3IoZWRpdENvbnRyb2xzKTsKLQkJQnV0dG9uIGZCYWNrZ3JvdW5kQ29sb3IgPSBmQmFja2dyb3VuZENvbG9yRWRpdG9yLmdldEJ1dHRvbigpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJZkJhY2tncm91bmRDb2xvci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZkJhY2tncm91bmRDb2xvckVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlmQm9sZCA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywgSlNQVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfMyk7Ci0JCWZCb2xkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBmQm9sZC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkl0YWxpYyA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywgSlNQVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfNCk7Ci0JCWZJdGFsaWMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZJdGFsaWMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZTdHJpa2UgPSBjcmVhdGVDaGVja2JveChlZGl0Q29udHJvbHMsIEpTUFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzUpOwotCQlmU3RyaWtlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBmU3RyaWtlLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmVW5kZXJsaW5lID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBKU1BVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV82KTsKLQkJZlVuZGVybGluZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJKChHcmlkRGF0YSkgZlVuZGVybGluZS5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkNsZWFyU3R5bGUgPSBuZXcgQnV0dG9uKGVkaXRpbmdDb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJZkNsZWFyU3R5bGUuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlJlc3RvcmVfRGVmYXVsdF9VSV8pOyAvLyROT04tTkxTLTEkID0gIlJlc3RvcmUgRGVmYXVsdCIKLQkJZkNsZWFyU3R5bGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORykpOwotCQkoKEdyaWREYXRhKSBmQ2xlYXJTdHlsZS5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxJbmRlbnQgPSAyMDsKLQkJZkNsZWFyU3R5bGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJQ29tcG9zaXRlIHNhbXBsZUFyZWEgPSBjcmVhdGVDb21wb3NpdGUoZWRpdG9yLCAxKTsKLQotCQkoKEdyaWRMYXlvdXQpIHNhbXBsZUFyZWEuZ2V0TGF5b3V0KCkpLm1hcmdpbkxlZnQgPSA1OwotCQkoKEdyaWRMYXlvdXQpIHNhbXBsZUFyZWEuZ2V0TGF5b3V0KCkpLm1hcmdpblRvcCA9IDU7Ci0JCWNyZWF0ZUxhYmVsKHNhbXBsZUFyZWEsIFNTRVVJTWVzc2FnZXMuU2FtcGxlX3RleHRfX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiJlNhbXBsZSB0ZXh0OiIKLQkJU291cmNlVmlld2VyIHZpZXdlciA9IG5ldyBTb3VyY2VWaWV3ZXIoc2FtcGxlQXJlYSwgbnVsbCwgU1dULkJPUkRFUiB8IFNXVC5MRUZUX1RPX1JJR0hUIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULlJFQURfT05MWSk7Ci0JCWZUZXh0ID0gdmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEzID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdyaWREYXRhMy53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoMjApOwotCQlncmlkRGF0YTMuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoNSk7Ci0JCWdyaWREYXRhMy5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEzKTsKLQkJZlRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQlmVGV4dC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnQoIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZlRleHQuYWRkS2V5TGlzdGVuZXIoZ2V0VGV4dEtleUxpc3RlbmVyKCkpOwotCQlmVGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRUZXh0U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZE1vdXNlTGlzdGVuZXIoZ2V0VGV4dE1vdXNlTGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZFRyYXZlcnNlTGlzdGVuZXIoZ2V0VHJhdmVyc2VMaXN0ZW5lcigpKTsKLQkJc2V0QWNjZXNzaWJsZShmVGV4dCwgU1NFVUlNZXNzYWdlcy5TYW1wbGVfdGV4dF9fVUlfKTsKLQkJZkRvY3VtZW50ID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5jcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0JCWZEb2N1bWVudC5zZXQoZ2V0RXhhbXBsZVRleHQoKSk7Ci0JCXZpZXdlci5zZXREb2N1bWVudChmRG9jdW1lbnQpOwotCi0JCXRvcC5zZXRXZWlnaHRzKG5ldyBpbnRbXXsxLCAxfSk7Ci0JCWVkaXRvci5zZXRXZWlnaHRzKG5ldyBpbnRbXXsxLCAxfSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFnZUNvbXBvbmVudCwgSUhlbHBDb250ZXh0SWRzLkpTUF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQotCQlmU3R5bGVzVmlld2VyLnNldElucHV0KGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKSk7Ci0KLQkJYXBwbHlTdHlsZXMoKTsKLQotCQlmU3R5bGVzVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFldmVudC5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQkJCQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuYWRkTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhDb2xvclNlbGVjdG9yLlBST1BfQ09MT1JDSEFOR0UpKSB7Ci0JCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMF07Ci0JCQkJCQkvLyBvcGVuIGNvbG9yIGRpYWxvZyB0byBnZXQgbmV3IGNvbG9yCi0JCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBDb2xvckhlbHBlci50b1JHQlN0cmluZyhmRm9yZWdyb3VuZENvbG9yRWRpdG9yLmdldENvbG9yVmFsdWUoKSk7Ci0KLQkJCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJCXN0eWxlUHJlZnNbMF0gPSBuZXdWYWx1ZTsKLQkJCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuYWRkTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhDb2xvclNlbGVjdG9yLlBST1BfQ09MT1JDSEFOR0UpKSB7Ci0JCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMV07Ci0JCQkJCQkvLyBvcGVuIGNvbG9yIGRpYWxvZyB0byBnZXQgbmV3IGNvbG9yCi0JCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBDb2xvckhlbHBlci50b1JHQlN0cmluZyhmQmFja2dyb3VuZENvbG9yRWRpdG9yLmdldENvbG9yVmFsdWUoKSk7Ci0KLQkJCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJCXN0eWxlUHJlZnNbMV0gPSBuZXdWYWx1ZTsKLQkJCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCQkJYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZCb2xkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMl07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZCb2xkLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzJdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZJdGFsaWMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1szXTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZkl0YWxpYy5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJc3R5bGVQcmVmc1szXSA9IG5ld1ZhbHVlOwotCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmU3RyaWtlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbNF07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZTdHJpa2UuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbNF0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZlVuZGVybGluZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkvLyBnZXQgY3VycmVudCAobmV3bHkgb2xkKSBzdHlsZQotCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzVdOwotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBTdHJpbmcudmFsdWVPZihmVW5kZXJsaW5lLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzVdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZDbGVhclN0eWxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkudG9TdHJpbmcoKTsKLQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRUb0RlZmF1bHQobmFtZWRTdHlsZSk7Ci0JCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIHBhZ2VDb21wb25lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5XUkFQKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWxhYmVsLnNldEJhY2tncm91bmQocGFyZW50LmdldEJhY2tncm91bmQoKSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvLyBwcm90ZWN0ZWQgTGFiZWwgY3JlYXRlRGVzY3JpcHRpb25MYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JLy8gcmV0dXJuIG51bGw7Ci0JLy8gfQotCi0JLyoqCi0JICogU2V0IHVwIGFsbCB0aGUgc3R5bGUgcHJlZmVyZW5jZSBrZXlzIGluIHRoZSBvdmVybGF5IHN0b3JlCi0JICovCi0JcHJpdmF0ZSBPdmVybGF5S2V5W10gY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpIHsKLQkJTGlzdCBvdmVybGF5S2V5cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlJdGVyYXRvciBpID0gZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5TVFJJTkcsIChTdHJpbmcpIGkubmV4dCgpKSk7Ci0JCX0KLQotCQlPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbXSBrZXlzID0gbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtvdmVybGF5S2V5cy5zaXplKCldOwotCQlvdmVybGF5S2V5cy50b0FycmF5KGtleXMpOwotCQlyZXR1cm4ga2V5czsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBMaXN0IHZpZXdlciB3aGVyZSB3ZSBzZWUgdGhlIHZhcmlvdXMgc3ludGF4IGVsZW1lbnQgZGlzcGxheQotCSAqIG5hbWVzLS13b3VsZCBpdCBldmVyIGJlIGEgVHJlZSBsaWtlIEpEVCdzPwotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVmlld2VyIGNyZWF0ZVN0eWxlc1ZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVN0cnVjdHVyZWRWaWV3ZXIgc3R5bGVzVmlld2VyID0gbmV3IExpc3RWaWV3ZXIocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCXN0eWxlc1ZpZXdlci5zZXRDb21wYXJhdG9yKG5ldyBWaWV3ZXJDb21wYXJhdG9yKENvbGxhdG9yLmdldEluc3RhbmNlKCkpKTsKLQkJc3R5bGVzVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlPYmplY3QgZGVzY3JpcHRpb24gPSBmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLmdldChlbGVtZW50KTsKLQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGRlc2NyaXB0aW9uLnRvU3RyaW5nKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0pOwotCQlzdHlsZXNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJVHJlZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJCXJldHVybiBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCkudG9BcnJheSgpOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBzdHlsZXNWaWV3ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGZPdmVybGF5U3RvcmUgIT0gbnVsbCkgewotCQkJZk92ZXJsYXlTdG9yZS5zdG9wKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCXByaXZhdGUgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoU3RyaW5nIG5hbWVkU3R5bGUpIHsKLQkJVGV4dEF0dHJpYnV0ZSB0YSA9IG5ldyBUZXh0QXR0cmlidXRlKGZEZWZhdWx0Rm9yZWdyb3VuZCwgZkRlZmF1bHRCYWNrZ3JvdW5kLCBTV1QuTk9STUFMKTsKLQotCQlpZiAobmFtZWRTdHlsZSAhPSBudWxsICYmIGZPdmVybGF5U3RvcmUgIT0gbnVsbCkgewotCQkJLy8gbm90ZTogIm5hbWVkU3R5bGUiICppcyogdGhlIHByZWZlcmVuY2Uga2V5Ci0JCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCVJHQiBmb3JlZ3JvdW5kID0gQ29sb3JIZWxwZXIudG9SR0Ioc3R5bGVQcmVmc1swXSk7Ci0JCQkJUkdCIGJhY2tncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzFdKTsKLQotCQkJCWludCBmb250TW9kaWZpZXIgPSBTV1QuTk9STUFMOwotCi0JCQkJaWYgKHN0eWxlUHJlZnMubGVuZ3RoID4gMikgewotCQkJCQlib29sZWFuIG9uID0gQm9vbGVhbi52YWx1ZU9mKHN0eWxlUHJlZnNbMl0pLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQlpZiAob24pCi0JCQkJCQlmb250TW9kaWZpZXIgPSBmb250TW9kaWZpZXIgfCBTV1QuQk9MRDsKLQkJCQl9Ci0JCQkJaWYgKHN0eWxlUHJlZnMubGVuZ3RoID4gMykgewotCQkJCQlib29sZWFuIG9uID0gQm9vbGVhbi52YWx1ZU9mKHN0eWxlUHJlZnNbM10pLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQlpZiAob24pCi0JCQkJCQlmb250TW9kaWZpZXIgPSBmb250TW9kaWZpZXIgfCBTV1QuSVRBTElDOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiA0KSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1s0XSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFRleHRBdHRyaWJ1dGUuU1RSSUtFVEhST1VHSDsKLQkJCQl9Ci0JCQkJaWYgKHN0eWxlUHJlZnMubGVuZ3RoID4gNSkgewotCQkJCQlib29sZWFuIG9uID0gQm9vbGVhbi52YWx1ZU9mKHN0eWxlUHJlZnNbNV0pLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQlpZiAob24pCi0JCQkJCQlmb250TW9kaWZpZXIgPSBmb250TW9kaWZpZXIgfCBUZXh0QXR0cmlidXRlLlVOREVSTElORTsKLQkJCQl9Ci0KLQkJCQl0YSA9IG5ldyBUZXh0QXR0cmlidXRlKChmb3JlZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihmb3JlZ3JvdW5kKSA6IG51bGwsIChiYWNrZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihiYWNrZ3JvdW5kKSA6IG51bGwsIGZvbnRNb2RpZmllcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRhOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEV4YW1wbGVUZXh0KCkgewotCQlyZXR1cm4gSlNQVUlNZXNzYWdlcy5TYW1wbGVfSlNQX2RvYzsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXROYW1lZFN0eWxlQXRPZmZzZXQoaW50IG9mZnNldCkgewotCQkvLyBlbnN1cmUgdGhlIG9mZnNldCBpcyBjbGVhbgotCQlpZiAob2Zmc2V0ID49IGZEb2N1bWVudC5nZXRMZW5ndGgoKSkKLQkJCXJldHVybiBnZXROYW1lZFN0eWxlQXRPZmZzZXQoZkRvY3VtZW50LmdldExlbmd0aCgpIC0gMSk7Ci0JCWVsc2UgaWYgKG9mZnNldCA8IDApCi0JCQlyZXR1cm4gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KDApOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gZkRvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCXdoaWxlIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsICYmICFkb2N1bWVudFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQlkb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uLmdldE5leHQoKTsKLQkJfQotCQlpZiAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJLy8gZmluZCB0aGUgSVRleHRSZWdpb24ncyBDb250ZXh0IGF0IHRoaXMgb2Zmc2V0Ci0JCQlJVGV4dFJlZ2lvbiBpbnRlcmVzdCA9IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlpZiAoaW50ZXJlc3QgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChvZmZzZXQgPiBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KGludGVyZXN0KSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCVN0cmluZyByZWdpb25Db250ZXh0ID0gaW50ZXJlc3QuZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvbkNvbnRleHQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCS8vIGZpbmQgdGhlIG5hbWVkIHN0eWxlIChpbnRlcm5hbC9zZWxlY3RhYmxlIG5hbWUpIGZvciB0aGF0Ci0JCQkvLyBjb250ZXh0Ci0JCQlTdHJpbmcgbmFtZWRTdHlsZSA9IChTdHJpbmcpIGZDb250ZXh0VG9TdHlsZU1hcC5nZXQocmVnaW9uQ29udGV4dCk7Ci0JCQlpZiAobmFtZWRTdHlsZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5hbWVkU3R5bGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBPdmVybGF5UHJlZmVyZW5jZVN0b3JlIGdldE92ZXJsYXlTdG9yZSgpIHsKLQkJcmV0dXJuIGZPdmVybGF5U3RvcmU7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKSB7Ci0JCWlmIChmU3R5bGVQcmVmZXJlbmNlS2V5cyA9PSBudWxsKSB7Ci0JCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhUKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNKU1AuSlNQX0NPTlRFTlQpOwotCQkJZlN0eWxlUHJlZmVyZW5jZUtleXMgPSBzdHlsZXM7Ci0JCX0KLQkJcmV0dXJuIGZTdHlsZVByZWZlcmVuY2VLZXlzOwotCX0KLQotCXByaXZhdGUgS2V5TGlzdGVuZXIgZ2V0VGV4dEtleUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEtleUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW91c2VMaXN0ZW5lciBnZXRUZXh0TW91c2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb3VzZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJaW50IHggPSAoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5nZXRDYXJldE9mZnNldCgpOwotCQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KHgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGdldFRleHRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0Q29sb3JBdE9mZnNldChlLngpOwotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJKChTdHlsZWRUZXh0KSBlLndpZGdldCkuc2V0U2VsZWN0aW9uKGUueCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0Q29sb3JBdE9mZnNldChlLngpOwotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJKChTdHlsZWRUZXh0KSBlLndpZGdldCkuc2V0U2VsZWN0aW9uKGUueCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhdmVyc2VMaXN0ZW5lciBnZXRUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyI2tleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpZiAoKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCkgfHwgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfUFJFVklPVVMpKQotCQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQlzZXREZXNjcmlwdGlvbihTU0VVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nX0Rlc2NyaXB0aW9uKTsKLQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlpbml0U3R5bGVUb0Rlc2NyaXB0aW9uTWFwKCk7Ci0JCWluaXRSZWdpb25Db250ZXh0VG9TdHlsZU1hcCgpOwotCi0JCWZPdmVybGF5U3RvcmUgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZShnZXRQcmVmZXJlbmNlU3RvcmUoKSwgY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpKTsKLQkJZk92ZXJsYXlTdG9yZS5sb2FkKCk7Ci0JCWZPdmVybGF5U3RvcmUuc3RhcnQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFJlZ2lvbkNvbnRleHRUb1N0eWxlTWFwKCkgewotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UsIElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFLCBJU3R5bGVDb25zdGFudHNYTUwuRU5USVRZX1JFRkVSRU5DRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfUEVfUkVGRVJFTkNFLCBJU3R5bGVDb25zdGFudHNYTUwuRU5USVRZX1JFRkVSRU5DRSk7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTiwgSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTiwgSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4sIElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4sIElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX0NMT1NFLCBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFLCBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgSVN0eWxlQ29uc3RhbnRzSlNQLkpTUF9DT05URU5UKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX1RFWFQsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRTdHlsZVRvRGVzY3JpcHRpb25NYXAoKSB7Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUiwgWE1MVUlNZXNzYWdlcy5Db21tZW50X0RlbGltaXRlcnNfVUlfKTsgLy8gPQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhULCBYTUxVSU1lc3NhZ2VzLkNvbW1lbnRfQ29udGVudF9VSV8pOyAvLyA9Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLlRhZ19EZWxpbWl0ZXJzX1VJXyk7IC8vID0KLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FLCBYTUxVSU1lc3NhZ2VzLlRhZ19OYW1lc19VSV8pOyAvLyA9Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUsIFhNTFVJTWVzc2FnZXMuQXR0cmlidXRlX05hbWVzX1VJXyk7IC8vID0KLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUsIFhNTFVJTWVzc2FnZXMuQXR0cmlidXRlX1ZhbHVlc19VSV8pOyAvLyA9Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFLCBYTUxVSU1lc3NhZ2VzLkVudGl0eV9SZWZlcmVuY2VfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJFbnRpdHkgUmVmZXJlbmNlcyIKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIsIEpTUFVJTWVzc2FnZXMuSlNQX0RlbGltaXRlcnNfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJKU1AgRGVsaW1pdGVycyIKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzSlNQLkpTUF9DT05URU5ULCBKU1BVSU1lc3NhZ2VzLkpTUENvbG9yUGFnZV9qc3BfY29udGVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJZ2V0T3ZlcmxheVN0b3JlKCkubG9hZERlZmF1bHRzKCk7Ci0JCWFwcGx5U3R5bGVzKCk7Ci0JCWZTdHlsZXNWaWV3ZXIuc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOwotCQlhY3RpdmF0ZShudWxsKTsKLQkJZlRleHQucmVkcmF3KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlnZXRPdmVybGF5U3RvcmUoKS5wcm9wYWdhdGUoKTsKLQotCQlKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdENvbG9yQXRPZmZzZXQoaW50IG9mZnNldCkgewotCQlTdHJpbmcgbmFtZWRTdHlsZSA9IGdldE5hbWVkU3R5bGVBdE9mZnNldChvZmZzZXQpOwotCQlpZiAobmFtZWRTdHlsZSAhPSBudWxsKSB7Ci0JCQlmU3R5bGVzVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuYW1lZFN0eWxlKSk7Ci0JCQlmU3R5bGVzVmlld2VyLnJldmVhbChuYW1lZFN0eWxlKTsKLQkJfQotCQllbHNlIHsKLQkJCWZTdHlsZXNWaWV3ZXIuc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOwotCQl9Ci0JCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCX0KLQotCS8qKgotCSAqIFNwZWNpZmljYWxseSBzZXQgdGhlIHJlcG9ydGluZyBuYW1lIG9mIGEgY29udHJvbCBmb3IgYWNjZXNzaWJpbGl0eQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRBY2Nlc3NpYmxlKENvbnRyb2wgY29udHJvbCwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGNvbnRyb2wgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZmluYWwgU3RyaW5nIG4gPSBuYW1lOwotCQljb250cm9sLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCWlmIChlLmNoaWxkSUQgPT0gQUNDLkNISUxESURfU0VMRikKLQkJCQkJZS5yZXN1bHQgPSBuOwotCQkJfQotCQl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ2MzdhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnRlbXBsYXRlcy5UZW1wbGF0ZVByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLQotCi0vKioKLSAqIFByZWZlcmVuY2UgcGFnZSBmb3IgSlNQIHRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgSlNQVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UgewotCWNsYXNzIEpTUEVkaXRUZW1wbGF0ZURpYWxvZyBleHRlbmRzIEVkaXRUZW1wbGF0ZURpYWxvZyB7Ci0JCXB1YmxpYyBKU1BFZGl0VGVtcGxhdGVEaWFsb2coU2hlbGwgcGFyZW50LCBUZW1wbGF0ZSB0ZW1wbGF0ZSwgYm9vbGVhbiBlZGl0LCBib29sZWFuIGlzTmFtZU1vZGlmaWFibGUsIENvbnRleHRUeXBlUmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJCXN1cGVyKHBhcmVudCwgdGVtcGxhdGUsIGVkaXQsIGlzTmFtZU1vZGlmaWFibGUsIHJlZ2lzdHJ5KTsKLQkJfQotCi0JCXByb3RlY3RlZCBTb3VyY2VWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsJCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGJhc2VDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUCgpOwotCi0JCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJQ29udGVudEFzc2lzdGFudCBnZXRDb250ZW50QXNzaXN0YW50KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJQ29udGVudEFzc2lzdGFudCBhc3Npc3RhbnQgPSBuZXcgQ29udGVudEFzc2lzdGFudCgpOwotCQkJCWFzc2lzdGFudC5lbmFibGVBdXRvQWN0aXZhdGlvbih0cnVlKTsKLQkJCQlhc3Npc3RhbnQuZW5hYmxlQXV0b0luc2VydCh0cnVlKTsKLQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihnZXRUZW1wbGF0ZVByb2Nlc3NvcigpLCBJRG9jdW1lbnQuREVGQVVMVF9DT05URU5UX1RZUEUpOwotCQkJCXJldHVybiBhc3Npc3RhbnQ7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBkb0NyZWF0ZVZpZXdlcihwYXJlbnQsIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24pOwotfQotCX0KLQotCXB1YmxpYyBKU1BUZW1wbGF0ZVByZWZlcmVuY2VQYWdlKCkgewotCQlKU1BVSVBsdWdpbiBqc3BFZGl0b3JQbHVnaW4gPSBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0KLQkJc2V0UHJlZmVyZW5jZVN0b3JlKGpzcEVkaXRvclBsdWdpbi5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCXNldFRlbXBsYXRlU3RvcmUoanNwRWRpdG9yUGx1Z2luLmdldFRlbXBsYXRlU3RvcmUoKSk7Ci0JCXNldENvbnRleHRUeXBlUmVnaXN0cnkoanNwRWRpdG9yUGx1Z2luLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gb2sgPSBzdXBlci5wZXJmb3JtT2soKTsKLQkJSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gb2s7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnRlbXBsYXRlcy5UZW1wbGF0ZVByZWZlcmVuY2VQYWdlI2lzU2hvd0Zvcm1hdHRlclNldHRpbmcoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU2hvd0Zvcm1hdHRlclNldHRpbmcoKSB7Ci0JCS8vIHRlbXBsYXRlIGZvcm1hdHRpbmcgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb250cm9sIGMgPSBzdXBlci5jcmVhdGVDb250ZW50cyhhbmNlc3Rvcik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYywgSUhlbHBDb250ZXh0SWRzLkpTUF9QUkVGV0VCWF9URU1QTEFURVNfSEVMUElEKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnRlbXBsYXRlcy5UZW1wbGF0ZVByZWZlcmVuY2VQYWdlI2NyZWF0ZVZpZXdlcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIFNvdXJjZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGJhc2VDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUCgpOwotCi0JCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBkb0NyZWF0ZVZpZXdlcihwYXJlbnQsIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24pOwotCX0KLQotCVNvdXJjZVZpZXdlciBkb0NyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHZpZXdlckNvbmZpZ3VyYXRpb24pIHsKLQkJU291cmNlVmlld2VyIHZpZXdlciA9IG51bGw7Ci0JCVN0cmluZyBjb250ZW50VHlwZUlEID0gQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUDsKLQkJdmlld2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIpLmdldFRleHRXaWRnZXQoKS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnQoIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWRNb2RlbCBzY3JhdGNoTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihjb250ZW50VHlwZUlEKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gc2NyYXRjaE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQl2aWV3ZXIuY29uZmlndXJlKHZpZXdlckNvbmZpZ3VyYXRpb24pOwotCQl2aWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGVkaXQgZGlhbG9nLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlCi0JICogYSBjdXN0b20gZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wbGF0ZQotCSAqICAgICAgICAgICAgdGhlIHRlbXBsYXRlIGJlaW5nIGVkaXRlZAotCSAqIEBwYXJhbSBlZGl0Ci0JICogICAgICAgICAgICB3aGV0aGVyIHRoZSBkaWFsb2cgc2hvdWxkIGJlIGVkaXRhYmxlCi0JICogQHBhcmFtIGlzTmFtZU1vZGlmaWFibGUKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIHRlbXBsYXRlIG5hbWUgbWF5IGJlIG1vZGlmaWVkCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBvciBtb2RpZmllZCB0ZW1wbGF0ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogICAgICAgICBlZGl0aW9uIGZhaWxlZAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcm90ZWN0ZWQgVGVtcGxhdGUgZWRpdFRlbXBsYXRlKFRlbXBsYXRlIHRlbXBsYXRlLCBib29sZWFuIGVkaXQsIGJvb2xlYW4gaXNOYW1lTW9kaWZpYWJsZSkgewotCQlFZGl0VGVtcGxhdGVEaWFsb2cgZGlhbG9nID0gbmV3IEpTUEVkaXRUZW1wbGF0ZURpYWxvZyhnZXRTaGVsbCgpLCB0ZW1wbGF0ZSwgZWRpdCwgaXNOYW1lTW9kaWZpYWJsZSwgZ2V0Q29udGV4dFR5cGVSZWdpc3RyeSgpKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm4gZGlhbG9nLmdldFRlbXBsYXRlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUFR5cGluZ1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQVHlwaW5nUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiMmQ4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQVHlwaW5nUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlNQVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlOwotCi1wdWJsaWMgY2xhc3MgSlNQVHlwaW5nUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgQnV0dG9uIGZDbG9zZUJyYWNlczsKLQlwcml2YXRlIEJ1dHRvbiBmQ2xvc2VTY3JpcHRsZXRzOwotCQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHN1cGVyLmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEpOwotCQkKLQkJY3JlYXRlQXV0b0NvbXBsZXRlKGNvbXBvc2l0ZSk7Ci0JCQotCQlzZXRTaXplKGNvbXBvc2l0ZSk7Ci0JCWxvYWRQcmVmZXJlbmNlcygpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUF1dG9Db21wbGV0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAyKTsKLQkJCi0JCWdyb3VwLnNldFRleHQoSlNQVUlNZXNzYWdlcy5KU1BUeXBpbmdfQXV0b19Db21wbGV0ZSk7Ci0JCQotCQlmQ2xvc2VCcmFjZXMgPSBjcmVhdGVDaGVja0JveChncm91cCwgSlNQVUlNZXNzYWdlcy5KU1BUeXBpbmdfQ29tcGxldGVfQnJhY2VzKTsKLQkJKChHcmlkRGF0YSkgZkNsb3NlQnJhY2VzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkKLQkJZkNsb3NlU2NyaXB0bGV0cyA9IGNyZWF0ZUNoZWNrQm94KGdyb3VwLCBKU1BVSU1lc3NhZ2VzLkpTUFR5cGluZ19Db21wbGV0ZV9TY3JpcHRsZXRzKTsKLQkJKChHcmlkRGF0YSkgZkNsb3NlU2NyaXB0bGV0cy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJCi0JfQotCQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtT2soKTsKLQkJCi0JCUpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWluaXRDaGVja2JveChmQ2xvc2VCcmFjZXMsIEpTUFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9FTF9CUkFDRVMpOwotCQlpbml0Q2hlY2tib3goZkNsb3NlU2NyaXB0bGV0cywgSlNQVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX1NDUklQVExFVFMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWRlZmF1bHRDaGVja2JveChmQ2xvc2VCcmFjZXMsIEpTUFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9FTF9CUkFDRVMpOwotCQlkZWZhdWx0Q2hlY2tib3goZkNsb3NlU2NyaXB0bGV0cywgSlNQVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX1NDUklQVExFVFMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdENoZWNrYm94KEJ1dHRvbiBib3gsIFN0cmluZyBrZXkpIHsKLQkJaWYoYm94ICE9IG51bGwgJiYga2V5ICE9IG51bGwpCi0JCQlib3guc2V0U2VsZWN0aW9uKGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oa2V5KSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkZWZhdWx0Q2hlY2tib3goQnV0dG9uIGJveCwgU3RyaW5nIGtleSkgewotCQlpZihib3ggIT0gbnVsbCAmJiBrZXkgIT0gbnVsbCkKLQkJCWJveC5zZXRTZWxlY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0RGVmYXVsdEJvb2xlYW4oa2V5KSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShKU1BVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfRUxfQlJBQ0VTLCAoZkNsb3NlQnJhY2VzICE9IG51bGwpID8gZkNsb3NlQnJhY2VzLmdldFNlbGVjdGlvbigpIDogZmFsc2UpOwotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShKU1BVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfU0NSSVBUTEVUUywgKGZDbG9zZVNjcmlwdGxldHMgIT0gbnVsbCkgPyBmQ2xvc2VTY3JpcHRsZXRzLmdldFNlbGVjdGlvbigpIDogZmFsc2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4MTcyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LkdyaWREYXRhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlNQQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZUxpbmtBcmVhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VzLklXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLlNjcm9sbGVkUGFnZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLlBpeGVsQ29udmVydGVyOwotCi1wdWJsaWMgY2xhc3MgSlNQVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU2V0dGluZ3NQYWdlIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSID0gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUVElOR1NfU0VDVElPTl9OQU1FID0gIkpTUFZhbGlkYXRpb25TZXZlcml0aWVzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBTRVZFUklUSUVTID0ge1ZhbGlkYXRpb25NZXNzYWdlLkVSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HLCBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkV9OwotCi0JLy8gU2hvdWxkIGVxdWFsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5Qcm9ibGVtU2V2ZXJpdGllc1ByZWZlcmVuY2VQYWdlLlBSRUZfSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX1NFVkVSSVRZX1BSRUZFUkVOQ0VfUEFHRSA9ICJvcmcuZWNsaXBzZS5qZHQudWkucHJlZmVyZW5jZXMuUHJvYmxlbVNldmVyaXRpZXNQcmVmZXJlbmNlUGFnZSI7Ci0JLy8gU2hvdWxkIGVxdWFsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5Qcm9ibGVtU2V2ZXJpdGllc1ByZWZlcmVuY2VQYWdlLlBST1BfSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX1NFVkVSSVRZX1BST1BFUlRZX1BBR0UgPSAib3JnLmVjbGlwc2UuamR0LnVpLnByb3BlcnR5UGFnZXMuUHJvYmxlbVNldmVyaXRpZXNQcmVmZXJlbmNlUGFnZSI7Ci0JLy8gU2hvdWxkIGVxdWFsIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5Qcm9wZXJ0eUFuZFByZWZlcmVuY2VQYWdlLkRBVEFfTk9fTElOSwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfTk9fTElOSz0gIlByb3BlcnR5QW5kUHJlZmVyZW5jZVBhZ2Uubm9saW5rIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBQaXhlbENvbnZlcnRlciBmUGl4ZWxDb252ZXJ0ZXI7Ci0JcHJpdmF0ZSBCdXR0b24gZlZhbGlkYXRlRnJhZ21lbnRzOwotCi0JcHJpdmF0ZSBib29sZWFuIGZPcmlnaW5hbFZhbGlkYXRlRnJhZ21lbnRzOwotCi0JcHVibGljIEpTUFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHRleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJQnV0dG9uIGMgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYy5zZXRUZXh0KHRleHQpOwotCQljLnNldExheW91dERhdGEoR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmNyZWF0ZSgpKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29tbW9uQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBDb21wb3NpdGUgcGFnZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJcGFnZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlmUGl4ZWxDb252ZXJ0ZXIgPSBuZXcgUGl4ZWxDb252ZXJ0ZXIocGFyZW50KTsKLQkJCi0JCUdyb3VwIGZpbGVzR3JvdXAgPSBuZXcgR3JvdXAocGFnZSwgU1dULk5PTkUpOwotCQlmaWxlc0dyb3VwLnNldExheW91dERhdGEoR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmdyYWIodHJ1ZSwgZmFsc2UpLmNyZWF0ZSgpKTsKLQkJZmlsZXNHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJZmlsZXNHcm91cC5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuSlNQRmlsZXNQcmVmZXJlbmNlUGFnZV8wKTsKLQkJY3JlYXRlRmlsZXNTZWN0aW9uKGZpbGVzR3JvdXApOwotCi0JCS8vIHNwYWNlcgotLy8JCW5ldyBMYWJlbChwYWdlLCBTV1QuTk9ORSkuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuY3JlYXRlKCkpOwotCi0JCUdyb3VwIHNldmVyaXRpZXNHcm91cCA9IG5ldyBHcm91cChwYWdlLCBTV1QuTk9ORSk7Ci0JCXNldmVyaXRpZXNHcm91cC5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5ncmFiKHRydWUsIHRydWUpLmNyZWF0ZSgpKTsKLQkJc2V2ZXJpdGllc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlzZXZlcml0aWVzR3JvdXAuc2V0VGV4dChKU1BVSU1lc3NhZ2VzLkpTUFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8wKTsKLQkJZmluYWwgQ29tcG9zaXRlIGNvbnRlbnQgPSBjcmVhdGVWYWxpZGF0aW9uU2VjdGlvbihzZXZlcml0aWVzR3JvdXApOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gZlBpeGVsQ29udmVydGVyLmNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoMjApOwotCQljb250ZW50LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXJldHVybiBwYWdlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmcmFnbWVudEdyb3VwCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUZpbGVzU2VjdGlvbihHcm91cCBmcmFnbWVudEdyb3VwKSB7Ci0JCWZWYWxpZGF0ZUZyYWdtZW50cyA9IGNyZWF0ZUNoZWNrQm94KGZyYWdtZW50R3JvdXAsIEpTUFVJTWVzc2FnZXMuSlNQRmlsZXNQcmVmZXJlbmNlUGFnZV8xKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChmVmFsaWRhdGVGcmFnbWVudHMsIElIZWxwQ29udGV4dElkcy5KU1BfUFJFRldFQlhfRklMRVNfSEVMUElEKTsKLQkJSVNjb3BlQ29udGV4dFtdIGNvbnRleHRzID0gY3JlYXRlUHJlZmVyZW5jZVNjb3BlcygpOwotCQlmT3JpZ2luYWxWYWxpZGF0ZUZyYWdtZW50cyA9IGNvbnRleHRzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkuZ2V0Qm9vbGVhbihKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRFX0ZSQUdNRU5UUywgY29udGV4dHNbMV0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5nZXRCb29sZWFuKEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVEVfRlJBR01FTlRTLCB0cnVlKSk7Ci0JCWZWYWxpZGF0ZUZyYWdtZW50cy5zZXRTZWxlY3Rpb24oZk9yaWdpbmFsVmFsaWRhdGVGcmFnbWVudHMpOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZVZhbGlkYXRpb25TZWN0aW9uKENvbXBvc2l0ZSBwYWdlKSB7Ci0JCWludCBuQ29sdW1ucyA9IDM7Ci0KLQkJZmluYWwgU2Nyb2xsZWRQYWdlQ29udGVudCBzcENvbnRlbnQgPSBuZXcgU2Nyb2xsZWRQYWdlQ29udGVudChwYWdlKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3BDb250ZW50LmdldEJvZHkoKTsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KG5Db2x1bW5zLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJTGFiZWwgZGVzY3JpcHRpb24gPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWRlc2NyaXB0aW9uLnNldFRleHQoSlNQVUlNZXNzYWdlcy5WYWxpZGF0aW9uX2Rlc2NyaXB0aW9uKTsKLQkJZGVzY3JpcHRpb24uc2V0Rm9udChwYWdlLmdldEZvbnQoKSk7Ci0KLQkJU3RyaW5nW10gZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzID0gbmV3IFN0cmluZ1tde0pTUFVJTWVzc2FnZXMuVmFsaWRhdGlvbl9FcnJvciwgSlNQVUlNZXNzYWdlcy5WYWxpZGF0aW9uX1dhcm5pbmcsIEpTUFVJTWVzc2FnZXMuVmFsaWRhdGlvbl9JZ25vcmV9OwotCQlDb21wb3NpdGUgc2VjdGlvbjsKLQotCQkvLyBiZWdpbiBkaXJlY3RpdmVzIHNlY3Rpb24KLQkJc2VjdGlvbiA9IGNyZWF0ZVN0eWxlU2VjdGlvbldpdGhDb250ZW50Q29tcG9zaXRlKGNvbXBvc2l0ZSwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0hFQURFUl9ESVJFQ1RJVkUsIG5Db2x1bW5zKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfVU5SRVNPTFZBQkxFX1VSSV9PUl9UQUdESVIsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX1VOUkVTT0xWQUJMRV9VUklfT1JfVEFHRElSLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9EVVBMSUNBVEVfUFJFRklYRVNfRElGRkVSRU5UX1VSSVMsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX0RVUExJQ0FURV9QUkVGSVhFU19ESUZGRVJFTlRfVVJJUywgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCAwKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfRFVQTElDQVRFX1BSRUZJWEVTX1NBTUVfVVJJUywgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfRFVQTElDQVRFX1BSRUZJWEVTX1NBTUVfVVJJUywgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCAwKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0RJUkVDVElWRV9UQUdMSUJfTUlTU0lOR19QUkVGSVgsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX01JU1NJTkdfUFJFRklYLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fRElSRUNUSVZFX1RBR0xJQl9NSVNTSU5HX1VSSV9PUl9UQUdESVIsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfVEFHTElCX01JU1NJTkdfVVJJX09SX1RBR0RJUiwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCAwKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0RJUkVDVElWRV9JTkNMVURFX0ZJTEVfTk9UX0ZPVU5ELCBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRElSRUNUSVZFX0lOQ0xVREVfRklMRV9OT1RfRk9VTkQsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVscywgMCk7Ci0JCWFkZENvbWJvQm94KHNlY3Rpb24sIEpTUFVJTWVzc2FnZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfSU5DTFVERV9OT19GSUxFX1NQRUNJRklFRCwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9JTkNMVURFX05PX0ZJTEVfU1BFQ0lGSUVELCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotLy8JCWFkZENvbWJvQm94KHNlY3Rpb24sIEpTUFVJTWVzc2FnZXMuVkFMSURBVElPTl9ESVJFQ1RJVkVfUEFHRV9TVVBFUkNMQVNTX05PVF9GT1VORCwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0RJUkVDVElWRV9QQUdFX1NVUEVSQ0xBU1NfTk9UX0ZPVU5ELCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQkvLyBlbmQgZGlyZWN0aXZlcyBzZWN0aW9uCi0KLQkJLy8gYmVnaW4gY3VzdG9tIGFjdGlvbnMgc2VjdGlvbgotCQlzZWN0aW9uID0gY3JlYXRlU3R5bGVTZWN0aW9uV2l0aENvbnRlbnRDb21wb3NpdGUoY29tcG9zaXRlLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fSEVBREVSX0NVU1RPTV9BQ1RJT05TLCBuQ29sdW1ucyk7Ci0JCWFkZENvbWJvQm94KHNlY3Rpb24sIEpTUFVJTWVzc2FnZXMuVkFMSURBVElPTl9BQ1RJT05TX1NFVkVSSVRZX01JU1NJTkdfUkVRVUlSRURfQVRUUklCVVRFLCBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9NSVNTSU5HX1JFUVVJUkVEX0FUVFJJQlVURSwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCAwKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfVU5LTk9XTl9BVFRSSUJVVEUsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9BQ1RJT05TX1NFVkVSSVRZX1VOS05PV05fQVRUUklCVVRFLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fQUNUSU9OU19TRVZFUklUWV9OT05fRU1QVFlfSU5MSU5FX1RBRywgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0FDVElPTlNfU0VWRVJJVFlfTk9OX0VNUFRZX0lOTElORV9UQUcsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVscywgMCk7Ci0JCWFkZENvbWJvQm94KHNlY3Rpb24sIEpTUFVJTWVzc2FnZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfVkFMSURBVElPTl9NRVNTQUdFLCBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX1ZBTElEQVRJT05fTUVTU0FHRSwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCAwKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9DTEFTU19OT1RfRk9VTkQsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfTk9UX0ZPVU5ELCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fVFJBTlNMQVRJT05fVEVJX0NMQVNTX05PVF9JTlNUQU5USUFURUQsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9URUlfQ0xBU1NfTk9UX0lOU1RBTlRJQVRFRCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCAwKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9DTEFTU19SVU5USU1FX0VYQ0VQVElPTiwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RFSV9DTEFTU19SVU5USU1FX0VYQ0VQVElPTiwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCAwKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RBR19IQU5ETEVSX0NMQVNTX05PVF9GT1VORCwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX1RSQU5TTEFUSU9OX1RBR19IQU5ETEVSX0NMQVNTX05PVF9GT1VORCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCAwKTsKLQkJLy8gZW5kIGN1c3RvbSBhY3Rpb25zIHNlY3Rpb24KLQotCQkvLyBiZWdpbiBzdGFuZGFyZCBhY3Rpb25zIHNlY3Rpb24KLQkJc2VjdGlvbiA9IGNyZWF0ZVN0eWxlU2VjdGlvbldpdGhDb250ZW50Q29tcG9zaXRlKGNvbXBvc2l0ZSwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0hFQURFUl9TVEFOREFSRF9BQ1RJT05TLCBuQ29sdW1ucyk7Ci0JCWFkZENvbWJvQm94KHNlY3Rpb24sIEpTUFVJTWVzc2FnZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9VU0VCRUFOX0lOVkFMSURfSUQsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9VU0VCRUFOX0lOVkFMSURfSUQsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVscywgMCk7Ci0JCWFkZENvbWJvQm94KHNlY3Rpb24sIEpTUFVJTWVzc2FnZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9VU0JFQU5fTUlTU0lOR19UWVBFX0lORk8sIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9VU0JFQU5fTUlTU0lOR19UWVBFX0lORk8sIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVscywgMCk7Ci0JCWFkZENvbWJvQm94KHNlY3Rpb24sIEpTUFVJTWVzc2FnZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9VU0VCRUFOX0FNQklHVU9VU19UWVBFX0lORk8sIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9UUkFOU0xBVElPTl9VU0VCRUFOX0FNQklHVU9VU19UWVBFX0lORk8sIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVscywgMCk7Ci0JCS8vIGVuZCBzdGFuZGFyZCBhY3Rpb25zIHNlY3Rpb24KLQotCQkvLyBiZWdpbiBKYXZhIHNldmVyaXR5IG92ZXJyaWRlIHNlY3Rpb24KLQkJc2VjdGlvbiA9IGNyZWF0ZVN0eWxlU2VjdGlvbldpdGhDb250ZW50Q29tcG9zaXRlKGNvbXBvc2l0ZSwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0hFQURFUl9KQVZBLCBuQ29sdW1ucyk7Ci0JCWlmIChnZXRQcm9qZWN0KCkgPT0gbnVsbCkgewotCQkJbmV3IFByZWZlcmVuY2VMaW5rQXJlYShzZWN0aW9uLCBTV1QuV1JBUCB8IFNXVC5NVUxUSSB8IFNXVC5MRUZUX1RPX1JJR0hULCBKQVZBX1NFVkVSSVRZX1BSRUZFUkVOQ0VfUEFHRSwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0pBVkFfTk9USUNFLCAoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpIGdldENvbnRhaW5lcigpLCBudWxsKS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuc3BhbigyLCAxKS5pbmRlbnQoMCwgMCkuaGludCgxNTAsIFNXVC5ERUZBVUxUKS5jcmVhdGUoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlNYXAgZGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlkYXRhLnB1dChEQVRBX05PX0xJTkssIEJvb2xlYW4uVFJVRSk7Ci0JCQluZXcgUHJlZmVyZW5jZUxpbmtBcmVhKHNlY3Rpb24sIFNXVC5XUkFQIHwgU1dULk1VTFRJIHwgU1dULkxFRlRfVE9fUklHSFQsIEpBVkFfU0VWRVJJVFlfUFJPUEVSVFlfUEFHRSwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0pBVkFfTk9USUNFLCAoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpIGdldENvbnRhaW5lcigpLCBkYXRhKS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuc3BhbigyLCAxKS5pbmRlbnQoMCwgMCkuaGludCgxNTAsIFNXVC5ERUZBVUxUKS5jcmVhdGUoKSk7Ci0JCQkvLyBvcGVuIGluIHNhbWUgc2hlbGw/Ci0JCQkvLyBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJvcGVydHlEaWFsb2dPbihnZXRTaGVsbCgpLCBnZXRQcm9qZWN0KCksIEpBVkFfU0VWRVJJVFlfUFJPUEVSVFlfUEFHRSwgbmV3IFN0cmluZ1tdIHsgSkFWQV9TRVZFUklUWV9QUk9QRVJUWV9QQUdFIH0sIGRhdGEpLm9wZW4oKTsKLQkJfQotCQlpbnQgc2VjdGlvbkluZGVudCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyKTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0pBVkFfTE9DQUxfVkFSSUFCTEVfTkVWRVJfVVNFRCwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0pBVkFfTE9DQUxfVkFSSUFCTEVfTkVWRVJfVVNFRCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCBzZWN0aW9uSW5kZW50KTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0pBVkFfQVJHVU1FTlRfSVNfTkVWRVJfVVNFRCwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0pBVkFfQVJHVU1FTlRfSVNfTkVWRVJfVVNFRCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCBzZWN0aW9uSW5kZW50KTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0pBVkFfTlVMTF9MT0NBTF9WQVJJQUJMRV9SRUZFUkVOQ0UsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9KQVZBX05VTExfTE9DQUxfVkFSSUFCTEVfUkVGRVJFTkNFLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIHNlY3Rpb25JbmRlbnQpOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fSkFWQV9QT1RFTlRJQUxfTlVMTF9MT0NBTF9WQVJJQUJMRV9SRUZFUkVOQ0UsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9KQVZBX1BPVEVOVElBTF9OVUxMX0xPQ0FMX1ZBUklBQkxFX1JFRkVSRU5DRSwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCBzZWN0aW9uSW5kZW50KTsKLQkJYWRkQ29tYm9Cb3goc2VjdGlvbiwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0pBVkFfVU5VU0VEX0lNUE9SVCwgSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFUSU9OX0pBVkFfVU5VU0VEX0lNUE9SVCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCBzZWN0aW9uSW5kZW50KTsKLQkJLy8gZW5kIEphdmEgc2V2ZXJpdHkgb3ZlcnJpZGUgc2VjdGlvbgotCi0JCS8vIGJlZ2luIEVMIHNlY3Rpb24KLQkJc2VjdGlvbiA9IGNyZWF0ZVN0eWxlU2VjdGlvbldpdGhDb250ZW50Q29tcG9zaXRlKGNvbXBvc2l0ZSwgSlNQVUlNZXNzYWdlcy5WQUxJREFUSU9OX0hFQURFUl9FTCwgbkNvbHVtbnMpOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fRUxfU1lOVEFYLCBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRJT05fRUxfU1lOVEFYLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbHMsIDApOwotCQlhZGRDb21ib0JveChzZWN0aW9uLCBKU1BVSU1lc3NhZ2VzLlZBTElEQVRJT05fRUxfTEVYRVIsIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9FTF9MRVhFUiwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWxzLCAwKTsKLQkJLy8gZW5kIEVMIHNlY3Rpb24KLQotCQlyZXN0b3JlU2VjdGlvbkV4cGFuc2lvblN0YXRlcyhnZXREaWFsb2dTZXR0aW5ncygpLmdldFNlY3Rpb24oU0VUVElOR1NfU0VDVElPTl9OQU1FKSk7Ci0KLQkJcmV0dXJuIHNwQ29udGVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdG9yZVNlY3Rpb25FeHBhbnNpb25TdGF0ZXMoZ2V0RGlhbG9nU2V0dGluZ3MoKS5hZGROZXdTZWN0aW9uKFNFVFRJTkdTX1NFQ1RJT05fTkFNRSkpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSB7Ci0JCXJldHVybiBQUkVGRVJFTkNFX05PREVfUVVBTElGSUVSOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVyZW5jZVBhZ2VJRCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnByZWZlcmVuY2VzLnZhbGlkYXRpb24iOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3RTZXR0aW5nc0tleSgpIHsKLQkJcmV0dXJuIEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVElPTl9VU0VfUFJPSkVDVF9TRVRUSU5HUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5UGFnZUlEKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmpzdC5qc3AudWkucHJvcGVydHlQYWdlLnByb2plY3QudmFsaWRhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybURlZmF1bHRzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXJlc2V0U2V2ZXJpdGllcygpOwotCi0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgZGVmYXVsdENvbnRleHQgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKTsKLQkJYm9vbGVhbiB2YWxpZGF0ZUZyYWdtZW50cyA9IGRlZmF1bHRDb250ZXh0LmdldEJvb2xlYW4oSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFURV9GUkFHTUVOVFMsIHRydWUpOwotCQlmVmFsaWRhdGVGcmFnbWVudHMuc2V0U2VsZWN0aW9uKHZhbGlkYXRlRnJhZ21lbnRzKTsKLQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RTZXR0aW5nc1BhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0JCXN0b3JlVmFsdWVzKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkUmV2YWxpZGF0ZU9uU2V0dGluZ3NDaGFuZ2UoKSB7Ci0JCXJldHVybiBmT3JpZ2luYWxWYWxpZGF0ZUZyYWdtZW50cyAhPSBmVmFsaWRhdGVGcmFnbWVudHMuZ2V0U2VsZWN0aW9uKCkgfHwgc3VwZXIuc2hvdWxkUmV2YWxpZGF0ZU9uU2V0dGluZ3NDaGFuZ2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RWYWxpZGF0aW9uU2V0dGluZ3NQYWdlI3N0b3JlVmFsdWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJc3VwZXIuc3RvcmVWYWx1ZXMoKTsKLQotCQlJU2NvcGVDb250ZXh0W10gY29udGV4dHMgPSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCk7Ci0JCWJvb2xlYW4gdmFsaWRhdGVGcmFnbWVudHMgPSBmVmFsaWRhdGVGcmFnbWVudHMuZ2V0U2VsZWN0aW9uKCk7Ci0JCWNvbnRleHRzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucHV0Qm9vbGVhbihKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRFX0ZSQUdNRU5UUywgdmFsaWRhdGVGcmFnbWVudHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWE1OGYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQ29udGFpbnMgYSBzZXQgb2YgcHJvamVjdGlvbiBtb2RlbCBhZGRpdGlvbnMvZGVsZXRpb25zL21vZGlmaWNhdGlvbnMKLSAqLwotY2xhc3MgUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGxvY2F0ZWQgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCXByaXZhdGUgTm9kZSBmTm9kZTsKLQlwcml2YXRlIEFubm90YXRpb25bXSBmRGVsZXRpb25zOwotCXByaXZhdGUgTWFwIGZBZGRpdGlvbnM7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uW10gZk1vZGlmaWNhdGlvbnM7Ci0KLQlwdWJsaWMgUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMoTm9kZSBub2RlLCBBbm5vdGF0aW9uW10gZGVsZXRpb25zLCBNYXAgYWRkaXRpb25zLCBBbm5vdGF0aW9uW10gbW9kaWZpY2F0aW9ucykgewotCQlmTm9kZSA9IG5vZGU7Ci0JCWZEZWxldGlvbnMgPSBkZWxldGlvbnM7Ci0JCWZBZGRpdGlvbnMgPSBhZGRpdGlvbnM7Ci0JCWZNb2RpZmljYXRpb25zID0gbW9kaWZpY2F0aW9uczsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldEFkZGl0aW9ucygpIHsKLQkJcmV0dXJuIGZBZGRpdGlvbnM7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb25bXSBnZXREZWxldGlvbnMoKSB7Ci0JCXJldHVybiBmRGVsZXRpb25zOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uW10gZ2V0TW9kaWZpY2F0aW9ucygpIHsKLQkJcmV0dXJuIGZNb2RpZmljYXRpb25zOwotCX0KLQotCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCXJldHVybiBmTm9kZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MzJhODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBUb20gVHVycmVsbC1Dcm9mdCwgbGVmdEB1bHRyYXNpcy5jb20gLSBbMTc0MzA3XSBFbmFibGUgZm9sZGluZyBmb3IgZGl2IHRhZ3MgaW4gSlNQIGFuZCBIVE1MIGZpbGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MIGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgbG9jYXRlZCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0KLQkvKioKLQkgKiBMaXN0IG9mIHByb2plY3Rpb24gdmlld2VycyBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdGlvbgotCSAqIG1vZGVsIG5vZGUgYWRhcHRlciBmYWN0b3J5LgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBmUHJvamVjdGlvblZpZXdlcnM7Ci0KLQlwdWJsaWMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTChPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MKE9iamVjdCBhZGFwdGVyS2V5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXkpOwotCX0KLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MKCkgewotCQl0aGlzKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQWN0dWFsbHkgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgcGFyZW50IG9mIHRhcmdldCBpZiB0YXJnZXQgaXMgdGhlCi0JICogImFkYXB0LWFibGUiIG5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJaWYgKChpc0FjdGl2ZSgpKSAmJiAodGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkgJiYgKChOb2RlKSB0YXJnZXQpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSB0YXJnZXQ7Ci0JCQlpZiAoaXNOb2RlUHJvamVjdGFibGUobm9kZSkpIHsKLQotCQkJCS8vIGFjdHVhbGx5IHdvcmsgd2l0aCB0aGUgcGFyZW50IG5vZGUgdG8gbGlzdGVuIGZvciBhZGQsCi0JCQkJLy8gZGVsZXRlIGV2ZW50cwotCQkJCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCQkJSU5vZGVOb3RpZmllciBwYXJlbnROb3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBwYXJlbnQ7Ci0JCQkJCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTCBwYXJlbnRBZGFwdGVyID0gKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTCkgcGFyZW50Tm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzcyk7Ci0JCQkJCWlmIChwYXJlbnRBZGFwdGVyID09IG51bGwpIHsKLQkJCQkJCS8vIGNyZWF0ZSBhIG5ldyBhZGFwdGVyIGZvciBwYXJlbnQKLQkJCQkJCXBhcmVudEFkYXB0ZXIgPSBuZXcgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MKHRoaXMpOwotCQkJCQkJcGFyZW50Tm90aWZpZXIuYWRkQWRhcHRlcihwYXJlbnRBZGFwdGVyKTsKLQkJCQkJfQotCQkJCQkvLyBjYWxsIHVwZGF0ZSBvbiBwYXJlbnQgYmVjYXVzZSBhIG5ldyBub2RlIGhhcyBqdXN0IGJlZW4KLQkJCQkJLy8gYWRkZWQKLQkJCQkJcGFyZW50QWRhcHRlci51cGRhdGVBZGFwdGVyKHBhcmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIG5vZGUgaXMgYSBub2RlIHR5cGUgYWJsZSB0byBmb2xkCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBub2RlIGlzIHByb2plY3RhYmxlLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlib29sZWFuIGlzTm9kZVByb2plY3RhYmxlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCS8vIG5vZGUgaXMgb25seSBwcm9qZWN0YWJsZSBpZiBpdCBpcyBoZWFkLCBib2R5LCBzY3JpcHQsIHN0eWxlLAotCQkJLy8gdGFibGUsIHVsLCBvbCBhbmQgZGl2IHRhZ3MKLQkJCWlmIChIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRC5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZLmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSkgfHwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVC5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRS5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQUJMRS5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5VTC5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PTC5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVYuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBmYWN0b3J5IGlzIGN1cnJlbnRseSBhY3RpdmVseSBtYW5hZ2luZyBwcm9qZWN0aW9uCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCXJldHVybiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwgJiYgIWZQcm9qZWN0aW9uVmlld2Vycy5pc0VtcHR5KCkpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGlmIGRvY3VtZW50IGlzIG5vdCBpbiBmbHV4LgotCSAqIE90aGVyd2lzZSwgcXVldWVzIHVwIHRoZSBjaGFuZ2VzIHRvIGJlIGFwcGxpZWQgd2hlbiBkb2N1bWVudCBpcyByZWFkeS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBkZWxldGlvbnMKLQkgKiBAcGFyYW0gYWRkaXRpb25zCi0JICogQHBhcmFtIG1vZGlmaWNhdGlvbnMKLQkgKi8KLQl2b2lkIHF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhOb2RlIG5vZGUsIEFubm90YXRpb25bXSBkZWxldGlvbnMsIE1hcCBhZGRpdGlvbnMsIEFubm90YXRpb25bXSBtb2RpZmljYXRpb25zKSB7Ci0JCXF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhub2RlLCBkZWxldGlvbnMsIGFkZGl0aW9ucywgbW9kaWZpY2F0aW9ucywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgZm9yIGEgc3BlY2lmaWMgcHJvamVjdGlvbiB2aWV3ZXIgaWYKLQkgKiBkb2N1bWVudCBpcyBub3QgaW4gZmx1eC4gT3RoZXJ3aXNlLCBxdWV1ZXMgdXAgdGhlIGNoYW5nZXMgdG8gYmUgYXBwbGllZAotCSAqIHdoZW4gZG9jdW1lbnQgaXMgcmVhZHkuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gZGVsZXRpb25zCi0JICogQHBhcmFtIGFkZGl0aW9ucwotCSAqIEBwYXJhbSBtb2RpZmljYXRpb25zCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXZvaWQgcXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKE5vZGUgbm9kZSwgQW5ub3RhdGlvbltdIGRlbGV0aW9ucywgTWFwIGFkZGl0aW9ucywgQW5ub3RhdGlvbltdIG1vZGlmaWNhdGlvbnMsIFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIGNyZWF0ZSBhIGNoYW5nZSBvYmplY3QgZm9yIGxhdGVzdCBjaGFuZ2UgYW5kIGFkZCB0byBxdWV1ZQotCQlQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyBuZXdDaGFuZ2UgPSBuZXcgUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMobm9kZSwgZGVsZXRpb25zLCBhZGRpdGlvbnMsIG1vZGlmaWNhdGlvbnMpOwotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwpIHsKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbikgZlByb2plY3Rpb25WaWV3ZXJzLmdldCh2aWV3ZXIpOwotCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJaW5mby5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobmV3Q2hhbmdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJdGVyYXRvciBpbmZvcyA9IGZQcm9qZWN0aW9uVmlld2Vycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpbmZvcy5oYXNOZXh0KCkpIHsKLQkJCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBpbmZvcy5uZXh0KCk7Ci0JCQkJCWluZm8ucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5ld0NoYW5nZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gZ28gdGhyb3VnaCBldmVyeSBwcm9qZWN0aW9udmlld2VyIGFuZCBjYWxsCi0JCS8vIHJlbW92ZVByb2plY3Rpb25WaWV3ZXIodmlld2VyKTsKLQkJaWYgKGZQcm9qZWN0aW9uVmlld2VycyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpbmZvcyA9IGZQcm9qZWN0aW9uVmlld2Vycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGluZm9zLmhhc05leHQoKSkgewotCQkJCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbikgaW5mb3MubmV4dCgpOwotCQkJCWluZm8uZGlzcG9zZSgpOwotCQkJCWluZm9zLnJlbW92ZSgpOwotCQkJfQotCQkJZlByb2plY3Rpb25WaWV3ZXJzID0gbnVsbDsKLQkJfQotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB2aWV3ZXIgdG8gbGlzdCBvZiBwcm9qZWN0aW9uIHZpZXdlcnMgdGhpcyBmYWN0b3J5IGlzIGFzc29jaWF0ZWQKLQkgKiB3aXRoCi0JICogCi0JICogQHBhcmFtIHZpZXdlciAtCi0JICogICAgICAgICAgICBhc3N1bWVzIHZpZXdlcidzIGRvY3VtZW50IGFuZCBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwKLQkgKiAgICAgICAgICAgIGFyZSBub3QgbnVsbAotCSAqLwotCXZvaWQgYWRkUHJvamVjdGlvblZpZXdlcihQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQkvLyByZW1vdmUgb2xkIGVudHJ5IGlmIGl0IGV4aXN0cwotCQlyZW1vdmVQcm9qZWN0aW9uVmlld2VyKHZpZXdlcik7Ci0KLQkJaWYgKGZQcm9qZWN0aW9uVmlld2VycyA9PSBudWxsKSB7Ci0JCQlmUHJvamVjdGlvblZpZXdlcnMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJLy8gY3JlYXRlIG5ldyBvYmplY3QgY29udGFpbmluZyBwcm9qZWN0aW9uIHZpZXdlciBhbmQgaXRzIGluZm8KLQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSBuZXcgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKHZpZXdlcik7Ci0JCWZQcm9qZWN0aW9uVmlld2Vycy5wdXQodmlld2VyLCBpbmZvKTsKLQkJaW5mby5pbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gdmlld2VyIGZyb20gdGhlIGxpc3Qgb2YgcHJvamVjdGlvbiB2aWV3ZXJzIHRoaXMKLQkgKiBmYWN0b3IgaXMgYXNzb2NpYXRlZCB3aXRoCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXZvaWQgcmVtb3ZlUHJvamVjdGlvblZpZXdlcihQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwpIHsKLQkJCS8vIHJlbW92ZSBlbnRyeSBmcm9tIGxpc3Qgb2Ygdmlld2VycwotCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBmUHJvamVjdGlvblZpZXdlcnMucmVtb3ZlKHZpZXdlcik7Ci0JCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJaW5mby5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQkvLyBpZiByZW1vdmluZyBsYXN0IHByb2plY3Rpb24gdmlld2VyLCBjbGVhciBvdXQgZXZlcnl0aGluZwotCQkJaWYgKGZQcm9qZWN0aW9uVmlld2Vycy5pc0VtcHR5KCkpIHsKLQkJCQlmUHJvamVjdGlvblZpZXdlcnMgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyZjg5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SlNQIGV4dGVuZHMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCB7Ci0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUCgpIHsKLQkJdGhpcyhQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUChPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlKU1AoT2JqZWN0IGFkYXB0ZXJLZXkpIHsKLQkJc3VwZXIoYWRhcHRlcktleSk7Ci0JfQotCi0JLyoqCi0JICogQWN0dWFsbHkgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgcGFyZW50IG9mIHRhcmdldCBpZiB0YXJnZXQgaXMgdGhlCi0JICogImFkYXB0LWFibGUiIG5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJaWYgKChpc0FjdGl2ZSgpKSAmJiAodGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkgJiYgKChOb2RlKSB0YXJnZXQpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSB0YXJnZXQ7Ci0JCQlpZiAoaXNOb2RlUHJvamVjdGFibGUobm9kZSkpIHsKLQotCQkJCS8vIGFjdHVhbGx5IHdvcmsgd2l0aCB0aGUgcGFyZW50IG5vZGUgdG8gbGlzdGVuIGZvciBhZGQsCi0JCQkJLy8gZGVsZXRlIGV2ZW50cwotCQkJCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCQkJSU5vZGVOb3RpZmllciBwYXJlbnROb3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBwYXJlbnQ7Ci0JCQkJCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQIHBhcmVudEFkYXB0ZXIgPSAoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1ApIHBhcmVudE5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUC5jbGFzcyk7Ci0JCQkJCWlmIChwYXJlbnRBZGFwdGVyID09IG51bGwpIHsKLQkJCQkJCS8vIGNyZWF0ZSBhIG5ldyBhZGFwdGVyIGZvciBwYXJlbnQKLQkJCQkJCXBhcmVudEFkYXB0ZXIgPSBuZXcgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1AodGhpcyk7Ci0JCQkJCQlwYXJlbnROb3RpZmllci5hZGRBZGFwdGVyKHBhcmVudEFkYXB0ZXIpOwotCQkJCQl9Ci0JCQkJCS8vIGNhbGwgdXBkYXRlIG9uIHBhcmVudCBiZWNhdXNlIGEgbmV3IG5vZGUgaGFzIGp1c3QgYmVlbgotCQkJCQkvLyBhZGRlZAotCQkJCQlwYXJlbnRBZGFwdGVyLnVwZGF0ZUFkYXB0ZXIocGFyZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgbm9kZSBpcyBhIG5vZGUgdHlwZSBhYmxlIHRvIGZvbGQKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG5vZGUgaXMgcHJvamVjdGFibGUsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCWJvb2xlYW4gaXNOb2RlUHJvamVjdGFibGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCVN0cmluZyB0YWdOYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJLy8gbm9kZSBpcyBvbmx5IHByb2plY3RhYmxlIGlmIGl0IGlzIGpzcCBzY3JpcHRsZXQgdGFnCi0JCQlpZiAoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBUTEVULmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZjQzYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgd2l0aCBwcm9qZWN0aW9uIGFubm90YXRpb25zIGZvciB0aGlzCi0gKiBhZGFwdGVyIG5vZGUncyBjaGlsZHJlbgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBsb2NhdGVkIGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb24KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGRlYnVnUHJvamVjdGlvblBlcmYgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvcHJvamVjdGlvbnBlcmYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBjbGFzcyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBleHRlbmRzIFByb2plY3Rpb25Bbm5vdGF0aW9uIHsKLQkJcHJpdmF0ZSBib29sZWFuIGZJc1Zpc2libGUgPSBmYWxzZTsgLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJcHJpdmF0ZSBOb2RlIGZOb2RlOwotCi0JCXB1YmxpYyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbihOb2RlIG5vZGUsIGJvb2xlYW4gaXNDb2xsYXBzZWQpIHsKLQkJCXN1cGVyKGlzQ29sbGFwc2VkKTsKLQkJCWZOb2RlID0gbm9kZTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gZk5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXROb2RlKE5vZGUgbm9kZSkgewotCQkJZk5vZGUgPSBub2RlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIERvZXMgbm90IHBhaW50IGhpZGRlbiBhbm5vdGF0aW9ucy4gQW5ub3RhdGlvbnMgYXJlIGhpZGRlbiB3aGVuIHRoZXkKLQkJICogb25seSBzcGFuIG9uZSBsaW5lLgotCQkgKiAKLQkJICogQHNlZSBQcm9qZWN0aW9uQW5ub3RhdGlvbiNwYWludChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsCi0JCSAqICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgQ2FudmFzIGNhbnZhcywgUmVjdGFuZ2xlIHJlY3RhbmdsZSkgewotCQkJLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJCS8qCi0JCQkgKiBvbmx5IG5lZWQgdG8gY2hlY2sgYW5ub3RhdGlvbnMgdGhhdCBhcmUgZXhwYW5kZWQgYmVjYXVzZSBoaWRkZW4KLQkJCSAqIGFubm90YXRpb25zIHNob3VsZCBuZXZlciBoYXZlIGJlZW4gZ2l2ZW4gdGhlIGNoYW5jZSB0bwotCQkJICogY29sbGFwc2UuCi0JCQkgKi8KLQkJCWlmICghaXNDb2xsYXBzZWQoKSkgewotCQkJCS8vIHdvcmtpbmcgd2l0aCByZWN0YW5nbGUsIHNvIGxpbmUgaGVpZ2h0Ci0JCQkJRm9udE1ldHJpY3MgbWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCQkJaWYgKG1ldHJpY3MgIT0gbnVsbCkgewotCQkJCQkvLyBkbyBub3QgZHJhdyBhbm5vdGF0aW9ucyB0aGF0IG9ubHkgc3BhbiBvbmUgbGluZSBhbmQKLQkJCQkJLy8gbWFyayB0aGVtIGFzIG5vdCB2aXNpYmxlCi0JCQkJCWlmICgocmVjdGFuZ2xlLmhlaWdodCAvIG1ldHJpY3MuZ2V0SGVpZ2h0KCkpIDw9IDEpIHsKLQkJCQkJCWZJc1Zpc2libGUgPSBmYWxzZTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZJc1Zpc2libGUgPSB0cnVlOwotCQkJc3VwZXIucGFpbnQoZ2MsIGNhbnZhcywgcmVjdGFuZ2xlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbiNtYXJrQ29sbGFwc2VkKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1hcmtDb2xsYXBzZWQoKSB7Ci0JCQkvKiB3b3JrYXJvdW5kIGZvciBCVUc4NTg3NCAqLwotCQkJLy8gZG8gbm90IG1hcmsgY29sbGFwc2VkIGlmIGFubm90YXRpb24gaXMgbm90IHZpc2libGUKLQkJCWlmIChmSXNWaXNpYmxlKQotCQkJCXN1cGVyLm1hcmtDb2xsYXBzZWQoKTsKLQkJfQotCX0KLQotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGxvY2F0ZWQgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCi0JUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBmQWRhcHRlckZhY3Rvcnk7Ci0JcHJpdmF0ZSBNYXAgZlRhZ0Fubm90YXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBmYWN0b3J5KSB7Ci0JCWZBZGFwdGVyRmFjdG9yeSA9IGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgcHJvamVjdGlvbiBwb3NpdGlvbiBmcm9tIHRoZSBnaXZlbiBub2RlLiBBYmxlIHRvIGdldAotCSAqIHByb2plY3Rpb24gcG9zaXRpb24gaWYgbm9kZSBpc05vZGVQcm9qZWN0YWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gbnVsbCBpZiBubyBwcm9qZWN0aW9uIHBvc2l0aW9uIHBvc3NpYmxlLCBhIFBvc2l0aW9uIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgUG9zaXRpb24gY3JlYXRlUHJvamVjdGlvblBvc2l0aW9uKE5vZGUgbm9kZSkgewotCQlQb3NpdGlvbiBwb3MgPSBudWxsOwotCQlpZiAoZkFkYXB0ZXJGYWN0b3J5LmlzTm9kZVByb2plY3RhYmxlKG5vZGUpICYmIG5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkvLyBJRG9jdW1lbnQgZG9jdW1lbnQgPQotCQkJLy8gZkFkYXB0ZXJGYWN0b3J5LmdldFByb2plY3Rpb25WaWV3ZXIoKS5nZXREb2N1bWVudCgpOwotCQkJLy8gaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUluZGV4ZWRSZWdpb24gaW5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJCWludCBzdGFydCA9IGlub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpbnQgZW5kID0gaW5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlpZiAoc3RhcnQgPj0gMCAmJiBzdGFydCA8IGVuZCkgewotCQkJCS8vIHJlZ2lvbi1iYXNlZAotCQkJCS8vIGV4dHJhIGxpbmUgd2hlbiBjb2xsYXBzZWQsIGJ1dCBubyByZWdpb24KLQkJCQkvLyBpbmNyZWFzZSB3aGVuIGFkZCBuZXdsaW5lCi0JCQkJcG9zID0gbmV3IFBvc2l0aW9uKHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQkJLy8gdHJ5IHsKLQkJCQkvLyAvLyBsaW5lLWJhc2VkCi0JCQkJLy8gLy8gZXh0cmEgbGluZSB3aGVuIGNvbGxhcHNlZCwgYnV0IG5vIHJlZ2lvbgotCQkJCS8vIC8vIGluY3JlYXNlIHdoZW4gYWRkIG5ld2xpbmUKLQkJCQkvLyBJUmVnaW9uIHN0YXJ0TGluZVJlZ2lvbiA9Ci0JCQkJLy8gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoc3RhcnQpOwotCQkJCS8vIElSZWdpb24gZW5kTGluZVJlZ2lvbiA9Ci0JCQkJLy8gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoZW5kKTsKLQkJCQkvLyBpbnQgc3RhcnRPZmZzZXQgPSBzdGFydExpbmVSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQkJLy8gaW50IGVuZE9mZnNldCA9IGVuZExpbmVSZWdpb24uZ2V0T2Zmc2V0KCkgKwotCQkJCS8vIGVuZExpbmVSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJLy8gaWYgKGVuZE9mZnNldCA+IHN0YXJ0T2Zmc2V0KSB7Ci0JCQkJLy8gcG9zID0gbmV3IFBvc2l0aW9uKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLQotCQkJCS8vIHN0YXJ0T2Zmc2V0KTsKLQkJCQkvLyB9Ci0JCQkJLy8KLQkJCQkvLyAvLyBsaW5lLWJhc2VkCi0JCQkJLy8gLy8gbm8gZXh0cmEgbGluZSB3aGVuIGNvbGxhcHNlZCwgYnV0IHJlZ2lvbiBpbmNyZWFzZQotCQkJCS8vIC8vIHdoZW4gYWRkIG5ld2xpbmUKLQkJCQkvLyBpbnQgc3RhcnRMaW5lID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkvLyBpbnQgZW5kTGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChlbmQpOwotCQkJCS8vIGlmIChlbmRMaW5lICsgMSA8IGRvY3VtZW50LmdldE51bWJlck9mTGluZXMoKSkgewotCQkJCS8vIGludCBvZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KHN0YXJ0TGluZSk7Ci0JCQkJLy8gaW50IGVuZE9mZnNldCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQoZW5kTGluZSArIDEpOwotCQkJCS8vIHBvcyA9IG5ldyBQb3NpdGlvbihvZmZzZXQsIGVuZE9mZnNldCAtIG9mZnNldCk7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCS8vIExvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIG51bGwsIHgpOwotCQkJCS8vIH0KLQkJCX0KLQkJfQotCQkvLyB9Ci0JCXJldHVybiBwb3M7Ci0JfQotCi0JLyoqCi0JICogRmluZCBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBmb3Igbm9kZSBpbiB0aGUgY3VycmVudCBsaXN0IG9mIHByb2plY3Rpb24KLQkgKiBhbm5vdGF0aW9ucyBmb3IgdGhpcyBhZGFwdGVyCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uCi0JICovCi0JcHJpdmF0ZSBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBnZXRFeGlzdGluZ0Fubm90YXRpb24oTm9kZSBub2RlKSB7Ci0JCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGFubm8gPSBudWxsOwotCi0JCWlmICgobm9kZSAhPSBudWxsKSAmJiAoIWZUYWdBbm5vdGF0aW9ucy5pc0VtcHR5KCkpKSB7Ci0JCQlJdGVyYXRvciBpdCA9IGZUYWdBbm5vdGF0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSAmJiBhbm5vID09IG51bGwpIHsKLQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBhID0gKFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJTm9kZSBuID0gYS5nZXROb2RlKCk7Ci0JCQkJaWYgKG5vZGUuZXF1YWxzKG4pKSB7Ci0JCQkJCWFubm8gPSBhOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYW5ubzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlID09IFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJLy8gY2hlY2sgaWYgZm9sZGluZyBpcyBldmVuIGVuYWJsZWQsIGlmIG5vdCwganVzdCBpZ25vcmUgbm90aWZ5Q2hhbmdlZAotCQkvLyBldmVudHMKLQkJaWYgKCFmQWRhcHRlckZhY3RvcnkuaXNBY3RpdmUoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCkgJiYgKG5vdGlmaWVyIGluc3RhbmNlb2YgTm9kZSkpIHsKLQkJCXVwZGF0ZUFkYXB0ZXIoKE5vZGUpIG5vdGlmaWVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG9mIGFsbCB0aGUgbm9kZXMgdGhhdCBhcmUgY2hpbGRyZW4gb2YKLQkgKiBub2RlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQl2b2lkIHVwZGF0ZUFkYXB0ZXIoTm9kZSBub2RlKSB7Ci0JCXVwZGF0ZUFkYXB0ZXIobm9kZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBwcm9qZWN0aW9uIGFubm90YXRpb24gb2YgYWxsIHRoZSBub2RlcyB0aGF0IGFyZSBjaGlsZHJlbiBvZgotCSAqIG5vZGUgYW5kIGFkZHMgYWxsIHByb2plY3Rpb24gYW5ub3RhdGlvbnMgdG8gdmlld2VyIChmb3IgbmV3bHkgYWRkZWQKLQkgKiB2aWV3ZXJzKQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXZvaWQgdXBkYXRlQWRhcHRlcihOb2RlIG5vZGUsIFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlNYXAgYWRkaXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJTWFwIHByb2plY3Rpb25Bbm5vdGF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJLy8gZ28gdGhyb3VnaCBpbW1lZGlhdGUgY2hpbGQgbm9kZXMgYW5kIGZpZ3VyZSBvdXQgcHJvamVjdGlvbgotCQkvLyBtb2RlbCBhbm5vdGF0aW9ucwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlOb2RlIGNoaWxkTm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKGNoaWxkTm9kZSAhPSBudWxsKSB7Ci0JCQkJUG9zaXRpb24gbmV3UG9zID0gY3JlYXRlUHJvamVjdGlvblBvc2l0aW9uKGNoaWxkTm9kZSk7Ci0JCQkJaWYgKG5ld1BvcyAhPSBudWxsKSB7Ci0JCQkJCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIG5ld0Fubm90YXRpb24gPSBuZXcgVGFnUHJvamVjdGlvbkFubm90YXRpb24oY2hpbGROb2RlLCBmYWxzZSk7Ci0JCQkJCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGV4aXN0aW5nID0gZ2V0RXhpc3RpbmdBbm5vdGF0aW9uKGNoaWxkTm9kZSk7Ci0JCQkJCWlmIChleGlzdGluZyA9PSBudWxsKSB7Ci0JCQkJCQkvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYWxsIGFubm90YXRpb25zIGZvciB0aGlzCi0JCQkJCQkvLyBhZGFwdGVyCi0JCQkJCQlwcm9qZWN0aW9uQW5ub3RhdGlvbnMucHV0KG5ld0Fubm90YXRpb24sIG5ld1Bvcyk7Ci0JCQkJCQkvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgdG8gYWRkCi0JCQkJCQlhZGRpdGlvbnMucHV0KG5ld0Fubm90YXRpb24sIG5ld1Bvcyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYWxsIGFubm90YXRpb25zIGZvciB0aGlzCi0JCQkJCQkvLyBhZGFwdGVyCi0JCQkJCQlwcm9qZWN0aW9uQW5ub3RhdGlvbnMucHV0KGV4aXN0aW5nLCBuZXdQb3MpOwotCQkJCQkJLy8gcmVtb3ZlIGZyb20gbWFwIGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgdG8gZGVsZXRlCi0JCQkJCQlmVGFnQW5ub3RhdGlvbnMucmVtb3ZlKGV4aXN0aW5nKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljaGlsZE5vZGUgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQotCQkJLy8gaW4gdGhlIGVuZCwgd2FudCB0byBkZWxldGUgYW55dGhpbmcgbGVmdG92ZXIgaW4gb2xkIGxpc3QsIGFkZAotCQkJLy8gZXZlcnl0aGluZyBpbiBhZGRpdGlvbnMsIGFuZCB1cGRhdGUgZXZlcnl0aGluZyBpbgotCQkJLy8gcHJvamVjdGlvbkFubm90YXRpb25zCi0JCQlQcm9qZWN0aW9uQW5ub3RhdGlvbltdIG9sZExpc3QgPSBudWxsOwotCQkJaWYgKCFmVGFnQW5ub3RhdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJb2xkTGlzdCA9IChQcm9qZWN0aW9uQW5ub3RhdGlvbltdKSBmVGFnQW5ub3RhdGlvbnMua2V5U2V0KCkudG9BcnJheShuZXcgUHJvamVjdGlvbkFubm90YXRpb25bMF0pOwotCQkJfQotCQkJUHJvamVjdGlvbkFubm90YXRpb25bXSBtb2RpZnlMaXN0ID0gbnVsbDsKLQkJCWlmICghcHJvamVjdGlvbkFubm90YXRpb25zLmlzRW1wdHkoKSkgewotCQkJCW1vZGlmeUxpc3QgPSAoUHJvamVjdGlvbkFubm90YXRpb25bXSkgcHJvamVjdGlvbkFubm90YXRpb25zLmtleVNldCgpLnRvQXJyYXkobmV3IFByb2plY3Rpb25Bbm5vdGF0aW9uWzBdKTsKLQkJCX0KLQotCQkJLy8gc3BlY2lmaWNhbGx5IGFkZCBhbGwgYW5ub3RhdGlvbnMgdG8gdmlld2VyCi0JCQlpZiAodmlld2VyICE9IG51bGwgJiYgIXByb2plY3Rpb25Bbm5vdGF0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQlmQWRhcHRlckZhY3RvcnkucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5vZGUsIG51bGwsIHByb2plY3Rpb25Bbm5vdGF0aW9ucywgbnVsbCwgdmlld2VyKTsKLQkJCX0KLQotCQkJLy8gb25seSB1cGRhdGUgd2hlbiB0aGVyZSBpcyBzb21ldGhpbmcgdG8gdXBkYXRlCi0JCQlpZiAoKG9sZExpc3QgIT0gbnVsbCAmJiBvbGRMaXN0Lmxlbmd0aCA+IDApIHx8ICghYWRkaXRpb25zLmlzRW1wdHkoKSkgfHwgKG1vZGlmeUxpc3QgIT0gbnVsbCAmJiBtb2RpZnlMaXN0Lmxlbmd0aCA+IDApKQotCQkJCWZBZGFwdGVyRmFjdG9yeS5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobm9kZSwgb2xkTGlzdCwgYWRkaXRpb25zLCBtb2RpZnlMaXN0KTsKLQkJfQotCi0JCS8vIHNhdmUgbmV3IGxpc3Qgb2YgYW5ub3RhdGlvbnMKLQkJZlRhZ0Fubm90YXRpb25zID0gcHJvamVjdGlvbkFubm90YXRpb25zOwotCi0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3RyaW5nIG5vZGVOYW1lID0gbm9kZSAhPSBudWxsID8gbm9kZS5nZXROb2RlTmFtZSgpIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC51cGRhdGVBZGFwdGVyICgiICsgbm9kZU5hbWUgKyAiKToiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTUzNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi0vKioKLSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIHdpdGggcHJvamVjdGlvbiBhbm5vdGF0aW9ucyBmb3IgdGhpcwotICogYWRhcHRlciBub2RlJ3MgY2hpbGRyZW4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQIGV4dGVuZHMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MIHsKLQlwdWJsaWMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1AoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SlNQIGZhY3RvcnkpIHsKLQkJc3VwZXIoZmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUC5jbGFzczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjg0ZDFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcm9qZWN0aW9uIHZpZXdlciBhbmQgYWxzbyBtYW5hZ2VzIHVwZGF0aW5nCi0gKiB0aGUgdmlld2VyJ3MgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsCi0gKi8KLWNsYXNzIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgbG9jYXRlZCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0KLQkvKioKLQkgKiBMaXN0ZW5zIHRvIGRvY3VtZW50IHRvIGJlIGF3YXJlIG9mIHdoZW4gdG8gdXBkYXRlIHRoZSBwcm9qZWN0aW9uCi0JICogYW5ub3RhdGlvbiBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRMaXN0ZW5lciB7Ci0JCXByaXZhdGUgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGZJbmZvOwotCi0JCXB1YmxpYyBEb2N1bWVudExpc3RlbmVyKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvKSB7Ci0JCQlmSW5mbyA9IGluZm87Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZXZlbnQuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChmSW5mby5nZXREb2N1bWVudCgpID09IGRvY3VtZW50KSB7Ci0JCQkJZkluZm8uc2V0SXNEb2N1bWVudENoYW5naW5nKHRydWUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCS8vIHJlZ2lzdGVyIGEgcG9zdCBub3RpZmljYXRpb24gcmVwbGFjZSBzbyB0aGF0IHByb2plY3Rpb24KLQkJCS8vIGFubm90YXRpb24gbW9kZWwgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGFsbCBkb2N1bWVudENoYW5nZWQKLQkJCS8vIGxpc3RlbmVycyBoYXZlIGJlZW4gbm90aWZpZWQKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGV2ZW50LmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb24gJiYgZkluZm8uZ2V0RG9jdW1lbnQoKSA9PSBkb2N1bWVudCkgewotCQkJCWlmIChmSW5mby5oYXNDaGFuZ2VzUXVldWVkKCkpCi0JCQkJCSgoSURvY3VtZW50RXh0ZW5zaW9uKSBkb2N1bWVudCkucmVnaXN0ZXJQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZSh0aGlzLCBuZXcgUG9zdERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZJbmZvKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFc3NlbnRpYWxseSBhIHBvc3QgZG9jdW1lbnQgY2hhbmdlZCBsaXN0ZW5lciBiZWNhdXNlIGl0IGlzIGNhbGxlZCBhZnRlcgotCSAqIGRvY3VtZW50Y2hhbmdlZCBoYXMgYmVlbiBmaXJlZC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFBvc3REb2N1bWVudENoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElEb2N1bWVudEV4dGVuc2lvbi5JUmVwbGFjZSB7Ci0JCXByaXZhdGUgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGZJbmZvOwotCi0JCXB1YmxpYyBQb3N0RG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8pIHsKLQkJCWZJbmZvID0gaW5mbzsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBlcmZvcm0oSURvY3VtZW50IGRvY3VtZW50LCBJRG9jdW1lbnRMaXN0ZW5lciBvd25lcikgewotCQkJZkluZm8uYXBwbHlBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKCk7Ci0JCQlmSW5mby5zZXRJc0RvY3VtZW50Q2hhbmdpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGN1cnJlbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdGlvbgotCSAqIHZpZXdlcgotCSAqLwotCXByaXZhdGUgUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCBmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbDsKLQkvKioKLQkgKiBEb2N1bWVudCBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdGlvbiB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JLyoqCi0JICogTGlzdGVuZXIgdG8gZlByb2plY3Rpb25WaWV3ZXIncyBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgSURvY3VtZW50TGlzdGVuZXIgZkRvY3VtZW50TGlzdGVuZXI7Ci0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGRvY3VtZW50IGlzIGluIHRoZSBtaWRkbGUgb2YgY2hhbmdpbmcKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZklzRG9jdW1lbnRDaGFuZ2luZyA9IGZhbHNlOwotCS8qKgotCSAqIExpc3Qgb2YgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGNoYW5nZXMgdGhhdCBuZWVkIHRvIGJlIGFwcGxpZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzOwotCi0JcHVibGljIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbihQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlmRG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwgPSB2aWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpOwotCX0KLQotCUlEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0UXVldWVkQW5ub3RhdGlvbkNoYW5nZXMoKSB7Ci0JCWlmIChmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMgPT0gbnVsbCkgewotCQkJZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXM7Ci0JfQotCi0Jdm9pZCBzZXRJc0RvY3VtZW50Q2hhbmdpbmcoYm9vbGVhbiBjaGFuZ2luZykgewotCQlmSXNEb2N1bWVudENoYW5naW5nID0gY2hhbmdpbmc7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRG9jdW1lbnRDaGFuZ2luZygpIHsKLQkJcmV0dXJuIGZJc0RvY3VtZW50Q2hhbmdpbmc7Ci0JfQotCi0JLyoqCi0JICogQXBwbGllcyB0aGUgcGVuZGluZyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgY2hhbmdlcyB0byB0aGUKLQkgKiBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwuCi0JICovCi0Jdm9pZCBhcHBseUFubm90YXRpb25Nb2RlbENoYW5nZXMoKSB7Ci0JCUxpc3QgcXVldWVkQ2hhbmdlcyA9IGdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCk7Ci0JCS8vIGdvIHRocm91Z2ggYWxsIHRoZSBwZW5kaW5nIGFubm90YXRpb24gY2hhbmdlcyBhbmQgYXBwbHkKLQkJLy8gdGhlbSB0bwotCQkvLyB0aGUgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsCi0JCXdoaWxlICghcXVldWVkQ2hhbmdlcy5pc0VtcHR5KCkpIHsKLQkJCVByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIGNoYW5nZXMgPSAoUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMpIHF1ZXVlZENoYW5nZXMucmVtb3ZlKDApOwotCQkJdHJ5IHsKLQkJCQlmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbC5tb2RpZnlBbm5vdGF0aW9ucyhjaGFuZ2VzLmdldERlbGV0aW9ucygpLCBjaGFuZ2VzLmdldEFkZGl0aW9ucygpLCBjaGFuZ2VzLmdldE1vZGlmaWNhdGlvbnMoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZiBhbnl0aGluZyBnb2VzIHdyb25nLCBsb2cgaXQgYmUgY29udGludWUKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIGFubm90YXRpb24gY2hhbmdlcyBxdWV1ZWQgdXAsIGZhbHNlIG90aGVyd2lzZQotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaGFzQ2hhbmdlc1F1ZXVlZCgpIHsKLQkJcmV0dXJuICFnZXRRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcygpLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBpZiBkb2N1bWVudCBpcyBub3QgaW4gZmx1eC4KLQkgKiBPdGhlcndpc2UsIHF1ZXVlcyB1cCB0aGUgY2hhbmdlcyB0byBiZSBhcHBsaWVkIHdoZW4gZG9jdW1lbnQgaXMgcmVhZHkuCi0JICovCi0JcHVibGljIHZvaWQgcXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIG5ld0NoYW5nZSkgewotCQkvKgotCQkgKiBmdXR1cmVfVE9ETzogbWF5YmUgaW1wcm92ZSBieSBjaGVja2luZyBpZiBhbm5vdGF0aW9uIHByb2plY3Rpb24KLQkJICogbW9kZWwgY2hhbmdlIGFscmVhZHkgZXhpc3RzIGZvciBub2RlLiBpZiBzbywgdGhyb3cgb3V0IG9sZCBjaGFuZ2UuCi0JCSAqLwotCQlnZXRRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcygpLmFkZChuZXdDaGFuZ2UpOwotCi0JCS8vIGlmIGRvY3VtZW50IGlzbid0IGNoYW5naW5nLCBnbyBhaGVhZCBhbmQgYXBwbHkgaXQKLQkJaWYgKCFpc0RvY3VtZW50Q2hhbmdpbmcoKSkgewotCQkJYXBwbHlBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQkvLyBhZGQgZG9jdW1lbnQgbGlzdGVuZXIKLQkJaWYgKGZEb2N1bWVudExpc3RlbmVyID09IG51bGwpIHsKLQkJCWZEb2N1bWVudExpc3RlbmVyID0gbmV3IERvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJZ2V0RG9jdW1lbnQoKS5hZGREb2N1bWVudExpc3RlbmVyKGZEb2N1bWVudExpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyByZW1vdmUgZG9jdW1lbnQgbGlzdGVuZXIKLQkJaWYgKGZEb2N1bWVudExpc3RlbmVyICE9IG51bGwpIHsKLQkJCWdldERvY3VtZW50KCkucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcihmRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyBjbGVhciBvdXQgbGlzdCBvZiBxdWV1ZWQgY2hhbmdlcyBzaW5jZSBpdCBtYXkgbm8gbG9uZ2VyCi0JCS8vIGJlIGFjY3VyYXRlCi0JCWlmIChmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMgIT0gbnVsbCkgewotCQkJZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzLmNsZWFyKCk7Ci0JCQlmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1N0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MjA4YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uSVByb2plY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlByb3BhZ2F0aW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLklTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVXBkYXRlcyB0aGUgcHJvamVjdGlvbiBtb2RlbCBvZiBhIHN0cnVjdHVyZWQgbW9kZWwgZm9yIEpTUC4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySlNQIGltcGxlbWVudHMgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyLCBJUHJvamVjdGlvbkxpc3RlbmVyLCBJVGV4dElucHV0TGlzdGVuZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZGVidWdQcm9qZWN0aW9uUGVyZiA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLnVpL3Byb2plY3Rpb25wZXJmIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIFByb2plY3Rpb25WaWV3ZXIgZlZpZXdlcjsKLQlwcml2YXRlIGJvb2xlYW4gZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0JLyoqCi0JICogTWF4aW11bSBudW1iZXIgb2YgY2hpbGQgbm9kZXMgdG8gYWRkIGFkYXB0ZXJzIHRvIChsaW1pdCBmb3IgcGVyZm9ybWFuY2UKLQkgKiBzYWtlKQotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IE1BWF9DSElMRFJFTiA9IDEwOwotCS8qKgotCSAqIE1heGltdW0gbnVtYmVyIG9mIHNpYmxpbmcgbm9kZXMgdG8gYWRkIGFkYXB0ZXJzIHRvIChsaW1pdCBmb3IKLQkgKiBwZXJmb3JtYW5jZSBzYWtlKQotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IE1BWF9TSUJMSU5HUyA9IDEwMDA7Ci0KLQkvKioKLQkgKiBBZGRzIGFuIGFkYXB0ZXIgdG8gbm9kZSBhbmQgaXRzIGNoaWxkcmVuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gY2hpbGRMZXZlbAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRBZGFwdGVyVG9Ob2RlQW5kQ2hpbGRyZW4oTm9kZSBub2RlLCBpbnQgY2hpbGRMZXZlbCkgewotCQkvLyBzdG9wIGFkZGluZyBpbml0aWFsIGFkYXB0ZXJzIE1BWF9DSElMRFJFTiBsZXZlbHMgZGVlcCBmb3IKLQkJLy8gcGVyZm9ybWFuY2Ugc2FrZQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIgJiYgY2hpbGRMZXZlbCA8IE1BWF9DSElMRFJFTikgewotCQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBub2RlOwotCi0JCQkvLyB0cnkgYW5kIGdldCB0aGUgYWRhcHRlciBmb3IgdGhlIGN1cnJlbnQgbm9kZSBhbmQgdXBkYXRlIHRoZQotCQkJLy8gYWRhcHRlciB3aXRoIHByb2plY3Rpb24gaW5mb3JtYXRpb24KLQkJCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQIGFkYXB0ZXIgPSAoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1ApIG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUC5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlci51cGRhdGVBZGFwdGVyKG5vZGUsIGZWaWV3ZXIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8ganVzdCBjYWxsIGdldGFkYXB0ZXIgc28gdGhlIGFkYXB0ZXIgaXMgY3JlYXRlZCBhbmQKLQkJCQkvLyBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVkCi0JCQkJbm90aWZpZXIuZ2V0QWRhcHRlckZvcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUC5jbGFzcyk7Ci0JCQl9Ci0JCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwgYWRhcHRlcjIgPSAoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MKSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyMiAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlcjIudXBkYXRlQWRhcHRlcihub2RlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGp1c3QgY2FsbCBnZXRhZGFwdGVyIHNvIHRoZSBhZGFwdGVyIGlzIGNyZWF0ZWQgYW5kCi0JCQkJLy8gYXV0b21hdGljYWxseSBpbml0aWFsaXplZAotCQkJCW5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmNsYXNzKTsKLQkJCX0KLQkJCWludCBzaWJsaW5nTGV2ZWwgPSAwOwotCQkJTm9kZSBuZXh0Q2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChuZXh0Q2hpbGQgIT0gbnVsbCAmJiBzaWJsaW5nTGV2ZWwgPCBNQVhfU0lCTElOR1MpIHsKLQkJCQlOb2RlIGNoaWxkTm9kZSA9IG5leHRDaGlsZDsKLQkJCQluZXh0Q2hpbGQgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkJCWFkZEFkYXB0ZXJUb05vZGVBbmRDaGlsZHJlbihjaGlsZE5vZGUsIGNoaWxkTGV2ZWwgKyAxKTsKLQkJCQkrK3NpYmxpbmdMZXZlbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdvZXMgdGhyb3VnaCBldmVyeSBub2RlIGFuZCBhZGRzIGFuIGFkYXB0ZXIgb250byBlYWNoIGZvciB0cmFja2luZwotCSAqIHB1cnBvc2VzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEFsbEFkYXB0ZXJzKCkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBzdGFydE5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE9mZnNldCk7Ci0JCQkJCWlmIChzdGFydE5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQlpbnQgc2libGluZ0xldmVsID0gMDsKLQkJCQkJCU5vZGUgbmV4dFNpYmxpbmcgPSAoTm9kZSkgc3RhcnROb2RlOwotCQkJCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG51bGwgJiYgc2libGluZ0xldmVsIDwgTUFYX1NJQkxJTkdTKSB7Ci0JCQkJCQkJTm9kZSBjdXJyZW50Tm9kZSA9IG5leHRTaWJsaW5nOwotCQkJCQkJCW5leHRTaWJsaW5nID0gY3VycmVudE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkJCQkJCWFkZEFkYXB0ZXJUb05vZGVBbmRDaGlsZHJlbihjdXJyZW50Tm9kZSwgMCk7Ci0JCQkJCQkJKytzaWJsaW5nTGV2ZWw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJKU1AuYWRkQWxsQWRhcHRlcnM6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MIHRvIHVzZSB3aXRoIHRoaXMKLQkgKiBwcm92aWRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwKLQkgKi8KLQlwcml2YXRlIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgZ2V0QWRhcHRlckZhY3RvcnlIVE1MKGJvb2xlYW4gY3JlYXRlSWZOZWVkZWQpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgZmFjdG9yeSA9IG51bGw7Ci0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCUZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5UmVnaXN0cnkgPSBzTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0KLQkJCQkJLy8gZ2V0dGluZyB0aGUgcHJvamVjdGlvbm1vZGVsbm9kZWFkYXB0ZXIgZm9yIHRoZSBmaXJzdAotCQkJCQkvLyB0aW1lCi0JCQkJCS8vIHNvIGRvIHNvbWUgaW5pdGlhbGl6aW5nCi0JCQkJCWlmICghZmFjdG9yeVJlZ2lzdHJ5LmNvbnRhaW5zKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzcykgJiYgY3JlYXRlSWZOZWVkZWQpIHsKLQkJCQkJCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgbmV3RmFjdG9yeSA9IG5ldyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MKCk7Ci0KLQkJCQkJCS8vIGFkZCBmYWN0b3J5IHRvIGZhY3RvcnkgcmVnaXN0cnkKLQkJCQkJCWZhY3RvcnlSZWdpc3RyeS5hZGRGYWN0b3J5KG5ld0ZhY3RvcnkpOwotCi0JCQkJCQkvLyBhZGQgZmFjdG9yeSB0byBwcm9wb2dhdGluZyBhZGFwdGVyCi0JCQkJCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBzTW9kZWw7Ci0JCQkJCQlEb2N1bWVudCBkb2N1bWVudCA9IGRvbU1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQkJCQlQcm9wYWdhdGluZ0FkYXB0ZXIgcHJvcGFnYXRpbmdBZGFwdGVyID0gKFByb3BhZ2F0aW5nQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkJCQkJaWYgKHByb3BhZ2F0aW5nQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQkJcHJvcGFnYXRpbmdBZGFwdGVyLmFkZEFkYXB0T25DcmVhdGVGYWN0b3J5KG5ld0ZhY3RvcnkpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy8gdHJ5IGFuZCBnZXQgdGhlIGZhY3RvcnkKLQkJCQkJZmFjdG9yeSA9IChQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MKSBmYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuY2xhc3MpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySlNQLmdldEFkYXB0ZXJGYWN0b3J5SFRNTDogIiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlKU1AgdG8gdXNlIHdpdGggdGhpcyBwcm92aWRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUAotCSAqLwotCXByaXZhdGUgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SlNQIGdldEFkYXB0ZXJGYWN0b3J5SlNQKGJvb2xlYW4gY3JlYXRlSWZOZWVkZWQpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUCBmYWN0b3J5ID0gbnVsbDsKLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeSA9IHNNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQotCQkJCQkvLyBnZXR0aW5nIHRoZSBwcm9qZWN0aW9ubW9kZWxub2RlYWRhcHRlciBmb3IgdGhlIGZpcnN0Ci0JCQkJCS8vIHRpbWUKLQkJCQkJLy8gc28gZG8gc29tZSBpbml0aWFsaXppbmcKLQkJCQkJaWYgKCFmYWN0b3J5UmVnaXN0cnkuY29udGFpbnMoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1AuY2xhc3MpICYmIGNyZWF0ZUlmTmVlZGVkKSB7Ci0JCQkJCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlKU1AgbmV3RmFjdG9yeSA9IG5ldyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlKU1AoKTsKLQotCQkJCQkJLy8gYWRkIGZhY3RvcnkgdG8gZmFjdG9yeSByZWdpc3RyeQotCQkJCQkJZmFjdG9yeVJlZ2lzdHJ5LmFkZEZhY3RvcnkobmV3RmFjdG9yeSk7Ci0KLQkJCQkJCS8vIGFkZCBmYWN0b3J5IHRvIHByb3BvZ2F0aW5nIGFkYXB0ZXIKLQkJCQkJCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIHNNb2RlbDsKLQkJCQkJCURvY3VtZW50IGRvY3VtZW50ID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJCVByb3BhZ2F0aW5nQWRhcHRlciBwcm9wYWdhdGluZ0FkYXB0ZXIgPSAoUHJvcGFnYXRpbmdBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCQkJCQlpZiAocHJvcGFnYXRpbmdBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCQlwcm9wYWdhdGluZ0FkYXB0ZXIuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkobmV3RmFjdG9yeSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyB0cnkgYW5kIGdldCB0aGUgZmFjdG9yeQotCQkJCQlmYWN0b3J5ID0gKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUCkgZmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1AuY2xhc3MpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySlNQLmdldEFkYXB0ZXJGYWN0b3J5SlNQOiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoaXMgcHJvdmlkZXIgd2l0aCB0aGUgY29ycmVjdCBkb2N1bWVudC4gQXNzdW1lcyBwcm9qZWN0aW9uCi0JICogaXMgZW5hYmxlZC4gKG90aGVyd2lzZSwgb25seSBpbnN0YWxsIHdvdWxkIGhhdmUgYmVlbiBjYWxsZWQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaWYgKCFpc0luc3RhbGxlZCgpKQotCQkJcmV0dXJuOwotCi0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJLy8gY2xlYXIgb3V0IG9sZCBpbmZvCi0JCXByb2plY3Rpb25EaXNhYmxlZCgpOwotCi0JCWZEb2N1bWVudCA9IGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQotCQkvLyBzZXQgcHJvamVjdGlvbiB2aWV3ZXIgb24gbmV3IGRvY3VtZW50J3MgYWRhcHRlciBmYWN0b3J5Ci0JCWlmIChmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKSAhPSBudWxsKSB7Ci0JCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlKU1AgZmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5SlNQKHRydWUpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkuYWRkUHJvamVjdGlvblZpZXdlcihmVmlld2VyKTsKLQkJCX0KLQkJCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgZmFjdG9yeTIgPSBnZXRBZGFwdGVyRmFjdG9yeUhUTUwodHJ1ZSk7Ci0JCQlpZiAoZmFjdG9yeTIgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkyLmFkZFByb2plY3Rpb25WaWV3ZXIoZlZpZXdlcik7Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5ODMwNAotCQkJCS8vIGRpc2FibGUgcmVkcmF3IHdoaWxlIGFkZGluZyBhbGwgYWRhcHRlcnMKLQkJCQlmVmlld2VyLnNldFJlZHJhdyhmYWxzZSk7Ci0JCQkJYWRkQWxsQWRhcHRlcnMoKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWZWaWV3ZXIuc2V0UmVkcmF3KHRydWUpOwotCQkJfQotCQl9Ci0JCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCi0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckpTUC5pbml0aWFsaXplOiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEFzc29jaWF0ZSBhIFByb2plY3Rpb25WaWV3ZXIgd2l0aCB0aGlzIElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlcgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIgLQotCSAqICAgICAgICAgICAgYXNzdW1lcyBub3QgbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGwoUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gdW5pbnN0YWxsIGJlZm9yZSB0cnlpbmcgdG8gaW5zdGFsbCBuZXcgdmlld2VyCi0JCWlmIChpc0luc3RhbGxlZCgpKSB7Ci0JCQl1bmluc3RhbGwoKTsKLQkJfQotCQlmVmlld2VyID0gdmlld2VyOwotCQlmVmlld2VyLmFkZFByb2plY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlZpZXdlci5hZGRUZXh0SW5wdXRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNJbnN0YWxsZWQoKSB7Ci0JCXJldHVybiBmVmlld2VyICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvamVjdGlvbkRpc2FibGVkKCkgewotCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlKU1AgZmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5SlNQKGZhbHNlKTsKLQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJZmFjdG9yeS5yZW1vdmVQcm9qZWN0aW9uVmlld2VyKGZWaWV3ZXIpOwotCQl9Ci0JCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgZmFjdG9yeTIgPSBnZXRBZGFwdGVyRmFjdG9yeUhUTUwoZmFsc2UpOwotCQlpZiAoZmFjdG9yeTIgIT0gbnVsbCkgewotCQkJZmFjdG9yeTIucmVtb3ZlUHJvamVjdGlvblZpZXdlcihmVmlld2VyKTsKLQkJfQotCi0JCS8vIGNsZWFyIG91dCBhbGwgYW5ub3RhdGlvbnMKLQkJaWYgKGZWaWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpICE9IG51bGwpCi0JCQlmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKS5yZW1vdmVBbGxBbm5vdGF0aW9ucygpOwotCi0JCXJlbW92ZUFsbEFkYXB0ZXJzKCk7Ci0KLQkJZkRvY3VtZW50ID0gbnVsbDsKLQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvamVjdGlvbkVuYWJsZWQoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFuIGFkYXB0ZXIgZnJvbSBub2RlIGFuZCBpdHMgY2hpbGRyZW4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBsZXZlbAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVBZGFwdGVyRnJvbU5vZGVBbmRDaGlsZHJlbihOb2RlIG5vZGUsIGludCBsZXZlbCkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgbm9kZTsKLQotCQkJLy8gdHJ5IGFuZCBnZXQgdGhlIGFkYXB0ZXIgZm9yIHRoZSBjdXJyZW50IG5vZGUgYW5kIHJlbW92ZSBpdAotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1AuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCW5vdGlmaWVyLnJlbW92ZUFkYXB0ZXIoYWRhcHRlcik7Ci0JCQl9Ci0KLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyMiA9IG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIyICE9IG51bGwpIHsKLQkJCQlub3RpZmllci5yZW1vdmVBZGFwdGVyKGFkYXB0ZXIyKTsKLQkJCX0KLQotCQkJTm9kZSBuZXh0Q2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChuZXh0Q2hpbGQgIT0gbnVsbCkgewotCQkJCU5vZGUgY2hpbGROb2RlID0gbmV4dENoaWxkOwotCQkJCW5leHRDaGlsZCA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCQkJcmVtb3ZlQWRhcHRlckZyb21Ob2RlQW5kQ2hpbGRyZW4oY2hpbGROb2RlLCBsZXZlbCArIDEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR29lcyB0aHJvdWdoIGV2ZXJ5IG5vZGUgYW5kIHJlbW92ZXMgYWRhcHRlciBmcm9tIGVhY2ggZm9yIGNsZWFudXAKLQkgKiBwdXJwb3NlcwotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVBbGxBZGFwdGVycygpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCQkJCUluZGV4ZWRSZWdpb24gc3RhcnROb2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRPZmZzZXQpOwotCQkJCQlpZiAoc3RhcnROb2RlIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQkJTm9kZSBuZXh0U2libGluZyA9IChOb2RlKSBzdGFydE5vZGU7Ci0JCQkJCQl3aGlsZSAobmV4dFNpYmxpbmcgIT0gbnVsbCkgewotCQkJCQkJCU5vZGUgY3VycmVudE5vZGUgPSBuZXh0U2libGluZzsKLQkJCQkJCQluZXh0U2libGluZyA9IGN1cnJlbnROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCQkJCQlyZW1vdmVBZGFwdGVyRnJvbU5vZGVBbmRDaGlsZHJlbihjdXJyZW50Tm9kZSwgMCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckpTUC5hZGRBbGxBZGFwdGVyczogIiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChJRG9jdW1lbnQgb2xkSW5wdXQsIElEb2N1bWVudCBuZXdJbnB1dCkgewotCQkvLyBpZiBmb2xkaW5nIGlzIGVuYWJsZWQgYW5kIG5ldyBkb2N1bWVudCBpcyBnb2luZyB0byBiZSBhIHRvdGFsbHkKLQkJLy8gZGlmZmVyZW50IGRvY3VtZW50LCBkaXNhYmxlIHByb2plY3Rpb24KLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsICYmIGZEb2N1bWVudCAhPSBuZXdJbnB1dCkgewotCQkJLy8gZGlzYWJsZSBwcm9qZWN0aW9uIGFuZCBkaXNjb25uZWN0IGV2ZXJ5dGhpbmcKLQkJCXByb2plY3Rpb25EaXNhYmxlZCgpOwotCQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCS8vIGlmIHByb2plY3Rpb24gd2FzIHByZXZpb3VzbHkgZW5hYmxlZCBiZWZvcmUgaW5wdXQgZG9jdW1lbnQgY2hhbmdlZAotCQkvLyBhbmQgbmV3IGRvY3VtZW50IGlzIGRpZmZlcmVudCB0aGFuIG9sZCBkb2N1bWVudAotCQlpZiAoZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkICYmIGZEb2N1bWVudCA9PSBudWxsICYmIG5ld0lucHV0ICE9IG51bGwpIHsKLQkJCXByb2plY3Rpb25FbmFibGVkKCk7Ci0JCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc2Nvbm5lY3QgdGhpcyBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIgZnJvbSBwcm9qZWN0aW9uIHZpZXdlcgotCSAqLwotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbCgpIHsKLQkJaWYgKGlzSW5zdGFsbGVkKCkpIHsKLQkJCXByb2plY3Rpb25EaXNhYmxlZCgpOwotCi0JCQlmVmlld2VyLnJlbW92ZVByb2plY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJCWZWaWV3ZXIucmVtb3ZlVGV4dElucHV0TGlzdGVuZXIodGhpcyk7Ci0JCQlmVmlld2VyID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWQ4YjE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySlNQIGltcGxlbWVudHMgQWRhcHRlckZhY3RvcnlQcm92aWRlciB7Ci0KLQkvKgotCSAqIEBzZWUgQWRhcHRlckZhY3RvcnlQcm92aWRlciNhZGRBZGFwdGVyRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWRhcHRlckZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyB0aGVzZSBhcmUgdGhlIG1haW4gZmFjdG9yaWVzLCBvbiBtb2RlbCdzIGZhY3RvcnkgcmVnaXN0cnkKLQkJYWRkQ29udGVudEJhc2VkRmFjdG9yaWVzKHN0cnVjdHVyZWRNb2RlbCk7Ci0JCS8vIC0tLS0tLS0KLQkJLy8gTXVzdCB1cGRhdGUvYWRkIHRvIHByb3BhZ2F0aW5nIGFkYXB0ZXJzIGhlcmUgdG9vCi0JCWFkZFByb3BhZ2F0aW5nQWRhcHRlcnMoc3RydWN0dXJlZE1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZW50QmFzZWRGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeSA9IHN0cnVjdHVyZWRNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChmYWN0b3J5UmVnaXN0cnksICJQcm9ncmFtIEVycm9yOiBjbGllbnQgY2FsbGVyIG11c3QgZW5zdXJlIG1vZGVsIGhhcyBmYWN0b3J5IHJlZ2lzdHJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJZmFjdG9yeSA9IGZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5Rm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotCQkJZmFjdG9yeSA9IG5ldyBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUZvckhUTUwoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCQkJZmFjdG9yeVJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQotCQlNb2RlbEhhbmRsZXJGb3JKU1AuZW5zdXJlVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeShzdHJ1Y3R1cmVkTW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BhZ2F0aW5nQWRhcHRlcnMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQotCQlpZiAoc3RydWN0dXJlZE1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWw7Ci0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpIGRvY3VtZW50LmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChwcm9wYWdhdGluZ0FkYXB0ZXIgIT0gbnVsbCkgewotCQkJCS8vIHdoYXQgdG8gZG8/Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQWRhcHRlckZhY3RvcnlQcm92aWRlciNpc0ZvcihDb250ZW50VHlwZURlc2NyaXB0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRm9yKElEb2N1bWVudFR5cGVIYW5kbGVyIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24pIHsKLQkJcmV0dXJuIChjb250ZW50VHlwZURlc2NyaXB0aW9uIGluc3RhbmNlb2YgTW9kZWxIYW5kbGVyRm9ySlNQKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWluaXRpYWxpemVGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzSlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzSlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiODFiZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0pTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlQ29uc3RhbnRzSlNQIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQ09OVEVOVCA9ICJqc3BfY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDE4Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0hUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c1hNTDsKLQotcHVibGljIGNsYXNzIExpbmVTdHlsZVByb3ZpZGVyRm9ySlNQIGV4dGVuZHMgQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlciBpbXBsZW1lbnRzIExpbmVTdHlsZVByb3ZpZGVyewotCi0JcHJpdmF0ZSBTdHJpbmcgZkxhbmd1YWdlID0gbnVsbDsKLQotCS8vICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBID0gImphdmEiOyAvLyROT04tTkxTLTEkCi0JLy8gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gSkFWQVNDUklQVF9MQU5HVUFHRV9LRVlTID0gbmV3IFN0cmluZ1tdIHsKLQkvLyAiamF2YXNjcmlwdCIsICJqYXZhc2NyaXB0MS4wIiwgImphdmFzY3JpcHQxLjFfMyIsICJqYXZhc2NyaXB0MS4yIiwKLQkvLyAiamF2YXNjcmlwdDEuMyIsICJqYXZhc2NyaXB0MS40IiwgImphdmFzY3JpcHQxLjUiLCAiamF2YXNjcmlwdDEuNiIsCi0JLy8gImpzY3JpcHQiLCAic2FzaHNjcmlwdCIgfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkvLyAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkvLyAvLyROT04tTkxTLTkkIC8vJE5PTi1OTFMtMTAkCi0KLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJGb3JKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlRm9yKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQkvKioKLQkJICogYSBtZXRob2QgdG8gY2VudHJhbGl6ZSBhbGwgdGhlICJzeXRsZSBydWxlcyIgZm9yIHJlZ2lvbnMKLQkJICovCi0JCVRleHRBdHRyaWJ1dGUgcmVzdWx0ID0gbnVsbDsKLQkJLy8gbm90IHN1cmUgd2h5IHRoaXMgaXMgY29taW5nIHRocm91Z2ggbnVsbCwgYnV0IGp1c3QgdG8gY2F0Y2ggaXQKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQpOwotCQl9Ci0JCWVsc2UgewotCi0JCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKCh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4pIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4pIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSkgewotCQkJCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FKSB7Ci0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQkJCX0KLQkJCQllbHNlIGlmICgodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9DTE9TRSkpIHsKLQkJCQkJcmVzdWx0ID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfVEVYVCkgewotCQkJCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCQkJfQotCQkJCS8vID09PT09PT09PT09PSBUaGVzZSBhcmUgaW4gY29tbW9uIHdpdGggWE1MIC0tLSAoZm9yIFhNTCBmb3JtCi0JCQkJLy8gb2YgdGFncykKLQkJCQkvLyAgICAgICAgICAgICAgTm90ZTogdGhpcyBhc3N1bWUncyB0aGlzIHByb3ZpZGVyIGlzIG9ubHkgY2FsbGVkIGZvcgotCQkJCS8vICAgICAgICAgICAgICB0cnVlIEpTUCBOb2Rlcy4gSWYgaXRzIGNhbGxlZCBmb3Igb3RoZXJzLCB0aGVuIHRoaXMgd2lsbAotCQkJCS8vICAgICAgICAgICAgICBjYXVzZSB0aGVpciB0YWcgbmFtZXMgdG8gYmUgaGlnaGxpZ2h0ZWQgdG9vIQotCQkJCS8vICAgICAgICAgICAgICBGdXJ0aGVyIGNoZWNrcyBjb3VsZCBiZSBkb25lIHRvIHByZXZlbnQgdGhhdCwgYnV0IGRvZXNuJ3QKLQkJCQkvLyAgICAgICAgICAgICAgc2VlbSB3b3J0aCBpdCwgc2luY2UgaWYgYWRwYXRlcnMgZmFjdG9yaWVzIGFyZSB3b3JraW5nCi0JCQkJLy8gcmlnaHQsCi0JCQkJLy8gICAgICAgICAgICAgIHRoZW4gd291bGRuJ3QgYmUgbmVlZGVkLgotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQkJcmVzdWx0ID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSkgewotCQkJCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKSkgewotCQkJCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9FUVVBTFMpOwotCQkJCX0KLQotCQkJCS8vIERNVzogYWRkZWQgOS8xLzIwMDIgVW5kZWZpbmVkIGNvbG9yIG1heSBuZWVkIGFkZGp1c3RtZW50IDopCi0JCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCkKLQkJCQkJcmVzdWx0ID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0KLQkJCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuV0hJVEVfU1BBQ0UpCi0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQpOwotCQkJCS8vIERNVyBhZGRlZCA4LzMwLzIwMDIgLS0gc2hvdWxkIHByb3ZpZGUgSlNQIHNwZWNpZmljCi0JCQkJLy8gcHJlZmVyZW5jZSBmb3IgImN1c3RvbSB0YWcgY29udGVudCIgKGJvdGggdGFnIGRlcGVuZGVudCwKLQkJCQkvLyBCTE9DS0VEX1RFWFQsIGFuZCBub3QsIFhNTCBDT05URU5UKQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkKLQkJCQkJcmVzdWx0ID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpCi0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCk7Ci0JCQl9Ci0JCX0KLQkJLy8gZGVmYXVsdCwgcmV0dXJuIG51bGwgdG8gc2lnbmFsICJub3QgaGFuZGxlZCIKLQkJLy8gaW4gd2hpY2ggY2FzZSwgb3RoZXIgZmFjdG9yaWVzIHNob3VsZCBiZSB0cmllZAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0Q29sb3JQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkQ29sb3JzKCkgewotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9FUVVBTFMpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3R5bGVLZXkgPSBudWxsOwotCi0JCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZktleSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkvLyBjaGVjayBpZiBwcmVmZXJlbmNlIGNoYW5nZWQgaXMgYSBzdHlsZSBwcmVmZXJlbmNlCi0JCQlpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUy5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUzsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhUOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVI7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRDsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX05BTUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVDsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5ULmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUjsKLQkJCX0KLQkJfQotCi0JCWlmIChzdHlsZUtleSAhPSBudWxsKSB7Ci0JCQkvLyBvdmVyd3JpdGUgc3R5bGUgcHJlZmVyZW5jZSB3aXRoIG5ldyB2YWx1ZQotCQkJYWRkVGV4dEF0dHJpYnV0ZShzdHlsZUtleSk7Ci0JCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7Ci0JCXJldHVybiBmTGFuZ3VhZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFuZ3VhZ2UuCi0JICogCi0JICogQHBhcmFtIGxhbmd1YWdlCi0JICogICAgICAgICAgICBUaGUgbGFuZ3VhZ2UgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGFuZ3VhZ2UoU3RyaW5nIGxhbmd1YWdlKSB7Ci0JCXRoaXMuZkxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmY3NzI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0lTdHlsZUNvbnN0YW50c0pTUEphdmEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuamF2YTsKLQotcHVibGljIGludGVyZmFjZSBJU3R5bGVDb25zdGFudHNKU1BKYXZhIHsKLQlTdHJpbmcgSkFWQV9LRVlXT1JEID0gImtleXdvcmQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpBVkFfU0lOR0xFX0xJTkVfQ09NTUVOVCA9ICJzaW5nbGVfbGluZV9jb21tZW50IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKQVZBX1NUUklORyA9ICJzdHJpbmciOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpBVkFfREVGQVVMVCA9ICJkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YUNvZGVTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KYXZhQ29kZVNjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM5NWIxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KYXZhQ29kZVNjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qYXZhOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLkVuZE9mTGluZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLk11bHRpTGluZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5TaW5nbGVMaW5lUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuV29yZFJ1bGU7Ci0KLS8qKgotICogQSBKYXZhIGNvZGUgc2Nhbm5lci4KLSAqLwotY2xhc3MgSmF2YUNvZGVTY2FubmVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5SdWxlQmFzZWRTY2FubmVyIHsKLQlwcml2YXRlIElUb2tlbiBmS2V5d29yZFRva2VuOwotCXByaXZhdGUgSVRva2VuIGZUeXBlVG9rZW47Ci0JcHJpdmF0ZSBJVG9rZW4gZlN0cmluZ1Rva2VuOwotCXByaXZhdGUgSVRva2VuIGZTaW5nbGVMaW5lQ29tbWVudFRva2VuOwotCXByaXZhdGUgSVRva2VuIGZEZWZhdWx0VG9rZW47Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBmZ0tleXdvcmRzID0geyJhYnN0cmFjdCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiYnJlYWsiLCAvLyROT04tTkxTLTEkCi0JCQkJImNhc2UiLCAiY2F0Y2giLCAiY2xhc3MiLCAiY29udGludWUiLCAvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJImRlZmF1bHQiLCAiZG8iLCAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCSJlbHNlIiwgImV4dGVuZHMiLCAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCSJmaW5hbCIsICJmaW5hbGx5IiwgImZvciIsIC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCSJpZiIsICJpbXBsZW1lbnRzIiwgImltcG9ydCIsICJpbnN0YW5jZW9mIiwgImludGVyZmFjZSIsIC8vJE5PTi1OTFMtNSQvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJIm5hdGl2ZSIsICJuZXciLCAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCSJwYWNrYWdlIiwgInByaXZhdGUiLCAicHJvdGVjdGVkIiwgInB1YmxpYyIsIC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkicmV0dXJuIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJzdGF0aWMiLCAic3VwZXIiLCAic3dpdGNoIiwgInN5bmNocm9uaXplZCIsIC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkidGhpcyIsICJ0aHJvdyIsICJ0aHJvd3MiLCAidHJhbnNpZW50IiwgInRyeSIsIC8vJE5PTi1OTFMtNSQvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJInZvbGF0aWxlIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJ3aGlsZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkic3RyaWN0ZnAiLC8vJE5PTi1OTFMtMSQKLQl9OwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGZnVHlwZXMgPSB7InZvaWQiLCAiYm9vbGVhbiIsICJjaGFyIiwgImJ5dGUiLCAic2hvcnQiLCAiaW50IiwgImxvbmciLCAiZmxvYXQiLCAiZG91YmxlIn07Ly8kTk9OLU5MUy05JC8vJE5PTi1OTFMtOCQvLyROT04tTkxTLTckLy8kTk9OLU5MUy02JC8vJE5PTi1OTFMtNSQvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZmdDb25zdGFudHMgPSB7ImZhbHNlIiwgIm51bGwiLCAidHJ1ZSJ9Oy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIEphdmEgY29kZSBzY2FubmVyCi0JICovCi0JcHVibGljIEphdmFDb2RlU2Nhbm5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVJ1bGVzKCkgewotCQlMaXN0IHJ1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIEFkZCBydWxlIGZvciBtdWx0aXBsZSBsaW5lIGNvbW1lbnRzLgotCQlydWxlcy5hZGQobmV3IE11bHRpTGluZVJ1bGUoIi8qIiwgIiovIiwgZlNpbmdsZUxpbmVDb21tZW50VG9rZW4pKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkvLyBBZGQgcnVsZSBmb3Igc2luZ2xlIGxpbmUgY29tbWVudHMuCi0JCXJ1bGVzLmFkZChuZXcgRW5kT2ZMaW5lUnVsZSgiLy8iLCBmU2luZ2xlTGluZUNvbW1lbnRUb2tlbikpOy8vJE5PTi1OTFMtMSQKLQotCQkvLyBBZGQgcnVsZSBmb3Igc3RyaW5ncyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4KLQkJcnVsZXMuYWRkKG5ldyBTaW5nbGVMaW5lUnVsZSgiXCIiLCAiXCIiLCBmU3RyaW5nVG9rZW4sICdcXCcpKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlydWxlcy5hZGQobmV3IFNpbmdsZUxpbmVSdWxlKCInIiwgIiciLCBmU3RyaW5nVG9rZW4sICdcXCcpKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCi0JCS8vIEFkZCBnZW5lcmljIHdoaXRlc3BhY2UgcnVsZS4KLQkJLy9ydWxlcy5hZGQobmV3IFdoaXRlc3BhY2VSdWxlKG5ldyBKYXZhV2hpdGVzcGFjZURldGVjdG9yKCkpKTsKLQotCQkvLyBBZGQgd29yZCBydWxlIGZvciBrZXl3b3JkcywgdHlwZXMsIGFuZCBjb25zdGFudHMuCi0JCVdvcmRSdWxlIHdvcmRSdWxlID0gbmV3IFdvcmRSdWxlKG5ldyBKYXZhV29yZERldGVjdG9yKCksIGZEZWZhdWx0VG9rZW4pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZnS2V5d29yZHMubGVuZ3RoOyBpKyspCi0JCQl3b3JkUnVsZS5hZGRXb3JkKGZnS2V5d29yZHNbaV0sIGZLZXl3b3JkVG9rZW4pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZnVHlwZXMubGVuZ3RoOyBpKyspCi0JCQl3b3JkUnVsZS5hZGRXb3JkKGZnVHlwZXNbaV0sIGZUeXBlVG9rZW4pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZnQ29uc3RhbnRzLmxlbmd0aDsgaSsrKQotCQkJd29yZFJ1bGUuYWRkV29yZChmZ0NvbnN0YW50c1tpXSwgZlR5cGVUb2tlbik7Ci0JCXJ1bGVzLmFkZCh3b3JkUnVsZSk7Ci0KLQotCQlJUnVsZVtdIHJlc3VsdCA9IG5ldyBJUnVsZVtydWxlcy5zaXplKCldOwotCQlydWxlcy50b0FycmF5KHJlc3VsdCk7Ci0JCXNldFJ1bGVzKHJlc3VsdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRva2VuRGF0YShTdHJpbmcgdG9rZW5LZXksIE9iamVjdCBkYXRhKSB7Ci0JCWlmICh0b2tlbktleSA9PSBJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfS0VZV09SRCkgewotCQkJZktleXdvcmRUb2tlbiA9IG5ldyBUb2tlbihkYXRhKTsKLQkJCWZUeXBlVG9rZW4gPSBuZXcgVG9rZW4oZGF0YSk7Ci0JCX0gZWxzZSBpZiAodG9rZW5LZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX1NUUklORykgewotCQkJZlN0cmluZ1Rva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQl9IGVsc2UgaWYgKHRva2VuS2V5ID09IElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9TSU5HTEVfTElORV9DT01NRU5UKSB7Ci0JCQlmU2luZ2xlTGluZUNvbW1lbnRUb2tlbiA9IG5ldyBUb2tlbihkYXRhKTsKLQkJfSBlbHNlIGlmICh0b2tlbktleSA9PSBJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfREVGQVVMVCkgewotCQkJZkRlZmF1bHRUb2tlbiA9IG5ldyBUb2tlbihkYXRhKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFDb2xvclByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KYXZhQ29sb3JQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGEyMzg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFDb2xvclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci0KLS8qKgotICogQ29sb3JzIHVzZWQgaW4gdGhlIEphdmEgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhQ29sb3JQcm92aWRlciB7Ci0JCi0JLy8gcGVvcGxlIHNob3VsZCBub3QgYmUgc2V0dGluZyB0aGVzZSwgZXZlbiB0aG91Z2ggdGhleSBhcmUgY3VycmVudGx5IG5vdCBmaW5hbAotCXB1YmxpYyBzdGF0aWMgUkdCIE1VTFRJX0xJTkVfQ09NTUVOVCA9IG5ldyBSR0IoMTI4LCAwLCAwKTsKLQlwdWJsaWMgc3RhdGljIFJHQiBTSU5HTEVfTElORV9DT01NRU5UID0gbmV3IFJHQigxMjgsIDEyOCwgMCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgS0VZV09SRCA9IG5ldyBSR0IoMCwgMCwgMTI4KTsKLQlwdWJsaWMgc3RhdGljIFJHQiBUWVBFID0gbmV3IFJHQigwLCAwLCAxMjgpOwotCXB1YmxpYyBzdGF0aWMgUkdCIFNUUklORyA9IG5ldyBSR0IoMCwgMTI4LCAwKTsKLQlwdWJsaWMgc3RhdGljIFJHQiBERUZBVUxUID0gbmV3IFJHQigwLCAwLCAwKTsKLQlwdWJsaWMgc3RhdGljIFJHQiBKQVZBRE9DX0tFWVdPUkQgPSBuZXcgUkdCKDAsIDEyOCwgMCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgSkFWQURPQ19UQUcgPSBuZXcgUkdCKDEyOCwgMTI4LCAxMjgpOwotCXB1YmxpYyBzdGF0aWMgUkdCIEpBVkFET0NfTElOSyA9IG5ldyBSR0IoMTI4LCAxMjgsIDEyOCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgSkFWQURPQ19ERUZBVUxUID0gbmV3IFJHQigwLCAxMjgsIDEyOCk7Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgTVVMVElfTElORV9DT01NRU5UX0JPTEQgPSBTV1QuTk9STUFMOwotCXB1YmxpYyBzdGF0aWMgaW50IFNJTkdMRV9MSU5FX0NPTU1FTlRfQk9MRCA9IFNXVC5OT1JNQUw7Ci0JcHVibGljIHN0YXRpYyBpbnQgS0VZV09SRF9CT0xEID0gU1dULkJPTEQ7Ci0JcHVibGljIHN0YXRpYyBpbnQgVFlQRV9CT0xEID0gU1dULkJPTEQ7Ci0JcHVibGljIHN0YXRpYyBpbnQgU1RSSU5HX0JPTEQgPSBTV1QuTk9STUFMOwotCXB1YmxpYyBzdGF0aWMgaW50IERFRkFVTFRfQk9MRCA9IFNXVC5OT1JNQUw7Ci0JcHVibGljIHN0YXRpYyBpbnQgSkFWQURPQ19LRVlXT1JEX0JPTEQgPSBTV1QuQk9MRDsKLQlwdWJsaWMgc3RhdGljIGludCBKQVZBRE9DX1RBR19CT0xEID0gU1dULk5PUk1BTDsKLQlwdWJsaWMgc3RhdGljIGludCBKQVZBRE9DX0xJTktfQk9MRCA9IFNXVC5OT1JNQUw7Ci0JcHVibGljIHN0YXRpYyBpbnQgSkFWQURPQ19ERUZBVUxUX0JPTEQgPSBTV1QuTk9STUFMOwotCQotCXByaXZhdGUgc3RhdGljIEphdmFDb2xvclByb3ZpZGVyIGZJbnN0YW5jZSA9IG51bGw7Ci0JCi0JcHVibGljIHN0YXRpYyBKYXZhQ29sb3JQcm92aWRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgSmF2YUNvbG9yUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQkKLQkvKioKLQkgKiBVc2UgY29sb3JzIGZyb20gSkRUIHBsdWdpbgotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRKYXZhQ29sb3JzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIGpkdFN0b3JlID0gUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJTVVMVElfTElORV9DT01NRU5UID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfTVVMVElfTElORV9DT01NRU5UX0NPTE9SKTsKLQkJU0lOR0xFX0xJTkVfQ09NTUVOVCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfQ09MT1IpOwotCQlLRVlXT1JEID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0NPTE9SKTsKLQkJVFlQRSA9IEtFWVdPUkQ7Ci0JCVNUUklORyA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19DT0xPUik7Ci0JCURFRkFVTFQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQ09MT1IpOwotCQlKQVZBRE9DX0tFWVdPUkQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX0tFWVdPUkRfQ09MT1IpOwotCQlKQVZBRE9DX1RBRyA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfVEFHX0NPTE9SKTsKLQkJSkFWQURPQ19MSU5LID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQURPQ19MSU5LU19DT0xPUik7Ci0JCUpBVkFET0NfREVGQVVMVCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfREVGQVVMVF9DT0xPUik7Ci0JCQotCQlNVUxUSV9MSU5FX0NPTU1FTlRfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfTVVMVElfTElORV9DT01NRU5UX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlTSU5HTEVfTElORV9DT01NRU5UX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCUtFWVdPUkRfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlUWVBFX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJU1RSSU5HX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJREVGQVVMVF9CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCUpBVkFET0NfVEFHX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfVEFHX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlKQVZBRE9DX0xJTktfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQURPQ19MSU5LU19CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJSkFWQURPQ19ERUZBVUxUX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfREVGQVVMVF9CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KYXZhV2hpdGVzcGFjZURldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KYXZhV2hpdGVzcGFjZURldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2M2M4MWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YVdoaXRlc3BhY2VEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuamF2YTsKLQotCi0KLS8qKgotICogQSBqYXZhIGF3YXJlIHdoaXRlIHNwYWNlIGRldGVjdG9yLgotICovCi1wdWJsaWMgY2xhc3MgSmF2YVdoaXRlc3BhY2VEZXRlY3RvciBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVdoaXRlc3BhY2VEZXRlY3RvciB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVdoaXRlc3BhY2VEZXRlY3RvciNpc1doaXRlc3BhY2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1doaXRlc3BhY2UoY2hhciBjKSB7Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFXb3JkRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFXb3JkRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBmNjM3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KYXZhV29yZERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qYXZhOwotCi0KLS8qKgotICogQSBKYXZhIGF3YXJlIHdvcmQgZGV0ZWN0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhV29yZERldGVjdG9yIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JV29yZERldGVjdG9yIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JV29yZERldGVjdG9yI2lzV29yZElkZW50aWZpZXJQYXJ0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXb3JkUGFydChjaGFyIGMpIHsKLQkJcmV0dXJuIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVdvcmREZXRlY3RvciNpc1dvcmRJZGVudGlmaWVyU3RhcnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmRTdGFydChjaGFyIGMpIHsKLQkJcmV0dXJuIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoYyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9MaW5lU3R5bGVQcm92aWRlckZvckphdmEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNhZWYxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9MaW5lU3R5bGVQcm92aWRlckZvckphdmEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5Ub2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0pTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi0vLyBOb3RlOiBtYW55IG9mIHRoZSBtZXRob2RzIGluIHRoaXMgY2xhc3Mgd2VyZSBiYXNlZCBvbiAob3IgY29waWVkIGZyb20pIHRob3NlCi0vLyBmb3VuZCBpbiB0aGUgZXhhbXBsZSBKYXZhIEVkaXRvcgotcHVibGljIGNsYXNzIExpbmVTdHlsZVByb3ZpZGVyRm9ySmF2YSBleHRlbmRzIEFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIgaW1wbGVtZW50cyBMaW5lU3R5bGVQcm92aWRlcnsKLQotCS8qKiBUaGUgc2Nhbm5lciBpdCB1c2VzICovCi0JcHJpdmF0ZSBKYXZhQ29kZVNjYW5uZXIgZlNjYW5uZXI7Ci0KLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJGb3JKYXZhKCkgewotCQlzdXBlcigpOwotCQlmU2Nhbm5lciA9IG5ldyBKYXZhQ29kZVNjYW5uZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHN0eWxlIGluZm9ybWF0aW9uIHRvIHRoZSBnaXZlbiB0ZXh0IHByZXNlbnRhdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBwcmVzZW50YXRpb24gdGhlIHRleHQgcHJlc2VudGF0aW9uIHRvIGJlIGV4dGVuZGVkCi0JICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IG9mIHRoZSByYW5nZSB0byBiZSBzdHlsZWQKLQkgKiBAcGFyYW0gbGVuZ3RoIHRoZSBsZW5ndGggb2YgdGhlIHJhbmdlIHRvIGJlIHN0eWxlZAotCSAqIEBwYXJhbSBhdHRyIHRoZSBhdHRyaWJ1dGUgZGVzY3JpYmluZyB0aGUgc3R5bGUgb2YgdGhlIHJhbmdlIHRvIGJlIHN0eWxlZAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRSYW5nZShDb2xsZWN0aW9uIHByZXNlbnRhdGlvbiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgVGV4dEF0dHJpYnV0ZSBhdHRyKSB7Ci0JCS8vIHN1cHBvcnQgZm9yIHVzZXIgZGVmaW5lZCBiYWNrZ3JvdWQgZm9yIEpTUCBzY3JpcHRsZXQgcmVnaW9ucwotCQlUZXh0QXR0cmlidXRlIHRhID0gKFRleHRBdHRyaWJ1dGUpZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzSlNQLkpTUF9DT05URU5UKTsKLQkJQ29sb3IgYmdDb2xvciA9IHRhLmdldEJhY2tncm91bmQoKTsKLQkJaWYgKGJnQ29sb3IgPT0gbnVsbCkKLQkJCWJnQ29sb3IgPSBhdHRyLmdldEJhY2tncm91bmQoKTsKLQkJU3R5bGVSYW5nZSByZXN1bHQgPSBuZXcgU3R5bGVSYW5nZShvZmZzZXQsIGxlbmd0aCwgYXR0ci5nZXRGb3JlZ3JvdW5kKCksIGJnQ29sb3IsIGF0dHIuZ2V0U3R5bGUoKSk7Ci0JCWlmKChhdHRyLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0gpICE9IDApIHsKLQkJCXJlc3VsdC5zdHJpa2VvdXQgPSB0cnVlOwotCQl9Ci0JCWlmKChhdHRyLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlVOREVSTElORSkgIT0gMCkgewotCQkJcmVzdWx0LnVuZGVybGluZSA9IHRydWU7Ci0JCX0KLQkJcHJlc2VudGF0aW9uLmFkZChyZXN1bHQpOwotCX0KLQotCS8qKgotCSAqIExvb2tzIHVwIHRoZSBjb2xvcktleSBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZSBhbmQgYWRkcyB0aGUgc3R5bGUKLQkgKiBpbmZvcm1hdGlvbiB0byBsaXN0IG9mIFRleHRBdHRyaWJ1dGVzCi0JICogCi0JICogQHBhcmFtIGNvbG9yS2V5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEphdmFUZXh0QXR0cmlidXRlKFN0cmluZyBjb2xvcktleSkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0SmF2YUNvbG9yUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHN0b3JlICE9IG51bGwgJiYgY29sb3JLZXkgIT0gbnVsbCkgeyAKLQkJCVRleHRBdHRyaWJ1dGUgdGEgPSBudWxsOwotCQkJaWYgKGNvbG9yS2V5ID09IElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9LRVlXT1JEKSB7Ci0JCQkJLy8ga2V5d29yZAotCQkJCVJHQiBmb3JlZ3JvdW5kID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0NPTE9SKTsKLQkJCQlib29sZWFuIGJvbGQgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9CT0xEKTsKLQkJCQlib29sZWFuIGl0YWxpY3MgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9JVEFMSUMpOwotCQkJCWJvb2xlYW4gc3RyaWtldGhyb3VnaCA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX1NUUklLRVRIUk9VR0gpOwotCQkJCWJvb2xlYW4gdW5kZXJsaW5lID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfVU5ERVJMSU5FKTsKLQkJCQlpbnQgc3R5bGUgPSBTV1QuTk9STUFMOwotCQkJCWlmIChib2xkKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuQk9MRDsKLQkJCQl9Ci0JCQkJaWYgKGl0YWxpY3MpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHJpa2V0aHJvdWdoKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJfQotCQkJCWlmICh1bmRlcmxpbmUpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQotCQkJCXRhID0gY3JlYXRlVGV4dEF0dHJpYnV0ZShmb3JlZ3JvdW5kLCBudWxsLCBzdHlsZSk7Ci0JCQl9IGVsc2UgaWYgKGNvbG9yS2V5ID09IElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9TVFJJTkcpIHsKLQkJCQkvLyBzdHJpbmcKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19DT0xPUik7Ci0JCQkJYm9vbGVhbiBib2xkID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfQk9MRCk7Ci0JCQkJYm9vbGVhbiBpdGFsaWNzID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfSVRBTElDKTsKLQkJCQlib29sZWFuIHN0cmlrZXRocm91Z2ggPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19TVFJJS0VUSFJPVUdIKTsKLQkJCQlib29sZWFuIHVuZGVybGluZSA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX1VOREVSTElORSk7Ci0JCQkJaW50IHN0eWxlID0gU1dULk5PUk1BTDsKLQkJCQlpZiAoYm9sZCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChpdGFsaWNzKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuSVRBTElDOwotCQkJCX0KLQkJCQlpZiAoc3RyaWtldGhyb3VnaCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAodW5kZXJsaW5lKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlVOREVSTElORTsKLQkJCQl9Ci0KLQkJCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgbnVsbCwgc3R5bGUpOwotCQkJfSBlbHNlIGlmIChjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfU0lOR0xFX0xJTkVfQ09NTUVOVCkgewotCQkJCS8vIHNpbmdsZSBsaW5lIGNvbW1lbnQKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfQ09MT1IpOwotCQkJCWJvb2xlYW4gYm9sZCA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9CT0xEKTsKLQkJCQlib29sZWFuIGl0YWxpY3MgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfSVRBTElDKTsKLQkJCQlib29sZWFuIHN0cmlrZXRocm91Z2ggPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfU1RSSUtFVEhST1VHSCk7Ci0JCQkJYm9vbGVhbiB1bmRlcmxpbmUgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfVU5ERVJMSU5FKTsKLQkJCQlpbnQgc3R5bGUgPSBTV1QuTk9STUFMOwotCQkJCWlmIChib2xkKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuQk9MRDsKLQkJCQl9Ci0JCQkJaWYgKGl0YWxpY3MpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHJpa2V0aHJvdWdoKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJfQotCQkJCWlmICh1bmRlcmxpbmUpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQotCQkJCXRhID0gY3JlYXRlVGV4dEF0dHJpYnV0ZShmb3JlZ3JvdW5kLCBudWxsLCBzdHlsZSk7Ci0JCQl9IGVsc2UgaWYgKGNvbG9yS2V5ID09IElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9ERUZBVUxUKSB7Ci0JCQkJLy8gZGVmYXVsdAotCQkJCVJHQiBmb3JlZ3JvdW5kID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0NPTE9SKTsKLQkJCQlib29sZWFuIGJvbGQgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9CT0xEKTsKLQkJCQlib29sZWFuIGl0YWxpY3MgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9JVEFMSUMpOwotCQkJCWJvb2xlYW4gc3RyaWtldGhyb3VnaCA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX1NUUklLRVRIUk9VR0gpOwotCQkJCWJvb2xlYW4gdW5kZXJsaW5lID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfVU5ERVJMSU5FKTsKLQkJCQlpbnQgc3R5bGUgPSBTV1QuTk9STUFMOwotCQkJCWlmIChib2xkKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuQk9MRDsKLQkJCQl9Ci0JCQkJaWYgKGl0YWxpY3MpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHJpa2V0aHJvdWdoKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJfQotCQkJCWlmICh1bmRlcmxpbmUpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQotCQkJCXRhID0gY3JlYXRlVGV4dEF0dHJpYnV0ZShmb3JlZ3JvdW5kLCBudWxsLCBzdHlsZSk7Ci0JCQl9Ci0JCQlpZiAodGEgIT0gbnVsbCkgewotCQkJCWdldFRleHRBdHRyaWJ1dGVzKCkucHV0KGNvbG9yS2V5LCB0YSk7Ci0JCQkJZlNjYW5uZXIuc2V0VG9rZW5EYXRhKGNvbG9yS2V5LCB0YSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHRleHQgYXR0cmlidXRlIGVuY29kZWQgaW4gdGhlIGdpdmVuIHRva2VuLiBJZiB0aGUgdG9rZW4ncwotCSAqIGRhdGEgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IGFuZCBhIHRleHQgYXR0cmlidXRlIGl0IGlzIGFzc3VtZWQgdGhhdAotCSAqIGl0IGlzIHRoZSBlbmNvZGVkIHRleHQgYXR0cmlidXRlLiBJdCByZXR1cm5zIHRoZSBkZWZhdWx0IHRleHQgYXR0cmlidXRlCi0JICogaWYgdGhlcmUgaXMgbm8gZW5jb2RlZCB0ZXh0IGF0dHJpYnV0ZSBmb3VuZC4KLQkgKgotCSAqIEBwYXJhbSB0b2tlbiB0aGUgdG9rZW4gd2hvc2UgdGV4dCBhdHRyaWJ1dGUgaXMgdG8gYmUgZGV0ZXJtaW5lZAotCSAqIEByZXR1cm4gdGhlIHRva2VuJ3MgdGV4dCBhdHRyaWJ1dGUKLQkgKi8KLQlwcml2YXRlIFRleHRBdHRyaWJ1dGUgZ2V0VG9rZW5UZXh0QXR0cmlidXRlKElUb2tlbiB0b2tlbikgewotCQlUZXh0QXR0cmlidXRlIHRhID0gbnVsbDsKLQkJCi0JCU9iamVjdCBkYXRhID0gdG9rZW4uZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSBpbnN0YW5jZW9mIFRleHRBdHRyaWJ1dGUpCi0JCQl0YSA9IChUZXh0QXR0cmlidXRlKWRhdGE7Ci0JCWVsc2UgewotCQkJdGEgPSAoVGV4dEF0dHJpYnV0ZSlnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfREVGQVVMVCk7Ci0JCX0KLQkJcmV0dXJuIHRhOyAKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbG9hZENvbG9ycygpIHsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0pTUC5KU1BfQ09OVEVOVCk7Ci0JCQotCQlhZGRKYXZhVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfS0VZV09SRCk7Ci0JCWFkZEphdmFUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9TVFJJTkcpOwotCQlhZGRKYXZhVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfU0lOR0xFX0xJTkVfQ09NTUVOVCk7Ci0JCWFkZEphdmFUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9ERUZBVUxUKTsKLQkJCi0JCWZTY2FubmVyLmluaXRpYWxpemVSdWxlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0eWxlS2V5ID0gbnVsbDsKLQkJU3RyaW5nIGphdmFTdHlsZUtleSA9IG51bGw7Ci0KLQkJaWYgKGV2ZW50ICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmVmS2V5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCS8vIGNoZWNrIGlmIHByZWZlcmVuY2UgY2hhbmdlZCBpcyBhIHN0eWxlIHByZWZlcmVuY2UKLQkJCWlmIChJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNKU1AuSlNQX0NPTlRFTlQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNKU1AuSlNQX0NPTlRFTlQ7Ci0JCQl9IGVsc2UgaWYgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9DT0xPUi5lcXVhbHMocHJlZktleSkgfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9CT0xELmVxdWFscyhwcmVmS2V5KSl8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0lUQUxJQy5lcXVhbHMocHJlZktleSkpKSB7Ci0JCQkJamF2YVN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX0tFWVdPUkQ7Ci0JCQl9IGVsc2UgaWYgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19DT0xPUi5lcXVhbHMocHJlZktleSkgfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19CT0xELmVxdWFscyhwcmVmS2V5KSl8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX0lUQUxJQy5lcXVhbHMocHJlZktleSkpKSB7Ci0JCQkJamF2YVN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX1NUUklORzsKLQkJCX0gZWxzZSBpZiAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9DT0xPUi5lcXVhbHMocHJlZktleSkgfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfQk9MRC5lcXVhbHMocHJlZktleSkpfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfSVRBTElDLmVxdWFscyhwcmVmS2V5KSkpIHsKLQkJCQlqYXZhU3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfU0lOR0xFX0xJTkVfQ09NTUVOVDsKLQkJCX0gZWxzZSBpZiAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0NPTE9SLmVxdWFscyhwcmVmS2V5KSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0JPTEQuZXF1YWxzKHByZWZLZXkpKXx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfSVRBTElDLmVxdWFscyhwcmVmS2V5KSkpIHsKLQkJCQlqYXZhU3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfREVGQVVMVDsKLQkJCX0KLQkJfQotCi0JCWlmIChzdHlsZUtleSAhPSBudWxsKSB7Ci0JCQkvLyBvdmVyd3JpdGUgc3R5bGUgcHJlZmVyZW5jZSB3aXRoIG5ldyB2YWx1ZQotCQkJYWRkVGV4dEF0dHJpYnV0ZShzdHlsZUtleSk7Ci0JCX0KLQkJaWYgKGphdmFTdHlsZUtleSAhPSBudWxsKSB7Ci0JCQkvLyBvdmVyd3JpdGUgc3R5bGUgcHJlZmVyZW5jZSB3aXRoIG5ldyB2YWx1ZQotCQkJYWRkSmF2YVRleHRBdHRyaWJ1dGUoamF2YVN0eWxlS2V5KTsKLQkJCWZTY2FubmVyLmluaXRpYWxpemVSdWxlcygpOwotCQl9Ci0JCWlmIChzdHlsZUtleSAhPSBudWxsIHx8IGphdmFTdHlsZUtleSAhPSBudWxsKSB7Ci0JCQkvLyBmb3JjZSBhIGZ1bGwgdXBkYXRlIG9mIHRoZSB0ZXh0IHZpZXdlcgotCQkJZlJlY0hpZ2hsaWdodGVyLnJlZnJlc2hEaXNwbGF5KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwcmVwYXJlUmVnaW9ucyhJVHlwZWRSZWdpb24gdHlwZWRSZWdpb24sIGludCBzc3NzcmVxdWVzdGVkU3RhcnQsIGludCBzc3NzcmVxdWVzdGVkTGVuZ3RoLCBDb2xsZWN0aW9uIGhvbGRSZXN1bHRzKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJLyogSW5pdGlhbGl6ZSB0aGUgdGV4dCBhdHRyaWJ1dGVzLiBBbHNvIGxvYWQgdGhlIGNvbG9ycyBhbmQgaW5pdGlhbGl6ZSB0aGUgcnVsZXMgb2YgdGhlIHNjYW5uZXIgKi8KLQkJZ2V0VGV4dEF0dHJpYnV0ZXMoKTsKLQkJdHJ5IHsKLQkJCS8vIGlkZWFsbHksIGV2ZW50dWFsbHksIHdlJ2xsIGhhdmUgYSAidmlydHVhbERvY3VtZW50IiB3ZSBjYW4KLQkJCS8vIHJlZmVyIHRvLCBidXQgZm9yIG5vdyAuLi4gd2UnbGwgc2ltcGxlIHJlc2NhbiB0aGUgb25lIHJlZ2lvbi4KLQkJCS8vIHVzZSBzaW1wbGUgYWRqdXN0bWVudCAoc2luY2UgInN1Yi1jb250ZW50IiBzdGFydHMgYXQgMAotCQkJaW50IGxhc3RTdGFydCA9IHR5cGVkUmVnaW9uLmdldE9mZnNldCgpOwotCQkJaW50IGxlbmd0aCA9IDA7Ci0JCQlJVG9rZW4gbGFzdFRva2VuID0gVG9rZW4uVU5ERUZJTkVEOwotCQkJZlNjYW5uZXIuc2V0UmFuZ2UoZ2V0RG9jdW1lbnQoKSwgbGFzdFN0YXJ0LCB0eXBlZFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCUlUb2tlbiB0b2tlbiA9IGZTY2FubmVyLm5leHRUb2tlbigpOwotCQkJCWlmICh0b2tlbi5pc0VPRigpKSB7Ci0JCQkJCWlmICghbGFzdFRva2VuLmlzVW5kZWZpbmVkKCkgJiYgbGVuZ3RoICE9IDApIHsKLQkJCQkJCWFkZFJhbmdlKGhvbGRSZXN1bHRzLCBsYXN0U3RhcnQsIGxlbmd0aCwgZ2V0VG9rZW5UZXh0QXR0cmlidXRlKGxhc3RUb2tlbikpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAodG9rZW4uaXNXaGl0ZXNwYWNlKCkpIHsKLQkJCQkJbGVuZ3RoICs9IGZTY2FubmVyLmdldFRva2VuTGVuZ3RoKCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAobGFzdFRva2VuLmlzVW5kZWZpbmVkKCkpIHsKLQkJCQkJbGFzdFRva2VuID0gdG9rZW47Ci0JCQkJCWxlbmd0aCArPSBmU2Nhbm5lci5nZXRUb2tlbkxlbmd0aCgpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKHRva2VuICE9IGxhc3RUb2tlbikgewotCQkJCQlhZGRSYW5nZShob2xkUmVzdWx0cywgbGFzdFN0YXJ0LCBsZW5ndGgsIGdldFRva2VuVGV4dEF0dHJpYnV0ZShsYXN0VG9rZW4pKTsKLQkJCQkJbGFzdFRva2VuID0gdG9rZW47Ci0JCQkJCWxhc3RTdGFydCA9IGZTY2FubmVyLmdldFRva2VuT2Zmc2V0KCk7Ci0JCQkJCWxlbmd0aCA9IGZTY2FubmVyLmdldFRva2VuTGVuZ3RoKCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlsZW5ndGggKz0gZlNjYW5uZXIuZ2V0VG9rZW5MZW5ndGgoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNob3VsZG4ndCBoYXBwZW4sIGJ1dCB3ZSBkb24ndCB3YW50IGl0IHRvIHN0b3Agb3RoZXIKLQkJCS8vIGhpZ2hsaWdodGluZywgaWYgaXQgZG9lcy4KLQkJCXJlc3VsdCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBnZXRKYXZhQ29sb3JQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VDb25zdGFudHMuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyUHJlZmVyZW5jZU1hbmFnZXIoKSB7Ci0JCWdldENvbG9yUHJlZmVyZW5jZXMoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlTGlzdGVuZXIpOwotCQlnZXRKYXZhQ29sb3JQcmVmZXJlbmNlcygpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVuUmVnaXN0ZXJQcmVmZXJlbmNlTWFuYWdlcigpIHsKLQkJZ2V0Q29sb3JQcmVmZXJlbmNlcygpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JCWdldEphdmFDb2xvclByZWZlcmVuY2VzKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9JU3R5bGVDb25zdGFudHNKU1BFTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0lTdHlsZUNvbnN0YW50c0pTUEVMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzQ4MjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0lTdHlsZUNvbnN0YW50c0pTUEVMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmpzcGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZUNvbnN0YW50c0pTUEVMIHsKLQlTdHJpbmcgRUxfS0VZV09SRCA9ICJrZXl3b3JkIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBFTF9ERUZBVUxUID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSlNQRUxDb2RlU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0pTUEVMQ29kZVNjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUzNGI5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSlNQRUxDb2RlU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuanNwZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5Ub2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLldoaXRlc3BhY2VSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuV29yZFJ1bGU7Ci0KLS8qKgotICogQSBKYXZhIGNvZGUgc2Nhbm5lci4KLSAqLwotcHVibGljIGNsYXNzIEpTUEVMQ29kZVNjYW5uZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlJ1bGVCYXNlZFNjYW5uZXIgewotCXByaXZhdGUgSVRva2VuIGZLZXl3b3JkVG9rZW47Ci0JcHJpdmF0ZSBJVG9rZW4gZlR5cGVUb2tlbjsKLQlwcml2YXRlIElUb2tlbiBmRGVmYXVsdFRva2VuOwotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGZnS2V5d29yZHMgPSB7Ci0JCQkJImFuZCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiZGlkIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJkaXYiLCAvLyROT04tTkxTLTEkCi0JCQkJImVtcHR5IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJlcSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiZ2UiLCAvLyROT04tTkxTLTEkCi0JCQkJImd0IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJvciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkibGUiLCAvLyROT04tTkxTLTEkCi0JCQkJImx0IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJtb2QiLCAvLyROT04tTkxTLTEkCi0gCQkJCSJuZSIsIC8vJE5PTi1OTFMtMSQKLSAJCQkJIm5vdCIgIC8vJE5PTi1OTFMtMSQKLQl9OwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGZnQ29uc3RhbnRzID0geyJmYWxzZSIsICJ0cnVlIn07Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBKYXZhIGNvZGUgc2Nhbm5lcgotCSAqLwotCXB1YmxpYyBKU1BFTENvZGVTY2FubmVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUnVsZXMoKSB7Ci0JCUxpc3QgcnVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gQWRkIGdlbmVyaWMgd2hpdGVzcGFjZSBydWxlLgotCQlydWxlcy5hZGQobmV3IFdoaXRlc3BhY2VSdWxlKG5ldyBKU1BFTFdoaXRlc3BhY2VEZXRlY3RvcigpKSk7Ci0KLQkJLy8gQWRkIHdvcmQgcnVsZSBmb3Iga2V5d29yZHMsIHR5cGVzLCBhbmQgY29uc3RhbnRzLgotCQlXb3JkUnVsZSB3b3JkUnVsZSA9IG5ldyBXb3JkUnVsZShuZXcgSlNQRUxXb3JkRGV0ZWN0b3IoKSwgZkRlZmF1bHRUb2tlbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmdLZXl3b3Jkcy5sZW5ndGg7IGkrKykKLQkJCXdvcmRSdWxlLmFkZFdvcmQoZmdLZXl3b3Jkc1tpXSwgZktleXdvcmRUb2tlbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmdDb25zdGFudHMubGVuZ3RoOyBpKyspCi0JCQl3b3JkUnVsZS5hZGRXb3JkKGZnQ29uc3RhbnRzW2ldLCBmVHlwZVRva2VuKTsKLQkJcnVsZXMuYWRkKHdvcmRSdWxlKTsKLQotCQlJUnVsZVtdIHJlc3VsdCA9IG5ldyBJUnVsZVtydWxlcy5zaXplKCldOwotCQlydWxlcy50b0FycmF5KHJlc3VsdCk7Ci0JCXNldFJ1bGVzKHJlc3VsdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRva2VuRGF0YShTdHJpbmcgdG9rZW5LZXksIE9iamVjdCBkYXRhKSB7Ci0JCWlmICh0b2tlbktleSA9PSBJU3R5bGVDb25zdGFudHNKU1BFTC5FTF9LRVlXT1JEKSB7Ci0JCQlmS2V5d29yZFRva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQkJZlR5cGVUb2tlbiA9IG5ldyBUb2tlbihkYXRhKTsKLQkJfSBlbHNlIGlmICh0b2tlbktleSA9PSBJU3R5bGVDb25zdGFudHNKU1BFTC5FTF9ERUZBVUxUKSB7Ci0JCQlmRGVmYXVsdFRva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0pTUEVMQ29sb3JQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0pTUEVMQ29sb3JQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTE3OGEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9KU1BFTENvbG9yUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qc3BlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotCi0vKioKLSAqIENvbG9ycyB1c2VkIGluIHRoZSBKYXZhIGVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgSlNQRUxDb2xvclByb3ZpZGVyIHsKLQkKLQkvLyBwZW9wbGUgc2hvdWxkIG5vdCBiZSBzZXR0aW5nIHRoZXNlLCBldmVuIHRob3VnaCB0aGV5IGFyZSBjdXJyZW50bHkgbm90IGZpbmFsCi0JcHVibGljIHN0YXRpYyBSR0IgTVVMVElfTElORV9DT01NRU5UID0gbmV3IFJHQigxMjgsIDAsIDApOwotCXB1YmxpYyBzdGF0aWMgUkdCIFNJTkdMRV9MSU5FX0NPTU1FTlQgPSBuZXcgUkdCKDEyOCwgMTI4LCAwKTsKLQlwdWJsaWMgc3RhdGljIFJHQiBLRVlXT1JEID0gbmV3IFJHQigwLCAwLCAxMjgpOwotCXB1YmxpYyBzdGF0aWMgUkdCIFRZUEUgPSBuZXcgUkdCKDAsIDAsIDEyOCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgU1RSSU5HID0gbmV3IFJHQigwLCAxMjgsIDApOwotCXB1YmxpYyBzdGF0aWMgUkdCIERFRkFVTFQgPSBuZXcgUkdCKDAsIDAsIDApOwotCXB1YmxpYyBzdGF0aWMgUkdCIEpBVkFET0NfS0VZV09SRCA9IG5ldyBSR0IoMCwgMTI4LCAwKTsKLQlwdWJsaWMgc3RhdGljIFJHQiBKQVZBRE9DX1RBRyA9IG5ldyBSR0IoMTI4LCAxMjgsIDEyOCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgSkFWQURPQ19MSU5LID0gbmV3IFJHQigxMjgsIDEyOCwgMTI4KTsKLQlwdWJsaWMgc3RhdGljIFJHQiBKQVZBRE9DX0RFRkFVTFQgPSBuZXcgUkdCKDAsIDEyOCwgMTI4KTsKLQkKLQlwdWJsaWMgc3RhdGljIGludCBNVUxUSV9MSU5FX0NPTU1FTlRfQk9MRCA9IFNXVC5OT1JNQUw7Ci0JcHVibGljIHN0YXRpYyBpbnQgU0lOR0xFX0xJTkVfQ09NTUVOVF9CT0xEID0gU1dULk5PUk1BTDsKLQlwdWJsaWMgc3RhdGljIGludCBLRVlXT1JEX0JPTEQgPSBTV1QuQk9MRDsKLQlwdWJsaWMgc3RhdGljIGludCBUWVBFX0JPTEQgPSBTV1QuQk9MRDsKLQlwdWJsaWMgc3RhdGljIGludCBTVFJJTkdfQk9MRCA9IFNXVC5OT1JNQUw7Ci0JcHVibGljIHN0YXRpYyBpbnQgREVGQVVMVF9CT0xEID0gU1dULk5PUk1BTDsKLQlwdWJsaWMgc3RhdGljIGludCBKQVZBRE9DX0tFWVdPUkRfQk9MRCA9IFNXVC5CT0xEOwotCXB1YmxpYyBzdGF0aWMgaW50IEpBVkFET0NfVEFHX0JPTEQgPSBTV1QuTk9STUFMOwotCXB1YmxpYyBzdGF0aWMgaW50IEpBVkFET0NfTElOS19CT0xEID0gU1dULk5PUk1BTDsKLQlwdWJsaWMgc3RhdGljIGludCBKQVZBRE9DX0RFRkFVTFRfQk9MRCA9IFNXVC5OT1JNQUw7Ci0JCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgYWxsIGVkaXRvcnMgdXNlIHNhbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJHQiBFRElUT1JfQkFDS0dST1VORCA9IG5ldyBSR0IoMjU1LCAyNTUsIDI1NSk7Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgYWxsIGVkaXRvcnMgdXNlIHNhbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gRURJVE9SX0NVUlJFTlRfTElORSA9IHRydWU7Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgYWxsIGVkaXRvcnMgdXNlIHNhbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJHQiBFRElUT1JfQ1VSUkVOVF9MSU5FX0NPTE9SID0gbmV3IFJHQigxMjgsIDEyOCwgMTI4KTsKLQkKLQlwcml2YXRlIHN0YXRpYyBKU1BFTENvbG9yUHJvdmlkZXIgZkluc3RhbmNlID0gbnVsbDsKLQkKLQlwdWJsaWMgc3RhdGljIEpTUEVMQ29sb3JQcm92aWRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgSlNQRUxDb2xvclByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0JCi0JLyoqCi0JICogVXNlIGNvbG9ycyBmcm9tIEpEVCBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkSmF2YUNvbG9ycygpIHsKLQkJCi0JCUlQcmVmZXJlbmNlU3RvcmUgamR0U3RvcmUgPSBQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlNVUxUSV9MSU5FX0NPTU1FTlQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9NVUxUSV9MSU5FX0NPTU1FTlRfQ09MT1IpOwotCQlTSU5HTEVfTElORV9DT01NRU5UID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9DT0xPUik7Ci0JCUtFWVdPUkQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQ09MT1IpOwotCQlUWVBFID0gS0VZV09SRDsKLQkJU1RSSU5HID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX0NPTE9SKTsKLQkJREVGQVVMVCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9DT0xPUik7Ci0JCUpBVkFET0NfS0VZV09SRCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfS0VZV09SRF9DT0xPUik7Ci0JCUpBVkFET0NfVEFHID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQURPQ19UQUdfQ09MT1IpOwotCQlKQVZBRE9DX0xJTksgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX0xJTktTX0NPTE9SKTsKLQkJSkFWQURPQ19ERUZBVUxUID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQURPQ19ERUZBVUxUX0NPTE9SKTsKLQkJCi0JCU1VTFRJX0xJTkVfQ09NTUVOVF9CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9NVUxUSV9MSU5FX0NPTU1FTlRfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCVNJTkdMRV9MSU5FX0NPTU1FTlRfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJS0VZV09SRF9CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCVRZUEVfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlTVFJJTkdfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlERUZBVUxUX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJSkFWQURPQ19UQUdfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQURPQ19UQUdfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCUpBVkFET0NfTElOS19CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX0xJTktTX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlKQVZBRE9DX0RFRkFVTFRfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQURPQ19ERUZBVUxUX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQkKLS8vCQlFRElUT1JfQkFDS0dST1VORCA9IG5ldyBSR0IoMjU1LCAyNTUsIDI1NSk7Ci0JCQotLy8JCUlQcmVmZXJlbmNlU3RvcmUgc3NlU3RvcmUgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0vLwkJRURJVE9SX0NVUlJFTlRfTElORSA9IHNzZVN0b3JlLmdldEJvb2xlYW4oQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfQ1VSUkVOVF9MSU5FKTsKLS8vCQlFRElUT1JfQ1VSUkVOVF9MSU5FX0NPTE9SID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzc2VTdG9yZSwgQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfQ1VSUkVOVF9MSU5FX0NPTE9SKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSlNQRUxXaGl0ZXNwYWNlRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9KU1BFTFdoaXRlc3BhY2VEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODk5NzAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9KU1BFTFdoaXRlc3BhY2VEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuanNwZWw7Ci0KLQotCi0vKioKLSAqIEEgamF2YSBhd2FyZSB3aGl0ZSBzcGFjZSBkZXRlY3Rvci4KLSAqLwotcHVibGljIGNsYXNzIEpTUEVMV2hpdGVzcGFjZURldGVjdG9yIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JV2hpdGVzcGFjZURldGVjdG9yIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JV2hpdGVzcGFjZURldGVjdG9yI2lzV2hpdGVzcGFjZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2hpdGVzcGFjZShjaGFyIGMpIHsKLQkJcmV0dXJuIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0pTUEVMV29yZERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSlNQRUxXb3JkRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEwYTdhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSlNQRUxXb3JkRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmpzcGVsOwotCi0KLS8qKgotICogQSBKYXZhIGF3YXJlIHdvcmQgZGV0ZWN0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BFTFdvcmREZXRlY3RvciBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVdvcmREZXRlY3RvciB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVdvcmREZXRlY3RvciNpc1dvcmRJZGVudGlmaWVyUGFydAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV29yZFBhcnQoY2hhciBjKSB7Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXb3JkRGV0ZWN0b3IjaXNXb3JkSWRlbnRpZmllclN0YXJ0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXb3JkU3RhcnQoY2hhciBjKSB7Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9MaW5lU3R5bGVQcm92aWRlckZvckpTUEVMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvTGluZVN0eWxlUHJvdmlkZXJGb3JKU1BFTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmU2MzU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9MaW5lU3R5bGVQcm92aWRlckZvckpTUEVMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmpzcGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5Ub2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0pTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmphdmEuSVN0eWxlQ29uc3RhbnRzSlNQSmF2YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0hUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5Db2xvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c1hNTDsKLQotLy8gTm90ZTogbWFueSBvZiB0aGUgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHdlcmUgYmFzZWQgb24gKG9yIGNvcGllZCBmcm9tKQotLy8gdGhvc2UKLS8vIGZvdW5kIGluIHRoZSBleGFtcGxlIEphdmEgRWRpdG9yCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JKU1BFTCBleHRlbmRzIEFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIgaW1wbGVtZW50cyBMaW5lU3R5bGVQcm92aWRlciB7Ci0KLQkvKiogVGhlIHNjYW5uZXIgaXQgdXNlcyAqLwotCXByaXZhdGUgSlNQRUxDb2RlU2Nhbm5lciBmU2Nhbm5lcjsKLQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlckZvckpTUEVMKCkgewotCQlzdXBlcigpOwotCQlmU2Nhbm5lciA9IG5ldyBKU1BFTENvZGVTY2FubmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBzdHlsZSBpbmZvcm1hdGlvbiB0byB0aGUgZ2l2ZW4gdGV4dCBwcmVzZW50YXRpb24uCi0JICogCi0JICogQHBhcmFtIHByZXNlbnRhdGlvbgotCSAqICAgICAgICAgICAgdGhlIHRleHQgcHJlc2VudGF0aW9uIHRvIGJlIGV4dGVuZGVkCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgcmFuZ2UgdG8gYmUgc3R5bGVkCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcmFuZ2UgdG8gYmUgc3R5bGVkCi0JICogQHBhcmFtIGF0dHIKLQkgKiAgICAgICAgICAgIHRoZSBhdHRyaWJ1dGUgZGVzY3JpYmluZyB0aGUgc3R5bGUgb2YgdGhlIHJhbmdlIHRvIGJlIHN0eWxlZAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRSYW5nZShDb2xsZWN0aW9uIHByZXNlbnRhdGlvbiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgVGV4dEF0dHJpYnV0ZSBhdHRyKSB7Ci0JCS8vIHN1cHBvcnQgZm9yIHVzZXIgZGVmaW5lZCBiYWNrZ3JvdWQgZm9yIEpTUCBzY3JpcHRsZXQgcmVnaW9ucwotCQlTdHJpbmcgc3R5bGVTdHJpbmcgPSBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKElTdHlsZUNvbnN0YW50c0pTUC5KU1BfQ09OVEVOVCk7Ci0JCVN0cmluZ1tdIHByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVN0cmluZyk7Ci0JCUNvbG9yIGJnQ29sb3IgPSAocHJlZnMgIT0gbnVsbCAmJiBwcmVmcy5sZW5ndGggPT0gMyAmJiBwcmVmc1sxXS5zdGFydHNXaXRoKCIjIikgJiYgRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbCkgLy8kTk9OLU5MUy0xJAotCQkJCQk/IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgQ29sb3JIZWxwZXIudG9SR0IocHJlZnNbMV0pKSA6IGF0dHIuZ2V0QmFja2dyb3VuZCgpOwotCi0JCXByZXNlbnRhdGlvbi5hZGQobmV3IFN0eWxlUmFuZ2Uob2Zmc2V0LCBsZW5ndGgsIGF0dHIuZ2V0Rm9yZWdyb3VuZCgpLCBiZ0NvbG9yLCBhdHRyLmdldFN0eWxlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBMb29rcyB1cCB0aGUgY29sb3JLZXkgaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUgYW5kIGFkZHMgdGhlIHN0eWxlCi0JICogaW5mb3JtYXRpb24gdG8gbGlzdCBvZiBUZXh0QXR0cmlidXRlcwotCSAqIAotCSAqIEBwYXJhbSBjb2xvcktleQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRKYXZhVGV4dEF0dHJpYnV0ZShTdHJpbmcgY29sb3JLZXkpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldEphdmFDb2xvclByZWZlcmVuY2VzKCk7Ci0JCWlmIChzdG9yZSAhPSBudWxsICYmIGNvbG9yS2V5ICE9IG51bGwpIHsKLQkJCVRleHRBdHRyaWJ1dGUgdGEgPSBudWxsOwotCQkJaWYgKGNvbG9yS2V5ID09IElTdHlsZUNvbnN0YW50c0pTUEVMLkVMX0tFWVdPUkQpIHsKLQkJCQkvLyBrZXl3b3JkCi0JCQkJUkdCIGZvcmVncm91bmQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKHN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQ09MT1IpOwotCQkJCWJvb2xlYW4gYm9sZCA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0JPTEQpOwotCQkJCWJvb2xlYW4gaXRhbGljcyA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0lUQUxJQyk7Ci0JCQkJYm9vbGVhbiBzdHJpa2V0aHJvdWdoID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfU1RSSUtFVEhST1VHSCk7Ci0JCQkJYm9vbGVhbiB1bmRlcmxpbmUgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9VTkRFUkxJTkUpOwotCQkJCWludCBzdHlsZSA9IFNXVC5OT1JNQUw7Ci0JCQkJaWYgKGJvbGQpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoaXRhbGljcykgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULklUQUxJQzsKLQkJCQl9Ci0JCQkJaWYgKHN0cmlrZXRocm91Z2gpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuU1RSSUtFVEhST1VHSDsKLQkJCQl9Ci0JCQkJaWYgKHVuZGVybGluZSkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkU7Ci0JCQkJfQotCi0JCQkJdGEgPSBjcmVhdGVUZXh0QXR0cmlidXRlKGZvcmVncm91bmQsIG51bGwsIHN0eWxlKTsKLQkJCX0gZWxzZSBpZiAoY29sb3JLZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNQRUwuRUxfREVGQVVMVCkgewotCQkJCS8vIGRlZmF1bHQKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9DT0xPUik7Ci0JCQkJYm9vbGVhbiBib2xkID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQk9MRCk7Ci0JCQkJYm9vbGVhbiBpdGFsaWNzID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfSVRBTElDKTsKLQkJCQlib29sZWFuIHN0cmlrZXRocm91Z2ggPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9TVFJJS0VUSFJPVUdIKTsKLQkJCQlib29sZWFuIHVuZGVybGluZSA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX1VOREVSTElORSk7Ci0JCQkJaW50IHN0eWxlID0gU1dULk5PUk1BTDsKLQkJCQlpZiAoYm9sZCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChpdGFsaWNzKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuSVRBTElDOwotCQkJCX0KLQkJCQlpZiAoc3RyaWtldGhyb3VnaCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAodW5kZXJsaW5lKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlVOREVSTElORTsKLQkJCQl9Ci0KLQkJCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgbnVsbCwgc3R5bGUpOwotCQkJfQotCQkJaWYgKHRhICE9IG51bGwpIHsKLQkJCQlnZXRUZXh0QXR0cmlidXRlcygpLnB1dChjb2xvcktleSwgdGEpOwotCQkJCWZTY2FubmVyLnNldFRva2VuRGF0YShjb2xvcktleSwgdGEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHRleHQgYXR0cmlidXRlIGVuY29kZWQgaW4gdGhlIGdpdmVuIHRva2VuLiBJZiB0aGUgdG9rZW4ncwotCSAqIGRhdGEgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IGFuZCBhIHRleHQgYXR0cmlidXRlIGl0IGlzIGFzc3VtZWQgdGhhdAotCSAqIGl0IGlzIHRoZSBlbmNvZGVkIHRleHQgYXR0cmlidXRlLiBJdCByZXR1cm5zIHRoZSBkZWZhdWx0IHRleHQgYXR0cmlidXRlCi0JICogaWYgdGhlcmUgaXMgbm8gZW5jb2RlZCB0ZXh0IGF0dHJpYnV0ZSBmb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiAgICAgICAgICAgIHRoZSB0b2tlbiB3aG9zZSB0ZXh0IGF0dHJpYnV0ZSBpcyB0byBiZSBkZXRlcm1pbmVkCi0JICogQHJldHVybiB0aGUgdG9rZW4ncyB0ZXh0IGF0dHJpYnV0ZQotCSAqLwotCXByaXZhdGUgVGV4dEF0dHJpYnV0ZSBnZXRUb2tlblRleHRBdHRyaWJ1dGUoSVRva2VuIHRva2VuKSB7Ci0JCVRleHRBdHRyaWJ1dGUgdGEgPSBudWxsOwotCi0JCU9iamVjdCBkYXRhID0gdG9rZW4uZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSBpbnN0YW5jZW9mIFRleHRBdHRyaWJ1dGUpCi0JCQl0YSA9IChUZXh0QXR0cmlidXRlKSBkYXRhOwotCQllbHNlIHsKLQkJCXRhID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9ERUZBVUxUKTsKLQkJfQotCQlyZXR1cm4gdGE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZENvbG9ycygpIHsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCi0JCWFkZEphdmFUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9LRVlXT1JEKTsKLQkJYWRkSmF2YVRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX0RFRkFVTFQpOwotCi0JCWZTY2FubmVyLmluaXRpYWxpemVSdWxlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0eWxlS2V5ID0gbnVsbDsKLQkJU3RyaW5nIGphdmFTdHlsZUtleSA9IG51bGw7Ci0KLQkJaWYgKGV2ZW50ICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmVmS2V5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCS8vIGNoZWNrIGlmIHByZWZlcmVuY2UgY2hhbmdlZCBpcyBhIHN0eWxlIHByZWZlcmVuY2UKLQkJCWlmIChJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRTsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCX0gZWxzZSBpZiAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0NPTE9SLmVxdWFscyhwcmVmS2V5KSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0JPTEQuZXF1YWxzKHByZWZLZXkpKSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0lUQUxJQy5lcXVhbHMocHJlZktleSkpKSB7Ci0JCQkJamF2YVN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzSlNQRUwuRUxfS0VZV09SRDsKLQkJCX0gZWxzZSBpZiAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0NPTE9SLmVxdWFscyhwcmVmS2V5KSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0JPTEQuZXF1YWxzKHByZWZLZXkpKSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0lUQUxJQy5lcXVhbHMocHJlZktleSkpKSB7Ci0JCQkJamF2YVN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzSlNQRUwuRUxfREVGQVVMVDsKLQkJCX0KLQkJfQotCi0JCWlmIChzdHlsZUtleSAhPSBudWxsKSB7Ci0JCQkvLyBvdmVyd3JpdGUgc3R5bGUgcHJlZmVyZW5jZSB3aXRoIG5ldyB2YWx1ZQotCQkJYWRkVGV4dEF0dHJpYnV0ZShzdHlsZUtleSk7Ci0JCX0KLQkJaWYgKGphdmFTdHlsZUtleSAhPSBudWxsKSB7Ci0JCQkvLyBvdmVyd3JpdGUgc3R5bGUgcHJlZmVyZW5jZSB3aXRoIG5ldyB2YWx1ZQotCQkJYWRkSmF2YVRleHRBdHRyaWJ1dGUoamF2YVN0eWxlS2V5KTsKLQkJCWZTY2FubmVyLmluaXRpYWxpemVSdWxlcygpOwotCQl9Ci0JCWlmIChzdHlsZUtleSAhPSBudWxsIHx8IGphdmFTdHlsZUtleSAhPSBudWxsKSB7Ci0JCQkvLyBmb3JjZSBhIGZ1bGwgdXBkYXRlIG9mIHRoZSB0ZXh0IHZpZXdlcgotCQkJZlJlY0hpZ2hsaWdodGVyLnJlZnJlc2hEaXNwbGF5KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwcmVwYXJlUmVnaW9ucyhJVHlwZWRSZWdpb24gdHlwZWRSZWdpb24sIGludCBzc3NzcmVxdWVzdGVkU3RhcnQsIGludCBzc3NzcmVxdWVzdGVkTGVuZ3RoLCBDb2xsZWN0aW9uIGhvbGRSZXN1bHRzKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCS8vIGlkZWFsbHksIGV2ZW50dWFsbHksIHdlJ2xsIGhhdmUgYSAidmlydHVhbERvY3VtZW50IiB3ZSBjYW4KLQkJCS8vIHJlZmVyIHRvLCBidXQgZm9yIG5vdyAuLi4gd2UnbGwgc2ltcGxlIHJlc2NhbiB0aGUgb25lIHJlZ2lvbi4KLQkJCS8vIHVzZSBzaW1wbGUgYWRqdXN0bWVudCAoc2luY2UgInN1Yi1jb250ZW50IiBzdGFydHMgYXQgMAotCQkJaW50IG9mZnNldEFkanVzdG1lbnQgPSB0eXBlZFJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCVN0cmluZyBjb250ZW50ID0gZkRvY3VtZW50LmdldCh0eXBlZFJlZ2lvbi5nZXRPZmZzZXQoKSwgdHlwZWRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gbmV3IERvY3VtZW50KGNvbnRlbnQpOwotCi0JCQlpbnQgbGFzdFN0YXJ0ID0gMDsKLQkJCWludCBsZW5ndGggPSAwOwotCQkJSVRva2VuIGxhc3RUb2tlbiA9IFRva2VuLlVOREVGSU5FRDsKLQotCQkJaW50IHJlbWFpbmluZ0xlbmd0aCA9IHR5cGVkUmVnaW9uLmdldExlbmd0aCgpOwotCQkJZlNjYW5uZXIuc2V0UmFuZ2UoZG9jdW1lbnQsIGxhc3RTdGFydCwgcmVtYWluaW5nTGVuZ3RoKTsKLQotCQkJd2hpbGUgKHRydWUpIHsKLQotCQkJCUlUb2tlbiB0b2tlbiA9IGZTY2FubmVyLm5leHRUb2tlbigpOwotCi0JCQkJaWYgKHRva2VuLmlzRU9GKCkpIHsKLQkJCQkJaWYgKCFsYXN0VG9rZW4uaXNVbmRlZmluZWQoKSAmJiBsZW5ndGggIT0gMCkKLQkJCQkJCWFkZFJhbmdlKGhvbGRSZXN1bHRzLCBsYXN0U3RhcnQgKyBvZmZzZXRBZGp1c3RtZW50LCBsZW5ndGgsIGdldFRva2VuVGV4dEF0dHJpYnV0ZShsYXN0VG9rZW4pKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJaWYgKHRva2VuLmlzV2hpdGVzcGFjZSgpKSB7Ci0JCQkJCWxlbmd0aCArPSBmU2Nhbm5lci5nZXRUb2tlbkxlbmd0aCgpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAobGFzdFRva2VuLmlzVW5kZWZpbmVkKCkpIHsKLQkJCQkJbGFzdFRva2VuID0gdG9rZW47Ci0JCQkJCWxlbmd0aCArPSBmU2Nhbm5lci5nZXRUb2tlbkxlbmd0aCgpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAodG9rZW4gIT0gbGFzdFRva2VuKSB7Ci0JCQkJCWFkZFJhbmdlKGhvbGRSZXN1bHRzLCBsYXN0U3RhcnQgKyBvZmZzZXRBZGp1c3RtZW50LCBsZW5ndGgsIGdldFRva2VuVGV4dEF0dHJpYnV0ZShsYXN0VG9rZW4pKTsKLQkJCQkJbGFzdFRva2VuID0gdG9rZW47Ci0JCQkJCWxhc3RTdGFydCA9IGZTY2FubmVyLmdldFRva2VuT2Zmc2V0KCk7Ci0JCQkJCWxlbmd0aCA9IGZTY2FubmVyLmdldFRva2VuTGVuZ3RoKCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWxlbmd0aCArPSBmU2Nhbm5lci5nZXRUb2tlbkxlbmd0aCgpOwotCQkJfQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGRuJ3QgaGFwcGVuLCBidXQgd2UgZG9uJ3Qgd2FudCBpdCB0byBzdG9wIG90aGVyCi0JCQkvLyBoaWdobGlnaHRpbmcsIGlmIGl0IGRvZXMuCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRDb2xvclByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQkKLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZ2V0SmF2YUNvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCkgewotCQlnZXRDb2xvclByZWZlcmVuY2VzKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQkJZ2V0SmF2YUNvbG9yUHJlZmVyZW5jZXMoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlTGlzdGVuZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1blJlZ2lzdGVyUHJlZmVyZW5jZU1hbmFnZXIoKSB7Ci0JCWdldENvbG9yUHJlZmVyZW5jZXMoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlTGlzdGVuZXIpOwotCQlnZXRKYXZhQ29sb3JQcmVmZXJlbmNlcygpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlRm9yKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KU1BJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KU1BJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNzM3MWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSlNQSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLS8qKgotICogUHJvdmlkZXMgY29udGV4dCBoZWxwIGZvciBKU1AgdGFncyAoU2hvdyB0b29sdGlwIGRlc2NyaXB0aW9uKQotICogCi0gKiBAZGVwcmVjYXRlZCBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gY3JlYXRlcyB0aGUgYXBwcm9wcmlhdGUKLSAqICAgICAgICAgICAgIGluZm9ybWF0aW9uIHByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BJbmZvcm1hdGlvblByb3ZpZGVyIGltcGxlbWVudHMgSUluZm9ybWF0aW9uUHJvdmlkZXIsIElJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uIHsKLQlwcml2YXRlIElUZXh0SG92ZXIgZlRleHRIb3ZlciA9IG51bGw7Ci0KLQlwdWJsaWMgSlNQSW5mb3JtYXRpb25Qcm92aWRlcigpIHsKLQkJZlRleHRIb3ZlciA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZXh0SG92ZXJNYW5hZ2VyKCkuY3JlYXRlQmVzdE1hdGNoSG92ZXIobmV3IEpTUFRhZ0luZm9Ib3ZlclByb2Nlc3NvcigpKTsKLQl9Ci0KLQlwdWJsaWMgSVJlZ2lvbiBnZXRTdWJqZWN0KElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIGZUZXh0SG92ZXIuZ2V0SG92ZXJSZWdpb24odGV4dFZpZXdlciwgb2Zmc2V0KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gc3ViamVjdCkgewotCQlyZXR1cm4gKFN0cmluZykgZ2V0SW5mb3JtYXRpb24yKHRleHRWaWV3ZXIsIHN1YmplY3QpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24yKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gc3ViamVjdCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlckluZm8odGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSlNQSmF2YUphdmFkb2NIb3ZlclByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSlNQSmF2YUphdmFkb2NIb3ZlclByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzk4Y2JhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUEphdmFKYXZhZG9jSG92ZXJQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudExhYmVsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YWRvY0NvbnRlbnRBY2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwudGV4dC5odG1sLkhUTUxQcmludGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLklKU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50YWdpbmZvLkFic3RyYWN0SG92ZXJQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0vKioKLSAqIFByb3ZpZGVzIGphdmFkb2MgaG92ZXIgaGVscCBkb2N1bWVudGF0aW9uIGZvciBqYXZhIGNvZGUgaW5zaWRlIEpTUHMKLSAqLwotcHVibGljIGNsYXNzIEpTUEphdmFKYXZhZG9jSG92ZXJQcm9jZXNzb3IgZXh0ZW5kcyBBYnN0cmFjdEhvdmVyUHJvY2Vzc29yIHsKLQkvKgotCSAqIEJ1bGsgb2YgdGhlIHdvcmsgd2FzIGNvcGllZCBmcm9tCi0JICogb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuamF2YS5ob3Zlci5KYXZhZG9jSG92ZXIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGxvbmcgTEFCRUxfRkxBR1MgPSBKYXZhRWxlbWVudExhYmVscy5BTExfRlVMTFlfUVVBTElGSUVEIHwgSmF2YUVsZW1lbnRMYWJlbHMuTV9QUkVfUkVUVVJOVFlQRSB8IEphdmFFbGVtZW50TGFiZWxzLk1fUEFSQU1FVEVSX1RZUEVTIHwgSmF2YUVsZW1lbnRMYWJlbHMuTV9QQVJBTUVURVJfTkFNRVMgfCBKYXZhRWxlbWVudExhYmVscy5NX0VYQ0VQVElPTlMgfCBKYXZhRWxlbWVudExhYmVscy5GX1BSRV9UWVBFX1NJR05BVFVSRSB8IEphdmFFbGVtZW50TGFiZWxzLk1fUFJFX1RZUEVfUEFSQU1FVEVSUyB8IEphdmFFbGVtZW50TGFiZWxzLlRfVFlQRV9QQVJBTUVURVJTIHwgSmF2YUVsZW1lbnRMYWJlbHMuVVNFX1JFU09MVkVEOwotCXByaXZhdGUgZmluYWwgbG9uZyBMT0NBTF9WQVJJQUJMRV9GTEFHUyA9IExBQkVMX0ZMQUdTICYgfkphdmFFbGVtZW50TGFiZWxzLkZfRlVMTFlfUVVBTElGSUVEIHwgSmF2YUVsZW1lbnRMYWJlbHMuRl9QT1NUX1FVQUxJRklFRDsKLQotCXByaXZhdGUgU3RyaW5nIGdldEhvdmVySW5mbyhJSmF2YUVsZW1lbnRbXSByZXN1bHQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IG5SZXN1bHRzID0gcmVzdWx0Lmxlbmd0aDsKLQkJaWYgKG5SZXN1bHRzID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoblJlc3VsdHMgPiAxKSB7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJSFRNTFByaW50ZXIuc3RhcnRCdWxsZXRMaXN0KGJ1ZmZlcik7Ci0JCQkJSUphdmFFbGVtZW50IGN1cnIgPSByZXN1bHRbaV07Ci0JCQkJaWYgKGN1cnIgaW5zdGFuY2VvZiBJTWVtYmVyIHx8IGN1cnIuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEUpCi0JCQkJCUhUTUxQcmludGVyLmFkZEJ1bGxldChidWZmZXIsIGdldEluZm9UZXh0KGN1cnIpKTsKLQkJCQlIVE1MUHJpbnRlci5lbmRCdWxsZXRMaXN0KGJ1ZmZlcik7Ci0JCQl9Ci0KLQkJfQotCQllbHNlIHsKLQotCQkJSUphdmFFbGVtZW50IGN1cnIgPSByZXN1bHRbMF07Ci0JCQlpZiAoY3VyciBpbnN0YW5jZW9mIElNZW1iZXIpIHsKLQkJCQlJTWVtYmVyIG1lbWJlciA9IChJTWVtYmVyKSBjdXJyOwotCQkJCUhUTUxQcmludGVyLmFkZFNtYWxsSGVhZGVyKGJ1ZmZlciwgZ2V0SW5mb1RleHQobWVtYmVyKSk7Ci0JCQkJUmVhZGVyIHJlYWRlcjsKLQkJCQl0cnkgewotCQkJCQlyZWFkZXIgPSBKYXZhZG9jQ29udGVudEFjY2Vzcy5nZXRIVE1MQ29udGVudFJlYWRlcihtZW1iZXIsIHRydWUsIHRydWUpOwotCQkJCX0KLQkJCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlpZiAocmVhZGVyICE9IG51bGwpIHsKLQkJCQkJSFRNTFByaW50ZXIuYWRkUGFyYWdyYXBoKGJ1ZmZlciwgcmVhZGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChjdXJyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFIHx8IGN1cnIuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRV9QQVJBTUVURVIpCi0JCQkJSFRNTFByaW50ZXIuYWRkU21hbGxIZWFkZXIoYnVmZmVyLCBnZXRJbmZvVGV4dChjdXJyKSk7Ci0JCX0KLQotCQlpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgewotCQkJSFRNTFByaW50ZXIuaW5zZXJ0UGFnZVByb2xvZyhidWZmZXIsIDApOwotCQkJSFRNTFByaW50ZXIuYWRkUGFnZUVwaWxvZyhidWZmZXIpOwotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIjZ2V0SG92ZXJJbmZvKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIb3ZlckluZm8oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBob3ZlclJlZ2lvbikgewotCQkvLyBnZXQgSlNQIHRyYW5zbGF0aW9uIG9iamVjdCBmb3IgdGhpcyB2aWV3ZXIncyBkb2N1bWVudAotCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCXRyeSB7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCUpTUFRyYW5zbGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKEpTUFRyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpTUFRyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCUpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbigpOwotCQkJCQkKLQkJCQkJSUphdmFFbGVtZW50W10gcmVzdWx0ID0gdHJhbnNsYXRpb24uZ2V0RWxlbWVudHNGcm9tSnNwUmFuZ2UoaG92ZXJSZWdpb24uZ2V0T2Zmc2V0KCksIGhvdmVyUmVnaW9uLmdldE9mZnNldCgpICsgaG92ZXJSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQlyZXR1cm4gdHJhbnNsYXRpb24uZml4dXBNYW5nbGVkTmFtZShnZXRIb3ZlckluZm8ocmVzdWx0KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpCi0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIjZ2V0SG92ZXJSZWdpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIb3ZlclJlZ2lvbihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBKYXZhV29yZEZpbmRlci5maW5kV29yZCh0ZXh0Vmlld2VyLmdldERvY3VtZW50KCksIG9mZnNldCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5mb1RleHQoSUphdmFFbGVtZW50IG1lbWJlcikgewotCQlsb25nIGZsYWdzID0gbWVtYmVyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFID8gTE9DQUxfVkFSSUFCTEVfRkxBR1MgOiBMQUJFTF9GTEFHUzsKLQkJU3RyaW5nIGxhYmVsID0gSmF2YUVsZW1lbnRMYWJlbHMuZ2V0RWxlbWVudExhYmVsKG1lbWJlciwgZmxhZ3MpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxhYmVsLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBsYWJlbC5jaGFyQXQoaSk7Ci0JCQlpZiAoY2ggPT0gJzwnKSB7Ci0JCQkJYnVmLmFwcGVuZCgiJmx0OyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmIChjaCA9PSAnPicpIHsKLQkJCQlidWYuYXBwZW5kKCImZ3Q7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJ1Zi5hcHBlbmQoY2gpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KU1BKYXZhSmF2YWRvY0luZm9ybWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUEphdmFKYXZhZG9jSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWEwNmYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUEphdmFKYXZhZG9jSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLS8qKgotICogUHJvdmlkZXMgamF2YWRvYyBjb250ZXh0IGluZm9ybWF0aW9uIGZvciBqYXZhIGNvZGUgaW5zaWRlIEpTUHMgKFNob3dzCi0gKiB0b29sdGlwIGRlc2NyaXB0aW9uKQotICogCi0gKiBAZGVwcmVjYXRlZCBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gY3JlYXRlcyB0aGUgYXBwcm9wcmlhdGUKLSAqICAgICAgICAgICAgIGluZm9ybWF0aW9uIHByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BKYXZhSmF2YWRvY0luZm9ybWF0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJSW5mb3JtYXRpb25Qcm92aWRlciwgSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb24gewotCXByaXZhdGUgSVRleHRIb3ZlciBmVGV4dEhvdmVyID0gbnVsbDsKLQotCXB1YmxpYyBKU1BKYXZhSmF2YWRvY0luZm9ybWF0aW9uUHJvdmlkZXIoKSB7Ci0JCWZUZXh0SG92ZXIgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGV4dEhvdmVyTWFuYWdlcigpLmNyZWF0ZUJlc3RNYXRjaEhvdmVyKG5ldyBKU1BKYXZhSmF2YWRvY0hvdmVyUHJvY2Vzc29yKCkpOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldFN1YmplY3QoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlclJlZ2lvbih0ZXh0Vmlld2VyLCBvZmZzZXQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBzdWJqZWN0KSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXRJbmZvcm1hdGlvbjIodGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbjIoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBzdWJqZWN0KSB7Ci0JCXJldHVybiBmVGV4dEhvdmVyLmdldEhvdmVySW5mbyh0ZXh0Vmlld2VyLCBzdWJqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KU1BUYWdJbmZvSG92ZXJQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUFRhZ0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzJhN2MyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUFRhZ0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50YWdpbmZvLkhUTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLS8qKgotICogUHJvdmlkZXMgaG92ZXIgaGVscCBkb2N1bWVudGF0aW9uIGZvciBKU1AgdGFncwotICovCi1wdWJsaWMgY2xhc3MgSlNQVGFnSW5mb0hvdmVyUHJvY2Vzc29yIGV4dGVuZHMgSFRNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvciB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVSZWdpb25IZWxwKEluZGV4ZWRSZWdpb24gdHJlZU5vZGUsIElET01Ob2RlIHBhcmVudE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmIChyZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJcmVzdWx0ID0gY29tcHV0ZUpTUERpckhlbHAoKElET01Ob2RlKSB0cmVlTm9kZSwgcGFyZW50Tm9kZSwgZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZQotCQkJcmVzdWx0ID0gc3VwZXIuY29tcHV0ZVJlZ2lvbkhlbHAodHJlZU5vZGUsIHBhcmVudE5vZGUsIGZsYXROb2RlLCByZWdpb24pOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGhvdmVyIGhlbHAgZm9yIHRoZSBqc3AgZGlyZWN0aXZlIG5hbWUKLQkgKiBmb3Igbm93LCB0cmVhdCBqc3AgZGlyZWN0aXZlcyBsaWtlIGFueSBvdGhlciB0YWcgbmFtZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZUpTUERpckhlbHAoSURPTU5vZGUgeG1sbm9kZSwgSURPTU5vZGUgcGFyZW50Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXJldHVybiBjb21wdXRlVGFnTmFtZUhlbHAoeG1sbm9kZSwgcGFyZW50Tm9kZSwgZmxhdE5vZGUsIHJlZ2lvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KYXZhV29yZEZpbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSmF2YVdvcmRGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI1MTA5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KYXZhV29yZEZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotCi0vKioKLSAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkphdmFXb3JkRmluZGVyCi0gKi8KLWNsYXNzIEphdmFXb3JkRmluZGVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIElSZWdpb24gZmluZFdvcmQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCQotCQlpbnQgc3RhcnQ9IC0xOwotCQlpbnQgZW5kPSAtMTsKLQkJCi0JCQotCQl0cnkgewotCQkJCi0JCQlpbnQgcG9zPSBvZmZzZXQ7Ci0JCQljaGFyIGM7Ci0JCQkKLQkJCXdoaWxlIChwb3MgPj0gMCkgewotCQkJCWM9IGRvY3VtZW50LmdldENoYXIocG9zKTsKLQkJCQlpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKSkKLQkJCQkJYnJlYWs7Ci0JCQkJLS1wb3M7Ci0JCQl9Ci0JCQkKLQkJCXN0YXJ0PSBwb3M7Ci0JCQkKLQkJCXBvcz0gb2Zmc2V0OwotCQkJaW50IGxlbmd0aD0gZG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0JCQkKLQkJCXdoaWxlIChwb3MgPCBsZW5ndGgpIHsKLQkJCQljPSBkb2N1bWVudC5nZXRDaGFyKHBvcyk7Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYykpCi0JCQkJCWJyZWFrOwotCQkJCSsrcG9zOwotCQkJfQotCQkJCi0JCQllbmQ9IHBvczsKLQkJCQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCX0KLQkJCi0JCWlmIChzdGFydCA+IC0xICYmIGVuZCA+IC0xKSB7Ci0JCQlpZiAoc3RhcnQgPT0gb2Zmc2V0ICYmIGVuZCA9PSBvZmZzZXQpCi0JCQkJcmV0dXJuIG5ldyBSZWdpb24ob2Zmc2V0LCAwKTsKLQkJCWVsc2UgaWYgKHN0YXJ0ID09IG9mZnNldCkKLQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpOwotCQkJZWxzZQotCQkJCXJldHVybiBuZXcgUmVnaW9uKHN0YXJ0ICsgMSwgZW5kIC0gc3RhcnQgLSAxKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RlbXBsYXRlcy9FbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RlbXBsYXRlcy9FbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2IxMDU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5TaW1wbGVUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci0KLQotcHVibGljIGNsYXNzIEVuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySlNQIGV4dGVuZHMgU2ltcGxlVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkdfVFlQRSA9IGdldEVuY29kaW5nVHlwZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEVuY29kaW5nVHlwZSgpIHsKLQkJcmV0dXJuICJlbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVuY29kaW5nIHZhcmlhYmxlCi0JICovCi0JcHVibGljIEVuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySlNQKCkgewotCQlzdXBlcihFTkNPRElOR19UWVBFLCBKU1BVSU1lc3NhZ2VzLkNyZWF0aW5nX2ZpbGVzX2VuY29kaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmUoVGVtcGxhdGVDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWM3N2Y5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTEwgPSBnZXRBbGwoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURSA9IGdldEF0dHJpYnV0ZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1ZBTFVFID0gZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVyA9IGdldE5ldygpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gZ2V0VGFnKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfVEFHID0gInRhZ19uZXciOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEFsbCgpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl9hbGwiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl9hdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX2F0dHJpYnV0ZV92YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmV3KCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX25ldyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlyZXR1cm4gImpzcCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGFnKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX3RhZyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGUxOWU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBKU1AgdGVtcGxhdGUgY29udGV4dCB0eXBlcy4gVGVtcGxhdGVzIG9mIHRoaXMgY29udGV4dCB0eXBlCi0gKiBhcHBseSB0byBhbnkgcGxhY2Ugd2l0aGluIEpTUCBjb250ZW50IHR5cGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUNvbnRleHRUeXBlSlNQIGV4dGVuZHMgVGVtcGxhdGVDb250ZXh0VHlwZSB7Ci0JcHVibGljIFRlbXBsYXRlQ29udGV4dFR5cGVKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5DdXJzb3IoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5EYXRlKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuRG9sbGFyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuTGluZVNlbGVjdGlvbigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlRpbWUoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Vc2VyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuV29yZFNlbGVjdGlvbigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlllYXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckpTUCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGV4dC9KU1BEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGV4dC9KU1BEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExM2M0MTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RleHQvSlNQRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGV4dC5Eb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBKU1BEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIGV4dGVuZHMgRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciB7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGNoYXJbXSBCUkFDS0VUUyA9IHsneycsICd9JywgJygnLCAnKScsICdbJywgJ10nLCciJywnIicsJ1wnJywnXCcnfTsKLQotCS8qKgotCSAqIEBwYXJhbSB2YWxpZENvbnRleHRzCi0JICogQHBhcmFtIG5leHRNYXRjaGVyCi0JICovCi0JcHVibGljIEpTUERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIoKSB7Ci0JCXN1cGVyKG5ldyBTdHJpbmdbXXtET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSwgRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhULCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9URVhULCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FLCBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhULCBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOLCBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DT05URU5UfSwgbmV3IEphdmFQYWlyTWF0Y2hlcihCUkFDS0VUUykpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZXh0L0phdmFDb2RlUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGV4dC9KYXZhQ29kZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjgwMjM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZXh0L0phdmFDb2RlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZGVyaXZlZC5TaW5nbGVDaGFyUmVhZGVyOwotCi0KLS8qKgotICogUmVhZHMgZnJvbSBhIGRvY3VtZW50IGVpdGhlciBmb3J3YXJkcyBvciBiYWNrd2FyZHMuIE1heSBiZSBjb25maWd1cmVkIHRvCi0gKiBza2lwIGNvbW1lbnRzIGFuZCBzdHJpbmdzLgotICogCi0gKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dCBzbyB3ZSBkb24ndCBoYXZlIHRvCi0gKiBkZXBlbmQgb24gdGhlIG9yZy5lY2xpcHNlLmpkdC51aSBwbHVnaW4uCi0gKiAKLSAqIE5vIG1vZGlmaWNhdGlvbnMgd2VyZSBtYWRlLgotICovCi1jbGFzcyBKYXZhQ29kZVJlYWRlciBleHRlbmRzIFNpbmdsZUNoYXJSZWFkZXIgewotCi0JLyoqIFRoZSBFT0YgY2hhcmFjdGVyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GID0gLTE7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlNraXBDb21tZW50cyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmU2tpcFN0cmluZ3MgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkZvcndhcmQgPSBmYWxzZTsKLQotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIGludCBmT2Zmc2V0OwotCi0JcHJpdmF0ZSBpbnQgZkVuZCA9IC0xOwotCXByaXZhdGUgaW50IGZDYWNoZWRMaW5lTnVtYmVyID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZkNhY2hlZExpbmVPZmZzZXQgPSAtMTsKLQotCi0JcHVibGljIEphdmFDb2RlUmVhZGVyKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgbGFzdCByZWFkIGNoYXJhY3Rlci4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFmdGVyIHJlYWQgaGFzIGJlZW4gY2FsbGVkLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gZkZvcndhcmQgPyBmT2Zmc2V0IC0gMSA6IGZPZmZzZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgY29uZmlndXJlRm9yd2FyZFJlYWRlcihJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gc2tpcENvbW1lbnRzLCBib29sZWFuIHNraXBTdHJpbmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQkJZlNraXBDb21tZW50cyA9IHNraXBDb21tZW50czsKLQkJZlNraXBTdHJpbmdzID0gc2tpcFN0cmluZ3M7Ci0KLQkJZkZvcndhcmQgPSB0cnVlOwotCQlmRW5kID0gTWF0aC5taW4oZkRvY3VtZW50LmdldExlbmd0aCgpLCBmT2Zmc2V0ICsgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25maWd1cmVCYWNrd2FyZFJlYWRlcihJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGJvb2xlYW4gc2tpcENvbW1lbnRzLCBib29sZWFuIHNraXBTdHJpbmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQkJZlNraXBDb21tZW50cyA9IHNraXBDb21tZW50czsKLQkJZlNraXBTdHJpbmdzID0gc2tpcFN0cmluZ3M7Ci0KLQkJZkZvcndhcmQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWZDYWNoZWRMaW5lTnVtYmVyID0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChmT2Zmc2V0KTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKHguZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBSZWFkZXIjY2xvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZkRvY3VtZW50ID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgU2luZ2xlQ2hhclJlYWRlciNyZWFkKCkKLQkgKi8KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGZGb3J3YXJkID8gcmVhZEZvcndhcmRzKCkgOiByZWFkQmFja3dhcmRzKCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbih4LmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ290b0NvbW1lbnRFbmQoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoZk9mZnNldCA8IGZFbmQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQrKyk7Ci0JCQlpZiAoY3VycmVudCA9PSAnKicpIHsKLQkJCQlpZiAoZk9mZnNldCA8IGZFbmQgJiYgZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCkgPT0gJy8nKSB7Ci0JCQkJCSsrZk9mZnNldDsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnb3RvU3RyaW5nRW5kKGNoYXIgZGVsaW1pdGVyKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoZk9mZnNldCA8IGZFbmQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQrKyk7Ci0JCQlpZiAoY3VycmVudCA9PSAnXFwnKSB7Ci0JCQkJLy8gaWdub3JlIGVzY2FwZWQgY2hhcmFjdGVycwotCQkJCSsrZk9mZnNldDsKLQkJCX0KLQkJCWVsc2UgaWYgKGN1cnJlbnQgPT0gZGVsaW1pdGVyKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdvdG9MaW5lRW5kKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJaW50IGxpbmUgPSBmRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGZPZmZzZXQpOwotCQlmT2Zmc2V0ID0gZkRvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSArIDEpOwotCX0KLQotCXByaXZhdGUgaW50IHJlYWRGb3J3YXJkcygpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChmT2Zmc2V0IDwgZkVuZCkgewotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCsrKTsKLQotCQkJc3dpdGNoIChjdXJyZW50KSB7Ci0JCQkJY2FzZSAnLycgOgotCi0JCQkJCWlmIChmU2tpcENvbW1lbnRzICYmIGZPZmZzZXQgPCBmRW5kKSB7Ci0JCQkJCQljaGFyIG5leHQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KTsKLQkJCQkJCWlmIChuZXh0ID09ICcqJykgewotCQkJCQkJCS8vIGEgY29tbWVudCBzdGFydHMsIGFkdmFuY2UgdG8gdGhlIGNvbW1lbnQgZW5kCi0JCQkJCQkJKytmT2Zmc2V0OwotCQkJCQkJCWdvdG9Db21tZW50RW5kKCk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChuZXh0ID09ICcvJykgewotCQkJCQkJCS8vICcvLyctY29tbWVudCBzdGFydHMsIGFkdmFuY2UgdG8gdGhlIGxpbmUgZW5kCi0JCQkJCQkJZ290b0xpbmVFbmQoKTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXJldHVybiBjdXJyZW50OwotCi0JCQkJY2FzZSAnIicgOgotCQkJCWNhc2UgJ1wnJyA6Ci0KLQkJCQkJaWYgKGZTa2lwU3RyaW5ncykgewotCQkJCQkJZ290b1N0cmluZ0VuZChjdXJyZW50KTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCQl9Ci0KLQkJCXJldHVybiBjdXJyZW50OwotCQl9Ci0KLQkJcmV0dXJuIEVPRjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2luZ2xlTGluZUNvbW1lbnQoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlpbnQgbGluZSA9IGZEb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZk9mZnNldCk7Ci0JCWlmIChsaW5lIDwgZkNhY2hlZExpbmVOdW1iZXIpIHsKLQkJCWZDYWNoZWRMaW5lTnVtYmVyID0gbGluZTsKLQkJCWZDYWNoZWRMaW5lT2Zmc2V0ID0gZkRvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSk7Ci0JCQlpbnQgb2Zmc2V0ID0gZk9mZnNldDsKLQkJCXdoaWxlIChmQ2FjaGVkTGluZU9mZnNldCA8IG9mZnNldCkgewotCQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKG9mZnNldC0tKTsKLQkJCQlpZiAoY3VycmVudCA9PSAnLycgJiYgZkNhY2hlZExpbmVPZmZzZXQgPD0gb2Zmc2V0ICYmIGZEb2N1bWVudC5nZXRDaGFyKG9mZnNldCkgPT0gJy8nKSB7Ci0JCQkJCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ290b0NvbW1lbnRTdGFydCgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlICgwIDwgZk9mZnNldCkgewotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldC0tKTsKLQkJCWlmIChjdXJyZW50ID09ICcqJyAmJiAwIDw9IGZPZmZzZXQgJiYgZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCkgPT0gJy8nKQotCQkJCXJldHVybjsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnb3RvU3RyaW5nU3RhcnQoY2hhciBkZWxpbWl0ZXIpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlICgwIDwgZk9mZnNldCkgewotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCk7Ci0JCQlpZiAoY3VycmVudCA9PSBkZWxpbWl0ZXIpIHsKLQkJCQlpZiAoISgwIDw9IGZPZmZzZXQgJiYgZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCAtIDEpID09ICdcXCcpKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQktLWZPZmZzZXQ7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCByZWFkQmFja3dhcmRzKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQotCQl3aGlsZSAoMCA8IGZPZmZzZXQpIHsKLQkJCS0tZk9mZnNldDsKLQotCQkJaGFuZGxlU2luZ2xlTGluZUNvbW1lbnQoKTsKLQotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCk7Ci0JCQlzd2l0Y2ggKGN1cnJlbnQpIHsKLQkJCQljYXNlICcvJyA6Ci0KLQkJCQkJaWYgKGZTa2lwQ29tbWVudHMgJiYgZk9mZnNldCA+IDEpIHsKLQkJCQkJCWNoYXIgbmV4dCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQgLSAxKTsKLQkJCQkJCWlmIChuZXh0ID09ICcqJykgewotCQkJCQkJCS8vIGEgY29tbWVudCBlbmRzLCBhZHZhbmNlIHRvIHRoZSBjb21tZW50IHN0YXJ0Ci0JCQkJCQkJZk9mZnNldCAtPSAyOwotCQkJCQkJCWdvdG9Db21tZW50U3RhcnQoKTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXJldHVybiBjdXJyZW50OwotCi0JCQkJY2FzZSAnIicgOgotCQkJCWNhc2UgJ1wnJyA6Ci0KLQkJCQkJaWYgKGZTa2lwU3RyaW5ncykgewotCQkJCQkJLS1mT2Zmc2V0OwotCQkJCQkJZ290b1N0cmluZ1N0YXJ0KGN1cnJlbnQpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm4gY3VycmVudDsKLQkJCX0KLQotCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCX0KLQotCQlyZXR1cm4gRU9GOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZXh0L0phdmFQYWlyTWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RleHQvSmF2YVBhaXJNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNmZmZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RleHQvSmF2YVBhaXJNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXI7Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgZm9yIG1hdGNoIHBhaXJzIG9mIGNoYXJhY3RlcnMuCi0gKgotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQgc28gd2UgZG9uJ3QgaGF2ZSB0bwotICogZGVwZW5kIG9uIHRoZSBvcmcuZWNsaXBzZS5qZHQudWkgcGx1Z2luLgotICogCi0gKiBObyBtb2RpZmljYXRpb25zIHdlcmUgbWFkZS4KLSAqLwotY2xhc3MgSmF2YVBhaXJNYXRjaGVyIGltcGxlbWVudHMgSUNoYXJhY3RlclBhaXJNYXRjaGVyIHsKLQotCXByb3RlY3RlZCBjaGFyW10gZlBhaXJzOwotCXByb3RlY3RlZCBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByb3RlY3RlZCBpbnQgZk9mZnNldDsKLQotCXByb3RlY3RlZCBpbnQgZlN0YXJ0UG9zOwotCXByb3RlY3RlZCBpbnQgZkVuZFBvczsKLQlwcm90ZWN0ZWQgaW50IGZBbmNob3I7Ci0KLQlwcm90ZWN0ZWQgSmF2YUNvZGVSZWFkZXIgZlJlYWRlciA9IG5ldyBKYXZhQ29kZVJlYWRlcigpOwotCi0KLQlwdWJsaWMgSmF2YVBhaXJNYXRjaGVyKGNoYXJbXSBwYWlycykgewotCQlmUGFpcnMgPSBwYWlyczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjbWF0Y2gob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBtYXRjaChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCi0JCWlmIChmT2Zmc2V0IDwgMCkKLQkJCXJldHVybiBudWxsOwotCi0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCAmJiBtYXRjaFBhaXJzQXQoKSAmJiBmU3RhcnRQb3MgIT0gZkVuZFBvcykKLQkJCXJldHVybiBuZXcgUmVnaW9uKGZTdGFydFBvcywgZkVuZFBvcyAtIGZTdGFydFBvcyArIDEpOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNnZXRBbmNob3IoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QW5jaG9yKCkgewotCQlyZXR1cm4gZkFuY2hvcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJY2xlYXIoKTsKLQkJZkRvY3VtZW50ID0gbnVsbDsKLQkJZlJlYWRlciA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNjbGVhcigpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWlmIChmUmVhZGVyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZlJlYWRlci5jbG9zZSgpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG1hdGNoUGFpcnNBdCgpIHsKLQotCQlpbnQgaTsKLQkJaW50IHBhaXJJbmRleDEgPSBmUGFpcnMubGVuZ3RoOwotCQlpbnQgcGFpckluZGV4MiA9IGZQYWlycy5sZW5ndGg7Ci0KLQkJZlN0YXJ0UG9zID0gLTE7Ci0JCWZFbmRQb3MgPSAtMTsKLQotCQkvLyBnZXQgdGhlIGNoYXJzIHByZWNlZGluZyBhbmQgZm9sbG93aW5nIHRoZSBzdGFydCBwb3NpdGlvbgotCQl0cnkgewotCi0JCQljaGFyIHByZXZDaGFyID0gZkRvY3VtZW50LmdldENoYXIoTWF0aC5tYXgoZk9mZnNldCAtIDEsIDApKTsKLQkJCS8vIG1vZGlmaWVkIGJlaGF2aW9yIGZvciBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2ODc5CQkJCi0JCQkvLwkJCWNoYXIgbmV4dENoYXI9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCi0JCQkvLyBzZWFyY2ggZm9yIG9wZW5pbmcgcGVlciBjaGFyYWN0ZXIgbmV4dCB0byB0aGUgYWN0aXZhdGlvbiBwb2ludAotCQkJZm9yIChpID0gMDsgaSA8IGZQYWlycy5sZW5ndGg7IGkgPSBpICsgMikgewotCQkJCS8vCQkJCWlmIChuZXh0Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkvLwkJCQkJZlN0YXJ0UG9zPSBmT2Zmc2V0OwotCQkJCS8vCQkJCQlwYWlySW5kZXgxPSBpOwotCQkJCS8vCQkJCX0gZWxzZSAKLQkJCQlpZiAocHJldkNoYXIgPT0gZlBhaXJzW2ldKSB7Ci0JCQkJCWZTdGFydFBvcyA9IGZPZmZzZXQgLSAxOwotCQkJCQlwYWlySW5kZXgxID0gaTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHNlYXJjaCBmb3IgY2xvc2luZyBwZWVyIGNoYXJhY3RlciBuZXh0IHRvIHRoZSBhY3RpdmF0aW9uIHBvaW50Ci0JCQlmb3IgKGkgPSAxOyBpIDwgZlBhaXJzLmxlbmd0aDsgaSA9IGkgKyAyKSB7Ci0JCQkJaWYgKHByZXZDaGFyID09IGZQYWlyc1tpXSkgewotCQkJCQlmRW5kUG9zID0gZk9mZnNldCAtIDE7Ci0JCQkJCXBhaXJJbmRleDIgPSBpOwotCQkJCX0KLQkJCQkvLwkJCQllbHNlIGlmIChuZXh0Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkvLwkJCQkJZkVuZFBvcz0gZk9mZnNldDsKLQkJCQkvLwkJCQkJcGFpckluZGV4Mj0gaTsKLQkJCQkvLwkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChmRW5kUG9zID4gLTEpIHsKLQkJCQlmQW5jaG9yID0gUklHSFQ7Ci0JCQkJZlN0YXJ0UG9zID0gc2VhcmNoRm9yT3BlbmluZ1BlZXIoZkVuZFBvcywgZlBhaXJzW3BhaXJJbmRleDIgLSAxXSwgZlBhaXJzW3BhaXJJbmRleDJdLCBmRG9jdW1lbnQpOwotCQkJCWlmIChmU3RhcnRQb3MgPiAtMSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJZWxzZQotCQkJCQlmRW5kUG9zID0gLTE7Ci0JCQl9Ci0JCQllbHNlIGlmIChmU3RhcnRQb3MgPiAtMSkgewotCQkJCWZBbmNob3IgPSBMRUZUOwotCQkJCWZFbmRQb3MgPSBzZWFyY2hGb3JDbG9zaW5nUGVlcihmU3RhcnRQb3MsIGZQYWlyc1twYWlySW5kZXgxXSwgZlBhaXJzW3BhaXJJbmRleDEgKyAxXSwgZkRvY3VtZW50KTsKLQkJCQlpZiAoZkVuZFBvcyA+IC0xKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlCi0JCQkJCWZTdGFydFBvcyA9IC0xOwotCQkJfQotCi0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBpbnQgc2VhcmNoRm9yQ2xvc2luZ1BlZXIoaW50IG9mZnNldCwgaW50IG9wZW5pbmdQZWVyLCBpbnQgY2xvc2luZ1BlZXIsIElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlmUmVhZGVyLmNvbmZpZ3VyZUZvcndhcmRSZWFkZXIoZG9jdW1lbnQsIG9mZnNldCArIDEsIGRvY3VtZW50LmdldExlbmd0aCgpLCB0cnVlLCB0cnVlKTsKLQotCQlpbnQgc3RhY2sgPSAxOwotCQlpbnQgYyA9IGZSZWFkZXIucmVhZCgpOwotCQl3aGlsZSAoYyAhPSBKYXZhQ29kZVJlYWRlci5FT0YpIHsKLQkJCWlmIChjID09IG9wZW5pbmdQZWVyICYmIGMgIT0gY2xvc2luZ1BlZXIpCi0JCQkJc3RhY2srKzsKLQkJCWVsc2UgaWYgKGMgPT0gY2xvc2luZ1BlZXIpCi0JCQkJc3RhY2stLTsKLQotCQkJaWYgKHN0YWNrID09IDApCi0JCQkJcmV0dXJuIGZSZWFkZXIuZ2V0T2Zmc2V0KCk7Ci0KLQkJCWMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IHNlYXJjaEZvck9wZW5pbmdQZWVyKGludCBvZmZzZXQsIGludCBvcGVuaW5nUGVlciwgaW50IGNsb3NpbmdQZWVyLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJZlJlYWRlci5jb25maWd1cmVCYWNrd2FyZFJlYWRlcihkb2N1bWVudCwgb2Zmc2V0LCB0cnVlLCB0cnVlKTsKLQotCQlpbnQgc3RhY2sgPSAxOwotCQlpbnQgYyA9IGZSZWFkZXIucmVhZCgpOwotCQl3aGlsZSAoYyAhPSBKYXZhQ29kZVJlYWRlci5FT0YpIHsKLQkJCWlmIChjID09IGNsb3NpbmdQZWVyICYmIGMgIT0gb3BlbmluZ1BlZXIpCi0JCQkJc3RhY2srKzsKLQkJCWVsc2UgaWYgKGMgPT0gb3BlbmluZ1BlZXIpCi0JCQkJc3RhY2stLTsKLQotCQkJaWYgKHN0YWNrID09IDApCi0JCQkJcmV0dXJuIGZSZWFkZXIuZ2V0T2Zmc2V0KCk7Ci0KLQkJCWMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvblJlcG9ydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvblJlcG9ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZmFiYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vSFRNTFZhbGlkYXRpb25SZXBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5FcnJvckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLS8qCi0gKiBDb3BpZWQgZnJvbSBqc3AuY29yZSdzIEhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIKLSAqLwotY2xhc3MgSFRNTFZhbGlkYXRpb25SZXBvcnRlciBpbXBsZW1lbnRzIFZhbGlkYXRpb25SZXBvcnRlciB7Ci0JcHJpdmF0ZSBJVmFsaWRhdG9yIG93bmVyID0gbnVsbDsKLQlwcml2YXRlIElSZXBvcnRlciByZXBvcnRlciA9IG51bGw7Ci0JcHJpdmF0ZSBJRmlsZSBmaWxlID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCXByaXZhdGUgTWVzc2FnZUZhY3RvcnkgZkZhY3RvcnkgPSBudWxsOwotCQotCS8qKgotCSAqLwotCXB1YmxpYyBIVE1MVmFsaWRhdGlvblJlcG9ydGVyKElWYWxpZGF0b3Igb3duZXIsIElSZXBvcnRlciByZXBvcnRlciwgSUZpbGUgZmlsZSwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlzdXBlcigpOwotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCXRoaXMucmVwb3J0ZXIgPSByZXBvcnRlcjsKLQkJdGhpcy5maWxlID0gZmlsZTsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQlmRmFjdG9yeSA9IG5ldyBNZXNzYWdlRmFjdG9yeShmaWxlICE9IG51bGwgPyBmaWxlLmdldFByb2plY3QoKSA6IG51bGwpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpZiAodGhpcy5maWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHRoaXMucmVwb3J0ZXIgIT0gbnVsbCkgewotCQkJdGhpcy5yZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh0aGlzLm93bmVyLCB0aGlzLmZpbGUpOwotCQl9Ci0JCQotCX0KLQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVwb3J0KFZhbGlkYXRpb25NZXNzYWdlIG1lc3NhZ2UpIHsKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCB8fCB0aGlzLmZpbGUgPT0gbnVsbCB8fCBtZXNzYWdlLmdldFNldmVyaXR5KCkgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuSUdOT1JFKQotCQkJcmV0dXJuOwotCQlJTWVzc2FnZSBtZXMgPSB0cmFuc2xhdGVNZXNzYWdlKG1lc3NhZ2UpOwotCi0JCWlmICh0aGlzLnJlcG9ydGVyICE9IG51bGwpIHsKLQkJCXRoaXMucmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLm93bmVyLCBtZXMpOwotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIFRyYW5zbGF0ZSBWYWxpZGF0aW9uTWVzc2FnZSB0byBJTWVzc2FnZSBhbmQgZ2VuZXJhdGUgcmVzdWx0IGxvZwotCSAqLwotCXByaXZhdGUgSU1lc3NhZ2UgdHJhbnNsYXRlTWVzc2FnZShWYWxpZGF0aW9uTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWludCBzZXZlcml0eSA9IElNZXNzYWdlLkxPV19TRVZFUklUWTsKLQkJc3dpdGNoIChtZXNzYWdlLmdldFNldmVyaXR5KCkpIHsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IgOgotCQkJCXNldmVyaXR5ID0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyA6Ci0JCQkJc2V2ZXJpdHkgPSBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZhbGlkYXRpb25NZXNzYWdlLklORk9STUFUSU9OIDoKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0KLQkJSU1lc3NhZ2UgbWVzID0gbmV3IExvY2FsaXplZE1lc3NhZ2Uoc2V2ZXJpdHksIG1lc3NhZ2UuZ2V0TWVzc2FnZSgpLCB0aGlzLmZpbGUpOwotCQltZXMuc2V0T2Zmc2V0KG1lc3NhZ2UuZ2V0T2Zmc2V0KCkpOwotCQltZXMuc2V0TGVuZ3RoKG1lc3NhZ2UuZ2V0TGVuZ3RoKCkpOwotCQlpZiAodGhpcy5tb2RlbCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGZsYXRNb2RlbCA9IHRoaXMubW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlpZiAoZmxhdE1vZGVsICE9IG51bGwpIHsKLQkJCQlpbnQgbGluZSA9IGZsYXRNb2RlbC5nZXRMaW5lT2ZPZmZzZXQobWVzc2FnZS5nZXRPZmZzZXQoKSk7Ci0JCQkJbWVzLnNldExpbmVObyhsaW5lICsgMSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlcG9ydChFcnJvckluZm8gaW5mbykgewotCQlyZXBvcnQoZkZhY3RvcnkuY3JlYXRlTWVzc2FnZShpbmZvKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQQWN0aW9uU291cmNlVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BBY3Rpb25Tb3VyY2VWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFiMjBmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BBY3Rpb25Tb3VyY2VWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkpTUEZDb250ZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KU1BBY3Rpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSlNQQ29udGVudFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuRmlsZUJ1ZmZlck1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3IuSVNvdXJjZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Qcm9qZWN0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci0KLS8qKgotICogU291cmNlIHZhbGlkYXRvciAoYWJsZSB0byBjaGVjayBwYXJ0aWFsIGRvY3VtZW50KSB0aGF0IGNoZWNrcyBmb3I6IC0KLSAqIG1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlcyAmIHVuZGVmaW5lZCBhdHRyaWJ1dGVzIGluIGpzcCBhY3Rpb24gdGFncyBzdWNoCi0gKiBhcyBqc3AgZGlyZWN0aXZlcyBhbmQganNwIGN1c3RvbSB0YWdzCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BBY3Rpb25Tb3VyY2VWYWxpZGF0b3IgZXh0ZW5kcyBKU1BBY3Rpb25WYWxpZGF0b3IgaW1wbGVtZW50cyBJU291cmNlVmFsaWRhdG9yIHsKLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBib29sZWFuIGZFbmFibGVTb3VyY2VWYWxpZGF0aW9uOwotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGZKU1BGQ29udGVudFR5cGUgPSBudWxsOwotCi0JcHVibGljIHZvaWQgY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0KLQkJLy8gc3BlY2lhbCBjaGVja3MgdG8gc2VlIHNvdXJjZSB2YWxpZGF0aW9uIHNob3VsZCByZWFsbHkgZXhlY3V0ZQotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkJLy8gVGhlIGJhc2VMb2NhdGlvbiBtYXkgYmUgYSBwYXRoIG9uIGRpc2sgb3IgcmVsYXRpdmUgdG8gdGhlCi0JCQkJLy8gd29ya3NwYWNlIHJvb3QuIERvbid0IHRyYW5zbGF0ZSBvbi1kaXNrIHBhdGhzIHRvCi0JCQkJLy8gaW4td29ya3NwYWNlIHJlc291cmNlcy4KLQkJCQlJUGF0aCBiYXNlUGF0aCA9IG5ldyBQYXRoKGJhc2VMb2NhdGlvbik7Ci0JCQkJaWYgKGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCQlmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGJhc2VQYXRoKTsKLQkJCQkJLyoKLQkJCQkJICogSWYgdGhlIElGaWxlIGRvZXNuJ3QgZXhpc3QsIG1ha2Ugc3VyZSBpdCdzIG5vdCByZXR1cm5lZAotCQkJCQkgKi8KLQkJCQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJCQkJZmlsZSA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlmRW5hYmxlU291cmNlVmFsaWRhdGlvbiA9IChmaWxlICE9IG51bGwgJiYgaXNCYXRjaFZhbGlkYXRvclByZWZlcmVuY2VFbmFibGVkKGZpbGUpICYmIHNob3VsZFZhbGlkYXRlKGZpbGUpICYmIGZyYWdtZW50Q2hlY2soZmlsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZEb2N1bWVudCA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVJlZ2lvbiBkaXJ0eVJlZ2lvbiwgSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWlmIChoZWxwZXIgPT0gbnVsbCB8fCBmRG9jdW1lbnQgPT0gbnVsbCB8fCAhZkVuYWJsZVNvdXJjZVZhbGlkYXRpb24pCi0JCQlyZXR1cm47Ci0KLQkJaWYgKChyZXBvcnRlciAhPSBudWxsKSAmJiAocmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSA9PSB0cnVlKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0cnkgewotCQkJSVRleHRGaWxlQnVmZmVyIGZiID0gRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEJ1ZmZlcihmRG9jdW1lbnQpOwotCQkJaWYgKGZiID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShmYi5nZXRMb2NhdGlvbigpKTsKLQkJCWlmIChmaWxlID09IG51bGwgfHwgIWZpbGUuZXhpc3RzKCkpCi0JCQkJcmV0dXJuOwotCQkJcGVyZm9ybVZhbGlkYXRpb24oZmlsZSwgcmVwb3J0ZXIsIG1vZGVsLCBkaXJ0eVJlZ2lvbik7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgY3VycmVudCB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gY3VycmVudCBwcm9qZWN0ICh3aGljaAotCSAqIGlzIGJhc2VkIG9uIGN1cnJlbnQgZG9jdW1lbnQpIG9yIGdsb2JhbCBjb25maWd1cmF0aW9uIGlmIHByb2plY3QgZG9lcwotCSAqIG5vdCBvdmVycmlkZQotCSAqIAotCSAqIEByZXR1cm4gVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGdldFZhbGlkYXRpb25Db25maWd1cmF0aW9uKElGaWxlIGZpbGUpIHsKLQkJVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG51bGw7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwcm9qZWN0Q29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCQkJY29uZmlndXJhdGlvbiA9IHByb2plY3RDb25maWd1cmF0aW9uOwotCQkJCQlpZiAocHJvamVjdENvbmZpZ3VyYXRpb24gPT0gbnVsbCB8fCBwcm9qZWN0Q29uZmlndXJhdGlvbi51c2VHbG9iYWxQcmVmZXJlbmNlKCkpIHsKLQkJCQkJCWNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjb25maWd1cmF0aW9uOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB2YWxpZGF0b3IgaXMgZW5hYmxlZCBhY2NvcmRpbmcgaW4gVmFsaWRhdGlvbiBwcmVmZXJlbmNlcwotCSAqIAotCSAqIEBwYXJhbSB2bWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQmF0Y2hWYWxpZGF0b3JQcmVmZXJlbmNlRW5hYmxlZChJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsKLQkJVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IGdldFZhbGlkYXRpb25Db25maWd1cmF0aW9uKGZpbGUpOwotCQlpZiAoY29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YSBtZXRhZGF0YSA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YShKU1BDb250ZW50VmFsaWRhdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0JCQlpZiAobWV0YWRhdGEgIT0gbnVsbCkgewotCQkJCWlmICghY29uZmlndXJhdGlvbi5pc0J1aWxkRW5hYmxlZChtZXRhZGF0YSkgJiYgIWNvbmZpZ3VyYXRpb24uaXNNYW51YWxFbmFibGVkKG1ldGFkYXRhKSkKLQkJCQkJZW5hYmxlZCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbmFibGVkOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBmaWxlIGlzIGEganNwIGZyYWdtZW50IG9yIG5vdC4gSWYgc28sIGNoZWNrIGlmIHRoZSBmcmFnbWVudAotCSAqIHNob3VsZCBiZSB2YWxpZGF0ZWQgb3Igbm90LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBBc3N1bWVzIHNob3VsZFZhbGlkYXRlIHdhcyBhbHJlYWR5IGNhbGxlZCBvbiBmaWxlIHNvIGl0Ci0JICogICAgICAgICAgICBzaG91bGQgbm90IGJlIG51bGwgYW5kIGRvZXMgZXhpc3QKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGZpbGUgaXMgYSBmcmFnbWVudCBhbmQgaXQgc2hvdWxkIG5vdCBiZSB2YWxpZGF0ZWQsCi0JICogICAgICAgICB0cnVlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmcmFnbWVudENoZWNrKElGaWxlIGZpbGUpIHsKLQkJLy8gY29waWVkIGZyb20gSlNQVmFsaWRhdG9yCi0JCWJvb2xlYW4gc2hvdWxkVmFsaWRhdGUgPSB0cnVlOwotCQkvLyBxdWljayBjaGVjayB0byBzZWUgaWYgdGhpcyBpcyBwb3NzaWJseSBhIGpzcCBmcmFnbWVudAotCQlpZiAoZ2V0SlNQRkNvbnRlbnRUeXBlKCkuaXNBc3NvY2lhdGVkV2l0aChmaWxlLmdldE5hbWUoKSkpIHsKLQkJCS8vIGdldCBwcmVmZXJlbmNlIGZvciB2YWxpZGF0ZSBqc3AgZnJhZ21lbnRzCi0JCQlib29sZWFuIHNob3VsZFZhbGlkYXRlRnJhZ21lbnRzID0gQm9vbGVhbi52YWx1ZU9mKEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShKU1BGQ29udGVudFByb3BlcnRpZXMuVkFMSURBVEVfRlJBR01FTlRTLCBmaWxlLCB0cnVlKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkvKgotCQkJICogaWYganNwIGZyYWdtZW50cyBzaG91bGQgbm90IGJlIHZhbGlkYXRlZCwgY2hlY2sgaWYgZmlsZSBpcwotCQkJICogcmVhbGx5IGpzcCBmcmFnbWVudAotCQkJICovCi0JCQlpZiAoIXNob3VsZFZhbGlkYXRlRnJhZ21lbnRzKSB7Ci0JCQkJYm9vbGVhbiBpc0ZyYWdtZW50ID0gaXNGcmFnbWVudChmaWxlKTsKLQkJCQlzaG91bGRWYWxpZGF0ZSA9ICFpc0ZyYWdtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBzaG91bGRWYWxpZGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGZpbGUgaXMganNwIGZyYWdtZW50IG9yIG5vdCAoZG9lcyBhIGRlZXAsIGluZGVwdGggY2hlY2ssCi0JICogbG9va2luZyBpbnRvIGNvbnRlbnRzIG9mIGZpbGUpCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIGFzc3VtZXMgZmlsZSBpcyBub3QgbnVsbCBhbmQgZXhpc3RzCi0JICogQHJldHVybiB0cnVlIGlmIGZpbGUgaXMganNwIGZyYWdtZW50LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNGcmFnbWVudChJRmlsZSBmaWxlKSB7Ci0JCS8vIGNvcGllZCBmcm9tIEpTUFZhbGlkYXRvcgotCQlib29sZWFuIGlzRnJhZ21lbnQgPSBmYWxzZTsKLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQl0cnkgewotCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJLy8gaXQgY2FuIGJlIG51bGwKLQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJCWlzID0gZmlsZS5nZXRDb250ZW50cygpOwotCQkJCWNvbnRlbnREZXNjcmlwdGlvbiA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldERlc2NyaXB0aW9uRm9yKGlzLCBmaWxlLmdldE5hbWUoKSwgbmV3IFF1YWxpZmllZE5hbWVbXXtJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVR9KTsKLQkJCX0KLQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCVN0cmluZyBmaWxlQ3RJZCA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpLmdldElkKCk7Ci0JCQkJaXNGcmFnbWVudCA9IChmaWxlQ3RJZCAhPSBudWxsICYmIENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BGUkFHTUVOVC5lcXVhbHMoZmlsZUN0SWQpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlLCBhc3N1bWUgaXQncyBpbnZhbGlkIEpTUAotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZSwgYXNzdW1lIGl0J3MgaW52YWxpZCBKU1AKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIG11c3QgY2xvc2UgaW5wdXQgc3RyZWFtIGluIGNhc2Ugb3RoZXJzIG5lZWQgaXQKLQkJCWlmIChpcyAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCWlzLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBub3Qgc3VyZSBob3cgdG8gcmVjb3ZlciBhdCB0aGlzIHBvaW50Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBpc0ZyYWdtZW50OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZShJRmlsZSBmaWxlKSB7Ci0JCS8vIGNvcGllZCBmcm9tIEpTUFZhbGlkYXRvcgotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBmaWxlOwotCQlkbyB7Ci0JCQlpZiAocmVzb3VyY2UuaXNEZXJpdmVkKCkgfHwgcmVzb3VyY2UuaXNUZWFtUHJpdmF0ZU1lbWJlcigpIHx8ICFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSB8fCByZXNvdXJjZS5nZXROYW1lKCkuY2hhckF0KDApID09ICcuJykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJlc291cmNlID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJd2hpbGUgKChyZXNvdXJjZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuUFJPSkVDVCkgPT0gMCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgSlNQIGZyYWdtZW50IGNvbnRlbnQgdHlwZQotCSAqIAotCSAqIEByZXR1cm4ganNwZiBjb250ZW50IHR5cGUKLQkgKi8KLQlwcml2YXRlIElDb250ZW50VHlwZSBnZXRKU1BGQ29udGVudFR5cGUoKSB7Ci0JCS8vIGNvcGllZCBmcm9tIEpTUFZhbGlkYXRvcgotCQlpZiAoZkpTUEZDb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlmSlNQRkNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUEZSQUdNRU5UKTsKLQkJfQotCQlyZXR1cm4gZkpTUEZDb250ZW50VHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BDb250ZW50U291cmNlVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BDb250ZW50U291cmNlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYmQ4OTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQQ29udGVudFNvdXJjZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSlNQRkNvbnRlbnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUENvbnRlbnRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuRmlsZUJ1ZmZlck1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvci5JU291cmNlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlByb2plY3RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotLyoqCi0gKiBTb3VyY2UgdmFsaWRhdG9yIGZvciBKU1AgY29udGVudC4gVGhpcyB2YWxpZGF0b3IgY3VycmVudGx5IG9ubHkgdmFsaWRhdGVzCi0gKiBodG1sIGNvbnRlbnQgaW4ganNwLgotICovCi1wdWJsaWMgY2xhc3MgSlNQQ29udGVudFNvdXJjZVZhbGlkYXRvciBleHRlbmRzIEpTUENvbnRlbnRWYWxpZGF0b3IgaW1wbGVtZW50cyBJU291cmNlVmFsaWRhdG9yIHsKLQkvKgotCSAqIE1vc3Qgb2YgdGhpcyBjbGFzcyB3YXMgY29waWVkIGZyb20gdGhlIElTb3VyY2VWYWxpZGF0b3IgYXNwZWN0cyBvZgotCSAqIGh0bWwudWkncyBIVE1MVmFsaWRhdG9yCi0JICovCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgYm9vbGVhbiBmRW5hYmxlU291cmNlVmFsaWRhdGlvbjsKLQlwcml2YXRlIElDb250ZW50VHlwZSBmSlNQRkNvbnRlbnRUeXBlID0gbnVsbDsKLQotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCi0JCS8vIHNwZWNpYWwgY2hlY2tzIHRvIHNlZSBzb3VyY2UgdmFsaWRhdGlvbiBzaG91bGQgcmVhbGx5IGV4ZWN1dGUKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJCS8vIFRoZSBiYXNlTG9jYXRpb24gbWF5IGJlIGEgcGF0aCBvbiBkaXNrIG9yIHJlbGF0aXZlIHRvIHRoZQotCQkJCS8vIHdvcmtzcGFjZSByb290LiBEb24ndCB0cmFuc2xhdGUgb24tZGlzayBwYXRocyB0bwotCQkJCS8vIGluLXdvcmtzcGFjZSByZXNvdXJjZXMuCi0JCQkJSVBhdGggYmFzZVBhdGggPSBuZXcgUGF0aChiYXNlTG9jYXRpb24pOwotCQkJCWlmIChiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQkJZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShiYXNlUGF0aCk7Ci0JCQkJCS8qCi0JCQkJCSAqIElmIHRoZSBJRmlsZSBkb2Vzbid0IGV4aXN0LCBtYWtlIHN1cmUgaXQncyBub3QgcmV0dXJuZWQKLQkJCQkJICovCi0JCQkJCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCQkJCWZpbGUgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJZkVuYWJsZVNvdXJjZVZhbGlkYXRpb24gPSAoZmlsZSAhPSBudWxsICYmIGlzQmF0Y2hWYWxpZGF0b3JQcmVmZXJlbmNlRW5hYmxlZChmaWxlKSAmJiBzaG91bGRWYWxpZGF0ZShmaWxlKSAmJiBmcmFnbWVudENoZWNrKGZpbGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlmRG9jdW1lbnQgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgdmFsaWRhdGUgY2FsbCBpcyBmb3IgdGhlIElTb3VyY2VWYWxpZGF0b3IgcGFydGlhbCBkb2N1bWVudAotCSAqIHZhbGlkYXRpb24gYXBwcm9hY2gKLQkgKiAKLQkgKiBAcGFyYW0gZGlydHlSZWdpb24KLQkgKiBAcGFyYW0gaGVscGVyCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3IuSVNvdXJjZVZhbGlkYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElSZWdpb24gZGlydHlSZWdpb24sIElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoaGVscGVyID09IG51bGwgfHwgZkRvY3VtZW50ID09IG51bGwgfHwgIWZFbmFibGVTb3VyY2VWYWxpZGF0aW9uKQotCQkJcmV0dXJuOwotCi0JCWlmICgocmVwb3J0ZXIgIT0gbnVsbCkgJiYgKHJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkgPT0gdHJ1ZSkpIHsKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJdHJ5IHsKLQotCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCWRvY3VtZW50ID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJfQotCi0JCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCB8fCAhaGFzSFRNTEZlYXR1cmUoZG9jdW1lbnQpKQotCQkJCXJldHVybjsgLy8gaWdub3JlCi0KLQkJCUlUZXh0RmlsZUJ1ZmZlciBmYiA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRCdWZmZXIoZkRvY3VtZW50KTsKLQkJCWlmIChmYiA9PSBudWxsKQotCQkJCXJldHVybjsKLQotCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShmYi5nZXRMb2NhdGlvbigpKTsKLQkJCWlmIChmaWxlID09IG51bGwgfHwgIWZpbGUuZXhpc3RzKCkpCi0JCQkJcmV0dXJuOwotCi0JCQkvLyB0aGlzIHdpbGwgYmUgdGhlIHdyb25nIHJlZ2lvbiBpZiBpdCdzIFRleHQgKGluc3RlYWQgb2YgRWxlbWVudCkKLQkJCS8vIHdlIGRvbid0IGtub3cgaG93IHRvIHZhbGlkYXRlIFRleHQKLQkJCUluZGV4ZWRSZWdpb24gaXIgPSBnZXRDb3ZlcmluZ05vZGUoZGlydHlSZWdpb24pOyAvLyBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGRpcnR5UmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCWlmIChpciBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQl3aGlsZSAoaXIgIT0gbnVsbCAmJiBpciBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQkJLy8gaXQncyBhc3N1bWVkIHRoYXQgdGhpcyBnZXRzIHRoZSBJbmRleGVkUmVnaW9uIHRvCi0JCQkJCS8vIHRoZSByaWdodCBvZiB0aGUgZW5kIG9mZnNldAotCQkJCQlpciA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24oaXIuZ2V0RW5kT2Zmc2V0KCkpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGlyIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCi0JCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQkJCVZhbGlkYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoVmFsaWRhdGlvbkFkYXB0ZXIpIGZhY3RvcnkuYWRhcHQoKElOb2RlTm90aWZpZXIpIGlyKTsKLQkJCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJCQlpZiAocmVwb3J0ZXIgIT0gbnVsbCkgewotCQkJCQlIVE1MVmFsaWRhdGlvblJlcG9ydGVyIHJlcCA9IG51bGw7Ci0JCQkJCXJlcCA9IGdldFJlcG9ydGVyKHJlcG9ydGVyLCBmaWxlLCAoSURPTU1vZGVsKSBtb2RlbCk7Ci0JCQkJCXJlcC5jbGVhcigpOwotCQkJCQlhZGFwdGVyLnNldFJlcG9ydGVyKHJlcCk7Ci0KLQkJCQkJTWVzc2FnZSBtZXNzID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMSkpOwotCQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayh0aGlzLCBtZXNzKTsKLQkJCQl9Ci0JCQkJYWRhcHRlci52YWxpZGF0ZShpcik7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSW5kZXhlZFJlZ2lvbiBnZXRDb3ZlcmluZ05vZGUoSVJlZ2lvbiBkaXJ0eVJlZ2lvbikgewotCi0JCUluZGV4ZWRSZWdpb24gbGFyZ2VzdFJlZ2lvbiA9IG51bGw7Ci0JCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gcmVnaW9ucyA9ICgoSVN0cnVjdHVyZWREb2N1bWVudCkgZkRvY3VtZW50KS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKGRpcnR5UmVnaW9uLmdldE9mZnNldCgpLCBkaXJ0eVJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQlsYXJnZXN0UmVnaW9uID0gZ2V0TGFyZ2VzdChyZWdpb25zKTsKLQkJfQotCQlyZXR1cm4gbGFyZ2VzdFJlZ2lvbjsKLQl9Ci0KLQlwcml2YXRlIEluZGV4ZWRSZWdpb24gZ2V0TGFyZ2VzdChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gc2RSZWdpb25zKSB7Ci0KLQkJaWYgKHNkUmVnaW9ucyA9PSBudWxsIHx8IHNkUmVnaW9ucy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCUluZGV4ZWRSZWdpb24gY3VycmVudExhcmdlc3QgPSBnZXRDb3JyZXNwb25kaW5nTm9kZShzZFJlZ2lvbnNbMF0pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNkUmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFzZFJlZ2lvbnNbaV0uaXNEZWxldGVkKCkpIHsKLQkJCQlJbmRleGVkUmVnaW9uIGNvcnJlc3BvbmRpbmcgPSBnZXRDb3JyZXNwb25kaW5nTm9kZShzZFJlZ2lvbnNbaV0pOwotCi0JCQkJaWYgKGN1cnJlbnRMYXJnZXN0IGluc3RhbmNlb2YgVGV4dCkKLQkJCQkJY3VycmVudExhcmdlc3QgPSBjb3JyZXNwb25kaW5nOwotCi0JCQkJaWYgKGNvcnJlc3BvbmRpbmcgIT0gbnVsbCkgewotCQkJCQlpZiAoIShjb3JyZXNwb25kaW5nIGluc3RhbmNlb2YgVGV4dCkpIHsKLQkJCQkJCWlmIChjb3JyZXNwb25kaW5nLmdldFN0YXJ0T2Zmc2V0KCkgPD0gY3VycmVudExhcmdlc3QuZ2V0U3RhcnRPZmZzZXQoKSAmJiBjb3JyZXNwb25kaW5nLmdldEVuZE9mZnNldCgpID49IGN1cnJlbnRMYXJnZXN0LmdldEVuZE9mZnNldCgpKQotCQkJCQkJCWN1cnJlbnRMYXJnZXN0ID0gY29ycmVzcG9uZGluZzsKLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9Ci0JCXJldHVybiBjdXJyZW50TGFyZ2VzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRDb3JyZXNwb25kaW5nTm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQlJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24gPSBudWxsOwotCQl0cnkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCWluZGV4ZWRSZWdpb24gPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzZFJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0hUTUxGZWF0dXJlKElET01Eb2N1bWVudCBkb2N1bWVudCkgewotCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGFkYXB0ZXIuaGFzRmVhdHVyZShIVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzLkhUTUwpOwotCX0KLQotCXByaXZhdGUgSFRNTFZhbGlkYXRpb25SZXBvcnRlciBnZXRSZXBvcnRlcihJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUsIElET01Nb2RlbCBtb2RlbCkgewotCQlyZXR1cm4gbmV3IEhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIodGhpcywgcmVwb3J0ZXIsIGZpbGUsIG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGN1cnJlbnQgdmFsaWRhdGlvbiBjb25maWd1cmF0aW9uIGJhc2VkIG9uIGN1cnJlbnQgcHJvamVjdCAod2hpY2gKLQkgKiBpcyBiYXNlZCBvbiBjdXJyZW50IGRvY3VtZW50KSBvciBnbG9iYWwgY29uZmlndXJhdGlvbiBpZiBwcm9qZWN0IGRvZXMKLQkgKiBub3Qgb3ZlcnJpZGUKLQkgKiAKLQkgKiBAcmV0dXJuIFZhbGlkYXRpb25Db25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBnZXRWYWxpZGF0aW9uQ29uZmlndXJhdGlvbihJRmlsZSBmaWxlKSB7Ci0JCVZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBudWxsOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJvamVjdENvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQkJCWNvbmZpZ3VyYXRpb24gPSBwcm9qZWN0Q29uZmlndXJhdGlvbjsKLQkJCQkJaWYgKHByb2plY3RDb25maWd1cmF0aW9uID09IG51bGwgfHwgcHJvamVjdENvbmZpZ3VyYXRpb24udXNlR2xvYmFsUHJlZmVyZW5jZSgpKSB7Ci0JCQkJCQljb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdmFsaWRhdG9yIGlzIGVuYWJsZWQgYWNjb3JkaW5nIGluIFZhbGlkYXRpb24gcHJlZmVyZW5jZXMKLQkgKiAKLQkgKiBAcGFyYW0gdm1kCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0JhdGNoVmFsaWRhdG9yUHJlZmVyZW5jZUVuYWJsZWQoSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0JCVZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBnZXRWYWxpZGF0aW9uQ29uZmlndXJhdGlvbihmaWxlKTsKLQkJaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGEgbWV0YWRhdGEgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEoSlNQQ29udGVudFZhbGlkYXRvci5jbGFzcy5nZXROYW1lKCkpOwotCQkJaWYgKG1ldGFkYXRhICE9IG51bGwpIHsKLQkJCQlpZiAoIWNvbmZpZ3VyYXRpb24uaXNCdWlsZEVuYWJsZWQobWV0YWRhdGEpICYmICFjb25maWd1cmF0aW9uLmlzTWFudWFsRW5hYmxlZChtZXRhZGF0YSkpCi0JCQkJCWVuYWJsZWQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgZmlsZSBpcyBhIGpzcCBmcmFnbWVudCBvciBub3QuIElmIHNvLCBjaGVjayBpZiB0aGUgZnJhZ21lbnQKLQkgKiBzaG91bGQgYmUgdmFsaWRhdGVkIG9yIG5vdC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgQXNzdW1lcyBzaG91bGRWYWxpZGF0ZSB3YXMgYWxyZWFkeSBjYWxsZWQgb24gZmlsZSBzbyBpdAotCSAqICAgICAgICAgICAgc2hvdWxkIG5vdCBiZSBudWxsIGFuZCBkb2VzIGV4aXN0Ci0JICogQHJldHVybiBmYWxzZSBpZiBmaWxlIGlzIGEgZnJhZ21lbnQgYW5kIGl0IHNob3VsZCBub3QgYmUgdmFsaWRhdGVkLAotCSAqICAgICAgICAgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZnJhZ21lbnRDaGVjayhJRmlsZSBmaWxlKSB7Ci0JCS8vIGNvcGllZCBmcm9tIEpTUFZhbGlkYXRvcgotCQlib29sZWFuIHNob3VsZFZhbGlkYXRlID0gdHJ1ZTsKLQkJLy8gcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgcG9zc2libHkgYSBqc3AgZnJhZ21lbnQKLQkJaWYgKGdldEpTUEZDb250ZW50VHlwZSgpLmlzQXNzb2NpYXRlZFdpdGgoZmlsZS5nZXROYW1lKCkpKSB7Ci0JCQkvLyBnZXQgcHJlZmVyZW5jZSBmb3IgdmFsaWRhdGUganNwIGZyYWdtZW50cwotCQkJYm9vbGVhbiBzaG91bGRWYWxpZGF0ZUZyYWdtZW50cyA9IEJvb2xlYW4udmFsdWVPZihKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLlZBTElEQVRFX0ZSQUdNRU5UUywgZmlsZSwgdHJ1ZSkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJLyoKLQkJCSAqIGlmIGpzcCBmcmFnbWVudHMgc2hvdWxkIG5vdCBiZSB2YWxpZGF0ZWQsIGNoZWNrIGlmIGZpbGUgaXMKLQkJCSAqIHJlYWxseSBqc3AgZnJhZ21lbnQKLQkJCSAqLwotCQkJaWYgKCFzaG91bGRWYWxpZGF0ZUZyYWdtZW50cykgewotCQkJCWJvb2xlYW4gaXNGcmFnbWVudCA9IGlzRnJhZ21lbnQoZmlsZSk7Ci0JCQkJc2hvdWxkVmFsaWRhdGUgPSAhaXNGcmFnbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2hvdWxkVmFsaWRhdGU7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBmaWxlIGlzIGpzcCBmcmFnbWVudCBvciBub3QgKGRvZXMgYSBkZWVwLCBpbmRlcHRoIGNoZWNrLAotCSAqIGxvb2tpbmcgaW50byBjb250ZW50cyBvZiBmaWxlKQotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBhc3N1bWVzIGZpbGUgaXMgbm90IG51bGwgYW5kIGV4aXN0cwotCSAqIEByZXR1cm4gdHJ1ZSBpZiBmaWxlIGlzIGpzcCBmcmFnbWVudCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRnJhZ21lbnQoSUZpbGUgZmlsZSkgewotCQkvLyBjb3BpZWQgZnJvbSBKU1BWYWxpZGF0b3IKLQkJYm9vbGVhbiBpc0ZyYWdtZW50ID0gZmFsc2U7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCS8vIGl0IGNhbiBiZSBudWxsCi0JCQlpZiAoY29udGVudERlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCQlpcyA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQljb250ZW50RGVzY3JpcHRpb24gPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXREZXNjcmlwdGlvbkZvcihpcywgZmlsZS5nZXROYW1lKCksIG5ldyBRdWFsaWZpZWROYW1lW117SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUfSk7Ci0JCQl9Ci0JCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZmlsZUN0SWQgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKS5nZXRJZCgpOwotCQkJCWlzRnJhZ21lbnQgPSAoZmlsZUN0SWQgIT0gbnVsbCAmJiBDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQRlJBR01FTlQuZXF1YWxzKGZpbGVDdElkKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZSwgYXNzdW1lIGl0J3MgaW52YWxpZCBKU1AKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUsIGFzc3VtZSBpdCdzIGludmFsaWQgSlNQCi0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBtdXN0IGNsb3NlIGlucHV0IHN0cmVhbSBpbiBjYXNlIG90aGVycyBuZWVkIGl0Ci0JCQlpZiAoaXMgIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQlpcy5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gbm90IHN1cmUgaG93IHRvIHJlY292ZXIgYXQgdGhpcyBwb2ludAotCQkJCX0KLQkJfQotCQlyZXR1cm4gaXNGcmFnbWVudDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGUoSUZpbGUgZmlsZSkgewotCQkvLyBjb3BpZWQgZnJvbSBKU1BWYWxpZGF0b3IKLQkJSVJlc291cmNlIHJlc291cmNlID0gZmlsZTsKLQkJZG8gewotCQkJaWYgKHJlc291cmNlLmlzRGVyaXZlZCgpIHx8IHJlc291cmNlLmlzVGVhbVByaXZhdGVNZW1iZXIoKSB8fCAhcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkgfHwgcmVzb3VyY2UuZ2V0TmFtZSgpLmNoYXJBdCgwKSA9PSAnLicpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXNvdXJjZSA9IHJlc291cmNlLmdldFBhcmVudCgpOwotCQl9Ci0JCXdoaWxlICgocmVzb3VyY2UuZ2V0VHlwZSgpICYgSVJlc291cmNlLlBST0pFQ1QpID09IDApOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIEpTUCBmcmFnbWVudCBjb250ZW50IHR5cGUKLQkgKiAKLQkgKiBAcmV0dXJuIGpzcGYgY29udGVudCB0eXBlCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZ2V0SlNQRkNvbnRlbnRUeXBlKCkgewotCQkvLyBjb3BpZWQgZnJvbSBKU1BWYWxpZGF0b3IKLQkJaWYgKGZKU1BGQ29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJZkpTUEZDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BGUkFHTUVOVCk7Ci0JCX0KLQkJcmV0dXJuIGZKU1BGQ29udGVudFR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vTG9jYWxpemVkTWVzc2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vTG9jYWxpemVkTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjg2ZTM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0xvY2FsaXplZE1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci0KLS8qKgotICogU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIE1lc3NhZ2UgYWxsIHZhbGlkYXRvcnMgaW4gcGFja2FnZSBjYW4gdXNlLgotICovCi1jbGFzcyBMb2NhbGl6ZWRNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgX21lc3NhZ2UgPSBudWxsOwotCi0JcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQpIHsKLQkJdGhpcyhzZXZlcml0eSwgbWVzc2FnZVRleHQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0LCBJUmVzb3VyY2UgdGFyZ2V0T2JqZWN0KSB7Ci0JCXRoaXMoc2V2ZXJpdHksIG1lc3NhZ2VUZXh0LCAoT2JqZWN0KSB0YXJnZXRPYmplY3QpOwotCX0KLQotCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0LCBPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCXN1cGVyKG51bGwsIHNldmVyaXR5LCBudWxsKTsKLQkJc2V0TG9jYWxpemVkTWVzc2FnZShtZXNzYWdlVGV4dCk7Ci0JCXNldFRhcmdldE9iamVjdCh0YXJnZXRPYmplY3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2FsaXplZE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX21lc3NhZ2UgPSBtZXNzYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxpemVkTWVzc2FnZSgpIHsKLQkJcmV0dXJuIF9tZXNzYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoQ2xhc3NMb2FkZXIgY2wpIHsKLQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoTG9jYWxlIGwpIHsKLQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoTG9jYWxlIGwsIENsYXNzTG9hZGVyIGNsKSB7Ci0JCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdKU1BGaWxlV2l6YXJkUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdKU1BGaWxlV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzM2MjU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC93aXphcmQvTmV3SlNQRmlsZVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2ICwyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsLkZhY2V0TW9kdWxlQ29yZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotCi1jbGFzcyBOZXdKU1BGaWxlV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgewotCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkNvbnRlbnRUeXBlOwotCXByaXZhdGUgTGlzdCBmVmFsaWRFeHRlbnNpb25zID0gbnVsbDsKLQotCXB1YmxpYyBOZXdKU1BGaWxlV2l6YXJkUGFnZShTdHJpbmcgcGFnZU5hbWUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcihwYWdlTmFtZSwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZW4gdG8gc2V0IHRoZSBzZWxlY3RlZCBmb2xkZXIgdG8gd2ViIGNvbnRlbnRzCi0JICogZm9sZGVyIGlmIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpcyBvdXRzaWRlIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxQb3B1bGF0ZUNvbnRhaW5lck5hbWVGaWVsZCgpIHsKLQkJc3VwZXIuaW5pdGlhbFBvcHVsYXRlQ29udGFpbmVyTmFtZUZpZWxkKCk7Ci0KLQkJSVBhdGggZnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEZyb21QYXRoKGZ1bGxQYXRoKTsKLQkJSVBhdGggd2ViQ29udGVudFBhdGggPSBnZXRXZWJDb250ZW50UGF0aChwcm9qZWN0KTsKLQotCQlpZiAod2ViQ29udGVudFBhdGggIT0gbnVsbCAmJiAhd2ViQ29udGVudFBhdGguaXNQcmVmaXhPZihmdWxsUGF0aCkpIHsKLQkJCXNldENvbnRhaW5lckZ1bGxQYXRoKHdlYkNvbnRlbnRQYXRoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiB0byBzZXQgYWRkaXRpb25hbCB2YWxpZGF0aW9uIHNwZWNpZmljIHRvIGpzcAotCSAqIGZpbGVzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJc2V0TWVzc2FnZShudWxsKTsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0JCWlmICghc3VwZXIudmFsaWRhdGVQYWdlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0JCUlQYXRoIGZ1bGxQYXRoID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQkJaWYgKChmdWxsUGF0aCAhPSBudWxsKSAmJiAoZnVsbFBhdGguaXNFbXB0eSgpID09IGZhbHNlKSAmJiAoZmlsZU5hbWUgIT0gbnVsbCkpIHsKLQkJCS8vIGNoZWNrIHRoYXQgZmlsZW5hbWUgZG9lcyBub3QgY29udGFpbiBpbnZhbGlkIGV4dGVuc2lvbgotCQkJaWYgKCFleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKGZpbGVOYW1lKSkgewotCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChKU1BVSU1lc3NhZ2VzLl9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9KU1AsIGdldFZhbGlkRXh0ZW5zaW9ucygpLnRvU3RyaW5nKCkpKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkvLyBubyBmaWxlIGV4dGVuc2lvbiBzcGVjaWZpZWQgc28gY2hlY2sgYWRkaW5nIGRlZmF1bHQKLQkJCS8vIGV4dGVuc2lvbiBkb2Vzbid0IGVxdWFsIGEgZmlsZSB0aGF0IGFscmVhZHkgZXhpc3RzCi0JCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSA9PSAtMSkgewotCQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGFkZERlZmF1bHRFeHRlbnNpb24oZmlsZU5hbWUpOwotCQkJCUlQYXRoIHJlc291cmNlUGF0aCA9IGZ1bGxQYXRoLmFwcGVuZChuZXdGaWxlTmFtZSk7Ci0KLQkJCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCQlJU3RhdHVzIHJlc3VsdCA9IHdvcmtzcGFjZS52YWxpZGF0ZVBhdGgocmVzb3VyY2VQYXRoLnRvU3RyaW5nKCksIElSZXNvdXJjZS5GT0xERVIpOwotCQkJCWlmICghcmVzdWx0LmlzT0soKSkgewotCQkJCQkvLyBwYXRoIGludmFsaWQKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKHJlc3VsdC5nZXRNZXNzYWdlKCkpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJaWYgKCh3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZvbGRlcihyZXNvdXJjZVBhdGgpLmV4aXN0cygpIHx8IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZShyZXNvdXJjZVBhdGgpLmV4aXN0cygpKSkgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoSlNQVUlNZXNzYWdlcy5SZXNvdXJjZUdyb3VwX25hbWVFeGlzdHMpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBnZXQgdGhlIElQcm9qZWN0IGZvciB0aGUgc2VsZWN0aW9uIHBhdGgKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0RnJvbVBhdGgoZnVsbFBhdGgpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCWlmICghaXNKYXZhUHJvamVjdChwcm9qZWN0KSkgewotCQkJCQlzZXRNZXNzYWdlKEpTUFVJTWVzc2FnZXMuX1dBUk5JTkdfRklMRV9NVVNUX0JFX0lOU0lERV9KQVZBX1BST0pFQ1QsIFdBUk5JTkcpOwotCQkJCX0KLQkJCQkvLyBpZiBpbnNpZGUgd2ViIHByb2plY3QsIGNoZWNrIGlmIGluc2lkZSB3ZWJDb250ZW50IGZvbGRlcgotCQkJCWlmIChpc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJCS8vIGNoZWNrIHRoYXQgdGhlIHBhdGggaXMgaW5zaWRlIHRoZSB3ZWJDb250ZW50IGZvbGRlcgotCQkJCQlJUGF0aCB3ZWJDb250ZW50UGF0aCA9IGdldFdlYkNvbnRlbnRQYXRoKHByb2plY3QpOwotCQkJCQlpZiAoIXdlYkNvbnRlbnRQYXRoLmlzUHJlZml4T2YoZnVsbFBhdGgpKSB7Ci0JCQkJCQlzZXRNZXNzYWdlKEpTUFVJTWVzc2FnZXMuX1dBUk5JTkdfRk9MREVSX01VU1RfQkVfSU5TSURFX1dFQl9DT05URU5ULCBXQVJOSU5HKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZGVmYXVsdCBleHRlbnNpb24gdG8gdGhlIGZpbGVuYW1lCi0JICogCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBhZGREZWZhdWx0RXh0ZW5zaW9uKFN0cmluZyBmaWxlbmFtZSkgewotCQlTdHJpbmdCdWZmZXIgbmV3RmlsZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKGZpbGVuYW1lKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIGV4dCA9IHByZWZlcmVuY2UuZ2V0U3RyaW5nKEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04pOwotCi0JCW5ld0ZpbGVOYW1lLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCi0JCW5ld0ZpbGVOYW1lLmFwcGVuZChleHQpOwotCi0JCXJldHVybiBuZXdGaWxlTmFtZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEdldCBjb250ZW50IHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmV3IGZpbGUgd2l6YXJkCi0JICogCi0JICogQHJldHVybiBJQ29udGVudFR5cGUKLQkgKi8KLQlwcml2YXRlIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJaWYgKGZDb250ZW50VHlwZSA9PSBudWxsKQotCQkJZkNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0JCXJldHVybiBmQ29udGVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogR2V0IGxpc3Qgb2YgdmFsaWQgZXh0ZW5zaW9ucyBmb3IgSlNQIENvbnRlbnQgdHlwZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0VmFsaWRFeHRlbnNpb25zKCkgewotCQlpZiAoZlZhbGlkRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCQlmVmFsaWRFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RmlsZVNwZWNzKElDb250ZW50VHlwZS5GSUxFX0VYVEVOU0lPTl9TUEVDKSkpOwotCQl9Ci0JCXJldHVybiBmVmFsaWRFeHRlbnNpb25zOwotCX0KLQotCS8qKgotCSAqIFZlcmlmaWVzIGlmIGZpbGVOYW1lIGlzIHZhbGlkIG5hbWUgZm9yIGNvbnRlbnQgdHlwZS4gVGFrZXMgYmFzZSBjb250ZW50Ci0JICogdHlwZSBpbnRvIGNvbnNpZGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGZpbGVOYW1lCi0JICogQHJldHVybiB0cnVlIGlmIGV4dGVuc2lvbiBpcyB2YWxpZCBmb3IgdGhpcyBjb250ZW50IHR5cGUKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZXh0ZW5zaW9uVmFsaWRGb3JDb250ZW50VHlwZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCi0JCUlDb250ZW50VHlwZSB0eXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLQkJLy8gdGhlcmUgaXMgY3VycmVudGx5IGFuIGV4dGVuc2lvbgotCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSAhPSAtMSkgewotCQkJLy8gY2hlY2sgd2hhdCBjb250ZW50IHR5cGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggY3VycmVudCBleHRlbnNpb24KLQkJCUlDb250ZW50VHlwZVtdIHR5cGVzID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlc0ZvcihmaWxlTmFtZSk7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IHR5cGVzLmxlbmd0aCAmJiAhdmFsaWQpIHsKLQkJCQl2YWxpZCA9IHR5cGVzW2ldLmlzS2luZE9mKHR5cGUpOwotCQkJCSsraTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCQl2YWxpZCA9IHRydWU7IC8vIG5vIGV4dGVuc2lvbiBzbyB2YWxpZAotCQlyZXR1cm4gdmFsaWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgcGF0aAotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCB3aGljaCBwcm9qZWN0IGlzIG5lZWRlZAotCSAqIEByZXR1cm4gSVByb2plY3Qgb2JqZWN0LiBJZiBwYXRoIGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZSByZXR1cm4KLQkgKiAgICAgICAgIHZhbHVlIGlzIGFsc28gPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0RnJvbVBhdGgoSVBhdGggcGF0aCkgewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0KLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJaWYgKHdvcmtzcGFjZS52YWxpZGF0ZVBhdGgocGF0aC50b1N0cmluZygpLCBJUmVzb3VyY2UuUFJPSkVDVCkuaXNPSygpKSB7Ci0JCQkJcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKS5nZXRQcm9qZWN0KCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGlzIGEgd2ViIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHByb2plY3QgdG8gYmUgY2hlY2tlZAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvamVjdCBpcyB3ZWIgcHJvamVjdCwgb3RoZXJ3aXNlIGZhbHNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRHluYW1pY1dlYlByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlib29sZWFuIGlzID0gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpOwotCQlyZXR1cm4gaXM7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBpcyBhIHR5cGUgb2YgamF2YSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBwcm9qZWN0IHRvIGJlIGNoZWNrZWQgKGNhbm5vdCBiZSBudWxsKQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvamVjdCBpcyBhIHR5cGUgb2YgamF2YSBwcm9qZWN0LCBvdGhlcndpc2UgZmFsc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNKYXZhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWJvb2xlYW4gaXNKYXZhID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpc0phdmEgPSBwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCi0JCXJldHVybiBpc0phdmE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2ViIGNvbnRlbnRzIGZvbGRlciBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3QKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgdGhlIHByb2plY3Qgd2hpY2ggd2ViIGNvbnRlbnRzIHBhdGggaXMgbmVlZGVkCi0JICogQHJldHVybiBJUGF0aCBvZiB0aGUgd2ViIGNvbnRlbnRzIGZvbGRlcgotCSAqLwotCXByaXZhdGUgSVBhdGggZ2V0V2ViQ29udGVudFBhdGgoSVByb2plY3QgcHJvamVjdCkgewotCQlJUGF0aCBwYXRoID0gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5nZXRXZWJDb250ZW50Um9vdFBhdGgocHJvamVjdCk7Ci0JCXJldHVybiBwYXRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC93aXphcmQvTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZGU3OWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Eb2N1bWVudFRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkpTUFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLQotLyoqCi0gKiBUZW1wbGF0ZXMgcGFnZSBpbiBuZXcgZmlsZSB3aXphcmQuIEFsbG93cyB1c2VycyB0byBzZWxlY3QgYSBuZXcgZmlsZQotICogdGVtcGxhdGUgdG8gYmUgYXBwbGllZCBpbiBuZXcgZmlsZS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogQ29udGVudCBwcm92aWRlciBmb3IgdGVtcGxhdGVzCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUZW1wbGF0ZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQkJLyoqIFRoZSB0ZW1wbGF0ZSBzdG9yZS4gKi8KLQkJcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZTdG9yZTsKLQotCQkvKgotCQkgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJZlN0b3JlID0gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dCkgewotCQkJcmV0dXJuIGZTdG9yZS5nZXRUZW1wbGF0ZXMoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5ORVcpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQlmU3RvcmUgPSAoVGVtcGxhdGVTdG9yZSkgbmV3SW5wdXQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMYWJlbCBwcm92aWRlciBmb3IgdGVtcGxhdGVzLgotCSAqLwotCXByaXZhdGUgY2xhc3MgVGVtcGxhdGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgaW50KQotCQkgKi8KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGludCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IChUZW1wbGF0ZSkgZWxlbWVudDsKLQotCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCXJldHVybiB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJcmV0dXJuIHRlbXBsYXRlLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqIExhc3Qgc2VsZWN0ZWQgdGVtcGxhdGUgbmFtZSAqLwotCXByaXZhdGUgU3RyaW5nIGZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWU7Ci0JLyoqIFRoZSB2aWV3ZXIgZGlzcGxheXMgdGhlIHBhdHRlcm4gb2Ygc2VsZWN0ZWQgdGVtcGxhdGUuICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgZlBhdHRlcm5WaWV3ZXI7Ci0JLyoqIFRoZSB0YWJsZSBwcmVzZW50aW5nIHRoZSB0ZW1wbGF0ZXMuICovCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBmVGFibGVWaWV3ZXI7Ci0JLyoqIFRlbXBsYXRlIHN0b3JlIHVzZWQgYnkgdGhpcyB3aXphcmQgcGFnZSAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQkvKiogQ2hlY2tib3ggZm9yIHVzaW5nIHRlbXBsYXRlcy4gKi8KLQlwcml2YXRlIEJ1dHRvbiBmVXNlVGVtcGxhdGVCdXR0b247Ci0KLQlwdWJsaWMgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZSgpIHsKLQkJc3VwZXIoIk5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2UiLCBKU1BVSU1lc3NhZ2VzLk5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oSlNQVUlNZXNzYWdlcy5OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzEpOwotCX0KLQotCS8qKgotCSAqIENvcnJlY3RseSByZXNpemVzIHRoZSB0YWJsZSBzbyBubyBwaGFudG9tIGNvbHVtbnMgYXBwZWFyCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHBhcmFtIGJ1dHRvbnMKLQkgKiAgICAgICAgICAgIHRoZSBidXR0b25zCi0JICogQHBhcmFtIHRhYmxlCi0JICogICAgICAgICAgICB0aGUgdGFibGUKLQkgKiBAcGFyYW0gY29sdW1uMQotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGNvbHVtbgotCSAqIEBwYXJhbSBjb2x1bW4yCi0JICogICAgICAgICAgICB0aGUgc2Vjb25kIGNvbHVtbgotCSAqIEBwYXJhbSBjb2x1bW4zCi0JICogICAgICAgICAgICB0aGUgdGhpcmQgY29sdW1uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVRhYmxlUmVzaXppbmcoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgVGFibGUgdGFibGUsIGZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjEsIGZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjIpIHsKLQkJcGFyZW50LmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCVJlY3RhbmdsZSBhcmVhID0gcGFyZW50LmdldENsaWVudEFyZWEoKTsKLQkJCQlQb2ludCBwcmVmZXJyZWRTaXplID0gdGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCQlpbnQgd2lkdGggPSBhcmVhLndpZHRoIC0gMiAqIHRhYmxlLmdldEJvcmRlcldpZHRoKCk7Ci0JCQkJaWYgKHByZWZlcnJlZFNpemUueSA+IGFyZWEuaGVpZ2h0KSB7Ci0JCQkJCS8vIFN1YnRyYWN0IHRoZSBzY3JvbGxiYXIgd2lkdGggZnJvbSB0aGUgdG90YWwgY29sdW1uCi0JCQkJCS8vIHdpZHRoCi0JCQkJCS8vIGlmIGEgdmVydGljYWwgc2Nyb2xsYmFyIHdpbGwgYmUgcmVxdWlyZWQKLQkJCQkJUG9pbnQgdkJhclNpemUgPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKTsKLQkJCQkJd2lkdGggLT0gdkJhclNpemUueDsKLQkJCQl9Ci0KLQkJCQlQb2ludCBvbGRTaXplID0gdGFibGUuZ2V0U2l6ZSgpOwotCQkJCWlmIChvbGRTaXplLnggPiB3aWR0aCkgewotCQkJCQkvLyB0YWJsZSBpcyBnZXR0aW5nIHNtYWxsZXIgc28gbWFrZSB0aGUgY29sdW1ucwotCQkJCQkvLyBzbWFsbGVyIGZpcnN0IGFuZCB0aGVuIHJlc2l6ZSB0aGUgdGFibGUgdG8KLQkJCQkJLy8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCWNvbHVtbjEuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJY29sdW1uMi5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQl0YWJsZS5zZXRTaXplKHdpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyB0YWJsZSBpcyBnZXR0aW5nIGJpZ2dlciBzbyBtYWtlIHRoZSB0YWJsZQotCQkJCQkvLyBiaWdnZXIgZmlyc3QgYW5kIHRoZW4gbWFrZSB0aGUgY29sdW1ucyB3aWRlcgotCQkJCQkvLyB0byBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJCQkJdGFibGUuc2V0U2l6ZSh3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIGFuY2VzdG9yKSB7Ci0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKGFuY2VzdG9yLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gY3JlYXRlIGNoZWNrYm94IGZvciB1c2VyIHRvIHVzZSBKU1AgVGVtcGxhdGUKLQkJZlVzZVRlbXBsYXRlQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV80KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllbmFibGVUZW1wbGF0ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIGNvbXBvc2l0ZSBmb3IgVGVtcGxhdGVzIHRhYmxlCi0JCUNvbXBvc2l0ZSBpbm5lclBhcmVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgaW5uZXJMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlpbm5lckxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJaW5uZXJMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJaW5uZXJMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlpbm5lclBhcmVudC5zZXRMYXlvdXQoaW5uZXJMYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpOwotCQlpbm5lclBhcmVudC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkvLyBDcmVhdGUgbGlua2VkIHRleHQgdG8ganVzdCB0byB0ZW1wbGF0ZXMgcHJlZmVyZW5jZSBwYWdlCi0JCUxpbmsgbGluayA9IG5ldyBMaW5rKGlubmVyUGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxpbmsuc2V0VGV4dChKU1BVSU1lc3NhZ2VzLk5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfNik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWxpbmsuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlsaW5rQ2xpY2tlZCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgdGFibGUgdGhhdCBkaXNwbGF5cyB0ZW1wbGF0ZXMKLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoaW5uZXJQYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoMik7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoMTApOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQl0YWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uMS5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8yKTsKLQotCQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbjIuc2V0VGV4dChKU1BVSU1lc3NhZ2VzLk5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMyk7Ci0KLQkJZlRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJZlRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFRlbXBsYXRlTGFiZWxQcm92aWRlcigpKTsKLQkJZlRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGVtcGxhdGVDb250ZW50UHJvdmlkZXIoKSk7Ci0KLQkJZlRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MikgewotCQkJCWlmICgob2JqZWN0MSBpbnN0YW5jZW9mIFRlbXBsYXRlKSAmJiAob2JqZWN0MiBpbnN0YW5jZW9mIFRlbXBsYXRlKSkgewotCQkJCQlUZW1wbGF0ZSBsZWZ0ID0gKFRlbXBsYXRlKSBvYmplY3QxOwotCQkJCQlUZW1wbGF0ZSByaWdodCA9IChUZW1wbGF0ZSkgb2JqZWN0MjsKLQkJCQkJaW50IHJlc3VsdCA9IGxlZnQuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwKQotCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkJcmV0dXJuIGxlZnQuZ2V0RGVzY3JpcHRpb24oKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJpZ2h0LmdldERlc2NyaXB0aW9uKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIG9iamVjdDEsIG9iamVjdDIpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc1NvcnRlclByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0KLQkJZlRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQl1cGRhdGVWaWV3ZXJJbnB1dCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgdmlld2VyIHRoYXQgZGlzcGxheXMgY3VycmVudGx5IHNlbGVjdGVkIHRlbXBsYXRlJ3MgY29udGVudHMKLQkJZlBhdHRlcm5WaWV3ZXIgPSBkb0NyZWF0ZVZpZXdlcihwYXJlbnQpOwotCi0JCWZUZW1wbGF0ZVN0b3JlID0gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlU3RvcmUoKTsKLQkJZlRhYmxlVmlld2VyLnNldElucHV0KGZUZW1wbGF0ZVN0b3JlKTsKLQotCQljb25maWd1cmVUYWJsZVJlc2l6aW5nKGlubmVyUGFyZW50LCB0YWJsZSwgY29sdW1uMSwgY29sdW1uMik7Ci0JCWxvYWRMYXN0U2F2ZWRQcmVmZXJlbmNlcygpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBJSGVscENvbnRleHRJZHMuSlNQX05FV1dJWkFSRF9URU1QTEFURV9IRUxQSUQpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXNldENvbnRyb2wocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCBjb25maWd1cmVzIGFuZCByZXR1cm5zIGEgc291cmNlIHZpZXdlciB0byBwcmVzZW50IHRoZSB0ZW1wbGF0ZQotCSAqIHBhdHRlcm4gb24gdGhlIHByZWZlcmVuY2UgcGFnZS4gQ2xpZW50cyBtYXkgb3ZlcnJpZGUgdG8gcHJvdmlkZSBhCi0JICogY3VzdG9tIHNvdXJjZSB2aWV3ZXIgZmVhdHVyaW5nIGUuZy4gc3ludGF4IGNvbG9yaW5nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEByZXR1cm4gYSBjb25maWd1cmVkIHNvdXJjZSB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGJhc2VDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUCgpOwotCi0JCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCQl9Ci0JCX07Ci0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXIocGFyZW50LCBudWxsLCBudWxsLCBmYWxzZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlcikuZ2V0VGV4dFdpZGdldCgpLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZE1vZGVsIHNjcmF0Y2hNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzY3JhdGNoTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXZpZXdlci5jb25maWd1cmUoc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCXZpZXdlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgZG9DcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChKU1BVSU1lc3NhZ2VzLk5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfNSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJU291cmNlVmlld2VyIHZpZXdlciA9IGNyZWF0ZVZpZXdlcihwYXJlbnQpOwotCQl2aWV3ZXIuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0JCUNvbnRyb2wgY29udHJvbCA9IHZpZXdlci5nZXRDb250cm9sKCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoNSk7Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZS9kaXNhYmxlIGNvbnRyb2xzIGluIHBhZ2UgYmFzZWQgb24gZlVzZVRlbXBsYXRlQnV0dG9uJ3MgY3VycmVudAotCSAqIHN0YXRlLgotCSAqLwotCXZvaWQgZW5hYmxlVGVtcGxhdGVzKCkgewotCQlib29sZWFuIGVuYWJsZWQgPSBmVXNlVGVtcGxhdGVCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJaWYgKCFlbmFibGVkKSB7Ci0JCQkvLyBzYXZlIGxhc3Qgc2VsZWN0ZWQgdGVtcGxhdGUKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQkJaWYgKHRlbXBsYXRlICE9IG51bGwpCi0JCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJCWVsc2UKLQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkJZlRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihudWxsKTsKLQkJfQotCQllbHNlIHsKLQkJCXNldFNlbGVjdGVkVGVtcGxhdGUoZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSk7Ci0JCX0KLQotCQlmVGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWZQYXR0ZXJuVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGVtcGxhdGUgcHJlZmVyZW5jZSBwYWdlIGlkCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFByZWZlcmVuY2VQYWdlSWQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5qc3AudGVtcGxhdGVzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRlbXBsYXRlLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFRlbXBsYXRlIGdldFNlbGVjdGVkVGVtcGxhdGUoKSB7Ci0JCVRlbXBsYXRlIHRlbXBsYXRlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJdGVtcGxhdGUgPSAoVGVtcGxhdGUpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gdGVtcGxhdGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0ZW1wbGF0ZSBzdHJpbmcgdG8gaW5zZXJ0LgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIHRvIGluc2VydCBvciBudWxsIGlmIG5vbmUgaXMgdG8gYmUgaW5zZXJ0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VGVtcGxhdGVTdHJpbmcoKSB7Ci0JCVN0cmluZyB0ZW1wbGF0ZVN0cmluZyA9IG51bGw7Ci0KLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlUZW1wbGF0ZUNvbnRleHRUeXBlIGNvbnRleHRUeXBlID0gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkuZ2V0Q29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5ORVcpOwotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gbmV3IERvY3VtZW50KCk7Ci0JCQlUZW1wbGF0ZUNvbnRleHQgY29udGV4dCA9IG5ldyBEb2N1bWVudFRlbXBsYXRlQ29udGV4dChjb250ZXh0VHlwZSwgZG9jdW1lbnQsIDAsIDApOwotCQkJdHJ5IHsKLQkJCQlUZW1wbGF0ZUJ1ZmZlciBidWZmZXIgPSBjb250ZXh0LmV2YWx1YXRlKHRlbXBsYXRlKTsKLQkJCQl0ZW1wbGF0ZVN0cmluZyA9IGJ1ZmZlci5nZXRTdHJpbmcoKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJDb3VsZCBub3QgY3JlYXRlIHRlbXBsYXRlIGZvciBuZXcganNwIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0ZW1wbGF0ZVN0cmluZzsKLQl9Ci0KLQl2b2lkIGxpbmtDbGlja2VkKCkgewotCQlTdHJpbmcgcGFnZUlkID0gZ2V0UHJlZmVyZW5jZVBhZ2VJZCgpOwotCQlQcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IFByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwgcGFnZUlkLCBuZXcgU3RyaW5nW117cGFnZUlkfSwgbnVsbCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCWZUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgbGFzdCB0ZW1wbGF0ZSBuYW1lIHVzZWQgaW4gTmV3IEpTUCBGaWxlIHdpemFyZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZExhc3RTYXZlZFByZWZlcmVuY2VzKCkgewotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhKU1BVSVByZWZlcmVuY2VOYW1lcy5ORVdfRklMRV9URU1QTEFURV9OQU1FKTsKLQkJaWYgKHRlbXBsYXRlTmFtZSA9PSBudWxsIHx8IHRlbXBsYXRlTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlTmFtZTsKLQkJCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJZW5hYmxlVGVtcGxhdGVzKCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0ZW1wbGF0ZSBuYW1lIHVzZWQgZm9yIG5leHQgY2FsbCB0byBOZXcgSlNQIEZpbGUgd2l6YXJkLgotCSAqLwotCXZvaWQgc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCkgewotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCXRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJfQotCi0JCUpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShKU1BVSVByZWZlcmVuY2VOYW1lcy5ORVdfRklMRV9URU1QTEFURV9OQU1FLCB0ZW1wbGF0ZU5hbWUpOwotCQlKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IGEgdGVtcGxhdGUgaW4gdGhlIHRhYmxlIHZpZXdlciBnaXZlbiB0aGUgdGVtcGxhdGUgbmFtZS4gSWYKLQkgKiB0ZW1wbGF0ZSBuYW1lIGNhbm5vdCBiZSBmb3VuZCBvciB0ZW1wbGF0ZU5hbWUgaXMgbnVsbCwganVzdCBzZWxlY3QKLQkgKiBmaXJzdCBpdGVtIGluIHRhYmxlLiBJZiBubyBpdGVtcyBpbiB0YWJsZSBzZWxlY3Qgbm90aGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gdGVtcGxhdGVOYW1lCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkVGVtcGxhdGUoU3RyaW5nIHRlbXBsYXRlTmFtZSkgewotCQlPYmplY3QgdGVtcGxhdGUgPSBudWxsOwotCi0JCWlmICh0ZW1wbGF0ZU5hbWUgIT0gbnVsbCAmJiB0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLyBwaWNrIHRoZSBsYXN0IHVzZWQgdGVtcGxhdGUKLQkJCXRlbXBsYXRlID0gZlRlbXBsYXRlU3RvcmUuZmluZFRlbXBsYXRlKHRlbXBsYXRlTmFtZSwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5ORVcpOwotCQl9Ci0KLQkJLy8gbm8gcmVjb3JkIG9mIGxhc3QgdXNlZCB0ZW1wbGF0ZSBzbyBqdXN0IHBpY2sgZmlyc3QgZWxlbWVudAotCQlpZiAodGVtcGxhdGUgPT0gbnVsbCkgewotCQkJLy8ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJCXRlbXBsYXRlID0gZlRhYmxlVmlld2VyLmdldEVsZW1lbnRBdCgwKTsKLQkJfQotCi0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0ZW1wbGF0ZSk7Ci0JCQlmVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBwYXR0ZXJuIHZpZXdlci4KLQkgKi8KLQl2b2lkIHVwZGF0ZVZpZXdlcklucHV0KCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCWZQYXR0ZXJuVmlld2VyLmdldERvY3VtZW50KCkuc2V0KHRlbXBsYXRlLmdldFBhdHRlcm4oKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC93aXphcmQvTmV3SlNQV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0pTUFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmQyYTJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC93aXphcmQvTmV3SlNQV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSlNQRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLQotcHVibGljIGNsYXNzIE5ld0pTUFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCXByaXZhdGUgTmV3SlNQRmlsZVdpemFyZFBhZ2UgZk5ld0ZpbGVQYWdlOwotCXByaXZhdGUgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZSBmTmV3RmlsZVRlbXBsYXRlc1BhZ2U7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWZOZXdGaWxlUGFnZSA9IG5ldyBOZXdKU1BGaWxlV2l6YXJkUGFnZSgiSlNQV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSIsIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKElERS5jb21wdXRlU2VsZWN0ZWRSZXNvdXJjZXMoZlNlbGVjdGlvbikpKTsgLy8kTk9OLU5MUy0xJCAKLQkJZk5ld0ZpbGVQYWdlLnNldFRpdGxlKEpTUFVJTWVzc2FnZXMuX1VJX1dJWkFSRF9ORVdfSEVBRElORyk7Ci0JCWZOZXdGaWxlUGFnZS5zZXREZXNjcmlwdGlvbihKU1BVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfTkVXX0RFU0NSSVBUSU9OKTsKLQkJYWRkUGFnZShmTmV3RmlsZVBhZ2UpOwotCi0JCWZOZXdGaWxlVGVtcGxhdGVzUGFnZSA9IG5ldyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlKCk7Ci0JCWFkZFBhZ2UoZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBhcHBseUxpbmVEZWxpbWl0ZXIoSUZpbGUgZmlsZSwgU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRTdHJpbmcoUGxhdGZvcm0uUElfUlVOVElNRSwgUGxhdGZvcm0uUFJFRl9MSU5FX1NFUEFSQVRPUiwgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpLCBuZXcgSVNjb3BlQ29udGV4dFtdIHtuZXcgUHJvamVjdFNjb3BlKGZpbGUuZ2V0UHJvamVjdCgpKSwgbmV3IEluc3RhbmNlU2NvcGUoKSB9KTsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBjb252ZXJ0ZWRUZXh0ID0gU3RyaW5nVXRpbHMucmVwbGFjZSh0ZXh0LCAiXHJcbiIsICJcbiIpOwotCQljb252ZXJ0ZWRUZXh0ID0gU3RyaW5nVXRpbHMucmVwbGFjZShjb252ZXJ0ZWRUZXh0LCAiXHIiLCAiXG4iKTsKLQkJY29udmVydGVkVGV4dCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UoY29udmVydGVkVGV4dCwgIlxuIiwgbGluZURlbGltaXRlcik7Ci0JCXJldHVybiBjb252ZXJ0ZWRUZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JCWZTZWxlY3Rpb24gPSBhU2VsZWN0aW9uOwotCQlzZXRXaW5kb3dUaXRsZShKU1BVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfTkVXX1RJVExFKTsKLQotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEpTUEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1dJWkJBTl9ORVdKU1BGSUxFKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5FZGl0b3IoZmluYWwgSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJCUlERS5vcGVuRWRpdG9yKHBhZ2UsIGZpbGUsIHRydWUpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWJvb2xlYW4gcGVyZm9ybWVkT0sgPSBmYWxzZTsKLQotCQkvLyBzYXZlIHVzZXIgb3B0aW9ucyBmb3IgbmV4dCB1c2UKLQkJZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlLnNhdmVMYXN0U2F2ZWRQcmVmZXJlbmNlcygpOwotCi0JCS8vIG5vIGZpbGUgZXh0ZW5zaW9uIHNwZWNpZmllZCBzbyBhZGQgZGVmYXVsdCBleHRlbnNpb24KLQkJU3RyaW5nIGZpbGVOYW1lID0gZk5ld0ZpbGVQYWdlLmdldEZpbGVOYW1lKCk7Ci0JCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpID09IC0xKSB7Ci0JCQlTdHJpbmcgbmV3RmlsZU5hbWUgPSBmTmV3RmlsZVBhZ2UuYWRkRGVmYXVsdEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0JCQlmTmV3RmlsZVBhZ2Uuc2V0RmlsZU5hbWUobmV3RmlsZU5hbWUpOwotCQl9Ci0KLQkJLy8gY3JlYXRlIGEgbmV3IGVtcHR5IGZpbGUKLQkJSUZpbGUgZmlsZSA9IGZOZXdGaWxlUGFnZS5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJLy8gaWYgdGhlcmUgd2FzIHByb2JsZW0gd2l0aCBjcmVhdGluZyBmaWxlLCBpdCB3aWxsIGJlIG51bGwsIHNvIG1ha2UKLQkJLy8gc3VyZSB0byBjaGVjawotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkvLyBwdXQgdGVtcGxhdGUgY29udGVudHMgaW50byBmaWxlCi0JCQlTdHJpbmcgdGVtcGxhdGVTdHJpbmcgPSBmTmV3RmlsZVRlbXBsYXRlc1BhZ2UuZ2V0VGVtcGxhdGVTdHJpbmcoKTsKLQkJCWlmICh0ZW1wbGF0ZVN0cmluZyAhPSBudWxsKSB7Ci0JCQkJdGVtcGxhdGVTdHJpbmcgPSBhcHBseUxpbmVEZWxpbWl0ZXIoZmlsZSwgdGVtcGxhdGVTdHJpbmcpOwotCQkJCS8vIGRldGVybWluZSB0aGUgZW5jb2RpbmcgZm9yIHRoZSBuZXcgZmlsZQotCQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2UgPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJCVN0cmluZyBjaGFyU2V0ID0gcHJlZmVyZW5jZS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCi0JCQkJdHJ5IHsKLQkJCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dHB1dFN0cmVhbVdyaXRlciA9IG51bGw7Ci0JCQkJCWlmIChjaGFyU2V0ID09IG51bGwgfHwgY2hhclNldC50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBqdXN0IHVzZSBkZWZhdWx0IGVuY29kaW5nCi0JCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSwgY2hhclNldCk7Ci0JCQkJCX0KLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLndyaXRlKHRlbXBsYXRlU3RyaW5nKTsKLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmZsdXNoKCk7Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci5jbG9zZSgpOwotCQkJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKSk7Ci0JCQkJCWZpbGUuc2V0Q29udGVudHMoaW5wdXRTdHJlYW0sIHRydWUsIGZhbHNlLCBudWxsKTsKLQkJCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJDb3VsZCBub3QgY3JlYXRlIGNvbnRlbnRzIGZvciBuZXcgSlNQIGZpbGUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQkJLy8gb3BlbiB0aGUgZmlsZSBpbiBlZGl0b3IKLQkJCW9wZW5FZGl0b3IoZmlsZSk7Ci0KLQkJCS8vIGV2ZXJ5dGhpbmcncyBmaW5lCi0JCQlwZXJmb3JtZWRPSyA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHBlcmZvcm1lZE9LOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC93aXphcmQvTmV3VGFnRmlsZVdpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC93aXphcmQvTmV3VGFnRmlsZVdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiY2I0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1RhZ0ZpbGVXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiAsMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsLkZhY2V0TW9kdWxlQ29yZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotCi1jbGFzcyBOZXdUYWdGaWxlV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgewotCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkNvbnRlbnRUeXBlOwotCXByaXZhdGUgTGlzdCBmVmFsaWRFeHRlbnNpb25zID0gbnVsbDsKLQotCXB1YmxpYyBOZXdUYWdGaWxlV2l6YXJkUGFnZShTdHJpbmcgcGFnZU5hbWUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcihwYWdlTmFtZSwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZW4gdG8gc2V0IHRoZSBzZWxlY3RlZCBmb2xkZXIgdG8gd2ViIGNvbnRlbnRzCi0JICogZm9sZGVyIGlmIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpcyBvdXRzaWRlIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxQb3B1bGF0ZUNvbnRhaW5lck5hbWVGaWVsZCgpIHsKLQkJc3VwZXIuaW5pdGlhbFBvcHVsYXRlQ29udGFpbmVyTmFtZUZpZWxkKCk7Ci0KLQkJSVBhdGggZnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEZyb21QYXRoKGZ1bGxQYXRoKTsKLQkJSVBhdGggd2ViQ29udGVudFBhdGggPSBnZXRXZWJDb250ZW50UGF0aChwcm9qZWN0KTsKLQotCQlpZiAod2ViQ29udGVudFBhdGggIT0gbnVsbCAmJiAhd2ViQ29udGVudFBhdGguaXNQcmVmaXhPZihmdWxsUGF0aCkpIHsKLQkJCXNldENvbnRhaW5lckZ1bGxQYXRoKHdlYkNvbnRlbnRQYXRoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiB0byBzZXQgYWRkaXRpb25hbCB2YWxpZGF0aW9uIHNwZWNpZmljIHRvIGpzcAotCSAqIGZpbGVzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJc2V0TWVzc2FnZShudWxsKTsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0JCWlmICghc3VwZXIudmFsaWRhdGVQYWdlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0JCUlQYXRoIGZ1bGxQYXRoID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQkJaWYgKChmdWxsUGF0aCAhPSBudWxsKSAmJiAoZnVsbFBhdGguaXNFbXB0eSgpID09IGZhbHNlKSAmJiAoZmlsZU5hbWUgIT0gbnVsbCkpIHsKLQkJCS8vIGNoZWNrIHRoYXQgZmlsZW5hbWUgZG9lcyBub3QgY29udGFpbiBpbnZhbGlkIGV4dGVuc2lvbgotCQkJaWYgKCFleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKGZpbGVOYW1lKSkgewotCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChKU1BVSU1lc3NhZ2VzLl9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9KU1AsIGdldFZhbGlkRXh0ZW5zaW9ucygpLnRvU3RyaW5nKCkpKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkvLyBubyBmaWxlIGV4dGVuc2lvbiBzcGVjaWZpZWQgc28gY2hlY2sgYWRkaW5nIGRlZmF1bHQKLQkJCS8vIGV4dGVuc2lvbiBkb2Vzbid0IGVxdWFsIGEgZmlsZSB0aGF0IGFscmVhZHkgZXhpc3RzCi0JCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSA9PSAtMSkgewotCQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGFkZERlZmF1bHRFeHRlbnNpb24oZmlsZU5hbWUpOwotCQkJCUlQYXRoIHJlc291cmNlUGF0aCA9IGZ1bGxQYXRoLmFwcGVuZChuZXdGaWxlTmFtZSk7Ci0KLQkJCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCQlJU3RhdHVzIHJlc3VsdCA9IHdvcmtzcGFjZS52YWxpZGF0ZVBhdGgocmVzb3VyY2VQYXRoLnRvU3RyaW5nKCksIElSZXNvdXJjZS5GT0xERVIpOwotCQkJCWlmICghcmVzdWx0LmlzT0soKSkgewotCQkJCQkvLyBwYXRoIGludmFsaWQKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKHJlc3VsdC5nZXRNZXNzYWdlKCkpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJaWYgKCh3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZvbGRlcihyZXNvdXJjZVBhdGgpLmV4aXN0cygpIHx8IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZShyZXNvdXJjZVBhdGgpLmV4aXN0cygpKSkgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoSlNQVUlNZXNzYWdlcy5SZXNvdXJjZUdyb3VwX25hbWVFeGlzdHMpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBnZXQgdGhlIElQcm9qZWN0IGZvciB0aGUgc2VsZWN0aW9uIHBhdGgKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0RnJvbVBhdGgoZnVsbFBhdGgpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCWlmICghaXNKYXZhUHJvamVjdChwcm9qZWN0KSkgewotCQkJCQlzZXRNZXNzYWdlKEpTUFVJTWVzc2FnZXMuX1dBUk5JTkdfRklMRV9NVVNUX0JFX0lOU0lERV9KQVZBX1BST0pFQ1QsIFdBUk5JTkcpOwotCQkJCX0KLQkJCQkvLyBpZiBpbnNpZGUgd2ViIHByb2plY3QsIGNoZWNrIGlmIGluc2lkZSB3ZWJDb250ZW50IGZvbGRlcgotCQkJCS8qCi0JCQkJaWYgKGlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpIHsKLQkJCQkJLy8gY2hlY2sgdGhhdCB0aGUgcGF0aCBpcyBpbnNpZGUgdGhlIHdlYkNvbnRlbnQgZm9sZGVyCi0JCQkJCUlQYXRoIHdlYkNvbnRlbnRQYXRoID0gZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCkuYXBwZW5kKCIvV0VCLUlORi90YWdzIik7Ci0JCQkJCWlmICghd2ViQ29udGVudFBhdGguaXNQcmVmaXhPZihmdWxsUGF0aCkpIHsKLQkJCQkJCXNldE1lc3NhZ2UoSlNQVUlNZXNzYWdlcy5fV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQsIFdBUk5JTkcpOwotCQkJCQl9Ci0JCQkJfQotCQkJCSovCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGRlZmF1bHQgZXh0ZW5zaW9uIHRvIHRoZSBmaWxlbmFtZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlbmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgYWRkRGVmYXVsdEV4dGVuc2lvbihTdHJpbmcgZmlsZW5hbWUpIHsKLQkJU3RyaW5nQnVmZmVyIG5ld0ZpbGVOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcihmaWxlbmFtZSk7Ci0KLS8vCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIGV4dCA9ICJ0YWciOy8vcHJlZmVyZW5jZS5nZXRTdHJpbmcoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTik7Ci0KLQkJbmV3RmlsZU5hbWUuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJbmV3RmlsZU5hbWUuYXBwZW5kKGV4dCk7Ci0KLQkJcmV0dXJuIG5ld0ZpbGVOYW1lLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGNvbnRlbnQgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBuZXcgZmlsZSB3aXphcmQKLQkgKiAKLQkgKiBAcmV0dXJuIElDb250ZW50VHlwZQotCSAqLwotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlpZiAoZkNvbnRlbnRUeXBlID09IG51bGwpCi0JCQlmQ29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQVEFHKTsKLQkJcmV0dXJuIGZDb250ZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgbGlzdCBvZiB2YWxpZCBleHRlbnNpb25zIGZvciBKU1AgQ29udGVudCB0eXBlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRWYWxpZEV4dGVuc2lvbnMoKSB7Ci0JCWlmIChmVmFsaWRFeHRlbnNpb25zID09IG51bGwpIHsKLQkJCUlDb250ZW50VHlwZSB0eXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLQkJCWZWYWxpZEV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QodHlwZS5nZXRGaWxlU3BlY3MoSUNvbnRlbnRUeXBlLkZJTEVfRVhURU5TSU9OX1NQRUMpKSk7Ci0JCX0KLQkJcmV0dXJuIGZWYWxpZEV4dGVuc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgaWYgZmlsZU5hbWUgaXMgdmFsaWQgbmFtZSBmb3IgY29udGVudCB0eXBlLiBUYWtlcyBiYXNlIGNvbnRlbnQKLQkgKiB0eXBlIGludG8gY29uc2lkZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcmV0dXJuIHRydWUgaWYgZXh0ZW5zaW9uIGlzIHZhbGlkIGZvciB0aGlzIGNvbnRlbnQgdHlwZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKFN0cmluZyBmaWxlTmFtZSkgewotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0KLQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkvLyB0aGVyZSBpcyBjdXJyZW50bHkgYW4gZXh0ZW5zaW9uCi0JCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICE9IC0xKSB7Ci0JCQkvLyBjaGVjayB3aGF0IGNvbnRlbnQgdHlwZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBjdXJyZW50IGV4dGVuc2lvbgotCQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVzRm9yKGZpbGVOYW1lKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdHlwZXMubGVuZ3RoICYmICF2YWxpZCkgewotCQkJCXZhbGlkID0gdHlwZXNbaV0uaXNLaW5kT2YodHlwZSk7Ci0JCQkJKytpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXZhbGlkID0gdHJ1ZTsgLy8gbm8gZXh0ZW5zaW9uIHNvIHZhbGlkCi0JCXJldHVybiB2YWxpZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBwYXRoCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHdoaWNoIHByb2plY3QgaXMgbmVlZGVkCi0JICogQHJldHVybiBJUHJvamVjdCBvYmplY3QuIElmIHBhdGggaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlIHJldHVybgotCSAqICAgICAgICAgdmFsdWUgaXMgYWxzbyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3RGcm9tUGF0aChJUGF0aCBwYXRoKSB7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlpZiAod29ya3NwYWNlLnZhbGlkYXRlUGF0aChwYXRoLnRvU3RyaW5nKCksIElSZXNvdXJjZS5QUk9KRUNUKS5pc09LKCkpIHsKLQkJCQlwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KHBhdGgudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpLmdldFByb2plY3QoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIHByb2plY3QgaXMgYSB3ZWIgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgcHJvamVjdCB0byBiZSBjaGVja2VkCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9qZWN0IGlzIHdlYiBwcm9qZWN0LCBvdGhlcndpc2UgZmFsc2UKLQkgKi8KLQlib29sZWFuIGlzRHluYW1pY1dlYlByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlib29sZWFuIGlzID0gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpOwotCQlyZXR1cm4gaXM7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBpcyBhIHR5cGUgb2YgamF2YSBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBwcm9qZWN0IHRvIGJlIGNoZWNrZWQgKGNhbm5vdCBiZSBudWxsKQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvamVjdCBpcyBhIHR5cGUgb2YgamF2YSBwcm9qZWN0LCBvdGhlcndpc2UgZmFsc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNKYXZhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWJvb2xlYW4gaXNKYXZhID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpc0phdmEgPSBwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCi0JCXJldHVybiBpc0phdmE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2ViIGNvbnRlbnRzIGZvbGRlciBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3QKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgdGhlIHByb2plY3Qgd2hpY2ggd2ViIGNvbnRlbnRzIHBhdGggaXMgbmVlZGVkCi0JICogQHJldHVybiBJUGF0aCBvZiB0aGUgd2ViIGNvbnRlbnRzIGZvbGRlcgotCSAqLwotCXByaXZhdGUgSVBhdGggZ2V0V2ViQ29udGVudFBhdGgoSVByb2plY3QgcHJvamVjdCkgewotCQlJUGF0aCBwYXRoID0gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5nZXRXZWJDb250ZW50Um9vdFBhdGgocHJvamVjdCk7Ci0JCXJldHVybiBwYXRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC93aXphcmQvTmV3VGFnVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhY2NjMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Eb2N1bWVudFRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkpTUFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLQotLyoqCi0gKiBUZW1wbGF0ZXMgcGFnZSBpbiBuZXcgZmlsZSB3aXphcmQuIEFsbG93cyB1c2VycyB0byBzZWxlY3QgYSBuZXcgZmlsZQotICogdGVtcGxhdGUgdG8gYmUgYXBwbGllZCBpbiBuZXcgZmlsZS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTmV3VGFnVGVtcGxhdGVzV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogQ29udGVudCBwcm92aWRlciBmb3IgdGVtcGxhdGVzCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUZW1wbGF0ZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQkJLyoqIFRoZSB0ZW1wbGF0ZSBzdG9yZS4gKi8KLQkJcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZTdG9yZTsKLQotCQkvKgotCQkgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJZlN0b3JlID0gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dCkgewotCQkJcmV0dXJuIGZTdG9yZS5nZXRUZW1wbGF0ZXMoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0pTUC5ORVdfVEFHKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJZlN0b3JlID0gKFRlbXBsYXRlU3RvcmUpIG5ld0lucHV0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGFiZWwgcHJvdmlkZXIgZm9yIHRlbXBsYXRlcy4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRlbXBsYXRlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGludCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBpbnQpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSAoVGVtcGxhdGUpIGVsZW1lbnQ7Ci0KLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQljYXNlIDAgOgotCQkJCQlyZXR1cm4gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJCWNhc2UgMSA6Ci0JCQkJCXJldHVybiB0ZW1wbGF0ZS5nZXREZXNjcmlwdGlvbigpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKiBMYXN0IHNlbGVjdGVkIHRlbXBsYXRlIG5hbWUgKi8KLQlwcml2YXRlIFN0cmluZyBmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lOwotCS8qKiBUaGUgdmlld2VyIGRpc3BsYXlzIHRoZSBwYXR0ZXJuIG9mIHNlbGVjdGVkIHRlbXBsYXRlLiAqLwotCXByaXZhdGUgU291cmNlVmlld2VyIGZQYXR0ZXJuVmlld2VyOwotCS8qKiBUaGUgdGFibGUgcHJlc2VudGluZyB0aGUgdGVtcGxhdGVzLiAqLwotCXByaXZhdGUgVGFibGVWaWV3ZXIgZlRhYmxlVmlld2VyOwotCS8qKiBUZW1wbGF0ZSBzdG9yZSB1c2VkIGJ5IHRoaXMgd2l6YXJkIHBhZ2UgKi8KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlRlbXBsYXRlU3RvcmU7Ci0JLyoqIENoZWNrYm94IGZvciB1c2luZyB0ZW1wbGF0ZXMuICovCi0JcHJpdmF0ZSBCdXR0b24gZlVzZVRlbXBsYXRlQnV0dG9uOwotCi0JcHVibGljIE5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2UoKSB7Ci0JCXN1cGVyKCJOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlIiwgSlNQVUlNZXNzYWdlcy5OZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzAsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKEpTUFVJTWVzc2FnZXMuTmV3VGFnVGVtcGxhdGVzV2l6YXJkUGFnZV8xKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3JyZWN0bHkgcmVzaXplcyB0aGUgdGFibGUgc28gbm8gcGhhbnRvbSBjb2x1bW5zIGFwcGVhcgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBidXR0b25zCi0JICogICAgICAgICAgICB0aGUgYnV0dG9ucwotCSAqIEBwYXJhbSB0YWJsZQotCSAqICAgICAgICAgICAgdGhlIHRhYmxlCi0JICogQHBhcmFtIGNvbHVtbjEKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMgotCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMwotCSAqICAgICAgICAgICAgdGhlIHRoaXJkIGNvbHVtbgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmVUYWJsZVJlc2l6aW5nKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFRhYmxlIHRhYmxlLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yKSB7Ci0JCXBhcmVudC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlSZWN0YW5nbGUgYXJlYSA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJUG9pbnQgcHJlZmVycmVkU2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJaW50IHdpZHRoID0gYXJlYS53aWR0aCAtIDIgKiB0YWJsZS5nZXRCb3JkZXJXaWR0aCgpOwotCQkJCWlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCkgewotCQkJCQkvLyBTdWJ0cmFjdCB0aGUgc2Nyb2xsYmFyIHdpZHRoIGZyb20gdGhlIHRvdGFsIGNvbHVtbgotCQkJCQkvLyB3aWR0aAotCQkJCQkvLyBpZiBhIHZlcnRpY2FsIHNjcm9sbGJhciB3aWxsIGJlIHJlcXVpcmVkCi0JCQkJCVBvaW50IHZCYXJTaXplID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCk7Ci0JCQkJCXdpZHRoIC09IHZCYXJTaXplLng7Ci0JCQkJfQotCi0JCQkJUG9pbnQgb2xkU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCQlpZiAob2xkU2l6ZS54ID4gd2lkdGgpIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBzbWFsbGVyIHNvIG1ha2UgdGhlIGNvbHVtbnMKLQkJCQkJLy8gc21hbGxlciBmaXJzdCBhbmQgdGhlbiByZXNpemUgdGhlIHRhYmxlIHRvCi0JCQkJCS8vIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJdGFibGUuc2V0U2l6ZSh3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBiaWdnZXIgc28gbWFrZSB0aGUgdGFibGUKLQkJCQkJLy8gYmlnZ2VyIGZpcnN0IGFuZCB0aGVuIG1ha2UgdGhlIGNvbHVtbnMgd2lkZXIKLQkJCQkJLy8gdG8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCXRhYmxlLnNldFNpemUod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShhbmNlc3RvciwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIGNyZWF0ZSBjaGVja2JveCBmb3IgdXNlciB0byB1c2UgSlNQIFRlbXBsYXRlCi0JCWZVc2VUZW1wbGF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0VGV4dChKU1BVSU1lc3NhZ2VzLk5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfNCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZW5hYmxlVGVtcGxhdGVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSBjb21wb3NpdGUgZm9yIFRlbXBsYXRlcyB0YWJsZQotCQlDb21wb3NpdGUgaW5uZXJQYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGlubmVyTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJaW5uZXJMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWlubmVyTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWlubmVyTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJaW5uZXJQYXJlbnQuc2V0TGF5b3V0KGlubmVyTGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKTsKLQkJaW5uZXJQYXJlbnQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJLy8gQ3JlYXRlIGxpbmtlZCB0ZXh0IHRvIGp1c3QgdG8gdGVtcGxhdGVzIHByZWZlcmVuY2UgcGFnZQotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhpbm5lclBhcmVudCwgU1dULk5PTkUpOwotCQlsaW5rLnNldFRleHQoSlNQVUlNZXNzYWdlcy5OZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzYpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlsaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbGlua0NsaWNrZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIHRhYmxlIHRoYXQgZGlzcGxheXMgdGVtcGxhdGVzCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKGlubmVyUGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDIpOwotCQlkYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDEwKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotCQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbjEuc2V0VGV4dChKU1BVSU1lc3NhZ2VzLk5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2VfMik7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4yLnNldFRleHQoSlNQVUlNZXNzYWdlcy5OZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzMpOwotCi0JCWZUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUZW1wbGF0ZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRlbXBsYXRlQ29udGVudFByb3ZpZGVyKCkpOwotCi0JCWZUYWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIpIHsKLQkJCQlpZiAoKG9iamVjdDEgaW5zdGFuY2VvZiBUZW1wbGF0ZSkgJiYgKG9iamVjdDIgaW5zdGFuY2VvZiBUZW1wbGF0ZSkpIHsKLQkJCQkJVGVtcGxhdGUgbGVmdCA9IChUZW1wbGF0ZSkgb2JqZWN0MTsKLQkJCQkJVGVtcGxhdGUgcmlnaHQgPSAoVGVtcGxhdGUpIG9iamVjdDI7Ci0JCQkJCWludCByZXN1bHQgPSBsZWZ0LmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJpZ2h0LmdldE5hbWUoKSk7Ci0JCQkJCWlmIChyZXN1bHQgIT0gMCkKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCXJldHVybiBsZWZ0LmdldERlc2NyaXB0aW9uKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBvYmplY3QxLCBvYmplY3QyKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNTb3J0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0pOwotCi0JCWZUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJdXBkYXRlVmlld2VySW5wdXQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIHZpZXdlciB0aGF0IGRpc3BsYXlzIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZSdzIGNvbnRlbnRzCi0JCWZQYXR0ZXJuVmlld2VyID0gZG9DcmVhdGVWaWV3ZXIocGFyZW50KTsKLQotCQlmVGVtcGxhdGVTdG9yZSA9IEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWZUYWJsZVZpZXdlci5zZXRJbnB1dChmVGVtcGxhdGVTdG9yZSk7Ci0KLQkJY29uZmlndXJlVGFibGVSZXNpemluZyhpbm5lclBhcmVudCwgdGFibGUsIGNvbHVtbjEsIGNvbHVtbjIpOwotCQlsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSUhlbHBDb250ZXh0SWRzLkpTUF9ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlzZXRDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcywgY29uZmlndXJlcyBhbmQgcmV0dXJucyBhIHNvdXJjZSB2aWV3ZXIgdG8gcHJlc2VudCB0aGUgdGVtcGxhdGUKLQkgKiBwYXR0ZXJuIG9uIHRoZSBwcmVmZXJlbmNlIHBhZ2UuIENsaWVudHMgbWF5IG92ZXJyaWRlIHRvIHByb3ZpZGUgYQotCSAqIGN1c3RvbSBzb3VyY2Ugdmlld2VyIGZlYXR1cmluZyBlLmcuIHN5bnRheCBjb2xvcmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgY29uZmlndXJlZCBzb3VyY2Ugdmlld2VyCi0JICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1AoKTsKLQotCQkJcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQkJfQotCQl9OwotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIpLmdldFRleHRXaWRnZXQoKS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnQoIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWRNb2RlbCBzY3JhdGNoTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQVEFHKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gc2NyYXRjaE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQl2aWV3ZXIuY29uZmlndXJlKHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24pOwotCQl2aWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCXByaXZhdGUgU291cmNlVmlld2VyIGRvQ3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoSlNQVUlNZXNzYWdlcy5OZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlXzUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBjcmVhdGVWaWV3ZXIocGFyZW50KTsKLQkJdmlld2VyLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotCQlDb250cm9sIGNvbnRyb2wgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQljb250cm9sLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUvZGlzYWJsZSBjb250cm9scyBpbiBwYWdlIGJhc2VkIG9uIGZVc2VUZW1wbGF0ZUJ1dHRvbidzIGN1cnJlbnQKLQkgKiBzdGF0ZS4KLQkgKi8KLQl2b2lkIGVuYWJsZVRlbXBsYXRlcygpIHsKLQkJYm9vbGVhbiBlbmFibGVkID0gZlVzZVRlbXBsYXRlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCi0JCWlmICghZW5hYmxlZCkgewotCQkJLy8gc2F2ZSBsYXN0IHNlbGVjdGVkIHRlbXBsYXRlCi0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJCWlmICh0ZW1wbGF0ZSAhPSBudWxsKQotCQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCQllbHNlCi0JCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCWZUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obnVsbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRTZWxlY3RlZFRlbXBsYXRlKGZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUpOwotCQl9Ci0KLQkJZlRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmUGF0dGVyblZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRlbXBsYXRlIHByZWZlcmVuY2UgcGFnZSBpZAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlkKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuanNwLnRlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZSBnZXRTZWxlY3RlZFRlbXBsYXRlKCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCXRlbXBsYXRlID0gKFRlbXBsYXRlKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHRlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGVtcGxhdGUgc3RyaW5nIHRvIGluc2VydC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0byBpbnNlcnQgb3IgbnVsbCBpZiBub25lIGlzIHRvIGJlIGluc2VydGVkCi0JICovCi0JU3RyaW5nIGdldFRlbXBsYXRlU3RyaW5nKCkgewotCQlTdHJpbmcgdGVtcGxhdGVTdHJpbmcgPSBudWxsOwotCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJVGVtcGxhdGVDb250ZXh0VHlwZSBjb250ZXh0VHlwZSA9IEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpLmdldENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuTkVXKTsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpOwotCQkJVGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBuZXcgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCAwLCAwKTsKLQkJCXRyeSB7Ci0JCQkJVGVtcGxhdGVCdWZmZXIgYnVmZmVyID0gY29udGV4dC5ldmFsdWF0ZSh0ZW1wbGF0ZSk7Ci0JCQkJdGVtcGxhdGVTdHJpbmcgPSBidWZmZXIuZ2V0U3RyaW5nKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wbGF0ZSBmb3IgbmV3IGpzcCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdGVtcGxhdGVTdHJpbmc7Ci0JfQotCi0Jdm9pZCBsaW5rQ2xpY2tlZCgpIHsKLQkJU3RyaW5nIHBhZ2VJZCA9IGdldFByZWZlcmVuY2VQYWdlSWQoKTsKLQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIHBhZ2VJZCwgbmV3IFN0cmluZ1tde3BhZ2VJZH0sIG51bGwpOwotCQlkaWFsb2cub3BlbigpOwotCQlmVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIGxhc3QgdGVtcGxhdGUgbmFtZSB1c2VkIGluIE5ldyBKU1AgRmlsZSB3aXphcmQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRMYXN0U2F2ZWRQcmVmZXJlbmNlcygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9IEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoSlNQVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSk7Ci0JCWlmICh0ZW1wbGF0ZU5hbWUgPT0gbnVsbCB8fCB0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZU5hbWU7Ci0JCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JCWVuYWJsZVRlbXBsYXRlcygpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGVtcGxhdGUgbmFtZSB1c2VkIGZvciBuZXh0IGNhbGwgdG8gTmV3IEpTUCBGaWxlIHdpemFyZC4KLQkgKi8KLQl2b2lkIHNhdmVMYXN0U2F2ZWRQcmVmZXJlbmNlcygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQl0ZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSlNQVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSwgdGVtcGxhdGVOYW1lKTsKLQkJSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdCBhIHRlbXBsYXRlIGluIHRoZSB0YWJsZSB2aWV3ZXIgZ2l2ZW4gdGhlIHRlbXBsYXRlIG5hbWUuIElmCi0JICogdGVtcGxhdGUgbmFtZSBjYW5ub3QgYmUgZm91bmQgb3IgdGVtcGxhdGVOYW1lIGlzIG51bGwsIGp1c3Qgc2VsZWN0Ci0JICogZmlyc3QgaXRlbSBpbiB0YWJsZS4gSWYgbm8gaXRlbXMgaW4gdGFibGUgc2VsZWN0IG5vdGhpbmcuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlTmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZFRlbXBsYXRlKFN0cmluZyB0ZW1wbGF0ZU5hbWUpIHsKLQkJT2JqZWN0IHRlbXBsYXRlID0gbnVsbDsKLQotCQlpZiAodGVtcGxhdGVOYW1lICE9IG51bGwgJiYgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJLy8gcGljayB0aGUgbGFzdCB1c2VkIHRlbXBsYXRlCi0JCQl0ZW1wbGF0ZSA9IGZUZW1wbGF0ZVN0b3JlLmZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuTkVXKTsKLQkJfQotCi0JCS8vIG5vIHJlY29yZCBvZiBsYXN0IHVzZWQgdGVtcGxhdGUgc28ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJaWYgKHRlbXBsYXRlID09IG51bGwpIHsKLQkJCS8vIGp1c3QgcGljayBmaXJzdCBlbGVtZW50Ci0JCQl0ZW1wbGF0ZSA9IGZUYWJsZVZpZXdlci5nZXRFbGVtZW50QXQoMCk7Ci0JCX0KLQotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGVtcGxhdGUpOwotCQkJZlRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgcGF0dGVybiB2aWV3ZXIuCi0JICovCi0Jdm9pZCB1cGRhdGVWaWV3ZXJJbnB1dCgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1RhZ1dpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdUYWdXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgyNzE0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1RhZ1dpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBOZXdUYWdXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQlwcml2YXRlIE5ld1RhZ0ZpbGVXaXphcmRQYWdlIGZOZXdGaWxlUGFnZTsKLQlwcml2YXRlIE5ld1RhZ1RlbXBsYXRlc1dpemFyZFBhZ2UgZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlOwotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZlNlbGVjdGlvbjsKLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlmTmV3RmlsZVBhZ2UgPSBuZXcgTmV3VGFnRmlsZVdpemFyZFBhZ2UoIlRhZ1dpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UiLCBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihJREUuY29tcHV0ZVNlbGVjdGVkUmVzb3VyY2VzKGZTZWxlY3Rpb24pKSk7IC8vJE5PTi1OTFMtMSQgCi0JCWZOZXdGaWxlUGFnZS5zZXRUaXRsZShKU1BVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfVEFHX05FV19IRUFESU5HKTsKLQkJZk5ld0ZpbGVQYWdlLnNldERlc2NyaXB0aW9uKEpTUFVJTWVzc2FnZXMuX1VJX1dJWkFSRF9UQUdfTkVXX0RFU0NSSVBUSU9OKTsKLQkJYWRkUGFnZShmTmV3RmlsZVBhZ2UpOwotCi0JCWZOZXdGaWxlVGVtcGxhdGVzUGFnZSA9IG5ldyBOZXdUYWdUZW1wbGF0ZXNXaXphcmRQYWdlKCk7Ci0JCWFkZFBhZ2UoZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBhcHBseUxpbmVEZWxpbWl0ZXIoSUZpbGUgZmlsZSwgU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRTdHJpbmcoUGxhdGZvcm0uUElfUlVOVElNRSwgUGxhdGZvcm0uUFJFRl9MSU5FX1NFUEFSQVRPUiwgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpLCBuZXcgSVNjb3BlQ29udGV4dFtdIHtuZXcgUHJvamVjdFNjb3BlKGZpbGUuZ2V0UHJvamVjdCgpKSwgbmV3IEluc3RhbmNlU2NvcGUoKSB9KTsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBjb252ZXJ0ZWRUZXh0ID0gU3RyaW5nVXRpbHMucmVwbGFjZSh0ZXh0LCAiXHJcbiIsICJcbiIpOwotCQljb252ZXJ0ZWRUZXh0ID0gU3RyaW5nVXRpbHMucmVwbGFjZShjb252ZXJ0ZWRUZXh0LCAiXHIiLCAiXG4iKTsKLQkJY29udmVydGVkVGV4dCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UoY29udmVydGVkVGV4dCwgIlxuIiwgbGluZURlbGltaXRlcik7Ci0JCXJldHVybiBjb252ZXJ0ZWRUZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JCWZTZWxlY3Rpb24gPSBhU2VsZWN0aW9uOwotCQlzZXRXaW5kb3dUaXRsZShKU1BVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfVEFHX05FV19USVRMRSk7Ci0KLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBKU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9XSVpCQU5fTkVXVEFHRklMRSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuRWRpdG9yKGZpbmFsIElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlLCB0cnVlKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlib29sZWFuIHBlcmZvcm1lZE9LID0gZmFsc2U7Ci0KLQkJLy8gc2F2ZSB1c2VyIG9wdGlvbnMgZm9yIG5leHQgdXNlCi0JCWZOZXdGaWxlVGVtcGxhdGVzUGFnZS5zYXZlTGFzdFNhdmVkUHJlZmVyZW5jZXMoKTsKLQotCQkvLyBubyBmaWxlIGV4dGVuc2lvbiBzcGVjaWZpZWQgc28gYWRkIGRlZmF1bHQgZXh0ZW5zaW9uCi0JCVN0cmluZyBmaWxlTmFtZSA9IGZOZXdGaWxlUGFnZS5nZXRGaWxlTmFtZSgpOwotCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSA9PSAtMSkgewotCQkJU3RyaW5nIG5ld0ZpbGVOYW1lID0gZk5ld0ZpbGVQYWdlLmFkZERlZmF1bHRFeHRlbnNpb24oZmlsZU5hbWUpOwotCQkJZk5ld0ZpbGVQYWdlLnNldEZpbGVOYW1lKG5ld0ZpbGVOYW1lKTsKLQkJfQotCi0JCS8vIGNyZWF0ZSBhIG5ldyBlbXB0eSBmaWxlCi0JCUlGaWxlIGZpbGUgPSBmTmV3RmlsZVBhZ2UuY3JlYXRlTmV3RmlsZSgpOwotCi0JCS8vIGlmIHRoZXJlIHdhcyBwcm9ibGVtIHdpdGggY3JlYXRpbmcgZmlsZSwgaXQgd2lsbCBiZSBudWxsLCBzbyBtYWtlCi0JCS8vIHN1cmUgdG8gY2hlY2sKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJLy8gcHV0IHRlbXBsYXRlIGNvbnRlbnRzIGludG8gZmlsZQotCQkJU3RyaW5nIHRlbXBsYXRlU3RyaW5nID0gZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlLmdldFRlbXBsYXRlU3RyaW5nKCk7Ci0JCQlpZiAodGVtcGxhdGVTdHJpbmcgIT0gbnVsbCkgewotCQkJCXRlbXBsYXRlU3RyaW5nID0gYXBwbHlMaW5lRGVsaW1pdGVyKGZpbGUsIHRlbXBsYXRlU3RyaW5nKTsKLQkJCQkvLyBkZXRlcm1pbmUgdGhlIGVuY29kaW5nIGZvciB0aGUgbmV3IGZpbGUKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCQlTdHJpbmcgY2hhclNldCA9IHByZWZlcmVuY2UuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQotCQkJCXRyeSB7Ci0JCQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRwdXRTdHJlYW1Xcml0ZXIgPSBudWxsOwotCQkJCQlpZiAoY2hhclNldCA9PSBudWxsIHx8IGNoYXJTZXQudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8ganVzdCB1c2UgZGVmYXVsdCBlbmNvZGluZwotCQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0pOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0sIGNoYXJTZXQpOwotCQkJCQl9Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci53cml0ZSh0ZW1wbGF0ZVN0cmluZyk7Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci5mbHVzaCgpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKLQkJCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkpOwotCQkJCQlmaWxlLnNldENvbnRlbnRzKGlucHV0U3RyZWFtLCB0cnVlLCBmYWxzZSwgbnVsbCk7Ci0JCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IGNyZWF0ZSBjb250ZW50cyBmb3IgbmV3IFRhZyBmaWxlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG9wZW4gdGhlIGZpbGUgaW4gZWRpdG9yCi0JCQlvcGVuRWRpdG9yKGZpbGUpOwotCi0JCQkvLyBldmVyeXRoaW5nJ3MgZmluZQotCQkJcGVyZm9ybWVkT0sgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBwZXJmb3JtZWRPSzsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvdmlld3MvY29udGVudG91dGxpbmUvSlNQQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvdmlld3MvY29udGVudG91dGxpbmUvSlNQQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YTE1NzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pTUENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudmlld3MuY29udGVudG91dGxpbmUuSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBvdXRsaW5lIHZpZXcgcGFnZSB3aGljaCBzaG93cyBKU1AgY29udGVudC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSlNQQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIGV4dGVuZHMgSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiB7Ci0KLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVE9ETzogQXV0b21hdGUgdGhlIGxvYWRpbmcgb2YgYSByZWFsIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gdGhlIG1vZGVsCi0JLy8gdHlwZSBhdAotCS8vIGNyZWF0aW9uIHRpbWU7IGNsZWFyIG9uIHVuQ29uZmlndXJlIHNvIHRoYXQgYSBuZXcgZW1iZWRkZWQKLQkvLyBjb25maWd1cmF0aW9uIGNhbgotCS8vIGJlIHVzZWQKLQkvLyBwcml2YXRlIFN0cnVjdHVyZWRDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gZkVtYmVkZGVkQ29uZmlndXJhdGlvbiA9Ci0JLy8gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgSlNQQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIEpTUENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbigpIHsKLQkJLy8gTXVzdCBoYXZlIGVtcHR5IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24KLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS90ZW1wbGF0ZXMvanNwZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS90ZW1wbGF0ZXMvanNwZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0NmY4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvdGVtcGxhdGVzL2pzcGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1UZW1wbGF0ZXMuanNwc2NyaXB0bGV0Lm5hbWU9SlNQIHNjcmlwdGxldAotVGVtcGxhdGVzLmpzcHNjcmlwdGxldC5kZXNjPUpTUCBzY3JpcHRsZXQgPCUuLiU+Ci1UZW1wbGF0ZXMuanNwc2NyaXB0bGV0LmNvbnRlbnQ9PCUgJHtjdXJzb3J9ICU+Ci1UZW1wbGF0ZXMuanNwaGlkZGVuY29tbWVudC5uYW1lPUpTUCBoaWRkZW4gY29tbWVudAotVGVtcGxhdGVzLmpzcGhpZGRlbmNvbW1lbnQuZGVzYz1KU1AgaGlkZGVuIGNvbW1lbnQgPCUtLSAtLSU+Ci1UZW1wbGF0ZXMuanNwaGlkZGVuY29tbWVudC5jb250ZW50PTwlLS0gJHtjdXJzb3J9IC0tJT4KLVRlbXBsYXRlcy5qc3BkZWNsYXJhdGlvbi5uYW1lPUpTUCBkZWNsYXJhdGlvbihzKQotVGVtcGxhdGVzLmpzcGRlY2xhcmF0aW9uLmRlc2M9SlNQIGRlY2xhcmF0aW9uKHMpIDwlIS4uJT4KLVRlbXBsYXRlcy5qc3BkZWNsYXJhdGlvbi5jb250ZW50PTwlISAke2N1cnNvcn0gJT4KLVRlbXBsYXRlcy5qc3BleHByZXNzaW9uLm5hbWU9SlNQIGV4cHJlc3Npb24KLVRlbXBsYXRlcy5qc3BleHByZXNzaW9uLmRlc2M9SlNQIGV4cHJlc3Npb24gPCU9Li4lPgotVGVtcGxhdGVzLmpzcGV4cHJlc3Npb24uY29udGVudD08JT0gJHtjdXJzb3J9ICU+Ci1UZW1wbGF0ZXMuanNwaW5jbHVkZWRpcmVjdGl2ZS5uYW1lPUpTUCBpbmNsdWRlIGRpcmVjdGl2ZQotVGVtcGxhdGVzLmpzcGluY2x1ZGVkaXJlY3RpdmUuZGVzYz1KU1AgaW5jbHVkZSBkaXJlY3RpdmUKLVRlbXBsYXRlcy5qc3BpbmNsdWRlZGlyZWN0aXZlLmNvbnRlbnQ9PCVAIGluY2x1ZGUgZmlsZT0iJHtjdXJzb3J9IiAlPgotVGVtcGxhdGVzLmpzcHBhZ2VkaXJlY3RpdmUubmFtZT1KU1AgcGFnZSBkaXJlY3RpdmUKLVRlbXBsYXRlcy5qc3BwYWdlZGlyZWN0aXZlLmRlc2M9SlNQIHBhZ2UgZGlyZWN0aXZlCi1UZW1wbGF0ZXMuanNwcGFnZWRpcmVjdGl2ZS5jb250ZW50PTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iICU+Ci1UZW1wbGF0ZXMuanNwdGFnbGliZGlyZWN0aXZlLm5hbWU9SlNQIHRhZ2xpYiBkaXJlY3RpdmUKLVRlbXBsYXRlcy5qc3B0YWdsaWJkaXJlY3RpdmUuZGVzYz1KU1AgdGFnbGliIGRpcmVjdGl2ZQotVGVtcGxhdGVzLmpzcHRhZ2xpYmRpcmVjdGl2ZS5jb250ZW50PTwlQCB0YWdsaWIgdXJpPSIke2N1cnNvcn0iIHByZWZpeD0iIiAlPgotVGVtcGxhdGVzLmpzcGh0bWwubmFtZT1OZXcgSlNQIEZpbGUgKGh0bWwpCi1UZW1wbGF0ZXMuanNwaHRtbC5kZXNjPUpTUCB3aXRoIGh0bWwgbWFya3VwCi1UZW1wbGF0ZXMuanNwaHRtbC5jb250ZW50PTwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PSR7ZW5jb2Rpbmd9IlxuICAgIHBhZ2VFbmNvZGluZz0iJHtlbmNvZGluZ30iJT5cbjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPlxuPGh0bWw+XG48aGVhZD5cbjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSR7ZW5jb2Rpbmd9Ij5cbjx0aXRsZT5JbnNlcnQgdGl0bGUgaGVyZTwvdGl0bGU+XG48L2hlYWQ+XG48Ym9keT5cbiR7Y3Vyc29yfVxuPC9ib2R5PlxuPC9odG1sPgotVGVtcGxhdGVzLmpzcHhodG1sLm5hbWU9TmV3IEpTUCBGaWxlICh4aHRtbCkKLVRlbXBsYXRlcy5qc3B4aHRtbC5kZXNjPUpTUCB3aXRoIHhodG1sIG1hcmt1cAotVGVtcGxhdGVzLmpzcHhodG1sLmNvbnRlbnQ9PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iJHtlbmNvZGluZ30iID8+XG48JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD0ke2VuY29kaW5nfSJcbiAgICBwYWdlRW5jb2Rpbmc9IiR7ZW5jb2Rpbmd9IiU+XG48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+XG48aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+XG48aGVhZD5cbjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSR7ZW5jb2Rpbmd9IiAvPlxuPHRpdGxlPkluc2VydCB0aXRsZSBoZXJlPC90aXRsZT5cbjwvaGVhZD5cbjxib2R5PlxuJHtjdXJzb3J9XG48L2JvZHk+XG48L2h0bWw+Ci1UZW1wbGF0ZXMuanNweGh0bWx4bWwubmFtZT1OZXcgSlNQIEZpbGUgKHhodG1sLCB4bWwgc3ludGF4KQotVGVtcGxhdGVzLmpzcHhodG1seG1sLmRlc2M9SlNQIHdpdGggeGh0bWwgbWFya3VwIGFuZCB4bWwgc3R5bGUgc3ludGF4Ci1UZW1wbGF0ZXMuanNweGh0bWx4bWwuY29udGVudD08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSIke2VuY29kaW5nfSIgPz5cbjxqc3A6cm9vdCB4bWxuczpqc3A9Imh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UiIHZlcnNpb249IjIuMCI+XG4gICAgPGpzcDpkaXJlY3RpdmUucGFnZSBsYW5ndWFnZT0iamF2YSJcbiAgICAgICAgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD0ke2VuY29kaW5nfSIgcGFnZUVuY29kaW5nPSIke2VuY29kaW5nfSIgLz5cbiAgICA8anNwOnRleHQ+XG4gICAgICAgIDwhW0NEQVRBWyA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSIke2VuY29kaW5nfSIgPz4gXV0+XG4gICAgPC9qc3A6dGV4dD5cbiAgICA8anNwOnRleHQ+XG4gICAgICAgIDwhW0NEQVRBWyA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+IF1dPlxuICAgIDwvanNwOnRleHQ+XG48aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+XG48aGVhZD5cbjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSR7ZW5jb2Rpbmd9IiAvPlxuPHRpdGxlPkluc2VydCB0aXRsZSBoZXJlPC90aXRsZT5cbjwvaGVhZD5cbjxib2R5PlxuJHtjdXJzb3J9XG48L2JvZHk+XG48L2h0bWw+XG48L2pzcDpyb290PgotCi1UZW1wbGF0ZXMuanNwdGFnZGlyZWN0aXZlLm5hbWU9VGFnIGZpbGUgdGFnIGRpcmVjdGl2ZQotVGVtcGxhdGVzLmpzcHRhZ2RpcmVjdGl2ZS5kZXNjPVRhZyBmaWxlIHRhZyBkaXJlY3RpdmUKLVRlbXBsYXRlcy5qc3B0YWdkaXJlY3RpdmUuY29udGVudD08JUAgdGFnIGRpc3BsYXktbmFtZT0iJHtjdXJzb3J9IiBkZXNjcmlwdGlvbj0iIiBzbWFsbC1pY29uPSIiICU+Ci0KLVRlbXBsYXRlcy5qc3B2YXJpYWJsZWRpcmVjdGl2ZS5uYW1lPVRhZyB2YXJpYWJsZSBkaXJlY3RpdmUKLVRlbXBsYXRlcy5qc3B2YXJpYWJsZWRpcmVjdGl2ZS5kZXNjPVRhZyB2YXJpYWJsZSBkaXJlY3RpdmUKLVRlbXBsYXRlcy5qc3B2YXJpYWJsZWRpcmVjdGl2ZS5jb250ZW50PTwlQCB2YXJpYWJsZSB2YXJpYWJsZS1jbGFzcz0iJHtjdXJzb3J9IiBkZXNjcmlwdGlvbj0iIiAlPgotCi1UZW1wbGF0ZXMuanNwYXR0cmlidXRlZGlyZWN0aXZlLm5hbWU9VGFnIGF0dHJpYnV0ZSBkaXJlY3RpdmUKLVRlbXBsYXRlcy5qc3BhdHRyaWJ1dGVkaXJlY3RpdmUuZGVzYz1UYWcgYXR0cmlidXRlIGRpcmVjdGl2ZQotVGVtcGxhdGVzLmpzcGF0dHJpYnV0ZWRpcmVjdGl2ZS5jb250ZW50PTwlQCBhdHRyaWJ1dGUgbmFtZT0iJHtjdXJzb3J9IiBkZXNjcmlwdGlvbj0iIiByZXF1aXJlZD0iZmFsc2UiIHR5cGU9IiIgJT4KLQotVGVtcGxhdGVzLnNpbXBsZXRhZy5uYW1lPU5ldyBUYWcgRmlsZQotVGVtcGxhdGVzLnNpbXBsZXRhZy5kZXNjPU5ldyBKU1AgVGFnIEZpbGUKLVRlbXBsYXRlcy5zaW1wbGV0YWcuY29udGVudD08JUAgdGFnIGxhbmd1YWdlPSJqYXZhIiBwYWdlRW5jb2Rpbmc9IiR7ZW5jb2Rpbmd9IiU+XG4KLQotVGVtcGxhdGVzLnNpbXBsZXRhZ3gubmFtZT1OZXcgVGFnWCBGaWxlCi1UZW1wbGF0ZXMuc2ltcGxldGFneC5kZXNjPU5ldyBKU1AgVGFnWCBGaWxlCi1UZW1wbGF0ZXMuc2ltcGxldGFneC5jb250ZW50PTxqc3A6ZGlyZWN0aXZlLnRhZyBsYW5ndWFnZT0iamF2YSIgcGFnZUVuY29kaW5nPSIke2VuY29kaW5nfSI+XG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS90ZW1wbGF0ZXMvanNwZGVmYXVsdC10ZW1wbGF0ZXMueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3RlbXBsYXRlcy9qc3BkZWZhdWx0LXRlbXBsYXRlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMThkMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3RlbXBsYXRlcy9qc3BkZWZhdWx0LXRlbXBsYXRlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC0tPgotPHRlbXBsYXRlcz4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNwc2NyaXB0bGV0Lm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmpzcHNjcmlwdGxldC5kZXNjIiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMuanNwc2NyaXB0bGV0IiBjb250ZXh0PSJqc3BfdGFnIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcHNjcmlwdGxldC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNwaGlkZGVuY29tbWVudC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5qc3BoaWRkZW5jb21tZW50LmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3BoaWRkZW5jb21tZW50IiBjb250ZXh0PSJqc3BfdGFnIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcGhpZGRlbmNvbW1lbnQuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmpzcGRlY2xhcmF0aW9uLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmpzcGRlY2xhcmF0aW9uLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3BkZWNsYXJhdGlvbiIgY29udGV4dD0ianNwX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5qc3BkZWNsYXJhdGlvbi5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNwZXhwcmVzc2lvbi5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5qc3BleHByZXNzaW9uLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3BleHByZXNzaW9uIiBjb250ZXh0PSJqc3BfYWxsIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcGV4cHJlc3Npb24uY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmpzcGluY2x1ZGVkaXJlY3RpdmUubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuanNwaW5jbHVkZWRpcmVjdGl2ZS5kZXNjIiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMuanNwaW5jbHVkZWRpcmVjdGl2ZSIgY29udGV4dD0ianNwX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5qc3BpbmNsdWRlZGlyZWN0aXZlLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5qc3BwYWdlZGlyZWN0aXZlLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmpzcHBhZ2VkaXJlY3RpdmUuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzLmpzcHBhZ2VkaXJlY3RpdmUiIGNvbnRleHQ9ImpzcF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuanNwcGFnZWRpcmVjdGl2ZS5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNwdGFnbGliZGlyZWN0aXZlLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmpzcHRhZ2xpYmRpcmVjdGl2ZS5kZXNjIiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMuanNwdGFnbGliZGlyZWN0aXZlIiBjb250ZXh0PSJqc3BfdGFnIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcHRhZ2xpYmRpcmVjdGl2ZS5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNwaHRtbC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5qc3BodG1sLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3BodG1sIiBjb250ZXh0PSJqc3BfbmV3IiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcGh0bWwuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmpzcHhodG1sLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmpzcHhodG1sLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3B4aHRtbCIgY29udGV4dD0ianNwX25ldyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5qc3B4aHRtbC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNweGh0bWx4bWwubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuanNweGh0bWx4bWwuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzLmpzcHhodG1seG1sIiBjb250ZXh0PSJqc3BfbmV3IiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcHhodG1seG1sLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5qc3B0YWdkaXJlY3RpdmUubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuanNwdGFnZGlyZWN0aXZlLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3B0YWdkaXJlY3RpdmUiIGNvbnRleHQ9ImpzcF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuanNwdGFnZGlyZWN0aXZlLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5qc3B2YXJpYWJsZWRpcmVjdGl2ZS5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5qc3B2YXJpYWJsZWRpcmVjdGl2ZS5kZXNjIiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMuanNwdmFyaWFibGVkaXJlY3RpdmUiIGNvbnRleHQ9ImpzcF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuanNwdmFyaWFibGVkaXJlY3RpdmUuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmpzcGF0dHJpYnV0ZWRpcmVjdGl2ZS5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5qc3BhdHRyaWJ1dGVkaXJlY3RpdmUuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzLmpzcGF0dHJpYnV0ZWRpcmVjdGl2ZSIgY29udGV4dD0ianNwX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5qc3BhdHRyaWJ1dGVkaXJlY3RpdmUuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLnNpbXBsZXRhZy5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5zaW1wbGV0YWcuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzLnNpbXBsZXRhZyIgY29udGV4dD0idGFnX25ldyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5zaW1wbGV0YWcuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLnNpbXBsZXRhZ3gubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuc2ltcGxldGFneC5kZXNjIiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMuc2ltcGxldGFneCIgY29udGV4dD0idGFnX25ldyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5zaW1wbGV0YWd4LmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08L3RlbXBsYXRlcz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliODgxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBleHBvcnRlZD0idHJ1ZSIga2luZD0ibGliIiBwYXRoPSIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSIiLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiY2U0YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YWUxMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTYXQgQXByIDI4IDAzOjM5OjU2IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRhYzlhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jU2F0IEFwciAyOCAwOToyODozMSBFRFQgMjAwNwotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0xCi1jb21waWxlcnMucC5idWlsZD0xCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLm1pc3NpbmctcGFja2FnZXM9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTEKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTEKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyNmE4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLUNsYXNzUGF0aDogLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjYyYWYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIgLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPHA+SnVuZSwgMjAwODwvcD4KLTxoMz5MaWNlbnNlPC9oMz4KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAgICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAgICgmcXVvdDtFUEwmcXVvdDspLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L2E+LiAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAgIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50ICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAgIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgICBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9hPi48L3A+Ci08aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgb3V0IGJlbG93LiBJZiB5b3UgICBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCAgIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgdG8gdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIGZvciAgIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci08aDQ+QXBwc2VydiBDb21tb25zIHNjaGVtYXMgYW5kIERURHMgdjJfYjMzIChTdWJzZXQpIDwvaDQ+Ci08cD5Zb3VyIHVzZSBvZiB0aGUgQXBwc2VydiBDb21tb25zIHNjaGVtYXMgYW5kIERURHMgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kICBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYxLjAuIEEgIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaXMgY29udGFpbmVkICBpbiB0aGUgZmlsZSA8YSBocmVmPSJhYm91dF9maWxlcy9DRERMdjEuMC50eHQiPkxJQ0VOU0UudHh0PC9hPiBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMdjEuMC5odG1sIj5odHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREx2MS4wLmh0bWw8L2E+LiA8L3A+Ci08cD5UaGUgc291cmNlIGZvciB0aGUgc2NoZW1hcyBhbmQgRFREcyBpcyBhdmFpbGFibGUgb24gdGhlIEdsYXNzZmlzaCBjb21tdW5pdHkgd2Vic2l0ZSBhdCA8YSBocmVmPSJodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL2Rvd25sb2Fkc2luZGV4Lmh0bWwiPmh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC88L2E+LiA8L3A+Ci0KLTxoND5KYXZhIFNlcnZlciBGYWNlcyAxLjIgc2NoZW1hIGFuZCBEVERzIChTdWJzZXQpIDwvaDQ+Ci08cD5Zb3VyIHVzZSBvZiB0aGUgSmF2YSBTZXJ2ZXIgRmFjZXMgc2NoZW1hcyBhbmQgRFREcyBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgdjEuMC4gQSAgY29weSBvZiB0aGUgbGljZW5zZSBpcyBjb250YWluZWQgIGluIHRoZSBmaWxlIDxhIGhyZWY9ImFib3V0X2ZpbGVzL0NEREx2MS4wLnR4dCI+TElDRU5TRS50eHQ8L2E+IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREx2MS4wLmh0bWwiPmh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETHYxLjAuaHRtbDwvYT4uIDwvcD4KLTxwPlRoZSBzb3VyY2UgZm9yIHRoZSBzY2hlbWFzIGFuZCBEVERzIGlzIGF2YWlsYWJsZSBvbiB0aGUgSmF2YSBTZXJ2ZXIgRmFjZXMgcHJvamVjdCBwYWdlIG9uIHRoZSBHbGFzc2Zpc2ggY29tbXVuaXR5IHdlYnNpdGUgYXQgPGEgaHJlZj0iaHR0cHM6Ly9qYXZhc2VydmVyZmFjZXMuZGV2LmphdmEubmV0Ij5odHRwczovL2phdmFzZXJ2ZXJmYWNlcy5kZXYuamF2YS5uZXQvPC9hPi4gPC9wPgotCi08aDQ+SmF2YSBQZXJzaXN0ZW5jZSBBUEkgWE1MIFNjaGVtYXM8L2g0PgotPHA+WW91ciB1c2Ugb2YgdGhlIEphdmEgUGVyc2lzdGVuY2UgQVBJIFhNTCBTY2hlbWFzIChvcm1fMV8wLnhzZCwgcGVyc2lzdGVuY2VfMV8wLnhzZCkgaXMgc3ViamVjdCB0byAgdGhlIHRlcm1zIGFuZCAgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSB2MS4wLiBBICBjb3B5IG9mIHRoZSBsaWNlbnNlIGlzIGNvbnRhaW5lZCAgaW4gdGhlIGZpbGUgPGEgaHJlZj0iYWJvdXRfZmlsZXMvQ0RETHYxLjAudHh0Ij5MSUNFTlNFLnR4dDwvYT4gYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETHYxLjAuaHRtbCI+aHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMdjEuMC5odG1sPC9hPi4gPC9wPgotPHA+VGhlIG9yaWdpbmFsIHNvdXJjZSBmb3IgdGhlIHNjaGVtYXMgaXMgYXZhaWxhYmxlIG9uIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlLyI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UvPC9hPi4gPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dF9maWxlcy9DRERMdjEuMC50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0X2ZpbGVzL0NEREx2MS4wLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1NGUwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0X2ZpbGVzL0NEREx2MS4wLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi1DT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKSBWZXJzaW9uIDEuMAotCi0xLiBEZWZpbml0aW9ucy4KLQotMS4xLiBDb250cmlidXRvciBtZWFucyBlYWNoIGluZGl2aWR1YWwgb3IgZW50aXR5IHRoYXQgY3JlYXRlcyBvciBjb250cmlidXRlcyB0byB0aGUgY3JlYXRpb24gb2YgTW9kaWZpY2F0aW9ucy4KLQotMS4yLiBDb250cmlidXRvciBWZXJzaW9uIG1lYW5zIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIHByaW9yIE1vZGlmaWNhdGlvbnMgdXNlZCBieSBhIENvbnRyaWJ1dG9yIChpZiBhbnkpLCBhbmQgdGhlIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuCi0KLTEuMy4gQ292ZXJlZCBTb2Z0d2FyZSBtZWFucyAoYSkgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoYikgTW9kaWZpY2F0aW9ucywgb3IgKGMpIHRoZSBjb21iaW5hdGlvbiBvZiBmaWxlcyBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIHdpdGggZmlsZXMgY29udGFpbmluZyBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UgaW5jbHVkaW5nIHBvcnRpb25zIHRoZXJlb2YuCi0KLTEuNC4gRXhlY3V0YWJsZSBtZWFucyB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBhbnkgZm9ybSBvdGhlciB0aGFuIFNvdXJjZSBDb2RlLgotCi0xLjUuIEluaXRpYWwgRGV2ZWxvcGVyIG1lYW5zIHRoZSBpbmRpdmlkdWFsIG9yIGVudGl0eSB0aGF0IGZpcnN0IG1ha2VzIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLTEuNi4gTGFyZ2VyIFdvcmsgbWVhbnMgYSB3b3JrIHdoaWNoIGNvbWJpbmVzIENvdmVyZWQgU29mdHdhcmUgb3IgcG9ydGlvbnMgdGhlcmVvZiB3aXRoIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLTEuNy4gTGljZW5zZSBtZWFucyB0aGlzIGRvY3VtZW50LgotCi0xLjguIExpY2Vuc2FibGUgbWVhbnMgaGF2aW5nIHRoZSByaWdodCB0byBncmFudCwgdG8gdGhlIG1heGltdW0gZXh0ZW50IHBvc3NpYmxlLCB3aGV0aGVyIGF0IHRoZSB0aW1lIG9mIHRoZSBpbml0aWFsIGdyYW50IG9yIHN1YnNlcXVlbnRseSBhY3F1aXJlZCwgYW55IGFuZCBhbGwgb2YgdGhlIHJpZ2h0cyBjb252ZXllZCBoZXJlaW4uCi0KLTEuOS4gTW9kaWZpY2F0aW9ucyBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kIEV4ZWN1dGFibGUgZm9ybSBvZiBhbnkgb2YgdGhlIGZvbGxvd2luZzoKLQotQS4gQW55IGZpbGUgdGhhdCByZXN1bHRzIGZyb20gYW4gYWRkaXRpb24gdG8sIGRlbGV0aW9uIGZyb20gb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSBvciBwcmV2aW91cyBNb2RpZmljYXRpb25zOwotCi1CLiBBbnkgbmV3IGZpbGUgdGhhdCBjb250YWlucyBhbnkgcGFydCBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9uOyBvcgotCi1DLiBBbnkgbmV3IGZpbGUgdGhhdCBpcyBjb250cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotMS4xMC4gT3JpZ2luYWwgU29mdHdhcmUgbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZCBFeGVjdXRhYmxlIGZvcm0gb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZSB0aGF0IGlzIG9yaWdpbmFsbHkgcmVsZWFzZWQgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0xLjExLiBQYXRlbnQgQ2xhaW1zIG1lYW5zIGFueSBwYXRlbnQgY2xhaW0ocyksIG5vdyBvd25lZCBvciBoZXJlYWZ0ZXIgYWNxdWlyZWQsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24sIG1ldGhvZCwgcHJvY2VzcywgYW5kIGFwcGFyYXR1cyBjbGFpbXMsIGluIGFueSBwYXRlbnQgTGljZW5zYWJsZSBieSBncmFudG9yLgotCi0xLjEyLiBTb3VyY2UgQ29kZSBtZWFucyAoYSkgdGhlIGNvbW1vbiBmb3JtIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUgaW4gd2hpY2ggbW9kaWZpY2F0aW9ucyBhcmUgbWFkZSBhbmQgKGIpIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCBpbiBvciB3aXRoIHN1Y2ggY29kZS4KLQotMS4xMy4gWW91IChvciBZb3VyKSBtZWFucyBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mIHRoZSB0ZXJtcyBvZiwgdGhpcyBMaWNlbnNlLiBGb3IgbGVnYWwgZW50aXRpZXMsIFlvdSBpbmNsdWRlcyBhbnkgZW50aXR5IHdoaWNoIGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcyB1bmRlciBjb21tb24gY29udHJvbCB3aXRoIFlvdS4gRm9yIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgY29udHJvbCBtZWFucyAoYSnhdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKeFvd25lcnNoaXAgb2YgbW9yZSB0aGFuIGZpZnR5IHBlcmNlbnQgKDUwJSkgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcyBvciBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotMi4gTGljZW5zZSBHcmFudHMuCi0KLTIuMS4gVGhlIEluaXRpYWwgRGV2ZWxvcGVyIEdyYW50LgotQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUgbGljZW5zZToKLShhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgSW5pdGlhbCBEZXZlbG9wZXIsIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgd2l0aCBvciB3aXRob3V0IE1vZGlmaWNhdGlvbnMsIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAotKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nIG9yIHNlbGxpbmcgb2YgT3JpZ2luYWwgU29mdHdhcmUsIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBwcmFjdGljZSwgc2VsbCwgYW5kIG9mZmVyIGZvciBzYWxlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvciBwb3J0aW9ucyB0aGVyZW9mKS4KLShjKSBUaGUgbGljZW5zZXMgZ3JhbnRlZCBpbiBTZWN0aW9uc+EyLjEoYSkgYW5kIChiKSBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIEluaXRpYWwgRGV2ZWxvcGVyIGZpcnN0IGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUgT3JpZ2luYWwgU29mdHdhcmUgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLShkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbuEyLjEoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKeFmb3IgY29kZSB0aGF0IFlvdSBkZWxldGUgZnJvbSB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yICgyKeFmb3IgaW5mcmluZ2VtZW50cyBjYXVzZWQgYnk6IChpKeF0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKGlpKeF0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgZGV2aWNlcy4KLQotMi4yLiBDb250cmlidXRvciBHcmFudC4KLUNvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgotKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBDb250cmlidXRvciB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBNb2RpZmljYXRpb25zIGNyZWF0ZWQgYnkgc3VjaCBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZiksIGVpdGhlciBvbiBhbiB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIG90aGVyIE1vZGlmaWNhdGlvbnMsIGFzIENvdmVyZWQgU29mdHdhcmUgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCi0oYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcsIG9yIHNlbGxpbmcgb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgZWl0aGVyIGFsb25lIGFuZC9vciBpbiBjb21iaW5hdGlvbiB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyBvZiBzdWNoIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaGF2ZSBtYWRlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2Y6ICgxKeFNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZik7IGFuZCAoMinhdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLgotKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25z4TIuMihhKSBhbmQgMi4yKGIpIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgQ29udHJpYnV0b3IgZmlyc3QgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBNb2RpZmljYXRpb25zIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5LgotKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9u4TIuMihiKSBhYm92ZSwgbm8gcGF0ZW50IGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEp4WZvciBhbnkgY29kZSB0aGF0IENvbnRyaWJ1dG9yIGhhcyBkZWxldGVkIGZyb20gdGhlIENvbnRyaWJ1dG9yIFZlcnNpb247ICgyKeFmb3IgaW5mcmluZ2VtZW50cyBjYXVzZWQgYnk6IChpKeF0aGlyZCBwYXJ0eSBtb2RpZmljYXRpb25zIG9mIENvbnRyaWJ1dG9yIFZlcnNpb24sIG9yIChpaSnhdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggb3RoZXIgc29mdHdhcmUgKGV4Y2VwdCBhcyBwYXJ0IG9mIHRoZSBDb250cmlidXRvciBWZXJzaW9uKSBvciBvdGhlciBkZXZpY2VzOyBvciAoMynhdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgQ292ZXJlZCBTb2Z0d2FyZSBpbiB0aGUgYWJzZW5jZSBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvci4KLQotMy4gRGlzdHJpYnV0aW9uIE9ibGlnYXRpb25zLgotCi0zLjEuIEF2YWlsYWJpbGl0eSBvZiBTb3VyY2UgQ29kZS4KLQotQW55IENvdmVyZWQgU29mdHdhcmUgdGhhdCBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUgaW4gRXhlY3V0YWJsZSBmb3JtIG11c3QgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGFuZCB0aGF0IFNvdXJjZSBDb2RlIGZvcm0gbXVzdCBiZSBkaXN0cmlidXRlZCBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSBtdXN0IGluY2x1ZGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSB3aXRoIGV2ZXJ5IGNvcHkgb2YgdGhlIFNvdXJjZSBDb2RlIGZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgWW91IGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlLiBZb3UgbXVzdCBpbmZvcm0gcmVjaXBpZW50cyBvZiBhbnkgc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSBhcyB0byBob3cgdGhleSBjYW4gb2J0YWluIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KLQotMy4yLiBNb2RpZmljYXRpb25zLgotCi1UaGUgTW9kaWZpY2F0aW9ucyB0aGF0IFlvdSBjcmVhdGUgb3IgdG8gd2hpY2ggWW91IGNvbnRyaWJ1dGUgYXJlIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSByZXByZXNlbnQgdGhhdCBZb3UgYmVsaWV2ZSBZb3VyIE1vZGlmaWNhdGlvbnMgYXJlIFlvdXIgb3JpZ2luYWwgY3JlYXRpb24ocykgYW5kL29yIFlvdSBoYXZlIHN1ZmZpY2llbnQgcmlnaHRzIHRvIGdyYW50IHRoZSByaWdodHMgY29udmV5ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0zLjMuIFJlcXVpcmVkIE5vdGljZXMuCi1Zb3UgbXVzdCBpbmNsdWRlIGEgbm90aWNlIGluIGVhY2ggb2YgWW91ciBNb2RpZmljYXRpb25zIHRoYXQgaWRlbnRpZmllcyBZb3UgYXMgdGhlIENvbnRyaWJ1dG9yIG9mIHRoZSBNb2RpZmljYXRpb24uIFlvdSBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0LCBwYXRlbnQgb3IgdHJhZGVtYXJrIG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSwgb3IgYW55IG5vdGljZXMgb2YgbGljZW5zaW5nIG9yIGFueSBkZXNjcmlwdGl2ZSB0ZXh0IGdpdmluZyBhdHRyaWJ1dGlvbiB0byBhbnkgQ29udHJpYnV0b3Igb3IgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLgotCi0zLjQuIEFwcGxpY2F0aW9uIG9mIEFkZGl0aW9uYWwgVGVybXMuCi1Zb3UgbWF5IG5vdCBvZmZlciBvciBpbXBvc2UgYW55IHRlcm1zIG9uIGFueSBDb3ZlcmVkIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gdGhhdCBhbHRlcnMgb3IgcmVzdHJpY3RzIHRoZSBhcHBsaWNhYmxlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRzIHJpZ2h0cyBoZXJldW5kZXIuIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLCBhbmQgdG8gY2hhcmdlIGEgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgdG8gb25lIG9yIG1vcmUgcmVjaXBpZW50cyBvZiBDb3ZlcmVkIFNvZnR3YXJlLiBIb3dldmVyLCB5b3UgbWF5IGRvIHNvIG9ubHkgb24gWW91ciBvd24gYmVoYWxmLCBhbmQgbm90IG9uIGJlaGFsZiBvZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgc3VjaCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9uIGlzIG9mZmVyZWQgYnkgWW91IGFsb25lLCBhbmQgWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSB0ZXJtcyBZb3Ugb2ZmZXIuCi0KLTMuNS4gRGlzdHJpYnV0aW9uIG9mIEV4ZWN1dGFibGUgVmVyc2lvbnMuCi1Zb3UgbWF5IGRpc3RyaWJ1dGUgdGhlIEV4ZWN1dGFibGUgZm9ybSBvZiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIG9yIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIGxpY2Vuc2Ugb2YgWW91ciBjaG9pY2UsIHdoaWNoIG1heSBjb250YWluIHRlcm1zIGRpZmZlcmVudCBmcm9tIHRoaXMgTGljZW5zZSwgcHJvdmlkZWQgdGhhdCBZb3UgYXJlIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCB0aGF0IHRoZSBsaWNlbnNlIGZvciB0aGUgRXhlY3V0YWJsZSBmb3JtIGRvZXMgbm90IGF0dGVtcHQgdG8gbGltaXQgb3IgYWx0ZXIgdGhlIHJlY2lwaWVudHMgcmlnaHRzIGluIHRoZSBTb3VyY2UgQ29kZSBmb3JtIGZyb20gdGhlIHJpZ2h0cyBzZXQgZm9ydGggaW4gdGhpcyBMaWNlbnNlLiBJZiBZb3UgZGlzdHJpYnV0ZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSwgWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZSBhcmUgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIG5vdCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IuIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YgYW55IHN1Y2ggdGVybXMgWW91IG9mZmVyLgotCi0zLjYuIExhcmdlciBXb3Jrcy4KLVlvdSBtYXkgY3JlYXRlIGEgTGFyZ2VyIFdvcmsgYnkgY29tYmluaW5nIENvdmVyZWQgU29mdHdhcmUgd2l0aCBvdGhlciBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBMYXJnZXIgV29yayBhcyBhIHNpbmdsZSBwcm9kdWN0LiBJbiBzdWNoIGEgY2FzZSwgWW91IG11c3QgbWFrZSBzdXJlIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlIGFyZSBmdWxmaWxsZWQgZm9yIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLgotCi00LiBWZXJzaW9ucyBvZiB0aGUgTGljZW5zZS4KLQotNC4xLiBOZXcgVmVyc2lvbnMuCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGlzIHRoZSBpbml0aWFsIGxpY2Vuc2Ugc3Rld2FyZCBhbmQgbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mIHRoaXMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gRWFjaCB2ZXJzaW9uIHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gRXhjZXB0IGFzIHByb3ZpZGVkIGluIFNlY3Rpb24gNC4zLCBubyBvbmUgb3RoZXIgdGhhbiB0aGUgbGljZW5zZSBzdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgTGljZW5zZS4KLQotNC4yLiBFZmZlY3Qgb2YgTmV3IFZlcnNpb25zLgotCi1Zb3UgbWF5IGFsd2F5cyBjb250aW51ZSB0byB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZCB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gSWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGluY2x1ZGVzIGEgbm90aWNlIGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBwcm9oaWJpdGluZyBpdCBmcm9tIGJlaW5nIGRpc3RyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlLCBZb3UgbXVzdCBkaXN0cmlidXRlIGFuZCBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQgdGhlIENvdmVyZWQgU29mdHdhcmUuIE90aGVyd2lzZSwgWW91IG1heSBhbHNvIGNob29zZSB0byB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHB1Ymxpc2hlZCBieSB0aGUgbGljZW5zZSBzdGV3YXJkLgotNC4zLiBNb2RpZmllZCBWZXJzaW9ucy4KLQotV2hlbiBZb3UgYXJlIGFuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBZb3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgbGljZW5zZSBmb3IgWW91ciBPcmlnaW5hbCBTb2Z0d2FyZSwgWW91IG1heSBjcmVhdGUgYW5kIHVzZSBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIGlmIFlvdTogKGEp4XJlbmFtZSB0aGUgbGljZW5zZSBhbmQgcmVtb3ZlIGFueSByZWZlcmVuY2VzIHRvIHRoZSBuYW1lIG9mIHRoZSBsaWNlbnNlIHN0ZXdhcmQgKGV4Y2VwdCB0byBub3RlIHRoYXQgdGhlIGxpY2Vuc2UgZGlmZmVycyBmcm9tIHRoaXMgTGljZW5zZSk7IGFuZCAoYinhb3RoZXJ3aXNlIG1ha2UgaXQgY2xlYXIgdGhhdCB0aGUgbGljZW5zZSBjb250YWlucyB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UuCi0KLTUuIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkuCi0KLUNPVkVSRUQgU09GVFdBUkUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOIEFTIElTIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBTT0ZUV0FSRSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBTT0ZUV0FSRSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIgVEhJUyBESVNDTEFJTUVSLgotCi02LiBURVJNSU5BVElPTi4KLQotNi4xLiBUaGlzIExpY2Vuc2UgYW5kIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2lsbCB0ZXJtaW5hdGUgYXV0b21hdGljYWxseSBpZiBZb3UgZmFpbCB0byBjb21wbHkgd2l0aCB0ZXJtcyBoZXJlaW4gYW5kIGZhaWwgdG8gY3VyZSBzdWNoIGJyZWFjaCB3aXRoaW4gMzAgZGF5cyBvZiBiZWNvbWluZyBhd2FyZSBvZiB0aGUgYnJlYWNoLiBQcm92aXNpb25zIHdoaWNoLCBieSB0aGVpciBuYXR1cmUsIG11c3QgcmVtYWluIGluIGVmZmVjdCBiZXlvbmQgdGhlIHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZSBzaGFsbCBzdXJ2aXZlLgotCi02LjIuIElmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIChleGNsdWRpbmcgZGVjbGFyYXRvcnkganVkZ21lbnQgYWN0aW9ucykgYWdhaW5zdCBJbml0aWFsIERldmVsb3BlciBvciBhIENvbnRyaWJ1dG9yICh0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IgYWdhaW5zdCB3aG9tIFlvdSBhc3NlcnQgc3VjaCBjbGFpbSBpcyByZWZlcnJlZCB0byBhcyBQYXJ0aWNpcGFudCkgYWxsZWdpbmcgdGhhdCB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUgKG1lYW5pbmcgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24gd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIGEgQ29udHJpYnV0b3Igb3IgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIpIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4gYW55IGFuZCBhbGwgcmlnaHRzIGdyYW50ZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCwgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIChpZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaXMgbm90IHRoZSBQYXJ0aWNpcGFudCkgYW5kIGFsbCBDb250cmlidXRvcnMgdW5kZXIgU2VjdGlvbnPhMi4xIGFuZC9vciAyLjIgb2YgdGhpcyBMaWNlbnNlIHNoYWxsLCB1cG9uIDYwIGRheXMgbm90aWNlIGZyb20gUGFydGljaXBhbnQgdGVybWluYXRlIHByb3NwZWN0aXZlbHkgYW5kIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGV4cGlyYXRpb24gb2Ygc3VjaCA2MCBkYXkgbm90aWNlIHBlcmlvZCwgdW5sZXNzIGlmIHdpdGhpbiBzdWNoIDYwIGRheSBwZXJpb2QgWW91IHdpdGhkcmF3IFlvdXIgY2xhaW0gd2l0aCByZXNwZWN0IHRvIHRoZSBQYXJ0aWNpcGFudCBTb2Z0d2FyZSBhZ2FpbnN0IHN1Y2ggUGFydGljaXBhbnQgZWl0aGVyIHVuaWxhdGVyYWxseSBvciBwdXJzdWFudCB0byBhIHdyaXR0ZW4gYWdyZWVtZW50IHdpdGggUGFydGljaXBhbnQuCi0KLTYuMy4gSW4gdGhlIGV2ZW50IG9mIHRlcm1pbmF0aW9uIHVuZGVyIFNlY3Rpb25z4TYuMSBvciA2LjIgYWJvdmUsIGFsbCBlbmQgdXNlciBsaWNlbnNlcyB0aGF0IGhhdmUgYmVlbiB2YWxpZGx5IGdyYW50ZWQgYnkgWW91IG9yIGFueSBkaXN0cmlidXRvciBoZXJldW5kZXIgcHJpb3IgdG8gdGVybWluYXRpb24gKGV4Y2x1ZGluZyBsaWNlbnNlcyBncmFudGVkIHRvIFlvdSBieSBhbnkgZGlzdHJpYnV0b3IpIHNoYWxsIHN1cnZpdmUgdGVybWluYXRpb24uCi0KLTcuIExJTUlUQVRJT04gT0YgTElBQklMSVRZLgotCi1VTkRFUiBOTyBDSVJDVU1TVEFOQ0VTIEFORCBVTkRFUiBOTyBMRUdBTCBUSEVPUlksIFdIRVRIRVIgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBDT05UUkFDVCwgT1IgT1RIRVJXSVNFLCBTSEFMTCBZT1UsIFRIRSBJTklUSUFMIERFVkVMT1BFUiwgQU5ZIE9USEVSIENPTlRSSUJVVE9SLCBPUiBBTlkgRElTVFJJQlVUT1IgT0YgQ09WRVJFRCBTT0ZUV0FSRSwgT1IgQU5ZIFNVUFBMSUVSIE9GIEFOWSBPRiBTVUNIIFBBUlRJRVMsIEJFIExJQUJMRSBUTyBBTlkgUEVSU09OIEZPUiBBTlkgSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgQ0hBUkFDVEVSIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBEQU1BR0VTIEZPUiBMT1NUIFBST0ZJVFMsIExPU1MgT0YgR09PRFdJTEwsIFdPUksgU1RPUFBBR0UsIENPTVBVVEVSIEZBSUxVUkUgT1IgTUFMRlVOQ1RJT04sIE9SIEFOWSBBTkQgQUxMIE9USEVSIENPTU1FUkNJQUwgREFNQUdFUyBPUiBMT1NTRVMsIEVWRU4gSUYgU1VDSCBQQVJUWSBTSEFMTCBIQVZFIEJFRU4gSU5GT1JNRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4gVEhJUyBMSU1JVEFUSU9OIE9GIExJQUJJTElUWSBTSEFMTCBOT1QgQVBQTFkgVE8gTElBQklMSVRZIEZPUiBERUFUSCBPUiBQRVJTT05BTCBJTkpVUlkgUkVTVUxUSU5HIEZST00gU1VDSCBQQVJUWVMgTkVHTElHRU5DRSBUTyBUSEUgRVhURU5UIEFQUExJQ0FCTEUgTEFXIFBST0hJQklUUyBTVUNIIExJTUlUQVRJT04uIFNPTUUgSlVSSVNESUNUSU9OUyBETyBOT1QgQUxMT1cgVEhFIEVYQ0xVU0lPTiBPUiBMSU1JVEFUSU9OIE9GIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBTTyBUSElTIEVYQ0xVU0lPTiBBTkQgTElNSVRBVElPTiBNQVkgTk9UIEFQUExZIFRPIFlPVS4KLQotOC4gVS5TLiBHT1ZFUk5NRU5UIEVORCBVU0VSUy4KLQotVGhlIENvdmVyZWQgU29mdHdhcmUgaXMgYSBjb21tZXJjaWFsIGl0ZW0sIGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGluIDQ44UMuRi5SLuEyLjEwMSAoT2N0LiAxOTk1KSwgY29uc2lzdGluZyBvZiBjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlIChhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBhdCA0OCBDLkYuUi4g4TI1Mi4yMjctNzAxNChhKSgxKSkgYW5kIGNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUgZG9jdW1lbnRhdGlvbiBhcyBzdWNoIHRlcm1zIGFyZSB1c2VkIGluIDQ44UMuRi5SLuExMi4yMTIgKFNlcHQuIDE5OTUpLiBDb25zaXN0ZW50IHdpdGggNDggQy5GLlIuIDEyLjIxMiBhbmQgNDggQy5GLlIuIDIyNy43MjAyLTEgdGhyb3VnaCAyMjcuNzIwMi00IChKdW5lIDE5OTUpLCBhbGwgVS5TLiBHb3Zlcm5tZW50IEVuZCBVc2VycyBhY3F1aXJlIENvdmVyZWQgU29mdHdhcmUgd2l0aCBvbmx5IHRob3NlIHJpZ2h0cyBzZXQgZm9ydGggaGVyZWluLiBUaGlzIFUuUy4gR292ZXJubWVudCBSaWdodHMgY2xhdXNlIGlzIGluIGxpZXUgb2YsIGFuZCBzdXBlcnNlZGVzLCBhbnkgb3RoZXIgRkFSLCBERkFSLCBvciBvdGhlciBjbGF1c2Ugb3IgcHJvdmlzaW9uIHRoYXQgYWRkcmVzc2VzIEdvdmVybm1lbnQgcmlnaHRzIGluIGNvbXB1dGVyIHNvZnR3YXJlIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotOS4gTUlTQ0VMTEFORU9VUy4KLQotVGhpcyBMaWNlbnNlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRlIGFncmVlbWVudCBjb25jZXJuaW5nIHN1YmplY3QgbWF0dGVyIGhlcmVvZi4gSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgaGVsZCB0byBiZSB1bmVuZm9yY2VhYmxlLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvIHRoZSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuIFRoaXMgTGljZW5zZSBzaGFsbCBiZSBnb3Zlcm5lZCBieSB0aGUgbGF3IG9mIHRoZSBqdXJpc2RpY3Rpb24gc3BlY2lmaWVkIGluIGEgbm90aWNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChleGNlcHQgdG8gdGhlIGV4dGVudCBhcHBsaWNhYmxlIGxhdywgaWYgYW55LCBwcm92aWRlcyBvdGhlcndpc2UpLCBleGNsdWRpbmcgc3VjaCBqdXJpc2RpY3Rpb25zIGNvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zLiBBbnkgbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mIHRoZSBjb3VydHMgbG9jYXRlZCBpbiB0aGUganVyaXNkaWN0aW9uIGFuZCB2ZW51ZSBzcGVjaWZpZWQgaW4gYSBub3RpY2UgY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIHdpdGggdGhlIGxvc2luZyBwYXJ0eSByZXNwb25zaWJsZSBmb3IgY29zdHMsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBjb3VydCBjb3N0cyBhbmQgcmVhc29uYWJsZSBhdHRvcm5leXMgZmVlcyBhbmQgZXhwZW5zZXMuIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yIHRoZSBJbnRlcm5hdGlvbmFsIFNhbGUgb2YgR29vZHMgaXMgZXhwcmVzc2x5IGV4Y2x1ZGVkLiBBbnkgbGF3IG9yIHJlZ3VsYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhhdCB0aGUgbGFuZ3VhZ2Ugb2YgYSBjb250cmFjdCBzaGFsbCBiZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcyBMaWNlbnNlLiBZb3UgYWdyZWUgdGhhdCBZb3UgYWxvbmUgYXJlIHJlc3BvbnNpYmxlIGZvciBjb21wbGlhbmNlIHdpdGggdGhlIFVuaXRlZCBTdGF0ZXMgZXhwb3J0IGFkbWluaXN0cmF0aW9uIHJlZ3VsYXRpb25zIChhbmQgdGhlIGV4cG9ydCBjb250cm9sIGxhd3MgYW5kIHJlZ3VsYXRpb24gb2YgYW55IG90aGVyIGNvdW50cmllcykgd2hlbiBZb3UgdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZSBhbnkgQ292ZXJlZCBTb2Z0d2FyZS4KLQotMTAuIFJFU1BPTlNJQklMSVRZIEZPUiBDTEFJTVMuCi0KLUFzIGJldHdlZW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIHRoZSBDb250cmlidXRvcnMsIGVhY2ggcGFydHkgaXMgcmVzcG9uc2libGUgZm9yIGNsYWltcyBhbmQgZGFtYWdlcyBhcmlzaW5nLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LCBvdXQgb2YgaXRzIHV0aWxpemF0aW9uIG9mIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIFlvdSBhZ3JlZSB0byB3b3JrIHdpdGggSW5pdGlhbCBEZXZlbG9wZXIgYW5kIENvbnRyaWJ1dG9ycyB0byBkaXN0cmlidXRlIHN1Y2ggcmVzcG9uc2liaWxpdHkgb24gYW4gZXF1aXRhYmxlIGJhc2lzLiBOb3RoaW5nIGhlcmVpbiBpcyBpbnRlbmRlZCBvciBzaGFsbCBiZSBkZWVtZWQgdG8gY29uc3RpdHV0ZSBhbnkgYWRtaXNzaW9uIG9mIGxpYWJpbGl0eS4KLQotTk9USUNFIFBVUlNVQU5UIFRPIFNFQ1RJT04gOSBPRiBUSEUgQ09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkKLVRoZSBHbGFzc0Zpc2ggY29kZSByZWxlYXNlZCB1bmRlciB0aGUgQ0RETCBzaGFsbCBiZSBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgQ2FsaWZvcm5pYSAoZXhjbHVkaW5nIGNvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zKS4gQW55IGxpdGlnYXRpb24gcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbiBvZiB0aGUgRmVkZXJhbCBDb3VydHMgb2YgdGhlIE5vcnRoZXJuIERpc3RyaWN0IG9mIENhbGlmb3JuaWEgYW5kIHRoZSBzdGF0ZSBjb3VydHMgb2YgdGhlIFN0YXRlIG9mIENhbGlmb3JuaWEsIHdpdGggdmVudWUgbHlpbmcgaW4gU2FudGEgQ2xhcmEgQ291bnR5LCBDYWxpZm9ybmlhLiAKLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXRfZmlsZXMvTElDRU5TRS50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0X2ZpbGVzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTU0ZTBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXRfZmlsZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotQ09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkgVmVyc2lvbiAxLjAKLQotMS4gRGVmaW5pdGlvbnMuCi0KLTEuMS4gQ29udHJpYnV0b3IgbWVhbnMgZWFjaCBpbmRpdmlkdWFsIG9yIGVudGl0eSB0aGF0IGNyZWF0ZXMgb3IgY29udHJpYnV0ZXMgdG8gdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuCi0KLTEuMi4gQ29udHJpYnV0b3IgVmVyc2lvbiBtZWFucyB0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYSBDb250cmlidXRvciAoaWYgYW55KSwgYW5kIHRoZSBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgotCi0xLjMuIENvdmVyZWQgU29mdHdhcmUgbWVhbnMgKGEpIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKGIpIE1vZGlmaWNhdGlvbnMsIG9yIChjKSB0aGUgY29tYmluYXRpb24gb2YgZmlsZXMgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSB3aXRoIGZpbGVzIGNvbnRhaW5pbmcgTW9kaWZpY2F0aW9ucywgaW4gZWFjaCBjYXNlIGluY2x1ZGluZyBwb3J0aW9ucyB0aGVyZW9mLgotCi0xLjQuIEV4ZWN1dGFibGUgbWVhbnMgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gYW55IGZvcm0gb3RoZXIgdGhhbiBTb3VyY2UgQ29kZS4KLQotMS41LiBJbml0aWFsIERldmVsb3BlciBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBmaXJzdCBtYWtlcyBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0xLjYuIExhcmdlciBXb3JrIG1lYW5zIGEgd29yayB3aGljaCBjb21iaW5lcyBDb3ZlcmVkIFNvZnR3YXJlIG9yIHBvcnRpb25zIHRoZXJlb2Ygd2l0aCBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0xLjcuIExpY2Vuc2UgbWVhbnMgdGhpcyBkb2N1bWVudC4KLQotMS44LiBMaWNlbnNhYmxlIG1lYW5zIGhhdmluZyB0aGUgcmlnaHQgdG8gZ3JhbnQsIHRvIHRoZSBtYXhpbXVtIGV4dGVudCBwb3NzaWJsZSwgd2hldGhlciBhdCB0aGUgdGltZSBvZiB0aGUgaW5pdGlhbCBncmFudCBvciBzdWJzZXF1ZW50bHkgYWNxdWlyZWQsIGFueSBhbmQgYWxsIG9mIHRoZSByaWdodHMgY29udmV5ZWQgaGVyZWluLgotCi0xLjkuIE1vZGlmaWNhdGlvbnMgbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZCBFeGVjdXRhYmxlIGZvcm0gb2YgYW55IG9mIHRoZSBmb2xsb3dpbmc6Ci0KLUEuIEFueSBmaWxlIHRoYXQgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLCBkZWxldGlvbiBmcm9tIG9yIG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgYSBmaWxlIGNvbnRhaW5pbmcgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9uczsKLQotQi4gQW55IG5ldyBmaWxlIHRoYXQgY29udGFpbnMgYW55IHBhcnQgb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbjsgb3IKLQotQy4gQW55IG5ldyBmaWxlIHRoYXQgaXMgY29udHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLTEuMTAuIE9yaWdpbmFsIFNvZnR3YXJlIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZSBmb3JtIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUgdGhhdCBpcyBvcmlnaW5hbGx5IHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotMS4xMS4gUGF0ZW50IENsYWltcyBtZWFucyBhbnkgcGF0ZW50IGNsYWltKHMpLCBub3cgb3duZWQgb3IgaGVyZWFmdGVyIGFjcXVpcmVkLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uLCBtZXRob2QsIHByb2Nlc3MsIGFuZCBhcHBhcmF0dXMgY2xhaW1zLCBpbiBhbnkgcGF0ZW50IExpY2Vuc2FibGUgYnkgZ3JhbnRvci4KLQotMS4xMi4gU291cmNlIENvZGUgbWVhbnMgKGEpIHRoZSBjb21tb24gZm9ybSBvZiBjb21wdXRlciBzb2Z0d2FyZSBjb2RlIGluIHdoaWNoIG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUgYW5kIChiKSBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgaW4gb3Igd2l0aCBzdWNoIGNvZGUuCi0KLTEuMTMuIFlvdSAob3IgWW91cikgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciwgYW5kIGNvbXBseWluZyB3aXRoIGFsbCBvZiB0aGUgdGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCBZb3UgaW5jbHVkZXMgYW55IGVudGl0eSB3aGljaCBjb250cm9scywgaXMgY29udHJvbGxlZCBieSwgb3IgaXMgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sIGNvbnRyb2wgbWVhbnMgKGEp4XRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3Igb3RoZXJ3aXNlLCBvciAoYinhb3duZXJzaGlwIG9mIG1vcmUgdGhhbiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9mIHRoZSBvdXRzdGFuZGluZyBzaGFyZXMgb3IgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLTIuIExpY2Vuc2UgR3JhbnRzLgotCi0yLjEuIFRoZSBJbml0aWFsIERldmVsb3BlciBHcmFudC4KLUNvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6Ci0oYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbiBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IEluaXRpYWwgRGV2ZWxvcGVyLCB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAob3IgcG9ydGlvbnMgdGhlcmVvZiksIHdpdGggb3Igd2l0aG91dCBNb2RpZmljYXRpb25zLCBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKLShiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLCB1c2luZyBvciBzZWxsaW5nIG9mIE9yaWdpbmFsIFNvZnR3YXJlLCB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgcHJhY3RpY2UsIHNlbGwsIGFuZCBvZmZlciBmb3Igc2FsZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAob3IgcG9ydGlvbnMgdGhlcmVvZikuCi0oYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnPhMi4xKGEpIGFuZCAoYikgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBJbml0aWFsIERldmVsb3BlciBmaXJzdCBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0oZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb27hMi4xKGIpIGFib3ZlLCBubyBwYXRlbnQgbGljZW5zZSBpcyBncmFudGVkOiAoMSnhZm9yIGNvZGUgdGhhdCBZb3UgZGVsZXRlIGZyb20gdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoMinhZm9yIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSnhdGhlIG1vZGlmaWNhdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yIChpaSnhdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGRldmljZXMuCi0KLTIuMi4gQ29udHJpYnV0b3IgR3JhbnQuCi1Db25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZCBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUgbGljZW5zZToKLShhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgQ29udHJpYnV0b3IgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTW9kaWZpY2F0aW9ucyBjcmVhdGVkIGJ5IHN1Y2ggQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zIHRoZXJlb2YpLCBlaXRoZXIgb24gYW4gdW5tb2RpZmllZCBiYXNpcywgd2l0aCBvdGhlciBNb2RpZmljYXRpb25zLCBhcyBDb3ZlcmVkIFNvZnR3YXJlIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAotKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nLCBvciBzZWxsaW5nIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIGVpdGhlciBhbG9uZSBhbmQvb3IgaW4gY29tYmluYXRpb24gd2l0aCBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMgb2Ygc3VjaCBjb21iaW5hdGlvbiksIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgZm9yIHNhbGUsIGhhdmUgbWFkZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mOiAoMSnhTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zIHRoZXJlb2YpOyBhbmQgKDIp4XRoZSBjb21iaW5hdGlvbiBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyBvZiBzdWNoIGNvbWJpbmF0aW9uKS4KLShjKSBUaGUgbGljZW5zZXMgZ3JhbnRlZCBpbiBTZWN0aW9uc+EyLjIoYSkgYW5kIDIuMihiKSBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIENvbnRyaWJ1dG9yIGZpcnN0IGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUgTW9kaWZpY2F0aW9ucyBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eS4KLShkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbuEyLjIoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKeFmb3IgYW55IGNvZGUgdGhhdCBDb250cmlidXRvciBoYXMgZGVsZXRlZCBmcm9tIHRoZSBDb250cmlidXRvciBWZXJzaW9uOyAoMinhZm9yIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSnhdGhpcmQgcGFydHkgbW9kaWZpY2F0aW9ucyBvZiBDb250cmlidXRvciBWZXJzaW9uLCBvciAoaWkp4XRoZSBjb21iaW5hdGlvbiBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIG90aGVyIHNvZnR3YXJlIChleGNlcHQgYXMgcGFydCBvZiB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbikgb3Igb3RoZXIgZGV2aWNlczsgb3IgKDMp4XVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IENvdmVyZWQgU29mdHdhcmUgaW4gdGhlIGFic2VuY2Ugb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IuCi0KLTMuIERpc3RyaWJ1dGlvbiBPYmxpZ2F0aW9ucy4KLQotMy4xLiBBdmFpbGFiaWxpdHkgb2YgU291cmNlIENvZGUuCi0KLUFueSBDb3ZlcmVkIFNvZnR3YXJlIHRoYXQgWW91IGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlIGluIEV4ZWN1dGFibGUgZm9ybSBtdXN0IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgaW4gU291cmNlIENvZGUgZm9ybSBhbmQgdGhhdCBTb3VyY2UgQ29kZSBmb3JtIG11c3QgYmUgZGlzdHJpYnV0ZWQgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBZb3UgbXVzdCBpbmNsdWRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2Ugd2l0aCBldmVyeSBjb3B5IG9mIHRoZSBTb3VyY2UgQ29kZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIFlvdSBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZS4gWW91IG11c3QgaW5mb3JtIHJlY2lwaWVudHMgb2YgYW55IHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gYXMgdG8gaG93IHRoZXkgY2FuIG9idGFpbiBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuCi0KLTMuMi4gTW9kaWZpY2F0aW9ucy4KLQotVGhlIE1vZGlmaWNhdGlvbnMgdGhhdCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdSBjb250cmlidXRlIGFyZSBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBZb3UgcmVwcmVzZW50IHRoYXQgWW91IGJlbGlldmUgWW91ciBNb2RpZmljYXRpb25zIGFyZSBZb3VyIG9yaWdpbmFsIGNyZWF0aW9uKHMpIGFuZC9vciBZb3UgaGF2ZSBzdWZmaWNpZW50IHJpZ2h0cyB0byBncmFudCB0aGUgcmlnaHRzIGNvbnZleWVkIGJ5IHRoaXMgTGljZW5zZS4KLQotMy4zLiBSZXF1aXJlZCBOb3RpY2VzLgotWW91IG11c3QgaW5jbHVkZSBhIG5vdGljZSBpbiBlYWNoIG9mIFlvdXIgTW9kaWZpY2F0aW9ucyB0aGF0IGlkZW50aWZpZXMgWW91IGFzIHRoZSBDb250cmlidXRvciBvZiB0aGUgTW9kaWZpY2F0aW9uLiBZb3UgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCwgcGF0ZW50IG9yIHRyYWRlbWFyayBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIENvdmVyZWQgU29mdHdhcmUsIG9yIGFueSBub3RpY2VzIG9mIGxpY2Vuc2luZyBvciBhbnkgZGVzY3JpcHRpdmUgdGV4dCBnaXZpbmcgYXR0cmlidXRpb24gdG8gYW55IENvbnRyaWJ1dG9yIG9yIHRoZSBJbml0aWFsIERldmVsb3Blci4KLQotMy40LiBBcHBsaWNhdGlvbiBvZiBBZGRpdGlvbmFsIFRlcm1zLgotWW91IG1heSBub3Qgb2ZmZXIgb3IgaW1wb3NlIGFueSB0ZXJtcyBvbiBhbnkgQ292ZXJlZCBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIHRoYXQgYWx0ZXJzIG9yIHJlc3RyaWN0cyB0aGUgYXBwbGljYWJsZSB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBvciB0aGUgcmVjaXBpZW50cyByaWdodHMgaGVyZXVuZGVyLiBZb3UgbWF5IGNob29zZSB0byBvZmZlciwgYW5kIHRvIGNoYXJnZSBhIGZlZSBmb3IsIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb25zIHRvIG9uZSBvciBtb3JlIHJlY2lwaWVudHMgb2YgQ292ZXJlZCBTb2Z0d2FyZS4gSG93ZXZlciwgeW91IG1heSBkbyBzbyBvbmx5IG9uIFlvdXIgb3duIGJlaGFsZiwgYW5kIG5vdCBvbiBiZWhhbGYgb2YgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIGFueSBDb250cmlidXRvci4gWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHN1Y2ggd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbiBpcyBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgYW5kIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2Ygd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgdGVybXMgWW91IG9mZmVyLgotCi0zLjUuIERpc3RyaWJ1dGlvbiBvZiBFeGVjdXRhYmxlIFZlcnNpb25zLgotWW91IG1heSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIGZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBvciB1bmRlciB0aGUgdGVybXMgb2YgYSBsaWNlbnNlIG9mIFlvdXIgY2hvaWNlLCB3aGljaCBtYXkgY29udGFpbiB0ZXJtcyBkaWZmZXJlbnQgZnJvbSB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgWW91IGFyZSBpbiBjb21wbGlhbmNlIHdpdGggdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgdGhhdCB0aGUgbGljZW5zZSBmb3IgdGhlIEV4ZWN1dGFibGUgZm9ybSBkb2VzIG5vdCBhdHRlbXB0IHRvIGxpbWl0IG9yIGFsdGVyIHRoZSByZWNpcGllbnRzIHJpZ2h0cyBpbiB0aGUgU291cmNlIENvZGUgZm9ybSBmcm9tIHRoZSByaWdodHMgc2V0IGZvcnRoIGluIHRoaXMgTGljZW5zZS4gSWYgWW91IGRpc3RyaWJ1dGUgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIHVuZGVyIGEgZGlmZmVyZW50IGxpY2Vuc2UsIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueSB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UgYXJlIG9mZmVyZWQgYnkgWW91IGFsb25lLCBub3QgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yLiBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIGFueSBzdWNoIHRlcm1zIFlvdSBvZmZlci4KLQotMy42LiBMYXJnZXIgV29ya3MuCi1Zb3UgbWF5IGNyZWF0ZSBhIExhcmdlciBXb3JrIGJ5IGNvbWJpbmluZyBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb3RoZXIgY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGFyZ2VyIFdvcmsgYXMgYSBzaW5nbGUgcHJvZHVjdC4gSW4gc3VjaCBhIGNhc2UsIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4KLQotNC4gVmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UuCi0KLTQuMS4gTmV3IFZlcnNpb25zLgotU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpcyB0aGUgaW5pdGlhbCBsaWNlbnNlIHN0ZXdhcmQgYW5kIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZiB0aGlzIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuIEVhY2ggdmVyc2lvbiB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIEV4Y2VwdCBhcyBwcm92aWRlZCBpbiBTZWN0aW9uIDQuMywgbm8gb25lIG90aGVyIHRoYW4gdGhlIGxpY2Vuc2Ugc3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIExpY2Vuc2UuCi0KLTQuMi4gRWZmZWN0IG9mIE5ldyBWZXJzaW9ucy4KLQotWW91IG1heSBhbHdheXMgY29udGludWUgdG8gdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQgdGhlIENvdmVyZWQgU29mdHdhcmUuIElmIHRoZSBJbml0aWFsIERldmVsb3BlciBpbmNsdWRlcyBhIG5vdGljZSBpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgcHJvaGliaXRpbmcgaXQgZnJvbSBiZWluZyBkaXN0cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdW5kZXIgYW55IHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSwgWW91IG11c3QgZGlzdHJpYnV0ZSBhbmQgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBPdGhlcndpc2UsIFlvdSBtYXkgYWxzbyBjaG9vc2UgdG8gdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgYW55IHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSBwdWJsaXNoZWQgYnkgdGhlIGxpY2Vuc2Ugc3Rld2FyZC4KLTQuMy4gTW9kaWZpZWQgVmVyc2lvbnMuCi0KLVdoZW4gWW91IGFyZSBhbiBJbml0aWFsIERldmVsb3BlciBhbmQgWW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGxpY2Vuc2UgZm9yIFlvdXIgT3JpZ2luYWwgU29mdHdhcmUsIFlvdSBtYXkgY3JlYXRlIGFuZCB1c2UgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBpZiBZb3U6IChhKeFyZW5hbWUgdGhlIGxpY2Vuc2UgYW5kIHJlbW92ZSBhbnkgcmVmZXJlbmNlcyB0byB0aGUgbmFtZSBvZiB0aGUgbGljZW5zZSBzdGV3YXJkIChleGNlcHQgdG8gbm90ZSB0aGF0IHRoZSBsaWNlbnNlIGRpZmZlcnMgZnJvbSB0aGlzIExpY2Vuc2UpOyBhbmQgKGIp4W90aGVyd2lzZSBtYWtlIGl0IGNsZWFyIHRoYXQgdGhlIGxpY2Vuc2UgY29udGFpbnMgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlLgotCi01LiBESVNDTEFJTUVSIE9GIFdBUlJBTlRZLgotCi1DT1ZFUkVEIFNPRlRXQVJFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiBBUyBJUyBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBUSEFUIFRIRSBDT1ZFUkVEIFNPRlRXQVJFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVEIFNPRlRXQVJFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgU09GVFdBUkUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVCBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgU09GVFdBUkUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSIFRISVMgRElTQ0xBSU1FUi4KLQotNi4gVEVSTUlOQVRJT04uCi0KLTYuMS4gVGhpcyBMaWNlbnNlIGFuZCB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZXVuZGVyIHdpbGwgdGVybWluYXRlIGF1dG9tYXRpY2FsbHkgaWYgWW91IGZhaWwgdG8gY29tcGx5IHdpdGggdGVybXMgaGVyZWluIGFuZCBmYWlsIHRvIGN1cmUgc3VjaCBicmVhY2ggd2l0aGluIDMwIGRheXMgb2YgYmVjb21pbmcgYXdhcmUgb2YgdGhlIGJyZWFjaC4gUHJvdmlzaW9ucyB3aGljaCwgYnkgdGhlaXIgbmF0dXJlLCBtdXN0IHJlbWFpbiBpbiBlZmZlY3QgYmV5b25kIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2Ugc2hhbGwgc3Vydml2ZS4KLQotNi4yLiBJZiBZb3UgYXNzZXJ0IGEgcGF0ZW50IGluZnJpbmdlbWVudCBjbGFpbSAoZXhjbHVkaW5nIGRlY2xhcmF0b3J5IGp1ZGdtZW50IGFjdGlvbnMpIGFnYWluc3QgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYSBDb250cmlidXRvciAodGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yIGFnYWluc3Qgd2hvbSBZb3UgYXNzZXJ0IHN1Y2ggY2xhaW0gaXMgcmVmZXJyZWQgdG8gYXMgUGFydGljaXBhbnQpIGFsbGVnaW5nIHRoYXQgdGhlIFBhcnRpY2lwYW50IFNvZnR3YXJlIChtZWFuaW5nIHRoZSBDb250cmlidXRvciBWZXJzaW9uIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyBhIENvbnRyaWJ1dG9yIG9yIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSB3aGVyZSB0aGUgUGFydGljaXBhbnQgaXMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyKSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluZnJpbmdlcyBhbnkgcGF0ZW50LCB0aGVuIGFueSBhbmQgYWxsIHJpZ2h0cyBncmFudGVkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdG8gWW91IGJ5IHN1Y2ggUGFydGljaXBhbnQsIHRoZSBJbml0aWFsIERldmVsb3BlciAoaWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGlzIG5vdCB0aGUgUGFydGljaXBhbnQpIGFuZCBhbGwgQ29udHJpYnV0b3JzIHVuZGVyIFNlY3Rpb25z4TIuMSBhbmQvb3IgMi4yIG9mIHRoaXMgTGljZW5zZSBzaGFsbCwgdXBvbiA2MCBkYXlzIG5vdGljZSBmcm9tIFBhcnRpY2lwYW50IHRlcm1pbmF0ZSBwcm9zcGVjdGl2ZWx5IGFuZCBhdXRvbWF0aWNhbGx5IGF0IHRoZSBleHBpcmF0aW9uIG9mIHN1Y2ggNjAgZGF5IG5vdGljZSBwZXJpb2QsIHVubGVzcyBpZiB3aXRoaW4gc3VjaCA2MCBkYXkgcGVyaW9kIFlvdSB3aXRoZHJhdyBZb3VyIGNsYWltIHdpdGggcmVzcGVjdCB0byB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUgYWdhaW5zdCBzdWNoIFBhcnRpY2lwYW50IGVpdGhlciB1bmlsYXRlcmFsbHkgb3IgcHVyc3VhbnQgdG8gYSB3cml0dGVuIGFncmVlbWVudCB3aXRoIFBhcnRpY2lwYW50LgotCi02LjMuIEluIHRoZSBldmVudCBvZiB0ZXJtaW5hdGlvbiB1bmRlciBTZWN0aW9uc+E2LjEgb3IgNi4yIGFib3ZlLCBhbGwgZW5kIHVzZXIgbGljZW5zZXMgdGhhdCBoYXZlIGJlZW4gdmFsaWRseSBncmFudGVkIGJ5IFlvdSBvciBhbnkgZGlzdHJpYnV0b3IgaGVyZXVuZGVyIHByaW9yIHRvIHRlcm1pbmF0aW9uIChleGNsdWRpbmcgbGljZW5zZXMgZ3JhbnRlZCB0byBZb3UgYnkgYW55IGRpc3RyaWJ1dG9yKSBzaGFsbCBzdXJ2aXZlIHRlcm1pbmF0aW9uLgotCi03LiBMSU1JVEFUSU9OIE9GIExJQUJJTElUWS4KLQotVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgWU9VLCBUSEUgSU5JVElBTCBERVZFTE9QRVIsIEFOWSBPVEhFUiBDT05UUklCVVRPUiwgT1IgQU5ZIERJU1RSSUJVVE9SIE9GIENPVkVSRUQgU09GVFdBUkUsIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRSBMSUFCTEUgVE8gQU5ZIFBFUlNPTiBGT1IgQU5ZIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIENIQVJBQ1RFUiBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgREFNQUdFUyBGT1IgTE9TVCBQUk9GSVRTLCBMT1NTIE9GIEdPT0RXSUxMLCBXT1JLIFNUT1BQQUdFLCBDT01QVVRFUiBGQUlMVVJFIE9SIE1BTEZVTkNUSU9OLCBPUiBBTlkgQU5EIEFMTCBPVEhFUiBDT01NRVJDSUFMIERBTUFHRVMgT1IgTE9TU0VTLCBFVkVOIElGIFNVQ0ggUEFSVFkgU0hBTEwgSEFWRSBCRUVOIElORk9STUVEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRiBMSUFCSUxJVFkgU0hBTEwgTk9UIEFQUExZIFRPIExJQUJJTElUWSBGT1IgREVBVEggT1IgUEVSU09OQUwgSU5KVVJZIFJFU1VMVElORyBGUk9NIFNVQ0ggUEFSVFlTIE5FR0xJR0VOQ0UgVE8gVEhFIEVYVEVOVCBBUFBMSUNBQkxFIExBVyBQUk9ISUJJVFMgU1VDSCBMSU1JVEFUSU9OLiBTT01FIEpVUklTRElDVElPTlMgRE8gTk9UIEFMTE9XIFRIRSBFWENMVVNJT04gT1IgTElNSVRBVElPTiBPRiBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgU08gVEhJUyBFWENMVVNJT04gQU5EIExJTUlUQVRJT04gTUFZIE5PVCBBUFBMWSBUTyBZT1UuCi0KLTguIFUuUy4gR09WRVJOTUVOVCBFTkQgVVNFUlMuCi0KLVRoZSBDb3ZlcmVkIFNvZnR3YXJlIGlzIGEgY29tbWVyY2lhbCBpdGVtLCBhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBpbiA0OOFDLkYuUi7hMi4xMDEgKE9jdC4gMTk5NSksIGNvbnNpc3Rpbmcgb2YgY29tbWVyY2lhbCBjb21wdXRlciBzb2Z0d2FyZSAoYXMgdGhhdCB0ZXJtIGlzIGRlZmluZWQgYXQgNDggQy5GLlIuIOEyNTIuMjI3LTcwMTQoYSkoMSkpIGFuZCBjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlIGRvY3VtZW50YXRpb24gYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZCBpbiA0OOFDLkYuUi7hMTIuMjEyIChTZXB0LiAxOTk1KS4gQ29uc2lzdGVudCB3aXRoIDQ4IEMuRi5SLiAxMi4yMTIgYW5kIDQ4IEMuRi5SLiAyMjcuNzIwMi0xIHRocm91Z2ggMjI3LjcyMDItNCAoSnVuZSAxOTk1KSwgYWxsIFUuUy4gR292ZXJubWVudCBFbmQgVXNlcnMgYWNxdWlyZSBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb25seSB0aG9zZSByaWdodHMgc2V0IGZvcnRoIGhlcmVpbi4gVGhpcyBVLlMuIEdvdmVybm1lbnQgUmlnaHRzIGNsYXVzZSBpcyBpbiBsaWV1IG9mLCBhbmQgc3VwZXJzZWRlcywgYW55IG90aGVyIEZBUiwgREZBUiwgb3Igb3RoZXIgY2xhdXNlIG9yIHByb3Zpc2lvbiB0aGF0IGFkZHJlc3NlcyBHb3Zlcm5tZW50IHJpZ2h0cyBpbiBjb21wdXRlciBzb2Z0d2FyZSB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLTkuIE1JU0NFTExBTkVPVVMuCi0KLVRoaXMgTGljZW5zZSByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBhZ3JlZW1lbnQgY29uY2VybmluZyBzdWJqZWN0IG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGhlbGQgdG8gYmUgdW5lbmZvcmNlYWJsZSwgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgb25seSB0byB0aGUgZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLiBUaGlzIExpY2Vuc2Ugc2hhbGwgYmUgZ292ZXJuZWQgYnkgdGhlIGxhdyBvZiB0aGUganVyaXNkaWN0aW9uIHNwZWNpZmllZCBpbiBhIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAoZXhjZXB0IHRvIHRoZSBleHRlbnQgYXBwbGljYWJsZSBsYXcsIGlmIGFueSwgcHJvdmlkZXMgb3RoZXJ3aXNlKSwgZXhjbHVkaW5nIHN1Y2gganVyaXNkaWN0aW9ucyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4gQW55IGxpdGlnYXRpb24gcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbiBvZiB0aGUgY291cnRzIGxvY2F0ZWQgaW4gdGhlIGp1cmlzZGljdGlvbiBhbmQgdmVudWUgc3BlY2lmaWVkIGluIGEgbm90aWNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCB3aXRoIHRoZSBsb3NpbmcgcGFydHkgcmVzcG9uc2libGUgZm9yIGNvc3RzLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgY291cnQgY29zdHMgYW5kIHJlYXNvbmFibGUgYXR0b3JuZXlzIGZlZXMgYW5kIGV4cGVuc2VzLiBUaGUgYXBwbGljYXRpb24gb2YgdGhlIFVuaXRlZCBOYXRpb25zIENvbnZlbnRpb24gb24gQ29udHJhY3RzIGZvciB0aGUgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzIGV4cHJlc3NseSBleGNsdWRlZC4gQW55IGxhdyBvciByZWd1bGF0aW9uIHdoaWNoIHByb3ZpZGVzIHRoYXQgdGhlIGxhbmd1YWdlIG9mIGEgY29udHJhY3Qgc2hhbGwgYmUgY29uc3RydWVkIGFnYWluc3QgdGhlIGRyYWZ0ZXIgc2hhbGwgbm90IGFwcGx5IHRvIHRoaXMgTGljZW5zZS4gWW91IGFncmVlIHRoYXQgWW91IGFsb25lIGFyZSByZXNwb25zaWJsZSBmb3IgY29tcGxpYW5jZSB3aXRoIHRoZSBVbml0ZWQgU3RhdGVzIGV4cG9ydCBhZG1pbmlzdHJhdGlvbiByZWd1bGF0aW9ucyAoYW5kIHRoZSBleHBvcnQgY29udHJvbCBsYXdzIGFuZCByZWd1bGF0aW9uIG9mIGFueSBvdGhlciBjb3VudHJpZXMpIHdoZW4gWW91IHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUgYW55IENvdmVyZWQgU29mdHdhcmUuCi0KLTEwLiBSRVNQT05TSUJJTElUWSBGT1IgQ0xBSU1TLgotCi1BcyBiZXR3ZWVuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCB0aGUgQ29udHJpYnV0b3JzLCBlYWNoIHBhcnR5IGlzIHJlc3BvbnNpYmxlIGZvciBjbGFpbXMgYW5kIGRhbWFnZXMgYXJpc2luZywgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgb3V0IG9mIGl0cyB1dGlsaXphdGlvbiBvZiByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlIGFuZCBZb3UgYWdyZWUgdG8gd29yayB3aXRoIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBDb250cmlidXRvcnMgdG8gZGlzdHJpYnV0ZSBzdWNoIHJlc3BvbnNpYmlsaXR5IG9uIGFuIGVxdWl0YWJsZSBiYXNpcy4gTm90aGluZyBoZXJlaW4gaXMgaW50ZW5kZWQgb3Igc2hhbGwgYmUgZGVlbWVkIHRvIGNvbnN0aXR1dGUgYW55IGFkbWlzc2lvbiBvZiBsaWFiaWxpdHkuCi0KLU5PVElDRSBQVVJTVUFOVCBUTyBTRUNUSU9OIDkgT0YgVEhFIENPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpCi1UaGUgR2xhc3NGaXNoIGNvZGUgcmVsZWFzZWQgdW5kZXIgdGhlIENEREwgc2hhbGwgYmUgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIENhbGlmb3JuaWEgKGV4Y2x1ZGluZyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucykuIEFueSBsaXRpZ2F0aW9uIHJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZSBqdXJpc2RpY3Rpb24gb2YgdGhlIEZlZGVyYWwgQ291cnRzIG9mIHRoZSBOb3J0aGVybiBEaXN0cmljdCBvZiBDYWxpZm9ybmlhIGFuZCB0aGUgc3RhdGUgY291cnRzIG9mIHRoZSBTdGF0ZSBvZiBDYWxpZm9ybmlhLCB3aXRoIHZlbnVlIGx5aW5nIGluIFNhbnRhIENsYXJhIENvdW50eSwgQ2FsaWZvcm5pYS4gCi0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkM2E5MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBkdGRzQW5kU2NoZW1hcy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dF9maWxlcy8KLXNyYy5pbmNsdWRlcyA9IGR0ZHNBbmRTY2hlbWFzLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0X2ZpbGVzLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbi1jbGllbnRfMV8yLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzFfMi5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNThjYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbi1jbGllbnRfMV8yLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi08IS0tCi1Db3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIDkwMSBTYW4gQW50b25pbyBSb2FkLAotUGFsbyBBbHRvLCBDQSAgOTQzMDMsIFUuUy5BLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAKLVRoaXMgcHJvZHVjdCBvciBkb2N1bWVudCBpcyBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGFuZCBkaXN0cmlidXRlZAotdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgaXRzIHVzZSwgY29weWluZywgZGlzdHJpYnV0aW9uLCBhbmQKLWRlY29tcGlsYXRpb24uICBObyBwYXJ0IG9mIHRoaXMgcHJvZHVjdCBvciBkb2N1bWVudGF0aW9uIG1heSBiZQotcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KLW9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LiAgCi0KLVRoaXJkIHBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcyBjb3B5cmlnaHRlZCBhbmQgCi1saWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuIAotCi1TdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gTG9nbywgU29sYXJpcywgSmF2YSwgSmF2YVNlcnZlciBQYWdlcywgSmF2YSAKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgSkRCQywgSkRLLCBKYXZhTWFpbCBhbmQgRW50ZXJwcmlzZSBKYXZhQmVhbnMsIAotYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYyBpbiB0aGUgVS5TLiAKLWFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUFsbCBTUEFSQyB0cmFkZW1hcmtzIGFyZSB1c2VkIHVuZGVyIGxpY2Vuc2UgYW5kIGFyZSB0cmFkZW1hcmtzCi1vciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU1BBUkMgSW50ZXJuYXRpb25hbCwgSW5jLgotaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4gUHJvZHVjdHMgYmVhcmluZyBTUEFSQwotdHJhZGVtYXJrcyBhcmUgYmFzZWQgdXBvbiBhbiBhcmNoaXRlY3R1cmUgZGV2ZWxvcGVkIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gCi0KLVBvc3RTY3JpcHQgaXMgYSByZWdpc3RlcmVkIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zLCBJbmMuIAotCi0gCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMgU3ViamVjdCB0byAKLVN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLQotIAotRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTEwgRVhQUkVTUyBPUiBJTVBMSUVECi1DT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5EIFdBUlJBTlRJRVMsIElOQ0xVRElORyBBTlkKLUlNUExJRUQgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UgT1IgTk9OLUlORlJJTkdFTUVOVCwgQVJFIERJU0NMQUlNRUQsIEVYQ0VQVAotVE8gVEhFIEVYVEVOVCBUSEFUIFNVQ0ggRElTQ0xBSU1FUlMgQVJFIEhFTEQgVE8gQkUgTEVHQUxMWQotSU5WQUxJRC4KLQotX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotQ29weXJpZ2h0IDE5OTkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgCi05MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSAgOTQzMDMsIEV0YXRzLVVuaXMuIAotVG91cyBkcm9pdHMgcmUnc2VydmUncy4KLSAKLQotQ2UgcHJvZHVpdCBvdSBkb2N1bWVudCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQgZGlzdHJpYnVlJyBhdmVjIAotZGVzIGxpY2VuY2VzIHF1aSBlbiByZXN0cmVpZ25lbnQgbCd1dGlsaXNhdGlvbiwgbGEgY29waWUsIGxhIGRpc3RyaWJ1dGlvbiwKLWV0IGxhIGRlJ2NvbXBpbGF0aW9uLiAgQXVjdW5lIHBhcnRpZSBkZSBjZSBwcm9kdWl0IG91IGRlIHNhIGRvY3VtZW50YXRpb24KLWFzc29jaWUnZSBuZSBwZXV0IGVedHJlIHJlcHJvZHVpdGUgc291cyBhdWN1bmUgZm9ybWUsIHBhciBxdWVscXVlIG1veWVuIAotcXVlIGNlIHNvaXQsIHNhbnMgbCdhdXRvcmlzYXRpb24gcHJlJ2FsYWJsZSBldCBlJ2NyaXRlIGRlIFN1biBldCBkZSBzZXMgCi1iYWlsbGV1cnMgZGUgbGljZW5jZSwgcydpbCB5IGVuIGEuICAKLQotTGUgbG9naWNpZWwgZGUndGVudSBwYXIgZGVzIHRpZXJzLCBldCBxdWkgY29tcHJlbmQgbGEgdGVjaG5vbG9naWUgCi1yZWxhdGl2ZSBhdXggcG9saWNlcyBkZSBjYXJhY3RlYHJlcywgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IAotZXQgbGljZW5jaWUnIHBhciBkZXMgZm91cm5pc3NldXJzIGRlIFN1bi4KLSAKLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgbGUgbG9nbyBTdW4sIFNvbGFyaXMsIEphdmEsIEphdmFTZXJ2ZXIgUGFnZXMsIEphdmEgCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsIEpEQkMsIEpESywgSmF2YU1haWwsIGV0IEVudGVycHJpc2UgSmF2YUJlYW5zLCAgCi1zb250IGRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzIGRlJ3Bvc2UnZXMgZGUgU3VuIAotTWljcm9zeXN0ZW1zLCBJbmMuIGF1eCBFdGF0cy1VbmlzIGV0IGRhbnMgZCdhdXRyZXMgcGF5cy4KLSAKLVRvdXRlcyBsZXMgbWFycXVlcyBTUEFSQyBzb250IHV0aWxpc2UnZXMgc291cyBsaWNlbmNlIGV0IHNvbnQKLWRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzIGRlJ3Bvc2UnZXMgZGUgU1BBUkMKLUludGVybmF0aW9uYWwsIEluYy4gYXV4IEV0YXRzLVVuaXMgZXQgIGRhbnMKLWQnYXV0cmVzIHBheXMuIExlcyBwcm9kdWl0cyBwb3J0YW50IGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQKLWJhc2UncyBzdXIgdW5lIGFyY2hpdGVjdHVyZSBkZSd2ZWxvcHBlJ2UgcGFyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIAotCi1Qb3N0Y3JpcHQgZXN0IHVuZSBtYXJxdWUgZW5yZWdpc3RyZSdlIGQnQWRvYmUgU3lzdGVtcyBJbmMuIAotIAotTEEgRE9DVU1FTlRBVElPTiBFU1QgRk9VUk5JRSAiRU4gTCdFVEFUIiBFVCBUT1VURVMgQVVUUkVTIENPTkRJVElPTlMsCi1ERUNMQVJBVElPTlMgRVQgR0FSQU5USUVTIEVYUFJFU1NFUyBPVSBUQUNJVEVTIFNPTlQgRk9STUVMTEVNRU5UIEVYQ0xVRVMsCi1EQU5TIExBIE1FU1VSRSBBVVRPUklTRUUgUEFSIExBIExPSSBBUFBMSUNBQkxFLCBZIENPTVBSSVMgTk9UQU1NRU5UCi1UT1VURSBHQVJBTlRJRSBJTVBMSUNJVEUgUkVMQVRJVkUgQSBMQSBRVUFMSVRFIE1BUkNIQU5ERSwgQSBMJ0FQVElUVURFCi1BIFVORSBVVElMSVNBVElPTiBQQVJUSUNVTElFUkUgT1UgQSBMJ0FCU0VOQ0UgREUgQ09OVFJFRkFDT04uCi0tLT4KLQotPCEtLQotVGhlIGFwcGxpY2F0aW9uLWNsaWVudCBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYW4gYXBwbGljYXRpb24gY2xpZW50Ci1kZXBsb3ltZW50IGRlc2NyaXB0b3IuCi1UaGUgYXBwbGljYXRpb24gY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvciBkZXNjcmliZXMgdGhlIEVKQiBjb21wb25lbnRzIGFuZAotZXh0ZXJuYWwgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudC4KLS0tPgotPCFFTEVNRU5UIGFwcGxpY2F0aW9uLWNsaWVudCAoaWNvbj8sIGRpc3BsYXktbmFtZSwgZGVzY3JpcHRpb24/LCBlbnYtZW50cnkqLAotZWpiLXJlZiosIHJlc291cmNlLXJlZiopPgotCi08IS0tCi1UaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4KLVRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZQotYXBwbGljYXRpb24tY2xpZW50IGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlCi1hcHBsaWNhdGlvbi1jbGllbnQgZmlsZSAoaS5lLiwgdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieQotdGhlIGFwcGxpY2F0aW9uLWNsaWVudCBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24gd2hlbgotcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgZGVzY3JpcHRpb24uCi0tLT4KLTwhRUxFTUVOVCBkZXNjcmlwdGlvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBkaXNwbGF5ZWQKLWJ5IHRvb2xzLgotLS0+Ci08IUVMRU1FTlQgZGlzcGxheS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgZWpiLXJlZiBlbGVtZW50IHRvIHNwZWNpZnkgdGhhdCBhbiBFSkIKLXJlZmVyZW5jZSBpcyBsaW5rZWQgdG8gYW4gZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBlbmNvbXBhc3NpbmcgSjJFRSBBcHBsaWNhdGlvbgotcGFja2FnZS4gVGhlIHZhbHVlIG9mIHRoZSBlamItbGluayBlbGVtZW50IG11c3QgYmUgdGhlIGVqYi1uYW1lIG9mIGFuIGVudGVycHJpc2UKLWJlYW4gaW4gdGhlIHNhbWUgSjJFRSBBcHBsaWNhdGlvbiBwYWNrYWdlLiBVc2VkIGluOiBlamItcmVmCi1FeGFtcGxlOiA8ZWpiLWxpbms+RW1wbG95ZWVSZWNvcmQ8L2VqYi1saW5rPgotLS0+Ci08IUVMRU1FTlQgZWpiLWxpbmsgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLXJlZiBlbGVtZW50IGlzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlCi1iZWFuJ3MgaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyB0aGUgRUpCCi1yZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mIHRoZSByZWZlcmVuY2luZyBhcHBsaWNhdGlvbiBjbGllbnQ7IHRoZQotZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW47IHRoZSBleHBlY3RlZCBob21lIGFuZCByZW1vdGUKLWludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuOyBhbmQgYW4gb3B0aW9uYWwgZWpiLWxpbmsKLWluZm9ybWF0aW9uLiBUaGUgb3B0aW9uYWwgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlZmVyZW5jZWQKLWVudGVycHJpc2UgYmVhbi4KLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYgKGRlc2NyaXB0aW9uPywgZWpiLXJlZi1uYW1lLCBlamItcmVmLXR5cGUsIGhvbWUsIHJlbW90ZSwKLWVqYi1saW5rPyk+Ci0KLTwhLS0KLVRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIgcmVmZXJlbmNlLiBUaGUgRUpCCi1yZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50LiBJdCBpcyByZWNvbW1lbmRlZAotdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLiBVc2VkIGluOiBlamItcmVmCi1FeGFtcGxlOiA8ZWpiLXJlZi1uYW1lPmVqYi9QYXlyb2xsPC9lamItcmVmLW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBlamItcmVmLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZQotYmVhbi4gVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci08ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci1Vc2VkIGluOiBlamItcmVmCi0tLT4KLTwhRUxFTUVOVCBlamItcmVmLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzCi1lbnZpcm9ubWVudCBlbnRyaWVzLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZQotbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGFuZCBhbiBvcHRpb25hbCB2YWx1ZS4KLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeSAoZGVzY3JpcHRpb24/LCBlbnYtZW50cnktbmFtZSwgZW52LWVudHJ5LXR5cGUsCi1lbnYtZW50cnktdmFsdWU/KT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gYXBwbGljYXRpb24gY2xpZW50J3MKLWVudmlyb25tZW50IGVudHJ5LiBVc2VkIGluOiBlbnYtZW50cnkKLUV4YW1wbGU6IDxlbnYtZW50cnktbmFtZT5FbXBsb3llZUFwcERCPC9lbnYtZW50cnktbmFtZT4KLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgb2YgdGhlCi1lbnZpcm9ubWVudCBlbnRyeSB2YWx1ZSB0aGF0IGlzIGV4cGVjdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQncyBjb2RlLiBUaGUKLWZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBlbnYtZW50cnktdHlwZTogamF2YS5sYW5nLkJvb2xlYW4sCi1qYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuSW50ZWdlciwgamF2YS5sYW5nLkRvdWJsZSwgamF2YS5sYW5nLkJ5dGUsCi1qYXZhLmxhbmcuU2hvcnQsIGphdmEubGFuZy5Mb25nLCBhbmQgamF2YS5sYW5nLkZsb2F0LgotCi1Vc2VkIGluOiBlbnYtZW50cnkKLQotRXhhbXBsZToKLTxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnktdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYW4gYXBwbGljYXRpb24gY2xpZW50J3MKLWVudmlyb25tZW50IGVudHJ5LiBUaGUgdmFsdWUgbXVzdCBiZSBhIFN0cmluZyB0aGF0IGlzIHZhbGlkIGZvciB0aGUgY29uc3RydWN0b3IKLW9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0aGF0IHRha2VzIGEgc2luZ2xlIFN0cmluZyBwYXJhbWV0ZXIuCi0KLVVzZWQgaW46IGVudi1lbnRyeQotCi1FeGFtcGxlOgotPGVudi1lbnRyeS12YWx1ZT4vZGF0YXNvdXJjZXMvTXlEYXRhYmFzZTwvZW52LWVudHJ5LXZhbHVlPgotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5LXZhbHVlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGhvbWUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUKLWludGVyZmFjZS4KLVVzZWQgaW46IGVqYi1yZWYKLUV4YW1wbGU6IDxob21lPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxIb21lPC9ob21lPgotLS0+Ci08IUVMRU1FTlQgaG9tZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBpY29uIGVsZW1lbnQgY29udGFpbnMgYSBzbWFsbC1pY29uIGFuZCBsYXJnZS1pY29uIGVsZW1lbnQgd2hpY2ggc3BlY2lmeSB0aGUKLVVSSXMgZm9yIGEgc21hbGwgYW5kIGEgbGFyZ2UgR0lGIG9yIEpQRUcgaWNvbiBpbWFnZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUKLWFwcGxpY2F0aW9uIGNsaWVudCBpbiBhIEdVSSB0b29sLgotLS0+Ci08IUVMRU1FTlQgaWNvbiAoc21hbGwtaWNvbj8sIGxhcmdlLWljb24/KT4KLQotPCEtLQotVGhlIGxhcmdlLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUgY29udGFpbmluZyBhIGxhcmdlICgzMiB4IDMyKQotaWNvbiBpbWFnZS4gVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBhcHBsaWNhdGlvbi1jbGllbnQgamFyCi1maWxlLiBUaGUgaW1hZ2UgbXVzdCBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdCwgYW5kIHRoZSBmaWxlIG5hbWUgbXVzdAotZW5kIHdpdGggdGhlIHN1ZmZpeCAiLmpwZyIgb3IgIi5naWYiIHJlc3BlY3RpdmVseS4gVGhlIGljb24gY2FuIGJlIHVzZWQgYnkKLXRvb2xzLgotRXhhbXBsZToKLTxsYXJnZS1pY29uPmxpYi9pbWFnZXMvZW1wbG95ZWUtc2VydmljZS1pY29uMzJ4MzIuanBnPC9sYXJnZS1pY29uPgotLS0+Ci08IUVMRU1FTlQgbGFyZ2UtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzCi1yZW1vdGUgaW50ZXJmYWNlLgotVXNlZCBpbjogZWpiLXJlZgotRXhhbXBsZToKLTxyZW1vdGU+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZTwvcmVtb3RlPgotLS0+Ci08IUVMRU1FTlQgcmVtb3RlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1hdXRoIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlIHNpZ25zIG9uCi1wcm9ncmFtbWF0aWNhbGx5IHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyLCBvciB3aGV0aGVyIHRoZSBDb250YWluZXIgd2lsbCBzaWduIG9uCi10byB0aGUgcmVzb3VyY2UgbWFuYWdlciBvbiBiZWhhbGYgb2YgdGhlIGJlYW4uIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIENvbnRhaW5lcgotdXNlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHN1cHBsaWVkIGJ5IHRoZSBEZXBsb3llci4KLVRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci08cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0tLT4KLTwhRUxFTUVOVCByZXMtYXV0aCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGZhY3RvcnkgcmVmZXJlbmNlCi1uYW1lLiBUaGUgcmVzb3VyY2UgZmFjdG9yeSByZWZlcmVuY2UgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24KLWNsaWVudCdzIGVudmlyb25tZW50IGVudHJ5IHdob3NlIHZhbHVlIGNvbnRhaW5zIHRoZSBKTkRJIG5hbWUgb2YgdGhlIGRhdGEKLXNvdXJjZS4KLVVzZWQgaW46IHJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzLXJlZi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhIHNvdXJjZS4gVGhlIHR5cGUgaXMKLXNwZWNpZmllZCBieSB0aGUgSmF2YSBpbnRlcmZhY2UgKG9yIGNsYXNzKSBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUKLWRhdGEgc291cmNlLgotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXNvdXJjZS1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGFwcGxpY2F0aW9uIGNsaWVudHMncwotcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHJlc291cmNlLiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlCi1yZXNvdXJjZSBmYWN0b3J5IHJlZmVyZW5jZSBuYW1lLCB0aGUgaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZmFjdG9yeSB0eXBlCi1leHBlY3RlZCBieSB0aGUgYXBwbGljYXRpb24gY2xpZW50J3MgY29kZSwgYW5kIHRoZSB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uIChiZWFuCi1vciBjb250YWluZXIpLgotCi1FeGFtcGxlOgotPHJlc291cmNlLXJlZj4KLTxyZXMtcmVmLW5hbWU+RW1wbG95ZWVBcHBEQjwvcmVzLXJlZi1uYW1lPgotPHJlcy10eXBlPmphdmF4LnNxbC5EYXRhU291cmNlPC9yZXMtdHlwZT4KLTxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotPC9yZXNvdXJjZS1yZWY+Ci0tLT4KLTwhRUxFTUVOVCByZXNvdXJjZS1yZWYgKGRlc2NyaXB0aW9uPywgcmVzLXJlZi1uYW1lLCByZXMtdHlwZSwgcmVzLWF1dGgpPgotPCEtLQotVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUgY29udGFpbmluZyBhIHNtYWxsICgxNiB4IDE2KQotaWNvbiBpbWFnZS4gVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBhcHBsaWNhdGlvbi1jbGllbnQgamFyCi1maWxlLiBUaGUgaW1hZ2UgbXVzdCBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdCwgYW5kIHRoZSBmaWxlIG5hbWUgbXVzdAotZW5kIHdpdGggdGhlIHN1ZmZpeCAiLmpwZyIgb3IgIi5naWYiIHJlc3BlY3RpdmVseS4gVGhlIGljb24gY2FuIGJlIHVzZWQgYnkKLXRvb2xzLgotRXhhbXBsZToKLTxzbWFsbC1pY29uPmxpYi9pbWFnZXMvZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnPC9zbWFsbC1pY29uPgotLS0+Ci08IUVMRU1FTlQgc21hbGwtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBJRCBtZWNoYW5pc20gaXMgdG8gYWxsb3cgdG9vbHMgdG8gZWFzaWx5IG1ha2UgdG9vbC1zcGVjaWZpYyByZWZlcmVuY2VzIHRvCi10aGUgZWxlbWVudHMgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLSAtLT4KLTwhQVRUTElTVCBhcHBsaWNhdGlvbi1jbGllbnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVzY3JpcHRpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGlzcGxheS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1saW5rIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZi1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWYtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnkgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5LXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5LXZhbHVlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGhvbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsYXJnZS1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbW90ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtYXV0aCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzb3VyY2UtcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNtYWxsLWljb24gaWQgSUQgI0lNUExJRUQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF8xXzMuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbi1jbGllbnRfMV8zLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlkNDU2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF8xXzMuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsNTA2ICswLDAgQEAKLTwhLS0KLUNvcHlyaWdodCAoYykgMjAwMCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLAotOTAxIFNhbiBBbnRvbmlvIFJvYWQsCi1QYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyByZWxhdGluZyB0bwotdGVjaG5vbG9neSBlbWJvZGllZCBpbiB0aGUgcHJvZHVjdCB0aGF0IGlzIGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LgotSW4gcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cyBsaXN0ZWQgYXQKLWh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZSBhZGRpdGlvbmFsIHBhdGVudHMgb3IKLXBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUgVS5TLiBhbmQgaW4gb3RoZXIgY291bnRyaWVzLgotCi1UaGlzIGRvY3VtZW50IGFuZCB0aGUgcHJvZHVjdCB0byB3aGljaCBpdCBwZXJ0YWlucyBhcmUgZGlzdHJpYnV0ZWQKLXVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywgZGlzdHJpYnV0aW9uLCBhbmQKLWRlY29tcGlsYXRpb24uICBUaGlzIGRvY3VtZW50IG1heSBiZSByZXByb2R1Y2VkIGFuZCBkaXN0cmlidXRlZCBidXQgbWF5Ci1ub3QgYmUgY2hhbmdlZCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cwotbGljZW5zb3JzLCBpZiBhbnkuCi0KLVRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcyBjb3B5cmlnaHRlZCBhbmQKLWxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotU3VuLCAgU3VuIE1pY3Jvc3lzdGVtcywgIHRoZSBTdW4gbG9nbywgIEphdmEsICBKYXZhU2VydmVyIFBhZ2VzLCAgSmF2YQotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCAgSkRCQywgIEpESywgIEphdmFNYWlsIGFuZCAgYW5kCi1FbnRlcnByaXNlIEphdmFCZWFucyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi1NaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzIFN1YmplY3QgdG8KLVN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLURPQ1VNRU5UQVRJT04gSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQUxMIEVYUFJFU1MgT1IgSU1QTElFRAotQ09ORElUSU9OUywgUkVQUkVTRU5UQVRJT05TIEFORCBXQVJSQU5USUVTLCBJTkNMVURJTkcgQU5ZIElNUExJRUQKLVdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIE9SCi1OT04tSU5GUklOR0VNRU5ULCBBUkUgRElTQ0xBSU1FRCwgRVhDRVBUIFRPIFRIRSBFWFRFTlQgVEhBVCBTVUNICi1ESVNDTEFJTUVSUyBBUkUgSEVMRCBUTyBCRSBMRUdBTExZIElOVkFMSUQuCi0KLQotX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi1Db3B5cmlnaHQgKGMpIDIwMDAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwKLTkwMSBTYW4gQW50b25pbyBSb2FkLAotUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBFJ3RhdHMtVW5pcy4KLVRvdXMgZHJvaXRzIHJlJ3NlcnZlJ3MuCi0KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gYSBsZXMgZHJvaXRzIGRlIHByb3ByaWUndGUnIGludGVsbGVjdHVlbHMKLXJlbGF0YW50cyBhYCBsYSB0ZWNobm9sb2dpZSBpbmNvcnBvcmUnZSBkYW5zIGxlIHByb2R1aXQgcXVpIGVzdCBkZSdjcml0Ci1kYW5zIGNlIGRvY3VtZW50LiBFbiBwYXJ0aWN1bGllciwgZXQgc2FucyBsYSBsaW1pdGF0aW9uLCBjZXMgZHJvaXRzIGRlCi1wcm9wcmllJ3RlJyBpbnRlbGxlY3R1ZWxzIHBldXZlbnQgaW5jbHVyZSB1biBvdSBwbHVzIGRlcyBicmV2ZXRzCi1hbWUncmljYWlucyBlJ251bWUncmUncyBhYCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBldCB1biBvdSBsZXMKLWJyZXZldHMgcGx1cyBzdXBwbGUnbWVudGFpcmVzIG91IGxlcyBhcHBsaWNhdGlvbnMgZGUgYnJldmV0IGVuIGF0dGVudGUKLWRhbnMgbGVzIEUndGF0cy1VbmlzIGV0IGRhbnMgbGVzIGF1dHJlcyBwYXlzLgotCi1DZSBwcm9kdWl0IG91IGRvY3VtZW50IGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodCBldCBkaXN0cmlidWUnCi1hdmVjIGRlcyBsaWNlbmNlcyBxdWkgZW4gcmVzdHJlaWduZW50IGwndXRpbGlzYXRpb24sIGxhIGNvcGllLCBsYQotZGlzdHJpYnV0aW9uLCBldCBsYSBkZSdjb21waWxhdGlvbi4gIENlIGRvY3VtZW50aW9uIGFzc29jaWUgbiBwZXV0Ci1lXnRyZSByZXByb2R1aXRlIGV0IGRpc3RyaWJ1ZXIsIHBhciBxdWVscXVlIG1veWVuIHF1ZSBjZSBzb2l0LCBzYW5zCi1sJ2F1dG9yaXNhdGlvbiBwcmUnYWxhYmxlIGV0IGUnY3JpdGUgZGUgU3VuIGV0IGRlIHNlcyBiYWlsbGV1cnMgZGUKLWxpY2VuY2UsIGxlIGNhcyBlJ2NoZSdhbnQuCi0KLUxlIGxvZ2ljaWVsIGRlJ3RlbnUgcGFyIGRlcyB0aWVycywgZXQgcXVpIGNvbXByZW5kIGxhIHRlY2hub2xvZ2llCi1yZWxhdGl2ZSBhdXggcG9saWNlcyBkZSBjYXJhY3RlYHJlcywgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IGV0Ci1saWNlbmNpZScgcGFyIGRlcyBmb3Vybmlzc2V1cnMgZGUgU3VuLgotCi1TdW4sICBTdW4gTWljcm9zeXN0ZW1zLCAgbGUgbG9nbyBTdW4sICBKYXZhLCAgSmF2YVNlcnZlciBQYWdlcywgIEphdmEKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgIEpEQkMsICBKREssICBKYXZhTWFpbCBldCAgYW5kCi1FbnRlcnByaXNlIEphdmFCZWFucyBzb250IGRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzCi1kZSdwb3NlJ2VzIGRlIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYXV4IEUndGF0cy1VbmlzIGV0IGRhbnMgZCdhdXRyZXMKLXBheXMuCi0KLUxBIERPQ1VNRU5UQVRJT04gRVNUIEZPVVJOSUUgIkVOIEwnRSdUQVQiIEVUIFRPVVRFUyBBVVRSRVMgQ09ORElUSU9OUywKLURFQ0xBUkFUSU9OUyBFVCBHQVJBTlRJRVMgRVhQUkVTU0VTIE9VIFRBQ0lURVMgU09OVCBGT1JNRUxMRU1FTlQKLUVYQ0xVRVMsIERBTlMgTEEgTUVTVVJFIEFVVE9SSVNFRSBQQVIgTEEgTE9JIEFQUExJQ0FCTEUsIFkgQ09NUFJJUwotTk9UQU1NRU5UIFRPVVRFIEdBUkFOVElFIElNUExJQ0lURSBSRUxBVElWRSBBIExBIFFVQUxJVEUgTUFSQ0hBTkRFLCBBCi1MJ0FQVElUVURFIEEgVU5FIFVUSUxJU0FUSU9OIFBBUlRJQ1VMSUVSRSBPVSBBIEwnQUJTRU5DRSBERQotQ09OVFJFRkFDLE9OLgotLS0+Ci0KLTwhLS0KLVRoaXMgaXMgdGhlIFhNTCBEVEQgZm9yIHRoZSBKMkVFIDEuMyBhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudAotZGVzY3JpcHRvci4gIEFsbCBKMkVFIDEuMyBhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9ycwotbXVzdCBpbmNsdWRlIGEgRE9DVFlQRSBvZiB0aGUgZm9sbG93aW5nIGZvcm06Ci0KLSAgPCFET0NUWVBFIGFwcGxpY2F0aW9uLWNsaWVudCBQVUJMSUMKLQkiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gQ2xpZW50IDEuMy8vRU4iCi0JImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uLWNsaWVudF8xXzMuZHRkIj4KLQotLS0+Ci0KLTwhLS0KLVRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi1lbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IGNvbnRhaW4gUENEQVRBLCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlCi0gIGluIHRoZSBkYXRhIG1heSBiZSBpZ25vcmVkLgotCi0tIEluIGVsZW1lbnRzIHdob3NlIHZhbHVlIGlzIGFuICJlbnVtZXJhdGVkIHR5cGUiLCB0aGUgdmFsdWUgaXMKLSAgY2FzZSBzZW5zaXRpdmUuCi0KLS0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUgc2FtZQotICBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3Qgc3RhcnRpbmcgd2l0aCAiLyIpCi0gIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4KLSAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5Ci0gIG5hbWVzIGluIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlCi0gIG5hbWVzIGFyZSBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgc2VydmxldCBBUEkuCi0tLT4KLQotCi08IS0tCi1UaGUgYXBwbGljYXRpb24tY2xpZW50IGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbiBhcHBsaWNhdGlvbgotY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoZSBhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudAotZGVzY3JpcHRvciBkZXNjcmliZXMgdGhlIEVKQiBjb21wb25lbnRzIGFuZCBleHRlcm5hbCByZXNvdXJjZXMKLXJlZmVyZW5jZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudC4KLS0tPgotPCFFTEVNRU5UIGFwcGxpY2F0aW9uLWNsaWVudCAoaWNvbj8sIGRpc3BsYXktbmFtZSwgZGVzY3JpcHRpb24/LAotCQllbnYtZW50cnkqLCBlamItcmVmKiwgcmVzb3VyY2UtcmVmKiwgcmVzb3VyY2UtZW52LXJlZiosCi0JCWNhbGxiYWNrLWhhbmRsZXI/KT4KLQotPCEtLQotVGhlIGNhbGxiYWNrLWhhbmRsZXIgZWxlbWVudCBuYW1lcyBhIGNsYXNzIHByb3ZpZGVkIGJ5IHRoZQotYXBwbGljYXRpb24uICBUaGUgY2xhc3MgbXVzdCBoYXZlIGEgbm8gYXJncyBjb25zdHJ1Y3RvciBhbmQgbXVzdAotaW1wbGVtZW50IHRoZSBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrSGFuZGxlciBpbnRlcmZhY2UuCi1UaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBjb250YWluZXIgYW5kCi11c2VkIGJ5IHRoZSBjb250YWluZXIgdG8gY29sbGVjdCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZQotdXNlci4KLQotVXNlZCBpbjogYXBwbGljYXRpb24tY2xpZW50Ci0tLT4KLTwhRUxFTUVOVCBjYWxsYmFjay1oYW5kbGVyICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50Ci1lbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQKLXRoZSBhcHBsaWNhdGlvbiBjbGllbnQgamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YKLXRoZSBhcHBsaWNhdGlvbiBjbGllbnQgamFyIGZpbGUgKGkuZS4sIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzCi11c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgamFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbgotd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbi4KLQotVXNlZCBpbjogYXBwbGljYXRpb24tY2xpZW50LCBlamItcmVmLCBlbnYtZW50cnksIHJlc291cmNlLWVudi1yZWYsCi1yZXNvdXJjZS1yZWYKLS0tPgotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCi1kaXNwbGF5ZWQgYnkgdG9vbHMuICBUaGUgZGlzcGxheSBuYW1lIG5lZWQgbm90IGJlIHVuaXF1ZS4KLQotVXNlZCBpbjogYXBwbGljYXRpb24tY2xpZW50Ci0KLUV4YW1wbGU6Ci0KLTxkaXNwbGF5LW5hbWU+RW1wbG95ZWUgU2VsZiBTZXJ2aWNlPC9kaXNwbGF5LW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBkaXNwbGF5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBlamItcmVmIGVsZW1lbnQKLXRvIHNwZWNpZnkgdGhhdCBhbiBFSkIgcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBhbgotZW50ZXJwcmlzZSBiZWFuLgotCi1UaGUgbmFtZSBpbiB0aGUgZWpiLWxpbmsgZWxlbWVudCBpcyBjb21wb3NlZCBvZiBhCi1wYXRoIG5hbWUgc3BlY2lmeWluZyB0aGUgZWpiLWphciBjb250YWluaW5nIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UKLWJlYW4gd2l0aCB0aGUgZWpiLW5hbWUgb2YgdGhlIHRhcmdldCBiZWFuIGFwcGVuZGVkIGFuZCBzZXBhcmF0ZWQgZnJvbQotdGhlIHBhdGggbmFtZSBieSAiIyIuICBUaGUgcGF0aCBuYW1lIGlzIHJlbGF0aXZlIHRvIHRoZSBqYXIgZmlsZQotY29udGFpbmluZyB0aGUgYXBwbGljYXRpb24gY2xpZW50IHRoYXQgaXMgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbi4KLVRoaXMgYWxsb3dzIG11bHRpcGxlIGVudGVycHJpc2UgYmVhbnMgd2l0aCB0aGUgc2FtZSBlamItbmFtZSB0byBiZQotdW5pcXVlbHkgaWRlbnRpZmllZC4KLQotVXNlZCBpbjogZWpiLXJlZgotCi1FeGFtcGxlczoKLQotCTxlamItbGluaz5FbXBsb3llZVJlY29yZDwvZWpiLWxpbms+Ci0KLQk8ZWpiLWxpbms+Li4vcHJvZHVjdHMvcHJvZHVjdC5qYXIjUHJvZHVjdEVKQjwvZWpiLWxpbms+Ci0KLS0tPgotPCFFTEVNRU5UIGVqYi1saW5rICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1yZWYgZWxlbWVudCBpcyB1c2VkIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8KLWFuIGVudGVycHJpc2UgYmVhbidzIGhvbWUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLQotCS0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQktIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZgotCSAgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbgotCS0gdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0JLSB0aGUgZXhwZWN0ZWQgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMgb2YgdGhlIHJlZmVyZW5jZWQKLQkgIGVudGVycHJpc2UgYmVhbgotCS0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVmZXJlbmNlZAotCSAgZW50ZXJwcmlzZSBiZWFuCi0KLVVzZWQgaW46IGFwcGxpY2F0aW9uLWNsaWVudAotLS0+Ci08IUVMRU1FTlQgZWpiLXJlZiAoZGVzY3JpcHRpb24/LCBlamItcmVmLW5hbWUsIGVqYi1yZWYtdHlwZSwKLQkJaG9tZSwgcmVtb3RlLCBlamItbGluaz8pPgotCi08IS0tCi1UaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCIHJlZmVyZW5jZS4gVGhlCi1FSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQncyBlbnZpcm9ubWVudCBhbmQgaXMKLXJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotd2l0aGluIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQuCi0KLUl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotVXNlZCBpbjogZWpiLXJlZgotCi1FeGFtcGxlOgotCi08ZWpiLXJlZi1uYW1lPmVqYi9QYXlyb2xsPC9lamItcmVmLW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBlamItcmVmLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlCi1yZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4KLQotVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLQk8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotCTxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotCi1Vc2VkIGluOiBlamItcmVmCi0tLT4KLTwhRUxFTUVOVCBlamItcmVmLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5IGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzCi1lbnZpcm9ubWVudCBlbnRyeS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbiwgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LCBhbmQgYW4gb3B0aW9uYWwKLXZhbHVlLiAgSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkLCBvbmUgbXVzdCBiZSBzdXBwbGllZAotZHVyaW5nIGRlcGxveW1lbnQuCi0KLVVzZWQgaW46IGFwcGxpY2F0aW9uLWNsaWVudAotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5IChkZXNjcmlwdGlvbj8sIGVudi1lbnRyeS1uYW1lLCBlbnYtZW50cnktdHlwZSwKLQkJZW52LWVudHJ5LXZhbHVlPyk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIGFwcGxpY2F0aW9uIGNsaWVudCdzCi1lbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotVXNlZCBpbjogZW52LWVudHJ5Ci0KLUV4YW1wbGU6Ci0KLTxlbnYtZW50cnktbmFtZT5taW5BbW91bnQ8L2Vudi1lbnRyeS1uYW1lPgotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBvZgotdGhlIGVudmlyb25tZW50IGVudHJ5IHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCdzCi1jb2RlLgotCi1UaGUgZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGVudi1lbnRyeS10eXBlOgotCi0JamF2YS5sYW5nLkJvb2xlYW4KLQlqYXZhLmxhbmcuQnl0ZQotCWphdmEubGFuZy5DaGFyYWN0ZXIKLQlqYXZhLmxhbmcuU3RyaW5nCi0JamF2YS5sYW5nLlNob3J0Ci0JamF2YS5sYW5nLkludGVnZXIKLQlqYXZhLmxhbmcuTG9uZwotCWphdmEubGFuZy5GbG9hdAotCWphdmEubGFuZy5Eb3VibGUKLQotCi1Vc2VkIGluOiBlbnYtZW50cnkKLQotRXhhbXBsZToKLQotPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeS10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQncwotZW52aXJvbm1lbnQgZW50cnkuIFRoZSB2YWx1ZSBtdXN0IGJlIGEgU3RyaW5nIHRoYXQgaXMgdmFsaWQgZm9yIHRoZQotY29uc3RydWN0b3Igb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRoYXQgdGFrZXMgYSBzaW5nbGUgU3RyaW5nCi1wYXJhbWV0ZXIsIG9yIGZvciBqYXZhLmxhbmcuQ2hhcmFjdGVyLCBhIHNpbmdsZSBjaGFyYWN0ZXIuCi0KLVVzZWQgaW46IGVudi1lbnRyeQotCi1FeGFtcGxlOgotCi08ZW52LWVudHJ5LXZhbHVlPjEwMC4wMDwvZW52LWVudHJ5LXZhbHVlPgotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5LXZhbHVlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGhvbWUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UKLWJlYW4ncyBob21lIGludGVyZmFjZS4KLQotVXNlZCBpbjogZWpiLXJlZgotCi1FeGFtcGxlOgotCi08aG9tZT5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsSG9tZTwvaG9tZT4KLS0tPgotPCFFTEVNRU5UIGhvbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaWNvbiBlbGVtZW50IGNvbnRhaW5zIHNtYWxsLWljb24gYW5kIGxhcmdlLWljb24gZWxlbWVudHMgdGhhdAotc3BlY2lmeSB0aGUgZmlsZSBuYW1lcyBmb3Igc21hbGwgYW5kIGEgbGFyZ2UgR0lGIG9yIEpQRUcgaWNvbiBpbWFnZXMKLXVzZWQgdG8gcmVwcmVzZW50IHRoZSBwYXJlbnQgZWxlbWVudCBpbiBhIEdVSSB0b29sLgotCi1Vc2VkIGluOiBhcHBsaWNhdGlvbi1jbGllbnQKLS0tPgotPCFFTEVNRU5UIGljb24gKHNtYWxsLWljb24/LCBsYXJnZS1pY29uPyk+Ci0KLTwhLS0KLVRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi1jb250YWluaW5nIGEgbGFyZ2UgKDMyIHggMzIpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi1uYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uIGNsaWVudCdzCi1qYXIgZmlsZS4KLQotVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4KLVRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCi1Vc2VkIGluOiBpY29uCi0KLUV4YW1wbGU6Ci0KLTxsYXJnZS1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZzwvbGFyZ2UtaWNvbj4KLS0tPgotPCFFTEVNRU5UIGxhcmdlLWljb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVtb3RlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRlcnByaXNlCi1iZWFuJ3MgcmVtb3RlIGludGVyZmFjZS4KLQotVXNlZCBpbjogZWpiLXJlZgotCi1FeGFtcGxlOgotCi08cmVtb3RlPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2U8L3JlbW90ZT4KLS0tPgotPCFFTEVNRU5UIHJlbW90ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtYXV0aCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgY29kZSBzaWducwotb24gcHJvZ3JhbW1hdGljYWxseSB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciwgb3Igd2hldGhlciB0aGUgQ29udGFpbmVyCi13aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIgb24gYmVoYWxmIG9mIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQuIEluIHRoZQotbGF0dGVyIGNhc2UsIHRoZSBDb250YWluZXIgdXNlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHN1cHBsaWVkIGJ5IHRoZQotRGVwbG95ZXIuCi0KLVRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQk8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotCTxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotCi1Vc2VkIGluOiByZXNvdXJjZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJlcy1hdXRoICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIHJlc291cmNlIG1hbmFnZXIKLWNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLWphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjbGllbnQuCi0KLVVzZWQgaW46IHJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzLXJlZi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1zaGFyaW5nLXNjb3BlIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgY29ubmVjdGlvbnMgb2J0YWluZWQKLXRocm91Z2ggdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBjYW4gYmUKLXNoYXJlZC4gVGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCwgaWYgc3BlY2lmaWVkLCBtdXN0IGJlIG9uZSBvZiB0aGUKLXR3byBmb2xsb3dpbmc6Ci0KLQk8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLQk8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotCi1UaGUgZGVmYXVsdCB2YWx1ZSBpcyBTaGFyZWFibGUuCi0KLVVzZWQgaW46IHJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzLXNoYXJpbmctc2NvcGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGRhdGEgc291cmNlLiBUaGUgdHlwZQotaXMgc3BlY2lmaWVkIGJ5IHRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSBsYW5ndWFnZSBjbGFzcyBvciBpbnRlcmZhY2UKLWV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkYXRhIHNvdXJjZS4KLQotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXNvdXJjZS1lbnYtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBjbGllbnQncwotcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UKLWluIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQncyBlbnZpcm9ubWVudC4gIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4KLWluZGljYXRpb24gb2YgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSB0eXBlIGV4cGVjdGVkIGJ5Ci10aGUgYXBwbGljYXRpb24gY2xpZW50IGNvZGUuCi0KLVVzZWQgaW46IGFwcGxpY2F0aW9uLWNsaWVudAotCi1FeGFtcGxlOgotCi08cmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZheC5qbXMuUXVldWU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLTwvcmVzb3VyY2UtZW52LXJlZj4KLS0tPgotPCFFTEVNRU5UIHJlc291cmNlLWVudi1yZWYgKGRlc2NyaXB0aW9uPywgcmVzb3VyY2UtZW52LXJlZi1uYW1lLAotCQlyZXNvdXJjZS1lbnYtcmVmLXR5cGUpPgotCi08IS0tCi1UaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgcmVzb3VyY2UKLWVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KLXRoZSBhcHBsaWNhdGlvbiBjbGllbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gYXBwbGljYXRpb24gY2xpZW50LgotCi1Vc2VkIGluOiByZXNvdXJjZS1lbnYtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXNvdXJjZS1lbnYtcmVmLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzb3VyY2UtZW52LXJlZi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIGEgcmVzb3VyY2UKLWVudmlyb25tZW50IHJlZmVyZW5jZS4gIEl0IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEKLWxhbmd1YWdlIGNsYXNzIG9yIGludGVyZmFjZS4KLQotVXNlZCBpbjogcmVzb3VyY2UtZW52LXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzb3VyY2UtZW52LXJlZi10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlc291cmNlLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYW4gYXBwbGljYXRpb24gY2xpZW50J3MKLXJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCByZXNvdXJjZS4gSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLWRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIG5hbWUsCi10aGUgaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgdHlwZQotZXhwZWN0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNsaWVudCBjb2RlLCB0aGUgdHlwZSBvZiBhdXRoZW50aWNhdGlvbgotKEFwcGxpY2F0aW9uIG9yIENvbnRhaW5lciksIGFuZCBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZQotc2hhcmVhYmlsaXR5IG9mIGNvbm5lY3Rpb25zIG9idGFpbmVkIGZyb20gdGhlIHJlc291cmNlIChTaGFyZWFibGUgb3IKLVVuc2hhcmVhYmxlKS4KLQotVXNlZCBpbjogYXBwbGljYXRpb24tY2xpZW50Ci0KLUV4YW1wbGU6Ci0KLSAgICA8cmVzb3VyY2UtcmVmPgotCTxyZXMtcmVmLW5hbWU+amRiYy9FbXBsb3llZUFwcERCPC9yZXMtcmVmLW5hbWU+Ci0JPHJlcy10eXBlPmphdmF4LnNxbC5EYXRhU291cmNlPC9yZXMtdHlwZT4KLQk8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLQk8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLS0tPgotPCFFTEVNRU5UIHJlc291cmNlLXJlZiAoZGVzY3JpcHRpb24/LCByZXMtcmVmLW5hbWUsIHJlcy10eXBlLCByZXMtYXV0aCwKLQkJcmVzLXNoYXJpbmctc2NvcGU/KT4KLQotPCEtLQotVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLWNvbnRhaW5pbmcgYSBzbWFsbCAoMTYgeCAxNikgaWNvbiBpbWFnZS4gVGhlIGZpbGUKLW5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgYXBwbGljYXRpb24gY2xpZW50J3MKLWphciBmaWxlLgotCi1UaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgotVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLVVzZWQgaW46IGljb24KLQotRXhhbXBsZToKLQotPHNtYWxsLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnPC9zbWFsbC1pY29uPgotLS0+Ci08IUVMRU1FTlQgc21hbGwtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBJRCBtZWNoYW5pc20gaXMgdG8gYWxsb3cgdG9vbHMgdGhhdCBwcm9kdWNlIGFkZGl0aW9uYWwgZGVwbG95bWVudAotaW5mb3JtYXRpb24gKGkuZS4sIGluZm9ybWF0aW9uIGJleW9uZCB0aGUgc3RhbmRhcmQgZGVwbG95bWVudAotZGVzY3JpcHRvciBpbmZvcm1hdGlvbikgdG8gc3RvcmUgdGhlIG5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbiBhCi1zZXBhcmF0ZSBmaWxlLCBhbmQgZWFzaWx5IHJlZmVyIGZyb20gdGhlc2UgdG9vbC1zcGVjaWZpYyBmaWxlcyB0byB0aGUKLWluZm9ybWF0aW9uIGluIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLVRvb2xzIGFyZSBub3QgYWxsb3dlZCB0byBhZGQgdGhlIG5vbi1zdGFuZGFyZCBpbmZvcm1hdGlvbiBpbnRvIHRoZQotc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotLS0+Ci0KLTwhQVRUTElTVCBhcHBsaWNhdGlvbi1jbGllbnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY2FsbGJhY2staGFuZGxlciBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZXNjcmlwdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLWxpbmsgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZi10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktdmFsdWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaG9tZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBpY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxhcmdlLWljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVtb3RlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1hdXRoIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtc2hhcmluZy1zY29wZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXNvdXJjZS1lbnYtcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc291cmNlLWVudi1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXNvdXJjZS1lbnYtcmVmLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzb3VyY2UtcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNtYWxsLWljb24gaWQgSUQgI0lNUExJRUQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbi1jbGllbnRfMV80LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4ODk3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotCSAgICB2ZXJzaW9uPSIxLjQiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWFwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkcwkxLjE3IDAyLzExLzAzCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLSAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLSAgICAgIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbCi0KLQlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgYXBwbGljYXRpb24gY2xpZW50IDEuNAotCWRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdAotCWJlIG5hbWVkICJNRVRBLUlORi9hcHBsaWNhdGlvbi1jbGllbnQueG1sIiBpbiB0aGUKLQlhcHBsaWNhdGlvbiBjbGllbnQncyBqYXIgZmlsZS4gIEFsbCBhcHBsaWNhdGlvbiBjbGllbnQKLQlkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUgdGhlIGFwcGxpY2F0aW9uCi0JY2xpZW50IHNjaGVtYSBieSB1c2luZyB0aGUgSjJFRSBuYW1lc3BhY2U6Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCi0KLQlhbmQgaW5kaWNhdGUgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotCXVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLQkgICAgPGFwcGxpY2F0aW9uLWNsaWVudCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkIgotCSAgICAgIHZlcnNpb249IjEuNCI+Ci0JICAgICAgLi4uCi0JICAgIDwvYXBwbGljYXRpb24tY2xpZW50PgotCi0JVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0JdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSjJFRQotCW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkCi0KLQldXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0JSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLQlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24tY2xpZW50IiB0eXBlPSJqMmVlOmFwcGxpY2F0aW9uLWNsaWVudFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhcHBsaWNhdGlvbi1jbGllbnQgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGFuCi0JYXBwbGljYXRpb24gY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoZSBhcHBsaWNhdGlvbgotCWNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZGVzY3JpYmVzIHRoZSBFSkIgY29tcG9uZW50cwotCWFuZCBleHRlcm5hbCByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGUgYXBwbGljYXRpb24KLQljbGllbnQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4KLQkgIGFwcGxpY2F0aW9uIGNsaWVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJCi0JICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0Ci0JICBiZSB1bmlxdWUgd2l0aGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnYtZW50cnkiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZW52LWVudHJ5LW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0JICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSBhcHBsaWNhdGlvbgotCSAgY2xpZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAgamF2YTpjb21wL2VudiBjb250ZXh0LiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlCi0JICBhcHBsaWNhdGlvbiBjbGllbnQuCi0KLQkgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9InJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLlRoZSBuYW1lCi0JICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0icmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YKLQkgIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCi0JICBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIGFwcGxpY2F0aW9uIGNsaWVudAotCSAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0JICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotCSAgYXBwbGljYXRpb24gY2xpZW50LgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLWVudi1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUKLQkgIG5hbWUgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0JICB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZQotCSAgYXBwbGljYXRpb24gY2xpZW50IGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lCi0JICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZQotCSAgd2l0aGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotICA8L3hzZDplbGVtZW50PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcHBsaWNhdGlvbi1jbGllbnRUeXBlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeSIKLQkJICAgdHlwZT0iajJlZTplbnYtZW50cnlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZiIKLQkJICAgdHlwZT0iajJlZTplamItcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6c2VydmljZS1yZWZHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLXJlZiIKLQkJICAgdHlwZT0iajJlZTpyZXNvdXJjZS1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZiIKLQkJICAgdHlwZT0iajJlZTpyZXNvdXJjZS1lbnYtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIgotCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhbGxiYWNrLWhhbmRsZXIiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGNhbGxiYWNrLWhhbmRsZXIgZWxlbWVudCBuYW1lcyBhIGNsYXNzIHByb3ZpZGVkIGJ5Ci0JICAgIHRoZSBhcHBsaWNhdGlvbi4gIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBubyBhcmdzCi0JICAgIGNvbnN0cnVjdG9yIGFuZCBtdXN0IGltcGxlbWVudCB0aGUKLQkgICAgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXIKLQkgICAgaW50ZXJmYWNlLiAgVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkIGJ5IHRoZQotCSAgICBhcHBsaWNhdGlvbiBjbGllbnQgY29udGFpbmVyIGFuZCB1c2VkIGJ5IHRoZSBjb250YWluZXIKLQkgICAgdG8gY29sbGVjdCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSB1c2VyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24iCi0JCSAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0JCSAgIGZpeGVkPSIxLjQiCi0JCSAgIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyAxLjQuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzUueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbi1jbGllbnRfNS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NDA4MjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbi1jbGllbnRfNS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjUiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWFwcGxpY2F0aW9uLWNsaWVudF81LnhzZHMJMS4yNiAwMi8xNy8wNgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICAgICAgVS5TLkEKLSAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVsKLQotCVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgNQotCWRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdAotCWJlIG5hbWVkICJNRVRBLUlORi9hcHBsaWNhdGlvbi1jbGllbnQueG1sIiBpbiB0aGUKLQlhcHBsaWNhdGlvbiBjbGllbnQncyBqYXIgZmlsZS4gIEFsbCBhcHBsaWNhdGlvbiBjbGllbnQKLQlkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUgdGhlIGFwcGxpY2F0aW9uCi0JY2xpZW50IHNjaGVtYSBieSB1c2luZyB0aGUgSmF2YSBFRSBuYW1lc3BhY2U6Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLQotCWFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0JdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8YXBwbGljYXRpb24tY2xpZW50IHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotCQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb24tY2xpZW50XzUueHNkIgotCSAgICAgIHZlcnNpb249IjUiPgotCSAgICAgIC4uLgotCSAgICA8L2FwcGxpY2F0aW9uLWNsaWVudD4KLQotCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgotCXRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIEphdmEgRUUKLQluYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uLWNsaWVudF81LnhzZAotCi0JXV0+Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKYXZhIEVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLQlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0JcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iamF2YWVlXzUueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbi1jbGllbnQiIHR5cGU9ImphdmFlZTphcHBsaWNhdGlvbi1jbGllbnRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYXBwbGljYXRpb24tY2xpZW50IGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbgotCWFwcGxpY2F0aW9uIGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBUaGUgYXBwbGljYXRpb24KLQljbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yIGRlc2NyaWJlcyB0aGUgRUpCIGNvbXBvbmVudHMKLQlhbmQgZXh0ZXJuYWwgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhlIGFwcGxpY2F0aW9uCi0JY2xpZW50LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJlbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuCi0JICBhcHBsaWNhdGlvbiBjbGllbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotCSAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdAotCSAgYmUgdW5pcXVlIHdpdGhpbiBhbiBhcHBsaWNhdGlvbiBjbGllbnQuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplbnYtZW50cnkiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTplbnYtZW50cnktbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIGFwcGxpY2F0aW9uCi0JICBjbGllbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICBqYXZhOmNvbXAvZW52IGNvbnRleHQuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKLQkgIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotCSAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmVqYi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9InJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLlRoZSBuYW1lCi0JICBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnJlcy1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9InJlc291cmNlLWVudi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mCi0JICBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzIHRoZQotCSAgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQKLQkgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLQkgIGFwcGxpY2F0aW9uIGNsaWVudC4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZQotCSAgbmFtZSBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlCi0JICBhcHBsaWNhdGlvbiBjbGllbnQgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUKLQkgIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlCi0JICB3aXRoaW4gYW4gYXBwbGljYXRpb24gY2xpZW50LgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotICA8L3hzZDplbGVtZW50PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcHBsaWNhdGlvbi1jbGllbnRUeXBlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW52LWVudHJ5IgotCQkgICB0eXBlPSJqYXZhZWU6ZW52LWVudHJ5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTplamItcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpzZXJ2aWNlLXJlZkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6cmVzb3VyY2UtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTpwZXJzaXN0ZW5jZS11bml0LXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWNvbnN0cnVjdCIKLQkJICAgdHlwZT0iamF2YWVlOmxpZmVjeWNsZS1jYWxsYmFja1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtZGVzdHJveSIKLQkJICAgdHlwZT0iamF2YWVlOmxpZmVjeWNsZS1jYWxsYmFja1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWxsYmFjay1oYW5kbGVyIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGNhbGxiYWNrLWhhbmRsZXIgZWxlbWVudCBuYW1lcyBhIGNsYXNzIHByb3ZpZGVkIGJ5Ci0JICAgIHRoZSBhcHBsaWNhdGlvbi4gIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBubyBhcmdzCi0JICAgIGNvbnN0cnVjdG9yIGFuZCBtdXN0IGltcGxlbWVudCB0aGUKLQkgICAgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXIKLQkgICAgaW50ZXJmYWNlLiAgVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkIGJ5IHRoZQotCSAgICBhcHBsaWNhdGlvbiBjbGllbnQgY29udGFpbmVyIGFuZCB1c2VkIGJ5IHRoZSBjb250YWluZXIKLQkgICAgdG8gY29sbGVjdCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSB1c2VyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRld2V5LXZlcnNpb25UeXBlIgotCQkgICBmaXhlZD0iNSIKLQkJICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgcmVxdWlyZWQgdmFsdWUgZm9yIHRoZSB2ZXJzaW9uIGlzIDUuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDwveHNkOmF0dHJpYnV0ZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIGRlZmluZXMgd2hldGhlciB0aGlzCi0JICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYW5kIG90aGVyIHJlbGF0ZWQgZGVwbG95bWVudAotCSAgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbW9kdWxlIChlLmcuLCB3ZWIgc2VydmljZQotCSAgZGVzY3JpcHRvcnMpIGFyZSBjb21wbGV0ZSwgb3Igd2hldGhlciB0aGUgY2xhc3MKLQkgIGZpbGVzIGF2YWlsYWJsZSB0byB0aGlzIG1vZHVsZSBhbmQgcGFja2FnZWQgd2l0aAotCSAgdGhpcyBhcHBsaWNhdGlvbiBzaG91bGQgYmUgZXhhbWluZWQgZm9yIGFubm90YXRpb25zCi0JICB0aGF0IHNwZWNpZnkgZGVwbG95bWVudCBpbmZvcm1hdGlvbi4KLQotCSAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgc2V0IHRvICJ0cnVlIiwgdGhlIGRlcGxveW1lbnQKLQkgIHRvb2wgbXVzdCBpZ25vcmUgYW55IGFubm90YXRpb25zIHRoYXQgc3BlY2lmeSBkZXBsb3ltZW50Ci0JICBpbmZvcm1hdGlvbiwgd2hpY2ggbWlnaHQgYmUgcHJlc2VudCBpbiB0aGUgY2xhc3MgZmlsZXMKLQkgIG9mIHRoZSBhcHBsaWNhdGlvbi4KLQotCSAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgbm90IHNwZWNpZmllZCBvciBpcyBzZXQgdG8KLQkgICJmYWxzZSIsIHRoZSBkZXBsb3ltZW50IHRvb2wgbXVzdCBleGFtaW5lIHRoZSBjbGFzcwotCSAgZmlsZXMgb2YgdGhlIGFwcGxpY2F0aW9uIGZvciBhbm5vdGF0aW9ucywgYXMKLQkgIHNwZWNpZmllZCBieSB0aGUgc3BlY2lmaWNhdGlvbnMuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDwveHNkOmF0dHJpYnV0ZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbl8xXzIuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbl8xXzIuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzU3MzYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fMV8yLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi08IS0tCi1Db3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIDkwMSBTYW4gQW50b25pbyBSb2FkLAotUGFsbyBBbHRvLCBDQSAgOTQzMDMsIFUuUy5BLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAKLVRoaXMgcHJvZHVjdCBvciBkb2N1bWVudCBpcyBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGFuZCBkaXN0cmlidXRlZAotdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgaXRzIHVzZSwgY29weWluZywgZGlzdHJpYnV0aW9uLCBhbmQKLWRlY29tcGlsYXRpb24uICBObyBwYXJ0IG9mIHRoaXMgcHJvZHVjdCBvciBkb2N1bWVudGF0aW9uIG1heSBiZQotcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KLW9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LiAgCi0KLVRoaXJkIHBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcyBjb3B5cmlnaHRlZCBhbmQgCi1saWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuIAotCi1TdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gTG9nbywgU29sYXJpcywgSmF2YSwgSmF2YVNlcnZlciBQYWdlcywgSmF2YSAKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgSkRCQywgSkRLLCBKYXZhTWFpbCBhbmQgRW50ZXJwcmlzZSBKYXZhQmVhbnMsIAotYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYyBpbiB0aGUgVS5TLiAKLWFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUFsbCBTUEFSQyB0cmFkZW1hcmtzIGFyZSB1c2VkIHVuZGVyIGxpY2Vuc2UgYW5kIGFyZSB0cmFkZW1hcmtzCi1vciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU1BBUkMgSW50ZXJuYXRpb25hbCwgSW5jLgotaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4gUHJvZHVjdHMgYmVhcmluZyBTUEFSQwotdHJhZGVtYXJrcyBhcmUgYmFzZWQgdXBvbiBhbiBhcmNoaXRlY3R1cmUgZGV2ZWxvcGVkIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gCi0KLVBvc3RTY3JpcHQgaXMgYSByZWdpc3RlcmVkIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zLCBJbmMuIAotCi0gCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMgU3ViamVjdCB0byAKLVN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLQotIAotRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTEwgRVhQUkVTUyBPUiBJTVBMSUVECi1DT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5EIFdBUlJBTlRJRVMsIElOQ0xVRElORyBBTlkKLUlNUExJRUQgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UgT1IgTk9OLUlORlJJTkdFTUVOVCwgQVJFIERJU0NMQUlNRUQsIEVYQ0VQVAotVE8gVEhFIEVYVEVOVCBUSEFUIFNVQ0ggRElTQ0xBSU1FUlMgQVJFIEhFTEQgVE8gQkUgTEVHQUxMWQotSU5WQUxJRC4KLQotX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotQ29weXJpZ2h0IDE5OTkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgCi05MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSAgOTQzMDMsIEV0YXRzLVVuaXMuIAotVG91cyBkcm9pdHMgcmUnc2VydmUncy4KLSAKLQotQ2UgcHJvZHVpdCBvdSBkb2N1bWVudCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQgZGlzdHJpYnVlJyBhdmVjIAotZGVzIGxpY2VuY2VzIHF1aSBlbiByZXN0cmVpZ25lbnQgbCd1dGlsaXNhdGlvbiwgbGEgY29waWUsIGxhIGRpc3RyaWJ1dGlvbiwKLWV0IGxhIGRlJ2NvbXBpbGF0aW9uLiAgQXVjdW5lIHBhcnRpZSBkZSBjZSBwcm9kdWl0IG91IGRlIHNhIGRvY3VtZW50YXRpb24KLWFzc29jaWUnZSBuZSBwZXV0IGVedHJlIHJlcHJvZHVpdGUgc291cyBhdWN1bmUgZm9ybWUsIHBhciBxdWVscXVlIG1veWVuIAotcXVlIGNlIHNvaXQsIHNhbnMgbCdhdXRvcmlzYXRpb24gcHJlJ2FsYWJsZSBldCBlJ2NyaXRlIGRlIFN1biBldCBkZSBzZXMgCi1iYWlsbGV1cnMgZGUgbGljZW5jZSwgcydpbCB5IGVuIGEuICAKLQotTGUgbG9naWNpZWwgZGUndGVudSBwYXIgZGVzIHRpZXJzLCBldCBxdWkgY29tcHJlbmQgbGEgdGVjaG5vbG9naWUgCi1yZWxhdGl2ZSBhdXggcG9saWNlcyBkZSBjYXJhY3RlYHJlcywgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IAotZXQgbGljZW5jaWUnIHBhciBkZXMgZm91cm5pc3NldXJzIGRlIFN1bi4KLSAKLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgbGUgbG9nbyBTdW4sIFNvbGFyaXMsIEphdmEsIEphdmFTZXJ2ZXIgUGFnZXMsIEphdmEgCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsIEpEQkMsIEpESywgSmF2YU1haWwsIGV0IEVudGVycHJpc2UgSmF2YUJlYW5zLCAgCi1zb250IGRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzIGRlJ3Bvc2UnZXMgZGUgU3VuIAotTWljcm9zeXN0ZW1zLCBJbmMuIGF1eCBFdGF0cy1VbmlzIGV0IGRhbnMgZCdhdXRyZXMgcGF5cy4KLSAKLVRvdXRlcyBsZXMgbWFycXVlcyBTUEFSQyBzb250IHV0aWxpc2UnZXMgc291cyBsaWNlbmNlIGV0IHNvbnQKLWRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzIGRlJ3Bvc2UnZXMgZGUgU1BBUkMKLUludGVybmF0aW9uYWwsIEluYy4gYXV4IEV0YXRzLVVuaXMgZXQgIGRhbnMKLWQnYXV0cmVzIHBheXMuIExlcyBwcm9kdWl0cyBwb3J0YW50IGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQKLWJhc2UncyBzdXIgdW5lIGFyY2hpdGVjdHVyZSBkZSd2ZWxvcHBlJ2UgcGFyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIAotCi1Qb3N0Y3JpcHQgZXN0IHVuZSBtYXJxdWUgZW5yZWdpc3RyZSdlIGQnQWRvYmUgU3lzdGVtcyBJbmMuIAotIAotTEEgRE9DVU1FTlRBVElPTiBFU1QgRk9VUk5JRSAiRU4gTCdFVEFUIiBFVCBUT1VURVMgQVVUUkVTIENPTkRJVElPTlMsCi1ERUNMQVJBVElPTlMgRVQgR0FSQU5USUVTIEVYUFJFU1NFUyBPVSBUQUNJVEVTIFNPTlQgRk9STUVMTEVNRU5UIEVYQ0xVRVMsCi1EQU5TIExBIE1FU1VSRSBBVVRPUklTRUUgUEFSIExBIExPSSBBUFBMSUNBQkxFLCBZIENPTVBSSVMgTk9UQU1NRU5UCi1UT1VURSBHQVJBTlRJRSBJTVBMSUNJVEUgUkVMQVRJVkUgQSBMQSBRVUFMSVRFIE1BUkNIQU5ERSwgQSBMJ0FQVElUVURFCi1BIFVORSBVVElMSVNBVElPTiBQQVJUSUNVTElFUkUgT1UgQSBMJ0FCU0VOQ0UgREUgQ09OVFJFRkFDT04uCi0tLT4KLQotPCEtLQotVGhlIGFsdC1kZCBlbGVtZW50IHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUKLWRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlIGZvciBhIHBhcnRpY3VsYXIgSjJFRSBtb2R1bGUuIFRoZSBVUkkgbXVzdCBzcGVjaWZ5Ci10aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUgcmVsYXRpdmUgdG8gdGhlCi1hcHBsaWNhdGlvbidzIHJvb3QgZGlyZWN0b3J5LiBJZiBhbHQtZGQgaXMgbm90IHNwZWNpZmllZCwgdGhlIGRlcGxveWVyIG11c3QgcmVhZAotdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmcm9tIHRoZSBkZWZhdWx0IGxvY2F0aW9uIGFuZCBmaWxlIG5hbWUgcmVxdWlyZWQgYnkKLXRoZSByZXNwZWN0aXZlIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uLgotLS0+Ci08IUVMRU1FTlQgYWx0LWRkICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIEoyRUUgYXBwbGljYXRpb24gZGVwbG95bWVudAotZGVzY3JpcHRvci4KLS0tPgotPCFFTEVNRU5UIGFwcGxpY2F0aW9uIChpY29uPywgZGlzcGxheS1uYW1lLCBkZXNjcmlwdGlvbj8sIG1vZHVsZSssCi1zZWN1cml0eS1yb2xlKik+Ci0KLTwhLS0KLVRoZSBjb250ZXh0LXJvb3QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNvbnRleHQgcm9vdCBvZiBhIHdlYiBhcHBsaWNhdGlvbgotLS0+Ci08IUVMRU1FTlQgY29udGV4dC1yb290ICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgcHJvdmlkZXMgYSBodW1hbiByZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUKLWFwcGxpY2F0aW9uLiBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUKLWFwcGxpY2F0aW9uIGFzc2VtYmxlciB3YW50cyB0byBwcm92aWRlIHRoZSBkZXBsb3llci4KLS0tPgotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhbiBhcHBsaWNhdGlvbiBuYW1lLgotVGhlIGFwcGxpY2F0aW9uIG5hbWUgaXMgYXNzaWduZWQgdG8gdGhlIGFwcGxpY2F0aW9uIGJ5IHRoZSBhcHBsaWNhdGlvbiBhc3NlbWJsZXIKLWFuZCBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBhcHBsaWNhdGlvbiB0byB0aGUgZGVwbG95ZXIgYXQgZGVwbG95bWVudCB0aW1lLgotLS0+Ci08IUVMRU1FTlQgZGlzcGxheS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYiBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGEgZWpiLWphciwgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUKLWFwcGxpY2F0aW9uIHBhY2thZ2UuCi0tLT4KLTwhRUxFTUVOVCBlamIgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaWNvbiBlbGVtZW50IGNvbnRhaW5zIGEgc21hbGwtaWNvbiBhbmQgbGFyZ2UtaWNvbiBlbGVtZW50IHdoaWNoIHNwZWNpZnkgdGhlCi1VUklzIGZvciBhIHNtYWxsIGFuZCBhIGxhcmdlIEdJRiBvciBKUEVHIGljb24gaW1hZ2UgdG8gcmVwcmVzZW50IHRoZSBhcHBsaWNhdGlvbgotaW4gYSBHVUkuCi0tLT4KLTwhRUxFTUVOVCBpY29uIChzbWFsbC1pY29uPywgbGFyZ2UtaWNvbj8pPgotCi08IS0tCi1UaGUgamF2YSBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGEgamF2YSBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlLCByZWxhdGl2ZQotdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4KLS0tPgotPCFFTEVNRU5UIGphdmEgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbGFyZ2UtaWNvbiBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIGZvciBhIGxhcmdlIEdJRiBvciBKUEVHIGljb24gaW1hZ2UgdG8KLXJlcHJlc2VudCB0aGUgYXBwbGljYXRpb24gaW4gYSBHVUkuCi0tLT4KLTwhRUxFTUVOVCBsYXJnZS1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIG1vZHVsZSBlbGVtZW50IHJlcHJlc2VudHMgYSBzaW5nbGUgSjJFRSBtb2R1bGUgYW5kIGNvbnRhaW5zIGFuIGVqYiwgamF2YSwgb3IKLXdlYiBlbGVtZW50LCB3aGljaCBpbmRpY2F0ZXMgdGhlIG1vZHVsZSB0eXBlIGFuZCBjb250YWlucyBhIHBhdGggdG8gdGhlIG1vZHVsZQotZmlsZSwgYW5kIGFuIG9wdGlvbmFsIGFsdC1kZCBlbGVtZW50LCB3aGljaCBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVVJJIHRvIHRoZQotcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi1UaGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgaGF2ZSBvbmUgbW9kdWxlIGVsZW1lbnQgZm9yIGVhY2ggSjJFRQotbW9kdWxlIGluIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotLS0+Ci08IUVMRU1FTlQgbW9kdWxlICgoZWpiIHwgamF2YSB8IHdlYiksIGFsdC1kZD8pPgotCi08IS0tCi1UaGUgcm9sZS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotLS0+Ci08IUVMRU1FTlQgcm9sZS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudCBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhIHNlY3VyaXR5IHJvbGUgd2hpY2ggaXMKLWdsb2JhbCB0byB0aGUgYXBwbGljYXRpb24uIFRoZSBkZWZpbml0aW9uIGNvbnNpc3RzIG9mIGEgZGVzY3JpcHRpb24gb2YgdGhlCi1zZWN1cml0eSByb2xlLCBhbmQgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZS4gVGhlIGRlc2NyaXB0aW9ucyBhdCB0aGlzIGxldmVsCi1vdmVycmlkZSB0aG9zZSBpbiB0aGUgY29tcG9uZW50IGxldmVsIHNlY3VyaXR5LXJvbGUgZGVmaW5pdGlvbnMgYW5kIG11c3QgYmUgdGhlCi1kZXNjcmlwdGlvbnMgdG9vbCBkaXNwbGF5IHRvIHRoZSBkZXBsb3llci4KLS0tPgotPCFFTEVNRU5UIHNlY3VyaXR5LXJvbGUgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lKT4KLQotPCEtLQotVGhlIHNtYWxsLWljb24gZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBmb3IgYSBzbWFsbCBHSUYgb3IgSlBFRyBpY29uIGltYWdlIHRvCi1yZXByZXNlbnQgdGhlIGFwcGxpY2F0aW9uIGluIGEgR1VJLgotLS0+Ci08IUVMRU1FTlQgc21hbGwtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB3ZWIgZWxlbWVudCBjb250YWlucyB0aGUgd2ViLXVyaSBhbmQgY29udGV4dC1yb290IG9mIGEgd2ViIGFwcGxpY2F0aW9uCi1tb2R1bGUuCi0tLT4KLTwhRUxFTUVOVCB3ZWIgKHdlYi11cmksIGNvbnRleHQtcm9vdCk+Ci0KLTwhLS0KLVRoZSB3ZWItdXJpIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSB3ZWIgYXBwbGljYXRpb24gZmlsZSwgcmVsYXRpdmUgdG8gdGhlCi10b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0tLT4KLTwhRUxFTUVOVCB3ZWItdXJpICgjUENEQVRBKT4KLQotPCEtLQotVGhlIElEIG1lY2hhbmlzbSBpcyB0byBhbGxvdyB0b29scyB0byBlYXNpbHkgbWFrZSB0b29sLXNwZWNpZmljIHJlZmVyZW5jZXMgdG8KLXRoZSBlbGVtZW50cyBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotIC0tPgotPCFBVFRMSVNUIGFsdC1kZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhcHBsaWNhdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb250ZXh0LXJvb3QgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVzY3JpcHRpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGlzcGxheS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBpY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGphdmEgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGFyZ2UtaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtb2R1bGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgcm9sZS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlY3VyaXR5LXJvbGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc21hbGwtaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB3ZWIgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgd2ViLXVyaSBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fMV8zLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fMV8zLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJhNDlhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzFfMy5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotPCEtLQotQ29weXJpZ2h0IChjKSAyMDAwIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sCi05MDEgU2FuIEFudG9uaW8gUm9hZCwKLVBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIHJlbGF0aW5nIHRvCi10ZWNobm9sb2d5IGVtYm9kaWVkIGluIHRoZSBwcm9kdWN0IHRoYXQgaXMgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuCi1JbiBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzIGxpc3RlZCBhdAotaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlIGFkZGl0aW9uYWwgcGF0ZW50cyBvcgotcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZSBVLlMuIGFuZCBpbiBvdGhlciBjb3VudHJpZXMuCi0KLVRoaXMgZG9jdW1lbnQgYW5kIHRoZSBwcm9kdWN0IHRvIHdoaWNoIGl0IHBlcnRhaW5zIGFyZSBkaXN0cmlidXRlZAotdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLCBkaXN0cmlidXRpb24sIGFuZAotZGVjb21waWxhdGlvbi4gIFRoaXMgZG9jdW1lbnQgbWF5IGJlIHJlcHJvZHVjZWQgYW5kIGRpc3RyaWJ1dGVkIGJ1dCBtYXkKLW5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzCi1saWNlbnNvcnMsIGlmIGFueS4KLQotVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzIGNvcHlyaWdodGVkIGFuZAotbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi1TdW4sICBTdW4gTWljcm9zeXN0ZW1zLCAgdGhlIFN1biBsb2dvLCAgSmF2YSwgIEphdmFTZXJ2ZXIgUGFnZXMsICBKYXZhCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsICBKREJDLCAgSkRLLCAgSmF2YU1haWwgYW5kICBhbmQKLUVudGVycHJpc2UgSmF2YUJlYW5zIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLU1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMgU3ViamVjdCB0bwotU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTEwgRVhQUkVTUyBPUiBJTVBMSUVECi1DT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5EIFdBUlJBTlRJRVMsIElOQ0xVRElORyBBTlkgSU1QTElFRAotV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IKLU5PTi1JTkZSSU5HRU1FTlQsIEFSRSBESVNDTEFJTUVELCBFWENFUFQgVE8gVEhFIEVYVEVOVCBUSEFUIFNVQ0gKLURJU0NMQUlNRVJTIEFSRSBIRUxEIFRPIEJFIExFR0FMTFkgSU5WQUxJRC4KLQotCi1fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLUNvcHlyaWdodCAoYykgMjAwMCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLAotOTAxIFNhbiBBbnRvbmlvIFJvYWQsCi1QYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIEUndGF0cy1VbmlzLgotVG91cyBkcm9pdHMgcmUnc2VydmUncy4KLQotU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhIGxlcyBkcm9pdHMgZGUgcHJvcHJpZSd0ZScgaW50ZWxsZWN0dWVscwotcmVsYXRhbnRzIGFgIGxhIHRlY2hub2xvZ2llIGluY29ycG9yZSdlIGRhbnMgbGUgcHJvZHVpdCBxdWkgZXN0IGRlJ2NyaXQKLWRhbnMgY2UgZG9jdW1lbnQuIEVuIHBhcnRpY3VsaWVyLCBldCBzYW5zIGxhIGxpbWl0YXRpb24sIGNlcyBkcm9pdHMgZGUKLXByb3ByaWUndGUnIGludGVsbGVjdHVlbHMgcGV1dmVudCBpbmNsdXJlIHVuIG91IHBsdXMgZGVzIGJyZXZldHMKLWFtZSdyaWNhaW5zIGUnbnVtZSdyZSdzIGFgIGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGV0IHVuIG91IGxlcwotYnJldmV0cyBwbHVzIHN1cHBsZSdtZW50YWlyZXMgb3UgbGVzIGFwcGxpY2F0aW9ucyBkZSBicmV2ZXQgZW4gYXR0ZW50ZQotZGFucyBsZXMgRSd0YXRzLVVuaXMgZXQgZGFucyBsZXMgYXV0cmVzIHBheXMuCi0KLUNlIHByb2R1aXQgb3UgZG9jdW1lbnQgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IGV0IGRpc3RyaWJ1ZScKLWF2ZWMgZGVzIGxpY2VuY2VzIHF1aSBlbiByZXN0cmVpZ25lbnQgbCd1dGlsaXNhdGlvbiwgbGEgY29waWUsIGxhCi1kaXN0cmlidXRpb24sIGV0IGxhIGRlJ2NvbXBpbGF0aW9uLiAgQ2UgZG9jdW1lbnRpb24gYXNzb2NpZSBuIHBldXQKLWVedHJlIHJlcHJvZHVpdGUgZXQgZGlzdHJpYnVlciwgcGFyIHF1ZWxxdWUgbW95ZW4gcXVlIGNlIHNvaXQsIHNhbnMKLWwnYXV0b3Jpc2F0aW9uIHByZSdhbGFibGUgZXQgZSdjcml0ZSBkZSBTdW4gZXQgZGUgc2VzIGJhaWxsZXVycyBkZQotbGljZW5jZSwgbGUgY2FzIGUnY2hlJ2FudC4KLQotTGUgbG9naWNpZWwgZGUndGVudSBwYXIgZGVzIHRpZXJzLCBldCBxdWkgY29tcHJlbmQgbGEgdGVjaG5vbG9naWUKLXJlbGF0aXZlIGF1eCBwb2xpY2VzIGRlIGNhcmFjdGVgcmVzLCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQKLWxpY2VuY2llJyBwYXIgZGVzIGZvdXJuaXNzZXVycyBkZSBTdW4uCi0KLVN1biwgIFN1biBNaWNyb3N5c3RlbXMsICBsZSBsb2dvIFN1biwgIEphdmEsICBKYXZhU2VydmVyIFBhZ2VzLCAgSmF2YQotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCAgSkRCQywgIEpESywgIEphdmFNYWlsIGV0ICBhbmQKLUVudGVycHJpc2UgSmF2YUJlYW5zIHNvbnQgZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMKLWRlJ3Bvc2UnZXMgZGUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhdXggRSd0YXRzLVVuaXMgZXQgZGFucyBkJ2F1dHJlcwotcGF5cy4KLQotTEEgRE9DVU1FTlRBVElPTiBFU1QgRk9VUk5JRSAiRU4gTCdFJ1RBVCIgRVQgVE9VVEVTIEFVVFJFUyBDT05ESVRJT05TLAotREVDTEFSQVRJT05TIEVUIEdBUkFOVElFUyBFWFBSRVNTRVMgT1UgVEFDSVRFUyBTT05UIEZPUk1FTExFTUVOVAotRVhDTFVFUywgREFOUyBMQSBNRVNVUkUgQVVUT1JJU0VFIFBBUiBMQSBMT0kgQVBQTElDQUJMRSwgWSBDT01QUklTCi1OT1RBTU1FTlQgVE9VVEUgR0FSQU5USUUgSU1QTElDSVRFIFJFTEFUSVZFIEEgTEEgUVVBTElURSBNQVJDSEFOREUsIEEKLUwnQVBUSVRVREUgQSBVTkUgVVRJTElTQVRJT04gUEFSVElDVUxJRVJFIE9VIEEgTCdBQlNFTkNFIERFCi1DT05UUkVGQUMsT04uCi0tLT4KLQotPCEtLQotVGhpcyBpcyB0aGUgWE1MIERURCBmb3IgdGhlIEoyRUUgMS4zIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQKLWRlc2NyaXB0b3IuICBBbGwgSjJFRSAxLjMgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9ycwotbXVzdCBpbmNsdWRlIGEgRE9DVFlQRSBvZiB0aGUgZm9sbG93aW5nIGZvcm06Ci0KLSAgPCFET0NUWVBFIGFwcGxpY2F0aW9uIFBVQkxJQwotCSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiAxLjMvL0VOIgotCSJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbl8xXzMuZHRkIj4KLQotLS0+Ci0KLTwhLS0KLVRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi1lbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IGNvbnRhaW4gUENEQVRBLCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlCi0gIGluIHRoZSBkYXRhIG1heSBiZSBpZ25vcmVkLgotCi0tIEluIGVsZW1lbnRzIHdob3NlIHZhbHVlIGlzIGFuICJlbnVtZXJhdGVkIHR5cGUiLCB0aGUgdmFsdWUgaXMKLSAgY2FzZSBzZW5zaXRpdmUuCi0KLS0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUgc2FtZQotICBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3Qgc3RhcnRpbmcgd2l0aCAiLyIpCi0gIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4KLSAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5Ci0gIG5hbWVzIGluIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlCi0gIG5hbWVzIGFyZSBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgc2VydmxldCBBUEkuCi0tLT4KLQotCi08IS0tCi1UaGUgYXBwbGljYXRpb24gZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgSjJFRSBhcHBsaWNhdGlvbgotZGVwbG95bWVudCBkZXNjcmlwdG9yLgotLS0+Ci08IUVMRU1FTlQgYXBwbGljYXRpb24gKGljb24/LCBkaXNwbGF5LW5hbWUsIGRlc2NyaXB0aW9uPywgbW9kdWxlKywKLQkJc2VjdXJpdHktcm9sZSopPgotCi08IS0tCi1UaGUgYWx0LWRkIGVsZW1lbnQgc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFVSSSB0byB0aGUgcG9zdC1hc3NlbWJseQotdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUgZm9yIGEgcGFydGljdWxhciBKMkVFIG1vZHVsZS4KLVRoZSBVUkkgbXVzdCBzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLWZpbGUgcmVsYXRpdmUgdG8gdGhlIGFwcGxpY2F0aW9uJ3Mgcm9vdCBkaXJlY3RvcnkuIElmIGFsdC1kZCBpcyBub3QKLXNwZWNpZmllZCwgdGhlIGRlcGxveWVyIG11c3QgcmVhZCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZyb20gdGhlCi1kZWZhdWx0IGxvY2F0aW9uIGFuZCBmaWxlIG5hbWUgcmVxdWlyZWQgYnkgdGhlIHJlc3BlY3RpdmUgY29tcG9uZW50Ci1zcGVjaWZpY2F0aW9uLgotCi1Vc2VkIGluOiBtb2R1bGUKLS0tPgotPCFFTEVNRU5UIGFsdC1kZCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBjb25uZWN0b3IgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhIHJlc291cmNlIGFkYXB0ZXIgYXJjaGl2ZQotZmlsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4KLQotVXNlZCBpbjogbW9kdWxlCi0tLT4KLTwhRUxFTUVOVCBjb25uZWN0b3IgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgY29udGV4dC1yb290IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBjb250ZXh0IHJvb3Qgb2YgYSB3ZWIKLWFwcGxpY2F0aW9uLgotCi1Vc2VkIGluOiB3ZWIKLS0tPgotPCFFTEVNRU5UIGNvbnRleHQtcm9vdCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudAotZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0Ci10aGUgYXBwbGljYXRpb24gZWFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YKLXRoZSBhcHBsaWNhdGlvbiBlYXIgZmlsZSAoaS5lLiwgdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMKLXVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGVhciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24KLXdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgZGVzY3JpcHRpb24uCi0KLVVzZWQgaW46IGFwcGxpY2F0aW9uLCBzZWN1cml0eS1yb2xlCi0tLT4KLTwhRUxFTUVOVCBkZXNjcmlwdGlvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZQotZGlzcGxheWVkIGJ5IHRvb2xzLiAgVGhlIGRpc3BsYXkgbmFtZSBuZWVkIG5vdCBiZSB1bmlxdWUuCi0KLVVzZWQgaW46IGFwcGxpY2F0aW9uCi0KLUV4YW1wbGU6Ci0KLTxkaXNwbGF5LW5hbWU+RW1wbG95ZWUgU2VsZiBTZXJ2aWNlPC9kaXNwbGF5LW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBkaXNwbGF5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYW4gZWpiLWphciwgcmVsYXRpdmUgdG8gdGhlIHRvcAotbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0KLVVzZWQgaW46IG1vZHVsZQotLS0+Ci08IUVMRU1FTlQgZWpiICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGljb24gZWxlbWVudCBjb250YWlucyBzbWFsbC1pY29uIGFuZCBsYXJnZS1pY29uIGVsZW1lbnRzIHRoYXQKLXNwZWNpZnkgdGhlIGZpbGUgbmFtZXMgZm9yIHNtYWxsIGFuZCBhIGxhcmdlIEdJRiBvciBKUEVHIGljb24gaW1hZ2VzCi11c2VkIHRvIHJlcHJlc2VudCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gYSBHVUkgdG9vbC4KLQotVXNlZCBpbjogYXBwbGljYXRpb24KLS0tPgotPCFFTEVNRU5UIGljb24gKHNtYWxsLWljb24/LCBsYXJnZS1pY29uPyk+Ci0KLTwhLS0KLVRoZSBqYXZhIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSBqYXZhIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUsCi1yZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi1Vc2VkIGluOiBtb2R1bGUKLS0tPgotPCFFTEVNRU5UIGphdmEgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotY29udGFpbmluZyBhIGxhcmdlICgzMiB4IDMyKSBpY29uIGltYWdlLiBUaGUgZmlsZQotbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBhcHBsaWNhdGlvbidzCi1lYXIgZmlsZS4KLQotVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4KLVRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCi1Vc2VkIGluOiBpY29uCi0KLUV4YW1wbGU6Ci0KLTxsYXJnZS1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZzwvbGFyZ2UtaWNvbj4KLS0tPgotPCFFTEVNRU5UIGxhcmdlLWljb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbW9kdWxlIGVsZW1lbnQgcmVwcmVzZW50cyBhIHNpbmdsZSBKMkVFIG1vZHVsZSBhbmQgY29udGFpbnMgYQotY29ubmVjdG9yLCBlamIsIGphdmEsIG9yIHdlYiBlbGVtZW50LCB3aGljaCBpbmRpY2F0ZXMgdGhlIG1vZHVsZSB0eXBlCi1hbmQgY29udGFpbnMgYSBwYXRoIHRvIHRoZSBtb2R1bGUgZmlsZSwgYW5kIGFuIG9wdGlvbmFsIGFsdC1kZCBlbGVtZW50LAotd2hpY2ggc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFVSSSB0byB0aGUgcG9zdC1hc3NlbWJseSB2ZXJzaW9uIG9mIHRoZQotZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi1UaGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgaGF2ZSBvbmUgbW9kdWxlIGVsZW1lbnQgZm9yCi1lYWNoIEoyRUUgbW9kdWxlIGluIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi1Vc2VkIGluOiBhcHBsaWNhdGlvbgotLS0+Ci08IUVMRU1FTlQgbW9kdWxlICgoY29ubmVjdG9yIHwgZWpiIHwgamF2YSB8IHdlYiksIGFsdC1kZD8pPgotCi08IS0tCi1UaGUgcm9sZS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCi1UaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGFuIE5NVE9LRU4uCi0KLVVzZWQgaW46IHNlY3VyaXR5LXJvbGUKLS0tPgotPCFFTEVNRU5UIHJvbGUtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYSBzZWN1cml0eQotcm9sZS4gVGhlIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlCi1zZWN1cml0eSByb2xlLCBhbmQgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZS4KLQotVXNlZCBpbjogYXBwbGljYXRpb24KLQotRXhhbXBsZToKLQotICAgIDxzZWN1cml0eS1yb2xlPgotCTxkZXNjcmlwdGlvbj4KLQkgICAgVGhpcyByb2xlIGluY2x1ZGVzIGFsbCBlbXBsb3llZXMgd2hvIGFyZSBhdXRob3JpemVkCi0JICAgIHRvIGFjY2VzcyB0aGUgZW1wbG95ZWUgc2VydmljZSBhcHBsaWNhdGlvbi4KLQk8L2Rlc2NyaXB0aW9uPgotCTxyb2xlLW5hbWU+ZW1wbG95ZWU8L3JvbGUtbmFtZT4KLSAgICA8L3NlY3VyaXR5LXJvbGU+Ci0tLT4KLTwhRUxFTUVOVCBzZWN1cml0eS1yb2xlIChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSk+Ci0KLTwhLS0KLVRoZSBzbWFsbC1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi1jb250YWluaW5nIGEgc21hbGwgKDE2IHggMTYpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi1uYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uJ3MKLWVhciBmaWxlLgotCi1UaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgotVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLVVzZWQgaW46IGljb24KLQotRXhhbXBsZToKLQotPHNtYWxsLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnPC9zbWFsbC1pY29uPgotLS0+Ci08IUVMRU1FTlQgc21hbGwtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB3ZWIgZWxlbWVudCBjb250YWlucyB0aGUgd2ViLXVyaSBhbmQgY29udGV4dC1yb290IG9mIGEgd2ViCi1hcHBsaWNhdGlvbiBtb2R1bGUuCi0KLVVzZWQgaW46IG1vZHVsZQotLS0+Ci08IUVMRU1FTlQgd2ViICh3ZWItdXJpLCBjb250ZXh0LXJvb3QpPgotCi08IS0tCi1UaGUgd2ViLXVyaSBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGEgd2ViIGFwcGxpY2F0aW9uIGZpbGUsCi1yZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi1Vc2VkIGluOiB3ZWIKLS0tPgotPCFFTEVNRU5UIHdlYi11cmkgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgSUQgbWVjaGFuaXNtIGlzIHRvIGFsbG93IHRvb2xzIHRoYXQgcHJvZHVjZSBhZGRpdGlvbmFsIGRlcGxveW1lbnQKLWluZm9ybWF0aW9uIChpLmUuLCBpbmZvcm1hdGlvbiBiZXlvbmQgdGhlIHN0YW5kYXJkIGRlcGxveW1lbnQKLWRlc2NyaXB0b3IgaW5mb3JtYXRpb24pIHRvIHN0b3JlIHRoZSBub24tc3RhbmRhcmQgaW5mb3JtYXRpb24gaW4gYQotc2VwYXJhdGUgZmlsZSwgYW5kIGVhc2lseSByZWZlciBmcm9tIHRoZXNlIHRvb2wtc3BlY2lmaWMgZmlsZXMgdG8gdGhlCi1pbmZvcm1hdGlvbiBpbiB0aGUgc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi1Ub29scyBhcmUgbm90IGFsbG93ZWQgdG8gYWRkIHRoZSBub24tc3RhbmRhcmQgaW5mb3JtYXRpb24gaW50byB0aGUKLXN0YW5kYXJkIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLS0tPgotCi08IUFUVExJU1QgYWx0LWRkIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGFwcGxpY2F0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbm5lY3RvciBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb250ZXh0LXJvb3QgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVzY3JpcHRpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGlzcGxheS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBpY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGphdmEgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGFyZ2UtaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtb2R1bGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgcm9sZS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlY3VyaXR5LXJvbGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc21hbGwtaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB3ZWIgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgd2ViLXVyaSBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fMV80LnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fMV80LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ1OGNmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzFfNC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjEuNCI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpYXBwbGljYXRpb25fMV80LnhzZHMJMS4xMyAwMi8xMS8wMwotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgOTAxIFNhbiBBbnRvbmlvCi0gICAgICBSb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiBBbGwgcmlnaHRzCi0gICAgICByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBWwotCi0JVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIGFwcGxpY2F0aW9uIDEuNCBkZXBsb3ltZW50Ci0JZGVzY3JpcHRvci4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZAotCSJNRVRBLUlORi9hcHBsaWNhdGlvbi54bWwiIGluIHRoZSBhcHBsaWNhdGlvbidzIGVhciBmaWxlLgotCUFsbCBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUKLQl0aGUgYXBwbGljYXRpb24gc2NoZW1hIGJ5IHVzaW5nIHRoZSBKMkVFIG5hbWVzcGFjZToKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotCWFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0JdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8YXBwbGljYXRpb24geG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQkJaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIgotCSAgICAgIHZlcnNpb249IjEuNCI+Ci0JICAgICAgLi4uCi0JICAgIDwvYXBwbGljYXRpb24+Ci0KLQlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKLQl0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi0JbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb25fMV80LnhzZAotCi0JXV0+Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKMkVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLQlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0JcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLSAgPHhzZDplbGVtZW50IG5hbWU9ImFwcGxpY2F0aW9uIiB0eXBlPSJqMmVlOmFwcGxpY2F0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIEoyRUUKLQlhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImNvbnRleHQtcm9vdC11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBjb250ZXh0LXJvb3QgZWxlbWVudCBjb250ZW50IG11c3QgYmUgdW5pcXVlCi0JICBpbiB0aGUgZWFyLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOm1vZHVsZS9qMmVlOndlYiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpjb250ZXh0LXJvb3QiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJzZWN1cml0eS1yb2xlLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHNlY3VyaXR5LXJvbGUtbmFtZSBlbGVtZW50IGNvbnRlbnQKLQkgIG11c3QgYmUgdW5pcXVlIGluIHRoZSBlYXIuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6c2VjdXJpdHktcm9sZSIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyb2xlLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgPC94c2Q6ZWxlbWVudD4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwbGljYXRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYXBwbGljYXRpb25UeXBlIGRlZmluZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUKLQlhcHBsaWNhdGlvbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtb2R1bGUiCi0JCSAgIHR5cGU9ImoyZWU6bW9kdWxlVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgaGF2ZSBvbmUKLQkgICAgbW9kdWxlIGVsZW1lbnQgZm9yIGVhY2ggSjJFRSBtb2R1bGUgaW4gdGhlCi0JICAgIGFwcGxpY2F0aW9uIHBhY2thZ2UuIEEgbW9kdWxlIGVsZW1lbnQgaXMgZGVmaW5lZAotCSAgICBieSBtb2R1bGVUeXBlIGRlZmluaXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZSIKLQkJICAgdHlwZT0iajJlZTpzZWN1cml0eS1yb2xlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0JCSAgIGZpeGVkPSIxLjQiCi0JCSAgIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyAxLjQuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtb2R1bGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbW9kdWxlVHlwZSBkZWZpbmVzIGEgc2luZ2xlIEoyRUUgbW9kdWxlIGFuZCBjb250YWlucyBhCi0JY29ubmVjdG9yLCBlamIsIGphdmEsIG9yIHdlYiBlbGVtZW50LCB3aGljaCBpbmRpY2F0ZXMgdGhlCi0JbW9kdWxlIHR5cGUgYW5kIGNvbnRhaW5zIGEgcGF0aCB0byB0aGUgbW9kdWxlIGZpbGUsIGFuZCBhbgotCW9wdGlvbmFsIGFsdC1kZCBlbGVtZW50LCB3aGljaCBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVVJJIHRvCi0JdGhlIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3RvciIKLQkJICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGNvbm5lY3RvciBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGEKLQkgICAgICByZXNvdXJjZSBhZGFwdGVyIGFyY2hpdmUgZmlsZSwgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImVqYiIKLQkJICAgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYiBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGFuIGVqYi1qYXIsCi0JICAgICAgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24KLQkgICAgICBwYWNrYWdlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImphdmEiCi0JCSAgICAgdHlwZT0iajJlZTpwYXRoVHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBqYXZhIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSBqYXZhCi0JICAgICAgYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcAotCSAgICAgIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9IndlYiIKLQkJICAgICB0eXBlPSJqMmVlOndlYlR5cGUiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbHQtZGQiCi0JCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBhbHQtZGQgZWxlbWVudCBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVVJJIHRvIHRoZQotCSAgICBwb3N0LWFzc2VtYmx5IHZlcnNpb24gb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotCSAgICBmaWxlIGZvciBhIHBhcnRpY3VsYXIgSjJFRSBtb2R1bGUuICBUaGUgVVJJIG11c3QKLQkgICAgc3BlY2lmeSB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgZGVwbG95bWVudAotCSAgICBkZXNjcmlwdG9yIGZpbGUgcmVsYXRpdmUgdG8gdGhlIGFwcGxpY2F0aW9uJ3Mgcm9vdAotCSAgICBkaXJlY3RvcnkuIElmIGFsdC1kZCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZGVwbG95ZXIKLQkgICAgbXVzdCByZWFkIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZnJvbSB0aGUgZGVmYXVsdAotCSAgICBsb2NhdGlvbiBhbmQgZmlsZSBuYW1lIHJlcXVpcmVkIGJ5IHRoZSByZXNwZWN0aXZlCi0JICAgIGNvbXBvbmVudCBzcGVjaWZpY2F0aW9uLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB3ZWJUeXBlIGRlZmluZXMgdGhlIHdlYi11cmkgYW5kIGNvbnRleHQtcm9vdCBvZgotCWEgd2ViIGFwcGxpY2F0aW9uIG1vZHVsZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViLXVyaSIKLQkJICAgdHlwZT0iajJlZTpwYXRoVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB3ZWItdXJpIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSB3ZWIKLQkgICAgYXBwbGljYXRpb24gZmlsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUKLQkgICAgYXBwbGljYXRpb24gcGFja2FnZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250ZXh0LXJvb3QiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgY29udGV4dC1yb290IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBjb250ZXh0IHJvb3QKLQkgICAgb2YgYSB3ZWIgYXBwbGljYXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzUueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbl81LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUwOTY2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgIHhtbG5zOmphdmFlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotCSAgICB2ZXJzaW9uPSI1Ij4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIylhcHBsaWNhdGlvbl81LnhzZHMJMS4xNyAwOC8wNS8wNQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICAgICAgVS5TLkEKLSAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVsKLQotCVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBhcHBsaWNhdGlvbiA1IGRlcGxveW1lbnQKLQlkZXNjcmlwdG9yLiAgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGJlIG5hbWVkCi0JIk1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCIgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgZWFyIGZpbGUuCi0JQWxsIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmRpY2F0ZQotCXRoZSBhcHBsaWNhdGlvbiBzY2hlbWEgYnkgdXNpbmcgdGhlIEphdmEgRUUgbmFtZXNwYWNlOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0KLQlhbmQgaW5kaWNhdGUgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotCXVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLQkgICAgPGFwcGxpY2F0aW9uIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotCQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb25fNS54c2QiCi0JICAgICAgdmVyc2lvbj0iNSI+Ci0JICAgICAgLi4uCi0JICAgIDwvYXBwbGljYXRpb24+Ci0KLQlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKLQl0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKYXZhIEVFCi0JbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbl81LnhzZAotCi0JXV0+Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKYXZhIEVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLQlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0JcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iamF2YWVlXzUueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLSAgPHhzZDplbGVtZW50IG5hbWU9ImFwcGxpY2F0aW9uIiB0eXBlPSJqYXZhZWU6YXBwbGljYXRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYXBwbGljYXRpb24gZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgSmF2YSBFRQotCWFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0iY29udGV4dC1yb290LXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGNvbnRleHQtcm9vdCBlbGVtZW50IGNvbnRlbnQgbXVzdCBiZSB1bmlxdWUKLQkgIGluIHRoZSBlYXIuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTptb2R1bGUvamF2YWVlOndlYiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmNvbnRleHQtcm9vdCIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9InNlY3VyaXR5LXJvbGUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgc2VjdXJpdHktcm9sZS1uYW1lIGVsZW1lbnQgY29udGVudAotCSAgbXVzdCBiZSB1bmlxdWUgaW4gdGhlIGVhci4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnNlY3VyaXR5LXJvbGUiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpyb2xlLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgPC94c2Q6ZWxlbWVudD4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwbGljYXRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYXBwbGljYXRpb25UeXBlIGRlZmluZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUKLQlhcHBsaWNhdGlvbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1vZHVsZSIKLQkJICAgdHlwZT0iamF2YWVlOm1vZHVsZVR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGhhdmUgb25lCi0JICAgIG1vZHVsZSBlbGVtZW50IGZvciBlYWNoIEphdmEgRUUgbW9kdWxlIGluIHRoZQotCSAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLiBBIG1vZHVsZSBlbGVtZW50IGlzIGRlZmluZWQKLQkgICAgYnkgbW9kdWxlVHlwZSBkZWZpbml0aW9uLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUiCi0JCSAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1yb2xlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpYnJhcnktZGlyZWN0b3J5IgotCQkgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSIxIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGxpYnJhcnktZGlyZWN0b3J5IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBwYXRobmFtZQotCSAgICBvZiBhIGRpcmVjdG9yeSB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UsIHJlbGF0aXZlCi0JICAgIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuICBBbGwgZmlsZXMKLQkgICAgbmFtZWQgIiouamFyIiBpbiB0aGlzIGRpcmVjdG9yeSBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlCi0JICAgIGluIHRoZSBjbGFzcyBwYXRoIG9mIGFsbCBjb21wb25lbnRzIGluY2x1ZGVkIGluIHRoaXMKLQkgICAgYXBwbGljYXRpb24gcGFja2FnZS4gIElmIHRoaXMgZWxlbWVudCBpc24ndCBzcGVjaWZpZWQsCi0JICAgIHRoZSBkaXJlY3RvcnkgbmFtZWQgImxpYiIgaXMgc2VhcmNoZWQuICBBbiBlbXB0eSBlbGVtZW50Ci0JICAgIG1heSBiZSB1c2VkIHRvIGRpc2FibGUgc2VhcmNoaW5nLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXdleS12ZXJzaW9uVHlwZSIKLQkJICAgZml4ZWQ9IjUiCi0JCSAgIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyA1LgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibW9kdWxlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1vZHVsZVR5cGUgZGVmaW5lcyBhIHNpbmdsZSBKYXZhIEVFIG1vZHVsZSBhbmQgY29udGFpbnMgYQotCWNvbm5lY3RvciwgZWpiLCBqYXZhLCBvciB3ZWIgZWxlbWVudCwgd2hpY2ggaW5kaWNhdGVzIHRoZQotCW1vZHVsZSB0eXBlIGFuZCBjb250YWlucyBhIHBhdGggdG8gdGhlIG1vZHVsZSBmaWxlLCBhbmQgYW4KLQlvcHRpb25hbCBhbHQtZGQgZWxlbWVudCwgd2hpY2ggc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFVSSSB0bwotCXRoZSBwb3N0LWFzc2VtYmx5IHZlcnNpb24gb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0b3IiCi0JCSAgICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGNvbm5lY3RvciBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGEKLQkgICAgICByZXNvdXJjZSBhZGFwdGVyIGFyY2hpdmUgZmlsZSwgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImVqYiIKLQkJICAgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYW4gZWpiLWphciwKLQkgICAgICByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbgotCSAgICAgIHBhY2thZ2UuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iamF2YSIKLQkJICAgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgamF2YSBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGEgamF2YQotCSAgICAgIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUsIHJlbGF0aXZlIHRvIHRoZSB0b3AKLQkgICAgICBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWIiCi0JCSAgICAgdHlwZT0iamF2YWVlOndlYlR5cGUiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbHQtZGQiCi0JCSAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGFsdC1kZCBlbGVtZW50IHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlCi0JICAgIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JICAgIGZpbGUgZm9yIGEgcGFydGljdWxhciBKYXZhIEVFIG1vZHVsZS4gIFRoZSBVUkkgbXVzdAotCSAgICBzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBkZXBsb3ltZW50Ci0JICAgIGRlc2NyaXB0b3IgZmlsZSByZWxhdGl2ZSB0byB0aGUgYXBwbGljYXRpb24ncyByb290Ci0JICAgIGRpcmVjdG9yeS4gSWYgYWx0LWRkIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBkZXBsb3llcgotCSAgICBtdXN0IHJlYWQgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmcm9tIHRoZSBkZWZhdWx0Ci0JICAgIGxvY2F0aW9uIGFuZCBmaWxlIG5hbWUgcmVxdWlyZWQgYnkgdGhlIHJlc3BlY3RpdmUKLQkgICAgY29tcG9uZW50IHNwZWNpZmljYXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2ViVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHdlYlR5cGUgZGVmaW5lcyB0aGUgd2ViLXVyaSBhbmQgY29udGV4dC1yb290IG9mCi0JYSB3ZWIgYXBwbGljYXRpb24gbW9kdWxlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWItdXJpIgotCQkgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd2ViLXVyaSBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGEgd2ViCi0JICAgIGFwcGxpY2F0aW9uIGZpbGUsIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlCi0JICAgIGFwcGxpY2F0aW9uIHBhY2thZ2UuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGV4dC1yb290IgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLQotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgY29udGV4dC1yb290IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBjb250ZXh0IHJvb3QKLQkgICAgb2YgYSB3ZWIgYXBwbGljYXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2Nvbm5lY3Rvcl8xXzAuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9jb25uZWN0b3JfMV8wLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFiM2I1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2Nvbm5lY3Rvcl8xXzAuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsNTU3ICswLDAgQEAKLTwhLS0KLUNvcHlyaWdodCAyMDAwLTIwMDEgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiA5MDEgU2FuIEFudG9uaW8gUm9hZCwKLVBhbG8gQWx0bywgQ0EgIDk0MzAzLCBVLlMuQS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVRoaXMgcHJvZHVjdCBvciBkb2N1bWVudCBpcyBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGFuZCBkaXN0cmlidXRlZAotdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgaXRzIHVzZSwgY29weWluZywgZGlzdHJpYnV0aW9uLCBhbmQKLWRlY29tcGlsYXRpb24uICBObyBwYXJ0IG9mIHRoaXMgcHJvZHVjdCBvciBkb2N1bWVudGF0aW9uIG1heSBiZQotcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KLW9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi1UaGlyZCBwYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMgY29weXJpZ2h0ZWQgYW5kCi1saWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBMb2dvLCBTb2xhcmlzLCBKYXZhLCBKYXZhU2VydmVyIFBhZ2VzLCBKYXZhCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsIEpEQkMsIEpESywgSmF2YU1haWwgYW5kIEVudGVycHJpc2UgSmF2YUJlYW5zLAotYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYyBpbiB0aGUgVS5TLgotYW5kIG90aGVyIGNvdW50cmllcy4KLQotQWxsIFNQQVJDIHRyYWRlbWFya3MgYXJlIHVzZWQgdW5kZXIgbGljZW5zZSBhbmQgYXJlIHRyYWRlbWFya3MKLW9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTUEFSQyBJbnRlcm5hdGlvbmFsLCBJbmMuCi1pbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLiBQcm9kdWN0cyBiZWFyaW5nIFNQQVJDCi10cmFkZW1hcmtzIGFyZSBiYXNlZCB1cG9uIGFuIGFyY2hpdGVjdHVyZSBkZXZlbG9wZWQgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotCi1Qb3N0U2NyaXB0IGlzIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcywgSW5jLgotCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMgU3ViamVjdCB0bwotU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTEwgRVhQUkVTUyBPUiBJTVBMSUVECi1DT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5EIFdBUlJBTlRJRVMsIElOQ0xVRElORyBBTlkKLUlNUExJRUQgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UgT1IgTk9OLUlORlJJTkdFTUVOVCwgQVJFIERJU0NMQUlNRUQsIEVYQ0VQVAotVE8gVEhFIEVYVEVOVCBUSEFUIFNVQ0ggRElTQ0xBSU1FUlMgQVJFIEhFTEQgVE8gQkUgTEVHQUxMWQotSU5WQUxJRC4KLQotX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCi1Db3B5cmlnaHQgMjAwMC0yMDAxIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sCi05MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSAgOTQzMDMsIEV0YXRzLVVuaXMuCi1Ub3VzIGRyb2l0cyByZSdzZXJ2ZSdzLgotCi0KLUNlIHByb2R1aXQgb3UgZG9jdW1lbnQgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IGV0IGRpc3RyaWJ1ZScgYXZlYwotZGVzIGxpY2VuY2VzIHF1aSBlbiByZXN0cmVpZ25lbnQgbCd1dGlsaXNhdGlvbiwgbGEgY29waWUsIGxhIGRpc3RyaWJ1dGlvbiwKLWV0IGxhIGRlJ2NvbXBpbGF0aW9uLiAgQXVjdW5lIHBhcnRpZSBkZSBjZSBwcm9kdWl0IG91IGRlIHNhIGRvY3VtZW50YXRpb24KLWFzc29jaWUnZSBuZSBwZXV0IGVedHJlIHJlcHJvZHVpdGUgc291cyBhdWN1bmUgZm9ybWUsIHBhciBxdWVscXVlIG1veWVuCi1xdWUgY2Ugc29pdCwgc2FucyBsJ2F1dG9yaXNhdGlvbiBwcmUnYWxhYmxlIGV0IGUnY3JpdGUgZGUgU3VuIGV0IGRlIHNlcwotYmFpbGxldXJzIGRlIGxpY2VuY2UsIHMnaWwgeSBlbiBhLgotCi1MZSBsb2dpY2llbCBkZSd0ZW51IHBhciBkZXMgdGllcnMsIGV0IHF1aSBjb21wcmVuZCBsYSB0ZWNobm9sb2dpZQotcmVsYXRpdmUgYXV4IHBvbGljZXMgZGUgY2FyYWN0ZWByZXMsIGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodAotZXQgbGljZW5jaWUnIHBhciBkZXMgZm91cm5pc3NldXJzIGRlIFN1bi4KLQotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCBsZSBsb2dvIFN1biwgU29sYXJpcywgSmF2YSwgSmF2YVNlcnZlciBQYWdlcywgSmF2YQotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCBKREJDLCBKREssIEphdmFNYWlsLCBldCBFbnRlcnByaXNlIEphdmFCZWFucywKLXNvbnQgZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMgZGUncG9zZSdlcyBkZSBTdW4KLU1pY3Jvc3lzdGVtcywgSW5jLiBhdXggRXRhdHMtVW5pcyBldCBkYW5zIGQnYXV0cmVzIHBheXMuCi0KLVRvdXRlcyBsZXMgbWFycXVlcyBTUEFSQyBzb250IHV0aWxpc2UnZXMgc291cyBsaWNlbmNlIGV0IHNvbnQKLWRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzIGRlJ3Bvc2UnZXMgZGUgU1BBUkMKLUludGVybmF0aW9uYWwsIEluYy4gYXV4IEV0YXRzLVVuaXMgZXQgIGRhbnMKLWQnYXV0cmVzIHBheXMuIExlcyBwcm9kdWl0cyBwb3J0YW50IGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQKLWJhc2UncyBzdXIgdW5lIGFyY2hpdGVjdHVyZSBkZSd2ZWxvcHBlJ2UgcGFyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLQotUG9zdGNyaXB0IGVzdCB1bmUgbWFycXVlIGVucmVnaXN0cmUnZSBkJ0Fkb2JlIFN5c3RlbXMgSW5jLgotCi1MQSBET0NVTUVOVEFUSU9OIEVTVCBGT1VSTklFICJFTiBMJ0VUQVQiIEVUIFRPVVRFUyBBVVRSRVMgQ09ORElUSU9OUywKLURFQ0xBUkFUSU9OUyBFVCBHQVJBTlRJRVMgRVhQUkVTU0VTIE9VIFRBQ0lURVMgU09OVCBGT1JNRUxMRU1FTlQgRVhDTFVFUywKLURBTlMgTEEgTUVTVVJFIEFVVE9SSVNFRSBQQVIgTEEgTE9JIEFQUExJQ0FCTEUsIFkgQ09NUFJJUyBOT1RBTU1FTlQKLVRPVVRFIEdBUkFOVElFIElNUExJQ0lURSBSRUxBVElWRSBBIExBIFFVQUxJVEUgTUFSQ0hBTkRFLCBBIEwnQVBUSVRVREUKLUEgVU5FIFVUSUxJU0FUSU9OIFBBUlRJQ1VMSUVSRSBPVSBBIEwnQUJTRU5DRSBERSBDT05UUkVGQUNPTi4KLS0tPgotCi08IS0tCi1UaGlzIGlzIHRoZSBYTUwgRFREIGZvciB0aGUgQ29ubmVjdG9yIDEuMCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi1BbGwgQ29ubmVjdG9yIDEuMCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5jbHVkZSBhIERPQ1RZUEUKLW9mIHRoZSBmb2xsb3dpbmcgZm9ybToKLQotICA8IURPQ1RZUEUgY29ubmVjdG9yIFBVQkxJQwotCSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgQ29ubmVjdG9yIDEuMC8vRU4iCi0JImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2Nvbm5lY3Rvcl8xXzAuZHRkIj4KLQotLS0+Ci0KLTwhLS0KLVRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi1lbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IGNvbnRhaW4gUENEQVRBLCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlCi0gIGluIHRoZSBkYXRhIG1heSBiZSBpZ25vcmVkLgotCi0tIEluIGVsZW1lbnRzIHdob3NlIHZhbHVlIGlzIGFuICJlbnVtZXJhdGVkIHR5cGUiLCB0aGUgdmFsdWUgaXMKLSAgY2FzZSBzZW5zaXRpdmUuCi0KLS0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUgc2FtZQotICBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3Qgc3RhcnRpbmcgd2l0aCAiLyIpCi0gIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4KLSAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5Ci0gIG5hbWVzIGluIHRoZSByb290IG9mIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlCi0gIG5hbWVzIGFyZSBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgc2VydmxldCBBUEkuCi0tLT4KLQotCi08IS0tCi1UaGUgY29ubmVjdG9yIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi1mb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgZWxlbWVudCBpbmNsdWRlcyBnZW5lcmFsIGluZm9ybWF0aW9uIC0gdmVuZG9yCi1uYW1lLCB2ZXJzaW9uLCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gc3VwcG9ydGVkLCBpY29uIC0gIGFib3V0IHRoZQotcmVzb3VyY2UgYWRhcHRlciBtb2R1bGUuIEl0IGFsc28gaW5jbHVkZXMgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhlCi1pbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoCi10aGUgZWxlbWVudCByZXNvdXJjZWFkYXB0ZXIuCi0tLT4KLTwhRUxFTUVOVCBjb25uZWN0b3IgKGRpc3BsYXktbmFtZT8sIGRlc2NyaXB0aW9uPywgaWNvbj8sIHZlbmRvci1uYW1lLAotc3BlYy12ZXJzaW9uLCBlaXMtdHlwZSwgdmVyc2lvbiwgbGljZW5zZT8sIHJlc291cmNlYWRhcHRlcik+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBzcGVjaWZpZXMgYW4gYXV0aGVudGljYXRpb24gbWVjaGFuaXNtCi1zdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuIE5vdGUgdGhhdCB0aGlzIHN1cHBvcnQgaXMgZm9yCi10aGUgcmVzb3VyY2UgYWRhcHRlciBhbmQgbm90IGZvciB0aGUgdW5kZXJseWluZyBFSVMgaW5zdGFuY2UuIFRoZQotb3B0aW9uYWwgZGVzY3JpcHRpb24gc3BlY2lmaWVzIGFueSByZXNvdXJjZSBhZGFwdGVyIHNwZWNpZmljIHJlcXVpcmVtZW50Ci1mb3IgdGhlIHN1cHBvcnQgb2Ygc2VjdXJpdHkgY29udHJhY3QgYW5kIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbS4KLQotTm90ZSB0aGF0IEJhc2ljUGFzc3dvcmQgbWVjaGFuaXNtIHR5cGUgc2hvdWxkIHN1cHBvcnQgdGhlCi1qYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsIGludGVyZmFjZS4KLVRoZSBLZXJidjUgbWVjaGFuaXNtIHR5cGUgc2hvdWxkIHN1cHBvcnQgdGhlCi1qYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuR2VuZXJpY0NyZWRlbnRpYWwgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiByZXNvdXJjZWFkYXB0ZXIKLS0tPgotPCFFTEVNRU5UIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSAoCi1kZXNjcmlwdGlvbj8sIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlLCBjcmVkZW50aWFsLWludGVyZmFjZSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlIHNwZWNpZmllcyB0eXBlIG9mIGFuIGF1dGhlbnRpY2F0aW9uCi1tZWNoYW5pc20uCi0KLVRoZSBleGFtcGxlIHZhbHVlcyBhcmU6Ci0gICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+QmFzaWNQYXNzd29yZAotICAgICAgICAgICAgICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+S2VyYnY1Ci0gICAgICAgICAgICAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLQotQW55IGFkZGl0aW9uYWwgc2VjdXJpdHkgbWVjaGFuaXNtcyBhcmUgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhlCi1Db25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uCi0KLVVzZWQgaW46IGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbQotLS0+Ci08IUVMRU1FTlQgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWxlbWVudCBjb25maWctcHJvcGVydHkgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhIHNpbmdsZQotY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBmb3IgYSBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2UuCi0KLUVhY2ggTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5IGluc3RhbmNlIGNyZWF0ZXMgY29ubmVjdGlvbnMgdG8gYQotc3BlY2lmaWMgRUlTIGluc3RhbmNlIGJhc2VkIG9uIHRoZSBwcm9wZXJ0aWVzIGNvbmZpZ3VyZWQgb24gdGhlCi1NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2UuIFRoZSBjb25maWd1cmFibGUgcHJvcGVydGllcyBhcmUKLXNwZWNpZmllZCBvbmx5IG9uY2UgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgZXZlbiB0aG91Z2ggYQotcmVzb3VyY2UgYWRhcHRlciBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgbXVsdGlwbGUgTWFuYWdlZENvbm5uZWN0aW9uLQotRmFjdG9yeSBpbnN0YW5jZXMgKHRoYXQgY3JlYXRlIGNvbm5lY3Rpb25zIHRvIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YKLXRoZSBzYW1lIEVJUykuCi0KLVRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgbmFtZSwgdHlwZQotYW5kIGFuIG9wdGlvbmFsIHZhbHVlIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5LiBJZiB0aGUgcmVzb3VyY2UKLWFkYXB0ZXIgcHJvdmlkZXIgZG9lcyBub3Qgc3BlY2lmeSBhIHZhbHVlIHRoYW4gdGhlIGRlcGxveWVyIGlzCi1yZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIGEgdmFsaWQgdmFsdWUgZm9yIGEgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4KLQotQW55IGJvdW5kcyBvciB3ZWxsLWRlZmluZWQgdmFsdWVzIG9mIHByb3BlcnRpZXMgc2hvdWxkIGJlIGRlc2NyaWJlZAotaW4gdGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQuCi0KLVVzZWQgaW46IHJlc291cmNlYWRhcHRlcgotLS0+Ci08IUVMRU1FTlQgY29uZmlnLXByb3BlcnR5IChkZXNjcmlwdGlvbj8sIGNvbmZpZy1wcm9wZXJ0eS1uYW1lLAotY29uZmlnLXByb3BlcnR5LXR5cGUsIGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT8pPgotCi08IS0tCi1UaGUgZWxlbWVudCBjb25maWctcHJvcGVydHktbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiBhIGNvbmZpZ3VyYXRpb24KLXByb3BlcnR5LgotCi1UaGUgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBkZWZpbmVzIGEgc2V0IG9mIHdlbGwtZGVmaW5lZCBwcm9wZXJ0aWVzCi1hbGwgb2YgdHlwZSBqYXZhLmxhbmcuU3RyaW5nLiBUaGVzZSBhcmUgYXMgZm9sbG93czoKLSAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPlNlcnZlck5hbWU8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+UG9ydE51bWJlcjwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgIDxjb25maWctcHJvcGVydHktbmFtZT5Vc2VyTmFtZTwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgIDxjb25maWctcHJvcGVydHktbmFtZT5QYXNzd29yZDwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgIDxjb25maWctcHJvcGVydHktbmFtZT5Db25uZWN0aW9uVVJMPC9jb25maWctcHJvcGVydHktbmFtZT4KLQotQSByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyIGNhbiBleHRlbmQgdGhpcyBwcm9wZXJ0eSBzZXQgdG8gaW5jbHVkZQotcHJvcGVydGllcyBzcGVjaWZpYyB0byB0aGUgcmVzb3VyY2UgYWRhcHRlciBhbmQgaXRzIHVuZGVybHlpbmcgRUlTLgotCi1Vc2VkIGluOiBjb25maWctcHJvcGVydHkKLQotRXhhbXBsZTogPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPlNlcnZlck5hbWU8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotLS0+Ci08IUVMRU1FTlQgY29uZmlnLXByb3BlcnR5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWxlbWVudCBjb25maWctcHJvcGVydHktdHlwZSBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIEphdmEKLXR5cGUgb2YgYSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGFzIHJlcXVpcmVkIGJ5IE1hbmFnZWRDb25uZWN0aW9uLQotRmFjdG9yeSBpbnN0YW5jZS4KLQotVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBjb25maWctcHJvcGVydHktdHlwZToKLSAgIGphdmEubGFuZy5Cb29sZWFuLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuSW50ZWdlciwKLSAgIGphdmEubGFuZy5Eb3VibGUsIGphdmEubGFuZy5CeXRlLCBqYXZhLmxhbmcuU2hvcnQsCi0gICBqYXZhLmxhbmcuTG9uZywgamF2YS5sYW5nLkZsb2F0LCBqYXZhLmxhbmcuQ2hhcmFjdGVyCi0KLVVzZWQgaW46IGNvbmZpZy1wcm9wZXJ0eQotCi1FeGFtcGxlOiA8Y29uZmlnLXByb3BlcnR5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0tLT4KLTwhRUxFTUVOVCBjb25maWctcHJvcGVydHktdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGNvbmZpZy1wcm9wZXJ0eS12YWx1ZSBjb250YWlucyB0aGUgdmFsdWUgb2YgYSBjb25maWd1cmF0aW9uCi1lbnRyeS4KLQotVXNlZCBpbjogY29uZmlnLXByb3BlcnR5Ci0KLUV4YW1wbGU6IDxjb25maWctcHJvcGVydHktdmFsdWU+V29tYmF0U2VydmVyPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0tLT4KLTwhRUxFTUVOVCBjb25maWctcHJvcGVydHktdmFsdWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWxlbWVudCBjb25uZWN0aW9uLWltcGwtY2xhc3Mgc3BlY2lmaWVzIHRoZSBmdWxseS1xdWFsaWZpZWQKLW5hbWUgb2YgdGhlIENvbm5lY3Rpb24gY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHJlc291cmNlIGFkYXB0ZXIKLXNwZWNpZmljIENvbm5lY3Rpb24gaW50ZXJmYWNlLgotCi1Vc2VkIGluOiByZXNvdXJjZWFkYXB0ZXIKLQotRXhhbXBsZTogPGNvbm5lY3Rpb24taW1wbC1jbGFzcz5jb20ud29tYmF0LkNvbm5lY3Rpb25JbXBsCi0gICAgICAgICA8L2Nvbm5lY3Rpb24taW1wbC1jbGFzcz4KLS0tPgotPCFFTEVNRU5UIGNvbm5lY3Rpb24taW1wbC1jbGFzcyAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGNvbm5lY3Rpb24taW50ZXJmYWNlIHNwZWNpZmllcyB0aGUgZnVsbHktcXVhbGlmaWVkCi1uYW1lIG9mIHRoZSBDb25uZWN0aW9uIGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlCi1hZGFwdGVyLgotCi1Vc2VkIGluOiByZXNvdXJjZWFkYXB0ZXIKLQotRXhhbXBsZTogPGNvbm5lY3Rpb24taW50ZXJmYWNlPmphdmF4LnJlc291cmNlLmNjaS5Db25uZWN0aW9uCi0gICAgICAgICA8L2Nvbm5lY3Rpb24taW50ZXJmYWNlPgotLS0+Ci08IUVMRU1FTlQgY29ubmVjdGlvbi1pbnRlcmZhY2UgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWxlbWVudCBjb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHktcXVhbGlmaWVkCi1uYW1lIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeSBjbGFzcyB0aGF0IGltcGxlbWVudHMgcmVzb3VyY2UgYWRhcHRlcgotc3BlY2lmaWMgQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiByZXNvdXJjZWFkYXB0ZXIKLQotRXhhbXBsZTogPGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Y29tLndvbWJhdC5Db25uZWN0aW9uRmFjdG9yeUltcGwKLSAgICAgICAgIDwvY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz4KLS0tPgotPCFFTEVNRU5UIGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3MgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWxlbWVudCBjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2Ugc3BlY2lmaWVzIHRoZSBmdWxseS1xdWFsaWZpZWQKLW5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5IGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlCi1hZGFwdGVyLgotCi1Vc2VkIGluOiByZXNvdXJjZWFkYXB0ZXIKLQotRXhhbXBsZTogPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5jb20ud29tYmF0LkNvbm5lY3Rpb25GYWN0b3J5Ci0gICAgICAgICA8L2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT4KLU9SCi08Y29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPmphdmF4LnJlc291cmNlLmNjaS5Db25uZWN0aW9uRmFjdG9yeQotICAgICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Ci0tLT4KLTwhRUxFTUVOVCBjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2UgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWxlbWVudCBjcmVkZW50aWFsLWludGVyZmFjZSBzcGVjaWZpZXMgdGhlIGludGVyZmFjZSB0aGF0IHRoZQotcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBmb3IgdGhlIHJlcHJlc2VudGF0aW9uCi1vZiB0aGUgY3JlZGVudGlhbHMuIFRoaXMgZWxlbWVudCBzaG91bGQgYmUgdXNlZCBieSBhcHBsaWNhdGlvbiBzZXJ2ZXIKLXRvIGZpbmQgb3V0IHRoZSBDcmVkZW50aWFsIGludGVyZmFjZSBpdCBzaG91bGQgdXNlIGFzIHBhcnQgb2YgdGhlCi1zZWN1cml0eSBjb250cmFjdC4KLQotVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6Ci0gICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbAotICAgICAgICA8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbAotICAgICAgICA8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotCi1Vc2VkIGluOiBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20KLS0tPgotPCFFTEVNRU5UIGNyZWRlbnRpYWwtaW50ZXJmYWNlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgaXMgdXNlZCB0byBwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50Ci1lbGVtZW50LiAgVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQKLXRoZSByZXNvdXJjZSBhZGFwdGVyIHJhciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mCi10aGUgcmVzb3VyY2UgYWRhcHRlciByYXIgZmlsZSAoaS5lLiwgdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMKLXVzZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIgcmFyIGZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbgotd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbi4KLQotVXNlZCBpbjogYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLCBjb25maWctcHJvcGVydHksIGNvbm5lY3RvciwgbGljZW5zZSwKLXNlY3VyaXR5LXBlcm1pc3Npb24KLS0tPgotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCi1kaXNwbGF5ZWQgYnkgdG9vbHMuICBUaGUgZGlzcGxheSBuYW1lIG5lZWQgbm90IGJlIHVuaXF1ZS4KLQotVXNlZCBpbjogY29ubmVjdG9yCi0KLUV4YW1wbGU6Ci0KLTxkaXNwbGF5LW5hbWU+RW1wbG95ZWUgU2VsZiBTZXJ2aWNlPC9kaXNwbGF5LW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBkaXNwbGF5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWxlbWVudCBlaXMtdHlwZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiB0aGUKLUVJUy4gRm9yIGV4YW1wbGUsIHRoZSB0eXBlIG9mIGFuIEVJUyBjYW4gYmUgcHJvZHVjdCBuYW1lIG9mIEVJUwotaW5kZXBlbmRlbnQgb2YgYW55IHZlcnNpb24gaW5mby4KLQotVGhpcyBoZWxwcyBpbiBpZGVudGlmeWluZyBFSVMgaW5zdGFuY2VzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aAotdGhpcyByZXNvdXJjZSBhZGFwdGVyLgotCi1Vc2VkIGluOiBjb25uZWN0b3IKLS0tPgotPCFFTEVNRU5UIGVpcy10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGljb24gZWxlbWVudCBjb250YWlucyBzbWFsbC1pY29uIGFuZCBsYXJnZS1pY29uIGVsZW1lbnRzIHRoYXQKLXNwZWNpZnkgdGhlIGZpbGUgbmFtZXMgZm9yIHNtYWxsIGFuZCBhIGxhcmdlIEdJRiBvciBKUEVHIGljb24gaW1hZ2VzCi11c2VkIHRvIHJlcHJlc2VudCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gYSBHVUkgdG9vbC4KLQotVXNlZCBpbjogY29ubmVjdG9yCi0tLT4KLTwhRUxFTUVOVCBpY29uIChzbWFsbC1pY29uPywgbGFyZ2UtaWNvbj8pPgotCi08IS0tCi1UaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotY29udGFpbmluZyBhIGxhcmdlICgzMiB4IDMyKSBpY29uIGltYWdlLiBUaGUgZmlsZQotbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSByZXNvdXJjZSBhZGFwdGVyJ3MKLXJhciBmaWxlLgotCi1UaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgotVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLVVzZWQgaW46IGljb24KLQotRXhhbXBsZToKLQotPGxhcmdlLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMzJ4MzIuanBnPC9sYXJnZS1pY29uPgotLS0+Ci08IUVMRU1FTlQgbGFyZ2UtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IGxpY2Vuc2Ugc3BlY2lmaWVzIGxpY2Vuc2luZyByZXF1aXJlbWVudHMgZm9yIHRoZSByZXNvdXJjZQotYWRhcHRlciBtb2R1bGUuIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhIGxpY2Vuc2UgaXMgcmVxdWlyZWQKLXRvIGRlcGxveSBhbmQgdXNlIHRoaXMgcmVzb3VyY2UgYWRhcHRlciwgYW5kIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi1vZiB0aGUgbGljZW5zaW5nIHRlcm1zIChleGFtcGxlczogZHVyYXRpb24gb2YgbGljZW5zZSwgbnVtYmVyIG9mCi1jb25uZWN0aW9uIHJlc3RyaWN0aW9ucykuCi0KLVVzZWQgaW46IGNvbm5lY3RvcgotLS0+Ci08IUVMRU1FTlQgbGljZW5zZSAoZGVzY3JpcHRpb24/LCBsaWNlbnNlLXJlcXVpcmVkKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgbGljZW5zZS1yZXF1aXJlZCBzcGVjaWZpZXMgd2hldGhlciBhIGxpY2Vuc2UgaXMgcmVxdWlyZWQKLXRvIGRlcGxveSBhbmQgdXNlIHRoZSByZXNvdXJjZSBhZGFwdGVyLiBUaGlzIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YKLXRoZSBmb2xsb3dpbmc6Ci0KLQk8bGljZW5zZS1yZXF1aXJlZD50cnVlPC9saWNlbnNlLXJlcXVpcmVkPgotCTxsaWNlbnNlLXJlcXVpcmVkPmZhbHNlPC9saWNlbnNlLXJlcXVpcmVkPgotCi1Vc2VkIGluOiBsaWNlbnNlCi0tLT4KLTwhRUxFTUVOVCBsaWNlbnNlLXJlcXVpcmVkICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkCi1uYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgamF2YXgucmVzb3VyY2Uuc3BpLk1hbmFnZWQtCi1Db25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2UuIFRoaXMgSmF2YSBjbGFzcyBpcyBwcm92aWRlZCBhcyBwYXJ0IG9mCi1yZXNvdXJjZSBhZGFwdGVyJ3MgaW1wbGVtZW50YXRpb24gb2YgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQKLWNvbnRyYWN0cy4KLQotVXNlZCBpbjogcmVzb3VyY2VhZGFwdGVyCi0KLUV4YW1wbGU6Ci0gIDxtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+Y29tLndvbWJhdC5NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlJbXBsCi0gIDwvbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPgotLS0+Ci08IUVMRU1FTlQgbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0IHNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZQotYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyByZS1hdXRoZW50aWNhdGlvbiBvZiBleGlzdGluZyBNYW5hZ2VkLQotQ29ubmVjdGlvbiBpbnN0YW5jZS4gTm90ZSB0aGF0IHRoaXMgaW5mb3JtYXRpb24gaXMgZm9yIHRoZSByZXNvdXJjZQotYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBhbmQgbm90IGZvciB0aGUgdW5kZXJseWluZyBFSVMgaW5zdGFuY2UuCi0KLVRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgICAgICA8cmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0PnRydWU8L3JlYXV0aGVudGljYXRpb24tc3VwcG9ydD4KLSAgICAgICAgPHJlYXV0aGVudGljYXRpb24tc3VwcG9ydD5mYWxzZTwvcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0PgotVXNlZCBpbjogcmVzb3VyY2VhZGFwdGVyCi0tLT4KLTwhRUxFTUVOVCByZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWxlbWVudCByZXNvdXJjZWFkYXB0ZXIgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXNvdXJjZQotYWRhcHRlci4gVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzIGZ1bGx5LXF1YWxpZmllZCBuYW1lcyBvZgotY2xhc3MvaW50ZXJmYWNlcyByZXF1aXJlZCBhcyBwYXJ0IG9mIHRoZSBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlCi1zcGVjaWZpZWQgY29udHJhY3RzLCBsZXZlbCBvZiB0cmFuc2FjdGlvbiBzdXBwb3J0IHByb3ZpZGVkLAotY29uZmlndXJhYmxlIHByb3BlcnRpZXMgZm9yIE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZXMsCi1vbmUgb3IgbW9yZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHN1cHBvcnRlZCBhbmQgYWRkaXRpb25hbAotcmVxdWlyZWQgc2VjdXJpdHkgcGVybWlzc2lvbnMuCi0KLUlmIHRoZXJlIGlzIG5vIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBzcGVjaWZpZWQgYXMgcGFydCBvZgotcmVzb3VyY2UgYWRhcHRlciBlbGVtZW50IHRoZW4gdGhlIHJlc291cmNlIGFkYXB0ZXIgZG9lcyBub3QKLXN1cHBvcnQgYW55IHN0YW5kYXJkIHNlY3VyaXR5IGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgYXMgcGFydAotb2Ygc2VjdXJpdHkgY29udHJhY3QuIFRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgaWdub3JlcyB0aGUgc2VjdXJpdHkKLXBhcnQgb2YgdGhlIHN5c3RlbSBjb250cmFjdHMgaW4gdGhpcyBjYXNlLgotCi1Vc2VkIGluOiBjb25uZWN0b3IKLS0tPgotPCFFTEVNRU5UIHJlc291cmNlYWRhcHRlciAoCi1tYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3MsIGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZSwKLWNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3MsIGNvbm5lY3Rpb24taW50ZXJmYWNlLAotY29ubmVjdGlvbi1pbXBsLWNsYXNzLCB0cmFuc2FjdGlvbi1zdXBwb3J0LCBjb25maWctcHJvcGVydHkqLAotYXV0aGVudGljYXRpb24tbWVjaGFuaXNtKiwgcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0LCBzZWN1cml0eS1wZXJtaXNzaW9uKgotKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgc2VjdXJpdHkgcGVybWlzc2lvbiBzcGVjaWZpZXMgYSBzZWN1cml0eSBwZXJtaXNzaW9uIHRoYXQKLWlzIHJlcXVpcmVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyIGNvZGUuCi0KLVRoZSBzZWN1cml0eSBwZXJtaXNzaW9uIGxpc3RlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFyZSBvbmVzCi10aGF0IGFyZSBkaWZmZXJlbnQgZnJvbSB0aG9zZSByZXF1aXJlZCBieSB0aGUgZGVmYXVsdCBwZXJtaXNzaW9uIHNldAotYXMgc3BlY2lmaWVkIGluIHRoZSBjb25uZWN0b3Igc3BlY2lmaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi1jYW4gbWVudGlvbiBzcGVjaWZpYyByZWFzb24gdGhhdCByZXNvdXJjZSBhZGFwdGVyIHJlcXVpcmVzIGEgZ2l2ZW4KLXNlY3VyaXR5IHBlcm1pc3Npb24uCi0KLVVzZWQgaW46IHJlc291cmNlYWRhcHRlcgotLS0+Ci08IUVMRU1FTlQgc2VjdXJpdHktcGVybWlzc2lvbiAoZGVzY3JpcHRpb24/LCBzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWMpPgotCi08IS0tCi1UaGUgZWxlbWVudCBwZXJtaXNzaW9uLXNwZWMgc3BlY2lmaWVzIGEgc2VjdXJpdHkgcGVybWlzc2lvbiBiYXNlZAotb24gdGhlIFNlY3VyaXR5IHBvbGljeSBmaWxlIHN5bnRheC4gUmVmZXIgdG8gdGhlIGZvbGxvd2luZyBVUkwgZm9yCi1TdW4ncyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcGVybWlzc2lvbiBzcGVjaWZpY2F0aW9uOgotCi1odHRwOgotCi1Vc2VkIGluOiBzZWN1cml0eS1wZXJtaXNzaW9uCi0tLT4KLTwhRUxFTUVOVCBzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWMgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotY29udGFpbmluZyBhIHNtYWxsICgxNiB4IDE2KSBpY29uIGltYWdlLiBUaGUgZmlsZQotbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSByZXNvdXJjZSBhZGFwdGVyJ3MKLXJhciBmaWxlLgotCi1UaGUgaW1hZ2UgbWF5IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LgotVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLVVzZWQgaW46IGljb24KLQotRXhhbXBsZToKLQotPHNtYWxsLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnPC9zbWFsbC1pY29uPgotLS0+Ci08IUVMRU1FTlQgc21hbGwtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IHNwZWMtdmVyc2lvbiBzcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgdGhlIGNvbm5lY3RvcgotYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyByZXNvdXJjZQotYWRhcHRlci4gVGhpcyBpbmZvcm1hdGlvbiBlbmFibGVzIGRlcGxveWVyIHRvIGNvbmZpZ3VyZSB0aGUgcmVzb3VyY2UKLWFkYXB0ZXIgdG8gc3VwcG9ydCBkZXBsb3ltZW50IGFuZCBydW50aW1lIHJlcXVpcmVtZW50cyBvZiB0aGUKLWNvcnJlc3BvbmRpbmcgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uLgotCi1Vc2VkIGluOiBjb25uZWN0b3IKLQotRXhhbXBsZToKLSAgPHNwZWMtdmVyc2lvbj4xLjA8L3NwZWMtdmVyc2lvbj4KLS0tPgotPCFFTEVNRU5UIHNwZWMtdmVyc2lvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB0cmFuc2FjdGlvbi1zdXBwb3J0IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBsZXZlbCBvZiB0cmFuc2FjdGlvbgotc3VwcG9ydCBwcm92aWRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4KLVRoZSB2YWx1ZSBvZiB0cmFuc2FjdGlvbi1zdXBwb3J0IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gPHRyYW5zYWN0aW9uLXN1cHBvcnQ+Tm9UcmFuc2FjdGlvbjwvdHJhbnNhY3Rpb24tc3VwcG9ydD4KLSA8dHJhbnNhY3Rpb24tc3VwcG9ydD5Mb2NhbFRyYW5zYWN0aW9uPC90cmFuc2FjdGlvbi1zdXBwb3J0PgotIDx0cmFuc2FjdGlvbi1zdXBwb3J0PlhBVHJhbnNhY3Rpb248L3RyYW5zYWN0aW9uLXN1cHBvcnQ+Ci0KLVVzZWQgaW46IHJlc291cmNlYWRhcHRlcgotLS0+Ci08IUVMRU1FTlQgdHJhbnNhY3Rpb24tc3VwcG9ydCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbGVtZW50IHZlbmRvci1uYW1lIHNwZWNpZmllcyB0aGUgbmFtZSBvZiByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyCi12ZW5kb3IuCi0KLVVzZWQgaW46IGNvbm5lY3RvcgotCi1FeGFtcGxlOgotICA8dmVuZG9yLW5hbWU+V29tYmF0IENvcnAuPC92ZW5kb3ItbmFtZT4KLS0tPgotPCFFTEVNRU5UIHZlbmRvci1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVsZW1lbnQgdmVyc2lvbiBzcGVjaWZpZXMgYSBzdHJpbmctYmFzZWQgdmVyc2lvbiBvZiB0aGUKLXJlc291cmNlIGFkYXB0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgYWRhcHRlciBwcm92aWRlci4KLQotVXNlZCBpbjogY29ubmVjdG9yCi0KLUV4YW1wbGU6Ci0gIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLS0tPgotPCFFTEVNRU5UIHZlcnNpb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgSUQgbWVjaGFuaXNtIGlzIHRvIGFsbG93IHRvb2xzIHRoYXQgcHJvZHVjZSBhZGRpdGlvbmFsIGRlcGxveW1lbnQKLWluZm9ybWF0aW9uIChpLmUuLCBpbmZvcm1hdGlvbiBiZXlvbmQgdGhlIHN0YW5kYXJkIGRlcGxveW1lbnQKLWRlc2NyaXB0b3IgaW5mb3JtYXRpb24pIHRvIHN0b3JlIHRoZSBub24tc3RhbmRhcmQgaW5mb3JtYXRpb24gaW4gYQotc2VwYXJhdGUgZmlsZSwgYW5kIGVhc2lseSByZWZlciBmcm9tIHRoZXNlIHRvb2wtc3BlY2lmaWMgZmlsZXMgdG8gdGhlCi1pbmZvcm1hdGlvbiBpbiB0aGUgc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi1Ub29scyBhcmUgbm90IGFsbG93ZWQgdG8gYWRkIHRoZSBub24tc3RhbmRhcmQgaW5mb3JtYXRpb24gaW50byB0aGUKLXN0YW5kYXJkIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLS0tPgotCi08IUFUVExJU1QgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbmZpZy1wcm9wZXJ0eSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb25maWctcHJvcGVydHktbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb25maWctcHJvcGVydHktdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb25maWctcHJvcGVydHktdmFsdWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29ubmVjdGlvbi1pbXBsLWNsYXNzIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbm5lY3Rpb24taW50ZXJmYWNlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbm5lY3RvciBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjcmVkZW50aWFsLWludGVyZmFjZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZXNjcmlwdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWlzLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsYXJnZS1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxpY2Vuc2UgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGljZW5zZS1yZXF1aXJlZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc291cmNlYWRhcHRlciBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZWN1cml0eS1wZXJtaXNzaW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzbWFsbC1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNwZWMtdmVyc2lvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0cmFuc2FjdGlvbi1zdXBwb3J0IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZlbmRvci1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZlcnNpb24gaWQgSUQgI0lNUExJRUQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2Nvbm5lY3Rvcl8xXzUueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9jb25uZWN0b3JfMV81LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZkMTkxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2Nvbm5lY3Rvcl8xXzUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iMS41Ij4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIyljb25uZWN0b3JfMV81LnhzZHMJMS4yNyAwNi8xNy8wMwotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgOTAxIFNhbiBBbnRvbmlvCi0gICAgICBSb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiBBbGwgcmlnaHRzCi0gICAgICByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBWwotCi0JVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIENvbm5lY3RvciAxLjUgZGVwbG95bWVudAotCWRlc2NyaXB0b3IuICBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgYmUgbmFtZWQKLQkiTUVUQS1JTkYvcmEueG1sIiBpbiB0aGUgY29ubmVjdG9yJ3MgcmFyIGZpbGUuICBBbGwgQ29ubmVjdG9yCi0JZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlIHRoZSBjb25uZWN0b3IgcmVzb3VyY2UKLQlhZGFwdGVyIHNjaGVtYSBieSB1c2luZyB0aGUgSjJFRSBuYW1lc3BhY2U6Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCi0KLQlhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0JdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8Y29ubmVjdG9yIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0JICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCi0JCSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2Nvbm5lY3Rvcl8xXzUueHNkIgotCSAgICAgIHZlcnNpb249IjEuNSI+Ci0JICAgICAgLi4uCi0JICAgIDwvY29ubmVjdG9yPgotCi0JVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0JdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSjJFRQotCW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2Nvbm5lY3Rvcl8xXzUueHNkCi0KLQldXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0JSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLQlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdG9yIiB0eXBlPSJqMmVlOmNvbm5lY3RvclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBjb25uZWN0b3IgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBkZXBsb3ltZW50Ci0JZGVzY3JpcHRvciBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgZWxlbWVudCBpbmNsdWRlcwotCWdlbmVyYWwgaW5mb3JtYXRpb24gLSB2ZW5kb3IgbmFtZSwgcmVzb3VyY2UgYWRhcHRlciB2ZXJzaW9uLAotCWljb24gLSBhYm91dCB0aGUgcmVzb3VyY2UgYWRhcHRlciBtb2R1bGUuIEl0IGFsc28gaW5jbHVkZXMKLQlpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlc291cmNlCi0JYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBlbGVtZW50Ci0JcmVzb3VyY2VhZGFwdGVyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPC94c2Q6ZWxlbWVudD4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWN0aXZhdGlvbnNwZWNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYWN0aXZhdGlvbnNwZWNUeXBlIHNwZWNpZmllcyBhbiBhY3RpdmF0aW9uCi0Jc3BlY2lmaWNhdGlvbi4gIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBmdWxseSBxdWFsaWZpZWQKLQlKYXZhIGNsYXNzIG5hbWUgb2YgYW4gYWN0aXZhdGlvbiBzcGVjaWZpY2F0aW9uIGFuZCBhIHNldCBvZgotCXJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgbmFtZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbnNwZWMtY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbGVtZW50IGFjdGl2YXRpb25zcGVjLWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkKLQkgICAgICBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBhY3RpdmF0aW9uCi0JICAgICAgc3BlY2lmaWNhdGlvbiBjbGFzcy4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUKLQkgICAgICBqYXZheC5yZXNvdXJjZS5zcGkuQWN0aXZhdGlvblNwZWMgaW50ZXJmYWNlLiBUaGUKLQkgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzIGlzIHJlcXVpcmVkIHRvIGJlIGEKLQkgICAgICBKYXZhQmVhbi4KLQotCSAgICAgIEV4YW1wbGU6Ci0JCSAgPGFjdGl2YXRpb25zcGVjLWNsYXNzPmNvbS53b21iYXQuQWN0aXZhdGlvblNwZWNJbXBsCi0JCSAgPC9hY3RpdmF0aW9uc3BlYy1jbGFzcz4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1aXJlZC1jb25maWctcHJvcGVydHkiCi0JCSAgIHR5cGU9ImoyZWU6cmVxdWlyZWQtY29uZmlnLXByb3BlcnR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFkbWlub2JqZWN0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGFkbWlub2JqZWN0VHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYW4KLQlhZG1pbmlzdGVyZWQgb2JqZWN0LiAgQWRtaW5pc3RlcmVkIG9iamVjdHMgYXJlIHNwZWNpZmljIHRvIGEKLQltZXNzYWdpbmcgc3R5bGUgb3IgbWVzc2FnZSBwcm92aWRlci4gIFRoaXMgY29udGFpbnMKLQlpbmZvcm1hdGlvbiBvbiB0aGUgSmF2YSB0eXBlIG9mIHRoZSBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkKLQlhbiBhZG1pbmlzdGVyZWQgb2JqZWN0LCBpdHMgSmF2YSBjbGFzcyBuYW1lIGFuZCBpdHMKLQljb25maWd1cmF0aW9uIHByb3BlcnRpZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRtaW5vYmplY3QtaW50ZXJmYWNlIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgZWxlbWVudCBhZG1pbm9iamVjdC1pbnRlcmZhY2Ugc3BlY2lmaWVzIHRoZQotCSAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIHR5cGUgb2YgdGhlCi0JICAgICAgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGFuIGFkbWluaXN0ZXJlZCBvYmplY3QuCi0KLQkgICAgICBFeGFtcGxlOgotCQk8YWRtaW5vYmplY3QtaW50ZXJmYWNlPmphdmF4Lmptcy5EZXN0aW5hdGlvbgotCQk8L2FkbWlub2JqZWN0LWludGVyZmFjZT4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkbWlub2JqZWN0LWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgZWxlbWVudCBhZG1pbm9iamVjdC1jbGFzcyBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0JICAgICAgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBvZiBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0LgotCi0JICAgICAgRXhhbXBsZToKLQkJICA8YWRtaW5vYmplY3QtY2xhc3M+Y29tLndvbWJhdC5EZXN0aW5hdGlvbkltcGwKLQkJICA8L2FkbWlub2JqZWN0LWNsYXNzPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5IgotCQkgICB0eXBlPSJqMmVlOmNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdXRoZW50aWNhdGlvbi1tZWNoYW5pc21UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtVHlwZSBzcGVjaWZpZXMgYW4gYXV0aGVudGljYXRpb24KLQltZWNoYW5pc20gc3VwcG9ydGVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLiBOb3RlIHRoYXQgdGhpcwotCXN1cHBvcnQgaXMgZm9yIHRoZSByZXNvdXJjZSBhZGFwdGVyIGFuZCBub3QgZm9yIHRoZQotCXVuZGVybHlpbmcgRUlTIGluc3RhbmNlLiBUaGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gc3BlY2lmaWVzCi0JYW55IHJlc291cmNlIGFkYXB0ZXIgc3BlY2lmaWMgcmVxdWlyZW1lbnQgZm9yIHRoZSBzdXBwb3J0IG9mCi0Jc2VjdXJpdHkgY29udHJhY3QgYW5kIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbS4KLQotCU5vdGUgdGhhdCBCYXNpY1Bhc3N3b3JkIG1lY2hhbmlzbSB0eXBlIHNob3VsZCBzdXBwb3J0IHRoZQotCWphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwgaW50ZXJmYWNlLgotCVRoZSBLZXJidjUgbWVjaGFuaXNtIHR5cGUgc2hvdWxkIHN1cHBvcnQgdGhlCi0Jb3JnLmlldGYuamdzcy5HU1NDcmVkZW50aWFsIGludGVyZmFjZSBvciB0aGUgZGVwcmVjYXRlZAotCWphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbCBpbnRlcmZhY2UuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbGVtZW50IGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlIHNwZWNpZmllcwotCSAgICAgIHR5cGUgb2YgYW4gYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLgotCi0JICAgICAgVGhlIGV4YW1wbGUgdmFsdWVzIGFyZToKLQotCSAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5CYXNpY1Bhc3N3b3JkCi0JICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLQotCSAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5LZXJidjUKLQkgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotCi0JICAgICAgQW55IGFkZGl0aW9uYWwgc2VjdXJpdHkgbWVjaGFuaXNtcyBhcmUgb3V0c2lkZSB0aGUKLQkgICAgICBzY29wZSBvZiB0aGUgQ29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uLgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3JlZGVudGlhbC1pbnRlcmZhY2UiCi0JCSAgIHR5cGU9ImoyZWU6Y3JlZGVudGlhbC1pbnRlcmZhY2VUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29uZmlnLXByb3BlcnR5LW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBjb25maWctcHJvcGVydHktbmFtZVR5cGUgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotCSAgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4KLQotCSAgVGhlIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUgZGVmaW5lcyBhIHNldCBvZiB3ZWxsLWRlZmluZWQKLQkgIHByb3BlcnRpZXMgYWxsIG9mIHR5cGUgamF2YS5sYW5nLlN0cmluZy4gVGhlc2UgYXJlIGFzCi0JICBmb2xsb3dzLgotCi0JICAgICAgIFNlcnZlck5hbWUKLQkgICAgICAgUG9ydE51bWJlcgotCSAgICAgICBVc2VyTmFtZQotCSAgICAgICBQYXNzd29yZAotCSAgICAgICBDb25uZWN0aW9uVVJMCi0KLQkgIEEgcmVzb3VyY2UgYWRhcHRlciBwcm92aWRlciBjYW4gZXh0ZW5kIHRoaXMgcHJvcGVydHkgc2V0IHRvCi0JICBpbmNsdWRlIHByb3BlcnRpZXMgc3BlY2lmaWMgdG8gdGhlIHJlc291cmNlIGFkYXB0ZXIgYW5kIGl0cwotCSAgdW5kZXJseWluZyBFSVMuCi0KLQkgIFBvc3NpYmxlIHZhbHVlcyBpbmNsdWRlCi0JCSAgU2VydmVyTmFtZQotCQkgIFBvcnROdW1iZXIKLQkJICBVc2VyTmFtZQotCQkgIFBhc3N3b3JkCi0JCSAgQ29ubmVjdGlvblVSTAotCi0JICBFeGFtcGxlOiA8Y29uZmlnLXByb3BlcnR5LW5hbWU+U2VydmVyTmFtZTwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTp4c2RTdHJpbmdUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbmZpZy1wcm9wZXJ0eS10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgY29uZmlnLXByb3BlcnR5LXR5cGVUeXBlIGNvbnRhaW5zIHRoZSBmdWxseQotCSAgcXVhbGlmaWVkIEphdmEgdHlwZSBvZiBhIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCi0KLQkgIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXM6Ci0JICAgICBqYXZhLmxhbmcuQm9vbGVhbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIsCi0JICAgICBqYXZhLmxhbmcuRG91YmxlLCBqYXZhLmxhbmcuQnl0ZSwgamF2YS5sYW5nLlNob3J0LAotCSAgICAgamF2YS5sYW5nLkxvbmcsIGphdmEubGFuZy5GbG9hdCwgamF2YS5sYW5nLkNoYXJhY3RlcgotCi0JICBVc2VkIGluOiBjb25maWctcHJvcGVydHkKLQotCSAgRXhhbXBsZToKLQkgIDxjb25maWctcHJvcGVydHktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jb25maWctcHJvcGVydHktdHlwZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkJvb2xlYW4iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkludGVnZXIiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuRG91YmxlIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkJ5dGUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuU2hvcnQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuTG9uZyIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5GbG9hdCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5DaGFyYWN0ZXIiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25maWctcHJvcGVydHlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgY29uZmlnLXByb3BlcnR5VHlwZSBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEgc2luZ2xlCi0JY29uZmlndXJhdGlvbiBwcm9wZXJ0eSB0aGF0IG1heSBiZSB1c2VkIGZvciBwcm92aWRpbmcKLQljb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgotCi0JVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBuYW1lLAotCXR5cGUgYW5kIGFuIG9wdGlvbmFsIHZhbHVlIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5LiBJZgotCXRoZSByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyIGRvZXMgbm90IHNwZWNpZnkgYSB2YWx1ZSB0aGFuCi0JdGhlIGRlcGxveWVyIGlzIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgYSB2YWxpZCB2YWx1ZSBmb3IKLQlhIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCi0KLQlBbnkgYm91bmRzIG9yIHdlbGwtZGVmaW5lZCB2YWx1ZXMgb2YgcHJvcGVydGllcyBzaG91bGQgYmUKLQlkZXNjcmliZWQgaW4gdGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZy1wcm9wZXJ0eS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmNvbmZpZy1wcm9wZXJ0eS1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZy1wcm9wZXJ0eS10eXBlIgotCQkgICB0eXBlPSJqMmVlOmNvbmZpZy1wcm9wZXJ0eS10eXBlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZy1wcm9wZXJ0eS12YWx1ZSIKLQkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgZWxlbWVudCBjb25maWctcHJvcGVydHktdmFsdWUgY29udGFpbnMgdGhlIHZhbHVlCi0JICAgICAgb2YgYSBjb25maWd1cmF0aW9uIGVudHJ5LiBOb3RlLCBpdCBpcyBwb3NzaWJsZSBmb3IgYQotCSAgICAgIHJlc291cmNlIGFkYXB0ZXIgZGVwbG95ZXIgdG8gb3ZlcnJpZGUgdGhpcwotCSAgICAgIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZHVyaW5nIGRlcGxveW1lbnQuCi0KLQkgICAgICBFeGFtcGxlOgotCSAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+V29tYmF0U2VydmVyPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29ubmVjdGlvbi1kZWZpbml0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGNvbm5lY3Rpb24tZGVmaW5pdGlvblR5cGUgZGVmaW5lcyBhIHNldCBvZiBjb25uZWN0aW9uCi0JaW50ZXJmYWNlcyBhbmQgY2xhc3NlcyBwZXJ0YWluaW5nIHRvIGEgcGFydGljdWxhciBjb25uZWN0aW9uCi0JdHlwZS4gVGhpcyBhbHNvIGluY2x1ZGVzIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIGZvcgotCU1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnN0YW5jZXMgdGhhdCBtYXkgYmUgcHJvZHVjZWQgb3V0Ci0Jb2YgdGhpcyBzZXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgZWxlbWVudCBtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3Mgc3BlY2lmaWVzCi0JICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQKLQkgICAgICBpbXBsZW1lbnRzIHRoZQotCSAgICAgIGphdmF4LnJlc291cmNlLnNwaS5NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlLgotCSAgICAgIFRoaXMgSmF2YSBjbGFzcyBpcyBwcm92aWRlZCBhcyBwYXJ0IG9mIHJlc291cmNlCi0JICAgICAgYWRhcHRlcidzIGltcGxlbWVudGF0aW9uIG9mIGNvbm5lY3RvciBhcmNoaXRlY3R1cmUKLQkgICAgICBzcGVjaWZpZWQgY29udHJhY3RzLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcwotCSAgICAgIGNsYXNzIGlzIHJlcXVpcmVkIHRvIGJlIGEgSmF2YUJlYW4uCi0KLQkgICAgICBFeGFtcGxlOgotCSAgICAgIDxtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+Ci0JCSAgY29tLndvbWJhdC5NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlJbXBsCi0JICAgICAgPC9tYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uZmlnLXByb3BlcnR5IgotCQkgICB0eXBlPSJqMmVlOmNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2UiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbGVtZW50IGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZSBzcGVjaWZpZXMKLQkgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb25GYWN0b3J5Ci0JICAgICAgaW50ZXJmYWNlIHN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4KLQotCSAgICAgIEV4YW1wbGU6Ci0JICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5jb20ud29tYmF0LkNvbm5lY3Rpb25GYWN0b3J5Ci0JICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Ci0KLQkgICAgICBPUgotCi0JICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5jY2kuQ29ubmVjdGlvbkZhY3RvcnkKLQkgICAgICA8L2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbGVtZW50IGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3Mgc3BlY2lmaWVzCi0JICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeQotCSAgICAgIGNsYXNzIHRoYXQgaW1wbGVtZW50cyByZXNvdXJjZSBhZGFwdGVyCi0JICAgICAgc3BlY2lmaWMgQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlLgotCi0JICAgICAgRXhhbXBsZToKLQotCSAgICAgIDxjb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPmNvbS53b21iYXQuQ29ubmVjdGlvbkZhY3RvcnlJbXBsCi0JICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24taW50ZXJmYWNlIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgY29ubmVjdGlvbi1pbnRlcmZhY2UgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0JICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gaW50ZXJmYWNlIHN1cHBvcnRlZAotCSAgICAgIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLgotCi0JICAgICAgRXhhbXBsZToKLQotCQkgIDxjb25uZWN0aW9uLWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5jY2kuQ29ubmVjdGlvbgotCQkgIDwvY29ubmVjdGlvbi1pbnRlcmZhY2U+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1pbXBsLWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgY29ubmVjdGlvbi1pbXBsLWNsYXNzVHlwZSBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0JICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gY2xhc3MgdGhhdAotCSAgICAgIGltcGxlbWVudHMgcmVzb3VyY2UgYWRhcHRlciBzcGVjaWZpYyBDb25uZWN0aW9uCi0JICAgICAgaW50ZXJmYWNlLiAgSXQgaXMgdXNlZCBieSB0aGUgY29ubmVjdGlvbi1pbXBsLWNsYXNzCi0JICAgICAgZWxlbWVudHMuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JCSAgPGNvbm5lY3Rpb24taW1wbC1jbGFzcz5jb20ud29tYmF0LkNvbm5lY3Rpb25JbXBsCi0JCSAgPC9jb25uZWN0aW9uLWltcGwtY2xhc3M+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29ubmVjdG9yVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGNvbm5lY3RvclR5cGUgZGVmaW5lcyBhIHJlc291cmNlIGFkYXB0ZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVuZG9yLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBlbGVtZW50IHZlbmRvci1uYW1lIHNwZWNpZmllcyB0aGUgbmFtZSBvZgotCSAgICByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyIHZlbmRvci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlaXMtdHlwZSIKLQkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGVsZW1lbnQgZWlzLXR5cGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JICAgIHR5cGUgb2YgdGhlIEVJUy4gRm9yIGV4YW1wbGUsIHRoZSB0eXBlIG9mIGFuIEVJUyBjYW4KLQkgICAgYmUgcHJvZHVjdCBuYW1lIG9mIEVJUyBpbmRlcGVuZGVudCBvZiBhbnkgdmVyc2lvbgotCSAgICBpbmZvLgotCi0JICAgIFRoaXMgaGVscHMgaW4gaWRlbnRpZnlpbmcgRUlTIGluc3RhbmNlcyB0aGF0IGNhbiBiZQotCSAgICB1c2VkIHdpdGggdGhpcyByZXNvdXJjZSBhZGFwdGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlYWRhcHRlci12ZXJzaW9uIgotCQkgICB0eXBlPSJqMmVlOnhzZFN0cmluZ1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZWxlbWVudCByZXNvdXJjZWFkYXB0ZXItdmVyc2lvbiBzcGVjaWZpZXMgYSBzdHJpbmctYmFzZWQgdmVyc2lvbgotCSAgICBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciBmcm9tIHRoZSByZXNvdXJjZSBhZGFwdGVyCi0JICAgIHByb3ZpZGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGljZW5zZSIKLQkJICAgdHlwZT0iajJlZTpsaWNlbnNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2VhZGFwdGVyIgotCQkgICB0eXBlPSJqMmVlOnJlc291cmNlYWRhcHRlclR5cGUiLz4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0JCSAgIGZpeGVkPSIxLjUiCi0JCSAgIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHZlcnNpb24gc3BlY2lmaWVzIHRoZSB2ZXJzaW9uIG9mIHRoZQotCSAgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uIHRoYXQgaXMKLQkgIHN1cHBvcnRlZCBieSB0aGlzIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgaW5mb3JtYXRpb24KLQkgIGVuYWJsZXMgZGVwbG95ZXIgdG8gY29uZmlndXJlIHRoZSByZXNvdXJjZSBhZGFwdGVyIHRvCi0JICBzdXBwb3J0IGRlcGxveW1lbnQgYW5kIHJ1bnRpbWUgcmVxdWlyZW1lbnRzIG9mIHRoZQotCSAgY29ycmVzcG9uZGluZyBjb25uZWN0b3IgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3JlZGVudGlhbC1pbnRlcmZhY2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgY3JlZGVudGlhbC1pbnRlcmZhY2VUeXBlIHNwZWNpZmllcyB0aGUKLQlpbnRlcmZhY2UgdGhhdCB0aGUgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbgotCXN1cHBvcnRzIGZvciB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlCi0JY3JlZGVudGlhbHMuIFRoaXMgZWxlbWVudChzKSB0aGF0IHVzZSB0aGlzIHR5cGUsCi0JaS5lLiBjcmVkZW50aWFsLWludGVyZmFjZSwgIHNob3VsZCBiZSB1c2VkIGJ5Ci0JYXBwbGljYXRpb24gc2VydmVyIHRvIGZpbmQgb3V0IHRoZSBDcmVkZW50aWFsCi0JaW50ZXJmYWNlIGl0IHNob3VsZCB1c2UgYXMgcGFydCBvZiB0aGUgc2VjdXJpdHkKLQljb250cmFjdC4KLQotCVRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOgotCi0JamF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbAotCW9yZy5pZXRmLmpnc3MuR1NTQ3JlZGVudGlhbAotCWphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6ZW51bWVyYXRpb24KLQkgICAgIHZhbHVlPSJqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsIi8+Ci0JPHhzZDplbnVtZXJhdGlvbgotCSAgICAgdmFsdWU9Im9yZy5pZXRmLmpnc3MuR1NTQ3JlZGVudGlhbCIvPgotCTx4c2Q6ZW51bWVyYXRpb24KLQkgICAgIHZhbHVlPSJqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuR2VuZXJpY0NyZWRlbnRpYWwiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBpbmJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uCi0JYWJvdXQgYW4gaW5ib3VuZCByZXNvdXJjZSBhZGFwdGVyLiBUaGlzIGNvbnRhaW5zIGluZm9ybWF0aW9uCi0Jc3BlY2lmaWMgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyCi0JbGlicmFyeSBhcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgbWVzc2FnZWFkYXB0ZXIgZWxlbWVudC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlYWRhcHRlciIKLQkJICAgdHlwZT0iajJlZTptZXNzYWdlYWRhcHRlclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWxpc3RlbmVyLXR5cGUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBtZXNzYWdlbGlzdGVuZXItdHlwZSBlbGVtZW50IGNvbnRlbnQgbXVzdCBiZQotCSAgICAgIHVuaXF1ZSBpbiB0aGUgbWVzc2FnZWFkYXB0ZXIuIFNldmVyYWwgbWVzc2FnZWxpc3RlbmVycwotCSAgICAgIGNhbiBub3QgdXNlIHRoZSBzYW1lIG1lc3NhZ2VsaXN0ZW5lci10eXBlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTptZXNzYWdlbGlzdGVuZXIiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6bWVzc2FnZWxpc3RlbmVyLXR5cGUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxpY2Vuc2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbGljZW5zZVR5cGUgc3BlY2lmaWVzIGxpY2Vuc2luZyByZXF1aXJlbWVudHMgZm9yIHRoZQotCXJlc291cmNlIGFkYXB0ZXIgbW9kdWxlLiBUaGlzIHR5cGUgc3BlY2lmaWVzIHdoZXRoZXIgYQotCWxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gZGVwbG95IGFuZCB1c2UgdGhpcyByZXNvdXJjZSBhZGFwdGVyLAotCWFuZCBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgbGljZW5zaW5nIHRlcm1zCi0JKGV4YW1wbGVzOiBkdXJhdGlvbiBvZiBsaWNlbnNlLCBudW1iZXIgb2YgY29ubmVjdGlvbgotCXJlc3RyaWN0aW9ucykuIEl0IGlzIHVzZWQgYnkgdGhlIGxpY2Vuc2UgZWxlbWVudC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaWNlbnNlLXJlcXVpcmVkIgotCQkgICB0eXBlPSJqMmVlOnRydWUtZmFsc2VUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGVsZW1lbnQgbGljZW5zZS1yZXF1aXJlZCBzcGVjaWZpZXMgd2hldGhlciBhCi0JICAgIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gZGVwbG95IGFuZCB1c2UgdGhlCi0JICAgIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZgotCSAgICB0aGUgZm9sbG93aW5nLCAidHJ1ZSIgb3IgImZhbHNlIi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlYWRhcHRlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtZXNzYWdlYWRhcHRlclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZQotCW1lc3NhZ2luZyBjYXBhYmlsaXRpZXMgb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMKLQljb250YWlucyBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0JcmVzb3VyY2UgYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZQotCW1lc3NhZ2VsaXN0ZW5lciBlbGVtZW50LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2VsaXN0ZW5lciIKLQkJICAgdHlwZT0iajJlZTptZXNzYWdlbGlzdGVuZXJUeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2VsaXN0ZW5lclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtZXNzYWdlbGlzdGVuZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCBhCi0Jc3BlY2lmaWMgbWVzc2FnZSBsaXN0ZW5lciBzdXBwb3J0ZWQgYnkgdGhlIG1lc3NhZ2luZwotCXJlc291cmNlIGFkYXB0ZXIuIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBKYXZhIHR5cGUKLQlvZiB0aGUgbWVzc2FnZSBsaXN0ZW5lciBpbnRlcmZhY2UgYW5kIGFuIGFjdGl2YXRpb24KLQlzcGVjaWZpY2F0aW9uLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2VsaXN0ZW5lci10eXBlIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgZWxlbWVudCBtZXNzYWdlbGlzdGVuZXItdHlwZSBzcGVjaWZpZXMgdGhlIGZ1bGx5Ci0JICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgdHlwZSBvZiBhIG1lc3NhZ2UKLQkgICAgICBsaXN0ZW5lciBpbnRlcmZhY2UuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JCTxtZXNzYWdlbGlzdGVuZXItdHlwZT5qYXZheC5qbXMuTWVzc2FnZUxpc3RlbmVyCi0JCTwvbWVzc2FnZWxpc3RlbmVyLXR5cGU+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uc3BlYyIKLQkJICAgdHlwZT0iajJlZTphY3RpdmF0aW9uc3BlY1R5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgb3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQKLQlhbiBvdXRib3VuZCByZXNvdXJjZSBhZGFwdGVyLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHkKLQlxdWFsaWZpZWQgbmFtZXMgb2YgY2xhc3Nlcy9pbnRlcmZhY2VzIHJlcXVpcmVkIGFzIHBhcnQgb2YKLQl0aGUgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQgY29udHJhY3RzIGZvcgotCWNvbm5lY3Rpb24gbWFuYWdlbWVudCwgbGV2ZWwgb2YgdHJhbnNhY3Rpb24gc3VwcG9ydAotCXByb3ZpZGVkLCBvbmUgb3IgbW9yZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIHN1cHBvcnRlZAotCWFuZCBhZGRpdGlvbmFsIHJlcXVpcmVkIHNlY3VyaXR5IHBlcm1pc3Npb25zLgotCi0JSWYgdGhlcmUgaXMgbm8gYXV0aGVudGljYXRpb24tbWVjaGFuaXNtIHNwZWNpZmllZCBhcyBwYXJ0IG9mCi0JcmVzb3VyY2UgYWRhcHRlciBlbGVtZW50IHRoZW4gdGhlIHJlc291cmNlIGFkYXB0ZXIgZG9lcyBub3QKLQlzdXBwb3J0IGFueSBzdGFuZGFyZCBzZWN1cml0eSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc21zIGFzCi0JcGFydCBvZiBzZWN1cml0eSBjb250cmFjdC4gVGhlIGFwcGxpY2F0aW9uIHNlcnZlciBpZ25vcmVzCi0JdGhlIHNlY3VyaXR5IHBhcnQgb2YgdGhlIHN5c3RlbSBjb250cmFjdHMgaW4gdGhpcyBjYXNlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tZGVmaW5pdGlvbiIKLQkJICAgdHlwZT0iajJlZTpjb25uZWN0aW9uLWRlZmluaXRpb25UeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zYWN0aW9uLXN1cHBvcnQiCi0JCSAgIHR5cGU9ImoyZWU6dHJhbnNhY3Rpb24tc3VwcG9ydFR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20iCi0JCSAgIHR5cGU9ImoyZWU6YXV0aGVudGljYXRpb24tbWVjaGFuaXNtVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYXV0aGVudGljYXRpb24tc3VwcG9ydCIKLQkJICAgdHlwZT0iajJlZTp0cnVlLWZhbHNlVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBlbGVtZW50IHJlYXV0aGVudGljYXRpb24tc3VwcG9ydCBzcGVjaWZpZXMKLQkgICAgd2hldGhlciB0aGUgcmVzb3VyY2UgYWRhcHRlciBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cwotCSAgICByZS1hdXRoZW50aWNhdGlvbiBvZiBleGlzdGluZyBNYW5hZ2VkLSBDb25uZWN0aW9uCi0JICAgIGluc3RhbmNlLiBOb3RlIHRoYXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBmb3IgdGhlCi0JICAgIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gYW5kIG5vdCBmb3IgdGhlCi0JICAgIHVuZGVybHlpbmcgRUlTIGluc3RhbmNlLiBUaGlzIGVsZW1lbnQgbXVzdCBoYXZlCi0JICAgIGVpdGhlciBhICJ0cnVlIiBvciAiZmFsc2UiIHZhbHVlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVxdWlyZWQtY29uZmlnLXByb3BlcnR5VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgcmVxdWlyZWQtY29uZmlnLXByb3BlcnR5VHlwZSBjb250YWlucyBhIGRlY2xhcmF0aW9uCi0JICBvZiBhIHNpbmdsZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IHVzZWQgZm9yIHNwZWNpZnlpbmcgYQotCSAgcmVxdWlyZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBuYW1lLiBJdCBpcyB1c2VkCi0JICBieSByZXF1aXJlZC1jb25maWctcHJvcGVydHkgZWxlbWVudHMuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxyZXF1aXJlZC1jb25maWctcHJvcGVydHk+RGVzdGluYXRpb248L3JlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbmZpZy1wcm9wZXJ0eS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmNvbmZpZy1wcm9wZXJ0eS1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlYWRhcHRlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSByZXNvdXJjZWFkYXB0ZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLQlyZXNvdXJjZSBhZGFwdGVyLiBUaGUgaW5mb3JtYXRpb24gaW5jbHVkZXMgZnVsbHkgcXVhbGlmaWVkCi0JcmVzb3VyY2UgYWRhcHRlciBKYXZhIGNsYXNzIG5hbWUsIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcywKLQlpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlc291cmNlCi0JYWRhcHRlciBsaWJyYXJ5IGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZQotCW91dGJvdW5kLXJlc291cmNlYWRhcHRlciBhbmQgaW5ib3VuZC1yZXNvdXJjZWFkYXB0ZXIKLQllbGVtZW50cywgYW5kIGFuIG9wdGlvbmFsIHNldCBvZiBhZG1pbmlzdGVyZWQgb2JqZWN0cy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZWFkYXB0ZXItY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGVsZW1lbnQgcmVzb3VyY2VhZGFwdGVyLWNsYXNzIHNwZWNpZmllcyB0aGUKLQkgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cwotCSAgICB0aGUgamF2YXgucmVzb3VyY2Uuc3BpLlJlc291cmNlQWRhcHRlcgotCSAgICBpbnRlcmZhY2UuIFRoaXMgSmF2YSBjbGFzcyBpcyBwcm92aWRlZCBhcyBwYXJ0IG9mCi0JICAgIHJlc291cmNlIGFkYXB0ZXIncyBpbXBsZW1lbnRhdGlvbiBvZiBjb25uZWN0b3IKLQkgICAgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBjb250cmFjdHMuIFRoZSBpbXBsZW1lbnRhdGlvbgotCSAgICBvZiB0aGlzIGNsYXNzIGlzIHJlcXVpcmVkIHRvIGJlIGEgSmF2YUJlYW4uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25maWctcHJvcGVydHkiCi0JCSAgIHR5cGU9ImoyZWU6Y29uZmlnLXByb3BlcnR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im91dGJvdW5kLXJlc291cmNlYWRhcHRlciIKLQkJICAgdHlwZT0iajJlZTpvdXRib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6dW5pcXVlIG5hbWU9ImNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZSBlbGVtZW50IGNvbnRlbnQKLQkgICAgICBtdXN0IGJlIHVuaXF1ZSBpbiB0aGUgb3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyLgotCSAgICAgIE11bHRpcGxlIGNvbm5lY3Rpb24tZGVmaW5pdGlvbnMgY2FuIG5vdCB1c2UgdGhlCi0JICAgICAgc2FtZSBjb25uZWN0aW9uZmFjdG9yeS10eXBlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpjb25uZWN0aW9uLWRlZmluaXRpb24iLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6Y29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlIi8+Ci0JPC94c2Q6dW5pcXVlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmJvdW5kLXJlc291cmNlYWRhcHRlciIKLQkJICAgdHlwZT0iajJlZTppbmJvdW5kLXJlc291cmNlYWRhcHRlclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkbWlub2JqZWN0IgotCQkgICB0eXBlPSJqMmVlOmFkbWlub2JqZWN0VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXBlcm1pc3Npb24iCi0JCSAgIHR5cGU9ImoyZWU6c2VjdXJpdHktcGVybWlzc2lvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWN1cml0eS1wZXJtaXNzaW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlY3VyaXR5LXBlcm1pc3Npb25UeXBlIHNwZWNpZmllcyBhIHNlY3VyaXR5Ci0JcGVybWlzc2lvbiB0aGF0IGlzIHJlcXVpcmVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyIGNvZGUuCi0KLQlUaGUgc2VjdXJpdHkgcGVybWlzc2lvbiBsaXN0ZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotCWFyZSBvbmVzIHRoYXQgYXJlIGRpZmZlcmVudCBmcm9tIHRob3NlIHJlcXVpcmVkIGJ5IHRoZQotCWRlZmF1bHQgcGVybWlzc2lvbiBzZXQgYXMgc3BlY2lmaWVkIGluIHRoZSBjb25uZWN0b3IKLQlzcGVjaWZpY2F0aW9uLiBUaGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gY2FuIG1lbnRpb24gc3BlY2lmaWMKLQlyZWFzb24gdGhhdCByZXNvdXJjZSBhZGFwdGVyIHJlcXVpcmVzIGEgZ2l2ZW4gc2VjdXJpdHkKLQlwZXJtaXNzaW9uLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYyIKLQkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGVsZW1lbnQgc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjIHNwZWNpZmllcyBhIHNlY3VyaXR5Ci0JICAgIHBlcm1pc3Npb24gYmFzZWQgb24gdGhlIFNlY3VyaXR5IHBvbGljeSBmaWxlCi0JICAgIHN5bnRheC4gUmVmZXIgdG8gdGhlIGZvbGxvd2luZyBVUkwgZm9yIFN1bidzCi0JICAgIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZWN1cml0eSBwZXJtaXNzaW9uCi0JICAgIHNwZWNpZmljYXRpb246Ci0KLQkgICAgaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qZGsvMS40L2RvY3MvZ3VpZGUvc2VjdXJpdHkvUG9saWN5RmlsZXMuaHRtbCNGaWxlU3ludGF4Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zYWN0aW9uLXN1cHBvcnRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdHJhbnNhY3Rpb24tc3VwcG9ydFR5cGUgc3BlY2lmaWVzIHRoZSBsZXZlbCBvZgotCXRyYW5zYWN0aW9uIHN1cHBvcnQgcHJvdmlkZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuIEl0IGlzCi0JdXNlZCBieSB0cmFuc2FjdGlvbi1zdXBwb3J0IGVsZW1lbnRzLgotCi0JVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLQkgICAgTm9UcmFuc2FjdGlvbgotCSAgICBMb2NhbFRyYW5zYWN0aW9uCi0JICAgIFhBVHJhbnNhY3Rpb24KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vVHJhbnNhY3Rpb24iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbFRyYW5zYWN0aW9uIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWEFUcmFuc2FjdGlvbiIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9lamItamFyXzFfMS5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2VqYi1qYXJfMV8xLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZkODM4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2VqYi1qYXJfMV8xLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDg5NCArMCwwIEBACi08IS0tCi1Db3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIDkwMSBTYW4gQW50b25pbyBSb2FkLAotUGFsbyBBbHRvLCBDQSAgOTQzMDMsIFUuUy5BLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAKLVRoaXMgcHJvZHVjdCBvciBkb2N1bWVudCBpcyBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGFuZCBkaXN0cmlidXRlZAotdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgaXRzIHVzZSwgY29weWluZywgZGlzdHJpYnV0aW9uLCBhbmQKLWRlY29tcGlsYXRpb24uICBObyBwYXJ0IG9mIHRoaXMgcHJvZHVjdCBvciBkb2N1bWVudGF0aW9uIG1heSBiZQotcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KLW9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LiAgCi0KLVRoaXJkIHBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcyBjb3B5cmlnaHRlZCBhbmQgCi1saWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuIAotCi1TdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gTG9nbywgU29sYXJpcywgSmF2YSwgSmF2YVNlcnZlciBQYWdlcywgSmF2YSAKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgSkRCQywgSkRLLCBKYXZhTWFpbCBhbmQgRW50ZXJwcmlzZSBKYXZhQmVhbnMsIAotYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYyBpbiB0aGUgVS5TLiAKLWFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUFsbCBTUEFSQyB0cmFkZW1hcmtzIGFyZSB1c2VkIHVuZGVyIGxpY2Vuc2UgYW5kIGFyZSB0cmFkZW1hcmtzCi1vciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU1BBUkMgSW50ZXJuYXRpb25hbCwgSW5jLgotaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4gUHJvZHVjdHMgYmVhcmluZyBTUEFSQwotdHJhZGVtYXJrcyBhcmUgYmFzZWQgdXBvbiBhbiBhcmNoaXRlY3R1cmUgZGV2ZWxvcGVkIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gCi0KLVBvc3RTY3JpcHQgaXMgYSByZWdpc3RlcmVkIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zLCBJbmMuIAotCi0gCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMgU3ViamVjdCB0byAKLVN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLQotIAotRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTEwgRVhQUkVTUyBPUiBJTVBMSUVECi1DT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5EIFdBUlJBTlRJRVMsIElOQ0xVRElORyBBTlkKLUlNUExJRUQgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UgT1IgTk9OLUlORlJJTkdFTUVOVCwgQVJFIERJU0NMQUlNRUQsIEVYQ0VQVAotVE8gVEhFIEVYVEVOVCBUSEFUIFNVQ0ggRElTQ0xBSU1FUlMgQVJFIEhFTEQgVE8gQkUgTEVHQUxMWQotSU5WQUxJRC4KLQotX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotQ29weXJpZ2h0IDE5OTkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgCi05MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSAgOTQzMDMsIEV0YXRzLVVuaXMuIAotVG91cyBkcm9pdHMgcmUnc2VydmUncy4KLSAKLQotQ2UgcHJvZHVpdCBvdSBkb2N1bWVudCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQgZGlzdHJpYnVlJyBhdmVjIAotZGVzIGxpY2VuY2VzIHF1aSBlbiByZXN0cmVpZ25lbnQgbCd1dGlsaXNhdGlvbiwgbGEgY29waWUsIGxhIGRpc3RyaWJ1dGlvbiwKLWV0IGxhIGRlJ2NvbXBpbGF0aW9uLiAgQXVjdW5lIHBhcnRpZSBkZSBjZSBwcm9kdWl0IG91IGRlIHNhIGRvY3VtZW50YXRpb24KLWFzc29jaWUnZSBuZSBwZXV0IGVedHJlIHJlcHJvZHVpdGUgc291cyBhdWN1bmUgZm9ybWUsIHBhciBxdWVscXVlIG1veWVuIAotcXVlIGNlIHNvaXQsIHNhbnMgbCdhdXRvcmlzYXRpb24gcHJlJ2FsYWJsZSBldCBlJ2NyaXRlIGRlIFN1biBldCBkZSBzZXMgCi1iYWlsbGV1cnMgZGUgbGljZW5jZSwgcydpbCB5IGVuIGEuICAKLQotTGUgbG9naWNpZWwgZGUndGVudSBwYXIgZGVzIHRpZXJzLCBldCBxdWkgY29tcHJlbmQgbGEgdGVjaG5vbG9naWUgCi1yZWxhdGl2ZSBhdXggcG9saWNlcyBkZSBjYXJhY3RlYHJlcywgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IAotZXQgbGljZW5jaWUnIHBhciBkZXMgZm91cm5pc3NldXJzIGRlIFN1bi4KLSAKLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgbGUgbG9nbyBTdW4sIFNvbGFyaXMsIEphdmEsIEphdmFTZXJ2ZXIgUGFnZXMsIEphdmEgCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsIEpEQkMsIEpESywgSmF2YU1haWwsIGV0IEVudGVycHJpc2UgSmF2YUJlYW5zLCAgCi1zb250IGRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzIGRlJ3Bvc2UnZXMgZGUgU3VuIAotTWljcm9zeXN0ZW1zLCBJbmMuIGF1eCBFdGF0cy1VbmlzIGV0IGRhbnMgZCdhdXRyZXMgcGF5cy4KLSAKLVRvdXRlcyBsZXMgbWFycXVlcyBTUEFSQyBzb250IHV0aWxpc2UnZXMgc291cyBsaWNlbmNlIGV0IHNvbnQKLWRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzIGRlJ3Bvc2UnZXMgZGUgU1BBUkMKLUludGVybmF0aW9uYWwsIEluYy4gYXV4IEV0YXRzLVVuaXMgZXQgIGRhbnMKLWQnYXV0cmVzIHBheXMuIExlcyBwcm9kdWl0cyBwb3J0YW50IGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQKLWJhc2UncyBzdXIgdW5lIGFyY2hpdGVjdHVyZSBkZSd2ZWxvcHBlJ2UgcGFyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIAotCi1Qb3N0Y3JpcHQgZXN0IHVuZSBtYXJxdWUgZW5yZWdpc3RyZSdlIGQnQWRvYmUgU3lzdGVtcyBJbmMuIAotIAotTEEgRE9DVU1FTlRBVElPTiBFU1QgRk9VUk5JRSAiRU4gTCdFVEFUIiBFVCBUT1VURVMgQVVUUkVTIENPTkRJVElPTlMsCi1ERUNMQVJBVElPTlMgRVQgR0FSQU5USUVTIEVYUFJFU1NFUyBPVSBUQUNJVEVTIFNPTlQgRk9STUVMTEVNRU5UIEVYQ0xVRVMsCi1EQU5TIExBIE1FU1VSRSBBVVRPUklTRUUgUEFSIExBIExPSSBBUFBMSUNBQkxFLCBZIENPTVBSSVMgTk9UQU1NRU5UCi1UT1VURSBHQVJBTlRJRSBJTVBMSUNJVEUgUkVMQVRJVkUgQSBMQSBRVUFMSVRFIE1BUkNIQU5ERSwgQSBMJ0FQVElUVURFCi1BIFVORSBVVElMSVNBVElPTiBQQVJUSUNVTElFUkUgT1UgQSBMJ0FCU0VOQ0UgREUgQ09OVFJFRkFDT04uCi0tLT4KLQotCi08IS0tCi1UaGlzIGlzIHRoZSBYTUwgRFREIGZvciB0aGUgRUpCIDEuMSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0tLT4KLQotCi08IS0tCi1UaGUgYXNzZW1ibHktZGVzY3JpcHRvciBlbGVtZW50IGNvbnRhaW5zIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGluZm9ybWF0aW9uLgotCi1UaGUgYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24gY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYXJ0czoKLXRoZSBkZWZpbml0aW9uIG9mIHNlY3VyaXR5IHJvbGVzLCB0aGUgZGVmaW5pdGlvbiBvZiBtZXRob2QgcGVybWlzc2lvbnMsCi1hbmQgdGhlIGRlZmluaXRpb24gb2YgdHJhbnNhY3Rpb24gYXR0cmlidXRlcyBmb3IgZW50ZXJwcmlzZSBiZWFucyB3aXRoCi1jb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbi4KLQotQWxsIHRoZSBwYXJ0cyBhcmUgb3B0aW9uYWwgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCBpZiB0aGUKLWxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlIGVtcHR5LgotCi1Qcm92aWRpbmcgYW4gYXNzZW1ibHktZGVzY3JpcHRvciBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGlzCi1vcHRpb25hbCBmb3IgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlci4KLQotVXNlZCBpbjogZWpiLWphcgotLS0+Ci08IUVMRU1FTlQgYXNzZW1ibHktZGVzY3JpcHRvciAoc2VjdXJpdHktcm9sZSosIG1ldGhvZC1wZXJtaXNzaW9uKiwKLQkJY29udGFpbmVyLXRyYW5zYWN0aW9uKik+Ci0KLTwhLS0KLVRoZSBjbXAtZmllbGQgZWxlbWVudCBkZXNjcmliZXMgYSBjb250YWluZXItbWFuYWdlZCBmaWVsZC4gVGhlIGZpZWxkCi1lbGVtZW50IGluY2x1ZGVzIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWVsZCwgYW5kIHRoZSBuYW1lIG9mCi10aGUgZmllbGQuCi0KLVVzZWQgaW46IGVudGl0eQotLS0+Ci08IUVMRU1FTlQgY21wLWZpZWxkIChkZXNjcmlwdGlvbj8sIGZpZWxkLW5hbWUpPgotCi08IS0tCi1UaGUgY29udGFpbmVyLXRyYW5zYWN0aW9uIGVsZW1lbnQgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyIG11c3QKLW1hbmFnZSB0cmFuc2FjdGlvbiBzY29wZXMgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBtZXRob2QgaW52b2NhdGlvbnMuCi1UaGUgZWxlbWVudCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIG1ldGhvZAotZWxlbWVudHMsIGFuZCBhIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZS5UaGUgdHJhbnNhY3Rpb24gYXR0cmlidXRlIGlzIHRvCi1iZSBhcHBsaWVkIHRvIGFsbCB0aGUgc3BlY2lmaWVkIG1ldGhvZHMuCi0KLVVzZWQgaW46IGFzc2VtYmx5LWRlc2NyaXB0b3IKLS0tPgotPCFFTEVNRU5UIGNvbnRhaW5lci10cmFuc2FjdGlvbiAoZGVzY3JpcHRpb24/LCBtZXRob2QrLAotCQl0cmFucy1hdHRyaWJ1dGUpPgotCi08IS0tCi1UaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gcHJvdmlkZQotdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4KLQotVGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGVqYi1qYXIKLWZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIGVqYi1qYXIgZmlsZQotKGkuZS4gdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUgdG9vbHMgdXNlZCBieSB0aGUgZWpiLWphciBmaWxlCi1jb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50Ci1lbGVtZW50LgotCi1Vc2VkIGluOiBjbXAtZmllbGQsIGNvbnRhaW5lci10cmFuc2FjdGlvbiwgZWpiLWphciwgZW50aXR5LCBlbnYtZW50cnksCi1lamItcmVmLCBtZXRob2QsIG1ldGhvZC1wZXJtaXNzaW9uLCByZXNvdXJjZS1yZWYsIHNlY3VyaXR5LXJvbGUsCi1zZWN1cml0eS1yb2xlLXJlZiwgYW5kIHNlc3Npb24uCi0tLT4KLTwhRUxFTUVOVCBkZXNjcmlwdGlvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZQotZGlzcGxheSBieSB0b29scy4KLQotVXNlZCBpbjogZWpiLWphciwgc2Vzc2lvbiwgYW5kIGVudGl0eQotCi1FeGFtcGxlOgotCTxkaXNwbGF5LW5hbWU+RW1wbG95ZWUgU2VsZiBTZXJ2aWNlPC9kaXNwbGF5LW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBkaXNwbGF5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZQotZW50ZXJwcmlzZSBiZWFuJ3MgY2xhc3MuCi0KLVVzZWQgaW46IGVudGl0eSBhbmQgc2Vzc2lvbgotCi1FeGFtcGxlOgotCQk8ZWpiLWNsYXNzPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2VCZWFuPC9lamItY2xhc3M+Ci0tLT4KLTwhRUxFTUVOVCBlamItY2xhc3MgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgb3B0aW9uYWwgZWpiLWNsaWVudC1qYXIgZWxlbWVudCBzcGVjaWZpZXMgYSBKQVIgZmlsZSB0aGF0IGNvbnRhaW5zCi10aGUgY2xhc3MgZmlsZXMgbmVjZXNzYXJ5IGZvciBhIGNsaWVudCBwcm9ncmFtIHRvIGFjY2VzcyB0aGUgZW50ZXJwcmlzZQotYmVhbnMgaW4gdGhlIGVqYi1qYXIgZmlsZS4gVGhlIERlcGxveWVyIHNob3VsZCBtYWtlIHRoZSBlamItY2xpZW50IEpBUgotZmlsZSBhY2Nlc3NpYmxlIHRvIHRoZSBjbGllbnQncyBjbGFzcy1sb2FkZXIuCi0KLVVzZWQgaW46IGVqYi1qYXIKLQotRXhhbXBsZToKLQk8ZWpiLWNsaWVudC1qYXI+ZW1wbG95ZWVfc2VydmljZV9jbGllbnQuamFyPC9lamItY2xpZW50LWphcj4KLS0tPgotPCFFTEVNRU5UIGVqYi1jbGllbnQtamFyICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1qYXIgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBFSkIgZGVwbG95bWVudAotZGVzY3JpcHRvci4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGVqYi1qYXIgZmlsZSwKLW9wdGlvbmFsIGRpc3BsYXkgbmFtZSwgb3B0aW9uYWwgc21hbGwgaWNvbiBmaWxlIG5hbWUsIG9wdGlvbmFsIGxhcmdlCi1pY29uIGZpbGUgbmFtZSwgbWFuZGF0b3J5IHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGluY2x1ZGVkCi1lbnRlcnByaXNlIGJlYW5zLCBvcHRpb25hbCBhcHBsaWNhdGlvbi1hc3NlbWJseSBkZXNjcmlwdG9yLCBhbmQgYW4KLW9wdGlvbmFsIG5hbWUgb2YgYW4gZWpiLWNsaWVudC1qYXIgZmlsZSBmb3IgdGhlIGVqYi1qYXIuCi0tLT4KLTwhRUxFTUVOVCBlamItamFyIChkZXNjcmlwdGlvbj8sIGRpc3BsYXktbmFtZT8sIHNtYWxsLWljb24/LAotCQlsYXJnZS1pY29uPywgZW50ZXJwcmlzZS1iZWFucywgYXNzZW1ibHktZGVzY3JpcHRvcj8sCi0JCWVqYi1jbGllbnQtamFyPyk+Ci0KLTwhLS0KLVRoZSBlamItbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGVqYi1yZWYgZWxlbWVudCB0byBzcGVjaWZ5IHRoYXQgYW4KLUVKQiByZWZlcmVuY2UgaXMgbGlua2VkIHRvIGFub3RoZXIgZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBlamItamFyCi1maWxlLgotCi1UaGUgdmFsdWUgb2YgdGhlIGVqYi1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgZWpiLW5hbWUgb2YgYW4gZW50ZXJwcmlzZQotYmVhbiBpbiB0aGUgc2FtZSBlamItamFyIGZpbGUsIG9yIGluIGFub3RoZXIgZWpiLWphciBmaWxlIGluIHRoZSBzYW1lCi1KMkVFIGFwcGxpY2F0aW9uIHVuaXQuCi0KLVVzZWQgaW46IGVqYi1yZWYKLQotRXhhbXBsZToKLQkJPGVqYi1saW5rPkVtcGxveWVlUmVjb3JkPC9lamItbGluaz4KLS0tPgotPCFFTEVNRU5UIGVqYi1saW5rICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGFuIGVudGVycHJpc2UgYmVhbidzIG5hbWUuIFRoaXMgbmFtZSBpcwotYXNzaWduZWQgYnkgdGhlIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBuYW1lIHRoZSBlbnRlcnByaXNlIGJlYW4gaW4KLXRoZSBlamItamFyIGZpbGUncyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIGFtb25nCi10aGUgbmFtZXMgb2YgdGhlIGVudGVycHJpc2UgYmVhbnMgaW4gdGhlIHNhbWUgZWpiLWphciBmaWxlLgotCi1UaGUgZW50ZXJwcmlzZSBiZWFuIGNvZGUgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBuYW1lOyB0aGVyZWZvcmUgdGhlCi1uYW1lIGNhbiBiZSBjaGFuZ2VkIGR1cmluZyB0aGUgYXBwbGljYXRpb24tYXNzZW1ibHkgcHJvY2VzcyB3aXRob3V0Ci1icmVha2luZyB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgZnVuY3Rpb24uCi0KLVRoZXJlIGlzIG5vIGFyY2hpdGVjdGVkIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBlamItbmFtZSBpbiB0aGUKLWRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgdGhlIEpOREkgbmFtZSB0aGF0IHRoZSBEZXBsb3llciB3aWxsIGFzc2lnbgotdG8gdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUuCi0KLVRoZSBuYW1lIG11c3QgY29uZm9ybSB0byB0aGUgbGV4aWNhbCBydWxlcyBmb3IgYW4gTk1UT0tFTi4KLQotVXNlZCBpbjogZW50aXR5LCBtZXRob2QsIGFuZCBzZXNzaW9uCi0KLUV4YW1wbGU6Ci0JCTxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotLS0+Ci08IUVMRU1FTlQgZWpiLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLXJlZiBlbGVtZW50IGlzIHVzZWQgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0bwotYW5vdGhlciBlbnRlcnByaXNlIGJlYW4ncyBob21lLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLWRlc2NyaXB0aW9uOyB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIHJlZmVyZW5jaW5nCi1lbnRlcnByaXNlIGJlYW47IHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbjsKLXRoZSBleHBlY3RlZCBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcyBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlCi1iZWFuOyBhbmQgYW4gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24uCi0KLVRoZSBvcHRpb25hbCBlamItbGluayBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcmVmZXJlbmNlZAotZW50ZXJwcmlzZSBiZWFuLiBJdCBpcyB1c2VkIHR5cGljYWxseSBpbiBlamItamFyIGZpbGVzIHRoYXQgY29udGFpbiBhbgotYXNzZW1ibGVkIGFwcGxpY2F0aW9uLgotCi1Vc2VkIGluOiBlbnRpdHkgYW5kIHNlc3Npb24KLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYgKGRlc2NyaXB0aW9uPywgZWpiLXJlZi1uYW1lLCBlamItcmVmLXR5cGUsIGhvbWUsCi0JCXJlbW90ZSwgZWpiLWxpbms/KT4KLQotPCEtLQotVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQiByZWZlcmVuY2UuIFRoZSBFSkIKLXJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgZW52aXJvbm1lbnQuCi0KLUl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotVXNlZCBpbjogZWpiLXJlZgotCi1FeGFtcGxlOgotCQk8ZWpiLXJlZi1uYW1lPmVqYi9QYXlyb2xsPC9lamItcmVmLW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBlamItcmVmLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgY29udGFpbnMgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQKLWVudGVycHJpc2UgYmVhbi4KLQotVGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JCTxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0JCTxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotCi1Vc2VkIGluOiBlamItcmVmCi0tLT4KLTwhRUxFTUVOVCBlamItcmVmLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW50ZXJwcmlzZS1iZWFucyBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbnMgb2Ygb25lIG9yIG1vcmUKLWVudGVycHJpc2UgYmVhbnMuCi0tLT4KLTwhRUxFTUVOVCBlbnRlcnByaXNlLWJlYW5zIChzZXNzaW9uIHwgZW50aXR5KSs+Ci0KLTwhLS0KLVRoZSBlbnRpdHkgZWxlbWVudCBkZWNsYXJlcyBhbiBlbnRpdHkgYmVhbi4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzCi1vZjogYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IG9wdGlvbmFsIGRpc3BsYXkgbmFtZTsgb3B0aW9uYWwgc21hbGwgaWNvbgotZmlsZSBuYW1lOyBvcHRpb25hbCBsYXJnZSBpY29uIGZpbGUgbmFtZTsgYSBuYW1lIGFzc2lnbmVkIHRvIHRoZQotZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3I7IHRoZSBuYW1lcyBvZiB0aGUgZW50aXR5Ci1iZWFuJ3MgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXM7IHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uCi1jbGFzczsgdGhlIGVudGl0eSBiZWFuJ3MgcGVyc2lzdGVuY2UgbWFuYWdlbWVudCB0eXBlOyB0aGUgZW50aXR5IGJlYW4ncwotcHJpbWFyeSBrZXkgY2xhc3MgbmFtZTsgYW4gaW5kaWNhdGlvbiBvZiB0aGUgZW50aXR5IGJlYW4ncyByZWVudHJhbmN5OwotYW4gb3B0aW9uYWwgbGlzdCBvZiBjb250YWluZXItbWFuYWdlZCBmaWVsZHM7IGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24KLW9mIHRoZSBwcmltYXJ5IGtleSBmaWVsZDsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotZW52aXJvbm1lbnQgZW50cmllczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIKLXJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXM7Ci1hbmQgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24KLWZhY3RvcnkgcmVmZXJlbmNlcy4KLQotVGhlIG9wdGlvbmFsIHByaW1rZXktZmllbGQgbWF5IGJlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IgaWYgdGhlCi1lbnRpdHkncyBwZXJzaXN0ZW5jeS10eXBlIGlzIENvbnRhaW5lci4KLQotVGhlIG90aGVyIGVsZW1lbnRzIHRoYXQgYXJlIG9wdGlvbmFsIGFyZSAib3B0aW9uYWwiIGluIHRoZSBzZW5zZSB0aGF0Ci10aGV5IGFyZSBvbWl0dGVkIGlmIHRoZSBsaXN0cyByZXByZXNlbnRlZCBieSB0aGVtIGFyZSBlbXB0eS4KLQotQXQgbGVhc3Qgb25lIGNtcC1maWVsZCBlbGVtZW50IG11c3QgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvciBpZiB0aGUKLWVudGl0eSdzIHBlcnNpc3RlbmN5LXR5cGUgaXMgQ29udGFpbmVyLCBhbmQgbm9uZSBtdXN0IG5vdCBiZSBwcmVzZW50IGlmCi10aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBCZWFuLgotCi1Vc2VkIGluOiBlbnRlcnByaXNlLWJlYW5zCi0tLT4KLTwhRUxFTUVOVCBlbnRpdHkgKGRlc2NyaXB0aW9uPywgZGlzcGxheS1uYW1lPywgc21hbGwtaWNvbj8sCi0JCWxhcmdlLWljb24/LCBlamItbmFtZSwgaG9tZSwgcmVtb3RlLCBlamItY2xhc3MsCi0JCXBlcnNpc3RlbmNlLXR5cGUsIHByaW0ta2V5LWNsYXNzLCByZWVudHJhbnQsCi0JCWNtcC1maWVsZCosIHByaW1rZXktZmllbGQ/LCBlbnYtZW50cnkqLAotCQllamItcmVmKiwgc2VjdXJpdHktcm9sZS1yZWYqLCByZXNvdXJjZS1yZWYqKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncwotZW52aXJvbm1lbnQgZW50cmllcy4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbiwgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LCBhbmQgYW4gb3B0aW9uYWwgdmFsdWUuCi0KLVVzZWQgaW46IGVudGl0eSBhbmQgc2Vzc2lvbgotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5IChkZXNjcmlwdGlvbj8sIGVudi1lbnRyeS1uYW1lLCBlbnYtZW50cnktdHlwZSwKLQkJZW52LWVudHJ5LXZhbHVlPyk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbidzCi1lbnZpcm9ubWVudCBlbnRyeS4KLQotVXNlZCBpbjogZW52LWVudHJ5Ci0KLUV4YW1wbGU6Ci0JCTxlbnYtZW50cnktbmFtZT5taW5BbW91bnQ8L2Vudi1lbnRyeS1uYW1lPgotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBvZgotdGhlIGVudmlyb25tZW50IGVudHJ5IHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQgYnkgdGhlIGVudGVycHJpc2UgYmVhbidzCi1jb2RlLgotCi1UaGUgZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGVudi1lbnRyeS10eXBlOgotamF2YS5sYW5nLkJvb2xlYW4sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5JbnRlZ2VyLAotamF2YS5sYW5nLkRvdWJsZSwgamF2YS5sYW5nLkJ5dGUsIGphdmEubGFuZy5TaG9ydCwgamF2YS5sYW5nLkxvbmcsIGFuZAotamF2YS5sYW5nLkZsb2F0LgotCi1Vc2VkIGluOiBlbnYtZW50cnkKLQotRXhhbXBsZToKLQkJPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLS0tPgotPCFFTEVNRU5UIGVudi1lbnRyeS10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncwotZW52aXJvbm1lbnQgZW50cnkuCi0KLVVzZWQgaW46IGVudi1lbnRyeQotCi1FeGFtcGxlOgotCQk8ZW52LWVudHJ5LXZhbHVlPjEwMC4wMDwvZW52LWVudHJ5LXZhbHVlPgotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5LXZhbHVlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGZpZWxkLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBjb250YWluZXIgbWFuYWdlZCBmaWVsZC4KLVRoZSBuYW1lIG11c3QgYmUgYSBwdWJsaWMgZmllbGQgb2YgdGhlIGVudGVycHJpc2UgYmVhbiBjbGFzcyBvciBvbmUgb2YKLWl0cyBzdXBlcmNsYXNzZXMuCi0KLVVzZWQgaW46IGNtcC1maWVsZAotCi1FeGFtcGxlOgotCQk8ZmllbGQtbmFtZT5maXJzdE5hbWU8L2ZpZWxkLU5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBmaWVsZC1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGhvbWUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UKLWJlYW4ncyBob21lIGludGVyZmFjZS4KLQotVXNlZCBpbjogZWpiLXJlZiwgZW50aXR5LCBhbmQgc2Vzc2lvbgotCi1FeGFtcGxlOgotCQk8aG9tZT5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsSG9tZTwvaG9tZT4KLS0tPgotPCFFTEVNRU5UIGhvbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIGEgbGFyZ2UKLSgzMiB4IDMyKSBpY29uIGltYWdlLiBUaGUgZmlsZSBuYW1lIGlzIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBlamItamFyCi1maWxlLgotCi1UaGUgaW1hZ2UgbXVzdCBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdCwgYW5kIHRoZSBmaWxlIG5hbWUKLW11c3QgZW5kIHdpdGggdGhlIHN1ZmZpeCAiLmpwZyIgb3IgIi5naWYiIHJlc3BlY3RpdmVseS4gIFRoZSBpY29uIGNhbgotYmUgdXNlZCBieSB0b29scy4KLQotRXhhbXBsZToKLQk8bGFyZ2UtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24zMngzMi5qcGc8L2xhcmdlLWljb24+Ci0tLT4KLTwhRUxFTUVOVCBsYXJnZS1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIG1ldGhvZCBlbGVtZW50IGlzIHVzZWQgdG8gZGVub3RlIGEgbWV0aG9kIG9mIGFuIGVudGVycHJpc2UgYmVhbidzCi1ob21lIG9yIHJlbW90ZSBpbnRlcmZhY2UsIG9yIGEgc2V0IG9mIG1ldGhvZHMuIFRoZSBlamItbmFtZSBlbGVtZW50Ci1tdXN0IGJlIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFucyBpbiBkZWNsYXJlZCBpbiB0aGUKLWRlcGxveW1lbnQgZGVzY3JpcHRvcjsgdGhlIG9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgYWxsb3dzIHRvCi1kaXN0aW5ndWlzaCBiZXR3ZWVuIGEgbWV0aG9kIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIHRoYXQgaXMgZGVmaW5lZCBpbgotYm90aCB0aGUgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZTsgdGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzCi10aGUgbWV0aG9kIG5hbWU7IGFuZCB0aGUgb3B0aW9uYWwgbWV0aG9kLXBhcmFtcyBlbGVtZW50cyBpZGVudGlmeSBhCi1zaW5nbGUgbWV0aG9kIGFtb25nIG11bHRpcGxlIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkIG1ldGhvZCBuYW1lLgotCi1UaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgc3R5bGVzIG9mIHRoZSBtZXRob2QgZWxlbWVudCBzeW50YXg6Ci0KLTEuIAk8bWV0aG9kPgotCQk8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0gICAJCTxtZXRob2QtbmFtZT4qPC9tZXRob2QtbmFtZT4KLQk8L21ldGhvZD4KLQotICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUgc3BlY2lmaWVkCi0gICBlbnRlcnByaXNlIGJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcy4KLQotMi4gCTxtZXRob2Q+Ci0JCTxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgIAkJPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+Ci0JPC9tZXRob2Q+PgotCi0gICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gdGhlIHNwZWNpZmllZCBtZXRob2Qgb2YgdGhlCi0gICBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWV0aG9kcyB3aXRoCi0gICB0aGUgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoZSBlbGVtZW50IG9mIHRoaXMgc3R5bGUgcmVmZXJzIHRvCi0gICBhbGwgdGhlIG1ldGhvZHMgd2l0aCB0aGUgb3ZlcmxvYWRlZCBuYW1lLgotCi0KLQotCi0KLTMuIAk8bWV0aG9kPgotCQk8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0gICAJCTxtZXRob2QtbmFtZT5NRVRIT0Q8L21ldGhvZC1uYW1lPgotCQk8bWV0aG9kLXBhcmFtcz4KLSAgIAkJCTxtZXRob2QtcGFyYW0+UEFSQU0tMTwvbWV0aG9kLXBhcmFtPgotICAgCQkJPG1ldGhvZC1wYXJhbT5QQVJBTS0yPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgCQkJLi4uCi0gICAJCQk8bWV0aG9kLXBhcmFtPlBBUkFNLW48L21ldGhvZC1wYXJhbT4KLQkJPC9tZXRob2QtcGFyYW1zPgotCTxtZXRob2Q+CQotCi0gICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gYSBzaW5nbGUgbWV0aG9kIHdpdGhpbiBhIHNldCBvZgotICAgbWV0aG9kcyB3aXRoIGFuIG92ZXJsb2FkZWQgbmFtZS4gUEFSQU0tMSB0aHJvdWdoIFBBUkFNLW4gYXJlIHRoZQotICAgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZXMgb2YgdGhlIG1ldGhvZCdzIGlucHV0IHBhcmFtZXRlcnMgKGlmCi0gICB0aGUgbWV0aG9kIGhhcyBubyBpbnB1dCBhcmd1bWVudHMsIHRoZSBtZXRob2QtcGFyYW1zIGVsZW1lbnQKLSAgIGNvbnRhaW5zIG5vIG1ldGhvZC1wYXJhbSBlbGVtZW50cykuIEFycmF5cyBhcmUgc3BlY2lmaWVkIGJ5IHRoZQotICAgYXJyYXkgZWxlbWVudCdzIHR5cGUsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBhaXIgb2Ygc3F1YXJlCi0gICBicmFja2V0cyAoZS5nLiBpbnRbXVtdKS4KLQotCi1Vc2VkIGluOiBtZXRob2QtcGVybWlzc2lvbiBhbmQgY29udGFpbmVyLXRyYW5zYWN0aW9uCi0KLUV4YW1wbGVzOgotCi0gICAgU3R5bGUgMTogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gYWxsIHRoZSBtZXRob2RzIG9mCi0JCXRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzOgotCi0JCTxtZXRob2Q+Ci0JCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkJCTxtZXRob2QtbmFtZT4qPC9tZXRob2QtbmFtZT4KLQkJPC9tZXRob2Q+Ci0KLQlTdHlsZSAyOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlIGNyZWF0ZQotCQltZXRob2RzIG9mIHRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlOgotCi0gICAgCQk8bWV0aG9kPgotCQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JCQk8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLQkJPC9tZXRob2Q+Ci0KLQlTdHlsZSAzOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byB0aGUKLQkJY3JlYXRlKFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBMYXN0TmFtZSkgbWV0aG9kIG9mIHRoZQotCSAJRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGludGVyZmFjZS4KLQotICAgIAkJPG1ldGhvZD4KLQkJCTxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCQkJPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0JCQk8bWV0aG9kLXBhcmFtcz4KLQkJCQk8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkJCQk8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkJCTwvbWV0aG9kLXBhcmFtcz4KLQkJPC9tZXRob2Q+Ci0KLQkKLQlUaGUgZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgYSBTdHlsZSAzIGVsZW1lbnQgd2l0aAotCW1vcmUgY29tcGxleCBwYXJhbWV0ZXIgdHlwZXMuIFRoZSBtZXRob2QKLQkJCWZvb2JhcihjaGFyIHMsIGludCBpLCBpbnRbXSBpYXIsIG15cGFja2FnZS5NeUNsYXNzIG15Y2wsCi0JCQkJbXlwYWNrYWdlLk15Q2xhc3NbXVtdIG15Y2xhYXIpCi0gICAgICAgIHdvdWxkIGJlIHNwZWNpZmllZCBhczoKLQotICAgIAkJPG1ldGhvZD4KLQkJCTxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCQkJPG1ldGhvZC1uYW1lPmZvb2JhcjwvbWV0aG9kLW5hbWU+Ci0JCQk8bWV0aG9kLXBhcmFtcz4KLQkJCQk8bWV0aG9kLXBhcmFtPmNoYXI8L21ldGhvZC1wYXJhbT4KLQkJCQk8bWV0aG9kLXBhcmFtPmludDwvbWV0aG9kLXBhcmFtPgotCQkJCTxtZXRob2QtcGFyYW0+aW50W108L21ldGhvZC1wYXJhbT4KLQkJCQk8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzPC9tZXRob2QtcGFyYW0+Ci0JCQkJPG1ldGhvZC1wYXJhbT5teXBhY2thZ2UuTXlDbGFzc1tdW108L21ldGhvZC1wYXJhbT4KLQkJCTwvbWV0aG9kLXBhcmFtcz4KLQkJPC9tZXRob2Q+Ci0KLQlUaGUgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBjYW4gYmUgdXNlZCB3aGVuIGl0IGJlY29tZXMKLSAgIG5lY2Vzc2FyeSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYSBtZXRob2QgZGVmaW5lZCBpbiB0aGUgaG9tZQotICAgaW50ZXJmYWNlIGFuZCBhIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHNpZ25hdHVyZSB0aGF0IGlzCi0gICBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlLgotCi0JRm9yIGV4YW1wbGUsIHRoZSBtZXRob2QgZWxlbWVudAotCi0gICAJCTxtZXRob2Q+Ci0JCQk8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkJCTxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotCQkJPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0JCQk8bWV0aG9kLXBhcmFtcz4KLQkJCQk8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkJCQk8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLQkJCTwvbWV0aG9kLXBhcmFtcz4KLQkJPC9tZXRob2Q+Ci0KLQljYW4gYmUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIHRoZSBjcmVhdGUoU3RyaW5nLCBTdHJpbmcpIG1ldGhvZAotICAgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGludGVyZmFjZSBmcm9tIHRoZSBjcmVhdGUoU3RyaW5nLCBTdHJpbmcpCi0gICBtZXRob2QgZGVmaW5lZCBpbiB0aGUgaG9tZSBpbnRlcmZhY2UsIHdoaWNoIHdvdWxkIGJlIGRlZmluZWQgYXMKLQotICAgCQk8bWV0aG9kPgotCQkJPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JCQk8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0JCQk8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLQkJCTxtZXRob2QtcGFyYW1zPgotCQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCQkJCTxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCQkJPC9tZXRob2QtcGFyYW1zPgotCQk8L21ldGhvZD4KLQotLS0+Ci08IUVMRU1FTlQgbWV0aG9kIChkZXNjcmlwdGlvbj8sIGVqYi1uYW1lLCBtZXRob2QtaW50Zj8sIG1ldGhvZC1uYW1lLAotCQkJbWV0aG9kLXBhcmFtcz8pPgotCi08IS0tCi1UaGUgbWV0aG9kLWludGYgZWxlbWVudCBhbGxvd3MgYSBtZXRob2QgZWxlbWVudCB0byBkaWZmZXJlbnRpYXRlCi1iZXR3ZWVuIHRoZSBtZXRob2RzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgc2lnbmF0dXJlIHRoYXQgYXJlIGRlZmluZWQKLWluIGJvdGggdGhlIHJlbW90ZSBhbmQgaG9tZSBpbnRlcmZhY2VzLgotCi1UaGUgbWV0aG9kLWludGYgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCQk8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0JCTxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotCi1Vc2VkIGluOiBtZXRob2QKLS0tPgotPCFFTEVNRU5UIG1ldGhvZC1pbnRmICgjUENEQVRBKT4KLQotPCEtLQotVGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbiBtZXRob2QsCi1vciB0aGUgYXN0ZXJpc2sgKCopIGNoYXJhY3Rlci4gVGhlIGFzdGVyaXNrIGlzIHVzZWQgd2hlbiB0aGUgZWxlbWVudAotZGVub3RlcyBhbGwgdGhlIG1ldGhvZHMgb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgcmVtb3RlIGFuZCBob21lCi1pbnRlcmZhY2VzLgotCi1Vc2VkIGluOiBtZXRob2QKLS0tPgotPCFFTEVNRU5UIG1ldGhvZC1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIG1ldGhvZC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG5hbWUgb2YKLWEgbWV0aG9kIHBhcmFtZXRlci4KLQotVXNlZCBpbjogbWV0aG9kLXBhcmFtcwotLS0+Ci08IUVMRU1FTlQgbWV0aG9kLXBhcmFtICgjUENEQVRBKT4KLQotPCEtLQotVGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudCBjb250YWlucyBhIGxpc3Qgb2YgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhCi10eXBlIG5hbWVzIG9mIHRoZSBtZXRob2QgcGFyYW1ldGVycy4KLQotVXNlZCBpbjogbWV0aG9kCi0tLT4KLTwhRUxFTUVOVCBtZXRob2QtcGFyYW1zIChtZXRob2QtcGFyYW0qKT4KLQotPCEtLQotVGhlIG1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgb25lIG9yIG1vcmUgc2VjdXJpdHkgcm9sZXMKLWFyZSBhbGxvd2VkIHRvIGludm9rZSBvbmUgb3IgbW9yZSBlbnRlcnByaXNlIGJlYW4gbWV0aG9kcy4gVGhlCi1tZXRob2QtcGVybWlzc2lvbiBlbGVtZW50IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhIGxpc3QKLW9mIHNlY3VyaXR5IHJvbGUgbmFtZXMsIGFuZCBhIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLgotCi1UaGUgc2VjdXJpdHkgcm9sZXMgdXNlZCBpbiB0aGUgbWV0aG9kLXBlcm1pc3Npb24gZWxlbWVudCBtdXN0IGJlCi1kZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnQgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kCi10aGUgbWV0aG9kcyBtdXN0IGJlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgcmVtb3RlCi1hbmQvb3IgaG9tZSBpbnRlcmZhY2VzLgotCi1Vc2VkIGluOiBhc3NlbWJseS1kZXNjcmlwdG9yCi0tLT4KLTwhRUxFTUVOVCBtZXRob2QtcGVybWlzc2lvbiAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUrLCBtZXRob2QrKT4KLQotPCEtLQotVGhlIHBlcnNpc3RlbmNlLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgYW4gZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZQotbWFuYWdlbWVudCB0eXBlLgotCi1UaGUgcGVyc2lzdGVuY2UtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCQk8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotCQk8cGVyc2lzdGVuY2UtdHlwZT5Db250YWluZXI8L3BlcnNpc3RlbmNlLXR5cGU+Ci0KLVVzZWQgaW46IGVudGl0eQotLS0+Ci08IUVMRU1FTlQgcGVyc2lzdGVuY2UtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBwcmltLWtleS1jbGFzcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiBhbgotZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSBjbGFzcy4KLQotSWYgdGhlIGRlZmluaXRpb24gb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIGlzIGRlZmVycmVkIHRvIGRlcGxveW1lbnQKLXRpbWUsIHRoZSBwcmltLWtleS1jbGFzcyBlbGVtZW50IHNob3VsZCBzcGVjaWZ5IGphdmEubGFuZy5PYmplY3QuCi0KLVVzZWQgaW46IGVudGl0eQotCi1FeGFtcGxlczoKLQk8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvcHJpbS1rZXktY2xhc3M+Ci0JPHByaW0ta2V5LWNsYXNzPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZUlEPC9wcmltLWtleS1jbGFzcz4KLQk8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLk9iamVjdDwvcHJpbS1rZXktY2xhc3M+Ci0KLS0tPgotPCFFTEVNRU5UIHByaW0ta2V5LWNsYXNzICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHByaW1hcnkKLWtleSBmaWVsZCBmb3IgYW4gZW50aXR5IHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuCi0KLVRoZSBwcmlta2V5LWZpZWxkIG11c3QgYmUgb25lIG9mIHRoZSBmaWVsZHMgZGVjbGFyZWQgaW4gdGhlIGNtcC1maWVsZAotZWxlbWVudCwgYW5kIHRoZSB0eXBlIG9mIHRoZSBmaWVsZCBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBwcmltYXJ5IGtleQotdHlwZS4KLQotVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyBub3QgdXNlZCBpZiB0aGUgcHJpbWFyeSBrZXkgbWFwcyB0bwotbXVsdGlwbGUgY29udGFpbmVyLW1hbmFnZWQgZmllbGRzIChpLmUuIHRoZSBrZXkgaXMgYSBjb21wb3VuZCBrZXkpLiBJbgotdGhpcyBjYXNlLCB0aGUgZmllbGRzIG9mIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIHB1YmxpYywgYW5kCi10aGVpciBuYW1lcyBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIGZpZWxkIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbiBjbGFzcwotdGhhdCBjb21wcmlzZSB0aGUga2V5LgotCi1Vc2VkIGluOiBlbnRpdHkKLQotRXhhbXBsZToKLQk8cHJpbWtleS1maWVsZD5FbXBsb3llZUlkPC9wcmlta2V5LWZpZWxkPgotLS0+Ci08IUVMRU1FTlQgcHJpbWtleS1maWVsZCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZWVudHJhbnQgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhbiBlbnRpdHkgYmVhbiBpcyByZWVudHJhbnQgb3Igbm90LgotCi1UaGUgcmVlbnRyYW50IGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0JCTxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotCQk8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0KLVVzZWQgaW46IGVudGl0eQotLS0+Ci08IUVMRU1FTlQgcmVlbnRyYW50ICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlbW90ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZQotYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IGVqYi1yZWYsIGVudGl0eSwgYW5kIHNlc3Npb24KLQotRXhhbXBsZToKLQkJPHJlbW90ZT5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlPC9yZW1vdGU+Ci0tLT4KLTwhRUxFTUVOVCByZW1vdGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLWF1dGggZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgZW50ZXJwcmlzZSBiZWFuIGNvZGUgc2lnbnMKLW9uIHByb2dyYW1tYXRpY2FsbHkgdG8gdGhlIHJlc291cmNlIG1hbmFnZXIsIG9yIHdoZXRoZXIgdGhlIENvbnRhaW5lcgotd2lsbCBzaWduIG9uIHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyIG9uIGJlaGFsZiBvZiB0aGUgYmVhbi4gSW4gdGhlCi1sYXR0ZXIgY2FzZSwgdGhlIENvbnRhaW5lciB1c2VzIGluZm9ybWF0aW9uIHRoYXQgaXMgc3VwcGxpZWQgYnkgdGhlCi1EZXBsb3llci4KLQotVGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQkJPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLQkJPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0tLT4KLTwhRUxFTUVOVCByZXMtYXV0aCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSByZXNvdXJjZSBtYW5hZ2VyCi1jb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLgotCi1Vc2VkIGluOiByZXNvdXJjZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJlcy1yZWYtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgZGF0YSBzb3VyY2UuIFRoZSB0eXBlIGlzCi1zcGVjaWZpZWQgYnkgdGhlIEphdmEgaW50ZXJmYWNlIChvciBjbGFzcykgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQKLWJ5IHRoZSBkYXRhIHNvdXJjZS4KLQotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXNvdXJjZS1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGVudGVycHJpc2UgYmVhbidzCi1yZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2UuIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBuYW1lLAotdGhlIGluZGljYXRpb24gb2YgdGhlIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHR5cGUgZXhwZWN0ZWQKLWJ5IHRoZSBlbnRlcnByaXNlIGJlYW4gY29kZSwgYW5kIHRoZSB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uIChiZWFuIG9yCi1jb250YWluZXIpLgotCi1Vc2VkIGluOiBlbnRpdHkgYW5kIHNlc3Npb24KLQotRXhhbXBsZToKLQkJPHJlc291cmNlLXJlZj4KLQkJCTxyZXMtcmVmLW5hbWU+RW1wbG95ZWVBcHBEQjwvcmVzLXJlZi1uYW1lPgotCQkJPHJlcy10eXBlPmphdmF4LnNxbC5EYXRhU291cmNlPC9yZXMtdHlwZT4KLQkJCTxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotCQk8L3Jlc291cmNlLXJlZj4KLS0tPgotPCFFTEVNRU5UIHJlc291cmNlLXJlZiAoZGVzY3JpcHRpb24/LCByZXMtcmVmLW5hbWUsIHJlcy10eXBlLAotCQkJcmVzLWF1dGgpPgotCi08IS0tCi1UaGUgcm9sZS1saW5rIGVsZW1lbnQgaXMgdXNlZCB0byBsaW5rIGEgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgdG8gYQotZGVmaW5lZCBzZWN1cml0eSByb2xlLiBUaGUgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBjb250YWluIHRoZSBuYW1lIG9mCi1vbmUgb2YgdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuCi0KLVVzZWQgaW46IHNlY3VyaXR5LXJvbGUtcmVmCi0tLT4KLTwhRUxFTUVOVCByb2xlLWxpbmsgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcm9sZS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCi1UaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGFuIE5NVE9LRU4uCi0KLVVzZWQgaW46IG1ldGhvZC1wZXJtaXNzaW9uLCBzZWN1cml0eS1yb2xlLCBhbmQgc2VjdXJpdHktcm9sZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJvbGUtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYSBzZWN1cml0eSByb2xlLgotVGhlIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHNlY3VyaXR5Ci1yb2xlLCBhbmQgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZS4KLQotVXNlZCBpbjogYXNzZW1ibHktZGVzY3JpcHRvcgotCi1FeGFtcGxlOgotCQk8c2VjdXJpdHktcm9sZT4KLQkJCTxkZXNjcmlwdGlvbj4KLQkJCQlUaGlzIHJvbGUgaW5jbHVkZXMgYWxsIGVtcGxveWVlcyB3aG8KLQkJCQlhcmUgYXV0aG9yaXplZCB0byBhY2Nlc3MgdGhlIGVtcGxveWVlCi0JCQkJc2VydmljZSBhcHBsaWNhdGlvbi4KLQkJCTwvZGVzY3JpcHRpb24+Ci0JCQk8cm9sZS1uYW1lPmVtcGxveWVlPC9yb2xlLW5hbWU+Ci0JCTwvc2VjdXJpdHktcm9sZT4KLS0tPgotPCFFTEVNRU5UIHNlY3VyaXR5LXJvbGUgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lKT4KLQotPCEtLQotVGhlIHNlY3VyaXR5LXJvbGUtcmVmIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgc2VjdXJpdHkKLXJvbGUgcmVmZXJlbmNlIGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBjb2RlLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMKLW9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUsCi1hbmQgYW4gb3B0aW9uYWwgbGluayB0byBhIGRlZmluZWQgc2VjdXJpdHkgcm9sZS4KLQotVGhlIHZhbHVlIG9mIHRoZSByb2xlLW5hbWUgZWxlbWVudCBtdXN0IGJlIHRoZSBTdHJpbmcgdXNlZCBhcyB0aGUKLXBhcmFtZXRlciB0byB0aGUgRUpCQ29udGV4dC5pc0NhbGxlckluUm9sZShTdHJpbmcgcm9sZU5hbWUpIG1ldGhvZC4KLQotVGhlIHZhbHVlIG9mIHRoZSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUKLXNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuCi0KLVVzZWQgaW46IGVudGl0eSBhbmQgc2Vzc2lvbgotCi0tLT4KLTwhRUxFTUVOVCBzZWN1cml0eS1yb2xlLXJlZiAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUsIHJvbGUtbGluaz8pPgotCi08IS0tCi1UaGUgc2Vzc2lvbi10eXBlIGVsZW1lbnQgZGVzY3JpYmVzIHdoZXRoZXIgdGhlIHNlc3Npb24gYmVhbiBpcyBhCi1zdGF0ZWZ1bCBzZXNzaW9uLCBvciBzdGF0ZWxlc3Mgc2Vzc2lvbi4KLQotVGhlIHNlc3Npb24tdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCQk8c2Vzc2lvbi10eXBlPlN0YXRlZnVsPC9zZXNzaW9uLXR5cGU+Ci0JCTxzZXNzaW9uLXR5cGU+U3RhdGVsZXNzPC9zZXNzaW9uLXR5cGU+Ci0tLT4KLTwhRUxFTUVOVCBzZXNzaW9uLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgc2Vzc2lvbiBlbGVtZW50IGRlY2xhcmVzIGFuIHNlc3Npb24gYmVhbi4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzCi1vZjogYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IG9wdGlvbmFsIGRpc3BsYXkgbmFtZTsgb3B0aW9uYWwgc21hbGwgaWNvbgotZmlsZSBuYW1lOyBvcHRpb25hbCBsYXJnZSBpY29uIGZpbGUgbmFtZTsgYSBuYW1lIGFzc2lnbmVkIHRvIHRoZQotZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0aW9uOyB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24KLWJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlczsgdGhlIHNlc3Npb24gYmVhbidzIGltcGxlbWVudGF0aW9uCi1jbGFzczsgdGhlIHNlc3Npb24gYmVhbidzIHN0YXRlIG1hbmFnZW1lbnQgdHlwZTsgdGhlIHNlc3Npb24gYmVhbidzCi10cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGU7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLWVudmlyb25tZW50IGVudHJpZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCCi1yZWZlcmVuY2VzOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VzOwotYW5kIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uCi1mYWN0b3J5IHJlZmVyZW5jZXMuCi0KLVRoZSBlbGVtZW50cyB0aGF0IGFyZSBvcHRpb25hbCBhcmUgIm9wdGlvbmFsIiBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5Ci1hcmUgb21pdHRlZCB3aGVuIGlmIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlIGVtcHR5LgotCi1Vc2VkIGluOiBlbnRlcnByaXNlLWJlYW5zCi0tLT4KLTwhRUxFTUVOVCBzZXNzaW9uIChkZXNjcmlwdGlvbj8sIGRpc3BsYXktbmFtZT8sIHNtYWxsLWljb24/LAotCQlsYXJnZS1pY29uPywgZWpiLW5hbWUsIGhvbWUsIHJlbW90ZSwgZWpiLWNsYXNzLAotCQlzZXNzaW9uLXR5cGUsIHRyYW5zYWN0aW9uLXR5cGUsIGVudi1lbnRyeSosCi0JCWVqYi1yZWYqLCBzZWN1cml0eS1yb2xlLXJlZiosIHJlc291cmNlLXJlZiopPgotCi08IS0tCi1UaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIGEgc21hbGwKLSgxNiB4IDE2KSBpY29uIGltYWdlLiBUaGUgZmlsZSBuYW1lIGlzIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBlamItamFyCi1maWxlLgotCi1UaGUgaW1hZ2UgbXVzdCBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdCwgYW5kIHRoZSBmaWxlIG5hbWUKLW11c3QgZW5kIHdpdGggdGhlIHN1ZmZpeCAiLmpwZyIgb3IgIi5naWYiIHJlc3BlY3RpdmVseS4KLQotVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLUV4YW1wbGU6Ci0JPHNtYWxsLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnPC9zbWFsbC1pY29uPgotLS0+Ci08IUVMRU1FTlQgc21hbGwtaWNvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB0cmFuc2FjdGlvbi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIGFuIGVudGVycHJpc2UgYmVhbidzIHRyYW5zYWN0aW9uCi1tYW5hZ2VtZW50IHR5cGUuCi0KLVRoZSB0cmFuc2FjdGlvbi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0JCTx0cmFuc2FjdGlvbi10eXBlPkJlYW48L3RyYW5zYWN0aW9uLXR5cGU+Ci0JCTx0cmFuc2FjdGlvbi10eXBlPkNvbnRhaW5lcjwvdHJhbnNhY3Rpb24tdHlwZT4KLQotVXNlZCBpbjogc2Vzc2lvbgotLS0+Ci08IUVMRU1FTlQgdHJhbnNhY3Rpb24tdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB0cmFucy1hdHRyaWJ1dGUgZWxlbWVudCBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdCBtYW5hZ2UgdGhlCi10cmFuc2FjdGlvbiBib3VuZGFyaWVzIHdoZW4gZGVsZWdhdGluZyBhIG1ldGhvZCBpbnZvY2F0aW9uIHRvIGFuCi1lbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcyBtZXRob2QuCi0KLVRoZSB2YWx1ZSBvZiB0cmFucy1hdHRyaWJ1dGUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQkJPHRyYW5zLWF0dHJpYnV0ZT5Ob3RTdXBwb3J0ZWQ8L3RyYW5zLWF0dHJpYnV0ZT4KLQkJPHRyYW5zLWF0dHJpYnV0ZT5TdXBwb3J0czwvdHJhbnMtYXR0cmlidXRlPgotCQk8dHJhbnMtYXR0cmlidXRlPlJlcXVpcmVkPC90cmFucy1hdHRyaWJ1dGU+Ci0JCTx0cmFucy1hdHRyaWJ1dGU+UmVxdWlyZXNOZXc8L3RyYW5zLWF0dHJpYnV0ZT4KLQkJPHRyYW5zLWF0dHJpYnV0ZT5NYW5kYXRvcnk8L3RyYW5zLWF0dHJpYnV0ZT4KLQkJPHRyYW5zLWF0dHJpYnV0ZT5OZXZlcjwvdHJhbnMtYXR0cmlidXRlPgotCi1Vc2VkIGluOiBjb250YWluZXItdHJhbnNhY3Rpb24KLS0tPgotPCFFTEVNRU5UIHRyYW5zLWF0dHJpYnV0ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBJRCBtZWNoYW5pc20gaXMgdG8gYWxsb3cgdG9vbHMgdGhhdCBwcm9kdWNlIGFkZGl0aW9uYWwgZGVwbG95bWVudAotaW5mb3JtYXRpb24gKGkuZSBpbmZvcm1hdGlvbiBiZXlvbmQgdGhlIHN0YW5kYXJkIEVKQiBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yIGluZm9ybWF0aW9uKSB0byBzdG9yZSB0aGUgbm9uLXN0YW5kYXJkIGluZm9ybWF0aW9uIGluIGEKLXNlcGFyYXRlIGZpbGUsIGFuZCBlYXNpbHkgcmVmZXIgZnJvbSB0aGVzZSB0b29scy1zcGVjaWZpYyBmaWxlcyB0byB0aGUKLWluZm9ybWF0aW9uIGluIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLVRoZSBFSkIgYXJjaGl0ZWN0dXJlIGRvZXMgbm90IGFsbG93IHRoZSB0b29scyB0byBhZGQgdGhlIG5vbi1zdGFuZGFyZAotaW5mb3JtYXRpb24gaW50byB0aGUgRUpCIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLS0tPgotPCFBVFRMSVNUIGFzc2VtYmx5LWRlc2NyaXB0b3IgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY21wLWZpZWxkIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbnRhaW5lci10cmFuc2FjdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZXNjcmlwdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLWNsYXNzIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1jbGllbnQtamFyIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1qYXIgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLWxpbmsgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZi10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudGVycHJpc2UtYmVhbnMgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW50aXR5IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktdmFsdWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZmllbGQtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBob21lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxhcmdlLWljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWV0aG9kIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1ldGhvZC1pbnRmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1ldGhvZC1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1ldGhvZC1wYXJhbSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXRob2QtcGFyYW1zIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1ldGhvZC1wZXJtaXNzaW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHBlcnNpc3RlbmNlLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcHJpbS1rZXktY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcHJpbWtleS1maWVsZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWVudHJhbnQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVtb3RlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1hdXRoIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXNvdXJjZS1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgcm9sZS1saW5rIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJvbGUtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZWN1cml0eS1yb2xlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlY3VyaXR5LXJvbGUtcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlc3Npb24tdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZXNzaW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNtYWxsLWljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdHJhbnNhY3Rpb24tdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0cmFucy1hdHRyaWJ1dGUgaWQgSUQgI0lNUExJRUQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2VqYi1qYXJfMl8wLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8yXzAuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTJjYzdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8yXzAuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMTY3MSArMCwwIEBACi08IS0tCi1Db3B5cmlnaHQgKGMpIDIwMDAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwKLTkwMSBTYW4gQW50b25pbyBSb2FkLAotUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgcmVsYXRpbmcgdG8KLXRlY2hub2xvZ3kgZW1ib2RpZWQgaW4gdGhlIHByb2R1Y3QgdGhhdCBpcyBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4KLUluIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMgbGlzdGVkIGF0Ci1odHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUgYWRkaXRpb25hbCBwYXRlbnRzIG9yCi1wZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlIFUuUy4gYW5kIGluIG90aGVyIGNvdW50cmllcy4KLQotVGhpcyBkb2N1bWVudCBhbmQgdGhlIHByb2R1Y3QgdG8gd2hpY2ggaXQgcGVydGFpbnMgYXJlIGRpc3RyaWJ1dGVkCi11bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiwgYW5kCi1kZWNvbXBpbGF0aW9uLiAgVGhpcyBkb2N1bWVudCBtYXkgYmUgcmVwcm9kdWNlZCBhbmQgZGlzdHJpYnV0ZWQgYnV0IG1heQotbm90IGJlIGNoYW5nZWQgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMKLWxpY2Vuc29ycywgaWYgYW55LgotCi1UaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMgY29weXJpZ2h0ZWQgYW5kCi1saWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLVN1biwgIFN1biBNaWNyb3N5c3RlbXMsICB0aGUgU3VuIGxvZ28sICBKYXZhLCAgSmF2YVNlcnZlciBQYWdlcywgIEphdmEKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgIEpEQkMsICBKREssICBKYXZhTWFpbCBhbmQgIGFuZAotRW50ZXJwcmlzZSBKYXZhQmVhbnMgYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycyBTdWJqZWN0IHRvCi1TdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi1ET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFMTCBFWFBSRVNTIE9SIElNUExJRUQKLUNPTkRJVElPTlMsIFJFUFJFU0VOVEFUSU9OUyBBTkQgV0FSUkFOVElFUywgSU5DTFVESU5HIEFOWSBJTVBMSUVECi1XQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUgotTk9OLUlORlJJTkdFTUVOVCwgQVJFIERJU0NMQUlNRUQsIEVYQ0VQVCBUTyBUSEUgRVhURU5UIFRIQVQgU1VDSAotRElTQ0xBSU1FUlMgQVJFIEhFTEQgVE8gQkUgTEVHQUxMWSBJTlZBTElELgotCi0KLV9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLQotQ29weXJpZ2h0IChjKSAyMDAwIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sCi05MDEgU2FuIEFudG9uaW8gUm9hZCwKLVBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgRSd0YXRzLVVuaXMuCi1Ub3VzIGRyb2l0cyByZSdzZXJ2ZSdzLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGEgbGVzIGRyb2l0cyBkZSBwcm9wcmllJ3RlJyBpbnRlbGxlY3R1ZWxzCi1yZWxhdGFudHMgYWAgbGEgdGVjaG5vbG9naWUgaW5jb3Jwb3JlJ2UgZGFucyBsZSBwcm9kdWl0IHF1aSBlc3QgZGUnY3JpdAotZGFucyBjZSBkb2N1bWVudC4gRW4gcGFydGljdWxpZXIsIGV0IHNhbnMgbGEgbGltaXRhdGlvbiwgY2VzIGRyb2l0cyBkZQotcHJvcHJpZSd0ZScgaW50ZWxsZWN0dWVscyBwZXV2ZW50IGluY2x1cmUgdW4gb3UgcGx1cyBkZXMgYnJldmV0cwotYW1lJ3JpY2FpbnMgZSdudW1lJ3JlJ3MgYWAgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgZXQgdW4gb3UgbGVzCi1icmV2ZXRzIHBsdXMgc3VwcGxlJ21lbnRhaXJlcyBvdSBsZXMgYXBwbGljYXRpb25zIGRlIGJyZXZldCBlbiBhdHRlbnRlCi1kYW5zIGxlcyBFJ3RhdHMtVW5pcyBldCBkYW5zIGxlcyBhdXRyZXMgcGF5cy4KLQotQ2UgcHJvZHVpdCBvdSBkb2N1bWVudCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQgZGlzdHJpYnVlJwotYXZlYyBkZXMgbGljZW5jZXMgcXVpIGVuIHJlc3RyZWlnbmVudCBsJ3V0aWxpc2F0aW9uLCBsYSBjb3BpZSwgbGEKLWRpc3RyaWJ1dGlvbiwgZXQgbGEgZGUnY29tcGlsYXRpb24uICBDZSBkb2N1bWVudGlvbiBhc3NvY2llIG4gcGV1dAotZV50cmUgcmVwcm9kdWl0ZSBldCBkaXN0cmlidWVyLCBwYXIgcXVlbHF1ZSBtb3llbiBxdWUgY2Ugc29pdCwgc2FucwotbCdhdXRvcmlzYXRpb24gcHJlJ2FsYWJsZSBldCBlJ2NyaXRlIGRlIFN1biBldCBkZSBzZXMgYmFpbGxldXJzIGRlCi1saWNlbmNlLCBsZSBjYXMgZSdjaGUnYW50LgotCi1MZSBsb2dpY2llbCBkZSd0ZW51IHBhciBkZXMgdGllcnMsIGV0IHF1aSBjb21wcmVuZCBsYSB0ZWNobm9sb2dpZQotcmVsYXRpdmUgYXV4IHBvbGljZXMgZGUgY2FyYWN0ZWByZXMsIGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodCBldAotbGljZW5jaWUnIHBhciBkZXMgZm91cm5pc3NldXJzIGRlIFN1bi4KLQotU3VuLCAgU3VuIE1pY3Jvc3lzdGVtcywgIGxlIGxvZ28gU3VuLCAgSmF2YSwgIEphdmFTZXJ2ZXIgUGFnZXMsICBKYXZhCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsICBKREJDLCAgSkRLLCAgSmF2YU1haWwgZXQgIGFuZAotRW50ZXJwcmlzZSBKYXZhQmVhbnMgc29udCBkZXMgbWFycXVlcyBkZSBmYWJyaXF1ZSBvdSBkZXMgbWFycXVlcwotZGUncG9zZSdlcyBkZSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGF1eCBFJ3RhdHMtVW5pcyBldCBkYW5zIGQnYXV0cmVzCi1wYXlzLgotCi1MQSBET0NVTUVOVEFUSU9OIEVTVCBGT1VSTklFICJFTiBMJ0UnVEFUIiBFVCBUT1VURVMgQVVUUkVTIENPTkRJVElPTlMsCi1ERUNMQVJBVElPTlMgRVQgR0FSQU5USUVTIEVYUFJFU1NFUyBPVSBUQUNJVEVTIFNPTlQgRk9STUVMTEVNRU5UCi1FWENMVUVTLCBEQU5TIExBIE1FU1VSRSBBVVRPUklTRUUgUEFSIExBIExPSSBBUFBMSUNBQkxFLCBZIENPTVBSSVMKLU5PVEFNTUVOVCBUT1VURSBHQVJBTlRJRSBJTVBMSUNJVEUgUkVMQVRJVkUgQSBMQSBRVUFMSVRFIE1BUkNIQU5ERSwgQQotTCdBUFRJVFVERSBBIFVORSBVVElMSVNBVElPTiBQQVJUSUNVTElFUkUgT1UgQSBMJ0FCU0VOQ0UgREUKLUNPTlRSRUZBQyxPTi4KLS0tPgotCi08IS0tCi1UaGlzIGlzIHRoZSBYTUwgRFREIGZvciB0aGUgRUpCIDIuMCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi1BbGwgRUpCIDIuMCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5jbHVkZSBhIERPQ1RZUEUKLW9mIHRoZSBmb2xsb3dpbmcgZm9ybToKLQotICA8IURPQ1RZUEUgZWpiLWphciBQVUJMSUMKLQkiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDIuMC8vRU4iCi0JImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2VqYi1qYXJfMl8wLmR0ZCI+Ci0KLS0tPgotCi08IS0tCi1UaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLS0gSW4gZWxlbWVudHMgdGhhdCBjb250YWluIFBDREFUQSwgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZQotICBpbiB0aGUgZGF0YSBtYXkgYmUgaWdub3JlZC4KLQotLSBJbiBlbGVtZW50cyB3aG9zZSB2YWx1ZSBpcyBhbiAiZW51bWVyYXRlZCB0eXBlIiwgdGhlIHZhbHVlIGlzCi0gIGNhc2Ugc2Vuc2l0aXZlLgotCi0tIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlIHNhbWUKLSAgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90IHN0YXJ0aW5nIHdpdGggIi8iKQotICBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuCi0gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeQotICBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZQotICBuYW1lcyBhcmUgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0gIG5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIHNlcnZsZXQgQVBJLgotLS0+Ci0KLQotPCEtLQotVGhlIGVqYi1qYXIgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBFSkIgZGVwbG95bWVudAotZGVzY3JpcHRvci4gSXQgY29udGFpbnMKLQotCS0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGVqYi1qYXIgZmlsZQotCS0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0JLSBhbiBvcHRpb25hbCBzbWFsbCBpY29uIGZpbGUgbmFtZQotCS0gYW4gb3B0aW9uYWwgbGFyZ2UgaWNvbiBmaWxlIG5hbWUKLQktIG1hbmRhdG9yeSBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIGFib3V0IGFsbCBpbmNsdWRlZAotCSAgZW50ZXJwcmlzZSBiZWFucwotCS0gYSBkZXNjcmlwdG9yIGZvciBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLCBpZiBhbnkKLQktIGFuIG9wdGlvbmFsIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGRlc2NyaXB0b3IKLQktIGFuIG9wdGlvbmFsIG5hbWUgb2YgYW4gZWpiLWNsaWVudC1qYXIgZmlsZSBmb3IgdGhlIGVqYi1qYXIuCi0tLT4KLTwhRUxFTUVOVCBlamItamFyIChkZXNjcmlwdGlvbj8sIGRpc3BsYXktbmFtZT8sIHNtYWxsLWljb24/LAotbGFyZ2UtaWNvbj8sIGVudGVycHJpc2UtYmVhbnMsIHJlbGF0aW9uc2hpcHM/LCBhc3NlbWJseS1kZXNjcmlwdG9yPywKLWVqYi1jbGllbnQtamFyPyk+Ci0KLTwhLS0KLVRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgYWJzdHJhY3QKLXNjaGVtYSB0eXBlIG9mIGFuIGVudGl0eSBiZWFuIHdpdGggY21wLXZlcnNpb24gMi54LiBJdCBpcyB1c2VkIGluIEVKQgotUUwgcXVlcmllcy4KLQotRm9yIGV4YW1wbGUsIHRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBmb3IgYW4gZW50aXR5IGJlYW4gd2hvc2UgbG9jYWwKLWludGVyZmFjZSBpcyBjb20uYWNtZS5jb21tZXJjZS5PcmRlciBtaWdodCBiZSBPcmRlci4KLQotVXNlZCBpbjogZW50aXR5Ci0tLT4KLTwhRUxFTUVOVCBhYnN0cmFjdC1zY2hlbWEtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLQotVGhlIGFja25vd2xlZGdlLW1vZGUgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBKTVMgQVVUT19BQ0tOT1dMRURHRSBvcgotRFVQU19PS19BQ0tOT1dMRURHRSBtZXNzYWdlIGFja25vd2xlZGdtZW50IHNlbWFudGljcyBzaG91bGQgYmUgdXNlZAotZm9yIHRoZSBvbk1lc3NhZ2UgbWVzc2FnZSBvZiBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4gdGhhdCB1c2VzIGJlYW4KLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24uCi0KLVRoZSBhY2tub3dsZWRnZS1tb2RlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQk8YWNrbm93bGVkZ2UtbW9kZT5BdXRvLWFja25vd2xlZGdlPC9hY2tub3dsZWRnZS1tb2RlPgotCTxhY2tub3dsZWRnZS1tb2RlPkR1cHMtb2stYWNrbm93bGVkZ2U8L2Fja25vd2xlZGdlbW9kZT4KLQotVXNlZCBpbjogbWVzc2FnZS1kcml2ZW4KLS0tPgotPCFFTEVNRU5UIGFja25vd2xlZGdlLW1vZGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgYXNzZW1ibHktZGVzY3JpcHRvciBlbGVtZW50IGNvbnRhaW5zIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGluZm9ybWF0aW9uLgotCi1UaGUgYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24gY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYXJ0czoKLXRoZSBkZWZpbml0aW9uIG9mIHNlY3VyaXR5IHJvbGVzLCB0aGUgZGVmaW5pdGlvbiBvZiBtZXRob2QKLXBlcm1pc3Npb25zLCB0aGUgZGVmaW5pdGlvbiBvZiB0cmFuc2FjdGlvbiBhdHRyaWJ1dGVzIGZvcgotZW50ZXJwcmlzZSBiZWFucyB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uIGFuZAotYSBsaXN0IG9mIG1ldGhvZHMgdG8gYmUgZXhjbHVkZWQgZnJvbSBiZWluZyBpbnZva2VkLgotCi1BbGwgdGhlIHBhcnRzIGFyZSBvcHRpb25hbCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IGFyZSBvbWl0dGVkIGlmIHRoZQotbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuCi0KLVByb3ZpZGluZyBhbiBhc3NlbWJseS1kZXNjcmlwdG9yIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaXMKLW9wdGlvbmFsIGZvciB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyLgotCi1Vc2VkIGluOiBlamItamFyCi0tLT4KLTwhRUxFTUVOVCBhc3NlbWJseS1kZXNjcmlwdG9yIChzZWN1cml0eS1yb2xlKiwgbWV0aG9kLXBlcm1pc3Npb24qLAotY29udGFpbmVyLXRyYW5zYWN0aW9uKiwgZXhjbHVkZS1saXN0Pyk+Ci0KLTwhLS0KLVRoZSBjYXNjYWRlLWRlbGV0ZSBlbGVtZW50IHNwZWNpZmllcyB0aGF0LCB3aXRoaW4gYSBwYXJ0aWN1bGFyCi1yZWxhdGlvbnNoaXAsIHRoZSBsaWZldGltZSBvZiBvbmUgb3IgbW9yZSBlbnRpdHkgYmVhbnMgaXMgZGVwZW5kZW50Ci11cG9uIHRoZSBsaWZldGltZSBvZiBhbm90aGVyIGVudGl0eSBiZWFuLiBUaGUgY2FzY2FkZS1kZWxldGUgZWxlbWVudAotY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhbiBlamItcmVsYXRpb25zaGlwLXJvbGUgZWxlbWVudCBjb250YWluZWQKLWluIGFuIGVqYi1yZWxhdGlvbiBlbGVtZW50IGluIHdoaWNoIHRoZSBvdGhlciBlamItcmVsYXRpb25zaGlwLXJvbGUKLWVsZW1lbnQgc3BlY2lmaWVzIGEgbXVsdGlwbGljaXR5IG9mIE9uZS4KLQotVXNlZCBpbjogZWpiLXJlbGF0aW9uc2hpcC1yb2xlCi0tLT4KLTwhRUxFTUVOVCBjYXNjYWRlLWRlbGV0ZSBFTVBUWT4KLQotPCEtLQotVGhlIGNtcC1maWVsZCBlbGVtZW50IGRlc2NyaWJlcyBhIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkLiBUaGUKLWZpZWxkIGVsZW1lbnQgaW5jbHVkZXMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGZpZWxkLCBhbmQgdGhlCi1uYW1lIG9mIHRoZSBmaWVsZC4KLQotVXNlZCBpbjogZW50aXR5Ci0tLT4KLTwhRUxFTUVOVCBjbXAtZmllbGQgKGRlc2NyaXB0aW9uPywgZmllbGQtbmFtZSk+Ci0KLTwhLS0KLVRoZSBjbXAtdmVyc2lvbiBlbGVtZW50IHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiBhbiBlbnRpdHkgYmVhbgotd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4KLQotVGhlIGNtcC12ZXJzaW9uIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQk8Y21wLXZlcnNpb24+MS54PC9jbXAtdmVyc2lvbj4KLQk8Y21wLXZlcnNpb24+Mi54PC9jbXAtdmVyc2lvbj4KLQotVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNtcC12ZXJzaW9uIGVsZW1lbnQgaXMgMi54LgotCi1Vc2VkIGluOiBlbnRpdHkKLS0tPgotPCFFTEVNRU5UIGNtcC12ZXJzaW9uICgjUENEQVRBKT4KLQotPCEtLQotCi1UaGUgY21yLWZpZWxkIGVsZW1lbnQgZGVzY3JpYmVzIHRoZSBiZWFuIHByb3ZpZGVyJ3MgdmlldyBvZiBhCi1yZWxhdGlvbnNoaXAuIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQgdGhlIG5hbWUgYW5kCi10aGUgY2xhc3MgdHlwZSBvZiBhIGZpZWxkIGluIHRoZSBzb3VyY2Ugb2YgYSByb2xlIG9mIGEKLXJlbGF0aW9uc2hpcC4gVGhlIGNtci1maWVsZC1uYW1lIGVsZW1lbnQgY29ycmVzcG9uZHMgdG8gdGhlIG5hbWUgdXNlZAotZm9yIHRoZSBnZXQgYW5kIHNldCBhY2Nlc3NvciBtZXRob2RzIGZvciB0aGUgcmVsYXRpb25zaGlwLiBUaGUKLWNtci1maWVsZC10eXBlIGVsZW1lbnQgaXMgdXNlZCBvbmx5IGZvciBjb2xsZWN0aW9uLXZhbHVlZAotY21yLWZpZWxkcy4gSXQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgaXMgdXNlZC4KLQotVXNlZCBpbjogZWpiLXJlbGF0aW9uc2hpcC1yb2xlCi0tLT4KLTwhRUxFTUVOVCBjbXItZmllbGQgKGRlc2NyaXB0aW9uPywgY21yLWZpZWxkLW5hbWUsIGNtci1maWVsZC10eXBlPyk+Ci0KLTwhLS0KLVRoZSBjbXItZmllbGQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGxvZ2ljYWwKLXJlbGF0aW9uc2hpcCBmaWVsZCBpbiB0aGUgZW50aXR5IGJlYW4gY2xhc3MuIFRoZSBuYW1lIG9mIHRoZSBjbXItZmllbGQKLW11c3QgYmVnaW4gd2l0aCBhIGxvd2VyY2FzZSBsZXR0ZXIuIFRoaXMgZmllbGQgaXMgYWNjZXNzZWQgYnkgbWV0aG9kcwotd2hvc2UgbmFtZXMgY29uc2lzdCBvZiB0aGUgbmFtZSBvZiB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5Ci1jbXItZmllbGQtbmFtZSBpbiB3aGljaCB0aGUgZmlyc3QgbGV0dGVyIGlzIHVwcGVyY2FzZWQsIHByZWZpeGVkIGJ5Ci0iZ2V0IiBvciAic2V0Ii4KLQotVXNlZCBpbjogY21yLWZpZWxkCi0tLT4KLTwhRUxFTUVOVCBjbXItZmllbGQtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBjbXItZmllbGQtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgY2xhc3Mgb2YgYQotY29sbGVjdGlvbi12YWx1ZWQgbG9naWNhbCByZWxhdGlvbnNoaXAgZmllbGQgaW4gdGhlIGVudGl0eSBiZWFuCi1jbGFzcy4gVGhlIHZhbHVlIG9mIHRoZSBjbXItZmllbGQtdHlwZSBlbGVtZW50IG11c3QgYmUgZWl0aGVyOgotamF2YS51dGlsLkNvbGxlY3Rpb24gb3IgamF2YS51dGlsLlNldC4KLQotVXNlZCBpbjogY21yLWZpZWxkCi0tLT4KLTwhRUxFTUVOVCBjbXItZmllbGQtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBjb250YWluZXItdHJhbnNhY3Rpb24gZWxlbWVudCBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIKLW11c3QgbWFuYWdlIHRyYW5zYWN0aW9uIHNjb3BlcyBmb3IgdGhlIGVudGVycHJpc2UgYmVhbidzIG1ldGhvZAotaW52b2NhdGlvbnMuIFRoZSBlbGVtZW50IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhIGxpc3QKLW9mIG1ldGhvZCBlbGVtZW50cywgYW5kIGEgdHJhbnNhY3Rpb24gYXR0cmlidXRlLiBUaGUgdHJhbnNhY3Rpb24KLWF0dHJpYnV0ZSBpcyB0byBiZSBhcHBsaWVkIHRvIGFsbCB0aGUgc3BlY2lmaWVkIG1ldGhvZHMuCi0KLVVzZWQgaW46IGFzc2VtYmx5LWRlc2NyaXB0b3IKLS0tPgotPCFFTEVNRU5UIGNvbnRhaW5lci10cmFuc2FjdGlvbiAoZGVzY3JpcHRpb24/LCBtZXRob2QrLCB0cmFucy1hdHRyaWJ1dGUpPgotCi08IS0tCi1UaGUgZGVzY3JpcHRpb24gZWxlbWVudCBpcyB1c2VkIHRvIHByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQKLWVsZW1lbnQuICBUaGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdAotdGhlIGVudGVycHJpc2UgYmVhbiBlamItamFyIGZpbGUgcHJvZHVjZXIgd2FudHMgdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YKLXRoZSBlbnRlcnByaXNlIGJlYW4gZWpiLWphciBmaWxlIChpLmUuLCB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scwotdXNlZCBieSB0aGUgZW50ZXJwcmlzZSBiZWFuIGVqYi1qYXIgZmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkgdGhlIGRlc2NyaXB0aW9uCi13aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uLgotCi1Vc2VkIGluOiBjbXAtZmllbGQsIGNtci1maWVsZCwgY29udGFpbmVyLXRyYW5zYWN0aW9uLCBlamItamFyLAotZWpiLWxvY2FsLXJlZiwgZWpiLXJlZiwgZWpiLXJlbGF0aW9uLCBlamItcmVsYXRpb25zaGlwLXJvbGUsIGVudGl0eSwKLWVudi1lbnRyeSwgZXhjbHVkZS1saXN0LCBtZXNzYWdlLWRyaXZlbiwgbWV0aG9kLCBtZXRob2QtcGVybWlzc2lvbiwKLXF1ZXJ5LCByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UsIHJlbGF0aW9uc2hpcHMsIHJlc291cmNlLWVudi1yZWYsCi1yZXNvdXJjZS1yZWYsIHJ1bi1hcywgc2VjdXJpdHktaWRlbnRpdHksIHNlY3VyaXR5LXJvbGUsCi1zZWN1cml0eS1yb2xlLXJlZiwgc2Vzc2lvbgotLS0+Ci08IUVMRU1FTlQgZGVzY3JpcHRpb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZGVzdGluYXRpb24tdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgSk1TCi1kZXN0aW5hdGlvbi4gVGhlIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBKYXZhIGludGVyZmFjZSBleHBlY3RlZCB0bwotYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRlc3RpbmF0aW9uLgotCi1UaGUgZGVzdGluYXRpb24tdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi08ZGVzdGluYXRpb24tdHlwZT5qYXZheC5qbXMuUXVldWU8L2Rlc3RpbmF0aW9uLXR5cGU+Ci08ZGVzdGluYXRpb24tdHlwZT5qYXZheC5qbXMuVG9waWM8L2Rlc3RpbmF0aW9uLXR5cGU+Ci0KLVVzZWQgaW46IG1lc3NhZ2UtZHJpdmVuLWRlc3RpbmF0aW9uCi0tLT4KLTwhRUxFTUVOVCBkZXN0aW5hdGlvbi10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCi1kaXNwbGF5ZWQgYnkgdG9vbHMuICBUaGUgZGlzcGxheSBuYW1lIG5lZWQgbm90IGJlIHVuaXF1ZS4KLQotVXNlZCBpbjogZWpiLWphciwgZW50aXR5LCBtZXNzYWdlLWRyaXZlbiwgc2Vzc2lvbgotCi1FeGFtcGxlOgotCi08ZGlzcGxheS1uYW1lPkVtcGxveWVlIFNlbGYgU2VydmljZTwvZGlzcGxheS1uYW1lPgotLS0+Ci08IUVMRU1FTlQgZGlzcGxheS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1jbGFzcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUKLWVudGVycHJpc2UgYmVhbidzIGNsYXNzLgotCi1Vc2VkIGluOiBlbnRpdHksIG1lc3NhZ2UtZHJpdmVuLCBzZXNzaW9uCi0KLUV4YW1wbGU6Ci0KLTxlamItY2xhc3M+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZUJlYW48L2VqYi1jbGFzcz4KLS0tPgotPCFFTEVNRU5UIGVqYi1jbGFzcyAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBvcHRpb25hbCBlamItY2xpZW50LWphciBlbGVtZW50IHNwZWNpZmllcyBhIEpBUiBmaWxlIHRoYXQgY29udGFpbnMKLXRoZSBjbGFzcyBmaWxlcyBuZWNlc3NhcnkgZm9yIGEgY2xpZW50IHByb2dyYW0gdG8gYWNjZXNzIHRoZQotZW50ZXJwcmlzZSBiZWFucyBpbiB0aGUgZWpiLWphciBmaWxlLgotCi1Vc2VkIGluOiBlamItamFyCi0KLUV4YW1wbGU6Ci0KLTxlamItY2xpZW50LWphcj5lbXBsb3llZV9zZXJ2aWNlX2NsaWVudC5qYXI8L2VqYi1jbGllbnQtamFyPgotLS0+Ci08IUVMRU1FTlQgZWpiLWNsaWVudC1qYXIgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBlamItcmVmIG9yIGVqYi1sb2NhbC1yZWYKLWVsZW1lbnRzIHRvIHNwZWNpZnkgdGhhdCBhbiBFSkIgcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBhbgotZW50ZXJwcmlzZSBiZWFuLgotCi1UaGUgdmFsdWUgb2YgdGhlIGVqYi1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgZWpiLW5hbWUgb2YgYW4KLWVudGVycHJpc2UgYmVhbiBpbiB0aGUgc2FtZSBlamItamFyIGZpbGUgb3IgaW4gYW5vdGhlciBlamItamFyCi1maWxlIGluIHRoZSBzYW1lIEoyRUUgYXBwbGljYXRpb24gdW5pdC4KLQotQWx0ZXJuYXRpdmVseSwgdGhlIG5hbWUgaW4gdGhlIGVqYi1saW5rIGVsZW1lbnQgbWF5IGJlIGNvbXBvc2VkIG9mIGEKLXBhdGggbmFtZSBzcGVjaWZ5aW5nIHRoZSBlamItamFyIGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZQotYmVhbiB3aXRoIHRoZSBlamItbmFtZSBvZiB0aGUgdGFyZ2V0IGJlYW4gYXBwZW5kZWQgYW5kIHNlcGFyYXRlZCBmcm9tCi10aGUgcGF0aCBuYW1lIGJ5ICIjIi4gIFRoZSBwYXRoIG5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIGVqYi1qYXIgZmlsZQotY29udGFpbmluZyB0aGUgZW50ZXJwcmlzZSBiZWFuIHRoYXQgaXMgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbi4KLVRoaXMgYWxsb3dzIG11bHRpcGxlIGVudGVycHJpc2UgYmVhbnMgd2l0aCB0aGUgc2FtZSBlamItbmFtZSB0byBiZQotdW5pcXVlbHkgaWRlbnRpZmllZC4KLQotVXNlZCBpbjogZWpiLWxvY2FsLXJlZiwgZWpiLXJlZgotCi1FeGFtcGxlczoKLQotCTxlamItbGluaz5FbXBsb3llZVJlY29yZDwvZWpiLWxpbms+Ci0KLQk8ZWpiLWxpbms+Li4vcHJvZHVjdHMvcHJvZHVjdC5qYXIjUHJvZHVjdEVKQjwvZWpiLWxpbms+Ci0KLS0tPgotPCFFTEVNRU5UIGVqYi1saW5rICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1sb2NhbC1yZWYgZWxlbWVudCBpcyB1c2VkIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8KLWFuIGVudGVycHJpc2UgYmVhbidzIGxvY2FsIGhvbWUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLQotCS0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQktIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuCi0JICB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbgotCS0gdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0JLSB0aGUgZXhwZWN0ZWQgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlcyBvZiB0aGUgcmVmZXJlbmNlZAotCSAgZW50ZXJwcmlzZSBiZWFuCi0JLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZSByZWZlcmVuY2VkCi0JICBlbnRlcnByaXNlIGJlYW4KLQotVXNlZCBpbjogZW50aXR5LCBtZXNzYWdlLWRyaXZlbiwgc2Vzc2lvbgotLS0+Ci08IUVMRU1FTlQgZWpiLWxvY2FsLXJlZiAoZGVzY3JpcHRpb24/LCBlamItcmVmLW5hbWUsIGVqYi1yZWYtdHlwZSwKLQkJbG9jYWwtaG9tZSwgbG9jYWwsIGVqYi1saW5rPyk+Ci0KLTwhLS0KLVRoZSBlamItbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncyBuYW1lLiBUaGlzIG5hbWUgaXMKLWFzc2lnbmVkIGJ5IHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIgdG8gbmFtZSB0aGUgZW50ZXJwcmlzZSBiZWFuIGluCi10aGUgZWpiLWphciBmaWxlJ3MgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotYW1vbmcgdGhlIG5hbWVzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW5zIGluIHRoZSBzYW1lIGVqYi1qYXIgZmlsZS4KLQotVGhlcmUgaXMgbm8gYXJjaGl0ZWN0ZWQgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGVqYi1uYW1lIGluIHRoZQotZGVwbG95bWVudCBkZXNjcmlwdG9yIGFuZCB0aGUgSk5ESSBuYW1lIHRoYXQgdGhlIERlcGxveWVyIHdpbGwgYXNzaWduCi10byB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4KLQotVGhlIG5hbWUgZm9yIGFuIGVudGl0eSBiZWFuIHdpdGggY21wLXZlcnNpb24gMi54IG11c3QgY29uZm9ybSB0byB0aGUKLWxleGljYWwgcnVsZXMgZm9yIGFuIE5NVE9LRU4uIFRoZSBuYW1lIGZvciBhbiBlbnRpdHkgYmVhbiB3aXRoCi1jbXAtdmVyc2lvbiAyLnggbXVzdCBub3QgYmUgYSByZXNlcnZlZCBsaXRlcmFsIGluIEVKQiBRTC4KLQotVXNlZCBpbjogZW50aXR5LCBtZXNzYWdlLWRyaXZlbiwgbWV0aG9kLCByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UsCi1zZXNzaW9uCi0KLUV4YW1wbGU6Ci0KLTxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotLS0+Ci08IUVMRU1FTlQgZWpiLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLXFsIGVsZW1lbnQgY29udGFpbnMgdGhlIEVKQiBRTCBxdWVyeSBzdHJpbmcgdGhhdCBkZWZpbmVzCi1hIGZpbmRlciBvciBzZWxlY3QgcXVlcnkuIFRoaXMgZWxlbWVudCBpcyBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YKLWEgcXVlcnkgZWxlbWVudCB3aG9zZSBjb250ZW50cyBzcGVjaWZ5IHRoZSBmaW5kZXIgb3IgdGhlIHNlbGVjdCBtZXRob2QKLXRoYXQgdXNlcyB0aGUgcXVlcnkuIFRoZSBjb250ZW50IG11c3QgYmUgYSB2YWxpZCBFSkIgUUwgcXVlcnkgc3RyaW5nCi1mb3IgdGhlIGVudGl0eSBiZWFuIGZvciB3aGljaCB0aGUgcXVlcnkgaXMgc3BlY2lmaWVkLgotCi1UaGUgZWpiLXFsIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGFsbCBxdWVyaWVzIHRoYXQgYXJlCi1leHByZXNzaWJsZSBpbiBFSkIgUUwuCi0KLVVzZWQgaW46IHF1ZXJ5Ci0KLUV4YW1wbGU6Ci08cXVlcnk+Ci0gICAgPHF1ZXJ5LW1ldGhvZD4KLSAgICAgICAgPG1ldGhvZC1uYW1lPmVqYlNlbGVjdFBlbmRpbmdMaW5laXRlbXM8L21ldGhvZC1uYW1lPgotICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgPGVqYi1xbD5TRUxFQ1QgT0JKRUNUKGwpIEZST00gTGluZUl0ZW1zIGwgV0hFUkUgbC5zaGlwcGVkIDw+IFRSVUUKLSAgICA8L2VqYi1xbD4KLTwvcXVlcnk+Ci0KLS0tPgotPCFFTEVNRU5UIGVqYi1xbCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItcmVmIGVsZW1lbnQgaXMgdXNlZCBmb3IgdGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvCi1hbiBlbnRlcnByaXNlIGJlYW4ncyBob21lLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0KLQktIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YKLQkgIHRoZSBlbnRlcnByaXNlIGJlYW4gdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4KLQktIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotCS0gdGhlIGV4cGVjdGVkIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzIG9mIHRoZSByZWZlcmVuY2VkCi0JICBlbnRlcnByaXNlIGJlYW4KLQktIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlZmVyZW5jZWQKLQkgIGVudGVycHJpc2UgYmVhbgotCi1Vc2VkIGluOiBlbnRpdHksIG1lc3NhZ2UtZHJpdmVuLCBzZXNzaW9uCi0tLT4KLTwhRUxFTUVOVCBlamItcmVmIChkZXNjcmlwdGlvbj8sIGVqYi1yZWYtbmFtZSwgZWpiLXJlZi10eXBlLAotCQlob21lLCByZW1vdGUsIGVqYi1saW5rPyk+Ci0KLTwhLS0KLVRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIgcmVmZXJlbmNlLiBUaGUKLUVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIGVudGVycHJpc2UgYmVhbidzIGVudmlyb25tZW50IGFuZCBpcwotcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi13aXRoaW4gdGhlIGVudGVycHJpc2UgYmVhbi4KLQotSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi1Vc2VkIGluOiBlamItbG9jYWwtcmVmLCBlamItcmVmCi0KLUV4YW1wbGU6Ci0KLTxlamItcmVmLW5hbWU+ZWpiL1BheXJvbGw8L2VqYi1yZWYtbmFtZT4KLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItcmVmLXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUKLXJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLgotCi1UaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotCTxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0JPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0KLVVzZWQgaW46IGVqYi1sb2NhbC1yZWYsIGVqYi1yZWYKLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLQotVGhlIGVqYi1yZWxhdGlvbiBlbGVtZW50IGRlc2NyaWJlcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3bwotZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuICBBbiBlamItcmVsYXRpb24KLWVsZW1lbnQgY29udGFpbnMgYSBkZXNjcmlwdGlvbjsgYW4gb3B0aW9uYWwgZWpiLXJlbGF0aW9uLW5hbWUgZWxlbWVudDsKLWFuZCBleGFjdGx5IHR3byByZWxhdGlvbnNoaXAgcm9sZSBkZWNsYXJhdGlvbnMsIGRlZmluZWQgYnkgdGhlCi1lamItcmVsYXRpb25zaGlwLXJvbGUgZWxlbWVudHMuIFRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAsIGlmCi1zcGVjaWZpZWQsIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZS4KLQotVXNlZCBpbjogcmVsYXRpb25zaGlwcwotLS0+Ci08IUVMRU1FTlQgZWpiLXJlbGF0aW9uIChkZXNjcmlwdGlvbj8sIGVqYi1yZWxhdGlvbi1uYW1lPywgZWpiLXJlbGF0aW9uc2hpcC1yb2xlLAotZWpiLXJlbGF0aW9uc2hpcC1yb2xlKT4KLQotPCEtLQotVGhlIGVqYi1yZWxhdGlvbi1uYW1lIGVsZW1lbnQgcHJvdmlkZXMgYSB1bmlxdWUgbmFtZSBmb3IgYSByZWxhdGlvbnNoaXAuCi0KLVVzZWQgaW46IGVqYi1yZWxhdGlvbgotLS0+Ci08IUVMRU1FTlQgZWpiLXJlbGF0aW9uLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGVsZW1lbnQgZGVzY3JpYmVzIGEgcm9sZSB3aXRoaW4gYQotcmVsYXRpb25zaGlwLiBUaGVyZSBhcmUgdHdvIHJvbGVzIGluIGVhY2ggcmVsYXRpb25zaGlwLgotCi1UaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGVsZW1lbnQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb247IGFuCi1vcHRpb25hbCBuYW1lIGZvciB0aGUgcmVsYXRpb25zaGlwIHJvbGU7IGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUKLW11bHRpcGxpY2l0eSBvZiB0aGUgcm9sZTsgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiBjYXNjYWRlLWRlbGV0ZQotZnVuY3Rpb25hbGl0eSBmb3IgdGhlIHJvbGU7IHRoZSByb2xlIHNvdXJjZTsgYW5kIGEgZGVjbGFyYXRpb24gb2YgdGhlCi1jbXItZmllbGQsIGlmIGFueSwgYnkgbWVhbnMgb2Ygd2hpY2ggdGhlIG90aGVyIHNpZGUgb2YgdGhlCi1yZWxhdGlvbnNoaXAgaXMgYWNjZXNzZWQgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIHJvbGUgc291cmNlLgotCi1UaGUgbXVsdGlwbGljaXR5IGFuZCByb2xlLXNvdXJjZSBlbGVtZW50IGFyZSBtYW5kYXRvcnkuCi0KLVRoZSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCBkZXNpZ25hdGVzIGFuIGVudGl0eSBiZWFuIGJ5Ci1tZWFucyBvZiBhbiBlamItbmFtZSBlbGVtZW50LiBGb3IgYmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzLCBib3RoCi1yb2xlcyBvZiBhIHJlbGF0aW9uc2hpcCBtdXN0IGRlY2xhcmUgYSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UKLWVsZW1lbnQgdGhhdCBzcGVjaWZpZXMgYSBjbXItZmllbGQgaW4gdGVybXMgb2Ygd2hpY2ggdGhlIHJlbGF0aW9uc2hpcAotaXMgYWNjZXNzZWQuIFRoZSBsYWNrIG9mIGEgY21yLWZpZWxkIGVsZW1lbnQgaW4gYW4KLWVqYi1yZWxhdGlvbnNoaXAtcm9sZSBzcGVjaWZpZXMgdGhhdCB0aGUgcmVsYXRpb25zaGlwIGlzCi11bmlkaXJlY3Rpb25hbCBpbiBuYXZpZ2FiaWxpdHkgYW5kIHRoZSBlbnRpdHkgYmVhbiB0aGF0IHBhcnRpY2lwYXRlcwotaW4gdGhlIHJlbGF0aW9uc2hpcCBpcyAibm90IGF3YXJlIiBvZiB0aGUgcmVsYXRpb25zaGlwLgotCi1Vc2VkIGluOiBlamItcmVsYXRpb24KLQotRXhhbXBsZToKLQotPGVqYi1yZWxhdGlvbj4KLSAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+UHJvZHVjdC1MaW5lSXRlbTwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnByb2R1Y3QtaGFzLWxpbmVpdGVtcwotICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICA8ZWpiLW5hbWU+UHJvZHVjdEVKQjwvZWpiLW5hbWU+Ci0gICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLQotLS0+Ci08IUVMRU1FTlQgZWpiLXJlbGF0aW9uc2hpcC1yb2xlIChkZXNjcmlwdGlvbj8sIGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPywKLW11bHRpcGxpY2l0eSwgY2FzY2FkZS1kZWxldGU/LCByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UsIGNtci1maWVsZD8pPgotCi08IS0tCi1UaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUgZWxlbWVudCBkZWZpbmVzIGEgbmFtZSBmb3IgYSByb2xlIHRoYXQKLWlzIHVuaXF1ZSB3aXRoaW4gYW4gZWpiLXJlbGF0aW9uLiBEaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBjYW4gdXNlIHRoZQotc2FtZSBuYW1lIGZvciBhIHJvbGUuCi0KLVVzZWQgaW46IGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotLS0+Ci08IUVMRU1FTlQgZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW50ZXJwcmlzZS1iZWFucyBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbnMgb2Ygb25lIG9yIG1vcmUKLWVudGVycHJpc2UgYmVhbnMuCi0tLT4KLTwhRUxFTUVOVCBlbnRlcnByaXNlLWJlYW5zIChzZXNzaW9uIHwgZW50aXR5IHwgbWVzc2FnZS1kcml2ZW4pKz4KLQotPCEtLQotVGhlIGVudGl0eSBlbGVtZW50IGRlY2xhcmVzIGFuIGVudGl0eSBiZWFuLiBUaGUgZGVjbGFyYXRpb24KLWNvbnNpc3RzIG9mOgotCi0JLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCS0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0JLSBhbiBvcHRpb25hbCBzbWFsbCBpY29uIGZpbGUgbmFtZQotCS0gYW4gb3B0aW9uYWwgbGFyZ2UgaWNvbiBmaWxlIG5hbWUKLQktIGEgdW5pcXVlIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbgotCSAgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotCS0gdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBob21lIGFuZCByZW1vdGUKLSAgICAgICAgICBpbnRlcmZhY2VzLCBpZiBhbnkKLQktIHRoZSBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4ncyBsb2NhbCBob21lIGFuZCBsb2NhbAotCSAgaW50ZXJmYWNlcywgaWYgYW55Ci0JLSB0aGUgZW50aXR5IGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcwotCS0gdGhlIGVudGl0eSBiZWFuJ3MgcGVyc2lzdGVuY2UgbWFuYWdlbWVudCB0eXBlCi0JLSB0aGUgZW50aXR5IGJlYW4ncyBwcmltYXJ5IGtleSBjbGFzcyBuYW1lCi0JLSBhbiBpbmRpY2F0aW9uIG9mIHRoZSBlbnRpdHkgYmVhbidzIHJlZW50cmFuY3kKLQktIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MgY21wLXZlcnNpb24KLQktIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MgYWJzdHJhY3QKLQkgIHNjaGVtYSBuYW1lCi0JLSBhbiBvcHRpb25hbCBsaXN0IG9mIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcwotCS0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkgZmllbGQKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQgZW50cmllcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgcmVmZXJlbmNlcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbCBFSkIgcmVmZXJlbmNlcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5Ci0JICB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSBtYW5hZ2VyCi0gICAgICAgICAgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZXMKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLQkgIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZXMKLQktIGFuIG9wdGlvbmFsIHNldCBvZiBxdWVyeSBkZWNsYXJhdGlvbnMKLQkgIGZvciBmaW5kZXIgYW5kIHNlbGVjdCBtZXRob2RzIGZvciBhbiBlbnRpdHkKLQkgIGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAyLnguCi0KLVRoZSBvcHRpb25hbCBhYnN0cmFjdC1zY2hlbWEtbmFtZSBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkIGZvciBhbgotZW50aXR5IGJlYW4gd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZSBhbmQgY21wLXZlcnNpb24gMi54LgotCi1UaGUgb3B0aW9uYWwgcHJpbWtleS1maWVsZCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvciBpZiB0aGUKLWVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLgotCi1UaGUgb3B0aW9uYWwgY21wLXZlcnNpb24gZWxlbWVudCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvciBpZgotdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyLiBJZiB0aGUgcGVyc2lzdGVuY2UtdHlwZSBpcwotQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24gZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCBpdHMgdmFsdWUKLWRlZmF1bHRzIHRvIDIueC4KLQotVGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZiB0aGUgZW50aXR5Ci1iZWFuIGNtcC12ZXJzaW9uIGlzIDEueC4KLQotVGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZiB0aGUgZW50aXR5Ci1iZWFuIGhhcyBhIHJlbW90ZSBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlLgotCi1UaGUgb3B0aW9uYWwgbG9jYWwtaG9tZSBhbmQgbG9jYWwgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgaWYgdGhlCi1lbnRpdHkgYmVhbiBoYXMgYSBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2UuCi0KLUVpdGhlciBib3RoIHRoZSBsb2NhbC1ob21lIGFuZCB0aGUgbG9jYWwgZWxlbWVudHMgb3IgYm90aCB0aGUKLWhvbWUgYW5kIHRoZSByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQuCi0KLVRoZSBvcHRpb25hbCBxdWVyeSBlbGVtZW50cyBtdXN0IGJlIHByZXNlbnQgaWYgdGhlIHBlcnNpc3RlbmNlLXR5cGUgaXMKLUNvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGlzIDIueCBhbmQgcXVlcnkgbWV0aG9kcyBvdGhlciB0aGFuCi1maW5kQnlQcmltYXJ5S2V5IGhhdmUgYmVlbiBkZWZpbmVkIGZvciB0aGUgZW50aXR5IGJlYW4uCi0KLVRoZSBvdGhlciBlbGVtZW50cyB0aGF0IGFyZSBvcHRpb25hbCBhcmUgIm9wdGlvbmFsIiBpbiB0aGUgc2Vuc2UgdGhhdAotdGhleSBhcmUgb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuCi0KLUF0IGxlYXN0IG9uZSBjbXAtZmllbGQgZWxlbWVudCBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IgaWYKLXRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lciBhbmQgdGhlIGNtcC12ZXJzaW9uIGlzIDEueCwKLWFuZCBub25lIG11c3Qgbm90IGJlIHByZXNlbnQgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQmVhbi4KLQotVXNlZCBpbjogZW50ZXJwcmlzZS1iZWFucwotCi0tLT4KLTwhRUxFTUVOVCBlbnRpdHkgKGRlc2NyaXB0aW9uPywgZGlzcGxheS1uYW1lPywgc21hbGwtaWNvbj8sCi0JCWxhcmdlLWljb24/LCBlamItbmFtZSwgaG9tZT8sIHJlbW90ZT8sIGxvY2FsLWhvbWU/LAotCQlsb2NhbD8sIGVqYi1jbGFzcywgcGVyc2lzdGVuY2UtdHlwZSwgcHJpbS1rZXktY2xhc3MsCi0JCXJlZW50cmFudCwgY21wLXZlcnNpb24/LCBhYnN0cmFjdC1zY2hlbWEtbmFtZT8sCi0JCWNtcC1maWVsZCosIHByaW1rZXktZmllbGQ/LCBlbnYtZW50cnkqLCBlamItcmVmKiwKLQkJZWpiLWxvY2FsLXJlZiosIHNlY3VyaXR5LXJvbGUtcmVmKiwgc2VjdXJpdHktaWRlbnRpdHk/LAotCQlyZXNvdXJjZS1yZWYqLCByZXNvdXJjZS1lbnYtcmVmKiwgcXVlcnkqKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncwotZW52aXJvbm1lbnQgZW50cnkuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbAotZGVzY3JpcHRpb24sIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgYW5kIGFuIG9wdGlvbmFsCi12YWx1ZS4gIElmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCwgb25lIG11c3QgYmUgc3VwcGxpZWQKLWR1cmluZyBkZXBsb3ltZW50LgotCi1Vc2VkIGluOiBlbnRpdHksIG1lc3NhZ2UtZHJpdmVuLCBzZXNzaW9uCi0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnkgKGRlc2NyaXB0aW9uPywgZW52LWVudHJ5LW5hbWUsIGVudi1lbnRyeS10eXBlLAotCQllbnYtZW50cnktdmFsdWU/KT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLWVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi1qYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gZW50ZXJwcmlzZSBiZWFuLgotCi1Vc2VkIGluOiBlbnYtZW50cnkKLQotRXhhbXBsZToKLQotPGVudi1lbnRyeS1uYW1lPm1pbkFtb3VudDwvZW52LWVudHJ5LW5hbWU+Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnktbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG9mCi10aGUgZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MKLWNvZGUuCi0KLVRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXMgb2YgZW52LWVudHJ5LXR5cGU6Ci0KLQlqYXZhLmxhbmcuQm9vbGVhbgotCWphdmEubGFuZy5CeXRlCi0JamF2YS5sYW5nLkNoYXJhY3RlcgotCWphdmEubGFuZy5TdHJpbmcKLQlqYXZhLmxhbmcuU2hvcnQKLQlqYXZhLmxhbmcuSW50ZWdlcgotCWphdmEubGFuZy5Mb25nCi0JamF2YS5sYW5nLkZsb2F0Ci0JamF2YS5sYW5nLkRvdWJsZQotCi0KLVVzZWQgaW46IGVudi1lbnRyeQotCi1FeGFtcGxlOgotCi08ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5LXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGFuIGVudGVycHJpc2UgYmVhbidzCi1lbnZpcm9ubWVudCBlbnRyeS4gVGhlIHZhbHVlIG11c3QgYmUgYSBTdHJpbmcgdGhhdCBpcyB2YWxpZCBmb3IgdGhlCi1jb25zdHJ1Y3RvciBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgdGhhdCB0YWtlcyBhIHNpbmdsZSBTdHJpbmcKLXBhcmFtZXRlciwgb3IgZm9yIGphdmEubGFuZy5DaGFyYWN0ZXIsIGEgc2luZ2xlIGNoYXJhY3Rlci4KLQotVXNlZCBpbjogZW52LWVudHJ5Ci0KLUV4YW1wbGU6Ci0KLTxlbnYtZW50cnktdmFsdWU+MTAwLjAwPC9lbnYtZW50cnktdmFsdWU+Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnktdmFsdWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZXhjbHVkZSBsaXN0IGVsZW1lbnQgc3BlY2lmaWVzIG9uZSBvciBtb3JlIG1ldGhvZHMgd2hpY2ggdGhlCi1Bc3NlbWJsZXIgbWFya3MgdG8gYmUgdW5jYWxsYWJsZS4KLQotSWYgdGhlIG1ldGhvZCBwZXJtaXNzaW9uIHJlbGF0aW9uIGNvbnRhaW5zIG1ldGhvZHMgdGhhdCBhcmUgaW4gdGhlCi1leGNsdWRlIGxpc3QsIHRoZSBEZXBsb3llciBzaG91bGQgY29uc2lkZXIgdGhvc2UgbWV0aG9kcyB0byBiZQotdW5jYWxsYWJsZS4KLQotVXNlZCBpbjogYXNzZW1ibHktZGVzY3JpcHRvcgotLS0+Ci08IUVMRU1FTlQgZXhjbHVkZS1saXN0IChkZXNjcmlwdGlvbj8sIG1ldGhvZCspPgotCi08IS0tCi1UaGUgZmllbGQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGNvbnRhaW5lciBtYW5hZ2VkCi1maWVsZC4KLQotVGhlIG5hbWUgb2YgdGhlIGNtcC1maWVsZCBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoIGNtcC12ZXJzaW9uIDIueCBtdXN0Ci1iZWdpbiB3aXRoIGEgbG93ZXJjYXNlIGxldHRlci4gVGhpcyBmaWVsZCBpcyBhY2Nlc3NlZCBieSBtZXRob2RzIHdob3NlCi1uYW1lcyBjb25zaXN0cyBvZiB0aGUgbmFtZSBvZiB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5IGZpZWxkLW5hbWUgaW4KLXdoaWNoIHRoZSBmaXJzdCBsZXR0ZXIgaXMgdXBwZXJjYXNlZCwgcHJlZml4ZWQgYnkgImdldCIgb3IgInNldCIuCi0KLVRoZSBuYW1lIG9mIHRoZSBjbXAtZmllbGQgb2YgYW4gZW50aXR5IGJlYW4gd2l0aCBjbXAtdmVyc2lvbiAxLnggbXVzdAotZGVub3RlIGEgcHVibGljIGZpZWxkIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4gY2xhc3Mgb3Igb25lIG9mIGl0cwotc3VwZXJjbGFzc2VzLgotCi1Vc2VkIGluOiBjbXAtZmllbGQKLQotRXhhbXBsZToKLQotCi0JPGZpZWxkLW5hbWU+Zmlyc3ROYW1lPC9maWVsZC1OYW1lPgotCi0tLT4KLTwhRUxFTUVOVCBmaWVsZC1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGhvbWUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UKLWJlYW4ncyBob21lIGludGVyZmFjZS4KLQotVXNlZCBpbjogZWpiLXJlZiwgZW50aXR5LCBzZXNzaW9uCi0KLUV4YW1wbGU6Ci0KLTxob21lPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxIb21lPC9ob21lPgotLS0+Ci08IUVMRU1FTlQgaG9tZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi1jb250YWluaW5nIGEgbGFyZ2UgKDMyIHggMzIpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi1uYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIGVudGVycHJpc2UgYmVhbidzCi1lamItamFyIGZpbGUuCi0KLVRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCi1UaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQotVXNlZCBpbjogZWpiLWphciwgZW50aXR5LCBtZXNzYWdlLWRyaXZlbiwgc2Vzc2lvbgotCi1FeGFtcGxlOgotCi08bGFyZ2UtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24zMngzMi5qcGc8L2xhcmdlLWljb24+Ci0tLT4KLTwhRUxFTUVOVCBsYXJnZS1pY29uICgjUENEQVRBKT4KLQotPCEtLQotCi1UaGUgbG9jYWwgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlCi1lbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IGVqYi1sb2NhbC1yZWYsIGVudGl0eSwgc2Vzc2lvbgotCi0tLT4KLTwhRUxFTUVOVCBsb2NhbCAoI1BDREFUQSk+Ci0KLTwhLS0KLQotVGhlIGxvY2FsLWhvbWUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlCi1lbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBob21lIGludGVyZmFjZS4KLQotVXNlZCBpbjogZWpiLWxvY2FsLXJlZiwgZW50aXR5LCBzZXNzaW9uCi0tLT4KLTwhRUxFTUVOVCBsb2NhbC1ob21lICgjUENEQVRBKT4KLQotPCEtLQotCi1UaGUgbWVzc2FnZS1kcml2ZW4gZWxlbWVudCBkZWNsYXJlcyBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4uIFRoZQotZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0KLQktIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLQktIGFuIG9wdGlvbmFsIHNtYWxsIGljb24gZmlsZSBuYW1lCi0JLSBhbiBvcHRpb25hbCBsYXJnZSBpY29uIGZpbGUgbmFtZQotCS0gYSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4gaW4KLQkgIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLQktIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLQktIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzCi0JICBtZXNzYWdlIHNlbGVjdG9yCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUKLQkgIGFja25vd2xlZGdtZW50IG1vZGUgZm9yIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuCi0JICBpZiBiZWFuLW1hbmFnZWQgdHJhbnNhY3Rpb24gZGVtYXJjYXRpb24gaXMgdXNlZAotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlCi0JICBpbnRlbmRlZCBkZXN0aW5hdGlvbiB0eXBlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50IGVudHJpZXMKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXMKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwgRUpCIHJlZmVyZW5jZXMKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eQotCSAgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzIG1ldGhvZHMKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UgbWFuYWdlcgotCSAgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZXMKLQktIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UKLSAgICAgICAgICBlbnZpcm9ubWVudCByZWZlcmVuY2VzLgotCi1Vc2VkIGluOiBlbnRlcnByaXNlLWJlYW5zCi0tLT4KLTwhRUxFTUVOVCBtZXNzYWdlLWRyaXZlbiAoZGVzY3JpcHRpb24/LCBkaXNwbGF5LW5hbWU/LCBzbWFsbC1pY29uPywKLQkJbGFyZ2UtaWNvbj8sIGVqYi1uYW1lLCBlamItY2xhc3MsIHRyYW5zYWN0aW9uLXR5cGUsCi0JCW1lc3NhZ2Utc2VsZWN0b3I/LCBhY2tub3dsZWRnZS1tb2RlPywKLQkJbWVzc2FnZS1kcml2ZW4tZGVzdGluYXRpb24/LCBlbnYtZW50cnkqLCBlamItcmVmKiwKLQkJZWpiLWxvY2FsLXJlZiosIHNlY3VyaXR5LWlkZW50aXR5PywgcmVzb3VyY2UtcmVmKiwKLQkJcmVzb3VyY2UtZW52LXJlZiopPgotCi08IS0tCi1UaGUgbWVzc2FnZS1kcml2ZW4tZGVzdGluYXRpb24gZWxlbWVudCBwcm92aWRlcyBhZHZpY2UgdG8gdGhlIERlcGxveWVyCi1hcyB0byB3aGV0aGVyIGEgbWVzc2FnZS1kcml2ZW4gYmVhbiBpcyBpbnRlbmRlZCBmb3IgYSBRdWV1ZSBvciBhCi1Ub3BpYy4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOiB0aGUgdHlwZSBvZiB0aGUgbWVzc2FnZS1kcml2ZW4KLWJlYW4ncyBpbnRlbmRlZCBkZXN0aW5hdGlvbiBhbmQgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2Ygd2hldGhlciBhCi1kdXJhYmxlIG9yIG5vbi1kdXJhYmxlIHN1YnNjcmlwdGlvbiBzaG91bGQgYmUgdXNlZCBpZiB0aGUKLWRlc3RpbmF0aW9uLXR5cGUgaXMgamF2YXguam1zLlRvcGljLgotCi1Vc2VkIGluOiBtZXNzYWdlLWRyaXZlbgotLS0+Ci08IUVMRU1FTlQgbWVzc2FnZS1kcml2ZW4tZGVzdGluYXRpb24gKGRlc3RpbmF0aW9uLXR5cGUsCi1zdWJzY3JpcHRpb24tZHVyYWJpbGl0eT8pPgotCi08IS0tCi1UaGUgbWVzc2FnZS1zZWxlY3RvciBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgSk1TIG1lc3NhZ2UKLXNlbGVjdG9yIHRvIGJlIHVzZWQgaW4gZGV0ZXJtaW5pbmcgd2hpY2ggbWVzc2FnZXMgYSBtZXNzYWdlLWRyaXZlbgotYmVhbiBpcyB0byByZWNlaXZlLgotCi1FeGFtcGxlOgotPG1lc3NhZ2Utc2VsZWN0b3I+Sk1TVHlwZSA9IGBjYXInIEFORCBjb2xvciA9IGBibHVlJyBBTkQgd2VpZ2h0ICZndDsgMjUwMAotPC9tZXNzYWdlLXNlbGVjdG9yPgotCi1Vc2VkIGluOiBtZXNzYWdlLWRyaXZlbgotLS0+Ci08IUVMRU1FTlQgbWVzc2FnZS1zZWxlY3RvciAoI1BDREFUQSk+Ci0KLTwhLS0KLQotVGhlIG1ldGhvZCBlbGVtZW50IGlzIHVzZWQgdG8gZGVub3RlIGEgbWV0aG9kIG9mIGFuIGVudGVycHJpc2UKLWJlYW4ncyBob21lIG9yIGNvbXBvbmVudCBpbnRlcmZhY2UsIG9yLCBpbiB0aGUgY2FzZSBvZiBhIG1lc3NhZ2UtZHJpdmVuCi1iZWFuLCB0aGUgYmVhbidzIG9uTWVzc2FnZSBtZXRob2QsIG9yIGEgc2V0IG9mIG1ldGhvZHMuIFRoZSBlamItbmFtZQotZWxlbWVudCBtdXN0IGJlIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFucyBkZWNsYXJlZCBpbgotdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcjsgdGhlIG9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgYWxsb3dzIHRvCi1kaXN0aW5ndWlzaCBiZXR3ZWVuIGEgbWV0aG9kIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIHRoYXQgaXMgbXVsdGlwbHkKLWRlZmluZWQgYWNyb3NzIGluIGJvdGggdGhlIGhvbWUgYW5kIGNvbXBvbmVudCBpbnRlcmZhY2VzOyB0aGUKLW1ldGhvZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtZXRob2QgbmFtZTsgYW5kIHRoZSBvcHRpb25hbAotbWV0aG9kLXBhcmFtcyBlbGVtZW50cyBpZGVudGlmeSBhIHNpbmdsZSBtZXRob2QgYW1vbmcgbXVsdGlwbGUgbWV0aG9kcwotd2l0aCBhbiBvdmVybG9hZGVkIG1ldGhvZCBuYW1lLgotCi1UaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgc3R5bGVzIG9mIHRoZSBtZXRob2QgZWxlbWVudCBzeW50YXg6Ci0KLTEuCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+Ci08L21ldGhvZD4KLQotICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUgc3BlY2lmaWVkCi0gICBlbnRlcnByaXNlIGJlYW4ncyBob21lIGFuZCBjb21wb25lbnQgaW50ZXJmYWNlcy4KLQotMi4KLTxtZXRob2Q+Ci0gICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtbmFtZT5NRVRIT0Q8L21ldGhvZC1uYW1lPgotPC9tZXRob2Q+PgotCi0gICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gdGhlIHNwZWNpZmllZCBtZXRob2Qgb2YgdGhlCi0gICBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWV0aG9kcyB3aXRoCi0gICB0aGUgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoZSBlbGVtZW50IG9mIHRoaXMgc3R5bGUgcmVmZXJzIHRvCi0gICBhbGwgdGhlIG1ldGhvZHMgd2l0aCB0aGUgb3ZlcmxvYWRlZCBuYW1lLgotCi0KLTMuCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLSAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5QQVJBTS0xPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+UEFSQU0tMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAuLi4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5QQVJBTS1uPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPG1ldGhvZD4KLQotCi0gICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gYSBzaW5nbGUgbWV0aG9kIHdpdGhpbiBhIHNldCBvZgotICAgbWV0aG9kcyB3aXRoIGFuIG92ZXJsb2FkZWQgbmFtZS4gUEFSQU0tMSB0aHJvdWdoIFBBUkFNLW4gYXJlIHRoZQotICAgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZXMgb2YgdGhlIG1ldGhvZCdzIGlucHV0IHBhcmFtZXRlcnMgKGlmCi0gICB0aGUgbWV0aG9kIGhhcyBubyBpbnB1dCBhcmd1bWVudHMsIHRoZSBtZXRob2QtcGFyYW1zIGVsZW1lbnQKLSAgIGNvbnRhaW5zIG5vIG1ldGhvZC1wYXJhbSBlbGVtZW50cykuIEFycmF5cyBhcmUgc3BlY2lmaWVkIGJ5IHRoZQotICAgYXJyYXkgZWxlbWVudCdzIHR5cGUsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBhaXIgb2Ygc3F1YXJlCi0gICBicmFja2V0cyAoZS5nLiBpbnRbXVtdKS4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIG1ldGhvZHMgd2l0aCB0aGUKLSAgIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGlzIHN0eWxlIHJlZmVycyB0byBhbGwgb2YgdGhlIG92ZXJsb2FkZWQKLSAgIG1ldGhvZHMuCi0KLQotVXNlZCBpbjogY29udGFpbmVyLXRyYW5zYWN0aW9uLCBleGNsdWRlLWxpc3QsIG1ldGhvZC1wZXJtaXNzaW9uCi0KLUV4YW1wbGVzOgotCi1TdHlsZSAxOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlIG1ldGhvZHMgb2YKLXRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgYW5kIGNvbXBvbmVudCBpbnRlcmZhY2VzOgotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtbmFtZT4qPC9tZXRob2QtbmFtZT4KLTwvbWV0aG9kPgotCi1TdHlsZSAyOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlIGNyZWF0ZQotbWV0aG9kcyBvZiB0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGludGVyZmFjZShzKS4KLQotPG1ldGhvZD4KLSAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLTwvbWV0aG9kPgotCi0KLVN0eWxlIDM6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIHRoZQotY3JlYXRlKFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBMYXN0TmFtZSkgbWV0aG9kIG9mIHRoZQotRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGludGVyZmFjZShzKS4KLQotPG1ldGhvZD4KLSAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLSAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotICAgIDwvbWV0aG9kLXBhcmFtcz4KLTwvbWV0aG9kPgotCi0KLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBhIFN0eWxlIDMgZWxlbWVudCB3aXRoCi1tb3JlIGNvbXBsZXggcGFyYW1ldGVyIHR5cGVzLiBUaGUgbWV0aG9kCi1mb29iYXIoY2hhciBzLCBpbnQgaSwgaW50W10gaWFyLCBteXBhY2thZ2UuTXlDbGFzcyBteWNsLAotbXlwYWNrYWdlLk15Q2xhc3NbXVtdIG15Y2xhYXIpIHdvdWxkIGJlIHNwZWNpZmllZCBhczoKLQotPG1ldGhvZD4KLSAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLW5hbWU+Zm9vYmFyPC9tZXRob2QtbmFtZT4KLSAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5jaGFyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+aW50PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+aW50W108L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5teXBhY2thZ2UuTXlDbGFzczwvbWV0aG9kLXBhcmFtPgotICAgICAgICA8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzW11bXTwvbWV0aG9kLXBhcmFtPgotICAgIDwvbWV0aG9kLXBhcmFtcz4KLTwvbWV0aG9kPgotCi0KLVRoZSBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGNhbiBiZSB1c2VkIHdoZW4gaXQgYmVjb21lcyBuZWNlc3NhcnkKLXRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhIG1ldGhvZCB0aGF0IGlzIG11bHRpcGx5IGRlZmluZWQgYWNyb3NzIHRoZQotZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBhbmQgY29tcG9uZW50IGludGVyZmFjZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZAotc2lnbmF0dXJlLgotCi0KLUZvciBleGFtcGxlLCB0aGUgbWV0aG9kIGVsZW1lbnQKLQotPG1ldGhvZD4KLSAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLSAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotICAgIDwvbWV0aG9kLXBhcmFtcz4KLTwvbWV0aG9kPgotCi0KLWNhbiBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykgbWV0aG9kIGRlZmluZWQKLWluIHRoZSByZW1vdGUgaW50ZXJmYWNlIGZyb20gdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykgbWV0aG9kIGRlZmluZWQKLWluIHRoZSByZW1vdGUgaG9tZSBpbnRlcmZhY2UsIHdoaWNoIHdvdWxkIGJlIGRlZmluZWQgYXMKLQotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLSAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotICAgIDwvbWV0aG9kLXBhcmFtcz4KLTwvbWV0aG9kPgotCi1hbmQgdGhlIGNyZWF0ZSBtZXRob2QgdGhhdCBpcyBkZWZpbmVkIGluIHRoZSBsb2NhbCBob21lIGludGVyZmFjZQotd2hpY2ggd291bGQgYmUgZGVmaW5lZCBhcwotCi08bWV0aG9kPgotICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0gICAgPC9tZXRob2QtcGFyYW1zPgotPC9tZXRob2Q+Ci0KLQotVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgY2FuIGJlIHVzZWQgd2l0aCBhbGwgdGhyZWUgU3R5bGVzIG9mIHRoZQotbWV0aG9kIGVsZW1lbnQgdXNhZ2UuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50Ci1leGFtcGxlIGNvdWxkIGJlIHVzZWQgdG8gcmVmZXIgdG8gYWxsIHRoZSBtZXRob2RzIG9mIHRoZQotRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyByZW1vdGUgaG9tZSBpbnRlcmZhY2UuCi0KLQotPG1ldGhvZD4KLSAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLSAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPgotPC9tZXRob2Q+Ci0KLS0tPgotPCFFTEVNRU5UIG1ldGhvZCAoZGVzY3JpcHRpb24/LCBlamItbmFtZSwgbWV0aG9kLWludGY/LCBtZXRob2QtbmFtZSwKLW1ldGhvZC1wYXJhbXM/KT4KLQotPCEtLQotCi1UaGUgbWV0aG9kLWludGYgZWxlbWVudCBhbGxvd3MgYSBtZXRob2QgZWxlbWVudCB0byBkaWZmZXJlbnRpYXRlCi1iZXR3ZWVuIHRoZSBtZXRob2RzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgc2lnbmF0dXJlIHRoYXQgYXJlIG11bHRpcGx5Ci1kZWZpbmVkIGFjcm9zcyB0aGUgY29tcG9uZW50IGFuZCBob21lIGludGVyZmFjZXMgKGUuZywgaW4gYm90aCBhbgotZW50ZXJwcmlzZSBiZWFuJ3MgcmVtb3RlIGFuZCBsb2NhbCBpbnRlcmZhY2VzOyBpbiBib3RoIGFuIGVudGVycHJpc2UgYmVhbidzCi1ob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcywgZXRjLikKLQotVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotCTxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLQk8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLQk8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLQk8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotCi1Vc2VkIGluOiBtZXRob2QKLS0tPgotPCFFTEVNRU5UIG1ldGhvZC1pbnRmICgjUENEQVRBKT4KLQotPCEtLQotVGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbiBtZXRob2QKLW9yIHRoZSBhc3RlcmlzayAoKikgY2hhcmFjdGVyLiBUaGUgYXN0ZXJpc2sgaXMgdXNlZCB3aGVuIHRoZSBlbGVtZW50Ci1kZW5vdGVzIGFsbCB0aGUgbWV0aG9kcyBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncyBjb21wb25lbnQgYW5kIGhvbWUKLWludGVyZmFjZXMuCi0KLVVzZWQgaW46IG1ldGhvZCwgcXVlcnktbWV0aG9kCi0tLT4KLTwhRUxFTUVOVCBtZXRob2QtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBtZXRob2QtcGFyYW0gZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBuYW1lCi1vZiBhIG1ldGhvZCBwYXJhbWV0ZXIuCi0KLVVzZWQgaW46IG1ldGhvZC1wYXJhbXMKLS0tPgotPCFFTEVNRU5UIG1ldGhvZC1wYXJhbSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBtZXRob2QtcGFyYW1zIGVsZW1lbnQgY29udGFpbnMgYSBsaXN0IG9mIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YQotdHlwZSBuYW1lcyBvZiB0aGUgbWV0aG9kIHBhcmFtZXRlcnMuCi0KLVVzZWQgaW46IG1ldGhvZCwgcXVlcnktbWV0aG9kCi0tLT4KLTwhRUxFTUVOVCBtZXRob2QtcGFyYW1zIChtZXRob2QtcGFyYW0qKT4KLQotPCEtLQotCi1UaGUgbWV0aG9kLXBlcm1pc3Npb24gZWxlbWVudCBzcGVjaWZpZXMgdGhhdCBvbmUgb3IgbW9yZSBzZWN1cml0eQotcm9sZXMgYXJlIGFsbG93ZWQgdG8gaW52b2tlIG9uZSBvciBtb3JlIGVudGVycHJpc2UgYmVhbiBtZXRob2RzLiBUaGUKLW1ldGhvZC1wZXJtaXNzaW9uIGVsZW1lbnQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEgbGlzdAotb2Ygc2VjdXJpdHkgcm9sZSBuYW1lcyBvciBhbiBpbmRpY2F0b3IgdG8gc3RhdGUgdGhhdCB0aGUgbWV0aG9kIGlzCi11bmNoZWNrZWQgZm9yIGF1dGhvcml6YXRpb24sIGFuZCBhIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLgotCi1UaGUgc2VjdXJpdHkgcm9sZXMgdXNlZCBpbiB0aGUgbWV0aG9kLXBlcm1pc3Npb24gZWxlbWVudCBtdXN0IGJlCi1kZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IsCi1hbmQgdGhlIG1ldGhvZHMgbXVzdCBiZSBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgYmVhbidzCi1jb21wb25lbnQgYW5kL29yIGhvbWUgaW50ZXJmYWNlcy4KLQotCi1Vc2VkIGluOiBhc3NlbWJseS1kZXNjcmlwdG9yCi0tLT4KLTwhRUxFTUVOVCBtZXRob2QtcGVybWlzc2lvbiAoZGVzY3JpcHRpb24/LCAocm9sZS1uYW1lK3x1bmNoZWNrZWQpLCBtZXRob2QrKT4KLQotPCEtLQotVGhlIG11bHRpcGxpY2l0eSBlbGVtZW50IGRlc2NyaWJlcyB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSByb2xlIHRoYXQKLXBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uLgotCi1UaGUgbXVsdGlwbGljaXR5IGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQk8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotCTxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotCi1Vc2VkIGluOiBlamItcmVsYXRpb25zaGlwLXJvbGUKLS0tPgotPCFFTEVNRU5UIG11bHRpcGxpY2l0eSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBwZXJzaXN0ZW5jZS10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIGFuIGVudGl0eSBiZWFuJ3MgcGVyc2lzdGVuY2UKLW1hbmFnZW1lbnQgdHlwZS4KLQotVGhlIHBlcnNpc3RlbmNlLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCTxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0JPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotCi1Vc2VkIGluOiBlbnRpdHkKLS0tPgotPCFFTEVNRU5UIHBlcnNpc3RlbmNlLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcHJpbS1rZXktY2xhc3MgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYW4KLWVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MuCi0KLUlmIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBpcyBkZWZlcnJlZCB0byBkZXBsb3ltZW50Ci10aW1lLCB0aGUgcHJpbS1rZXktY2xhc3MgZWxlbWVudCBzaG91bGQgc3BlY2lmeSBqYXZhLmxhbmcuT2JqZWN0LgotCi1Vc2VkIGluOiBlbnRpdHkKLQotRXhhbXBsZXM6Ci0KLQk8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvcHJpbS1rZXktY2xhc3M+Ci0KLQk8cHJpbS1rZXktY2xhc3M+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlSUQ8L3ByaW0ta2V5LWNsYXNzPgotCi0JPHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5PYmplY3Q8L3ByaW0ta2V5LWNsYXNzPgotCi0tLT4KLTwhRUxFTUVOVCBwcmltLWtleS1jbGFzcyAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBwcmltYXJ5Ci1rZXkgZmllbGQgZm9yIGFuIGVudGl0eSB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLgotCi1UaGUgcHJpbWtleS1maWVsZCBtdXN0IGJlIG9uZSBvZiB0aGUgZmllbGRzIGRlY2xhcmVkIGluIHRoZSBjbXAtZmllbGQKLWVsZW1lbnQsIGFuZCB0aGUgdHlwZSBvZiB0aGUgZmllbGQgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgcHJpbWFyeSBrZXkKLXR5cGUuCi0KLVRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgbm90IHVzZWQgaWYgdGhlIHByaW1hcnkga2V5IG1hcHMgdG8KLW11bHRpcGxlIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcyAoaS5lLiB0aGUga2V5IGlzIGEgY29tcG91bmQga2V5KS4gSW4KLXRoaXMgY2FzZSwgdGhlIGZpZWxkcyBvZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBwdWJsaWMsIGFuZAotdGhlaXIgbmFtZXMgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBmaWVsZCBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4KLWNsYXNzIHRoYXQgY29tcHJpc2UgdGhlIGtleS4KLQotVXNlZCBpbjogZW50aXR5Ci0KLUV4YW1wbGU6Ci0KLQk8cHJpbWtleS1maWVsZD5FbXBsb3llZUlkPC9wcmlta2V5LWZpZWxkPgotCi0tLT4KLTwhRUxFTUVOVCBwcmlta2V5LWZpZWxkICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHF1ZXJ5IGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IGEgZmluZGVyIG9yIHNlbGVjdCBxdWVyeS4gSXQKLWNvbnRhaW5zCi0JLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgcXVlcnkKLQktIHRoZSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBmaW5kZXIgb3Igc2VsZWN0Ci0JICBtZXRob2QgaXQgaXMgdXNlZCBieQotICAgICAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIHJlc3VsdCB0eXBlIG1hcHBpbmcsIGlmCi0gICAgICAgICAgdGhlIHF1ZXJ5IGlzIGZvciBhIHNlbGVjdCBtZXRob2QgYW5kIGVudGl0eSBvYmplY3RzIGFyZQotICAgICAgICAgIHJldHVybmVkLgotICAgIAktIHRoZSBFSkIgUUwgcXVlcnkgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgcXVlcnkuCi0KLVF1ZXJpZXMgdGhhdCBhcmUgZXhwcmVzc2libGUgaW4gRUpCIFFMIG11c3QgdXNlIHRoZSBlamItcWwgZWxlbWVudCB0bwotc3BlY2lmeSB0aGUgcXVlcnkuIElmIGEgcXVlcnkgaXMgbm90IGV4cHJlc3NpYmxlIGluIEVKQiBRTCwgdGhlCi1kZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBiZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzZW1hbnRpY3Mgb2YgdGhlCi1xdWVyeSBhbmQgdGhlIGVqYi1xbCBlbGVtZW50IHNob3VsZCBiZSBlbXB0eS4KLQotVGhlIHJlc3VsdC10eXBlLW1hcHBpbmcgaXMgYW4gb3B0aW9uYWwgZWxlbWVudC4gSXQgY2FuIG9ubHkgYmUgcHJlc2VudAotaWYgdGhlIHF1ZXJ5LW1ldGhvZCBzcGVjaWZpZXMgYSBzZWxlY3QgbWV0aG9kIHRoYXQgcmV0dXJucyBlbnRpdHkKLW9iamVjdHMuICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHJlc3VsdC10eXBlLW1hcHBpbmcgZWxlbWVudCBpcwotIkxvY2FsIi4KLQotCi1Vc2VkIGluOiBlbnRpdHkKLS0tPgotPCFFTEVNRU5UIHF1ZXJ5IChkZXNjcmlwdGlvbj8sIHF1ZXJ5LW1ldGhvZCwgcmVzdWx0LXR5cGUtbWFwcGluZz8sIGVqYi1xbCk+Ci0KLTwhLS0KLVRoZSBxdWVyeS1tZXRob2QgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIG1ldGhvZCBmb3IgYSBmaW5kZXIgb3IKLXNlbGVjdCBxdWVyeS4KLQotVGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgZmluZGVyIG9yIHNlbGVjdAotbWV0aG9kIGluIHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzLgotCi1FYWNoIG1ldGhvZC1wYXJhbSBtdXN0IGJlIGRlZmluZWQgZm9yIGEgcXVlcnktbWV0aG9kIHVzaW5nIHRoZQotbWV0aG9kLXBhcmFtcyBlbGVtZW50LgotCi1Vc2VkIGluOiBxdWVyeQotCi1FeGFtcGxlOgotCi08cXVlcnk+Ci0gICAgPGRlc2NyaXB0aW9uPk1ldGhvZCBmaW5kcyBsYXJnZSBvcmRlcnM8L2Rlc2NyaXB0aW9uPgotICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgIDxtZXRob2QtbmFtZT5maW5kTGFyZ2VPcmRlcnM8L21ldGhvZC1uYW1lPgotICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgPGVqYi1xbD5TRUxFQ1QgT0JKRUNUKG8pIEZST00gT3JkZXIgbyBXSEVSRSBvLmFtb3VudCAmZ3Q7IDEwMDA8L2VqYi1xbD4KLTwvcXVlcnk+Ci0KLS0tPgotPCFFTEVNRU5UIHF1ZXJ5LW1ldGhvZCAobWV0aG9kLW5hbWUsIG1ldGhvZC1wYXJhbXMpPgotCi08IS0tCi1UaGUgcmVlbnRyYW50IGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgYW4gZW50aXR5IGJlYW4gaXMgcmVlbnRyYW50IG9yCi1ub3QuCi0KLVRoZSByZWVudHJhbnQgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCTxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotCTxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLQotVXNlZCBpbjogZW50aXR5Ci0tLT4KLTwhRUxFTUVOVCByZWVudHJhbnQgKCNQQ0RBVEEpPgotCi08IS0tCi0KLVRoZSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCBkZXNpZ25hdGVzIHRoZSBzb3VyY2Ugb2YgYSByb2xlCi10aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uc2hpcC4gQSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UKLWVsZW1lbnQgdW5pcXVlbHkgaWRlbnRpZmllcyBhbiBlbnRpdHkgYmVhbi4KLQotVXNlZCBpbjogZWpiLXJlbGF0aW9uc2hpcC1yb2xlCi0tLT4KLTwhRUxFTUVOVCByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgKGRlc2NyaXB0aW9uPywgZWpiLW5hbWUpPgotCi08IS0tCi1UaGUgcmVsYXRpb25zaGlwcyBlbGVtZW50IGRlc2NyaWJlcyB0aGUgcmVsYXRpb25zaGlwcyBpbiB3aGljaAotZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UgcGFydGljaXBhdGUuIFRoZQotcmVsYXRpb25zaGlwcyBlbGVtZW50IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uOyBhbmQgYSBsaXN0IG9mCi1lamItcmVsYXRpb24gZWxlbWVudHMsIHdoaWNoIHNwZWNpZnkgdGhlIGNvbnRhaW5lciBtYW5hZ2VkCi1yZWxhdGlvbnNoaXBzLgotCi0KLVVzZWQgaW46IGVqYi1qYXIKLS0tPgotPCFFTEVNRU5UIHJlbGF0aW9uc2hpcHMgKGRlc2NyaXB0aW9uPywgZWpiLXJlbGF0aW9uKyk+Ci0KLTwhLS0KLVRoZSByZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UKLWJlYW4ncyByZW1vdGUgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiBlamItcmVmLCBlbnRpdHksIHNlc3Npb24KLQotRXhhbXBsZToKLQotPHJlbW90ZT5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlPC9yZW1vdGU+Ci0tLT4KLTwhRUxFTUVOVCByZW1vdGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLWF1dGggZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgZW50ZXJwcmlzZSBiZWFuIGNvZGUgc2lnbnMKLW9uIHByb2dyYW1tYXRpY2FsbHkgdG8gdGhlIHJlc291cmNlIG1hbmFnZXIsIG9yIHdoZXRoZXIgdGhlIENvbnRhaW5lcgotd2lsbCBzaWduIG9uIHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyIG9uIGJlaGFsZiBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuLiBJbiB0aGUKLWxhdHRlciBjYXNlLCB0aGUgQ29udGFpbmVyIHVzZXMgaW5mb3JtYXRpb24gdGhhdCBpcyBzdXBwbGllZCBieSB0aGUKLURlcGxveWVyLgotCi1UaGUgdmFsdWUgb2YgdGhpcyBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLQk8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLQotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtYXV0aCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSByZXNvdXJjZSBtYW5hZ2VyCi1jb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi1qYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gZW50ZXJwcmlzZSBiZWFuLgotCi1Vc2VkIGluOiByZXNvdXJjZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJlcy1yZWYtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtc2hhcmluZy1zY29wZSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGNvbm5lY3Rpb25zIG9idGFpbmVkCi10aHJvdWdoIHRoZSBnaXZlbiByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgY2FuIGJlCi1zaGFyZWQuIFRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQsIGlmIHNwZWNpZmllZCwgbXVzdCBiZSBvbmUgb2YgdGhlCi10d28gZm9sbG93aW5nOgotCi0JPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0JPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLQotVGhlIGRlZmF1bHQgdmFsdWUgaXMgU2hhcmVhYmxlLgotCi1Vc2VkIGluOiByZXNvdXJjZS1yZWYKLS0tPgotPCFFTEVNRU5UIHJlcy1zaGFyaW5nLXNjb3BlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhIHNvdXJjZS4gVGhlIHR5cGUKLWlzIHNwZWNpZmllZCBieSB0aGUgZnVsbHkgcXVhbGlmaWVkIEphdmEgbGFuZ3VhZ2UgY2xhc3Mgb3IgaW50ZXJmYWNlCi1leHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGF0YSBzb3VyY2UuCi0KLVVzZWQgaW46IHJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzb3VyY2UtZW52LXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLXJlZmVyZW5jZSB0byBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlCi1pbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgZW52aXJvbm1lbnQuICBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbAotZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgbmFtZSwgYW5kIGFuCi1pbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgdHlwZSBleHBlY3RlZCBieQotdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlLgotCi1Vc2VkIGluOiBlbnRpdHksIG1lc3NhZ2UtZHJpdmVuLCBzZXNzaW9uCi0KLUV4YW1wbGU6Ci0KLTxyZXNvdXJjZS1lbnYtcmVmPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+am1zL1N0b2NrUXVldWU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmF4Lmptcy5RdWV1ZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotPC9yZXNvdXJjZS1lbnYtcmVmPgotLS0+Ci08IUVMRU1FTlQgcmVzb3VyY2UtZW52LXJlZiAoZGVzY3JpcHRpb24/LCByZXNvdXJjZS1lbnYtcmVmLW5hbWUsCi0JCXJlc291cmNlLWVudi1yZWYtdHlwZSk+Ci0KLTwhLS0KLVRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSByZXNvdXJjZQotZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotdGhlIGVudGVycHJpc2UgYmVhbiBjb2RlLiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi1qYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbiBlbnRlcnByaXNlIGJlYW4uCi0KLVVzZWQgaW46IHJlc291cmNlLWVudi1yZWYKLS0tPgotPCFFTEVNRU5UIHJlc291cmNlLWVudi1yZWYtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXNvdXJjZS1lbnYtcmVmLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgYSByZXNvdXJjZQotZW52aXJvbm1lbnQgcmVmZXJlbmNlLiAgSXQgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YQotbGFuZ3VhZ2UgY2xhc3Mgb3IgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiByZXNvdXJjZS1lbnYtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXNvdXJjZS1lbnYtcmVmLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzb3VyY2UtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncwotcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHJlc291cmNlLiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbAotZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwKLXRoZSBpbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSB0eXBlCi1leHBlY3RlZCBieSB0aGUgZW50ZXJwcmlzZSBiZWFuIGNvZGUsIHRoZSB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uCi0oQXBwbGljYXRpb24gb3IgQ29udGFpbmVyKSwgYW5kIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlCi1zaGFyZWFiaWxpdHkgb2YgY29ubmVjdGlvbnMgb2J0YWluZWQgZnJvbSB0aGUgcmVzb3VyY2UgKFNoYXJlYWJsZSBvcgotVW5zaGFyZWFibGUpLgotCi1Vc2VkIGluOiBlbnRpdHksIG1lc3NhZ2UtZHJpdmVuLCBzZXNzaW9uCi0KLUV4YW1wbGU6Ci0KLSAgICA8cmVzb3VyY2UtcmVmPgotCTxyZXMtcmVmLW5hbWU+amRiYy9FbXBsb3llZUFwcERCPC9yZXMtcmVmLW5hbWU+Ci0JPHJlcy10eXBlPmphdmF4LnNxbC5EYXRhU291cmNlPC9yZXMtdHlwZT4KLQk8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLQk8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLS0tPgotPCFFTEVNRU5UIHJlc291cmNlLXJlZiAoZGVzY3JpcHRpb24/LCByZXMtcmVmLW5hbWUsIHJlcy10eXBlLCByZXMtYXV0aCwKLQkJcmVzLXNoYXJpbmctc2NvcGU/KT4KLQotPCEtLQotCi1UaGUgcmVzdWx0LXR5cGUtbWFwcGluZyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIHF1ZXJ5IGVsZW1lbnQgdG8gc3BlY2lmeQotd2hldGhlciBhbiBhYnN0cmFjdCBzY2hlbWEgdHlwZSByZXR1cm5lZCBieSBhIHF1ZXJ5IGZvciBhIHNlbGVjdCBtZXRob2QKLWlzIHRvIGJlIG1hcHBlZCB0byBhbiBFSkJMb2NhbE9iamVjdCBvciBFSkJPYmplY3QgdHlwZS4KLQotVGhlIHJlc3VsdC10eXBlLW1hcHBpbmcgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPkxvY2FsPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5SZW1vdGU8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0KLVVzZWQgaW46IHF1ZXJ5Ci0tLT4KLTwhRUxFTUVOVCByZXN1bHQtdHlwZS1tYXBwaW5nICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJvbGUtbGluayBlbGVtZW50IGlzIGEgcmVmZXJlbmNlIHRvIGEgZGVmaW5lZCBzZWN1cml0eSByb2xlLiBUaGUKLXJvbGUtbGluayBlbGVtZW50IG11c3QgY29udGFpbiB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5IHJvbGVzCi1kZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzLgotCi1Vc2VkIGluOiBzZWN1cml0eS1yb2xlLXJlZgotLS0+Ci08IUVMRU1FTlQgcm9sZS1saW5rICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJvbGUtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4KLQotVGhlIG5hbWUgbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsIHJ1bGVzIGZvciBhbiBOTVRPS0VOLgotCi1Vc2VkIGluOiBtZXRob2QtcGVybWlzc2lvbiwgcnVuLWFzLCBzZWN1cml0eS1yb2xlLCBzZWN1cml0eS1yb2xlLXJlZgotLS0+Ci08IUVMRU1FTlQgcm9sZS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJ1bi1hcyBlbGVtZW50IHNwZWNpZmllcyB0aGUgcnVuLWFzIGlkZW50aXR5IHRvIGJlIHVzZWQgZm9yIHRoZQotZXhlY3V0aW9uIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4uIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQKLXRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4KLQotVXNlZCBpbjogc2VjdXJpdHktaWRlbnRpdHkKLS0tPgotPCFFTEVNRU5UIHJ1bi1hcyAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUpPgotCi08IS0tCi0KLVRoZSBzZWN1cml0eS1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIncwotc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWV0aG9kcyBvZgotdGhlIGVudGVycHJpc2UgYmVhbiBvciB3aGV0aGVyIGEgc3BlY2lmaWMgcnVuLWFzIGlkZW50aXR5IGlzIHRvIGJlCi11c2VkLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBhbmQgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZQotc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZC4KLQotVXNlZCBpbjogZW50aXR5LCBtZXNzYWdlLWRyaXZlbiwgc2Vzc2lvbgotLS0+Ci08IUVMRU1FTlQgc2VjdXJpdHktaWRlbnRpdHkgKGRlc2NyaXB0aW9uPywgKHVzZS1jYWxsZXItaWRlbnRpdHl8cnVuLWFzKSk+Ci0KLTwhLS0KLVRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYSBzZWN1cml0eQotcm9sZS4gVGhlIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlCi1zZWN1cml0eSByb2xlLCBhbmQgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZS4KLQotVXNlZCBpbjogYXNzZW1ibHktZGVzY3JpcHRvcgotCi1FeGFtcGxlOgotCi0gICAgPHNlY3VyaXR5LXJvbGU+Ci0JPGRlc2NyaXB0aW9uPgotCSAgICBUaGlzIHJvbGUgaW5jbHVkZXMgYWxsIGVtcGxveWVlcyB3aG8gYXJlIGF1dGhvcml6ZWQKLQkgICAgdG8gYWNjZXNzIHRoZSBlbXBsb3llZSBzZXJ2aWNlIGFwcGxpY2F0aW9uLgotCTwvZGVzY3JpcHRpb24+Ci0JPHJvbGUtbmFtZT5lbXBsb3llZTwvcm9sZS1uYW1lPgotICAgIDwvc2VjdXJpdHktcm9sZT4KLS0tPgotPCFFTEVNRU5UIHNlY3VyaXR5LXJvbGUgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lKT4KLQotPCEtLQotVGhlIHNlY3VyaXR5LXJvbGUtcmVmIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgc2VjdXJpdHkKLXJvbGUgcmVmZXJlbmNlIGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBjb2RlLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMKLW9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUsCi1hbmQgYW4gb3B0aW9uYWwgbGluayB0byBhIHNlY3VyaXR5IHJvbGUuIElmIHRoZSBzZWN1cml0eSByb2xlIGlzIG5vdAotc3BlY2lmaWVkLCB0aGUgRGVwbG95ZXIgbXVzdCBjaG9vc2UgYW4gYXBwcm9wcmlhdGUgc2VjdXJpdHkgcm9sZS4KLQotVGhlIHZhbHVlIG9mIHRoZSByb2xlLW5hbWUgZWxlbWVudCBtdXN0IGJlIHRoZSBTdHJpbmcgdXNlZCBhcyB0aGUKLXBhcmFtZXRlciB0byB0aGUgRUpCQ29udGV4dC5pc0NhbGxlckluUm9sZShTdHJpbmcgcm9sZU5hbWUpIG1ldGhvZAotb3IgdGhlIEh0dHBTZXJ2bGV0UmVxdWVzdC5pc1VzZXJJblJvbGUoU3RyaW5nIHJvbGUpIG1ldGhvZC4KLQotVXNlZCBpbjogZW50aXR5LCBzZXNzaW9uCi0KLS0tPgotPCFFTEVNRU5UIHNlY3VyaXR5LXJvbGUtcmVmIChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSwgcm9sZS1saW5rPyk+Ci0KLTwhLS0KLVRoZSBzZXNzaW9uIGVsZW1lbnQgZGVjbGFyZXMgYW4gc2Vzc2lvbiBiZWFuLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMKLW9mOgotCS0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQktIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotCS0gYW4gb3B0aW9uYWwgc21hbGwgaWNvbiBmaWxlIG5hbWUKLQktIGFuIG9wdGlvbmFsIGxhcmdlIGljb24gZmlsZSBuYW1lCi0JLSBhIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbgotCSAgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRpb24KLQktIHRoZSBuYW1lcyBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIGhvbWUgYW5kCi0JICByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55Ci0JLSB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIGxvY2FsIGhvbWUgYW5kCi0JICBsb2NhbCBpbnRlcmZhY2VzLCBpZiBhbnkKLQktIHRoZSBzZXNzaW9uIGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcwotCS0gdGhlIHNlc3Npb24gYmVhbidzIHN0YXRlIG1hbmFnZW1lbnQgdHlwZQotCS0gdGhlIHNlc3Npb24gYmVhbidzIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZQotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudCBlbnRyaWVzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQiByZWZlcmVuY2VzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsIEVKQiByZWZlcmVuY2VzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZSByZWZlcmVuY2VzCi0JLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUKLSAgICAgICAgICB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSBtYW5hZ2VyCi0JICBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlcwotCS0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSBlbnZpcm9ubWVudAotCSAgcmVmZXJlbmNlcy4KLQotVGhlIGVsZW1lbnRzIHRoYXQgYXJlIG9wdGlvbmFsIGFyZSAib3B0aW9uYWwiIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkKLWFyZSBvbWl0dGVkIHdoZW4gaWYgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuCi0KLUVpdGhlciBib3RoIHRoZSBsb2NhbC1ob21lIGFuZCB0aGUgbG9jYWwgZWxlbWVudHMgb3IgYm90aCB0aGUKLWhvbWUgYW5kIHRoZSByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIHRoZSBzZXNzaW9uIGJlYW4uCi0KLVVzZWQgaW46IGVudGVycHJpc2UtYmVhbnMKLS0tPgotPCFFTEVNRU5UIHNlc3Npb24gKGRlc2NyaXB0aW9uPywgZGlzcGxheS1uYW1lPywgc21hbGwtaWNvbj8sCi1sYXJnZS1pY29uPywgZWpiLW5hbWUsIGhvbWU/LCByZW1vdGU/LCBsb2NhbC1ob21lPywgbG9jYWw/LAotZWpiLWNsYXNzLCBzZXNzaW9uLXR5cGUsIHRyYW5zYWN0aW9uLXR5cGUsIGVudi1lbnRyeSosIGVqYi1yZWYqLAotZWpiLWxvY2FsLXJlZiosIHNlY3VyaXR5LXJvbGUtcmVmKiwgc2VjdXJpdHktaWRlbnRpdHk/LCByZXNvdXJjZS1yZWYqLAotcmVzb3VyY2UtZW52LXJlZiopPgotCi08IS0tCi1UaGUgc2Vzc2lvbi10eXBlIGVsZW1lbnQgZGVzY3JpYmVzIHdoZXRoZXIgdGhlIHNlc3Npb24gYmVhbiBpcyBhCi1zdGF0ZWZ1bCBzZXNzaW9uIG9yIHN0YXRlbGVzcyBzZXNzaW9uLgotCi1UaGUgc2Vzc2lvbi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQk8c2Vzc2lvbi10eXBlPlN0YXRlZnVsPC9zZXNzaW9uLXR5cGU+Ci0JPHNlc3Npb24tdHlwZT5TdGF0ZWxlc3M8L3Nlc3Npb24tdHlwZT4KLS0tPgotPCFFTEVNRU5UIHNlc3Npb24tdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBzbWFsbC1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi1jb250YWluaW5nIGEgc21hbGwgKDE2IHggMTYpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi1uYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIGVudGVycHJpc2UgYmVhbidzCi1lamItamFyIGZpbGUuCi0KLVRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCi1UaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQotVXNlZCBpbjogZWpiLWphciwgZW50aXR5LCBtZXNzYWdlLWRyaXZlbiwgc2Vzc2lvbgotCi1FeGFtcGxlOgotCi08c21hbGwtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGc8L3NtYWxsLWljb24+Ci0tLT4KLTwhRUxFTUVOVCBzbWFsbC1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5IGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgYSBKTVMgdG9waWMKLXN1YnNjcmlwdGlvbiBpcyBpbnRlbmRlZCB0byBiZSBkdXJhYmxlIG9yIG5vbmR1cmFibGUuCi0KLVRoZSBzdWJzY3JpcHRpb24tZHVyYWJpbGl0eSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JPHN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5PkR1cmFibGU8L3N1YnNjcmlwdGlvbi1kdXJhYmlsaXR5PgotCTxzdWJzY3JpcHRpb24tZHVyYWJpbGl0eT5Ob25EdXJhYmxlPC9zdWJzY3JpcHRpb24tZHVyYWJpbGl0eT4KLQotVXNlZCBpbjogbWVzc2FnZS1kcml2ZW4tZGVzdGluYXRpb24KLS0tPgotPCFFTEVNRU5UIHN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5ICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHRyYW5zLWF0dHJpYnV0ZSBlbGVtZW50IHNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lciBtdXN0IG1hbmFnZQotdGhlIHRyYW5zYWN0aW9uIGJvdW5kYXJpZXMgd2hlbiBkZWxlZ2F0aW5nIGEgbWV0aG9kIGludm9jYXRpb24gdG8gYW4KLWVudGVycHJpc2UgYmVhbidzIGJ1c2luZXNzIG1ldGhvZC4KLQotVGhlIHZhbHVlIG9mIHRyYW5zLWF0dHJpYnV0ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0KLQk8dHJhbnMtYXR0cmlidXRlPk5vdFN1cHBvcnRlZDwvdHJhbnMtYXR0cmlidXRlPgotCTx0cmFucy1hdHRyaWJ1dGU+U3VwcG9ydHM8L3RyYW5zLWF0dHJpYnV0ZT4KLQk8dHJhbnMtYXR0cmlidXRlPlJlcXVpcmVkPC90cmFucy1hdHRyaWJ1dGU+Ci0JPHRyYW5zLWF0dHJpYnV0ZT5SZXF1aXJlc05ldzwvdHJhbnMtYXR0cmlidXRlPgotCTx0cmFucy1hdHRyaWJ1dGU+TWFuZGF0b3J5PC90cmFucy1hdHRyaWJ1dGU+Ci0JPHRyYW5zLWF0dHJpYnV0ZT5OZXZlcjwvdHJhbnMtYXR0cmlidXRlPgotCi1Vc2VkIGluOiBjb250YWluZXItdHJhbnNhY3Rpb24KLS0tPgotPCFFTEVNRU5UIHRyYW5zLWF0dHJpYnV0ZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB0cmFuc2FjdGlvbi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIGFuIGVudGVycHJpc2UgYmVhbidzCi10cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUuCi0KLVRoZSB0cmFuc2FjdGlvbi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQk8dHJhbnNhY3Rpb24tdHlwZT5CZWFuPC90cmFuc2FjdGlvbi10eXBlPgotCTx0cmFuc2FjdGlvbi10eXBlPkNvbnRhaW5lcjwvdHJhbnNhY3Rpb24tdHlwZT4KLQotVXNlZCBpbjogbWVzc2FnZS1kcml2ZW4sIHNlc3Npb24KLS0tPgotPCFFTEVNRU5UIHRyYW5zYWN0aW9uLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgdW5jaGVja2VkIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgYSBtZXRob2QgaXMgbm90IGNoZWNrZWQgZm9yIGF1dGhvcml6YXRpb24KLWJ5IHRoZSBjb250YWluZXIgcHJpb3IgdG8gaW52b2NhdGlvbiBvZiB0aGUgbWV0aG9kLgotCi1Vc2VkIGluOiBtZXRob2QtcGVybWlzc2lvbgotLS0+Ci08IUVMRU1FTlQgdW5jaGVja2VkIEVNUFRZPgotCi08IS0tCi0KLVRoZSB1c2UtY2FsbGVyLWlkZW50aXR5IGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgdGhlIGNhbGxlcidzIHNlY3VyaXR5Ci1pZGVudGl0eSBiZSB1c2VkIGFzIHRoZSBzZWN1cml0eSBpZGVudGl0eSBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKLWVudGVycHJpc2UgYmVhbidzIG1ldGhvZHMuCi0KLVVzZWQgaW46IHNlY3VyaXR5LWlkZW50aXR5Ci0tLT4KLTwhRUxFTUVOVCB1c2UtY2FsbGVyLWlkZW50aXR5IEVNUFRZPgotCi08IS0tCi1UaGUgSUQgbWVjaGFuaXNtIGlzIHRvIGFsbG93IHRvb2xzIHRoYXQgcHJvZHVjZSBhZGRpdGlvbmFsIGRlcGxveW1lbnQKLWluZm9ybWF0aW9uIChpLmUuLCBpbmZvcm1hdGlvbiBiZXlvbmQgdGhlIHN0YW5kYXJkIGRlcGxveW1lbnQKLWRlc2NyaXB0b3IgaW5mb3JtYXRpb24pIHRvIHN0b3JlIHRoZSBub24tc3RhbmRhcmQgaW5mb3JtYXRpb24gaW4gYQotc2VwYXJhdGUgZmlsZSwgYW5kIGVhc2lseSByZWZlciBmcm9tIHRoZXNlIHRvb2wtc3BlY2lmaWMgZmlsZXMgdG8gdGhlCi1pbmZvcm1hdGlvbiBpbiB0aGUgc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi1Ub29scyBhcmUgbm90IGFsbG93ZWQgdG8gYWRkIHRoZSBub24tc3RhbmRhcmQgaW5mb3JtYXRpb24gaW50byB0aGUKLXN0YW5kYXJkIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLS0tPgotCi08IUFUVExJU1QgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYWNrbm93bGVkZ2UtbW9kZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhc3NlbWJseS1kZXNjcmlwdG9yIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNhc2NhZGUtZGVsZXRlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNtcC1maWVsZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjbXAtdmVyc2lvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjbXItZmllbGQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY21yLWZpZWxkLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY21yLWZpZWxkLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29udGFpbmVyLXRyYW5zYWN0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlc2NyaXB0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlc3RpbmF0aW9uLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGlzcGxheS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1jbGFzcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItY2xpZW50LWphciBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItamFyIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1saW5rIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1sb2NhbC1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXFsIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZi1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWYtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVsYXRpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlbGF0aW9uLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudGVycHJpc2UtYmVhbnMgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW50aXR5IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktdmFsdWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZXhjbHVkZS1saXN0IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZpZWxkLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaG9tZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsYXJnZS1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxvY2FsIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxvY2FsLWhvbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWVzc2FnZS1kcml2ZW4gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWVzc2FnZS1kcml2ZW4tZGVzdGluYXRpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWVzc2FnZS1zZWxlY3RvciBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtZXRob2QgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWV0aG9kLWludGYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWV0aG9kLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWV0aG9kLXBhcmFtIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1ldGhvZC1wYXJhbXMgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWV0aG9kLXBlcm1pc3Npb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbXVsdGlwbGljaXR5IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHBlcnNpc3RlbmNlLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcHJpbS1rZXktY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcHJpbWtleS1maWVsZCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBxdWVyeSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBxdWVyeS1tZXRob2QgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVlbnRyYW50IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWxhdGlvbnNoaXBzIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbW90ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtYXV0aCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLXNoYXJpbmctc2NvcGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzb3VyY2UtZW52LXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXNvdXJjZS1lbnYtcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzb3VyY2UtZW52LXJlZi10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc291cmNlLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXN1bHQtdHlwZS1tYXBwaW5nIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJvbGUtbGluayBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByb2xlLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcnVuLWFzIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlY3VyaXR5LWlkZW50aXR5IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlY3VyaXR5LXJvbGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VjdXJpdHktcm9sZS1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2Vzc2lvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZXNzaW9uLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc21hbGwtaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzdWJzY3JpcHRpb24tZHVyYWJpbGl0eSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0cmFucy1hdHRyaWJ1dGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdHJhbnNhY3Rpb24tdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB1bmNoZWNrZWQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdXNlLWNhbGxlci1pZGVudGl0eSBpZCBJRCAjSU1QTElFRD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8yXzEueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9lamItamFyXzJfMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOTQyNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9lamItamFyXzJfMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMjA4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotCSAgICB2ZXJzaW9uPSIyLjEiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWVqYi1qYXJfMl8xLnhzZHMJMS4yMyAwOC8wMS8wMwotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgOTAxIFNhbiBBbnRvbmlvCi0gICAgICBSb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiBBbGwgcmlnaHRzCi0gICAgICByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBWwotCi0JVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIEVKQiAyLjEgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCVRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZCAiTUVUQS1JTkYvZWpiLWphci54bWwiIGluCi0JdGhlIEVKQidzIGphciBmaWxlLiAgQWxsIEVKQiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUKLQl0aGUgZWpiLWphciBzY2hlbWEgYnkgdXNpbmcgdGhlIEoyRUUgbmFtZXNwYWNlOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCi0JYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotCXVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLQkgICAgPGVqYi1qYXIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQkJICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2VqYi1qYXJfMl8xLnhzZCIKLQkgICAgICB2ZXJzaW9uPSIyLjEiPgotCSAgICAgIC4uLgotCSAgICA8L2VqYi1qYXI+Ci0KLQlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKLQl0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciB0aGUKLQlKMkVFIG5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2VqYi1qYXJfMl8xLnhzZAotCi0JXV0+Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKMkVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLQlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0JcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLSAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1qYXIiIHR5cGU9ImoyZWU6ZWpiLWphclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgaXMgdGhlIHJvb3Qgb2YgdGhlIGVqYi1qYXIgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOmtleSBuYW1lPSJlamItbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGVqYi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gZW50ZXJwcmlzZQotCSAgYmVhbi4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyIGZpbGUuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZW50ZXJwcmlzZS1iZWFucy8qIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1uYW1lIi8+Ci0gICAgPC94c2Q6a2V5PgotCi0gICAgPHhzZDprZXlyZWYgbmFtZT0iZWpiLW5hbWUtcmVmZXJlbmNlcyIKLQkJcmVmZXI9ImoyZWU6ZWpiLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBrZXlyZWYgaW5kaWNhdGVzIHRoZSByZWZlcmVuY2VzIGZyb20KLQkgIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBtdXN0IGJlIHRvIGEgc3BlY2lmaWMgZWpiLW5hbWUKLQkgIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBlbnRlcnByaXNlLWJlYW5zIGVsZW1lbnQuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IKLQkgICB4cGF0aD0iLi8vajJlZTplamItcmVsYXRpb25zaGlwLXJvbGUvajJlZTpyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UiLz4KLSAgICAgIDx4c2Q6ZmllbGQKLQkgICB4cGF0aD0iajJlZTplamItbmFtZSIvPgotICAgIDwveHNkOmtleXJlZj4KLQotICAgIDx4c2Q6a2V5IG5hbWU9InJvbGUtbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgQSByb2xlLW5hbWUta2V5IGlzIHNwZWNpZmllZCB0byBhbGxvdyB0aGUgcmVmZXJlbmNlcwotCSAgZnJvbSB0aGUgc2VjdXJpdHktcm9sZS1yZWZzLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmFzc2VtYmx5LWRlc2NyaXB0b3IvajJlZTpzZWN1cml0eS1yb2xlIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJvbGUtbmFtZSIvPgotICAgIDwveHNkOmtleT4KLQotICAgIDx4c2Q6a2V5cmVmIG5hbWU9InJvbGUtbmFtZS1yZWZlcmVuY2VzIgotCQlyZWZlcj0iajJlZTpyb2xlLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBrZXlyZWYgaW5kaWNhdGVzIHRoZSByZWZlcmVuY2VzIGZyb20KLQkgIHNlY3VyaXR5LXJvbGUtcmVmIHRvIGEgc3BlY2lmaWVkIHJvbGUtbmFtZS4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnRlcnByaXNlLWJlYW5zLyovajJlZTpzZWN1cml0eS1yb2xlLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyb2xlLWxpbmsiLz4KLSAgICA8L3hzZDprZXlyZWY+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHlUeXBlIGNvbnRhaW5zIGEgbmFtZS92YWx1ZQotCWNvbmZpZ3VyYXRpb24gcHJvcGVydHkgcGFpciBmb3IgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCi0JVGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVjb2duaXplZCBmb3IgYSBwYXJ0aWN1bGFyCi0JbWVzc2FnZS1kcml2ZW4gYmVhbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbWVzc2FnaW5nIHR5cGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktbmFtZSIKLQkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LW5hbWUgZWxlbWVudCBjb250YWlucwotCSAgICB0aGUgbmFtZSBmb3IgYW4gYWN0aXZhdGlvbiBjb25maWd1cmF0aW9uIHByb3BlcnR5IG9mCi0JICAgIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLQotCSAgICBGb3IgSk1TIG1lc3NhZ2UtZHJpdmVuIGJlYW5zLCB0aGUgZm9sbG93aW5nIHByb3BlcnR5Ci0JICAgIG5hbWVzIGFyZSByZWNvZ25pemVkOiBhY2tub3dsZWRnZU1vZGUsCi0JICAgIG1lc3NhZ2VTZWxlY3RvciwgZGVzdGluYXRpb25UeXBlLCBzdWJzY3JpcHRpb25EdXJhYmlsaXR5Ci0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHktdmFsdWUiCi0JCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS12YWx1ZSBlbGVtZW50Ci0JICAgIGNvbnRhaW5zIHRoZSB2YWx1ZSBmb3IgYW4gYWN0aXZhdGlvbiBjb25maWd1cmF0aW9uCi0JICAgIHByb3BlcnR5IG9mIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhY3RpdmF0aW9uLWNvbmZpZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhY3RpdmF0aW9uLWNvbmZpZ1R5cGUgZGVmaW5lcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLQlleHBlY3RlZCBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4KLQlpbiBpdHMgb3BlcmF0aW9uYWwgZW52aXJvbm1lbnQuIFRoaXMgbWF5IGluY2x1ZGUgaW5mb3JtYXRpb24KLQlhYm91dCBtZXNzYWdlIGFja25vd2xlZGdlbWVudCwgbWVzc2FnZSBzZWxlY3RvciwgZXhwZWN0ZWQKLQlkZXN0aW5hdGlvbiB0eXBlLCBldGMuCi0KLQlUaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBleHByZXNzZWQgaW4gdGVybXMgb2YKLQluYW1lL3ZhbHVlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4KLQotCVRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlY29nbml6ZWQgZm9yIGEgcGFydGljdWxhcgotCW1lc3NhZ2UtZHJpdmVuIGJlYW4gYXJlIGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2luZyB0eXBlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5IgotCQkgICB0eXBlPSJqMmVlOmFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5VHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhc3NlbWJseS1kZXNjcmlwdG9yVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGFzc2VtYmx5LWRlc2NyaXB0b3JUeXBlIGRlZmluZXMKLQlhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbi4KLQotCVRoZSBhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbiBjb25zaXN0cyBvZiB0aGUKLQlmb2xsb3dpbmcgcGFydHM6IHRoZSBkZWZpbml0aW9uIG9mIHNlY3VyaXR5IHJvbGVzLCB0aGUKLQlkZWZpbml0aW9uIG9mIG1ldGhvZCBwZXJtaXNzaW9ucywgdGhlIGRlZmluaXRpb24gb2YKLQl0cmFuc2FjdGlvbiBhdHRyaWJ1dGVzIGZvciBlbnRlcnByaXNlIGJlYW5zIHdpdGgKLQljb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiBhbmQgYSBsaXN0IG9mCi0JbWV0aG9kcyB0byBiZSBleGNsdWRlZCBmcm9tIGJlaW5nIGludm9rZWQuCi0KLQlBbGwgdGhlIHBhcnRzIGFyZSBvcHRpb25hbCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IGFyZQotCW9taXR0ZWQgaWYgdGhlIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlIGVtcHR5LgotCi0JUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQKLQlkZXNjcmlwdG9yIGlzIG9wdGlvbmFsIGZvciB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUiCi0JCSAgIHR5cGU9ImoyZWU6c2VjdXJpdHktcm9sZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtcGVybWlzc2lvbiIKLQkJICAgdHlwZT0iajJlZTptZXRob2QtcGVybWlzc2lvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItdHJhbnNhY3Rpb24iCi0JCSAgIHR5cGU9ImoyZWU6Y29udGFpbmVyLXRyYW5zYWN0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24iCi0JCSAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWxpc3QiCi0JCSAgIHR5cGU9ImoyZWU6ZXhjbHVkZS1saXN0VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY21wLWZpZWxkVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGNtcC1maWVsZFR5cGUgZGVzY3JpYmVzIGEgY29udGFpbmVyLW1hbmFnZWQgZmllbGQuIFRoZQotCWNtcC1maWVsZFR5cGUgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGZpZWxkLAotCWFuZCB0aGUgbmFtZSBvZiB0aGUgZmllbGQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6amF2YS1pZGVudGlmaWVyVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBmaWVsZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLQkgICAgY29udGFpbmVyIG1hbmFnZWQgZmllbGQuCi0KLQkgICAgVGhlIG5hbWUgb2YgdGhlIGNtcC1maWVsZCBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoCi0JICAgIGNtcC12ZXJzaW9uIDIueCBtdXN0IGJlZ2luIHdpdGggYSBsb3dlcmNhc2UKLQkgICAgbGV0dGVyLiBUaGlzIGZpZWxkIGlzIGFjY2Vzc2VkIGJ5IG1ldGhvZHMgd2hvc2UKLQkgICAgbmFtZXMgY29uc2lzdHMgb2YgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHNwZWNpZmllZCBieQotCSAgICBmaWVsZC1uYW1lIGluIHdoaWNoIHRoZSBmaXJzdCBsZXR0ZXIgaXMgdXBwZXJjYXNlZCwKLQkgICAgcHJlZml4ZWQgYnkgImdldCIgb3IgInNldCIuCi0KLQkgICAgVGhlIG5hbWUgb2YgdGhlIGNtcC1maWVsZCBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoCi0JICAgIGNtcC12ZXJzaW9uIDEueCBtdXN0IGRlbm90ZSBhIHB1YmxpYyBmaWVsZCBvZiB0aGUKLQkgICAgZW50ZXJwcmlzZSBiZWFuIGNsYXNzIG9yIG9uZSBvZiBpdHMgc3VwZXJjbGFzc2VzLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtcC12ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGNtcC12ZXJzaW9uVHlwZSBzcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgYW4gZW50aXR5IGJlYW4KLQl3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLiBJdCBpcyB1c2VkIGJ5Ci0JY21wLXZlcnNpb24gZWxlbWVudHMuCi0KLQlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQkgICAgMS54Ci0JICAgIDIueAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMS54Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMi54Ii8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY21yLWZpZWxkLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgY21yLWZpZWxkLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNsYXNzIG9mIGEKLQljb2xsZWN0aW9uLXZhbHVlZCBsb2dpY2FsIHJlbGF0aW9uc2hpcCBmaWVsZCBpbiB0aGUgZW50aXR5Ci0JYmVhbiBjbGFzcy4gVGhlIHZhbHVlIG9mIGFuIGVsZW1lbnQgdXNpbmcgY21yLWZpZWxkLXR5cGVUeXBlCi0JbXVzdCBiZSBlaXRoZXI6IGphdmEudXRpbC5Db2xsZWN0aW9uIG9yIGphdmEudXRpbC5TZXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEudXRpbC5TZXQiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbXItZmllbGRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgY21yLWZpZWxkVHlwZSBkZXNjcmliZXMgdGhlIGJlYW4gcHJvdmlkZXIncyB2aWV3IG9mCi0JYSByZWxhdGlvbnNoaXAuIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQKLQl0aGUgbmFtZSBhbmQgdGhlIGNsYXNzIHR5cGUgb2YgYSBmaWVsZCBpbiB0aGUgc291cmNlIG9mIGEKLQlyb2xlIG9mIGEgcmVsYXRpb25zaGlwLiBUaGUgY21yLWZpZWxkLW5hbWUgZWxlbWVudAotCWNvcnJlc3BvbmRzIHRvIHRoZSBuYW1lIHVzZWQgZm9yIHRoZSBnZXQgYW5kIHNldCBhY2Nlc3NvcgotCW1ldGhvZHMgZm9yIHRoZSByZWxhdGlvbnNoaXAuIFRoZSBjbXItZmllbGQtdHlwZSBlbGVtZW50IGlzCi0JdXNlZCBvbmx5IGZvciBjb2xsZWN0aW9uLXZhbHVlZCBjbXItZmllbGRzLiBJdCBzcGVjaWZpZXMgdGhlCi0JdHlwZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IGlzIHVzZWQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21yLWZpZWxkLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGNtci1maWVsZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLQkgICAgbG9naWNhbCByZWxhdGlvbnNoaXAgZmllbGQgaW4gdGhlIGVudGl0eSBiZWFuCi0JICAgIGNsYXNzLiBUaGUgbmFtZSBvZiB0aGUgY21yLWZpZWxkIG11c3QgYmVnaW4gd2l0aCBhCi0JICAgIGxvd2VyY2FzZSBsZXR0ZXIuIFRoaXMgZmllbGQgaXMgYWNjZXNzZWQgYnkgbWV0aG9kcwotCSAgICB3aG9zZSBuYW1lcyBjb25zaXN0IG9mIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAotCSAgICBzcGVjaWZpZWQgYnkgY21yLWZpZWxkLW5hbWUgaW4gd2hpY2ggdGhlIGZpcnN0Ci0JICAgIGxldHRlciBpcyB1cHBlcmNhc2VkLCBwcmVmaXhlZCBieSAiZ2V0IiBvciAic2V0Ii4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXItZmllbGQtdHlwZSIKLQkJICAgdHlwZT0iajJlZTpjbXItZmllbGQtdHlwZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnRhaW5lci10cmFuc2FjdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBjb250YWluZXItdHJhbnNhY3Rpb25UeXBlIHNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lcgotCW11c3QgbWFuYWdlIHRyYW5zYWN0aW9uIHNjb3BlcyBmb3IgdGhlIGVudGVycHJpc2UgYmVhbidzCi0JbWV0aG9kIGludm9jYXRpb25zLiBJdCBkZWZpbmVzIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhCi0JbGlzdCBvZiBtZXRob2QgZWxlbWVudHMsIGFuZCBhIHRyYW5zYWN0aW9uIGF0dHJpYnV0ZS4gVGhlCi0JdHJhbnNhY3Rpb24gYXR0cmlidXRlIGlzIHRvIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBzcGVjaWZpZWQKLQltZXRob2RzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIKLQkJICAgdHlwZT0iajJlZTptZXRob2RUeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zLWF0dHJpYnV0ZSIKLQkJICAgdHlwZT0iajJlZTp0cmFucy1hdHRyaWJ1dGVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLWNsYXNzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgZWpiLWNsYXNzVHlwZSBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlCi0JICBlbnRlcnByaXNlIGJlYW4ncyBjbGFzcy4gSXQgaXMgdXNlZCBieSBlamItY2xhc3MgZWxlbWVudHMuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgICAgICA8ZWpiLWNsYXNzPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2VCZWFuPC9lamItY2xhc3M+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1qYXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWpiLWphclR5cGUgZGVmaW5lcyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBFSkIKLQlkZXBsb3ltZW50IGRlc2NyaXB0b3IuIEl0IGNvbnRhaW5zCi0KLQkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZWpiLWphciBmaWxlCi0JICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0JICAgIC0gYW4gb3B0aW9uYWwgaWNvbiB0aGF0IGNvbnRhaW5zIGEgc21hbGwgYW5kIGEgbGFyZ2UKLQkgICAgICBpY29uIGZpbGUgbmFtZQotCSAgICAtIG1hbmRhdG9yeSBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIGFib3V0IGFsbCBpbmNsdWRlZAotCSAgICAgIGVudGVycHJpc2UgYmVhbnMKLQkgICAgLSBhIGRlc2NyaXB0b3IgZm9yIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMsCi0JICAgICAgaWYgYW55Ci0JICAgIC0gYW4gb3B0aW9uYWwgYXBwbGljYXRpb24tYXNzZW1ibHkgZGVzY3JpcHRvcgotCSAgICAtIGFuIG9wdGlvbmFsIG5hbWUgb2YgYW4gZWpiLWNsaWVudC1qYXIgZmlsZSBmb3IgdGhlCi0JICAgICAgZWpiLWphci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRlcnByaXNlLWJlYW5zIgotCQkgICB0eXBlPSJqMmVlOmVudGVycHJpc2UtYmVhbnNUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVsYXRpb25zaGlwcyIKLQkJICAgdHlwZT0iajJlZTpyZWxhdGlvbnNoaXBzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOnVuaXF1ZSBuYW1lPSJyZWxhdGlvbnNoaXAtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYi1yZWxhdGlvbi1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgICAgICByZWxhdGlvbi4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0JICAgICAgcmVsYXRpb25zaGlwcy4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZWpiLXJlbGF0aW9uIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWxhdGlvbi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NlbWJseS1kZXNjcmlwdG9yIgotCQkgICB0eXBlPSJqMmVlOmFzc2VtYmx5LWRlc2NyaXB0b3JUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBQcm92aWRpbmcgYW4gYXNzZW1ibHktZGVzY3JpcHRvciBpbiB0aGUgZGVwbG95bWVudAotCSAgICBkZXNjcmlwdG9yIGlzIG9wdGlvbmFsIGZvciB0aGUgZWpiLWphciBmaWxlCi0JICAgIHByb2R1Y2VyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGllbnQtamFyIgotCQkgICB0eXBlPSJqMmVlOnBhdGhUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgb3B0aW9uYWwgZWpiLWNsaWVudC1qYXIgZWxlbWVudCBzcGVjaWZpZXMgYSBKQVIKLQkgICAgICBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGNsYXNzIGZpbGVzIG5lY2Vzc2FyeSBmb3IgYQotCSAgICAgIGNsaWVudCBwcm9ncmFtIHRvIGFjY2VzcyB0aGUKLQkgICAgICBlbnRlcnByaXNlIGJlYW5zIGluIHRoZSBlamItamFyIGZpbGUuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JCSAgPGVqYi1jbGllbnQtamFyPmVtcGxveWVlX3NlcnZpY2VfY2xpZW50LmphcgotCQkgIDwvZWpiLWNsaWVudC1qYXI+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLQkJICAgdHlwZT0iajJlZTpkZXdleS12ZXJzaW9uVHlwZSIKLQkJICAgZml4ZWQ9IjIuMSIKLQkJICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgdmVyc2lvbiBzcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgdGhlCi0JICBFSkIgc3BlY2lmaWNhdGlvbiB0aGF0IHRoZSBpbnN0YW5jZSBkb2N1bWVudCBtdXN0Ci0JICBjb21wbHkgd2l0aC4gVGhpcyBpbmZvcm1hdGlvbiBlbmFibGVzIGRlcGxveW1lbnQgdG9vbHMKLQkgIHRvIHZhbGlkYXRlIGEgcGFydGljdWxhciBFSkIgRGVwbG95bWVudAotCSAgRGVzY3JpcHRvciB3aXRoIHJlc3BlY3QgdG8gYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBFSkIKLQkgIHNjaGVtYS4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIGVqYi1uYW1lVHlwZSBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbmFtZS4gSXQgaXMKLQkgIHVzZWQgYnkgZWpiLW5hbWUgZWxlbWVudHMuIFRoaXMgbmFtZSBpcyBhc3NpZ25lZCBieSB0aGUKLQkgIGVqYi1qYXIgZmlsZSBwcm9kdWNlciB0byBuYW1lIHRoZSBlbnRlcnByaXNlIGJlYW4gaW4gdGhlCi0JICBlamItamFyIGZpbGUncyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoZSBuYW1lIG11c3QgYmUKLQkgIHVuaXF1ZSBhbW9uZyB0aGUgbmFtZXMgb2YgdGhlIGVudGVycHJpc2UgYmVhbnMgaW4gdGhlIHNhbWUKLQkgIGVqYi1qYXIgZmlsZS4KLQotCSAgVGhlcmUgaXMgbm8gYXJjaGl0ZWN0ZWQgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHVzZWQKLQkgIGVqYi1uYW1lIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYW5kIHRoZSBKTkRJIG5hbWUgdGhhdAotCSAgdGhlIERlcGxveWVyIHdpbGwgYXNzaWduIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBob21lLgotCi0JICBUaGUgbmFtZSBmb3IgYW4gZW50aXR5IGJlYW4gbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsCi0JICBydWxlcyBmb3IgYW4gTk1UT0tFTi4KLQotCSAgRXhhbXBsZToKLQotCSAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTp4c2ROTVRPS0VOVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItcmVsYXRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWpiLXJlbGF0aW9uVHlwZSBkZXNjcmliZXMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28KLQllbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4gIEl0IGlzIHVzZWQKLQlieSBlamItcmVsYXRpb24gZWxlbWVudHMuIEl0IGNvbnRhaW5zIGEgZGVzY3JpcHRpb247IGFuCi0Jb3B0aW9uYWwgZWpiLXJlbGF0aW9uLW5hbWUgZWxlbWVudDsgYW5kIGV4YWN0bHkgdHdvCi0JcmVsYXRpb25zaGlwIHJvbGUgZGVjbGFyYXRpb25zLCBkZWZpbmVkIGJ5IHRoZQotCWVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50cy4gVGhlIG5hbWUgb2YgdGhlCi0JcmVsYXRpb25zaGlwLCBpZiBzcGVjaWZpZWQsIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIKLQlmaWxlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWxhdGlvbi1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGVqYi1yZWxhdGlvbi1uYW1lIGVsZW1lbnQgcHJvdmlkZXMgYSB1bmlxdWUgbmFtZQotCSAgICB3aXRoaW4gdGhlIGVqYi1qYXIgZmlsZSBmb3IgYSByZWxhdGlvbnNoaXAuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uc2hpcC1yb2xlIgotCQkgICB0eXBlPSJqMmVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb25zaGlwLXJvbGUiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWxhdGlvbnNoaXAtcm9sZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZVR5cGUgZGVzY3JpYmVzIGEgcm9sZSB3aXRoaW4gYQotCSAgcmVsYXRpb25zaGlwLiBUaGVyZSBhcmUgdHdvIHJvbGVzIGluIGVhY2ggcmVsYXRpb25zaGlwLgotCi0JICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSBjb250YWlucyBhbiBvcHRpb25hbAotCSAgZGVzY3JpcHRpb247IGFuIG9wdGlvbmFsIG5hbWUgZm9yIHRoZSByZWxhdGlvbnNoaXAgcm9sZTsgYQotCSAgc3BlY2lmaWNhdGlvbiBvZiB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSByb2xlOyBhbiBvcHRpb25hbAotCSAgc3BlY2lmaWNhdGlvbiBvZiBjYXNjYWRlLWRlbGV0ZSBmdW5jdGlvbmFsaXR5IGZvciB0aGUgcm9sZTsKLQkgIHRoZSByb2xlIHNvdXJjZTsgYW5kIGEgZGVjbGFyYXRpb24gb2YgdGhlIGNtci1maWVsZCwgaWYgYW55LAotCSAgYnkgbWVhbnMgb2Ygd2hpY2ggdGhlIG90aGVyIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBpcwotCSAgYWNjZXNzZWQgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIHJvbGUgc291cmNlLgotCi0JICBUaGUgbXVsdGlwbGljaXR5IGFuZCByb2xlLXNvdXJjZSBlbGVtZW50IGFyZSBtYW5kYXRvcnkuCi0KLQkgIFRoZSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCBkZXNpZ25hdGVzIGFuIGVudGl0eQotCSAgYmVhbiBieSBtZWFucyBvZiBhbiBlamItbmFtZSBlbGVtZW50LiBGb3IgYmlkaXJlY3Rpb25hbAotCSAgcmVsYXRpb25zaGlwcywgYm90aCByb2xlcyBvZiBhIHJlbGF0aW9uc2hpcCBtdXN0IGRlY2xhcmUgYQotCSAgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgdGhhdCBzcGVjaWZpZXMgYSBjbXItZmllbGQKLQkgIGluIHRlcm1zIG9mIHdoaWNoIHRoZSByZWxhdGlvbnNoaXAgaXMgYWNjZXNzZWQuIFRoZSBsYWNrIG9mCi0JICBhIGNtci1maWVsZCBlbGVtZW50IGluIGFuIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBzcGVjaWZpZXMKLQkgIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBpcyB1bmlkaXJlY3Rpb25hbCBpbiBuYXZpZ2FiaWxpdHkgYW5kCi0JICB0aGUgZW50aXR5IGJlYW4gdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gdGhlIHJlbGF0aW9uc2hpcCBpcwotCSAgIm5vdCBhd2FyZSIgb2YgdGhlIHJlbGF0aW9uc2hpcC4KLQotCSAgRXhhbXBsZToKLQotCSAgPGVqYi1yZWxhdGlvbj4KLQkgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+UHJvZHVjdC1MaW5lSXRlbTwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0JICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLQkJICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cHJvZHVjdC1oYXMtbGluZWl0ZW1zCi0JCSAgPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLQkJICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotCQkgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0JCSAgPGVqYi1uYW1lPlByb2R1Y3RFSkI8L2VqYi1uYW1lPgotCQkgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotCSAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLQkgIDwvZWpiLXJlbGF0aW9uPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUgZWxlbWVudCBkZWZpbmVzIGEKLQkgICAgbmFtZSBmb3IgYSByb2xlIHRoYXQgaXMgdW5pcXVlIHdpdGhpbiBhbgotCSAgICBlamItcmVsYXRpb24uIERpZmZlcmVudCByZWxhdGlvbnNoaXBzIGNhbiB1c2UgdGhlCi0JICAgIHNhbWUgbmFtZSBmb3IgYSByb2xlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im11bHRpcGxpY2l0eSIKLQkJICAgdHlwZT0iajJlZTptdWx0aXBsaWNpdHlUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1kZWxldGUiCi0JCSAgIHR5cGU9ImoyZWU6ZW1wdHlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgY2FzY2FkZS1kZWxldGUgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCwgd2l0aGluIGEKLQkgICAgcGFydGljdWxhciByZWxhdGlvbnNoaXAsIHRoZSBsaWZldGltZSBvZiBvbmUgb3IgbW9yZQotCSAgICBlbnRpdHkgYmVhbnMgaXMgZGVwZW5kZW50IHVwb24gdGhlIGxpZmV0aW1lIG9mCi0JICAgIGFub3RoZXIgZW50aXR5IGJlYW4uIFRoZSBjYXNjYWRlLWRlbGV0ZSBlbGVtZW50IGNhbgotCSAgICBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYW4gZWpiLXJlbGF0aW9uc2hpcC1yb2xlCi0JICAgIGVsZW1lbnQgY29udGFpbmVkIGluIGFuIGVqYi1yZWxhdGlvbiBlbGVtZW50IGluCi0JICAgIHdoaWNoIHRoZSBvdGhlciBlamItcmVsYXRpb25zaGlwLXJvbGUKLQkgICAgZWxlbWVudCBzcGVjaWZpZXMgYSBtdWx0aXBsaWNpdHkgb2YgT25lLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSIKLQkJICAgdHlwZT0iajJlZTpyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21yLWZpZWxkIgotCQkgICB0eXBlPSJqMmVlOmNtci1maWVsZFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGVycHJpc2UtYmVhbnNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZW50ZXJwcmlzZS1iZWFuc1R5cGUgZGVjbGFyZXMgb25lIG9yIG1vcmUgZW50ZXJwcmlzZQotCWJlYW5zLiBFYWNoIGJlYW4gY2FuIGJlIGEgc2Vzc2lvbiwgZW50aXR5IG9yIG1lc3NhZ2UtZHJpdmVuCi0JYmVhbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24iCi0JCSAgIHR5cGU9ImoyZWU6c2Vzc2lvbi1iZWFuVHlwZSI+Ci0JPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1lamItbG9jYWwtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZgotCSAgICAgIGFuIEVKQiByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluCi0JICAgICAgdGhlIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLQkgICAgICB0aGUgY29tcG9uZW50LgotCi0JICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGJlIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItbG9jYWwtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tZWpiLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0JICAgICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUKLQkgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotCSAgICAgIHdpdGhpbiB0aGUgY29tcG9uZW50LgotCi0JICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tcmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgICAgICB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLQkgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotCSAgICAgIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLW1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAgICAgIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotCSAgICAgIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotCSAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0JICAgICAgY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1yZXMtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lCi0JICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLQkgICAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotCSAgICAgIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJCi0JICAgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlCi0JICAgICAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnYtZW50cnkiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZW52LWVudHJ5LW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5IgotCQkgICB0eXBlPSJqMmVlOmVudGl0eS1iZWFuVHlwZSI+Ci0JPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LWVqYi1sb2NhbC1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mCi0JICAgICAgYW4gRUpCIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4KLQkgICAgICB0aGUgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotCSAgICAgIHRoZSBjb21wb25lbnQuCi0KLQkgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgYmUgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1sb2NhbC1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LWVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotCSAgICAgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlCi0JICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLQkgICAgICB3aXRoaW4gdGhlIGNvbXBvbmVudC4KLQotCSAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZWpiLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktcmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgICAgICB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLQkgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotCSAgICAgIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgICAgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0JICAgICAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0JICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLQkgICAgICBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktcmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLQkgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuICBUaGUgbmFtZQotCSAgICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0JICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6cmVzb3VyY2UtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJlcy1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotCSAgICAgIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJCi0JICAgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlCi0JICAgICAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplbnYtZW50cnkiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZW52LWVudHJ5LW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kcml2ZW4iCi0JCSAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kcml2ZW4tYmVhblR5cGUiPgotCTx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLWVqYi1sb2NhbC1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mCi0JICAgICAgYW4gRUpCIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4KLQkgICAgICB0aGUgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotCSAgICAgIHRoZSBjb21wb25lbnQuCi0KLQkgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgYmUgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOmVqYi1sb2NhbC1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6ZWpiLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtZWpiLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0JICAgICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUKLQkgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotCSAgICAgIHdpdGhpbiB0aGUgY29tcG9uZW50LgotCi0JICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLXJlc291cmNlLWVudi1yZWYtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgICAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0JICAgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0JICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLQkgICAgICBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnJlc291cmNlLWVudi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgICAgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0JICAgICAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0JICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLQkgICAgICBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1yZXMtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lCi0JICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLQkgICAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtZW52LWVudHJ5LW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotCSAgICAgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZQotCSAgICAgIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZW52LWVudHJ5Ii8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVudi1lbnRyeS1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOmNob2ljZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktYmVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlbnRpdHktYmVhblR5cGUgZGVjbGFyZXMgYW4gZW50aXR5IGJlYW4uIFRoZSBkZWNsYXJhdGlvbgotCWNvbnNpc3RzIG9mOgotCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQkgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLQkgICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0JICAgICAgaWNvbiBmaWxlIG5hbWUKLQkgICAgLSBhIHVuaXF1ZSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4KLQkgICAgICBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBlbnRpdHkgYmVhbidzIHJlbW90ZSBob21lCi0JICAgICAgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLCBpZiBhbnkKLQkgICAgLSB0aGUgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuJ3MgbG9jYWwgaG9tZSBhbmQgbG9jYWwKLQkgICAgICBpbnRlcmZhY2VzLCBpZiBhbnkKLQkgICAgLSB0aGUgZW50aXR5IGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcwotCSAgICAtIHRoZSBlbnRpdHkgYmVhbidzIHBlcnNpc3RlbmNlIG1hbmFnZW1lbnQgdHlwZQotCSAgICAtIHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzIG5hbWUKLQkgICAgLSBhbiBpbmRpY2F0aW9uIG9mIHRoZSBlbnRpdHkgYmVhbidzIHJlZW50cmFuY3kKLQkgICAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZQotCSAgICAgIGVudGl0eSBiZWFuJ3MgY21wLXZlcnNpb24KLQkgICAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBlbnRpdHkgYmVhbidzCi0JICAgICAgYWJzdHJhY3Qgc2NoZW1hIG5hbWUKLQkgICAgLSBhbiBvcHRpb25hbCBsaXN0IG9mIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcwotCSAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIHByaW1hcnkga2V5Ci0JICAgICAgZmllbGQKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50Ci0JICAgICAgZW50cmllcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCCi0JICAgICAgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwKLQkgICAgICBFSkIgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3Mgd2ViCi0JICAgICAgc2VydmljZSByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IHJvbGUKLQkgICAgICByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5Ci0JICAgICAgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzIG1ldGhvZHMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0JICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLQkgICAgICByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdlCi0JICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIHNldCBvZiBxdWVyeSBkZWNsYXJhdGlvbnMKLQkgICAgICBmb3IgZmluZGVyIGFuZCBzZWxlY3QgbWV0aG9kcyBmb3IgYW4gZW50aXR5Ci0JICAgICAgYmVhbiB3aXRoIGNtcC12ZXJzaW9uIDIueC4KLQotCVRoZSBvcHRpb25hbCBhYnN0cmFjdC1zY2hlbWEtbmFtZSBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkCi0JZm9yIGFuIGVudGl0eSBiZWFuIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UgYW5kCi0JY21wLXZlcnNpb24gMi54LgotCi0JVGhlIG9wdGlvbmFsIHByaW1rZXktZmllbGQgbWF5IGJlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IKLQlpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIuCi0KLQlUaGUgb3B0aW9uYWwgY21wLXZlcnNpb24gZWxlbWVudCBtYXkgYmUgcHJlc2VudCBpbiB0aGUKLQlkZXNjcmlwdG9yIGlmIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lci4gSWYKLQl0aGUgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbgotCWVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgaXRzIHZhbHVlIGRlZmF1bHRzIHRvIDIueC4KLQotCVRoZSBvcHRpb25hbCBob21lIGFuZCByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgaWYKLQl0aGUgZW50aXR5IGJlYW4gY21wLXZlcnNpb24gaXMgMS54LgotCi0JVGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZgotCXRoZSBlbnRpdHkgYmVhbiBoYXMgYSByZW1vdGUgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZS4KLQotCVRoZSBvcHRpb25hbCBsb2NhbC1ob21lIGFuZCBsb2NhbCBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZAotCWlmIHRoZSBlbnRpdHkgYmVhbiBoYXMgYSBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2UuCi0KLQlFaXRoZXIgYm90aCB0aGUgbG9jYWwtaG9tZSBhbmQgdGhlIGxvY2FsIGVsZW1lbnRzIG9yIGJvdGgKLQl0aGUgaG9tZSBhbmQgdGhlIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZC4KLQotCVRoZSBvcHRpb25hbCBxdWVyeSBlbGVtZW50cyBtdXN0IGJlIHByZXNlbnQgaWYgdGhlCi0JcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbiBpcyAyLnggYW5kCi0JcXVlcnkgbWV0aG9kcyBvdGhlciB0aGFuIGZpbmRCeVByaW1hcnlLZXkgaGF2ZSBiZWVuIGRlZmluZWQKLQlmb3IgdGhlIGVudGl0eSBiZWFuLgotCi0JVGhlIG90aGVyIGVsZW1lbnRzIHRoYXQgYXJlIG9wdGlvbmFsIGFyZSAib3B0aW9uYWwiIGluIHRoZQotCXNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbQotCWFyZSBlbXB0eS4KLQotCUF0IGxlYXN0IG9uZSBjbXAtZmllbGQgZWxlbWVudCBtdXN0IGJlIHByZXNlbnQgaW4gdGhlCi0JZGVzY3JpcHRvciBpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kCi0JdGhlIGNtcC12ZXJzaW9uIGlzIDEueCwgYW5kIG5vbmUgbXVzdCBub3QgYmUgcHJlc2VudCBpZiB0aGUKLQllbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIEJlYW4uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaG9tZSIKLQkJICAgdHlwZT0iajJlZTpob21lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVtb3RlIgotCQkgICB0eXBlPSJqMmVlOnJlbW90ZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsLWhvbWUiCi0JCSAgIHR5cGU9ImoyZWU6bG9jYWwtaG9tZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsIgotCQkgICB0eXBlPSJqMmVlOmxvY2FsVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmVqYi1jbGFzc1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS10eXBlIgotCQkgICB0eXBlPSJqMmVlOnBlcnNpc3RlbmNlLXR5cGVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbS1rZXktY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwcmltLWtleS1jbGFzcyBlbGVtZW50IGNvbnRhaW5zIHRoZQotCSAgICBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiBhbgotCSAgICBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzLgotCi0JICAgIElmIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBpcwotCSAgICBkZWZlcnJlZCB0byBkZXBsb3ltZW50IHRpbWUsIHRoZSBwcmltLWtleS1jbGFzcwotCSAgICBlbGVtZW50IHNob3VsZCBzcGVjaWZ5IGphdmEubGFuZy5PYmplY3QuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVlbnRyYW50IgotCQkgICB0eXBlPSJqMmVlOnRydWUtZmFsc2VUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHJlZW50cmFudCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGFuIGVudGl0eQotCSAgICBiZWFuIGlzIHJlZW50cmFudCBvciBub3QuCi0KLQkgICAgVGhlIHJlZW50cmFudCBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28KLQkgICAgZm9sbG93aW5nOiB0cnVlIG9yIGZhbHNlCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21wLXZlcnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6Y21wLXZlcnNpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhYnN0cmFjdC1zY2hlbWEtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpqYXZhLWlkZW50aWZpZXJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgICAgb2YgdGhlIGFic3RyYWN0IHNjaGVtYSB0eXBlIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLQkgICAgY21wLXZlcnNpb24gMi54LiBJdCBpcyB1c2VkIGluIEVKQiBRTCBxdWVyaWVzLgotCi0JICAgIEZvciBleGFtcGxlLCB0aGUgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZm9yIGFuIGVudGl0eQotCSAgICBiZWFuIHdob3NlIGxvY2FsIGludGVyZmFjZSBpcwotCSAgICBjb20uYWNtZS5jb21tZXJjZS5PcmRlciBtaWdodCBiZSBPcmRlci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbXAtZmllbGQiCi0JCSAgIHR5cGU9ImoyZWU6Y21wLWZpZWxkVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1rZXktZmllbGQiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcHJpbWtleS1maWVsZCBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUKLQkgICAgbmFtZSBvZiB0aGUgcHJpbWFyeSBrZXkgZmllbGQgZm9yIGFuIGVudGl0eSB3aXRoCi0JICAgIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLgotCi0JICAgIFRoZSBwcmlta2V5LWZpZWxkIG11c3QgYmUgb25lIG9mIHRoZSBmaWVsZHMgZGVjbGFyZWQKLQkgICAgaW4gdGhlIGNtcC1maWVsZCBlbGVtZW50LCBhbmQgdGhlIHR5cGUgb2YgdGhlIGZpZWxkCi0JICAgIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIHByaW1hcnkga2V5IHR5cGUuCi0KLQkgICAgVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyBub3QgdXNlZCBpZiB0aGUgcHJpbWFyeQotCSAgICBrZXkgbWFwcyB0byBtdWx0aXBsZSBjb250YWluZXItbWFuYWdlZCBmaWVsZHMKLQkgICAgKGkuZS4gdGhlIGtleSBpcyBhIGNvbXBvdW5kIGtleSkuIEluIHRoaXMgY2FzZSwgdGhlCi0JICAgIGZpZWxkcyBvZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBwdWJsaWMsIGFuZAotCSAgICB0aGVpciBuYW1lcyBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIGZpZWxkIG5hbWVzIG9mCi0JICAgIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyB0aGF0IGNvbXByaXNlIHRoZSBrZXkuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpqbmRpRW52aXJvbm1lbnRSZWZzR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlLXJlZiIKLQkJICAgdHlwZT0iajJlZTpzZWN1cml0eS1yb2xlLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1pZGVudGl0eSIKLQkJICAgdHlwZT0iajJlZTpzZWN1cml0eS1pZGVudGl0eVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IgotCQkgICB0eXBlPSJqMmVlOnF1ZXJ5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImV4Y2x1ZGUtbGlzdFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBleGNsdWRlLWxpc3RUeXBlIHNwZWNpZmllcyBvbmUgb3IgbW9yZSBtZXRob2RzIHdoaWNoCi0JdGhlIEFzc2VtYmxlciBtYXJrcyB0byBiZSB1bmNhbGxhYmxlLgotCi0JSWYgdGhlIG1ldGhvZCBwZXJtaXNzaW9uIHJlbGF0aW9uIGNvbnRhaW5zIG1ldGhvZHMgdGhhdCBhcmUKLQlpbiB0aGUgZXhjbHVkZSBsaXN0LCB0aGUgRGVwbG95ZXIgc2hvdWxkIGNvbnNpZGVyIHRob3NlCi0JbWV0aG9kcyB0byBiZSB1bmNhbGxhYmxlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIKLQkJICAgdHlwZT0iajJlZTptZXRob2RUeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZHJpdmVuLWJlYW5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWVzc2FnZS1kcml2ZW4gZWxlbWVudCBkZWNsYXJlcyBhIG1lc3NhZ2UtZHJpdmVuCi0JYmVhbi4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQkgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLQkgICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0JICAgICAgaWNvbiBmaWxlIG5hbWUuCi0JICAgIC0gYSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4gaW4KLQkgICAgICB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JICAgIC0gdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnaW5nCi0JICAgICAgdHlwZQotCSAgICAtIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotCSAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZQotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLQkgICAgICBtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzCi0JICAgICAgYWN0aXZhdGlvbiBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50Ci0JICAgICAgZW50cmllcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGxvY2FsIEVKQgotCSAgICAgIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHdlYiBzZXJ2aWNlCi0JICAgICAgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eQotCSAgICAgIGlkZW50aXR5IHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncwotCSAgICAgIG1ldGhvZHMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0JICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkKLQkgICAgICByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotCSAgICAgIGVudmlyb25tZW50IHJlZmVyZW5jZXMuCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdlCi0JICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmVqYi1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTplamItY2xhc3NUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnaW5nLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIG1lc3NhZ2luZy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtZXNzYWdlCi0JICAgIGxpc3RlbmVyIGludGVyZmFjZSBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbi4gSWYKLQkgICAgdGhlIG1lc3NhZ2luZy10eXBlIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgaXQgaXMKLQkgICAgYXNzdW1lZCB0byBiZSBqYXZheC5qbXMuTWVzc2FnZUxpc3RlbmVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zYWN0aW9uLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6dHJhbnNhY3Rpb24tdHlwZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rIgotCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb24tY29uZmlnIgotCQkgICB0eXBlPSJqMmVlOmFjdGl2YXRpb24tY29uZmlnVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpqbmRpRW52aXJvbm1lbnRSZWZzR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1pZGVudGl0eSIKLQkJICAgdHlwZT0iajJlZTpzZWN1cml0eS1pZGVudGl0eVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1pbnRmVHlwZSI+Ci0KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWV0aG9kLWludGYgZWxlbWVudCBhbGxvd3MgYSBtZXRob2QgZWxlbWVudCB0bwotCWRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kCi0Jc2lnbmF0dXJlIHRoYXQgYXJlIG11bHRpcGx5IGRlZmluZWQgYWNyb3NzIHRoZSBob21lIGFuZAotCWNvbXBvbmVudCBpbnRlcmZhY2VzIChlLmcsIGluIGJvdGggYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLQlyZW1vdGUgYW5kIGxvY2FsIGludGVyZmFjZXMgb3IgaW4gYm90aCBhbiBlbnRlcnByaXNlIGJlYW4ncwotCWhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLCBldGMuKTsgdGhlIGNvbXBvbmVudCBhbmQgd2ViCi0Jc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzLCBhbmQgc28gb24uCi0KLQlUaGUgbWV0aG9kLWludGYgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0JICAgIEhvbWUKLQkgICAgUmVtb3RlCi0JICAgIExvY2FsSG9tZQotCSAgICBMb2NhbAotCSAgICBTZXJ2aWNlRW5kcG9pbnQKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvbWUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdGUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbEhvbWUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZpY2VFbmRwb2ludCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1ldGhvZC1uYW1lVHlwZSBjb250YWlucyBhIG5hbWUgb2YgYW4gZW50ZXJwcmlzZQotCWJlYW4gbWV0aG9kIG9yIHRoZSBhc3RlcmlzayAoKikgY2hhcmFjdGVyLiBUaGUgYXN0ZXJpc2sgaXMKLQl1c2VkIHdoZW4gdGhlIGVsZW1lbnQgZGVub3RlcyBhbGwgdGhlIG1ldGhvZHMgb2YgYW4KLQllbnRlcnByaXNlIGJlYW4ncyBjbGllbnQgdmlldyBpbnRlcmZhY2VzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtcGFyYW1zVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1ldGhvZC1wYXJhbXNUeXBlIGRlZmluZXMgYSBsaXN0IG9mIHRoZQotCWZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZXMgb2YgdGhlIG1ldGhvZCBwYXJhbWV0ZXJzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wYXJhbSIKLQkJICAgdHlwZT0iajJlZTpqYXZhLXR5cGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIG1ldGhvZC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgcHJpbWl0aXZlCi0JICAgIG9yIGEgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBuYW1lIG9mIGEgbWV0aG9kCi0JICAgIHBhcmFtZXRlci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtcGVybWlzc2lvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtZXRob2QtcGVybWlzc2lvblR5cGUgc3BlY2lmaWVzIHRoYXQgb25lIG9yIG1vcmUKLQlzZWN1cml0eSByb2xlcyBhcmUgYWxsb3dlZCB0byBpbnZva2Ugb25lIG9yIG1vcmUgZW50ZXJwcmlzZQotCWJlYW4gbWV0aG9kcy4gVGhlIG1ldGhvZC1wZXJtaXNzaW9uVHlwZSBjb25zaXN0cyBvZiBhbgotCW9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhIGxpc3Qgb2Ygc2VjdXJpdHkgcm9sZSBuYW1lcyBvciBhbgotCWluZGljYXRvciB0byBzdGF0ZSB0aGF0IHRoZSBtZXRob2QgaXMgdW5jaGVja2VkIGZvcgotCWF1dGhvcml6YXRpb24sIGFuZCBhIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLgotCi0JVGhlIHNlY3VyaXR5IHJvbGVzIHVzZWQgaW4gdGhlIG1ldGhvZC1wZXJtaXNzaW9uVHlwZQotCW11c3QgYmUgZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZSBlbGVtZW50cyBvZiB0aGUKLQlkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGFuZCB0aGUgbWV0aG9kcyBtdXN0IGJlIG1ldGhvZHMKLQlkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBob21lLCBjb21wb25lbnQgYW5kL29yIHdlYgotCXNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiCi0JCSAgICAgdHlwZT0iajJlZTpyb2xlLW5hbWVUeXBlIgotCQkgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JPHhzZDplbGVtZW50IG5hbWU9InVuY2hlY2tlZCIKLQkJICAgICB0eXBlPSJqMmVlOmVtcHR5VHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSB1bmNoZWNrZWQgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCBhIG1ldGhvZCBpcwotCSAgICAgIG5vdCBjaGVja2VkIGZvciBhdXRob3JpemF0aW9uIGJ5IHRoZSBjb250YWluZXIKLQkgICAgICBwcmlvciB0byBpbnZvY2F0aW9uIG9mIHRoZSBtZXRob2QuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QiCi0JCSAgIHR5cGU9ImoyZWU6bWV0aG9kVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBtZXRob2RUeXBlIGlzIHVzZWQgdG8gZGVub3RlIGEgbWV0aG9kIG9mIGFuIGVudGVycHJpc2UKLQkgIGJlYW4ncyBob21lLCBjb21wb25lbnQsIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludAotCSAgaW50ZXJmYWNlLCBvciwgaW4gdGhlIGNhc2Ugb2YgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLCB0aGUKLQkgIGJlYW4ncyBtZXNzYWdlIGxpc3RlbmVyIG1ldGhvZCwgb3IgYSBzZXQgb2Ygc3VjaAotCSAgbWV0aG9kcy4gVGhlIGVqYi1uYW1lIGVsZW1lbnQgbXVzdCBiZSB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlCi0JICBlbnRlcnByaXNlIGJlYW5zIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3I7IHRoZQotCSAgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBhbGxvd3MgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhCi0JICBtZXRob2Qgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgdGhhdCBpcyBtdWx0aXBseSBkZWZpbmVkCi0JICBhY3Jvc3MgdGhlIGhvbWUsIGNvbXBvbmVudCwgYW5kL29yIHdlYiBzZXJ2aWNlIGVuZHBvaW50Ci0JICBpbnRlcmZhY2VzOyB0aGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1ldGhvZAotCSAgbmFtZTsgYW5kIHRoZSBvcHRpb25hbCBtZXRob2QtcGFyYW1zIGVsZW1lbnRzIGlkZW50aWZ5IGEKLQkgIHNpbmdsZSBtZXRob2QgYW1vbmcgbXVsdGlwbGUgbWV0aG9kcyB3aXRoIGFuIG92ZXJsb2FkZWQKLQkgIG1ldGhvZCBuYW1lLgotCi0JICBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgc3R5bGVzIG9mIHVzaW5nIG1ldGhvZFR5cGUgZWxlbWVudAotCSAgd2l0aGluIGEgbWV0aG9kIGVsZW1lbnQ6Ci0KLQkgIDEuCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+Ci0JICA8L21ldGhvZD4KLQotCSAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUKLQkgICAgIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4ncyBob21lLCBjb21wb25lbnQsIGFuZC9vciB3ZWIKLQkgICAgIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcy4KLQotCSAgMi4KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtbmFtZT5NRVRIT0Q8L21ldGhvZC1uYW1lPgotCSAgPC9tZXRob2Q+Ci0KLQkgICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byB0aGUgc3BlY2lmaWVkIG1ldGhvZCBvZgotCSAgICAgdGhlIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4uIElmIHRoZXJlIGFyZSBtdWx0aXBsZQotCSAgICAgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG92ZXJsb2FkZWQgbmFtZSwgdGhlIGVsZW1lbnQgb2YKLQkgICAgIHRoaXMgc3R5bGUgcmVmZXJzIHRvIGFsbCB0aGUgbWV0aG9kcyB3aXRoIHRoZSBvdmVybG9hZGVkCi0JICAgICBuYW1lLgotCi0JICAzLgotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0JCSAgPG1ldGhvZC1wYXJhbT5QQVJBTS0xPC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5QQVJBTS0yPC9tZXRob2QtcGFyYW0+Ci0JCSAgLi4uCi0JCSAgPG1ldGhvZC1wYXJhbT5QQVJBTS1uPC9tZXRob2QtcGFyYW0+Ci0JICAgICAgPC9tZXRob2QtcGFyYW1zPgotCSAgPC9tZXRob2Q+Ci0KLQkgICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhIHNpbmdsZSBtZXRob2Qgd2l0aGluIGEKLQkgICAgIHNldCBvZiBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZCBuYW1lLiBQQVJBTS0xIHRocm91Z2gKLQkgICAgIFBBUkFNLW4gYXJlIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlcyBvZiB0aGUKLQkgICAgIG1ldGhvZCdzIGlucHV0IHBhcmFtZXRlcnMgKGlmIHRoZSBtZXRob2QgaGFzIG5vIGlucHV0Ci0JICAgICBhcmd1bWVudHMsIHRoZSBtZXRob2QtcGFyYW1zIGVsZW1lbnQgY29udGFpbnMgbm8KLQkgICAgIG1ldGhvZC1wYXJhbSBlbGVtZW50cykuIEFycmF5cyBhcmUgc3BlY2lmaWVkIGJ5IHRoZQotCSAgICAgYXJyYXkgZWxlbWVudCdzIHR5cGUsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBhaXIgb2YKLQkgICAgIHNxdWFyZSBicmFja2V0cyAoZS5nLiBpbnRbXVtdKS4gSWYgdGhlcmUgYXJlIG11bHRpcGxlCi0JICAgICBtZXRob2RzIHdpdGggdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGlzIHN0eWxlIHJlZmVycwotCSAgICAgdG8gYWxsIG9mIHRoZSBvdmVybG9hZGVkIG1ldGhvZHMuCi0KLQkgIEV4YW1wbGVzOgotCi0JICBTdHlsZSAxOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlCi0JICBtZXRob2RzIG9mIHRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUsIGNvbXBvbmVudCwKLQkgIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzOgotCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtbmFtZT4qPC9tZXRob2QtbmFtZT4KLQkgIDwvbWV0aG9kPgotCi0JICBTdHlsZSAyOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlCi0JICBjcmVhdGUgbWV0aG9kcyBvZiB0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lCi0JICBpbnRlcmZhY2UocykuCi0KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0JICA8L21ldGhvZD4KLQotCSAgU3R5bGUgMzogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gdGhlCi0JICBjcmVhdGUoU3RyaW5nIGZpcnN0TmFtZSwgU3RyaW5nIExhc3ROYW1lKSBtZXRob2Qgb2YgdGhlCi0JICBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlKHMpLgotCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotCSAgICAgIDxtZXRob2QtcGFyYW1zPgotCQkgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCQkgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCSAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLQkgIDwvbWV0aG9kPgotCi0JICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgYSBTdHlsZSAzIGVsZW1lbnQgd2l0aAotCSAgbW9yZSBjb21wbGV4IHBhcmFtZXRlciB0eXBlcy4gVGhlIG1ldGhvZAotCSAgZm9vYmFyKGNoYXIgcywgaW50IGksIGludFtdIGlhciwgbXlwYWNrYWdlLk15Q2xhc3MgbXljbCwKLQkgIG15cGFja2FnZS5NeUNsYXNzW11bXSBteWNsYWFyKSB3b3VsZCBiZSBzcGVjaWZpZWQgYXM6Ci0KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1uYW1lPmZvb2JhcjwvbWV0aG9kLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0JCSAgPG1ldGhvZC1wYXJhbT5jaGFyPC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5pbnQ8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPmludFtdPC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5teXBhY2thZ2UuTXlDbGFzczwvbWV0aG9kLXBhcmFtPgotCQkgIDxtZXRob2QtcGFyYW0+bXlwYWNrYWdlLk15Q2xhc3NbXVtdPC9tZXRob2QtcGFyYW0+Ci0JICAgICAgPC9tZXRob2QtcGFyYW1zPgotCSAgPC9tZXRob2Q+Ci0KLQkgIFRoZSBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGNhbiBiZSB1c2VkIHdoZW4gaXQgYmVjb21lcwotCSAgbmVjZXNzYXJ5IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhIG1ldGhvZCB0aGF0IGlzIG11bHRpcGx5Ci0JICBkZWZpbmVkIGFjcm9zcyB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSwgY29tcG9uZW50LCBhbmQvb3IKLQkgIHdlYiBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZAotCSAgc2lnbmF0dXJlLgotCi0JICBGb3IgZXhhbXBsZSwgdGhlIG1ldGhvZCBlbGVtZW50Ci0KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0JICAgICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JICAgICAgPC9tZXRob2QtcGFyYW1zPgotCSAgPC9tZXRob2Q+Ci0KLQkgIGNhbiBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykKLQkgIG1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlIGZyb20gdGhlCi0JICBjcmVhdGUoU3RyaW5nLCBTdHJpbmcpIG1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaG9tZQotCSAgaW50ZXJmYWNlLCB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotCSAgICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotCSAgICAgIDxtZXRob2QtcGFyYW1zPgotCQkgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCQkgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCSAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLQkgIDwvbWV0aG9kPgotCi0JICBhbmQgdGhlIGNyZWF0ZSBtZXRob2QgdGhhdCBpcyBkZWZpbmVkIGluIHRoZSBsb2NhbCBob21lCi0JICBpbnRlcmZhY2Ugd2hpY2ggd291bGQgYmUgZGVmaW5lZCBhcwotCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotCSAgICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotCSAgICAgIDxtZXRob2QtcGFyYW1zPgotCQkgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCQkgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCSAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLQkgIDwvbWV0aG9kPgotCi0JICBUaGUgbWV0aG9kLWludGYgZWxlbWVudCBjYW4gYmUgdXNlZCB3aXRoIGFsbCB0aCByZWUgU3R5bGVzCi0JICBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgdXNhZ2UuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nCi0JICBtZXRob2QgZWxlbWVudCBleGFtcGxlIGNvdWxkIGJlIHVzZWQgdG8gcmVmZXIgdG8gYWxsIHRoZQotCSAgbWV0aG9kcyBvZiB0aGUgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyByZW1vdGUgaG9tZSBpbnRlcmZhY2UuCi0KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotCSAgICAgIDxtZXRob2QtbmFtZT4qPC9tZXRob2QtbmFtZT4KLQkgIDwvbWV0aG9kPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLWludGYiCi0JCSAgIHR5cGU9ImoyZWU6bWV0aG9kLWludGZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtbmFtZSIKLQkJICAgdHlwZT0iajJlZTptZXRob2QtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtcGFyYW1zIgotCQkgICB0eXBlPSJqMmVlOm1ldGhvZC1wYXJhbXNUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtdWx0aXBsaWNpdHlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbXVsdGlwbGljaXR5VHlwZSBkZXNjcmliZXMgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUKLQlyb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb24uCi0KLQlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQkgICAgT25lCi0JICAgIE1hbnkKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9uZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbnkiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHBlcnNpc3RlbmNlLXR5cGVUeXBlIHNwZWNpZmllcyBhbiBlbnRpdHkgYmVhbidzIHBlcnNpc3RlbmNlCi0JbWFuYWdlbWVudCB0eXBlLgotCi0JVGhlIHBlcnNpc3RlbmNlLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCSAgICBCZWFuCi0JICAgIENvbnRhaW5lcgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVhbiIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lciIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LW1ldGhvZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIHF1ZXJ5LW1ldGhvZCBzcGVjaWZpZXMgdGhlIG1ldGhvZCBmb3IgYSBmaW5kZXIgb3Igc2VsZWN0Ci0JICBxdWVyeS4KLQotCSAgVGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgZmluZGVyIG9yIHNlbGVjdAotCSAgbWV0aG9kIGluIHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzLgotCi0JICBFYWNoIG1ldGhvZC1wYXJhbSBtdXN0IGJlIGRlZmluZWQgZm9yIGEgcXVlcnktbWV0aG9kIHVzaW5nIHRoZQotCSAgbWV0aG9kLXBhcmFtcyBlbGVtZW50LgotCi0JICBJdCBpcyB1c2VkIGJ5IHRoZSBxdWVyeS1tZXRob2QgZWxlbWVudC4KLQotCSAgRXhhbXBsZToKLQotCSAgPHF1ZXJ5PgotCSAgICAgIDxkZXNjcmlwdGlvbj5NZXRob2QgZmluZHMgbGFyZ2Ugb3JkZXJzPC9kZXNjcmlwdGlvbj4KLQkgICAgICA8cXVlcnktbWV0aG9kPgotCQkgIDxtZXRob2QtbmFtZT5maW5kTGFyZ2VPcmRlcnM8L21ldGhvZC1uYW1lPgotCQkgIDxtZXRob2QtcGFyYW1zPjwvbWV0aG9kLXBhcmFtcz4KLQkgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLQkgICAgICA8ZWpiLXFsPgotCQlTRUxFQ1QgT0JKRUNUKG8pIEZST00gT3JkZXIgbwotCQkgIFdIRVJFIG8uYW1vdW50ICZndDsgMTAwMAotCSAgICAgIDwvZWpiLXFsPgotCSAgPC9xdWVyeT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1uYW1lIgotCQkgICB0eXBlPSJqMmVlOm1ldGhvZC1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wYXJhbXMiCi0JCSAgIHR5cGU9ImoyZWU6bWV0aG9kLXBhcmFtc1R5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBxdWVyeVR5cGUgZGVmaW5lcyBhIGZpbmRlciBvciBzZWxlY3QKLQlxdWVyeS4gSXQgY29udGFpbnMKLQkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgcXVlcnkKLQkgICAgLSB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmluZGVyIG9yIHNlbGVjdAotCSAgICAgIG1ldGhvZCBpdCBpcyB1c2VkIGJ5Ci0JCS0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgcmVzdWx0IHR5cGUKLQkJICBtYXBwaW5nLCBpZiB0aGUgcXVlcnkgaXMgZm9yIGEgc2VsZWN0IG1ldGhvZAotCQkgIGFuZCBlbnRpdHkgb2JqZWN0cyBhcmUgcmV0dXJuZWQuCi0JCS0gdGhlIEVKQiBRTCBxdWVyeSBzdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBxdWVyeS4KLQotCVF1ZXJpZXMgdGhhdCBhcmUgZXhwcmVzc2libGUgaW4gRUpCIFFMIG11c3QgdXNlIHRoZSBlamItcWwKLQllbGVtZW50IHRvIHNwZWNpZnkgdGhlIHF1ZXJ5LiBJZiBhIHF1ZXJ5IGlzIG5vdCBleHByZXNzaWJsZQotCWluIEVKQiBRTCwgdGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGJlIHVzZWQgdG8KLQlkZXNjcmliZSB0aGUgc2VtYW50aWNzIG9mIHRoZSBxdWVyeSBhbmQgdGhlIGVqYi1xbCBlbGVtZW50Ci0Jc2hvdWxkIGJlIGVtcHR5LgotCi0JVGhlIHJlc3VsdC10eXBlLW1hcHBpbmcgaXMgYW4gb3B0aW9uYWwgZWxlbWVudC4gSXQgY2FuIG9ubHkKLQliZSBwcmVzZW50IGlmIHRoZSBxdWVyeS1tZXRob2Qgc3BlY2lmaWVzIGEgc2VsZWN0IG1ldGhvZAotCXRoYXQgcmV0dXJucyBlbnRpdHkgb2JqZWN0cy4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUKLQlyZXN1bHQtdHlwZS1tYXBwaW5nIGVsZW1lbnQgaXMgIkxvY2FsIi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5LW1ldGhvZCIKLQkJICAgdHlwZT0iajJlZTpxdWVyeS1tZXRob2RUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzdWx0LXR5cGUtbWFwcGluZyIKLQkJICAgdHlwZT0iajJlZTpyZXN1bHQtdHlwZS1tYXBwaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXFsIgotCQkgICB0eXBlPSJqMmVlOnhzZFN0cmluZ1R5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlVHlwZSBkZXNpZ25hdGVzIHRoZSBzb3VyY2Ugb2YgYQotCXJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbnNoaXAuIEEKLQlyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIGlzIHVzZWQgYnkKLQlyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudHMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYW4KLQllbnRpdHkgYmVhbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLQkJICAgdHlwZT0iajJlZTplamItbmFtZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbnNoaXBzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHJlbGF0aW9uc2hpcHNUeXBlIGRlc2NyaWJlcyB0aGUgcmVsYXRpb25zaGlwcyBpbgotCXdoaWNoIGVudGl0eSBiZWFucyB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlCi0JcGFydGljaXBhdGUuIFRoZSByZWxhdGlvbnNoaXBzVHlwZSBjb250YWlucyBhbiBvcHRpb25hbAotCWRlc2NyaXB0aW9uOyBhbmQgYSBsaXN0IG9mIGVqYi1yZWxhdGlvbiBlbGVtZW50cywgd2hpY2gKLQlzcGVjaWZ5IHRoZSBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWxhdGlvbiIKLQkJICAgdHlwZT0iajJlZTplamItcmVsYXRpb25UeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJyb2xlLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0JICAgICAgcmVsYXRpb25zaGlwIHJvbGUuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotCSAgICAgIGEgcmVsYXRpb25zaGlwLCBidXQgY2FuIGJlIHJldXNlZCBpbiBkaWZmZXJlbnQKLQkgICAgICByZWxhdGlvbnNoaXBzLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvcgotCSAgICAgICB4cGF0aD0iLi8vajJlZTplamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSIvPgotCSAgPHhzZDpmaWVsZAotCSAgICAgICB4cGF0aD0iLiIvPgotCTwveHNkOnVuaXF1ZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzdWx0LXR5cGUtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSByZXN1bHQtdHlwZS1tYXBwaW5nVHlwZSBpcyB1c2VkIGluIHRoZSBxdWVyeSBlbGVtZW50IHRvCi0Jc3BlY2lmeSB3aGV0aGVyIGFuIGFic3RyYWN0IHNjaGVtYSB0eXBlIHJldHVybmVkIGJ5IGEgcXVlcnkKLQlmb3IgYSBzZWxlY3QgbWV0aG9kIGlzIHRvIGJlIG1hcHBlZCB0byBhbiBFSkJMb2NhbE9iamVjdCBvcgotCUVKQk9iamVjdCB0eXBlLgotCi0JVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLQkgICAgTG9jYWwKLQkgICAgUmVtb3RlCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW90ZSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LWlkZW50aXR5VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlY3VyaXR5LWlkZW50aXR5VHlwZSBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2FsbGVyJ3MKLQlzZWN1cml0eSBpZGVudGl0eSBpcyB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZQotCW1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgYmVhbiBvciB3aGV0aGVyIGEgc3BlY2lmaWMgcnVuLWFzCi0JaWRlbnRpdHkgaXMgdG8gYmUgdXNlZC4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQlhbmQgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0JPHhzZDplbGVtZW50IG5hbWU9InVzZS1jYWxsZXItaWRlbnRpdHkiCi0JCSAgICAgdHlwZT0iajJlZTplbXB0eVR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgdXNlLWNhbGxlci1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB0aGF0Ci0JICAgICAgdGhlIGNhbGxlcidzIHNlY3VyaXR5IGlkZW50aXR5IGJlIHVzZWQgYXMgdGhlCi0JICAgICAgc2VjdXJpdHkgaWRlbnRpdHkgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlCi0JICAgICAgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kcy4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJydW4tYXMiCi0JCSAgICAgdHlwZT0iajJlZTpydW4tYXNUeXBlIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbi1iZWFuVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlc3Npb24tYmVhblR5cGUgZGVjbGFyZXMgYW4gc2Vzc2lvbiBiZWFuLiBUaGUKLQlkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLQotCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0JICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZQotCSAgICAgIGljb24gZmlsZSBuYW1lCi0JICAgIC0gYSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4KLQkgICAgICBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdGlvbgotCSAgICAtIHRoZSBuYW1lcyBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIGhvbWUgYW5kCi0JICAgICAgcmVtb3RlIGludGVyZmFjZXMsIGlmIGFueQotCSAgICAtIHRoZSBuYW1lcyBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgbG9jYWwgaG9tZSBhbmQKLQkgICAgICBsb2NhbCBpbnRlcmZhY2VzLCBpZiBhbnkKLQkgICAgLSB0aGUgbmFtZSBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3Mgd2ViIHNlcnZpY2UgZW5kcG9pbnQKLQkgICAgICBpbnRlcmZhY2UsIGlmIGFueQotCSAgICAtIHRoZSBzZXNzaW9uIGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcwotCSAgICAtIHRoZSBzZXNzaW9uIGJlYW4ncyBzdGF0ZSBtYW5hZ2VtZW50IHR5cGUKLQkgICAgLSB0aGUgc2Vzc2lvbiBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotCSAgICAgIGVudmlyb25tZW50IGVudHJpZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQiByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbAotCSAgICAgIEVKQiByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB3ZWIKLQkgICAgICBzZXJ2aWNlIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZQotCSAgICAgIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkKLQkgICAgICB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UKLQkgICAgICBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotCSAgICAgIGVudmlyb25tZW50IHJlZmVyZW5jZXMuCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdlCi0JICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcwotCi0JVGhlIGVsZW1lbnRzIHRoYXQgYXJlIG9wdGlvbmFsIGFyZSAib3B0aW9uYWwiIGluIHRoZSBzZW5zZQotCXRoYXQgdGhleSBhcmUgb21pdHRlZCB3aGVuIGlmIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlCi0JZW1wdHkuCi0KLQlFaXRoZXIgYm90aCB0aGUgbG9jYWwtaG9tZSBhbmQgdGhlIGxvY2FsIGVsZW1lbnRzIG9yIGJvdGgKLQl0aGUgaG9tZSBhbmQgdGhlIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgdGhlCi0Jc2Vzc2lvbiBiZWFuLgotCi0JVGhlIHNlcnZpY2UtZW5kcG9pbnQgZWxlbWVudCBtYXkgb25seSBiZSBzcGVjaWZpZWQgaWYgdGhlCi0JYmVhbiBpcyBhIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW4uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaG9tZSIKLQkJICAgdHlwZT0iajJlZTpob21lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVtb3RlIgotCQkgICB0eXBlPSJqMmVlOnJlbW90ZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsLWhvbWUiCi0JCSAgIHR5cGU9ImoyZWU6bG9jYWwtaG9tZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsIgotCQkgICB0eXBlPSJqMmVlOmxvY2FsVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1lbmRwb2ludCIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgc2VydmljZS1lbmRwb2ludCBlbGVtZW50IGNvbnRhaW5zIHRoZQotCSAgICBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3Mgd2ViCi0JICAgIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLiBUaGUgc2VydmljZS1lbmRwb2ludAotCSAgICBlbGVtZW50IG1heSBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYSBzdGF0ZWxlc3MKLQkgICAgc2Vzc2lvbiBiZWFuLiBUaGUgc3BlY2lmaWVkIGludGVyZmFjZSBtdXN0IGJlIGEKLQkgICAgdmFsaWQgSkFYLVJQQyBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLWNsYXNzVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tdHlwZSIKLQkJICAgdHlwZT0iajJlZTpzZXNzaW9uLXR5cGVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNhY3Rpb24tdHlwZSIKLQkJICAgdHlwZT0iajJlZTp0cmFuc2FjdGlvbi10eXBlVHlwZSIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6am5kaUVudmlyb25tZW50UmVmc0dyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZS1yZWYiCi0JCSAgIHR5cGU9ImoyZWU6c2VjdXJpdHktcm9sZS1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktaWRlbnRpdHkiCi0JCSAgIHR5cGU9ImoyZWU6c2VjdXJpdHktaWRlbnRpdHlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2Vzc2lvbi10eXBlVHlwZSBkZXNjcmliZXMgd2hldGhlciB0aGUgc2Vzc2lvbiBiZWFuIGlzIGEKLQlzdGF0ZWZ1bCBzZXNzaW9uIG9yIHN0YXRlbGVzcyBzZXNzaW9uLiBJdCBpcyB1c2VkIGJ5Ci0Jc2Vzc2lvbi10eXBlIGVsZW1lbnRzLgotCi0JVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JICAgIFN0YXRlZnVsCi0JICAgIFN0YXRlbGVzcwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3RhdGVmdWwiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZWxlc3MiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFucy1hdHRyaWJ1dGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdHJhbnMtYXR0cmlidXRlVHlwZSBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIgbXVzdAotCW1hbmFnZSB0aGUgdHJhbnNhY3Rpb24gYm91bmRhcmllcyB3aGVuIGRlbGVnYXRpbmcgYSBtZXRob2QKLQlpbnZvY2F0aW9uIHRvIGFuIGVudGVycHJpc2UgYmVhbidzIGJ1c2luZXNzIG1ldGhvZC4KLQotCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0JICAgIE5vdFN1cHBvcnRlZAotCSAgICBTdXBwb3J0cwotCSAgICBSZXF1aXJlZAotCSAgICBSZXF1aXJlc05ldwotCSAgICBNYW5kYXRvcnkKLQkgICAgTmV2ZXIKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFN1cHBvcnRlZCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN1cHBvcnRzIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZWQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSZXF1aXJlc05ldyIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik1hbmRhdG9yeSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5ldmVyIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNhY3Rpb24tdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0cmFuc2FjdGlvbi10eXBlVHlwZSBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLQl0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUuCi0KLQlUaGUgdHJhbnNhY3Rpb24tdHlwZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCSAgICBCZWFuCi0JICAgIENvbnRhaW5lcgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVhbiIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lciIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9lamItamFyXzNfMC54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2VqYi1qYXJfM18wLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyODI5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2VqYi1qYXJfM18wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI3MDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjMuMCI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpZWpiLWphcl8zXzAueHNkcwkxLjUxIDAyLzIzLzA2Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gICAgICBVLlMuQQotICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBWwotCi0JVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIEVKQiAzLjAgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCVRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZCAiTUVUQS1JTkYvZWpiLWphci54bWwiIGluCi0JdGhlIEVKQidzIGphciBmaWxlLiAgQWxsIEVKQiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUKLQl0aGUgZWpiLWphciBzY2hlbWEgYnkgdXNpbmcgdGhlIEphdmEgRUUgbmFtZXNwYWNlOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0KLQlhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0JdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8ZWpiLWphciB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0JICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLQkJICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvZWpiLWphcl8zXzAueHNkIgotCSAgICAgIHZlcnNpb249IjMuMCI+Ci0JICAgICAgLi4uCi0JICAgIDwvZWpiLWphcj4KLQotCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgotCXRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIHRoZQotCUphdmEgRUUgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9lamItamFyXzNfMC54c2QKLQotCV1dPgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSmF2YSBFRQotICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0gICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0Jc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLQlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLQl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLQlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImphdmFlZV81LnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWphciIgdHlwZT0iamF2YWVlOmVqYi1qYXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIGlzIHRoZSByb290IG9mIHRoZSBlamItamFyIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDprZXkgbmFtZT0iZWpiLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBlamItbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIGVudGVycHJpc2UKLQkgIGJlYW4uIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphciBmaWxlLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZW50ZXJwcmlzZS1iZWFucy8qIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZWpiLW5hbWUiLz4KLSAgICA8L3hzZDprZXk+Ci0KLSAgICA8eHNkOmtleXJlZiBuYW1lPSJlamItbmFtZS1yZWZlcmVuY2VzIgotCQlyZWZlcj0iamF2YWVlOmVqYi1uYW1lLWtleSI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUga2V5cmVmIGluZGljYXRlcyB0aGUgcmVmZXJlbmNlcyBmcm9tCi0JICByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgbXVzdCBiZSB0byBhIHNwZWNpZmljIGVqYi1uYW1lCi0JICBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgZW50ZXJwcmlzZS1iZWFucyBlbGVtZW50LgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yCi14cGF0aD0iLi8vamF2YWVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZS9qYXZhZWU6cmVsYXRpb25zaGlwLXJvbGUtc291cmNlIi8+Ci0gICAgICA8eHNkOmZpZWxkCi0JICAgeHBhdGg9ImphdmFlZTplamItbmFtZSIvPgotICAgIDwveHNkOmtleXJlZj4KLQotICAgIDx4c2Q6a2V5IG5hbWU9InJvbGUtbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgQSByb2xlLW5hbWUta2V5IGlzIHNwZWNpZmllZCB0byBhbGxvdyB0aGUgcmVmZXJlbmNlcwotCSAgZnJvbSB0aGUgc2VjdXJpdHktcm9sZS1yZWZzLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6YXNzZW1ibHktZGVzY3JpcHRvci9qYXZhZWU6c2VjdXJpdHktcm9sZSIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnJvbGUtbmFtZSIvPgotICAgIDwveHNkOmtleT4KLQotICAgIDx4c2Q6a2V5cmVmIG5hbWU9InJvbGUtbmFtZS1yZWZlcmVuY2VzIgotCQlyZWZlcj0iamF2YWVlOnJvbGUtbmFtZS1rZXkiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGtleXJlZiBpbmRpY2F0ZXMgdGhlIHJlZmVyZW5jZXMgZnJvbQotCSAgc2VjdXJpdHktcm9sZS1yZWYgdG8gYSBzcGVjaWZpZWQgcm9sZS1uYW1lLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZW50ZXJwcmlzZS1iZWFucy8qL2phdmFlZTpzZWN1cml0eS1yb2xlLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnJvbGUtbGluayIvPgotICAgIDwveHNkOmtleXJlZj4KLSAgPC94c2Q6ZWxlbWVudD4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBuYW1lL3ZhbHVlCi0JY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBwYWlyIGZvciBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4uCi0KLQlUaGUgcHJvcGVydGllcyB0aGF0IGFyZSByZWNvZ25pemVkIGZvciBhIHBhcnRpY3VsYXIKLQltZXNzYWdlLWRyaXZlbiBiZWFuIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBtZXNzYWdpbmcgdHlwZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS1uYW1lIGVsZW1lbnQgY29udGFpbnMKLQkgICAgdGhlIG5hbWUgZm9yIGFuIGFjdGl2YXRpb24gY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBvZgotCSAgICBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4uCi0KLQkgICAgRm9yIEpNUyBtZXNzYWdlLWRyaXZlbiBiZWFucywgdGhlIGZvbGxvd2luZyBwcm9wZXJ0eQotCSAgICBuYW1lcyBhcmUgcmVjb2duaXplZDogYWNrbm93bGVkZ2VNb2RlLAotCSAgICBtZXNzYWdlU2VsZWN0b3IsIGRlc3RpbmF0aW9uVHlwZSwgc3Vic2NyaXB0aW9uRHVyYWJpbGl0eQotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5LXZhbHVlIgotCQkgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS12YWx1ZSBlbGVtZW50Ci0JICAgIGNvbnRhaW5zIHRoZSB2YWx1ZSBmb3IgYW4gYWN0aXZhdGlvbiBjb25maWd1cmF0aW9uCi0JICAgIHByb3BlcnR5IG9mIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhY3RpdmF0aW9uLWNvbmZpZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhY3RpdmF0aW9uLWNvbmZpZ1R5cGUgZGVmaW5lcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLQlleHBlY3RlZCBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4KLQlpbiBpdHMgb3BlcmF0aW9uYWwgZW52aXJvbm1lbnQuIFRoaXMgbWF5IGluY2x1ZGUgaW5mb3JtYXRpb24KLQlhYm91dCBtZXNzYWdlIGFja25vd2xlZGdlbWVudCwgbWVzc2FnZSBzZWxlY3RvciwgZXhwZWN0ZWQKLQlkZXN0aW5hdGlvbiB0eXBlLCBldGMuCi0KLQlUaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBleHByZXNzZWQgaW4gdGVybXMgb2YKLQluYW1lL3ZhbHVlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4KLQotCVRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlY29nbml6ZWQgZm9yIGEgcGFydGljdWxhcgotCW1lc3NhZ2UtZHJpdmVuIGJlYW4gYXJlIGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2luZyB0eXBlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHkiCi0JCSAgIHR5cGU9ImphdmFlZTphY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwbGljYXRpb24tZXhjZXB0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBhcHBsaWNhdGlvbi1leGNlcHRpb25UeXBlIGRlY2xhcmVzIGFuIGFwcGxpY2F0aW9uCi0gICAgICAgIGV4Y2VwdGlvbi4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0gICAgICAgICAgICAtIHRoZSBleGNlcHRpb24gY2xhc3MuIFdoZW4gdGhlIGNvbnRhaW5lciByZWNlaXZlcwotICAgICAgICAgICAgICBhbiBleGNlcHRpb24gb2YgdGhpcyB0eXBlLCBpdCBpcyByZXF1aXJlZCB0bwotICAgICAgICAgICAgICBmb3J3YXJkIHRoaXMgZXhjZXB0aW9uIGFzIGFuIGFwcGxjYXRpb24gZXhjZXB0aW9uCi0gICAgICAgICAgICAgIHRvIHRoZSBjbGllbnQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGEgY2hlY2tlZAotICAgICAgICAgICAgICBvciB1bmNoZWNrZWQgZXhjZXB0aW9uLgotICAgICAgICAgICAgLSBhbiBvcHRpb25hbCByb2xsYmFjayBlbGVtZW50LiBJZiB0aGlzIGVsZW1lbnQgaXMKLSAgICAgICAgICAgICAgc2V0IHRvIHRydWUsIHRoZSBjb250YWluZXIgbXVzdCByb2xsYmFjayB0aGUgY3VycmVudAotICAgICAgICAgICAgICB0cmFuc2FjdGlvbiBiZWZvcmUgZm9yd2FyZGluZyB0aGUgZXhjZXB0aW9uIHRvIHRoZQotICAgICAgICAgICAgICBjbGllbnQuICBJZiBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBmYWxzZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjZXB0aW9uLWNsYXNzIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGxiYWNrIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcm91bmQtaW52b2tlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBhcm91bmQtaW52b2tlIHR5cGUgc3BlY2lmaWVzIGEgbWV0aG9kIG9uIGEKLSAgICAgICAgY2xhc3MgdG8gYmUgY2FsbGVkIGR1cmluZyB0aGUgYXJvdW5kIGludm9rZSBwb3J0aW9uIG9mIGFuCi0gICAgICAgIGVqYiBpbnZvY2F0aW9uLiAgTm90ZSB0aGF0IGVhY2ggY2xhc3MgbWF5IGhhdmUgb25seSBvbmUKLSAgICAgICAgYXJvdW5kIGludm9rZSBtZXRob2QgYW5kIHRoYXQgdGhlIG1ldGhvZCBtYXkgbm90IGJlCi0gICAgICAgIG92ZXJsb2FkZWQuCi0KLSAgICAgICAgSWYgdGhlIGNsYXNzIGVsZW1lbnQgaXMgbWlzc2luZyB0aGVuCi0gICAgICAgIHRoZSBjbGFzcyBkZWZpbmluZyB0aGUgY2FsbGJhY2sgaXMgYXNzdW1lZCB0byBiZSB0aGUKLSAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3Mgb3IgY29tcG9uZW50IGNsYXNzIGluIHNjb3BlIGF0IHRoZQotICAgICAgICBsb2NhdGlvbiBpbiB0aGUgZGVzY3JpcHRvciBpbiB3aGljaCB0aGUgYXJvdW5kIGludm9rZQotICAgICAgICBkZWZpbml0aW9uIGFwcGVhcnMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1uYW1lIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhc3NlbWJseS1kZXNjcmlwdG9yVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGFzc2VtYmx5LWRlc2NyaXB0b3JUeXBlIGRlZmluZXMKLQlhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbi4KLQotCVRoZSBhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbiBjb25zaXN0cyBvZiB0aGUKLQlmb2xsb3dpbmcgcGFydHM6IHRoZSBkZWZpbml0aW9uIG9mIHNlY3VyaXR5IHJvbGVzLCB0aGUKLQlkZWZpbml0aW9uIG9mIG1ldGhvZCBwZXJtaXNzaW9ucywgdGhlIGRlZmluaXRpb24gb2YKLQl0cmFuc2FjdGlvbiBhdHRyaWJ1dGVzIGZvciBlbnRlcnByaXNlIGJlYW5zIHdpdGgKLQljb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiwgdGhlIGRlZmluaXRpb24KLSAgICAgICAgb2YgaW50ZXJjZXB0b3IgYmluZGluZ3MsIGEgbGlzdCBvZgotCW1ldGhvZHMgdG8gYmUgZXhjbHVkZWQgZnJvbSBiZWluZyBpbnZva2VkLCBhbmQgYSBsaXN0IG9mCi0gICAgICAgIGV4Y2VwdGlvbiB0eXBlcyB0aGF0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMuCi0KLQlBbGwgdGhlIHBhcnRzIGFyZSBvcHRpb25hbCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IGFyZQotCW9taXR0ZWQgaWYgdGhlIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlIGVtcHR5LgotCi0JUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQKLQlkZXNjcmlwdG9yIGlzIG9wdGlvbmFsIGZvciB0aGUgZWpiLWphciBmaWxlIHByb2R1Y2VyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUiCi0JCSAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1yb2xlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wZXJtaXNzaW9uIgotCQkgICB0eXBlPSJqYXZhZWU6bWV0aG9kLXBlcm1pc3Npb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXRyYW5zYWN0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6Y29udGFpbmVyLXRyYW5zYWN0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludGVyY2VwdG9yLWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmludGVyY2VwdG9yLWJpbmRpbmdUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtbGlzdCIKLQkJICAgdHlwZT0iamF2YWVlOmV4Y2x1ZGUtbGlzdFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFwcGxpY2F0aW9uLWV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YXBwbGljYXRpb24tZXhjZXB0aW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbXAtZmllbGRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgY21wLWZpZWxkVHlwZSBkZXNjcmliZXMgYSBjb250YWluZXItbWFuYWdlZCBmaWVsZC4gVGhlCi0JY21wLWZpZWxkVHlwZSBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZmllbGQsCi0JYW5kIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZC1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBmaWVsZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLQkgICAgY29udGFpbmVyIG1hbmFnZWQgZmllbGQuCi0KLQkgICAgVGhlIG5hbWUgb2YgdGhlIGNtcC1maWVsZCBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoCi0JICAgIGNtcC12ZXJzaW9uIDIueCBtdXN0IGJlZ2luIHdpdGggYSBsb3dlcmNhc2UKLQkgICAgbGV0dGVyLiBUaGlzIGZpZWxkIGlzIGFjY2Vzc2VkIGJ5IG1ldGhvZHMgd2hvc2UKLQkgICAgbmFtZXMgY29uc2lzdHMgb2YgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHNwZWNpZmllZCBieQotCSAgICBmaWVsZC1uYW1lIGluIHdoaWNoIHRoZSBmaXJzdCBsZXR0ZXIgaXMgdXBwZXJjYXNlZCwKLQkgICAgcHJlZml4ZWQgYnkgImdldCIgb3IgInNldCIuCi0KLQkgICAgVGhlIG5hbWUgb2YgdGhlIGNtcC1maWVsZCBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoCi0JICAgIGNtcC12ZXJzaW9uIDEueCBtdXN0IGRlbm90ZSBhIHB1YmxpYyBmaWVsZCBvZiB0aGUKLQkgICAgZW50ZXJwcmlzZSBiZWFuIGNsYXNzIG9yIG9uZSBvZiBpdHMgc3VwZXJjbGFzc2VzLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtcC12ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGNtcC12ZXJzaW9uVHlwZSBzcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgYW4gZW50aXR5IGJlYW4KLQl3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLiBJdCBpcyB1c2VkIGJ5Ci0JY21wLXZlcnNpb24gZWxlbWVudHMuCi0KLQlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQkgICAgMS54Ci0JICAgIDIueAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxLngiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyLngiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbXItZmllbGQtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBjbXItZmllbGQtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgY2xhc3Mgb2YgYQotCWNvbGxlY3Rpb24tdmFsdWVkIGxvZ2ljYWwgcmVsYXRpb25zaGlwIGZpZWxkIGluIHRoZSBlbnRpdHkKLQliZWFuIGNsYXNzLiBUaGUgdmFsdWUgb2YgYW4gZWxlbWVudCB1c2luZyBjbXItZmllbGQtdHlwZVR5cGUKLQltdXN0IGJlIGVpdGhlcjogamF2YS51dGlsLkNvbGxlY3Rpb24gb3IgamF2YS51dGlsLlNldC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS51dGlsLkNvbGxlY3Rpb24iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLnV0aWwuU2V0Ii8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY21yLWZpZWxkVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGNtci1maWVsZFR5cGUgZGVzY3JpYmVzIHRoZSBiZWFuIHByb3ZpZGVyJ3MgdmlldyBvZgotCWEgcmVsYXRpb25zaGlwLiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kCi0JdGhlIG5hbWUgYW5kIHRoZSBjbGFzcyB0eXBlIG9mIGEgZmllbGQgaW4gdGhlIHNvdXJjZSBvZiBhCi0Jcm9sZSBvZiBhIHJlbGF0aW9uc2hpcC4gVGhlIGNtci1maWVsZC1uYW1lIGVsZW1lbnQKLQljb3JyZXNwb25kcyB0byB0aGUgbmFtZSB1c2VkIGZvciB0aGUgZ2V0IGFuZCBzZXQgYWNjZXNzb3IKLQltZXRob2RzIGZvciB0aGUgcmVsYXRpb25zaGlwLiBUaGUgY21yLWZpZWxkLXR5cGUgZWxlbWVudCBpcwotCXVzZWQgb25seSBmb3IgY29sbGVjdGlvbi12YWx1ZWQgY21yLWZpZWxkcy4gSXQgc3BlY2lmaWVzIHRoZQotCXR5cGUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCBpcyB1c2VkLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY21yLWZpZWxkLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgY21yLWZpZWxkLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgICBsb2dpY2FsIHJlbGF0aW9uc2hpcCBmaWVsZCBpbiB0aGUgZW50aXR5IGJlYW4KLQkgICAgY2xhc3MuIFRoZSBuYW1lIG9mIHRoZSBjbXItZmllbGQgbXVzdCBiZWdpbiB3aXRoIGEKLQkgICAgbG93ZXJjYXNlIGxldHRlci4gVGhpcyBmaWVsZCBpcyBhY2Nlc3NlZCBieSBtZXRob2RzCi0JICAgIHdob3NlIG5hbWVzIGNvbnNpc3Qgb2YgdGhlIG5hbWUgb2YgdGhlIGZpZWxkCi0JICAgIHNwZWNpZmllZCBieSBjbXItZmllbGQtbmFtZSBpbiB3aGljaCB0aGUgZmlyc3QKLQkgICAgbGV0dGVyIGlzIHVwcGVyY2FzZWQsIHByZWZpeGVkIGJ5ICJnZXQiIG9yICJzZXQiLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNtci1maWVsZC10eXBlIgotCQkgICB0eXBlPSJqYXZhZWU6Y21yLWZpZWxkLXR5cGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb250YWluZXItdHJhbnNhY3Rpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgY29udGFpbmVyLXRyYW5zYWN0aW9uVHlwZSBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIKLQltdXN0IG1hbmFnZSB0cmFuc2FjdGlvbiBzY29wZXMgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4ncwotCW1ldGhvZCBpbnZvY2F0aW9ucy4gSXQgZGVmaW5lcyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYQotCWxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLCBhbmQgYSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUuIFRoZQotCXRyYW5zYWN0aW9uIGF0dHJpYnV0ZSBpcyB0byBiZSBhcHBsaWVkIHRvIGFsbCB0aGUgc3BlY2lmaWVkCi0JbWV0aG9kcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIKLQkJICAgdHlwZT0iamF2YWVlOm1ldGhvZFR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnMtYXR0cmlidXRlIgotCQkgICB0eXBlPSJqYXZhZWU6dHJhbnMtYXR0cmlidXRlVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1jbGFzc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIGVqYi1jbGFzc1R5cGUgY29udGFpbnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZQotCSAgZW50ZXJwcmlzZSBiZWFuJ3MgY2xhc3MuIEl0IGlzIHVzZWQgYnkgZWpiLWNsYXNzIGVsZW1lbnRzLgotCi0JICBFeGFtcGxlOgotCi0JICAgICAgPGVqYi1jbGFzcz5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlQmVhbjwvZWpiLWNsYXNzPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1qYXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWpiLWphclR5cGUgZGVmaW5lcyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBFSkIKLQlkZXBsb3ltZW50IGRlc2NyaXB0b3IuIEl0IGNvbnRhaW5zCi0KLQkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgZWpiLWphciBmaWxlCi0JICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0JICAgIC0gYW4gb3B0aW9uYWwgaWNvbiB0aGF0IGNvbnRhaW5zIGEgc21hbGwgYW5kIGEgbGFyZ2UKLQkgICAgICBpY29uIGZpbGUgbmFtZQotCSAgICAtIHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGluY2x1ZGVkCi0JICAgICAgZW50ZXJwcmlzZSBiZWFucyB0aGF0IGlzIG5vdCBzcGVjaWZpZWQgdGhyb3VnaAotICAgICAgICAgICAgICBhbm5vdGF0aW9ucwotICAgICAgICAgICAgLSBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIGFib3V0IGludGVyY2VwdG9yIGNsYXNzZXMKLQkgICAgLSBhIGRlc2NyaXB0b3IgZm9yIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMsCi0JICAgICAgaWYgYW55LgotCSAgICAtIGFuIG9wdGlvbmFsIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGRlc2NyaXB0b3IKLQkgICAgLSBhbiBvcHRpb25hbCBuYW1lIG9mIGFuIGVqYi1jbGllbnQtamFyIGZpbGUgZm9yIHRoZQotCSAgICAgIGVqYi1qYXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRlcnByaXNlLWJlYW5zIgotCQkgICB0eXBlPSJqYXZhZWU6ZW50ZXJwcmlzZS1iZWFuc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW50ZXJjZXB0b3JzIgotCQkgICB0eXBlPSJqYXZhZWU6aW50ZXJjZXB0b3JzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxhdGlvbnNoaXBzIgotCQkgICB0eXBlPSJqYXZhZWU6cmVsYXRpb25zaGlwc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDp1bmlxdWUgbmFtZT0icmVsYXRpb25zaGlwLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlamItcmVsYXRpb24tbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0JICAgICAgcmVsYXRpb24uIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotCSAgICAgIHJlbGF0aW9uc2hpcHMuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLXJlbGF0aW9uIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZWpiLXJlbGF0aW9uLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc2VtYmx5LWRlc2NyaXB0b3IiCi0JCSAgIHR5cGU9ImphdmFlZTphc3NlbWJseS1kZXNjcmlwdG9yVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQKLQkgICAgZGVzY3JpcHRvciBpcyBvcHRpb25hbCBmb3IgdGhlIGVqYi1qYXIgZmlsZQotCSAgICBwcm9kdWNlci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItY2xpZW50LWphciIKLQkJICAgdHlwZT0iamF2YWVlOnBhdGhUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgb3B0aW9uYWwgZWpiLWNsaWVudC1qYXIgZWxlbWVudCBzcGVjaWZpZXMgYSBKQVIKLQkgICAgICBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGNsYXNzIGZpbGVzIG5lY2Vzc2FyeSBmb3IgYQotCSAgICAgIGNsaWVudCBwcm9ncmFtIHRvIGFjY2VzcyB0aGUKLQkgICAgICBlbnRlcnByaXNlIGJlYW5zIGluIHRoZSBlamItamFyIGZpbGUuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JCSAgPGVqYi1jbGllbnQtamFyPmVtcGxveWVlX3NlcnZpY2VfY2xpZW50LmphcgotCQkgIDwvZWpiLWNsaWVudC1qYXI+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRld2V5LXZlcnNpb25UeXBlIgotCQkgICBmaXhlZD0iMy4wIgotCQkgICB1c2U9InJlcXVpcmVkIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSB2ZXJzaW9uIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUKLQkgIEVKQiBzcGVjaWZpY2F0aW9uIHRoYXQgdGhlIGluc3RhbmNlIGRvY3VtZW50IG11c3QKLQkgIGNvbXBseSB3aXRoLiBUaGlzIGluZm9ybWF0aW9uIGVuYWJsZXMgZGVwbG95bWVudCB0b29scwotCSAgdG8gdmFsaWRhdGUgYSBwYXJ0aWN1bGFyIEVKQiBEZXBsb3ltZW50Ci0JICBEZXNjcmlwdG9yIHdpdGggcmVzcGVjdCB0byBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIEVKQgotCSAgc2NoZW1hLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIGRlZmluZXMgd2hldGhlciB0aGlzCi0JICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYW5kIG90aGVyIHJlbGF0ZWQgZGVwbG95bWVudAotCSAgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbW9kdWxlIChlLmcuLCB3ZWIgc2VydmljZQotCSAgZGVzY3JpcHRvcnMpIGFyZSBjb21wbGV0ZSwgb3Igd2hldGhlciB0aGUgY2xhc3MKLQkgIGZpbGVzIGF2YWlsYWJsZSB0byB0aGlzIG1vZHVsZSBhbmQgcGFja2FnZWQgd2l0aAotCSAgdGhpcyBhcHBsaWNhdGlvbiBzaG91bGQgYmUgZXhhbWluZWQgZm9yIGFubm90YXRpb25zCi0JICB0aGF0IHNwZWNpZnkgZGVwbG95bWVudCBpbmZvcm1hdGlvbi4KLQotCSAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgc2V0IHRvICJ0cnVlIiwgdGhlIGRlcGxveW1lbnQKLQkgIHRvb2wgbXVzdCBpZ25vcmUgYW55IGFubm90YXRpb25zIHRoYXQgc3BlY2lmeSBkZXBsb3ltZW50Ci0JICBpbmZvcm1hdGlvbiwgd2hpY2ggbWlnaHQgYmUgcHJlc2VudCBpbiB0aGUgY2xhc3MgZmlsZXMKLQkgIG9mIHRoZSBhcHBsaWNhdGlvbi4KLQotCSAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgbm90IHNwZWNpZmllZCBvciBpcyBzZXQgdG8KLQkgICJmYWxzZSIsIHRoZSBkZXBsb3ltZW50IHRvb2wgbXVzdCBleGFtaW5lIHRoZSBjbGFzcwotCSAgZmlsZXMgb2YgdGhlIGFwcGxpY2F0aW9uIGZvciBhbm5vdGF0aW9ucywgYXMKLQkgIHNwZWNpZmllZCBieSB0aGUgc3BlY2lmaWNhdGlvbnMuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDwveHNkOmF0dHJpYnV0ZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgZWpiLW5hbWVUeXBlIHNwZWNpZmllcyBhbiBlbnRlcnByaXNlIGJlYW4ncyBuYW1lLiBJdCBpcwotCSAgdXNlZCBieSBlamItbmFtZSBlbGVtZW50cy4gVGhpcyBuYW1lIGlzIGFzc2lnbmVkIGJ5IHRoZQotCSAgZWpiLWphciBmaWxlIHByb2R1Y2VyIHRvIG5hbWUgdGhlIGVudGVycHJpc2UgYmVhbiBpbiB0aGUKLQkgIGVqYi1qYXIgZmlsZSdzIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhlIG5hbWUgbXVzdCBiZQotCSAgdW5pcXVlIGFtb25nIHRoZSBuYW1lcyBvZiB0aGUgZW50ZXJwcmlzZSBiZWFucyBpbiB0aGUgc2FtZQotCSAgZWpiLWphciBmaWxlLgotCi0JICBUaGVyZSBpcyBubyBhcmNoaXRlY3RlZCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgdXNlZAotCSAgZWpiLW5hbWUgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgdGhlIEpOREkgbmFtZSB0aGF0Ci0JICB0aGUgRGVwbG95ZXIgd2lsbCBhc3NpZ24gdG8gdGhlIGVudGVycHJpc2UgYmVhbidzIGhvbWUuCi0KLQkgIFRoZSBuYW1lIGZvciBhbiBlbnRpdHkgYmVhbiBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwKLQkgIHJ1bGVzIGZvciBhbiBOTVRPS0VOLgotCi0JICBFeGFtcGxlOgotCi0JICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6eHNkTk1UT0tFTlR5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlbGF0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVqYi1yZWxhdGlvblR5cGUgZGVzY3JpYmVzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvCi0JZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuICBJdCBpcyB1c2VkCi0JYnkgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLiBJdCBjb250YWlucyBhIGRlc2NyaXB0aW9uOyBhbgotCW9wdGlvbmFsIGVqYi1yZWxhdGlvbi1uYW1lIGVsZW1lbnQ7IGFuZCBleGFjdGx5IHR3bwotCXJlbGF0aW9uc2hpcCByb2xlIGRlY2xhcmF0aW9ucywgZGVmaW5lZCBieSB0aGUKLQllamItcmVsYXRpb25zaGlwLXJvbGUgZWxlbWVudHMuIFRoZSBuYW1lIG9mIHRoZQotCXJlbGF0aW9uc2hpcCwgaWYgc3BlY2lmaWVkLCBpcyB1bmlxdWUgd2l0aGluIHRoZSBlamItamFyCi0JZmlsZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWxhdGlvbi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZWpiLXJlbGF0aW9uLW5hbWUgZWxlbWVudCBwcm92aWRlcyBhIHVuaXF1ZSBuYW1lCi0JICAgIHdpdGhpbiB0aGUgZWpiLWphciBmaWxlIGZvciBhIHJlbGF0aW9uc2hpcC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb25zaGlwLXJvbGUiCi0JCSAgIHR5cGU9ImphdmFlZTplamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlbGF0aW9uc2hpcC1yb2xlIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWxhdGlvbnNoaXAtcm9sZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZVR5cGUgZGVzY3JpYmVzIGEgcm9sZSB3aXRoaW4gYQotCSAgcmVsYXRpb25zaGlwLiBUaGVyZSBhcmUgdHdvIHJvbGVzIGluIGVhY2ggcmVsYXRpb25zaGlwLgotCi0JICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSBjb250YWlucyBhbiBvcHRpb25hbAotCSAgZGVzY3JpcHRpb247IGFuIG9wdGlvbmFsIG5hbWUgZm9yIHRoZSByZWxhdGlvbnNoaXAgcm9sZTsgYQotCSAgc3BlY2lmaWNhdGlvbiBvZiB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSByb2xlOyBhbiBvcHRpb25hbAotCSAgc3BlY2lmaWNhdGlvbiBvZiBjYXNjYWRlLWRlbGV0ZSBmdW5jdGlvbmFsaXR5IGZvciB0aGUgcm9sZTsKLQkgIHRoZSByb2xlIHNvdXJjZTsgYW5kIGEgZGVjbGFyYXRpb24gb2YgdGhlIGNtci1maWVsZCwgaWYgYW55LAotCSAgYnkgbWVhbnMgb2Ygd2hpY2ggdGhlIG90aGVyIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBpcwotCSAgYWNjZXNzZWQgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIHJvbGUgc291cmNlLgotCi0JICBUaGUgbXVsdGlwbGljaXR5IGFuZCByb2xlLXNvdXJjZSBlbGVtZW50IGFyZSBtYW5kYXRvcnkuCi0KLQkgIFRoZSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCBkZXNpZ25hdGVzIGFuIGVudGl0eQotCSAgYmVhbiBieSBtZWFucyBvZiBhbiBlamItbmFtZSBlbGVtZW50LiBGb3IgYmlkaXJlY3Rpb25hbAotCSAgcmVsYXRpb25zaGlwcywgYm90aCByb2xlcyBvZiBhIHJlbGF0aW9uc2hpcCBtdXN0IGRlY2xhcmUgYQotCSAgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgdGhhdCBzcGVjaWZpZXMgYSBjbXItZmllbGQKLQkgIGluIHRlcm1zIG9mIHdoaWNoIHRoZSByZWxhdGlvbnNoaXAgaXMgYWNjZXNzZWQuIFRoZSBsYWNrIG9mCi0JICBhIGNtci1maWVsZCBlbGVtZW50IGluIGFuIGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBzcGVjaWZpZXMKLQkgIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCBpcyB1bmlkaXJlY3Rpb25hbCBpbiBuYXZpZ2FiaWxpdHkgYW5kCi0JICB0aGUgZW50aXR5IGJlYW4gdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gdGhlIHJlbGF0aW9uc2hpcCBpcwotCSAgIm5vdCBhd2FyZSIgb2YgdGhlIHJlbGF0aW9uc2hpcC4KLQotCSAgRXhhbXBsZToKLQotCSAgPGVqYi1yZWxhdGlvbj4KLQkgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+UHJvZHVjdC1MaW5lSXRlbTwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0JICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLQkJICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cHJvZHVjdC1oYXMtbGluZWl0ZW1zCi0JCSAgPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLQkJICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotCQkgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0JCSAgPGVqYi1uYW1lPlByb2R1Y3RFSkI8L2VqYi1uYW1lPgotCQkgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotCSAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLQkgIDwvZWpiLXJlbGF0aW9uPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lIGVsZW1lbnQgZGVmaW5lcyBhCi0JICAgIG5hbWUgZm9yIGEgcm9sZSB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gYW4KLQkgICAgZWpiLXJlbGF0aW9uLiBEaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBjYW4gdXNlIHRoZQotCSAgICBzYW1lIG5hbWUgZm9yIGEgcm9sZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtdWx0aXBsaWNpdHkiCi0JCSAgIHR5cGU9ImphdmFlZTptdWx0aXBsaWNpdHlUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1kZWxldGUiCi0JCSAgIHR5cGU9ImphdmFlZTplbXB0eVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBjYXNjYWRlLWRlbGV0ZSBlbGVtZW50IHNwZWNpZmllcyB0aGF0LCB3aXRoaW4gYQotCSAgICBwYXJ0aWN1bGFyIHJlbGF0aW9uc2hpcCwgdGhlIGxpZmV0aW1lIG9mIG9uZSBvciBtb3JlCi0JICAgIGVudGl0eSBiZWFucyBpcyBkZXBlbmRlbnQgdXBvbiB0aGUgbGlmZXRpbWUgb2YKLQkgICAgYW5vdGhlciBlbnRpdHkgYmVhbi4gVGhlIGNhc2NhZGUtZGVsZXRlIGVsZW1lbnQgY2FuCi0JICAgIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhbiBlamItcmVsYXRpb25zaGlwLXJvbGUKLQkgICAgZWxlbWVudCBjb250YWluZWQgaW4gYW4gZWpiLXJlbGF0aW9uIGVsZW1lbnQgaW4KLQkgICAgd2hpY2ggdGhlIG90aGVyIGVqYi1yZWxhdGlvbnNoaXAtcm9sZQotCSAgICBlbGVtZW50IHNwZWNpZmllcyBhIG11bHRpcGxpY2l0eSBvZiBPbmUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVsYXRpb25zaGlwLXJvbGUtc291cmNlIgotCQkgICB0eXBlPSJqYXZhZWU6cmVsYXRpb25zaGlwLXJvbGUtc291cmNlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNtci1maWVsZCIKLQkJICAgdHlwZT0iamF2YWVlOmNtci1maWVsZFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGVycHJpc2UtYmVhbnNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZW50ZXJwcmlzZS1iZWFuc1R5cGUgZGVjbGFyZXMgb25lIG9yIG1vcmUgZW50ZXJwcmlzZQotCWJlYW5zLiBFYWNoIGJlYW4gY2FuIGJlIGEgc2Vzc2lvbiwgZW50aXR5IG9yIG1lc3NhZ2UtZHJpdmVuCi0JYmVhbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24iCi0JCSAgIHR5cGU9ImphdmFlZTpzZXNzaW9uLWJlYW5UeXBlIj4KLQk8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLWVqYi1sb2NhbC1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mCi0JICAgICAgYW4gRUpCIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4KLQkgICAgICB0aGUgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotCSAgICAgIHRoZSBjb21wb25lbnQuCi0KLQkgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgYmUgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLWxvY2FsLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmVqYi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tZWpiLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0JICAgICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUKLQkgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotCSAgICAgIHdpdGhpbiB0aGUgY29tcG9uZW50LgotCi0JICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVqYi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTplamItcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJzZXNzaW9uLXJlc291cmNlLWVudi1yZWYtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgICAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0JICAgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0JICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLQkgICAgICBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgICAgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0JICAgICAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0JICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLQkgICAgICBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ic2Vzc2lvbi1yZXMtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lCi0JICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLQkgICAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnJlcy1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9InNlc3Npb24tZW52LWVudHJ5LW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotCSAgICAgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZQotCSAgICAgIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplbnYtZW50cnkiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTplbnYtZW50cnktbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHkiCi0JCSAgIHR5cGU9ImphdmFlZTplbnRpdHktYmVhblR5cGUiPgotCTx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1lamItbG9jYWwtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZgotCSAgICAgIGFuIEVKQiByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluCi0JICAgICAgdGhlIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLQkgICAgICB0aGUgY29tcG9uZW50LgotCi0JICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGJlIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVqYi1sb2NhbC1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTplamItcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktZWpiLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0JICAgICAgcmVmZXJlbmNlLiBUaGUgRUpCIHJlZmVyZW5jZSBpcyBhbiBlbnRyeSBpbiB0aGUKLQkgICAgICBjb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0LiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotCSAgICAgIHdpdGhpbiB0aGUgY29tcG9uZW50LgotCi0JICAgICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVqYi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTplamItcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJlbnRpdHktcmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgICAgICB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLQkgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotCSAgICAgIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0iZW50aXR5LW1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAgICAgIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcwotCSAgICAgIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvbXBvbmVudAotCSAgICAgIGNvZGUuIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuCi0JICAgICAgY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1yZXMtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4gIFRoZSBuYW1lCi0JICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLQkgICAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnJlc291cmNlLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnJlcy1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9ImVudGl0eS1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotCSAgICAgIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJCi0JICAgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlCi0JICAgICAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVudi1lbnRyeSIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmVudi1lbnRyeS1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZHJpdmVuIgotCQkgICB0eXBlPSJqYXZhZWU6bWVzc2FnZS1kcml2ZW4tYmVhblR5cGUiPgotCTx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLWVqYi1sb2NhbC1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mCi0JICAgICAgYW4gRUpCIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4KLQkgICAgICB0aGUgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotCSAgICAgIHRoZSBjb21wb25lbnQuCi0KLQkgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgYmUgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6ZWpiLWxvY2FsLXJlZiIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmVqYi1yZWYtbmFtZSIvPgotCTwveHNkOnVuaXF1ZT4KLQotCTx4c2Q6dW5pcXVlIG5hbWU9Im1lc3NhZ2VkLWVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQgotCSAgICAgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlCi0JICAgICAgY29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAgICAgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLQkgICAgICB3aXRoaW4gdGhlIGNvbXBvbmVudC4KLQotCSAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplamItcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtcmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgICAgICB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSBjb21wb25lbnQKLQkgICAgICBjb2RlLiBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhbgotCSAgICAgIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0JICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgICAgb2YgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0JICAgICAgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29tcG9uZW50Ci0JICAgICAgY29kZS4gVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi0JICAgICAgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4KLQkgICAgICBjb21wb25lbnQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotCi0JPHhzZDp1bmlxdWUgbmFtZT0ibWVzc2FnZWQtcmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLQkgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuICBUaGUgbmFtZQotCSAgICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0JICAgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGFuIGNvbXBvbmVudC4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1yZWYiLz4KLQkgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpyZXMtcmVmLW5hbWUiLz4KLQk8L3hzZDp1bmlxdWU+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJtZXNzYWdlZC1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYQotCSAgICAgIGNvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJCi0JICAgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlCi0JICAgICAgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYW4gY29tcG9uZW50LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVudi1lbnRyeSIvPgotCSAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmVudi1lbnRyeS1uYW1lIi8+Ci0JPC94c2Q6dW5pcXVlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOmNob2ljZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktYmVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlbnRpdHktYmVhblR5cGUgZGVjbGFyZXMgYW4gZW50aXR5IGJlYW4uIFRoZSBkZWNsYXJhdGlvbgotCWNvbnNpc3RzIG9mOgotCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQkgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLQkgICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0JICAgICAgaWNvbiBmaWxlIG5hbWUKLQkgICAgLSBhIHVuaXF1ZSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4KLQkgICAgICBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gICAgICAgICAgICAtIGFuIG9wdGlvbmFsIG1hcHBlZC1uYW1lIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBwcm92aWRlCi0gICAgICAgICAgICAgIHZlbmRvci1zcGVjaWZpYyBkZXBsb3ltZW50IGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHBoeXNpY2FsCi0gICAgICAgICAgICAgIGpuZGktbmFtZSBvZiB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaG9tZSBpbnRlcmZhY2UuIFRoaXMKLSAgICAgICAgICAgICAgZWxlbWVudCBpcyBub3QgcmVxdWlyZWQgdG8gYmUgc3VwcG9ydGVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMuCi0gICAgICAgICAgICAgIEFueSB1c2Ugb2YgdGhpcyBlbGVtZW50IGlzIG5vbi1wb3J0YWJsZS4KLQkgICAgLSB0aGUgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGhvbWUKLQkgICAgICBhbmQgcmVtb3RlIGludGVyZmFjZXMsIGlmIGFueQotCSAgICAtIHRoZSBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4ncyBsb2NhbCBob21lIGFuZCBsb2NhbAotCSAgICAgIGludGVyZmFjZXMsIGlmIGFueQotCSAgICAtIHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0JICAgIC0gdGhlIG9wdGlvbmFsIGVudGl0eSBiZWFuJ3MgcGVyc2lzdGVuY2UgbWFuYWdlbWVudCB0eXBlLiBJZgotICAgICAgICAgICAgICB0aGlzIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCBpdCBpcyBkZWZhdWx0ZWQgdG8gQ29udGFpbmVyLgotCSAgICAtIHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzIG5hbWUKLQkgICAgLSBhbiBpbmRpY2F0aW9uIG9mIHRoZSBlbnRpdHkgYmVhbidzIHJlZW50cmFuY3kKLQkgICAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZQotCSAgICAgIGVudGl0eSBiZWFuJ3MgY21wLXZlcnNpb24KLQkgICAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBlbnRpdHkgYmVhbidzCi0JICAgICAgYWJzdHJhY3Qgc2NoZW1hIG5hbWUKLQkgICAgLSBhbiBvcHRpb25hbCBsaXN0IG9mIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcwotCSAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIHByaW1hcnkga2V5Ci0JICAgICAgZmllbGQKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50Ci0JICAgICAgZW50cmllcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCCi0JICAgICAgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwKLQkgICAgICBFSkIgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3Mgd2ViCi0JICAgICAgc2VydmljZSByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IHJvbGUKLQkgICAgICByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5Ci0JICAgICAgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzIG1ldGhvZHMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0JICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLQkgICAgICByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdlCi0JICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIHNldCBvZiBxdWVyeSBkZWNsYXJhdGlvbnMKLQkgICAgICBmb3IgZmluZGVyIGFuZCBzZWxlY3QgbWV0aG9kcyBmb3IgYW4gZW50aXR5Ci0JICAgICAgYmVhbiB3aXRoIGNtcC12ZXJzaW9uIDIueC4KLQotCVRoZSBvcHRpb25hbCBhYnN0cmFjdC1zY2hlbWEtbmFtZSBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkCi0JZm9yIGFuIGVudGl0eSBiZWFuIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UgYW5kCi0JY21wLXZlcnNpb24gMi54LgotCi0JVGhlIG9wdGlvbmFsIHByaW1rZXktZmllbGQgbWF5IGJlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IKLQlpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIuCi0KLQlUaGUgb3B0aW9uYWwgY21wLXZlcnNpb24gZWxlbWVudCBtYXkgYmUgcHJlc2VudCBpbiB0aGUKLQlkZXNjcmlwdG9yIGlmIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lci4gSWYKLQl0aGUgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbgotCWVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgaXRzIHZhbHVlIGRlZmF1bHRzIHRvIDIueC4KLQotCVRoZSBvcHRpb25hbCBob21lIGFuZCByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgaWYKLQl0aGUgZW50aXR5IGJlYW4gY21wLXZlcnNpb24gaXMgMS54LgotCi0JVGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZgotCXRoZSBlbnRpdHkgYmVhbiBoYXMgYSByZW1vdGUgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZS4KLQotCVRoZSBvcHRpb25hbCBsb2NhbC1ob21lIGFuZCBsb2NhbCBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZAotCWlmIHRoZSBlbnRpdHkgYmVhbiBoYXMgYSBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2UuCi0KLQlFaXRoZXIgYm90aCB0aGUgbG9jYWwtaG9tZSBhbmQgdGhlIGxvY2FsIGVsZW1lbnRzIG9yIGJvdGgKLQl0aGUgaG9tZSBhbmQgdGhlIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZC4KLQotCVRoZSBvcHRpb25hbCBxdWVyeSBlbGVtZW50cyBtdXN0IGJlIHByZXNlbnQgaWYgdGhlCi0JcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbiBpcyAyLnggYW5kCi0JcXVlcnkgbWV0aG9kcyBvdGhlciB0aGFuIGZpbmRCeVByaW1hcnlLZXkgaGF2ZSBiZWVuIGRlZmluZWQKLQlmb3IgdGhlIGVudGl0eSBiZWFuLgotCi0JVGhlIG90aGVyIGVsZW1lbnRzIHRoYXQgYXJlIG9wdGlvbmFsIGFyZSAib3B0aW9uYWwiIGluIHRoZQotCXNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbQotCWFyZSBlbXB0eS4KLQotCUF0IGxlYXN0IG9uZSBjbXAtZmllbGQgZWxlbWVudCBtdXN0IGJlIHByZXNlbnQgaW4gdGhlCi0JZGVzY3JpcHRvciBpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kCi0JdGhlIGNtcC12ZXJzaW9uIGlzIDEueCwgYW5kIG5vbmUgbXVzdCBub3QgYmUgcHJlc2VudCBpZiB0aGUKLQllbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIEJlYW4uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcHBlZC1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaG9tZSIKLQkJICAgdHlwZT0iamF2YWVlOmhvbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUiCi0JCSAgIHR5cGU9ImphdmFlZTpyZW1vdGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbC1ob21lIgotCQkgICB0eXBlPSJqYXZhZWU6bG9jYWwtaG9tZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsIgotCQkgICB0eXBlPSJqYXZhZWU6bG9jYWxUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTplamItY2xhc3NUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdHlwZSIKLQkJICAgdHlwZT0iamF2YWVlOnBlcnNpc3RlbmNlLXR5cGVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbS1rZXktY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHByaW0ta2V5LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlCi0JICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGFuCi0JICAgIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MuCi0KLQkgICAgSWYgdGhlIGRlZmluaXRpb24gb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIGlzCi0JICAgIGRlZmVycmVkIHRvIGRlcGxveW1lbnQgdGltZSwgdGhlIHByaW0ta2V5LWNsYXNzCi0JICAgIGVsZW1lbnQgc2hvdWxkIHNwZWNpZnkgamF2YS5sYW5nLk9iamVjdC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWVudHJhbnQiCi0JCSAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByZWVudHJhbnQgZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciBhbiBlbnRpdHkKLQkgICAgYmVhbiBpcyByZWVudHJhbnQgb3Igbm90LgotCi0JICAgIFRoZSByZWVudHJhbnQgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvCi0JICAgIGZvbGxvd2luZzogdHJ1ZSBvciBmYWxzZQotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNtcC12ZXJzaW9uIgotCQkgICB0eXBlPSJqYXZhZWU6Y21wLXZlcnNpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhYnN0cmFjdC1zY2hlbWEtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmphdmEtaWRlbnRpZmllclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAgICBvZiB0aGUgYWJzdHJhY3Qgc2NoZW1hIHR5cGUgb2YgYW4gZW50aXR5IGJlYW4gd2l0aAotCSAgICBjbXAtdmVyc2lvbiAyLnguIEl0IGlzIHVzZWQgaW4gRUpCIFFMIHF1ZXJpZXMuCi0KLQkgICAgRm9yIGV4YW1wbGUsIHRoZSBhYnN0cmFjdC1zY2hlbWEtbmFtZSBmb3IgYW4gZW50aXR5Ci0JICAgIGJlYW4gd2hvc2UgbG9jYWwgaW50ZXJmYWNlIGlzCi0JICAgIGNvbS5hY21lLmNvbW1lcmNlLk9yZGVyIG1pZ2h0IGJlIE9yZGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNtcC1maWVsZCIKLQkJICAgdHlwZT0iamF2YWVlOmNtcC1maWVsZFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmlta2V5LWZpZWxkIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcHJpbWtleS1maWVsZCBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUKLQkgICAgbmFtZSBvZiB0aGUgcHJpbWFyeSBrZXkgZmllbGQgZm9yIGFuIGVudGl0eSB3aXRoCi0JICAgIGNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlLgotCi0JICAgIFRoZSBwcmlta2V5LWZpZWxkIG11c3QgYmUgb25lIG9mIHRoZSBmaWVsZHMgZGVjbGFyZWQKLQkgICAgaW4gdGhlIGNtcC1maWVsZCBlbGVtZW50LCBhbmQgdGhlIHR5cGUgb2YgdGhlIGZpZWxkCi0JICAgIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIHByaW1hcnkga2V5IHR5cGUuCi0KLQkgICAgVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyBub3QgdXNlZCBpZiB0aGUgcHJpbWFyeQotCSAgICBrZXkgbWFwcyB0byBtdWx0aXBsZSBjb250YWluZXItbWFuYWdlZCBmaWVsZHMKLQkgICAgKGkuZS4gdGhlIGtleSBpcyBhIGNvbXBvdW5kIGtleSkuIEluIHRoaXMgY2FzZSwgdGhlCi0JICAgIGZpZWxkcyBvZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBwdWJsaWMsIGFuZAotCSAgICB0aGVpciBuYW1lcyBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIGZpZWxkIG5hbWVzIG9mCi0JICAgIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyB0aGF0IGNvbXByaXNlIHRoZSBrZXkuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmpuZGlFbnZpcm9ubWVudFJlZnNHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6c2VjdXJpdHktcm9sZS1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktaWRlbnRpdHkiCi0JCSAgIHR5cGU9ImphdmFlZTpzZWN1cml0eS1pZGVudGl0eVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IgotCQkgICB0eXBlPSJqYXZhZWU6cXVlcnlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXhjbHVkZS1saXN0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGV4Y2x1ZGUtbGlzdFR5cGUgc3BlY2lmaWVzIG9uZSBvciBtb3JlIG1ldGhvZHMgd2hpY2gKLQl0aGUgQXNzZW1ibGVyIG1hcmtzIHRvIGJlIHVuY2FsbGFibGUuCi0KLQlJZiB0aGUgbWV0aG9kIHBlcm1pc3Npb24gcmVsYXRpb24gY29udGFpbnMgbWV0aG9kcyB0aGF0IGFyZQotCWluIHRoZSBleGNsdWRlIGxpc3QsIHRoZSBEZXBsb3llciBzaG91bGQgY29uc2lkZXIgdGhvc2UKLQltZXRob2RzIHRvIGJlIHVuY2FsbGFibGUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QiCi0JCSAgIHR5cGU9ImphdmFlZTptZXRob2RUeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluaXQtbWV0aG9kVHlwZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjcmVhdGUtbWV0aG9kIgotCQkgICB0eXBlPSJqYXZhZWU6bmFtZWQtbWV0aG9kVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJlYW4tbWV0aG9kIgotCQkgICB0eXBlPSJqYXZhZWU6bmFtZWQtbWV0aG9kVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImludGVyY2VwdG9yLWJpbmRpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGludGVyY2VwdG9yLWJpbmRpbmdUeXBlIGVsZW1lbnQgZGVzY3JpYmVzIHRoZSBiaW5kaW5nIG9mCi0gICAgICAgIGludGVyY2VwdG9yIGNsYXNzZXMgdG8gYmVhbnMgd2l0aGluIHRoZSBlamItamFyLgotICAgICAgICBJdCBjb25zaXN0cyBvZiA6Ci0KLSAgICAgICAgICAtIEFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLgotICAgICAgICAgIC0gVGhlIG5hbWUgb2YgYW4gZWpiIHdpdGhpbiB0aGUgZWpiLWphciBvciB0aGUgd2lsZGNhcmQgdmFsdWUgIioiLAotICAgICAgICAgICAgd2hpY2ggaXMgdXNlZCB0byBkZWZpbmUgaW50ZXJjZXB0b3JzIHRoYXQgYXJlIGJvdW5kIHRvIGFsbAotICAgICAgICAgICAgYmVhbnMgaW4gdGhlIGVqYi1qYXIuCi0gICAgICAgICAgLSBBIGxpc3Qgb2YgaW50ZXJjZXB0b3IgY2xhc3NlcyB0aGF0IGFyZSBib3VuZCB0byB0aGUgY29udGVudHMgb2YKLSAgICAgICAgICAgIHRoZSBlamItbmFtZSBlbGVtZW50IG9yIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgdG90YWwgb3JkZXJpbmcKLSAgICAgICAgICAgIG92ZXIgdGhlIGludGVyY2VwdG9ycyBkZWZpbmVkIGZvciB0aGUgZ2l2ZW4gbGV2ZWwgYW5kIGFib3ZlLgotICAgICAgICAgIC0gQW4gb3B0aW9uYWwgZXhjbHVkZS1kZWZhdWx0LWludGVyY2VwdG9ycyBlbGVtZW50LiAgSWYgc2V0IHRvIHRydWUsCi0gICAgICAgICAgICBzcGVjaWZpZXMgdGhhdCBkZWZhdWx0IGludGVyY2VwdG9ycyBhcmUgbm90IHRvIGJlIGFwcGxpZWQgdG8KLSAgICAgICAgICAgIGEgYmVhbi1jbGFzcyBhbmQvb3IgYnVzaW5lc3MgbWV0aG9kLgotICAgICAgICAgIC0gQW4gb3B0aW9uYWwgZXhjbHVkZS1jbGFzcy1pbnRlcmNlcHRvcnMgZWxlbWVudC4gIElmIHNldCB0byB0cnVlLAotICAgICAgICAgICAgc3BlY2lmaWVzIHRoYXQgY2xhc3MgaW50ZXJjZXB0b3JzIGFyZSBub3QgdG8gYmUgYXBwbGllZCB0bwotICAgICAgICAgICAgYSBidXNpbmVzcyBtZXRob2QuCi0gICAgICAgICAgLSBBbiBvcHRpb25hbCBzZXQgb2YgbWV0aG9kIGVsZW1lbnRzIGZvciBkZXNjcmliaW5nIHRoZSBuYW1lL3BhcmFtcwotICAgICAgICAgICAgb2YgYSBtZXRob2QtbGV2ZWwgaW50ZXJjZXB0b3IuCi0KLSAgICAgICAgIEludGVyY2VwdG9ycyBib3VuZCB0byBhbGwgY2xhc3NlcyB1c2luZyB0aGUgd2lsZGNhcmQgc3ludGF4Ci0gICAgICAgICAiKiIgYXJlIGRlZmF1bHQgaW50ZXJjZXB0b3JzIGZvciB0aGUgY29tcG9uZW50cyBpbiB0aGUgZWpiLWphci4KLSAgICAgICAgIEluIGFkZGl0aW9uLCBpbnRlcmNlcHRvcnMgbWF5IGJlIGJvdW5kIGF0IHRoZSBsZXZlbCBvZiB0aGUgYmVhbgotICAgICAgICAgY2xhc3MgKGNsYXNzLWxldmVsIGludGVyY2VwdG9ycykgb3IgYnVzaW5lc3MgbWV0aG9kcyAobWV0aG9kLWxldmVsCi0gICAgICAgICBpbnRlcmNlcHRvcnMgKS4KLQotICAgICAgICAgVGhlIGJpbmRpbmcgb2YgaW50ZXJjZXB0b3JzIHRvIGNsYXNzZXMgaXMgYWRkaXRpdmUuICBJZiBpbnRlcmNlcHRvcnMKLSAgICAgICAgIGFyZSBib3VuZCBhdCB0aGUgY2xhc3MtbGV2ZWwgYW5kL29yIGRlZmF1bHQtbGV2ZWwgYXMgd2VsbCBhcyB0aGUKLSAgICAgICAgIG1ldGhvZC1sZXZlbCwgYm90aCBjbGFzcy1sZXZlbCBhbmQvb3IgZGVmYXVsdC1sZXZlbCBhcyB3ZWxsIGFzCi0gICAgICAgICBtZXRob2QtbGV2ZWwgd2lsbCBhcHBseS4KLQotICAgICAgICAgVGhlcmUgYXJlIGZvdXIgcG9zc2libGUgc3R5bGVzIG9mIHRoZSBpbnRlcmNlcHRvciBlbGVtZW50IHN5bnRheCA6Ci0KLSAgICAgICAgIDEuCi0gICAgICAgICA8aW50ZXJjZXB0b3ItYmluZGluZz4KLSAgICAgICAgICAgPGVqYi1uYW1lPio8L2VqYi1uYW1lPgotICAgICAgICAgICA8aW50ZXJjZXB0b3ItY2xhc3M+SU5URVJDRVBUT1I8L2ludGVyY2VwdG9yLWNsYXNzPgotICAgICAgICAgPC9pbnRlcmNlcHRvci1iaW5kaW5nPgotCi0gICAgICAgICBTcGVjaWZ5aW5nIHRoZSBlamItbmFtZSBhcyB0aGUgd2lsZGNhcmQgdmFsdWUgIioiIGRlc2lnbmF0ZXMKLSAgICAgICAgIGRlZmF1bHQgaW50ZXJjZXB0b3JzIChpbnRlcmNlcHRvcnMgdGhhdCBhcHBseSB0byBhbGwgc2Vzc2lvbiBhbmQKLSAgICAgICAgIG1lc3NhZ2UtZHJpdmVuIGJlYW5zIGNvbnRhaW5lZCBpbiB0aGUgZWpiLWphcikuCi0KLSAgICAgICAgIDIuCi0gICAgICAgICA8aW50ZXJjZXB0b3ItYmluZGluZz4KLSAgICAgICAgICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotICAgICAgICAgICA8aW50ZXJjZXB0b3ItY2xhc3M+SU5URVJDRVBUT1I8L2ludGVyY2VwdG9yLWNsYXNzPgotICAgICAgICAgPC9pbnRlcmNlcHRvci1iaW5kaW5nPgotCi0gICAgICAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gcmVmZXIgdG8gaW50ZXJjZXB0b3JzIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAgICAgICAgIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4oY2xhc3MtbGV2ZWwgaW50ZXJjZXB0b3JzKS4KLQotICAgICAgICAgMy4KLSAgICAgICAgIDxpbnRlcmNlcHRvci1iaW5kaW5nPgotICAgICAgICAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0gICAgICAgICAgIDxpbnRlcmNlcHRvci1jbGFzcz5JTlRFUkNFUFRPUjwvaW50ZXJjZXB0b3ItY2xhc3M+Ci0gICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgPC9pbnRlcmNlcHRvci1iaW5kaW5nPgotCi0gICAgICAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gYXNzb2NpYXRlIGEgbWV0aG9kLWxldmVsIGludGVyY2VwdG9yIHdpdGgKLSAgICAgICAgIHRoZSBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuLiAgSWYgdGhlcmUgYXJlIG11bHRpcGxlIG1ldGhvZHMKLSAgICAgICAgIHdpdGggdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGUgZWxlbWVudCBvZiB0aGlzIHN0eWxlIHJlZmVycwotICAgICAgICAgdG8gYWxsIHRoZSBtZXRob2RzIHdpdGggdGhlIG92ZXJsb2FkZWQgbmFtZS4gIE1ldGhvZC1sZXZlbAotICAgICAgICAgaW50ZXJjZXB0b3JzIGNhbiBvbmx5IGJlIGFzc29jaWF0ZWQgd2l0aCBidXNpbmVzcyBtZXRob2RzIG9mIHRoZQotICAgICAgICAgYmVhbiBjbGFzcy4gICBOb3RlIHRoYXQgdGhlIHdpbGRjYXJkIHZhbHVlICIqIiBjYW5ub3QgYmUgdXNlZAotICAgICAgICAgdG8gc3BlY2lmeSBtZXRob2QtbGV2ZWwgaW50ZXJjZXB0b3JzLgotCi0gICAgICAgICA0LgotICAgICAgICAgPGludGVyY2VwdG9yLWJpbmRpbmc+Ci0gICAgICAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAgICAgICAgICAgPGludGVyY2VwdG9yLWNsYXNzPklOVEVSQ0VQVE9SPC9pbnRlcmNlcHRvci1jbGFzcz4KLSAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+UEFSQU0tMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5QQVJBTS0yPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAuLi4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+UEFSQU0tTjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICA8L2ludGVyY2VwdG9yLWJpbmRpbmc+Ci0KLSAgICAgICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byBhc3NvY2lhdGUgYSBtZXRob2QtbGV2ZWwgaW50ZXJjZXB0b3Igd2l0aAotICAgICAgICAgdGhlIHNwZWNpZmllZCBtZXRob2Qgb2YgdGhlIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4uICBUaGlzCi0gICAgICAgICBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGEgc2luZ2xlIG1ldGhvZCB3aXRoaW4gYSBzZXQgb2YgbWV0aG9kcwotICAgICAgICAgd2l0aCBhbiBvdmVybG9hZGVkIG5hbWUuICBUaGUgdmFsdWVzIFBBUkFNLTEgdGhyb3VnaCBQQVJBTS1OCi0gICAgICAgICBhcmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGVzIG9mIHRoZSBtZXRob2QncyBpbnB1dCBwYXJhbWV0ZXJzCi0gICAgICAgICAoaWYgdGhlIG1ldGhvZCBoYXMgbm8gaW5wdXQgYXJndW1lbnRzLCB0aGUgbWV0aG9kLXBhcmFtcyBlbGVtZW50Ci0gICAgICAgICBjb250YWlucyBubyBtZXRob2QtcGFyYW0gZWxlbWVudHMpLiBBcnJheXMgYXJlIHNwZWNpZmllZCBieSB0aGUKLSAgICAgICAgIGFycmF5IGVsZW1lbnQncyB0eXBlLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBwYWlyIG9mIHNxdWFyZQotICAgICAgICAgYnJhY2tldHMgKGUuZy4gaW50W11bXSkuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW50ZXJjZXB0b3ItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW50ZXJjZXB0b3Itb3JkZXIiCi0JCSAgICAgdHlwZT0iamF2YWVlOmludGVyY2VwdG9yLW9yZGVyVHlwZSIKLQkJICAgICBtaW5PY2N1cnM9IjEiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtaW50ZXJjZXB0b3JzIgotCQkgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtY2xhc3MtaW50ZXJjZXB0b3JzIgotCQkgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIKLQkJICAgdHlwZT0iamF2YWVlOm5hbWVkLW1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZXJjZXB0b3Itb3JkZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIFRoZSBpbnRlcmNlcHRvci1vcmRlclR5cGUgZWxlbWVudCBkZXNjcmliZXMgYSB0b3RhbCBvcmRlcmluZwotICAgICAgICBvZiBpbnRlcmNlcHRvciBjbGFzc2VzLgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludGVyY2VwdG9yLWNsYXNzIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjEiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImludGVyY2VwdG9yVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBpbnRlcmNlcHRvclR5cGUgZWxlbWVudCBkZWNsYXJlcyBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZQotICAgICAgICBpbnRlcmNlcHRvciBjbGFzcy4gIEl0IGNvbnNpc3RzIG9mIDoKLQotICAgICAgICAgICAgLSBBbiBvcHRpb25hbCBkZXNjcmlwdGlvbi4KLSAgICAgICAgICAgIC0gVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBpbnRlcmNlcHRvciBjbGFzcy4KLSAgICAgICAgICAgIC0gQW4gb3B0aW9uYWwgbGlzdCBvZiBhcm91bmQgaW52b2tlIG1ldGhvZHMgZGVjbGFyZWQgb24gdGhlCi0gICAgICAgICAgICAgIGludGVyY2VwdG9yIGNsYXNzIGFuZC9vciBpdHMgc3VwZXItY2xhc3Nlcy4KLSAgICAgICAgICAgIC0gQW4gb3B0aW9uYWwgbGlzdCBlbnZpcm9ubWVudCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBpbnRlcmNlcHRvcgotICAgICAgICAgICAgICBjbGFzcyBhbmQvb3IgaXRzIHN1cGVyLWNsYXNzZXMuCi0gICAgICAgICAgICAtIEFuIG9wdGlvbmFsIGxpc3Qgb2YgcG9zdC1hY3RpdmF0ZSBtZXRob2RzIGRlY2xhcmVkIG9uIHRoZQotICAgICAgICAgICAgICBpbnRlcmNlcHRvciBjbGFzcyBhbmQvb3IgaXRzIHN1cGVyLWNsYXNzZXMuCi0gICAgICAgICAgICAtIEFuIG9wdGlvbmFsIGxpc3Qgb2YgcHJlLXBhc3NpdmF0ZSBtZXRob2RzIGRlY2xhcmVkIG9uIHRoZQotICAgICAgICAgICAgICBpbnRlcmNlcHRvciBjbGFzcyBhbmQvb3IgaXRzIHN1cGVyLWNsYXNzZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW50ZXJjZXB0b3ItY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXJvdW5kLWludm9rZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YXJvdW5kLWludm9rZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmpuZGlFbnZpcm9ubWVudFJlZnNHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtYWN0aXZhdGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmxpZmVjeWNsZS1jYWxsYmFja1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBhc3NpdmF0ZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnRlcmNlcHRvcnNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGludGVyY2VwdG9yc1R5cGUgZWxlbWVudCBkZWNsYXJlcyBvbmUgb3IgbW9yZSBpbnRlcmNlcHRvcgotICAgICAgICBjbGFzc2VzIHVzZWQgYnkgY29tcG9uZW50cyB3aXRoaW4gdGhpcyBlamItamFyLiAgVGhlIGRlY2xhcmF0aW9uCi0gICAgICAgIGNvbnNpc3RzIG9mIDoKLQotICAgICAgICAgICAgLSBBbiBvcHRpb25hbCBkZXNjcmlwdGlvbi4KLSAgICAgICAgICAgIC0gT25lIG9yIG1vcmUgaW50ZXJjZXB0b3IgZWxlbWVudHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW50ZXJjZXB0b3IiCi0JCSAgIHR5cGU9ImphdmFlZTppbnRlcmNlcHRvclR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kcml2ZW4tYmVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtZXNzYWdlLWRyaXZlbiBlbGVtZW50IGRlY2xhcmVzIGEgbWVzc2FnZS1kcml2ZW4KLQliZWFuLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0KLQkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCSAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotCSAgICAtIGFuIG9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNvbnRhaW5zIGEgc21hbGwgYW5kIGEgbGFyZ2UKLQkgICAgICBpY29uIGZpbGUgbmFtZS4KLQkgICAgLSBhIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbiBpbgotCSAgICAgIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLSAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgbWFwcGVkLW5hbWUgZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUKLSAgICAgICAgICAgICAgdmVuZG9yLXNwZWNpZmljIGRlcGxveW1lbnQgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgcGh5c2ljYWwKLSAgICAgICAgICAgICAgam5kaS1uYW1lIG9mIGRlc3RpbmF0aW9uIGZyb20gd2hpY2ggdGhpcyBtZXNzYWdlLWRyaXZlbiBiZWFuCi0gICAgICAgICAgICAgIHNob3VsZCBjb25zdW1lLiAgVGhpcyBlbGVtZW50IGlzIG5vdCByZXF1aXJlZCB0byBiZSBzdXBwb3J0ZWQKLSAgICAgICAgICAgICAgYnkgYWxsIGltcGxlbWVudGF0aW9ucy4gIEFueSB1c2Ugb2YgdGhpcyBlbGVtZW50IGlzIG5vbi1wb3J0YWJsZS4KLQkgICAgLSB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdpbmcKLQkgICAgICB0eXBlCi0gICAgICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgdGltZW91dCBtZXRob2QuCi0JICAgIC0gdGhlIG9wdGlvbmFsIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50Ci0gICAgICAgICAgICAgIHR5cGUuIElmIGl0IGlzIG5vdCBkZWZpbmVkLCBpdCBpcyBkZWZhdWx0ZWQgdG8gQ29udGFpbmVyLgotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLQkgICAgICBtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0JICAgICAgbWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncwotCSAgICAgIGFjdGl2YXRpb24gY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzCi0gICAgICAgICAgICAtIGFuIG9wdGlvbmFsIGxpc3Qgb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4gY2xhc3MgYW5kL29yCi0gICAgICAgICAgICAgIHN1cGVyY2xhc3MgYXJvdW5kLWludm9rZSBtZXRob2RzLgotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQKLQkgICAgICBlbnRyaWVzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwgRUpCCi0JICAgICAgcmVmZXJlbmNlcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3Mgd2ViIHNlcnZpY2UKLQkgICAgICByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5Ci0JICAgICAgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzCi0JICAgICAgbWV0aG9kcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLQkgICAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeQotCSAgICAgIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHJlc291cmNlCi0JICAgICAgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4KLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2UKLQkgICAgICBkZXN0aW5hdGlvbiByZWZlcmVuY2VzCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcHBlZC1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWNsYXNzIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgVGhlIGVqYi1jbGFzcyBlbGVtZW50IHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUKLSAgICAgICAgICAgICBvZiB0aGUgYmVhbiBjbGFzcyBmb3IgdGhpcyBlamIuICBJdCBpcyByZXF1aXJlZCB1bmxlc3MKLSAgICAgICAgICAgICB0aGVyZSBpcyBhIGNvbXBvbmVudC1kZWZpbmluZyBhbm5vdGF0aW9uIGZvciB0aGUgc2FtZQotICAgICAgICAgICAgIGVqYi1uYW1lLgotCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnaW5nLXR5cGUiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbWVzc2FnaW5nLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1lc3NhZ2UKLQkgICAgbGlzdGVuZXIgaW50ZXJmYWNlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRpbWVvdXQtbWV0aG9kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpuYW1lZC1tZXRob2RUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zYWN0aW9uLXR5cGUiCi0JCSAgIHR5cGU9ImphdmFlZTp0cmFuc2FjdGlvbi10eXBlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUiCi0JCSAgIHR5cGU9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsiCi0JCSAgIHR5cGU9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3RpdmF0aW9uLWNvbmZpZyIKLQkJICAgdHlwZT0iamF2YWVlOmFjdGl2YXRpb24tY29uZmlnVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXJvdW5kLWludm9rZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YXJvdW5kLWludm9rZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmpuZGlFbnZpcm9ubWVudFJlZnNHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LWlkZW50aXR5IgotCQkgICB0eXBlPSJqYXZhZWU6c2VjdXJpdHktaWRlbnRpdHlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtaW50ZlR5cGUiPgotCi0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1ldGhvZC1pbnRmIGVsZW1lbnQgYWxsb3dzIGEgbWV0aG9kIGVsZW1lbnQgdG8KLQlkaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZAotCXNpZ25hdHVyZSB0aGF0IGFyZSBtdWx0aXBseSBkZWZpbmVkIGFjcm9zcyB0aGUgaG9tZSBhbmQKLQljb21wb25lbnQgaW50ZXJmYWNlcyAoZS5nLCBpbiBib3RoIGFuIGVudGVycHJpc2UgYmVhbidzCi0JcmVtb3RlIGFuZCBsb2NhbCBpbnRlcmZhY2VzIG9yIGluIGJvdGggYW4gZW50ZXJwcmlzZSBiZWFuJ3MKLQlob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcywgZXRjLik7IHRoZSBjb21wb25lbnQgYW5kIHdlYgotCXNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcywgYW5kIHNvIG9uLiBUaGUgTG9jYWwgYXBwbGllcyB0bwotICAgICAgICBib3RoIGxvY2FsIGNvbXBvbmVudCBpbnRlcmZhY2UgYW5kIGxvY2FsIGJ1c2luZXNzIGludGVyZmFjZS4KLSAgICAgICAgU2ltaWxhcmx5LCBSZW1vdGUgYXBwbGllcyB0byBib3RoIHJlbW90ZSBjb21wb25lbnQgaW50ZXJmYWNlCi0gICAgICAgIGFuZCB0aGUgcmVtb3RlIGJ1c2luZXNzIGludGVyZmFjZS4KLQotCVRoZSBtZXRob2QtaW50ZiBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLQkgICAgSG9tZQotCSAgICBSZW1vdGUKLQkgICAgTG9jYWxIb21lCi0JICAgIExvY2FsCi0JICAgIFNlcnZpY2VFbmRwb2ludAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIb21lIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVtb3RlIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWxIb21lIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTG9jYWwiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTZXJ2aWNlRW5kcG9pbnQiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBtZXRob2QtbmFtZVR5cGUgY29udGFpbnMgYSBuYW1lIG9mIGFuIGVudGVycHJpc2UKLQliZWFuIG1ldGhvZCBvciB0aGUgYXN0ZXJpc2sgKCopIGNoYXJhY3Rlci4gVGhlIGFzdGVyaXNrIGlzCi0JdXNlZCB3aGVuIHRoZSBlbGVtZW50IGRlbm90ZXMgYWxsIHRoZSBtZXRob2RzIG9mIGFuCi0JZW50ZXJwcmlzZSBiZWFuJ3MgY2xpZW50IHZpZXcgaW50ZXJmYWNlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtcGFyYW1zVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1ldGhvZC1wYXJhbXNUeXBlIGRlZmluZXMgYSBsaXN0IG9mIHRoZQotCWZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZXMgb2YgdGhlIG1ldGhvZCBwYXJhbWV0ZXJzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wYXJhbSIKLQkJICAgdHlwZT0iamF2YWVlOmphdmEtdHlwZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbWV0aG9kLXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBwcmltaXRpdmUKLQkgICAgb3IgYSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG5hbWUgb2YgYSBtZXRob2QKLQkgICAgcGFyYW1ldGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1wZXJtaXNzaW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1ldGhvZC1wZXJtaXNzaW9uVHlwZSBzcGVjaWZpZXMgdGhhdCBvbmUgb3IgbW9yZQotCXNlY3VyaXR5IHJvbGVzIGFyZSBhbGxvd2VkIHRvIGludm9rZSBvbmUgb3IgbW9yZSBlbnRlcnByaXNlCi0JYmVhbiBtZXRob2RzLiBUaGUgbWV0aG9kLXBlcm1pc3Npb25UeXBlIGNvbnNpc3RzIG9mIGFuCi0Jb3B0aW9uYWwgZGVzY3JpcHRpb24sIGEgbGlzdCBvZiBzZWN1cml0eSByb2xlIG5hbWVzIG9yIGFuCi0JaW5kaWNhdG9yIHRvIHN0YXRlIHRoYXQgdGhlIG1ldGhvZCBpcyB1bmNoZWNrZWQgZm9yCi0JYXV0aG9yaXphdGlvbiwgYW5kIGEgbGlzdCBvZiBtZXRob2QgZWxlbWVudHMuCi0KLQlUaGUgc2VjdXJpdHkgcm9sZXMgdXNlZCBpbiB0aGUgbWV0aG9kLXBlcm1pc3Npb25UeXBlCi0JbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzIG9mIHRoZQotCWRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kIHRoZSBtZXRob2RzIG11c3QgYmUgbWV0aG9kcwotCWRlZmluZWQgaW4gdGhlIGVudGVycHJpc2UgYmVhbidzIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQKLSAgICAgICAgYW5kL29yIHdlYiBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiCi0JCSAgICAgdHlwZT0iamF2YWVlOnJvbGUtbmFtZVR5cGUiCi0JCSAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQk8eHNkOmVsZW1lbnQgbmFtZT0idW5jaGVja2VkIgotCQkgICAgIHR5cGU9ImphdmFlZTplbXB0eVR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgdW5jaGVja2VkIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgYSBtZXRob2QgaXMKLQkgICAgICBub3QgY2hlY2tlZCBmb3IgYXV0aG9yaXphdGlvbiBieSB0aGUgY29udGFpbmVyCi0JICAgICAgcHJpb3IgdG8gaW52b2NhdGlvbiBvZiB0aGUgbWV0aG9kLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kIgotCQkgICB0eXBlPSJqYXZhZWU6bWV0aG9kVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBtZXRob2RUeXBlIGlzIHVzZWQgdG8gZGVub3RlIGEgbWV0aG9kIG9mIGFuIGVudGVycHJpc2UKLQkgIGJlYW4ncyBidXNpbmVzcywgaG9tZSwgY29tcG9uZW50LCBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQKLQkgIGludGVyZmFjZSwgb3IsIGluIHRoZSBjYXNlIG9mIGEgbWVzc2FnZS1kcml2ZW4gYmVhbiwgdGhlCi0JICBiZWFuJ3MgbWVzc2FnZSBsaXN0ZW5lciBtZXRob2QsIG9yIGEgc2V0IG9mIHN1Y2gKLQkgIG1ldGhvZHMuIFRoZSBlamItbmFtZSBlbGVtZW50IG11c3QgYmUgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZQotCSAgZW50ZXJwcmlzZSBiZWFucyBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yOyB0aGUKLQkgIG9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgYWxsb3dzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYQotCSAgbWV0aG9kIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIHRoYXQgaXMgbXVsdGlwbHkgZGVmaW5lZAotCSAgYWNyb3NzIHRoZSBidXNpbmVzcywgaG9tZSwgY29tcG9uZW50LCBhbmQvb3Igd2ViIHNlcnZpY2UKLSAgICAgICAgICBlbmRwb2ludCBudGVyZmFjZXM7IHRoZSBtZXRob2QtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUKLSAgICAgICAgICBtZXRob2QgbmFtZTsgYW5kIHRoZSBvcHRpb25hbCBtZXRob2QtcGFyYW1zIGVsZW1lbnRzIGlkZW50aWZ5Ci0gICAgICAgICAgYSBzaW5nbGUgbWV0aG9kIGFtb25nIG11bHRpcGxlIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkCi0JICBtZXRob2QgbmFtZS4KLQotCSAgVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHN0eWxlcyBvZiB1c2luZyBtZXRob2RUeXBlIGVsZW1lbnQKLQkgIHdpdGhpbiBhIG1ldGhvZCBlbGVtZW50OgotCi0JICAxLgotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPgotCSAgPC9tZXRob2Q+Ci0KLQkgICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlCi0JICAgICBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuJ3MgYnVzaW5lc3MsIGhvbWUsIGNvbXBvbmVudCwKLSAgICAgICAgICAgICBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcy4KLQotCSAgMi4KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtbmFtZT5NRVRIT0Q8L21ldGhvZC1uYW1lPgotCSAgPC9tZXRob2Q+Ci0KLQkgICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byB0aGUgc3BlY2lmaWVkIG1ldGhvZCBvZgotCSAgICAgdGhlIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4uIElmIHRoZXJlIGFyZSBtdWx0aXBsZQotCSAgICAgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG92ZXJsb2FkZWQgbmFtZSwgdGhlIGVsZW1lbnQgb2YKLQkgICAgIHRoaXMgc3R5bGUgcmVmZXJzIHRvIGFsbCB0aGUgbWV0aG9kcyB3aXRoIHRoZSBvdmVybG9hZGVkCi0JICAgICBuYW1lLgotCi0JICAzLgotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0JCSAgPG1ldGhvZC1wYXJhbT5QQVJBTS0xPC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5QQVJBTS0yPC9tZXRob2QtcGFyYW0+Ci0JCSAgLi4uCi0JCSAgPG1ldGhvZC1wYXJhbT5QQVJBTS1uPC9tZXRob2QtcGFyYW0+Ci0JICAgICAgPC9tZXRob2QtcGFyYW1zPgotCSAgPC9tZXRob2Q+Ci0KLQkgICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhIHNpbmdsZSBtZXRob2Qgd2l0aGluIGEKLQkgICAgIHNldCBvZiBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZCBuYW1lLiBQQVJBTS0xIHRocm91Z2gKLQkgICAgIFBBUkFNLW4gYXJlIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlcyBvZiB0aGUKLQkgICAgIG1ldGhvZCdzIGlucHV0IHBhcmFtZXRlcnMgKGlmIHRoZSBtZXRob2QgaGFzIG5vIGlucHV0Ci0JICAgICBhcmd1bWVudHMsIHRoZSBtZXRob2QtcGFyYW1zIGVsZW1lbnQgY29udGFpbnMgbm8KLQkgICAgIG1ldGhvZC1wYXJhbSBlbGVtZW50cykuIEFycmF5cyBhcmUgc3BlY2lmaWVkIGJ5IHRoZQotCSAgICAgYXJyYXkgZWxlbWVudCdzIHR5cGUsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBhaXIgb2YKLQkgICAgIHNxdWFyZSBicmFja2V0cyAoZS5nLiBpbnRbXVtdKS4gSWYgdGhlcmUgYXJlIG11bHRpcGxlCi0JICAgICBtZXRob2RzIHdpdGggdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGlzIHN0eWxlIHJlZmVycwotCSAgICAgdG8gYWxsIG9mIHRoZSBvdmVybG9hZGVkIG1ldGhvZHMuCi0KLQkgIEV4YW1wbGVzOgotCi0JICBTdHlsZSAxOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlCi0JICBtZXRob2RzIG9mIHRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGJ1c2luZXNzLCBob21lLAotICAgICAgICAgIGNvbXBvbmVudCwgYW5kL29yIHdlYiBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXM6Ci0KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPgotCSAgPC9tZXRob2Q+Ci0KLQkgIFN0eWxlIDI6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUKLQkgIGNyZWF0ZSBtZXRob2RzIG9mIHRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUKLQkgIGludGVyZmFjZShzKS4KLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KLQkgIDwvbWV0aG9kPgotCi0JICBTdHlsZSAzOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byB0aGUKLQkgIGNyZWF0ZShTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgTGFzdE5hbWUpIG1ldGhvZCBvZiB0aGUKLQkgIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UocykuCi0KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JICAgICAgPC9tZXRob2QtcGFyYW1zPgotCSAgPC9tZXRob2Q+Ci0KLQkgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBhIFN0eWxlIDMgZWxlbWVudCB3aXRoCi0JICBtb3JlIGNvbXBsZXggcGFyYW1ldGVyIHR5cGVzLiBUaGUgbWV0aG9kCi0JICBmb29iYXIoY2hhciBzLCBpbnQgaSwgaW50W10gaWFyLCBteXBhY2thZ2UuTXlDbGFzcyBteWNsLAotCSAgbXlwYWNrYWdlLk15Q2xhc3NbXVtdIG15Y2xhYXIpIHdvdWxkIGJlIHNwZWNpZmllZCBhczoKLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLW5hbWU+Zm9vYmFyPC9tZXRob2QtbmFtZT4KLQkgICAgICA8bWV0aG9kLXBhcmFtcz4KLQkJICA8bWV0aG9kLXBhcmFtPmNoYXI8L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPmludDwvbWV0aG9kLXBhcmFtPgotCQkgIDxtZXRob2QtcGFyYW0+aW50W108L21ldGhvZC1wYXJhbT4KLQkJICA8bWV0aG9kLXBhcmFtPm15cGFja2FnZS5NeUNsYXNzPC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5teXBhY2thZ2UuTXlDbGFzc1tdW108L21ldGhvZC1wYXJhbT4KLQkgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0JICA8L21ldGhvZD4KLQotCSAgVGhlIG9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgY2FuIGJlIHVzZWQgd2hlbiBpdCBiZWNvbWVzCi0JICBuZWNlc3NhcnkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGEgbWV0aG9kIHRoYXQgaXMgbXVsdGlwbHkKLQkgIGRlZmluZWQgYWNyb3NzIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcywgaG9tZSwgY29tcG9uZW50LAotICAgICAgICAgIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQKLQkgIHNpZ25hdHVyZS4gSG93ZXZlciwgaWYgdGhlIHNhbWUgbWV0aG9kIGlzIGEgbWV0aG9kIG9mIGJvdGggdGhlCi0gICAgICAgICAgbG9jYWwgYnVzaW5lc3MgaW50ZXJmYWNlLCBhbmQgdGhlIGxvY2FsIGNvbXBvbmVudCBpbnRlcmZhY2UsCi0gICAgICAgICAgdGhlIHNhbWUgYXR0cmlidXRlIGFwcGxpZXMgdG8gdGhlIG1ldGhvZCBmb3IgYm90aCBpbnRlcmZhY2VzLgotICAgICAgICAgIExpa2V3aXNlLCBpZiB0aGUgc2FtZSBtZXRob2QgaXMgYSBtZXRob2Qgb2YgYm90aCB0aGUgcmVtb3RlCi0gICAgICAgICAgYnVzaW5lc3MgaW50ZXJmYWNlIGFuZCB0aGUgcmVtb3RlIGNvbXBvbmVudCBpbnRlcmZhY2UsIHRoZSBzYW1lCi0gICAgICAgICAgYXR0cmlidXRlIGFwcGxpZXMgdG8gdGhlIG1ldGhvZCBmb3IgYm90aCBpbnRlcmZhY2VzLgotCi0JICBGb3IgZXhhbXBsZSwgdGhlIG1ldGhvZCBlbGVtZW50Ci0KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0JICAgICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+Ci0JICAgICAgPC9tZXRob2QtcGFyYW1zPgotCSAgPC9tZXRob2Q+Ci0KLQkgIGNhbiBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykKLQkgIG1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlIGZyb20gdGhlCi0JICBjcmVhdGUoU3RyaW5nLCBTdHJpbmcpIG1ldGhvZCBkZWZpbmVkIGluIHRoZSByZW1vdGUgaG9tZQotCSAgaW50ZXJmYWNlLCB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0KLQkgIDxtZXRob2Q+Ci0JICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+Ci0JICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotCSAgICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotCSAgICAgIDxtZXRob2QtcGFyYW1zPgotCQkgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCQkgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCSAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLQkgIDwvbWV0aG9kPgotCi0JICBhbmQgdGhlIGNyZWF0ZSBtZXRob2QgdGhhdCBpcyBkZWZpbmVkIGluIHRoZSBsb2NhbCBob21lCi0JICBpbnRlcmZhY2Ugd2hpY2ggd291bGQgYmUgZGVmaW5lZCBhcwotCi0JICA8bWV0aG9kPgotCSAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgotCSAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotCSAgICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgotCSAgICAgIDxtZXRob2QtcGFyYW1zPgotCQkgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCQkgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotCSAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLQkgIDwvbWV0aG9kPgotCi0JICBUaGUgbWV0aG9kLWludGYgZWxlbWVudCBjYW4gYmUgdXNlZCB3aXRoIGFsbCB0aHJlZSBTdHlsZXMKLQkgIG9mIHRoZSBtZXRob2QgZWxlbWVudCB1c2FnZS4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcKLQkgIG1ldGhvZCBlbGVtZW50IGV4YW1wbGUgY291bGQgYmUgdXNlZCB0byByZWZlciB0byBhbGwgdGhlCi0JICBtZXRob2RzIG9mIHRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIHJlbW90ZSBob21lIGludGVyZmFjZQotICAgICAgICAgIGFuZCB0aGUgcmVtb3RlIGJ1c2luZXNzIGludGVyZmFjZS4KLQotCSAgPG1ldGhvZD4KLQkgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KLQkgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0JICAgICAgPG1ldGhvZC1uYW1lPio8L21ldGhvZC1uYW1lPgotCSAgPC9tZXRob2Q+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLWludGYiCi0JCSAgIHR5cGU9ImphdmFlZTptZXRob2QtaW50ZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6bWV0aG9kLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLXBhcmFtcyIKLQkJICAgdHlwZT0iamF2YWVlOm1ldGhvZC1wYXJhbXNUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtdWx0aXBsaWNpdHlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbXVsdGlwbGljaXR5VHlwZSBkZXNjcmliZXMgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUKLQlyb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb24uCi0KLQlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQkgICAgT25lCi0JICAgIE1hbnkKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT25lIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTWFueSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLW1ldGhvZFR5cGUiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtcGFyYW1zIgotCQkgICB0eXBlPSJqYXZhZWU6bWV0aG9kLXBhcmFtc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcGVyc2lzdGVuY2UtdHlwZVR5cGUgc3BlY2lmaWVzIGFuIGVudGl0eSBiZWFuJ3MgcGVyc2lzdGVuY2UKLQltYW5hZ2VtZW50IHR5cGUuCi0KLQlUaGUgcGVyc2lzdGVuY2UtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JICAgIEJlYW4KLQkgICAgQ29udGFpbmVyCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkJlYW4iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluZXIiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1tZXRob2RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBxdWVyeS1tZXRob2Qgc3BlY2lmaWVzIHRoZSBtZXRob2QgZm9yIGEgZmluZGVyIG9yIHNlbGVjdAotCSAgcXVlcnkuCi0KLQkgIFRoZSBtZXRob2QtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGZpbmRlciBvciBzZWxlY3QKLQkgIG1ldGhvZCBpbiB0aGUgZW50aXR5IGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLQotCSAgRWFjaCBtZXRob2QtcGFyYW0gbXVzdCBiZSBkZWZpbmVkIGZvciBhIHF1ZXJ5LW1ldGhvZCB1c2luZyB0aGUKLQkgIG1ldGhvZC1wYXJhbXMgZWxlbWVudC4KLQotCSAgSXQgaXMgdXNlZCBieSB0aGUgcXVlcnktbWV0aG9kIGVsZW1lbnQuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxxdWVyeT4KLQkgICAgICA8ZGVzY3JpcHRpb24+TWV0aG9kIGZpbmRzIGxhcmdlIG9yZGVyczwvZGVzY3JpcHRpb24+Ci0JICAgICAgPHF1ZXJ5LW1ldGhvZD4KLQkJICA8bWV0aG9kLW5hbWU+ZmluZExhcmdlT3JkZXJzPC9tZXRob2QtbmFtZT4KLQkJICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0JICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0JICAgICAgPGVqYi1xbD4KLQkJU0VMRUNUIE9CSkVDVChvKSBGUk9NIE9yZGVyIG8KLQkJICBXSEVSRSBvLmFtb3VudCAmZ3Q7IDEwMDAKLQkgICAgICA8L2VqYi1xbD4KLQkgIDwvcXVlcnk+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOm1ldGhvZC1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wYXJhbXMiCi0JCSAgIHR5cGU9ImphdmFlZTptZXRob2QtcGFyYW1zVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHF1ZXJ5VHlwZSBkZWZpbmVzIGEgZmluZGVyIG9yIHNlbGVjdAotCXF1ZXJ5LiBJdCBjb250YWlucwotCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBxdWVyeQotCSAgICAtIHRoZSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBmaW5kZXIgb3Igc2VsZWN0Ci0JICAgICAgbWV0aG9kIGl0IGlzIHVzZWQgYnkKLQkJLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSByZXN1bHQgdHlwZQotCQkgIG1hcHBpbmcsIGlmIHRoZSBxdWVyeSBpcyBmb3IgYSBzZWxlY3QgbWV0aG9kCi0JCSAgYW5kIGVudGl0eSBvYmplY3RzIGFyZSByZXR1cm5lZC4KLQkJLSB0aGUgRUpCIFFMIHF1ZXJ5IHN0cmluZyB0aGF0IGRlZmluZXMgdGhlIHF1ZXJ5LgotCi0JUXVlcmllcyB0aGF0IGFyZSBleHByZXNzaWJsZSBpbiBFSkIgUUwgbXVzdCB1c2UgdGhlIGVqYi1xbAotCWVsZW1lbnQgdG8gc3BlY2lmeSB0aGUgcXVlcnkuIElmIGEgcXVlcnkgaXMgbm90IGV4cHJlc3NpYmxlCi0JaW4gRUpCIFFMLCB0aGUgZGVzY3JpcHRpb24gZWxlbWVudCBzaG91bGQgYmUgdXNlZCB0bwotCWRlc2NyaWJlIHRoZSBzZW1hbnRpY3Mgb2YgdGhlIHF1ZXJ5IGFuZCB0aGUgZWpiLXFsIGVsZW1lbnQKLQlzaG91bGQgYmUgZW1wdHkuCi0KLQlUaGUgcmVzdWx0LXR5cGUtbWFwcGluZyBpcyBhbiBvcHRpb25hbCBlbGVtZW50LiBJdCBjYW4gb25seQotCWJlIHByZXNlbnQgaWYgdGhlIHF1ZXJ5LW1ldGhvZCBzcGVjaWZpZXMgYSBzZWxlY3QgbWV0aG9kCi0JdGhhdCByZXR1cm5zIGVudGl0eSBvYmplY3RzLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZQotCXJlc3VsdC10eXBlLW1hcHBpbmcgZWxlbWVudCBpcyAiTG9jYWwiLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeS1tZXRob2QiCi0JCSAgIHR5cGU9ImphdmFlZTpxdWVyeS1tZXRob2RUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzdWx0LXR5cGUtbWFwcGluZyIKLQkJICAgdHlwZT0iamF2YWVlOnJlc3VsdC10eXBlLW1hcHBpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcWwiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25zaGlwLXJvbGUtc291cmNlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUgZGVzaWduYXRlcyB0aGUgc291cmNlIG9mIGEKLQlyb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb25zaGlwLiBBCi0JcmVsYXRpb25zaGlwLXJvbGUtc291cmNlVHlwZSBpcyB1c2VkIGJ5Ci0JcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnRzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuCi0JZW50aXR5IGJlYW4uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uc2hpcHNUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcmVsYXRpb25zaGlwc1R5cGUgZGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXBzIGluCi0Jd2hpY2ggZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UKLQlwYXJ0aWNpcGF0ZS4gVGhlIHJlbGF0aW9uc2hpcHNUeXBlIGNvbnRhaW5zIGFuIG9wdGlvbmFsCi0JZGVzY3JpcHRpb247IGFuZCBhIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaAotCXNwZWNpZnkgdGhlIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVsYXRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTplamItcmVsYXRpb25UeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0KLQk8eHNkOnVuaXF1ZSBuYW1lPSJyb2xlLW5hbWUtdW5pcXVlbmVzcyI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0JICAgICAgcmVsYXRpb25zaGlwIHJvbGUuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbgotCSAgICAgIGEgcmVsYXRpb25zaGlwLCBidXQgY2FuIGJlIHJldXNlZCBpbiBkaWZmZXJlbnQKLQkgICAgICByZWxhdGlvbnNoaXBzLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvcgotCSAgICAgICB4cGF0aD0iLi8vamF2YWVlOmVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lIi8+Ci0JICA8eHNkOmZpZWxkCi0JICAgICAgIHhwYXRoPSIuIi8+Ci0JPC94c2Q6dW5pcXVlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZW1vdmUtbWV0aG9kVHlwZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiZWFuLW1ldGhvZCIKLQkJICAgdHlwZT0iamF2YWVlOm5hbWVkLW1ldGhvZFR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXRhaW4taWYtZXhjZXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc3VsdC10eXBlLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcmVzdWx0LXR5cGUtbWFwcGluZ1R5cGUgaXMgdXNlZCBpbiB0aGUgcXVlcnkgZWxlbWVudCB0bwotCXNwZWNpZnkgd2hldGhlciBhbiBhYnN0cmFjdCBzY2hlbWEgdHlwZSByZXR1cm5lZCBieSBhIHF1ZXJ5Ci0JZm9yIGEgc2VsZWN0IG1ldGhvZCBpcyB0byBiZSBtYXBwZWQgdG8gYW4gRUpCTG9jYWxPYmplY3Qgb3IKLQlFSkJPYmplY3QgdHlwZS4KLQotCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0JICAgIExvY2FsCi0JICAgIFJlbW90ZQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMb2NhbCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlbW90ZSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LWlkZW50aXR5VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlY3VyaXR5LWlkZW50aXR5VHlwZSBzcGVjaWZpZXMgd2hldGhlciB0aGUgY2FsbGVyJ3MKLQlzZWN1cml0eSBpZGVudGl0eSBpcyB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZQotCW1ldGhvZHMgb2YgdGhlIGVudGVycHJpc2UgYmVhbiBvciB3aGV0aGVyIGEgc3BlY2lmaWMgcnVuLWFzCi0JaWRlbnRpdHkgaXMgdG8gYmUgdXNlZC4gSXQgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQlhbmQgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0idXNlLWNhbGxlci1pZGVudGl0eSIKLQkJICAgICB0eXBlPSJqYXZhZWU6ZW1wdHlUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHVzZS1jYWxsZXItaWRlbnRpdHkgZWxlbWVudCBzcGVjaWZpZXMgdGhhdAotCSAgICAgIHRoZSBjYWxsZXIncyBzZWN1cml0eSBpZGVudGl0eSBiZSB1c2VkIGFzIHRoZQotCSAgICAgIHNlY3VyaXR5IGlkZW50aXR5IGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZQotCSAgICAgIGVudGVycHJpc2UgYmVhbidzIG1ldGhvZHMuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0icnVuLWFzIgotCQkgICAgIHR5cGU9ImphdmFlZTpydW4tYXNUeXBlIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbi1iZWFuVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlc3Npb24tYmVhblR5cGUgZGVjbGFyZXMgYW4gc2Vzc2lvbiBiZWFuLiBUaGUKLQlkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLQotCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0JICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZQotCSAgICAgIGljb24gZmlsZSBuYW1lCi0JICAgIC0gYSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4KLQkgICAgICBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdGlvbgotICAgICAgICAgICAgLSBhbiBvcHRpb25hbCBtYXBwZWQtbmFtZSBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZQotICAgICAgICAgICAgICB2ZW5kb3Itc3BlY2lmaWMgZGVwbG95bWVudCBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBwaHlzaWNhbAotICAgICAgICAgICAgICBqbmRpLW5hbWUgb2YgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSBob21lL2J1c2luZXNzIGludGVyZmFjZS4KLSAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIG5vdCByZXF1aXJlZCB0byBiZSBzdXBwb3J0ZWQgYnkgYWxsCi0gICAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucy4gQW55IHVzZSBvZiB0aGlzIGVsZW1lbnQgaXMgbm9uLXBvcnRhYmxlLgotICAgICAgICAgICAgLSB0aGUgbmFtZXMgb2YgYWxsIHRoZSByZW1vdGUgb3IgbG9jYWwgYnVzaW5lc3MgaW50ZXJmYWNlcywKLSAgICAgICAgICAgICAgaWYgYW55Ci0JICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyByZW1vdGUgaG9tZSBhbmQKLQkgICAgICByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55Ci0JICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyBsb2NhbCBob21lIGFuZAotCSAgICAgIGxvY2FsIGludGVyZmFjZXMsIGlmIGFueQotCSAgICAtIHRoZSBuYW1lIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyB3ZWIgc2VydmljZSBlbmRwb2ludAotCSAgICAgIGludGVyZmFjZSwgaWYgYW55Ci0JICAgIC0gdGhlIHNlc3Npb24gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0JICAgIC0gdGhlIHNlc3Npb24gYmVhbidzIHN0YXRlIG1hbmFnZW1lbnQgdHlwZQotICAgICAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgdGltZW91dCBtZXRob2QuCi0JICAgIC0gdGhlIG9wdGlvbmFsIHNlc3Npb24gYmVhbidzIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZS4KLSAgICAgICAgICAgICAgSWYgaXQgaXMgbm90IHByZXNlbnQsIGl0IGlzIGRlZmF1bHRlZCB0byBDb250YWluZXIuCi0gICAgICAgICAgICAtIGFuIG9wdGlvbmFsIGxpc3Qgb2YgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBhbmQvb3IKLSAgICAgICAgICAgICAgc3VwZXJjbGFzcyBhcm91bmQtaW52b2tlIG1ldGhvZHMuCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotCSAgICAgIGVudmlyb25tZW50IGVudHJpZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQiByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbAotCSAgICAgIEVKQiByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB3ZWIKLQkgICAgICBzZXJ2aWNlIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZQotCSAgICAgIHJlZmVyZW5jZXMKLQkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkKLQkgICAgICB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kcwotCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UKLQkgICAgICBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotCSAgICAgIGVudmlyb25tZW50IHJlZmVyZW5jZXMuCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdlCi0JICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcwotCi0JVGhlIGVsZW1lbnRzIHRoYXQgYXJlIG9wdGlvbmFsIGFyZSAib3B0aW9uYWwiIGluIHRoZSBzZW5zZQotCXRoYXQgdGhleSBhcmUgb21pdHRlZCB3aGVuIGlmIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlCi0JZW1wdHkuCi0KLQlFaXRoZXIgYm90aCB0aGUgbG9jYWwtaG9tZSBhbmQgdGhlIGxvY2FsIGVsZW1lbnRzIG9yIGJvdGgKLQl0aGUgaG9tZSBhbmQgdGhlIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgdGhlCi0Jc2Vzc2lvbiBiZWFuLgotCi0JVGhlIHNlcnZpY2UtZW5kcG9pbnQgZWxlbWVudCBtYXkgb25seSBiZSBzcGVjaWZpZWQgaWYgdGhlCi0JYmVhbiBpcyBhIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW4uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcHBlZC1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaG9tZSIKLQkJICAgdHlwZT0iamF2YWVlOmhvbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUiCi0JCSAgIHR5cGU9ImphdmFlZTpyZW1vdGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbC1ob21lIgotCQkgICB0eXBlPSJqYXZhZWU6bG9jYWwtaG9tZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsIgotCQkgICB0eXBlPSJqYXZhZWU6bG9jYWxUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJidXNpbmVzcy1sb2NhbCIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJ1c2luZXNzLXJlbW90ZSIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtZW5kcG9pbnQiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgc2VydmljZS1lbmRwb2ludCBlbGVtZW50IGNvbnRhaW5zIHRoZQotCSAgICBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3Mgd2ViCi0JICAgIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLiBUaGUgc2VydmljZS1lbmRwb2ludAotCSAgICBlbGVtZW50IG1heSBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYSBzdGF0ZWxlc3MKLQkgICAgc2Vzc2lvbiBiZWFuLiBUaGUgc3BlY2lmaWVkIGludGVyZmFjZSBtdXN0IGJlIGEKLQkgICAgdmFsaWQgSkFYLVJQQyBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTplamItY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICBUaGUgZWpiLWNsYXNzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZQotICAgICAgICAgICAgIG9mIHRoZSBiZWFuIGNsYXNzIGZvciB0aGlzIGVqYi4gIEl0IGlzIHJlcXVpcmVkIHVubGVzcwotICAgICAgICAgICAgIHRoZXJlIGlzIGEgY29tcG9uZW50LWRlZmluaW5nIGFubm90YXRpb24gZm9yIHRoZSBzYW1lCi0gICAgICAgICAgICAgZWpiLW5hbWUuCi0KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLXR5cGUiCi0JCSAgIHR5cGU9ImphdmFlZTpzZXNzaW9uLXR5cGVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRpbWVvdXQtbWV0aG9kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpuYW1lZC1tZXRob2RUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXQtbWV0aG9kIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTppbml0LW1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBpbml0LW1ldGhvZCBlbGVtZW50IHNwZWNpZmllcyB0aGUgbWFwcGluZ3MgZm9yCi0JICAgIEVKQiAyLnggc3R5bGUgY3JlYXRlIG1ldGhvZHMgZm9yIGFuIEVKQiAzLjAgYmVhbi4KLQkgICAgVGhpcyBlbGVtZW50IGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3Igc3RhdGVmdWwKLSAgICAgICAgICAgIHNlc3Npb24gYmVhbnMuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVtb3ZlLW1ldGhvZCIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cmVtb3ZlLW1ldGhvZFR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByZW1vdmUtbWV0aG9kIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtYXBwaW5ncyBmb3IKLQkgICAgRUpCIDIueCBzdHlsZSByZW1vdmUgbWV0aG9kcyBmb3IgYW4gRUpCIDMuMCBiZWFuLgotCSAgICBUaGlzIGVsZW1lbnQgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBzdGF0ZWZ1bAotICAgICAgICAgICAgc2Vzc2lvbiBiZWFucy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2FjdGlvbi10eXBlIgotCQkgICB0eXBlPSJqYXZhZWU6dHJhbnNhY3Rpb24tdHlwZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXJvdW5kLWludm9rZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6YXJvdW5kLWludm9rZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmpuZGlFbnZpcm9ubWVudFJlZnNHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtYWN0aXZhdGUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmxpZmVjeWNsZS1jYWxsYmFja1R5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBhc3NpdmF0ZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6bGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlLXJlZiIKLQkJICAgdHlwZT0iamF2YWVlOnNlY3VyaXR5LXJvbGUtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY3VyaXR5LWlkZW50aXR5IgotCQkgICB0eXBlPSJqYXZhZWU6c2VjdXJpdHktaWRlbnRpdHlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2Vzc2lvbi10eXBlVHlwZSBkZXNjcmliZXMgd2hldGhlciB0aGUgc2Vzc2lvbiBiZWFuIGlzIGEKLQlzdGF0ZWZ1bCBzZXNzaW9uIG9yIHN0YXRlbGVzcyBzZXNzaW9uLiBJdCBpcyB1c2VkIGJ5Ci0Jc2Vzc2lvbi10eXBlIGVsZW1lbnRzLgotCi0JVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JICAgIFN0YXRlZnVsCi0JICAgIFN0YXRlbGVzcwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdGF0ZWZ1bCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXRlbGVzcyIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zLWF0dHJpYnV0ZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0cmFucy1hdHRyaWJ1dGVUeXBlIHNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lciBtdXN0Ci0JbWFuYWdlIHRoZSB0cmFuc2FjdGlvbiBib3VuZGFyaWVzIHdoZW4gZGVsZWdhdGluZyBhIG1ldGhvZAotCWludm9jYXRpb24gdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgYnVzaW5lc3MgbWV0aG9kLgotCi0JVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLQkgICAgTm90U3VwcG9ydGVkCi0JICAgIFN1cHBvcnRzCi0JICAgIFJlcXVpcmVkCi0JICAgIFJlcXVpcmVzTmV3Ci0JICAgIE1hbmRhdG9yeQotCSAgICBOZXZlcgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOb3RTdXBwb3J0ZWQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTdXBwb3J0cyIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJlcXVpcmVkIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUmVxdWlyZXNOZXciLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJNYW5kYXRvcnkiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOZXZlciIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zYWN0aW9uLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdHJhbnNhY3Rpb24tdHlwZVR5cGUgc3BlY2lmaWVzIGFuIGVudGVycHJpc2UgYmVhbidzCi0JdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlLgotCi0JVGhlIHRyYW5zYWN0aW9uLXR5cGUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQkgICAgQmVhbgotCSAgICBDb250YWluZXIKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQmVhbiIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnRhaW5lciIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qMmVlXzFfNC54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2oyZWVfMV80LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIyMzM0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2oyZWVfMV80LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE2MDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEKLSAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICB2ZXJzaW9uPSIxLjQiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWoyZWVfMV80LnhzZHMJMS40MyAwMy8wOS8xNgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgOTAxIFNhbiBBbnRvbmlvCi0gICAgICBSb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiBBbGwgcmlnaHRzCi0gICAgICByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLTx4c2Q6YW5ub3RhdGlvbj4KLTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyB0aGF0IGFwcGVhciBpbiB0aGUgY29tbW9uCi1zaGFyZWFibGUgc2NoZW1hKHMpIG9mIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBzaG91bGQgYmUKLWludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUgY29udGV4dCB0aGV5IGFyZSBpbmNsdWRlZDoKLQotRGVwbG95bWVudCBDb21wb25lbnQgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgIGoyZWUgYXBwbGljYXRpb247Ci0gICAgYXBwbGljYXRpb24gY2xpZW50OwotICAgIHdlYiBhcHBsaWNhdGlvbjsKLSAgICBlbnRlcnByaXNlIGJlYW47Ci0gICAgcmVzb3VyY2UgYWRhcHRlcjsKLQotRGVwbG95bWVudCBGaWxlIG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICBlYXIgZmlsZTsKLSAgICB3YXIgZmlsZTsKLSAgICBqYXIgZmlsZTsKLSAgICByYXIgZmlsZTsKLQotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLTwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0JICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIvPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0KLQkiaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL3hzZC9qMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8xLnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmdyb3VwIG5hbWU9ImRlc2NyaXB0aW9uR3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgZ3JvdXAga2VlcHMgdGhlIHVzYWdlIG9mIHRoZSBjb250YWluZWQgZGVzY3JpcHRpb24gcmVsYXRlZAotCWVsZW1lbnRzIGNvbnNpc3RlbnQgYWNyb3NzIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KLQotCUFsbCBlbGVtZW50cyBtYXkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgbGFuZ3VhZ2VzLAotCXRvIHN1cHBvcnQgbG9jYWxpemF0aW9uIG9mIHRoZSBjb250ZW50LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0JCSAgIHR5cGU9ImoyZWU6aWNvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlc2NyaXB0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGRlc2NyaXB0aW9uIHR5cGUgaXMgdXNlZCBieSBhIGRlc2NyaXB0aW9uIGVsZW1lbnQgdG8KLQlwcm92aWRlIHRleHQgZGVzY3JpYmluZyB0aGUgcGFyZW50IGVsZW1lbnQuICBUaGUgZWxlbWVudHMKLQl0aGF0IHVzZSB0aGlzIHR5cGUgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlCi0JRGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUgZmlsZSBwcm9kdWNlciB3YW50cwotCXRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0JRGVwbG95bWVudCBGaWxlIChpLmUuLCB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZQotCXRvb2xzIHVzZWQgYnkgc3VjaCBhIERlcGxveW1lbnQgRmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkKLQl0aGUgZGVzY3JpcHRpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSBwYXJlbnQgZWxlbWVudCB0aGF0Ci0JY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uLgotCi0JVGhlIGxhbmcgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxhbmd1YWdlIHRoYXQgdGhlCi0JZGVzY3JpcHRpb24gaXMgcHJvdmlkZWQgaW4uIFRoZSBkZWZhdWx0IHZhbHVlIGlzICJlbiIgKEVuZ2xpc2gpLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iajJlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGV3ZXktdmVyc2lvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBkZWZpbmVzIGEgZGV3ZXkgZGVjaW1hbCB3aGljaCBpcyB1c2VkCi0JdG8gZGVzY3JpYmUgdmVyc2lvbnMgb2YgZG9jdW1lbnRzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkZWNpbWFsIj4KLSAgICAgIDx4c2Q6d2hpdGVTcGFjZSB2YWx1ZT0iY29sbGFwc2UiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNwbGF5LW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBkaXNwbGF5LW5hbWUgdHlwZSBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZAotCSAgdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzLiBJdCBpcyB1c2VkIGJ5IGRpc3BsYXktbmFtZQotCSAgZWxlbWVudHMuICBUaGUgZGlzcGxheSBuYW1lIG5lZWQgbm90IGJlIHVuaXF1ZS4KLQotCSAgRXhhbXBsZToKLQotCSAgLi4uCi0JICAgICA8ZGlzcGxheS1uYW1lIHhtbDpsYW5nPSJlbiI+RW1wbG95ZWUgU2VsZiBTZXJ2aWNlPC9kaXNwbGF5LW5hbWU+Ci0KLQkgIFRoZSB2YWx1ZSBvZiB0aGUgeG1sOmxhbmcgYXR0cmlidXRlIGlzICJlbiIgKEVuZ2xpc2gpIGJ5IGRlZmF1bHQuCi0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1saW5rVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgZWpiLWxpbmtUeXBlIGlzIHVzZWQgYnkgZWpiLWxpbmsKLQkgIGVsZW1lbnRzIGluIHRoZSBlamItcmVmIG9yIGVqYi1sb2NhbC1yZWYgZWxlbWVudHMgdG8gc3BlY2lmeQotCSAgdGhhdCBhbiBFSkIgcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBlbnRlcnByaXNlIGJlYW4uCi0KLQkgIFRoZSB2YWx1ZSBvZiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbgotCSAgZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBzYW1lIGVqYi1qYXIgZmlsZSBvciBpbiBhbm90aGVyIGVqYi1qYXIKLQkgIGZpbGUgaW4gdGhlIHNhbWUgSjJFRSBhcHBsaWNhdGlvbiB1bml0LgotCi0JICBBbHRlcm5hdGl2ZWx5LCB0aGUgbmFtZSBpbiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtYXkgYmUKLQkgIGNvbXBvc2VkIG9mIGEgcGF0aCBuYW1lIHNwZWNpZnlpbmcgdGhlIGVqYi1qYXIgY29udGFpbmluZyB0aGUKLQkgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuIHdpdGggdGhlIGVqYi1uYW1lIG9mIHRoZSB0YXJnZXQKLQkgIGJlYW4gYXBwZW5kZWQgYW5kIHNlcGFyYXRlZCBmcm9tIHRoZSBwYXRoIG5hbWUgYnkgIiMiLiAgVGhlCi0JICBwYXRoIG5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIERlcGxveW1lbnQgRmlsZSBjb250YWluaW5nCi0JICBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0IGlzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlCi0JICBiZWFuLiAgVGhpcyBhbGxvd3MgbXVsdGlwbGUgZW50ZXJwcmlzZSBiZWFucyB3aXRoIHRoZSBzYW1lCi0JICBlamItbmFtZSB0byBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgotCi0JICBFeGFtcGxlczoKLQotCSAgICAgIDxlamItbGluaz5FbXBsb3llZVJlY29yZDwvZWpiLWxpbms+Ci0KLQkgICAgICA8ZWpiLWxpbms+Li4vcHJvZHVjdHMvcHJvZHVjdC5qYXIjUHJvZHVjdEVKQjwvZWpiLWxpbms+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLWxvY2FsLXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlamItbG9jYWwtcmVmVHlwZSBpcyB1c2VkIGJ5IGVqYi1sb2NhbC1yZWYgZWxlbWVudHMgZm9yCi0JdGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvIGFuIGVudGVycHJpc2UgYmVhbidzIGxvY2FsCi0JaG9tZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQkgICAgLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIERlcGxveW1lbnQKLQkgICAgICBDb21wb25lbnQgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4KLQkgICAgLSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLQkgICAgLSB0aGUgZXhwZWN0ZWQgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlcyBvZiB0aGUKLQkgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotCSAgICAtIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlCi0JICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLXJlZi1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtdHlwZSIKLQkJICAgdHlwZT0iajJlZTplamItcmVmLXR5cGVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWwtaG9tZSIKLQkJICAgdHlwZT0iajJlZTpsb2NhbC1ob21lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsIgotCQkgICB0eXBlPSJqMmVlOmxvY2FsVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1saW5rIgotCQkgICB0eXBlPSJqMmVlOmVqYi1saW5rVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlZi1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0JICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZQotCSAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlCi0JICBEZXBsb3ltZW50IENvbXBvbmVudC4KLQotCSAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi0JICBFeGFtcGxlOgotCi0JICA8ZWpiLXJlZi1uYW1lPmVqYi9QYXlyb2xsPC9lamItcmVmLW5hbWU+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpqbmRpLW5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1yZWYtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlamItcmVmLXR5cGVUeXBlIGNvbnRhaW5zIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZQotCXJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLgotCi0JVGhlIGVqYi1yZWYtdHlwZSBkZXNpZ25hdGVzIGEgdmFsdWUKLQl0aGF0IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLQkgICAgRW50aXR5Ci0JICAgIFNlc3Npb24KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGl0eSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlc3Npb24iLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVqYi1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLXJlZiBlbGVtZW50cyBmb3IgdGhlCi0JZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZS4gVGhlCi0JZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0KLQkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCSAgICAtIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZgotCSAgICAgIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UKLQkgICAgICBiZWFuCi0JICAgIC0gdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0JICAgIC0gdGhlIGV4cGVjdGVkIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzIG9mIHRoZSByZWZlcmVuY2VkCi0JICAgICAgZW50ZXJwcmlzZSBiZWFuCi0JICAgIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUKLQkgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtbmFtZSIKLQkJICAgdHlwZT0iajJlZTplamItcmVmLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLXJlZi10eXBlIgotCQkgICB0eXBlPSJqMmVlOmVqYi1yZWYtdHlwZVR5cGUiLz4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhvbWUiCi0JCSAgIHR5cGU9ImoyZWU6aG9tZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUiCi0JCSAgIHR5cGU9ImoyZWU6cmVtb3RlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1saW5rIgotCQkgICB0eXBlPSJqMmVlOmVqYi1saW5rVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1wdHlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgaXMgdXNlZCB0byBkZXNpZ25hdGUgYW4gZW1wdHkKLQllbGVtZW50IHdoZW4gdXNlZC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhpcyB0eXBlIGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG9mIHRoZQotCSAgZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUKLQkgIGFwcGxpY2F0aW9uJ3MgY29kZS4KLQotCSAgVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBlbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlOgotCi0JICAgICAgamF2YS5sYW5nLkJvb2xlYW4KLQkgICAgICBqYXZhLmxhbmcuQnl0ZQotCSAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXIKLQkgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICAgICAgamF2YS5sYW5nLlNob3J0Ci0JICAgICAgamF2YS5sYW5nLkludGVnZXIKLQkgICAgICBqYXZhLmxhbmcuTG9uZwotCSAgICAgIGphdmEubGFuZy5GbG9hdAotCSAgICAgIGphdmEubGFuZy5Eb3VibGUKLQotCSAgRXhhbXBsZToKLQotCSAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkJvb2xlYW4iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuQnl0ZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5DaGFyYWN0ZXIiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLlNob3J0Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkludGVnZXIiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuTG9uZyIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5GbG9hdCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Eb3VibGUiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnYtZW50cnlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZW52LWVudHJ5VHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYW4gYXBwbGljYXRpb24ncwotCWVudmlyb25tZW50IGVudHJ5LiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLQlkZXNjcmlwdGlvbiwgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LCBhbmQgYW4KLQlvcHRpb25hbCB2YWx1ZS4gIElmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCwgb25lIG11c3QgYmUKLQlzdXBwbGllZCBkdXJpbmcgZGVwbG95bWVudC4KLQotCUl0IGlzIHVzZWQgYnkgZW52LWVudHJ5IGVsZW1lbnRzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmpuZGktbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0JICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lCi0JICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYKLQkgICAgICBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEKLQkgICAgICBEZXBsb3ltZW50IENvbXBvbmVudC4gVGhlIHVuaXF1ZW5lc3MKLQkgICAgICBjb25zdHJhaW50cyBtdXN0IGJlIGRlZmluZWQgd2l0aGluIHRoZSBkZWNsYXJlZAotCSAgICAgIGNvbnRleHQuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JICAgICAgPGVudi1lbnRyeS1uYW1lPm1pbkFtb3VudDwvZW52LWVudHJ5LW5hbWU+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnktdHlwZSIKLQkJICAgdHlwZT0iajJlZTplbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlIi8+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnktdmFsdWUiCi0JCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIGVudi1lbnRyeS12YWx1ZSBkZXNpZ25hdGVzIHRoZSB2YWx1ZSBvZiBhCi0JICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gVGhlIHZhbHVlCi0JICAgICAgbXVzdCBiZSBhIFN0cmluZyB0aGF0IGlzIHZhbGlkIGZvciB0aGUKLQkgICAgICBjb25zdHJ1Y3RvciBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgdGhhdCB0YWtlcyBhCi0JICAgICAgc2luZ2xlIFN0cmluZyBwYXJhbWV0ZXIsIG9yIGZvciBqYXZhLmxhbmcuQ2hhcmFjdGVyLAotCSAgICAgIGEgc2luZ2xlIGNoYXJhY3Rlci4KLQotCSAgICAgIEV4YW1wbGU6Ci0KLQkgICAgICA8ZW52LWVudHJ5LXZhbHVlPjEwMC4wMDwvZW52LWVudHJ5LXZhbHVlPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVsZW1lbnRzIHRoYXQgdXNlIHRoaXMgdHlwZSBkZXNpZ25hdGUgdGhlIG5hbWUgb2YgYQotCUphdmEgY2xhc3Mgb3IgaW50ZXJmYWNlLiAgVGhlIG5hbWUgaXMgaW4gdGhlIGZvcm0gb2YgYQotCSJiaW5hcnkgbmFtZSIsIGFzIGRlZmluZWQgaW4gdGhlIEpMUy4gIFRoaXMgaXMgdGhlIGZvcm0KLQlvZiBuYW1lIHVzZWQgaW4gQ2xhc3MuZm9yTmFtZSgpLiAgVG9vbHMgdGhhdCBuZWVkIHRoZQotCWNhbm9uaWNhbCBuYW1lICh0aGUgbmFtZSB1c2VkIGluIHNvdXJjZSBjb2RlKSB3aWxsIG5lZWQKLQl0byBjb252ZXJ0IHRoaXMgYmluYXJ5IG5hbWUgdG8gdGhlIGNhbm9uaWNhbCBuYW1lLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJnZW5lcmljLWJvb2xlYW5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgZGVmaW5lcyBmb3VyIGRpZmZlcmVudCB2YWx1ZXMgd2hpY2ggY2FuIGRlc2lnbmF0ZQotCWJvb2xlYW4gdmFsdWVzLiBUaGlzIGluY2x1ZGVzIHZhbHVlcyB5ZXMgYW5kIG5vIHdoaWNoIGFyZQotCW5vdCBkZXNpZ25hdGVkIGJ5IHhzZDpib29sZWFuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0cnVlIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmFsc2UiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ5ZXMiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJubyIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImhvbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBob21lVHlwZSBkZWZpbmVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZgotCSAgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgICAgICA8aG9tZT5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsSG9tZTwvaG9tZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWNvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBpY29uIHR5cGUgY29udGFpbnMgc21hbGwtaWNvbiBhbmQgbGFyZ2UtaWNvbiBlbGVtZW50cwotCXRoYXQgc3BlY2lmeSB0aGUgZmlsZSBuYW1lcyBmb3Igc21hbGwgYW5kIGxhcmdlIEdJRiBvcgotCUpQRUcgaWNvbiBpbWFnZXMgdXNlZCB0byByZXByZXNlbnQgdGhlIHBhcmVudCBlbGVtZW50IGluIGEKLQlHVUkgdG9vbC4KLQotCVRoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUKLQlpY29uIGZpbGUgbmFtZXMgYXJlIHByb3ZpZGVkIGluLiBJdHMgdmFsdWUgaXMgImVuIiAoRW5nbGlzaCkKLQlieSBkZWZhdWx0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNtYWxsLWljb24iIHR5cGU9ImoyZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBzbWFsbC1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi0JICAgICAgY29udGFpbmluZyBhIHNtYWxsICgxNiB4IDE2KSBpY29uIGltYWdlLiBUaGUgZmlsZQotCSAgICAgIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgRGVwbG95bWVudAotCSAgICAgIENvbXBvbmVudCdzIERlcGxveW1lbnQgRmlsZS4KLQotCSAgICAgIFRoZSBpbWFnZSBtYXkgYmUgZWl0aGVyIGluIHRoZSBKUEVHIG9yIEdJRiBmb3JtYXQuCi0JICAgICAgVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JICAgICAgPHNtYWxsLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnPC9zbWFsbC1pY29uPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxhcmdlLWljb24iIHR5cGU9ImoyZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi0JICAgICAgY29udGFpbmluZyBhIGxhcmdlCi0JICAgICAgKDMyIHggMzIpIGljb24gaW1hZ2UuIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZQotCSAgICAgIHBhdGggd2l0aGluIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzIERlcGxveW1lbnQKLQkgICAgICBGaWxlLgotCi0JICAgICAgVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4KLQkgICAgICBUaGUgaWNvbiBjYW4gYmUgdXNlZCBieSB0b29scy4KLQotCSAgICAgIEV4YW1wbGU6Ci0KLQkgICAgICA8bGFyZ2UtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24zMngzMi5qcGc8L2xhcmdlLWljb24+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmxhbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImphdmEtaWRlbnRpZmllclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBqYXZhLWlkZW50aWZpZXJUeXBlIGRlZmluZXMgYSBKYXZhIGlkZW50aWZpZXIuCi0JVGhlIHVzZXJzIG9mIHRoaXMgdHlwZSBzaG91bGQgZnVydGhlciB2ZXJpZnkgdGhhdAotCXRoZSBjb250ZW50IGRvZXMgbm90IGNvbnRhaW4gSmF2YSByZXNlcnZlZCBrZXl3b3Jkcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6cGF0dGVybiB2YWx1ZT0iKCR8X3xccHtMfSkoXHB7TH18XHB7TmR9fF98JCkqIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamF2YS10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyBpcyBhIGdlbmVyaWMgdHlwZSB0aGF0IGRlc2lnbmF0ZXMgYSBKYXZhIHByaW1pdGl2ZQotCXR5cGUgb3IgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgaW50ZXJmYWNlL3R5cGUsCi0Jb3IgYW4gYXJyYXkgb2Ygc3VjaCB0eXBlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6cGF0dGVybiB2YWx1ZT0iW15ccHtafV0qIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam5kaS1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGpuZGktbmFtZVR5cGUgdHlwZSBkZXNpZ25hdGVzIGEgSk5ESSBuYW1lIGluIHRoZQotCURlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCWphdmE6Y29tcC9lbnYgY29udGV4dC4gIEEgSk5ESSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKLQlEZXBsb3ltZW50IENvbXBvbmVudC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Z3JvdXAgbmFtZT0iam5kaUVudmlyb25tZW50UmVmc0dyb3VwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIGdyb3VwIGtlZXBzIHRoZSB1c2FnZSBvZiB0aGUgY29udGFpbmVkIEpOREkgZW52aXJvbm1lbnQKLQlyZWZlcmVuY2UgZWxlbWVudHMgY29uc2lzdGVudCBhY3Jvc3MgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnkiCi0JCSAgIHR5cGU9ImoyZWU6ZW52LWVudHJ5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYiCi0JCSAgIHR5cGU9ImoyZWU6ZWpiLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbG9jYWwtcmVmIgotCQkgICB0eXBlPSJqMmVlOmVqYi1sb2NhbC1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpzZXJ2aWNlLXJlZkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtcmVmIgotCQkgICB0eXBlPSJqMmVlOnJlc291cmNlLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmIgotCQkgICB0eXBlPSJqMmVlOnJlc291cmNlLWVudi1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiCi0JCSAgIHR5cGU9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmdyb3VwPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsaXN0ZW5lclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsaXN0ZW5lclR5cGUgaW5kaWNhdGVzIHRoZSBkZXBsb3ltZW50IHByb3BlcnRpZXMgZm9yIGEgd2ViCi0JYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaXN0ZW5lci1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGxpc3RlbmVyLWNsYXNzIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGFzcyBpbiB0aGUKLQkgICAgYXBwbGljYXRpb24gbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgd2ViCi0JICAgIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uIFRoZSB2YWx1ZSBpcyB0aGUgZnVsbHkKLQkgICAgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgbGlzdGVuZXIgY2xhc3MuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWwtaG9tZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsb2NhbC1ob21lVHlwZSBkZWZpbmVzIHRoZSBmdWxseS1xdWFsaWZpZWQKLQluYW1lIG9mIGFuIGVudGVycHJpc2UgYmVhbidzIGxvY2FsIGhvbWUgaW50ZXJmYWNlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbG9jYWxUeXBlIGRlZmluZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGFuCi0JZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaW50ZXJmYWNlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUgaXMgdXNlZCB0byBsaW5rIGEgbWVzc2FnZQotCWRlc3RpbmF0aW9uIHJlZmVyZW5jZSBvciBtZXNzYWdlLWRyaXZlbiBiZWFuIHRvIGEgbWVzc2FnZQotCWRlc3RpbmF0aW9uLgotCi0JVGhlIEFzc2VtYmxlciBzZXRzIHRoZSB2YWx1ZSB0byByZWZsZWN0IHRoZSBmbG93IG9mIG1lc3NhZ2VzCi0JYmV0d2VlbiBwcm9kdWNlcnMgYW5kIGNvbnN1bWVycyBpbiB0aGUgYXBwbGljYXRpb24uCi0KLQlUaGUgdmFsdWUgbXVzdCBiZSB0aGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIG9mIGEgbWVzc2FnZQotCWRlc3RpbmF0aW9uIGluIHRoZSBzYW1lIERlcGxveW1lbnQgRmlsZSBvciBpbiBhbm90aGVyCi0JRGVwbG95bWVudCBGaWxlIGluIHRoZSBzYW1lIEoyRUUgYXBwbGljYXRpb24gdW5pdC4KLQotCUFsdGVybmF0aXZlbHksIHRoZSB2YWx1ZSBtYXkgYmUgY29tcG9zZWQgb2YgYSBwYXRoIG5hbWUKLQlzcGVjaWZ5aW5nIGEgRGVwbG95bWVudCBGaWxlIGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZWQKLQltZXNzYWdlIGRlc3RpbmF0aW9uIHdpdGggdGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSBvZiB0aGUKLQlkZXN0aW5hdGlvbiBhcHBlbmRlZCBhbmQgc2VwYXJhdGVkIGZyb20gdGhlIHBhdGggbmFtZSBieQotCSIjIi4gVGhlIHBhdGggbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgRGVwbG95bWVudCBGaWxlCi0JY29udGFpbmluZyBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0IGlzIHJlZmVyZW5jaW5nIHRoZQotCW1lc3NhZ2UgZGVzdGluYXRpb24uICBUaGlzIGFsbG93cyBtdWx0aXBsZSBtZXNzYWdlCi0JZGVzdGluYXRpb25zIHdpdGggdGhlIHNhbWUgbmFtZSB0byBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbgotCSAgb2YgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYSBtZXNzYWdlIGRlc3RpbmF0aW9uCi0JICBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0JICBlbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2Y6Ci0KLQkJICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JCSAgLSB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2UgbmFtZQotCQkgIC0gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gdHlwZQotCQkgIC0gYSBzcGVjaWZpY2F0aW9uIGFzIHRvIHdoZXRoZXIgdGhlCi0JCSAgICBkZXN0aW5hdGlvbiBpcyB1c2VkIGZvcgotCQkgICAgY29uc3VtaW5nIG9yIHByb2R1Y2luZyBtZXNzYWdlcywgb3IgYm90aAotCQkgIC0gYSBsaW5rIHRvIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uCi0KLQkgIEV4YW1wbGVzOgotCi0JICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWY+Ci0JCSAgPG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWU+am1zL1N0b2NrUXVldWUKLQkJICA8L21lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWU+Ci0JCSAgPG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT5qYXZheC5qbXMuUXVldWUKLQkJICA8L21lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT4KLQkJICA8bWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZT5Db25zdW1lcwotCQkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZT4KLQkJICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rPkNvcnBvcmF0ZVN0b2NrcwotCQkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rPgotCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZj4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmpuZGktbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcwotCSAgICB0aGUgbmFtZSBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMKLQkgICAgdmFsdWUgaXMgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotCSAgICBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUKLQkgICAgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZQotCSAgICB1bmlxdWUgd2l0aGluIGFuIGVqYi1qYXIgKGZvciBlbnRlcnByaXNlIGJlYW5zKSBvciBhCi0JICAgIERlcGxveW1lbnQgRmlsZSAoZm9yIG90aGVycykuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlIgotCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlIgotCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rIgotCQkgICB0eXBlPSJqMmVlOm1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLQotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSBzcGVjaWZpZXMgdGhlIHR5cGUgb2YKLQkgIHRoZSBkZXN0aW5hdGlvbi4gVGhlIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBKYXZhIGludGVyZmFjZQotCSAgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRlc3RpbmF0aW9uLgotCi0JICBFeGFtcGxlOgotCi0JICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlCi0JICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIHNwZWNpZmllcyB0aGUgdXNlIG9mIHRoZQotCW1lc3NhZ2UgZGVzdGluYXRpb24gaW5kaWNhdGVkIGJ5IHRoZSByZWZlcmVuY2UuICBUaGUgdmFsdWUKLQlpbmRpY2F0ZXMgd2hldGhlciBtZXNzYWdlcyBhcmUgY29uc3VtZWQgZnJvbSB0aGUgbWVzc2FnZQotCWRlc3RpbmF0aW9uLCBwcm9kdWNlZCBmb3IgdGhlIGRlc3RpbmF0aW9uLCBvciBib3RoLiAgVGhlCi0JQXNzZW1ibGVyIG1ha2VzIHVzZSBvZiB0aGlzIGluZm9ybWF0aW9uIGluIGxpbmtpbmcgcHJvZHVjZXJzCi0Jb2YgYSBkZXN0aW5hdGlvbiB3aXRoIGl0cyBjb25zdW1lcnMuCi0KLQlUaGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2UgZWxlbWVudCBtdXN0IGJlCi0Jb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JICAgIENvbnN1bWVzCi0JICAgIFByb2R1Y2VzCi0JICAgIENvbnN1bWVzUHJvZHVjZXMKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVzIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUHJvZHVjZXMiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdW1lc1Byb2R1Y2VzIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIHNwZWNpZmllcyBhIG1lc3NhZ2UKLQkgIGRlc3RpbmF0aW9uLiBUaGUgbG9naWNhbCBkZXN0aW5hdGlvbiBkZXNjcmliZWQgYnkgdGhpcwotCSAgZWxlbWVudCBpcyBtYXBwZWQgdG8gYSBwaHlzaWNhbCBkZXN0aW5hdGlvbiBieSB0aGUgRGVwbG95ZXIuCi0KLQkgIFRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIGVsZW1lbnQgY29udGFpbnM6Ci0KLQkJICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JCSAgLSBhbiBvcHRpb25hbCBkaXNwbGF5LW5hbWUKLQkJICAtIGFuIG9wdGlvbmFsIGljb24KLQkJICAtIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiBuYW1lIHdoaWNoIG11c3QgYmUgdW5pcXVlCi0JCSAgICBhbW9uZyBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWVzIHdpdGhpbiB0aGUgc2FtZQotCQkgICAgRGVwbG95bWVudCBGaWxlLgotCi0JICBFeGFtcGxlOgotCi0JICA8bWVzc2FnZS1kZXN0aW5hdGlvbj4KLQkJICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lPkNvcnBvcmF0ZVN0b2NrcwotCQkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lPgotCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGEKLQkgICAgbmFtZSBmb3IgYSBtZXNzYWdlIGRlc3RpbmF0aW9uLiAgVGhpcyBuYW1lIG11c3QgYmUKLQkgICAgdW5pcXVlIGFtb25nIHRoZSBuYW1lcyBvZiBtZXNzYWdlIGRlc3RpbmF0aW9ucwotCSAgICB3aXRoaW4gdGhlIERlcGxveW1lbnQgRmlsZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXJhbS12YWx1ZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBpcyBhIGdlbmVyYWwgdHlwZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlY2xhcmUKLQlwYXJhbWV0ZXIvdmFsdWUgbGlzdHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0tbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgICAgcGFyYW1ldGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0tdmFsdWUiCi0JCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwYXJhbS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhCi0JICAgIHBhcmFtZXRlci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXRoVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVsZW1lbnRzIHRoYXQgdXNlIHRoaXMgdHlwZSBkZXNpZ25hdGUgZWl0aGVyIGEgcmVsYXRpdmUKLQlwYXRoIG9yIGFuIGFic29sdXRlIHBhdGggc3RhcnRpbmcgd2l0aCBhICIvIi4KLQotCUluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0Jc2FtZSBEZXBsb3ltZW50IEZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIERlcGxveW1lbnQgRmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwKLQl0aG9zZSBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mCi0JdGhlIERlcGxveW1lbnQgRmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzCi0JYXJlIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZW1vdGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSByZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUKLQkgIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4ncyByZW1vdGUgaW50ZXJmYWNlLgotCi0JICBFeGFtcGxlOgotCi0JICAgICAgPHJlbW90ZT5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlPC9yZW1vdGU+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlcy1hdXRoVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHJlcy1hdXRoVHlwZSBzcGVjaWZpZXMgd2hldGhlciB0aGUgRGVwbG95bWVudCBDb21wb25lbnQKLQljb2RlIHNpZ25zIG9uIHByb2dyYW1tYXRpY2FsbHkgdG8gdGhlIHJlc291cmNlIG1hbmFnZXIsIG9yCi0Jd2hldGhlciB0aGUgQ29udGFpbmVyIHdpbGwgc2lnbiBvbiB0byB0aGUgcmVzb3VyY2UgbWFuYWdlcgotCW9uIGJlaGFsZiBvZiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQuIEluIHRoZSBsYXR0ZXIgY2FzZSwKLQl0aGUgQ29udGFpbmVyIHVzZXMgaW5mb3JtYXRpb24gdGhhdCBpcyBzdXBwbGllZCBieSB0aGUKLQlEZXBsb3llci4KLQotCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLQotCSAgICBBcHBsaWNhdGlvbgotCSAgICBDb250YWluZXIKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzLXNoYXJpbmctc2NvcGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcmVzLXNoYXJpbmctc2NvcGUgdHlwZSBzcGVjaWZpZXMgd2hldGhlciBjb25uZWN0aW9ucwotCW9idGFpbmVkIHRocm91Z2ggdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbgotCWZhY3RvcnkgcmVmZXJlbmNlIGNhbiBiZSBzaGFyZWQuIFRoZSB2YWx1ZSwgaWYgc3BlY2lmaWVkLAotCW11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JICAgIFNoYXJlYWJsZQotCSAgICBVbnNoYXJlYWJsZQotCi0JVGhlIGRlZmF1bHQgdmFsdWUgaXMgU2hhcmVhYmxlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU2hhcmVhYmxlIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVW5zaGFyZWFibGUiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgcmVzb3VyY2UtZW52LXJlZlR5cGUgaXMgdXNlZCB0byBkZWZpbmUKLQkgIHJlc291cmNlLWVudi10eXBlIGVsZW1lbnRzLiAgSXQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhCi0JICBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0Ci0JICBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncwotCSAgZW52aXJvbm1lbnQuICBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlCi0JICByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgbmFtZSwgYW5kIGFuIGluZGljYXRpb24gb2YKLQkgIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgdHlwZSBleHBlY3RlZCBieSB0aGUKLQkgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxyZXNvdXJjZS1lbnYtcmVmPgotCSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+am1zL1N0b2NrUXVldWUKLQkgICAgICA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLQkgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmF4Lmptcy5RdWV1ZQotCSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotCSAgPC9yZXNvdXJjZS1lbnYtcmVmPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZi1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmpuZGktbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKLQkgICAgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotCSAgICB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotCSAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQgYW5kIG11c3QKLQkgICAgYmUgdW5pcXVlIHdpdGhpbiBhIERlcGxveW1lbnQgQ29tcG9uZW50LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZi10eXBlIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlCi0JICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlLiAgSXQgaXMgdGhlCi0JICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBsYW5ndWFnZSBjbGFzcyBvcgotCSAgICBpbnRlcmZhY2UuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXNvdXJjZS1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSByZXNvdXJjZS1yZWZUeXBlIGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYQotCSAgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2UuIEl0Ci0JICBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIG1hbmFnZXIKLQkgIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwgdGhlIGluZGljYXRpb24gb2YgdGhlCi0JICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSB0eXBlIGV4cGVjdGVkIGJ5IHRoZQotCSAgRGVwbG95bWVudCBDb21wb25lbnQgY29kZSwgdGhlIHR5cGUgb2YgYXV0aGVudGljYXRpb24KLQkgIChBcHBsaWNhdGlvbiBvciBDb250YWluZXIpLCBhbmQgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZgotCSAgdGhlIHNoYXJlYWJpbGl0eSBvZiBjb25uZWN0aW9ucyBvYnRhaW5lZCBmcm9tIHRoZSByZXNvdXJjZQotCSAgKFNoYXJlYWJsZSBvciBVbnNoYXJlYWJsZSkuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxyZXNvdXJjZS1yZWY+Ci0JICAgICAgPHJlcy1yZWYtbmFtZT5qZGJjL0VtcGxveWVlQXBwREI8L3Jlcy1yZWYtbmFtZT4KLQkgICAgICA8cmVzLXR5cGU+amF2YXguc3FsLkRhdGFTb3VyY2U8L3Jlcy10eXBlPgotCSAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotCSAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotCSAgPC9yZXNvdXJjZS1yZWY+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iajJlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXMtcmVmLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6am5kaS1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuCi0JICAgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0JICAgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIERlcGxveW1lbnQgRmlsZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy10eXBlIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcmVzLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGRhdGEKLQkgICAgc291cmNlLiBUaGUgdHlwZSBpcyBzcGVjaWZpZWQgYnkgdGhlIGZ1bGx5IHF1YWxpZmllZAotCSAgICBKYXZhIGxhbmd1YWdlIGNsYXNzIG9yIGludGVyZmFjZQotCSAgICBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGF0YSBzb3VyY2UuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXMtYXV0aCIKLQkJICAgdHlwZT0iajJlZTpyZXMtYXV0aFR5cGUiLz4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy1zaGFyaW5nLXNjb3BlIgotCQkgICB0eXBlPSJqMmVlOnJlcy1zaGFyaW5nLXNjb3BlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icm9sZS1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHJvbGUtbmFtZVR5cGUgZGVzaWduYXRlcyB0aGUgbmFtZSBvZiBhIHNlY3VyaXR5IHJvbGUuCi0KLQlUaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGEgdG9rZW4uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icnVuLWFzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHJ1bi1hc1R5cGUgc3BlY2lmaWVzIHRoZSBydW4tYXMgaWRlbnRpdHkgdG8gYmUKLQl1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIGEgY29tcG9uZW50LiBJdCBjb250YWlucyBhbgotCW9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpyb2xlLW5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktcm9sZS1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VjdXJpdHktcm9sZS1yZWZUeXBlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhCi0Jc2VjdXJpdHkgcm9sZSByZWZlcmVuY2UgaW4gYSBjb21wb25lbnQncyBvciBhCi0JRGVwbG95bWVudCBDb21wb25lbnQncyBjb2RlLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4KLQlvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZSB1c2VkIGluIHRoZQotCWNvZGUsIGFuZCBhbiBvcHRpb25hbCBsaW5rIHRvIGEgc2VjdXJpdHkgcm9sZS4gSWYgdGhlCi0Jc2VjdXJpdHkgcm9sZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgRGVwbG95ZXIgbXVzdCBjaG9vc2UgYW4KLQlhcHByb3ByaWF0ZSBzZWN1cml0eSByb2xlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpyb2xlLW5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHZhbHVlIG9mIHRoZSByb2xlLW5hbWUgZWxlbWVudCBtdXN0IGJlIHRoZSBTdHJpbmcgdXNlZAotCSAgICBhcyB0aGUgcGFyYW1ldGVyIHRvIHRoZQotCSAgICBFSkJDb250ZXh0LmlzQ2FsbGVySW5Sb2xlKFN0cmluZyByb2xlTmFtZSkgbWV0aG9kIG9yIHRoZQotCSAgICBIdHRwU2VydmxldFJlcXVlc3QuaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSBtZXRob2QuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLWxpbmsiCi0JCSAgIHR5cGU9ImoyZWU6cm9sZS1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHJvbGUtbGluayBlbGVtZW50IGlzIGEgcmVmZXJlbmNlIHRvIGEgZGVmaW5lZAotCSAgICBzZWN1cml0eSByb2xlLiBUaGUgcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBjb250YWluCi0JICAgIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUKLQkgICAgc2VjdXJpdHktcm9sZSBlbGVtZW50cy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWN1cml0eS1yb2xlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgc2VjdXJpdHktcm9sZVR5cGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYSBzZWN1cml0eQotCSAgcm9sZS4gVGhlIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlCi0JICBzZWN1cml0eSByb2xlLCBhbmQgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZS4KLQotCSAgRXhhbXBsZToKLQotCSAgICAgIDxzZWN1cml0eS1yb2xlPgotCSAgICAgIDxkZXNjcmlwdGlvbj4KLQkJICBUaGlzIHJvbGUgaW5jbHVkZXMgYWxsIGVtcGxveWVlcyB3aG8gYXJlIGF1dGhvcml6ZWQKLQkJICB0byBhY2Nlc3MgdGhlIGVtcGxveWVlIHNlcnZpY2UgYXBwbGljYXRpb24uCi0JICAgICAgPC9kZXNjcmlwdGlvbj4KLQkgICAgICA8cm9sZS1uYW1lPmVtcGxveWVlPC9yb2xlLW5hbWU+Ci0JICAgICAgPC9zZWN1cml0eS1yb2xlPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdHJpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgaXMgYSBzcGVjaWFsIHN0cmluZyBkYXRhdHlwZSB0aGF0IGlzIGRlZmluZWQgYnkgSjJFRSBhcwotCWEgYmFzZSB0eXBlIGZvciBkZWZpbmluZyBjb2xsYXBzZWQgc3RyaW5ncy4gV2hlbiBzY2hlbWFzCi0JcmVxdWlyZSB0cmFpbGluZy9sZWFkaW5nIHNwYWNlIGVsaW1pbmF0aW9uIGFzIHdlbGwgYXMKLQljb2xsYXBzaW5nIHRoZSBleGlzdGluZyB3aGl0ZXNwYWNlLCB0aGlzIGJhc2UgdHlwZSBtYXkgYmUKLQl1c2VkLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnRva2VuIj4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRydWUtZmFsc2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHNpbXBsZSB0eXBlIGRlc2lnbmF0ZXMgYSBib29sZWFuIHdpdGggb25seSB0d28KLQlwZXJtaXNzaWJsZSB2YWx1ZXMKLQotCS0gdHJ1ZQotCS0gZmFsc2UKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTp4c2RCb29sZWFuVHlwZSI+Ci0JPHhzZDpwYXR0ZXJuIHZhbHVlPSIodHJ1ZXxmYWxzZSkiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1cmwtcGF0dGVyblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB1cmwtcGF0dGVyblR5cGUgY29udGFpbnMgdGhlIHVybCBwYXR0ZXJuIG9mIHRoZSBtYXBwaW5nLgotCUl0IG11c3QgZm9sbG93IHRoZSBydWxlcyBzcGVjaWZpZWQgaW4gU2VjdGlvbiAxMS4yIG9mIHRoZQotCVNlcnZsZXQgQVBJIFNwZWNpZmljYXRpb24uIFRoaXMgcGF0dGVybiBpcyBhc3N1bWVkIHRvIGJlIGluCi0JVVJMLWRlY29kZWQgZm9ybSBhbmQgbXVzdCBub3QgY29udGFpbiBDUigjeEQpIG9yIExGKCN4QSkuCi0JSWYgaXQgY29udGFpbnMgdGhvc2UgY2hhcmFjdGVycywgdGhlIGNvbnRhaW5lciBtdXN0IGluZm9ybQotCXRoZSBkZXZlbG9wZXIgd2l0aCBhIGRlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2UuCi0JVGhlIGNvbnRhaW5lciBtdXN0IHByZXNlcnZlIGFsbCBjaGFyYWN0ZXJzIGluY2x1ZGluZyB3aGl0ZXNwYWNlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkQW55VVJJVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOmFueVVSSS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDphbnlVUkkiPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkQm9vbGVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpib29sZWFuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmJvb2xlYW4iPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkSW50ZWdlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDppbnRlZ2VyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmludGVnZXIiPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkTk1UT0tFTlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpOTVRPS0VOLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkTm9uTmVnYXRpdmVJbnRlZ2VyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOm5vbk5lZ2F0aXZlSW50ZWdlci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpub25OZWdhdGl2ZUludGVnZXIiPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkUG9zaXRpdmVJbnRlZ2VyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOnBvc2l0aXZlSW50ZWdlci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpwb3NpdGl2ZUludGVnZXIiPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkUU5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6UU5hbWUuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6UU5hbWUiPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieHNkU3RyaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOnN0cmluZy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2oyZWVfamF4cnBjX21hcHBpbmdfMV8xLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTIxOTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsODg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotCSAgICB2ZXJzaW9uPSIxLjEiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWoyZWVfamF4cnBjX21hcHBpbmdfMV8xLnhzZHMJMS4xMSAwOS8wMy8wMwotCi0gICAgICBCYXNlZCBvbiBqMmVlX2pheHJwY19tYXBwaW5nXzFfMC5kdGQsIExhc3QgdXBkYXRlZDogMDkvMTkvMjAwMiAxMDoyNgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgOTAxIFNhbiBBbnRvbmlvCi0gICAgICBSb2FkLCBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiBBbGwgcmlnaHRzCi0gICAgICByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgKEMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIDIwMDIKLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBWwotCi0JVGhlIGVsZW1lbnQgZGVzY3JpYmVzIHRoZSBKYXZhIG1hcHBpbmcgdG8gYSBrbm93biBXU0RMIGRvY3VtZW50LgotCi0JSXQgY29udGFpbnMgdGhlIG1hcHBpbmcgYmV0d2VlbiBwYWNrYWdlIG5hbWVzIGFuZCBYTUwgbmFtZXNwYWNlcywKLQlXU0RMIHJvb3QgdHlwZXMgYW5kIEphdmEgYXJ0aWZhY3RzLCBhbmQgdGhlIHNldCBvZiBtYXBwaW5ncyBmb3IKLQlzZXJ2aWNlcy4KLQotCUFsbCBqYXZhLXdzZGwtbWFwcGluZyBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUgdGhlCi0Jc2NoZW1hIGJ5IHVzaW5nIHRoZSBKMkVFIG5hbWVzcGFjZToKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotCWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkgdXNpbmcgdGhlCi0JdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0JICAgIDxqYXZhLXdzZGwtbWFwcGluZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCQlodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfamF4cnBjX21hcHBpbmdfMV8xLnhzZCIKLQkgICAgICB2ZXJzaW9uPSIxLjEiPgotCSAgICAgIC4uLgotCSAgICA8L2phdmEtd3NkbC1tYXBwaW5nPgotCi0JVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0JdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSjJFRQotCW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLQlodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfamF4cnBjX21hcHBpbmdfMV8xLnhzZAotCi0JXV0+Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKMkVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLQlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0JcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLSAgPHhzZDplbGVtZW50IG5hbWU9ImphdmEtd3NkbC1tYXBwaW5nIiB0eXBlPSJqMmVlOmphdmEtd3NkbC1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyBpcyB0aGUgcm9vdCBvZiB0aGUgamF2YS13c2RsLW1hcHBpbmcgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnN0cnVjdG9yLXBhcmFtZXRlci1vcmRlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBjb25zdHJ1Y3Rvci1wYXJhbWV0ZXItb3JkZXIgZWxlbWVudCBkZWZpbmVzIHRoZSBvcmRlcgotCXRoYXQgY29tcGxleFR5cGUgZWxlbWVudCB2YWx1ZXMgYXJlIGFwcGxpZWQgdG8gYSBKYXZhCi0JZXhjZXB0aW9uIGNvbnN0cnVjdG9yLiBFbGVtZW50IG5hbWVzIGFyZSBzcGVjaWZpZWQgZm9yIGVhY2gKLQlwYXJhbWV0ZXIgb2YgdGhlIGNvbnN0cnVjdG9yLCBpbmNsdWRpbmcgZWxlbWVudCBuYW1lcyBvZgotCWluaGVyaXRlZCB0eXBlcyBpZiBuZWNlc3NhcnkuCi0KLQlVc2VkIGluOiBleGNlcHRpb24tbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbGVtZW50LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGVsZW1lbnQtbmFtZSBlbGVtZW50IGRlZmluZXMgdGhlIG5hbWUgb2YgYSBjb21wbGV4VHlwZQotCSAgICBlbGVtZW50IG5hbWUgYXR0cmlidXRlIHZhbHVlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImV4Y2VwdGlvbi1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGV4Y2VwdGlvbi1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyB0aGUgbWFwcGluZyBiZXR3ZWVuIHRoZQotCXNlcnZpY2Ugc3BlY2lmaWMgZXhjZXB0aW9uIHR5cGVzIGFuZCB3c2RsIGZhdWx0cyBhbmQKLQlTT0FQIGhlYWRlcmZhdWx0cy4KLQotCVRoaXMgZWxlbWVudCBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZQotCW1hcHBpbmcgYmV0d2VlbiBhIG1ldGhvZCBhbmQgYW4gb3BlcmF0aW9uIHdoaWNoIHByb3ZpZGVzIHRoZQotCW1hcHBpbmcgY29udGV4dC4KLQotCVVzZWQgaW46IHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjZXB0aW9uLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBleGNlcHRpb24tdHlwZSBlbGVtZW50IGRlZmluZXMgSmF2YSB0eXBlIG9mIHRoZSBleGNlcHRpb24uCi0JICAgIEl0IG1heSBiZSBhIHNlcnZpY2Ugc3BlY2lmaWMgZXhjZXB0aW9uLgotCi0JICAgIEl0IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLW1lc3NhZ2UiCi0JCSAgIHR5cGU9ImoyZWU6d3NkbC1tZXNzYWdlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtbWVzc2FnZS1wYXJ0LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6d3NkbC1tZXNzYWdlLXBhcnQtbmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIGVsZW1lbnQgaXMgcmVxdWlyZWQgb25seQotICAgICAgICAgICAgd2hlbiB0aGUgbWVzc2FnZSByZWZlcmVuY2VkIGJ5IHRoZSB3c2RsLW1lc3NhZ2UgZWxlbWVudAotICAgICAgICAgICAgaGFzIG1vcmUgdGhhbiBvbmUgcGFydC4KLQotICAgICAgICAgICAgVGhpcyBvbmx5IG9jY3VycyB3aGVuIG11bHRpcGxlIGhlYWRlcmZhdWx0cyB1c2UgdGhlCi0gICAgICAgICAgICBzYW1lIG1lc3NhZ2UuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29uc3RydWN0b3ItcGFyYW1ldGVyLW9yZGVyIgotCQkgICB0eXBlPSJqMmVlOmNvbnN0cnVjdG9yLXBhcmFtZXRlci1vcmRlclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamF2YS13c2RsLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWxlbWVudCBkZXNjcmliZXMgdGhlIEphdmEgbWFwcGluZyB0byBhIGtub3duIFdTREwgZG9jdW1lbnQuCi0KLQlJdCBjb250YWlucyB0aGUgbWFwcGluZyBiZXR3ZWVuIHBhY2thZ2UgbmFtZXMgYW5kIFhNTCBuYW1lc3BhY2VzLAotCVdTREwgcm9vdCB0eXBlcyBhbmQgSmF2YSBhcnRpZmFjdHMsIGFuZCB0aGUgc2V0IG9mIG1hcHBpbmdzIGZvcgotCXNlcnZpY2VzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWNrYWdlLW1hcHBpbmciCi0JCSAgIHR5cGU9ImoyZWU6cGFja2FnZS1tYXBwaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImphdmEteG1sLXR5cGUtbWFwcGluZyIKLQkJICAgdHlwZT0iajJlZTpqYXZhLXhtbC10eXBlLW1hcHBpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjZXB0aW9uLW1hcHBpbmciCi0JCSAgIHR5cGU9ImoyZWU6ZXhjZXB0aW9uLW1hcHBpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOnNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1pbnRlcmZhY2UtbWFwcGluZyIKLQkJICAgICB0eXBlPSJqMmVlOnNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmdUeXBlIgotCQkgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nIgotCQkgICAgIHR5cGU9ImoyZWU6c2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZ1R5cGUiCi0JCSAgICAgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotCQkgICB0eXBlPSJqMmVlOmRld2V5LXZlcnNpb25UeXBlIgotCQkgICBmaXhlZD0iMS4xIgotCQkgICB1c2U9InJlcXVpcmVkIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgMS4xLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImphdmEteG1sLXR5cGUtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBqYXZhLXhtbC10eXBlLW1hcHBpbmcgZWxlbWVudCBjb250YWlucyBhIGphdmEtdHlwZSB0aGF0IGlzIHRoZQotCWZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzLCBwcmltaXRpdmUgdHlwZSwgb3IgYXJyYXkKLQl0eXBlLCBRTmFtZSBvZiB0aGUgWE1MIHJvb3QgdHlwZSBvciBhbm9ueW1vdXMgdHlwZSwgdGhlIFdTREwgdHlwZQotCXNjb3BlIHRoZSBRTmFtZSBhcHBsaWVzIHRvIGFuZCB0aGUgc2V0IG9mIHZhcmlhYmxlIG1hcHBpbmdzIGZvcgotCWVhY2ggcHVibGljIHZhcmlhYmxlIHdpdGhpbiB0aGUgSmF2YSBjbGFzcy4KLQotCVVzZWQgaW46IGphdmEtd3NkbC1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImphdmEtdHlwZSIKLQkJICAgdHlwZT0iajJlZTpqYXZhLXR5cGVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGphdmEtdHlwZSBlbGVtZW50IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZgotCSAgICBhIEphdmEgY2xhc3MsIHByaW1pdGl2ZSwgb3IgYXJyYXkgdHlwZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDxjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb290LXR5cGUtcW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6eHNkUU5hbWVUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHJvb3QtdHlwZS1xbmFtZSBpZGVudGlmaWVzIHRoZSBXU0RMIFFOYW1lIG9mIGFuIFhNTCB0eXBlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYW5vbnltb3VzLXR5cGUtcW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGFub255bW91cy10eXBlLXFuYW1lIGlkZW50aWZpZXMgdGhlIFdTREwgUU5hbWUgb2YgYW4KLQkgICAgICBhbm9ueW1vdXMgWE1MIHR5cGUuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L2Nob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxbmFtZS1zY29wZSIKLQkJICAgdHlwZT0iajJlZTpxbmFtZS1zY29wZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YXJpYWJsZS1tYXBwaW5nIgotCQkgICB0eXBlPSJqMmVlOnZhcmlhYmxlLW1hcHBpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIHRoZSBtYXBwaW5nIGJldHdlZW4gYQotCUphdmEgbWV0aG9kIHBhcmFtZXRlcnMgYW5kIGEgd3NkbC1tZXNzYWdlLgotCi0JVXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbS1wb3NpdGlvbiIKLQkJICAgdHlwZT0iajJlZTp4c2ROb25OZWdhdGl2ZUludGVnZXJUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBhcmFtLXBvc2l0aW9uIGVsZW1lbnQgZGVmaW5lcyB0aGUgcG9zaXRpb24gb2YgYQotCSAgICBwYXJhbWV0ZXIgd2l0aGluIGEgSmF2YSBtZXRob2QuICBJdCBtdXN0IGJlIGFuIGludGVnZXIKLQkgICAgc3RhcnRpbmcgZnJvbSAwLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtLXR5cGUiCi0JCSAgIHR5cGU9ImoyZWU6amF2YS10eXBlVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwYXJhbS10eXBlIGVsZW1lbnQgZGVmaW5lcyB0aGUgZnVsbHkgcXVhbGlmaWVkCi0JICAgIGNsYXNzIG5hbWUgb2YgYSBKYXZhIGNsYXNzLCBwcmltaXRpdmUsIG9yIGFycmF5IHR5cGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1tZXNzYWdlLW1hcHBpbmciCi0JCSAgIHR5cGU9ImoyZWU6d3NkbC1tZXNzYWdlLW1hcHBpbmdUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGFja2FnZS1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHBhY2thZ2UtbWFwcGluZyBpbmRpY2F0ZXMgdGhlIG1hcHBpbmcgYmV0d2VlbiBqYXZhLXBhY2thZ2UtbmFtZQotCWFuZCBYTUwgbmFtZXNwYWNlIGluIHRoZSBXU0RMIGRvY3VtZW50LgotCi0JVXNlZCBpbjogamF2YS13c2RsLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFja2FnZS10eXBlIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcGFja2FnZS10eXBlIGluZGljYXRlcyB0aGUgSmF2YSBwYWNrYWdlIG5hbWUuIEl0IG11c3QgYmUgYSBmdWxseQotCSAgICBxdWFsaWZpZWQgcGFja2FnZSBuYW1lLCBldmVuIHRob3VnaCB0aGUgWE1MIHNjaGVtYSB0eXBlIGlzCi0JICAgIGZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZXNwYWNlVVJJIgotCQkgICB0eXBlPSJqMmVlOnhzZEFueVVSSVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbmFtZXNwYWNlVVJJIGVsZW1lbnQgaW5kaWNhdGVzIGEgVVJJLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhcmFtZXRlci1tb2RlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHBhcmFtZXRlci1tb2RlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbW9kZSBvZiB0aGUgcGFyYW1ldGVyLgotCUl0IGNhbiBoYXZlIG9ubHkgdGhyZWUgdmFsdWVzLCBJTiwgT1VULCBJTk9VVC4KLQotCVVzZWQgaW46IGphdmEteG1sLXR5cGUtbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTk9VVCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvcnQtbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBwb3J0LW1hcHBpbmcgZGVmaW5lcyB0aGUgbWFwcGluZyBvZiB0aGUgV1NETCBwb3J0IG5hbWUgYXR0cmlidXRlCi0JdG8gdGhlIEphdmEgbmFtZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBHZW5lcmF0ZWQgU2VydmljZSBJbnRlcmZhY2UKLQltZXRob2QgZ2V0e2phdmEtbmFtZX0uCi0KLQlVc2VkIGluOiBzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcG9ydC1tYXBwaW5nIGRlZmluZXMgdGhlIG1hcHBpbmcgb2YgdGhlIFdTREwgcG9ydCBuYW1lCi0JICAgIGF0dHJpYnV0ZSB0byB0aGUgSmF2YSBuYW1lIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIEdlbmVyYXRlZAotCSAgICBTZXJ2aWNlIEludGVyZmFjZSBtZXRob2QgZ2V0e2phdmEtbmFtZX0uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamF2YS1wb3J0LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGphdmEtcG9ydC1uYW1lIGVsZW1lbnQgaXMgdGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIHBvcnQKLQkgICAgbmFtZSBpbiBKYXZhLiAgSXQgaXMgdXNlZCBpbiBnZW5lcmF0aW5nIHRoZSBHZW5lcmF0ZWQKLQkgICAgU2VydmljZSBJbnRlcmZhY2UgbWV0aG9kIGdldHtqYXZhLXBvcnQtbmFtZX0uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icW5hbWUtc2NvcGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcW5hbWUtc2NvcGUgZWxlbWVudHMgc2NvcGVzIHRoZSByZWZlcmVuY2Ugb2YgYSBRTmFtZSB0byB0aGUgV1NETAotCWVsZW1lbnQgdHlwZSBpdCBhcHBsaWVzIHRvLiBUaGUgdmFsdWUgb2YgcW5hbWUtc2NvcGUgbWF5IGJlCi0Jc2ltcGxlVHlwZSwgY29tcGxleFR5cGUsIG9yIGVsZW1lbnQuCi0KLQlVc2VkIGluOiBqYXZhLXhtbC10eXBlLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNpbXBsZVR5cGUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wbGV4VHlwZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmcgZGVmaW5lcyBhIHR1cGxlCi0JdG8gc3BlY2lmeSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXMgdG8KLQlXU0RMIHBvcnQgdHlwZXMgYW5kIFdTREwgYmluZGluZ3MuCi0KLQlBbiBpbnRlcmZhY2UgbWF5IGJlIG1hcHBlZCB0byBhIHBvcnQtdHlwZSBhbmQgYmluZGluZyBtdWx0aXBsZQotCXRpbWVzLiBUaGlzIGhhcHBlbnMgcmFyZWx5LgotCi0JVXNlZCBpbjogamF2YS13c2RsLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEKLQkgICAgdHlwZSBmb3IgdGhlIGVuZHBvaW50IGludGVyZmFjZS4gVGhlIG5hbWUgbXVzdCBiZSBhIGZ1bGx5Ci0JICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtcG9ydC10eXBlIgotCQkgICB0eXBlPSJqMmVlOnhzZFFOYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB3c2RsLXBvcnQtdHlwZSBlbGVtZW50IGRlZmluZXMgdGhlIHdzZGwgcG9ydCB0eXBlCi0JICAgIGJ5IGEgUU5BTUUgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyAgdGhlIHBvcnQgdHlwZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLWJpbmRpbmciCi0JCSAgIHR5cGU9ImoyZWU6eHNkUU5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHdzZGwtYmluZGluZyBlbGVtZW50IGRlZmluZXMgdGhlIHdzZGwgYmluZGluZwotCSAgICBieSBhIFFOQU1FIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZpZXMgIHRoZSBiaW5kaW5nLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmciCi0JCSAgIHR5cGU9ImoyZWU6c2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIHRoZSBtYXBwaW5nIG9mCi0JSmF2YSBtZXRob2RzIHRvIG9wZXJhdGlvbnMgKHdoaWNoIGFyZSBub3QgdW5pcXVlbHkgcXVhbGlmaWVkIGJ5Ci0JcW5hbWVzKS4KLQotCVRoZSB3c2RsLW9wZXJhdGlvbiBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZQotCXBvcnRUeXBlIGFuZCBiaW5kaW5nIGluIHdoaWNoIHRoaXMgZGVmaW5pdGlvbiBpcyBlbWJlZGRlZCB3aXRoaW4uCi0JU2VlIHRoZSBkZWZpbml0aW9ucyBmb3Igc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZyBhbmQKLQlzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nIHRvIGFjcXVpcmUgdGhlIHByb3BlciBjb250ZXh0LiAgVGhlCi0Jd3JhcHBlZC1lbGVtZW50IGluZGljYXRvciBzaG91bGQgb25seSBiZSBzcGVjaWZpZWQgd2hlbiBhIFdTREwKLQltZXNzYWdlIHdyYXBzIGFuIGVsZW1lbnQgdHlwZS4gIFRoZSB3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nIGlzCi0Jbm90IHNwZWNpZmllZCBmb3Igb25lLXdheSBvcGVyYXRpb25zLgotCi0JVXNlZCBpbjogc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqYXZhLW1ldGhvZC1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBqYXZhLW1ldGhvZC1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgbmFtZSBvZiBhIEphdmEgbWV0aG9kCi0JICAgIHdpdGhpbiBhbiBpbnRlcmZhY2UuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1vcGVyYXRpb24iCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHdzZGwtb3BlcmF0aW9uIGVsZW1lbnQgZGVmaW5lcyBhbiBvcGVyYXRpb24gd2l0aGluIGEgV1NETAotCSAgICBkb2N1bWVudC4gIEl0IG11c3QgYmUgaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIGEgcG9ydCB0eXBlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndyYXBwZWQtZWxlbWVudCIKLQkJICAgdHlwZT0iajJlZTplbXB0eVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSIxIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHdyYXBwZWQtZWxlbWVudCBlbGVtZW50IGlzIGRlZmluZWQgd2hlbiBhIFdTREwgbWVzc2FnZQotCSAgICB3aXRoIGEgc2luZ2xlIHBhcnQgaXMgdXNlZCB0byB3cmFwIGFuIGVsZW1lbnQgdHlwZSBhbmQgdGhlCi0JICAgIGVsZW1lbnQncyBuYW1lIG1hdGNoZXMgdGhlIG9wZXJhdGlvbiBuYW1lLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nIgotCQkgICB0eXBlPSJqMmVlOm1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmciCi0JCSAgIHR5cGU9ImoyZWU6d3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VydmljZS1pbnRlcmZhY2UtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgaG93IGEgSmF2YSB0eXBlIGZvcgotCXRoZSBzZXJ2aWNlIGludGVyZmFjZSBtYXBzIHRvIGEgV1NETCBzZXJ2aWNlLgotCi0JVXNlZCBpbjogamF2YS13c2RsLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1pbnRlcmZhY2UiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXJ2aWNlLWludGVyZmFjZSBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSBmb3IgdGhlIHNlcnZpY2UuCi0JICAgIEZvciBzdGF0aWMgc2VydmljZXMsIGl0IGlzIGphdmF4LnhtbC5ycGMuU2VydmljZSBpbnRlcmZhY2UuIEZvcgotCSAgICBnZW5lcmF0ZWQgc2VydmljZSwgaXQgd291bGQgYmUgdGhlIGdlbmVyYXRlZCBpbnRlcmZhY2UgbmFtZS4KLQotCSAgICBUaGUgbmFtZSBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3NkbC1zZXJ2aWNlLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6eHNkUU5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHdzZGwtc2VydmljZS1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgd3NkbCBzZXJ2aWNlIG5hbWUKLQkgICAgYnkgYSBRTkFNRSB3aGljaCB1bmlxdWVseSBpZGVudGlmaWVzICB0aGUgc2VydmljZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LW1hcHBpbmciCi0JCSAgIHR5cGU9ImoyZWU6cG9ydC1tYXBwaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhcmlhYmxlLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdmFyaWFibGUtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gYQotCUphdmEgY2xhc3MgZGF0YSBtZW1iZXIgb3IgSmF2YUJlYW5zIHByb3BlcnR5IHRvIGFuIFhNTCBlbGVtZW50Ci0Jb3IgYXR0cmlidXRlIG5hbWUgb2YgYW4gWE1MIHJvb3QgdHlwZS4gSWYgdGhlIGRhdGEtbWVtYmVyCi0JZWxlbWVudCBpcyBwcmVzZW50LCB0aGUgSmF2YSB2YXJpYWJsZSBuYW1lIGlzIGEgcHVibGljIGRhdGEKLQltZW1iZXIuICBJZiBkYXRhLW1lbWJlcglpcyBub3QgcHJlc2VudCwgdGhlIEphdmEgdmFyaWFibGUgbmFtZQotCWlzIGEgSmF2YUJlYW5zIHByb3BlcnR5LgotCi0JVXNlZCBpbjogamF2YS14bWwtdHlwZS1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImphdmEtdmFyaWFibGUtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgamF2YS12YXJpYWJsZS1uYW1lIGRlZmluZXMgdGhlIG5hbWUgb2YgYSBwdWJsaWMgZGF0YSBtZW1iZXIgb3IKLQkgICAgSmF2YUJlYW5zIHByb3BlcnR5IHdpdGhpbiBhIEphdmEgY2xhc3MuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YS1tZW1iZXIiCi0JCSAgIHR5cGU9ImoyZWU6ZW1wdHlUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBkYXRhLW1lbWJlciBlbGVtZW50IGlzIGEgYm9vbGVhbiBpbmRpY2F0b3IgdGhhdCBhIEphdmEKLQkgICAgdmFyaWFibGUgaXMgYSBwdWJsaWMgZGF0YSBtZW1iZXIgYW5kIG5vdCBhIEphdmFCZWFucyBwcm9wZXJ0eS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ieG1sLWF0dHJpYnV0ZS1uYW1lIgotCQkgICAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHhtbC1hdHRyaWJ1dGUtbmFtZSBlbGVtZW50IGRlZmluZXMgbmFtZSBhdHRyaWJ1dGUgdmFsdWUKLQkgICAgICBvZiBhIFdTREwgYXR0cmlidXRlIGVsZW1lbnQgd2l0aGluIGEgcm9vdCB0eXBlLiAgVGhlIHZhbHVlCi0JICAgICAgb2YgYW4geG1sLWF0dHJpYnV0ZS1uYW1lIGVsZW1lbnQgbXVzdCBtYXRjaCB0aGUgdmFsdWUgb2YKLQkgICAgICB0aGUgcmVmIGF0dHJpYnV0ZSBpZiBtYXBwaW5nIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2UuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudC1uYW1lIgotCQkgICAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHhtbC1lbGVtZW50LW5hbWUgZWxlbWVudCBkZWZpbmVzIG5hbWUgYXR0cmlidXRlIHZhbHVlIG9mCi0JICAgICAgYSBXU0RMIGVsZW1lbnQgd2l0aGluIGEgcm9vdCB0eXBlLiAgVGhlIHZhbHVlIG9mIGFuCi0JICAgICAgeG1sLWVsZW1lbnQtbmFtZSBlbGVtZW50IG11c3QgbWF0Y2ggdGhlIHZhbHVlIG9mIHRoZSByZWYKLQkgICAgICBhdHRyaWJ1dGUgaWYgbWFwcGluZyBhbiBlbGVtZW50IHJlZmVyZW5jZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ieG1sLXdpbGRjYXJkIgotCQkgICAgIHR5cGU9ImoyZWU6ZW1wdHlUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIHhtbC13aWxkY2FyZCBlbGVtZW50IGFzc29jaWF0ZXMgdGhlIHZhcmlhYmxlLW1hcHBpbmcgd2l0aAotCSAgICAgIGFuIHhzZDphbnkgZWxlbWVudCB3aXRoaW4gYSByb290IHR5cGUuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3NkbC1tZXNzYWdlLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgd3NkbC1tZXNzYWdlLW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIHRoZSBtYXBwaW5nIHRvIGEKLQlzcGVjaWZpYyBtZXNzYWdlIGFuZCBpdHMgcGFydC4gVG9nZXRoZXIgdGhleSBkZWZpbmUgdW5pcXVlbHkKLQl0aGUgbWFwcGluZyBmb3IgYSBzcGVjaWZpYyBwYXJhbWV0ZXIuIFBhcnRzIHdpdGhpbiBhIG1lc3NhZ2UKLQljb250ZXh0IGFyZSB1bmlxdWVseSBpZGVudGlmaWVkIHdpdGggdGhlaXIgbmFtZXMuCi0KLQlUaGUgcGFyYW1ldGVyLW1vZGUgaXMgZGVmaW5lZCBieSB0aGUgbWFwcGluZyB0byBpbmRpY2F0ZQotCXdoZXRoZXIgdGhlIG1hcHBpbmcgd2lsbCBiZSBJTiwgT1VULCBvciBJTk9VVC4uICBUaGUgcHJlc2VuY2UKLQlvZiB0aGUgc29hcC1oZWFkZXIgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGUgcGFyYW1ldGVyIGlzCi0JbWFwcGVkIHRvIGEgc29hcCBoZWFkZXIgb25seS4gIFdoZW4gYWJzZW50LCBpdCBtZWFucyB0aGF0IHRoZQotCXdzZGwtbWVzc2FnZSBpcyBtYXBwZWQgdG8gYSBKYXZhIHBhcmFtZXRlci4gVGhlIHNvYXAgaGVhZGVycwotCWFyZSBpbnRlcnByZXRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgcHJvdmlkZWQgaW4gdGhlIG1hcHBpbmcuCi0KLQlVc2VkIGluOiBtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLW1lc3NhZ2UiCi0JCSAgIHR5cGU9ImoyZWU6d3NkbC1tZXNzYWdlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtbWVzc2FnZS1wYXJ0LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6d3NkbC1tZXNzYWdlLXBhcnQtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXItbW9kZSIKLQkJICAgdHlwZT0iajJlZTpwYXJhbWV0ZXItbW9kZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb2FwLWhlYWRlciIKLQkJICAgdHlwZT0iajJlZTplbXB0eVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNvYXAtaGVhZGVyIGVsZW1lbnQgaXMgYSBib29sZWFuIGVsZW1lbnQgaW5kaWNhdGluZyB0aGF0Ci0JICAgIGEgcGFyYW1ldGVyIGlzIG1hcHBlZCB0byBhIFNPQVAgaGVhZGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndzZGwtbWVzc2FnZS1wYXJ0LW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlJbnRlcnByZXRhdGlvbiBvZiB0aGUgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSBlbGVtZW50IGRlcGVuZHMgb24KLQl3aGV0aGVyIG9yIG5vdCB3cmFwcGVkLWVsZW1lbnQgaGFzIGJlZW4gZGVmaW5lZCBpbiB0aGUKLQlzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nLiAgSWYgd3JhcHBlZC1lbGVtZW50IGlzIG5vdAotCXNwZWNpZmllZCwgd3NkbC1tZXNzYWdlLXBhcnQtbmFtZSBkZWZpbmVzIGEgV1NETCBtZXNzYWdlIHBhcnQuIEl0Ci0Jc2hvdWxkIGFsd2F5cyBiZSBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gYSB3c2RsLW1lc3NhZ2UKLQllbGVtZW50LiBJZiB3cmFwcGVkLWVsZW1lbnQgaXMgc3BlY2lmaWVkLCB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lCi0JcmVmZXJzIHRvIGFuIGVsZW1lbnQgbmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlLgotCi0JVXNlZCBpbjogd3NkbC1tZXNzYWdlLW1hcHBpbmcsIHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3NkbC1tZXNzYWdlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHdzZGwtbWVzc2FnZSBlbGVtZW50IGRlZmluZXMgYSBXU0RMIG1lc3NhZ2UgYnkgYSBRTkFNRS4KLQotCVVzZWQgaW46IHdzZGwtbWVzc2FnZS1tYXBwaW5nLCB3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nLAotCWV4Y2VwdGlvbi1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6eHNkUU5hbWVUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZyAgZWxlbWVudCBkZWZpbmVzIHRoZSBtYXBwaW5nIGZvciB0aGUKLQltZXRob2QncyByZXR1cm4gdmFsdWUuIEl0IGRlZmluZXMgdGhlIG1hcHBpbmcgdG8gYSBzcGVjaWZpYyBtZXNzYWdlCi0JYW5kIGl0cyBwYXJ0LiAgVG9nZXRoZXIgdGhleSBkZWZpbmUgdW5pcXVlbHkgdGhlIG1hcHBpbmcgZm9yIGEKLQlzcGVjaWZpYyBwYXJhbWV0ZXIuIFBhcnRzIHdpdGhpbiBhIG1lc3NhZ2UgY29udGV4dCBhcmUgdW5pcXVlbHkKLQlpZGVudGlmaWVkIHdpdGggdGhlaXIgbmFtZXMuIFRoZSB3c2RsLW1lc3NhZ2UtcGFydC1uYW1lIGlzIG5vdAotCXNwZWNpZmllZCBpZiB0aGVyZSBpcyBubyByZXR1cm4gdmFsdWUgb3IgT1VUIHBhcmFtZXRlcnMuCi0KLQlVc2VkIGluOiBzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1yZXR1cm4tdmFsdWUiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBtZXRob2QtcmV0dXJuLXZhbHVlICBlbGVtZW50IGRlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQKLQkgICAgY2xhc3MgbmFtZSBvciB2b2lkIHR5cGUgZm9yIHRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUKLQkgICAgdHlwZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLW1lc3NhZ2UiCi0JCSAgIHR5cGU9ImoyZWU6d3NkbC1tZXNzYWdlVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtbWVzc2FnZS1wYXJ0LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6d3NkbC1tZXNzYWdlLXBhcnQtbmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTJhNzk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvajJlZV93ZWJfc2VydmljZXNfMV8xLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQ5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgeG1sbnM6ajJlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQkgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLQkgICAgdmVyc2lvbj0iMS4xIj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIylqMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkcwkxLjExIDAyLzExLzAzCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLSAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLSAgICAgIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAoQykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gMjAwMgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbCi0KLQlUaGUgd2Vic2VydmljZXMgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IGZvciB0aGUgd2ViIHNlcnZpY2VzCi0JZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgSXQgc3BlY2lmaWVzIHRoZSBzZXQgb2Ygd2ViIHNlcnZpY2UKLQlkZXNjcmlwdGlvbnMgdGhhdCBhcmUgdG8gYmUgZGVwbG95ZWQgaW50byB0aGUgSjJFRSBBcHBsaWNhdGlvbgotCVNlcnZlciBhbmQgdGhlIGRlcGVuZGVuY2llcyB0aGV5IGhhdmUgb24gY29udGFpbmVyIHJlc291cmNlcyBhbmQKLQlzZXJ2aWNlcy4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZAotCSJNRVRBLUlORi93ZWJzZXJ2aWNlcy54bWwiIGluIHRoZSB3ZWIgc2VydmljZXMnIGphciBmaWxlLgotCi0JVXNlZCBpbjogd2Vic2VydmljZXMueG1sCi0KLQlBbGwgd2Vic2VydmljZXMgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlIHRoZQotCXdlYnNlcnZpY2VzIHNjaGVtYSBieSB1c2luZyB0aGUgSjJFRSBuYW1lc3BhY2U6Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlCi0KLQlhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSB2ZXJzaW9uCi0JZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8d2Vic2VydmljZXMgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQkJaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL3hzZC9qMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkIgotCSAgICAgIHZlcnNpb249IjEuMSI+Ci0JICAgICAgLi4uCi0JICAgIDwvd2Vic2VydmljZXM+Ci0KLQlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YgdGhlCi0Jc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciB0aGUgSjJFRQotCW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLQlodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QKLQotCV1dPgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRQotICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0gICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0Jc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLQlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLQl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLQlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImoyZWVfMV80LnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWJzZXJ2aWNlcyIgdHlwZT0iajJlZTp3ZWJzZXJ2aWNlc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB3ZWJzZXJ2aWNlcyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgZm9yIHRoZSB3ZWIgc2VydmljZXMKLQlkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBJdCBzcGVjaWZpZXMgdGhlIHNldCBvZiB3ZWIgc2VydmljZQotCWRlc2NyaXB0aW9ucyB0aGF0IGFyZSB0byBiZSBkZXBsb3llZCBpbnRvIHRoZSBKMkVFIEFwcGxpY2F0aW9uIFNlcnZlcgotCWFuZCB0aGUgZGVwZW5kZW5jaWVzIHRoZXkgaGF2ZSBvbiBjb250YWluZXIgcmVzb3VyY2VzIGFuZCBzZXJ2aWNlcy4KLQotCVVzZWQgaW46IHdlYnNlcnZpY2VzLnhtbAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOmtleSBuYW1lPSJ3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUgaWRlbnRpZmllcyB0aGUgY29sbGVjdGlvbiBvZgotCSAgcG9ydC1jb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIFdTREwgZmlsZSBhbmQgSkFYLVJQQyBtYXBwaW5nLiBUaGUKLQkgIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6d2Vic2VydmljZS1kZXNjcmlwdGlvbiIvPgotICAgICAgPHhzZDpmaWVsZCB4cGF0aD0iajJlZTp3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUiLz4KLSAgICA8L3hzZDprZXk+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvcnQtY29tcG9uZW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHBvcnQtY29tcG9uZW50IGVsZW1lbnQgYXNzb2NpYXRlcyBhIFdTREwgcG9ydCB3aXRoIGEgd2ViIHNlcnZpY2UKLQlpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uLiAgSXQgZGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgcG9ydCBhcyBhCi0JY29tcG9uZW50LCBvcHRpb25hbCBkZXNjcmlwdGlvbiwgb3B0aW9uYWwgZGlzcGxheSBuYW1lLCBvcHRpb25hbCBpY29uaWMKLQlyZXByZXNlbnRhdGlvbnMsIFdTREwgcG9ydCBRTmFtZSwgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UsIFNlcnZpY2UKLQlJbXBsZW1lbnRhdGlvbiBCZWFuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgotCQkgICB0eXBlPSJqMmVlOmljb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtY29tcG9uZW50LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIHBvcnQtY29tcG9uZW50LW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgYSBwb3J0IGNvbXBvbmVudCdzCi0JICAgICAgbmFtZS4gIFRoaXMgbmFtZSBpcyBhc3NpZ25lZCBieSB0aGUgbW9kdWxlIHByb2R1Y2VyIHRvIG5hbWUKLQkgICAgICB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBiZWFuIGluIHRoZSBtb2R1bGUncyBkZXBsb3ltZW50Ci0JICAgICAgZGVzY3JpcHRvci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgYW1vbmcgdGhlIHBvcnQgY29tcG9uZW50Ci0JICAgICAgbmFtZXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBtb2R1bGUuCi0KLQkgICAgICBVc2VkIGluOiBwb3J0LWNvbXBvbmVudAotCi0JICAgICAgRXhhbXBsZToKLQkJICAgICAgPHBvcnQtY29tcG9uZW50LW5hbWU+RW1wbG95ZWVTZXJ2aWNlCi0JCSAgICAgIDwvcG9ydC1jb21wb25lbnQtbmFtZT4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLXBvcnQiCi0JCSAgIHR5cGU9ImoyZWU6eHNkUU5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgbmFtZSBzcGFjZSBhbmQgbG9jYWwgbmFtZSBwYXJ0IG9mIHRoZSBXU0RMIHBvcnQgUU5hbWUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGNvbnRhaW5zIHRoZQotCSAgICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBwb3J0IGNvbXBvbmVudCdzIFNlcnZpY2UgRW5kcG9pbnQKLQkgICAgICBJbnRlcmZhY2UuCi0KLQkgICAgICBVc2VkIGluOiBwb3J0LWNvbXBvbmVudAotCi0JICAgICAgRXhhbXBsZToKLQkJICAgICAgPHJlbW90ZT5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlPC9yZW1vdGU+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1pbXBsLWJlYW4iCi0JCSAgIHR5cGU9ImoyZWU6c2VydmljZS1pbXBsLWJlYW5UeXBlIi8+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyIgotCQkgICB0eXBlPSJqMmVlOnBvcnQtY29tcG9uZW50X2hhbmRsZXJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9ydC1jb21wb25lbnRfaGFuZGxlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCURlY2xhcmVzIHRoZSBoYW5kbGVyIGZvciBhIHBvcnQtY29tcG9uZW50LiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZQotCWluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLgotCi0JVXNlZCBpbjogcG9ydC1jb21wb25lbnQKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKLQkgICAgbW9kdWxlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXItY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIGhhbmRsZXIgaW1wbGVtZW50YXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKLQkJICAgdHlwZT0iajJlZTpwYXJhbS12YWx1ZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvYXAtaGVhZGVyIgotCQkgICB0eXBlPSJqMmVlOnhzZFFOYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgdGhlIFFOYW1lIG9mIGEgU09BUCBoZWFkZXIgdGhhdCB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGUKLQkgICAgaGFuZGxlci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb2FwLXJvbGUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNvYXAtcm9sZSBlbGVtZW50IGNvbnRhaW5zIGEgU09BUCBhY3RvciBkZWZpbml0aW9uIHRoYXQgdGhlCi0JICAgIEhhbmRsZXIgd2lsbCBwbGF5IGFzIGEgcm9sZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLWltcGwtYmVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXJ2aWNlLWltcGwtYmVhbiBlbGVtZW50IGRlZmluZXMgdGhlIHdlYiBzZXJ2aWNlIGltcGxlbWVudGF0aW9uLgotCUEgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgYW4gRUpCIGJlYW4gY2xhc3Mgb3IgSkFYLVJQQyB3ZWIKLQljb21wb25lbnQuICBFeGlzdGluZyBFSkIgaW1wbGVtZW50YXRpb25zIGFyZSBleHBvc2VkIGFzIGEgd2ViIHNlcnZpY2UKLQl1c2luZyBhbiBlamItbGluay4KLQotCVVzZWQgaW46IHBvcnQtY29tcG9uZW50Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbGluayIKLQkJICAgdHlwZT0iajJlZTplamItbGlua1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LWxpbmsiCi0JCSAgIHR5cGU9ImoyZWU6c2VydmxldC1saW5rVHlwZSIvPgotICAgIDwveHNkOmNob2ljZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2bGV0LWxpbmtUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBzZXJ2bGV0LWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBzZXJ2aWNlLWltcGwtYmVhbiBlbGVtZW50Ci0JICB0byBzcGVjaWZ5IHRoYXQgYSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIEJlYW4gaXMgZGVmaW5lZCBhcyBhCi0JICBKQVgtUlBDIFNlcnZpY2UgRW5kcG9pbnQuCi0KLQkgIFRoZSB2YWx1ZSBvZiB0aGUgc2VydmxldC1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgc2VydmxldC1uYW1lIG9mCi0JICBhIEpBWC1SUEMgU2VydmljZSBFbmRwb2ludCBpbiB0aGUgc2FtZSBXQVIgZmlsZS4KLQotCSAgVXNlZCBpbjogc2VydmljZS1pbXBsLWJlYW4KLQotCSAgRXhhbXBsZToKLQkJICA8c2VydmxldC1saW5rPlN0b2NrUXVvdGVTZXJ2aWNlPC9zZXJ2bGV0LWxpbms+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic2VydmljZS1kZXNjcmlwdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uIGVsZW1lbnQgZGVmaW5lcyBhIFdTREwgZG9jdW1lbnQgZmlsZQotCWFuZCB0aGUgc2V0IG9mIFBvcnQgY29tcG9uZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIFdTREwgcG9ydHMKLQlkZWZpbmVkIGluIHRoZSBXU0RMIGRvY3VtZW50LiAgVGhlcmUgbWF5IGJlIG11bHRpcGxlCi0Jd2Vic2VydmljZS1kZXNjcmlwdGlvbnMgZGVmaW5lZCB3aXRoaW4gYSBtb2R1bGUuCi0KLQlBbGwgV1NETCBmaWxlIHBvcnRzIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgcG9ydC1jb21wb25lbnQgZWxlbWVudAotCWRlZmluZWQuCi0KLQlVc2VkIGluOiB3ZWJzZXJ2aWNlcwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6ZGlzcGxheS1uYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpY29uIgotCQkgICB0eXBlPSJqMmVlOmljb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd2Vic2VydmljZS1kZXNjcmlwdGlvbi1uYW1lIGlkZW50aWZpZXMgdGhlIGNvbGxlY3Rpb24gb2YKLQkgICAgcG9ydC1jb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIFdTREwgZmlsZSBhbmQgSkFYLVJQQwotCSAgICBtYXBwaW5nLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLWZpbGUiCi0JCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd3NkbC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBXU0RMIGZpbGUgaW4gdGhlCi0JICAgIG1vZHVsZS4gIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgbW9kdWxlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpheHJwYy1tYXBwaW5nLWZpbGUiCi0JCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgamF4cnBjLW1hcHBpbmctZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0Ci0JICAgIGRlc2NyaWJlcyB0aGUgSkFYLVJQQyBtYXBwaW5nIGJldHdlZW4gdGhlIEphdmEgaW50ZXJhY2VzIHVzZWQgYnkKLQkgICAgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgV1NETCBkZXNjcmlwdGlvbiBpbiB0aGUgd3NkbC1maWxlLiAgVGhlCi0JICAgIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1jb21wb25lbnQiCi0JCSAgIHR5cGU9ImoyZWU6cG9ydC1jb21wb25lbnRUeXBlIgotCQkgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmtleSBuYW1lPSJwb3J0LWNvbXBvbmVudF9oYW5kbGVyLW5hbWUta2V5Ij4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLQkgICAgICB3aXRoaW4gdGhlIG1vZHVsZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6aGFuZGxlciIvPgotCSAgPHhzZDpmaWVsZCB4cGF0aD0iajJlZTpoYW5kbGVyLW5hbWUiLz4KLQk8L3hzZDprZXk+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNlcnZpY2VzVHlwZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOndlYnNlcnZpY2UtZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmtleSBuYW1lPSJwb3J0LWNvbXBvbmVudC1uYW1lLWtleSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgICA8IVtDREFUQVsKLQotCQlUaGUgcG9ydC1jb21wb25lbnQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhIHBvcnQKLQkJY29tcG9uZW50J3MgbmFtZS4gIFRoaXMgbmFtZSBpcyBhc3NpZ25lZCBieSB0aGUgbW9kdWxlCi0JCXByb2R1Y2VyIHRvIG5hbWUgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbiBpbiB0aGUKLQkJbW9kdWxlJ3MgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotCQlhbW9uZyB0aGUgcG9ydCBjb21wb25lbnQgbmFtZXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBtb2R1bGUuCi0KLQkJVXNlZCBpbjogcG9ydC1jb21wb25lbnQKLQotCQlFeGFtcGxlOgotCQkJPHBvcnQtY29tcG9uZW50LW5hbWU+RW1wbG95ZWVTZXJ2aWNlCi0JCQk8L3BvcnQtY29tcG9uZW50LW5hbWU+Ci0KLQkJXV0+Ci0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpwb3J0LWNvbXBvbmVudCIvPgotCSAgPHhzZDpmaWVsZCB4cGF0aD0iajJlZTpwb3J0LWNvbXBvbmVudC1uYW1lIi8+Ci0JPC94c2Q6a2V5PgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0JCSAgIGZpeGVkPSIxLjEiCi0JCSAgIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyAxLjEuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2oyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8xLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0YTU1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2oyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotCSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotCSAgICB2ZXJzaW9uPSIxLjEiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWoyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkcwkxLjEwIDAyLzExLzAzCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLSAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLSAgICAgIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAoQykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gMjAwMgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3J0LWNvbXBvbmVudC1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcG9ydC1jb21wb25lbnQtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGllbnQgZGVwZW5kZW5jeQotCW9uIHRoZSBjb250YWluZXIgZm9yIHJlc29sdmluZyBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlCi0JdG8gYSBXU0RMIHBvcnQuIEl0IG9wdGlvbmFsbHkgYXNzb2NpYXRlcyB0aGUgU2VydmljZSBFbmRwb2ludAotCUludGVyZmFjZSB3aXRoIGEgcGFydGljdWxhciBwb3J0LWNvbXBvbmVudC4gVGhpcyBpcyBvbmx5IHVzZWQKLQlieSB0aGUgY29udGFpbmVyIGZvciBhIFNlcnZpY2UuZ2V0UG9ydChDbGFzcykgbWV0aG9kIGNhbGwuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGRlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQKLQkgICAgSmF2YSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIG9mIGEKLQkgICAgV1NETCBwb3J0LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1jb21wb25lbnQtbGluayIKLQkJICAgdHlwZT0iajJlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBvcnQtY29tcG9uZW50LWxpbmsgZWxlbWVudCBsaW5rcyBhIHBvcnQtY29tcG9uZW50LXJlZgotCSAgICB0byBhIHNwZWNpZmljIHBvcnQtY29tcG9uZW50IHJlcXVpcmVkIHRvIGJlIG1hZGUgYXZhaWxhYmxlCi0JICAgIGJ5IGEgc2VydmljZSByZWZlcmVuY2UuCi0KLQkgICAgVGhlIHZhbHVlIG9mIGEgcG9ydC1jb21wb25lbnQtbGluayBtdXN0IGJlIHRoZQotCSAgICBwb3J0LWNvbXBvbmVudC1uYW1lIG9mIGEgcG9ydC1jb21wb25lbnQgaW4gdGhlIHNhbWUgbW9kdWxlCi0JICAgIG9yIGFub3RoZXIgbW9kdWxlIGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uIHVuaXQuIFRoZSBzeW50YXgKLQkgICAgZm9yIHNwZWNpZmljYXRpb24gZm9sbG93cyB0aGUgc3ludGF4IGRlZmluZWQgZm9yIGVqYi1saW5rCi0JICAgIGluIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Z3JvdXAgbmFtZT0ic2VydmljZS1yZWZHcm91cCI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLXJlZiIKLQkJICAgdHlwZT0iajJlZTpzZXJ2aWNlLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6a2V5IG5hbWU9InNlcnZpY2UtcmVmX2hhbmRsZXItbmFtZS1rZXkiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotCSAgICAgIHdpdGhpbiB0aGUgbW9kdWxlLgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpoYW5kbGVyIi8+Ci0JICA8eHNkOmZpZWxkIHhwYXRoPSJqMmVlOmhhbmRsZXItbmFtZSIvPgotCTwveHNkOmtleT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmdyb3VwPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXJ2aWNlLXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgcmVmZXJlbmNlIHRvIGEgV2ViCi0Jc2VydmljZS4gSXQgY29udGFpbnMgb3B0aW9uYWwgZGVzY3JpcHRpb24sIGRpc3BsYXkgbmFtZSBhbmQKLQlpY29ucywgYSBkZWNsYXJhdGlvbiBvZiB0aGUgcmVxdWlyZWQgU2VydmljZSBpbnRlcmZhY2UsCi0JYW4gb3B0aW9uYWwgV1NETCBkb2N1bWVudCBsb2NhdGlvbiwgYW4gb3B0aW9uYWwgc2V0Ci0Jb2YgSkFYLVJQQyBtYXBwaW5ncywgYW4gb3B0aW9uYWwgUU5hbWUgZm9yIHRoZSBzZXJ2aWNlIGVsZW1lbnQsCi0JYW4gb3B0aW9uYWwgc2V0IG9mIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlcyB0byBiZSByZXNvbHZlZAotCWJ5IHRoZSBjb250YWluZXIgdG8gYSBXU0RMIHBvcnQsIGFuZCBhbiBvcHRpb25hbCBzZXQgb2YgaGFuZGxlcnMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iajJlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1yZWYtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpqbmRpLW5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlcnZpY2UtcmVmLW5hbWUgZWxlbWVudCBkZWNsYXJlcyBsb2dpY2FsIG5hbWUgdGhhdCB0aGUKLQkgICAgY29tcG9uZW50cyBpbiB0aGUgbW9kdWxlIHVzZSB0byBsb29rIHVwIHRoZSBXZWIgc2VydmljZS4gSXQKLQkgICAgaXMgcmVjb21tZW5kZWQgdGhhdCBhbGwgc2VydmljZSByZWZlcmVuY2UgbmFtZXMgc3RhcnQgd2l0aAotCSAgICAic2VydmljZS8iLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1pbnRlcmZhY2UiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXJ2aWNlLWludGVyZmFjZSBlbGVtZW50IGRlY2xhcmVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLQkgICAgbmFtZSBvZiB0aGUgSkFYLVJQQyBTZXJ2aWNlIGludGVyZmFjZSB0aGUgY2xpZW50IGRlcGVuZHMgb24uCi0JICAgIEluIG1vc3QgY2FzZXMgdGhlIHZhbHVlIHdpbGwgYmUgamF2YXgueG1sLnJwYy5TZXJ2aWNlLiAgQSBKQVgtUlBDCi0JICAgIGdlbmVyYXRlZCBTZXJ2aWNlIEludGVyZmFjZSBjbGFzcyBtYXkgYWxzbyBiZSBzcGVjaWZpZWQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLWZpbGUiCi0JCSAgIHR5cGU9ImoyZWU6eHNkQW55VVJJVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd3NkbC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIFVSSSBsb2NhdGlvbiBvZiBhIFdTREwKLQkgICAgZmlsZS4gVGhlIGxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBtb2R1bGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqYXhycGMtbWFwcGluZy1maWxlIgotCQkgICB0eXBlPSJqMmVlOnBhdGhUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBqYXhycGMtbWFwcGluZy1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQKLQkgICAgZGVzY3JpYmVzIHRoZSBKQVgtUlBDIG1hcHBpbmcgYmV0d2VlbiB0aGUgSmF2YSBpbnRlcmFjZXMgdXNlZCBieQotCSAgICB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBXU0RMIGRlc2NyaXB0aW9uIGluIHRoZSB3c2RsLWZpbGUuICBUaGUKLQkgICAgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIG1vZHVsZSBmaWxlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1xbmFtZSIKLQkJICAgdHlwZT0iajJlZTp4c2RRTmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlcnZpY2UtcW5hbWUgZWxlbWVudCBkZWNsYXJlcyB0aGUgc3BlY2lmaWMgV1NETCBzZXJ2aWNlCi0JICAgIGVsZW1lbnQgdGhhdCBpcyBiZWluZyByZWZlcmVkIHRvLiAgSXQgaXMgbm90IHNwZWNpZmllZCBpZiBubwotCSAgICB3c2RsLWZpbGUgaXMgZGVjbGFyZWQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LWNvbXBvbmVudC1yZWYiCi0JCSAgIHR5cGU9ImoyZWU6cG9ydC1jb21wb25lbnQtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwb3J0LWNvbXBvbmVudC1yZWYgZWxlbWVudCBkZWNsYXJlcyBhIGNsaWVudCBkZXBlbmRlbmN5Ci0JICAgIG9uIHRoZSBjb250YWluZXIgZm9yIHJlc29sdmluZyBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlCi0JICAgIHRvIGEgV1NETCBwb3J0LiBJdCBvcHRpb25hbGx5IGFzc29jaWF0ZXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQKLQkgICAgSW50ZXJmYWNlIHdpdGggYSBwYXJ0aWN1bGFyIHBvcnQtY29tcG9uZW50LiBUaGlzIGlzIG9ubHkgdXNlZAotCSAgICBieSB0aGUgY29udGFpbmVyIGZvciBhIFNlcnZpY2UuZ2V0UG9ydChDbGFzcykgbWV0aG9kIGNhbGwuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyIgotCQkgICB0eXBlPSJqMmVlOnNlcnZpY2UtcmVmX2hhbmRsZXJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbgotCSAgICBhY2Nlc3MgdGhlIGluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUKLQkgICAgSGFuZGxlckluZm8gaW50ZXJmYWNlLiBJZiBwb3J0LW5hbWUgaXMgbm90IHNwZWNpZmllZCwgdGhlCi0JICAgIGhhbmRsZXIgaXMgYXNzdW1lZCB0byBiZSBhc3NvY2lhdGVkIHdpdGggYWxsIHBvcnRzIG9mIHRoZQotCSAgICBzZXJ2aWNlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtcmVmX2hhbmRsZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlEZWNsYXJlcyB0aGUgaGFuZGxlciBmb3IgYSBwb3J0LWNvbXBvbmVudC4gSGFuZGxlcnMgY2FuIGFjY2VzcyB0aGUKLQlpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4gSWYKLQlwb3J0LW5hbWUgaXMgbm90IHNwZWNpZmllZCwgdGhlIGhhbmRsZXIgaXMgYXNzdW1lZCB0byBiZSBhc3NvY2lhdGVkCi0Jd2l0aCBhbGwgcG9ydHMgb2YgdGhlIHNlcnZpY2UuCi0KLQlVc2VkIGluOiBzZXJ2aWNlLXJlZgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLQkgICAgd2l0aGluIHRoZSBtb2R1bGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgaGFuZGxlcgotCSAgICBpbXBsZW1lbnRhdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LXBhcmFtIgotCQkgICB0eXBlPSJqMmVlOnBhcmFtLXZhbHVlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic29hcC1oZWFkZXIiCi0JCSAgIHR5cGU9ImoyZWU6eHNkUU5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgUU5hbWUgb2YgYSBTT0FQIGhlYWRlciB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkCi0JICAgIGJ5IHRoZSBoYW5kbGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic29hcC1yb2xlIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzb2FwLXJvbGUgZWxlbWVudCBjb250YWlucyBhIFNPQVAgYWN0b3IgZGVmaW5pdGlvbiB0aGF0Ci0JICAgIHRoZSBIYW5kbGVyIHdpbGwgcGxheSBhcyBhIHJvbGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBvcnQtbmFtZSBlbGVtZW50IGRlZmluZXMgdGhlIFdTREwgcG9ydC1uYW1lIHRoYXQgYQotCSAgICBoYW5kbGVyIHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGguCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2phdmFlZV81LnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvamF2YWVlXzUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjEwMTgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvamF2YWVlXzUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjA5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYQotICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgIHZlcnNpb249IjUiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWphdmFlZV81LnhzZHMJMS42NSAwNi8wMi8xNwotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICAgICAgVS5TLkEKLSAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi08eHNkOmFubm90YXRpb24+Ci08eHNkOmRvY3VtZW50YXRpb24+Ci0KLVRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgdGhhdCBhcHBlYXIgaW4gdGhlIGNvbW1vbgotc2hhcmVhYmxlIHNjaGVtYShzKSBvZiBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgc2hvdWxkIGJlCi1pbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvbnRleHQgdGhleSBhcmUgaW5jbHVkZWQ6Ci0KLURlcGxveW1lbnQgQ29tcG9uZW50IG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICBqMmVlIGFwcGxpY2F0aW9uOwotICAgIGFwcGxpY2F0aW9uIGNsaWVudDsKLSAgICB3ZWIgYXBwbGljYXRpb247Ci0gICAgZW50ZXJwcmlzZSBiZWFuOwotICAgIHJlc291cmNlIGFkYXB0ZXI7Ci0KLURlcGxveW1lbnQgRmlsZSBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgZWFyIGZpbGU7Ci0gICAgd2FyIGZpbGU7Ci0gICAgamFyIGZpbGU7Ci0gICAgcmFyIGZpbGU7Ci0KLTwveHNkOmRvY3VtZW50YXRpb24+Ci08L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotCSAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLz4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImphdmFlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMi54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpncm91cCBuYW1lPSJkZXNjcmlwdGlvbkdyb3VwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIGdyb3VwIGtlZXBzIHRoZSB1c2FnZSBvZiB0aGUgY29udGFpbmVkIGRlc2NyaXB0aW9uIHJlbGF0ZWQKLQllbGVtZW50cyBjb25zaXN0ZW50IGFjcm9zcyBKYXZhIEVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuCi0KLQlBbGwgZWxlbWVudHMgbWF5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IGxhbmd1YWdlcywKLQl0byBzdXBwb3J0IGxvY2FsaXphdGlvbiBvZiB0aGUgY29udGVudC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpkaXNwbGF5LW5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLQkJICAgdHlwZT0iamF2YWVlOmljb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmdyb3VwPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZXNjcmlwdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBkZXNjcmlwdGlvbiB0eXBlIGlzIHVzZWQgYnkgYSBkZXNjcmlwdGlvbiBlbGVtZW50IHRvCi0JcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGVsZW1lbnRzCi0JdGhhdCB1c2UgdGhpcyB0eXBlIHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0IHRoZQotCURlcGxveW1lbnQgQ29tcG9uZW50J3MgRGVwbG95bWVudCBGaWxlIGZpbGUgcHJvZHVjZXIgd2FudHMKLQl0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncwotCURlcGxveW1lbnQgRmlsZSAoaS5lLiwgdG8gdGhlIERlcGxveWVyKS4gVHlwaWNhbGx5LCB0aGUKLQl0b29scyB1c2VkIGJ5IHN1Y2ggYSBEZXBsb3ltZW50IEZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5Ci0JdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQgdGhhdAotCWNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbi4KLQotCVRoZSBsYW5nIGF0dHJpYnV0ZSBkZWZpbmVzIHRoZSBsYW5ndWFnZSB0aGF0IHRoZQotCWRlc2NyaXB0aW9uIGlzIHByb3ZpZGVkIGluLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiZW4iIChFbmdsaXNoKS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImphdmFlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGV3ZXktdmVyc2lvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBkZWZpbmVzIGEgZGV3ZXkgZGVjaW1hbCB0aGF0IGlzIHVzZWQKLQl0byBkZXNjcmliZSB2ZXJzaW9ucyBvZiBkb2N1bWVudHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iXC4/WzAtOV0rKFwuWzAtOV0rKSoiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzcGxheS1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgZGlzcGxheS1uYW1lIHR5cGUgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQKLQkgIHRvIGJlIGRpc3BsYXllZCBieSB0b29scy4gSXQgaXMgdXNlZCBieSBkaXNwbGF5LW5hbWUKLQkgIGVsZW1lbnRzLiAgVGhlIGRpc3BsYXkgbmFtZSBuZWVkIG5vdCBiZSB1bmlxdWUuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIC4uLgotCSAgICAgPGRpc3BsYXktbmFtZSB4bWw6bGFuZz0iZW4iPgotCSAgICAgICBFbXBsb3llZSBTZWxmIFNlcnZpY2UKLQkgICAgIDwvZGlzcGxheS1uYW1lPgotCi0JICBUaGUgdmFsdWUgb2YgdGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBpcyAiZW4iIChFbmdsaXNoKSBieSBkZWZhdWx0LgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYi1saW5rVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgZWpiLWxpbmtUeXBlIGlzIHVzZWQgYnkgZWpiLWxpbmsKLQkgIGVsZW1lbnRzIGluIHRoZSBlamItcmVmIG9yIGVqYi1sb2NhbC1yZWYgZWxlbWVudHMgdG8gc3BlY2lmeQotCSAgdGhhdCBhbiBFSkIgcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBlbnRlcnByaXNlIGJlYW4uCi0KLQkgIFRoZSB2YWx1ZSBvZiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBlamItbmFtZSBvZiBhbgotCSAgZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBzYW1lIGVqYi1qYXIgZmlsZSBvciBpbiBhbm90aGVyIGVqYi1qYXIKLQkgIGZpbGUgaW4gdGhlIHNhbWUgSmF2YSBFRSBhcHBsaWNhdGlvbiB1bml0LgotCi0JICBBbHRlcm5hdGl2ZWx5LCB0aGUgbmFtZSBpbiB0aGUgZWpiLWxpbmsgZWxlbWVudCBtYXkgYmUKLQkgIGNvbXBvc2VkIG9mIGEgcGF0aCBuYW1lIHNwZWNpZnlpbmcgdGhlIGVqYi1qYXIgY29udGFpbmluZyB0aGUKLQkgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuIHdpdGggdGhlIGVqYi1uYW1lIG9mIHRoZSB0YXJnZXQKLQkgIGJlYW4gYXBwZW5kZWQgYW5kIHNlcGFyYXRlZCBmcm9tIHRoZSBwYXRoIG5hbWUgYnkgIiMiLiAgVGhlCi0JICBwYXRoIG5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIERlcGxveW1lbnQgRmlsZSBjb250YWluaW5nCi0JICBEZXBsb3ltZW50IENvbXBvbmVudCB0aGF0IGlzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlCi0JICBiZWFuLiAgVGhpcyBhbGxvd3MgbXVsdGlwbGUgZW50ZXJwcmlzZSBiZWFucyB3aXRoIHRoZSBzYW1lCi0JICBlamItbmFtZSB0byBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgotCi0JICBFeGFtcGxlczoKLQotCSAgICAgIDxlamItbGluaz5FbXBsb3llZVJlY29yZDwvZWpiLWxpbms+Ci0KLQkgICAgICA8ZWpiLWxpbms+Li4vcHJvZHVjdHMvcHJvZHVjdC5qYXIjUHJvZHVjdEVKQjwvZWpiLWxpbms+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItbG9jYWwtcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVqYi1sb2NhbC1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLWxvY2FsLXJlZiBlbGVtZW50cyBmb3IKLQl0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwKLQlob21lIG9yIHRvIHRoZSBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2Ugb2YgYSAzLjAgYmVhbi4KLSAgICAgICAgVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotCi0JICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQkgICAgLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIERlcGxveW1lbnQKLQkgICAgICBDb21wb25lbnQgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4uCi0JICAgIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0JICAgIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIGxvY2FsIGludGVyZmFjZSBvZiB0aGUgcmVmZXJlbmNlZAotICAgICAgICAgICAgICBlbnRlcnByaXNlIGJlYW4gb3IgdGhlIGxvY2FsIGJ1c2luZXNzIGludGVyZmFjZSBvZiB0aGUKLSAgICAgICAgICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uCi0JICAgIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIGxvY2FsIGhvbWUgaW50ZXJmYWNlIG9mIHRoZSByZWZlcmVuY2VkCi0gICAgICAgICAgICAgIGVudGVycHJpc2UgYmVhbi4gTm90IGFwcGxpY2FibGUgaWYgdGhpcyBlamItbG9jYWwtcmVmIHJlZmVycwotICAgICAgICAgICAgICB0byB0aGUgbG9jYWwgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIGEgMy4wIGJlYW4uCi0JICAgIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUKLQkgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotICAgICAgICAgICAgLSBvcHRpb25hbCBlbGVtZW50cyB0byBkZWZpbmUgaW5qZWN0aW9uIG9mIHRoZSBuYW1lZCBlbnRlcnByaXNlCi0gICAgICAgICAgICAgIGJlYW4gaW50byBhIGNvbXBvbmVudCBmaWVsZCBvciBwcm9wZXJ0eS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1yZWYtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmLXR5cGUiCi0JCSAgIHR5cGU9ImphdmFlZTplamItcmVmLXR5cGVUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsLWhvbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpsb2NhbC1ob21lVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbCIKLQkJICAgdHlwZT0iamF2YWVlOmxvY2FsVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbGluayIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1saW5rVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOnJlc291cmNlR3JvdXAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItcmVmLW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlCi0JICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGFuZCBpcyByZWxhdGl2ZSB0byB0aGUKLQkgIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKLQkgIERlcGxveW1lbnQgQ29tcG9uZW50LgotCi0JICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxlamItcmVmLW5hbWU+ZWpiL1BheXJvbGw8L2VqYi1yZWYtbmFtZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6am5kaS1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItcmVmLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWpiLXJlZi10eXBlVHlwZSBjb250YWlucyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUKLQlyZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4KLQotCVRoZSBlamItcmVmLXR5cGUgZGVzaWduYXRlcyBhIHZhbHVlCi0JdGhhdCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0JICAgIEVudGl0eQotCSAgICBTZXNzaW9uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVudGl0eSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNlc3Npb24iLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamItcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVqYi1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLXJlZiBlbGVtZW50cyBmb3IgdGhlCi0JZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgaG9tZSBvcgotICAgICAgICB0byB0aGUgcmVtb3RlIGJ1c2luZXNzIGludGVyZmFjZSBvZiBhIDMuMCBiZWFuLgotCVRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLQotCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JICAgIC0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mCi0JICAgICAgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50IHRoYXQncyByZWZlcmVuY2luZyB0aGUgZW50ZXJwcmlzZQotCSAgICAgIGJlYW4uCi0JICAgIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0gICAgICAgICAgICAtIHRoZSBvcHRpb25hbCByZW1vdGUgaW50ZXJmYWNlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotICAgICAgICAgICAgICBvciB0aGUgcmVtb3RlIGJ1c2luZXNzIGludGVyZmFjZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlCi0gICAgICAgICAgICAgIGJlYW4KLQkgICAgLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgaG9tZSBpbnRlcmZhY2Ugb2YgdGhlIHJlZmVyZW5jZWQKLSAgICAgICAgICAgICAgZW50ZXJwcmlzZSBiZWFuLiAgTm90IGFwcGxpY2FibGUgaWYgdGhpcyBlamItcmVmCi0gICAgICAgICAgICAgIHJlZmVycyB0byB0aGUgcmVtb3RlIGJ1c2luZXNzIGludGVyZmFjZSBvZiBhIDMuMCBiZWFuLgotCSAgICAtIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlCi0JICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLSAgICAgICAgICAgIC0gb3B0aW9uYWwgZWxlbWVudHMgdG8gZGVmaW5lIGluamVjdGlvbiBvZiB0aGUgbmFtZWQgZW50ZXJwcmlzZQotICAgICAgICAgICAgICBiZWFuIGludG8gYSBjb21wb25lbnQgZmllbGQgb3IgcHJvcGVydHkKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYi1yZWYtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmVqYi1yZWYtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmLXR5cGUiCi0JCSAgIHR5cGU9ImphdmFlZTplamItcmVmLXR5cGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJob21lIgotCQkgICB0eXBlPSJqYXZhZWU6aG9tZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbW90ZSIKLQkJICAgdHlwZT0iamF2YWVlOnJlbW90ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWxpbmsiCi0JCSAgIHR5cGU9ImphdmFlZTplamItbGlua1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpyZXNvdXJjZUdyb3VwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1wdHlUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgaXMgdXNlZCB0byBkZXNpZ25hdGUgYW4gZW1wdHkKLQllbGVtZW50IHdoZW4gdXNlZC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhpcyB0eXBlIGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG9mIHRoZQotCSAgZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZCBieSB0aGUKLQkgIGFwcGxpY2F0aW9uJ3MgY29kZS4KLQotCSAgVGhlIGZvbGxvd2luZyBhcmUgdGhlIGxlZ2FsIHZhbHVlcyBvZiBlbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlOgotCi0JICAgICAgamF2YS5sYW5nLkJvb2xlYW4KLQkgICAgICBqYXZhLmxhbmcuQnl0ZQotCSAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXIKLQkgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICAgICAgamF2YS5sYW5nLlNob3J0Ci0JICAgICAgamF2YS5sYW5nLkludGVnZXIKLQkgICAgICBqYXZhLmxhbmcuTG9uZwotCSAgICAgIGphdmEubGFuZy5GbG9hdAotCSAgICAgIGphdmEubGFuZy5Eb3VibGUKLQotCSAgRXhhbXBsZToKLQotCSAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuQm9vbGVhbiIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5CeXRlIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkNoYXJhY3RlciIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5TdHJpbmciLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuU2hvcnQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJqYXZhLmxhbmcuSW50ZWdlciIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImphdmEubGFuZy5Mb25nIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkZsb2F0Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iamF2YS5sYW5nLkRvdWJsZSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudi1lbnRyeVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlbnYtZW50cnlUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhbiBhcHBsaWNhdGlvbidzCi0JZW52aXJvbm1lbnQgZW50cnkuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbAotCWRlc2NyaXB0aW9uLCB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGEgdHlwZQotCShvcHRpb25hbCBpZiB0aGUgdmFsdWUgaXMgaW5qZWN0ZWQsIG90aGVyd2lzZSByZXF1aXJlZCksIGFuZAotCWFuIG9wdGlvbmFsIHZhbHVlLgotCi0JSXQgYWxzbyBpbmNsdWRlcyBvcHRpb25hbCBlbGVtZW50cyB0byBkZWZpbmUgaW5qZWN0aW9uIG9mCi0JdGhlIG5hbWVkIHJlc291cmNlIGludG8gZmllbGRzIG9yIEphdmFCZWFucyBwcm9wZXJ0aWVzLgotCi0JSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkIGFuZCBpbmplY3Rpb24gaXMgcmVxdWVzdGVkLAotCW5vIGluamVjdGlvbiB3aWxsIG9jY3VyIGFuZCBubyBlbnRyeSBvZiB0aGUgc3BlY2lmaWVkIG5hbWUKLQl3aWxsIGJlIGNyZWF0ZWQuICBUaGlzIGFsbG93cyBhbiBpbml0aWFsIHZhbHVlIHRvIGJlCi0Jc3BlY2lmaWVkIGluIHRoZSBzb3VyY2UgY29kZSB3aXRob3V0IGJlaW5nIGluY29ycmVjdGx5Ci0JY2hhbmdlZCB3aGVuIG5vIG92ZXJyaWRlIGhhcyBiZWVuIHNwZWNpZmllZC4KLQotCUlmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCBhbmQgbm8gaW5qZWN0aW9uIGlzIHJlcXVlc3RlZCwKLQlhIHZhbHVlIG11c3QgYmUgc3VwcGxpZWQgZHVyaW5nIGRlcGxveW1lbnQuCi0KLQlUaGlzIHR5cGUgaXMgdXNlZCBieSBlbnYtZW50cnkgZWxlbWVudHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnktbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmpuZGktbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCi0JICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lCi0JICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYKLQkgICAgICBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEKLQkgICAgICBEZXBsb3ltZW50IENvbXBvbmVudC4gVGhlIHVuaXF1ZW5lc3MKLQkgICAgICBjb25zdHJhaW50cyBtdXN0IGJlIGRlZmluZWQgd2l0aGluIHRoZSBkZWNsYXJlZAotCSAgICAgIGNvbnRleHQuCi0KLQkgICAgICBFeGFtcGxlOgotCi0JICAgICAgPGVudi1lbnRyeS1uYW1lPm1pbkFtb3VudDwvZW52LWVudHJ5LW5hbWU+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnktdHlwZSIKLQkJICAgdHlwZT0iamF2YWVlOmVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBlbnYtZW50cnktdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBKYXZhIGxhbmd1YWdlCi0JICAgICAgdHlwZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkuICBJZiBhbiBpbmplY3Rpb24gdGFyZ2V0Ci0JICAgICAgaXMgc3BlY2lmaWVkIGZvciB0aGUgZW52aXJvbm1lbnQgZW50cnksIHRoZSB0eXBlIG1heQotCSAgICAgIGJlIG9taXR0ZWQsIG9yIG11c3QgbWF0Y2ggdGhlIHR5cGUgb2YgdGhlIGluamVjdGlvbgotCSAgICAgIHRhcmdldC4gIElmIG5vIGluamVjdGlvbiB0YXJnZXQgaXMgc3BlY2lmaWVkLCB0aGUgdHlwZQotCSAgICAgIGlzIHJlcXVpcmVkLgotCi0JICAgICAgRXhhbXBsZToKLQotCSAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnYtZW50cnktdmFsdWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgZW52LWVudHJ5LXZhbHVlIGRlc2lnbmF0ZXMgdGhlIHZhbHVlIG9mIGEKLQkgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiBUaGUgdmFsdWUKLQkgICAgICBtdXN0IGJlIGEgU3RyaW5nIHRoYXQgaXMgdmFsaWQgZm9yIHRoZQotCSAgICAgIGNvbnN0cnVjdG9yIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0aGF0IHRha2VzIGEKLQkgICAgICBzaW5nbGUgU3RyaW5nIHBhcmFtZXRlciwgb3IgZm9yIGphdmEubGFuZy5DaGFyYWN0ZXIsCi0JICAgICAgYSBzaW5nbGUgY2hhcmFjdGVyLgotCi0JICAgICAgRXhhbXBsZToKLQotCSAgICAgIDxlbnYtZW50cnktdmFsdWU+MTAwLjAwPC9lbnYtZW50cnktdmFsdWU+Ci0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6cmVzb3VyY2VHcm91cCIvPgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVsZW1lbnRzIHRoYXQgdXNlIHRoaXMgdHlwZSBkZXNpZ25hdGUgdGhlIG5hbWUgb2YgYQotCUphdmEgY2xhc3Mgb3IgaW50ZXJmYWNlLiAgVGhlIG5hbWUgaXMgaW4gdGhlIGZvcm0gb2YgYQotCSJiaW5hcnkgbmFtZSIsIGFzIGRlZmluZWQgaW4gdGhlIEpMUy4gIFRoaXMgaXMgdGhlIGZvcm0KLQlvZiBuYW1lIHVzZWQgaW4gQ2xhc3MuZm9yTmFtZSgpLiAgVG9vbHMgdGhhdCBuZWVkIHRoZQotCWNhbm9uaWNhbCBuYW1lICh0aGUgbmFtZSB1c2VkIGluIHNvdXJjZSBjb2RlKSB3aWxsIG5lZWQKLQl0byBjb252ZXJ0IHRoaXMgYmluYXJ5IG5hbWUgdG8gdGhlIGNhbm9uaWNhbCBuYW1lLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImdlbmVyaWMtYm9vbGVhblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBkZWZpbmVzIGZvdXIgZGlmZmVyZW50IHZhbHVlcyB3aGljaCBjYW4gZGVzaWduYXRlCi0JYm9vbGVhbiB2YWx1ZXMuIFRoaXMgaW5jbHVkZXMgdmFsdWVzIHllcyBhbmQgbm8gd2hpY2ggYXJlCi0Jbm90IGRlc2lnbmF0ZWQgYnkgeHNkOmJvb2xlYW4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idHJ1ZSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZhbHNlIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ieWVzIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8iLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJob21lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgaG9tZVR5cGUgZGVmaW5lcyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YKLQkgIGFuIGVudGVycHJpc2UgYmVhbidzIGhvbWUgaW50ZXJmYWNlLgotCi0JICBFeGFtcGxlOgotCi0JICAgICAgPGhvbWU+Y29tLmFhcmR2YXJrLnBheXJvbGwuUGF5cm9sbEhvbWU8L2hvbWU+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWNvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBpY29uIHR5cGUgY29udGFpbnMgc21hbGwtaWNvbiBhbmQgbGFyZ2UtaWNvbiBlbGVtZW50cwotCXRoYXQgc3BlY2lmeSB0aGUgZmlsZSBuYW1lcyBmb3Igc21hbGwgYW5kIGxhcmdlIEdJRiwgSlBFRywKLQlvciBQTkcgaWNvbiBpbWFnZXMgdXNlZCB0byByZXByZXNlbnQgdGhlIHBhcmVudCBlbGVtZW50IGluIGEKLQlHVUkgdG9vbC4KLQotCVRoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUKLQlpY29uIGZpbGUgbmFtZXMgYXJlIHByb3ZpZGVkIGluLiBJdHMgdmFsdWUgaXMgImVuIiAoRW5nbGlzaCkKLQlieSBkZWZhdWx0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNtYWxsLWljb24iIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgIDwhW0NEQVRBWwotCi0JICAgICAgVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLQkgICAgICBjb250YWluaW5nIGEgc21hbGwgKDE2IHggMTYpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi0JICAgICAgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBEZXBsb3ltZW50Ci0JICAgICAgQ29tcG9uZW50J3MgRGVwbG95bWVudCBGaWxlLgotCi0JICAgICAgVGhlIGltYWdlIG1heSBiZSBpbiB0aGUgR0lGLCBKUEVHLCBvciBQTkcgZm9ybWF0LgotCSAgICAgIFRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCi0JICAgICAgRXhhbXBsZToKLQotCSAgICAgIDxzbWFsbC1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjE2eDE2LmpwZzwvc21hbGwtaWNvbj4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsYXJnZS1pY29uIiB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8IVtDREFUQVsKLQotCSAgICAgIFRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi0JICAgICAgY29udGFpbmluZyBhIGxhcmdlCi0JICAgICAgKDMyIHggMzIpIGljb24gaW1hZ2UuIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZQotCSAgICAgIHBhdGggd2l0aGluIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzIERlcGxveW1lbnQKLQkgICAgICBGaWxlLgotCi0JICAgICAgVGhlIGltYWdlIG1heSBiZSBpbiB0aGUgR0lGLCBKUEVHLCBvciBQTkcgZm9ybWF0LgotCSAgICAgIFRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCi0JICAgICAgRXhhbXBsZToKLQotCSAgICAgIDxsYXJnZS1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZzwvbGFyZ2UtaWNvbj4KLQotCSAgICAgIF1dPgotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLQotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5qZWN0aW9uLXRhcmdldFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCUFuIGluamVjdGlvbiB0YXJnZXQgc3BlY2lmaWVzIGEgY2xhc3MgYW5kIGEgbmFtZSB3aXRoaW4KLQl0aGF0IGNsYXNzIGludG8gd2hpY2ggYSByZXNvdXJjZSBzaG91bGQgYmUgaW5qZWN0ZWQuCi0KLQlUaGUgaW5qZWN0aW9uIHRhcmdldCBjbGFzcyBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZAotCWNsYXNzIG5hbWUgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZSBpbmplY3Rpb24uICBUaGUKLQlKYXZhIEVFIHNwZWNpZmljYXRpb25zIGRlc2NyaWJlIHdoaWNoIGNsYXNzZXMgY2FuIGJlIGFuCi0JaW5qZWN0aW9uIHRhcmdldC4KLQotCVRoZSBpbmplY3Rpb24gdGFyZ2V0IG5hbWUgc3BlY2lmaWVzIHRoZSB0YXJnZXQgd2l0aGluCi0JdGhlIHNwZWNpZmllZCBjbGFzcy4gIFRoZSB0YXJnZXQgaXMgZmlyc3QgbG9va2VkIGZvciBhcyBhCi0JSmF2YUJlYW5zIHByb3BlcnR5IG5hbWUuICBJZiBub3QgZm91bmQsIHRoZSB0YXJnZXQgaXMKLQlsb29rZWQgZm9yIGFzIGEgZmllbGQgbmFtZS4KLQotCVRoZSBzcGVjaWZpZWQgcmVzb3VyY2Ugd2lsbCBiZSBpbmplY3RlZCBpbnRvIHRoZSB0YXJnZXQKLQlkdXJpbmcgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNsYXNzIGJ5IGVpdGhlciBjYWxsaW5nIHRoZQotCXNldCBtZXRob2QgZm9yIHRoZSB0YXJnZXQgcHJvcGVydHkgb3IgYnkgc2V0dGluZyBhIHZhbHVlCi0JaW50byB0aGUgbmFtZWQgZmllbGQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluamVjdGlvbi10YXJnZXQtY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5qZWN0aW9uLXRhcmdldC1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamF2YS1pZGVudGlmaWVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGphdmEtaWRlbnRpZmllclR5cGUgZGVmaW5lcyBhIEphdmEgaWRlbnRpZmllci4KLQlUaGUgdXNlcnMgb2YgdGhpcyB0eXBlIHNob3VsZCBmdXJ0aGVyIHZlcmlmeSB0aGF0Ci0JdGhlIGNvbnRlbnQgZG9lcyBub3QgY29udGFpbiBKYXZhIHJlc2VydmVkIGtleXdvcmRzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOnBhdHRlcm4gdmFsdWU9IigkfF98XHB7TH0pKFxwe0x9fFxwe05kfXxffCQpKiIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImphdmEtdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgaXMgYSBnZW5lcmljIHR5cGUgdGhhdCBkZXNpZ25hdGVzIGEgSmF2YSBwcmltaXRpdmUKLQl0eXBlIG9yIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGludGVyZmFjZS90eXBlLAotCW9yIGFuIGFycmF5IG9mIHN1Y2ggdHlwZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6cGF0dGVybiB2YWx1ZT0iW15ccHtafV0qIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam5kaS1uYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGpuZGktbmFtZVR5cGUgdHlwZSBkZXNpZ25hdGVzIGEgSk5ESSBuYW1lIGluIHRoZQotCURlcGxveW1lbnQgQ29tcG9uZW50J3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCWphdmE6Y29tcC9lbnYgY29udGV4dC4gIEEgSk5ESSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUKLQlEZXBsb3ltZW50IENvbXBvbmVudC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpncm91cCBuYW1lPSJqbmRpRW52aXJvbm1lbnRSZWZzR3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgZ3JvdXAga2VlcHMgdGhlIHVzYWdlIG9mIHRoZSBjb250YWluZWQgSk5ESSBlbnZpcm9ubWVudAotCXJlZmVyZW5jZSBlbGVtZW50cyBjb25zaXN0ZW50IGFjcm9zcyBKYXZhIEVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudi1lbnRyeSIKLQkJICAgdHlwZT0iamF2YWVlOmVudi1lbnRyeVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamItbG9jYWwtcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6ZWpiLWxvY2FsLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6c2VydmljZS1yZWZHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLXJlZiIKLQkJICAgdHlwZT0iamF2YWVlOnJlc291cmNlLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIKLQkJICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLWNvbnRleHQtcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6cGVyc2lzdGVuY2UtY29udGV4dC1yZWZUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1yZWYiCi0JCSAgIHR5cGU9ImphdmFlZTpwZXJzaXN0ZW5jZS11bml0LXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWNvbnN0cnVjdCIKLQkJICAgdHlwZT0iamF2YWVlOmxpZmVjeWNsZS1jYWxsYmFja1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtZGVzdHJveSIKLQkJICAgdHlwZT0iamF2YWVlOmxpZmVjeWNsZS1jYWxsYmFja1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxpZmVjeWNsZS1jYWxsYmFja1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsaWZlY3ljbGUtY2FsbGJhY2sgdHlwZSBzcGVjaWZpZXMgYSBtZXRob2Qgb24gYQotCWNsYXNzIHRvIGJlIGNhbGxlZCB3aGVuIGEgbGlmZWN5Y2xlIGV2ZW50IG9jY3Vycy4KLQlOb3RlIHRoYXQgZWFjaCBjbGFzcyBtYXkgaGF2ZSBvbmx5IG9uZSBsaWZlY3ljbGUgY2FsbGJhY2sKLSAgICAgICAgbWV0aG9kIGZvciBhbnkgZ2l2ZW4gZXZlbnQgYW5kIHRoYXQgdGhlIG1ldGhvZCBtYXkgbm90Ci0JYmUgb3ZlcmxvYWRlZC4KLQotICAgICAgICBJZiB0aGUgbGlmZWZ5Y2xlLWNhbGxiYWNrLWNsYXNzIGVsZW1lbnQgaXMgbWlzc2luZyB0aGVuCi0gICAgICAgIHRoZSBjbGFzcyBkZWZpbmluZyB0aGUgY2FsbGJhY2sgaXMgYXNzdW1lZCB0byBiZSB0aGUKLSAgICAgICAgY29tcG9uZW50IGNsYXNzIGluIHNjb3BlIGF0IHRoZSBwbGFjZSBpbiB0aGUgZGVzY3JpcHRvcgotICAgICAgICBpbiB3aGljaCB0aGUgY2FsbGJhY2sgZGVmaW5pdGlvbiBhcHBlYXJzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaWZlY3ljbGUtY2FsbGJhY2stY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpZmVjeWNsZS1jYWxsYmFjay1tZXRob2QiCi0JCSAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsaXN0ZW5lclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsaXN0ZW5lclR5cGUgaW5kaWNhdGVzIHRoZSBkZXBsb3ltZW50IHByb3BlcnRpZXMgZm9yIGEgd2ViCi0JYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxpc3RlbmVyLWNsYXNzIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBsaXN0ZW5lci1jbGFzcyBlbGVtZW50IGRlY2xhcmVzIGEgY2xhc3MgaW4gdGhlCi0JICAgIGFwcGxpY2F0aW9uIG11c3QgYmUgcmVnaXN0ZXJlZCBhcyBhIHdlYgotCSAgICBhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLiBUaGUgdmFsdWUgaXMgdGhlIGZ1bGx5Ci0JICAgIHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGxpc3RlbmVyIGNsYXNzLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsLWhvbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbG9jYWwtaG9tZVR5cGUgZGVmaW5lcyB0aGUgZnVsbHktcXVhbGlmaWVkCi0JbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBob21lIGludGVyZmFjZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbG9jYWxUeXBlIGRlZmluZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGFuCi0JZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaW50ZXJmYWNlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rVHlwZSBpcyB1c2VkIHRvIGxpbmsgYSBtZXNzYWdlCi0JZGVzdGluYXRpb24gcmVmZXJlbmNlIG9yIG1lc3NhZ2UtZHJpdmVuIGJlYW4gdG8gYSBtZXNzYWdlCi0JZGVzdGluYXRpb24uCi0KLQlUaGUgQXNzZW1ibGVyIHNldHMgdGhlIHZhbHVlIHRvIHJlZmxlY3QgdGhlIGZsb3cgb2YgbWVzc2FnZXMKLQliZXR3ZWVuIHByb2R1Y2VycyBhbmQgY29uc3VtZXJzIGluIHRoZSBhcHBsaWNhdGlvbi4KLQotCVRoZSB2YWx1ZSBtdXN0IGJlIHRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUgb2YgYSBtZXNzYWdlCi0JZGVzdGluYXRpb24gaW4gdGhlIHNhbWUgRGVwbG95bWVudCBGaWxlIG9yIGluIGFub3RoZXIKLQlEZXBsb3ltZW50IEZpbGUgaW4gdGhlIHNhbWUgSmF2YSBFRSBhcHBsaWNhdGlvbiB1bml0LgotCi0JQWx0ZXJuYXRpdmVseSwgdGhlIHZhbHVlIG1heSBiZSBjb21wb3NlZCBvZiBhIHBhdGggbmFtZQotCXNwZWNpZnlpbmcgYSBEZXBsb3ltZW50IEZpbGUgY29udGFpbmluZyB0aGUgcmVmZXJlbmNlZAotCW1lc3NhZ2UgZGVzdGluYXRpb24gd2l0aCB0aGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIG9mIHRoZQotCWRlc3RpbmF0aW9uIGFwcGVuZGVkIGFuZCBzZXBhcmF0ZWQgZnJvbSB0aGUgcGF0aCBuYW1lIGJ5Ci0JIiMiLiBUaGUgcGF0aCBuYW1lIGlzIHJlbGF0aXZlIHRvIHRoZSBEZXBsb3ltZW50IEZpbGUKLQljb250YWluaW5nIERlcGxveW1lbnQgQ29tcG9uZW50IHRoYXQgaXMgcmVmZXJlbmNpbmcgdGhlCi0JbWVzc2FnZSBkZXN0aW5hdGlvbi4gIFRoaXMgYWxsb3dzIG11bHRpcGxlIG1lc3NhZ2UKLQlkZXN0aW5hdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIHRvIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24KLQkgIG9mIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGEgbWVzc2FnZSBkZXN0aW5hdGlvbgotCSAgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gRGVwbG95bWVudCBDb21wb25lbnQncwotCSAgZW52aXJvbm1lbnQuIEl0IGNvbnNpc3RzIG9mOgotCi0JCSAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCQkgIC0gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUKLQkJICAtIGFuIG9wdGlvbmFsIG1lc3NhZ2UgZGVzdGluYXRpb24gdHlwZQotCQkgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBhcyB0byB3aGV0aGVyCi0JCSAgICB0aGUgZGVzdGluYXRpb24gaXMgdXNlZCBmb3IKLQkJICAgIGNvbnN1bWluZyBvciBwcm9kdWNpbmcgbWVzc2FnZXMsIG9yIGJvdGguCi0JCSAgICBpZiBub3Qgc3BlY2lmaWVkLCAiYm90aCIgaXMgYXNzdW1lZC4KLQkJICAtIGFuIG9wdGlvbmFsIGxpbmsgdG8gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24KLQkJICAtIG9wdGlvbmFsIGluamVjdGlvbiB0YXJnZXRzCi0KLQkgIFRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHR5cGUgbXVzdCBiZSBzdXBwbGllZCB1bmxlc3MgYW4KLQkgIGluamVjdGlvbiB0YXJnZXQgaXMgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIHRoZSB0eXBlCi0JICBvZiB0aGUgdGFyZ2V0IGlzIHVzZWQuICBJZiBib3RoIGFyZSBzcGVjaWZpZWQsIHRoZSB0eXBlCi0JICBtdXN0IGJlIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlIG9mIHRoZSBpbmplY3Rpb24KLQkgIHRhcmdldC4KLQotCSAgRXhhbXBsZXM6Ci0KLQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZj4KLQkJICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZQotCQkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZT4KLQkJICA8bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5RdWV1ZQotCQkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPgotCQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlPkNvbnN1bWVzCi0JCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlPgotCQkgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbms+Q29ycG9yYXRlU3RvY2tzCi0JCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLWxpbms+Ci0JICA8L21lc3NhZ2UtZGVzdGluYXRpb24tcmVmPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmpuZGktbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcwotCSAgICB0aGUgbmFtZSBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMKLQkgICAgdmFsdWUgaXMgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotCSAgICBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUKLQkgICAgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZQotCSAgICB1bmlxdWUgd2l0aGluIGFuIGVqYi1qYXIgKGZvciBlbnRlcnByaXNlIGJlYW5zKSBvciBhCi0JICAgIERlcGxveW1lbnQgRmlsZSAoZm9yIG90aGVycykuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlIgotCQkgICB0eXBlPSJqYXZhZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZSIKLQkJICAgdHlwZT0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsiCi0JCSAgIHR5cGU9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLQotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpyZXNvdXJjZUdyb3VwIi8+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUgc3BlY2lmaWVzIHRoZSB0eXBlIG9mCi0JICB0aGUgZGVzdGluYXRpb24uIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgSmF2YSBpbnRlcmZhY2UKLQkgIGV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkZXN0aW5hdGlvbi4KLQotCSAgRXhhbXBsZToKLQotCSAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5RdWV1ZQotCSAgICA8L21lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIHNwZWNpZmllcyB0aGUgdXNlIG9mIHRoZQotCW1lc3NhZ2UgZGVzdGluYXRpb24gaW5kaWNhdGVkIGJ5IHRoZSByZWZlcmVuY2UuICBUaGUgdmFsdWUKLQlpbmRpY2F0ZXMgd2hldGhlciBtZXNzYWdlcyBhcmUgY29uc3VtZWQgZnJvbSB0aGUgbWVzc2FnZQotCWRlc3RpbmF0aW9uLCBwcm9kdWNlZCBmb3IgdGhlIGRlc3RpbmF0aW9uLCBvciBib3RoLiAgVGhlCi0JQXNzZW1ibGVyIG1ha2VzIHVzZSBvZiB0aGlzIGluZm9ybWF0aW9uIGluIGxpbmtpbmcgcHJvZHVjZXJzCi0Jb2YgYSBkZXN0aW5hdGlvbiB3aXRoIGl0cyBjb25zdW1lcnMuCi0KLQlUaGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2UgZWxlbWVudCBtdXN0IGJlCi0Jb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JICAgIENvbnN1bWVzCi0JICAgIFByb2R1Y2VzCi0JICAgIENvbnN1bWVzUHJvZHVjZXMKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29uc3VtZXMiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQcm9kdWNlcyIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNvbnN1bWVzUHJvZHVjZXMiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvblR5cGUgc3BlY2lmaWVzIGEgbWVzc2FnZQotCSAgZGVzdGluYXRpb24uIFRoZSBsb2dpY2FsIGRlc3RpbmF0aW9uIGRlc2NyaWJlZCBieSB0aGlzCi0JICBlbGVtZW50IGlzIG1hcHBlZCB0byBhIHBoeXNpY2FsIGRlc3RpbmF0aW9uIGJ5IHRoZSBEZXBsb3llci4KLQotCSAgVGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gZWxlbWVudCBjb250YWluczoKLQotCQkgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQkJICAtIGFuIG9wdGlvbmFsIGRpc3BsYXktbmFtZQotCQkgIC0gYW4gb3B0aW9uYWwgaWNvbgotCQkgIC0gYSBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWUgd2hpY2ggbXVzdCBiZSB1bmlxdWUKLQkJICAgIGFtb25nIG1lc3NhZ2UgZGVzdGluYXRpb24gbmFtZXMgd2l0aGluIHRoZSBzYW1lCi0JCSAgICBEZXBsb3ltZW50IEZpbGUuCi0JCSAgLSBhbiBvcHRpb25hbCBtYXBwZWQgbmFtZQotCi0JICBFeGFtcGxlOgotCi0JICA8bWVzc2FnZS1kZXN0aW5hdGlvbj4KLQkJICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lPkNvcnBvcmF0ZVN0b2NrcwotCQkgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lPgotCSAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhCi0JICAgIG5hbWUgZm9yIGEgbWVzc2FnZSBkZXN0aW5hdGlvbi4gIFRoaXMgbmFtZSBtdXN0IGJlCi0JICAgIHVuaXF1ZSBhbW9uZyB0aGUgbmFtZXMgb2YgbWVzc2FnZSBkZXN0aW5hdGlvbnMKLQkgICAgd2l0aGluIHRoZSBEZXBsb3ltZW50IEZpbGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBBIHByb2R1Y3Qgc3BlY2lmaWMgbmFtZSB0aGF0IHRoaXMgbWVzc2FnZSBkZXN0aW5hdGlvbgotCSAgICAgIHNob3VsZCBiZSBtYXBwZWQgdG8uICBFYWNoIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmCi0JICAgICAgZWxlbWVudCB0aGF0IHJlZmVyZW5jZXMgdGhpcyBtZXNzYWdlIGRlc3RpbmF0aW9uIHdpbGwKLQkgICAgICBkZWZpbmUgYSBuYW1lIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIHJlZmVyZW5jaW5nCi0JICAgICAgY29tcG9uZW50LiAgKEl0J3MgYSBuYW1lIGluIHRoZSBKTkRJIGphdmE6Y29tcC9lbnYKLQkgICAgICBuYW1lc3BhY2UuKSAgTWFueSBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHByb3ZpZGUgYSB3YXkgdG8KLQkgICAgICBtYXAgdGhlc2UgbG9jYWwgbmFtZXMgdG8gbmFtZXMgb2YgcmVzb3VyY2VzIGtub3duIHRvIHRoZQotCSAgICAgIGFwcGxpY2F0aW9uIHNlcnZlci4gIFRoaXMgbWFwcGVkIG5hbWUgaXMgb2Z0ZW4gYSBnbG9iYWwKLQkgICAgICBKTkRJIG5hbWUsIGJ1dCBtYXkgYmUgYSBuYW1lIG9mIGFueSBmb3JtLiAgRWFjaCBvZiB0aGUKLQkgICAgICBsb2NhbCBuYW1lcyBzaG91bGQgYmUgbWFwcGVkIHRvIHRoaXMgc2FtZSBnbG9iYWwgbmFtZS4KLQotCSAgICAgIEFwcGxpY2F0aW9uIHNlcnZlcnMgYXJlIG5vdCByZXF1aXJlZCB0byBzdXBwb3J0IGFueQotCSAgICAgIHBhcnRpY3VsYXIgZm9ybSBvciB0eXBlIG9mIG1hcHBlZCBuYW1lLCBub3IgdGhlIGFiaWxpdHkKLQkgICAgICB0byB1c2UgbWFwcGVkIG5hbWVzLiAgVGhlIG1hcHBlZCBuYW1lIGlzCi0JICAgICAgcHJvZHVjdC1kZXBlbmRlbnQgYW5kIG9mdGVuIGluc3RhbGxhdGlvbi1kZXBlbmRlbnQuICBObwotCSAgICAgIHVzZSBvZiBhIG1hcHBlZCBuYW1lIGlzIHBvcnRhYmxlLgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhcmFtLXZhbHVlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGlzIGEgZ2VuZXJhbCB0eXBlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVjbGFyZQotCXBhcmFtZXRlci92YWx1ZSBsaXN0cy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgICAgcGFyYW1ldGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0tdmFsdWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEKLQkgICAgcGFyYW1ldGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhdGhUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZWxlbWVudHMgdGhhdCB1c2UgdGhpcyB0eXBlIGRlc2lnbmF0ZSBlaXRoZXIgYSByZWxhdGl2ZQotCXBhdGggb3IgYW4gYWJzb2x1dGUgcGF0aCBzdGFydGluZyB3aXRoIGEgIi8iLgotCi0JSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIERlcGxveW1lbnQgRmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLQlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLQl0aGUgRGVwbG95bWVudCBGaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLAotCXRob3NlIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YKLQl0aGUgRGVwbG95bWVudCBGaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMKLQlhcmUgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtY29udGV4dC1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSBwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24KLQkgIG9mIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGEgcGVyc2lzdGVuY2UgY29udGV4dAotCSAgYXNzb2NpYXRlZCB3aXRoaW4gYSBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0JICBlbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2Y6Ci0KLQkJICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JCSAgLSB0aGUgcGVyc2lzdGVuY2UgY29udGV4dCByZWZlcmVuY2UgbmFtZQotCQkgIC0gYW4gb3B0aW9uYWwgcGVyc2lzdGVuY2UgdW5pdCBuYW1lLiAgSWYgbm90IHNwZWNpZmllZCwKLSAgICAgICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgcGVyc2lzdGVuY2UgdW5pdCBpcyBhc3N1bWVkLgotCQkgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBhcyB0byB3aGV0aGVyCi0JCSAgICB0aGUgcGVyc2lzdGVuY2UgY29udGV4dCB0eXBlIGlzIFRyYW5zYWN0aW9uIG9yCi0JCSAgICBFeHRlbmRlZC4gIElmIG5vdCBzcGVjaWZpZWQsIFRyYW5zYWN0aW9uIGlzIGFzc3VtZWQuCi0gICAgICAgICAgICAgICAgICAtIGFuIG9wdGlvbmFsIGxpc3Qgb2YgcGVyc2lzdGVuY2UgcHJvcGVydGllcwotCQkgIC0gb3B0aW9uYWwgaW5qZWN0aW9uIHRhcmdldHMKLQotCSAgRXhhbXBsZXM6Ci0KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZj4KLSAgICAgICAgICAgICAgPHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWU+bXlQZXJzaXN0ZW5jZUNvbnRleHQKLSAgICAgICAgICAgICAgPC9wZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lPgotICAgICAgICAgICAgPC9wZXJzaXN0ZW5jZS1jb250ZXh0LXJlZj4KLQotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmPgotICAgICAgICAgICAgICA8cGVyc2lzdGVuY2UtY29udGV4dC1yZWYtbmFtZT5teVBlcnNpc3RlbmNlQ29udGV4dAotICAgICAgICAgICAgICAgIDwvcGVyc2lzdGVuY2UtY29udGV4dC1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXVuaXQtbmFtZT5QZXJzaXN0ZW5jZVVuaXQxCi0gICAgICAgICAgICAgICAgPC9wZXJzaXN0ZW5jZS11bml0LW5hbWU+Ci0gICAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGU+RXh0ZW5kZWQ8L3BlcnNpc3RlbmNlLWNvbnRleHQtdHlwZT4KLSAgICAgICAgICAgIDwvcGVyc2lzdGVuY2UtY29udGV4dC1yZWY+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6am5kaS1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzCi0JICAgIHRoZSBuYW1lIG9mIGEgcGVyc2lzdGVuY2UgY29udGV4dCByZWZlcmVuY2U7IGl0cwotCSAgICB2YWx1ZSBpcyB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluCi0JICAgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZQotCSAgICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLQkJICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgQXBwbGljYXRpb24gQXNzZW1ibGVyKG9yIEJlYW5Qcm92aWRlcikgbWF5IHVzZSB0aGUKLSAgICAgICAgICAgIGZvbGxvd2luZyBzeW50YXggdG8gYXZvaWQgdGhlIG5lZWQgdG8gcmVuYW1lIHBlcnNpc3RlbmNlCi0gICAgICAgICAgICB1bml0cyB0byBoYXZlIHVuaXF1ZSBuYW1lcyB3aXRoaW4gYSBKYXZhIEVFIGFwcGxpY2F0aW9uLgotCi0gICAgICAgICAgICBUaGUgQXBwbGljYXRpb24gQXNzZW1ibGVyIHNwZWNpZmllcyB0aGUgcGF0aG5hbWUgb2YgdGhlCi0gICAgICAgICAgICByb290IG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSBmb3IgdGhlIHJlZmVyZW5jZWQKLSAgICAgICAgICAgIHBlcnNpc3RlbmNlIHVuaXQgYW5kIGFwcGVuZHMgdGhlIG5hbWUgb2YgdGhlIHBlcnNpc3RlbmNlCi0gICAgICAgICAgICB1bml0IHNlcGFyYXRlZCBmcm9tIHRoZSBwYXRobmFtZSBieSAjLiBUaGUgcGF0aG5hbWUgaXMKLSAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSByZWZlcmVuY2luZyBhcHBsaWNhdGlvbiBjb21wb25lbnQgamFyIGZpbGUuCi0gICAgICAgICAgICBJbiB0aGlzIG1hbm5lciwgbXVsdGlwbGUgcGVyc2lzdGVuY2UgdW5pdHMgd2l0aCB0aGUgc2FtZQotICAgICAgICAgICAgcGVyc2lzdGVuY2UgdW5pdCBuYW1lIG1heSBiZSB1bmlxdWVseSBpZGVudGlmaWVkIHdoZW4gdGhlCi0gICAgICAgICAgICBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgY2Fubm90IGNoYW5nZSBwZXJzaXN0ZW5jZSB1bml0IG5hbWVzLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtY29udGV4dC10eXBlIgotCQkgICB0eXBlPSJqYXZhZWU6cGVyc2lzdGVuY2UtY29udGV4dC10eXBlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS1wcm9wZXJ0eSIKLQkJICAgdHlwZT0iamF2YWVlOnByb3BlcnR5VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVXNlZCB0byBzcGVjaWZ5IHByb3BlcnRpZXMgZm9yIHRoZSBjb250YWluZXIgb3IgcGVyc2lzdGVuY2UKLSAgICAgICAgICAgIHByb3ZpZGVyLiAgVmVuZG9yLXNwZWNpZmljIHByb3BlcnRpZXMgbWF5IGJlIGluY2x1ZGVkIGluCi0gICAgICAgICAgICB0aGUgc2V0IG9mIHByb3BlcnRpZXMuICBQcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdCByZWNvZ25pemVkCi0gICAgICAgICAgICBieSBhIHZlbmRvciBtdXN0IGJlIGlnbm9yZWQuICBFbnRyaWVzIHRoYXQgbWFrZSB1c2Ugb2YgdGhlCi0gICAgICAgICAgICBuYW1lc3BhY2UgamF2YXgucGVyc2lzdGVuY2UgYW5kIGl0cyBzdWJuYW1lc3BhY2VzIG11c3Qgbm90Ci0gICAgICAgICAgICBiZSB1c2VkIGZvciB2ZW5kb3Itc3BlY2lmaWMgcHJvcGVydGllcy4gIFRoZSBuYW1lc3BhY2UKLSAgICAgICAgICAgIGphdmF4LnBlcnNpc3RlbmNlIGlzIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIHNwZWNpZmljYXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6cmVzb3VyY2VHcm91cCIvPgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotCi0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcGVyc2lzdGVuY2UtY29udGV4dC10eXBlVHlwZSBzcGVjaWZpZXMgdGhlIHRyYW5zYWN0aW9uYWwKLQluYXR1cmUgb2YgYSBwZXJzaXN0ZW5jZSBjb250ZXh0IHJlZmVyZW5jZS4KLQotCVRoZSB2YWx1ZSBvZiB0aGUgcGVyc2lzdGVuY2UtY29udGV4dC10eXBlIGVsZW1lbnQgbXVzdCBiZQotCW9uZSBvZiB0aGUgZm9sbG93aW5nOgotCSAgICBUcmFuc2FjdGlvbgotICAgICAgICAgICAgRXh0ZW5kZWQKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVHJhbnNhY3Rpb24iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFeHRlbmRlZCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCTwhW0NEQVRBWwotCi0JICBUaGUgcGVyc2lzdGVuY2UtdW5pdC1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uCi0JICBvZiBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhIHBlcnNpc3RlbmNlIHVuaXQKLQkgIGFzc29jaWF0ZWQgd2l0aGluIGEgRGVwbG95bWVudCBDb21wb25lbnQncwotCSAgZW52aXJvbm1lbnQuIEl0IGNvbnNpc3RzIG9mOgotCi0JCSAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotCQkgIC0gdGhlIHBlcnNpc3RlbmNlIHVuaXQgcmVmZXJlbmNlIG5hbWUKLQkJICAtIGFuIG9wdGlvbmFsIHBlcnNpc3RlbmNlIHVuaXQgbmFtZS4gIElmIG5vdCBzcGVjaWZpZWQsCi0gICAgICAgICAgICAgICAgICAgIHRoZSBkZWZhdWx0IHBlcnNpc3RlbmNlIHVuaXQgaXMgYXNzdW1lZC4KLQkJICAtIG9wdGlvbmFsIGluamVjdGlvbiB0YXJnZXRzCi0KLQkgIEV4YW1wbGVzOgotCi0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdW5pdC1yZWY+Ci0gICAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lPm15UGVyc2lzdGVuY2VVbml0Ci0gICAgICAgICAgICAgIDwvcGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZT4KLSAgICAgICAgICAgIDwvcGVyc2lzdGVuY2UtdW5pdC1yZWY+Ci0KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS11bml0LXJlZj4KLSAgICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWU+bXlQZXJzaXN0ZW5jZVVuaXQKLSAgICAgICAgICAgICAgICA8L3BlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS11bml0LW5hbWU+UGVyc2lzdGVuY2VVbml0MQotICAgICAgICAgICAgICAgIDwvcGVyc2lzdGVuY2UtdW5pdC1uYW1lPgotICAgICAgICAgICAgPC9wZXJzaXN0ZW5jZS11bml0LXJlZj4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpqbmRpLW5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMKLQkgICAgdGhlIG5hbWUgb2YgYSBwZXJzaXN0ZW5jZSB1bml0IHJlZmVyZW5jZTsgaXRzCi0JICAgIHZhbHVlIGlzIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KLQkgICAgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lCi0JICAgIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgIFRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIob3IgQmVhblByb3ZpZGVyKSBtYXkgdXNlIHRoZQotICAgICAgICAgICAgZm9sbG93aW5nIHN5bnRheCB0byBhdm9pZCB0aGUgbmVlZCB0byByZW5hbWUgcGVyc2lzdGVuY2UKLSAgICAgICAgICAgIHVuaXRzIHRvIGhhdmUgdW5pcXVlIG5hbWVzIHdpdGhpbiBhIEphdmEgRUUgYXBwbGljYXRpb24uCi0KLSAgICAgICAgICAgIFRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgc3BlY2lmaWVzIHRoZSBwYXRobmFtZSBvZiB0aGUKLSAgICAgICAgICAgIHJvb3Qgb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIGZvciB0aGUgcmVmZXJlbmNlZAotICAgICAgICAgICAgcGVyc2lzdGVuY2UgdW5pdCBhbmQgYXBwZW5kcyB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UKLSAgICAgICAgICAgIHVuaXQgc2VwYXJhdGVkIGZyb20gdGhlIHBhdGhuYW1lIGJ5ICMuIFRoZSBwYXRobmFtZSBpcwotICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIHJlZmVyZW5jaW5nIGFwcGxpY2F0aW9uIGNvbXBvbmVudCBqYXIgZmlsZS4KLSAgICAgICAgICAgIEluIHRoaXMgbWFubmVyLCBtdWx0aXBsZSBwZXJzaXN0ZW5jZSB1bml0cyB3aXRoIHRoZSBzYW1lCi0gICAgICAgICAgICBwZXJzaXN0ZW5jZSB1bml0IG5hbWUgbWF5IGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQgd2hlbiB0aGUKLSAgICAgICAgICAgIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBjYW5ub3QgY2hhbmdlIHBlcnNpc3RlbmNlIHVuaXQgbmFtZXMuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6cmVzb3VyY2VHcm91cCIvPgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotCi0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVNwZWNpZmllcyBhIG5hbWUvdmFsdWUgcGFpci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSI+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIgotCQkgICB0eXBlPSJqYXZhZWU6eHNkU3RyaW5nVHlwZSI+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbW90ZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIHJlbW90ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZQotCSAgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgICAgICA8cmVtb3RlPmNvbS53b21iYXQuZW1wbC5FbXBsb3llZVNlcnZpY2U8L3JlbW90ZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXMtYXV0aFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSByZXMtYXV0aFR5cGUgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50Ci0JY29kZSBzaWducyBvbiBwcm9ncmFtbWF0aWNhbGx5IHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyLCBvcgotCXdoZXRoZXIgdGhlIENvbnRhaW5lciB3aWxsIHNpZ24gb24gdG8gdGhlIHJlc291cmNlIG1hbmFnZXIKLQlvbiBiZWhhbGYgb2YgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50LiBJbiB0aGUgbGF0dGVyIGNhc2UsCi0JdGhlIENvbnRhaW5lciB1c2VzIGluZm9ybWF0aW9uIHRoYXQgaXMgc3VwcGxpZWQgYnkgdGhlCi0JRGVwbG95ZXIuCi0KLQlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0KLQkgICAgQXBwbGljYXRpb24KLQkgICAgQ29udGFpbmVyCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udGFpbmVyIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVzLXNoYXJpbmctc2NvcGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgcmVzLXNoYXJpbmctc2NvcGUgdHlwZSBzcGVjaWZpZXMgd2hldGhlciBjb25uZWN0aW9ucwotCW9idGFpbmVkIHRocm91Z2ggdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbgotCWZhY3RvcnkgcmVmZXJlbmNlIGNhbiBiZSBzaGFyZWQuIFRoZSB2YWx1ZSwgaWYgc3BlY2lmaWVkLAotCW11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JICAgIFNoYXJlYWJsZQotCSAgICBVbnNoYXJlYWJsZQotCi0JVGhlIGRlZmF1bHQgdmFsdWUgaXMgU2hhcmVhYmxlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTaGFyZWFibGUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJVbnNoYXJlYWJsZSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlLWVudi1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSByZXNvdXJjZS1lbnYtcmVmVHlwZSBpcyB1c2VkIHRvIGRlZmluZQotCSAgcmVzb3VyY2UtZW52LXR5cGUgZWxlbWVudHMuICBJdCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEKLQkgIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QKLQkgIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzCi0JICBlbnZpcm9ubWVudC4gIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUKLQkgIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSBuYW1lLCBhbmQgYW4gb3B0aW9uYWwKLQkgIGluZGljYXRpb24gb2YgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSB0eXBlCi0JICBleHBlY3RlZCBieSB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4KLQotCSAgSXQgYWxzbyBpbmNsdWRlcyBvcHRpb25hbCBlbGVtZW50cyB0byBkZWZpbmUgaW5qZWN0aW9uIG9mCi0JICB0aGUgbmFtZWQgcmVzb3VyY2UgaW50byBmaWVsZHMgb3IgSmF2YUJlYW5zIHByb3BlcnRpZXMuCi0KLQkgIFRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCB0eXBlIG11c3QgYmUgc3VwcGxpZWQgdW5sZXNzIGFuCi0JICBpbmplY3Rpb24gdGFyZ2V0IGlzIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSB0aGUgdHlwZQotCSAgb2YgdGhlIHRhcmdldCBpcyB1c2VkLiAgSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGUgdHlwZQotCSAgbXVzdCBiZSBhc3NpZ25tZW50IGNvbXBhdGlibGUgd2l0aCB0aGUgdHlwZSBvZiB0aGUgaW5qZWN0aW9uCi0JICB0YXJnZXQuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxyZXNvdXJjZS1lbnYtcmVmPgotCSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+am1zL1N0b2NrUXVldWUKLQkgICAgICA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLQkgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmF4Lmptcy5RdWV1ZQotCSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotCSAgPC9yZXNvdXJjZS1lbnYtcmVmPgotCi0JICBdXT4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZS1lbnYtcmVmLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpqbmRpLW5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQotCSAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0JICAgIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KLQkgICAgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkKLQkgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0Ci0JICAgIGJlIHVuaXF1ZSB3aXRoaW4gYSBEZXBsb3ltZW50IENvbXBvbmVudC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlc291cmNlLWVudi1yZWYtdHlwZSIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUKLQkgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UuICBJdCBpcyB0aGUKLQkgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGxhbmd1YWdlIGNsYXNzIG9yCi0JICAgIGludGVyZmFjZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpyZXNvdXJjZUdyb3VwIi8+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXNvdXJjZS1yZWZUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JPCFbQ0RBVEFbCi0KLQkgIFRoZSByZXNvdXJjZS1yZWZUeXBlIGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYQotCSAgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2UuIEl0Ci0JICBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIG1hbmFnZXIKLQkgIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwgYW4gb3B0aW9uYWwgaW5kaWNhdGlvbiBvZgotCSAgdGhlIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHR5cGUgZXhwZWN0ZWQgYnkgdGhlCi0JICBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLCBhbiBvcHRpb25hbCB0eXBlIG9mIGF1dGhlbnRpY2F0aW9uCi0JICAoQXBwbGljYXRpb24gb3IgQ29udGFpbmVyKSwgYW5kIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YKLQkgIHRoZSBzaGFyZWFiaWxpdHkgb2YgY29ubmVjdGlvbnMgb2J0YWluZWQgZnJvbSB0aGUgcmVzb3VyY2UKLQkgIChTaGFyZWFibGUgb3IgVW5zaGFyZWFibGUpLgotCi0JICBJdCBhbHNvIGluY2x1ZGVzIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YKLQkgIHRoZSBuYW1lZCByZXNvdXJjZSBpbnRvIGZpZWxkcyBvciBKYXZhQmVhbnMgcHJvcGVydGllcy4KLQotCSAgVGhlIGNvbm5lY3Rpb24gZmFjdG9yeSB0eXBlIG11c3QgYmUgc3VwcGxpZWQgdW5sZXNzIGFuCi0JICBpbmplY3Rpb24gdGFyZ2V0IGlzIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSB0aGUgdHlwZQotCSAgb2YgdGhlIHRhcmdldCBpcyB1c2VkLiAgSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGUgdHlwZQotCSAgbXVzdCBiZSBhc3NpZ25tZW50IGNvbXBhdGlibGUgd2l0aCB0aGUgdHlwZSBvZiB0aGUgaW5qZWN0aW9uCi0JICB0YXJnZXQuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgIDxyZXNvdXJjZS1yZWY+Ci0JICAgICAgPHJlcy1yZWYtbmFtZT5qZGJjL0VtcGxveWVlQXBwREI8L3Jlcy1yZWYtbmFtZT4KLQkgICAgICA8cmVzLXR5cGU+amF2YXguc3FsLkRhdGFTb3VyY2U8L3Jlcy10eXBlPgotCSAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotCSAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotCSAgPC9yZXNvdXJjZS1yZWY+Ci0KLQkgIF1dPgotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy1yZWYtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmpuZGktbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLQkgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLgotCSAgICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLQkgICAgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBEZXBsb3ltZW50IEZpbGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXMtdHlwZSIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByZXMtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgZGF0YQotCSAgICBzb3VyY2UuIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgZnVsbHkgcXVhbGlmaWVkCi0JICAgIEphdmEgbGFuZ3VhZ2UgY2xhc3Mgb3IgaW50ZXJmYWNlCi0JICAgIGV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkYXRhIHNvdXJjZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy1hdXRoIgotCQkgICB0eXBlPSJqYXZhZWU6cmVzLWF1dGhUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcy1zaGFyaW5nLXNjb3BlIgotCQkgICB0eXBlPSJqYXZhZWU6cmVzLXNoYXJpbmctc2NvcGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLQotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpyZXNvdXJjZUdyb3VwIi8+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpncm91cCBuYW1lPSJyZXNvdXJjZUdyb3VwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIGdyb3VwIGNvbGxlY3RzIGVsZW1lbnRzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgdGhlCi0JSk5ESSByZXNvdXJjZSBlbGVtZW50cy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBBIHByb2R1Y3Qgc3BlY2lmaWMgbmFtZSB0aGF0IHRoaXMgcmVzb3VyY2Ugc2hvdWxkIGJlCi0JICAgICAgbWFwcGVkIHRvLiAgVGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZSwgYXMgZGVmaW5lZCBieSB0aGUKLQkgICAgICByZXNvdXJjZSdzIG5hbWUgZWxlbWVudCBvciBkZWZhdWx0ZWQsIGlzIGEgbmFtZSB0aGF0IGlzCi0JICAgICAgbG9jYWwgdG8gdGhlIGFwcGxpY2F0aW9uIGNvbXBvbmVudCB1c2luZyB0aGUgcmVzb3VyY2UuCi0JICAgICAgKEl0J3MgYSBuYW1lIGluIHRoZSBKTkRJIGphdmE6Y29tcC9lbnYgbmFtZXNwYWNlLikgIE1hbnkKLQkgICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHByb3ZpZGUgYSB3YXkgdG8gbWFwIHRoZXNlIGxvY2FsCi0JICAgICAgbmFtZXMgdG8gbmFtZXMgb2YgcmVzb3VyY2VzIGtub3duIHRvIHRoZSBhcHBsaWNhdGlvbgotCSAgICAgIHNlcnZlci4gIFRoaXMgbWFwcGVkIG5hbWUgaXMgb2Z0ZW4gYSBnbG9iYWwgSk5ESSBuYW1lLAotCSAgICAgIGJ1dCBtYXkgYmUgYSBuYW1lIG9mIGFueSBmb3JtLgotCi0JICAgICAgQXBwbGljYXRpb24gc2VydmVycyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgYW55Ci0JICAgICAgcGFydGljdWxhciBmb3JtIG9yIHR5cGUgb2YgbWFwcGVkIG5hbWUsIG5vciB0aGUgYWJpbGl0eQotCSAgICAgIHRvIHVzZSBtYXBwZWQgbmFtZXMuICBUaGUgbWFwcGVkIG5hbWUgaXMKLQkgICAgICBwcm9kdWN0LWRlcGVuZGVudCBhbmQgb2Z0ZW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudC4gIE5vCi0JICAgICAgdXNlIG9mIGEgbWFwcGVkIG5hbWUgaXMgcG9ydGFibGUuCi0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmplY3Rpb24tdGFyZ2V0IgotCQkgICB0eXBlPSJqYXZhZWU6aW5qZWN0aW9uLXRhcmdldFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJvbGUtbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSByb2xlLW5hbWVUeXBlIGRlc2lnbmF0ZXMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCi0JVGhlIG5hbWUgbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsIHJ1bGVzIGZvciBhIHRva2VuLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icnVuLWFzVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHJ1bi1hc1R5cGUgc3BlY2lmaWVzIHRoZSBydW4tYXMgaWRlbnRpdHkgdG8gYmUKLQl1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIGEgY29tcG9uZW50LiBJdCBjb250YWlucyBhbgotCW9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6cm9sZS1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlY3VyaXR5LXJvbGUtcmVmVHlwZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYQotCXNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIGluIGEgY29tcG9uZW50J3Mgb3IgYQotCURlcGxveW1lbnQgQ29tcG9uZW50J3MgY29kZS4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuCi0Jb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSBzZWN1cml0eSByb2xlIG5hbWUgdXNlZCBpbiB0aGUKLQljb2RlLCBhbmQgYW4gb3B0aW9uYWwgbGluayB0byBhIHNlY3VyaXR5IHJvbGUuIElmIHRoZQotCXNlY3VyaXR5IHJvbGUgaXMgbm90IHNwZWNpZmllZCwgdGhlIERlcGxveWVyIG11c3QgY2hvb3NlIGFuCi0JYXBwcm9wcmlhdGUgc2VjdXJpdHkgcm9sZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnJvbGUtbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgdmFsdWUgb2YgdGhlIHJvbGUtbmFtZSBlbGVtZW50IG11c3QgYmUgdGhlIFN0cmluZyB1c2VkCi0JICAgIGFzIHRoZSBwYXJhbWV0ZXIgdG8gdGhlCi0JICAgIEVKQkNvbnRleHQuaXNDYWxsZXJJblJvbGUoU3RyaW5nIHJvbGVOYW1lKSBtZXRob2Qgb3IgdGhlCi0JICAgIEh0dHBTZXJ2bGV0UmVxdWVzdC5pc1VzZXJJblJvbGUoU3RyaW5nIHJvbGUpIG1ldGhvZC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvbGUtbGluayIKLQkJICAgdHlwZT0iamF2YWVlOnJvbGUtbmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSByb2xlLWxpbmsgZWxlbWVudCBpcyBhIHJlZmVyZW5jZSB0byBhIGRlZmluZWQKLQkgICAgc2VjdXJpdHkgcm9sZS4gVGhlIHJvbGUtbGluayBlbGVtZW50IG11c3QgY29udGFpbgotCSAgICB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gdGhlCi0JICAgIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VjdXJpdHktcm9sZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIHNlY3VyaXR5LXJvbGVUeXBlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgc2VjdXJpdHkKLQkgIHJvbGUuIFRoZSBkZWZpbml0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mCi0JICB0aGUgc2VjdXJpdHkgcm9sZSwgYW5kIHRoZSBzZWN1cml0eSByb2xlIG5hbWUuCi0KLQkgIEV4YW1wbGU6Ci0KLQkgICAgICA8c2VjdXJpdHktcm9sZT4KLQkgICAgICA8ZGVzY3JpcHRpb24+Ci0JCSAgVGhpcyByb2xlIGluY2x1ZGVzIGFsbCBlbXBsb3llZXMgd2hvIGFyZSBhdXRob3JpemVkCi0JCSAgdG8gYWNjZXNzIHRoZSBlbXBsb3llZSBzZXJ2aWNlIGFwcGxpY2F0aW9uLgotCSAgICAgIDwvZGVzY3JpcHRpb24+Ci0JICAgICAgPHJvbGUtbmFtZT5lbXBsb3llZTwvcm9sZS1uYW1lPgotCSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6cm9sZS1uYW1lVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0cmluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyBpcyBhIHNwZWNpYWwgc3RyaW5nIGRhdGF0eXBlIHRoYXQgaXMgZGVmaW5lZCBieSBKYXZhIEVFIGFzCi0JYSBiYXNlIHR5cGUgZm9yIGRlZmluaW5nIGNvbGxhcHNlZCBzdHJpbmdzLiBXaGVuIHNjaGVtYXMKLQlyZXF1aXJlIHRyYWlsaW5nL2xlYWRpbmcgc3BhY2UgZWxpbWluYXRpb24gYXMgd2VsbCBhcwotCWNvbGxhcHNpbmcgdGhlIGV4aXN0aW5nIHdoaXRlc3BhY2UsIHRoaXMgYmFzZSB0eXBlIG1heSBiZQotCXVzZWQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJ1ZS1mYWxzZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgc2ltcGxlIHR5cGUgZGVzaWduYXRlcyBhIGJvb2xlYW4gd2l0aCBvbmx5IHR3bwotCXBlcm1pc3NpYmxlIHZhbHVlcwotCi0JLSB0cnVlCi0JLSBmYWxzZQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6eHNkQm9vbGVhblR5cGUiPgotCTx4c2Q6cGF0dGVybiB2YWx1ZT0iKHRydWV8ZmFsc2UpIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idXJsLXBhdHRlcm5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdXJsLXBhdHRlcm5UeXBlIGNvbnRhaW5zIHRoZSB1cmwgcGF0dGVybiBvZiB0aGUgbWFwcGluZy4KLQlJdCBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgc3BlY2lmaWVkIGluIFNlY3Rpb24gMTEuMiBvZiB0aGUKLQlTZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9uLiBUaGlzIHBhdHRlcm4gaXMgYXNzdW1lZCB0byBiZSBpbgotCVVSTC1kZWNvZGVkIGZvcm0gYW5kIG11c3Qgbm90IGNvbnRhaW4gQ1IoI3hEKSBvciBMRigjeEEpLgotCUlmIGl0IGNvbnRhaW5zIHRob3NlIGNoYXJhY3RlcnMsIHRoZSBjb250YWluZXIgbXVzdCBpbmZvcm0KLQl0aGUgZGV2ZWxvcGVyIHdpdGggYSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlLgotCVRoZSBjb250YWluZXIgbXVzdCBwcmVzZXJ2ZSBhbGwgY2hhcmFjdGVycyBpbmNsdWRpbmcgd2hpdGVzcGFjZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZEFueVVSSVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDphbnlVUkkuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6YW55VVJJIj4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZEJvb2xlYW5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6Ym9vbGVhbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpib29sZWFuIj4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZEludGVnZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6aW50ZWdlci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDppbnRlZ2VyIj4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZE5NVE9LRU5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6Tk1UT0tFTi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpOTVRPS0VOIj4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZE5vbk5lZ2F0aXZlSW50ZWdlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpub25OZWdhdGl2ZUludGVnZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6bm9uTmVnYXRpdmVJbnRlZ2VyIj4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZFBvc2l0aXZlSW50ZWdlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpwb3NpdGl2ZUludGVnZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6cG9zaXRpdmVJbnRlZ2VyIj4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZFFOYW1lVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOlFOYW1lLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOlFOYW1lIj4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhzZFN0cmluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpzdHJpbmcuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qYXZhZWVfd2ViX3NlcnZpY2VzXzFfMi54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2phdmFlZV93ZWJfc2VydmljZXNfMV8yLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4Y2IxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2phdmFlZV93ZWJfc2VydmljZXNfMV8yLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDc0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjEuMiI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpamF2YWVlX3dlYl9zZXJ2aWNlc18xXzIueHNkcwkxLjE4IDAyLzEzLzA2Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gICAgICBVLlMuQQotICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgKEMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIDIwMDIKLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBWwotCi0JVGhlIHdlYnNlcnZpY2VzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBmb3IgdGhlIHdlYiBzZXJ2aWNlcwotCWRlcGxveW1lbnQgZGVzY3JpcHRvci4gIEl0IHNwZWNpZmllcyB0aGUgc2V0IG9mIHdlYiBzZXJ2aWNlCi0JZGVzY3JpcHRpb25zIHRoYXQgYXJlIHRvIGJlIGRlcGxveWVkIGludG8gdGhlIEphdmEgRUUgQXBwbGljYXRpb24KLQlTZXJ2ZXIgYW5kIHRoZSBkZXBlbmRlbmNpZXMgdGhleSBoYXZlIG9uIGNvbnRhaW5lciByZXNvdXJjZXMgYW5kCi0Jc2VydmljZXMuICBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgYmUgbmFtZWQKLQkiTUVUQS1JTkYvd2Vic2VydmljZXMueG1sIiBpbiB0aGUgd2ViIHNlcnZpY2VzJyBqYXIgZmlsZS4KLQotCVVzZWQgaW46IHdlYnNlcnZpY2VzLnhtbAotCi0JQWxsIHdlYnNlcnZpY2VzIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmRpY2F0ZSB0aGUKLQl3ZWJzZXJ2aWNlcyBzY2hlbWEgYnkgdXNpbmcgdGhlIEphdmEgRUUgbmFtZXNwYWNlOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0KLQlhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSB2ZXJzaW9uCi0JZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotCSAgICA8d2Vic2VydmljZXMgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0JCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qYXZhZWVfd2ViX3NlcnZpY2VzXzFfMi54c2QiCi0JICAgICAgdmVyc2lvbj0iMS4yIj4KLQkgICAgICAuLi4KLQkgICAgPC93ZWJzZXJ2aWNlcz4KLQotCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZiB0aGUKLQlzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIHRoZSBKYXZhIEVFCi0JbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qYXZhZWVfd2ViX3NlcnZpY2VzXzFfMi54c2QKLQotCV1dPgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSmF2YSBFRQotICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0gICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0Jc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLQlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLQl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLQlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249ImphdmFlZV81LnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0id2Vic2VydmljZXMiIHR5cGU9ImphdmFlZTp3ZWJzZXJ2aWNlc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB3ZWJzZXJ2aWNlcyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgZm9yIHRoZSB3ZWIgc2VydmljZXMKLQlkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBJdCBzcGVjaWZpZXMgdGhlIHNldCBvZiB3ZWIgc2VydmljZQotCWRlc2NyaXB0aW9ucyB0aGF0IGFyZSB0byBiZSBkZXBsb3llZCBpbnRvIHRoZSBKYXZhIEVFIEFwcGxpY2F0aW9uIFNlcnZlcgotCWFuZCB0aGUgZGVwZW5kZW5jaWVzIHRoZXkgaGF2ZSBvbiBjb250YWluZXIgcmVzb3VyY2VzIGFuZCBzZXJ2aWNlcy4KLQotCVVzZWQgaW46IHdlYnNlcnZpY2VzLnhtbAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOmtleSBuYW1lPSJ3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSB3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUgaWRlbnRpZmllcyB0aGUgY29sbGVjdGlvbiBvZgotCSAgcG9ydC1jb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIFdTREwgZmlsZSBhbmQgSkFYLVJQQyBtYXBwaW5nLiBUaGUKLQkgIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTp3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uIi8+Ci0gICAgICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6d2Vic2VydmljZS1kZXNjcmlwdGlvbi1uYW1lIi8+Ci0gICAgPC94c2Q6a2V5PgotICA8L3hzZDplbGVtZW50PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJoYW5kbGVyLWNoYWluVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgaGFuZGxlci1jaGFpbiBlbGVtZW50IGRlZmluZXMgdGhlIGhhbmRsZXJjaGFpbi4KLSAgICAgIEhhbmRsZXJjaGFpbiBjYW4gYmUgZGVmaW5lZCBzdWNoIHRoYXQgdGhlIGhhbmRsZXJzIGluIHRoZQotICAgICAgaGFuZGxlcmNoYWluIG9wZXJhdGUsYWxsIHBvcnRzIG9mIGEgc2VydmljZSwgb24gYSBzcGVjaWZpYwotICAgICAgcG9ydCBvciBvbiBhIGxpc3Qgb2YgcHJvdG9jb2wtYmluZGluZ3MuIFRoZSBjaG9pY2Ugb2YgZWxlbWVudHMKLSAgICAgIHNlcnZpY2UtbmFtZS1wYXR0ZXJuLCBwb3J0LW5hbWUtcGF0dGVybiBhbmQgcHJvdG9jb2wtYmluZGluZ3MKLSAgICAgIGFyZSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciB0aGUgaGFuZGxlcnMgaW4gaGFuZGxlci1jaGFpbiBhcmUKLSAgICAgIGZvciBhIHNlcnZpY2UsIHBvcnQgb3IgcHJvdG9jb2wgYmluZGluZy4gSWYgbm9uZSBvZiB0aGVzZQotICAgICAgY2hvaWNlcyBhcmUgc3BlY2lmaWVkIHdpdGggdGhlIGhhbmRsZXItY2hhaW4gZWxlbWVudCB0aGVuIHRoZQotICAgICAgaGFuZGxlcnMgc3BlY2lmaWVkIGluIHRoZSBoYW5kbGVyLWNoYWluIHdpbGwgYmUgYXBwbGllZCBvbgotICAgICAgZXZlcnl0aGluZy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLQotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtbmFtZS1wYXR0ZXJuIgotCQkgICAgICB0eXBlPSJqYXZhZWU6cW5hbWUtcGF0dGVybiIgLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3J0LW5hbWUtcGF0dGVybiIKLQkJICAgICAgdHlwZT0iamF2YWVlOnFuYW1lLXBhdHRlcm4iIC8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvdG9jb2wtYmluZGluZ3MiCi0JCSAgICAgIHR5cGU9ImphdmFlZTpwcm90b2NvbC1iaW5kaW5nTGlzdFR5cGUiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXIiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnBvcnQtY29tcG9uZW50X2hhbmRsZXJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJoYW5kbGVyLWNoYWluc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGhhbmRsZXItY2hhaW5zIGVsZW1lbnQgZGVmaW5lcyB0aGUgaGFuZGxlcmNoYWlucyBhc3NvY2lhdGVkCi0gICAgICB3aXRoIHRoaXMgc2VydmljZSBvciBzZXJ2aWNlIGVuZHBvaW50LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXItY2hhaW4iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmhhbmRsZXItY2hhaW5UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3J0LWNvbXBvbmVudFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBwb3J0LWNvbXBvbmVudCBlbGVtZW50IGFzc29jaWF0ZXMgYSBXU0RMIHBvcnQgd2l0aCBhIHdlYiBzZXJ2aWNlCi0JaW50ZXJmYWNlIGFuZCBpbXBsZW1lbnRhdGlvbi4gIEl0IGRlZmluZXMgdGhlIG5hbWUgb2YgdGhlIHBvcnQgYXMgYQotCWNvbXBvbmVudCwgb3B0aW9uYWwgZGVzY3JpcHRpb24sIG9wdGlvbmFsIGRpc3BsYXkgbmFtZSwgb3B0aW9uYWwgaWNvbmljCi0JcmVwcmVzZW50YXRpb25zLCBXU0RMIHBvcnQgUU5hbWUsIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlLCBTZXJ2aWNlCi0JSW1wbGVtZW50YXRpb24gQmVhbi4KLQotCVRoaXMgZWxlbWVudCBhbHNvIGFzc29jaWF0ZXMgYSBXU0RMIHNlcnZpY2Ugd2l0aCBhIEpBWC1XUyBQcm92aWRlcgotCWltcGxlbWVudGF0aW9uLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmRpc3BsYXktbmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWNvbiIKLQkJICAgdHlwZT0iamF2YWVlOmljb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtY29tcG9uZW50LW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgcG9ydC1jb21wb25lbnQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhIHBvcnQgY29tcG9uZW50J3MKLQkgICAgICBuYW1lLiAgVGhpcyBuYW1lIGlzIGFzc2lnbmVkIGJ5IHRoZSBtb2R1bGUgcHJvZHVjZXIgdG8gbmFtZQotCSAgICAgIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGJlYW4gaW4gdGhlIG1vZHVsZSdzIGRlcGxveW1lbnQKLQkgICAgICBkZXNjcmlwdG9yLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSBhbW9uZyB0aGUgcG9ydCBjb21wb25lbnQKLQkgICAgICBuYW1lcyBkZWZpbmVkIGluIHRoZSBzYW1lIG1vZHVsZS4KLQotCSAgICAgIFVzZWQgaW46IHBvcnQtY29tcG9uZW50Ci0KLQkgICAgICBFeGFtcGxlOgotCQkgICAgICA8cG9ydC1jb21wb25lbnQtbmFtZT5FbXBsb3llZVNlcnZpY2UKLQkJICAgICAgPC9wb3J0LWNvbXBvbmVudC1uYW1lPgotCi0JICAgICAgXV0+Ci0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtc2VydmljZSIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFFOYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBuYW1lIHNwYWNlIGFuZCBsb2NhbCBuYW1lIHBhcnQgb2YgdGhlIFdTREwKLQkgICAgc2VydmljZSBRTmFtZS4gVGhpcyBpcyByZXF1aXJlZCB0byBiZSBzcGVjaWZpZWQgZm9yCi0JICAgIHBvcnQgY29tcG9uZW50cyB0aGF0IGFyZSBKQVgtV1MgUHJvdmlkZXIgaW1wbGVtZW50YXRpb25zLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndzZGwtcG9ydCIKLQkJICAgdHlwZT0iamF2YWVlOnhzZFFOYW1lVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBuYW1lIHNwYWNlIGFuZCBsb2NhbCBuYW1lIHBhcnQgb2YgdGhlIFdTREwKLQkgICAgcG9ydCBRTmFtZS4gVGhpcyBpcyBub3QgcmVxdWlyZWQgdG8gYmUgc3BlY2lmaWVkIGZvciBwb3J0Ci0JICAgIGNvbXBvbmVudHMgdGhhdCBhcmUgSkFYLVdTIFByb3ZpZGVyIGltcGxlbWVudGF0aW9ucwotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuYWJsZS1tdG9tIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBVc2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIFNPQVAgTVRPTS9YT1AgbWVjaGFuaXNtIGZvciBhbgotICAgICAgICAgICAgZW5kcG9pbnQgaW1wbGVtZW50YXRpb24uCi0KLQkgICAgTm90IHRvIGJlIHNwZWNpZmllZCBmb3IgSkFYLVJQQyBydW50aW1lCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvdG9jb2wtYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6cHJvdG9jb2wtYmluZGluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgVXNlZCB0byBzcGVjaWZ5IHRoZSBwcm90b2NvbCBiaW5kaW5nIHVzZWQgYnkgdGhlIHBvcnQtY29tcG9uZW50LgotCSAgICBJZiB0aGlzIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0aGUgZGVmYXVsdCBiaW5kaW5nIGlzCi0gICAgICAgICAgICB1c2VkIChTT0FQIDEuMSBvdmVyIEhUVFApCi0KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPCFbQ0RBVEFbCi0KLQkgICAgICBUaGUgc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UgZWxlbWVudCBjb250YWlucyB0aGUKLQkgICAgICBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgcG9ydCBjb21wb25lbnQncyBTZXJ2aWNlIEVuZHBvaW50Ci0JICAgICAgSW50ZXJmYWNlLgotCi0JICAgICAgVXNlZCBpbjogcG9ydC1jb21wb25lbnQKLQotCSAgICAgIEV4YW1wbGU6Ci0JCSAgICAgIDxyZW1vdGU+Y29tLndvbWJhdC5lbXBsLkVtcGxveWVlU2VydmljZTwvcmVtb3RlPgotCi0JICAgICAgVGhpcyBtYXkgbm90IGJlIHNwZWNpZmllZCBpbiBjYXNlIHRoZXJlIGlzIG5vIFNlcnZpY2UKLQkgICAgICBFbnBvaW50IEludGVyZmFjZSBhcyBpcyB0aGUgY2FzZSB3aXRoIGRpcmVjdGx5IHVzaW5nIGFuCi0JICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3Mgd2l0aCB0aGUgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbi4KLQotCSAgICAgIFdoZW4gdGhlIHBvcnQgY29tcG9uZW50IGlzIGEgUHJvdmlkZXIgaW1wbGVtZW50YXRpb24KLQkgICAgICB0aGlzIGlzIG5vdCBzcGVjaWZpZWQuCi0KLQkgICAgICBdXT4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmljZS1pbXBsLWJlYW4iCi0JCSAgIHR5cGU9ImphdmFlZTpzZXJ2aWNlLWltcGwtYmVhblR5cGUiLz4KLQotICAgICAgPHhzZDpjaG9pY2U+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXIiCi0JCSAgICAgdHlwZT0iamF2YWVlOnBvcnQtY29tcG9uZW50X2hhbmRsZXJUeXBlIgotCQkgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JCSBUbyBiZSB1c2VkIHdpdGggSkFYLVJQQyBiYXNlZCBydW50aW1lIG9ubHkuCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXItY2hhaW5zIgotCQkgICAgIHR5cGU9ImphdmFlZTpoYW5kbGVyLWNoYWluc1R5cGUiCi0JCSAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JCSBUbyBiZSB1c2VkIHdpdGggSkFYLVdTIGJhc2VkIHJ1bnRpbWUgb25seS4KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwveHNkOmNob2ljZT4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvcnQtY29tcG9uZW50X2hhbmRsZXJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlEZWNsYXJlcyB0aGUgaGFuZGxlciBmb3IgYSBwb3J0LWNvbXBvbmVudC4gSGFuZGxlcnMgY2FuIGFjY2VzcyB0aGUKLQlpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4KLQotCVVzZWQgaW46IHBvcnQtY29tcG9uZW50Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZQotCSAgICBtb2R1bGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIHRoZSBoYW5kbGVyIGltcGxlbWVudGF0aW9uLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXQtcGFyYW0iCi0JCSAgIHR5cGU9ImphdmFlZTpwYXJhbS12YWx1ZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvYXAtaGVhZGVyIgotCQkgICB0eXBlPSJqYXZhZWU6eHNkUU5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgUU5hbWUgb2YgYSBTT0FQIGhlYWRlciB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoZQotCSAgICBoYW5kbGVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvYXAtcm9sZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzb2FwLXJvbGUgZWxlbWVudCBjb250YWlucyBhIFNPQVAgYWN0b3IgZGVmaW5pdGlvbiB0aGF0IHRoZQotCSAgICBIYW5kbGVyIHdpbGwgcGxheSBhcyBhIHJvbGUuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwcm90b2NvbC1VUklBbGlhc1R5cGUiPgotICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICBEZWZpbmVzIHRoZSB0eXBlIHRoYXQgaXMgdXNlZCBmb3Igc3BlY2lmeWluZyB0b2tlbnMgdGhhdAotCSAgIHN0YXJ0IHdpdGggIyMgd2hpY2ggYXJlIHVzZWQgdG8gYWxpYXMgZXhpc3Rpbmcgc3RhbmRhcmQKLQkgICBwcm90b2NvbCBiaW5kaW5ncyBhbmQgc3VwcG9ydCBhbGlhc2VzIGZvciBuZXcgc3RhbmRhcmQKLQkgICBiaW5kaW5nIFVSSXMgdGhhdCBhcmUgaW50cm9kdWNlZCBpbiBmdXR1cmUgc3BlY2lmaWNhdGlvbnMuCi0KLQkgICBUaGUgZm9sbG93aW5nIHRva2VucyBhbGlhcyB0aGUgc3RhbmRhcmQgcHJvdG9jb2wgYmluZGluZwotCSAgIFVSSXM6Ci0KLQkgICAjI1NPQVAxMV9IVFRQID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC9odHRwIgotCSAgICMjU09BUDExX0hUVFBfTVRPTSA9Ci0gICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvaHR0cD9tdG9tPXRydWUiCi0gICAgICAgICAgICMjU09BUDEyX0hUVFAgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAvIgotICAgICAgICAgICAjI1NPQVAxMl9IVFRQX01UT00gPQotCQkgImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC9iaW5kaW5ncy9IVFRQLz9tdG9tPXRydWUiCi0gICAgICAgICAgICMjWE1MX0hUVFAgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2h0dHAiCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IiMjLisiLz4KLSAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icHJvdG9jb2wtYmluZGluZ0xpc3RUeXBlIj4KLSAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgRGVmaW5lcyB0aGUgdHlwZSB1c2VkIGZvciBzcGVjaWZ5aW5nIGEgbGlzdCBvZgotCSAgIHByb3RvY29sLWJpbmRpbmdUeXBlKHMpLiBGb3IgZS5nLgotCi0JICAgICMjU09BUDExX0hUVFAgIyNTT0FQMTJfSFRUUCAjI1hNTF9IVFRQCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDpsaXN0IGl0ZW1UeXBlPSJqYXZhZWU6cHJvdG9jb2wtYmluZGluZ1R5cGUiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwcm90b2NvbC1iaW5kaW5nVHlwZSI+Ci0gICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgIERlZmluZXMgdGhlIHR5cGUgdXNlZCBmb3Igc3BlY2lmeWluZyB0aGUgVVJJIGZvciB0aGUKLQkgICBwcm90b2NvbCBiaW5kaW5nIHVzZWQgYnkgdGhlIHBvcnQtY29tcG9uZW50LiAgRm9yCi0JICAgcG9ydGFiaWxpdHkgb25lIGNvdWxkIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB0b2tlbnMgdGhhdAotCSAgIGFsaWFzIHRoZSBzdGFuZGFyZCBiaW5kaW5nIHR5cGVzOgotCi0JICAgICMjU09BUDExX0hUVFAKLQkgICAgIyNTT0FQMTFfSFRUUF9NVE9NCi0JICAgICMjU09BUDEyX0hUVFAKLQkgICAgIyNTT0FQMTJfSFRUUF9NVE9NCi0JICAgICMjWE1MX0hUVFAKLQotCSAgIE90aGVyIHNwZWNpZmljYXRpb25zIGNvdWxkIGRlZmluZSB0b2tlbnMgdGhhdCBzdGFydCB3aXRoICMjCi0JICAgdG8gYWxpYXMgbmV3IHN0YW5kYXJkIGJpbmRpbmcgVVJJcyB0aGF0IGFyZSBpbnRyb2R1Y2VkLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgIDx4c2Q6dW5pb24gbWVtYmVyVHlwZXM9InhzZDphbnlVUkkgamF2YWVlOnByb3RvY29sLVVSSUFsaWFzVHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InFuYW1lLXBhdHRlcm4iPgotICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgIFRoaXMgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBRTmFtZSBwYXR0ZXJuIGluIHRoZQotCSAgICAgYXR0cmlidXRlIHNlcnZpY2UtbmFtZS1wYXR0ZXJuIGFuZCBwb3J0LW5hbWUtcGF0dGVybiBpbgotCSAgICAgdGhlIGhhbmRsZXItY2hhaW4gZWxlbWVudAotCi0JICAgICBGb3IgZXhhbXBsZSwgdGhlIHZhcmlvdXMgZm9ybXMgYWNjZXB0YWJsZSBoZXJlIGZvcgotCSAgICAgc2VydmljZS1uYW1lLXBhdHRlcm4gYXR0cmlidXRlIGluIGhhbmRsZXItY2hhaW4gZWxlbWVudAotCSAgICAgYXJlIDoKLQotCSAgICAgRXhhY3QgTmFtZTogc2VydmljZS1uYW1lLXBhdHRlcm49Im5zMTpFY2hvU2VydmljZSIKLQotCQkgSW4gdGhpcyBjYXNlLCBoYW5kbGVycyBzcGVjaWZpZWQgaW4gdGhpcwotCQkgaGFuZGxlci1jaGFpbiBlbGVtZW50IHdpbGwgYXBwbHkgdG8gYWxsIHBvcnRzIHdpdGgKLQkJIHRoaXMgZXhhY3Qgc2VydmljZSBuYW1lLiBUaGUgbmFtZXNwYWNlIHByZWZpeCBtdXN0Ci0JCSBoYXZlIGJlZW4gZGVjbGFyZWQgaW4gYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24KLQkJIGF0dHJpYnV0ZSBpbiBlaXRoZXIgdGhlIHN0YXJ0LXRhZyBvZiB0aGUgZWxlbWVudAotCQkgd2hlcmUgdGhlIHByZWZpeCBpcyB1c2VkIG9yIGluIGFuIGFuIGFuY2VzdG9yCi0JCSBlbGVtZW50IChpLmUuIGFuIGVsZW1lbnQgaW4gd2hvc2UgY29udGVudCB0aGUKLQkJIHByZWZpeGVkIG1hcmt1cCBvY2N1cnMpCi0KLQkgICAgIFBhdHRlcm4gOiBzZXJ2aWNlLW5hbWUtcGF0dGVybj0ibnMxOkVjaG9TZXJ2aWNlKiIKLQotCQkgSW4gdGhpcyBjYXNlLCBoYW5kbGVycyBzcGVjaWZpZWQgaW4gdGhpcwotCQkgaGFuZGxlci1jaGFpbiBlbGVtZW50IHdpbGwgYXBwbHkgdG8gYWxsIHBvcnRzIHdob3NlCi0JCSBTZXJ2aWNlIG5hbWVzIGFyZSBsaWtlIEVjaG9TZXJ2aWNlMSwgRWNob1NlcnZpY2VGb28KLQkJIGV0Yy4gVGhlIG5hbWVzcGFjZSBwcmVmaXggbXVzdCBoYXZlIGJlZW4gZGVjbGFyZWQgaW4KLQkJIGEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGF0dHJpYnV0ZSBpbiBlaXRoZXIgdGhlCi0JCSBzdGFydC10YWcgb2YgdGhlIGVsZW1lbnQgd2hlcmUgdGhlIHByZWZpeCBpcyB1c2VkIG9yCi0JCSBpbiBhbiBhbiBhbmNlc3RvciBlbGVtZW50IChpLmUuIGFuIGVsZW1lbnQgaW4gd2hvc2UKLQkJIGNvbnRlbnQgdGhlIHByZWZpeGVkIG1hcmt1cCBvY2N1cnMpCi0KLQkgICAgIFdpbGQgQ2FyZCA6IHNlcnZpY2UtbmFtZS1wYXR0ZXJuPSIqIgotCi0JCUluIHRoaXMgY2FzZSwgaGFuZGxlcnMgc3BlY2lmaWVkIGluIHRoaXMgaGFuZGxlci1jaGFpbgotCQllbGVtZW50IHdpbGwgYXBwbHkgdG8gcG9ydHMgb2YgYWxsIHNlcnZpY2UgbmFtZXMuCi0KLQkgICAgVGhlIHNhbWUgY2FuIGJlIGFwcGxpZWQgdG8gcG9ydC1uYW1lIGF0dHJpYnV0ZSBpbgotCSAgICBoYW5kbGVyLWNoYWluIGVsZW1lbnQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iXCp8KFtcaS1bOl1dW1xjLVs6XV0qOik/W1xpLVs6XV1bXGMtWzpdXSpcKj8iLz4KLSAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmljZS1pbXBsLWJlYW5UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VydmljZS1pbXBsLWJlYW4gZWxlbWVudCBkZWZpbmVzIHRoZSB3ZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbi4KLQlBIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2FuIGJlIGFuIEVKQiBiZWFuIGNsYXNzIG9yIEpBWC1SUEMgd2ViCi0JY29tcG9uZW50LiAgRXhpc3RpbmcgRUpCIGltcGxlbWVudGF0aW9ucyBhcmUgZXhwb3NlZCBhcyBhIHdlYiBzZXJ2aWNlCi0JdXNpbmcgYW4gZWpiLWxpbmsuCi0KLQlVc2VkIGluOiBwb3J0LWNvbXBvbmVudAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpiLWxpbmsiCi0JCSAgIHR5cGU9ImphdmFlZTplamItbGlua1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LWxpbmsiCi0JCSAgIHR5cGU9ImphdmFlZTpzZXJ2bGV0LWxpbmtUeXBlIi8+Ci0gICAgPC94c2Q6Y2hvaWNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZsZXQtbGlua1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8IVtDREFUQVsKLQotCSAgVGhlIHNlcnZsZXQtbGluayBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIHNlcnZpY2UtaW1wbC1iZWFuIGVsZW1lbnQKLQkgIHRvIHNwZWNpZnkgdGhhdCBhIFNlcnZpY2UgSW1wbGVtZW50YXRpb24gQmVhbiBpcyBkZWZpbmVkIGFzIGEKLQkgIEpBWC1SUEMgU2VydmljZSBFbmRwb2ludC4KLQotCSAgVGhlIHZhbHVlIG9mIHRoZSBzZXJ2bGV0LWxpbmsgZWxlbWVudCBtdXN0IGJlIHRoZSBzZXJ2bGV0LW5hbWUgb2YKLQkgIGEgSkFYLVJQQyBTZXJ2aWNlIEVuZHBvaW50IGluIHRoZSBzYW1lIFdBUiBmaWxlLgotCi0JICBVc2VkIGluOiBzZXJ2aWNlLWltcGwtYmVhbgotCi0JICBFeGFtcGxlOgotCQkgIDxzZXJ2bGV0LWxpbms+U3RvY2tRdW90ZVNlcnZpY2U8L3NlcnZsZXQtbGluaz4KLQotCSAgXV0+Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNlcnZpY2UtZGVzY3JpcHRpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgd2Vic2VydmljZS1kZXNjcmlwdGlvbiBlbGVtZW50IGRlZmluZXMgYSBXU0RMIGRvY3VtZW50IGZpbGUKLQlhbmQgdGhlIHNldCBvZiBQb3J0IGNvbXBvbmVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBXU0RMIHBvcnRzCi0JZGVmaW5lZCBpbiB0aGUgV1NETCBkb2N1bWVudC4gIFRoZXJlIG1heSBiZSBtdWx0aXBsZQotCXdlYnNlcnZpY2UtZGVzY3JpcHRpb25zIGRlZmluZWQgd2l0aGluIGEgbW9kdWxlLgotCi0JQWxsIFdTREwgZmlsZSBwb3J0cyBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHBvcnQtY29tcG9uZW50IGVsZW1lbnQKLQlkZWZpbmVkLgotCi0JVXNlZCBpbjogd2Vic2VydmljZXMKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpkaXNwbGF5LW5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imljb24iCi0JCSAgIHR5cGU9ImphdmFlZTppY29uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd2Vic2VydmljZS1kZXNjcmlwdGlvbi1uYW1lIGlkZW50aWZpZXMgdGhlIGNvbGxlY3Rpb24gb2YKLQkgICAgcG9ydC1jb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIFdTREwgZmlsZSBhbmQgSkFYLVJQQwotCSAgICBtYXBwaW5nLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLWZpbGUiCi0JCSAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgd3NkbC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBXU0RMIGZpbGUgaW4gdGhlCi0JICAgIG1vZHVsZS4gIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgbW9kdWxlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpheHJwYy1tYXBwaW5nLWZpbGUiCi0JCSAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgamF4cnBjLW1hcHBpbmctZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0Ci0JICAgIGRlc2NyaWJlcyB0aGUgSkFYLVJQQyBtYXBwaW5nIGJldHdlZW4gdGhlIEphdmEgaW50ZXJhY2VzIHVzZWQgYnkKLQkgICAgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgV1NETCBkZXNjcmlwdGlvbiBpbiB0aGUgd3NkbC1maWxlLiAgVGhlCi0JICAgIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUuCi0KLQkgICAgVGhpcyBpcyBub3QgcmVxdWlyZWQgd2hlbiBKQVgtV1MgYmFzZWQgcnVudGltZSBpcyB1c2VkLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtY29tcG9uZW50IgotCQkgICB0eXBlPSJqYXZhZWU6cG9ydC1jb21wb25lbnRUeXBlIgotCQkgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmtleSBuYW1lPSJwb3J0LWNvbXBvbmVudF9oYW5kbGVyLW5hbWUta2V5Ij4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlci4gVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUKLQkgICAgICB3aXRoaW4gdGhlIG1vZHVsZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpoYW5kbGVyIi8+Ci0JICA8eHNkOmZpZWxkIHhwYXRoPSJqYXZhZWU6aGFuZGxlci1uYW1lIi8+Ci0JPC94c2Q6a2V5PgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzZXJ2aWNlc1R5cGUiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6d2Vic2VydmljZS1kZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6a2V5IG5hbWU9InBvcnQtY29tcG9uZW50LW5hbWUta2V5Ij4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICAgIDwhW0NEQVRBWwotCi0JCVRoZSBwb3J0LWNvbXBvbmVudC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIGEgcG9ydAotCQljb21wb25lbnQncyBuYW1lLiAgVGhpcyBuYW1lIGlzIGFzc2lnbmVkIGJ5IHRoZSBtb2R1bGUKLQkJcHJvZHVjZXIgdG8gbmFtZSB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBiZWFuIGluIHRoZQotCQltb2R1bGUncyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0JCWFtb25nIHRoZSBwb3J0IGNvbXBvbmVudCBuYW1lcyBkZWZpbmVkIGluIHRoZSBzYW1lIG1vZHVsZS4KLQotCQlVc2VkIGluOiBwb3J0LWNvbXBvbmVudAotCi0JCUV4YW1wbGU6Ci0JCQk8cG9ydC1jb21wb25lbnQtbmFtZT5FbXBsb3llZVNlcnZpY2UKLQkJCTwvcG9ydC1jb21wb25lbnQtbmFtZT4KLQotCQldXT4KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cG9ydC1jb21wb25lbnQiLz4KLQkgIDx4c2Q6ZmllbGQgeHBhdGg9ImphdmFlZTpwb3J0LWNvbXBvbmVudC1uYW1lIi8+Ci0JPC94c2Q6a2V5PgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXdleS12ZXJzaW9uVHlwZSIKLQkJICAgZml4ZWQ9IjEuMiIKLQkJICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgcmVxdWlyZWQgdmFsdWUgZm9yIHRoZSB2ZXJzaW9uIGlzIDEuMi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzIueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9qYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGYwZGQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvamF2YWVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8yLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjEuMiI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpamF2YWVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8yLnhzZHMJMS4xOSAwMi8xMy8wNgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICAgICAgVS5TLkEKLSAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIChDKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiAyMDAyCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvcnQtY29tcG9uZW50LXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBwb3J0LWNvbXBvbmVudC1yZWYgZWxlbWVudCBkZWNsYXJlcyBhIGNsaWVudCBkZXBlbmRlbmN5Ci0Jb24gdGhlIGNvbnRhaW5lciBmb3IgcmVzb2x2aW5nIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLQl0byBhIFdTREwgcG9ydC4gSXQgb3B0aW9uYWxseSBhc3NvY2lhdGVzIHRoZSBTZXJ2aWNlIEVuZHBvaW50Ci0JSW50ZXJmYWNlIHdpdGggYSBwYXJ0aWN1bGFyIHBvcnQtY29tcG9uZW50LiBUaGlzIGlzIG9ubHkgdXNlZAotCWJ5IHRoZSBjb250YWluZXIgZm9yIGEgU2VydmljZS5nZXRQb3J0KENsYXNzKSBtZXRob2QgY2FsbC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UgZWxlbWVudCBkZWZpbmVzIGEgZnVsbHkgcXVhbGlmaWVkCi0JICAgIEphdmEgY2xhc3MgdGhhdCByZXByZXNlbnRzIHRoZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBvZiBhCi0JICAgIFdTREwgcG9ydC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuYWJsZS1tdG9tIgotICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBVc2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIFNPQVAgTVRPTS9YT1AgbWVjaGFuaXNtIG9uIHRoZSBjbGllbnQKLQkgICAgc2lkZSBmb3IgYSBwb3J0LWNvbXBvbmVudC4KLQotCSAgICBOb3QgdG8gYmUgc3BlY2lmaWVkIGZvciBKQVgtUlBDIHJ1bnRpbWUKLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvcnQtY29tcG9uZW50LWxpbmsiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBvcnQtY29tcG9uZW50LWxpbmsgZWxlbWVudCBsaW5rcyBhIHBvcnQtY29tcG9uZW50LXJlZgotCSAgICB0byBhIHNwZWNpZmljIHBvcnQtY29tcG9uZW50IHJlcXVpcmVkIHRvIGJlIG1hZGUgYXZhaWxhYmxlCi0JICAgIGJ5IGEgc2VydmljZSByZWZlcmVuY2UuCi0KLQkgICAgVGhlIHZhbHVlIG9mIGEgcG9ydC1jb21wb25lbnQtbGluayBtdXN0IGJlIHRoZQotCSAgICBwb3J0LWNvbXBvbmVudC1uYW1lIG9mIGEgcG9ydC1jb21wb25lbnQgaW4gdGhlIHNhbWUgbW9kdWxlCi0JICAgIG9yIGFub3RoZXIgbW9kdWxlIGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uIHVuaXQuIFRoZSBzeW50YXgKLQkgICAgZm9yIHNwZWNpZmljYXRpb24gZm9sbG93cyB0aGUgc3ludGF4IGRlZmluZWQgZm9yIGVqYi1saW5rCi0JICAgIGluIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Z3JvdXAgbmFtZT0ic2VydmljZS1yZWZHcm91cCI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLXJlZiIKLQkJICAgdHlwZT0iamF2YWVlOnNlcnZpY2UtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDprZXkgbmFtZT0ic2VydmljZS1yZWZfaGFuZGxlci1uYW1lLWtleSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0JICAgICAgd2l0aGluIHRoZSBtb2R1bGUuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6aGFuZGxlciIvPgotCSAgPHhzZDpmaWVsZCB4cGF0aD0iamF2YWVlOmhhbmRsZXItbmFtZSIvPgotCTwveHNkOmtleT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmdyb3VwPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLXJlZlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXJ2aWNlLXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgcmVmZXJlbmNlIHRvIGEgV2ViCi0Jc2VydmljZS4gSXQgY29udGFpbnMgb3B0aW9uYWwgZGVzY3JpcHRpb24sIGRpc3BsYXkgbmFtZSBhbmQKLQlpY29ucywgYSBkZWNsYXJhdGlvbiBvZiB0aGUgcmVxdWlyZWQgU2VydmljZSBpbnRlcmZhY2UsCi0JYW4gb3B0aW9uYWwgV1NETCBkb2N1bWVudCBsb2NhdGlvbiwgYW4gb3B0aW9uYWwgc2V0Ci0Jb2YgSkFYLVJQQyBtYXBwaW5ncywgYW4gb3B0aW9uYWwgUU5hbWUgZm9yIHRoZSBzZXJ2aWNlIGVsZW1lbnQsCi0JYW4gb3B0aW9uYWwgc2V0IG9mIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlcyB0byBiZSByZXNvbHZlZAotCWJ5IHRoZSBjb250YWluZXIgdG8gYSBXU0RMIHBvcnQsIGFuZCBhbiBvcHRpb25hbCBzZXQgb2YgaGFuZGxlcnMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLXJlZi1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6am5kaS1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXJ2aWNlLXJlZi1uYW1lIGVsZW1lbnQgZGVjbGFyZXMgbG9naWNhbCBuYW1lIHRoYXQgdGhlCi0JICAgIGNvbXBvbmVudHMgaW4gdGhlIG1vZHVsZSB1c2UgdG8gbG9vayB1cCB0aGUgV2ViIHNlcnZpY2UuIEl0Ci0JICAgIGlzIHJlY29tbWVuZGVkIHRoYXQgYWxsIHNlcnZpY2UgcmVmZXJlbmNlIG5hbWVzIHN0YXJ0IHdpdGgKLQkgICAgInNlcnZpY2UvIi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZpY2UtaW50ZXJmYWNlIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXJ2aWNlLWludGVyZmFjZSBlbGVtZW50IGRlY2xhcmVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLQkgICAgbmFtZSBvZiB0aGUgSkFYLVJQQyBTZXJ2aWNlIGludGVyZmFjZSB0aGUgY2xpZW50IGRlcGVuZHMgb24uCi0JICAgIEluIG1vc3QgY2FzZXMgdGhlIHZhbHVlIHdpbGwgYmUgamF2YXgueG1sLnJwYy5TZXJ2aWNlLiAgQSBKQVgtUlBDCi0JICAgIGdlbmVyYXRlZCBTZXJ2aWNlIEludGVyZmFjZSBjbGFzcyBtYXkgYWxzbyBiZSBzcGVjaWZpZWQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLXJlZi10eXBlIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgc2VydmljZS1yZWYtdHlwZSBlbGVtZW50IGRlY2xhcmVzIHRoZSB0eXBlIG9mIHRoZSBzZXJ2aWNlLXJlZgotCSAgICBlbGVtZW50IHRoYXQgaXMgaW5qZWN0ZWQgb3IgcmV0dXJuZWQgd2hlbiBhIEpOREkgbG9va3VwIGlzIGRvbmUuCi0JICAgIFRoaXMgbXVzdCBiZSBlaXRoZXIgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBTZXJ2aWNlIGNsYXNzIG9yCi0JICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSBjbGFzcy4KLQkgICAgVGhpcyBpcyBvbmx5IHVzZWQgd2l0aCBKQVgtV1MgcnVudGltZSB3aGVyZSB0aGUgY29ycmVzcG9uZGluZwotCSAgICBAV2ViU2VydmljZVJlZiBhbm5vdGF0aW9uIGNhbiBiZSB1c2VkIHRvIGRlbm90ZSBib3RoIGEgU2VydmljZQotCSAgICBvciBhIFBvcnQuCi0KLQkgICAgSWYgdGhpcyBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRoZSB0eXBlIG9mIHNlcnZpY2UtcmVmIGVsZW1lbnQKLQkgICAgdGhhdCBpcyBpbmplY3RlZCBvciByZXR1cm5lZCB3aGVuIGEgSk5ESSBsb29rdXAgaXMgZG9uZSBpcwotCSAgICBhbHdheXMgYSBTZXJ2aWNlIGludGVyZmFjZS9jbGFzcy4KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3c2RsLWZpbGUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RBbnlVUklUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB3c2RsLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgVVJJIGxvY2F0aW9uIG9mIGEgV1NETAotCSAgICBmaWxlLiBUaGUgbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIG1vZHVsZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpheHJwYy1tYXBwaW5nLWZpbGUiCi0JCSAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgamF4cnBjLW1hcHBpbmctZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0Ci0JICAgIGRlc2NyaWJlcyB0aGUgSkFYLVJQQyBtYXBwaW5nIGJldHdlZW4gdGhlIEphdmEgaW50ZXJhY2VzIHVzZWQgYnkKLQkgICAgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgV1NETCBkZXNjcmlwdGlvbiBpbiB0aGUgd3NkbC1maWxlLiAgVGhlCi0JICAgIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUgZmlsZS4KLQotCSAgICBUaGlzIGlzIG5vdCByZXF1aXJlZCB3aGVuIEpBWC1XUyBiYXNlZCBydW50aW1lIGlzIHVzZWQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLXFuYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6eHNkUU5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXJ2aWNlLXFuYW1lIGVsZW1lbnQgZGVjbGFyZXMgdGhlIHNwZWNpZmljIFdTREwgc2VydmljZQotCSAgICBlbGVtZW50IHRoYXQgaXMgYmVpbmcgcmVmZXJlZCB0by4gIEl0IGlzIG5vdCBzcGVjaWZpZWQgaWYgbm8KLQkgICAgd3NkbC1maWxlIGlzIGRlY2xhcmVkLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1jb21wb25lbnQtcmVmIgotCQkgICB0eXBlPSJqYXZhZWU6cG9ydC1jb21wb25lbnQtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBwb3J0LWNvbXBvbmVudC1yZWYgZWxlbWVudCBkZWNsYXJlcyBhIGNsaWVudCBkZXBlbmRlbmN5Ci0JICAgIG9uIHRoZSBjb250YWluZXIgZm9yIHJlc29sdmluZyBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlCi0JICAgIHRvIGEgV1NETCBwb3J0LiBJdCBvcHRpb25hbGx5IGFzc29jaWF0ZXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQKLQkgICAgSW50ZXJmYWNlIHdpdGggYSBwYXJ0aWN1bGFyIHBvcnQtY29tcG9uZW50LiBUaGlzIGlzIG9ubHkgdXNlZAotCSAgICBieSB0aGUgY29udGFpbmVyIGZvciBhIFNlcnZpY2UuZ2V0UG9ydChDbGFzcykgbWV0aG9kIGNhbGwuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCSAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXIiCi0JCSAgICAgICB0eXBlPSJqYXZhZWU6c2VydmljZS1yZWZfaGFuZGxlclR5cGUiCi0JCSAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkgICAgPHhzZDphbm5vdGF0aW9uPgotCSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCQlEZWNsYXJlcyB0aGUgaGFuZGxlciBmb3IgYSBwb3J0LWNvbXBvbmVudC4gSGFuZGxlcnMgY2FuCi0JCWFjY2VzcyB0aGUgaW5pdC1wYXJhbSBuYW1lL3ZhbHVlIHBhaXJzIHVzaW5nIHRoZQotCQlIYW5kbGVySW5mbyBpbnRlcmZhY2UuIElmIHBvcnQtbmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUKLQkJaGFuZGxlciBpcyBhc3N1bWVkIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhbGwgcG9ydHMgb2YgdGhlCi0JCXNlcnZpY2UuCi0KLQkJVG8gYmUgdXNlZCB3aXRoIEpBWC1SUEMgYmFzZWQgcnVudGltZSBvbmx5LgotCi0JICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDwveHNkOmVsZW1lbnQ+Ci0JICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFuZGxlci1jaGFpbnMiCi0JCSAgICAgICB0eXBlPSJqYXZhZWU6c2VydmljZS1yZWZfaGFuZGxlci1jaGFpbnNUeXBlIgotCQkgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCSAgICA8eHNkOmFubm90YXRpb24+Ci0JICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCQkgVG8gYmUgdXNlZCB3aXRoIEpBWC1XUyBiYXNlZCBydW50aW1lIG9ubHkuCi0JICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6cmVzb3VyY2VHcm91cCIvPgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmljZS1yZWZfaGFuZGxlci1jaGFpblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGhhbmRsZXItY2hhaW4gZWxlbWVudCBkZWZpbmVzIHRoZSBoYW5kbGVyY2hhaW4uCi0gICAgICBIYW5kbGVyY2hhaW4gY2FuIGJlIGRlZmluZWQgc3VjaCB0aGF0IHRoZSBoYW5kbGVycyBpbiB0aGUKLSAgICAgIGhhbmRsZXJjaGFpbiBvcGVyYXRlLGFsbCBwb3J0cyBvZiBhIHNlcnZpY2UsIG9uIGEgc3BlY2lmaWMKLSAgICAgIHBvcnQgb3Igb24gYSBsaXN0IG9mIHByb3RvY29sLWJpbmRpbmdzLiBUaGUgY2hvaWNlIG9mIGVsZW1lbnRzCi0gICAgICBzZXJ2aWNlLW5hbWUtcGF0dGVybiwgcG9ydC1uYW1lLXBhdHRlcm4gYW5kIHByb3RvY29sLWJpbmRpbmdzCi0gICAgICBhcmUgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlIGhhbmRsZXJzIGluIGhhbmRsZXItY2hhaW4gYXJlCi0gICAgICBmb3IgYSBzZXJ2aWNlLCBwb3J0IG9yIHByb3RvY29sIGJpbmRpbmcuIElmIG5vbmUgb2YgdGhlc2UKLSAgICAgIGNob2ljZXMgYXJlIHNwZWNpZmllZCB3aXRoIHRoZSBoYW5kbGVyLWNoYWluIGVsZW1lbnQgdGhlbiB0aGUKLSAgICAgIGhhbmRsZXJzIHNwZWNpZmllZCBpbiB0aGUgaGFuZGxlci1jaGFpbiB3aWxsIGJlIGFwcGxpZWQgb24KLSAgICAgIGV2ZXJ5dGhpbmcuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlLW5hbWUtcGF0dGVybiIKLQkJICAgICAgdHlwZT0iamF2YWVlOnNlcnZpY2UtcmVmX3FuYW1lLXBhdHRlcm4iIC8+Ci0gICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1uYW1lLXBhdHRlcm4iCi0JICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c2VydmljZS1yZWZfcW5hbWUtcGF0dGVybiIgLz4KLSAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm90b2NvbC1iaW5kaW5ncyIKLQkgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzZXJ2aWNlLXJlZl9wcm90b2NvbC1iaW5kaW5nTGlzdFR5cGUiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXIiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnNlcnZpY2UtcmVmX2hhbmRsZXJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLXJlZl9oYW5kbGVyLWNoYWluc1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgVGhlIGhhbmRsZXItY2hhaW5zIGVsZW1lbnQgZGVmaW5lcyB0aGUgaGFuZGxlcmNoYWlucyBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAgICAgc2VydmljZSBvciBzZXJ2aWNlIGVuZHBvaW50LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhhbmRsZXItY2hhaW4iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnNlcnZpY2UtcmVmX2hhbmRsZXItY2hhaW5UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2aWNlLXJlZl9oYW5kbGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbiBhY2Nlc3MgdGhlCi0JaW5pdC1wYXJhbSBuYW1lL3ZhbHVlIHBhaXJzIHVzaW5nIHRoZSBIYW5kbGVySW5mbyBpbnRlcmZhY2UuIElmCi0JcG9ydC1uYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBoYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYXNzb2NpYXRlZAotCXdpdGggYWxsIHBvcnRzIG9mIHRoZSBzZXJ2aWNlLgotCi0JVXNlZCBpbjogc2VydmljZS1yZWYKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZQotCSAgICB3aXRoaW4gdGhlIG1vZHVsZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYW5kbGVyLWNsYXNzIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIGhhbmRsZXIKLQkgICAgaW1wbGVtZW50YXRpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKLQkJICAgdHlwZT0iamF2YWVlOnBhcmFtLXZhbHVlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic29hcC1oZWFkZXIiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RRTmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBRTmFtZSBvZiBhIFNPQVAgaGVhZGVyIHRoYXQgd2lsbCBiZSBwcm9jZXNzZWQKLQkgICAgYnkgdGhlIGhhbmRsZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb2FwLXJvbGUiCi0JCSAgIHR5cGU9ImphdmFlZTpzdHJpbmciCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgc29hcC1yb2xlIGVsZW1lbnQgY29udGFpbnMgYSBTT0FQIGFjdG9yIGRlZmluaXRpb24gdGhhdAotCSAgICB0aGUgSGFuZGxlciB3aWxsIHBsYXkgYXMgYSByb2xlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9ydC1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHBvcnQtbmFtZSBlbGVtZW50IGRlZmluZXMgdGhlIFdTREwgcG9ydC1uYW1lIHRoYXQgYQotCSAgICBoYW5kbGVyIHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGguCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJzZXJ2aWNlLXJlZl9wcm90b2NvbC1VUklBbGlhc1R5cGUiPgotICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICBEZWZpbmVzIHRoZSB0eXBlIHRoYXQgaXMgdXNlZCBmb3Igc3BlY2lmeWluZyB0b2tlbnMgdGhhdAotCSAgIHN0YXJ0IHdpdGggIyMgd2hpY2ggYXJlIHVzZWQgdG8gYWxpYXMgZXhpc3Rpbmcgc3RhbmRhcmQKLQkgICBwcm90b2NvbCBiaW5kaW5ncyBhbmQgc3VwcG9ydCBhbGlhc2VzIGZvciBuZXcgc3RhbmRhcmQKLQkgICBiaW5kaW5nIFVSSXMgdGhhdCBhcmUgaW50cm9kdWNlZCBpbiBmdXR1cmUgc3BlY2lmaWNhdGlvbnMuCi0KLQkgICBUaGUgZm9sbG93aW5nIHRva2VucyBhbGlhcyB0aGUgc3RhbmRhcmQgcHJvdG9jb2wgYmluZGluZwotCSAgIFVSSXM6Ci0KLQkgICAjI1NPQVAxMV9IVFRQID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC9odHRwIgotCSAgICMjU09BUDExX0hUVFBfTVRPTSA9Ci0gICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvaHR0cD9tdG9tPXRydWUiCi0gICAgICAgICAgICMjU09BUDEyX0hUVFAgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAvIgotICAgICAgICAgICAjI1NPQVAxMl9IVFRQX01UT00gPQotICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAvP210b209dHJ1ZSIKLSAgICAgICAgICAgIyNYTUxfSFRUUCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaHR0cCIKLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iIyMuKyIvPgotICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJzZXJ2aWNlLXJlZl9wcm90b2NvbC1iaW5kaW5nTGlzdFR5cGUiPgotICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICBEZWZpbmVzIHRoZSB0eXBlIHVzZWQgZm9yIHNwZWNpZnlpbmcgYSBsaXN0IG9mCi0JICAgcHJvdG9jb2wtYmluZGluZ1R5cGUocykuIEZvciBlLmcuCi0KLQkgICAgIyNTT0FQMTFfSFRUUCAjI1NPQVAxMl9IVFRQICMjWE1MX0hUVFAKLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOmxpc3QgaXRlbVR5cGU9ImphdmFlZTpzZXJ2aWNlLXJlZl9wcm90b2NvbC1iaW5kaW5nVHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InNlcnZpY2UtcmVmX3Byb3RvY29sLWJpbmRpbmdUeXBlIj4KLSAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JICAgRGVmaW5lcyB0aGUgdHlwZSB1c2VkIGZvciBzcGVjaWZ5aW5nIHRoZSBVUkkgZm9yIHRoZQotCSAgIHByb3RvY29sIGJpbmRpbmcgdXNlZCBieSB0aGUgcG9ydC1jb21wb25lbnQuICBGb3IKLQkgICBwb3J0YWJpbGl0eSBvbmUgY291bGQgdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRva2VucyB0aGF0Ci0JICAgYWxpYXMgdGhlIHN0YW5kYXJkIGJpbmRpbmcgdHlwZXM6Ci0KLQkgICAgIyNTT0FQMTFfSFRUUAotCSAgICAjI1NPQVAxMV9IVFRQX01UT00KLSAgICAgICAgICAgICMjU09BUDEyX0hUVFAKLSAgICAgICAgICAgICMjU09BUDEyX0hUVFBfTVRPTQotICAgICAgICAgICAgIyNYTUxfSFRUUAotCi0JICAgT3RoZXIgc3BlY2lmaWNhdGlvbnMgY291bGQgZGVmaW5lIHRva2VucyB0aGF0IHN0YXJ0IHdpdGggIyMKLQkgICB0byBhbGlhcyBuZXcgc3RhbmRhcmQgYmluZGluZyBVUklzIHRoYXQgYXJlIGludHJvZHVjZWQuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDp1bmlvbiBtZW1iZXJUeXBlcz0ieHNkOmFueVVSSSBqYXZhZWU6c2VydmljZS1yZWZfcHJvdG9jb2wtVVJJQWxpYXNUeXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ic2VydmljZS1yZWZfcW5hbWUtcGF0dGVybiI+Ci0gICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICAgVGhpcyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIFFOYW1lIHBhdHRlcm4gaW4gdGhlCi0JICAgICBhdHRyaWJ1dGUgc2VydmljZS1uYW1lLXBhdHRlcm4gYW5kIHBvcnQtbmFtZS1wYXR0ZXJuIGluCi0JICAgICB0aGUgaGFuZGxlci1jaGFpbiBlbGVtZW50Ci0KLQkgICAgIEZvciBleGFtcGxlLCB0aGUgdmFyaW91cyBmb3JtcyBhY2NlcHRhYmxlIGhlcmUgZm9yCi0JICAgICBzZXJ2aWNlLW5hbWUtcGF0dGVybiBhdHRyaWJ1dGUgaW4gaGFuZGxlci1jaGFpbiBlbGVtZW50Ci0JICAgICBhcmUgOgotCi0JICAgICBFeGFjdCBOYW1lOiBzZXJ2aWNlLW5hbWUtcGF0dGVybj0ibnMxOkVjaG9TZXJ2aWNlIgotCi0JCSBJbiB0aGlzIGNhc2UsIGhhbmRsZXJzIHNwZWNpZmllZCBpbiB0aGlzCi0JCSBoYW5kbGVyLWNoYWluIGVsZW1lbnQgd2lsbCBhcHBseSB0byBhbGwgcG9ydHMgd2l0aAotCQkgdGhpcyBleGFjdCBzZXJ2aWNlIG5hbWUuIFRoZSBuYW1lc3BhY2UgcHJlZml4IG11c3QKLQkJIGhhdmUgYmVlbiBkZWNsYXJlZCBpbiBhIG5hbWVzcGFjZSBkZWNsYXJhdGlvbgotCQkgYXR0cmlidXRlIGluIGVpdGhlciB0aGUgc3RhcnQtdGFnIG9mIHRoZSBlbGVtZW50Ci0JCSB3aGVyZSB0aGUgcHJlZml4IGlzIHVzZWQgb3IgaW4gYW4gYW4gYW5jZXN0b3IKLQkJIGVsZW1lbnQgKGkuZS4gYW4gZWxlbWVudCBpbiB3aG9zZSBjb250ZW50IHRoZQotCQkgcHJlZml4ZWQgbWFya3VwIG9jY3VycykKLQotCSAgICAgUGF0dGVybiA6IHNlcnZpY2UtbmFtZS1wYXR0ZXJuPSJuczE6RWNob1NlcnZpY2UqIgotCi0JCSBJbiB0aGlzIGNhc2UsIGhhbmRsZXJzIHNwZWNpZmllZCBpbiB0aGlzCi0JCSBoYW5kbGVyLWNoYWluIGVsZW1lbnQgd2lsbCBhcHBseSB0byBhbGwgcG9ydHMgd2hvc2UKLQkJIFNlcnZpY2UgbmFtZXMgYXJlIGxpa2UgRWNob1NlcnZpY2UxLCBFY2hvU2VydmljZUZvbwotCQkgZXRjLiBUaGUgbmFtZXNwYWNlIHByZWZpeCBtdXN0IGhhdmUgYmVlbiBkZWNsYXJlZCBpbgotCQkgYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gYXR0cmlidXRlIGluIGVpdGhlciB0aGUKLQkJIHN0YXJ0LXRhZyBvZiB0aGUgZWxlbWVudCB3aGVyZSB0aGUgcHJlZml4IGlzIHVzZWQgb3IKLQkJIGluIGFuIGFuIGFuY2VzdG9yIGVsZW1lbnQgKGkuZS4gYW4gZWxlbWVudCBpbiB3aG9zZQotCQkgY29udGVudCB0aGUgcHJlZml4ZWQgbWFya3VwIG9jY3VycykKLQotCSAgICAgV2lsZCBDYXJkIDogc2VydmljZS1uYW1lLXBhdHRlcm49IioiCi0KLQkJSW4gdGhpcyBjYXNlLCBoYW5kbGVycyBzcGVjaWZpZWQgaW4gdGhpcyBoYW5kbGVyLWNoYWluCi0JCWVsZW1lbnQgd2lsbCBhcHBseSB0byBwb3J0cyBvZiBhbGwgc2VydmljZSBuYW1lcy4KLQotCSAgICBUaGUgc2FtZSBjYW4gYmUgYXBwbGllZCB0byBwb3J0LW5hbWUgYXR0cmlidXRlIGluCi0JICAgIGhhbmRsZXItY2hhaW4gZWxlbWVudC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJcKnwoW1xpLVs6XV1bXGMtWzpdXSo6KT9bXGktWzpdXVtcYy1bOl1dKlwqPyIvPgotICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLQotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvanNwXzJfMC54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2pzcF8yXzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzBhNzZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvanNwXzJfMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjIuMCI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpanNwXzJfMC54c2RzCTEuMTcgMDMvMTgvMDMKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIENvcHlyaWdodCAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbwotICAgICAgUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cwotICAgICAgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBKU1AgMi4wIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICAgICAgdHlwZXMuICBUaGUgSlNQIDIuMCBzY2hlbWEgY29udGFpbnMgYWxsIHRoZSBzcGVjaWFsCi0gICAgICBzdHJ1Y3R1cmVzIGFuZCBkYXRhdHlwZXMgdGhhdCBhcmUgbmVjZXNzYXJ5IHRvIHVzZSBKU1AgZmlsZXMKLSAgICAgIGZyb20gYSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIHNjaGVtYSBpcyB1c2VkIGJ5IHRoZSB3ZWItYXBwXzJfNC54c2QKLSAgICAgIGZpbGUgdG8gZGVmaW5lIEpTUCBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKMkVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLQlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0JcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iajJlZV8xXzQueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ianNwLWNvbmZpZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBqc3AtY29uZmlnVHlwZSBpcyB1c2VkIHRvIHByb3ZpZGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24KLQlpbmZvcm1hdGlvbiBmb3IgdGhlIEpTUCBmaWxlcyBpbiBhIHdlYiBhcHBsaWNhdGlvbi4gSXQgaGFzCi0JdHdvIHN1YmVsZW1lbnRzLCB0YWdsaWIgYW5kIGpzcC1wcm9wZXJ0eS1ncm91cC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWIiCi0JCSAgIHR5cGU9ImoyZWU6dGFnbGliVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpzcC1wcm9wZXJ0eS1ncm91cCIKLQkJICAgdHlwZT0iajJlZTpqc3AtcHJvcGVydHktZ3JvdXBUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ianNwLWZpbGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUganNwLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbCBwYXRoIHRvIGEgSlNQIGZpbGUKLQl3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBiZWdpbm5pbmcgd2l0aCBhIGAvJy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnBhdGhUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpzcC1wcm9wZXJ0eS1ncm91cFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBqc3AtcHJvcGVydHktZ3JvdXBUeXBlIGlzIHVzZWQgdG8gZ3JvdXAgYSBudW1iZXIgb2YKLQlmaWxlcyBzbyB0aGV5IGNhbiBiZSBnaXZlbiBnbG9iYWwgcHJvcGVydHkgaW5mb3JtYXRpb24uCi0JQWxsIGZpbGVzIHNvIGRlc2NyaWJlZCBhcmUgZGVlbWVkIHRvIGJlIEpTUCBmaWxlcy4gIFRoZQotCWZvbGxvd2luZyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgY2FuIGJlIGRlc2NyaWJlZDoKLQotCSAgICAtIENvbnRyb2wgd2hldGhlciBFTCBpcyBpZ25vcmVkCi0JICAgIC0gQ29udHJvbCB3aGV0aGVyIHNjcmlwdGluZyBlbGVtZW50cyBhcmUgaW52YWxpZAotCSAgICAtIEluZGljYXRlIHBhZ2VFbmNvZGluZyBpbmZvcm1hdGlvbi4KLQkgICAgLSBJbmRpY2F0ZSB0aGF0IGEgcmVzb3VyY2UgaXMgYSBKU1AgZG9jdW1lbnQgKFhNTCkKLQkgICAgLSBQcmVsdWRlIGFuZCBDb2RhIGF1dG9tYXRpYyBpbmNsdWRlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLQkJICAgdHlwZT0iajJlZTp1cmwtcGF0dGVyblR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWwtaWdub3JlZCIKLQkJICAgdHlwZT0iajJlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgQ2FuIGJlIHVzZWQgdG8gZWFzaWx5IHNldCB0aGUgaXNFTElnbm9yZWQKLQkgICAgcHJvcGVydHkgb2YgYSBncm91cCBvZiBKU1AgcGFnZXMuICBCeSBkZWZhdWx0LCB0aGUKLQkgICAgRUwgZXZhbHVhdGlvbiBpcyBlbmFibGVkIGZvciBXZWIgQXBwbGljYXRpb25zIHVzaW5nCi0JICAgIGEgU2VydmxldCAyLjQgb3IgZ3JlYXRlciB3ZWIueG1sLCBhbmQgZGlzYWJsZWQKLQkgICAgb3RoZXJ3aXNlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhZ2UtZW5jb2RpbmciCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgdmFsaWQgdmFsdWVzIG9mIHBhZ2UtZW5jb2RpbmcgYXJlIHRob3NlIG9mIHRoZQotCSAgICBwYWdlRW5jb2RpbmcgcGFnZSBkaXJlY3RpdmUuICBJdCBpcyBhCi0JICAgIHRyYW5zbGF0aW9uLXRpbWUgZXJyb3IgdG8gbmFtZSBkaWZmZXJlbnQgZW5jb2RpbmdzCi0JICAgIGluIHRoZSBwYWdlRW5jb2RpbmcgYXR0cmlidXRlIG9mIHRoZSBwYWdlIGRpcmVjdGl2ZQotCSAgICBvZiBhIEpTUCBwYWdlIGFuZCBpbiBhIEpTUCBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgICAgbWF0Y2hpbmcgdGhlIHBhZ2UuICBJdCBpcyBhbHNvIGEgdHJhbnNsYXRpb24tdGltZQotCSAgICBlcnJvciB0byBuYW1lIGRpZmZlcmVudCBlbmNvZGluZ3MgaW4gdGhlIHByb2xvZwotCSAgICBvciB0ZXh0IGRlY2xhcmF0aW9uIG9mIGEgZG9jdW1lbnQgaW4gWE1MIHN5bnRheCBhbmQKLQkgICAgaW4gYSBKU1AgY29uZmlndXJhdGlvbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBkb2N1bWVudC4KLQkgICAgSXQgaXMgbGVnYWwgdG8gbmFtZSB0aGUgc2FtZSBlbmNvZGluZyB0aHJvdWdoCi0JICAgIG11bGl0cGxlIG1lY2hhbmlzbXMuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NyaXB0aW5nLWludmFsaWQiCi0JCSAgIHR5cGU9ImoyZWU6dHJ1ZS1mYWxzZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIENhbiBiZSB1c2VkIHRvIGVhc2lseSBkaXNhYmxlIHNjcmlwdGluZyBpbiBhCi0JICAgIGdyb3VwIG9mIEpTUCBwYWdlcy4gIEJ5IGRlZmF1bHQsIHNjcmlwdGluZyBpcwotCSAgICBlbmFibGVkLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlzLXhtbCIKLQkJICAgdHlwZT0iajJlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgSWYgdHJ1ZSwgZGVub3RlcyB0aGF0IHRoZSBncm91cCBvZiByZXNvdXJjZXMKLQkgICAgdGhhdCBtYXRjaCB0aGUgVVJMIHBhdHRlcm4gYXJlIEpTUCBkb2N1bWVudHMsCi0JICAgIGFuZCB0aHVzIG11c3QgYmUgaW50ZXJwcmV0ZWQgYXMgWE1MIGRvY3VtZW50cy4KLQkgICAgSWYgZmFsc2UsIHRoZSByZXNvdXJjZXMgYXJlIGFzc3VtZWQgdG8gbm90Ci0JICAgIGJlIEpTUCBkb2N1bWVudHMsIHVubGVzcyB0aGVyZSBpcyBhbm90aGVyCi0JICAgIHByb3BlcnR5IGdyb3VwIHRoYXQgaW5kaWNhdGVzIG90aGVyd2lzZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmNsdWRlLXByZWx1ZGUiCi0JCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgaW5jbHVkZS1wcmVsdWRlIGVsZW1lbnQgaXMgYSBjb250ZXh0LXJlbGF0aXZlCi0JICAgIHBhdGggdGhhdCBtdXN0IGNvcnJlc3BvbmQgdG8gYW4gZWxlbWVudCBpbiB0aGUKLQkgICAgV2ViIEFwcGxpY2F0aW9uLiAgV2hlbiB0aGUgZWxlbWVudCBpcyBwcmVzZW50LAotCSAgICB0aGUgZ2l2ZW4gcGF0aCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgKGFzCi0JICAgIGluIGFuIGluY2x1ZGUgZGlyZWN0aXZlKSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2gKLQkgICAgSlNQIHBhZ2UgaW4gdGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5jbHVkZS1jb2RhIgotCQkgICB0eXBlPSJqMmVlOnBhdGhUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGluY2x1ZGUtY29kYSBlbGVtZW50IGlzIGEgY29udGV4dC1yZWxhdGl2ZQotCSAgICBwYXRoIHRoYXQgbXVzdCBjb3JyZXNwb25kIHRvIGFuIGVsZW1lbnQgaW4gdGhlCi0JICAgIFdlYiBBcHBsaWNhdGlvbi4gIFdoZW4gdGhlIGVsZW1lbnQgaXMgcHJlc2VudCwKLQkgICAgdGhlIGdpdmVuIHBhdGggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIChhcwotCSAgICBpbiBhbiBpbmNsdWRlIGRpcmVjdGl2ZSkgYXQgdGhlIGVuZCBvZiBlYWNoCi0JICAgIEpTUCBwYWdlIGluIHRoaXMganNwLXByb3BlcnR5LWdyb3VwLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhZ2xpYlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0YWdsaWJUeXBlIGRlZmluZXMgdGhlIHN5bnRheCBmb3IgZGVjbGFyaW5nIGluCi0JdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0aGF0IGEgdGFnIGxpYnJhcnkgaXMKLQlhdmFpbGFibGUgdG8gdGhlIGFwcGxpY2F0aW9uLiAgVGhpcyBjYW4gYmUgZG9uZQotCXRvIG92ZXJyaWRlIGltcGxpY2l0IG1hcCBlbnRyaWVzIGZyb20gVExEIGZpbGVzIGFuZAotCWZyb20gdGhlIGNvbnRhaW5lci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWItdXJpIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIEEgdGFnbGliLXVyaSBlbGVtZW50IGRlc2NyaWJlcyBhIFVSSSBpZGVudGlmeWluZyBhCi0JICAgIHRhZyBsaWJyYXJ5IHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gIFRoZSBib2R5Ci0JICAgIG9mIHRoZSB0YWdsaWItdXJpIGVsZW1lbnQgbWF5IGJlIGVpdGhlciBhbgotCSAgICBhYnNvbHV0ZSBVUkkgc3BlY2lmaWNhdGlvbiwgb3IgYSByZWxhdGl2ZSBVUkkuCi0JICAgIFRoZXJlIHNob3VsZCBiZSBubyBlbnRyaWVzIGluIHdlYi54bWwgd2l0aCB0aGUKLQkgICAgc2FtZSB0YWdsaWItdXJpIHZhbHVlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliLWxvY2F0aW9uIgotCQkgICB0eXBlPSJqMmVlOnBhdGhUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgdGhlIHRhZ2xpYi1sb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbgotCSAgICAoYXMgYSByZXNvdXJjZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViCi0JICAgIGFwcGxpY2F0aW9uKSB3aGVyZSB0byBmaW5kIHRoZSBUYWcgTGlicmFyeQotCSAgICBEZXNjcmlwdGlvbiBmaWxlIGZvciB0aGUgdGFnIGxpYnJhcnkuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvanNwXzJfMS54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL2pzcF8yXzEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjYzMzg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvanNwXzJfMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjIuMSI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpanNwXzJfMS54c2RzCTEuNSAwOC8xMS8wNQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICAgICAgVS5TLkEKLSAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBKU1AgMi4xIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICAgICAgdHlwZXMuICBUaGUgSlNQIDIuMSBzY2hlbWEgY29udGFpbnMgYWxsIHRoZSBzcGVjaWFsCi0gICAgICBzdHJ1Y3R1cmVzIGFuZCBkYXRhdHlwZXMgdGhhdCBhcmUgbmVjZXNzYXJ5IHRvIHVzZSBKU1AgZmlsZXMKLSAgICAgIGZyb20gYSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIHNjaGVtYSBpcyB1c2VkIGJ5IHRoZSB3ZWItYXBwXzJfNS54c2QKLSAgICAgIGZpbGUgdG8gZGVmaW5lIEpTUCBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKYXZhIEVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLQlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0JcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iamF2YWVlXzUueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ianNwLWNvbmZpZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBqc3AtY29uZmlnVHlwZSBpcyB1c2VkIHRvIHByb3ZpZGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24KLQlpbmZvcm1hdGlvbiBmb3IgdGhlIEpTUCBmaWxlcyBpbiBhIHdlYiBhcHBsaWNhdGlvbi4gSXQgaGFzCi0JdHdvIHN1YmVsZW1lbnRzLCB0YWdsaWIgYW5kIGpzcC1wcm9wZXJ0eS1ncm91cC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWIiCi0JCSAgIHR5cGU9ImphdmFlZTp0YWdsaWJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ianNwLXByb3BlcnR5LWdyb3VwIgotCQkgICB0eXBlPSJqYXZhZWU6anNwLXByb3BlcnR5LWdyb3VwVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpzcC1maWxlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGpzcC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGwgcGF0aCB0byBhIEpTUCBmaWxlCi0Jd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24gYmVnaW5uaW5nIHdpdGggYSBgLycuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnBhdGhUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpzcC1wcm9wZXJ0eS1ncm91cFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBqc3AtcHJvcGVydHktZ3JvdXBUeXBlIGlzIHVzZWQgdG8gZ3JvdXAgYSBudW1iZXIgb2YKLQlmaWxlcyBzbyB0aGV5IGNhbiBiZSBnaXZlbiBnbG9iYWwgcHJvcGVydHkgaW5mb3JtYXRpb24uCi0JQWxsIGZpbGVzIHNvIGRlc2NyaWJlZCBhcmUgZGVlbWVkIHRvIGJlIEpTUCBmaWxlcy4gIFRoZQotCWZvbGxvd2luZyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgY2FuIGJlIGRlc2NyaWJlZDoKLQotCSAgICAtIENvbnRyb2wgd2hldGhlciBFTCBpcyBpZ25vcmVkLgotCSAgICAtIENvbnRyb2wgd2hldGhlciBzY3JpcHRpbmcgZWxlbWVudHMgYXJlIGludmFsaWQuCi0JICAgIC0gSW5kaWNhdGUgcGFnZUVuY29kaW5nIGluZm9ybWF0aW9uLgotCSAgICAtIEluZGljYXRlIHRoYXQgYSByZXNvdXJjZSBpcyBhIEpTUCBkb2N1bWVudCAoWE1MKS4KLQkgICAgLSBQcmVsdWRlIGFuZCBDb2RhIGF1dG9tYXRpYyBpbmNsdWRlcy4KLSAgICAgICAgICAgIC0gQ29udHJvbCB3aGV0aGVyIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgI3sgaXMgYWxsb3dlZAotICAgICAgICAgICAgICB3aGVuIHVzZWQgYXMgYSBTdHJpbmcgbGl0ZXJhbC4KLSAgICAgICAgICAgIC0gQ29udHJvbCB3aGV0aGVyIHRlbXBsYXRlIHRleHQgY29udGFpbmluZyBvbmx5Ci0gICAgICAgICAgICAgIHdoaXRlc3BhY2VzIG11c3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSByZXNwb25zZSBvdXRwdXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLQkJICAgdHlwZT0iamF2YWVlOnVybC1wYXR0ZXJuVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbC1pZ25vcmVkIgotCQkgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIENhbiBiZSB1c2VkIHRvIGVhc2lseSBzZXQgdGhlIGlzRUxJZ25vcmVkCi0JICAgIHByb3BlcnR5IG9mIGEgZ3JvdXAgb2YgSlNQIHBhZ2VzLiAgQnkgZGVmYXVsdCwgdGhlCi0JICAgIEVMIGV2YWx1YXRpb24gaXMgZW5hYmxlZCBmb3IgV2ViIEFwcGxpY2F0aW9ucyB1c2luZwotCSAgICBhIFNlcnZsZXQgMi40IG9yIGdyZWF0ZXIgd2ViLnhtbCwgYW5kIGRpc2FibGVkCi0JICAgIG90aGVyd2lzZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWdlLWVuY29kaW5nIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgdmFsaWQgdmFsdWVzIG9mIHBhZ2UtZW5jb2RpbmcgYXJlIHRob3NlIG9mIHRoZQotCSAgICBwYWdlRW5jb2RpbmcgcGFnZSBkaXJlY3RpdmUuICBJdCBpcyBhCi0JICAgIHRyYW5zbGF0aW9uLXRpbWUgZXJyb3IgdG8gbmFtZSBkaWZmZXJlbnQgZW5jb2RpbmdzCi0JICAgIGluIHRoZSBwYWdlRW5jb2RpbmcgYXR0cmlidXRlIG9mIHRoZSBwYWdlIGRpcmVjdGl2ZQotCSAgICBvZiBhIEpTUCBwYWdlIGFuZCBpbiBhIEpTUCBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgICAgbWF0Y2hpbmcgdGhlIHBhZ2UuICBJdCBpcyBhbHNvIGEgdHJhbnNsYXRpb24tdGltZQotCSAgICBlcnJvciB0byBuYW1lIGRpZmZlcmVudCBlbmNvZGluZ3MgaW4gdGhlIHByb2xvZwotCSAgICBvciB0ZXh0IGRlY2xhcmF0aW9uIG9mIGEgZG9jdW1lbnQgaW4gWE1MIHN5bnRheCBhbmQKLQkgICAgaW4gYSBKU1AgY29uZmlndXJhdGlvbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBkb2N1bWVudC4KLQkgICAgSXQgaXMgbGVnYWwgdG8gbmFtZSB0aGUgc2FtZSBlbmNvZGluZyB0aHJvdWdoCi0JICAgIG11bGl0cGxlIG1lY2hhbmlzbXMuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NyaXB0aW5nLWludmFsaWQiCi0JCSAgIHR5cGU9ImphdmFlZTp0cnVlLWZhbHNlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgQ2FuIGJlIHVzZWQgdG8gZWFzaWx5IGRpc2FibGUgc2NyaXB0aW5nIGluIGEKLQkgICAgZ3JvdXAgb2YgSlNQIHBhZ2VzLiAgQnkgZGVmYXVsdCwgc2NyaXB0aW5nIGlzCi0JICAgIGVuYWJsZWQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaXMteG1sIgotCQkgICB0eXBlPSJqYXZhZWU6dHJ1ZS1mYWxzZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIElmIHRydWUsIGRlbm90ZXMgdGhhdCB0aGUgZ3JvdXAgb2YgcmVzb3VyY2VzCi0JICAgIHRoYXQgbWF0Y2ggdGhlIFVSTCBwYXR0ZXJuIGFyZSBKU1AgZG9jdW1lbnRzLAotCSAgICBhbmQgdGh1cyBtdXN0IGJlIGludGVycHJldGVkIGFzIFhNTCBkb2N1bWVudHMuCi0JICAgIElmIGZhbHNlLCB0aGUgcmVzb3VyY2VzIGFyZSBhc3N1bWVkIHRvIG5vdAotCSAgICBiZSBKU1AgZG9jdW1lbnRzLCB1bmxlc3MgdGhlcmUgaXMgYW5vdGhlcgotCSAgICBwcm9wZXJ0eSBncm91cCB0aGF0IGluZGljYXRlcyBvdGhlcndpc2UuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5jbHVkZS1wcmVsdWRlIgotCQkgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgaW5jbHVkZS1wcmVsdWRlIGVsZW1lbnQgaXMgYSBjb250ZXh0LXJlbGF0aXZlCi0JICAgIHBhdGggdGhhdCBtdXN0IGNvcnJlc3BvbmQgdG8gYW4gZWxlbWVudCBpbiB0aGUKLQkgICAgV2ViIEFwcGxpY2F0aW9uLiAgV2hlbiB0aGUgZWxlbWVudCBpcyBwcmVzZW50LAotCSAgICB0aGUgZ2l2ZW4gcGF0aCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgKGFzCi0JICAgIGluIGFuIGluY2x1ZGUgZGlyZWN0aXZlKSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2gKLQkgICAgSlNQIHBhZ2UgaW4gdGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5jbHVkZS1jb2RhIgotCQkgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgaW5jbHVkZS1jb2RhIGVsZW1lbnQgaXMgYSBjb250ZXh0LXJlbGF0aXZlCi0JICAgIHBhdGggdGhhdCBtdXN0IGNvcnJlc3BvbmQgdG8gYW4gZWxlbWVudCBpbiB0aGUKLQkgICAgV2ViIEFwcGxpY2F0aW9uLiAgV2hlbiB0aGUgZWxlbWVudCBpcyBwcmVzZW50LAotCSAgICB0aGUgZ2l2ZW4gcGF0aCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgKGFzCi0JICAgIGluIGFuIGluY2x1ZGUgZGlyZWN0aXZlKSBhdCB0aGUgZW5kIG9mIGVhY2gKLQkgICAgSlNQIHBhZ2UgaW4gdGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmZXJyZWQtc3ludGF4LWFsbG93ZWQtYXMtbGl0ZXJhbCIKLQkJICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgIFRoZSBjaGFyYWN0ZXIgc2VxdWVuY2UgI3sgaXMgcmVzZXJ2ZWQgZm9yIEVMIGV4cHJlc3Npb25zLgotICAgICAgICAgICAgIENvbnNlcXVlbnRseSwgYSB0cmFuc2xhdGlvbiBlcnJvciBvY2N1cnMgaWYgdGhlICN7Ci0gICAgICAgICAgICAgY2hhcmFjdGVyIHNlcXVlbmNlIGlzIHVzZWQgYXMgYSBTdHJpbmcgbGl0ZXJhbCwgdW5sZXNzCi0gICAgICAgICAgICAgdGhpcyBlbGVtZW50IGlzIGVuYWJsZWQgKHRydWUpLiBEaXNhYmxlZCAoZmFsc2UpIGJ5Ci0gICAgICAgICAgICAgZGVmYXVsdC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmltLWRpcmVjdGl2ZS13aGl0ZXNwYWNlcyIKLQkJICAgdHlwZT0iamF2YWVlOnRydWUtZmFsc2VUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgIEluZGljYXRlcyB0aGF0IHRlbXBsYXRlIHRleHQgY29udGFpbmluZyBvbmx5IHdoaXRlc3BhY2VzCi0gICAgICAgICAgICAgbXVzdCBiZSByZW1vdmVkIGZyb20gdGhlIHJlc3BvbnNlIG91dHB1dC4gSXQgaGFzIG5vCi0gICAgICAgICAgICAgZWZmZWN0IG9uIEpTUCBkb2N1bWVudHMgKFhNTCBzeW50YXgpLiBEaXNhYmxlZCAoZmFsc2UpCi0gICAgICAgICAgICAgYnkgZGVmYXVsdC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWdsaWJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdGFnbGliVHlwZSBkZWZpbmVzIHRoZSBzeW50YXggZm9yIGRlY2xhcmluZyBpbgotCXRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgdGhhdCBhIHRhZyBsaWJyYXJ5IGlzCi0JYXZhaWxhYmxlIHRvIHRoZSBhcHBsaWNhdGlvbi4gIFRoaXMgY2FuIGJlIGRvbmUKLQl0byBvdmVycmlkZSBpbXBsaWNpdCBtYXAgZW50cmllcyBmcm9tIFRMRCBmaWxlcyBhbmQKLQlmcm9tIHRoZSBjb250YWluZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliLXVyaSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIEEgdGFnbGliLXVyaSBlbGVtZW50IGRlc2NyaWJlcyBhIFVSSSBpZGVudGlmeWluZyBhCi0JICAgIHRhZyBsaWJyYXJ5IHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gIFRoZSBib2R5Ci0JICAgIG9mIHRoZSB0YWdsaWItdXJpIGVsZW1lbnQgbWF5IGJlIGVpdGhlciBhbgotCSAgICBhYnNvbHV0ZSBVUkkgc3BlY2lmaWNhdGlvbiwgb3IgYSByZWxhdGl2ZSBVUkkuCi0JICAgIFRoZXJlIHNob3VsZCBiZSBubyBlbnRyaWVzIGluIHdlYi54bWwgd2l0aCB0aGUKLQkgICAgc2FtZSB0YWdsaWItdXJpIHZhbHVlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliLWxvY2F0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6cGF0aFR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICB0aGUgdGFnbGliLWxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uCi0JICAgIChhcyBhIHJlc291cmNlIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWIKLQkgICAgYXBwbGljYXRpb24pIHdoZXJlIHRvIGZpbmQgdGhlIFRhZyBMaWJyYXJ5Ci0JICAgIERlc2NyaXB0aW9uIGZpbGUgZm9yIHRoZSB0YWcgbGlicmFyeS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9vcm1fMV8wLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvb3JtXzFfMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZDljNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy9vcm1fMV8wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1NjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gSmF2YSBQZXJzaXN0ZW5jZSBBUEkgb2JqZWN0LXJlbGF0aW9uYWwgbWFwcGluZyBmaWxlIHNjaGVtYSAtLT4KLTx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6b3JtPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9vcm0iIAotICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIAotICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIAotICB2ZXJzaW9uPSIxLjAiPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpb3JtXzFfMC54c2QgMS4wICBGZWIgMTQgMjAwNgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KLQotICAgICAgQ29weXJpZ2h0IDIwMDUtMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbgotICAgICAgRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlCi0gICAgICAiTGljZW5zZSIpLiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gICAgICB0aGUgTGljZW5zZS4gWW91IGNhbiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgICBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMLmh0bWwgb3IKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKLSAgICAgIExpY2Vuc2UuCi0KLSAgICAgIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyCi0gICAgICBOb3RpY2UgaW4gZWFjaCBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gICAgICBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzCi0gICAgICBwcm92aWRlZCBieSBTdW4gaW4gdGhlIEdQTCBWZXJzaW9uIDIgc2VjdGlvbiBvZiB0aGUgTGljZW5zZSBmaWxlCi0gICAgICB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4gIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nCi0gICAgICBiZWxvdyB0aGUgTGljZW5zZSBIZWFkZXIsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBbXQotICAgICAgcmVwbGFjZWQgYnkgeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb246Ci0gICAgICAiUG9ydGlvbnMgQ29weXJpZ2h0ZWQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCi0KLSAgICAgIENvbnRyaWJ1dG9yKHMpOgotCi0gICAgICBJZiB5b3Ugd2lzaCB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHRvIGJlIGdvdmVybmVkIGJ5IG9ubHkgdGhlCi0gICAgICBDRERMIG9yIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nCi0gICAgICAiW0NvbnRyaWJ1dG9yXSBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMKLSAgICAgIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgW0NEREwgb3IgR1BMIFZlcnNpb24gMl0gbGljZW5zZS4iICBJZiB5b3UKLSAgICAgIGRvbid0IGluZGljYXRlIGEgc2luZ2xlIGNob2ljZSBvZiBsaWNlbnNlLCBhIHJlY2lwaWVudCBoYXMgdGhlCi0gICAgICBvcHRpb24gdG8gZGlzdHJpYnV0ZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUKLSAgICAgIENEREwsIHRoZSBHUEwgVmVyc2lvbiAyIG9yIHRvIGV4dGVuZCB0aGUgY2hvaWNlIG9mIGxpY2Vuc2UgdG8gaXRzCi0gICAgICBsaWNlbnNlZXMgYXMgcHJvdmlkZWQgYWJvdmUuICBIb3dldmVyLCBpZiB5b3UgYWRkIEdQTCBWZXJzaW9uIDIKLSAgICAgIGNvZGUgYW5kIHRoZXJlZm9yZSwgZWxlY3RlZCB0aGUgR1BMIFZlcnNpb24gMiBsaWNlbnNlLCB0aGVuIHRoZQotICAgICAgb3B0aW9uIGFwcGxpZXMgb25seSBpZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHN1Y2gKLSAgICAgIG9wdGlvbiBieSB0aGUgY29weXJpZ2h0IGhvbGRlci4KLQotICAgICAgVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMKLSAgICAgIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgQ0RETCBsaWNlbnNlLgotICAgICAgCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj48IVtDREFUQVsKLQotICAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBwZXJzaXN0ZW5jZSBvYmplY3QtcmVsYXRpb25hbCAKLSAgICAgICBtYXBwaW5nIGZpbGUuCi0gICAgICAgVGhlIGZpbGUgbWF5IGJlIG5hbWVkICJNRVRBLUlORi9vcm0ueG1sIiBpbiB0aGUgcGVyc2lzdGVuY2UgCi0gICAgICAgYXJjaGl2ZSBvciBpdCBtYXkgYmUgbmFtZWQgc29tZSBvdGhlciBuYW1lIHdoaWNoIHdvdWxkIGJlIAotICAgICAgIHVzZWQgdG8gbG9jYXRlIHRoZSBmaWxlIGFzIHJlc291cmNlIG9uIHRoZSBjbGFzc3BhdGguCi0KLSAgICAgXV0+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtcHR5VHlwZSIvPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ2ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbMC05XSsoXC5bMC05XSspKiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LW1hcHBpbmdzIj4KLSAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVudGl0eS1tYXBwaW5ncyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYW4gbWFwcGluZwotICAgICAgICBmaWxlLiBJdCBjb250YWlucyB0aGUgZm9sbG93aW5nIGZvdXIgdHlwZXMgb2YgZWxlbWVudHM6Ci0KLSAgICAgICAgMS4gVGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBjb250YWlucyBtZXRhZGF0YQotICAgICAgICBmb3IgdGhlIGVudGlyZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgaWYgdGhpcyBlbGVtZW50Ci0gICAgICAgIG9jY3VycyBpbiBtdWx0aXBsZSBtYXBwaW5nIGZpbGVzIHdpdGhpbiB0aGUgc2FtZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAKLSAgICAgICAgMi4gVGhlIHBhY2thZ2UsIHNjaGVtYSwgY2F0YWxvZyBhbmQgYWNjZXNzIGVsZW1lbnRzIGFwcGx5IHRvIGFsbCBvZgotICAgICAgICB0aGUgZW50aXR5LCBtYXBwZWQtc3VwZXJjbGFzcyBhbmQgZW1iZWRkYWJsZSBlbGVtZW50cyBkZWZpbmVkIGluCi0gICAgICAgIHRoZSBzYW1lIGZpbGUgaW4gd2hpY2ggdGhleSBvY2N1ci4KLQotICAgICAgICAzLiBUaGUgc2VxdWVuY2UtZ2VuZXJhdG9yLCB0YWJsZS1nZW5lcmF0b3IsIG5hbWVkLXF1ZXJ5LAotICAgICAgICBuYW1lZC1uYXRpdmUtcXVlcnkgYW5kIHNxbC1yZXN1bHQtc2V0LW1hcHBpbmcgZWxlbWVudHMgYXJlIGdsb2JhbAotICAgICAgICB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZQotICAgICAgICBzZXF1ZW5jZS1nZW5lcmF0b3Igb3IgdGFibGUtZ2VuZXJhdG9yIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNhbWUKLSAgICAgICAgb3IgZGlmZmVyZW50IG1hcHBpbmcgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyBhbHNvIAotICAgICAgICB1bmRlZmluZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIG5hbWVkLXF1ZXJ5IG9yIG5hbWVkLW5hdGl2ZS1xdWVyeQotICAgICAgICBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lIG9yIGRpZmZlcmVudCBtYXBwaW5nIGZpbGVzIGluIGEgCi0gICAgICAgIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgICAgNC4gVGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZWFjaCBkZWZpbmUKLSAgICAgICAgdGhlIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIGEgbWFuYWdlZCBwZXJzaXN0ZW50IGNsYXNzLiBUaGUgbWFwcGluZwotICAgICAgICBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlc2UgZWxlbWVudHMgbWF5IGJlIGNvbXBsZXRlIG9yIGl0IG1heQotICAgICAgICBiZSBwYXJ0aWFsLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIiAKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWNrYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1uYXRpdmUtcXVlcnkiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIiB0eXBlPSJvcm06bWFwcGVkLXN1cGVyY2xhc3MiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5IiB0eXBlPSJvcm06ZW50aXR5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGFibGUiIHR5cGU9Im9ybTplbWJlZGRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb25UeXBlIiAKLSAgICAgICAgICAgICAgICAgICAgIGZpeGVkPSIxLjAiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPC94c2Q6ZWxlbWVudD4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgTWV0YWRhdGEgdGhhdCBhcHBsaWVzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFuZCBub3QganVzdCB0byAKLSAgICAgICAgdGhlIG1hcHBpbmcgZmlsZSBpbiB3aGljaCBpdCBpcyBjb250YWluZWQuIAotCi0gICAgICAgIElmIHRoZSB4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSBlbGVtZW50IGlzIHNwZWNpZmllZCB0aGVuIAotICAgICAgICB0aGUgY29tcGxldGUgc2V0IG9mIG1hcHBpbmcgbWV0YWRhdGEgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0IAotICAgICAgICBpcyBjb250YWluZWQgaW4gdGhlIFhNTCBtYXBwaW5nIGZpbGVzIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ieG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGVzZSBkZWZhdWx0cyBhcmUgYXBwbGllZCB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhcyBhIHdob2xlIAotICAgICAgICB1bmxlc3MgdGhleSBhcmUgb3ZlcnJpZGRlbiBieSBsb2NhbCBhbm5vdGF0aW9uIG9yIFhNTCAKLSAgICAgICAgZWxlbWVudCBzZXR0aW5ncy4gCi0gICAgICAgIAotICAgICAgICBzY2hlbWEgLSBVc2VkIGFzIHRoZSBzY2hlbWEgZm9yIGFsbCB0YWJsZXMgb3Igc2Vjb25kYXJ5IHRhYmxlcwotICAgICAgICAgICAgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBjYXRhbG9nIC0gVXNlZCBhcyB0aGUgY2F0YWxvZyBmb3IgYWxsIHRhYmxlcyBvciBzZWNvbmRhcnkgdGFibGVzCi0gICAgICAgICAgICB0aGF0IGFwcGx5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGFjY2VzcyAtIFVzZWQgYXMgdGhlIGFjY2VzcyB0eXBlIGZvciBhbGwgbWFuYWdlZCBjbGFzc2VzIGluCi0gICAgICAgICAgICB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBjYXNjYWRlLXBlcnNpc3QgLSBBZGRzIGNhc2NhZGUtcGVyc2lzdCB0byB0aGUgc2V0IG9mIGNhc2NhZGUgb3B0aW9ucwotICAgICAgICAgICAgaW4gZW50aXR5IHJlbGF0aW9uc2hpcHMgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgZW50aXR5LWxpc3RlbmVycyAtIExpc3Qgb2YgZGVmYXVsdCBlbnRpdHkgbGlzdGVuZXJzIHRvIGJlIGludm9rZWQgCi0gICAgICAgICAgICBvbiBlYWNoIGVudGl0eSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhbiBlbnRpdHkuIElzIGFsbG93ZWQgdG8gYmUKLSAgICAgICAgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGFubm90YXRpb25zLgotICAgICAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIAotICAgICAgICBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIG9uIHRoZSBlbnRpdHkgY2xhc3MgKGFuZCBpdHMgZmllbGRzCi0gICAgICAgIG9yIHByb3BlcnRpZXMpIGFyZSB0byBiZSBwcm9jZXNzZWQuIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiAKLSAgICAgICAgdGhlIGRlZmF1bHRpbmcgcnVsZXMgZm9yIHRoZSBlbnRpdHkgYW5kIGl0cyBzdWJlbGVtZW50cyB3aWxsIAotICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZSIgdHlwZT0ib3JtOnRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWNvbmRhcnktdGFibGUiIHR5cGU9Im9ybTpzZWNvbmRhcnktdGFibGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5oZXJpdGFuY2UiIHR5cGU9Im9ybTppbmhlcml0YW5jZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdmFsdWUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZXMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgY29udGFpbnMgdGhlIGVudGl0eSBmaWVsZCBvciBwcm9wZXJ0eSBtYXBwaW5ncy4KLSAgICAgICAgSXQgbWF5IGJlIHNwYXJzZWx5IHBvcHVsYXRlZCB0byBpbmNsdWRlIG9ubHkgYSBzdWJzZXQgb2YgdGhlCi0gICAgICAgIGZpZWxkcyBvciBwcm9wZXJ0aWVzLiBJZiBtZXRhZGF0YS1jb21wbGV0ZSBmb3IgdGhlIGVudGl0eSBpcyB0cnVlCi0gICAgICAgIHRoZW4gdGhlIHJlbWFpbmRlciBvZiB0aGUgYXR0cmlidXRlcyB3aWxsIGJlIGRlZmF1bHRlZCBhY2NvcmRpbmcKLSAgICAgICAgdG8gdGhlIGRlZmF1bHQgcnVsZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0ib3JtOmlkIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkLWlkIiB0eXBlPSJvcm06ZW1iZWRkZWQtaWQiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMiIHR5cGU9Im9ybTpiYXNpYyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tb25lIiB0eXBlPSJvcm06bWFueS10by1vbmUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1tYW55IiB0eXBlPSJvcm06b25lLXRvLW1hbnkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1vbmUiIHR5cGU9Im9ybTpvbmUtdG8tb25lIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW1hbnkiIHR5cGU9Im9ybTptYW55LXRvLW1hbnkiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRlZCIgdHlwZT0ib3JtOmVtYmVkZGVkIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2llbnQiIHR5cGU9Im9ybTp0cmFuc2llbnQiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImFjY2Vzcy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBlbGVtZW50IGRldGVybWluZXMgaG93IHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBhY2Nlc3NlcyB0aGUKLSAgICAgICAgc3RhdGUgb2YgYW4gZW50aXR5IG9yIGVtYmVkZGVkIG9iamVjdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBST1BFUlRZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSUVMRCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlMaXN0ZW5lcnMgewotICAgICAgICAgIENsYXNzW10gdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXIiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWxpc3RlbmVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyBhbiBlbnRpdHkgbGlzdGVuZXIgdG8gYmUgaW52b2tlZCBhdCBsaWZlY3ljbGUgZXZlbnRzCi0gICAgICAgIGZvciB0aGUgZW50aXRpZXMgdGhhdCBsaXN0IHRoaXMgbGlzdGVuZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVQZXJzaXN0IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXBlcnNpc3QiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RQZXJzaXN0IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcmVtb3ZlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVSZW1vdmUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcmVtb3ZlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UmVtb3ZlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtdXBkYXRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtdXBkYXRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0VXBkYXRlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LWxvYWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RMb2FkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1oaW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKSAKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUXVlcnlIaW50IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFF1ZXJ5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBxdWVyeSgpOwotICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZE5hdGl2ZVF1ZXJ5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBxdWVyeSgpOwotICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBDbGFzcyByZXN1bHRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZygpIGRlZmF1bHQgIiI7IC8vbmFtZWQgU3FsUmVzdWx0U2V0TWFwcGluZwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTcWxSZXN1bHRTZXRNYXBwaW5nIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIEVudGl0eVJlc3VsdFtdIGVudGl0aWVzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBDb2x1bW5SZXN1bHRbXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktcmVzdWx0IiB0eXBlPSJvcm06ZW50aXR5LXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbi1yZXN1bHQiIHR5cGU9Im9ybTpjb2x1bW4tcmVzdWx0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlSZXN1bHQgewotICAgICAgICAgIENsYXNzIGVudGl0eUNsYXNzKCk7Ci0gICAgICAgICAgRmllbGRSZXN1bHRbXSBmaWVsZHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFN0cmluZyBkaXNjcmltaW5hdG9yQ29sdW1uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZC1yZXN1bHQiIHR5cGU9Im9ybTpmaWVsZC1yZXN1bHQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJlbnRpdHktY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEZpZWxkUmVzdWx0IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4tcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW5SZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWNvbmRhcnktdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZWNvbmRhcnlUYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwa0pvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgfQotCi0gICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFVuaXF1ZUNvbnN0cmFpbnQgewotICAgICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIAotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAyNTU7Ci0gICAgICAgICAgaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBwcmVjaXNpb24KLSAgICAgICAgICBpbnQgc2NhbGUoKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgc2NhbGUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NhbGUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJnZW5lcmF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBHZW5lcmF0aW9uVHlwZSB7IFRBQkxFLCBTRVFVRU5DRSwgSURFTlRJVFksIEFVVE8gfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRVFVRU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURFTlRJVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBdHRyaWJ1dGVPdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBDb2x1bW4gY29sdW1uKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEFzc29jaWF0aW9uT3ZlcnJpZGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQtY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZENsYXNzIHsKLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQtaWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZElkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNpZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHJhbnNpZW50IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZlcnNpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBWZXJzaW9uIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljIHsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9iIiB0eXBlPSJvcm06bG9iIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW51bWVyYXRlZCIgdHlwZT0ib3JtOmVudW1lcmF0ZWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJmZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRmV0Y2hUeXBlIHsgTEFaWSwgRUFHRVIgfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxBWlkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVBR0VSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9iIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTG9iIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0ZW1wb3JhbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRlbXBvcmFsIHsKLSAgICAgICAgICBUZW1wb3JhbFR5cGUgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJvcm06dGVtcG9yYWwtdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIFRlbXBvcmFsVHlwZSB7Ci0gICAgICAgICAgREFURSwgLy8gamF2YS5zcWwuRGF0ZQotICAgICAgICAgIFRJTUUsIC8vIGphdmEuc3FsLlRpbWUKLSAgICAgICAgICBUSU1FU1RBTVAgLy8gamF2YS5zcWwuVGltZXN0YW1wCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEQVRFIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVElNRVNUQU1QIi8+Ci0gICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW51bWVyYXRlZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudW1lcmF0ZWQgewotICAgICAgICAgIEVudW1UeXBlIHZhbHVlKCkgZGVmYXVsdCBPUkRJTkFMOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9Im9ybTplbnVtLXR5cGUiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW0tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEVudW1UeXBlIHsKLSAgICAgICAgICBPUkRJTkFMLAotICAgICAgICAgIFNUUklORwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUkRJTkFMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hbnlUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+ICAgICAgIAotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4gICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FzY2FkZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gQ2FzY2FkZVR5cGUgeyBBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0h9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLWFsbCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1tZXJnZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXJlbW92ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXJlZnJlc2giIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcGVkLWJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1tYW55Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZT4gICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPiAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqb2luLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSm9pblRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGludmVyc2VKb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW52ZXJzZS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hbnktdG8tbWFueSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hbnlUb01hbnkgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgR2VuZXJhdGVkVmFsdWUgewotICAgICAgICAgIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBBVVRPOwotICAgICAgICAgIFN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmdlbmVyYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyYXRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcmRlci1ieSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQnkgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluaGVyaXRhbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5oZXJpdGFuY2UgewotICAgICAgICAgIEluaGVyaXRhbmNlVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgU0lOR0xFX1RBQkxFOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJpbmhlcml0YW5jZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gSW5oZXJpdGFuY2VUeXBlCi0gICAgICAgICAgeyBTSU5HTEVfVEFCTEUsIEpPSU5FRCwgVEFCTEVfUEVSX0NMQVNTfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJTkdMRV9UQUJMRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk9JTkVEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUJMRV9QRVJfQ0xBU1MiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yVmFsdWUgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIERpc2NyaW1pbmF0b3JUeXBlIHsgU1RSSU5HLCBDSEFSLCBJTlRFR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIQVIiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVEVHRVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByaW1hcnlLZXlKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIkRUWVBFIjsKLSAgICAgICAgICBEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSgpIGRlZmF1bHQgU1RSSU5HOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAzMTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGVtYmVkZGFibGUgb2JqZWN0cy4gSXMgCi0gICAgICAgIGFsbG93ZWQgdG8gYmUgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggCi0gICAgICAgIHRoZSBhbm5vdGF0aW9ucy4gQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSAKLSAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkIAotICAgICAgICBpbiB0aGUgY2xhc3MuIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIAotICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGFibGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTplbWJlZGRhYmxlLWF0dHJpYnV0ZXMiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkYWJsZS1hdHRyaWJ1dGVzIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljIiB0eXBlPSJvcm06YmFzaWMiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2llbnQiIHR5cGU9Im9ybTp0cmFuc2llbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhIG1hcHBlZCBzdXBlcmNsYXNzLiBJcyAKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCi0gICAgICAgIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5IAotICAgICAgICBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBwZWRTdXBlcmNsYXNze30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZXF1ZW5jZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgc2VxdWVuY2VOYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAxOwotICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXF1ZW5jZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbC12YWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5WYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMDsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJway1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbC12YWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvcGVyc2lzdGVuY2VfMV8wLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvcGVyc2lzdGVuY2VfMV8wLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhMTU3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3BlcnNpc3RlbmNlXzFfMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gcGVyc2lzdGVuY2UueG1sIHNjaGVtYSAtLT4KLTx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UiIAotICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICB4bWxuczpwZXJzaXN0ZW5jZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UiCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLSAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiAKLSAgdmVyc2lvbj0iMS4wIj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKXBlcnNpc3RlbmNlXzFfMC54c2QgIDEuMCAgRmViIDkgMjAwNgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEhFQURFUi4KLQotICAgICAgQ29weXJpZ2h0IDIwMDUtMjAwNyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUKLSAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvbmx5ICgiR1BMIikgb3IgdGhlIENvbW1vbgotICAgICAgRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlKCJDRERMIikgKGNvbGxlY3RpdmVseSwgdGhlCi0gICAgICAiTGljZW5zZSIpLiAgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gICAgICB0aGUgTGljZW5zZS4gWW91IGNhbiBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gICAgICBodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMLmh0bWwgb3IKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKLSAgICAgIExpY2Vuc2UuCi0KLSAgICAgIFdoZW4gZGlzdHJpYnV0aW5nIHRoZSBzb2Z0d2FyZSwgaW5jbHVkZSB0aGlzIExpY2Vuc2UgSGVhZGVyCi0gICAgICBOb3RpY2UgaW4gZWFjaCBmaWxlIGFuZCBpbmNsdWRlIHRoZSBMaWNlbnNlIGZpbGUgYXQKLSAgICAgIGdsYXNzZmlzaC9ib290c3RyYXAvbGVnYWwvTElDRU5TRS50eHQuICBTdW4gZGVzaWduYXRlcyB0aGlzCi0gICAgICBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzCi0gICAgICBwcm92aWRlZCBieSBTdW4gaW4gdGhlIEdQTCBWZXJzaW9uIDIgc2VjdGlvbiBvZiB0aGUgTGljZW5zZSBmaWxlCi0gICAgICB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4gIElmIGFwcGxpY2FibGUsIGFkZCB0aGUgZm9sbG93aW5nCi0gICAgICBiZWxvdyB0aGUgTGljZW5zZSBIZWFkZXIsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBbXQotICAgICAgcmVwbGFjZWQgYnkgeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb246Ci0gICAgICAiUG9ydGlvbnMgQ29weXJpZ2h0ZWQgW3llYXJdIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0iCi0KLSAgICAgIENvbnRyaWJ1dG9yKHMpOgotCi0gICAgICBJZiB5b3Ugd2lzaCB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHRvIGJlIGdvdmVybmVkIGJ5IG9ubHkgdGhlCi0gICAgICBDRERMIG9yIG9ubHkgdGhlIEdQTCBWZXJzaW9uIDIsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgYWRkaW5nCi0gICAgICAiW0NvbnRyaWJ1dG9yXSBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMKLSAgICAgIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgW0NEREwgb3IgR1BMIFZlcnNpb24gMl0gbGljZW5zZS4iICBJZiB5b3UKLSAgICAgIGRvbid0IGluZGljYXRlIGEgc2luZ2xlIGNob2ljZSBvZiBsaWNlbnNlLCBhIHJlY2lwaWVudCBoYXMgdGhlCi0gICAgICBvcHRpb24gdG8gZGlzdHJpYnV0ZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUKLSAgICAgIENEREwsIHRoZSBHUEwgVmVyc2lvbiAyIG9yIHRvIGV4dGVuZCB0aGUgY2hvaWNlIG9mIGxpY2Vuc2UgdG8gaXRzCi0gICAgICBsaWNlbnNlZXMgYXMgcHJvdmlkZWQgYWJvdmUuICBIb3dldmVyLCBpZiB5b3UgYWRkIEdQTCBWZXJzaW9uIDIKLSAgICAgIGNvZGUgYW5kIHRoZXJlZm9yZSwgZWxlY3RlZCB0aGUgR1BMIFZlcnNpb24gMiBsaWNlbnNlLCB0aGVuIHRoZQotICAgICAgb3B0aW9uIGFwcGxpZXMgb25seSBpZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHN1Y2gKLSAgICAgIG9wdGlvbiBieSB0aGUgY29weXJpZ2h0IGhvbGRlci4KLQotICAgICAgVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBlbGVjdHMgdG8gaW5jbHVkZSB0aGlzIHNvZnR3YXJlIGluIHRoaXMKLSAgICAgIGRpc3RyaWJ1dGlvbiB1bmRlciB0aGUgQ0RETCBsaWNlbnNlLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgPHhzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOmRvY3VtZW50YXRpb24+PCFbQ0RBVEFbCi0KLSAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIHBlcnNpc3RlbmNlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgVGhlIGZpbGUgbXVzdCBiZSBuYW1lZCAiTUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sIiBpbiB0aGUgCi0gICAgIHBlcnNpc3RlbmNlIGFyY2hpdmUuCi0gICAgIFBlcnNpc3RlbmNlIGNvbmZpZ3VyYXRpb24gZmlsZXMgbXVzdCBpbmRpY2F0ZQotICAgICB0aGUgcGVyc2lzdGVuY2Ugc2NoZW1hIGJ5IHVzaW5nIHRoZSBwZXJzaXN0ZW5jZSBuYW1lc3BhY2U6Ci0KLSAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UKLQotICAgICBhbmQgaW5kaWNhdGUgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotICAgICB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0gICAgICA8cGVyc2lzdGVuY2UgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlCi0gICAgICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VfMV8wLnhzZCIKLSAgICAgICAgdmVyc2lvbj0iMS4wIj4KLSAgICAgICAgICAuLi4KLSAgICAgIDwvcGVyc2lzdGVuY2U+Ci0KLSAgICBdXT48L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ2ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbMC05XSsoXC5bMC05XSspKiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UiPgotICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotCi0gICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdCIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uIG9mIGEgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0KLSAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgVGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3ZpZGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIFByb3ZpZGVyIGNsYXNzIHRoYXQgc3VwcGxpZXMgRW50aXR5TWFuYWdlcnMgZm9yIHRoaXMgCi0gICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imp0YS1kYXRhLXNvdXJjZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBUaGUgY29udGFpbmVyLXNwZWNpZmljIG5hbWUgb2YgdGhlIEpUQSBkYXRhc291cmNlIHRvIHVzZS4KLQotICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9uLWp0YS1kYXRhLXNvdXJjZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBUaGUgY29udGFpbmVyLXNwZWNpZmljIG5hbWUgb2YgYSBub24tSlRBIGRhdGFzb3VyY2UgdG8gdXNlLgotCi0gICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwaW5nLWZpbGUiIHR5cGU9InhzZDpzdHJpbmciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIEZpbGUgY29udGFpbmluZyBtYXBwaW5nIGluZm9ybWF0aW9uLiBMb2FkZWQgYXMgYSByZXNvdXJjZSAKLSAgICAgICAgICAgICAgICAgICAgYnkgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyLgotCi0gICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqYXItZmlsZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgSmFyIGZpbGUgdGhhdCBzaG91bGQgYmUgc2Nhbm5lZCBmb3IgZW50aXRpZXMuIAotICAgICAgICAgICAgICAgICAgICBOb3QgYXBwbGljYWJsZSB0byBKYXZhIFNFIHBlcnNpc3RlbmNlIHVuaXRzLgotCi0gICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgdG8gc2NhbiBmb3IgYW5ub3RhdGlvbnMuICBJdCBzaG91bGQgYmUgYW5ub3RhdGVkIAotICAgICAgICAgICAgICAgICAgICB3aXRoIGVpdGhlciBARW50aXR5LCBARW1iZWRkYWJsZSBvciBATWFwcGVkU3VwZXJjbGFzcy4KLQotICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS11bmxpc3RlZC1jbGFzc2VzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgV2hlbiBzZXQgdG8gdHJ1ZSB0aGVuIG9ubHkgbGlzdGVkIGNsYXNzZXMgYW5kIGphcnMgd2lsbCAKLSAgICAgICAgICAgICAgICAgICAgYmUgc2Nhbm5lZCBmb3IgcGVyc2lzdGVudCBjbGFzc2VzLCBvdGhlcndpc2UgdGhlIGVuY2xvc2luZyAKLSAgICAgICAgICAgICAgICAgICAgamFyIG9yIGRpcmVjdG9yeSB3aWxsIGFsc28gYmUgc2Nhbm5lZC4gTm90IGFwcGxpY2FibGUgdG8gCi0gICAgICAgICAgICAgICAgICAgIEphdmEgU0UgcGVyc2lzdGVuY2UgdW5pdHMuCi0KLSAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgIEEgbGlzdCBvZiB2ZW5kb3Itc3BlY2lmaWMgcHJvcGVydGllcy4KLQotICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICBBIG5hbWUtdmFsdWUgcGFpci4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgIE5hbWUgdXNlZCBpbiBjb2RlIHRvIHJlZmVyZW5jZSB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YXR0cmlidXRlPgotCi0gICAgICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zYWN0aW9uLXR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icGVyc2lzdGVuY2U6cGVyc2lzdGVuY2UtdW5pdC10cmFuc2FjdGlvbi10eXBlIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgVHlwZSBvZiB0cmFuc2FjdGlvbnMgdXNlZCBieSBFbnRpdHlNYW5hZ2VycyBmcm9tIHRoaXMgCi0gICAgICAgICAgICAgICAgICBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmF0dHJpYnV0ZT4KLQotICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJwZXJzaXN0ZW5jZTp2ZXJzaW9uVHlwZSIgCi0gICAgICAgICAgICAgICAgICAgICBmaXhlZD0iMS4wIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LXRyYW5zYWN0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBUcmFuc2FjdGlvblR5cGUgeyBKVEEsIFJFU09VUkNFX0xPQ0FMIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKVEEiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFU09VUkNFX0xPQ0FMIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzIuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItYXBwXzJfMi5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNDM5ZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItYXBwXzJfMi5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSw2MzkgKzAsMCBAQAotPCEtLQotQ29weXJpZ2h0IDE5OTkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiA5MDEgU2FuIEFudG9uaW8gUm9hZCwKLVBhbG8gQWx0bywgQ0EgIDk0MzAzLCBVLlMuQS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gCi1UaGlzIHByb2R1Y3Qgb3IgZG9jdW1lbnQgaXMgcHJvdGVjdGVkIGJ5IGNvcHlyaWdodCBhbmQgZGlzdHJpYnV0ZWQKLXVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIGl0cyB1c2UsIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiwgYW5kCi1kZWNvbXBpbGF0aW9uLiAgTm8gcGFydCBvZiB0aGlzIHByb2R1Y3Qgb3IgZG9jdW1lbnRhdGlvbiBtYXkgYmUKLXJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uCi1vZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4gIAotCi1UaGlyZCBwYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMgY29weXJpZ2h0ZWQgYW5kIAotbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLiAKLQotU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIExvZ28sIFNvbGFyaXMsIEphdmEsIEphdmFTZXJ2ZXIgUGFnZXMsIEphdmEgCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsIEpEQkMsIEpESywgSmF2YU1haWwgYW5kIEVudGVycHJpc2UgSmF2YUJlYW5zLCAKLWFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMgaW4gdGhlIFUuUy4gCi1hbmQgb3RoZXIgY291bnRyaWVzLgotCi1BbGwgU1BBUkMgdHJhZGVtYXJrcyBhcmUgdXNlZCB1bmRlciBsaWNlbnNlIGFuZCBhcmUgdHJhZGVtYXJrcwotb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFNQQVJDIEludGVybmF0aW9uYWwsIEluYy4KLWluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuIFByb2R1Y3RzIGJlYXJpbmcgU1BBUkMKLXRyYWRlbWFya3MgYXJlIGJhc2VkIHVwb24gYW4gYXJjaGl0ZWN0dXJlIGRldmVsb3BlZCBieSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIAotCi1Qb3N0U2NyaXB0IGlzIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcywgSW5jLiAKLQotIAotRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzIFN1YmplY3QgdG8gCi1TdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0KLSAKLURPQ1VNRU5UQVRJT04gSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQUxMIEVYUFJFU1MgT1IgSU1QTElFRAotQ09ORElUSU9OUywgUkVQUkVTRU5UQVRJT05TIEFORCBXQVJSQU5USUVTLCBJTkNMVURJTkcgQU5ZCi1JTVBMSUVEIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi1QVVJQT1NFIE9SIE5PTi1JTkZSSU5HRU1FTlQsIEFSRSBESVNDTEFJTUVELCBFWENFUFQKLVRPIFRIRSBFWFRFTlQgVEhBVCBTVUNIIERJU0NMQUlNRVJTIEFSRSBIRUxEIFRPIEJFIExFR0FMTFkKLUlOVkFMSUQuCi0KLV9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLUNvcHlyaWdodCAxOTk5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIAotOTAxIFNhbiBBbnRvbmlvIFJvYWQsIFBhbG8gQWx0bywgQ0EgIDk0MzAzLCBFdGF0cy1VbmlzLiAKLVRvdXMgZHJvaXRzIHJlJ3NlcnZlJ3MuCi0gCi0KLUNlIHByb2R1aXQgb3UgZG9jdW1lbnQgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IGV0IGRpc3RyaWJ1ZScgYXZlYyAKLWRlcyBsaWNlbmNlcyBxdWkgZW4gcmVzdHJlaWduZW50IGwndXRpbGlzYXRpb24sIGxhIGNvcGllLCBsYSBkaXN0cmlidXRpb24sCi1ldCBsYSBkZSdjb21waWxhdGlvbi4gIEF1Y3VuZSBwYXJ0aWUgZGUgY2UgcHJvZHVpdCBvdSBkZSBzYSBkb2N1bWVudGF0aW9uCi1hc3NvY2llJ2UgbmUgcGV1dCBlXnRyZSByZXByb2R1aXRlIHNvdXMgYXVjdW5lIGZvcm1lLCBwYXIgcXVlbHF1ZSBtb3llbiAKLXF1ZSBjZSBzb2l0LCBzYW5zIGwnYXV0b3Jpc2F0aW9uIHByZSdhbGFibGUgZXQgZSdjcml0ZSBkZSBTdW4gZXQgZGUgc2VzIAotYmFpbGxldXJzIGRlIGxpY2VuY2UsIHMnaWwgeSBlbiBhLiAgCi0KLUxlIGxvZ2ljaWVsIGRlJ3RlbnUgcGFyIGRlcyB0aWVycywgZXQgcXVpIGNvbXByZW5kIGxhIHRlY2hub2xvZ2llIAotcmVsYXRpdmUgYXV4IHBvbGljZXMgZGUgY2FyYWN0ZWByZXMsIGVzdCBwcm90ZSdnZScgcGFyIHVuIGNvcHlyaWdodCAKLWV0IGxpY2VuY2llJyBwYXIgZGVzIGZvdXJuaXNzZXVycyBkZSBTdW4uCi0gCi1TdW4sIFN1biBNaWNyb3N5c3RlbXMsIGxlIGxvZ28gU3VuLCBTb2xhcmlzLCBKYXZhLCBKYXZhU2VydmVyIFBhZ2VzLCBKYXZhIAotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCBKREJDLCBKREssIEphdmFNYWlsLCBldCBFbnRlcnByaXNlIEphdmFCZWFucywgIAotc29udCBkZXMgbWFycXVlcyBkZSBmYWJyaXF1ZSBvdSBkZXMgbWFycXVlcyBkZSdwb3NlJ2VzIGRlIFN1biAKLU1pY3Jvc3lzdGVtcywgSW5jLiBhdXggRXRhdHMtVW5pcyBldCBkYW5zIGQnYXV0cmVzIHBheXMuCi0gCi1Ub3V0ZXMgbGVzIG1hcnF1ZXMgU1BBUkMgc29udCB1dGlsaXNlJ2VzIHNvdXMgbGljZW5jZSBldCBzb250Ci1kZXMgbWFycXVlcyBkZSBmYWJyaXF1ZSBvdSBkZXMgbWFycXVlcyBkZSdwb3NlJ2VzIGRlIFNQQVJDCi1JbnRlcm5hdGlvbmFsLCBJbmMuIGF1eCBFdGF0cy1VbmlzIGV0ICBkYW5zCi1kJ2F1dHJlcyBwYXlzLiBMZXMgcHJvZHVpdHMgcG9ydGFudCBsZXMgbWFycXVlcyBTUEFSQyBzb250Ci1iYXNlJ3Mgc3VyIHVuZSBhcmNoaXRlY3R1cmUgZGUndmVsb3BwZSdlIHBhciBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuICAKLQotUG9zdGNyaXB0IGVzdCB1bmUgbWFycXVlIGVucmVnaXN0cmUnZSBkJ0Fkb2JlIFN5c3RlbXMgSW5jLiAKLSAKLUxBIERPQ1VNRU5UQVRJT04gRVNUIEZPVVJOSUUgIkVOIEwnRVRBVCIgRVQgVE9VVEVTIEFVVFJFUyBDT05ESVRJT05TLAotREVDTEFSQVRJT05TIEVUIEdBUkFOVElFUyBFWFBSRVNTRVMgT1UgVEFDSVRFUyBTT05UIEZPUk1FTExFTUVOVCBFWENMVUVTLAotREFOUyBMQSBNRVNVUkUgQVVUT1JJU0VFIFBBUiBMQSBMT0kgQVBQTElDQUJMRSwgWSBDT01QUklTIE5PVEFNTUVOVAotVE9VVEUgR0FSQU5USUUgSU1QTElDSVRFIFJFTEFUSVZFIEEgTEEgUVVBTElURSBNQVJDSEFOREUsIEEgTCdBUFRJVFVERQotQSBVTkUgVVRJTElTQVRJT04gUEFSVElDVUxJRVJFIE9VIEEgTCdBQlNFTkNFIERFIENPTlRSRUZBQ09OLgotLS0+Ci0KLTwhLS0KLVRoZSB3ZWItYXBwIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IKLWEgd2ViIGFwcGxpY2F0aW9uCi0tLT4KLQotPCFFTEVNRU5UIHdlYi1hcHAgKGljb24/LCBkaXNwbGF5LW5hbWU/LCBkZXNjcmlwdGlvbj8sIGRpc3RyaWJ1dGFibGU/LAotY29udGV4dC1wYXJhbSosIHNlcnZsZXQqLCBzZXJ2bGV0LW1hcHBpbmcqLCBzZXNzaW9uLWNvbmZpZz8sCi1taW1lLW1hcHBpbmcqLCB3ZWxjb21lLWZpbGUtbGlzdD8sIGVycm9yLXBhZ2UqLCB0YWdsaWIqLAotcmVzb3VyY2UtcmVmKiwgc2VjdXJpdHktY29uc3RyYWludCosIGxvZ2luLWNvbmZpZz8sIHNlY3VyaXR5LXJvbGUqLAotZW52LWVudHJ5KiwgZWpiLXJlZiopPgotCi08IS0tCi1UaGUgaWNvbiBlbGVtZW50IGNvbnRhaW5zIGEgc21hbGwtaWNvbiBhbmQgYSBsYXJnZS1pY29uIGVsZW1lbnQKLXdoaWNoIHNwZWNpZnkgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGZvciBhIHNtYWxsIGFuZAotbGFyZ2UgaW1hZ2UgdXNlZCB0byByZXByZXNlbnQgdGhlIHdlYiBhcHBsaWNhdGlvbiBpbiBhIEdVSSB0b29sLiBBdCBhCi1taW5pbXVtLCB0b29scyBtdXN0IGFjY2VwdCBHSUYgYW5kIEpQRUcgZm9ybWF0IGltYWdlcy4KLS0tPgotCi08IUVMRU1FTlQgaWNvbiAoc21hbGwtaWNvbj8sIGxhcmdlLWljb24/KT4KLQotPCEtLQotVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSB3ZWIKLWFwcGxpY2F0aW9uIG9mIGEgZmlsZSBjb250YWluaW5nIGEgc21hbGwgKDE2eDE2IHBpeGVsKSBpY29uIGltYWdlLgotLS0+Ci0KLTwhRUxFTUVOVCBzbWFsbC1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGxhcmdlLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSB3ZWIKLWFwcGxpY2F0aW9uIG9mIGEgZmlsZSBjb250YWluaW5nIGEgbGFyZ2UgKDMyeDMyIHBpeGVsKSBpY29uIGltYWdlLgotLS0+Ci0KLTwhRUxFTUVOVCBsYXJnZS1pY29uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRpc3BsYXktbmFtZSBlbGVtZW50IGNvbnRhaW5zIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkCi10byBiZSBkaXNwbGF5ZWQgYnkgR1VJIHRvb2xzCi0tLT4KLQotPCFFTEVNRU5UIGRpc3BsYXktbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gcHJvdmlkZSBkZXNjcmlwdGl2ZSB0ZXh0IGFib3V0Ci10aGUgcGFyZW50IGVsZW1lbnQuCi0tLT4KLQotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRpc3RyaWJ1dGFibGUgZWxlbWVudCwgYnkgaXRzIHByZXNlbmNlIGluIGEgd2ViIGFwcGxpY2F0aW9uCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IsIGluZGljYXRlcyB0aGF0IHRoaXMgd2ViIGFwcGxpY2F0aW9uIGlzCi1wcm9ncmFtbWVkIGFwcHJvcHJpYXRlbHkgdG8gYmUgZGVwbG95ZWQgaW50byBhIGRpc3RyaWJ1dGVkIHNlcnZsZXQKLWNvbnRhaW5lcgotLS0+Ci0KLTwhRUxFTUVOVCBkaXN0cmlidXRhYmxlIEVNUFRZPgotCi08IS0tCi1UaGUgY29udGV4dC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHdlYgotYXBwbGljYXRpb24ncyBzZXJ2bGV0IGNvbnRleHQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4KLS0tPgotCi08IUVMRU1FTlQgY29udGV4dC1wYXJhbSAocGFyYW0tbmFtZSwgcGFyYW0tdmFsdWUsIGRlc2NyaXB0aW9uPyk+Ci0KLTwhLS0KLVRoZSBwYXJhbS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBwYXJhbWV0ZXIuCi0tLT4KLQotPCFFTEVNRU5UIHBhcmFtLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcGFyYW0tdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYSBwYXJhbWV0ZXIuCi0tLT4KLQotPCFFTEVNRU5UIHBhcmFtLXZhbHVlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHNlcnZsZXQgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpdmUgZGF0YSBvZiBhCi1zZXJ2bGV0LiBJZiBhIGpzcC1maWxlIGlzIHNwZWNpZmllZCBhbmQgdGhlIGxvYWQtb24tc3RhcnR1cCBlbGVtZW50IGlzCi1wcmVzZW50LCB0aGVuIHRoZSBKU1Agc2hvdWxkIGJlIHByZWNvbXBpbGVkIGFuZCBsb2FkZWQuCi0tLT4KLQotPCFFTEVNRU5UIHNlcnZsZXQgKGljb24/LCBzZXJ2bGV0LW5hbWUsIGRpc3BsYXktbmFtZT8sIGRlc2NyaXB0aW9uPywKLShzZXJ2bGV0LWNsYXNzfGpzcC1maWxlKSwgaW5pdC1wYXJhbSosIGxvYWQtb24tc3RhcnR1cD8sIHNlY3VyaXR5LXJvbGUtcmVmKik+Ci0KLTwhLS0KLVRoZSBzZXJ2bGV0LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlCi1zZXJ2bGV0LgotLS0+Ci0KLTwhRUxFTUVOVCBzZXJ2bGV0LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgc2VydmxldC1jbGFzcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotb2YgdGhlIHNlcnZsZXQuCi0tLT4KLQotPCFFTEVNRU5UIHNlcnZsZXQtY2xhc3MgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUganNwLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbCBwYXRoIHRvIGEgSlNQIGZpbGUgd2l0aGluCi10aGUgd2ViIGFwcGxpY2F0aW9uLgotLS0+Ci0KLTwhRUxFTUVOVCBqc3AtZmlsZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lL3ZhbHVlIHBhaXIgYXMgYW4KLWluaXRpYWxpemF0aW9uIHBhcmFtIG9mIHRoZSBzZXJ2bGV0Ci0tLT4KLQotPCFFTEVNRU5UIGluaXQtcGFyYW0gKHBhcmFtLW5hbWUsIHBhcmFtLXZhbHVlLCBkZXNjcmlwdGlvbj8pPgotCi08IS0tCi1UaGUgbG9hZC1vbi1zdGFydHVwIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyBzZXJ2bGV0IHNob3VsZCBiZQotbG9hZGVkIG9uIHRoZSBzdGFydHVwIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24uIFRoZSBvcHRpb25hbCBjb250ZW50cyBvZgotdGhlc2UgZWxlbWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBvcmRlciBpbiB3aGljaAotdGhlIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZC4gTG93ZXIgaW50ZWdlcnMgYXJlIGxvYWRlZCBiZWZvcmUgaGlnaGVyCi1pbnRlZ2Vycy4gSWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLCBvciBpZiB0aGUgdmFsdWUgc3BlY2lmaWVkIGlzIG5vdCBhCi1wb3NpdGl2ZSBpbnRlZ2VyLCB0aGUgY29udGFpbmVyIGlzIGZyZWUgdG8gbG9hZCBpdCBhdCBhbnkgdGltZSBpbiB0aGUKLXN0YXJ0dXAgc2VxdWVuY2UuCi0tLT4KLQotPCFFTEVNRU5UIGxvYWQtb24tc3RhcnR1cCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBzZXJ2bGV0LW1hcHBpbmcgZWxlbWVudCBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGEgc2VydmxldAotYW5kIGEgdXJsIHBhdHRlcm4KLS0tPgotCi08IUVMRU1FTlQgc2VydmxldC1tYXBwaW5nIChzZXJ2bGV0LW5hbWUsIHVybC1wYXR0ZXJuKT4KLQotPCEtLQotVGhlIHVybC1wYXR0ZXJuIGVsZW1lbnQgY29udGFpbnMgdGhlIHVybCBwYXR0ZXJuIG9mIHRoZQotbWFwcGluZy4gTXVzdCBmb2xsb3cgdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiBTZWN0aW9uIDEwIG9mIHRoZSBTZXJ2bGV0Ci1BUEkgU3BlY2lmaWNhdGlvbi4KLS0tPgotCi08IUVMRU1FTlQgdXJsLXBhdHRlcm4gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgc2Vzc2lvbi1jb25maWcgZWxlbWVudCBkZWZpbmVzIHRoZSBzZXNzaW9uIHBhcmFtZXRlcnMgZm9yCi10aGlzIHdlYiBhcHBsaWNhdGlvbi4KLS0tPgotCi08IUVMRU1FTlQgc2Vzc2lvbi1jb25maWcgKHNlc3Npb24tdGltZW91dD8pPgotCi08IS0tCi1UaGUgc2Vzc2lvbi10aW1lb3V0IGVsZW1lbnQgZGVmaW5lcyB0aGUgZGVmYXVsdCBzZXNzaW9uIHRpbWVvdXQKLWludGVydmFsIGZvciBhbGwgc2Vzc2lvbnMgY3JlYXRlZCBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gVGhlCi1zcGVjaWZpZWQgdGltZW91dCBtdXN0IGJlIGV4cHJlc3NlZCBpbiBhIHdob2xlIG51bWJlciBvZiBtaW51dGVzLgotLS0+Ci0KLTwhRUxFTUVOVCBzZXNzaW9uLXRpbWVvdXQgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbWltZS1tYXBwaW5nIGVsZW1lbnQgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBleHRlbnNpb24KLWFuZCBhIG1pbWUgdHlwZS4KLS0tPgotCi08IUVMRU1FTlQgbWltZS1tYXBwaW5nIChleHRlbnNpb24sIG1pbWUtdHlwZSk+Ci0KLTwhLS0KLVRoZSBleHRlbnNpb24gZWxlbWVudCBjb250YWlucyBhIHN0cmluZyBkZXNjcmliaW5nIGFuCi1leHRlbnNpb24uIGV4YW1wbGU6ICJ0eHQiCi0tLT4KLQotPCFFTEVNRU5UIGV4dGVuc2lvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBtaW1lLXR5cGUgZWxlbWVudCBjb250YWlucyBhIGRlZmluZWQgbWltZSB0eXBlLiBleGFtcGxlOgotInRleHQvcGxhaW4iCi0tLT4KLQotPCFFTEVNRU5UIG1pbWUtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB3ZWxjb21lLWZpbGUtbGlzdCBjb250YWlucyBhbiBvcmRlcmVkIGxpc3Qgb2Ygd2VsY29tZSBmaWxlcwotZWxlbWVudHMuCi0tLT4KLQotPCFFTEVNRU5UIHdlbGNvbWUtZmlsZS1saXN0ICh3ZWxjb21lLWZpbGUrKT4KLQotPCEtLQotVGhlIHdlbGNvbWUtZmlsZSBlbGVtZW50IGNvbnRhaW5zIGZpbGUgbmFtZSB0byB1c2UgYXMgYSBkZWZhdWx0Ci13ZWxjb21lIGZpbGUsIHN1Y2ggYXMgaW5kZXguaHRtbAotLS0+Ci0KLTwhRUxFTUVOVCB3ZWxjb21lLWZpbGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgdGFnbGliIGVsZW1lbnQgaXMgdXNlZCB0byBkZXNjcmliZSBhIEpTUCB0YWcgbGlicmFyeS4KLS0tPgotCi08IUVMRU1FTlQgdGFnbGliICh0YWdsaWItdXJpLCB0YWdsaWItbG9jYXRpb24pPgotCi08IS0tCi1UaGUgdGFnbGliLXVyaSBlbGVtZW50IGRlc2NyaWJlcyBhIFVSSSwgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uCi1vZiB0aGUgd2ViLnhtbCBkb2N1bWVudCwgaWRlbnRpZnlpbmcgYSBUYWcgTGlicmFyeSB1c2VkIGluIHRoZSBXZWIKLUFwcGxpY2F0aW9uLgotLS0+Ci0KLTwhRUxFTUVOVCB0YWdsaWItdXJpICgjUENEQVRBKT4KLQotPCEtLQotdGhlIHRhZ2xpYi1sb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiAoYXMgYSByZXNvdXJjZQotcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbikgd2hlcmUgdG8gZmluZCB0aGUgVGFnCi1MaWJhcnkgRGVzY3JpcHRpb24gZmlsZSBmb3IgdGhlIHRhZyBsaWJyYXJ5LgotLS0+Ci0KLTwhRUxFTUVOVCB0YWdsaWItbG9jYXRpb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZXJyb3ItcGFnZSBlbGVtZW50IGNvbnRhaW5zIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGVycm9yIGNvZGUKLW9yIGV4Y2VwdGlvbiB0eXBlIHRvIHRoZSBwYXRoIG9mIGEgcmVzb3VyY2UgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbgotLS0+Ci0KLTwhRUxFTUVOVCBlcnJvci1wYWdlICgoZXJyb3ItY29kZSB8IGV4Y2VwdGlvbi10eXBlKSwgbG9jYXRpb24pPgotCi08IS0tCi1UaGUgZXJyb3ItY29kZSBjb250YWlucyBhbiBIVFRQIGVycm9yIGNvZGUsIGV4OiA0MDQKLS0tPgotCi08IUVMRU1FTlQgZXJyb3ItY29kZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBleGNlcHRpb24gdHlwZSBjb250YWlucyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEKLUphdmEgZXhjZXB0aW9uIHR5cGUuCi0tLT4KLQotPCFFTEVNRU5UIGV4Y2VwdGlvbi10eXBlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBpbiB0aGUKLXdlYiBhcHBsaWNhdGlvbgotLS0+Ci0KLTwhRUxFTUVOVCBsb2NhdGlvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXNvdXJjZS1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIGEgV2ViCi1BcHBsaWNhdGlvbidzIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCByZXNvdXJjZS4KLS0tPgotCi08IUVMRU1FTlQgcmVzb3VyY2UtcmVmIChkZXNjcmlwdGlvbj8sIHJlcy1yZWYtbmFtZSwgcmVzLXR5cGUsIHJlcy1hdXRoKT4KLQotPCEtLQotVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UKLWZhY3RvcnkgcmVmZXJlbmNlIG5hbWUuCi0tLT4KLQotPCFFTEVNRU5UIHJlcy1yZWYtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgKEphdmEgY2xhc3MpIHR5cGUgb2YgdGhlIGRhdGEKLXNvdXJjZS4KLS0tPgotCi08IUVMRU1FTlQgcmVzLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLWF1dGggZWxlbWVudCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50Ci1jb2RlIHBlcmZvcm1zIHJlc291cmNlIHNpZ25vbiBwcm9ncmFtbWF0aWNhbGx5IG9yIHdoZXRoZXIgdGhlCi1jb250YWluZXIgc2lnbnMgb250byB0aGUgcmVzb3VyY2UgYmFzZWQgb24gdGhlIHByaW5jaXBsZSBtYXBwaW5nCi1pbmZvcm1hdGlvbiBzdXBwbGllZCBieSB0aGUgZGVwbG95ZXIuIE11c3QgYmUgQ09OVEFJTkVSIG9yIFNFUlZMRVQKLS0tPgotCi08IUVMRU1FTlQgcmVzLWF1dGggKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgc2VjdXJpdHktY29uc3RyYWludCBlbGVtZW50IGlzIHVzZWQgdG8gYXNzb2NpYXRlIHNlY3VyaXR5Ci1jb25zdHJhaW50cyB3aXRoIG9uZSBvciBtb3JlIHdlYiByZXNvdXJjZSBjb2xsZWN0aW9ucwotLS0+Ci0KLTwhRUxFTUVOVCBzZWN1cml0eS1jb25zdHJhaW50ICh3ZWItcmVzb3VyY2UtY29sbGVjdGlvbissCi1hdXRoLWNvbnN0cmFpbnQ/LCB1c2VyLWRhdGEtY29uc3RyYWludD8pPgotCi08IS0tCi1UaGUgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24gZWxlbWVudCBpcyB1c2VkIHRvIGlkZW50aWZ5IGEgc3Vic2V0Ci1vZiB0aGUgcmVzb3VyY2VzIGFuZCBIVFRQIG1ldGhvZHMgb24gdGhvc2UgcmVzb3VyY2VzIHdpdGhpbiBhIHdlYgotYXBwbGljYXRpb24gdG8gd2hpY2ggYSBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMuIElmIG5vIEhUVFAgbWV0aG9kcwotYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzIHRvIGFsbCBIVFRQCi1tZXRob2RzLgotLS0+Ci0KLTwhRUxFTUVOVCB3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiAod2ViLXJlc291cmNlLW5hbWUsIGRlc2NyaXB0aW9uPywKLXVybC1wYXR0ZXJuKiwgaHR0cC1tZXRob2QqKT4KLQotPCEtLQotVGhlIHdlYi1yZXNvdXJjZS1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoaXMgd2ViIHJlc291cmNlCi1jb2xsZWN0aW9uCi0tLT4KLQotPCFFTEVNRU5UIHdlYi1yZXNvdXJjZS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGh0dHAtbWV0aG9kIGNvbnRhaW5zIGFuIEhUVFAgbWV0aG9kIChHRVQgfCBQT1NUIHwuLi4pCi0tLT4KLQotPCFFTEVNRU5UIGh0dHAtbWV0aG9kICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHVzZXItZGF0YS1jb25zdHJhaW50IGVsZW1lbnQgaXMgdXNlZCB0byBpbmRpY2F0ZSBob3cgZGF0YQotY29tbXVuaWNhdGVkIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgY29udGFpbmVyIHNob3VsZCBiZSBwcm90ZWN0ZWQKLS0tPgotCi08IUVMRU1FTlQgdXNlci1kYXRhLWNvbnN0cmFpbnQgKGRlc2NyaXB0aW9uPywgdHJhbnNwb3J0LWd1YXJhbnRlZSk+Ci0KLTwhLS0KLVRoZSB0cmFuc3BvcnQtZ3VhcmFudGVlIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQgdGhlIGNvbW11bmljYXRpb24KLWJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgc2hvdWxkIGJlIE5PTkUsIElOVEVHUkFMLCBvcgotQ09ORklERU5USUFMLiBOT05FIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHJlcXVpcmUgYW55Ci10cmFuc3BvcnQgZ3VhcmFudGVlcy4gQSB2YWx1ZSBvZiBJTlRFR1JBTCBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbgotcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBzZW50IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgc2VydmVyIGJlIHNlbnQgaW4KLXN1Y2ggYSB3YXkgdGhhdCBpdCBjYW4ndCBiZSBjaGFuZ2VkIGluIHRyYW5zaXQuIENPTkZJREVOVElBTCBtZWFucwotdGhhdCB0aGUgYXBwbGljYXRpb24gcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBiZSB0cmFuc21pdHRlZCBpbiBhCi1mYXNoaW9uIHRoYXQgcHJldmVudHMgb3RoZXIgZW50aXRpZXMgZnJvbSBvYnNlcnZpbmcgdGhlIGNvbnRlbnRzIG9mCi10aGUgdHJhbnNtaXNzaW9uLiBJbiBtb3N0IGNhc2VzLCB0aGUgcHJlc2VuY2Ugb2YgdGhlIElOVEVHUkFMIG9yCi1DT05GSURFTlRJQUwgZmxhZyB3aWxsIGluZGljYXRlIHRoYXQgdGhlIHVzZSBvZiBTU0wgaXMgcmVxdWlyZWQuCi0tLT4KLQotPCFFTEVNRU5UIHRyYW5zcG9ydC1ndWFyYW50ZWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgYXV0aC1jb25zdHJhaW50IGVsZW1lbnQgaW5kaWNhdGVzIHRoZSB1c2VyIHJvbGVzIHRoYXQgc2hvdWxkCi1iZSBwZXJtaXR0ZWQgYWNjZXNzIHRvIHRoaXMgcmVzb3VyY2UgY29sbGVjdGlvbi4gVGhlIHJvbGUgdXNlZCBoZXJlCi1tdXN0IGFwcGVhciBpbiBhIHNlY3VyaXR5LXJvbGUtcmVmIGVsZW1lbnQuCi0tLT4KLQotPCFFTEVNRU5UIGF1dGgtY29uc3RyYWludCAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUqKT4KLQotPCEtLQotVGhlIHJvbGUtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4KLS0tPgotCi08IUVMRU1FTlQgcm9sZS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGxvZ2luLWNvbmZpZyBlbGVtZW50IGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBhdXRoZW50aWNhdGlvbgotbWV0aG9kIHRoYXQgc2hvdWxkIGJlIHVzZWQsIHRoZSByZWFsbSBuYW1lIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yCi10aGlzIGFwcGxpY2F0aW9uLCBhbmQgdGhlIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbmVlZGVkIGJ5IHRoZSBmb3JtIGxvZ2luCi1tZWNoYW5pc20uCi0tLT4KLQotPCFFTEVNRU5UIGxvZ2luLWNvbmZpZyAoYXV0aC1tZXRob2Q/LCByZWFsbS1uYW1lPywgZm9ybS1sb2dpbi1jb25maWc/KT4KLQotPCEtLQotVGhlIHJlYWxtIG5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHJlYWxtIG5hbWUgdG8gdXNlIGluIEhUVFAKLUJhc2ljIGF1dGhvcml6YXRpb24KLS0tPgotCi08IUVMRU1FTlQgcmVhbG0tbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBmb3JtLWxvZ2luLWNvbmZpZyBlbGVtZW50IHNwZWNpZmllcyB0aGUgbG9naW4gYW5kIGVycm9yIHBhZ2VzCi10aGF0IHNob3VsZCBiZSB1c2VkIGluIGZvcm0gYmFzZWQgbG9naW4uIElmIGZvcm0gYmFzZWQgYXV0aGVudGljYXRpb24KLWlzIG5vdCB1c2VkLCB0aGVzZSBlbGVtZW50cyBhcmUgaWdub3JlZC4KLS0tPgotCi08IUVMRU1FTlQgZm9ybS1sb2dpbi1jb25maWcgKGZvcm0tbG9naW4tcGFnZSwgZm9ybS1lcnJvci1wYWdlKT4KLQotPCEtLQotVGhlIGZvcm0tbG9naW4tcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluIHRoZSB3ZWIgYXBwCi13aGVyZSB0aGUgcGFnZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBsb2dpbiBjYW4gYmUgZm91bmQKLS0tPgotCi08IUVMRU1FTlQgZm9ybS1sb2dpbi1wYWdlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGZvcm0tZXJyb3ItcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluIHRoZSB3ZWIgYXBwCi13aGVyZSB0aGUgZXJyb3IgcGFnZSB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIGxvZ2luIGlzIG5vdCBzdWNjZXNzZnVsCi1jYW4gYmUgZm91bmQKLS0tPgotCi08IUVMRU1FTlQgZm9ybS1lcnJvci1wYWdlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGF1dGgtbWV0aG9kIGVsZW1lbnQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uCi1tZWNoYW5pc20gZm9yIHRoZSB3ZWIgYXBwbGljYXRpb24uIEFzIGEgcHJlcmVxdWlzaXRlIHRvIGdhaW5pbmcgYWNjZXNzCi10byBhbnkgd2ViIHJlc291cmNlcyB3aGljaCBhcmUgcHJvdGVjdGVkIGJ5IGFuIGF1dGhvcml6YXRpb24KLWNvbnN0cmFpbnQsIGEgdXNlciBtdXN0IGhhdmUgYXV0aGVudGljYXRlZCB1c2luZyB0aGUgY29uZmlndXJlZAotbWVjaGFuaXNtLiBMZWdhbCB2YWx1ZXMgZm9yIHRoaXMgZWxlbWVudCBhcmUgIkJBU0lDIiwgIkRJR0VTVCIsCi0iRk9STSIsIG9yICJDTElFTlQtQ0VSVCIuCi0tLT4KLQotPCFFTEVNRU5UIGF1dGgtbWV0aG9kICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSBzZWN1cml0eQotcm9sZSB3aGljaCBpcyB1c2VkIGluIHRoZSBzZWN1cml0eS1jb25zdHJhaW50cyBwbGFjZWQgb24gdGhlIHdlYgotYXBwbGljYXRpb24uCi0tLT4KLQotPCFFTEVNRU5UIHNlY3VyaXR5LXJvbGUgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lKT4KLQotPCEtLQotVGhlIHJvbGUtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcm9sZS4gVGhpcyBlbGVtZW50Ci1tdXN0IGNvbnRhaW4gYSBub24tZW1wdHkgc3RyaW5nLgotLS0+Ci0KLTwhRUxFTUVOVCBzZWN1cml0eS1yb2xlLXJlZiAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUsIHJvbGUtbGluayk+Ci0KLTwhLS0KLVRoZSByb2xlLWxpbmsgZWxlbWVudCBpcyB1c2VkIHRvIGxpbmsgYSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZQotdG8gYSBkZWZpbmVkIHNlY3VyaXR5IHJvbGUuIFRoZSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGNvbnRhaW4gdGhlCi1uYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUgc2VjdXJpdHktcm9sZQotZWxlbWVudHMuCi0tLT4KLQotPCFFTEVNRU5UIHJvbGUtbGluayAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnkgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYW4KLWFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgZW50cnkuIFRoaXMgZWxlbWVudCBpcyByZXF1aXJlZCB0byBiZQotaG9ub3JlZCBvbiBpbiBKMkVFIGNvbXBsaWFudCBzZXJ2bGV0IGNvbnRhaW5lcnMuCi0tLT4KLQotPCFFTEVNRU5UIGVudi1lbnRyeSAoZGVzY3JpcHRpb24/LCBlbnYtZW50cnktbmFtZSwgZW52LWVudHJ5LXZhbHVlPywKLWVudi1lbnRyeS10eXBlKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIGFwcGxpY2F0aW9uJ3MKLWVudmlyb25tZW50IGVudHJ5Ci0tLT4KLQotPCFFTEVNRU5UIGVudi1lbnRyeS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVudi1lbnRyeS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhbgotYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBlbnRyeQotLS0+Ci0KLTwhRUxFTUVOVCBlbnYtZW50cnktdmFsdWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIEphdmEgdHlwZQotb2YgdGhlIGVudmlyb25tZW50IGVudHJ5IHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uCi1jb2RlLiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGVudi1lbnRyeS10eXBlOgotamF2YS5sYW5nLkJvb2xlYW4sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5JbnRlZ2VyLAotamF2YS5sYW5nLkRvdWJsZSwgamF2YS5sYW5nLkZsb2F0LgotLS0+Ci0KLTwhRUxFTUVOVCBlbnYtZW50cnktdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItcmVmIGVsZW1lbnQgaXMgdXNlZCB0byBkZWNsYXJlIGEgcmVmZXJlbmNlIHRvIGFuCi1lbnRlcnByaXNlIGJlYW4uIAotLS0+Ci0KLTwhRUxFTUVOVCBlamItcmVmIChkZXNjcmlwdGlvbj8sIGVqYi1yZWYtbmFtZSwgZWpiLXJlZi10eXBlLCBob21lLCByZW1vdGUsCi1lamItbGluaz8pPgotCi08IS0tCi1UaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi1yZWZlcmVuY2UuIFRoaXMgaXMgdGhlIEpOREkgbmFtZSB0aGF0IHRoZSBzZXJ2bGV0IGNvZGUgdXNlcyB0byBnZXQgYQotcmVmZXJlbmNlIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4uCi0tLT4KLQotPCFFTEVNRU5UIGVqYi1yZWYtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItcmVmLXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgZXhwZWN0ZWQgamF2YSBjbGFzcyB0eXBlIG9mCi10aGUgcmVmZXJlbmNlZCBFSkIuCi0tLT4KLQotPCFFTEVNRU5UIGVqYi1yZWYtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItaG9tZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUKLUVKQidzIGhvbWUgaW50ZXJmYWNlCi0tLT4KLQotPCFFTEVNRU5UIGhvbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZWpiLXJlbW90ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUKLUVKQidzIHJlbW90ZSBpbnRlcmZhY2UKLS0tPgotCi08IUVMRU1FTlQgcmVtb3RlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1saW5rIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgZWpiLXJlZiBlbGVtZW50IHRvIHNwZWNpZnkKLXRoYXQgYW4gRUpCIHJlZmVyZW5jZSBpcyBsaW5rZWQgdG8gYW4gRUpCIGluIGFuIGVuY29tcGFzc2luZyBKYXZhMgotRW50ZXJwcmlzZSBFZGl0aW9uIChKMkVFKSBhcHBsaWNhdGlvbiBwYWNrYWdlLiBUaGUgdmFsdWUgb2YgdGhlCi1lamItbGluayBlbGVtZW50IG11c3QgYmUgdGhlIGVqYi1uYW1lIG9mIGFuZCBFSkIgaW4gdGhlIEoyRUUKLWFwcGxpY2F0aW9uIHBhY2thZ2UuCi0tLT4KLQotPCFFTEVNRU5UIGVqYi1saW5rICgjUENEQVRBKT4KLQotPCEtLQotVGhlIElEIG1lY2hhbmlzbSBpcyB0byBhbGxvdyB0b29scyB0byBlYXNpbHkgbWFrZSB0b29sLXNwZWNpZmljCi1yZWZlcmVuY2VzIHRvIHRoZSBlbGVtZW50cyBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBUaGlzIGFsbG93cwotdG9vbHMgdGhhdCBwcm9kdWNlIGFkZGl0aW9uYWwgZGVwbG95bWVudCBpbmZvcm1hdGlvbiAoaS5lIGluZm9ybWF0aW9uCi1iZXlvbmQgdGhlIHN0YW5kYXJkIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpbmZvcm1hdGlvbikgdG8gc3RvcmUgdGhlCi1ub24tc3RhbmRhcmQgaW5mb3JtYXRpb24gaW4gYSBzZXBhcmF0ZSBmaWxlLCBhbmQgZWFzaWx5IHJlZmVyIGZyb20KLXRoZXNlIHRvb2xzLXNwZWNpZmljIGZpbGVzIHRvIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgc3RhbmRhcmQgd2ViLWFwcAotZGVwbG95bWVudCBkZXNjcmlwdG9yLgotLS0+Ci0KLTwhQVRUTElTVCB3ZWItYXBwIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc21hbGwtaWNvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsYXJnZS1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRpc3BsYXktbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZXNjcmlwdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkaXN0cmlidXRhYmxlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbnRleHQtcGFyYW0gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcGFyYW0tbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwYXJhbS12YWx1ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZXJ2bGV0IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlcnZsZXQtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZXJ2bGV0LWNsYXNzIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGpzcC1maWxlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGluaXQtcGFyYW0gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbG9hZC1vbi1zdGFydHVwIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlcnZsZXQtbWFwcGluZyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB1cmwtcGF0dGVybiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZXNzaW9uLWNvbmZpZyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZXNzaW9uLXRpbWVvdXQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWltZS1tYXBwaW5nIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGV4dGVuc2lvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtaW1lLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgd2VsY29tZS1maWxlLWxpc3QgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgd2VsY29tZS1maWxlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRhZ2xpYiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0YWdsaWItdXJpIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRhZ2xpYi1sb2NhdGlvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlcnJvci1wYWdlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVycm9yLWNvZGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZXhjZXB0aW9uLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbG9jYXRpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzb3VyY2UtcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXMtYXV0aCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZWN1cml0eS1jb25zdHJhaW50IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHdlYi1yZXNvdXJjZS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGh0dHAtbWV0aG9kIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHVzZXItZGF0YS1jb25zdHJhaW50IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRyYW5zcG9ydC1ndWFyYW50ZWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXV0aC1jb25zdHJhaW50IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJvbGUtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsb2dpbi1jb25maWcgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVhbG0tbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmb3JtLWxvZ2luLWNvbmZpZyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmb3JtLWxvZ2luLXBhZ2UgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZm9ybS1lcnJvci1wYWdlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGF1dGgtbWV0aG9kIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlY3VyaXR5LXJvbGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VjdXJpdHktcm9sZS1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgcm9sZS1saW5rIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlbnYtZW50cnktdmFsdWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5LXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLXJlZi10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGhvbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVtb3RlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1saW5rIGlkIElEICNJTVBMSUVEPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItYXBwXzJfMy5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl8zLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUzYWIwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl8zLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNjMgKzAsMCBAQAotPCEtLQotQ29weXJpZ2h0IChjKSAyMDAwIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sCi05MDEgU2FuIEFudG9uaW8gUm9hZCwKLVBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIHJlbGF0aW5nIHRvCi10ZWNobm9sb2d5IGVtYm9kaWVkIGluIHRoZSBwcm9kdWN0IHRoYXQgaXMgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuCi1JbiBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzIGxpc3RlZCBhdAotaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlIGFkZGl0aW9uYWwgcGF0ZW50cyBvcgotcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZSBVLlMuIGFuZCBpbiBvdGhlciBjb3VudHJpZXMuCi0KLVRoaXMgZG9jdW1lbnQgYW5kIHRoZSBwcm9kdWN0IHRvIHdoaWNoIGl0IHBlcnRhaW5zIGFyZSBkaXN0cmlidXRlZAotdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLCBkaXN0cmlidXRpb24sIGFuZAotZGVjb21waWxhdGlvbi4gIFRoaXMgZG9jdW1lbnQgbWF5IGJlIHJlcHJvZHVjZWQgYW5kIGRpc3RyaWJ1dGVkIGJ1dCBtYXkKLW5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzCi1saWNlbnNvcnMsIGlmIGFueS4KLQotVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzIGNvcHlyaWdodGVkIGFuZAotbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi1TdW4sICBTdW4gTWljcm9zeXN0ZW1zLCAgdGhlIFN1biBsb2dvLCAgSmF2YSwgIEphdmFTZXJ2ZXIgUGFnZXMsICBKYXZhCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsICBKREJDLCAgSkRLLCAgSmF2YU1haWwgYW5kICBhbmQKLUVudGVycHJpc2UgSmF2YUJlYW5zIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLU1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMgU3ViamVjdCB0bwotU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTEwgRVhQUkVTUyBPUiBJTVBMSUVECi1DT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5EIFdBUlJBTlRJRVMsIElOQ0xVRElORyBBTlkgSU1QTElFRAotV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IKLU5PTi1JTkZSSU5HRU1FTlQsIEFSRSBESVNDTEFJTUVELCBFWENFUFQgVE8gVEhFIEVYVEVOVCBUSEFUIFNVQ0gKLURJU0NMQUlNRVJTIEFSRSBIRUxEIFRPIEJFIExFR0FMTFkgSU5WQUxJRC4KLQotCi1fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0KLUNvcHlyaWdodCAoYykgMjAwMCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLAotOTAxIFNhbiBBbnRvbmlvIFJvYWQsCi1QYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIEUndGF0cy1VbmlzLgotVG91cyBkcm9pdHMgcmUnc2VydmUncy4KLQotU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhIGxlcyBkcm9pdHMgZGUgcHJvcHJpZSd0ZScgaW50ZWxsZWN0dWVscwotcmVsYXRhbnRzIGFgIGxhIHRlY2hub2xvZ2llIGluY29ycG9yZSdlIGRhbnMgbGUgcHJvZHVpdCBxdWkgZXN0IGRlJ2NyaXQKLWRhbnMgY2UgZG9jdW1lbnQuIEVuIHBhcnRpY3VsaWVyLCBldCBzYW5zIGxhIGxpbWl0YXRpb24sIGNlcyBkcm9pdHMgZGUKLXByb3ByaWUndGUnIGludGVsbGVjdHVlbHMgcGV1dmVudCBpbmNsdXJlIHVuIG91IHBsdXMgZGVzIGJyZXZldHMKLWFtZSdyaWNhaW5zIGUnbnVtZSdyZSdzIGFgIGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGV0IHVuIG91IGxlcwotYnJldmV0cyBwbHVzIHN1cHBsZSdtZW50YWlyZXMgb3UgbGVzIGFwcGxpY2F0aW9ucyBkZSBicmV2ZXQgZW4gYXR0ZW50ZQotZGFucyBsZXMgRSd0YXRzLVVuaXMgZXQgZGFucyBsZXMgYXV0cmVzIHBheXMuCi0KLUNlIHByb2R1aXQgb3UgZG9jdW1lbnQgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IGV0IGRpc3RyaWJ1ZScKLWF2ZWMgZGVzIGxpY2VuY2VzIHF1aSBlbiByZXN0cmVpZ25lbnQgbCd1dGlsaXNhdGlvbiwgbGEgY29waWUsIGxhCi1kaXN0cmlidXRpb24sIGV0IGxhIGRlJ2NvbXBpbGF0aW9uLiAgQ2UgZG9jdW1lbnRpb24gYXNzb2NpZSBuIHBldXQKLWVedHJlIHJlcHJvZHVpdGUgZXQgZGlzdHJpYnVlciwgcGFyIHF1ZWxxdWUgbW95ZW4gcXVlIGNlIHNvaXQsIHNhbnMKLWwnYXV0b3Jpc2F0aW9uIHByZSdhbGFibGUgZXQgZSdjcml0ZSBkZSBTdW4gZXQgZGUgc2VzIGJhaWxsZXVycyBkZQotbGljZW5jZSwgbGUgY2FzIGUnY2hlJ2FudC4KLQotTGUgbG9naWNpZWwgZGUndGVudSBwYXIgZGVzIHRpZXJzLCBldCBxdWkgY29tcHJlbmQgbGEgdGVjaG5vbG9naWUKLXJlbGF0aXZlIGF1eCBwb2xpY2VzIGRlIGNhcmFjdGVgcmVzLCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQKLWxpY2VuY2llJyBwYXIgZGVzIGZvdXJuaXNzZXVycyBkZSBTdW4uCi0KLVN1biwgIFN1biBNaWNyb3N5c3RlbXMsICBsZSBsb2dvIFN1biwgIEphdmEsICBKYXZhU2VydmVyIFBhZ2VzLCAgSmF2YQotTmFtaW5nIGFuZCBEaXJlY3RvcnkgSW50ZXJmYWNlLCAgSkRCQywgIEpESywgIEphdmFNYWlsIGV0ICBhbmQKLUVudGVycHJpc2UgSmF2YUJlYW5zIHNvbnQgZGVzIG1hcnF1ZXMgZGUgZmFicmlxdWUgb3UgZGVzIG1hcnF1ZXMKLWRlJ3Bvc2UnZXMgZGUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhdXggRSd0YXRzLVVuaXMgZXQgZGFucyBkJ2F1dHJlcwotcGF5cy4KLQotTEEgRE9DVU1FTlRBVElPTiBFU1QgRk9VUk5JRSAiRU4gTCdFJ1RBVCIgRVQgVE9VVEVTIEFVVFJFUyBDT05ESVRJT05TLAotREVDTEFSQVRJT05TIEVUIEdBUkFOVElFUyBFWFBSRVNTRVMgT1UgVEFDSVRFUyBTT05UIEZPUk1FTExFTUVOVAotRVhDTFVFUywgREFOUyBMQSBNRVNVUkUgQVVUT1JJU0VFIFBBUiBMQSBMT0kgQVBQTElDQUJMRSwgWSBDT01QUklTCi1OT1RBTU1FTlQgVE9VVEUgR0FSQU5USUUgSU1QTElDSVRFIFJFTEFUSVZFIEEgTEEgUVVBTElURSBNQVJDSEFOREUsIEEKLUwnQVBUSVRVREUgQSBVTkUgVVRJTElTQVRJT04gUEFSVElDVUxJRVJFIE9VIEEgTCdBQlNFTkNFIERFCi1DT05UUkVGQUMsT04uCi0tLT4KLQotPCEtLQotVGhpcyBpcyB0aGUgWE1MIERURCBmb3IgdGhlIFNlcnZsZXQgMi4zIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLUFsbCBTZXJ2bGV0IDIuMyBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5jbHVkZSBhIERPQ1RZUEUKLW9mIHRoZSBmb2xsb3dpbmcgZm9ybToKLQotICA8IURPQ1RZUEUgd2ViLWFwcCBQVUJMSUMKLQkiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIgotCSJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItYXBwXzJfMy5kdGQiPgotCi0tLT4KLQotPCEtLQotVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLWVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0tIEluIGVsZW1lbnRzIHRoYXQgY29udGFpbiBQQ0RBVEEsIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UKLSAgaW4gdGhlIGRhdGEgbWF5IGJlIGlnbm9yZWQuCi0KLS0gSW4gZWxlbWVudHMgd2hvc2UgdmFsdWUgaXMgYW4gImVudW1lcmF0ZWQgdHlwZSIsIHRoZSB2YWx1ZSBpcwotICBjYXNlIHNlbnNpdGl2ZS4KLQotLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZSBzYW1lCi0gIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdCBzdGFydGluZyB3aXRoICIvIikKLSAgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLgotICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkKLSAgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUKLSAgbmFtZXMgYXJlIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBzZXJ2bGV0IEFQSS4KLS0tPgotCi0KLTwhLS0KLVRoZSB3ZWItYXBwIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3IKLWEgd2ViIGFwcGxpY2F0aW9uLgotLS0+Ci08IUVMRU1FTlQgd2ViLWFwcCAoaWNvbj8sIGRpc3BsYXktbmFtZT8sIGRlc2NyaXB0aW9uPywgZGlzdHJpYnV0YWJsZT8sCi1jb250ZXh0LXBhcmFtKiwgZmlsdGVyKiwgZmlsdGVyLW1hcHBpbmcqLCBsaXN0ZW5lciosIHNlcnZsZXQqLAotc2VydmxldC1tYXBwaW5nKiwgc2Vzc2lvbi1jb25maWc/LCBtaW1lLW1hcHBpbmcqLCB3ZWxjb21lLWZpbGUtbGlzdD8sCi1lcnJvci1wYWdlKiwgdGFnbGliKiwgcmVzb3VyY2UtZW52LXJlZiosIHJlc291cmNlLXJlZiosIHNlY3VyaXR5LWNvbnN0cmFpbnQqLAotbG9naW4tY29uZmlnPywgc2VjdXJpdHktcm9sZSosIGVudi1lbnRyeSosIGVqYi1yZWYqLCAgZWpiLWxvY2FsLXJlZiopPgotCi08IS0tCi1UaGUgYXV0aC1jb25zdHJhaW50IGVsZW1lbnQgaW5kaWNhdGVzIHRoZSB1c2VyIHJvbGVzIHRoYXQgc2hvdWxkCi1iZSBwZXJtaXR0ZWQgYWNjZXNzIHRvIHRoaXMgcmVzb3VyY2UgY29sbGVjdGlvbi4gVGhlIHJvbGUtbmFtZQotdXNlZCBoZXJlIG11c3QgZWl0aGVyIGNvcnJlc3BvbmQgdG8gdGhlIHJvbGUtbmFtZSBvZiBvbmUgb2YgdGhlCi1zZWN1cml0eS1yb2xlIGVsZW1lbnRzIGRlZmluZWQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLCBvciBiZQotdGhlIHNwZWNpYWxseSByZXNlcnZlZCByb2xlLW5hbWUgIioiIHRoYXQgaXMgYSBjb21wYWN0IHN5bnRheCBmb3IKLWluZGljYXRpbmcgYWxsIHJvbGVzIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uIElmIGJvdGggIioiIGFuZAotcm9sZW5hbWVzIGFwcGVhciwgdGhlIGNvbnRhaW5lciBpbnRlcnByZXRzIHRoaXMgYXMgYWxsIHJvbGVzLgotSWYgbm8gcm9sZXMgYXJlIGRlZmluZWQsIG5vIHVzZXIgaXMgYWxsb3dlZCBhY2Nlc3MgdG8gdGhlIHBvcnRpb24gb2YKLXRoZSB3ZWIgYXBwbGljYXRpb24gZGVzY3JpYmVkIGJ5IHRoZSBjb250YWluaW5nIHNlY3VyaXR5LWNvbnN0cmFpbnQuCi1UaGUgY29udGFpbmVyIG1hdGNoZXMgcm9sZSBuYW1lcyBjYXNlIHNlbnNpdGl2ZWx5IHdoZW4gZGV0ZXJtaW5pbmcKLWFjY2Vzcy4KLQotCi1Vc2VkIGluOiBzZWN1cml0eS1jb25zdHJhaW50Ci0tLT4KLTwhRUxFTUVOVCBhdXRoLWNvbnN0cmFpbnQgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lKik+Ci0KLTwhLS0KLVRoZSBhdXRoLW1ldGhvZCBlbGVtZW50IGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBhdXRoZW50aWNhdGlvbgotbWVjaGFuaXNtIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uLiBBcyBhIHByZXJlcXVpc2l0ZSB0byBnYWluaW5nIGFjY2VzcyB0byBhbnkgd2ViIHJlc291cmNlcyB3aGljaCBhcmUgcHJvdGVjdGVkIGJ5IGFuIGF1dGhvcml6YXRpb24KLWNvbnN0cmFpbnQsIGEgdXNlciBtdXN0IGhhdmUgYXV0aGVudGljYXRlZCB1c2luZyB0aGUgY29uZmlndXJlZAotbWVjaGFuaXNtLiBMZWdhbCB2YWx1ZXMgZm9yIHRoaXMgZWxlbWVudCBhcmUgIkJBU0lDIiwgIkRJR0VTVCIsCi0iRk9STSIsIG9yICJDTElFTlQtQ0VSVCIuCi0KLVVzZWQgaW46IGxvZ2luLWNvbmZpZwotLS0+Ci08IUVMRU1FTlQgYXV0aC1tZXRob2QgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgY29udGV4dC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHdlYgotYXBwbGljYXRpb24ncyBzZXJ2bGV0IGNvbnRleHQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4KLQotVXNlZCBpbjogd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgY29udGV4dC1wYXJhbSAocGFyYW0tbmFtZSwgcGFyYW0tdmFsdWUsIGRlc2NyaXB0aW9uPyk+Ci0KLTwhLS0KLVRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudAotZWxlbWVudC4gIFRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBpbmNsdWRlIGFueSBpbmZvcm1hdGlvbiB0aGF0Ci10aGUgd2ViIGFwcGxpY2F0aW9uIHdhciBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mCi10aGUgd2ViIGFwcGxpY2F0aW9uIHdhciBmaWxlIChpLmUuLCB0byB0aGUgRGVwbG95ZXIpLiBUeXBpY2FsbHksIHRoZSB0b29scwotdXNlZCBieSB0aGUgd2ViIGFwcGxpY2F0aW9uIHdhciBmaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheSB0aGUgZGVzY3JpcHRpb24KLXdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgZGVzY3JpcHRpb24uCi0KLVVzZWQgaW46IGF1dGgtY29uc3RyYWludCwgY29udGV4dC1wYXJhbSwgZWpiLWxvY2FsLXJlZiwgZWpiLXJlZiwKLWVudi1lbnRyeSwgZmlsdGVyLCBpbml0LXBhcmFtLCByZXNvdXJjZS1lbnYtcmVmLCByZXNvdXJjZS1yZWYsIHJ1bi1hcywKLXNlY3VyaXR5LXJvbGUsIHNlY3VyaXR5LXJvbGUtcmVmLCBzZXJ2bGV0LCB1c2VyLWRhdGEtY29uc3RyYWludCwKLXdlYi1hcHAsIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uCi0tLT4KLTwhRUxFTUVOVCBkZXNjcmlwdGlvbiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZQotZGlzcGxheWVkIGJ5IHRvb2xzLiAgVGhlIGRpc3BsYXkgbmFtZSBuZWVkIG5vdCBiZSB1bmlxdWUuCi0KLVVzZWQgaW46IGZpbHRlciwgc2VjdXJpdHktY29uc3RyYWludCwgc2VydmxldCwgd2ViLWFwcAotCi1FeGFtcGxlOgotCi08ZGlzcGxheS1uYW1lPkVtcGxveWVlIFNlbGYgU2VydmljZTwvZGlzcGxheS1uYW1lPgotLS0+Ci08IUVMRU1FTlQgZGlzcGxheS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGRpc3RyaWJ1dGFibGUgZWxlbWVudCwgYnkgaXRzIHByZXNlbmNlIGluIGEgd2ViIGFwcGxpY2F0aW9uCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IsIGluZGljYXRlcyB0aGF0IHRoaXMgd2ViIGFwcGxpY2F0aW9uIGlzCi1wcm9ncmFtbWVkIGFwcHJvcHJpYXRlbHkgdG8gYmUgZGVwbG95ZWQgaW50byBhIGRpc3RyaWJ1dGVkIHNlcnZsZXQKLWNvbnRhaW5lcgotCi1Vc2VkIGluOiB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCBkaXN0cmlidXRhYmxlIEVNUFRZPgotCi08IS0tCi1UaGUgZWpiLWxpbmsgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBlamItcmVmIG9yIGVqYi1sb2NhbC1yZWYKLWVsZW1lbnRzIHRvIHNwZWNpZnkgdGhhdCBhbiBFSkIgcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBhbgotZW50ZXJwcmlzZSBiZWFuLgotCi1UaGUgbmFtZSBpbiB0aGUgZWpiLWxpbmsgZWxlbWVudCBpcyBjb21wb3NlZCBvZiBhCi1wYXRoIG5hbWUgc3BlY2lmeWluZyB0aGUgZWpiLWphciBjb250YWluaW5nIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UKLWJlYW4gd2l0aCB0aGUgZWpiLW5hbWUgb2YgdGhlIHRhcmdldCBiZWFuIGFwcGVuZGVkIGFuZCBzZXBhcmF0ZWQgZnJvbQotdGhlIHBhdGggbmFtZSBieSAiIyIuICBUaGUgcGF0aCBuYW1lIGlzIHJlbGF0aXZlIHRvIHRoZSB3YXIgZmlsZQotY29udGFpbmluZyB0aGUgd2ViIGFwcGxpY2F0aW9uIHRoYXQgaXMgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbi4KLVRoaXMgYWxsb3dzIG11bHRpcGxlIGVudGVycHJpc2UgYmVhbnMgd2l0aCB0aGUgc2FtZSBlamItbmFtZSB0byBiZQotdW5pcXVlbHkgaWRlbnRpZmllZC4KLQotVXNlZCBpbjogZWpiLWxvY2FsLXJlZiwgZWpiLXJlZgotCi1FeGFtcGxlczoKLQotCTxlamItbGluaz5FbXBsb3llZVJlY29yZDwvZWpiLWxpbms+Ci0KLQk8ZWpiLWxpbms+Li4vcHJvZHVjdHMvcHJvZHVjdC5qYXIjUHJvZHVjdEVKQjwvZWpiLWxpbms+Ci0KLS0tPgotPCFFTEVNRU5UIGVqYi1saW5rICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVqYi1sb2NhbC1yZWYgZWxlbWVudCBpcyB1c2VkIGZvciB0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8KLWFuIGVudGVycHJpc2UgYmVhbidzIGxvY2FsIGhvbWUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLQotCS0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLQktIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uCi0JICB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbgotCS0gdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0JLSB0aGUgZXhwZWN0ZWQgbG9jYWwgaG9tZSBhbmQgbG9jYWwgaW50ZXJmYWNlcyBvZiB0aGUgcmVmZXJlbmNlZAotCSAgZW50ZXJwcmlzZSBiZWFuCi0JLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZSByZWZlcmVuY2VkCi0JICBlbnRlcnByaXNlIGJlYW4KLQotVXNlZCBpbjogd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgZWpiLWxvY2FsLXJlZiAoZGVzY3JpcHRpb24/LCBlamItcmVmLW5hbWUsIGVqYi1yZWYtdHlwZSwKLQkJbG9jYWwtaG9tZSwgbG9jYWwsIGVqYi1saW5rPyk+Ci0KLTwhLS0KLVRoZSBlamItcmVmIGVsZW1lbnQgaXMgdXNlZCBmb3IgdGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvCi1hbiBlbnRlcnByaXNlIGJlYW4ncyBob21lLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0KLQktIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0JLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YKLQkgIHRoZSB3ZWIgYXBwbGljYXRpb24gdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4KLQktIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotCS0gdGhlIGV4cGVjdGVkIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzIG9mIHRoZSByZWZlcmVuY2VkCi0JICBlbnRlcnByaXNlIGJlYW4KLQktIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlZmVyZW5jZWQKLQkgIGVudGVycHJpc2UgYmVhbgotCi1Vc2VkIGluOiB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCBlamItcmVmIChkZXNjcmlwdGlvbj8sIGVqYi1yZWYtbmFtZSwgZWpiLXJlZi10eXBlLAotCQlob21lLCByZW1vdGUsIGVqYi1saW5rPyk+Ci0KLTwhLS0KLVRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIgcmVmZXJlbmNlLiBUaGUKLUVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGFuZCBpcwotcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi13aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotCi1Vc2VkIGluOiBlamItbG9jYWwtcmVmLCBlamItcmVmCi0KLUV4YW1wbGU6Ci0KLTxlamItcmVmLW5hbWU+ZWpiL1BheXJvbGw8L2VqYi1yZWYtbmFtZT4KLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlamItcmVmLXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUKLXJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLgotCi1UaGUgZWpiLXJlZi10eXBlIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotCTxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0JPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0KLVVzZWQgaW46IGVqYi1sb2NhbC1yZWYsIGVqYi1yZWYKLS0tPgotPCFFTEVNRU5UIGVqYi1yZWYtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnkgZWxlbWVudCBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSB3ZWIgYXBwbGljYXRpb24ncwotZW52aXJvbm1lbnQgZW50cnkuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbAotZGVzY3JpcHRpb24sIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgYW5kIGFuIG9wdGlvbmFsCi12YWx1ZS4gIElmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCwgb25lIG11c3QgYmUgc3VwcGxpZWQKLWR1cmluZyBkZXBsb3ltZW50LgotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5IChkZXNjcmlwdGlvbj8sIGVudi1lbnRyeS1uYW1lLCBlbnYtZW50cnktdmFsdWU/LAotZW52LWVudHJ5LXR5cGUpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHdlYiBhcHBsaWNhdGlvbnMncwotZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKLWphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotRXhhbXBsZToKLQotPGVudi1lbnRyeS1uYW1lPm1pbkFtb3VudDwvZW52LWVudHJ5LW5hbWU+Ci0KLVVzZWQgaW46IGVudi1lbnRyeQotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZW52LWVudHJ5LXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBvZgotdGhlIGVudmlyb25tZW50IGVudHJ5IHZhbHVlIHRoYXQgaXMgZXhwZWN0ZWQgYnkgdGhlIHdlYiBhcHBsaWNhdGlvbidzCi1jb2RlLgotCi1UaGUgZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzIG9mIGVudi1lbnRyeS10eXBlOgotCi0JamF2YS5sYW5nLkJvb2xlYW4KLQlqYXZhLmxhbmcuQnl0ZQotCWphdmEubGFuZy5DaGFyYWN0ZXIKLQlqYXZhLmxhbmcuU3RyaW5nCi0JamF2YS5sYW5nLlNob3J0Ci0JamF2YS5sYW5nLkludGVnZXIKLQlqYXZhLmxhbmcuTG9uZwotCWphdmEubGFuZy5GbG9hdAotCWphdmEubGFuZy5Eb3VibGUKLQotVXNlZCBpbjogZW52LWVudHJ5Ci0tLT4KLTwhRUxFTUVOVCBlbnYtZW50cnktdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBlbnYtZW50cnktdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYSB3ZWIgYXBwbGljYXRpb24ncwotZW52aXJvbm1lbnQgZW50cnkuIFRoZSB2YWx1ZSBtdXN0IGJlIGEgU3RyaW5nIHRoYXQgaXMgdmFsaWQgZm9yIHRoZQotY29uc3RydWN0b3Igb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRoYXQgdGFrZXMgYSBzaW5nbGUgU3RyaW5nCi1wYXJhbWV0ZXIsIG9yIGZvciBqYXZhLmxhbmcuQ2hhcmFjdGVyLCBhIHNpbmdsZSBjaGFyYWN0ZXIuCi0KLUV4YW1wbGU6Ci0KLTxlbnYtZW50cnktdmFsdWU+MTAwLjAwPC9lbnYtZW50cnktdmFsdWU+Ci0KLVVzZWQgaW46IGVudi1lbnRyeQotLS0+Ci08IUVMRU1FTlQgZW52LWVudHJ5LXZhbHVlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGVycm9yLWNvZGUgY29udGFpbnMgYW4gSFRUUCBlcnJvciBjb2RlLCBleDogNDA0Ci0KLVVzZWQgaW46IGVycm9yLXBhZ2UKLS0tPgotPCFFTEVNRU5UIGVycm9yLWNvZGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZXJyb3ItcGFnZSBlbGVtZW50IGNvbnRhaW5zIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGVycm9yIGNvZGUKLW9yIGV4Y2VwdGlvbiB0eXBlIHRvIHRoZSBwYXRoIG9mIGEgcmVzb3VyY2UgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbgotCi1Vc2VkIGluOiB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCBlcnJvci1wYWdlICgoZXJyb3ItY29kZSB8IGV4Y2VwdGlvbi10eXBlKSwgbG9jYXRpb24pPgotCi08IS0tCi1UaGUgZXhjZXB0aW9uIHR5cGUgY29udGFpbnMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhCi1KYXZhIGV4Y2VwdGlvbiB0eXBlLgotCi1Vc2VkIGluOiBlcnJvci1wYWdlCi0tLT4KLTwhRUxFTUVOVCBleGNlcHRpb24tdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBleHRlbnNpb24gZWxlbWVudCBjb250YWlucyBhIHN0cmluZyBkZXNjcmliaW5nIGFuCi1leHRlbnNpb24uIGV4YW1wbGU6ICJ0eHQiCi0KLVVzZWQgaW46IG1pbWUtbWFwcGluZwotLS0+Ci08IUVMRU1FTlQgZXh0ZW5zaW9uICgjUENEQVRBKT4KLQotPCEtLQotRGVjbGFyZXMgYSBmaWx0ZXIgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4gVGhlIGZpbHRlciBpcyBtYXBwZWQgdG8KLWVpdGhlciBhIHNlcnZsZXQgb3IgYSBVUkwgcGF0dGVybiBpbiB0aGUgZmlsdGVyLW1hcHBpbmcgZWxlbWVudCwgdXNpbmcKLXRoZSBmaWx0ZXItbmFtZSB2YWx1ZSB0byByZWZlcmVuY2UuIEZpbHRlcnMgY2FuIGFjY2VzcyB0aGUKLWluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgZGVjbGFyZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhdAotcnVudGltZSB2aWEgdGhlIEZpbHRlckNvbmZpZyBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IHdlYi1hcHAKLS0tPgotPCFFTEVNRU5UIGZpbHRlciAoaWNvbj8sIGZpbHRlci1uYW1lLCBkaXNwbGF5LW5hbWU/LCBkZXNjcmlwdGlvbj8sCi1maWx0ZXItY2xhc3MsIGluaXQtcGFyYW0qKT4KLQotPCEtLQotVGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGZpbHRlci4KLQotVXNlZCBpbjogZmlsdGVyCi0tLT4KLTwhRUxFTUVOVCBmaWx0ZXItY2xhc3MgKCNQQ0RBVEEpPgotCi08IS0tCi1EZWNsYXJhdGlvbiBvZiB0aGUgZmlsdGVyIG1hcHBpbmdzIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUKLWNvbnRhaW5lciB1c2VzIHRoZSBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgdG8gZGVjaWRlIHdoaWNoIGZpbHRlcnMKLXRvIGFwcGx5IHRvIGEgcmVxdWVzdCwgYW5kIGluIHdoYXQgb3JkZXIuIFRoZSBjb250YWluZXIgbWF0Y2hlcyB0aGUKLXJlcXVlc3QgVVJJIHRvIGEgU2VydmxldCBpbiB0aGUgbm9ybWFsIHdheS4gVG8gZGV0ZXJtaW5lIHdoaWNoIGZpbHRlcnMKLXRvIGFwcGx5IGl0IG1hdGNoZXMgZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIGVpdGhlciBvbiBzZXJ2bGV0LW5hbWUsCi1vciBvbiB1cmwtcGF0dGVybiBmb3IgZWFjaCBmaWx0ZXItbWFwcGluZyBlbGVtZW50LCBkZXBlbmRpbmcgb24gd2hpY2gKLXN0eWxlIGlzIHVzZWQuIFRoZSBvcmRlciBpbiB3aGljaCBmaWx0ZXJzIGFyZSBpbnZva2VkIGlzIHRoZSBvcmRlciBpbgotd2hpY2ggZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIHRoYXQgbWF0Y2ggYSByZXF1ZXN0IFVSSSBmb3IgYQotc2VydmxldCBhcHBlYXIgaW4gdGhlIGxpc3Qgb2YgZmlsdGVyLW1hcHBpbmcgZWxlbWVudHMuVGhlIGZpbHRlci1uYW1lCi12YWx1ZSBtdXN0IGJlIHRoZSB2YWx1ZSBvZiB0aGUgPGZpbHRlci1uYW1lPiBzdWItZWxlbWVudHMgb2Ygb25lIG9mIHRoZQotPGZpbHRlcj4gZGVjbGFyYXRpb25zIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLVVzZWQgaW46IHdlYi1hcHAKLS0tPgotPCFFTEVNRU5UIGZpbHRlci1tYXBwaW5nIChmaWx0ZXItbmFtZSwgKHVybC1wYXR0ZXJuIHwgc2VydmxldC1uYW1lKSk+Ci0KLTwhLS0KLVRoZSBsb2dpY2FsIG5hbWUgb2YgdGhlIGZpbHRlci4gVGhpcyBuYW1lIGlzIHVzZWQgdG8gbWFwIHRoZSBmaWx0ZXIuCi1FYWNoIGZpbHRlciBuYW1lIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotVXNlZCBpbjogZmlsdGVyLCBmaWx0ZXItbWFwcGluZwotLS0+Ci08IUVMRU1FTlQgZmlsdGVyLW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgZm9ybS1lcnJvci1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYiBhcHAKLXdoZXJlIHRoZSBlcnJvciBwYWdlIHRoYXQgaXMgZGlzcGxheWVkIHdoZW4gbG9naW4gaXMgbm90IHN1Y2Nlc3NmdWwKLWNhbiBiZSBmb3VuZC4gVGhlIHBhdGggYmVnaW5zIHdpdGggYSBsZWFkaW5nIC8gYW5kIGlzIGludGVycHJldGVkCi1yZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgV0FSLgotCi1Vc2VkIGluOiBmb3JtLWxvZ2luLWNvbmZpZwotLS0+Ci08IUVMRU1FTlQgZm9ybS1lcnJvci1wYWdlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGZvcm0tbG9naW4tY29uZmlnIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBsb2dpbiBhbmQgZXJyb3IgcGFnZXMKLXRoYXQgc2hvdWxkIGJlIHVzZWQgaW4gZm9ybSBiYXNlZCBsb2dpbi4gSWYgZm9ybSBiYXNlZCBhdXRoZW50aWNhdGlvbgotaXMgbm90IHVzZWQsIHRoZXNlIGVsZW1lbnRzIGFyZSBpZ25vcmVkLgotCi1Vc2VkIGluOiBsb2dpbi1jb25maWcKLS0tPgotPCFFTEVNRU5UIGZvcm0tbG9naW4tY29uZmlnIChmb3JtLWxvZ2luLXBhZ2UsIGZvcm0tZXJyb3ItcGFnZSk+Ci0KLTwhLS0KLVRoZSBmb3JtLWxvZ2luLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgd2ViIGFwcAotd2hlcmUgdGhlIHBhZ2UgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbG9naW4gY2FuIGJlIGZvdW5kLiBUaGUgcGF0aAotYmVnaW5zIHdpdGggYSBsZWFkaW5nIC8gYW5kIGlzIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBXQVIuCi0KLVVzZWQgaW46IGZvcm0tbG9naW4tY29uZmlnCi0tLT4KLTwhRUxFTUVOVCBmb3JtLWxvZ2luLXBhZ2UgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgaG9tZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZQotYmVhbidzIGhvbWUgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiBlamItcmVmCi0KLUV4YW1wbGU6Ci0KLTxob21lPmNvbS5hYXJkdmFyay5wYXlyb2xsLlBheXJvbGxIb21lPC9ob21lPgotLS0+Ci08IUVMRU1FTlQgaG9tZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBodHRwLW1ldGhvZCBjb250YWlucyBhbiBIVFRQIG1ldGhvZCAoR0VUIHwgUE9TVCB8Li4uKS4KLQotVXNlZCBpbjogd2ViLXJlc291cmNlLWNvbGxlY3Rpb24KLS0tPgotPCFFTEVNRU5UIGh0dHAtbWV0aG9kICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGljb24gZWxlbWVudCBjb250YWlucyBzbWFsbC1pY29uIGFuZCBsYXJnZS1pY29uIGVsZW1lbnRzIHRoYXQKLXNwZWNpZnkgdGhlIGZpbGUgbmFtZXMgZm9yIHNtYWxsIGFuZCBhIGxhcmdlIEdJRiBvciBKUEVHIGljb24gaW1hZ2VzCi11c2VkIHRvIHJlcHJlc2VudCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gYSBHVUkgdG9vbC4KLQotVXNlZCBpbjogZmlsdGVyLCBzZXJ2bGV0LCB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCBpY29uIChzbWFsbC1pY29uPywgbGFyZ2UtaWNvbj8pPgotCi08IS0tCi1UaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS92YWx1ZSBwYWlyIGFzIGFuCi1pbml0aWFsaXphdGlvbiBwYXJhbSBvZiB0aGUgc2VydmxldAotCi1Vc2VkIGluOiBmaWx0ZXIsIHNlcnZsZXQKLS0tPgotPCFFTEVNRU5UIGluaXQtcGFyYW0gKHBhcmFtLW5hbWUsIHBhcmFtLXZhbHVlLCBkZXNjcmlwdGlvbj8pPgotCi08IS0tCi1UaGUganNwLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbCBwYXRoIHRvIGEgSlNQIGZpbGUgd2l0aGluCi10aGUgd2ViIGFwcGxpY2F0aW9uIGJlZ2lubmluZyB3aXRoIGEgYC8nLgotCi1Vc2VkIGluOiBzZXJ2bGV0Ci0tLT4KLTwhRUxFTUVOVCBqc3AtZmlsZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi1jb250YWluaW5nIGEgbGFyZ2UgKDMyIHggMzIpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi1uYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbidzCi13YXIgZmlsZS4KLQotVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4KLVRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCi1Vc2VkIGluOiBpY29uCi0KLUV4YW1wbGU6Ci0KLTxsYXJnZS1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZzwvbGFyZ2UtaWNvbj4KLS0tPgotPCFFTEVNRU5UIGxhcmdlLWljb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbGlzdGVuZXIgZWxlbWVudCBpbmRpY2F0ZXMgdGhlIGRlcGxveW1lbnQgcHJvcGVydGllcyBmb3IgYSB3ZWIKLWFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uCi0KLVVzZWQgaW46IHdlYi1hcHAKLS0tPgotPCFFTEVNRU5UIGxpc3RlbmVyIChsaXN0ZW5lci1jbGFzcyk+Ci0KLTwhLS0KLVRoZSBsaXN0ZW5lci1jbGFzcyBlbGVtZW50IGRlY2xhcmVzIGEgY2xhc3MgaW4gdGhlIGFwcGxpY2F0aW9uIG11c3QgYmUKLXJlZ2lzdGVyZWQgYXMgYSB3ZWIgYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4gVGhlIHZhbHVlIGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBsaXN0ZW5lciBjbGFzcy4KLQotCi1Vc2VkIGluOiBsaXN0ZW5lcgotLS0+Ci08IUVMRU1FTlQgbGlzdGVuZXItY2xhc3MgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgbG9hZC1vbi1zdGFydHVwIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhpcyBzZXJ2bGV0IHNob3VsZCBiZQotbG9hZGVkIChpbnN0YW50aWF0ZWQgYW5kIGhhdmUgaXRzIGluaXQoKSBjYWxsZWQpIG9uIHRoZSBzdGFydHVwCi1vZiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBUaGUgb3B0aW9uYWwgY29udGVudHMgb2YKLXRoZXNlIGVsZW1lbnQgbXVzdCBiZSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIG9yZGVyIGluIHdoaWNoCi10aGUgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkLiBJZiB0aGUgdmFsdWUgaXMgYSBuZWdhdGl2ZSBpbnRlZ2VyLAotb3IgdGhlIGVsZW1lbnQgaXMgbm90IHByZXNlbnQsIHRoZSBjb250YWluZXIgaXMgZnJlZSB0byBsb2FkIHRoZQotc2VydmxldCB3aGVuZXZlciBpdCBjaG9vc2VzLiBJZiB0aGUgdmFsdWUgaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyCi1vciAwLCB0aGUgY29udGFpbmVyIG11c3QgbG9hZCBhbmQgaW5pdGlhbGl6ZSB0aGUgc2VydmxldCBhcyB0aGUKLWFwcGxpY2F0aW9uIGlzIGRlcGxveWVkLiBUaGUgY29udGFpbmVyIG11c3QgZ3VhcmFudGVlIHRoYXQKLXNlcnZsZXRzIG1hcmtlZCB3aXRoIGxvd2VyIGludGVnZXJzIGFyZSBsb2FkZWQgYmVmb3JlIHNlcnZsZXRzCi1tYXJrZWQgd2l0aCBoaWdoZXIgaW50ZWdlcnMuIFRoZSBjb250YWluZXIgbWF5IGNob29zZSB0aGUgb3JkZXIKLW9mIGxvYWRpbmcgb2Ygc2VydmxldHMgd2l0aCB0aGUgc2FtZSBsb2FkLW9uLXN0YXJ0LXVwIHZhbHVlLgotCi1Vc2VkIGluOiBzZXJ2bGV0Ci0tLT4KLTwhRUxFTUVOVCBsb2FkLW9uLXN0YXJ0dXAgKCNQQ0RBVEEpPgotCi08IS0tCi0KLVRoZSBsb2NhbCBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUKLWVudGVycHJpc2UgYmVhbidzIGxvY2FsIGludGVyZmFjZS4KLQotVXNlZCBpbjogZWpiLWxvY2FsLXJlZgotCi0tLT4KLTwhRUxFTUVOVCBsb2NhbCAoI1BDREFUQSk+Ci0KLTwhLS0KLQotVGhlIGxvY2FsLWhvbWUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlCi1lbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBob21lIGludGVyZmFjZS4KLQotVXNlZCBpbjogZWpiLWxvY2FsLXJlZgotLS0+Ci08IUVMRU1FTlQgbG9jYWwtaG9tZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBsb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlIHdlYgotYXBwbGljYXRpb24gcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHZhbHVlIG9mCi10aGUgbG9jYXRpb24gbXVzdCBoYXZlIGEgbGVhZGluZyBgLycuCi0KLVVzZWQgaW46IGVycm9yLXBhZ2UKLS0tPgotPCFFTEVNRU5UIGxvY2F0aW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIGxvZ2luLWNvbmZpZyBlbGVtZW50IGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBhdXRoZW50aWNhdGlvbgotbWV0aG9kIHRoYXQgc2hvdWxkIGJlIHVzZWQsIHRoZSByZWFsbSBuYW1lIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yCi10aGlzIGFwcGxpY2F0aW9uLCBhbmQgdGhlIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbmVlZGVkIGJ5IHRoZSBmb3JtIGxvZ2luCi1tZWNoYW5pc20uCi0KLVVzZWQgaW46IHdlYi1hcHAKLS0tPgotPCFFTEVNRU5UIGxvZ2luLWNvbmZpZyAoYXV0aC1tZXRob2Q/LCByZWFsbS1uYW1lPywgZm9ybS1sb2dpbi1jb25maWc/KT4KLQotPCEtLQotVGhlIG1pbWUtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXh0ZW5zaW9uCi1hbmQgYSBtaW1lIHR5cGUuCi0KLVVzZWQgaW46IHdlYi1hcHAKLS0tPgotPCFFTEVNRU5UIG1pbWUtbWFwcGluZyAoZXh0ZW5zaW9uLCBtaW1lLXR5cGUpPgotCi08IS0tCi1UaGUgbWltZS10eXBlIGVsZW1lbnQgY29udGFpbnMgYSBkZWZpbmVkIG1pbWUgdHlwZS4gZXhhbXBsZToKLSJ0ZXh0L3BsYWluIgotCi1Vc2VkIGluOiBtaW1lLW1hcHBpbmcKLS0tPgotPCFFTEVNRU5UIG1pbWUtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBwYXJhbS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBwYXJhbWV0ZXIuIEVhY2ggcGFyYW1ldGVyCi1uYW1lIG11c3QgYmUgdW5pcXVlIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLQotVXNlZCBpbjogY29udGV4dC1wYXJhbSwgaW5pdC1wYXJhbQotLS0+Ci08IUVMRU1FTlQgcGFyYW0tbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBwYXJhbS12YWx1ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiBhIHBhcmFtZXRlci4KLQotVXNlZCBpbjogY29udGV4dC1wYXJhbSwgaW5pdC1wYXJhbQotLS0+Ci08IUVMRU1FTlQgcGFyYW0tdmFsdWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVhbG0gbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgcmVhbG0gbmFtZSB0byB1c2UgaW4gSFRUUAotQmFzaWMgYXV0aG9yaXphdGlvbi4KLQotVXNlZCBpbjogbG9naW4tY29uZmlnCi0tLT4KLTwhRUxFTUVOVCByZWFsbS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlbW90ZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZQotYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UuCi0KLVVzZWQgaW46IGVqYi1yZWYKLQotRXhhbXBsZToKLQotPHJlbW90ZT5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlPC9yZW1vdGU+Ci0tLT4KLTwhRUxFTUVOVCByZW1vdGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLWF1dGggZWxlbWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvZGUgc2lnbnMKLW9uIHByb2dyYW1tYXRpY2FsbHkgdG8gdGhlIHJlc291cmNlIG1hbmFnZXIsIG9yIHdoZXRoZXIgdGhlIENvbnRhaW5lcgotd2lsbCBzaWduIG9uIHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyIG9uIGJlaGFsZiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBJbiB0aGUKLWxhdHRlciBjYXNlLCB0aGUgQ29udGFpbmVyIHVzZXMgaW5mb3JtYXRpb24gdGhhdCBpcyBzdXBwbGllZCBieSB0aGUKLURlcGxveWVyLgotCi1UaGUgdmFsdWUgb2YgdGhpcyBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotCi0JPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLQk8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLQotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtYXV0aCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSByZXNvdXJjZSBtYW5hZ2VyCi1jb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlCi1qYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCi0KLVVzZWQgaW46IHJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzLXJlZi1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJlcy1zaGFyaW5nLXNjb3BlIGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgY29ubmVjdGlvbnMgb2J0YWluZWQKLXRocm91Z2ggdGhlIGdpdmVuIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBjYW4gYmUKLXNoYXJlZC4gVGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCwgaWYgc3BlY2lmaWVkLCBtdXN0IGJlIG9uZSBvZiB0aGUKLXR3byBmb2xsb3dpbmc6Ci0KLQk8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLQk8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotCi1UaGUgZGVmYXVsdCB2YWx1ZSBpcyBTaGFyZWFibGUuCi0KLVVzZWQgaW46IHJlc291cmNlLXJlZgotLS0+Ci08IUVMRU1FTlQgcmVzLXNoYXJpbmctc2NvcGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGRhdGEgc291cmNlLiBUaGUgdHlwZQotaXMgc3BlY2lmaWVkIGJ5IHRoZSBmdWxseSBxdWFsaWZpZWQgSmF2YSBsYW5ndWFnZSBjbGFzcyBvciBpbnRlcmZhY2UKLWV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkYXRhIHNvdXJjZS4KLQotVXNlZCBpbjogcmVzb3VyY2UtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXMtdHlwZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXNvdXJjZS1lbnYtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhIHdlYiBhcHBsaWNhdGlvbidzCi1yZWZlcmVuY2UgdG8gYW4gYWRtaW5pc3RlcmVkIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZQotaW4gdGhlIHdlYiBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50LiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLWRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIG5hbWUsIGFuZCBhbgotaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUgZXhwZWN0ZWQgYnkKLXRoZSB3ZWIgYXBwbGljYXRpb24gY29kZS4KLQotVXNlZCBpbjogd2ViLWFwcAotCi1FeGFtcGxlOgotCi08cmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZheC5qbXMuUXVldWU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLTwvcmVzb3VyY2UtZW52LXJlZj4KLS0tPgotPCFFTEVNRU5UIHJlc291cmNlLWVudi1yZWYgKGRlc2NyaXB0aW9uPywgcmVzb3VyY2UtZW52LXJlZi1uYW1lLAotCQlyZXNvdXJjZS1lbnYtcmVmLXR5cGUpPgotCi08IS0tCi1UaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgcmVzb3VyY2UKLWVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KLXRoZSB3ZWIgYXBwbGljYXRpb24gY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCi0KLVVzZWQgaW46IHJlc291cmNlLWVudi1yZWYKLS0tPgotPCFFTEVNRU5UIHJlc291cmNlLWVudi1yZWYtbmFtZSAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSByZXNvdXJjZS1lbnYtcmVmLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgYSByZXNvdXJjZQotZW52aXJvbm1lbnQgcmVmZXJlbmNlLiAgSXQgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YQotbGFuZ3VhZ2UgY2xhc3Mgb3IgaW50ZXJmYWNlLgotCi1Vc2VkIGluOiByZXNvdXJjZS1lbnYtcmVmCi0tLT4KLTwhRUxFTUVOVCByZXNvdXJjZS1lbnYtcmVmLXR5cGUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcmVzb3VyY2UtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhIHdlYiBhcHBsaWNhdGlvbidzCi1yZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2UuIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsCi1kZXNjcmlwdGlvbiwgdGhlIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBuYW1lLAotdGhlIGluZGljYXRpb24gb2YgdGhlIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHR5cGUKLWV4cGVjdGVkIGJ5IHRoZSB3ZWIgYXBwbGljYXRpb24gY29kZSwgdGhlIHR5cGUgb2YgYXV0aGVudGljYXRpb24KLShBcHBsaWNhdGlvbiBvciBDb250YWluZXIpLCBhbmQgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUKLXNoYXJlYWJpbGl0eSBvZiBjb25uZWN0aW9ucyBvYnRhaW5lZCBmcm9tIHRoZSByZXNvdXJjZSAoU2hhcmVhYmxlIG9yCi1VbnNoYXJlYWJsZSkuCi0KLVVzZWQgaW46IHdlYi1hcHAKLQotRXhhbXBsZToKLQotICAgIDxyZXNvdXJjZS1yZWY+Ci0JPHJlcy1yZWYtbmFtZT5qZGJjL0VtcGxveWVlQXBwREI8L3Jlcy1yZWYtbmFtZT4KLQk8cmVzLXR5cGU+amF2YXguc3FsLkRhdGFTb3VyY2U8L3Jlcy10eXBlPgotCTxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotCTxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotLS0+Ci08IUVMRU1FTlQgcmVzb3VyY2UtcmVmIChkZXNjcmlwdGlvbj8sIHJlcy1yZWYtbmFtZSwgcmVzLXR5cGUsIHJlcy1hdXRoLAotCQlyZXMtc2hhcmluZy1zY29wZT8pPgotCi08IS0tCi1UaGUgcm9sZS1saW5rIGVsZW1lbnQgaXMgYSByZWZlcmVuY2UgdG8gYSBkZWZpbmVkIHNlY3VyaXR5IHJvbGUuIFRoZQotcm9sZS1saW5rIGVsZW1lbnQgbXVzdCBjb250YWluIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMKLWRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuCi0KLVVzZWQgaW46IHNlY3VyaXR5LXJvbGUtcmVmCi0tLT4KLTwhRUxFTUVOVCByb2xlLWxpbmsgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgcm9sZS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotCi1UaGUgbmFtZSBtdXN0IGNvbmZvcm0gdG8gdGhlIGxleGljYWwgcnVsZXMgZm9yIGFuIE5NVE9LRU4uCi0KLVVzZWQgaW46IGF1dGgtY29uc3RyYWludCwgcnVuLWFzLCBzZWN1cml0eS1yb2xlLCBzZWN1cml0eS1yb2xlLXJlZgotLS0+Ci08IUVMRU1FTlQgcm9sZS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHJ1bi1hcyBlbGVtZW50IHNwZWNpZmllcyB0aGUgcnVuLWFzIGlkZW50aXR5IHRvIGJlIHVzZWQgZm9yIHRoZQotZXhlY3V0aW9uIG9mIHRoZSB3ZWIgYXBwbGljYXRpb24uIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQKLXRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4KLQotVXNlZCBpbjogc2VydmxldAotLS0+Ci08IUVMRU1FTlQgcnVuLWFzIChkZXNjcmlwdGlvbj8sIHJvbGUtbmFtZSk+Ci0KLTwhLS0KLVRoZSBzZWN1cml0eS1jb25zdHJhaW50IGVsZW1lbnQgaXMgdXNlZCB0byBhc3NvY2lhdGUgc2VjdXJpdHkKLWNvbnN0cmFpbnRzIHdpdGggb25lIG9yIG1vcmUgd2ViIHJlc291cmNlIGNvbGxlY3Rpb25zCi0KLVVzZWQgaW46IHdlYi1hcHAKLS0tPgotPCFFTEVNRU5UIHNlY3VyaXR5LWNvbnN0cmFpbnQgKGRpc3BsYXktbmFtZT8sIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uKywKLWF1dGgtY29uc3RyYWludD8sIHVzZXItZGF0YS1jb25zdHJhaW50Pyk+Ci0KLTwhLS0KLVRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYSBzZWN1cml0eQotcm9sZS4gVGhlIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlCi1zZWN1cml0eSByb2xlLCBhbmQgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZS4KLQotVXNlZCBpbjogd2ViLWFwcAotCi1FeGFtcGxlOgotCi0gICAgPHNlY3VyaXR5LXJvbGU+Ci0JPGRlc2NyaXB0aW9uPgotCSAgICBUaGlzIHJvbGUgaW5jbHVkZXMgYWxsIGVtcGxveWVlcyB3aG8gYXJlIGF1dGhvcml6ZWQKLQkgICAgdG8gYWNjZXNzIHRoZSBlbXBsb3llZSBzZXJ2aWNlIGFwcGxpY2F0aW9uLgotCTwvZGVzY3JpcHRpb24+Ci0JPHJvbGUtbmFtZT5lbXBsb3llZTwvcm9sZS1uYW1lPgotICAgIDwvc2VjdXJpdHktcm9sZT4KLS0tPgotPCFFTEVNRU5UIHNlY3VyaXR5LXJvbGUgKGRlc2NyaXB0aW9uPywgcm9sZS1uYW1lKT4KLQotPCEtLQotVGhlIHNlY3VyaXR5LXJvbGUtcmVmIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgc2VjdXJpdHkKLXJvbGUgcmVmZXJlbmNlIGluIHRoZSB3ZWIgYXBwbGljYXRpb24ncyBjb2RlLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMKLW9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUsCi1hbmQgYW4gb3B0aW9uYWwgbGluayB0byBhIHNlY3VyaXR5IHJvbGUuIElmIHRoZSBzZWN1cml0eSByb2xlIGlzIG5vdAotc3BlY2lmaWVkLCB0aGUgRGVwbG95ZXIgbXVzdCBjaG9vc2UgYW4gYXBwcm9wcmlhdGUgc2VjdXJpdHkgcm9sZS4KLQotVGhlIHZhbHVlIG9mIHRoZSByb2xlLW5hbWUgZWxlbWVudCBtdXN0IGJlIHRoZSBTdHJpbmcgdXNlZCBhcyB0aGUKLXBhcmFtZXRlciB0byB0aGUgRUpCQ29udGV4dC5pc0NhbGxlckluUm9sZShTdHJpbmcgcm9sZU5hbWUpIG1ldGhvZAotb3IgdGhlIEh0dHBTZXJ2bGV0UmVxdWVzdC5pc1VzZXJJblJvbGUoU3RyaW5nIHJvbGUpIG1ldGhvZC4KLQotVXNlZCBpbjogc2VydmxldAotCi0tLT4KLTwhRUxFTUVOVCBzZWN1cml0eS1yb2xlLXJlZiAoZGVzY3JpcHRpb24/LCByb2xlLW5hbWUsIHJvbGUtbGluaz8pPgotCi08IS0tCi1UaGUgc2VydmxldCBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGl2ZSBkYXRhIG9mIGEKLXNlcnZsZXQuIElmIGEganNwLWZpbGUgaXMgc3BlY2lmaWVkIGFuZCB0aGUgbG9hZC1vbi1zdGFydHVwIGVsZW1lbnQgaXMKLXByZXNlbnQsIHRoZW4gdGhlIEpTUCBzaG91bGQgYmUgcHJlY29tcGlsZWQgYW5kIGxvYWRlZC4KLQotVXNlZCBpbjogd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgc2VydmxldCAoaWNvbj8sIHNlcnZsZXQtbmFtZSwgZGlzcGxheS1uYW1lPywgZGVzY3JpcHRpb24/LAotKHNlcnZsZXQtY2xhc3N8anNwLWZpbGUpLCBpbml0LXBhcmFtKiwgbG9hZC1vbi1zdGFydHVwPywgcnVuLWFzPywgc2VjdXJpdHktcm9sZS1yZWYqKT4KLQotPCEtLQotVGhlIHNlcnZsZXQtY2xhc3MgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLW9mIHRoZSBzZXJ2bGV0LgotCi1Vc2VkIGluOiBzZXJ2bGV0Ci0tLT4KLTwhRUxFTUVOVCBzZXJ2bGV0LWNsYXNzICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHNlcnZsZXQtbWFwcGluZyBlbGVtZW50IGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYSBzZXJ2bGV0Ci1hbmQgYSB1cmwgcGF0dGVybgotCi1Vc2VkIGluOiB3ZWItYXBwCi0tLT4KLTwhRUxFTUVOVCBzZXJ2bGV0LW1hcHBpbmcgKHNlcnZsZXQtbmFtZSwgdXJsLXBhdHRlcm4pPgotCi08IS0tCi1UaGUgc2VydmxldC1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZQotc2VydmxldC4gRWFjaCBzZXJ2bGV0IG5hbWUgaXMgdW5pcXVlIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi1Vc2VkIGluOiBmaWx0ZXItbWFwcGluZywgc2VydmxldCwgc2VydmxldC1tYXBwaW5nCi0tLT4KLTwhRUxFTUVOVCBzZXJ2bGV0LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgc2Vzc2lvbi1jb25maWcgZWxlbWVudCBkZWZpbmVzIHRoZSBzZXNzaW9uIHBhcmFtZXRlcnMgZm9yCi10aGlzIHdlYiBhcHBsaWNhdGlvbi4KLQotVXNlZCBpbjogd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgc2Vzc2lvbi1jb25maWcgKHNlc3Npb24tdGltZW91dD8pPgotCi08IS0tCi1UaGUgc2Vzc2lvbi10aW1lb3V0IGVsZW1lbnQgZGVmaW5lcyB0aGUgZGVmYXVsdCBzZXNzaW9uIHRpbWVvdXQKLWludGVydmFsIGZvciBhbGwgc2Vzc2lvbnMgY3JlYXRlZCBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gVGhlCi1zcGVjaWZpZWQgdGltZW91dCBtdXN0IGJlIGV4cHJlc3NlZCBpbiBhIHdob2xlIG51bWJlciBvZiBtaW51dGVzLgotSWYgdGhlIHRpbWVvdXQgaXMgMCBvciBsZXNzLCB0aGUgY29udGFpbmVyIGVuc3VyZXMgdGhlIGRlZmF1bHQKLWJlaGF2aW91ciBvZiBzZXNzaW9ucyBpcyBuZXZlciB0byB0aW1lIG91dC4KLQotVXNlZCBpbjogc2Vzc2lvbi1jb25maWcKLS0tPgotPCFFTEVNRU5UIHNlc3Npb24tdGltZW91dCAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSBzbWFsbC1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCi1jb250YWluaW5nIGEgc21hbGwgKDE2IHggMTYpIGljb24gaW1hZ2UuIFRoZSBmaWxlCi1uYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbidzCi13YXIgZmlsZS4KLQotVGhlIGltYWdlIG1heSBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdC4KLVRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCi1Vc2VkIGluOiBpY29uCi0KLUV4YW1wbGU6Ci0KLTxzbWFsbC1pY29uPmVtcGxveWVlLXNlcnZpY2UtaWNvbjE2eDE2LmpwZzwvc21hbGwtaWNvbj4KLS0tPgotPCFFTEVNRU5UIHNtYWxsLWljb24gKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgdGFnbGliIGVsZW1lbnQgaXMgdXNlZCB0byBkZXNjcmliZSBhIEpTUCB0YWcgbGlicmFyeS4KLQotVXNlZCBpbjogd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgdGFnbGliICh0YWdsaWItdXJpLCB0YWdsaWItbG9jYXRpb24pPgotCi08IS0tCi10aGUgdGFnbGliLWxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIChhcyBhIHJlc291cmNlCi1yZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uKSB3aGVyZSB0byBmaW5kIHRoZSBUYWcKLUxpYmFyeSBEZXNjcmlwdGlvbiBmaWxlIGZvciB0aGUgdGFnIGxpYnJhcnkuCi0KLVVzZWQgaW46IHRhZ2xpYgotLS0+Ci08IUVMRU1FTlQgdGFnbGliLWxvY2F0aW9uICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHRhZ2xpYi11cmkgZWxlbWVudCBkZXNjcmliZXMgYSBVUkksIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbgotb2YgdGhlIHdlYi54bWwgZG9jdW1lbnQsIGlkZW50aWZ5aW5nIGEgVGFnIExpYnJhcnkgdXNlZCBpbiB0aGUgV2ViCi1BcHBsaWNhdGlvbi4KLQotVXNlZCBpbjogdGFnbGliCi0tLT4KLTwhRUxFTUVOVCB0YWdsaWItdXJpICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHRyYW5zcG9ydC1ndWFyYW50ZWUgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCB0aGUgY29tbXVuaWNhdGlvbgotYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBzaG91bGQgYmUgTk9ORSwgSU5URUdSQUwsIG9yCi1DT05GSURFTlRJQUwuIE5PTkUgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gZG9lcyBub3QgcmVxdWlyZSBhbnkKLXRyYW5zcG9ydCBndWFyYW50ZWVzLiBBIHZhbHVlIG9mIElOVEVHUkFMIG1lYW5zIHRoYXQgdGhlIGFwcGxpY2F0aW9uCi1yZXF1aXJlcyB0aGF0IHRoZSBkYXRhIHNlbnQgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgYmUgc2VudCBpbgotc3VjaCBhIHdheSB0aGF0IGl0IGNhbid0IGJlIGNoYW5nZWQgaW4gdHJhbnNpdC4gQ09ORklERU5USUFMIG1lYW5zCi10aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBkYXRhIGJlIHRyYW5zbWl0dGVkIGluIGEKLWZhc2hpb24gdGhhdCBwcmV2ZW50cyBvdGhlciBlbnRpdGllcyBmcm9tIG9ic2VydmluZyB0aGUgY29udGVudHMgb2YKLXRoZSB0cmFuc21pc3Npb24uIEluIG1vc3QgY2FzZXMsIHRoZSBwcmVzZW5jZSBvZiB0aGUgSU5URUdSQUwgb3IKLUNPTkZJREVOVElBTCBmbGFnIHdpbGwgaW5kaWNhdGUgdGhhdCB0aGUgdXNlIG9mIFNTTCBpcyByZXF1aXJlZC4KLQotVXNlZCBpbjogdXNlci1kYXRhLWNvbnN0cmFpbnQKLS0tPgotPCFFTEVNRU5UIHRyYW5zcG9ydC1ndWFyYW50ZWUgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgdXJsLXBhdHRlcm4gZWxlbWVudCBjb250YWlucyB0aGUgdXJsIHBhdHRlcm4gb2YgdGhlIG1hcHBpbmcuIE11c3QKLWZvbGxvdyB0aGUgcnVsZXMgc3BlY2lmaWVkIGluIFNlY3Rpb24gMTEuMiBvZiB0aGUgU2VydmxldCBBUEkKLVNwZWNpZmljYXRpb24uCi0KLVVzZWQgaW46IGZpbHRlci1tYXBwaW5nLCBzZXJ2bGV0LW1hcHBpbmcsIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uCi0tLT4KLTwhRUxFTUVOVCB1cmwtcGF0dGVybiAoI1BDREFUQSk+Ci0KLTwhLS0KLVRoZSB1c2VyLWRhdGEtY29uc3RyYWludCBlbGVtZW50IGlzIHVzZWQgdG8gaW5kaWNhdGUgaG93IGRhdGEKLWNvbW11bmljYXRlZCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIGNvbnRhaW5lciBzaG91bGQgYmUgcHJvdGVjdGVkLgotCi1Vc2VkIGluOiBzZWN1cml0eS1jb25zdHJhaW50Ci0tLT4KLTwhRUxFTUVOVCB1c2VyLWRhdGEtY29uc3RyYWludCAoZGVzY3JpcHRpb24/LCB0cmFuc3BvcnQtZ3VhcmFudGVlKT4KLQotPCEtLQotVGhlIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGVsZW1lbnQgaXMgdXNlZCB0byBpZGVudGlmeSBhIHN1YnNldAotb2YgdGhlIHJlc291cmNlcyBhbmQgSFRUUCBtZXRob2RzIG9uIHRob3NlIHJlc291cmNlcyB3aXRoaW4gYSB3ZWIKLWFwcGxpY2F0aW9uIHRvIHdoaWNoIGEgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzLiBJZiBubyBIVFRQIG1ldGhvZHMKLWFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcyB0byBhbGwgSFRUUAotbWV0aG9kcy4KLQotVXNlZCBpbjogc2VjdXJpdHktY29uc3RyYWludAotLS0+Ci08IUVMRU1FTlQgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24gKHdlYi1yZXNvdXJjZS1uYW1lLCBkZXNjcmlwdGlvbj8sCi11cmwtcGF0dGVybiosIGh0dHAtbWV0aG9kKik+Ci0KLTwhLS0KLVRoZSB3ZWItcmVzb3VyY2UtbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGlzIHdlYiByZXNvdXJjZQotY29sbGVjdGlvbi4KLQotVXNlZCBpbjogd2ViLXJlc291cmNlLWNvbGxlY3Rpb24KLS0tPgotPCFFTEVNRU5UIHdlYi1yZXNvdXJjZS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHdlbGNvbWUtZmlsZSBlbGVtZW50IGNvbnRhaW5zIGZpbGUgbmFtZSB0byB1c2UgYXMgYSBkZWZhdWx0Ci13ZWxjb21lIGZpbGUsIHN1Y2ggYXMgaW5kZXguaHRtbAotCi1Vc2VkIGluOiB3ZWxjb21lLWZpbGUtbGlzdAotLS0+Ci08IUVMRU1FTlQgd2VsY29tZS1maWxlICgjUENEQVRBKT4KLQotPCEtLQotVGhlIHdlbGNvbWUtZmlsZS1saXN0IGNvbnRhaW5zIGFuIG9yZGVyZWQgbGlzdCBvZiB3ZWxjb21lIGZpbGVzCi1lbGVtZW50cy4KLQotVXNlZCBpbjogd2ViLWFwcAotLS0+Ci08IUVMRU1FTlQgd2VsY29tZS1maWxlLWxpc3QgKHdlbGNvbWUtZmlsZSspPgotCi08IS0tCi1UaGUgSUQgbWVjaGFuaXNtIGlzIHRvIGFsbG93IHRvb2xzIHRoYXQgcHJvZHVjZSBhZGRpdGlvbmFsIGRlcGxveW1lbnQKLWluZm9ybWF0aW9uIChpLmUuLCBpbmZvcm1hdGlvbiBiZXlvbmQgdGhlIHN0YW5kYXJkIGRlcGxveW1lbnQKLWRlc2NyaXB0b3IgaW5mb3JtYXRpb24pIHRvIHN0b3JlIHRoZSBub24tc3RhbmRhcmQgaW5mb3JtYXRpb24gaW4gYQotc2VwYXJhdGUgZmlsZSwgYW5kIGVhc2lseSByZWZlciBmcm9tIHRoZXNlIHRvb2wtc3BlY2lmaWMgZmlsZXMgdG8gdGhlCi1pbmZvcm1hdGlvbiBpbiB0aGUgc3RhbmRhcmQgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi1Ub29scyBhcmUgbm90IGFsbG93ZWQgdG8gYWRkIHRoZSBub24tc3RhbmRhcmQgaW5mb3JtYXRpb24gaW50byB0aGUKLXN0YW5kYXJkIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLS0tPgotCi08IUFUVExJU1QgYXV0aC1jb25zdHJhaW50IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGF1dGgtbWV0aG9kIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbnRleHQtcGFyYW0gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVzY3JpcHRpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGlzcGxheS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRpc3RyaWJ1dGFibGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLWxpbmsgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZWpiLWxvY2FsLXJlZiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVqYi1yZWYtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlamItcmVmLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZW52LWVudHJ5IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVudi1lbnRyeS12YWx1ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBlcnJvci1jb2RlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGVycm9yLXBhZ2UgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZXhjZXB0aW9uLXR5cGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZXh0ZW5zaW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZpbHRlciBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmaWx0ZXItY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZmlsdGVyLW1hcHBpbmcgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZmlsdGVyLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZm9ybS1lcnJvci1wYWdlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZvcm0tbG9naW4tY29uZmlnIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZvcm0tbG9naW4tcGFnZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBob21lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGh0dHAtbWV0aG9kIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGljb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaW5pdC1wYXJhbSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBqc3AtZmlsZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsYXJnZS1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxpc3RlbmVyIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxpc3RlbmVyLWNsYXNzIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxvYWQtb24tc3RhcnR1cCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsb2NhbCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsb2NhbC1ob21lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxvY2F0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxvZ2luLWNvbmZpZyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtaW1lLW1hcHBpbmcgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWltZS10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHBhcmFtLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcGFyYW0tdmFsdWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVhbG0tbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW1vdGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLWF1dGggaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzLXJlZi1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy1zaGFyaW5nLXNjb3BlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcy10eXBlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc291cmNlLWVudi1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlc291cmNlLWVudi1yZWYtdHlwZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZXNvdXJjZS1yZWYgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgcm9sZS1saW5rIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJvbGUtbmFtZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBydW4tYXMgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VjdXJpdHktY29uc3RyYWludCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZWN1cml0eS1yb2xlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlY3VyaXR5LXJvbGUtcmVmIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlcnZsZXQgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VydmxldC1jbGFzcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzZXJ2bGV0LW1hcHBpbmcgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc2VydmxldC1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlc3Npb24tY29uZmlnIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNlc3Npb24tdGltZW91dCBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzbWFsbC1pY29uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRhZ2xpYiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0YWdsaWItbG9jYXRpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdGFnbGliLXVyaSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0cmFuc3BvcnQtZ3VhcmFudGVlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHVybC1wYXR0ZXJuIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHVzZXItZGF0YS1jb25zdHJhaW50IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHdlYi1hcHAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgd2ViLXJlc291cmNlLW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgd2VsY29tZS1maWxlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHdlbGNvbWUtZmlsZS1saXN0IGlkIElEICNJTVBMSUVEPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItYXBwXzJfNC54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl80LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlhMjUxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl80LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOmoyZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjIuNCI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpd2ViLWFwcF8yXzQueHNkcwkxLjYwIDAzLzA4LzI2Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwNCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA5MDEgU2FuIEFudG9uaW8KLSAgICAgIFJvYWQsIFBhbG8gQWx0bywgQ2FsaWZvcm5pYSA5NDMwMywgVS5TLkEuIEFsbCByaWdodHMKLSAgICAgIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbCi0KLQlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgU2VydmxldCAyLjQgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCVRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZCAiV0VCLUlORi93ZWIueG1sIiBpbiB0aGUKLQl3ZWIgYXBwbGljYXRpb24ncyB3YXIgZmlsZS4gIEFsbCBTZXJ2bGV0IGRlcGxveW1lbnQgZGVzY3JpcHRvcnMKLQltdXN0IGluZGljYXRlIHRoZSB3ZWIgYXBwbGljYXRpb24gc2NoZW1hIGJ5IHVzaW5nIHRoZSBKMkVFCi0JbmFtZXNwYWNlOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZQotCi0JYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotCXVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLQkgICAgPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Ii4uLiIKLQkgICAgICB2ZXJzaW9uPSIyLjQiPgotCSAgICAgIC4uLgotCSAgICA8L3dlYi1hcHA+Ci0KLQlUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKLQl0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKMkVFCi0JbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkCi0KLQldXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEoyRUUKLSAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQotCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90Ci0Jc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCi0JdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQotCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCi0JSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKLQlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKLQluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqc3BfMl8wLnhzZCIvPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWItYXBwIiB0eXBlPSJqMmVlOndlYi1hcHBUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgd2ViLWFwcCBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBkZXBsb3ltZW50Ci0JZGVzY3JpcHRvciBmb3IgYSB3ZWIgYXBwbGljYXRpb24uICBOb3RlIHRoYXQgdGhlIHN1Yi1lbGVtZW50cwotCW9mIHRoaXMgZWxlbWVudCBjYW4gYmUgaW4gdGhlIGFyYml0cmFyeSBvcmRlci4gQmVjYXVzZSBvZgotCXRoYXQsIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIGVsZW1lbnRzIG9mIGRpc3RyaWJ1dGFibGUsCi0Jc2Vzc2lvbi1jb25maWcsIHdlbGNvbWUtZmlsZS1saXN0LCBqc3AtY29uZmlnLCBsb2dpbi1jb25maWcsCi0JYW5kIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3Qgd2FzIGNoYW5nZWQgZnJvbSAiPyIgdG8gIioiCi0JaW4gdGhpcyBzY2hlbWEuICBIb3dldmVyLCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGluc3RhbmNlCi0JZmlsZSBtdXN0IG5vdCBjb250YWluIG11bHRpcGxlIGVsZW1lbnRzIG9mIHNlc3Npb24tY29uZmlnLAotCWpzcC1jb25maWcsIGFuZCBsb2dpbi1jb25maWcuIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGVsZW1lbnRzIG9mCi0Jd2VsY29tZS1maWxlLWxpc3Qgb3IgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCwgdGhlIGNvbnRhaW5lcgotCW11c3QgY29uY2F0aW5hdGUgdGhlIGVsZW1lbnQgY29udGVudHMuICBUaGUgbXVsdGlwbGUgb2NjdXJhbmNlCi0Jb2YgdGhlIGVsZW1lbnQgZGlzdHJpYnV0YWJsZSBpcyByZWR1bmRhbnQgYW5kIHRoZSBjb250YWluZXIKLQl0cmVhdHMgdGhhdCBjYXNlIGV4YWN0bHkgaW4gdGhlIHNhbWUgd2F5IHdoZW4gdGhlcmUgaXMgb25seQotCW9uZSBkaXN0cmlidXRhYmxlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLXNlcnZsZXQtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBzZXJ2bGV0IGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBzZXJ2bGV0LgotCSAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6c2VydmxldCIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpzZXJ2bGV0LW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLWZpbHRlci1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGZpbHRlciBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsdGVyLgotCSAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZmlsdGVyIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmZpbHRlci1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1lamItbG9jYWwtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgZWpiLWxvY2FsLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0JICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSB3ZWIKLQkgIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0JICB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi0JICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZWpiLWxvY2FsLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTplamItcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLWVqYi1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBlamItcmVmLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhbiBFSkIKLQkgIHJlZmVyZW5jZS4gVGhlIEVKQiByZWZlcmVuY2UgaXMgYW4gZW50cnkgaW4gdGhlIHdlYgotCSAgYXBwbGljYXRpb24ncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlCi0JICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KLQkgIHRoZSB3ZWIgYXBwbGljYXRpb24uCi0KLQkgIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJlamIvIi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTplamItcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVqYi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtcmVzb3VyY2UtZW52LXJlZi11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSByZXNvdXJjZS1lbnYtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YKLQkgIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMgdGhlCi0JICBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiBjb2RlLgotCSAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYKLQkgIGNvbnRleHQgYW5kIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1lbnYtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJlc291cmNlLWVudi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZgotCSAgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzIHRoZQotCSAgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gY29kZS4KLQkgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52Ci0JICBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtcmVzLXJlZi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHJlcy1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCi0JICByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UuICBUaGUgbmFtZQotCSAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLQkgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpyZXNvdXJjZS1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImoyZWU6cmVzLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1lbnYtZW50cnktbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgd2ViCi0JICBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGVudHJ5LiAgVGhlIG5hbWUgaXMgYSBKTkRJCi0JICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBUaGUgbmFtZQotCSAgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6ZW52LWVudHJ5Ii8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOmVudi1lbnRyeS1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDprZXkgbmFtZT0id2ViLWFwcC1yb2xlLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIEEgcm9sZS1uYW1lLWtleSBpcyBzcGVjaWZpZWQgdG8gYWxsb3cgdGhlIHJlZmVyZW5jZXMKLQkgIGZyb20gdGhlIHNlY3VyaXR5LXJvbGUtcmVmcy4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpzZWN1cml0eS1yb2xlIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJvbGUtbmFtZSIvPgotICAgIDwveHNkOmtleT4KLQotICAgIDx4c2Q6a2V5cmVmIG5hbWU9IndlYi1hcHAtcm9sZS1uYW1lLXJlZmVyZW5jZXMiCi0JCXJlZmVyPSJqMmVlOndlYi1hcHAtcm9sZS1uYW1lLWtleSI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUga2V5cmVmIGluZGljYXRlcyB0aGUgcmVmZXJlbmNlcyBmcm9tCi0JICBzZWN1cml0eS1yb2xlLXJlZiB0byBhIHNwZWNpZmllZCByb2xlLW5hbWUuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImoyZWU6c2VydmxldC9qMmVlOnNlY3VyaXR5LXJvbGUtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOnJvbGUtbGluayIvPgotICAgIDwveHNkOmtleXJlZj4KLSAgPC94c2Q6ZWxlbWVudD4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdXRoLWNvbnN0cmFpbnRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYXV0aC1jb25zdHJhaW50VHlwZSBpbmRpY2F0ZXMgdGhlIHVzZXIgcm9sZXMgdGhhdAotCXNob3VsZCBiZSBwZXJtaXR0ZWQgYWNjZXNzIHRvIHRoaXMgcmVzb3VyY2UKLQljb2xsZWN0aW9uLiBUaGUgcm9sZS1uYW1lIHVzZWQgaGVyZSBtdXN0IGVpdGhlciBjb3JyZXNwb25kCi0JdG8gdGhlIHJvbGUtbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMKLQlkZWZpbmVkIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiwgb3IgYmUgdGhlIHNwZWNpYWxseQotCXJlc2VydmVkIHJvbGUtbmFtZSAiKiIgdGhhdCBpcyBhIGNvbXBhY3Qgc3ludGF4IGZvcgotCWluZGljYXRpbmcgYWxsIHJvbGVzIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uIElmIGJvdGggIioiCi0JYW5kIHJvbGVuYW1lcyBhcHBlYXIsIHRoZSBjb250YWluZXIgaW50ZXJwcmV0cyB0aGlzIGFzIGFsbAotCXJvbGVzLiAgSWYgbm8gcm9sZXMgYXJlIGRlZmluZWQsIG5vIHVzZXIgaXMgYWxsb3dlZCBhY2Nlc3MKLQl0byB0aGUgcG9ydGlvbiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlc2NyaWJlZCBieSB0aGUKLQljb250YWluaW5nIHNlY3VyaXR5LWNvbnN0cmFpbnQuICBUaGUgY29udGFpbmVyIG1hdGNoZXMKLQlyb2xlIG5hbWVzIGNhc2Ugc2Vuc2l0aXZlbHkgd2hlbiBkZXRlcm1pbmluZyBhY2Nlc3MuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9sZS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOnJvbGUtbmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdXRoLW1ldGhvZFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhdXRoLW1ldGhvZFR5cGUgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uCi0JbWVjaGFuaXNtIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uLiBBcyBhIHByZXJlcXVpc2l0ZSB0bwotCWdhaW5pbmcgYWNjZXNzIHRvIGFueSB3ZWIgcmVzb3VyY2VzIHdoaWNoIGFyZSBwcm90ZWN0ZWQgYnkKLQlhbiBhdXRob3JpemF0aW9uIGNvbnN0cmFpbnQsIGEgdXNlciBtdXN0IGhhdmUgYXV0aGVudGljYXRlZAotCXVzaW5nIHRoZSBjb25maWd1cmVkIG1lY2hhbmlzbS4gTGVnYWwgdmFsdWVzIGFyZSAiQkFTSUMiLAotCSJESUdFU1QiLCAiRk9STSIsICJDTElFTlQtQ0VSVCIsIG9yIGEgdmVuZG9yLXNwZWNpZmljCi0JYXV0aGVudGljYXRpb24gc2NoZW1lLgotCi0JVXNlZCBpbjogbG9naW4tY29uZmlnCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzcGF0Y2hlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBkaXNwYXRjaGVyIGhhcyBmb3VyIGxlZ2FsIHZhbHVlczogRk9SV0FSRCwgUkVRVUVTVCwgSU5DTFVERSwKLQlhbmQgRVJST1IuIEEgdmFsdWUgb2YgRk9SV0FSRCBtZWFucyB0aGUgRmlsdGVyIHdpbGwgYmUgYXBwbGllZAotCXVuZGVyIFJlcXVlc3REaXNwYXRjaGVyLmZvcndhcmQoKSBjYWxscy4gIEEgdmFsdWUgb2YgUkVRVUVTVAotCW1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHVuZGVyIG9yZGluYXJ5IGNsaWVudCBjYWxscyB0bwotCXRoZSBwYXRoIG9yIHNlcnZsZXQuIEEgdmFsdWUgb2YgSU5DTFVERSBtZWFucyB0aGUgRmlsdGVyIHdpbGwgYmUKLQlhcHBsaWVkIHVuZGVyIFJlcXVlc3REaXNwYXRjaGVyLmluY2x1ZGUoKSBjYWxscy4gIEEgdmFsdWUgb2YKLQlFUlJPUiBtZWFucyB0aGUgRmlsdGVyIHdpbGwgYmUgYXBwbGllZCB1bmRlciB0aGUgZXJyb3IgcGFnZQotCW1lY2hhbmlzbS4gIFRoZSBhYnNlbmNlIG9mIGFueSBkaXNwYXRjaGVyIGVsZW1lbnRzIGluIGEKLQlmaWx0ZXItbWFwcGluZyBpbmRpY2F0ZXMgYSBkZWZhdWx0IG9mIGFwcGx5aW5nIGZpbHRlcnMgb25seSB1bmRlcgotCW9yZGluYXJ5IGNsaWVudCBjYWxscyB0byB0aGUgcGF0aCBvciBzZXJ2bGV0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGT1JXQVJEIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5DTFVERSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFUVVFU1QiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFUlJPUiIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW5jb2RpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZW5jb2RpbmdUeXBlIGRlZmluZXMgSUFOQSBjaGFyYWN0ZXIgc2V0cy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iW15cc10rIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVycm9yLWNvZGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZXJyb3ItY29kZSBjb250YWlucyBhbiBIVFRQIGVycm9yIGNvZGUsIGV4OiA0MDQKLQotCVVzZWQgaW46IGVycm9yLXBhZ2UKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnhzZFBvc2l0aXZlSW50ZWdlclR5cGUiPgotCTx4c2Q6cGF0dGVybiB2YWx1ZT0iXGR7M30iLz4KLQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXJyb3ItcGFnZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlcnJvci1wYWdlVHlwZSBjb250YWlucyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBlcnJvciBjb2RlCi0Jb3IgZXhjZXB0aW9uIHR5cGUgdG8gdGhlIHBhdGggb2YgYSByZXNvdXJjZSBpbiB0aGUgd2ViCi0JYXBwbGljYXRpb24uCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iZXJyb3ItY29kZSIKLQkJICAgICB0eXBlPSJqMmVlOmVycm9yLWNvZGVUeXBlIi8+Ci0KLQk8eHNkOmVsZW1lbnQgbmFtZT0iZXhjZXB0aW9uLXR5cGUiCi0JCSAgICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIGV4Y2VwdGlvbi10eXBlIGNvbnRhaW5zIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCi0JICAgICAgbmFtZSBvZiBhIEphdmEgZXhjZXB0aW9uIHR5cGUuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwveHNkOmNob2ljZT4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2F0aW9uIgotCQkgICB0eXBlPSJqMmVlOndhci1wYXRoVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBsb2NhdGlvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiB0aGUKLQkgICAgcmVzb3VyY2UgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCSAgICB0aGUgd2ViIGFwcGxpY2F0aW9uLiBUaGUgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIG11c3QgaGF2ZQotCSAgICBhIGxlYWRpbmcgYC8nLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpbHRlci1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JRGVjbGFyYXRpb24gb2YgdGhlIGZpbHRlciBtYXBwaW5ncyBpbiB0aGlzIHdlYgotCWFwcGxpY2F0aW9uIGlzIGRvbmUgYnkgdXNpbmcgZmlsdGVyLW1hcHBpbmdUeXBlLgotCVRoZSBjb250YWluZXIgdXNlcyB0aGUgZmlsdGVyLW1hcHBpbmcKLQlkZWNsYXJhdGlvbnMgdG8gZGVjaWRlIHdoaWNoIGZpbHRlcnMgdG8gYXBwbHkgdG8gYSByZXF1ZXN0LAotCWFuZCBpbiB3aGF0IG9yZGVyLiBUaGUgY29udGFpbmVyIG1hdGNoZXMgdGhlIHJlcXVlc3QgVVJJIHRvCi0JYSBTZXJ2bGV0IGluIHRoZSBub3JtYWwgd2F5LiBUbyBkZXRlcm1pbmUgd2hpY2ggZmlsdGVycyB0bwotCWFwcGx5IGl0IG1hdGNoZXMgZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIGVpdGhlciBvbgotCXNlcnZsZXQtbmFtZSwgb3Igb24gdXJsLXBhdHRlcm4gZm9yIGVhY2ggZmlsdGVyLW1hcHBpbmcKLQllbGVtZW50LCBkZXBlbmRpbmcgb24gd2hpY2ggc3R5bGUgaXMgdXNlZC4gVGhlIG9yZGVyIGluCi0Jd2hpY2ggZmlsdGVycyBhcmUgaW52b2tlZCBpcyB0aGUgb3JkZXIgaW4gd2hpY2gKLQlmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgdGhhdCBtYXRjaCBhIHJlcXVlc3QgVVJJIGZvciBhCi0Jc2VydmxldCBhcHBlYXIgaW4gdGhlIGxpc3Qgb2YgZmlsdGVyLW1hcHBpbmcgZWxlbWVudHMuVGhlCi0JZmlsdGVyLW5hbWUgdmFsdWUgbXVzdCBiZSB0aGUgdmFsdWUgb2YgdGhlIGZpbHRlci1uYW1lCi0Jc3ViLWVsZW1lbnRzIG9mIG9uZSBvZiB0aGUgZmlsdGVyIGRlY2xhcmF0aW9ucyBpbiB0aGUKLQlkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6ZmlsdGVyLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0idXJsLXBhdHRlcm4iCi0JCSAgICAgdHlwZT0iajJlZTp1cmwtcGF0dGVyblR5cGUiLz4KLQk8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldC1uYW1lIgotCQkgICAgIHR5cGU9ImoyZWU6c2VydmxldC1uYW1lVHlwZSIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BhdGNoZXIiCi0JCSAgIHR5cGU9ImoyZWU6ZGlzcGF0Y2hlclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSI0Ii8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmlsdGVyLW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbG9naWNhbCBuYW1lIG9mIHRoZSBmaWx0ZXIgaXMgZGVjbGFyZQotCWJ5IHVzaW5nIGZpbHRlci1uYW1lVHlwZS4gVGhpcyBuYW1lIGlzIHVzZWQgdG8gbWFwIHRoZQotCWZpbHRlci4gIEVhY2ggZmlsdGVyIG5hbWUgaXMgdW5pcXVlIHdpdGhpbiB0aGUgd2ViCi0JYXBwbGljYXRpb24uCi0KLQlVc2VkIGluOiBmaWx0ZXIsIGZpbHRlci1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImoyZWU6bm9uRW1wdHlTdHJpbmdUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpbHRlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBmaWx0ZXJUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhIGZpbHRlciBpbiB0aGUgd2ViCi0JYXBwbGljYXRpb24uIFRoZSBmaWx0ZXIgaXMgbWFwcGVkIHRvIGVpdGhlciBhIHNlcnZsZXQgb3IgYQotCVVSTCBwYXR0ZXJuIGluIHRoZSBmaWx0ZXItbWFwcGluZyBlbGVtZW50LCB1c2luZyB0aGUKLQlmaWx0ZXItbmFtZSB2YWx1ZSB0byByZWZlcmVuY2UuIEZpbHRlcnMgY2FuIGFjY2VzcyB0aGUKLQlpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50Ci0JZGVzY3JpcHRvciBhdCBydW50aW1lIHZpYSB0aGUgRmlsdGVyQ29uZmlnIGludGVyZmFjZS4KLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXItbmFtZSIKLQkJICAgdHlwZT0iajJlZTpmaWx0ZXItbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXItY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBmaWx0ZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LXBhcmFtIgotCQkgICB0eXBlPSJqMmVlOnBhcmFtLXZhbHVlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lL3ZhbHVlIHBhaXIgYXMKLQkgICAgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgYSBzZXJ2bGV0IGZpbHRlcgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZvcm0tbG9naW4tY29uZmlnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGZvcm0tbG9naW4tY29uZmlnVHlwZSBzcGVjaWZpZXMgdGhlIGxvZ2luIGFuZCBlcnJvcgotCXBhZ2VzIHRoYXQgc2hvdWxkIGJlIHVzZWQgaW4gZm9ybSBiYXNlZCBsb2dpbi4gSWYgZm9ybSBiYXNlZAotCWF1dGhlbnRpY2F0aW9uIGlzIG5vdCB1c2VkLCB0aGVzZSBlbGVtZW50cyBhcmUgaWdub3JlZC4KLQotCVVzZWQgaW46IGxvZ2luLWNvbmZpZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9ybS1sb2dpbi1wYWdlIgotCQkgICB0eXBlPSJqMmVlOndhci1wYXRoVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBmb3JtLWxvZ2luLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgd2ViCi0JICAgIGFwcCB3aGVyZSB0aGUgcGFnZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBsb2dpbiBjYW4gYmUKLQkgICAgZm91bmQuICBUaGUgcGF0aCBiZWdpbnMgd2l0aCBhIGxlYWRpbmcgLyBhbmQgaXMgaW50ZXJwcmV0ZWQKLQkgICAgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIFdBUi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcm0tZXJyb3ItcGFnZSIKLQkJICAgdHlwZT0iajJlZTp3YXItcGF0aFR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZm9ybS1lcnJvci1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4KLQkgICAgdGhlIHdlYiBhcHAgd2hlcmUgdGhlIGVycm9yIHBhZ2UgdGhhdCBpcyBkaXNwbGF5ZWQKLQkgICAgd2hlbiBsb2dpbiBpcyBub3Qgc3VjY2Vzc2Z1bCBjYW4gYmUgZm91bmQuCi0JICAgIFRoZSBwYXRoIGJlZ2lucyB3aXRoIGEgbGVhZGluZyAvIGFuZCBpcyBpbnRlcnByZXRlZAotCSAgICByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgV0FSLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaHR0cC1tZXRob2RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBodHRwLW1ldGhvZCBjb250YWlucyBhbiBIVFRQIG1ldGhvZCByZWNvZ25pemVkIGJ5IHRoZQotCXdlYi1hcHAsIGZvciBleGFtcGxlIEdFVCwgUE9TVCwgLi4uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkdFVCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBPU1QiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQVVQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERUxFVEUiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIRUFEIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU9OUyIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRSQUNFIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IGNvbnRhaW5zIG9uZSBvciBtb3JlCi0JbG9jYWxlLWVuY29kaW5nLW1hcHBpbmcocykuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYWxlLWVuY29kaW5nLW1hcHBpbmciCi0JCSAgIHR5cGU9ImoyZWU6bG9jYWxlLWVuY29kaW5nLW1hcHBpbmdUeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nIGNvbnRhaW5zIGxvY2FsZSBuYW1lIGFuZAotCWVuY29kaW5nIG5hbWUuIFRoZSBsb2NhbGUgbmFtZSBtdXN0IGJlIGVpdGhlciAiTGFuZ3VhZ2UtY29kZSIsCi0Jc3VjaCBhcyAiamEiLCBkZWZpbmVkIGJ5IElTTy02Mzkgb3IgIkxhbmd1YWdlLWNvZGVfQ291bnRyeS1jb2RlIiwKLQlzdWNoIGFzICJqYV9KUCIuICAiQ291bnRyeSBjb2RlIiBpcyBkZWZpbmVkIGJ5IElTTy0zMTY2LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsZSIKLQkJICAgdHlwZT0iajJlZTpsb2NhbGVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5jb2RpbmciCi0JCSAgIHR5cGU9ImoyZWU6ZW5jb2RpbmdUeXBlIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJsb2NhbGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbG9jYWxlVHlwZSBkZWZpbmVzIHZhbGlkIGxvY2FsZSBkZWZpbmVkIGJ5IElTTy02MzktMQotCWFuZCBJU08tMzE2Ni4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iW2Etel17Mn0oX3wtKT8oW1xwe0x9XC1ccHtOZH1dezJ9KT8iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9naW4tY29uZmlnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGxvZ2luLWNvbmZpZ1R5cGUgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIGF1dGhlbnRpY2F0aW9uCi0JbWV0aG9kIHRoYXQgc2hvdWxkIGJlIHVzZWQsIHRoZSByZWFsbSBuYW1lIHRoYXQgc2hvdWxkIGJlCi0JdXNlZCBmb3IgdGhpcyBhcHBsaWNhdGlvbiwgYW5kIHRoZSBhdHRyaWJ1dGVzIHRoYXQgYXJlCi0JbmVlZGVkIGJ5IHRoZSBmb3JtIGxvZ2luIG1lY2hhbmlzbS4KLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdXRoLW1ldGhvZCIKLQkJICAgdHlwZT0iajJlZTphdXRoLW1ldGhvZFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYWxtLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcmVhbG0gbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgcmVhbG0gbmFtZSB0bwotCSAgICB1c2UgaW4gSFRUUCBCYXNpYyBhdXRob3JpemF0aW9uLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcm0tbG9naW4tY29uZmlnIgotCQkgICB0eXBlPSJqMmVlOmZvcm0tbG9naW4tY29uZmlnVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWltZS1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIG1pbWUtbWFwcGluZ1R5cGUgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBleHRlbnNpb24KLQlhbmQgYSBtaW1lIHR5cGUuCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgZXh0ZW5zaW9uIGVsZW1lbnQgY29udGFpbnMgYSBzdHJpbmcgZGVzY3JpYmluZyBhbgotCSAgZXh0ZW5zaW9uLiBleGFtcGxlOiAidHh0IgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWltZS10eXBlIgotCQkgICB0eXBlPSJqMmVlOm1pbWUtdHlwZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtaW1lLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWltZS10eXBlVHlwZSBpcyB1c2VkIHRvIGluZGljYXRlIGEgZGVmaW5lZCBtaW1lIHR5cGUuCi0KLQlFeGFtcGxlOgotCSJ0ZXh0L3BsYWluIgotCi0JVXNlZCBpbjogbWltZS1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlteXHB7Q2N9XlxzXSsvW15ccHtDY31eXHNdKyIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vbkVtcHR5U3RyaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCVRoaXMgdHlwZSBkZWZpbmVzIGEgc3RyaW5nIHdoaWNoIGNvbnRhaW5zIGF0IGxlYXN0IG9uZQotCWNoYXJhY3Rlci4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOm1pbkxlbmd0aCB2YWx1ZT0iMSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LWNvbnN0cmFpbnRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VjdXJpdHktY29uc3RyYWludFR5cGUgaXMgdXNlZCB0byBhc3NvY2lhdGUKLQlzZWN1cml0eSBjb25zdHJhaW50cyB3aXRoIG9uZSBvciBtb3JlIHdlYiByZXNvdXJjZQotCWNvbGxlY3Rpb25zCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIgotCQkgICB0eXBlPSJqMmVlOmRpc3BsYXktbmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiIKLQkJICAgdHlwZT0iajJlZTp3ZWItcmVzb3VyY2UtY29sbGVjdGlvblR5cGUiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXV0aC1jb25zdHJhaW50IgotCQkgICB0eXBlPSJqMmVlOmF1dGgtY29uc3RyYWludFR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZXItZGF0YS1jb25zdHJhaW50IgotCQkgICB0eXBlPSJqMmVlOnVzZXItZGF0YS1jb25zdHJhaW50VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmxldC1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlcnZsZXQtbWFwcGluZ1R5cGUgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhCi0Jc2VydmxldCBhbmQgYSB1cmwgcGF0dGVybi4KLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c2VydmxldC1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybC1wYXR0ZXJuIgotCQkgICB0eXBlPSJqMmVlOnVybC1wYXR0ZXJuVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZsZXQtbmFtZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXJ2bGV0LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlCi0Jc2VydmxldC4gRWFjaCBzZXJ2bGV0IG5hbWUgaXMgdW5pcXVlIHdpdGhpbiB0aGUgd2ViCi0JYXBwbGljYXRpb24uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImoyZWU6bm9uRW1wdHlTdHJpbmdUeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZsZXRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VydmxldFR5cGUgaXMgdXNlZCB0byBkZWNsYXJlIGEgc2VydmxldC4KLQlJdCBjb250YWlucyB0aGUgZGVjbGFyYXRpdmUgZGF0YSBvZiBhCi0Jc2VydmxldC4gSWYgYSBqc3AtZmlsZSBpcyBzcGVjaWZpZWQgYW5kIHRoZSBsb2FkLW9uLXN0YXJ0dXAKLQllbGVtZW50IGlzIHByZXNlbnQsIHRoZW4gdGhlIEpTUCBzaG91bGQgYmUgcHJlY29tcGlsZWQgYW5kCi0JbG9hZGVkLgotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZsZXQtbmFtZSIKLQkJICAgdHlwZT0iajJlZTpzZXJ2bGV0LW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldC1jbGFzcyIKLQkJICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgc2VydmxldC1jbGFzcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseQotCSAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBzZXJ2bGV0LgotCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0KLQk8eHNkOmVsZW1lbnQgbmFtZT0ianNwLWZpbGUiCi0JCSAgICAgdHlwZT0iajJlZTpqc3AtZmlsZVR5cGUiLz4KLQotICAgICAgPC94c2Q6Y2hvaWNlPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKLQkJICAgdHlwZT0iajJlZTpwYXJhbS12YWx1ZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2FkLW9uLXN0YXJ0dXAiCi0JCSAgIHR5cGU9ImoyZWU6eHNkSW50ZWdlclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBsb2FkLW9uLXN0YXJ0dXAgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzCi0JICAgIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZCAoaW5zdGFudGlhdGVkIGFuZCBoYXZlCi0JICAgIGl0cyBpbml0KCkgY2FsbGVkKSBvbiB0aGUgc3RhcnR1cCBvZiB0aGUgd2ViCi0JICAgIGFwcGxpY2F0aW9uLiBUaGUgb3B0aW9uYWwgY29udGVudHMgb2YgdGhlc2UKLQkgICAgZWxlbWVudCBtdXN0IGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgb3JkZXIgaW4KLQkgICAgd2hpY2ggdGhlIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZC4gSWYgdGhlIHZhbHVlCi0JICAgIGlzIGEgbmVnYXRpdmUgaW50ZWdlciwgb3IgdGhlIGVsZW1lbnQgaXMgbm90Ci0JICAgIHByZXNlbnQsIHRoZSBjb250YWluZXIgaXMgZnJlZSB0byBsb2FkIHRoZSBzZXJ2bGV0Ci0JICAgIHdoZW5ldmVyIGl0IGNob29zZXMuIElmIHRoZSB2YWx1ZSBpcyBhIHBvc2l0aXZlCi0JICAgIGludGVnZXIgb3IgMCwgdGhlIGNvbnRhaW5lciBtdXN0IGxvYWQgYW5kCi0JICAgIGluaXRpYWxpemUgdGhlIHNlcnZsZXQgYXMgdGhlIGFwcGxpY2F0aW9uIGlzCi0JICAgIGRlcGxveWVkLiBUaGUgY29udGFpbmVyIG11c3QgZ3VhcmFudGVlIHRoYXQKLQkgICAgc2VydmxldHMgbWFya2VkIHdpdGggbG93ZXIgaW50ZWdlcnMgYXJlIGxvYWRlZAotCSAgICBiZWZvcmUgc2VydmxldHMgbWFya2VkIHdpdGggaGlnaGVyIGludGVnZXJzLiBUaGUKLQkgICAgY29udGFpbmVyIG1heSBjaG9vc2UgdGhlIG9yZGVyIG9mIGxvYWRpbmcgb2YKLQkgICAgc2VydmxldHMgd2l0aCB0aGUgc2FtZSBsb2FkLW9uLXN0YXJ0LXVwIHZhbHVlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJ1bi1hcyIKLQkJICAgdHlwZT0iajJlZTpydW4tYXNUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlLXJlZiIKLQkJICAgdHlwZT0iajJlZTpzZWN1cml0eS1yb2xlLXJlZlR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uLWNvbmZpZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXNzaW9uLWNvbmZpZ1R5cGUgZGVmaW5lcyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXJzCi0JZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tdGltZW91dCIKLQkJICAgdHlwZT0iajJlZTp4c2RJbnRlZ2VyVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHNlc3Npb24tdGltZW91dCBlbGVtZW50IGRlZmluZXMgdGhlIGRlZmF1bHQKLQkgICAgc2Vzc2lvbiB0aW1lb3V0IGludGVydmFsIGZvciBhbGwgc2Vzc2lvbnMgY3JlYXRlZAotCSAgICBpbiB0aGlzIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHNwZWNpZmllZCB0aW1lb3V0Ci0JICAgIG11c3QgYmUgZXhwcmVzc2VkIGluIGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMuCi0JICAgIElmIHRoZSB0aW1lb3V0IGlzIDAgb3IgbGVzcywgdGhlIGNvbnRhaW5lciBlbnN1cmVzCi0JICAgIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiBzZXNzaW9ucyBpcyBuZXZlciB0byB0aW1lCi0JICAgIG91dC4gSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBjb250YWluZXIKLQkgICAgbXVzdCBzZXQgaXRzIGRlZmF1bHQgdGltZW91dCBwZXJpb2QuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNwb3J0LWd1YXJhbnRlZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0cmFuc3BvcnQtZ3VhcmFudGVlVHlwZSBzcGVjaWZpZXMgdGhhdCB0aGUgY29tbXVuaWNhdGlvbgotCWJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgc2hvdWxkIGJlIE5PTkUsIElOVEVHUkFMLCBvcgotCUNPTkZJREVOVElBTC4gTk9ORSBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdAotCXJlcXVpcmUgYW55IHRyYW5zcG9ydCBndWFyYW50ZWVzLiBBIHZhbHVlIG9mIElOVEVHUkFMIG1lYW5zCi0JdGhhdCB0aGUgYXBwbGljYXRpb24gcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBzZW50IGJldHdlZW4gdGhlCi0JY2xpZW50IGFuZCBzZXJ2ZXIgYmUgc2VudCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgY2FuJ3QgYmUKLQljaGFuZ2VkIGluIHRyYW5zaXQuIENPTkZJREVOVElBTCBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbgotCXJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgYmUgdHJhbnNtaXR0ZWQgaW4gYSBmYXNoaW9uIHRoYXQKLQlwcmV2ZW50cyBvdGhlciBlbnRpdGllcyBmcm9tIG9ic2VydmluZyB0aGUgY29udGVudHMgb2YgdGhlCi0JdHJhbnNtaXNzaW9uLiBJbiBtb3N0IGNhc2VzLCB0aGUgcHJlc2VuY2Ugb2YgdGhlIElOVEVHUkFMIG9yCi0JQ09ORklERU5USUFMIGZsYWcgd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSB1c2Ugb2YgU1NMIGlzCi0JcmVxdWlyZWQuCi0KLQlVc2VkIGluOiB1c2VyLWRhdGEtY29uc3RyYWludAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5URUdSQUwiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDT05GSURFTlRJQUwiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1c2VyLWRhdGEtY29uc3RyYWludFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB1c2VyLWRhdGEtY29uc3RyYWludFR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZSBob3cKLQlkYXRhIGNvbW11bmljYXRlZCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIGNvbnRhaW5lciBzaG91bGQgYmUKLQlwcm90ZWN0ZWQuCi0KLQlVc2VkIGluOiBzZWN1cml0eS1jb25zdHJhaW50Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNwb3J0LWd1YXJhbnRlZSIKLQkJICAgdHlwZT0iajJlZTp0cmFuc3BvcnQtZ3VhcmFudGVlVHlwZSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Indhci1wYXRoVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGVsZW1lbnRzIHRoYXQgdXNlIHRoaXMgdHlwZSBkZXNpZ25hdGUgYSBwYXRoIHN0YXJ0aW5nCi0Jd2l0aCBhICIvIiBhbmQgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgYSBXQVIKLQlmaWxlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDpwYXR0ZXJuIHZhbHVlPSIvLioiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IndlYi1hcHAtdmVyc2lvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBjb250YWlucyB0aGUgcmVjb2duaXplZCB2ZXJzaW9ucyBvZgotCXdlYi1hcHBsaWNhdGlvbiBzdXBwb3J0ZWQuIEl0IGlzIHVzZWQgdG8gZGVzaWduYXRlIHRoZQotCXZlcnNpb24gb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIuNCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWItYXBwVHlwZSI+Ci0KLSAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXN0cmlidXRhYmxlIgotCQkgICB0eXBlPSJqMmVlOmVtcHR5VHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRleHQtcGFyYW0iCi0JCSAgIHR5cGU9ImoyZWU6cGFyYW0tdmFsdWVUeXBlIj4KLQotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgY29udGV4dC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbgotCSAgICBvZiBhIHdlYiBhcHBsaWNhdGlvbidzIHNlcnZsZXQgY29udGV4dAotCSAgICBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyIgotCQkgICB0eXBlPSJqMmVlOmZpbHRlclR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXItbWFwcGluZyIKLQkJICAgdHlwZT0iajJlZTpmaWx0ZXItbWFwcGluZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaXN0ZW5lciIKLQkJICAgdHlwZT0iajJlZTpsaXN0ZW5lclR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0IgotCQkgICB0eXBlPSJqMmVlOnNlcnZsZXRUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldC1tYXBwaW5nIgotCQkgICB0eXBlPSJqMmVlOnNlcnZsZXQtbWFwcGluZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLWNvbmZpZyIKLQkJICAgdHlwZT0iajJlZTpzZXNzaW9uLWNvbmZpZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtaW1lLW1hcHBpbmciCi0JCSAgIHR5cGU9ImoyZWU6bWltZS1tYXBwaW5nVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlbGNvbWUtZmlsZS1saXN0IgotCQkgICB0eXBlPSJqMmVlOndlbGNvbWUtZmlsZS1saXN0VHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVycm9yLXBhZ2UiCi0JCSAgIHR5cGU9ImoyZWU6ZXJyb3ItcGFnZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqc3AtY29uZmlnIgotCQkgICB0eXBlPSJqMmVlOmpzcC1jb25maWdUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktY29uc3RyYWludCIKLQkJICAgdHlwZT0iajJlZTpzZWN1cml0eS1jb25zdHJhaW50VHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2luLWNvbmZpZyIKLQkJICAgdHlwZT0iajJlZTpsb2dpbi1jb25maWdUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZSIKLQkJICAgdHlwZT0iajJlZTpzZWN1cml0eS1yb2xlVHlwZSIvPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6am5kaUVudmlyb25tZW50UmVmc0dyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbiIKLQkJICAgdHlwZT0iajJlZTptZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3QiCi0JCSAgIHR5cGU9ImoyZWU6bG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdFR5cGUiLz4KLSAgICA8L3hzZDpjaG9pY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotCQkgICB0eXBlPSJqMmVlOndlYi1hcHAtdmVyc2lvblR5cGUiCi0JCSAgIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWItcmVzb3VyY2UtY29sbGVjdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB3ZWItcmVzb3VyY2UtY29sbGVjdGlvblR5cGUgaXMgdXNlZCB0byBpZGVudGlmeSBhIHN1YnNldAotCW9mIHRoZSByZXNvdXJjZXMgYW5kIEhUVFAgbWV0aG9kcyBvbiB0aG9zZSByZXNvdXJjZXMgd2l0aGluCi0JYSB3ZWIgYXBwbGljYXRpb24gdG8gd2hpY2ggYSBzZWN1cml0eSBjb25zdHJhaW50IGFwcGxpZXMuIElmCi0Jbm8gSFRUUCBtZXRob2RzIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIHNlY3VyaXR5IGNvbnN0cmFpbnQKLQlhcHBsaWVzIHRvIGFsbCBIVFRQIG1ldGhvZHMuCi0KLQlVc2VkIGluOiBzZWN1cml0eS1jb25zdHJhaW50Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2ViLXJlc291cmNlLW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHdlYi1yZXNvdXJjZS1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoaXMgd2ViCi0JICAgIHJlc291cmNlIGNvbGxlY3Rpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsLXBhdHRlcm4iCi0JCSAgIHR5cGU9ImoyZWU6dXJsLXBhdHRlcm5UeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imh0dHAtbWV0aG9kIgotCQkgICB0eXBlPSJqMmVlOmh0dHAtbWV0aG9kVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlbGNvbWUtZmlsZS1saXN0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHdlbGNvbWUtZmlsZS1saXN0IGNvbnRhaW5zIGFuIG9yZGVyZWQgbGlzdCBvZiB3ZWxjb21lCi0JZmlsZXMgZWxlbWVudHMuCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2VsY29tZS1maWxlIgotCQkgICB0eXBlPSJ4c2Q6c3RyaW5nIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB3ZWxjb21lLWZpbGUgZWxlbWVudCBjb250YWlucyBmaWxlIG5hbWUgdG8gdXNlCi0JICAgIGFzIGEgZGVmYXVsdCB3ZWxjb21lIGZpbGUsIHN1Y2ggYXMgaW5kZXguaHRtbAotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItYXBwXzJfNS54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl81LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwOTAyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl81LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0JICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0JICAgIHZlcnNpb249IjIuNSI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpd2ViLWFwcF8yXzUueHNkcwkxLjYyIDA1LzA4LzA2Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBDb3B5cmlnaHQgMjAwMy0yMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gICAgICBVLlMuQQotICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLQotICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotCi0gICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwhW0NEQVRBWwotCi0JVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIFNlcnZsZXQgMi41IGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQlUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgYmUgbmFtZWQgIldFQi1JTkYvd2ViLnhtbCIgaW4gdGhlCi0Jd2ViIGFwcGxpY2F0aW9uJ3Mgd2FyIGZpbGUuICBBbGwgU2VydmxldCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzCi0JbXVzdCBpbmRpY2F0ZSB0aGUgd2ViIGFwcGxpY2F0aW9uIHNjaGVtYSBieSB1c2luZyB0aGUgSmF2YSBFRQotCW5hbWVzcGFjZToKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotCi0JYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotCXVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLQkgICAgPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iLi4uIgotCSAgICAgIHZlcnNpb249IjIuNSI+Ci0JICAgICAgLi4uCi0JICAgIDwvd2ViLWFwcD4KLQotCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgotCXRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIEphdmEgRUUKLQluYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi0JaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZAotCi0JXV0+Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKYXZhIEVFCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi0KLSAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLQlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLQlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0JcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0JbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iamF2YWVlXzUueHNkIi8+Ci0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0ianNwXzJfMS54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDplbGVtZW50IG5hbWU9IndlYi1hcHAiIHR5cGU9ImphdmFlZTp3ZWItYXBwVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHdlYi1hcHAgZWxlbWVudCBpcyB0aGUgcm9vdCBvZiB0aGUgZGVwbG95bWVudAotCWRlc2NyaXB0b3IgZm9yIGEgd2ViIGFwcGxpY2F0aW9uLiAgTm90ZSB0aGF0IHRoZSBzdWItZWxlbWVudHMKLQlvZiB0aGlzIGVsZW1lbnQgY2FuIGJlIGluIHRoZSBhcmJpdHJhcnkgb3JkZXIuIEJlY2F1c2Ugb2YKLQl0aGF0LCB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSBlbGVtZW50cyBvZiBkaXN0cmlidXRhYmxlLAotCXNlc3Npb24tY29uZmlnLCB3ZWxjb21lLWZpbGUtbGlzdCwganNwLWNvbmZpZywgbG9naW4tY29uZmlnLAotCWFuZCBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IHdhcyBjaGFuZ2VkIGZyb20gIj8iIHRvICIqIgotCWluIHRoaXMgc2NoZW1hLiAgSG93ZXZlciwgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpbnN0YW5jZQotCWZpbGUgbXVzdCBub3QgY29udGFpbiBtdWx0aXBsZSBlbGVtZW50cyBvZiBzZXNzaW9uLWNvbmZpZywKLQlqc3AtY29uZmlnLCBhbmQgbG9naW4tY29uZmlnLiBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBlbGVtZW50cyBvZgotCXdlbGNvbWUtZmlsZS1saXN0IG9yIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3QsIHRoZSBjb250YWluZXIKLQltdXN0IGNvbmNhdGVuYXRlIHRoZSBlbGVtZW50IGNvbnRlbnRzLiAgVGhlIG11bHRpcGxlIG9jY3VyZW5jZQotCW9mIHRoZSBlbGVtZW50IGRpc3RyaWJ1dGFibGUgaXMgcmVkdW5kYW50IGFuZCB0aGUgY29udGFpbmVyCi0JdHJlYXRzIHRoYXQgY2FzZSBleGFjdGx5IGluIHRoZSBzYW1lIHdheSB3aGVuIHRoZXJlIGlzIG9ubHkKLQlvbmUgZGlzdHJpYnV0YWJsZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1zZXJ2bGV0LW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgc2VydmxldCBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgc2VydmxldC4KLQkgIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6c2VydmxldCIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnNlcnZsZXQtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtZmlsdGVyLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgZmlsdGVyIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWx0ZXIuCi0JICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmZpbHRlciIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmZpbHRlci1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1lamItbG9jYWwtcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgZWpiLWxvY2FsLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0JICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSB3ZWIKLQkgIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0JICB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi0JICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplamItbG9jYWwtcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1lamItcmVmLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgZWpiLXJlZi1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gRUpCCi0JICByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluIHRoZSB3ZWIKLQkgIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgYW5kIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAgamF2YTpjb21wL2VudiBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluCi0JICB0aGUgd2ViIGFwcGxpY2F0aW9uLgotCi0JICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5hbWUgaXMgcHJlZml4ZWQgd2l0aCAiZWpiLyIuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTplamItcmVmIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6ZWpiLXJlZi1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0id2ViLWFwcC1yZXNvdXJjZS1lbnYtcmVmLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZgotCSAgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2U7IGl0cyB2YWx1ZSBpcyB0aGUKLQkgIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIGNvZGUuCi0JICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudgotCSAgY29udGV4dCBhbmQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6cmVzb3VyY2UtZW52LXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnJlc291cmNlLWVudi1yZWYtbmFtZSIvPgotICAgIDwveHNkOnVuaXF1ZT4KLQotICAgIDx4c2Q6dW5pcXVlIG5hbWU9IndlYi1hcHAtbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZgotCSAgYSBtZXNzYWdlIGRlc3RpbmF0aW9uIHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzIHRoZQotCSAgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gY29kZS4KLQkgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52Ci0JICBjb250ZXh0IGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLXJlcy1yZWYtbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlLiAgVGhlIG5hbWUKLQkgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCi0JICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpyZXNvdXJjZS1yZWYiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpyZXMtcmVmLW5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJ3ZWItYXBwLWVudi1lbnRyeS1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIGVudi1lbnRyeS1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSB3ZWIKLQkgIGFwcGxpY2F0aW9uJ3MgZW52aXJvbm1lbnQgZW50cnkuICBUaGUgbmFtZSBpcyBhIEpOREkKLQkgIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lCi0JICBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSB3ZWIgYXBwbGljYXRpb24uCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOmVudi1lbnRyeSIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOmVudi1lbnRyeS1uYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDprZXkgbmFtZT0id2ViLWFwcC1yb2xlLW5hbWUta2V5Ij4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIEEgcm9sZS1uYW1lLWtleSBpcyBzcGVjaWZpZWQgdG8gYWxsb3cgdGhlIHJlZmVyZW5jZXMKLQkgIGZyb20gdGhlIHNlY3VyaXR5LXJvbGUtcmVmcy4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnNlY3VyaXR5LXJvbGUiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpyb2xlLW5hbWUiLz4KLSAgICA8L3hzZDprZXk+Ci0KLSAgICA8eHNkOmtleXJlZiBuYW1lPSJ3ZWItYXBwLXJvbGUtbmFtZS1yZWZlcmVuY2VzIgotCQlyZWZlcj0iamF2YWVlOndlYi1hcHAtcm9sZS1uYW1lLWtleSI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUga2V5cmVmIGluZGljYXRlcyB0aGUgcmVmZXJlbmNlcyBmcm9tCi0JICBzZWN1cml0eS1yb2xlLXJlZiB0byBhIHNwZWNpZmllZCByb2xlLW5hbWUuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpzZXJ2bGV0L2phdmFlZTpzZWN1cml0eS1yb2xlLXJlZiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOnJvbGUtbGluayIvPgotICAgIDwveHNkOmtleXJlZj4KLSAgPC94c2Q6ZWxlbWVudD4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdXRoLWNvbnN0cmFpbnRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYXV0aC1jb25zdHJhaW50VHlwZSBpbmRpY2F0ZXMgdGhlIHVzZXIgcm9sZXMgdGhhdAotCXNob3VsZCBiZSBwZXJtaXR0ZWQgYWNjZXNzIHRvIHRoaXMgcmVzb3VyY2UKLQljb2xsZWN0aW9uLiBUaGUgcm9sZS1uYW1lIHVzZWQgaGVyZSBtdXN0IGVpdGhlciBjb3JyZXNwb25kCi0JdG8gdGhlIHJvbGUtbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMKLQlkZWZpbmVkIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiwgb3IgYmUgdGhlIHNwZWNpYWxseQotCXJlc2VydmVkIHJvbGUtbmFtZSAiKiIgdGhhdCBpcyBhIGNvbXBhY3Qgc3ludGF4IGZvcgotCWluZGljYXRpbmcgYWxsIHJvbGVzIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uIElmIGJvdGggIioiCi0JYW5kIHJvbGVuYW1lcyBhcHBlYXIsIHRoZSBjb250YWluZXIgaW50ZXJwcmV0cyB0aGlzIGFzIGFsbAotCXJvbGVzLiAgSWYgbm8gcm9sZXMgYXJlIGRlZmluZWQsIG5vIHVzZXIgaXMgYWxsb3dlZCBhY2Nlc3MKLQl0byB0aGUgcG9ydGlvbiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlc2NyaWJlZCBieSB0aGUKLQljb250YWluaW5nIHNlY3VyaXR5LWNvbnN0cmFpbnQuICBUaGUgY29udGFpbmVyIG1hdGNoZXMKLQlyb2xlIG5hbWVzIGNhc2Ugc2Vuc2l0aXZlbHkgd2hlbiBkZXRlcm1pbmluZyBhY2Nlc3MuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb2xlLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpyb2xlLW5hbWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXV0aC1tZXRob2RUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgYXV0aC1tZXRob2RUeXBlIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBhdXRoZW50aWNhdGlvbgotCW1lY2hhbmlzbSBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbi4gQXMgYSBwcmVyZXF1aXNpdGUgdG8KLQlnYWluaW5nIGFjY2VzcyB0byBhbnkgd2ViIHJlc291cmNlcyB3aGljaCBhcmUgcHJvdGVjdGVkIGJ5Ci0JYW4gYXV0aG9yaXphdGlvbiBjb25zdHJhaW50LCBhIHVzZXIgbXVzdCBoYXZlIGF1dGhlbnRpY2F0ZWQKLQl1c2luZyB0aGUgY29uZmlndXJlZCBtZWNoYW5pc20uIExlZ2FsIHZhbHVlcyBhcmUgIkJBU0lDIiwKLQkiRElHRVNUIiwgIkZPUk0iLCAiQ0xJRU5ULUNFUlQiLCBvciBhIHZlbmRvci1zcGVjaWZpYwotCWF1dGhlbnRpY2F0aW9uIHNjaGVtZS4KLQotCVVzZWQgaW46IGxvZ2luLWNvbmZpZwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzcGF0Y2hlclR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBkaXNwYXRjaGVyIGhhcyBmb3VyIGxlZ2FsIHZhbHVlczogRk9SV0FSRCwgUkVRVUVTVCwgSU5DTFVERSwKLQlhbmQgRVJST1IuIEEgdmFsdWUgb2YgRk9SV0FSRCBtZWFucyB0aGUgRmlsdGVyIHdpbGwgYmUgYXBwbGllZAotCXVuZGVyIFJlcXVlc3REaXNwYXRjaGVyLmZvcndhcmQoKSBjYWxscy4gIEEgdmFsdWUgb2YgUkVRVUVTVAotCW1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHVuZGVyIG9yZGluYXJ5IGNsaWVudCBjYWxscyB0bwotCXRoZSBwYXRoIG9yIHNlcnZsZXQuIEEgdmFsdWUgb2YgSU5DTFVERSBtZWFucyB0aGUgRmlsdGVyIHdpbGwgYmUKLQlhcHBsaWVkIHVuZGVyIFJlcXVlc3REaXNwYXRjaGVyLmluY2x1ZGUoKSBjYWxscy4gIEEgdmFsdWUgb2YKLQlFUlJPUiBtZWFucyB0aGUgRmlsdGVyIHdpbGwgYmUgYXBwbGllZCB1bmRlciB0aGUgZXJyb3IgcGFnZQotCW1lY2hhbmlzbS4gIFRoZSBhYnNlbmNlIG9mIGFueSBkaXNwYXRjaGVyIGVsZW1lbnRzIGluIGEKLQlmaWx0ZXItbWFwcGluZyBpbmRpY2F0ZXMgYSBkZWZhdWx0IG9mIGFwcGx5aW5nIGZpbHRlcnMgb25seSB1bmRlcgotCW9yZGluYXJ5IGNsaWVudCBjYWxscyB0byB0aGUgcGF0aCBvciBzZXJ2bGV0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZPUldBUkQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTkNMVURFIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVRVUVTVCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVSUk9SIi8+Ci0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbmNvZGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlbmNvZGluZ1R5cGUgZGVmaW5lcyBJQU5BIGNoYXJhY3RlciBzZXRzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbXlxzXSsiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXJyb3ItY29kZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlcnJvci1jb2RlIGNvbnRhaW5zIGFuIEhUVFAgZXJyb3IgY29kZSwgZXg6IDQwNAotCi0JVXNlZCBpbjogZXJyb3ItcGFnZQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTp4c2RQb3NpdGl2ZUludGVnZXJUeXBlIj4KLQk8eHNkOnBhdHRlcm4gdmFsdWU9IlxkezN9Ii8+Ci0JPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVycm9yLXBhZ2VUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZXJyb3ItcGFnZVR5cGUgY29udGFpbnMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXJyb3IgY29kZQotCW9yIGV4Y2VwdGlvbiB0eXBlIHRvIHRoZSBwYXRoIG9mIGEgcmVzb3VyY2UgaW4gdGhlIHdlYgotCWFwcGxpY2F0aW9uLgotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImVycm9yLWNvZGUiCi0JCSAgICAgdHlwZT0iamF2YWVlOmVycm9yLWNvZGVUeXBlIi8+Ci0KLQk8eHNkOmVsZW1lbnQgbmFtZT0iZXhjZXB0aW9uLXR5cGUiCi0JCSAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgZXhjZXB0aW9uLXR5cGUgY29udGFpbnMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLQkgICAgICBuYW1lIG9mIGEgSmF2YSBleGNlcHRpb24gdHlwZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotICAgICAgPC94c2Q6Y2hvaWNlPgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jYXRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTp3YXItcGF0aFR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbG9jYXRpb24gZWxlbWVudCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlCi0JICAgIHJlc291cmNlIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLQkgICAgdGhlIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBtdXN0IGhhdmUKLQkgICAgYSBsZWFkaW5nIGAvJy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWx0ZXItbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCURlY2xhcmF0aW9uIG9mIHRoZSBmaWx0ZXIgbWFwcGluZ3MgaW4gdGhpcyB3ZWIKLQlhcHBsaWNhdGlvbiBpcyBkb25lIGJ5IHVzaW5nIGZpbHRlci1tYXBwaW5nVHlwZS4KLQlUaGUgY29udGFpbmVyIHVzZXMgdGhlIGZpbHRlci1tYXBwaW5nCi0JZGVjbGFyYXRpb25zIHRvIGRlY2lkZSB3aGljaCBmaWx0ZXJzIHRvIGFwcGx5IHRvIGEgcmVxdWVzdCwKLQlhbmQgaW4gd2hhdCBvcmRlci4gVGhlIGNvbnRhaW5lciBtYXRjaGVzIHRoZSByZXF1ZXN0IFVSSSB0bwotCWEgU2VydmxldCBpbiB0aGUgbm9ybWFsIHdheS4gVG8gZGV0ZXJtaW5lIHdoaWNoIGZpbHRlcnMgdG8KLQlhcHBseSBpdCBtYXRjaGVzIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyBlaXRoZXIgb24KLQlzZXJ2bGV0LW5hbWUsIG9yIG9uIHVybC1wYXR0ZXJuIGZvciBlYWNoIGZpbHRlci1tYXBwaW5nCi0JZWxlbWVudCwgZGVwZW5kaW5nIG9uIHdoaWNoIHN0eWxlIGlzIHVzZWQuIFRoZSBvcmRlciBpbgotCXdoaWNoIGZpbHRlcnMgYXJlIGludm9rZWQgaXMgdGhlIG9yZGVyIGluIHdoaWNoCi0JZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIHRoYXQgbWF0Y2ggYSByZXF1ZXN0IFVSSSBmb3IgYQotCXNlcnZsZXQgYXBwZWFyIGluIHRoZSBsaXN0IG9mIGZpbHRlci1tYXBwaW5nIGVsZW1lbnRzLlRoZQotCWZpbHRlci1uYW1lIHZhbHVlIG11c3QgYmUgdGhlIHZhbHVlIG9mIHRoZSBmaWx0ZXItbmFtZQotCXN1Yi1lbGVtZW50cyBvZiBvbmUgb2YgdGhlIGZpbHRlciBkZWNsYXJhdGlvbnMgaW4gdGhlCi0JZGVwbG95bWVudCBkZXNjcmlwdG9yLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6ZmlsdGVyLW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmVsZW1lbnQgbmFtZT0idXJsLXBhdHRlcm4iCi0JCSAgICAgdHlwZT0iamF2YWVlOnVybC1wYXR0ZXJuVHlwZSIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LW5hbWUiCi0JCSAgICAgdHlwZT0iamF2YWVlOnNlcnZsZXQtbmFtZVR5cGUiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNwYXRjaGVyIgotCQkgICB0eXBlPSJqYXZhZWU6ZGlzcGF0Y2hlclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSI0Ii8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmlsdGVyLW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbG9naWNhbCBuYW1lIG9mIHRoZSBmaWx0ZXIgaXMgZGVjbGFyZQotCWJ5IHVzaW5nIGZpbHRlci1uYW1lVHlwZS4gVGhpcyBuYW1lIGlzIHVzZWQgdG8gbWFwIHRoZQotCWZpbHRlci4gIEVhY2ggZmlsdGVyIG5hbWUgaXMgdW5pcXVlIHdpdGhpbiB0aGUgd2ViCi0JYXBwbGljYXRpb24uCi0KLQlVc2VkIGluOiBmaWx0ZXIsIGZpbHRlci1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImphdmFlZTpub25FbXB0eVN0cmluZ1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmlsdGVyVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGZpbHRlclR5cGUgaXMgdXNlZCB0byBkZWNsYXJlIGEgZmlsdGVyIGluIHRoZSB3ZWIKLQlhcHBsaWNhdGlvbi4gVGhlIGZpbHRlciBpcyBtYXBwZWQgdG8gZWl0aGVyIGEgc2VydmxldCBvciBhCi0JVVJMIHBhdHRlcm4gaW4gdGhlIGZpbHRlci1tYXBwaW5nIGVsZW1lbnQsIHVzaW5nIHRoZQotCWZpbHRlci1uYW1lIHZhbHVlIHRvIHJlZmVyZW5jZS4gRmlsdGVycyBjYW4gYWNjZXNzIHRoZQotCWluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgZGVjbGFyZWQgaW4gdGhlIGRlcGxveW1lbnQKLQlkZXNjcmlwdG9yIGF0IHJ1bnRpbWUgdmlhIHRoZSBGaWx0ZXJDb25maWcgaW50ZXJmYWNlLgotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyLW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpmaWx0ZXItbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWx0ZXItY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGZpbHRlci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXQtcGFyYW0iCi0JCSAgIHR5cGU9ImphdmFlZTpwYXJhbS12YWx1ZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS92YWx1ZSBwYWlyIGFzCi0JICAgIGFuIGluaXRpYWxpemF0aW9uIHBhcmFtIG9mIGEgc2VydmxldCBmaWx0ZXIKLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmb3JtLWxvZ2luLWNvbmZpZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBmb3JtLWxvZ2luLWNvbmZpZ1R5cGUgc3BlY2lmaWVzIHRoZSBsb2dpbiBhbmQgZXJyb3IKLQlwYWdlcyB0aGF0IHNob3VsZCBiZSB1c2VkIGluIGZvcm0gYmFzZWQgbG9naW4uIElmIGZvcm0gYmFzZWQKLQlhdXRoZW50aWNhdGlvbiBpcyBub3QgdXNlZCwgdGhlc2UgZWxlbWVudHMgYXJlIGlnbm9yZWQuCi0KLQlVc2VkIGluOiBsb2dpbi1jb25maWcKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcm0tbG9naW4tcGFnZSIKLQkJICAgdHlwZT0iamF2YWVlOndhci1wYXRoVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBmb3JtLWxvZ2luLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgd2ViCi0JICAgIGFwcCB3aGVyZSB0aGUgcGFnZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBsb2dpbiBjYW4gYmUKLQkgICAgZm91bmQuICBUaGUgcGF0aCBiZWdpbnMgd2l0aCBhIGxlYWRpbmcgLyBhbmQgaXMgaW50ZXJwcmV0ZWQKLQkgICAgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIFdBUi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcm0tZXJyb3ItcGFnZSIKLQkJICAgdHlwZT0iamF2YWVlOndhci1wYXRoVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBmb3JtLWVycm9yLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbgotCSAgICB0aGUgd2ViIGFwcCB3aGVyZSB0aGUgZXJyb3IgcGFnZSB0aGF0IGlzIGRpc3BsYXllZAotCSAgICB3aGVuIGxvZ2luIGlzIG5vdCBzdWNjZXNzZnVsIGNhbiBiZSBmb3VuZC4KLQkgICAgVGhlIHBhdGggYmVnaW5zIHdpdGggYSBsZWFkaW5nIC8gYW5kIGlzIGludGVycHJldGVkCi0JICAgIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBXQVIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Imh0dHAtbWV0aG9kVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotCi0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlBIEhUVFAgbWV0aG9kIHR5cGUgYXMgZGVmaW5lZCBpbiBIVFRQIDEuMSBzZWN0aW9uIDIuMi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iWyYjMzM7LSYjMTI2Oy1bXChcKSYjNjA7JiM2MjtALDs6JiMzNDsvXFtcXT89XHtcfVxcXHB7Wn1dXSsiLz4KLSAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJsb2FkLW9uLXN0YXJ0dXBUeXBlIj4KLSAgICA8eHNkOnVuaW9uIG1lbWJlclR5cGVzPSJqYXZhZWU6bnVsbC1jaGFyVHlwZSB4c2Q6aW50ZWdlciIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3QgY29udGFpbnMgb25lIG9yIG1vcmUKLQlsb2NhbGUtZW5jb2RpbmctbWFwcGluZyhzKS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbGUtZW5jb2RpbmctbWFwcGluZyIKLQkJICAgdHlwZT0iamF2YWVlOmxvY2FsZS1lbmNvZGluZy1tYXBwaW5nVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2NhbGUtZW5jb2RpbmctbWFwcGluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsb2NhbGUtZW5jb2RpbmctbWFwcGluZyBjb250YWlucyBsb2NhbGUgbmFtZSBhbmQKLQllbmNvZGluZyBuYW1lLiBUaGUgbG9jYWxlIG5hbWUgbXVzdCBiZSBlaXRoZXIgIkxhbmd1YWdlLWNvZGUiLAotCXN1Y2ggYXMgImphIiwgZGVmaW5lZCBieSBJU08tNjM5IG9yICJMYW5ndWFnZS1jb2RlX0NvdW50cnktY29kZSIsCi0Jc3VjaCBhcyAiamFfSlAiLiAgIkNvdW50cnkgY29kZSIgaXMgZGVmaW5lZCBieSBJU08tMzE2Ni4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NhbGUiCi0JCSAgIHR5cGU9ImphdmFlZTpsb2NhbGVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5jb2RpbmciCi0JCSAgIHR5cGU9ImphdmFlZTplbmNvZGluZ1R5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvY2FsZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBsb2NhbGVUeXBlIGRlZmluZXMgdmFsaWQgbG9jYWxlIGRlZmluZWQgYnkgSVNPLTYzOS0xCi0JYW5kIElTTy0zMTY2LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbYS16XXsyfShffC0pPyhbXHB7TH1cLVxwe05kfV17Mn0pPyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2dpbi1jb25maWdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbG9naW4tY29uZmlnVHlwZSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KLQltZXRob2QgdGhhdCBzaG91bGQgYmUgdXNlZCwgdGhlIHJlYWxtIG5hbWUgdGhhdCBzaG91bGQgYmUKLQl1c2VkIGZvciB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgdGhlIGF0dHJpYnV0ZXMgdGhhdCBhcmUKLQluZWVkZWQgYnkgdGhlIGZvcm0gbG9naW4gbWVjaGFuaXNtLgotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF1dGgtbWV0aG9kIgotCQkgICB0eXBlPSJqYXZhZWU6YXV0aC1tZXRob2RUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWFsbS1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgcmVhbG0gbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgcmVhbG0gbmFtZSB0bwotCSAgICB1c2UgaW4gSFRUUCBCYXNpYyBhdXRob3JpemF0aW9uLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcm0tbG9naW4tY29uZmlnIgotCQkgICB0eXBlPSJqYXZhZWU6Zm9ybS1sb2dpbi1jb25maWdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtaW1lLW1hcHBpbmdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWltZS1tYXBwaW5nVHlwZSBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGV4dGVuc2lvbgotCWFuZCBhIG1pbWUgdHlwZS4KLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBleHRlbnNpb24gZWxlbWVudCBjb250YWlucyBhIHN0cmluZyBkZXNjcmliaW5nIGFuCi0JICBleHRlbnNpb24uIGV4YW1wbGU6ICJ0eHQiCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbWUtdHlwZSIKLQkJICAgdHlwZT0iamF2YWVlOm1pbWUtdHlwZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtaW1lLXR5cGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgbWltZS10eXBlVHlwZSBpcyB1c2VkIHRvIGluZGljYXRlIGEgZGVmaW5lZCBtaW1lIHR5cGUuCi0KLQlFeGFtcGxlOgotCSJ0ZXh0L3BsYWluIgotCi0JVXNlZCBpbjogbWltZS1tYXBwaW5nCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDpwYXR0ZXJuIHZhbHVlPSJbXlxwe0NjfV5cc10rL1teXHB7Q2N9XlxzXSsiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJub25FbXB0eVN0cmluZ1R5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQlUaGlzIHR5cGUgZGVmaW5lcyBhIHN0cmluZyB3aGljaCBjb250YWlucyBhdCBsZWFzdCBvbmUKLQljaGFyYWN0ZXIuCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOm1pbkxlbmd0aCB2YWx1ZT0iMSIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibnVsbC1jaGFyVHlwZSI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWN1cml0eS1jb25zdHJhaW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlY3VyaXR5LWNvbnN0cmFpbnRUeXBlIGlzIHVzZWQgdG8gYXNzb2NpYXRlCi0Jc2VjdXJpdHkgY29uc3RyYWludHMgd2l0aCBvbmUgb3IgbW9yZSB3ZWIgcmVzb3VyY2UKLQljb2xsZWN0aW9ucwotCi0JVXNlZCBpbjogd2ViLWFwcAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3BsYXktbmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOmRpc3BsYXktbmFtZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOndlYi1yZXNvdXJjZS1jb2xsZWN0aW9uVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdXRoLWNvbnN0cmFpbnQiCi0JCSAgIHR5cGU9ImphdmFlZTphdXRoLWNvbnN0cmFpbnRUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VyLWRhdGEtY29uc3RyYWludCIKLQkJICAgdHlwZT0iamF2YWVlOnVzZXItZGF0YS1jb25zdHJhaW50VHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmxldC1tYXBwaW5nVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlcnZsZXQtbWFwcGluZ1R5cGUgZGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhCi0Jc2VydmxldCBhbmQgYSB1cmwgcGF0dGVybi4KLQotCVVzZWQgaW46IHdlYi1hcHAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzZXJ2bGV0LW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsLXBhdHRlcm4iCi0JCSAgIHR5cGU9ImphdmFlZTp1cmwtcGF0dGVyblR5cGUiCi0gICAgICAgICAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2bGV0LW5hbWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgc2VydmxldC1uYW1lIGVsZW1lbnQgY29udGFpbnMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZQotCXNlcnZsZXQuIEVhY2ggc2VydmxldCBuYW1lIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHdlYgotCWFwcGxpY2F0aW9uLgotICAgICAgICBUaGUgc3BlY2lhbCBzZXJ2bGV0IG5hbWUgb2YgIioiIG1heSBiZSB1c2VkIHRvIHJlZmVyZW5jZSBhbGwKLSAgICAgICAgc2VydmxldHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImphdmFlZTpub25FbXB0eVN0cmluZ1R5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmxldFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBzZXJ2bGV0VHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYSBzZXJ2bGV0LgotCUl0IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGl2ZSBkYXRhIG9mIGEKLQlzZXJ2bGV0LiBJZiBhIGpzcC1maWxlIGlzIHNwZWNpZmllZCBhbmQgdGhlIGxvYWQtb24tc3RhcnR1cAotCWVsZW1lbnQgaXMgcHJlc2VudCwgdGhlbiB0aGUgSlNQIHNob3VsZCBiZSBwcmVjb21waWxlZCBhbmQKLQlsb2FkZWQuCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTpzZXJ2bGV0LW5hbWVUeXBlIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmxldC1jbGFzcyIKLQkJICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICAgIFRoZSBzZXJ2bGV0LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5Ci0JICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHNlcnZsZXQuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJqc3AtZmlsZSIKLQkJICAgICB0eXBlPSJqYXZhZWU6anNwLWZpbGVUeXBlIi8+Ci0KLSAgICAgIDwveHNkOmNob2ljZT4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXQtcGFyYW0iCi0JCSAgIHR5cGU9ImphdmFlZTpwYXJhbS12YWx1ZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2FkLW9uLXN0YXJ0dXAiCi0JCSAgIHR5cGU9ImphdmFlZTpsb2FkLW9uLXN0YXJ0dXBUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgbG9hZC1vbi1zdGFydHVwIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhpcwotCSAgICBzZXJ2bGV0IHNob3VsZCBiZSBsb2FkZWQgKGluc3RhbnRpYXRlZCBhbmQgaGF2ZQotCSAgICBpdHMgaW5pdCgpIGNhbGxlZCkgb24gdGhlIHN0YXJ0dXAgb2YgdGhlIHdlYgotCSAgICBhcHBsaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGNvbnRlbnRzIG9mIHRoZXNlCi0JICAgIGVsZW1lbnQgbXVzdCBiZSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIG9yZGVyIGluCi0JICAgIHdoaWNoIHRoZSBzZXJ2bGV0IHNob3VsZCBiZSBsb2FkZWQuIElmIHRoZSB2YWx1ZQotCSAgICBpcyBhIG5lZ2F0aXZlIGludGVnZXIsIG9yIHRoZSBlbGVtZW50IGlzIG5vdAotCSAgICBwcmVzZW50LCB0aGUgY29udGFpbmVyIGlzIGZyZWUgdG8gbG9hZCB0aGUgc2VydmxldAotCSAgICB3aGVuZXZlciBpdCBjaG9vc2VzLiBJZiB0aGUgdmFsdWUgaXMgYSBwb3NpdGl2ZQotCSAgICBpbnRlZ2VyIG9yIDAsIHRoZSBjb250YWluZXIgbXVzdCBsb2FkIGFuZAotCSAgICBpbml0aWFsaXplIHRoZSBzZXJ2bGV0IGFzIHRoZSBhcHBsaWNhdGlvbiBpcwotCSAgICBkZXBsb3llZC4gVGhlIGNvbnRhaW5lciBtdXN0IGd1YXJhbnRlZSB0aGF0Ci0JICAgIHNlcnZsZXRzIG1hcmtlZCB3aXRoIGxvd2VyIGludGVnZXJzIGFyZSBsb2FkZWQKLQkgICAgYmVmb3JlIHNlcnZsZXRzIG1hcmtlZCB3aXRoIGhpZ2hlciBpbnRlZ2Vycy4gVGhlCi0JICAgIGNvbnRhaW5lciBtYXkgY2hvb3NlIHRoZSBvcmRlciBvZiBsb2FkaW5nIG9mCi0JICAgIHNlcnZsZXRzIHdpdGggdGhlIHNhbWUgbG9hZC1vbi1zdGFydC11cCB2YWx1ZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJydW4tYXMiCi0JCSAgIHR5cGU9ImphdmFlZTpydW4tYXNUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1yb2xlLXJlZiIKLQkJICAgdHlwZT0iamF2YWVlOnNlY3VyaXR5LXJvbGUtcmVmVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24tY29uZmlnVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHNlc3Npb24tY29uZmlnVHlwZSBkZWZpbmVzIHRoZSBzZXNzaW9uIHBhcmFtZXRlcnMKLQlmb3IgdGhpcyB3ZWIgYXBwbGljYXRpb24uCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi10aW1lb3V0IgotCQkgICB0eXBlPSJqYXZhZWU6eHNkSW50ZWdlclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBzZXNzaW9uLXRpbWVvdXQgZWxlbWVudCBkZWZpbmVzIHRoZSBkZWZhdWx0Ci0JICAgIHNlc3Npb24gdGltZW91dCBpbnRlcnZhbCBmb3IgYWxsIHNlc3Npb25zIGNyZWF0ZWQKLQkgICAgaW4gdGhpcyB3ZWIgYXBwbGljYXRpb24uIFRoZSBzcGVjaWZpZWQgdGltZW91dAotCSAgICBtdXN0IGJlIGV4cHJlc3NlZCBpbiBhIHdob2xlIG51bWJlciBvZiBtaW51dGVzLgotCSAgICBJZiB0aGUgdGltZW91dCBpcyAwIG9yIGxlc3MsIHRoZSBjb250YWluZXIgZW5zdXJlcwotCSAgICB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb2Ygc2Vzc2lvbnMgaXMgbmV2ZXIgdG8gdGltZQotCSAgICBvdXQuIElmIHRoaXMgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgY29udGFpbmVyCi0JICAgIG11c3Qgc2V0IGl0cyBkZWZhdWx0IHRpbWVvdXQgcGVyaW9kLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zcG9ydC1ndWFyYW50ZWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdHJhbnNwb3J0LWd1YXJhbnRlZVR5cGUgc3BlY2lmaWVzIHRoYXQgdGhlIGNvbW11bmljYXRpb24KLQliZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyIHNob3VsZCBiZSBOT05FLCBJTlRFR1JBTCwgb3IKLQlDT05GSURFTlRJQUwuIE5PTkUgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gZG9lcyBub3QKLQlyZXF1aXJlIGFueSB0cmFuc3BvcnQgZ3VhcmFudGVlcy4gQSB2YWx1ZSBvZiBJTlRFR1JBTCBtZWFucwotCXRoYXQgdGhlIGFwcGxpY2F0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgc2VudCBiZXR3ZWVuIHRoZQotCWNsaWVudCBhbmQgc2VydmVyIGJlIHNlbnQgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGNhbid0IGJlCi0JY2hhbmdlZCBpbiB0cmFuc2l0LiBDT05GSURFTlRJQUwgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24KLQlyZXF1aXJlcyB0aGF0IHRoZSBkYXRhIGJlIHRyYW5zbWl0dGVkIGluIGEgZmFzaGlvbiB0aGF0Ci0JcHJldmVudHMgb3RoZXIgZW50aXRpZXMgZnJvbSBvYnNlcnZpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZQotCXRyYW5zbWlzc2lvbi4gSW4gbW9zdCBjYXNlcywgdGhlIHByZXNlbmNlIG9mIHRoZSBJTlRFR1JBTCBvcgotCUNPTkZJREVOVElBTCBmbGFnIHdpbGwgaW5kaWNhdGUgdGhhdCB0aGUgdXNlIG9mIFNTTCBpcwotCXJlcXVpcmVkLgotCi0JVXNlZCBpbjogdXNlci1kYXRhLWNvbnN0cmFpbnQKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5URUdSQUwiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDT05GSURFTlRJQUwiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1c2VyLWRhdGEtY29uc3RyYWludFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB1c2VyLWRhdGEtY29uc3RyYWludFR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZSBob3cKLQlkYXRhIGNvbW11bmljYXRlZCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIGNvbnRhaW5lciBzaG91bGQgYmUKLQlwcm90ZWN0ZWQuCi0KLQlVc2VkIGluOiBzZWN1cml0eS1jb25zdHJhaW50Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnQtZ3VhcmFudGVlIgotCQkgICB0eXBlPSJqYXZhZWU6dHJhbnNwb3J0LWd1YXJhbnRlZVR5cGUiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3YXItcGF0aFR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBlbGVtZW50cyB0aGF0IHVzZSB0aGlzIHR5cGUgZGVzaWduYXRlIGEgcGF0aCBzdGFydGluZwotCXdpdGggYSAiLyIgYW5kIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIGEgV0FSCi0JZmlsZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDpwYXR0ZXJuIHZhbHVlPSIvLioiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IndlYi1hcHAtdmVyc2lvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBjb250YWlucyB0aGUgcmVjb2duaXplZCB2ZXJzaW9ucyBvZgotCXdlYi1hcHBsaWNhdGlvbiBzdXBwb3J0ZWQuIEl0IGlzIHVzZWQgdG8gZGVzaWduYXRlIHRoZQotCXZlcnNpb24gb2YgdGhlIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIuNSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWItYXBwVHlwZSI+Ci0KLSAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc3RyaWJ1dGFibGUiCi0JCSAgIHR5cGU9ImphdmFlZTplbXB0eVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250ZXh0LXBhcmFtIgotCQkgICB0eXBlPSJqYXZhZWU6cGFyYW0tdmFsdWVUeXBlIj4KLQotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgY29udGV4dC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbgotCSAgICBvZiBhIHdlYiBhcHBsaWNhdGlvbidzIHNlcnZsZXQgY29udGV4dAotCSAgICBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsdGVyIgotCQkgICB0eXBlPSJqYXZhZWU6ZmlsdGVyVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbHRlci1tYXBwaW5nIgotCQkgICB0eXBlPSJqYXZhZWU6ZmlsdGVyLW1hcHBpbmdUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlzdGVuZXIiCi0JCSAgIHR5cGU9ImphdmFlZTpsaXN0ZW5lclR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0IgotCQkgICB0eXBlPSJqYXZhZWU6c2VydmxldFR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2bGV0LW1hcHBpbmciCi0JCSAgIHR5cGU9ImphdmFlZTpzZXJ2bGV0LW1hcHBpbmdUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi1jb25maWciCi0JCSAgIHR5cGU9ImphdmFlZTpzZXNzaW9uLWNvbmZpZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtaW1lLW1hcHBpbmciCi0JCSAgIHR5cGU9ImphdmFlZTptaW1lLW1hcHBpbmdUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2VsY29tZS1maWxlLWxpc3QiCi0JCSAgIHR5cGU9ImphdmFlZTp3ZWxjb21lLWZpbGUtbGlzdFR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlcnJvci1wYWdlIgotCQkgICB0eXBlPSJqYXZhZWU6ZXJyb3ItcGFnZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqc3AtY29uZmlnIgotCQkgICB0eXBlPSJqYXZhZWU6anNwLWNvbmZpZ1R5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWN1cml0eS1jb25zdHJhaW50IgotCQkgICB0eXBlPSJqYXZhZWU6c2VjdXJpdHktY29uc3RyYWludFR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dpbi1jb25maWciCi0JCSAgIHR5cGU9ImphdmFlZTpsb2dpbi1jb25maWdUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VjdXJpdHktcm9sZSIKLQkJICAgdHlwZT0iamF2YWVlOnNlY3VyaXR5LXJvbGVUeXBlIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmpuZGlFbnZpcm9ubWVudFJlZnNHcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTptZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3QiCi0JCSAgIHR5cGU9ImphdmFlZTpsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0VHlwZSIvPgotICAgIDwveHNkOmNob2ljZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iCi0JCSAgIHR5cGU9ImphdmFlZTp3ZWItYXBwLXZlcnNpb25UeXBlIgotCQkgICB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgZGVmaW5lcyB3aGV0aGVyIHRoaXMKLQkgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgb3RoZXIgcmVsYXRlZCBkZXBsb3ltZW50Ci0JICBkZXNjcmlwdG9ycyBmb3IgdGhpcyBtb2R1bGUgKGUuZy4sIHdlYiBzZXJ2aWNlCi0JICBkZXNjcmlwdG9ycykgYXJlIGNvbXBsZXRlLCBvciB3aGV0aGVyIHRoZSBjbGFzcwotCSAgZmlsZXMgYXZhaWxhYmxlIHRvIHRoaXMgbW9kdWxlIGFuZCBwYWNrYWdlZCB3aXRoCi0JICB0aGlzIGFwcGxpY2F0aW9uIHNob3VsZCBiZSBleGFtaW5lZCBmb3IgYW5ub3RhdGlvbnMKLQkgIHRoYXQgc3BlY2lmeSBkZXBsb3ltZW50IGluZm9ybWF0aW9uLgotCi0JICBJZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBzZXQgdG8gInRydWUiLCB0aGUgZGVwbG95bWVudAotCSAgdG9vbCBtdXN0IGlnbm9yZSBhbnkgYW5ub3RhdGlvbnMgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQKLQkgIGluZm9ybWF0aW9uLCB3aGljaCBtaWdodCBiZSBwcmVzZW50IGluIHRoZSBjbGFzcyBmaWxlcwotCSAgb2YgdGhlIGFwcGxpY2F0aW9uLgotCi0JICBJZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIHNldCB0bwotCSAgImZhbHNlIiwgdGhlIGRlcGxveW1lbnQgdG9vbCBtdXN0IGV4YW1pbmUgdGhlIGNsYXNzCi0JICBmaWxlcyBvZiB0aGUgYXBwbGljYXRpb24gZm9yIGFubm90YXRpb25zLCBhcwotCSAgc3BlY2lmaWVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9ucy4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLQotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2ViLXJlc291cmNlLWNvbGxlY3Rpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgd2ViLXJlc291cmNlLWNvbGxlY3Rpb25UeXBlIGlzIHVzZWQgdG8gaWRlbnRpZnkgYSBzdWJzZXQKLQlvZiB0aGUgcmVzb3VyY2VzIGFuZCBIVFRQIG1ldGhvZHMgb24gdGhvc2UgcmVzb3VyY2VzIHdpdGhpbgotCWEgd2ViIGFwcGxpY2F0aW9uIHRvIHdoaWNoIGEgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzLiBJZgotCW5vIEhUVFAgbWV0aG9kcyBhcmUgc3BlY2lmaWVkLCB0aGVuIHRoZSBzZWN1cml0eSBjb25zdHJhaW50Ci0JYXBwbGllcyB0byBhbGwgSFRUUCBtZXRob2RzLgotCi0JVXNlZCBpbjogc2VjdXJpdHktY29uc3RyYWludAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndlYi1yZXNvdXJjZS1uYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIHdlYi1yZXNvdXJjZS1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoaXMgd2ViCi0JICAgIHJlc291cmNlIGNvbGxlY3Rpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwtcGF0dGVybiIKLQkJICAgdHlwZT0iamF2YWVlOnVybC1wYXR0ZXJuVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJodHRwLW1ldGhvZCIKLQkJICAgdHlwZT0iamF2YWVlOmh0dHAtbWV0aG9kVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlbGNvbWUtZmlsZS1saXN0VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHdlbGNvbWUtZmlsZS1saXN0IGNvbnRhaW5zIGFuIG9yZGVyZWQgbGlzdCBvZiB3ZWxjb21lCi0JZmlsZXMgZWxlbWVudHMuCi0KLQlVc2VkIGluOiB3ZWItYXBwCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id2VsY29tZS1maWxlIgotCQkgICB0eXBlPSJ4c2Q6c3RyaW5nIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSB3ZWxjb21lLWZpbGUgZWxlbWVudCBjb250YWlucyBmaWxlIG5hbWUgdG8gdXNlCi0JICAgIGFzIGEgZGVmYXVsdCB3ZWxjb21lIGZpbGUsIHN1Y2ggYXMgaW5kZXguaHRtbAotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwveHNkOnNjaGVtYT4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMV8wLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWZhY2VzY29uZmlnXzFfMC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMWM5OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMV8wLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDg3NCArMCwwIEBACi08IS0tCi0gICAgRFREIGZvciB0aGUgSmF2YVNlcnZlciBGYWNlcyBBcHBsaWNhdGlvbiBDb25maWd1cmF0aW9uIEZpbGUgKFZlcnNpb24gMS4wKQotCi0gICAgVG8gc3VwcG9ydCB2YWxpZGF0aW9uIG9mIHlvdXIgY29uZmlndXJhdGlvbiBmaWxlKHMpLCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcKLSAgICBET0NUWVBFIGVsZW1lbnQgYXQgdGhlIGJlZ2lubmluZyAoYWZ0ZXIgdGhlICJ4bWwiIGRlY2xhcmF0aW9uKToKLQotICAgIDwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDCi0gICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiIKLSAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzAuZHRkIj4KLQotICAgICRJZDogd2ViLWZhY2VzY29uZmlnXzFfMC5kdGQsdiAxLjEgMjAwNy8wNS8yNSAyMToxMjo0OSBkYXZpZF93aWxsaWFtcyBFeHAgJAotCi0tLT4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09IERlZmluZWQgVHlwZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQotPCEtLQotICAgIEFuICJBY3Rpb24iIGlzIGEgU3RyaW5nIHRoYXQgcmVwcmVzZW50cyBhIG1ldGhvZCBiaW5kaW5nCi0gICAgZXhwcmVzc2lvbiB0aGF0IHBvaW50cyBhdCBhIG1ldGhvZCB3aXRoIG5vIGFyZ3VtZW50cyB0aGF0IHJldHVybnMgYQotICAgIFN0cmluZy4gIEl0IG11c3QgYmUgYnJhY2tldGVkIHdpdGggIiN7fSIsIGZvciBleGFtcGxlLAotICAgICIje2NhcmRlbW8uYnV5Q2FyfSIuCi0tLT4KLTwhRU5USVRZICUgQWN0aW9uICJDREFUQSI+Ci0KLQotPCEtLQotICAgIEEgIkNsYXNzTmFtZSIgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGlzCi0gICAgaW5zdGFudGlhdGVkIHRvIHByb3ZpZGUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGVuY2xvc2luZyBlbGVtZW50LgotLS0+Ci08IUVOVElUWSAlIENsYXNzTmFtZSAiQ0RBVEEiPgotCi0KLTwhLS0KLSAgICBBbiAiSWRlbnRpZmllciIgaXMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyB0aGF0IGNvbmZvcm1zIHRvIHRoZSB2YXJpYWJsZQotICAgIG5hbWluZyBjb252ZW50aW9ucyBvZiB0aGUgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSAoSkxTIFNlY3Rpb24gPy4/Lj8pLgotLS0+Ci08IUVOVElUWSAlIElkZW50aWZpZXIgIkNEQVRBIj4KLQotCi08IS0tCi0gICAgQSAiSmF2YVR5cGUiIGlzIGVpdGhlciB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIHRoYXQgaXMKLSAgICBpbnN0YW50aWF0ZWQgdG8gcHJvdmlkZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZW5jbG9zaW5nIGVsZW1lbnQsIG9yCi0gICAgdGhlIG5hbWUgb2YgYSBKYXZhIHByaW1pdGl2ZSB0eXBlIChzdWNoIGFzIGludCBvciBjaGFyKS4gIFRoZSBjbGFzcyBuYW1lCi0gICAgb3IgcHJpbWl0aXZlIHR5cGUgbWF5IG9wdGlvbmFsbHkgYmUgZm9sbG93ZWQgYnkgIltdIiB0byBpbmRpY2F0ZSB0aGF0Ci0gICAgdGhlIHVuZGVybHlpbmcgZGF0YSBtdXN0IGJlIGFuIGFycmF5LCByYXRoZXIgdGhhbiBhIHNjYWxhciB2YXJpYWJsZS4KLS0tPgotPCFFTlRJVFkgJSBKYXZhVHlwZSAiQ0RBVEEiPgotCi0KLTwhLS0KLSAgICBBICJMYW5ndWFnZSIgaXMgYSBsb3dlciBjYXNlIHR3by1sZXR0ZXIgY29kZSBmb3IgYSBsYW5ndWFnZSBhcyBkZWZpbmVkCi0gICAgYnkgSVNMLTYzOS4KLS0tPgotPCFFTlRJVFkgJSBMYW5ndWFnZSAiQ0RBVEEiPgotCi0KLTwhLS0KLSAgICBBICJSZXNvdXJjZVBhdGgiIGlzIHRoZSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoIHRvIGEgcmVzb3VyY2UgZmlsZQotICAgIChzdWNoIGFzIGEgbG9nbyBpbWFnZSkuCi0tLT4KLTwhRU5USVRZICUgUmVzb3VyY2VQYXRoICJDREFUQSI+Ci0KLQotPCEtLQotICAgIEEgIlNjb3BlIiBpcyB0aGUgd2VsbC1rbm93biBuYW1lIG9mIGEgc2NvcGUgaW4gd2hpY2ggbWFuYWdlZCBiZWFucyBtYXkKLSAgICBvcHRpb25hbGx5IGJlIGRlZmluZWQgdG8gYmUgY3JlYXRlZCBpbi4KLS0tPgotPCFFTlRJVFkgJSBTY29wZSAiKHJlcXVlc3R8c2Vzc2lvbnxhcHBsaWNhdGlvbikiPgotCi0KLQotPCEtLQotICAgIEEgIlNjb3BlT3JOb25lIiBlbGVtZW50IGRlZmluZXMgdGhlIGxlZ2FsIHZhbHVlcyBmb3IgdGhlCi0gICAgPG1hbmFnZWQtYmVhbi1zY29wZT4gZWxlbWVudCdzIGJvZHkgY29udGVudCwgd2hpY2ggaW5jbHVkZXMKLSAgICBhbGwgb2YgdGhlIHNjb3BlcyByZXNwcmVzZW50ZWQgYnkgdGhlICJTY29wZSIgdHlwZSwgcGx1cyB0aGUKLSAgICAibm9uZSIgdmFsdWUgaW5kaWNhdGluZyB0aGF0IGEgY3JlYXRlZCBiZWFuIHNob3VsZCBub3QgYmUKLSAgICBzdG9yZWQgaW50byBhbnkgc2NvcGUuCi0tLT4KLTwhRU5USVRZICUgU2NvcGVPck5vbmUgIihyZXF1ZXN0fHNlc3Npb258YXBwbGljYXRpb258bm9uZSkiPgotCi0KLTwhLS0KLSAgICBBICJWaWV3SWRQYXR0ZXJuIiBpcyBhIHBhdHRlcm4gZm9yIG1hdGNoaW5nIHZpZXcgaWRlbnRpZmllcnMgaW4KLSAgICBvcmRlciB0byBkZXRlcm1pbmUgd2hldGhlciBhIHBhcnRpY3VsYXIgbmF2aWdhdGlvbiBydWxlIHNob3VsZCBiZQotICAgIGZpcmVkLiAgSXQgbXVzdCBjb250YWluIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLQotICAgIC0gVGhlIGV4YWN0IG1hdGNoIGZvciBhIHZpZXcgaWRlbnRpZmllciB0aGF0IGlzIHJlY29nbml6ZWQKLSAgICAgIGJ5IHRoZSB0aGUgVmlld0hhbmRsZXIgaW1wbGVtZW50YXRpb24gYmVpbmcgdXNlZCAoc3VjaCBhcwotICAgICAgIi9pbmRleC5qc3AiIGlmIHlvdSBhcmUgdXNpbmcgdGhlIGRlZmF1bHQgVmlld0hhbmRsZXIpLgotCi0gICAgLSBBIHByb3BlciBwcmVmaXggb2YgYSB2aWV3IGlkZW50aWZpZXIsIHBsdXMgYSB0cmFpbGluZyAiKiIKLSAgICAgIGNoYXJhY3Rlci4gIFRoaXMgcGF0dGVybiBpbmRpY2F0ZXMgdGhhdCBhbGwgdmlldyBpZGVudGlmaWVycyB0aGF0Ci0gICAgICBtYXRjaCB0aGUgcG9ydGlvbiBvZiB0aGUgcGF0dGVybiB1cCB0byB0aGUgYXN0ZXJpc2sgd2lsbCBtYXRjaCB0aGUKLSAgICAgIHN1cnJvdW5kaW5nIHJ1bGUuICBXaGVuIG1vcmUgdGhhbiBvbmUgbWF0Y2ggZXhpc3RzLCB0aGUgbWF0Y2ggd2l0aAotICAgICAgdGhlIGxvbmdlc3QgcGF0dGVybiBpcyBzZWxlY3RlZC4KLQotICAgIC0gQW4gIioiIGNoYXJhY3Rlciwgd2hpY2ggbWVhbnMgdGhhdCB0aGlzIHBhdHRlcm4gYXBwbGllcyB0byBhbGwKLSAgICAgIHZpZXcgaWRlbnRpZmllcnMuCi0tLT4KLTwhRU5USVRZICUgVmlld0lkUGF0dGVybiAiQ0RBVEEiPgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT0gVG9wIExldmVsIEVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi08IS0tCi0gICAgVGhlICJmYWNlcy1jb25maWciIGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLSAgICBoaWVyYXJjaHksIGFuZCBjb250YWlucyBuZXN0ZWQgZWxlbWVudHMgZm9yIGFsbCBvZiB0aGUgb3RoZXIgY29uZmlndXJhdGlvbgotICAgIHNldHRpbmdzLgotLS0+Ci08IUVMRU1FTlQgZmFjZXMtY29uZmlnICAgICgoYXBwbGljYXRpb258ZmFjdG9yeXxjb21wb25lbnR8Y29udmVydGVyfG1hbmFnZWQtYmVhbnxuYXZpZ2F0aW9uLXJ1bGV8cmVmZXJlbmNlZC1iZWFufHJlbmRlci1raXR8bGlmZWN5Y2xlfHZhbGlkYXRvcikqKT4KLTwhQVRUTElTVCBmYWNlcy1jb25maWcKLSAgICAgICB4bWxucyBDREFUQSAjRklYRUQgImh0dHA6Ly9qYXZhLnN1bi5jb20vSlNGL0NvbmZpZ3VyYXRpb24iPgotCi0KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PSBEZWZpbml0aW9uIEVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0KLTwhLS0KLSAgICBUaGUgImFwcGxpY2F0aW9uIiBlbGVtZW50IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIGRlZmluZSB0aGUgdmFyaW91cwotICAgIHBlci1hcHBsaWNhdGlvbi1zaW5nbGV0b24gaW1wbGVtZW50YXRpb24gYXJ0aWZhY3RzIGZvciBhIHBhcnRpY3VsYXIgd2ViCi0gICAgYXBwbGljYXRpb24gdGhhdCBpcyB1dGlsaXppbmcgSmF2YVNlcnZlciBGYWNlcy4gIEZvciBuZXN0ZWQgZWxlbWVudHMKLSAgICB0aGF0IGFyZSBub3Qgc3BlY2lmaWVkLCB0aGUgSlNGIGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBhIHN1aXRhYmxlCi0gICAgZGVmYXVsdC4KLS0tPgotPCFFTEVNRU5UIGFwcGxpY2F0aW9uICAgICAoKGFjdGlvbi1saXN0ZW5lcnxkZWZhdWx0LXJlbmRlci1raXQtaWR8bWVzc2FnZS1idW5kbGV8bmF2aWdhdGlvbi1oYW5kbGVyfHZpZXctaGFuZGxlcnxzdGF0ZS1tYW5hZ2VyfHByb3BlcnR5LXJlc29sdmVyfHZhcmlhYmxlLXJlc29sdmVyfGxvY2FsZS1jb25maWcpKik+Ci0KLQotPCEtLQotICAgIFRoZSAiZmFjdG9yeSIgZWxlbWVudCBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byBkZWZpbmUgdGhlIHZhcmlvdXMKLSAgICBGYWN0b3JpZXMgdGhhdCBjb21wcmlzZSBwYXJ0cyBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgSmF2YVNlcnZlcgotICAgIEZhY2VzLiAgRm9yIG5lc3RlZCBlbGVtZW50cyB0aGF0IGFyZSBub3Qgc3BlY2lmaWVkLCB0aGUgSlNGCi0gICAgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGEgc3VpdGFibGUgZGVmYXVsdC4KLS0tPgotPCFFTEVNRU5UIGZhY3RvcnkgICAgICgoYXBwbGljYXRpb24tZmFjdG9yeXxmYWNlcy1jb250ZXh0LWZhY3Rvcnl8bGlmZWN5Y2xlLWZhY3Rvcnl8cmVuZGVyLWtpdC1mYWN0b3J5KSopPgotCi0KLTwhLS0KLSAgICBUaGUgImF0dHJpYnV0ZSIgZWxlbWVudCByZXByZXNlbnRzIGEgbmFtZWQsIHR5cGVkLCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGgKLSAgICB0aGUgcGFyZW50IFVJQ29tcG9uZW50IHZpYSB0aGUgZ2VuZXJpYyBhdHRyaWJ1dGVzIG1lY2hhbmlzbS4KLQotICAgIEF0dHJpYnV0ZSBuYW1lcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBwYXJlbnQgKG9yIHJlbGF0ZWQpCi0gICAgY29tcG9uZW50LgotLS0+Ci08IUVMRU1FTlQgYXR0cmlidXRlICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBhdHRyaWJ1dGUtbmFtZSwgYXR0cmlidXRlLWNsYXNzLCBkZWZhdWx0LXZhbHVlPywgc3VnZ2VzdGVkLXZhbHVlPywgYXR0cmlidXRlLWV4dGVuc2lvbiopPgotCi08IS0tIAotICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBhdHRyaWJ1dGUuICBNYXkgY29udGFpbiBpbXBsZW1lbnRhdGlvbgotICAgIHNwZWNpZmljIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBhdHRyaWJ1dGUtZXh0ZW5zaW9uIEFOWT4KLQotCi08IS0tCi0gICAgVGhlICJjb21wb25lbnQiIGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIFVJQ29tcG9uZW50IGltcGxlbWVudGF0aW9uCi0gICAgY2xhc3MgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc3BlY2lmaWVkIHR5cGUgaWRlbnRpZmllciwKLSAgICBhbG9uZyB3aXRoIGl0cyBhc3NvY2lhdGVkIHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXMuICBDb21wb25lbnQgdHlwZXMgbXVzdAotICAgIGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBhdHRyaWJ1dGVzIHRoYXQgYXJlIHJlY29nbml6ZWQKLSAgICBieSB0aGUgaW1wbGVtZW50YXRpb24gbG9naWMgb2YgdGhpcyBjb21wb25lbnQuICBOZXN0ZWQgInByb3BlcnR5IiBlbGVtZW50cwotICAgIGlkZW50aWZ5IEphdmFCZWFucyBwcm9wZXJ0aWVzIG9mIHRoZSBjb21wb25lbnQgY2xhc3MgdGhhdCBtYXkgYmUgZXhwb3NlZAotICAgIGZvciBtYW5pcHVsYXRpb24gdmlhIHRvb2xzLgotLS0+Ci08IUVMRU1FTlQgY29tcG9uZW50ICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBjb21wb25lbnQtdHlwZSwgY29tcG9uZW50LWNsYXNzLCBhdHRyaWJ1dGUqLCBwcm9wZXJ0eSosIGNvbXBvbmVudC1leHRlbnNpb24qKT4KLQotPCEtLSAKLSAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgY29tcG9uZW50LiAgTWF5IGNvbnRhaW4gaW1wbGVtZW50YXRpb24KLSAgICBzcGVjaWZpYyBjb250ZW50LgotLS0+Ci08IUVMRU1FTlQgY29tcG9uZW50LWV4dGVuc2lvbiBBTlk+Ci0KLQotCi08IS0tCi0gICAgVGhlICJjb252ZXJ0ZXIiIGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIENvbnZlcnRlciBpbXBsZW1lbnRhdGlvbgotICAgIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIHNwZWNpZmllZCBjb252ZXJ0ZXIgaWRlbnRpZmllci4KLSAgICBDb252ZXJ0ZXIgaWRlbnRpZmllcnMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlbnRpcmUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgTmVzdGVkICJhdHRyaWJ1dGUiIGVsZW1lbnRzIGlkZW50aWZ5IGdlbmVyaWMgYXR0cmlidXRlcyB0aGF0IG1heSBiZQotICAgIGNvbmZpZ3VyZWQgb24gdGhlIGNvcnJlc3BvbmRpbmcgVUlDb21wb25lbnQgaW4gb3JkZXIgdG8gYWZmZWN0IHRoZQotICAgIG9wZXJhdGlvbiBvZiB0aGUgQ29udmVydGVyLiAgTmVzdGVkICJwcm9wZXJ0eSIgZWxlbWVudHMgaWRlbnRpZnkgSmF2YUJlYW5zCi0gICAgcHJvcGVydGllcyBvZiB0aGUgQ29udmVydGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgbWF5IGJlIGNvbmZpZ3VyZWQKLSAgICB0byBhZmZlY3QgdGhlIG9wZXJhdGlvbiBvZiB0aGUgQ29udmVydGVyLgotLS0+Ci08IUVMRU1FTlQgY29udmVydGVyICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCAoY29udmVydGVyLWlkIHwgY29udmVydGVyLWZvci1jbGFzcyksIGNvbnZlcnRlci1jbGFzcywgYXR0cmlidXRlKiwgcHJvcGVydHkqKT4KLQotCi08IS0tCi0gICAgVGhlICJpY29uIiBlbGVtZW50IGNvbnRhaW5zICJzbWFsbC1pY29uIiBhbmQgImxhcmdlLWljb24iIGVsZW1lbnRzIHRoYXQKLSAgICBzcGVjaWZ5IHRoZSByZXNvcnVjZSBwYXRocyBmb3Igc21hbGwgYW5kIGxhcmdlIEdJRiBvciBKUEcgaWNvbiBpbWFnZXMKLSAgICB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gYSBHVUkgdG9vbC4KLS0tPgotPCFFTEVNRU5UIGljb24gICAgICAgICAgICAoc21hbGwtaWNvbj8sIGxhcmdlLWljb24/KT4KLTwhQVRUTElTVCBpY29uICAgICAgICAgICAgeG1sOmxhbmcgICAgICAgICVMYW5ndWFnZTsgICAgICAjSU1QTElFRD4KLQotPCEtLQotICAgIFRoZSAibGlmZWN5Y2xlIiBlbGVtZW50IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIHNwZWNpZnkKLSAgICBtb2RpZmljYXRpb25zIHRvIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGRlZmF1bHQgTGlmZWN5Y2xlCi0gICAgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotLS0+Ci08IUVMRU1FTlQgbGlmZWN5Y2xlICAgICAgIChwaGFzZS1saXN0ZW5lciopPgotCi08IS0tCi0gICAgIFRoZSAibG9jYWxlLWNvbmZpZyIgZWxlbWVudCBhbGxvd3MgdGhlIGFwcCBkZXZlbG9wZXIgdG8gZGVjbGFyZSB0aGUKLSAgICAgc3VwcG9ydGVkIGxvY2FsZXMgZm9yIHRoaXMgYXBwbGljYXRpb24uICAKLS0tPgotPCFFTEVNRU5UIGxvY2FsZS1jb25maWcgKGRlZmF1bHQtbG9jYWxlPywgc3VwcG9ydGVkLWxvY2FsZSopPgotCi08IS0tCi0gICAgVGhlICJtYW5hZ2VkLWJlYW4iIGVsZW1lbnQgcmVwcmVzZW50cyBhIEphdmFCZWFuLCBvZiBhIHBhcnRpY3VsYXIgY2xhc3MsCi0gICAgdGhhdCB3aWxsIGJlIGR5bmFtaWNhbGx5IGluc3RhbnRpYXRlZCBhdCBydW50aW1lIChieSB0aGUgZGVmYXVsdAotICAgIFZhcmlhYmxlUmVzb2x2ZXIgaW1wbGVtZW50YXRpb24pIGlmIGl0IGlzIHJlZmVyZW5jZWQgYXMgdGhlIGZpcnN0IGVsZW1lbnQKLSAgICBvZiBhIHZhbHVlIGJpbmRpbmcgZXhwcmVzc2lvbiwgYW5kIG5vIGNvcnJlc3BvbmRpbmcgYmVhbiBjYW4gYmUKLSAgICBpZGVudGlmaWVkIGluIGFueSBzY29wZS4gIEluIGFkZGl0aW9uIHRvIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWFuYWdlZCBiZWFuLAotICAgIGFuZCB0aGUgb3B0aW9uYWwgc3RvcmluZyBvZiBpdCBpbnRvIHRoZSBzcGVjaWZpZWQgc2NvcGUsIHRoZSBuZXN0ZWQKLSAgICBtYW5hZ2VkLXByb3BlcnR5IGVsZW1lbnRzIGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGNvbnRlbnRzIG9mCi0gICAgc2V0dGFibGUgSmF2YUJlYW5zIHByb3BlcnRpZXMgb2YgdGhlIGNyZWF0ZWQgaW5zdGFuY2UuCi0tLT4KLTwhRUxFTUVOVCBtYW5hZ2VkLWJlYW4gKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIG1hbmFnZWQtYmVhbi1uYW1lLCBtYW5hZ2VkLWJlYW4tY2xhc3MsIG1hbmFnZWQtYmVhbi1zY29wZSwgKG1hbmFnZWQtcHJvcGVydHkqIHwgbWFwLWVudHJpZXMgfCBsaXN0LWVudHJpZXMpKT4KLQotCi08IS0tCi0gICAgVGhlICJtYW5hZ2VkLXByb3BlcnR5IiBlbGVtZW50IHJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCBwcm9wZXJ0eSBvZiBhCi0gICAgbWFuYWdlZCBiZWFuIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgKG9yIHZhbHVlIHNldCkKLSAgICBpZiB0aGUgY29ycmVzcG9uZGluZyBtYW5hZ2VkIGJlYW4gaXMgYXV0b21hdGljYWxseSBjcmVhdGVkLgotLS0+Ci08IUVMRU1FTlQgbWFuYWdlZC1wcm9wZXJ0eSAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgcHJvcGVydHktbmFtZSwgcHJvcGVydHktY2xhc3M/LCAobWFwLWVudHJpZXN8bnVsbC12YWx1ZXx2YWx1ZXxsaXN0LWVudHJpZXMpKT4KLQotCi08IS0tCi0gICAgVGhlICJtYXAtZW50cnkiIGVsZW1lbnQgcmVwcnNlbnRzIGEgc2luZ2xlIGtleS1lbnRyeSBwYWlyIHRoYXQKLSAgICB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb21wdXRlZCB2YWx1ZSBvZiBhIG1hbmFnZWQgcHJvcGVydHkgb2YgdHlwZQotICAgIGphdmEudXRpbC5NYXAuCi0tLT4KLTwhRUxFTUVOVCBtYXAtZW50cnkgKGtleSwgKG51bGwtdmFsdWV8dmFsdWUpKT4KLQotCi08IS0tCi0gICAgVGhlICJtYXAtZW50cmllcycgZWxlbWVudCByZXByZXNlbnRzIGEgc2V0IG9mIGtleS1lbnRyeSBwYWlycyB0aGF0Ci0gICAgd2lsbCBiZSBhZGRlZCB0byB0aGUgY29tcHV0ZWQgdmFsdWUgb2YgYSBtYW5hZ2VkIHByb3BlcnR5IG9mIHR5cGUKLSAgICBqYXZhLnV0aWwuTWFwLiAgSW4gYWRkaXRpb24sIHRoZSBKYXZhIGNsYXNzIHR5cGVzIG9mIHRoZSBrZXkgYW5kIGVudHJ5Ci0gICAgdmFsdWVzIG1heSBiZSBvcHRpb25hbGx5IGRlY2xhcmVkLgotLS0+Ci08IUVMRU1FTlQgbWFwLWVudHJpZXMgKGtleS1jbGFzcz8sIHZhbHVlLWNsYXNzPywgbWFwLWVudHJ5Kik+Ci0KLQotPCEtLQotICAgIFRoZSBiYXNlIG5hbWUgb2YgYSByZXNvdXJjZSBidW5kbGUgcmVwcmVzZW50aW5nIHRoZSBtZXNzYWdlIHJlc291cmNlcwotICAgIGZvciB0aGlzIGFwcGxpY2F0aW9uLiAgU2VlIHRoZSBKYXZhRG9jcyBmb3IgdGhlICJqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUiCi0gICAgY2xhc3MgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHN5bnRheCBvZiByZXNvdXJjZSBidW5kbGUgbmFtZXMuCi0tLT4KLQotPCFFTEVNRU5UIG1lc3NhZ2UtYnVuZGxlICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJuYXZpZ2F0aW9uLWNhc2UiIGVsZW1lbnQgZGVzY3JpYmVzIGEgcGFydGljdWxhciBjb21iaW5hdGlvbiBvZgotICAgIGNvbmRpdGlvbnMgdGhhdCBtdXN0IG1hdGNoIGZvciB0aGlzIGNhc2UgdG8gYmUgZXhlY3V0ZWQsIGFuZCB0aGUKLSAgICB2aWV3IGlkIG9mIHRoZSBjb21wb25lbnQgdHJlZSB0aGF0IHNob3VsZCBiZSBzZWxlY3RlZCBuZXh0LgotLS0+Ci08IUVMRU1FTlQgbmF2aWdhdGlvbi1jYXNlIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBmcm9tLWFjdGlvbj8sIGZyb20tb3V0Y29tZT8sIHRvLXZpZXctaWQsIHJlZGlyZWN0Pyk+Ci0KLQotPCEtLQotICAgIFRoZSAibmF2aWdhdGlvbi1ydWxlIiBlbGVtZW50IHJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCBkZWNpc2lvbiBydWxlCi0gICAgdGhhdCB3aWxsIGJlIHV0aWxpemVkIGJ5IHRoZSBkZWZhdWx0IE5hdmlnYXRpb25IYW5kbGVyCi0gICAgaW1wbGVtZW50YXRpb24gdG8gbWFrZSBkZWNpc2lvbnMgb24gd2hhdCB2aWV3IHNob3VsZCBiZSBkaXNwbGF5ZWQKLSAgICBuZXh0LCBiYXNlZCBvbiB0aGUgdmlldyBpZCBiZWluZyBwcm9jZXNzZWQuCi0tLT4KLTwhRUxFTUVOVCBuYXZpZ2F0aW9uLXJ1bGUgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIGZyb20tdmlldy1pZD8sIG5hdmlnYXRpb24tY2FzZSopPgotCi0KLTwhLS0KLSAgICBUaGUgInByb3BlcnR5IiBlbGVtZW50IHJlcHJlc2VudHMgYSBKYXZhQmVhbiBwcm9wZXJ0eSBvZiB0aGUgSmF2YSBjbGFzcwotICAgIHJlcHJlc2VudGVkIGJ5IG91ciBwYXJlbnQgZWxlbWVudC4KLQotICAgIFByb3BlcnR5IG5hbWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIEphdmEgY2xhc3MKLSAgICB0aGF0IGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgZWxlbWVudCwgYW5kIG11c3QgY29ycmVzcG9uZCB0bwotICAgIHByb3BlcnR5IG5hbWVzIHRoYXQgd2lsbCBiZSByZWNvZ25pemVkIHdoZW4gcGVyZm9ybWluZyBpbnRyb3NwZWN0aW9uCi0gICAgYWdhaW5zdCB0aGF0IGNsYXNzIHZpYSBqYXZhLmJlYW5zLkludHJvc3BlY3Rvci4KLS0tPgotPCFFTEVNRU5UIHByb3BlcnR5ICAgICAgICAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgcHJvcGVydHktbmFtZSwgcHJvcGVydHktY2xhc3MsIGRlZmF1bHQtdmFsdWU/LCBzdWdnZXN0ZWQtdmFsdWU/LCBwcm9wZXJ0eS1leHRlbnNpb24qKT4KLQotPCEtLSAKLSAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgcHJvcGVydHkuICBNYXkgY29udGFpbiBpbXBsZW1lbnRhdGlvbgotICAgIHNwZWNpZmljIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBwcm9wZXJ0eS1leHRlbnNpb24gQU5ZPgotCi08IS0tCi0gICAgVGhlICJyZWZlcmVuY2VkLWJlYW4iIGVsZW1lbnQgcmVwcmVzZW50cyBhdCBkZXNpZ24gdGltZSB0aGUgcHJvbWlzZQotICAgIHRoYXQgYSBKYXZhIG9iamVjdCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgd2lsbCBleGlzdCBhdCBydW50aW1lIGluIHNvbWUKLSAgICBzY29wZSwgdW5kZXIgdGhlIHNwZWNpZmllZCBrZXkuICBUaGlzIGNhbiBiZSB1c2VkIGJ5IGRlc2lnbiB0aW1lIHRvb2xzCi0gICAgdG8gY29uc3RydWN0IHVzZXIgaW50ZXJmYWNlIGRpYWxvZ3MgYmFzZWQgb24gdGhlIHByb3BlcnRpZXMgb2YgdGhlCi0gICAgc3BlY2lmaWVkIGNsYXNzLiAgVGhlIHByZXNlbmNlIG9yIGFic2VuY2Ugb2YgYSByZWZlcmVuY2VkIGJlYW4KLSAgICBlbGVtZW50IGhhcyBubyBpbXBhY3Qgb24gdGhlIEphdmFTZXJ2ZXIgRmFjZXMgcnVudGltZSBlbnZpcm9ubWVudAotICAgIGluc2lkZSBhIHdlYiBhcHBsaWNhdGlvbi4KLS0tPgotPCFFTEVNRU5UIHJlZmVyZW5jZWQtYmVhbiAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgcmVmZXJlbmNlZC1iZWFuLW5hbWUsIHJlZmVyZW5jZWQtYmVhbi1jbGFzcyk+Ci0KLQotPCEtLQotICAgIFRoZSAicmVuZGVyLWtpdCIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgUmVuZGVyS2l0IGltcGxlbWVudGF0aW9uCi0gICAgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc3BlY2lmaWVkIHJlbmRlci1raXQtaWQuICBJZiBubwotICAgIHJlbmRlci1raXQtaWQgaXMgc3BlY2lmaWVkLCB0aGUgaWRlbnRpZmllciBvZiB0aGUgZGVmYXVsdCBSZW5kZXJLaXQKLSAgICAoUmVuZGVyS2l0RmFjdG9yeS5ERUZBVUxUX1JFTkRFUl9LSVQpIGlzIGFzc3VtZWQuCi0tLT4KLTwhRUxFTUVOVCByZW5kZXIta2l0ICAgICAgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIHJlbmRlci1raXQtaWQ/LCByZW5kZXIta2l0LWNsYXNzPywgcmVuZGVyZXIqKT4KLQotCi08IS0tCi0gICAgVGhlICJyZW5kZXJlciIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgUmVuZGVyZXIgaW1wbGVtZW50YXRpb24KLSAgICBjbGFzcyB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50IGZhbWlseQotICAgIGFuZCByZW5kZXJlciB0eXBlIGlkZW50aWZpZXJzLCBpbiB0aGUgUmVuZGVyS2l0IGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAgICBwYXJlbnQgInJlbmRlci1raXQiIGVsZW1lbnQuICBDb21iaW5hdGlvbnMgb2YgY29tcG9uZW50IGZhbWlseSBhbmQgcmVuZGVyZXIKLSAgICB0eXBlIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgUmVuZGVyS2l0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFyZW50Ci0gICAgInJlbmRlci1raXQiIGVsZW1lbnQuCi0KLSAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBjb21wb25lbnQgYXR0cmlidXRlcyB0aGF0Ci0gICAgYXJlIHJlY29nbml6ZWQgYnkgdGhpcyByZW5kZXJlci4KLS0tPgotPCFFTEVNRU5UIHJlbmRlcmVyICAgICAgICAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgY29tcG9uZW50LWZhbWlseSwgcmVuZGVyZXItdHlwZSwgcmVuZGVyZXItY2xhc3MsIGF0dHJpYnV0ZSosIHJlbmRlcmVyLWV4dGVuc2lvbiopPgotCi08IS0tIAotICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciByZW5kZXJlci4gIE1heSBjb250YWluIGltcGxlbWVudGF0aW9uCi0gICAgc3BlY2lmaWMgY29udGVudC4KLS0tPgotPCFFTEVNRU5UIHJlbmRlcmVyLWV4dGVuc2lvbiBBTlk+Ci0KLTwhLS0KLSAgICBUaGUgInZhbGlkYXRvciIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgVmFsaWRhdG9yIGltcGxlbWVudGF0aW9uCi0gICAgY2xhc3MgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc3BlY2lmaWVkIHZhbGlkYXRvciBpZGVudGlmaWVyLgotICAgIFZhbGlkYXRvciBpZGVudGlmaWVycyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBhdHRyaWJ1dGVzIHRoYXQgbWF5IGJlCi0gICAgY29uZmlndXJlZCBvbiB0aGUgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBpbiBvcmRlciB0byBhZmZlY3QgdGhlCi0gICAgb3BlcmF0aW9uIG9mIHRoZSBWYWxpZGF0b3IuICBOZXN0ZWQgInByb3BlcnR5IiBlbGVtZW50cyBpZGVudGlmeSBKYXZhQmVhbnMKLSAgICBwcm9wZXJ0aWVzIG9mIHRoZSBWYWxpZGF0b3IgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCBtYXkgYmUgY29uZmlndXJlZAotICAgIHRvIGFmZmVjdCB0aGUgb3BlcmF0aW9uIG9mIHRoZSBWYWxpZGF0b3IuCi0tLT4KLTwhRUxFTUVOVCB2YWxpZGF0b3IgICAgICAgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIHZhbGlkYXRvci1pZCwgdmFsaWRhdG9yLWNsYXNzLCBhdHRyaWJ1dGUqLCBwcm9wZXJ0eSopPgotCi0KLTwhLS0KLSAgICBUaGUgImxpc3QtZW50cmllcyIgZWxlbWVudCByZXByZXNlbnRzIGEgc2V0IG9mIGluaXRpYWxpemF0aW9uCi0gICAgZWxlbWVudHMgZm9yIGEgbWFuYWdlZCBwcm9wZXJ0eSB0aGF0IGlzIGEgamF2YS51dGlsLkxpc3Qgb3IgYW4KLSAgICBhcnJheS4gIEluIHRoZSBmb3JtZXIgY2FzZSwgdGhlICJ2YWx1ZS1jbGFzcyIgZWxlbWVudCBjYW4gb3B0aW9uYWxseQotICAgIGJlIHVzZWQgdG8gZGVjbGFyZSB0aGUgSmF2YSB0eXBlIHRvIHdoaWNoIGVhY2ggdmFsdWUgc2hvdWxkIGJlCi0gICAgY29udmVydGVkIGJlZm9yZSBhZGRpbmcgaXQgdG8gdGhlIENvbGxlY3Rpb24uCi0tLT4KLTwhRUxFTUVOVCBsaXN0LWVudHJpZXMgICAgKHZhbHVlLWNsYXNzPywgKG51bGwtdmFsdWV8dmFsdWUpKik+Ci0KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PSBTdWJvcmRpbmF0ZSBFbGVtZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0KLTwhLS0KLSAgICBUaGUgImFjdGlvbi1saXN0ZW5lciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiB0aGUgY29uY3JldGUgQWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZAotICAgIGR1cmluZyB0aGUgSW52b2tlIEFwcGxpY2F0aW9uIHBoYXNlIG9mIHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgbGlmZWN5Y2xlLgotICAgIEl0IG11c3QgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIGFjdGlvbi1saXN0ZW5lciAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImFwcGxpY2F0aW9uLWZhY3RvcnkiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotICAgIG5hbWUgb2YgdGhlIGNvbmNyZXRlIEFwcGxpY2F0aW9uRmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0Ci0gICAgd2lsbCBiZSBjYWxsZWQgd2hlbiBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoQVBQTElDQVRJT05fRkFDVE9SWSkgaXMKLSAgICBjYWxsZWQuIEl0IG11c3QgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIGFwcGxpY2F0aW9uLWZhY3RvcnkgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJhdHRyaWJ1dGUtY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgSmF2YSB0eXBlIG9mIHRoZSB2YWx1ZQotICAgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGF0dHJpYnV0ZSBuYW1lLiAgSXQgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgYXR0cmlidXRlLWNsYXNzICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJhdHRyaWJ1dGUtbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBuYW1lIHVuZGVyIHdoaWNoIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgdmFsdWUgd2lsbCBiZSBzdG9yZWQsIGluIHRoZSBnZW5lcmljIGF0dHJpYnV0ZXMgb2YgdGhlCi0gICAgVUlDb21wb25lbnQgd2UgYXJlIHJlbGF0ZWQgdG8uCi0tLT4KLTwhRUxFTUVOVCBhdHRyaWJ1dGUtbmFtZSAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImNvbXBvbmVudC1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIGEgY29uY3JldGUgVUlDb21wb25lbnQgaW1wbGVtZW50YXRpb24gY2xhc3MuICBJdCBtdXN0IGJlIG9mCi0gICAgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIGNvbXBvbmVudC1jbGFzcyAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAiY29tcG9uZW50LWZhbWlseSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBjb21wb25lbnQgZmFtaWx5IGZvcgotICAgIHdoaWNoIHRoZSBSZW5kZXJlciByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50ICJyZW5kZXJlciIgZWxlbWVudCB3aWxsIGJlCi0gICAgdXNlZC4KLS0tPgotPCFFTEVNRU5UIGNvbXBvbmVudC1mYW1pbHkgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJjb21wb25lbnQtdHlwZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBuYW1lIHVuZGVyIHdoaWNoIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgVUlDb21wb25lbnQgY2xhc3Mgc2hvdWxkIGJlIHJlZ2lzdGVyZWQuCi0tLT4KLTwhRUxFTUVOVCBjb21wb25lbnQtdHlwZSAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImNvbnZlcnRlci1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIGEgY29uY3JldGUgQ29udmVydGVyIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgSXQgbXVzdCBiZSBvZgotICAgIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBjb252ZXJ0ZXItY2xhc3MgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImNvbnZlcnRlci1mb3ItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBmb3Igd2hpY2ggYSBDb252ZXJ0ZXIgY2xhc3Mgd2lsbCBiZSByZWdpc3RlcmVkLiAgSXQgbXVzdCBiZSBvZgotICAgIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBjb252ZXJ0ZXItZm9yLWNsYXNzICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJjb252ZXJ0ZXItaWQiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgaWRlbnRpZmllciB1bmRlciB3aGljaCB0aGUKLSAgICBjb3JyZXNwb25kaW5nIENvbnZlcnRlciBjbGFzcyBzaG91bGQgYmUgcmVnaXN0ZXJlZC4KLS0tPgotPCFFTEVNRU5UIGNvbnZlcnRlci1pZCAgICAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImRlZmF1bHQtcmVuZGVyLWtpdC1pZCIgZWxlbWVudCBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIGRlZmluZQotICAgIGEgcmVuZGVya2l0IHRvIGJlIHVzZWQgb3RoZXIgdGhhbiB0aGUgc3RhbmRhcmQgb25lLiAKLS0tPgotPCFFTEVNRU5UIGRlZmF1bHQtcmVuZGVyLWtpdC1pZCAgICgjUENEQVRBKT4KLQotPCEtLQotICAgICBUaGUgImRlZmF1bHQtbG9jYWxlIiBlbGVtZW50IGRlY2xhcmVzIHRoZSBkZWZhdWx0IGxvY2FsZSBmb3IgdGhpcwotICAgICBhcHBsaWNhdGlvbiBpbnN0YW5jZS4gIEl0IG11c3QgYmUgc3BlY2lmaWVkIGFzCi0gICAgIDpsYW5ndWFnZTpbXzpjb3VudHJ5OltfOnZhcmlhbnQ6XV0gd2l0aG91dCB0aGUgY29sb25zLCBmb3IgZXhhbXBsZQotICAgICAiamFfSlBfU0pJUyIuICBUaGUgc2VwYXJhdG9ycyBiZXR3ZWVuIHRoZSBzZWdtZW50cyBtYXkgYmUgJy0nIG9yCi0gICAgICdfJy4KLS0tPgotPCFFTEVNRU5UIGRlZmF1bHQtbG9jYWxlICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAiZGVmYXVsdC12YWx1ZSIgY29udGFpbnMgdGhlIHZhbHVlIGZvciB0aGUgcHJvcGVydHkgb3IgYXR0cmlidXRlCi0gICAgaW4gd2hpY2ggdGhpcyBlbGVtZW50IHJlc2lkZXMuICBUaGlzIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUKLSAgICAic3VnZ2VzdGVkLXZhbHVlIiBpbiB0aGF0IHRoZSBwcm9wZXJ0eSBvciBhdHRyaWJ1dGUgbXVzdCB0YWtlIHRoZQotICAgIHZhbHVlLCB3aGVyZWFzIGluICJzdWdnZXN0ZWQtdmFsdWUiIHRha2luZyB0aGUgdmFsdWUgaXMgb3B0aW9uYWwuCi0tLT4KLTwhRUxFTUVOVCBkZWZhdWx0LXZhbHVlICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAiZGVzY3JpcHRpb24iIGVsZW1lbnQgY29udGFpbnMgYSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBlbGVtZW50Ci0gICAgaXQgaXMgbmVzdGVkIGluLCBvcHRpb25hbGx5IGZsYWdnZWQgd2l0aCBhIGxhbmd1YWdlIGNvZGUgdXNpbmcgdGhlCi0gICAgInhtbDpsYW5nIiBhdHRyaWJ1dGUuCi0tLT4KLTwhRUxFTUVOVCBkZXNjcmlwdGlvbiAgICAgQU5ZPgotPCFBVFRMSVNUIGRlc2NyaXB0aW9uICAgICB4bWw6bGFuZyAgICAgICAgJUxhbmd1YWdlOyAgICAgICNJTVBMSUVEPgotCi0KLTwhLS0KLSAgICBUaGUgImRpc3BsYXktbmFtZSIgZWxlbWVudCBpcyBhIHNob3J0IGRlc2NyaXB0aXZlIG5hbWUgZGVzY3JpYmluZyB0aGUKLSAgICBlbnRpdHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50IGl0IGlzIG5lc3RlZCBpbiwgaW50ZW5kZWQgdG8gYmUKLSAgICBkaXNwbGF5ZWQgYnkgdG9vbHMsIGFuZCBvcHRpb25hbGx5IGZsYWdnZWQgd2l0aCBhIGxhbmd1YWdlIGNvZGUgdXNpbmcKLSAgICB0aGUgInhtbDpsYW5nIiBhdHRyaWJ1dGUuCi0tLT4KLTwhRUxFTUVOVCBkaXNwbGF5LW5hbWUgICAgKCNQQ0RBVEEpPgotPCFBVFRMSVNUIGRpc3BsYXktbmFtZSAgICB4bWw6bGFuZyAgICAgICAgJUxhbmd1YWdlOyAgICAgICNJTVBMSUVEPgotCi08IS0tCi0gICAgVGhlICJmYWNlcy1jb250ZXh0LWZhY3RvcnkiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZAotICAgIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlIEZhY2VzQ29udGV4dEZhY3RvcnkgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4KLSAgICBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoRkFDRVNfQ09OVEVYVF9GQUNUT1JZKSBpcyBjYWxsZWQuIEl0IG11c3QKLSAgICBiZSBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgZmFjZXMtY29udGV4dC1mYWN0b3J5ICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAiZnJvbS1hY3Rpb24iIGVsZW1lbnQgY29udGFpbnMgYW4gYWN0aW9uIHJlZmVyZW5jZSBleHByZXNzaW9uCi0gICAgdGhhdCBtdXN0IGhhdmUgYmVlbiBleGVjdXRlZCAoYnkgdGhlIGRlZmF1bHQgQWN0aW9uTGlzdGVuZXIgZm9yIGhhbmRsaW5nCi0gICAgYXBwbGljYXRpb24gbGV2ZWwgZXZlbnRzKSBpbiBvcmRlciB0byBzZWxlY3QgdGhpcyBuYXZpZ2F0aW9uIHJ1bGUuICBJZgotICAgIG5vdCBzcGVjaWZpZWQsIHRoaXMgcnVsZSB3aWxsIGJlIHJlbGV2YW50IG5vIG1hdHRlciB3aGljaCBhY3Rpb24gcmVmZXJlbmNlCi0gICAgd2FzIGV4ZWN1dGVkIChvciBpZiBubyBhY3Rpb24gcmVmZXJlbmNlIHdhcyBleGVjdXRlZCkuCi0KLSAgICBUaGlzIHZhbHVlIG11c3QgYmUgb2YgdHlwZSAiQWN0aW9uIi4KLS0tPgotPCFFTEVNRU5UIGZyb20tYWN0aW9uICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJmcm9tLW91dGNvbWUiIGVsZW1lbnQgY29udGFpbnMgYSBsb2dpY2FsIG91dGNvbWUgc3RyaW5nIHJldHVybmVkCi0gICAgYnkgdGhlIGV4ZWN1dGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBhY3Rpb24gbWV0aG9kIHNlbGVjdGVkIHZpYSBhbgotICAgICJhY3Rpb25SZWYiIHByb3BlcnR5IChvciBhIGxpdGVyYWwgdmFsdWUgc3BlY2lmaWVkIGJ5IGFuICJhY3Rpb24iCi0gICAgcHJvcGVydHkpIG9mIGEgVUlDb21tYW5kIGNvbXBvbmVudC4gIElmIHNwZWNpZmllZCwgdGhpcyBydWxlIHdpbGwgYmUKLSAgICByZWxldmFudCBvbmx5IGlmIHRoZSBvdXRjb21lIHZhbHVlIG1hdGNoZXMgdGhpcyBlbGVtZW50J3MgdmFsdWUuICBJZgotICAgIG5vdCBzcGVjaWZpZWQsIHRoaXMgcnVsZSB3aWxsIGJlIHJlbGV2YW50IG5vIG1hdHRlciB3aGF0IHRoZSBvdXRjb21lCi0gICAgdmFsdWUgd2FzLgotLS0+Ci08IUVMRU1FTlQgZnJvbS1vdXRjb21lICAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJmcm9tLXZpZXctaWQiIGVsZW1lbnQgY29udGFpbnMgdGhlIHZpZXcgaWRlbnRpZmllciBvZiB0aGUgdmlldwotICAgIGZvciB3aGljaCB0aGUgY29udGFpbmluZyBuYXZpZ2F0aW9uIHJ1bGUgaXMgcmVsZXZhbnQuICBJZiBubwotICAgICJmcm9tLXZpZXciIGVsZW1lbnQgaXMgc3BlY2lmaWVkLCB0aGlzIHJ1bGUgYXBwbGllcyB0byBuYXZpZ2F0aW9uCi0gICAgZGVjaXNpb25zIG9uIGFsbCB2aWV3cy4gIElmIHRoaXMgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCBhIHZhbHVlCi0gICAgb2YgIioiIGlzIGFzc3VtZWQsIG1lYW5pbmcgdGhhdCB0aGlzIG5hdmlnYXRpb24gcnVsZSBhcHBsaWVzIHRvIGFsbAotICAgIHZpZXdzLgotCi0gICAgVGhpcyB2YWx1ZSBtdXN0IGJlIG9mIHR5cGUgIlZpZXdJZFBhdHRlcm4iLgotLS0+Ci08IUVMRU1FTlQgZnJvbS12aWV3LWlkICAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJrZXkiIGVsZW1lbnQgaXMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hcCBrZXkgdGhhdAotICAgIHdpbGwgYmUgc3RvcmVkIGluIGEgbWFuYWdlZCBwcm9wZXJ0eSBvZiB0eXBlIGphdmEudXRpbC5NYXAuICAKLS0tPgotPCFFTEVNRU5UIGtleSAgICAgICAgICAgICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAia2V5LWNsYXNzIiBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSB0byB3aGljaCBlYWNoICJrZXkiCi0gICAgZWxlbWVudCBpbiBhIHNldCBvZiAibWFwLWVudHJ5IiBlbGVtZW50cyB3aWxsIGJlIGNvbnZlcnRlZCB0by4gIEl0Ci0gICAgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLiAgSWYgb21pdHRlZCwgImphdmEubGFuZy5TdHJpbmciCi0gICAgaXMgYXNzdW1lZC4KLS0tPgotPCFFTEVNRU5UIGtleS1jbGFzcyAgICAgICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAibGFyZ2UtaWNvbiIgZWxlbWVudCBjb250YWlucyB0aGUgcmVzb3VyY2UgcGF0aCB0byBhIGxhcmdlICgzMngzMikKLSAgICBpY29uIGltYWdlLiAgVGhlIGltYWdlIG1heSBiZSBpbiBlaXRoZXIgR0lGIG9yIEpQRyBmb3JtYXQuCi0tLT4KLTwhRUxFTUVOVCBsYXJnZS1pY29uICAgICAgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJsaWZlY3ljbGUtZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiB0aGUgY29uY3JldGUgTGlmZWN5Y2xlRmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkCi0gICAgd2hlbiBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoTElGRUNZQ0xFX0ZBQ1RPUlkpIGlzIGNhbGxlZC4gSXQgbXVzdCBiZSAKLSAgICBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgbGlmZWN5Y2xlLWZhY3RvcnkgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJtYW5hZ2VkLWJlYW4tY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCi0gICAgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0IHdpbGwgYmUgdXNlZCB0byBpbnN0YW50aWF0ZSBhIG5ldyBpbnN0YW5jZQotICAgIGlmIGNyZWF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbWFuYWdlZCBiZWFuIGlzIHJlcXVlc3RlZC4gIEl0IG11c3QgYmUgb2YKLSAgICB0eXBlICJDbGFzc05hbWUiLgotCi0gICAgVGhlIHNwZWNpZmllZCBjbGFzcyBtdXN0IGNvbmZvcm0gdG8gc3RhbmRhcmQgSmF2YUJlYW5zIGNvbnZlbnRpb25zLgotICAgIEluIHBhcnRpY3VsYXIsIGl0IG11c3QgaGF2ZSBhIHB1YmxpYyB6ZXJvLWFyZ3VtZW50cyBjb25zdHJ1Y3RvciwgYW5kCi0gICAgemVybyBvciBtb3JlIHB1YmxpYyBwcm9wZXJ0eSBzZXR0ZXJzLgotLS0+Ci08IUVMRU1FTlQgbWFuYWdlZC1iZWFuLWNsYXNzICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAibWFuYWdlZC1iZWFuLW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgYXR0cmlidXRlIG5hbWUgdW5kZXIKLSAgICB3aGljaCBhIG1hbmFnZWQgYmVhbiB3aWxsIGJlIHNlYXJjaGVkIGZvciwgYXMgd2VsbCBhcyBzdG9yZWQgKHVubGVzcwotICAgIHRoZSAibWFuYWdlZC1iZWFuLXNjb3BlIiB2YWx1ZSBpcyAibm9uZSIpLiAgSXQgbXVzdCBiZSBvZiB0eXBlCi0gICAgIklkZW50aWZpZXIiLgotLS0+Ci08IUVMRU1FTlQgbWFuYWdlZC1iZWFuLW5hbWUgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgIm1hbmFnZWQtYmVhbi1zY29wZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBzY29wZSBpbnRvIHdoaWNoIGEgbmV3bHkKLSAgICBjcmVhdGVkIGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgbWFuYWdlZCBiZWFuIHdpbGwgYmUgc3RvcmVkICh1bmxlc3MKLSAgICB0aGUgdmFsdWUgaXMgIm5vbmUiKS4gIEl0IG11c3QgYmUgb2YgdHlwZSAiU2NvcGVPck5vbmUiLgotLS0+Ci08IUVMRU1FTlQgbWFuYWdlZC1iZWFuLXNjb3BlICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAibmF2aWdhdGlvbi1oYW5kbGVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBOYXZpZ2F0aW9uSGFuZGxlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkCi0gICAgZHVyaW5nIHRoZSBJbnZva2UgQXBwbGljYXRpb24gcGhhc2Ugb2YgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBsaWZlY3ljbGUsCi0gICAgaWYgdGhlIGRlZmF1bHQgQWN0aW9uTGlzdGVuZXIgKHByb3ZpZGVkIGJ5IHRoZSBKU0YgaW1wbGVtZW50YXRpb24pIGlzIHVzZWQuCi0gICAgSXQgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgbmF2aWdhdGlvbi1oYW5kbGVyICgjUENEQVRBKT4KLQotPCEtLQotVGhlICJwaGFzZS1saXN0ZW5lciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCi1uYW1lIG9mIHRoZSBjb25jcmV0ZSBQaGFzZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZQotcmVnaXN0ZXJlZCBvbiB0aGUgTGlmZWN5Y2xlLiBJdCBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBwaGFzZS1saXN0ZW5lciAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgInJlZGlyZWN0IiBlbGVtZW50IGluZGljYXRlcyB0aGF0IG5hdmlnYXRpb24gdG8gdGhlIHNwZWNpZmllZAotICAgICJ0by12aWV3LWlkIiBzaG91bGQgYmUgYWNjb21wbGlzaGVkIGJ5IHBlcmZvcm1pbmcgYW4gSFRUUCByZWRpcmVjdAotICAgIHJhdGhlciB0aGFuIHRoZSB1c3VhbCBWaWV3SGFuZGxlciBtZWNoYW5pc21zLgotLS0+Ci08IUVMRU1FTlQgcmVkaXJlY3QgRU1QVFk+Ci0KLTwhLS0KLSAgICBUaGUgInN1Z2dlc3RlZC12YWx1ZSIgY29udGFpbnMgdGhlIHZhbHVlIGZvciB0aGUgcHJvcGVydHkgb3IKLSAgICBhdHRyaWJ1dGUgaW4gd2hpY2ggdGhpcyBlbGVtZW50IHJlc2lkZXMuICBUaGlzIHZhbHVlIGlzIGFkdmlzb3J5Ci0gICAgb25seSBhbmQgaXMgaW50ZW5kZWQgZm9yIHRvb2xzIHRvIHVzZSB3aGVuIHBvcHVsYXRpbmcgcGFsbGV0dGVzLgotLS0+Ci08IUVMRU1FTlQgc3VnZ2VzdGVkLXZhbHVlICgjUENEQVRBKT4KLQotCi08IS0tCi0KLSAgICBUaGUgInZpZXctaGFuZGxlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiB0aGUgY29uY3JldGUgVmlld0hhbmRsZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZAotICAgIGR1cmluZyB0aGUgUmVzdG9yZSBWaWV3IGFuZCBSZW5kZXIgUmVzcG9uc2UgcGhhc2VzIG9mIHRoZSByZXF1ZXN0Ci0gICAgcHJvY2Vzc2luZyBsaWZlY3ljbGUuICBUaGUgZmFjZXMgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGEKLSAgICBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2xhc3MKLS0tPgotPCFFTEVNRU5UIHZpZXctaGFuZGxlciAoI1BDREFUQSk+Ci0KLTwhLS0KLQotICAgIFRoZSAic3RhdGUtbWFuYWdlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiB0aGUgY29uY3JldGUgU3RhdGVNYW5hZ2VyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQKLSAgICBkdXJpbmcgdGhlIFJlc3RvcmUgVmlldyBhbmQgUmVuZGVyIFJlc3BvbnNlIHBoYXNlcyBvZiB0aGUgcmVxdWVzdAotICAgIHByb2Nlc3NpbmcgbGlmZWN5Y2xlLiAgVGhlIGZhY2VzIGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBhCi0gICAgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzCi0tLT4KLTwhRUxFTUVOVCBzdGF0ZS1tYW5hZ2VyICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAibnVsbC12YWx1ZSIgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGUgbWFuYWdlZCBwcm9wZXJ0eSBpbiB3aGljaCB3ZQotICAgIGFyZSBuZXN0ZWQgd2lsbCBiZSBleHBsaWNpdGx5IHNldCB0byBudWxsIGlmIG91ciBtYW5hZ2VkIGJlYW4gaXMKLSAgICBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIG9taXR0aW5nIHRoZSBtYW5hZ2VkCi0gICAgcHJvcGVydHkgZWxlbWVudCBlbnRpcmVseSwgd2hpY2ggd2lsbCBjYXVzZSBubyBwcm9wZXJ0eSBzZXR0ZXIgdG8gYmUKLSAgICBjYWxsZWQgZm9yIHRoaXMgcHJvcGVydHkuCi0KLSAgICBUaGUgIm51bGwtdmFsdWUiIGVsZW1lbnQgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBhc3NvY2lhdGVkCi0gICAgInByb3BlcnR5LWNsYXNzIiBpZGVudGlmaWVzIGEgSmF2YSBjbGFzcywgbm90IGEgSmF2YSBwcmltaXRpdmUuCi0tLT4KLTwhRUxFTUVOVCBudWxsLXZhbHVlIEVNUFRZPgotCi0KLTwhLS0KLSAgICBUaGUgInByb3BlcnR5LWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIEphdmEgdHlwZSBvZiB0aGUgdmFsdWUKLSAgICBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9wZXJ0eSBuYW1lLiAgSXQgbXVzdCBiZSBvZiB0eXBlICJKYXZhVHlwZSIuCi0gICAgSWYgbm90IHNwZWNpZmllZCwgaXQgY2FuIGJlIGluZmVycmVkIGZyb20gZXhpc3RpbmcgY2xhc3NlczsgaG93ZXZlciwKLSAgICB0aGlzIGVsZW1lbnQgc2hvdWxkIGJlIHNwZWNpZmllZCBpZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGlzIGdvaW5nCi0gICAgdG8gYmUgdGhlIHNvdXJjZSBmb3IgZ2VuZXJhdGluZyB0aGUgY29ycmVzcG9uZGluZyBjbGFzc2VzLgotLS0+Ci08IUVMRU1FTlQgcHJvcGVydHktY2xhc3MgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJwcm9wZXJ0eS1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIEphdmFCZWFucyBwcm9wZXJ0eSBuYW1lCi0gICAgdW5kZXIgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgbWF5IGJlIHN0b3JlZC4KLS0tPgotPCFFTEVNRU5UIHByb3BlcnR5LW5hbWUgICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAicHJvcGVydHktcmVzb2x2ZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgdGhlIGNvbmNyZXRlIFByb3BlcnR5UmVzb2x2ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQKLSAgICBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YgdmFsdWUgYmluZGluZyBleHByZXNzaW9ucy4KLSAgICBJdCBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBwcm9wZXJ0eS1yZXNvbHZlciAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAicmVmZXJlbmNlZC1iZWFuLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotICAgIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgKGVpdGhlciBhYnN0cmFjdCBvciBjb25jcmV0ZSkgb3IgSmF2YSBpbnRlcmZhY2UKLSAgICBpbXBsZW1lbnRlZCBieSB0aGUgY29ycmVzcG9uZGluZyByZWZlcmVuY2VkIGJlYW4uICBJdCBtdXN0IGJlIG9mIHR5cGUKLSAgICAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIHJlZmVyZW5jZWQtYmVhbi1jbGFzcyAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInJlZmVyZW5jZWQtYmVhbi1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGF0dHJpYnV0ZSBuYW1lIHVuZGVyCi0gICAgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgcmVmZXJlbmNlZCBiZWFuIG1heSBiZSBhc3N1bWVkIHRvIGJlIHN0b3JlZCwKLSAgICBpbiBvbmUgb2YgdGhlIHNjb3BlcyBkZWZpbmVkIGJ5IHRoZSAiU2NvcGUiIHR5cGUuICBJdCBtdXN0IGJlIG9mIHR5cGUKLSAgICAiSWRlbnRpZmllciIuCi0tLT4KLTwhRUxFTUVOVCByZWZlcmVuY2VkLWJlYW4tbmFtZSAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAicmVuZGVyLWtpdC1pZCIgZWxlbWVudCByZXByZXNlbnRzIGFuIGlkZW50aWZpZXIgZm9yIHRoZQotICAgIFJlbmRlcktpdCByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50ICJyZW5kZXIta2l0IiBlbGVtZW50LgotLS0+Ci08IUVMRU1FTlQgcmVuZGVyLWtpdC1pZCAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJyZW5kZXIta2l0LWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgYSBjb25jcmV0ZSBSZW5kZXJLaXQgaW1wbGVtZW50YXRpb24gY2xhc3MuICBJdCBtdXN0IGJlIG9mCi0gICAgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIHJlbmRlci1raXQtY2xhc3MgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInJlbmRlcmVyLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgYSBjb25jcmV0ZSBSZW5kZXJlciBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gIEl0IG11c3QgYmUgb2YKLSAgICB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgcmVuZGVyZXItY2xhc3MgICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAicmVuZGVyLWtpdC1mYWN0b3J5IiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBSZW5kZXJLaXRGYWN0b3J5IGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQKLSAgICB3aGVuIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShSRU5ERVJfS0lUX0ZBQ1RPUlkpIGlzIGNhbGxlZC4gSXQgbXVzdCBiZSAKLSAgICBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgcmVuZGVyLWtpdC1mYWN0b3J5ICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAicmVuZGVyZXItdHlwZSIgZWxlbWVudCByZXByZXNlbnRzIGEgcmVuZGVyZXIgdHlwZSBpZGVudGlmaWVyIGZvciB0aGUKLSAgICBSZW5kZXJlciByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50ICJyZW5kZXJlciIgZWxlbWVudC4KLS0tPgotPCFFTEVNRU5UIHJlbmRlcmVyLXR5cGUgICAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgInNtYWxsLWljb24iIGVsZW1lbnQgY29udGFpbnMgdGhlIHJlc291cmNlIHBhdGggdG8gYSBsYXJnZSAoMTZ4MTYpCi0gICAgaWNvbiBpbWFnZS4gIFRoZSBpbWFnZSBtYXkgYmUgaW4gZWl0aGVyIEdJRiBvciBKUEcgZm9ybWF0LgotLS0+Ci08IUVMRU1FTlQgc21hbGwtaWNvbiAgICAgICgjUENEQVRBKT4KLQotPCEtLQotICAgICBUaGUgInN1cHBvcnRlZC1sb2NhbGUiIGVsZW1lbnQgYWxsb3dzIGF1dGhvcnMgdG8gZGVjbGFyZSB3aGljaAotICAgICBsb2NhbGVzIGFyZSBzdXBwb3J0ZWQgaW4gdGhpcyBhcHBsaWNhdGlvbiBpbnN0YW5jZS4KLQotICAgICBJdCBtdXN0IGJlIHNwZWNpZmllZCBhcyA6bGFuZ3VhZ2U6W186Y291bnRyeTpbXzp2YXJpYW50Ol1dIHdpdGhvdXQKLSAgICAgdGhlIGNvbG9ucywgZm9yIGV4YW1wbGUgImphX0pQX1NKSVMiLiAgVGhlIHNlcGFyYXRvcnMgYmV0d2VlbiB0aGUKLSAgICAgc2VnbWVudHMgbWF5IGJlICctJyBvciAnXycuCi0tLT4KLTwhRUxFTUVOVCBzdXBwb3J0ZWQtbG9jYWxlICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAidG8tdmlldyIgZWxlbWVudCBjb250YWlucyB0aGUgdmlldyBpZGVudGlmaWVyIG9mIHRoZSBuZXh0IHZpZXcKLSAgICB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaWYgdGhpcyBuYXZpZ2F0aW9uIHJ1bGUgaXMgbWF0Y2hlZC4gIEl0Ci0gICAgbXVzdCBiZSBvZiB0eXBlICJWaWV3SWQiLgotLS0+Ci08IUVMRU1FTlQgdG8tdmlldy1pZCAgICAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJ2YWxpZGF0b3ItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiBhIGNvbmNyZXRlIFZhbGlkYXRvciBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gIEl0IG11c3QgYmUgb2YKLSAgICB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgdmFsaWRhdG9yLWNsYXNzICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJ2YWxpZGF0b3ItaWQiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgaWRlbnRpZmllciB1bmRlciB3aGljaCB0aGUKLSAgICBjb3JyZXNwb25kaW5nIFZhbGlkYXRvciBjbGFzcyBzaG91bGQgYmUgcmVnaXN0ZXJlZC4KLS0tPgotPCFFTEVNRU5UIHZhbGlkYXRvci1pZCAgICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAidmFsdWUiIGVsZW1lbnQgaXMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGxpdGVyYWwKLSAgICB2YWx1ZSB0byB3aGljaCBhIHNjYWxhciBtYW5hZ2VkIHByb3BlcnR5IHdpbGwgYmUgc2V0LCBvciBhIHZhbHVlCi0gICAgYmluZGluZyBleHByZXNzaW9uICgiI3suLi59IikgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZQotICAgIHJlcXVpcmVkIHZhbHVlLiAgSXQgd2lsbCBiZSBjb252ZXJ0ZWQgYXMgc3BlY2lmaWVkIGZvciB0aGUgYWN0dWFsCi0gICAgcHJvcGVydHkgdHlwZS4KLS0tPgotPCFFTEVNRU5UIHZhbHVlICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJ2YWx1ZS1jbGFzcyIgZWxlbWVudCBkZWZpbmVzIHRoZSBKYXZhIHR5cGUgdG8gd2hpY2ggZWFjaAotICAgICJ2YWx1ZSIgZWxlbWVudCdzIHZhbHVlIHdpbGwgYmUgY29udmVydGVkIHRvLCBwcmlvciB0byBhZGRpbmcgaXQgdG8KLSAgICB0aGUgImxpc3QtZW50cmllcyIgbGlzdCBmb3IgYSBtYW5hZ2VkIHByb3BlcnR5IHRoYXQgaXMgYQotICAgIGphdmEudXRpbC5MaXN0LCBvciBhICJtYXAtZW50cmllcyIgbWFwIGZvciBhIG1hbmFnZWQgcHJvcGVydHkgdGhhdAotICAgIGlzIGEgamF2YS51dGlsLk1hcC4gIEl0IG11c3QgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4gIElmIG9taXR0ZWQsCi0gICAgImphdmEubGFuZy5TdHJpbmciIGlzIGFzc3VtZWQuCi0tLT4KLTwhRUxFTUVOVCB2YWx1ZS1jbGFzcyAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgInZhcmlhYmxlLXJlc29sdmVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBWYXJpYWJsZVJlc29sdmVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSB1c2VkCi0gICAgZHVyaW5nIHRoZSBwcm9jZXNzaW5nIG9mIHZhbHVlIGJpbmRpbmcgZXhwcmVzc2lvbnMuCi0gICAgSXQgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgdmFyaWFibGUtcmVzb2x2ZXIgKCNQQ0RBVEEpPgotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJZGVudGlmaWVyIEF0dHJpYnV0ZXMgPT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQotPCFBVFRMSVNUIGFjdGlvbi1saXN0ZW5lciAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhcHBsaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXBwbGljYXRpb24tZmFjdG9yeSAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGF0dHJpYnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhdHRyaWJ1dGUtY2xhc3MgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXR0cmlidXRlLWV4dGVuc2lvbiAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGF0dHJpYnV0ZS1uYW1lICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb21wb25lbnQgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29tcG9uZW50LWNsYXNzICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbXBvbmVudC1leHRlbnNpb24gICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb21wb25lbnQtZmFtaWx5ICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29tcG9uZW50LXR5cGUgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbnZlcnRlciAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb252ZXJ0ZXItY2xhc3MgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29udmVydGVyLWZvci1jbGFzcyAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbnZlcnRlci1pZCAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZWZhdWx0LWxvY2FsZSAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVmYXVsdC1yZW5kZXIta2l0LWlkICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlZmF1bHQtdmFsdWUgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGlzcGxheS1uYW1lICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZhY2VzLWNvbmZpZyAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmYWNlcy1jb250ZXh0LWZhY3RvcnkgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZmFjdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZyb20tYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmcm9tLW91dGNvbWUgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZnJvbS12aWV3LWlkICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGljb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qga2V5LWNsYXNzICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxhcmdlLWljb24gICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsaWZlY3ljbGUgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGlmZWN5Y2xlLWZhY3RvcnkgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxpc3QtZW50cmllcyAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsb2NhbGUtY29uZmlnICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWFuYWdlZC1iZWFuICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1hbmFnZWQtYmVhbi1jbGFzcyAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtYW5hZ2VkLWJlYW4tbmFtZSAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWFuYWdlZC1iZWFuLXNjb3BlICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1hbmFnZWQtcHJvcGVydHkgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtYXAtZW50cmllcyAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWFwLWVudHJ5ICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1lc3NhZ2UtYnVuZGxlICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBuYXZpZ2F0aW9uLWNhc2UgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbmF2aWdhdGlvbi1oYW5kbGVyICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG5hdmlnYXRpb24tcnVsZSAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBudWxsLXZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcGhhc2UtbGlzdGVuZXIgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHByb3BlcnR5ICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwcm9wZXJ0eS1jbGFzcyAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcHJvcGVydHktZXh0ZW5zaW9uICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHByb3BlcnR5LW5hbWUgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwcm9wZXJ0eS1yZXNvbHZlciAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVkaXJlY3QgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlZmVyZW5jZWQtYmVhbiAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWZlcmVuY2VkLWJlYW4tY2xhc3MgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVmZXJlbmNlZC1iZWFuLW5hbWUgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbmRlci1raXQgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW5kZXIta2l0LWNsYXNzICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVuZGVyLWtpdC1mYWN0b3J5ICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbmRlci1raXQtaWQgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW5kZXJlciAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVuZGVyZXItY2xhc3MgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbmRlcmVyLWV4dGVuc2lvbiAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW5kZXJlci10eXBlICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc21hbGwtaWNvbiAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHN0YXRlLW1hbmFnZXIgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzdWdnZXN0ZWQtdmFsdWUgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc3VwcG9ydGVkLWxvY2FsZSAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRvLXZpZXctaWQgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB2YWxpZGF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdmFsaWRhdG9yLWNsYXNzICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZhbGlkYXRvci1pZCAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdmFsdWUtY2xhc3MgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZhcmlhYmxlLXJlc29sdmVyICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB2aWV3LWhhbmRsZXIgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWZhY2VzY29uZmlnXzFfMS5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlc2NvbmZpZ18xXzEuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2RhZDhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWZhY2VzY29uZmlnXzFfMS5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSw4OTUgKzAsMCBAQAotPCEtLQotICAgIERURCBmb3IgdGhlIEphdmFTZXJ2ZXIgRmFjZXMgQXBwbGljYXRpb24gQ29uZmlndXJhdGlvbiBGaWxlIChWZXJzaW9uIDEuMSkKLQotICAgIFRvIHN1cHBvcnQgdmFsaWRhdGlvbiBvZiB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZShzKSwgaW5jbHVkZSB0aGUgZm9sbG93aW5nCi0gICAgRE9DVFlQRSBlbGVtZW50IGF0IHRoZSBiZWdpbm5pbmcgKGFmdGVyIHRoZSAieG1sIiBkZWNsYXJhdGlvbik6Ci0KLSAgICA8IURPQ1RZUEUgZmFjZXMtY29uZmlnIFBVQkxJQwotICAgICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMS8vRU4iCi0gICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCI+Ci0KLSAgICAkSWQ6IHdlYi1mYWNlc2NvbmZpZ18xXzEuZHRkLHYgMS4xIDIwMDcvMDUvMjUgMjE6MTI6NDggZGF2aWRfd2lsbGlhbXMgRXhwICQKLQotLS0+Ci0KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PSBEZWZpbmVkIFR5cGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0KLTwhLS0KLSAgICBBbiAiQWN0aW9uIiBpcyBhIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgYSBtZXRob2QgYmluZGluZwotICAgIGV4cHJlc3Npb24gdGhhdCBwb2ludHMgYXQgYSBtZXRob2Qgd2l0aCBubyBhcmd1bWVudHMgdGhhdCByZXR1cm5zIGEKLSAgICBTdHJpbmcuICBJdCBtdXN0IGJlIGJyYWNrZXRlZCB3aXRoICIje30iLCBmb3IgZXhhbXBsZSwKLSAgICAiI3tjYXJkZW1vLmJ1eUNhcn0iLgotLS0+Ci08IUVOVElUWSAlIEFjdGlvbiAiQ0RBVEEiPgotCi0KLTwhLS0KLSAgICBBICJDbGFzc05hbWUiIGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgdGhhdCBpcwotICAgIGluc3RhbnRpYXRlZCB0byBwcm92aWRlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBlbmNsb3NpbmcgZWxlbWVudC4KLS0tPgotPCFFTlRJVFkgJSBDbGFzc05hbWUgIkNEQVRBIj4KLQotCi08IS0tCi0gICAgQW4gIklkZW50aWZpZXIiIGlzIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgdGhhdCBjb25mb3JtcyB0byB0aGUgdmFyaWFibGUKLSAgICBuYW1pbmcgY29udmVudGlvbnMgb2YgdGhlIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgKEpMUyBTZWN0aW9uID8uPy4/KS4KLS0tPgotPCFFTlRJVFkgJSBJZGVudGlmaWVyICJDREFUQSI+Ci0KLQotPCEtLQotICAgIEEgIkphdmFUeXBlIiBpcyBlaXRoZXIgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGlzCi0gICAgaW5zdGFudGlhdGVkIHRvIHByb3ZpZGUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGVuY2xvc2luZyBlbGVtZW50LCBvcgotICAgIHRoZSBuYW1lIG9mIGEgSmF2YSBwcmltaXRpdmUgdHlwZSAoc3VjaCBhcyBpbnQgb3IgY2hhcikuICBUaGUgY2xhc3MgbmFtZQotICAgIG9yIHByaW1pdGl2ZSB0eXBlIG1heSBvcHRpb25hbGx5IGJlIGZvbGxvd2VkIGJ5ICJbXSIgdG8gaW5kaWNhdGUgdGhhdAotICAgIHRoZSB1bmRlcmx5aW5nIGRhdGEgbXVzdCBiZSBhbiBhcnJheSwgcmF0aGVyIHRoYW4gYSBzY2FsYXIgdmFyaWFibGUuCi0tLT4KLTwhRU5USVRZICUgSmF2YVR5cGUgIkNEQVRBIj4KLQotCi08IS0tCi0gICAgQSAiTGFuZ3VhZ2UiIGlzIGEgbG93ZXIgY2FzZSB0d28tbGV0dGVyIGNvZGUgZm9yIGEgbGFuZ3VhZ2UgYXMgZGVmaW5lZAotICAgIGJ5IElTTC02MzkuCi0tLT4KLTwhRU5USVRZICUgTGFuZ3VhZ2UgIkNEQVRBIj4KLQotCi08IS0tCi0gICAgQSAiUmVzb3VyY2VQYXRoIiBpcyB0aGUgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aCB0byBhIHJlc291cmNlIGZpbGUKLSAgICAoc3VjaCBhcyBhIGxvZ28gaW1hZ2UpLgotLS0+Ci08IUVOVElUWSAlIFJlc291cmNlUGF0aCAiQ0RBVEEiPgotCi0KLTwhLS0KLSAgICBBICJTY29wZSIgaXMgdGhlIHdlbGwta25vd24gbmFtZSBvZiBhIHNjb3BlIGluIHdoaWNoIG1hbmFnZWQgYmVhbnMgbWF5Ci0gICAgb3B0aW9uYWxseSBiZSBkZWZpbmVkIHRvIGJlIGNyZWF0ZWQgaW4uCi0tLT4KLTwhRU5USVRZICUgU2NvcGUgIihyZXF1ZXN0fHNlc3Npb258YXBwbGljYXRpb24pIj4KLQotCi0KLTwhLS0KLSAgICBBICJTY29wZU9yTm9uZSIgZWxlbWVudCBkZWZpbmVzIHRoZSBsZWdhbCB2YWx1ZXMgZm9yIHRoZQotICAgIDxtYW5hZ2VkLWJlYW4tc2NvcGU+IGVsZW1lbnQncyBib2R5IGNvbnRlbnQsIHdoaWNoIGluY2x1ZGVzCi0gICAgYWxsIG9mIHRoZSBzY29wZXMgcmVzcHJlc2VudGVkIGJ5IHRoZSAiU2NvcGUiIHR5cGUsIHBsdXMgdGhlCi0gICAgIm5vbmUiIHZhbHVlIGluZGljYXRpbmcgdGhhdCBhIGNyZWF0ZWQgYmVhbiBzaG91bGQgbm90IGJlCi0gICAgc3RvcmVkIGludG8gYW55IHNjb3BlLgotLS0+Ci08IUVOVElUWSAlIFNjb3BlT3JOb25lICIocmVxdWVzdHxzZXNzaW9ufGFwcGxpY2F0aW9ufG5vbmUpIj4KLQotCi08IS0tCi0gICAgQSAiVmlld0lkUGF0dGVybiIgaXMgYSBwYXR0ZXJuIGZvciBtYXRjaGluZyB2aWV3IGlkZW50aWZpZXJzIGluCi0gICAgb3JkZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIG5hdmlnYXRpb24gcnVsZSBzaG91bGQgYmUKLSAgICBmaXJlZC4gIEl0IG11c3QgY29udGFpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0KLSAgICAtIFRoZSBleGFjdCBtYXRjaCBmb3IgYSB2aWV3IGlkZW50aWZpZXIgdGhhdCBpcyByZWNvZ25pemVkCi0gICAgICBieSB0aGUgdGhlIFZpZXdIYW5kbGVyIGltcGxlbWVudGF0aW9uIGJlaW5nIHVzZWQgKHN1Y2ggYXMKLSAgICAgICIvaW5kZXguanNwIiBpZiB5b3UgYXJlIHVzaW5nIHRoZSBkZWZhdWx0IFZpZXdIYW5kbGVyKS4KLQotICAgIC0gQSBwcm9wZXIgcHJlZml4IG9mIGEgdmlldyBpZGVudGlmaWVyLCBwbHVzIGEgdHJhaWxpbmcgIioiCi0gICAgICBjaGFyYWN0ZXIuICBUaGlzIHBhdHRlcm4gaW5kaWNhdGVzIHRoYXQgYWxsIHZpZXcgaWRlbnRpZmllcnMgdGhhdAotICAgICAgbWF0Y2ggdGhlIHBvcnRpb24gb2YgdGhlIHBhdHRlcm4gdXAgdG8gdGhlIGFzdGVyaXNrIHdpbGwgbWF0Y2ggdGhlCi0gICAgICBzdXJyb3VuZGluZyBydWxlLiAgV2hlbiBtb3JlIHRoYW4gb25lIG1hdGNoIGV4aXN0cywgdGhlIG1hdGNoIHdpdGgKLSAgICAgIHRoZSBsb25nZXN0IHBhdHRlcm4gaXMgc2VsZWN0ZWQuCi0KLSAgICAtIEFuICIqIiBjaGFyYWN0ZXIsIHdoaWNoIG1lYW5zIHRoYXQgdGhpcyBwYXR0ZXJuIGFwcGxpZXMgdG8gYWxsCi0gICAgICB2aWV3IGlkZW50aWZpZXJzLgotLS0+Ci08IUVOVElUWSAlIFZpZXdJZFBhdHRlcm4gIkNEQVRBIj4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09IFRvcCBMZXZlbCBFbGVtZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQotPCEtLQotICAgIFRoZSAiZmFjZXMtY29uZmlnIiBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCi0gICAgaGllcmFyY2h5LCBhbmQgY29udGFpbnMgbmVzdGVkIGVsZW1lbnRzIGZvciBhbGwgb2YgdGhlIG90aGVyIGNvbmZpZ3VyYXRpb24KLSAgICBzZXR0aW5ncy4KLS0tPgotPCFFTEVNRU5UIGZhY2VzLWNvbmZpZyAgICAoKGFwcGxpY2F0aW9ufGZhY3Rvcnl8Y29tcG9uZW50fGNvbnZlcnRlcnxtYW5hZ2VkLWJlYW58bmF2aWdhdGlvbi1ydWxlfHJlZmVyZW5jZWQtYmVhbnxyZW5kZXIta2l0fGxpZmVjeWNsZXx2YWxpZGF0b3IpKik+Ci08IUFUVExJU1QgZmFjZXMtY29uZmlnCi0gICAgICAgeG1sbnMgQ0RBVEEgI0ZJWEVEICJodHRwOi8vamF2YS5zdW4uY29tL0pTRi9Db25maWd1cmF0aW9uIj4KLQotCi0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT0gRGVmaW5pdGlvbiBFbGVtZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi08IS0tCi0gICAgVGhlICJhcHBsaWNhdGlvbiIgZWxlbWVudCBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byBkZWZpbmUgdGhlIHZhcmlvdXMKLSAgICBwZXItYXBwbGljYXRpb24tc2luZ2xldG9uIGltcGxlbWVudGF0aW9uIGFydGlmYWN0cyBmb3IgYSBwYXJ0aWN1bGFyIHdlYgotICAgIGFwcGxpY2F0aW9uIHRoYXQgaXMgdXRpbGl6aW5nIEphdmFTZXJ2ZXIgRmFjZXMuICBGb3IgbmVzdGVkIGVsZW1lbnRzCi0gICAgdGhhdCBhcmUgbm90IHNwZWNpZmllZCwgdGhlIEpTRiBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYSBzdWl0YWJsZQotICAgIGRlZmF1bHQuCi0tLT4KLTwhRUxFTUVOVCBhcHBsaWNhdGlvbiAgICAgKChhY3Rpb24tbGlzdGVuZXJ8ZGVmYXVsdC1yZW5kZXIta2l0LWlkfG1lc3NhZ2UtYnVuZGxlfG5hdmlnYXRpb24taGFuZGxlcnx2aWV3LWhhbmRsZXJ8c3RhdGUtbWFuYWdlcnxwcm9wZXJ0eS1yZXNvbHZlcnx2YXJpYWJsZS1yZXNvbHZlcnxsb2NhbGUtY29uZmlnKSopPgotCi0KLTwhLS0KLSAgICBUaGUgImZhY3RvcnkiIGVsZW1lbnQgcHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gZGVmaW5lIHRoZSB2YXJpb3VzCi0gICAgRmFjdG9yaWVzIHRoYXQgY29tcHJpc2UgcGFydHMgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIEphdmFTZXJ2ZXIKLSAgICBGYWNlcy4gIEZvciBuZXN0ZWQgZWxlbWVudHMgdGhhdCBhcmUgbm90IHNwZWNpZmllZCwgdGhlIEpTRgotICAgIGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBhIHN1aXRhYmxlIGRlZmF1bHQuCi0tLT4KLTwhRUxFTUVOVCBmYWN0b3J5ICAgICAoKGFwcGxpY2F0aW9uLWZhY3Rvcnl8ZmFjZXMtY29udGV4dC1mYWN0b3J5fGxpZmVjeWNsZS1mYWN0b3J5fHJlbmRlci1raXQtZmFjdG9yeSkqKT4KLQotCi08IS0tCi0gICAgVGhlICJhdHRyaWJ1dGUiIGVsZW1lbnQgcmVwcmVzZW50cyBhIG5hbWVkLCB0eXBlZCwgdmFsdWUgYXNzb2NpYXRlZCB3aXRoCi0gICAgdGhlIHBhcmVudCBVSUNvbXBvbmVudCB2aWEgdGhlIGdlbmVyaWMgYXR0cmlidXRlcyBtZWNoYW5pc20uCi0KLSAgICBBdHRyaWJ1dGUgbmFtZXMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgcGFyZW50IChvciByZWxhdGVkKQotICAgIGNvbXBvbmVudC4KLS0tPgotPCFFTEVNRU5UIGF0dHJpYnV0ZSAgICAgICAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgYXR0cmlidXRlLW5hbWUsIGF0dHJpYnV0ZS1jbGFzcywgZGVmYXVsdC12YWx1ZT8sIHN1Z2dlc3RlZC12YWx1ZT8sIGF0dHJpYnV0ZS1leHRlbnNpb24qKT4KLQotPCEtLSAKLSAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgYXR0cmlidXRlLiAgTWF5IGNvbnRhaW4gaW1wbGVtZW50YXRpb24KLSAgICBzcGVjaWZpYyBjb250ZW50LgotLS0+Ci08IUVMRU1FTlQgYXR0cmlidXRlLWV4dGVuc2lvbiBBTlk+Ci0KLQotPCEtLQotICAgIFRoZSAiY29tcG9uZW50IiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBVSUNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbgotICAgIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIHNwZWNpZmllZCB0eXBlIGlkZW50aWZpZXIsCi0gICAgYWxvbmcgd2l0aCBpdHMgYXNzb2NpYXRlZCBwcm9wZXJ0aWVzIGFuZCBhdHRyaWJ1dGVzLiAgQ29tcG9uZW50IHR5cGVzIG11c3QKLSAgICBiZSB1bmlxdWUgd2l0aGluIHRoZSBlbnRpcmUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgTmVzdGVkICJhdHRyaWJ1dGUiIGVsZW1lbnRzIGlkZW50aWZ5IGdlbmVyaWMgYXR0cmlidXRlcyB0aGF0IGFyZSByZWNvZ25pemVkCi0gICAgYnkgdGhlIGltcGxlbWVudGF0aW9uIGxvZ2ljIG9mIHRoaXMgY29tcG9uZW50LiAgTmVzdGVkICJwcm9wZXJ0eSIgZWxlbWVudHMKLSAgICBpZGVudGlmeSBKYXZhQmVhbnMgcHJvcGVydGllcyBvZiB0aGUgY29tcG9uZW50IGNsYXNzIHRoYXQgbWF5IGJlIGV4cG9zZWQKLSAgICBmb3IgbWFuaXB1bGF0aW9uIHZpYSB0b29scy4KLS0tPgotPCFFTEVNRU5UIGNvbXBvbmVudCAgICAgICAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgY29tcG9uZW50LXR5cGUsIGNvbXBvbmVudC1jbGFzcywgZmFjZXQqLCBhdHRyaWJ1dGUqLCBwcm9wZXJ0eSosIGNvbXBvbmVudC1leHRlbnNpb24qKT4KLQotPCEtLSAKLSAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgY29tcG9uZW50LiAgTWF5IGNvbnRhaW4gaW1wbGVtZW50YXRpb24KLSAgICBzcGVjaWZpYyBjb250ZW50LgotLS0+Ci08IUVMRU1FTlQgY29tcG9uZW50LWV4dGVuc2lvbiBBTlk+Ci0KLTwhLS0KLSAgIERlZmluZSB0aGUgbmFtZSBhbmQgb3RoZXIgZGVzaWduLXRpbWUgaW5mb3JtYXRpb24gZm9yIGEgZmFjZXQgdGhhdCBpcwotICAgYXNzb2NpYXRlZCB3aXRoIGEgcmVuZGVyZXIgb3IgYSBjb21wb25lbnQuCi0tLT4KLQotPCFFTEVNRU5UIGZhY2V0ICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBmYWNldC1uYW1lLCBmYWNldC1leHRlbnNpb24qKT4KLQotPCEtLSAKLSAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgZmFjZXQuICBNYXkgY29udGFpbiBpbXBsZW1lbnRhdGlvbgotICAgIHNwZWNpZmljIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBmYWNldC1leHRlbnNpb24gQU5ZPgotCi08IS0tCi0gICAgVGhlICJmYWNldC1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZhY2V0IG5hbWUgdW5kZXIgd2hpY2ggYQotICAgIFVJQ29tcG9uZW50IHdpbGwgYmUgYWRkZWQgdG8gaXRzIHBhcmVudC4gIEl0IG11c3QgYmUgb2YgdHlwZQotICAgICJJZGVudGlmaWVyIi4KLS0tPgotPCFFTEVNRU5UIGZhY2V0LW5hbWUgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJjb252ZXJ0ZXIiIGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIENvbnZlcnRlciBpbXBsZW1lbnRhdGlvbgotICAgIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIHNwZWNpZmllZCBjb252ZXJ0ZXIgaWRlbnRpZmllci4KLSAgICBDb252ZXJ0ZXIgaWRlbnRpZmllcnMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBlbnRpcmUgd2ViIGFwcGxpY2F0aW9uLgotCi0gICAgTmVzdGVkICJhdHRyaWJ1dGUiIGVsZW1lbnRzIGlkZW50aWZ5IGdlbmVyaWMgYXR0cmlidXRlcyB0aGF0IG1heSBiZQotICAgIGNvbmZpZ3VyZWQgb24gdGhlIGNvcnJlc3BvbmRpbmcgVUlDb21wb25lbnQgaW4gb3JkZXIgdG8gYWZmZWN0IHRoZQotICAgIG9wZXJhdGlvbiBvZiB0aGUgQ29udmVydGVyLiAgTmVzdGVkICJwcm9wZXJ0eSIgZWxlbWVudHMgaWRlbnRpZnkgSmF2YUJlYW5zCi0gICAgcHJvcGVydGllcyBvZiB0aGUgQ29udmVydGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgbWF5IGJlIGNvbmZpZ3VyZWQKLSAgICB0byBhZmZlY3QgdGhlIG9wZXJhdGlvbiBvZiB0aGUgQ29udmVydGVyLgotLS0+Ci08IUVMRU1FTlQgY29udmVydGVyICAgICAgIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCAoY29udmVydGVyLWlkIHwgY29udmVydGVyLWZvci1jbGFzcyksIGNvbnZlcnRlci1jbGFzcywgYXR0cmlidXRlKiwgcHJvcGVydHkqKT4KLQotCi08IS0tCi0gICAgVGhlICJpY29uIiBlbGVtZW50IGNvbnRhaW5zICJzbWFsbC1pY29uIiBhbmQgImxhcmdlLWljb24iIGVsZW1lbnRzIHRoYXQKLSAgICBzcGVjaWZ5IHRoZSByZXNvcnVjZSBwYXRocyBmb3Igc21hbGwgYW5kIGxhcmdlIEdJRiBvciBKUEcgaWNvbiBpbWFnZXMKLSAgICB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gYSBHVUkgdG9vbC4KLS0tPgotPCFFTEVNRU5UIGljb24gICAgICAgICAgICAoc21hbGwtaWNvbj8sIGxhcmdlLWljb24/KT4KLTwhQVRUTElTVCBpY29uICAgICAgICAgICAgeG1sOmxhbmcgICAgICAgICVMYW5ndWFnZTsgICAgICAjSU1QTElFRD4KLQotPCEtLQotICAgIFRoZSAibGlmZWN5Y2xlIiBlbGVtZW50IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIHNwZWNpZnkKLSAgICBtb2RpZmljYXRpb25zIHRvIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGRlZmF1bHQgTGlmZWN5Y2xlCi0gICAgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotLS0+Ci08IUVMRU1FTlQgbGlmZWN5Y2xlICAgICAgIChwaGFzZS1saXN0ZW5lciopPgotCi08IS0tCi0gICAgIFRoZSAibG9jYWxlLWNvbmZpZyIgZWxlbWVudCBhbGxvd3MgdGhlIGFwcCBkZXZlbG9wZXIgdG8gZGVjbGFyZSB0aGUKLSAgICAgc3VwcG9ydGVkIGxvY2FsZXMgZm9yIHRoaXMgYXBwbGljYXRpb24uICAKLS0tPgotPCFFTEVNRU5UIGxvY2FsZS1jb25maWcgKGRlZmF1bHQtbG9jYWxlPywgc3VwcG9ydGVkLWxvY2FsZSopPgotCi08IS0tCi0gICAgVGhlICJtYW5hZ2VkLWJlYW4iIGVsZW1lbnQgcmVwcmVzZW50cyBhIEphdmFCZWFuLCBvZiBhIHBhcnRpY3VsYXIgY2xhc3MsCi0gICAgdGhhdCB3aWxsIGJlIGR5bmFtaWNhbGx5IGluc3RhbnRpYXRlZCBhdCBydW50aW1lIChieSB0aGUgZGVmYXVsdAotICAgIFZhcmlhYmxlUmVzb2x2ZXIgaW1wbGVtZW50YXRpb24pIGlmIGl0IGlzIHJlZmVyZW5jZWQgYXMgdGhlIGZpcnN0IGVsZW1lbnQKLSAgICBvZiBhIHZhbHVlIGJpbmRpbmcgZXhwcmVzc2lvbiwgYW5kIG5vIGNvcnJlc3BvbmRpbmcgYmVhbiBjYW4gYmUKLSAgICBpZGVudGlmaWVkIGluIGFueSBzY29wZS4gIEluIGFkZGl0aW9uIHRvIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWFuYWdlZCBiZWFuLAotICAgIGFuZCB0aGUgb3B0aW9uYWwgc3RvcmluZyBvZiBpdCBpbnRvIHRoZSBzcGVjaWZpZWQgc2NvcGUsIHRoZSBuZXN0ZWQKLSAgICBtYW5hZ2VkLXByb3BlcnR5IGVsZW1lbnRzIGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGNvbnRlbnRzIG9mCi0gICAgc2V0dGFibGUgSmF2YUJlYW5zIHByb3BlcnRpZXMgb2YgdGhlIGNyZWF0ZWQgaW5zdGFuY2UuCi0tLT4KLTwhRUxFTUVOVCBtYW5hZ2VkLWJlYW4gKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIG1hbmFnZWQtYmVhbi1uYW1lLCBtYW5hZ2VkLWJlYW4tY2xhc3MsIG1hbmFnZWQtYmVhbi1zY29wZSwgKG1hbmFnZWQtcHJvcGVydHkqIHwgbWFwLWVudHJpZXMgfCBsaXN0LWVudHJpZXMpKT4KLQotCi08IS0tCi0gICAgVGhlICJtYW5hZ2VkLXByb3BlcnR5IiBlbGVtZW50IHJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCBwcm9wZXJ0eSBvZiBhCi0gICAgbWFuYWdlZCBiZWFuIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgKG9yIHZhbHVlIHNldCkKLSAgICBpZiB0aGUgY29ycmVzcG9uZGluZyBtYW5hZ2VkIGJlYW4gaXMgYXV0b21hdGljYWxseSBjcmVhdGVkLgotLS0+Ci08IUVMRU1FTlQgbWFuYWdlZC1wcm9wZXJ0eSAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgcHJvcGVydHktbmFtZSwgcHJvcGVydHktY2xhc3M/LCAobWFwLWVudHJpZXN8bnVsbC12YWx1ZXx2YWx1ZXxsaXN0LWVudHJpZXMpKT4KLQotCi08IS0tCi0gICAgVGhlICJtYXAtZW50cnkiIGVsZW1lbnQgcmVwcnNlbnRzIGEgc2luZ2xlIGtleS1lbnRyeSBwYWlyIHRoYXQKLSAgICB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb21wdXRlZCB2YWx1ZSBvZiBhIG1hbmFnZWQgcHJvcGVydHkgb2YgdHlwZQotICAgIGphdmEudXRpbC5NYXAuCi0tLT4KLTwhRUxFTUVOVCBtYXAtZW50cnkgKGtleSwgKG51bGwtdmFsdWV8dmFsdWUpKT4KLQotCi08IS0tCi0gICAgVGhlICJtYXAtZW50cmllcycgZWxlbWVudCByZXByZXNlbnRzIGEgc2V0IG9mIGtleS1lbnRyeSBwYWlycyB0aGF0Ci0gICAgd2lsbCBiZSBhZGRlZCB0byB0aGUgY29tcHV0ZWQgdmFsdWUgb2YgYSBtYW5hZ2VkIHByb3BlcnR5IG9mIHR5cGUKLSAgICBqYXZhLnV0aWwuTWFwLiAgSW4gYWRkaXRpb24sIHRoZSBKYXZhIGNsYXNzIHR5cGVzIG9mIHRoZSBrZXkgYW5kIGVudHJ5Ci0gICAgdmFsdWVzIG1heSBiZSBvcHRpb25hbGx5IGRlY2xhcmVkLgotLS0+Ci08IUVMRU1FTlQgbWFwLWVudHJpZXMgKGtleS1jbGFzcz8sIHZhbHVlLWNsYXNzPywgbWFwLWVudHJ5Kik+Ci0KLQotPCEtLQotICAgIFRoZSBiYXNlIG5hbWUgb2YgYSByZXNvdXJjZSBidW5kbGUgcmVwcmVzZW50aW5nIHRoZSBtZXNzYWdlIHJlc291cmNlcwotICAgIGZvciB0aGlzIGFwcGxpY2F0aW9uLiAgU2VlIHRoZSBKYXZhRG9jcyBmb3IgdGhlICJqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUiCi0gICAgY2xhc3MgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHN5bnRheCBvZiByZXNvdXJjZSBidW5kbGUgbmFtZXMuCi0tLT4KLQotPCFFTEVNRU5UIG1lc3NhZ2UtYnVuZGxlICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJuYXZpZ2F0aW9uLWNhc2UiIGVsZW1lbnQgZGVzY3JpYmVzIGEgcGFydGljdWxhciBjb21iaW5hdGlvbiBvZgotICAgIGNvbmRpdGlvbnMgdGhhdCBtdXN0IG1hdGNoIGZvciB0aGlzIGNhc2UgdG8gYmUgZXhlY3V0ZWQsIGFuZCB0aGUKLSAgICB2aWV3IGlkIG9mIHRoZSBjb21wb25lbnQgdHJlZSB0aGF0IHNob3VsZCBiZSBzZWxlY3RlZCBuZXh0LgotLS0+Ci08IUVMRU1FTlQgbmF2aWdhdGlvbi1jYXNlIChkZXNjcmlwdGlvbiosIGRpc3BsYXktbmFtZSosIGljb24qLCBmcm9tLWFjdGlvbj8sIGZyb20tb3V0Y29tZT8sIHRvLXZpZXctaWQsIHJlZGlyZWN0Pyk+Ci0KLQotPCEtLQotICAgIFRoZSAibmF2aWdhdGlvbi1ydWxlIiBlbGVtZW50IHJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCBkZWNpc2lvbiBydWxlCi0gICAgdGhhdCB3aWxsIGJlIHV0aWxpemVkIGJ5IHRoZSBkZWZhdWx0IE5hdmlnYXRpb25IYW5kbGVyCi0gICAgaW1wbGVtZW50YXRpb24gdG8gbWFrZSBkZWNpc2lvbnMgb24gd2hhdCB2aWV3IHNob3VsZCBiZSBkaXNwbGF5ZWQKLSAgICBuZXh0LCBiYXNlZCBvbiB0aGUgdmlldyBpZCBiZWluZyBwcm9jZXNzZWQuCi0tLT4KLTwhRUxFTUVOVCBuYXZpZ2F0aW9uLXJ1bGUgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIGZyb20tdmlldy1pZD8sIG5hdmlnYXRpb24tY2FzZSopPgotCi0KLTwhLS0KLSAgICBUaGUgInByb3BlcnR5IiBlbGVtZW50IHJlcHJlc2VudHMgYSBKYXZhQmVhbiBwcm9wZXJ0eSBvZiB0aGUgSmF2YSBjbGFzcwotICAgIHJlcHJlc2VudGVkIGJ5IG91ciBwYXJlbnQgZWxlbWVudC4KLQotICAgIFByb3BlcnR5IG5hbWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIEphdmEgY2xhc3MKLSAgICB0aGF0IGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgZWxlbWVudCwgYW5kIG11c3QgY29ycmVzcG9uZCB0bwotICAgIHByb3BlcnR5IG5hbWVzIHRoYXQgd2lsbCBiZSByZWNvZ25pemVkIHdoZW4gcGVyZm9ybWluZyBpbnRyb3NwZWN0aW9uCi0gICAgYWdhaW5zdCB0aGF0IGNsYXNzIHZpYSBqYXZhLmJlYW5zLkludHJvc3BlY3Rvci4KLS0tPgotPCFFTEVNRU5UIHByb3BlcnR5ICAgICAgICAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgcHJvcGVydHktbmFtZSwgcHJvcGVydHktY2xhc3MsIGRlZmF1bHQtdmFsdWU/LCBzdWdnZXN0ZWQtdmFsdWU/LCBwcm9wZXJ0eS1leHRlbnNpb24qKT4KLQotPCEtLSAKLSAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgcHJvcGVydHkuICBNYXkgY29udGFpbiBpbXBsZW1lbnRhdGlvbgotICAgIHNwZWNpZmljIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBwcm9wZXJ0eS1leHRlbnNpb24gQU5ZPgotCi08IS0tCi0gICAgVGhlICJyZWZlcmVuY2VkLWJlYW4iIGVsZW1lbnQgcmVwcmVzZW50cyBhdCBkZXNpZ24gdGltZSB0aGUgcHJvbWlzZQotICAgIHRoYXQgYSBKYXZhIG9iamVjdCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgd2lsbCBleGlzdCBhdCBydW50aW1lIGluIHNvbWUKLSAgICBzY29wZSwgdW5kZXIgdGhlIHNwZWNpZmllZCBrZXkuICBUaGlzIGNhbiBiZSB1c2VkIGJ5IGRlc2lnbiB0aW1lIHRvb2xzCi0gICAgdG8gY29uc3RydWN0IHVzZXIgaW50ZXJmYWNlIGRpYWxvZ3MgYmFzZWQgb24gdGhlIHByb3BlcnRpZXMgb2YgdGhlCi0gICAgc3BlY2lmaWVkIGNsYXNzLiAgVGhlIHByZXNlbmNlIG9yIGFic2VuY2Ugb2YgYSByZWZlcmVuY2VkIGJlYW4KLSAgICBlbGVtZW50IGhhcyBubyBpbXBhY3Qgb24gdGhlIEphdmFTZXJ2ZXIgRmFjZXMgcnVudGltZSBlbnZpcm9ubWVudAotICAgIGluc2lkZSBhIHdlYiBhcHBsaWNhdGlvbi4KLS0tPgotPCFFTEVNRU5UIHJlZmVyZW5jZWQtYmVhbiAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgcmVmZXJlbmNlZC1iZWFuLW5hbWUsIHJlZmVyZW5jZWQtYmVhbi1jbGFzcyk+Ci0KLQotPCEtLQotICAgIFRoZSAicmVuZGVyLWtpdCIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgUmVuZGVyS2l0IGltcGxlbWVudGF0aW9uCi0gICAgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc3BlY2lmaWVkIHJlbmRlci1raXQtaWQuICBJZiBubwotICAgIHJlbmRlci1raXQtaWQgaXMgc3BlY2lmaWVkLCB0aGUgaWRlbnRpZmllciBvZiB0aGUgZGVmYXVsdCBSZW5kZXJLaXQKLSAgICAoUmVuZGVyS2l0RmFjdG9yeS5ERUZBVUxUX1JFTkRFUl9LSVQpIGlzIGFzc3VtZWQuCi0tLT4KLTwhRUxFTUVOVCByZW5kZXIta2l0ICAgICAgKGRlc2NyaXB0aW9uKiwgZGlzcGxheS1uYW1lKiwgaWNvbiosIHJlbmRlci1raXQtaWQ/LCByZW5kZXIta2l0LWNsYXNzPywgcmVuZGVyZXIqKT4KLQotCi08IS0tCi0gICAgVGhlICJyZW5kZXJlciIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgUmVuZGVyZXIgaW1wbGVtZW50YXRpb24KLSAgICBjbGFzcyB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50IGZhbWlseQotICAgIGFuZCByZW5kZXJlciB0eXBlIGlkZW50aWZpZXJzLCBpbiB0aGUgUmVuZGVyS2l0IGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAgICBwYXJlbnQgInJlbmRlci1raXQiIGVsZW1lbnQuICBDb21iaW5hdGlvbnMgb2YgY29tcG9uZW50IGZhbWlseSBhbmQgcmVuZGVyZXIKLSAgICB0eXBlIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgUmVuZGVyS2l0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFyZW50Ci0gICAgInJlbmRlci1raXQiIGVsZW1lbnQuCi0KLSAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBjb21wb25lbnQgYXR0cmlidXRlcyB0aGF0Ci0gICAgYXJlIHJlY29nbml6ZWQgYnkgdGhpcyByZW5kZXJlci4KLS0tPgotPCFFTEVNRU5UIHJlbmRlcmVyICAgICAgICAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgY29tcG9uZW50LWZhbWlseSwgcmVuZGVyZXItdHlwZSwgcmVuZGVyZXItY2xhc3MsIGZhY2V0KiwgYXR0cmlidXRlKiwgcmVuZGVyZXItZXh0ZW5zaW9uKik+Ci0KLTwhLS0gCi0gICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIHJlbmRlcmVyLiAgTWF5IGNvbnRhaW4gaW1wbGVtZW50YXRpb24KLSAgICBzcGVjaWZpYyBjb250ZW50LgotLS0+Ci08IUVMRU1FTlQgcmVuZGVyZXItZXh0ZW5zaW9uIEFOWT4KLQotPCEtLQotICAgIFRoZSAidmFsaWRhdG9yIiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBWYWxpZGF0b3IgaW1wbGVtZW50YXRpb24KLSAgICBjbGFzcyB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZSBzcGVjaWZpZWQgdmFsaWRhdG9yIGlkZW50aWZpZXIuCi0gICAgVmFsaWRhdG9yIGlkZW50aWZpZXJzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZW50aXJlIHdlYiBhcHBsaWNhdGlvbi4KLQotICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljIGF0dHJpYnV0ZXMgdGhhdCBtYXkgYmUKLSAgICBjb25maWd1cmVkIG9uIHRoZSBjb3JyZXNwb25kaW5nIFVJQ29tcG9uZW50IGluIG9yZGVyIHRvIGFmZmVjdCB0aGUKLSAgICBvcGVyYXRpb24gb2YgdGhlIFZhbGlkYXRvci4gIE5lc3RlZCAicHJvcGVydHkiIGVsZW1lbnRzIGlkZW50aWZ5IEphdmFCZWFucwotICAgIHByb3BlcnRpZXMgb2YgdGhlIFZhbGlkYXRvciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IG1heSBiZSBjb25maWd1cmVkCi0gICAgdG8gYWZmZWN0IHRoZSBvcGVyYXRpb24gb2YgdGhlIFZhbGlkYXRvci4KLS0tPgotPCFFTEVNRU5UIHZhbGlkYXRvciAgICAgICAoZGVzY3JpcHRpb24qLCBkaXNwbGF5LW5hbWUqLCBpY29uKiwgdmFsaWRhdG9yLWlkLCB2YWxpZGF0b3ItY2xhc3MsIGF0dHJpYnV0ZSosIHByb3BlcnR5Kik+Ci0KLQotPCEtLQotICAgIFRoZSAibGlzdC1lbnRyaWVzIiBlbGVtZW50IHJlcHJlc2VudHMgYSBzZXQgb2YgaW5pdGlhbGl6YXRpb24KLSAgICBlbGVtZW50cyBmb3IgYSBtYW5hZ2VkIHByb3BlcnR5IHRoYXQgaXMgYSBqYXZhLnV0aWwuTGlzdCBvciBhbgotICAgIGFycmF5LiAgSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgInZhbHVlLWNsYXNzIiBlbGVtZW50IGNhbiBvcHRpb25hbGx5Ci0gICAgYmUgdXNlZCB0byBkZWNsYXJlIHRoZSBKYXZhIHR5cGUgdG8gd2hpY2ggZWFjaCB2YWx1ZSBzaG91bGQgYmUKLSAgICBjb252ZXJ0ZWQgYmVmb3JlIGFkZGluZyBpdCB0byB0aGUgQ29sbGVjdGlvbi4KLS0tPgotPCFFTEVNRU5UIGxpc3QtZW50cmllcyAgICAodmFsdWUtY2xhc3M/LCAobnVsbC12YWx1ZXx2YWx1ZSkqKT4KLQotCi08IS0tID09PT09PT09PT09PT09PT09PT09IFN1Ym9yZGluYXRlIEVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQotPCEtLQotICAgIFRoZSAiYWN0aW9uLWxpc3RlbmVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBBY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkCi0gICAgZHVyaW5nIHRoZSBJbnZva2UgQXBwbGljYXRpb24gcGhhc2Ugb2YgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBsaWZlY3ljbGUuCi0gICAgSXQgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgYWN0aW9uLWxpc3RlbmVyICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAiYXBwbGljYXRpb24tZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCi0gICAgbmFtZSBvZiB0aGUgY29uY3JldGUgQXBwbGljYXRpb25GYWN0b3J5IGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQKLSAgICB3aWxsIGJlIGNhbGxlZCB3aGVuIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShBUFBMSUNBVElPTl9GQUNUT1JZKSBpcwotICAgIGNhbGxlZC4gSXQgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgYXBwbGljYXRpb24tZmFjdG9yeSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImF0dHJpYnV0ZS1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBKYXZhIHR5cGUgb2YgdGhlIHZhbHVlCi0gICAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYXR0cmlidXRlIG5hbWUuICBJdCBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBhdHRyaWJ1dGUtY2xhc3MgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImF0dHJpYnV0ZS1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIG5hbWUgdW5kZXIgd2hpY2ggdGhlCi0gICAgY29ycmVzcG9uZGluZyB2YWx1ZSB3aWxsIGJlIHN0b3JlZCwgaW4gdGhlIGdlbmVyaWMgYXR0cmlidXRlcyBvZiB0aGUKLSAgICBVSUNvbXBvbmVudCB3ZSBhcmUgcmVsYXRlZCB0by4KLS0tPgotPCFFTEVNRU5UIGF0dHJpYnV0ZS1uYW1lICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAiY29tcG9uZW50LWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgYSBjb25jcmV0ZSBVSUNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gIEl0IG11c3QgYmUgb2YKLSAgICB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgY29tcG9uZW50LWNsYXNzICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJjb21wb25lbnQtZmFtaWx5IiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGNvbXBvbmVudCBmYW1pbHkgZm9yCi0gICAgd2hpY2ggdGhlIFJlbmRlcmVyIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgInJlbmRlcmVyIiBlbGVtZW50IHdpbGwgYmUKLSAgICB1c2VkLgotLS0+Ci08IUVMRU1FTlQgY29tcG9uZW50LWZhbWlseSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImNvbXBvbmVudC10eXBlIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIG5hbWUgdW5kZXIgd2hpY2ggdGhlCi0gICAgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBjbGFzcyBzaG91bGQgYmUgcmVnaXN0ZXJlZC4KLS0tPgotPCFFTEVNRU5UIGNvbXBvbmVudC10eXBlICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAiY29udmVydGVyLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgYSBjb25jcmV0ZSBDb252ZXJ0ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MuICBJdCBtdXN0IGJlIG9mCi0gICAgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIGNvbnZlcnRlci1jbGFzcyAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAiY29udmVydGVyLWZvci1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIGZvciB3aGljaCBhIENvbnZlcnRlciBjbGFzcyB3aWxsIGJlIHJlZ2lzdGVyZWQuICBJdCBtdXN0IGJlIG9mCi0gICAgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIGNvbnZlcnRlci1mb3ItY2xhc3MgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImNvbnZlcnRlci1pZCIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBpZGVudGlmaWVyIHVuZGVyIHdoaWNoIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgQ29udmVydGVyIGNsYXNzIHNob3VsZCBiZSByZWdpc3RlcmVkLgotLS0+Ci08IUVMRU1FTlQgY29udmVydGVyLWlkICAgICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAiZGVmYXVsdC1yZW5kZXIta2l0LWlkIiBlbGVtZW50IGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gZGVmaW5lCi0gICAgYSByZW5kZXJraXQgdG8gYmUgdXNlZCBvdGhlciB0aGFuIHRoZSBzdGFuZGFyZCBvbmUuIAotLS0+Ci08IUVMRU1FTlQgZGVmYXVsdC1yZW5kZXIta2l0LWlkICAgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgIFRoZSAiZGVmYXVsdC1sb2NhbGUiIGVsZW1lbnQgZGVjbGFyZXMgdGhlIGRlZmF1bHQgbG9jYWxlIGZvciB0aGlzCi0gICAgIGFwcGxpY2F0aW9uIGluc3RhbmNlLiAgSXQgbXVzdCBiZSBzcGVjaWZpZWQgYXMKLSAgICAgOmxhbmd1YWdlOltfOmNvdW50cnk6W186dmFyaWFudDpdXSB3aXRob3V0IHRoZSBjb2xvbnMsIGZvciBleGFtcGxlCi0gICAgICJqYV9KUF9TSklTIi4gIFRoZSBzZXBhcmF0b3JzIGJldHdlZW4gdGhlIHNlZ21lbnRzIG1heSBiZSAnLScgb3IKLSAgICAgJ18nLgotLS0+Ci08IUVMRU1FTlQgZGVmYXVsdC1sb2NhbGUgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJkZWZhdWx0LXZhbHVlIiBjb250YWlucyB0aGUgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBvciBhdHRyaWJ1dGUKLSAgICBpbiB3aGljaCB0aGlzIGVsZW1lbnQgcmVzaWRlcy4gIFRoaXMgdmFsdWUgZGlmZmVycyBmcm9tIHRoZQotICAgICJzdWdnZXN0ZWQtdmFsdWUiIGluIHRoYXQgdGhlIHByb3BlcnR5IG9yIGF0dHJpYnV0ZSBtdXN0IHRha2UgdGhlCi0gICAgdmFsdWUsIHdoZXJlYXMgaW4gInN1Z2dlc3RlZC12YWx1ZSIgdGFraW5nIHRoZSB2YWx1ZSBpcyBvcHRpb25hbC4KLS0tPgotPCFFTEVNRU5UIGRlZmF1bHQtdmFsdWUgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJkZXNjcmlwdGlvbiIgZWxlbWVudCBjb250YWlucyBhIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgdGhlIGVsZW1lbnQKLSAgICBpdCBpcyBuZXN0ZWQgaW4sIG9wdGlvbmFsbHkgZmxhZ2dlZCB3aXRoIGEgbGFuZ3VhZ2UgY29kZSB1c2luZyB0aGUKLSAgICAieG1sOmxhbmciIGF0dHJpYnV0ZS4KLS0tPgotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICAgICBBTlk+Ci08IUFUVExJU1QgZGVzY3JpcHRpb24gICAgIHhtbDpsYW5nICAgICAgICAlTGFuZ3VhZ2U7ICAgICAgI0lNUExJRUQ+Ci0KLQotPCEtLQotICAgIFRoZSAiZGlzcGxheS1uYW1lIiBlbGVtZW50IGlzIGEgc2hvcnQgZGVzY3JpcHRpdmUgbmFtZSBkZXNjcmliaW5nIHRoZQotICAgIGVudGl0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQgaXQgaXMgbmVzdGVkIGluLCBpbnRlbmRlZCB0byBiZQotICAgIGRpc3BsYXllZCBieSB0b29scywgYW5kIG9wdGlvbmFsbHkgZmxhZ2dlZCB3aXRoIGEgbGFuZ3VhZ2UgY29kZSB1c2luZwotICAgIHRoZSAieG1sOmxhbmciIGF0dHJpYnV0ZS4KLS0tPgotPCFFTEVNRU5UIGRpc3BsYXktbmFtZSAgICAoI1BDREFUQSk+Ci08IUFUVExJU1QgZGlzcGxheS1uYW1lICAgIHhtbDpsYW5nICAgICAgICAlTGFuZ3VhZ2U7ICAgICAgI0lNUExJRUQ+Ci0KLTwhLS0KLSAgICBUaGUgImZhY2VzLWNvbnRleHQtZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkCi0gICAgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgRmFjZXNDb250ZXh0RmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBjbGFzcwotICAgIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbgotICAgIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShGQUNFU19DT05URVhUX0ZBQ1RPUlkpIGlzIGNhbGxlZC4gSXQgbXVzdAotICAgIGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBmYWNlcy1jb250ZXh0LWZhY3RvcnkgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJmcm9tLWFjdGlvbiIgZWxlbWVudCBjb250YWlucyBhbiBhY3Rpb24gcmVmZXJlbmNlIGV4cHJlc3Npb24KLSAgICB0aGF0IG11c3QgaGF2ZSBiZWVuIGV4ZWN1dGVkIChieSB0aGUgZGVmYXVsdCBBY3Rpb25MaXN0ZW5lciBmb3IgaGFuZGxpbmcKLSAgICBhcHBsaWNhdGlvbiBsZXZlbCBldmVudHMpIGluIG9yZGVyIHRvIHNlbGVjdCB0aGlzIG5hdmlnYXRpb24gcnVsZS4gIElmCi0gICAgbm90IHNwZWNpZmllZCwgdGhpcyBydWxlIHdpbGwgYmUgcmVsZXZhbnQgbm8gbWF0dGVyIHdoaWNoIGFjdGlvbiByZWZlcmVuY2UKLSAgICB3YXMgZXhlY3V0ZWQgKG9yIGlmIG5vIGFjdGlvbiByZWZlcmVuY2Ugd2FzIGV4ZWN1dGVkKS4KLQotICAgIFRoaXMgdmFsdWUgbXVzdCBiZSBvZiB0eXBlICJBY3Rpb24iLgotLS0+Ci08IUVMRU1FTlQgZnJvbS1hY3Rpb24gKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImZyb20tb3V0Y29tZSIgZWxlbWVudCBjb250YWlucyBhIGxvZ2ljYWwgb3V0Y29tZSBzdHJpbmcgcmV0dXJuZWQKLSAgICBieSB0aGUgZXhlY3V0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIGFjdGlvbiBtZXRob2Qgc2VsZWN0ZWQgdmlhIGFuCi0gICAgImFjdGlvblJlZiIgcHJvcGVydHkgKG9yIGEgbGl0ZXJhbCB2YWx1ZSBzcGVjaWZpZWQgYnkgYW4gImFjdGlvbiIKLSAgICBwcm9wZXJ0eSkgb2YgYSBVSUNvbW1hbmQgY29tcG9uZW50LiAgSWYgc3BlY2lmaWVkLCB0aGlzIHJ1bGUgd2lsbCBiZQotICAgIHJlbGV2YW50IG9ubHkgaWYgdGhlIG91dGNvbWUgdmFsdWUgbWF0Y2hlcyB0aGlzIGVsZW1lbnQncyB2YWx1ZS4gIElmCi0gICAgbm90IHNwZWNpZmllZCwgdGhpcyBydWxlIHdpbGwgYmUgcmVsZXZhbnQgbm8gbWF0dGVyIHdoYXQgdGhlIG91dGNvbWUKLSAgICB2YWx1ZSB3YXMuCi0tLT4KLTwhRUxFTUVOVCBmcm9tLW91dGNvbWUgICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImZyb20tdmlldy1pZCIgZWxlbWVudCBjb250YWlucyB0aGUgdmlldyBpZGVudGlmaWVyIG9mIHRoZSB2aWV3Ci0gICAgZm9yIHdoaWNoIHRoZSBjb250YWluaW5nIG5hdmlnYXRpb24gcnVsZSBpcyByZWxldmFudC4gIElmIG5vCi0gICAgImZyb20tdmlldyIgZWxlbWVudCBpcyBzcGVjaWZpZWQsIHRoaXMgcnVsZSBhcHBsaWVzIHRvIG5hdmlnYXRpb24KLSAgICBkZWNpc2lvbnMgb24gYWxsIHZpZXdzLiAgSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIGEgdmFsdWUKLSAgICBvZiAiKiIgaXMgYXNzdW1lZCwgbWVhbmluZyB0aGF0IHRoaXMgbmF2aWdhdGlvbiBydWxlIGFwcGxpZXMgdG8gYWxsCi0gICAgdmlld3MuCi0KLSAgICBUaGlzIHZhbHVlIG11c3QgYmUgb2YgdHlwZSAiVmlld0lkUGF0dGVybiIuCi0tLT4KLTwhRUxFTUVOVCBmcm9tLXZpZXctaWQgICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgImtleSIgZWxlbWVudCBpcyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbWFwIGtleSB0aGF0Ci0gICAgd2lsbCBiZSBzdG9yZWQgaW4gYSBtYW5hZ2VkIHByb3BlcnR5IG9mIHR5cGUgamF2YS51dGlsLk1hcC4gIAotLS0+Ci08IUVMRU1FTlQga2V5ICAgICAgICAgICAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJrZXktY2xhc3MiIGVsZW1lbnQgZGVmaW5lcyB0aGUgSmF2YSB0eXBlIHRvIHdoaWNoIGVhY2ggImtleSIKLSAgICBlbGVtZW50IGluIGEgc2V0IG9mICJtYXAtZW50cnkiIGVsZW1lbnRzIHdpbGwgYmUgY29udmVydGVkIHRvLiAgSXQKLSAgICBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuICBJZiBvbWl0dGVkLCAiamF2YS5sYW5nLlN0cmluZyIKLSAgICBpcyBhc3N1bWVkLgotLS0+Ci08IUVMRU1FTlQga2V5LWNsYXNzICAgICAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJsYXJnZS1pY29uIiBlbGVtZW50IGNvbnRhaW5zIHRoZSByZXNvdXJjZSBwYXRoIHRvIGEgbGFyZ2UgKDMyeDMyKQotICAgIGljb24gaW1hZ2UuICBUaGUgaW1hZ2UgbWF5IGJlIGluIGVpdGhlciBHSUYgb3IgSlBHIGZvcm1hdC4KLS0tPgotPCFFTEVNRU5UIGxhcmdlLWljb24gICAgICAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgImxpZmVjeWNsZS1mYWN0b3J5IiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBMaWZlY3ljbGVGYWN0b3J5IGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQKLSAgICB3aGVuIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShMSUZFQ1lDTEVfRkFDVE9SWSkgaXMgY2FsbGVkLiBJdCBtdXN0IGJlIAotICAgIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBsaWZlY3ljbGUtZmFjdG9yeSAoI1BDREFUQSk+Ci0KLTwhLS0KLSAgICBUaGUgIm1hbmFnZWQtYmVhbi1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLSAgICBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGluc3RhbnRpYXRlIGEgbmV3IGluc3RhbmNlCi0gICAgaWYgY3JlYXRpb24gb2YgdGhlIHNwZWNpZmllZCBtYW5hZ2VkIGJlYW4gaXMgcmVxdWVzdGVkLiAgSXQgbXVzdCBiZSBvZgotICAgIHR5cGUgIkNsYXNzTmFtZSIuCi0KLSAgICBUaGUgc3BlY2lmaWVkIGNsYXNzIG11c3QgY29uZm9ybSB0byBzdGFuZGFyZCBKYXZhQmVhbnMgY29udmVudGlvbnMuCi0gICAgSW4gcGFydGljdWxhciwgaXQgbXVzdCBoYXZlIGEgcHVibGljIHplcm8tYXJndW1lbnRzIGNvbnN0cnVjdG9yLCBhbmQKLSAgICB6ZXJvIG9yIG1vcmUgcHVibGljIHByb3BlcnR5IHNldHRlcnMuCi0tLT4KLTwhRUxFTUVOVCBtYW5hZ2VkLWJlYW4tY2xhc3MgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJtYW5hZ2VkLWJlYW4tbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBhdHRyaWJ1dGUgbmFtZSB1bmRlcgotICAgIHdoaWNoIGEgbWFuYWdlZCBiZWFuIHdpbGwgYmUgc2VhcmNoZWQgZm9yLCBhcyB3ZWxsIGFzIHN0b3JlZCAodW5sZXNzCi0gICAgdGhlICJtYW5hZ2VkLWJlYW4tc2NvcGUiIHZhbHVlIGlzICJub25lIikuICBJdCBtdXN0IGJlIG9mIHR5cGUKLSAgICAiSWRlbnRpZmllciIuCi0tLT4KLTwhRUxFTUVOVCBtYW5hZ2VkLWJlYW4tbmFtZSAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAibWFuYWdlZC1iZWFuLXNjb3BlIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIHNjb3BlIGludG8gd2hpY2ggYSBuZXdseQotICAgIGNyZWF0ZWQgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBtYW5hZ2VkIGJlYW4gd2lsbCBiZSBzdG9yZWQgKHVubGVzcwotICAgIHRoZSB2YWx1ZSBpcyAibm9uZSIpLiAgSXQgbXVzdCBiZSBvZiB0eXBlICJTY29wZU9yTm9uZSIuCi0tLT4KLTwhRUxFTUVOVCBtYW5hZ2VkLWJlYW4tc2NvcGUgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJuYXZpZ2F0aW9uLWhhbmRsZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgdGhlIGNvbmNyZXRlIE5hdmlnYXRpb25IYW5kbGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQKLSAgICBkdXJpbmcgdGhlIEludm9rZSBBcHBsaWNhdGlvbiBwaGFzZSBvZiB0aGUgcmVxdWVzdCBwcm9jZXNzaW5nIGxpZmVjeWNsZSwKLSAgICBpZiB0aGUgZGVmYXVsdCBBY3Rpb25MaXN0ZW5lciAocHJvdmlkZWQgYnkgdGhlIEpTRiBpbXBsZW1lbnRhdGlvbikgaXMgdXNlZC4KLSAgICBJdCBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCBuYXZpZ2F0aW9uLWhhbmRsZXIgKCNQQ0RBVEEpPgotCi08IS0tCi1UaGUgInBoYXNlLWxpc3RlbmVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MKLW5hbWUgb2YgdGhlIGNvbmNyZXRlIFBoYXNlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlCi1yZWdpc3RlcmVkIG9uIHRoZSBMaWZlY3ljbGUuIEl0IG11c3QgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIHBoYXNlLWxpc3RlbmVyICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAicmVkaXJlY3QiIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgbmF2aWdhdGlvbiB0byB0aGUgc3BlY2lmaWVkCi0gICAgInRvLXZpZXctaWQiIHNob3VsZCBiZSBhY2NvbXBsaXNoZWQgYnkgcGVyZm9ybWluZyBhbiBIVFRQIHJlZGlyZWN0Ci0gICAgcmF0aGVyIHRoYW4gdGhlIHVzdWFsIFZpZXdIYW5kbGVyIG1lY2hhbmlzbXMuCi0tLT4KLTwhRUxFTUVOVCByZWRpcmVjdCBFTVBUWT4KLQotPCEtLQotICAgIFRoZSAic3VnZ2VzdGVkLXZhbHVlIiBjb250YWlucyB0aGUgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBvcgotICAgIGF0dHJpYnV0ZSBpbiB3aGljaCB0aGlzIGVsZW1lbnQgcmVzaWRlcy4gIFRoaXMgdmFsdWUgaXMgYWR2aXNvcnkKLSAgICBvbmx5IGFuZCBpcyBpbnRlbmRlZCBmb3IgdG9vbHMgdG8gdXNlIHdoZW4gcG9wdWxhdGluZyBwYWxsZXR0ZXMuCi0tLT4KLTwhRUxFTUVOVCBzdWdnZXN0ZWQtdmFsdWUgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLQotICAgIFRoZSAidmlldy1oYW5kbGVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBWaWV3SGFuZGxlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkCi0gICAgZHVyaW5nIHRoZSBSZXN0b3JlIFZpZXcgYW5kIFJlbmRlciBSZXNwb25zZSBwaGFzZXMgb2YgdGhlIHJlcXVlc3QKLSAgICBwcm9jZXNzaW5nIGxpZmVjeWNsZS4gIFRoZSBmYWNlcyBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYQotICAgIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjbGFzcwotLS0+Ci08IUVMRU1FTlQgdmlldy1oYW5kbGVyICgjUENEQVRBKT4KLQotPCEtLQotCi0gICAgVGhlICJzdGF0ZS1tYW5hZ2VyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIHRoZSBjb25jcmV0ZSBTdGF0ZU1hbmFnZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZAotICAgIGR1cmluZyB0aGUgUmVzdG9yZSBWaWV3IGFuZCBSZW5kZXIgUmVzcG9uc2UgcGhhc2VzIG9mIHRoZSByZXF1ZXN0Ci0gICAgcHJvY2Vzc2luZyBsaWZlY3ljbGUuICBUaGUgZmFjZXMgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGEKLSAgICBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2xhc3MKLS0tPgotPCFFTEVNRU5UIHN0YXRlLW1hbmFnZXIgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJudWxsLXZhbHVlIiBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoZSBtYW5hZ2VkIHByb3BlcnR5IGluIHdoaWNoIHdlCi0gICAgYXJlIG5lc3RlZCB3aWxsIGJlIGV4cGxpY2l0bHkgc2V0IHRvIG51bGwgaWYgb3VyIG1hbmFnZWQgYmVhbiBpcwotICAgIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4gIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gb21pdHRpbmcgdGhlIG1hbmFnZWQKLSAgICBwcm9wZXJ0eSBlbGVtZW50IGVudGlyZWx5LCB3aGljaCB3aWxsIGNhdXNlIG5vIHByb3BlcnR5IHNldHRlciB0byBiZQotICAgIGNhbGxlZCBmb3IgdGhpcyBwcm9wZXJ0eS4KLQotICAgIFRoZSAibnVsbC12YWx1ZSIgZWxlbWVudCBjYW4gb25seSBiZSB1c2VkIHdoZW4gdGhlIGFzc29jaWF0ZWQKLSAgICAicHJvcGVydHktY2xhc3MiIGlkZW50aWZpZXMgYSBKYXZhIGNsYXNzLCBub3QgYSBKYXZhIHByaW1pdGl2ZS4KLS0tPgotPCFFTEVNRU5UIG51bGwtdmFsdWUgRU1QVFk+Ci0KLQotPCEtLQotICAgIFRoZSAicHJvcGVydHktY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgSmF2YSB0eXBlIG9mIHRoZSB2YWx1ZQotICAgIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb3BlcnR5IG5hbWUuICBJdCBtdXN0IGJlIG9mIHR5cGUgIkphdmFUeXBlIi4KLSAgICBJZiBub3Qgc3BlY2lmaWVkLCBpdCBjYW4gYmUgaW5mZXJyZWQgZnJvbSBleGlzdGluZyBjbGFzc2VzOyBob3dldmVyLAotICAgIHRoaXMgZWxlbWVudCBzaG91bGQgYmUgc3BlY2lmaWVkIGlmIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgZ29pbmcKLSAgICB0byBiZSB0aGUgc291cmNlIGZvciBnZW5lcmF0aW5nIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzZXMuCi0tLT4KLTwhRUxFTUVOVCBwcm9wZXJ0eS1jbGFzcyAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInByb3BlcnR5LW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgSmF2YUJlYW5zIHByb3BlcnR5IG5hbWUKLSAgICB1bmRlciB3aGljaCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBtYXkgYmUgc3RvcmVkLgotLS0+Ci08IUVMRU1FTlQgcHJvcGVydHktbmFtZSAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJwcm9wZXJ0eS1yZXNvbHZlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiB0aGUgY29uY3JldGUgUHJvcGVydHlSZXNvbHZlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgdXNlZAotICAgIGR1cmluZyB0aGUgcHJvY2Vzc2luZyBvZiB2YWx1ZSBiaW5kaW5nIGV4cHJlc3Npb25zLgotICAgIEl0IG11c3QgYmUgb2YgdHlwZSAiQ2xhc3NOYW1lIi4KLS0tPgotPCFFTEVNRU5UIHByb3BlcnR5LXJlc29sdmVyICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJyZWZlcmVuY2VkLWJlYW4tY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCi0gICAgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyAoZWl0aGVyIGFic3RyYWN0IG9yIGNvbmNyZXRlKSBvciBKYXZhIGludGVyZmFjZQotICAgIGltcGxlbWVudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHJlZmVyZW5jZWQgYmVhbi4gIEl0IG11c3QgYmUgb2YgdHlwZQotICAgICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgcmVmZXJlbmNlZC1iZWFuLWNsYXNzICAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAicmVmZXJlbmNlZC1iZWFuLW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgYXR0cmlidXRlIG5hbWUgdW5kZXIKLSAgICB3aGljaCB0aGUgY29ycmVzcG9uZGluZyByZWZlcmVuY2VkIGJlYW4gbWF5IGJlIGFzc3VtZWQgdG8gYmUgc3RvcmVkLAotICAgIGluIG9uZSBvZiB0aGUgc2NvcGVzIGRlZmluZWQgYnkgdGhlICJTY29wZSIgdHlwZS4gIEl0IG11c3QgYmUgb2YgdHlwZQotICAgICJJZGVudGlmaWVyIi4KLS0tPgotPCFFTEVNRU5UIHJlZmVyZW5jZWQtYmVhbi1uYW1lICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJyZW5kZXIta2l0LWlkIiBlbGVtZW50IHJlcHJlc2VudHMgYW4gaWRlbnRpZmllciBmb3IgdGhlCi0gICAgUmVuZGVyS2l0IHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgInJlbmRlci1raXQiIGVsZW1lbnQuCi0tLT4KLTwhRUxFTUVOVCByZW5kZXIta2l0LWlkICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInJlbmRlci1raXQtY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiBhIGNvbmNyZXRlIFJlbmRlcktpdCBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gIEl0IG11c3QgYmUgb2YKLSAgICB0eXBlICJDbGFzc05hbWUiLgotLS0+Ci08IUVMRU1FTlQgcmVuZGVyLWtpdC1jbGFzcyAoI1BDREFUQSk+Ci0KLQotPCEtLQotICAgIFRoZSAicmVuZGVyZXItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICBvZiBhIGNvbmNyZXRlIFJlbmRlcmVyIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgSXQgbXVzdCBiZSBvZgotICAgIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCByZW5kZXJlci1jbGFzcyAgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJyZW5kZXIta2l0LWZhY3RvcnkiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgdGhlIGNvbmNyZXRlIFJlbmRlcktpdEZhY3RvcnkgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZAotICAgIHdoZW4gRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KFJFTkRFUl9LSVRfRkFDVE9SWSkgaXMgY2FsbGVkLiBJdCBtdXN0IGJlIAotICAgIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCByZW5kZXIta2l0LWZhY3RvcnkgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJyZW5kZXJlci10eXBlIiBlbGVtZW50IHJlcHJlc2VudHMgYSByZW5kZXJlciB0eXBlIGlkZW50aWZpZXIgZm9yIHRoZQotICAgIFJlbmRlcmVyIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgInJlbmRlcmVyIiBlbGVtZW50LgotLS0+Ci08IUVMRU1FTlQgcmVuZGVyZXItdHlwZSAgICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAic21hbGwtaWNvbiIgZWxlbWVudCBjb250YWlucyB0aGUgcmVzb3VyY2UgcGF0aCB0byBhIGxhcmdlICgxNngxNikKLSAgICBpY29uIGltYWdlLiAgVGhlIGltYWdlIG1heSBiZSBpbiBlaXRoZXIgR0lGIG9yIEpQRyBmb3JtYXQuCi0tLT4KLTwhRUxFTUVOVCBzbWFsbC1pY29uICAgICAgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgIFRoZSAic3VwcG9ydGVkLWxvY2FsZSIgZWxlbWVudCBhbGxvd3MgYXV0aG9ycyB0byBkZWNsYXJlIHdoaWNoCi0gICAgIGxvY2FsZXMgYXJlIHN1cHBvcnRlZCBpbiB0aGlzIGFwcGxpY2F0aW9uIGluc3RhbmNlLgotCi0gICAgIEl0IG11c3QgYmUgc3BlY2lmaWVkIGFzIDpsYW5ndWFnZTpbXzpjb3VudHJ5OltfOnZhcmlhbnQ6XV0gd2l0aG91dAotICAgICB0aGUgY29sb25zLCBmb3IgZXhhbXBsZSAiamFfSlBfU0pJUyIuICBUaGUgc2VwYXJhdG9ycyBiZXR3ZWVuIHRoZQotICAgICBzZWdtZW50cyBtYXkgYmUgJy0nIG9yICdfJy4KLS0tPgotPCFFTEVNRU5UIHN1cHBvcnRlZC1sb2NhbGUgKCNQQ0RBVEEpPgotCi08IS0tCi0gICAgVGhlICJ0by12aWV3IiBlbGVtZW50IGNvbnRhaW5zIHRoZSB2aWV3IGlkZW50aWZpZXIgb2YgdGhlIG5leHQgdmlldwotICAgIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpZiB0aGlzIG5hdmlnYXRpb24gcnVsZSBpcyBtYXRjaGVkLiAgSXQKLSAgICBtdXN0IGJlIG9mIHR5cGUgIlZpZXdJZCIuCi0tLT4KLTwhRUxFTUVOVCB0by12aWV3LWlkICAgICAgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInZhbGlkYXRvci1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICAgIG9mIGEgY29uY3JldGUgVmFsaWRhdG9yIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgSXQgbXVzdCBiZSBvZgotICAgIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCB2YWxpZGF0b3ItY2xhc3MgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInZhbGlkYXRvci1pZCIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBpZGVudGlmaWVyIHVuZGVyIHdoaWNoIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgVmFsaWRhdG9yIGNsYXNzIHNob3VsZCBiZSByZWdpc3RlcmVkLgotLS0+Ci08IUVMRU1FTlQgdmFsaWRhdG9yLWlkICAgICgjUENEQVRBKT4KLQotCi08IS0tCi0gICAgVGhlICJ2YWx1ZSIgZWxlbWVudCBpcyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbGl0ZXJhbAotICAgIHZhbHVlIHRvIHdoaWNoIGEgc2NhbGFyIG1hbmFnZWQgcHJvcGVydHkgd2lsbCBiZSBzZXQsIG9yIGEgdmFsdWUKLSAgICBiaW5kaW5nIGV4cHJlc3Npb24gKCIjey4uLn0iKSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlCi0gICAgcmVxdWlyZWQgdmFsdWUuICBJdCB3aWxsIGJlIGNvbnZlcnRlZCBhcyBzcGVjaWZpZWQgZm9yIHRoZSBhY3R1YWwKLSAgICBwcm9wZXJ0eSB0eXBlLgotLS0+Ci08IUVMRU1FTlQgdmFsdWUgKCNQQ0RBVEEpPgotCi0KLTwhLS0KLSAgICBUaGUgInZhbHVlLWNsYXNzIiBlbGVtZW50IGRlZmluZXMgdGhlIEphdmEgdHlwZSB0byB3aGljaCBlYWNoCi0gICAgInZhbHVlIiBlbGVtZW50J3MgdmFsdWUgd2lsbCBiZSBjb252ZXJ0ZWQgdG8sIHByaW9yIHRvIGFkZGluZyBpdCB0bwotICAgIHRoZSAibGlzdC1lbnRyaWVzIiBsaXN0IGZvciBhIG1hbmFnZWQgcHJvcGVydHkgdGhhdCBpcyBhCi0gICAgamF2YS51dGlsLkxpc3QsIG9yIGEgIm1hcC1lbnRyaWVzIiBtYXAgZm9yIGEgbWFuYWdlZCBwcm9wZXJ0eSB0aGF0Ci0gICAgaXMgYSBqYXZhLnV0aWwuTWFwLiAgSXQgbXVzdCBiZSBvZiB0eXBlICJDbGFzc05hbWUiLiAgSWYgb21pdHRlZCwKLSAgICAiamF2YS5sYW5nLlN0cmluZyIgaXMgYXNzdW1lZC4KLS0tPgotPCFFTEVNRU5UIHZhbHVlLWNsYXNzICgjUENEQVRBKT4KLQotPCEtLQotICAgIFRoZSAidmFyaWFibGUtcmVzb2x2ZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgb2YgdGhlIGNvbmNyZXRlIFZhcmlhYmxlUmVzb2x2ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQKLSAgICBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YgdmFsdWUgYmluZGluZyBleHByZXNzaW9ucy4KLSAgICBJdCBtdXN0IGJlIG9mIHR5cGUgIkNsYXNzTmFtZSIuCi0tLT4KLTwhRUxFTUVOVCB2YXJpYWJsZS1yZXNvbHZlciAoI1BDREFUQSk+Ci0KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IElkZW50aWZpZXIgQXR0cmlidXRlcyA9PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi08IUFUVExJU1QgYWN0aW9uLWxpc3RlbmVyICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGFwcGxpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhcHBsaWNhdGlvbi1mYWN0b3J5ICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXR0cmlidXRlICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGF0dHJpYnV0ZS1jbGFzcyAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBhdHRyaWJ1dGUtZXh0ZW5zaW9uICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYXR0cmlidXRlLW5hbWUgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbXBvbmVudCAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb21wb25lbnQtY2xhc3MgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29tcG9uZW50LWV4dGVuc2lvbiAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbXBvbmVudC1mYW1pbHkgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb21wb25lbnQtdHlwZSAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29udmVydGVyICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGNvbnZlcnRlci1jbGFzcyAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBjb252ZXJ0ZXItZm9yLWNsYXNzICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgY29udmVydGVyLWlkICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlZmF1bHQtbG9jYWxlICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkZWZhdWx0LXJlbmRlci1raXQtaWQgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZGVmYXVsdC12YWx1ZSAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBkaXNwbGF5LW5hbWUgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZmFjZXMtY29uZmlnICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZhY2VzLWNvbnRleHQtZmFjdG9yeSAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmYWNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZmFjZXQtZXh0ZW5zaW9uICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZhY2V0LW5hbWUgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmYWN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgZnJvbS1hY3Rpb24gICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGZyb20tb3V0Y29tZSAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBmcm9tLXZpZXctaWQgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgaWNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBrZXktY2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGFyZ2UtaWNvbiAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxpZmVjeWNsZSAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBsaWZlY3ljbGUtZmFjdG9yeSAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbGlzdC1lbnRyaWVzICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxvY2FsZS1jb25maWcgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtYW5hZ2VkLWJlYW4gICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWFuYWdlZC1iZWFuLWNsYXNzICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1hbmFnZWQtYmVhbi1uYW1lICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtYW5hZ2VkLWJlYW4tc2NvcGUgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWFuYWdlZC1wcm9wZXJ0eSAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG1hcC1lbnRyaWVzICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBtYXAtZW50cnkgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbWVzc2FnZS1idW5kbGUgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG5hdmlnYXRpb24tY2FzZSAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBuYXZpZ2F0aW9uLWhhbmRsZXIgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgbmF2aWdhdGlvbi1ydWxlICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIG51bGwtdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwaGFzZS1saXN0ZW5lciAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcHJvcGVydHkgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHByb3BlcnR5LWNsYXNzICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBwcm9wZXJ0eS1leHRlbnNpb24gICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcHJvcGVydHktbmFtZSAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHByb3BlcnR5LXJlc29sdmVyICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWRpcmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVmZXJlbmNlZC1iZWFuICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlZmVyZW5jZWQtYmVhbi1jbGFzcyAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZWZlcmVuY2VkLWJlYW4tbmFtZSAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVuZGVyLWtpdCAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbmRlci1raXQtY2xhc3MgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW5kZXIta2l0LWZhY3RvcnkgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVuZGVyLWtpdC1pZCAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbmRlcmVyICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCByZW5kZXJlci1jbGFzcyAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgcmVuZGVyZXItZXh0ZW5zaW9uICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlbmRlcmVyLXR5cGUgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzbWFsbC1pY29uICAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1Qgc3RhdGUtbWFuYWdlciAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHN1Z2dlc3RlZC12YWx1ZSAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzdXBwb3J0ZWQtbG9jYWxlICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdG8tdmlldy1pZCAgICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZhbGlkYXRvciAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB2YWxpZGF0b3ItY2xhc3MgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdmFsaWRhdG9yLWlkICAgICAgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB2YWx1ZS1jbGFzcyAgICAgICAgICAgICAgICAgICAgICAgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdmFyaWFibGUtcmVzb2x2ZXIgICAgICAgICAgICAgICAgIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHZpZXctaGFuZGxlciAgICAgICAgICAgICAgICAgICAgICBpZCBJRCAjSU1QTElFRD4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMV8yLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODU3ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMV8yLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDIwNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbiA9ICIxLjAiIGVuY29kaW5nID0gIlVURi04Ij8+Ci0KLTx4c2Q6c2NoZW1hCi0gICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICB4bWxuczpqYXZhZWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgeG1sbnM6eG1sPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0gICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgIHZlcnNpb249IjEuMiI+Ci0KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICRJZDogd2ViLWZhY2VzY29uZmlnXzFfMi54c2QsdiAxLjEgMjAwNy8wNS8yNSAyMToxMjo0OSBkYXZpZF93aWxsaWFtcyBFeHAgJAotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgCi0gICAgICAgICAgICA5MDEgU2FuIEFudG9uaW8gUm9hZCwgCi0gICAgICAgICAgICBQYWxvIEFsdG8sIENhbGlmb3JuaWEgOTQzMDMsIFUuUy5BLiAKLSAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgICAgICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSAKLSAgICAgICAgICAgIHJpZ2h0cyByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKYXZhIEVFLAotICAgICAgICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICA8IVtDREFUQVsKLQotICAgICAgICAgICAgVGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBKYXZhU2VydmVyIEZhY2VzIEFwcGxpY2F0aW9uCi0gICAgICAgICAgICBDb25maWd1cmF0aW9uIEZpbGUgKFZlcnNpb24gMS4yKS4KLQotICAgICAgICAgICAgQWxsIEphdmFTZXJ2ZXIgRmFjZXMgY29uZmlndXJhdGlvbiBmaWxlcyBtdXN0IGluZGljYXRlCi0gICAgICAgICAgICB0aGUgSmF2YVNlcnZlciBGYWNlcyBzY2hlbWEgYnkgaW5kaWNhdGluZyB0aGUgSmF2YVNlcnZlcgotICAgICAgICAgICAgRmFjZXMgbmFtZXNwYWNlOgotCi0gICAgICAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLQotICAgICAgICAgICAgYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieQotICAgICAgICAgICAgdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotICAgICAgICAgICAgPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Ii4uLiIKLSAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj0iMS4yIj4KLSAgICAgICAgICAgICAgICAuLi4KLSAgICAgICAgICAgIDwvZmFjZXMtY29uZmlnPgotCi0gICAgICAgICAgICBUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkCi0gICAgICAgICAgICB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgdXNpbmcgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZQotICAgICAgICAgICAgZm9yIGphdmFlZSBuYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotCi0gICAgICAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QKLQotICAgICAgICAgICAgXV0+Ci0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqYXZhZWVfNS54c2QiLz4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lID0gImZhY2VzLWNvbmZpZyIgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZ1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImZhY2VzLWNvbmZpZyIgZWxlbWVudCBpcyB0aGUgcm9vdCBvZiB0aGUgY29uZmlndXJhdGlvbgotICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGhpZXJhcmNoeSwgYW5kIGNvbnRhaW5zIG5lc3RlZCBlbGVtZW50cyBmb3IgYWxsCi0gICAgICAgICAgICAgICAgb2YgdGhlIG90aGVyIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDp1bmlxdWUgbmFtZT0iZmFjZXMtY29uZmlnLWNvbnZlcnRlci1JRC11bmlxdWVuZXNzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgQ29udmVydGVyIElEcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBkb2N1bWVudC4KLQotICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqYXZhZWU6Y29udmVydGVyIi8+Ci0gICAgICAgICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqYXZhZWU6Y29udmVydGVyLWlkIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJmYWNlcy1jb25maWctY29udmVydGVyLWZvci1jbGFzcy11bmlxdWVuZXNzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgJ2NvbnZlcnRlci1mb3ItY2xhc3MnIGVsZW1lbnQgdmFsdWVzIG11c3QgYmUgdW5pcXVlCi0gICAgICAgICAgICAgICAgICAgIHdpdGhpbiBhIGRvY3VtZW50LgotCi0gICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpjb252ZXJ0ZXItZm9yLWNsYXNzIi8+Ci0gICAgICAgIDwveHNkOnVuaXF1ZT4KLQotICAgICAgICA8eHNkOnVuaXF1ZSBuYW1lPSJmYWNlcy1jb25maWctdmFsaWRhdG9yLUlELXVuaXF1ZW5lc3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3IgSURzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIGRvY3VtZW50LgotCi0gICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTp2YWxpZGF0b3IiLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTp2YWxpZGF0b3ItaWQiLz4KLSAgICAgICAgPC94c2Q6dW5pcXVlPgotCi0gICAgICAgIDx4c2Q6dW5pcXVlIG5hbWU9ImZhY2VzLWNvbmZpZy1tYW5hZ2VkLWJlYW4tbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgTWFuYWdlZCBiZWFuIG5hbWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIGRvY3VtZW50LgotCi0gICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTptYW5hZ2VkLWJlYW4iLz4KLSAgICAgICAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTptYW5hZ2VkLWJlYW4tbmFtZSIvPgotICAgICAgICA8L3hzZDp1bmlxdWU+Ci0gICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAiZmFjZXMtY29uZmlnIiBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gaGllcmFyY2h5LCBhbmQgY29udGFpbnMgbmVzdGVkIGVsZW1lbnRzIGZvciBhbGwKLSAgICAgICAgICAgICAgICBvZiB0aGUgb3RoZXIgY29uZmlndXJhdGlvbiBzZXR0aW5ncy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1hcHBsaWNhdGlvblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmYWN0b3J5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctZmFjdG9yeVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1jb21wb25lbnRUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctY29udmVydGVyVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbmFnZWQtYmVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW1hbmFnZWQtYmVhblR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYXZpZ2F0aW9uLXJ1bGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1uYXZpZ2F0aW9uLXJ1bGVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlZC1iZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctcmVmZXJlbmNlZC1iZWFuVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbmRlci1raXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1yZW5kZXIta2l0VHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpZmVjeWNsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWxpZmVjeWNsZVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3IiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy12YWxpZGF0b3JUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmFjZXMtY29uZmlnLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiaWQiIHR5cGUgPSAieHNkOklEIi8+Ci0gICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctdmVyc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lID0gImZhY2VzLWNvbmZpZy1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGZhY2VzLWNvbmZpZy4gIEl0IG1heSBjb250YWluCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctYXBwbGljYXRpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJhcHBsaWNhdGlvbiIgZWxlbWVudCBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byBkZWZpbmUgdGhlCi0gICAgICAgICAgICAgICAgdmFyaW91cyBwZXItYXBwbGljYXRpb24tc2luZ2xldG9uIGltcGxlbWVudGF0aW9uIGFydGlmYWN0cyBmb3IKLSAgICAgICAgICAgICAgICBhIHBhcnRpY3VsYXIgd2ViIGFwcGxpY2F0aW9uIHRoYXQgaXMgdXRpbGl6aW5nIAotICAgICAgICAgICAgICAgIEphdmFTZXJ2ZXIgRmFjZXMuICBGb3IgbmVzdGVkIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBzcGVjaWZpZWQsIAotICAgICAgICAgICAgICAgIHRoZSBKU0YgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGEgc3VpdGFibGUgZGVmYXVsdC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY3Rpb24tbGlzdGVuZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiYWN0aW9uLWxpc3RlbmVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCBkdXJpbmcgdGhlIEludm9rZSBBcHBsaWNhdGlvbiBwaGFzZSBvZiB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCBwcm9jZXNzaW5nIGxpZmVjeWNsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LXJlbmRlci1raXQtaWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJkZWZhdWx0LXJlbmRlci1raXQtaWQiIGVsZW1lbnQgYWxsb3dzIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiB0byBkZWZpbmUgYSByZW5kZXJraXQgdG8gYmUgdXNlZCBvdGhlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGFuIHRoZSBzdGFuZGFyZCBvbmUuIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtYnVuZGxlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBiYXNlIG5hbWUgb2YgYSByZXNvdXJjZSBidW5kbGUgcmVwcmVzZW50aW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtZXNzYWdlIHJlc291cmNlcyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gIFNlZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgSmF2YURvY3MgZm9yIHRoZSAiamF2YS51dGlsLlJlc291cmNlQnVuZGxlIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgc3ludGF4IG9mIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlIGJ1bmRsZSBuYW1lcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYXZpZ2F0aW9uLWhhbmRsZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAibmF2aWdhdGlvbi1oYW5kbGVyIiBlbGVtZW50IGNvbnRhaW5zIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF2aWdhdGlvbkhhbmRsZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNhbGxlZCBkdXJpbmcgdGhlIEludm9rZSBBcHBsaWNhdGlvbiBwaGFzZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgcmVxdWVzdCBwcm9jZXNzaW5nIGxpZmVjeWNsZSwgaWYgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgQWN0aW9uTGlzdGVuZXIgKHByb3ZpZGVkIGJ5IHRoZSBKU0YgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24pIGlzIHVzZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmlldy1oYW5kbGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgInZpZXctaGFuZGxlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlIFZpZXdIYW5kbGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQgZHVyaW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBSZXN0b3JlIFZpZXcgYW5kIFJlbmRlciBSZXNwb25zZSBwaGFzZXMgb2YgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgcHJvY2Vzc2luZyBsaWZlY3ljbGUuICBUaGUgZmFjZXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGEgZGVmYXVsdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0YXRlLW1hbmFnZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAic3RhdGUtbWFuYWdlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlIFN0YXRlTWFuYWdlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgY2FsbGVkIGR1cmluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgUmVzdG9yZSBWaWV3IGFuZCBSZW5kZXIgUmVzcG9uc2UgcGhhc2VzIG9mIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0IHByb2Nlc3NpbmcgbGlmZWN5Y2xlLiAgVGhlIGZhY2VzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBhIGRlZmF1bHQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjbGFzcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbC1yZXNvbHZlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJlbC1yZXNvbHZlciIgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5lbC5FTFJlc29sdmVyIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIHVzZWQgZHVyaW5nIHRoZSBwcm9jZXNzaW5nIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUwgZXhwcmVzc2lvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHktcmVzb2x2ZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicHJvcGVydHktcmVzb2x2ZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVJlc29sdmVyIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIGR1cmluZyB0aGUgcHJvY2Vzc2luZyBvZiB2YWx1ZSBiaW5kaW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlLXJlc29sdmVyIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAidmFyaWFibGUtcmVzb2x2ZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlUmVzb2x2ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgZHVyaW5nIHRoZSBwcm9jZXNzaW5nIG9mIHZhbHVlIGJpbmRpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCAKLSAgICAgICAgICAgICAgICBuYW1lPSJsb2NhbGUtY29uZmlnIgotICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbG9jYWxlLWNvbmZpZ1R5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCAKLSAgICAgICAgICAgICAgICBuYW1lPSJyZXNvdXJjZS1idW5kbGUiCi0gICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1hcHBsaWNhdGlvbi1yZXNvdXJjZS1idW5kbGVUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXBwbGljYXRpb24tZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctYXBwbGljYXRpb24tZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJpZCIgdHlwZSA9ICJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWFwcGxpY2F0aW9uLXJlc291cmNlLWJ1bmRsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgVGhlIHJlc291cmNlLWJ1bmRsZSBlbGVtZW50IGluc2lkZSB0aGUgYXBwbGljYXRpb24gZWxlbWVudAotICAgICAgICAgICAgICByZWZlcmVuY2VzIGEgamF2YS51dGlsLlJlc291cmNlQnVuZGxlIGluc3RhbmNlIGJ5IG5hbWUKLSAgICAgICAgICAgICAgdXNpbmcgdGhlIHZhciBlbGVtZW50LiAgUmVzb3VyY2VCdW5kbGVzIHJlZmVyZW5jZWQgaW4gdGhpcwotICAgICAgICAgICAgICBtYW5uZXIgbWF5IGJlIHJldHVybmVkIGJ5IGEgY2FsbCB0bwotICAgICAgICAgICAgICBBcHBsaWNhdGlvbi5nZXRSZXNvdXJjZUJ1bmRsZSgpIHBhc3NpbmcgdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgRmFjZXNDb250ZXh0IGZvciB0aGlzIHJlcXVlc3QgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgdmFyCi0gICAgICAgICAgICAgIGVsZW1lbnQgYmVsb3cuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2UtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgYnkgd2hpY2ggdGhpcyBSZXNvdXJjZUJ1bmRsZSBpbnN0YW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgaXMgcmV0cmlldmVkIGJ5IGEgY2FsbCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb24uZ2V0UmVzb3VyY2VCdW5kbGUoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lID0gImZhY2VzLWNvbmZpZy1hcHBsaWNhdGlvbi1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGFwcGxpY2F0aW9uLiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLWZhY3RvcnlUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJmYWN0b3J5IiBlbGVtZW50IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIGRlZmluZSB0aGUgCi0gICAgICAgICAgICAgICAgdmFyaW91cyBGYWN0b3JpZXMgdGhhdCBjb21wcmlzZSBwYXJ0cyBvZiB0aGUgaW1wbGVtZW50YXRpb24gCi0gICAgICAgICAgICAgICAgb2YgSmF2YVNlcnZlciBGYWNlcy4gIEZvciBuZXN0ZWQgZWxlbWVudHMgdGhhdCBhcmUgbm90IAotICAgICAgICAgICAgICAgIHNwZWNpZmllZCwgdGhlIEpTRiBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYSBzdWl0YWJsZSAKLSAgICAgICAgICAgICAgICBkZWZhdWx0LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFwcGxpY2F0aW9uLWZhY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJhcHBsaWNhdGlvbi1mYWN0b3J5IiBlbGVtZW50IGNvbnRhaW5zIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uRmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgCi0gICAgICAgICAgICAgICAgICAgICAgICBiZSBjYWxsZWQgd2hlbiAKLSAgICAgICAgICAgICAgICAgICAgICAgIEZhY3RvcnlGaW5kZXIuZ2V0RmFjdG9yeShBUFBMSUNBVElPTl9GQUNUT1JZKSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhY2VzLWNvbnRleHQtZmFjdG9yeSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImZhY2VzLWNvbnRleHQtZmFjdG9yeSIgZWxlbWVudCBjb250YWlucyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb25jcmV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXNDb250ZXh0RmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNhbGxlZCB3aGVuIAotICAgICAgICAgICAgICAgICAgICAgICAgRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KEZBQ0VTX0NPTlRFWFRfRkFDVE9SWSkgCi0gICAgICAgICAgICAgICAgICAgICAgICBpcyBjYWxsZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlmZWN5Y2xlLWZhY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImxpZmVjeWNsZS1mYWN0b3J5IiBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseQotICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlIExpZmVjeWNsZUZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbgotICAgICAgICAgICAgICAgICAgICAgICAgRmFjdG9yeUZpbmRlci5nZXRGYWN0b3J5KExJRkVDWUNMRV9GQUNUT1JZKSBpcyBjYWxsZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdC1mYWN0b3J5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJyZW5kZXIta2l0LWZhY3RvcnkiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29uY3JldGUgUmVuZGVyS2l0RmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5RmluZGVyLmdldEZhY3RvcnkoUkVOREVSX0tJVF9GQUNUT1JZKSBpcyAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZC4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhY3RvcnktZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctZmFjdG9yeS1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWUgPSAiaWQiIHR5cGUgPSAieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLWZhY3RvcnktZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBmYWN0b3J5LiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1hdHRyaWJ1dGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJhdHRyaWJ1dGUiIGVsZW1lbnQgcmVwcmVzZW50cyBhIG5hbWVkLCB0eXBlZCwgdmFsdWUKLSAgICAgICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcmVudCBVSUNvbXBvbmVudCB2aWEgdGhlIGdlbmVyaWMKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzIG1lY2hhbmlzbS4KLQotICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSBuYW1lcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBwYXJlbnQKLSAgICAgICAgICAgICAgICAob3IgcmVsYXRlZCkgY29tcG9uZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJhdHRyaWJ1dGUtbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBuYW1lIHVuZGVyIAotICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgd2lsbCBiZSBzdG9yZWQsIGluIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMgYXR0cmlidXRlcyBvZiB0aGUgVUlDb21wb25lbnQgd2UgYXJlIHJlbGF0ZWQgCi0gICAgICAgICAgICAgICAgICAgICAgICB0by4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiYXR0cmlidXRlLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIEphdmEgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGF0dHJpYnV0ZSBuYW1lLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWRlZmF1bHQtdmFsdWVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN1Z2dlc3RlZC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXN1Z2dlc3RlZC12YWx1ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWF0dHJpYnV0ZS1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZSA9ICJpZCIgdHlwZSA9ICJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZSA9ICJmYWNlcy1jb25maWctYXR0cmlidXRlLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgYXR0cmlidXRlLiAgSXQgbWF5IGNvbnRhaW4gCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWNvbXBvbmVudFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgImNvbXBvbmVudCIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgVUlDb21wb25lbnQKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZQotICAgICAgICAgICAgICAgIHNwZWNpZmllZCB0eXBlIGlkZW50aWZpZXIsIGFsb25nIHdpdGggaXRzIGFzc29jaWF0ZWQgCi0gICAgICAgICAgICAgICAgcHJvcGVydGllcyBhbmQgYXR0cmlidXRlcy4gIENvbXBvbmVudCB0eXBlcyBtdXN0IGJlIHVuaXF1ZSAKLSAgICAgICAgICAgICAgICB3aXRoaW4gdGhlIGVudGlyZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICAgICAgICAgICAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBhdHRyaWJ1dGVzIHRoYXQgCi0gICAgICAgICAgICAgICAgYXJlIHJlY29nbml6ZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIGxvZ2ljIG9mIHRoaXMgY29tcG9uZW50LgotICAgICAgICAgICAgICAgIE5lc3RlZCAicHJvcGVydHkiIGVsZW1lbnRzIGlkZW50aWZ5IEphdmFCZWFucyBwcm9wZXJ0aWVzIG9mIAotICAgICAgICAgICAgICAgIHRoZSBjb21wb25lbnQgY2xhc3MgdGhhdCBtYXkgYmUgZXhwb3NlZCBmb3IgbWFuaXB1bGF0aW9uIAotICAgICAgICAgICAgICAgIHZpYSB0b29scy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiY29tcG9uZW50LXR5cGUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgbmFtZSB1bmRlciAKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIFVJQ29tcG9uZW50IGNsYXNzIHNob3VsZCBiZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImNvbXBvbmVudC1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY29uY3JldGUgVUlDb21wb25lbnQgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhY2V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctZmFjZXRUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWF0dHJpYnV0ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1wcm9wZXJ0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWNvbXBvbmVudC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctY29tcG9uZW50LWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGNvbXBvbmVudC4gIEl0IG1heSBjb250YWluIAotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctZGVmYXVsdC1sb2NhbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJkZWZhdWx0LWxvY2FsZSIgZWxlbWVudCBkZWNsYXJlcyB0aGUgZGVmYXVsdCBsb2NhbGUgCi0gICAgICAgICAgICAgICAgZm9yIHRoaXMgYXBwbGljYXRpb24gaW5zdGFuY2UuCi0KLSAgICAgICAgICAgICAgICBJdCBtdXN0IGJlIHNwZWNpZmllZCBhcyA6bGFuZ3VhZ2U6W186Y291bnRyeTpbXzp2YXJpYW50Ol1dCi0gICAgICAgICAgICAgICAgd2l0aG91dCB0aGUgY29sb25zLCBmb3IgZXhhbXBsZSAiamFfSlBfU0pJUyIuICBUaGUKLSAgICAgICAgICAgICAgICBzZXBhcmF0b3JzIGJldHdlZW4gdGhlIHNlZ21lbnRzIG1heSBiZSAnLScgb3IgJ18nLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWxvY2FsZVR5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWRlZmF1bHQtdmFsdWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJkZWZhdWx0LXZhbHVlIiBjb250YWlucyB0aGUgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBvcgotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBpbiB3aGljaCB0aGlzIGVsZW1lbnQgcmVzaWRlcy4gIFRoaXMgdmFsdWUgZGlmZmVycwotICAgICAgICAgICAgICAgIGZyb20gdGhlICJzdWdnZXN0ZWQtdmFsdWUiIGluIHRoYXQgdGhlIHByb3BlcnR5IG9yIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgIG11c3QgdGFrZSB0aGUgdmFsdWUsIHdoZXJlYXMgaW4gInN1Z2dlc3RlZC12YWx1ZSIgdGFraW5nIHRoZQotICAgICAgICAgICAgICAgIHZhbHVlIGlzIG9wdGlvbmFsLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJmYWNlcy1jb25maWctZWwtZXhwcmVzc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFTCBleHByZXNzaW9ucyBwcmVzZW50IHdpdGhpbiBhIGZhY2VzIGNvbmZpZyBmaWxlCi0gICAgICAgICAgICAgICAgbXVzdCBzdGFydCB3aXRoIHRoZSBjaGFyYWN0ZXIgc2VxdWVuY2Ugb2YgJyN7JyBhbmQKLSAgICAgICAgICAgICAgICBlbmQgd2l0aCAnfScuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IiNcey4qXH0iLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWZhY2V0VHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBhbmQgb3RoZXIgZGVzaWduLXRpbWUgaW5mb3JtYXRpb24gZm9yIGEgZmFjZXQKLSAgICAgICAgICAgICAgICB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbmRlcmVyIG9yIGEgY29tcG9uZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmYWNldC1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJmYWNldC1uYW1lIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZhY2V0IG5hbWUgCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmRlciB3aGljaCBhIFVJQ29tcG9uZW50IHdpbGwgYmUgYWRkZWQgdG8gaXRzIHBhcmVudC4gIAotICAgICAgICAgICAgICAgICAgICAgICAgSXQgbXVzdCBiZSBvZiB0eXBlICJJZGVudGlmaWVyIi4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhY2V0LWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWZhY2V0LWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1mYWNldC1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBmYWNldC4gIEl0IG1heSBjb250YWluIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAgICAgICAgc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWZyb20tdmlldy1pZFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgdmFsdWUgb2YgZnJvbS12aWV3LWlkIG11c3QgY29udGFpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKLSAgICAgICAgICAgICAgICB2YWx1ZXM6Ci0KLSAgICAgICAgICAgICAgICAgIC0gVGhlIGV4YWN0IG1hdGNoIGZvciBhIHZpZXcgaWRlbnRpZmllciB0aGF0IGlzIHJlY29nbml6ZWQKLSAgICAgICAgICAgICAgICAgICAgYnkgdGhlIHRoZSBWaWV3SGFuZGxlciBpbXBsZW1lbnRhdGlvbiBiZWluZyB1c2VkIChzdWNoIGFzCi0gICAgICAgICAgICAgICAgICAgICIvaW5kZXguanNwIiBpZiB5b3UgYXJlIHVzaW5nIHRoZSBkZWZhdWx0IFZpZXdIYW5kbGVyKS4KLQotICAgICAgICAgICAgICAgICAgLSBBIHByb3BlciBwcmVmaXggb2YgYSB2aWV3IGlkZW50aWZpZXIsIHBsdXMgYSB0cmFpbGluZyAKLSAgICAgICAgICAgICAgICAgICAgIioiIGNoYXJhY3Rlci4gIFRoaXMgcGF0dGVybiBpbmRpY2F0ZXMgdGhhdCBhbGwgdmlldyAKLSAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcnMgdGhhdCBtYXRjaCB0aGUgcG9ydGlvbiBvZiB0aGUgcGF0dGVybiB1cCB0byAKLSAgICAgICAgICAgICAgICAgICAgdGhlIGFzdGVyaXNrIHdpbGwgbWF0Y2ggdGhlIHN1cnJvdW5kaW5nIHJ1bGUuICBXaGVuIG1vcmUgCi0gICAgICAgICAgICAgICAgICAgIHRoYW4gb25lIG1hdGNoIGV4aXN0cywgdGhlIG1hdGNoIHdpdGggdGhlIGxvbmdlc3QgcGF0dGVybiAKLSAgICAgICAgICAgICAgICAgICAgaXMgc2VsZWN0ZWQuCi0KLSAgICAgICAgICAgICAgICAgIC0gQW4gIioiIGNoYXJhY3Rlciwgd2hpY2ggbWVhbnMgdGhhdCB0aGlzIHBhdHRlcm4gYXBwbGllcyAKLSAgICAgICAgICAgICAgICAgICAgdG8gYWxsIHZpZXcgaWRlbnRpZmllcnMuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctZnJvbS1hY3Rpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJmcm9tLWFjdGlvbiIgZWxlbWVudCBjb250YWlucyBhbiBhY3Rpb24gcmVmZXJlbmNlIAotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gdGhhdCBtdXN0IGhhdmUgYmVlbiBleGVjdXRlZCAoYnkgdGhlIGRlZmF1bHQgCi0gICAgICAgICAgICAgICAgQWN0aW9uTGlzdGVuZXIgZm9yIGhhbmRsaW5nIGFwcGxpY2F0aW9uIGxldmVsIGV2ZW50cykgCi0gICAgICAgICAgICAgICAgaW4gb3JkZXIgdG8gc2VsZWN0IHRoZSBuYXZpZ2F0aW9uIHJ1bGUuICBJZiBub3Qgc3BlY2lmaWVkLCAKLSAgICAgICAgICAgICAgICB0aGlzIHJ1bGUgd2lsbCBiZSByZWxldmFudCBubyBtYXR0ZXIgd2hpY2ggYWN0aW9uIHJlZmVyZW5jZSAKLSAgICAgICAgICAgICAgICB3YXMgZXhlY3V0ZWQgKG9yIGlmIG5vIGFjdGlvbiByZWZlcmVuY2Ugd2FzIGV4ZWN1dGVkKS4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1lbC1leHByZXNzaW9uVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctY29udmVydGVyVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAiY29udmVydGVyIiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBDb252ZXJ0ZXIKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZQotICAgICAgICAgICAgICAgIHNwZWNpZmllZCBjb252ZXJ0ZXIgaWRlbnRpZmllci4gIENvbnZlcnRlciBpZGVudGlmaWVycyBtdXN0IAotICAgICAgICAgICAgICAgIGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICAgICAgICAgICAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBhdHRyaWJ1dGVzIHRoYXQKLSAgICAgICAgICAgICAgICBtYXkgYmUgY29uZmlndXJlZCBvbiB0aGUgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBpbiBvcmRlciAKLSAgICAgICAgICAgICAgICB0byBhZmZlY3QgdGhlIG9wZXJhdGlvbiBvZiB0aGUgQ29udmVydGVyLiAgTmVzdGVkICJwcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICBlbGVtZW50cyBpZGVudGlmeSBKYXZhQmVhbnMgcHJvcGVydGllcyBvZiB0aGUgQ29udmVydGVyCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCBtYXkgYmUgY29uZmlndXJlZCB0byBhZmZlY3QgdGhlCi0gICAgICAgICAgICAgICAgb3BlcmF0aW9uIG9mIHRoZSBDb252ZXJ0ZXIuICAiYXR0cmlidXRlIiBhbmQgInByb3BlcnR5IiAKLSAgICAgICAgICAgICAgICBlbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYWxsb3cgY29tcG9uZW50IGRldmVsb3BlcnMgdG8gCi0gICAgICAgICAgICAgICAgbW9yZSBjb21wbGV0ZWx5IGRlc2NyaWJlIHRoZWlyIGNvbXBvbmVudHMgdG8gdG9vbHMgYW5kIHVzZXJzLgotICAgICAgICAgICAgICAgIFRoZXNlIGVsZW1lbnRzIGhhdmUgbm8gcmVxdWlyZWQgcnVudGltZSBzZW1hbnRpY3MuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlci1pZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiY29udmVydGVyLWlkIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgdW5kZXIgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGVyIGNsYXNzIHNob3VsZCBiZSByZWdpc3RlcmVkLgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlci1mb3ItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJjb252ZXJ0ZXItZm9yLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB3aGljaCBhIENvbnZlcnRlciAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyB3aWxsIGJlIHJlZ2lzdGVyZWQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiY29udmVydGVyLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIGZ1bGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGNvbmNyZXRlIENvbnZlcnRlciAKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctYXR0cmlidXRlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljCi0gICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgdGhhdCBtYXkgYmUgY29uZmlndXJlZCBvbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBpbiBvcmRlciB0byBhZmZlY3QgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiBvZiB0aGUgQ29udmVydGVyLiAgVGhpcyBhdHRyaWJ1dGUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyaWx5IGZvciBkZXNpZ24tdGltZSB0b29scyBhbmQgaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCB0byBoYXZlIGFueSBtZWFuaW5nIGF0IHJ1bnRpbWUuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXByb3BlcnR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZCAicHJvcGVydHkiIGVsZW1lbnRzIGlkZW50aWZ5IEphdmFCZWFucwotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIG9mIHRoZSBDb252ZXJ0ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtYXkgYmUgY29uZmlndXJlZCB0byBhZmZlY3QgdGhlIG9wZXJhdGlvbiBvZgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgQ29udmVydGVyLiAgVGhpcyBhdHRyaWJ1dGUgaXMgcHJpbWFyaWx5IGZvcgotICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ24tdGltZSB0b29scyBhbmQgaXMgbm90IHNwZWNpZmllZCB0byBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgIGFueSBtZWFuaW5nIGF0IHJ1bnRpbWUuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXItZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctY29udmVydGVyLWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLWNvbnZlcnRlci1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGNvbnZlcnRlci4gIEl0IG1heSBjb250YWluCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1saWZlY3ljbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAibGlmZWN5Y2xlIiBlbGVtZW50IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIHNwZWNpZnkKLSAgICAgICAgICAgICAgICBtb2RpZmljYXRpb25zIHRvIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGRlZmF1bHQgTGlmZWN5Y2xlCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBoYXNlLWxpc3RlbmVyIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicGhhc2UtbGlzdGVuZXIiIGVsZW1lbnQgY29udGFpbnMgdGhlIGZ1bGx5IAotICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbmNyZXRlIFBoYXNlTGlzdGVuZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdpbGwgYmUgcmVnaXN0ZXJlZCBvbiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBMaWZlY3ljbGUuCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpZmVjeWNsZS1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1saWZlY3ljbGUtZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotCi0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLWxpZmVjeWNsZS1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIGxpZmVjeWNsZS4gIEl0IG1heSBjb250YWluCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIAotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgICAKLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWxvY2FsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgbG9jYWxlVHlwZSBkZWZpbmVzIHZhbGlkIGxvY2FsZSBkZWZpbmVkIGJ5IElTTy02MzktMQotICAgICAgICAgICAgICAgIGFuZCBJU08tMzE2Ni4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbYS16XXsyfShffC0pPyhbXHB7TH1cLVxwe05kfV17Mn0pPyIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLWxvY2FsZS1jb25maWdUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJsb2NhbGUtY29uZmlnIiBlbGVtZW50IGFsbG93cyB0aGUgYXBwIGRldmVsb3BlciB0byAKLSAgICAgICAgICAgICAgICBkZWNsYXJlIHRoZcKgc3VwcG9ydGVkIGxvY2FsZXMgZm9yIHRoaXMgYXBwbGljYXRpb24uCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIAotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtbG9jYWxlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctZGVmYXVsdC1sb2NhbGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN1cHBvcnRlZC1sb2NhbGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1zdXBwb3J0ZWQtbG9jYWxlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIAotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbWFuYWdlZC1iZWFuVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgIm1hbmFnZWQtYmVhbiIgZWxlbWVudCByZXByZXNlbnRzIGEgSmF2YUJlYW4sIG9mIGEgCi0gICAgICAgICAgICAgICAgcGFydGljdWxhciBjbGFzcywgdGhhdCB3aWxsIGJlIGR5bmFtaWNhbGx5IGluc3RhbnRpYXRlZCAKLSAgICAgICAgICAgICAgICBhdCBydW50aW1lIChieSB0aGUgZGVmYXVsdCBWYXJpYWJsZVJlc29sdmVyIGltcGxlbWVudGF0aW9uKSAKLSAgICAgICAgICAgICAgICBpZiBpdCBpcyByZWZlcmVuY2VkIGFzIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgdmFsdWUgYmluZGluZyAKLSAgICAgICAgICAgICAgICBleHByZXNzaW9uLCBhbmQgbm8gY29ycmVzcG9uZGluZyBiZWFuIGNhbiBiZSBpZGVudGlmaWVkIGluIAotICAgICAgICAgICAgICAgIGFueSBzY29wZS4gIEluIGFkZGl0aW9uIHRvIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWFuYWdlZCBiZWFuLCAKLSAgICAgICAgICAgICAgICBhbmQgdGhlIG9wdGlvbmFsIHN0b3Jpbmcgb2YgaXQgaW50byB0aGUgc3BlY2lmaWVkIHNjb3BlLCAKLSAgICAgICAgICAgICAgICB0aGUgbmVzdGVkIG1hbmFnZWQtcHJvcGVydHkgZWxlbWVudHMgY2FuIGJlIHVzZWQgdG8gCi0gICAgICAgICAgICAgICAgaW5pdGlhbGl6ZSB0aGUgY29udGVudHMgb2Ygc2V0dGFibGUgSmF2YUJlYW5zIHByb3BlcnRpZXMgb2YgCi0gICAgICAgICAgICAgICAgdGhlIGNyZWF0ZWQgaW5zdGFuY2UuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkLWJlYW4tbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAibWFuYWdlZC1iZWFuLW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgbmFtZSB1bmRlciB3aGljaCBhIG1hbmFnZWQgYmVhbiB3aWxsIAotICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2VhcmNoZWQgZm9yLCBhcyB3ZWxsIGFzIHN0b3JlZCAodW5sZXNzIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICJtYW5hZ2VkLWJlYW4tc2NvcGUiIHZhbHVlIGlzICJub25lIikuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkLWJlYW4tY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgIm1hbmFnZWQtYmVhbi1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBmdWxseQotICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdCB3aWxsIGJlIAotICAgICAgICAgICAgICAgICAgICAgICAgdXNlZGB0byBpbnN0YW50aWF0ZSBhIG5ldyBpbnN0YW5jZSBpZiBjcmVhdGlvbiBvZiB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWRgbWFuYWdlZCBiZWFuIGlzIHJlcXVlc3RlZC4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNwZWNpZmllZCBjbGFzcyBtdXN0IGNvbmZvcm0gdG8gc3RhbmRhcmQgSmF2YUJlYW5zCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZW50aW9ucy4gIEluIHBhcnRpY3VsYXIsIGl0IG11c3QgaGF2ZSBhIHB1YmxpYwotICAgICAgICAgICAgICAgICAgICAgICAgemVyby1hcmd1bWVudHMgY29uc3RydWN0b3IsIGFuZCB6ZXJvIG9yIG1vcmUgcHVibGljCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSBzZXR0ZXJzLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgCi0gICAgICAgICAgICAgICAgbmFtZT0ibWFuYWdlZC1iZWFuLXNjb3BlIgotICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbWFuYWdlZC1iZWFuLXNjb3BlT3JOb25lVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAibWFuYWdlZC1iZWFuLXNjb3BlIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIHNjb3BlIAotICAgICAgICAgICAgICAgICAgICAgICAgaW50byB3aGljaCBhIG5ld2x5IGNyZWF0ZWQgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZWQgYmVhbiB3aWxsIGJlIHN0b3JlZCAodW5sZXNzIHRoZSB2YWx1ZSBpcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICJub25lIikuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkLXByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW1hbmFnZWQtcHJvcGVydHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1lbnRyaWVzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW1hcC1lbnRyaWVzVHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsaXN0LWVudHJpZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbGlzdC1lbnRyaWVzVHlwZSIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbmFnZWQtYmVhbi1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1tYW5hZ2VkLWJlYW4tZXh0ZW5zaW9uVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZSA9ICJmYWNlcy1jb25maWctbWFuYWdlZC1iZWFuLWV4dGVuc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb24gZWxlbWVudCBmb3IgbWFuYWdlZC1iZWFuLiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gICAgCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbWFuYWdlZC1iZWFuLXNjb3BlT3JOb25lVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIGxlZ2FsIHZhbHVlcyBmb3IgdGhlIDxtYW5hZ2VkLWJlYW4tc2NvcGU+Ci0gICAgICAgICAgICAgICAgZWxlbWVudCdzIGJvZHkgY29udGVudCwgd2hpY2ggaW5jbHVkZXMgYWxsIG9mIHRoZSBzY29wZXMKLSAgICAgICAgICAgICAgICBub3JtYWxseSB1c2VkIGluIGEgd2ViIGFwcGxpY2F0aW9uLCBwbHVzIHRoZSAibm9uZSIgdmFsdWUKLSAgICAgICAgICAgICAgICBpbmRpY2F0aW5nIHRoYXQgYSBjcmVhdGVkIGJlYW4gc2hvdWxkIG5vdCBiZSBzdG9yZWQgaW50bwotICAgICAgICAgICAgICAgIGFueSBzY29wZS4KLSAgICAgICAgICAgICAgICBdXT4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJlcXVlc3QiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzZXNzaW9uIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXBwbGljYXRpb24iLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIi8+Ci0gICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLW1hbmFnZWQtcHJvcGVydHlUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAibWFuYWdlZC1wcm9wZXJ0eSIgZWxlbWVudCByZXByZXNlbnRzIGFuIGluZGl2aWR1YWwgCi0gICAgICAgICAgICAgICAgcHJvcGVydHkgb2YgYSBtYW5hZ2VkIGJlYW4gdGhhdCB3aWxsIGJlIGNvbmZpZ3VyZWQgdG8gdGhlIAotICAgICAgICAgICAgICAgIHNwZWNpZmllZCB2YWx1ZSAob3IgdmFsdWUgc2V0KSBpZiB0aGUgY29ycmVzcG9uZGluZyAKLSAgICAgICAgICAgICAgICBtYW5hZ2VkIGJlYW4gaXMgYXV0b21hdGljYWxseSBjcmVhdGVkLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicHJvcGVydHktbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBKYXZhQmVhbnMgCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSBuYW1lIHVuZGVyIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG1heSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlIHN0b3JlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqYXZhLXR5cGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJwcm9wZXJ0eS1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBKYXZhIHR5cGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvcGVydHkgbmFtZS4gIAotICAgICAgICAgICAgICAgICAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgaXQgY2FuIGJlIGluZmVycmVkIGZyb20gZXhpc3RpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOyBob3dldmVyLCB0aGlzIGVsZW1lbnQgc2hvdWxkIGJlIHNwZWNpZmllZCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgZ29pbmcgdG8gYmUgdGhlIHNvdXJjZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciBnZW5lcmF0aW5nIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAtZW50cmllcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1tYXAtZW50cmllc1R5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibnVsbC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1udWxsLXZhbHVlVHlwZSI+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctdmFsdWVUeXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxpc3QtZW50cmllcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1saXN0LWVudHJpZXNUeXBlIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1tYXAtZW50cnlUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAibWFwLWVudHJ5IiBlbGVtZW50IHJlcHJzZW50cyBhIHNpbmdsZSBrZXktZW50cnkgcGFpciAKLSAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbXB1dGVkIHZhbHVlIG9mIGEgbWFuYWdlZCAKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSBvZiB0eXBlIGphdmEudXRpbC5NYXAuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImtleSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJrZXkiIGVsZW1lbnQgaXMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIAotICAgICAgICAgICAgICAgICAgICAgICAgbWFwIGtleSB0aGF0IHdpbGwgYmUgc3RvcmVkIGluIGEgbWFuYWdlZCBwcm9wZXJ0eSBvZiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgamF2YS51dGlsLk1hcC4KLQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im51bGwtdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbnVsbC12YWx1ZVR5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctdmFsdWVUeXBlIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1tYXAtZW50cmllc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJtYXAtZW50cmllcycgZWxlbWVudCByZXByZXNlbnRzIGEgc2V0IG9mIGtleS1lbnRyeSBwYWlycyAKLSAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbXB1dGVkIHZhbHVlIG9mIGEgbWFuYWdlZCBwcm9wZXJ0eSAKLSAgICAgICAgICAgICAgICBvZiB0eXBlIGphdmEudXRpbC5NYXAuICBJbiBhZGRpdGlvbiwgdGhlIEphdmEgY2xhc3MgdHlwZXMgCi0gICAgICAgICAgICAgICAgb2YgdGhlIGtleSBhbmQgZW50cnkgdmFsdWVzIG1heSBiZSBvcHRpb25hbGx5IGRlY2xhcmVkLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImtleS1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgImtleS1jbGFzcyIgZWxlbWVudCBkZWZpbmVzIHRoZSBKYXZhIHR5cGUgdG8gd2hpY2ggCi0gICAgICAgICAgICAgICAgICAgICAgICBlYWNoICJrZXkiIGVsZW1lbnQgaW4gYSBzZXQgb2YgIm1hcC1lbnRyeSIgZWxlbWVudHMgCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGNvbnZlcnRlZCB0by4gIElmIG9taXR0ZWQsICJqYXZhLmxhbmcuU3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFzc3VtZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLXZhbHVlLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWVudHJ5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctbWFwLWVudHJ5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLW5hdmlnYXRpb24tY2FzZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJuYXZpZ2F0aW9uLWNhc2UiIGVsZW1lbnQgZGVzY3JpYmVzIGEgcGFydGljdWxhciAKLSAgICAgICAgICAgICAgICBjb21iaW5hdGlvbiBvZiBjb25kaXRpb25zIHRoYXQgbXVzdCBtYXRjaCBmb3IgdGhpcyBjYXNlIHRvIAotICAgICAgICAgICAgICAgIGJlIGV4ZWN1dGVkLCBhbmQgdGhlIHZpZXcgaWQgb2YgdGhlIGNvbXBvbmVudCB0cmVlIHRoYXQgCi0gICAgICAgICAgICAgICAgc2hvdWxkIGJlIHNlbGVjdGVkIG5leHQuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnJvbS1hY3Rpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1mcm9tLWFjdGlvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnJvbS1vdXRjb21lIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiZnJvbS1vdXRjb21lIiBlbGVtZW50IGNvbnRhaW5zIGEgbG9naWNhbCBvdXRjb21lCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGV4ZWN1dGlvbiBvZiBhbiBhcHBsaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uIG1ldGhvZCBzZWxlY3RlZCB2aWEgYW4gImFjdGlvblJlZiIgcHJvcGVydHkKLSAgICAgICAgICAgICAgICAgICAgICAgIChvciBhIGxpdGVyYWwgdmFsdWUgc3BlY2lmaWVkIGJ5IGFuICJhY3Rpb24iIHByb3BlcnR5KQotICAgICAgICAgICAgICAgICAgICAgICAgb2YgYSBVSUNvbW1hbmQgY29tcG9uZW50LiAgSWYgc3BlY2lmaWVkLCB0aGlzIHJ1bGUgCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHJlbGV2YW50IG9ubHkgaWYgdGhlIG91dGNvbWUgdmFsdWUgbWF0Y2hlcyAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZWxlbWVudCdzIHZhbHVlLiAgSWYgbm90IHNwZWNpZmllZCwgdGhpcyBydWxlIAotICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSByZWxldmFudCBubyBtYXR0ZXIgd2hhdCB0aGUgb3V0Y29tZSB2YWx1ZSB3YXMuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0by12aWV3LWlkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInRvLXZpZXctaWQiIGVsZW1lbnQgY29udGFpbnMgdGhlIHZpZXcgaWRlbnRpZmllciAKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBuZXh0IHZpZXcgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGlmIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb24gcnVsZSBpcyBtYXRjaGVkLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgCi0gICAgICAgICAgICAgICAgbmFtZT0icmVkaXJlY3QiCi0gICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1yZWRpcmVjdFR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbmF2aWdhdGlvbi1ydWxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAibmF2aWdhdGlvbi1ydWxlIiBlbGVtZW50IHJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCAKLSAgICAgICAgICAgICAgICBkZWNpc2lvbiBydWxlIHRoYXQgd2lsbCBiZSB1dGlsaXplZCBieSB0aGUgZGVmYXVsdCAKLSAgICAgICAgICAgICAgICBOYXZpZ2F0aW9uSGFuZGxlciBpbXBsZW1lbnRhdGlvbiB0byBtYWtlIGRlY2lzaW9ucyBvbiAKLSAgICAgICAgICAgICAgICB3aGF0IHZpZXcgc2hvdWxkIGJlIGRpc3BsYXllZCBuZXh0LCBiYXNlZCBvbiB0aGUgCi0gICAgICAgICAgICAgICAgdmlldyBpZCBiZWluZyBwcm9jZXNzZWQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmcm9tLXZpZXctaWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1mcm9tLXZpZXctaWRUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hdmlnYXRpb24tY2FzZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW5hdmlnYXRpb24tY2FzZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgCi0gICAgICAgICAgICAgICAgbmFtZT0ibmF2aWdhdGlvbi1ydWxlLWV4dGVuc2lvbiIKLSAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZmFjZXMtY29uZmlnLW5hdmlnYXRpb24tcnVsZS1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lID0gImZhY2VzLWNvbmZpZy1uYXZpZ2F0aW9uLXJ1bGUtZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBuYXZpZ2F0aW9uLXJ1bGUuICBJdCBtYXkgY29udGFpbgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLW51bGwtdmFsdWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJudWxsLXZhbHVlIiBlbGVtZW50IGluZGljYXRlcyB0aGF0IHRoZSBtYW5hZ2VkCi0gICAgICAgICAgICAgICAgcHJvcGVydHkgaW4gd2hpY2ggd2UgYXJlIG5lc3RlZCB3aWxsIGJlIGV4cGxpY2l0bHkKLSAgICAgICAgICAgICAgICBzZXQgdG8gbnVsbCBpZiBvdXIgbWFuYWdlZCBiZWFuIGlzIGF1dG9tYXRpY2FsbHkKLSAgICAgICAgICAgICAgICBjcmVhdGVkLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBvbWl0dGluZyB0aGUgbWFuYWdlZAotICAgICAgICAgICAgICAgIHByb3BlcnR5IGVsZW1lbnQgZW50aXJlbHksIHdoaWNoIHdpbGwgY2F1c2Ugbm8KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSBzZXR0ZXIgdG8gYmUgY2FsbGVkIGZvciB0aGlzIHByb3BlcnR5LgotCi0gICAgICAgICAgICAgICAgVGhlICJudWxsLXZhbHVlIiBlbGVtZW50IGNhbiBvbmx5IGJlIHVzZWQgd2hlbiB0aGUKLSAgICAgICAgICAgICAgICBhc3NvY2lhdGVkICJwcm9wZXJ0eS1jbGFzcyIgaWRlbnRpZmllcyBhIEphdmEgY2xhc3MsCi0gICAgICAgICAgICAgICAgbm90IGEgSmF2YSBwcmltaXRpdmUuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAKLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1wcm9wZXJ0eVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJwcm9wZXJ0eSIgZWxlbWVudCByZXByZXNlbnRzIGEgSmF2YUJlYW4gcHJvcGVydHkgb2YgdGhlIAotICAgICAgICAgICAgICAgIEphdmEgY2xhc3MgcmVwcmVzZW50ZWQgYnkgb3VyIHBhcmVudCBlbGVtZW50LgotCi0gICAgICAgICAgICAgICAgUHJvcGVydHkgbmFtZXMgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgSmF2YSAKLSAgICAgICAgICAgICAgICBjbGFzcyB0aGF0IGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgZWxlbWVudCwgYW5kIG11c3QgCi0gICAgICAgICAgICAgICAgY29ycmVzcG9uZCB0byBwcm9wZXJ0eSBuYW1lcyB0aGF0IHdpbGwgYmUgcmVjb2duaXplZCB3aGVuIAotICAgICAgICAgICAgICAgIHBlcmZvcm1pbmcgaW50cm9zcGVjdGlvbiBhZ2FpbnN0IHRoYXQgY2xhc3MgdmlhIAotICAgICAgICAgICAgICAgIGphdmEuYmVhbnMuSW50cm9zcGVjdG9yLgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicHJvcGVydHktbmFtZSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBKYXZhQmVhbnMgCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSBuYW1lIHVuZGVyIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIAotICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGJlIHN0b3JlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpqYXZhLXR5cGVUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJwcm9wZXJ0eS1jbGFzcyIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBKYXZhIHR5cGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvcGVydHkgbmFtZS4gIAotICAgICAgICAgICAgICAgICAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgaXQgY2FuIGJlIGluZmVycmVkIGZyb20gZXhpc3RpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOyBob3dldmVyLCB0aGlzIGVsZW1lbnQgc2hvdWxkIGJlIHNwZWNpZmllZCBpZiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgZ29pbmcgdG8gYmUgdGhlIHNvdXJjZSBmb3IgCi0gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW5nIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LXZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctZGVmYXVsdC12YWx1ZVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3VnZ2VzdGVkLXZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctc3VnZ2VzdGVkLXZhbHVlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1wcm9wZXJ0eS1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLQotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctcHJvcGVydHktZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciBwcm9wZXJ0eS4gIEl0IG1heSBjb250YWluIAotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbnRlbnQuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6YW55IG5hbWVzcGFjZT0iIyNhbnkiCi0gICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1yZWRpcmVjdFR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgVGhlICJyZWRpcmVjdCIgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCBuYXZpZ2F0aW9uIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgInRvLXZpZXctaWQiIHNob3VsZCBiZSBhY2NvbXBsaXNoZWQgYnkgCi0gICAgICAgICAgICAgICAgICAgIHBlcmZvcm1pbmcgYW4gSFRUUCByZWRpcmVjdCByYXRoZXIgdGhhbiB0aGUgdXN1YWwgCi0gICAgICAgICAgICAgICAgICAgIFZpZXdIYW5kbGVyIG1lY2hhbmlzbXMuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXJlZmVyZW5jZWQtYmVhblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJyZWZlcmVuY2VkLWJlYW4iIGVsZW1lbnQgcmVwcmVzZW50cyBhdCBkZXNpZ24gdGltZSB0aGUgCi0gICAgICAgICAgICAgICAgcHJvbWlzZSB0aGF0IGEgSmF2YSBvYmplY3Qgb2YgdGhlIHNwZWNpZmllZCB0eXBlIHdpbGwgZXhpc3QgYXQgCi0gICAgICAgICAgICAgICAgcnVudGltZSBpbiBzb21lIHNjb3BlLCB1bmRlciB0aGUgc3BlY2lmaWVkIGtleS4gIFRoaXMgY2FuIGJlIAotICAgICAgICAgICAgICAgIHVzZWQgYnkgZGVzaWduIHRpbWUgdG9vbHMgdG8gY29uc3RydWN0IHVzZXIgaW50ZXJmYWNlIGRpYWxvZ3MgCi0gICAgICAgICAgICAgICAgYmFzZWQgb24gdGhlIHByb3BlcnRpZXMgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4gIFRoZSBwcmVzZW5jZSAKLSAgICAgICAgICAgICAgICBvciBhYnNlbmNlIG9mIGEgcmVmZXJlbmNlZCBiZWFuIGVsZW1lbnQgaGFzIG5vIGltcGFjdCBvbiB0aGUgCi0gICAgICAgICAgICAgICAgSmF2YVNlcnZlciBGYWNlcyBydW50aW1lIGVudmlyb25tZW50IGluc2lkZSBhIHdlYiBhcHBsaWNhdGlvbi4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2VkLWJlYW4tbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicmVmZXJlbmNlZC1iZWFuLW5hbWUiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgbmFtZSB1bmRlciB3aGljaCB0aGUgY29ycmVzcG9uZGluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZWQgYmVhbiBtYXkgYmUgYXNzdW1lZCB0byBiZSBzdG9yZWQsIGluIG9uZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIG9mICdyZXF1ZXN0JywgJ3Nlc3Npb24nLCBvciAnYXBwbGljYXRpb24nIHNjb3Blcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZWQtYmVhbi1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicmVmZXJlbmNlZC1iZWFuLWNsYXNzIiBlbGVtZW50IHJlcHJlc2VudHMgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgCi0gICAgICAgICAgICAgICAgICAgICAgICAoZWl0aGVyIGFic3RyYWN0IG9yIGNvbmNyZXRlKSBvciBKYXZhIGludGVyZmFjZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHJlZmVyZW5jZWQgYmVhbi4gCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXJlbmRlci1raXRUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAicmVuZGVyLWtpdCIgZWxlbWVudCByZXByZXNlbnRzIGEgY29uY3JldGUgUmVuZGVyS2l0IAotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIHNwZWNpZmllZCAKLSAgICAgICAgICAgICAgICByZW5kZXIta2l0LWlkLiAgSWYgbm8gcmVuZGVyLWtpdC1pZCBpcyBzcGVjaWZpZWQsIHRoZSAKLSAgICAgICAgICAgICAgICBpZGVudGlmaWVyIG9mIHRoZSBkZWZhdWx0IFJlbmRlcktpdCAKLSAgICAgICAgICAgICAgICAoUmVuZGVyS2l0RmFjdG9yeS5ERUZBVUxUX1JFTkRFUl9LSVQpIGlzIGFzc3VtZWQuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAKLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbmRlci1raXQtaWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInJlbmRlci1raXQtaWQiIGVsZW1lbnQgcmVwcmVzZW50cyBhbiBpZGVudGlmaWVyIAotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBSZW5kZXJLaXQgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCAKLSAgICAgICAgICAgICAgICAgICAgICAgICJyZW5kZXIta2l0IiBlbGVtZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInJlbmRlci1raXQtY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgCi0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGNvbmNyZXRlIFJlbmRlcktpdCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzLgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1yZW5kZXJlclR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbmRlci1raXQtZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctcmVuZGVyLWtpdC1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctcmVuZGVyZXJUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRoZSAicmVuZGVyZXIiIGVsZW1lbnQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIFJlbmRlcmVyIAotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIAotICAgICAgICAgICAgICAgIHNwZWNpZmllZCBjb21wb25lbnQgZmFtaWx5IGFuZCByZW5kZXJlciB0eXBlIGlkZW50aWZpZXJzLCAKLSAgICAgICAgICAgICAgICBpbiB0aGUgUmVuZGVyS2l0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFyZW50ICJyZW5kZXIta2l0IiAKLSAgICAgICAgICAgICAgICBlbGVtZW50LiAgQ29tYmluYXRpb25zIG9mIGNvbXBvbmVudCBmYW1pbHkgYW5kIAotICAgICAgICAgICAgICAgIHJlbmRlcmVyIHR5cGUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBSZW5kZXJLaXQgCi0gICAgICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJlbnQgInJlbmRlci1raXQiIGVsZW1lbnQuCi0KLSAgICAgICAgICAgICAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBjb21wb25lbnQgCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlcyB0aGF0IGFyZSByZWNvZ25pemVkIGJ5IHRoaXMgcmVuZGVyZXIuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAKLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqYXZhZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1mYW1pbHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAiY29tcG9uZW50LWZhbWlseSIgZWxlbWVudCByZXByZXNlbnRzIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBmYW1pbHkgZm9yIHdoaWNoIHRoZSBSZW5kZXJlciByZXByZXNlbnRlZCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBwYXJlbnQgInJlbmRlcmVyIiBlbGVtZW50IHdpbGwgYmUgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVuZGVyZXItdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJyZW5kZXJlci10eXBlIiBlbGVtZW50IHJlcHJlc2VudHMgYSByZW5kZXJlciB0eXBlIAotICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciBmb3IgdGhlIFJlbmRlcmVyIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVuZGVyZXIiIGVsZW1lbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW5kZXJlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSAicmVuZGVyZXItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY29uY3JldGUgUmVuZGVyZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzLgotCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmFjZXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1mYWNldFR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctYXR0cmlidXRlVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW5kZXJlci1leHRlbnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1yZW5kZXJlci1leHRlbnNpb25UeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctcmVuZGVyZXItZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciByZW5kZXJlci4gIEl0IG1heSBjb250YWluIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAgICAgICAgc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmFjZXMtY29uZmlnLXJlbmRlci1raXQtZXh0ZW5zaW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIEV4dGVuc2lvbiBlbGVtZW50IGZvciByZW5kZXIta2l0LiAgSXQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb250ZW50LgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmFueSBuYW1lc3BhY2U9IiMjYW55IgotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy1zdWdnZXN0ZWQtdmFsdWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJzdWdnZXN0ZWQtdmFsdWUiIGNvbnRhaW5zIHRoZSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG9yCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlIGluIHdoaWNoIHRoaXMgZWxlbWVudCByZXNpZGVzLiAgVGhpcyB2YWx1ZSBpcyAKLSAgICAgICAgICAgICAgICBhZHZpc29yeSBvbmx5IGFuZCBpcyBpbnRlbmRlZCBmb3IgdG9vbHMgdG8gdXNlIHdoZW4gCi0gICAgICAgICAgICAgICAgcG9wdWxhdGluZyBwYWxsZXR0ZXMuCi0KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctc3VwcG9ydGVkLWxvY2FsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGUgInN1cHBvcnRlZC1sb2NhbGUiIGVsZW1lbnQgYWxsb3dzIGF1dGhvcnMgdG8gZGVjbGFyZQotICAgICAgICAgICAgICAgIHdoaWNoIGxvY2FsZXMgYXJlIHN1cHBvcnRlZCBpbiB0aGlzIGFwcGxpY2F0aW9uIGluc3RhbmNlLgotCi0gICAgICAgICAgICAgICAgSXQgbXVzdCBiZSBzcGVjaWZpZWQgYXMgOmxhbmd1YWdlOltfOmNvdW50cnk6W186dmFyaWFudDpdXQotICAgICAgICAgICAgICAgIHdpdGhvdXQgdGhlIGNvbG9ucywgZm9yIGV4YW1wbGUgImphX0pQX1NKSVMiLiAgVGhlCi0gICAgICAgICAgICAgICAgc2VwYXJhdG9ycyBiZXR3ZWVuIHRoZSBzZWdtZW50cyBtYXkgYmUgJy0nIG9yICdfJy4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1sb2NhbGVUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+IAotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctdmFsaWRhdG9yVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgICAgIFRoZSAidmFsaWRhdG9yIiBlbGVtZW50IHJlcHJlc2VudHMgYSBjb25jcmV0ZSBWYWxpZGF0b3IKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIHVuZGVyIHRoZQotICAgICAgICAgICAgICAgIHNwZWNpZmllZCB2YWxpZGF0b3IgaWRlbnRpZmllci4gIFZhbGlkYXRvciBpZGVudGlmaWVycyBtdXN0IAotICAgICAgICAgICAgICAgIGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSB3ZWIgYXBwbGljYXRpb24uCi0KLSAgICAgICAgICAgICAgICBOZXN0ZWQgImF0dHJpYnV0ZSIgZWxlbWVudHMgaWRlbnRpZnkgZ2VuZXJpYyBhdHRyaWJ1dGVzIHRoYXQgCi0gICAgICAgICAgICAgICAgbWF5IGJlIGNvbmZpZ3VyZWQgb24gdGhlIGNvcnJlc3BvbmRpbmcgVUlDb21wb25lbnQgaW4gb3JkZXIgCi0gICAgICAgICAgICAgICAgdG8gYWZmZWN0IHRoZSBvcGVyYXRpb24gb2YgdGhlIFZhbGlkYXRvci4gIE5lc3RlZCAicHJvcGVydHkiCi0gICAgICAgICAgICAgICAgZWxlbWVudHMgaWRlbnRpZnkgSmF2YUJlYW5zIHByb3BlcnRpZXMgb2YgdGhlIFZhbGlkYXRvcgotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgbWF5IGJlIGNvbmZpZ3VyZWQgdG8gYWZmZWN0IHRoZQotICAgICAgICAgICAgICAgIG9wZXJhdGlvbiBvZiB0aGUgVmFsaWRhdG9yLiAgImF0dHJpYnV0ZSIgYW5kICJwcm9wZXJ0eSIgCi0gICAgICAgICAgICAgICAgZWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGFsbG93IGNvbXBvbmVudCBkZXZlbG9wZXJzIHRvIAotICAgICAgICAgICAgICAgIG1vcmUgY29tcGxldGVseSBkZXNjcmliZSB0aGVpciBjb21wb25lbnRzIHRvIHRvb2xzIGFuZCB1c2Vycy4KLSAgICAgICAgICAgICAgICBUaGVzZSBlbGVtZW50cyBoYXZlIG5vIHJlcXVpcmVkIHJ1bnRpbWUgc2VtYW50aWNzLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yLWlkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgInZhbGlkYXRvci1pZCIgZWxlbWVudCByZXByZXNlbnRzIHRoZSBpZGVudGlmaWVyIAotICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgVmFsaWRhdG9yIGNsYXNzIHNob3VsZCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJlZ2lzdGVyZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPiAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhlICJ2YWxpZGF0b3ItY2xhc3MiIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgZnVsbHkgCi0gICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGNvbmNyZXRlIFZhbGlkYXRvciAKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1hdHRyaWJ1dGVUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZCAiYXR0cmlidXRlIiBlbGVtZW50cyBpZGVudGlmeSBnZW5lcmljCi0gICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgdGhhdCBtYXkgYmUgY29uZmlndXJlZCBvbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyBVSUNvbXBvbmVudCBpbiBvcmRlciB0byBhZmZlY3QgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiBvZiB0aGUgVmFsaWRhdG9yLiAgVGhpcyBhdHRyaWJ1dGUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyaWx5IGZvciBkZXNpZ24tdGltZSB0b29scyBhbmQgaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCB0byBoYXZlIGFueSBtZWFuaW5nIGF0IHJ1bnRpbWUuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctcHJvcGVydHlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICAgICAgIE5lc3RlZCAicHJvcGVydHkiIGVsZW1lbnRzIGlkZW50aWZ5IEphdmFCZWFucwotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIG9mIHRoZSBWYWxpZGF0b3IgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtYXkgYmUgY29uZmlndXJlZCB0byBhZmZlY3QgdGhlIG9wZXJhdGlvbiBvZgotICAgICAgICAgICAgICAgICAgICAgICB0aGUgVmFsaWRhdG9yLiAgVGhpcyBhdHRyaWJ1dGUgaXMgcHJpbWFyaWx5IGZvcgotICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ24tdGltZSB0b29scyBhbmQgaXMgbm90IHNwZWNpZmllZCB0byBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgIGFueSBtZWFuaW5nIGF0IHJ1bnRpbWUuCi0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3ItZXh0ZW5zaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImphdmFlZTpmYWNlcy1jb25maWctdmFsaWRhdG9yLWV4dGVuc2lvblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWUgPSAiZmFjZXMtY29uZmlnLXZhbGlkYXRvci1leHRlbnNpb25UeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uIGVsZW1lbnQgZm9yIHZhbGlkYXRvci4gIEl0IG1heSBjb250YWluCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29udGVudC4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIKLSAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NDb250ZW50cz0ibGF4IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJmYWNlcy1jb25maWctdmFsdWVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgVGhlICJ2YWx1ZSIgZWxlbWVudCBpcyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mCi0gICAgICAgICAgICAgICAgYSBsaXRlcmFsIHZhbHVlIHRvIHdoaWNoIGEgc2NhbGFyIG1hbmFnZWQgcHJvcGVydHkKLSAgICAgICAgICAgICAgICB3aWxsIGJlIHNldCwgb3IgYSB2YWx1ZSBiaW5kaW5nIGV4cHJlc3Npb24gKCIjey4uLn0iKQotICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcmVxdWlyZWQgdmFsdWUuCi0gICAgICAgICAgICAgICAgSXQgd2lsbCBiZSBjb252ZXJ0ZWQgYXMgc3BlY2lmaWVkIGZvciB0aGUgYWN0dWFsCi0gICAgICAgICAgICAgICAgcHJvcGVydHkgdHlwZS4KLQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDp1bmlvbiAKLSAgICAgICAgICAgIG1lbWJlclR5cGVzPSJqYXZhZWU6ZmFjZXMtY29uZmlnLWVsLWV4cHJlc3Npb25UeXBlIHhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIAotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgICAKLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZhY2VzLWNvbmZpZy12YWx1ZS1jbGFzc1R5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgVGhlICJ2YWx1ZS1jbGFzcyIgZWxlbWVudCBkZWZpbmVzIHRoZSBKYXZhIHR5cGUgdG8gd2hpY2ggZWFjaAotICAgICAgICAgICAgICAgICJ2YWx1ZSIgZWxlbWVudCdzIHZhbHVlIHdpbGwgYmUgY29udmVydGVkIHRvLCBwcmlvciB0byBhZGRpbmcgCi0gICAgICAgICAgICAgICAgaXQgdG8gdGhlICJsaXN0LWVudHJpZXMiIGxpc3QgZm9yIGEgbWFuYWdlZCBwcm9wZXJ0eSB0aGF0IGlzIAotICAgICAgICAgICAgICAgIGEgamF2YS51dGlsLkxpc3QsIG9yIGEgIm1hcC1lbnRyaWVzIiBtYXAgZm9yIGEgbWFuYWdlZCAKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSB0aGF0IGlzIGEgamF2YS51dGlsLk1hcC4gIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYWNlcy1jb25maWctbGlzdC1lbnRyaWVzVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBUaGUgImxpc3QtZW50cmllcyIgZWxlbWVudCByZXByZXNlbnRzIGEgc2V0IG9mIGluaXRpYWxpemF0aW9uCi0gICAgICAgICAgICAgICAgZWxlbWVudHMgZm9yIGEgbWFuYWdlZCBwcm9wZXJ0eSB0aGF0IGlzIGEgamF2YS51dGlsLkxpc3Qgb3IgYW4KLSAgICAgICAgICAgICAgICBhcnJheS4gIEluIHRoZSBmb3JtZXIgY2FzZSwgdGhlICJ2YWx1ZS1jbGFzcyIgZWxlbWVudCBjYW4gCi0gICAgICAgICAgICAgICAgb3B0aW9uYWxseSBiZSB1c2VkIHRvIGRlY2xhcmUgdGhlIEphdmEgdHlwZSB0byB3aGljaCBlYWNoIAotICAgICAgICAgICAgICAgIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgYmVmb3JlIGFkZGluZyBpdCB0byB0aGUgQ29sbGVjdGlvbi4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy12YWx1ZS1jbGFzc1R5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibnVsbC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy1udWxsLXZhbHVlVHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOmZhY2VzLWNvbmZpZy12YWx1ZVR5cGUiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJmYWNlcy1jb25maWctdmVyc2lvblR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBUaGlzIHR5cGUgY29udGFpbnMgdGhlIHJlY29nbml6ZWQgdmVyc2lvbnMgb2YKLSAgICAgICAgICAgICAgICBmYWNlcy1jb25maWcgc3VwcG9ydGVkLgotCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIxLjIiLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8xXzEuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8xXzEuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWM4ZTg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMV8xLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi08IS0tCi1Db3B5cmlnaHQgMTk5OSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIDkwMSBTYW4gQW50b25pbyBSb2FkLAotUGFsbyBBbHRvLCBDQSAgOTQzMDMsIFUuUy5BLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAKLVRoaXMgcHJvZHVjdCBvciBkb2N1bWVudCBpcyBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGFuZCBkaXN0cmlidXRlZAotdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgaXRzIHVzZSwgY29weWluZywgZGlzdHJpYnV0aW9uLCBhbmQKLWRlY29tcGlsYXRpb24uICBObyBwYXJ0IG9mIHRoaXMgcHJvZHVjdCBvciBkb2N1bWVudGF0aW9uIG1heSBiZQotcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KLW9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LiAgCi0KLVRoaXJkIHBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcyBjb3B5cmlnaHRlZCBhbmQgCi1saWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuIAotCi1TdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gTG9nbywgU29sYXJpcywgSmF2YSwgSmF2YVNlcnZlciBQYWdlcywgSmF2YSAKLU5hbWluZyBhbmQgRGlyZWN0b3J5IEludGVyZmFjZSwgSkRCQywgSkRLLCBKYXZhTWFpbCBhbmQgRW50ZXJwcmlzZSBKYXZhQmVhbnMsIAotYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYyBpbiB0aGUgVS5TLiAKLWFuZCBvdGhlciBjb3VudHJpZXMuCi0KLUFsbCBTUEFSQyB0cmFkZW1hcmtzIGFyZSB1c2VkIHVuZGVyIGxpY2Vuc2UgYW5kIGFyZSB0cmFkZW1hcmtzCi1vciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU1BBUkMgSW50ZXJuYXRpb25hbCwgSW5jLgotaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4gUHJvZHVjdHMgYmVhcmluZyBTUEFSQwotdHJhZGVtYXJrcyBhcmUgYmFzZWQgdXBvbiBhbiBhcmNoaXRlY3R1cmUgZGV2ZWxvcGVkIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gCi0KLVBvc3RTY3JpcHQgaXMgYSByZWdpc3RlcmVkIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zLCBJbmMuIAotCi0gCi1GZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMgU3ViamVjdCB0byAKLVN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLQotIAotRE9DVU1FTlRBVElPTiBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTEwgRVhQUkVTUyBPUiBJTVBMSUVECi1DT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5EIFdBUlJBTlRJRVMsIElOQ0xVRElORyBBTlkKLUlNUExJRUQgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UgT1IgTk9OLUlORlJJTkdFTUVOVCwgQVJFIERJU0NMQUlNRUQsIEVYQ0VQVAotVE8gVEhFIEVYVEVOVCBUSEFUIFNVQ0ggRElTQ0xBSU1FUlMgQVJFIEhFTEQgVE8gQkUgTEVHQUxMWQotSU5WQUxJRC4KLQotX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotQ29weXJpZ2h0IDE5OTkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgCi05MDEgU2FuIEFudG9uaW8gUm9hZCwgUGFsbyBBbHRvLCBDQSAgOTQzMDMsIEV0YXRzLVVuaXMuIAotVG91cyBkcm9pdHMgcmUnc2VydmUncy4KLSAKLQotQ2UgcHJvZHVpdCBvdSBkb2N1bWVudCBlc3QgcHJvdGUnZ2UnIHBhciB1biBjb3B5cmlnaHQgZXQgZGlzdHJpYnVlJyBhdmVjIAotZGVzIGxpY2VuY2VzIHF1aSBlbiByZXN0cmVpZ25lbnQgbCd1dGlsaXNhdGlvbiwgbGEgY29waWUsIGxhIGRpc3RyaWJ1dGlvbiwKLWV0IGxhIGRlJ2NvbXBpbGF0aW9uLiAgQXVjdW5lIHBhcnRpZSBkZSBjZSBwcm9kdWl0IG91IGRlIHNhIGRvY3VtZW50YXRpb24KLWFzc29jaWUnZSBuZSBwZXV0IGVedHJlIHJlcHJvZHVpdGUgc291cyBhdWN1bmUgZm9ybWUsIHBhciBxdWVscXVlIG1veWVuIAotcXVlIGNlIHNvaXQsIHNhbnMgbCdhdXRvcmlzYXRpb24gcHJlJ2FsYWJsZSBldCBlJ2NyaXRlIGRlIFN1biBldCBkZSBzZXMgCi1iYWlsbGV1cnMgZGUgbGljZW5jZSwgcydpbCB5IGVuIGEuICAKLQotTGUgbG9naWNpZWwgZGUndGVudSBwYXIgZGVzIHRpZXJzLCBldCBxdWkgY29tcHJlbmQgbGEgdGVjaG5vbG9naWUgCi1yZWxhdGl2ZSBhdXggcG9saWNlcyBkZSBjYXJhY3RlYHJlcywgZXN0IHByb3RlJ2dlJyBwYXIgdW4gY29weXJpZ2h0IAotZXQgbGljZW5jaWUnIHBhciBkZXMgZm91cm5pc3NldXJzIGRlIFN1bi4KLSAKLVN1biwgU3VuIE1pY3Jvc3lzdGVtcywgbGUgbG9nbyBTdW4sIFNvbGFyaXMsIEphdmEsIEphdmFTZXJ2ZXIgUGFnZXMsIEphdmEgCi1OYW1pbmcgYW5kIERpcmVjdG9yeSBJbnRlcmZhY2UsIEpEQkMsIEpESywgSmF2YU1haWwsIGV0IEVudGVycHJpc2UgSmF2YUJlYW5zLCAgCi1zb250IGRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzIGRlJ3Bvc2UnZXMgZGUgU3VuIAotTWljcm9zeXN0ZW1zLCBJbmMuIGF1eCBFdGF0cy1VbmlzIGV0IGRhbnMgZCdhdXRyZXMgcGF5cy4KLSAKLVRvdXRlcyBsZXMgbWFycXVlcyBTUEFSQyBzb250IHV0aWxpc2UnZXMgc291cyBsaWNlbmNlIGV0IHNvbnQKLWRlcyBtYXJxdWVzIGRlIGZhYnJpcXVlIG91IGRlcyBtYXJxdWVzIGRlJ3Bvc2UnZXMgZGUgU1BBUkMKLUludGVybmF0aW9uYWwsIEluYy4gYXV4IEV0YXRzLVVuaXMgZXQgIGRhbnMKLWQnYXV0cmVzIHBheXMuIExlcyBwcm9kdWl0cyBwb3J0YW50IGxlcyBtYXJxdWVzIFNQQVJDIHNvbnQKLWJhc2UncyBzdXIgdW5lIGFyY2hpdGVjdHVyZSBkZSd2ZWxvcHBlJ2UgcGFyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIAotCi1Qb3N0Y3JpcHQgZXN0IHVuZSBtYXJxdWUgZW5yZWdpc3RyZSdlIGQnQWRvYmUgU3lzdGVtcyBJbmMuIAotIAotTEEgRE9DVU1FTlRBVElPTiBFU1QgRk9VUk5JRSAiRU4gTCdFVEFUIiBFVCBUT1VURVMgQVVUUkVTIENPTkRJVElPTlMsCi1ERUNMQVJBVElPTlMgRVQgR0FSQU5USUVTIEVYUFJFU1NFUyBPVSBUQUNJVEVTIFNPTlQgRk9STUVMTEVNRU5UIEVYQ0xVRVMsCi1EQU5TIExBIE1FU1VSRSBBVVRPUklTRUUgUEFSIExBIExPSSBBUFBMSUNBQkxFLCBZIENPTVBSSVMgTk9UQU1NRU5UCi1UT1VURSBHQVJBTlRJRSBJTVBMSUNJVEUgUkVMQVRJVkUgQSBMQSBRVUFMSVRFIE1BUkNIQU5ERSwgQSBMJ0FQVElUVURFCi1BIFVORSBVVElMSVNBVElPTiBQQVJUSUNVTElFUkUgT1UgQSBMJ0FCU0VOQ0UgREUgQ09OVFJFRkFDT04uCi0tLT4KLQotPCEtLQotCi0gICBUaGlzIGlzIHRoZSBEVEQgZGVmaW5pbmcgdGhlIEphdmFTZXJ2ZXIgUGFnZXMgMS4xIFRhZyBMaWJyYXJ5Ci0gICBkZXNjcmlwdG9yICgudGxkKSAoWE1MKSBmaWxlIGZvcm1hdC9zeW50YXguCi0KLSAgIEEgVGFnIExpYnJhcnkgaXMgYSBKQVIgZmlsZSBjb250YWluaW5nIGEgdmFsaWQgaW5zdGFuY2Ugb2YgYSBUYWcgTGlicmFyeQotICAgRGVzY3JpcHRvciAodGFnbGliLnRsZCkgZmlsZSBpbiB0aGUgTUVUQS1JTkYgc3ViZGlyZWN0b3J5LCBhbG9uZyB3aXRoIHRoZQotICAgYXBwcm9wcmlhdGUgaW1wbGVtZW50aW5nIGNsYXNzZXMsIGFuZCBvdGhlciByZXNvdXJjZXMgcmVxdWlyZWQgdG8KLSAgIGltcGxlbWVudCB0aGUgdGFncyBkZWZpbmVkIHRoZXJlaW4uCi0KLSAgLS0+Ci0KLTwhLS0KLVRoZSB0YWdsaWIgdGFnIGlzIHRoZSBkb2N1bWVudCByb290LCBpdCBkZWZpbmVzOgotCi10bGlidmVyc2lvbgl0aGUgdmVyc2lvbiBvZiB0aGUgdGFnIGxpYnJhcnkgaW1wbGVtZW50YXRpb24KLWpzcHZlcnNpb24JdGhlIHZlcnNpb24gb2YgSlNQIHRoZSB0YWcgbGlicmFyeSBkZXBlbmRzIHVwb24KLQotc2hvcnRuYW1lCWEgc2ltcGxlIGRlZmF1bHQgc2hvcnQgbmFtZSB0aGF0IGNvdWxkIGJlIHVzZWQgYnkKLQkJYSBKU1AgYXV0aG9yaW5nIHRvb2wgdG8gY3JlYXRlIG5hbWVzIHdpdGggYSBtbmVtb25pYwotCQl2YWx1ZTsgZm9yIGV4YW1wbGUsIHRoZSBpdCBtYXkgYmUgdXNlZCBhcyB0aGUgcHJlZmVyZWQKLQkJcHJlZml4IHZhbHVlIGluIHRhZ2xpYiBkaXJlY3RpdmVzCi11cmkJCWEgdXJpIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoaXMgdGFnbGliCi1pbmZvCQlhIHNpbXBsZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgInVzZSIgb2YgdGhpcyB0YWdsaWIsCi0JCXNob3VsZCBiZSB1c2VyIGRpc2Nlcm5hYmxlCi0tLT4KLQotPCFFTEVNRU5UIHRhZ2xpYiAodGxpYnZlcnNpb24sIGpzcHZlcnNpb24/LCBzaG9ydG5hbWUsIHVyaT8sIGluZm8/LCB0YWcrKSA+Ci08IUFUVExJU1QgdGFnbGliIGlkIElEICNJTVBMSUVECi0JICB4bWxucyBDREFUQSAjRklYRUQKLQkJImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMS5kdGQiCi0+Ci0KLTwhLS0KLURlc2NyaWJlcyB0aGlzIHZlcnNpb24gKG51bWJlcikgb2YgdGhlIHRhZ2xpYnJhcnkgKGRld2V5IGRlY2ltYWwpCi0KLSNQQ0RBVEEgOjo9IFswLTldKnsgIi4iWzAtOV0gfTAuLjMKLS0tPgotCi08IUVMRU1FTlQgdGxpYnZlcnNpb24gKCNQQ0RBVEEpID4KLQotPCEtLQotRGVzY3JpYmVzIHRoZSBKU1AgdmVyc2lvbiAobnVtYmVyKSB0aGlzIHRhZ2xpYnJhcnkgcmVxdWlyZXMgaW4KLW9yZGVyIHRvIGZ1bmN0aW9uIChkZXdleSBkZWNpbWFsKQotCi1UaGUgZGVmYXVsdCBpcyAxLjEKLQotI1BDREFUQSA6Oj0gWzAtOV0qeyAiLiJbMC05XSB9MC4uMwotLS0+Ci0KLTwhRUxFTUVOVCBqc3B2ZXJzaW9uICAoI1BDREFUQSkgPgotCi08IS0tCi1EZWZpbmVzIGEgc2hvcnQgKGRlZmF1bHQpIHNob3J0bmFtZSB0byBiZSB1c2VkIGZvciB0YWdzIGFuZAotdmFyaWFibGUgbmFtZXMgdXNlZC9jcmVhdGVkIGJ5IHRoaXMgdGFnIGxpYnJhcnkuICBEbyBub3QgdXNlCi13aGl0ZSBzcGFjZSwgYW5kIGRvIG5vdCBzdGFydCB3aXRoIGRpZ2l0cyBvciB1bmRlcnNjb3JlLgotCi0jUENEQVRBIDo6PSBOTVRPS0VOCi0tLT4KLQotPCFFTEVNRU5UIHNob3J0bmFtZSAgICAgICgjUENEQVRBKSA+Ci0KLTwhLS0KLURlZmluZXMgYSBwdWJsaWMgVVJJIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIHZlcnNpb24gb2YKLXRoZSB0YWdsaWJyYXJ5IExlYXZlIGl0IGVtcHR5IGlmIGl0IGRvZXMgbm90IGFwcGx5LgotLS0+Ci0KLTwhRUxFTUVOVCB1cmkJICgjUENEQVRBKSA+Ci0KLTwhLS0KLURlZmluZXMgYW4gYXJiaXRyYXJ5IHRleHQgc3RyaW5nIGRlc2NpcmJpbmcgdGhlIHRhZyBsaWJyYXJ5Ci0tLT4KLQotPCFFTEVNRU5UIGluZm8JKCNQQ0RBVEEpID4KLQotPCEtLQotVGhlIHRhZyBkZWZpbmVzIGEgdW5pcXVlIHRhZyBpbiB0aGlzIHRhZyBsaWJyYXJ5LCBkZWZpbmluZzoKLQotLSB0aGUgdW5pcXVlIHRhZy9lbGVtZW50IG5hbWUKLS0gdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWcgaW1wbGVtZW50YXRpb24gY2xhc3MKLS0gYW4gb3B0aW9uYWwgc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbwotLSB0aGUgYm9keSBjb250ZW50IHR5cGUgKGhpbnQpCi0tIG9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbgotLSBhbnkgYXR0cmlidXRlcwotLS0+Ci0KLTwhRUxFTUVOVCB0YWcgKG5hbWUsIHRhZ2NsYXNzLCB0ZWljbGFzcz8sIGJvZHljb250ZW50PywgaW5mbz8sIGF0dHJpYnV0ZSopID4KLQotPCEtLQotRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VybHZldC5qc3AudGFnZXh0LlRhZyB0aGF0IGltcGxlbWVudHMKLXRoZSByZXF1ZXN0IHRpbWUgc2VtYW50aWNzIGZvciB0aGlzIHRhZy4gKHJlcXVpcmVkKQotCi0jUENEQVRBIDo6PSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lCi0tLT4KLQotPCFFTEVNRU5UIHRhZ2NsYXNzICgjUENEQVRBKSA+Ci0KLTwhLS0KLURlZmluZXMgdGhlIHN1YmNsYXNzIG9mIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8gZm9yCi10aGlzIHRhZy4gKG9wdGlvbmFsKQotCi1JZiB0aGlzIGlzIG5vdCBnaXZlbiwgdGhlIGNsYXNzIGlzIG5vdCBjb25zdWx0ZWQgYXQgdHJhbnNsYXRpb24gdGltZS4KLQotI1BDREFUQSA6Oj0gZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZQotLS0+Ci0KLTwhRUxFTUVOVCB0ZWljbGFzcyAoI1BDREFUQSkgPgotCi08IS0tCi1Qcm92aWRlcyBhIGhpbnQgYXMgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGJvZHkgb2YgdGhpcyB0YWcuIFByaW1hcmlseQotaW50ZW5kZWQgZm9yIHVzZSBieSBwYWdlIGNvbXBvc2l0aW9uIHRvb2xzLgotCi1UaGVyZSBhcmUgY3VycmVudGx5IHRocmVlIHZhbHVlcyBzcGVjaWZpZWQ6Ci0KLXRhZ2RlcGVuZGVudAlUaGUgYm9keSBvZiB0aGUgdGFnIGlzIGludGVycHJldGVkIGJ5IHRoZSB0YWcKLQkJaW1wbGVtZW50YXRpb24gaXRzZWxmLCBhbmQgaXMgbW9zdCBsaWtlbHkgaW4gYQotCQlkaWZmZXJlbnQgImxhbmdhZ2UiLCBlLmcgZW1iZWRkZWQgU1FMIHN0YXRlbWVudHMuCi0KLUpTUAkJVGhlIGJvZHkgb2YgdGhlIHRhZyBjb250YWlucyBuZXN0ZWQgSlNQIHN5bnRheAotCi1lbXB0eQkJVGhlIGJvZHkgbXVzdCBiZSBlbXB0eQotCi1UaGUgZGVmYXVsdCAoaWYgbm90IGRlZmluZWQpIGlzIEpTUAotCi0jUENEQVRBIDo6PSAgdGFnZGVwZW5kZW50IHwgSlNQIHwgZW1wdHkKLQotLS0+Ci0KLTwhRUxFTUVOVCBib2R5Y29udGVudCAoI1BDREFUQSkgPgotCi08IS0tCi1UaGUgYXR0cmlidXRlIHRhZyBkZWZpbmVzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIG5lc3RpbmcgdGFnCi0KLUFuIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGlzIGNvbXBvc2VkIG9mOgotCi0tIHRoZSBhdHRyaWJ1dGVzIG5hbWUgKHJlcXVpcmVkKQotLSBpZiB0aGUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yIG9wdGlvbmFsIChvcHRpb25hbCkKLS0gaWYgdGhlIGF0dHJpYnV0ZXMgdmFsdWUgbWF5IGJlIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWQgYXQgcnVudGltZQotICBieSBhIHNjcmlwdGxldCBleHByZXNzaW9uIChvcHRpb25hbCkKLQotLS0+Ci0KLTwhRUxFTUVOVCBhdHRyaWJ1dGUgKG5hbWUsIHJlcXVpcmVkPyAsIHJ0ZXhwcnZhbHVlPykgPgotCi08IS0tCi1EZWZpbmVzIHRoZSBjYW5vbmljYWwgbmFtZSBvZiBhIHRhZyBvciBhdHRyaWJ1dGUgYmVpbmcgZGVmaW5lZAotCi0jUENEQVRBIDo6PSBOTVRPS0VOCi0tLT4KLQotPCFFTEVNRU5UIG5hbWUJKCNQQ0RBVEEpID4KLQotPCEtLQotRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwuCi0KLSNQQ0RBVEEgOjo9IHRydWUgfCBmYWxzZSB8IHllcyB8IG5vCi0KLUlmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZSBhdHRyaWJ1dGUKLWlzIG9wdGlvbmFsLgotLS0+Ci0KLTwhRUxFTUVOVCByZXF1aXJlZCAgICAoI1BDREFUQSkgPgotCi08IS0tCi1EZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBjYW4gaGF2ZSBzY3JpcHRsZXQgZXhwcmVzc2lvbnMgYXMKLWEgdmFsdWUsIGkuZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZAotYXQgcmVxdWVzdCB0aW1lLCBhcyBvcHBvc2VkIHRvIGEgc3RhdGljIHZhbHVlIGRldGVybWluZWQgYXQgdHJhbnNsYXRpb24KLXRpbWUuCi0KLSNQQ0RBVEEgOjo9IHRydWUgfCBmYWxzZSB8IHllcyB8IG5vCi0KLUlmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZSBhdHRyaWJ1dGUKLWhhcyBhIHN0YXRpYyB2YWx1ZQotLS0+Ci0KLTwhRUxFTUVOVCBydGV4cHJ2YWx1ZSAoI1BDREFUQSkgPgotCi08IUFUVExJU1QgdGxpYnZlcnNpb24gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QganNwdmVyc2lvbiBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBzaG9ydG5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdXJpIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGluZm8gaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdGFnIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRhZ2NsYXNzIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRlaWNsYXNzIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGJvZHljb250ZW50IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGF0dHJpYnV0ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBuYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcXVpcmVkIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJ0ZXhwcnZhbHVlIGlkIElEICNJTVBMSUVEPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8xXzIuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8xXzIuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDJlYjVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDQ2OCArMCwwIEBACi0KLTwhLS0KLSAgIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zLgotICAtLT4KLQotPCEtLQotCi0gICBUaGlzIGlzIHRoZSBEVEQgZGVmaW5pbmcgdGhlIEphdmFTZXJ2ZXIgUGFnZXMgMS4yIFRhZyBMaWJyYXJ5Ci0gICBkZXNjcmlwdG9yICgudGxkKSAoWE1MKSBmaWxlIGZvcm1hdC9zeW50YXguCi0KLSAgIEEgVGFnIExpYnJhcnkgaXMgYSBKQVIgZmlsZSBjb250YWluaW5nIGEgdmFsaWQgaW5zdGFuY2Ugb2YgYSBUYWcgTGlicmFyeQotICAgRGVzY3JpcHRvciAodGFnbGliLnRsZCkgZmlsZSBpbiB0aGUgTUVUQS1JTkYgc3ViZGlyZWN0b3J5LCBhbG9uZyB3aXRoIHRoZQotICAgYXBwcm9wcmlhdGUgaW1wbGVtZW50aW5nIGNsYXNzZXMsIGFuZCBvdGhlciByZXNvdXJjZXMgcmVxdWlyZWQgdG8KLSAgIGltcGxlbWVudCB0aGUgdGFncyBkZWZpbmVkIHRoZXJlaW4uCi0KLSAgIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMuCi0gIC0tPgotICAKLTwhTk9UQVRJT04gV0VCLUpTUFRBR0xJQi4xXzIgUFVCTElDCi0gICAgICAgICAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKU1AgVGFnIExpYnJhcnkgMS4yLy9FTiI+Ci0KLTwhLS0KLVRoaXMgaXMgdGhlIFhNTCBEVEQgZm9yIHRoZSBKU1AgMS4yIFRhZyBMaWJyYXJ5IERlc2NyaXB0b3IuCi1BbGwgSlNQIDEuMiB0YWcgbGlicmFyeSBkZXNjcmlwdG9ycyBtdXN0IGluY2x1ZGUgYSBET0NUWVBFCi1vZiB0aGUgZm9sbG93aW5nIGZvcm06Ci0KLSAgPCFET0NUWVBFIHRhZ2xpYgotICAgICAgICBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKU1AgVGFnIExpYnJhcnkgMS4yLy9FTiIKLQkiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZCI+Ci0KLS0tPgotCi08IS0tCi1UaGUgdGFnbGliIHRhZyBpcyB0aGUgZG9jdW1lbnQgcm9vdCwgaXQgZGVmaW5lczoKLQotdGxpYi12ZXJzaW9uCXRoZSB2ZXJzaW9uIG9mIHRoZSB0YWcgbGlicmFyeSBpbXBsZW1lbnRhdGlvbgotCi1qc3AtdmVyc2lvbgl0aGUgdmVyc2lvbiBvZiBKU1AgdGhlIHRhZyBsaWJyYXJ5IGRlcGVuZHMgdXBvbgotCi1zaG9ydC1uYW1lCWEgc2ltcGxlIGRlZmF1bHQgc2hvcnQgbmFtZSB0aGF0IGNvdWxkIGJlIHVzZWQgYnkKLQkJYSBKU1AgYXV0aG9yaW5nIHRvb2wgdG8gY3JlYXRlIG5hbWVzIHdpdGggYSBtbmVtb25pYwotCQl2YWx1ZTsgZm9yIGV4YW1wbGUsIHRoZSBpdCBtYXkgYmUgdXNlZCBhcyB0aGUgcHJlZmVyZWQKLQkJcHJlZml4IHZhbHVlIGluIHRhZ2xpYiBkaXJlY3RpdmVzCi0KLXVyaQkJYSB1cmkgdW5pcXVlbHkgaWRlbnRpZnlpbmcgdGhpcyB0YWdsaWIKLQotZGlzcGxheS1uYW1lICAgIHRoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdAotICAgICAgICAgICAgICAgIGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZCBieSB0b29scwotc21hbGwtaWNvbiAgICAgIG9wdGlvbmFsIHNtYWxsLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scwotCi1sYXJnZS1pY29uICAgICAgb3B0aW9uYWwgbGFyZ2UtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0KLWRlc2NyaXB0aW9uCWEgc2ltcGxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSAidXNlIiBvZiB0aGlzIHRhZ2xpYiwKLQkJc2hvdWxkIGJlIHVzZXIgZGlzY2VybmFibGUKLQotdmFsaWRhdG9yICAgICAgIG9wdGlvbmFsIFRhZ0xpYnJhcnlWYWxpZGF0b3IgaW5mb3JtYXRpb24KLQotbGlzdGVuZXIgICAgICAgIG9wdGlvbmFsIGV2ZW50IGxpc3RlbmVyIHNwZWNpZmljYXRpb24KLQotCi0tLT4KLQotPCFFTEVNRU5UIHRhZ2xpYiAodGxpYi12ZXJzaW9uLCBqc3AtdmVyc2lvbiwgc2hvcnQtbmFtZSwgdXJpPywKLSAgICAgICAgICAgICAgICAgIGRpc3BsYXktbmFtZT8sIHNtYWxsLWljb24/LCBsYXJnZS1pY29uPywgZGVzY3JpcHRpb24/LAotICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yPywgbGlzdGVuZXIqLCB0YWcrKSA+Ci0KLTwhQVRUTElTVCB0YWdsaWIgaWQgSUQgI0lNUExJRUQKLQkgIHhtbG5zIENEQVRBICNGSVhFRAotCQkiaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvVGFnTGlicmFyeURlc2NyaXB0b3IiCi0+Ci0KLTwhLS0KLURlc2NyaWJlcyB0aGlzIHZlcnNpb24gKG51bWJlcikgb2YgdGhlIHRhZ2xpYnJhcnkgKGRld2V5IGRlY2ltYWwpCi0KLSNQQ0RBVEEgOjo9IFswLTldKnsgIi4iWzAtOV0gfTAuLjMKLS0tPgotCi08IUVMRU1FTlQgdGxpYi12ZXJzaW9uICgjUENEQVRBKSA+Ci0KLTwhLS0KLURlc2NyaWJlcyB0aGUgSlNQIHZlcnNpb24gKG51bWJlcikgdGhpcyB0YWdsaWJyYXJ5IHJlcXVpcmVzIGluCi1vcmRlciB0byBmdW5jdGlvbiAoZGV3ZXkgZGVjaW1hbCkKLQotVGhlIGRlZmF1bHQgaXMgMS4yCi0KLSNQQ0RBVEEgOjo9IFswLTldKnsgIi4iWzAtOV0gfTAuLjMKLS0tPgotCi08IUVMRU1FTlQganNwLXZlcnNpb24gICgjUENEQVRBKSA+Ci0KLTwhLS0KLURlZmluZXMgYSBzaG9ydCAoZGVmYXVsdCkgc2hvcnQtbmFtZSB0byBiZSB1c2VkIGZvciB0YWdzIGFuZAotdmFyaWFibGUgbmFtZXMgdXNlZC9jcmVhdGVkIGJ5IHRoaXMgdGFnIGxpYnJhcnkuICBEbyBub3QgdXNlCi13aGl0ZSBzcGFjZSwgYW5kIGRvIG5vdCBzdGFydCB3aXRoIGRpZ2l0cyBvciB1bmRlcnNjb3JlLgotCi0jUENEQVRBIDo6PSBOTVRPS0VOCi0tLT4KLQotPCFFTEVNRU5UIHNob3J0LW5hbWUgICAgICAoI1BDREFUQSkgPgotCi08IS0tCi1EZWZpbmVzIGEgcHVibGljIFVSSSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyB2ZXJzaW9uIG9mCi10aGUgdGFnbGlicmFyeS4gIExlYXZlIGl0IGVtcHR5IGlmIGl0IGRvZXMgbm90IGFwcGx5LgotLS0+Ci0KLTwhRUxFTUVOVCB1cmkJICgjUENEQVRBKSA+Ci0KLTwhLS0KLURlZmluZXMgYW4gYXJiaXRyYXJ5IHRleHQgc3RyaW5nIGRlc2NpcmJpbmcgdGhlIHRhZyBsaWJyYXJ5Ci0tLT4KLQotPCFFTEVNRU5UIGRlc2NyaXB0aW9uCSgjUENEQVRBKSA+Ci0KLTwhLS0KLQotRGVmaW5lcyBhbiBvcHRpb25hbCB2YWxpZGF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0bwotdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeS4KLS0tPgotCi08IUVMRU1FTlQgdmFsaWRhdG9yICh2YWxpZGF0b3ItY2xhc3MsIGluaXQtcGFyYW0qLCBkZXNjcmlwdGlvbj8pID4KLQotCi08IS0tCi0KLURlZmluZXMgdGhlIFRhZ0xpYnJhcnlWYWxpZGF0b3IgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB0bwotdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeS4KLS0tPgotCi08IUVMRU1FTlQgdmFsaWRhdG9yLWNsYXNzICgjUENEQVRBKSA+Ci0KLQotPCEtLQotCi1UaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS92YWx1ZSBwYWlyIGFzIGFuCi1pbml0aWFsaXphdGlvbiBwYXJhbQotLS0+Ci0KLTwhRUxFTUVOVCBpbml0LXBhcmFtIChwYXJhbS1uYW1lLCBwYXJhbS12YWx1ZSwgZGVzY3JpcHRpb24/KT4KLQotPCEtLQotCi1UaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgcGFyYW1ldGVyLgotLS0+Ci0KLTwhRUxFTUVOVCBwYXJhbS1uYW1lICgjUENEQVRBKT4KLQotPCEtLQotCi1UaGUgcGFyYW0tdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYSBwYXJhbWV0ZXIuCi0tLT4KLQotPCFFTEVNRU5UIHBhcmFtLXZhbHVlICgjUENEQVRBKT4KLQotCi08IS0tCi0KLURlZmluZXMgYW4gb3B0aW9uYWwgZXZlbnQgbGlzdGVuZXIgb2JqZWN0IHRvIGJlIGluc3RhbnRpYXRlZCBhbmQKLXJlZ2lzdGVyZWQgYXV0b21hdGljYWxseS4KLS0tPgotCi08IUVMRU1FTlQgbGlzdGVuZXIgKGxpc3RlbmVyLWNsYXNzKSA+Ci0KLTwhLS0KLQotVGhlIGxpc3RlbmVyLWNsYXNzIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGFzcyBpbiB0aGUgYXBwbGljYXRpb24gdGhhdAotbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgd2ViIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uICBTZWUgdGhlCi1TZXJ2bGV0IDIuMyBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgotLS0+Ci0KLTwhRUxFTUVOVCBsaXN0ZW5lci1jbGFzcyAoI1BDREFUQSkgPgotCi0KLTwhLS0KLVRoZSB0YWcgZGVmaW5lcyBhIHVuaXF1ZSB0YWcgaW4gdGhpcyB0YWcgbGlicmFyeS4gIEl0IGhhcyBvbmUKLWF0dHJpYnV0ZSwgaWQuCi0KLVRoZSB0YWcgZWxlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHN1YmVsZW1lbnRzIGRlZmluaW5nOgotCi1uYW1lICAgICAgICAgICAgICBUaGUgdW5pcXVlIGFjdGlvbiBuYW1lCi0KLXRhZy1jbGFzcyAgICAgICAgIFRoZSB0YWcgaGFuZGxlciBjbGFzcyBpbXBsZW1lbnRpbmcKLSAgICAgICAgICAgICAgICAgIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWcKLQotdGVpLWNsYXNzICAgICAgICAgQW4gb3B0aW9uYWwgc3ViY2xhc3Mgb2YKLSAgICAgICAgICAgICAgICAgIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8KLQotYm9keS1jb250ZW50ICAgICAgVGhlIGJvZHkgY29udGVudCB0eXBlCi0KLWRpc3BsYXktbmFtZSAgICAgIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZAotICAgICAgICAgICAgICAgICAgYnkgdG9vbHMKLQotc21hbGwtaWNvbiAgICAgICAgT3B0aW9uYWwgc21hbGwtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0KLWxhcmdlLWljb24gICAgICAgIE9wdGlvbmFsIGxhcmdlLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scwotCi1kZXNjcmlwdGlvbiAgICAgICBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24KLQotdmFyaWFibGUgICAgICAgICAgT3B0aW9uYWwgc2NyaXB0aW5nIHZhcmlhYmxlIGluZm9ybWF0aW9uCi0KLWF0dHJpYnV0ZSAgICAgICAgIEFsbCBhdHRyaWJ1dGVzIG9mIHRoaXMgYWN0aW9uCi0KLWV4YW1wbGUgICAgICAgICAgIE9wdGlvbmFsIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuIGV4YW1wbGUgb2YgYQotICAgICAgICAgICAgICAgICAgdXNlIG9mIHRoaXMgdGFnCi0KLS0tPgotCi08IUVMRU1FTlQgdGFnIChuYW1lLCB0YWctY2xhc3MsIHRlaS1jbGFzcz8sIGJvZHktY29udGVudD8sIGRpc3BsYXktbmFtZT8sCi0gICAgICAgICAgICAgICBzbWFsbC1pY29uPywgbGFyZ2UtaWNvbj8sIGRlc2NyaXB0aW9uPywgdmFyaWFibGUqLCBhdHRyaWJ1dGUqLAotICAgICAgICAgICAgICAgZXhhbXBsZT8pID4KLQotPCEtLQotRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VybHZldC5qc3AudGFnZXh0LlRhZyB0aGF0IGltcGxlbWVudHMKLXRoZSByZXF1ZXN0IHRpbWUgc2VtYW50aWNzIGZvciB0aGlzIHRhZy4gKHJlcXVpcmVkKQotCi0jUENEQVRBIDo6PSBmdWxseSBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lCi0tLT4KLQotPCFFTEVNRU5UIHRhZy1jbGFzcyAoI1BDREFUQSkgPgotCi08IS0tCi1EZWZpbmVzIHRoZSBzdWJjbGFzcyBvZiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvIGZvcgotdGhpcyB0YWcuIChvcHRpb25hbCkKLQotSWYgdGhpcyBpcyBub3QgZ2l2ZW4sIHRoZSBjbGFzcyBpcyBub3QgY29uc3VsdGVkIGF0IHRyYW5zbGF0aW9uIHRpbWUuCi0KLSNQQ0RBVEEgOjo9IGZ1bGx5IHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUKLS0tPgotCi08IUVMRU1FTlQgdGVpLWNsYXNzICgjUENEQVRBKSA+Ci0KLTwhLS0KLVByb3ZpZGVzIGEgaGludCBhcyB0byB0aGUgY29udGVudCBvZiB0aGUgYm9keSBvZiB0aGlzIHRhZy4gUHJpbWFyaWx5Ci1pbnRlbmRlZCBmb3IgdXNlIGJ5IHBhZ2UgY29tcG9zaXRpb24gdG9vbHMuCi0KLVRoZXJlIGFyZSBjdXJyZW50bHkgdGhyZWUgdmFsdWVzIHNwZWNpZmllZDoKLQotdGFnZGVwZW5kZW50CVRoZSBib2R5IG9mIHRoZSB0YWcgaXMgaW50ZXJwcmV0ZWQgYnkgdGhlIHRhZwotCQlpbXBsZW1lbnRhdGlvbiBpdHNlbGYsIGFuZCBpcyBtb3N0IGxpa2VseSBpbiBhCi0JCWRpZmZlcmVudCAibGFuZ2FnZSIsIGUuZyBlbWJlZGRlZCBTUUwgc3RhdGVtZW50cy4KLQotSlNQCQlUaGUgYm9keSBvZiB0aGUgdGFnIGNvbnRhaW5zIG5lc3RlZCBKU1Agc3ludGF4Ci0KLWVtcHR5CQlUaGUgYm9keSBtdXN0IGJlIGVtcHR5Ci0KLVRoZSBkZWZhdWx0IChpZiBub3QgZGVmaW5lZCkgaXMgSlNQCi0KLSNQQ0RBVEEgOjo9ICB0YWdkZXBlbmRlbnQgfCBKU1AgfCBlbXB0eQotCi0tLT4KLQotPCFFTEVNRU5UIGJvZHktY29udGVudCAoI1BDREFUQSkgPgotCi08IS0tCi0KLVRoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZAotdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzLgotLS0+Ci0KLTwhRUxFTUVOVCBkaXNwbGF5LW5hbWUgKCNQQ0RBVEEpID4KLQotCi08IS0tCi0KLVRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlIGNvbnRhaW5pbmcgYSBsYXJnZQotKDMyIHggMzIpIGljb24gaW1hZ2UuICBUaGUgZmlsZSBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlCi10YWcgbGlicmFyeS4gIFRoZSBpbWFnZSBtdXN0IGJlIGVpdGhlciBpbiB0aGUgSlBFRyBvciBHSUYgZm9ybWF0LCBhbmQKLXRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgd2l0aCB0aGUgc3VmZml4ICIuanBnIiBvciAiLmdpZiIgcmVzcGVjdGl2ZWx5LgotVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0tLT4KLQotPCFFTEVNRU5UIGxhcmdlLWljb24gKCNQQ0RBVEEpID4KLQotPCEtLQotCi1UaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIGEgbGFyZ2UKLSgzMiB4IDMyKSBpY29uIGltYWdlLiAgVGhlIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZQotdGFnIGxpYnJhcnkuICBUaGUgaW1hZ2UgbXVzdCBiZSBlaXRoZXIgaW4gdGhlIEpQRUcgb3IgR0lGIGZvcm1hdCwgYW5kCi10aGUgZmlsZSBuYW1lIG11c3QgZW5kIHdpdGggdGhlIHN1ZmZpeCAiLmpwZyIgb3IgIi5naWYiIHJlc3BlY3RpdmVseS4KLVRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotLS0+Ci0KLTwhRUxFTUVOVCBzbWFsbC1pY29uICgjUENEQVRBKSA+Ci0KLTwhLS0KLQotVGhlIGV4YW1wbGUgZWxlbWVudCBjb250YWlucyBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbiBleGFtcGxlCi1vZiB0aGUgdXNlIG9mIGEgdGFnLgotLS0+Ci0KLTwhRUxFTUVOVCBleGFtcGxlICgjUENEQVRBKSA+Ci0KLTwhLS0KLQotVGhlIHZhcmlhYmxlIHRhZyBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlcwotZGVmaW5lZCBieSB0aGlzIHRhZy4gIEl0IGlzIGEgKHRyYW5zbGF0aW9uIHRpbWUpIGVycm9yIGZvciBhIHRhZwotdGhhdCBoYXMgb25lIG9yIG1vcmUgdmFyaWFibGUgc3ViZWxlbWVudHMgdG8gaGF2ZSBhIFRhZ0V4dHJhSW5mbwotY2xhc3MgdGhhdCByZXR1cm5zIGEgbm9uLW51bGwgb2JqZWN0LgotCi1UaGUgc3ViZWxlbWVudHMgb2YgdmFyaWFibGUgYXJlIG9mIHRoZSBmb3JtOgotCi1uYW1lLWdpdmVuICAgICAgICAgICAgICAgVGhlIHZhcmlhYmxlIG5hbWUgYXMgYSBjb25zdGFudAotCi1uYW1lLWZyb20tYXR0cmlidXRlICAgICAgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHdob3NlICh0cmFuc2xhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUpIHZhbHVlIHdpbGwgZ2l2ZSB0aGUgbmFtZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS4gIE9uZSBvZiBuYW1lLWdpdmVuIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS1mcm9tLWF0dHJpYnV0ZSBpcyByZXF1aXJlZC4KLQotdmFyaWFibGUtY2xhc3MgICAgICAgICAgIE5hbWUgb2YgdGhlIGNsYXNzIG9mIHRoZSB2YXJpYWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGlzIGRlZmF1bHQuCi0KLWRlY2xhcmUgICAgICAgICAgICAgICAgICBXaGV0aGVyIHRoZSB2YXJpYWJsZSBpcyBkZWNsYXJlZCBvciBub3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSBpcyB0aGUgZGVmYXVsdC4KLQotc2NvcGUgICAgICAgICAgICAgICAgICAgIFRoZSBzY29wZSBvZiB0aGUgc2NyaXB0aW5nIHZhcmFpYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZC4gIE5FU1RFRCBpcyBkZWZhdWx0LgotCi1kZXNjcmlwdGlvbiAgICAgICAgICAgICAgT3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhpcyB2YXJpYWJsZQotCi0tLT4KLQotPCFFTEVNRU5UIHZhcmlhYmxlICggKG5hbWUtZ2l2ZW4gfCBuYW1lLWZyb20tYXR0cmlidXRlKSwgdmFyaWFibGUtY2xhc3M/LAotICAgICAgICAgICAgICAgICAgICBkZWNsYXJlPywgc2NvcGU/LCBkZXNjcmlwdGlvbj8pID4KLQotPCEtLQotCi1UaGUgbmFtZSBmb3IgdGhlIHNjcmlwdGluZyB2YXJpYWJsZS4gIE9uZSBvZiBuYW1lLWdpdmVuIG9yCi1uYW1lLWZyb20tYXR0cmlidXRlIGlzIHJlcXVpcmVkLgotLS0+Ci0KLTwhRUxFTUVOVCBuYW1lLWdpdmVuICgjUENEQVRBKSA+Ci0KLTwhLS0KLQotVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHdob3NlICh0cmFuc2xhdGlvbi10aW1lKSB2YWx1ZSB3aWxsIGdpdmUKLXRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4gIE9uZSBvZiBuYW1lLWdpdmVuIG9yIG5hbWUtZnJvbS1hdHRyaWJ1dGUKLWlzIHJlcXVpcmVkLgotLS0+Ci0KLTwhRUxFTUVOVCBuYW1lLWZyb20tYXR0cmlidXRlICgjUENEQVRBKSA+Ci0KLTwhLS0KLQotVGhlIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGNsYXNzIGZvciB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlLiAgVGhlCi1kZWZhdWx0IGlzIGphdmEubGFuZy5TdHJpbmcuCi0tLT4KLQotPCFFTEVNRU5UIHZhcmlhYmxlLWNsYXNzICgjUENEQVRBKSA+Ci0KLTwhLS0KLQotV2hldGhlciB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGlzIHRvIGJlIGRlZmluZWQgb3Igbm90LiAgU2VlCi1UYWdFeHRyYUluZm8gZm9yIGRldGFpbHMuICBUaGlzIGVsZW1lbnQgaXMgb3B0aW9uYWwgYW5kICJ0cnVlIgotaXMgdGhlIGRlZmF1bHQuCi0tLT4KLQotPCFFTEVNRU5UIGRlY2xhcmUgKCNQQ0RBVEEpID4KLQotPCEtLQotCi1UaGUgc2NvcGUgb2YgdGhlIHNjcmlwdGluZyB2YXJpYWJsZS4gIFNlZSBUYWdFeHRyYUluZm8gZm9yIGRldGFpbHMuCi1UaGUgZWxlbWVudCBpcyBvcHRpb25hbCBhbmQgIk5FU1RFRCIgaXMgdGhlIGRlZmF1bHQuICBPdGhlciBsZWdhbAotdmFsdWVzIGFyZSAiQVRfQkVHSU4iIGFuZCAiQVRfRU5EIi4KLS0tPgotCi08IUVMRU1FTlQgc2NvcGUgKCNQQ0RBVEEpID4KLQotPCEtLQotCi1UaGUgYXR0cmlidXRlIHRhZyBkZWZpbmVzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIG5lc3RpbmcgdGFnCi0KLUFuIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGlzIGNvbXBvc2VkIG9mOgotCQotLSB0aGUgYXR0cmlidXRlcyBuYW1lIChyZXF1aXJlZCkKLS0gaWYgdGhlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvciBvcHRpb25hbCAob3B0aW9uYWwpCi0tIGlmIHRoZSBhdHRyaWJ1dGVzIHZhbHVlIG1heSBiZSBkeW5hbWljYWxseSBjYWxjdWxhdGVkIGF0IHJ1bnRpbWUKLSAgYnkgYSBzY3JpcHRsZXQgZXhwcmVzc2lvbiAob3B0aW9uYWwpCi0tIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGVzIHZhbHVlIChvcHRpb25hbCkKLS0gYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgdGhlIG1lYW5pbmcgb2YgdGhlIGF0dHJpYnV0ZSAob3B0aW9uYWwpCi0KLS0tPgotCi0KLTwhLS0KLVRoZSBhdHRyaWJ1dGUgdGFnIGRlZmluZXMgYW4gYXR0cmlidXRlIGZvciB0aGUgbmVzdGluZyB0YWcKLQotQW4gYXR0cmlidXRlIGRlZmluaXRpb24gaXMgY29tcG9zZWQgb2Y6Ci0KLS0gdGhlIGF0dHJpYnV0ZXMgbmFtZSAocmVxdWlyZWQpCi0KLS0gaWYgdGhlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvciBvcHRpb25hbCAob3B0aW9uYWwpCi0KLS0gaWYgdGhlIGF0dHJpYnV0ZXMgdmFsdWUgbWF5IGJlIGR5bmFtaWNhbGx5IGNhbGN1bGF0ZWQgYXQgcnVudGltZQotICBieSBhIHNjcmlwdGxldCBleHByZXNzaW9uIChvcHRpb25hbCkKLQotLSB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlcyB2YWx1ZSAob3B0aW9uYWwpCi0KLS0gYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgdGhlIG1lYW5pbmcgb2YgdGhlIGF0dHJpYnV0ZSAob3B0aW9uYWwpCi0tLT4KLQotPCFFTEVNRU5UIGF0dHJpYnV0ZSAobmFtZSwgcmVxdWlyZWQ/ICwgcnRleHBydmFsdWU/LCB0eXBlPywgZGVzY3JpcHRpb24/KSA+Ci0KLTwhLS0KLURlZmluZXMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIGEgdGFnIG9yIGF0dHJpYnV0ZSBiZWluZyBkZWZpbmVkCi0KLSNQQ0RBVEEgOjo9IE5NVE9LRU4KLS0tPgotCi08IUVMRU1FTlQgbmFtZQkoI1BDREFUQSkgPgotCi08IS0tCi1EZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvciBvcHRpb25hbC4KLQotI1BDREFUQSA6Oj0gdHJ1ZSB8IGZhbHNlIHwgeWVzIHwgbm8KLQotSWYgbm90IHByZXNlbnQgdGhlbiB0aGUgZGVmYXVsdCBpcyAiZmFsc2UiLCBpLmUgdGhlIGF0dHJpYnV0ZQotaXMgb3B0aW9uYWwuCi0tLT4KLQotPCFFTEVNRU5UIHJlcXVpcmVkICAgICgjUENEQVRBKSA+Ci0KLTwhLS0KLURlZmluZXMgaWYgdGhlIG5lc3RpbmcgYXR0cmlidXRlIGNhbiBoYXZlIHNjcmlwdGxldCBleHByZXNzaW9ucyBhcwotYSB2YWx1ZSwgaS5lIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIG1heSBiZSBkeW5hbWljYWxseSBjYWxjdWxhdGVkCi1hdCByZXF1ZXN0IHRpbWUsIGFzIG9wcG9zZWQgdG8gYSBzdGF0aWMgdmFsdWUgZGV0ZXJtaW5lZCBhdCB0cmFuc2xhdGlvbgotdGltZS4KLQotI1BDREFUQSA6Oj0gdHJ1ZSB8IGZhbHNlIHwgeWVzIHwgbm8KLQotSWYgbm90IHByZXNlbnQgdGhlbiB0aGUgZGVmYXVsdCBpcyAiZmFsc2UiLCBpLmUgdGhlIGF0dHJpYnV0ZQotaGFzIGEgc3RhdGljIHZhbHVlCi0tLT4KLQotPCFFTEVNRU5UIHJ0ZXhwcnZhbHVlICgjUENEQVRBKSA+Ci0KLQotPCEtLQotCi1EZWZpbmVzIHRoZSBKYXZhIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZXMgdmFsdWUuICBGb3Igc3RhdGljIHZhbHVlcwotKHRob3NlIGRldGVybWluZWQgYXQgdHJhbnNsYXRpb24gdGltZSkgdGhlIHR5cGUgaXMgYWx3YXlzCi1qYXZhLmxhbmcuU3RyaW5nLgotLS0+Ci0KLTwhRUxFTUVOVCB0eXBlICgjUENEQVRBKSA+Ci0KLQotPCEtLSBJRCBhdHRyaWJ1dGVzIC0tPgotCi08IUFUVExJU1QgdGxpYi12ZXJzaW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGpzcC12ZXJzaW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHNob3J0LW5hbWUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdXJpIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGRlc2NyaXB0aW9uIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGV4YW1wbGUgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgdGFnIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHRhZy1jbGFzcyBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCB0ZWktY2xhc3MgaWQgSUQgI0lNUExJRUQ+Ci08IUFUVExJU1QgYm9keS1jb250ZW50IGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGF0dHJpYnV0ZSBpZCBJRCAjSU1QTElFRD4KLTwhQVRUTElTVCBuYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJlcXVpcmVkIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHJ0ZXhwcnZhbHVlIGlkIElEICNJTVBMSUVEPgotCi0KLTwhQVRUTElTVCBwYXJhbS1uYW1lIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIHBhcmFtLXZhbHVlIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxpc3RlbmVyIGlkIElEICNJTVBMSUVEPgotPCFBVFRMSVNUIGxpc3RlbmVyLWNsYXNzIGlkIElEICNJTVBMSUVEPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8yXzAueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8yXzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjU4NjQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMl8wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHhzZDpzY2hlbWEKLSAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczpqMmVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIgotICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICB4bWxuczp4bWw9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKLSAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgdmVyc2lvbj0iMi4wIj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKXdlYi1qc3B0YWdsaWJyYXJ5XzJfMC54c2RzCTEuMzYgMDgvMTgvMDMKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIENvcHlyaWdodCAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4sIDkwMSBTYW4gQW50b25pbwotICAgICAgUm9hZCwgUGFsbyBBbHRvLCBDYWxpZm9ybmlhIDk0MzAzLCBVLlMuQS4gQWxsIHJpZ2h0cwotICAgICAgcmVzZXJ2ZWQuCi0KLSAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotCi0gICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0KLSAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLQotICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8IVtDREFUQVsKLQotCVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBKU1AgVGFnbGlicmFyeQotCWRlc2NyaXB0b3IuICBBbGwgVGFnbGlicmFyeSBkZXNjcmlwdG9ycyBtdXN0Ci0JaW5kaWNhdGUgdGhlIHRhZyBsaWJyYXJ5IHNjaGVtYSBieSB1c2luZyB0aGUgVGFnbGlicmFyeQotCW5hbWVzcGFjZToKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUKLQotCWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLQl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0JICAgIDx0YWdsaWIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiCi0JICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Ii4uLiIKLQkgICAgICB2ZXJzaW9uPSIyLjAiPgotCSAgICAgIC4uLgotCSAgICA8L3RhZ2xpYj4KLQotCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQKLQl2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgdXNpbmcgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZQotCWZvciBKMkVFIG5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMC54c2QKLQotCV1dPgotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDppbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJqMmVlXzFfNC54c2QiLz4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliIiB0eXBlPSJqMmVlOnRsZFRhZ2xpYlR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB0YWdsaWIgdGFnIGlzIHRoZSBkb2N1bWVudCByb290LgotCVRoZSBkZWZpbml0aW9uIG9mIHRhZ2xpYiBpcyBwcm92aWRlZAotCWJ5IHRoZSB0bGRUYWdsaWJUeXBlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDp1bmlxdWUgbmFtZT0idGFnLW5hbWUtdW5pcXVlbmVzcyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBUaGUgdGFnbGliIGVsZW1lbnQgY29udGFpbnMsIGFtb25nIG90aGVyIHRoaW5ncywgdGFnIGFuZAotCSAgdGFnLWZpbGUgZWxlbWVudHMuCi0JICBUaGUgbmFtZSBzdWJlbGVtZW50cyBvZiB0aGVzZSBlbGVtZW50cyBtdXN0IGVhY2ggYmUgdW5pcXVlLgotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlbGVjdG9yIHhwYXRoPSJqMmVlOnRhZ3xqMmVlOnRhZy1maWxlIi8+Ci0gICAgICA8eHNkOmZpZWxkICAgIHhwYXRoPSJqMmVlOm5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgICA8eHNkOnVuaXF1ZSBuYW1lPSJmdW5jdGlvbi1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHRhZ2xpYiBlbGVtZW50IGNvbnRhaW5zIGZ1bmN0aW9uIGVsZW1lbnRzLgotCSAgVGhlIG5hbWUgc3ViZWxlbWVudHMgb2YgdGhlc2UgZWxlbWVudHMgbXVzdCBlYWNoIGJlIHVuaXF1ZS4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iajJlZTpmdW5jdGlvbiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iajJlZTpuYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gIDwveHNkOmVsZW1lbnQ+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYm9keS1jb250ZW50VHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFNwZWNpZmllcyB0aGUgdHlwZSBvZiBib2R5IHRoYXQgaXMgdmFsaWQgZm9yIGEgdGFnLgotCVRoaXMgdmFsdWUgaXMgdXNlZCBieSB0aGUgSlNQIGNvbnRhaW5lciB0byB2YWxpZGF0ZQotCXRoYXQgYSB0YWcgaW52b2NhdGlvbiBoYXMgdGhlIGNvcnJlY3QgYm9keSBzeW50YXggYW5kCi0JYnkgcGFnZSBjb21wb3NpdGlvbiB0b29scyB0byBhc3Npc3QgdGhlIHBhZ2UgYXV0aG9yCi0JaW4gcHJvdmlkaW5nIGEgdmFsaWQgdGFnIGJvZHkuCi0KLQlUaGVyZSBhcmUgY3VycmVudGx5IGZvdXIgdmFsdWVzIHNwZWNpZmllZDoKLQotCXRhZ2RlcGVuZGVudCAgICBUaGUgYm9keSBvZiB0aGUgdGFnIGlzIGludGVycHJldGVkIGJ5IHRoZSB0YWcKLQkJCWltcGxlbWVudGF0aW9uIGl0c2VsZiwgYW5kIGlzIG1vc3QgbGlrZWx5Ci0JCQlpbiBhIGRpZmZlcmVudCAibGFuZ3VhZ2UiLCBlLmcgZW1iZWRkZWQgU1FMCi0JCQlzdGF0ZW1lbnRzLgotCi0JSlNQICAgICAgICAgICAgIFRoZSBib2R5IG9mIHRoZSB0YWcgY29udGFpbnMgbmVzdGVkIEpTUAotCQkJc3ludGF4LgotCi0JZW1wdHkgICAgICAgICAgIFRoZSBib2R5IG11c3QgYmUgZW1wdHkKLQotCXNjcmlwdGxlc3MgICAgICBUaGUgYm9keSBhY2NlcHRzIG9ubHkgdGVtcGxhdGUgdGV4dCwgRUwKLQkJCUV4cHJlc3Npb25zLCBhbmQgSlNQIGFjdGlvbiBlbGVtZW50cy4gIE5vCi0JCQlzY3JpcHRpbmcgZWxlbWVudHMgYXJlIGFsbG93ZWQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iajJlZTpzdHJpbmciPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRhZ2RlcGVuZGVudCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpTUCIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImVtcHR5Ii8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2NyaXB0bGVzcyIvPgotICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImV4dGVuc2libGVUeXBlIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGV4dGVuc2libGVUeXBlIGlzIGFuIGFic3RyYWN0IGJhc2UgdHlwZSB0aGF0IGlzIHVzZWQgdG8KLQlkZWZpbmUgdGhlIHR5cGUgb2YgZXh0ZW5zaW9uLWVsZW1lbnRzLiBJbnN0YW5jZSBkb2N1bWVudHMKLQltdXN0IHN1YnN0aXR1dGUgYSBrbm93biB0eXBlIHRvIGRlZmluZSB0aGUgZXh0ZW5zaW9uIGJ5Ci0JdXNpbmcgeHNpOnR5cGUgYXR0cmlidXRlIHRvIGRlZmluZSB0aGUgYWN0dWFsIHR5cGUgb2YKLQlleHRlbnNpb24tZWxlbWVudHMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmdW5jdGlvblR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBmdW5jdGlvbiBlbGVtZW50IGlzIHVzZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBvbiBlYWNoCi0JZnVuY3Rpb24gaW4gdGhlIHRhZyBsaWJyYXJ5IHRoYXQgaXMgdG8gYmUgZXhwb3NlZCB0byB0aGUgRUwuCi0KLQlUaGUgZnVuY3Rpb24gZWxlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHN1YmVsZW1lbnRzIGRlZmluaW5nOgotCi0JZGVzY3JpcHRpb24gICAgICAgICBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24KLQotCWRpc3BsYXktbmFtZSAgICAgICAgQSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKLQkJCSAgICBkaXNwbGF5ZWQgYnkgdG9vbHMKLQotCWljb24gICAgICAgICAgICAgICAgT3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQKLQkJCSAgICBieSB0b29scwotCi0JbmFtZSAgICAgICAgICAgICAgICBBIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uCi0KLQlmdW5jdGlvbi1jbGFzcyAgICAgIFByb3ZpZGVzIHRoZSBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIHRoYXQKLQkJCSAgICBpbXBsZW1lbnRzIHRoZSBmdW5jdGlvbgotCi0JZnVuY3Rpb24tc2lnbmF0dXJlICBQcm92aWRlcyB0aGUgc2lnbmF0dXJlLCBhcyBpbiB0aGUgSmF2YQotCQkJICAgIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIG9mIHRoZSBKYXZhCi0JCQkgICAgbWV0aG9kIHRoYXQgaXMgdG8gYmUgdXNlZCB0byBpbXBsZW1lbnQKLQkJCSAgICB0aGUgZnVuY3Rpb24uCi0KLQlleGFtcGxlICAgICAgICAgICAgIE9wdGlvbmFsIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuCi0JCQkgICAgZXhhbXBsZSBvZiBhIHVzZSBvZiB0aGlzIGZ1bmN0aW9uCi0KLQlmdW5jdGlvbi1leHRlbnNpb24gIFplcm8gb3IgbW9yZSBleHRlbnNpb25zIHRoYXQgcHJvdmlkZSBleHRyYQotCQkJICAgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZnVuY3Rpb24sIGZvciB0b29sCi0JCQkgICAgY29uc3VtcHRpb24KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJqMmVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgotCQkgICB0eXBlPSJqMmVlOnRsZC1jYW5vbmljYWwtbmFtZVR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBBIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBQcm92aWRlcyB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIEphdmEKLQkgICAgY2xhc3MgY29udGFpbmluZyB0aGUgc3RhdGljIG1ldGhvZCB0aGF0IGltcGxlbWVudHMKLQkgICAgdGhlIGZ1bmN0aW9uLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tc2lnbmF0dXJlIgotCQkgICB0eXBlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFByb3ZpZGVzIHRoZSBzaWduYXR1cmUsIG9mIHRoZSBzdGF0aWMgSmF2YSBtZXRob2QgdGhhdCBpcwotCSAgICB0byBiZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgZnVuY3Rpb24uICBUaGUgc3ludGF4IG9mIHRoZQotCSAgICBmdW5jdGlvbi1zaWduYXR1cmUgZWxlbWVudCBpcyBhcyBmb2xsb3dzOgotCi0JCUZ1bmN0aW9uU2lnbmF0dXJlIDo6PSBSZXR1cm5UeXBlIFMgTWV0aG9kTmFtZSBTPwotCQkJCSAgICAgICcoJyBTPyBQYXJhbWV0ZXJzPyBTPyAnKScKLQotICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgICAgIDo6PSBUeXBlCi0KLQkJTWV0aG9kTmFtZSAgICAgICAgOjo9IElkZW50aWZpZXIKLQotCQlQYXJhbWV0ZXJzICAgICAgICA6Oj0gICBQYXJhbWV0ZXIKLQkJCQkgICAgICB8ICggUGFyYW1ldGVyIFM/ICcsJyBTPyBQYXJhbWV0ZXJzICkKLQotICAgICAgICAgICAgICAgIFBhcmFtZXRlciAgICAgICAgIDo6PSBUeXBlCi0KLQkJV2hlcmU6Ci0KLSAJCSAgICAqIFR5cGUgaXMgYSBiYXNpYyB0eXBlIG9yIGEgZnVsbHkgcXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZQotCQkgICAgICAoaW5jbHVkaW5nIHBhY2thZ2UgbmFtZSksIGFzIHBlciB0aGUgJ1R5cGUnIHByb2R1Y3Rpb24KLQkJICAgICAgaW4gdGhlIEphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgU2Vjb25kIEVkaXRpb24sCi0JCSAgICAgIENoYXB0ZXIgMTguCi0KLSAgICAgICAgICAgICAgICAgICAgKiBJZGVudGlmaWVyIGlzIGEgSmF2YSBpZGVudGlmaWVyLCBhcyBwZXIgdGhlICdJZGVudGlmaWVyJwotCQkgICAgICBwcm9kdWN0aW9uIGluIHRoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIFNlY29uZAotCQkgICAgICBFZGl0aW9uLCBDaGFwdGVyIDE4LgotCi0JICAgIEV4YW1wbGU6Ci0KLQkgICAgamF2YS5sYW5nLlN0cmluZyBuaWNrTmFtZSggamF2YS5sYW5nLlN0cmluZywgaW50ICkKLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4YW1wbGUiCi0JCSAgIHR5cGU9ImoyZWU6eHNkU3RyaW5nVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGV4YW1wbGUgZWxlbWVudCBjb250YWlucyBhbiBpbmZvcm1hbCBkZXNjcmlwdGlvbgotCSAgICBvZiBhbiBleGFtcGxlIG9mIHRoZSB1c2Ugb2YgdGhpcyBmdW5jdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLWV4dGVuc2lvbiIKLQkJICAgdHlwZT0iajJlZTp0bGQtZXh0ZW5zaW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIEZ1bmN0aW9uIGV4dGVuc2lvbnMgYXJlIGZvciB0b29sIHVzZSBvbmx5IGFuZCBtdXN0IG5vdCBhZmZlY3QKLQkgICAgdGhlIGJlaGF2aW9yIG9mIGEgY29udGFpbmVyLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhZ0ZpbGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlEZWZpbmVzIGFuIGFjdGlvbiBpbiB0aGlzIHRhZyBsaWJyYXJ5IHRoYXQgaXMgaW1wbGVtZW50ZWQKLQlhcyBhIC50YWcgZmlsZS4KLQotCVRoZSB0YWctZmlsZSBlbGVtZW50IGhhcyB0d28gcmVxdWlyZWQgc3ViZWxlbWVudHM6Ci0KLQlkZXNjcmlwdGlvbiAgICAgICBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24KLQotCWRpc3BsYXktbmFtZSAgICAgIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCi0JCQkgIGRpc3BsYXllZCBieSB0b29scwotCi0JaWNvbiAgICAgICAgICAgICAgT3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQKLQkJCSAgYnkgdG9vbHMKLQotCW5hbWUgICAgICAgICAgICAgIFRoZSB1bmlxdWUgYWN0aW9uIG5hbWUKLQotCXBhdGggICAgICAgICAgICAgIFdoZXJlIHRvIGZpbmQgdGhlIC50YWcgZmlsZSBpbXBsZW1lbnRpbmcgdGhpcwotCQkJICBhY3Rpb24sIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSB3ZWIKLQkJCSAgYXBwbGljYXRpb24gb3IgdGhlIHJvb3Qgb2YgdGhlIEpBUiBmaWxlIGZvciBhCi0JCQkgIHRhZyBsaWJyYXJ5IHBhY2thZ2VkIGluIGEgSkFSLiAgVGhpcyBtdXN0Ci0JCQkgIGJlZ2luIHdpdGggL1dFQi1JTkYvdGFncyBpZiB0aGUgLnRhZyBmaWxlCi0JCQkgIHJlc2lkZXMgaW4gdGhlIFdBUiwgb3IgL01FVEEtSU5GL3RhZ3MgaWYgdGhlCi0JCQkgIC50YWcgZmlsZSByZXNpZGVzIGluIGEgSkFSLgotCi0JZXhhbXBsZSAgICAgICAgICAgT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4KLQkJCSAgZXhhbXBsZSBvZiBhIHVzZSBvZiB0aGlzIHRhZwotCi0JdGFnLWV4dGVuc2lvbiAgICAgWmVybyBvciBtb3JlIGV4dGVuc2lvbnMgdGhhdCBwcm92aWRlIGV4dHJhCi0JCQkgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFnLCBmb3IgdG9vbAotCQkJICBjb25zdW1wdGlvbgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6dGxkLWNhbm9uaWNhbC1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhdGgiCi0JCSAgIHR5cGU9ImoyZWU6cGF0aFR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGFtcGxlIgotCQkgICB0eXBlPSJqMmVlOnhzZFN0cmluZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBleGFtcGxlIGVsZW1lbnQgY29udGFpbnMgYW4gaW5mb3JtYWwgZGVzY3JpcHRpb24KLQkgICAgb2YgYW4gZXhhbXBsZSBvZiB0aGUgdXNlIG9mIGEgdGFnLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnLWV4dGVuc2lvbiIKLQkJICAgdHlwZT0iajJlZTp0bGQtZXh0ZW5zaW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRhZyBleHRlbnNpb25zIGFyZSBmb3IgdG9vbCB1c2Ugb25seSBhbmQgbXVzdCBub3QgYWZmZWN0Ci0JICAgIHRoZSBiZWhhdmlvciBvZiBhIGNvbnRhaW5lci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdGFnIGRlZmluZXMgYSB1bmlxdWUgdGFnIGluIHRoaXMgdGFnIGxpYnJhcnkuICBJdCBoYXMgb25lCi0JYXR0cmlidXRlLCBpZC4KLQotCVRoZSB0YWcgZWxlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHN1YmVsZW1lbnRzIGRlZmluaW5nOgotCi0JZGVzY3JpcHRpb24gICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCi0KLQlkaXNwbGF5LW5hbWUgICAgICBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZQotCQkJICBkaXNwbGF5ZWQgYnkgdG9vbHMKLQotCWljb24gICAgICAgICAgICAgIE9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkCi0JCQkgIGJ5IHRvb2xzCi0KLQluYW1lICAgICAgICAgICAgICBUaGUgdW5pcXVlIGFjdGlvbiBuYW1lCi0KLQl0YWctY2xhc3MgICAgICAgICBUaGUgdGFnIGhhbmRsZXIgY2xhc3MgaW1wbGVtZW50aW5nCi0JCQkgIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Kc3BUYWcKLQotCXRlaS1jbGFzcyAgICAgICAgIEFuIG9wdGlvbmFsIHN1YmNsYXNzIG9mCi0JCQkgIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8KLQotCWJvZHktY29udGVudCAgICAgIFRoZSBib2R5IGNvbnRlbnQgdHlwZQotCi0JdmFyaWFibGUgICAgICAgICAgT3B0aW9uYWwgc2NyaXB0aW5nIHZhcmlhYmxlIGluZm9ybWF0aW9uCi0KLQlhdHRyaWJ1dGUgICAgICAgICBBbGwgYXR0cmlidXRlcyBvZiB0aGlzIGFjdGlvbiB0aGF0IGFyZQotCQkJICBldmFsdWF0ZWQgcHJpb3IgdG8gaW52b2NhdGlvbi4KLQotCWR5bmFtaWMtYXR0cmlidXRlcyBXaGV0aGVyIHRoaXMgdGFnIHN1cHBvcnRzIGFkZGl0aW9uYWwKLQkJCSAgIGF0dHJpYnV0ZXMgd2l0aCBkeW5hbWljIG5hbWVzLiAgSWYKLQkJCSAgIHRydWUsIHRoZSB0YWctY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlCi0JCQkgICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuRHluYW1pY0F0dHJpYnV0ZXMKLQkJCSAgIGludGVyZmFjZS4gIERlZmF1bHRzIHRvIGZhbHNlLgotCi0JZXhhbXBsZSAgICAgICAgICAgT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4KLQkJCSAgZXhhbXBsZSBvZiBhIHVzZSBvZiB0aGlzIHRhZwotCi0JdGFnLWV4dGVuc2lvbiAgICAgWmVybyBvciBtb3JlIGV4dGVuc2lvbnMgdGhhdCBwcm92aWRlIGV4dHJhCi0JCQkgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFnLCBmb3IgdG9vbAotCQkJICBjb25zdW1wdGlvbgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6dGxkLWNhbm9uaWNhbC1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZy1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VybHZldC5qc3AudGFnZXh0LkpzcFRhZwotCSAgICB0aGF0IGltcGxlbWVudHMgdGhlIHJlcXVlc3QgdGltZSBzZW1hbnRpY3MgZm9yCi0JICAgIHRoaXMgdGFnLiAocmVxdWlyZWQpCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZWktY2xhc3MiCi0JCSAgIHR5cGU9ImoyZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlRhZ0V4dHJhSW5mbwotCSAgICBmb3IgdGhpcyB0YWcuIChvcHRpb25hbCkKLQotCSAgICBJZiB0aGlzIGlzIG5vdCBnaXZlbiwgdGhlIGNsYXNzIGlzIG5vdCBjb25zdWx0ZWQgYXQKLQkgICAgdHJhbnNsYXRpb24gdGltZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJib2R5LWNvbnRlbnQiCi0JCSAgIHR5cGU9ImoyZWU6Ym9keS1jb250ZW50VHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFNwZWNpZmllcyB0aGUgZm9ybWF0IGZvciB0aGUgYm9keSBvZiB0aGlzIHRhZy4KLQkgICAgVGhlIGRlZmF1bHQgaW4gSlNQIDEuMiB3YXMgIkpTUCIgYnV0IGJlY2F1c2UgdGhpcwotCSAgICBpcyBhbiBpbnZhbGlkIHNldHRpbmcgZm9yIHNpbXBsZSB0YWcgaGFuZGxlcnMsIHRoZXJlCi0JICAgIGlzIG5vIGxvbmdlciBhIGRlZmF1bHQgaW4gSlNQIDIuMC4gIEEgcmVhc29uYWJsZQotCSAgICBkZWZhdWx0IGZvciBzaW1wbGUgdGFnIGhhbmRsZXJzIGlzICJzY3JpcHRsZXNzIiBpZgotCSAgICB0aGUgdGFnIGNhbiBoYXZlIGEgYm9keS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YXJpYWJsZSIKLQkJICAgdHlwZT0iajJlZTp2YXJpYWJsZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiCi0JCSAgIHR5cGU9ImoyZWU6dGxkLWF0dHJpYnV0ZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkeW5hbWljLWF0dHJpYnV0ZXMiCi0JCSAgIHR5cGU9ImoyZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhhbXBsZSIKLQkJICAgdHlwZT0iajJlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZXhhbXBsZSBlbGVtZW50IGNvbnRhaW5zIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uCi0JICAgIG9mIGFuIGV4YW1wbGUgb2YgdGhlIHVzZSBvZiBhIHRhZy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZy1leHRlbnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6dGxkLWV4dGVuc2lvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUYWcgZXh0ZW5zaW9ucyBhcmUgZm9yIHRvb2wgdXNlIG9ubHkgYW5kIG11c3Qgbm90IGFmZmVjdAotCSAgICB0aGUgYmVoYXZpb3Igb2YgYSBjb250YWluZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGxkLWF0dHJpYnV0ZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBhdHRyaWJ1dGUgZWxlbWVudCBkZWZpbmVzIGFuIGF0dHJpYnV0ZSBmb3IgdGhlIG5lc3RpbmcKLQl0YWcuICBUaGUgYXR0cmlidXRyZSBlbGVtZW50IG1heSBoYXZlIHNldmVyYWwgc3ViZWxlbWVudHMKLQlkZWZpbmluZzoKLQotCWRlc2NyaXB0aW9uICAgICBhIGRlc2NyaXB0aW9uIG9mIHRoZSBhdHRyaWJ1dGUKLQotCW5hbWUgICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCi0KLQlyZXF1aXJlZCAgICAgICAgd2hldGhlciB0aGUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIG9yCi0JCQlvcHRpb25hbAotCi0JcnRleHBydmFsdWUgICAgIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyBhIHJ1bnRpbWUgYXR0cmlidXRlCi0KLQl0eXBlICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZXMKLQotCWZyYWdtZW50ICAgICAgICB3aGV0aGVyIHRoaXMgYXR0cmlidXRlIGlzIGEgZnJhZ21lbnQKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIKLQkJICAgdHlwZT0iajJlZTpqYXZhLWlkZW50aWZpZXJUeXBlIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVxdWlyZWQiCi0JCSAgIHR5cGU9ImoyZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3IKLQkgICAgb3B0aW9uYWwuCi0KLQkgICAgSWYgbm90IHByZXNlbnQgdGhlbiB0aGUgZGVmYXVsdCBpcyAiZmFsc2UiLCBpLmUKLQkgICAgdGhlIGF0dHJpYnV0ZSBpcyBvcHRpb25hbC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDpjaG9pY2U+Ci0JPHhzZDpzZXF1ZW5jZT4KLQkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJydGV4cHJ2YWx1ZSIKLQkJICAgICAgIHR5cGU9ImoyZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKLQkJICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0JICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkJRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgY2FuIGhhdmUgc2NyaXB0bGV0Ci0JCWV4cHJlc3Npb25zIGFzIGEgdmFsdWUsIGkuZSB0aGUgdmFsdWUgb2YgdGhlCi0JCWF0dHJpYnV0ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZCBhdCByZXF1ZXN0Ci0JCXRpbWUsIGFzIG9wcG9zZWQgdG8gYSBzdGF0aWMgdmFsdWUgZGV0ZXJtaW5lZCBhdAotCQl0cmFuc2xhdGlvbiB0aW1lLgotCi0JCUlmIG5vdCBwcmVzZW50IHRoZW4gdGhlIGRlZmF1bHQgaXMgImZhbHNlIiwgaS5lIHRoZQotCQlhdHRyaWJ1dGUgaGFzIGEgc3RhdGljIHZhbHVlCi0KLQkgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0JICA8L3hzZDplbGVtZW50PgotCSAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUiCi0JCSAgICAgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgICAgICBtaW5PY2N1cnM9IjAiPgotCSAgICA8eHNkOmFubm90YXRpb24+Ci0JICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JCURlZmluZXMgdGhlIEphdmEgdHlwZSBvZiB0aGUgYXR0cmlidXRlcyB2YWx1ZS4gIEZvcgotCQlzdGF0aWMgdmFsdWVzICh0aG9zZSBkZXRlcm1pbmVkIGF0IHRyYW5zbGF0aW9uIHRpbWUpCi0JCXRoZSB0eXBlIGlzIGFsd2F5cyBqYXZhLmxhbmcuU3RyaW5nLgotCi0JICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDwveHNkOmVsZW1lbnQ+Ci0JPC94c2Q6c2VxdWVuY2U+Ci0JPHhzZDplbGVtZW50IG5hbWU9ImZyYWdtZW50IgotCQkgICAgIHR5cGU9ImoyZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKLQkJICAgICBtaW5PY2N1cnM9IjAiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICAidHJ1ZSIgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgb2YgdHlwZQotCSAgICAgIGphdmF4LmpzcC50YWdleHQuSnNwRnJhZ21lbnQsIHJlcHJlc2VudGluZyBkeW5hbWljCi0JICAgICAgY29udGVudCB0aGF0IGNhbiBiZSByZS1ldmFsdWF0ZWQgYXMgbWFueSB0aW1lcwotCSAgICAgIGFzIG5lZWRlZCBieSB0aGUgdGFnIGhhbmRsZXIuICBJZiBvbWl0dGVkIG9yICJmYWxzZSIsCi0JICAgICAgdGhlIGRlZmF1bHQgaXMgc3RpbGwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRsZC1jYW5vbmljYWwtbmFtZVR5cGUiPgotCi0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JRGVmaW5lcyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgYSB0YWcgb3IgYXR0cmlidXRlIGJlaW5nCi0JZGVmaW5lZC4KLQotCVRoZSBuYW1lIG11c3QgY29uZm9ybSB0byB0aGUgbGV4aWNhbCBydWxlcyBmb3IgYW4gTk1UT0tFTi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnhzZE5NVE9LRU5UeXBlIi8+Ci0gICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRsZC1leHRlbnNpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdGxkLWV4dGVuc2lvblR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZQotCWV4dGVuc2lvbnMgdG8gYSBzcGVjaWZpYyBUTEQgZWxlbWVudC4KLQotCUl0IGlzIHVzZWQgYnkgZWxlbWVudHMgdG8gZGVzaWduYXRlIGFuIGV4dGVuc2lvbiBibG9jawotCXRoYXQgaXMgdGFyZ2V0ZWQgdG8gYSBzcGVjaWZpYyBleHRlbnNpb24gZGVzaWduYXRlZCBieQotCWEgc2V0IG9mIGV4dGVuc2lvbiBlbGVtZW50cyB0aGF0IGFyZSBkZWNsYXJlZCBieSBhCi0JbmFtZXNwYWNlLiBUaGUgbmFtZXNwYWNlIGlkZW50aWZpZXMgdGhlIGV4dGVuc2lvbiB0bwotCXRoZSB0b29sIHRoYXQgcHJvY2Vzc2VzIHRoZSBleHRlbnNpb24uCi0KLQlUaGUgdHlwZSBvZiB0aGUgZXh0ZW5zaW9uLWVsZW1lbnQgaXMgYWJzdHJhY3QuIFRoZXJlZm9yZSwKLQlhIGNvbmNyZXRlIHR5cGUgbXVzdCBiZSBzcGVjaWZpZWQgYnkgdGhlIFRMRCB1c2luZwotCXhzaTp0eXBlIGF0dHJpYnV0ZSBmb3IgZWFjaCBleHRlbnNpb24tZWxlbWVudC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24tZWxlbWVudCIKLQkJICAgdHlwZT0iajJlZTpleHRlbnNpYmxlVHlwZSIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIKLQkJICAgdXNlPSJyZXF1aXJlZCIKLQkJICAgdHlwZT0ieHNkOmFueVVSSSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLQotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGxkVGFnbGliVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIHRhZ2xpYiB0YWcgaXMgdGhlIGRvY3VtZW50IHJvb3QsIGl0IGRlZmluZXM6Ci0KLQlkZXNjcmlwdGlvbiAgICAgYSBzaW1wbGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlICJ1c2UiIG9mIHRoaXMgdGFnbGliLAotCQkJc2hvdWxkIGJlIHVzZXIgZGlzY2VybmFibGUKLQotCWRpc3BsYXktbmFtZSAgICB0aGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgY29udGFpbnMgYQotCQkJc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZAotCQkJYnkgdG9vbHMKLQotCWljb24gICAgICAgICAgICBvcHRpb25hbCBpY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKLQotCXRsaWItdmVyc2lvbiAgICB0aGUgdmVyc2lvbiBvZiB0aGUgdGFnIGxpYnJhcnkgaW1wbGVtZW50YXRpb24KLQotCXNob3J0LW5hbWUgICAgICBhIHNpbXBsZSBkZWZhdWx0IHNob3J0IG5hbWUgdGhhdCBjb3VsZCBiZQotCQkJdXNlZCBieSBhIEpTUCBhdXRob3JpbmcgdG9vbCB0byBjcmVhdGUKLQkJCW5hbWVzIHdpdGggYSBtbmVtb25pYyB2YWx1ZTsgZm9yIGV4YW1wbGUsCi0JCQl0aGUgaXQgbWF5IGJlIHVzZWQgYXMgdGhlIHByZWZlcmVkIHByZWZpeAotCQkJdmFsdWUgaW4gdGFnbGliIGRpcmVjdGl2ZXMKLQotCXVyaSAgICAgICAgICAgICBhIHVyaSB1bmlxdWVseSBpZGVudGlmeWluZyB0aGlzIHRhZ2xpYgotCi0JdmFsaWRhdG9yICAgICAgIG9wdGlvbmFsIFRhZ0xpYnJhcnlWYWxpZGF0b3IgaW5mb3JtYXRpb24KLQotCWxpc3RlbmVyICAgICAgICBvcHRpb25hbCBldmVudCBsaXN0ZW5lciBzcGVjaWZpY2F0aW9uCi0KLQl0YWcgICAgICAgICAgICAgdGFncyBpbiB0aGlzIHRhZyBsaWJyYXJ5Ci0KLQl0YWctZmlsZSAgICAgICAgdGFnIGZpbGVzIGluIHRoaXMgdGFnIGxpYnJhcnkKLQotCWZ1bmN0aW9uICAgICAgICB6ZXJvIG9yIG1vcmUgRUwgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcwotCQkJdGFnIGxpYnJhcnkKLQotCXRhZ2xpYi1leHRlbnNpb24gemVybyBvciBtb3JlIGV4dGVuc2lvbnMgdGhhdCBwcm92aWRlIGV4dHJhCi0JCQlpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhZ2xpYiwgZm9yIHRvb2wKLQkJCWNvbnN1bXB0aW9uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImoyZWU6ZGVzY3JpcHRpb25Hcm91cCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRsaWItdmVyc2lvbiIKLQkJICAgdHlwZT0iajJlZTpkZXdleS12ZXJzaW9uVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlc2NyaWJlcyB0aGlzIHZlcnNpb24gKG51bWJlcikgb2YgdGhlIHRhZ2xpYnJhcnkuCi0JICAgIEl0IGlzIGRlc2NyaWJlZCBhcyBhIGRld2V5IGRlY2ltYWwuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNob3J0LW5hbWUiCi0JCSAgIHR5cGU9ImoyZWU6dGxkLWNhbm9uaWNhbC1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlZmluZXMgYSBzaW1wbGUgZGVmYXVsdCBuYW1lIHRoYXQgY291bGQgYmUgdXNlZCBieQotCSAgICBhIEpTUCBhdXRob3JpbmcgdG9vbCB0byBjcmVhdGUgbmFtZXMgd2l0aCBhCi0JICAgIG1uZW1vbmljdmFsdWU7IGZvciBleGFtcGxlLCBpdCBtYXkgYmUgdXNlZCBhcyB0aGUKLQkgICAgcHJlZmVycmVkIHByZWZpeCB2YWx1ZSBpbiB0YWdsaWIgZGlyZWN0aXZlcy4gIERvCi0JICAgIG5vdCB1c2Ugd2hpdGUgc3BhY2UsIGFuZCBkbyBub3Qgc3RhcnQgd2l0aCBkaWdpdHMKLQkgICAgb3IgdW5kZXJzY29yZS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVyaSIKLQkJICAgdHlwZT0iajJlZTp4c2RBbnlVUklUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIGEgcHVibGljIFVSSSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcwotCSAgICB2ZXJzaW9uIG9mIHRoZSB0YWdsaWJyYXJ5LiAgTGVhdmUgaXQgZW1wdHkgaWYgaXQKLQkgICAgZG9lcyBub3QgYXBwbHkuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3IiCi0JCSAgIHR5cGU9ImoyZWU6dmFsaWRhdG9yVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlzdGVuZXIiCi0JCSAgIHR5cGU9ImoyZWU6bGlzdGVuZXJUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnIgotCQkgICB0eXBlPSJqMmVlOnRhZ1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWctZmlsZSIKLQkJICAgdHlwZT0iajJlZTp0YWdGaWxlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uIgotCQkgICB0eXBlPSJqMmVlOmZ1bmN0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZ2xpYi1leHRlbnNpb24iCi0JCSAgIHR5cGU9ImoyZWU6dGxkLWV4dGVuc2lvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUYWdsaWIgZXh0ZW5zaW9ucyBhcmUgZm9yIHRvb2wgdXNlIG9ubHkgYW5kIG11c3Qgbm90IGFmZmVjdAotCSAgICB0aGUgYmVoYXZpb3Igb2YgYSBjb250YWluZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIKLQkJICAgdHlwZT0iajJlZTpkZXdleS12ZXJzaW9uVHlwZSIKLQkJICAgZml4ZWQ9IjIuMCIKLQkJICAgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0JPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICBEZXNjcmliZXMgdGhlIEpTUCB2ZXJzaW9uIChudW1iZXIpIHRoaXMgdGFnbGlicmFyeQotCSAgcmVxdWlyZXMgaW4gb3JkZXIgdG8gZnVuY3Rpb24gKGRld2V5IGRlY2ltYWwpCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWxpZGF0b3JUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlBIHZhbGlkYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlCi0JdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeSBpcwotCWRlZmluZWQgYnkgYSB2YWxpZGF0b3JUeXBlLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIgotCQkgICB0eXBlPSJqMmVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbGlkYXRvci1jbGFzcyIKLQkJICAgdHlwZT0iajJlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgVGFnTGlicmFyeVZhbGlkYXRvciBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkCi0JICAgIHRvIHZhbGlkYXRlIHRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMKLQkgICAgdGFnIGxpYnJhcnkuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIKLQkJICAgdHlwZT0iajJlZTpwYXJhbS12YWx1ZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgaW5pdC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgbmFtZS92YWx1ZSBwYWlyIGFzIGFuCi0JICAgIGluaXRpYWxpemF0aW9uIHBhcmFtLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZS1zY29wZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoaXMgdHlwZSBkZWZpbmVzIHNjb3BlIG9mIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuICBTZWUKLQlUYWdFeHRyYUluZm8gZm9yIGRldGFpbHMuICBUaGUgYWxsb3dlZCB2YWx1ZXMgYXJlLAotCSJORVNURUQiLCAiQVRfQkVHSU4iIGFuZCAiQVRfRU5EIi4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqMmVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkVTVEVEIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRfQkVHSU4iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVF9FTkQiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB2YXJpYWJsZVR5cGUgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdGhlIHNjcmlwdGluZwotCXZhcmlhYmxlcyBkZWZpbmVkIGJ5IHVzaW5nIHRoaXMgdGFnLiAgSXQgaXMgYSAodHJhbnNsYXRpb24KLQl0aW1lKSBlcnJvciBmb3IgYSB0YWcgdGhhdCBoYXMgb25lIG9yIG1vcmUgdmFyaWFibGUKLQlzdWJlbGVtZW50cyB0byBoYXZlIGEgVGFnRXh0cmFJbmZvIGNsYXNzIHRoYXQgcmV0dXJucyBhCi0Jbm9uLW51bGwgdmFsdWUgZnJvbSBhIGNhbGwgdG8gZ2V0VmFyaWFibGVJbmZvKCkuCi0KLQlUaGUgc3ViZWxlbWVudHMgb2YgdmFyaWFibGVUeXBlIGFyZSBvZiB0aGUgZm9ybToKLQotCWRlc2NyaXB0aW9uICAgICAgICAgICAgICBPcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGlzCi0JCQkJIHZhcmlhYmxlCi0KLQluYW1lLWdpdmVuICAgICAgICAgICAgICAgVGhlIHZhcmlhYmxlIG5hbWUgYXMgYSBjb25zdGFudAotCi0JbmFtZS1mcm9tLWF0dHJpYnV0ZSAgICAgIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZQotCQkJCSAodHJhbnNsYXRpb24gdGltZSkgdmFsdWUgd2lsbAotCQkJCSBnaXZlIHRoZSBuYW1lIG9mIHRoZQotCQkJCSB2YXJpYWJsZS4gIE9uZSBvZiBuYW1lLWdpdmVuIG9yCi0JCQkJIG5hbWUtZnJvbS1hdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCi0KLQl2YXJpYWJsZS1jbGFzcyAgICAgICAgICAgTmFtZSBvZiB0aGUgY2xhc3Mgb2YgdGhlIHZhcmlhYmxlLgotCQkJCSBqYXZhLmxhbmcuU3RyaW5nIGlzIGRlZmF1bHQuCi0KLQlkZWNsYXJlICAgICAgICAgICAgICAgICAgV2hldGhlciB0aGUgdmFyaWFibGUgaXMgZGVjbGFyZWQKLQkJCQkgb3Igbm90LiAgVHJ1ZSBpcyB0aGUgZGVmYXVsdC4KLQotCXNjb3BlICAgICAgICAgICAgICAgICAgICBUaGUgc2NvcGUgb2YgdGhlIHNjcmlwdGluZyB2YXJhaWJsZQotCQkJCSBkZWZpbmVkLiAgTkVTVEVEIGlzIGRlZmF1bHQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImoyZWU6ZGVzY3JpcHRpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZS1naXZlbiIKLQkJICAgICB0eXBlPSJqMmVlOmphdmEtaWRlbnRpZmllclR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICBUaGUgbmFtZSBmb3IgdGhlIHNjcmlwdGluZyB2YXJpYWJsZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCi0JPHhzZDplbGVtZW50IG5hbWU9Im5hbWUtZnJvbS1hdHRyaWJ1dGUiCi0JCSAgICAgdHlwZT0iajJlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHdob3NlCi0JICAgICAgKHRyYW5zbGF0aW9uLXRpbWUpIHZhbHVlIHdpbGwgZ2l2ZSB0aGUgbmFtZSBvZgotCSAgICAgIHRoZSB2YXJpYWJsZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlLWNsYXNzIgotCQkgICB0eXBlPSJqMmVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRoZSBvcHRpb25hbCBuYW1lIG9mIHRoZSBjbGFzcyBmb3IgdGhlIHNjcmlwdGluZwotCSAgICB2YXJpYWJsZS4gIFRoZSBkZWZhdWx0IGlzIGphdmEubGFuZy5TdHJpbmcuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlY2xhcmUiCi0JCSAgIHR5cGU9ImoyZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBXaGV0aGVyIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUgaXMgdG8gYmUgZGVmaW5lZAotCSAgICBvciBub3QuICBTZWUgVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLiAgVGhpcwotCSAgICBlbGVtZW50IGlzIG9wdGlvbmFsIGFuZCAidHJ1ZSIgaXMgdGhlIGRlZmF1bHQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NvcGUiCi0JCSAgIHR5cGU9ImoyZWU6dmFyaWFibGUtc2NvcGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZWxlbWVudCBpcyBvcHRpb25hbCBhbmQgIk5FU1RFRCIgaXMgdGhlIGRlZmF1bHQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMS54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHNBbmRTY2hlbWFzL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYThlOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzQW5kU2NoZW1hcy93ZWItanNwdGFnbGlicmFyeV8yXzEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTE0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08eHNkOnNjaGVtYQotICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgIHZlcnNpb249IjIuMSI+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIyl3ZWItanNwdGFnbGlicmFyeV8yXzEueHNkcwkxLjEKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIENvcHlyaWdodCAyMDAzLTIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAgICAgIFUuUy5BCi0gICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLQotICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotCi0gICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0KLSAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPCFbQ0RBVEFbCi0KLQlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgSlNQIFRhZ2xpYnJhcnkKLQlkZXNjcmlwdG9yLiAgQWxsIFRhZ2xpYnJhcnkgZGVzY3JpcHRvcnMgbXVzdAotCWluZGljYXRlIHRoZSB0YWcgbGlicmFyeSBzY2hlbWEgYnkgdXNpbmcgdGhlIFRhZ2xpYnJhcnkKLQluYW1lc3BhY2U6Ci0KLQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLQotCWFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLQl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0JICAgIDx0YWdsaWIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLQkgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCSAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iLi4uIgotCSAgICAgIHZlcnNpb249IjIuMSI+Ci0JICAgICAgLi4uCi0JICAgIDwvdGFnbGliPgotCi0JVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZAotCXZlcnNpb24gb2YgdGhlIHNjaGVtYSB1c2luZyB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlCi0JZm9yIEphdmEgRUUgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLQotCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItanNwdGFnbGlicmFyeV8yXzEueHNkCi0KLQldXT4KLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0iamF2YWVlXzUueHNkIi8+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWdsaWIiIHR5cGU9ImphdmFlZTp0bGRUYWdsaWJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdGFnbGliIHRhZyBpcyB0aGUgZG9jdW1lbnQgcm9vdC4KLQlUaGUgZGVmaW5pdGlvbiBvZiB0YWdsaWIgaXMgcHJvdmlkZWQKLQlieSB0aGUgdGxkVGFnbGliVHlwZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6dW5pcXVlIG5hbWU9InRhZy1uYW1lLXVuaXF1ZW5lc3MiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgVGhlIHRhZ2xpYiBlbGVtZW50IGNvbnRhaW5zLCBhbW9uZyBvdGhlciB0aGluZ3MsIHRhZyBhbmQKLQkgIHRhZy1maWxlIGVsZW1lbnRzLgotCSAgVGhlIG5hbWUgc3ViZWxlbWVudHMgb2YgdGhlc2UgZWxlbWVudHMgbXVzdCBlYWNoIGJlIHVuaXF1ZS4KLQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZWxlY3RvciB4cGF0aD0iamF2YWVlOnRhZ3xqYXZhZWU6dGFnLWZpbGUiLz4KLSAgICAgIDx4c2Q6ZmllbGQgICAgeHBhdGg9ImphdmFlZTpuYW1lIi8+Ci0gICAgPC94c2Q6dW5pcXVlPgotCi0gICAgPHhzZDp1bmlxdWUgbmFtZT0iZnVuY3Rpb24tbmFtZS11bmlxdWVuZXNzIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQk8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgIFRoZSB0YWdsaWIgZWxlbWVudCBjb250YWlucyBmdW5jdGlvbiBlbGVtZW50cy4KLQkgIFRoZSBuYW1lIHN1YmVsZW1lbnRzIG9mIHRoZXNlIGVsZW1lbnRzIG11c3QgZWFjaCBiZSB1bmlxdWUuCi0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VsZWN0b3IgeHBhdGg9ImphdmFlZTpmdW5jdGlvbiIvPgotICAgICAgPHhzZDpmaWVsZCAgICB4cGF0aD0iamF2YWVlOm5hbWUiLz4KLSAgICA8L3hzZDp1bmlxdWU+Ci0KLSAgPC94c2Q6ZWxlbWVudD4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJib2R5LWNvbnRlbnRUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGJvZHkgdGhhdCBpcyB2YWxpZCBmb3IgYSB0YWcuCi0JVGhpcyB2YWx1ZSBpcyB1c2VkIGJ5IHRoZSBKU1AgY29udGFpbmVyIHRvIHZhbGlkYXRlCi0JdGhhdCBhIHRhZyBpbnZvY2F0aW9uIGhhcyB0aGUgY29ycmVjdCBib2R5IHN5bnRheCBhbmQKLQlieSBwYWdlIGNvbXBvc2l0aW9uIHRvb2xzIHRvIGFzc2lzdCB0aGUgcGFnZSBhdXRob3IKLQlpbiBwcm92aWRpbmcgYSB2YWxpZCB0YWcgYm9keS4KLQotCVRoZXJlIGFyZSBjdXJyZW50bHkgZm91ciB2YWx1ZXMgc3BlY2lmaWVkOgotCi0JdGFnZGVwZW5kZW50ICAgIFRoZSBib2R5IG9mIHRoZSB0YWcgaXMgaW50ZXJwcmV0ZWQgYnkgdGhlIHRhZwotCQkJaW1wbGVtZW50YXRpb24gaXRzZWxmLCBhbmQgaXMgbW9zdCBsaWtlbHkKLQkJCWluIGEgZGlmZmVyZW50ICJsYW5ndWFnZSIsIGUuZyBlbWJlZGRlZCBTUUwKLQkJCXN0YXRlbWVudHMuCi0KLQlKU1AgICAgICAgICAgICAgVGhlIGJvZHkgb2YgdGhlIHRhZyBjb250YWlucyBuZXN0ZWQgSlNQCi0JCQlzeW50YXguCi0KLQllbXB0eSAgICAgICAgICAgVGhlIGJvZHkgbXVzdCBiZSBlbXB0eQotCi0Jc2NyaXB0bGVzcyAgICAgIFRoZSBib2R5IGFjY2VwdHMgb25seSB0ZW1wbGF0ZSB0ZXh0LCBFTAotCQkJRXhwcmVzc2lvbnMsIGFuZCBKU1AgYWN0aW9uIGVsZW1lbnRzLiAgTm8KLQkJCXNjcmlwdGluZyBlbGVtZW50cyBhcmUgYWxsb3dlZC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJqYXZhZWU6c3RyaW5nIj4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0YWdkZXBlbmRlbnQiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKU1AiLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlbXB0eSIvPgotCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNjcmlwdGxlc3MiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJleHRlbnNpYmxlVHlwZSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSBleHRlbnNpYmxlVHlwZSBpcyBhbiBhYnN0cmFjdCBiYXNlIHR5cGUgdGhhdCBpcyB1c2VkIHRvCi0JZGVmaW5lIHRoZSB0eXBlIG9mIGV4dGVuc2lvbi1lbGVtZW50cy4gSW5zdGFuY2UgZG9jdW1lbnRzCi0JbXVzdCBzdWJzdGl0dXRlIGEga25vd24gdHlwZSB0byBkZWZpbmUgdGhlIGV4dGVuc2lvbiBieQotCXVzaW5nIHhzaTp0eXBlIGF0dHJpYnV0ZSB0byBkZWZpbmUgdGhlIGFjdHVhbCB0eXBlIG9mCi0JZXh0ZW5zaW9uLWVsZW1lbnRzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZnVuY3Rpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgZnVuY3Rpb24gZWxlbWVudCBpcyB1c2VkIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gb24gZWFjaAotCWZ1bmN0aW9uIGluIHRoZSB0YWcgbGlicmFyeSB0aGF0IGlzIHRvIGJlIGV4cG9zZWQgdG8gdGhlIEVMLgotCi0JVGhlIGZ1bmN0aW9uIGVsZW1lbnQgbWF5IGhhdmUgc2V2ZXJhbCBzdWJlbGVtZW50cyBkZWZpbmluZzoKLQotCWRlc2NyaXB0aW9uICAgICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCi0KLQlkaXNwbGF5LW5hbWUgICAgICAgIEEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlCi0JCQkgICAgZGlzcGxheWVkIGJ5IHRvb2xzCi0KLQlpY29uICAgICAgICAgICAgICAgIE9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkCi0JCQkgICAgYnkgdG9vbHMKLQotCW5hbWUgICAgICAgICAgICAgICAgQSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBmdW5jdGlvbgotCi0JZnVuY3Rpb24tY2xhc3MgICAgICBQcm92aWRlcyB0aGUgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcyB0aGF0Ci0JCQkgICAgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb24KLQotCWZ1bmN0aW9uLXNpZ25hdHVyZSAgUHJvdmlkZXMgdGhlIHNpZ25hdHVyZSwgYXMgaW4gdGhlIEphdmEKLQkJCSAgICBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uLCBvZiB0aGUgSmF2YQotCQkJICAgIG1ldGhvZCB0aGF0IGlzIHRvIGJlIHVzZWQgdG8gaW1wbGVtZW50Ci0JCQkgICAgdGhlIGZ1bmN0aW9uLgotCi0JZXhhbXBsZSAgICAgICAgICAgICBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbgotCQkJICAgIGV4YW1wbGUgb2YgYSB1c2Ugb2YgdGhpcyBmdW5jdGlvbgotCi0JZnVuY3Rpb24tZXh0ZW5zaW9uICBaZXJvIG9yIG1vcmUgZXh0ZW5zaW9ucyB0aGF0IHByb3ZpZGUgZXh0cmEKLQkJCSAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGZ1bmN0aW9uLCBmb3IgdG9vbAotCQkJICAgIGNvbnN1bXB0aW9uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6dGxkLWNhbm9uaWNhbC1uYW1lVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIEEgdW5pcXVlIG5hbWUgZm9yIHRoaXMgZnVuY3Rpb24uCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgUHJvdmlkZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBKYXZhCi0JICAgIGNsYXNzIGNvbnRhaW5pbmcgdGhlIHN0YXRpYyBtZXRob2QgdGhhdCBpbXBsZW1lbnRzCi0JICAgIHRoZSBmdW5jdGlvbi4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLXNpZ25hdHVyZSIKLQkJICAgdHlwZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFByb3ZpZGVzIHRoZSBzaWduYXR1cmUsIG9mIHRoZSBzdGF0aWMgSmF2YSBtZXRob2QgdGhhdCBpcwotCSAgICB0byBiZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgZnVuY3Rpb24uICBUaGUgc3ludGF4IG9mIHRoZQotCSAgICBmdW5jdGlvbi1zaWduYXR1cmUgZWxlbWVudCBpcyBhcyBmb2xsb3dzOgotCi0JCUZ1bmN0aW9uU2lnbmF0dXJlIDo6PSBSZXR1cm5UeXBlIFMgTWV0aG9kTmFtZSBTPwotCQkJCSAgICAgICcoJyBTPyBQYXJhbWV0ZXJzPyBTPyAnKScKLQotICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgICAgIDo6PSBUeXBlCi0KLQkJTWV0aG9kTmFtZSAgICAgICAgOjo9IElkZW50aWZpZXIKLQotCQlQYXJhbWV0ZXJzICAgICAgICA6Oj0gICBQYXJhbWV0ZXIKLQkJCQkgICAgICB8ICggUGFyYW1ldGVyIFM/ICcsJyBTPyBQYXJhbWV0ZXJzICkKLQotICAgICAgICAgICAgICAgIFBhcmFtZXRlciAgICAgICAgIDo6PSBUeXBlCi0KLQkJV2hlcmU6Ci0KLSAJCSAgICAqIFR5cGUgaXMgYSBiYXNpYyB0eXBlIG9yIGEgZnVsbHkgcXVhbGlmaWVkCi0JCSAgICAgIEphdmEgY2xhc3MgbmFtZSAoaW5jbHVkaW5nIHBhY2thZ2UgbmFtZSksCi0JCSAgICAgIGFzIHBlciB0aGUgJ1R5cGUnIHByb2R1Y3Rpb24gaW4gdGhlIEphdmEKLQkJICAgICAgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiwgU2Vjb25kIEVkaXRpb24sCi0JCSAgICAgIENoYXB0ZXIgMTguCi0KLSAgICAgICAgICAgICAgICAgICAgKiBJZGVudGlmaWVyIGlzIGEgSmF2YSBpZGVudGlmaWVyLCBhcyBwZXIKLQkJICAgICAgdGhlICdJZGVudGlmaWVyJyBwcm9kdWN0aW9uIGluIHRoZSBKYXZhCi0JCSAgICAgIExhbmd1YWdlIFNwZWNpZmljYXRpb24sIFNlY29uZAotCQkgICAgICBFZGl0aW9uLCBDaGFwdGVyIDE4LgotCi0JICAgIEV4YW1wbGU6Ci0KLQkgICAgamF2YS5sYW5nLlN0cmluZyBuaWNrTmFtZSggamF2YS5sYW5nLlN0cmluZywgaW50ICkKLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4YW1wbGUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZXhhbXBsZSBlbGVtZW50IGNvbnRhaW5zIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uCi0JICAgIG9mIGFuIGV4YW1wbGUgb2YgdGhlIHVzZSBvZiB0aGlzIGZ1bmN0aW9uLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tZXh0ZW5zaW9uIgotCQkgICB0eXBlPSJqYXZhZWU6dGxkLWV4dGVuc2lvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIKLQkJICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBGdW5jdGlvbiBleHRlbnNpb25zIGFyZSBmb3IgdG9vbCB1c2Ugb25seSBhbmQgbXVzdCBub3QKLSAgICAgICAgICAgIGFmZmVjdCB0aGUgYmVoYXZpb3Igb2YgYSBjb250YWluZXIuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFnRmlsZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCURlZmluZXMgYW4gYWN0aW9uIGluIHRoaXMgdGFnIGxpYnJhcnkgdGhhdCBpcyBpbXBsZW1lbnRlZAotCWFzIGEgLnRhZyBmaWxlLgotCi0JVGhlIHRhZy1maWxlIGVsZW1lbnQgaGFzIHR3byByZXF1aXJlZCBzdWJlbGVtZW50czoKLQotCWRlc2NyaXB0aW9uICAgICAgIE9wdGlvbmFsIHRhZy1zcGVjaWZpYyBpbmZvcm1hdGlvbgotCi0JZGlzcGxheS1uYW1lICAgICAgQSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUKLQkJCSAgZGlzcGxheWVkIGJ5IHRvb2xzCi0KLQlpY29uICAgICAgICAgICAgICBPcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZAotCQkJICBieSB0b29scwotCi0JbmFtZSAgICAgICAgICAgICAgVGhlIHVuaXF1ZSBhY3Rpb24gbmFtZQotCi0JcGF0aCAgICAgICAgICAgICAgV2hlcmUgdG8gZmluZCB0aGUgLnRhZyBmaWxlIGltcGxlbWVudGluZyB0aGlzCi0JCQkgIGFjdGlvbiwgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIHdlYgotCQkJICBhcHBsaWNhdGlvbiBvciB0aGUgcm9vdCBvZiB0aGUgSkFSIGZpbGUgZm9yIGEKLQkJCSAgdGFnIGxpYnJhcnkgcGFja2FnZWQgaW4gYSBKQVIuICBUaGlzIG11c3QKLQkJCSAgYmVnaW4gd2l0aCAvV0VCLUlORi90YWdzIGlmIHRoZSAudGFnIGZpbGUKLQkJCSAgcmVzaWRlcyBpbiB0aGUgV0FSLCBvciAvTUVUQS1JTkYvdGFncyBpZiB0aGUKLQkJCSAgLnRhZyBmaWxlIHJlc2lkZXMgaW4gYSBKQVIuCi0KLQlleGFtcGxlICAgICAgICAgICBPcHRpb25hbCBpbmZvcm1hbCBkZXNjcmlwdGlvbiBvZiBhbgotCQkJICBleGFtcGxlIG9mIGEgdXNlIG9mIHRoaXMgdGFnCi0KLQl0YWctZXh0ZW5zaW9uICAgICBaZXJvIG9yIG1vcmUgZXh0ZW5zaW9ucyB0aGF0IHByb3ZpZGUgZXh0cmEKLQkJCSAgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0YWcsIGZvciB0b29sCi0JCQkgIGNvbnN1bXB0aW9uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6dGxkLWNhbm9uaWNhbC1uYW1lVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhdGgiCi0JCSAgIHR5cGU9ImphdmFlZTpwYXRoVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4YW1wbGUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZXhhbXBsZSBlbGVtZW50IGNvbnRhaW5zIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uCi0JICAgIG9mIGFuIGV4YW1wbGUgb2YgdGhlIHVzZSBvZiBhIHRhZy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZy1leHRlbnNpb24iCi0JCSAgIHR5cGU9ImphdmFlZTp0bGQtZXh0ZW5zaW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRhZyBleHRlbnNpb25zIGFyZSBmb3IgdG9vbCB1c2Ugb25seSBhbmQgbXVzdCBub3QgYWZmZWN0Ci0JICAgIHRoZSBiZWhhdmlvciBvZiBhIGNvbnRhaW5lci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWdUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdGFnIGRlZmluZXMgYSB1bmlxdWUgdGFnIGluIHRoaXMgdGFnIGxpYnJhcnkuICBJdCBoYXMgb25lCi0JYXR0cmlidXRlLCBpZC4KLQotCVRoZSB0YWcgZWxlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHN1YmVsZW1lbnRzIGRlZmluaW5nOgotCi0JZGVzY3JpcHRpb24gICAgICAgT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCi0KLQlkaXNwbGF5LW5hbWUgICAgICBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZQotCQkJICBkaXNwbGF5ZWQgYnkgdG9vbHMKLQotCWljb24gICAgICAgICAgICAgIE9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNhbiBiZSB1c2VkCi0JCQkgIGJ5IHRvb2xzCi0KLQluYW1lICAgICAgICAgICAgICBUaGUgdW5pcXVlIGFjdGlvbiBuYW1lCi0KLQl0YWctY2xhc3MgICAgICAgICBUaGUgdGFnIGhhbmRsZXIgY2xhc3MgaW1wbGVtZW50aW5nCi0JCQkgIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5Kc3BUYWcKLQotCXRlaS1jbGFzcyAgICAgICAgIEFuIG9wdGlvbmFsIHN1YmNsYXNzIG9mCi0JCQkgIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8KLQotCWJvZHktY29udGVudCAgICAgIFRoZSBib2R5IGNvbnRlbnQgdHlwZQotCi0JdmFyaWFibGUgICAgICAgICAgT3B0aW9uYWwgc2NyaXB0aW5nIHZhcmlhYmxlIGluZm9ybWF0aW9uCi0KLQlhdHRyaWJ1dGUgICAgICAgICBBbGwgYXR0cmlidXRlcyBvZiB0aGlzIGFjdGlvbiB0aGF0IGFyZQotCQkJICBldmFsdWF0ZWQgcHJpb3IgdG8gaW52b2NhdGlvbi4KLQotCWR5bmFtaWMtYXR0cmlidXRlcyBXaGV0aGVyIHRoaXMgdGFnIHN1cHBvcnRzIGFkZGl0aW9uYWwKLQkJCSAgIGF0dHJpYnV0ZXMgd2l0aCBkeW5hbWljIG5hbWVzLiAgSWYKLQkJCSAgIHRydWUsIHRoZSB0YWctY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlCi0JCQkgICBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuRHluYW1pY0F0dHJpYnV0ZXMKLQkJCSAgIGludGVyZmFjZS4gIERlZmF1bHRzIHRvIGZhbHNlLgotCi0JZXhhbXBsZSAgICAgICAgICAgT3B0aW9uYWwgaW5mb3JtYWwgZGVzY3JpcHRpb24gb2YgYW4KLQkJCSAgZXhhbXBsZSBvZiBhIHVzZSBvZiB0aGlzIHRhZwotCi0JdGFnLWV4dGVuc2lvbiAgICAgWmVybyBvciBtb3JlIGV4dGVuc2lvbnMgdGhhdCBwcm92aWRlIGV4dHJhCi0JCQkgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFnLCBmb3IgdG9vbAotCQkJICBjb25zdW1wdGlvbgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpncm91cCByZWY9ImphdmFlZTpkZXNjcmlwdGlvbkdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIKLQkJICAgdHlwZT0iamF2YWVlOnRsZC1jYW5vbmljYWwtbmFtZVR5cGUiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWctY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyB0aGUgc3ViY2xhc3Mgb2YgamF2YXguc2VybHZldC5qc3AudGFnZXh0LkpzcFRhZwotCSAgICB0aGF0IGltcGxlbWVudHMgdGhlIHJlcXVlc3QgdGltZSBzZW1hbnRpY3MgZm9yCi0JICAgIHRoaXMgdGFnLiAocmVxdWlyZWQpCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZWktY2xhc3MiCi0JCSAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBzdWJjbGFzcyBvZiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvCi0JICAgIGZvciB0aGlzIHRhZy4gKG9wdGlvbmFsKQotCi0JICAgIElmIHRoaXMgaXMgbm90IGdpdmVuLCB0aGUgY2xhc3MgaXMgbm90IGNvbnN1bHRlZCBhdAotCSAgICB0cmFuc2xhdGlvbiB0aW1lLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJvZHktY29udGVudCIKLQkJICAgdHlwZT0iamF2YWVlOmJvZHktY29udGVudFR5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBTcGVjaWZpZXMgdGhlIGZvcm1hdCBmb3IgdGhlIGJvZHkgb2YgdGhpcyB0YWcuCi0JICAgIFRoZSBkZWZhdWx0IGluIEpTUCAxLjIgd2FzICJKU1AiIGJ1dCBiZWNhdXNlIHRoaXMKLQkgICAgaXMgYW4gaW52YWxpZCBzZXR0aW5nIGZvciBzaW1wbGUgdGFnIGhhbmRsZXJzLCB0aGVyZQotCSAgICBpcyBubyBsb25nZXIgYSBkZWZhdWx0IGluIEpTUCAyLjAuICBBIHJlYXNvbmFibGUKLQkgICAgZGVmYXVsdCBmb3Igc2ltcGxlIHRhZyBoYW5kbGVycyBpcyAic2NyaXB0bGVzcyIgaWYKLQkgICAgdGhlIHRhZyBjYW4gaGF2ZSBhIGJvZHkuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFyaWFibGUiCi0JCSAgIHR5cGU9ImphdmFlZTp2YXJpYWJsZVR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiCi0JCSAgIHR5cGU9ImphdmFlZTp0bGQtYXR0cmlidXRlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImR5bmFtaWMtYXR0cmlidXRlcyIKLQkJICAgdHlwZT0iamF2YWVlOmdlbmVyaWMtYm9vbGVhblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4YW1wbGUiCi0JCSAgIHR5cGU9ImphdmFlZTp4c2RTdHJpbmdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZXhhbXBsZSBlbGVtZW50IGNvbnRhaW5zIGFuIGluZm9ybWFsIGRlc2NyaXB0aW9uCi0JICAgIG9mIGFuIGV4YW1wbGUgb2YgdGhlIHVzZSBvZiBhIHRhZy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhZy1leHRlbnNpb24iCi0JCSAgIHR5cGU9ImphdmFlZTp0bGQtZXh0ZW5zaW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIFRhZyBleHRlbnNpb25zIGFyZSBmb3IgdG9vbCB1c2Ugb25seSBhbmQgbXVzdCBub3QgYWZmZWN0Ci0JICAgIHRoZSBiZWhhdmlvciBvZiBhIGNvbnRhaW5lci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0bGQtYXR0cmlidXRlVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JVGhlIGF0dHJpYnV0ZSBlbGVtZW50IGRlZmluZXMgYW4gYXR0cmlidXRlIGZvciB0aGUgbmVzdGluZwotCXRhZy4gIFRoZSBhdHRyaWJ1dGUgZWxlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHN1YmVsZW1lbnRzCi0JZGVmaW5pbmc6Ci0KLQlkZXNjcmlwdGlvbiAgICAgYSBkZXNjcmlwdGlvbiBvZiB0aGUgYXR0cmlidXRlCi0KLQluYW1lICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotCi0JcmVxdWlyZWQgICAgICAgIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBvcgotCQkJb3B0aW9uYWwKLQotCXJ0ZXhwcnZhbHVlICAgICB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUgaXMgYSBydW50aW1lIGF0dHJpYnV0ZQotCi0JdHlwZSAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGVzCi0KLQlmcmFnbWVudCAgICAgICAgd2hldGhlciB0aGlzIGF0dHJpYnV0ZSBpcyBhIGZyYWdtZW50Ci0KLSAgICAgICAgZGVmZXJyZWQtdmFsdWUgIHByZXNlbnQgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgdG8gYmUgcGFyc2VkIGFzIGEKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbgotCi0gICAgICAgIGRlZmVycmVkLW1ldGhvZCBwcmVzZW50IGlmIHRoaXMgYXR0cmlidXRlIGlzIHRvIGJlIHBhcnNlZCBhcyBhCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIgotCQkgICB0eXBlPSJqYXZhZWU6amF2YS1pZGVudGlmaWVyVHlwZSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcXVpcmVkIgotCQkgICB0eXBlPSJqYXZhZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyBpZiB0aGUgbmVzdGluZyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3IKLQkgICAgb3B0aW9uYWwuCi0KLQkgICAgSWYgbm90IHByZXNlbnQgdGhlbiB0aGUgZGVmYXVsdCBpcyAiZmFsc2UiLCBpLmUKLQkgICAgdGhlIGF0dHJpYnV0ZSBpcyBvcHRpb25hbC4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCTx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiPgotCSAgICA8eHNkOmVsZW1lbnQgbmFtZT0icnRleHBydmFsdWUiCi0JCSAgICAgICAgIHR5cGU9ImphdmFlZTpnZW5lcmljLWJvb2xlYW5UeXBlIj4KLQkgICAgICA8eHNkOmFubm90YXRpb24+Ci0JICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkJICBEZWZpbmVzIGlmIHRoZSBuZXN0aW5nIGF0dHJpYnV0ZSBjYW4gaGF2ZSBzY3JpcHRsZXQKLQkJICBleHByZXNzaW9ucyBhcyBhIHZhbHVlLCBpLmUgdGhlIHZhbHVlIG9mIHRoZQotCQkgIGF0dHJpYnV0ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZCBhdCByZXF1ZXN0Ci0JCSAgdGltZSwgYXMgb3Bwb3NlZCB0byBhIHN0YXRpYyB2YWx1ZSBkZXRlcm1pbmVkIGF0Ci0JCSAgdHJhbnNsYXRpb24gdGltZS4KLQkJICBJZiBub3QgcHJlc2VudCB0aGVuIHRoZSBkZWZhdWx0IGlzICJmYWxzZSIsIGkuZSB0aGUKLQkJICBhdHRyaWJ1dGUgaGFzIGEgc3RhdGljIHZhbHVlCi0KLQkgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgICAgPC94c2Q6ZWxlbWVudD4KLQkgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUiCi0JCSAgICAgICAgIHR5cGU9ImphdmFlZTpmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotCQkgICAgICAgICBtaW5PY2N1cnM9IjAiPgotCSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCQkgIERlZmluZXMgdGhlIEphdmEgdHlwZSBvZiB0aGUgYXR0cmlidXRlcyB2YWx1ZS4KLSAgICAgICAgICAgICAgICAgIElmIHRoaXMgZWxlbWVudCBpcyBvbWl0dGVkLCB0aGUgZXhwZWN0ZWQgdHlwZSBpcwotICAgICAgICAgICAgICAgICAgYXNzdW1lZCB0byBiZSAiamF2YS5sYW5nLk9iamVjdCIuCi0KLQkgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgICAgPC94c2Q6ZWxlbWVudD4KLQkgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0JICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZlcnJlZC12YWx1ZSIKLQkJICAgICAgICAgdHlwZT0iamF2YWVlOnRsZC1kZWZlcnJlZC12YWx1ZVR5cGUiCi0JCSAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0JICAgICAgPHhzZDphbm5vdGF0aW9uPgotCSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAgICAgICBQcmVzZW50IGlmIHRoZSB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUgaXMgdG8gYmUKLSAgICAgICAgICAgICAgICAgIHBhc3NlZCB0byB0aGUgdGFnIGhhbmRsZXIgYXMgYQotICAgICAgICAgICAgICAgICAgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uLiBUaGlzIGFsbG93cyBmb3IgZGVmZXJyZWQKLSAgICAgICAgICAgICAgICAgIGV2YWx1YXRpb24gb2YgRUwgZXhwcmVzc2lvbnMuIEFuIG9wdGlvbmFsIHN1YmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgIHdpbGwgY29udGFpbiB0aGUgZXhwZWN0ZWQgdHlwZSB0aGF0IHRoZSB2YWx1ZSB3aWxsCi0gICAgICAgICAgICAgICAgICBiZSBjb2VyY2VkIHRvIGFmdGVyIGV2YWx1YXRpb24gb2YgdGhlIGV4cHJlc3Npb24uCi0gICAgICAgICAgICAgICAgICBUaGUgdHlwZSBkZWZhdWx0cyB0byBPYmplY3QgaWYgb25lIGlzIG5vdCBwcm92aWRlZC4KLQotCSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgICA8L3hzZDphbm5vdGF0aW9uPgotCSAgICA8L3hzZDplbGVtZW50PgotCSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmZXJyZWQtbWV0aG9kIgotCQkgICAgICAgdHlwZT0iamF2YWVlOnRsZC1kZWZlcnJlZC1tZXRob2RUeXBlIgotCQkgICAgICAgbWluT2NjdXJzPSIwIj4KLQkgICAgICA8eHNkOmFubm90YXRpb24+Ci0JICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICAgICAgICBQcmVzZW50IGlmIHRoZSB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUgaXMgdG8gYmUKLSAgICAgICAgICAgICAgICBwYXNzZWQgdG8gdGhlIHRhZyBoYW5kbGVyIGFzIGEKLSAgICAgICAgICAgICAgICBqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uLiBUaGlzIGFsbG93cyBmb3IgZGVmZXJyZWQKLSAgICAgICAgICAgICAgICBldmFsdWF0aW9uIG9mIGFuIEVMIGV4cHJlc3Npb24gdGhhdCBpZGVudGlmaWVzIGEKLSAgICAgICAgICAgICAgICBtZXRob2QgdG8gYmUgaW52b2tlZCBvbiBhbiBPYmplY3QuIEFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgc3ViZWxlbWVudCB3aWxsIGNvbnRhaW4gdGhlIGV4cGVjdGVkIG1ldGhvZAotICAgICAgICAgICAgICAgIHNpZ25hdHVyZS4gVGhlIHNpZ25hdHVyZSBkZWZhdWx0cyB0byAidm9pZCBtZXRob2QoKSIKLSAgICAgICAgICAgICAgICBpZiBvbmUgaXMgbm90IHByb3ZpZGVkLgotCi0JICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0JICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJmcmFnbWVudCIKLQkJICAgICB0eXBlPSJqYXZhZWU6Z2VuZXJpYy1ib29sZWFuVHlwZSIKLQkJICAgICBtaW5PY2N1cnM9IjAiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgICAidHJ1ZSIgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgb2YgdHlwZQotCSAgICAgIGphdmF4LmpzcC50YWdleHQuSnNwRnJhZ21lbnQsIHJlcHJlc2VudGluZyBkeW5hbWljCi0JICAgICAgY29udGVudCB0aGF0IGNhbiBiZSByZS1ldmFsdWF0ZWQgYXMgbWFueSB0aW1lcwotCSAgICAgIGFzIG5lZWRlZCBieSB0aGUgdGFnIGhhbmRsZXIuICBJZiBvbWl0dGVkIG9yICJmYWxzZSIsCi0JICAgICAgdGhlIGRlZmF1bHQgaXMgc3RpbGwgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCi0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGxkLWNhbm9uaWNhbC1uYW1lVHlwZSI+Ci0KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlEZWZpbmVzIHRoZSBjYW5vbmljYWwgbmFtZSBvZiBhIHRhZyBvciBhdHRyaWJ1dGUgYmVpbmcKLQlkZWZpbmVkLgotCi0JVGhlIG5hbWUgbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsIHJ1bGVzIGZvciBhbiBOTVRPS0VOLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9ImphdmFlZTp4c2ROTVRPS0VOVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0bGQtZGVmZXJyZWQtbWV0aG9kVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIHByb3ZpZGUgdGhlIHZhbHVlIGZvciBhCi0gICAgICAgIHRhZyBoYW5kbGVyIGF0dHJpYnV0ZSB0aGF0IGFjY2VwdHMgYSBqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uLgotCi0JVGhlIGRlZmVycmVkLW1ldGhvZCBlbGVtZW50IGhhcyBvbmUgb3B0aW9uYWwgc3ViZWxlbWVudDoKLQotCW1ldGhvZC1zaWduYXR1cmUgIFByb3ZpZGVzIHRoZSBzaWduYXR1cmUsIGFzIGluIHRoZSBKYXZhCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExhbmd1YWdlIFNwZWNpZmllcywgdGhhdCBpcyBleHBlY3RlZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1ldGhvZCBiZWluZyBpZGVudGlmaWVkIGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZC1zaWduYXR1cmUiCi0gICAgICAgICAgICAgICAgICAgdHlwZT0iamF2YWVlOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBQcm92aWRlcyB0aGUgZXhwZWN0ZWQgc2lnbmF0dXJlIG9mIHRoZSBtZXRob2QgaWRlbnRpZmllZAotICAgICAgICAgICAgYnkgdGhlIGphdmF4LmVsLk1ldGhvZEV4cHJlc3Npb24uCi0KLSAgICAgICAgICAgIFRoaXMgZGlzYW1iaWd1YXRlcyBvdmVybG9hZGVkIG1ldGhvZHMgYW5kIGVuc3VyZXMgdGhhdAotICAgICAgICAgICAgdGhlIHJldHVybiB2YWx1ZSBpcyBvZiB0aGUgZXhwZWN0ZWQgdHlwZS4KLQotICAgICAgICAgICAgVGhlIHN5bnRheCBvZiB0aGUgbWV0aG9kLXNpZ25hdHVyZSBlbGVtZW50IGlzIGlkZW50aWNhbAotICAgICAgICAgICAgdG8gdGhhdCBvZiB0aGUgZnVuY3Rpb24tc2lnbmF0dXJlIGVsZW1lbnQuICBTZWUgdGhlCi0gICAgICAgICAgICBkb2N1bWVudGF0aW9uIGZvciBmdW5jdGlvbi1zaWduYXR1cmUgZm9yIG1vcmUgZGV0YWlscy4KLQotCSAgICBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIGlzIGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzIG9ubHkKLQkgICAgYW5kIGlzIGlnbm9yZWQgYnkgdGhlIEpTUCBjb250YWluZXIuCi0KLSAgICAgICAgICAgIEV4YW1wbGU6Ci0KLSAgICAgICAgICAgICAgYm9vbGVhbiB2YWxpZGF0ZShqYXZhLmxhbmcuU3RyaW5nKQotCi0gICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0bGQtZGVmZXJyZWQtdmFsdWVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gcHJvdmlkZSB0aGUgdmFsdWUgZm9yIGEKLSAgICAgICAgdGFnIGhhbmRsZXIgYXR0cmlidXRlIHRoYXQgYWNjZXB0cyBhIGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbi4KLQotCVRoZSBkZWZlcnJlZC12YWx1ZSBlbGVtZW50IGhhcyBvbmUgb3B0aW9uYWwgc3ViZWxlbWVudDoKLQotCXR5cGUgICAgICAgICAgICB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgYXR0cmlidXRlCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZSIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgdHlwZSB0aGF0IGlzIHRoZQotICAgICAgICAgICAgZXhwZWN0ZWQgdHlwZSBmb3IgdGhpcyBkZWZlcnJlZCBleHByZXNzaW9uLiAgSWYgdGhpcwotICAgICAgICAgICAgZWxlbWVudCBpcyBvbWl0dGVkLCB0aGUgZXhwZWN0ZWQgdHlwZSBpcyBhc3N1bWVkIHRvIGJlCi0gICAgICAgICAgICAiamF2YS5sYW5nLk9iamVjdCIuCi0KLSAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLQotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRsZC1leHRlbnNpb25UeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdGxkLWV4dGVuc2lvblR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZQotCWV4dGVuc2lvbnMgdG8gYSBzcGVjaWZpYyBUTEQgZWxlbWVudC4KLQotCUl0IGlzIHVzZWQgYnkgZWxlbWVudHMgdG8gZGVzaWduYXRlIGFuIGV4dGVuc2lvbiBibG9jawotCXRoYXQgaXMgdGFyZ2V0ZWQgdG8gYSBzcGVjaWZpYyBleHRlbnNpb24gZGVzaWduYXRlZCBieQotCWEgc2V0IG9mIGV4dGVuc2lvbiBlbGVtZW50cyB0aGF0IGFyZSBkZWNsYXJlZCBieSBhCi0JbmFtZXNwYWNlLiBUaGUgbmFtZXNwYWNlIGlkZW50aWZpZXMgdGhlIGV4dGVuc2lvbiB0bwotCXRoZSB0b29sIHRoYXQgcHJvY2Vzc2VzIHRoZSBleHRlbnNpb24uCi0KLQlUaGUgdHlwZSBvZiB0aGUgZXh0ZW5zaW9uLWVsZW1lbnQgaXMgYWJzdHJhY3QuIFRoZXJlZm9yZSwKLQlhIGNvbmNyZXRlIHR5cGUgbXVzdCBiZSBzcGVjaWZpZWQgYnkgdGhlIFRMRCB1c2luZwotCXhzaTp0eXBlIGF0dHJpYnV0ZSBmb3IgZWFjaCBleHRlbnNpb24tZWxlbWVudC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24tZWxlbWVudCIKLQkJICAgdHlwZT0iamF2YWVlOmV4dGVuc2libGVUeXBlIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotCi0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIgotCQkgICB1c2U9InJlcXVpcmVkIgotCQkgICB0eXBlPSJ4c2Q6YW55VVJJIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotCi0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0bGRUYWdsaWJUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGUgdGFnbGliIHRhZyBpcyB0aGUgZG9jdW1lbnQgcm9vdCwgaXQgZGVmaW5lczoKLQotCWRlc2NyaXB0aW9uICAgICBhIHNpbXBsZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgInVzZSIgb2YgdGhpcwotCQkJdGFnbGliLCBzaG91bGQgYmUgdXNlciBkaXNjZXJuYWJsZQotCi0JZGlzcGxheS1uYW1lICAgIHRoZSBkaXNwbGF5LW5hbWUgZWxlbWVudCBjb250YWlucyBhCi0JCQlzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgZGlzcGxheWVkCi0JCQlieSB0b29scwotCi0JaWNvbiAgICAgICAgICAgIG9wdGlvbmFsIGljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scwotCi0JdGxpYi12ZXJzaW9uICAgIHRoZSB2ZXJzaW9uIG9mIHRoZSB0YWcgbGlicmFyeSBpbXBsZW1lbnRhdGlvbgotCi0Jc2hvcnQtbmFtZSAgICAgIGEgc2ltcGxlIGRlZmF1bHQgc2hvcnQgbmFtZSB0aGF0IGNvdWxkIGJlCi0JCQl1c2VkIGJ5IGEgSlNQIGF1dGhvcmluZyB0b29sIHRvIGNyZWF0ZQotCQkJbmFtZXMgd2l0aCBhIG1uZW1vbmljIHZhbHVlOyBmb3IgZXhhbXBsZSwKLQkJCXRoZSBpdCBtYXkgYmUgdXNlZCBhcyB0aGUgcHJlZmVyZWQgcHJlZml4Ci0JCQl2YWx1ZSBpbiB0YWdsaWIgZGlyZWN0aXZlcwotCi0JdXJpICAgICAgICAgICAgIGEgdXJpIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoaXMgdGFnbGliCi0KLQl2YWxpZGF0b3IgICAgICAgb3B0aW9uYWwgVGFnTGlicmFyeVZhbGlkYXRvciBpbmZvcm1hdGlvbgotCi0JbGlzdGVuZXIgICAgICAgIG9wdGlvbmFsIGV2ZW50IGxpc3RlbmVyIHNwZWNpZmljYXRpb24KLQotCXRhZyAgICAgICAgICAgICB0YWdzIGluIHRoaXMgdGFnIGxpYnJhcnkKLQotCXRhZy1maWxlICAgICAgICB0YWcgZmlsZXMgaW4gdGhpcyB0YWcgbGlicmFyeQotCi0JZnVuY3Rpb24gICAgICAgIHplcm8gb3IgbW9yZSBFTCBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGlzCi0JCQl0YWcgbGlicmFyeQotCi0JdGFnbGliLWV4dGVuc2lvbiB6ZXJvIG9yIG1vcmUgZXh0ZW5zaW9ucyB0aGF0IHByb3ZpZGUgZXh0cmEKLQkJCWluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFnbGliLCBmb3IgdG9vbAotCQkJY29uc3VtcHRpb24KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0iamF2YWVlOmRlc2NyaXB0aW9uR3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0bGliLXZlcnNpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXdleS12ZXJzaW9uVHlwZSI+Ci0JPHhzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgIERlc2NyaWJlcyB0aGlzIHZlcnNpb24gKG51bWJlcikgb2YgdGhlIHRhZ2xpYnJhcnkuCi0JICAgIEl0IGlzIGRlc2NyaWJlZCBhcyBhIGRld2V5IGRlY2ltYWwuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNob3J0LW5hbWUiCi0JCSAgIHR5cGU9ImphdmFlZTp0bGQtY2Fub25pY2FsLW5hbWVUeXBlIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyBhIHNpbXBsZSBkZWZhdWx0IG5hbWUgdGhhdCBjb3VsZCBiZSB1c2VkIGJ5Ci0JICAgIGEgSlNQIGF1dGhvcmluZyB0b29sIHRvIGNyZWF0ZSBuYW1lcyB3aXRoIGEKLQkgICAgbW5lbW9uaWN2YWx1ZTsgZm9yIGV4YW1wbGUsIGl0IG1heSBiZSB1c2VkIGFzIHRoZQotCSAgICBwcmVmZXJyZWQgcHJlZml4IHZhbHVlIGluIHRhZ2xpYiBkaXJlY3RpdmVzLiAgRG8KLQkgICAgbm90IHVzZSB3aGl0ZSBzcGFjZSwgYW5kIGRvIG5vdCBzdGFydCB3aXRoIGRpZ2l0cwotCSAgICBvciB1bmRlcnNjb3JlLgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJpIgotCQkgICB0eXBlPSJqYXZhZWU6eHNkQW55VVJJVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgRGVmaW5lcyBhIHB1YmxpYyBVUkkgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMKLQkgICAgdmVyc2lvbiBvZiB0aGUgdGFnbGlicmFyeS4gIExlYXZlIGl0IGVtcHR5IGlmIGl0Ci0JICAgIGRvZXMgbm90IGFwcGx5LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yIgotCQkgICB0eXBlPSJqYXZhZWU6dmFsaWRhdG9yVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGlzdGVuZXIiCi0JCSAgIHR5cGU9ImphdmFlZTpsaXN0ZW5lclR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWciCi0JCSAgIHR5cGU9ImphdmFlZTp0YWdUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnLWZpbGUiCi0JCSAgIHR5cGU9ImphdmFlZTp0YWdGaWxlVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVuY3Rpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFnbGliLWV4dGVuc2lvbiIKLQkJICAgdHlwZT0iamF2YWVlOnRsZC1leHRlbnNpb25UeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiCi0JCSAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGFnbGliIGV4dGVuc2lvbnMgYXJlIGZvciB0b29sIHVzZSBvbmx5IGFuZCBtdXN0IG5vdAotICAgICAgICAgICAgYWZmZWN0IHRoZSBiZWhhdmlvciBvZiBhIGNvbnRhaW5lci4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIgotCQkgICB0eXBlPSJqYXZhZWU6ZGV3ZXktdmVyc2lvblR5cGUiCi0JCSAgIGZpeGVkPSIyLjEiCi0JCSAgIHVzZT0icmVxdWlyZWQiPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgRGVzY3JpYmVzIHRoZSBKU1AgdmVyc2lvbiAobnVtYmVyKSB0aGlzIHRhZ2xpYnJhcnkKLQkgIHJlcXVpcmVzIGluIG9yZGVyIHRvIGZ1bmN0aW9uIChkZXdleSBkZWNpbWFsKQotCi0JPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsaWRhdG9yVHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JQSB2YWxpZGF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZQotCXRoZSBjb25mb3JtYW5jZSBvZiBhIEpTUCBwYWdlIHRvIHVzaW5nIHRoaXMgdGFnIGxpYnJhcnkgaXMKLQlkZWZpbmVkIGJ5IGEgdmFsaWRhdG9yVHlwZS4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIKLQkJICAgdHlwZT0iamF2YWVlOmRlc2NyaXB0aW9uVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIgotCQkgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbGlkYXRvci1jbGFzcyIKLQkJICAgdHlwZT0iamF2YWVlOmZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBEZWZpbmVzIHRoZSBUYWdMaWJyYXJ5VmFsaWRhdG9yIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQKLQkgICAgdG8gdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcwotCSAgICB0YWcgbGlicmFyeS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0LXBhcmFtIgotCQkgICB0eXBlPSJqYXZhZWU6cGFyYW0tdmFsdWVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvdmFsdWUgcGFpciBhcyBhbgotCSAgICBpbml0aWFsaXphdGlvbiBwYXJhbS4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGUtc2NvcGVUeXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQlUaGlzIHR5cGUgZGVmaW5lcyBzY29wZSBvZiB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlLiAgU2VlCi0JVGFnRXh0cmFJbmZvIGZvciBkZXRhaWxzLiAgVGhlIGFsbG93ZWQgdmFsdWVzIGFyZSwKLQkiTkVTVEVEIiwgIkFUX0JFR0lOIiBhbmQgIkFUX0VORCIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0iamF2YWVlOnN0cmluZyI+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTkVTVEVEIi8+Ci0JPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRfQkVHSU4iLz4KLQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVF9FTkQiLz4KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZVR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCVRoZSB2YXJpYWJsZVR5cGUgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gdGhlIHNjcmlwdGluZwotCXZhcmlhYmxlcyBkZWZpbmVkIGJ5IHVzaW5nIHRoaXMgdGFnLiAgSXQgaXMgYSAodHJhbnNsYXRpb24KLQl0aW1lKSBlcnJvciBmb3IgYSB0YWcgdGhhdCBoYXMgb25lIG9yIG1vcmUgdmFyaWFibGUKLQlzdWJlbGVtZW50cyB0byBoYXZlIGEgVGFnRXh0cmFJbmZvIGNsYXNzIHRoYXQgcmV0dXJucyBhCi0Jbm9uLW51bGwgdmFsdWUgZnJvbSBhIGNhbGwgdG8gZ2V0VmFyaWFibGVJbmZvKCkuCi0KLQlUaGUgc3ViZWxlbWVudHMgb2YgdmFyaWFibGVUeXBlIGFyZSBvZiB0aGUgZm9ybToKLQotCWRlc2NyaXB0aW9uICAgICAgICAgICAgICBPcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGlzCi0JCQkJIHZhcmlhYmxlCi0KLQluYW1lLWdpdmVuICAgICAgICAgICAgICAgVGhlIHZhcmlhYmxlIG5hbWUgYXMgYSBjb25zdGFudAotCi0JbmFtZS1mcm9tLWF0dHJpYnV0ZSAgICAgIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSB3aG9zZQotCQkJCSAodHJhbnNsYXRpb24gdGltZSkgdmFsdWUgd2lsbAotCQkJCSBnaXZlIHRoZSBuYW1lIG9mIHRoZQotCQkJCSB2YXJpYWJsZS4gIE9uZSBvZiBuYW1lLWdpdmVuIG9yCi0JCQkJIG5hbWUtZnJvbS1hdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCi0KLQl2YXJpYWJsZS1jbGFzcyAgICAgICAgICAgTmFtZSBvZiB0aGUgY2xhc3Mgb2YgdGhlIHZhcmlhYmxlLgotCQkJCSBqYXZhLmxhbmcuU3RyaW5nIGlzIGRlZmF1bHQuCi0KLQlkZWNsYXJlICAgICAgICAgICAgICAgICAgV2hldGhlciB0aGUgdmFyaWFibGUgaXMgZGVjbGFyZWQKLQkJCQkgb3Igbm90LiAgVHJ1ZSBpcyB0aGUgZGVmYXVsdC4KLQotCXNjb3BlICAgICAgICAgICAgICAgICAgICBUaGUgc2NvcGUgb2YgdGhlIHNjcmlwdGluZyB2YXJhaWJsZQotCQkJCSBkZWZpbmVkLiAgTkVTVEVEIGlzIGRlZmF1bHQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iCi0JCSAgIHR5cGU9ImphdmFlZTpkZXNjcmlwdGlvblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lLWdpdmVuIgotCQkgICAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIG5hbWUgZm9yIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUuCi0KLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lLWZyb20tYXR0cmlidXRlIgotCQkgICAgIHR5cGU9ImphdmFlZTpqYXZhLWlkZW50aWZpZXJUeXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JICAgICAgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHdob3NlCi0JICAgICAgKHRyYW5zbGF0aW9uLXRpbWUpIHZhbHVlIHdpbGwgZ2l2ZSB0aGUgbmFtZSBvZgotCSAgICAgIHRoZSB2YXJpYWJsZS4KLQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlLWNsYXNzIgotCQkgICB0eXBlPSJqYXZhZWU6ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLQkJICAgbWluT2NjdXJzPSIwIj4KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgVGhlIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGNsYXNzIGZvciB0aGUgc2NyaXB0aW5nCi0JICAgIHZhcmlhYmxlLiAgVGhlIGRlZmF1bHQgaXMgamF2YS5sYW5nLlN0cmluZy4KLQotCSAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVjbGFyZSIKLQkJICAgdHlwZT0iamF2YWVlOmdlbmVyaWMtYm9vbGVhblR5cGUiCi0JCSAgIG1pbk9jY3Vycz0iMCI+Ci0KLQk8eHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgV2hldGhlciB0aGUgc2NyaXB0aW5nIHZhcmlhYmxlIGlzIHRvIGJlIGRlZmluZWQKLQkgICAgb3Igbm90LiAgU2VlIFRhZ0V4dHJhSW5mbyBmb3IgZGV0YWlscy4gIFRoaXMKLQkgICAgZWxlbWVudCBpcyBvcHRpb25hbCBhbmQgInRydWUiIGlzIHRoZSBkZWZhdWx0LgotCi0JICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCTwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjb3BlIgotCQkgICB0eXBlPSJqYXZhZWU6dmFyaWFibGUtc2NvcGVUeXBlIgotCQkgICBtaW5PY2N1cnM9IjAiPgotCTx4c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCSAgICBUaGUgZWxlbWVudCBpcyBvcHRpb25hbCBhbmQgIk5FU1RFRCIgaXMgdGhlIGRlZmF1bHQuCi0KLQkgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpJRCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Quc3RhbmRhcmQuc2NoZW1hcy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQwMDY4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIHByb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMKLUJ1bmRsZS1OYW1lLjAgPSBKRUUgUmVsYXRlZCBTY2hlbWFzCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LnN0YW5kYXJkLnNjaGVtYXMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlMzkxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5zdGFuZGFyZC5zY2hlbWFzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLQotICAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgICA8IS0tIENhdGFsb2cgQ29udHJpYnV0aW9ucyAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBSZWdpc3RlciB3ZWxsIGtub3duIFdlYiBEVERzIGFuZCBYU0RzICAgIC0tPgotICAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jYXRhbG9nQ29udHJpYnV0aW9ucyI+Ci0gICAgICAgIDxjYXRhbG9nQ29udHJpYnV0aW9uIGlkPSJkZWZhdWx0Ij4KLQotCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIDEuMi8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9hcHBsaWNhdGlvbl8xXzIuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvYXBwbGljYXRpb25fMV8yLmR0ZCIgLz4KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gMS4zLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzFfMy5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbl8xXzMuZHRkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb25fMV80LnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uXzFfNC54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uXzUueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb25fNS54c2QiIC8+Ci0KLQotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiBDbGllbnQgMS4yLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF8xXzIuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvYXBwbGljYXRpb24tY2xpZW50XzFfMi5kdGQiIC8+Ci0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIENsaWVudCAxLjMvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzFfMy5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbi1jbGllbnRfMV8zLmR0ZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uLWNsaWVudF8xXzQueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvYXBwbGljYXRpb24tY2xpZW50XzFfNC54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uLWNsaWVudF81LnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2FwcGxpY2F0aW9uLWNsaWVudF81LnhzZCIgLz4KLQotCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBDb25uZWN0b3IgMS4wLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2Nvbm5lY3Rvcl8xXzAuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvY29ubmVjdG9yXzFfMC5kdGQiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9jb25uZWN0b3JfMV81LnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2Nvbm5lY3Rvcl8xXzUueHNkIiAvPgotCi0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDEuMS8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9lamItamFyXzFfMS5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZHRkcy9lamItamFyXzFfMS5kdGQiIC8+Ci0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8yXzAuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZWpiLWphcl8yXzAuZHRkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvZWpiLWphcl8yXzEueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvZWpiLWphcl8yXzEueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9lamItamFyXzNfMC54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9lamItamFyXzNfMC54c2QiIC8+Ci0KLQotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvajJlZV8xXzQueHNkIiAvPgotCi0KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2oyZWVfamF4cnBjX21hcHBpbmdfMV8xLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2oyZWVfamF4cnBjX21hcHBpbmdfMV8xLnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2oyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9qMmVlX3dlYl9zZXJ2aWNlc18xXzEueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvajJlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMS54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9qMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8xLnhzZCIgLz4KLQotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy94c2QvajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy94c2QvajJlZV93ZWJfc2VydmljZXNfMV8xLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2oyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL3d3dy5pYm0uY29tL3dlYnNlcnZpY2VzL3hzZC9qMmVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8xLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL2oyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkIiAvPgotCi0KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvamF2YWVlXzUueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvamF2YWVlXzUueHNkIiAvPgotCi0KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvamF2YWVlX3dlYl9zZXJ2aWNlc18xXzIueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvamF2YWVlX3dlYl9zZXJ2aWNlc18xXzIueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzIueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvamF2YWVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8yLnhzZCIgLz4KLQotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvanNwXzJfMC54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy9qc3BfMl8wLnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2pzcF8yXzEueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvanNwXzJfMS54c2QiIC8+Ci0KLQotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMi8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy93ZWItYXBwXzJfMi5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZHRkcy93ZWItYXBwXzIuMi5kdGQiIC8+Ci0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL3dlYi1hcHBfMl8zLmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZCIgLz4KLQotCi0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy93ZWItYXBwXzJfNC54c2QiIC8+Ci0KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvd2ViLWFwcF8yXzUueHNkIiAvPgotCi0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjEvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMV8xLmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMS5kdGQiIC8+Ci0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEpTUCBUYWcgTGlicmFyeSAxLjIvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMV8yLmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItanNwdGFnbGlicmFyeV8yXzAueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvd2ViLWpzcHRhZ2xpYnJhcnlfMl8wLnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWpzcHRhZ2xpYnJhcnlfMl8xLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMS54c2QiIC8+Ci0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMC8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzQW5kU2NoZW1hcy93ZWItZmFjZXNjb25maWdfMV8wLmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzAuZHRkIiAvPgotCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKYXZhU2VydmVyIEZhY2VzIENvbmZpZyAxLjEvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvd2ViLWZhY2VzY29uZmlnXzFfMS5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCIgLz4KLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHNBbmRTY2hlbWFzL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkIiAvPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL29ybV8xXzAueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvb3JtXzFfMC54c2QiIC8+Ci0gICAKLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZV8xXzAueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvcGVyc2lzdGVuY2VfMV8wLnhzZCIgLz4gICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDwvY2F0YWxvZ0NvbnRyaWJ1dGlvbj4KLQotICAgIDwvZXh0ZW5zaW9uPgotCi0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNGYxMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy93M2MvZG9tL2Nzcy8qKi8qIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC94bWwvY29yZS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiZjY3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1jc3Ntb2RlbC5qYXIKLWJ1aWxkLnhtbAotZGV2LnByb3BlcnRpZXMKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MDk3NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9kZWJ1Zz10cnVlCi1vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvZGVidWcvdHJhY2VmaWx0ZXI9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIwNDZlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jc3MuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkYzIwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0jV2VkIE1hciAyOCAwMzoxMzo1MiBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MjJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2YwMGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjIwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXA7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50aW1wbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkiLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVyczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRhc2tzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50ZXh0Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmFwYWNoZS54ZXJjZXM7YnVuZGxlLXZlcnNpb249IlsyLjkuMCwzLjAuMCkiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjguMSw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eTtleGNsdWRlOj0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJhMjgzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBjc3Nwcm9maWxlLyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbCxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzCi1zb3VyY2UuLiA9IHNyYy8KLSAgICAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY29tcG9uZW50LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NjAzM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jc3MiPgotCTxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly9lY2xpcHNlLm9yZy93ZWJ0b29scy93c3QvY29tcG9uZW50cy9jc3Mvb3ZlcnZpZXcuaHRtbCI+PC9kZXNjcmlwdGlvbj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnZpZXdzLnByb3BlcnRpZXMiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJDU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uQ1NTIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkudmlld3MuY29udGVudG91dGxpbmUiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJDU1NDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzcy1wcm9maWxlLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzLXByb2ZpbGUuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWIzZWY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzLXByb2ZpbGUuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLTwhLS0gRFREIGZvciBDU1MgTWV0YSBNb2RlbCBQcm9maWxlIC0tPgotPCEtLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC0tPgotPCEtLSBFbnRpdGllcyAtLT4KLQotPCEtLSBuYW1lLWRlZmluaXRpb24JOiBJbiBkZWZpbmluZyBtZXRhIG1vZGVsIG9iamVjdCwgb2JqZWN0IG5hbWUgLS0+Ci08IS0tIGlzIGdpdmVuIGJ5IHVzaW5nIHRoaXMgYXR0cmlidXRlLiAtLT4KLQotPCFFTlRJVFkgJSBuYW1lLWRlZmluaXRpb24gJ25hbWUgQ0RBVEEgI1JFUVVJUkVEJyA+Ci0KLTwhLS0gbmFtZS1yZWZlcmVuY2UJCTogdXNlZCB0byByZWZlciBtZXRhIG1vZGVsIG9iamVjdCB0aGF0IGRlZmluZWQgLS0+Ci08IS0tIGJ5IG5hbWUtZGVmaW5pdGlvbiAtLT4KLQotPCFFTlRJVFkgJSBuYW1lLXJlZmVyZW5jZSAnbmFtZSBDREFUQSAjUkVRVUlSRUQnID4KLQotPCEtLSBhdmFpbGFiaWxpdHkJCTogQ1NTIE1ldGEgTW9kZWwgUHJvZmlsZSBwZXJtaXQgaW1wb3J0aW5nIC0tPgotPCEtLSBvdGhlciBwcm9maWxlIGFuZCBkZXNjcmliZSBkaWZmZXJlbmNlIGZvciBpdC4gLS0+Ci0KLTwhRU5USVRZICUgYXZhaWxhYmlsaXR5ICdlbmFibGVkICh0cnVlIHwgZmFsc2UpICJ0cnVlIicgPgotPCFFTlRJVFkgJSBvdmVyd3JpdGUgJ292ZXJ3cml0ZSAodHJ1ZSB8IGZhbHNlKSAiZmFsc2UiJyA+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKiogLS0+Ci08IS0tICBlbG1lbnRzL2F0dHJpYnV0ZXMgIC0tPgotPCEtLSAqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPCFFTEVNRU5UIGNzcy1wcm9maWxlIChwcm9maWxlLWltcG9ydD8gLCAoc3R5bGVzaGVldC1kZWYgfCBjaGFyc2V0LXJ1bGUtZGVmIHwgaW1wb3J0LXJ1bGUtZGVmIHwgcGFnZS1ydWxlLWRlZiB8IG1lZGlhLXJ1bGUtZGVmIHwgZm9udGZhY2UtcnVsZS1kZWYgfCBzdHlsZS1ydWxlLWRlZiB8IHByb3BlcnR5LWRlZiB8IGRlc2NyaXB0b3ItZGVmIHwgY29udGFpbmVyLWRlZiB8IGZ1bmN0aW9uLWRlZiB8IG51bWJlci1kZWYgfCB1bml0LWRlZiB8IGtleXdvcmQtZGVmIHwgY2F0ZWdvcnktZGVmIHwgcHNldWRvLWVsZW1lbnQtZGVmIHwgcHNldWRvLWNsYXNzLWRlZikqKSA+Ci0KLTwhLS0gYSBwcm9maWxlIGNhbiBpbmNsdWRlIG90aGVyIHByb2ZpbGUgLS0+Ci0KLTwhRUxFTUVOVCBwcm9maWxlLWltcG9ydCBFTVBUWSA+Ci08IUFUVExJU1QgcHJvZmlsZS1pbXBvcnQgbmFtZSBDREFUQSAjUkVRVUlSRUQgPgotCi08IS0tIHdoaWNoIHR5cGUgb2YgcnVsZSBjYW4gYmUgdXNlZD8gLS0+Ci0KLTwhRUxFTUVOVCBzdHlsZXNoZWV0LWRlZiAoZGVzY3JpcHRpb24/ICwgKGNoYXJzZXQtcnVsZSB8IGltcG9ydC1ydWxlIHwgcGFnZS1ydWxlIHwgbWVkaWEtcnVsZSB8IGZvbnRmYWNlLXJ1bGUgfCBzdHlsZS1ydWxlKSopID4KLTwhQVRUTElTVCBzdHlsZXNoZWV0LWRlZiAlb3ZlcndyaXRlOyA+Ci0KLTwhRUxFTUVOVCBjaGFyc2V0LXJ1bGUgRU1QVFkgPgotPCFBVFRMSVNUIGNoYXJzZXQtcnVsZSAlYXZhaWxhYmlsaXR5OyA+Ci08IUVMRU1FTlQgaW1wb3J0LXJ1bGUgRU1QVFkgPgotPCFBVFRMSVNUIGltcG9ydC1ydWxlICVhdmFpbGFiaWxpdHk7ID4KLTwhRUxFTUVOVCBwYWdlLXJ1bGUgRU1QVFkgPgotPCFBVFRMSVNUIHBhZ2UtcnVsZSAlYXZhaWxhYmlsaXR5OyA+Ci08IUVMRU1FTlQgbWVkaWEtcnVsZSBFTVBUWSA+Ci08IUFUVExJU1QgbWVkaWEtcnVsZSAlYXZhaWxhYmlsaXR5OyA+Ci08IUVMRU1FTlQgZm9udGZhY2UtcnVsZSBFTVBUWSA+Ci08IUFUVExJU1QgZm9udGZhY2UtcnVsZSAlYXZhaWxhYmlsaXR5OyA+Ci08IUVMRU1FTlQgc3R5bGUtcnVsZSBFTVBUWSA+Ci08IUFUVExJU1Qgc3R5bGUtcnVsZSAlYXZhaWxhYmlsaXR5OyA+Ci0KLTwhRUxFTUVOVCBjaGFyc2V0LXJ1bGUtZGVmIChkZXNjcmlwdGlvbj8pID4KLTwhQVRUTElTVCBjaGFyc2V0LXJ1bGUtZGVmICVvdmVyd3JpdGU7ID4KLQotPCFFTEVNRU5UIGltcG9ydC1ydWxlLWRlZiAoZGVzY3JpcHRpb24/KSA+Ci08IUFUVExJU1QgaW1wb3J0LXJ1bGUtZGVmICVvdmVyd3JpdGU7ID4KLQotPCFFTEVNRU5UIHBhZ2UtcnVsZS1kZWYgKGRlc2NyaXB0aW9uPyAsIChwcm9wZXJ0eSB8IHBzZXVkby1jbGFzcykqKSA+Ci08IUFUVExJU1QgcGFnZS1ydWxlLWRlZiAlb3ZlcndyaXRlOyA+Ci0KLTwhRUxFTUVOVCBtZWRpYS1ydWxlLWRlZiAoZGVzY3JpcHRpb24/KSA+Ci08IUFUVExJU1QgbWVkaWEtcnVsZS1kZWYgJW92ZXJ3cml0ZTsgPgotCi08IUVMRU1FTlQgZm9udGZhY2UtcnVsZS1kZWYgKGRlc2NyaXB0aW9uPyAsIGRlc2NyaXB0b3IqKSA+Ci08IUFUVExJU1QgZm9udGZhY2UtcnVsZS1kZWYgJW92ZXJ3cml0ZTsgPgotCi08IUVMRU1FTlQgc3R5bGUtcnVsZS1kZWYgKGRlc2NyaXB0aW9uPyAsIChwcm9wZXJ0eSB8IHNlbGVjdG9yLWV4cHJlc3Npb24gfCBwc2V1ZG8tY2xhc3MgfCBwc2V1ZG8tZWxlbWVudCkqKSA+Ci08IUFUVExJU1Qgc3R5bGUtcnVsZS1kZWYgJW92ZXJ3cml0ZTsgPgotCi08IUVMRU1FTlQgc2VsZWN0b3ItZXhwcmVzc2lvbiBFTVBUWSA+Ci08IUFUVExJU1Qgc2VsZWN0b3ItZXhwcmVzc2lvbiBuYW1lIChkZXNjZW5kYW50IHwgY2hpbGQgfCBhZGphY2VudCB8IHVuaXZlcnNhbCB8IGF0dHJpYnV0ZSkgI1JFUVVJUkVEICVhdmFpbGFiaWxpdHk7ID4KLQotPCFFTEVNRU5UIHBzZXVkby1jbGFzcyBFTVBUWSA+Ci08IUFUVExJU1QgcHNldWRvLWNsYXNzICVuYW1lLXJlZmVyZW5jZTsgJWF2YWlsYWJpbGl0eTsgPgotCi08IUVMRU1FTlQgcHNldWRvLWVsZW1lbnQgRU1QVFkgPgotPCFBVFRMSVNUIHBzZXVkby1lbGVtZW50ICVuYW1lLXJlZmVyZW5jZTsgJWF2YWlsYWJpbGl0eTsgPgotCi08IUVMRU1FTlQgcHNldWRvLWNsYXNzLWRlZiAoZGVzY3JpcHRpb24/LCBzZWxlY3Rvci12YWx1ZSkgPgotPCFBVFRMSVNUIHBzZXVkby1jbGFzcy1kZWYgJW5hbWUtZGVmaW5pdGlvbjsgJW92ZXJ3cml0ZTsgPgotPCFFTEVNRU5UIHNlbGVjdG9yLXZhbHVlICgjUENEQVRBKSA+Ci0KLTwhRUxFTUVOVCBwc2V1ZG8tZWxlbWVudC1kZWYgKGRlc2NyaXB0aW9uPywgc2VsZWN0b3ItdmFsdWUpID4KLTwhQVRUTElTVCBwc2V1ZG8tZWxlbWVudC1kZWYgJW5hbWUtZGVmaW5pdGlvbjsgJW92ZXJ3cml0ZTsgPgotCi08IUVMRU1FTlQga2V5d29yZC1kZWYgKGRlc2NyaXB0aW9uPyAsIGtleXdvcmQtdmFsdWUpID4KLTwhQVRUTElTVCBrZXl3b3JkLWRlZiAlbmFtZS1kZWZpbml0aW9uOyAlb3ZlcndyaXRlOyA+Ci08IUVMRU1FTlQga2V5d29yZC12YWx1ZSAoI1BDREFUQSkgPgotPCFFTEVNRU5UIGRlc2NyaXB0aW9uICgjUENEQVRBKSA+Ci0KLTwhRUxFTUVOVCBmdW5jdGlvbi1kZWYgKGRlc2NyaXB0aW9uPyAsIGZ1bmN0aW9uLXZhbHVlKSA+Ci08IUFUVExJU1QgZnVuY3Rpb24tZGVmICVuYW1lLWRlZmluaXRpb247ICVvdmVyd3JpdGU7ID4KLTwhRUxFTUVOVCBmdW5jdGlvbi12YWx1ZSAoI1BDREFUQSkgPgotCi08IUVMRU1FTlQgbnVtYmVyLWRlZiAoZGVzY3JpcHRpb24/ICwgdW5pdCopID4KLTwhQVRUTElTVCBudW1iZXItZGVmICVuYW1lLWRlZmluaXRpb247ICVvdmVyd3JpdGU7ID4KLTwhRUxFTUVOVCB1bml0IEVNUFRZID4KLTwhQVRUTElTVCB1bml0ICVuYW1lLXJlZmVyZW5jZTsgJWF2YWlsYWJpbGl0eTsgPgotCi08IUVMRU1FTlQgdW5pdC1kZWYgKGRlc2NyaXB0aW9uPyAsIHVuaXQtdmFsdWUpID4KLTwhQVRUTElTVCB1bml0LWRlZiAlbmFtZS1kZWZpbml0aW9uOyAlb3ZlcndyaXRlOyA+Ci08IUVMRU1FTlQgdW5pdC12YWx1ZSAoI1BDREFUQSkgPgotCi08IUVMRU1FTlQgY29udGFpbmVyLWRlZiAoZGVzY3JpcHRpb24/ICwgKG51bWJlciB8IGtleXdvcmQgfCBmdW5jdGlvbiB8IGNvbnRhaW5lcikqKSA+Ci08IUFUVExJU1QgY29udGFpbmVyLWRlZiAlbmFtZS1kZWZpbml0aW9uOyAlb3ZlcndyaXRlOyA+Ci0KLTwhRUxFTUVOVCBjYXRlZ29yeS1kZWYgKGRlc2NyaXB0aW9uPywgY2FwdGlvbikgPgotPCFBVFRMSVNUIGNhdGVnb3J5LWRlZiAlbmFtZS1kZWZpbml0aW9uOyAlb3ZlcndyaXRlOyA+Ci08IUVMRU1FTlQgY2FwdGlvbiAoI1BDREFUQSkgPgotCi08IUVMRU1FTlQgcHJvcGVydHktZGVmIChkZXNjcmlwdGlvbj8gLCAobnVtYmVyIHwga2V5d29yZCB8IGZ1bmN0aW9uIHwgY29udGFpbmVyIHwgc3RyaW5nIHwgc2VwYXJhdG9yIHwgcHJvcGVydHkpKikgPgotPCFBVFRMSVNUIHByb3BlcnR5LWRlZiAlbmFtZS1kZWZpbml0aW9uOyAlb3ZlcndyaXRlOwotCQkJCQkgICBpbmhlcml0ZWQgKHllcyB8IG5vIHwgbmEpICJuYSIKLQkJCQkJICAgbWVkaWFncm91cCBDREFUQSAjSU1QTElFRAotCQkJCQkgICBjYXRlZ29yeSBDREFUQSAjSU1QTElFRCA+Ci08IUVMRU1FTlQgZGVzY3JpcHRvci1kZWYgKGRlc2NyaXB0aW9uPywgKG51bWJlciB8IGtleXdvcmQgfCBmdW5jdGlvbiB8IGNvbnRhaW5lciB8IHN0cmluZyB8IHNlcGFyYXRvciB8IHByb3BlcnR5KSopID4KLTwhQVRUTElTVCBkZXNjcmlwdG9yLWRlZiAlbmFtZS1kZWZpbml0aW9uOyAlb3ZlcndyaXRlOyA+Ci0KLTwhRUxFTUVOVCBudW1iZXIgRU1QVFkgPgotPCFBVFRMSVNUIG51bWJlciAlbmFtZS1yZWZlcmVuY2U7ICVhdmFpbGFiaWxpdHk7ID4gCi08IUVMRU1FTlQga2V5d29yZCBFTVBUWSA+Ci08IUFUVExJU1Qga2V5d29yZCAlbmFtZS1yZWZlcmVuY2U7ICVhdmFpbGFiaWxpdHk7ID4gCi08IUVMRU1FTlQgZnVuY3Rpb24gRU1QVFkgPgotPCFBVFRMSVNUIGZ1bmN0aW9uICVuYW1lLXJlZmVyZW5jZTsgJWF2YWlsYWJpbGl0eTsgPgotPCFFTEVNRU5UIGNvbnRhaW5lciBFTVBUWSA+Ci08IUFUVExJU1QgY29udGFpbmVyICVuYW1lLXJlZmVyZW5jZTsgJWF2YWlsYWJpbGl0eTsgPiAKLTwhRUxFTUVOVCBzdHJpbmcgRU1QVFkgPgotPCFBVFRMSVNUIHN0cmluZyAlbmFtZS1yZWZlcmVuY2U7ICVhdmFpbGFiaWxpdHk7ID4KLTwhRUxFTUVOVCBzZXBhcmF0b3IgRU1QVFkgPgotPCFBVFRMSVNUIHNlcGFyYXRvciBuYW1lIChjb21tYSB8IHNsYXNoKSAjUkVRVUlSRUQgJWF2YWlsYWJpbGl0eTsgPgotPCFFTEVNRU5UIHByb3BlcnR5IEVNUFRZID4KLTwhQVRUTElTVCBwcm9wZXJ0eSAlbmFtZS1yZWZlcmVuY2U7ICVhdmFpbGFiaWxpdHk7ID4gCi08IUVMRU1FTlQgZGVzY3JpcHRvciBFTVBUWSA+Ci08IUFUVExJU1QgZGVzY3JpcHRvciAlbmFtZS1yZWZlcmVuY2U7ICVhdmFpbGFiaWxpdHk7ID4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS1jc3MxLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS1jc3MxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBhMGVlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtY3NzMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08IS0tCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gLS0+Ci08IS0tPCFET0NUWVBFIGNzcy1wcm9maWxlIFNZU1RFTSAiY3NzLXByb2ZpbGUuZHRkIiA+LS0+Ci08Y3NzLXByb2ZpbGU+Ci0JPHN0eWxlc2hlZXQtZGVmPgotCQk8ZGVzY3JpcHRpb24+JWNzczEuc3R5bGVzaGVldC1kZWYuZGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotCQk8aW1wb3J0LXJ1bGUvPgotCQk8c3R5bGUtcnVsZS8+Ci0JPC9zdHlsZXNoZWV0LWRlZj4KLQotCTxpbXBvcnQtcnVsZS1kZWY+Ci0JPC9pbXBvcnQtcnVsZS1kZWY+Ci0KLQk8c3R5bGUtcnVsZS1kZWY+Ci0JCTxzZWxlY3Rvci1leHByZXNzaW9uIG5hbWU9ImRlc2NlbmRhbnQiLz4KLQkJPHBzZXVkby1lbGVtZW50IG5hbWU9ImZpcnN0LWxpbmUiLz4KLQkJPHBzZXVkby1lbGVtZW50IG5hbWU9ImZpcnN0LWxldHRlciIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9ImxpbmsiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJ2aXNpdGVkIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0iYWN0aXZlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLWF0dGFjaG1lbnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtY29sb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtaW1hZ2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtcG9zaXRpb24iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtcmVwZWF0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1ib3R0b20iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1ib3R0b20td2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1jb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWxlZnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1sZWZ0LXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItcmlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1yaWdodC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItdG9wIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItdG9wLXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNsZWFyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0iZGlzcGxheSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZmxvYXQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtZmFtaWx5Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXNpemUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtc3R5bGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtdmFyaWFudCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC13ZWlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImhlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGV0dGVyLXNwYWNpbmciLz4KLQkJPHByb3BlcnR5IG5hbWU9ImxpbmUtaGVpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaXN0LXN0eWxlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaXN0LXN0eWxlLWltYWdlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaXN0LXN0eWxlLXBvc2l0aW9uIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaXN0LXN0eWxlLXR5cGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmdpbiIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFyZ2luLWJvdHRvbSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFyZ2luLWxlZnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmdpbi1yaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFyZ2luLXRvcCIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFkZGluZyIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFkZGluZy1ib3R0b20iLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZGRpbmctbGVmdCIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFkZGluZy1yaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFkZGluZy10b3AiLz4KLQkJPHByb3BlcnR5IG5hbWU9InRleHQtYWxpZ24iLz4KLQkJPHByb3BlcnR5IG5hbWU9InRleHQtZGVjb3JhdGlvbiIvPgotCQk8cHJvcGVydHkgbmFtZT0idGV4dC1pbmRlbnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9InRleHQtdHJhbnNmb3JtIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2ZXJ0aWNhbC1hbGlnbiIvPgotCQk8cHJvcGVydHkgbmFtZT0id2hpdGUtc3BhY2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9IndpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3b3JkLXNwYWNpbmciLz4KLQk8L3N0eWxlLXJ1bGUtZGVmPgotCi0JPHBzZXVkby1jbGFzcy1kZWYgbmFtZT0ibGluayI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5saW5rPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1jbGFzcy1kZWY+Ci0JPHBzZXVkby1jbGFzcy1kZWYgbmFtZT0idmlzaXRlZCI+Ci0JCTxzZWxlY3Rvci12YWx1ZT52aXNpdGVkPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1jbGFzcy1kZWY+Ci0JPHBzZXVkby1jbGFzcy1kZWYgbmFtZT0iYWN0aXZlIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmFjdGl2ZTwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCi0JPHBzZXVkby1lbGVtZW50LWRlZiBuYW1lPSJmaXJzdC1saW5lIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmZpcnN0LWxpbmU8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWVsZW1lbnQtZGVmPgotCTxwc2V1ZG8tZWxlbWVudC1kZWYgbmFtZT0iZmlyc3QtbGV0dGVyIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmZpcnN0LWxldHRlcjwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tZWxlbWVudC1kZWY+Ci0KLQk8IS0tIHByb3BlcnR5IGRlZmluaXRpb24gLS0+Ci0KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1jb2xvciIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1pbWFnZSIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1yZXBlYXQiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtYXR0YWNobWVudCIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1wb3NpdGlvbiIvPgotICAgIDwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iYmFja2dyb3VuZC1hdHRhY2htZW50IiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ic2Nyb2xsIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImZpeGVkIi8+Ci0gICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSJiYWNrZ3JvdW5kLWNvbG9yIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLSAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJ0cmFuc3BhcmVudCIvPgotICAgIDwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iYmFja2dyb3VuZC1pbWFnZSIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0gICAgICAgIDxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotICAgIDwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYmFja2dyb3VuZC1wb3NpdGlvbiIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJ0b3AiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2VudGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJvdHRvbSIvPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJiYWNrZ3JvdW5kLXJlcGVhdCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0JCTxrZXl3b3JkIG5hbWU9InJlcGVhdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyZXBlYXQteCIvPgotCQk8a2V5d29yZCBuYW1lPSJyZXBlYXQteSIvPgotCQk8a2V5d29yZCBuYW1lPSJuby1yZXBlYXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlciIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItY29sb3IiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItc3R5bGUiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImRvdHRlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJkYXNoZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0ic29saWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iZG91YmxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imdyb292ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWRnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbnNldCIvPgotCQk8a2V5d29yZCBuYW1lPSJvdXRzZXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci10b3AiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXRvcC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1yaWdodCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItcmlnaHQtd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItYm90dG9tIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1ib3R0b20td2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItbGVmdCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItbGVmdC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci10b3Atd2lkdGgiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8a2V5d29yZCBuYW1lPSJ0aGluIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1lZGl1bSIvPgotCQk8a2V5d29yZCBuYW1lPSJ0aGljayIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXJpZ2h0LXdpZHRoIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGtleXdvcmQgbmFtZT0idGhpbiIvPgotCQk8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLQkJPGtleXdvcmQgbmFtZT0idGhpY2siLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1ib3R0b20td2lkdGgiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8a2V5d29yZCBuYW1lPSJ0aGluIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1lZGl1bSIvPgotCQk8a2V5d29yZCBuYW1lPSJ0aGljayIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWxlZnQtd2lkdGgiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8a2V5d29yZCBuYW1lPSJ0aGluIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1lZGl1bSIvPgotCQk8a2V5d29yZCBuYW1lPSJ0aGljayIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXdpZHRoIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGtleXdvcmQgbmFtZT0idGhpbiIvPgotCQk8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLQkJPGtleXdvcmQgbmFtZT0idGhpY2siLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImNsZWFyIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJvdGgiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImNvbG9yIiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImRpc3BsYXkiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJjbGFzc2lmaWNhdGlvbiI+Ci0JCTxrZXl3b3JkIG5hbWU9ImJsb2NrIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImlubGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJsaXN0LWl0ZW0iLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZmxvYXQiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQiCi0JCWluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXN0eWxlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXZhcmlhbnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtd2VpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXNpemUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImxpbmUtaGVpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LWZhbWlseSIvPgotCQk8c2VwYXJhdG9yIG5hbWU9InNsYXNoIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250LWZhbWlseSIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJmb250Ij4KLQkJPHN0cmluZyBuYW1lPSJmYW1pbHktbmFtZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImdlbmVyaWMtZmFtaWx5Ii8+Ci0JCTxzZXBhcmF0b3IgbmFtZT0iY29tbWEiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQtc2l6ZSIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJmb250Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJhYnNvbHV0ZS1zaXplIi8+Ci0JCTxjb250YWluZXIgbmFtZT0icmVsYXRpdmUtc2l6ZSIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQtc3R5bGUiIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJpdGFsaWMiLz4KLQkJPGtleXdvcmQgbmFtZT0ib2JsaXF1ZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC12YXJpYW50IiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0ic21hbGwtY2FwcyIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC13ZWlnaHQiIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJib2xkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJvbGRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJsaWdodGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjEwMCIvPgotCQk8a2V5d29yZCBuYW1lPSIyMDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iMzAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjQwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI1MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iNjAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjcwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI4MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iOTAwIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJoZWlnaHQiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGV0dGVyLXNwYWNpbmciIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGluZS1oZWlnaHQiIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Imxpc3Qtc3R5bGUiIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0iY2xhc3NpZmljYXRpb24iPgotCQk8a2V5d29yZCBuYW1lPSJkaXNjIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNpcmNsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzcXVhcmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZGVjaW1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlci1yb21hbiIvPgotCQk8a2V5d29yZCBuYW1lPSJ1cHBlci1yb21hbiIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlci1hbHBoYSIvPgotCQk8a2V5d29yZCBuYW1lPSJ1cHBlci1hbHBoYSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imluc2lkZSIvPgotCQk8a2V5d29yZCBuYW1lPSJvdXRzaWRlIi8+Ci0JCTxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGlzdC1zdHlsZS1pbWFnZSIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJjbGFzc2lmaWNhdGlvbiI+Ci0JCTxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGlzdC1zdHlsZS1wb3NpdGlvbiIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJjbGFzc2lmaWNhdGlvbiI+Ci0JCTxrZXl3b3JkIG5hbWU9Imluc2lkZSIvPgotCQk8a2V5d29yZCBuYW1lPSJvdXRzaWRlIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsaXN0LXN0eWxlLXR5cGUiIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0iY2xhc3NpZmljYXRpb24iPgotCQk8a2V5d29yZCBuYW1lPSJkaXNjIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNpcmNsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzcXVhcmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZGVjaW1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlci1yb21hbiIvPgotCQk8a2V5d29yZCBuYW1lPSJ1cHBlci1yb21hbiIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlci1hbHBoYSIvPgotCQk8a2V5d29yZCBuYW1lPSJ1cHBlci1hbHBoYSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJnaW4iIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFyZ2luLXRvcCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJnaW4tcmlnaHQiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFyZ2luLWJvdHRvbSIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJnaW4tbGVmdCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWRkaW5nIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWRkaW5nLXRvcCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFkZGluZy1yaWdodCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFkZGluZy1ib3R0b20iIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZGRpbmctbGVmdCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1hbGlnbiIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJjZW50ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ianVzdGlmeSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1kZWNvcmF0aW9uIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0idW5kZXJsaW5lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im92ZXJsaW5lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxpbmUtdGhyb3VnaCIvPgotCQk8a2V5d29yZCBuYW1lPSJibGluayIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1pbmRlbnQiIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC10cmFuc2Zvcm0iIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImNhcGl0YWxpemUiLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXJjYXNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyY2FzZSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ2ZXJ0aWNhbC1hbGlnbiIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJiYXNlbGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzdWIiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3VwZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0idG9wIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRleHQtdG9wIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1pZGRsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJib3R0b20iLz4KLQkJPGtleXdvcmQgbmFtZT0idGV4dC1ib3R0b20iLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ3aGl0ZS1zcGFjZSIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJjbGFzc2lmaWNhdGlvbiI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJwcmUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm93cmFwIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ3aWR0aCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ3b3JkLXNwYWNpbmciIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCTwvcHJvcGVydHktZGVmPgotCi0JPCEtLSBjb250YWluZXIgZGVmaW5pdGlvbiA6IENvbnRhaW5lciBpcyB0aGUgbHVtcCBvZiB2YWx1ZXMuCi0JSXQgY2FuIGJlIHVzZWQgbGlrZSBtYWNyb3MuIC0tPgotICAgIDxjb250YWluZXItZGVmIG5hbWU9ImFic29sdXRlLXNpemUiPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJ4eC1zbWFsbCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJ4LXNtYWxsIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InNtYWxsIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Im1lZGl1bSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJsYXJnZSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJ4LWxhcmdlIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Inh4LWxhcmdlIi8+Ci0gICAgPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9ImNvbG9yIj4KLQkJPGtleXdvcmQgbmFtZT0iYXF1YSIvPgotCQk8a2V5d29yZCBuYW1lPSJibGFjayIvPgotCQk8a2V5d29yZCBuYW1lPSJibHVlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImZ1Y2hzaWEiLz4KLQkJPGtleXdvcmQgbmFtZT0iZ3JheSIvPgotCQk8a2V5d29yZCBuYW1lPSJncmVlbiIvPgotCQk8a2V5d29yZCBuYW1lPSJsaW1lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1hcm9vbiIvPgotCQk8a2V5d29yZCBuYW1lPSJuYXZ5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im9saXZlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InB1cnBsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJyZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2lsdmVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRlYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0id2hpdGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ieWVsbG93Ii8+Ci0JCTxmdW5jdGlvbiBuYW1lPSJyZ2IiLz4KLQkJPG51bWJlciBuYW1lPSJoYXNoIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9ImdlbmVyaWMtZmFtaWx5Ij4KLQkJPGtleXdvcmQgbmFtZT0ic2VyaWYiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2Fucy1zZXJpZiIvPgotCQk8a2V5d29yZCBuYW1lPSJjdXJzaXZlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImZhbnRhc3kiLz4KLQkJPGtleXdvcmQgbmFtZT0ibW9ub3NwYWNlIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9InJlbGF0aXZlLXNpemUiPgotCQk8a2V5d29yZCBuYW1lPSJzbWFsbGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxhcmdlciIvPgotCTwvY29udGFpbmVyLWRlZj4KLQotCTwhLS0gY2F0ZWdvcnkgZGVmaW5pdGlvbiA6IFRoaXMgaXMgdXNlZCB0byBjYXRlZ29yaXplIHByb3BlcnRpZXMKLQlpbiBQcm9wZXJ0aWVzIFZpZXcuIC0tPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0iYm94Ij4KLQkJPGNhcHRpb24+JWNzczEuY2F0ZWdvcnktZGVmLmJveC5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLQkJPGNhcHRpb24+JWNzczEuY2F0ZWdvcnktZGVmLmNvbG9yYW5kYmFja2dyb3VuZC5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0iY2xhc3NpZmljYXRpb24iPgotCQk8Y2FwdGlvbj4lY3NzMS5jYXRlZ29yeS1kZWYuY2xhc3NpZmljYXRpb24uY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9ImZvbnQiPgotCQk8Y2FwdGlvbj4lY3NzMS5jYXRlZ29yeS1kZWYuZm9udC5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0idGV4dCI+Ci0JCTxjYXB0aW9uPiVjc3MxLmNhdGVnb3J5LWRlZi50ZXh0LmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0KLQk8ZnVuY3Rpb24tZGVmIG5hbWU9InJnYiI+Ci0JCTxmdW5jdGlvbi12YWx1ZT5yZ2I8L2Z1bmN0aW9uLXZhbHVlPgotCTwvZnVuY3Rpb24tZGVmPgotCTxmdW5jdGlvbi1kZWYgbmFtZT0idXJpIj4KLQkJPGZ1bmN0aW9uLXZhbHVlPnVybDwvZnVuY3Rpb24tdmFsdWU+Ci0JPC9mdW5jdGlvbi1kZWY+Ci0JCi0JPCEtLSBudW1iZXIgZGVmaW5pdGlvbiA6IFdoYXQgdW5pdCB0eXBlcyBiZSBhY2NlcHRhYmxlIGZvciBlYWNoCi0JbnVtYmVyIHR5cGU/IC0tPgotICAgIDxudW1iZXItZGVmIG5hbWU9Imhhc2giPgotICAgICAgICA8dW5pdCBuYW1lPSJoYXNoIi8+Ci0gICAgPC9udW1iZXItZGVmPgotICAgIDxudW1iZXItZGVmIG5hbWU9Imxlbmd0aCI+Ci0gICAgICAgIDx1bml0IG5hbWU9ImVtIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9ImV4Ii8+Ci0gICAgICAgIDx1bml0IG5hbWU9InB4Ii8+Ci0gICAgICAgIDx1bml0IG5hbWU9ImluIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9ImNtIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9Im1tIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9InB0Ii8+Ci0gICAgICAgIDx1bml0IG5hbWU9InBjIi8+Ci0gICAgPC9udW1iZXItZGVmPgotCTxudW1iZXItZGVmIG5hbWU9Im51bWJlciI+Ci0JPC9udW1iZXItZGVmPgotCTxudW1iZXItZGVmIG5hbWU9InBlcmNlbnRhZ2UiPgotCQk8dW5pdCBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JPC9udW1iZXItZGVmPgotCi0JPHVuaXQtZGVmIG5hbWU9ImNtIj4KLQkJPHVuaXQtdmFsdWU+Y208L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0iZW0iPgotCQk8dW5pdC12YWx1ZT5lbTwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJleCI+Ci0JCTx1bml0LXZhbHVlPmV4PC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9Imhhc2giPgotCQk8dW5pdC12YWx1ZT4jPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9ImluIj4KLQkJPHVuaXQtdmFsdWU+aW48L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0ibW0iPgotCQk8dW5pdC12YWx1ZT5tbTwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJwYyI+Ci0JCTx1bml0LXZhbHVlPnBjPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9InBlcmNlbnRhZ2UiPgotCQk8dW5pdC12YWx1ZT4lPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9InB0Ij4KLQkJPHVuaXQtdmFsdWU+cHQ8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0icHgiPgotCQk8dW5pdC12YWx1ZT5weDwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCi0gICAgPCEtLSBrZXl3b3JkcyA6IHN0cmluZyBjb25zdGFudHMgKHRoaXMgaXMgbGFzdCBwYXJ0Li4pIC0tPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSIxMDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT4xMDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iMjAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+MjAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjMwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjMwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSI0MDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT40MDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iNTAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+NTAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjYwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjYwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSI3MDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT43MDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iODAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ODAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjkwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjkwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhcXVhIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YXF1YTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhdXRvIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YXV0bzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJiYXNlbGluZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJhc2VsaW5lPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJsYWNrIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YmxhY2s8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmxpbmsiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ibGluazwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJibG9jayI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJsb2NrPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJsdWUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ibHVlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJvbGQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ib2xkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJvbGRlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJvbGRlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJib3RoIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ym90aDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJib3R0b20iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ib3R0b208L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2FwaXRhbGl6ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNhcGl0YWxpemU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2VudGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2VudGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNpcmNsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNpcmNsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjdXJzaXZlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y3Vyc2l2ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkYXNoZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kYXNoZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZGVjaW1hbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRlY2ltYWw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZGlzYyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRpc2M8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZG90dGVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZG90dGVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRvdWJsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRvdWJsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmYW50YXN5Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZmFudGFzeTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmaXhlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmZpeGVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImZ1Y2hzaWEiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5mdWNoc2lhPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImdyYXkiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ncmF5PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImdyZWVuIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Z3JlZW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZ3Jvb3ZlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Z3Jvb3ZlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImlubGluZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmlubGluZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpbnNldCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmluc2V0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imluc2lkZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmluc2lkZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpdGFsaWMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5pdGFsaWM8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ianVzdGlmeSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmp1c3RpZnk8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGFyZ2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sYXJnZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsYXJnZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sYXJnZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGVmdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxlZnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGlnaHRlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxpZ2h0ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGltZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxpbWU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGluZS10aHJvdWdoIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGluZS10aHJvdWdoPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imxpc3QtaXRlbSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxpc3QtaXRlbTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsb3dlci1hbHBoYSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxvd2VyLWFscGhhPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imxvd2VyLXJvbWFuIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bG93ZXItcm9tYW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG93ZXJjYXNlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bG93ZXJjYXNlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im1hcm9vbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm1hcm9vbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtZWRpdW0iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5tZWRpdW08L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWlkZGxlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bWlkZGxlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im1vbm9zcGFjZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm1vbm9zcGFjZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJuYXZ5Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bmF2eTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJuby1yZXBlYXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5uby1yZXBlYXQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibm9uZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5vbmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibm9ybWFsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bm9ybWFsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im5vd3JhcCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5vd3JhcDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJvYmxpcXVlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+b2JsaXF1ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJvbGl2ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm9saXZlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im91dHNldCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm91dHNldDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJvdXRzaWRlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+b3V0c2lkZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJvdmVybGluZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm92ZXJsaW5lPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InByZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnByZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwdXJwbGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5wdXJwbGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJlcGVhdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJlcGVhdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyZXBlYXQteCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJlcGVhdC14PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJlcGVhdC15Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmVwZWF0LXk8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmlkZ2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yaWRnZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyaWdodCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJpZ2h0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNhbnMtc2VyaWYiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zYW5zLXNlcmlmPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNjcm9sbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNjcm9sbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzZXJpZiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNlcmlmPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNpbHZlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNpbHZlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzbWFsbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNtYWxsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNtYWxsLWNhcHMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zbWFsbC1jYXBzPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNtYWxsZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zbWFsbGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNvbGlkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c29saWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3F1YXJlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c3F1YXJlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InN1YiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnN1Yjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzdXBlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnN1cGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRlYWwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50ZWFsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRleHQtdG9wIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGV4dC10b3A8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGV4dC1ib3R0b20iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50ZXh0LWJvdHRvbTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0aGljayI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRoaWNrPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRoaW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50aGluPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRvcCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRvcDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0cmFuc3BhcmVudCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRyYW5zcGFyZW50PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVuZGVybGluZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVuZGVybGluZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1cHBlci1hbHBoYSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVwcGVyLWFscGhhPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVwcGVyLXJvbWFuIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dXBwZXItcm9tYW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idXBwZXJjYXNlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dXBwZXJjYXNlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IndoaXRlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+d2hpdGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieC1sYXJnZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPngtbGFyZ2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieC1zbWFsbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPngtc21hbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieHgtc21hbGwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54eC1zbWFsbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4eC1sYXJnZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnh4LWxhcmdlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InllbGxvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnllbGxvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotPC9jc3MtcHJvZmlsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtY3NzMi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtY3NzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MWFjYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLWNzczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjI3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAtLT4KLTwhLS08IURPQ1RZUEUgY3NzLXByb2ZpbGUgU1lTVEVNICJjc3MtcHJvZmlsZS5kdGQiID4tLT4KLTxjc3MtcHJvZmlsZT4KLQk8c3R5bGVzaGVldC1kZWY+Ci0JCTxkZXNjcmlwdGlvbj4lY3NzMi5zdHlsZXNoZWV0LWRlZi5kZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0JCTxjaGFyc2V0LXJ1bGUvPgotCQk8aW1wb3J0LXJ1bGUvPgotCQk8cGFnZS1ydWxlLz4KLQkJPG1lZGlhLXJ1bGUvPgotCQk8Zm9udGZhY2UtcnVsZS8+Ci0JCTxzdHlsZS1ydWxlLz4KLQk8L3N0eWxlc2hlZXQtZGVmPgotCi0JPGNoYXJzZXQtcnVsZS1kZWY+Ci0JPC9jaGFyc2V0LXJ1bGUtZGVmPgotCTxpbXBvcnQtcnVsZS1kZWY+Ci0JPC9pbXBvcnQtcnVsZS1kZWY+Ci0JPG1lZGlhLXJ1bGUtZGVmPgotCTwvbWVkaWEtcnVsZS1kZWY+Ci0KLQk8cGFnZS1ydWxlLWRlZj4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJsZWZ0Ii8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0icmlnaHQiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJmaXJzdCIvPgotCQk8cHJvcGVydHkgbmFtZT0ic2l6ZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFya3MiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZ2UtYnJlYWstYWZ0ZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZ2UtYnJlYWstYmVmb3JlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWluc2lkZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3JwaGFucyIvPgotCQk8cHJvcGVydHkgbmFtZT0id2lkb3dzIi8+Ci0JPC9wYWdlLXJ1bGUtZGVmPgotCi0JPGZvbnRmYWNlLXJ1bGUtZGVmPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJhc2NlbnQiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iYmFzZWxpbmUiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iYmJveCIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJjYXAtaGVpZ2h0Ii8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9ImNlbnRlcmxpbmUiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iZGVmaW5pdGlvbi1zcmMiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iZGVzY2VudCIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJmb250LWZhbWlseSIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJmb250LXNpemUiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iZm9udC1zdHJldGNoIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9ImZvbnQtc3R5bGUiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iZm9udC12YXJpYW50Ii8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9ImZvbnQtd2VpZ2h0Ii8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9Im1hdGhsaW5lIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9InBhbm9zZS0xIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9InNsb3BlIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9InNsb3BlIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9InNyYyIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJzdGVtaCIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJzdGVtdiIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJ0b3BsaW5lIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9InVuaWNvZGUtcmFuZ2UiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0idW5pdHMtcGVyLWVtIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9IndpZHRocyIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJ4LWhlaWdodCIvPgotCTwvZm9udGZhY2UtcnVsZS1kZWY+Ci0KLQk8IS0tIFdoaWNoIHByb3BlcnRpZXMgY2FuIHN0eWxlIHJ1bGUgaW5jbHVkZSA/IC0tPgotCi0JPHN0eWxlLXJ1bGUtZGVmPgotCQk8c2VsZWN0b3ItZXhwcmVzc2lvbiBuYW1lPSJkZXNjZW5kYW50Ii8+Ci0JCTxzZWxlY3Rvci1leHByZXNzaW9uIG5hbWU9ImNoaWxkIi8+Ci0JCTxzZWxlY3Rvci1leHByZXNzaW9uIG5hbWU9ImFkamFjZW50Ii8+Ci0JCTxzZWxlY3Rvci1leHByZXNzaW9uIG5hbWU9InVuaXZlcnNhbCIvPgotCQk8c2VsZWN0b3ItZXhwcmVzc2lvbiBuYW1lPSJhdHRyaWJ1dGUiLz4KLQkJPHBzZXVkby1lbGVtZW50IG5hbWU9ImZpcnN0LWxpbmUiLz4KLQkJPHBzZXVkby1lbGVtZW50IG5hbWU9ImZpcnN0LWxldHRlciIvPgotCQk8cHNldWRvLWVsZW1lbnQgbmFtZT0iYmVmb3JlIi8+Ci0JCTxwc2V1ZG8tZWxlbWVudCBuYW1lPSJhZnRlciIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9ImZpcnN0LWNoaWxkIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0ibGluayIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9InZpc2l0ZWQiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJob3ZlciIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9ImFjdGl2ZSIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9ImZvY3VzIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0ibGFuZyIvPgotCQk8cHJvcGVydHkgbmFtZT0iYXppbXV0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1hdHRhY2htZW50Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLWNvbG9yIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLWltYWdlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLXBvc2l0aW9uIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLXJlcGVhdCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItY29sbGFwc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1jb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXNwYWNpbmciLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXRvcCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXJpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItYm90dG9tIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItbGVmdCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXRvcC1jb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXJpZ2h0LWNvbG9yIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItYm90dG9tLWNvbG9yIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItbGVmdC1jb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXRvcC1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXJpZ2h0LXN0eWxlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItYm90dG9tLXN0eWxlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItbGVmdC1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXRvcC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXJpZ2h0LXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItYm90dG9tLXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItbGVmdC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3R0b20iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNhcHRpb24tc2lkZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY2xlYXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNsaXAiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNvbG9yIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb250ZW50Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb3VudGVyLWluY3JlbWVudCIvPgotCQk8cHJvcGVydHkgbmFtZT0iY291bnRlci1yZXNldCIvPgotCQk8cHJvcGVydHkgbmFtZT0iY3VlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjdWUtYWZ0ZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImN1ZS1iZWZvcmUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImN1cnNvciIvPgotCQk8cHJvcGVydHkgbmFtZT0iZGlyZWN0aW9uIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkaXNwbGF5Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJlbGV2YXRpb24iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImVtcHR5LWNlbGxzIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmbG9hdCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1mYW1pbHkiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtc2l6ZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zaXplLWFkanVzdCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zdHJldGNoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXN0eWxlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXZhcmlhbnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtd2VpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJoZWlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImxlZnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImxldHRlci1zcGFjaW5nIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaW5lLWhlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGlzdC1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGlzdC1zdHlsZS1pbWFnZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGlzdC1zdHlsZS1wb3NpdGlvbiIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGlzdC1zdHlsZS10eXBlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJnaW4iLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmdpbi10b3AiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmdpbi1yaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFyZ2luLWJvdHRvbSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFyZ2luLWxlZnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmtlci1vZmZzZXQiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmtzIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXgtaGVpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXgtd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1pbi1oZWlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1pbi13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3JwaGFucyIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZS1jb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZS1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZS13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3ZlcmZsb3ciLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZGRpbmciLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZGRpbmctdG9wIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWRkaW5nLXJpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWRkaW5nLWJvdHRvbSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFkZGluZy1sZWZ0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWdlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWFmdGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWJlZm9yZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFnZS1icmVhay1pbnNpZGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhdXNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYXVzZS1hZnRlciIvPgotCQk8cHJvcGVydHkgbmFtZT0icGF1c2UtYmVmb3JlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwaXRjaCIvPgotCQk8cHJvcGVydHkgbmFtZT0icGl0Y2gtcmFuZ2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsYXktZHVyaW5nIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwb3NpdGlvbiIvPgotCQk8cHJvcGVydHkgbmFtZT0icXVvdGVzIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJyaWNobmVzcyIvPgotCQk8cHJvcGVydHkgbmFtZT0icmlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNpemUiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNwZWFrIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcGVhay1oZWFkZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNwZWFrLW51bWVyYWwiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNwZWFrLXB1bmN0dWF0aW9uIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcGVlY2gtcmF0ZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3RyZXNzIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0YWJsZS1sYXlvdXQiLz4KLQkJPHByb3BlcnR5IG5hbWU9InRleHQtYWxpZ24iLz4KLQkJPHByb3BlcnR5IG5hbWU9InRleHQtZGVjb3JhdGlvbiIvPgotCQk8cHJvcGVydHkgbmFtZT0idGV4dC1pbmRlbnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9InRleHQtc2hhZG93Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZXh0LXRyYW5zZm9ybSIvPgotCQk8cHJvcGVydHkgbmFtZT0idG9wIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ1bmljb2RlLWJpZGkiLz4KLQkJPHByb3BlcnR5IG5hbWU9InZlcnRpY2FsLWFsaWduIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmlsaXR5Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2b2ljZS1mYW1pbHkiLz4KLQkJPHByb3BlcnR5IG5hbWU9InZvbHVtZSIvPgotCQk8cHJvcGVydHkgbmFtZT0id2hpdGUtc3BhY2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9IndpZG93cyIvPgotCQk8cHJvcGVydHkgbmFtZT0id2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9IndvcmQtc3BhY2luZyIvPgotCQk8cHJvcGVydHkgbmFtZT0iei1pbmRleCIvPgotCTwvc3R5bGUtcnVsZS1kZWY+Ci0KLQk8cHNldWRvLWNsYXNzLWRlZiBuYW1lPSJmaXJzdC1jaGlsZCI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5maXJzdC1jaGlsZDwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9ImxpbmsiPgotCQk8c2VsZWN0b3ItdmFsdWU+bGluazwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9InZpc2l0ZWQiPgotCQk8c2VsZWN0b3ItdmFsdWU+dmlzaXRlZDwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9ImhvdmVyIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmhvdmVyPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1jbGFzcy1kZWY+Ci0JPHBzZXVkby1jbGFzcy1kZWYgbmFtZT0iYWN0aXZlIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmFjdGl2ZTwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9ImZvY3VzIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmZvY3VzPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1jbGFzcy1kZWY+Ci0JPHBzZXVkby1jbGFzcy1kZWYgbmFtZT0ibGFuZyI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5sYW5nPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1jbGFzcy1kZWY+Ci0JPHBzZXVkby1jbGFzcy1kZWYgbmFtZT0ibGVmdCI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5sZWZ0PC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1jbGFzcy1kZWY+Ci0JPHBzZXVkby1jbGFzcy1kZWYgbmFtZT0icmlnaHQiPgotCQk8c2VsZWN0b3ItdmFsdWU+cmlnaHQ8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWNsYXNzLWRlZj4KLQk8cHNldWRvLWNsYXNzLWRlZiBuYW1lPSJmaXJzdCI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5maXJzdDwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCi0JPHBzZXVkby1lbGVtZW50LWRlZiBuYW1lPSJmaXJzdC1saW5lIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmZpcnN0LWxpbmU8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWVsZW1lbnQtZGVmPgotCTxwc2V1ZG8tZWxlbWVudC1kZWYgbmFtZT0iZmlyc3QtbGV0dGVyIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmZpcnN0LWxldHRlcjwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tZWxlbWVudC1kZWY+Ci0JPHBzZXVkby1lbGVtZW50LWRlZiBuYW1lPSJiZWZvcmUiPgotCQk8c2VsZWN0b3ItdmFsdWU+YmVmb3JlPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1lbGVtZW50LWRlZj4KLQk8cHNldWRvLWVsZW1lbnQtZGVmIG5hbWU9ImFmdGVyIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmFmdGVyPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1lbGVtZW50LWRlZj4KLQotCTwhLS0gcHJvcGVydHkgZGVmaW5pdGlvbiAtLT4KLQotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYXppbXV0aCIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhpcyBwcm92aWRlcyBzcGF0aWFsIGF1ZGlvIHByb3BlcnR5IGZvciBhdXJhbAotICAgICAgICBwcmVzZW50YXRpb248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bnVtYmVyIG5hbWU9ImFuZ2xlIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImxlZnQtc2lkZSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJmYXItbGVmdCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImNlbnRlci1sZWZ0Ii8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImNlbnRlciIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJjZW50ZXItcmlnaHQiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iZmFyLXJpZ2h0Ii8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InJpZ2h0LXNpZGUiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iYmVoaW5kIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImxlZnR3YXJkcyIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJyaWdodHdhcmRzIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLWNvbG9yIi8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLWltYWdlIi8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLXJlcGVhdCIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1hdHRhY2htZW50Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLXBvc2l0aW9uIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQtYXR0YWNobWVudCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ic2Nyb2xsIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImZpeGVkIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQtY29sb3IiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0gICAgICAgIDxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0idHJhbnNwYXJlbnQiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgIDwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iYmFja2dyb3VuZC1pbWFnZSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLSAgICAgICAgPGZ1bmN0aW9uIG5hbWU9InVyaSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICA8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQtcG9zaXRpb24iCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJ0b3AiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2VudGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJvdHRvbSIvPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQtcmVwZWF0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotCQk8a2V5d29yZCBuYW1lPSJyZXBlYXQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmVwZWF0LXgiLz4KLQkJPGtleXdvcmQgbmFtZT0icmVwZWF0LXkiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm8tcmVwZWF0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWNvbGxhcHNlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGFibGVzIj4KLQkJPGtleXdvcmQgbmFtZT0iY29sbGFwc2UiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2VwYXJhdGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWNvbG9yIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRyYW5zcGFyZW50Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1zcGFjaW5nIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGFibGVzIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXN0eWxlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItdG9wIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXRvcC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXJpZ2h0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXJpZ2h0LXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItYm90dG9tIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWJvdHRvbS13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWxlZnQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItbGVmdC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXRvcC1jb2xvciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItcmlnaHQtY29sb3IiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWJvdHRvbS1jb2xvciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItbGVmdC1jb2xvciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItdG9wLXN0eWxlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItcmlnaHQtc3R5bGUiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1ib3R0b20tc3R5bGUiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1sZWZ0LXN0eWxlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItdG9wLXdpZHRoIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItcmlnaHQtd2lkdGgiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iYm9yZGVyLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1ib3R0b20td2lkdGgiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iYm9yZGVyLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1sZWZ0LXdpZHRoIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItd2lkdGgiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iYm9yZGVyLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvdHRvbSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iY2FwdGlvbi1zaWRlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGFibGVzIj4KLQkJPGtleXdvcmQgbmFtZT0idG9wIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJvdHRvbSIvPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImNsZWFyIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iYm90aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjbGlwIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8Y29udGFpbmVyIG5hbWU9InNoYXBlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iY29sb3IiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImNvbnRlbnQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImFsbCIgY2F0ZWdvcnk9ImNvbnRlbnQiPgotCQk8c3RyaW5nIG5hbWU9ImFueSIvPgotCQk8ZnVuY3Rpb24gbmFtZT0idXJpIi8+Ci0JCTxmdW5jdGlvbiBuYW1lPSJjb3VudGVyIi8+Ci0JCTxmdW5jdGlvbiBuYW1lPSJhdHRyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im9wZW4tcXVvdGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2xvc2UtcXVvdGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm8tb3Blbi1xdW90ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJuby1jbG9zZS1xdW90ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjb3VudGVyLWluY3JlbWVudCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYWxsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxzdHJpbmcgbmFtZT0iY291bnRlci1pZGVudGlmaWVyIi8+Ci0JCTxudW1iZXIgbmFtZT0iaW50ZWdlciIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImNvdW50ZXItcmVzZXQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImFsbCIgY2F0ZWdvcnk9ImNvbnRlbnQiPgotCQk8c3RyaW5nIG5hbWU9ImNvdW50ZXItaWRlbnRpZmllciIvPgotCQk8bnVtYmVyIG5hbWU9ImludGVnZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjdWUiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8cHJvcGVydHkgbmFtZT0iY3VlLWJlZm9yZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY3VlLWFmdGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImN1ZS1hZnRlciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjdWUtYmVmb3JlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPGZ1bmN0aW9uIG5hbWU9InVyaSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImN1cnNvciIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCxpbnRlcmFjdGl2ZSIgY2F0ZWdvcnk9InVpIj4KLQkJPGZ1bmN0aW9uIG5hbWU9InVyaSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNyb3NzaGFpciIvPgotCQk8a2V5d29yZCBuYW1lPSJkZWZhdWx0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InBvaW50ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ibW92ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJlLXJlc2l6ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJuZS1yZXNpemUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibnctcmVzaXplIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im4tcmVzaXplIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNlLXJlc2l6ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzdy1yZXNpemUiLz4KLQkJPGtleXdvcmQgbmFtZT0icy1yZXNpemUiLz4KLQkJPGtleXdvcmQgbmFtZT0idy1yZXNpemUiLz4KLQkJPGtleXdvcmQgbmFtZT0idGV4dCIvPgotCQk8a2V5d29yZCBuYW1lPSJ3YWl0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImhlbHAiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJkaXJlY3Rpb24iCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJsdHIiLz4KLQkJPGtleXdvcmQgbmFtZT0icnRsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImRpc3BsYXkiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImFsbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImlubGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJibG9jayIvPgotCQk8a2V5d29yZCBuYW1lPSJsaXN0LWl0ZW0iLz4KLQkJPGtleXdvcmQgbmFtZT0icnVuLWluIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNvbXBhY3QiLz4KLQkJPGtleXdvcmQgbmFtZT0ibWFya2VyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRhYmxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImlubGluZS10YWJsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJ0YWJsZS1yb3ctZ3JvdXAiLz4KLQkJPGtleXdvcmQgbmFtZT0idGFibGUtaGVhZGVyLWdyb3VwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRhYmxlLWZvb3Rlci1ncm91cCIvPgotCQk8a2V5d29yZCBuYW1lPSJ0YWJsZS1yb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0idGFibGUtY29sdW1uLWdyb3VwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRhYmxlLWNvbHVtbiIvPgotCQk8a2V5d29yZCBuYW1lPSJ0YWJsZS1jZWxsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRhYmxlLWNhcHRpb24iLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJlbGV2YXRpb24iCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPG51bWJlciBuYW1lPSJhbmdsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJiZWxvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJsZXZlbCIvPgotCQk8a2V5d29yZCBuYW1lPSJhYm92ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJoaWdoZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZW1wdHktY2VsbHMiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0YWJsZXMiPgotCQk8a2V5d29yZCBuYW1lPSJzaG93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImhpZGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZmxvYXQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250IgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXN0eWxlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXZhcmlhbnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtd2VpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXNpemUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImxpbmUtaGVpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LWZhbWlseSIvPgotCQk8a2V5d29yZCBuYW1lPSJjYXB0aW9uIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imljb24iLz4KLQkJPGtleXdvcmQgbmFtZT0ibWVudSIvPgotCQk8a2V5d29yZCBuYW1lPSJtZXNzYWdlLWJveCIvPgotCQk8a2V5d29yZCBuYW1lPSJzbWFsbC1jYXB0aW9uIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InN0YXR1cy1iYXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCQk8c2VwYXJhdG9yIG5hbWU9InNsYXNoIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250LWZhbWlseSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8c3RyaW5nIG5hbWU9ImZhbWlseS1uYW1lIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iZ2VuZXJpYy1mYW1pbHkiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250LXNpemUiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJmb250Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJhYnNvbHV0ZS1zaXplIi8+Ci0JCTxjb250YWluZXIgbmFtZT0icmVsYXRpdmUtc2l6ZSIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC1zaXplLWFkanVzdCIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQtc3RyZXRjaCIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0id2lkZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ibmFycm93ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0idWx0cmEtY29uZGVuc2VkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImV4dHJhLWNvbmRlbnNlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJjb25kZW5zZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2VtaS1jb25kZW5zZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2VtaS1leHBhbmRlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJleHBhbmRlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJleHRyYS1leHBhbmRlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJ1bHRyYS1leHBhbmRlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250LXN0eWxlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJpdGFsaWMiLz4KLQkJPGtleXdvcmQgbmFtZT0ib2JsaXF1ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250LXZhcmlhbnQiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJmb250Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNtYWxsLWNhcHMiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC13ZWlnaHQiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJmb250Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJvbGQiLz4KLQkJPGtleXdvcmQgbmFtZT0iYm9sZGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxpZ2h0ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iMTAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjIwMCIvPgotCQk8a2V5d29yZCBuYW1lPSIzMDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iNDAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjUwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI2MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iNzAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjgwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI5MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iaGVpZ2h0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsZWZ0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsZXR0ZXItc3BhY2luZyIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGluZS1oZWlnaHQiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Imxpc3Qtc3R5bGUiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb250ZW50Ij4KLQkJPHByb3BlcnR5IG5hbWU9Imxpc3Qtc3R5bGUtdHlwZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGlzdC1zdHlsZS1wb3NpdGlvbiIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGlzdC1zdHlsZS1pbWFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsaXN0LXN0eWxlLWltYWdlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsaXN0LXN0eWxlLXBvc2l0aW9uIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxrZXl3b3JkIG5hbWU9Imluc2lkZSIvPgotCQk8a2V5d29yZCBuYW1lPSJvdXRzaWRlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Imxpc3Qtc3R5bGUtdHlwZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbnRlbnQiPgotCQk8a2V5d29yZCBuYW1lPSJkaXNjIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNpcmNsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzcXVhcmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZGVjaW1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJkZWNpbWFsLWxlYWRpbmctemVybyIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlci1yb21hbiIvPgotCQk8a2V5d29yZCBuYW1lPSJ1cHBlci1yb21hbiIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlci1ncmVlayIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlci1hbHBoYSIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlci1sYXRpbiIvPgotCQk8a2V5d29yZCBuYW1lPSJ1cHBlci1hbHBoYSIvPgotCQk8a2V5d29yZCBuYW1lPSJ1cHBlci1sYXRpbiIvPgotCQk8a2V5d29yZCBuYW1lPSJoZWJyZXciLz4KLQkJPGtleXdvcmQgbmFtZT0iYXJtZW5pYW4iLz4KLQkJPGtleXdvcmQgbmFtZT0iZ2VvcmdpYW4iLz4KLQkJPGtleXdvcmQgbmFtZT0iY2prLWlkZW9ncmFwaGljIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImhpcmFnYW5hIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImthdGFrYW5hIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImhpcmFnYW5hLWlyb2hhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImthdGFrYW5hLWlyb2hhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFyZ2luIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9Im1hcmdpbi13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJnaW4tdG9wIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9Im1hcmdpbi13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJnaW4tcmlnaHQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0ibWFyZ2luLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1hcmdpbi1ib3R0b20iCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0ibWFyZ2luLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1hcmdpbi1sZWZ0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9Im1hcmdpbi13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJrZXItb2Zmc2V0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb250ZW50Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJrcyIKLQkJaW5oZXJpdGVkPSJuYSIgbWVkaWFncm91cD0idmlzdWFsLHBhZ2VkIiBjYXRlZ29yeT0icGFnZSI+Ci0JCTxrZXl3b3JkIG5hbWU9ImNyb3AiLz4KLQkJPGtleXdvcmQgbmFtZT0iY3Jvc3MiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXgtaGVpZ2h0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXgtd2lkdGgiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1pbi1oZWlnaHQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1pbi13aWR0aCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ib3JwaGFucyIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCxwYWdlZCIgY2F0ZWdvcnk9InBhZ2UiPgotCQk8bnVtYmVyIG5hbWU9ImludGVnZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ib3V0bGluZSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsLGludGVyYWN0aXZlIiBjYXRlZ29yeT0idWkiPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZS1jb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZS1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZS13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJvdXRsaW5lLWNvbG9yIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwsaW50ZXJhY3RpdmUiIGNhdGVnb3J5PSJ1aSI+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW52ZXJ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im91dGxpbmUtc3R5bGUiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCxpbnRlcmFjdGl2ZSIgY2F0ZWdvcnk9InVpIj4KLQkJPGNvbnRhaW5lciBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ib3V0bGluZS13aWR0aCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsLGludGVyYWN0aXZlIiBjYXRlZ29yeT0idWkiPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJvdmVyZmxvdyIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGtleXdvcmQgbmFtZT0idmlzaWJsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJoaWRkZW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ic2Nyb2xsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFkZGluZyIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJwYWRkaW5nLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZGRpbmctdG9wIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9InBhZGRpbmctd2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFkZGluZy1yaWdodCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJwYWRkaW5nLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZGRpbmctYm90dG9tIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9InBhZGRpbmctd2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFkZGluZy1sZWZ0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9InBhZGRpbmctd2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFnZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCxwYWdlZCIgY2F0ZWdvcnk9InBhZ2UiPgotCQk8c3RyaW5nIG5hbWU9InBhZ2UtaWRlbnRpZmllciIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWdlLWJyZWFrLWFmdGVyIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwscGFnZWQiIGNhdGVnb3J5PSJwYWdlIj4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJhbHdheXMiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXZvaWQiLz4KLQkJPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWdlLWJyZWFrLWJlZm9yZSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsLHBhZ2VkIiBjYXRlZ29yeT0icGFnZSI+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iYWx3YXlzIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF2b2lkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFnZS1icmVhay1pbnNpZGUiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwscGFnZWQiIGNhdGVnb3J5PSJwYWdlIj4KLQkJPGtleXdvcmQgbmFtZT0iYXZvaWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYXVzZSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxudW1iZXIgbmFtZT0idGltZSIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGF1c2UtYWZ0ZXIiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8bnVtYmVyIG5hbWU9InRpbWUiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhdXNlLWJlZm9yZSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxudW1iZXIgbmFtZT0idGltZSIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGl0Y2giCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPG51bWJlciBuYW1lPSJmcmVxdWVuY3kiLz4KLQkJPGtleXdvcmQgbmFtZT0ieC1sb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1lZGl1bSIvPgotCQk8a2V5d29yZCBuYW1lPSJoaWdoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IngtaGlnaCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwaXRjaC1yYW5nZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwbGF5LWR1cmluZyIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLQkJPGtleXdvcmQgbmFtZT0ibWl4Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJlcGVhdCIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icG9zaXRpb24iCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9InN0YXRpYyIvPgotCQk8a2V5d29yZCBuYW1lPSJyZWxhdGl2ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhYnNvbHV0ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJmaXhlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJxdW90ZXMiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb250ZW50Ij4KLQkJPHN0cmluZyBuYW1lPSJhbnkiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJyaWNobmVzcyIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJyaWdodCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ic2l6ZSIKLQkJaW5oZXJpdGVkPSJuYSIgbWVkaWFncm91cD0idmlzdWFsLHBhZ2VkIiBjYXRlZ29yeT0icGFnZSI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0icG9ydHJhaXQiLz4KLQkJPGtleXdvcmQgbmFtZT0ibGFuZHNjYXBlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InNwZWFrIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNwZWxsLW91dCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJzcGVhay1oZWFkZXIiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9InRhYmxlcyI+Ci0JCTxrZXl3b3JkIG5hbWU9Im9uY2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYWx3YXlzIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InNwZWFrLW51bWVyYWwiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPGtleXdvcmQgbmFtZT0iZGlnaXRzIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNvbnRpbnVvdXMiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ic3BlYWstcHVuY3R1YXRpb24iCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPGtleXdvcmQgbmFtZT0iY29kZSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InNwZWVjaC1yYXRlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Ingtc2xvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJzbG93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1lZGl1bSIvPgotCQk8a2V5d29yZCBuYW1lPSJmYXN0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IngtZmFzdCIvPgotCQk8a2V5d29yZCBuYW1lPSJmYXN0ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2xvd2VyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InN0cmVzcyIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ0YWJsZS1sYXlvdXQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRhYmxlcyI+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iZml4ZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1hbGlnbiIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNlbnRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJqdXN0aWZ5Ii8+Ci0JCTxzdHJpbmcgbmFtZT0iYW55Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtZGVjb3JhdGlvbiIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0idW5kZXJsaW5lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im92ZXJsaW5lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxpbmUtdGhyb3VnaCIvPgotCQk8a2V5d29yZCBuYW1lPSJibGluayIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ0ZXh0LWluZGVudCIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1zaGFkb3ciCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ0ZXh0LXRyYW5zZm9ybSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJjYXBpdGFsaXplIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVwcGVyY2FzZSIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlcmNhc2UiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ0b3AiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InVuaWNvZGUtYmlkaSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImVtYmVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJpZGktb3ZlcnJpZGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idmVydGljYWwtYWxpZ24iCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImJhc2VsaW5lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InN1YiIvPgotCQk8a2V5d29yZCBuYW1lPSJzdXBlciIvPgotCQk8a2V5d29yZCBuYW1lPSJ0b3AiLz4KLQkJPGtleXdvcmQgbmFtZT0idGV4dC10b3AiLz4KLQkJPGtleXdvcmQgbmFtZT0ibWlkZGxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJvdHRvbSIvPgotCQk8a2V5d29yZCBuYW1lPSJ0ZXh0LWJvdHRvbSIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idmlzaWJpbGl0eSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGtleXdvcmQgbmFtZT0idmlzaWJsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJoaWRkZW4iLz4KLQkJPGtleXdvcmQgbmFtZT0iY29sbGFwc2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idm9pY2UtZmFtaWx5IgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxzdHJpbmcgbmFtZT0ic3BlY2lmaWMtdm9pY2UiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJnZW5lcmljLXZvaWNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InZvbHVtZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2lsZW50Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Ingtc29mdCIvPgotCQk8a2V5d29yZCBuYW1lPSJzb2Z0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1lZGl1bSIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3VkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IngtbG91ZCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ3aGl0ZS1zcGFjZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0icHJlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vd3JhcCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ3aWRvd3MiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwscGFnZWQiIGNhdGVnb3J5PSJwYWdlIj4KLQkJPG51bWJlciBuYW1lPSJpbnRlZ2VyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9IndpZHRoIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ3b3JkLXNwYWNpbmciCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InotaW5kZXgiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPG51bWJlciBuYW1lPSJpbnRlZ2VyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQotCTwhLS0gZGVzY3JpcHRvciBkZWZpbml0aW9uIDogVGhlc2UgYXJlIGZvciBAZm9udC1mYWNlIC0tPgotCi0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImFzY2VudCI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iYmFzZWxpbmUiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImJib3giPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iY2FwLWhlaWdodCI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iY2VudGVybGluZSI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iZGVmaW5pdGlvbi1zcmMiPgotCQk8ZnVuY3Rpb24gbmFtZT0idXJpIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iZGVzY2VudCI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iZm9udC1mYW1pbHkiPgotCQk8c3RyaW5nIG5hbWU9ImZhbWlseS1uYW1lIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iZ2VuZXJpYy1mYW1pbHkiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImZvbnQtc2l6ZSI+Ci0JCTxrZXl3b3JkIG5hbWU9ImFsbCIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iZm9udC1zdHJldGNoIj4KLQkJPGtleXdvcmQgbmFtZT0iYWxsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJ1bHRyYS1jb25kZW5zZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iZXh0cmEtY29uZGVuc2VkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNvbmRlbnNlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJzZW1pLWNvbmRlbnNlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJzZW1pLWV4cGFuZGVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImV4cGFuZGVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImV4dHJhLWV4cGFuZGVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVsdHJhLWV4cGFuZGVkIi8+Ci0JCTxzZXBhcmF0b3IgbmFtZT0iY29tbWEiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJmb250LXN0eWxlIj4KLQkJPGtleXdvcmQgbmFtZT0iYWxsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJpdGFsaWMiLz4KLQkJPGtleXdvcmQgbmFtZT0ib2JsaXF1ZSIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iZm9udC12YXJpYW50Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNtYWxsLWNhcHMiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImZvbnQtd2VpZ2h0Ij4KLQkJPGtleXdvcmQgbmFtZT0iYWxsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJib2xkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjEwMCIvPgotCQk8a2V5d29yZCBuYW1lPSIyMDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iMzAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjQwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI1MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iNjAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjcwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI4MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iOTAwIi8+Ci0JCTxzZXBhcmF0b3IgbmFtZT0iY29tbWEiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJtYXRobGluZSI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0icGFub3NlLTEiPgotCQk8bnVtYmVyIG5hbWU9ImludGVnZXIiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJzbG9wZSI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0ic3JjIj4KLQkJPGZ1bmN0aW9uIG5hbWU9InVyaSIvPgotCQk8ZnVuY3Rpb24gbmFtZT0iZm9ybWF0Ii8+Ci0JCTxjb250YWluZXIgbmFtZT0iZm9udC1mYWNlLW5hbWUiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJzdGVtaCI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0ic3RlbXYiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9InRvcGxpbmUiPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9InVuaWNvZGUtcmFuZ2UiPgotCQk8c3RyaW5nIG5hbWU9InVyYW5nZSIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9InVuaXRzLXBlci1lbSI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0id2lkdGhzIj4KLQkJPHN0cmluZyBuYW1lPSJ1cmFuZ2UiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJ4LWhlaWdodCI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQotCTwhLS0gY29udGFpbmVyIGRlZmluaXRpb24gOiBDb250YWluZXIgaXMgdGhlIGx1bXAgb2YgdmFsdWVzLgotCUl0IGNhbiBiZSB1c2VkIGxpa2UgbWFjcm9zLiAtLT4KLSAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJhYnNvbHV0ZS1zaXplIj4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ieHgtc21hbGwiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ieC1zbWFsbCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJzbWFsbCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ibGFyZ2UiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ieC1sYXJnZSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJ4eC1sYXJnZSIvPgotICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJib3JkZXItc3R5bGUiPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImhpZGRlbiIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJkb3R0ZWQiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iZGFzaGVkIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InNvbGlkIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImRvdWJsZSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJncm9vdmUiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0icmlkZ2UiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5zZXQiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ib3V0c2V0Ii8+Ci0gICAgPC9jb250YWluZXItZGVmPgotICAgIDxjb250YWluZXItZGVmIG5hbWU9ImJvcmRlci13aWR0aCI+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InRoaW4iLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ibWVkaXVtIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InRoaWNrIi8+Ci0gICAgICAgIDxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0gICAgPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9ImNvbG9yIj4KLQkJPGtleXdvcmQgbmFtZT0iYXF1YSIvPgotCQk8a2V5d29yZCBuYW1lPSJibGFjayIvPgotCQk8a2V5d29yZCBuYW1lPSJibHVlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImZ1Y2hzaWEiLz4KLQkJPGtleXdvcmQgbmFtZT0iZ3JheSIvPgotCQk8a2V5d29yZCBuYW1lPSJncmVlbiIvPgotCQk8a2V5d29yZCBuYW1lPSJsaW1lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1hcm9vbiIvPgotCQk8a2V5d29yZCBuYW1lPSJuYXZ5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im9saXZlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InB1cnBsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJyZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2lsdmVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRlYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0id2hpdGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ieWVsbG93Ii8+Ci0JCTxjb250YWluZXIgbmFtZT0ic3lzdGVtLWNvbG9yIi8+Ci0JCTxmdW5jdGlvbiBuYW1lPSJyZ2IiLz4KLQkJPG51bWJlciBuYW1lPSJoYXNoIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9ImdlbmVyaWMtZmFtaWx5Ij4KLQkJPGtleXdvcmQgbmFtZT0ic2VyaWYiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2Fucy1zZXJpZiIvPgotCQk8a2V5d29yZCBuYW1lPSJjdXJzaXZlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImZhbnRhc3kiLz4KLQkJPGtleXdvcmQgbmFtZT0ibW9ub3NwYWNlIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9ImZvbnQtZmFjZS1uYW1lIj4KLQkJPGZ1bmN0aW9uIG5hbWU9ImxvY2FsIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9ImdlbmVyaWMtdm9pY2UiPgotCQk8a2V5d29yZCBuYW1lPSJtYWxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImZlbWFsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJjaGlsZCIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJtYXJnaW4td2lkdGgiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJwYWRkaW5nLXdpZHRoIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9InJlbGF0aXZlLXNpemUiPgotCQk8a2V5d29yZCBuYW1lPSJzbWFsbGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxhcmdlciIvPgotCTwvY29udGFpbmVyLWRlZj4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJzaGFwZSI+Ci0JCTxmdW5jdGlvbiBuYW1lPSJyZWN0Ii8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9InN5c3RlbS1jb2xvciI+Ci0JCTxrZXl3b3JkIG5hbWU9IkFjdGl2ZUJvcmRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJBY3RpdmVDYXB0aW9uIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IkFwcFdvcmtzcGFjZSIvPgotCQk8a2V5d29yZCBuYW1lPSJCYWNrZ3JvdW5kIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IkJ1dHRvbkZhY2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iQnV0dG9uSGlnaGxpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IkJ1dHRvblNoYWRvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJCdXR0b25UZXh0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IkNhcHRpb25UZXh0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IkdyYXlUZXh0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IkhpZ2hsaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJIaWdobGlnaHRUZXh0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IkluYWN0aXZlQm9yZGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IkluYWN0aXZlQ2FwdGlvbiIvPgotCQk8a2V5d29yZCBuYW1lPSJJbmFjdGl2ZUNhcHRpb25UZXh0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IkluZm9CYWNrZ3JvdW5kIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IkluZm9UZXh0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Ik1lbnUiLz4KLQkJPGtleXdvcmQgbmFtZT0iTWVudVRleHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iU2Nyb2xsYmFyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IlRocmVlRERhcmtTaGFkb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0iVGhyZWVERmFjZSIvPgotCQk8a2V5d29yZCBuYW1lPSJUaHJlZURIaWdobGlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iVGhyZWVETGlnaHRTaGFkb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0iVGhyZWVEU2hhZG93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IldpbmRvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJXaW5kb3dGcmFtZSIvPgotCQk8a2V5d29yZCBuYW1lPSJXaW5kb3dUZXh0Ii8+Ci0JPC9jb250YWluZXItZGVmPgotCi0JPCEtLSBjYXRlZ29yeSBkZWZpbml0aW9uIDogVGhpcyBpcyB1c2VkIHRvIGNhdGVnb3JpemUgcHJvcGVydGllcwotCWluIFByb3BlcnRpZXMgVmlldy4gLS0+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJhdXJhbCI+Ci0JCTxjYXB0aW9uPiVjc3MyLmNhdGVnb3J5LWRlZi5hdXJhbC5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0iYm94Ij4KLQkJPGNhcHRpb24+JWNzczIuY2F0ZWdvcnktZGVmLmJveC5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLQkJPGNhcHRpb24+JWNzczIuY2F0ZWdvcnktZGVmLmNvbG9yYW5kYmFja2dyb3VuZC5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0iY29udGVudCI+Ci0JCTxjYXB0aW9uPiVjc3MyLmNhdGVnb3J5LWRlZi5jb250ZW50LmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJmb250Ij4KLQkJPGNhcHRpb24+JWNzczIuY2F0ZWdvcnktZGVmLmZvbnQuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9InBhZ2UiPgotCQk8Y2FwdGlvbj4lY3NzMi5jYXRlZ29yeS1kZWYucGFnZS5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0idGFibGVzIj4KLQkJPGNhcHRpb24+JWNzczIuY2F0ZWdvcnktZGVmLnRhYmxlcy5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0idGV4dCI+Ci0JCTxjYXB0aW9uPiVjc3MyLmNhdGVnb3J5LWRlZi50ZXh0LmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJ1aSI+Ci0JCTxjYXB0aW9uPiVjc3MyLmNhdGVnb3J5LWRlZi51aS5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0idmlzdWFsIj4KLTwhLS0JCTxjYXB0aW9uPiVjc3MyLmNhdGVnb3J5LWRlZi52aXN1YWwuY2FwdGlvbjwvY2FwdGlvbj4tLT4KLQkJPGNhcHRpb24+JWNzczIuY2F0ZWdvcnktZGVmLnZpc3VhbC5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCQotCTwhLS0gZnVuY3Rpb24gZGVmaW5pdGlvbiAtLT4KLQk8ZnVuY3Rpb24tZGVmIG5hbWU9ImF0dHIiPgotCQk8ZnVuY3Rpb24tdmFsdWU+YXR0cjwvZnVuY3Rpb24tdmFsdWU+Ci0JPC9mdW5jdGlvbi1kZWY+Ci0JPGZ1bmN0aW9uLWRlZiBuYW1lPSJjb3VudGVyIj4KLQkJPGZ1bmN0aW9uLXZhbHVlPmNvdW50ZXI8L2Z1bmN0aW9uLXZhbHVlPgotCTwvZnVuY3Rpb24tZGVmPgotCTxmdW5jdGlvbi1kZWYgbmFtZT0icmVjdCI+Ci0JCTxmdW5jdGlvbi12YWx1ZT5yZWN0PC9mdW5jdGlvbi12YWx1ZT4KLQk8L2Z1bmN0aW9uLWRlZj4KLQk8ZnVuY3Rpb24tZGVmIG5hbWU9InJnYiI+Ci0JCTxmdW5jdGlvbi12YWx1ZT5yZ2I8L2Z1bmN0aW9uLXZhbHVlPgotCTwvZnVuY3Rpb24tZGVmPgotCTxmdW5jdGlvbi1kZWYgbmFtZT0idXJpIj4KLQkJPGZ1bmN0aW9uLXZhbHVlPnVybDwvZnVuY3Rpb24tdmFsdWU+Ci0JPC9mdW5jdGlvbi1kZWY+Ci0JPGZ1bmN0aW9uLWRlZiBuYW1lPSJmb3JtYXQiPgotCQk8ZnVuY3Rpb24tdmFsdWU+Zm9ybWF0PC9mdW5jdGlvbi12YWx1ZT4KLQk8L2Z1bmN0aW9uLWRlZj4KLQk8ZnVuY3Rpb24tZGVmIG5hbWU9ImxvY2FsIj4KLQkJPGZ1bmN0aW9uLXZhbHVlPmxvY2FsPC9mdW5jdGlvbi12YWx1ZT4KLQk8L2Z1bmN0aW9uLWRlZj4KLQotCTwhLS0gbnVtYmVyIGRlZmluaXRpb24gOiBXaGF0IHVuaXQgdHlwZXMgYmUgYWNjZXB0YWJsZSBmb3IgZWFjaAotCW51bWJlciB0eXBlPyAtLT4KLSAgICA8bnVtYmVyLWRlZiBuYW1lPSJhbmdsZSI+Ci0gICAgICAgIDx1bml0IG5hbWU9ImRlZyIvPgotICAgICAgICA8dW5pdCBuYW1lPSJncmFkIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9InJhZCIvPgotICAgIDwvbnVtYmVyLWRlZj4KLSAgICA8bnVtYmVyLWRlZiBuYW1lPSJmcmVxdWVuY3kiPgotICAgICAgICA8dW5pdCBuYW1lPSJoeiIvPgotICAgICAgICA8dW5pdCBuYW1lPSJraHoiLz4KLSAgICA8L251bWJlci1kZWY+Ci0gICAgPG51bWJlci1kZWYgbmFtZT0iaGFzaCI+Ci0gICAgICAgIDx1bml0IG5hbWU9Imhhc2giLz4KLSAgICA8L251bWJlci1kZWY+Ci0JPG51bWJlci1kZWYgbmFtZT0iaW50ZWdlciI+Ci0JPC9udW1iZXItZGVmPgotICAgIDxudW1iZXItZGVmIG5hbWU9Imxlbmd0aCI+Ci0gICAgICAgIDx1bml0IG5hbWU9ImVtIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9ImV4Ii8+Ci0gICAgICAgIDx1bml0IG5hbWU9InB4Ii8+Ci0gICAgICAgIDx1bml0IG5hbWU9ImluIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9ImNtIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9Im1tIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9InB0Ii8+Ci0gICAgICAgIDx1bml0IG5hbWU9InBjIi8+Ci0gICAgPC9udW1iZXItZGVmPgotCTxudW1iZXItZGVmIG5hbWU9Im51bWJlciI+Ci0JPC9udW1iZXItZGVmPgotCTxudW1iZXItZGVmIG5hbWU9InBlcmNlbnRhZ2UiPgotCQk8dW5pdCBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JPC9udW1iZXItZGVmPgotCTxudW1iZXItZGVmIG5hbWU9InRpbWUiPgotCQk8dW5pdCBuYW1lPSJtcyIvPgotCQk8dW5pdCBuYW1lPSJzIi8+Ci0JPC9udW1iZXItZGVmPgotCi0JPHVuaXQtZGVmIG5hbWU9ImNtIj4KLQkJPHVuaXQtdmFsdWU+Y208L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0iZGVnIj4KLQkJPHVuaXQtdmFsdWU+ZGVnPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9ImVtIj4KLQkJPHVuaXQtdmFsdWU+ZW08L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0iZXgiPgotCQk8dW5pdC12YWx1ZT5leDwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJncmFkIj4KLQkJPHVuaXQtdmFsdWU+Z3JhZDwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJoYXNoIj4KLQkJPHVuaXQtdmFsdWU+IzwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJoeiI+Ci0JCTx1bml0LXZhbHVlPkh6PC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9ImluIj4KLQkJPHVuaXQtdmFsdWU+aW48L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0ia2h6Ij4KLQkJPHVuaXQtdmFsdWU+a0h6PC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9Im1tIj4KLQkJPHVuaXQtdmFsdWU+bW08L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0ibXMiPgotCQk8dW5pdC12YWx1ZT5tczwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJwYyI+Ci0JCTx1bml0LXZhbHVlPnBjPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9InBlcmNlbnRhZ2UiPgotCQk8dW5pdC12YWx1ZT4lPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9InB0Ij4KLQkJPHVuaXQtdmFsdWU+cHQ8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0icHgiPgotCQk8dW5pdC12YWx1ZT5weDwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJyYWQiPgotCQk8dW5pdC12YWx1ZT5yYWQ8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0icyI+Ci0JCTx1bml0LXZhbHVlPnM8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQotICAgIDwhLS0ga2V5d29yZHMgOiBzdHJpbmcgY29uc3RhbnRzICh0aGlzIGlzIGxhc3QgcGFydC4uKSAtLT4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iMTAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+MTAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjIwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjIwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSIzMDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT4zMDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iNDAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+NDAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjUwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjUwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSI2MDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT42MDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iNzAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+NzAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjgwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjgwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSI5MDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT45MDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYWJvdmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5hYm92ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhYnNvbHV0ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmFic29sdXRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkFjdGl2ZUJvcmRlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkFjdGl2ZUJvcmRlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJBY3RpdmVDYXB0aW9uIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+QWN0aXZlQ2FwdGlvbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhbGwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5hbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYWx3YXlzIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YWx3YXlzPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkFwcFdvcmtzcGFjZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkFwcFdvcmtzcGFjZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhcXVhIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YXF1YTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhcm1lbmlhbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmFybWVuaWFuPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImF1dG8iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5hdXRvPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImF2b2lkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YXZvaWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iQmFja2dyb3VuZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkJhY2tncm91bmQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmFzZWxpbmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5iYXNlbGluZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJiZWhpbmQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5iZWhpbmQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmVsb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5iZWxvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJiaWRpLW92ZXJyaWRlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YmlkaS1vdmVycmlkZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJibGFjayI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJsYWNrPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJsaW5rIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ymxpbms8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmxvY2siPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ibG9jazwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJibHVlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ymx1ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJib2xkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ym9sZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJib2xkZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ib2xkZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYm90aCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJvdGg8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYm90dG9tIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ym90dG9tPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkJ1dHRvbkZhY2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5CdXR0b25GYWNlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkJ1dHRvbkhpZ2hsaWdodCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkJ1dHRvbkhpZ2hsaWdodDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJCdXR0b25TaGFkb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5CdXR0b25TaGFkb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iQnV0dG9uVGV4dCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkJ1dHRvblRleHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2FwaXRhbGl6ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNhcGl0YWxpemU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2FwdGlvbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNhcHRpb248L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iQ2FwdGlvblRleHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5DYXB0aW9uVGV4dDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjZW50ZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jZW50ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2VudGVyLWxlZnQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jZW50ZXItbGVmdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjZW50ZXItcmlnaHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jZW50ZXItcmlnaHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2hpbGQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jaGlsZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjaXJjbGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jaXJjbGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2prLWlkZW9ncmFwaGljIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2prLWlkZW9ncmFwaGljPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNsb3NlLXF1b3RlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2xvc2UtcXVvdGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY29kZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNvZGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY29uZGVuc2VkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y29uZGVuc2VkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNvbGxhcHNlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y29sbGFwc2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY29tcGFjdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNvbXBhY3Q8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY29udGludW91cyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNvbnRpbnVvdXM8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY3JvcCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNyb3A8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY3Jvc3MiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jcm9zczwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjcm9zc2hhaXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jcm9zc2hhaXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY3Vyc2l2ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmN1cnNpdmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZGFzaGVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZGFzaGVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRlY2ltYWwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kZWNpbWFsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRlY2ltYWwtbGVhZGluZy16ZXJvIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZGVjaW1hbC1sZWFkaW5nLXplcm88L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZGVmYXVsdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRlZmF1bHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZGlnaXRzIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZGlnaXRzPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRpc2MiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kaXNjPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRvdHRlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRvdHRlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkb3VibGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kb3VibGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZS1yZXNpemUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5lLXJlc2l6ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJlbWJlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmVtYmVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImV4cGFuZGVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZXhwYW5kZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZXh0cmEtY29uZGVuc2VkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZXh0cmEtY29uZGVuc2VkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImV4dHJhLWV4cGFuZGVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZXh0cmEtZXhwYW5kZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZmFudGFzeSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmZhbnRhc3k8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZmFyLWxlZnQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5mYXItbGVmdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmYXItcmlnaHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5mYXItcmlnaHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZmFzdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmZhc3Q8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZmFzdGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZmFzdGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImZlbWFsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmZlbWFsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmaXhlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmZpeGVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImZ1Y2hzaWEiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5mdWNoc2lhPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imdlb3JnaWFuIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Z2VvcmdpYW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZ3JheSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmdyYXk8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iR3JheVRleHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5HcmF5VGV4dDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJncmVlbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmdyZWVuPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imdyb292ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmdyb292ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJoZWJyZXciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5oZWJyZXc8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaGVscCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmhlbHA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaGlkZGVuIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aGlkZGVuPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImhpZGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5oaWRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImhpZ2giPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5oaWdoPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkhpZ2hsaWdodCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkhpZ2hsaWdodDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJIaWdobGlnaHRUZXh0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+SGlnaGxpZ2h0VGV4dDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJoaWdoZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5oaWdoZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaGlyYWdhbmEiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5oaXJhZ2FuYTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJoaXJhZ2FuYS1pcm9oYSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmhpcmFnYW5hLWlyb2hhPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imljb24iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5pY29uPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkluYWN0aXZlQm9yZGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+SW5hY3RpdmVCb3JkZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iSW5hY3RpdmVDYXB0aW9uIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+SW5hY3RpdmVDYXB0aW9uPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkluYWN0aXZlQ2FwdGlvblRleHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5JbmFjdGl2ZUNhcHRpb25UZXh0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkluZm9CYWNrZ3JvdW5kIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+SW5mb0JhY2tncm91bmQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iSW5mb1RleHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5JbmZvVGV4dDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpbmhlcml0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aW5oZXJpdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpbmxpbmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5pbmxpbmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaW5saW5lLXRhYmxlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aW5saW5lLXRhYmxlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imluc2V0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aW5zZXQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaW5zaWRlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aW5zaWRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImludmVydCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmludmVydDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpdGFsaWMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5pdGFsaWM8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ianVzdGlmeSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmp1c3RpZnk8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ia2F0YWthbmEiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5rYXRha2FuYTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJrYXRha2FuYS1pcm9oYSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmthdGFrYW5hLWlyb2hhPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxhbmRzY2FwZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxhbmRzY2FwZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsYXJnZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxhcmdlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxhcmdlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxhcmdlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsZWZ0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGVmdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsZWZ0LXNpZGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sZWZ0LXNpZGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGVmdHdhcmRzIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGVmdHdhcmRzPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxldmVsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGV2ZWw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGlnaHRlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxpZ2h0ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGltZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxpbWU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGluZS10aHJvdWdoIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGluZS10aHJvdWdoPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imxpc3QtaXRlbSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxpc3QtaXRlbTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsb3VkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bG91ZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG93ZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sb3dlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsb3dlci1hbHBoYSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxvd2VyLWFscGhhPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imxvd2VyLWdyZWVrIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bG93ZXItZ3JlZWs8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG93ZXItbGF0aW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sb3dlci1sYXRpbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsb3dlci1yb21hbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxvd2VyLXJvbWFuPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imxvd2VyY2FzZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxvd2VyY2FzZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsdHIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sdHI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWFsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm1hbGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWFya2VyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bWFya2VyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im1hcm9vbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm1hcm9vbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtZWRpdW0iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5tZWRpdW08L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iTWVudSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPk1lbnU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iTWVudVRleHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5NZW51VGV4dDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtZXNzYWdlLWJveCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm1lc3NhZ2UtYm94PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im1pZGRsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm1pZGRsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtaXgiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5taXg8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibW9ub3NwYWNlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bW9ub3NwYWNlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im1vdmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5tb3ZlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im4tcmVzaXplIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bi1yZXNpemU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibmFycm93ZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5uYXJyb3dlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJuYXZ5Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bmF2eTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJuZS1yZXNpemUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5uZS1yZXNpemU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibm8tY2xvc2UtcXVvdGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5uby1jbG9zZS1xdW90ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJuby1vcGVuLXF1b3RlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bm8tb3Blbi1xdW90ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJuby1yZXBlYXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5uby1yZXBlYXQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibm9uZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5vbmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibm9ybWFsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bm9ybWFsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im5vd3JhcCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5vd3JhcDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJudy1yZXNpemUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5udy1yZXNpemU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib2JsaXF1ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm9ibGlxdWU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib2xpdmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5vbGl2ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJvbmNlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+b25jZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJvcGVuLXF1b3RlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+b3Blbi1xdW90ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJvdXRzZXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5vdXRzZXQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib3V0c2lkZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm91dHNpZGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib3ZlcmxpbmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5vdmVybGluZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwb2ludGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cG9pbnRlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwb3J0cmFpdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnBvcnRyYWl0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InByZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnByZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwdXJwbGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5wdXJwbGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJlbGF0aXZlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmVsYXRpdmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmVwZWF0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmVwZWF0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJlcGVhdC14Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmVwZWF0LXg8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmVwZWF0LXkiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yZXBlYXQteTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyaWRnZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJpZGdlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJpZ2h0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmlnaHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmlnaHQtc2lkZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJpZ2h0LXNpZGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmlnaHR3YXJkcyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJpZ2h0d2FyZHM8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icnRsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cnRsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJ1bi1pbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJ1bi1pbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzLXJlc2l6ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnMtcmVzaXplPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNhbnMtc2VyaWYiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zYW5zLXNlcmlmPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNjcm9sbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNjcm9sbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJTY3JvbGxiYXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5TY3JvbGxiYXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2UtcmVzaXplIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2UtcmVzaXplPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNlbWktY29uZGVuc2VkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2VtaS1jb25kZW5zZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2VtaS1leHBhbmRlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNlbWktZXhwYW5kZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2VwYXJhdGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zZXBhcmF0ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzZXJpZiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNlcmlmPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNob3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zaG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNpbGVudCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNpbGVudDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzaWx2ZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zaWx2ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2xvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNsb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2xvd2VyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2xvd2VyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNtYWxsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c21hbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic21hbGwtY2FwcyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNtYWxsLWNhcHM8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic21hbGwtY2FwdGlvbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNtYWxsLWNhcHRpb248L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic21hbGxlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNtYWxsZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic29mdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNvZnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic29saWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zb2xpZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzcGVsbC1vdXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zcGVsbC1vdXQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3F1YXJlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c3F1YXJlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InN0YXRpYyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnN0YXRpYzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzdGF0dXMtYmFyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c3RhdHVzLWJhcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzdWIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zdWI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3VwZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zdXBlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzdy1yZXNpemUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zdy1yZXNpemU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGFibGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50YWJsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0YWJsZS1jYXB0aW9uIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGFibGUtY2FwdGlvbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0YWJsZS1jZWxsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGFibGUtY2VsbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0YWJsZS1jb2x1bW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50YWJsZS1jb2x1bW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGFibGUtY29sdW1uLWdyb3VwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGFibGUtY29sdW1uLWdyb3VwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRhYmxlLWZvb3Rlci1ncm91cCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRhYmxlLWZvb3Rlci1ncm91cDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0YWJsZS1oZWFkZXItZ3JvdXAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50YWJsZS1oZWFkZXItZ3JvdXA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGFibGUtcm93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGFibGUtcm93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRhYmxlLXJvdy1ncm91cCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRhYmxlLXJvdy1ncm91cDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0ZWFsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGVhbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0ZXh0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGV4dDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0ZXh0LXRvcCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRleHQtdG9wPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRleHQtYm90dG9tIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGV4dC1ib3R0b208L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGhpY2siPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50aGljazwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0aGluIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGhpbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJUaHJlZUREYXJrU2hhZG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+VGhyZWVERGFya1NoYWRvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJUaHJlZURGYWNlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+VGhyZWVERmFjZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJUaHJlZURIaWdobGlnaHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5UaHJlZURIaWdobGlnaHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iVGhyZWVETGlnaHRTaGFkb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5UaHJlZURMaWdodFNoYWRvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJUaHJlZURTaGFkb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5UaHJlZURTaGFkb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idG9wIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dG9wPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRyYW5zcGFyZW50Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dHJhbnNwYXJlbnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idWx0cmEtY29uZGVuc2VkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dWx0cmEtY29uZGVuc2VkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVsdHJhLWV4cGFuZGVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dWx0cmEtZXhwYW5kZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idW5kZXJsaW5lIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dW5kZXJsaW5lPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVwcGVyLWFscGhhIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dXBwZXItYWxwaGE8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idXBwZXItbGF0aW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT51cHBlci1sYXRpbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1cHBlci1yb21hbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVwcGVyLXJvbWFuPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVwcGVyY2FzZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVwcGVyY2FzZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ2aXNpYmxlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dmlzaWJsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ3LXJlc2l6ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnctcmVzaXplPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IndhaXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT53YWl0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IndoaXRlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+d2hpdGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0id2lkZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT53aWRlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJXaW5kb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5XaW5kb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iV2luZG93RnJhbWUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5XaW5kb3dGcmFtZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJXaW5kb3dUZXh0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+V2luZG93VGV4dDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4LWZhc3QiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54LWZhc3Q8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieC1oaWdoIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eC1oaWdoPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IngtbGFyZ2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54LWxhcmdlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IngtbG91ZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPngtbG91ZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4LWxvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPngtbG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Ingtc2xvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPngtc2xvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4LXNtYWxsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eC1zbWFsbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4LXNvZnQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54LXNvZnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieHgtc21hbGwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54eC1zbWFsbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4eC1sYXJnZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnh4LWxhcmdlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InllbGxvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnllbGxvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotPC9jc3MtcHJvZmlsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtbW9iaWxlMV8wLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS1tb2JpbGUxXzAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDVkNzYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS1tb2JpbGUxXzAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC0tPgotPCEtLTwhRE9DVFlQRSBjc3MtcHJvZmlsZSBTWVNURU0gImNzcy1wcm9maWxlLmR0ZCIgPi0tPgotPGNzcy1wcm9maWxlPgotCTxwcm9maWxlLWltcG9ydCBuYW1lPSJjc3Nwcm9maWxlLWNzczIueG1sIi8+Ci0JPHN0eWxlc2hlZXQtZGVmPgotCQk8ZGVzY3JpcHRpb24+JW1vYmlsZTFfMC5zdHlsZXNoZWV0LWRlZi5kZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0JCTxjaGFyc2V0LXJ1bGUvPgotCQk8aW1wb3J0LXJ1bGUvPgotCQk8bWVkaWEtcnVsZS8+Ci0JCTxzdHlsZS1ydWxlLz4KLQk8L3N0eWxlc2hlZXQtZGVmPgotCi0JPCEtLSBXaGljaCBwcm9wZXJ0aWVzIGNhbiBzdHlsZSBydWxlIGluY2x1ZGUgPyAtLT4KLQk8IS0tIHVzaW5nICJvdmVyd3JpdGUiIG1ldGhvZDogb25seSBkaXNhYmxlZCBwcm9wZXJ0aWVzIGFyZSB3cml0dGVuLiAtLT4KLQotCTxzdHlsZS1ydWxlLWRlZiBvdmVyd3JpdGU9InRydWUiPgotCQk8c2VsZWN0b3ItZXhwcmVzc2lvbiBuYW1lPSJjaGlsZCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHNlbGVjdG9yLWV4cHJlc3Npb24gbmFtZT0iYWRqYWNlbnQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxzZWxlY3Rvci1leHByZXNzaW9uIG5hbWU9ImF0dHJpYnV0ZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJmaXJzdC1jaGlsZCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJsaW5rIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9ImFjdGl2ZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJsYW5nIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYXppbXV0aCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1jb2xsYXBzZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zcGFjaW5nIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm90dG9tIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY2FwdGlvbi1zaWRlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY2xpcCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNvbnRlbnQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb3VudGVyLWluY3JlbWVudCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNvdW50ZXItcmVzZXQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjdWUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjdWUtYWZ0ZXIiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjdWUtYmVmb3JlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY3Vyc29yIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZGlyZWN0aW9uIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZWxldmF0aW9uIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZW1wdHktY2VsbHMiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXNpemUtYWRqdXN0IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zdHJldGNoIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGVmdCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImxldHRlci1zcGFjaW5nIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGluZS1oZWlnaHQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJrZXItb2Zmc2V0IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFya3MiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXgtaGVpZ2h0IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWF4LXdpZHRoIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWluLWhlaWdodCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1pbi13aWR0aCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im9ycGhhbnMiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZS1jb2xvciIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtc3R5bGUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lLXdpZHRoIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3ZlcmZsb3ciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWdlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFnZS1icmVhay1hZnRlciIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZ2UtYnJlYWstYmVmb3JlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFnZS1icmVhay1pbnNpZGUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYXVzZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhdXNlLWFmdGVyIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGF1c2UtYmVmb3JlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGl0Y2giIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwaXRjaC1yYW5nZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsYXktZHVyaW5nIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icG9zaXRpb24iIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJxdW90ZXMiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJyaWNobmVzcyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InJpZ2h0IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ic2l6ZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNwZWFrIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3BlYWstaGVhZGVyIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3BlYWstbnVtZXJhbCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNwZWFrLXB1bmN0dWF0aW9uIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3BlZWNoLXJhdGUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzdHJlc3MiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0YWJsZS1sYXlvdXQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZXh0LXNoYWRvdyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InRvcCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InVuaWNvZGUtYmlkaSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InZvaWNlLWZhbWlseSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InZvbHVtZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9IndpZG93cyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9IndvcmQtc3BhY2luZyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InotaW5kZXgiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JPC9zdHlsZS1ydWxlLWRlZj4KLQotCTwhLS0gcHJvcGVydHkgZGVmaW5pdGlvbiAtLT4KLQk8IS0tIHVzaW5nICJyZWRpZmluZSIgbWV0aG9kOiBpZiAib3ZlcndyaXRlIiBhdHRyaWJ1dGUgaXMgc2V0IHRvCi0JImZhbHNlIglvciBub3Qgc2V0LCBpdCBtZWFucyB0aGUgbm9kZSBpcyBjbGVhbmx5IHJlZGlmaW5lZCAtLT4KLQotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iYmFja2dyb3VuZC1hdHRhY2htZW50IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJzY3JvbGwiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgIDwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZGlzcGxheSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYWxsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGtleXdvcmQgbmFtZT0iaW5saW5lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJsb2NrIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxpc3QtaXRlbSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsaXN0LXN0eWxlLXR5cGUiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb250ZW50Ij4KLQkJPGtleXdvcmQgbmFtZT0iZGlzYyIvPgotCQk8a2V5d29yZCBuYW1lPSJjaXJjbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3F1YXJlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImRlY2ltYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItcm9tYW4iLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXItcm9tYW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItZ3JlZWsiLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXItYWxwaGEiLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXItYWxwaGEiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ0ZXh0LWFsaWduIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2VudGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imp1c3RpZnkiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1kZWNvcmF0aW9uIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJ1bmRlcmxpbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idmVydGljYWwtYWxpZ24iCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImJhc2VsaW5lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InN1YiIvPgotCQk8a2V5d29yZCBuYW1lPSJzdXBlciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0KLQk8IS0tIGNvbnRhaW5lciBkZWZpbml0aW9uIDogQ29udGFpbmVyIGlzIHRoZSBsdW1wIG9mIHZhbHVlcy4KLQlJdCBjYW4gYmUgdXNlZCBsaWtlIG1hY3Jvcy4gLS0+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0iY29sb3IiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0JCTxjb250YWluZXIgbmFtZT0ic3lzdGVtLWNvbG9yIiBlbmFibGVkPSJmYWxzZSIvPgotCTwvY29udGFpbmVyLWRlZj4KLTwvY3NzLXByb2ZpbGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLXdhcC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtd2FwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ0MDFjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtd2FwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAtLT4KLTwhLS08IURPQ1RZUEUgY3NzLXByb2ZpbGUgU1lTVEVNICJjc3MtcHJvZmlsZS5kdGQiID4tLT4KLTxjc3MtcHJvZmlsZT4KLSAgICAgICAgPHByb2ZpbGUtaW1wb3J0IG5hbWU9ImNzc3Byb2ZpbGUtY3NzMi54bWwiLz4KLSAgICAgICAgPHN0eWxlc2hlZXQtZGVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4ld2FwLnN0eWxlc2hlZXQtZGVmLmRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8Y2hhcnNldC1ydWxlLz4KLSAgICAgICAgICAgICAgICA8aW1wb3J0LXJ1bGUvPgotICAgICAgICAgICAgICAgIDxtZWRpYS1ydWxlLz4KLSAgICAgICAgICAgICAgICA8c3R5bGUtcnVsZS8+Ci0gICAgICAgIDwvc3R5bGVzaGVldC1kZWY+Ci0KLSAgICAgICAgPCEtLSBXaGljaCBwcm9wZXJ0aWVzIGNhbiBzdHlsZSBydWxlIGluY2x1ZGUgPyAtLT4KLSAgICAgICAgPCEtLSB1c2luZyAib3ZlcndyaXRlIiBtZXRob2Q6IG9ubHkgZGlzYWJsZWQgcHJvcGVydGllcyBhcmUgd3JpdHRlbi4gLS0+Ci0KLSAgICAgICAgPHN0eWxlLXJ1bGUtZGVmIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImF6aW11dGgiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvcmRlci1jb2xsYXBzZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXNwYWNpbmciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJvdHRvbSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2FwdGlvbi1zaWRlIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGlwIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjb250ZW50IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjdWUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImN1ZS1hZnRlciIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY3VlLWJlZm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY3Vyc29yIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkaXJlY3Rpb24iIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImVsZXZhdGlvbiIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZW1wdHktY2VsbHMiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvbnQtc2l6ZS1hZGp1c3QiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvbnQtc3RyZXRjaCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGVmdCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGV0dGVyLXNwYWNpbmciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxpbmUtaGVpZ2h0IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXJrZXItb2Zmc2V0IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXJrcyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4LWhlaWdodCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4LXdpZHRoIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtaW4taGVpZ2h0IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtaW4td2lkdGgiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9ycGhhbnMiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im91dGxpbmUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtY29sb3IiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtc3R5bGUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtd2lkdGgiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im92ZXJmbG93IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwYWdlIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWFmdGVyIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWJlZm9yZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGFnZS1icmVhay1pbnNpZGUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBhdXNlIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwYXVzZS1hZnRlciIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGF1c2UtYmVmb3JlIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwaXRjaCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGl0Y2gtcmFuZ2UiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBsYXktZHVyaW5nIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwb3NpdGlvbiIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icXVvdGVzIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyaWNobmVzcyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmlnaHQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNpemUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNwZWFrIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcGVhay1oZWFkZXIiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNwZWFrLW51bWVyYWwiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNwZWFrLXB1bmN0dWF0aW9uIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcGVlY2gtcmF0ZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3RyZXNzIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWJsZS1sYXlvdXQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRleHQtc2hhZG93IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b3AiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InVuaWNvZGUtYmlkaSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idm9pY2UtZmFtaWx5IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2b2x1bWUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IndpZG93cyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0id29yZC1zcGFjaW5nIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ6LWluZGV4IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSItd2FwLW1hcnF1ZWUtc3R5bGUiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iLXdhcC1tYXJxdWVlLWxvb3AiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iLXdhcC1tYXJxdWVlLWRpciIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSItd2FwLW1hcnF1ZWUtc3BlZWQiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iLXdhcC1hY2Nlc3NrZXkiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iLXdhcC1pbnB1dC1mb3JtYXQiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iLXdhcC1pbnB1dC1yZXF1aXJlZCIvPgotICAgICAgICA8L3N0eWxlLXJ1bGUtZGVmPgotCi0gICAgICAgIDwhLS0gcHJvcGVydHkgZGVmaW5pdGlvbiAtLT4KLSAgICAgICAgPCEtLSB1c2luZyAicmVkaWZpbmUiIG1ldGhvZDogaWYgIm92ZXJ3cml0ZSIgYXR0cmlidXRlIGlzIHNldCB0bwotICAgICAgICAiZmFsc2UiIG9yIG5vdCBzZXQsIGl0IG1lYW5zIHRoZSBub2RlIGlzIGNsZWFubHkgcmVkaWZpbmVkIC0tPgotCi0gICAgICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iZGlzcGxheSIKLSAgICAgICAgICAgICAgICBpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJhbGwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImlubGluZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImJsb2NrIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibGlzdC1pdGVtIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iLXdhcC1tYXJxdWVlIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotICAgICAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICAgICAgPHByb3BlcnR5LWRlZiBuYW1lPSJsaXN0LXN0eWxlLXR5cGUiCi0gICAgICAgICAgICAgICAgaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbnRlbnQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImRpc2MiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJjaXJjbGUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJzcXVhcmUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJkZWNpbWFsIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibG93ZXItcm9tYW4iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ1cHBlci1yb21hbiIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Imxvd2VyLWFscGhhIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0idXBwZXItYWxwaGEiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgICAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICAgICAgPHByb3BlcnR5LWRlZiBuYW1lPSJ0ZXh0LWFsaWduIgotICAgICAgICAgICAgICAgIGluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJjZW50ZXIiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJqdXN0aWZ5Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgICAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICAgICAgPHByb3BlcnR5LWRlZiBuYW1lPSJ0ZXh0LWRlY29yYXRpb24iCi0gICAgICAgICAgICAgICAgaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGV4dCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InVuZGVybGluZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImJsaW5rIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgICAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICAgICAgPHByb3BlcnR5LWRlZiBuYW1lPSJ2ZXJ0aWNhbC1hbGlnbiIKLSAgICAgICAgICAgICAgICBpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImJhc2VsaW5lIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ic3ViIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ic3VwZXIiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ0b3AiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJtaWRkbGUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJib3R0b20iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgICAgIDwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iLXdhcC1tYXJxdWVlLXN0eWxlIgotICAgICAgICAgICAgICAgIGluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9IndhcCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ic2Nyb2xsIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ic2xpZGUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJhbHRlcm5hdGUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgICAgIDwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iLXdhcC1tYXJxdWVlLWxvb3AiCi0gICAgICAgICAgICAgICAgaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0id2FwIj4KLSAgICAgICAgICAgICAgICA8bnVtYmVyIG5hbWU9ImludGVnZXIiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmZpbml0ZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICAgICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSItd2FwLW1hcnF1ZWUtZGlyIgotICAgICAgICAgICAgICAgIGluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9IndhcCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibHRyIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icnRsIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgICAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9Ii13YXAtbWFycXVlZS1zcGVlZCIKLSAgICAgICAgICAgICAgICBpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ3YXAiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InNsb3ciLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmYXN0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgICAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9Ii13YXAtYWNjZXNza2V5IgotICAgICAgICAgICAgICAgIGluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImludGVyYWN0aXZlIiBjYXRlZ29yeT0id2FwIj4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9ImtleWNvbWJpbmF0aW9uIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgICAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9Ii13YXAtaW5wdXQtZm9ybWF0IgotICAgICAgICAgICAgICAgIGluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImludGVyYWN0aXZlIiBjYXRlZ29yeT0id2FwIj4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9ImZvcm1hdCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICAgICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSItd2FwLWlucHV0LXJlcXVpcmVkIgotICAgICAgICAgICAgICAgIGluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImludGVyYWN0aXZlIiBjYXRlZ29yeT0id2FwIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgICAgIDwvcHJvcGVydHktZGVmPgotCi0gICAgICAgIDwhLS0gY29udGFpbmVyIGRlZmluaXRpb24gOiBDb250YWluZXIgaXMgdGhlIGx1bXAgb2YgdmFsdWVzLgotICAgICAgICBJdCBjYW4gYmUgdXNlZCBsaWtlIG1hY3Jvcy4gLS0+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9ImNvbG9yIiBvdmVyd3JpdGU9InRydWUiPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0ic3lzdGVtLWNvbG9yIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9ImZvcm1hdCI+Ci0gICAgICAgICAgICAgICAgPHN0cmluZyBuYW1lPSJhbnkiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJrZXljb21iaW5hdGlvbiI+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJrZXkiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSItIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0ia2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJzcGFjZSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0ic3BlY2lhbGtleSIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9InNwZWNpYWxrZXkiPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0ibW9kaWZpZXJrZXkiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9ImZ1bmN0aW9ua2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJuYXZpZ2F0aW9ua2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJlZGl0a2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJtaXNja2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJ2b2x1bWVjb250cm9sa2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJhcHBsaWNhdGlvbmtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0icGhvbmVrZXkiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9InZlbmRvcmtleSIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9Im1vZGlmaWVya2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJhY2Nlc3NrZXkiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9ImNtZGtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0ib3B0a2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJjdHJsa2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJzaGlmdGtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0iYWx0a2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJ3aW5rZXkiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9Im1ldGFrZXkiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmbiIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImZjbiIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImNhcHMiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJjbWRrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImNtZCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InJjbWQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJsY21kIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0ib3B0a2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJvcHQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJyb3B0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibG9wdCIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9ImN0cmxrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImN0cmwiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJyY3RybCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImxjdHJsIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0ic2hpZnRrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InNoaWZ0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icnNoaWZ0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibHNoaWZ0Ii8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0iYWx0a2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJhbHQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJyYWx0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibGFsdCIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9IndpbmtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0id2luIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icndpbiIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Imx3aW4iLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJtZXRha2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJtZXRhIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icm1ldGEiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJsbWV0YSIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9ImZ1bmN0aW9ua2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmMSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImYyIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjMiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmNCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImY1Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjYiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmNyIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImY4Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjkiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmMTAiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmMTEiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmMTIiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmMTMiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmMTQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmMTUiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJuYXZpZ2F0aW9ua2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ0YWIiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJlc2MiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJlbnRlciIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InJldHVybiIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Im1lbnUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJoZWxwIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibmFtZW1lbnUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJyY2wiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJzbmQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJhcnJvd2tleSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InBhZ2VrZXkiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJhcnJvd2tleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0idXAiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJkb3duIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0icGFnZWtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaG9tZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImVuZCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InBndXAiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJwZ2RuIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0iZWRpdGtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iYnMiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJkZWwiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJpbnMiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ1bmRvIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iY3V0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iY29weSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InBhc3RlIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iY2xyIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ic3RvIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0ibWlzY2tleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icHJ0c2MiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJzeXNycSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InNjcmxvY2siLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJwYXVzZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImJyayIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Im51bWxvY2siLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJwd3IiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJ2b2x1bWVjb250cm9sa2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ2b2x1bWV1cCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InZvbHVtZWRvd24iLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJhcHBsaWNhdGlvbmtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibWVtbyIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InRvZG8iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJjYWxlbmRhciIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Im1haWwiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJhZGRyZXNzIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0icGhvbmVrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InBob25lLXNlbmQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJwaG9uZS1lbmQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJwaG9uZS1hY2NlcHQiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJ2ZW5kb3JrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InZuZC4iLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotCi0gICAgICAgIDxjYXRlZ29yeS1kZWYgbmFtZT0id2FwIj4KLSAgICAgICAgICAgICAgICA8Y2FwdGlvbj4ld2FwLmNhdGVnb3J5LWRlZi53YXAuY2FwdGlvbjwvY2FwdGlvbj4KLSAgICAgICAgPC9jYXRlZ29yeS1kZWY+Ci0KLSAgICAgICAgPG51bWJlci1kZWYgbmFtZT0ibGVuZ3RoIj4KLSAgICAgICAgPHVuaXQgbmFtZT0iZW0iLz4KLSAgICAgICAgPHVuaXQgbmFtZT0iZXgiLz4KLSAgICAgICAgPHVuaXQgbmFtZT0icHgiLz4KLSAgICAgICAgPC9udW1iZXItZGVmPgotCi0gICAgPGtleXdvcmQtZGVmIG5hbWU9Ii13YXAtbWFycXVlZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPi13YXAtbWFycXVlZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2xpZGUiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnNsaWRlPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iYWx0ZXJuYXRlIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5hbHRlcm5hdGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpbmZpbml0ZSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+aW5maW5pdGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSItIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT4tPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3BhY2UiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnNwYWNlPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iYWNjZXNza2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5hY2Nlc3NrZXk8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmbiI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+Zm48L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmY24iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmZjbjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImNhcHMiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmNhcHM8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjbWQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmNtZDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InJjbWQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnJjbWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsY21kIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5sY21kPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ib3B0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5vcHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyb3B0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5yb3B0PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG9wdCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+bG9wdDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImN0cmwiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmN0cmw8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyY3RybCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cmN0cmw8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsY3RybCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+bGN0cmw8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzaGlmdCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+c2hpZnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyc2hpZnQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnJzaGlmdDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImxzaGlmdCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+bHNoaWZ0PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iYWx0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5hbHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyYWx0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5yYWx0PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGFsdCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+bGFsdDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9IndpbiI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+d2luPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icndpbiI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cndpbjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9Imx3aW4iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmx3aW48L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtZXRhIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5tZXRhPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icm1ldGEiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnJtZXRhPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG1ldGEiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmxtZXRhPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjEiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmYxPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjIiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmYyPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjMiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmYzPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmY0PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjUiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmY1PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjYiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmY2PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjciPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmY3PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjgiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmY4PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmY5PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjEwIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mMTA8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmMTEiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmYxMTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImYxMiI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZjEyPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjEzIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mMTM8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmMTQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmYxNDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImYxNSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZjE1PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0idGFiIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT50YWI8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJlc2MiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmVzYzwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImVudGVyIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5lbnRlcjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InJldHVybiI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cmV0dXJuPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ibmFtZW1lbnUiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPm5hbWVtZW51PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icmNsIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5yY2w8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzbmQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnNuZDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImFycm93a2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5hcnJvd2tleTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InBhZ2VrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnBhZ2VrZXk8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1cCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+dXA8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkb3duIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5kb3duPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iaG9tZSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+aG9tZTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImVuZCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZW5kPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icGd1cCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cGd1cDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InBnZG4iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnBnZG48L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJicyI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+YnM8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkZWwiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmRlbDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImlucyI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+aW5zPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0idW5kbyI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+dW5kbzwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImN1dCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+Y3V0PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iY29weSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+Y29weTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InBhc3RlIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5wYXN0ZTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImNsciI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2xyPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3RvIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5zdG88L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwcnRzYyI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cHJ0c2M8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzeXNycSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+c3lzcnE8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzY3Jsb2NrIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5zY3Jsb2NrPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iYnJrIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5icms8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJudW1sb2NrIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5udW1sb2NrPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icHdyIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5wd3I8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ2b2x1bWV1cCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+dm9sdW1ldXA8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ2b2x1bWVkb3duIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT52b2x1bWVkb3duPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWVtbyI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+bWVtbzwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InRvZG8iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnRvZG88L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjYWxlbmRhciI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2FsZW5kYXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtYWlsIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5tYWlsPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iYWRkcmVzcyI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+YWRkcmVzczwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InBob25lLXNlbmQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnBob25lLXNlbmQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwaG9uZS1lbmQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnBob25lLWVuZDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InBob25lLWFjY2VwdCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cGhvbmUtYWNjZXB0PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0idm5kLiI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+dm5kLjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InRydWUiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnRydWU8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZmFsc2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwYXVzZSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cGF1c2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0KLTwvY3NzLXByb2ZpbGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ3ZTM5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGNzc3Byb2ZpbGUtY3NzMS54bWwKLWNzczEuc3R5bGVzaGVldC1kZWYuZGVzY3JpcHRpb249Q2FzY2FkaW5nIFN0eWxlIFNoZWV0cywgbGV2ZWwgMQotY3NzMS5jYXRlZ29yeS1kZWYuYm94LmNhcHRpb249Qm94IG1vZGVsCi1jc3MxLmNhdGVnb3J5LWRlZi5jb2xvcmFuZGJhY2tncm91bmQuY2FwdGlvbj1Db2xvcnMgYW5kIEJhY2tncm91bmRzCi1jc3MxLmNhdGVnb3J5LWRlZi5jbGFzc2lmaWNhdGlvbi5jYXB0aW9uPUNsYXNzaWZpY2F0aW9uCi1jc3MxLmNhdGVnb3J5LWRlZi5mb250LmNhcHRpb249Rm9udAotY3NzMS5jYXRlZ29yeS1kZWYudGV4dC5jYXB0aW9uPVRleHQKLSMgY3NzcHJvZmlsZS1jc3MyLnhtbAotY3NzMi5zdHlsZXNoZWV0LWRlZi5kZXNjcmlwdGlvbj1DYXNjYWRpbmcgU3R5bGUgU2hlZXRzLCBsZXZlbCAyCi1jc3MyLmNhdGVnb3J5LWRlZi5hdXJhbC5jYXB0aW9uPUF1cmFsCi1jc3MyLmNhdGVnb3J5LWRlZi5ib3guY2FwdGlvbj1Cb3ggbW9kZWwKLWNzczIuY2F0ZWdvcnktZGVmLmNvbG9yYW5kYmFja2dyb3VuZC5jYXB0aW9uPUNvbG9ycyBhbmQgQmFja2dyb3VuZHMKLWNzczIuY2F0ZWdvcnktZGVmLmNvbnRlbnQuY2FwdGlvbj1HZW5lcmF0ZWQgY29udGVudC9MaXN0Ci1jc3MyLmNhdGVnb3J5LWRlZi5mb250LmNhcHRpb249Rm9udHMKLWNzczIuY2F0ZWdvcnktZGVmLnBhZ2UuY2FwdGlvbj1QYWdlZCBtZWRpYQotY3NzMi5jYXRlZ29yeS1kZWYudGFibGVzLmNhcHRpb249VGFibGVzCi1jc3MyLmNhdGVnb3J5LWRlZi50ZXh0LmNhcHRpb249VGV4dAotY3NzMi5jYXRlZ29yeS1kZWYudmlzdWFsLmNhcHRpb249VmlzdWFsCi1jc3MyLmNhdGVnb3J5LWRlZi51aS5jYXB0aW9uPVVzZXIgaW50ZXJmYWNlCi0jIGNzc3Byb2ZpbGUtbW9iaWxlMV8wLnhtbAotbW9iaWxlMV8wLnN0eWxlc2hlZXQtZGVmLmRlc2NyaXB0aW9uPUNTUyBNb2JpbGUgUHJvZmlsZSAxLjAKLSMgY3NzcHJvZmlsZS13YXAueG1sCi13YXAuc3R5bGVzaGVldC1kZWYuZGVzY3JpcHRpb249V0NTUyAxLjAKLXdhcC5jYXRlZ29yeS1kZWYud2FwLmNhcHRpb249V0NTUyBFeHRlbnNpb25zCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Rlc2NyaXB0aW9uLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvZGVzY3JpcHRpb24udHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjMxZjE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvZGVzY3JpcHRpb24udHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLQotICogTm9uZSBvZiB0aGUgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgCi0gKiBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQgCi0gKiBleGNlcHQgZm9yIGNzc3Byb2ZpbGUucHJvcGVydGllcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdmY2VjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1TdHJ1Y3R1cmVkIFNvdXJjZSBDU1MgTW9kZWwKLWNzc3Byb2ZpbGVfY3NzMi5uYW1lPUNTUzI6IENhc2NhZGluZyBTdHlsZSBTaGVldHMsIGxldmVsIDIKLWNzc3Byb2ZpbGVfY3NzMS5uYW1lPUNTUzE6IENhc2NhZGluZyBTdHlsZSBTaGVldHMsIGxldmVsIDEKLWNzc3Byb2ZpbGVfbW9iaWxlMV8wLm5hbWU9Q1NTIE1vYmlsZSBQcm9maWxlIDEuMAotY3NzcHJvZmlsZV93YXAubmFtZT1XQ1NTIDEuMAotU3RydWN0dXJlZF9DU1NfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZT1TdHJ1Y3R1cmVkIENTUyBEb2N1bWVudCBGYWN0b3J5IEV4dGVuc2lvbgotQ1NTX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUNTUwotX3Rhc2tNYXJrZXIubmFtZT1DU1MgVGFzawpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWI3YjY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jc3Nwcm9maWxlIj4KLQkJPHByb2ZpbGUKLQkJCW5hbWU9IiVjc3Nwcm9maWxlX2NzczIubmFtZSIKLQkJCWRlZmF1bHQ9InRydWUiCi0JCQl1cmk9ImNzc3Byb2ZpbGUvY3NzcHJvZmlsZS1jc3MyLnhtbCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3NzcHJvZmlsZS5jc3MyIj4KLQkJPC9wcm9maWxlPgotCQk8cHJvZmlsZQotCQkJbmFtZT0iJWNzc3Byb2ZpbGVfY3NzMS5uYW1lIgotCQkJdXJpPSJjc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtY3NzMS54bWwiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3Byb2ZpbGUuY3NzMSI+Ci0JCTwvcHJvZmlsZT4KLQkJPHByb2ZpbGUKLQkJCW5hbWU9IiVjc3Nwcm9maWxlX21vYmlsZTFfMC5uYW1lIgotCQkJdXJpPSJjc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtbW9iaWxlMV8wLnhtbCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3NzcHJvZmlsZS5tb2JpbGUxXzAiPgotCQk8L3Byb2ZpbGU+Ci0JCTxwcm9maWxlCi0JCQluYW1lPSIlY3NzcHJvZmlsZV93YXAubmFtZSIKLQkJCXVyaT0iY3NzcHJvZmlsZS9jc3Nwcm9maWxlLXdhcC54bWwiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3Byb2ZpbGUud2FwIj4KLQkJPC9wcm9maWxlPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsSGFuZGxlciI+Ci0JCTxtb2RlbEhhbmRsZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckNTUyIKLQkJCWFzc29jaWF0ZWRDb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIiPgotCQk8L21vZGVsSGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50YXNrc2Nhbm5lciI+Ci0JCTxzY2FubmVyCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRhc2tzLkNTU0ZpbGVUYXNrU2Nhbm5lciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGFza3MuQ1NTRmlsZVRhc2tTY2FubmVyOm9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50YXNrTWFya2VyIgotCQkJY29udGVudFR5cGVJZHM9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlpZD0idGFza01hcmtlciIKLQkJbmFtZT0iJV90YXNrTWFya2VyLm5hbWUiCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLQkJPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRhc2ttYXJrZXIiLz4KLQkJPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudGZhY3RvcmllcyIKLQkJbmFtZT0iJVN0cnVjdHVyZWRfQ1NTX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudGVhbS5jb3JlLmZpbGVUeXBlcyI+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249ImNzcyI+Ci0JCTwvZmlsZVR5cGVzPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdFByb2Nlc3NvcnMiPgotCQk8cHJvY2Vzc29yCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JDU1MiCi0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIj4KLQkJPC9wcm9jZXNzb3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJjc3MiCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVDU1NfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQlpZD0iY3Nzc291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUudGV4dCI+Ci0JCQk8ZGVzY3JpYmVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5Db250ZW50RGVzY3JpYmVyRm9yQ1NTIiAvPgotCQk8L2NvbnRlbnQtdHlwZT4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gaW5pdGlhbGl6ZSBjc3MgY29yZSBwcmVmZXJlbmNlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9DU1NDb3JlTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvQ1NTQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNzlhOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9DU1NDb3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IENTUyBDb3JlCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ1NTQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFlvdV9jYW5ub3RfdXNlX0NTU1N0eWxlU2hlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMWNvbmNhdF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzJjb25jYXRfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8zY29uY2F0X0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfNGNvbmNhdF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzI1Y29uY2F0X0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMjZjb25jYXRfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8yN2NvbmNhdF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzI4Y29uY2F0X0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfNWNvbmNhdF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzZjb25jYXRfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF83Y29uY2F0X0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfOGNvbmNhdF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9Qcm9ibGVtc19VcGRhdGluZzsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBDU1NDb3JlTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvQ1NTQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9DU1NDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OTJlZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9DU1NDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgQ1NTQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBDU1NDb3JlUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQ1NTQ29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBDU1NDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCi0JCS8vIGxpc3RlbiBmb3IgcmVzb3VyY2UgY2hhbmdlcyB0byB1cGRhdGUgY29udGVudCBwcm9wZXJ0aWVzIGtleXMKLQkJQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLnN0YXJ0dXAoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHN0b3AgbGlzdGVubmluZyBmb3IgcmVzb3VyY2UgY2hhbmdlcyB0byB1cGRhdGUgY29udGVudCBwcm9wZXJ0aWVzCi0JCS8vIGtleXMKLQkJQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLnNodXRkb3duKCk7Ci0KLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0NTU0NvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvQ1NTQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTcxY2Q2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvQ1NTQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotWW91X2Nhbm5vdF91c2VfQ1NTU3R5bGVTaGVfVUlfPVlvdSBjYW5ub3QgdXNlIENTU1N0eWxlU2hlZXQuZ2V0T3duZXJSdWxlKCkgYmVjYXVzZSBvZiBtYW55IHJlZmVyZW5jZXJzIG9mIHRoaXMgcnVsZVxuUGxlYXNlIHVzZSBnZXRPbndlclJ1bGVzKCkKLV8xY29uY2F0X0VSUk9SXz17MH1maXJzdCBmbGF0IG5vZGUgaXMgbnVsbC4KLV8yY29uY2F0X0VSUk9SXz17MH1maXJzdCBmbGF0IG5vZGUgaXMgbm90IGluIG1vZGVsLgotXzNjb25jYXRfRVJST1JfPXswfWxhc3QgZmxhdCBub2RlIGlzIG51bGwuCi1fNGNvbmNhdF9FUlJPUl89ezB9bGFzdCBmbGF0IG5vZGUgaXMgbm90IGluIG1vZGVsLgotXzI1Y29uY2F0X0VSUk9SXz17MH1maXJzdCByZWdpb24gaXMgbnVsbC4KLV8yNmNvbmNhdF9FUlJPUl89ezB9Zmlyc3QgcmVnaW9uIGlzIG5vdCBpbiBtb2RlbC4KLV8yN2NvbmNhdF9FUlJPUl89ezB9bGFzdCByZWdpb24gaXMgbnVsbC4KLV8yOGNvbmNhdF9FUlJPUl89ezB9bGFzdCByZWdpb24gaXMgbm90IGluIG1vZGVsLgotXzVjb25jYXRfRVJST1JfPXswfWZpcnN0IHJlZ2lvbiBpcyBudWxsLgotXzZjb25jYXRfRVJST1JfPXswfWZpcnN0IHJlZ2lvbiBpcyBub3QgaW4gbW9kZWwuCi1fN2NvbmNhdF9FUlJPUl89ezB9bGFzdCByZWdpb24gaXMgbnVsbC4KLV84Y29uY2F0X0VSUk9SXz17MH1sYXN0IHJlZ2lvbiBpcyBub3QgaW4gbW9kZWwuCi0jCi1DU1NDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmc9VXBkYXRpbmcgQ1NTIENvbnRlbnQgU2V0dGluZ3MKLUNTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9Qcm9ibGVtc19VcGRhdGluZz1Qcm9ibGVtIHNhdmluZyBDU1MgQ29udGVudCBTZXR0aW5ncyBmb3IgezB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJmZmRhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYKLSAqIGRlc2lyZWQsIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzCi0gKiBwbHVnaW4uIE90aGVyIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DU1NDbGVhbnVwU3RyYXRlZ3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DU1NDbGVhbnVwU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI2ZDg2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NsZWFudXAvQ1NTQ2xlYW51cFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU0NsZWFudXBTdHJhdGVneSB7Ci0KLQlzdGF0aWMgZmluYWwgc2hvcnQgQVNJUyA9IDA7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IExPV0VSID0gMTsKLQlzdGF0aWMgZmluYWwgc2hvcnQgVVBQRVIgPSAyOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXNob3J0IGdldElkZW50Q2FzZSgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXNob3J0IGdldFByb3BOYW1lQ2FzZSgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXNob3J0IGdldFByb3BWYWx1ZUNhc2UoKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlzaG9ydCBnZXRTZWxlY3RvclRhZ0Nhc2UoKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaXNGb3JtYXRTb3VyY2UoKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaXNRdW90ZVZhbHVlcygpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGZvcm1hdFNvdXJjZQotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXZvaWQgc2V0Rm9ybWF0U291cmNlKGJvb2xlYW4gZm9ybWF0U291cmNlKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBpZGVudENhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0Jdm9pZCBzZXRJZGVudENhc2Uoc2hvcnQgaWRlbnRDYXNlKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9wTmFtZUNhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0Jdm9pZCBzZXRQcm9wTmFtZUNhc2Uoc2hvcnQgcHJvcE5hbWVDYXNlKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9wVmFsdWVDYXNlCi0JICogICAgICAgICAgICBzaG9ydAotCSAqLwotCXZvaWQgc2V0UHJvcFZhbHVlQ2FzZShzaG9ydCBwcm9wVmFsdWVDYXNlKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBxdW90ZVZhbHVlcwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXZvaWQgc2V0UXVvdGVWYWx1ZXMoYm9vbGVhbiBxdW90ZVZhbHVlcyk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0b3JUYWdDYXNlCi0JICogICAgICAgICAgICBzaG9ydAotCSAqLwotCXZvaWQgc2V0U2VsZWN0b3JUYWdDYXNlKHNob3J0IHNlbGVjdG9yVGFnQ2FzZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NsZWFudXAvQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NTU0NsZWFudXBTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIxOTBmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NsZWFudXAvQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLQotCi0KLXB1YmxpYyBjbGFzcyBDU1NDbGVhbnVwU3RyYXRlZ3lJbXBsIGltcGxlbWVudHMgQ1NTQ2xlYW51cFN0cmF0ZWd5IHsKLQotCXN0YXRpYyBwcml2YXRlIENTU0NsZWFudXBTdHJhdGVneSBpbnN0YW5jZSA9IG51bGw7Ci0JLy8gaW5pdGlhbGl6ZSB3aXRoIGRlZmF1bHRzCi0JcHJvdGVjdGVkIHNob3J0IGZJZGVudENhc2UgPSBBU0lTOwotCXByb3RlY3RlZCBzaG9ydCBmUHJvcE5hbWVDYXNlID0gQVNJUzsKLQlwcm90ZWN0ZWQgc2hvcnQgZlByb3BWYWx1ZUNhc2UgPSBBU0lTOwotCXByb3RlY3RlZCBzaG9ydCBmU2VsZWN0b3JUYWdDYXNlID0gVVBQRVI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZlF1b3RlVmFsdWVzID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmRm9ybWF0U291cmNlID0gdHJ1ZTsKLQotCS8qKgotCSAqIENTU0NsZWFudXBTdHJhdGVneUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0SWRlbnRDYXNlKCkgewotCQlyZXR1cm4gZklkZW50Q2FzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENTU0NsZWFudXBTdHJhdGVneSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBDU1NDbGVhbnVwU3RyYXRlZ3lJbXBsKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldFByb3BOYW1lQ2FzZSgpIHsKLQkJcmV0dXJuIGZQcm9wTmFtZUNhc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRQcm9wVmFsdWVDYXNlKCkgewotCQlyZXR1cm4gZlByb3BWYWx1ZUNhc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRTZWxlY3RvclRhZ0Nhc2UoKSB7Ci0JCXJldHVybiBmU2VsZWN0b3JUYWdDYXNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWZJZGVudENhc2UgPSBnZXRDbGVhbnVwQ2FzZVZhbHVlKHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9JREVOVElGSUVSKSk7Ci0JCWZQcm9wTmFtZUNhc2UgPSBnZXRDbGVhbnVwQ2FzZVZhbHVlKHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9QUk9QRVJUWV9OQU1FKSk7Ci0JCWZQcm9wVmFsdWVDYXNlID0gZ2V0Q2xlYW51cENhc2VWYWx1ZShwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfUFJPUEVSVFlfVkFMVUUpKTsKLQkJZlNlbGVjdG9yVGFnQ2FzZSA9IGdldENsZWFudXBDYXNlVmFsdWUocHJlZnMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9DQVNFX1NFTEVDVE9SKSk7Ci0JCWZRdW90ZVZhbHVlcyA9IHByZWZzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUyk7Ci0JCWZGb3JtYXRTb3VyY2UgPSBwcmVmcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBDU1NDbGVhbnVwU3RyYXRlZ3kgZXF1aXZhbGVudCBjYXNlIHNob3J0IHZhbHVlIHdoZW4gZ2l2ZW4gYW4KLQkgKiBpbnQKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGVxdWl2YWxlbnQgY2FzZSBzaG9ydCBvciBBU0lTIGlmIGNhbm5vdCBiZSBkZXRlcm1pbmVkCi0JICovCi0JcHJpdmF0ZSBzaG9ydCBnZXRDbGVhbnVwQ2FzZVZhbHVlKGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIgOgotCQkJCXJldHVybiBMT1dFUjsKLQkJCWNhc2UgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUiA6Ci0JCQkJcmV0dXJuIFVQUEVSOwotCQl9Ci0JCXJldHVybiBBU0lTOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRm9ybWF0U291cmNlKCkgewotCQlyZXR1cm4gZkZvcm1hdFNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1F1b3RlVmFsdWVzKCkgewotCQlyZXR1cm4gZlF1b3RlVmFsdWVzOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBmb3JtYXRTb3VyY2UKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JtYXRTb3VyY2UoYm9vbGVhbiBmb3JtYXRTb3VyY2UpIHsKLQkJZkZvcm1hdFNvdXJjZSA9IGZvcm1hdFNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gaWRlbnRDYXNlCi0JICogICAgICAgICAgICBzaG9ydAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkZW50Q2FzZShzaG9ydCBpZGVudENhc2UpIHsKLQkJZklkZW50Q2FzZSA9IGlkZW50Q2FzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcE5hbWVDYXNlCi0JICogICAgICAgICAgICBzaG9ydAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BOYW1lQ2FzZShzaG9ydCBwcm9wTmFtZUNhc2UpIHsKLQkJZlByb3BOYW1lQ2FzZSA9IHByb3BOYW1lQ2FzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcFZhbHVlQ2FzZQotCSAqICAgICAgICAgICAgc2hvcnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wVmFsdWVDYXNlKHNob3J0IHByb3BWYWx1ZUNhc2UpIHsKLQkJZlByb3BWYWx1ZUNhc2UgPSBwcm9wVmFsdWVDYXNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBxdW90ZVZhbHVlcwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1b3RlVmFsdWVzKGJvb2xlYW4gcXVvdGVWYWx1ZXMpIHsKLQkJZlF1b3RlVmFsdWVzID0gcXVvdGVWYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHNlbGVjdG9yVGFnQ2FzZQotCSAqICAgICAgICAgICAgc2hvcnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RvclRhZ0Nhc2Uoc2hvcnQgc2VsZWN0b3JUYWdDYXNlKSB7Ci0JCWZTZWxlY3RvclRhZ0Nhc2UgPSBzZWxlY3RvclRhZ0Nhc2U7Ci0JfQotCi0JLy8gVE9ETzogYSBzYXZlT3B0aW9ucyBzaG91bGQgYmUgYWRkZWQgdG8gQ1NTQ2xlYW51cFN0cmF0ZWd5IGludGVyZmFjZQotCXB1YmxpYyB2b2lkIHNhdmVPcHRpb25zKCkgewotCQlDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9DQVNFX0lERU5USUZJRVIsIGZJZGVudENhc2UpOwotCQlDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9DQVNFX1BST1BFUlRZX05BTUUsIGZQcm9wTmFtZUNhc2UpOwotCQlDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9DQVNFX1BST1BFUlRZX1ZBTFVFLCBmUHJvcFZhbHVlQ2FzZSk7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfU0VMRUNUT1IsIGZTZWxlY3RvclRhZ0Nhc2UpOwotCQlDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMsIGZRdW90ZVZhbHVlcyk7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFLCBmRm9ybWF0U291cmNlKTsKLQkJQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NsZWFudXBQcm9jZXNzb3JDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DbGVhbnVwUHJvY2Vzc29yQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYWRmMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NsZWFudXBQcm9jZXNzb3JDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NGb3JtYXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkFic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQ2xlYW51cFByb2Nlc3NvckNTUyBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgewotCi0JcHVibGljIHZvaWQgY2xlYW51cE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJQ1NTRm9ybWF0VXRpbCBmb3JtYXRVdGlsID0gQ1NTRm9ybWF0VXRpbC5nZXRJbnN0YW5jZSgpOwotCQlpZiAoc3RydWN0dXJlZE1vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQlJQ1NTRG9jdW1lbnQgZG9jID0gKChJQ1NTTW9kZWwpIHN0cnVjdHVyZWRNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCUNTU1NvdXJjZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBkb2MpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IGZvcm1hdHRlci5jbGVhbnVwKGRvYyk7Ci0JCQlpZiAoYnVmICE9IG51bGwpIHsKLQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pIGRvYykuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgZW5kT2Zmc2V0ID0gKChJbmRleGVkUmVnaW9uKSBkb2MpLmdldEVuZE9mZnNldCgpOwotCQkJCWZvcm1hdFV0aWwucmVwbGFjZVNvdXJjZShkb2MuZ2V0TW9kZWwoKSwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LCBidWYudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoc3RydWN0dXJlZE1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQlMaXN0IGNzc25vZGVzID0gZm9ybWF0VXRpbC5jb2xsZWN0Q1NTTm9kZXMoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQkJCWlmIChjc3Nub2RlcyAhPSBudWxsICYmICFjc3Nub2Rlcy5pc0VtcHR5KCkpIHsKLQkJCQlJQ1NTTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3Nzbm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSUNTU05vZGUgbm9kZSA9IChJQ1NTTm9kZSkgY3Nzbm9kZXMuZ2V0KGkpOwotCQkJCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcigoSU5vZGVOb3RpZmllcikgbm9kZSk7Ci0JCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBmb3JtYXR0ZXIuY2xlYW51cChub2RlKTsKLQkJCQkJaWYgKGJ1ZiAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQlpbnQgZW5kT2Zmc2V0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCWlmIChtb2RlbCA9PSBudWxsKSB7Ci0JCQkJCQkJbW9kZWwgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQkJCQkJfQotCQkJCQkJZm9ybWF0VXRpbC5yZXBsYWNlU291cmNlKG1vZGVsLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsIGJ1Zi50b1N0cmluZygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDb250ZW50VHlwZUlkRm9yQ1NTLkNvbnRlbnRUeXBlSURfQ1NTOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlpbnQgc3RhcnQgPSAwOwotCQlpbnQgbGVuZ3RoID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpOwotCi0JCWNsZWFudXBNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBEb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gc2hvdWxkIGltcGxlbWVudCwgb3IgZGVsZXRlPwotCi0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIHNob3VsZCBpbXBsZW1lbnQsIG9yIGRlbGV0ZT8KLQotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGdldENsZWFudXBIYW5kbGVyKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZ2V0Rm9ybWF0UHJvY2Vzc29yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ2xlYW51cFByZWZlcmVuY2VzKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0lNZWRpYUdyb3VwSUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0lNZWRpYUdyb3VwSUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQwMmFjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9JTWVkaWFHcm91cElELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZWRpYUdyb3VwSUQgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9DT05USU5VT1VTID0gImNvbnRpbnVvdXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9QQUdFRCA9ICJwYWdlZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fVklTVUFMID0gInZpc3VhbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNX0FVUkFMID0gImF1cmFsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fVEFDVElMRSA9ICJ0YWN0aWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9HUklEID0gImdyaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9CSVRNQVAgPSAiYml0bWFwIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9JTlRFUkFDVElWRSA9ICJpbnRlcmFjdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNX1NUQVRJQyA9ICJzdGF0aWMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNX0FMTCA9ICJhbGwiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSVZhbElELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9JVmFsSUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ5YzFhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9JVmFsSUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxJRCB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWXzEwMCA9ICIxMDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl8yMDAgPSAiMjAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfMzAwID0gIjMwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWXzQwMCA9ICI0MDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl81MDAgPSAiNTAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfNjAwID0gIjYwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWXzcwMCA9ICI3MDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl84MDAgPSAiODAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfOTAwID0gIjkwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FCT1ZFID0gImFib3ZlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQUJTT0xVVEUgPSAiYWJzb2x1dGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BQ1RJVkVCT1JERVIgPSAiQWN0aXZlQm9yZGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQUNUSVZFQ0FQVElPTiA9ICJBY3RpdmVDYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQUxMID0gImFsbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FMV0FZUyA9ICJhbHdheXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BUFBXT1JLU1BBQ0UgPSAiQXBwV29ya3NwYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQVFVQSA9ICJhcXVhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQVJNRU5JQU4gPSAiYXJtZW5pYW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BVVRPID0gImF1dG8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BVk9JRCA9ICJhdm9pZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JBQ0tHUk9VTkQgPSAiQmFja2dyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JBU0VMSU5FID0gImJhc2VsaW5lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQkVISU5EID0gImJlaGluZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JFTE9XID0gImJlbG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQklESV9PVkVSUklERSA9ICJiaWRpLW92ZXJyaWRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQkxBQ0sgPSAiYmxhY2siOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CTElOSyA9ICJibGluayI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JMT0NLID0gImJsb2NrIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQkxVRSA9ICJibHVlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQk9MRCA9ICJib2xkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQk9MREVSID0gImJvbGRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JPVEggPSAiYm90aCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JPVFRPTSA9ICJib3R0b20iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CVVRUT05GQUNFID0gIkJ1dHRvbkZhY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CVVRUT05ISUdITElHSFQgPSAiQnV0dG9uSGlnaGxpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQlVUVE9OU0hBRE9XID0gIkJ1dHRvblNoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JVVFRPTlRFWFQgPSAiQnV0dG9uVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NBUElUQUxJWkUgPSAiY2FwaXRhbGl6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NBUFRJT04gPSAiY2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NBUFRJT05URVhUID0gIkNhcHRpb25UZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ0VOVEVSID0gImNlbnRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NFTlRFUl9MRUZUID0gImNlbnRlci1sZWZ0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ0VOVEVSX1JJR0hUID0gImNlbnRlci1yaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NISUxEID0gImNoaWxkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ0lSQ0xFID0gImNpcmNsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NKS19JREVPR1JBUEhJQyA9ICJjamstaWRlb2dyYXBoaWMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DTE9TRV9RVU9URSA9ICJjbG9zZS1xdW90ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NPREUgPSAiY29kZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NPTkRFTlNFRCA9ICJjb25kZW5zZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DT0xMQVBTRSA9ICJjb2xsYXBzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NPTVBBQ1QgPSAiY29tcGFjdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NPTlRJTlVPVVMgPSAiY29udGludW91cyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NST1AgPSAiY3JvcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NST1NTID0gImNyb3NzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ1JPU1NIQUlSID0gImNyb3NzaGFpciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NVUlNJVkUgPSAiY3Vyc2l2ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0RBU0hFRCA9ICJkYXNoZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ERUNJTUFMID0gImRlY2ltYWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ERUNJTUFMX0xFQURJTkdfWkVSTyA9ICJkZWNpbWFsLWxlYWRpbmctemVybyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0RFRkFVTFQgPSAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0RJR0lUUyA9ICJkaWdpdHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ESVNDID0gImRpc2MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ET1RURUQgPSAiZG90dGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRE9VQkxFID0gImRvdWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0VfUkVTSVpFID0gImUtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRU1CRUQgPSAiZW1iZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9FWFBBTkRFRCA9ICJleHBhbmRlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0VYVFJBX0NPTkRFTlNFRCA9ICJleHRyYS1jb25kZW5zZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9FWFRSQV9FWFBBTkRFRCA9ICJleHRyYS1leHBhbmRlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0ZBTlRBU1kgPSAiZmFudGFzeSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0ZBUl9MRUZUID0gImZhci1sZWZ0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRkFSX1JJR0hUID0gImZhci1yaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0ZBU1QgPSAiZmFzdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0ZBU1RFUiA9ICJmYXN0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9GRU1BTEUgPSAiZmVtYWxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRklYRUQgPSAiZml4ZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9GVUNIU0lBID0gImZ1Y2hzaWEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9HRU9SR0lBTiA9ICJnZW9yZ2lhbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0dSQVkgPSAiZ3JheSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0dSQVlURVhUID0gIkdyYXlUZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfR1JFRU4gPSAiZ3JlZW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9HUk9PVkUgPSAiZ3Jvb3ZlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSEVCUkVXID0gImhlYnJldyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hFTFAgPSAiaGVscCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hJRERFTiA9ICJoaWRkZW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ISURFID0gImhpZGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ISUdIID0gImhpZ2giOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ISUdITElHSFQgPSAiSGlnaGxpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSElHSExJR0hUVEVYVCA9ICJIaWdobGlnaHRUZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSElHSEVSID0gImhpZ2hlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hJUkFHQU5BID0gImhpcmFnYW5hIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSElSQUdBTkFfSVJPSEEgPSAiaGlyYWdhbmEtaXJvaGEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JQ09OID0gImljb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTkFDVElWRUJPUkRFUiA9ICJJbmFjdGl2ZUJvcmRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lOQUNUSVZFQ0FQVElPTiA9ICJJbmFjdGl2ZUNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTkFDVElWRUNBUFRJT05URVhUID0gIkluYWN0aXZlQ2FwdGlvblRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTkZPQkFDS0dST1VORCA9ICJJbmZvQmFja2dyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lORk9URVhUID0gIkluZm9UZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5MSU5FID0gImlubGluZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lOTElORV9UQUJMRSA9ICJpbmxpbmUtdGFibGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTlNFVCA9ICJpbnNldCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lOU0lERSA9ICJpbnNpZGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTlZFUlQgPSAiaW52ZXJ0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSVRBTElDID0gIml0YWxpYyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0pVU1RJRlkgPSAianVzdGlmeSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0tBVEFLQU5BID0gImthdGFrYW5hIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfS0FUQUtBTkFfSVJPSEEgPSAia2F0YWthbmEtaXJvaGEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MQU5EU0NBUEUgPSAibGFuZHNjYXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTEFSR0UgPSAibGFyZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MQVJHRVIgPSAibGFyZ2VyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTEVGVCA9ICJsZWZ0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTEVGVF9TSURFID0gImxlZnQtc2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xFRlRXQVJEUyA9ICJsZWZ0d2FyZHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MRVZFTCA9ICJsZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xJR0hURVIgPSAibGlnaHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xJTUUgPSAibGltZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xJTkVfVEhST1VHSCA9ICJsaW5lLXRocm91Z2giOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MSVNUX0lURU0gPSAibGlzdC1pdGVtIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTE9VRCA9ICJsb3VkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTE9XID0gImxvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xPV0VSID0gImxvd2VyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTE9XRVJfQUxQSEEgPSAibG93ZXItYWxwaGEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MT1dFUl9HUkVFSyA9ICJsb3dlci1ncmVlayI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xPV0VSX0xBVElOID0gImxvd2VyLWxhdGluIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTE9XRVJfUk9NQU4gPSAibG93ZXItcm9tYW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MT1dFUkNBU0UgPSAibG93ZXJjYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTFRSID0gImx0ciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01BTEUgPSAibWFsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01BUktFUiA9ICJtYXJrZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NQVJPT04gPSAibWFyb29uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTUVESVVNID0gIm1lZGl1bSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01FTlUgPSAibWVudSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01FTlVURVhUID0gIk1lbnVUZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTUVTU0FHRV9CT1ggPSAibWVzc2FnZS1ib3giOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NSURETEUgPSAibWlkZGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTUlYID0gIm1peCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01PTk9TUEFDRSA9ICJtb25vc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NT1ZFID0gIm1vdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OX1JFU0laRSA9ICJuLXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05BUlJPV0VSID0gIm5hcnJvd2VyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTkFWWSA9ICJuYXZ5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTkVfUkVTSVpFID0gIm5lLXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05PX0NMT1NFX1FVT1RFID0gIm5vLWNsb3NlLXF1b3RlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTk9fT1BFTl9RVU9URSA9ICJuby1vcGVuLXF1b3RlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTk9fUkVQRUFUID0gIm5vLXJlcGVhdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05PTkUgPSAibm9uZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05PUk1BTCA9ICJub3JtYWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OT1dSQVAgPSAibm93cmFwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTldfUkVTSVpFID0gIm53LXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX09CTElRVUUgPSAib2JsaXF1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX09MSVZFID0gIm9saXZlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfT05DRSA9ICJvbmNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfT1BFTl9RVU9URSA9ICJvcGVuLXF1b3RlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfT1VUU0VUID0gIm91dHNldCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX09VVFNJREUgPSAib3V0c2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX09WRVJMSU5FID0gIm92ZXJsaW5lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUE9JTlRFUiA9ICJwb2ludGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUE9SVFJBSVQgPSAicG9ydHJhaXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9QUkUgPSAicHJlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUFVSUExFID0gInB1cnBsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JFRCA9ICJyZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SRUxBVElWRSA9ICJyZWxhdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JFUEVBVCA9ICJyZXBlYXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SRVBFQVRfWCA9ICJyZXBlYXQteCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JFUEVBVF9ZID0gInJlcGVhdC15IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUklER0UgPSAicmlkZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SSUdIVCA9ICJyaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JJR0hUX1NJREUgPSAicmlnaHQtc2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JJR0hUV0FSRFMgPSAicmlnaHR3YXJkcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JUTCA9ICJydGwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SVU5fSU4gPSAicnVuLWluIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU19SRVNJWkUgPSAicy1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TQU5TX1NFUklGID0gInNhbnMtc2VyaWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TQ1JPTEwgPSAic2Nyb2xsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0NST0xMQkFSID0gIlNjcm9sbGJhciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NFX1JFU0laRSA9ICJzZS1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TRU1JX0NPTkRFTlNFRCA9ICJzZW1pLWNvbmRlbnNlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NFTUlfRVhQQU5ERUQgPSAic2VtaS1leHBhbmRlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NFUEFSQVRFID0gInNlcGFyYXRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0VSSUYgPSAic2VyaWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TSE9XID0gInNob3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TSUxFTlQgPSAic2lsZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0lMVkVSID0gInNpbHZlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NMT1cgPSAic2xvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NMT1dFUiA9ICJzbG93ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TTUFMTCA9ICJzbWFsbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NNQUxMX0NBUFMgPSAic21hbGwtY2FwcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NNQUxMX0NBUFRJT04gPSAic21hbGwtY2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NNQUxMRVIgPSAic21hbGxlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NPRlQgPSAic29mdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NPTElEID0gInNvbGlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU1BFTExfT1VUID0gInNwZWxsLW91dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NRVUFSRSA9ICJzcXVhcmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TVEFUSUMgPSAic3RhdGljIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU1RBVFVTX0JBUiA9ICJzdGF0dXMtYmFyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU1VCID0gInN1YiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NVUEVSID0gInN1cGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU1dfUkVTSVpFID0gInN3LXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RBQkxFID0gInRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEFCTEVfQ0FQVElPTiA9ICJ0YWJsZS1jYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEFCTEVfQ0VMTCA9ICJ0YWJsZS1jZWxsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEFCTEVfQ09MVU1OID0gInRhYmxlLWNvbHVtbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RBQkxFX0NPTFVNTl9HUk9VUCA9ICJ0YWJsZS1jb2x1bW4tZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UQUJMRV9GT09URVJfR1JPVVAgPSAidGFibGUtZm9vdGVyLWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEFCTEVfSEVBREVSX0dST1VQID0gInRhYmxlLWhlYWRlci1ncm91cCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RBQkxFX1JPVyA9ICJ0YWJsZS1yb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UQUJMRV9ST1dfR1JPVVAgPSAidGFibGUtcm93LWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEVBTCA9ICJ0ZWFsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEVYVCA9ICJ0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEVYVF9UT1AgPSAidGV4dC10b3AiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9URVhUX0JPVFRPTSA9ICJ0ZXh0LWJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RISUNLID0gInRoaWNrIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEhJTiA9ICJ0aGluIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEhSRUVEREFSS1NIQURPVyA9ICJUaHJlZUREYXJrU2hhZG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEhSRUVERkFDRSA9ICJUaHJlZURGYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEhSRUVESElHSExJR0hUID0gIlRocmVlREhpZ2hsaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RIUkVFRExJR0hUU0hBRE9XID0gIlRocmVlRExpZ2h0U2hhZG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEhSRUVEU0hBRE9XID0gIlRocmVlRFNoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RPUCA9ICJ0b3AiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UUkFOU1BBUkVOVCA9ICJ0cmFuc3BhcmVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1VMVFJBX0NPTkRFTlNFRCA9ICJ1bHRyYS1jb25kZW5zZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9VTFRSQV9FWFBBTkRFRCA9ICJ1bHRyYS1leHBhbmRlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1VOREVSTElORSA9ICJ1bmRlcmxpbmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9VUFBFUl9BTFBIQSA9ICJ1cHBlci1hbHBoYSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1VQUEVSX0xBVElOID0gInVwcGVyLWxhdGluIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVVBQRVJfUk9NQU4gPSAidXBwZXItcm9tYW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9VUFBFUkNBU0UgPSAidXBwZXJjYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVklTSUJMRSA9ICJ2aXNpYmxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfV19SRVNJWkUgPSAidy1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9XQUlUID0gIndhaXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9XSElURSA9ICJ3aGl0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1dJREVSID0gIndpZGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfV0lORE9XID0gIldpbmRvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1dJTkRPV0ZSQU1FID0gIldpbmRvd0ZyYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfV0lORE9XVEVYVCA9ICJXaW5kb3dUZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWF9GQVNUID0gIngtZmFzdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1hfSElHSCA9ICJ4LWhpZ2giOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YX0xBUkdFID0gIngtbGFyZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YX0xPVUQgPSAieC1sb3VkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWF9MT1cgPSAieC1sb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YX1NMT1cgPSAieC1zbG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWF9TTUFMTCA9ICJ4LXNtYWxsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWF9TT0ZUID0gIngtc29mdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1hYX1NNQUxMID0gInh4LXNtYWxsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWFhfTEFSR0UgPSAieHgtbGFyZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ZRUxMT1cgPSAieWVsbG93IjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMTNmN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcENNQ29udGFpbmVyIGV4dGVuZHMgUHJvcENNTm9kZSB7Ci0KLQlwcml2YXRlIGphdmEudXRpbC5WZWN0b3Igbm9kZXMgPSBuZXcgVmVjdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9BQlNPTFVURV9TSVpFID0gImFic29sdXRlLXNpemUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfQk9SREVSX1NUWUxFID0gImJvcmRlci1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9CT1JERVJfV0lEVEggPSAiYm9yZGVyLXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX0NPTE9SID0gImNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX1NZU1RFTV9DT0xPUiA9ICJzeXN0ZW0tY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfR0VORVJJQ19GQU1JTFkgPSAiZ2VuZXJpYy1mYW1pbHkiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfR0VORVJJQ19WT0lDRSA9ICJnZW5lcmljLXZvaWNlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX01BUkdJTl9XSURUSCA9ICJtYXJnaW4td2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfUEFERElOR19XSURUSCA9ICJwYWRkaW5nLXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX1JFTEFUSVZFX1NJWkUgPSAicmVsYXRpdmUtc2l6ZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFByb3BDTUNvbnRhaW5lcihTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlPYmplY3QgYXBwZW5kQ2hpbGQoT2JqZWN0IG5vZGUpIHsKLQkJaWYgKCFub2Rlcy5jb250YWlucyhub2RlKSkKLQkJCW5vZGVzLmFkZChub2RlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuSGF2ZShTdHJpbmcgaWRlbnRpZmllcikgewotCQlpbnQgbkNoaWxkID0gZ2V0TnVtQ2hpbGQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hpbGQ7IGkrKykgewotCQkJT2JqZWN0IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIFN0cmluZyAmJiBpZGVudGlmaWVyLmVxdWFsc0lnbm9yZUNhc2UoKFN0cmluZykgY2hpbGQpKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgUHJvcENNQ29udGFpbmVyICYmICgoUHJvcENNQ29udGFpbmVyKSBjaGlsZCkuY2FuSGF2ZShpZGVudGlmaWVyKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDaGlsZEF0KGludCBpbmRleCkgewotCQlpZiAobm9kZXMgPT0gbnVsbCB8fCBpbmRleCA8IDAgfHwgbm9kZXMuc2l6ZSgpIDw9IGluZGV4KQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBub2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBQcm9wQ01Db250YWluZXIgZ2V0Q29udEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGluaXRpYWxpemUKLQkJaWYgKGluc3RhbmNlcyA9PSBudWxsKQotCQkJaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgyMCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIHF1ZXJ5Ci0JCU9iamVjdCBub2RlID0gaW5zdGFuY2VzLmdldChuYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoUHJvcENNQ29udGFpbmVyKSBub2RlOwotCi0JCWlmIChQcm9wQ01Ob2RlLmlzTG9hZGluZygpKSB7Ci0JCQkvLyByZWdpc3RlcgotCQkJbm9kZSA9IG5ldyBQcm9wQ01Db250YWluZXIobmFtZSk7Ci0JCQlpbnN0YW5jZXMucHV0KG5hbWUsIG5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIChQcm9wQ01Db250YWluZXIpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRJZGVudGlmaWVycyhTZXQgaWRlbnRzKSB7Ci0JCWlmIChpZGVudHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IG5DaGlsZHJlbiA9IG5vZGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hpbGRyZW47IGkrKykgewotCQkJT2JqZWN0IG5vZGUgPSBub2Rlcy5lbGVtZW50QXQoaSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFByb3BDTU5vZGUpCi0JCQkJKChQcm9wQ01Ob2RlKSBub2RlKS5nZXRJZGVudGlmaWVycyhpZGVudHMpOwotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFN0cmluZykKLQkJCQlpZGVudHMuYWRkKG5vZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXROdW1DaGlsZCgpIHsKLQkJaWYgKG5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIG5vZGVzLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9DT05UQUlORVI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRWYWx1ZXMoQ29sbGVjdGlvbiB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbkNoaWxkcmVuID0gbm9kZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5DaGlsZHJlbjsgaSsrKSB7Ci0JCQlPYmplY3Qgbm9kZSA9IG5vZGVzLmVsZW1lbnRBdChpKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgUHJvcENNTm9kZSkKLQkJCQkoKFByb3BDTU5vZGUpIG5vZGUpLmdldFZhbHVlcyh2YWx1ZXMpOwotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCWlmICghdmFsdWVzLmNvbnRhaW5zKG5vZGUpKQotCQkJCQl2YWx1ZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JT2JqZWN0IHJlbW92ZUNoaWxkKE9iamVjdCBub2RlKSB7Ci0JCW5vZGVzLnJlbW92ZShub2RlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTUZvbnRQcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNRm9udFByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOGUyMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNRm9udFByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcENNRm9udFByb3BlcnR5IGV4dGVuZHMgUHJvcENNUHJvcGVydHkgewotCi0JLy8gc3RhdGljIGZpZWxkcwotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgaW5zdGFuY2VzID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGNhY2hlZElkTWFwID0gbnVsbDsKLQkvLyBzZWxlY3RpbmcgcHJvcGVydGllcwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0ZPTlRfRkFNSUxZID0gImZvbnQtZmFtaWx5IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfRk9OVF9TVFlMRSA9ICJmb250LXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfRk9OVF9WQVJJQU5UID0gImZvbnQtdmFyaWFudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0ZPTlRfV0VJR0hUID0gImZvbnQtd2VpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfRk9OVF9TVFJFVENIID0gImZvbnQtc3RyZXRjaCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0ZPTlRfU0laRSA9ICJmb250LXNpemUiOy8vJE5PTi1OTFMtMSQKLQkvLyBxdWFsaWZpY2F0aW9uIHByb3BlcnRpZXMKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9VTklDT0RFX1JBTkdFID0gInVuaWNvZGUtcmFuZ2UiOy8vJE5PTi1OTFMtMSQKLQkvLyBudW1lcmljIHByb3BlcnRpZXMKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9VTklUU19QRVJfRU0gPSAidW5pdHMtcGVyLWVtIjsvLyROT04tTkxTLTEkCi0JLy8gcmVmZXJlbmNpbmcgcHJvcGVydGllcwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1NSQyA9ICJzcmMiOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXRjaGluZyBwcm9wZXJ0aWVzCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfUEFOT1NFXzEgPSAicGFub3NlLTEiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9TVEVNViA9ICJzdGVtdiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1NURU1IID0gInN0ZW1oIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfU0xPUEUgPSAic2xvcGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9DQVBfSEVJR0hUID0gImNhcC1oZWlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9YX0hFSUdIVCA9ICJ4LWhlaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0FTQ0VOVCA9ICJhc2NlbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9ERVNDRU5UID0gImRlc2NlbnQiOy8vJE5PTi1OTFMtMSQKLQkvLyBzeW50aGVzaXMgcHJvcGVydGllcwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1dJRFRIUyA9ICJ3aWR0aHMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9CQk9YID0gImJib3giOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9ERUZJTklUSU9OX1NSQyA9ICJkZWZpbml0aW9uLXNyYyI7Ly8kTk9OLU5MUy0xJAotCS8vIGFsaWdubWVudCBwcm9wZXJ0aWVzCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfQkFTRUxJTkUgPSAiYmFzZWxpbmUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9DRU5URVJMSU5FID0gImNlbnRlcmxpbmUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9NQVRITElORSA9ICJtYXRobGluZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1RPUExJTkUgPSAidG9wbGluZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFByb3BDTUZvbnRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BDTVByb3BlcnR5IGdldEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJLy8gaW5pdGlhbGl6ZQotCQlpZiAoaW5zdGFuY2VzID09IG51bGwpCi0JCQlpbnN0YW5jZXMgPSBuZXcgSGFzaHRhYmxlKDEwKTsKLQotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJLy8gcXVlcnkKLQkJT2JqZWN0IG5vZGUgPSBpbnN0YW5jZXMuZ2V0KG5hbWUpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIChQcm9wQ01Qcm9wZXJ0eSkgbm9kZTsKLQotCQkvLyByZWdpc3RlcgotCQlpZiAoUHJvcENNTm9kZS5pc0xvYWRpbmcoKSkgewotCQkJbm9kZSA9IG5ldyBQcm9wQ01Gb250UHJvcGVydHkobmFtZSk7Ci0JCQlpbnN0YW5jZXMucHV0KG5hbWUsIG5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIChQcm9wQ01Qcm9wZXJ0eSkgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudW1lcmF0aW9uIGdldE5hbWVFbnVtKCkgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJcmV0dXJuIGluc3RhbmNlcy5rZXlzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnVtZXJhdGlvbiBnZXRQcm9wZXJ0eUVudW0oKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gaW5zdGFuY2VzLmVsZW1lbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBWQUxfRk9OVFBST1BFUlRZOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmVjdG9yIG5hbWVzKCkgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJcmV0dXJuIG5ldyBWZWN0b3IoaW5zdGFuY2VzLmtleVNldCgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgbmFtZXMoT2JqZWN0IG1lZGlhR3JvdXApIHsKLQkJaWYgKG1lZGlhR3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybiBuYW1lcygpOwotCi0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlWZWN0b3IgcHJvcGVydGllcyA9IG5ldyBWZWN0b3IoKTsKLQotCQlJdGVyYXRvciBpdCA9IGluc3RhbmNlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wID0gKFByb3BDTVByb3BlcnR5KSBpdC5uZXh0KCk7Ci0JCQlpZiAocHJvcC5nZXRNZWRpYUdyb3VwcygpLmNvbnRhaW5zKG1lZGlhR3JvdXApKQotCQkJCXByb3BlcnRpZXMuYWRkKHByb3AuZ2V0TmFtZSgpKTsKLQkJfQotCi0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIElmIGl0ZW50aWZpZXIgaXMgbnVsbCwgZ2V0IGFsbCBwcm9wZXJ0aWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBWZWN0b3IgcHJvcGVydGllc0ZvcihTdHJpbmcgaWRlbnRpZmllciwgYm9vbGVhbiBzaG9ydGhhbmRzKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQkvLyBpZiBpZGVudGlmaWVyIGlzIG51bGwsIGdldCBhbGwgcHJvcGVydGllcwotCQlpZiAoaWRlbnRpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBWZWN0b3IoaW5zdGFuY2VzLnZhbHVlcygpKTsKLQotCQlpZiAoY2FjaGVkSWRNYXAgPT0gbnVsbCkgewotCQkJLy8gc3RhcnQgY2FjaGVpbmcKLQkJCWNhY2hlZElkTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gc2VhcmNoIGNhY2hlZAotCQkJT2JqZWN0IHJldCA9IGNhY2hlZElkTWFwLmdldChpZGVudGlmaWVyICsgU3RyaW5nLnZhbHVlT2Yoc2hvcnRoYW5kcykpOwotCQkJaWYgKHJldCAhPSBudWxsKQotCQkJCXJldHVybiBuZXcgVmVjdG9yKChDb2xsZWN0aW9uKSByZXQpOwotCQl9Ci0KLQkJLy8gY3JlYXRlCi0JCUVudW1lcmF0aW9uIHByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0eUVudW0oKTsKLQkJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQl3aGlsZSAocHJvcGVydGllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJUHJvcENNUHJvcGVydHkgcHJvcCA9IChQcm9wQ01Qcm9wZXJ0eSkgcHJvcGVydGllcy5uZXh0RWxlbWVudCgpOwotCQkJaWYgKCFzaG9ydGhhbmRzICYmIHByb3AuaXNTaG9ydGhhbmQoKSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChwcm9wLmNhbkhhdmUoaWRlbnRpZmllcikpCi0JCQkJc2V0LmFkZChwcm9wKTsKLQkJfQotCi0JCS8vIGNhY2hlCi0JCWNhY2hlZElkTWFwLnB1dChpZGVudGlmaWVyICsgU3RyaW5nLnZhbHVlT2Yoc2hvcnRoYW5kcyksIHNldCk7Ci0KLQkJcmV0dXJuIG5ldyBWZWN0b3Ioc2V0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNRnVuY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTUZ1bmN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZWZjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNRnVuY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wQ01GdW5jdGlvbiBleHRlbmRzIFByb3BDTU5vZGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9BVFRSID0gImF0dHIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfQ09VTlRFUiA9ICJjb3VudGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX1JHQiA9ICJyZ2IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfU0hBUEUgPSAicmVjdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9VUkkgPSAidXJsIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX0ZPUk1BVCA9ICJmb3JtYXQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfTE9DQUwgPSAibG9jYWwiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBQcm9wQ01GdW5jdGlvbihTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGdldElkZW50aWZpZXJzKFNldCBpbmRlbnRzKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIHB1YmxpYyBQcm9wQ01GdW5jdGlvbiBnZXRJbnN0YW5jZU9mKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBpbml0aWFsaXplCi0JCWlmIChpbnN0YW5jZXMgPT0gbnVsbCkKLQkJCWluc3RhbmNlcyA9IG5ldyBIYXNodGFibGUoMTApOwotCi0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQkvLyBxdWVyeQotCQlPYmplY3Qgbm9kZSA9IGluc3RhbmNlcy5nZXQobmFtZSk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZXR1cm4gKFByb3BDTUZ1bmN0aW9uKSBub2RlOwotCi0JCS8vIHJlZ2lzdGVyCi0JCWlmIChQcm9wQ01Ob2RlLmlzTG9hZGluZygpKSB7Ci0JCQlub2RlID0gbmV3IFByb3BDTUZ1bmN0aW9uKG5hbWUpOwotCQkJaW5zdGFuY2VzLnB1dChuYW1lLCBub2RlKTsKLQkJfQotCi0JCXJldHVybiAoUHJvcENNRnVuY3Rpb24pIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBWQUxfRlVOQzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGdldFZhbHVlcyhDb2xsZWN0aW9uIHZhbHVlcykgewotCQlpZiAodmFsdWVzICE9IG51bGwgJiYgIXZhbHVlcy5jb250YWlucyh0aGlzKSkKLQkJCXZhbHVlcy5hZGQodGhpcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJhODRkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9wQ01Ob2RlIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgVkFMX0lERU5USUZJRVIgPSAwOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgVkFMX1BST1BFUlRZID0gMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IFZBTF9OVU1CRVIgPSAyOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgVkFMX1NUUklORyA9IDM7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBWQUxfRlVOQyA9IDQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBWQUxfQ09OVEFJTkVSID0gNTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IFZBTF9TVUJQUk9QRVJUWSA9IDY7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBWQUxfRk9OVFBST1BFUlRZID0gNzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IFZBTF9VTklDT0RFX1JBTkdFID0gODsKLQlwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBuYW1lID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBzaG9ydCBMT0FESU5HID0gMDsgLy8gMCA6IG5vdCBpbml0aWFsaXplZCwgMSA6IHVuZGVyCi0JCQkJCQkJCQkJLy8gaW5pdGlhbGl6aW5nLCAyIDogaW5pdGlhbGl6ZS1kb25lCi0JCQkJCQkJCQkJLy8gYW5kIGZpeCBEQgotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFByb3BDTU5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU2V0IGdldElkZW50aWZpZXJzKCkgewotCQlIYXNoU2V0IGlkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWdldElkZW50aWZpZXJzKGlkcyk7Ci0JCXJldHVybiBpZHM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JYWJzdHJhY3Qgdm9pZCBnZXRJZGVudGlmaWVycyhTZXQgaW5kZW50cyk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBzaG9ydCBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRWYWx1ZXMoKSB7Ci0JCVZlY3RvciB2YWxzID0gbmV3IFZlY3RvcigpOwotCQlnZXRWYWx1ZXModmFscyk7Ci0JCXJldHVybiB2YWxzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWFic3RyYWN0IHZvaWQgZ2V0VmFsdWVzKENvbGxlY3Rpb24gdmFsdWVzKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBpbml0UHJvcGVydHlDTSgpIHsKLQkJaWYgKCFpc05lZWRJbml0aWFsaXplKCkpCi0JCQlyZXR1cm47Ci0JCUxPQURJTkcgPSAxOwotCi0JCVByb3BDTU51bWJlci5pbml0TnVtYmVyQ01EaW0oKTsKLQotCQkvLyBhemltdXRoCi0JCVByb3BDTVByb3BlcnR5IHByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQVpJTVVUSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9BTkdMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlRfU0lERSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRkFSX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NFTlRFUl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DRU5URVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NFTlRFUl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0ZBUl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFRfU0lERSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQkVISU5EKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRUZUV0FSRFMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUV0FSRFMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDIpOwotCi0JCS8vIGJhY2tncm91bmQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CRyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0lNQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1JFUEVBVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19BVFRBQ0hNRU5UKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDYpOwotCi0JCS8vIGJhY2tncm91bmQtYXR0YWNobWVudAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0FUVEFDSE1FTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NDUk9MTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRklYRUQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYmFja2dyb3VuZC1jb2xvcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0NPTE9SKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RSQU5TUEFSRU5UKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJhY2tncm91bmQtaW1hZ2UKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19JTUFHRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBiYWNrZ3JvdW5kLXBvc2l0aW9uIC0tLS0gc3ViLXByb3BlcnRpZXMgaG9yaXpvbnRhbAotCQlwcm9wID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0VOVEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBiYWNrZ3JvdW5kLXBvc2l0aW9uIC0tLS0gc3ViLXByb3BlcnRpZXMgdmVydGljYWwKLQkJcHJvcCA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0VOVEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CT1RUT00pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYmFja2dyb3VuZC1wb3NpdGlvbgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgyKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJhY2tncm91bmQtcmVwZWF0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUkVQRUFUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SRVBFQVQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JFUEVBVF9YKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SRVBFQVRfWSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9fUkVQRUFUKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1RZTEUpKTsKLQkJLy8gcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQ09MT1IpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWNvbGxhcHNlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTExBUFNFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DT0xMQVBTRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0VQQVJBVEUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWNvbG9yCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTE9SKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUikpOwotCQkvLyBwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVFJBTlNQQVJFTlQpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoNCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItc3BhY2luZwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TUEFDSU5HKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMik7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItc3R5bGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1NUWUxFKSk7Ci0JCS8vIHByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1NUWUxFKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg0KTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci10b3AKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXJpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWJvdHRvbQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT00pOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUikpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItbGVmdAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfQ09MT1IpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXRvcC1jb2xvcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItdG9wLXN0eWxlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItdG9wLXdpZHRoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItcmlnaHQtY29sb3IKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItcmlnaHQtc3R5bGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXJpZ2h0LXdpZHRoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1dJRFRIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1ib3R0b20tY29sb3IKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX0NPTE9SKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWJvdHRvbS1zdHlsZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWJvdHRvbS13aWR0aAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWxlZnQtY29sb3IKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1sZWZ0LXN0eWxlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWxlZnQtd2lkdGgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9XSURUSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItd2lkdGgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfV0lEVEgpOwotCQkvLyBwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1dJRFRIKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg0KTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvdHRvbQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPVFRPTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNhcHRpb24tc2lkZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NBUFRJT05fU0lERSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVE9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CT1RUT00pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNsZWFyCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xFQVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CT1RIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TVEFUSUMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gY2xpcCAtLS0tIHN1Yi1wcm9wZXJ0aWVzIHRvcAotCQlwcm9wID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfVE9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQkoKFByb3BDTVN1YlByb3BlcnR5KSBwcm9wKS5zZXRDb250YWluZXIoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNsaXAgLS0tLSBzdWItcHJvcGVydGllcyByaWdodAotCQlwcm9wID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCSgoUHJvcENNU3ViUHJvcGVydHkpIHByb3ApLnNldENvbnRhaW5lcihQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gY2xpcCAtLS0tIHN1Yi1wcm9wZXJ0aWVzIGJvdHRvbQotCQlwcm9wID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfQk9UVE9NKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQkoKFByb3BDTVN1YlByb3BlcnR5KSBwcm9wKS5zZXRDb250YWluZXIoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNsaXAgLS0tLSBzdWItcHJvcGVydGllcyBsZWZ0Ci0JCXByb3AgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQkoKFByb3BDTVN1YlByb3BlcnR5KSBwcm9wKS5zZXRDb250YWluZXIoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNsaXAKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTElQKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9TSEFQRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gY29sb3IKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT0xPUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNvbnRlbnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT05URU5UKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdHJpbmcuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdHJpbmcuVkFMX0FOWSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1VSSSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX0NPVU5URVIpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9BVFRSKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfT1BFTl9RVU9URSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0xPU0VfUVVPVEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PX09QRU5fUVVPVEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PX0NMT1NFX1FVT1RFKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsgLy8gaW5maW5pdGUKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BTEwpOwotCi0JCS8vIGNvdW50ZXItaW5jcmVtZW50Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09VTlRFUl9JTkNSRU1FTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN0cmluZy5nZXRJbnN0YW5jZU9mKFByb3BDTVN0cmluZy5WQUxfQ09VTlRFUl9JRCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfSU5URUdFUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FMTCk7Ci0KLQkJLy8gY291bnRlci1yZXNldAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPVU5URVJfUkVTRVQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN0cmluZy5nZXRJbnN0YW5jZU9mKFByb3BDTVN0cmluZy5WQUxfQ09VTlRFUl9JRCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfSU5URUdFUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FMTCk7Ci0KLQkJLy8gY3VlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VFX0JFRk9SRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUVfQUZURVIpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDIpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBjdWUtYWZ0ZXIKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUVfQUZURVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1VSSSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBjdWUtYmVmb3JlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VFX0JFRk9SRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIGN1cnNvcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVUlNPUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ1JPU1NIQUlSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ERUZBVUxUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9QT0lOVEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NT1ZFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9FX1JFU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTkVfUkVTSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OV19SRVNJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05fUkVTSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TRV9SRVNJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NXX1JFU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU19SRVNJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1dfUkVTSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9URVhUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9XQUlUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9IRUxQKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsgLy8gaW5maW5pdGUKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0lOVEVSQUNUSVZFKTsKLQotCQkvLyBkaXJlY3Rpb24KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9ESVJFQ1RJT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xUUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUlRMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGRpc3BsYXkKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9ESVNQTEFZKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTkxJTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JMT0NLKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MSVNUX0lURU0pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JVTl9JTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ09NUEFDVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUFSS0VSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UQUJMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSU5MSU5FX1RBQkxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UQUJMRV9ST1dfR1JPVVApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFX0hFQURFUl9HUk9VUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEFCTEVfRk9PVEVSX0dST1VQKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UQUJMRV9ST1cpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFX0NPTFVNTl9HUk9VUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEFCTEVfQ09MVU1OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UQUJMRV9DRUxMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UQUJMRV9DQVBUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BTEwpOwotCi0JCS8vIGVsZXZhdGlvbgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0VMRVZBVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9BTkdMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JFTE9XKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRVZFTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUJPVkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0hJR0hFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTE9XRVIpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBlbXB0eS1jZWxscwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0VNUFRZX0NFTExTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TSE9XKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISURFKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGZsb2F0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRkxPQVQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGZvbnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1ZBUklBTlQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9XRUlHSFQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJTkVfSEVJR0hUKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfRkFNSUxZKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0FQVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSUNPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUVOVSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUVTU0FHRV9CT1gpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NNQUxMX0NBUFRJT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NUQVRVU19CQVIpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZm9udC1mYW1pbHkKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX0ZBTUlMWSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9GT05UKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfR0VORVJJQ19GQU1JTFkpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGZvbnQtc2l6ZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQUJTT0xVVEVfU0laRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1JFTEFUSVZFX1NJWkUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZm9udC1zaXplLWFkanVzdAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU0laRV9BREpVU1QpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBmb250LXN0cmV0Y2gKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUUkVUQ0gpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfV0lERVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05BUlJPV0VSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9VTFRSQV9DT05ERU5TRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0VYVFJBX0NPTkRFTlNFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ09OREVOU0VEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TRU1JX0NPTkRFTlNFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0VNSV9FWFBBTkRFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRVhQQU5ERUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0VYVFJBX0VYUEFOREVEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9VTFRSQV9FWFBBTkRFRCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBmb250LXN0eWxlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TVFlMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSVRBTElDKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9PQkxJUVVFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZm9udC12YXJpYW50Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9WQVJJQU5UKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TTUFMTF9DQVBTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZm9udC13ZWlnaHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1dFSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQk9MRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfMTAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl8yMDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzMwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfNDAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl81MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzYwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfNzAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl84MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzkwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTElHSFRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQk9MREVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gaGVpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfSEVJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbGVmdHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbGV0dGVyLXNwYWNpbmcKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MRVRURVJfU1BBQ0lORyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbGluZS1oZWlnaHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSU5FX0hFSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBsaXN0LXN0eWxlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfVFlQRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1BPU0lUSU9OKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfSU1BR0UpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbGlzdC1zdHlsZS1pbWFnZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfSU1BR0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1VSSSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbGlzdC1zdHlsZS1wb3NpdGlvbgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfUE9TSVRJT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0lOU0lERSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfT1VUU0lERSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBsaXN0LXN0eWxlLXR5cGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1RZUEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0RJU0MpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NJUkNMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU1FVQVJFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ERUNJTUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ERUNJTUFMX0xFQURJTkdfWkVSTyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTE9XRVJfUk9NQU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VQUEVSX1JPTUFOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MT1dFUl9HUkVFSyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTE9XRVJfQUxQSEEpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xPV0VSX0xBVElOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9VUFBFUl9BTFBIQSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVVBQRVJfTEFUSU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0hFQlJFVyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVJNRU5JQU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0dFT1JHSUFOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DSktfSURFT0dSQVBISUMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0hJUkFHQU5BKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9LQVRBS0FOQSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSElSQUdBTkFfSVJPSEEpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0tBVEFLQU5BX0lST0hBKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG1hcmdpbgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTik7Ci0JCS8vIHByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfTUFSR0lOX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9UT1ApKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1JJR0hUKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9CT1RUT00pKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0xFRlQpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWFyZ2luLXRvcAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9UT1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX01BUkdJTl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWFyZ2luLXJpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9NQVJHSU5fV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG1hcmdpbi1ib3R0b20KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fQk9UVE9NKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9NQVJHSU5fV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG1hcmdpbi1sZWZ0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX01BUkdJTl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWFya2VyLW9mZnNldAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUktFUl9PRkZTRVQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtYXJrcwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUktTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DUk9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DUk9TUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgyKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1BBR0VEKTsKLQotCQkvLyBtYXgtaGVpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFYX0hFSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG1heC13aWR0aAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BWF9XSURUSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG1pbi1oZWlnaHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NSU5fSEVJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWluLXdpZHRoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUlOX1dJRFRIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gb3JwaGFucwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09SUEhBTlMpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfSU5URUdFUikpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fUEFHRUQpOwotCi0JCS8vIG91dGxpbmUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfV0lEVEgpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fSU5URVJBQ1RJVkUpOwotCi0JCS8vIG91dGxpbmUtY29sb3IKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX0NPTE9SKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0lOVkVSVCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9JTlRFUkFDVElWRSk7Ci0KLQkJLy8gb3V0bGluZS1zdHlsZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fSU5URVJBQ1RJVkUpOwotCi0JCS8vIG91dGxpbmUtd2lkdGgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX1dJRFRIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0lOVEVSQUNUSVZFKTsKLQotCQkvLyBvdmVyZmxvdwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09WRVJGTE9XKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9WSVNJQkxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISURERU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NDUk9MTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBwYWRkaW5nCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElORyk7Ci0JCS8vIHByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfUEFERElOR19XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1RPUCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1JJR0hUKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfQk9UVE9NKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfTEVGVCkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoNCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBwYWRkaW5nLXRvcAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfVE9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9QQURESU5HX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBwYWRkaW5nLXJpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfUEFERElOR19XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gcGFkZGluZy1ib3R0b20KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0JPVFRPTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfUEFERElOR19XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gcGFkZGluZy1sZWZ0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9QQURESU5HX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBwYWdlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9QQUdFX0lEKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9QQUdFRCk7Ci0KLQkJLy8gcGFnZS1icmVhay1hZnRlcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0VfQlJFQUtfQUZURVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FMV0FZUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVZPSUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1BBR0VEKTsKLQotCQkvLyBwYWdlLWJyZWFrLWJlZm9yZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0VfQlJFQUtfQkVGT1JFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BTFdBWVMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FWT0lEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9QQUdFRCk7Ci0KLQkJLy8gcGFnZS1icmVhay1pbnNpZGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFX0JSRUFLX0lOU0lERSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVZPSUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fUEFHRUQpOwotCi0JCS8vIHBhdXNlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFVU0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfVElNRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMik7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHBhdXNlLWFmdGVyCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFVU0VfQUZURVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfVElNRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBwYXVzZS1iZWZvcmUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQVVTRV9CRUZPUkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfVElNRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBwaXRjaAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BJVENIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0ZSRVFVRU5DWSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1hfTE9XKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MT1cpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX01FRElVTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSElHSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfWF9ISUdIKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gcGl0Y2gtcmFuZ2UKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QSVRDSF9SQU5HRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gcGxheS1kdXJpbmcKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QTEFZX0RVUklORyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUlYKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SRVBFQVQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHBvc2l0aW9uCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUE9TSVRJT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FCU09MVVRFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SRUxBVElWRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRklYRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NUQVRJQyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBxdW90ZXMKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9RVU9URVMpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN0cmluZy5nZXRJbnN0YW5jZU9mKFByb3BDTVN0cmluZy5WQUxfQU5ZKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyByaWNobmVzcwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1JJQ0hORVNTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyByaWdodAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gc2l6ZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUE9SVFJBSVQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xBTkRTQ0FQRSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgyKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1BBR0VEKTsKLQotCQkvLyBzcGVhawotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NQRUxMX09VVCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHNwZWFrLWhlYWRlcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLX0hFQURFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfT05DRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUxXQVlTKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gc3BlYWstbnVtZXJhbAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLX05VTUVSQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0RJR0lUUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ09OVElOVU9VUyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHNwZWFrLXB1bmN0dWF0aW9uCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUtfUFVOQ1RVQVRJT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NPREUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBzcGVlY2gtcmF0ZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUVDSF9SQVRFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1hfU0xPVyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0xPVyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUVESVVNKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9GQVNUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9YX0ZBU1QpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBzdHJlc3MKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TVFJFU1MpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHRhYmxlLWxheW91dAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RBQkxFX0xBWU9VVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRklYRUQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gdGV4dC1hbGlnbgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfQUxJR04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NFTlRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0pVU1RJRlkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN0cmluZy5nZXRJbnN0YW5jZU9mKFByb3BDTVN0cmluZy5WQUxfQU5ZKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB0ZXh0LWRlY29yYXRpb24KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX0RFQ09SQVRJT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VOREVSTElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfT1ZFUkxJTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xJTkVfVEhST1VHSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQkxJTkspOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoNCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB0ZXh0LWluZGVudAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfSU5ERU5UKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gdGV4dC1zaGFkb3cKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX1NIQURPVyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gdGV4dC10cmFuc2Zvcm0KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX1RSQU5TRk9STSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0FQSVRBTElaRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVVBQRVJDQVNFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MT1dFUkNBU0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gdG9wCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVE9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gdW5pY29kZS1iaWRpCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVU5JQ09ERV9CSURJKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0VNQkVEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CSURJX09WRVJSSURFKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHZlcnRpY2FsLWFsaWduCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVkVSVElDQUxfQUxJR04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JPVFRPTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEVYVF9CT1RUT00pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NVQik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQkFTRUxJTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX01JRERMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU1VQRVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RFWFRfVE9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UT1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB2aXNpYmlsaXR5Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVklTSUJJTElUWSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVklTSUJMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSElEREVOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DT0xMQVBTRSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB2b2ljZS1mYW1pbHkKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WT0lDRV9GQU1JTFkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN0cmluZy5nZXRJbnN0YW5jZU9mKFByb3BDTVN0cmluZy5WQUxfVk9JQ0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9HRU5FUklDX1ZPSUNFKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHZvbHVtZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZPTFVNRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TSUxFTlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1hfU09GVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU09GVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUVESVVNKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MT1VEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9YX0xPVUQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyB3aGl0ZS1zcGFjZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dISVRFX1NQQUNFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1BSRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9XUkFQKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHdpZG93cwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dJRE9XUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9JTlRFR0VSKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9QQUdFRCk7Ci0KLQkJLy8gd2lkdGgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XSURUSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHdvcmQtc3BhY2luZwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dPUkRfU1BBQ0lORyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gei1pbmRleAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1pfSU5ERVgpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfSU5URUdFUikpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLyoqICoqKioqKioqIGZvbnQgcHJvcGVydGllcyAqKioqKioqKiogKi8KLQkJLy8gZm9udC1mYW1pbHkKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9GT05UX0ZBTUlMWSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9GT05UKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfR0VORVJJQ19GQU1JTFkpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQotCQkvLyBmb250LXN0eWxlCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfRk9OVF9TVFlMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSVRBTElDKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9PQkxJUVVFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FMTCk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0KLQkJLy8gZm9udC12YXJpYW50Ci0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfRk9OVF9WQVJJQU5UKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TTUFMTF9DQVBTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCi0JCS8vIGZvbnQtd2VpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfRk9OVF9XRUlHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JPTEQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzEwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfMjAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl8zMDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzQwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfNTAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl82MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzcwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfODAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl85MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUxMKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQotCQkvLyBmb250LXN0cmV0Y2gKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9GT05UX1NUUkVUQ0gpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVUxUUkFfQ09OREVOU0VEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9FWFRSQV9DT05ERU5TRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NPTkRFTlNFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0VNSV9DT05ERU5TRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NFTUlfRVhQQU5ERUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0VYUEFOREVEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9FWFRSQV9FWFBBTkRFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVUxUUkFfRVhQQU5ERUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FMTCk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0KLQkJLy8gZm9udC1zaXplCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfRk9OVF9TSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9BQlNPTFVURV9TSVpFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfUkVMQVRJVkVfU0laRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUxMKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQotCQkvLyB1bmljb2RlLXJhbmdlCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfVU5JQ09ERV9SQU5HRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNVVJhbmdlLmdldEluc3RhbmNlT2YoUHJvcENNVVJhbmdlLlZBTF9VUkFOR0UpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQotCQkvLyB1bml0cy1wZXItZW0KLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9VTklUU19QRVJfRU0pOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8gc3JjCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfU1JDKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9VUkkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9GT1JNQVQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9MT0NBTCkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCi0JCS8vIHBhbm9zZS0xCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfUEFOT1NFXzEpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfSU5URUdFUikpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMTApOwotCi0JCS8vIHN0ZW12Ci0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfU1RFTVYpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8gc3RlbWgKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9TVEVNSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyBzbG9wZQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1NMT1BFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIGNhcC1oZWlnaHQKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9DQVBfSEVJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIHgtaGVpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfWF9IRUlHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8gYXNjZW50Ci0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfQVNDRU5UKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIGRlc2NlbnQKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9ERVNDRU5UKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIHdpZHRocwotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1dJRFRIUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01VUmFuZ2UuZ2V0SW5zdGFuY2VPZihQcm9wQ01VUmFuZ2UuVkFMX1VSQU5HRSkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCi0JCS8vIGJib3gKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9CQk9YKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoNCk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg0KTsKLQotCQkvLyBkZWZpbml0aW9uLXNyYwotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0RFRklOSVRJT05fU1JDKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9VUkkpKTsKLQotCQkvLyBiYXNlbGluZQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0JBU0VMSU5FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIGNlbnRlcmxpbmUKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9DRU5URVJMSU5FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIG1hdGhsaW5lCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfTUFUSExJTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8gdG9wbGluZQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1RPUExJTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLyoqICoqKioqKioqIGNvbnRhaW5lcnMgKioqKioqKioqICovCi0KLQkJLy8gYWJzb2x1dGUtc2l6ZQotCQlQcm9wQ01Db250YWluZXIgY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0FCU09MVVRFX1NJWkUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1hYX1NNQUxMKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9YX1NNQUxMKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TTUFMTCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUVESVVNKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MQVJHRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfWF9MQVJHRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfWFhfTEFSR0UpOwotCi0JCS8vIGJvcmRlci1zdHlsZQotCQljb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1NUWUxFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TT0xJRCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfREFTSEVEKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ET1RURUQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0RPVUJMRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfR1JPT1ZFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSURHRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfSU5TRVQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX09VVFNFVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfSElEREVOKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQotCQkvLyBib3JkZXItd2lkdGgKLQkJY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9XSURUSCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEhJTik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUVESVVNKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9USElDSyk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQotCQkvLyBjb2xvcgotCQljb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0FRVUEpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0JMQUNLKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CTFVFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9GVUNIU0lBKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9HUkFZKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9HUkVFTik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTElNRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUFST09OKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OQVZZKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9PTElWRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfUFVSUExFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SRUQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1NJTFZFUik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEVBTCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfV0hJVEUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1lFTExPVyk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfU1lTVEVNX0NPTE9SKSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfUkdCKSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9IQVNIKSk7Ci0KLQkJLy8gc3lzdGVtIGNvbG9yCi0JCWNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9TWVNURU1fQ09MT1IpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0FDVElWRUJPUkRFUik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUNUSVZFQ0FQVElPTik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVBQV09SS1NQQUNFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CQUNLR1JPVU5EKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CVVRUT05GQUNFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CVVRUT05ISUdITElHSFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0JVVFRPTlNIQURPVyk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQlVUVE9OVEVYVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0FQVElPTlRFWFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0dSQVlURVhUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISUdITElHSFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0hJR0hMSUdIVFRFWFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0lOQUNUSVZFQk9SREVSKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTkFDVElWRUNBUFRJT04pOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0lOQUNUSVZFQ0FQVElPTlRFWFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0lORk9CQUNLR1JPVU5EKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTkZPVEVYVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUVOVSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTUVOVVRFWFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1NDUk9MTEJBUik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEhSRUVEREFSS1NIQURPVyk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEhSRUVERkFDRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEhSRUVESElHSExJR0hUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9USFJFRURMSUdIVFNIQURPVyk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEhSRUVEU0hBRE9XKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9XSU5ET1cpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1dJTkRPV0ZSQU1FKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9XSU5ET1dURVhUKTsKLQotCQkvLyBnZW5lcmljLWZhbWlseQotCQljb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfR0VORVJJQ19GQU1JTFkpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1NFUklGKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TQU5TX1NFUklGKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DVVJTSVZFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9GQU5UQVNZKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NT05PU1BBQ0UpOwotCi0JCS8vIGdlbmVyaWMtdm9pY2UKLQkJY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0dFTkVSSUNfVk9JQ0UpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX01BTEUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0ZFTUFMRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0hJTEQpOwotCi0JCS8vIG1hcmdpbi13aWR0aAotCQljb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfTUFSR0lOX1dJRFRIKTsKLQkJY29udC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQljb250LmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCi0JCS8vIHBhZGRpbmctd2lkdGgKLQkJY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1BBRERJTkdfV0lEVEgpOwotCQljb250LmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0KLQkJLy8gcmVsYXRpdmUtc2l6ZQotCQljb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfUkVMQVRJVkVfU0laRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfU01BTExFUik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEFSR0VSKTsKLQotCQlMT0FESU5HID0gMjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNMb2FkaW5nKCkgewotCQlyZXR1cm4gTE9BRElORyA9PSAxOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc05lZWRJbml0aWFsaXplKCkgewotCQlyZXR1cm4gTE9BRElORyA9PSAwOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTU51bWJlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNTnVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OTZiYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNTnVtYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTU51bWJlciBleHRlbmRzIFByb3BDTU5vZGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfQU5HTEUgPSAiYW5nbGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX0ZSRVFVRU5DWSA9ICJmcmVxdWVuY3kiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX0lOVEVHRVIgPSAiaW50ZWdlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfTEVOR1RIID0gImxlbmd0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfUEVSQ0VOVEFHRSA9ICJwZXJjZW50YWdlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9USU1FID0gInRpbWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX0hBU0ggPSAiaGFzaCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX05VTSA9ICJudW1iZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fQ00gPSAiY20iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fREVHID0gImRlZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9FTVMgPSAiZW0iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fRVhTID0gImV4IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX0dSQUQgPSAiZ3JhZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9IQVNIID0gIiMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fSFogPSAiSHoiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fSU4gPSAiaW4iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fSU5URUdFUiA9ICJJTlRFR0VSIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX0tIWiA9ICJrSHoiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fTU0gPSAibW0iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fTVMgPSAibXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fTlVNQkVSID0gIk5VTUJFUiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9QQyA9ICJwYyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9QRVJDRU5UQUdFID0gIiUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fUFQgPSAicHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fUFggPSAicHgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fUkFEID0gInJhZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9TID0gInMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGphdmEudXRpbC5WZWN0b3IgZkRpbXMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcENNTnVtYmVyKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERpbWVuc2lvbihzaG9ydCBwcmltaXRpdmVUeXBlKSB7Ci0JCXN3aXRjaCAocHJpbWl0aXZlVHlwZSkgewotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ00gOgotCQkJCXJldHVybiBESU1fQ007Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19ERUcgOgotCQkJCXJldHVybiBESU1fREVHOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRU1TIDoKLQkJCQlyZXR1cm4gRElNX0VNUzsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VYUyA6Ci0JCQkJcmV0dXJuIERJTV9FWFM7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19HUkFEIDoKLQkJCQlyZXR1cm4gRElNX0dSQUQ7Ci0JCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSEFTSCA6Ci0JCQkJcmV0dXJuIERJTV9IQVNIOyAvLyBwcmVmaXggZGltZW5zaW9uIC4uLi4KLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0haIDoKLQkJCQlyZXR1cm4gRElNX0haOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU4gOgotCQkJCXJldHVybiBESU1fSU47Ci0JCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5URUdFUiA6Ci0JCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0tIWiA6Ci0JCQkJcmV0dXJuIERJTV9LSFo7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NTSA6Ci0JCQkJcmV0dXJuIERJTV9NTTsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01TIDoKLQkJCQlyZXR1cm4gRElNX01TOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTlVNQkVSIDoKLQkJCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEMgOgotCQkJCXJldHVybiBESU1fUEM7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QRVJDRU5UQUdFIDoKLQkJCQlyZXR1cm4gRElNX1BFUkNFTlRBR0U7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QVCA6Ci0JCQkJcmV0dXJuIERJTV9QVDsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BYIDoKLQkJCQlyZXR1cm4gRElNX1BYOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkFEIDoKLQkJCQlyZXR1cm4gRElNX1JBRDsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1MgOgotCQkJCXJldHVybiBESU1fUzsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTZXQgZ2V0RGltZW5zaW9ucygpIHsKLQkJSGFzaFNldCB2YWxzID0gbmV3IEhhc2hTZXQoKTsKLQkJSXRlcmF0b3IgaXQgPSBmRGltcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQl2YWxzLmFkZChpdC5uZXh0KCkpOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRJZGVudGlmaWVycyhTZXQgaW5kZW50cykgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBwdWJsaWMgUHJvcENNTnVtYmVyIGdldEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGluaXRpYWxpemUKLQkJaWYgKGluc3RhbmNlcyA9PSBudWxsKQotCQkJaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgyMCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIHF1ZXJ5Ci0JCU9iamVjdCBub2RlID0gaW5zdGFuY2VzLmdldChuYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoUHJvcENNTnVtYmVyKSBub2RlOwotCi0JCS8vIHJlZ2lzdGVyCi0JCWlmIChQcm9wQ01Ob2RlLmlzTG9hZGluZygpKSB7Ci0JCQlub2RlID0gbmV3IFByb3BDTU51bWJlcihuYW1lKTsKLQkJCWluc3RhbmNlcy5wdXQobmFtZSwgbm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gKFByb3BDTU51bWJlcikgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9OVU1CRVI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRWYWx1ZXMoQ29sbGVjdGlvbiB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcyAhPSBudWxsICYmICF2YWx1ZXMuY29udGFpbnModGhpcykpCi0JCQl2YWx1ZXMuYWRkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyB2b2lkIGluaXROdW1iZXJDTURpbSgpIHsKLQkJUHJvcENNTnVtYmVyIG51bSA9IGdldEluc3RhbmNlT2YoVkFMX0FOR0xFKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fREVHKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fR1JBRCk7Ci0JCW51bS5mRGltcy5hZGQoRElNX1JBRCk7Ci0KLQkJbnVtID0gZ2V0SW5zdGFuY2VPZihWQUxfRlJFUVVFTkNZKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fSFopOwotCQludW0uZkRpbXMuYWRkKERJTV9LSFopOwotCi0JCW51bSA9IGdldEluc3RhbmNlT2YoVkFMX0hBU0gpOwotCQludW0uZkRpbXMuYWRkKERJTV9IQVNIKTsKLQotCQkvLyBudW0gPSBnZXRJbnN0YW5jZU9mKFZBTF9JTlRFR0VSKTsKLQkJLy8gbnVtLmZEaW1zLmFkZChESU1fSU5URUdFUik7Ci0KLQkJbnVtID0gZ2V0SW5zdGFuY2VPZihWQUxfTEVOR1RIKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fQ00pOwotCQludW0uZkRpbXMuYWRkKERJTV9FTVMpOwotCQludW0uZkRpbXMuYWRkKERJTV9FWFMpOwotCQludW0uZkRpbXMuYWRkKERJTV9JTik7Ci0JCW51bS5mRGltcy5hZGQoRElNX01NKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fUEMpOwotCQludW0uZkRpbXMuYWRkKERJTV9QVCk7Ci0JCW51bS5mRGltcy5hZGQoRElNX1BYKTsKLQotCQkvLyBudW0gPSBnZXRJbnN0YW5jZU9mKFZBTF9OVU1CRVIpOwotCQkvLyBudW0uZkRpbXMuYWRkKERJTV9OVU1CRVIpOwotCi0JCW51bSA9IGdldEluc3RhbmNlT2YoVkFMX1BFUkNFTlRBR0UpOwotCQludW0uZkRpbXMuYWRkKERJTV9QRVJDRU5UQUdFKTsKLQotCQludW0gPSBnZXRJbnN0YW5jZU9mKFZBTF9USU1FKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fTVMpOwotCQludW0uZkRpbXMuYWRkKERJTV9TKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVByb3BlcnR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Qcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmFiMzhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTVByb3BlcnR5IGV4dGVuZHMgUHJvcENNQ29udGFpbmVyIHsKLQotCS8vIHN0YXRpYyBmaWVsZHMKLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGluc3RhbmNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBjYWNoZWRJZE1hcCA9IG51bGw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9BWklNVVRIID0gImF6aW11dGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JHID0gImJhY2tncm91bmQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JHX0FUVEFDSE1FTlQgPSAiYmFja2dyb3VuZC1hdHRhY2htZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19DT0xPUiA9ICJiYWNrZ3JvdW5kLWNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19JTUFHRSA9ICJiYWNrZ3JvdW5kLWltYWdlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19QT1NJVElPTiA9ICJiYWNrZ3JvdW5kLXBvc2l0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19SRVBFQVQgPSAiYmFja2dyb3VuZC1yZXBlYXQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUiA9ICJib3JkZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9DT0xMQVBTRSA9ICJib3JkZXItY29sbGFwc2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9DT0xPUiA9ICJib3JkZXItY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9TUEFDSU5HID0gImJvcmRlci1zcGFjaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfU1RZTEUgPSAiYm9yZGVyLXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfVE9QID0gImJvcmRlci10b3AiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9SSUdIVCA9ICJib3JkZXItcmlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9CT1RUT00gPSAiYm9yZGVyLWJvdHRvbSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0xFRlQgPSAiYm9yZGVyLWxlZnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9UT1BfQ09MT1IgPSAiYm9yZGVyLXRvcC1jb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1JJR0hUX0NPTE9SID0gImJvcmRlci1yaWdodC1jb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0JPVFRPTV9DT0xPUiA9ICJib3JkZXItYm90dG9tLWNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfTEVGVF9DT0xPUiA9ICJib3JkZXItbGVmdC1jb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1RPUF9TVFlMRSA9ICJib3JkZXItdG9wLXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfUklHSFRfU1RZTEUgPSAiYm9yZGVyLXJpZ2h0LXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQk9UVE9NX1NUWUxFID0gImJvcmRlci1ib3R0b20tc3R5bGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9MRUZUX1NUWUxFID0gImJvcmRlci1sZWZ0LXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfVE9QX1dJRFRIID0gImJvcmRlci10b3Atd2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9SSUdIVF9XSURUSCA9ICJib3JkZXItcmlnaHQtd2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9CT1RUT01fV0lEVEggPSAiYm9yZGVyLWJvdHRvbS13aWR0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0xFRlRfV0lEVEggPSAiYm9yZGVyLWxlZnQtd2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9XSURUSCA9ICJib3JkZXItd2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPVFRPTSA9ICJib3R0b20iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NBUFRJT05fU0lERSA9ICJjYXB0aW9uLXNpZGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NMRUFSID0gImNsZWFyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DTElQID0gImNsaXAiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NPTE9SID0gImNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT05URU5UID0gImNvbnRlbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NPVU5URVJfSU5DUkVNRU5UID0gImNvdW50ZXItaW5jcmVtZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT1VOVEVSX1JFU0VUID0gImNvdW50ZXItcmVzZXQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NVRSA9ICJjdWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NVRV9BRlRFUiA9ICJjdWUtYWZ0ZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NVRV9CRUZPUkUgPSAiY3VlLWJlZm9yZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ1VSU09SID0gImN1cnNvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRElSRUNUSU9OID0gImRpcmVjdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRElTUExBWSA9ICJkaXNwbGF5IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9FTEVWQVRJT04gPSAiZWxldmF0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9FTVBUWV9DRUxMUyA9ICJlbXB0eS1jZWxscyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRkxPQVQgPSAiZmxvYXQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlQgPSAiZm9udCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9GQU1JTFkgPSAiZm9udC1mYW1pbHkiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU0laRSA9ICJmb250LXNpemUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU0laRV9BREpVU1QgPSAiZm9udC1zaXplLWFkanVzdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9TVFJFVENIID0gImZvbnQtc3RyZXRjaCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9TVFlMRSA9ICJmb250LXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1ZBUklBTlQgPSAiZm9udC12YXJpYW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1dFSUdIVCA9ICJmb250LXdlaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfSEVJR0hUID0gImhlaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTEVGVCA9ICJsZWZ0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MRVRURVJfU1BBQ0lORyA9ICJsZXR0ZXItc3BhY2luZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTElORV9IRUlHSFQgPSAibGluZS1oZWlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0xJU1RfU1RZTEUgPSAibGlzdC1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTElTVF9TVFlMRV9JTUFHRSA9ICJsaXN0LXN0eWxlLWltYWdlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MSVNUX1NUWUxFX1BPU0lUSU9OID0gImxpc3Qtc3R5bGUtcG9zaXRpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0xJU1RfU1RZTEVfVFlQRSA9ICJsaXN0LXN0eWxlLXR5cGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTiA9ICJtYXJnaW4iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTl9UT1AgPSAibWFyZ2luLXRvcCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSR0lOX1JJR0hUID0gIm1hcmdpbi1yaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSR0lOX0JPVFRPTSA9ICJtYXJnaW4tYm90dG9tIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJHSU5fTEVGVCA9ICJtYXJnaW4tbGVmdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSS0VSX09GRlNFVCA9ICJtYXJrZXItb2Zmc2V0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJLUyA9ICJtYXJrcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFYX0hFSUdIVCA9ICJtYXgtaGVpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVhfV0lEVEggPSAibWF4LXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NSU5fSEVJR0hUID0gIm1pbi1oZWlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01JTl9XSURUSCA9ICJtaW4td2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX09SUEhBTlMgPSAib3JwaGFucyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1VUTElORSA9ICJvdXRsaW5lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PVVRMSU5FX0NPTE9SID0gIm91dGxpbmUtY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX09VVExJTkVfU1RZTEUgPSAib3V0bGluZS1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1VUTElORV9XSURUSCA9ICJvdXRsaW5lLXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PVkVSRkxPVyA9ICJvdmVyZmxvdyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElORyA9ICJwYWRkaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQURESU5HX1RPUCA9ICJwYWRkaW5nLXRvcCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19SSUdIVCA9ICJwYWRkaW5nLXJpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQURESU5HX0JPVFRPTSA9ICJwYWRkaW5nLWJvdHRvbSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19MRUZUID0gInBhZGRpbmctbGVmdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFHRSA9ICJwYWdlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQUdFX0JSRUFLX0FGVEVSID0gInBhZ2UtYnJlYWstYWZ0ZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBR0VfQlJFQUtfQkVGT1JFID0gInBhZ2UtYnJlYWstYmVmb3JlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQUdFX0JSRUFLX0lOU0lERSA9ICJwYWdlLWJyZWFrLWluc2lkZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFVU0UgPSAicGF1c2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBVVNFX0FGVEVSID0gInBhdXNlLWFmdGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQVVTRV9CRUZPUkUgPSAicGF1c2UtYmVmb3JlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QSVRDSCA9ICJwaXRjaCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUElUQ0hfUkFOR0UgPSAicGl0Y2gtcmFuZ2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BMQVlfRFVSSU5HID0gInBsYXktZHVyaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QT1NJVElPTiA9ICJwb3NpdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUVVPVEVTID0gInF1b3RlcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUklDSE5FU1MgPSAicmljaG5lc3MiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1JJR0hUID0gInJpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TSVpFID0gInNpemUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1NQRUFLID0gInNwZWFrIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBS19IRUFERVIgPSAic3BlYWstaGVhZGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBS19OVU1FUkFMID0gInNwZWFrLW51bWVyYWwiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1NQRUFLX1BVTkNUVUFUSU9OID0gInNwZWFrLXB1bmN0dWF0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVFQ0hfUkFURSA9ICJzcGVlY2gtcmF0ZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1RSRVNTID0gInN0cmVzcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEFCTEVfTEFZT1VUID0gInRhYmxlLWxheW91dCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9BTElHTiA9ICJ0ZXh0LWFsaWduIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9URVhUX0RFQ09SQVRJT04gPSAidGV4dC1kZWNvcmF0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9URVhUX0lOREVOVCA9ICJ0ZXh0LWluZGVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9TSEFET1cgPSAidGV4dC1zaGFkb3ciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1RFWFRfVFJBTlNGT1JNID0gInRleHQtdHJhbnNmb3JtIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9UT1AgPSAidG9wIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9VTklDT0RFX0JJREkgPSAidW5pY29kZS1iaWRpIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9WRVJUSUNBTF9BTElHTiA9ICJ2ZXJ0aWNhbC1hbGlnbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVklTSUJJTElUWSA9ICJ2aXNpYmlsaXR5IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9WT0lDRV9GQU1JTFkgPSAidm9pY2UtZmFtaWx5IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9WT0xVTUUgPSAidm9sdW1lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9XSElURV9TUEFDRSA9ICJ3aGl0ZS1zcGFjZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfV0lET1dTID0gIndpZG93cyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfV0lEVEggPSAid2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1dPUkRfU1BBQ0lORyA9ICJ3b3JkLXNwYWNpbmciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1pfSU5ERVggPSAiei1pbmRleCI7Ly8kTk9OLU5MUy0xJAotCS8vIGluc3RhbmNlIGZpZWxkcwotCXByaXZhdGUgaW50IGZNaW5WYWx1ZUNvdW50ID0gMTsKLQlwcml2YXRlIGludCBmTWF4VmFsdWVDb3VudCA9IDE7Ci0JcHJpdmF0ZSBPYmplY3RbXSBtZWRpYUdyb3VwczsKLQlwcm90ZWN0ZWQgTGlzdCBjb250YWluZXJzOwotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFByb3BDTVByb3BlcnR5KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCU9iamVjdCBhcHBlbmRDaGlsZChPYmplY3Qgbm9kZSkgewotCQlPYmplY3QgcmV0ID0gc3VwZXIuYXBwZW5kQ2hpbGQobm9kZSk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgUHJvcENNUHJvcGVydHkpIHsKLQkJCS8vIHJlZ2lzdGVyIHNob3J0aGFuZCBjb250YWluZXIKLQkJCVByb3BDTVByb3BlcnR5IGNtID0gKFByb3BDTVByb3BlcnR5KSBub2RlOwotCQkJaWYgKGNtLmNvbnRhaW5lcnMgPT0gbnVsbCkKLQkJCQljbS5jb250YWluZXJzID0gbmV3IFZlY3RvcigpOwotCQkJaWYgKCFjbS5jb250YWluZXJzLmNvbnRhaW5zKHRoaXMpKQotCQkJCWNtLmNvbnRhaW5lcnMuYWRkKHRoaXMpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBhcHBlbmRNZWRpYUdyb3VwKE9iamVjdCBtZykgewotCQlpZiAobWVkaWFHcm91cHMgPT0gbnVsbCkKLQkJCW1lZGlhR3JvdXBzID0gbmV3IE9iamVjdFsxXTsKLQkJZWxzZSB7Ci0JCQlPYmplY3RbXSBvbGRNZWRpYUdyb3VwcyA9IG1lZGlhR3JvdXBzOwotCQkJbWVkaWFHcm91cHMgPSBuZXcgT2JqZWN0W29sZE1lZGlhR3JvdXBzLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShvbGRNZWRpYUdyb3VwcywgMCwgbWVkaWFHcm91cHMsIDAsIG9sZE1lZGlhR3JvdXBzLmxlbmd0aCk7Ci0JCX0KLQkJbWVkaWFHcm91cHNbbWVkaWFHcm91cHMubGVuZ3RoIC0gMV0gPSBtZzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BDTVByb3BlcnR5IGdldEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJLy8gaW5pdGlhbGl6ZQotCQlpZiAoaW5zdGFuY2VzID09IG51bGwpCi0JCQlpbnN0YW5jZXMgPSBuZXcgSGFzaHRhYmxlKDIwMCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIHF1ZXJ5Ci0JCU9iamVjdCBub2RlID0gaW5zdGFuY2VzLmdldChuYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoUHJvcENNUHJvcGVydHkpIG5vZGU7Ci0KLQkJLy8gcmVnaXN0ZXIKLQkJaWYgKFByb3BDTU5vZGUuaXNMb2FkaW5nKCkpIHsKLQkJCW5vZGUgPSBuZXcgUHJvcENNUHJvcGVydHkobmFtZSk7Ci0JCQlpbnN0YW5jZXMucHV0KG5hbWUsIG5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIChQcm9wQ01Qcm9wZXJ0eSkgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1heFZhbHVlQ291bnQoKSB7Ci0JCXJldHVybiBmTWF4VmFsdWVDb3VudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZWRpYUdyb3VwcygpIHsKLQkJaWYgKG1lZGlhR3JvdXBzICE9IG51bGwpCi0JCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChtZWRpYUdyb3Vwcyk7Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRNaW5WYWx1ZUNvdW50KCkgewotCQlyZXR1cm4gZk1pblZhbHVlQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnVtZXJhdGlvbiBnZXROYW1lRW51bSgpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCXJldHVybiBpbnN0YW5jZXMua2V5cygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb24gZ2V0UHJvcGVydHlFbnVtKCkgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJcmV0dXJuIGluc3RhbmNlcy5lbGVtZW50cygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2hvcnRoYW5kQ29udGFpbmVyQ291bnQoKSB7Ci0JCXJldHVybiAoY29udGFpbmVycyA9PSBudWxsKSA/IDAgOiBjb250YWluZXJzLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9QUk9QRVJUWTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3J0aGFuZCgpIHsKLQkJaW50IG5DaGlsZCA9IGdldE51bUNoaWxkKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkNoaWxkOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBnZXRDaGlsZEF0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb3BDTVByb3BlcnR5ICYmICEob2JqIGluc3RhbmNlb2YgUHJvcENNU3ViUHJvcGVydHkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlY3RvciBuYW1lcygpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCXJldHVybiBuZXcgVmVjdG9yKGluc3RhbmNlcy5rZXlTZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IG5hbWVzKE9iamVjdCBtZWRpYUdyb3VwKSB7Ci0JCWlmIChtZWRpYUdyb3VwID09IG51bGwpCi0JCQlyZXR1cm4gbmFtZXMoKTsKLQotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJVmVjdG9yIHByb3BlcnRpZXMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJSXRlcmF0b3IgaXQgPSBpbnN0YW5jZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJUHJvcENNUHJvcGVydHkgcHJvcCA9IChQcm9wQ01Qcm9wZXJ0eSkgaXQubmV4dCgpOwotCQkJaWYgKHByb3AuZ2V0TWVkaWFHcm91cHMoKS5jb250YWlucyhtZWRpYUdyb3VwKSkKLQkJCQlwcm9wZXJ0aWVzLmFkZChwcm9wLmdldE5hbWUoKSk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBJZiBpZGVudGlmaWVyIGlzIG51bGwsIGdldCBhbGwgcHJvcGVydGllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmVjdG9yIHByb3BlcnRpZXNGb3IoU3RyaW5nIGlkZW50aWZpZXIsIGJvb2xlYW4gc2hvcnRoYW5kcykgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJLy8gaWYgaWRlbnRpZmllciBpcyBudWxsLCBnZXQgYWxsIHByb3BlcnRpZXMKLQkJaWYgKGlkZW50aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgVmVjdG9yKGluc3RhbmNlcy52YWx1ZXMoKSk7Ci0KLQkJaWYgKGNhY2hlZElkTWFwID09IG51bGwpIHsKLQkJCS8vIHN0YXJ0IGNhY2hlaW5nCi0JCQljYWNoZWRJZE1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHNlYXJjaCBjYWNoZWQKLQkJCU9iamVjdCByZXQgPSBjYWNoZWRJZE1hcC5nZXQoaWRlbnRpZmllciArIFN0cmluZy52YWx1ZU9mKHNob3J0aGFuZHMpKTsKLQkJCWlmIChyZXQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IFZlY3RvcigoQ29sbGVjdGlvbikgcmV0KTsKLQkJfQotCi0JCS8vIGNyZWF0ZQotCQlFbnVtZXJhdGlvbiBwcm9wZXJ0eUVudW0gPSBnZXRQcm9wZXJ0eUVudW0oKTsKLQkJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQl3aGlsZSAocHJvcGVydHlFbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wID0gKFByb3BDTVByb3BlcnR5KSBwcm9wZXJ0eUVudW0ubmV4dEVsZW1lbnQoKTsKLQkJCWlmICghc2hvcnRoYW5kcyAmJiBwcm9wLmlzU2hvcnRoYW5kKCkpCi0JCQkJY29udGludWU7Ci0JCQlpZiAocHJvcC5jYW5IYXZlKGlkZW50aWZpZXIpKQotCQkJCXNldC5hZGQocHJvcCk7Ci0JCX0KLQotCQkvLyBjYWNoZQotCQljYWNoZWRJZE1hcC5wdXQoaWRlbnRpZmllciArIFN0cmluZy52YWx1ZU9mKHNob3J0aGFuZHMpLCBzZXQpOwotCi0JCXJldHVybiBuZXcgVmVjdG9yKHNldCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWF4VmFsdWVDb3VudChpbnQgbmV3TWF4VmFsdWVDb3VudCkgewotCQlmTWF4VmFsdWVDb3VudCA9IG5ld01heFZhbHVlQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWluVmFsdWVDb3VudChpbnQgbmV3TWluVmFsdWVDb3VudCkgewotCQlmTWluVmFsdWVDb3VudCA9IG5ld01pblZhbHVlQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFByb3BDTVByb3BlcnR5IHNob3J0aGFuZENvbnRhaW5lckF0KGludCBpKSB7Ci0JCWlmIChjb250YWluZXJzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGkgPCAwIHx8IGNvbnRhaW5lcnMuc2l6ZSgpIDw9IGkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChQcm9wQ01Qcm9wZXJ0eSkgY29udGFpbmVycy5nZXQoaSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIHNob3J0aGFuZENvbnRhaW5lckl0ZXJhdG9yKCkgewotCQlpZiAoY29udGFpbmVycyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IEl0ZXJhdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBjb250YWluZXJzLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVN0cmluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTFlODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wQ01TdHJpbmcgZXh0ZW5kcyBQcm9wQ01Ob2RlIHsKLQotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgaW5zdGFuY2VzID0gbnVsbDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX0ZPTlQgPSAiZm9udCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfQ09VTlRFUl9JRCA9ICJjb3VudGVySWQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX1BBR0VfSUQgPSAicGFnZUlkIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9WT0lDRSA9ICJ2b2ljZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfQU5ZID0gImFueSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBQcm9wQ01TdHJpbmcoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRJZGVudGlmaWVycyhTZXQgaW5kZW50cykgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBwdWJsaWMgUHJvcENNU3RyaW5nIGdldEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGluaXRpYWxpemUKLQkJaWYgKGluc3RhbmNlcyA9PSBudWxsKQotCQkJaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgxMCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIHF1ZXJ5Ci0JCU9iamVjdCBub2RlID0gaW5zdGFuY2VzLmdldChuYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoUHJvcENNU3RyaW5nKSBub2RlOwotCi0JCS8vIHJlZ2lzdGVyCi0JCW5vZGUgPSBuZXcgUHJvcENNU3RyaW5nKG5hbWUpOwotCQlpbnN0YW5jZXMucHV0KG5hbWUsIG5vZGUpOwotCi0JCXJldHVybiAoUHJvcENNU3RyaW5nKSBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gVkFMX1NUUklORzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGdldFZhbHVlcyhDb2xsZWN0aW9uIHZhbHVlcykgewotCQlpZiAodmFsdWVzICE9IG51bGwgJiYgIXZhbHVlcy5jb250YWlucyh0aGlzKSkKLQkJCXZhbHVlcy5hZGQodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNU3ViUHJvcGVydHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVN1YlByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZWJiMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNU3ViUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTVN1YlByb3BlcnR5IGV4dGVuZHMgUHJvcENNUHJvcGVydHkgewotCi0JLy8gc3RhdGljIGZpZWxkcwotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgaW5zdGFuY2VzID0gbnVsbDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQU1VCX0JHX1BPU0lUSU9OX1ggPSAiYmFja2dyb3VuZC1wb3NpdGlvbkgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQU1VCX0JHX1BPU0lUSU9OX1kgPSAiYmFja2dyb3VuZC1wb3NpdGlvblYiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQU1VCX0NMSVBfVE9QID0gImNsaXBUb3AiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQU1VCX0NMSVBfUklHSFQgPSAiY2xpcFJpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFNVQl9DTElQX0JPVFRPTSA9ICJjbGlwQm90dG9tIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFNVQl9DTElQX0xFRlQgPSAiY2xpcExlZnQiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBQcm9wQ01TdWJQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUHJvcENNUHJvcGVydHkgZ2V0Q29udGFpbmVyKCkgewotCQlyZXR1cm4gc2hvcnRoYW5kQ29udGFpbmVyQXQoMCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9wQ01Qcm9wZXJ0eSBnZXRJbnN0YW5jZU9mKFN0cmluZyBuYW1lKSB7Ci0JCS8vIGluaXRpYWxpemUKLQkJaWYgKGluc3RhbmNlcyA9PSBudWxsKQotCQkJaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgxMCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIHF1ZXJ5Ci0JCU9iamVjdCBub2RlID0gaW5zdGFuY2VzLmdldChuYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoUHJvcENNUHJvcGVydHkpIG5vZGU7Ci0KLQkJLy8gcmVnaXN0ZXIKLQkJaWYgKFByb3BDTU5vZGUuaXNMb2FkaW5nKCkpIHsKLQkJCW5vZGUgPSBuZXcgUHJvcENNU3ViUHJvcGVydHkobmFtZSk7Ci0JCQlpbnN0YW5jZXMucHV0KG5hbWUsIG5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIChQcm9wQ01Qcm9wZXJ0eSkgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudW1lcmF0aW9uIGdldE5hbWVFbnVtKCkgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJcmV0dXJuIGluc3RhbmNlcy5rZXlzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnVtZXJhdGlvbiBnZXRQcm9wZXJ0eUVudW0oKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gaW5zdGFuY2VzLmVsZW1lbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBWQUxfU1VCUFJPUEVSVFk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBWZWN0b3IgbmFtZXMoKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gbmV3IFZlY3RvcihpbnN0YW5jZXMua2V5U2V0KCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihQcm9wQ01Qcm9wZXJ0eSBwcm9wKSB7Ci0JCWlmIChjb250YWluZXJzID09IG51bGwpCi0JCQljb250YWluZXJzID0gbmV3IFZlY3RvcigpOwotCQljb250YWluZXJzLmNsZWFyKCk7Ci0JCWNvbnRhaW5lcnMuYWRkKHByb3ApOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01VUmFuZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVVSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzc1NzE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVVSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTVVSYW5nZSBleHRlbmRzIFByb3BDTU5vZGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9VUkFOR0UgPSAidXJhbmdlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcENNVVJhbmdlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZ2V0SWRlbnRpZmllcnMoU2V0IGluZGVudHMpIHsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BDTVVSYW5nZSBnZXRJbnN0YW5jZU9mKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBpbml0aWFsaXplCi0JCWlmIChpbnN0YW5jZXMgPT0gbnVsbCkKLQkJCWluc3RhbmNlcyA9IG5ldyBIYXNodGFibGUoMTApOwotCi0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQkvLyBxdWVyeQotCQlPYmplY3Qgbm9kZSA9IGluc3RhbmNlcy5nZXQobmFtZSk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZXR1cm4gKFByb3BDTVVSYW5nZSkgbm9kZTsKLQotCQkvLyByZWdpc3RlcgotCQlub2RlID0gbmV3IFByb3BDTVVSYW5nZShuYW1lKTsKLQkJaW5zdGFuY2VzLnB1dChuYW1lLCBub2RlKTsKLQotCQlyZXR1cm4gKFByb3BDTVVSYW5nZSkgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9VTklDT0RFX1JBTkdFOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZ2V0VmFsdWVzKENvbGxlY3Rpb24gdmFsdWVzKSB7Ci0JCWlmICh2YWx1ZXMgIT0gbnVsbCAmJiAhdmFsdWVzLmNvbnRhaW5zKHRoaXMpKQotCQkJdmFsdWVzLmFkZCh0aGlzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTZiYTM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wQ01VdGlsIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtaW51cyhDb2xsZWN0aW9uIHNyYywgQ29sbGVjdGlvbiByZWYpIHsKLQkJSXRlcmF0b3IgaXQgPSByZWYuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCWlmIChzcmMuY29udGFpbnMob2JqKSkKLQkJCQlzcmMucmVtb3ZlKG9iaik7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwbHVzKENvbGxlY3Rpb24gc3JjLCBDb2xsZWN0aW9uIHJlZikgewotCQlJdGVyYXRvciBpdCA9IHJlZi5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKCFzcmMuY29udGFpbnMob2JqKSkKLQkJCQlzcmMuYWRkKG9iaik7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NTU0NvbnRlbnRQcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NTU0NvbnRlbnRQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYmM1ODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9DU1NDb250ZW50UHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzOwotCi0vKioKLSAqIFByb3BlcnRpZXMgY29uc3RhbnRzIHVzZWQgYnkgQ1NTLiBDbGllbnRzIHNob3VsZCBvbmx5IHJlYWQgYW5kIG1vZGlmeSB0aGUKLSAqIENTUyBwcm9wZXJ0aWVzIHByb2dyYW1tYXRpY2FsbHkgdXNpbmcgdGhpcyBjbGFzcy4KLSAqIAotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgQ1NTQ29udGVudFByb3BlcnRpZXMgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTQ09SRV9JRCA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0tFWSA9ICI8cHJvamVjdD4iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBjc3MgcHJvZmlsZSB0byB1c2Ugd2hlbiBub25lIGlzIHNwZWNpZmllZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19QUk9GSUxFID0gImNzcy1wcm9maWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogR2VuZXJhdGVzIGEgcHJlZmVyZW5jZSBrZXkgYmFzZWQgb24gcmVzb3VyY2VQYXRoCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlUGF0aAotCSAqICAgICAgICAgICAgdGhlIHBhdGggdGhlIGtleSB3aWxsIGJlIGJhc2VkIG9mZiBvZgotCSAqIEByZXR1cm4gcHJlZmVyZW5jZSBrZXkgYmFzZWQgb24gcmVzb3VyY2VQYXRoIChiYXNpY2FsbHkgdGhlCi0JICogICAgICAgICByZXNvdXJjZVBhdGggd2l0aG91dCB0aGUgZmlsZW5hbWUpOyBQUk9KRUNUX0tFWSBpZiByZXNvdXJjZVBhdGgKLQkgKiAgICAgICAgIGlzIG51bGwKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldEtleUZvcihJUGF0aCByZXNvdXJjZVBhdGgpIHsKLQkJU3RyaW5nIGtleSA9IFBST0pFQ1RfS0VZOwotCQlpZiAocmVzb3VyY2VQYXRoICE9IG51bGwgJiYgcmVzb3VyY2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJa2V5ID0gcmVzb3VyY2VQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4ga2V5OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJlZmVyZW5jZXMgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb2plY3Qgc2NvcGUgYW5kCi0JICogcHJlZmVyZW5jZSBrZXkgKHN1Yk5vZGUpIElmIGNyZWF0ZSBpcyB0cnVlLCB0aGUgcHJlZmVyZW5jZSBub2RlIHdpbGwgYmUKLQkgKiBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0Ci0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0IHRoZSBwcmVmZXJlbmNlIG5vZGUgaXMgdW5kZXIKLQkgKiBAcGFyYW0gcHJlZmVyZW5jZUtleQotCSAqICAgICAgICAgICAgdGhlIHN1Ym5vZGUvY2F0ZWdvcnkgdGhlIHByZWZlcmVuY2Ugbm9kZSBpcyBsb2NhdGVkIGluCi0JICogQHBhcmFtIGNyZWF0ZQotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgYSBwcmVmZXJlbmNlIG5vZGUgd2lsbCBiZSBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdAotCSAqICAgICAgICAgICAgYWxyZWFkeSBleGlzdAotCSAqIEByZXR1cm4gUHJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm9qZWN0IHNjb3BlIGFuZAotCSAqICAgICAgICAgcHJlZmVyZW5jZSBrZXkuIG51bGwgaWYgb25lIGNvdWxkIG5vdCBiZSBmb3VuZCBhbmQgY3JlYXRlIGlzCi0JICogICAgICAgICBmYWxzZQotCSAqLwotCXN0YXRpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcyhJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgcHJlZmVyZW5jZUtleSwgYm9vbGVhbiBjcmVhdGUpIHsKLQkJaWYgKGNyZWF0ZSkKLQkJCS8vIGNyZWF0ZSBhbGwgbm9kZXMgZG93biB0byB0aGUgb25lIHdlIGFyZSBpbnRlcmVzdGVkIGluCi0JCQlyZXR1cm4gbmV3IFByb2plY3RTY29wZShwcm9qZWN0KS5nZXROb2RlKENTU0NPUkVfSUQpLm5vZGUocHJlZmVyZW5jZUtleSk7Ci0JCS8vIGJlIGNhcmVmdWwgbG9va2luZyB1cCBmb3Igb3VyIG5vZGUgc28gbm90IHRvIGNyZWF0ZSBhbnkgbm9kZXMgYXMKLQkJLy8gc2lkZSBlZmZlY3QKLQkJUHJlZmVyZW5jZXMgbm9kZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFJvb3ROb2RlKCkubm9kZShQcm9qZWN0U2NvcGUuU0NPUEUpOwotCQl0cnkgewotCQkJLy8gVE9ETyBvbmNlIGJ1ZyA5MDUwMCBpcyBmaXhlZCwgc2hvdWxkIGJlIGFzIHNpbXBsZSBhcyB0aGlzOgotCQkJLy8gU3RyaW5nIHBhdGggPSBwcm9qZWN0LmdldE5hbWUoKSArIElQYXRoLlNFUEFSQVRPUiArCi0JCQkvLyBSZXNvdXJjZXNQbHVnaW4uUElfUkVTT1VSQ0VTICsgSVBhdGguU0VQQVJBVE9SICsKLQkJCS8vIEVOQ09ESU5HX1BSRUZfTk9ERTsKLQkJCS8vIHJldHVybiBub2RlLm5vZGVFeGlzdHMocGF0aCkgPyBub2RlLm5vZGUocGF0aCkgOiBudWxsOwotCQkJLy8gZm9yIG5vdywgdGFrZSB0aGUgbG9uZyB3YXkKLQkJCWlmICghbm9kZS5ub2RlRXhpc3RzKHByb2plY3QuZ2V0TmFtZSgpKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCW5vZGUgPSBub2RlLm5vZGUocHJvamVjdC5nZXROYW1lKCkpOwotCQkJaWYgKCFub2RlLm5vZGVFeGlzdHMoQ1NTQ09SRV9JRCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlub2RlID0gbm9kZS5ub2RlKENTU0NPUkVfSUQpOwotCQkJaWYgKCFub2RlLm5vZGVFeGlzdHMocHJlZmVyZW5jZUtleSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gbm9kZS5ub2RlKHByZWZlcmVuY2VLZXkpOwotCQl9Ci0JCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gbm9kZUV4aXN0cyBmYWlsZWQKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJDb3VsZCBub3QgcmV0cmlldmUgcHJlZmVyZW5jZSBub2RlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSBpbiB0aGUgZ2l2ZW4gY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgcHJvcGVydHkga2V5Ci0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBjb250ZXh0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGNvbnRleHQgaXMKLQkgKiAgICAgICAgICAgIGF2YWlsYWJsZSBhbmQgdGhlIHdvcmtzcGFjZSBzZXR0aW5nIHNob3VsZCBiZSB0YWtlbi4gTm90ZQotCSAqICAgICAgICAgICAgdGhhdCBwYXNzaW5nIDxjb2RlPm51bGw8L2NvZGU+IHNob3VsZCBiZSBhdm9pZGVkLgotCSAqIEBwYXJhbSByZWN1cnNlCi0JICogICAgICAgICAgICB3aGV0aGVyIHRoZSBwYXJlbnQgc2hvdWxkIGJlIHF1ZXJpZWQgdGlsbCBwcm9wZXJ0eSBpcyBmb3VuZAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBmb3IgdGhlIGtleS4KLQkgKiBAc2luY2UgMS4xCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSwgSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIHJlY3Vyc2UpIHsKLQkJU3RyaW5nIHZhbCA9IG51bGw7Ci0JCS8vIGJvb2xlYW4gcHJlZmVyZW5jZUZvdW5kID0gZmFsc2U7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0UHJlZmVyZW5jZXMocHJvamVjdCwga2V5LCBmYWxzZSk7Ci0JCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQkJdmFsID0gaW50ZXJuYWxHZXRQcm9wZXJ0eShyZXNvdXJjZSwgcmVjdXJzZSwgcHJlZmVyZW5jZXMpOwotCQkJCQkvLyBwcmVmZXJlbmNlRm91bmQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBXb3JrYmVuY2ggcHJlZmVyZW5jZSBtYXkgbm90IGJlIG5lZWRlZCBzbyBsZWF2ZSBvdXQgZm9yIG5vdwotCQkvLyAvLyBubyBwcmVmZXJlbmNlcyBmb3VuZCAtIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLAotCQkvLyAvLyBzaG9ydC1jaXJjdWl0Ci0JCS8vIC8vIGxvb2t1cCBieSBmYWxsaW5nIGJhY2sgdG8gd29ya3NwYWNlJ3MgZGVmYXVsdAotCQkvLyAvLyBzZXR0aW5nCi0JCS8vIGlmICghcHJlZmVyZW5jZUZvdW5kKQotCQkvLyB2YWwgPSBnZXRXb3JrYmVuY2hQcmVmZXJlbmNlKGtleSk7Ci0JCXJldHVybiB2YWw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGludGVybmFsR2V0UHJvcGVydHkoSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIHJlY3Vyc2UsIFByZWZlcmVuY2VzIHByZWZlcmVuY2VzKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IHByZWZlcmVuY2VzLmdldChnZXRLZXlGb3IocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSksIG51bGwpOwotCQlpZiAodmFsdWUgPT0gbnVsbCAmJiByZXNvdXJjZSAhPSByZXNvdXJjZS5nZXRQcm9qZWN0KCkgJiYgcmVjdXJzZSkgewotCQkJdmFsdWUgPSBwcmVmZXJlbmNlcy5nZXQoZ2V0S2V5Rm9yKG51bGwpLCBudWxsKTsKLQkJfQotCi0JCS8vIFdvcmtiZW5jaCBwcmVmZXJlbmNlIG1heSBub3QgYmUgbmVlZGVkIHNvIGxlYXZlIG91dCBmb3Igbm93Ci0JCS8vIC8vIGVuc3VyZSB3ZSBkZWZhdWx0IHRvIHRoZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZSBpZiBub25lIGlzIGZvdW5kCi0JCS8vIHJldHVybiB2YWx1ZSA9PSBudWxsID8gZ2V0V29ya2JlbmNoUHJlZmVyZW5jZShrZXkpIDogdmFsdWU7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSBpbiB0aGUgZ2l2ZW4gY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgcHJvcGVydHkga2V5Ci0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBjb250ZXh0LiBOb3RlIGNvbnRleHQgY2Fubm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSB2YWx1ZSB0byBzZXQgZm9yIHRoZSBrZXkuIElmIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICAgICB0aGUga2V5IGlzIHJlbW92ZWQgZnJvbSBwcm9wZXJ0aWVzLgotCSAqIEBzaW5jZSAxLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgdmFsdWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRQcmVmZXJlbmNlcyhwcm9qZWN0LCBrZXksIHRydWUpOwotCQkJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkJCQlwcmVmZXJlbmNlcy5yZW1vdmUoZ2V0S2V5Rm9yKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpKTsKLQkJCQllbHNlCi0JCQkJCXByZWZlcmVuY2VzLnB1dChnZXRLZXlGb3IocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSksIHZhbHVlKTsKLQkJCQl0cnkgewotCQkJCQkvLyBzYXZlIGNoYW5nZXMKLQkJCQkJcHJlZmVyZW5jZXMuZmx1c2goKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1NTQ09SRV9JRCwgSVN0YXR1cy5FUlJPUiwgIlVuYWJsZSB0byBzZXQgcHJvcGVydHkiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gV29ya2JlbmNoIHByZWZlcmVuY2UgbWF5IG5vdCBiZSBuZWVkZWQgc28gbGVhdmUgb3V0IGZvciBub3cKLQkJLy8ganVzdCBzZXQgYSBwcmVmZXJlbmNlIGluIHRoZSBpbnN0YW5jZSBzY29wZQotCQkvLyBpZiAoIXByZWZlcmVuY2VGb3VuZCkgewotCQkvLyBzZXRXb3JrYmVuY2hQcmVmZXJlbmNlKGtleSk7Ci0JCS8vIH0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9DU1NDb250ZW50UHJvcGVydGllc01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVhNGI4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLXB1YmxpYyBjbGFzcyBDU1NDb250ZW50UHJvcGVydGllc01hbmFnZXIgewotCXB1YmxpYyBDU1NDb250ZW50UHJvcGVydGllc01hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gbmV3IFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJZkpvYiA9IG5ldyBDb250ZW50UHJvcGVydGllc01hbmFnZXJKb2IoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDU1NDb250ZW50UHJvcGVydGllc01hbmFnZXIgX2luc3RhbmNlID0gbnVsbDsKLQlwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotCUNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlckpvYiBmSm9iOwotCi0JLyoqCi0JICogVGhpcyBqb2IgaW1wbGVtZW50YXRpb24gaXMgdXNlZCB0byBhbGxvdyB0aGUgcmVzb3VyY2UgY2hhbmdlIGxpc3RlbmVyCi0JICogdG8gc2NoZWR1bGUgb3BlcmF0aW9ucyB0aGF0IG5lZWQgdG8gbW9kaWZ5IHRoZSB3b3Jrc3BhY2UuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBDb250ZW50UHJvcGVydGllc01hbmFnZXJKb2IgZXh0ZW5kcyBKb2IgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVElFU19VUERBVEVfREVMQVkgPSA1MDA7Ci0JCXByaXZhdGUgTGlzdCBhc3luY0NoYW5nZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHVibGljIENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlckpvYigpIHsKLQkJCXN1cGVyKENTU0NvcmVNZXNzYWdlcy5DU1NDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmcpOwotCQkJc2V0U3lzdGVtKHRydWUpOwotCQkJc2V0UHJpb3JpdHkoSm9iLklOVEVSQUNUSVZFKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZENoYW5nZXMoU2V0IG5ld0NoYW5nZXMpIHsKLQkJCWlmIChuZXdDaGFuZ2VzLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm47Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCWFzeW5jQ2hhbmdlcy5hZGRBbGwobmV3Q2hhbmdlcyk7Ci0JCQkJYXN5bmNDaGFuZ2VzLm5vdGlmeSgpOwotCQkJfQotCQkJc2NoZWR1bGUoUFJPUEVSVElFU19VUERBVEVfREVMQVkpOwotCQl9Ci0KLQkJcHVibGljIElQcm9qZWN0IGdldE5leHRDaGFuZ2UoKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCXJldHVybiBhc3luY0NoYW5nZXMuaXNFbXB0eSgpID8gbnVsbCA6IChJUHJvamVjdCkgYXN5bmNDaGFuZ2VzLnJlbW92ZShhc3luY0NoYW5nZXMuc2l6ZSgpIC0gMSk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlNdWx0aVN0YXR1cyByZXN1bHQgPSBuZXcgTXVsdGlTdGF0dXMoQ1NTQ29udGVudFByb3BlcnRpZXMuQ1NTQ09SRV9JRCwgSVJlc291cmNlU3RhdHVzLkZBSUxFRF9TRVRUSU5HX0NIQVJTRVQsIENTU0NvcmVNZXNzYWdlcy5DU1NDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmcsIG51bGwpOwotCQkJbW9uaXRvciA9IG1vbml0b3IgPT0gbnVsbCA/IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkgOiBtb25pdG9yOwotCQkJdHJ5IHsKLQkJCQltb25pdG9yLmJlZ2luVGFzayhDU1NDb3JlTWVzc2FnZXMuQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nLCBhc3luY0NoYW5nZXMuc2l6ZSgpKTsKLQkJCQl0cnkgewotCQkJCQlJUHJvamVjdCBuZXh0OwotCQkJCQl3aGlsZSAoKG5leHQgPSBnZXROZXh0Q2hhbmdlKCkpICE9IG51bGwpIHsKLQkJCQkJCS8vIGp1c3QgZXhpdCBpZiB0aGUgc3lzdGVtIGlzIHNodXR0aW5nIGRvd24gb3IgaGFzCi0JCQkJCQkvLyBiZWVuIHNodXQgZG93bgotCQkJCQkJLy8gaXQgaXMgdG9vIGxhdGUgdG8gY2hhbmdlIHRoZSB3b3Jrc3BhY2UgYXQgdGhpcwotCQkJCQkJLy8gcG9pbnQgYW55d2F5Ci0JCQkJCQlpZiAoUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5vc2dpIikuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuQUNUSVZFKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIHNhdmUgdGhlIHByZWZlcmVuY2VzIG5vZGVzCi0JCQkJCQkJaWYgKG5leHQuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCQkJLy8gc2F2ZSBjc3MgcHJvZmlsZSBwcmVmZXJlbmNlcwotCQkJCQkJCQlQcmVmZXJlbmNlcyBwcm9qZWN0UHJlZnMgPSBDU1NDb250ZW50UHJvcGVydGllcy5nZXRQcmVmZXJlbmNlcyhuZXh0LCBDU1NDb250ZW50UHJvcGVydGllcy5DU1NfUFJPRklMRSwgZmFsc2UpOwotCQkJCQkJCQlpZiAocHJvamVjdFByZWZzICE9IG51bGwpCi0JCQkJCQkJCQlwcm9qZWN0UHJlZnMuZmx1c2goKTsKLQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIHdlIGdvdCBhbiBlcnJvciBzYXZpbmcKLQkJCQkJCQlTdHJpbmcgZGV0YWlsTWVzc2FnZSA9IE5MUy5iaW5kKENTU0NvcmVNZXNzYWdlcy5DU1NDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmcsIG5leHQuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJCQkJcmVzdWx0LmFkZChuZXcgU3RhdHVzKDEgPDwgKElSZXNvdXJjZVN0YXR1cy5GQUlMRURfU0VUVElOR19DSEFSU0VUICUgMTAwIC8gMzMpLCBSZXNvdXJjZXNQbHVnaW4uUElfUkVTT1VSQ0VTLCBJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX1NFVFRJTkdfQ0hBUlNFVCwgZGV0YWlsTWVzc2FnZSwgZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCX0KLQkJCQljYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3Nob3VsZFJ1bigpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSdW4oKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCXJldHVybiAhYXN5bmNDaGFuZ2VzLmlzRW1wdHkoKTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JCXByaXZhdGUgdm9pZCBwcm9jZXNzRW50cnlDaGFuZ2VzKElSZXNvdXJjZURlbHRhIHByb2plY3REZWx0YSwgU2V0IHByb2plY3RzVG9TYXZlKSB7Ci0JCQkvLyBjaGVjayBlYWNoIHJlc291cmNlIHdpdGggY3NzIGNvbnRlbnQgc2V0dGluZyB0byBzZWUgaWYgaXQgaGFzCi0JCQkvLyBiZWVuIG1vdmVkL2RlbGV0ZWQKLQkJCWJvb2xlYW4gcmVzb3VyY2VDaGFuZ2VzID0gZmFsc2U7Ci0KLQkJCS8vIHByb2plY3QgYWZmZWN0ZWQKLQkJCUlQcm9qZWN0IGN1cnJlbnRQcm9qZWN0ID0gKElQcm9qZWN0KSBwcm9qZWN0RGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQotCQkJcmVzb3VyY2VDaGFuZ2VzID0gcHJvY2Vzc1ByZWZlcmVuY2VzKGN1cnJlbnRQcm9qZWN0LCBDU1NDb250ZW50UHJvcGVydGllcy5DU1NfUFJPRklMRSwgcHJvamVjdERlbHRhLCBwcm9qZWN0c1RvU2F2ZSk7Ci0KLQkJCS8vIGlmIHRoZXJlIHdhcyBhIHByZWZlcmVuY2Uga2V5IGNoYW5nZSwgbmVlZCB0byBzYXZlIHByZWZlcmVuY2VzCi0JCQlpZiAocmVzb3VyY2VDaGFuZ2VzKQotCQkJCXByb2plY3RzVG9TYXZlLmFkZChjdXJyZW50UHJvamVjdCk7Ci0JCX0KLQotCQkvKioKLQkJICogR29lcyB0aHJvdWdoIGFsbCB0aGUgcmVzb3VyY2UtZGVwZW5kZW50IHByZWZlcmVuY2VzIGFzc29jaWF0ZWQgd2l0aAotCQkgKiBjdXJyZW50UHJvamVjdCAmIGtleSBhbmQgdXBkYXRlcyB0aGUgcHJlZmVyZW5jZSBrZXlzIGlmIG5lZWRlZAotCQkgKiBiYXNlZCBvbiBwcm9qZWN0RGVsdGEKLQkJICogCi0JCSAqIEBwYXJhbSBjdXJyZW50UHJvamVjdAotCQkgKiAgICAgICAgICAgIGN1cnJlbnQgcHJvamVjdCBvZiB0aGUgcHJlZmVyZW5jZXMgdG8gYmUgbG9va2VkIGF0Ci0JCSAqIEBwYXJhbSBrZXkKLQkJICogICAgICAgICAgICBjdXJyZW50IGtleS9zdWJjYXRlZ29yeSBvZiB0aGUgcHJlZmVyZW5jZXMgdG8gYmUgbG9va2VkCi0JCSAqICAgICAgICAgICAgYXQKLQkJICogQHBhcmFtIHByb2plY3REZWx0YQotCQkgKiAgICAgICAgICAgIHRoZSBjaGFuZ2VzIHRvIHByb2Nlc3MgdGhlIHByZWZlcmVuY2Uga2V5cyBhZ2FpbnN0Ci0JCSAqIEBwYXJhbSBwcm9qZWN0c1RvU2F2ZQotCQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0cyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZC9zYXZlZAotCQkgKiBAcmV0dXJuIHRydWUgaWYgY3VycmVudFByb2plY3QncyBwcmVmZXJlbmNlcyB3ZXJlIG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc1ByZWZlcmVuY2VzKElQcm9qZWN0IGN1cnJlbnRQcm9qZWN0LCBTdHJpbmcga2V5LCBJUmVzb3VyY2VEZWx0YSBwcm9qZWN0RGVsdGEsIFNldCBwcm9qZWN0c1RvU2F2ZSkgewotCQkJYm9vbGVhbiByZXNvdXJjZUNoYW5nZXMgPSBmYWxzZTsKLQotCQkJLy8gZ2V0IHRoZSBwcm9qZWN0LWtleSBwcmVmZXJlbmNlIG5vZGUKLQkJCVByZWZlcmVuY2VzIHByb2plY3RQcmVmcyA9IENTU0NvbnRlbnRQcm9wZXJ0aWVzLmdldFByZWZlcmVuY2VzKGN1cnJlbnRQcm9qZWN0LCBrZXksIGZhbHNlKTsKLQkJCWlmIChwcm9qZWN0UHJlZnMgPT0gbnVsbCkKLQkJCQkvLyBubyBwcmVmZXJlbmNlcyBmb3IgdGhpcyBwcm9qZWN0LWtleSwganVzdCBiYWlsCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJU3RyaW5nW10gYWZmZWN0ZWRSZXNvdXJjZXM7Ci0JCQl0cnkgewotCQkJCWFmZmVjdGVkUmVzb3VyY2VzID0gcHJvamVjdFByZWZzLmtleXMoKTsKLQkJCX0KLQkJCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIHByb2JsZW1zIHdpdGggdGhlIHByb2plY3Qgc2NvcGUuLi4gd2UgZ29ubmEgbWlzcyB0aGUKLQkJCQkvLyBjaGFuZ2VzIChidXQgd2lsbCBsb2cpCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIlByb2JsZW0gcmV0cmVpdmluZyBKU1AgRnJhZ21lbnQgcHJlZmVyZW5jZXMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJLy8gZ28gdGhyb3VnaCBlYWNoIHByZWZlcmVuY2Uga2V5ICh3aGljaCBpcyByZWFsbHkgYSBmaWxlIG5hbWUpCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFmZmVjdGVkUmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gc2VlIGlmIHByZWZlcmVuY2Uga2V5L2ZpbGUgbmFtZSB3YXMgZmlsZSB0aGF0IHdhcyBjaGFuZ2VkCi0JCQkJSVJlc291cmNlRGVsdGEgbWVtYmVyRGVsdGEgPSBwcm9qZWN0RGVsdGEuZmluZE1lbWJlcihuZXcgUGF0aChhZmZlY3RlZFJlc291cmNlc1tpXSkpOwotCQkJCS8vIG5vIGNoYW5nZXMgZm9yIHRoZSBnaXZlbiByZXNvdXJjZQotCQkJCWlmIChtZW1iZXJEZWx0YSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAobWVtYmVyRGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCQkJcmVzb3VyY2VDaGFuZ2VzID0gdHJ1ZTsKLQkJCQkJLy8gcmVtb3ZlIHRoZSBzZXR0aW5nIGZvciB0aGUgb3JpZ2luYWwgbG9jYXRpb24KLQkJCQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IHByb2plY3RQcmVmcy5nZXQoYWZmZWN0ZWRSZXNvdXJjZXNbaV0sIG51bGwpOwotCQkJCQlwcm9qZWN0UHJlZnMucmVtb3ZlKGFmZmVjdGVkUmVzb3VyY2VzW2ldKTsKLQkJCQkJaWYgKChtZW1iZXJEZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfVE8pICE9IDApIHsKLQkJCQkJCS8vIGlmIG1vdmluZywgY29weSB0aGUgc2V0dGluZyBmb3IgdGhlIG5ldyBsb2NhdGlvbgotCQkJCQkJSVByb2plY3QgdGFyZ2V0UHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChtZW1iZXJEZWx0YS5nZXRNb3ZlZFRvUGF0aCgpLnNlZ21lbnQoMCkpOwotCQkJCQkJUHJlZmVyZW5jZXMgdGFyZ2V0UHJlZnMgPSBDU1NDb250ZW50UHJvcGVydGllcy5nZXRQcmVmZXJlbmNlcyh0YXJnZXRQcm9qZWN0LCBrZXksIHRydWUpOwotCQkJCQkJdGFyZ2V0UHJlZnMucHV0KENTU0NvbnRlbnRQcm9wZXJ0aWVzLmdldEtleUZvcihtZW1iZXJEZWx0YS5nZXRNb3ZlZFRvUGF0aCgpKSwgY3VycmVudFZhbHVlKTsKLQkJCQkJCWlmICh0YXJnZXRQcm9qZWN0ICE9IGN1cnJlbnRQcm9qZWN0KQotCQkJCQkJCXByb2plY3RzVG9TYXZlLmFkZCh0YXJnZXRQcm9qZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXNvdXJjZUNoYW5nZXM7Ci0JCX0KLQotCQkvKioKLQkJICogRm9yIGFueSBjaGFuZ2UgdG8gdGhlIGVuY29kaW5nIGZpbGUgb3IgYW55IHJlc291cmNlIHdpdGggZW5jb2RpbmcKLQkJICogc2V0LCBqdXN0IGRpc2NhcmQgdGhlIGNhY2hlIGZvciB0aGUgY29ycmVzcG9uZGluZyBwcm9qZWN0LgotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCQlpZiAoZGVsdGEgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlJUmVzb3VyY2VEZWx0YVtdIHByb2plY3REZWx0YXMgPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQkvLyBwcm9jZXNzIGVhY2ggcHJvamVjdCBpbiB0aGUgZGVsdGEKLQkJCVNldCBwcm9qZWN0c1RvU2F2ZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3REZWx0YXMubGVuZ3RoOyBpKyspCi0JCQkJLy8gbm90aGluZyB0byBkbyBpZiBhIHByb2plY3QgaGFzIGJlZW4gYWRkZWQvcmVtb3ZlZC9tb3ZlZAotCQkJCWlmIChwcm9qZWN0RGVsdGFzW2ldLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICYmIChwcm9qZWN0RGVsdGFzW2ldLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5PUEVOKSA9PSAwKQotCQkJCQlwcm9jZXNzRW50cnlDaGFuZ2VzKHByb2plY3REZWx0YXNbaV0sIHByb2plY3RzVG9TYXZlKTsKLQkJCWZKb2IuYWRkQ2hhbmdlcyhwcm9qZWN0c1RvU2F2ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHN0YXJ0dXAoKSB7Ci0JCV9pbnN0YW5jZSA9IG5ldyBDU1NDb250ZW50UHJvcGVydGllc01hbmFnZXIoKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoX2luc3RhbmNlLmZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoX2luc3RhbmNlLmZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQkJX2luc3RhbmNlID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0J5dGVSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmI4NzZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLQotLyoqCi0gKiBUaGlzIGlzIGFuICJhZGFwdGVyIiBjbGFzcywgc2ltcGx5IHRvIGdldCBpbiBpbnB1dCBzdHJlYW0gdG8gYWN0IGxpa2UgYQotICogcmVhZGVyLiBXZSBjb3VsZCBub3QgdXNlIElucHV0U3RyZWFtUmVhZGVyIGRpcmVjdGx5IGJlY2F1c2UgaXRzIGludGVybmFsCi0gKiBidWZmZXJzIGFyZSBub3QgY29udHJvbGxhYmxlLCBhbmQgaXQgc29tZXRpbWVzIHB1bGxzIHRvbyBtdWNoIG91dCBvZiBpbnB1dAotICogc3RyZWFtIChldmVuIHdoZW4gaXQgd2Fzbid0IG5lZWRlZCBmb3Igb3VyIHB1cnBvc2VzKS4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIGhpZ2hseSBzcGVjaWFsaXplZCBhbmQgYnkgbm8gbWVhbnMgbWVhbnQgdG8gYmUKLSAqIGdlbmVyYWwgcHVycG9zZS4gSXRzIHVzZSBpcyByZXN0cmljdGVkIHRvIHRob3NlIGNhc2VzIHdoZXJlIHRoZSBpbnB1dAotICogc3RyZWFtIGNhbiBiZSByZWdhcmRlZCBhcyBhc2NpaSBqdXN0IGxvbmcgZW5vdWdoIHRvIGRldGVybWluZSB3aGF0IHRoZSByZWFsCi0gKiBlbmNvZGluZyBzaG91bGQgYmUuCi0gKi8KLQotcHVibGljIGNsYXNzIEJ5dGVSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IENvZGVkSU8uTUFYX0JVRl9TSVpFOwotCi0JcHJvdGVjdGVkIGJ5dGVbXSBmQnVmZmVyOwotCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIGZJbnB1dFN0cmVhbTsKLQotCXByb3RlY3RlZCBCeXRlUmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXRoaXMoaW5wdXRTdHJlYW0sIERFRkFVTFRfQlVGRkVSX1NJWkUpOwotCQlpZiAoIWlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVJlYWRlciBpcyByZXF1aXJlZCB0byBoYXZlIGEgcmVzZXR0YWJsZSBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIEJ5dGVSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGludCBzaXplKSB7Ci0JCXRoaXMuZklucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5mQnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZEFoZWFkTGltaXQpIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0ubWFyayhyZWFkQWhlYWRMaW1pdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGIwID0gdGhpcy5mSW5wdXRTdHJlYW0ucmVhZCgpOwotCQlyZXR1cm4gKGIwICYgMHgwMEZGKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoY2hhciBjaFtdLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAobGVuZ3RoID4gdGhpcy5mQnVmZmVyLmxlbmd0aCkgewotCQkJbGVuZ3RoID0gdGhpcy5mQnVmZmVyLmxlbmd0aDsKLQkJfQotCi0JCWludCBjb3VudCA9IHRoaXMuZklucHV0U3RyZWFtLnJlYWQodGhpcy5mQnVmZmVyLCAwLCBsZW5ndGgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJaW50IGIwID0gdGhpcy5mQnVmZmVyW2ldOwotCQkJLy8gdGhlIDB4MDBGRiBpcyB0byAibG9zZSIgdGhlIG5lZ2F0aXZlIGJpdHMgZmlsbGVkIGluIHRoZSBieXRlIHRvCi0JCQkvLyBpbnQgY29udmVyc2lvbgotCQkJLy8gKGFuZCB3aGljaCB3b3VsZCBiZSB0aGVyZSBpZiBjYXN0IGRpcmVjdGx5IGZyb20gYnl0ZSB0byBjaGFyKS4KLQkJCWNoYXIgYzAgPSAoY2hhcikgKGIwICYgMHgwMEZGKTsKLQkJCWNoW29mZnNldCArIGldID0gYzA7Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZklucHV0U3RyZWFtLmF2YWlsYWJsZSgpID4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLnJlc2V0KCk7Ci0JfQotCi0JcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmZJbnB1dFN0cmVhbS5za2lwKG4pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9DU1NIZWFkVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NTU0hlYWRUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJjNWVhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NTU0hlYWRUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjIuMiBvbiAxLzI3LzA0IDY6NDIgUE0gKi8KLQotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IDxhCi0gKiBocmVmPSJodHRwOi8vd3d3LmluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUvfmtsZWluZy9qZmxleC8iPkpGbGV4IDwvYT4gMS4yLjIKLSAqIG9uIDEvMjcvMDQgNjo0MiBQTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXIuamZsZXg8L3R0PgotICovCi1wdWJsaWMgY2xhc3MgQ1NTSGVhZFRva2VuaXplciB7Ci0KLQkvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0JLyoqIGxleGljYWwgc3RhdGVzICovCi0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBVbkRlbGltaXRlZFN0cmluZyA9IDEyOwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IERRX1NUUklORyA9IDg7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1FfU1RSSU5HID0gMTA7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MRGVjbCA9IDI7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgUXVvdGVkQXR0cmlidXRlVmFsdWUgPSA2OwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IENIQVJTRVRfUlVMRSA9IDQ7Ci0KLQkvKioKLQkgKiBZWV9MRVhTVEFURVtsXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotCSAqIFlZX0xFWFNUQVRFW2wrMV0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwgYXQgdGhlCi0JICogYmVnaW5uaW5nIG9mIGEgbGluZSBsIGlzIG9mIHRoZSBmb3JtIGwgPSAyKmssIGsgYSBub24gbmVnYXRpdmUgaW50ZWdlcgotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBZWV9MRVhTVEFURVtdID0gezAsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDd9OwotCi0JLyoqCi0JICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0JICovCi0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAiXDExXDBcMVw2XDFcMTFcMlwwXDFcMTBcMjJcMFwxXDZcMVwwXDFcMzZcMlwwIiArICJcMVw0MVwxXDBcMVwzN1w3XDBcMVw0MFwxM1wwXDFcMzVcMVwxMlwxXDdcMVwzNCIgKyAiXDFcMTNcMVwxN1wxXDIyXDFcMFwxXDIwXDFcMzFcMVwyNVwxXDBcMVwzM1wxXDIxIiArICJcMVwzMlwyXDBcMVwxNlwxXDE1XDFcMjdcMVwzMFwyXDBcMVwyM1wxXDI0XDFcMjYiICsgIlwzXDBcMVwxNFwxMFwwXDFcMjJcMVwwXDFcMjBcMVwzMVwxXDI1XDFcMFwxXDMzIiArICJcMVwyMVwxXDMyXDJcMFwxXDE2XDFcMTVcMVwyN1wxXDMwXDJcMFwxXDIzXDFcMjQiICsgIlwxXDI2XDNcMFwxXDE0XDEwMlwwXDFcNFwzXDBcMVw1XDE3XDBcMVwzXDE2XDAiICsgIlwxXDFcMjBcMFwxXDNcMTZcMFwxXDFcMVwyXDE3MFwwXDFcMlx1ZmU4N1wwIjsKLQotCS8qKgotCSAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotCSAqLwotCWZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXJbXSB5eWNtYXAgPSB5eV91bnBhY2tfY21hcCh5eWNtYXBfcGFja2VkKTsKLQotCi0JLyogZXJyb3IgY29kZXMgKi8KLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotCWZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0JLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotCWZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLCAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLCAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSJ9OwotCi0JLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQlwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotCS8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLQkvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCXByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLQkvKioKLQkgKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzIHRoZSBzb3VyY2UKLQkgKiBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nCi0JICovCi0JcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOwotCi0JLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0JcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0JLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0JcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLQkvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotCS8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLQlwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLQkvKioKLQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQgZnJvbQotCSAqIGlucHV0Ci0JICovCi0JcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotCi0JLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCXByaXZhdGUgaW50IHl5Y2hhcjsKLQotCi0JLyoqCi0JICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT50aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhCi0JICogbGluZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB5eV9hdEJPTDsKLQotCS8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PnRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQlwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLQkvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0JcHJpdmF0ZSBib29sZWFuIHl5X2VvZl9kb25lOwotCi0JLyogdXNlciBjb2RlOiAqLwotCi0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTW9yZSA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsKLQlTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsKLQotCi0KLQlwdWJsaWMgQ1NTSGVhZFRva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChSZWFkZXIgaW4pIHsKLQkJLyogdGhlIGlucHV0IGRldmljZSAqLwotCQl5eV9yZWFkZXIgPSBpbjsKLQotCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JCXl5X3N0YXRlID0gMDsKLQotCQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0JCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLQkJLyoKLQkJICogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcyB0aGUKLQkJICogc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcKLQkJICovCi0JCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKSAwKTsKLQotCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCQl5eV9tYXJrZWRQb3MgPSAwOwotCi0JCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0JCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotCQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLQkJeXlfY3VycmVudFBvcyA9IDA7Ci0KLQkJLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0JCXl5X3N0YXJ0UmVhZCA9IDA7Ci0KLQkJLyoqCi0JCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotCQkgKiBmcm9tIGlucHV0Ci0JCSAqLwotCQl5eV9lbmRSZWFkID0gMDsKLQotCi0JCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCQl5eWNoYXIgPSAwOwotCi0KLQkJLyoqCi0JCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+dGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYQotCQkgKiBsaW5lCi0JCSAqLwotCQl5eV9hdEJPTCA9IGZhbHNlOwotCi0JCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQkJeXlfYXRFT0YgPSBmYWxzZTsKLQotCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLQkJeXlfZW9mX2RvbmUgPSBmYWxzZTsKLQotCi0JCWZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0KLQkJaGFzTW9yZSA9IHRydWU7Ci0KLQkJLy8gaXRzIGEgbGl0dGxlIHdhc3RlZnVsIHRvICJ0aHJvdyBhd2F5IiBmaXJzdCBjaGFyIGFycmF5IGdlbmVyYXRlZAotCQkvLyBieSBjbGFzcyBpbml0ICh2aWEgYXV0byBnZW5lcmF0ZWQgY29kZSksIGJ1dCB3ZSByZWFsbHkgZG8gd2FudAotCQkvLyBhIHNtYWxsIGJ1ZmZlciBmb3Igb3VyIGhlYWQgcGFyc2Vycy4KLQkJaWYgKHl5X2J1ZmZlci5sZW5ndGggIT0gTUFYX1RPX1NDQU4pIHsKLQkJCXl5X2J1ZmZlciA9IG5ldyBjaGFyW01BWF9UT19TQ0FOXTsKLQkJfQotCi0KLQl9Ci0KLQotCXB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRleHQgPSBudWxsOwotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQlIZWFkUGFyc2VyVG9rZW4gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHZhbHVlVGV4dCk7Ci0JCQl2YWx1ZVRleHQgPSBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB5eXRleHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgewotCQlyZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLQkJZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgewotCQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQl9Ci0KLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQotCi0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lciBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mCi0JICogdGhpcyBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gaW4KLQkgKiAgICAgICAgICAgIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0JICovCi0JcHVibGljIENTU0hlYWRUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLQkJdGhpcy55eV9yZWFkZXIgPSBpbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzCi0JICogY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIGluCi0JICogICAgICAgICAgICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0JICovCi0JcHVibGljIENTU0hlYWRUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotCQl0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0JfQotCi0JLyoqCi0JICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0JICogCi0JICogQHBhcmFtIHBhY2tlZAotCSAqICAgICAgICAgICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLQkgKiBAcmV0dXJuIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotCQljaGFyW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0JCWludCBpID0gMDsgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAqLwotCQlpbnQgaiA9IDA7IC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0JCXdoaWxlIChpIDwgMTU4KSB7Ci0JCQlpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0JCQljaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotCQkJZG8KLQkJCQltYXBbaisrXSA9IHZhbHVlOwotCQkJd2hpbGUgKC0tY291bnQgPiAwKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZSBlbmQgb2YgdGhlCi0JICogICAgICAgICBzdHJlYW0gaXMgcmVhY2hlZC4KLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLQkgKi8KLQlwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0JCS8qIHN0YW5kYXJkIGNhc2UgKi8KLQkJaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKQotCQkJcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0JCS8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8KLQkJaWYgKHl5X2F0RU9GKQotCQkJcmV0dXJuIFlZRU9GOwotCi0JCS8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0JCS8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0JCWlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9idWZmZXIsIDAsIHl5X2VuZFJlYWQgLSB5eV9zdGFydFJlYWQpOwotCi0JCQkvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotCQkJeXlfZW5kUmVhZCAtPSB5eV9zdGFydFJlYWQ7Ci0JCQl5eV9jdXJyZW50UG9zIC09IHl5X3N0YXJ0UmVhZDsKLQkJCXl5X21hcmtlZFBvcyAtPSB5eV9zdGFydFJlYWQ7Ci0JCQl5eV9wdXNoYmFja1BvcyAtPSB5eV9zdGFydFJlYWQ7Ci0JCQl5eV9zdGFydFJlYWQgPSAwOwotCQl9Ci0KLQkJLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotCQlpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0JCQkvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLQkJCWNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zICogMl07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLQkJCXl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLQkJfQotCi0JCS8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotCQlpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgeXlfYnVmZmVyLmxlbmd0aCAtIHl5X2VuZFJlYWQpOwotCi0JCWlmIChudW1SZWFkID09IC0xKQotCQkJcmV0dXJuIFlZRU9GOwotCi0JCXl5X2VuZFJlYWQgKz0gbnVtUmVhZDsKLQotCQlyZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0JfQotCi0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQl5eV9hdEVPRiA9IHRydWU7IC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0JCXl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7IC8qIGludmFsaWRhdGUgYnVmZmVyICovCi0JCXl5X3JlYWRlci5jbG9zZSgpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotCSAqLwotCWZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLQkJcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0JfQotCi0JLyoqCi0JICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLQkgKiAKLQkgKiBAcGFyYW0gbmV3U3RhdGUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotCSAqLwotCWZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0JCXl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0JICovCi0JZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MgLSB5eV9zdGFydFJlYWQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotCQlyZXR1cm4geXlfbWFya2VkUG9zIC0geXlfc3RhcnRSZWFkOwotCX0KLQotCi0JLyoqCi0JICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0JICogCi0JICogQHBhcmFtIGVycm9yQ29kZQotCSAqICAgICAgICAgICAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0JCXRyeSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOwotCQl9Ci0JCWNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7Ci0JCX0KLQotCQlTeXN0ZW0uZXhpdCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotCSAqIAotCSAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbnVtYmVyCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4gVGhpcyBudW1iZXIgbXVzdAotCSAqICAgICAgICAgICAgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotCSAqLwotCXByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLQkJaWYgKG51bWJlciA+IHl5bGVuZ3RoKCkpCi0JCQl5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLQkJeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLQl9Ci0KLQotCS8qKgotCSAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLCB3aGVuIHRoZQotCSAqIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgeXlfZG9fZW9mKCkgewotCQlpZiAoIXl5X2VvZl9kb25lKSB7Ci0JCQl5eV9lb2ZfZG9uZSA9IHRydWU7Ci0JCQloYXNNb3JlID0gZmFsc2U7Ci0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwgdGhlIGVuZAotCSAqIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0JICogCi0JICogQHJldHVybiB0aGUgbmV4dCB0b2tlbgotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotCSAqLwotCXB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJaW50IHl5X2lucHV0OwotCQlpbnQgeXlfYWN0aW9uOwotCi0KLQkJd2hpbGUgKHRydWUpIHsKLQotCQkJeXljaGFyICs9IHl5bGVuZ3RoKCk7Ci0KLQkJCXl5X2F0Qk9MID0geXlfbWFya2VkUG9zIDw9IDAgfHwgeXlfYnVmZmVyW3l5X21hcmtlZFBvcyAtIDFdID09ICdcbic7Ci0JCQlpZiAoIXl5X2F0Qk9MICYmIHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MgLSAxXSA9PSAnXHInKSB7Ci0JCQkJeXlfYXRCT0wgPSB5eV9hZHZhbmNlKCkgIT0gJ1xuJzsKLQkJCQlpZiAoIXl5X2F0RU9GKQotCQkJCQl5eV9jdXJyZW50UG9zLS07Ci0JCQl9Ci0KLQkJCXl5X2FjdGlvbiA9IC0xOwotCi0JCQl5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOwotCi0JCQlpZiAoeXlfYXRCT0wpCi0JCQkJeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlICsgMV07Ci0JCQllbHNlCi0JCQkJeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlXTsKLQotCi0JCQl5eV9mb3JBY3Rpb24gOiB7Ci0JCQkJd2hpbGUgKHRydWUpIHsKLQotCQkJCQl5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotCQkJCQlpZiAoeXlfaW5wdXQgPT0gWVlFT0YpCi0JCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0KLQkJCQkJeXlfaW5wdXQgPSB5eWNtYXBbeXlfaW5wdXRdOwotCi0JCQkJCWJvb2xlYW4geXlfaXNGaW5hbCA9IGZhbHNlOwotCQkJCQlib29sZWFuIHl5X25vTG9va0FoZWFkID0gZmFsc2U7Ci0KLQkJCQkJeXlfZm9yTmV4dCA6IHsKLQkJCQkJCXN3aXRjaCAoeXlfc3RhdGUpIHsKLQkJCQkJCQljYXNlIDAgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDEgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gOTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAyIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDEwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMiA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDExOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA4IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxMjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAxMCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxMzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAxNSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxNDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDIgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDExIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDE1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDIxIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDE2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDE3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDI5IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzAgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMxIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA4IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJCWNhc2UgMjggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDExIDoKLQkJCQkJCQkJCWNhc2UgMzIgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMjkgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMwIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA4IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJCWNhc2UgMjggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMyIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDI5IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzMSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzMgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTAgOgotCQkJCQkJCQkJY2FzZSAyOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzIgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTEgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAyOSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzAgOgotCQkJCQkJCQkJY2FzZSAzMSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMiA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxMCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxMSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzNTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDEyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTAgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTUgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxMyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTEgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxNCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTYgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxNSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTYgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIzIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTcgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA4IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxNzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDIwIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxOTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDIxIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxOTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDI2IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAyOSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQ1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMzUgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQ2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMzYgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA4IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzNjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAxMCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzNzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAxNSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDM3IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxMSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzOTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDM4IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNiA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0MDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDM5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxMiA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0NzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQwIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0ODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNiA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0OTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQzIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxOTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQ3IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxMyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1MDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQ4IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1MTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQ5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyNCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1MjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDUwIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1MzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDUxIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxOSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1NDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDUyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyNSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1NTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDUzIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1NCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjAgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1NSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjYgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1NiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDU2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNTcgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIxIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDU5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNTggOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIzIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDYwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNTkgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIyIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2MTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDYwIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyNyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2MjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDYyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2MzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDYzIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCXl5X1NjYW5FcnJvcihZWV9JTExFR0FMX1NUQVRFKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAoeXlfaXNGaW5hbCkgewotCQkJCQkJeXlfYWN0aW9uID0geXlfc3RhdGU7Ci0JCQkJCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOwotCQkJCQkJaWYgKHl5X25vTG9va0FoZWFkKQotCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCi0KLQkJCXN3aXRjaCAoeXlfYWN0aW9uKSB7Ci0KLQkJCQljYXNlIDQ1IDogewotCQkJCQl5eXB1c2hiYWNrKDIpOwotCQkJCQlwb3BTdGF0ZSgpOwotCQkJCQl2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsKLQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7Ci0JCQkJfQotCQkJCWNhc2UgNjUgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDI1IDogewotCQkJCQl5eXB1c2hiYWNrKDEpOwotCQkJCQlwb3BTdGF0ZSgpOwotCQkJCQl2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsKLQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7Ci0JCQkJfQotCQkJCWNhc2UgNjYgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDE5IDoKLQkJCQljYXNlIDIwIDogewotCQkJCQl5eXB1c2hiYWNrKDEpOwotCQkJCQl5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsKLQkJCQkJc3RyaW5nLnNldExlbmd0aCgwKTsKLQkJCQl9Ci0JCQkJY2FzZSA2NyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTggOiB7Ci0JCQkJCXl5YmVnaW4oWVlJTklUSUFMKTsKLQkJCQkJaGFzTW9yZSA9IGZhbHNlOwotCQkJCQlyZXR1cm4gQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5SdWxlRW5kOwotCQkJCX0KLQkJCQljYXNlIDY4IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzMiA6IHsKLQkJCQkJeXlwdXNoYmFjaygxKTsKLQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlOwotCQkJCX0KLQkJCQljYXNlIDY5IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0NCA6IHsKLQkJCQkJeXlwdXNoYmFjaygyKTsKLQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOwotCQkJCX0KLQkJCQljYXNlIDcwIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA2MSA6IHsKLQkJCQkJaWYgKHl5Y2hhciA9PSAwKSB7Ci0JCQkJCQl5eWJlZ2luKENIQVJTRVRfUlVMRSk7Ci0JCQkJCQlyZXR1cm4gQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5DSEFSU0VUX1JVTEU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2FzZSA3MSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNTYgOiB7Ci0JCQkJCWlmICh5eWNoYXIgPT0gMCkgewotCQkJCQkJeXliZWdpbihTVF9YTUxEZWNsKTsKLQkJCQkJCXJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXNlIDcyIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA4IDoKLQkJCQljYXNlIDkgOgotCQkJCWNhc2UgMTAgOgotCQkJCWNhc2UgMTEgOgotCQkJCWNhc2UgMTIgOgotCQkJCWNhc2UgMTMgOgotCQkJCWNhc2UgMTQgOgotCQkJCWNhc2UgMTUgOgotCQkJCWNhc2UgMTYgOgotCQkJCWNhc2UgMjEgOiB7Ci0JCQkJCWlmICh5eWNoYXIgPiBNQVhfVE9fU0NBTikgewotCQkJCQkJaGFzTW9yZSA9IGZhbHNlOwotCQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhc2UgNzMgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDQxIDogewotCQkJCQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JCQkJCXJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7Ci0JCQkJfQotCQkJCWNhc2UgNzQgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDYzIDogewotCQkJCQlwdXNoQ3VycmVudFN0YXRlKCk7Ci0JCQkJCXl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOwotCQkJCQlyZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZzsKLQkJCQl9Ci0JCQkJY2FzZSA3NSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMyA6Ci0JCQkJY2FzZSAxNyA6IHsKLQkJCQkJcHVzaEN1cnJlbnRTdGF0ZSgpOwotCQkJCQl5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsKLQkJCQl9Ci0JCQkJY2FzZSA3NiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDYgOiB7Ci0JCQkJCWhhc01vcmUgPSBmYWxzZTsKLQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTsKLQkJCQl9Ci0JCQkJY2FzZSA3NyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzMgOiB7Ci0JCQkJCWhhc01vcmUgPSBmYWxzZTsKLQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7Ci0JCQkJfQotCQkJCWNhc2UgNzggOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDM0IDogewotCQkJCQloYXNNb3JlID0gZmFsc2U7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFOwotCQkJCX0KLQkJCQljYXNlIDc5IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyNCA6Ci0JCQkJY2FzZSAyNiA6Ci0JCQkJY2FzZSAyOSA6IHsKLQkJCQkJc3RyaW5nLmFwcGVuZCh5eXRleHQoKSk7Ci0JCQkJfQotCQkJCWNhc2UgODAgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDIzIDogewotCQkJCQl5eWJlZ2luKFNRX1NUUklORyk7Ci0JCQkJCXN0cmluZy5zZXRMZW5ndGgoMCk7Ci0JCQkJfQotCQkJCWNhc2UgODEgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDIyIDogewotCQkJCQl5eWJlZ2luKERRX1NUUklORyk7Ci0JCQkJCXN0cmluZy5zZXRMZW5ndGgoMCk7Ci0JCQkJfQotCQkJCWNhc2UgODIgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDI3IDogewotCQkJCQl5eXB1c2hiYWNrKDEpOwotCQkJCQlwb3BTdGF0ZSgpOwotCQkJCQl2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsKLQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7Ci0JCQkJfQotCQkJCWNhc2UgODMgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDI4IDogewotCQkJCQlwb3BTdGF0ZSgpOwotCQkJCQl2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsKLQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlOwotCQkJCX0KLQkJCQljYXNlIDg0IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzMCA6IHsKLQkJCQkJeXlwdXNoYmFjaygxKTsKLQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOwotCQkJCX0KLQkJCQljYXNlIDg1IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzMSA6IHsKLQkJCQkJeXlwdXNoYmFjaygxKTsKLQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOwotCQkJCX0KLQkJCQljYXNlIDg2IDoKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotCQkJCQkJeXlfYXRFT0YgPSB0cnVlOwotCQkJCQkJeXlfZG9fZW9mKCk7Ci0JCQkJCQl7Ci0JCQkJCQkJaGFzTW9yZSA9IGZhbHNlOwotCQkJCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl5eV9TY2FuRXJyb3IoWVlfTk9fTUFUQ0gpOwotCQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoZSBzY2FubmVyIG9uIGlucHV0IGZpbGVzLgotCSAqIAotCSAqIFRoaXMgbWFpbiBtZXRob2QgaXMgdGhlIGRlYnVnZ2luZyByb3V0aW5lIGZvciB0aGUgc2Nhbm5lci4gSXQgcHJpbnRzCi0JICogZWFjaCByZXR1cm5lZCB0b2tlbiB0byBTeXN0ZW0ub3V0IHVudGlsIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkLCBvcgotCSAqIGFuIGVycm9yIG9jY3VyZWQuCi0JICogCi0JICogQHBhcmFtIGFyZ3YKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIGxpbmUsIGNvbnRhaW5zIHRoZSBmaWxlbmFtZXMgdG8gcnVuIHRoZSBzY2FubmVyCi0JICogICAgICAgICAgICBvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykgewotCQkJQ1NTSGVhZFRva2VuaXplciBzY2FubmVyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc2Nhbm5lciA9IG5ldyBDU1NIZWFkVG9rZW5pemVyKG5ldyBqYXZhLmlvLkZpbGVSZWFkZXIoYXJndltpXSkpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgbm90IGZvdW5kIDogXCIiICsgYXJndltpXSArICJcIiIpOwotCQkJCVN5c3RlbS5leGl0KDEpOwotCQkJfQotCQkJY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZSA6IGphdmEgQ1NTSGVhZFRva2VuaXplciA8aW5wdXRmaWxlPiIpOwotCQkJCVN5c3RlbS5leGl0KDEpOwotCQkJfQotCi0JCQl0cnkgewotCQkJCWRvIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHNjYW5uZXIucHJpbUdldE5leHRUb2tlbigpKTsKLQkJCQl9Ci0JCQkJd2hpbGUgKCFzY2FubmVyLnl5X2F0RU9GKTsKLQotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQW4gSS9PIGVycm9yIG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgOiIpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKLQkJCQlTeXN0ZW0uZXhpdCgxKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9DU1NIZWFkVG9rZW5pemVyQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk5MWEwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBDU1NIZWFkVG9rZW5pemVyQ29uc3RhbnRzIHsKLQotCVN0cmluZyBSdWxlRW5kID0gIlJ1bGVFbmQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENIQVJTRVRfUlVMRSA9ICJDSEFSU0VUX1JVTEUiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ1NTUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NTU1Jlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTYyZjZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ1NTUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5JbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLk5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotCi0KLQotcHVibGljIGNsYXNzIENTU1Jlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciB7Ci0JY2xhc3MgTnVsbE1lbWVudG8gZXh0ZW5kcyBFbmNvZGluZ01lbWVudG8gewotCQkvKioKLQkJICogCi0JCSAqLwotCQlwdWJsaWMgTnVsbE1lbWVudG8oKSB7Ci0JCQlzdXBlcigpOwotCQkJU3RyaW5nIGRlZmF1bHRDaGFyc2V0ID0gTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcy51c2VEZWZhdWx0TmFtZVJ1bGVzKG51bGwpOwotCQkJc2V0SmF2YUNoYXJzZXROYW1lKGRlZmF1bHRDaGFyc2V0KTsKLQkJCXNldEFwcHJvcHJpYXRlRGVmYXVsdChkZWZhdWx0Q2hhcnNldCk7Ci0JCQlzZXREZXRlY3RlZENoYXJzZXROYW1lKG51bGwpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIENTU0hlYWRUb2tlbml6ZXIgZlRva2VuaXplcjsKLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBmRW5jb2RpbmdNZW1lbnRvOwotCXByaXZhdGUgYm9vbGVhbiBmSGVhZGVyUGFyc2VkOwotCXByaXZhdGUgUmVhZGVyIGZSZWFkZXI7Ci0KLQkvKioKLQkgKiBUaGVyZSBpcyBubyBzcGVjIGRlZmluZWQgZW5jb2RpbmcgZm9yIENTUywgc28gTnVsbCBpcyByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIHNob3VsZCBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luLnhtbCAob3IgbG9vayBpdCB1cCBmcm9tIHRoZXJlKS4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbShTdHJpbmcgdG9rZW5UeXBlKSB7Ci0JCWJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gZmFsc2U7Ci0JCWlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSB0cnVlOwotCQkJU3RyaW5nIGVuYyA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0VVRGODNCeXRlQk9NVXNlZCh0cnVlKTsKLQkJfQotCQllbHNlIGlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmMgPSAiVVRGLTE2QkUiOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVURUNURURfU1RBTkRBUkRfVU5JQ09ERV9CWVRFUyk7Ci0JCX0KLQkJZWxzZSBpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEUpIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi0xNiI7IC8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTKTsKLQkJfQotCQlyZXR1cm4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdG9rZW5pemVyLgotCSAqLwotCXByaXZhdGUgQ1NTSGVhZFRva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCWlmIChmVG9rZW5pemVyID09IG51bGwpIHsKLQkJCWZUb2tlbml6ZXIgPSBuZXcgQ1NTSGVhZFRva2VuaXplcigpOwotCQl9Ci0JCXJldHVybiBmVG9rZW5pemVyOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0xlZ2FsU3RyaW5nKFN0cmluZyB2YWx1ZVRva2VuVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAodmFsdWVUb2tlblR5cGUgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZUlucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJY2hlY2tJbkNvbnRlbnRzKCk7Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCWNoZWNrSGV1cmlzdGljcygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrSW5Db250ZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUNTU0hlYWRUb2tlbml6ZXIgdG9rZW5pemVyID0gZ2V0VG9rZW5pemVyKCk7Ci0JCXRva2VuaXplci5yZXNldChmUmVhZGVyKTsKLQkJSGVhZFBhcnNlclRva2VuIHRva2VuID0gbnVsbDsKLQkJU3RyaW5nIHRva2VuVHlwZSA9IG51bGw7Ci0JCWRvIHsKLQkJCXRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJdG9rZW5UeXBlID0gdG9rZW4uZ2V0VHlwZSgpOwotCQkJaWYgKGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSh0b2tlblR5cGUpKSB7Ci0JCQkJLy8gc2lkZSBlZmZlY3Qgb2YgY2FuSGFuZGxlIGlzIHRvIGNyZWF0ZSBhcHByb3ByaWF0ZSBtZW1lbnRvCi0JCQl9Ci0JCQllbHNlIGlmICh0b2tlblR5cGUgPT0gQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5DSEFSU0VUX1JVTEUpIHsKLQkJCQlpZiAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQlIZWFkUGFyc2VyVG9rZW4gdmFsdWVUb2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCQkJU3RyaW5nIHZhbHVlVG9rZW5UeXBlID0gdmFsdWVUb2tlbi5nZXRUeXBlKCk7Ci0JCQkJCWlmIChpc0xlZ2FsU3RyaW5nKHZhbHVlVG9rZW5UeXBlKSkgewotCQkJCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKHZhbHVlVG9rZW4uZ2V0VGV4dCgpLCBFbmNvZGluZ01lbWVudG8uRk9VTkRfRU5DT0RJTkdfSU5fQ09OVEVOVCk7Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tIZXVyaXN0aWNzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBub0hldXJpc3RpYyA9IGZhbHNlOwotCQlTdHJpbmcgaGV1cmlzdGljRW5jb2RpbmcgPSBudWxsOwotCQl0cnkgewotCQkJZlJlYWRlci5yZXNldCgpOwotCQkJYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbM107Ci0JCQlpbnQgblJlYWQgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmUmVhZGVyLnJlYWR5KCkpIHsKLQkJCQkJaW50IG9uZUJ5dGUgPSBmUmVhZGVyLnJlYWQoKTsKLQkJCQkJblJlYWQrKzsKLQkJCQkJaWYgKG9uZUJ5dGUgPD0gMHhGRikgewotCQkJCQkJYnl0ZXNbaV0gPSAoYnl0ZSkgb25lQnl0ZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW5vSGV1cmlzdGljID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbm9IZXVyaXN0aWMgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIW5vSGV1cmlzdGljICYmIG5SZWFkID09IDMpIHsKLQkJCQloZXVyaXN0aWNFbmNvZGluZyA9IEVuY29kaW5nR3Vlc3Nlci5ndWVzc0VuY29kaW5nKGJ5dGVzLCAzKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaWYgYW55IElPIGV4Y2VwdGlvbiwgdGhlbiBub3QgYSBoZXVyaXN0aWMgY2FzZQotCQl9Ci0JCWZpbmFsbHkgewotCQkJZlJlYWRlci5yZXNldCgpOwotCQl9Ci0JCWlmIChoZXVyaXN0aWNFbmNvZGluZyAhPSBudWxsKSB7Ci0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oaGV1cmlzdGljRW5jb2RpbmcsIEVuY29kaW5nTWVtZW50by5HVUVTU0VEX0VOQ09ESU5HX0ZST01fU1RSRUFNKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogTm90ZTogb25jZSB0aGlzIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHRyYWNlIGluZm8gc3RpbGwgbmVlZHMgdG8gYmUKLQkgKiBhcHBlbmRlZCBieSBjYWxsZXIsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCBpdHMgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldERldGVjdGVkQ2hhcnNldE5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIFRPRE86IGlmIGRldGVjdGVkQ2hhcnNldCBhbmQgc3BlYyBkZWZhdWx0IGlzCi0JCS8vIG51bGwsIG5lZWQgdG8gdXNlICJ3b3JrCi0JCS8vIGJlbmNoIGJhc2VkIiBkZWZhdWx0cy4KLQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252aWVuY2UgbWV0aG9kIGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UgKGJ1dCBub3Qgb3ZlcnJpZGUpCi0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcGFyYW0gcmVhc29uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgU3RyaW5nIHJlYXNvbikgewotCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBlbnN1cmVJbnB1dFNldCgpIHsKLQkJaWYgKGZSZWFkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5wdXQgbXVzdCBiZSBzZXQgYmVmb3JlIHVzZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gcmV0dXJuIG51bGwsIGlmIGludmFsaWQgY2hhcnNldCBuYW1lIChpbiB3aGljaCBjYXNlCi0JICogImFwcHJvcHJpYXRlRGVmYXVsdCIgc2hvdWxkIGJlIHVzZWQsIGlmIGEgbmFtZSBpcyByZWFsbHkgbmVlZCBmb3Igc29tZQotCSAqICJzYXZlIGFueXdheSIgY2FzZXMpLgotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIDEuIENoZWNrIGV4cGxpY2l0IG1hcHBpbmcgb3ZlcnJpZGVzIGZyb20KLQkJLy8gcHJvcGVydHkgZmlsZSAtLSBpdHMgaGVyZSB3ZSBwaWNrIHVwICJydWxlcyIgZm9yIGNhc2VzCi0JCS8vIHRoYXQgYXJlIG5vdCBldmVuIGluIEphdmEKLQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIDIuIFVzZSB0aGUgImNhbm9uaWNhbCIgbmFtZSBmcm9tIEpSRSBtYXBwaW5ncwotCQkvLyBOb3RlOiBzZWUgQ2hhcnNldCBKYXZhRG9jLCB0aGUgbmFtZSB5b3UgZ2V0IG9uZQotCQkvLyB3aXRoIGNhbiBiZSBhbGlhcywKLQkJLy8gdGhlIG5hbWUgeW91IGdldCBiYWNrIGlzICJzdGFuZGFyZCIgbmFtZS4KLQkJQ2hhcnNldCBqYXZhQ2hhcnNldCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlqYXZhQ2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9ubHkgc2V0IGludmFsaWQsIGlmIHJlc3VsdCBpcyBzYW1lIGFzIGRldGVjdGVkIC0tIHRoZXkgd29uJ3QKLQkJCS8vIGJlIGVxdWFsIGlmCi0JCQkvLyBvdmVycmlkZGVuCi0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmVxdWFscyhkZXRlY3RlZENoYXJzZXROYW1lKSkgewotCQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SW52YWxpZEVuY29kaW5nKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gZSkgewotCQkJLy8gb25seSBzZXQgaW52YWxpZCwgaWYgcmVzdWx0IGlzIHNhbWUgYXMgZGV0ZWN0ZWQgLS0gdGhleSB3b24ndAotCQkJLy8gYmUgZXF1YWwgaWYKLQkJCS8vIG92ZXJyaWRkZW4KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldE5hbWUpKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50by5zZXRJbnZhbGlkRW5jb2RpbmcoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gZ2l2ZSBwcmlvcml0eSB0byBqYXZhIGNvbm9uaWNhbCBuYW1lLCBpZiBwcmVzZW50Ci0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBqYXZhQ2hhcnNldC5uYW1lKCk7Ci0JCQkvLyBidXQgc3RpbGwgYWxsb3cgb3ZlcnJpZGVzCi0JCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhyZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRFbmNvZGluZ01lbWVudG8oKS5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllbnN1cmVJbnB1dFNldCgpOwotCQlpZiAoIWZIZWFkZXJQYXJzZWQpIHsKLQkJCXBhcnNlSW5wdXQoKTsKLQkJCS8vIHdlIGtlZXAgdHJhY2sgb2YgaWYgaGVhZGVyJ3MgYWxyZWFkeSBiZWVuCi0JCQkvLyBwYXJzZSwgc28gY2FuIG1ha2UKLQkJCS8vIG11bHRpcGxlICdnZXQnIGNhbGxzLCB3aXRob3V0IGNhdXNpbmcKLQkJCS8vIHJlcGFyc2luZy4KLQkJCWZIZWFkZXJQYXJzZWQgPSB0cnVlOwotCQkJLy8gTm90ZTogdGhlcmUgaXMgYSAiaGlkZGVuIGFzc3VtcHRpb24iIGhlcmUKLQkJCS8vIHRoYXQgYW4gZW1wdHkKLQkJCS8vIHN0cmluZyBpbiBjb250ZW50IHNob3VsZCBiZSB0cmVhdGVkIHNhbWUgYXMKLQkJCS8vIG5vdCBwcmVzZW50LgotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCWhhbmRsZVNwZWNEZWZhdWx0KCk7Ci0JCX0KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJLy8gc2FmdHkgbmV0Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IE51bGxNZW1lbnRvKCk7Ci0JCX0KLQkJcmV0dXJuIGZFbmNvZGluZ01lbWVudG87Ci0JfQotCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRTcGVjRGVmYXVsdEVuY29kaW5nTWVtZW50bygpIHsKLQkJcmVzZXRBbGwoKTsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBlbmMgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmMgIT0gbnVsbCkgewotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFRkFVTFRTX0FTU1VNRURfRk9SX0VNUFRZX0lOUFVUKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGVuYyk7Ci0JCQlyZXN1bHQgPSBmRW5jb2RpbmdNZW1lbnRvOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNwZWNEZWZhdWx0KCkgewotCQlTdHJpbmcgZW5jb2RpbmdOYW1lOwotCQllbmNvZGluZ05hbWUgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmNvZGluZ05hbWUgIT0gbnVsbCkgewotCQkJLy8gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuY29kaW5nTmFtZSwKLQkJCS8vIEVuY29kaW5nTWVtZW50by5VU0VEX0NPTlRFTlRfVFlQRV9ERUZBVUxUKTsKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShlbmNvZGluZ05hbWUpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZW5jb2RpbmdOYW1lKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldEFsbCgpIHsKLQkJZlJlYWRlciA9IG51bGw7Ci0JCWZIZWFkZXJQYXJzZWQgPSBmYWxzZTsKLQkJZkVuY29kaW5nTWVtZW50byA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZSZWFkZXIgPSBuZXcgQnl0ZVJlYWRlcihpbnB1dFN0cmVhbSk7Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2Uga25vdyBCeXRlUmVhZGVyCi0JCQkvLyBzdXBwb3J0cyBtYXJraW5nCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSVN0b3JhZ2UgaVN0b3JhZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmVzZXRBbGwoKTsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBpU3RvcmFnZS5nZXRDb250ZW50cygpOwotCQlJbnB1dFN0cmVhbSByZXNldHRhYmxlU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0sIENvZGVkSU8uTUFYX0JVRl9TSVpFKTsKLQkJcmVzZXR0YWJsZVN0cmVhbS5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCXNldChyZXNldHRhYmxlU3RyZWFtKTsKLQkJLy8gVE9ETyB3ZSdsbCBuZWVkIHRvICJyZW1lbWJlciIgSUZpbGUsIG9yCi0JCS8vIGdldCBpdHMgKG9yIGl0cyBwcm9qZWN0J3MpIHNldHRpbmdzLCBpbiBjYXNlCi0JCS8vIHRob3NlIGFyZSBuZWVkZWQgdG8gaGFuZGxlIGNhc2VzIHdoZW4gdGhlCi0JCS8vIGVuY29kaW5nIGlzIG5vdCBpbiB0aGUgZmlsZSBzdHJlYW0uCi0JfQotCi0JLyoqCi0JICogTm90ZTogdGhpcyBpcyBub3QgcGFydCBvZiBpbnRlcmZhY2UgdG8gaGVscCBhdm9pZCBjb25mdXNpb24gLi4uIGl0Ci0JICogZXhwZWN0ZWQgdGhpcyBSZWFkZXIgaXMgYSB3ZWxsIGZvcm1lZCBjaGFyYWN0ZXIgcmVhZGVyIC4uLiB0aGF0IGlzLCBpdHMKLQkgKiBhbGwgcmVhZHkgYmVlbiBkZXRlcm1pbmVkIHRvIG5vdCBiZSBhIHVuaWNvZGUgbWFya2VkIGlucHV0IHN0cmVhbS4gQW5kLAotCSAqIGl0cyBhc3N1bWVkIHRvIGJlIGluIHRoZSBjb3JyZWN0IHBvc2l0aW9uLCBhdCBwb3NpdGlvbiB6ZXJvLCByZWFkeSB0bwotCSAqIHJlYWQgZmlyc3QgY2hhcmFjdGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldChSZWFkZXIgcmVhZGVyKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZSZWFkZXIgPSByZWFkZXI7Ci0JCWlmICghZlJlYWRlci5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCWZSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZlJlYWRlcik7Ci0JCX0KLQkJdHJ5IHsKLQkJCWZSZWFkZXIubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NibGUsIHNpbmNlIHdlIGp1c3QgY2hlY2tlZCBpZiBtYXJrYWJsZQotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ29udGVudERlc2NyaWJlckZvckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ4NjNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ29udGVudERlc2NyaWJlckZvckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklUZXh0Q29udGVudERlc2NyaWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudERlc2NyaWJlckZvckNTUyBpbXBsZW1lbnRzIElUZXh0Q29udGVudERlc2NyaWJlciB7Ci0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgUXVhbGlmaWVkTmFtZVtdIFNVUFBPUlRFRF9PUFRJT05TID0ge0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFR9OwotCi0JcHVibGljIGludCBkZXNjcmliZShJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBkZXNjcmliZShSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCi0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCWVsc2UgewotCQkJY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhjb250ZW50cywgZGVzY3JpcHRpb24pOwotCQkJcmVzdWx0ID0gY29tcHV0ZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBRdWFsaWZpZWROYW1lW10gZ2V0U3VwcG9ydGVkT3B0aW9ucygpIHsKLQotCQlyZXR1cm4gU1VQUE9SVEVEX09QVElPTlM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50cwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGNvbXB1dGVWYWxpZGl0eShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQkvLyBjdXJyZW50bHkgbm8gc3BlY2lmaWMgY2hlY2sgZm9yIHZhbGlkaWx0eQotCQkvLyBiYXNlZCBvbiBjb250ZW50cy4KLQkJcmV0dXJuIElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZVZhbGlkaXR5KFJlYWRlciByZWFkZXIpIHsKLQkJLy8gY3VycmVudGx5IG5vIHNwZWNpZmljIGNoZWNrIGZvciB2YWxpZGlsdHkKLQkJLy8gYmFzZWQgb24gY29udGVudHMuCi0JCXJldHVybiBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCX0KLQotCXByaXZhdGUgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGdldERldGVjdG9yKCkgewotCQlyZXR1cm4gbmV3IENTU1Jlc291cmNlRW5jb2RpbmdEZXRlY3RvcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZXRlY3RvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2FsY3VsYXRpb25zKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gbm90ZTogaWYgd2UncmUgYXNrZWQgZm9yIG9uZSwgd2Ugc2V0IHRoZW0gYWxsLiBJIG5lZWQgdG8gYmUgc3VyZSBpZgotCQkvLyBjYWxsZWQKLQkJLy8gbXVsaXRpcGxlIHRpbWVzIChvbmUgZm9yIGVhY2gsIHNheSkgdGhhdCB3ZSBkb24ndCB3YXN0ZSB0aW1lCi0JCS8vIHByb2Nlc3Npbmcgc2FtZQotCQkvLyBjb250ZW50IGFnYWluLgotCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gKChDU1NSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IpIGRldGVjdG9yKS5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQkJLy8gVE9ETzogSSBuZWVkIHRvIHZlcmlmeSB0byBzZWUgaWYgdGhpcyBCT00gd29yayBpcyBhbHdheXMgZG9uZQotCQkvLyBieSB0ZXh0IHR5cGUuCi0JCU9iamVjdCBkZXRlY3RlZEJ5dGVPcmRlck1hcmsgPSBlbmNvZGluZ01lbWVudG8uZ2V0VW5pY29kZUJPTSgpOwotCQlpZiAoZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0J5dGVPcmRlck1hcmsgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSyk7Ci0JCQkvLyBub3Qgc3VyZSB3aHkgd291bGQgZXZlciBiZSBkaWZmZXJlbnQsIHNvIGlmIGlzIGRpZmZlcmVudCwgbWF5Ci0JCQkvLyBuZWVkIHRvICJwdXNoIiB1cCBpbnRvIGJhc2UuCi0JCQlpZiAoIWRldGVjdGVkQnl0ZU9yZGVyTWFyay5lcXVhbHMoZXhpc3RpbmdCeXRlT3JkZXJNYXJrKSkKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrKTsKLQkJfQotCi0KLQkJaWYgKCFlbmNvZGluZ01lbWVudG8uaXNWYWxpZCgpKSB7Ci0JCQkvLyBub3RlOiBhZnRlciBzZXR0aW5nIGhlcmUsIGl0cyB0aGUgbWVyZSBwcmVzZW5jZSBvZgotCQkJLy8gSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQKLQkJCS8vIGluIHRoZSByZXNvdXJjZSdzIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmCi0JCQkvLyBpbnZhbGlkCi0JCQkvLyBpbiB0aG9zZSBjYXNlcywgdGhlICJkZXRlY3RlZCIgcHJvcGVydHkgY29udGFpbnMgYW4KLQkJCS8vICJhcHByb3ByaWF0ZSBkZWZhdWx0IiB0byB1c2UuCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgZW5jb2RpbmdNZW1lbnRvLmdldEludmFsaWRFbmNvZGluZygpKTsKLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxULCBlbmNvZGluZ01lbWVudG8uZ2V0QXBwcm9wcmlhdGVEZWZhdWx0KCkpOwotCQl9Ci0KLQkJT2JqZWN0IGRldGVjdGVkQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JCU9iamVjdCBqYXZhQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQotCQkvLyB3ZSBhbHdheXMgaW5jbHVkZSBkZXRlY3RlZCwgaWYgaXRzIGRpZmZlcmVudCB0aGFuIGphdmEKLQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0KLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0NoYXJzZXQgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpOwotCQkJaWYgKGphdmFDaGFyc2V0LmVxdWFscyhleGlzdGluZ0NoYXJzZXQpKSB7Ci0JCQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3ZSBtYXkgbmVlZCB0byBhZGQgd2hhdCB3ZSBmb3VuZCwgYnV0IG9ubHkgbmVlZCB0byBhZGQKLQkJCQkvLyBpZiBkaWZmZXJlbnQgZnJvbSBkZWZhdWx0LnRoZQotCQkJCU9iamVjdCBkZWZhdWx0Q2hhcnNldCA9IGdldERldGVjdG9yKCkuZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQkJCWlmIChkZWZhdWx0Q2hhcnNldCAhPSBudWxsKSB7Ci0JCQkJCWlmICghZGVmYXVsdENoYXJzZXQuZXF1YWxzKGphdmFDaGFyc2V0KSkgewotCQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGFzc3VtaW5nIGlmIHRoZXJlIGlzIG5vIHNwZWMgZGVmYXVsdCwgd2UgYWx3YXlzIG5lZWQgdG8KLQkJCQkJLy8gYWRkLCBJJ20gYXNzdW1pbmcKLQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0LCBPYmplY3QgamF2YUNoYXJzZXQpIHsKLQkJLy8gc2luY2UgZXF1YWwsIHdlIGRvbid0IG5lZWQgdG8gYWRkLCBidXQgaWYgb3VyIGRldGVjdGVkIHZlcnNpb24gaXMKLQkJLy8gZGlmZmVyZW50IHRoYW4gamF2YUNoYXJzZXQsIHRoZW4gd2Ugc2hvdWxkIGFkZCBpdC4gVGhpcyB3aWxsCi0JCS8vIGhhcHBlbiwgZm9yIGV4YW1wbGUsIGlmIHRoZXJlJ3MgZGlmZmVyZW5jZXMgaW4gY2FzZSwgb3IgZGlmZmVyZW5jZXMKLQkJLy8gZHVlIHRvIG92ZXJyaWRlIHByb3BlcnRpZXMKLQkJaWYgKGRldGVjdGVkQ2hhcnNldCAhPSBudWxsKSB7Ci0KLQkJCS8vIE9uY2Ugd2UgZGV0ZWN0ZWQgYSBjaGFyc2V0LCB3ZSBzaG91bGQgc2V0IHRoZSBwcm9wZXJ0eSBldmVuCi0JCQkvLyB0aG91Z2ggaXQncyB0aGUgc2FtZSBhcyBqYXZhQ2hhcnNldAotCQkJLy8gYmVjYXVzZSB0aGVyZSBhcmUgY2xpZW50cyB0aGF0IHJlbHkgb24gdGhpcyBwcm9wZXJ0eSB0bwotCQkJLy8gZGV0ZXJtaW5lIGlmIHRoZSBjaGFyc2V0IGlzIGFjdHVhbGx5IGRldGVjdGVkIGluIGZpbGUgb3Igbm90LgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIGRldGVjdGVkQ2hhcnNldCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVsZXZlbnQoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSykpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJLy8gZWxzZSBpZgotCQkvLyAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkVOQ09ESU5HX01FTUVOVE8pKQotCQkvLyByZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRW5jb2RpbmdHdWVzc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0VuY29kaW5nR3Vlc3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzA4MDBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRW5jb2RpbmdHdWVzc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotLyoqCi0gKiAKLSAqIFRoaXMgaXMgcG9ydGVkIGZyb20gUGFnZURlc2lnbmVyJ3MgaHBiY29tL0thbmppLmNwcCdzCi0gKiBLYW5qaTo6Z3Vlc3Nfa2FuamlfY29kZSgpLAotICogIAotICovCi1wdWJsaWMgY2xhc3MgRW5jb2RpbmdHdWVzc2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVNDSUkgPSAwOyAvLyBBU0NJSQotCS8vIElTTy0yMDIyLUpQCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFTQ0lJX0lOID0gODsgLy8gVGhpcyBpcyBhZnRlciBJU08yMDIyJ3MgY2hhbmdlCi0JLy8gU2hpZnQtSklTCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVVQ19IQUxGS0FOQSA9IDY7IC8vIFRoaXMgaXMgSGFsZiBLYW5hIGluIEVVQy1KUAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVUNfSlAgPSAzOyAvLyBUaGlzIGlzIEVVQy1KUAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJU08yMDIyX0pQID0gNDsgLy8gVGhpcyBpcyBJU08tMjAyMi1KUAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKSVNfSEFMRktBTkEgPSA3OyAvLyBUSGlzIGlzIEhhbGYgS2FuYSBpbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfRVVDMSA9IDB4NDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9FVUMyID0gKGJ5dGUpIDB4ODA7Ci0JLy8gQVNDSUkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0pJTiA9IDB4MDE7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9KT1VUID0gMHgwMjsKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0VTQyA9IDB4MDQ7Ci0JLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9KSVMgPSAweDA4OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfU0ZUMSA9IDB4MTA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9TRlQyID0gMHgyMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGt0eXBlW10gPSB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMDAgKi8KLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAxMCAqLwotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDksIDB4MDgsIDB4MDgsIDB4MDgsIC8qICEiIyQlJicgKi8vKiAiICovCi0JMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgLyogKCkqKywtLi8gKi8KLQkweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAvKiAwMTIzNDU2NyAqLwotCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIC8qIDg5OjsgPD0+PyAqLwotCTB4MjksIDB4MjgsIDB4MmIsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIEBBQkNERUZHICovCi0JMHgyYSwgMHgyOCwgMHgyYSwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogSElKS0xNTk8gKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBQUVJTVFVWVyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIFhZWltcXV5fICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogYWJjZGVmZyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIGhpamtsbW5vICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogcHFyc3R1dncgKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDAwLCAvKiB4eXp7fH1+ICovCi0JMHgyMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgLyogODAgKi8KLQkweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAvKiA5MCAqLwotCTB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MjAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAvKiBBMCAqLwotCShieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAvKiBCMCAqLwotCShieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAvKiBDMCAqLwotCShieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAvKiBEMCAqLwotCShieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAvKiBFMCAqLwotCShieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAvKiBGMCAqLwotCShieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4YzAsIChieXRlKSAweGMwLCAweDAwLH07Ci0JLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElTTzg4NTlfMSA9IDE7IC8vIElTTy0xCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNISUZUX0pJUyA9IDI7IC8vIFRoaXMgaXMgU2hpZnQtSklTCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNKSVNfSEFMRktBTkEgPSA1OyAvLyBUaGlzIGlzIEhhbGYgS2FuYSBpbgotCi0JLyoqCi0JICogQ3VycmVudGx5LCBvbmx5IEphcGFuZXNlIGVuY29kaW5ncyBhcmUgc3VwcG9ydGVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTktOT1dOID0gLTE7IC8vIFVua25vd24KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb2RlCi0JICogICAgICAgICAgICBpbnQKLQkgKiAKLQkgKiBDb252ZXJ0IHByaXZhdGUgaW50IHRvIElBTkEgRW5jb2RpbmcgbmFtZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSUFOQUVuY29kaW5nTmFtZShpbnQgY29kZSkgewotCQlTdHJpbmcgZW5jb2RpbmcgPSBudWxsOwotCi0JCXN3aXRjaCAoY29kZSkgewotCQkJY2FzZSBTSElGVF9KSVMgOgotCQkJY2FzZSBTSklTX0hBTEZLQU5BIDoKLQkJCQllbmNvZGluZyA9ICJTaGlmdF9KSVMiOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgRVVDX0pQIDoKLQkJCWNhc2UgRVVDX0hBTEZLQU5BIDoKLQkJCQllbmNvZGluZyA9ICJFVUMtSlAiOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgSVNPMjAyMl9KUCA6Ci0JCQljYXNlIEpJU19IQUxGS0FOQSA6Ci0JCQkJZW5jb2RpbmcgPSAiSVNPLTIwMjItSlAiOy8vJE5PTi1OTFMtMSQKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIGVuY29kaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBndWVzc2VkIEphdmEgRW5jb2RpbmcgbmFtZSB0YXJnZXQ6IGJ5dGVzIHRvIGJlIGluc3BlY3RlZCBsZW5ndGg6Ci0JICogbGVuZ3RoIG9mIHRhcmdldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1ZXNzRW5jb2RpbmcoYnl0ZVtdIHRhcmdldCwgaW50IGxlbmd0aCkgewotCQlpbnQgY29kZSA9IFVOS05PV047Ci0KLQkJLy8gQ3VycmVudGx5LCBvbmx5IEphcGFuZXNlIGlzIHN1cHBvcnRlZC4KLQkJU3RyaW5nIHN5c3RlbV9jdHlwZSA9IGphdmEudXRpbC5Mb2NhbGUuZ2V0RGVmYXVsdCgpLmdldExhbmd1YWdlKCk7Ci0JCVN0cmluZyBqcF9jdHlwZSA9IGphdmEudXRpbC5Mb2NhbGUuSkFQQU5FU0UuZ2V0TGFuZ3VhZ2UoKTsKLQkJaWYgKHN5c3RlbV9jdHlwZS5jb21wYXJlVG8oanBfY3R5cGUpID09IDApIHsKLQkJCS8vIE9rLCBJJ20gdW5kZXIgamFfSlAuCi0JCQljb2RlID0gQVNDSUk7Ci0JCQlpbnQgcG9zID0gMDsKLQkJCXdoaWxlICgoY29kZSA9PSBBU0NJSSkgJiYgKGxlbmd0aCA+IDApKSB7Ci0JCQkJaW50IGNoMSA9IHRhcmdldFtwb3NdOwotCQkJCWNoMSA9IGNoMSAmIDB4MDAwMDAwRkY7Ci0JCQkJaW50IGNoMiA9IChsZW5ndGggPj0gMikgPyB0YXJnZXRbcG9zICsgMV0gOiAwOwotCQkJCWNoMiA9IGNoMiAmIDB4MDAwMDAwRkY7Ci0JCQkJaW50IGNoMyA9IChsZW5ndGggPj0gMykgPyB0YXJnZXRbcG9zICsgMl0gOiAwOwotCQkJCWNoMyA9IGNoMyAmIDB4MDAwMDAwRkY7Ci0JCQkJY29kZSA9IGd1ZXNzSmFwYW5lc2VLYW5qaUNvZGUoY2gxLCBjaDIsIGNoMywgMCk7Ci0JCQkJcG9zKys7Ci0JCQkJbGVuZ3RoLS07Ci0JCQl9Ci0JCQlzd2l0Y2ggKGNvZGUpIHsKLQkJCQljYXNlIElTTzIwMjJfSlAgOgotCQkJCWNhc2UgSklTX0hBTEZLQU5BIDoKLQkJCQkJY29kZSA9IElTTzIwMjJfSlA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRVVDX0pQIDoKLQkJCQkJY29kZSA9IEVVQ19KUDsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWNvZGUgPSBTSElGVF9KSVM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChjb252ZXJ0VG9JQU5BRW5jb2RpbmdOYW1lKGNvZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBHdWVzcyB0aGUgZW5jb2RpbmcuIGhhbGZrYW5hX2ZsYWcgPSAweDAxICggZGV0ZWN0IFNKSVMgaGFsZiBrYW5hICkKLQkgKiBoYWxma2FuYV9mbGFnID0gMHgwMiAoIGRldGVjdCBFVUMgaGFsZiBrYW5hICkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ3Vlc3NKYXBhbmVzZUthbmppQ29kZShpbnQgY2gxLCBpbnQgY2gyLCBpbnQgY2gzLCBpbnQgaGFsZmthbmFfZmxhZykgewotCQlib29sZWFuIHNqaXNfaGFua2FrdV9mbGFnID0gKChoYWxma2FuYV9mbGFnICYgMHgwMSkgIT0gMCkgPyB0cnVlIDogZmFsc2U7Ci0JCWJvb2xlYW4gZXVjX2hhbmtha3VfZmxhZyA9ICgoaGFsZmthbmFfZmxhZyAmIDB4MDIpICE9IDApID8gdHJ1ZSA6IGZhbHNlOwotCi0JCWlmIChjaDEgPT0gMCkKLQkJCXJldHVybiBVTktOT1dOOwotCQlpZiAoc2ppc19oYW5rYWt1X2ZsYWcgJiYgY2gxID49IDB4YTEgJiYgY2gxIDw9IDB4ZGYpCi0JCQlyZXR1cm4gU0pJU19IQUxGS0FOQTsKLQkJZWxzZSBpZiAoZXVjX2hhbmtha3VfZmxhZyAmJiBjaDEgPT0gMHg4ZSAmJiBjaDIgPj0gMHhhMSAmJiBjaDIgPD0gMHhkZikKLQkJCXJldHVybiBFVUNfSEFMRktBTkE7Ci0JCWVsc2UgaWYgKCgoa3R5cGVbY2gxXSAmIEtUX1NGVDEpICE9IDApICYmICgoa3R5cGVbY2gyXSAmIEtUX1NGVDIpICE9IDApKQotCQkJcmV0dXJuIFNISUZUX0pJUzsKLQkJZWxzZSBpZiAoKChrdHlwZVtjaDFdICYgS1RfRVVDMSkgIT0gMCkgJiYgKChrdHlwZVtjaDJdICYgS1RfRVVDMikgIT0gMCkpCi0JCQlyZXR1cm4gRVVDX0pQOwotCQllbHNlIGlmIChjaDEgPT0gMHgxYiAmJiAoKGt0eXBlW2NoMl0gJiBLVF9KSU4pICE9IDApKQotCQkJcmV0dXJuIElTTzIwMjJfSlA7Ci0JCWVsc2UgaWYgKGNoMSA+PSAweGExICYmIGNoMSA8PSAweGRmKQotCQkJcmV0dXJuIFNKSVNfSEFMRktBTkE7Ci0JCWVsc2UgaWYgKGNoMSA9PSAweDFiICYmIGNoMiA9PSAweDI4LyogJygnICovJiYgY2gzID09IDB4NDkvKiAnSScgKi8pCi0JCQlyZXR1cm4gSklTX0hBTEZLQU5BOwotCQllbHNlIGlmIChjaDEgPT0gMHgxYiAmJiBjaDIgPT0gMHgyOC8qICcoJyAqLyYmICgoa3R5cGVbY2gzXSAmIEtUX0pPVVQpICE9IDApKQotCQkJcmV0dXJuIEFTQ0lJX0lOOwotCi0JCXJldHVybiBBU0NJSTsKLQl9Ci0KLQlwdWJsaWMgRW5jb2RpbmdHdWVzc2VyKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWRjMDFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1wdWJsaWMgY2xhc3MgSGVhZFBhcnNlclRva2VuIHsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQlwcml2YXRlIFN0cmluZyBmVGV4dDsKLQlwcml2YXRlIFN0cmluZyBmVHlwZTsKLQotCXByb3RlY3RlZCBIZWFkUGFyc2VyVG9rZW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEhlYWRQYXJzZXJUb2tlbihTdHJpbmcgdHlwZSwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQl0aGlzKCk7Ci0JCWZUeXBlID0gdHlwZTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZUZXh0ID0gdGV4dDsKLQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIGZUZXh0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAoInRleHQ6ICIgKyBmVGV4dCArICIgb2Zmc2V0OiAiICsgZlN0YXJ0ICsgIiB0eXBlOiAiICsgZlR5cGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4Y2FiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi0vKgotICogCi0gKiBBIG5vbi1yZXNpemFibGUgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSBiZWhhdmlvciBvZiBqYXZhLnV0aWwuU3RhY2ssIGJ1dAotICogZGlyZWN0bHkgZm9yIHRoZSA8Y29kZT4gaW50ZWdlciA8L2NvZGU+IHByaW1pdGl2ZS4KLSAqLwotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSW50U3RhY2sgewotCXByaXZhdGUgaW50W10gbGlzdCA9IG51bGw7Ci0KLQlwcml2YXRlIGludCBzaXplID0gMDsKLQotCXB1YmxpYyBJbnRTdGFjaygpIHsKLQkJdGhpcygxMDApOwotCX0KLQotCXB1YmxpYyBJbnRTdGFjayhpbnQgbWF4ZGVwdGgpIHsKLQkJc3VwZXIoKTsKLQkJbGlzdCA9IG5ldyBpbnRbbWF4ZGVwdGhdOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbXB0eSgpIHsKLQkJcmV0dXJuIHNpemUgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldChpbnQgc2xvdCkgewotCQlyZXR1cm4gbGlzdFtzbG90XTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKQotCQkJbGlzdFtpXSA9IC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGludCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjayB3aXRob3V0IHJlbW92aW5nIGl0Ci0JICogCi0JICogQHJldHVybiBpbnQgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkuCi0JICovCi0JcHVibGljIGludCBwZWVrKCkgewotCQlpZiAoc2l6ZSA9PSAwKQotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJcmV0dXJuIGxpc3Rbc2l6ZSAtIDFdOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIGludCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjawotCSAqIAotCSAqIEByZXR1cm4gaW50IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5LgotCSAqLwotCXB1YmxpYyBpbnQgcG9wKCkgewotCQlpbnQgdmFsdWUgPSBwZWVrKCk7Ci0JCWxpc3Rbc2l6ZSAtIDFdID0gLTE7Ci0JCXNpemUtLTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFB1c2hlcyBhbiBpdGVtIG9udG8gdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZSAtCi0JICogICAgICAgICAgICB0aGUgaW50IHRvIGJlIHB1c2hlZCBvbnRvIHRoaXMgc3RhY2suCi0JICogQHJldHVybiB0aGUgPGNvZGU+bmV3VmFsdWU8L2NvZGU+IGFyZ3VtZW50LgotCSAqLwotCXB1YmxpYyBpbnQgcHVzaChpbnQgbmV3VmFsdWUpIHsKLQkJaWYgKHNpemUgPT0gbGlzdC5sZW5ndGgpIHsKLQkJCXRocm93IG5ldyBTdGFja092ZXJmbG93RXJyb3IoKTsKLQkJfQotCQlsaXN0W3NpemUrK10gPSBuZXdWYWx1ZTsKLQkJcmV0dXJuIG5ld1ZhbHVlOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGxpc3QubGVuZ3RoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQWJzdHJhY3RDU1NOb2RlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9BYnN0cmFjdENTU05vZGVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNzk5MWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9BYnN0cmFjdENTU05vZGVMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLQotCi0vKioKLSAqIAotICovCi1hYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENTU05vZGVMaXN0IHsKLQotCXByb3RlY3RlZCBWZWN0b3Igbm9kZXMgPSBudWxsOwotCi0JSUNTU05vZGUgYXBwZW5kTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMubm9kZXMgPT0gbnVsbCkKLQkJCXRoaXMubm9kZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCXRoaXMubm9kZXMuYWRkRWxlbWVudChub2RlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJaWYgKHRoaXMubm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gdGhpcy5ub2Rlcy5zaXplKCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgSUNTU05vZGUgaXRlbUltcGwoaW50IGluZGV4KSB7Ci0JCWlmICh0aGlzLm5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLm5vZGVzLnNpemUoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElDU1NOb2RlKSB0aGlzLm5vZGVzLmVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0KLQlJQ1NTTm9kZSByZW1vdmVOb2RlKGludCBpbmRleCkgewotCQlpZiAodGhpcy5ub2RlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIG5vIG5vZGUKLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLm5vZGVzLnNpemUoKSkKLQkJCXJldHVybiBudWxsOyAvLyBpbnZhbGlkIHBhcmFtZXRlcgotCi0JCUlDU1NOb2RlIHJlbW92ZWQgPSAoSUNTU05vZGUpIHRoaXMubm9kZXMuZWxlbWVudEF0KGluZGV4KTsKLQkJdGhpcy5ub2Rlcy5yZW1vdmVFbGVtZW50QXQoaW5kZXgpOwotCQlyZXR1cm4gcmVtb3ZlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0F0dHJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0F0dHJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMDRhNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NBdHRySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU0F0dHJJbXBsIGV4dGVuZHMgQ1NTUmVnaW9uQ29udGFpbmVyIGltcGxlbWVudHMgSUNTU0F0dHIgewotCi0JcHJpdmF0ZSBTdHJpbmcgZk5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZWYWx1ZSA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBvd25lckNTU05vZGUgPSBudWxsOwotCi0JQ1NTQXR0ckltcGwoQ1NTQXR0ckltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQkJdGhpcy5mTmFtZSA9IHRoYXQuZk5hbWU7Ci0JCXRoaXMuc2V0VmFsdWUodGhhdC5mVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENTU0F0dHIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NBdHRySW1wbChTdHJpbmcgbmFtZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmZOYW1lID0gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlyZXR1cm4gbmV3IENTU0F0dHJJbXBsKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05hbWVkTm9kZU1hcAotCSAqLwotCXB1YmxpYyBJQ1NTTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBmTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQVRUUl9OT0RFOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBnZXRPd25lckNTU05vZGUoKSB7Ci0JCXJldHVybiBvd25lckNTU05vZGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBmVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiAvKiAodGhpcy5uYW1lID09IG51bGwpICovZmFsc2U7Ci0JCWlmICh0aGlzLmZOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0aGlzLmZOYW1lLmVxdWFscyhuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlWYWx1ZUNoYW5nZWQoU3RyaW5nIG9sZFZhbHVlKSB7Ci0JCWlmICh0aGlzLm93bmVyQ1NTTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGZvciBtb2RlbAotCQlJQ1NTRG9jdW1lbnQgZG9jID0gb3duZXJDU1NOb2RlLmdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ1NTTW9kZWxJbXBsIG1vZGVsID0gKENTU01vZGVsSW1wbCkgZG9jLmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC52YWx1ZUNoYW5nZWQodGhpcywgb2xkVmFsdWUpOwotCi0JCS8vIGZvciBhZGFwdGVycwotCQlTdHJpbmcgdmFsdWUgPSBnZXRWYWx1ZSgpOwotCQl0aGlzLm93bmVyQ1NTTm9kZS5ub3RpZnkoQ0hBTkdFLCB0aGlzLCBvbGRWYWx1ZSwgdmFsdWUsIHRoaXMub3duZXJDU1NOb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nIG5ld05hbWUpIHsKLQkJZk5hbWUgPSBuZXdOYW1lOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE93bmVyQ1NTTm9kZShDU1NOb2RlSW1wbCBuZXdPd25lckNTU05vZGUpIHsKLQkJb3duZXJDU1NOb2RlID0gbmV3T3duZXJDU1NOb2RlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKGphdmEubGFuZy5TdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gZlZhbHVlOwotCQlmVmFsdWUgPSBuZXdWYWx1ZTsKLQotCQlub3RpZnlWYWx1ZUNoYW5nZWQob2xkVmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTQ2hhcnNldFJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0NoYXJzZXRSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzZjMzA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTQ2hhcnNldFJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQ2hhcnNldFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTQ2hhcnNldFJ1bGVJbXBsIGV4dGVuZHMgQ1NTUnVsZUltcGwgaW1wbGVtZW50cyBJQ1NTQ2hhcnNldFJ1bGUgewotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTQ2hhcnNldFJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCUNTU0NoYXJzZXRSdWxlSW1wbChDU1NDaGFyc2V0UnVsZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NDaGFyc2V0UnVsZUltcGwgY2xvbmVkID0gbmV3IENTU0NoYXJzZXRSdWxlSW1wbCh0aGlzKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIFRoZSBlbmNvZGluZyBpbmZvcm1hdGlvbiB1c2VkIGluIHRoaXMgPGNvZGU+QGNoYXJzZXQ8L2NvZGU+IHJ1bGUuCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBlbmNvZGluZyB2YWx1ZSBoYXMgYQotCSAqICAgICAgICAgICAgICAgIHN5bnRheCBlcnJvciBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgZW5jb2RpbmcKLQkgKiAgICAgICAgICAgICAgICBydWxlIGlzIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0JCXJldHVybiBDU1NVdGlsLmV4dHJhY3RTdHJpbmdDb250ZW50cyhnZXRBdHRyaWJ1dGUoRU5DT0RJTkcpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ0hBUlNFVFJVTEVfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgcnVsZSwgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQKLQkgKiBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBjYXN0IGRvd24gZnJvbSBhbgotCSAqIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5DU1NSdWxlPC9jb2RlPiBpbnRlcmZhY2UgdG8gdGhlIHNwZWNpZmljCi0JICogZGVyaXZlZCBpbnRlcmZhY2UgaW1wbGllZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4uCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBDSEFSU0VUX1JVTEU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHF1b3RlID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQlTdHJpbmcgZW5jID0gQ1NTVXRpbC5leHRyYWN0U3RyaW5nQ29udGVudHMoZW5jb2RpbmcpOwotCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUoZW5jLCBxdW90ZSk7Ci0JCXNldEF0dHJpYnV0ZShFTkNPRElORywgcXVvdGUgKyBlbmMgKyBxdW90ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NEZWNsYXJhdGlvbkl0ZW1QYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZDlmMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NEZWNsYXJhdGlvbkl0ZW1QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNvdW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5UZXh0UmVnaW9uTGlzdEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU0RlY2xhcmF0aW9uSXRlbVBhcnNlciB7Ci0JLyoqCi0JICogCi0JICovCi0JZmluYWwgY2xhc3MgRmxvYXRJbmZvIHsKLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJRmxvYXRJbmZvKFN0cmluZyB0ZXh0KSB7Ci0JCQlwYXJzZSh0ZXh0KTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXZvaWQgcGFyc2UoU3RyaW5nIHRleHQpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZWYWx1ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCVN0cmluZ0J1ZmZlciBidWZJZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJvb2xlYW4gYk51bSA9IHRydWU7Ci0JCQlpbnQgbGVuID0gdGV4dC5sZW5ndGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCQljaGFyIGMgPSB0ZXh0LmNoYXJBdChpKTsKLQkJCQlpZiAoYk51bSkgewotCQkJCQlpZiAoJzAnIDw9IGMgJiYgYyA8PSAnOScgfHwgYyA9PSAnLicgfHwgYyA9PSAnKycgfHwgYyA9PSAnLScpIHsKLQkJCQkJCWJ1ZlZhbHVlLmFwcGVuZChjKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWJ1ZklkZW50LmFwcGVuZChjKTsKLQkJCQkJCWJOdW0gPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYnVmSWRlbnQuYXBwZW5kKGMpOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyB2YWx1ZVN0ciA9IGJ1ZlZhbHVlLnRvU3RyaW5nKCk7Ci0JCQlmVmFsdWUgPSBGbG9hdC52YWx1ZU9mKHZhbHVlU3RyKS5mbG9hdFZhbHVlKCk7Ci0JCQlmSWRlbnRpZmllciA9IGJ1ZklkZW50LnRvU3RyaW5nKCk7Ci0JCQlmVHlwZSA9IGdldEZsb2F0VmFsdWVUeXBlKHZhbHVlU3RyLCBmSWRlbnRpZmllcik7Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlmbG9hdCBnZXRWYWx1ZSgpIHsKLQkJCXJldHVybiBmVmFsdWU7Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlTdHJpbmcgZ2V0SWRlbnRpZmllcigpIHsKLQkJCXJldHVybiBmSWRlbnRpZmllcjsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXNob3J0IGdldFZhbHVlVHlwZSgpIHsKLQkJCXJldHVybiBmVHlwZTsKLQkJfQotCi0JCXByaXZhdGUgZmxvYXQgZlZhbHVlID0gMC4wZjsKLQkJcHJpdmF0ZSBTdHJpbmcgZklkZW50aWZpZXIgPSBudWxsOwotCQlwcml2YXRlIHNob3J0IGZUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VOS05PV047Ci0JfQotCi0JZmluYWwgc3RhdGljIGludCBTX05PUk1BTCA9IDA7Ci0JZmluYWwgc3RhdGljIGludCBTX0ZVTkNUSU9OID0gMTsKLQlmaW5hbCBzdGF0aWMgaW50IFNfRk9OVF9TTEFTSCA9IDI7Ci0JZmluYWwgc3RhdGljIGludCBTX0NPTU1BX1NFUEFSQVRJT04gPSAzOwotCXByaXZhdGUgSUNTU0RvY3VtZW50IGZEb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZQYXJlbnRSZWdpb24gPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmVGVtcFN0cnVjdHVyZWREb2N1bWVudCA9IGZhbHNlOwotCXByaXZhdGUgQ1NTTW9kZWxVcGRhdGVDb250ZXh0IGZVcGRhdGVDb250ZXh0ID0gbnVsbDsKLQotCS8qKgotCSAqIENTU0RlY2xhcmF0aW9uSXRlbVBhcnNlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU0RlY2xhcmF0aW9uSXRlbVBhcnNlcihJQ1NTRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKCk7Ci0JCWZEb2N1bWVudCA9IGRvYzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVBdHRyVmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nIGZ1bmNOYW1lID0gZ2V0RnVuY3Rpb25OYW1lKHJlZ2lvbnMpOwotCQlpZiAoZnVuY05hbWUgPT0gbnVsbCB8fCAhZnVuY05hbWUudG9Mb3dlckNhc2UoKS5lcXVhbHMoImF0dHIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgYWNjZXB0c1tdID0ge0NTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVH07Ci0JCUlUZXh0UmVnaW9uTGlzdCB2YWx1ZVJlZ2lvbnMgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMocmVnaW9ucywgYWNjZXB0cyk7Ci0JCWlmICh2YWx1ZVJlZ2lvbnMuc2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gZ2V0Q1NTUHJpbWl0aXZlVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0FUVFIpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSB2YWx1ZVJlZ2lvbnMuZ2V0KDApOwotCQl2YWx1ZS5zZXRWYWx1ZShnZXRUZXh0KHJlZ2lvbikpOwotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVDb3VudGVyc1ZhbHVlKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCVN0cmluZyBmdW5jTmFtZSA9IGdldEZ1bmN0aW9uTmFtZShyZWdpb25zKTsKLQkJaWYgKGZ1bmNOYW1lID09IG51bGwgfHwgIWZ1bmNOYW1lLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJjb3VudGVycyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nIGFjY2VwdHNbXSA9IHtDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQsIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkd9OwotCQlJVGV4dFJlZ2lvbkxpc3QgdmFsdWVSZWdpb25zID0gZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzKHJlZ2lvbnMsIGFjY2VwdHMpOwotCQlpbnQgc2l6ZSA9IHZhbHVlUmVnaW9ucy5zaXplKCk7Ci0JCWlmIChzaXplICE9IDIgJiYgc2l6ZSAhPSAzKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNvdW50ZXJJbXBsIHZhbHVlID0gZ2V0Q291bnRlcigpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gdmFsdWVSZWdpb25zLmdldChpKTsKLQkJCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dChyZWdpb24pOwotCQkJQ1NTQXR0ckltcGwgYXR0ciA9IG51bGw7Ci0JCQlzd2l0Y2ggKGkpIHsKLQkJCQljYXNlIDAgOgotCQkJCQl2YWx1ZS5zZXRJZGVudGlmaWVyKHRleHQpOwotCQkJCQlhdHRyID0gdmFsdWUuZ2V0QXR0cmlidXRlTm9kZShJQ291bnRlci5JREVOVElGSUVSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJdmFsdWUuc2V0U2VwYXJhdG9yKHRleHQpOwotCQkJCQlhdHRyID0gdmFsdWUuZ2V0QXR0cmlidXRlTm9kZShJQ291bnRlci5TRVBBUkFUT1IpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDIgOgotCQkJCQl2YWx1ZS5zZXRMaXN0U3R5bGUodGV4dCk7Ci0JCQkJCWF0dHIgPSB2YWx1ZS5nZXRBdHRyaWJ1dGVOb2RlKElDb3VudGVyLkxJU1RTVFlMRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQlhdHRyLnNldFJhbmdlUmVnaW9uKGZQYXJlbnRSZWdpb24sIHJlZ2lvbiwgcmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVDb3VudGVyVmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nIGZ1bmNOYW1lID0gZ2V0RnVuY3Rpb25OYW1lKHJlZ2lvbnMpOwotCQlpZiAoZnVuY05hbWUgPT0gbnVsbCB8fCAhZnVuY05hbWUudG9Mb3dlckNhc2UoKS5lcXVhbHMoImNvdW50ZXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyBhY2NlcHRzW10gPSB7Q1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UfTsKLQkJSVRleHRSZWdpb25MaXN0IHZhbHVlUmVnaW9ucyA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycyhyZWdpb25zLCBhY2NlcHRzKTsKLQkJaW50IHNpemUgPSB2YWx1ZVJlZ2lvbnMuc2l6ZSgpOwotCQlpZiAoc2l6ZSAhPSAxICYmIHNpemUgIT0gMikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDb3VudGVySW1wbCB2YWx1ZSA9IGdldENvdW50ZXIoKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHZhbHVlUmVnaW9ucy5nZXQoaSk7Ci0JCQlTdHJpbmcgdGV4dCA9IGdldFRleHQocmVnaW9uKTsKLQkJCUNTU0F0dHJJbXBsIGF0dHIgPSBudWxsOwotCQkJc3dpdGNoIChpKSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJdmFsdWUuc2V0SWRlbnRpZmllcih0ZXh0KTsKLQkJCQkJYXR0ciA9IHZhbHVlLmdldEF0dHJpYnV0ZU5vZGUoSUNvdW50ZXIuSURFTlRJRklFUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMSA6Ci0JCQkJCXZhbHVlLnNldExpc3RTdHlsZSh0ZXh0KTsKLQkJCQkJYXR0ciA9IHZhbHVlLmdldEF0dHJpYnV0ZU5vZGUoSUNvdW50ZXIuTElTVFNUWUxFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCWF0dHIuc2V0UmFuZ2VSZWdpb24oZlBhcmVudFJlZ2lvbiwgcmVnaW9uLCByZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTU3R5bGVEZWNsSXRlbUltcGwgY3JlYXRlRGVjbGFyYXRpb25JdGVtKElUZXh0UmVnaW9uTGlzdCBub2RlUmVnaW9ucykgewotCQlDU1NTdHlsZURlY2xJdGVtSW1wbCBpdGVtID0gbnVsbDsKLQkJU3RyaW5nIG5hbWUgPSBnZXRQcm9wZXJ0eU5hbWUobm9kZVJlZ2lvbnMpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlpdGVtID0gZ2V0Q1NTU3R5bGVEZWNsSXRlbShuYW1lKTsKLQkJfQotCQlyZXR1cm4gaXRlbTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVGbG9hdFZhbHVlKFN0cmluZyB0ZXh0LCBTdHJpbmcgdHlwZSkgewotCQlGbG9hdEluZm8gaW5mbyA9IG5ldyBGbG9hdEluZm8odGV4dCk7Ci0JCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSA9IGdldENTU1ByaW1pdGl2ZVZhbHVlKGluZm8uZ2V0VmFsdWVUeXBlKCkpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJdmFsdWUuc2V0VmFsdWUoaW5mby5nZXRWYWx1ZSgpKTsKLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlRm9ybWF0VmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nIGZ1bmNOYW1lID0gZ2V0RnVuY3Rpb25OYW1lKHJlZ2lvbnMpOwotCQlpZiAoZnVuY05hbWUgPT0gbnVsbCB8fCAhZnVuY05hbWUudG9Mb3dlckNhc2UoKS5lcXVhbHMoImZvcm1hdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBhY2NlcHRzW10gPSB7Q1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklOR307Ci0JCUlUZXh0UmVnaW9uTGlzdCB2YWx1ZVJlZ2lvbnMgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMocmVnaW9ucywgYWNjZXB0cyk7Ci0JCS8vIGZvcm1hdCBjYW4gdGFrZSB2YXJpYWJsZSBhcmdzLgotCQlpZiAodmFsdWVSZWdpb25zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSA9IGdldENTU1ByaW1pdGl2ZVZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRk9STUFUKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gdmFsdWVSZWdpb25zLmdldCgwKTsKLQkJdmFsdWUuc2V0VmFsdWUoQ1NTVXRpbC5leHRyYWN0U3RyaW5nQ29udGVudHMoZ2V0VGV4dChyZWdpb24pKSk7Ci0KLQkJcmV0dXJuIHZhbHVlOwotCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlTG9jYWxWYWx1ZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmcgZnVuY05hbWUgPSBnZXRGdW5jdGlvbk5hbWUocmVnaW9ucyk7Ci0JCWlmIChmdW5jTmFtZSA9PSBudWxsIHx8ICFmdW5jTmFtZS50b0xvd2VyQ2FzZSgpLmVxdWFscygibG9jYWwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgYWNjZXB0c1tdID0ge0NTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkd9OwotCQlJVGV4dFJlZ2lvbkxpc3QgdmFsdWVSZWdpb25zID0gZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzKHJlZ2lvbnMsIGFjY2VwdHMpOwotCQlpZiAodmFsdWVSZWdpb25zLnNpemUoKSAhPSAxKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSA9IGdldENTU1ByaW1pdGl2ZVZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTE9DQUwpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSB2YWx1ZVJlZ2lvbnMuZ2V0KDApOwotCQl2YWx1ZS5zZXRWYWx1ZShDU1NVdGlsLmV4dHJhY3RTdHJpbmdDb250ZW50cyhnZXRUZXh0KHJlZ2lvbikpKTsKLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlUHJpbWl0aXZlVmFsdWUoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlTdHJpbmcgdGV4dCA9IGdldFRleHQocmVnaW9uKTsKLQkJaWYgKGlzQmxhbmsodHlwZSkpIHsKLQkJCXZhbHVlID0gbnVsbDsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRElNRU5TSU9OIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UpIHsKLQkJCXZhbHVlID0gY3JlYXRlRmxvYXRWYWx1ZSh0ZXh0LCB0eXBlKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkcgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCXZhbHVlID0gY3JlYXRlU3RyaW5nVmFsdWUodGV4dCwgdHlwZSk7Ci0JCX0KLQotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdmFsdWUgPSBjcmVhdGVTdHJpbmdWYWx1ZSh0ZXh0LCB0eXBlKTsKLQkJfQotCi0JCWlmICghZlRlbXBTdHJ1Y3R1cmVkRG9jdW1lbnQgJiYgdmFsdWUgIT0gbnVsbCkgewotCQkJdmFsdWUuc2V0UmFuZ2VSZWdpb24oZlBhcmVudFJlZ2lvbiwgcmVnaW9uLCByZWdpb24pOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZVByaW1pdGl2ZVZhbHVlKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSA9IG51bGw7Ci0JCUNTU1V0aWwuc3RyaXBTdXJyb3VuZGluZ1NwYWNlKHJlZ2lvbnMpOwotCQlpZiAocmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDApOwotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IGdldFRleHQocmVnaW9uKS50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKHRleHQuZXF1YWxzKCJyZ2IoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXZhbHVlID0gY3JlYXRlUmdiVmFsdWUocmVnaW9ucyk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0ZXh0LmVxdWFscygiY291bnRlcigiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdmFsdWUgPSBjcmVhdGVDb3VudGVyVmFsdWUocmVnaW9ucyk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0ZXh0LmVxdWFscygiY291bnRlcnMoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXZhbHVlID0gY3JlYXRlQ291bnRlcnNWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHQuZXF1YWxzKCJhdHRyKCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl2YWx1ZSA9IGNyZWF0ZUF0dHJWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHQuZXF1YWxzKCJmb3JtYXQoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXZhbHVlID0gY3JlYXRlRm9ybWF0VmFsdWUocmVnaW9ucyk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0ZXh0LmVxdWFscygibG9jYWwoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXZhbHVlID0gY3JlYXRlTG9jYWxWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHQuZXF1YWxzKCJyZWN0KCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl2YWx1ZSA9IGNyZWF0ZVJlY3RWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJdmFsdWUgPSBjcmVhdGVTdHJpbmdWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXZhbHVlID0gY3JlYXRlU3RyaW5nVmFsdWUocmVnaW9ucyk7Ci0JCX0KLQotCQlpZiAoIWZUZW1wU3RydWN0dXJlZERvY3VtZW50ICYmIHZhbHVlICE9IG51bGwpIHsKLQkJCXZhbHVlLnNldFJhbmdlUmVnaW9uKGZQYXJlbnRSZWdpb24sIHJlZ2lvbnMuZ2V0KDApLCByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpKTsKLQkJfQotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVSZWN0VmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nIGZ1bmNOYW1lID0gZ2V0RnVuY3Rpb25OYW1lKHJlZ2lvbnMpOwotCQlpZiAoZnVuY05hbWUgPT0gbnVsbCB8fCAhZnVuY05hbWUudG9Mb3dlckNhc2UoKS5lcXVhbHMoInJlY3QiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgYWNjZXB0c1tdID0ge0NTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIsIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04sIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVH07IC8vIElERU5UOgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmb3IKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2F1dG8nCi0JCUlUZXh0UmVnaW9uTGlzdCB2YWx1ZVJlZ2lvbnMgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMocmVnaW9ucywgYWNjZXB0cyk7Ci0JCWlmICh2YWx1ZVJlZ2lvbnMuc2l6ZSgpICE9IDQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJUmVjdEltcGwgdmFsdWUgPSBnZXRSZWN0KCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSB2YWx1ZVJlZ2lvbnMuZ2V0KGkpOwotCQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNoaWxkVmFsdWUgPSBudWxsOwotCQkJc3dpdGNoIChpKSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJY2hpbGRWYWx1ZSA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIHZhbHVlLmdldFRvcCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDEgOgotCQkJCQljaGlsZFZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgdmFsdWUuZ2V0UmlnaHQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyIDoKLQkJCQkJY2hpbGRWYWx1ZSA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIHZhbHVlLmdldEJvdHRvbSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDMgOgotCQkJCQljaGlsZFZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgdmFsdWUuZ2V0TGVmdCgpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoY2hpbGRWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlTdHJpbmcgdGV4dCA9IGdldFRleHQocmVnaW9uKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCXNldFN0cmluZ1ZhbHVlKGNoaWxkVmFsdWUsIHRleHQsIHR5cGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0RmxvYXRWYWx1ZShjaGlsZFZhbHVlLCB0ZXh0LCB0eXBlKTsKLQkJCX0KLQkJCWlmICghZlRlbXBTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQljaGlsZFZhbHVlLnNldFJhbmdlUmVnaW9uKGZQYXJlbnRSZWdpb24sIHJlZ2lvbiwgcmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVSZ2JWYWx1ZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmcgZnVuY05hbWUgPSBnZXRGdW5jdGlvbk5hbWUocmVnaW9ucyk7Ci0JCWlmIChmdW5jTmFtZSA9PSBudWxsIHx8ICFmdW5jTmFtZS50b0xvd2VyQ2FzZSgpLmVxdWFscygicmdiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGFjY2VwdHNbXSA9IHtDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSLCBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRX07Ci0JCUlUZXh0UmVnaW9uTGlzdCB2YWx1ZVJlZ2lvbnMgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMocmVnaW9ucywgYWNjZXB0cyk7Ci0JCWlmICh2YWx1ZVJlZ2lvbnMuc2l6ZSgpICE9IDMpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJUkdCQ29sb3JJbXBsIHZhbHVlID0gZ2V0UkdCQ29sb3IoKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHZhbHVlUmVnaW9ucy5nZXQoaSk7Ci0JCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgY2hpbGRWYWx1ZSA9IG51bGw7Ci0JCQlzd2l0Y2ggKGkpIHsKLQkJCQljYXNlIDAgOgotCQkJCQljaGlsZFZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgdmFsdWUuZ2V0UmVkKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMSA6Ci0JCQkJCWNoaWxkVmFsdWUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSB2YWx1ZS5nZXRHcmVlbigpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDIgOgotCQkJCQljaGlsZFZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgdmFsdWUuZ2V0Qmx1ZSgpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoY2hpbGRWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlzZXRGbG9hdFZhbHVlKGNoaWxkVmFsdWUsIGdldFRleHQocmVnaW9uKSwgcmVnaW9uLmdldFR5cGUoKSk7Ci0JCQlpZiAoIWZUZW1wU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJY2hpbGRWYWx1ZS5zZXRSYW5nZVJlZ2lvbihmUGFyZW50UmVnaW9uLCByZWdpb24sIHJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlU3RyaW5nVmFsdWUoU3RyaW5nIHRleHQsIFN0cmluZyB0eXBlKSB7Ci0JCXNob3J0IHZhbHVlVHlwZSA9IGdldFN0cmluZ1ZhbHVlVHlwZSh0ZXh0LCB0eXBlKTsKLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gZ2V0Q1NTUHJpbWl0aXZlVmFsdWUodmFsdWVUeXBlKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCWlmICh2YWx1ZVR5cGUgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VSSSkgewotCQkJCXRleHQgPSBDU1NVdGlsLmV4dHJhY3RVcmlDb250ZW50cyh0ZXh0KTsKLQkJCX0KLQkJCWVsc2UgaWYgKHZhbHVlVHlwZSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfU1RSSU5HKSB7Ci0JCQkJdGV4dCA9IENTU1V0aWwuZXh0cmFjdFN0cmluZ0NvbnRlbnRzKHRleHQpOwotCQkJfQotCQkJdmFsdWUuc2V0VmFsdWUodGV4dCk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZVN0cmluZ1ZhbHVlKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCVN0cmluZyB0eXBlID0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UOwotCQlpZiAocmVnaW9ucy5zaXplKCkgPT0gMSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCQl0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gY3JlYXRlU3RyaW5nVmFsdWUobWFrZVN0cmluZyhyZWdpb25zKSwgdHlwZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDb3VudGVySW1wbCBnZXRDb3VudGVyKCkgewotCQlDb3VudGVySW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQgIT0gbnVsbCAmJiBmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0Q291bnRlcigpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChDb3VudGVySW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlLkNTU19DT1VOVEVSKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBnZXRDU1NQcmltaXRpdmVWYWx1ZShzaG9ydCB0eXBlKSB7Ci0JCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQgIT0gbnVsbCAmJiBmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0Q1NTUHJpbWl0aXZlVmFsdWUodHlwZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKHR5cGUpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTU3R5bGVEZWNsSXRlbUltcGwgZ2V0Q1NTU3R5bGVEZWNsSXRlbShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dCAhPSBudWxsICYmIGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDU1NTdHlsZURlY2xJdGVtKHByb3BlcnR5TmFtZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKENTU1N0eWxlRGVjbEl0ZW1JbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTU3R5bGVEZWNsSXRlbShwcm9wZXJ0eU5hbWUpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBzaG9ydCBnZXRGbG9hdFZhbHVlVHlwZShTdHJpbmcgaWRlbnQpIHsKLQkJaWRlbnQgPSBpZGVudC50b0xvd2VyQ2FzZSgpOwotCQlzaG9ydCB2YWx1ZVR5cGU7Ci0JCWlmIChpZGVudC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTlVNQkVSOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFscygiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QRVJDRU5UQUdFOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImVtIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VNUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJleCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FWFM7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgicHgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFg7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiY20iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ007Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgibW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTU07Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiaW4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU47Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgicHQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFQ7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgicGMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEM7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiZGVnIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RFRzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJyYWQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkFEOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImdyYWQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfR1JBRDsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJtcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1M7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiaHoiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSFo7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgia2h6IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0tIWjsKLQkJfQotCQllbHNlIHsKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19ESU1FTlNJT047Ci0JCX0KLQkJcmV0dXJuIHZhbHVlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgc2hvcnQgZ2V0RmxvYXRWYWx1ZVR5cGUoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaWRlbnQpIHsKLQkJaWRlbnQgPSBpZGVudC50b0xvd2VyQ2FzZSgpOwotCQlzaG9ydCB2YWx1ZVR5cGU7Ci0JCWlmIChpZGVudC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpZiAoMCA8PSB2YWx1ZS5pbmRleE9mKCcuJykpIHsKLQkJCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTlVNQkVSOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdmFsdWVUeXBlID0gSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTlRFR0VSOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFscygiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QRVJDRU5UQUdFOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImVtIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VNUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJleCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FWFM7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgicHgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFg7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiY20iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ007Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgibW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTU07Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiaW4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU47Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgicHQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFQ7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgicGMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEM7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiZGVnIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RFRzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJyYWQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkFEOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImdyYWQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfR1JBRDsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJtcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1M7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiaHoiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSFo7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgia2h6IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0tIWjsKLQkJfQotCQllbHNlIHsKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19ESU1FTlNJT047Ci0JCX0KLQkJcmV0dXJuIHZhbHVlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRGdW5jdGlvbk5hbWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCB8fCByZWdpb25zLnNpemUoKSA8IDIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlUZXh0UmVnaW9uIGZpcnN0UmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCWlmIChmaXJzdFJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIHRleHQgPSBnZXRUZXh0KGZpcnN0UmVnaW9uKTsKLQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIHRleHQubGVuZ3RoKCkgLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIG1ldGhvZCBoYXMgbm8gdmFsaWRhdGlvbiBjaGVjaywgdGhlbiByZWdpb25zIG11c3QgYmUgcGFzc2VkCi0JICogZ2V0RnVuY3Rpb25OYW1lKCkuLi4KLQkgKi8KLQlwcml2YXRlIElUZXh0UmVnaW9uTGlzdCBnZXRGdW5jdGlvblBhcmFtZXRlcnMoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMsIFN0cmluZ1tdIGFjY2VwdHMpIHsKLQkJSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKCk7Ci0JCWludCBuQWNjZXB0cyA9IChhY2NlcHRzICE9IG51bGwpID8gYWNjZXB0cy5sZW5ndGggOiAwOwotCQlJdGVyYXRvciBpID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQlpLm5leHQoKTsgLy8gc2tpcCBGVU5DVElPTgotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaS5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChpc0JsYW5rKHR5cGUpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAobkFjY2VwdHMgPT0gMCkgewotCQkJCW5ld1JlZ2lvbnMuYWRkKHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmb3IgKGludCBpQWNjZXB0ID0gMDsgaUFjY2VwdCA8IG5BY2NlcHRzOyBpQWNjZXB0KyspIHsKLQkJCQkJaWYgKHR5cGUgPT0gYWNjZXB0c1tpQWNjZXB0XSkgewotCQkJCQkJbmV3UmVnaW9ucy5hZGQocmVnaW9uKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdSZWdpb25zOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCS8vIHByaXZhdGUgU3RyaW5nIGdldFByb3BlcnR5TmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JLy8gVmVjdG9yIG5vZGVSZWdpb25zID0gbmV3IFZlY3RvcihmbGF0Tm9kZS5nZXRSZWdpb25zKCkpOwotCS8vIHJldHVybiBnZXRQcm9wZXJ0eU5hbWUobm9kZVJlZ2lvbnMpOwotCS8vIH0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCBuYW1lUmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoKTsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQl3aGlsZSAoIW5vZGVSZWdpb25zLmlzRW1wdHkoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gbm9kZVJlZ2lvbnMucmVtb3ZlKDApOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SKSB7Ci0JCQkJQ1NTVXRpbC5zdHJpcFN1cnJvdW5kaW5nU3BhY2UobmFtZVJlZ2lvbnMpOwotCQkJCW5hbWUgPSBtYWtlU3RyaW5nKG5hbWVSZWdpb25zKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5hbWVSZWdpb25zLmFkZChyZWdpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgUmVjdEltcGwgZ2V0UmVjdCgpIHsKLQkJUmVjdEltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0ICE9IG51bGwgJiYgZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldFJlY3QoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoUmVjdEltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkVDVCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBSR0JDb2xvckltcGwgZ2V0UkdCQ29sb3IoKSB7Ci0JCVJHQkNvbG9ySW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQgIT0gbnVsbCAmJiBmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0UkdCQ29sb3IoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoUkdCQ29sb3JJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JHQkNPTE9SKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHNob3J0IGdldFN0cmluZ1ZhbHVlVHlwZShTdHJpbmcgdGV4dCwgU3RyaW5nIHR5cGUpIHsKLQkJc2hvcnQgdmFsdWVUeXBlOwotCQlpZiAodGV4dC50b0xvd2VyQ2FzZSgpLmVxdWFscygiaW5oZXJpdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5IRVJJVF9QUklNSVRJVkU7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJKSB7Ci0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVVJJOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORykgewotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1NUUklORzsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQl2YWx1ZVR5cGUgPSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0hBU0g7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgJiYgdGV4dC5lcXVhbHMoIiwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPTU1BOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SICYmIHRleHQuZXF1YWxzKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19TTEFTSDsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VTklDT0RFX1JBTkdFKSB7Ci0JCQl2YWx1ZVR5cGUgPSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VSQU5HRTsKLQkJfQotCQllbHNlIHsKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JREVOVDsKLQkJfQotCQlyZXR1cm4gdmFsdWVUeXBlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgU3RyaW5nIG1ha2VTdHJpbmcoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYm9vbGVhbiBiU3BhY2UgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvciBpID0gcmVnaW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAoIWJTcGFjZSAmJiBpc0JsYW5rKHR5cGUpKSB7Ci0JCQkJYnVmLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJYlNwYWNlID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJ1Zi5hcHBlbmQoZ2V0VGV4dChyZWdpb24pKTsKLQkJCQliU3BhY2UgPSBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudFRlbXBvcmFyeShib29sZWFuIGJUZW1wKSB7Ci0JCWZUZW1wU3RydWN0dXJlZERvY3VtZW50ID0gYlRlbXA7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEZsb2F0VmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlLCBTdHJpbmcgdGV4dCwgU3RyaW5nIHR5cGUpIHsKLQkJRmxvYXRJbmZvIGluZm8gPSBuZXcgRmxvYXRJbmZvKHRleHQpOwotCQl2YWx1ZS5zZXRGbG9hdFZhbHVlKGluZm8uZ2V0VmFsdWVUeXBlKCksIGluZm8uZ2V0VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFN0cmluZ1ZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSwgU3RyaW5nIHRleHQsIFN0cmluZyB0eXBlKSB7Ci0JCXNob3J0IHZhbHVlVHlwZSA9IGdldFN0cmluZ1ZhbHVlVHlwZSh0ZXh0LCB0eXBlKTsKLQkJdmFsdWUuc2V0U3RyaW5nVmFsdWUodmFsdWVUeXBlLCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXRlbQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU1N0eWxlRGVjbEl0ZW0KLQkgKiBAcGFyYW0gbm9kZVJlZ2lvbnMKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0dXBJbXBvcnRhbnRBdHRyaWJ1dGUoSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSwgSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zKSB7Ci0JCWlmIChpdGVtID09IG51bGwgfHwgbm9kZVJlZ2lvbnMgPT0gbnVsbCB8fCBub2RlUmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBub2RlUmVnaW9ucy5nZXQobm9kZVJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCAmJiByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQpIHsKLQkJCWl0ZW0uc2V0UHJpb3JpdHkoZ2V0VGV4dChyZWdpb24pKTsKLQkJCUNTU0F0dHJJbXBsIGF0dHIgPSAoKENTU1N0eWxlRGVjbEl0ZW1JbXBsKSBpdGVtKS5nZXRBdHRyaWJ1dGVOb2RlKElDU1NTdHlsZURlY2xJdGVtLklNUE9SVEFOVCk7Ci0JCQlhdHRyLnNldFJhbmdlUmVnaW9uKGZQYXJlbnRSZWdpb24sIHJlZ2lvbiwgcmVnaW9uKTsKLQkJCW5vZGVSZWdpb25zLnJlbW92ZShyZWdpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRVcGRhdGVDb250ZXh0KENTU01vZGVsVXBkYXRlQ29udGV4dCB1cGRhdGVDb250ZXh0KSB7Ci0JCWZVcGRhdGVDb250ZXh0ID0gdXBkYXRlQ29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ29sb25TZXBhcmF0b3IoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGkubmV4dCgpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTU3R5bGVEZWNsSXRlbUltcGwgc2V0dXBEZWNsYXJhdGlvbkl0ZW0oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKCFoYXNDb2xvblNlcGFyYXRvcihmbGF0Tm9kZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZlBhcmVudFJlZ2lvbiA9IGZsYXROb2RlOwotCi0JCUlUZXh0UmVnaW9uTGlzdCBub2RlUmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoZmxhdE5vZGUuZ2V0UmVnaW9ucygpKTsgLy8gbWFrZQotCQkvLyBjb3B5Ci0JCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIG5ld0l0ZW0gPSBjcmVhdGVEZWNsYXJhdGlvbkl0ZW0obm9kZVJlZ2lvbnMpOwotCQlpZiAobmV3SXRlbSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoIWZUZW1wU3RydWN0dXJlZERvY3VtZW50ICYmIGZsYXROb2RlICE9IG51bGwpIHsKLQkJCW5ld0l0ZW0uc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUsIGZsYXROb2RlKTsKLQkJfQotCi0JCUNTU1V0aWwuc3RyaXBTdXJyb3VuZGluZ1NwYWNlKG5vZGVSZWdpb25zKTsKLQkJc2V0dXBJbXBvcnRhbnRBdHRyaWJ1dGUobmV3SXRlbSwgbm9kZVJlZ2lvbnMpOwotCQkvLyBOb3csIG5vZGVSZWdpb25zIGp1c3QgaGFzIHJlZ2lvbnMgZm9yIHZhbHVlLgotCQlzZXR1cFZhbHVlcyhuZXdJdGVtLCBub2RlUmVnaW9ucyk7Ci0JCXJldHVybiBuZXdJdGVtOwotCX0KLQotCXZvaWQgc2V0dXBWYWx1ZXMoSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnRSZWdpb24sIElUZXh0UmVnaW9uTGlzdCBub2RlUmVnaW9ucykgewotCQlmUGFyZW50UmVnaW9uID0gcGFyZW50UmVnaW9uOwotCQlzZXR1cFZhbHVlcyhpdGVtLCBub2RlUmVnaW9ucyk7Ci0JfQotCi0JLyoqCi0JICogbm9kZVJlZ2lvbnMgbXVzdCBiZSBicm9rZW4uIElmIHlvdSBuZWVkIGFmdGVyLCBtYWtlIGNvcHkgb2YgdGhlbS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0dXBWYWx1ZXMoSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSwgSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zKSB7Ci0JCWlmIChpdGVtID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbkJ1ZiA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoKTsKLQotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gaXRlbS5nZXRQcm9wZXJ0eU5hbWUoKS50b0xvd2VyQ2FzZSgpOwotCQlib29sZWFuIGJGb250ID0gKHByb3BlcnR5TmFtZS5lcXVhbHMoUHJvcENNUHJvcGVydHkuUF9GT05UKSk7Ci0JCS8vIChzaG9ydC1oYW5kKSBmb250Ci0JCWludCBzdGF0dXMgPSAocHJvcGVydHlOYW1lLmVxdWFscyhQcm9wQ01Qcm9wZXJ0eS5QX1ZPSUNFX0ZBTUlMWSkgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfRkFNSUxZKSkgPyBTX0NPTU1BX1NFUEFSQVRJT04gOiBTX05PUk1BTDsKLQkJd2hpbGUgKCFub2RlUmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCXZhbHVlID0gbnVsbDsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG5vZGVSZWdpb25zLnJlbW92ZSgwKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJLy8gaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUiB8fCB0eXBlCi0JCQkvLyA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQkvLyBicmVhazsKLQkJCS8vIH0KLQkJCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCQkJY2FzZSBTX05PUk1BTCA6Ci0JCQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCQkJcmVnaW9uQnVmLmFkZChyZWdpb24pOwotCQkJCQkJc3RhdHVzID0gU19GVU5DVElPTjsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChiRm9udCAmJiB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiAmJiBmUGFyZW50UmVnaW9uLmdldFRleHQocmVnaW9uKS5lcXVhbHMoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQl2YWx1ZSA9IGNyZWF0ZVByaW1pdGl2ZVZhbHVlKHJlZ2lvbik7Ci0JCQkJCQlzdGF0dXMgPSBTX0ZPTlRfU0xBU0g7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoIWlzQmxhbmsodHlwZSkpIHsKLQkJCQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIFNfRlVOQ1RJT04gOgotCQkJCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpIHsKLQkJCQkJCXJlZ2lvbkJ1Zi5hZGQocmVnaW9uKTsKLQkJCQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uQnVmKTsKLQkJCQkJCXJlZ2lvbkJ1Zi5jbGVhcigpOwotCQkJCQkJc3RhdHVzID0gU19OT1JNQUw7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoIWlzQmxhbmsodHlwZSkpIHsKLQkJCQkJCXJlZ2lvbkJ1Zi5hZGQocmVnaW9uKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIFNfRk9OVF9TTEFTSCA6Ci0JCQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04pIHsKLQkJCQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uKTsKLQkJCQkJCXN0YXR1cyA9IFNfQ09NTUFfU0VQQVJBVElPTjsKLQkJCQkJfQotCQkJCQllbHNlIGlmICghaXNCbGFuayh0eXBlKSkgewotCQkJCQkJdmFsdWUgPSBjcmVhdGVQcmltaXRpdmVWYWx1ZShyZWdpb24pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU19DT01NQV9TRVBBUkFUSU9OIDoKLQkJCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SICYmIGZQYXJlbnRSZWdpb24uZ2V0VGV4dChyZWdpb24pLmVxdWFscygiLCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uQnVmKTsKLQkJCQkJCXJlZ2lvbkJ1Zi5jbGVhcigpOwotCQkJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoZlVwZGF0ZUNvbnRleHQgPT0gbnVsbCB8fCAhZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJCQkJCQlpdGVtLmFwcGVuZFZhbHVlKHZhbHVlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQl2YWx1ZSA9IGNyZWF0ZVByaW1pdGl2ZVZhbHVlKHJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZWdpb25CdWYuYWRkKHJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQlpZiAoZlVwZGF0ZUNvbnRleHQgPT0gbnVsbCB8fCAhZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJCQlpdGVtLmFwcGVuZFZhbHVlKHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCFyZWdpb25CdWYuaXNFbXB0eSgpKSB7Ci0JCQl2YWx1ZSA9IGNyZWF0ZVByaW1pdGl2ZVZhbHVlKHJlZ2lvbkJ1Zik7Ci0JCQlpZiAoZlVwZGF0ZUNvbnRleHQgPT0gbnVsbCB8fCAhZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJCWl0ZW0uYXBwZW5kVmFsdWUodmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dChJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIChmUGFyZW50UmVnaW9uICE9IG51bGwpID8gZlBhcmVudFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbikgOiAiIjsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQmxhbmsoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0RvY3VtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NEb2N1bWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhNTQzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0RvY3VtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NDaGFyc2V0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01lZGlhUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1BhZ2VSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVW5rbm93blJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0OwotCi0KLS8qKgotICogCi0gKi8KLWFic3RyYWN0IGNsYXNzIENTU0RvY3VtZW50SW1wbCBleHRlbmRzIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBpbXBsZW1lbnRzIElDU1NEb2N1bWVudCB7Ci0KLQlwcml2YXRlIENTU01vZGVsSW1wbCBmTW9kZWwgPSBudWxsOwotCi0JLyoqCi0JICogQ1NTRG9jdW1lbnRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTRG9jdW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JQ1NTRG9jdW1lbnRJbXBsKENTU0RvY3VtZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCUlDU1NOb2RlIGNyZWF0ZUNTU0F0dHIoU3RyaW5nIG5hbWUpIHsKLQkJQ1NTQXR0ckltcGwgYXR0ciA9IG5ldyBDU1NBdHRySW1wbChuYW1lKTsKLQkJYXR0ci5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU0NoYXJzZXRSdWxlCi0JICovCi0JcHVibGljIElDU1NDaGFyc2V0UnVsZSBjcmVhdGVDU1NDaGFyc2V0UnVsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlCi0JICovCi0JcHVibGljIENTU0ZvbnRGYWNlUnVsZSBjcmVhdGVDU1NGb250RmFjZVJ1bGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU0ltcG9ydFJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU0ltcG9ydFJ1bGUgY3JlYXRlQ1NTSW1wb3J0UnVsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuSUNTU01lZGlhUnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTTWVkaWFSdWxlIGNyZWF0ZUNTU01lZGlhUnVsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUGFnZVJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU1BhZ2VSdWxlIGNyZWF0ZUNTU1BhZ2VSdWxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqLwotCXB1YmxpYyBJQ1NTUHJpbWl0aXZlVmFsdWUgY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoc2hvcnQgcHJpbWl0aXZlVHlwZSkgewotCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgdmFsdWUgPSBudWxsOwotCQlpZiAocHJpbWl0aXZlVHlwZSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ09VTlRFUikKLQkJCXZhbHVlID0gbmV3IENvdW50ZXJJbXBsKCk7Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZVR5cGUgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JFQ1QpCi0JCQl2YWx1ZSA9IG5ldyBSZWN0SW1wbCgpOwotCQllbHNlIGlmIChwcmltaXRpdmVUeXBlID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SR0JDT0xPUikKLQkJCXZhbHVlID0gbmV3IFJHQkNvbG9ySW1wbCgpOwotCQllbHNlCi0JCQl2YWx1ZSA9IG5ldyBDU1NQcmltaXRpdmVWYWx1ZUltcGwocHJpbWl0aXZlVHlwZSk7Ci0JCXZhbHVlLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDU1NSdWxlIGNyZWF0ZUNTU1J1bGUoU3RyaW5nIHJ1bGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBJQ1NTU3R5bGVEZWNsYXJhdGlvbiBjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNTU1N0eWxlRGVjbEl0ZW0gY3JlYXRlQ1NTU3R5bGVEZWNsSXRlbShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIGl0ZW0gPSBuZXcgQ1NTU3R5bGVEZWNsSXRlbUltcGwocHJvcGVydHlOYW1lKTsKLQkJaXRlbS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiBpdGVtOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlUnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTU3R5bGVSdWxlIGNyZWF0ZUNTU1N0eWxlUnVsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTVW5rbm93blJ1bGUKLQkgKi8KLQlwdWJsaWMgQ1NTVW5rbm93blJ1bGUgY3JlYXRlQ1NTVW5rbm93blJ1bGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0Ci0JICovCi0JcHVibGljIE1lZGlhTGlzdCBjcmVhdGVNZWRpYUxpc3QoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJQ1NTTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiBmTW9kZWw7Ci0JfQotCi0Jdm9pZCBzZXRNb2RlbChDU1NNb2RlbEltcGwgbW9kZWwpIHsKLQkJdGhpcy5mTW9kZWwgPSBtb2RlbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0ZvbnRGYWNlUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTRm9udEZhY2VSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGNkOWY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTRm9udEZhY2VSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZTsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NGb250RmFjZVJ1bGVJbXBsIGV4dGVuZHMgQ1NTUnVsZURlY2xDb250YWluZXIgaW1wbGVtZW50cyBDU1NGb250RmFjZVJ1bGUgewotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTRm9udEZhY2VSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NGb250RmFjZVJ1bGVJbXBsKENTU0ZvbnRGYWNlUnVsZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NGb250RmFjZVJ1bGVJbXBsIGNsb25lZCA9IG5ldyBDU1NGb250RmFjZVJ1bGVJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZXh0cmFjdFByZVN0cmluZygpIHsKLQkJcmV0dXJuICJAZm9udC1mYWNlIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIEZPTlRGQUNFUlVMRV9OT0RFOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBydWxlLCBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdAotCSAqIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNhc3QgZG93biBmcm9tIGFuCi0JICogaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkNTU1J1bGU8L2NvZGU+IGludGVyZmFjZSB0byB0aGUgc3BlY2lmaWMKLQkgKiBkZXJpdmVkIGludGVyZmFjZSBpbXBsaWVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEZPTlRfRkFDRV9SVUxFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTSW1wb3J0UnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTSW1wb3J0UnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZhMzg1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0ltcG9ydFJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JTW9kZWxQcm92aWRlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU0xpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5VUkxNb2RlbFByb3ZpZGVyQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0OwotCi0KLS8qKgotICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLSAqLwotcHVibGljIGNsYXNzIENTU0ltcG9ydFJ1bGVJbXBsIGV4dGVuZHMgQ1NTUnVsZUltcGwgaW1wbGVtZW50cyBJQ1NTSW1wb3J0UnVsZSB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkRpcnR5ID0gdHJ1ZTsKLQlwcml2YXRlIElDU1NTdHlsZVNoZWV0IGZTdHlsZVNoZWV0OwotCi0JLyoqCi0gICAgICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLSAgICAgKi8KLQlwdWJsaWMgQ1NTSW1wb3J0UnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIENTU0ltcG9ydFJ1bGVJbXBsKENTU0ltcG9ydFJ1bGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTSW1wb3J0UnVsZUltcGwgY2xvbmVkID0gbmV3IENTU0ltcG9ydFJ1bGVJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGNsb3NlU3R5bGVTaGVldCgpIHsKLQkJaWYgKGZTdHlsZVNoZWV0ICE9IG51bGwpIHsKLQkJCUlDU1NTdHlsZVNoZWV0IHNoZWV0ID0gZlN0eWxlU2hlZXQ7Ci0JCQlmU3R5bGVTaGVldCA9IG51bGw7IC8vIHRvIHByZXZlbnQgbG9vcCwgd2UgbXVzdCByZXNldCBmU3R5bGVTaGVldAotCQkJCQkJCQkvLyBiZWZvcmUgYWxsIGNsb3NpbmcgYWN0aW9uCi0KLQkJCXNoZWV0LmdldE1vZGVsKCkucmVtb3ZlU3R5bGVMaXN0ZW5lcihnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKSk7Ci0JCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgYWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkvLyBpZiAoZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PQotCQkJLy8gSUNTU01vZGVsLkVNQkVEREVEKSB7IC8vIGNhc2UgU1RZTEUgdGFnCi0JCQkvLyBhZGFwdGVyID0gKE1vZGVsUHJvdmlkZUFkYXB0ZXIpCi0JCQkvLyAoKElOb2RlTm90aWZpZXIpZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0T3duZXJET01Ob2RlKCkpLmdldEFkYXB0ZXJGb3IoTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkvLyB9Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCWFkYXB0ZXIubW9kZWxSZW1vdmVkKHNoZWV0LmdldE1vZGVsKCkpOwotCi0JCQlzaGVldC5nZXRNb2RlbCgpLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGxvY2F0aW9uIG9mIHRoZSBzdHlsZSBzaGVldCB0byBiZSBpbXBvcnRlZC4gVGhlIGF0dHJpYnV0ZSB3aWxsIG5vdAotCSAqIGNvbnRhaW4gdGhlIDxjb2RlPiJ1cmwoLi4uKSI8L2NvZGU+IHNwZWNpZmllciBhcm91bmQgdGhlIFVSSS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhyZWYoKSB7Ci0JCXJldHVybiBDU1NVdGlsLmV4dHJhY3RVcmlDb250ZW50cyhnZXRBdHRyaWJ1dGUoSFJFRikpOwotCX0KLQotCS8qKgotCSAqIEEgbGlzdCBvZiBtZWRpYSB0eXBlcyBmb3Igd2hpY2ggdGhpcyBzdHlsZSBzaGVldCBtYXkgYmUgdXNlZC4KLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0IGdldE1lZGlhKCkgewotCQlJQ1NTTm9kZSBtZWRpYSA9IGdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKG1lZGlhICE9IG51bGwpIHsKLQkJCWlmIChtZWRpYSBpbnN0YW5jZW9mIE1lZGlhTGlzdCkgewotCQkJCXJldHVybiAoTWVkaWFMaXN0KSBtZWRpYTsKLQkJCX0KLQkJfQotCi0JCS8vIFRISVMgQ0FTRSBJUyBFUlJPUiBDQVNFCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBJTVBPUlRSVUxFX05PREU7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN0eWxlIHNoZWV0IHJlZmVycmVkIHRvIGJ5IHRoaXMgcnVsZSwgaWYgaXQgaGFzIGJlZW4gbG9hZGVkLiBUaGUKLQkgKiB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc3R5bGUgc2hlZXQgaGFzCi0JICogbm90IHlldCBiZWVuIGxvYWRlZCBvciBpZiBpdCB3aWxsIG5vdCBiZSBsb2FkZWQgKGUuZy4gaWYgdGhlIHN0eWxlCi0JICogc2hlZXQgaXMgZm9yIGEgbWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB1c2VyIGFnZW50KS4KLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVTaGVldCBnZXRTdHlsZVNoZWV0KCkgewotCi0JCWlmIChmRGlydHkpIHsKLQkJCS8vIE5PVEU6IHRyeS9jYXRjaCBibG9jayBpcyBhIFRFTVAgZml4IHRvIGF2b2lkIGNvbXBpbGUgZXJyb3JzOgotCQkJdHJ5IHsKLQkJCQljbG9zZVN0eWxlU2hlZXQoKTsKLQotCQkJCWlmIChnZXRIcmVmKCkgPT0gbnVsbCB8fCBnZXRIcmVmKCkubGVuZ3RoKCkgPD0gMCkgewotCQkJCQlmRGlydHkgPSBmYWxzZTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwgPSBnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJCQlpZiAoZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpIHsgLy8gY2FzZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gU1RZTEUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRhZwotCQkJCQliYXNlTW9kZWwgPSAoKElET01Ob2RlKSBnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRPd25lckRPTU5vZGUoKSkuZ2V0TW9kZWwoKTsKLQkJCQl9Ci0JCQkJLy8gZ2V0IE1vZGVsUHJvdmlkZUFkYXB0ZXIKLQkJCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSBnZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCQkvLyBpZiAoZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PQotCQkJCS8vIElDU1NNb2RlbC5FTUJFRERFRCkgeyAvLyBjYXNlIFNUWUxFIHRhZwotCQkJCS8vIGFkYXB0ZXIgPSAoTW9kZWxQcm92aWRlQWRhcHRlcikKLQkJCQkvLyAoKElOb2RlTm90aWZpZXIpZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0T3duZXJET01Ob2RlKCkpLmdldEFkYXB0ZXJGb3IoTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkJLy8gfQotCi0JCQkJLy8gbG9hZCBtb2RlbCBmcm9tIElNb2RlbE1hbmFnZXIKLQkJCQlVUkxNb2RlbFByb3ZpZGVyQ1NTIHByb3ZpZGVyID0gbmV3IFVSTE1vZGVsUHJvdmlkZXJDU1MoKTsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsID0gcHJvdmlkZXIuZ2V0TW9kZWxGb3JSZWFkKGJhc2VNb2RlbCwgZ2V0SHJlZigpKTsKLQkJCQlmRGlydHkgPSBmYWxzZTsKLQotCQkJCWlmIChuZXdNb2RlbCA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlpZiAoIShuZXdNb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCkpIHsKLQkJCQkJbmV3TW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCS8vIG5vdGlmeSBhZGFwdGVyCi0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQkJYWRhcHRlci5tb2RlbFByb3ZpZGVkKG5ld01vZGVsKTsKLQotCQkJCWZTdHlsZVNoZWV0ID0gKElDU1NTdHlsZVNoZWV0KSAoKElDU1NNb2RlbCkgbmV3TW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJaWYgKGZTdHlsZVNoZWV0ICE9IG51bGwpCi0JCQkJCWZTdHlsZVNoZWV0LmdldE1vZGVsKCkuYWRkU3R5bGVMaXN0ZW5lcihnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlN0eWxlU2hlZXQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgdGhlIHJ1bGUsIGFzIGRlZmluZWQgYWJvdmUuIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0Ci0JICogYmluZGluZy1zcGVjaWZpYyBjYXN0aW5nIG1ldGhvZHMgY2FuIGJlIHVzZWQgdG8gY2FzdCBkb3duIGZyb20gYW4KLQkgKiBpbnN0YW5jZSBvZiB0aGUgPGNvZGU+Q1NTUnVsZTwvY29kZT4gaW50ZXJmYWNlIHRvIHRoZSBzcGVjaWZpYwotCSAqIGRlcml2ZWQgaW50ZXJmYWNlIGltcGxpZWQgYnkgdGhlIDxjb2RlPnR5cGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gSU1QT1JUX1JVTEU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaFN0eWxlU2hlZXQoKSB7Ci0JCWlmICghZkRpcnR5KSB7Ci0JCQljbG9zZVN0eWxlU2hlZXQoKTsKLQkJCWZEaXJ0eSA9IHRydWU7Ci0JCQlub3RpZnkoSU5vZGVOb3RpZmllci5DSEFOR0UsIGdldEF0dHJpYnV0ZU5vZGUoSFJFRiksIG51bGwsIG51bGwsIGdldFN0YXJ0T2Zmc2V0KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZWxlYXNlUnVsZSgpIHsKLQkJaWYgKGZTdHlsZVNoZWV0ICE9IG51bGwpIHsKLQkJCUlDU1NTdHlsZVNoZWV0IHNoZWV0ID0gZlN0eWxlU2hlZXQ7Ci0JCQlmU3R5bGVTaGVldCA9IG51bGw7IC8vIHRvIHByZXZlbnQgbG9vcCwgd2UgbXVzdCByZXNldCBmU3R5bGVTaGVldAotCQkJCQkJCQkvLyBiZWZvcmUgYWxsIGNsb3NpbmcgYWN0aW9uCi0KLQkJCXNoZWV0LmdldE1vZGVsKCkucmVtb3ZlU3R5bGVMaXN0ZW5lcihnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKSk7Ci0JCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgYWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkvLyBpZiAoZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PQotCQkJLy8gSUNTU01vZGVsLkVNQkVEREVEKSB7IC8vIGNhc2UgU1RZTEUgdGFnCi0JCQkvLyBhZGFwdGVyID0gKE1vZGVsUHJvdmlkZUFkYXB0ZXIpCi0JCQkvLyAoKElOb2RlTm90aWZpZXIpZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0T3duZXJET01Ob2RlKCkpLmdldEFkYXB0ZXJGb3IoTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkvLyB9Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCWFkYXB0ZXIubW9kZWxSZWxlYXNlZChzaGVldC5nZXRNb2RlbCgpKTsKLQotCQkJc2hlZXQuZ2V0TW9kZWwoKS5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBocmVmCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0SHJlZihTdHJpbmcgaHJlZikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWZEaXJ0eSA9IHRydWU7Ci0JCXNldEF0dHJpYnV0ZShIUkVGLCBDU1NMaW5rQ29udmVydGVyLmFkZEZ1bmMoaHJlZikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTWVkaWFSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNZWRpYVJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNzVjODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNZWRpYVJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01lZGlhUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3Q7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTTWVkaWFSdWxlSW1wbCBleHRlbmRzIENTU1J1bGVJbXBsIGltcGxlbWVudHMgSUNTU01lZGlhUnVsZSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NNZWRpYVJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCUNTU01lZGlhUnVsZUltcGwoQ1NTTWVkaWFSdWxlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIGFwcGVuZFJ1bGUob3JnLnczYy5kb20uY3NzLkNTU1J1bGUgcnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChydWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlDU1NSdWxlIHJldCA9IChDU1NSdWxlKSBhcHBlbmRDaGlsZCgoQ1NTTm9kZUltcGwpIHJ1bGUpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU01lZGlhUnVsZUltcGwgY2xvbmVkID0gbmV3IENTU01lZGlhUnVsZUltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gZGVsZXRlIGEgcnVsZSBmcm9tIHRoZSBtZWRpYSBibG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIFRoZSBpbmRleCB3aXRoaW4gdGhlIG1lZGlhIGJsb2NrJ3MgcnVsZSBjb2xsZWN0aW9uIG9mIHRoZQotCSAqICAgICAgICAgICAgcnVsZSB0byByZW1vdmUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTkRFWF9TSVpFX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgaW5kZXggZG9lcyBub3QKLQkgKiAgICAgICAgICAgICAgICBjb3JyZXNwb25kIHRvIGEgcnVsZSBpbiB0aGUgbWVkaWEgcnVsZSBsaXN0LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBtZWRpYSBydWxlCi0JICogICAgICAgICAgICAgICAgaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlUnVsZShpbnQgaW5kZXgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlDU1NOb2RlSW1wbCBub2RlID0gZ2V0SW5kZXhlZFJ1bGUoaW5kZXgpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmVtb3ZlQ2hpbGQobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogQSBsaXN0IG9mIGFsbCBDU1MgcnVsZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgbWVkaWEgYmxvY2suCi0JICovCi0JcHVibGljIENTU1J1bGVMaXN0IGdldENzc1J1bGVzKCkgewotCQlDU1NSdWxlTGlzdEltcGwgbGlzdCA9IG5ldyBDU1NSdWxlTGlzdEltcGwoKTsKLQotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSdWxlKQotCQkJCWxpc3QuYXBwZW5kTm9kZShub2RlKTsKLQkJfQotCi0JCXJldHVybiBsaXN0OwotCX0KLQotCUNTU1J1bGVJbXBsIGdldEluZGV4ZWRSdWxlKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IGkgPSAwOwotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSdWxlKSB7Ci0JCQkJaWYgKGkrKyA9PSBpbmRleCkKLQkJCQkJcmV0dXJuIChDU1NSdWxlSW1wbCkgbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBIGxpc3Qgb2YgbWVkaWEgdHlwZXMgZm9yIHRoaXMgcnVsZS4KLQkgKi8KLQlwdWJsaWMgTWVkaWFMaXN0IGdldE1lZGlhKCkgewotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBNZWRpYUxpc3RJbXBsKQotCQkJCXJldHVybiAoTWVkaWFMaXN0KSBub2RlOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIE1FRElBUlVMRV9OT0RFOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBydWxlLCBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdAotCSAqIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNhc3QgZG93biBmcm9tIGFuCi0JICogaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkNTU1J1bGU8L2NvZGU+IGludGVyZmFjZSB0byB0aGUgc3BlY2lmaWMKLQkgKiBkZXJpdmVkIGludGVyZmFjZSBpbXBsaWVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIE1FRElBX1JVTEU7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byBpbnNlcnQgYSBuZXcgcnVsZSBpbnRvIHRoZSBtZWRpYSBibG9jay4KLQkgKiAKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgVGhlIHBhcnNhYmxlIHRleHQgcmVwcmVzZW50aW5nIHRoZSBydWxlLiBGb3IgcnVsZSBzZXRzIHRoaXMKLQkgKiAgICAgICAgICAgIGNvbnRhaW5zIGJvdGggdGhlIHNlbGVjdG9yIGFuZCB0aGUgc3R5bGUgZGVjbGFyYXRpb24uIEZvcgotCSAqICAgICAgICAgICAgYXQtcnVsZXMsIHRoaXMgc3BlY2lmaWVzIGJvdGggdGhlIGF0LWlkZW50aWZpZXIgYW5kIHRoZSBydWxlCi0JICogICAgICAgICAgICBjb250ZW50LgotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgVGhlIGluZGV4IHdpdGhpbiB0aGUgbWVkaWEgYmxvY2sncyBydWxlIGNvbGxlY3Rpb24gb2YgdGhlCi0JICogICAgICAgICAgICBydWxlIGJlZm9yZSB3aGljaCB0byBpbnNlcnQgdGhlIHNwZWNpZmllZCBydWxlLiBJZiB0aGUKLQkgKiAgICAgICAgICAgIHNwZWNpZmllZCBpbmRleCBpcyBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBtZWRpYSBibG9ja3MncwotCSAqICAgICAgICAgICAgcnVsZSBjb2xsZWN0aW9uLCB0aGUgcnVsZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlCi0JICogICAgICAgICAgICBtZWRpYSBibG9jay4KLQkgKiBAcmV0dXJuIFRoZSBpbmRleCB3aXRoaW4gdGhlIG1lZGlhIGJsb2NrJ3MgcnVsZSBjb2xsZWN0aW9uIG9mIHRoZSBuZXdseQotCSAqICAgICAgICAgaW5zZXJ0ZWQgcnVsZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIHRoZSBydWxlIGNhbm5vdCBiZQotCSAqICAgICAgICAgICAgICAgIGluc2VydGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIGUuZy4sIGlmIGFuCi0JICogICAgICAgICAgICAgICAgPGNvZGU+QGltcG9ydDwvY29kZT4gcnVsZSBpcyBpbnNlcnRlZCBhZnRlciBhIHN0YW5kYXJkIHJ1bGUgc2V0IG9yIG90aGVyCi0JICogICAgICAgICBhdC1ydWxlLiA8YnI+Ci0JICogICAgICAgICBJTkRFWF9TSVpFX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgaW5kZXggaXMgbm90IGEgdmFsaWQKLQkgKiAgICAgICAgIGluc2VydGlvbiBwb2ludC4gPGJyPgotCSAqICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBtZWRpYSBydWxlIGlzCi0JICogICAgICAgICByZWFkb25seS4gPGJyPgotCSAqICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgcnVsZSBoYXMgYSBzeW50YXggZXJyb3IgYW5kCi0JICogICAgICAgICBpcyB1bnBhcnNhYmxlLgotCSAqLwotCXB1YmxpYyBpbnQgaW5zZXJ0UnVsZShTdHJpbmcgcnVsZSwgaW50IGluZGV4KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaW50IGxlbmd0aCA9IGdldENzc1J1bGVzKCkuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChpbmRleCA8IDAgfHwgbGVuZ3RoIDwgaW5kZXgpCi0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQotCQlDU1NSdWxlSW1wbCByZWZSdWxlID0gKGxlbmd0aCAhPSBpbmRleCkgPyBnZXRJbmRleGVkUnVsZShpbmRleCkgOiBudWxsOwotCi0JCUNTU1J1bGVJbXBsIG5ld1J1bGUgPSAoQ1NTUnVsZUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NSdWxlKHJ1bGUpOwotCi0JCS8vIHByZXZlbnQgZnJvbSBuZXN0aW5nIEBtZWRpYSBydWxlCi0JCWlmIChuZXdSdWxlLmdldFR5cGUoKSA9PSBDU1NSdWxlLk1FRElBX1JVTEUpCi0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5TWU5UQVhfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCi0JCWluc2VydEJlZm9yZShuZXdSdWxlLCByZWZSdWxlKTsKLQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBuZXdSdWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSByZWZSdWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBpbnNlcnRSdWxlQmVmb3JlKG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIG5ld1J1bGUsIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJlZlJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAobmV3UnVsZSA9PSBudWxsICYmIHJlZlJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU1J1bGUgcmV0ID0gKENTU1J1bGUpIGluc2VydEJlZm9yZSgoQ1NTTm9kZUltcGwpIG5ld1J1bGUsIChDU1NOb2RlSW1wbCkgcmVmUnVsZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgcmVtb3ZlUnVsZShvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBydWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU1J1bGUgcmV0ID0gKENTU1J1bGUpIHJlbW92ZUNoaWxkKChDU1NOb2RlSW1wbCkgcnVsZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSByZXBsYWNlUnVsZShvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBuZXdSdWxlLCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBvbGRSdWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld1J1bGUgPT0gbnVsbCAmJiBvbGRSdWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlDU1NSdWxlIHJldCA9IChDU1NSdWxlKSByZXBsYWNlQ2hpbGQoKENTU05vZGVJbXBsKSBuZXdSdWxlLCAoQ1NTTm9kZUltcGwpIG9sZFJ1bGUpOwotCQlyZXR1cm4gcmV0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ5NGEwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsQ3JlYXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi0vKioKLSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NNb2RlbENyZWF0aW9uQ29udGV4dCB7Ci0KLQlwcml2YXRlIENTU05vZGVJbXBsIGZSb290Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBmVGFyZ2V0Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBmTmV4dE5vZGUgPSBudWxsOwotCXByaXZhdGUgaW50IGZSZXBhcnNlU3RhcnQgPSAtMTsKLQlwcml2YXRlIGludCBmUmVwYXJzZUVuZCA9IC0xOwotCi0JLyoqCi0JICogQ1NTTW9kZWxDb250ZXh0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQoQ1NTTm9kZUltcGwgcm9vdE5vZGUpIHsKLQkJc3VwZXIoKTsKLQotCQlmUm9vdE5vZGUgPSByb290Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGNsZWFyKCkgewotCQlmTmV4dE5vZGUgPSBudWxsOwotCQlmVGFyZ2V0Tm9kZSA9IG51bGw7Ci0JCXJlc2V0UmVwYXJzZVJhbmdlKCk7Ci0JfQotCi0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgQ1NTTm9kZUltcGwgZ2V0TmV4dE5vZGUoKSB7Ci0JCXJldHVybiBmTmV4dE5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGdldFJlcGFyc2VFbmQoKSB7Ci0JCXJldHVybiBmUmVwYXJzZUVuZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0UmVwYXJzZVN0YXJ0KCkgewotCQlyZXR1cm4gZlJlcGFyc2VTdGFydDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NOb2RlSW1wbCBnZXRSb290Tm9kZSgpIHsKLQkJcmV0dXJuIGZSb290Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXB1YmxpYyBDU1NOb2RlSW1wbCBnZXRUYXJnZXROb2RlKCkgewotCQlyZXR1cm4gZlRhcmdldE5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JYm9vbGVhbiBpc1RvUmVwYXJzZSgpIHsKLQkJcmV0dXJuICgwIDw9IGdldFJlcGFyc2VTdGFydCgpICYmIDAgPD0gZ2V0UmVwYXJzZUVuZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHJlc2V0UmVwYXJzZVJhbmdlKCkgewotCQlmUmVwYXJzZVN0YXJ0ID0gZlJlcGFyc2VFbmQgPSAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldExhc3QoKSB7Ci0JCWZOZXh0Tm9kZSA9IG51bGw7Ci0KLQkJaWYgKCEoZlJvb3ROb2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSkgewotCQkJZlRhcmdldE5vZGUgPSBmUm9vdE5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZlJvb3ROb2RlKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlDU1NOb2RlSW1wbCBub2RlID0gZlJvb3ROb2RlOwotCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJCUlDU1NOb2RlIGxhc3RDaGlsZCA9IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCQkJaWYgKGxhc3RDaGlsZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciAmJiAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbGFzdENoaWxkKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQlub2RlID0gKENTU05vZGVJbXBsKSBsYXN0Q2hpbGQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlmVGFyZ2V0Tm9kZSA9IG5vZGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldE5leHROb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJZk5leHROb2RlID0gKENTU05vZGVJbXBsKSBub2RlOwotCQlpZiAoZk5leHROb2RlICE9IG51bGwpIHsKLQkJCWZUYXJnZXROb2RlID0gKENTU05vZGVJbXBsKSBmTmV4dE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRSZXBhcnNlRW5kKGludCBlbmQpIHsKLQkJZlJlcGFyc2VFbmQgPSBlbmQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRSZXBhcnNlU3RhcnQoaW50IHN0YXJ0KSB7Ci0JCWZSZXBhcnNlU3RhcnQgPSBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldFRhcmdldE5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlmVGFyZ2V0Tm9kZSA9IChDU1NOb2RlSW1wbCkgbm9kZTsKLQkJaWYgKGZOZXh0Tm9kZSAhPSBudWxsICYmIGZOZXh0Tm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gZlRhcmdldE5vZGUpIHsKLQkJCWZOZXh0Tm9kZSA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsRGVsZXRpb25Db250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsRGVsZXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NjRkNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbERlbGV0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NNb2RlbERlbGV0aW9uQ29udGV4dCB7Ci0KLQlwcml2YXRlIGludCBmT2xkU3RhcnQgPSAtMTsKLQlwcml2YXRlIGludCBmT2xkTGVuZ3RoID0gMDsKLQlwcml2YXRlIGludCBmTmV3U3RhcnQgPSAtMTsKLQlwcml2YXRlIGludCBmTmV3TGVuZ3RoID0gMDsKLQlwcml2YXRlIGludCBmTGVuZ3RoRGlmZmVyZW5jZSA9IDA7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IG51bGw7Ci0JLy8gcHJpdmF0ZSBJQ1NTTm9kZSBmUm9vdE5vZGUgPSBudWxsOwotCXByaXZhdGUgaW50IGZSZW1vdmVkUmFuZ2VCZWdpbiA9IC0xOwotCXByaXZhdGUgaW50IGZSZW1vdmVkUmFuZ2VFbmQgPSAtMTsKLQlwcml2YXRlIENTU05vZGVMaXN0SW1wbCBmTm9kZXNUb0JlUmVtb3ZlZCA9IG5ldyBDU1NOb2RlTGlzdEltcGwoKTsKLQotCS8qKgotCSAqIENTU01vZGVsRGVsZXRpb25Db250ZXh0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTTW9kZWxEZWxldGlvbkNvbnRleHQoSUNTU05vZGUgcm9vdE5vZGUpIHsKLQkJc3VwZXIoKTsKLQotCQkvLyBmUm9vdE5vZGUgPSByb290Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGFkZE5vZGVUb0JlUmVtb3ZlZChJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuTm9kZXMgPSBmTm9kZXNUb0JlUmVtb3ZlZC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuTm9kZXM7IGkrKykgewotCQkJSUNTU05vZGUgcGFyZW50ID0gZk5vZGVzVG9CZVJlbW92ZWQuaXRlbShpKTsKLQkJCWlmIChDU1NNb2RlbFV0aWwuaXNQYXJlbnRPZihwYXJlbnQsIG5vZGUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWZOb2Rlc1RvQmVSZW1vdmVkLmFwcGVuZE5vZGUobm9kZSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZXhwYW5kUmVtb3ZlZFJhbmdlQmVnaW4oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBuZXdCZWdpbiA9IGZsYXROb2RlLmdldFN0YXJ0KCk7IC8vIGZPbGRTdGFydCA9PSBmTmV3U3RhcnQsIHJpZ2h0Pz8KLQkJaWYgKGZSZW1vdmVkUmFuZ2VCZWdpbiA8IDAgfHwgbmV3QmVnaW4gPCBmUmVtb3ZlZFJhbmdlQmVnaW4pIHsKLQkJCWZSZW1vdmVkUmFuZ2VCZWdpbiA9IG5ld0JlZ2luOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBleHBhbmRSZW1vdmVkUmFuZ2VFbmQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBuZXdFbmQgPSBmbGF0Tm9kZS5nZXRFbmQoKSArICgoaXNPbGROb2RlKGZsYXROb2RlKSkgPyBmTGVuZ3RoRGlmZmVyZW5jZSA6IDApOwotCQlpZiAoZlJlbW92ZWRSYW5nZUVuZCA8IDAgfHwgZlJlbW92ZWRSYW5nZUVuZCA8IG5ld0VuZCkgewotCQkJZlJlbW92ZWRSYW5nZUVuZCA9IG5ld0VuZDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGZpbmRDb250YWluZXIoQ1NTTm9kZUltcGwgcGFyZW50LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCS8vIEFtIGkgYSBjb250YWluZXIgb2YgZmxhdE5vZGU/Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHBhcmVudCkuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaW50IGZpcnN0U3RhcnQgPSBnZXRPcmlnaW5hbE9mZnNldChmaXJzdE5vZGUpOwotCQkJaW50IGxhc3RTdGFydCA9IGdldE9yaWdpbmFsT2Zmc2V0KGxhc3ROb2RlKTsKLQkJCWludCBzdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0KLQkJCWlmIChmaXJzdFN0YXJ0IDw9IHN0YXJ0ICYmIHN0YXJ0IDw9IGxhc3RTdGFydCkgewotCQkJCS8vIEkgYW0gYSBjb250YWluZXIsIGlzIG15IGNoaWxkIGEgY29udGFpbmVyID8KLQkJCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NOb2RlSW1wbCkgewotCQkJCQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IGZpbmRDb250YWluZXIoKENTU05vZGVJbXBsKSBub2RlLCBmbGF0Tm9kZSk7Ci0JCQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gY29udGFpbmVyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgZmluZERlbGV0aW9uVGFyZ2V0KENTU05vZGVJbXBsIHBhcmVudCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgdGFyZ2V0ID0gZmluZENvbnRhaW5lcihwYXJlbnQsIGZsYXROb2RlKTsKLQkJaWYgKHRhcmdldCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnQoZmxhdE5vZGUudG9TdHJpbmcoKSArICI6ICIpOwotCi0JCS8vIGNoaWxkIGEoPT09PT0pYig9PT09PSljCi0JCS8vIHBhcmVudCAoPT09PT09PT09PT09PT09PSkgYSxjIGNhbiByZW1vdmUgcGFyZW50LCBidXQgYiBjYW5ub3QuCi0KLQkJSUNTU05vZGUgY2hpbGQ7Ci0KLQkJZm9yIChjaGlsZCA9IHRhcmdldC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGwgJiYgIShjaGlsZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcik7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJLy8ganVzdCBhZHZhbmNpbmcKLQkJfQotCi0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInRhcmdldCBoYXMgbm8gY2hpbGRyZW4uIik7IC8vIFRFU1RCWUNPWlkKLQkJCXJldHVybiB0YXJnZXQ7IC8vIGhhcyBubyBjaGlsZCBjb250YWluZXJzLgotCQl9Ci0JCWVsc2UgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgY2hpbGQpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUuZ2V0U3RhcnQoKSA8IGdldE9yaWdpbmFsT2Zmc2V0KGZpcnN0Tm9kZSkpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImZsYXROb2RlIGlzIGluIGZyb250IG9mIGZpcnN0IGNoaWxkIik7Ci0JCQkJLy8gLy8gVEVTVEJZQ09aWQotCQkJCXJldHVybiB0YXJnZXQ7IC8vIGEKLQkJCX0KLQkJfQotCi0JCWZvciAoY2hpbGQgPSB0YXJnZXQuZ2V0TGFzdENoaWxkKCk7IGNoaWxkICE9IG51bGwgJiYgIShjaGlsZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcik7IGNoaWxkID0gY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkpIHsKLQkJCS8vIGp1c3QgYWR2YW5jaW5nCi0JCX0KLQotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ0YXJnZXQgaGFzIG5vIGNoaWxkcmVuLiIpOyAvLyBURVNUQllDT1pZCi0JCQlyZXR1cm4gdGFyZ2V0OyAvLyBoYXMgbm8gY2hpbGQgY29udGFpbmVycy4KLQkJfQotCQllbHNlIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGNoaWxkKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGdldE9yaWdpbmFsT2Zmc2V0KGZpcnN0Tm9kZSkgPCBmbGF0Tm9kZS5nZXRTdGFydCgpKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJmbGF0Tm9kZSBpcyBpbiBhZnRlciBvZiBsYXN0IGNoaWxkIik7Ci0JCQkJLy8gLy8gVEVTVEJZQ09aWQotCQkJCXJldHVybiB0YXJnZXQ7IC8vIGMKLQkJCX0KLQkJfQotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZmxhdE5vZGUgaW5uZXIgb2YgY2hpbGRyZW4iKTsgLy8gVEVTVEJZQ09aWQotCQlyZXR1cm4gbnVsbDsgLy8gYgotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUl0ZXJhdG9yIGdldE5vZGVzVG9CZVJlbW92ZWQoKSB7Ci0JCUNvbGxlY3Rpb24gbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWludCBuTm9kZXMgPSBmTm9kZXNUb0JlUmVtb3ZlZC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuTm9kZXM7IGkrKykgewotCQkJbm9kZXMuYWRkKGZOb2Rlc1RvQmVSZW1vdmVkLml0ZW0oaSkpOwotCQl9Ci0JCXJldHVybiBub2Rlcy5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgaW50IGdldE9yaWdpbmFsT2Zmc2V0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlvZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQkJaWYgKDAgPD0gZkxlbmd0aERpZmZlcmVuY2UpIHsKLQkJCQlpZiAoZk5ld1N0YXJ0ICsgZk5ld0xlbmd0aCA8IG9mZnNldCkgewotCQkJCQlvZmZzZXQgLT0gZkxlbmd0aERpZmZlcmVuY2U7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGZPbGRTdGFydCArIGZPbGRMZW5ndGggPD0gb2Zmc2V0IHx8IChmTmV3U3RhcnQgPCAwICYmIGZPbGRTdGFydCA8PSBvZmZzZXQgJiYgIWlzT2xkTm9kZShmbGF0Tm9kZSkpIHx8ICgwIDw9IGZOZXdTdGFydCAmJiBmTmV3U3RhcnQgKyBmTmV3TGVuZ3RoIDw9IG9mZnNldCAmJiAhaXNPbGROb2RlKGZsYXROb2RlKSkpIHsKLQkJCQkJb2Zmc2V0IC09IGZMZW5ndGhEaWZmZXJlbmNlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBvZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGdldFJlbW92ZWRSYW5nZUJlZ2luKCkgewotCQlyZXR1cm4gZlJlbW92ZWRSYW5nZUJlZ2luOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBnZXRSZW1vdmVkUmFuZ2VFbmQoKSB7Ci0JCXJldHVybiBmUmVtb3ZlZFJhbmdlRW5kOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc09sZE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgIT0gbnVsbCkgewotCQkJZm9yIChFbnVtZXJhdGlvbiBlID0gZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCQlpZiAoZS5uZXh0RWxlbWVudCgpID09IGZsYXROb2RlKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldHVwQ29udGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQlmT2xkTGVuZ3RoID0gQ1NTVXRpbC5nZXRUZXh0TGVuZ3RoKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsICYmIDAgPCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpICYmIChmbGF0Tm9kZSA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbSgwKSkgIT0gbnVsbCkgewotCQkJZk9sZFN0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJfQotCQllbHNlIHsKLQkJCWZPbGRTdGFydCA9IC0xOwotCQl9Ci0JCWZOZXdMZW5ndGggPSBDU1NVdGlsLmdldFRleHRMZW5ndGgobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwgJiYgMCA8IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZ2V0TGVuZ3RoKCkgJiYgKGZsYXROb2RlID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKDApKSAhPSBudWxsKSB7Ci0JCQlmTmV3U3RhcnQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQkJZlJlbW92ZWRSYW5nZUJlZ2luID0gZk5ld1N0YXJ0OwotCQkJZlJlbW92ZWRSYW5nZUVuZCA9IGZOZXdTdGFydCArIGZOZXdMZW5ndGg7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmTmV3U3RhcnQgPSAtMTsKLQkJCWZSZW1vdmVkUmFuZ2VCZWdpbiA9IGZSZW1vdmVkUmFuZ2VFbmQgPSAtMTsKLQkJfQotCQlmTGVuZ3RoRGlmZmVyZW5jZSA9IGZOZXdMZW5ndGggLSBmT2xkTGVuZ3RoOwotCQlmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnM7Ci0KLQkJLy8gY2xlYW51cCBub2RlcwotCQl3aGlsZSAoMCA8IGZOb2Rlc1RvQmVSZW1vdmVkLmdldExlbmd0aCgpKSB7Ci0JCQlmTm9kZXNUb0JlUmVtb3ZlZC5yZW1vdmVOb2RlKDApOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZDZkNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50LklDU1NTdHlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudGltcGwuQ1NTRW1iZWRlZFN0eWxlTm90aWZ5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnRpbXBsLkNTU1N0eWxlTm90aWZ5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1NvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5JbXBvcnRSdWxlQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkltcG9ydGVkQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlNlbGVjdG9yc0NvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkFic3RyYWN0U3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTmV3RG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5vQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlSW5Vc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBDU1NNb2RlbEltcGwgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCBpbXBsZW1lbnRzIElDU1NNb2RlbCwgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIHsKLQotCXByaXZhdGUgQ1NTRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIG9yZy53M2MuZG9tLk5vZGUgb3duZXJOb2RlID0gbnVsbDsKLQlwcml2YXRlIENTU1N0eWxlTm90aWZ5QWRhcHRlciBzdHlsZU5vdGlmaWVyID0gbnVsbDsKLQlwcml2YXRlIENTU01vZGVsUGFyc2VyIGZQYXJzZXIgPSBudWxsOwotCXByaXZhdGUgQ1NTTW9kZWxVcGRhdGVyIGZVcGRhdGVyID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IGZhbHNlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJRF9OT05fRVhURVJOQUxfQ1NTID0gIioqX05PTl9FWFRFUk5BTF9DU1NfKioqIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDU1NNb2RlbEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ1NTTW9kZWxJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmV2ZW50LkNTU1N0eWxlTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTdHlsZUxpc3RlbmVyKElDU1NTdHlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWdldFN0eWxlTm90aWZpZXIoKS5hZGRTdHlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQl2b2lkIGF0dHJSZXBsYWNlZChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NOb2RlSW1wbCBuZXdBdHRyLCBDU1NOb2RlSW1wbCBvbGRBdHRyKSB7Ci0JCWlmICghZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSkgewotCQkJQ1NTTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRVcGRhdGVyKCk7Ci0JCQl1cGRhdGVyLmF0dHJSZXBsYWNlZChwYXJlbnROb2RlLCBuZXdBdHRyLCBvbGRBdHRyKTsKLQkJfQotCi0JCUlDU1NTZWxlY3RvciByZW1vdmVkW10gPSBudWxsLCBhZGRlZFtdID0gbnVsbDsKLQkJaWYgKG9sZEF0dHIgIT0gbnVsbCAmJiBvbGRBdHRyLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuQVRUUl9OT0RFICYmICgoQ1NTQXR0ckltcGwpIG9sZEF0dHIpLmdldE5hbWUoKS5lcXVhbHMoSUNTU1N0eWxlUnVsZS5TRUxFQ1RPUikpIHsKLQkJCUNTU0F0dHJJbXBsIGF0dHIgPSAoQ1NTQXR0ckltcGwpIG9sZEF0dHI7Ci0JCQkvLyBjb2xsZWN0IGNoYW5nZWQgc2VsZWN0b3IKLQkJCUlDU1NTZWxlY3Rvckxpc3QgbGlzdCA9IG5ldyBDU1NTZWxlY3Rvckxpc3RJbXBsKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQlyZW1vdmVkID0gbmV3IElDU1NTZWxlY3RvcltsaXN0LmdldExlbmd0aCgpXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotCQkJCXJlbW92ZWRbaV0gPSBsaXN0LmdldFNlbGVjdG9yKGkpOwotCQl9Ci0JCWlmIChuZXdBdHRyICE9IG51bGwgJiYgbmV3QXR0ci5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkFUVFJfTk9ERSAmJiAoKENTU0F0dHJJbXBsKSBuZXdBdHRyKS5nZXROYW1lKCkuZXF1YWxzKElDU1NTdHlsZVJ1bGUuU0VMRUNUT1IpKSB7Ci0JCQlDU1NBdHRySW1wbCBhdHRyID0gKENTU0F0dHJJbXBsKSBuZXdBdHRyOwotCQkJLy8gY29sbGVjdCBjaGFuZ2VkIHNlbGVjdG9yCi0JCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChhdHRyLmdldFZhbHVlKCkpOwotCQkJYWRkZWQgPSBuZXcgSUNTU1NlbGVjdG9yW2xpc3QuZ2V0TGVuZ3RoKCldOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0JCQkJYWRkZWRbaV0gPSBsaXN0LmdldFNlbGVjdG9yKGkpOwotCQl9Ci0JCWlmIChyZW1vdmVkICE9IG51bGwgfHwgYWRkZWQgIT0gbnVsbCB8fCBnZXREb2N1bWVudCgpLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFKSB7Ci0JCQlnZXRTdHlsZU5vdGlmaWVyKCkuZmlyZShyZW1vdmVkLCBhZGRlZCwgbnVsbCk7Ci0JCX0KLQkJLy8gZm9yIGhyZWYgYXR0cmlidXRlCi0JCWlmIChnZXRTdHlsZUxpc3RlbmVycygpICE9IG51bGwgJiYgZ2V0U3R5bGVMaXN0ZW5lcnMoKS5zaXplKCkgPiAwKSB7Ci0JCQlib29sZWFuIHVwZGF0ZSA9IGZhbHNlOwotCQkJaWYgKG9sZEF0dHIgIT0gbnVsbCAmJiBvbGRBdHRyLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuQVRUUl9OT0RFICYmICgoQ1NTQXR0ckltcGwpIG9sZEF0dHIpLmdldE5hbWUoKS5lcXVhbHMoSUNTU0ltcG9ydFJ1bGUuSFJFRikpIHsKLQkJCQl1cGRhdGUgPSB0cnVlOwotCQkJfQotCQkJaWYgKG5ld0F0dHIgIT0gbnVsbCAmJiBuZXdBdHRyLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuQVRUUl9OT0RFICYmICgoQ1NTQXR0ckltcGwpIG5ld0F0dHIpLmdldE5hbWUoKS5lcXVhbHMoSUNTU0ltcG9ydFJ1bGUuSFJFRikpIHsKLQkJCQl1cGRhdGUgPSB0cnVlOwotCQkJfQotCQkJaWYgKHVwZGF0ZSkKLQkJCQkoKElDU1NJbXBvcnRSdWxlKSBwYXJlbnROb2RlKS5nZXRTdHlsZVNoZWV0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlnZXRTdHlsZU5vdGlmaWVyKCkuYmVnaW5SZWNvcmRpbmcoKTsKLQotCQlOb2RlIG5vZGUgPSBnZXRPd25lckRPTU5vZGUoKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSAoKElET01Ob2RlKSBub2RlKS5nZXRNb2RlbCgpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5iZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLmJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQl2b2lkIGNoaWxkUmVwbGFjZWQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTTm9kZUltcGwgbmV3Q2hpbGQsIENTU05vZGVJbXBsIG9sZENoaWxkKSB7Ci0JCWlmICghZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSkgewotCQkJQ1NTTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRVcGRhdGVyKCk7Ci0JCQl1cGRhdGVyLmNoaWxkUmVwbGFjZWQocGFyZW50Tm9kZSwgbmV3Q2hpbGQsIG9sZENoaWxkKTsKLQkJfQotCi0JCS8vIGFsd2F5cyBjaGVjayBhbmQgc2VuZCBzZWxlY3RvciBldmVudAotCQlJQ1NTU2VsZWN0b3IgcmVtb3ZlZFtdID0gbnVsbCwgYWRkZWRbXSA9IG51bGw7Ci0JCWlmIChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVTSEVFVF9OT0RFIHx8IHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQVJVTEVfTk9ERSkgewotCQkJLy8gY29sbGVjdCBvbGQgc2VsZWN0b3JzCi0JCQlTZWxlY3RvcnNDb2xsZWN0b3Igc2VsVHJhdiA9IG5ldyBTZWxlY3RvcnNDb2xsZWN0b3IoKTsKLQkJCXNlbFRyYXYuYXBwbHkob2xkQ2hpbGQpOwotCQkJaW50IG5TZWwgPSBzZWxUcmF2LmdldFNlbGVjdG9ycygpLnNpemUoKTsKLQkJCWlmIChuU2VsID4gMCkgewotCQkJCXJlbW92ZWQgPSBuZXcgSUNTU1NlbGVjdG9yW25TZWxdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgblNlbDsgaSsrKQotCQkJCQlyZW1vdmVkW2ldID0gKElDU1NTZWxlY3Rvcikgc2VsVHJhdi5nZXRTZWxlY3RvcnMoKS5nZXQoaSk7Ci0JCQl9Ci0JCQkvLyBjb2xsZWN0IG5ldyBzZWxlY3RvcnMKLQkJCXNlbFRyYXYgPSBuZXcgU2VsZWN0b3JzQ29sbGVjdG9yKCk7Ci0JCQlzZWxUcmF2LmFwcGx5KG5ld0NoaWxkKTsKLQkJCW5TZWwgPSBzZWxUcmF2LmdldFNlbGVjdG9ycygpLnNpemUoKTsKLQkJCWlmIChuU2VsID4gMCkgewotCQkJCWFkZGVkID0gbmV3IElDU1NTZWxlY3RvcltuU2VsXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5TZWw7IGkrKykKLQkJCQkJYWRkZWRbaV0gPSAoSUNTU1NlbGVjdG9yKSBzZWxUcmF2LmdldFNlbGVjdG9ycygpLmdldChpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIG1vZGlmaWNhdGlvbgotCQkJSUNTU05vZGUgcnVsZSA9IHBhcmVudE5vZGU7Ci0JCQl3aGlsZSAocnVsZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHJ1bGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKQotCQkJCQlicmVhazsKLQkJCQlydWxlID0gcnVsZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCQlpZiAocnVsZSAhPSBudWxsKSB7Ci0JCQkJSUNTU1NlbGVjdG9yTGlzdCBsaXN0ID0gKChJQ1NTU3R5bGVSdWxlKSBydWxlKS5nZXRTZWxlY3RvcnMoKTsKLQkJCQlhZGRlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbbGlzdC5nZXRMZW5ndGgoKV07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0JCQkJCWFkZGVkW2ldID0gbGlzdC5nZXRTZWxlY3RvcihpKTsKLQkJCX0KLQkJfQotCQlpZiAocmVtb3ZlZCAhPSBudWxsIHx8IGFkZGVkICE9IG51bGwgfHwgZ2V0RG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkgewotCQkJLy8gc2VuZCBzZWxlY3RvciBjaGFuZ2VkIGV2ZW50Ci0JCQlnZXRTdHlsZU5vdGlmaWVyKCkuZmlyZShyZW1vdmVkLCBhZGRlZCwgbnVsbCk7Ci0JCX0KLQkJLy8gY2xvc2UgcmVtb3ZlZCBpbXBvcnQtcnVsZSdzIGV4dGVybmFsIHN0eWxlIHNoZWV0cwotCQl7Ci0JCQlJbXBvcnRSdWxlQ29sbGVjdG9yIHRyYXYgPSBuZXcgSW1wb3J0UnVsZUNvbGxlY3RvcigpOwotCQkJdHJhdi5hcHBseShvbGRDaGlsZCk7Ci0JCQlJdGVyYXRvciBpdCA9IHRyYXYuZ2V0UnVsZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCSgoQ1NTSW1wb3J0UnVsZUltcGwpIGl0Lm5leHQoKSkuY2xvc2VTdHlsZVNoZWV0KCk7Ci0JCQl9Ci0JCX0KLQkJLy8gc2VuZCBldmVudHMgdG8gbGlzdGVuZXIgZm9yIG5ldyBpbXBvcnQtcnVsZXMKLQkJaWYgKGdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCAmJiBnZXRTdHlsZUxpc3RlbmVycygpLnNpemUoKSA+IDApIHsKLQkJCUltcG9ydGVkQ29sbGVjdG9yIHRyYXYgPSBuZXcgSW1wb3J0ZWRDb2xsZWN0b3IoKTsKLQkJCXRyYXYuYXBwbHkobmV3Q2hpbGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsb3NlSW1wb3J0ZWQoKSB7Ci0JCWlmICghaXNTaGFyZWQoKSkgewotCQkJLy8gcmVsZWFzZSBsaXN0ZW5lcnMKLQkJCWlmIChnZXRTdHlsZUxpc3RlbmVycygpICE9IG51bGwpIHsKLQkJCQlWZWN0b3IgdG9SZW1vdmUgPSBuZXcgVmVjdG9yKGdldFN0eWxlTGlzdGVuZXJzKCkpOwotCQkJCUl0ZXJhdG9yIGl0ID0gdG9SZW1vdmUuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCXJlbW92ZVN0eWxlTGlzdGVuZXIoKElDU1NTdHlsZUxpc3RlbmVyKSBpdC5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJCS8vIGNsb3NlIGltcG9ydCBydWxlcwotCQkJSW1wb3J0UnVsZUNvbGxlY3RvciB0cmF2ID0gbmV3IEltcG9ydFJ1bGVDb2xsZWN0b3IoKTsKLQkJCXRyYXYuYXBwbHkoZ2V0RG9jdW1lbnQoKSk7Ci0JCQlJdGVyYXRvciBpdDIgPSB0cmF2LmdldFJ1bGVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdDIuaGFzTmV4dCgpKSB7Ci0JCQkJKChDU1NJbXBvcnRSdWxlSW1wbCkgaXQyLm5leHQoKSkucmVsZWFzZVJ1bGUoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgQ1NTRG9jdW1lbnRJbXBsIGNyZWF0ZURvY3VtZW50KCkgewotCQlDU1NEb2N1bWVudEltcGwgZG9jID0gbnVsbDsKLQkJaW50IHBhcnNlck1vZGUgPSBDU1NTb3VyY2VQYXJzZXIuTU9ERV9TVFlMRVNIRUVUOwotCQlpZiAob3duZXJOb2RlID09IG51bGwpIHsKLQkJCS8vIHRoaXMgY2FzZSBpcyBleHRlcm5hbCBDU1MgZmlsZQotCQkJZG9jID0gKENTU1N0eWxlU2hlZXRJbXBsKSBET01DU1NJbXBsLmNyZWF0ZUNTU1N0eWxlU2hlZXQobnVsbCwgbnVsbCk7IC8vIHBhcmFtZXRlcnMKLQkJCS8vIGFyZQotCQkJLy8gZm9yCi0JCQkvLyBTVFlMRS10YWcKLQkJCXBhcnNlck1vZGUgPSBDU1NTb3VyY2VQYXJzZXIuTU9ERV9TVFlMRVNIRUVUOwotCQl9Ci0JCWVsc2UgaWYgKG93bmVyTm9kZSBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLkVsZW1lbnQgJiYgKChFbGVtZW50KSBvd25lck5vZGUpLmdldFRhZ05hbWUoKS50b1VwcGVyQ2FzZSgpLmVxdWFscygiU1RZTEUiKSkgey8vJE5PTi1OTFMtMSQKLQkJCS8vIHRoaXMgY2FzZSBpcyBTVFlMRS10YWcKLQkJCUVsZW1lbnQgc3R5bGUgPSAoRWxlbWVudCkgb3duZXJOb2RlOwotCQkJZG9jID0gKENTU1N0eWxlU2hlZXRJbXBsKSBET01DU1NJbXBsLmNyZWF0ZUNTU1N0eWxlU2hlZXQoc3R5bGUuZ2V0QXR0cmlidXRlKCJUSVRMRSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlzdHlsZS5nZXRBdHRyaWJ1dGUoIk1FRElBIikpOy8vJE5PTi1OTFMtMSQKLQkJCXBhcnNlck1vZGUgPSBDU1NTb3VyY2VQYXJzZXIuTU9ERV9TVFlMRVNIRUVUOwotCQl9Ci0JCWVsc2UgaWYgKG93bmVyTm9kZSBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLkVsZW1lbnQgfHwgb3duZXJOb2RlIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uQXR0cikgewotCQkJLy8gSW5saW5lIGF0dHJpYnV0ZXMKLQkJCWRvYyA9IChDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCkgRE9NQ1NTSW1wbC5jcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCk7Ci0JCQlwYXJzZXJNb2RlID0gQ1NTU291cmNlUGFyc2VyLk1PREVfREVDTEFSQVRJT047Ci0JCX0KLQkJUmVnaW9uUGFyc2VyIHJlZ2lvblBhcnNlciA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFBhcnNlcigpOwotCQlpZiAocmVnaW9uUGFyc2VyIGluc3RhbmNlb2YgQ1NTU291cmNlUGFyc2VyKSB7Ci0JCQkoKENTU1NvdXJjZVBhcnNlcikgcmVnaW9uUGFyc2VyKS5zZXRQYXJzZXJNb2RlKHBhcnNlck1vZGUpOwotCQl9Ci0JCXJldHVybiBkb2M7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZW5kUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIpIHsKLQkJTm9kZSBub2RlID0gZ2V0T3duZXJET01Ob2RlKCk7Ci0JCWlmIChub2RlICE9IG51bGwgJiYgbm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0TW9kZWwoKTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHJlcXVlc3Rlcik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLmVuZFJlY29yZGluZyhyZXF1ZXN0ZXIpOwotCi0JCWdldFN0eWxlTm90aWZpZXIoKS5lbmRSZWNvcmRpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgSUNTU0RvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJdGhpcy5kb2N1bWVudCA9IGNyZWF0ZURvY3VtZW50KCk7Ci0JCQl0aGlzLmRvY3VtZW50LnNldE1vZGVsKHRoaXMpOwotCQl9Ci0JCXJldHVybiB0aGlzLmRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBudWxsOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdXBlci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKQotCQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQotCQkvLyB0aGUgZmlyc3QgdGltZQotCQlBc3NlcnQuaXNOb3ROdWxsKGdldE1vZGVsSGFuZGxlcigpKTsKLQkJc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGdldE1vZGVsSGFuZGxlcigpLmdldERvY3VtZW50TG9hZGVyKCkuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJc2V0U3RydWN0dXJlZERvY3VtZW50KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSW5kZXhlZFJlZ2lvbiBnZXRJbmRleGVkUmVnaW9uKGludCBvZmZzZXQpIHsKLQkJaWYgKGdldERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGdldERvY3VtZW50KCkpLmdldENvbnRhaW5lck5vZGUob2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRPd25lckRPTU5vZGUoKSB7Ci0JCXJldHVybiBvd25lck5vZGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG93bmVyTm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBpZiB0aGUgY2FzZSBvZiBleHRlcm5hbCBDU1MgbW9kZWwsIHlvdQotCSAqICAgICAgICAgICAgc2hvdWxkIHNldCBudWxsLCBlbHNlIGlmIGludGVybmFsIGNzcywgeW91IHNob3VsZCBzZXQKLQkgKiAgICAgICAgICAgIFNUWUxFLXRhZyBub2RlLCBlbHNlIGlmIGlubGluZSBjc3MsIHlvdSBzaG91bGQgc2V0IHRoZQotCSAqICAgICAgICAgICAgZWxlbWVudCB0aGF0IGlzIHRoZSBvd25lciBvZiBzdHlsZS1hdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3duZXJET01Ob2RlKE5vZGUgbm9kZSkgewotCQkvLyBwcm9oaWJpdCBvd25lciBjaGFuZ2UKLQkJQXNzZXJ0LmlzVHJ1ZShvd25lck5vZGUgPT0gbnVsbCk7Ci0JCW93bmVyTm9kZSA9IG5vZGU7Ci0JCWlmIChvd25lck5vZGUgIT0gbnVsbCkgeyAvLyBmb3IgaW50ZXJuYWwvaW5saW5lIENTUyBjb250ZXh0Ci0JCQl0cnkgewotCQkJCXNldElkKElEX05PTl9FWFRFUk5BTF9DU1MpOwotCQkJfQotCQkJY2F0Y2ggKFJlc291cmNlSW5Vc2UgZSkgewotCQkJCS8vIGltcG9zc2libGUKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHJvdGVjdGVkIENTU01vZGVsUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKGZQYXJzZXIgPT0gbnVsbCkgewotCQkJaWYgKGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJCWZQYXJzZXIgPSBuZXcgQ1NTTW9kZWxQYXJzZXIoZG9jdW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTdHlsZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIGdldFN0eWxlTm90aWZpZXIoKS5nZXRTdHlsZUxpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFN0eWxlU2hlZXRUeXBlKCkgewotCQlpZiAoZ2V0RG9jdW1lbnQoKSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xhcmF0aW9uKQotCQkJcmV0dXJuIElOTElORTsKLQkJaWYgKGdldE93bmVyRE9NTm9kZSgpICE9IG51bGwpCi0JCQlyZXR1cm4gRU1CRURERUQ7Ci0JCWVsc2UKLQkJCXJldHVybiBFWFRFUk5BTDsKLQl9Ci0KLQlwcml2YXRlIENTU1N0eWxlTm90aWZ5QWRhcHRlciBnZXRTdHlsZU5vdGlmaWVyKCkgewotCQlpZiAoc3R5bGVOb3RpZmllciA9PSBudWxsKSB7Ci0JCQlzdHlsZU5vdGlmaWVyID0gKG93bmVyTm9kZSAhPSBudWxsKSA/IG5ldyBDU1NFbWJlZGVkU3R5bGVOb3RpZnlBZGFwdGVyKHRoaXMpIDogbmV3IENTU1N0eWxlTm90aWZ5QWRhcHRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gc3R5bGVOb3RpZmllcjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU01vZGVsVXBkYXRlciBnZXRVcGRhdGVyKCkgewotCQlpZiAoZlVwZGF0ZXIgPT0gbnVsbCkgewotCQkJZlVwZGF0ZXIgPSBuZXcgQ1NTTW9kZWxVcGRhdGVyKHRoaXMpOwotCQkJZlVwZGF0ZXIuc2V0UGFyc2VyKGdldFBhcnNlcigpKTsKLQkJfQotCQlyZXR1cm4gZlVwZGF0ZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWNvcmRpbmcoKSB7Ci0JCXJldHVybiBnZXRTdHlsZU5vdGlmaWVyKCkuaXNSZWNvcmRpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkKCkgewotCQlyZXR1cm4gKGdldFN0eWxlU2hlZXRUeXBlKCkgPT0gRVhURVJOQUwpICYmIHN1cGVyLmlzU2hhcmVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbmV3TW9kZWwoTmV3RG9jdW1lbnRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLCBidXQgZm9yIHRoZSBjYXNlCi0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpCi0JCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZmxhdE5vZGVzID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkxpc3QoKTsKLQkJaWYgKGZsYXROb2RlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0RG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSB0cnVlOwotCi0JCSgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBnZXREb2N1bWVudCgpKS5yZW1vdmVDaGlsZE5vZGVzKCk7Ci0KLQkJQ1NTTW9kZWxQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCXBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci0JCXBhcnNlci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhmbGF0Tm9kZXMsIG51bGwpOwotCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBub0NoYW5nZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub0NoYW5nZShOb0NoYW5nZUV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCS8vIG5vcAotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOwotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9PSBudWxsICYmIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IHRydWU7Ci0KLQkJQ1NTTW9kZWxQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCXBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci0JCXBhcnNlci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKTsKLQotCQlmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogY2xlYW51cCAtPiByZWJ1aWxkIENTUyBOb2RlcyBUaGlzIGlzIHByZS1iZXRhIGZpeCBmb3IgMTc4MTc2LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hOb2RlcygpIHsKLQkJLy8gY2xlYW51cCBvbGQgbm9kZXMKLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IHRydWU7Ci0JCSgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBnZXREb2N1bWVudCgpKS5yZW1vdmVDaGlsZE5vZGVzKCk7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSBmYWxzZTsKLQotCQlnZXRQYXJzZXIoKS5jbGVhbnVwVXBkYXRlQ29udGV4dCgpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCVN0cmluZyBzb3VyY2UgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0VGV4dCgpOwotCi0JCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dCh0aGlzLCAwLCBzb3VyY2UubGVuZ3RoKCksIG51bGwpOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQodGhpcywgMCwgMCwgc291cmNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRSZWdpb24oKTsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gdHJ1ZTsKLQotCQlDU1NNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJcGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJcGFyc2VyLmNoYW5nZVJlZ2lvbihmbGF0Tm9kZSwgcmVnaW9uKTsKLQotCQlmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVnaW9uc1JlcGxhY2VkKFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9sZFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXROZXdSZWdpb25zKCk7Ci0JCWlmIChvbGRSZWdpb25zID09IG51bGwgJiYgbmV3UmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSB0cnVlOwotCi0JCUNTU01vZGVsUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQlwYXJzZXIuc2V0U3RydWN0dXJlZERvY3VtZW50RXZlbnQoc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotCQlwYXJzZXIucmVwbGFjZVJlZ2lvbnMoZmxhdE5vZGUsIG5ld1JlZ2lvbnMsIG9sZFJlZ2lvbnMpOwotCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSBmYWxzZTsKLQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tRWRpdCgpIHsKLQkJY2xvc2VJbXBvcnRlZCgpOwotCQlpZiAoZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBFWFRFUk5BTCkgewotCQkJc3VwZXIucmVsZWFzZUZyb21FZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVJlYWQoKSB7Ci0JCWNsb3NlSW1wb3J0ZWQoKTsKLQkJaWYgKGdldFN0eWxlU2hlZXRUeXBlKCkgPT0gRVhURVJOQUwpIHsKLQkJCXN1cGVyLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZXZlbnQuQ1NTU3R5bGVMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVN0eWxlTGlzdGVuZXIoSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZ2V0U3R5bGVOb3RpZmllcigpLnJlbW92ZVN0eWxlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IG5ld1N0cnVjdHVyZWREb2N1bWVudCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IG9sZFN0cnVjdHVyZWREb2N1bWVudCA9IHN1cGVyLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50ID09IG9sZFN0cnVjdHVyZWREb2N1bWVudCkKLQkJCXJldHVybjsgLy8gbm90aW5nIHRvIGRvCi0KLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKQotCQkJb2xkU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcih0aGlzKTsKLQkJc3VwZXIuc2V0U3RydWN0dXJlZERvY3VtZW50KG5ld1N0cnVjdHVyZWREb2N1bWVudCk7Ci0KLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpID4gMCkgewotCQkJCW5ld01vZGVsKG5ldyBOZXdEb2N1bWVudEV2ZW50KG5ld1N0cnVjdHVyZWREb2N1bWVudCwgdGhpcykpOwotCQkJfQotCQkJbmV3U3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcih0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzcmNNb2RlbAotCSAqICAgICAgICAgICAgY29tLmltYi5zZWQuY3NzLm1vZGUuaW50ZWZhY2VzLklDU1NNb2RlbAotCSAqIEBwYXJhbSByZW1vdmVkCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTU2VsZWN0b3JbXQotCSAqIEBwYXJhbSBhZGRlZAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU1NlbGVjdG9yW10KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdHlsZUNoYW5nZWQoSUNTU01vZGVsIHNyY01vZGVsLCBJQ1NTU2VsZWN0b3JbXSByZW1vdmVkLCBJQ1NTU2VsZWN0b3JbXSBhZGRlZCwgU3RyaW5nIG1lZGlhKSB7Ci0JCWdldFN0eWxlTm90aWZpZXIoKS5zdHlsZUNoYW5nZWQoc3JjTW9kZWwsIHJlbW92ZWQsIGFkZGVkLCBtZWRpYSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNyY01vZGVsCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdHlsZVVwZGF0ZShJQ1NTTW9kZWwgc3JjTW9kZWwpIHsKLQkJZ2V0U3R5bGVOb3RpZmllcigpLnN0eWxlVXBkYXRlKHNyY01vZGVsKTsKLQl9Ci0KLQl2b2lkIHZhbHVlQ2hhbmdlZChDU1NOb2RlSW1wbCBub2RlLCBTdHJpbmcgb2xkVmFsdWUpIHsKLQkJaWYgKCFmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlKSB7Ci0JCQlDU1NNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldFVwZGF0ZXIoKTsKLQkJCXVwZGF0ZXIudmFsdWVDaGFuZ2VkKG5vZGUsIG9sZFZhbHVlKTsKLQkJfQotCi0JCUlDU1NTZWxlY3RvciByZW1vdmVkW10gPSBudWxsLCBhZGRlZFtdID0gbnVsbDsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUgJiYgKChDU1NBdHRySW1wbCkgbm9kZSkuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTU3R5bGVSdWxlLlNFTEVDVE9SKSkgewotCQkJCUNTU0F0dHJJbXBsIGF0dHIgPSAoQ1NTQXR0ckltcGwpIG5vZGU7Ci0JCQkJLy8gY29sbGVjdCBjaGFuZ2VkIHNlbGVjdG9yCi0JCQkJSUNTU1NlbGVjdG9yTGlzdCBsaXN0ID0gbmV3IENTU1NlbGVjdG9yTGlzdEltcGwoYXR0ci5nZXRWYWx1ZSgpKTsKLQkJCQlhZGRlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbbGlzdC5nZXRMZW5ndGgoKV07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0JCQkJCWFkZGVkW2ldID0gbGlzdC5nZXRTZWxlY3RvcihpKTsKLQotCQkJCS8vIGdldCBvbGQgdmFsdWUKLQkJCQlsaXN0ID0gbmV3IENTU1NlbGVjdG9yTGlzdEltcGwob2xkVmFsdWUpOwotCQkJCXJlbW92ZWQgPSBuZXcgSUNTU1NlbGVjdG9yW2xpc3QuZ2V0TGVuZ3RoKCldOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotCQkJCQlyZW1vdmVkW2ldID0gbGlzdC5nZXRTZWxlY3RvcihpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTVmFsdWUpIHsKLQkJCQlJQ1NTTm9kZSBydWxlID0gbm9kZTsKLQkJCQl3aGlsZSAocnVsZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChydWxlIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSkKLQkJCQkJCWJyZWFrOwotCQkJCQlydWxlID0gcnVsZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJfQotCQkJCWlmIChydWxlICE9IG51bGwpIHsKLQkJCQkJSUNTU1NlbGVjdG9yTGlzdCBsaXN0ID0gKChJQ1NTU3R5bGVSdWxlKSBydWxlKS5nZXRTZWxlY3RvcnMoKTsKLQkJCQkJYWRkZWQgPSBuZXcgSUNTU1NlbGVjdG9yW2xpc3QuZ2V0TGVuZ3RoKCldOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCQkJCWFkZGVkW2ldID0gbGlzdC5nZXRTZWxlY3RvcihpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlbW92ZWQgIT0gbnVsbCB8fCBhZGRlZCAhPSBudWxsIHx8IGdldERvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpIHsKLQkJCS8vIHNlbmQgc2VsZWN0b3IgY2hhbmdlZCBldmVudAotCQkJZ2V0U3R5bGVOb3RpZmllcigpLmZpcmUocmVtb3ZlZCwgYWRkZWQsIG51bGwpOwotCQl9Ci0JCS8vIGZvciBocmVmIGF0dHJpYnV0ZQotCQlpZiAoZ2V0U3R5bGVMaXN0ZW5lcnMoKSAhPSBudWxsICYmIGdldFN0eWxlTGlzdGVuZXJzKCkuc2l6ZSgpID4gMCkgewotCQkJaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuQVRUUl9OT0RFICYmICgoQ1NTQXR0ckltcGwpIG5vZGUpLmdldE5hbWUoKS5lcXVhbHMoSUNTU0ltcG9ydFJ1bGUuSFJFRikpIHsKLQkJCQkoKElDU1NJbXBvcnRSdWxlKSAoKElDU1NBdHRyKSBub2RlKS5nZXRPd25lckNTU05vZGUoKSkuZ2V0U3R5bGVTaGVldCgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbE5vZGVGZWVkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxOb2RlRmVlZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZTY0ODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbE5vZGVGZWVkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NNb2RlbE5vZGVGZWVkZXIgewotCS8qKgotCSAqIGN1cnJlbnRseSBJQ1NTRG9jdW1lbnQgaXMgdXNlZCBidXQgbWF5IGdvIGJhY2sgdG8gQ1NTRG9jdW1lbnRJbXBsIGluIGZ1dHVyZS4KLQkgKi8KLQlJQ1NTRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQlDU1NNb2RlbFVwZGF0ZUNvbnRleHQgZlVwZGF0ZUNvbnRleHQgPSBudWxsOwotCi0JLyoqCi0JICogQ1NTTW9kZWxOb2RlRmVlZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTTW9kZWxOb2RlRmVlZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENTU01vZGVsTm9kZUZlZWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIGN1cnJlbnRseSBJQ1NTRG9jdW1lbnQgaXMgdXNlZCBidXQgbWF5IGdvIGJhY2sgdG8gQ1NTRG9jdW1lbnRJbXBsIGluIGZ1dHVyZS4KLQkgKi8KLQlDU1NNb2RlbE5vZGVGZWVkZXIoSUNTU0RvY3VtZW50IGRvY3VtZW50LCBDU1NNb2RlbFVwZGF0ZUNvbnRleHQgdXBkYXRlQ29udGV4dCkgewotCQlzdXBlcigpOwotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZlVwZGF0ZUNvbnRleHQgPSB1cGRhdGVDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU0NoYXJzZXRSdWxlSW1wbCBnZXRDU1NDaGFyc2V0UnVsZSgpIHsKLQkJQ1NTQ2hhcnNldFJ1bGVJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0Q1NTQ2hhcnNldFJ1bGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoQ1NTQ2hhcnNldFJ1bGVJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTQ2hhcnNldFJ1bGUoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NGb250RmFjZVJ1bGVJbXBsIGdldENTU0ZvbnRGYWNlUnVsZSgpIHsKLQkJQ1NTRm9udEZhY2VSdWxlSW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldENTU0ZvbnRGYWNlUnVsZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChDU1NGb250RmFjZVJ1bGVJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTRm9udEZhY2VSdWxlKCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTSW1wb3J0UnVsZUltcGwgZ2V0Q1NTSW1wb3J0UnVsZSgpIHsKLQkJQ1NTSW1wb3J0UnVsZUltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDU1NJbXBvcnRSdWxlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKENTU0ltcG9ydFJ1bGVJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTSW1wb3J0UnVsZSgpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU01lZGlhUnVsZUltcGwgZ2V0Q1NTTWVkaWFSdWxlKCkgewotCQlDU1NNZWRpYVJ1bGVJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0Q1NTTWVkaWFSdWxlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKENTU01lZGlhUnVsZUltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NNZWRpYVJ1bGUoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NQYWdlUnVsZUltcGwgZ2V0Q1NTUGFnZVJ1bGUoKSB7Ci0JCUNTU1BhZ2VSdWxlSW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldENTU1BhZ2VSdWxlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKENTU1BhZ2VSdWxlSW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU1BhZ2VSdWxlKCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTU3R5bGVSdWxlSW1wbCBnZXRDU1NTdHlsZVJ1bGUoKSB7Ci0JCUNTU1N0eWxlUnVsZUltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDU1NTdHlsZVJ1bGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoQ1NTU3R5bGVSdWxlSW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU1N0eWxlUnVsZSgpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhZGFhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NDaGFyc2V0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01lZGlhUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1BhZ2VSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUnVsZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkNvcmVOb2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5UZXh0UmVnaW9uTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci0KLQotLyoqCi0gKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotICovCi1wdWJsaWMgY2xhc3MgQ1NTTW9kZWxQYXJzZXIgewotCi0JcHJpdmF0ZSBJQ1NTRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIENTU01vZGVsQ3JlYXRpb25Db250ZXh0IGZDcmVhdGlvbkNvbnRleHQgPSBudWxsOwotCXByaXZhdGUgQ1NTTW9kZWxEZWxldGlvbkNvbnRleHQgZkRlbGV0aW9uQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQgZlVwZGF0ZUNvbnRleHQgPSBudWxsOwotCXByaXZhdGUgQ1NTTW9kZWxOb2RlRmVlZGVyIGZGZWVkZXIgPSBudWxsOwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyIGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmUGFyc2VGbG9hdGluZyA9IGZhbHNlOwotCi0JLyoqCi0JICogQ1NTTW9kZWxQYXJzZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIENTU01vZGVsUGFyc2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIGN1cnJlbnRseSBwcm92ZGVkIHRoaXMgbWV0aG9kIGJ1dCBtYXkgYmUgcmVtb3ZlZCBpbiBmdXR1cmUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJzZUZsb2F0aW5nKCl7Ci0JCXJldHVybiBmUGFyc2VGbG9hdGluZzsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHByb3ZkZWQgdGhpcyBtZXRob2QgYnV0IG1heSBiZSByZW1vdmVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQgZ2V0Q3JlYXRpb25Db250ZXh0KCl7Ci0JCXJldHVybiBmQ3JlYXRpb25Db250ZXh0OwotCX0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHJvdmRlZCB0aGlzIG1ldGhvZCBidXQgbWF5IGJlIHJlbW92ZWQgaW4gZnV0dXJlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVXBkYXRlQ29udGV4dEFjdGl2ZSgpewotCQlyZXR1cm4gZlVwZGF0ZUNvbnRleHQgIT0gbnVsbCA/IGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkgOiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgQ1NTTW9kZWxQYXJzZXIoSUNTU0RvY3VtZW50IGRvYykgewotCQl0aGlzKCk7Ci0JCWZEb2N1bWVudCA9IGRvYzsKLQkJZkNyZWF0aW9uQ29udGV4dCA9IG5ldyBDU1NNb2RlbENyZWF0aW9uQ29udGV4dCgoQ1NTTm9kZUltcGwpZG9jKTsKLQkJZkRlbGV0aW9uQ29udGV4dCA9IG5ldyBDU1NNb2RlbERlbGV0aW9uQ29udGV4dChkb2MpOwotCQlmVXBkYXRlQ29udGV4dCA9IG5ldyBDU1NNb2RlbFVwZGF0ZUNvbnRleHQoKTsKLQkJZkZlZWRlciA9IG5ldyBDU1NNb2RlbE5vZGVGZWVkZXIoZG9jLCBmVXBkYXRlQ29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBjaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlyZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhuZXcgQ29yZU5vZGVMaXN0KGZsYXROb2RlLCBmbGF0Tm9kZSksIG5ldyBDb3JlTm9kZUxpc3QoZmxhdE5vZGUsIGZsYXROb2RlKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBjaGFuZ2VSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsIHx8IHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGZEb2N1bWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja05leHROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIFN0cmluZyB0eXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dCA9IENTU1V0aWwuZmluZE5leHRTaWduaWZpY2FudE5vZGUoZmxhdE5vZGUpOwotCQlpZiAoQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKG5leHQpID09IHR5cGUpIHsKLQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0UmVwYXJzZVN0YXJ0KGZsYXROb2RlLmdldEVuZCgpKTsKLQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0UmVwYXJzZUVuZChuZXh0LmdldEVuZCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjbGVhbnVwRGVsZXRpb25Db250ZXh0KCkgewotCQkvLyBzZXR1cERlbGV0aW9uQ29udGV4dChudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGNsZWFudXBGaXJzdE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUsIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciB0YXJnZXQpIHsKLQkJaWYgKGZpcnN0Tm9kZSA9PSBudWxsIHx8IHRhcmdldCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZmlyc3ROb2RlID09IHRhcmdldC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5nZXROZXh0Tm9kZUluQ3VycmVudChmaXJzdE5vZGUpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IHRhcmdldC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAobGFzdE5vZGUgPT0gbnVsbCB8fCBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmlzT2xkTm9kZShsYXN0Tm9kZSkgfHwgbmV4dE5vZGUgPT0gbnVsbCB8fCBsYXN0Tm9kZS5nZXRTdGFydE9mZnNldCgpIDwgbmV4dE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCXRhcmdldC5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsLCBudWxsKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRhcmdldC5zZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXh0Tm9kZSk7Ci0JCQl9Ci0JCQlJQ1NTTm9kZSBwYXJlbnQgPSB0YXJnZXQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCWNsZWFudXBGaXJzdE5vZGUoZmlyc3ROb2RlLCAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gY2xlYW51cExhc3ROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUsIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciB0YXJnZXQpIHsKLQkJaWYgKGxhc3ROb2RlID09IG51bGwgfHwgdGFyZ2V0ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChsYXN0Tm9kZSA9PSB0YXJnZXQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZOb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5nZXRQcmV2Tm9kZUluQ3VycmVudChsYXN0Tm9kZSk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9IHRhcmdldC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZpcnN0Tm9kZSA9PSBudWxsIHx8IGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuaXNPbGROb2RlKGZpcnN0Tm9kZSkgfHwgcHJldk5vZGUgPT0gbnVsbCB8fCBwcmV2Tm9kZS5nZXRTdGFydE9mZnNldCgpIDwgZmlyc3ROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQl0YXJnZXQuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0YXJnZXQuc2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihwcmV2Tm9kZSk7Ci0JCQl9Ci0JCQlJQ1NTTm9kZSBwYXJlbnQgPSB0YXJnZXQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCWNsZWFudXBMYXN0Tm9kZShsYXN0Tm9kZSwgKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgcGFyZW50KTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgY2xlYW51cFVwZGF0ZUNvbnRleHQoKSB7Ci0JCWludCByZW1haW5zID0gZlVwZGF0ZUNvbnRleHQuZ2V0Tm9kZUNvdW50KCk7Ci0JCWZVcGRhdGVDb250ZXh0LmNsZWFudXBDb250ZXh0KCk7Ci0JCXJldHVybiByZW1haW5zOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBmbG9hdGluZyBDU1MgcnVsZSAob3duZXIgZG9jdW1lbnQgd2lsbCBiZSBzZXQpIHRoaXMgaXMgZm9yCi0JICogQ1NTU3R5bGVTaGVldC5jcmVhdGVDU1NSdWxlKFN0cmluZykKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICovCi0JQ1NTUnVsZSBjcmVhdGVDU1NSdWxlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcykgewotCQlpZiAoZmxhdE5vZGVzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZlBhcnNlRmxvYXRpbmcgPSB0cnVlOwotCi0JCS8vIHNldHVwIGNyZWF0aW9uIGNvbnRleHQKLQkJZkNyZWF0aW9uQ29udGV4dC5jbGVhcigpOwotCQlmQ3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUobnVsbCk7Ci0JCWZDcmVhdGlvbkNvbnRleHQuc2V0TmV4dE5vZGUobnVsbCk7Ci0JCUNTU1J1bGVJbXBsIHBhcmVudFJ1bGUgPSBudWxsOwotCi0JCWZvciAoRW51bWVyYXRpb24gZSA9IGZsYXROb2Rlcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBlLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJQ1NTTm9kZUltcGwgbW9kaWZpZWQgPSBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJaWYgKHBhcmVudFJ1bGUgPT0gbnVsbCAmJiBtb2RpZmllZCBpbnN0YW5jZW9mIENTU1J1bGVJbXBsKSB7Ci0JCQkJcGFyZW50UnVsZSA9IChDU1NSdWxlSW1wbCkgbW9kaWZpZWQ7Ci0JCQl9Ci0JCX0KLQotCQlmUGFyc2VGbG9hdGluZyA9IGZhbHNlOwotCi0JCWlmIChwYXJlbnRSdWxlICE9IG51bGwpIHsKLQkJCUNTU01vZGVsVXRpbC5jbGVhbnVwQ29udGFpbmVyKHBhcmVudFJ1bGUpOwotCQl9Ci0KLQkJcmV0dXJuIHBhcmVudFJ1bGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpbmRCcmFjZUNsb3NlKGludCBkZXB0aCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydCwgYm9vbGVhbiBiQnJlYWtTaWJsaW5nKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gbnVsbDsKLQkJaW50IGJyYWNlTGV2ZWwgPSAwOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZOb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBzdGFydC5nZXROZXh0KCk7Ci0JCWZvciAoOyByZWdpb24gIT0gbnVsbDsgcmVnaW9uID0gcmVnaW9uLmdldE5leHQoKSkgewotCQkJaW50IG9mZnNldCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCQlBc3NlcnQuaXNUcnVlKGZhbHNlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCUNTU05vZGVJbXBsIG5vZGUgPSBnZXROb2RlQXQob2Zmc2V0KTsKLQkJCWludCBkZXB0aEhpdCA9IChub2RlICE9IG51bGwpID8gQ1NTTW9kZWxVdGlsLmdldERlcHRoKG5vZGUpIDogLTE7Ci0JCQlpZiAoZGVwdGggPD0gZGVwdGhIaXQpIHsKLQkJCQkvLyBzaWJsaW5nIGlzIGZvdW5kIGJlZm9yZSAifSIKLQkJCQlpZiAoYkJyZWFrU2libGluZykgewotCQkJCQlDU1NOb2RlSW1wbCBwYXJlbnQgPSAoQ1NTTm9kZUltcGwpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQl3aGlsZSAoZGVwdGggPD0gQ1NTTW9kZWxVdGlsLmdldERlcHRoKHBhcmVudCkpIHsKLQkJCQkJCW5vZGUgPSBwYXJlbnQ7Ci0JCQkJCQlwYXJlbnQgPSAoQ1NTTm9kZUltcGwpIHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHBhcmVudCAhPSBudWxsICYmIG5vZGUgIT0gbnVsbCkgewotCQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSBwcmV2Tm9kZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIHR5cGUgPSBDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUocmVnaW9uKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpIHsKLQkJCQlicmFjZUxldmVsKys7Ci0JCQl9Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQkJYnJhY2VMZXZlbC0tOwotCQkJCWlmIChicmFjZUxldmVsIDwgMCkgewotCQkJCQlyZXN1bHQgPSByZWdpb247Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXByZXZOb2RlID0gcmVnaW9uOwotCQl9Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsICYmIHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkvLyByZWFjaCB0aGUgZW5kIG9mIGRvY3VtZW50Ci0JCQlyZXN1bHQgPSBwcmV2Tm9kZTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0KGludCBzdGFydCwgaW50IGVuZCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBub2RlTGlzdCA9IG51bGw7Ci0JCWlmICgwIDw9IHN0YXJ0ICYmIHN0YXJ0IDw9IGVuZCkgewotCQkJSUNTU01vZGVsIG1vZGVsID0gZkRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBDU1NNb2RlbEltcGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9ICgoQ1NTTW9kZWxJbXBsKSBtb2RlbCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnROb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0KTsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmROb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGVuZCAtIDEpOwotCQkJCQlpZiAoc3RhcnROb2RlICE9IG51bGwgJiYgZW5kTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlub2RlTGlzdCA9IG5ldyBDb3JlTm9kZUxpc3Qoc3RhcnROb2RlLCBlbmROb2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBub2RlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGdldE5vZGVBdChpbnQgb2Zmc2V0KSB7Ci0JCUNTU05vZGVJbXBsIHJvb3ROb2RlID0gZkNyZWF0aW9uQ29udGV4dC5nZXRSb290Tm9kZSgpOwotCQlJQ1NTTm9kZSB0YXJnZXQgPSByb290Tm9kZS5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIENTU05vZGVJbXBsKSB7Ci0JCQlyZXR1cm4gKENTU05vZGVJbXBsKSB0YXJnZXQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0QnJhY2VDbG9zZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlJQ1NTTm9kZSB0YXJnZXQgPSBDU1NNb2RlbFV0aWwuZmluZEJyYWNlQ29udGFpbmVyKGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpKTsKLQotCQlpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBwYXJlbnQgPSAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB0YXJnZXQ7Ci0JCWlmIChDU1NNb2RlbFV0aWwuaXNJbnRlcnJ1cHRpb24ocGFyZW50LCByZWdpb24pKSB7Ci0JCQlJQ1NTTm9kZSBub2RlID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTTm9kZUltcGwpIHsKLQkJCQlmQ3JlYXRpb25Db250ZXh0LnNldFJlcGFyc2VTdGFydChwYXJlbnQuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJZkNyZWF0aW9uQ29udGV4dC5zZXRSZXBhcnNlRW5kKHBhcmVudC5nZXRFbmRPZmZzZXQoKSk7Ci0JCQkJKChDU1NOb2RlSW1wbCkgbm9kZSkucmVtb3ZlQ2hpbGQocGFyZW50KTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElDU1NQYWdlUnVsZSB8fCBwYXJlbnQgaW5zdGFuY2VvZiBJQ1NTTWVkaWFSdWxlIHx8IHBhcmVudCBpbnN0YW5jZW9mIENTU0ZvbnRGYWNlUnVsZSB8fCBwYXJlbnQgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKSB7Ci0JCQlDU1NNb2RlbFV0aWwuZXhwYW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKHBhcmVudCwgcmVnaW9uKTsKLQkJCWlmICghQ1NTTW9kZWxVdGlsLmlzQnJhY2VDbG9zZWQodGFyZ2V0KSkgewotCQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpKTsKLQkJCQlmQ3JlYXRpb25Db250ZXh0LnNldE5leHROb2RlKHBhcmVudC5nZXROZXh0U2libGluZygpKTsKLQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRCcmFjZU9wZW4oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBrZXlSZWdpb24gPSBDU1NVdGlsLmZpbmRQcmV2aW91c1NpZ25pZmljYW50Tm9kZShyZWdpb24pOwotCQlpZiAoa2V5UmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICghZlBhcnNlRmxvYXRpbmcpIHsKLQkJCUNTU05vZGVJbXBsIG5vZGUgPSBnZXROb2RlQXQoa2V5UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCAmJiAhKG5vZGUgaW5zdGFuY2VvZiBJQ1NTUnVsZUNvbnRhaW5lcikpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlTdHJpbmcgdHlwZSA9IENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShrZXlSZWdpb24pOwotCi0JCUNTU05vZGVJbXBsIGluc2VydGVkID0gbnVsbDsKLQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1BBR0UpIHsKLQkJCWluc2VydGVkID0gaW5zZXJ0UGFnZVJ1bGUoa2V5UmVnaW9uLCByZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBKSB7Ci0JCQlpbnNlcnRlZCA9IGluc2VydE1lZGlhUnVsZShrZXlSZWdpb24sIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfRk9OVF9GQUNFKSB7Ci0JCQlpbnNlcnRlZCA9IGluc2VydEZvbnRGYWNlUnVsZShrZXlSZWdpb24sIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAoQ1NTVXRpbC5pc1NlbGVjdG9yVGV4dChrZXlSZWdpb24pKSB7Ci0JCQlpbnNlcnRlZCA9IGluc2VydFN0eWxlUnVsZShrZXlSZWdpb24sIHJlZ2lvbik7Ci0JCX0KLQotCQlpZiAoaW5zZXJ0ZWQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCS8vIENTU01vZGVsVXRpbC5leHBhbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcilpbnNlcnRlZCwKLQkJCS8vIGZsYXROb2RlKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYnJhY2VDbG9zZSA9IGZpbmRCcmFjZUNsb3NlKENTU01vZGVsVXRpbC5nZXREZXB0aChpbnNlcnRlZCksIHJlZ2lvbiwgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBKSk7Ci0JCQlpZiAoYnJhY2VDbG9zZSAhPSBudWxsKSB7Ci0JCQkJZkNyZWF0aW9uQ29udGV4dC5zZXRSZXBhcnNlU3RhcnQocmVnaW9uLmdldEVuZCgpKTsKLQkJCQlmQ3JlYXRpb25Db250ZXh0LnNldFJlcGFyc2VFbmQoYnJhY2VDbG9zZS5nZXRFbmQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5zZXJ0ZWQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRDaGFyc2V0UnVsZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGJlZ2luRG9jUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZERvY1JlZ2lvbikgewotCQlDU1NOb2RlSW1wbCBwYXJlbnQgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKCFmUGFyc2VGbG9hdGluZyAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoYmVnaW5Eb2NSZWdpb24uZ2V0UmVnaW9ucygpKTsKLQkJcmVnaW9ucy5yZW1vdmUoMCk7IC8vIG11c3QgYmUgIkBjaGFyc2V0IgotCQlJVGV4dFJlZ2lvbiBlbmNvZGluZ1JlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlICghcmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSByZWdpb25zLnJlbW92ZSgwKTsKLQkJCWlmICh0ZXh0UmVnaW9uID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyB0eXBlID0gdGV4dFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU1RSSU5HKSB7Ci0JCQkJZW5jb2RpbmdSZWdpb24gPSB0ZXh0UmVnaW9uOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVuY29kaW5nUmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTQ2hhcnNldFJ1bGVJbXBsIHJ1bGUgPSBmRmVlZGVyLmdldENTU0NoYXJzZXRSdWxlKCk7Ci0JCWlmIChydWxlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlydWxlLnNldEF0dHJpYnV0ZShJQ1NTQ2hhcnNldFJ1bGUuRU5DT0RJTkcsIGJlZ2luRG9jUmVnaW9uLmdldFRleHQoZW5jb2RpbmdSZWdpb24pKTsKLQkJfQotCi0JCS8vIHNldHVwIGZsYXQgY29udGFpbmVyCi0JCXJ1bGUuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oYmVnaW5Eb2NSZWdpb24sIGVuZERvY1JlZ2lvbik7Ci0JCUNTU0F0dHJJbXBsIGF0dHIgPSBydWxlLmdldEF0dHJpYnV0ZU5vZGUoSUNTU0NoYXJzZXRSdWxlLkVOQ09ESU5HKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJYXR0ci5zZXRSYW5nZVJlZ2lvbihiZWdpbkRvY1JlZ2lvbiwgZW5jb2RpbmdSZWdpb24sIGVuY29kaW5nUmVnaW9uKTsKLQkJfQotCi0JCS8vIGluc2VydCB0byB0cmVlCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcHJvcGFnYXRlUmFuZ2VQcmVJbnNlcnQocGFyZW50LCBydWxlKTsKLQkJCUNTU05vZGVJbXBsIG5leHQgPSBmQ3JlYXRpb25Db250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShydWxlLCBuZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZChydWxlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHJvdGVjdGVkIENTU05vZGVJbXBsIGluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlpZiAoZkNyZWF0aW9uQ29udGV4dCA9PSBudWxsIHx8IHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyB0eXBlID0gKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgcmVnaW9uKS5nZXRUeXBlKCk7Ci0JCUNTU05vZGVJbXBsIG1vZGlmaWVkID0gbnVsbDsKLQotCQlJQ1NTTm9kZSB0YXJnZXQgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQotCQlpZiAoKGZQYXJzZUZsb2F0aW5nICYmIHRhcmdldCA9PSBudWxsKSB8fCB0YXJnZXQgaW5zdGFuY2VvZiBJQ1NTUnVsZUNvbnRhaW5lcikgewotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUikgewotCQkJCW1vZGlmaWVkID0gaW5zZXJ0U2VtaUNvbG9uRm9yUnVsZShyZWdpb24pOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQkJbW9kaWZpZWQgPSBpbnNlcnRCcmFjZU9wZW4ocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkgewotCQkJCW1vZGlmaWVkID0gaW5zZXJ0QnJhY2VDbG9zZShyZWdpb24pOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19GT05UX0ZBQ0UgfHwgQ1NTVXRpbC5pc1NlbGVjdG9yVGV4dChyZWdpb24pKSB7Ci0JCQkJY2hlY2tOZXh0Tm9kZShyZWdpb24sIENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JUIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NIQVJTRVQpIHsKLQkJCQljaGVja05leHROb2RlKHJlZ2lvbiwgQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUik7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoKHRhcmdldCBpbnN0YW5jZW9mIENTU1J1bGVEZWNsQ29udGFpbmVyIHx8IHRhcmdldCBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb24pICYmIHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZKSB7Ci0JCQltb2RpZmllZCA9IGluc2VydFN0eWxlRGVjbGFyYXRpb25JdGVtKHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0gJiYgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQltb2RpZmllZCA9IGluc2VydFNlbWlDb2xvbkZvclN0eWxlRGVjbGFyYXRpb25JdGVtKHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQltb2RpZmllZCA9IGluc2VydEJyYWNlQ2xvc2UocmVnaW9uKTsKLQkJfQotCi0JCS8vIHBvc3QgcHJvY2VzcwotCQlpZiAobW9kaWZpZWQgIT0gbnVsbCkgewotCQkJaWYgKG1vZGlmaWVkIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIG1vZGlmaWVkKS5wcm9wYWdhdGVSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG1vZGlmaWVkOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IHJlZ2lvbkxpc3QpIHsKLQkJZm9yIChFbnVtZXJhdGlvbiBlID0gcmVnaW9uTGlzdC5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ocmVnaW9uKTsKLQkJCWlmIChmQ3JlYXRpb25Db250ZXh0LmlzVG9SZXBhcnNlKCkpIHsKLQkJCQlpbnQgb3JpZ1N0YXJ0ID0gcmVnaW9uLmdldEVuZCgpOwotCQkJCWludCBvcmlnRW5kID0gcmVnaW9uTGlzdC5pdGVtKHJlZ2lvbkxpc3QuZ2V0TGVuZ3RoKCkgLSAxKS5nZXRFbmQoKTsKLQkJCQlpbnQgbmV3U3RhcnQgPSBmQ3JlYXRpb25Db250ZXh0LmdldFJlcGFyc2VTdGFydCgpOwotCQkJCWludCBuZXdFbmQgPSBmQ3JlYXRpb25Db250ZXh0LmdldFJlcGFyc2VFbmQoKTsKLQkJCQlpZiAobmV3U3RhcnQgPCBvcmlnU3RhcnQgfHwgb3JpZ0VuZCA8IG5ld0VuZCkgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdOb2RlTGlzdCA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QobmV3U3RhcnQsIG5ld0VuZCk7Ci0JCQkJCXNldHVwQ3JlYXRpb25Db250ZXh0KG5ld05vZGVMaXN0Lml0ZW0oMCkpOwotCQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKG5ld05vZGVMaXN0KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZkNyZWF0aW9uQ29udGV4dC5yZXNldFJlcGFyc2VSYW5nZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0Rm9udEZhY2VSdWxlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGJyYWNlTm9kZSkgewotCQlDU1NOb2RlSW1wbCBwYXJlbnQgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKCFmUGFyc2VGbG9hdGluZyAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDU1NGb250RmFjZVJ1bGVJbXBsIHJ1bGUgPSBmRmVlZGVyLmdldENTU0ZvbnRGYWNlUnVsZSgpOwotCQlpZiAocnVsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIHNldHVwIGZsYXQgY29udGFpbmVyCi0JCXJ1bGUuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ocmVnaW9uLCBicmFjZU5vZGUpOwotCi0JCS8vIGluc2VydCB0byB0cmVlCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcHJvcGFnYXRlUmFuZ2VQcmVJbnNlcnQocGFyZW50LCBydWxlKTsKLQkJCUNTU05vZGVJbXBsIG5leHQgPSBmQ3JlYXRpb25Db250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShydWxlLCBuZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZChydWxlKTsKLQkJCX0KLQkJfQotCi0JCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShydWxlKTsKLQkJLy8gVGFyZ2V0TmV4dCBpcyBzZXQgdG8gbnVsbCBhdXRvbWF0aWNhbGx5Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRJbXBvcnRSdWxlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYmVnaW5Eb2NSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kRG9jUmVnaW9uKSB7Ci0JCUNTU05vZGVJbXBsIHBhcmVudCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlpZiAoIWZQYXJzZUZsb2F0aW5nICYmICEocGFyZW50IGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbChiZWdpbkRvY1JlZ2lvbi5nZXRSZWdpb25zKCkpOwotCQlyZWdpb25zLnJlbW92ZSgwKTsgLy8gbXVzdCBiZSAiQGltcG9ydCIKLQkJSVRleHRSZWdpb24gaHJlZlJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlICghcmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSByZWdpb25zLnJlbW92ZSgwKTsKLQkJCWlmICh0ZXh0UmVnaW9uID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyB0eXBlID0gdGV4dFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVVJJIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORykgewotCQkJCWhyZWZSZWdpb24gPSB0ZXh0UmVnaW9uOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGhyZWZSZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDU1NJbXBvcnRSdWxlSW1wbCBydWxlID0gZkZlZWRlci5nZXRDU1NJbXBvcnRSdWxlKCk7Ci0JCWlmIChydWxlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTVXRpbC5zdHJpcFN1cnJvdW5kaW5nU3BhY2UocmVnaW9ucyk7Ci0JCU1lZGlhTGlzdEltcGwgbWVkaWFMaXN0ID0gKE1lZGlhTGlzdEltcGwpIHJ1bGUuZ2V0TWVkaWEoKTsKLQkJc2V0TWVkaWFMaXN0KG1lZGlhTGlzdCwgYmVnaW5Eb2NSZWdpb24sIHJlZ2lvbnMpOwotCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJcnVsZS5zZXRBdHRyaWJ1dGUoSUNTU0ltcG9ydFJ1bGUuSFJFRiwgYmVnaW5Eb2NSZWdpb24uZ2V0VGV4dChocmVmUmVnaW9uKSk7Ci0JCX0KLQotCQkvLyBzZXR1cCBmbGF0IGNvbnRhaW5lcgotCQlydWxlLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGJlZ2luRG9jUmVnaW9uLCBlbmREb2NSZWdpb24pOwotCQlDU1NBdHRySW1wbCBhdHRyID0gcnVsZS5nZXRBdHRyaWJ1dGVOb2RlKElDU1NJbXBvcnRSdWxlLkhSRUYpOwotCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQlhdHRyLnNldFJhbmdlUmVnaW9uKGJlZ2luRG9jUmVnaW9uLCBocmVmUmVnaW9uLCBocmVmUmVnaW9uKTsKLQkJfQotCi0JCS8vIGluc2VydCB0byB0cmVlCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcHJvcGFnYXRlUmFuZ2VQcmVJbnNlcnQocGFyZW50LCBydWxlKTsKLQkJCUNTU05vZGVJbXBsIG5leHQgPSBmQ3JlYXRpb25Db250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShydWxlLCBuZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZChydWxlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0TWVkaWFSdWxlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYnJhY2VOb2RlKSB7Ci0JCUNTU05vZGVJbXBsIHBhcmVudCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlpZiAoIWZQYXJzZUZsb2F0aW5nICYmICEocGFyZW50IGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNTU01lZGlhUnVsZUltcGwgcnVsZSA9IGZGZWVkZXIuZ2V0Q1NTTWVkaWFSdWxlKCk7Ci0JCWlmIChydWxlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKGZsYXROb2RlLmdldFJlZ2lvbnMoKSk7Ci0JCXJlZ2lvbnMucmVtb3ZlKDApOyAvLyBtdXN0IGJlICJAbWVkaWEiCi0KLQkJQ1NTVXRpbC5zdHJpcFN1cnJvdW5kaW5nU3BhY2UocmVnaW9ucyk7Ci0JCU1lZGlhTGlzdEltcGwgbWVkaWFMaXN0ID0gKE1lZGlhTGlzdEltcGwpIHJ1bGUuZ2V0TWVkaWEoKTsKLQkJc2V0TWVkaWFMaXN0KG1lZGlhTGlzdCwgZmxhdE5vZGUsIHJlZ2lvbnMpOwotCi0JCS8vIHNldHVwIGZsYXQgY29udGFpbmVyCi0JCXJ1bGUuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUsIGJyYWNlTm9kZSk7Ci0KLQkJLy8gaW5zZXJ0IHRvIHRyZWUKLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwcm9wYWdhdGVSYW5nZVByZUluc2VydChwYXJlbnQsIHJ1bGUpOwotCQkJQ1NTTm9kZUltcGwgbmV4dCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHJ1bGUsIG5leHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGFyZW50LmFwcGVuZENoaWxkKHJ1bGUpOwotCQkJfQotCQl9Ci0KLQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKHJ1bGUpOwotCQkvLyBUYXJnZXROZXh0IGlzIHNldCB0byBudWxsIGF1dG9tYXRpY2FsbHkKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydFBhZ2VSdWxlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYnJhY2VOb2RlKSB7Ci0JCUNTU05vZGVJbXBsIHBhcmVudCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlpZiAoIWZQYXJzZUZsb2F0aW5nICYmICEocGFyZW50IGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIGdldCBzZWxlY3RvciByZWdpb25zCi0JCUlUZXh0UmVnaW9uTGlzdCBzZWxlY3RvclJlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKGZsYXROb2RlLmdldFJlZ2lvbnMoKSk7Ci0JCXNlbGVjdG9yUmVnaW9ucy5yZW1vdmUoMCk7IC8vIG11c3QgYmUgIkBwYWdlIgotCQlDU1NVdGlsLnN0cmlwU3Vycm91bmRpbmdTcGFjZShzZWxlY3RvclJlZ2lvbnMpOwotCi0JCUNTU1BhZ2VSdWxlSW1wbCBydWxlID0gZkZlZWRlci5nZXRDU1NQYWdlUnVsZSgpOwotCQlpZiAocnVsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJU3RyaW5nIHNlbGVjdG9yU3RyID0gQ1NTVXRpbC5nZXRSZWdpb25UZXh0KGZsYXROb2RlLCBzZWxlY3RvclJlZ2lvbnMpOwotCQkJaWYgKDAgPCBzZWxlY3RvclN0ci5sZW5ndGgoKSkgewotCQkJCXJ1bGUuc2V0U2VsZWN0b3JUZXh0KHNlbGVjdG9yU3RyKTsKLQkJCX0KLQkJfQotCi0JCS8vIHNldHVwIGZsYXQgY29udGFpbmVyCi0JCXJ1bGUuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUsIGJyYWNlTm9kZSk7Ci0JCUNTU0F0dHJJbXBsIGF0dHIgPSBydWxlLmdldEF0dHJpYnV0ZU5vZGUoSUNTU1BhZ2VSdWxlLlNFTEVDVE9SKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCAmJiBzZWxlY3RvclJlZ2lvbnMgIT0gbnVsbCAmJiAhc2VsZWN0b3JSZWdpb25zLmlzRW1wdHkoKSkgewotCQkJYXR0ci5zZXRSYW5nZVJlZ2lvbihmbGF0Tm9kZSwgc2VsZWN0b3JSZWdpb25zLmdldCgwKSwgc2VsZWN0b3JSZWdpb25zLmdldChzZWxlY3RvclJlZ2lvbnMuc2l6ZSgpIC0gMSkpOwotCQl9Ci0KLQkJLy8gaW5zZXJ0IHRvIHRyZWUKLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwcm9wYWdhdGVSYW5nZVByZUluc2VydChwYXJlbnQsIHJ1bGUpOwotCQkJQ1NTTm9kZUltcGwgbmV4dCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHJ1bGUsIG5leHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGFyZW50LmFwcGVuZENoaWxkKHJ1bGUpOwotCQkJfQotCQl9Ci0KLQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKHJ1bGUpOwotCQkvLyBUYXJnZXROZXh0IGlzIHNldCB0byBudWxsIGF1dG9tYXRpY2FsbHkKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydFNlbWlDb2xvbkZvclJ1bGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBrZXlSZWdpb24gPSBDU1NVdGlsLmZpbmRQcmV2aW91c1NpZ25pZmljYW50Tm9kZShyZWdpb24pOwotCQlTdHJpbmcgdHlwZSA9IENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShrZXlSZWdpb24pOwotCi0JCUNTU05vZGVJbXBsIGluc2VydGVkID0gbnVsbDsKLQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCkgewotCQkJaW5zZXJ0ZWQgPSBpbnNlcnRJbXBvcnRSdWxlKGtleVJlZ2lvbiwgcmVnaW9uKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VUKSB7Ci0JCQlpbnNlcnRlZCA9IGluc2VydENoYXJzZXRSdWxlKGtleVJlZ2lvbiwgcmVnaW9uKTsKLQkJfQotCi0JCXJldHVybiBpbnNlcnRlZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydFNlbWlDb2xvbkZvclN0eWxlRGVjbGFyYXRpb25JdGVtKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCS8vIG9ubHkgdGFyZ2V0L25ldCBub2RlIGlzIGNoYW5nZWQuIG5vdGhpbmcgdG8gZG8uCi0KLQkJQ1NTTm9kZUltcGwgdGFyZ2V0Tm9kZSA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlpZiAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKSB7Ci0JCQlpbnQgb2Zmc2V0ID0gdGFyZ2V0Tm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJLy8gd2lkZW4gZG9jdW1lbnQgcmVnaW9uIHJhbmdlCi0JCQkvLyAoKENTU1N0eWxlRGVjbEl0ZW1JbXBsKXRhcmdldE5vZGUpLnNldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ocmVnaW9uKTsKLQkJCUNTU01vZGVsVXRpbC5leHBhbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoKENTU1N0eWxlRGVjbEl0ZW1JbXBsKSB0YXJnZXROb2RlLCByZWdpb24pOwotCQkJLy8gcHNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5kaWNhdGVzIENTU1N0eWxlRGVjbEl0ZW0KLQkJCUlDU1NOb2RlIHBhcmVudE5vZGUgPSB0YXJnZXROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShwYXJlbnROb2RlKTsKLQkJCUlDU1NOb2RlIG5leHQgPSBudWxsOwotCQkJaWYgKHBhcmVudE5vZGUuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJZm9yIChJQ1NTTm9kZSBjaGlsZCA9IHRhcmdldE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyICYmIG9mZnNldCA8ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCQkJbmV4dCA9IGNoaWxkOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmQ3JlYXRpb25Db250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCi0JCQlyZXR1cm4gdGFyZ2V0Tm9kZTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0U3R5bGVEZWNsYXJhdGlvbkl0ZW0oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2NSZWdpb24pIHsKLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgcGFyZW50ID0gbnVsbDsKLQkJQ1NTTm9kZUltcGwgbm9kZSA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1J1bGVEZWNsQ29udGFpbmVyKSB7Ci0JCQlDU1NSdWxlRGVjbENvbnRhaW5lciBkZWNsQ29udGFpbmVyID0gKENTU1J1bGVEZWNsQ29udGFpbmVyKSBub2RlOwotCQkJcGFyZW50ID0gKENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKSBkZWNsQ29udGFpbmVyLmdldFN0eWxlKCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKSB7Ci0JCQlwYXJlbnQgPSAoQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwpIG5vZGU7Ci0JCX0KLQotCQlDU1NEZWNsYXJhdGlvbkl0ZW1QYXJzZXIgaXRlbVBhcnNlciA9IG5ldyBDU1NEZWNsYXJhdGlvbkl0ZW1QYXJzZXIocGFyZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCWl0ZW1QYXJzZXIuc2V0U3RydWN0dXJlZERvY3VtZW50VGVtcG9yYXJ5KGZhbHNlKTsKLQkJaXRlbVBhcnNlci5zZXRVcGRhdGVDb250ZXh0KGZVcGRhdGVDb250ZXh0KTsKLQkJQ1NTU3R5bGVEZWNsSXRlbUltcGwgZGVjbEl0ZW0gPSBpdGVtUGFyc2VyLnNldHVwRGVjbGFyYXRpb25JdGVtKGRvY1JlZ2lvbik7Ci0JCWlmIChkZWNsSXRlbSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIHNldHVwIGZsYXQgY29udGFpbmVyCi0JCWRlY2xJdGVtLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY1JlZ2lvbiwgZG9jUmVnaW9uKTsKLQotCQkvLyBpbnNlcnQgdG8gdHJlZQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCXByb3BhZ2F0ZVJhbmdlUHJlSW5zZXJ0KHBhcmVudCwgZGVjbEl0ZW0pOwotCQkJQ1NTTm9kZUltcGwgbmV4dCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKGRlY2xJdGVtLCBuZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZChkZWNsSXRlbSk7Ci0JCQl9Ci0JCX0KLQotCQlmQ3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUoZGVjbEl0ZW0pOwotCQkvLyBUYXJnZXROZXh0IGlzIHNldCB0byBudWxsIGF1dG9tYXRpY2FsbHkKLQotCQlyZXR1cm4gZGVjbEl0ZW07Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRTdHlsZVJ1bGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBicmFjZU5vZGUpIHsKLQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCWlmICghZlBhcnNlRmxvYXRpbmcgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBJQ1NTUnVsZUNvbnRhaW5lcikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gZ2V0IHNlbGVjdG9yIHJlZ2lvbnMKLQkJSVRleHRSZWdpb25MaXN0IHNlbGVjdG9yUmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoZmxhdE5vZGUuZ2V0UmVnaW9ucygpKTsKLQkJQ1NTVXRpbC5zdHJpcFN1cnJvdW5kaW5nU3BhY2Uoc2VsZWN0b3JSZWdpb25zKTsKLQotCQlDU1NTdHlsZVJ1bGVJbXBsIHJ1bGUgPSBmRmVlZGVyLmdldENTU1N0eWxlUnVsZSgpOwotCQlpZiAocnVsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJU3RyaW5nIHNlbGVjdG9yU3RyID0gQ1NTVXRpbC5nZXRSZWdpb25UZXh0KGZsYXROb2RlLCBzZWxlY3RvclJlZ2lvbnMpOwotCQkJaWYgKHNlbGVjdG9yU3RyICE9IG51bGwgJiYgMCA8IHNlbGVjdG9yU3RyLmxlbmd0aCgpKSB7Ci0JCQkJcnVsZS5zZXRTZWxlY3RvclRleHQoc2VsZWN0b3JTdHIpOwotCQkJfQotCQl9Ci0KLQkJLy8gc2V0dXAgZmxhdCBjb250YWluZXIKLQkJcnVsZS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSwgYnJhY2VOb2RlKTsKLQkJQ1NTQXR0ckltcGwgYXR0ciA9IHJ1bGUuZ2V0QXR0cmlidXRlTm9kZShJQ1NTUGFnZVJ1bGUuU0VMRUNUT1IpOwotCQlpZiAoYXR0ciAhPSBudWxsICYmIHNlbGVjdG9yUmVnaW9ucyAhPSBudWxsICYmICFzZWxlY3RvclJlZ2lvbnMuaXNFbXB0eSgpKSB7Ci0JCQlhdHRyLnNldFJhbmdlUmVnaW9uKGZsYXROb2RlLCBzZWxlY3RvclJlZ2lvbnMuZ2V0KDApLCBzZWxlY3RvclJlZ2lvbnMuZ2V0KHNlbGVjdG9yUmVnaW9ucy5zaXplKCkgLSAxKSk7Ci0JCX0KLQotCQkvLyBpbnNlcnQgdG8gdHJlZQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXByb3BhZ2F0ZVJhbmdlUHJlSW5zZXJ0KHBhcmVudCwgcnVsZSk7Ci0JCQlDU1NOb2RlSW1wbCBuZXh0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUocnVsZSwgbmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQocnVsZSk7Ci0JCQl9Ci0JCX0KLQotCQlmQ3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUocnVsZSk7Ci0JCS8vIFRhcmdldE5leHQgaXMgc2V0IHRvIG51bGwgYXV0b21hdGljYWxseQotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBwcmV0ZW5kUmVtb3ZlTm9kZSgpIHsKLQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIG5vZGUgPSAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmVXBkYXRlQ29udGV4dC5nZXREZWxldGlvblRhcmdldCgpOwotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZpcnN0Tm9kZSAhPSBudWxsKSB7Ci0JCQlmRGVsZXRpb25Db250ZXh0LmV4cGFuZFJlbW92ZWRSYW5nZUJlZ2luKGZpcnN0Tm9kZSk7Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IG5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJZkRlbGV0aW9uQ29udGV4dC5leHBhbmRSZW1vdmVkUmFuZ2VFbmQobGFzdE5vZGUpOwotCQl9Ci0KLQkJc2hyaW5rQ29udGFpbmVyKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZVcGRhdGVDb250ZXh0LmdldERlbGV0aW9uVGFyZ2V0UGFyZW50KCksIG5vZGUpOwotCX0KLQotCS8qKgotCSAqCWN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKiBAcGFyYW0gY2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb3BhZ2F0ZVJhbmdlUHJlSW5zZXJ0KENTU05vZGVJbXBsIHBhcmVudCwgQ1NTTm9kZUltcGwgY2hpbGQpIHsKLQkJaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHx8ICEocGFyZW50IGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHBhcmVudENvbnRhaW5lciA9IChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHBhcmVudDsKLQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNoaWxkQ29udGFpbmVyID0gKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgY2hpbGQ7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gY2hpbGRDb250YWluZXIuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IGNoaWxkQ29udGFpbmVyLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZpcnN0Tm9kZSA9PSBudWxsIHx8IGxhc3ROb2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWJvb2xlYW4gYk1vZGlmaWVkID0gcGFyZW50Q29udGFpbmVyLmluY2x1ZGVSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmaXJzdE5vZGUsIGxhc3ROb2RlKTsKLQkJaWYgKGJNb2RpZmllZCkgewotCQkJcGFyZW50Q29udGFpbmVyLnByb3BhZ2F0ZVJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJU3RyaW5nIHR5cGUgPSBDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJZG8gewotCQkJCWZsYXROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5nZXRQcmV2Tm9kZShmbGF0Tm9kZSk7Ci0JCQkJdHlwZSA9IChmbGF0Tm9kZSAhPSBudWxsKSA/IENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShmbGF0Tm9kZSkgOiBudWxsOwotCQkJfQotCQkJd2hpbGUgKHR5cGUgIT0gbnVsbCAmJiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSk7Ci0JCX0KLQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGlmIChmRGVsZXRpb25Db250ZXh0LmlzSW5SZW1vdmVkUmFuZ2UoZmxhdE5vZGUpKSB7IC8vIGFscmVhZHkKLQkJLy8gcmVtb3ZlZAotCQkvLyByZXR1cm47Ci0JCS8vIH0KLQotCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgbm9kZSA9IGZEZWxldGlvbkNvbnRleHQuZmluZERlbGV0aW9uVGFyZ2V0KChDU1NOb2RlSW1wbClmRG9jdW1lbnQsIGZsYXROb2RlKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBub2RlID09IGZEb2N1bWVudCkgewotCQkJcmV0dXJuOyAvLyBub3QgYXR0YWNoZWQgd2l0aCBhbnkgdHJlZU5vZGUKLQkJfQotCi0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwpIHsKLQkJCUlDU1NOb2RlIHJ1bGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChydWxlIGluc3RhbmNlb2YgQ1NTU3R5bGVSdWxlSW1wbCkgewotCQkJCW5vZGUgPSAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBydWxlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLy8gSUNTU05vZGUgcCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkvLyBpZiAocCA9PSBudWxsIHx8ICEgKHAgaW5zdGFuY2VvZgotCQkvLyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpKSB7Ci0JCS8vIHJldHVybjsKLQkJLy8gfQotCQkvLyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgcGFyZW50ID0KLQkJLy8gKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcilwOwotCi0JCWlmIChmRGVsZXRpb25Db250ZXh0LmFkZE5vZGVUb0JlUmVtb3ZlZChub2RlKSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmlyc3ROb2RlICE9IG51bGwpIHsKLQkJCQlmRGVsZXRpb25Db250ZXh0LmV4cGFuZFJlbW92ZWRSYW5nZUJlZ2luKGZpcnN0Tm9kZSk7Ci0JCQl9Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gbm9kZS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCWZEZWxldGlvbkNvbnRleHQuZXhwYW5kUmVtb3ZlZFJhbmdlRW5kKGxhc3ROb2RlKTsKLQkJCX0KLQkJfQotCi0JCS8vIHNocmlua0NvbnRhaW5lcihub2RlKTsKLQkJLy8gcGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcykgewotCQlmb3IgKEVudW1lcmF0aW9uIGUgPSBmbGF0Tm9kZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCX0KLQotCQlJdGVyYXRvciBpID0gZkRlbGV0aW9uQ29udGV4dC5nZXROb2Rlc1RvQmVSZW1vdmVkKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTTm9kZUltcGwgbm9kZSA9IChDU1NOb2RlSW1wbCkgaS5uZXh0KCk7Ci0JCQlpZiAoIShub2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gKENTU05vZGVJbXBsKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCWlmICghKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXNocmlua0NvbnRhaW5lcigoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQsIChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIG5vZGUpOwotCQkJcGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCByZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKSB7Ci0JCWlmIChmRG9jdW1lbnQgPT0gbnVsbCB8fCBmQ3JlYXRpb25Db250ZXh0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwgJiYgMCA8IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZ2V0TGVuZ3RoKCkpIHsKLQkJCXNldHVwRGVsZXRpb25Db250ZXh0KG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCQkJc2hvcnQgdXBkYXRlTW9kZSA9IGZVcGRhdGVDb250ZXh0LmdldFVwZGF0ZU1vZGUoKTsKLQkJCWlmICh1cGRhdGVNb2RlID09IENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfSURMRSkgewotCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwcmV0ZW5kUmVtb3ZlTm9kZSgpOwotCQkJfQotCQkJbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QoZkRlbGV0aW9uQ29udGV4dC5nZXRSZW1vdmVkUmFuZ2VCZWdpbigpLCBmRGVsZXRpb25Db250ZXh0LmdldFJlbW92ZWRSYW5nZUVuZCgpKTsKLQkJCWNsZWFudXBEZWxldGlvbkNvbnRleHQoKTsKLQkJfQotCi0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwgJiYgMCA8IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZ2V0TGVuZ3RoKCkpIHsKLQkJCXNldHVwQ3JlYXRpb25Db250ZXh0KG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbSgwKSk7Ci0JCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCQl9Ci0KLQkJLy8gbWFrZSBkb2N1bWVudCBob2xkIHdob2xlIHN0cnVjdHVyZWREb2N1bWVudAotCQkvKgotCQkgKiBib29sZWFuIGJVcGRhdGUgPSBmYWxzZTsgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZTsKLQkJICogZmxhdE5vZGUgPSBmRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsgYlVwZGF0ZSA9Ci0JCSAqIGJVcGRhdGUgfHwgKGZsYXROb2RlID09IG51bGwgfHwKLQkJICogZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5pc09sZE5vZGUoZmxhdE5vZGUpIHx8Ci0JCSAqIGZsYXROb2RlLmdldFByZXZpb3VzKCkgIT0gbnVsbCk7IGZsYXROb2RlID0KLQkJICogZkRvY3VtZW50LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsgYlVwZGF0ZSA9IGJVcGRhdGUgfHwKLQkJICogKGZsYXROb2RlID09IG51bGwgfHwgZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5pc09sZE5vZGUoZmxhdE5vZGUpIHx8Ci0JCSAqIGZsYXROb2RlLmdldE5leHQoKSAhPSBudWxsKTsKLQkJICovCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpZkRvY3VtZW50KS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgc3RydWN0dXJlZERvY3VtZW50LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCS8qIH0gKi8KLQotCQkvLyByZW1vdmUgaW4gb2ZmaWNpYWwgcmVsZWFzZQotCQkvLyBDU1NNb2RlbFV0aWwuZGlhZ25vc2VUcmVlKGZEb2N1bWVudCwKLQkJLy8gZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCByZXBsYWNlUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucywgSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobmV3UmVnaW9ucyA9PSBudWxsIHx8IG9sZFJlZ2lvbnMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChmRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXRDcmVhdGlvblRhcmdldChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwgfHwgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgPD0gMCkgewotCQkJLy8gdG9wIG9mIGRvY3VtZW50Ci0JCQlmQ3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUoZkRvY3VtZW50KTsKLQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0TmV4dE5vZGUoZkRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgY3Vyc29yUG9zID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCUNTU05vZGVJbXBsIGN1cnNvck5vZGUgPSBnZXROb2RlQXQoY3Vyc29yUG9zKTsKLQkJaWYgKGN1cnNvck5vZGUgPT0gbnVsbCkgeyAvLyBlbmQgb2YgZG9jdW1lbnQKLQkJCWN1cnNvck5vZGUgPSAoQ1NTTm9kZUltcGwpZkRvY3VtZW50OwotCQl9Ci0KLQkJLy8gZmluZCBlZGdlIG9mIHRyZWUgbm9kZQotCQlDU1NOb2RlSW1wbCBub2RlID0gbnVsbDsKLQkJLy8gYm9vbGVhbiBiT3ZlclNlbWlDb2xvbiA9IGZhbHNlOwotCQlib29sZWFuIGJPdmVyT3BlbkJyYWNlID0gZmFsc2U7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGU7Ci0JCWZvciAoZmxhdE5vZGUgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247IGZsYXROb2RlICE9IG51bGw7IGZsYXROb2RlID0gZmxhdE5vZGUuZ2V0UHJldmlvdXMoKSkgewotCQkJbm9kZSA9IGdldE5vZGVBdChmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCWlmIChub2RlID09IG51bGwpIHsKLQkJCQlub2RlID0gKENTU05vZGVJbXBsKWZEb2N1bWVudDsKLQkJCX0KLQkJCWlmIChub2RlICE9IGN1cnNvck5vZGUgfHwgbm9kZS5nZXRTdGFydE9mZnNldCgpID09IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChmbGF0Tm9kZSAhPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQlTdHJpbmcgdHlwZSA9IENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCQkJLy8gaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fAotCQkJCS8vIHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJCS8vIGJPdmVyU2VtaUNvbG9uID0gdHJ1ZTsKLQkJCQkvLyB9IGVsc2UKLQkJCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQkJCWJPdmVyT3BlbkJyYWNlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlDU1NOb2RlSW1wbCB0YXJnZXROb2RlID0gbnVsbDsKLQotCQkvLyBpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkvLyB2PC0tfAotCQkvLyBBQUFBQUEKLQkJLy8gQkJCQkJCQkJCQiBjdXJzb3JOb2RlOkEgLCBub2RlOkIgLT4gdGFyZ2V0IGlzIEEKLQkJLy8gdGFyZ2V0Tm9kZSA9IChub2RlID09IG51bGwpID8gZkRvY3VtZW50IDogbm9kZTsKLQkJLy8gfSBlbHNlCi0JCWlmIChjdXJzb3JOb2RlID09IG5vZGUpIHsKLQkJCS8vIHY8LS18Ci0JCQkvLyBBQUFBQUEKLQkJCS8vIEJCQkJCQkJCQkIgY3Vyc29yTm9kZTpBICwgbm9kZTpCIC0+IHRhcmdldCBpcyBBCi0JCQlpZiAoYk92ZXJPcGVuQnJhY2UgJiYgY3Vyc29yTm9kZSBpbnN0YW5jZW9mIENTU1J1bGVEZWNsQ29udGFpbmVyKSB7Ci0JCQkJdGFyZ2V0Tm9kZSA9IChDU1NOb2RlSW1wbCkgKChDU1NSdWxlRGVjbENvbnRhaW5lcikgY3Vyc29yTm9kZSkuZ2V0U3R5bGUoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRhcmdldE5vZGUgPSBjdXJzb3JOb2RlOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gdjwtLXwKLQkJCS8vIEFBQQotCQkJLy8gQkJCQkJCQkJCQiBjdXJzb3JOb2RlOkIgLCBub2RlOkEgLT4gZGVwZW5kIG9uIEEncyBub2RlIHR5cGUKLQkJCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJaWYgKG5vZGVUeXBlID09IElDU1NOb2RlLlNUWUxFREVDTElURU1fTk9ERSB8fCBub2RlVHlwZSA9PSBJQ1NTTm9kZS5DSEFSU0VUUlVMRV9OT0RFIHx8IG5vZGVUeXBlID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSkgewotCQkJCS8vIHRhcmdldE5vZGUgPSAoQ1NTTm9kZUltcGwpKChiT3ZlclNlbWlDb2xvbikgPwotCQkJCS8vIG5vZGUuZ2V0UGFyZW50Tm9kZSgpIDogbm9kZSk7IC8vIE5QCi0JCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQkJCWlmIChyZWdpb25UeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgcmVnaW9uVHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQkJCXRhcmdldE5vZGUgPSAoQ1NTTm9kZUltcGwpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGFyZ2V0Tm9kZSA9IG5vZGU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGZsYXROb2RlKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQkJdGFyZ2V0Tm9kZSA9IChDU1NOb2RlSW1wbCkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0YXJnZXROb2RlID0gbm9kZTsKLQkJCX0KLQkJfQotCi0JCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZSh0YXJnZXROb2RlKTsKLQkJSUNTU05vZGUgbmV4dCA9IG51bGw7Ci0JCWlmICh0YXJnZXROb2RlLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJZm9yIChJQ1NTTm9kZSBjaGlsZCA9IHRhcmdldE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgJiYgY3Vyc29yUG9zIDwgKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCW5leHQgPSBjaGlsZDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZDcmVhdGlvbkNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXRSZXBhcnNlUmFuZ2UoKSB7Ci0JCWZDcmVhdGlvbkNvbnRleHQuY2xlYXIoKTsKLQl9Ci0KLQl2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyID09IG51bGwpIHsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyKCk7Ci0JCX0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5pbml0aWFsaXplKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiByZWdpb25zOiBzdXJyb3VuZGluZyBzcGFjZXMgc2hvdWxkIGJlIHJlbW92ZWQuIFEuIFdoeSBkaWQgeW91IHNldAotCSAqIG1lZGlhVGFibGUgPyBBLiBNZWRpYUxpc3QgbWF5IGhhdmUgdHdvIG9yIG1vcmUgbWVkaXVtIHRoYXQgaGF2ZSBzYW1lCi0JICogdmFsdWUsIHRoZW4gc2VhcmNpbmcgaW4gTWVkaWFMaXN0IGlzIG5vdCBwZXJmZWN0LiBRLgotCSAqIGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkgaXMgbm90IGNhcmUuIEFyZSB5b3UgT0s/IEEuIE9LLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRNZWRpYUxpc3QoTWVkaWFMaXN0SW1wbCBtZWRpYUxpc3QsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBJVGV4dFJlZ2lvbkxpc3QgdGV4dFJlZ2lvbnMpIHsKLQkJaWYgKG1lZGlhTGlzdCA9PSBudWxsIHx8IHRleHRSZWdpb25zID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlDb2xsZWN0aW9uIG1lZGlhVGFibGUgPSBuZXcgSGFzaFNldCgpOwotCQlDU1NOb2RlTGlzdEltcGwgYXR0cnMgPSBtZWRpYUxpc3QuZ2V0TWVkaWEoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgIT0gYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJbWVkaWFUYWJsZS5hZGQoYXR0cnMuaXRlbShpKSk7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiBzdGFydCA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIGVuZCA9IG51bGw7Ci0KLQkJSXRlcmF0b3IgaSA9IHRleHRSZWdpb25zLml0ZXJhdG9yKCk7Ci0JCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSAoSVRleHRSZWdpb24pICgoaS5oYXNOZXh0KCkpID8gaS5uZXh0KCkgOiBudWxsKTsKLQkJd2hpbGUgKHRleHRSZWdpb24gIT0gbnVsbCkgewotCQkJaWYgKHRleHRSZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJVU0pIHsKLQkJCQlTdHJpbmcgbWVkaXVtU3RyID0gcmVnaW9uLmdldFRleHQodGV4dFJlZ2lvbik7Ci0JCQkJaWYgKDAgPCBtZWRpdW1TdHIubGVuZ3RoKCkpIHsKLQkJCQkJQ1NTQXR0ckltcGwgYXR0ciA9IG51bGw7Ci0JCQkJCS8vIGlzIHRoZSBtZWRpdW0gYWxyZWFkeSBzZXQgPwotCQkJCQlJdGVyYXRvciBpVGFibGUgPSBtZWRpYVRhYmxlLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpVGFibGUuaGFzTmV4dCgpKSB7Ci0JCQkJCQlDU1NBdHRySW1wbCBjYWkgPSAoQ1NTQXR0ckltcGwpIGlUYWJsZS5uZXh0KCk7Ci0JCQkJCQlpZiAobWVkaXVtU3RyLmVxdWFsc0lnbm9yZUNhc2UoY2FpLmdldFZhbHVlKCkpKSB7Ci0JCQkJCQkJYXR0ciA9IGNhaTsKLQkJCQkJCQltZWRpYVRhYmxlLnJlbW92ZShjYWkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChhdHRyID09IG51bGwpIHsKLQkJCQkJCS8vIGlzIG5vdCBzZXQuIGNyZWF0ZSBuZXcgYXR0cmlidXRlCi0JCQkJCQlTdHJpbmcga2V5ID0gIm1lZGl1bVAiICsgbWVkaWFMaXN0Lm1lZGl1bUNvdW50ZXIrKzsgLy8kTk9OLU5MUy0xJAotCQkJCQkJbWVkaWFMaXN0LnNldEF0dHJpYnV0ZShrZXksIG1lZGl1bVN0cik7Ci0JCQkJCQlhdHRyID0gbWVkaWFMaXN0LmdldEF0dHJpYnV0ZU5vZGUoa2V5KTsKLQkJCQkJfQotCQkJCQlhdHRyLnNldFJhbmdlUmVnaW9uKHJlZ2lvbiwgdGV4dFJlZ2lvbiwgdGV4dFJlZ2lvbik7Ci0JCQkJCWlmIChzdGFydCA9PSBudWxsKSB7Ci0JCQkJCQlzdGFydCA9IHRleHRSZWdpb247Ci0JCQkJCX0KLQkJCQkJZW5kID0gdGV4dFJlZ2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCQl0ZXh0UmVnaW9uID0gKElUZXh0UmVnaW9uKSAoKGkuaGFzTmV4dCgpKSA/IGkubmV4dCgpIDogbnVsbCk7Ci0JCX0KLQotCQlpZiAoc3RhcnQgIT0gbnVsbCAmJiBlbmQgIT0gbnVsbCkgewotCQkJbWVkaWFMaXN0LnNldFJhbmdlUmVnaW9uKHJlZ2lvbiwgc3RhcnQsIGVuZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0dXBDcmVhdGlvbkNvbnRleHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJcmVzZXRSZXBhcnNlUmFuZ2UoKTsKLQkJcmVzZXRDcmVhdGlvblRhcmdldChyZWdpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXR1cERlbGV0aW9uQ29udGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKSB7Ci0JCWZEZWxldGlvbkNvbnRleHQuc2V0dXBDb250ZXh0KG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0dXBVcGRhdGVDb250ZXh0KHNob3J0IHVwZGF0ZU1vZGUsIElDU1NOb2RlIHBhcmVudE5vZGUsIElDU1NOb2RlIHRhcmdldE5vZGUpIHsKLQkJZlVwZGF0ZUNvbnRleHQuc2V0dXBDb250ZXh0KHVwZGF0ZU1vZGUsIHBhcmVudE5vZGUsIHRhcmdldE5vZGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2hyaW5rQ29udGFpbmVyKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBwYXJlbnQsIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYm9vbGVhbiBiTW9kaWZpZWQgPSBmYWxzZTsKLQkJYk1vZGlmaWVkID0gYk1vZGlmaWVkIHx8IGNsZWFudXBMYXN0Tm9kZShjaGlsZC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCksIHBhcmVudCk7Ci0JCWJNb2RpZmllZCA9IGJNb2RpZmllZCB8fCBjbGVhbnVwRmlyc3ROb2RlKGNoaWxkLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCksIHBhcmVudCk7Ci0KLQkJaWYgKGJNb2RpZmllZCkgewotCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJZm9yIChJQ1NTTm9kZSBub2RlID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCWlmIChjaGlsZCAhPSBub2RlICYmIG5vZGUgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJCSgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBub2RlKS5wcm9wYWdhdGVSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJY2hpbGQuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCwgbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFVwZGF0ZUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxVcGRhdGVDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZjRlOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFVwZGF0ZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQWJzdHJhY3RDc3NUcmF2ZXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU01vZGVsVXBkYXRlQ29udGV4dCB7Ci0KLQotCWNsYXNzIENTU05vZGVVcGRhdGVUcmF2ZXJzZXIgZXh0ZW5kcyBBYnN0cmFjdENzc1RyYXZlcnNlciB7Ci0JCXB1YmxpYyBDU1NOb2RlVXBkYXRlVHJhdmVyc2VyKCkgewotCQkJc3VwZXIoKTsKLQkJCXNldFRyYXZlcnNlSW1wb3J0ZWQoZmFsc2UpOwotCQkJc2V0VHJhdmVyc2VJbXBvcnRGaXJzdChmYWxzZSk7Ci0JCX0KLQotCQlwdWJsaWMgTGlua2VkTGlzdCBnZXROb2RlTGlzdCgpIHsKLQkJCXJldHVybiBmVHJhdk5vZGVMaXN0OwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgYmVnaW4oSUNTU05vZGUgbm9kZSkgewotCQkJZlRyYXZOb2RlTGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb25JbXBsIHx8IG5vZGUgaW5zdGFuY2VvZiBDU1NBdHRySW1wbCB8fCBub2RlIGluc3RhbmNlb2YgTWVkaWFMaXN0SW1wbCkgewotCQkJCS8vIHNraXAKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZUcmF2Tm9kZUxpc3QuYWRkKG5vZGUpOwotCQkJfQotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NQcmltaXRpdmVDb250YWluZXIpIHsKLQkJCQlyZXR1cm4gVFJBVl9QUlVORTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBUUkFWX0NPTlQ7Ci0JCQl9Ci0JCX0KLQotCQlMaW5rZWRMaXN0IGZUcmF2Tm9kZUxpc3QgPSBudWxsOwotCX0KLQotCUlDU1NOb2RlIGZMYXN0Tm9kZSA9IG51bGw7Ci0JSUNTU05vZGUgZkRlbGV0aW9uVGFyZ2V0UGFyZW50ID0gbnVsbDsKLQlJQ1NTTm9kZSBmRGVsZXRpb25UYXJnZXQgPSBudWxsOwotCUxpbmtlZExpc3QgZk5vZGVMaXN0ID0gbnVsbDsKLQlwcml2YXRlIHNob3J0IGZVcGRhdGVNb2RlID0gVVBEQVRFX0lETEU7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IFVQREFURV9JRExFID0gMDsKLQlzdGF0aWMgZmluYWwgc2hvcnQgVVBEQVRFX0lOU0VSVF9GTkNPTlRBSU5FUiA9IDE7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IFVQREFURV9JTlNFUlRfUkNPTlRBSU5FUiA9IDI7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IFVQREFURV9SRU1PVkVfRk5DT05UQUlORVIgPSAzOwotCXN0YXRpYyBmaW5hbCBzaG9ydCBVUERBVEVfUkVNT1ZFX1JDT05UQUlORVIgPSA0OwotCXN0YXRpYyBmaW5hbCBzaG9ydCBVUERBVEVfQ0hBTkdFX1JDT05UQUlORVIgPSA1OwotCi0JLyoqCi0JICogQ1NTTm9kZVVwZGF0ZVF1ZXVlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTTW9kZWxVcGRhdGVDb250ZXh0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgY2xlYW51cENvbnRleHQoKSB7Ci0JCWZOb2RlTGlzdCA9IG51bGw7Ci0JCWZEZWxldGlvblRhcmdldCA9IG51bGw7Ci0JCWZEZWxldGlvblRhcmdldFBhcmVudCA9IG51bGw7Ci0JCWZVcGRhdGVNb2RlID0gVVBEQVRFX0lETEU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ291bnRlckltcGwgZ2V0Q291bnRlcigpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDb3VudGVySW1wbCkgewotCQkJcmV0dXJuIChDb3VudGVySW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNvdW50ZXJJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NDaGFyc2V0UnVsZUltcGwgZ2V0Q1NTQ2hhcnNldFJ1bGUoKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTQ2hhcnNldFJ1bGVJbXBsKSB7Ci0JCQlyZXR1cm4gKENTU0NoYXJzZXRSdWxlSW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU0NoYXJzZXRSdWxlSW1wbCBpcyBleHBlY3RlZCwgYnV0ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsKLQkJCXVuZ2V0Tm9kZSgpOwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTRm9udEZhY2VSdWxlSW1wbCBnZXRDU1NGb250RmFjZVJ1bGUoKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlSW1wbCkgewotCQkJcmV0dXJuIChDU1NGb250RmFjZVJ1bGVJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ1NTRm9udEZhY2VSdWxlSW1wbCBpcyBleHBlY3RlZCwgYnV0ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsKLQkJCXVuZ2V0Tm9kZSgpOwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTSW1wb3J0UnVsZUltcGwgZ2V0Q1NTSW1wb3J0UnVsZSgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NJbXBvcnRSdWxlSW1wbCkgewotCQkJcmV0dXJuIChDU1NJbXBvcnRSdWxlSW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU0ltcG9ydFJ1bGVJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NNZWRpYVJ1bGVJbXBsIGdldENTU01lZGlhUnVsZSgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NNZWRpYVJ1bGVJbXBsKSB7Ci0JCQlyZXR1cm4gKENTU01lZGlhUnVsZUltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NNZWRpYVJ1bGVJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NQYWdlUnVsZUltcGwgZ2V0Q1NTUGFnZVJ1bGUoKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUGFnZVJ1bGVJbXBsKSB7Ci0JCQlyZXR1cm4gKENTU1BhZ2VSdWxlSW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU1BhZ2VSdWxlSW1wbCBpcyBleHBlY3RlZCwgYnV0ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsKLQkJCXVuZ2V0Tm9kZSgpOwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGdldENTU1ByaW1pdGl2ZVZhbHVlKHNob3J0IHR5cGUpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NQcmltaXRpdmVWYWx1ZUltcGwpIHsKLQkJCXNob3J0IG5vZGVUeXBlID0gKChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIG5vZGUpLmdldFByaW1pdGl2ZVR5cGUoKTsKLQkJCWlmIChub2RlVHlwZSA9PSB0eXBlIHx8ICgobm9kZVR5cGUgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX05VTUJFUiB8fCBub2RlVHlwZSA9PSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOVEVHRVIpICYmICh0eXBlID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19OVU1CRVIgfHwgdHlwZSA9PSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOVEVHRVIpKSkgewotCQkJCXJldHVybiAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBub2RlOwotCQkJfQotCQl9Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NQcmltaXRpdmVWYWx1ZUltcGwpIHsKLQkJCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIG5vZGU7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NQcmltaXRpdmVWYWx1ZUltcGwgWyIgKyB0eXBlICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJIl0gaXMgZXhwZWN0ZWQsIGJ1dCB0eXBlIGlzIFsiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdmFsdWUuZ2V0UHJpbWl0aXZlVHlwZSgpICsgIl06IFwiIiArIHZhbHVlLmdlbmVyYXRlU291cmNlKCkgKyAiXCIiKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKCIgKyB0eXBlICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJIikgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCX0KLQotCQl1bmdldE5vZGUoKTsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCBnZXRDU1NQcmltaXRpdmVWYWx1ZUFueSgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NQcmltaXRpdmVWYWx1ZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NTdHlsZURlY2xJdGVtSW1wbCBnZXRDU1NTdHlsZURlY2xJdGVtKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xJdGVtSW1wbCAmJiAoKENTU1N0eWxlRGVjbEl0ZW1JbXBsKSBub2RlKS5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiAoQ1NTU3R5bGVEZWNsSXRlbUltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NTdHlsZURlY2xJdGVtSW1wbCgiICsgcHJvcGVydHlOYW1lICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJIikgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ly8kTk9OLU5MUy0xJAotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NTdHlsZVJ1bGVJbXBsIGdldENTU1N0eWxlUnVsZSgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZVJ1bGVJbXBsKSB7Ci0JCQlyZXR1cm4gKENTU1N0eWxlUnVsZUltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NTdHlsZVJ1bGVJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICovCi0JSUNTU05vZGUgZ2V0RGVsZXRpb25UYXJnZXQoKSB7Ci0JCXJldHVybiBmRGVsZXRpb25UYXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqLwotCUlDU1NOb2RlIGdldERlbGV0aW9uVGFyZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gZkRlbGV0aW9uVGFyZ2V0UGFyZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgSUNTU05vZGUgZ2V0Tm9kZSgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IG51bGw7Ci0JCWlmIChmTm9kZUxpc3QgIT0gbnVsbCAmJiAwIDwgZk5vZGVMaXN0LnNpemUoKSkgewotCQkJbm9kZSA9IChJQ1NTTm9kZSkgZk5vZGVMaXN0LnJlbW92ZUZpcnN0KCk7Ci0JCX0KLQkJZkxhc3ROb2RlID0gbm9kZTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGdldE5vZGVDb3VudCgpIHsKLQkJaWYgKGZOb2RlTGlzdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZk5vZGVMaXN0LnNpemUoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCS8vIElDU1NOb2RlIGdldFBhcmVudE5vZGUoKSB7Ci0JLy8gcmV0dXJuIGZQYXJlbnROb2RlOwotCS8vIH0KLQkvKioKLQkgKiAKLQkgKi8KLQlSZWN0SW1wbCBnZXRSZWN0KCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIFJlY3RJbXBsKSB7Ci0JCQlyZXR1cm4gKFJlY3RJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiUmVjdEltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCVJHQkNvbG9ySW1wbCBnZXRSR0JDb2xvcigpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBSR0JDb2xvckltcGwpIHsKLQkJCXJldHVybiAoUkdCQ29sb3JJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiUkdCQ29sb3JJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0Jc2hvcnQgZ2V0VXBkYXRlTW9kZSgpIHsKLQkJcmV0dXJuIGZVcGRhdGVNb2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCXJldHVybiAoZk5vZGVMaXN0ICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0dXBDb250ZXh0KHNob3J0IHVwZGF0ZU1vZGUsIElDU1NOb2RlIHBhcmVudE5vZGUsIElDU1NOb2RlIHRhcmdldE5vZGUpIHsKLQkJZlVwZGF0ZU1vZGUgPSB1cGRhdGVNb2RlOwotCi0JCUlDU1NOb2RlIHRyYXZlcnNlUm9vdDsKLQkJaWYgKHVwZGF0ZU1vZGUgPT0gVVBEQVRFX1JFTU9WRV9SQ09OVEFJTkVSIHx8IHVwZGF0ZU1vZGUgPT0gVVBEQVRFX0lOU0VSVF9SQ09OVEFJTkVSIHx8IHVwZGF0ZU1vZGUgPT0gVVBEQVRFX0NIQU5HRV9SQ09OVEFJTkVSKSB7Ci0JCQl0cmF2ZXJzZVJvb3QgPSBwYXJlbnROb2RlOwotCQkJd2hpbGUgKHRyYXZlcnNlUm9vdCBpbnN0YW5jZW9mIENTU1JlZ2lvbkNvbnRhaW5lcikgewotCQkJCXRyYXZlcnNlUm9vdCA9IHRyYXZlcnNlUm9vdC5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0cmF2ZXJzZVJvb3QgPSB0YXJnZXROb2RlOwotCQl9Ci0KLQkJaWYgKHVwZGF0ZU1vZGUgPT0gVVBEQVRFX1JFTU9WRV9SQ09OVEFJTkVSIHx8IHVwZGF0ZU1vZGUgPT0gVVBEQVRFX0lOU0VSVF9SQ09OVEFJTkVSIHx8IC8vIHJlZ2lvbgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaW5zZXJ0Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyA9PgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gcmVwbGFjZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZmxhdAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbm9kZQotCQkJCQl1cGRhdGVNb2RlID09IFVQREFURV9DSEFOR0VfUkNPTlRBSU5FUiB8fCB1cGRhdGVNb2RlID09IFVQREFURV9SRU1PVkVfRk5DT05UQUlORVIpIHsKLQkJCWZEZWxldGlvblRhcmdldCA9IHRyYXZlcnNlUm9vdDsKLQkJCWlmIChmRGVsZXRpb25UYXJnZXQgPT0gdGFyZ2V0Tm9kZSkgewotCQkJCWZEZWxldGlvblRhcmdldFBhcmVudCA9IHBhcmVudE5vZGU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmRGVsZXRpb25UYXJnZXRQYXJlbnQgPSBmRGVsZXRpb25UYXJnZXQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJZkRlbGV0aW9uVGFyZ2V0ID0gbnVsbDsKLQkJCWZEZWxldGlvblRhcmdldFBhcmVudCA9IG51bGw7Ci0JCX0KLQotCQlpZiAodXBkYXRlTW9kZSA9PSBVUERBVEVfSU5TRVJUX1JDT05UQUlORVIgfHwgdXBkYXRlTW9kZSA9PSBVUERBVEVfSU5TRVJUX0ZOQ09OVEFJTkVSIHx8IHVwZGF0ZU1vZGUgPT0gVVBEQVRFX1JFTU9WRV9SQ09OVEFJTkVSIHx8IC8vIHJlZ2lvbgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyByZW1vdmUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gPT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gcmUtaW5zZXJ0Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZsYXQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbm9kZQotCQkJCQl1cGRhdGVNb2RlID09IFVQREFURV9DSEFOR0VfUkNPTlRBSU5FUikgewotCQkJQ1NTTm9kZVVwZGF0ZVRyYXZlcnNlciB0cmF2ZXJzZXIgPSBuZXcgQ1NTTm9kZVVwZGF0ZVRyYXZlcnNlcigpOwotCQkJdHJhdmVyc2VyLmFwcGx5KHRyYXZlcnNlUm9vdCk7Ci0JCQlmTm9kZUxpc3QgPSB0cmF2ZXJzZXIuZ2V0Tm9kZUxpc3QoKTsKLQkJfQotCQllbHNlIHsKLQkJCWZOb2RlTGlzdCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgdW5nZXROb2RlKCkgewotCQlpZiAoZk5vZGVMaXN0ICE9IG51bGwgJiYgZkxhc3ROb2RlICE9IG51bGwpIHsKLQkJCWZOb2RlTGlzdC5hZGRGaXJzdChmTGFzdE5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFVwZGF0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxVcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MmJjYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFVwZGF0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQXR0ckNoYW5nZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5vQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NNb2RlbFVwZGF0ZXIgewotCi0JcHJpdmF0ZSBDU1NNb2RlbEltcGwgZk1vZGVsID0gbnVsbDsKLQlwcml2YXRlIENTU01vZGVsUGFyc2VyIGZQYXJzZXIgPSBudWxsOwotCi0JLyoqCi0JICogQ1NTTW9kZWxVcGRhdGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTTW9kZWxVcGRhdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU01vZGVsVXBkYXRlcihDU1NNb2RlbEltcGwgbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJZk1vZGVsID0gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXR0ckluc2VydGVkKENTU05vZGVJbXBsIHBhcmVudE5vZGUsIENTU0F0dHJJbXBsIGF0dHIpIHsKLQkJQ1NTU291cmNlR2VuZXJhdG9yIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIocGFyZW50Tm9kZSk7Ci0KLQkJaWYgKGZvcm1hdHRlciA9PSBudWxsKSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDYW5ub3QgZ2V0IGZvcm1hdCBhZGFwdGVyIDogIiArIHBhcmVudE5vZGUuZ2V0Q2xhc3MoKS50b1N0cmluZygpKTsvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlzaG9ydCB1cGRhdGVNb2RlID0gQ1NTTW9kZWxVcGRhdGVDb250ZXh0LlVQREFURV9JTlNFUlRfUkNPTlRBSU5FUjsKLQkJZlBhcnNlci5zZXR1cFVwZGF0ZUNvbnRleHQodXBkYXRlTW9kZSwgcGFyZW50Tm9kZSwgYXR0cik7Ci0KLQkJLy8gZ2V0IGZvcm1hdHRlZCBpbmZvCi0JCUF0dHJDaGFuZ2VDb250ZXh0IHJlZ2lvbiA9IG5ldyBBdHRyQ2hhbmdlQ29udGV4dCgpOwotCQlTdHJpbmcgdGV4dCA9IG5ldyBTdHJpbmcoZm9ybWF0dGVyLmZvcm1hdEF0dHJDaGFuZ2VkKHBhcmVudE5vZGUsIGF0dHIsIHRydWUsIHJlZ2lvbikpOwotCi0JCS8vIHNldCB0ZXh0Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IGluc2VydFRleHQocmVnaW9uLnN0YXJ0LCByZWdpb24uZW5kIC0gcmVnaW9uLnN0YXJ0LCB0ZXh0KTsKLQotCQlpbnQgblJlbWFpbnMgPSBmUGFyc2VyLmNsZWFudXBVcGRhdGVDb250ZXh0KCk7Ci0KLQkJaWYgKDAgPCBuUmVtYWlucyAmJiAhKHJlc3VsdCBpbnN0YW5jZW9mIE5vQ2hhbmdlRXZlbnQpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCQkKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGF0dHJSZW1vdmVkKENTU05vZGVJbXBsIHBhcmVudE5vZGUsIENTU0F0dHJJbXBsIGF0dHIpIHsKLQkJQ1NTU291cmNlR2VuZXJhdG9yIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIocGFyZW50Tm9kZSk7Ci0KLQkJaWYgKGZvcm1hdHRlciA9PSBudWxsKSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDYW5ub3QgZ2V0IGZvcm1hdCBhZGFwdGVyIDogIiArIHBhcmVudE5vZGUuZ2V0Q2xhc3MoKS50b1N0cmluZygpKTsvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlzaG9ydCB1cGRhdGVNb2RlID0gQ1NTTW9kZWxVcGRhdGVDb250ZXh0LlVQREFURV9SRU1PVkVfUkNPTlRBSU5FUjsKLQkJZlBhcnNlci5zZXR1cFVwZGF0ZUNvbnRleHQodXBkYXRlTW9kZSwgcGFyZW50Tm9kZSwgYXR0cik7Ci0KLQkJLy8gZ2V0IGZvcm1hdHRlZCBpbmZvCi0JCUF0dHJDaGFuZ2VDb250ZXh0IHJlZ2lvbiA9IG5ldyBBdHRyQ2hhbmdlQ29udGV4dCgpOwotCQlTdHJpbmcgdGV4dCA9IG5ldyBTdHJpbmcoZm9ybWF0dGVyLmZvcm1hdEF0dHJDaGFuZ2VkKHBhcmVudE5vZGUsIGF0dHIsIGZhbHNlLCByZWdpb24pKTsKLQotCQkvLyBzZXQgdGV4dAotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBpbnNlcnRUZXh0KHJlZ2lvbi5zdGFydCwgcmVnaW9uLmVuZCAtIHJlZ2lvbi5zdGFydCwgdGV4dCk7Ci0KLQkJaW50IG5SZW1haW5zID0gZlBhcnNlci5jbGVhbnVwVXBkYXRlQ29udGV4dCgpOwotCi0JCWlmICgwIDwgblJlbWFpbnMgJiYgIShyZXN1bHQgaW5zdGFuY2VvZiBOb0NoYW5nZUV2ZW50KSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAkJCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGF0dHJSZXBsYWNlZChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NOb2RlSW1wbCBuZXdBdHRyLCBDU1NOb2RlSW1wbCBvbGRBdHRyKSB7Ci0JCWlmIChwYXJlbnROb2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChvbGRBdHRyICE9IG51bGwpIHsKLQkJCWF0dHJSZW1vdmVkKHBhcmVudE5vZGUsIChDU1NBdHRySW1wbCkgb2xkQXR0cik7Ci0JCX0KLQotCQlpZiAobmV3QXR0ciAhPSBudWxsKSB7Ci0JCQlhdHRySW5zZXJ0ZWQocGFyZW50Tm9kZSwgKENTU0F0dHJJbXBsKSBuZXdBdHRyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjaGlsZEluc2VydGVkKENTU05vZGVJbXBsIHBhcmVudE5vZGUsIENTU05vZGVJbXBsIG5vZGUpIHsKLQkJc2hvcnQgdXBkYXRlTW9kZSA9IENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfSURMRTsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJdXBkYXRlTW9kZSA9IENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfSU5TRVJUX0ZOQ09OVEFJTkVSOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSZWdpb25Db250YWluZXIpIHsKLQkJCXVwZGF0ZU1vZGUgPSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX0lOU0VSVF9SQ09OVEFJTkVSOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiV2hhdCdzIHRoaXMgbm9kZT8gOiAiICsgbm9kZS5nZXRDbGFzcygpLnRvU3RyaW5nKCkpOy8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCWZQYXJzZXIuc2V0dXBVcGRhdGVDb250ZXh0KHVwZGF0ZU1vZGUsIHBhcmVudE5vZGUsIG5vZGUpOwotCi0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IGRlZmF1bHRJbnNlcnRlZChwYXJlbnROb2RlLCBub2RlKTsKLQotCQlpbnQgblJlbWFpbnMgPSBmUGFyc2VyLmNsZWFudXBVcGRhdGVDb250ZXh0KCk7Ci0KLQkJaWYgKDAgPCBuUmVtYWlucyAmJiAhKHJlc3VsdCBpbnN0YW5jZW9mIE5vQ2hhbmdlRXZlbnQpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCQkKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjaGlsZFJlbW92ZWQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTTm9kZUltcGwgbm9kZSkgewotCQlzaG9ydCB1cGRhdGVNb2RlID0gQ1NTTW9kZWxVcGRhdGVDb250ZXh0LlVQREFURV9JRExFOwotCi0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQl1cGRhdGVNb2RlID0gQ1NTTW9kZWxVcGRhdGVDb250ZXh0LlVQREFURV9SRU1PVkVfRk5DT05UQUlORVI7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU1JlZ2lvbkNvbnRhaW5lcikgewotCQkJdXBkYXRlTW9kZSA9IENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfUkVNT1ZFX1JDT05UQUlORVI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJXaGF0J3MgdGhpcyBub2RlPyA6ICIgKyBub2RlLmdldENsYXNzKCkudG9TdHJpbmcoKSk7Ly8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZlBhcnNlci5zZXR1cFVwZGF0ZUNvbnRleHQodXBkYXRlTW9kZSwgcGFyZW50Tm9kZSwgbm9kZSk7Ci0KLQkJQ1NTTm9kZUltcGwgcHJldiA9IGdldE9sZFByZXZpb3VzKHBhcmVudE5vZGUsIG5vZGUpOwotCQlDU1NOb2RlSW1wbCBuZXh0ID0gZ2V0T2xkTmV4dChwYXJlbnROb2RlLCBub2RlKTsKLQkJaW50IGluc2VydFBvcyA9IC0xLCBlbmRQb3MgPSAtMTsKLQkJU3RyaW5nIHNvdXJjZSA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJaWYgKHByZXYgIT0gbnVsbCkgewotCQkJaW5zZXJ0UG9zID0gcHJldi5nZXRFbmRPZmZzZXQoKTsKLQkJfQotCQllbHNlIHsKLQkJCWluc2VydFBvcyA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWluc2VydFBvcyAtPSBuZWFyZXN0U3BhY2VMZW5ndGhCZWZvcmUocGFyZW50Tm9kZSwgaW5zZXJ0UG9zKTsKLQkJfQotCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQllbmRQb3MgPSBuZXh0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQllbmRQb3MgPSBub2RlLmdldEVuZE9mZnNldCgpOwotCQkJZW5kUG9zICs9IG5lYXJlc3RTcGFjZUxlbmd0aEFmdGVyKHBhcmVudE5vZGUsIGVuZFBvcyk7Ci0JCX0KLQkJc291cmNlID0gZ2V0U3BhY2VCZWZvcmUocGFyZW50Tm9kZSwgbmV4dCwgbm9kZSk7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdDsKLQkJaWYgKHNvdXJjZS5sZW5ndGgoKSA+IDApIHsKLQkJCXJlc3VsdCA9IGluc2VydFRleHQoaW5zZXJ0UG9zLCBlbmRQb3MgLSBpbnNlcnRQb3MsIHNvdXJjZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSByZW1vdmVUZXh0KGluc2VydFBvcywgZW5kUG9zIC0gaW5zZXJ0UG9zKTsKLQkJfQotCi0JCWludCBuUmVtYWlucyA9IGZQYXJzZXIuY2xlYW51cFVwZGF0ZUNvbnRleHQoKTsKLQotCQlpZiAoMCA8IG5SZW1haW5zICYmICEocmVzdWx0IGluc3RhbmNlb2YgTm9DaGFuZ2VFdmVudCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQJCQotCQl9Ci0KLQkJLyoKLQkJICogaW50IHJlbW92ZVN0YXJ0ID0gLTE7IGludCByZW1vdmVFbmQgPSAtMTsgaWYgKG5vZGUgaW5zdGFuY2VvZgotCQkgKiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJICogQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9Ci0JCSAqIChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpbm9kZTsKLQkJICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPQotCQkgKiBjb250YWluZXIuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9Ci0JCSAqIGNvbnRhaW5lci5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7IGlmIChmaXJzdE5vZGUgIT0gbnVsbCAmJgotCQkgKiBsYXN0Tm9kZSAhPSBudWxsKSB7IHJlbW92ZVN0YXJ0ID0gZmlyc3ROb2RlLmdldFN0YXJ0KCk7IHJlbW92ZUVuZCA9Ci0JCSAqIGxhc3ROb2RlLmdldEVuZCgpOyB9IH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU1JlZ2lvbkNvbnRhaW5lcikgewotCQkgKiBDU1NSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKENTU1JlZ2lvbkNvbnRhaW5lcilub2RlOwotCQkgKiBJVGV4dFJlZ2lvbiBmaXJzdFJlZ2lvbiA9IGNvbnRhaW5lci5nZXRGaXJzdFJlZ2lvbigpOyBJVGV4dFJlZ2lvbgotCQkgKiBsYXN0UmVnaW9uID0gY29udGFpbmVyLmdldExhc3RSZWdpb24oKTsgaWYgKGZpcnN0UmVnaW9uICE9IG51bGwgJiYKLQkJICogbGFzdFJlZ2lvbiAhPSBudWxsKSB7IHJlbW92ZVN0YXJ0ID0gZmlyc3RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJICogcmVtb3ZlRW5kID0gbGFzdFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsgfSB9IGlmICgwIDw9IHJlbW92ZVN0YXJ0ICYmCi0JCSAqIDAgPD0gcmVtb3ZlRW5kKSB7IHJlbW92ZVRleHQocmVtb3ZlU3RhcnQsIHJlbW92ZUVuZCAtIHJlbW92ZVN0YXJ0ICsKLQkJICogMSk7IH0KLQkJICovCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBjaGlsZFJlcGxhY2VkKENTU05vZGVJbXBsIHBhcmVudE5vZGUsIENTU05vZGVJbXBsIG5ld0NoaWxkLCBDU1NOb2RlSW1wbCBvbGRDaGlsZCkgewotCQlpZiAocGFyZW50Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAob2xkQ2hpbGQgIT0gbnVsbCkgewotCQkJY2hpbGRSZW1vdmVkKHBhcmVudE5vZGUsIG9sZENoaWxkKTsKLQkJfQotCi0JCWlmIChuZXdDaGlsZCAhPSBudWxsKSB7Ci0JCQljaGlsZEluc2VydGVkKHBhcmVudE5vZGUsIG5ld0NoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZGVmYXVsdEluc2VydGVkKENTU05vZGVJbXBsIHBhcmVudE5vZGUsIENTU05vZGVJbXBsIG5vZGUpIHsKLQkJaW50IGluc2VydFBvcyA9IC0xOwotCQlJQ1NTTm9kZSBzaWJsaW5nOwotCQlTdHJpbmcgcHJlU3BhY2UgPSAiIiwgcG9zdFNwYWNlID0gIiI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJaW50IGxlbmd0aCA9IDA7Ci0KLQkJaWYgKGluc2VydFBvcyA8IDApIHsKLQkJCWlmICgoc2libGluZyA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkpICE9IG51bGwpIHsKLQkJCQkvLyBhZnRlciBwcmV2aW91cyBjaGlsZAotCQkJCWluc2VydFBvcyA9IGdldFRleHRFbmQoc2libGluZyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaW5zZXJ0UG9zIDwgMCkgewotCQkJaWYgKChzaWJsaW5nID0gbm9kZS5nZXROZXh0U2libGluZygpKSAhPSBudWxsKSB7Ci0JCQkJLy8gYmVmb3JlIG5leHQgY2hpbGQKLQkJCQlpbnNlcnRQb3MgPSBnZXRUZXh0U3RhcnQoc2libGluZyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaW5zZXJ0UG9zIDwgMCkgewotCQkJLy8gcG9zaXRpb24gb2YgcGFyZW50Ci0JCQlpbnNlcnRQb3MgPSBnZXRDaGlsZEluc2VydFBvcyhwYXJlbnROb2RlKTsKLQkJfQotCi0JCWlmIChpbnNlcnRQb3MgPCAwKSB7Ci0JCQkvLyBmaXJzdHRpbWUKLQkJCWluc2VydFBvcyA9IDA7Ci0JCX0KLQotCQkvLyBmb3JtYXQgcHJldmlvdXMgc3BhY2VzCi0JCWxlbmd0aCA9IG5lYXJlc3RTcGFjZUxlbmd0aEJlZm9yZShwYXJlbnROb2RlLCBpbnNlcnRQb3MpOwotCQlpbnNlcnRQb3MgLT0gbGVuZ3RoOwotCQlwcmVTcGFjZSA9IGdldFNwYWNlQmVmb3JlKHBhcmVudE5vZGUsIG5vZGUsIG51bGwpOwotCQkvLyBmb3JtYXQgcG9zdCBzcGFjZXMKLQkJbGVuZ3RoICs9IG5lYXJlc3RTcGFjZUxlbmd0aEFmdGVyKHBhcmVudE5vZGUsIGluc2VydFBvcyArIGxlbmd0aCk7Ci0JCXBvc3RTcGFjZSA9IGdldFNwYWNlQmVmb3JlKHBhcmVudE5vZGUsIG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSwgbnVsbCk7Ci0KLQkJLy8gc2V0IHRleHQKLQkJU3RyaW5nIHRleHQgPSBwcmVTcGFjZSArIG5vZGUuZ2VuZXJhdGVTb3VyY2UoKS50cmltKCkgKyBwb3N0U3BhY2U7Ci0JCXJldHVybiBpbnNlcnRUZXh0KGluc2VydFBvcywgbGVuZ3RoLCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKi8KLQlwcml2YXRlIGludCBnZXRDaGlsZEluc2VydFBvcyhDU1NOb2RlSW1wbCBub2RlKSB7Ci0JCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKG5vZGUpOwotCQlpZiAoZm9ybWF0dGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZm9ybWF0dGVyLmdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQllbHNlCi0JCQlyZXR1cm4gbm9kZS5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBnZXRPbGROZXh0KENTU05vZGVJbXBsIHBhcmVudE5vZGUsIENTU05vZGVJbXBsIG5vZGUpIHsKLQkJQ1NTTm9kZUltcGwgY2hpbGQgPSAoQ1NTTm9kZUltcGwpIHBhcmVudE5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCUNTU05vZGVJbXBsIHJldCA9IG51bGw7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZS5nZXRFbmRPZmZzZXQoKSA8IGNoaWxkLmdldEVuZE9mZnNldCgpKQotCQkJCXJldCA9IGNoaWxkOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQkJY2hpbGQgPSAoQ1NTTm9kZUltcGwpIGNoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgZ2V0T2xkUHJldmlvdXMoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTTm9kZUltcGwgbm9kZSkgewotCQlDU1NOb2RlSW1wbCBjaGlsZCA9IChDU1NOb2RlSW1wbCkgcGFyZW50Tm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCUNTU05vZGVJbXBsIHJldCA9IG51bGw7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0U3RhcnRPZmZzZXQoKSA8IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkKLQkJCQlyZXQgPSBjaGlsZDsKLQkJCWVsc2UKLQkJCQlicmVhazsKLQkJCWNoaWxkID0gKENTU05vZGVJbXBsKSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRTcGFjZUJlZm9yZShJQ1NTTm9kZSBwYXJlbnROb2RlLCBJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSB0b1JlbW92ZSkgewotCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcigoSU5vZGVOb3RpZmllcikgcGFyZW50Tm9kZSk7Ci0KLQkJaWYgKGZvcm1hdHRlciAhPSBudWxsKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24gZXhjZXB0Rm9yID0gbnVsbDsKLQkJCWlmICh0b1JlbW92ZSAhPSBudWxsKSB7Ci0JCQkJQ1NTTm9kZUltcGwgcmVtb3ZlID0gKENTU05vZGVJbXBsKSB0b1JlbW92ZTsKLQkJCQlleGNlcHRGb3IgPSBuZXcgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb24ocmVtb3ZlLmdldFN0YXJ0T2Zmc2V0KCksIHJlbW92ZS5nZXRFbmRPZmZzZXQoKSAtIHJlbW92ZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCX0KLQkJCXJldHVybiBmb3JtYXR0ZXIuZm9ybWF0QmVmb3JlKHBhcmVudE5vZGUsIG5vZGUsIGV4Y2VwdEZvcikudG9TdHJpbmcoKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgaW50IGdldFRleHRFbmQoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgZW5kID0gLTE7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJZW5kID0gKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU1JlZ2lvbkNvbnRhaW5lcikgewotCQkJCWVuZCA9ICgoQ1NTUmVnaW9uQ29udGFpbmVyKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW5kOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgaW50IGdldFRleHRTdGFydChJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBzdGFydCA9IC0xOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCXN0YXJ0ID0gKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJc3RhcnQgPSAoKENTU1JlZ2lvbkNvbnRhaW5lcikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBpbnNlcnRUZXh0KGludCBzdGFydCwgaW50IG9sZExlbmd0aCwgU3RyaW5nIHRleHQpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBmTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKHRleHQgIT0gbnVsbCAmJiAwIDwgb2xkTGVuZ3RoICYmIHN0YXJ0ICsgb2xkTGVuZ3RoIDw9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSkgewotCQkJCS8vIG1pbmltaXplIHRleHQgY2hhbmdlCi0JCQkJU3RyaW5nIGRlbFRleHQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KHN0YXJ0LCBvbGRMZW5ndGgpOwotCQkJCWludCBuZXdMZW5ndGggPSB0ZXh0Lmxlbmd0aCgpOwotCQkJCWludCBzaG9ydGVyTGVuID0gTWF0aC5taW4ob2xkTGVuZ3RoLCBuZXdMZW5ndGgpOwotCQkJCWludCBzdE1hdGNoTGVuOwotCQkJCWZvciAoc3RNYXRjaExlbiA9IDA7IHN0TWF0Y2hMZW4gPCBzaG9ydGVyTGVuICYmIHRleHQuY2hhckF0KHN0TWF0Y2hMZW4pID09IGRlbFRleHQuY2hhckF0KHN0TWF0Y2hMZW4pOyBzdE1hdGNoTGVuKyspIHsKLQkJCQkJLy8gCi0JCQkJfQotCQkJCWlmICgwIDwgc3RNYXRjaExlbiAmJiBzdE1hdGNoTGVuIDwgc2hvcnRlckxlbiAmJiB0ZXh0LmNoYXJBdChzdE1hdGNoTGVuIC0gMSkgPT0gMHgwMDBkICYmICh0ZXh0LmNoYXJBdChzdE1hdGNoTGVuKSA9PSAweDAwMGEgfHwgZGVsVGV4dC5jaGFyQXQoc3RNYXRjaExlbikgPT0gMHgwMDBhKSkgewotCQkJCQkvLyBtdXN0IG5vdCBkaXZpZGUgMGQtPjBhIHNlcXVlbmNlCi0JCQkJCXN0TWF0Y2hMZW4tLTsKLQkJCQl9Ci0JCQkJaWYgKHN0TWF0Y2hMZW4gPT0gc2hvcnRlckxlbikgewotCQkJCQlpZiAob2xkTGVuZ3RoIDwgbmV3TGVuZ3RoKSB7IC8vIGp1c3QgaW5zZXJ0Ci0JCQkJCQlvbGRMZW5ndGggPSAwOwotCQkJCQkJc3RhcnQgKz0gc3RNYXRjaExlbjsKLQkJCQkJCXRleHQgPSB0ZXh0LnN1YnN0cmluZyhzdE1hdGNoTGVuKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChuZXdMZW5ndGggPCBvbGRMZW5ndGgpIHsgLy8ganVzdCByZW1vdmUKLQkJCQkJCW9sZExlbmd0aCAtPSBzdE1hdGNoTGVuOwotCQkJCQkJc3RhcnQgKz0gc3RNYXRjaExlbjsKLQkJCQkJCXRleHQgPSBudWxsOwotCQkJCQl9Ci0JCQkJCWVsc2UgeyAvLyBub3RoaW5nIHRvIGRvCi0JCQkJCQlvbGRMZW5ndGggPSAwOwotCQkJCQkJdGV4dCA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWludCBlZE1hdGNoTGVuOwotCQkJCQlmb3IgKGVkTWF0Y2hMZW4gPSAwOyBzdE1hdGNoTGVuICsgZWRNYXRjaExlbiA8IHNob3J0ZXJMZW4gJiYgdGV4dC5jaGFyQXQobmV3TGVuZ3RoIC0gZWRNYXRjaExlbiAtIDEpID09IGRlbFRleHQuY2hhckF0KG9sZExlbmd0aCAtIGVkTWF0Y2hMZW4gLSAxKTsgZWRNYXRjaExlbisrKSB7Ci0JCQkJCQkvLwotCQkJCQl9Ci0JCQkJCWlmICgwIDwgZWRNYXRjaExlbiAmJiB0ZXh0LmNoYXJBdChuZXdMZW5ndGggLSBlZE1hdGNoTGVuKSA9PSAweDAwMGEgJiYgKChlZE1hdGNoTGVuIDwgbmV3TGVuZ3RoICYmIHRleHQuY2hhckF0KG5ld0xlbmd0aCAtIGVkTWF0Y2hMZW4gLSAxKSA9PSAweDAwMGQpIHx8IChlZE1hdGNoTGVuIDwgb2xkTGVuZ3RoICYmIGRlbFRleHQuY2hhckF0KG9sZExlbmd0aCAtIGVkTWF0Y2hMZW4gLSAxKSA9PSAweDAwMGQpKSkgewotCQkJCQkJLy8gbXVzdCBub3QgZGl2aWRlIDBkLT4wYSBzZXF1ZW5jZQotCQkJCQkJZWRNYXRjaExlbi0tOwotCQkJCQl9Ci0JCQkJCW9sZExlbmd0aCAtPSBzdE1hdGNoTGVuICsgZWRNYXRjaExlbjsKLQkJCQkJc3RhcnQgKz0gc3RNYXRjaExlbjsKLQkJCQkJaWYgKHN0TWF0Y2hMZW4gKyBlZE1hdGNoTGVuIDwgbmV3TGVuZ3RoKSB7Ci0JCQkJCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoc3RNYXRjaExlbiwgbmV3TGVuZ3RoIC0gZWRNYXRjaExlbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl0ZXh0ID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICgwIDwgb2xkTGVuZ3RoIHx8IHRleHQgIT0gbnVsbCkgewotCQkJCS8vIFN0cmluZyBkZWxUZXh0ID0gc3RydWN0dXJlZERvY3VtZW50LmdldChzdGFydCwgb2xkTGVuZ3RoKTsKLQkJCQlyZXN1bHQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoZk1vZGVsLCBzdGFydCwgb2xkTGVuZ3RoLCB0ZXh0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHJpdmF0ZSBpbnQgbmVhcmVzdFNwYWNlTGVuZ3RoQWZ0ZXIoQ1NTTm9kZUltcGwgbm9kZSwgaW50IGluc2VydFBvcykgewotCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcihub2RlKTsKLQkJaWYgKGZvcm1hdHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZm9ybWF0dGVyLmdldExlbmd0aFRvUmVmb3JtYXRBZnRlcihub2RlLCBpbnNlcnRQb3MpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHJpdmF0ZSBpbnQgbmVhcmVzdFNwYWNlTGVuZ3RoQmVmb3JlKENTU05vZGVJbXBsIG5vZGUsIGludCBpbnNlcnRQb3MpIHsKLQkJQ1NTU291cmNlR2VuZXJhdG9yIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIobm9kZSk7Ci0JCWlmIChmb3JtYXR0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZvcm1hdHRlci5nZXRMZW5ndGhUb1JlZm9ybWF0QmVmb3JlKG5vZGUsIGluc2VydFBvcyk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZW1vdmVUZXh0KGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGZNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoZk1vZGVsLCBzdGFydCwgbGVuZ3RoLCBuZXcgU3RyaW5nKCIiKSk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRQYXJzZXIoQ1NTTW9kZWxQYXJzZXIgcGFyc2VyKSB7Ci0JCWZQYXJzZXIgPSBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCB2YWx1ZUNoYW5nZWQoQ1NTTm9kZUltcGwgbm9kZSwgU3RyaW5nIG9sZFZhbHVlKSB7Ci0JCWlmICghKG5vZGUgaW5zdGFuY2VvZiBDU1NSZWdpb25Db250YWluZXIpKSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJUb28gQmFkLi4iICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJKChub2RlID09IG51bGwpID8gIm51bGwiIDogbm9kZS5nZXRDbGFzcygpLnRvU3RyaW5nKCkpKTsvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc3RhcnQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUpIHsKLQkJCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGU7Ci0JCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcigoSU5vZGVOb3RpZmllcikgYXR0ci5nZXRPd25lckNTU05vZGUoKSk7Ci0JCQlpZiAoZm9ybWF0dGVyICE9IG51bGwpCi0JCQkJc3RhcnQgPSBmb3JtYXR0ZXIuZ2V0QXR0ckluc2VydFBvcyhhdHRyLmdldE93bmVyQ1NTTm9kZSgpLCBhdHRyLmdldE5hbWUoKSk7Ci0JCX0KLQotCQlpbnQgb2xkTGVuZ3RoID0gKG9sZFZhbHVlID09IG51bGwpID8gMCA6IG9sZFZhbHVlLmxlbmd0aCgpOwotCQkvLyBmbGFzaCBvbGQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi9JVGV4dFJlZ2lvbgotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIG5vZGUpLnNldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQkJKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIG5vZGUpLnNldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU1JlZ2lvbkNvbnRhaW5lcikgewotCQkJKChDU1NSZWdpb25Db250YWluZXIpIG5vZGUpLnNldFJhbmdlUmVnaW9uKG51bGwsIG51bGwsIG51bGwpOwotCQl9Ci0JCS8vIGdlbmVyYXRlIG5ldyBzb3VyY2UKLQkJU3RyaW5nIG5ld1ZhbHVlID0gbm9kZS5nZW5lcmF0ZVNvdXJjZSgpOwotCi0JCUlDU1NOb2RlIHBhcmVudDsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUpIHsKLQkJCXBhcmVudCA9ICgoSUNTU0F0dHIpIG5vZGUpLmdldE93bmVyQ1NTTm9kZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQotCQlmUGFyc2VyLnNldHVwVXBkYXRlQ29udGV4dChDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX0NIQU5HRV9SQ09OVEFJTkVSLCBwYXJlbnQsIG5vZGUpOwotCi0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IGluc2VydFRleHQoc3RhcnQsIG9sZExlbmd0aCwgbmV3VmFsdWUpOwotCi0JCWludCBuUmVtYWlucyA9IGZQYXJzZXIuY2xlYW51cFVwZGF0ZUNvbnRleHQoKTsKLQotCQlpZiAoMCA8IG5SZW1haW5zICYmICEocmVzdWx0IGluc3RhbmNlb2YgTm9DaGFuZ2VFdmVudCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQJCQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YjEzN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUnVsZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTTW9kZWxVdGlsIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBib29sZWFuIGNhbkNvbnRhaW5CcmFjZShJQ1NTTm9kZSBub2RlKSB7Ci0JCXJldHVybiAobm9kZSAhPSBudWxsICYmIChub2RlIGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIgfHwgbm9kZSBpbnN0YW5jZW9mIENTU1J1bGVEZWNsQ29udGFpbmVyKSkgPyB0cnVlIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKi8KLQlzdGF0aWMgdm9pZCBjbGVhbnVwQ29udGFpbmVyKElDU1NOb2RlIHBhcmVudCkgewotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKElDU1NOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQljbGVhbnVwQ29udGFpbmVyKGNoaWxkKTsKLQkJfQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgcGFyZW50KS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBDU1NSZWdpb25Db250YWluZXIpIHsKLQkJCSgoQ1NTUmVnaW9uQ29udGFpbmVyKSBwYXJlbnQpLnNldFJhbmdlUmVnaW9uKG51bGwsIG51bGwsIG51bGwpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gZGlhZ25vc2VOb2RlKElDU1NOb2RlIHBhcmVudCwgSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJLy8gY2hlY2sgdGhpcwotCQlWZWN0b3IgZXJyb3JzID0gbmV3IFZlY3RvcigpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgbm9kZSA9IChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHBhcmVudDsKLQkJCVN0cmluZyBub2RlVGV4dCA9IENTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkgKyAiOiAiOy8vJE5PTi1OTFMtMSQKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCAmJiAoIShub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgfHwgbm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlU2hlZXRJbXBsKSB8fCBub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsKSkgewotCQkJCWVycm9ycy5hZGQoTkxTLmJpbmQoQ1NTQ29yZU1lc3NhZ2VzLl8xY29uY2F0X0VSUk9SXywgKG5ldyBPYmplY3RbXXtub2RlVGV4dH0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiezB9Zmlyc3QgZmxhdCBub2RlIGlzIG51bGwuIgotCQkJfQotCQkJZWxzZSBpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbW9kZWxOb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGZsYXROb2RlLmdldFN0YXJ0KCkpOwotCQkJCWlmIChmbGF0Tm9kZSAhPSBtb2RlbE5vZGUpIHsKLQkJCQkJZXJyb3JzLmFkZChOTFMuYmluZChDU1NDb3JlTWVzc2FnZXMuXzJjb25jYXRfRVJST1JfLCAobmV3IE9iamVjdFtde25vZGVUZXh0fSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJ7MH1maXJzdCBmbGF0IG5vZGUgaXMgbm90IGluIG1vZGVsLiIKLQkJCQl9Ci0JCQl9Ci0JCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwgJiYgKCEobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb25JbXBsIHx8IG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZVNoZWV0SW1wbCkgfHwgbm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCkpIHsKLQkJCQllcnJvcnMuYWRkKE5MUy5iaW5kKENTU0NvcmVNZXNzYWdlcy5fM2NvbmNhdF9FUlJPUl8sIChuZXcgT2JqZWN0W117bm9kZVRleHR9KSkpOyAvLyROT04tTkxTLTEkID0gInswfWxhc3QgZmxhdCBub2RlIGlzIG51bGwuIgotCQkJfQotCQkJZWxzZSBpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbW9kZWxOb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGZsYXROb2RlLmdldFN0YXJ0KCkpOwotCQkJCWlmIChmbGF0Tm9kZSAhPSBtb2RlbE5vZGUpIHsKLQkJCQkJZXJyb3JzLmFkZChOTFMuYmluZChDU1NDb3JlTWVzc2FnZXMuXzRjb25jYXRfRVJST1JfLCAobmV3IE9iamVjdFtde25vZGVUZXh0fSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJ7MH1sYXN0IGZsYXQgbm9kZSBpcyBub3QgaW4gbW9kZWwuIgotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBDU1NSZWdpb25Db250YWluZXIpIHsKLQkJCUNTU1JlZ2lvbkNvbnRhaW5lciBub2RlID0gKENTU1JlZ2lvbkNvbnRhaW5lcikgcGFyZW50OwotCQkJU3RyaW5nIG5vZGVUZXh0ID0gQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSArICI6ICI7Ly8kTk9OLU5MUy0xJAotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gbm9kZS5nZXRGaXJzdFJlZ2lvbigpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnRSZWdpb24gPSBub2RlLmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwgJiYgKCEobm9kZSBpbnN0YW5jZW9mIE1lZGlhTGlzdEltcGwpIHx8IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwpKSB7Ci0JCQkJZXJyb3JzLmFkZChOTFMuYmluZChDU1NDb3JlTWVzc2FnZXMuXzI1Y29uY2F0X0VSUk9SXywgKG5ldyBPYmplY3RbXXtub2RlVGV4dH0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiezB9Zmlyc3QgcmVnaW9uIGlzIG51bGwuIgotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlpbnQgb2Zmc2V0ID0gcGFyZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtb2RlbE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQlJVGV4dFJlZ2lvbiBtb2RlbFJlZ2lvbiA9IG1vZGVsTm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCWlmIChyZWdpb24gIT0gbW9kZWxSZWdpb24pIHsKLQkJCQkJZXJyb3JzLmFkZChOTFMuYmluZChDU1NDb3JlTWVzc2FnZXMuXzI2Y29uY2F0X0VSUk9SXywgKG5ldyBPYmplY3RbXXtub2RlVGV4dH0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiezB9Zmlyc3QgcmVnaW9uIGlzIG5vdCBpbiBtb2RlbC4iCi0JCQkJfQotCQkJfQotCQkJcmVnaW9uID0gbm9kZS5nZXRMYXN0UmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwgJiYgKCEobm9kZSBpbnN0YW5jZW9mIE1lZGlhTGlzdEltcGwpIHx8IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwpKSB7Ci0JCQkJZXJyb3JzLmFkZChOTFMuYmluZChDU1NDb3JlTWVzc2FnZXMuXzI3Y29uY2F0X0VSUk9SXywgKG5ldyBPYmplY3RbXXtub2RlVGV4dH0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiezB9bGFzdCByZWdpb24gaXMgbnVsbC4iCi0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCWludCBvZmZzZXQgPSBwYXJlbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1vZGVsTm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCUlUZXh0UmVnaW9uIG1vZGVsUmVnaW9uID0gbW9kZWxOb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBtb2RlbFJlZ2lvbikgewotCQkJCQllcnJvcnMuYWRkKE5MUy5iaW5kKENTU0NvcmVNZXNzYWdlcy5fMjhjb25jYXRfRVJST1JfLCAobmV3IE9iamVjdFtde25vZGVUZXh0fSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJ7MH1sYXN0IHJlZ2lvbiBpcyBub3QgaW4gbW9kZWwuIgotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUlDU1NOb2RlTGlzdCBhdHRycyA9IHBhcmVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWludCBuQXR0cnMgPSBhdHRycy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuQXR0cnM7IGkrKykgewotCQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgYXR0cnMuaXRlbShpKTsKLQkJCUNTU1JlZ2lvbkNvbnRhaW5lciBub2RlID0gKENTU1JlZ2lvbkNvbnRhaW5lcikgYXR0cjsKLQkJCVN0cmluZyBub2RlVGV4dCA9IENTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkgKyAiKCIgKyBhdHRyLmdldE5hbWUoKSArICIpOiAiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBub2RlLmdldEZpcnN0UmVnaW9uKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudFJlZ2lvbiA9IG5vZGUuZ2V0RG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCAmJiAwIDwgYXR0ci5nZXRWYWx1ZSgpLmxlbmd0aCgpKSB7Ci0JCQkJZXJyb3JzLmFkZChOTFMuYmluZChDU1NDb3JlTWVzc2FnZXMuXzVjb25jYXRfRVJST1JfLCAobmV3IE9iamVjdFtde25vZGVUZXh0fSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJ7MH1maXJzdCByZWdpb24gaXMgbnVsbC4iCi0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCWludCBvZmZzZXQgPSBwYXJlbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1vZGVsTm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCUlUZXh0UmVnaW9uIG1vZGVsUmVnaW9uID0gbW9kZWxOb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBtb2RlbFJlZ2lvbikgewotCQkJCQllcnJvcnMuYWRkKE5MUy5iaW5kKENTU0NvcmVNZXNzYWdlcy5fNmNvbmNhdF9FUlJPUl8sIChuZXcgT2JqZWN0W117bm9kZVRleHR9KSkpOyAvLyROT04tTkxTLTEkID0gInswfWZpcnN0IHJlZ2lvbiBpcyBub3QgaW4gbW9kZWwuIgotCQkJCX0KLQkJCX0KLQkJCXJlZ2lvbiA9IG5vZGUuZ2V0TGFzdFJlZ2lvbigpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsICYmIDAgPCBhdHRyLmdldFZhbHVlKCkubGVuZ3RoKCkpIHsKLQkJCQllcnJvcnMuYWRkKE5MUy5iaW5kKENTU0NvcmVNZXNzYWdlcy5fN2NvbmNhdF9FUlJPUl8sIChuZXcgT2JqZWN0W117bm9kZVRleHR9KSkpOyAvLyROT04tTkxTLTEkID0gInswfWxhc3QgcmVnaW9uIGlzIG51bGwuIgotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlpbnQgb2Zmc2V0ID0gcGFyZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtb2RlbE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQlJVGV4dFJlZ2lvbiBtb2RlbFJlZ2lvbiA9IG1vZGVsTm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCWlmIChyZWdpb24gIT0gbW9kZWxSZWdpb24pIHsKLQkJCQkJZXJyb3JzLmFkZChOTFMuYmluZChDU1NDb3JlTWVzc2FnZXMuXzhjb25jYXRfRVJST1JfLCAobmV3IE9iamVjdFtde25vZGVUZXh0fSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJ7MH1sYXN0IHJlZ2lvbiBpcyBub3QgaW4gbW9kZWwuIgotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghZXJyb3JzLmlzRW1wdHkoKSkgewotCQkJSXRlcmF0b3IgaSA9IGVycm9ycy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJQ1NTVXRpbC5kZWJ1Z091dCgoU3RyaW5nKSBpLm5leHQoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqLwotCXN0YXRpYyBib29sZWFuIGRpYWdub3NlVHJlZShJQ1NTTm9kZSBwYXJlbnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vIGNoZWNrIGNoaWxkcmVuCi0JCWZvciAoSUNTU05vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWRpYWdub3NlVHJlZShjaGlsZCwgc3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCi0JCWRpYWdub3NlTm9kZShwYXJlbnQsIHN0cnVjdHVyZWREb2N1bWVudCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogSWYgbmVlZGVkLCBtb2RpZnkgbGFzdCBmbGF0IG5vZGUKLQkgKi8KLQlzdGF0aWMgdm9pZCBleHBhbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHRhcmdldCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAodGFyZ2V0ID09IG51bGwgfHwgZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IHRhcmdldC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChsYXN0Tm9kZSA9PSBmbGF0Tm9kZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChsYXN0Tm9kZSA9PSBudWxsIHx8IGxhc3ROb2RlLmdldFN0YXJ0KCkgPCBmbGF0Tm9kZS5nZXRTdGFydCgpKSB7Ci0JCQl0YXJnZXQuc2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXN0YXRpYyBJQ1NTTm9kZSBmaW5kQnJhY2VDb250YWluZXIoSUNTU05vZGUgbm9kZSkgewotCQlmb3IgKElDU1NOb2RlIGkgPSBub2RlOyBpICE9IG51bGw7IGkgPSBpLmdldFBhcmVudE5vZGUoKSkgewotCQkJaWYgKENTU01vZGVsVXRpbC5jYW5Db250YWluQnJhY2UoaSkpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgaW50IGdldERlcHRoKElDU1NOb2RlIG5vZGUpIHsKLQkJaW50IGRlcHRoID0gLTE7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWRlcHRoKys7Ci0JCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIGRlcHRoOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBib29sZWFuIGlzQnJhY2VDbG9zZWQoSUNTU05vZGUgbm9kZSkgewotCQlib29sZWFuIGJDbG9zZWQgPSB0cnVlOwotCQlpZiAoIShub2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIGJDbG9zZWQ7Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0ID0gKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIG5vZGUpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdCA9ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBub2RlKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmaXJzdCA9PSBudWxsIHx8IGxhc3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGJDbG9zZWQ7Ci0JCX0KLQkJaWYgKGxhc3QuZ2V0U3RhcnQoKSA8IGZpcnN0LmdldFN0YXJ0KCkpIHsKLQkJCXJldHVybiBiQ2xvc2VkOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGZpcnN0OwotCQlpbnQgbk9wZW4gPSAwOwotCQlpbnQgbkNsb3NlID0gMDsKLQkJZG8gewotCQkJU3RyaW5nIHR5cGUgPSBDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJCW5PcGVuKys7Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCQluQ2xvc2UrKzsKLQkJCX0KLQkJCWZsYXROb2RlID0gZmxhdE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXdoaWxlIChmbGF0Tm9kZSAhPSBudWxsICYmIGZsYXROb2RlICE9IGxhc3QpOwotCi0JCWlmICgobk9wZW4gPT0gMCAmJiBuQ2xvc2UgPT0gMCkgfHwgbkNsb3NlIDwgbk9wZW4pIHsKLQkJCWJDbG9zZWQgPSBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBiQ2xvc2VkOwotCX0KLQotCS8qKgotCSAqIG9ubHkgZm9yIGluc2VydGlvbi4uCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gaXNJbnRlcnJ1cHRpb24oQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHRhcmdldCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAodGFyZ2V0ID09IG51bGwgfHwgZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBzdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gdGFyZ2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSB0YXJnZXQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmlyc3ROb2RlICE9IG51bGwgJiYgZmlyc3ROb2RlLmdldFN0YXJ0KCkgPCBzdGFydCAmJiBsYXN0Tm9kZSAhPSBudWxsICYmIHN0YXJ0IDwgbGFzdE5vZGUuZ2V0U3RhcnQoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBib29sZWFuIGlzUGFyZW50T2YoSUNTU05vZGUgcGFyZW50LCBJQ1NTTm9kZSBjaGlsZCkgewotCQlpZiAocGFyZW50ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gY2hpbGQ7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAocGFyZW50ID09IG5vZGUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05hbWVkTm9kZU1hcEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTmFtZWROb2RlTWFwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDIxMTQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTmFtZWROb2RlTWFwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU05hbWVkTm9kZU1hcEltcGwgZXh0ZW5kcyBDU1NOb2RlTGlzdEltcGwgaW1wbGVtZW50cyBJQ1NTTmFtZWROb2RlTWFwIHsKLQotCS8qKgotCSAqIENTU05hbWVkTm9kZU1hcEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NOYW1lZE5vZGVNYXBJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBJQ1NTTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJSXRlcmF0b3IgaXQgPSBub2Rlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENTU0F0dHJJbXBsICYmICgoQ1NTQXR0ckltcGwpIG9iaikuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UobmFtZSkgPT0gMCkgewotCQkJCXJldHVybiAoSUNTU05vZGUpIG9iajsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05vZGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMzdkYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NOb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5JbXBvcnRSdWxlQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0Tm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDU1NOb2RlSW1wbCBleHRlbmRzIEFic3RyYWN0Tm90aWZpZXIgaW1wbGVtZW50cyBJQ1NTTm9kZSwgSW5kZXhlZFJlZ2lvbiB7Ci0KLQlwcml2YXRlIENTU0RvY3VtZW50SW1wbCBmT3duZXJEb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBmUGFyZW50Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBmTmV4dFNpYmxpbmcgPSBudWxsOwotCXByaXZhdGUgQ1NTTm9kZUltcGwgZlByZXZpb3VzU2libGluZyA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBmRmlyc3RDaGlsZCA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBmTGFzdENoaWxkID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ1NTTmFtZWROb2RlTWFwSW1wbCBmQXR0cnMgPSBudWxsOwotCi0JLyoqCi0JICogQ1NTTm9kZUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NOb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NOb2RlSW1wbChDU1NOb2RlSW1wbCB0aGF0KSB7Ci0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMuZk93bmVyRG9jdW1lbnQgPSB0aGF0LmZPd25lckRvY3VtZW50OwotCQkJaWYgKHRoYXQuZkF0dHJzICE9IG51bGwpIHsKLQkJCQlpbnQgbkF0dHJzID0gdGhhdC5mQXR0cnMuZ2V0TGVuZ3RoKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuQXR0cnM7IGkrKykgewotCQkJCQlDU1NBdHRySW1wbCBhdHRyID0gKENTU0F0dHJJbXBsKSB0aGF0LmZBdHRycy5pdGVtKGkpOwotCQkJCQlzZXRBdHRyaWJ1dGUoYXR0ci5nZXROYW1lKCksIGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIENTU05vZGVJbXBsIGFwcGVuZENoaWxkKENTU05vZGVJbXBsIG5ld0NoaWxkKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGluc2VydEJlZm9yZShuZXdDaGlsZCwgbnVsbCk7Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xvbmVDaGlsZE5vZGVzKElDU1NOb2RlIG5ld1BhcmVudCwgYm9vbGVhbiBkZWVwKSB7Ci0JCWlmIChuZXdQYXJlbnQgPT0gbnVsbCB8fCBuZXdQYXJlbnQgPT0gdGhpcykKLQkJCXJldHVybjsKLQotCQlDU1NOb2RlSW1wbCBjb250YWluZXIgPSAoQ1NTTm9kZUltcGwpIG5ld1BhcmVudDsKLQkJY29udGFpbmVyLnJlbW92ZUNoaWxkTm9kZXMoKTsKLQotCQlmb3IgKElDU1NOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCUNTU05vZGVJbXBsIGNsb25lZCA9IChDU1NOb2RlSW1wbCkgY2hpbGQuY2xvbmVOb2RlKGRlZXApOwotCQkJaWYgKGNsb25lZCAhPSBudWxsKQotCQkJCWNvbnRhaW5lci5hcHBlbmRDaGlsZChjbG9uZWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IG9mZnNldCkgewotCQlyZXR1cm4gKGdldFN0YXJ0T2Zmc2V0KCkgPD0gb2Zmc2V0ICYmIG9mZnNldCA8IGdldEVuZE9mZnNldCgpKTsKLQl9Ci0KLQkvKioKLQkgKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdlbmVyYXRlU291cmNlKCkgewotCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcih0aGlzKTsKLQkJcmV0dXJuIGZvcm1hdHRlci5mb3JtYXQodGhpcykudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICoKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7Ci0JCUNTU0F0dHJJbXBsIGF0dHIgPSBnZXRBdHRyaWJ1dGVOb2RlKG5hbWUpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJcmV0dXJuIGF0dHIuZ2V0VmFsdWUoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIENTU0F0dHJJbXBsIGdldEF0dHJpYnV0ZU5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGZBdHRycyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IG5BdHRycyA9IGZBdHRycy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuQXR0cnM7IGkrKykgewotCQkJQ1NTQXR0ckltcGwgYXR0ciA9IChDU1NBdHRySW1wbCkgZkF0dHJzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ci5tYXRjaE5hbWUobmFtZSkpCi0JCQkJcmV0dXJuIGF0dHI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTmFtZWROb2RlTWFwCi0JICovCi0JcHVibGljIElDU1NOYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJaWYgKGZBdHRycyA9PSBudWxsKQotCQkJZkF0dHJzID0gbmV3IENTU05hbWVkTm9kZU1hcEltcGwoKTsKLQkJcmV0dXJuIGZBdHRyczsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0JCUNTU05vZGVMaXN0SW1wbCBsaXN0ID0gbmV3IENTU05vZGVMaXN0SW1wbCgpOwotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJbGlzdC5hcHBlbmROb2RlKG5vZGUpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCUlDU1NOb2RlIGdldENvbW1vbkFuY2VzdG9yKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWZvciAoSUNTU05vZGUgbmEgPSBub2RlOyBuYSAhPSBudWxsOyBuYSA9IG5hLmdldFBhcmVudE5vZGUoKSkgewotCQkJZm9yIChJQ1NTTm9kZSB0YSA9IHRoaXM7IHRhICE9IG51bGw7IHRhID0gdGEuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQkJaWYgKHRhID09IG5hKQotCQkJCQlyZXR1cm4gdGE7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JQ1NTRG9jdW1lbnRJbXBsIGdldENvbnRhaW5lckRvY3VtZW50KCkgewotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSB0aGlzOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NEb2N1bWVudEltcGwpIHsKLQkJCQlDU1NEb2N1bWVudEltcGwgZG9jID0gKENTU0RvY3VtZW50SW1wbCkgbm9kZTsKLQkJCQlpZiAoZG9jLmlzRG9jdW1lbnQoKSkKLQkJCQkJcmV0dXJuIGRvYzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlDU1NOb2RlSW1wbCBnZXRDb250YWluZXJOb2RlKGludCBvZmZzZXQpIHsKLQkJaWYgKCFjb250YWlucyhvZmZzZXQpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZm9yIChJQ1NTTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlJQ1NTTm9kZSBmb3VuZCA9ICgoQ1NTTm9kZUltcGwpIGNoaWxkKS5nZXRDb250YWluZXJOb2RlKG9mZnNldCk7Ci0JCQlpZiAoZm91bmQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gKENTU05vZGVJbXBsKSBmb3VuZDsKLQkJfQotCi0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBGYWN0b3J5UmVnaXN0cnkgZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCUZhY3RvcnlSZWdpc3RyeSByZWcgPSBtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJCWlmIChyZWcgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVnOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBnZXRGaXJzdENoaWxkKCkgewotCQlyZXR1cm4gdGhpcy5mRmlyc3RDaGlsZDsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgZ2V0TGFzdENoaWxkKCkgewotCQlyZXR1cm4gdGhpcy5mTGFzdENoaWxkOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBnZXROZXh0U2libGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZk5leHRTaWJsaW5nOwotCX0KLQotCUlDU1NOb2RlIGdldE5vZGVBdChpbnQgb2Zmc2V0KSB7Ci0JCS8vIHRoZSBzYW1lIGFzIGdldENvbnRhaW5lck5vZGUoKQotCQlyZXR1cm4gZ2V0Q29udGFpbmVyTm9kZShvZmZzZXQpOwotCX0KLQotCXB1YmxpYyBJQ1NTRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZk93bmVyRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGdldFBhcmVudE5vZGUoKSB7Ci0JCXJldHVybiB0aGlzLmZQYXJlbnROb2RlOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBnZXRQcmV2aW91c1NpYmxpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmZQcmV2aW91c1NpYmxpbmc7Ci0JfQotCi0JSUNTU05vZGUgZ2V0Um9vdE5vZGUoKSB7Ci0JCUNTU05vZGVJbXBsIHBhcmVudCA9IChDU1NOb2RlSW1wbCkgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gdGhpczsKLQkJcmV0dXJuIHBhcmVudC5nZXRSb290Tm9kZSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkTm9kZXMoKSB7Ci0JCXJldHVybiAodGhpcy5mRmlyc3RDaGlsZCAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIENTU05vZGVJbXBsIGluc2VydEJlZm9yZShDU1NOb2RlSW1wbCBuZXdDaGlsZCwgQ1NTTm9kZUltcGwgcmVmQ2hpbGQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAobmV3Q2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU05vZGVJbXBsIGNoaWxkID0gbmV3Q2hpbGQ7Ci0JCUNTU05vZGVJbXBsIG5leHQgPSByZWZDaGlsZDsKLQkJQ1NTTm9kZUltcGwgcHJldiA9IG51bGw7Ci0JCWlmIChuZXh0ID09IG51bGwpIHsKLQkJCXByZXYgPSB0aGlzLmZMYXN0Q2hpbGQ7Ci0JCQl0aGlzLmZMYXN0Q2hpbGQgPSBjaGlsZDsKLQkJfQotCQllbHNlIHsKLQkJCXByZXYgPSAoQ1NTTm9kZUltcGwpIG5leHQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQluZXh0LnNldFByZXZpb3VzU2libGluZyhjaGlsZCk7Ci0JCX0KLQotCQlpZiAocHJldiA9PSBudWxsKQotCQkJdGhpcy5mRmlyc3RDaGlsZCA9IGNoaWxkOwotCQllbHNlCi0JCQlwcmV2LnNldE5leHRTaWJsaW5nKGNoaWxkKTsKLQkJY2hpbGQuc2V0UHJldmlvdXNTaWJsaW5nKHByZXYpOwotCQljaGlsZC5zZXROZXh0U2libGluZyhuZXh0KTsKLQkJY2hpbGQuc2V0UGFyZW50Tm9kZSh0aGlzKTsKLQotCQlub3RpZnlDaGlsZFJlcGxhY2VkKGNoaWxkLCBudWxsKTsKLQotCQlyZXR1cm4gbmV3Q2hpbGQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5QXR0clJlcGxhY2VkKENTU05vZGVJbXBsIG5ld0F0dHIsIENTU05vZGVJbXBsIG9sZEF0dHIpIHsKLQkJLy8gZm9yIG1vZGVsCi0JCUlDU1NEb2N1bWVudCBkb2MgPSBnZXRDb250YWluZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUNTU01vZGVsSW1wbCBtb2RlbCA9IChDU1NNb2RlbEltcGwpIGRvYy5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwuYXR0clJlcGxhY2VkKHRoaXMsIG5ld0F0dHIsIG9sZEF0dHIpOwotCi0JCS8vIGZvciBhZGFwdGVycwotCQlpbnQgdHlwZSA9IENIQU5HRTsKLQkJaWYgKG5ld0F0dHIgPT0gbnVsbCkKLQkJCXR5cGUgPSBSRU1PVkU7Ci0JCWVsc2UgaWYgKG9sZEF0dHIgPT0gbnVsbCkKLQkJCXR5cGUgPSBBREQ7Ci0JCW5vdGlmeSh0eXBlLCBvbGRBdHRyLCBvbGRBdHRyLCBuZXdBdHRyLCBnZXRTdGFydE9mZnNldCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlDaGlsZFJlcGxhY2VkKENTU05vZGVJbXBsIG5ld0NoaWxkLCBDU1NOb2RlSW1wbCBvbGRDaGlsZCkgewotCQkvLyBmb3IgbW9kZWwKLQkJSUNTU0RvY3VtZW50IGRvYyA9IGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ1NTTW9kZWxJbXBsIG1vZGVsID0gKENTU01vZGVsSW1wbCkgZG9jLmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5jaGlsZFJlcGxhY2VkKHRoaXMsIG5ld0NoaWxkLCBvbGRDaGlsZCk7Ci0KLQkJLy8gZm9yIGFkYXB0ZXJzCi0JCWludCB0eXBlID0gQ0hBTkdFOwotCQlpZiAobmV3Q2hpbGQgPT0gbnVsbCkKLQkJCXR5cGUgPSBSRU1PVkU7Ci0JCWVsc2UgaWYgKG9sZENoaWxkID09IG51bGwpCi0JCQl0eXBlID0gQUREOwotCQlub3RpZnkodHlwZSwgb2xkQ2hpbGQsIG9sZENoaWxkLCBuZXdDaGlsZCwgZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JfQotCi0Jdm9pZCByZW1vdmVBdHRyaWJ1dGVOb2RlKENTU05vZGVJbXBsIGF0dHIpIHsKLQkJLy8gZmluZAotCQlpbnQgbkF0dHJzID0gZkF0dHJzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5BdHRyczsgaSsrKSB7Ci0JCQlpZiAoZkF0dHJzLml0ZW0oaSkgPT0gYXR0cikgewotCQkJCWZBdHRycy5yZW1vdmVOb2RlKGkpOwotCQkJCW5vdGlmeUF0dHJSZXBsYWNlZChudWxsLCBhdHRyKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ1NTTm9kZUltcGwgcmVtb3ZlQ2hpbGQoQ1NTTm9kZUltcGwgb2xkQ2hpbGQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAob2xkQ2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAob2xkQ2hpbGQuZ2V0UGFyZW50Tm9kZSgpICE9IHRoaXMpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBjbG9zZSBpbXBvcnQgcnVsZXMKLQkJSW1wb3J0UnVsZUNvbGxlY3RvciB0cmF2ID0gbmV3IEltcG9ydFJ1bGVDb2xsZWN0b3IoKTsKLQkJdHJhdi5hcHBseShvbGRDaGlsZCk7Ci0JCUl0ZXJhdG9yIGl0ID0gdHJhdi5nZXRSdWxlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCSgoQ1NTSW1wb3J0UnVsZUltcGwpIGl0Lm5leHQoKSkuY2xvc2VTdHlsZVNoZWV0KCk7Ci0JCX0KLQotCQlDU1NOb2RlSW1wbCBjaGlsZCA9IG9sZENoaWxkOwotCQlDU1NOb2RlSW1wbCBwcmV2ID0gKENTU05vZGVJbXBsKSBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJQ1NTTm9kZUltcGwgbmV4dCA9IChDU1NOb2RlSW1wbCkgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQlpZiAocHJldiA9PSBudWxsKQotCQkJdGhpcy5mRmlyc3RDaGlsZCA9IG5leHQ7Ci0JCWVsc2UKLQkJCXByZXYuc2V0TmV4dFNpYmxpbmcobmV4dCk7Ci0KLQkJaWYgKG5leHQgPT0gbnVsbCkKLQkJCXRoaXMuZkxhc3RDaGlsZCA9IHByZXY7Ci0JCWVsc2UKLQkJCW5leHQuc2V0UHJldmlvdXNTaWJsaW5nKHByZXYpOwotCi0JCWNoaWxkLnNldFByZXZpb3VzU2libGluZyhudWxsKTsKLQkJY2hpbGQuc2V0TmV4dFNpYmxpbmcobnVsbCk7Ci0JCWNoaWxkLnNldFBhcmVudE5vZGUobnVsbCk7Ci0KLQkJbm90aWZ5Q2hpbGRSZXBsYWNlZChudWxsLCBjaGlsZCk7Ci0KLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgcmVtb3ZlQ2hpbGROb2RlcygpIHsKLQkJSUNTU05vZGUgbmV4dENoaWxkID0gbnVsbDsKLQkJZm9yIChJQ1NTTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBuZXh0Q2hpbGQpIHsKLQkJCW5leHRDaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlyZW1vdmVDaGlsZCgoQ1NTTm9kZUltcGwpIGNoaWxkKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBDU1NOb2RlSW1wbCByZXBsYWNlQ2hpbGQoQ1NTTm9kZUltcGwgbmV3Q2hpbGQsIENTU05vZGVJbXBsIG9sZENoaWxkKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG9sZENoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbmV3Q2hpbGQ7Ci0JCWlmIChuZXdDaGlsZCAhPSBudWxsKQotCQkJaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCBvbGRDaGlsZCk7Ci0JCXJldHVybiByZW1vdmVDaGlsZChvbGRDaGlsZCk7Ci0JfQotCi0JLyoqCi0JICoKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUNTU0F0dHJJbXBsIGF0dHIgPSBnZXRBdHRyaWJ1dGVOb2RlKG5hbWUpOwotCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgb2xkVmFsdWUgPSBhdHRyLmdldFZhbHVlKCk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHMob2xkVmFsdWUpKQotCQkJCXJldHVybjsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJaWYgKG9sZFZhbHVlICE9IG51bGwpIHsKLQkJCQkJcmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJaWYgKGZBdHRycyA9PSBudWxsKQotCQkJCWZBdHRycyA9IG5ldyBDU1NOYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCQlDU1NEb2N1bWVudEltcGwgZG9jID0gKENTU0RvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGRvYyA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWF0dHIgPSAoQ1NTQXR0ckltcGwpIGRvYy5jcmVhdGVDU1NBdHRyKG5hbWUpOwotCQkJYXR0ci5zZXRPd25lckNTU05vZGUodGhpcyk7Ci0JCQlmQXR0cnMuYXBwZW5kTm9kZShhdHRyKTsKLQkJCW5vdGlmeUF0dHJSZXBsYWNlZChhdHRyLCBudWxsKTsKLQkJfQotCQlhdHRyLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY3NzVGV4dAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENzc1RleHQoU3RyaW5nIGNzc1RleHQpIHsKLQkJLy8gVE9ETyA6IGNhbGwgZmxhdCBtb2RlbCBwYXJzZXIgYW5kIHJlcGxhY2UgbXlzZWxmIHdpdGggbmV3IHRocmVlISEKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBzZXROZXh0U2libGluZyhJQ1NTTm9kZSBuZXh0U2libGluZykgewotCQl0aGlzLmZOZXh0U2libGluZyA9IChDU1NOb2RlSW1wbCkgbmV4dFNpYmxpbmc7Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3duZXJEb2N1bWVudChJQ1NTRG9jdW1lbnQgb3duZXJEb2N1bWVudCkgewotCQl0aGlzLmZPd25lckRvY3VtZW50ID0gKENTU0RvY3VtZW50SW1wbCkgb3duZXJEb2N1bWVudDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UGFyZW50Tm9kZShJQ1NTTm9kZSBwYXJlbnROb2RlKSB7Ci0JCXRoaXMuZlBhcmVudE5vZGUgPSAoQ1NTTm9kZUltcGwpIHBhcmVudE5vZGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFByZXZpb3VzU2libGluZyhJQ1NTTm9kZSBwcmV2aW91c1NpYmxpbmcpIHsKLQkJdGhpcy5mUHJldmlvdXNTaWJsaW5nID0gKENTU05vZGVJbXBsKSBwcmV2aW91c1NpYmxpbmc7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJaW50IHN0YXJ0ID0gZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaWYgKHN0YXJ0ID49IDApIHsKLQkJCWludCBlbmQgPSBnZXRFbmRPZmZzZXQoKTsKLQkJCWlmIChlbmQgPj0gMCkgewotCQkJCXJlc3VsdCA9IGVuZCAtIHN0YXJ0OwotCQkJCWlmIChyZXN1bHQgPCAtMSkgewotCQkJCQlyZXN1bHQgPSAtMTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05vZGVMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NOb2RlTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQxMzg3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05vZGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlTGlzdDsKLQotY2xhc3MgQ1NTTm9kZUxpc3RJbXBsIGV4dGVuZHMgQWJzdHJhY3RDU1NOb2RlTGlzdCBpbXBsZW1lbnRzIElDU1NOb2RlTGlzdCB7Ci0KLQlDU1NOb2RlTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCXJldHVybiBpdGVtSW1wbChpbmRleCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQYWdlUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUGFnZVJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OWQ1NzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQYWdlUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUGFnZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTUGFnZVJ1bGVJbXBsIGV4dGVuZHMgQ1NTUnVsZURlY2xDb250YWluZXIgaW1wbGVtZW50cyBJQ1NTUGFnZVJ1bGUgewotCi0JSUNTU1NlbGVjdG9yTGlzdCBmU2VsZWN0b3JMaXN0ID0gbmV3IENTU1NlbGVjdG9yTGlzdEltcGwobnVsbCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NQYWdlUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQ1NTUGFnZVJ1bGVJbXBsKENTU1BhZ2VSdWxlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU1BhZ2VSdWxlSW1wbCBjbG9uZWQgPSBuZXcgQ1NTUGFnZVJ1bGVJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZXh0cmFjdFByZVN0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHByZVN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoIkBwYWdlICIpOy8vJE5PTi1OTFMtMSQKLQkJcHJlU3RyLmFwcGVuZChnZXRTZWxlY3RvclRleHQoKSk7Ci0KLQkJcmV0dXJuIHByZVN0ci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBQQUdFUlVMRV9OT0RFOwotCX0KLQotCXB1YmxpYyBJQ1NTU2VsZWN0b3JMaXN0IGdldFNlbGVjdG9ycygpIHsKLQkJcmV0dXJuIGZTZWxlY3Rvckxpc3Q7Ci0JfQotCi0JLyoqCi0JICogVGhlIHBhcnNhYmxlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhZ2Ugc2VsZWN0b3IgZm9yIHRoZSBydWxlLgotCSAqIAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgQ1NTIHN0cmluZyB2YWx1ZSBoYXMKLQkgKiAgICAgICAgICAgICAgICBhIHN5bnRheCBlcnJvciBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcnVsZSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0b3JUZXh0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFNFTEVDVE9SKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgcnVsZSwgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQKLQkgKiBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBjYXN0IGRvd24gZnJvbSBhbgotCSAqIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5DU1NSdWxlPC9jb2RlPiBpbnRlcmZhY2UgdG8gdGhlIHNwZWNpZmljCi0JICogZGVyaXZlZCBpbnRlcmZhY2UgaW1wbGllZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4uCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBQQUdFX1JVTEU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0b3JUZXh0KFN0cmluZyBzZWxlY3RvclRleHQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXRBdHRyaWJ1dGUoU0VMRUNUT1IsIHNlbGVjdG9yVGV4dCk7Ci0JCWZTZWxlY3Rvckxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChzZWxlY3RvclRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUHJpbWl0aXZlQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1ByaW1pdGl2ZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDFmMTg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUHJpbWl0aXZlQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci0KLS8qKgotICogCi0gKi8KLWFic3RyYWN0IGNsYXNzIENTU1ByaW1pdGl2ZUNvbnRhaW5lciBleHRlbmRzIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCB7Ci0KLQlDU1NQcmltaXRpdmVDb250YWluZXIoQ1NTUHJpbWl0aXZlQ29udGFpbmVyIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JQ1NTUHJpbWl0aXZlQ29udGFpbmVyKHNob3J0IHByaW1pdGl2ZVR5cGUpIHsKLQkJc3VwZXIocHJpbWl0aXZlVHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdFByaW1pdGl2ZXMoKTsKLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE93bmVyRG9jdW1lbnQoSUNTU0RvY3VtZW50IG93bmVyRG9jdW1lbnQpIHsKLQkJc3VwZXIuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50KTsKLQotCQlpbml0UHJpbWl0aXZlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUHJpbWl0aXZlVmFsdWVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1ByaW1pdGl2ZVZhbHVlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmJjMDk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUHJpbWl0aXZlVmFsdWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ291bnRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuUkdCQ29sb3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLlJlY3Q7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGV4dGVuZHMgQ1NTUmVnaW9uQ29udGFpbmVyIGltcGxlbWVudHMgSUNTU1ByaW1pdGl2ZVZhbHVlIHsKLQotCXByb3RlY3RlZCBzaG9ydCBmUHJpbWl0aXZlVHlwZSA9IENTU19VTktOT1dOOwotCXByaXZhdGUgZmxvYXQgZkZsb2F0VmFsdWUgPSAwLjBmOwotCXByaXZhdGUgU3RyaW5nIGZTdHJpbmdWYWx1ZSA9IG51bGw7Ci0KLQlDU1NQcmltaXRpdmVWYWx1ZUltcGwoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJdGhpcy5mUHJpbWl0aXZlVHlwZSA9IHRoYXQuZlByaW1pdGl2ZVR5cGU7Ci0JCXRoaXMuZkZsb2F0VmFsdWUgPSB0aGF0LmZGbG9hdFZhbHVlOwotCQl0aGlzLmZTdHJpbmdWYWx1ZSA9IHRoYXQuZlN0cmluZ1ZhbHVlOwotCX0KLQotCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbChzaG9ydCBwcmltaXRpdmVUeXBlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZQcmltaXRpdmVUeXBlID0gcHJpbWl0aXZlVHlwZTsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgY2xvbmVkID0gbmV3IENTU1ByaW1pdGl2ZVZhbHVlSW1wbCh0aGlzKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSBDb3VudGVyIHZhbHVlLiBJZiB0aGlzIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogY29udGFpbiBhIGNvdW50ZXIgdmFsdWUsIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiBpcyByYWlzZWQuCi0JICogTW9kaWZpY2F0aW9uIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlIHByb3BlcnR5IGNhbiBiZSBhY2hpZXZlZCB1c2luZwotCSAqIHRoZSA8Y29kZT5Db3VudGVyPC9jb2RlPiBpbnRlcmZhY2UuCi0JICogCi0JICogQHJldHVybiBUaGUgQ291bnRlciB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBDU1MgdmFsdWUgZG9lc24ndAotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW4gYSBDb3VudGVyIHZhbHVlIChlLmcuIHRoaXMgaXMgbm90Ci0JICogICAgICAgICAgICAgICAgPGNvZGU+Q1NTX0NPVU5URVI8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgQ291bnRlciBnZXRDb3VudGVyVmFsdWUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9BQ0NFU1NfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENTU1ZhbHVlVGV4dCgpIHsKLQkJcmV0dXJuIGdldENzc1RleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBBIGNvZGUgZGVmaW5pbmcgdGhlIHR5cGUgb2YgdGhlIHZhbHVlIGFzIGRlZmluZWQgYWJvdmUuCi0JICovCi0JcHVibGljIHNob3J0IGdldENzc1ZhbHVlVHlwZSgpIHsKLQkJaWYgKGdldFByaW1pdGl2ZVR5cGUoKSA9PSBDU1NfSU5IRVJJVF9QUklNSVRJVkUpIHsKLQkJCXJldHVybiBDU1NfSU5IRVJJVDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBDU1NfUFJJTUlUSVZFX1ZBTFVFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgYSBmbG9hdCB2YWx1ZSBpbiBhIHNwZWNpZmllZCB1bml0LiBJZiB0aGlzCi0JICogQ1NTIHZhbHVlIGRvZXNuJ3QgY29udGFpbiBhIGZsb2F0IHZhbHVlIG9yIGNhbid0IGJlIGNvbnZlcnRlZCBpbnRvIHRoZQotCSAqIHNwZWNpZmllZCB1bml0LCBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gaXMgcmFpc2VkLgotCSAqIAotCSAqIEBwYXJhbSB1bml0VHlwZQotCSAqICAgICAgICAgICAgQSB1bml0IGNvZGUgdG8gZ2V0IHRoZSBmbG9hdCB2YWx1ZS4gVGhlIHVuaXQgY29kZSBjYW4gb25seQotCSAqICAgICAgICAgICAgYmUgYSBmbG9hdCB1bml0IHR5cGUgKGkuZS4gPGNvZGU+Q1NTX05VTUJFUjwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfUEVSQ0VOVEFHRTwvY29kZT4sPGNvZGU+Q1NTX0VNUzwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfRVhTPC9jb2RlPiw8Y29kZT5DU1NfUFg8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0NNPC9jb2RlPiw8Y29kZT5DU1NfTU08L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0lOPC9jb2RlPiw8Y29kZT5DU1NfUFQ8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX1BDPC9jb2RlPiw8Y29kZT5DU1NfREVHPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19SQUQ8L2NvZGU+LDxjb2RlPkNTU19HUkFEPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19NUzwvY29kZT4sPGNvZGU+Q1NTX1M8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0haPC9jb2RlPiw8Y29kZT5DU1NfS0haPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19ESU1FTlNJT048L2NvZGU+KS4KLQkgKiBAcmV0dXJuIFRoZSBmbG9hdCB2YWx1ZSBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0FDQ0VTU19FUlI6IFJhaXNlZCBpZiB0aGUgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiAgICAgICAgICAgICAgICBjb250YWluIGEgZmxvYXQgdmFsdWUgb3IgaWYgdGhlIGZsb2F0IHZhbHVlIGNhbid0IGJlCi0JICogICAgICAgICAgICAgICAgY29udmVydGVkIGludG8gdGhlIHNwZWNpZmllZCB1bml0LgotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRGbG9hdFZhbHVlKHNob3J0IHVuaXRUeXBlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc3dpdGNoIChmUHJpbWl0aXZlVHlwZSkgewotCQkJY2FzZSBDU1NfTlVNQkVSIDoKLQkJCWNhc2UgQ1NTX1BFUkNFTlRBR0UgOgotCQkJY2FzZSBDU1NfRU1TIDoKLQkJCWNhc2UgQ1NTX0VYUyA6Ci0JCQljYXNlIENTU19QWCA6Ci0JCQljYXNlIENTU19DTSA6Ci0JCQljYXNlIENTU19NTSA6Ci0JCQljYXNlIENTU19JTiA6Ci0JCQljYXNlIENTU19QVCA6Ci0JCQljYXNlIENTU19QQyA6Ci0JCQljYXNlIENTU19ERUcgOgotCQkJY2FzZSBDU1NfUkFEIDoKLQkJCWNhc2UgQ1NTX0dSQUQgOgotCQkJY2FzZSBDU1NfTVMgOgotCQkJY2FzZSBDU1NfUyA6Ci0JCQljYXNlIENTU19IWiA6Ci0JCQljYXNlIENTU19LSFogOgotCQkJY2FzZSBDU1NfRElNRU5TSU9OIDoKLQkJCWNhc2UgQ1NTX0lOVEVHRVIgOgotCQkJY2FzZSBDU1NfSEFTSCA6Ci0JCQkJcmV0dXJuIGZGbG9hdFZhbHVlOwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9BQ0NFU1NfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMjAwMS8wMS8xNwotCSAqIDEyOjEyOjE4KQotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBQUklNSVRJVkVWQUxVRV9OT0RFOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSBjb25zdGFudHMgc3BlY2lmaWVkIGFib3ZlLgotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRQcmltaXRpdmVUeXBlKCkgewotCQlyZXR1cm4gZlByaW1pdGl2ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIFJlY3QgdmFsdWUuIElmIHRoaXMgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiBjb250YWluIGEgcmVjdCB2YWx1ZSwgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IGlzIHJhaXNlZC4KLQkgKiBNb2RpZmljYXRpb24gdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgcHJvcGVydHkgY2FuIGJlIGFjaGlldmVkIHVzaW5nCi0JICogdGhlIDxjb2RlPlJlY3Q8L2NvZGU+IGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBSZWN0IHZhbHVlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9BQ0NFU1NfRVJSOiBSYWlzZWQgaWYgdGhlIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogICAgICAgICAgICAgICAgY29udGFpbiBhIFJlY3QgdmFsdWUuIChlLmcuIHRoaXMgaXMgbm90Ci0JICogICAgICAgICAgICAgICAgPGNvZGU+Q1NTX1JFQ1Q8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgUmVjdCBnZXRSZWN0VmFsdWUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9BQ0NFU1NfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSBSR0IgY29sb3IuIElmIHRoaXMgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiBjb250YWluIGEgUkdCIGNvbG9yIHZhbHVlLCBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gaXMgcmFpc2VkLgotCSAqIE1vZGlmaWNhdGlvbiB0byB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBwcm9wZXJ0eSBjYW4gYmUgYWNoaWV2ZWQgdXNpbmcKLQkgKiB0aGUgPGNvZGU+UkdCQ29sb3I8L2NvZGU+IGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBSR0IgY29sb3IgdmFsdWUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0FDQ0VTU19FUlI6IFJhaXNlZCBpZiB0aGUgYXR0YWNoZWQgcHJvcGVydHkKLQkgKiAgICAgICAgICAgICAgICBjYW4ndCByZXR1cm4gYSBSR0IgY29sb3IgdmFsdWUgKGUuZy4gdGhpcyBpcyBub3QKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5DU1NfUkdCQ09MT1I8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgUkdCQ29sb3IgZ2V0UkdCQ29sb3JWYWx1ZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX0FDQ0VTU19FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIHN0cmluZyB2YWx1ZS4gSWYgdGhlIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogY29udGFpbiBhIHN0cmluZyB2YWx1ZSwgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IGlzIHJhaXNlZC4gU29tZQotCSAqIHByb3BlcnRpZXMgKGxpa2UgJ2ZvbnQtZmFtaWx5JyBvciAndm9pY2UtZmFtaWx5JykgY29udmVydCBhIHdoaXRlc3BhY2UKLQkgKiBzZXBhcmF0ZWQgbGlzdCBvZiBpZGVudHMgdG8gYSBzdHJpbmcuCi0JICogCi0JICogQHJldHVybiBUaGUgc3RyaW5nIHZhbHVlIGluIHRoZSBjdXJyZW50IHVuaXQuIFRoZSBjdXJyZW50Ci0JICogICAgICAgICA8Y29kZT5wcmltaXRpdmVUeXBlPC9jb2RlPiBjYW4gb25seSBiZSBhIHN0cmluZyB1bml0IHR5cGUKLQkgKiAgICAgICAgIChpLmUuIDxjb2RlPkNTU19TVFJJTkc8L2NvZGU+LDxjb2RlPkNTU19VUkk8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+Q1NTX0lERU5UPC9jb2RlPiBhbmQgPGNvZGU+Q1NTX0FUVFI8L2NvZGU+KS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBDU1MgdmFsdWUgZG9lc24ndAotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW4gYSBzdHJpbmcgdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmdWYWx1ZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzd2l0Y2ggKGZQcmltaXRpdmVUeXBlKSB7Ci0JCQljYXNlIENTU19TVFJJTkcgOgotCQkJY2FzZSBDU1NfVVJJIDoKLQkJCWNhc2UgQ1NTX0lERU5UIDoKLQkJCWNhc2UgQ1NTX0FUVFIgOgotCQkJY2FzZSBDU1NfVVJBTkdFIDoKLQkJCWNhc2UgQ1NTX0ZPUk1BVCA6Ci0JCQljYXNlIENTU19MT0NBTCA6Ci0JCQljYXNlIENTU19IQVNIIDoKLQkJCWNhc2UgQ1NTX0NPTU1BIDoKLQkJCWNhc2UgQ1NTX1NMQVNIIDoKLQkJCWNhc2UgQ1NTX0lOSEVSSVRfUFJJTUlUSVZFIDoKLQkJCQlyZXR1cm4gZlN0cmluZ1ZhbHVlOwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9BQ0NFU1NfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5VmFsdWVDaGFuZ2VkKFN0cmluZyBvbGRWYWx1ZSkgewotCQkvLyBmb3IgbW9kZWwKLQkJSUNTU0RvY3VtZW50IGRvYyA9IGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ1NTTW9kZWxJbXBsIG1vZGVsID0gKENTU01vZGVsSW1wbCkgZG9jLmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC52YWx1ZUNoYW5nZWQodGhpcywgb2xkVmFsdWUpOwotCi0JCS8vIGZvciBhZGFwdGVycwotCQlub3RpZnkoQ0hBTkdFLCBuZXcgU2hvcnQoZlByaW1pdGl2ZVR5cGUpLCBudWxsLCBudWxsLCBnZXRTdGFydE9mZnNldCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBIG1ldGhvZCB0byBzZXQgdGhlIGZsb2F0IHZhbHVlIHdpdGggYSBzcGVjaWZpZWQgdW5pdC4gSWYgdGhlIHByb3BlcnR5Ci0JICogYXR0YWNoZWQgd2l0aCB0aGlzIHZhbHVlIGNhbiBub3QgYWNjZXB0IHRoZSBzcGVjaWZpZWQgdW5pdCBvciB0aGUgZmxvYXQKLQkgKiB2YWx1ZSwgdGhlIHZhbHVlIHdpbGwgYmUgdW5jaGFuZ2VkIGFuZCBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4KLQkgKiB3aWxsIGJlIHJhaXNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gdW5pdFR5cGUKLQkgKiAgICAgICAgICAgIEEgdW5pdCBjb2RlIGFzIGRlZmluZWQgYWJvdmUuIFRoZSB1bml0IGNvZGUgY2FuIG9ubHkgYmUgYQotCSAqICAgICAgICAgICAgZmxvYXQgdW5pdCB0eXBlIChpLmUuIDxjb2RlPkNTU19OVU1CRVI8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX1BFUkNFTlRBR0U8L2NvZGU+LDxjb2RlPkNTU19FTVM8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0VYUzwvY29kZT4sPGNvZGU+Q1NTX1BYPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19DTTwvY29kZT4sPGNvZGU+Q1NTX01NPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19JTjwvY29kZT4sPGNvZGU+Q1NTX1BUPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19QQzwvY29kZT4sPGNvZGU+Q1NTX0RFRzwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfUkFEPC9jb2RlPiw8Y29kZT5DU1NfR1JBRDwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfTVM8L2NvZGU+LDxjb2RlPkNTU19TPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19IWjwvY29kZT4sPGNvZGU+Q1NTX0tIWjwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfRElNRU5TSU9OPC9jb2RlPikuCi0JICogQHBhcmFtIGZsb2F0VmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgZmxvYXQgdmFsdWUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0FDQ0VTU19FUlI6IFJhaXNlZCBpZiB0aGUgYXR0YWNoZWQgcHJvcGVydHkKLQkgKiAgICAgICAgICAgICAgICBkb2Vzbid0IHN1cHBvcnQgdGhlIGZsb2F0IHZhbHVlIG9yIHRoZSB1bml0IHR5cGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmxvYXRWYWx1ZShzaG9ydCB1bml0VHlwZSwgZmxvYXQgZmxvYXRWYWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXN3aXRjaCAodW5pdFR5cGUpIHsKLQkJCWNhc2UgQ1NTX05VTUJFUiA6Ci0JCQljYXNlIENTU19QRVJDRU5UQUdFIDoKLQkJCWNhc2UgQ1NTX0VNUyA6Ci0JCQljYXNlIENTU19FWFMgOgotCQkJY2FzZSBDU1NfUFggOgotCQkJY2FzZSBDU1NfQ00gOgotCQkJY2FzZSBDU1NfTU0gOgotCQkJY2FzZSBDU1NfSU4gOgotCQkJY2FzZSBDU1NfUFQgOgotCQkJY2FzZSBDU1NfUEMgOgotCQkJY2FzZSBDU1NfREVHIDoKLQkJCWNhc2UgQ1NTX1JBRCA6Ci0JCQljYXNlIENTU19HUkFEIDoKLQkJCWNhc2UgQ1NTX01TIDoKLQkJCWNhc2UgQ1NTX1MgOgotCQkJY2FzZSBDU1NfSFogOgotCQkJY2FzZSBDU1NfS0haIDoKLQkJCWNhc2UgQ1NTX0RJTUVOU0lPTiA6Ci0JCQljYXNlIENTU19JTlRFR0VSIDoKLQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBnZXRDU1NWYWx1ZVRleHQoKTsKLQkJCQlmUHJpbWl0aXZlVHlwZSA9IHVuaXRUeXBlOwotCQkJCWZGbG9hdFZhbHVlID0gZmxvYXRWYWx1ZTsKLQkJCQlub3RpZnlWYWx1ZUNoYW5nZWQob2xkVmFsdWUpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9BQ0NFU1NfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBtZXRob2QgdG8gc2V0IHRoZSBzdHJpbmcgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIHVuaXQuIElmIHRoZQotCSAqIHByb3BlcnR5IGF0dGFjaGVkIHRvIHRoaXMgdmFsdWUgY2FuJ3QgYWNjZXB0IHRoZSBzcGVjaWZpZWQgdW5pdCBvciB0aGUKLQkgKiBzdHJpbmcgdmFsdWUsIHRoZSB2YWx1ZSB3aWxsIGJlIHVuY2hhbmdlZCBhbmQgYQotCSAqIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSByYWlzZWQuCi0JICogCi0JICogQHBhcmFtIHN0cmluZ1R5cGUKLQkgKiAgICAgICAgICAgIEEgc3RyaW5nIGNvZGUgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIHN0cmluZyBjb2RlIGNhbiBvbmx5IGJlCi0JICogICAgICAgICAgICBhIHN0cmluZyB1bml0IHR5cGUgKGkuZS4gPGNvZGU+Q1NTX1NUUklORzwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfVVJJPC9jb2RlPiw8Y29kZT5DU1NfSURFTlQ8L2NvZGU+LCBhbmQKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19BVFRSPC9jb2RlPikuCi0JICogQHBhcmFtIHN0cmluZ1ZhbHVlCi0JICogICAgICAgICAgICBUaGUgbmV3IHN0cmluZyB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBDU1MgdmFsdWUgZG9lc24ndAotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW4gYSBzdHJpbmcgdmFsdWUgb3IgaWYgdGhlIHN0cmluZyB2YWx1ZSBjYW4ndCBiZQotCSAqICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgdW5pdC4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJpbmdWYWx1ZShzaG9ydCBzdHJpbmdUeXBlLCBTdHJpbmcgc3RyaW5nVmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzd2l0Y2ggKHN0cmluZ1R5cGUpIHsKLQkJCWNhc2UgQ1NTX1NUUklORyA6Ci0JCQljYXNlIENTU19VUkkgOgotCQkJY2FzZSBDU1NfSURFTlQgOgotCQkJY2FzZSBDU1NfQVRUUiA6Ci0JCQljYXNlIENTU19VUkFOR0UgOgotCQkJY2FzZSBDU1NfRk9STUFUIDoKLQkJCWNhc2UgQ1NTX0xPQ0FMIDoKLQkJCWNhc2UgQ1NTX0hBU0ggOgotCQkJY2FzZSBDU1NfQ09NTUEgOgotCQkJY2FzZSBDU1NfU0xBU0ggOgotCQkJY2FzZSBDU1NfSU5IRVJJVF9QUklNSVRJVkUgOgotCQkJCVN0cmluZyBvbGRWYWx1ZSA9IGdldENTU1ZhbHVlVGV4dCgpOwotCQkJCWZQcmltaXRpdmVUeXBlID0gc3RyaW5nVHlwZTsKLQkJCQlmU3RyaW5nVmFsdWUgPSBzdHJpbmdWYWx1ZTsKLQkJCQlub3RpZnlWYWx1ZUNoYW5nZWQob2xkVmFsdWUpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9BQ0NFU1NfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMjAwMS8wMS8yNAotCSAqIDE1OjA2OjI1KQotCSAqIAotCSAqIEBwYXJhbSBmbG9hdFZhbHVlCi0JICogICAgICAgICAgICBmbG9hdAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShmbG9hdCBmbG9hdFZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0RmxvYXRWYWx1ZShnZXRQcmltaXRpdmVUeXBlKCksIGZsb2F0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDIwMDEvMDEvMjQKLQkgKiAxNTowNjoyNSkKLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5nVmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoamF2YS5sYW5nLlN0cmluZyBzdHJpbmdWYWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldFN0cmluZ1ZhbHVlKGdldFByaW1pdGl2ZVR5cGUoKSwgc3RyaW5nVmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUmVnaW9uQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1JlZ2lvbkNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTY5ZTkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUmVnaW9uQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ1NTUmVnaW9uQ29udGFpbmVyIGV4dGVuZHMgQ1NTTm9kZUltcGwgewotCi0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBmRmlyc3RSZWdpb24gPSBudWxsOwotCXByaXZhdGUgSVRleHRSZWdpb24gZkxhc3RSZWdpb24gPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmUGFyZW50UmVnaW9uID0gbnVsbDsKLQotCS8qKgotCSAqIENTU1JlZ2lvbkNvbnRhaW5lciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU1JlZ2lvbkNvbnRhaW5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NSZWdpb25Db250YWluZXIoQ1NTUmVnaW9uQ29udGFpbmVyIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDc3NUZXh0KCkgewotCQlpZiAoZkZpcnN0UmVnaW9uID09IG51bGwgfHwgZkxhc3RSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBnZW5lcmF0ZVNvdXJjZSgpOwotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZlBhcmVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJvb2xlYW4gYkluID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gY3VycmVudCA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKGJJbikgewotCQkJCXNvdXJjZS5hcHBlbmQoZlBhcmVudFJlZ2lvbi5nZXRUZXh0KGN1cnJlbnQpKTsKLQkJCQlpZiAoY3VycmVudCA9PSBmTGFzdFJlZ2lvbikKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoY3VycmVudCA9PSBmRmlyc3RSZWdpb24pIHsKLQkJCQkJYkluID0gdHJ1ZTsKLQkJCQkJc291cmNlLmFwcGVuZChmUGFyZW50UmVnaW9uLmdldFRleHQoY3VycmVudCkpOwotCQkJCQlpZiAoY3VycmVudCA9PSBmTGFzdFJlZ2lvbikKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBzb3VyY2UudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldExhc3RSZWdpb24oKTsKLQkJaWYgKCEocmVnaW9uID09IG51bGwgfHwgZlBhcmVudFJlZ2lvbiA9PSBudWxsKSkgewotCQkJcmVzdWx0ID0gZlBhcmVudFJlZ2lvbi5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBmUGFyZW50UmVnaW9uOwotCX0KLQotCUlUZXh0UmVnaW9uIGdldEZpcnN0UmVnaW9uKCkgewotCQlyZXR1cm4gZkZpcnN0UmVnaW9uOwotCX0KLQotCUlUZXh0UmVnaW9uIGdldExhc3RSZWdpb24oKSB7Ci0JCXJldHVybiBmTGFzdFJlZ2lvbjsKLQl9Ci0KLQlJVGV4dFJlZ2lvbiBnZXRSZWdpb24oaW50IGluZGV4KSB7Ci0JCWlmIChnZXRGaXJzdFJlZ2lvbigpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmUGFyZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCWlmIChyZWdpb25zLmdldChpKSA9PSBnZXRGaXJzdFJlZ2lvbigpKSB7Ci0JCQkJaWYgKGkgKyBpbmRleCA8IHJlZ2lvbnMuc2l6ZSgpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHRhcmdldCA9IHJlZ2lvbnMuZ2V0KGkgKyBpbmRleCk7Ci0JCQkJCWlmICh0YXJnZXQuZ2V0U3RhcnQoKSA8PSBnZXRMYXN0UmVnaW9uKCkuZ2V0U3RhcnQoKSkKLQkJCQkJCXJldHVybiB0YXJnZXQ7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldFJlZ2lvbkNvdW50KCkgewotCQl2YWxpZGF0ZVJhbmdlKCk7Ci0KLQkJaWYgKGdldEZpcnN0UmVnaW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlpZiAoZ2V0Rmlyc3RSZWdpb24oKSA9PSBnZXRMYXN0UmVnaW9uKCkpCi0JCQlyZXR1cm4gMTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmUGFyZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gY3VycmVudCA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKGogIT0gMCB8fCBjdXJyZW50ID09IGdldEZpcnN0UmVnaW9uKCkpCi0JCQkJaisrOwotCQkJaWYgKGN1cnJlbnQgPT0gZ2V0TGFzdFJlZ2lvbigpKQotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBqOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRGaXJzdFJlZ2lvbigpOwotCQlpZiAoIShyZWdpb24gPT0gbnVsbCB8fCBmUGFyZW50UmVnaW9uID09IG51bGwpKSB7Ci0JCQlyZXN1bHQgPSBmUGFyZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlJVGV4dFJlZ2lvbiBzZXRGaXJzdFJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJdGhpcy5mRmlyc3RSZWdpb24gPSByZWdpb247Ci0JCXJldHVybiByZWdpb247Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlJVGV4dFJlZ2lvbiBzZXRMYXN0UmVnaW9uKElUZXh0UmVnaW9uIGxhc3RSZWdpb24pIHsKLQkJdGhpcy5mTGFzdFJlZ2lvbiA9IGxhc3RSZWdpb247Ci0JCXJldHVybiBsYXN0UmVnaW9uOwotCX0KLQotCXZvaWQgc2V0UmFuZ2VSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnRSZWdpb24sIElUZXh0UmVnaW9uIGZpcnN0UmVnaW9uLCBJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uKSB7Ci0JCXRoaXMuZlBhcmVudFJlZ2lvbiA9IHBhcmVudFJlZ2lvbjsKLQkJdGhpcy5mRmlyc3RSZWdpb24gPSBmaXJzdFJlZ2lvbjsKLQkJdGhpcy5mTGFzdFJlZ2lvbiA9IGxhc3RSZWdpb247Ci0KLQkJaWYgKGZpcnN0UmVnaW9uID09IG51bGwgJiYgbGFzdFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlzZXRGaXJzdFJlZ2lvbihudWxsKTsKLQkJCXNldExhc3RSZWdpb24obnVsbCk7Ci0JCX0KLQkJZWxzZSB7IC8vIHJhbmdlIHZhbGlkYXRpb24KLQkJCXZhbGlkYXRlUmFuZ2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVJhbmdlKCkgewotCQlib29sZWFuIGJNb2RpZmllZCA9IGZhbHNlOwotCi0JCWlmICh0aGlzLmZGaXJzdFJlZ2lvbiAhPSBudWxsIHx8IHRoaXMuZkxhc3RSZWdpb24gIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZkZpcnN0UmVnaW9uID09IG51bGwpIHsKLQkJCQl0aGlzLmZGaXJzdFJlZ2lvbiA9IHRoaXMuZkxhc3RSZWdpb247Ci0JCQkJYk1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRoaXMuZkxhc3RSZWdpb24gPT0gbnVsbCkgewotCQkJCXRoaXMuZkxhc3RSZWdpb24gPSB0aGlzLmZGaXJzdFJlZ2lvbjsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAodGhpcy5mRmlyc3RSZWdpb24uZ2V0U3RhcnQoKSA+IHRoaXMuZkxhc3RSZWdpb24uZ2V0U3RhcnQoKSkgewotCQkJCS8vIG5lZWQgdG8gc3dhcCBmaXJzdCBmb3IgbGFzdAotCQkJCUlUZXh0UmVnaW9uIHJlZyA9IGZGaXJzdFJlZ2lvbjsKLQkJCQlmRmlyc3RSZWdpb24gPSBmTGFzdFJlZ2lvbjsKLQkJCQlmTGFzdFJlZ2lvbiA9IHJlZzsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBiTW9kaWZpZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlRGVjbENvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlRGVjbENvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDM4MTY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZURlY2xDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uOwotCi0KLS8qKgotICogCi0gKi8KLWFic3RyYWN0IGNsYXNzIENTU1J1bGVEZWNsQ29udGFpbmVyIGV4dGVuZHMgQ1NTUnVsZUltcGwgewotCi0JLyoqCi0JICogQ1NTUnVsZURlY2xDb250YWluZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NSdWxlRGVjbENvbnRhaW5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDU1NSdWxlRGVjbENvbnRhaW5lciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqLwotCUNTU1J1bGVEZWNsQ29udGFpbmVyKENTU1J1bGVEZWNsQ29udGFpbmVyIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JYWJzdHJhY3QgU3RyaW5nIGV4dHJhY3RQcmVTdHJpbmcoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVEZWNsYXJhdGlvbiBnZXRTdHlsZSgpIHsKLQotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xhcmF0aW9uKQotCQkJCXJldHVybiAoQ1NTU3R5bGVEZWNsYXJhdGlvbikgbm9kZTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJlNmUzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1J1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVTaGVldDsKLQotCi0vKioKLSAqIAotICovCi1hYnN0cmFjdCBjbGFzcyBDU1NSdWxlSW1wbCBleHRlbmRzIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBpbXBsZW1lbnRzIENTU1J1bGUgewotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQ1NTUnVsZUltcGwoQ1NTUnVsZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGlzIHJ1bGUgaXMgY29udGFpbmVkIGluc2lkZSBhbm90aGVyIHJ1bGUgKGUuZy4gYSBzdHlsZSBydWxlIGluc2lkZQotCSAqIGFuCi0JICogCi0JICogQG1lZGlhIGJsb2NrKSwgdGhpcyBpcyB0aGUgY29udGFpbmluZyBydWxlLiBJZiB0aGlzIHJ1bGUgaXMgbm90IG5lc3RlZAotCSAqICAgICAgICBpbnNpZGUgYW55IG90aGVyIHJ1bGVzLCB0aGlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIENTU1J1bGUgZ2V0UGFyZW50UnVsZSgpIHsKLQkJSUNTU05vZGUgcnVsZSA9IGdldFBhcmVudE5vZGUoKTsKLQotCQkvLyBwYXJlbnQgcnVsZSBpcyB1c2VkIG9ubHkgaWYgcGFyZW50IGlzIG1lZGlhIHJ1bGUKLQkJaWYgKHJ1bGUgaW5zdGFuY2VvZiBDU1NNZWRpYVJ1bGVJbXBsKQotCQkJcmV0dXJuIChDU1NSdWxlKSBydWxlOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSBzdHlsZSBzaGVldCB0aGF0IGNvbnRhaW5zIHRoaXMgcnVsZS4KLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVTaGVldCBnZXRQYXJlbnRTdHlsZVNoZWV0KCkgewotCQlJQ1NTTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0eWxlU2hlZXRJbXBsKQotCQkJCXJldHVybiAoQ1NTU3R5bGVTaGVldCkgcGFyZW50OwotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgcnVsZSwgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQKLQkgKiBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBjYXN0IGRvd24gZnJvbSBhbgotCSAqIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5DU1NSdWxlPC9jb2RlPiBpbnRlcmZhY2UgdG8gdGhlIHNwZWNpZmljCi0JICogZGVyaXZlZCBpbnRlcmZhY2UgaW1wbGllZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4uCi0JICovCi0JcHVibGljIGFic3RyYWN0IHNob3J0IGdldFR5cGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1Byb3BlcnRpZXMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1J1bGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWYxNWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZUxpc3Q7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NSdWxlTGlzdEltcGwgZXh0ZW5kcyBBYnN0cmFjdENTU05vZGVMaXN0IGltcGxlbWVudHMgQ1NTUnVsZUxpc3QgewotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTUnVsZUxpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gcmV0cmlldmUgYSBDU1MgcnVsZSBieSBvcmRpbmFsIGluZGV4LiBUaGUgb3JkZXIgaW4gdGhpcwotCSAqIGNvbGxlY3Rpb24gcmVwcmVzZW50cyB0aGUgb3JkZXIgb2YgdGhlIHJ1bGVzIGluIHRoZSBDU1Mgc3R5bGUgc2hlZXQuIElmCi0JICogaW5kZXggaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcnVsZXMgaW4gdGhlIGxpc3QsIHRoaXMKLQkgKiByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleEluZGV4Ci0JICogICAgICAgICAgICBpbnRvIHRoZSBjb2xsZWN0aW9uCi0JICogQHJldHVybiBUaGUgc3R5bGUgcnVsZSBhdCB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+IHBvc2l0aW9uIGluIHRoZQotCSAqICAgICAgICAgPGNvZGU+Q1NTUnVsZUxpc3Q8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGF0IGlzCi0JICogICAgICAgICBub3QgYSB2YWxpZCBpbmRleC4KLQkgKi8KLQlwdWJsaWMgQ1NTUnVsZSBpdGVtKGludCBpbmRleCkgewotCQlyZXR1cm4gKENTU1J1bGUpIGl0ZW1JbXBsKGluZGV4KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjZkZDQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNlbGVjdG9yQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JDb21iaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2ltcGxlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLk5hbWVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU1NlbGVjdG9yIGltcGxlbWVudHMgSUNTU1NlbGVjdG9yIHsKLQotCXByaXZhdGUgaW50IGZTcGVjaWZpY2l0eSA9IC0xOwotCXByaXZhdGUgU3RyaW5nIGZDYWNoZWRTdHJpbmcgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmVG9rZW5zID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZkl0ZW1zID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZlBhcnNlRXJyb3JzID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZk5hbWVFcnJvcnMgPSBudWxsOwotCi0JQ1NTU2VsZWN0b3IoTGlzdCB0b2tlbnMpIHsKLQkJZlRva2VucyA9IG5ldyBBcnJheUxpc3QodG9rZW5zKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJaWYgKG9iaiA9PSBudWxsIHx8IHRoaXMuZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlDU1NTZWxlY3RvciBmb3JlaWduID0gKENTU1NlbGVjdG9yKSBvYmo7Ci0KLQkJLy8gaWYgKGZTcGVjaWZpY2l0eSAhPSBmb3JlaWduLmZTcGVjaWZpY2l0eSkgcmV0dXJuIGZhbHNlOwotCi0JCWlmIChnZXRMZW5ndGgoKSAhPSBmb3JlaWduLmdldExlbmd0aCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKCFnZXRJdGVtKGkpLmVxdWFscyhmb3JlaWduLmdldEl0ZW0oaSkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBJQ1NTU2VsZWN0b3JJdGVtIGdldEl0ZW0oaW50IGluZGV4KSB7Ci0JCWlmIChmSXRlbXMgPT0gbnVsbCkgewotCQkJZkl0ZW1zID0gcGFyc2VTZWxlY3RvcihmVG9rZW5zKTsKLQkJfQotCQlpZiAoZkl0ZW1zICE9IG51bGwgJiYgMCA8PSBpbmRleCAmJiBpbmRleCA8IGZJdGVtcy5zaXplKCkpIHsKLQkJCXJldHVybiAoSUNTU1NlbGVjdG9ySXRlbSkgZkl0ZW1zLmdldChpbmRleCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGdldEl0ZXJhdG9yKCkgewotCQlpZiAoZkl0ZW1zID09IG51bGwpIHsKLQkJCWZJdGVtcyA9IHBhcnNlU2VsZWN0b3IoZlRva2Vucyk7Ci0JCX0KLQkJcmV0dXJuIChmSXRlbXMgIT0gbnVsbCkgPyBmSXRlbXMuaXRlcmF0b3IoKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJaWYgKGZJdGVtcyA9PSBudWxsKSB7Ci0JCQlmSXRlbXMgPSBwYXJzZVNlbGVjdG9yKGZUb2tlbnMpOwotCQl9Ci0JCXJldHVybiAoZkl0ZW1zICE9IG51bGwpID8gZkl0ZW1zLnNpemUoKSA6IDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJpdmF0ZSBFbGVtZW50IGdldFBhcmVudEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gKEVsZW1lbnQpIGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGNhc3QgZXJyb3Igb3IgbnVsbCBwb2ludGVyIC4uLgotCQkJZWxlbWVudCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJpdmF0ZSBFbGVtZW50IGdldFByZXZpb3VzRWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJRWxlbWVudCBwID0gbnVsbDsKLQkJZm9yIChOb2RlIG5vZGUgPSBlbGVtZW50LmdldFByZXZpb3VzU2libGluZygpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJcCA9IChFbGVtZW50KSBub2RlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBwOwotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZSBhIHNlbGVjdG9yJ3Mgc3BlY2lmaWNpdHkgYSA9IHRoZSBudW1iZXIgb2YgSUQgYXR0cmlidXRlcyBpbgotCSAqIHRoZSBzZWxlY3RvciBiID0gdGhlIG51bWJlciBvZiBvdGhlciBhdHRyaWJ1dGVzIGFuZCBwc2V1ZG8tY2xhc3NlcyBpbgotCSAqIHRoZSBzZWxlY3RvciBjID0gdGhlIG51bWJlciBvZiBlbGVtZW50IG5hbWVzIGluIHRoZSBzZWxlY3RvciAoaWdub3JlCi0JICogcHNldWRvLWVsZW1lbnRzKSBDb25jYXRlbmF0aW5nIHRoZSB0aHJlZSBudW1iZXJzIGEtYi1jIChpbiBhIG51bWJlcgotCSAqIHN5c3RlbSB3aXRoIGEgbGFyZ2UgYmFzZSkgZ2l2ZXMgdGhlIHNwZWNpZmljaXR5LgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTcGVjaWZpY2l0eSgpIHsKLQkJaWYgKGZTcGVjaWZpY2l0eSA8IDApIHsKLQkJCWludCBuSURzID0gMDsKLQkJCWludCBuQXR0cmlidXRlcyA9IDA7Ci0JCQlpbnQgbkVsZW1lbnRzID0gMDsKLQkJCUl0ZXJhdG9yIGkgPSBnZXRJdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJSUNTU1NlbGVjdG9ySXRlbSBpdGVtID0gKElDU1NTZWxlY3Rvckl0ZW0pIGkubmV4dCgpOwotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ1NTU2ltcGxlU2VsZWN0b3IpIHsKLQkJCQkJQ1NTU2ltcGxlU2VsZWN0b3Igc2VsZWN0b3IgPSAoQ1NTU2ltcGxlU2VsZWN0b3IpIGl0ZW07Ci0JCQkJCW5JRHMgKz0gc2VsZWN0b3IuZ2V0TnVtT2ZJRHMoKTsKLQkJCQkJbkF0dHJpYnV0ZXMgKz0gc2VsZWN0b3IuZ2V0TnVtT2ZBdHRyaWJ1dGVzKCk7Ci0JCQkJCW5BdHRyaWJ1dGVzICs9IHNlbGVjdG9yLmdldE51bU9mQ2xhc3NlcygpOwotCQkJCQluQXR0cmlidXRlcyArPSBzZWxlY3Rvci5nZXROdW1PZlBzZXVkb05hbWVzKCk7Ci0JCQkJCWlmICghc2VsZWN0b3IuaXNVbml2ZXJzYWwoKSkgewotCQkJCQkJbkVsZW1lbnRzKys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmU3BlY2lmaWNpdHkgPSBuSURzICogMTAwMDAgKyBuQXR0cmlidXRlcyAqIDEwMCArIG5FbGVtZW50czsKLQkJfQotCi0JCXJldHVybiBmU3BlY2lmaWNpdHk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCWlmIChmQ2FjaGVkU3RyaW5nID09IG51bGwpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlJdGVyYXRvciBpID0gZ2V0SXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUlDU1NTZWxlY3Rvckl0ZW0gaXRlbSA9IChJQ1NTU2VsZWN0b3JJdGVtKSBpLm5leHQoKTsKLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENTU1NlbGVjdG9yQ29tYmluYXRvcikgewotCQkJCQkvLyBJZiBpdGVtIGlzIERFU0NFTkRBTlQgY29tYmluYXRvciwgaXQgaXMganVzdCBzaW5nbGUKLQkJCQkJLy8gc3BhY2UuCi0JCQkJCS8vIFRoZW4sIHlvdSBkb250IGhhdmUgdG8gYXBwZW5kIHN0cmluZy4uCi0JCQkJCWlmICgoKENTU1NlbGVjdG9yQ29tYmluYXRvcikgaXRlbSkuZ2V0Q29tYmluYXRvclR5cGUoKSAhPSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkRFU0NFTkRBTlQpIHsKLQkJCQkJCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCQkJCQlidWYuYXBwZW5kKGl0ZW0uZ2V0U3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlidWYuYXBwZW5kKGl0ZW0uZ2V0U3RyaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJCWZDYWNoZWRTdHJpbmcgPSBidWYudG9TdHJpbmcoKTsKLQkJfQotCi0JCXJldHVybiBmQ2FjaGVkU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2gob3JnLnczYy5kb20uRWxlbWVudCBlbGVtZW50LCBqYXZhLmxhbmcuU3RyaW5nIHBzZXVkb05hbWUpIHsKLQkJRWxlbWVudCB0YXJnZXQgPSBlbGVtZW50OwotCQljaGFyIGNvbWJpbmF0b3JUeXBlID0gSUNTU1NlbGVjdG9yQ29tYmluYXRvci5VTktOT1dOOwotCQlFbGVtZW50IGNodW5rU3RhcnRFbGVtZW50ID0gbnVsbDsgLy8gZm9yIENISUxEIGFuZCBBREpBQ0VOVAotCQkJCQkJCQkJCQkvLyBjb21iaW5hdG9yCi0JCWludCBjaHVua1N0YXJ0SXRlbSA9IC0xOyAvLyBmb3IgQ0hJTEQgYW5kIEFESkFDRU5UIGNvbWJpbmF0b3IKLQkJaW50IG51bUl0ZW1zID0gZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGlJdGVtID0gbnVtSXRlbXMgLSAxOyBpSXRlbSA+PSAwOyBpSXRlbS0tKSB7Ci0JCQkvLyBDaGVjayBTZWxlY3RvciBJdGVtcwotCQkJSUNTU1NlbGVjdG9ySXRlbSBpdGVtID0gZ2V0SXRlbShpSXRlbSk7Ci0JCQlpZiAoaXRlbSBpbnN0YW5jZW9mIElDU1NTaW1wbGVTZWxlY3RvcikgewotCQkJCS8vIFNpbXBsZSBTZWxlY3RvcgotCQkJCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmICghbWF0Y2hFeGFjdGx5KChJQ1NTU2ltcGxlU2VsZWN0b3IpIGl0ZW0sIHRhcmdldCwgcHNldWRvTmFtZSkpIHsKLQkJCQkJc3dpdGNoIChjb21iaW5hdG9yVHlwZSkgewotCQkJCQkJY2FzZSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkRFU0NFTkRBTlQgOgotCQkJCQkJCWRvIHsKLQkJCQkJCQkJdGFyZ2V0ID0gZ2V0UGFyZW50RWxlbWVudCh0YXJnZXQpOwotCQkJCQkJCQlpZiAodGFyZ2V0ID09IG51bGwpCi0JCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJCXdoaWxlICghbWF0Y2hFeGFjdGx5KChJQ1NTU2ltcGxlU2VsZWN0b3IpIGl0ZW0sIHRhcmdldCwgcHNldWRvTmFtZSkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkNISUxEIDoKLQkJCQkJCWNhc2UgSUNTU1NlbGVjdG9yQ29tYmluYXRvci5BREpBQ0VOVCA6Ci0JCQkJCQkJaWYgKGNodW5rU3RhcnRFbGVtZW50ICE9IG51bGwgJiYgY2h1bmtTdGFydEVsZW1lbnQgIT0gZWxlbWVudCkgewotCQkJCQkJCQkvLyBwcmV2aW91cyBjb25iaW5hdG9yIG11c3QgYmUgREVTQ0VOREVOVC4KLQkJCQkJCQkJLy8gZ290byBwYXJlbnQKLQkJCQkJCQkJdGFyZ2V0ID0gZ2V0UGFyZW50RWxlbWVudChjaHVua1N0YXJ0RWxlbWVudCk7Ci0JCQkJCQkJCWlJdGVtID0gY2h1bmtTdGFydEl0ZW0gKyAxOwotCQkJCQkJCQljaHVua1N0YXJ0RWxlbWVudCA9IG51bGw7Ci0JCQkJCQkJCWNodW5rU3RhcnRJdGVtID0gLTE7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCS8vIG90aGVyIGNvbWJpbmF0b3JzIGFyZSBub3Qgc3VwcG9ydGVkIHlldC4KLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgSUNTU1NlbGVjdG9yQ29tYmluYXRvcikgewotCQkJCS8vIENvbWJpbmF0b3IgKCAiKyIsICI+IiwgIiAiLCAuLi4pCi0JCQkJaWYgKGlJdGVtID09IG51bUl0ZW1zIC0gMSkKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBsYXN0IGl0ZW0gaXMgY29tYmluYXRvcgotCi0JCQkJSUNTU1NlbGVjdG9yQ29tYmluYXRvciBzYyA9IChJQ1NTU2VsZWN0b3JDb21iaW5hdG9yKSBpdGVtOwotCQkJCWNvbWJpbmF0b3JUeXBlID0gc2MuZ2V0Q29tYmluYXRvclR5cGUoKTsKLQkJCQlzd2l0Y2ggKGNvbWJpbmF0b3JUeXBlKSB7Ci0JCQkJCWNhc2UgSUNTU1NlbGVjdG9yQ29tYmluYXRvci5ERVNDRU5EQU5UIDoKLQkJCQkJCXRhcmdldCA9IGdldFBhcmVudEVsZW1lbnQodGFyZ2V0KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElDU1NTZWxlY3RvckNvbWJpbmF0b3IuQ0hJTEQgOgotCQkJCQljYXNlIElDU1NTZWxlY3RvckNvbWJpbmF0b3IuQURKQUNFTlQgOgotCQkJCQkJaWYgKGNodW5rU3RhcnRFbGVtZW50ID09IG51bGwpIHsKLQkJCQkJCQljaHVua1N0YXJ0RWxlbWVudCA9IHRhcmdldDsKLQkJCQkJCQljaHVua1N0YXJ0SXRlbSA9IGlJdGVtICsgMTsgLy8gc2FmZSBiZWNhdXNlIHRoaXMKLQkJCQkJCQkJCQkJCQkJLy8gaXMgbm90IGEgbGFzdCBpdGVtLgotCQkJCQkJfQotCQkJCQkJaWYgKGNvbWJpbmF0b3JUeXBlID09IElDU1NTZWxlY3RvckNvbWJpbmF0b3IuQ0hJTEQpIHsKLQkJCQkJCQl0YXJnZXQgPSBnZXRQYXJlbnRFbGVtZW50KHRhcmdldCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQl0YXJnZXQgPSBnZXRQcmV2aW91c0VsZW1lbnQodGFyZ2V0KTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHdoYXQgaXMgdGhpcyBpdGVtID8/PwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkvLyBPSyB0aGlzIHNlbGVjdG9yIG1hY2hlcyB0aGUgZWxlbWVudC4KLQkJcmV0dXJuIHRydWU7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbWF0Y2hFeGFjdGx5KElDU1NTaW1wbGVTZWxlY3RvciBzZWxlY3RvciwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSkgewotCQlJU3R5bGVTZWxlY3RvckFkYXB0ZXIgYWRhcHRlciA9IChJU3R5bGVTZWxlY3RvckFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZWxlbWVudCkuZ2V0QWRhcHRlckZvcihJU3R5bGVTZWxlY3RvckFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5tYXRjaChzZWxlY3RvciwgZWxlbWVudCwgcHNldWRvTmFtZSk7Ci0JCX0KLQotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgaTsKLQkJU3RyaW5nIGtleTsKLQotCQkvLyBUT0RPOiBQc2V1ZG9OYW1lCi0KLQkJLy8gY2hlY2sgdGFnIG5hbWUKLQkJaWYgKCFzZWxlY3Rvci5pc1VuaXZlcnNhbCgpICYmICFlbGVtZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzKHNlbGVjdG9yLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gY2hlY2sgaWQKLQkJaSA9IHNlbGVjdG9yLmdldE51bU9mSURzKCk7Ci0JCWlmIChpID4gMCkgewotCQkJaWYgKGkgPiAxKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOy8vJE5PTi1OTFMtMSQKLQkJCWlmIChrZXkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoIXNlbGVjdG9yLmdldElEKDApLmVxdWFscyhrZXkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGNoZWNrIGNsYXNzCi0JCWkgPSBzZWxlY3Rvci5nZXROdW1PZkNsYXNzZXMoKTsKLQkJaWYgKGkgPiAwKSB7Ci0JCQlrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsvLyROT04tTkxTLTEkCi0JCQlpZiAoa2V5ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoa2V5KTsKLQkJCWZvciAoaSA9IGkgLSAxOyBpID49IDA7IGktLSkgewotCQkJCWJvb2xlYW4gb2sgPSBmYWxzZTsKLQkJCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQlpZiAoc2VsZWN0b3IuZ2V0Q2xhc3MoaSkuZXF1YWxzKHRva2VuaXplci5uZXh0VG9rZW4oKSkpIHsKLQkJCQkJCW9rID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghb2spCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIGF0dHJpYnV0ZXMKLQkJZm9yIChpID0gc2VsZWN0b3IuZ2V0TnVtT2ZBdHRyaWJ1dGVzKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc2VsZWN0b3IuZ2V0QXR0cmlidXRlKGkpLCAiPX58IFx0XHJcblxmIik7Ly8kTk9OLU5MUy0xJAotCQkJaW50IGNvdW50VG9rZW5zID0gdG9rZW5pemVyLmNvdW50VG9rZW5zKCk7Ci0JCQlpZiAoY291bnRUb2tlbnMgPiAwKSB7Ci0JCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQkJaWYgKGF0dHJWYWx1ZSA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKGNvdW50VG9rZW5zID4gMSkgewotCQkJCQlTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCI9IFx0XHJcblxmIik7Ly8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmdUb2tlbml6ZXIgYXR0clZhbHVlVG9rZW5pemVyID0gbnVsbDsKLQkJCQkJaWYgKHRva2VuLmVxdWFscygifiIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQkJYXR0clZhbHVlVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyVmFsdWUpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHRva2VuLmVxdWFscygifCIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQkJYXR0clZhbHVlVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyVmFsdWUsICItIik7Ly8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWlmIChhdHRyVmFsdWVUb2tlbml6ZXIgIT0gbnVsbCkgewotCQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCQl0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQkJCQlib29sZWFuIG9rID0gZmFsc2U7Ci0JCQkJCQkJd2hpbGUgKGF0dHJWYWx1ZVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCQkJaWYgKHRva2VuLmVxdWFscyhhdHRyVmFsdWVUb2tlbml6ZXIubmV4dFRva2VuKCkpKSB7Ci0JCQkJCQkJCQlvayA9IHRydWU7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIW9rKQotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoIWF0dHJWYWx1ZS5lcXVhbHModG9rZW4pKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgTGlzdCBwYXJzZVNlbGVjdG9yKExpc3QgdG9rZW5zKSB7Ci0JCUNTU1NlbGVjdG9yUGFyc2VyIHBhcnNlciA9IG5ldyBDU1NTZWxlY3RvclBhcnNlcih0b2tlbnMpOwotCQlMaXN0IHNlbGVjdG9yID0gcGFyc2VyLmdldFNlbGVjdG9yKCk7Ci0JCUl0ZXJhdG9yIGkgPSBwYXJzZXIuZ2V0RXJyb3JzKCk7Ci0JCWZQYXJzZUVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlmUGFyc2VFcnJvcnMuYWRkKGkubmV4dCgpKTsKLQkJfQotCQlyZXR1cm4gc2VsZWN0b3I7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldEVycm9ycygpIHsKLQkJaWYgKGZOYW1lRXJyb3JzID09IG51bGwpIHsKLQkJCWZOYW1lRXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSXRlcmF0b3IgaUl0ZW0gPSBnZXRJdGVyYXRvcigpOwotCQkJd2hpbGUgKGlJdGVtLmhhc05leHQoKSkgewotCQkJCUlDU1NTZWxlY3Rvckl0ZW0gaXRlbSA9IChJQ1NTU2VsZWN0b3JJdGVtKSBpSXRlbS5uZXh0KCk7Ci0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBJQ1NTU2ltcGxlU2VsZWN0b3IpIHsKLQkJCQkJaWYgKCEoKElDU1NTaW1wbGVTZWxlY3RvcikgaXRlbSkuaXNVbml2ZXJzYWwoKSkgewotCQkJCQkJU3RyaW5nIG5hbWUgPSAoKElDU1NTaW1wbGVTZWxlY3RvcikgaXRlbSkuZ2V0TmFtZSgpOwotCQkJCQkJaWYgKCFOYW1lVmFsaWRhdG9yLmlzVmFsaWQobmFtZSkpIHsKLQkJCQkJCQlmTmFtZUVycm9ycy5hZGQoaXRlbSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTGlzdCBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KGZQYXJzZUVycm9ycyk7Ci0JCWVycm9ycy5hZGRBbGwoZk5hbWVFcnJvcnMpOwotCQlyZXR1cm4gZXJyb3JzLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldFN0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNTU1NlbGVjdG9yI2dldEVycm9yQ291bnQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXJyb3JDb3VudCgpIHsKLQkJaW50IG5FcnJvcnMgPSAwOwotCQlJdGVyYXRvciBpID0gZ2V0RXJyb3JzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJbkVycm9ycysrOwotCQkJaS5uZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG5FcnJvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3RvckNvbWJpbmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JDb21iaW5hdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMTVhYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3RvckNvbWJpbmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvckNvbWJpbmF0b3I7Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU1NlbGVjdG9yQ29tYmluYXRvciBleHRlbmRzIENTU1NlbGVjdG9ySXRlbSBpbXBsZW1lbnRzIElDU1NTZWxlY3RvckNvbWJpbmF0b3IgewotCi0JY2hhciBmVHlwZSA9IElDU1NTZWxlY3RvckNvbWJpbmF0b3IuVU5LTk9XTjsKLQotCS8qKgotCSAqIENTU1NlbGVjdG9yQ29tYmluYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDU1NTZWxlY3RvckNvbWJpbmF0b3IoY2hhciB0eXBlKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldENvbWJpbmF0b3JUeXBlKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAob2JqID09IG51bGwgfHwgdGhpcy5nZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUNTU1NlbGVjdG9yQ29tYmluYXRvciBmb3JlaWduID0gKENTU1NlbGVjdG9yQ29tYmluYXRvcikgb2JqOwotCi0JCXJldHVybiAoZ2V0Q29tYmluYXRvclR5cGUoKSA9PSBmb3JlaWduLmdldENvbWJpbmF0b3JUeXBlKCkpOwotCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgY2hhciBnZXRDb21iaW5hdG9yVHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRJdGVtVHlwZSgpIHsKLQkJcmV0dXJuIENPTUJJTkFUT1I7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoZlR5cGUpOwotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0Jdm9pZCBzZXRDb21iaW5hdG9yVHlwZShjaGFyIHR5cGUpIHsKLQkJZlR5cGUgPSB0eXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JJdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9ySXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDM2NjYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JJdGVtOwotCi0vKioKLSAqIAotICovCi1hYnN0cmFjdCBjbGFzcyBDU1NTZWxlY3Rvckl0ZW0gaW1wbGVtZW50cyBJQ1NTU2VsZWN0b3JJdGVtIHsKLQotCS8qKgotCSAqIENTU1NlbGVjdG9ySXRlbSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDU1NTZWxlY3Rvckl0ZW0oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEl0ZW1UeXBlKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvckxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQyMzFmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NTZWxlY3Rvckxpc3RJbXBsIGltcGxlbWVudHMgSUNTU1NlbGVjdG9yTGlzdCB7Ci0KLQlwcml2YXRlIFN0cmluZyBmVGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNhY2hlZFN0cmluZyA9IG51bGw7IC8vIG5vcm1hbGl6ZWQgc3RyaW5nCi0JcHJpdmF0ZSBMaXN0IGZTZWxlY3RvcnMgPSBudWxsOwotCi0JcHVibGljIENTU1NlbGVjdG9yTGlzdEltcGwoU3RyaW5nIGNzc1RleHQpIHsKLQkJc3VwZXIoKTsKLQkJZlRleHQgPSBjc3NUZXh0OwotCQlwYXJzZVNlbGVjdG9yVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAob2JqID09IG51bGwgfHwgdGhpcy5nZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUNTU1NlbGVjdG9yTGlzdEltcGwgZm9yZWlnbiA9IChDU1NTZWxlY3Rvckxpc3RJbXBsKSBvYmo7Ci0KLQkJaWYgKGdldExlbmd0aCgpICE9IGZvcmVpZ24uZ2V0TGVuZ3RoKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoIWdldFNlbGVjdG9yKGkpLmVxdWFscyhmb3JlaWduLmdldFNlbGVjdG9yKGkpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIGdldFNlbGVjdG9ycygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGdldFNlbGVjdG9ycygpLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgSUNTU1NlbGVjdG9yIGdldFNlbGVjdG9yKGludCBpbmRleCkgewotCQlMaXN0IHNlbGVjdG9ycyA9IGdldFNlbGVjdG9ycygpOwotCQlpZiAoMCA8PSBpbmRleCAmJiBpbmRleCA8IHNlbGVjdG9ycy5zaXplKCkpIHsKLQkJCXJldHVybiAoSUNTU1NlbGVjdG9yKSBzZWxlY3RvcnMuZ2V0KGluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFNlbGVjdG9ycygpIHsKLQkJaWYgKGZTZWxlY3RvcnMgPT0gbnVsbCkgewotCQkJcGFyc2VTZWxlY3RvclRleHQoKTsKLQkJfQotCQlyZXR1cm4gZlNlbGVjdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJaWYgKGZDYWNoZWRTdHJpbmcgPT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJvb2xlYW4gYkZpcnN0ID0gdHJ1ZTsKLQkJCS8vIGdyb3VwcyBpcyBsaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCBzZWxlY3RvcnMKLQkJCUl0ZXJhdG9yIGkgPSBnZXRTZWxlY3RvcnMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKCFiRmlyc3QpIHsKLQkJCQkJYnVmLmFwcGVuZCgiLCAiKTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCUlDU1NTZWxlY3RvciBpdGVtID0gKElDU1NTZWxlY3RvcikgaS5uZXh0KCk7Ci0JCQkJYnVmLmFwcGVuZChpdGVtLmdldFN0cmluZygpKTsKLQkJCQliRmlyc3QgPSBmYWxzZTsKLQkJCX0KLQkJCWZDYWNoZWRTdHJpbmcgPSBidWYudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gZkNhY2hlZFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHBzZXVkb05hbWUpIHsKLQkJaW50IG5TZWxlY3RvcnMgPSBnZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaVNlbGVjdG9yID0gMDsgaVNlbGVjdG9yIDwgblNlbGVjdG9yczsgaVNlbGVjdG9yKyspIHsKLQkJCS8vIENoZWNrIGVhY2ggU2VsZWN0b3IgTGlzdHMKLQkJCUlDU1NTZWxlY3RvciBzZWxlY3RvciA9IGdldFNlbGVjdG9yKGlTZWxlY3Rvcik7Ci0JCQlpZiAoc2VsZWN0b3IubWF0Y2goZWxlbWVudCwgcHNldWRvTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBwYXJzZVNlbGVjdG9yVGV4dCgpIHsKLQkJZlNlbGVjdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGZUZXh0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX1NUWUxFU0hFRVQsIGZUZXh0KTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IHRva2VuR3JvdXAgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlDU1NUZXh0VG9rZW4gdG9rZW4gPSB0b2tlbnNbaV07Ci0JCQlpZiAodG9rZW4ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfU0VQQVJBVE9SICYmIDAgPCB0b2tlbkdyb3VwLnNpemUoKSkgewotCQkJCUlDU1NTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBDU1NTZWxlY3Rvcih0b2tlbkdyb3VwKTsKLQkJCQlpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotCQkJCQlmU2VsZWN0b3JzLmFkZChzZWxlY3Rvcik7Ci0JCQkJfQotCQkJCXRva2VuR3JvdXAuY2xlYXIoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRva2VuR3JvdXAuYWRkKHRva2Vuc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKDAgPCB0b2tlbkdyb3VwLnNpemUoKSkgewotCQkJSUNTU1NlbGVjdG9yIHNlbGVjdG9yID0gbmV3IENTU1NlbGVjdG9yKHRva2VuR3JvdXApOwotCQkJaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLQkJCQlmU2VsZWN0b3JzLmFkZChzZWxlY3Rvcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGdldEVycm9ycygpIHsKLQkJTGlzdCBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGlTZWxlY3RvciA9IGdldFNlbGVjdG9ycygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpU2VsZWN0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJdGVyYXRvciBpRXJyb3IgPSAoKElDU1NTZWxlY3RvcikgaVNlbGVjdG9yLm5leHQoKSkuZ2V0RXJyb3JzKCk7Ci0JCQl3aGlsZSAoaUVycm9yLmhhc05leHQoKSkgewotCQkJCWVycm9ycy5hZGQoaUVycm9yLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVycm9ycy5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXJyb3JDb3VudCgpIHsKLQkJaW50IG5FcnJvcnMgPSAwOwotCQlJdGVyYXRvciBpID0gZ2V0RXJyb3JzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJbkVycm9ycysrOwotCQkJaS5uZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG5FcnJvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3RvclBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3RvclBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjA1NjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JDb21iaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JJdGVtOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NTZWxlY3RvclBhcnNlciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgSURMRSA9IDA7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEFUVFJJQlVURSA9IDE7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNJTVBMRSA9IDI7Ci0KLQlwcml2YXRlIExpc3QgZlRva2VucyA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZJdGVtcyA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZFcnJvcnMgPSBudWxsOwotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTU2VsZWN0b3JQYXJzZXIoTGlzdCB0b2tlbnMpIHsKLQkJc3VwZXIoKTsKLQkJZlRva2VucyA9IG5ldyBBcnJheUxpc3QodG9rZW5zKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlMaXN0IGdldFNlbGVjdG9yKCkgewotCQlpZiAoZkl0ZW1zID09IG51bGwpIHsKLQkJCXBhcnNlU2VsZWN0b3IoKTsKLQkJfQotCQlyZXR1cm4gZkl0ZW1zOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBwYXJzZVNlbGVjdG9yKCkgewotCQlmSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJTGlzdCBhdHRyQnVmID0gbnVsbDsKLQkJQ1NTU2ltcGxlU2VsZWN0b3IgaXRlbSA9IG51bGw7Ci0KLQkJaW50IHN0YXR1cyA9IElETEU7Ci0JCUl0ZXJhdG9yIGkgPSBmVG9rZW5zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTVGV4dFRva2VuIHRva2VuID0gKENTU1RleHRUb2tlbikgaS5uZXh0KCk7Ci0JCQlpZiAodG9rZW4gPT0gbnVsbCB8fCB0b2tlbi5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHRva2VuLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCQkJY2FzZSBJRExFIDoKLQkJCQkJaWYgKGlzVGFnKHRva2VuKSkgewotCQkJCQkJaXRlbSA9IGNyZWF0ZVNpbXBsZSgpOwotCQkJCQkJYXBwZW5kVGFnKGl0ZW0sIHRva2VuKTsKLQkJCQkJCXN0YXR1cyA9IFNJTVBMRTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc0lEKHRva2VuKSkgewotCQkJCQkJaXRlbSA9IGNyZWF0ZVNpbXBsZSgpOwotCQkJCQkJYXBwZW5kSUQoaXRlbSwgdG9rZW4pOwotCQkJCQkJc3RhdHVzID0gU0lNUExFOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzQ2xhc3ModG9rZW4pKSB7Ci0JCQkJCQlpdGVtID0gY3JlYXRlU2ltcGxlKCk7Ci0JCQkJCQlhcHBlbmRDbGFzcyhpdGVtLCB0b2tlbik7Ci0JCQkJCQlzdGF0dXMgPSBTSU1QTEU7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNQc2V1ZG8odG9rZW4pKSB7Ci0JCQkJCQlpdGVtID0gY3JlYXRlU2ltcGxlKCk7Ci0JCQkJCQlhcHBlbmRQc2V1ZG8oaXRlbSwgdG9rZW4pOwotCQkJCQkJc3RhdHVzID0gU0lNUExFOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzQXR0cmlidXRlQmVnaW4odG9rZW4pKSB7Ci0JCQkJCQlpdGVtID0gY3JlYXRlU2ltcGxlKCk7Ci0JCQkJCQlzdGF0dXMgPSBBVFRSSUJVVEU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlhZGRFcnJvcih0b2tlbik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTSU1QTEUgOgotCQkJCQlpZiAoaXNJRCh0b2tlbikpIHsKLQkJCQkJCWFwcGVuZElEKGl0ZW0sIHRva2VuKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc0NsYXNzKHRva2VuKSkgewotCQkJCQkJYXBwZW5kQ2xhc3MoaXRlbSwgdG9rZW4pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzUHNldWRvKHRva2VuKSkgewotCQkJCQkJYXBwZW5kUHNldWRvKGl0ZW0sIHRva2VuKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc0F0dHJpYnV0ZUJlZ2luKHRva2VuKSkgewotCQkJCQkJc3RhdHVzID0gQVRUUklCVVRFOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzQ29tYmluYXRvcih0b2tlbikpIHsgLy8gY29tYmluYXRvcgotCQkJCQkJY2xvc2VJdGVtKGl0ZW0pOwotCQkJCQkJY2xvc2VJdGVtKGNyZWF0ZUNvbWJpbmF0b3IodG9rZW4pKTsKLQkJCQkJCXN0YXR1cyA9IElETEU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlhZGRFcnJvcih0b2tlbik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBVFRSSUJVVEUgOgotCQkJCQlpZiAoaXNBdHRyaWJ1dGVFbmQodG9rZW4pKSB7Ci0JCQkJCQlhcHBlbmRBdHRyaWJ1dGUoaXRlbSwgYXR0ckJ1Zik7Ci0JCQkJCQlhdHRyQnVmID0gbnVsbDsKLQkJCQkJCXN0YXR1cyA9IFNJTVBMRTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChhdHRyQnVmID09IG51bGwpIHsKLQkJCQkJCQlhdHRyQnVmID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJfQotCQkJCQkJYXR0ckJ1Zi5hZGQodG9rZW4pOwotCQkJCQkJaWYgKCFpc0F0dHJpYnV0ZUNvbnRlbnQodG9rZW4pKSB7Ci0JCQkJCQkJYWRkRXJyb3IodG9rZW4pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWNsb3NlSXRlbShpdGVtKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQXR0cmlidXRlQ29udGVudChDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHR5cGUgPSB0b2tlbi5raW5kOwotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNBdHRyaWJ1dGVFbmQoQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0eXBlID0gdG9rZW4ua2luZDsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQXR0cmlidXRlQmVnaW4oQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0eXBlID0gdG9rZW4ua2luZDsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDb21iaW5hdG9yKENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdHlwZSA9IHRva2VuLmtpbmQ7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ09NQklOQVRPUik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1BzZXVkbyhDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHR5cGUgPSB0b2tlbi5raW5kOwotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1BTRVVETyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NsYXNzKENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdHlwZSA9IHRva2VuLmtpbmQ7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJRChDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHR5cGUgPSB0b2tlbi5raW5kOwotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVGFnKENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdHlwZSA9IHRva2VuLmtpbmQ7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTktOT1dOKTsKLQl9Ci0KLQlwcml2YXRlIENTU1NpbXBsZVNlbGVjdG9yIGNyZWF0ZVNpbXBsZSgpIHsKLQkJcmV0dXJuIG5ldyBDU1NTaW1wbGVTZWxlY3RvcigpOwotCX0KLQotCS8qKgotCSAqIGlmICIgIiBvciAiKyIgb3IgIj4iIGFwcGVhcmVkLCBjbG9zZSBzaW1wbGVzZWxlY3RvciBhbmQgYWRkIG5ldwotCSAqIGNvbWJpbmF0b3IKLQkgKi8KLQlwcml2YXRlIENTU1NlbGVjdG9yQ29tYmluYXRvciBjcmVhdGVDb21iaW5hdG9yKENTU1RleHRUb2tlbiB0b2tlbikgewotCQljaGFyIHR5cGUgPSAwOwotCi0JCVN0cmluZyBzdHIgPSB0b2tlbi5pbWFnZTsKLQkJaWYgKHN0ci50cmltKCkubGVuZ3RoKCkgPT0gMCkgeyAvLyBzcGFjZQotCQkJdHlwZSA9IElDU1NTZWxlY3RvckNvbWJpbmF0b3IuREVTQ0VOREFOVDsKLQkJfQotCQllbHNlIGlmIChzdHIuZXF1YWxzKCIrIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdHlwZSA9IElDU1NTZWxlY3RvckNvbWJpbmF0b3IuQURKQUNFTlQ7Ci0JCX0KLQkJZWxzZSBpZiAoc3RyLmVxdWFscygiPiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXR5cGUgPSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkNISUxEOwotCQl9Ci0KLQkJaWYgKDAgPCB0eXBlKSB7Ci0JCQlyZXR1cm4gbmV3IENTU1NlbGVjdG9yQ29tYmluYXRvcih0eXBlKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsb3NlSXRlbShJQ1NTU2VsZWN0b3JJdGVtIGl0ZW0pIHsKLQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJZkl0ZW1zLmFkZChpdGVtKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhcHBlbmRUYWcoQ1NTU2ltcGxlU2VsZWN0b3IgaXRlbSwgQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCWl0ZW0uc2V0TmFtZSh0b2tlbi5pbWFnZSk7Ci0JCWlmICh0b2tlbi5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTktOT1dOKSB7Ci0JCQlhZGRFcnJvcih0b2tlbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBpZiAiI3h4eHgiIGFwcGVhcmVkLCBhZGQgSUQgdG8gY3VycmVudCBzZWxlY3RvcgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRJRChDU1NTaW1wbGVTZWxlY3RvciBpdGVtLCBDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHRleHQgPSB0b2tlbi50b1N0cmluZygpOwotCQlTdHJpbmcgaWRDb250ZW50ID0gdGV4dC5zdWJzdHJpbmcoMSwgdGV4dC5sZW5ndGgoKSk7Ci0JCWl0ZW0uYWRkSUQoaWRDb250ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBpZiAiLnh4eHgiIGFwcGVhcmVkLCBhZGQgQ2xhc3MgdG8gY3VycmVudCBzZWxlY3RvcgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRDbGFzcyhDU1NTaW1wbGVTZWxlY3RvciBpdGVtLCBDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHRleHQgPSB0b2tlbi50b1N0cmluZygpOwotCQlTdHJpbmcgY2xhc3NDb250ZW50ID0gdGV4dC5zdWJzdHJpbmcoMSwgdGV4dC5sZW5ndGgoKSk7Ci0JCWl0ZW0uYWRkQ2xhc3MoY2xhc3NDb250ZW50KTsKLQkJaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGNsYXNzQ29udGVudC5jaGFyQXQoMCkpKSB7Ci0JCQlhZGRFcnJvcih0b2tlbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBpZiAiOnh4eHgiIGFwcGVhcmVkLCBhZGQgUHNldWRvKGVsZW1lbnQvY2xhc3MpIHRvIGN1cnJlbnQgc2VsZWN0b3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kUHNldWRvKENTU1NpbXBsZVNlbGVjdG9yIGl0ZW0sIENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdGV4dCA9IHRva2VuLnRvU3RyaW5nKCk7Ci0JCVN0cmluZyBwc2V1ZG9Db250ZW50ID0gdGV4dC5zdWJzdHJpbmcoMSwgdGV4dC5sZW5ndGgoKSk7Ci0JCWl0ZW0uYWRkUHNldWRvTmFtZShwc2V1ZG9Db250ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kQXR0cmlidXRlKENTU1NpbXBsZVNlbGVjdG9yIGl0ZW0sIExpc3QgdG9rZW5zKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJQ1NTVGV4dFRva2VuIHRva2VuOwotCQlJdGVyYXRvciBpID0gdG9rZW5zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJdG9rZW4gPSAoQ1NTVGV4dFRva2VuKSBpLm5leHQoKTsKLQkJCWJ1Zi5hcHBlbmQodG9rZW4uaW1hZ2UpOwotCQl9Ci0KLQkJaXRlbS5hZGRBdHRyaWJ1dGUoYnVmLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUxpc3QgZ2V0U2VsZWN0b3JUYWdzKCkgewotCQlMaXN0IHRhZ0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiB0YWdMaXN0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRFcnJvcihDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJaWYgKGZFcnJvcnMgPT0gbnVsbCkgewotCQkJZkVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlmRXJyb3JzLmFkZCh0b2tlbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JSXRlcmF0b3IgZ2V0RXJyb3JzKCkgewotCQlyZXR1cm4gKGZFcnJvcnMgPT0gbnVsbCkgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCkgOiBmRXJyb3JzLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTaW1wbGVTZWxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTaW1wbGVTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTI4ZTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2ltcGxlU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2ltcGxlU2VsZWN0b3I7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTU2ltcGxlU2VsZWN0b3IgZXh0ZW5kcyBDU1NTZWxlY3Rvckl0ZW0gaW1wbGVtZW50cyBJQ1NTU2ltcGxlU2VsZWN0b3IgewotCi0JcHJpdmF0ZSBTdHJpbmcgZk5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZDYWNoZWRTdHJpbmcgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZTdHJpbmdCdWYgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmUHNldWRvTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZBdHRyaWJ1dGUgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmQ2xhc3MgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmSUQgPSBudWxsOwotCi0JLyoqCi0JICogQ1NTU2ltcGxlU2VsZWN0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ1NTU2ltcGxlU2VsZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBhZGRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZSkgewotCQlpZiAoZkF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlmQXR0cmlidXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWZBdHRyaWJ1dGUuYWRkKGF0dHJpYnV0ZSk7Ci0JCWFkZFRvQnVmKCJbIik7Ly8kTk9OLU5MUy0xJAotCQlhZGRUb0J1ZihhdHRyaWJ1dGUpOwotCQlhZGRUb0J1ZigiXSIpOy8vJE5PTi1OTFMtMSQKLQkJZkNhY2hlZFN0cmluZyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBhZGRDbGFzcyhTdHJpbmcgY2xzKSB7Ci0JCWlmIChmQ2xhc3MgPT0gbnVsbCkgewotCQkJZkNsYXNzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWZDbGFzcy5hZGQoY2xzKTsKLQkJYWRkVG9CdWYoIi4iKTsvLyROT04tTkxTLTEkCi0JCWFkZFRvQnVmKGNscyk7Ci0JCWZDYWNoZWRTdHJpbmcgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgYWRkSUQoU3RyaW5nIGlkKSB7Ci0JCWlmIChmSUQgPT0gbnVsbCkgewotCQkJZklEID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWZJRC5hZGQoaWQpOwotCQlhZGRUb0J1ZigiIyIpOy8vJE5PTi1OTFMtMSQKLQkJYWRkVG9CdWYoaWQpOwotCQlmQ2FjaGVkU3RyaW5nID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGFkZFBzZXVkb05hbWUoU3RyaW5nIGNscykgewotCQlpZiAoZlBzZXVkb05hbWUgPT0gbnVsbCkgewotCQkJZlBzZXVkb05hbWUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJZlBzZXVkb05hbWUuYWRkKGNscyk7Ci0JCWFkZFRvQnVmKCI6Iik7Ly8kTk9OLU5MUy0xJAotCQlhZGRUb0J1ZihjbHMpOwotCQlmQ2FjaGVkU3RyaW5nID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVG9CdWYoU3RyaW5nIHN0cikgewotCQlpZiAoZlN0cmluZ0J1ZiA9PSBudWxsKSB7Ci0JCQlmU3RyaW5nQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl9Ci0JCWZTdHJpbmdCdWYuYXBwZW5kKHN0cik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIG9iagotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChvYmogPT0gbnVsbCB8fCB0aGlzLmdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQ1NTU2ltcGxlU2VsZWN0b3IgZm9yZWlnbiA9IChDU1NTaW1wbGVTZWxlY3Rvcikgb2JqOwotCi0JCWlmIChnZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShmb3JlaWduLmdldE5hbWUoKSkgIT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpbnQgaTsKLQotCQkvLyBjb21wYXJlIHBzZXVkby1jbGFzc2VzIC8gcHNldWRvLWVsZW1lbnRzCi0JCWlmIChnZXROdW1PZlBzZXVkb05hbWVzKCkgIT0gZm9yZWlnbi5nZXROdW1PZlBzZXVkb05hbWVzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaSA9IDA7IGkgPCBnZXROdW1PZlBzZXVkb05hbWVzKCk7IGkrKykgewotCQkJaWYgKGdldFBzZXVkb05hbWUoaSkuY29tcGFyZVRvSWdub3JlQ2FzZShmb3JlaWduLmdldFBzZXVkb05hbWUoaSkpICE9IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY29tcGFyZSBjbGFzc2VzCi0JCWlmIChnZXROdW1PZkNsYXNzZXMoKSAhPSBmb3JlaWduLmdldE51bU9mQ2xhc3NlcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGkgPSAwOyBpIDwgZ2V0TnVtT2ZDbGFzc2VzKCk7IGkrKykgewotCQkJaWYgKGdldENsYXNzKGkpLmNvbXBhcmVUb0lnbm9yZUNhc2UoZm9yZWlnbi5nZXRDbGFzcyhpKSkgIT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBjb21wYXJlIElEcwotCQlpZiAoZ2V0TnVtT2ZJRHMoKSAhPSBmb3JlaWduLmdldE51bU9mSURzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaSA9IDA7IGkgPCBnZXROdW1PZklEcygpOyBpKyspIHsKLQkJCWlmIChnZXRJRChpKS5jb21wYXJlVG9JZ25vcmVDYXNlKGZvcmVpZ24uZ2V0SUQoaSkpICE9IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY29tcGFyZSBBdHRyaWJ1dGVzCi0JCWlmIChnZXROdW1PZkF0dHJpYnV0ZXMoKSAhPSBmb3JlaWduLmdldE51bU9mQXR0cmlidXRlcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGkgPSAwOyBpIDwgZ2V0TnVtT2ZBdHRyaWJ1dGVzKCk7IGkrKykgewotCQkJaWYgKGdldEF0dHJpYnV0ZShpKS5jb21wYXJlVG9JZ25vcmVDYXNlKGZvcmVpZ24uZ2V0QXR0cmlidXRlKGkpKSAhPSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKGludCBpbmRleCkgewotCQlpZiAoZkF0dHJpYnV0ZSAhPSBudWxsICYmIDAgPD0gaW5kZXggJiYgaW5kZXggPCBmQXR0cmlidXRlLnNpemUoKSkgewotCQkJcmV0dXJuIChTdHJpbmcpIGZBdHRyaWJ1dGUuZ2V0KGluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3MoaW50IGluZGV4KSB7Ci0JCWlmIChmQ2xhc3MgIT0gbnVsbCAmJiAwIDw9IGluZGV4ICYmIGluZGV4IDwgZkNsYXNzLnNpemUoKSkgewotCQkJcmV0dXJuIChTdHJpbmcpIGZDbGFzcy5nZXQoaW5kZXgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRJRChpbnQgaW5kZXgpIHsKLQkJaWYgKGZJRCAhPSBudWxsICYmIDAgPD0gaW5kZXggJiYgaW5kZXggPCBmSUQuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgZklELmdldChpbmRleCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEl0ZW1UeXBlKCkgewotCQlyZXR1cm4gU0lNUExFOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIChmTmFtZSAhPSBudWxsKSA/IGZOYW1lIDogIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtT2ZBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gKGZBdHRyaWJ1dGUgIT0gbnVsbCkgPyBmQXR0cmlidXRlLnNpemUoKSA6IDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGludCBnZXROdW1PZkNsYXNzZXMoKSB7Ci0JCXJldHVybiAoZkNsYXNzICE9IG51bGwpID8gZkNsYXNzLnNpemUoKSA6IDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGludCBnZXROdW1PZklEcygpIHsKLQkJcmV0dXJuIChmSUQgIT0gbnVsbCkgPyBmSUQuc2l6ZSgpIDogMDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE51bU9mUHNldWRvTmFtZXMoKSB7Ci0JCXJldHVybiAoZlBzZXVkb05hbWUgIT0gbnVsbCkgPyBmUHNldWRvTmFtZS5zaXplKCkgOiAwOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQc2V1ZG9OYW1lKGludCBpbmRleCkgewotCQlpZiAoZlBzZXVkb05hbWUgIT0gbnVsbCAmJiAwIDw9IGluZGV4ICYmIGluZGV4IDwgZlBzZXVkb05hbWUuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgZlBzZXVkb05hbWUuZ2V0KGluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJaWYgKGZDYWNoZWRTdHJpbmcgPT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0TmFtZSgpKTsKLQkJCWlmIChmU3RyaW5nQnVmICE9IG51bGwpIHsKLQkJCQlidWYuYXBwZW5kKGZTdHJpbmdCdWYudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlmQ2FjaGVkU3RyaW5nID0gYnVmLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGZDYWNoZWRTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVbml2ZXJzYWwoKSB7Ci0JCXJldHVybiAoZk5hbWUgPT0gbnVsbCB8fCBmTmFtZS5lcXVhbHMoIioiKSk7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlmTmFtZSA9IG5hbWU7Ci0JCWZDYWNoZWRTdHJpbmcgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2JmMzg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0vKioKLSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgZXh0ZW5kcyBDU1NOb2RlSW1wbCB7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQotCS8qKgotCSAqIENTU0NvbnRhaW5lciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3NzVGV4dCgpIHsKLQkJaWYgKGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiBnZW5lcmF0ZVNvdXJjZSgpOwotCi0JCVN0cmluZ0J1ZmZlciBzdHIgPSBuZXcgU3RyaW5nQnVmZmVyKGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQl3aGlsZSAobm9kZSAhPSBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCW5vZGUgPSBub2RlLmdldE5leHQoKTsKLQkJCXN0ci5hcHBlbmQobm9kZS5nZXRUZXh0KCkpOwotCQl9Ci0KLQkJcmV0dXJuIHN0ci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIGZsYXROb2RlLmdldEVuZCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCX0KLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGludCBpbmRleCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJZm9yIChpbnQgaSA9IGluZGV4OyBpID4gMDsgaS0tKSB7Ci0JCQlpZiAobm9kZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCkgewotCQlpZiAoZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoOyBub2RlICE9IG51bGw7IGkrKykKLQkJCW5vZGUgPSBub2RlLmdldE5leHQoKTsKLQkJcmV0dXJuIGk7Ci0JfQotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JYm9vbGVhbiBpbmNsdWRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0KSB7Ci0JCWJvb2xlYW4gYk1vZGlmaWVkID0gZmFsc2U7Ci0KLQkJLy8gdmFsaWRhdGUgcmFuZ2Ugb2YgcGFyYW1ldGVycwotCQlpZiAoZmlyc3QgIT0gbnVsbCAmJiBsYXN0ICE9IG51bGwpIHsKLQkJCWlmIChmaXJzdC5nZXRTdGFydCgpID4gbGFzdC5nZXRTdGFydCgpKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gZmlyc3Q7Ci0JCQkJZmlyc3QgPSBsYXN0OwotCQkJCWxhc3QgPSBub2RlOwotCQkJfQotCQl9Ci0KLQkJLy8gdmFsaWRhdGUgbWluZQotCQlib29sZWFuIGIgPSB2YWxpZGF0ZVJhbmdlKCk7Ci0JCWJNb2RpZmllZCA9IGIgfHwgYk1vZGlmaWVkOwotCi0JCWlmIChmaXJzdCAhPSBudWxsKSB7Ci0JCQlpZiAoZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsIHx8IGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnQoKSA+IGZpcnN0LmdldFN0YXJ0KCkpIHsKLQkJCQlzZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmaXJzdCk7Ci0JCQkJYk1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWlmIChsYXN0ICE9IG51bGwpIHsKLQkJCWlmIChnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCB8fCBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnQoKSA8IGxhc3QuZ2V0U3RhcnQoKSkgewotCQkJCXNldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obGFzdCk7Ci0JCQkJYk1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCS8vIHJlLXZhbGlkYXRlCi0JCWlmIChiTW9kaWZpZWQpCi0JCQl2YWxpZGF0ZVJhbmdlKCk7Ci0KLQkJcmV0dXJuIGJNb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm9wYWdhdGVSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJYm9vbGVhbiBiTW9kaWZpZWQgPSBmYWxzZTsKLQotCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgcGFyZW50ID0gKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gYk1vZGlmaWVkOwotCi0JCWJvb2xlYW4gYiA9IHBhcmVudC5pbmNsdWRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJYk1vZGlmaWVkID0gYiB8fCBiTW9kaWZpZWQ7Ci0KLQkJaWYgKGIpCi0JCQlwYXJlbnQucHJvcGFnYXRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJLy8gZWxzZSBuZWVkIG5vdCB1cGRhdGUgcmFuZ2Ugb2YgYW5jZXN0b3JzCi0KLQkJcmV0dXJuIGJNb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY3NzVGV4dAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENzc1RleHQoU3RyaW5nIGNzc1RleHQpIHsKLQkJaWYgKGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCWdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsIGdldFN0YXJ0T2Zmc2V0KCksIGdldEVuZE9mZnNldCgpIC0gZ2V0U3RhcnRPZmZzZXQoKSwgY3NzVGV4dCk7Ci0JCX0KLQkJZWxzZQotCQkJc3VwZXIuc2V0Q3NzVGV4dChjc3NUZXh0KTsKLQl9Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGU7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGU7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlKSB7Ci0JCWlmIChmaXJzdE5vZGUgIT0gbnVsbCkKLQkJCXNldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZpcnN0Tm9kZSk7Ci0JCWlmIChsYXN0Tm9kZSAhPSBudWxsKQotCQkJc2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihsYXN0Tm9kZSk7Ci0KLQkJaWYgKGZpcnN0Tm9kZSA9PSBudWxsICYmIGxhc3ROb2RlID09IG51bGwpIHsKLQkJCXNldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQkJc2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJfQotCQllbHNlIHsgLy8gcmFuZ2UgdmFsaWRhdGlvbgotCQkJdmFsaWRhdGVSYW5nZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlUmFuZ2UoKSB7Ci0JCWJvb2xlYW4gYk1vZGlmaWVkID0gZmFsc2U7Ci0KLQkJaWYgKGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgfHwgbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5maXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJdGhpcy5maXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRoaXMubGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAodGhpcy5sYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCQl0aGlzLmxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSB0aGlzLmZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCWJNb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmICh0aGlzLmZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCkgPiB0aGlzLmxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSkgewotCQkJCS8vIG5lZWQgdG8gc3dhcCBmaXJzdCBmb3IgbGFzdAotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCWZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQlsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZTsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGJNb2RpZmllZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlRGVjbEl0ZW1JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlRGVjbEl0ZW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YTVjYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xJdGVtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ1NTRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuU3R5bGVEZWNsSXRlbUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1NvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlRleHRSZWdpb25MaXN0SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU1N0eWxlRGVjbEl0ZW1JbXBsIGV4dGVuZHMgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGltcGxlbWVudHMgSUNTU1N0eWxlRGVjbEl0ZW0gewotCi0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGZQcm9wZXJ0eU5hbWU7Ci0KLQkvKioKLQkgKiBDU1NTdHlsZURlY2xJdGVtSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqLwotCUNTU1N0eWxlRGVjbEl0ZW1JbXBsKENTU1N0eWxlRGVjbEl0ZW1JbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JCXRoaXMuZlByb3BlcnR5TmFtZSA9IHRoYXQuZlByb3BlcnR5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBDU1NTdHlsZURlY2xJdGVtSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU1N0eWxlRGVjbEl0ZW1JbXBsKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5mUHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKi8KLQlwdWJsaWMgSUNTU1ByaW1pdGl2ZVZhbHVlIGFwcGVuZFZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBpbnNlcnRWYWx1ZUJlZm9yZSh2YWx1ZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NTdHlsZURlY2xJdGVtSW1wbCBjbG9uZWQgPSBuZXcgQ1NTU3R5bGVEZWNsSXRlbUltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZW5lcmF0ZVZhbHVlU291cmNlKCkgewotCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcih0aGlzKTsKLQkJaWYgKGZvcm1hdHRlciAhPSBudWxsICYmIGZvcm1hdHRlciBpbnN0YW5jZW9mIFN0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIpCi0JCQlyZXR1cm4gKChTdHlsZURlY2xJdGVtRm9ybWF0dGVyKSBmb3JtYXR0ZXIpLmZvcm1hdFZhbHVlKHRoaXMpLnRvU3RyaW5nKCk7Ci0JCWVsc2UKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWUKLQkgKi8KLQlwdWJsaWMgQ1NTVmFsdWUgZ2V0Q1NTVmFsdWUoKSB7Ci0JCWludCBuVmFsdWUgPSBnZXRMZW5ndGgoKTsKLQkJaWYgKG5WYWx1ZSA8PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKG5WYWx1ZSA9PSAxKQotCQkJcmV0dXJuIGl0ZW0oMCk7Ci0JCWVsc2UKLQkJCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENTU1ZhbHVlVGV4dCgpIHsKLQkJaWYgKGdldEZpcnN0Q2hpbGQoKSA9PSBudWxsKQotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJLy8gY2hlY2sgd2hldGhlciBjaGlsZHJlbiBoYXMgZmxhdG5vZGVzCi0JCUlDU1NOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKCgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldEVuZE9mZnNldCgpIDw9IDApCi0JCQkJcmV0dXJuIGdlbmVyYXRlVmFsdWVTb3VyY2UoKTsKLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpIC0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBnZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgLSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCXJldHVybiBub2RlLmdldFRleHQoKS5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRDc3NWYWx1ZVR5cGUoKSB7Ci0JCXJldHVybiBDU1NfVkFMVUVfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkKLQkJCQlpKys7Ci0JCX0KLQkJcmV0dXJuIGk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFNUWUxFREVDTElURU1fTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQcmlvcml0eSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShJTVBPUlRBTlQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGZQcm9wZXJ0eU5hbWUudHJpbSgpOwotCQlyZXR1cm4gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihuYW1lKSAhPSBudWxsID8gZlByb3BlcnR5TmFtZS50cmltKCkudG9Mb3dlckNhc2UoKSA6IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSByZWZWYWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICovCi0JSUNTU1ByaW1pdGl2ZVZhbHVlIGluc2VydFZhbHVlQmVmb3JlKElDU1NQcmltaXRpdmVWYWx1ZSBuZXdWYWx1ZSwgSUNTU1ByaW1pdGl2ZVZhbHVlIHJlZlZhbHVlKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBpbnNlcnRCZWZvcmUoKENTU05vZGVJbXBsKSBuZXdWYWx1ZSwgKENTU05vZGVJbXBsKSByZWZWYWx1ZSk7Ci0JCXJldHVybiAoSUNTU1ByaW1pdGl2ZVZhbHVlKSBub2RlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgQ1NTVmFsdWUgaXRlbShpbnQgaW5kZXgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NQcmltaXRpdmVWYWx1ZUltcGwpIHsKLQkJCQlpZiAoaSsrID09IGluZGV4KQotCQkJCQlyZXR1cm4gKENTU1ZhbHVlKSBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKi8KLQlwdWJsaWMgSUNTU1ByaW1pdGl2ZVZhbHVlIHJlbW92ZVZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCUlDU1NOb2RlIG5vZGUgPSByZW1vdmVDaGlsZCgoQ1NTTm9kZUltcGwpIHZhbHVlKTsKLQkJcmV0dXJuIChJQ1NTUHJpbWl0aXZlVmFsdWUpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSBvbGRWYWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICovCi0JcHVibGljIElDU1NQcmltaXRpdmVWYWx1ZSByZXBsYWNlVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlIG5ld1ZhbHVlLCBJQ1NTUHJpbWl0aXZlVmFsdWUgb2xkVmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAob2xkVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXdWYWx1ZTsKLQkJaWYgKG5ld1ZhbHVlICE9IG51bGwpCi0JCQlpbnNlcnRWYWx1ZUJlZm9yZShuZXdWYWx1ZSwgb2xkVmFsdWUpOwotCQlyZXR1cm4gcmVtb3ZlVmFsdWUob2xkVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDc3NWYWx1ZVRleHQoU3RyaW5nIHZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJSUNTU05vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlJQ1NTTm9kZSBuZXh0ID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElDU1NQcmltaXRpdmVWYWx1ZSkgewotCQkJCXJlbW92ZUNoaWxkKChDU1NOb2RlSW1wbCkgY2hpbGQpOwotCQkJfQotCQkJY2hpbGQgPSBuZXh0OwotCQl9Ci0JCXNldENzc1ZhbHVlVGV4dENvcmUodmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDc3NWYWx1ZVRleHRDb3JlKFN0cmluZyB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIHVzZSB0ZW1wb3JhcnkgZG9jdW1lbnQKLQkJc3luY2hyb25pemVkIChDU1NTdHlsZURlY2xhcmF0aW9uSW1wbC5jbGFzcykgewotCQkJaWYgKHNoYXJlZFN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKSB7Ci0JCQkJSURvY3VtZW50TG9hZGVyIGxvYWRlciA9IG5ldyBDU1NEb2N1bWVudExvYWRlcigpOwotCQkJCXNoYXJlZFN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBsb2FkZXIuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJKChDU1NTb3VyY2VQYXJzZXIpIHNoYXJlZFN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKSkuc2V0UGFyc2VyTW9kZShDU1NTb3VyY2VQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSk7Ci0KLQkJCX0KLQkJCXNoYXJlZFN0cnVjdHVyZWREb2N1bWVudC5zZXQodmFsdWUpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gc2hhcmVkU3RydWN0dXJlZERvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkJCWlmIChub2RlID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAobm9kZS5nZXROZXh0KCkgIT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyIGl0ZW1QYXJzZXIgPSBuZXcgQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyKGdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQlpdGVtUGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudFRlbXBvcmFyeSh0cnVlKTsKLQkJCS8vIG1ha2UgYSBjb3B5IG9mIG5vZGVsaXN0IGJlY2F1c2Ugc2V0dXBWYWx1ZXMgd2lsbCBkZXN0cm95IGxpc3QKLQkJCUlUZXh0UmVnaW9uTGlzdCBub2RlTGlzdCA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwobm9kZS5nZXRSZWdpb25zKCkpOwotCQkJaXRlbVBhcnNlci5zZXR1cFZhbHVlcyh0aGlzLCBub2RlLCBub2RlTGlzdCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50IHNoYXJlZFN0cnVjdHVyZWREb2N1bWVudDsKLQotCS8qKgotCSAqIEBwYXJhbSBuZXdQcmlvcml0eQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByaW9yaXR5KGphdmEubGFuZy5TdHJpbmcgbmV3UHJpb3JpdHkpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzZXRBdHRyaWJ1dGUoSU1QT1JUQU5ULCBuZXdQcmlvcml0eSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnlDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNTY0ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnlDb250ZXh0IHsKLQotCXByb3RlY3RlZCBJQ1NTRG9jdW1lbnQgZk93bmVyRG9jdW1lbnQgPSBudWxsOwotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xvbmVDaGlsZE5vZGVzKElDU1NOb2RlIHNyYywgSUNTU05vZGUgZGVzdCkgewotCQlpZiAoZk93bmVyRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghKGRlc3QgaW5zdGFuY2VvZiBDU1NOb2RlSW1wbCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUNTU05vZGVJbXBsIGNvbnRhaW5lciA9IChDU1NOb2RlSW1wbCkgZGVzdDsKLQkJY29udGFpbmVyLnJlbW92ZUNoaWxkTm9kZXMoKTsKLQotCQlmb3IgKElDU1NOb2RlIGNoaWxkID0gc3JjLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xJdGVtSW1wbCkgewotCQkJCS8vIGV4dHJhY3Qgc2hvcnRoYW5kIHByb3BlcnR5IC4uCi0JCQkJLy8gLS0+IFRlbXAKLQkJCQlJQ1NTTm9kZSBjbG9uZWQgPSBjaGlsZC5jbG9uZU5vZGUoZmFsc2UpOwotCQkJCWlmIChjbG9uZWQgaW5zdGFuY2VvZiBDU1NOb2RlSW1wbCkgewotCQkJCQkoKENTU05vZGVJbXBsKSBjbG9uZWQpLnNldE93bmVyRG9jdW1lbnQoZk93bmVyRG9jdW1lbnQpOwotCQkJCQljb250YWluZXIuYXBwZW5kQ2hpbGQoKENTU05vZGVJbXBsKSBjbG9uZWQpOwotCQkJCQljbG9uZUNoaWxkTm9kZXMoY2hpbGQsIGNsb25lZCk7Ci0JCQkJfQotCQkJCS8vIDwtLSBUZW1wCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJQ1NTTm9kZSBjbG9uZWQgPSBjaGlsZC5jbG9uZU5vZGUoZmFsc2UpOwotCQkJCWlmIChjbG9uZWQgaW5zdGFuY2VvZiBDU1NOb2RlSW1wbCkgewotCQkJCQkoKENTU05vZGVJbXBsKSBjbG9uZWQpLnNldE93bmVyRG9jdW1lbnQoZk93bmVyRG9jdW1lbnQpOwotCQkJCQljb250YWluZXIuYXBwZW5kQ2hpbGQoKENTU05vZGVJbXBsKSBjbG9uZWQpOwotCQkJCQljbG9uZUNoaWxkTm9kZXMoY2hpbGQsIGNsb25lZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTU3R5bGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBJQ1NTU3R5bGVEZWNsYXJhdGlvbiBjcmVhdGVTdHlsZURlY2xhcmF0aW9uKCkgewotCQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBkZWNsID0gbmV3IENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKHRydWUpOwotCQlkZWNsLnNldE93bmVyRG9jdW1lbnQoZGVjbCk7Ci0JCXJldHVybiBkZWNsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xhcmF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xhcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGFlZDQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZTsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBleHRlbmRzIENTU0RvY3VtZW50SW1wbCBpbXBsZW1lbnRzIElDU1NTdHlsZURlY2xhcmF0aW9uIHsKLQotCXByaXZhdGUgYm9vbGVhbiBmSXNEb2N1bWVudDsKLQotCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsKENTU1N0eWxlRGVjbGFyYXRpb25JbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JCXRoaXMuZklzRG9jdW1lbnQgPSB0aGF0LmZJc0RvY3VtZW50OwotCQlpZiAoZklzRG9jdW1lbnQpIHsKLQkJCXNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCX0KLQl9Ci0KLQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbChib29sZWFuIGlzRG9jdW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJZklzRG9jdW1lbnQgPSBpc0RvY3VtZW50OwotCQlpZiAoZklzRG9jdW1lbnQpIHsKLQkJCXNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBjbG9uZWQgPSBuZXcgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCXB1YmxpYyBJQ1NTU3R5bGVEZWNsSXRlbSBnZXREZWNsSXRlbU5vZGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0TGFzdENoaWxkKCk7Ci0JCXByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS50cmltKCk7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsSXRlbUltcGwpIHsKLQkJCQlJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtID0gKElDU1NTdHlsZURlY2xJdGVtKSBub2RlOwotCQkJCWlmIChwcm9wZXJ0eU5hbWUuY29tcGFyZVRvSWdub3JlQ2FzZShpdGVtLmdldFByb3BlcnR5TmFtZSgpLnRyaW0oKSkgPT0gMCkKLQkJCQkJcmV0dXJuIGl0ZW07Ci0JCQl9Ci0JCQlub2RlID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpbnQgaSA9IDA7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsSXRlbUltcGwpCi0JCQkJaSsrOwotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gaTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gU1RZTEVERUNMQVJBVElPTl9OT0RFOwotCX0KLQotCS8qKgotCSAqIFRoZSBDU1MgcnVsZSB0aGF0IGNvbnRhaW5zIHRoaXMgZGVjbGFyYXRpb24gYmxvY2sgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiB0aGlzIDxjb2RlPkNTU1N0eWxlRGVjbGFyYXRpb248L2NvZGU+IGlzIG5vdCBhdHRhY2hlZCB0byBhCi0JICogPGNvZGU+Q1NTUnVsZTwvY29kZT4uCi0JICovCi0JcHVibGljIENTU1J1bGUgZ2V0UGFyZW50UnVsZSgpIHsKLQkJSUNTU05vZGUgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTUnVsZSkKLQkJCXJldHVybiAoQ1NTUnVsZSkgcGFyZW50OwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJldHJpZXZlIHRoZSBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIG9mIGEgQ1NTCi0JICogcHJvcGVydHkgaWYgaXQgaGFzIGJlZW4gZXhwbGljaXRseSBzZXQgd2l0aGluIHRoaXMgZGVjbGFyYXRpb24gYmxvY2suCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcHJvcGVydHkgaXMgYSBzaG9ydGhhbmQKLQkgKiBwcm9wZXJ0eS4gU2hvcnRoYW5kIHByb3BlcnR5IHZhbHVlcyBjYW4gb25seSBiZSBhY2Nlc3NlZCBhbmQgbW9kaWZpZWQKLQkgKiBhcyBzdHJpbmdzLCB1c2luZyB0aGUgPGNvZGU+Z2V0UHJvcGVydHlWYWx1ZTwvY29kZT4gYW5kCi0JICogPGNvZGU+c2V0UHJvcGVydHk8L2NvZGU+IG1ldGhvZHMuCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIENTUyBwcm9wZXJ0eS4gU2VlIHRoZSBDU1MgcHJvcGVydHkgaW5kZXguCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaWYgaXQgaGFzIGJlZW4gZXhwbGljaXRseSBzZXQKLQkgKiAgICAgICAgIGZvciB0aGlzIGRlY2xhcmF0aW9uIGJsb2NrLiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotCSAqICAgICAgICAgcHJvcGVydHkgaGFzIG5vdCBiZWVuIHNldC4KLQkgKi8KLQlwdWJsaWMgQ1NTVmFsdWUgZ2V0UHJvcGVydHlDU1NWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUlDU1NTdHlsZURlY2xJdGVtIGl0ZW0gPSBnZXREZWNsSXRlbU5vZGUocHJvcGVydHlOYW1lKTsKLQkJaWYgKGl0ZW0gIT0gbnVsbCkKLQkJCXJldHVybiBpdGVtLmdldENTU1ZhbHVlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gcmV0cmlldmUgdGhlIHByaW9yaXR5IG9mIGEgQ1NTIHByb3BlcnR5IChlLmcuIHRoZQotCSAqIDxjb2RlPiJpbXBvcnRhbnQiPC9jb2RlPiBxdWFsaWZpZXIpIGlmIHRoZSBwcm9wZXJ0eSBoYXMgYmVlbgotCSAqIGV4cGxpY2l0bHkgc2V0IGluIHRoaXMgZGVjbGFyYXRpb24gYmxvY2suCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIENTUyBwcm9wZXJ0eS4gU2VlIHRoZSBDU1MgcHJvcGVydHkgaW5kZXguCi0JICogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHByaW9yaXR5IChlLmcuCi0JICogICAgICAgICA8Y29kZT4iaW1wb3J0YW50IjwvY29kZT4pIGlmIG9uZSBleGlzdHMuIFRoZSBlbXB0eSBzdHJpbmcgaWYKLQkgKiAgICAgICAgIG5vbmUgZXhpc3RzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlQcmlvcml0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUlDU1NTdHlsZURlY2xJdGVtIGl0ZW0gPSBnZXREZWNsSXRlbU5vZGUocHJvcGVydHlOYW1lKTsKLQkJaWYgKGl0ZW0gIT0gbnVsbCkKLQkJCXJldHVybiBpdGVtLmdldFByaW9yaXR5KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gcmV0cmlldmUgdGhlIHZhbHVlIG9mIGEgQ1NTIHByb3BlcnR5IGlmIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkKLQkgKiBzZXQgd2l0aGluIHRoaXMgZGVjbGFyYXRpb24gYmxvY2suCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIENTUyBwcm9wZXJ0eS4gU2VlIHRoZSBDU1MgcHJvcGVydHkgaW5kZXguCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaWYgaXQgaGFzIGJlZW4gZXhwbGljaXRseSBzZXQKLQkgKiAgICAgICAgIGZvciB0aGlzIGRlY2xhcmF0aW9uIGJsb2NrLiBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgaWYgdGhlCi0JICogICAgICAgICBwcm9wZXJ0eSBoYXMgbm90IGJlZW4gc2V0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUNTU1ZhbHVlIHZhbHVlID0gZ2V0UHJvcGVydHlDU1NWYWx1ZShwcm9wZXJ0eU5hbWUpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCXJldHVybiAoKElDU1NWYWx1ZSkgdmFsdWUpLmdldENTU1ZhbHVlVGV4dCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RvY3VtZW50KCkgewotCQlyZXR1cm4gZklzRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byByZXRyaWV2ZSB0aGUgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBleHBsaWNpdGx5IHNldCBpbiB0aGlzCi0JICogZGVjbGFyYXRpb24gYmxvY2suIFRoZSBvcmRlciBvZiB0aGUgcHJvcGVydGllcyByZXRyaWV2ZWQgdXNpbmcgdGhpcwotCSAqIG1ldGhvZCBkb2VzIG5vdCBoYXZlIHRvIGJlIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgc2V0LiBUaGlzCi0JICogbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGl0ZXJhdGUgb3ZlciBhbGwgcHJvcGVydGllcyBpbiB0aGlzIGRlY2xhcmF0aW9uCi0JICogYmxvY2suCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBJbmRleCBvZiB0aGUgcHJvcGVydHkgbmFtZSB0byByZXRyaWV2ZS4KLQkgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBhdCB0aGlzIG9yZGluYWwgcG9zaXRpb24uIFRoZSBlbXB0eQotCSAqICAgICAgICAgc3RyaW5nIGlmIG5vIHByb3BlcnR5IGV4aXN0cyBhdCB0aGlzIHBvc2l0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXRlbShpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBpID0gMDsKLQkJSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xJdGVtSW1wbCkgewotCQkJCWlmIChpICE9IGluZGV4KQotCQkJCQlpKys7Ci0JCQkJZWxzZSB7Ci0JCQkJCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIGl0ZW0gPSAoQ1NTU3R5bGVEZWNsSXRlbUltcGwpIG5vZGU7Ci0JCQkJCXJldHVybiBpdGVtLmdldFByb3BlcnR5TmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJCW5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDU1NTdHlsZURlY2xJdGVtIHJlbW92ZURlY2xJdGVtTm9kZShJQ1NTU3R5bGVEZWNsSXRlbSBvbGREZWNsKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChJQ1NTU3R5bGVEZWNsSXRlbSkgcmVtb3ZlQ2hpbGQoKENTU05vZGVJbXBsKSBvbGREZWNsKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJlbW92ZSBhIENTUyBwcm9wZXJ0eSBpZiBpdCBoYXMgYmVlbiBleHBsaWNpdGx5IHNldCB3aXRoaW4gdGhpcwotCSAqIGRlY2xhcmF0aW9uIGJsb2NrLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBDU1MgcHJvcGVydHkuIFNlZSB0aGUgQ1NTIHByb3BlcnR5IGluZGV4LgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGlmIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0Ci0JICogICAgICAgICBmb3IgdGhpcyBkZWNsYXJhdGlvbiBibG9jay4gUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZQotCSAqICAgICAgICAgcHJvcGVydHkgaGFzIG5vdCBiZWVuIHNldCBvciB0aGUgcHJvcGVydHkgbmFtZSBkb2VzIG5vdAotCSAqICAgICAgICAgY29ycmVzcG9uZCB0byBhIGtub3duIENTUyBwcm9wZXJ0eS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgZGVjbGFyYXRpb24KLQkgKiAgICAgICAgICAgICAgICBpcyByZWFkb25seSBvciB0aGUgcHJvcGVydHkgaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyByZW1vdmVQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSA9IGdldERlY2xJdGVtTm9kZShwcm9wZXJ0eU5hbWUpOwotCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQlyZW1vdmVDaGlsZCgoQ1NTTm9kZUltcGwpIGl0ZW0pOwotCQkJcmV0dXJuIGl0ZW0uZ2V0Q3NzVGV4dCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJQ1NTU3R5bGVEZWNsSXRlbSBzZXREZWNsSXRlbU5vZGUoSUNTU1N0eWxlRGVjbEl0ZW0gbmV3RGVjbCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdEZWNsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtID0gZ2V0RGVjbEl0ZW1Ob2RlKG5ld0RlY2wuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlpZiAoaXRlbSAhPSBudWxsKQotCQkJcmV0dXJuIChJQ1NTU3R5bGVEZWNsSXRlbSkgcmVwbGFjZUNoaWxkKChDU1NOb2RlSW1wbCkgbmV3RGVjbCwgKENTU05vZGVJbXBsKSBpdGVtKTsKLQkJZWxzZQotCQkJcmV0dXJuIChJQ1NTU3R5bGVEZWNsSXRlbSkgYXBwZW5kQ2hpbGQoKENTU05vZGVJbXBsKSBuZXdEZWNsKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHNldCBhIHByb3BlcnR5IHZhbHVlIGFuZCBwcmlvcml0eSB3aXRoaW4gdGhpcyBkZWNsYXJhdGlvbgotCSAqIGJsb2NrLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBDU1MgcHJvcGVydHkuIFNlZSB0aGUgQ1NTIHByb3BlcnR5IGluZGV4LgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0JICogQHBhcmFtIHByaW9yaXR5Ci0JICogICAgICAgICAgICBUaGUgbmV3IHByaW9yaXR5IG9mIHRoZSBwcm9wZXJ0eSAoZS5nLgotCSAqICAgICAgICAgICAgPGNvZGU+ImltcG9ydGFudCI8L2NvZGU+KS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGhhcyBhIHN5bnRheAotCSAqICAgICAgICAgICAgICAgIGVycm9yIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBkZWNsYXJhdGlvbgotCSAqICAgICAgICAgICAgICAgIGlzIHJlYWRvbmx5IG9yIHRoZSBwcm9wZXJ0eSBpcyByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdmFsdWUsIFN0cmluZyBwcmlvcml0eSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBZb3UgY2FuIHVzZSB0aGlzIG9ubHkgaWYgQ1NTVmFsdWUuc2V0Q3NzVGV4dCgpIGlzIGltcGxlbWVudGVkCi0JCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIGl0ZW0gPSAoQ1NTU3R5bGVEZWNsSXRlbUltcGwpIGdldERlY2xJdGVtTm9kZShwcm9wZXJ0eU5hbWUpOwotCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQlpdGVtID0gKENTU1N0eWxlRGVjbEl0ZW1JbXBsKSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQ1NTU3R5bGVEZWNsSXRlbShwcm9wZXJ0eU5hbWUpOwotCQkJYXBwZW5kQ2hpbGQoaXRlbSk7Ci0JCX0KLQotCQkvLyBJQ1NTTm9kZSBuZXh0ID0gaXRlbS5nZXROZXh0U2libGluZygpOwotCQkvLyByZW1vdmVDaGlsZChpdGVtKTsKLQotCQlpdGVtLnNldENzc1ZhbHVlVGV4dCh2YWx1ZSk7Ci0JCWl0ZW0uc2V0UHJpb3JpdHkocHJpb3JpdHkpOwotCi0JCS8vIGluc2VydEJlZm9yZShpdGVtLCAoQ1NTTm9kZUltcGwpbmV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZVJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM2NmYwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NTdHlsZVJ1bGVJbXBsIGV4dGVuZHMgQ1NTUnVsZURlY2xDb250YWluZXIgaW1wbGVtZW50cyBJQ1NTU3R5bGVSdWxlIHsKLQotCUlDU1NTZWxlY3Rvckxpc3QgZlNlbGVjdG9yTGlzdCA9IG5ldyBDU1NTZWxlY3Rvckxpc3RJbXBsKG51bGwpOwotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTU3R5bGVSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NTdHlsZVJ1bGVJbXBsKENTU1N0eWxlUnVsZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NTdHlsZVJ1bGVJbXBsIGNsb25lZCA9IG5ldyBDU1NTdHlsZVJ1bGVJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZXh0cmFjdFByZVN0cmluZygpIHsKLQkJcmV0dXJuIGdldFNlbGVjdG9yVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBTVFlMRVJVTEVfTk9ERTsKLQl9Ci0KLQlwdWJsaWMgSUNTU1NlbGVjdG9yTGlzdCBnZXRTZWxlY3RvcnMoKSB7Ci0JCXJldHVybiBmU2VsZWN0b3JMaXN0OwotCX0KLQotCS8qKgotCSAqIFRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZWxlY3RvciBmb3IgdGhlIHJ1bGUgc2V0LiBUaGUKLQkgKiBpbXBsZW1lbnRhdGlvbiBtYXkgaGF2ZSBzdHJpcHBlZCBvdXQgaW5zaWduaWZpY2FudCB3aGl0ZXNwYWNlIHdoaWxlCi0JICogcGFyc2luZyB0aGUgc2VsZWN0b3IuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBDU1Mgc3RyaW5nIHZhbHVlIGhhcwotCSAqICAgICAgICAgICAgICAgIGEgc3ludGF4IGVycm9yIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBydWxlIGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RvclRleHQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoU0VMRUNUT1IpOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBydWxlLCBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdAotCSAqIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNhc3QgZG93biBmcm9tIGFuCi0JICogaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkNTU1J1bGU8L2NvZGU+IGludGVyZmFjZSB0byB0aGUgc3BlY2lmaWMKLQkgKiBkZXJpdmVkIGludGVyZmFjZSBpbXBsaWVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFNUWUxFX1JVTEU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0b3JUZXh0KFN0cmluZyBzZWxlY3RvclRleHQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzZXRBdHRyaWJ1dGUoU0VMRUNUT1IsIHNlbGVjdG9yVGV4dCk7Ci0JCWZTZWxlY3Rvckxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChzZWxlY3RvclRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVTaGVldEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVTaGVldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzMWZmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlU2hlZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ1NTRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0NoYXJzZXRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01lZGlhUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1BhZ2VSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuSW1wb3J0UnVsZUNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NVbmtub3duUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldDsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0TGlzdDsKLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTU3R5bGVTaGVldEltcGwgZXh0ZW5kcyBDU1NEb2N1bWVudEltcGwgaW1wbGVtZW50cyBJQ1NTU3R5bGVTaGVldCB7Ci0KLQotCWNsYXNzIEludGVybmFsTm9kZUxpc3QgaW1wbGVtZW50cyBOb2RlTGlzdCB7Ci0KLQkJVmVjdG9yIG5vZGVzID0gbmV3IFZlY3RvcigpOwotCi0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJaWYgKG5vZGVzID09IG51bGwpCi0JCQkJcmV0dXJuIDA7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG5vZGVzLnNpemUoKTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIGl0ZW0oaW50IGkpIHsKLQkJCWlmIChub2RlcyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKGkgPCAwIHx8IG5vZGVzLnNpemUoKSA8PSBpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIChOb2RlKSBub2Rlcy5nZXQoaSk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBJbnRlcm5hbFN0eWxlU2hlZXRMaXN0IGV4dGVuZHMgQWJzdHJhY3RDU1NOb2RlTGlzdCBpbXBsZW1lbnRzIFN0eWxlU2hlZXRMaXN0IHsKLQotCQlwdWJsaWMgSUNTU05vZGUgYXBwZW5kTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCQlpZiAobm9kZXMgPT0gbnVsbCB8fCAhbm9kZXMuY29udGFpbnMobm9kZSkpCi0JCQkJcmV0dXJuIHN1cGVyLmFwcGVuZE5vZGUobm9kZSk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgU3R5bGVTaGVldCBpdGVtKGludCBpKSB7Ci0JCQlyZXR1cm4gKFN0eWxlU2hlZXQpIGl0ZW1JbXBsKGkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGZEaXNhYmxlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTU3R5bGVTaGVldEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JfQotCi0JQ1NTU3R5bGVTaGVldEltcGwoQ1NTU3R5bGVTaGVldEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQkJc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBhcHBlbmRSdWxlKG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAocnVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTUnVsZSByZXQgPSAoQ1NTUnVsZSkgYXBwZW5kQ2hpbGQoKENTU05vZGVJbXBsKSBydWxlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NTdHlsZVNoZWV0SW1wbCBjbG9uZWQgPSBuZXcgQ1NTU3R5bGVTaGVldEltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU0NoYXJzZXRSdWxlCi0JICovCi0JcHVibGljIElDU1NDaGFyc2V0UnVsZSBjcmVhdGVDU1NDaGFyc2V0UnVsZSgpIHsKLQkJQ1NTQ2hhcnNldFJ1bGVJbXBsIHJ1bGUgPSBuZXcgQ1NTQ2hhcnNldFJ1bGVJbXBsKCk7Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlCi0JICovCi0JcHVibGljIENTU0ZvbnRGYWNlUnVsZSBjcmVhdGVDU1NGb250RmFjZVJ1bGUoKSB7Ci0JCUNTU0ZvbnRGYWNlUnVsZUltcGwgcnVsZSA9IG5ldyBDU1NGb250RmFjZVJ1bGVJbXBsKCk7Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsIHN0eWxlID0gKENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKSBjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCk7Ci0KLQkJcnVsZS5hcHBlbmRDaGlsZChzdHlsZSk7Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NJbXBvcnRSdWxlCi0JICovCi0JcHVibGljIElDU1NJbXBvcnRSdWxlIGNyZWF0ZUNTU0ltcG9ydFJ1bGUoKSB7Ci0JCUNTU0ltcG9ydFJ1bGVJbXBsIHJ1bGUgPSBuZXcgQ1NTSW1wb3J0UnVsZUltcGwoKTsKLQkJTWVkaWFMaXN0SW1wbCBtZWRpYSA9IChNZWRpYUxpc3RJbXBsKSBjcmVhdGVNZWRpYUxpc3QoKTsKLQotCQlydWxlLmFwcGVuZENoaWxkKG1lZGlhKTsKLQkJcnVsZS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLklDU1NNZWRpYVJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU01lZGlhUnVsZSBjcmVhdGVDU1NNZWRpYVJ1bGUoKSB7Ci0JCUNTU01lZGlhUnVsZUltcGwgcnVsZSA9IG5ldyBDU1NNZWRpYVJ1bGVJbXBsKCk7Ci0JCU1lZGlhTGlzdEltcGwgbWVkaWEgPSAoTWVkaWFMaXN0SW1wbCkgY3JlYXRlTWVkaWFMaXN0KCk7Ci0KLQkJcnVsZS5pbnNlcnRCZWZvcmUobWVkaWEsIChDU1NOb2RlSW1wbCkgcnVsZS5nZXRGaXJzdENoaWxkKCkpOyAvLyBtZWRpYQotCQkJCQkJCQkJCQkJCQkJCQkJLy8gbXVzdAotCQkJCQkJCQkJCQkJCQkJCQkJLy8gYmUKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJLy8gdG9wCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBvZgotCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2hpbGRyZW4KLQkJCQkJCQkJCQkJCQkJCQkJCS8vIGxpc3QKLQkJcnVsZS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1BhZ2VSdWxlCi0JICovCi0JcHVibGljIElDU1NQYWdlUnVsZSBjcmVhdGVDU1NQYWdlUnVsZSgpIHsKLQkJQ1NTUGFnZVJ1bGVJbXBsIHJ1bGUgPSBuZXcgQ1NTUGFnZVJ1bGVJbXBsKCk7Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsIHN0eWxlID0gKENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKSBjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCk7Ci0KLQkJcnVsZS5hcHBlbmRDaGlsZChzdHlsZSk7Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ1NTUnVsZSBjcmVhdGVDU1NSdWxlKFN0cmluZyBydWxlKSB7Ci0JCUNTU0RvY3VtZW50TG9hZGVyIGxvYWRlciA9IG5ldyBDU1NEb2N1bWVudExvYWRlcigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBsb2FkZXIuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5zZXQocnVsZSk7Ci0KLQkJLy9DU1NNb2RlbFBhcnNlciBtb2RlbFBhcnNlciA9IG5ldyBDU1NNb2RlbFBhcnNlcigoQ1NTRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCkpOwotCQlDU1NNb2RlbFBhcnNlciBtb2RlbFBhcnNlciA9IG5ldyBDU1NNb2RlbFBhcnNlcihnZXRPd25lckRvY3VtZW50KCkpOwotCQlyZXR1cm4gbW9kZWxQYXJzZXIuY3JlYXRlQ1NTUnVsZShzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uTGlzdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIElDU1NTdHlsZURlY2xhcmF0aW9uIGNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKSB7Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsIGRlY2wgPSBuZXcgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwoZmFsc2UpOwotCQlkZWNsLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIGRlY2w7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVSdWxlCi0JICovCi0JcHVibGljIElDU1NTdHlsZVJ1bGUgY3JlYXRlQ1NTU3R5bGVSdWxlKCkgewotCQlDU1NTdHlsZVJ1bGVJbXBsIHJ1bGUgPSBuZXcgQ1NTU3R5bGVSdWxlSW1wbCgpOwotCQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBzdHlsZSA9IChDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCkgY3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpOwotCi0JCXJ1bGUuYXBwZW5kQ2hpbGQoc3R5bGUpOwotCQlydWxlLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTVW5rbm93blJ1bGUKLQkgKi8KLQlwdWJsaWMgQ1NTVW5rbm93blJ1bGUgY3JlYXRlQ1NTVW5rbm93blJ1bGUoKSB7Ci0JCUNTU1Vua25vd25SdWxlSW1wbCBydWxlID0gbmV3IENTU1Vua25vd25SdWxlSW1wbCgpOwotCQlydWxlLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3QKLQkgKi8KLQlwdWJsaWMgTWVkaWFMaXN0IGNyZWF0ZU1lZGlhTGlzdCgpIHsKLQkJTWVkaWFMaXN0SW1wbCBtZWRpYSA9IG5ldyBNZWRpYUxpc3RJbXBsKCk7Ci0JCW1lZGlhLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIG1lZGlhOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gZGVsZXRlIGEgcnVsZSBmcm9tIHRoZSBzdHlsZSBzaGVldC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIFRoZSBpbmRleCB3aXRoaW4gdGhlIHN0eWxlIHNoZWV0J3MgcnVsZSBsaXN0IG9mIHRoZSBydWxlIHRvCi0JICogICAgICAgICAgICByZW1vdmUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTkRFWF9TSVpFX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgaW5kZXggZG9lcyBub3QKLQkgKiAgICAgICAgICAgICAgICBjb3JyZXNwb25kIHRvIGEgcnVsZSBpbiB0aGUgc3R5bGUgc2hlZXQncyBydWxlIGxpc3QuCi0JICogICAgICAgICAgICAgICAgPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgc3R5bGUgc2hlZXQKLQkgKiAgICAgICAgICAgICAgICBpcyByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVSdWxlKGludCBpbmRleCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCUNTU05vZGVJbXBsIG5vZGUgPSBnZXRJbmRleGVkUnVsZShpbmRleCk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZW1vdmVDaGlsZChub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbGlzdCBvZiBhbGwgQ1NTIHJ1bGVzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHN0eWxlIHNoZWV0LiBUaGlzCi0JICogaW5jbHVkZXMgYm90aCBydWxlIHNldHMgYW5kIGF0LXJ1bGVzLgotCSAqLwotCXB1YmxpYyBDU1NSdWxlTGlzdCBnZXRDc3NSdWxlcygpIHsKLQkJQ1NTUnVsZUxpc3RJbXBsIGxpc3QgPSBuZXcgQ1NTUnVsZUxpc3RJbXBsKCk7Ci0KLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUnVsZSkgewotCQkJCWxpc3QuYXBwZW5kTm9kZShub2RlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgc3R5bGUgc2hlZXQgaXMgYXBwbGllZCB0byB0aGUgZG9jdW1lbnQuCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgaXMgbm90LiBNb2RpZnlpbmcgdGhpcyBhdHRyaWJ1dGUgbWF5IGNhdXNlIGEKLQkgKiBuZXcgcmVzb2x1dGlvbiBvZiBzdHlsZSBmb3IgdGhlIGRvY3VtZW50LiBBIHN0eWxlc2hlZXQgb25seSBhcHBsaWVzIGlmCi0JICogYm90aCBhbiBhcHByb3ByaWF0ZSBtZWRpdW0gZGVmaW5pdGlvbiBpcyBwcmVzZW50IGFuZCB0aGUgZGlzYWJsZWQKLQkgKiBhdHRyaWJ1dGUgaXMgZmFsc2UuIFNvLCBpZiB0aGUgbWVkaWEgZG9lc24ndCBhcHBseSB0byB0aGUgY3VycmVudCB1c2VyCi0JICogYWdlbnQsIHRoZSA8Y29kZT5kaXNhYmxlZDwvY29kZT4gYXR0cmlidXRlIGlzIGlnbm9yZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RGlzYWJsZWQoKSB7Ci0JCXJldHVybiBmRGlzYWJsZWQ7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHN0eWxlIHNoZWV0IGlzIGEgbGlua2VkIHN0eWxlIHNoZWV0LCB0aGUgdmFsdWUgb2YgaXRzIGF0dHJpYnV0ZQotCSAqIGlzIGl0cyBsb2NhdGlvbi4gRm9yIGlubGluZSBzdHlsZSBzaGVldHMsIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZQotCSAqIGlzIDxjb2RlPm51bGw8L2NvZGU+LiBTZWUgdGhlIGhyZWYgYXR0cmlidXRlIGRlZmluaXRpb24gZm9yIHRoZQotCSAqIDxjb2RlPkxJTks8L2NvZGU+IGVsZW1lbnQgaW4gSFRNTCA0LjAsIGFuZCB0aGUgaHJlZiBwc2V1ZG8tYXR0cmlidXRlCi0JICogZm9yIHRoZSBYTUwgc3R5bGUgc2hlZXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhyZWYoKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0gSUNTU01vZGVsLkVYVEVSTkFMKSB7Ci0JCQlyZXR1cm4gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkvKgotCQkJICogT2JqZWN0IGlkID0gbW9kZWwuZ2V0SWQoKTsgaWYgKGlkICE9IG51bGwpIHsgaWYgKGlkIGluc3RhbmNlb2YKLQkJCSAqIElSZXNvdXJjZSkgeyAvLyBUT0RPOiBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBpcyBjb3JyZWN0IG9yCi0JCQkgKiBub3QsIGxhdGVyLiByZXR1cm4gKChJUmVzb3VyY2UpaWQpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsgfQotCQkJICogcmV0dXJuIGlkLnRvU3RyaW5nKCk7IH0KLQkJCSAqL30KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQ1NTUnVsZUltcGwgZ2V0SW5kZXhlZFJ1bGUoaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1J1bGUpIHsKLQkJCQlpZiAoaSsrID09IGluZGV4KQotCQkJCQlyZXR1cm4gKENTU1J1bGVJbXBsKSBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSBpbnRlbmRlZCBkZXN0aW5hdGlvbiBtZWRpYSBmb3Igc3R5bGUgaW5mb3JtYXRpb24uIFRoZSBtZWRpYSBpcwotCSAqIG9mdGVuIHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+b3duZXJOb2RlPC9jb2RlPi4gSWYgbm8gbWVkaWEgaGFzIGJlZW4KLQkgKiBzcGVjaWZpZWQsIHRoZSA8Y29kZT5NZWRpYUxpc3Q8L2NvZGU+IHdpbGwgYmUgZW1wdHkuIFNlZSB0aGUgbWVkaWEKLQkgKiBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgdGhlIDxjb2RlPkxJTks8L2NvZGU+IGVsZW1lbnQgaW4gSFRNTCA0LjAsCi0JICogYW5kIHRoZSBtZWRpYSBwc2V1ZG8tYXR0cmlidXRlIGZvciB0aGUgWE1MIHN0eWxlIHNoZWV0IHByb2Nlc3NpbmcKLQkgKiBpbnN0cnVjdGlvbiAuIE1vZGlmeWluZyB0aGUgbWVkaWEgbGlzdCBtYXkgY2F1c2UgYSBjaGFuZ2UgdG8gdGhlCi0JICogYXR0cmlidXRlIDxjb2RlPmRpc2FibGVkPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTWVkaWFMaXN0IGdldE1lZGlhKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gU1RZTEVTSEVFVF9OT0RFOwotCX0KLQotCS8qKgotCSAqIFRoZSBub2RlIHRoYXQgYXNzb2NpYXRlcyB0aGlzIHN0eWxlIHNoZWV0IHdpdGggdGhlIGRvY3VtZW50LiBGb3IgSFRNTCwKLQkgKiB0aGlzIG1heSBiZSB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5MSU5LPC9jb2RlPiBvciA8Y29kZT5TVFlMRTwvY29kZT4KLQkgKiBlbGVtZW50LiBGb3IgWE1MLCBpdCBtYXkgYmUgdGhlIGxpbmtpbmcgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4gRm9yCi0JICogc3R5bGUgc2hlZXRzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5IG90aGVyIHN0eWxlIHNoZWV0cywgdGhlIHZhbHVlIG9mIHRoaXMKLQkgKiBhdHRyaWJ1dGUgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIE5vZGUgZ2V0T3duZXJOb2RlKCkgewotCQkvLyBmb3IgPExJTks+IHRhZyBvciA8U1RZTEU+IHRhZwotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCXJldHVybiBtb2RlbC5nZXRPd25lckRPTU5vZGUoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlTGlzdAotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlTGlzdCBnZXRPd25lck5vZGVzKCkgewotCQlMaXN0IGxpc3QgPSAoZ2V0TW9kZWwoKS5nZXRTdHlsZUxpc3RlbmVycygpICE9IG51bGwpID8gbmV3IFZlY3RvcihnZXRNb2RlbCgpLmdldFN0eWxlTGlzdGVuZXJzKCkpIDogbnVsbDsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJbnRlcm5hbE5vZGVMaXN0IG5vZGVzID0gbmV3IEludGVybmFsTm9kZUxpc3QoKTsKLQkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVN0eWxlU2hlZXRBZGFwdGVyKSB7Ci0JCQkJbm9kZXMubm9kZXMuYWRkKCgoSVN0eWxlU2hlZXRBZGFwdGVyKSBvYmopLmdldEVsZW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5vZGVzLmdldExlbmd0aCgpID4gMCkKLQkJCXJldHVybiBub2RlczsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlTGlzdAotCSAqIEBwYXJhbSBkb2MKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50Ci0JICovCi0JcHVibGljIE5vZGVMaXN0IGdldE93bmVyTm9kZXMoRG9jdW1lbnQgZG9jKSB7Ci0JCUxpc3QgbGlzdCA9IChnZXRNb2RlbCgpLmdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCkgPyBuZXcgVmVjdG9yKGdldE1vZGVsKCkuZ2V0U3R5bGVMaXN0ZW5lcnMoKSkgOiBudWxsOwotCQlpZiAobGlzdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUludGVybmFsTm9kZUxpc3Qgbm9kZXMgPSBuZXcgSW50ZXJuYWxOb2RlTGlzdCgpOwotCQlJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU3R5bGVTaGVldEFkYXB0ZXIpIHsKLQkJCQlFbGVtZW50IGVsZSA9ICgoSVN0eWxlU2hlZXRBZGFwdGVyKSBvYmopLmdldEVsZW1lbnQoKTsKLQkJCQlpZiAoZWxlLmdldE93bmVyRG9jdW1lbnQoKSA9PSBkb2MpCi0JCQkJCW5vZGVzLm5vZGVzLmFkZChlbGUpOwotCQkJfQotCQl9Ci0JCWlmIChub2Rlcy5nZXRMZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gbm9kZXM7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIElmIHRoaXMgc3R5bGUgc2hlZXQgY29tZXMgZnJvbSBhbiA8Y29kZT5AaW1wb3J0PC9jb2RlPiBydWxlLCB0aGUgPGNvZGU+b3duZXJSdWxlPC9jb2RlPiBhdHRyaWJ1dGUgd2lsbAotCSAqICAgICAgICAgY29udGFpbiB0aGUgPGNvZGU+Q1NTSW1wb3J0UnVsZTwvY29kZT4uIEluIHRoYXQgY2FzZSwgdGhlCi0JICogICAgICAgICA8Y29kZT5vd25lck5vZGU8L2NvZGU+IGF0dHJpYnV0ZSBpbiB0aGUKLQkgKiAgICAgICAgIDxjb2RlPlN0eWxlU2hlZXQ8L2NvZGU+IGludGVyZmFjZSB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqICAgICAgICAgSWYgdGhlIHN0eWxlIHNoZWV0IGNvbWVzIGZyb20gYW4gZWxlbWVudCBvciBhIHByb2Nlc3NpbmcKLQkgKiAgICAgICAgIGluc3RydWN0aW9uLCB0aGUgPGNvZGU+b3duZXJSdWxlPC9jb2RlPiBhdHRyaWJ1dGUgd2lsbCBiZQotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gYW5kIHRoZSA8Y29kZT5vd25lck5vZGU8L2NvZGU+IGF0dHJpYnV0ZQotCSAqICAgICAgICAgd2lsbCBjb250YWluIHRoZSA8Y29kZT5Ob2RlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQ1NTUnVsZSBnZXRPd25lclJ1bGUoKSB7Ci0JCUFzc2VydC5pc1RydWUoZmFsc2UsIENTU0NvcmVNZXNzYWdlcy5Zb3VfY2Fubm90X3VzZV9DU1NTdHlsZVNoZV9VSV8pOyAvLyROT04tTkxTLTEkID0gIllvdSBjYW5ub3QgdXNlIENTU1N0eWxlU2hlZXQuZ2V0T3duZXJSdWxlKCkgYmVjYXVzZSBvZiBtYW55IHJlZmVyZW5jZXJzIG9mIHRoaXMgcnVsZVxuUGxlYXNlIHVzZSBnZXRPbndlclJ1bGVzKCkiCi0JCS8vIGZvciBAaW1wb3J0Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGVMaXN0Ci0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlTGlzdCBnZXRPd25lclJ1bGVzKCkgewotCQlTdHlsZVNoZWV0TGlzdCBsaXN0ID0gZ2V0UGFyZW50U3R5bGVTaGVldHMoKTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDU1NSdWxlTGlzdEltcGwgcnVsZUxpc3QgPSBuZXcgQ1NTUnVsZUxpc3RJbXBsKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlJbXBvcnRSdWxlQ29sbGVjdG9yIHRyYXYgPSBuZXcgSW1wb3J0UnVsZUNvbGxlY3Rvcih0aGlzKTsKLQkJCXRyYXYuYXBwbHkoKElDU1NTdHlsZVNoZWV0KSBsaXN0Lml0ZW0oaSkpOwotCQkJcnVsZUxpc3Qubm9kZXMuYWRkQWxsKHRyYXYuZ2V0UnVsZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIHJ1bGVMaXN0OwotCX0KLQotCS8qKgotCSAqIEZvciBzdHlsZSBzaGVldCBsYW5ndWFnZXMgdGhhdCBzdXBwb3J0IHRoZSBjb25jZXB0IG9mIHN0eWxlIHNoZWV0Ci0JICogaW5jbHVzaW9uLCB0aGlzIGF0dHJpYnV0ZSByZXByZXNlbnRzIHRoZSBpbmNsdWRpbmcgc3R5bGUgc2hlZXQsIGlmIG9uZQotCSAqIGV4aXN0cy4gSWYgdGhlIHN0eWxlIHNoZWV0IGlzIGEgdG9wLWxldmVsIHN0eWxlIHNoZWV0LCBvciB0aGUgc3R5bGUKLQkgKiBzaGVldCBsYW5ndWFnZSBkb2VzIG5vdCBzdXBwb3J0IGluY2x1c2lvbiwgdGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlCi0JICogaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFN0eWxlU2hlZXQgZ2V0UGFyZW50U3R5bGVTaGVldCgpIHsKLQkJQ1NTUnVsZSBvd25lciA9IGdldE93bmVyUnVsZSgpOwotCQlpZiAob3duZXIgIT0gbnVsbCkKLQkJCXJldHVybiBvd25lci5nZXRQYXJlbnRTdHlsZVNoZWV0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3QKLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3QgZ2V0UGFyZW50U3R5bGVTaGVldHMoKSB7Ci0JCUxpc3QgbGlzdCA9IChnZXRNb2RlbCgpLmdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCkgPyBuZXcgVmVjdG9yKGdldE1vZGVsKCkuZ2V0U3R5bGVMaXN0ZW5lcnMoKSkgOiBudWxsOwotCQlpZiAobGlzdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUludGVybmFsU3R5bGVTaGVldExpc3Qgc2hlZXRzID0gbmV3IEludGVybmFsU3R5bGVTaGVldExpc3QoKTsKLQkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQkJc2hlZXRzLmFwcGVuZE5vZGUoKChJQ1NTTW9kZWwpIG9iaikuZ2V0RG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNoZWV0cy5nZXRMZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gc2hlZXRzOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYWR2aXNvcnkgdGl0bGUuIFRoZSB0aXRsZSBpcyBvZnRlbiBzcGVjaWZpZWQgaW4gdGhlCi0JICogPGNvZGU+b3duZXJOb2RlPC9jb2RlPi4gU2VlIHRoZSB0aXRsZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgdGhlCi0JICogPGNvZGU+TElOSzwvY29kZT4gZWxlbWVudCBpbiBIVE1MIDQuMCwgYW5kIHRoZSB0aXRsZSBwc2V1ZG8tYXR0cmlidXRlCi0JICogZm9yIHRoZSBYTUwgc3R5bGUgc2hlZXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlOb2RlIG5vZGUgPSBnZXRPd25lck5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChFbGVtZW50KSBub2RlKS5nZXRBdHRyaWJ1dGUoIlRJVExFIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIHRoZSBzdHlsZSBzaGVldCBsYW5ndWFnZSBmb3IgdGhpcyBzdHlsZSBzaGVldC4gVGhlIHN0eWxlCi0JICogc2hlZXQgbGFuZ3VhZ2UgaXMgc3BlY2lmaWVkIGFzIGEgY29udGVudCB0eXBlIChlLmcuICJ0ZXh0L2NzcyIpLiBUaGUKLQkgKiBjb250ZW50IHR5cGUgaXMgb2Z0ZW4gc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5vd25lck5vZGU8L2NvZGU+LiBBbHNvCi0JICogc2VlIHRoZSB0eXBlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGZvciB0aGUgPGNvZGU+TElOSzwvY29kZT4gZWxlbWVudAotCSAqIGluIEhUTUwgNC4wLCBhbmQgdGhlIHR5cGUgcHNldWRvLWF0dHJpYnV0ZSBmb3IgdGhlIFhNTCBzdHlsZSBzaGVldAotCSAqIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlOb2RlIG5vZGUgPSBnZXRPd25lck5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChFbGVtZW50KSBub2RlKS5nZXRBdHRyaWJ1dGUoIlRZUEUiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byBpbnNlcnQgYSBuZXcgcnVsZSBpbnRvIHRoZSBzdHlsZSBzaGVldC4gVGhlIG5ldyBydWxlIG5vdwotCSAqIGJlY29tZXMgcGFydCBvZiB0aGUgY2FzY2FkZS4KLQkgKiAKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgVGhlIHBhcnNhYmxlIHRleHQgcmVwcmVzZW50aW5nIHRoZSBydWxlLiBGb3IgcnVsZSBzZXRzIHRoaXMKLQkgKiAgICAgICAgICAgIGNvbnRhaW5zIGJvdGggdGhlIHNlbGVjdG9yIGFuZCB0aGUgc3R5bGUgZGVjbGFyYXRpb24uIEZvcgotCSAqICAgICAgICAgICAgYXQtcnVsZXMsIHRoaXMgc3BlY2lmaWVzIGJvdGggdGhlIGF0LWlkZW50aWZpZXIgYW5kIHRoZSBydWxlCi0JICogICAgICAgICAgICBjb250ZW50LgotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgVGhlIGluZGV4IHdpdGhpbiB0aGUgc3R5bGUgc2hlZXQncyBydWxlIGxpc3Qgb2YgdGhlIHJ1bGUKLQkgKiAgICAgICAgICAgIGJlZm9yZSB3aGljaCB0byBpbnNlcnQgdGhlIHNwZWNpZmllZCBydWxlLiBJZiB0aGUgc3BlY2lmaWVkCi0JICogICAgICAgICAgICBpbmRleCBpcyBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzdHlsZSBzaGVldCdzIHJ1bGUKLQkgKiAgICAgICAgICAgIGNvbGxlY3Rpb24sIHRoZSBydWxlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgc3R5bGUKLQkgKiAgICAgICAgICAgIHNoZWV0LgotCSAqIEByZXR1cm4gVGhlIGluZGV4IHdpdGhpbiB0aGUgc3R5bGUgc2hlZXQncyBydWxlIGNvbGxlY3Rpb24gb2YgdGhlIG5ld2x5Ci0JICogICAgICAgICBpbnNlcnRlZCBydWxlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSElFUkFSQ0hZX1JFUVVFU1RfRVJSOiBSYWlzZWQgaWYgdGhlIHJ1bGUgY2Fubm90IGJlCi0JICogICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBlLmcuIGlmIGFuCi0JICogICAgICAgICAgICAgICAgPGNvZGU+QGltcG9ydDwvY29kZT4gcnVsZSBpcyBpbnNlcnRlZCBhZnRlciBhIHN0YW5kYXJkIHJ1bGUgc2V0IG9yIG90aGVyCi0JICogICAgICAgICBhdC1ydWxlLiA8YnI+Ci0JICogICAgICAgICBJTkRFWF9TSVpFX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgaW5kZXggaXMgbm90IGEgdmFsaWQKLQkgKiAgICAgICAgIGluc2VydGlvbiBwb2ludC4gPGJyPgotCSAqICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBzdHlsZSBzaGVldCBpcwotCSAqICAgICAgICAgcmVhZG9ubHkuIDxicj4KLQkgKiAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHJ1bGUgaGFzIGEgc3ludGF4IGVycm9yIGFuZAotCSAqICAgICAgICAgaXMgdW5wYXJzYWJsZS4KLQkgKi8KLQlwdWJsaWMgaW50IGluc2VydFJ1bGUoU3RyaW5nIHJ1bGUsIGludCBpbmRleCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWludCBsZW5ndGggPSBnZXRDc3NSdWxlcygpLmdldExlbmd0aCgpOwotCQlpZiAoaW5kZXggPCAwIHx8IGxlbmd0aCA8IGluZGV4KQotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBnZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDU1NSdWxlSW1wbCByZWZSdWxlID0gKGxlbmd0aCAhPSBpbmRleCkgPyBnZXRJbmRleGVkUnVsZShpbmRleCkgOiBudWxsOwotCQlpbnQgb2Zmc2V0ID0gKHJlZlJ1bGUgIT0gbnVsbCkgPyByZWZSdWxlLmdldFN0YXJ0T2Zmc2V0KCkgOiBkb2MuZ2V0TGVuZ3RoKCk7Ci0JCWRvYy5yZXBsYWNlVGV4dCh0aGlzLCBvZmZzZXQsIDAsIHJ1bGUpOwotCi0JCS8vIGluc2VydEJlZm9yZSgoQ1NTTm9kZUltcGwpIGNyZWF0ZUNTU1J1bGUocnVsZSkscmVmUnVsZSk7Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIG5ld1J1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJlZlJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIGluc2VydFJ1bGVCZWZvcmUob3JnLnczYy5kb20uY3NzLkNTU1J1bGUgbmV3UnVsZSwgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgcmVmUnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdSdWxlID09IG51bGwgJiYgcmVmUnVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTUnVsZSByZXQgPSAoQ1NTUnVsZSkgaW5zZXJ0QmVmb3JlKChDU1NOb2RlSW1wbCkgbmV3UnVsZSwgKENTU05vZGVJbXBsKSByZWZSdWxlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RvY3VtZW50KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSByZW1vdmVSdWxlKG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAocnVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTUnVsZSByZXQgPSAoQ1NTUnVsZSkgcmVtb3ZlQ2hpbGQoKENTU05vZGVJbXBsKSBydWxlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBvbGRDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJlcGxhY2VSdWxlKG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIG5ld1J1bGUsIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIG9sZFJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAobmV3UnVsZSA9PSBudWxsICYmIG9sZFJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU1J1bGUgcmV0ID0gKENTU1J1bGUpIHJlcGxhY2VDaGlsZCgoQ1NTTm9kZUltcGwpIG5ld1J1bGUsIChDU1NOb2RlSW1wbCkgb2xkUnVsZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogc2V0RGlzYWJsZWQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzYWJsZWQoYm9vbGVhbiBkaXNhYmxlZCkgewotCQl0aGlzLmZEaXNhYmxlZCA9IGRpc2FibGVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTVW5rbm93blJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1Vua25vd25SdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTNlZDc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTVW5rbm93blJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVW5rbm93blJ1bGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTVW5rbm93blJ1bGVJbXBsIGV4dGVuZHMgQ1NTUnVsZUltcGwgaW1wbGVtZW50cyBDU1NVbmtub3duUnVsZSB7Ci0KLQkvLyBUT0RPOiBUaGlzIGZpZWxkIGlzIG5ldmVyIHJlYWQKLQlTdHJpbmcgZkNzc1RleHQgPSBudWxsOwotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTVW5rbm93blJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCUNTU1Vua25vd25SdWxlSW1wbChDU1NVbmtub3duUnVsZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NVbmtub3duUnVsZUltcGwgY2xvbmVkID0gbmV3IENTU1Vua25vd25SdWxlSW1wbCh0aGlzKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBVTktOT1dOUlVMRV9OT0RFOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBydWxlLCBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdAotCSAqIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNhc3QgZG93biBmcm9tIGFuCi0JICogaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkNTU1J1bGU8L2NvZGU+IGludGVyZmFjZSB0byB0aGUgc3BlY2lmaWMKLQkgKiBkZXJpdmVkIGludGVyZmFjZSBpbXBsaWVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFVOS05PV05fUlVMRTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY3NzVGV4dAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENzc1RleHQoU3RyaW5nIGNzc1RleHQpIHsKLQkJdGhpcy5mQ3NzVGV4dCA9IGNzc1RleHQ7Ci0KLQkJc3VwZXIuc2V0Q3NzVGV4dChjc3NUZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NvdW50ZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NvdW50ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiOTIxZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Db3VudGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ291bnRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNvdW50ZXI7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ291bnRlckltcGwgZXh0ZW5kcyBDU1NQcmltaXRpdmVDb250YWluZXIgaW1wbGVtZW50cyBJQ291bnRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDb3VudGVySW1wbCgpIHsKLQkJc3VwZXIoQ1NTX0NPVU5URVIpOwotCX0KLQotCUNvdW50ZXJJbXBsKENvdW50ZXJJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ291bnRlckltcGwgY2xvbmVkID0gbmV3IENvdW50ZXJJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgQ291bnRlciB2YWx1ZS4gSWYgdGhpcyBDU1MgdmFsdWUgZG9lc24ndAotCSAqIGNvbnRhaW4gYSBjb3VudGVyIHZhbHVlLCBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gaXMgcmFpc2VkLgotCSAqIE1vZGlmaWNhdGlvbiB0byB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBwcm9wZXJ0eSBjYW4gYmUgYWNoaWV2ZWQgdXNpbmcKLQkgKiB0aGUgPGNvZGU+Q291bnRlcjwvY29kZT4gaW50ZXJmYWNlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIENvdW50ZXIgdmFsdWUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0FDQ0VTU19FUlI6IFJhaXNlZCBpZiB0aGUgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiAgICAgICAgICAgICAgICBjb250YWluIGEgQ291bnRlciB2YWx1ZSAoZS5nLiB0aGlzIGlzIG5vdAotCSAqICAgICAgICAgICAgICAgIDxjb2RlPkNTU19DT1VOVEVSPC9jb2RlPikuCi0JICovCi0JcHVibGljIENvdW50ZXIgZ2V0Q291bnRlclZhbHVlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBjb3VudGVyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShJREVOVElGSUVSKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgc3R5bGUgb2YgdGhlIGxpc3QuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXN0U3R5bGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoTElTVFNUWUxFKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgc2VwYXJhdG9yIG9mIHRoZSBuZXN0ZWQgY291bnRlcnMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXBhcmF0b3IoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoU0VQQVJBVE9SKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0UHJpbWl0aXZlcygpIHsKLQkJcmV0dXJuOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpZGVudGlmaWVyCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzZXRBdHRyaWJ1dGUoSURFTlRJRklFUiwgaWRlbnRpZmllcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpc3RTdHlsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0U3R5bGUoU3RyaW5nIGxpc3RTdHlsZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXNldEF0dHJpYnV0ZShMSVNUU1RZTEUsIGxpc3RTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIFNlcGFyYXRvcgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXBhcmF0b3IoU3RyaW5nIFNlcGFyYXRvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldEF0dHJpYnV0ZShTRVBBUkFUT1IsIFNlcGFyYXRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9ET01DU1NJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RPTUNTU0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI3OTA3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RPTUNTU0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZVNoZWV0OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBET01DU1NJbXBsIHsKLQotCS8qKgotCSAqIERPTUNTU0ltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRE9NQ1NTSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElDU1NTdHlsZURlY2xhcmF0aW9uIGNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgZG9jdW1lbnQgPSBuZXcgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwodHJ1ZSk7Ci0KLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlU2hlZXQKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbWVkaWEKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBDU1NTdHlsZVNoZWV0IGNyZWF0ZUNTU1N0eWxlU2hlZXQoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVkaWEpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IENTU1N0eWxlU2hlZXRJbXBsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9NZWRpYUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L01lZGlhTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0YjNiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L01lZGlhTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0OwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIE1lZGlhTGlzdEltcGwgZXh0ZW5kcyBDU1NSZWdpb25Db250YWluZXIgaW1wbGVtZW50cyBNZWRpYUxpc3QgewotCi0JaW50IG1lZGl1bUNvdW50ZXI7Ci0KLQkvKioKLQkgKiBNZWRpYUxpc3RJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JTWVkaWFMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBNZWRpYUxpc3RJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JTWVkaWFMaXN0SW1wbChNZWRpYUxpc3RJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbWVkaXVtIDxjb2RlPm5ld01lZGl1bTwvY29kZT4gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gSWYgdGhlCi0JICogPGNvZGU+bmV3TWVkaXVtPC9jb2RlPiBpcyBhbHJlYWR5IHVzZWQsIGl0IGlzIGZpcnN0IHJlbW92ZWQuCi0JICogCi0JICogQHBhcmFtIG5ld01lZGl1bVRoZQotCSAqICAgICAgICAgICAgbmV3IG1lZGl1bSB0byBhZGQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0NIQVJBQ1RFUl9FUlI6IElmIHRoZSBtZWRpdW0gY29udGFpbnMgY2hhcmFjdGVycwotCSAqICAgICAgICAgICAgICAgIHRoYXQgYXJlIGludmFsaWQgaW4gdGhlIHVuZGVybHlpbmcgc3R5bGUgbGFuZ3VhZ2UuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIGxpc3QgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBlbmRNZWRpdW0oU3RyaW5nIG5ld01lZGl1bSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdNZWRpdW0gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlDU1NOb2RlTGlzdEltcGwgbSA9IGdldE1lZGlhKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpICE9IG0uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKG5ld01lZGl1bS5lcXVhbHMoaXRlbShpKSkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJc2V0QXR0cmlidXRlKCJtZWRpdW0iICsgSW50ZWdlci50b1N0cmluZyhtZWRpdW1Db3VudGVyKyspLCBuZXdNZWRpdW0pOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlNZWRpYUxpc3RJbXBsIGNsb25lZCA9IG5ldyBNZWRpYUxpc3RJbXBsKHRoaXMpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIG1lZGl1bSBpbmRpY2F0ZWQgYnkgPGNvZGU+b2xkTWVkaXVtPC9jb2RlPiBmcm9tIHRoZSBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBvbGRNZWRpdW1UaGUKLQkgKiAgICAgICAgICAgIG1lZGl1bSB0byBkZWxldGUgaW4gdGhlIG1lZGlhIGxpc3QuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIGxpc3QgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PVF9GT1VORF9FUlI6IFJhaXNlZCBpZiA8Y29kZT5vbGRNZWRpdW08L2NvZGU+IGlzIG5vdAotCSAqICAgICAgICAgICAgICAgIGluIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZU1lZGl1bShTdHJpbmcgb2xkTWVkaXVtKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgIT0gZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKG9sZE1lZGl1bS5lcXVhbHMoaXRlbShpKSkpIHsKLQkJCQlyZW1vdmVBdHRyaWJ1dGVOb2RlKChDU1NBdHRySW1wbCkgZkF0dHJzLml0ZW0oaSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBtZWRpYSBpbiB0aGUgbGlzdC4gVGhlIHJhbmdlIG9mIHZhbGlkIG1lZGlhIGlzCi0JICogPGNvZGU+MDwvY29kZT4gdG8gPGNvZGU+bGVuZ3RoLTE8L2NvZGU+IGluY2x1c2l2ZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGdldE1lZGlhKCkuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBDU1NOb2RlTGlzdEltcGwKLQkgKi8KLQlDU1NOb2RlTGlzdEltcGwgZ2V0TWVkaWEoKSB7Ci0JCWlmIChmQXR0cnMgPT0gbnVsbCkKLQkJCWZBdHRycyA9IG5ldyBDU1NOYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCXJldHVybiBmQXR0cnM7Ci0JfQotCi0JLyoqCi0JICogVGhlIHBhcnNhYmxlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGxpc3QuIFRoaXMgaXMgYQotCSAqIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHZhbHVlIGhhcyBhCi0JICogICAgICAgICAgICAgICAgc3ludGF4IGVycm9yIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBtZWRpYSBsaXN0Ci0JICogICAgICAgICAgICAgICAgaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZWRpYVRleHQoKSB7Ci0JCXJldHVybiBnZXRDc3NUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMjAwMS8wMS8xNwotCSAqIDE4OjUwOjI5KQotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBNRURJQUxJU1RfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5pbmRleDwvY29kZT4gdGggaW4gdGhlIGxpc3QuIElmIDxjb2RlPmluZGV4PC9jb2RlPgotCSAqIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIG1lZGlhIGluIHRoZSBsaXN0LCB0aGlzCi0JICogcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIEluZGV4IGludG8gdGhlIGNvbGxlY3Rpb24uCi0JICogQHJldHVybiBUaGUgbWVkaXVtIGF0IHRoZSA8Y29kZT5pbmRleDwvY29kZT4gdGggcG9zaXRpb24gaW4gdGhlCi0JICogICAgICAgICA8Y29kZT5NZWRpYUxpc3Q8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGF0IGlzCi0JICogICAgICAgICBub3QgYSB2YWxpZCBpbmRleC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGl0ZW0oaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDAgfHwgZ2V0TGVuZ3RoKCkgPD0gaW5kZXgpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gKChDU1NBdHRySW1wbCkgZ2V0TWVkaWEoKS5pdGVtKGluZGV4KSkuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRNZWRpYVRleHQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVkaWFUZXh0KFN0cmluZyBtZWRpYVRleHQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzZXRDc3NUZXh0KG1lZGlhVGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SR0JDb2xvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUkdCQ29sb3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NTUwMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SR0JDb2xvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLlJHQkNvbG9yOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIFJHQkNvbG9ySW1wbCBleHRlbmRzIENTU1ByaW1pdGl2ZUNvbnRhaW5lciBpbXBsZW1lbnRzIFJHQkNvbG9yIHsKLQotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGZSZWQ7Ci0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgZkdyZWVuOwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGZCbHVlOwotCi0JLyoqCi0JICogCi0JICovCi0JUkdCQ29sb3JJbXBsKCkgewotCQlzdXBlcihDU1NfUkdCQ09MT1IpOwotCX0KLQotCVJHQkNvbG9ySW1wbChSR0JDb2xvckltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlmUmVkID0gbmV3IENTU1ByaW1pdGl2ZVZhbHVlSW1wbCh0aGF0LmZSZWQpOwotCQlhcHBlbmRDaGlsZChmUmVkKTsKLQotCQlmR3JlZW4gPSBuZXcgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHRoYXQuZkdyZWVuKTsKLQkJYXBwZW5kQ2hpbGQoZkdyZWVuKTsKLQotCQlmQmx1ZSA9IG5ldyBDU1NQcmltaXRpdmVWYWx1ZUltcGwodGhhdC5mQmx1ZSk7Ci0JCWFwcGVuZENoaWxkKGZCbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlSR0JDb2xvckltcGwgY2xvbmVkID0gbmV3IFJHQkNvbG9ySW1wbCh0aGlzKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSBibHVlIHZhbHVlIG9mIHRoZSBSR0IgY29sb3IuCi0JICovCi0JcHVibGljIENTU1ByaW1pdGl2ZVZhbHVlIGdldEJsdWUoKSB7Ci0JCXJldHVybiBmQmx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgZ3JlZW4gdmFsdWUgb2YgdGhlIFJHQiBjb2xvci4KLQkgKi8KLQlwdWJsaWMgQ1NTUHJpbWl0aXZlVmFsdWUgZ2V0R3JlZW4oKSB7Ci0JCXJldHVybiBmR3JlZW47Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIHJlZCB2YWx1ZSBvZiB0aGUgUkdCIGNvbG9yLgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRSZWQoKSB7Ci0JCXJldHVybiBmUmVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLlJHQkNvbG9yCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBSR0JDb2xvciBnZXRSR0JDb2xvclZhbHVlKCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRQcmltaXRpdmVzKCkgewotCi0JCWZSZWQgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoQ1NTX05VTUJFUik7Ci0JCWFwcGVuZENoaWxkKGZSZWQpOwotCi0JCWZHcmVlbiA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NfTlVNQkVSKTsKLQkJYXBwZW5kQ2hpbGQoZkdyZWVuKTsKLQotCQlmQmx1ZSA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NfTlVNQkVSKTsKLQkJYXBwZW5kQ2hpbGQoZkJsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmVjdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmVjdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI5NWVhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JlY3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5SZWN0OwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIFJlY3RJbXBsIGV4dGVuZHMgQ1NTUHJpbWl0aXZlQ29udGFpbmVyIGltcGxlbWVudHMgUmVjdCB7Ci0KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBmVG9wOwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGZSaWdodDsKLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBmQm90dG9tOwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGZMZWZ0OwotCi0JLyoqCi0JICogCi0JICovCi0JUmVjdEltcGwoKSB7Ci0JCXN1cGVyKENTU19SRUNUKTsKLQl9Ci0KLQlSZWN0SW1wbChSZWN0SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWZUb3AgPSBuZXcgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHRoYXQuZlRvcCk7Ci0JCWFwcGVuZENoaWxkKGZUb3ApOwotCi0JCWZSaWdodCA9IG5ldyBDU1NQcmltaXRpdmVWYWx1ZUltcGwodGhhdC5mUmlnaHQpOwotCQlhcHBlbmRDaGlsZChmUmlnaHQpOwotCi0JCWZCb3R0b20gPSBuZXcgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHRoYXQuZkJvdHRvbSk7Ci0JCWFwcGVuZENoaWxkKGZCb3R0b20pOwotCi0JCWZMZWZ0ID0gbmV3IENTU1ByaW1pdGl2ZVZhbHVlSW1wbCh0aGF0LmZMZWZ0KTsKLQkJYXBwZW5kQ2hpbGQoZkxlZnQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCVJlY3RJbXBsIGNsb25lZCA9IG5ldyBSZWN0SW1wbCh0aGlzKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSBib3R0b20gb2YgdGhlIHJlY3QuCi0JICovCi0JcHVibGljIENTU1ByaW1pdGl2ZVZhbHVlIGdldEJvdHRvbSgpIHsKLQkJcmV0dXJuIGZCb3R0b207Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIGxlZnQgb2YgdGhlIHJlY3QuCi0JICovCi0JcHVibGljIENTU1ByaW1pdGl2ZVZhbHVlIGdldExlZnQoKSB7Ci0JCXJldHVybiBmTGVmdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5SZWN0Ci0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBSZWN0IGdldFJlY3RWYWx1ZSgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgcmlnaHQgb2YgdGhlIHJlY3QuCi0JICovCi0JcHVibGljIENTU1ByaW1pdGl2ZVZhbHVlIGdldFJpZ2h0KCkgewotCQlyZXR1cm4gZlJpZ2h0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSB0b3Agb2YgdGhlIHJlY3QuCi0JICovCi0JcHVibGljIENTU1ByaW1pdGl2ZVZhbHVlIGdldFRvcCgpIHsKLQkJcmV0dXJuIGZUb3A7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFByaW1pdGl2ZXMoKSB7Ci0KLQkJZlRvcCA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NfTlVNQkVSKTsKLQkJYXBwZW5kQ2hpbGQoZlRvcCk7Ci0KLQkJZlJpZ2h0ID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU19OVU1CRVIpOwotCQlhcHBlbmRDaGlsZChmUmlnaHQpOwotCi0JCWZCb3R0b20gPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoQ1NTX05VTUJFUik7Ci0JCWFwcGVuZENoaWxkKGZCb3R0b20pOwotCi0JCWZMZWZ0ID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU19OVU1CRVIpOwotCQlhcHBlbmRDaGlsZChmTGVmdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHlsZVNoZWV0TGlzdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3R5bGVTaGVldExpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYTFiZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHlsZVNoZWV0TGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3Q7Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIFN0eWxlU2hlZXRMaXN0SW1wbCBleHRlbmRzIEFic3RyYWN0Q1NTTm9kZUxpc3QgaW1wbGVtZW50cyBTdHlsZVNoZWV0TGlzdCB7Ci0KLQkvKioKLQkgKiBTdHlsZVNoZWV0TGlzdEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlTdHlsZVNoZWV0TGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byByZXRyaWV2ZSBhIHN0eWxlIHNoZWV0IGJ5IG9yZGluYWwgaW5kZXguIElmIGluZGV4IGlzIGdyZWF0ZXIKLQkgKiB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2Ygc3R5bGUgc2hlZXRzIGluIHRoZSBsaXN0LCB0aGlzIHJldHVybnMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXhJbmRleAotCSAqICAgICAgICAgICAgaW50byB0aGUgY29sbGVjdGlvbgotCSAqIEByZXR1cm4gVGhlIHN0eWxlIHNoZWV0IGF0IHRoZSA8Y29kZT5pbmRleDwvY29kZT4gcG9zaXRpb24gaW4gdGhlCi0JICogICAgICAgICA8Y29kZT5TdHlsZVNoZWV0TGlzdDwvY29kZT4sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoYXQKLQkgKiAgICAgICAgIGlzIG5vdCBhIHZhbGlkIGluZGV4LgotCSAqLwotCXB1YmxpYyBTdHlsZVNoZWV0IGl0ZW0oaW50IGluZGV4KSB7Ci0JCXJldHVybiAoU3R5bGVTaGVldCkgaXRlbUltcGwoaW5kZXgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYTUxZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9DU1NEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuQ1NTUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBDU1NEb2N1bWVudENoYXJzZXREZXRlY3RvciBleHRlbmRzIENTU1Jlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElEb2N1bWVudENoYXJzZXREZXRlY3RvciB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nTmFtZShJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgdGhlIGRvY3VtZW50IGlzIGVtcHR5LCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gbm9kZXMsCi0JCS8vIHNvIG5vIG5lZWQgdG8gY29udGludWUuCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5vZGVzID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkxpc3QoKTsKLQkJaWYgKG5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gbnVsbDsKLQkJCS8vIHNraXAgYW55IGluaXRpYWwgd2hpdGVzcGFjZQotCQkJLy8gTm90ZSB0aGF0IEBjaGFyc2V0ICJlbmNvZGluZ25hbWUiOwotCQkJLy8gbXVzdCBhcHBlYXIgYXQgdmVyeSBiZWdpbm5pbmcgb2YgZG9jdW1lbnQsCi0JCQkvLyB0byBiZSB2YWxpZC4KLQkJCS8vIE1heSBoYXZlIHRvIHRlc3Qgd2l0aCAiZGFtYWdlZCIgZmlsZXMgKGUuZy4KLQkJCS8vIGJlZ2lubmluZyBFT0xzLCBldGMuLCB0byB2ZXJpZnkgdGhpcyB3b3JrcwotCQkJLy8gYXMgZXhwZWN0ZWQuCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlub2RlID0gbm9kZXMuaXRlbShpKTsKLQkJCQlpZiAoZ2V0VHlwZShub2RlKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlJdGVyYXRvciByZWdpb25zID0gbm9kZS5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldE5leHRSZWdpb25PZlR5cGUoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NIQVJTRVQsIHJlZ2lvbnMpOwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBnZXROZXh0UmVnaW9uT2ZUeXBlKENTU1JlZ2lvbkNvbnRleHRzLkNTU19TVFJJTkcsIHJlZ2lvbnMpOwotCQkJCWlmICh2YWx1ZVJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCS8vIGlmIGRpZG4ndCBmaW5kIHRoZSByZWdpb24sIGl0cyBwcm9iYWJseSBkdWUgdG8gaWxsCi0JCQkJCS8vIGZvcm1lZCBpbnB1dCwgc3VjaCBhcwotCQkJCQkvLyBAY2hhcnNldCAiSVNPLTg4NTktNjsKLQkJCQkJLy8gc28gd2UnbGwgdHJ5IGFnYWluIGZvciAidW5rbm93biIgcmVnaW9uLgotCQkJCQkvLyBJZiB0aGF0IGZhaWxzLCB3ZSdsbCBnaXZlIHVwPwotCQkJCQlyZWdpb25zID0gbm9kZS5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCQkJcmVnaW9uID0gZ2V0TmV4dFJlZ2lvbk9mVHlwZShDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCwgcmVnaW9ucyk7Ci0JCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQkJdmFsdWVSZWdpb24gPSBnZXROZXh0UmVnaW9uT2ZUeXBlKENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTktOT1dOLCByZWdpb25zKTsKLQkJCQkJCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJcmVzdWx0ID0gbm9kZS5nZXRUZXh0KHZhbHVlUmVnaW9uKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0ID0gbm9kZS5nZXRUZXh0KHZhbHVlUmVnaW9uKTsKLQkJCQl9Ci0JCQkJcmVzdWx0ID0gU3RyaW5nVXRpbHMuc3RyaXBOb25MZXR0ZXJEaWdpdHMocmVzdWx0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmdOYW1lKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlTdHJpbmcgZW5jID0gbnVsbDsKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJZW5jID0gZ2V0RW5jb2RpbmdOYW1lKChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBUT0RPIEltcG9ydGFudDogbmVlZCB0byBpbXBsZW1lbnQgc29tZSAicmF3IiBwYXJzZXIgZm9yCi0JCQkvLyBJRG9jdW1lbnQgbGV2ZWwKLQkJfQotCQlyZXR1cm4gZW5jOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFR5cGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBub2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCB8fCByZWdpb25zLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDApOwotCQlTdHJpbmcgcmVzdWx0ID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElUZXh0UmVnaW9uIGdldE5leHRSZWdpb25PZlR5cGUoU3RyaW5nIHR5cGUsIEl0ZXJhdG9yIHJlZ2lvbnMpIHsKLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uIHJlc3VsdCA9IG51bGw7Ci0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IHR5cGUpIHsKLQkJCQlyZXN1bHQgPSByZWdpb247Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHNldChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc2V0KG5ldyBEb2N1bWVudFJlYWRlcihkb2N1bWVudCwgMCkpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NTU0RvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NTU0RvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NmZmMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9DU1NEb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdHdWVzc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC50ZXh0LkNTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkFic3RyYWN0RG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIENTU0RvY3VtZW50TG9hZGVyIGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudExvYWRlciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENTU19JRCA9IENvbnRlbnRUeXBlSWRGb3JDU1MuQ29udGVudFR5cGVJRF9DU1M7Ci0JcHJpdmF0ZSBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCi0KLQlwdWJsaWMgQ1NTRG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFbmNvZGluZ05hbWVCeUd1ZXNzKGJ5dGVbXSBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nIGlhbmFFbmMgPSBudWxsOwotCQlpYW5hRW5jID0gRW5jb2RpbmdHdWVzc2VyLmd1ZXNzRW5jb2Rpbmcoc3RyaW5nLCBsZW5ndGgpOwotCQlyZXR1cm4gaWFuYUVuYzsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGVuY29kaW5nLiBGb3IgQ1NTIHRoZXJlIGlzIG5vIHNwZWMnZCBkZWZhdWx0LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElFbmNvZGVkRG9jdW1lbnQgbmV3RW5jb2RlZERvY3VtZW50KCkgewotCQkvLyBETVc6IEkgY29waWVkIHRoaXMgZnJvbSBDU1NNb2RlbEltcGxlIC4uLgotCQkvLyBidXQgYW0gbm90IHN1cmUgaXRzIHJpZ2h0Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShnZXRQYXJzZXIoKSk7Ci0JCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIHJlUGFyc2VyID0gbmV3IENTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCk7Ci0JCXJlUGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLnNldFJlUGFyc2VyKHJlUGFyc2VyKTsKLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJLy8gcmV0dXJuIG5ldyBDU1NSZWdpb25QYXJzZXIoKTsKLQkJcmV0dXJuIG5ldyBDU1NTb3VyY2VQYXJzZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoSUZpbGUgZmlsZSkgewotCQlTdHJpbmcgZGVsaW1pdGVyID0gQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLmdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoQ1NTX0lEKTsKLQkJaWYgKGRlbGltaXRlciA9PSBudWxsKQotCQkJZGVsaW1pdGVyID0gc3VwZXIuZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihmaWxlKTsKLQkJcmV0dXJuIGRlbGltaXRlcjsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJaWYgKGRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9PSBudWxsKSB7Ci0JCQlkb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPSBuZXcgQ1NTRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IoKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBnZXREZWZhdWx0RG9jdW1lbnRQYXJ0aXRpb25lcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yQ1NTKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBDU1NEb2N1bWVudExvYWRlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudC9JQ1NTU3R5bGVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudC9JQ1NTU3R5bGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzc3MTE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnQvSUNTU1N0eWxlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTdHlsZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc3R5bGVDaGFuZ2VkKElDU1NNb2RlbCBzcmNNb2RlbCwgSUNTU1NlbGVjdG9yW10gcmVtb3ZlZCwgSUNTU1NlbGVjdG9yW10gYWRkZWQsIFN0cmluZyBtZWRpYSk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHN0eWxlVXBkYXRlKElDU1NNb2RlbCBzcmNNb2RlbCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50L0lDU1NTdHlsZU5vdGlmaWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50L0lDU1NTdHlsZU5vdGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNDllZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudC9JQ1NTU3R5bGVOb3RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTU3R5bGVOb3RpZmllciBleHRlbmRzIElDU1NTdHlsZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgYWRkU3R5bGVMaXN0ZW5lcihJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlMaXN0IGdldFN0eWxlTGlzdGVuZXJzKCk7Ci0KLQkvKioKLQkgKi8KLQlib29sZWFuIGlzUmVjb3JkaW5nKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHJlbW92ZVN0eWxlTGlzdGVuZXIoSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudGltcGwvQ1NTRW1iZWRlZFN0eWxlTm90aWZ5QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudGltcGwvQ1NTRW1iZWRlZFN0eWxlTm90aWZ5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODAzMWJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnRpbXBsL0NTU0VtYmVkZWRTdHlsZU5vdGlmeUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnRpbXBsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudC5JQ1NTU3R5bGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTRW1iZWRlZFN0eWxlTm90aWZ5QWRhcHRlciBleHRlbmRzIENTU1N0eWxlTm90aWZ5QWRhcHRlciB7Ci0KLQkvKioKLQkgKiBDU1NFbWJlZGRlZFN0eWxlTm90aWZ5QWRhcHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU01vZGVsCi0JICovCi0JcHVibGljIENTU0VtYmVkZWRTdHlsZU5vdGlmeUFkYXB0ZXIoSUNTU01vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdHlsZUNoYW5nZWQoSUNTU01vZGVsIHNyY01vZGVsLCBJQ1NTU2VsZWN0b3JbXSByZW1vdmVkLCBJQ1NTU2VsZWN0b3JbXSBhZGRlZCwgU3RyaW5nIG1lZGlhKSB7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIG1vZGVsLmdldE93bmVyRE9NTm9kZSgpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vZGUuZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDU1NTdHlsZUxpc3RlbmVyKSB7Ci0JCQkoKElDU1NTdHlsZUxpc3RlbmVyKSBhZGFwdGVyKS5zdHlsZUNoYW5nZWQoc3JjTW9kZWwsIHJlbW92ZWQsIGFkZGVkLCBtZWRpYSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdHlsZVVwZGF0ZShJQ1NTTW9kZWwgc3JjTW9kZWwpIHsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgbW9kZWwuZ2V0T3duZXJET01Ob2RlKCk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm9kZS5nZXRBZGFwdGVyRm9yKElTdHlsZVNoZWV0QWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUNTU1N0eWxlTGlzdGVuZXIpIHsKLQkJCSgoSUNTU1N0eWxlTGlzdGVuZXIpIGFkYXB0ZXIpLnN0eWxlVXBkYXRlKHNyY01vZGVsKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnRpbXBsL0NTU1N0eWxlRXZlbnREZWxpdmVyZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnRpbXBsL0NTU1N0eWxlRXZlbnREZWxpdmVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc2MDE4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50aW1wbC9DU1NTdHlsZUV2ZW50RGVsaXZlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudGltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudC5JQ1NTU3R5bGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQuSUNTU1N0eWxlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NTdHlsZUV2ZW50RGVsaXZlcmVyIHsKLQotCXByaXZhdGUgVmVjdG9yIGZWaXNpdGVkID0gbmV3IFZlY3RvcigpOwotCXByaXZhdGUgSUNTU01vZGVsIGZTcmNNb2RlbDsKLQlwcml2YXRlIElDU1NTZWxlY3RvcltdIGZSZW1vdmVkOwotCXByaXZhdGUgSUNTU1NlbGVjdG9yW10gZkFkZGVkOwotCXByaXZhdGUgU3RyaW5nIGZNZWRpYTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NTdHlsZUV2ZW50RGVsaXZlcmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmUoSUNTU01vZGVsIHNyY01vZGVsLCBJQ1NTU2VsZWN0b3JbXSByZW1vdmVkLCBJQ1NTU2VsZWN0b3JbXSBhZGRlZCwgU3RyaW5nIG1lZGlhKSB7Ci0JCWlmIChzcmNNb2RlbCA9PSBudWxsIHx8IHNyY01vZGVsLmdldFN0eWxlTGlzdGVuZXJzKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0aGlzLmZTcmNNb2RlbCA9IHNyY01vZGVsOwotCQl0aGlzLmZSZW1vdmVkID0gcmVtb3ZlZDsKLQkJdGhpcy5mQWRkZWQgPSBhZGRlZDsKLQkJdGhpcy5mTWVkaWEgPSBtZWRpYTsKLQotCQkvLyBwcm9oaWJpdCBkZWxpdmVyaW5nIHRvIHNyY01vZGVsCi0JCWZWaXNpdGVkLmNsZWFyKCk7Ci0JCWZWaXNpdGVkLmFkZChzcmNNb2RlbCk7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHNyY01vZGVsLmdldFN0eWxlTGlzdGVuZXJzKCkudG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJdmlzaXQoKElDU1NTdHlsZUxpc3RlbmVyKSBsaXN0ZW5lcnNbaV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVRvKElDU1NTdHlsZUxpc3RlbmVyIGxpc3RlbmVyLCBJQ1NTTW9kZWwgc3JjTW9kZWwsIElDU1NTZWxlY3RvcltdIHJlbW92ZWQsIElDU1NTZWxlY3RvcltdIGFkZGVkLCBTdHJpbmcgbWVkaWEpIHsKLQkJdGhpcy5mU3JjTW9kZWwgPSBzcmNNb2RlbDsKLQkJdGhpcy5mUmVtb3ZlZCA9IHJlbW92ZWQ7Ci0JCXRoaXMuZkFkZGVkID0gYWRkZWQ7Ci0JCXRoaXMuZk1lZGlhID0gbWVkaWE7Ci0KLQkJLy8gcHJvaGliaXQgZGVsaXZlcmluZyB0byBzcmNNb2RlbAotCQlmVmlzaXRlZC5jbGVhcigpOwotCQkvLyB2aXNpdGVkLmFkZChzcmNNb2RlbCk7IDogYmVjYXVzZSBsb29waW5nIHByb2JsZW0KLQkJdmlzaXQobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVVcGRhdGUoSUNTU01vZGVsIHNyY01vZGVsKSB7Ci0JCWlmIChzcmNNb2RlbCA9PSBudWxsIHx8IHNyY01vZGVsLmdldFN0eWxlTGlzdGVuZXJzKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0aGlzLmZTcmNNb2RlbCA9IHNyY01vZGVsOwotCi0JCS8vIHByb2hpYml0IGRlbGl2ZXJpbmcgdG8gc3JjTW9kZWwKLQkJZlZpc2l0ZWQuY2xlYXIoKTsKLQkJZlZpc2l0ZWQuYWRkKHNyY01vZGVsKTsKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gc3JjTW9kZWwuZ2V0U3R5bGVMaXN0ZW5lcnMoKS50b0FycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2aXNpdFVwZGF0ZSgoSUNTU1N0eWxlTGlzdGVuZXIpIGxpc3RlbmVyc1tpXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlVXBkYXRlVG8oSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIsIElDU1NNb2RlbCBzcmNNb2RlbCkgewotCQlpZiAoc3JjTW9kZWwgPT0gbnVsbCB8fCBzcmNNb2RlbC5nZXRTdHlsZUxpc3RlbmVycygpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdGhpcy5mU3JjTW9kZWwgPSBzcmNNb2RlbDsKLQotCQkvLyBwcm9oaWJpdCBkZWxpdmVyaW5nIHRvIHNyY01vZGVsCi0JCWZWaXNpdGVkLmNsZWFyKCk7Ci0JCS8vIHZpc2l0ZWQuYWRkKHNyY01vZGVsKTsKLQkJdmlzaXRVcGRhdGUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0KElDU1NTdHlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsIHx8IGZWaXNpdGVkLmNvbnRhaW5zKGxpc3RlbmVyKSkKLQkJCXJldHVybjsKLQotCQkvLyBmaXJlIGV2ZW50IHRvIGxpc3RlbmVyCi0JCWxpc3RlbmVyLnN0eWxlQ2hhbmdlZChmU3JjTW9kZWwsIGZSZW1vdmVkLCBmQWRkZWQsIGZNZWRpYSk7Ci0JCWZWaXNpdGVkLmFkZChsaXN0ZW5lcik7Ci0KLQkJLy8gdHJhdmVyc2Ugbm90aWZpZXIKLQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSUNTU1N0eWxlTm90aWZpZXIpIHsKLQkJCUlDU1NTdHlsZU5vdGlmaWVyIG5vdGlmaWVyID0gKElDU1NTdHlsZU5vdGlmaWVyKSBsaXN0ZW5lcjsKLQkJCWlmIChub3RpZmllci5nZXRTdHlsZUxpc3RlbmVycygpICE9IG51bGwpIHsKLQkJCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBub3RpZmllci5nZXRTdHlsZUxpc3RlbmVycygpLnRvQXJyYXkoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQl2aXNpdCgoSUNTU1N0eWxlTGlzdGVuZXIpIGxpc3RlbmVyc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXRVcGRhdGUoSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwgfHwgZlZpc2l0ZWQuY29udGFpbnMobGlzdGVuZXIpKQotCQkJcmV0dXJuOwotCi0JCS8vIGZpcmUgZXZlbnQgdG8gbGlzdGVuZXIKLQkJbGlzdGVuZXIuc3R5bGVVcGRhdGUoZlNyY01vZGVsKTsKLQkJZlZpc2l0ZWQuYWRkKGxpc3RlbmVyKTsKLQotCQkvLyB0cmF2ZXJzZSBub3RpZmllcgotCQlpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBJQ1NTU3R5bGVOb3RpZmllcikgewotCQkJSUNTU1N0eWxlTm90aWZpZXIgbm90aWZpZXIgPSAoSUNTU1N0eWxlTm90aWZpZXIpIGxpc3RlbmVyOwotCQkJaWYgKG5vdGlmaWVyLmdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCkgewotCQkJCU9iamVjdFtdIGxpc3RlbmVycyA9IG5vdGlmaWVyLmdldFN0eWxlTGlzdGVuZXJzKCkudG9BcnJheSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXZpc2l0VXBkYXRlKChJQ1NTU3R5bGVMaXN0ZW5lcikgbGlzdGVuZXJzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50aW1wbC9DU1NTdHlsZU5vdGlmeUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnRpbXBsL0NTU1N0eWxlTm90aWZ5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjMzYjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnRpbXBsL0NTU1N0eWxlTm90aWZ5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnRpbXBsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50LklDU1NTdHlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudC5JQ1NTU3R5bGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkltcG9ydGVkQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlNlbGVjdG9yc0NvbGxlY3RvcjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTU3R5bGVOb3RpZnlBZGFwdGVyIGltcGxlbWVudHMgSUNTU1N0eWxlTm90aWZpZXIgewotCi0JcHJvdGVjdGVkIGphdmEudXRpbC5WZWN0b3IgbGlzdGVuZXJzOwotCXByb3RlY3RlZCBmaW5hbCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsIG1vZGVsOwotCXByb3RlY3RlZCBib29sZWFuIHJlY29yZGluZyA9IGZhbHNlOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENTU1N0eWxlTm90aWZ5QWRhcHRlcihJQ1NTTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFN0eWxlTGlzdGVuZXIoSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGxpc3RlbmVycyA9PSBudWxsKQotCQkJbGlzdGVuZXJzID0gbmV3IFZlY3RvcigpOwotCQlpZiAoIWxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQotCQkJLy8gc2VuZCBuZXcgc2VsZWN0b3JzIGV2ZW50IHRvIGxpc3RlbmVyCi0JCQlJbXBvcnRlZENvbGxlY3RvciB0cmF2ID0gbmV3IEltcG9ydGVkQ29sbGVjdG9yKCk7Ci0JCQl0cmF2LmFwcGx5KG1vZGVsLmdldERvY3VtZW50KCkpOwotCQkJSXRlcmF0b3IgaXQgPSB0cmF2LmdldEV4dGVybmFscygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJSUNTU1N0eWxlU2hlZXQgc2hlZXQgPSAoSUNTU1N0eWxlU2hlZXQpIGl0Lm5leHQoKTsKLQkJCQkvLyBjb2xsZWN0IHNlbGVjdG9ycwotCQkJCVNlbGVjdG9yc0NvbGxlY3RvciBzZWxUcmF2ID0gbmV3IFNlbGVjdG9yc0NvbGxlY3RvcigpOwotCQkJCXNlbFRyYXYuYXBwbHkoc2hlZXQpOwotCQkJCWludCBuU2VsID0gc2VsVHJhdi5nZXRTZWxlY3RvcnMoKS5zaXplKCk7Ci0JCQkJSUNTU1NlbGVjdG9yW10gYWRkZWQgPSBuZXcgSUNTU1NlbGVjdG9yW25TZWxdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgblNlbDsgaSsrKQotCQkJCQlhZGRlZFtpXSA9IChJQ1NTU2VsZWN0b3IpIHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuZ2V0KGkpOwotCi0JCQkJLy8gZmlyZSBldmVudAotCQkJCUNTU1N0eWxlRXZlbnREZWxpdmVyZXIgZGVsaXZlcmVyID0gbmV3IENTU1N0eWxlRXZlbnREZWxpdmVyZXIoKTsKLQkJCQlkZWxpdmVyZXIuZmlyZVRvKGxpc3RlbmVyLCBzaGVldC5nZXRNb2RlbCgpLCBudWxsLCBhZGRlZCwgbnVsbC8qCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIG1lZGlhCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIHdpbGwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogYmUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogaW1wbGVtZW50ZWQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogaW4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGZ1dHVyZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKi8pOwotCQkJfQotCi0JCQkvLyBhZGQgbGlzdGVuZXIKLQkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoKSB7Ci0JCXJlY29yZGluZyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZW5kUmVjb3JkaW5nKCkgewotCQlyZWNvcmRpbmcgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlKElDU1NTZWxlY3RvcltdIHJlbW92ZWQsIElDU1NTZWxlY3RvcltdIGFkZGVkLCBTdHJpbmcgbWVkaWEpIHsKLQkJLy8gc2VuZCBzZWxlY3RvciBjaGFuZ2VkIGV2ZW50Ci0JCUNTU1N0eWxlRXZlbnREZWxpdmVyZXIgZGVsaXYgPSBuZXcgQ1NTU3R5bGVFdmVudERlbGl2ZXJlcigpOwotCQlkZWxpdi5maXJlKG1vZGVsLCByZW1vdmVkLCBhZGRlZCwgbnVsbCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0U3R5bGVMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBsaXN0ZW5lcnM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWNvcmRpbmcoKSB7Ci0JCXJldHVybiByZWNvcmRpbmc7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU3R5bGVMaXN0ZW5lcihJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAobGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0KLQkJCS8vIHNlbmQgb2xkIHNlbGVjdG9ycyBldmVudCB0byBsaXN0ZW5lcgotCQkJSW1wb3J0ZWRDb2xsZWN0b3IgdHJhdiA9IG5ldyBJbXBvcnRlZENvbGxlY3RvcigpOwotCQkJdHJhdi5hcHBseShtb2RlbC5nZXREb2N1bWVudCgpKTsKLQkJCUl0ZXJhdG9yIGl0ID0gdHJhdi5nZXRFeHRlcm5hbHMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCUlDU1NTdHlsZVNoZWV0IHNoZWV0ID0gKElDU1NTdHlsZVNoZWV0KSBpdC5uZXh0KCk7Ci0JCQkJLy8gY29sbGVjdCBzZWxlY3RvcnMKLQkJCQlTZWxlY3RvcnNDb2xsZWN0b3Igc2VsVHJhdiA9IG5ldyBTZWxlY3RvcnNDb2xsZWN0b3IoKTsKLQkJCQlzZWxUcmF2LmFwcGx5KHNoZWV0KTsKLQkJCQlpbnQgblNlbCA9IHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuc2l6ZSgpOwotCQkJCUlDU1NTZWxlY3RvcltdIHJlbW92ZWQgPSBuZXcgSUNTU1NlbGVjdG9yW25TZWxdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgblNlbDsgaSsrKQotCQkJCQlyZW1vdmVkW2ldID0gKElDU1NTZWxlY3Rvcikgc2VsVHJhdi5nZXRTZWxlY3RvcnMoKS5nZXQoaSk7Ci0KLQkJCQkvLyBmaXJlIGV2ZW50Ci0JCQkJQ1NTU3R5bGVFdmVudERlbGl2ZXJlciBkZWxpdmVyZXIgPSBuZXcgQ1NTU3R5bGVFdmVudERlbGl2ZXJlcigpOwotCQkJCWRlbGl2ZXJlci5maXJlVG8obGlzdGVuZXIsIHNoZWV0LmdldE1vZGVsKCksIHJlbW92ZWQsIG51bGwsIG51bGwvKgotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiBtZWRpYQotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiB3aWxsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGJlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGltcGxlbWVudGVkCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGluCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiBmdXR1cmUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICovKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHN0eWxlQ2hhbmdlZChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsIHNyY01vZGVsLCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yW10gcmVtb3ZlZCwgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcltdIGFkZGVkLCBqYXZhLmxhbmcuU3RyaW5nIG1lZGlhKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc3R5bGVVcGRhdGUob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbCBzcmNNb2RlbCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0Zvcm1hdFByb2Nlc3NvckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXQvRm9ybWF0UHJvY2Vzc29yQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5N2QwNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXQvRm9ybWF0UHJvY2Vzc29yQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU0Zvcm1hdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5BYnN0cmFjdFN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBGb3JtYXRQcm9jZXNzb3JDU1MgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgewotCS8qCi0JICogTWF4IGxlbmd0aCBvZiB0ZXh0IHRvIGJlIGZvcm1hdHRlZCB0byBiZSBjb25zaWRlcmVkIGEgInNtYWxsIGNoYW5nZSIKLQkgKiBVc2VkIGZvciBkb2N1bWVudCByZXdyaXRlIHNlc3Npb24gdHlwZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBNQVhfU01BTExfRk9STUFUX1NJWkUgPSAxMDAwOwotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gImNzcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCUNTU0Zvcm1hdFV0aWwgZm9ybWF0VXRpbCA9IENTU0Zvcm1hdFV0aWwuZ2V0SW5zdGFuY2UoKTsKLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJLy8gQlVHMTAyODIyIHRha2UgYWR2YW50YWdlIG9mIElEb2N1bWVudEV4dGVuc2lvbjQKLQkJCUlEb2N1bWVudEV4dGVuc2lvbjQgZG9jRXh0NCA9IG51bGw7Ci0JCQlpZiAoc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpIGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uNCkgewotCQkJCWRvY0V4dDQgPSAoSURvY3VtZW50RXh0ZW5zaW9uNCkgc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJfQotCQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiByZXdyaXRlU2Vzc2lvbiA9IG51bGw7Ci0KLQkJCXRyeSB7Ci0JCQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUgcmV3cml0ZVR5cGUgPSAobGVuZ3RoID4gTUFYX1NNQUxMX0ZPUk1BVF9TSVpFKSA/IERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRCA6IERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRF9TTUFMTDsKLQkJCQlyZXdyaXRlU2Vzc2lvbiA9IChkb2NFeHQ0ID09IG51bGwgfHwgZG9jRXh0NC5nZXRBY3RpdmVSZXdyaXRlU2Vzc2lvbigpICE9IG51bGwpID8gbnVsbCA6IGRvY0V4dDQuc3RhcnRSZXdyaXRlU2Vzc2lvbihyZXdyaXRlVHlwZSk7Ci0KLQkJCQlJQ1NTRG9jdW1lbnQgZG9jID0gKChJQ1NTTW9kZWwpIHN0cnVjdHVyZWRNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcigoSU5vZGVOb3RpZmllcikgZG9jKTsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gZm9ybWF0dGVyLmZvcm1hdChkb2MpOwotCQkJCWlmIChidWYgIT0gbnVsbCkgewotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pIGRvYykuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJaW50IGVuZE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgZG9jKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJZm9ybWF0VXRpbC5yZXBsYWNlU291cmNlKGRvYy5nZXRNb2RlbCgpLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsIGJ1Zi50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkvLyBCVUcxMDI4MjIgdGFrZSBhZHZhbnRhZ2Ugb2YgSURvY3VtZW50RXh0ZW5zaW9uNAotCQkJCWlmIChkb2NFeHQ0ICE9IG51bGwgJiYgcmV3cml0ZVNlc3Npb24gIT0gbnVsbCkKLQkJCQkJZG9jRXh0NC5zdG9wUmV3cml0ZVNlc3Npb24ocmV3cml0ZVNlc3Npb24pOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHN0cnVjdHVyZWRNb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJTGlzdCBjc3Nub2RlcyA9IGZvcm1hdFV0aWwuY29sbGVjdENTU05vZGVzKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0JCQlpZiAoY3Nzbm9kZXMgIT0gbnVsbCAmJiAhY3Nzbm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQkJSUNTU01vZGVsIG1vZGVsID0gbnVsbDsKLQotCQkJCS8vIEJVRzEwMjgyMiB0YWtlIGFkdmFudGFnZSBvZiBJRG9jdW1lbnRFeHRlbnNpb240Ci0JCQkJSURvY3VtZW50RXh0ZW5zaW9uNCBkb2NFeHQ0ID0gbnVsbDsKLQkJCQlpZiAoc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpIGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uNCkgewotCQkJCQlkb2NFeHQ0ID0gKElEb2N1bWVudEV4dGVuc2lvbjQpIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQl9Ci0JCQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiByZXdyaXRlU2Vzc2lvbiA9IG51bGw7Ci0KLQkJCQl0cnkgewotCQkJCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZSByZXdyaXRlVHlwZSA9IChsZW5ndGggPiBNQVhfU01BTExfRk9STUFUX1NJWkUpID8gRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuVU5SRVNUUklDVEVEIDogRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuVU5SRVNUUklDVEVEX1NNQUxMOwotCQkJCQlyZXdyaXRlU2Vzc2lvbiA9IChkb2NFeHQ0ID09IG51bGwgfHwgZG9jRXh0NC5nZXRBY3RpdmVSZXdyaXRlU2Vzc2lvbigpICE9IG51bGwpID8gbnVsbCA6IGRvY0V4dDQuc3RhcnRSZXdyaXRlU2Vzc2lvbihyZXdyaXRlVHlwZSk7Ci0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjc3Nub2Rlcy5zaXplKCk7IGkrKykgewotCQkJCQkJSUNTU05vZGUgbm9kZSA9IChJQ1NTTm9kZSkgY3Nzbm9kZXMuZ2V0KGkpOwotCQkJCQkJQ1NTU291cmNlRm9ybWF0dGVyIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIoKElOb2RlTm90aWZpZXIpIG5vZGUpOwotCQkJCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IGZvcm1hdHRlci5mb3JtYXQobm9kZSk7Ci0JCQkJCQlpZiAoYnVmICE9IG51bGwpIHsKLQkJCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQkJaW50IGVuZE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCQkJaWYgKG1vZGVsID09IG51bGwpIHsKLQkJCQkJCQkJbW9kZWwgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQkJCQkJCX0KLQkJCQkJCQlmb3JtYXRVdGlsLnJlcGxhY2VTb3VyY2UobW9kZWwsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCwgYnVmLnRvU3RyaW5nKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQkvLyBCVUcxMDI4MjIgdGFrZSBhZHZhbnRhZ2Ugb2YgSURvY3VtZW50RXh0ZW5zaW9uNAotCQkJCQlpZiAoZG9jRXh0NCAhPSBudWxsICYmIHJld3JpdGVTZXNzaW9uICE9IG51bGwpCi0JCQkJCQlkb2NFeHQ0LnN0b3BSZXdyaXRlU2Vzc2lvbihyZXdyaXRlU2Vzc2lvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdHRlciBnZXRGb3JtYXR0ZXIoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb3JtYXRQcmVmZXJlbmNlcygpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9BYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q2Y2Y3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9BYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRMaW5lVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU0xpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyIGltcGxlbWVudHMgQ1NTU291cmNlR2VuZXJhdG9yIHsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgc2hvcnQgR0VORVJBVEUgPSAwOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgc2hvcnQgRk9STUFUID0gMTsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIHNob3J0IENMRUFOVVAgPSAyOwotCXByb3RlY3RlZCBzdGF0aWMgc2hvcnQgc3RyYXRlZ3k7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmREZWxpbUJlZm9yZShJQ1NTTm9kZSBub2RlLCBDb21wb3VuZFJlZ2lvbiB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoaXNDbGVhbnVwKCkgJiYgIWdldENsZWFudXBTdHJhdGVneShub2RlKS5pc0Zvcm1hdFNvdXJjZSgpKQotCQkJcmV0dXJuOyAvLyBmb3Igbm90IGZvcm1hdHRpbmcgY2FzZSBvbiBjbGVhbnVwIGFjdGlvbgotCQlTdHJpbmcgZGVsaW0gPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUpOwotCi0JCWJvb2xlYW4gbmVlZEluZGVudCA9ICEobm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0KTsKLQkJaWYgKHRvQXBwZW5kID09IG51bGwpIHsKLQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJaWYgKG5lZWRJbmRlbnQpCi0JCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgdHlwZSA9IHRvQXBwZW5kLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IodG9BcHBlbmQuZ2V0RG9jdW1lbnRSZWdpb24oKSwgdG9BcHBlbmQuZ2V0VGV4dFJlZ2lvbigpKTsKLQkJCQlpdC5wcmV2KCk7Ci0JCQkJSVRleHRSZWdpb24gcHJldiA9IGl0LnByZXYoKTsKLQkJCQlpZiAocHJldiA9PSBudWxsIHx8IChwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiBUZXh0VXRpbGl0aWVzLmluZGV4T2YoRGVmYXVsdExpbmVUcmFja2VyLkRFTElNSVRFUlMsIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocHJldiksIDApWzBdID49IDApKSB7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJCWlmIChuZWVkSW5kZW50KQotCQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZC5nZXRUZXh0KCksIHNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKHRvQXBwZW5kLmdldERvY3VtZW50UmVnaW9uKCksIHRvQXBwZW5kLmdldFRleHRSZWdpb24oKSk7Ci0JCQkJaXQucHJldigpOwotCQkJCUlUZXh0UmVnaW9uIHByZXYgPSBpdC5wcmV2KCk7Ci0KLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYgVGV4dFV0aWxpdGllcy5pbmRleE9mKERlZmF1bHRMaW5lVHJhY2tlci5ERUxJTUlURVJTLCBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KHByZXYpLCAwKVswXSA+PSAwKSB7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJCWlmIChuZWVkSW5kZW50KQotCQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpID4gMCAmJiAoIXByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE5vZGVUeXBlKCkgIT0gSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFKSkgewotCQkJCQlpbnQgbGVuZ3RoID0gZ2V0TGFzdExpbmVMZW5ndGgobm9kZSwgc291cmNlKTsKLQkJCQkJaW50IGFwcGVuZCA9IDE7Ci0JCQkJCWlmIChsZW5ndGggKyBhcHBlbmQgPiBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSkgewotCQkJCQkJc291cmNlLmFwcGVuZChnZXRMaW5lRGVsaW1pdGVyKG5vZGUpKTsKLQkJCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCQkJCWlmIChuZWVkSW5kZW50KQotCQkJCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCQlpZiAobmVlZEluZGVudCkKLQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmRTcGFjZUJlZm9yZShJQ1NTTm9kZSBub2RlLCBDb21wb3VuZFJlZ2lvbiB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IHRvQXBwZW5kID09IG51bGwgfHwgc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChpc0NsZWFudXAoKSAmJiAhZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpLmlzRm9ybWF0U291cmNlKCkpCi0JCQlyZXR1cm47IC8vIGZvciBub3QgZm9ybWF0dGluZyBjYXNlIG9uIGNsZWFudXAgYWN0aW9uCi0JCVN0cmluZyB0eXBlID0gdG9BcHBlbmQuZ2V0VHlwZSgpOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQlib29sZWFuIG5lZWRJbmRlbnQgPSAhKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCk7Ci0JCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkvLyBjaGVjayB3aGV0aGVyIHByZXZpb3VzIHJlZ2lvbiBpcyAnUycgYW5kIGhhcyBDUi1MRgotCQkJU3RyaW5nIGRlbGltID0gZ2V0TGluZURlbGltaXRlcihub2RlKTsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKHRvQXBwZW5kLmdldERvY3VtZW50UmVnaW9uKCksIHRvQXBwZW5kLmdldFRleHRSZWdpb24oKSk7Ci0JCQlpdC5wcmV2KCk7Ci0JCQlJVGV4dFJlZ2lvbiBwcmV2ID0gaXQucHJldigpOwotCQkJaWYgKHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIFRleHRVdGlsaXRpZXMuaW5kZXhPZihEZWZhdWx0TGluZVRyYWNrZXIuREVMSU1JVEVSUywgaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChwcmV2KSwgMClbMF0gPj0gMCkgewotCQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCQlpZiAobmVlZEluZGVudCkKLQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZC5nZXRUZXh0KCksIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFICYmIHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19ORVdMSU5FX09OX09QRU5fQlJBQ0UpKSB7Ci0JCQlTdHJpbmcgZGVsaW0gPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUpOwotCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkvLyB9IGVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NVUkxZX0JSQUNFX0NMT1NFKSB7Ci0JCQkvLyB9IGVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lOQ0xVREVTIHx8IHR5cGUgPT0KLQkJCS8vIENTU1JlZ2lvbkNvbnRleHRzLkNTU19EQVNITUFUQ0gpIHsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IgJiYgbm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKSB7Ci0JCQlpbnQgbiA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BSRV9ERUxJTSk7Ci0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkgPiAwICYmICghcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUikgfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpKSB7Ci0JCQkJaW50IGxlbmd0aCA9IGdldExhc3RMaW5lTGVuZ3RoKG5vZGUsIHNvdXJjZSk7Ci0JCQkJaW50IGFwcGVuZCA9IDE7Ci0JCQkJaWYgKGxlbmd0aCArIG4gKyBhcHBlbmQgPiBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSkgewotCQkJCQlzb3VyY2UuYXBwZW5kKGdldExpbmVEZWxpbWl0ZXIobm9kZSkpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJCWlmIChuZWVkSW5kZW50KQotCQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQkJCW4gPSAwOyAvLyBubyBzcGFjZSBpcyBuZWNlc3NhcnkKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBubyBkZWxpbWl0ZXIgY2FzZQotCQkJd2hpbGUgKG4tLSA+IDApCi0JCQkJc291cmNlLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpIHsKLQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSA+IDAgJiYgKCFwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSKSB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkpIHsKLQkJCQlpbnQgbGVuZ3RoID0gZ2V0TGFzdExpbmVMZW5ndGgobm9kZSwgc291cmNlKTsKLQkJCQlpbnQgYXBwZW5kID0gMTsKLQkJCQlpZiAobGVuZ3RoICsgYXBwZW5kID4gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpIHsKLQkJCQkJc291cmNlLmFwcGVuZChnZXRMaW5lRGVsaW1pdGVyKG5vZGUpKTsKLQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCQlpZiAobmVlZEluZGVudCkKLQkJCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChDU1NSZWdpb25Db250ZXh0cy5DU1NfRk9SRUlHTl9FTEVNRU5UID09IHR5cGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQllbHNlCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZC5nZXRUZXh0KCksIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXBwZW5kU3BhY2VCZWZvcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChpc0NsZWFudXAoKSAmJiAhZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpLmlzRm9ybWF0U291cmNlKCkpCi0JCQlyZXR1cm47IC8vIGZvciBub3QgZm9ybWF0dGluZyBjYXNlIG9uIGNsZWFudXAgYWN0aW9uCi0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpZiAodG9BcHBlbmQgIT0gbnVsbCAmJiB0b0FwcGVuZC5zdGFydHNXaXRoKCJ7IikgJiYgcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX05FV0xJTkVfT05fT1BFTl9CUkFDRSkpIHsvLyROT04tTkxTLTEkCi0JCQlzb3VyY2UuYXBwZW5kKGdldExpbmVEZWxpbWl0ZXIobm9kZSkpOwotCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWVsc2UgaWYgKC8qICEgbWdyLmlzT25lUHJvcGVydHlQZXJMaW5lKCkgJiYgKi9wcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSA+IDAgJiYgKCFwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSKSB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkpIHsKLQkJCWludCBuID0gZ2V0TGFzdExpbmVMZW5ndGgobm9kZSwgc291cmNlKTsKLQkJCWludCBhcHBlbmQgPSAodG9BcHBlbmQgIT0gbnVsbCkgPyBUZXh0VXRpbGl0aWVzLmluZGV4T2YoRGVmYXVsdExpbmVUcmFja2VyLkRFTElNSVRFUlMsIHRvQXBwZW5kLCAwKVswXSA6IDA7Ci0JCQlpZiAodG9BcHBlbmQgIT0gbnVsbCkKLQkJCQlhcHBlbmQgPSAoYXBwZW5kIDwgMCkgPyB0b0FwcGVuZC5sZW5ndGgoKSA6IGFwcGVuZDsKLQkJCWlmIChuICsgYXBwZW5kICsgMSA+IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKSB7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRMaW5lRGVsaW1pdGVyKG5vZGUpKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXNvdXJjZS5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZ0J1ZmZlciBjbGVhbnVwKElDU1NOb2RlIG5vZGUpIHsKLQkJc2hvcnQgb2xkU3RyYXRlZ3kgPSBzdHJhdGVneTsKLQkJc3RyYXRlZ3kgPSBDTEVBTlVQOwotCQlTdHJpbmdCdWZmZXIgc291cmNlID0gZm9ybWF0UHJvYyhub2RlKTsKLQkJc3RyYXRlZ3kgPSBvbGRTdHJhdGVneTsKLQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmdCdWZmZXIgY2xlYW51cChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbikgewotCQlzaG9ydCBvbGRTdHJhdGVneSA9IHN0cmF0ZWd5OwotCQlzdHJhdGVneSA9IENMRUFOVVA7Ci0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBmb3JtYXRQcm9jKG5vZGUsIHJlZ2lvbik7Ci0JCXN0cmF0ZWd5ID0gb2xkU3RyYXRlZ3k7Ci0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlY29yYXRlZElkZW50UmVnaW9uKENvbXBvdW5kUmVnaW9uIHJlZ2lvbiwgQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kpIHsKLQkJaWYgKGlzRm9ybWF0KCkpCi0JCQlyZXR1cm4gcmVnaW9uLmdldFRleHQoKTsKLQotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmICghc3RneS5pc0Zvcm1hdFNvdXJjZSgpKQotCQkJdGV4dCA9IHJlZ2lvbi5nZXRGdWxsVGV4dCgpOwotCQllbHNlCi0JCQl0ZXh0ID0gcmVnaW9uLmdldFRleHQoKTsKLQkJCi0JCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TVFJJTkcgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVVJJKQotCQkJcmV0dXJuIGRlY29yYXRlZFJlZ2lvbihyZWdpb24sIDAsIHN0Z3kpOwotCi0JCWlmIChpc0NsZWFudXAoKSkgewotCQkJaWYgKHN0Z3kuZ2V0SWRlbnRDYXNlKCkgPT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LkFTSVMgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQlyZXR1cm4gdGV4dDsKLQkJCWVsc2UgaWYgKHN0Z3kuZ2V0SWRlbnRDYXNlKCkgPT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LlVQUEVSKQotCQkJCXJldHVybiB0ZXh0LnRvVXBwZXJDYXNlKCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHRleHQudG9Mb3dlckNhc2UoKTsKLQkJfQotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpCi0JCQlyZXR1cm4gdGV4dDsKLQkJZWxzZSBpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJcmV0dXJuIHRleHQudG9VcHBlckNhc2UoKTsKLQkJZWxzZQotCQkJcmV0dXJuIHRleHQudG9Mb3dlckNhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlY29yYXRlZFByb3BOYW1lUmVnaW9uKENvbXBvdW5kUmVnaW9uIHJlZ2lvbiwgQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kpIHsKLQkJaWYgKGlzRm9ybWF0KCkpCi0JCQlyZXR1cm4gcmVnaW9uLmdldFRleHQoKTsKLQotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmICghc3RneS5pc0Zvcm1hdFNvdXJjZSgpKQotCQkJdGV4dCA9IHJlZ2lvbi5nZXRGdWxsVGV4dCgpOwotCQllbHNlCi0JCQl0ZXh0ID0gcmVnaW9uLmdldFRleHQoKTsKLQkJCi0JCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TVFJJTkcgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVVJJKQotCQkJcmV0dXJuIGRlY29yYXRlZFJlZ2lvbihyZWdpb24sIDEsIHN0Z3kpOwotCQlpZiAoaXNDbGVhbnVwKCkpIHsKLQkJCWlmIChzdGd5LmdldFByb3BOYW1lQ2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5BU0lTIHx8IHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZKQotCQkJCXJldHVybiB0ZXh0OwotCQkJZWxzZSBpZiAoc3RneS5nZXRQcm9wTmFtZUNhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpCi0JCQkJcmV0dXJuIHRleHQudG9VcHBlckNhc2UoKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQlpZiAocmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fUFJPUEVSVFkpCi0JCQlyZXR1cm4gdGV4dDsKLQkJZWxzZSBpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJcmV0dXJuIHRleHQudG9VcHBlckNhc2UoKTsKLQkJZWxzZQotCQkJcmV0dXJuIHRleHQudG9Mb3dlckNhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihDb21wb3VuZFJlZ2lvbiByZWdpb24sIENTU0NsZWFudXBTdHJhdGVneSBzdGd5KSB7Ci0JCWlmIChpc0Zvcm1hdCgpKQotCQkJcmV0dXJuIHJlZ2lvbi5nZXRUZXh0KCk7Ci0KLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoIXN0Z3kuaXNGb3JtYXRTb3VyY2UoKSkKLQkJCXRleHQgPSByZWdpb24uZ2V0RnVsbFRleHQoKTsKLQkJZWxzZQotCQkJdGV4dCA9IHJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TVFJJTkcgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVVJJIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSkKLQkJCXJldHVybiBkZWNvcmF0ZWRSZWdpb24ocmVnaW9uLCAyLCBzdGd5KTsKLQkJaWYgKGlzQ2xlYW51cCgpKSB7Ci0JCQlpZiAoc3RneS5nZXRQcm9wVmFsdWVDYXNlKCkgIT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LkFTSVMpIHsKLQkJCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKHN0Z3kuZ2V0UHJvcFZhbHVlQ2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5VUFBFUikKLQkJCQkJCXRleHQgPSB0ZXh0LnRvVXBwZXJDYXNlKCk7Ci0JCQkJCWVsc2UKLQkJCQkJCXRleHQgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVjb3JhdGVkUmVnaW9uKENvbXBvdW5kUmVnaW9uIHJlZ2lvbiwgaW50IHR5cGUsIENTU0NsZWFudXBTdHJhdGVneSBzdGd5KSB7Ci0JCWlmIChpc0Zvcm1hdCgpKQotCQkJcmV0dXJuIHJlZ2lvbi5nZXRUZXh0KCk7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKCFzdGd5LmlzRm9ybWF0U291cmNlKCkpCi0JCQl0ZXh0ID0gcmVnaW9uLmdldEZ1bGxUZXh0KCk7Ci0JCWVsc2UKLQkJCXRleHQgPSByZWdpb24uZ2V0VGV4dCgpOwotCQkKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAocmVnaW9uVHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVVJJIHx8IHJlZ2lvblR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSkgewotCQkJU3RyaW5nIHVyaSA9IENTU0xpbmtDb252ZXJ0ZXIuc3RyaXBGdW5jKHRleHQpOwotCi0JCQlib29sZWFuIHByZWZJc1VwcGVyID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSOwotCQkJYm9vbGVhbiB1cHBlciA9ICh0eXBlID09IDApID8gcHJlZklzVXBwZXIgOiAoKHR5cGUgPT0gMSkgPyBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIgOiBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJCVN0cmluZyBmdW5jID0gdGV4dC5zdWJzdHJpbmcoMCwgNCk7Ci0JCQlpZiAoaXNDbGVhbnVwKCkpIHsKLQkJCQl1cHBlciA9ICgodHlwZSA9PSAwKSA/IHN0Z3kuZ2V0SWRlbnRDYXNlKCkgOiAoKHR5cGUgPT0gMSkgPyBzdGd5LmdldFByb3BOYW1lQ2FzZSgpIDogc3RneS5nZXRQcm9wVmFsdWVDYXNlKCkpKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVI7Ci0JCQkJZnVuYyA9ICgodHlwZSA9PSAwKSA/IHN0Z3kuZ2V0SWRlbnRDYXNlKCkgOiAoKHR5cGUgPT0gMSkgPyBzdGd5LmdldFByb3BOYW1lQ2FzZSgpIDogc3RneS5nZXRQcm9wVmFsdWVDYXNlKCkpKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuQVNJUyA/IHRleHQuc3Vic3RyaW5nKDAsIDQpIDogKHVwcGVyID8gIlVSTCgiIDogInVybCgiKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKCghaXNDbGVhbnVwKCkgJiYgcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URV9JTl9VUkkpKSB8fCAoaXNDbGVhbnVwKCkgJiYgc3RneS5pc1F1b3RlVmFsdWVzKCkpKSB7Ci0JCQkJU3RyaW5nIHF1b3RlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQkJCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUodXJpLCBxdW90ZSk7Ci0JCQkJdGV4dCA9IGZ1bmMgKyBxdW90ZSArIHVyaSArIHF1b3RlICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgaWYgKGlzQ2xlYW51cCgpICYmICFzdGd5LmlzUXVvdGVWYWx1ZXMoKSkgewotCQkJCXRleHQgPSBmdW5jICsgQ1NTTGlua0NvbnZlcnRlci5yZW1vdmVGdW5jKHRleHQpICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRleHQgPSBmdW5jICsgdXJpICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TVFJJTkcgJiYgKCFpc0NsZWFudXAoKSB8fCBzdGd5LmlzUXVvdGVWYWx1ZXMoKSkpIHsKLQkJCVN0cmluZyBxdW90ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JCQkvLyBiZWdnaW5uaW5nCi0JCQlpZiAoIXRleHQuc3RhcnRzV2l0aChxdW90ZSkpIHsKLQkJCQlpZiAodGV4dC5zdGFydHNXaXRoKCJcIiIpIHx8IHRleHQuc3RhcnRzV2l0aCgiXCciKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXRleHQgPSBxdW90ZSArIHRleHQuc3Vic3RyaW5nKDEpOwotCQkJCWVsc2UKLQkJCQkJdGV4dCA9IHF1b3RlICsgdGV4dDsKLQkJCX0KLQkJCS8vIGVuZGluZwotCQkJaWYgKCF0ZXh0LmVuZHNXaXRoKHF1b3RlKSkgewotCQkJCWlmICh0ZXh0LmVuZHNXaXRoKCJcIiIpIHx8IHRleHQuZW5kc1dpdGgoIlwnIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgdGV4dC5sZW5ndGgoKSAtIDEpICsgcXVvdGU7Ci0JCQkJZWxzZQotCQkJCQl0ZXh0ID0gdGV4dCArIHF1b3RlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmdCdWZmZXIgZm9ybWF0KElDU1NOb2RlIG5vZGUpIHsKLQkJc2hvcnQgb2xkU3RyYXRlZ3kgPSBzdHJhdGVneTsKLQkJc3RyYXRlZ3kgPSBGT1JNQVQ7Ci0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBmb3JtYXRQcm9jKG5vZGUpOwotCQlzdHJhdGVneSA9IG9sZFN0cmF0ZWd5OwotCi0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZ0J1ZmZlciBmb3JtYXQoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24pIHsKLQkJc2hvcnQgb2xkU3RyYXRlZ3kgPSBzdHJhdGVneTsKLQkJc3RyYXRlZ3kgPSBGT1JNQVQ7Ci0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBmb3JtYXRQcm9jKG5vZGUsIHJlZ2lvbik7Ci0JCXN0cmF0ZWd5ID0gb2xkU3RyYXRlZ3k7Ci0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdEF0dHJDaGFuZ2VkKElDU1NOb2RlIG5vZGUsIElDU1NBdHRyIGF0dHIsIGJvb2xlYW4gaW5zZXJ0LCBBdHRyQ2hhbmdlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKGluc2VydCAmJiAoYXR0ciAhPSBudWxsKSA/IGF0dHIuZ2V0VmFsdWUoKSA6ICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2VuZXJhdGUgb3IgZm9ybWF0IHNvdXJjZSBiZXR3ZWVuIGNoaWxkcmVuKCdjaGlsZCcgYW5kIGl0cyBwcmV2aW91cwotCSAqIHNpYmxpbmcpIGFuZCBhcHBlbmQgdG8gc3RyaW5nIGJ1ZmZlcgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlLCBJUmVnaW9uIGV4Y2VwdEZvcik7Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBvciBmb3JtYXQgc291cmNlIGJldHdlZW4gY2hpbGRyZW4oJ2NoaWxkJyBhbmQgaXRzIHByZXZpb3VzCi0JICogc2libGluZykgYW5kIGFwcGVuZCB0byBzdHJpbmcgYnVmZmVyCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZ0J1ZmZlciBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JCUFzc2VydC5pc1RydWUoY2hpbGQgPT0gbnVsbCB8fCBjaGlsZC5nZXRQYXJlbnROb2RlKCkgPT0gbm9kZSk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvcm1hdEJlZm9yZShub2RlLCBjaGlsZCwgLyogKGNoaWxkICE9IG51bGwpID8gKGNoaWxkLmdldENzc1RleHQoKSkgOiAqLyIiLCBidWYsIGV4Y2VwdEZvcik7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYnVmOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlIG9yIGZvcm1hdCBzb3VyY2UgYmV0d2VlbiBjaGlsZHJlbignY2hpbGQnIGFuZCBpdHMgcHJldmlvdXMKLQkgKiBzaWJsaW5nKSBhbmQgYXBwZW5kIHRvIHN0cmluZyBidWZmZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIElSZWdpb24gcmVnaW9uLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZm9ybWF0Q2hpbGRyZW4oSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlJQ1NTTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCS8vIGFwcGVuZCBjaGlsZAotCQkJQ1NTU291cmNlRm9ybWF0dGVyIGZvcm1hdHRlciA9IChDU1NTb3VyY2VGb3JtYXR0ZXIpICgoSU5vZGVOb3RpZmllcikgY2hpbGQpLmdldEFkYXB0ZXJGb3IoQ1NTU291cmNlRm9ybWF0dGVyLmNsYXNzKTsKLQkJCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkgewotCQkJCWZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIoKElOb2RlTm90aWZpZXIpIGNoaWxkKTsKLQkJCX0KLQkJCVN0cmluZ0J1ZmZlciBjaGlsZFNvdXJjZSA9ICgoQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIpIGZvcm1hdHRlcikuZm9ybWF0UHJvYyhjaGlsZCk7Ci0JCQlpZiAoIWZpcnN0KSB7Ci0JCQkJZm9ybWF0QmVmb3JlKG5vZGUsIGNoaWxkLCBuZXcgU3RyaW5nKGNoaWxkU291cmNlKSwgc291cmNlLCBudWxsKTsKLQkJCX0KLQkJCXNvdXJjZS5hcHBlbmQoY2hpbGRTb3VyY2UpOwotCQkJLy8gYXBwZW5kIGJldHdlZW4gY2hpbGRyZW4KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWZpcnN0ID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmb3JtYXRDaGlsZHJlbihJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlJQ1NTTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpbnQgc3RhcnQgPSByZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaW50IGN1ckVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldEVuZE9mZnNldCgpOwotCQkJU3RyaW5nQnVmZmVyIGNoaWxkU291cmNlID0gbnVsbDsKLQkJCWJvb2xlYW4gdG9GaW5pc2ggPSBmYWxzZTsKLQkJCWlmIChzdGFydCA8IGN1ckVuZCkgewotCQkJCWludCBjdXJTdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaWYgKGN1clN0YXJ0IDwgZW5kKSB7Ci0JCQkJCS8vIGFwcGVuZCBjaGlsZAotCQkJCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gKENTU1NvdXJjZUZvcm1hdHRlcikgKChJTm9kZU5vdGlmaWVyKSBjaGlsZCkuZ2V0QWRhcHRlckZvcihDU1NTb3VyY2VGb3JtYXR0ZXIuY2xhc3MpOwotCQkJCQlpZiAoZm9ybWF0dGVyID09IG51bGwpIHsKLQkJCQkJCWZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIoKElOb2RlTm90aWZpZXIpIGNoaWxkKTsKLQkJCQkJfQotCQkJCQlpZiAoaW5jbHVkZXMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkKLQkJCQkJCWNoaWxkU291cmNlID0gKChBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlcikgZm9ybWF0dGVyKS5mb3JtYXRQcm9jKGNoaWxkKTsKLQkJCQkJZWxzZQotCQkJCQkJY2hpbGRTb3VyY2UgPSAoKEFic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyKSBmb3JtYXR0ZXIpLmZvcm1hdFByb2MoY2hpbGQsIG92ZXJsYXBwZWRSZWdpb24ocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJdG9GaW5pc2ggPSB0cnVlOwotCQkJfQotCQkJLy8gYXBwZW5kIGJldHdlZW4gY2hpbGRyZW4KLQkJCWlmICghZmlyc3QpIHsKLQkJCQljdXJFbmQgPSAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpOyAvLyBjaGFuZ2UKLQkJCQkvLyBvbmx5Ci0JCQkJLy8gc3RhcnQKLQkJCQlpZiAoc3RhcnQgPCBjdXJFbmQpIHsKLQkJCQkJaW50IGN1clN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCWlmIChjdXJTdGFydCA8IGVuZCkgewotCQkJCQkJU3RyaW5nIHRvQXBwZW5kID0gKGNoaWxkU291cmNlICE9IG51bGwpID8gbmV3IFN0cmluZyhjaGlsZFNvdXJjZSkgOiAiIjsvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAoaW5jbHVkZXMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkKLQkJCQkJCQlmb3JtYXRCZWZvcmUobm9kZSwgY2hpbGQsIHRvQXBwZW5kLCBzb3VyY2UsIG51bGwpOwotCQkJCQkJZWxzZQotCQkJCQkJCWZvcm1hdEJlZm9yZShub2RlLCBjaGlsZCwgb3ZlcmxhcHBlZFJlZ2lvbihyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChjaGlsZFNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJc291cmNlLmFwcGVuZChjaGlsZFNvdXJjZSk7Ci0JCQl9Ci0JCQlmaXJzdCA9IGZhbHNlOwotCQkJaWYgKHRvRmluaXNoKQotCQkJCWJyZWFrOwotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGUgb3IgZm9ybWF0IHNvdXJjZSBhZnRlciB0aGUgbGFzdCBjaGlsZCBhbmQgYXBwZW5kIHRvIHN0cmluZwotCSAqIGJ1ZmZlcgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSk7Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBvciBmb3JtYXQgc291cmNlIGFmdGVyIHRoZSBsYXN0IGNoaWxkIGFuZCBhcHBlbmQgdG8gc3RyaW5nCi0JICogYnVmZmVyCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSk7Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBvciBmb3JtYXQgc291cmNlIGJlZm9yZSB0aGUgZmlyc3QgY2hpbGQgYW5kIGFwcGVuZCB0byBzdHJpbmcKLQkgKiBidWZmZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSk7Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBvciBmb3JtYXQgc291cmNlIGJlZm9yZSB0aGUgZmlyc3QgY2hpbGQgYW5kIGFwcGVuZCB0byBzdHJpbmcKLQkgKiBidWZmZXIKLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ0J1ZmZlciBmb3JtYXRQcm9jKElDU1NOb2RlIG5vZGUpIHsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9ybWF0UHJlKG5vZGUsIHNvdXJjZSk7Ci0JCWZvcm1hdENoaWxkcmVuKG5vZGUsIHNvdXJjZSk7Ci0JCWZvcm1hdFBvc3Qobm9kZSwgc291cmNlKTsKLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdCdWZmZXIKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gcmVnaW9uCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nQnVmZmVyIGZvcm1hdFByb2MoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGN1clN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgY3VyRW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG5vZGUuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpID4gMCkgewotCQkJY3VyRW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWlmIChvdmVybGFwcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKSB7Ci0JCQkJaWYgKGluY2x1ZGVzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpCi0JCQkJCWZvcm1hdFByZShub2RlLCBzb3VyY2UpOwotCQkJCWVsc2UKLQkJCQkJZm9ybWF0UHJlKG5vZGUsIG92ZXJsYXBwZWRSZWdpb24ocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSwgc291cmNlKTsKLQkJCX0KLQkJCWN1clN0YXJ0ID0gY3VyRW5kOwotCQkJY3VyRW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKTsKLQkJCWlmIChvdmVybGFwcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKSB7Ci0JCQkJaWYgKGluY2x1ZGVzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpCi0JCQkJCWZvcm1hdENoaWxkcmVuKG5vZGUsIHNvdXJjZSk7Ci0JCQkJZWxzZQotCQkJCQlmb3JtYXRDaGlsZHJlbihub2RlLCBvdmVybGFwcGVkUmVnaW9uKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCksIHNvdXJjZSk7Ci0JCQl9Ci0JCQljdXJTdGFydCA9IGN1ckVuZDsKLQkJCWN1ckVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlpZiAob3ZlcmxhcHMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkgewotCQkJCWlmIChpbmNsdWRlcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKQotCQkJCQlmb3JtYXRQb3N0KG5vZGUsIHNvdXJjZSk7Ci0JCQkJZWxzZQotCQkJCQlmb3JtYXRQb3N0KG5vZGUsIG92ZXJsYXBwZWRSZWdpb24ocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSwgc291cmNlKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWN1ckVuZCA9IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQkJaWYgKG92ZXJsYXBzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpIHsKLQkJCQlpZiAoaW5jbHVkZXMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkKLQkJCQkJZm9ybWF0UHJlKG5vZGUsIHNvdXJjZSk7Ci0JCQkJZWxzZQotCQkJCQlmb3JtYXRQcmUobm9kZSwgb3ZlcmxhcHBlZFJlZ2lvbihyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpLCBzb3VyY2UpOwotCQkJfQotCQkJY3VyU3RhcnQgPSBjdXJFbmQ7Ci0JCQljdXJFbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQkJaWYgKG92ZXJsYXBzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpIHsKLQkJCQlpZiAoaW5jbHVkZXMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkKLQkJCQkJZm9ybWF0UG9zdChub2RlLCBzb3VyY2UpOwotCQkJCWVsc2UKLQkJCQkJZm9ybWF0UG9zdChub2RlLCBvdmVybGFwcGVkUmVnaW9uKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCksIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3kKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTQ2xlYW51cFN0cmF0ZWd5IGdldENsZWFudXBTdHJhdGVneShJQ1NTTm9kZSBub2RlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBjdXJyZW50U3RyYXRlZ3kgPSBDU1NDbGVhbnVwU3RyYXRlZ3lJbXBsLmdldEluc3RhbmNlKCk7Ci0JCUlDU1NEb2N1bWVudCBkb2MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuIGN1cnJlbnRTdHJhdGVneTsKLQkJSUNTU01vZGVsIG1vZGVsID0gZG9jLmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIGN1cnJlbnRTdHJhdGVneTsKLQkJaWYgKG1vZGVsLmdldFN0eWxlU2hlZXRUeXBlKCkgIT0gSUNTU01vZGVsLkVYVEVSTkFMKSB7Ci0JCQkvLyBUT0RPIC0gVFJBTlNJVElPTiBOYWthbW9yaS1zYW4sIG9yIEtpdCwgaG93IGNhbiB3ZSBtb3ZlIHRvCi0JCQkvLyAiSFRNTCIgcGx1Z2luPwotCQkJLy8gY2FuIHdlIHN1YmNsYXNzPwotCQkJLy8gY3VycmVudFN0cmF0ZWd5ID0gQ1NTSW5IVE1MQ2xlYW51cFN0cmF0ZWd5SW1wbC5nZXRJbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBjdXJyZW50U3RyYXRlZ3k7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbmRlbnQoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJSUNTU05vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSUNTU0F0dHIpCi0JCQlwYXJlbnQgPSAoKElDU1NBdHRyKSBub2RlKS5nZXRPd25lckNTU05vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbikKLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIHBhcmVudEluZGVudCA9IGdldEluZGVudChwYXJlbnQpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2Ygb3JnLnczYy5kb20uY3NzLkNTU1J1bGUpCi0JCQlyZXR1cm4gcGFyZW50SW5kZW50ICsgZ2V0SW5kZW50U3RyaW5nKCk7Ci0JCWlmIChub2RlLmdldFBhcmVudE5vZGUoKSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xhcmF0aW9uKQotCQkJcmV0dXJuIHBhcmVudEluZGVudCArIGdldEluZGVudFN0cmluZygpOwotCQlyZXR1cm4gcGFyZW50SW5kZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0TGFzdExpbmVMZW5ndGgoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCVN0cmluZyBkZWxpbSA9IGdldExpbmVEZWxpbWl0ZXIobm9kZSk7Ci0JCVN0cmluZyBzdHIgPSBuZXcgU3RyaW5nKHNvdXJjZSk7Ci0JCWludCBuID0gc3RyLmxhc3RJbmRleE9mKGRlbGltKTsKLQkJaWYgKG4gPCAwKQotCQkJcmV0dXJuIHN0ci5sZW5ndGgoKTsKLQotCQlyZXR1cm4gc3RyLmxlbmd0aCgpIC0gbiAtIGRlbGltLmxlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGhUb1JlZm9ybWF0QWZ0ZXIoSUNTU05vZGUgbm9kZSwgaW50IGluc2VydFBvcykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCUluZGV4ZWRSZWdpb24gbm5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGluc2VydFBvcyA8IDAgfHwgIW5ub2RlLmNvbnRhaW5zKGluc2VydFBvcykpCi0JCQlyZXR1cm4gMDsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnNlcnRQb3MpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnNlcnRQb3MpOwotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJcmVnaW9uID0gaXQubmV4dCgpOwotCQkJLy8gaWYgKHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYKLQkJCS8vIHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiAmJgotCQkJLy8gcmVnaW9uLmdldFR5cGUoKSAhPQotCQkJLy8gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpIHsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaW50IHBvcyA9IChmb3VuZCA/IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgOiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbikpIC0gaW5zZXJ0UG9zOwotCQlyZXR1cm4gKHBvcyA+PSAwKSA/IHBvcyA6IDA7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aFRvUmVmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgaW50IGluc2VydFBvcykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCUluZGV4ZWRSZWdpb24gbm5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGluc2VydFBvcyA8PSAwIHx8ICFubm9kZS5jb250YWlucyhpbnNlcnRQb3MgLSAxKSkKLQkJCXJldHVybiAwOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluc2VydFBvcyAtIDEpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnNlcnRQb3MgLSAxKTsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCXJlZ2lvbiA9IGl0LnByZXYoKTsKLQkJCS8vIGlmIChyZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmCi0JCQkvLyByZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgJiYKLQkJCS8vIHJlZ2lvbi5nZXRUeXBlKCkgIT0KLQkJCS8vIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWludCBwb3MgPSBpbnNlcnRQb3MgLSAoZm91bmQgPyBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbikgOiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pKTsKLQkJLy8gZmxhdE5vZGUgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJLy8gaWYgKGZvdW5kKSB7Ci0JCS8vIGlmIChyZWdpb24uZ2V0TGVuZ3RoKCkgIT0gcmVnaW9uLmdldFRleHRMZW5ndGgoKSkgewotCQkvLyBwb3MgPSBpbnNlcnRQb3MgLSBmbGF0Tm9kZS5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCS8vIH0gZWxzZSB7Ci0JCS8vIHBvcyA9IGluc2VydFBvcyAtIGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkvLyB9Ci0JCS8vIH0gZWxzZSB7Ci0JCS8vIHBvcyA9IGluc2VydFBvcyAtIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCS8vIH0KLQkJcmV0dXJuIChwb3MgPj0gMCkgPyBwb3MgOiAwOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKElDU1NOb2RlIG5vZGUpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gKG5vZGUgIT0gbnVsbCkgPyBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpIDogbnVsbDsKLQkJcmV0dXJuIChtb2RlbCAhPSBudWxsKSA/IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExpbmVEZWxpbWl0ZXIoKSA6ICJcbiI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBUT0RPIDogY2hlY2sgd2hldGhlciB0byB1c2UgbW9kZWwuZ2V0TGluZURlbGltaXRlcigpIG9yCi0JCS8vIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExpbmVEZWxpbWl0ZXIoKQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBDb21wb3VuZFJlZ2lvbltdIGdldE91dHNpZGVSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnQgbW9kZWwsIElSZWdpb24gcmVnKSB7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmV0ID0gbmV3IENvbXBvdW5kUmVnaW9uWzJdOwotCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihtb2RlbCwgcmVnLmdldE9mZnNldCgpKTsKLQkJaXQucHJldigpOwotCQlpZiAoaXQuaGFzUHJldigpKSB7Ci0JCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gaXQucHJldigpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJcmV0WzBdID0gbmV3IENvbXBvdW5kUmVnaW9uKGRvY3VtZW50UmVnaW9uLCB0ZXh0UmVnaW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldFswXSA9IG51bGw7Ci0JCX0KLQkJaXQucmVzZXQobW9kZWwsIHJlZy5nZXRPZmZzZXQoKSArIHJlZy5nZXRMZW5ndGgoKSk7Ci0JCWlmIChpdC5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSBpdC5uZXh0KCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlyZXRbMV0gPSBuZXcgQ29tcG91bmRSZWdpb24oZG9jdW1lbnRSZWdpb24sIHRleHRSZWdpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0WzFdID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBDU1NTb3VyY2VHZW5lcmF0b3IgZ2V0UGFyZW50Rm9ybWF0dGVyKElDU1NOb2RlIG5vZGUpIHsKLQkJSUNTU05vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJQ1NTU291cmNlR2VuZXJhdG9yIGZvcm1hdHRlciA9IChDU1NTb3VyY2VHZW5lcmF0b3IpICgoSU5vZGVOb3RpZmllcikgcGFyZW50KS5nZXRBZGFwdGVyRm9yKENTU1NvdXJjZUZvcm1hdHRlci5jbGFzcyk7Ci0JCQlpZiAoZm9ybWF0dGVyID09IG51bGwpIHsKLQkJCQlmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBwYXJlbnQpOwotCQkJfQotCQkJcmV0dXJuIGZvcm1hdHRlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG91bmRSZWdpb25bXSBnZXRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnQgbW9kZWwsIElSZWdpb24gcmVnLCBJUmVnaW9uIGV4Y2VwdEZvciwgU3RyaW5nIHBpY2t1cFR5cGUpIHsKLQkJaW50IHN0YXJ0ID0gcmVnLmdldE9mZnNldCgpOwotCQlpbnQgZW5kID0gcmVnLmdldE9mZnNldCgpICsgcmVnLmdldExlbmd0aCgpOwotCQlpbnQgc3RhcnRFID0gKGV4Y2VwdEZvciAhPSBudWxsKSA/IGV4Y2VwdEZvci5nZXRPZmZzZXQoKSA6IC0xOwotCQlpbnQgZW5kRSA9IChleGNlcHRGb3IgIT0gbnVsbCkgPyBleGNlcHRGb3IuZ2V0T2Zmc2V0KCkgKyBleGNlcHRGb3IuZ2V0TGVuZ3RoKCkgOiAwOwotCi0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbW9kZWwuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQpOwotCQlib29sZWFuIHBpY2t1cGVkID0gZmFsc2U7Ci0JCXdoaWxlIChmbGF0Tm9kZSAhPSBudWxsICYmIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgPCBlbmQpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0ID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJSXRlcmF0b3IgaXQgPSByZWdpb25MaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgPCBzdGFydCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGVuZCA8PSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pKQotCQkJCQlicmVhazsKLQkJCQlpZiAoc3RhcnRFID49IDAgJiYgc3RhcnRFIDw9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgJiYgZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbikgPD0gZW5kRSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RDIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NETykKLQkJCQkJbGlzdC5hZGQobmV3IENvbXBvdW5kUmVnaW9uKGZsYXROb2RlLCByZWdpb24pKTsKLQkJCQllbHNlIGlmICghcGlja3VwZWQgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBwaWNrdXBUeXBlKSB7Ci0JCQkJCWxpc3QuYWRkKG5ldyBDb21wb3VuZFJlZ2lvbihmbGF0Tm9kZSwgcmVnaW9uKSk7Ci0JCQkJCXBpY2t1cGVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlmbGF0Tm9kZSA9IGZsYXROb2RlLmdldE5leHQoKTsKLQkJfQotCQlpZiAobGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBuZXcgQ29tcG91bmRSZWdpb25bbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KHJlZ2lvbnMpOwotCQkJcmV0dXJuIHJlZ2lvbnM7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21wb3VuZFJlZ2lvblswXTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG91bmRSZWdpb25bXSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKElTdHJ1Y3R1cmVkRG9jdW1lbnQgbW9kZWwsIElSZWdpb24gcmVnLCBDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSkgewotCQlpbnQgc3RhcnQgPSByZWcuZ2V0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSByZWcuZ2V0T2Zmc2V0KCkgKyByZWcuZ2V0TGVuZ3RoKCkgLSAxOwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG1vZGVsLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0KTsKLQkJd2hpbGUgKGZsYXROb2RlICE9IG51bGwgJiYgZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA8PSBlbmQpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0ID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJSXRlcmF0b3IgaXQgPSByZWdpb25MaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgPCBzdGFydCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGVuZCA8IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikpCi0JCQkJCWJyZWFrOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IChpc0NsZWFudXAoKSAmJiAhc3RneS5pc0Zvcm1hdFNvdXJjZSgpKSkgLy8gZm9yCi0JCQkJCS8vIG5vdAotCQkJCQkvLyBmb3JtYXR0aW5nCi0JCQkJCS8vIGNhc2UKLQkJCQkJLy8gb24KLQkJCQkJLy8gY2xlYW51cAotCQkJCQkvLyBhY3Rpb24KLQkJCQkJbGlzdC5hZGQobmV3IENvbXBvdW5kUmVnaW9uKGZsYXROb2RlLCByZWdpb24pKTsKLQkJCX0KLQkJCWZsYXROb2RlID0gZmxhdE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCWlmIChsaXN0LnNpemUoKSA+IDApIHsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IG5ldyBDb21wb3VuZFJlZ2lvbltsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkocmVnaW9ucyk7Ci0JCQlyZXR1cm4gcmVnaW9uczsKLQkJfQotCQlyZXR1cm4gbmV3IENvbXBvdW5kUmVnaW9uWzBdOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpbmNsdWRlcyhJUmVnaW9uIHJlZ2lvbiwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gKHJlZ2lvbi5nZXRPZmZzZXQoKSA8PSBzdGFydCkgJiYgKGVuZCA8PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0NsZWFudXAoKSB7Ci0JCXJldHVybiBzdHJhdGVneSA9PSBDTEVBTlVQOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0Zvcm1hdCgpIHsKLQkJcmV0dXJuIHN0cmF0ZWd5ID09IEZPUk1BVDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luY2x1ZGVzUHJlRW5kKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uKSB7Ci0JCXJldHVybiAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpID09IChyZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgcHJvdGVjdGVkIGJvb2xlYW4gbmVlZFMoQ29tcG91bmRSZWdpb24gcmVnaW9uKSB7Ci0JCXJldHVybiAocmVnaW9uICE9IG51bGwgJiYgcmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBJUmVnaW9uIG92ZXJsYXBwZWRSZWdpb24oSVJlZ2lvbiByZWdpb24sIGludCBzdGFydCwgaW50IGVuZCkgewotCQlpZiAob3ZlcmxhcHMocmVnaW9uLCBzdGFydCwgZW5kKSkgewotCQkJaW50IG9mZnNldCA9IChyZWdpb24uZ2V0T2Zmc2V0KCkgPD0gc3RhcnQpID8gc3RhcnQgOiByZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQgbGVuZ3RoID0gKChlbmQgPD0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKSA/IGVuZCA6IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSkgLSBvZmZzZXQ7Ci0JCQlyZXR1cm4gbmV3IEZvcm1hdFJlZ2lvbihvZmZzZXQsIGxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG92ZXJsYXBzKElSZWdpb24gcmVnaW9uLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiAoc3RhcnQgPCByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpICYmIChyZWdpb24uZ2V0T2Zmc2V0KCkgPCBlbmQpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEluZGVudFN0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQljaGFyIGluZGVudENoYXIgPSAnICc7Ci0JCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJCWlmIChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJaW5kZW50Q2hhciA9ICdcdCc7Ci0JCQl9Ci0JCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCWluZGVudC5hcHBlbmQoaW5kZW50Q2hhcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZGVudC50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9BdHRyQ2hhbmdlQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQXR0ckNoYW5nZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI0YTczZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9BdHRyQ2hhbmdlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEF0dHJDaGFuZ2VDb250ZXh0IHsKLQotCXB1YmxpYyBpbnQgc3RhcnQsIGVuZDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBdHRyQ2hhbmdlQ29udGV4dCgpIHsKLQkJc3VwZXIoKTsKLQkJc3RhcnQgPSBlbmQgPSAwOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9BdHRyRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9BdHRyRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MWE5ZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQXR0ckZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0NoYXJzZXRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQYWdlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyRm9ybWF0dGVyIGV4dGVuZHMgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBBdHRyRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JQXR0ckZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlOwotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0KLQkJCWlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU1N0eWxlUnVsZS5TRUxFQ1RPUikgfHwgYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NQYWdlUnVsZS5TRUxFQ1RPUikpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGkgIT0gMCkKLQkJCQkJCWFwcGVuZFNwYWNlQmV0d2Vlbihub2RlLCByZWdpb25zW2kgLSAxXSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTSW1wb3J0UnVsZS5IUkVGKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSAhPSAwKQotCQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTQ2hhcnNldFJ1bGUuRU5DT0RJTkcpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpICE9IDApCi0JCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU1N0eWxlRGVjbEl0ZW0uSU1QT1JUQU5UKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSAhPSAwKQotCQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGF0dHIuZ2V0TmFtZSgpID09IG51bGwgfHwgYXR0ci5nZXROYW1lKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSAhPSAwKQotCQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gY291bnRlciBhdHRyaWJ1dGVzCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpICE9IDApCi0JCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCQotCQkJU3RyaW5nIHZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOwotCQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQkJdmFsdWUgPSAiIjsvLyROT04tTkxTLTEkCi0JCQlpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NTdHlsZVJ1bGUuU0VMRUNUT1IpIHx8IGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTUGFnZVJ1bGUuU0VMRUNUT1IpKSB7Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU0ltcG9ydFJ1bGUuSFJFRikpIHsKLQkJCQlTdHJpbmcgdXJpID0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTTGlua0NvbnZlcnRlci5zdHJpcEZ1bmModmFsdWUpOwotCQkJCVN0cmluZyBmdW5jID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUiA/ICJVUkwoIiA6ICJ1cmwoIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFX0lOX1VSSSkpIHsKLQkJCQkJU3RyaW5nIHF1b3RlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQkJCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKHVyaSwgcXVvdGUpOwotCQkJCQl2YWx1ZSA9IGZ1bmMgKyBxdW90ZSArIHVyaSArIHF1b3RlICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXZhbHVlID0gZnVuYyArIHVyaSArICIpIjsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NDaGFyc2V0UnVsZS5FTkNPRElORykpIHsKLQkJCQlTdHJpbmcgcXVvdGUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQkJCWlmICghdmFsdWUuc3RhcnRzV2l0aCgiXCIiKSAmJiAhdmFsdWUuc3RhcnRzV2l0aCgiXCciKSkvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQl2YWx1ZSA9IHF1b3RlICsgdmFsdWU7Ci0JCQkJaWYgKCF2YWx1ZS5lbmRzV2l0aCgiXCIiKSAmJiAhdmFsdWUuZW5kc1dpdGgoIlwnIikpLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsdWUgPSB2YWx1ZSArIHF1b3RlOwotCQkJfQotCQkJZWxzZSBpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NTdHlsZURlY2xJdGVtLklNUE9SVEFOVCkpIHsKLQkJCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQkJdmFsdWUgPSB2YWx1ZS50b1VwcGVyQ2FzZSgpOwotCQkJCWVsc2UKLQkJCQkJdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpOwotCQkJfQotCQkJZWxzZSBpZiAoYXR0ci5nZXROYW1lKCkgPT0gbnVsbCB8fCBhdHRyLmdldE5hbWUoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJaWYgKENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCQl2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7Ci0JCQkJZWxzZQotCQkJCQl2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQkJdmFsdWUgPSB2YWx1ZS50b1VwcGVyQ2FzZSgpOwotCQkJCWVsc2UKLQkJCQkJdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpOwotCQkJfQotCQkJc291cmNlLmFwcGVuZCh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJZm9ybWF0UHJlKG5vZGUsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQXR0ckZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEF0dHJGb3JtYXR0ZXIoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTRm9ybWF0VXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTRm9ybWF0VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODA4NTE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU0Zvcm1hdFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSUNTU01vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotcHVibGljIGNsYXNzIENTU0Zvcm1hdFV0aWwgewotCXB1YmxpYyBMaXN0IGNvbGxlY3RDU1NOb2RlcyhJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJTGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlJbmRleGVkUmVnaW9uIHN0YXJ0Tm9kZSA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnQpOwotCQlJbmRleGVkUmVnaW9uIGVuZE5vZGUgPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0ICsgbGVuZ3RoIC0gMSk7Ci0KLQkJaWYgKHN0YXJ0Tm9kZSA9PSBudWxsIHx8IGVuZE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5vZGVzOwotCQl9Ci0KLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsICYmIHN0YXJ0Tm9kZSBpbnN0YW5jZW9mIElDU1NOb2RlICYmIGVuZE5vZGUgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJLy8gQ1NTIG1vZGVsCi0JCQlJQ1NTTm9kZSBjYSA9IGdldENvbW1vbkFuY2VzdG9yKChJQ1NTTm9kZSkgc3RhcnROb2RlLCAoSUNTU05vZGUpIGVuZE5vZGUpOwotCQkJaWYgKGNhICE9IG51bGwpIHsKLQkJCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBjYS5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbCAmJiBzdGFydCArIGxlbmd0aCA8ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCQlpZiAoc3RhcnQgPCAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpKSB7Ci0JCQkJCQlub2Rlcy5hZGQobm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwgJiYgc3RhcnROb2RlIGluc3RhbmNlb2YgSURPTU5vZGUgJiYgZW5kTm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlpZiAoc3RhcnROb2RlIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCXN0YXJ0Tm9kZSA9IChJbmRleGVkUmVnaW9uKSAoKFRleHQpIHN0YXJ0Tm9kZSkuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQkJaWYgKGVuZE5vZGUgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJZW5kTm9kZSA9IChJbmRleGVkUmVnaW9uKSAoKFRleHQpIGVuZE5vZGUpLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCS8vIEhUTUwgbW9kZWwsIG1heWJlCi0JCQlJRE9NTm9kZSBjYSA9IChJRE9NTm9kZSkgZ2V0Q29tbW9uQW5jZXN0b3IoKE5vZGUpIHN0YXJ0Tm9kZSwgKE5vZGUpIGVuZE5vZGUpOwotCQkJZmluZENTUyhub2RlcywgY2EpOwotCQl9Ci0KLQkJcmV0dXJuIG5vZGVzOwotCX0KLQotCS8qKgotCSAqIGdldENvbW1vbkFuY2VzdG9yIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJpdmF0ZSBOb2RlIGdldENvbW1vbkFuY2VzdG9yKE5vZGUgbm9kZTEsIE5vZGUgbm9kZTIpIHsKLQkJaWYgKG5vZGUxID09IG51bGwgfHwgbm9kZTIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWZvciAoTm9kZSBuYSA9IG5vZGUyOyBuYSAhPSBudWxsOyBuYSA9IG5hLmdldFBhcmVudE5vZGUoKSkgewotCQkJZm9yIChOb2RlIHRhID0gbm9kZTE7IHRhICE9IG51bGw7IHRhID0gdGEuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQkJaWYgKHRhID09IG5hKQotCQkJCQlyZXR1cm4gdGE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7IC8vIG5vdCBmb3VuZAotCX0KLQotCXByaXZhdGUgdm9pZCBmaW5kQ1NTKExpc3QgY3NzTm9kZXMsIElET01Ob2RlIG5vZGUpIHsKLQkJSUNTU01vZGVsQWRhcHRlciBhZGFwdGVyOwotCQlhZGFwdGVyID0gKElDU1NNb2RlbEFkYXB0ZXIpIG5vZGUuZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlJQ1NTTW9kZWwgbW9kZWwgPSBhZGFwdGVyLmdldE1vZGVsKCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkgewotCQkJCWNzc05vZGVzLmFkZChtb2RlbC5nZXREb2N1bWVudCgpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWFkYXB0ZXIgPSAoSUNTU01vZGVsQWRhcHRlcikgbm9kZS5nZXRBZGFwdGVyRm9yKElTdHlsZURlY2xhcmF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJSUNTU01vZGVsIG1vZGVsID0gYWRhcHRlci5nZXRNb2RlbCgpOwotCQkJCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0gSUNTU01vZGVsLklOTElORSkgewotCQkJCQljc3NOb2Rlcy5hZGQobW9kZWwuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJZm9yIChJRE9NTm9kZSBjaGlsZCA9IChJRE9NTm9kZSkgbm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gKElET01Ob2RlKSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlmaW5kQ1NTKGNzc05vZGVzLCBjaGlsZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElDU1NOb2RlIGdldENvbW1vbkFuY2VzdG9yKElDU1NOb2RlIG5vZGVBLCBJQ1NTTm9kZSBub2RlQikgewotCQlpZiAobm9kZUEgPT0gbnVsbCB8fCBub2RlQiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoSUNTU05vZGUgbmEgPSBub2RlQTsgbmEgIT0gbnVsbDsgbmEgPSBuYS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWZvciAoSUNTU05vZGUgdGEgPSBub2RlQjsgdGEgIT0gbnVsbDsgdGEgPSB0YS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCQlpZiAodGEgPT0gbmEpIHsKLQkJCQkJcmV0dXJuIHRhOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBsYWNlU291cmNlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG9mZnNldCA+PSAwICYmIGxlbmd0aCA+PSAwICYmIG9mZnNldCArIGxlbmd0aCA8PSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQuY29udGFpbnNSZWFkT25seShvZmZzZXQsIGxlbmd0aCkpCi0JCQkJcmV0dXJuOwotCQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJCXNvdXJjZSA9IG5ldyBTdHJpbmcoKTsKLQkJCS8vIFdlIHVzZSAnc3RydWN0dXJlZERvY3VtZW50JyBhcyB0aGUgcmVxdWVzdGVyIG9iamVjdCBqdXN0IHNvCi0JCQkvLyB0aGlzIGFuZCB0aGUgb3RoZXIKLQkJCS8vIGZvcm1hdC1yZWxhdGVkICdyZXBhbGNlVGV4dCcgKGluIHJlcGxhY2VTb3VyY2UpIGNhbiB1c2UgdGhlCi0JCQkvLyBzYW1lIHJlcXVlc3Rlci4KLQkJCS8vIE90aGVyd2lzZSwgaWYgcmVxdWVzdGVyIGlzIG5vdCBpZGVudGljYWwsCi0JCQkvLyB0aGUgdW5kbyBncm91cCBnZXRzICJicm9rZW4iIGludG8gbXVsdGlwbGUgcGllY2VzIGJhc2VkCi0JCQkvLyBvbiB0aGUgcmVxdWVzdGVycyBiZWluZyBkaWZmZXJlbnQuIFRlY2huaWNhbGx5LCBhbnkgdW5pcXVlLAotCQkJLy8gY29tbW9uCi0JCQkvLyByZXF1ZXN0ZXIgb2JqZWN0IHdvdWxkIHdvcmsuCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgc291cmNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENTU0Zvcm1hdFV0aWwgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENTU0Zvcm1hdFV0aWwoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgQ1NTRm9ybWF0VXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDU1NGb3JtYXRVdGlsIGZJbnN0YW5jZTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU1NvdXJjZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NDczYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTU291cmNlRm9ybWF0dGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZ0J1ZmZlciBjbGVhbnVwKElDU1NOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uCi0JICovCi0JU3RyaW5nQnVmZmVyIGNsZWFudXAoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24pOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nQnVmZmVyIGZvcm1hdChJQ1NTTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZ0J1ZmZlciBmb3JtYXQoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjY4OWM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkgewotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ1NTU291cmNlR2VuZXJhdG9yIGdldFNvdXJjZUZvcm1hdHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlJQ1NTTm9kZSBub2RlID0gKElDU1NOb2RlKSB0YXJnZXQ7Ci0JCXNob3J0IHR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBJQ1NTTm9kZS5DSEFSU0VUUlVMRV9OT0RFIDoKLQkJCQlyZXR1cm4gQ2hhcnNldFJ1bGVGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuRk9OVEZBQ0VSVUxFX05PREUgOgotCQkJCXJldHVybiBGb250RmFjZVJ1bGVGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuSU1QT1JUUlVMRV9OT0RFIDoKLQkJCQlyZXR1cm4gSW1wb3J0UnVsZUZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSA6Ci0JCQkJcmV0dXJuIE1lZGlhTGlzdEZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5NRURJQVJVTEVfTk9ERSA6Ci0JCQkJcmV0dXJuIE1lZGlhUnVsZUZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5QUklNSVRJVkVWQUxVRV9OT0RFIDoKLQkJCQlJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUgPSAoSUNTU1ByaW1pdGl2ZVZhbHVlKSBub2RlOwotCQkJCWlmICh2YWx1ZS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlLkNTU19DT1VOVEVSKQotCQkJCQlyZXR1cm4gQ291bnRlckZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJCWVsc2UgaWYgKHZhbHVlLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JFQ1QpCi0JCQkJCXJldHVybiBSZWN0Rm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQkJZWxzZSBpZiAodmFsdWUuZ2V0UHJpbWl0aXZlVHlwZSgpID09IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkdCQ09MT1IpCi0JCQkJCXJldHVybiBSR0JGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiBQcmltaXRpdmVWYWx1ZUZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5QQUdFUlVMRV9OT0RFIDoKLQkJCQlyZXR1cm4gUGFnZVJ1bGVGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFIDoKLQkJCQlyZXR1cm4gU3R5bGVEZWNsYXJhdGlvbkZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5TVFlMRURFQ0xJVEVNX05PREUgOgotCQkJCXJldHVybiBTdHlsZURlY2xJdGVtRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFUlVMRV9OT0RFIDoKLQkJCQlyZXR1cm4gU3R5bGVSdWxlRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFU0hFRVRfTk9ERSA6Ci0JCQkJcmV0dXJuIFN0eWxlU2hlZXRGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuQVRUUl9OT0RFIDoKLQkJCQlyZXR1cm4gQXR0ckZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIFVua25vd25SdWxlRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5IGZJbnN0YW5jZTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU1NvdXJjZUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MmU4YWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU1NvdXJjZUdlbmVyYXRvciBleHRlbmRzIENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmdCdWZmZXIgZm9ybWF0QXR0ckNoYW5nZWQoSUNTU05vZGUgbm9kZSwgSUNTU0F0dHIgYXR0ciwgYm9vbGVhbiBpbnNlcnQsIEF0dHJDaGFuZ2VDb250ZXh0IHJlZ2lvbik7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmdCdWZmZXIgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBJUmVnaW9uIGV4Y2VwdEZvcik7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0QXR0ckluc2VydFBvcyhJQ1NTTm9kZSBub2RlLCBTdHJpbmcgYXR0ck5hbWUpOwotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGdldENoaWxkSW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlpbnQgZ2V0TGVuZ3RoVG9SZWZvcm1hdEFmdGVyKElDU1NOb2RlIG5vZGUsIGludCBpbnNlcnRQb3MpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlpbnQgZ2V0TGVuZ3RoVG9SZWZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBpbnQgaW5zZXJ0UG9zKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NoYXJzZXRSdWxlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DaGFyc2V0UnVsZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDRlZWRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NoYXJzZXRSdWxlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQ2hhcnNldFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFyc2V0UnVsZUZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIENIQVJTRVQgPSAiQGNoYXJzZXQiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBDaGFyc2V0UnVsZUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCUNoYXJzZXRSdWxlRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0QXR0ckNoYW5nZWQoSUNTU05vZGUgbm9kZSwgSUNTU0F0dHIgYXR0ciwgYm9vbGVhbiBpbnNlcnQsIEF0dHJDaGFuZ2VDb250ZXh0IGNvbnRleHQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gYnVmOwotCi0JCWlmICghSUNTU0NoYXJzZXRSdWxlLkVOQ09ESU5HLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQkvLyBnZXQgcmVnaW9uIHRvIHJlcGxhY2UKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCQlpdC5wcmV2KCk7Ci0JCQkJaWYgKGl0Lmhhc1ByZXYoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBwcmV2ID0gaXQucHJldigpOwotCQkJCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpCi0JCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocHJldik7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCX0gZWxzZQotCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJfSBlbHNlIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQljb250ZXh0LmVuZCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29udGV4dC5zdGFydCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpICsgMTsKLQkJCQkJY29udGV4dC5lbmQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZ2VuZXJhdGUgdGV4dAotCQlpZiAoaW5zZXJ0KSB7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBhdHRyLmdldFZhbHVlKCksIGJ1Zik7Ci0JCQlidWYuYXBwZW5kKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQkJZm9ybWF0UHJlKG5vZGUsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc291cmNlKTsKLQkJfSBlbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJCVN0cmluZyBxdW90ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JCQlTdHJpbmcgc3RyID0gQ0hBUlNFVDsKLQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJc3RyID0gQ0hBUlNFVC50b1VwcGVyQ2FzZSgpOwotCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQkJU3RyaW5nIGVuYyA9ICgoSUNTU0NoYXJzZXRSdWxlKSBub2RlKS5nZXRFbmNvZGluZygpOwotCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKGVuYywgcXVvdGUpOwotCQkJc3RyID0gcXVvdGUgKyAoKGVuYyAhPSBudWxsKSA/IGVuYyA6ICIiKSArIHF1b3RlICsgIjsiOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgc3RyLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkgJiYgIXJlZ2lvbnNbaV0uZ2V0VHlwZSgpLmVxdWFscyhDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICFpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0ckluc2VydFBvcyhJQ1NTTm9kZSBub2RlLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyTmFtZSA9PSBudWxsIHx8IGF0dHJOYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gLTE7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWlmICghSUNTU0NoYXJzZXRSdWxlLkVOQ09ESU5HLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKQotCQkJcmV0dXJuIC0xOwotCi0JCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShJQ1NTQ2hhcnNldFJ1bGUuRU5DT0RJTkcpOwotCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJSW5kZXhlZFJlZ2lvbiBpTm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlDb21wb3VuZFJlZ2lvbiByZWdpb25zW10gPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIG5ldyBGb3JtYXRSZWdpb24oaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBpTm9kZS5nZXRTdGFydE9mZnNldCgpKSwgc3RneSk7Ci0JCWZvciAoaW50IGkgPSByZWdpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpCi0JCQkJcmV0dXJuIHJlZ2lvbnNbaV0uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCQlyZXR1cm4gaU5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSk7Ci0JCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSKQotCQkJCXJldHVybiBuIC0gMTsKLQkJCXJldHVybiBuOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDaGFyc2V0UnVsZUZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBDaGFyc2V0UnVsZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ29tcG91bmRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NvbXBvdW5kUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NjJmZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ29tcG91bmRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotY2xhc3MgQ29tcG91bmRSZWdpb24gewotCi0JQ29tcG91bmRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gdGV4dFJlZ2lvbikgewotCQlzdXBlcigpOwotCQl0aGlzLmZEb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uOwotCQl0aGlzLmZUZXh0UmVnaW9uID0gdGV4dFJlZ2lvbjsKLQl9Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZkRvY3VtZW50UmVnaW9uOwotCX0KLQotCUlUZXh0UmVnaW9uIGdldFRleHRSZWdpb24oKSB7Ci0JCXJldHVybiBmVGV4dFJlZ2lvbjsKLQl9Ci0KLQlTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUZXh0UmVnaW9uLmdldFR5cGUoKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudFJlZ2lvbi5nZXRUZXh0KGZUZXh0UmVnaW9uKTsKLQl9Ci0JCi0JLy8gQnVnIDIxODk5MzogQWRkZWQgdG8gZ2V0IHRleHQgd2l0aCB3aGl0ZXNwYWNlIGZvciBjbGVhbnVwCi0JLy8gd2l0aG91dCBmb3JtYXR0aW5nCi0JU3RyaW5nIGdldEZ1bGxUZXh0KCkgewotCQlyZXR1cm4gZkRvY3VtZW50UmVnaW9uLmdldEZ1bGxUZXh0KGZUZXh0UmVnaW9uKTsKLQl9Ci0KLQlpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZlRleHRSZWdpb24pOwotCX0KLQotCWludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KGZUZXh0UmVnaW9uKTsKLQl9Ci0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmRG9jdW1lbnRSZWdpb247Ci0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBmVGV4dFJlZ2lvbjsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ291bnRlckZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ291bnRlckZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzE3MjViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NvdW50ZXJGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ291bnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ291bnRlckZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ291bnRlckZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCUNvdW50ZXJGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXRBdHRyQ2hhbmdlZChJQ1NTTm9kZSBub2RlLCBJQ1NTQXR0ciBhdHRyLCBib29sZWFuIGluc2VydCwgQXR0ckNoYW5nZUNvbnRleHQgY29udGV4dCkgewotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQotCQlTdHJpbmdCdWZmZXIgc291cmNlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBzb3VyY2U7Ci0KLQkJaWYgKCFJQ291bnRlci5JREVOVElGSUVSLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpICYmICFJQ291bnRlci5MSVNUU1RZTEUuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkgJiYgIUlDb3VudGVyLlNFUEFSQVRPUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBzb3VyY2U7Ci0KLQkJLy8gZ2V0IHJlZ2lvbiB0byByZXBsYWNlCi0JCUluZGV4ZWRSZWdpb24gaU5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJY29udGV4dC5zdGFydCA9IGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWNvbnRleHQuZW5kID0gaU5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0KLQkJSUNvdW50ZXIgY291bnRlciA9IChJQ291bnRlcikgbm9kZTsKLQkJU3RyaW5nIHF1b3RlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQkJU3RyaW5nIHNlcCA9IGNvdW50ZXIuZ2V0U2VwYXJhdG9yKCk7Ci0JCVN0cmluZyBpZGVudCA9IGNvdW50ZXIuZ2V0SWRlbnRpZmllcigpOwotCQlTdHJpbmcgc3R5bGUgPSBjb3VudGVyLmdldExpc3RTdHlsZSgpOwotCi0JCWlmIChJQ291bnRlci5JREVOVElGSUVSLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKSB7Ci0JCQlpZiAoaW5zZXJ0KQotCQkJCWlkZW50ID0gYXR0ci5nZXRWYWx1ZSgpOwotCQkJZWxzZQotCQkJCWlkZW50ID0gIiI7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKElDb3VudGVyLkxJU1RTVFlMRS5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkgewotCQkJaWYgKGluc2VydCkKLQkJCQlzdHlsZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJCWVsc2UKLQkJCQlzdHlsZSA9IG51bGw7Ci0JCX0KLQkJZWxzZSBpZiAoSUNvdW50ZXIuU0VQQVJBVE9SLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKSB7Ci0JCQlpZiAoaW5zZXJ0KQotCQkJCXNlcCA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJCWVsc2UKLQkJCQlzZXAgPSBudWxsOwotCQl9Ci0KLQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKHNlcCwgcXVvdGUpOwotCQlzZXAgPSAoc2VwID09IG51bGwgfHwgc2VwLmxlbmd0aCgpID09IDApID8gbnVsbCA6IChxdW90ZSArIHNlcCArIHF1b3RlKTsKLQotCQlTdHJpbmcgZnVuYyA9IChzZXAgPT0gbnVsbCB8fCBzZXAubGVuZ3RoKCkgPT0gMCkgPyAiY291bnRlcigiIDogImNvdW50ZXJzKCI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpIHsKLQkJCWlkZW50ID0gaWRlbnQudG9VcHBlckNhc2UoKTsKLQkJCXN0eWxlID0gc3R5bGUudG9VcHBlckNhc2UoKTsKLQkJCWZ1bmMgPSBmdW5jLnRvVXBwZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZGVudCA9IGlkZW50LnRvTG93ZXJDYXNlKCk7Ci0JCQlzdHlsZSA9IHN0eWxlLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJaWYgKHNlcCA9PSBudWxsIHx8IHNlcC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlzb3VyY2UuYXBwZW5kKGZ1bmMpOwotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgaWRlbnQsIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGlkZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCXNvdXJjZS5hcHBlbmQoZnVuYyk7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBpZGVudCwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoaWRlbnQpOwotCQkJc291cmNlLmFwcGVuZCgiLCIpOy8vJE5PTi1OTFMtMSQKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHNlcCwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoc2VwKTsKLQkJfQotCi0JCWlmIChzdHlsZSAhPSBudWxsICYmIHN0eWxlLmxlbmd0aCgpICE9IDApIHsKLQkJCXNvdXJjZS5hcHBlbmQoIiwiKTsvLyROT04tTkxTLTEkCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBzdHlsZSwgc291cmNlKTsKLQkJfQotCQlzb3VyY2UuYXBwZW5kKCIpIik7Ly8kTk9OLU5MUy0xJAotCi0JCS8qCi0JCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0KLQkJICogbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJICogSVRleHRSZWdpb25bXSByZWdpb25zID0KLQkJICogZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldwotCQkgKiBGb3JtYXRSZWdpb24oY29udGV4dC5zdGFydCwgY29udGV4dC5lbmQgLSBjb250ZXh0LnN0YXJ0ICsgMSkpOyBpbnQKLQkJICogY29tbWFzWzJdOyBpbnQgbnVtQ29tbWEgPSAwOyBmb3IoaW50IGogPSAwOyBqIDxyZWdpb25zLmxlbmd0aDsgaisrKSB7Ci0JCSAqIGlmIChyZWdpb25zW2pdLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DT01NQSkgewotCQkgKiBjb21tYXNbbnVtQ29tbWErK10gPSBqOyBpZiAobnVtQ29tbWEgPiAxKSBicmVhazsgfSB9Ci0JCSAqIAotCQkgKiBpZiAoSUNvdW50ZXIuSURFTlRJRklFUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkgeyB9IGVsc2UKLQkJICogaWYgKElDb3VudGVyLkxJU1RTVFlMRS5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkgeyB9IGVsc2UKLQkJICogaWYgKElDb3VudGVyLlNFUEFSQVRPUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkgeyBib29sZWFuCi0JCSAqIHNraXBTcGFjZSA9IGZhbHNlOyBTdHJpbmcgZnVuYyA9IGluc2VydCA/ICJjb3VudGVycygiIDogImNvdW50ZXIoIjsKLQkJICogaWYgKG1nci5pc1Byb3BWYWx1ZVVwcGVyQ2FzZSgpKSBmdW5jID0gZnVuYy50b1VwcGVyQ2FzZSgpOwotCQkgKiAKLQkJICogZm9yKGludCBpPTA7IGkgPHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsgaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09Ci0JCSAqIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikKLQkJICogc291cmNlLmFwcGVuZChmdW5jKTsgZWxzZSB7IGlmIChudW1Db21tYSA9PSAyICYmIGNvbW1hc1sxXSA8IGkpIHsKLQkJICogIH0gZWxzZSBpZiAobnVtQ29tbWEgPT0gMSAmJiBjb21tYXNbMF0gPCBpICYmIGluc2VydCkgewotCQkgKiAgfSBlbHNlIGlmIChudW1Db21tYSA9PSAxICYmIGNvbW1hc1swXSA8IGkgJiYgISBpbnNlcnQpIHsgfSBlbHNlIGlmCi0JCSAqIChudW1Db21tYSA9PSAwICYmIGluc2VydCAmJiByZWdpb25zW2ldLmdldFR5cGUgPT0KLQkJICogQ1NTUmVnaW9uQ29udGV4dHMuUEFSRU5USEVTSVNfQ0xPU0UpIHsgc291cmNlLmFwcGVuZCgiLCIpOwotCQkgKiBhcHBlbmRTcGFjZUJlZm9yZShub2RlLGF0dHIuZ2V0VmFsdWUoKSxzb3VyY2UpOwotCQkgKiBzb3VyY2UuYXBwZW5kKGF0dHIuZ2V0VmFsdWUoKSk7IH0KLQkJICogCi0JCSAqIGlmIChpICE9IDAgJiYgIXNraXBTcGFjZSkKLQkJICogYXBwZW5kU3BhY2VCZWZvcmUobm9kZSxyZWdpb25zW2ldLHNvdXJjZSk7Ci0JCSAqIHNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0pKTsgfSBza2lwU3BhY2UgPQotCQkgKiBmYWxzZTsKLQkJICogCi0JCSAqIGlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PQotCQkgKiBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHNraXBTcGFjZSA9IHRydWU7IH0gfQotCQkgKi8KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlib29sZWFuIHNraXBTcGFjZSA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCAmJiAhc2tpcFNwYWNlKQotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNraXBTcGFjZSA9IGZhbHNlOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKQotCQkJCQlza2lwU3BhY2UgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCUlDb3VudGVyIGNvdW50ZXIgPSAoSUNvdW50ZXIpIG5vZGU7Ci0JCQlTdHJpbmcgcXVvdGUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQkJU3RyaW5nIHNlcGFyYXRvciA9IGNvdW50ZXIuZ2V0U2VwYXJhdG9yKCk7Ci0JCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUoc2VwYXJhdG9yLCBxdW90ZSk7Ci0JCQlTdHJpbmcgc2VwID0gKHNlcGFyYXRvciA9PSBudWxsIHx8IHNlcGFyYXRvci5sZW5ndGgoKSA9PSAwKSA/IG51bGwgOiAocXVvdGUgKyBzZXBhcmF0b3IgKyBxdW90ZSk7Ci0JCQlTdHJpbmcgaWRlbnQgPSBjb3VudGVyLmdldElkZW50aWZpZXIoKTsKLQkJCVN0cmluZyBzdHlsZSA9IGNvdW50ZXIuZ2V0TGlzdFN0eWxlKCk7Ci0JCQlTdHJpbmcgZnVuYyA9IChzZXAgPT0gbnVsbCB8fCBzZXAubGVuZ3RoKCkgPT0gMCkgPyAiY291bnRlcigiIDogImNvdW50ZXJzKCI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCS8vIG5vcm1hbGl6ZQotCQkJaWYgKGlkZW50ID09IG51bGwpCi0JCQkJaWRlbnQgPSAiIjsvLyROT04tTkxTLTEkCi0JCQlpZiAoc3R5bGUgPT0gbnVsbCkKLQkJCQlzdHlsZSA9ICIiOy8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpIHsKLQkJCQlpZGVudCA9IGlkZW50LnRvVXBwZXJDYXNlKCk7Ci0JCQkJc3R5bGUgPSBzdHlsZS50b1VwcGVyQ2FzZSgpOwotCQkJCWZ1bmMgPSBmdW5jLnRvVXBwZXJDYXNlKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZGVudCA9IGlkZW50LnRvTG93ZXJDYXNlKCk7Ci0JCQkJc3R5bGUgPSBzdHlsZS50b0xvd2VyQ2FzZSgpOwotCQkJfQotCQkJaWYgKHNlcCA9PSBudWxsIHx8IHNlcC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJc291cmNlLmFwcGVuZChmdW5jKTsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBpZGVudCwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGlkZW50KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNvdXJjZS5hcHBlbmQoZnVuYyk7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgaWRlbnQsIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChpZGVudCk7Ci0JCQkJc291cmNlLmFwcGVuZCgiLCIpOy8vJE5PTi1OTFMtMSQKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBzZXAsIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChzZXApOwotCQkJfQotCi0JCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBzdHlsZS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJc291cmNlLmFwcGVuZCgiLCIpOy8vJE5PTi1OTFMtMSQKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBzdHlsZSwgc291cmNlKTsKLQkJCX0KLQkJCXNvdXJjZS5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgIWlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRBdHRySW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHJOYW1lID09IG51bGwgfHwgYXR0ck5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlJbmRleGVkUmVnaW9uIGlOb2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChJQ291bnRlci5JREVOVElGSUVSLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKSB7Ci0JCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSUNvdW50ZXIuSURFTlRJRklFUik7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpZiAoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkKLQkJCQlyZXR1cm4gLTE7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGlOb2RlLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSAxKSk7Ci0JCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXQucHJldigpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikKLQkJCQkJcmV0dXJuIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJfQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCX0KLQkJZWxzZSBpZiAoSUNvdW50ZXIuTElTVFNUWUxFLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKSB7Ci0JCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSUNvdW50ZXIuTElTVFNUWUxFKTsKLQkJCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpTm9kZS5nZXRFbmRPZmZzZXQoKSAtIDEpKTsKLQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdC5wcmV2KCk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SKQotCQkJCQlyZXR1cm4gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pCi0JCQkJCXJldHVybiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCX0KLQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQl9Ci0JCWVsc2UgaWYgKElDb3VudGVyLlNFUEFSQVRPUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkgewotCQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKElDb3VudGVyLlNFUEFSQVRPUik7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGlOb2RlLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSAxKSk7Ci0JCQlib29sZWFuIGhhc0NvbW1hID0gZmFsc2U7Ci0JCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXQucHJldigpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUikgewotCQkJCQlpZiAoIWhhc0NvbW1hKQotCQkJCQkJaGFzQ29tbWEgPSB0cnVlOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKQotCQkJCQlyZXR1cm4gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQl9Ci0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ291bnRlckZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBDb3VudGVyRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9EZWNsQ29udGFpbmVyRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9EZWNsQ29udGFpbmVyRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNzk5OTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRGVjbENvbnRhaW5lckZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRGVjbENvbnRhaW5lckZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JRGVjbENvbnRhaW5lckZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlY29yYXRlZFNlbGVjdG9yUmVnaW9uKENvbXBvdW5kUmVnaW9uIHJlZ2lvbiwgQ29tcG91bmRSZWdpb24gcHJldlJlZ2lvbiwgQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kpIHsKLQkJaWYgKGlzRm9ybWF0KCkpCi0JCQlyZXR1cm4gcmVnaW9uLmdldFRleHQoKTsKLQkJCi0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKCFzdGd5LmlzRm9ybWF0U291cmNlKCkpCi0JCQl0ZXh0ID0gcmVnaW9uLmdldEZ1bGxUZXh0KCk7Ci0JCWVsc2UKLQkJCXRleHQgPSByZWdpb24uZ2V0VGV4dCgpOwotCQkKLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9JRCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8pIHsKLQkJCXNob3J0IHNlbENhc2UgPSBzdGd5LmdldFNlbGVjdG9yVGFnQ2FzZSgpOwotCQkJaWYgKHNlbENhc2UgPT0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5LlVQUEVSKSB7Ci0JCQkJcmV0dXJuIHRleHQudG9VcHBlckNhc2UoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHNlbENhc2UgPT0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5LkxPV0VSKSB7Ci0JCQkJcmV0dXJuIHRleHQudG9Mb3dlckNhc2UoKTsKLQkJCX0KLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0KLQkJcmV0dXJuIGRlY29yYXRlZFJlZ2lvbihyZWdpb24sIDAsIHN0Z3kpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gKG5vZGUuZ2V0TGFzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJU3RyaW5nIGRlbGltID0gZ2V0TGluZURlbGltaXRlcihub2RlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVsaW0pOwotCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJc291cmNlLmFwcGVuZCgifSIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgbiA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChuID4gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkKLQkJCQlyZXR1cm4gbiAtIDE7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG47Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0RlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0RlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhNjczMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9EZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1JlZ2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyIGV4dGVuZHMgQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmRTcGFjZUJldHdlZW4oSUNTU05vZGUgbm9kZSwgQ29tcG91bmRSZWdpb24gcHJldiwgQ29tcG91bmRSZWdpb24gbmV4dCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpZiAoaXNDbGVhbnVwKCkgJiYgIWdldENsZWFudXBTdHJhdGVneShub2RlKS5pc0Zvcm1hdFNvdXJjZSgpKQotCQkJcmV0dXJuOyAvLyBmb3Igbm90IGZvcm1hdHRpbmcgY2FzZSBvbiBjbGVhbnVwIGFjdGlvbgotCi0JCS8vIGluIHNlbGVjdG9yCi0JCVN0cmluZyBwcmV2VHlwZSA9IHByZXYuZ2V0VHlwZSgpOwotCQlTdHJpbmcgbmV4dFR5cGUgPSBuZXh0LmdldFR5cGUoKTsKLQkJaWYgKENTU1JlZ2lvblV0aWwuaXNTZWxlY3RvckJlZ2dpbmluZ1R5cGUocHJldlR5cGUpICYmIENTU1JlZ2lvblV0aWwuaXNTZWxlY3RvckJlZ2dpbmluZ1R5cGUobmV4dFR5cGUpKSB7Ci0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzM5OTAKLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTA1MzkKLQkJCS8vIEZvcm1hdHRpbmcgQ1NTIGZpbGUgc3BsaXRzIGVsZW1lbnQuY2xhc3MgaW50byBlbGVtZW50IC4gY2xhc3MKLQkJCWlmICgoKHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUUgfHwgcHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTIHx8IHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9JRCkgJiYgKG5leHRUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DTEFTUyB8fCBuZXh0VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfSUQpKSB8fCAoKHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUUgfHwgcHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTKSAmJiBuZXh0VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfUFNFVURPKSB8fCAobmV4dFR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCkpIHsKLQkJCQkvLyBJbmRpdmlkdWFsbHksIFNFTEVDVE9SX0VMRU1FTlRfTkFNRSwgU0VMRUNUT1JfQ0xBU1MsIGFuZCBTRUxFQ1RPUl9JRCBjYW4gYWxsIGJlIGJlZ2lubmluZyB0eXBlcy4KLQkJCQkvLyBCdXQsIHdlIHNob3VsZCBub3QgaW5zZXJ0IGEgc3BhY2UgaW4gYmV0d2VlbiB3aGVuIHRoZXkgYXJlIGZvbGxvd2VkIGJ5IFNFTEVDVE9SX0NMQVNTIG9yIFNFTEVDVE9SX0lELgotCQkJCS8vIEZvciBleGFtcGxlOiBIMS5wYXN0b3JhbCBhbmQgSDEjejk4eSBhbmQgLnBhc3RvcmFsLm90aGVyIGFuZCAjbXlpZC5teWNsYXNzCi0JCQkJLy8KLQkJCQkvLyBBbHNvLCBzcGFjZSBpcyBub3cgbm90IGluc2VydGVkIGluIGJldHdlZW4gd2hlbiBTRUxFQ1RPUl9FTEVNRU5UX05BTUUgaXMgZm9sbG93ZWQgYnkgU0VMRUNUT1JfUFNFVURPLCBvciB3aGVuCi0JCQkJLy8gU0VMRUNUT1JfQ0xBU1MgaXMgZm9sbG93ZWQgYnkgU0VMRUNUT1JfUFNFVURPLgotCQkJCS8vIEZvciBleGFtcGxlOiBQOmZpcnN0LWxldHRlciBhbmQgQS5leHRlcm5hbDp2aXNpdGVkCi0JCQl9Ci0JCQllbHNlCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgbmV4dCwgc291cmNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRSB8fCBwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCB8fCBwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQVRLRVlXT1JEIHx8IHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19GT05UX0ZBQ0UgfHwgcHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCB8fCBwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEpIHsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG5leHQsIHNvdXJjZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAocHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOS05PV04gJiYgbmV4dFR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCWlmIChwcmV2LmdldEVuZE9mZnNldCgpICE9IG5leHQuZ2V0U3RhcnRPZmZzZXQoKSkgeyAvLyBub3QKLQkJCQkJCQkJCQkJCQkJCQkvLyBzZXF1ZW50aWFsCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgbmV4dCwgc291cmNlKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgfHwgcHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgfHwgbmV4dFR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgfHwgbmV4dFR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCBuZXh0VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTikgewotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgbmV4dCwgc291cmNlKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlLCBJUmVnaW9uIGV4Y2VwdEZvcikgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiByZWdpb24sIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgbiA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChuID4gMCkKLQkJCXJldHVybiBuOwotCQlyZXR1cm4gLTE7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0ZvbnRGYWNlUnVsZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9udEZhY2VSdWxlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNDZlZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9udEZhY2VSdWxlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBGb250RmFjZVJ1bGVGb3JtYXR0ZXIgZXh0ZW5kcyBEZWNsQ29udGFpbmVyRm9ybWF0dGVyIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBGT05UX0ZBQ0UgPSAiQGZvbnQtZmFjZSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIEZvbnRGYWNlUnVsZUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCUZvbnRGYWNlUnVsZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKGVuZCA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBzdHIgPSBGT05UX0ZBQ0U7Ci0JCQlpZiAoQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJc3RyID0gRk9OVF9GQUNFLnRvVXBwZXJDYXNlKCk7Ci0JCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAieyIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCQkJc291cmNlLmFwcGVuZCgieyIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pKSB7Ci0JCQlpZiAoaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQllbHNlCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEZvbnRGYWNlUnVsZUZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBGb250RmFjZVJ1bGVGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0Zvcm1hdFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9ybWF0UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMGM5ZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9ybWF0UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotCi0vKioKLSAqIAotICovCi1jbGFzcyBGb3JtYXRSZWdpb24gaW1wbGVtZW50cyBJUmVnaW9uIHsKLQotCXByaXZhdGUgaW50IGZPZmZzZXQsIGZMZW5ndGg7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlGb3JtYXRSZWdpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlzdXBlcigpOwotCQlzZXQob2Zmc2V0LCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgcmVnaW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgcmVnaW9uCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgcmVnaW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUgcmVnaW9uCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiBmT2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJdGhpcy5mT2Zmc2V0ID0gb2Zmc2V0OwotCQl0aGlzLmZMZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRMZW5ndGgoaW50IG5ld0xlbmd0aCkgewotCQlmTGVuZ3RoID0gbmV3TGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0T2Zmc2V0KGludCBuZXdPZmZzZXQpIHsKLQkJZk9mZnNldCA9IG5ld09mZnNldDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRnVuY3Rpb25Gb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0Z1bmN0aW9uRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNDdmMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRnVuY3Rpb25Gb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEZ1bmN0aW9uRm9ybWF0dGVyIGV4dGVuZHMgQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JRnVuY3Rpb25Gb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JCUlDU1NOb2RlIHByZXYgPSAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA6IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCWludCBzdGFydCA9IChwcmV2ICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBwcmV2KS5nZXRFbmRPZmZzZXQoKSA6IDA7Ci0JCWludCBlbmQgPSAoY2hpbGQgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIDogMDsKLQkJaWYgKHN0YXJ0ID4gMCAmJiBzdGFydCA8IGVuZCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJLy8gZ2V0IG1lYW5pbmcgcmVnaW9ucwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbnVsbDsKLQkJCWlmIChleGNlcHRGb3IgPT0gbnVsbCkKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgcGlja3VwVHlwZSA9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUjsKLQkJCQlpZiAocHJldiA9PSBudWxsIHx8IGNoaWxkID09IG51bGwpCi0JCQkJCXBpY2t1cFR5cGUgPSBudWxsOwotCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBleGNlcHRGb3IsIHBpY2t1cFR5cGUpOwotCQkJfQotCQkJLy8gZXh0cmFjdCBzb3VyY2UKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMiwgc3RneSkpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByZXYgIT0gbnVsbCAmJiBjaGlsZCAhPSBudWxsKSB7IC8vIGdlbmVyYXRlIHNvdXJjZSBiZXR3ZWVuCi0JCQkvLyBwYXJhbWV0ZXJzCi0JCQlzb3VyY2UuYXBwZW5kKCIsIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiByZWdpb24sIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMiwgc3RneSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGUgbm9kZSwgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWludCBzdGFydCA9IChub2RlLmdldExhc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlpZiAoZW5kID4gMCAmJiBzdGFydCA8IGVuZCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMiwgc3RneSkpOwotCQkJfQotCQl9IGVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCXNvdXJjZS5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAyLCBzdGd5KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCi0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJfQotCQl9IGVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCVN0cmluZyBmdW5jID0gZ2V0RnVuYygpOwotCQkJaWYgKENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQlmdW5jID0gZnVuYy50b1VwcGVyQ2FzZSgpOwotCQkJc291cmNlLmFwcGVuZChmdW5jKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSAmJiAhaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldENoaWxkSW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUpIHsKLQkJaW50IG4gPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAobiA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCWlmIChmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSkuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQlyZXR1cm4gbiAtIDE7Ci0JCQlyZXR1cm4gbjsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRGdW5jKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9JbXBvcnRSdWxlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9JbXBvcnRSdWxlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzU4NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvSW1wb3J0UnVsZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRSdWxlRm9ybWF0dGVyIGV4dGVuZHMgQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIElNUE9SVCA9ICJAaW1wb3J0IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgSW1wb3J0UnVsZUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCUltcG9ydFJ1bGVGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXRBdHRyQ2hhbmdlZChJQ1NTTm9kZSBub2RlLCBJQ1NTQXR0ciBhdHRyLCBib29sZWFuIGluc2VydCwgQXR0ckNoYW5nZUNvbnRleHQgY29udGV4dCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBidWY7Ci0KLQkJaWYgKCFJQ1NTSW1wb3J0UnVsZS5IUkVGLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQkvLyBnZXQgcmVnaW9uIHRvIHJlcGxhY2UKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCQlpdC5wcmV2KCk7Ci0JCQkJaWYgKGl0Lmhhc1ByZXYoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBwcmV2ID0gaXQucHJldigpOwotCQkJCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpCi0JCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocHJldik7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQlpdC5uZXh0KCk7Ci0JCQkJfSBlbHNlCi0JCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCWl0Lm5leHQoKTsKLQkJCQlpdC5uZXh0KCk7Ci0JCQkJaWYgKGl0Lmhhc05leHQoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBuZXh0ID0gaXQubmV4dCgpOwotCQkJCQlpZiAobmV4dC5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpCi0JCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuZXh0KTsKLQkJCQkJZWxzZQotCQkJCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQl9IGVsc2UKLQkJCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSUNTU05vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQkJCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQkJCWZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJCXJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSAtIDEpOwotCQkJCQlyZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIC0gMSk7Ci0JCQkJfQotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQljb250ZXh0LmVuZCA9IGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJY29udGV4dC5lbmQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZ2VuZXJhdGUgdGV4dAotCQlpZiAoaW5zZXJ0ICYmIGF0dHIuZ2V0VmFsdWUoKSAhPSBudWxsICYmIGF0dHIuZ2V0VmFsdWUoKS5sZW5ndGgoKSA+IDApIHsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIGF0dHIuZ2V0VmFsdWUoKSwgYnVmKTsKLQkJCWJ1Zi5hcHBlbmQoYXR0ci5nZXRWYWx1ZSgpKTsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICIiLCBidWYpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gYnVmOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlLCBJUmVnaW9uIGV4Y2VwdEZvcikgewotCQkvLyBmb3IgbWVkaWEtdHlwZQotCQlJQ1NTTm9kZSBwcmV2ID0gKGNoaWxkICE9IG51bGwpID8gY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkgOiBub2RlLmdldExhc3RDaGlsZCgpOwotCQlpbnQgc3RhcnQgPSAocHJldiAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgcHJldikuZ2V0RW5kT2Zmc2V0KCkgOiAwOwotCQlpbnQgZW5kID0gKGNoaWxkICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA6IDA7Ci0JCWlmIChzdGFydCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCS8vIGdldCBtZWFuaW5nIHJlZ2lvbnMKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IG51bGw7Ci0JCQlpZiAoZXhjZXB0Rm9yID09IG51bGwpCi0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIHBpY2t1cFR5cGUgPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUFfU0VQQVJBVE9SOwotCQkJCWlmIChwcmV2ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkKLQkJCQkJcGlja3VwVHlwZSA9IG51bGw7Ci0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIGV4Y2VwdEZvciwgcGlja3VwVHlwZSk7Ci0JCQl9Ci0JCQkvLyBleHRyYWN0IHNvdXJjZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkvLyBiZQotCQkJCS8vIGNvbW1lbnRzCi0JCQl9Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJfSBlbHNlIGlmIChwcmV2ICE9IG51bGwgJiYgY2hpbGQgIT0gbnVsbCkgeyAvLyBnZW5lcmF0ZSBzb3VyY2UgOiA/Pz8/Ci0JCQlzb3VyY2UuYXBwZW5kKCIsIik7Ly8kTk9OLU5MUy0xJAotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCX0gZWxzZSBpZiAoY2hpbGQgIT0gbnVsbCkgeyAvLyBnZW5lcmF0ZSBzb3VyY2UgOiBiZXR3ZWVuICd1cmwoKScgYW5kCi0JCQkvLyBtZWRpYSB0eXBlcwotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIElSZWdpb24gcmVnaW9uLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsgLy8gbXVzdCBiZQotCQkJLy8gY29tbWVudHMKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCWlmICgoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpID09IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJCWVsc2UKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKGVuZCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzb3VyY2UuYXBwZW5kKCI7Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICgoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKSAmJiAhcmVnaW9uc1tpXS5nZXRUeXBlKCkuZXF1YWxzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIpKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCi0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBzdHIgPSByZWdpb25zW2ldLmdldFRleHQoKTsKLQkJCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCkKLQkJCQkJc3RyID0gZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSk7Ci0JCQkJZWxzZQotCQkJCQlzdHIgPSBkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSk7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCQlTdHJpbmcgc3RyID0gSU1QT1JUOwotCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQlzdHIgPSBJTVBPUlQudG9VcHBlckNhc2UoKTsKLQkJCVN0cmluZyBxdW90ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCQlzdHIgPSAidXJsKCI7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJc3RyID0gc3RyLnRvVXBwZXJDYXNlKCk7Ci0JCQlTdHJpbmcgaHJlZiA9ICgoSUNTU0ltcG9ydFJ1bGUpIG5vZGUpLmdldEhyZWYoKTsKLQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZShocmVmLCBxdW90ZSk7Ci0JCQlzdHIgPSBzdHIgKyBxdW90ZSArIGhyZWYgKyBxdW90ZSArICIpIjsvLyROT04tTkxTLTEkCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBzdHIsIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCX0KLQkJSUNTU05vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGNoaWxkICE9IG51bGwgJiYgKGNoaWxkIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0KSAmJiAoKG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdCkgY2hpbGQpLmdldExlbmd0aCgpID4gMCkgewotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgIiIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgc3RyID0gcmVnaW9uc1tpXS5nZXRUZXh0KCk7Ci0JCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCkKLQkJCQlzdHIgPSBkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KTsKLQkJCWVsc2UKLQkJCQlzdHIgPSBkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSk7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICFpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0ckluc2VydFBvcyhJQ1NTTm9kZSBub2RlLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyTmFtZSA9PSBudWxsIHx8IGF0dHJOYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJaWYgKCFJQ1NTSW1wb3J0UnVsZS5IUkVGLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKQotCQkJcmV0dXJuIC0xOwotCi0JCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShJQ1NTSW1wb3J0UnVsZS5IUkVGKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkKLQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCUluZGV4ZWRSZWdpb24gaU5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGlOb2RlLmdldEVuZE9mZnNldCgpIDw9IDApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJRm9ybWF0UmVnaW9uIGZvcm1hdFJlZ2lvbiA9IG51bGw7Ci0JCUlDU1NOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChjaGlsZCAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldEVuZE9mZnNldCgpID4gMCkKLQkJCWZvcm1hdFJlZ2lvbiA9IG5ldyBGb3JtYXRSZWdpb24oaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSAtIGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQllbHNlCi0JCQlmb3JtYXRSZWdpb24gPSBuZXcgRm9ybWF0UmVnaW9uKGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGlOb2RlLmdldEVuZE9mZnNldCgpIC0gaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCUNvbXBvdW5kUmVnaW9uIHJlZ2lvbnNbXSA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMobm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgZm9ybWF0UmVnaW9uLCBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSkpOwotCi0JCWJvb2xlYW4gYXRydWxlID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19JTVBPUlQpIHsKLQkJCQlhdHJ1bGUgPSB0cnVlOwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmICghYXRydWxlKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCXJldHVybiByZWdpb25zW2ldLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIChjaGlsZCAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIDogaU5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSk7Ci0JCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSKQotCQkJCXJldHVybiBuIC0gMTsKLQkJCXJldHVybiBuOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBJbXBvcnRSdWxlRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEltcG9ydFJ1bGVGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL01lZGlhTGlzdEZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvTWVkaWFMaXN0Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NGViMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvTWVkaWFMaXN0Rm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3Q7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhTGlzdEZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgTWVkaWFMaXN0Rm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JTWVkaWFMaXN0Rm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0QXR0ckNoYW5nZWQoSUNTU05vZGUgbm9kZSwgSUNTU0F0dHIgYXR0ciwgYm9vbGVhbiBpbnNlcnQsIEF0dHJDaGFuZ2VDb250ZXh0IGNvbnRleHQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gYnVmOwotCi0JCWJvb2xlYW4gZmlyc3QgPSBmYWxzZSwgbGFzdCA9IGZhbHNlOwotCQkvLyBnZXQgcmVnaW9uIHRvIHJlcGxhY2UKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCQlpdC5wcmV2KCk7Ci0JCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBwcmV2ID0gaXQucHJldigpOwotCQkJCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgcHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBX1NFUEFSQVRPUiB8fCBwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChwcmV2KTsKLQkJCQkJZWxzZQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChjb250ZXh0LnN0YXJ0IDwgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWZpcnN0ID0gdHJ1ZTsKLQotCQkJCX0KLQkJCQlpdC5yZXNldChmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gbmV4dCA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKG5leHQuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IG5leHQuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQV9TRVBBUkFUT1IgfHwgbmV4dC5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpCi0JCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuZXh0KTsKLQkJCQkJZWxzZQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIDwgY29udGV4dC5lbmQpIHsKLQkJCQkJY29udGV4dC5lbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQkJCQlsYXN0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWxhc3QgPSB0cnVlOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBwcmV2ID0gaXQucHJldigpOwotCQkJCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgcHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBX1NFUEFSQVRPUiB8fCBwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChwcmV2KTsKLQkJCQkJZWxzZQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChjb250ZXh0LnN0YXJ0IDwgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWZpcnN0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZ2VuZXJhdGUgdGV4dAotCQlpZiAoaW5zZXJ0ICYmIGF0dHIuZ2V0VmFsdWUoKSAhPSBudWxsICYmIGF0dHIuZ2V0VmFsdWUoKS5sZW5ndGgoKSA+IDApIHsKLQkJCWlmICghZmlyc3QpCi0JCQkJYnVmLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBhdHRyLmdldFZhbHVlKCksIGJ1Zik7Ci0JCQlidWYuYXBwZW5kKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQlpZiAoIWxhc3QpIHsKLQkJCQlidWYuYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAiIiwgYnVmKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgaWYgKCFmaXJzdCAmJiAhbGFzdCkgewotCQkJYnVmLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAiIiwgYnVmKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWY7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJTWVkaWFMaXN0IGxpc3QgPSAoTWVkaWFMaXN0KSBub2RlOwotCQkJaW50IG4gPSBsaXN0LmdldExlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCQlTdHJpbmcgbWVkaXVtID0gbGlzdC5pdGVtKGkpOwotCQkJCWlmIChDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQkJbWVkaXVtID0gbWVkaXVtLnRvVXBwZXJDYXNlKCk7Ci0JCQkJZWxzZQotCQkJCQltZWRpdW0gPSBtZWRpdW0udG9Mb3dlckNhc2UoKTsKLQotCQkJCWlmIChpICE9IDApIHsKLQkJCQkJc291cmNlLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG1lZGl1bSwgc291cmNlKTsKLQkJCQl9Ci0JCQkJc291cmNlLmFwcGVuZChtZWRpdW0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgIWlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRBdHRySW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHJOYW1lID09IG51bGwgfHwgYXR0ck5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpOwotCi0JCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpOwotCQlJbmRleGVkUmVnaW9uIGlOb2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpTm9kZS5nZXRFbmRPZmZzZXQoKSA8PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCS8qCi0JCSAqIElUZXh0UmVnaW9uIHJlZ2lvbnNbXSA9Ci0JCSAqIGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMobm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwKLQkJICogbmV3IEZvcm1hdFJlZ2lvbihpTm9kZS5nZXRTdGFydE9mZnNldCgpLCBpTm9kZS5nZXRFbmRPZmZzZXQoKSAtCi0JCSAqIGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCkgKyAxKSk7IGZvcihpbnQgaT1yZWdpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsKLQkJICogaS0tKSB7IGlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5JTVBPUlRBTlRfU1lNKQotCQkgKiByZXR1cm4gcmVnaW9uc1tpXS5nZXRTdGFydE9mZnNldCgpOyB9Ci0JCSAqLwotCQlyZXR1cm4gaU5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgTWVkaWFMaXN0Rm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IE1lZGlhTGlzdEZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvTWVkaWFSdWxlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9NZWRpYVJ1bGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU5ZjU2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9NZWRpYVJ1bGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUnVsZUZvcm1hdHRlciBleHRlbmRzIEFic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBNRURJQSA9ICJAbWVkaWEiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBNZWRpYVJ1bGVGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlNZWRpYVJ1bGVGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JCUlDU1NOb2RlIHByZXYgPSAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA6IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCWludCBzdGFydCA9IChwcmV2ICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBwcmV2KS5nZXRFbmRPZmZzZXQoKSA6IDA7Ci0JCWludCBlbmQgPSAoY2hpbGQgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIDogMDsKLQkJaWYgKHN0YXJ0ID4gMCAmJiBzdGFydCA8IGVuZCkgeyAvLyBzb3VyY2UgZm9ybWF0dGluZwotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCS8vIGdldCBtZWFuaW5nIHJlZ2lvbnMKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IG51bGw7Ci0JCQlpZiAoZXhjZXB0Rm9yID09IG51bGwpCi0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIHBpY2t1cFR5cGUgPSBudWxsOwotCQkJCWlmICgocHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgfHwgKHByZXYgPT0gbnVsbCAmJiAoY2hpbGQgPT0gbnVsbCB8fCBjaGlsZC5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSkpIHsKLQkJCQkJcGlja3VwVHlwZSA9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0U7Ci0JCQkJfQotCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBleGNlcHRGb3IsIHBpY2t1cFR5cGUpOwotCQkJfQotCQkJLy8gZXh0cmFjdCBzb3VyY2UKLQkJCWlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUpIHsgLy8gYmV0d2VlbgotCQkJCS8vICJAbWVkaWEiCi0JCQkJLy8gYW5kCi0JCQkJLy8gbWVkaWF0eXBlCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsgLy8gbXVzdAotCQkJCQkvLyBiZQotCQkJCQkvLyBjb21tZW50cwotCQkJCX0KLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJCX0gZWxzZSBpZiAoY2hpbGQgIT0gbnVsbCAmJiAoY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkgPT0gbnVsbCB8fCBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSkgeyAvLyBiZXR3ZWVuCi0JCQkJLy8gbWVkaWF0eXBlCi0JCQkJLy8gYW5kCi0JCQkJLy8gdGhlCi0JCQkJLy8gZmlyc3QKLQkJCQkvLyBzdHlsZQotCQkJCS8vIHJ1bGUKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJCS8vIGJlCi0JCQkJCS8vIGNvbW1lbnRzCi0JCQkJfQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQl9IGVsc2UgeyAvLyBiZXR3ZWVuIHN0eWxlcwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkJLy8gYmUKLQkJCQkJLy8gY29tbWVudHMKLQkJCQl9Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCX0KLQkJfSBlbHNlIHsgLy8gc291cmNlIGdlbmVyYXRpb24KLQkJCWlmIChjaGlsZCA9PSBudWxsICYmIHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCkgIT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUpIHsgLy8gYWZ0ZXIKLQkJCQkvLyB0aGUKLQkJCQkvLyBsYXN0Ci0JCQkJLy8gc3R5bGUKLQkJCQkvLyBydWxlCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZS5nZXRQYXJlbnROb2RlKCksIG51bGwsIHNvdXJjZSk7Ci0JCQl9IGVsc2UgaWYgKGNoaWxkICE9IG51bGwgJiYgY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgeyAvLyBiZXR3ZWVuCi0JCQkJLy8gIkBtZWRpYSIKLQkJCQkvLyBhbmQKLQkJCQkvLyBtZWRpYXR5cGUKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJCX0gZWxzZSBpZiAocHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgeyAvLyBiZXR3ZWVuCi0JCQkJLy8gbWVkaWF0eXBlCi0JCQkJLy8gYW5kCi0JCQkJLy8gdGhlCi0JCQkJLy8gZmlyc3QKLQkJCQkvLyBzdHlsZQotCQkJCS8vIHJ1bGUKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAieyIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCQkJCXNvdXJjZS5hcHBlbmQoInsiKTsvLyROT04tTkxTLTEkCi0JCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQkJZWxzZQotCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLmdldFBhcmVudE5vZGUoKSwgbnVsbCwgc291cmNlKTsKLQkJCX0gZWxzZSB7IC8vIG5vcm1hbCBjYXNlCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJaWYgKGNoaWxkICE9IG51bGwgJiYgY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgeyAvLyBiZXR3ZWVuCi0JCQkvLyAiQG1lZGlhIgotCQkJLy8gYW5kCi0JCQkvLyBtZWRpYXR5cGUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJLy8gYmUKLQkJCQkvLyBjb21tZW50cwotCQkJfQotCQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgPT0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY2hpbGQgIT0gbnVsbCAmJiAoY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkgPT0gbnVsbCB8fCBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSkgeyAvLyBiZXR3ZWVuCi0JCQkvLyBtZWRpYXR5cGUKLQkJCS8vIGFuZAotCQkJLy8gdGhlCi0JCQkvLyBmaXJzdAotCQkJLy8gc3R5bGUKLQkJCS8vIHJ1bGUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJLy8gYmUKLQkJCQkvLyBjb21tZW50cwotCQkJfQotCQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgPT0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCX0KLQkJfSBlbHNlIHsgLy8gYmV0d2VlbiBzdHlsZXMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJLy8gYmUKLQkJCQkvLyBjb21tZW50cwotCQkJfQotCQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgPT0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gKG5vZGUuZ2V0TGFzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7IC8vIHNvdXJjZSBmb3JtYXR0aW5nCi0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlpZiAobm9kZS5nZXRMYXN0Q2hpbGQoKSA9PSBudWxsIHx8IG5vZGUuZ2V0TGFzdENoaWxkKCkuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlib29sZWFuIGJJbkN1cmx5QnJhY2UgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKCFiSW5DdXJseUJyYWNlKQotCQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJZWxzZQotCQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQkJCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkKLQkJCQkJCWJJbkN1cmx5QnJhY2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsgLy8gc291cmNlIGdlbmVyYXRpb24KLQkJCVN0cmluZyBkZWxpbSA9IGdldExpbmVEZWxpbWl0ZXIobm9kZSk7Ci0JCQlpZiAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmIG5vZGUuZ2V0TGFzdENoaWxkKCkuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICJ7Iiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JCQkJc291cmNlLmFwcGVuZCgieyIpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQlzb3VyY2UuYXBwZW5kKCJ9Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQotCQlpZiAoZW5kID4gMCkgeyAvLyBzb3VyY2UgZm9ybWF0dGluZwotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCX0KLQkJfSBlbHNlIHsgLy8gc291cmNlIGdlbmVyYXRpb24KLQkJCVN0cmluZyBzdHIgPSBNRURJQTsKLQkJCWlmIChDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQlzdHIgPSBNRURJQS50b1VwcGVyQ2FzZSgpOwotCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQl9Ci0JCUlDU1NOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChjaGlsZCAhPSBudWxsICYmIChjaGlsZCBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdCkgJiYgKChvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3QpIGNoaWxkKS5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICIiLCBzb3VyY2UpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICFpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgbiA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChuID4gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkKLQkJCQlyZXR1cm4gbiAtIDE7Ci0JCQlyZXR1cm4gbjsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgTWVkaWFSdWxlRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IE1lZGlhUnVsZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aFRvUmVmb3JtYXRBZnRlcihJQ1NTTm9kZSBub2RlLCBpbnQgaW5zZXJ0UG9zKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJSW5kZXhlZFJlZ2lvbiBubm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaW5zZXJ0UG9zIDw9IDAgfHwgIW5ub2RlLmNvbnRhaW5zKGluc2VydFBvcyAtIDEpKQotCQkJcmV0dXJuIDA7Ci0KLQkJaWYgKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpLmdldE5leHRTaWJsaW5nKCkgPT0gbm9kZS5nZXRMYXN0Q2hpbGQoKSkgeyAvLyBpbnNlcnRlZAotCQkJLy8gZmlyc3QKLQkJCS8vIHN0eWxlCi0JCQkvLyBydWxlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnNlcnRQb3MpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJcmV0dXJuIDA7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnNlcnRQb3MpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJCXJldHVybiAwOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJcmVnaW9uID0gaXQubmV4dCgpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpCi0JCQkJCWJyZWFrOwotCQkJCWlmIChubm9kZS5nZXRFbmRPZmZzZXQoKSA8PSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpbnQgcG9zID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSAtIGluc2VydFBvczsKLQkJCXJldHVybiAocG9zID49IDApID8gcG9zIDogMDsKLQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRMZW5ndGhUb1JlZm9ybWF0QWZ0ZXIobm9kZSwgaW5zZXJ0UG9zKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoVG9SZWZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBpbnQgaW5zZXJ0UG9zKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJSW5kZXhlZFJlZ2lvbiBubm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaW5zZXJ0UG9zIDw9IDAgfHwgIW5ub2RlLmNvbnRhaW5zKGluc2VydFBvcyAtIDEpKQotCQkJcmV0dXJuIDA7Ci0KLQkJaWYgKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpLmdldE5leHRTaWJsaW5nKCkgPT0gbm9kZS5nZXRMYXN0Q2hpbGQoKSkgeyAvLyBpbnNlcnRlZAotCQkJLy8gZmlyc3QKLQkJCS8vIHN0eWxlCi0JCQkvLyBydWxlCi0JCQlpbnQgcG9zID0gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlpZiAocG9zIDw9IDApCi0JCQkJcG9zID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpICsgNiAvKgotCQkJCQkJCQkJCQkJCQkJCQkgKiBsZW5ndGgKLQkJCQkJCQkJCQkJCQkJCQkJICogb2YKLQkJCQkJCQkJCQkJCQkJCQkJICogIkBtZWRpYSIKLQkJCQkJCQkJCQkJCQkJCQkJICovOwotCQkJcmV0dXJuIGluc2VydFBvcyAtIHBvczsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TGVuZ3RoVG9SZWZvcm1hdEJlZm9yZShub2RlLCBpbnNlcnRQb3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1BhZ2VSdWxlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9QYWdlUnVsZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTFmN2EzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1BhZ2VSdWxlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUGFnZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWdlUnVsZUZvcm1hdHRlciBleHRlbmRzIERlY2xDb250YWluZXJGb3JtYXR0ZXIgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFBBR0UgPSAiQHBhZ2UiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBQYWdlUnVsZUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVBhZ2VSdWxlRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0QXR0ckNoYW5nZWQoSUNTU05vZGUgbm9kZSwgSUNTU0F0dHIgYXR0ciwgYm9vbGVhbiBpbnNlcnQsIEF0dHJDaGFuZ2VDb250ZXh0IGNvbnRleHQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gYnVmOwotCi0JCWlmICghSUNTU1BhZ2VSdWxlLlNFTEVDVE9SLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQkvLyBnZXQgcmVnaW9uIHRvIHJlcGxhY2UKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQkJaXQubmV4dCgpOwotCQkJCWlmIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gbmV4dCA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKG5leHQuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKQotCQkJCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmV4dCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWludCBwb3MgPSBnZXRBdHRySW5zZXJ0UG9zKG5vZGUsIGF0dHIuZ2V0TmFtZSgpKTsKLQkJCQljb250ZXh0LnN0YXJ0ID0gcG9zOwotCQkJCWNvbnRleHQuZW5kID0gcG9zOwotCQkJCS8qCi0JCQkJICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9Ci0JCQkJICogbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXROb2RlQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKW5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCSAqIElUZXh0UmVnaW9uIHJlZ2lvbiA9Ci0JCQkJICogZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKW5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCSAqIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLlMpIHsKLQkJCQkgKiBjb250ZXh0LnN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7IGNvbnRleHQuZW5kID0KLQkJCQkgKiByZWdpb24uZ2V0RW5kT2Zmc2V0KCk7IH0gZWxzZSB7IGNvbnRleHQuc3RhcnQgPQotCQkJCSAqIGZsYXROb2RlLmdldEVuZE9mZnNldCgpICsgMTsgY29udGV4dC5lbmQgPQotCQkJCSAqIGZsYXROb2RlLmdldEVuZE9mZnNldCgpOyB9Ci0JCQkJICovfQotCQl9Ci0JCS8vIGdlbmVyYXRlIHRleHQKLQkJaWYgKGluc2VydCkgewotCQkJU3RyaW5nIHZhbCA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJCWlmICh2YWwgIT0gbnVsbCAmJiB2YWwubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJYnVmLmFwcGVuZCh2YWwpOwotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICIiLCBidWYpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVmOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IChub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0KLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlhcHBlbmRTcGFjZUJldHdlZW4obm9kZSwgcmVnaW9uc1tpIC0gMV0sIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJU3RyaW5nIHN0ciA9IFBBR0U7Ci0JCQlpZiAoQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJc3RyID0gUEFHRS50b1VwcGVyQ2FzZSgpOwotCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQkJc3RyID0gKChJQ1NTUGFnZVJ1bGUpIG5vZGUpLmdldFNlbGVjdG9yVGV4dCgpOwotCQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5sZW5ndGgoKSA+IDApIHsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBzdHIsIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQkJfQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgInsiLCBzb3VyY2UpOy8vJE5PTi1OTFMtMSQKLQkJCXNvdXJjZS5hcHBlbmQoInsiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZXR3ZWVuKG5vZGUsIChpID09IDApID8gb3V0c2lkZVswXSA6IHJlZ2lvbnNbaSAtIDFdLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pKSB7Ci0JCQlpZiAoaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQllbHNlCi0JCQkJYXBwZW5kU3BhY2VCZXR3ZWVuKG5vZGUsIHJlZ2lvbnNbcmVnaW9ucy5sZW5ndGggLSAxXSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0ckluc2VydFBvcyhJQ1NTTm9kZSBub2RlLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyTmFtZSA9PSBudWxsIHx8IGF0dHJOYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJaWYgKCFJQ1NTUGFnZVJ1bGUuU0VMRUNUT1IuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKElDU1NQYWdlUnVsZS5TRUxFQ1RPUik7Ci0JCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpOwotCQllbHNlIGlmICgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlyZWdpb24gPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJCQlyZXR1cm4gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQl9Ci0JCQkJaWYgKGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pID49ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkpCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgUGFnZVJ1bGVGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgUGFnZVJ1bGVGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1ByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9QcmltaXRpdmVWYWx1ZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjE1YzlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1ByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJpbWl0aXZlVmFsdWVGb3JtYXR0ZXIgZXh0ZW5kcyBEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JUHJpbWl0aXZlVmFsdWVGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWJvb2xlYW4gYXBwZW5kUXVvdGUgPSByZWdpb25zLmxlbmd0aCA+IDEgJiYgbm9kZS5nZXRQYXJlbnROb2RlKCkgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSAmJiBpc0NsZWFudXAoKSAmJiBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSkuaXNRdW90ZVZhbHVlcygpICYmICgoKElDU1NTdHlsZURlY2xJdGVtKSBub2RlLmdldFBhcmVudE5vZGUoKSkuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKFByb3BDTVByb3BlcnR5LlBfRk9OVCkgfHwgKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZS5nZXRQYXJlbnROb2RlKCkpLmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfRkFNSUxZKSB8fCAoKElDU1NTdHlsZURlY2xJdGVtKSBub2RlLmdldFBhcmVudE5vZGUoKSkuZ2V0UHJvcGVydHlOYW1lKCkuZXF1YWxzKFByb3BDTVByb3BlcnR5LlBfVk9JQ0VfRkFNSUxZKSk7Ci0JCQlTdHJpbmcgcXVvdGUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCi0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYm9vbGVhbiBza2lwU3BhY2UgPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDAgJiYgIXNraXBTcGFjZSkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc3RyQnVmKTsKLQkJCQlza2lwU3BhY2UgPSBmYWxzZTsKLQkJCQlzdHJCdWYuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikKLQkJCQkJc2tpcFNwYWNlID0gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKGFwcGVuZFF1b3RlKSB7Ci0JCQkJc291cmNlLmFwcGVuZChxdW90ZSk7Ci0JCQkJU3RyaW5nIHN0ciA9IHN0ckJ1Zi50b1N0cmluZygpOwotCQkJCXN0ciA9IHN0ci5yZXBsYWNlKCdcJycsICcgJyk7Ci0JCQkJc3RyID0gc3RyLnJlcGxhY2UoJ1wiJywgJyAnKTsKLQkJCQlzdHIgPSBzdHIudHJpbSgpOwotCQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCQlzb3VyY2UuYXBwZW5kKHF1b3RlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNvdXJjZS5hcHBlbmQoc3RyQnVmKTsKLQkJCX0KLQkJfQotCQllbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUgPSAoSUNTU1ByaW1pdGl2ZVZhbHVlKSBub2RlOwotCQkJc2hvcnQgdHlwZSA9IHZhbHVlLmdldFByaW1pdGl2ZVR5cGUoKTsKLQkJCVN0cmluZyBxdW90ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0KLQkJCVN0cmluZyBzdHIgPSBudWxsOwotCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTlVNQkVSIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QRVJDRU5UQUdFIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FTVMgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VYUyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFggOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NNIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NTSA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU4gOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BUIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QQyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfREVHIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SQUQgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0dSQUQgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01TIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19TIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19IWiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfS0haIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19ESU1FTlNJT04gOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTlRFR0VSIDoKLQkJCQkJaWYgKHZhbHVlLmdldEZsb2F0VmFsdWUodHlwZSkgPT0gKChpbnQpIHZhbHVlLmdldEZsb2F0VmFsdWUodHlwZSkpKSB7Ci0JCQkJCQlzdHIgPSBJbnRlZ2VyLnRvU3RyaW5nKChpbnQpIHZhbHVlLmdldEZsb2F0VmFsdWUodHlwZSkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc3RyID0gRmxvYXQudG9TdHJpbmcodmFsdWUuZ2V0RmxvYXRWYWx1ZSh0eXBlKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSURFTlQgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19IQVNIIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5IRVJJVF9QUklNSVRJVkUgOgotCQkJCQlzdHIgPSB2YWx1ZS5nZXRTdHJpbmdWYWx1ZSgpOwotCQkJCQlpZiAoc3RyICE9IG51bGwpIHsKLQkJCQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCQkJCXN0ciA9IHN0ci50b1VwcGVyQ2FzZSgpOwotCQkJCQkJZWxzZQotCQkJCQkJCXN0ci50b0xvd2VyQ2FzZSgpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1NUUklORyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVVJJIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19BVFRSIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVVJBTkdFIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRk9STUFUIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTE9DQUwgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19DT01NQSA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1NMQVNIIDoKLQkJCQkJc3RyID0gdmFsdWUuZ2V0U3RyaW5nVmFsdWUoKTsKLQkJCX0KLQotCQkJU3RyaW5nIHByZVN0ciA9IG51bGwsIHBvc3RTdHIgPSBudWxsOwotCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQVRUUiA6Ci0JCQkJCXByZVN0ciA9ICJhdHRyKCI7Ly8kTk9OLU5MUy0xJAotCQkJCQlwb3N0U3RyID0gIikiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ00gOgotCQkJCQlwb3N0U3RyID0gImNtIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCS8vIGNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19DT1VOVEVSOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RFRyA6Ci0JCQkJCXBvc3RTdHIgPSAiZGVnIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VNUyA6Ci0JCQkJCXBvc3RTdHIgPSAiZW0iOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRVhTIDoKLQkJCQkJcG9zdFN0ciA9ICJleCI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19HUkFEIDoKLQkJCQkJcG9zdFN0ciA9ICJncmFkIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0haIDoKLQkJCQkJcG9zdFN0ciA9ICJIeiI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTiA6Ci0JCQkJCXBvc3RTdHIgPSAiaW4iOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfS0haIDoKLQkJCQkJcG9zdFN0ciA9ICJrSHoiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTU0gOgotCQkJCQlwb3N0U3RyID0gIm1tIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01TIDoKLQkJCQkJcG9zdFN0ciA9ICJtcyI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QQyA6Ci0JCQkJCXBvc3RTdHIgPSAicGMiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEVSQ0VOVEFHRSA6Ci0JCQkJCXBvc3RTdHIgPSAiJSI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QVCA6Ci0JCQkJCXBvc3RTdHIgPSAicHQiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFggOgotCQkJCQlwb3N0U3RyID0gInB4IjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JBRCA6Ci0JCQkJCXBvc3RTdHIgPSAicmFkIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCS8vIGNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19SRUNUOgotCQkJCS8vIGNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19SR0JDT0xPUjoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19TIDoKLQkJCQkJcG9zdFN0ciA9ICJzIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1NUUklORyA6Ci0JCQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZShzdHIsIHF1b3RlKTsKLQkJCQkJcHJlU3RyID0gcXVvdGU7Ci0JCQkJCXBvc3RTdHIgPSBxdW90ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVVJJIDoKLQkJCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKHN0ciwgcXVvdGUpOwotCQkJCQlwcmVTdHIgPSAidXJsKCIgKyBxdW90ZTsvLyROT04tTkxTLTEkCi0JCQkJCXBvc3RTdHIgPSBxdW90ZSArICIpIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCS8vIHRoZSBmb2xsb3dpbmdzIGFyZSBvcmlnaW5hbCBwcmltaXRpdmUgdmFsdWVzCi0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSURFTlQgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VOS05PV04gOgotCQkJCS8vIHVzZSBzdHIKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5URUdFUiA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0hBU0ggOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19TTEFTSCA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPTU1BIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19ESU1FTlNJT04gOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX05VTUJFUiA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOSEVSSVRfUFJJTUlUSVZFIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VSQU5HRSA6Ci0JCQkJCXByZVN0ciA9ICJVKyI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRk9STUFUIDoKLQkJCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKHN0ciwgcXVvdGUpOwotCQkJCQlwcmVTdHIgPSAiZm9ybWF0KCIgKyBxdW90ZTsvLyROT04tTkxTLTEkCi0JCQkJCXBvc3RTdHIgPSBxdW90ZSArICIpIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19MT0NBTCA6Ci0JCQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZShzdHIsIHF1b3RlKTsKLQkJCQkJcHJlU3RyID0gImxvY2FsKCIgKyBxdW90ZTsvLyROT04tTkxTLTEkCi0JCQkJCXBvc3RTdHIgPSBxdW90ZSArICIpIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpIHsKLQkJCQlpZiAocHJlU3RyICE9IG51bGwpCi0JCQkJCXByZVN0ciA9IHByZVN0ci50b1VwcGVyQ2FzZSgpOwotCQkJCWlmIChwb3N0U3RyICE9IG51bGwpCi0JCQkJCXBvc3RTdHIgPSBwb3N0U3RyLnRvVXBwZXJDYXNlKCk7Ci0JCQl9Ci0JCQlpZiAocHJlU3RyICE9IG51bGwpCi0JCQkJc291cmNlLmFwcGVuZChwcmVTdHIpOwotCQkJaWYgKHN0ciAhPSBudWxsKQotCQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCWlmIChwb3N0U3RyICE9IG51bGwpCi0JCQkJc291cmNlLmFwcGVuZChwb3N0U3RyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSAmJiAhaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBQcmltaXRpdmVWYWx1ZUZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBQcmltaXRpdmVWYWx1ZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUkdCRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9SR0JGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY5MDlkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9SR0JGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSR0JGb3JtYXR0ZXIgZXh0ZW5kcyBGdW5jdGlvbkZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSR0JGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlSR0JGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGdW5jKCkgewotCQlyZXR1cm4gInJnYigiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBSR0JGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgUkdCRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUmVjdEZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUmVjdEZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2VjODMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1JlY3RGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWN0Rm9ybWF0dGVyIGV4dGVuZHMgRnVuY3Rpb25Gb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVjdEZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVJlY3RGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGdW5jKCkgewotCQlyZXR1cm4gInJlY3QoIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgUmVjdEZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBSZWN0Rm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVEZWNsSXRlbUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVEZWNsSXRlbUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjljMDQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVEZWNsSXRlbUZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3R5bGVEZWNsSXRlbUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZEFmdGVyQ29sb25TcGFjZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaW50IG4gPSBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QT1NUX0RFTElNKTsKLQotCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkgPiAwICYmICghcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUikgfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpKSB7Ci0JCQlpbnQgbGVuZ3RoID0gZ2V0TGFzdExpbmVMZW5ndGgobm9kZSwgc291cmNlKTsKLQkJCWludCBhcHBlbmQgPSBnZXRGaXJzdENoaWxkUmVnaW9uTGVuZ3RoKG5vZGUpOwotCQkJaWYgKGxlbmd0aCArIG4gKyBhcHBlbmQgPiBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSkgewotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0TGluZURlbGltaXRlcihub2RlKSk7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJCW4gPSAwOyAvLyBubyBzcGFjZSBpcyBuZWNlc3NhcnkKLQkJCX0KLQkJfQotCQkvLyBubyBkZWxpbWl0ZXIgY2FzZQotCQl3aGlsZSAobi0tID4gMCkKLQkJCXNvdXJjZS5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0Rmlyc3RDaGlsZFJlZ2lvbkxlbmd0aChJQ1NTTm9kZSBub2RlKSB7Ci0JCUlDU1NOb2RlIGZpcnN0Q2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGZpcnN0Q2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiAxOwotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIGZpcnN0Q2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ciA9IG5ldyBSZWdpb25JdGVyYXRvcihub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBzdGFydCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWcgPSBpdHIubmV4dCgpOwotCQkJaWYgKHJlZyAhPSBudWxsICYmIHJlZy5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpCi0JCQkJcmV0dXJuIHJlZy5nZXRUZXh0TGVuZ3RoKCk7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXRBdHRyQ2hhbmdlZChJQ1NTTm9kZSBub2RlLCBJQ1NTQXR0ciBhdHRyLCBib29sZWFuIGluc2VydCwgQXR0ckNoYW5nZUNvbnRleHQgY29udGV4dCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBidWY7Ci0KLQkJaWYgKCFJQ1NTU3R5bGVEZWNsSXRlbS5JTVBPUlRBTlQuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gYnVmOwotCi0JCS8vIGdldCByZWdpb24gdG8gcmVwbGFjZQotCQlpZiAoY29udGV4dCAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQkJCWl0LnByZXYoKTsKLQkJCQlpZiAoaXQuaGFzUHJldigpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHByZXYgPSBpdC5wcmV2KCk7Ci0JCQkJCWlmIChwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykKLQkJCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChwcmV2KTsKLQkJCQkJZWxzZQotCQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfSBlbHNlCi0JCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQl9IGVsc2UgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpIHsKLQkJCQkJY29udGV4dC5zdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCWNvbnRleHQuZW5kID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29udGV4dC5zdGFydCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpOwotCQkJCQljb250ZXh0LmVuZCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBnZW5lcmF0ZSB0ZXh0Ci0JCWlmIChpbnNlcnQgJiYgYXR0ci5nZXRWYWx1ZSgpICE9IG51bGwgJiYgYXR0ci5nZXRWYWx1ZSgpLmxlbmd0aCgpID4gMCkgewotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgYXR0ci5nZXRWYWx1ZSgpLCBidWYpOwotCQkJYnVmLmFwcGVuZChhdHRyLmdldFZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiBidWY7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JCUlDU1NOb2RlIHByZXYgPSAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA6IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCWludCBzdGFydCA9IChwcmV2ICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBwcmV2KS5nZXRFbmRPZmZzZXQoKSA6IDA7Ci0JCWludCBlbmQgPSAoY2hpbGQgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIDogMDsKLQkJaWYgKHN0YXJ0ID4gMCAmJiBzdGFydCA8IGVuZCkgewotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCS8vIGdldCBtZWFuaW5nIHJlZ2lvbnMKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IG51bGw7Ci0JCQlpZiAoZXhjZXB0Rm9yID09IG51bGwpCi0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZWxzZSB7Ci0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIGV4Y2VwdEZvciwgbnVsbCk7Ci0JCQl9Ci0JCQkvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMiwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJLy8gYmUKLQkJCQkvLyBjb21tZW50cwotCQkJfQotCQl9Ci0JCWlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkIGluc3RhbmNlb2YgSUNTU1ByaW1pdGl2ZVZhbHVlKSB7Ci0JCQlpZiAoKChJQ1NTUHJpbWl0aXZlVmFsdWUpIGNoaWxkKS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19DT01NQSkKLQkJCQl0b0FwcGVuZCA9ICIsIjsvLyROT04tTkxTLTEkCi0JCQllbHNlIGlmICgoKElDU1NQcmltaXRpdmVWYWx1ZSkgY2hpbGQpLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1NMQVNIKQotCQkJCXRvQXBwZW5kID0gIi8iOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCAmJiB0b0FwcGVuZCAhPSBudWxsICYmICF0b0FwcGVuZC5lcXVhbHMoIiwiKSAmJiAhdG9BcHBlbmQuZXF1YWxzKCIvIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAyLCBzdGd5KSk7IC8vIG11c3QgYmUKLQkJCS8vIGNvbW1lbnRzCi0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pKSB7Ci0JCQlpZiAoKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpIHsKLQkJCQlpZiAodG9BcHBlbmQgIT0gIiwiICYmIHRvQXBwZW5kICE9ICIvIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKGVuZCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJfQotCQl9IGVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCS8vIGFwcGVuZCAiIWltcG9ydGFudCIKLQkJCVN0cmluZyBwcmlvcml0eSA9ICgoSUNTU1N0eWxlRGVjbEl0ZW0pIG5vZGUpLmdldFByaW9yaXR5KCk7Ci0JCQlpZiAocHJpb3JpdHkgIT0gbnVsbCAmJiBwcmlvcml0eS5sZW5ndGgoKSA+IDApIHsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBwcmlvcml0eSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKHByaW9yaXR5KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcE5hbWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJfQotCQl9IGVsc2UgeyAvLyBnZW5lcmF0b2Ugc291cmNlCi0JCQlJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtID0gKElDU1NTdHlsZURlY2xJdGVtKSBub2RlOwotCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfTkFNRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQlzb3VyY2UuYXBwZW5kKGl0ZW0uZ2V0UHJvcGVydHlOYW1lKCkudG9VcHBlckNhc2UoKSk7Ci0JCQllbHNlCi0JCQkJc291cmNlLmFwcGVuZChpdGVtLmdldFByb3BlcnR5TmFtZSgpKTsKLQotCQkJaW50IGsgPSBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QUkVfREVMSU0pOwotCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpID4gMCAmJiAoIXByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE5vZGVUeXBlKCkgIT0gSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFKSkgewotCQkJCWludCBsZW5ndGggPSBnZXRMYXN0TGluZUxlbmd0aChub2RlLCBzb3VyY2UpOwotCQkJCWludCBhcHBlbmQgPSAxOwotCQkJCWlmIChsZW5ndGggKyBrICsgYXBwZW5kID4gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpIHsKLQkJCQkJc291cmNlLmFwcGVuZChnZXRMaW5lRGVsaW1pdGVyKG5vZGUpKTsKLQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudFN0cmluZygpKTsKLQkJCQkJayA9IDA7IC8vIG5vIHNwYWNlIGlzIG5lY2Vzc2FyeQotCQkJCX0KLQkJCX0KLQkJCS8vIG5vIGRlbGltaXRlciBjYXNlCi0JCQl3aGlsZSAoay0tID4gMCkKLQkJCQlzb3VyY2UuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQkJc291cmNlLmFwcGVuZCgiOiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoIWlzQ2xlYW51cCgpIHx8IGdldENsZWFudXBTdHJhdGVneShub2RlKS5pc0Zvcm1hdFNvdXJjZSgpKSB7Ci0JCQlhcHBlbmRBZnRlckNvbG9uU3BhY2Uobm9kZSwgc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wTmFtZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pKSB7Ci0JCQlpZiAoaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pICYmICghaXNDbGVhbnVwKCkgfHwgZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpLmlzRm9ybWF0U291cmNlKCkpKSB7Ci0JCQkJYXBwZW5kQWZ0ZXJDb2xvblNwYWNlKG5vZGUsIHNvdXJjZSk7Ci0JCQl9IGVsc2UKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXRWYWx1ZShJQ1NTTm9kZSBub2RlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvcm1hdENoaWxkcmVuKG5vZGUsIHNvdXJjZSk7Ci0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ck5hbWUgPT0gbnVsbCB8fCBhdHRyTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCWlmICghSUNTU1N0eWxlRGVjbEl0ZW0uSU1QT1JUQU5ULmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKQotCQkJcmV0dXJuIC0xOwotCi0JCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShJQ1NTU3R5bGVEZWNsSXRlbS5JTVBPUlRBTlQpOwotCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJSW5kZXhlZFJlZ2lvbiBpTm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlDb21wb3VuZFJlZ2lvbiByZWdpb25zW10gPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIG5ldyBGb3JtYXRSZWdpb24oaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBpTm9kZS5nZXRTdGFydE9mZnNldCgpKSwgZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpKTsKLQkJZm9yIChpbnQgaSA9IHJlZ2lvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5UKQotCQkJCXJldHVybiByZWdpb25zW2ldLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGlOb2RlLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgbiA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChuIDwgMCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwgJiYgZmxhdE5vZGUuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCW4gLT0gZmxhdE5vZGUuZ2V0TGVuZ3RoKCk7Ci0JCX0KLQkJaWYgKG4gPiAwKSB7Ci0JCQlTdHJpbmcgaW1wb3J0YW50ID0gKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZSkuZ2V0UHJpb3JpdHkoKTsKLQkJCWlmIChpbXBvcnRhbnQgIT0gbnVsbCAmJiBpbXBvcnRhbnQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJLy8gZmluZCBiZWZvcmUgIiFpbXBvcnRhbnQiIHBvc2l0aW9uCi0JCQkJZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpKTsKLQkJCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0LnByZXYoKTsKLQkJCQkJaWYgKGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IGZsYXROb2RlKQotCQkJCQkJYnJlYWs7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQpCi0JCQkJCQlyZXR1cm4gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBza2lwIGxhc3Qgc3BhY2UKLQkJCWZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSk7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQluIC09IHJlZ2lvbi5nZXRMZW5ndGgoKSAtIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBuOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBTdHlsZURlY2xJdGVtRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFN0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEluZGVudFN0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQljaGFyIGluZGVudENoYXIgPSAnICc7Ci0JCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJCWlmIChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJaW5kZW50Q2hhciA9ICdcdCc7Ci0JCQl9Ci0JCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCWluZGVudC5hcHBlbmQoaW5kZW50Q2hhcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZGVudC50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlRGVjbGFyYXRpb25Gb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlRGVjbGFyYXRpb25Gb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjOTI4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVEZWNsYXJhdGlvbkZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3R5bGVEZWNsYXJhdGlvbkZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0eWxlRGVjbGFyYXRpb25Gb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlDU1NOb2RlIHByZXYgPSAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA6IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCWludCBzdGFydCA9IChwcmV2ICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBwcmV2KS5nZXRFbmRPZmZzZXQoKSA6IDA7Ci0JCWludCBlbmQgPSAoY2hpbGQgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIDogMDsKLQotCQkvLyBjaGVjayBubyBjaGlsZAotCQlpZiAoY2hpbGQgPT0gbnVsbCAmJiBwcmV2ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHN0YXJ0ID4gMCAmJiBzdGFydCA8IGVuZCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJQ1NTTW9kZWwgY3NzTW9kZWwgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQkJLy8gQlVHMjAyNjE1IC0gaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBhIHN0eWxlIGRlY2xhcmF0aW9uIHdpdGggbm8KLQkJCS8vIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCBpdAotCQkJaWYgKGNzc01vZGVsICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGNzc01vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQkvLyBnZXQgbWVhbmluZyByZWdpb25zCi0JCQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IG51bGw7Ci0JCQkJCWlmIChleGNlcHRGb3IgPT0gbnVsbCkKLQkJCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCQkJZWxzZSB7Ci0JCQkJCQlTdHJpbmcgcGlja3VwVHlwZSA9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVI7Ci0JCQkJCQlpZiAocHJldiA9PSBudWxsIHx8IGNoaWxkID09IG51bGwpCi0JCQkJCQkJcGlja3VwVHlwZSA9IG51bGw7Ci0JCQkJCQlyZWdpb25zID0gZ2V0UmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgZXhjZXB0Rm9yLCBwaWNrdXBUeXBlKTsKLQkJCQkJfQotCQkJCQkvLyBleHRyYWN0IHNvdXJjZQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkJCS8vIGJlIGNvbW1lbnRzCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJldiAhPSBudWxsICYmIGNoaWxkICE9IG51bGwpIHsgLy8gZ2VuZXJhdGUgc291cmNlIDoKLQkJCS8vIGJldHdlZW4gdHdvIGRlY2xhcmF0aW9ucwotCQkJLy8gQlVHOTMwMzctcHJvcGVydGllcyB2aWV3IGFkZHMgZXh0cmEgOyB3aGVuIGFkZCBuZXcgcHJvcGVydHkKLQkJCWJvb2xlYW4gc2VtaWNvbG9uRm91bmQgPSBmYWxzZTsKLQotCQkJSUNTU01vZGVsIGNzc01vZGVsID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJCS8vIEJVRzIwMjYxNSAtIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSBzdHlsZSBkZWNsYXJhdGlvbiB3aXRoIG5vCi0JCQkvLyBtb2RlbCBhc3NvY2lhdGVkIHdpdGggaXQKLQkJCWlmIChjc3NNb2RlbCAhPSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBjc3NNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJaW50IHByZXZTdGFydCA9IChwcmV2ICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBwcmV2KS5nZXRTdGFydE9mZnNldCgpIDogMDsKLQkJCQkJaW50IHByZXZFbmQgPSAocHJldiAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgcHJldikuZ2V0RW5kT2Zmc2V0KCkgOiAwOwotCQkJCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihwcmV2U3RhcnQsIHByZXZFbmQgLSBwcmV2U3RhcnQpLCBzdGd5KTsKLQkJCQkJaW50IGkgPSByZWdpb25zLmxlbmd0aCAtIDE7Ci0JCQkJCXdoaWxlIChpID49IDAgJiYgIXNlbWljb2xvbkZvdW5kKSB7Ci0JCQkJCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikKLQkJCQkJCQlzZW1pY29sb25Gb3VuZCA9IHRydWU7Ci0JCQkJCQktLWk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIXNlbWljb2xvbkZvdW5kKQotCQkJCXNvdXJjZS5hcHBlbmQoIjsiKTsvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocHJldiA9PSBudWxsKSB7IC8vIGdlbmVyYXRlIHNvdXJjZSA6IGJlZm9yZSB0aGUgZmlyc3QKLQkJCS8vIGRlY2xhcmF0aW9uCi0JCQlvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvciBpdCA9IG51bGw7Ci0JCQlpZiAoZW5kID4gMCkgewotCQkJCUlDU1NNb2RlbCBjc3NNb2RlbCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCk7Ci0JCQkJLy8gQlVHMjAyNjE1IC0gaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBhIHN0eWxlIGRlY2xhcmF0aW9uIHdpdGgKLQkJCQkvLyBubyBtb2RlbCBhc3NvY2lhdGVkIHdpdGggaXQKLQkJCQlpZiAoY3NzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGNzc01vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJCWl0ID0gbmV3IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yKHN0cnVjdHVyZWREb2N1bWVudCwgZW5kIC0gMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWludCBwb3MgPSBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJCQlpZiAocG9zID49IDApIHsKLQkJCQkJSUNTU01vZGVsIGNzc01vZGVsID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJCQkJLy8gQlVHMjAyNjE1IC0gaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBhIHN0eWxlIGRlY2xhcmF0aW9uCi0JCQkJCS8vIHdpdGggbm8gbW9kZWwgYXNzb2NpYXRlZCB3aXRoIGl0Ci0JCQkJCWlmIChjc3NNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGNzc01vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJaXQgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3Ioc3RydWN0dXJlZERvY3VtZW50LCBwb3MgLSAxKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChpdCAhPSBudWxsKSB7Ci0JCQkJaW50IGxpbWl0ID0gKChJbmRleGVkUmVnaW9uKSAoKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpID8gbm9kZS5nZXRQYXJlbnROb2RlKCkgOiBub2RlKSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIGN1clJlZyA9IGl0LnByZXYoKTsKLQkJCQkJaWYgKGN1clJlZy5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCBjdXJSZWcuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpCi0JCQkJCQlicmVhazsKLQkJCQkJaWYgKGN1clJlZy5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYgY3VyUmVnLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJc291cmNlLmFwcGVuZCgiOyIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmIChpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChjdXJSZWcpIDw9IGxpbWl0KQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGNoaWxkID09IG51bGwpIHsgLy8gZ2VuZXJhdGUgc291cmNlIDogYWZ0ZXIgdGhlIGxhc3QKLQkJCS8vIGRlY2xhcmF0aW9uCi0JCQlvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvciBpdCA9IG51bGw7Ci0JCQlpZiAoc3RhcnQgPiAwKSB7Ci0JCQkJSUNTU01vZGVsIGNzc01vZGVsID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJCQkvLyBCVUcyMDI2MTUgLSBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgc3R5bGUgZGVjbGFyYXRpb24gd2l0aAotCQkJCS8vIG5vIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCBpdAotCQkJCWlmIChjc3NNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gY3NzTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQkJaXQgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3Ioc3RydWN0dXJlZERvY3VtZW50LCBzdGFydCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWludCBwb3MgPSBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJCQlpZiAocG9zID49IDApIHsKLQkJCQkJSUNTU01vZGVsIGNzc01vZGVsID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJCQkJLy8gQlVHMjAyNjE1IC0gaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBhIHN0eWxlIGRlY2xhcmF0aW9uCi0JCQkJCS8vIHdpdGggbm8gbW9kZWwgYXNzb2NpYXRlZCB3aXRoIGl0Ci0JCQkJCWlmIChjc3NNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGNzc01vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJaXQgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3Ioc3RydWN0dXJlZERvY3VtZW50LCBwb3MpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGl0ICE9IG51bGwpIHsKLQkJCQlpbnQgbGltaXQgPSAoKEluZGV4ZWRSZWdpb24pICgobm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkgPyBub2RlLmdldFBhcmVudE5vZGUoKSA6IG5vZGUpKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIGN1clJlZyA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKGN1clJlZy5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCBjdXJSZWcuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpCi0JCQkJCQlicmVhazsKLQkJCQkJaWYgKGN1clJlZy5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYgY3VyUmVnLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJLy8gQnVnIDIxOTAwNCAtIEJlZm9yZSBhcHBlbmRpbmcgYSA7LCBtYWtlIHN1cmUgdGhhdCB0aGVyZQotCQkJCQkJLy8gaXNuJ3Qgb25lIGFscmVhZHkKLQkJCQkJCWJvb2xlYW4gc2VtaWNvbG9uRm91bmQgPSBmYWxzZTsKLQkJCQkJCXdoaWxlKGl0Lmhhc05leHQoKSAmJiAhc2VtaWNvbG9uRm91bmQpIHsKLQkJCQkJCQlpZihpdC5uZXh0KCkuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpCi0JCQkJCQkJCXNlbWljb2xvbkZvdW5kID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJaWYoIXNlbWljb2xvbkZvdW5kKQotCQkJCQkJCXNvdXJjZS5hcHBlbmQoIjsiKTsvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAobGltaXQgPD0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGN1clJlZykpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCWlmICgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIDw9IDApIHsKLQkJCQkvLyBnZXQgbmV4dCByZWdpb24KLQkJCQlpbnQgcG9zID0gZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCQkJQ29tcG91bmRSZWdpb24gdG9BcHBlbmRSZWdpb24gPSBudWxsOwotCQkJCWlmIChwb3MgPj0gMCkgewotCQkJCQlJQ1NTTW9kZWwgY3NzTW9kZWwgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQkJCQkvLyBCVUcyMDI2MTUgLSBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgc3R5bGUgZGVjbGFyYXRpb24KLQkJCQkJLy8gd2l0aCBubyBtb2RlbCBhc3NvY2lhdGVkIHdpdGggaXQKLQkJCQkJaWYgKGNzc01vZGVsICE9IG51bGwpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gY3NzTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHBvcyk7Ci0JCQkJCQkJdG9BcHBlbmRSZWdpb24gPSBuZXcgQ29tcG91bmRSZWdpb24oZmxhdE5vZGUsIGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHBvcykpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCB0b0FwcGVuZFJlZ2lvbiwgc291cmNlKTsKLQkJCX0KLQkJfSBlbHNlIGlmICgocHJldiAhPSBudWxsIHx8ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkpIHsKLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQkJaWYgKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUpICYmIChub2RlLmdldE93bmVyRG9jdW1lbnQoKSAhPSBub2RlIHx8ICFwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSKSkpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCWVsc2UgaWYgKHByZXYgIT0gbnVsbCB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKSAhPSBub2RlKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlDU1NNb2RlbCBjc3NNb2RlbCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCk7Ci0JCS8vIEJVRzIwMjYxNSAtIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSBzdHlsZSBkZWNsYXJhdGlvbgotCQkvLyB3aXRoIG5vIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCBpdAotCQlpZiAoY3NzTW9kZWwgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBjc3NNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQkJCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gYmUKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjb21tZW50cwotCQkJCX0KLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pKSB7Ci0JCQkJCWlmICgoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpID09IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAmJiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfT05FX1BFUl9MSU5FKSAmJiAobm9kZS5nZXRPd25lckRvY3VtZW50KCkgIT0gbm9kZSB8fCAhcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUikpKSB7Ci0JCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJCQl9IGVsc2UKLQkJCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENoaWxkSW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJaW50IHBvcyA9IHN1cGVyLmdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlpZiAocG9zIDwgMCkgewotCQkJQ1NTU291cmNlR2VuZXJhdG9yIGZvcm1hdHRlciA9IGdldFBhcmVudEZvcm1hdHRlcihub2RlKTsKLQkJCXJldHVybiAoZm9ybWF0dGVyICE9IG51bGwpID8gZm9ybWF0dGVyLmdldENoaWxkSW5zZXJ0UG9zKG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSA6IC0xOwotCQl9Ci0JCXJldHVybiBwb3M7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgU3R5bGVEZWNsYXJhdGlvbkZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBTdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoVG9SZWZvcm1hdEFmdGVyKElDU1NOb2RlIG5vZGUsIGludCBpbnNlcnRQb3MpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlJbmRleGVkUmVnaW9uIG5ub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpbnNlcnRQb3MgPCAwIHx8ICFubm9kZS5jb250YWlucyhpbnNlcnRQb3MpKSB7Ci0JCQlpZiAobm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCAmJiBubm9kZS5nZXRFbmRPZmZzZXQoKSA8PSAwKSB7Ci0JCQkJQ1NTU291cmNlR2VuZXJhdG9yIHBudEZvcm1hdHRlciA9IGdldFBhcmVudEZvcm1hdHRlcihub2RlKTsKLQkJCQlpZiAocG50Rm9ybWF0dGVyICE9IG51bGwpCi0JCQkJCXJldHVybiBwbnRGb3JtYXR0ZXIuZ2V0TGVuZ3RoVG9SZWZvcm1hdEFmdGVyKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBpbnNlcnRQb3MpOwotCQkJfQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldExlbmd0aFRvUmVmb3JtYXRBZnRlcihub2RlLCBpbnNlcnRQb3MpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGhUb1JlZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIGludCBpbnNlcnRQb3MpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlJbmRleGVkUmVnaW9uIG5ub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpbnNlcnRQb3MgPD0gMCB8fCAhbm5vZGUuY29udGFpbnMoaW5zZXJ0UG9zIC0gMSkpIHsKLQkJCWlmIChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsICYmIG5ub2RlLmdldEVuZE9mZnNldCgpIDw9IDApIHsKLQkJCQlDU1NTb3VyY2VHZW5lcmF0b3IgcG50Rm9ybWF0dGVyID0gZ2V0UGFyZW50Rm9ybWF0dGVyKG5vZGUpOwotCQkJCWlmIChwbnRGb3JtYXR0ZXIgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIHBudEZvcm1hdHRlci5nZXRMZW5ndGhUb1JlZm9ybWF0QmVmb3JlKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBpbnNlcnRQb3MpOwotCQkJfQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldExlbmd0aFRvUmVmb3JtYXRCZWZvcmUobm9kZSwgaW5zZXJ0UG9zKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVSdWxlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZVJ1bGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNhOThiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZVJ1bGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZVJ1bGVGb3JtYXR0ZXIgZXh0ZW5kcyBEZWNsQ29udGFpbmVyRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0eWxlUnVsZUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0eWxlUnVsZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdEF0dHJDaGFuZ2VkKElDU1NOb2RlIG5vZGUsIElDU1NBdHRyIGF0dHIsIGJvb2xlYW4gaW5zZXJ0LCBBdHRyQ2hhbmdlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQlpZiAoIUlDU1NTdHlsZVJ1bGUuU0VMRUNUT1IuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gYnVmOwotCi0JCS8vIGdldCByZWdpb24gdG8gcmVwbGFjZQotCQlpZiAoY29udGV4dCAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCQlpdC5uZXh0KCk7Ci0JCQkJaWYgKGl0Lmhhc05leHQoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBuZXh0ID0gaXQubmV4dCgpOwotCQkJCQlpZiAobmV4dC5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpCi0JCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuZXh0KTsKLQkJCQkJZWxzZQotCQkJCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQljb250ZXh0LmVuZCA9IGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY29udGV4dC5zdGFydCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpOwotCQkJCQljb250ZXh0LmVuZCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBnZW5lcmF0ZSB0ZXh0Ci0JCWlmIChpbnNlcnQpIHsKLQkJCWJ1Zi5hcHBlbmQoYXR0ci5nZXRWYWx1ZSgpKTsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICIiLCBidWYpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gYnVmOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IChub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kU3BhY2VCZXR3ZWVuKG5vZGUsIHJlZ2lvbnNbaSAtIDFdLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkU2VsZWN0b3JSZWdpb24ocmVnaW9uc1tpXSwgKGkgIT0gMCkgPyByZWdpb25zW2kgLSAxXSA6IG51bGwsIHN0Z3kpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlTdHJpbmcgc3RyID0gKChJQ1NTU3R5bGVSdWxlKSBub2RlKS5nZXRTZWxlY3RvclRleHQoKTsKLQkJCS8vIGFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsc3RyLHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAieyIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCQkJc291cmNlLmFwcGVuZCgieyIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJldHdlZW4obm9kZSwgKGkgPT0gMCkgPyBvdXRzaWRlWzBdIDogcmVnaW9uc1tpIC0gMV0sIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFNlbGVjdG9yUmVnaW9uKHJlZ2lvbnNbaV0sIChpICE9IDApID8gcmVnaW9uc1tpIC0gMV0gOiBudWxsLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pKSB7Ci0JCQlpZiAoaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQllbHNlCi0JCQkJYXBwZW5kU3BhY2VCZXR3ZWVuKG5vZGUsIHJlZ2lvbnNbcmVnaW9ucy5sZW5ndGggLSAxXSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0ckluc2VydFBvcyhJQ1NTTm9kZSBub2RlLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyTmFtZSA9PSBudWxsIHx8IGF0dHJOYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJaWYgKCFJQ1NTU3R5bGVSdWxlLlNFTEVDVE9SLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKQotCQkJcmV0dXJuIC0xOwotCi0JCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShJQ1NTU3R5bGVSdWxlLlNFTEVDVE9SKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkKLQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWVsc2UKLQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgU3R5bGVSdWxlRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFN0eWxlUnVsZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVTaGVldEZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVTaGVldEZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDgzY2FhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1N0eWxlU2hlZXRGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVTaGVldEZvcm1hdHRlciBleHRlbmRzIEFic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0eWxlU2hlZXRGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHlsZVNoZWV0Rm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlLCBJUmVnaW9uIGV4Y2VwdEZvcikgewotCQlTdHJpbmcgZGVsaW0gPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUpOwotCQlJQ1NTTm9kZSBwcmV2ID0gKGNoaWxkICE9IG51bGwpID8gY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkgOiBub2RlLmdldExhc3RDaGlsZCgpOwotCQlpZiAocHJldiA9PSBudWxsICYmIGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBzdGFydCA9IChwcmV2ICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBwcmV2KS5nZXRFbmRPZmZzZXQoKSA6IDA7Ci0JCWludCBlbmQgPSAoY2hpbGQgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIDogMDsKLQkJaWYgKHN0YXJ0ID4gMCAmJiBzdGFydCA8IGVuZCkgewotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCS8vIGdldCBtZWFuaW5nIHJlZ2lvbnMKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IG51bGw7Ci0JCQlpZiAoZXhjZXB0Rm9yID09IG51bGwpCi0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIHBpY2t1cFR5cGUgPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSOwotCQkJCWlmIChwcmV2ID09IG51bGwpCi0JCQkJCXBpY2t1cFR5cGUgPSBudWxsOwotCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBleGNlcHRGb3IsIHBpY2t1cFR5cGUpOwotCQkJfQotCQkJLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlpZiAocHJldiAhPSBudWxsKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgKHJlZ2lvbnMubGVuZ3RoID4gMCkgPyByZWdpb25zWzBdIDogbnVsbCwgc291cmNlKTsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJCQkJCQkJCQkJCQkJCQkvLyBiZQotCQkJCQkJCQkJCQkJCQkJCQkJLy8gY29tbWVudHMKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIG9yCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBzZW1pX2NvbG9uCi0JCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIpIHsKLQkJCQkJLy8gYXBwZW5kIGRlbGltIGFmdGVyCi0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHByZXYgIT0gbnVsbCkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQl9Ci0JCWVsc2UgaWYgKHByZXYgIT0gbnVsbCAmJiBjaGlsZCAhPSBudWxsKSB7IC8vIHNvdXJjZSBnZW5lcmF0aW9uIDoKLQkJCQkJCQkJCQkJCQkvLyBiZXR3ZWVuIHR3byBydWxlcwotCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJfQotCQllbHNlIGlmICgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJaWYgKHByZXYgPT0gbnVsbCkgeyAvLyBzb3VyY2UgZm9ybWF0dGluZyA6IGJlZm9yZSB0aGUgZmlyc3QgcnVsZQotCQkJCUlDU1NOb2RlIG5leHQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWludCBwb3MgPSBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJCQlpZiAobmV4dCAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbmV4dCkuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJCQlwb3MgPSAoKEluZGV4ZWRSZWdpb24pIG5leHQpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaWYgKHBvcyAhPSAwKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJQ29tcG91bmRSZWdpb25bXSBwcmV2UmVnaW9ucyA9IGdldFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKDAsIHBvcyksIG51bGwsIG51bGwpOwotCQkJCQlpZiAocHJldlJlZ2lvbnMgIT0gbnVsbCAmJiBwcmV2UmVnaW9ucy5sZW5ndGggPiAwKQotCQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChjaGlsZCA9PSBudWxsKSB7IC8vIHNvdXJjZSBmb3JtYXR0aW5nIDogYWZ0ZXIgdGhlIGxhc3QKLQkJCQkJCQkJCQkvLyBydWxlCi0JCQkJaWYgKHN0YXJ0ID4gMCAmJiBzdGFydCA8PSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpKSB7Ci0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHN0YXJ0IDw9IDApIHsKLQkJCQkJaW50IHBvcyA9IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQkJCQlpZiAocG9zIDwgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSkgewotCQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiByZWdpb24sIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0IGJlCi0JCQkJCQkJCQkJCQkJCQkJCS8vIGNvbW1lbnRzCi0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pKSB7Ci0JCQlpZiAoKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gKG5vZGUuZ2V0TGFzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7Ci0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJCX0KLQkJCWlmICgocmVnaW9ucyAhPSBudWxsICYmIHJlZ2lvbnMubGVuZ3RoID4gMCAmJiByZWdpb25zW3JlZ2lvbnMubGVuZ3RoIC0gMV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DREMpIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJfQotCQllbHNlIHsgLy8gc291cmNlIGdlbmVyYXRpb24KLQkJCWlmIChub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpICE9IG51bGwgJiYgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJcmV0dXJuOyAvLyBub3RoaW5nCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlIG5vZGUsIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IChub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwKSB7Ci0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwIHx8IHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DRE8gfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkKLQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCQl9Ci0JCQlpZiAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmIChzb3VyY2UubGVuZ3RoKCkgPiAwIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpICE9IG51bGwgJiYgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkgewotCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCS8vIHNvdXJjZS5hcHBlbmQoIjwhLS0iKTsKLQkJCS8vIGFwcGVuZERlbGltQmVmb3JlKG5vZGUsbnVsbCwgc291cmNlKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm47IC8vIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pIHx8IHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DRE8gfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSkgewotCQkJaWYgKGlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkgewotCQkJCWlmIChzb3VyY2UubGVuZ3RoKCkgPiAwIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpIHsKLQkJCQkJU3RyaW5nIGRlbGltID0gZ2V0TGluZURlbGltaXRlcihub2RlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZyA9IGl0LnByZXYoKTsKLQkJCQlpZiAocmVnLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RDKQotCQkJCQlyZXR1cm4gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnKTsKLQkJCX0KLQkJCXJldHVybiBuOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBTdHlsZVNoZWV0Rm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFN0eWxlU2hlZXRGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1Vua25vd25SdWxlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Vbmtub3duUnVsZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWFiZWY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1Vua25vd25SdWxlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NVbmtub3duUnVsZTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVW5rbm93blJ1bGVGb3JtYXR0ZXIgZXh0ZW5kcyBEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFVua25vd25SdWxlRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JVW5rbm93blJ1bGVGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlDU1NVbmtub3duUnVsZSBydWxlID0gKENTU1Vua25vd25SdWxlKSBub2RlOwotCQkJc291cmNlLmFwcGVuZChydWxlLmdldENzc1RleHQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgIWlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgVW5rbm93blJ1bGVGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgVW5rbm93blJ1bGVGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ2F0ZWdvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJhYzE0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotcHVibGljIGludGVyZmFjZSBDU1NNTUNhdGVnb3J5IGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCVN0cmluZyBnZXRDYXB0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUNoYXJzZXRSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUNoYXJzZXRSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NmQ0NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1DaGFyc2V0UnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NQ2hhcnNldFJ1bGUgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWRiNWQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1Db250YWluZXIgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4Nzk3OTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1EZXNjcmlwdG9yIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCUl0ZXJhdG9yIGdldFZhbHVlcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Gb250RmFjZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRm9udEZhY2VSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlOGRmZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Gb250RmFjZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTUZvbnRGYWNlUnVsZSBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1GdW5jdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1GdW5jdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmU3MDZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRnVuY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTUZ1bmN0aW9uIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCVN0cmluZyBnZXRGdW5jdGlvblN0cmluZygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1JbXBvcnRSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUltcG9ydFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZiZDJhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUltcG9ydFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTUltcG9ydFJ1bGUgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NS2V5d29yZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1LZXl3b3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwODM3ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1LZXl3b3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1LZXl3b3JkIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCVN0cmluZyBnZXRLZXl3b3JkU3RyaW5nKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTU1lZGlhUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1NZWRpYVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE2YjdkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTU1lZGlhUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NTWVkaWFSdWxlIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmE1ODY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NTm9kZSB7Ci0JU3RyaW5nIGdldFR5cGUoKTsKLQotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCVN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpOwotCi0JSXRlcmF0b3IgZ2V0Q2hpbGROb2RlcygpOwotCi0JSXRlcmF0b3IgZ2V0RGVzY2VuZGFudHMoKTsKLQotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBfUFJFRklYID0gIkNTU01NLiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfS0VZV09SRCA9IF9QUkVGSVggKyAiS2V5d29yZCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfVU5JVCA9IF9QUkVGSVggKyAiVW5pdCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRlVOQ1RJT04gPSBfUFJFRklYICsgIkZ1bmN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9TVFJJTkcgPSBfUFJFRklYICsgIlN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU1RZTEVfU0hFRVQgPSBfUFJFRklYICsgIlN0eWxlU2hlZXQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1BST1BFUlRZID0gX1BSRUZJWCArICJQcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfREVTQ1JJUFRPUiA9IF9QUkVGSVggKyAiRGVzY3JpcHRvciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQ09OVEFJTkVSID0gX1BSRUZJWCArICJDb250YWluZXIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX05VTUJFUiA9IF9QUkVGSVggKyAiTnVtYmVyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9TRVBBUkFUT1IgPSBfUFJFRklYICsgIlNlcGFyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQ0hBUlNFVF9SVUxFID0gX1BSRUZJWCArICJDaGFyc2V0UnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfSU1QT1JUX1JVTEUgPSBfUFJFRklYICsgIkltcG9ydFJ1bGUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1NUWUxFX1JVTEUgPSBfUFJFRklYICsgIlN0eWxlUnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUVESUFfUlVMRSA9IF9QUkVGSVggKyAiTWVkaWFSdWxlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9QQUdFX1JVTEUgPSBfUFJFRklYICsgIlBhZ2VSdWxlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9GT05UX0ZBQ0VfUlVMRSA9IF9QUkVGSVggKyAiRm9udEZhY2VSdWxlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9DQVRFR09SWSA9IF9QUkVGSVggKyAiQ2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX01FVEFfTU9ERUwgPSBfUFJFRklYICsgIk1ldGFNb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU0VMRUNUT1IgPSBfUFJFRklYICsgIlNlbGVjdG9yIjsgLy8kTk9OLU5MUy0xJAkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NTnVtYmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTU51bWJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2MwZjU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NTnVtYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1OdW1iZXIgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NUGFnZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NUGFnZVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdhMDg0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVBhZ2VSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1QYWdlUnVsZSBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Qcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Qcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTJmNzI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGludGVyZmFjZSBDU1NNTVByb3BlcnR5IGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCVN0cmluZyBnZXRDYXRlZ29yeU5hbWUoKTsKLQotCUl0ZXJhdG9yIGdldFZhbHVlcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TZWxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDNiYmNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NU2VsZWN0b3IgZXh0ZW5kcyBDU1NNTU5vZGUgewotCVN0cmluZyBnZXRTZWxlY3RvclR5cGUoKTsKLQotCVN0cmluZyBnZXRTZWxlY3RvclN0cmluZygpOwotCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRVhQUkVTU0lPTiA9ICJFeHByZXNzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9QU0VVRE9fQ0xBU1MgPSAiUHNldWRvQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1BTRVVET19FTEVNRU5UID0gIlBzZXVkb0VsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBlbWJlZGRlZCBleHByZXNzaW9uIHR5cGUKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fREVTQ0VOREFOVCA9ICJkZXNjZW5kYW50IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTl9DSElMRCA9ICJjaGlsZCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fQURKQUNFTlQgPSAiYWRqYWNlbnQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OX1VOSVZFUlNBTCA9ICJ1bml2ZXJzYWwiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OX0FUVFJJQlVURSA9ICJhdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVN0cmluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4Mzc0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVN0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NU3RyaW5nIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHlsZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU3R5bGVSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZDc0OWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHlsZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTVN0eWxlUnVsZSBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHlsZVNoZWV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVN0eWxlU2hlZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4YjJhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVN0eWxlU2hlZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTVN0eWxlU2hlZXQgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NVW5pdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Vbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0N2QxMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Vbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1Vbml0IGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCVN0cmluZyBnZXRVbml0U3RyaW5nKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNZXRhTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01ldGFNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzcwNDhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01ldGFNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01ldGFNb2RlbCBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQkvLyBwdWJsaWMgaW50ZXJmYWNlIENTU01ldGFNb2RlbCB7Ci0JQ1NTTU1TdHlsZVNoZWV0IGdldFN0eWxlU2hlZXQoKTsKLQotCS8qCi0JICogU2hvcnRjdXQgdG8gYWNjZXNzIHByb3BlcnR5IG5vZGUKLQkgKi8KLQkvLyBJdGVyYXRvciBnZXRQcm9wZXJ0aWVzKCk7Ci0JLy8gSXRlcmF0b3IgZ2V0RGVzY3JpcHRvcnMoKTsKLQkvLyBDU1NNTVByb3BlcnR5IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCS8qCi0JICogYWNjZXNzIHRvIGNhdGVnb3J5IGluZm9ybWF0aW9uCi0JICovCi0JSXRlcmF0b3IgZ2V0Q2F0ZWdvcmllcygpOwotCi0JLyoKLQkgKiBVdGlsaXRpZXMKLQkgKi8KLQkvLyBJdGVyYXRvciBjb2xsZWN0Tm9kZXNCeVR5cGUoU3RyaW5nIHR5cGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTUHJvZmlsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTUHJvZmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmRjOWZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU1Byb2ZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU1Byb2ZpbGUgewotCi0JU3RyaW5nIGdldFByb2ZpbGVJRCgpOwotCi0JU3RyaW5nIGdldFByb2ZpbGVOYW1lKCk7Ci0KLQlVUkwgZ2V0UHJvZmlsZVVSTCgpOwotCi0JQ1NTTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpOwotCi0JYm9vbGVhbiBpc0RlZmF1bHQoKTsKLQotCVN0cmluZyBnZXRPd25lclBsdWdpbklEKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NQcm9maWxlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU1Byb2ZpbGVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDAwY2IzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU1Byb2ZpbGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGwuUmVnaXN0cnlSZWFkZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ1NTUHJvZmlsZVJlZ2lzdHJ5IHsKLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDU1NQcm9maWxlUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENTU1Byb2ZpbGVSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldFByb2ZpbGVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihmUHJvZmlsZXMudmFsdWVzKCkpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIENTU1Byb2ZpbGUgZ2V0UHJvZmlsZShTdHJpbmcgcHJvZmlsZUlEKSB7Ci0JCXJldHVybiAoQ1NTUHJvZmlsZSkgZlByb2ZpbGVzLmdldChwcm9maWxlSUQpOwotCX0KLQotCXB1YmxpYyBDU1NQcm9maWxlIGdldERlZmF1bHRQcm9maWxlKCkgewotCQlJdGVyYXRvciBpID0gZ2V0UHJvZmlsZXMoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDU1NQcm9maWxlIHByb2ZpbGUgPSAoQ1NTUHJvZmlsZSkgaS5uZXh0KCk7Ci0JCQlpZiAocHJvZmlsZS5pc0RlZmF1bHQoKSkgewotCQkJCXJldHVybiBwcm9maWxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDU1NQcm9maWxlUmVnaXN0cnkuCi0JICovCi0JcHJpdmF0ZSBDU1NQcm9maWxlUmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZQcm9maWxlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCUl0ZXJhdG9yIGkgPSBuZXcgUmVnaXN0cnlSZWFkZXIoKS5lbnVtUHJvZmlsZXMoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgcHJvZmlsZSA9IGkubmV4dCgpOwotCQkJaWYgKHByb2ZpbGUgaW5zdGFuY2VvZiBDU1NQcm9maWxlKSB7Ci0JCQkJZlByb2ZpbGVzLnB1dCgoKENTU1Byb2ZpbGUpIHByb2ZpbGUpLmdldFByb2ZpbGVJRCgpLCBwcm9maWxlKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTUHJvZmlsZVJlZ2lzdHJ5IGZJbnN0YW5jZSA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgZlByb2ZpbGVzID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTRnVuY3Rpb25JRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NGdW5jdGlvbklELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNGUxNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NGdW5jdGlvbklELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU0Z1bmN0aW9uSUQgewotCi0JZmluYWwgc3RhdGljIFN0cmluZyBGX0FUVFIgPSAiYXR0ciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZfQ09VTlRFUiA9ICJjb3VudGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRl9SR0IgPSAicmdiIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRl9SRUNUID0gInJlY3QiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGX1VSSSA9ICJ1cmkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGX0ZPUk1BVCA9ICJmb3JtYXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGX0xPQ0FMID0gImxvY2FsIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NLZXl3b3JkSUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTS2V5d29yZElELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4Zjg5OGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NLZXl3b3JkSUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU0tleXdvcmRJRCB7Ci0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfMTAwID0gIjEwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfMjAwID0gIjIwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfMzAwID0gIjMwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfNDAwID0gIjQwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfNTAwID0gIjUwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfNjAwID0gIjYwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfNzAwID0gIjcwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfODAwID0gIjgwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfOTAwID0gIjkwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQUJPVkUgPSAiYWJvdmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FCU09MVVRFID0gImFic29sdXRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19BQ1RJVkVCT1JERVIgPSAiQWN0aXZlQm9yZGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19BQ1RJVkVDQVBUSU9OID0gIkFjdGl2ZUNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FMTCA9ICJhbGwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FMV0FZUyA9ICJhbHdheXMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FQUFdPUktTUEFDRSA9ICJBcHBXb3Jrc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FRVUEgPSAiYXF1YSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQVJNRU5JQU4gPSAiYXJtZW5pYW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FVVE8gPSAiYXV0byI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQVZPSUQgPSAiYXZvaWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JBQ0tHUk9VTkQgPSAiQmFja2dyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkFTRUxJTkUgPSAiYmFzZWxpbmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JFSElORCA9ICJiZWhpbmQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JFTE9XID0gImJlbG93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CSURJX09WRVJSSURFID0gImJpZGktb3ZlcnJpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JMQUNLID0gImJsYWNrIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CTElOSyA9ICJibGluayI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkxPQ0sgPSAiYmxvY2siOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JMVUUgPSAiYmx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQk9MRCA9ICJib2xkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CT0xERVIgPSAiYm9sZGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CT1RIID0gImJvdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JPVFRPTSA9ICJib3R0b20iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JVVFRPTkZBQ0UgPSAiQnV0dG9uRmFjZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQlVUVE9OSElHSExJR0hUID0gIkJ1dHRvbkhpZ2hsaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQlVUVE9OU0hBRE9XID0gIkJ1dHRvblNoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQlVUVE9OVEVYVCA9ICJCdXR0b25UZXh0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DQVBJVEFMSVpFID0gImNhcGl0YWxpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NBUFRJT04gPSAiY2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0FQVElPTlRFWFQgPSAiQ2FwdGlvblRleHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NFTlRFUiA9ICJjZW50ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NFTlRFUl9MRUZUID0gImNlbnRlci1sZWZ0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DRU5URVJfUklHSFQgPSAiY2VudGVyLXJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DSElMRCA9ICJjaGlsZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0lSQ0xFID0gImNpcmNsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0pLX0lERU9HUkFQSElDID0gImNqay1pZGVvZ3JhcGhpYyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0xPU0VfUVVPVEUgPSAiY2xvc2UtcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NPREUgPSAiY29kZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ09OREVOU0VEID0gImNvbmRlbnNlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ09MTEFQU0UgPSAiY29sbGFwc2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NPTVBBQ1QgPSAiY29tcGFjdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ09OVElOVU9VUyA9ICJjb250aW51b3VzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DUk9QID0gImNyb3AiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NST1NTID0gImNyb3NzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DUk9TU0hBSVIgPSAiY3Jvc3NoYWlyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DVVJTSVZFID0gImN1cnNpdmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0RBU0hFRCA9ICJkYXNoZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0RFQ0lNQUwgPSAiZGVjaW1hbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfREVDSU1BTF9MRUFESU5HX1pFUk8gPSAiZGVjaW1hbC1sZWFkaW5nLXplcm8iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0RFRkFVTFQgPSAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRElHSVRTID0gImRpZ2l0cyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRElTQyA9ICJkaXNjIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ET1RURUQgPSAiZG90dGVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ET1VCTEUgPSAiZG91YmxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19FX1JFU0laRSA9ICJlLXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRU1CRUQgPSAiZW1iZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0VYUEFOREVEID0gImV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19FWFRSQV9DT05ERU5TRUQgPSAiZXh0cmEtY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19FWFRSQV9FWFBBTkRFRCA9ICJleHRyYS1leHBhbmRlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRkFOVEFTWSA9ICJmYW50YXN5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GQVJfTEVGVCA9ICJmYXItbGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRkFSX1JJR0hUID0gImZhci1yaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRkFTVCA9ICJmYXN0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GQVNURVIgPSAiZmFzdGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GRU1BTEUgPSAiZmVtYWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GSVhFRCA9ICJmaXhlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRlVDSFNJQSA9ICJmdWNoc2lhIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19HRU9SR0lBTiA9ICJnZW9yZ2lhbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfR1JBWSA9ICJncmF5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19HUkFZVEVYVCA9ICJHcmF5VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfR1JFRU4gPSAiZ3JlZW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0dST09WRSA9ICJncm9vdmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0hFQlJFVyA9ICJoZWJyZXciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0hFTFAgPSAiaGVscCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElEREVOID0gImhpZGRlbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElERSA9ICJoaWRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ISUdIID0gImhpZ2giOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0hJR0hMSUdIVCA9ICJIaWdobGlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0hJR0hMSUdIVFRFWFQgPSAiSGlnaGxpZ2h0VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElHSEVSID0gImhpZ2hlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElSQUdBTkEgPSAiaGlyYWdhbmEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0hJUkFHQU5BX0lST0hBID0gImhpcmFnYW5hLWlyb2hhIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JQ09OID0gImljb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lOQUNUSVZFQk9SREVSID0gIkluYWN0aXZlQm9yZGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JTkFDVElWRUNBUFRJT04gPSAiSW5hY3RpdmVDYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JTkFDVElWRUNBUFRJT05URVhUID0gIkluYWN0aXZlQ2FwdGlvblRleHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lORk9CQUNLR1JPVU5EID0gIkluZm9CYWNrZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JTkZPVEVYVCA9ICJJbmZvVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5MSU5FID0gImlubGluZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5MSU5FX1RBQkxFID0gImlubGluZS10YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5TRVQgPSAiaW5zZXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lOU0lERSA9ICJpbnNpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lOVkVSVCA9ICJpbnZlcnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lUQUxJQyA9ICJpdGFsaWMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0pVU1RJRlkgPSAianVzdGlmeSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfS0FUQUtBTkEgPSAia2F0YWthbmEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0tBVEFLQU5BX0lST0hBID0gImthdGFrYW5hLWlyb2hhIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MQU5EU0NBUEUgPSAibGFuZHNjYXBlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MQVJHRSA9ICJsYXJnZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTEFSR0VSID0gImxhcmdlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTEVGVCA9ICJsZWZ0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MRUZUX1NJREUgPSAibGVmdC1zaWRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MRUZUV0FSRFMgPSAibGVmdHdhcmRzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MRVZFTCA9ICJsZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTElHSFRFUiA9ICJsaWdodGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MSU1FID0gImxpbWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xJTkVfVEhST1VHSCA9ICJsaW5lLXRocm91Z2giOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xJU1RfSVRFTSA9ICJsaXN0LWl0ZW0iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xPVUQgPSAibG91ZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTE9XID0gImxvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTE9XRVIgPSAibG93ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xPV0VSX0FMUEhBID0gImxvd2VyLWFscGhhIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MT1dFUl9HUkVFSyA9ICJsb3dlci1ncmVlayI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTE9XRVJfTEFUSU4gPSAibG93ZXItbGF0aW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xPV0VSX1JPTUFOID0gImxvd2VyLXJvbWFuIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MT1dFUkNBU0UgPSAibG93ZXJjYXNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MVFIgPSAibHRyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19NQUxFID0gIm1hbGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01BUktFUiA9ICJtYXJrZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01BUk9PTiA9ICJtYXJvb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01FRElVTSA9ICJtZWRpdW0iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01FTlUgPSAibWVudSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUVOVVRFWFQgPSAiTWVudVRleHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01FU1NBR0VfQk9YID0gIm1lc3NhZ2UtYm94IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19NSURETEUgPSAibWlkZGxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19NSVggPSAibWl4IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19NT05PU1BBQ0UgPSAibW9ub3NwYWNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19NT1ZFID0gIm1vdmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05fUkVTSVpFID0gIm4tcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19OQVJST1dFUiA9ICJuYXJyb3dlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTkFWWSA9ICJuYXZ5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ORV9SRVNJWkUgPSAibmUtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19OT19DTE9TRV9RVU9URSA9ICJuby1jbG9zZS1xdW90ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTk9fT1BFTl9RVU9URSA9ICJuby1vcGVuLXF1b3RlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19OT19SRVBFQVQgPSAibm8tcmVwZWF0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19OT05FID0gIm5vbmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05PUk1BTCA9ICJub3JtYWwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05PV1JBUCA9ICJub3dyYXAiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05XX1JFU0laRSA9ICJudy1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX09CTElRVUUgPSAib2JsaXF1ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfT0xJVkUgPSAib2xpdmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX09OQ0UgPSAib25jZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfT1BFTl9RVU9URSA9ICJvcGVuLXF1b3RlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19PVVRTRVQgPSAib3V0c2V0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19PVVRTSURFID0gIm91dHNpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX09WRVJMSU5FID0gIm92ZXJsaW5lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19QT0lOVEVSID0gInBvaW50ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1BPUlRSQUlUID0gInBvcnRyYWl0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19QUkUgPSAicHJlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19QVVJQTEUgPSAicHVycGxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SRUQgPSAicmVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SRUxBVElWRSA9ICJyZWxhdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUkVQRUFUID0gInJlcGVhdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUkVQRUFUX1ggPSAicmVwZWF0LXgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JFUEVBVF9ZID0gInJlcGVhdC15IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SSURHRSA9ICJyaWRnZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUklHSFQgPSAicmlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JJR0hUX1NJREUgPSAicmlnaHQtc2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUklHSFRXQVJEUyA9ICJyaWdodHdhcmRzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SVEwgPSAicnRsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SVU5fSU4gPSAicnVuLWluIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TX1JFU0laRSA9ICJzLXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU0FOU19TRVJJRiA9ICJzYW5zLXNlcmlmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TQ1JPTEwgPSAic2Nyb2xsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TQ1JPTExCQVIgPSAiU2Nyb2xsYmFyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TRV9SRVNJWkUgPSAic2UtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TRU1JX0NPTkRFTlNFRCA9ICJzZW1pLWNvbmRlbnNlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU0VNSV9FWFBBTkRFRCA9ICJzZW1pLWV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TRVBBUkFURSA9ICJzZXBhcmF0ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU0VSSUYgPSAic2VyaWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NIT1cgPSAic2hvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU0lMRU5UID0gInNpbGVudCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU0lMVkVSID0gInNpbHZlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU0xPVyA9ICJzbG93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TTE9XRVIgPSAic2xvd2VyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TTUFMTCA9ICJzbWFsbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU01BTExfQ0FQUyA9ICJzbWFsbC1jYXBzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TTUFMTF9DQVBUSU9OID0gInNtYWxsLWNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NNQUxMRVIgPSAic21hbGxlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU09GVCA9ICJzb2Z0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TT0xJRCA9ICJzb2xpZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU1BFTExfT1VUID0gInNwZWxsLW91dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU1FVQVJFID0gInNxdWFyZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU1RBVElDID0gInN0YXRpYyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU1RBVFVTX0JBUiA9ICJzdGF0dXMtYmFyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TVUIgPSAic3ViIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TVVBFUiA9ICJzdXBlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU1dfUkVTSVpFID0gInN3LXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEFCTEUgPSAidGFibGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX0NBUFRJT04gPSAidGFibGUtY2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEFCTEVfQ0VMTCA9ICJ0YWJsZS1jZWxsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRV9DT0xVTU4gPSAidGFibGUtY29sdW1uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRV9DT0xVTU5fR1JPVVAgPSAidGFibGUtY29sdW1uLWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRV9GT09URVJfR1JPVVAgPSAidGFibGUtZm9vdGVyLWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRV9IRUFERVJfR1JPVVAgPSAidGFibGUtaGVhZGVyLWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRV9ST1cgPSAidGFibGUtcm93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRV9ST1dfR1JPVVAgPSAidGFibGUtcm93LWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19URUFMID0gInRlYWwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RFWFQgPSAidGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEVYVF9UT1AgPSAidGV4dC10b3AiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RFWFRfQk9UVE9NID0gInRleHQtYm90dG9tIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19USElDSyA9ICJ0aGljayI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEhJTiA9ICJ0aGluIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19USFJFRUREQVJLU0hBRE9XID0gIlRocmVlRERhcmtTaGFkb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RIUkVFREZBQ0UgPSAiVGhyZWVERmFjZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEhSRUVESElHSExJR0hUID0gIlRocmVlREhpZ2hsaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEhSRUVETElHSFRTSEFET1cgPSAiVGhyZWVETGlnaHRTaGFkb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RIUkVFRFNIQURPVyA9ICJUaHJlZURTaGFkb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RPUCA9ICJ0b3AiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RSQU5TUEFSRU5UID0gInRyYW5zcGFyZW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19VTFRSQV9DT05ERU5TRUQgPSAidWx0cmEtY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19VTFRSQV9FWFBBTkRFRCA9ICJ1bHRyYS1leHBhbmRlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVU5ERVJMSU5FID0gInVuZGVybGluZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVVBQRVJfQUxQSEEgPSAidXBwZXItYWxwaGEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1VQUEVSX0xBVElOID0gInVwcGVyLWxhdGluIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19VUFBFUl9ST01BTiA9ICJ1cHBlci1yb21hbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVVBQRVJDQVNFID0gInVwcGVyY2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVklTSUJMRSA9ICJ2aXNpYmxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19XX1JFU0laRSA9ICJ3LXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfV0FJVCA9ICJ3YWl0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19XSElURSA9ICJ3aGl0ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfV0lERVIgPSAid2lkZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1dJTkRPVyA9ICJXaW5kb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1dJTkRPV0ZSQU1FID0gIldpbmRvd0ZyYW1lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19XSU5ET1dURVhUID0gIldpbmRvd1RleHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1hfRkFTVCA9ICJ4LWZhc3QiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1hfSElHSCA9ICJ4LWhpZ2giOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1hfTEFSR0UgPSAieC1sYXJnZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9MT1VEID0gIngtbG91ZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9MT1cgPSAieC1sb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1hfU0xPVyA9ICJ4LXNsb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1hfU01BTEwgPSAieC1zbWFsbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9TT0ZUID0gIngtc29mdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWFhfU01BTEwgPSAieHgtc21hbGwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1hYX0xBUkdFID0gInh4LWxhcmdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ZRUxMT1cgPSAieWVsbG93IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNTVR5cGVDb2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTU1UeXBlQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNjgwNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNTVR5cGVDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBDU1NNTVR5cGVDb2xsZWN0b3IgZXh0ZW5kcyBDU1NNZXRhTW9kZWxUcmF2ZXJzZXIgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFR5cGVDb2xsZWN0b3IuCi0JICovCi0JcHVibGljIENTU01NVHlwZUNvbGxlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhcHBseShDU1NNTU5vZGUgbm9kZSwgU3RyaW5nIHR5cGUpIHsKLQkJZlR5cGUgPSB0eXBlOwotCQlmTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWFwcGx5KG5vZGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3ROZXN0ZWRUeXBlKGJvb2xlYW4gbmVzdGVkKSB7Ci0JCWZOZXN0ZWQgPSBuZXN0ZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHNob3J0IHByZU5vZGUoQ1NTTU1Ob2RlIG5vZGUpIHsKLQkJc2hvcnQgcmMgPSBUUkFWX0NPTlQ7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChmVHlwZSA9PSBub2RlLmdldFR5cGUoKSkgewotCQkJCWlmICghZk5vZGVzLmNvbnRhaW5zKG5vZGUpKSB7Ci0JCQkJCWZOb2Rlcy5hZGQobm9kZSk7Ci0JCQkJfQotCQkJCWlmICghZk5lc3RlZCkgewotCQkJCQlyYyA9IFRSQVZfUFJVTkU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Tm9kZXMoKSB7Ci0JCXJldHVybiBmTm9kZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBmTmVzdGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZlR5cGUgPSBudWxsOwotCUxpc3QgZk5vZGVzID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWVkaWFHcm91cElELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01lZGlhR3JvdXBJRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzhjZjdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWVkaWFHcm91cElELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01lZGlhR3JvdXBJRCB7Ci0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fQ09OVElOVU9VUyA9ICJjb250aW51b3VzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9QQUdFRCA9ICJwYWdlZCI7IC8vJE5PTi1OTFMtMSQKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9WSVNVQUwgPSAidmlzdWFsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9BVVJBTCA9ICJhdXJhbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fVEFDVElMRSA9ICJ0YWN0aWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JZmluYWwgc3RhdGljIFN0cmluZyBNX0dSSUQgPSAiZ3JpZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fQklUTUFQID0gImJpdG1hcCI7IC8vJE5PTi1OTFMtMSQKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9JTlRFUkFDVElWRSA9ICJpbnRlcmFjdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fU1RBVElDID0gInN0YXRpYyI7IC8vJE5PTi1OTFMtMSQKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9BTEwgPSAiYWxsIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZXRhTW9kZWxGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWV0YU1vZGVsRmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZGE2OTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZXRhTW9kZWxGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQotcHVibGljIGNsYXNzIENTU01ldGFNb2RlbEZpbmRlciB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU01ldGFNb2RlbEZpbmRlci4KLQkgKi8KLQlwcml2YXRlIENTU01ldGFNb2RlbEZpbmRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlzdGF0aWMgc3luY2hyb25pemVkIHB1YmxpYyBDU1NNZXRhTW9kZWxGaW5kZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENTU01ldGFNb2RlbEZpbmRlcigpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIENTU01ldGFNb2RlbCBmaW5kTWV0YU1vZGVsRm9yKElDU1NOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIENTU1Byb2ZpbGVGaW5kZXIuZ2V0SW5zdGFuY2UoKS5maW5kUHJvZmlsZUZvcihub2RlKS5nZXRNZXRhTW9kZWwoKTsKLQl9Ci0KLQlwdWJsaWMgQ1NTTWV0YU1vZGVsIGZpbmRNZXRhTW9kZWxGb3IoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlyZXR1cm4gQ1NTUHJvZmlsZUZpbmRlci5nZXRJbnN0YW5jZSgpLmZpbmRQcm9maWxlRm9yKG1vZGVsKS5nZXRNZXRhTW9kZWwoKTsKLQotCX0KLQotCS8vIGZpbmRNZXRhTW9kZWxGb3IoTm9kZSkgaXMgbm90IHVzZWQuCi0JLy8gRXZlbiBpZiBpdCBpcyB1c2VkLCBpdCBjYW4gYmUgcmVwbGFjZWQgd2l0aAotCS8vIGZpbmRNZXRhTW9kZWxGb3IoSVN0cnVjdHVyZWRNb2RlbCkgZWFzaWx5Ci0KLQlwdWJsaWMgQ1NTTWV0YU1vZGVsIGZpbmRNZXRhTW9kZWxGb3IoU3RyaW5nIGJhc2VMb2NhdGlvbikgewotCQlyZXR1cm4gQ1NTUHJvZmlsZUZpbmRlci5nZXRJbnN0YW5jZSgpLmZpbmRQcm9maWxlRm9yKGJhc2VMb2NhdGlvbikuZ2V0TWV0YU1vZGVsKCk7Ci0JfQotCi0Jc3RhdGljIHByaXZhdGUgQ1NTTWV0YU1vZGVsRmluZGVyIGZJbnN0YW5jZSA9IG51bGw7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01ldGFNb2RlbFRyYXZlcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZXRhTW9kZWxUcmF2ZXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiZWRmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01ldGFNb2RlbFRyYXZlcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotCi0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBDU1NNZXRhTW9kZWxUcmF2ZXJzZXIgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFRyYXZlcnNlci4KLQkgKi8KLQlwdWJsaWMgQ1NTTWV0YU1vZGVsVHJhdmVyc2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIGFwcGx5KENTU01NTm9kZSBub2RlKSB7Ci0JCWZUcmF2U3RhY2sgPSBuZXcgU3RhY2soKTsKLQotCQliZWdpbihub2RlKTsKLQkJdHJhdmVyc2Uobm9kZSk7Ci0JCWVuZChub2RlKTsKLQl9Ci0KLQlwcml2YXRlIGZpbmFsIHNob3J0IHRyYXZlcnNlKENTU01NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybiBUUkFWX0NPTlQ7Ci0JCX0KLQotCQlmVHJhdlN0YWNrLnB1c2gobm9kZSk7Ci0KLQkJc2hvcnQgcmM7Ci0JCXJjID0gcHJlTm9kZShub2RlKTsKLQotCQlpZiAocmMgPT0gVFJBVl9DT05UKSB7Ci0JCQlJdGVyYXRvciBpID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlDU1NNTU5vZGUgY2hpbGQgPSAoQ1NTTU1Ob2RlKSBpLm5leHQoKTsKLQkJCQlzaG9ydCByY0NoaWxkID0gdHJhdmVyc2UoY2hpbGQpOwotCQkJCWlmIChyY0NoaWxkID09IFRSQVZfU1RPUCkgewotCQkJCQlmVHJhdlN0YWNrLnBvcCgpOwotCQkJCQlyZXR1cm4gVFJBVl9TVE9QOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChyYyA9PSBUUkFWX1NUT1ApIHsKLQkJCWZUcmF2U3RhY2sucG9wKCk7Ci0JCQlyZXR1cm4gVFJBVl9TVE9QOwotCQl9Ci0KLQkJcmMgPSBwb3N0Tm9kZShub2RlKTsKLQotCQlmVHJhdlN0YWNrLnBvcCgpOwotCQlyZXR1cm4gKHJjID09IFRSQVZfUFJVTkUpID8gVFJBVl9DT05UIDogcmM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYmVnaW4oQ1NTTU1Ob2RlIG5vZGUpIHsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZChDU1NNTU5vZGUgbm9kZSkgewotCi0JfQotCi0JcHJvdGVjdGVkIHNob3J0IHByZU5vZGUoQ1NTTU1Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIFRSQVZfQ09OVDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc2hvcnQgcG9zdE5vZGUoQ1NTTU1Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIFRSQVZfQ09OVDsKLQl9Ci0KLQotCVN0YWNrIGZUcmF2U3RhY2sgPSBudWxsOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBzaG9ydCBUUkFWX0NPTlQgPSAwOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgc2hvcnQgVFJBVl9TVE9QID0gMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIHNob3J0IFRSQVZfUFJVTkUgPSAyOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01ldGFNb2RlbFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWV0YU1vZGVsVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2E3NWNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWV0YU1vZGVsVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlOwotCi0KLXB1YmxpYyBjbGFzcyBDU1NNZXRhTW9kZWxVdGlsIHsKLQlwdWJsaWMgQ1NTTWV0YU1vZGVsVXRpbChDU1NNZXRhTW9kZWwgbWV0YW1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCWZNZXRhTW9kZWwgPSBtZXRhbW9kZWw7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBjb2xsZWN0Tm9kZXNCeVR5cGUoQ1NTTU1Ob2RlLlRZUEVfUFJPUEVSVFkpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXREZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIGNvbGxlY3ROb2Rlc0J5VHlwZShDU1NNTU5vZGUuVFlQRV9ERVNDUklQVE9SKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgY29sbGVjdE5vZGVzQnlUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCUNTU01NVHlwZUNvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgQ1NTTU1UeXBlQ29sbGVjdG9yKCk7Ci0JCWNvbGxlY3Rvci5hcHBseShmTWV0YU1vZGVsLCB0eXBlKTsKLQkJcmV0dXJuIGNvbGxlY3Rvci5nZXROb2RlcygpOwotCX0KLQotCXB1YmxpYyBDU1NNTVByb3BlcnR5IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSXRlcmF0b3IgaVByb3BlcnR5ID0gZ2V0UHJvcGVydGllcygpOwotCQl3aGlsZSAoaVByb3BlcnR5Lmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpUHJvcGVydHkubmV4dCgpOwotCQkJaWYgKG5vZGUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UocHJvcGVydHlOYW1lKSkgewotCQkJCXJldHVybiAoQ1NTTU1Qcm9wZXJ0eSkgbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ1NTTU1EZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoU3RyaW5nIGRlc2NyaXB0b3JOYW1lKSB7Ci0JCUl0ZXJhdG9yIGlEZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcnMoKTsKLQkJd2hpbGUgKGlEZXNjcmlwdG9yLmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpRGVzY3JpcHRvci5uZXh0KCk7Ci0JCQlpZiAobm9kZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShkZXNjcmlwdG9yTmFtZSkpIHsKLQkJCQlyZXR1cm4gKENTU01NRGVzY3JpcHRvcikgbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ1NTTU1Ob2RlIGdldE1ldGFNb2RlbE5vZGVGb3IoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xhcmF0aW9uKSB7Ci0JCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJSUNTU05vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpIHsKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydHkoKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZSkuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQkJfQotCQkJZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlKSB7Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0b3IoKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZSkuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQkJfQotCQl9Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKGZUeXBlTWFwID09IG51bGwpIHsKLQkJCWZUeXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZUeXBlTWFwLnB1dChuZXcgU2hvcnQoSUNTU05vZGUuU1RZTEVSVUxFX05PREUpLCBDU1NNTU5vZGUuVFlQRV9TVFlMRV9SVUxFKTsKLQkJCWZUeXBlTWFwLnB1dChuZXcgU2hvcnQoSUNTU05vZGUuRk9OVEZBQ0VSVUxFX05PREUpLCBDU1NNTU5vZGUuVFlQRV9GT05UX0ZBQ0VfUlVMRSk7Ci0JCQlmVHlwZU1hcC5wdXQobmV3IFNob3J0KElDU1NOb2RlLlBBR0VSVUxFX05PREUpLCBDU1NNTU5vZGUuVFlQRV9QQUdFX1JVTEUpOwotCQl9Ci0KLQkJU3RyaW5nIG5vZGVUeXBlID0gKFN0cmluZykgZlR5cGVNYXAuZ2V0KG5ldyBTaG9ydChub2RlLmdldE5vZGVUeXBlKCkpKTsKLQkJaWYgKG5vZGVUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSXRlcmF0b3IgaU5vZGVzID0gY29sbGVjdE5vZGVzQnlUeXBlKG5vZGVUeXBlKTsKLQkJaWYgKGlOb2Rlcy5oYXNOZXh0KCkpIHsKLQkJCUNTU01NTm9kZSB0YXJnZXROb2RlID0gKENTU01NTm9kZSkgaU5vZGVzLm5leHQoKTsKLQkJCWlmICghaU5vZGVzLmhhc05leHQoKSkgeyAvLyBpdCdzIG9ubHkgb25lCi0JCQkJcmV0dXJuIHRhcmdldE5vZGU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ1NTTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKLQkJcmV0dXJuIGZNZXRhTW9kZWw7Ci0JfQotCi0KLQlwcml2YXRlIENTU01ldGFNb2RlbCBmTWV0YU1vZGVsID0gbnVsbDsKLQlwcml2YXRlIE1hcCBmVHlwZU1hcCA9IG51bGw7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU051bWJlcklELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU051bWJlcklELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZjY5ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NOdW1iZXJJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotcHVibGljIGludGVyZmFjZSBDU1NOdW1iZXJJRCB7Ci0KLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX0FOR0xFID0gImFuZ2xlIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgTl9GUkVRVUVOQ1kgPSAiZnJlcXVlbmN5IjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgTl9JTlRFR0VSID0gImludGVnZXIiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX0xFTkdUSCA9ICJsZW5ndGgiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX1BFUkNFTlRBR0UgPSAicGVyY2VudGFnZSI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIE5fVElNRSA9ICJ0aW1lIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgTl9IQVNIID0gImhhc2giOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgTl9OVU0gPSAibnVtYmVyIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU1Byb2ZpbGVGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTUHJvZmlsZUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDdmNTI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTUHJvZmlsZUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5DU1NDb250ZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTUHJvZmlsZUZpbmRlciB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU1Byb2ZpbGVGaW5kZXIuCi0JICovCi0JcHJpdmF0ZSBDU1NQcm9maWxlRmluZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXN0YXRpYyBzeW5jaHJvbml6ZWQgcHVibGljIENTU1Byb2ZpbGVGaW5kZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENTU1Byb2ZpbGVGaW5kZXIoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBDU1NQcm9maWxlIGZpbmRQcm9maWxlRm9yKElDU1NOb2RlIG5vZGUpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gbnVsbDsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJSUNTU0RvY3VtZW50IGRvYyA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQkJbW9kZWwgPSBkb2MuZ2V0TW9kZWwoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmluZFByb2ZpbGVGb3IobW9kZWwpOwotCX0KLQotCXB1YmxpYyBDU1NQcm9maWxlIGZpbmRQcm9maWxlRm9yKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG51bGw7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJT2JqZWN0IG1vZGVsVHlwZSA9ICgoSUNTU01vZGVsKSBtb2RlbCkuZ2V0U3R5bGVTaGVldFR5cGUoKTsKLQkJCWlmIChtb2RlbFR5cGUgPT0gSUNTU01vZGVsLkVYVEVSTkFMKSB7Ci0JCQkJYmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChtb2RlbFR5cGUgPT0gSUNTU01vZGVsLkVNQkVEREVEIHx8IG1vZGVsVHlwZSA9PSBJQ1NTTW9kZWwuSU5MSU5FKSB7Ci0JCQkJYmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7IC8vIG1heSBiZSBudWxsCi0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJYmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGZpbmRQcm9maWxlRm9yKGJhc2VMb2NhdGlvbik7Ci0JfQotCi0JcHVibGljIENTU1Byb2ZpbGUgZmluZFByb2ZpbGVGb3IoU3RyaW5nIGJhc2VMb2NhdGlvbikgewotCQlDU1NQcm9maWxlUmVnaXN0cnkgcmVnID0gQ1NTUHJvZmlsZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCUNTU1Byb2ZpbGUgcHJvZmlsZSA9IG51bGw7Ci0KLQkJaWYgKGJhc2VMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoYmFzZUxvY2F0aW9uKTsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQkJaWYgKHJlc291cmNlID09IG51bGwgJiYgcGF0aC5zZWdtZW50Q291bnQoKSA+IDEpCi0JCQkJcmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCVN0cmluZyBwcm9maWxlSUQgPSBDU1NDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShDU1NDb250ZW50UHJvcGVydGllcy5DU1NfUFJPRklMRSwgcmVzb3VyY2UsIHRydWUpOwotCQkJCWlmIChwcm9maWxlSUQgIT0gbnVsbCAmJiAwIDwgcHJvZmlsZUlELmxlbmd0aCgpKSB7Ci0JCQkJCXByb2ZpbGUgPSByZWcuZ2V0UHJvZmlsZShwcm9maWxlSUQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiAocHJvZmlsZSAhPSBudWxsKSA/IHByb2ZpbGUgOiByZWcuZ2V0RGVmYXVsdFByb2ZpbGUoKTsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBDU1NQcm9maWxlRmluZGVyIGZJbnN0YW5jZSA9IG51bGw7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU1Byb3BlcnR5SUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTUHJvcGVydHlJRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTBlOGU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTUHJvcGVydHlJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTUHJvcGVydHlJRCB7Ci0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQVpJTVVUSCA9ICJhemltdXRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CRyA9ICJiYWNrZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19BVFRBQ0hNRU5UID0gImJhY2tncm91bmQtYXR0YWNobWVudCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfQ09MT1IgPSAiYmFja2dyb3VuZC1jb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfSU1BR0UgPSAiYmFja2dyb3VuZC1pbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfUE9TSVRJT04gPSAiYmFja2dyb3VuZC1wb3NpdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfUkVQRUFUID0gImJhY2tncm91bmQtcmVwZWF0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVIgPSAiYm9yZGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQ09MTEFQU0UgPSAiYm9yZGVyLWNvbGxhcHNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQ09MT1IgPSAiYm9yZGVyLWNvbG9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfU1BBQ0lORyA9ICJib3JkZXItc3BhY2luZyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1NUWUxFID0gImJvcmRlci1zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1RPUCA9ICJib3JkZXItdG9wIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfUklHSFQgPSAiYm9yZGVyLXJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQk9UVE9NID0gImJvcmRlci1ib3R0b20iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9MRUZUID0gImJvcmRlci1sZWZ0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfVE9QX0NPTE9SID0gImJvcmRlci10b3AtY29sb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9SSUdIVF9DT0xPUiA9ICJib3JkZXItcmlnaHQtY29sb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9CT1RUT01fQ09MT1IgPSAiYm9yZGVyLWJvdHRvbS1jb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0xFRlRfQ09MT1IgPSAiYm9yZGVyLWxlZnQtY29sb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9UT1BfU1RZTEUgPSAiYm9yZGVyLXRvcC1zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1JJR0hUX1NUWUxFID0gImJvcmRlci1yaWdodC1zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0JPVFRPTV9TVFlMRSA9ICJib3JkZXItYm90dG9tLXN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfTEVGVF9TVFlMRSA9ICJib3JkZXItbGVmdC1zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1RPUF9XSURUSCA9ICJib3JkZXItdG9wLXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfUklHSFRfV0lEVEggPSAiYm9yZGVyLXJpZ2h0LXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQk9UVE9NX1dJRFRIID0gImJvcmRlci1ib3R0b20td2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9MRUZUX1dJRFRIID0gImJvcmRlci1sZWZ0LXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfV0lEVEggPSAiYm9yZGVyLXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1RUT00gPSAiYm90dG9tIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DQVBUSU9OX1NJREUgPSAiY2FwdGlvbi1zaWRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DTEVBUiA9ICJjbGVhciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ0xJUCA9ICJjbGlwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT0xPUiA9ICJjb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ09OVEVOVCA9ICJjb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT1VOVEVSX0lOQ1JFTUVOVCA9ICJjb3VudGVyLWluY3JlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ09VTlRFUl9SRVNFVCA9ICJjb3VudGVyLXJlc2V0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DVUUgPSAiY3VlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DVUVfQUZURVIgPSAiY3VlLWFmdGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DVUVfQkVGT1JFID0gImN1ZS1iZWZvcmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NVUlNPUiA9ICJjdXJzb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0RJUkVDVElPTiA9ICJkaXJlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0RJU1BMQVkgPSAiZGlzcGxheSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRUxFVkFUSU9OID0gImVsZXZhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRU1QVFlfQ0VMTFMgPSAiZW1wdHktY2VsbHMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZMT0FUID0gImZsb2F0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UID0gImZvbnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfRkFNSUxZID0gImZvbnQtZmFtaWx5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1NJWkUgPSAiZm9udC1zaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1NJWkVfQURKVVNUID0gImZvbnQtc2l6ZS1hZGp1c3QiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU1RSRVRDSCA9ICJmb250LXN0cmV0Y2giOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU1RZTEUgPSAiZm9udC1zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9WQVJJQU5UID0gImZvbnQtdmFyaWFudCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9XRUlHSFQgPSAiZm9udC13ZWlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0hFSUdIVCA9ICJoZWlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0xFRlQgPSAibGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTEVUVEVSX1NQQUNJTkcgPSAibGV0dGVyLXNwYWNpbmciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0xJTkVfSEVJR0hUID0gImxpbmUtaGVpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MSVNUX1NUWUxFID0gImxpc3Qtc3R5bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0xJU1RfU1RZTEVfSU1BR0UgPSAibGlzdC1zdHlsZS1pbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTElTVF9TVFlMRV9QT1NJVElPTiA9ICJsaXN0LXN0eWxlLXBvc2l0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MSVNUX1NUWUxFX1RZUEUgPSAibGlzdC1zdHlsZS10eXBlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJHSU4gPSAibWFyZ2luIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJHSU5fVE9QID0gIm1hcmdpbi10b3AiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTl9SSUdIVCA9ICJtYXJnaW4tcmlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTl9CT1RUT00gPSAibWFyZ2luLWJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSR0lOX0xFRlQgPSAibWFyZ2luLWxlZnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01BUktFUl9PRkZTRVQgPSAibWFya2VyLW9mZnNldCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSS1MgPSAibWFya3MiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01BWF9IRUlHSFQgPSAibWF4LWhlaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFYX1dJRFRIID0gIm1heC13aWR0aCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUlOX0hFSUdIVCA9ICJtaW4taGVpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NSU5fV0lEVEggPSAibWluLXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PUlBIQU5TID0gIm9ycGhhbnMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX09VVExJTkUgPSAib3V0bGluZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1VUTElORV9DT0xPUiA9ICJvdXRsaW5lLWNvbG9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PVVRMSU5FX1NUWUxFID0gIm91dGxpbmUtc3R5bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX09VVExJTkVfV0lEVEggPSAib3V0bGluZS13aWR0aCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1ZFUkZMT1cgPSAib3ZlcmZsb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBRERJTkcgPSAicGFkZGluZyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19UT1AgPSAicGFkZGluZy10b3AiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBRERJTkdfUklHSFQgPSAicGFkZGluZy1yaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19CT1RUT00gPSAicGFkZGluZy1ib3R0b20iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBRERJTkdfTEVGVCA9ICJwYWRkaW5nLWxlZnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBR0UgPSAicGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFHRV9CUkVBS19BRlRFUiA9ICJwYWdlLWJyZWFrLWFmdGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQUdFX0JSRUFLX0JFRk9SRSA9ICJwYWdlLWJyZWFrLWJlZm9yZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFHRV9CUkVBS19JTlNJREUgPSAicGFnZS1icmVhay1pbnNpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBVVNFID0gInBhdXNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQVVTRV9BRlRFUiA9ICJwYXVzZS1hZnRlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFVU0VfQkVGT1JFID0gInBhdXNlLWJlZm9yZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUElUQ0ggPSAicGl0Y2giOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BJVENIX1JBTkdFID0gInBpdGNoLXJhbmdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QTEFZX0RVUklORyA9ICJwbGF5LWR1cmluZyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUE9TSVRJT04gPSAicG9zaXRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1FVT1RFUyA9ICJxdW90ZXMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1JJQ0hORVNTID0gInJpY2huZXNzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9SSUdIVCA9ICJyaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU0laRSA9ICJzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBSyA9ICJzcGVhayI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1BFQUtfSEVBREVSID0gInNwZWFrLWhlYWRlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1BFQUtfTlVNRVJBTCA9ICJzcGVhay1udW1lcmFsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBS19QVU5DVFVBVElPTiA9ICJzcGVhay1wdW5jdHVhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1BFRUNIX1JBVEUgPSAic3BlZWNoLXJhdGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1NUUkVTUyA9ICJzdHJlc3MiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1RBQkxFX0xBWU9VVCA9ICJ0YWJsZS1sYXlvdXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1RFWFRfQUxJR04gPSAidGV4dC1hbGlnbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9ERUNPUkFUSU9OID0gInRleHQtZGVjb3JhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9JTkRFTlQgPSAidGV4dC1pbmRlbnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1RFWFRfU0hBRE9XID0gInRleHQtc2hhZG93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9URVhUX1RSQU5TRk9STSA9ICJ0ZXh0LXRyYW5zZm9ybSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVE9QID0gInRvcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVU5JQ09ERV9CSURJID0gInVuaWNvZGUtYmlkaSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVkVSVElDQUxfQUxJR04gPSAidmVydGljYWwtYWxpZ24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1ZJU0lCSUxJVFkgPSAidmlzaWJpbGl0eSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVk9JQ0VfRkFNSUxZID0gInZvaWNlLWZhbWlseSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVk9MVU1FID0gInZvbHVtZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfV0hJVEVfU1BBQ0UgPSAid2hpdGUtc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1dJRE9XUyA9ICJ3aWRvd3MiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1dJRFRIID0gIndpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9XT1JEX1NQQUNJTkcgPSAid29yZC1zcGFjaW5nIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9aX0lOREVYID0gInotaW5kZXgiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU1N0cmluZ0lELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU1N0cmluZ0lELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MjJjZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NTdHJpbmdJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotcHVibGljIGludGVyZmFjZSBDU1NTdHJpbmdJRCB7Ci0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNfQU5ZID0gImFueSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNfQ09VTlRFUl9JREVOVElGSUVSID0gImNvdW50ZXItaWRlbnRpZmllciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNfRkFNSUxZX05BTUUgPSAiZmFtaWx5LW5hbWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTX0ZPTlRfRkFDRV9OQU1FID0gImZvbnQtZmFjZS1uYW1lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU19QQUdFX0lERU5USUZJRVIgPSAicGFnZS1pZGVudGlmaWVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU19TUEVDSUZJQ19WT0lDRSA9ICJzcGVjaWZpYy12b2ljZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNfVVJBTkdFID0gInVyYW5nZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTVW5pdElELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU1VuaXRJRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjQ2ZDMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTVW5pdElELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU1VuaXRJRCB7Ci0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfQ00gPSAiY20iOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfREVHID0gImRlZyI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9FTVMgPSAiZW0iOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfRVhTID0gImV4IjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX0dSQUQgPSAiZ3JhZCI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9IQVNIID0gIiMiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfSFogPSAiSHoiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfSU4gPSAiaW4iOy8vJE5PTi1OTFMtMSQKLQkvLyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVfSU5URUdFUiA9ICJJTlRFR0VSIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX0tIWiA9ICJrSHoiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfTU0gPSAibW0iOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfTVMgPSAibXMiOy8vJE5PTi1OTFMtMSQKLQkvLyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVfTlVNQkVSID0gIk5VTUJFUiI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9QQyA9ICJwYyI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9QRVJDRU5UQUdFID0gIiUiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfUFQgPSAicHQiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfUFggPSAicHgiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfUkFEID0gInJhZCI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9TID0gInMiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUNhdGVnb3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NQ2F0ZWdvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YjBlNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NQ2F0ZWdvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLWNsYXNzIENTU01NQ2F0ZWdvcnlJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NQ2F0ZWdvcnkgewotCi0JcHVibGljIENTU01NQ2F0ZWdvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfQ0FURUdPUlk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENhcHRpb24oKSB7Ci0JCXJldHVybiBmQ2FwdGlvbjsKLQl9Ci0KLQl2b2lkIHNldENhcHRpb24oU3RyaW5nIGNhcHRpb24pIHsKLQkJZkNhcHRpb24gPSBjYXB0aW9uOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgaWYgKGdldENhcHRpb24oKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRDYXB0aW9uKCk7Ci0JfQotCi0KLQlwcml2YXRlIFN0cmluZyBmQ2FwdGlvbiA9IG51bGw7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1DaGFyc2V0UnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUNoYXJzZXRSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDY0YjUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUNoYXJzZXRSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTUNoYXJzZXRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi1jbGFzcyBDU1NNTUNoYXJzZXRSdWxlSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTUNoYXJzZXRSdWxlIHsKLQotCi0JcHVibGljIENTU01NQ2hhcnNldFJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfQ0hBUlNFVF9SVUxFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5BTUVfTk9UX0FWQUlMQUJMRTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNnZXRFcnJvcigpCi0JICovCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Db250YWluZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Db250YWluZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZTc5ZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NQ29udGFpbmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotY2xhc3MgQ1NTTU1Db250YWluZXJJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NQ29udGFpbmVyIHsKLQotCi0JcHVibGljIENTU01NQ29udGFpbmVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX0NPTlRBSU5FUjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IGNoaWxkLmdldFR5cGUoKTsKLQkJcmV0dXJuICh0eXBlID09IFRZUEVfTlVNQkVSIHx8IHR5cGUgPT0gVFlQRV9LRVlXT1JEIHx8IHR5cGUgPT0gVFlQRV9GVU5DVElPTiB8fCB0eXBlID09IFRZUEVfQ09OVEFJTkVSKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNnZXRFcnJvcigpCi0JICovCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIGlmIChnZXRDaGlsZENvdW50KCkgPT0gMCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTURlc2NyaXB0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1EZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTFkNjY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTURlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotCi1jbGFzcyBDU1NNTURlc2NyaXB0b3JJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NRGVzY3JpcHRvciB7Ci0KLQotCXB1YmxpYyBDU1NNTURlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfREVTQ1JJUFRPUjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IGNoaWxkLmdldFR5cGUoKTsKLQkJcmV0dXJuICh0eXBlID09IFRZUEVfTlVNQkVSIHx8IHR5cGUgPT0gVFlQRV9LRVlXT1JEIHx8IHR5cGUgPT0gVFlQRV9GVU5DVElPTiB8fCB0eXBlID09IFRZUEVfQ09OVEFJTkVSIHx8IHR5cGUgPT0gVFlQRV9TVFJJTkcgfHwgdHlwZSA9PSBUWVBFX1NFUEFSQVRPUik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjZ2V0RXJyb3IoKQotCSAqLwotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9UX0RFRklORUQ7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0Q2hpbGRDb3VudCgpID09IDApIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NRGVzY3JpcHRvciNnZXRWYWx1ZXMoKQotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRWYWx1ZXMoKSB7Ci0JCVZhbHVlQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBWYWx1ZUNvbGxlY3RvcigpOwotCQljb2xsZWN0b3IuYXBwbHkodGhpcyk7Ci0JCXJldHVybiBjb2xsZWN0b3IuZ2V0Tm9kZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUZvbnRGYWNlUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUZvbnRGYWNlUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkMWNhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Gb250RmFjZVJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NRm9udEZhY2VSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi1jbGFzcyBDU1NNTUZvbnRGYWNlUnVsZUltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1Gb250RmFjZVJ1bGUgewotCi0KLQlwdWJsaWMgQ1NTTU1Gb250RmFjZVJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfRk9OVF9GQUNFX1JVTEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkFNRV9OT1RfQVZBSUxBQkxFOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIChjaGlsZCAhPSBudWxsICYmIGNoaWxkLmdldFR5cGUoKSA9PSBUWVBFX0RFU0NSSVBUT1IpOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUZ1bmN0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NRnVuY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2N2YyMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NRnVuY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NRnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLWNsYXNzIENTU01NRnVuY3Rpb25JbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NRnVuY3Rpb24gewotCi0JcHVibGljIENTU01NRnVuY3Rpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfRlVOQ1RJT047Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bmN0aW9uU3RyaW5nKCkgewotCQlyZXR1cm4gZlZhbHVlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI3Bvc3RTZXRBdHRyaWJ1dGUoKQotCSAqLwotCS8vIHZvaWQgcG9zdFNldEF0dHJpYnV0ZSgpIHRocm93cyBCYWRJbml0aWFsaXphdGlvbkV4Y2VwdGlvbiB7Ci0JLy8gc3VwZXIucG9zdFNldEF0dHJpYnV0ZSgpOwotCS8vIFN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCS8vIGlmIChuYW1lID09IG51bGwpIHsgdGhyb3cgbmV3IEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uKCk7IH0KLQkvLwotCS8vIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBsaXN0LmFkZChDU1NGdW5jdGlvbklELkZfQVRUUik7Ci0JLy8gbGlzdC5hZGQoQ1NTRnVuY3Rpb25JRC5GX0NPVU5URVIpOwotCS8vIGxpc3QuYWRkKENTU0Z1bmN0aW9uSUQuRl9SR0IpOwotCS8vIGxpc3QuYWRkKENTU0Z1bmN0aW9uSUQuRl9SRUNUKTsKLQkvLyBsaXN0LmFkZChDU1NGdW5jdGlvbklELkZfVVJJKTsKLQkvLyBsaXN0LmFkZChDU1NGdW5jdGlvbklELkZfRk9STUFUKTsKLQkvLyBsaXN0LmFkZChDU1NGdW5jdGlvbklELkZfTE9DQUwpOwotCS8vCi0JLy8gaWYgKCEgbGlzdC5jb250YWlucyhuYW1lLnRvTG93ZXJDYXNlKCkpKSB7Ci0JLy8gdGhyb3cgbmV3IEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uKCk7Ci0JLy8gfQotCS8vIH0KLQkvKgotCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0RnVuY3Rpb25TdHJpbmcoKTsKLQl9Ci0KLQl2b2lkIHNldEZ1bmN0aW9uU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQlmVmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNnZXRFcnJvcigpCi0JICovCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIGlmIChnZXRGdW5jdGlvblN0cmluZygpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIFN0cmluZyBmVmFsdWUgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NSW1wb3J0UnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUltcG9ydFJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZGZlODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NSW1wb3J0UnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1JbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi1jbGFzcyBDU1NNTUltcG9ydFJ1bGVJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NSW1wb3J0UnVsZSB7Ci0KLQotCXB1YmxpYyBDU1NNTUltcG9ydFJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfSU1QT1JUX1JVTEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkFNRV9OT1RfQVZBSUxBQkxFOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1LZXl3b3JkSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NS2V5d29yZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhiNTU5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1LZXl3b3JkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTUtleXdvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLWNsYXNzIENTU01NS2V5d29yZEltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1LZXl3b3JkIHsKLQotCXB1YmxpYyBDU1NNTUtleXdvcmRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfS0VZV09SRDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTUtleXdvcmQjZ2V0S2V5d29yZFN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRLZXl3b3JkU3RyaW5nKCkgewotCQlyZXR1cm4gZlZhbHVlOwotCX0KLQotCS8qCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRLZXl3b3JkU3RyaW5nKCk7Ci0JfQotCi0Jdm9pZCBzZXRLZXl3b3JkU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQlmVmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgaWYgKGdldEtleXdvcmRTdHJpbmcoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBTdHJpbmcgZlZhbHVlID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTU1lZGlhUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTU1lZGlhUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTkwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1NZWRpYVJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTWVkaWFSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi1jbGFzcyBDU1NNTU1lZGlhUnVsZUltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1NZWRpYVJ1bGUgewotCi0KLQlwdWJsaWMgQ1NTTU1NZWRpYVJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfTUVESUFfUlVMRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBOQU1FX05PVF9BVkFJTEFCTEU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NTm9kZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTU5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyM2Q3ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi0KLWFic3RyYWN0IGNsYXNzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTU5vZGUgewotCi0JcHVibGljIENTU01NTm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUeXBlKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZkRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChmQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKFN0cmluZykgZkF0dHJpYnV0ZXMuZ2V0KG5hbWUpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZE5vZGVzKCkgewotCQlpZiAoZkNoaWxkTm9kZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKGZDaGlsZE5vZGVzKS5pdGVyYXRvcigpOwotCQl9Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldERlc2NlbmRhbnRzKCkgewotCQlMaXN0IGRlc2NlbmRhbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpQ2hpbGQgPSBnZXRDaGlsZE5vZGVzKCk7Ci0JCXdoaWxlIChpQ2hpbGQuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTU5vZGUgY2hpbGQgPSAoQ1NTTU1Ob2RlKSBpQ2hpbGQubmV4dCgpOwotCQkJSXRlcmF0b3IgaURlc2NlbmRhbnQgPSBjaGlsZC5nZXREZXNjZW5kYW50cygpOwotCQkJaWYgKGlEZXNjZW5kYW50Lmhhc05leHQoKSkgewotCQkJCXdoaWxlIChpRGVzY2VuZGFudC5oYXNOZXh0KCkpIHsKLQkJCQkJQ1NTTU1Ob2RlIGRlc2NlbmRhbnQgPSAoQ1NTTU1Ob2RlKSBpRGVzY2VuZGFudC5uZXh0KCk7Ci0JCQkJCWlmICghZGVzY2VuZGFudHMuY29udGFpbnMoZGVzY2VuZGFudCkpIHsKLQkJCQkJCWRlc2NlbmRhbnRzLmFkZChkZXNjZW5kYW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICghZGVzY2VuZGFudHMuY29udGFpbnMoY2hpbGQpKSB7Ci0JCQkJCWRlc2NlbmRhbnRzLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKGRlc2NlbmRhbnRzKS5pdGVyYXRvcigpOwotCX0KLQotCXZvaWQgYXBwZW5kQ2hpbGQoQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGZDaGlsZE5vZGVzID09IG51bGwpIHsKLQkJCWZDaGlsZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWlmICghZkNoaWxkTm9kZXMuY29udGFpbnMoY2hpbGQpKSB7Ci0JCQlmQ2hpbGROb2Rlcy5hZGQoY2hpbGQpOwotCQkJKChDU1NNTU5vZGVJbXBsKSBjaGlsZCkuZlJlZkNvdW50Kys7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZUNoaWxkKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCB8fCBmQ2hpbGROb2RlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSXRlcmF0b3IgaSA9IGZDaGlsZE5vZGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJaWYgKGkubmV4dCgpID09IGNoaWxkKSB7Ci0JCQkJaS5yZW1vdmUoKTsKLQkJCQkoKENTU01NTm9kZUltcGwpIGNoaWxkKS5mUmVmQ291bnQtLTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZUFsbENoaWxkTm9kZXMoKSB7Ci0JCWlmIChmQ2hpbGROb2RlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSXRlcmF0b3IgaSA9IGZDaGlsZE5vZGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJKChDU1NNTU5vZGVJbXBsKSBpLm5leHQoKSkuZlJlZkNvdW50LS07Ci0JCX0KLQkJZkNoaWxkTm9kZXMuY2xlYXIoKTsKLQl9Ci0KLQlhYnN0cmFjdCBib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKTsKLQotCXZvaWQgaW5pdGlhbGl6ZUF0dHJpYnV0ZShNYXAgYXR0cmlidXRlcykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCWlmIChmQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQlmQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJZkF0dHJpYnV0ZXMucHV0QWxsKGF0dHJpYnV0ZXMpOwotCQlwb3N0U2V0QXR0cmlidXRlKCk7Ci0JfQotCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJZkRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0Jdm9pZCBwb3N0U2V0QXR0cmlidXRlKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCS8vIGRlZmF1bHQgOiBub3AKLQl9Ci0KLQlhYnN0cmFjdCBzaG9ydCBnZXRFcnJvcigpOwotCi0JaW50IGdldENoaWxkQ291bnQoKSB7Ci0JCXJldHVybiAoZkNoaWxkTm9kZXMgIT0gbnVsbCkgPyBmQ2hpbGROb2Rlcy5zaXplKCkgOiAwOwotCX0KLQotCWludCBnZXRSZWZlcmVuY2VDb3VudCgpIHsKLQkJcmV0dXJuIGZSZWZDb3VudDsKLQl9Ci0KLQotCXByaXZhdGUgTGlzdCBmQ2hpbGROb2RlcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkRlc2NyaXB0aW9uID0gbnVsbDsKLQlwcml2YXRlIE1hcCBmQXR0cmlidXRlcyA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZlJlZkNvdW50ID0gMDsgLy8gZm9yIGVycm9yIGNoZWNrCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9OT1RfQVZBSUxBQkxFID0gIiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTU51bWJlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTU51bWJlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FhZTNlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1OdW1iZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTnVtYmVyOwotCi1jbGFzcyBDU1NNTU51bWJlckltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1OdW1iZXIgewotCi0KLQlwdWJsaWMgQ1NTTU1OdW1iZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfTlVNQkVSOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gKGNoaWxkICE9IG51bGwgJiYgY2hpbGQuZ2V0VHlwZSgpID09IFRZUEVfVU5JVCk7Ci0JfQotCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1QYWdlUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVBhZ2VSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjhjY2VjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVBhZ2VSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVBhZ2VSdWxlOwotCi1jbGFzcyBDU1NNTVBhZ2VSdWxlSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTVBhZ2VSdWxlIHsKLQotCi0JcHVibGljIENTU01NUGFnZVJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfUEFHRV9SVUxFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5BTUVfTk9UX0FWQUlMQUJMRTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSBjaGlsZC5nZXRUeXBlKCk7Ci0JCXJldHVybiAodHlwZSA9PSBUWVBFX1BST1BFUlRZIHx8IHR5cGUgPT0gVFlQRV9TRUxFQ1RPUik7Ci0JfQotCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXRDaGlsZENvdW50KCkgPT0gMCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Qcm9wZXJ0eUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVByb3BlcnR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjUyOWZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVByb3BlcnR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVByb3BlcnR5OwotCi0KLWNsYXNzIENTU01NUHJvcGVydHlJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NUHJvcGVydHkgewotCXB1YmxpYyBDU1NNTVByb3BlcnR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX1BST1BFUlRZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gY2hpbGQuZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHR5cGUgPT0gVFlQRV9OVU1CRVIgfHwgdHlwZSA9PSBUWVBFX0tFWVdPUkQgfHwgdHlwZSA9PSBUWVBFX0ZVTkNUSU9OIHx8IHR5cGUgPT0gVFlQRV9DT05UQUlORVIgfHwgdHlwZSA9PSBUWVBFX1NUUklORyB8fCB0eXBlID09IFRZUEVfU0VQQVJBVE9SIHx8IHR5cGUgPT0gVFlQRV9QUk9QRVJUWSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NUHJvcGVydHkjZ2V0Q2F0ZWdvcnlOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5TmFtZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShBVFRSX0NBVEVHT1JZKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0VmFsdWVzKCkgewotCQlWYWx1ZUNvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgVmFsdWVDb2xsZWN0b3IoKTsKLQkJY29sbGVjdG9yLmFwcGx5KHRoaXMpOwotCQlyZXR1cm4gY29sbGVjdG9yLmdldE5vZGVzKCk7Ci0JfQotCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIGlmIChnZXRDaGlsZENvdW50KCkgPT0gMCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0KLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DQVRFR09SWSA9ICJjYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVBzZXVkb0NsYXNzSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUHNldWRvQ2xhc3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OTU5ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUHNldWRvQ2xhc3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWNsYXNzIENTU01NUHNldWRvQ2xhc3NJbXBsIGV4dGVuZHMgQ1NTTU1TZWxlY3RvckltcGwgewotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwuCi0JICovCi0JcHVibGljIENTU01NUHNldWRvQ2xhc3NJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTVNlbGVjdG9yI2dldFNlbGVjdG9yVHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RvclR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX1BTRVVET19DTEFTUzsKLQl9Ci0KLQl2b2lkIHNldFNlbGVjdG9yU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQlmVmFsdWUgPSAiOiIgKyB2YWx1ZTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUHNldWRvRWxlbWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVBzZXVkb0VsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYmU5MTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUHNldWRvRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotcHVibGljIGNsYXNzIENTU01NUHNldWRvRWxlbWVudEltcGwgZXh0ZW5kcyBDU1NNTVNlbGVjdG9ySW1wbCB7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDU1NNTVBzZXVkb0VsZW1lbnRJbXBsLgotCSAqLwotCXB1YmxpYyBDU1NNTVBzZXVkb0VsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTVNlbGVjdG9yI2dldFNlbGVjdG9yVHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RvclR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX1BTRVVET19FTEVNRU5UOwotCX0KLQotCXZvaWQgc2V0U2VsZWN0b3JTdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCWZWYWx1ZSA9ICI6IiArIHZhbHVlOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU2VsZWN0b3JFeHByZXNzaW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU2VsZWN0b3JFeHByZXNzaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDViNGNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVNlbGVjdG9yRXhwcmVzc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotY2xhc3MgQ1NTTU1TZWxlY3RvckV4cHJlc3Npb25JbXBsIGV4dGVuZHMgQ1NTTU1TZWxlY3RvckltcGwgewotCi0JcHVibGljIENTU01NU2VsZWN0b3JFeHByZXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1TZWxlY3RvciNnZXRTZWxlY3RvclR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0b3JUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9FWFBSRVNTSU9OOwotCX0KLQotCXZvaWQgcG9zdFNldEF0dHJpYnV0ZSgpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlzdXBlci5wb3N0U2V0QXR0cmlidXRlKCk7Ci0JCVN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJbWFwLnB1dChFWFBSRVNTSU9OX0FESkFDRU5ULnRvTG93ZXJDYXNlKCksICIrIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFwLnB1dChFWFBSRVNTSU9OX0FUVFJJQlVURS50b0xvd2VyQ2FzZSgpLCAiW10iKTsgLy8kTk9OLU5MUy0xJAotCQltYXAucHV0KEVYUFJFU1NJT05fQ0hJTEQudG9Mb3dlckNhc2UoKSwgIj4iKTsgLy8kTk9OLU5MUy0xJAotCQltYXAucHV0KEVYUFJFU1NJT05fREVTQ0VOREFOVC50b0xvd2VyQ2FzZSgpLCAiJyAnIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFwLnB1dChFWFBSRVNTSU9OX1VOSVZFUlNBTC50b0xvd2VyQ2FzZSgpLCAiKiIpOyAvLyROT04tTkxTLTEkCi0KLQkJZlZhbHVlID0gKFN0cmluZykgbWFwLmdldChuYW1lLnRvTG93ZXJDYXNlKCkpOwotCQlpZiAoZlZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVNlbGVjdG9ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU2VsZWN0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZjI0M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU2VsZWN0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NU2VsZWN0b3I7Ci0KLQotYWJzdHJhY3QgY2xhc3MgQ1NTTU1TZWxlY3RvckltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1TZWxlY3RvciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTTU1TZWxlY3RvckltcGwuCi0JICovCi0JcHVibGljIENTU01NU2VsZWN0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGUjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlI2dldFR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfU0VMRUNUT1I7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjZ2V0RXJyb3IoKQotCSAqLwotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9UX0RFRklORUQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NU2VsZWN0b3IjZ2V0U2VsZWN0b3JTdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0b3JTdHJpbmcoKSB7Ci0JCXJldHVybiBmVmFsdWU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldFNlbGVjdG9yU3RyaW5nKCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZWYWx1ZSA9IG51bGw7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TdHJpbmdJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TdHJpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4Y2RlNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU3RyaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVN0cmluZzsKLQotY2xhc3MgQ1NTTU1TdHJpbmdJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NU3RyaW5nIHsKLQotCi0JcHVibGljIENTU01NU3RyaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX1NUUklORzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9UX0RFRklORUQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI3Bvc3RTZXRBdHRyaWJ1dGUoKQotCSAqLwotCS8vIHZvaWQgcG9zdFNldEF0dHJpYnV0ZSgpIHRocm93cyBCYWRJbml0aWFsaXphdGlvbkV4Y2VwdGlvbiB7Ci0JLy8gc3VwZXIucG9zdFNldEF0dHJpYnV0ZSgpOwotCS8vIFN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCS8vIGlmIChuYW1lID09IG51bGwpIHsgdGhyb3cgbmV3IEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uKCk7IH0KLQkvLwotCS8vIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCS8vIG1hcC5wdXQoQ1NTU3RyaW5nSUQuU19BTlkudG9Mb3dlckNhc2UoKSwgIjxhbnk+Iik7IC8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1N0cmluZ0lELlNfQ09VTlRFUl9JREVOVElGSUVSLnRvTG93ZXJDYXNlKCksICI8Y291bnRlcj4iKTsKLQkvLyAvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NTdHJpbmdJRC5TX0ZBTUlMWV9OQU1FLnRvTG93ZXJDYXNlKCksICI8ZmFtaWx5LW5hbWU+Iik7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTU3RyaW5nSUQuU19GT05UX0ZBQ0VfTkFNRS50b0xvd2VyQ2FzZSgpLAotCS8vICI8Zm9udC1mYWNlLW5hbWU+Iik7IC8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1N0cmluZ0lELlNfUEFHRV9JREVOVElGSUVSLnRvTG93ZXJDYXNlKCksCi0JLy8gIjxwYWdlLWlkZW50aWZpZXI+Iik7IC8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1N0cmluZ0lELlNfU1BFQ0lGSUNfVk9JQ0UudG9Mb3dlckNhc2UoKSwKLQkvLyAiPHNwZWNpZmljLXZvaWNlPiIpOyAvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NTdHJpbmdJRC5TX1VSQU5HRS50b0xvd2VyQ2FzZSgpLCAiPHVyYW5nZT4iKTsgLy8kTk9OLU5MUy0xJAotCS8vCi0JLy8gZlZhbHVlID0gKFN0cmluZyltYXAuZ2V0KG5hbWUudG9Mb3dlckNhc2UoKSk7Ci0JLy8gaWYgKGZWYWx1ZSA9PSBudWxsKSB7IHRocm93IG5ldyBCYWRJbml0aWFsaXphdGlvbkV4Y2VwdGlvbigpOyB9Ci0JLy8gfQotCS8vCi0JLy8gLyoKLQkvLyAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKLQkvLyAqLwotCS8vIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JLy8gcmV0dXJuIGZWYWx1ZTsKLQkvLyB9Ci0JLy8KLQkvLyBwcml2YXRlIFN0cmluZyBmVmFsdWUgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU3R5bGVSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU3R5bGVSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzI1N2MzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVN0eWxlUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1TdHlsZVJ1bGU7Ci0KLWNsYXNzIENTU01NU3R5bGVSdWxlSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTVN0eWxlUnVsZSB7Ci0KLQotCXB1YmxpYyBDU1NNTVN0eWxlUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9TVFlMRV9SVUxFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5BTUVfTk9UX0FWQUlMQUJMRTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSBjaGlsZC5nZXRUeXBlKCk7Ci0JCXJldHVybiAodHlwZSA9PSBUWVBFX1BST1BFUlRZIHx8IHR5cGUgPT0gVFlQRV9TRUxFQ1RPUik7Ci0JfQotCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXRDaGlsZENvdW50KCkgPT0gMCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TdHlsZVNoZWV0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU3R5bGVTaGVldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3ZmQwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TdHlsZVNoZWV0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVN0eWxlU2hlZXQ7Ci0KLWNsYXNzIENTU01NU3R5bGVTaGVldEltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1TdHlsZVNoZWV0IHsKLQotCi0JcHVibGljIENTU01NU3R5bGVTaGVldEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9TVFlMRV9TSEVFVDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBOQU1FX05PVF9BVkFJTEFCTEU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gY2hpbGQuZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHR5cGUgPT0gVFlQRV9DSEFSU0VUX1JVTEUgfHwgdHlwZSA9PSBUWVBFX0lNUE9SVF9SVUxFIHx8IHR5cGUgPT0gVFlQRV9QQUdFX1JVTEUgfHwgdHlwZSA9PSBUWVBFX01FRElBX1JVTEUgfHwgdHlwZSA9PSBUWVBFX0ZPTlRfRkFDRV9SVUxFIHx8IHR5cGUgPT0gVFlQRV9TVFlMRV9SVUxFKTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldENoaWxkQ291bnQoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVVuaXRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Vbml0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzE1NGE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVVuaXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVVuaXQ7Ci0KLS8qKgotICogQ1NTTU1Vbml0IDogZW1iZWRkZWQgdHlwZQotICovCi1jbGFzcyBDU1NNTVVuaXRJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NVW5pdCB7Ci0KLQlwdWJsaWMgQ1NTTU1Vbml0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX1VOSVQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Vbml0I2dldFVuaXRTdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VW5pdFN0cmluZygpIHsKLQkJcmV0dXJuIGZWYWx1ZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNwb3N0U2V0QXR0cmlidXRlKCkKLQkgKi8KLQkvLyB2b2lkIHBvc3RTZXRBdHRyaWJ1dGUoKSB0aHJvd3MgQmFkSW5pdGlhbGl6YXRpb25FeGNlcHRpb24gewotCS8vIHN1cGVyLnBvc3RTZXRBdHRyaWJ1dGUoKTsKLQkvLyBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkvLyBpZiAobmFtZSA9PSBudWxsKSB7IHRocm93IG5ldyBCYWRJbml0aWFsaXphdGlvbkV4Y2VwdGlvbigpOyB9Ci0JLy8gTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9DTS50b0xvd2VyQ2FzZSgpLCAiY20iKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9ERUcudG9Mb3dlckNhc2UoKSwgImRlZyIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0VNUy50b0xvd2VyQ2FzZSgpLCAiZW0iKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9FWFMudG9Mb3dlckNhc2UoKSwgImV4Iik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfR1JBRC50b0xvd2VyQ2FzZSgpLCAiZ3JhZCIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0hBU0gudG9Mb3dlckNhc2UoKSwgIiMiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9IWi50b0xvd2VyQ2FzZSgpLCAiSHoiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9JTi50b0xvd2VyQ2FzZSgpLCAiaW4iKTsvLyROT04tTkxTLTEkCi0JLy8gLy8gbWFwLnB1dChDU1NVbml0SUQuVV9JTlRFR0VSLnRvTG93ZXJDYXNlKCksCi0JLy8gIihpbnRlZ2VyKSIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0tIWi50b0xvd2VyQ2FzZSgpLCAia0h6Iik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfTU0udG9Mb3dlckNhc2UoKSwgIm1tIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfTVMudG9Mb3dlckNhc2UoKSwgIm1zIik7Ly8kTk9OLU5MUy0xJAotCS8vIC8vIG1hcC5wdXQoQ1NTVW5pdElELlVfTlVNQkVSLnRvTG93ZXJDYXNlKCksICIobnVtYmVyKSIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX1BDLnRvTG93ZXJDYXNlKCksICJwYyIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX1BFUkNFTlRBR0UudG9Mb3dlckNhc2UoKSwgIiUiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9QVC50b0xvd2VyQ2FzZSgpLCAicHQiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9QWC50b0xvd2VyQ2FzZSgpLCAicHgiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9SQUQudG9Mb3dlckNhc2UoKSwgInJhZCIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX1MudG9Mb3dlckNhc2UoKSwgInMiKTsvLyROT04tTkxTLTEkCi0JLy8gZlZhbHVlID0gKFN0cmluZyltYXAuZ2V0KG5hbWUudG9Mb3dlckNhc2UoKSk7Ci0JLy8gaWYgKGZWYWx1ZSA9PSBudWxsKSB7IHRocm93IG5ldyBCYWRJbml0aWFsaXphdGlvbkV4Y2VwdGlvbigpOyB9Ci0JLy8gfQotCS8qCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRVbml0U3RyaW5nKCk7Ci0JfQotCi0Jdm9pZCBzZXRVbml0U3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQlmVmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgaWYgKGdldFVuaXRTdHJpbmcoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGZWYWx1ZSA9IG51bGw7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTWV0YU1vZGVsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01ldGFNb2RlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0MGRiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTWV0YU1vZGVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NU3R5bGVTaGVldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLQotCi1jbGFzcyBDU1NNZXRhTW9kZWxJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01ldGFNb2RlbCB7Ci0JLy8gY2xhc3MgQ1NTTWV0YU1vZGVsSW1wbCBpbXBsZW1lbnRzIENTU01ldGFNb2RlbCB7Ci0JcHVibGljIENTU01ldGFNb2RlbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZOb2RlUG9vbCA9IG5ldyBOb2RlUG9vbCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfTUVUQV9NT0RFTDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBOQU1FX05PVF9BVkFJTEFCTEU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gY2hpbGQuZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHR5cGUgPT0gVFlQRV9TVFlMRV9TSEVFVCB8fCB0eXBlID09IFRZUEVfQ0FURUdPUlkpOwotCX0KLQotCXB1YmxpYyBDU1NNTVN0eWxlU2hlZXQgZ2V0U3R5bGVTaGVldCgpIHsKLQkJSXRlcmF0b3IgaSA9IGdldENoaWxkTm9kZXMoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpIGkubmV4dCgpOwotCQkJaWYgKG5vZGUuZ2V0VHlwZSgpID09IFRZUEVfU1RZTEVfU0hFRVQpIHsKLQkJCQlyZXR1cm4gKENTU01NU3R5bGVTaGVldCkgbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQkJLy8gcmV0dXJuIGZTdHlsZVNoZWV0OwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRDYXRlZ29yaWVzKCkgewotCQlMaXN0IGNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRDaGlsZE5vZGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpLm5leHQoKTsKLQkJCWlmIChub2RlLmdldFR5cGUoKSA9PSBUWVBFX0NBVEVHT1JZKSB7Ci0JCQkJY2F0ZWdvcmllcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhdGVnb3JpZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQl2b2lkIGxvYWRDb21wbGV0ZWQoKSB7Ci0JCWZOb2RlUG9vbCA9IG51bGw7Ci0JfQotCi0JLy8gTGlzdCBmQ2F0ZWdvcmllcyA9IG51bGw7Ci0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjaXNWYWxpZCgpCi0JICovCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXRTdHlsZVNoZWV0KCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0KLQlOb2RlUG9vbCBnZXROb2RlUG9vbCgpIHsKLQkJcmV0dXJuIGZOb2RlUG9vbDsKLQl9Ci0KLQotCXByaXZhdGUgTm9kZVBvb2wgZk5vZGVQb29sID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NQcm9maWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU1Byb2ZpbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNDVmNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU1Byb2ZpbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydHlSZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNZXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotCi1jbGFzcyBDU1NQcm9maWxlSW1wbCBpbXBsZW1lbnRzIENTU1Byb2ZpbGUgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU01ldGFNb2RlbFByb2ZpbGVJbmZvSW1wbC4KLQkgKi8KLQlwcml2YXRlIENTU1Byb2ZpbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDU1NNZXRhTW9kZWxQcm9maWxlSW5mb0ltcGwuCi0JICovCi0JcHVibGljIENTU1Byb2ZpbGVJbXBsKFN0cmluZyBpZCwgVVJMIHVybCkgewotCQl0aGlzKCk7Ci0JCWZJRCA9IGlkOwotCQlmVVJMID0gdXJsOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDU1NNZXRhTW9kZWxQcm9maWxlSW5mb0ltcGwuCi0JICovCi0JQ1NTUHJvZmlsZUltcGwoU3RyaW5nIGlkLCBVUkwgdXJsLCBTdHJpbmcgcmVsYXRpdmVVUkkpIHsKLQkJc3VwZXIoKTsKLQkJZklEID0gaWQ7Ci0JCWZVUkwgPSB1cmw7Ci0JCWZSZWxhdGl2ZVVSSSA9IHJlbGF0aXZlVVJJOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNZXRhTW9kZWxQcm9maWxlSW5mbyNnZXRQcm9maWxlSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvZmlsZUlEKCkgewotCQlyZXR1cm4gZklEOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNZXRhTW9kZWxQcm9maWxlSW5mbyNnZXRQcm9maWxlTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuIChmTmFtZSA9PSBudWxsKSA/IGZJRCA6IGZOYW1lOwotCX0KLQotCXB1YmxpYyBDU1NNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgewotCQlpZiAoZk1ldGFNb2RlbCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlucHV0U3RyZWFtIGlucHV0ID0gZ2V0UHJvZmlsZVVSTCgpLm9wZW5TdHJlYW0oKTsKLQkJCQlQcm9maWxlTG9hZGVyIGxvYWRlciA9IG5ldyBQcm9maWxlTG9hZGVyKGdldFJlc291cmNlQnVuZGxlKCksIGdldExvZ2dpbmcoKSk7Ci0JCQkJZk1ldGFNb2RlbCA9IGxvYWRlci5sb2FkUHJvZmlsZShpbnB1dCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkNhbm5vdCBvcGVuIHN0cmVhbSBmb3IgcHJvZmlsZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZNZXRhTW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCi0JCUJ1bmRsZSBidW5kbGUgPSBudWxsOwotCQlTdHJpbmcgcGx1Z2luSUQgPSBnZXRPd25lclBsdWdpbklEKCk7Ci0JCWlmIChwbHVnaW5JRCAhPSBudWxsKSB7Ci0JCQlidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJLy8gbmVlZGVkIHRvIHdvcmsgYXJvdW5kIEZpbGVMb2NhdG9yLm9wZW5TdHJlYW0gbm90IGxvb2tpbmcgZm9yCi0JCQkJLy8gZmlsZXMgd2l0aCBKYXZhIG5hbWluZyBjb252ZW50aW9ucyAoQlVHMTAzMzQ1KQotCQkJCUlQYXRoW10gcGF0aHMgPSBnZXRSZXNvdXJjZUJ1bmRsZVBhdGhzKCk7Ci0JCQkJaWYgKHBhdGhzICE9IG51bGwpIHsKLQkJCQkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOwotCQkJCQlpbnQgaSA9IDA7Ci0JCQkJCXdoaWxlIChpIDwgcGF0aHMubGVuZ3RoICYmIGluU3RyZWFtID09IG51bGwpIHsKLQkJCQkJCUlQYXRoIHBhdGggPSBwYXRoc1tpXTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaW5TdHJlYW0gPSBGaWxlTG9jYXRvci5vcGVuU3RyZWFtKGJ1bmRsZSwgcGF0aCwgdHJ1ZSk7Ci0JCQkJCQkJaWYgKGluU3RyZWFtICE9IG51bGwpCi0JCQkJCQkJCXJlc291cmNlQnVuZGxlID0gbmV3IFByb3BlcnR5UmVzb3VyY2VCdW5kbGUoaW5TdHJlYW0pOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJKytpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyB1bmFibGUgdG8gb3BlbiBzdHJlYW0gd2l0aCBjdXJyZW50IHBhdGggc28ganVzdAotCQkJCQkJCS8vIHRyeSBuZXh0IHBhdGgKLQkJCQkJCQkrK2k7Ci0JCQkJCQl9Ci0JCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQlpZiAoaW5TdHJlYW0gIT0gbnVsbCkKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCWluU3RyZWFtLmNsb3NlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHBvdGVudGlhbCByZXNvdXJjZSBidW5kbGUgcGF0aHMgb3IgbnVsbCBpZiB0aGVyZQotCSAqIGFyZSBub25lCi0JICogCi0JICogQHJldHVybiBJUGF0aFtdIG9yIG51bGwKLQkgKi8KLQlwcml2YXRlIElQYXRoW10gZ2V0UmVzb3VyY2VCdW5kbGVQYXRocygpIHsKLQkJSVBhdGhbXSBwYXRocyA9IG5ldyBJUGF0aFswXTsKLQotCQlpZiAoZlJlbGF0aXZlVVJJICE9IG51bGwpIHsKLQkJCS8vIG9yaWdpbmFsIHBhdGggPSBsb2NhdGlvbiBvZiBwcm9maWxlLnhtbCAtIHByb2ZpbGUueG1sCi0JCQlJUGF0aCBvcmlnaW5hbFBhdGggPSBQYXRoLmZyb21PU1N0cmluZyhmUmVsYXRpdmVVUkkpLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQotCQkJU3RyaW5nIGJhc2VOYW1lID0gImNzc3Byb2ZpbGUiOyAvLyROT04tTkxTLTEkIAotCQkJVmVjdG9yIG5hbWVzID0gY2FsY3VsYXRlQnVuZGxlTmFtZXMoYmFzZU5hbWUsIExvY2FsZS5nZXREZWZhdWx0KCkpOwotCi0JCQlpbnQgYSA9IDA7Ci0JCQlwYXRocyA9IG5ldyBJUGF0aFtuYW1lcy5zaXplKCldOwotCQkJZm9yIChpbnQgaSA9IG5hbWVzLnNpemUoKTsgaSA+IDA7IC0taSkgewotCQkJCVN0cmluZyBidW5kbGVOYW1lID0gKFN0cmluZykgbmFtZXMuZ2V0KGkgLSAxKTsKLQkJCQlJUGF0aCBwYXRoID0gb3JpZ2luYWxQYXRoLmFwcGVuZChidW5kbGVOYW1lKS5hZGRGaWxlRXh0ZW5zaW9uKCJwcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlwYXRoc1thXSA9IHBhdGg7Ci0JCQkJKythOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXRoczsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGUgdGhlIGJ1bmRsZXMgYWxvbmcgdGhlIHNlYXJjaCBwYXRoIGZyb20gdGhlIGJhc2UgYnVuZGxlIHRvIHRoZQotCSAqIGJ1bmRsZSBzcGVjaWZpZWQgYnkgYmFzZU5hbWUgYW5kIGxvY2FsZS48YnIgLz4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBiYXNlIGJ1bmRsZSBuYW1lCi0JICogQHBhcmFtIGxvY2FsZQotCSAqICAgICAgICAgICAgdGhlIGxvY2FsZQotCSAqIEBwYXJhbSBuYW1lcwotCSAqICAgICAgICAgICAgdGhlIHZlY3RvciB1c2VkIHRvIHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGJ1bmRsZXMgYWxvbmcgdGhlCi0JICogICAgICAgICAgICBzZWFyY2ggcGF0aC4KLQkgKiAKLQkgKi8KLQlwcml2YXRlIFZlY3RvciBjYWxjdWxhdGVCdW5kbGVOYW1lcyhTdHJpbmcgYmFzZU5hbWUsIExvY2FsZSBsb2NhbGUpIHsKLQkgICAgLy8gdGhpcyBtZXRob2QgY2FuIGJlIGRlbGV0ZWQgYWZ0ZXIgQlVHMTAzMzQ1IGlzIGZpeGVkCi0JCWZpbmFsIFZlY3RvciByZXN1bHQgPSBuZXcgVmVjdG9yKDQpOyAvLyBkZWZhdWx0IHNpemUgNAotCQlmaW5hbCBTdHJpbmcgbGFuZ3VhZ2UgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKLQkJZmluYWwgaW50IGxhbmd1YWdlTGVuZ3RoID0gbGFuZ3VhZ2UubGVuZ3RoKCk7Ci0JCWZpbmFsIFN0cmluZyBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKTsKLQkJZmluYWwgaW50IGNvdW50cnlMZW5ndGggPSBjb3VudHJ5Lmxlbmd0aCgpOwotCQlmaW5hbCBTdHJpbmcgdmFyaWFudCA9IGxvY2FsZS5nZXRWYXJpYW50KCk7Ci0JCWZpbmFsIGludCB2YXJpYW50TGVuZ3RoID0gdmFyaWFudC5sZW5ndGgoKTsKLQotCQlyZXN1bHQuYWRkRWxlbWVudChiYXNlTmFtZSk7IC8vIGF0IGxlYXN0IGFkZCBiYXNlIG5hbWUKLQkJaWYgKGxhbmd1YWdlTGVuZ3RoICsgY291bnRyeUxlbmd0aCArIHZhcmlhbnRMZW5ndGggPT0gMCkgewotCQkJLy8gVGhlIGxvY2FsZSBpcyAiIiwgIiIsICIiLgotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlmaW5hbCBTdHJpbmdCdWZmZXIgdGVtcCA9IG5ldyBTdHJpbmdCdWZmZXIoYmFzZU5hbWUpOwotCQl0ZW1wLmFwcGVuZCgnXycpOwotCQl0ZW1wLmFwcGVuZChsYW5ndWFnZSk7Ci0JCWlmIChsYW5ndWFnZUxlbmd0aCA+IDApIHsKLQkJCXJlc3VsdC5hZGRFbGVtZW50KHRlbXAudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlpZiAoY291bnRyeUxlbmd0aCArIHZhcmlhbnRMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQl0ZW1wLmFwcGVuZCgnXycpOwotCQl0ZW1wLmFwcGVuZChjb3VudHJ5KTsKLQkJaWYgKGNvdW50cnlMZW5ndGggPiAwKSB7Ci0JCQlyZXN1bHQuYWRkRWxlbWVudCh0ZW1wLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJaWYgKHZhcmlhbnRMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQl0ZW1wLmFwcGVuZCgnXycpOwotCQl0ZW1wLmFwcGVuZCh2YXJpYW50KTsKLQkJcmVzdWx0LmFkZEVsZW1lbnQodGVtcC50b1N0cmluZygpKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNZXRhTW9kZWxQcm9maWxlSW5mbyNnZXRQcm9maWxlVVJMKCkKLQkgKi8KLQlwdWJsaWMgVVJMIGdldFByb2ZpbGVVUkwoKSB7Ci0JCXJldHVybiBmVVJMOwotCX0KLQotCXZvaWQgc2V0UHJvZmlsZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZk5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIGZEZWZhdWx0OwotCX0KLQotCXZvaWQgc2V0RGVmYXVsdChib29sZWFuIGlzRGVmYXVsdCkgewotCQlmRGVmYXVsdCA9IGlzRGVmYXVsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE93bmVyUGx1Z2luSUQoKSB7Ci0JCXJldHVybiBmT3duZXJQbHVnaW5JRDsKLQl9Ci0KLQl2b2lkIHNldE93bmVyUGx1Z2luSUQoU3RyaW5nIHBsdWdpbklEKSB7Ci0JCWZPd25lclBsdWdpbklEID0gcGx1Z2luSUQ7Ci0JfQotCi0JLyoqCi0JICogaGlkZGVuIG9wdGlvbiA6IGxvZ2dpbmcKLQkgKi8KLQl2b2lkIHNldExvZ2dpbmcoYm9vbGVhbiBsb2dnaW5nKSB7Ci0JCWZMb2dnaW5nID0gbG9nZ2luZzsKLQl9Ci0KLQlib29sZWFuIGdldExvZ2dpbmcoKSB7Ci0JCXJldHVybiBmTG9nZ2luZzsKLQl9Ci0KLQotCVN0cmluZyBmSUQgPSBudWxsOwotCVN0cmluZyBmTmFtZSA9IG51bGw7Ci0JVVJMIGZVUkwgPSBudWxsOwotCUNTU01ldGFNb2RlbCBmTWV0YU1vZGVsID0gbnVsbDsKLQlTdHJpbmcgZk93bmVyUGx1Z2luSUQgPSBudWxsOwotCWJvb2xlYW4gZkRlZmF1bHQgPSBmYWxzZTsKLQlib29sZWFuIGZMb2dnaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZlJlbGF0aXZlVVJJID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NQcm9maWxlVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU1Byb2ZpbGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYjVlMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU1Byb2ZpbGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGU7Ci0KLQotY2xhc3MgQ1NTUHJvZmlsZVRlc3QgewotCi0KLQkvKioKLQkgKiBUZXN0IHVzZSBvbmx5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpZiAoYXJncy5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQkJQ1NTTWV0YU1vZGVsIG1ldGFtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlDU1NQcm9maWxlIHByb2ZpbGUgPSBuZXcgQ1NTUHJvZmlsZUltcGwoInRlc3QiLCBuZXcgVVJMKGFyZ3NbMF0pKTsgLy8kTk9OLU5MUy0xJAotCQkJbWV0YW1vZGVsID0gcHJvZmlsZS5nZXRNZXRhTW9kZWwoKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJaWYgKG1ldGFtb2RlbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLyoKLQkJICogQ1NTTU1UeXBlQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBDU1NNTVR5cGVDb2xsZWN0b3IoKTsKLQkJICogY29sbGVjdG9yLmFwcGx5KG1ldGFtb2RlbCwgQ1NTTU1Ob2RlLlRZUEVfUFJPUEVSVFkpOyBJdGVyYXRvcgotCQkgKiBpUHJvcGVydHkgPSBjb2xsZWN0b3IuZ2V0Tm9kZXMoKTsgd2hpbGUgKGlQcm9wZXJ0eS5oYXNOZXh0KCkpIHsKLQkJICogQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKWlQcm9wZXJ0eS5uZXh0KCk7Ci0JCSAqIFN5c3RlbS5vdXQucHJpbnRsbigiUHJvcGVydHkgIiArIG5vZGUuZ2V0TmFtZSgpICsgIiBjYW4gY29udGFpbjoiKTsKLQkJICogLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkIEl0ZXJhdG9yIGlWYWx1ZSA9Ci0JCSAqIG5vZGUuZ2V0RGVzY2VuZGFudHMoKTsgd2hpbGUgKGlWYWx1ZS5oYXNOZXh0KCkpIHsKLQkJICogZGVidWdPdXQoKENTU01NTm9kZSlpVmFsdWUubmV4dCgpLCAwLCBmYWxzZSk7IH0gfQotCQkgKi8KLQkJZGVidWdPdXQobWV0YW1vZGVsLCAwLCB0cnVlKTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBkZWJ1Z091dChDU1NNTU5vZGUgbm9kZSwgaW50IGRlcHRoLCBib29sZWFuIHJlY3Vyc2l2ZSkgewotCQlTdHJpbmcgdHlwZSA9IG5vZGUuZ2V0VHlwZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlcHRoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50KCJbICIgKyBub2RlLmdldE5hbWUoKSArICIoIiArIHR5cGUgKyAiKSBdIik7IC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCWlmICh0eXBlID09IENTU01NTm9kZS5UWVBFX1VOSVQgfHwgdHlwZSA9PSBDU1NNTU5vZGUuVFlQRV9LRVlXT1JEIHx8IHR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfRlVOQ1RJT04gfHwgdHlwZSA9PSBDU1NNTU5vZGUuVFlQRV9TRUxFQ1RPUikgewotCQkJU3lzdGVtLm91dC5wcmludCgiIC0+ICIgKyBub2RlLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0KLQkJaWYgKHJlY3Vyc2l2ZSkgewotCQkJamF2YS51dGlsLkl0ZXJhdG9yIGlOb2RlID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQl3aGlsZSAoaU5vZGUuaGFzTmV4dCgpKSB7Ci0JCQkJZGVidWdPdXQoKENTU01NTm9kZSkgaU5vZGUubmV4dCgpLCBkZXB0aCArIDEsIHRydWUpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL01ldGFNb2RlbEVycm9ycy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL01ldGFNb2RlbEVycm9ycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2EzODFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9NZXRhTW9kZWxFcnJvcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW50ZXJmYWNlIE1ldGFNb2RlbEVycm9ycyB7Ci0KLQlzdGF0aWMgZmluYWwgc2hvcnQgTk9fRVJST1IgPSAwOwotCi0JLy8gTUFTSwotCXN0YXRpYyBmaW5hbCBzaG9ydCBNQVNLX1dBUk5JTkcgPSAweDEwMDA7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IE1BU0tfRVJST1IgPSAweDIwMDA7Ci0KLQkvLyBFUlJPUgotCXN0YXRpYyBmaW5hbCBzaG9ydCBFUlJPUl9OT1RfREVGSU5FRCA9IE1BU0tfRVJST1IgKyAweDAxOwotCXN0YXRpYyBmaW5hbCBzaG9ydCBFUlJPUl9JTlZBTElEX05BTUUgPSBNQVNLX0VSUk9SICsgMHgwNDsKLQlzdGF0aWMgZmluYWwgc2hvcnQgRVJST1JfSU5WQUlMRF9DSElMRCA9IE1BU0tfRVJST1IgKyAweDAyOwotCXN0YXRpYyBmaW5hbCBzaG9ydCBFUlJPUl9OT19DSElMRCA9IE1BU0tfRVJST1IgKyAweDA4OwotCS8vIHN0YXRpYyBmaW5hbCBzaG9ydCBFUlJPUl9OT19FU1NFTlRJQUxfQ0hJTEQgPSBNQVNLX0VSUk9SICsgMHgxMAotCi0JLy8gV0FSTklORwotCXN0YXRpYyBmaW5hbCBzaG9ydCBXQVJOSU5HX0hBU19OT19DSElMRCA9IE1BU0tfV0FSTklORyArIDB4MDE7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvTm9kZVBvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Ob2RlUG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWNiNTY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Ob2RlUG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLQotY2xhc3MgTm9kZVBvb2wgewotCi0JTm9kZVBvb2woKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRpYWxpemVDbGFzc05hbWVUYWJsZSgpOwotCX0KLQotCUNTU01NTm9kZUltcGwgZ2V0Tm9kZShTdHJpbmcgdGFnTmFtZSwgU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCWlmIChub2RlTmFtZSAhPSBudWxsKSB7Ci0JCQlub2RlTmFtZSA9IG5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIGNsYXNzTmFtZXMuZ2V0KHRhZ05hbWUpOwotCQlpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCU1hcCBub2RlcyA9IChNYXApIG5vZGVSZWdpc3RyeS5nZXQoY2xhc3NOYW1lKTsKLQkJaWYgKG5vZGVzID09IG51bGwpIHsKLQkJCW5vZGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJCW5vZGVSZWdpc3RyeS5wdXQoY2xhc3NOYW1lLCBub2Rlcyk7Ci0JCX0KLQkJQ1NTTU1Ob2RlSW1wbCBub2RlID0gKENTU01NTm9kZUltcGwpIG5vZGVzLmdldChub2RlTmFtZSk7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCW5vZGUgPSBjcmVhdGVOZXdOb2RlKGNsYXNzTmFtZSk7Ci0JCQlub2Rlcy5wdXQobm9kZU5hbWUsIG5vZGUpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXByaXZhdGUgQ1NTTU1Ob2RlSW1wbCBjcmVhdGVOZXdOb2RlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJQ1NTTU1Ob2RlSW1wbCBub2RlID0gbnVsbDsKLQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQljbGFzc05hbWUgPSBnZXRQYWNrYWdlTmFtZSgpICsgIi4iICsgY2xhc3NOYW1lOyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCQkJCW5vZGUgPSAoQ1NTTU1Ob2RlSW1wbCkgQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQl9Ci0JCQljYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCWNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGNsYXNzTmFtZSArICIgaXMgQ3JlYXRlZCIpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBFcnJvciBjaGVjayBmdW5jdGlvbjogZmluZCBub2RlcyB0aGF0IGFyZSBub3QgcmVmZXJyZWQgYnkgYW55IG5vZGUKLQkgKi8KLQlJdGVyYXRvciBnZXRTdHJheU5vZGVzKCkgewotCQlMaXN0IHN0cmF5Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGlNYXAgPSBub2RlUmVnaXN0cnkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGlNYXAuaGFzTmV4dCgpKSB7Ci0JCQlNYXAgbm9kZXMgPSAoTWFwKSBpTWFwLm5leHQoKTsKLQkJCUl0ZXJhdG9yIGlOb2RlID0gbm9kZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpTm9kZS5oYXNOZXh0KCkpIHsKLQkJCQlDU1NNTU5vZGVJbXBsIG5vZGUgPSAoQ1NTTU1Ob2RlSW1wbCkgaU5vZGUubmV4dCgpOwotCQkJCWlmIChub2RlLmdldFJlZmVyZW5jZUNvdW50KCkgPT0gMCkgewotCQkJCQlzdHJheU5vZGVzLmFkZChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0cmF5Tm9kZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvLyBUaGlzIGNsYXNzIG11c3Qgbm90IGJlIGlubmVyIGNsYXNzIDopCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0JCWlmIChmUGFja2FnZU5hbWUgPT0gbnVsbCkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJaW50IHBvcyA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKDAgPCBwb3MpIHsKLQkJCQlmUGFja2FnZU5hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIHBvcyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmUGFja2FnZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBmUGFja2FnZU5hbWU7Ci0JfQotCi0Jdm9pZCBpbml0aWFsaXplQ2xhc3NOYW1lVGFibGUoKSB7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5TVFlMRVNIRUVUX0RFRiwgQ0xBU1NfU1RZTEVfU0hFRVQpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuQ0hBUlNFVF9SVUxFX0RFRiwgQ0xBU1NfQ0hBUlNFVF9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkNIQVJTRVRfUlVMRSwgQ0xBU1NfQ0hBUlNFVF9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkZPTlRGQUNFX1JVTEVfREVGLCBDTEFTU19GT05UX0ZBQ0VfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5GT05URkFDRV9SVUxFLCBDTEFTU19GT05UX0ZBQ0VfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5JTVBPUlRfUlVMRV9ERUYsIENMQVNTX0lNUE9SVF9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLklNUE9SVF9SVUxFLCBDTEFTU19JTVBPUlRfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5NRURJQV9SVUxFX0RFRiwgQ0xBU1NfTUVESUFfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5NRURJQV9SVUxFLCBDTEFTU19NRURJQV9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlBBR0VfUlVMRV9ERUYsIENMQVNTX1BBR0VfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5QQUdFX1JVTEUsIENMQVNTX1BBR0VfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5TVFlMRV9SVUxFX0RFRiwgQ0xBU1NfU1RZTEVfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5TVFlMRV9SVUxFLCBDTEFTU19TVFlMRV9SVUxFKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlBST1BFUlRZX0RFRiwgQ0xBU1NfUFJPUEVSVFkpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuUFJPUEVSVFksIENMQVNTX1BST1BFUlRZKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkRFU0NSSVBUT1JfREVGLCBDTEFTU19ERVNDUklQVE9SKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkRFU0NSSVBUT1IsIENMQVNTX0RFU0NSSVBUT1IpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuQ09OVEFJTkVSX0RFRiwgQ0xBU1NfQ09OVEFJTkVSKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkNPTlRBSU5FUiwgQ0xBU1NfQ09OVEFJTkVSKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLk5VTUJFUl9ERUYsIENMQVNTX05VTUJFUik7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5OVU1CRVIsIENMQVNTX05VTUJFUik7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5LRVlXT1JEX0RFRiwgQ0xBU1NfS0VZV09SRCk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5LRVlXT1JELCBDTEFTU19LRVlXT1JEKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlVOSVQsIENMQVNTX1VOSVQpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuVU5JVF9ERUYsIENMQVNTX1VOSVQpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuRlVOQ1RJT04sIENMQVNTX0ZVTkNUSU9OKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkZVTkNUSU9OX0RFRiwgQ0xBU1NfRlVOQ1RJT04pOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuU0VMRUNUT1JfRVhQUkVTU0lPTiwgQ0xBU1NfU0VMRUNUT1JfRVhQUkVTU0lPTik7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5QU0VVRE9fRUxFTUVOVCwgQ0xBU1NfUFNFVURPX0VMRU1FTlQpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuUFNFVURPX0VMRU1FTlRfREVGLCBDTEFTU19QU0VVRE9fRUxFTUVOVCk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5QU0VVRE9fQ0xBU1MsIENMQVNTX1BTRVVET19DTEFTUyk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5QU0VVRE9fQ0xBU1NfREVGLCBDTEFTU19QU0VVRE9fQ0xBU1MpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuU1RSSU5HLCBDTEFTU19TVFJJTkcpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuQ0FURUdPUllfREVGLCBDTEFTU19DQVRFR09SWSk7Ci0JfQotCi0KLQlwcml2YXRlIFN0cmluZyBmUGFja2FnZU5hbWU7Ci0JLyoKLQkgKiBDb252ZXJzaW9uIFRhYmxlcyBub2RlUmVnaXN0cnkgOiBjbGFzcyBuYW1lIC0+IGhhc2ggb2Ygbm9kZSBpbnN0YW5jZXMKLQkgKiBjbGFzc05hbWVzIDogUHJvZmlsZSBUYWcgbmFtZSAtPiBqYXZhIGNsYXNzIG5hbWUKLQkgKi8KLQlwcml2YXRlIE1hcCBub2RlUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgTWFwIGNsYXNzTmFtZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1NUWUxFX1NIRUVUID0gIkNTU01NU3R5bGVTaGVldEltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0NIQVJTRVRfUlVMRSA9ICJDU1NNTUNoYXJzZXRSdWxlSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfRk9OVF9GQUNFX1JVTEUgPSAiQ1NTTU1Gb250RmFjZVJ1bGVJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19JTVBPUlRfUlVMRSA9ICJDU1NNTUltcG9ydFJ1bGVJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19NRURJQV9SVUxFID0gIkNTU01NTWVkaWFSdWxlSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfUEFHRV9SVUxFID0gIkNTU01NUGFnZVJ1bGVJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19TVFlMRV9SVUxFID0gIkNTU01NU3R5bGVSdWxlSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfUFJPUEVSVFkgPSAiQ1NTTU1Qcm9wZXJ0eUltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0RFU0NSSVBUT1IgPSAiQ1NTTU1EZXNjcmlwdG9ySW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfQ09OVEFJTkVSID0gIkNTU01NQ29udGFpbmVySW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfTlVNQkVSID0gIkNTU01NTnVtYmVySW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfS0VZV09SRCA9ICJDU1NNTUtleXdvcmRJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19VTklUID0gIkNTU01NVW5pdEltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0ZVTkNUSU9OID0gIkNTU01NRnVuY3Rpb25JbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19TVFJJTkcgPSAiQ1NTTU1TdHJpbmdJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19DQVRFR09SWSA9ICJDU1NNTUNhdGVnb3J5SW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfU0VMRUNUT1JfRVhQUkVTU0lPTiA9ICJDU1NNTVNlbGVjdG9yRXhwcmVzc2lvbkltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1BTRVVET19DTEFTUyA9ICJDU1NNTVBzZXVkb0NsYXNzSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfUFNFVURPX0VMRU1FTlQgPSAiQ1NTTU1Qc2V1ZG9FbGVtZW50SW1wbCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Qcm9maWxlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1Byb2ZpbGVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYTZiMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1Byb2ZpbGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVNlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGVSZWdpc3RyeTsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0KLWNsYXNzIFByb2ZpbGVIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCi0JcHVibGljIFByb2ZpbGVIYW5kbGVyKENTU01ldGFNb2RlbEltcGwgbWV0YW1vZGVsLCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSwgYm9vbGVhbiBsb2dnaW5nKSB7Ci0JCXN1cGVyKCk7Ci0JCWZNZXRhTW9kZWwgPSBtZXRhbW9kZWw7Ci0JCWZOb2RlUG9vbCA9IG1ldGFtb2RlbC5nZXROb2RlUG9vbCgpOwotCQlmUmVzb3VyY2VCdW5kbGUgPSByZXNvdXJjZUJ1bmRsZTsKLQkJZkxvZ2dpbmcgPSBsb2dnaW5nOwotCX0KLQotCXB1YmxpYyBQcm9maWxlSGFuZGxlcihDU1NNZXRhTW9kZWxJbXBsIG1ldGFtb2RlbCwgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUpIHsKLQkJc3VwZXIoKTsKLQkJZk1ldGFNb2RlbCA9IG1ldGFtb2RlbDsKLQkJZk5vZGVQb29sID0gbWV0YW1vZGVsLmdldE5vZGVQb29sKCk7Ci0JCWZSZXNvdXJjZUJ1bmRsZSA9IHJlc291cmNlQnVuZGxlOwotCQlmTG9nZ2luZyA9IGZhbHNlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKGtleS5lcXVhbHMoIiUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JCWlmICgha2V5LnN0YXJ0c1dpdGgoIiUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JCWlmIChrZXkuc3RhcnRzV2l0aCgiJSUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4ga2V5LnN1YnN0cmluZygxKTsKLQkJfQotCi0JCWlmIChmUmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5LnN1YnN0cmluZygxKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInN0YXJ0RG9jdW1lbnQiKTsKLQkJLy8gZk5vZGVTdGFjay5wdXNoKG1ldGFtb2RlbCk7Ci0JCS8vIGZDdXJyZW50Tm9kZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJbmV3IEVycm9yQ29ycmVjdG9yKCkuZG9Db3JyZWN0KGZNZXRhTW9kZWwpOwotCQlpZiAoZkxvZ2dpbmcpIHsKLQkJCUl0ZXJhdG9yIGkgPSBmTm9kZVBvb2wuZ2V0U3RyYXlOb2RlcygpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpLm5leHQoKTsKLQkJCQlTdHJpbmcgc3RyID0gIltDU1NQcm9maWxlIFdhcm5pbmddICIgKyBub2RlLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN0ciArPSAiKCIgKyBub2RlLmdldFR5cGUoKSArICIpIGlzIG5vdCByZWZlcnJlZCBieSBhbnkgbm9kZS4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCBzdHIpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihzdHIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJVGFnTm9kZSB0YWdOb2RlID0gbnVsbDsKLQkJQ1NTTU1Ob2RlSW1wbCBwYXJlbnROb2RlID0gbnVsbDsKLQkJaWYgKDAgPCBmTm9kZVN0YWNrLnNpemUoKSkgewotCQkJdGFnTm9kZSA9IChUYWdOb2RlKSBmTm9kZVN0YWNrLnBlZWsoKTsKLQkJCXBhcmVudE5vZGUgPSB0YWdOb2RlLm5vZGU7Ci0JCX0KLQotCQlDU1NNTU5vZGVJbXBsIG5vZGUgPSBudWxsOwotCQlpZiAocU5hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5QUk9GSUxFX0lNUE9SVCkpIHsgLy8gaW1wb3J0Ci0JCQlTdHJpbmcgcHJvZmlsZU5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfTkFNRV9SRUZFUkVOQ0UpOwotCQkJaW1wb3J0UHJvZmlsZShwcm9maWxlTmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAoaXNEZWZpbml0aW9uKHFOYW1lKSkgeyAvLyBub2RlIGNyZWF0aW9uCi0JCQlTdHJpbmcgbm9kZU5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfTkFNRV9ERUZJTklUSU9OKTsKLQkJCW5vZGUgPSBmTm9kZVBvb2wuZ2V0Tm9kZShxTmFtZSwgbm9kZU5hbWUpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBvdmVyd3JpdGUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfT1ZFUldSSVRFKTsKLQkJCQlpZiAob3ZlcndyaXRlID09IG51bGwgfHwgb3ZlcndyaXRlLmVxdWFscyhBVFRSX1ZBTFVFX09WRVJXUklURV9GQUxTRSkpIHsKLQkJCQkJbm9kZS5yZW1vdmVBbGxDaGlsZE5vZGVzKCk7Ci0JCQkJfQotCQkJCU1hcCBhdHRyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlhdHRyTWFwLnB1dChhdHRyaWJ1dGVzLmdldFFOYW1lKGkpLCBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpKTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJbm9kZS5pbml0aWFsaXplQXR0cmlidXRlKGF0dHJNYXApOwotCQkJCX0KLQkJCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSA9PSBudWxsKSB7IC8vIG5vZGUgcmVmZXJlbmNlCi0JCQlTdHJpbmcgbm9kZU5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfTkFNRV9SRUZFUkVOQ0UpOwotCQkJbm9kZSA9IGZOb2RlUG9vbC5nZXROb2RlKHFOYW1lLCBub2RlTmFtZSk7Ci0JCX0KLQotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAocGFyZW50Tm9kZSAhPSBudWxsICYmIHBhcmVudE5vZGUuY2FuQ29udGFpbihub2RlKSkgewotCQkJCVN0cmluZyBlbmFibGVkID0gYXR0cmlidXRlcy5nZXRWYWx1ZShBVFRSX0VOQUJMRUQpOwotCQkJCWlmIChlbmFibGVkICE9IG51bGwgJiYgZW5hYmxlZC5lcXVhbHMoQVRUUl9WQUxVRV9FTkFCTEVEX0ZBTFNFKSkgewotCQkJCQlwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlLmdldFR5cGUoKSA9PSBDU1NNTU5vZGUuVFlQRV9TVFlMRV9TSEVFVCB8fCBub2RlLmdldFR5cGUoKSA9PSBDU1NNTU5vZGUuVFlQRV9DQVRFR09SWSkgewotCQkJCWZNZXRhTW9kZWwuYXBwZW5kQ2hpbGQobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoZkxvZ2dpbmcgJiYgcGFyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBwYXJlbnROb2RlLmdldFR5cGUoKSArICIgY2Fubm90IGNvbnRhaW4gIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJbm9kZS5nZXRUeXBlKCkgKyAiICgiICsgcU5hbWUgKyAiKSIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWZOb2RlU3RhY2sucHVzaChuZXcgVGFnTm9kZShxTmFtZSwgKG5vZGUgIT0gbnVsbCkgPyBub2RlIDogcGFyZW50Tm9kZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJZk5vZGVTdGFjay5wb3AoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJVGFnTm9kZSB0YWdOb2RlID0gKFRhZ05vZGUpIGZOb2RlU3RhY2sucGVlaygpOwotCQlTdHJpbmcgdGFnTmFtZSA9IHRhZ05vZGUudGFnOwotCQlpZiAodGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLktFWVdPUkRfVkFMVUUpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5VTklUX1ZBTFVFKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuRlVOQ1RJT05fVkFMVUUpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5TRUxFQ1RPUl9WQUxVRSkgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLkRFU0NSSVBUSU9OKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuQ0FQVElPTikpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJYnVmLmFwcGVuZChjaFtzdGFydCArIGldKTsKLQkJCX0KLQkJCVN0cmluZyB2YWx1ZSA9IGdldFJlc291cmNlU3RyaW5nKGJ1Zi50b1N0cmluZygpLnRyaW0oKSk7Ci0JCQlDU1NNTU5vZGVJbXBsIG5vZGUgPSB0YWdOb2RlLm5vZGU7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX0tFWVdPUkQgJiYgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLktFWVdPUkRfVkFMVUUpKSB7Ci0JCQkJCSgoQ1NTTU1LZXl3b3JkSW1wbCkgbm9kZSkuc2V0S2V5d29yZFN0cmluZyh2YWx1ZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGUuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX1VOSVQgJiYgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlVOSVRfVkFMVUUpKSB7Ci0JCQkJCSgoQ1NTTU1Vbml0SW1wbCkgbm9kZSkuc2V0VW5pdFN0cmluZyh2YWx1ZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGUuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX0ZVTkNUSU9OICYmIHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5GVU5DVElPTl9WQUxVRSkpIHsKLQkJCQkJKChDU1NNTUZ1bmN0aW9uSW1wbCkgbm9kZSkuc2V0RnVuY3Rpb25TdHJpbmcodmFsdWUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlLmdldFR5cGUoKSA9PSBDU1NNTU5vZGUuVFlQRV9TRUxFQ1RPUiAmJiAoKENTU01NU2VsZWN0b3IpIG5vZGUpLmdldFNlbGVjdG9yVHlwZSgpID09IENTU01NU2VsZWN0b3IuVFlQRV9QU0VVRE9fRUxFTUVOVCkgewotCQkJCQkoKENTU01NUHNldWRvRWxlbWVudEltcGwpIG5vZGUpLnNldFNlbGVjdG9yU3RyaW5nKHZhbHVlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfU0VMRUNUT1IgJiYgKChDU1NNTVNlbGVjdG9yKSBub2RlKS5nZXRTZWxlY3RvclR5cGUoKSA9PSBDU1NNTVNlbGVjdG9yLlRZUEVfUFNFVURPX0NMQVNTKSB7Ci0JCQkJCSgoQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwpIG5vZGUpLnNldFNlbGVjdG9yU3RyaW5nKHZhbHVlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfQ0FURUdPUlkgJiYgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLkNBUFRJT04pKSB7Ci0JCQkJCSgoQ1NTTU1DYXRlZ29yeUltcGwpIG5vZGUpLnNldENhcHRpb24odmFsdWUpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuREVTQ1JJUFRJT04pKSB7Ci0JCQkJCW5vZGUuc2V0RGVzY3JpcHRpb24odmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RlZmluaXRpb24oU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuICh0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuU1RZTEVTSEVFVF9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5DSEFSU0VUX1JVTEVfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuSU1QT1JUX1JVTEVfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuUEFHRV9SVUxFX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLk1FRElBX1JVTEVfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuRk9OVEZBQ0VfUlVMRV9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5TVFlMRV9SVUxFX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLktFWVdPUkRfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuTlVNQkVSX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlBST1BFUlRZX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLkRFU0NSSVBUT1JfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuQ09OVEFJTkVSX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlVOSVRfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuRlVOQ1RJT05fREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuU1RSSU5HKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuQ0FURUdPUllfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuUFNFVURPX0NMQVNTX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlBTRVVET19FTEVNRU5UX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlNFTEVDVE9SX0VYUFJFU1NJT04pIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5TRVBBUkFUT1IpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW1wb3J0UHJvZmlsZShTdHJpbmcgcHJvZmlsZU5hbWUpIHsKLQkJVVJMIHByb2ZpbGVVUkwgPSBudWxsOwotCQlDU1NQcm9maWxlUmVnaXN0cnkgcmVnID0gQ1NTUHJvZmlsZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCUNTU1Byb2ZpbGUgcHJvZmlsZSA9IHJlZy5nZXRQcm9maWxlKHByb2ZpbGVOYW1lKTsKLQkJaWYgKHByb2ZpbGUgIT0gbnVsbCkgewotCQkJLy8gZmlyc3Q6IGZpbmQgVVJMIGJ5IElECi0JCQlwcm9maWxlVVJMID0gcHJvZmlsZS5nZXRQcm9maWxlVVJMKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBzZWNvbmQ6IGZpbmQgVVJMIGJ5IGZpbGVuYW1lIG9mIHByb2ZpbGUgVVJMCi0JCQlJdGVyYXRvciBpID0gcmVnLmdldFByb2ZpbGVzKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlwcm9maWxlID0gKENTU1Byb2ZpbGUpIGkubmV4dCgpOwotCQkJCVVSTCB1cmwgPSBwcm9maWxlLmdldFByb2ZpbGVVUkwoKTsKLQkJCQlpZiAodXJsLmdldEZpbGUoKS5lbmRzV2l0aChwcm9maWxlTmFtZSkpIHsKLQkJCQkJcHJvZmlsZVVSTCA9IHVybDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChwcm9maWxlVVJMID09IG51bGwpIHsKLQkJCS8vIGZpbmFsOiBpdCBtYXkgYmUgdXJsIGl0c2VsZgotCQkJdHJ5IHsKLQkJCQlwcm9maWxlVVJMID0gbmV3IFVSTChwcm9maWxlTmFtZSk7Ci0JCQl9Ci0JCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCWlmIChwcm9maWxlVVJMICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJUHJvZmlsZUxvYWRlci5sb2FkUHJvZmlsZShmTWV0YU1vZGVsLCBwcm9maWxlVVJMLm9wZW5TdHJlYW0oKSwgZlJlc291cmNlQnVuZGxlLCBmTG9nZ2luZyk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkNhbm5vdCBvcGVuIHN0cmVhbSBmb3IgcHJvZmlsZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQllKTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIFRhZ05vZGUgewotCi0JCVN0cmluZyB0YWcgPSBudWxsOwotCQlDU1NNTU5vZGVJbXBsIG5vZGUgPSBudWxsOwotCi0JCVRhZ05vZGUoU3RyaW5nIHRhZywgQ1NTTU1Ob2RlSW1wbCBub2RlKSB7Ci0JCQl0aGlzLnRhZyA9IHRhZzsKLQkJCXRoaXMubm9kZSA9IG5vZGU7Ci0JCX0KLQl9Ci0KLQljbGFzcyBFcnJvckNvcnJlY3RvciB7Ci0KLQkJdm9pZCBkb0NvcnJlY3QoQ1NTTU1Ob2RlSW1wbCBub2RlKSB7Ci0JCQlJdGVyYXRvciBpID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlBcnJheUxpc3QgZXJyb3JOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUNTU01NTm9kZUltcGwgY2hpbGQgPSAoQ1NTTU1Ob2RlSW1wbCkgaS5uZXh0KCk7Ci0JCQkJZG9Db3JyZWN0KGNoaWxkKTsKLQkJCQlzaG9ydCBlcnJvciA9IGNoaWxkLmdldEVycm9yKCk7Ci0JCQkJaWYgKGVycm9yICE9IE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUikgewotCQkJCQkvLyBub2RlLnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQkJZXJyb3JOb2Rlcy5hZGQoY2hpbGQpOwotCi0JCQkJCVN0cmluZyBzdHIgPSAiW0NTU1Byb2ZpbGUgRXJyb3JdICIgKyBub2RlLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzdHIgKz0gIigiICsgbm9kZS5nZXRUeXBlKCkgKyAiKSBjb250YWlucyBlcnJvciBub2RlOiAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJc3RyICs9IGNoaWxkLmdldE5hbWUoKSArICIoIiArIGNoaWxkLmdldFR5cGUoKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXN0ciArPSAiIC0gZXJyb3IgY29kZSA9ICIgKyBlcnJvcjsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoZkxvZ2dpbmcpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBzdHIpOwotCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHN0cik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpbnQgZXJyb3JTaXplID0gZXJyb3JOb2Rlcy5zaXplKCk7Ci0JCQlpZiAoZXJyb3JTaXplID4gMCkgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXJyb3JTaXplOyBqKyspIHsKLQkJCQkJQ1NTTU1Ob2RlSW1wbCBlcnJvck5vZGUgPSAoQ1NTTU1Ob2RlSW1wbCkgZXJyb3JOb2Rlcy5nZXQoaik7Ci0JCQkJCW5vZGUucmVtb3ZlQ2hpbGQoZXJyb3JOb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgQ1NTTWV0YU1vZGVsSW1wbCBmTWV0YU1vZGVsID0gbnVsbDsKLQlwcml2YXRlIE5vZGVQb29sIGZOb2RlUG9vbCA9IG51bGw7Ci0JcHJpdmF0ZSBTdGFjayBmTm9kZVN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JYm9vbGVhbiBmTG9nZ2luZyA9IGZhbHNlOwotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgZlJlc291cmNlQnVuZGxlID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX05BTUVfREVGSU5JVElPTiA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX05BTUVfUkVGRVJFTkNFID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfT1ZFUldSSVRFID0gIm92ZXJ3cml0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9FTkFCTEVEID0gImVuYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfVkFMVUVfT1ZFUldSSVRFX0ZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX1ZBTFVFX0VOQUJMRURfRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUtleXdvcmRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUtleXdvcmRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNzcxMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1Byb2ZpbGVLZXl3b3Jkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbnRlcmZhY2UgUHJvZmlsZUtleXdvcmRzIHsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQ1NTX1BST0ZJTEUgPSAiY3NzLXByb2ZpbGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQUk9GSUxFX0lNUE9SVCA9ICJwcm9maWxlLWltcG9ydCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNUWUxFU0hFRVRfREVGID0gInN0eWxlc2hlZXQtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQ0hBUlNFVF9SVUxFID0gImNoYXJzZXQtcnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIElNUE9SVF9SVUxFID0gImltcG9ydC1ydWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUEFHRV9SVUxFID0gInBhZ2UtcnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1FRElBX1JVTEUgPSAibWVkaWEtcnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZPTlRGQUNFX1JVTEUgPSAiZm9udGZhY2UtcnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNUWUxFX1JVTEUgPSAic3R5bGUtcnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIENIQVJTRVRfUlVMRV9ERUYgPSAiY2hhcnNldC1ydWxlLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIElNUE9SVF9SVUxFX0RFRiA9ICJpbXBvcnQtcnVsZS1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQQUdFX1JVTEVfREVGID0gInBhZ2UtcnVsZS1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBNRURJQV9SVUxFX0RFRiA9ICJtZWRpYS1ydWxlLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZPTlRGQUNFX1JVTEVfREVGID0gImZvbnRmYWNlLXJ1bGUtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU1RZTEVfUlVMRV9ERUYgPSAic3R5bGUtcnVsZS1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGVU5DVElPTl9ERUYgPSAiZnVuY3Rpb24tZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRlVOQ1RJT05fVkFMVUUgPSAiZnVuY3Rpb24tdmFsdWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLRVlXT1JEX0RFRiA9ICJrZXl3b3JkLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtFWVdPUkRfVkFMVUUgPSAia2V5d29yZC12YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTlVNQkVSX0RFRiA9ICJudW1iZXItZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVU5JVCA9ICJ1bml0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVU5JVF9ERUYgPSAidW5pdC1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVTklUX1ZBTFVFID0gInVuaXQtdmFsdWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBDT05UQUlORVJfREVGID0gImNvbnRhaW5lci1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBDQVRFR09SWV9ERUYgPSAiY2F0ZWdvcnktZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FQVElPTiA9ICJjYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUEVSVFlfREVGID0gInByb3BlcnR5LWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIERFU0NSSVBUT1JfREVGID0gImRlc2NyaXB0b3ItZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU0VMRUNUT1JfRVhQUkVTU0lPTiA9ICJzZWxlY3Rvci1leHByZXNzaW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUFNFVURPX0NMQVNTID0gInBzZXVkby1jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBTRVVET19FTEVNRU5UID0gInBzZXVkby1lbGVtZW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUFNFVURPX0NMQVNTX0RFRiA9ICJwc2V1ZG8tY2xhc3MtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUFNFVURPX0VMRU1FTlRfREVGID0gInBzZXVkby1lbGVtZW50LWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNFTEVDVE9SX1ZBTFVFID0gInNlbGVjdG9yLXZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTlVNQkVSID0gIm51bWJlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtFWVdPUkQgPSAia2V5d29yZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZVTkNUSU9OID0gImZ1bmN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQ09OVEFJTkVSID0gImNvbnRhaW5lciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNUUklORyA9ICJzdHJpbmciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTRVBBUkFUT1IgPSAic2VwYXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUEVSVFkgPSAicHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBERVNDUklQVE9SID0gImRlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUxvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1Byb2ZpbGVMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ0MmFiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTWV0YU1vZGVsOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci0KLQotCi1jbGFzcyBQcm9maWxlTG9hZGVyIHsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFByb2ZpbGVMb2FkZXIuCi0JICovCi0JcHJpdmF0ZSBQcm9maWxlTG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCVByb2ZpbGVMb2FkZXIoUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUsIGJvb2xlYW4gbG9nZ2luZykgewotCQl0aGlzKCk7Ci0JCWZSZXNvdXJjZUJ1bmRsZSA9IHJlc291cmNlQnVuZGxlOwotCQlmTG9nZ2luZyA9IGxvZ2dpbmc7Ci0JfQotCi0Jc3RhdGljIHZvaWQgbG9hZFByb2ZpbGUoQ1NTTWV0YU1vZGVsSW1wbCBtZXRhbW9kZWwsIElucHV0U3RyZWFtIGlucHV0LCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSwgYm9vbGVhbiBsb2dnaW5nKSB7Ci0JCXRyeSB7Ci0JCQlYTUxSZWFkZXIgeG1sUmVhZGVyID0gWE1MUmVhZGVyVXRpbC5jcmVhdGVYTUxSZWFkZXIoUEFSU0VSX05BTUUpOwotCQkJLy8gWE1MUmVhZGVyRmFjdG9yeS5jcmVhdGVYTUxSZWFkZXIoUEFSU0VSX05BTUUpOwotCQkJeG1sUmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKG5ldyBQcm9maWxlSGFuZGxlcihtZXRhbW9kZWwsIHJlc291cmNlQnVuZGxlLCBsb2dnaW5nKSk7Ci0JCQl4bWxSZWFkZXIucGFyc2UobmV3IElucHV0U291cmNlKGlucHV0KSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JQ1NTTWV0YU1vZGVsIGxvYWRQcm9maWxlKElucHV0U3RyZWFtIGlucHV0KSB7Ci0JCWlmIChmTWV0YU1vZGVsID09IG51bGwpIHsKLQkJCWZNZXRhTW9kZWwgPSBuZXcgQ1NTTWV0YU1vZGVsSW1wbCgpOwotCQl9Ci0JCWxvYWRQcm9maWxlKGZNZXRhTW9kZWwsIGlucHV0LCBmUmVzb3VyY2VCdW5kbGUsIGZMb2dnaW5nKTsKLQkJZk1ldGFNb2RlbC5sb2FkQ29tcGxldGVkKCk7Ci0JCXJldHVybiBmTWV0YU1vZGVsOwotCX0KLQotCi0JQ1NTTWV0YU1vZGVsSW1wbCBmTWV0YU1vZGVsID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSU0VSX05BTUUgPSAib3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBmUmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmTG9nZ2luZyA9IGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1JlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ0ODNkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLQotcHVibGljIGNsYXNzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCS8vCi0JcHJpdmF0ZSBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiY3NzcHJvZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBUQUdfTkFNRSA9ICJwcm9maWxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBBVFRfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIEFUVF9VUkkgPSAidXJpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIEFUVF9ERUZBVUxUID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgQVRUX0xPR0dJTkcgPSAibG9nZ2luZyI7IC8vIEhpZGRlbiBPcHRpb24gLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU01ldGFNb2RlbFJlZ2lzdHJ5UmVhZGVyLgotCSAqLwotCXB1YmxpYyBSZWdpc3RyeVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTUHJvZmlsZSByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlDU1NQcm9maWxlSW1wbCBpbmZvID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfTkFNRSkpIHsKLQkJCVN0cmluZyBzdHJJRCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCQlTdHJpbmcgc3RyTkFNRSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FKTsKLQkJCVN0cmluZyBzdHJVUkkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVVJJKTsKLQotCQkJaWYgKHN0cklEICE9IG51bGwgfHwgc3RyVVJJICE9IG51bGwpIHsKLQkJCQlCdW5kbGUgYnVuZGxlID0gbnVsbDsKLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBlbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotCQkJCWJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKHN0clVSSSk7Ci0JCQkJCVVSTCB1cmwgPSBGaWxlTG9jYXRvci5maW5kKGJ1bmRsZSwgcGF0aCwgbnVsbCk7Ci0JCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl1cmwgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwodXJsKTsKLQkJCQkJCQlpbmZvID0gbmV3IENTU1Byb2ZpbGVJbXBsKHN0cklELCB1cmwsIHN0clVSSSk7Ci0JCQkJCQkJaW5mby5zZXRQcm9maWxlTmFtZShzdHJOQU1FKTsKLQkJCQkJCQlpbmZvLnNldERlZmF1bHQoKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9ERUZBVUxUKSAhPSBudWxsKSk7Ci0JCQkJCQkJaW5mby5zZXRMb2dnaW5nKChlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTE9HR0lORykgIT0gbnVsbCkpOwotCQkJCQkJCWluZm8uc2V0T3duZXJQbHVnaW5JRChwbHVnaW5JZCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gdGhyb3VnaAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJFcnJvciByZWFkaW5nIENTUyBQcm9maWxlOiAiICsgc3RySUQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JLyoqCi0JICogV2Ugc2ltcGx5IHJlcXVpcmUgYW4gJ2FkZCcgbWV0aG9kLCBvZiB3aGF0IGV2ZXIgaXQgaXMgd2UgYXJlIHRvIHJlYWQKLQkgKiBpbnRvCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGVudW1Qcm9maWxlcygpIHsKLQkJU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQ1NTUHJvZmlsZSBpbmZvID0gcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQkJCS8vIG51bGwgY2FuIGJlIHJldHVybmVkIGlmIHRoZXJlJ3MgYW4gZXJyb3IgcmVhZGluZyB0aGUKLQkJCQkvLyBlbGVtZW50Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQlzZXQuYWRkKGluZm8pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2V0Lml0ZXJhdG9yKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvVmFsdWVDb2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9WYWx1ZUNvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmI0N2FjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9WYWx1ZUNvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTTWV0YU1vZGVsVHJhdmVyc2VyOwotCi0KLQotY2xhc3MgVmFsdWVDb2xsZWN0b3IgZXh0ZW5kcyBDU1NNZXRhTW9kZWxUcmF2ZXJzZXIgewotCXB1YmxpYyB2b2lkIGJlZ2luKENTU01NTm9kZSBub2RlKSB7Ci0JCWZOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShDU1NNTU5vZGUgbm9kZSkgewotCQlzaG9ydCByYyA9IFRSQVZfQ09OVDsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHR5cGUgPSBub2RlLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU01NTm9kZS5UWVBFX1BST1BFUlRZIHx8IHR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfREVTQ1JJUFRPUiB8fCB0eXBlID09IENTU01NTm9kZS5UWVBFX0NPTlRBSU5FUikgewotCQkJCXJjID0gVFJBVl9DT05UOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKCFmTm9kZXMuY29udGFpbnMobm9kZSkpIHsKLQkJCQkJZk5vZGVzLmFkZChub2RlKTsKLQkJCQkJcmMgPSBUUkFWX1BSVU5FOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldE5vZGVzKCkgewotCQlyZXR1cm4gZk5vZGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0KLQlwcml2YXRlIExpc3QgZk5vZGVzID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9YTUxSZWFkZXJVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvWE1MUmVhZGVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzAzMTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9YTUxSZWFkZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLQotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci0KLQotY2xhc3MgWE1MUmVhZGVyVXRpbCB7Ci0KLQlzdGF0aWMgcHVibGljIFhNTFJlYWRlciBjcmVhdGVYTUxSZWFkZXIoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1NBWFBhcnNlcigpLmdldFhNTFJlYWRlcigpOwotCQl9Ci0JCWNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9DU1NNb2RlbExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvQ1NTTW9kZWxMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIyYTMwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9DU1NNb2RlbExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkNTU0RvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTTW9kZWxMb2FkZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsTG9hZGVyIHsKLQkvKioKLQkgKiBDU1NMb2FkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ1NTTW9kZWxMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElNb2RlbExvYWRlciNuZXdNb2RlbCgpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwoKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBuZXcgQ1NTTW9kZWxJbXBsKCk7Ci0JCS8vIG5vdyBkb25lIGluIGNyZWF0ZQotCQkvLyBtb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkvLyBtb2RlbC5zZXRGYWN0b3J5UmVnaXN0cnkoZGVmYXVsdEZhY3RvcnlSZWdpc3RyeSgpKTsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgQ1NTTW9kZWxMb2FkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIGdldERvY3VtZW50TG9hZGVyKCkgewotCQlpZiAoZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbmV3IENTU0RvY3VtZW50TG9hZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50TG9hZGVySW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9yQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIwMDNiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkNTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5DU1NEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuQWJzdHJhY3RNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotCi0KLXB1YmxpYyBjbGFzcyBNb2RlbEhhbmRsZXJGb3JDU1MgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSGFuZGxlciBpbXBsZW1lbnRzIElNb2RlbEhhbmRsZXIgewotCi0JLyoqCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuCi0JICogYXQgcnVuIHRpbWUgd2l0aCB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIEFzc29jaWF0ZWRDb250ZW50VHlwZUlEID0gIm9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuCi0JICogYXQgcnVuIHRpbWUgd2l0aCB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTW9kZWxIYW5kbGVySUQgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsaGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBNb2RlbEhhbmRsZXJGb3JDU1MoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldElkKE1vZGVsSGFuZGxlcklEKTsKLQkJc2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBDU1NEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgQ1NTRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ29udGVudFR5cGVEZXNjcmlwdGlvbiNnZXRNb2RlbExvYWRlcigpCi0JICovCi0JcHVibGljIElNb2RlbExvYWRlciBnZXRNb2RlbExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBDU1NNb2RlbExvYWRlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTUmVnaW9uVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTUmVnaW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjEyYjk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1JlZ2lvblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci0KLQotcHVibGljIGNsYXNzIENTU1JlZ2lvblV0aWwgewotCi0JLyoqCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVjbGFyYXRpb25WYWx1ZVR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04gfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04gfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkcgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVU5JQ09ERV9SQU5HRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkpOwotCX0KLQotCS8qKgotCSAqIHRoZXNlIHR5cGUgY2FuIGJlIGJlZ2dpbmluZyBvZiBzZWxlY3RvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NlbGVjdG9yQmVnZ2luaW5nVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9VTklWRVJTQUwgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfUFNFVURPIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0lEIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCk7Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWNsYXJhdGlvblR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IgfHwgaXNEZWNsYXJhdGlvblZhbHVlVHlwZSh0eXBlKSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpOwotCX0KLQotCS8qKgotCSAqIFRoZXNlIHR5cGVzIGNvbnNpc3Qgc2VsZWN0b3IgcmVnaW9uCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2VsZWN0b3JUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DTEFTUyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DT01CSU5BVE9SIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9JRCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8gfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfU0VQQVJBVE9SIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NTb3VyY2VQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1NvdXJjZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzEzMzZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1NvdXJjZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotCi0KLXB1YmxpYyBjbGFzcyBDU1NTb3VyY2VQYXJzZXIgaW1wbGVtZW50cyBSZWdpb25QYXJzZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfU1RZTEVTSEVFVCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9ERUNMQVJBVElPTiA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9ERUNMQVJBVElPTl9WQUxVRSA9IDI7Ci0KLQlwcml2YXRlIGxvbmcgZlN0YXJ0VGltZTsKLQlwcml2YXRlIGxvbmcgZlN0b3BUaW1lOwotCXByaXZhdGUgSUNTU1Rva2VuaXplciBmVG9rZW5pemVyOwotCi0JcHVibGljIHZvaWQgc2V0UGFyc2VyTW9kZShpbnQgbW9kZSkgewotCQlpbnQgaW5pdGlhbFN0YXRlOwotCQlpbnQgYnVmc2l6ZTsKLQkJc3dpdGNoIChtb2RlKSB7Ci0JCQljYXNlIE1PREVfU1RZTEVTSEVFVCA6Ci0JCQkJaW5pdGlhbFN0YXRlID0gQ1NTVG9rZW5pemVyLllZSU5JVElBTDsKLQkJCQlidWZzaXplID0gQ1NTVG9rZW5pemVyLkJVRkZFUl9TSVpFX05PUk1BTDsKLQkJCQlicmVhazsKLQkJCWNhc2UgTU9ERV9ERUNMQVJBVElPTiA6Ci0JCQkJaW5pdGlhbFN0YXRlID0gQ1NTVG9rZW5pemVyLlNUX0RFQ0xBUkFUSU9OOwotCQkJCWJ1ZnNpemUgPSBDU1NUb2tlbml6ZXIuQlVGRkVSX1NJWkVfTk9STUFMOwotCQkJCWJyZWFrOwotCQkJY2FzZSBNT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFIDoKLQkJCQlpbml0aWFsU3RhdGUgPSBDU1NUb2tlbml6ZXIuU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFOwotCQkJCWJ1ZnNpemUgPSBDU1NUb2tlbml6ZXIuQlVGRkVSX1NJWkVfU01BTEw7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm47Ci0JCX0KLQkJaWYgKDAgPCBpbml0aWFsU3RhdGUpIHsKLQkJCUlDU1NUb2tlbml6ZXIgdG9rZW5pemVyID0gZ2V0VG9rZW5pemVyKCk7Ci0JCQl0b2tlbml6ZXIuc2V0SW5pdGlhbFN0YXRlKGluaXRpYWxTdGF0ZSk7Ci0JCQl0b2tlbml6ZXIuc2V0SW5pdGlhbEJ1ZmZlclNpemUoYnVmc2l6ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZG5vZGUgPSBudWxsOwotCQlpZiAoaGVhZG5vZGUgPT0gbnVsbCkgewotCQkJaWYgKERlYnVnLnBlcmZUZXN0KSB7Ci0JCQkJZlN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQkJaGVhZG5vZGUgPSBwYXJzZU5vZGVzKCk7Ci0JCQlpZiAoRGVidWcucGVyZlRlc3QpIHsKLQkJCQlmU3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAtLSBjcmVhdGluZyBub2RlcyBvZiBJU3RydWN0dXJlZERvY3VtZW50IC0tICIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgVGltZSBwYXJzZSBhbmQgaW5pdCBhbGwgcmVnaW9uczogIiArIChmU3RvcFRpbWUgLSBmU3RhcnRUaW1lKSArICIgKG1zZWNzKSIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGZvciAiICsgZlJlZ2lvbnMuc2l6ZSgpICsgIgotCQkJCS8vIFJlZ2lvbnMiKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgYW5kICIgKyBfY291bnROb2RlcyhoZWFkbm9kZSkgKyAiIE5vZGVzIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGhlYWRub2RlOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUgPSBudWxsOwotCQlpZiAoIWdldFRva2VuaXplcigpLmlzRU9GKCkpIHsKLQkJCWhlYWROb2RlID0gZ2V0RG9jdW1lbnRSZWdpb25zKCk7Ci0JCQkvLyB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwYXJzaW5nIGhhcyBub3QgZmluaXNoZWQiKTsKLQkJfQotCQkvLyBmb3IgbWVtb3J5IHJlY292ZXJ5LCB3ZSBhc3N1bWUgaWYgc29tZW9uZQotCQkvLyByZXF1ZXN0cyBhbGwgcmVnaW9ucywgd2UgY2FuIHJlc2V0IG91ciBiaWcKLQkJLy8gbWVtb3J5IGNvbnN1bWluZyBvYmplY3RzCi0JCS8vIGJ1dCB0aGUgbmV3ICJnZXRSZWdpb25zIiBtZXRob2QgaXMgdGhlbiBtb3JlIGV4cGVuc2l2ZS4KLQkJLy8gSSBkb24ndCB0aGluayBpdHMgdXNlZCBtdWNoLCB0aG91Z2guCi0JCUxpc3QgbG9jYWxSZWdpb25zTGlzdCA9IGdldFJlZ2lvbnMoaGVhZE5vZGUpOwotCQlwcmltUmVzZXQoKTsKLQkJcmV0dXJuIGxvY2FsUmVnaW9uc0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldFJlZ2lvbnMuCi0JICogCi0JICogQHBhcmFtIGhlYWROb2RlCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlKSB7Ci0JCUxpc3QgYWxsUmVnaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSA9IGhlYWROb2RlOwotCQl3aGlsZSAoY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zID0gY3VycmVudE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlUmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCWFsbFJlZ2lvbnMuYWRkKG5vZGVSZWdpb25zLmdldChpKSk7Ci0JCQl9Ci0JCQljdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gYWxsUmVnaW9uczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChSZWFkZXIgcmVhZGVyKSB7Ci0JCXByaW1SZXNldCgpOwotCQlnZXRUb2tlbml6ZXIoKS5yZXNldChyZWFkZXIsIDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFJlYWRlciByZWFkZXIsIGludCBvZmZzZXQpIHsKLQkJcmVzZXQocmVhZGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgaW5wdXQpIHsKLQkJcmVzZXQobmV3IFN0cmluZ1JlYWRlcihpbnB1dCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFN0cmluZyBpbnB1dCwgaW50IG9mZnNldCkgewotCQlyZXNldChpbnB1dCk7Ci0JfQotCi0JcHVibGljIFJlZ2lvblBhcnNlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBDU1NTb3VyY2VQYXJzZXIoKTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyc2VOb2RlcygpIHsKLQkJLy8gcmVnaW9ucyBhcmUgaW5pdGlhbGx5IHJlcG9ydGVkIGFzIGNvbXBsZXRlIG9mZnNldHMgd2l0aGluIHRoZQotCQkvLyBzY2FubmVkIGlucHV0Ci0JCS8vIHRoZXkgYXJlIGFkanVzdGVkIGhlcmUgdG8gYmUgaW5kZXhlcyBmcm9tIHRoZSBjdXJyZW50Tm9kZSdzIHN0YXJ0Ci0JCS8vIG9mZnNldAotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUgPSBudWxsOwotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0JCVN0cmluZyBjdXJyZW50UmVnaW9uVHlwZSA9IG51bGw7Ci0KLQkJd2hpbGUgKChyZWdpb24gPSBnZXROZXh0UmVnaW9uKCkpICE9IG51bGwpIHsKLQkJCXR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKG11c3RCZVN0YXJ0KHR5cGUsIGN1cnJlbnRSZWdpb25UeXBlKSAmJiBjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJY3VycmVudE5vZGUuc2V0RW5kZWQodHJ1ZSk7Ci0JCQl9Ci0KLQkJCWlmICgoY3VycmVudE5vZGUgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHx8IGN1cnJlbnROb2RlID09IG51bGwpIHsKLQkJCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCAmJiAhY3VycmVudE5vZGUuaXNFbmRlZCgpKSB7Ci0JCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJCX0KLQkJCQlsYXN0Tm9kZSA9IGN1cnJlbnROb2RlOwotCQkJCWN1cnJlbnROb2RlID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHR5cGUpOwotCQkJCWN1cnJlbnRSZWdpb25UeXBlID0gdHlwZTsKLQkJCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCQlsYXN0Tm9kZS5zZXROZXh0KGN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQkJY3VycmVudE5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJCWN1cnJlbnROb2RlLnNldFN0YXJ0KHJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCX0KLQotCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0KLQkJCWlmIChtdXN0QmVFbmQodHlwZSkpIHsKLQkJCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJCX0KLQotCQkJaWYgKGhlYWROb2RlID09IG51bGwgJiYgY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCWhlYWROb2RlID0gY3VycmVudE5vZGU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCAmJiAhY3VycmVudE5vZGUuaXNFbmRlZCgpKSB7Ci0JCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJfQotCi0JCXByaW1SZXNldCgpOwotCQlyZXR1cm4gaGVhZE5vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5jcmVhdGVSZWdpb24odHlwZSk7Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbXVzdEJlU3RhcnQoU3RyaW5nIHR5cGUsIFN0cmluZyBkb2NSZWdpb25UeXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPTlRfRkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VUIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0FUS0VZV09SRCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHx8IChkb2NSZWdpb25UeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSAmJiB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB8fCAoIUNTU1JlZ2lvblV0aWwuaXNTZWxlY3RvckJlZ2dpbmluZ1R5cGUoZG9jUmVnaW9uVHlwZSkgJiYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9VTklWRVJTQUwgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfUFNFVURPIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0lEIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCkpKTsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtdXN0QmVFbmQoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpOwotCX0KLQotCXByaXZhdGUgSVRleHRSZWdpb24gZ2V0TmV4dFJlZ2lvbigpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZ2lvbiA9IGdldFRva2VuaXplcigpLmdldE5leHRUb2tlbigpOwotCQkJLy8gRE1XOiAyLzEyLzAzIFJlbW92ZWQgc3RhdGUKLQkJCS8vIGlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJLy8gZlJlZ2lvbnMuYWRkKHJlZ2lvbik7Ci0JCQkvLyB9Ci0JCQlyZXR1cm4gcmVnaW9uOwotCQl9Ci0JCWNhdGNoIChTdGFja092ZXJmbG93RXJyb3IgZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihnZXRDbGFzcygpLmdldE5hbWUoKSArICI6IGlucHV0IGNvdWxkIG5vdCBiZSBwYXJzZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRUb2tlbml6ZXIoKS5nZXRPZmZzZXQoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IGU7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogaW5wdXQgY291bGQgbm90IGJlIHBhcnNlZCBjb3JyZWN0bHkgYXQgcG9zaXRpb24gIiArIGdldFRva2VuaXplcigpLmdldE9mZnNldCgpICsgIiAoIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpICsgIikiLCBlKTsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW1SZXNldCgpIHsKLQotCQlnZXRUb2tlbml6ZXIoKS5yZXNldChuZXcgY2hhclswXSk7Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIElDU1NUb2tlbml6ZXIgZ2V0VG9rZW5pemVyKCkgewotCQlpZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCQlmVG9rZW5pemVyID0gbmV3IENTU1Rva2VuaXplcigpOwotCQl9Ci0JCXJldHVybiBmVG9rZW5pemVyOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBpcyBhIHNpbXBsZSB1dGlsaXR5IHRvIGNvdW50IG5vZGVzLiBVc2VkIG9ubHkgZm9yIGRlYnVnCi0JICogc3RhdGVtZW50cy4KLQkgKi8KLQlwcml2YXRlIGludCBfY291bnROb2RlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGVzKSB7Ci0JCWludCByZXN1bHQgPSAwOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvdW50Tm9kZSA9IG5vZGVzOwotCQl3aGlsZSAoY291bnROb2RlICE9IG51bGwpIHsKLQkJCXJlc3VsdCsrOwotCQkJY291bnROb2RlID0gY291bnROb2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDlmMjMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotcHVibGljIGNsYXNzIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjcmVhdGVSZWdpb24oU3RyaW5nIHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZSA9IG51bGw7Ci0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJZWxzZSB7Ci0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlNzI0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjIuMiBvbiA0LzI4LzA4IDU6MTIgUE0gKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9ucy5DU1NUZXh0UmVnaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgPGEKLSAqIGhyZWY9Imh0dHA6Ly93d3cuaW5mb3JtYXRpay50dS1tdWVuY2hlbi5kZS9+a2xlaW5nL2pmbGV4LyI+SkZsZXg8L2E+IDEuMi4yCi0gKiBvbiA0LzI4LzA4IDU6MTIgUE0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovRDovd29ya3NwYWNlcy9jc3MvY3NzRm9ybWF0dGluZy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsL0NTU1Rva2VuaXplci5qZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDU1NUb2tlbml6ZXIgaW1wbGVtZW50cyBDU1NSZWdpb25Db250ZXh0cywgSUNTU1Rva2VuaXplciB7Ci0KLQkvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0JLyoqIGxleGljYWwgc3RhdGVzICovCi0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUgPSAxMTsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9JTVBPUlRfREVMSU1JVEVSID0gNTsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUgPSAxNzsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9TRUxFQ1RPUiA9IDA7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0hBUlNFVF9ERUxJTUlURVIgPSAyOwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RFQ0xBUkFUSU9OX1ZBTFVFID0gMTg7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUEFHRV9QU0VVRE9fUEFHRSA9IDg7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSU1QT1JUX1VSSSA9IDM7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORCA9IDE0OwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUiA9IDEyOwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RFQ0xBUkFUSU9OID0gMTU7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUEFHRV9ERUxJTUlURVIgPSA5OwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSA9IDEzOwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX01FRElBX01FRElVTSA9IDY7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0hBUlNFVF9OQU1FID0gMTsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9JTVBPUlRfTUVESVVNID0gNDsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1IgPSAxNjsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9GT05UX0ZBQ0VfREVMSU1JVEVSID0gOTsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9NRURJQV9ERUxJTUlURVIgPSA3OwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1NFTEVDVE9SX01PRElGSUVSID0gMTA7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLQotCS8qKgotCSAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotCSAqLwotCWZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eWNtYXBfcGFja2VkID0gIlwxMVwwXDFcMTJcMVwxN1wxXDBcMVw0XDFcMjBcMjJcMFwxXDZcMVwzMVwxXDExIiArICJcMVwyMVwxXDE2XDFcNzJcMVwxNlwxXDVcMVwyNVwxXDEzXDFcMzVcMVwxNFwxXDU1IiArICJcMVwxMFwxXDE1XDFcMzRcMTJcMVwxXDYyXDFcNTBcMVwzMFwxXDY3XDFcMzJcMVwyNyIgKyAiXDFcMzZcMVw0M1wxXDI2XDFcNDBcMVw1N1wxXDQ2XDFcNjRcMVw2MVwxXDQxXDFcNTEiICsgIlwyXDJcMVwyNFwxXDUyXDFcNjVcMVw1NFwxXDUzXDFcMlwxXDIzXDFcNDRcMVw0NyIgKyAiXDFcMjJcNVwyXDFcNjZcMVwzXDFcNzFcMVwxNlwxXDJcMVwxNlwxXDQyXDFcNyIgKyAiXDFcMzdcMVw1NlwxXDQ1XDFcNjNcMVw2MVwxXDQxXDFcNTFcMlwyXDFcMjRcMVw1MiIgKyAiXDFcNjVcMVw1NFwxXDUzXDFcMlwxXDIzXDFcNDRcMVw0N1wxXDIyXDVcMlwxXDYwIiArICJcMVw3MFwxXDMzXDFcNzBcMVwwXHVmZjgwXDIiOwotCi0JLyoqCi0JICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0JICovCi0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHl5Y21hcCA9IHl5X3VucGFja19jbWFwKHl5Y21hcF9wYWNrZWQpOwotCi0JLyoqCi0JICogVHJhbnNsYXRlcyBhIHN0YXRlIHRvIGEgcm93IGluZGV4IGluIHRoZSB0cmFuc2l0aW9uIHRhYmxlCi0JICovCi0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5X3Jvd01hcFtdID0gezAsIDU5LCAxMTgsIDE3NywgMjM2LCAyOTUsIDM1NCwgNDEzLCA0NzIsIDUzMSwgNTkwLCA2NDksIDcwOCwgNzY3LCA4MjYsIDg4NSwgOTQ0LCAxMDAzLCAxMDYyLCAxMTIxLCAxMTgwLCAxMjM5LCAxMjk4LCAxMzU3LCAxNDE2LCAxNDc1LCAxNTM0LCAxMTIxLCAxNTkzLCAxMTIxLCAxNjUyLCAxNzExLCAxMTIxLCAxNzcwLCAxODI5LCAxODg4LCAxMTIxLCAxOTQ3LCAyMDA2LCAyMDY1LCAyMTI0LCAyMTgzLCAyMjQyLCAxMTIxLCAyMzAxLCAyMzYwLCAyNDE5LCAxMTIxLCAxMTIxLCAyNDc4LCAyNTM3LCAyNTk2LCAxMTIxLCAyNjU1LCAyNzE0LCAxMTIxLCAxMTIxLCAyNzczLCAyODMyLCAyODkxLCAxMTIxLCAyOTUwLCAxMTIxLCAzMDA5LCAzMDY4LCAzMTI3LCAzMTg2LCAzMjQ1LCAzMzA0LCAzMzYzLCAzNDIyLCAxMTIxLCAxMTIxLCAzNDgxLCAzNTQwLCAzNTk5LCAzNjU4LCAzNzE3LCAzNzc2LCAxMTIxLCAzODM1LCAzODk0LCAzOTUzLCA0MDEyLCA0MDcxLCAxNTkzLCAxMTIxLCA0MTMwLCAxMjM5LCA0MTg5LCA0MjQ4LCAxNDE2LCA0MzA3LCAxNDc1LCA0MzY2LCA0NDI1LCA0NDg0LCA0NTQzLCA0NjAyLCA0NjYxLCA0NzIwLCA0Nzc5LCA0ODM4LCA0ODk3LCA0OTU2LCAxNzcwLCA1MDE1LCAxMTIxLCAxODg4LCA1MDc0LCAxOTQ3LCA1MTMzLCAxMTIxLCAyMDA2LCA1MTkyLCA1MjUxLCAyMTgzLCA1MzEwLCAyMzYwLCA1MzY5LCAyNTM3LCA1NDI4LCA1NDg3LCAxMTIxLCAyNzE0LCAyODMyLCA1NTQ2LCAzMDY4LCA1NjA1LCAzMTI3LCA1NjY0LCAxMTIxLCAzMjQ1LCA1NzIzLCAzMzYzLCA1NzgyLCA1ODQxLCA1OTAwLCA1OTU5LCAzODk0LCAxMTIxLCAzNTk5LCAxMTIxLCA2MDE4LCAzNjU4LCA2MDc3LCAxMTIxLCAzNzc2LCA2MTM2LCA2MTk1LCAzOTUzLCA2MjU0LCA2MzEzLCA2MzcyLCA0MDcxLCA2NDMxLCAxMTIxLCA0MTMwLCA2NDkwLCAxMTIxLCA2NTQ5LCA2NjA4LAotCQkJCTY2NjcsIDY3MjYsIDY3ODUsIDY4NDQsIDY5MDMsIDY5NjIsIDcwMjEsIDcwODAsIDcxMzksIDcxOTgsIDE3NzAsIDcyNTcsIDczMTYsIDE4ODgsIDczNzUsIDc0MzQsIDE5NDcsIDc0OTMsIDc1NTIsIDIwMDYsIDc2MTEsIDc2NzAsIDc3MjksIDc3ODgsIDc4NDcsIDc5MDYsIDc5NjUsIDgwMjQsIDMxMjcsIDgwODMsIDgxNDIsIDMyNDUsIDgyMDEsIDgyNjAsIDgzMTksIDgzNzgsIDg0MzcsIDM2NTgsIDg0OTYsIDg1NTUsIDM3NzYsIDg2MTQsIDg2NzMsIDg3MzIsIDg3OTEsIDg4NTAsIDg5MDksIDg5NjgsIDkwMjcsIDExMjEsIDExMjEsIDkwODYsIDkxNDUsIDkyMDQsIDkyNjMsIDkzMjIsIDkzODEsIDk0NDAsIDk0OTksIDk1NTgsIDk2MTcsIDk2NzYsIDk3MzUsIDk3OTQsIDk4NTMsIDk5MTIsIDk5NzEsIDEwMDMwLCAxMDA4OSwgMTAxNDgsIDEwMjA3LCAxMDI2NiwgMTAzMjUsIDEwMzg0LCAxMDQ0MywgMTA1MDIsIDEwNTYxLCAxMDYyMCwgMTA2NzksIDEwNzM4LCAxMDc5NywgMTA4NTYsIDEwOTE1LCAxMDk3NCwgMTEwMzMsIDExMDkyLCAxMTE1MSwgMTEyMTAsIDExMjEsIDExMjY5LCAxMTMyOCwgMTEyMSwgMTEzODcsIDExNDQ2LCAxMTUwNSwgMTE1NjQsIDExNjIzLCAxMTY4MiwgMTE3NDEsIDExODAwLCAxMTg1OSwgMTE5MTgsIDExMjEsIDExOTc3LCAxMjAzNiwgMTIwOTUsIDEyMTU0LCAxMjIxMywgMTIyNzIsIDEyMzMxLCAxMjM5MCwgMTI0NDksIDEyNTA4LCAxMjU2NywgMTI2MjYsIDEyNjg1LCAxMjc0NCwgMTI4MDMsIDEyODYyLCAxMjkyMSwgMTA3OTcsIDEyOTgwLCAxMzAzOSwgMTEyMSwgMTMwOTgsIDEzMTU3LCAxMzIxNiwgMTMyNzUsIDEzMzM0LCAxMzM5MywgMTEyMSwgMTM0NTIsIDEzNTExLCAxMzU3MCwgMTM2MjksIDEzNjg4LCAxMzc0NywgMTM4MDYsIDEzODY1LCAxMzkyNCwgMTE3NDEsIDEzOTgzLCAxNDA0MiwgMTQxMDEsIDE0MTYwLCAxNDIxOSwgMTQyNzgsIDE0MzM3LCAxNDM5NiwgMTQ0NTUsCi0JCQkJMTQ1MTQsIDE0NTczLCAxNDYzMiwgMTQ2OTEsIDE0NzUwLCAxNDgwOSwgMTQ4NjgsIDE0OTI3LCAxNDk4NiwgMTUwNDUsIDEyODYyLCAxNTEwNCwgMTUxNjMsIDE1MjIyLCAxNTI4MSwgMTUzNDAsIDE1Mzk5LCAxNTQ1OCwgMTEyMSwgMTU1MTcsIDE1NTc2LCAxNTYzNSwgMTU2OTQsIDE1NzUzLCAxNTgxMiwgMTU4NzEsIDE1OTMwLCAxNTk4OSwgMTYwNDgsIDE2MTA3LCAxNjE2NiwgMTYyMjUsIDE2Mjg0LCAxNjM0MywgMTY0MDIsIDE2NDYxLCAxNjUyMCwgMTY1NzksIDE2NjM4LCAxNjY5NywgMTY3NTYsIDE2ODE1LCAxNjg3NCwgMTY5MzMsIDE2OTkyLCAxNzA1MSwgMTcxMTAsIDE3MTY5LCAxNzIyOCwgMTcyODcsIDE3MzQ2LCAxNzQwNSwgMTc0NjQsIDE3NTIzLCAxNzU4MiwgMTc2NDEsIDE3NzAwLCAxNzc1OSwgMTEyMSwgMTc4MTgsIDE3ODc3LCAxNzkzNiwgMTc5OTUsIDE4MDU0LCAxODExMywgMTgxNzIsIDE4MjMxLCAxODI5MCwgMTE4NTksIDE4MzQ5LCAxMTkxOCwgMTg0MDgsIDE4NDY3LCAxODUyNiwgMTg1ODUsIDE4NjQ0LCAxODcwMywgMTg3NjIsIDE4ODIxLCAxODg4MCwgMTg5MzksIDEyOTgwLCAxODk5OCwgMTMwMzksIDE5MDU3LCAxOTExNiwgMTkxNzUsIDE5MjM0LCAxOTI5MywgMTkzNTIsIDE5NDExLCAxOTQ3MCwgMTk1MjksIDE5NTg4LCAxOTY0NywgMTEyMSwgMTk3MDYsIDE5NzY1LCAxOTgyNCwgMTk4ODMsIDExMjEsIDE5OTQyLCAyMDAwMSwgMjAwNjAsIDExMjEsIDIwMTE5LCAyMDE3OCwgMjAyMzcsIDIwMjk2LCAyMDM1NSwgMjA0MTQsIDIwNDczLCAyMDUzMiwgMjA1OTEsIDIwNjUwfTsKLQotCS8qKgotCSAqIFRoZSBwYWNrZWQgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0JICovCi0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5X3BhY2tlZCA9ICJcMlwyNFwxXDI1XDFcMjZcMVwyN1wxXDI0XDFcMjdcMVwyNVwxXDMwIiArICJcMVwyNFwxXDI3XDJcMjRcMVwzMVwxXDI0XDJcMjdcMVwzMlwzXDI1IiArICJcMVwyNFwxXDI1XDFcMjRcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDM2IiArICJcMVwzN1wxMVwyNVwxXDI0XDRcMjVcMVwyNFwyXDI1XDFcMjRcMVwyNSIgKyAiXDFcNDBcM1wyNVwxXDQxXDEwXDI0XDFcMjdcMVw0MlwxXDI3XDFcMjQiICsgIlwxXDQzXDFcNDRcMVwyN1w0XDI0XDJcMjdcN1wyNFwxXDMzXDJcMjQiICsgIlwxXDM0XDFcMzVcMVwyNFwxXDM3XDQwXDI0XDFcMjdcMVwyNFwxXDI3IiArICJcMVwyNFwxXDQzXDFcMjRcMVwyN1w0XDI0XDJcMjdcN1wyNFwxXDMzIiArICJcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDExXDI0XDFcNDVcMjZcMjQiICsgIlwxXDI3XDFcNDZcMVwyN1wxXDI0XDFcNDNcMVw0N1wxXDI3XDRcMjQiICsgIlwyXDI3XDFcMjRcMVw1MFw1XDI0XDFcMzNcMlwyNFwxXDM0XDFcMzUiICsgIlwxXDI0XDFcMzdcMTFcMjRcMVw0NVwyNFwyNFwxXDUxXDFcNTJcMVwyNyIgKyAiXDFcMjRcMVwyN1wxXDUxXDFcNTNcMVwyNFwxXDI3XDRcMjRcMlwyNyIgKyAiXDFcMjRcM1w1MVwxXDI0XDFcNTFcMVwyNFwxXDMzXDJcMjRcMVwzNCIgKyAiXDFcMzVcMVwyNFwxXDM3XDExXDUxXDFcNDVcNFw1MVwxXDI0XDJcNTEiICsgIlwxXDI0XDFcNTFcMVwyNFwzXDUxXDExXDI0XDFcMjdcMVwyNFwxXDI3IiArICJcMVwyNFwxXDQzXDFcMjRcMVwyN1w0XDI0XDJcMjdcN1wyNFwxXDMzIiArICJcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDExXDI0XDFcNDVcNFwyNCIgKyAiXDFcNTRcMTdcMjRcMVw1NVwxXDU2XDFcMjdcMVwyNFwxXDI3XDFcNTUiICsgIlwxXDU3XDFcMjRcMVwyN1w0XDI0XDJcMjdcMVwyNFwzXDU1XDFcMjQiICsgIlwxXDU1XDFcMjRcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzciCi0JCQkJKyAiXDExXDU1XDFcMjRcNFw1NVwxXDI0XDJcNTVcMVwyNFwxXDU1XDFcMjQiICsgIlwzXDU1XDExXDI0XDFcMjdcMVwyNFwxXDI3XDFcMjRcMVw0M1wxXDI0IiArICJcMVwyN1w0XDI0XDJcMjdcN1wyNFwxXDMzXDJcMjRcMVwzNFwxXDM1IiArICJcMVwyNFwxXDM3XDE2XDI0XDFcNjBcMlwyNFwxXDYxXDE0XDI0XDFcNjIiICsgIlwxXDYzXDFcMjdcMVwyNFwxXDI3XDFcNjJcMVw2NFwxXDI0XDFcMjciICsgIlw0XDI0XDJcMjdcMVwyNFwzXDYyXDFcMjRcMVw2MlwxXDI0XDFcMzMiICsgIlwyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzdcMTFcNjJcMVwyNFw0XDYyIiArICJcMVwyNFwyXDYyXDFcNjVcMVw2MlwxXDY2XDNcNjJcMTFcMjRcMVwyNyIgKyAiXDFcMjRcMVwyN1wxXDI0XDFcNDNcMVwyNFwxXDI3XDRcMjRcMlwyNyIgKyAiXDdcMjRcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzdcMjFcMjQiICsgIlwxXDY1XDE2XDI0XDFcNjdcMVwyNFwxXDY3XDFcMjRcMVw0M1wxXDI0IiArICJcMVw2N1wxXDI0XDFcNzBcMVwzMVwxXDI0XDJcNjdcMVwzMlw2XDI0IiArICJcMVwzM1wxXDI0XDFcNzBcMVwzNFwxXDM1XDFcMzZcMVwzN1wxNlwyNCIgKyAiXDFcNzFcMlwyNFwxXDY1XDFcMjRcMVw0MFwzXDI0XDFcNDFcNlwyNCIgKyAiXDFcNzJcMVw3M1wxXDI3XDFcMjRcMVwyN1wxXDcyXDFcNzRcMVwyNCIgKyAiXDFcMjdcNFwyNFwyXDI3XDFcMjRcM1w3MlwxXDI0XDFcNzJcMVwyNCIgKyAiXDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDExXDcyXDFcMjQiICsgIlw0XDcyXDFcMjRcMlw3MlwxXDI0XDFcNzJcMVwyNFwzXDcyXDExXDI0IiArICJcMVwyN1wxXDI0XDFcMjdcMVwyNFwxXDQzXDFcMjRcMVwyN1w0XDI0IiArICJcMlwyN1w3XDI0XDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3IiArICJcMzBcMjRcMVw3NVwxXDc2XDFcNzdcM1wyNFwxXDEwMFwxXDEwMVwxXDI3IgotCQkJCSsgIlwxXDEwMlwxXDI3XDFcMTAwXDFcMTAzXDFcMTA0XDFcMjdcNFwyNFwyXDI3IiArICJcMVwyNFwzXDEwMFwxXDI0XDFcMTAwXDFcMjRcMVwzM1wyXDI0XDFcMzQiICsgIlwxXDM1XDFcMjRcMVwzN1wxMVwxMDBcMVwyNFw0XDEwMFwxXDI0XDJcMTAwIiArICJcMVwyNFwxXDEwMFwxXDI0XDNcMTAwXDExXDI0XDFcMjdcMVwyNFwxXDI3IiArICJcMVwyNFwxXDQzXDFcMjRcMVwyN1w0XDI0XDJcMjdcN1wyNFwxXDMzIiArICJcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDMyXDI0XDFcNzdcM1wyNCIgKyAiXDFcMTA1XDFcMTA2XDFcMjdcMVwyNFwxXDI3XDFcMTA1XDFcMTA3XDFcMjQiICsgIlwxXDI3XDRcMjRcMlwyN1wxXDI0XDNcMTA1XDFcMjRcMVwxMDVcMVwyNCIgKyAiXDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDExXDEwNVwxXDExMCIgKyAiXDRcMTA1XDFcMjRcMlwxMDVcMVwyNFwxXDEwNVwxXDI0XDNcMTA1XDExXDI0IiArICJcMVwyN1wxXDI0XDFcMjdcMVwyNFwxXDQzXDFcMjRcMVwyN1w0XDI0IiArICJcMlwyN1w3XDI0XDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3IiArICJcMTFcMjRcMVwxMTBcMTFcMjRcMVwxMTFcMTFcMjRcMVwxMTJcMVwxMTNcMVwxMTQiICsgIlwxXDI3XDFcMTE1XDFcMjdcMVwxMTNcMVwxMTZcMVwxMTdcMVwyN1wxXDEyMCIgKyAiXDFcMTIxXDFcMTIyXDFcMjRcMlwyN1wxXDEyM1wxXDEyNFwyXDExM1wxXDI0IiArICJcMVwxMTNcMVwyNFwxXDMzXDFcMTI1XDFcMjRcMVwzNFwxXDEyNlwxXDI0IiArICJcMVwzN1wxMVwxMTNcMVwxMTBcNFwxMTNcMVwxMjdcMlwxMTNcMVwyNFwxXDExMyIgKyAiXDFcMjRcM1wxMTNcNlwyNFwxXDExMlwxXDExM1wxXDExNFwxXDEzMFwxXDExNSIgKyAiXDFcMTMwXDFcMTEzXDFcMTE2XDFcMTE3XDFcMTMwXDFcMTIwXDFcMTIxXDFcMTIyIiArICJcMVwyNFwyXDEzMFwxXDEyM1wxXDEyNFwyXDExM1wxXDI0XDFcMTEzXDFcMjQiCi0JCQkJKyAiXDFcMzNcMVwxMjVcMVwyNFwxXDM0XDFcMTI2XDFcMjRcMVwzN1wxMVwxMTMiICsgIlwxXDExMFw0XDExM1wxXDEyN1wyXDExM1wxXDI0XDFcMTEzXDFcMjRcM1wxMTMiICsgIlw1XDI0XDc0XDBcMlwyNVwxXDEzMVwzXDBcMlwyNVwxMVwwXDNcMjUiICsgIlwxXDBcMVwyNVwxMFwwXDExXDI1XDFcMFw0XDI1XDFcMFwyXDI1IiArICJcMVwwXDFcMjVcMVwwXDNcMjVcNlwwXDFcMTMyXDJcMjVcMVwwIiArICJcMlwyNVwxXDEzMlwyXDI1XDFcMFw0XDI1XDJcMFwxNlwyNVwxXDEzMiIgKyAiXDJcMjVcMVwxMzJcMlwyNVwxXDEzMlwxMFwyNVwxXDEzMlw0XDI1XDFcMTMyIiArICJcN1wyNVw0XDBcMVwyN1wxXDBcMVwyN1wzXDBcMVwyN1w0XDAiICsgIlwyXDI3XDU0XDBcMVwyNVwxXDEzMVwzXDBcMVwyNVwxXDEzM1wxMVwwIiArICJcM1wyNVwxXDBcMVwyNVwxMFwwXDExXDI1XDFcMFw0XDI1XDFcMCIgKyAiXDJcMjVcMVwwXDFcMjVcMVwwXDNcMjVcNlwwXDJcMTM0XDFcMTM1IiArICJcM1wwXDJcMTM0XDExXDBcM1wxMzRcMVwwXDFcMTM0XDEwXDBcMTFcMTM0IiArICJcMVwwXDRcMTM0XDFcMFwyXDEzNFwxXDBcMVwxMzRcMVwwXDNcMTM0IiArICJcNlwwXDJcMTM2XDFcMTM3XDNcMFwyXDEzNlwxMVwwXDNcMTM2XDFcMCIgKyAiXDFcMTM2XDEwXDBcMTFcMTM2XDFcMFw0XDEzNlwxXDBcMlwxMzZcMVwwIiArICJcMVwxMzZcMVwwXDNcMTM2XDM2XDBcMVwxNDBcNzZcMFwxXDE0MVw3NFwwIiArICJcMlwxNDJcMTBcMFwxXDE0M1wxXDE0NFwxXDE0NVw3XDBcMlwxNDZcMTBcMCIgKyAiXDFcMTQ3XDFcMTUwXDNcMFwxXDE0N1wxXDE1MVwxMVwwXDNcMTQ3XDFcMCIgKyAiXDFcMTQ3XDEwXDBcMTFcMTQ3XDFcMFw0XDE0N1wxXDBcMlwxNDdcMVwwIiArICJcMVwxNDdcMVwwXDNcMTQ3XDZcMFwyXDE1MlwxXDE1M1wxXDBcMVwxNTQiICsgIlwxMVwxNTJcMlwwXDUyXDE1MlwxMFwwXDFcMTMzXDYzXDBcMlwxNTVcMVwxNTYiCi0JCQkJKyAiXDFcMFw0XDE1NVwxXDE1NFw1XDE1NVwyXDBcNTJcMTU1XDFcMFwyXDE1NyIgKyAiXDFcMTYwXDFcMFwxXDE2MVwxMVwxNTdcMlwwXDUyXDE1N1wxXDBcMlwxNjIiICsgIlwxXDE2M1wxXDBcNFwxNjJcMVwxNjFcNVwxNjJcMlwwXDUyXDE2MlwyM1wwIiArICJcMVwxNjRcNTBcMFwyXDUxXDFcMTY1XDNcMFwyXDUxXDExXDBcM1w1MSIgKyAiXDFcMFwxXDUxXDEwXDBcMTFcNTFcMVwwXDRcNTFcMVwwXDJcNTEiICsgIlwxXDBcMVw1MVwxXDBcM1w1MVw2XDBcMVwxNjZcMlw1MVwxXDAiICsgIlwyXDUxXDFcMTY2XDJcNTFcMVwwXDRcNTFcMlwwXDE2XDUxXDFcMTY2IiArICJcMlw1MVwxXDE2NlwyXDUxXDFcMTY2XDEwXDUxXDFcMTY2XDRcNTFcMVwxNjYiICsgIlw3XDUxXDJcMFwxXDUxXDFcMTY1XDNcMFwxXDUxXDFcMTMzXDExXDAiICsgIlwzXDUxXDFcMFwxXDUxXDEwXDBcMTFcNTFcMVwwXDRcNTFcMVwwIiArICJcMlw1MVwxXDBcMVw1MVwxXDBcM1w1MVw2XDBcMlw1NVwxXDE2NyIgKyAiXDNcMFwyXDU1XDExXDBcM1w1NVwxXDBcMVw1NVwxMFwwXDExXDU1IiArICJcMVwwXDRcNTVcMVwwXDJcNTVcMVwwXDFcNTVcMVwwXDNcNTUiICsgIlw2XDBcMVwxNzBcMlw1NVwxXDBcMlw1NVwxXDE3MFwyXDU1XDFcMCIgKyAiXDRcNTVcMlwwXDE2XDU1XDFcMTcwXDJcNTVcMVwxNzBcMlw1NVwxXDE3MCIgKyAiXDEwXDU1XDFcMTcwXDRcNTVcMVwxNzBcN1w1NVwyXDBcMVw1NVwxXDE2NyIgKyAiXDNcMFwxXDU1XDFcMTMzXDExXDBcM1w1NVwxXDBcMVw1NVwxMFwwIiArICJcMTFcNTVcMVwwXDRcNTVcMVwwXDJcNTVcMVwwXDFcNTVcMVwwIiArICJcM1w1NVw2XDBcMlw2MlwxXDE3MVwzXDBcMlw2MlwxMVwwXDNcNjIiICsgIlwxXDBcMVw2MlwxMFwwXDExXDYyXDFcMFw0XDYyXDFcMFwyXDYyIiArICJcMVwwXDFcNjJcMVwwXDNcNjJcNlwwXDFcMTcyXDJcNjJcMVwwIgotCQkJCSsgIlwyXDYyXDFcMTcyXDJcNjJcMVwwXDRcNjJcMlwwXDE2XDYyXDFcMTcyIiArICJcMlw2MlwxXDE3MlwyXDYyXDFcMTcyXDEwXDYyXDFcMTcyXDRcNjJcMVwxNzIiICsgIlw3XDYyXDJcMFwxXDYyXDFcMTcxXDNcMFwxXDYyXDFcMTMzXDExXDAiICsgIlwzXDYyXDFcMFwxXDYyXDEwXDBcMTFcNjJcMVwwXDRcNjJcMVwwIiArICJcMlw2MlwxXDBcMVw2MlwxXDBcM1w2Mlw3XDBcMVw2MlwxXDE3MSIgKyAiXDNcMFwxXDYyXDFcMTczXDExXDBcM1w2MlwxXDBcMVw2MlwxMFwwIiArICJcMTFcNjJcMVwwXDRcNjJcMVwwXDJcNjJcMVwwXDFcNjJcMVwwIiArICJcM1w2Mlw1XDBcNFwxNzRcMVwxNzVcMVwxNzRcMVwxNzVcM1wxNzRcMVwxNzUiICsgIlwxXDE3NFwxXDBcMlwxNzRcMlwxNzVcMTFcMTc0XDFcMFwxXDE3NFwxXDAiICsgIlwyM1wxNzRcMVwwXDEyXDE3NFwxXDBcMlw3MlwxXDE3NlwzXDBcMlw3MiIgKyAiXDExXDBcM1w3MlwxXDBcMVw3MlwxMFwwXDExXDcyXDFcMFw0XDcyIiArICJcMVwwXDJcNzJcMVwwXDFcNzJcMVwwXDNcNzJcNlwwXDFcMTc3IiArICJcMlw3MlwxXDBcMlw3MlwxXDE3N1wyXDcyXDFcMFw0XDcyXDJcMCIgKyAiXDE2XDcyXDFcMTc3XDJcNzJcMVwxNzdcMlw3MlwxXDE3N1wxMFw3MlwxXDE3NyIgKyAiXDRcNzJcMVwxNzdcN1w3MlwyXDBcMVw3MlwxXDE3NlwzXDBcMVw3MiIgKyAiXDFcMTMzXDExXDBcM1w3MlwxXDBcMVw3MlwxMFwwXDExXDcyXDFcMCIgKyAiXDRcNzJcMVwwXDJcNzJcMVwwXDFcNzJcMVwwXDNcNzJcNzRcMCIgKyAiXDFcNzVcNFwwXDJcMTAwXDFcMjAwXDNcMFwyXDEwMFwxMVwwXDNcMTAwIiArICJcMVwwXDFcMTAwXDEwXDBcMTFcMTAwXDFcMFw0XDEwMFwxXDBcMlwxMDAiICsgIlwxXDBcMVwxMDBcMVwwXDNcMTAwXDZcMFwxXDIwMVwyXDEwMFwxXDAiICsgIlwyXDEwMFwxXDIwMVwyXDEwMFwxXDBcNFwxMDBcMlwwXDE2XDEwMFwxXDIwMSIKLQkJCQkrICJcMlwxMDBcMVwyMDFcMlwxMDBcMVwyMDFcMTBcMTAwXDFcMjAxXDRcMTAwXDFcMjAxIiArICJcN1wxMDBcMVwwXDJcMjAyXDFcMjAzXDFcMFwxXDIwNFwxMVwyMDJcMlwwIiArICJcNTJcMjAyXDJcMFwxXDEwMFwxXDIwMFwzXDBcMVwxMDBcMVwxMzNcMTFcMCIgKyAiXDNcMTAwXDFcMFwxXDEwMFwxMFwwXDExXDEwMFwxXDBcNFwxMDBcMVwwIiArICJcMlwxMDBcMVwwXDFcMTAwXDFcMFwzXDEwMFw2XDBcMlwyMDVcMVwyMDYiICsgIlwxXDBcNFwyMDVcMVwyMDRcNVwyMDVcMlwwXDUyXDIwNVwxXDBcMlwxMDUiICsgIlwxXDIwN1wzXDBcMlwxMDVcMTFcMFwzXDEwNVwxXDBcMVwxMDVcMTBcMCIgKyAiXDExXDEwNVwxXDBcNFwxMDVcMVwwXDJcMTA1XDFcMFwxXDEwNVwxXDAiICsgIlwzXDEwNVw2XDBcMVwyMTBcMlwxMDVcMVwwXDJcMTA1XDFcMjEwXDJcMTA1IiArICJcMVwwXDRcMTA1XDJcMFwxNlwxMDVcMVwyMTBcMlwxMDVcMVwyMTBcMlwxMDUiICsgIlwxXDIxMFwxMFwxMDVcMVwyMTBcNFwxMDVcMVwyMTBcN1wxMDVcMlwwXDFcMTA1IiArICJcMVwyMDdcM1wwXDFcMTA1XDFcMTMzXDExXDBcM1wxMDVcMVwwXDFcMTA1IiArICJcMTBcMFwxMVwxMDVcMVwwXDRcMTA1XDFcMFwyXDEwNVwxXDBcMVwxMDUiICsgIlwxXDBcM1wxMDVcNlwwXDFcMTEyXDFcMjExXDFcMjEyXDNcMFwxXDIxMSIgKyAiXDFcMjEzXDRcMFwxXDIxNFw0XDBcM1wyMTFcMVwwXDFcMjExXDEwXDAiICsgIlwxMVwyMTFcMVwwXDRcMjExXDFcMFwyXDIxMVwxXDBcMVwyMTFcMVwwIiArICJcM1wyMTFcNFwwXDFcMjE1XDFcMFwyXDExM1wxXDIxNlwzXDBcMlwxMTMiICsgIlwxMVwwXDNcMTEzXDFcMjE3XDFcMTEzXDEwXDBcMTFcMTEzXDFcMFw0XDExMyIgKyAiXDFcMFwyXDExM1wxXDBcMVwxMTNcMVwwXDNcMTEzXDZcMFwxXDIyMCIgKyAiXDJcMTEzXDFcMFwyXDExM1wxXDIyMFwyXDExM1wxXDBcNFwxMTNcMlwwIgotCQkJCSsgIlwxNlwxMTNcMVwyMjBcMlwxMTNcMVwyMjBcMlwxMTNcMVwyMjBcMTBcMTEzXDFcMjIwIiArICJcNFwxMTNcMVwyMjBcN1wxMTNcMVwwXDJcMjIxXDFcMjIyXDFcMFwxXDIyMyIgKyAiXDExXDIyMVwyXDBcNTJcMjIxXDFcMFwxXDExMlwxXDExM1wxXDIxNlwzXDAiICsgIlwxXDExM1wxXDEzM1w0XDBcMVwyMTRcNFwwXDNcMTEzXDFcMFwxXDExMyIgKyAiXDEwXDBcMTFcMTEzXDFcMFw0XDExM1wxXDBcMlwxMTNcMVwwXDFcMTEzIiArICJcMVwwXDNcMTEzXDZcMFwyXDIyNFwxXDIyNVwxXDBcNFwyMjRcMVwyMjMiICsgIlw1XDIyNFwyXDBcNTJcMjI0XDFcMFwxXDExMlwxM1wwXDFcMjE0XDU2XDAiICsgIlwxXDIyNlw3MlwwXDJcMjI3XDFcMjMwXDNcMFwyXDIyN1wxMVwwXDNcMjI3IiArICJcMVwwXDFcMjI3XDEwXDBcMTFcMjI3XDFcMFw0XDIyN1wxXDBcMlwyMjciICsgIlwxXDBcMVwyMjdcMVwwXDNcMjI3XDZcMFwyXDExM1wxXDIxNlwzXDAiICsgIlwyXDExM1wzXDBcMVwyMzFcNVwwXDFcMTEzXDFcMjMyXDFcMTEzXDFcMjE3IiArICJcMVwxMTNcMTBcMFwxMVwxMTNcMVwwXDRcMTEzXDFcMFwyXDExM1wxXDAiICsgIlwxXDExM1wxXDBcM1wxMTNcMTFcMFwxXDIzM1wxXDBcMVwyMzNcM1wwIiArICJcMVwyMzNcNFwwXDJcMjMzXDMwXDBcMVwyMzRcMjFcMFw0XDIzNVwxXDIzNiIgKyAiXDFcMjM1XDFcMjM2XDNcMjM1XDFcMjM2XDRcMjM1XDJcMjM2XDEyXDIzNVwxXDAiICsgIlwxNFwyMzVcMVwwXDIyXDIzNVwxXDBcMVwyMzdcMVwyNVwxXDEzMVwxXDI1IiArICJcMVwwXDFcMjVcMVwyMzdcMVwyNVwxXDBcMVwyNVw0XDBcMlwyNSIgKyAiXDFcMFwzXDI1XDFcMFwxXDI1XDEwXDBcMVwyMzdcMlwyNVwxXDIzNyIgKyAiXDJcMjVcMVwyMzdcMlwyNVwxXDBcNFwyNVwxXDBcMVwyMzdcMVwyNSIgKyAiXDFcMFwxXDI1XDFcMFwxXDIzN1wyXDI1XDM3XDBcMVwyNDBcNDFcMCIKLQkJCQkrICJcMVwyNDFcMlwxMzRcMVwwXDJcMTM0XDFcMjQxXDJcMTM0XDFcMFw0XDEzNCIgKyAiXDJcMFwxNlwxMzRcMVwyNDFcMlwxMzRcMVwyNDFcMlwxMzRcMVwyNDFcMTBcMTM0IiArICJcMVwyNDFcNFwxMzRcMVwyNDFcN1wxMzRcMVwwXDFcMjQyXDJcMTM2XDFcMCIgKyAiXDJcMTM2XDFcMjQyXDJcMTM2XDFcMFw0XDEzNlwyXDBcMTZcMTM2XDFcMjQyIiArICJcMlwxMzZcMVwyNDJcMlwxMzZcMVwyNDJcMTBcMTM2XDFcMjQyXDRcMTM2XDFcMjQyIiArICJcN1wxMzZcMTBcMFwxXDI0M1w2MlwwXDM1XDE0MVwxXDI0NFwzNVwxNDFcNDFcMCIgKyAiXDFcMjQ1XDEwM1wwXDFcMjQ2XDY1XDBcMlwyNDdcNjZcMFwyXDI1MFwxMDNcMCIgKyAiXDFcMjUxXDE3XDBcMlwxNDdcMVwxNTBcM1wwXDJcMTQ3XDExXDBcM1wxNDciICsgIlwxXDI1MlwxXDE0N1wxMFwwXDExXDE0N1wxXDBcNFwxNDdcMVwwXDJcMTQ3IiArICJcMVwwXDFcMTQ3XDFcMFwzXDE0N1w2XDBcMVwyNTNcMlwxNDdcMVwwIiArICJcMlwxNDdcMVwyNTNcMlwxNDdcMVwwXDRcMTQ3XDJcMFwxNlwxNDdcMVwyNTMiICsgIlwyXDE0N1wxXDI1M1wyXDE0N1wxXDI1M1wxMFwxNDdcMVwyNTNcNFwxNDdcMVwyNTMiICsgIlw3XDE0N1wyXDBcMVwxNDdcMVwxNTBcM1wwXDFcMTQ3XDEyXDBcM1wxNDciICsgIlwxXDBcMVwxNDdcMTBcMFwxMVwxNDdcMVwwXDRcMTQ3XDFcMFwyXDE0NyIgKyAiXDFcMFwxXDE0N1wxXDBcM1wxNDdcNlwwXDFcMjU0XDFcMTUyXDFcMTUzIiArICJcMVwxNTJcMVwyNTVcMVwxNTJcMVwyNTRcMTBcMTUyXDFcMjU2XDE2XDE1MlwxXDI1NCIgKyAiXDJcMTUyXDFcMjU0XDJcMTUyXDFcMjU0XDEwXDE1MlwxXDI1NFw0XDE1MlwxXDI1NCIgKyAiXDdcMTUyXDFcMFwxXDI1N1wxXDE1NVwxXDE1NlwzXDE1NVwxXDI1N1wxXDE1NSIgKyAiXDFcMjYwXDZcMTU1XDFcMjYxXDE2XDE1NVwxXDI1N1wyXDE1NVwxXDI1N1wyXDE1NSIKLQkJCQkrICJcMVwyNTdcMTBcMTU1XDFcMjU3XDRcMTU1XDFcMjU3XDdcMTU1XDFcMFwxXDI2MiIgKyAiXDFcMTU3XDFcMTYwXDFcMTU3XDFcMjYzXDFcMTU3XDFcMjYyXDEwXDE1N1wxXDI2NCIgKyAiXDE2XDE1N1wxXDI2MlwyXDE1N1wxXDI2MlwyXDE1N1wxXDI2MlwxMFwxNTdcMVwyNjIiICsgIlw0XDE1N1wxXDI2Mlw3XDE1N1wxXDBcMVwyNjVcMVwxNjJcMVwxNjNcM1wxNjIiICsgIlwxXDI2NVwxXDE2MlwxXDI2Nlw2XDE2MlwxXDI2N1wxNlwxNjJcMVwyNjVcMlwxNjIiICsgIlwxXDI2NVwyXDE2MlwxXDI2NVwxMFwxNjJcMVwyNjVcNFwxNjJcMVwyNjVcN1wxNjIiICsgIlwyNFwwXDFcMjcwXDQ3XDBcMVwyNzFcMVw1MVwxXDE2NVwxXDUxXDFcMCIgKyAiXDFcNTFcMVwyNzFcMVw1MVwxXDBcMVw1MVw0XDBcMlw1MVwxXDAiICsgIlwzXDUxXDFcMFwxXDUxXDEwXDBcMVwyNzFcMlw1MVwxXDI3MVwyXDUxIiArICJcMVwyNzFcMlw1MVwxXDBcNFw1MVwxXDBcMVwyNzFcMVw1MVwxXDAiICsgIlwxXDUxXDFcMFwxXDI3MVwyXDUxXDZcMFwxXDI3MlwxXDU1XDFcMTY3IiArICJcMVw1NVwxXDBcMVw1NVwxXDI3MlwxXDU1XDFcMFwxXDU1XDRcMCIgKyAiXDJcNTVcMVwwXDNcNTVcMVwwXDFcNTVcMTBcMFwxXDI3MlwyXDU1IiArICJcMVwyNzJcMlw1NVwxXDI3MlwyXDU1XDFcMFw0XDU1XDFcMFwxXDI3MiIgKyAiXDFcNTVcMVwwXDFcNTVcMVwwXDFcMjcyXDJcNTVcNlwwXDFcMjczIiArICJcMVw2MlwxXDE3MVwxXDYyXDFcMFwxXDYyXDFcMjczXDFcNjJcMVwwIiArICJcMVw2Mlw0XDBcMlw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxMFwwIiArICJcMVwyNzNcMlw2MlwxXDI3M1wyXDYyXDFcMjczXDJcNjJcMVwwXDRcNjIiICsgIlwxXDBcMVwyNzNcMVw2MlwxXDBcMVw2MlwxXDBcMVwyNzNcMlw2MiIgKyAiXDdcMFwxXDYyXDFcMTcxXDNcMFwxXDYyXDEyXDBcM1w2MlwxXDAiCi0JCQkJKyAiXDFcNjJcMTBcMFwxMVw2MlwxXDBcNFw2MlwxXDBcMlw2MlwxXDAiICsgIlwxXDYyXDFcMFwzXDYyXDZcMFwxXDI3NFwxXDcyXDFcMTc2XDFcNzIiICsgIlwxXDBcMVw3MlwxXDI3NFwxXDcyXDFcMFwxXDcyXDRcMFwyXDcyIiArICJcMVwwXDNcNzJcMVwwXDFcNzJcMTBcMFwxXDI3NFwyXDcyXDFcMjc0IiArICJcMlw3MlwxXDI3NFwyXDcyXDFcMFw0XDcyXDFcMFwxXDI3NFwxXDcyIiArICJcMVwwXDFcNzJcMVwwXDFcMjc0XDJcNzJcNlwwXDFcMjc1XDFcMTAwIiArICJcMVwyMDBcMVwxMDBcMVwwXDFcMTAwXDFcMjc1XDFcMTAwXDFcMFwxXDEwMCIgKyAiXDRcMFwyXDEwMFwxXDBcM1wxMDBcMVwwXDFcMTAwXDEwXDBcMVwyNzUiICsgIlwyXDEwMFwxXDI3NVwyXDEwMFwxXDI3NVwyXDEwMFwxXDBcNFwxMDBcMVwwIiArICJcMVwyNzVcMVwxMDBcMVwwXDFcMTAwXDFcMFwxXDI3NVwyXDEwMFw2XDAiICsgIlwxXDI3NlwxXDIwMlwxXDIwM1wxXDIwMlwxXDI3N1wxXDIwMlwxXDI3NlwxMFwyMDIiICsgIlwxXDMwMFwxNlwyMDJcMVwyNzZcMlwyMDJcMVwyNzZcMlwyMDJcMVwyNzZcMTBcMjAyIiArICJcMVwyNzZcNFwyMDJcMVwyNzZcN1wyMDJcMVwwXDFcMzAxXDFcMjA1XDFcMjA2IiArICJcM1wyMDVcMVwzMDFcMVwyMDVcMVwzMDJcNlwyMDVcMVwzMDNcMTZcMjA1XDFcMzAxIiArICJcMlwyMDVcMVwzMDFcMlwyMDVcMVwzMDFcMTBcMjA1XDFcMzAxXDRcMjA1XDFcMzAxIiArICJcN1wyMDVcMVwwXDFcMzA0XDFcMTA1XDFcMjA3XDFcMTA1XDFcMFwxXDEwNSIgKyAiXDFcMzA0XDFcMTA1XDFcMFwxXDEwNVw0XDBcMlwxMDVcMVwwXDNcMTA1IiArICJcMVwwXDFcMTA1XDEwXDBcMVwzMDRcMlwxMDVcMVwzMDRcMlwxMDVcMVwzMDQiICsgIlwyXDEwNVwxXDBcNFwxMDVcMVwwXDFcMzA0XDFcMTA1XDFcMFwxXDEwNSIgKyAiXDFcMFwxXDMwNFwyXDEwNVw2XDBcMlwyMTFcMVwyMTJcM1wwXDJcMjExIgotCQkJCSsgIlwxMVwwXDNcMjExXDFcMFwxXDIxMVwxMFwwXDExXDIxMVwxXDBcNFwyMTEiICsgIlwxXDBcMlwyMTFcMVwwXDFcMjExXDFcMFwzXDIxMVw2XDBcMVwzMDUiICsgIlwyXDIxMVwxXDBcMlwyMTFcMVwzMDVcMlwyMTFcMVwwXDRcMjExXDJcMCIgKyAiXDE2XDIxMVwxXDMwNVwyXDIxMVwxXDMwNVwyXDIxMVwxXDMwNVwxMFwyMTFcMVwzMDUiICsgIlw0XDIxMVwxXDMwNVw3XDIxMVwyXDBcMVwyMTFcMVwyMTJcM1wwXDFcMjExIiArICJcMTJcMFwzXDIxMVwxXDBcMVwyMTFcMTBcMFwxMVwyMTFcMVwwXDRcMjExIiArICJcMVwwXDJcMjExXDFcMFwxXDIxMVwxXDBcM1wyMTFcNlwwXDFcMzA2IiArICJcMVwxMTNcMVwyMTZcMVwxMTNcMVwwXDFcMTEzXDFcMzA2XDFcMTEzXDFcMCIgKyAiXDFcMTEzXDRcMFwyXDExM1wxXDBcM1wxMTNcMVwyMTdcMVwxMTNcMTBcMCIgKyAiXDFcMzA2XDJcMTEzXDFcMzA2XDJcMTEzXDFcMzA2XDJcMTEzXDFcMFw0XDExMyIgKyAiXDFcMFwxXDMwNlwxXDExM1wxXDBcMVwxMTNcMVwwXDFcMzA2XDJcMTEzIiArICJcNlwwXDFcMzA3XDFcMjIxXDFcMjIyXDFcMjIxXDFcMzEwXDFcMjIxXDFcMzA3IiArICJcMTBcMjIxXDFcMzExXDE2XDIyMVwxXDMwN1wyXDIyMVwxXDMwN1wyXDIyMVwxXDMwNyIgKyAiXDEwXDIyMVwxXDMwN1w0XDIyMVwxXDMwN1w3XDIyMVwxXDBcMVwzMTJcMVwyMjQiICsgIlwxXDIyNVwzXDIyNFwxXDMxMlwxXDIyNFwxXDMxM1w2XDIyNFwxXDMxNFwxNlwyMjQiICsgIlwxXDMxMlwyXDIyNFwxXDMxMlwyXDIyNFwxXDMxMlwxMFwyMjRcMVwzMTJcNFwyMjQiICsgIlwxXDMxMlw3XDIyNFwxXDBcMVwyMjZcMVwyMTFcMVwyMTJcM1wwXDFcMjExIiArICJcMVwyMTNcMTFcMFwzXDIxMVwxXDBcMVwyMTFcMTBcMFwxMVwyMTFcMVwwIiArICJcNFwyMTFcMVwwXDJcMjExXDFcMFwxXDIxMVwxXDBcM1wyMTFcNFwwIgotCQkJCSsgIlwxXDIxNVwxXDBcMVwzMTVcMlwyMjdcMVwwXDJcMjI3XDFcMzE1XDJcMjI3IiArICJcMVwwXDRcMjI3XDJcMFwxNlwyMjdcMVwzMTVcMlwyMjdcMVwzMTVcMlwyMjciICsgIlwxXDMxNVwxMFwyMjdcMVwzMTVcNFwyMjdcMVwzMTVcN1wyMjdcMVwwXDFcMzE2IiArICJcNVwwXDFcMzE2XDE2XDBcMlwzMTZcN1wwXDJcMzE2XDFcMFwyXDMxNiIgKyAiXDFcMFwyXDMxNlw3XDBcMlwzMTZcM1wwXDJcMzE2XDdcMFwyXDExMyIgKyAiXDFcMjE2XDNcMFwyXDExM1wxMVwwXDJcMTEzXDFcMzE3XDFcMjE3XDFcMTEzIiArICJcMTBcMFwxMVwxMTNcMVwwXDRcMTEzXDFcMFwyXDExM1wxXDBcMVwxMTMiICsgIlwxXDBcM1wxMTNcNTdcMFwxXDMyMFwyMVwwXDFcMzIxXDFcMjVcMVwxMzEiICsgIlwxXDI1XDFcMFwxXDI1XDFcMzIxXDFcMjVcMVwwXDFcMjVcNFwwIiArICJcMlwyNVwxXDBcM1wyNVwxXDBcMVwyNVwxMFwwXDFcMzIxXDJcMjUiICsgIlwxXDMyMVwyXDI1XDFcMzIxXDJcMjVcMVwwXDRcMjVcMVwwXDFcMzIxIiArICJcMVwyNVwxXDBcMVwyNVwxXDBcMVwzMjFcMlwyNVw2XDBcMVwzMjIiICsgIlwxXDEzNFwxXDEzNVwxXDEzNFwxXDBcMVwxMzRcMVwzMjJcMVwxMzRcMVwwIiArICJcMVwxMzRcNFwwXDJcMTM0XDFcMFwzXDEzNFwxXDBcMVwxMzRcMTBcMCIgKyAiXDFcMzIyXDJcMTM0XDFcMzIyXDJcMTM0XDFcMzIyXDJcMTM0XDFcMFw0XDEzNCIgKyAiXDFcMFwxXDMyMlwxXDEzNFwxXDBcMVwxMzRcMVwwXDFcMzIyXDJcMTM0IiArICJcNlwwXDFcMzIzXDFcMTM2XDFcMTM3XDFcMTM2XDFcMFwxXDEzNlwxXDMyMyIgKyAiXDFcMTM2XDFcMFwxXDEzNlw0XDBcMlwxMzZcMVwwXDNcMTM2XDFcMCIgKyAiXDFcMTM2XDEwXDBcMVwzMjNcMlwxMzZcMVwzMjNcMlwxMzZcMVwzMjNcMlwxMzYiICsgIlwxXDBcNFwxMzZcMVwwXDFcMzIzXDFcMTM2XDFcMFwxXDEzNlwxXDAiCi0JCQkJKyAiXDFcMzIzXDJcMTM2XDE1XDBcMVwzMjRcNjJcMFwzNFwxNDFcMVwzMjVcMVwyNDQiICsgIlwzNVwxNDFcNDJcMFwyXDMyNlwxMDJcMFwxXDMyN1w3NVwwXDJcMzMwXDc0XDAiICsgIlwxXDMzMVw3NlwwXDFcMzMyXDdcMFwxXDMzM1wxXDMzNFwxXDI1MlwxXDAiICsgIlwxXDI1MlwxXDMzM1wxXDMzNVwxXDBcMVwyNTJcNFwwXDJcMjUyXDFcMCIgKyAiXDNcMzMzXDFcMFwxXDMzM1wxMFwwXDExXDMzM1wxXDBcNFwzMzNcMVwwIiArICJcMlwzMzNcMVwwXDFcMzMzXDFcMFwzXDMzM1w2XDBcMVwzMzZcMVwxNDciICsgIlwxXDE1MFwxXDE0N1wxXDBcMVwxNDdcMVwzMzZcMVwxNDdcMVwwXDFcMTQ3IiArICJcNFwwXDJcMTQ3XDFcMFwzXDE0N1wxXDI1MlwxXDE0N1wxMFwwXDFcMzM2IiArICJcMlwxNDdcMVwzMzZcMlwxNDdcMVwzMzZcMlwxNDdcMVwwXDRcMTQ3XDFcMCIgKyAiXDFcMzM2XDFcMTQ3XDFcMFwxXDE0N1wxXDBcMVwzMzZcMlwxNDdcNlwwIiArICJcMVwzMzdcMVwxNTJcMVwxNTNcMVwxNTJcMVwxNTRcMVwxNTJcMVwzMzdcMjdcMTUyIiArICJcMVwzMzdcMlwxNTJcMVwzMzdcMlwxNTJcMVwzMzdcMTBcMTUyXDFcMzM3XDRcMTUyIiArICJcMVwzMzdcN1wxNTJcMVwwXDJcMTUyXDFcMTUzXDFcMFwxXDE1NFwxMlwxNTIiICsgIlwxXDBcNTJcMTUyXDFcMFwxXDM0MFwxXDE1NVwxXDE1NlwzXDE1NVwxXDM0MCIgKyAiXDFcMTU1XDFcMTU0XDI1XDE1NVwxXDM0MFwyXDE1NVwxXDM0MFwyXDE1NVwxXDM0MCIgKyAiXDEwXDE1NVwxXDM0MFw0XDE1NVwxXDM0MFw3XDE1NVwxXDBcMlwxNTVcMVwxNTYiICsgIlwxXDBcNFwxNTVcMVwxNTRcNlwxNTVcMVwwXDUyXDE1NVwxXDBcMVwzNDEiICsgIlwxXDE1N1wxXDE2MFwxXDE1N1wxXDE2MVwxXDE1N1wxXDM0MVwyN1wxNTdcMVwzNDEiICsgIlwyXDE1N1wxXDM0MVwyXDE1N1wxXDM0MVwxMFwxNTdcMVwzNDFcNFwxNTdcMVwzNDEiCi0JCQkJKyAiXDdcMTU3XDFcMFwyXDE1N1wxXDE2MFwxXDBcMVwxNjFcMTJcMTU3XDFcMCIgKyAiXDUyXDE1N1wxXDBcMVwzNDJcMVwxNjJcMVwxNjNcM1wxNjJcMVwzNDJcMVwxNjIiICsgIlwxXDE2MVwyNVwxNjJcMVwzNDJcMlwxNjJcMVwzNDJcMlwxNjJcMVwzNDJcMTBcMTYyIiArICJcMVwzNDJcNFwxNjJcMVwzNDJcN1wxNjJcMVwwXDJcMTYyXDFcMTYzXDFcMCIgKyAiXDRcMTYyXDFcMTYxXDZcMTYyXDFcMFw1MlwxNjJcMjVcMFwxXDM0M1w0NlwwIiArICJcMVwzNDRcMVw1MVwxXDE2NVwxXDUxXDFcMFwxXDUxXDFcMzQ0XDFcNTEiICsgIlwxXDBcMVw1MVw0XDBcMlw1MVwxXDBcM1w1MVwxXDBcMVw1MSIgKyAiXDEwXDBcMVwzNDRcMlw1MVwxXDM0NFwyXDUxXDFcMzQ0XDJcNTFcMVwwIiArICJcNFw1MVwxXDBcMVwzNDRcMVw1MVwxXDBcMVw1MVwxXDBcMVwzNDQiICsgIlwyXDUxXDZcMFwxXDM0NVwxXDU1XDFcMTY3XDFcNTVcMVwwXDFcNTUiICsgIlwxXDM0NVwxXDU1XDFcMFwxXDU1XDRcMFwyXDU1XDFcMFwzXDU1IiArICJcMVwwXDFcNTVcMTBcMFwxXDM0NVwyXDU1XDFcMzQ1XDJcNTVcMVwzNDUiICsgIlwyXDU1XDFcMFw0XDU1XDFcMFwxXDM0NVwxXDU1XDFcMFwxXDU1IiArICJcMVwwXDFcMzQ1XDJcNTVcNlwwXDFcMzQ2XDFcNjJcMVwxNzFcMVw2MiIgKyAiXDFcMFwxXDYyXDFcMzQ2XDFcNjJcMVwwXDFcNjJcNFwwXDJcNjIiICsgIlwxXDBcM1w2MlwxXDBcMVw2MlwxMFwwXDFcMzQ2XDJcNjJcMVwzNDYiICsgIlwyXDYyXDFcMzQ2XDJcNjJcMVwwXDRcNjJcMVwwXDFcMzQ2XDFcNjIiICsgIlwxXDBcMVw2MlwxXDBcMVwzNDZcMlw2Mlw2XDBcMVwzNDdcMVw3MiIgKyAiXDFcMTc2XDFcNzJcMVwwXDFcNzJcMVwzNDdcMVw3MlwxXDBcMVw3MiIgKyAiXDRcMFwyXDcyXDFcMFwzXDcyXDFcMFwxXDcyXDEwXDBcMVwzNDciICsgIlwyXDcyXDFcMzQ3XDJcNzJcMVwzNDdcMlw3MlwxXDBcNFw3MlwxXDAiCi0JCQkJKyAiXDFcMzQ3XDFcNzJcMVwwXDFcNzJcMVwwXDFcMzQ3XDJcNzJcNlwwIiArICJcMVwzNTBcMVwxMDBcMVwyMDBcMVwxMDBcMVwwXDFcMTAwXDFcMzUwXDFcMTAwIiArICJcMVwwXDFcMTAwXDRcMFwyXDEwMFwxXDBcM1wxMDBcMVwwXDFcMTAwIiArICJcMTBcMFwxXDM1MFwyXDEwMFwxXDM1MFwyXDEwMFwxXDM1MFwyXDEwMFwxXDAiICsgIlw0XDEwMFwxXDBcMVwzNTBcMVwxMDBcMVwwXDFcMTAwXDFcMFwxXDM1MCIgKyAiXDJcMTAwXDZcMFwxXDM1MVwxXDIwMlwxXDIwM1wxXDIwMlwxXDIwNFwxXDIwMiIgKyAiXDFcMzUxXDI3XDIwMlwxXDM1MVwyXDIwMlwxXDM1MVwyXDIwMlwxXDM1MVwxMFwyMDIiICsgIlwxXDM1MVw0XDIwMlwxXDM1MVw3XDIwMlwxXDBcMlwyMDJcMVwyMDNcMVwwIiArICJcMVwyMDRcMTJcMjAyXDFcMFw1MlwyMDJcMVwwXDFcMzUyXDFcMjA1XDFcMjA2IiArICJcM1wyMDVcMVwzNTJcMVwyMDVcMVwyMDRcMjVcMjA1XDFcMzUyXDJcMjA1XDFcMzUyIiArICJcMlwyMDVcMVwzNTJcMTBcMjA1XDFcMzUyXDRcMjA1XDFcMzUyXDdcMjA1XDFcMCIgKyAiXDJcMjA1XDFcMjA2XDFcMFw0XDIwNVwxXDIwNFw2XDIwNVwxXDBcNTJcMjA1IiArICJcMVwwXDFcMzUzXDFcMTA1XDFcMjA3XDFcMTA1XDFcMFwxXDEwNVwxXDM1MyIgKyAiXDFcMTA1XDFcMFwxXDEwNVw0XDBcMlwxMDVcMVwwXDNcMTA1XDFcMCIgKyAiXDFcMTA1XDEwXDBcMVwzNTNcMlwxMDVcMVwzNTNcMlwxMDVcMVwzNTNcMlwxMDUiICsgIlwxXDBcNFwxMDVcMVwwXDFcMzUzXDFcMTA1XDFcMFwxXDEwNVwxXDAiICsgIlwxXDM1M1wyXDEwNVw2XDBcMVwzNTRcMVwyMTFcMVwyMTJcMVwyMTFcMVwwIiArICJcMVwyMTFcMVwzNTRcMVwyMTFcMVwwXDFcMjExXDRcMFwyXDIxMVwxXDAiICsgIlwzXDIxMVwxXDBcMVwyMTFcMTBcMFwxXDM1NFwyXDIxMVwxXDM1NFwyXDIxMSIgKyAiXDFcMzU0XDJcMjExXDFcMFw0XDIxMVwxXDBcMVwzNTRcMVwyMTFcMVwwIgotCQkJCSsgIlwxXDIxMVwxXDBcMVwzNTRcMlwyMTFcNlwwXDFcMzU1XDFcMTEzXDFcMjE2IiArICJcMVwxMTNcMVwwXDFcMTEzXDFcMzU1XDFcMTEzXDFcMFwxXDExM1w0XDAiICsgIlwyXDExM1wxXDBcM1wxMTNcMVwyMTdcMVwxMTNcMTBcMFwxXDM1NVwyXDExMyIgKyAiXDFcMzU1XDJcMTEzXDFcMzU1XDJcMTEzXDFcMFw0XDExM1wxXDBcMVwzNTUiICsgIlwxXDExM1wxXDBcMVwxMTNcMVwwXDFcMzU1XDJcMTEzXDZcMFwxXDM1NiIgKyAiXDFcMjIxXDFcMjIyXDFcMjIxXDFcMjIzXDFcMjIxXDFcMzU2XDI3XDIyMVwxXDM1NiIgKyAiXDJcMjIxXDFcMzU2XDJcMjIxXDFcMzU2XDEwXDIyMVwxXDM1Nlw0XDIyMVwxXDM1NiIgKyAiXDdcMjIxXDFcMFwyXDIyMVwxXDIyMlwxXDBcMVwyMjNcMTJcMjIxXDFcMCIgKyAiXDUyXDIyMVwxXDBcMVwzNTdcMVwyMjRcMVwyMjVcM1wyMjRcMVwzNTdcMVwyMjQiICsgIlwxXDIyM1wyNVwyMjRcMVwzNTdcMlwyMjRcMVwzNTdcMlwyMjRcMVwzNTdcMTBcMjI0IiArICJcMVwzNTdcNFwyMjRcMVwzNTdcN1wyMjRcMVwwXDJcMjI0XDFcMjI1XDFcMCIgKyAiXDRcMjI0XDFcMjIzXDZcMjI0XDFcMFw1MlwyMjRcMVwwXDFcMzYwXDFcMjI3IiArICJcMVwyMzBcMVwyMjdcMVwwXDFcMjI3XDFcMzYwXDFcMjI3XDFcMFwxXDIyNyIgKyAiXDRcMFwyXDIyN1wxXDBcM1wyMjdcMVwwXDFcMjI3XDEwXDBcMVwzNjAiICsgIlwyXDIyN1wxXDM2MFwyXDIyN1wxXDM2MFwyXDIyN1wxXDBcNFwyMjdcMVwwIiArICJcMVwzNjBcMVwyMjdcMVwwXDFcMjI3XDFcMFwxXDM2MFwyXDIyN1w2XDAiICsgIlwxXDM2MVw1XDBcMVwzNjFcMVwzNjJcMTVcMFwyXDM2MVw3XDBcMlwzNjEiICsgIlwxXDBcMlwzNjFcMVwwXDJcMzYxXDdcMFwyXDM2MVwzXDBcMlwzNjEiICsgIlw3XDBcMlwxMTNcMVwyMTZcM1wwXDJcMTEzXDExXDBcM1wxMTNcMVwzNjMiICsgIlwxXDExM1wxMFwwXDExXDExM1wxXDBcNFwxMTNcMVwwXDJcMTEzXDFcMCIKLQkJCQkrICJcMVwxMTNcMVwwXDNcMTEzXDYwXDBcMVwzNjRcMjBcMFwxXDM2NVwxXDI1IiArICJcMVwxMzFcMVwyNVwxXDBcMVwyNVwxXDM2NVwxXDI1XDFcMFwxXDI1IiArICJcNFwwXDJcMjVcMVwwXDNcMjVcMVwwXDFcMjVcMTBcMFwxXDM2NSIgKyAiXDJcMjVcMVwzNjVcMlwyNVwxXDM2NVwyXDI1XDFcMFw0XDI1XDFcMCIgKyAiXDFcMzY1XDFcMjVcMVwwXDFcMjVcMVwwXDFcMzY1XDJcMjVcNlwwIiArICJcMVwzNjZcMVwxMzRcMVwxMzVcMVwxMzRcMVwwXDFcMTM0XDFcMzY2XDFcMTM0IiArICJcMVwwXDFcMTM0XDRcMFwyXDEzNFwxXDBcM1wxMzRcMVwwXDFcMTM0IiArICJcMTBcMFwxXDM2NlwyXDEzNFwxXDM2NlwyXDEzNFwxXDM2NlwyXDEzNFwxXDAiICsgIlw0XDEzNFwxXDBcMVwzNjZcMVwxMzRcMVwwXDFcMTM0XDFcMFwxXDM2NiIgKyAiXDJcMTM0XDZcMFwxXDM2N1wxXDEzNlwxXDEzN1wxXDEzNlwxXDBcMVwxMzYiICsgIlwxXDM2N1wxXDEzNlwxXDBcMVwxMzZcNFwwXDJcMTM2XDFcMFwzXDEzNiIgKyAiXDFcMFwxXDEzNlwxMFwwXDFcMzY3XDJcMTM2XDFcMzY3XDJcMTM2XDFcMzY3IiArICJcMlwxMzZcMVwwXDRcMTM2XDFcMFwxXDM2N1wxXDEzNlwxXDBcMVwxMzYiICsgIlwxXDBcMVwzNjdcMlwxMzZcMzBcMFwxXDM3MFwxMjNcMFwxXDM3MVw2N1wwIiArICJcMVwzNzJcNjZcMFwyXDM3M1w3M1wwXDFcMzc0XDI0XDBcMlwzMzNcMVwzMzQiICsgIlwxXDM3NVwxXDBcMVwzNzVcMlwzMzNcMVwwXDFcMzc1XDFcMzc2XDNcMCIgKyAiXDJcMzc1XDFcMFwzXDMzM1wxXDBcMVwzMzNcMTBcMFwxMVwzMzNcMVwwIiArICJcNFwzMzNcMVwwXDJcMzMzXDFcMFwxXDMzM1wxXDBcM1wzMzNcNlwwIiArICJcMVwzNzdcMlwzMzNcMVwwXDJcMzMzXDFcMzc3XDJcMzMzXDFcMFw0XDMzMyIgKyAiXDJcMFwxNlwzMzNcMVwzNzdcMlwzMzNcMVwzNzdcMlwzMzNcMVwzNzdcMTBcMzMzIgotCQkJCSsgIlwxXDM3N1w0XDMzM1wxXDM3N1w3XDMzM1wyXDBcMVwzMzNcMVwzMzRcM1wwIiArICJcMVwzMzNcMTJcMFwzXDMzM1wxXDBcMVwzMzNcMTBcMFwxMVwzMzNcMVwwIiArICJcNFwzMzNcMVwwXDJcMzMzXDFcMFwxXDMzM1wxXDBcM1wzMzNcNlwwIiArICJcMVx1MDEwMFwxXDE0N1wxXDE1MFwxXDE0N1wxXDBcMVwxNDdcMVx1MDEwMFwxXDE0NyIgKyAiXDFcMFwxXDE0N1w0XDBcMlwxNDdcMVwwXDNcMTQ3XDFcMjUyXDFcMTQ3IiArICJcMTBcMFwxXHUwMTAwXDJcMTQ3XDFcdTAxMDBcMlwxNDdcMVx1MDEwMFwyXDE0N1wxXDAiICsgIlw0XDE0N1wxXDBcMVx1MDEwMFwxXDE0N1wxXDBcMVwxNDdcMVwwXDFcdTAxMDAiICsgIlwyXDE0N1w2XDBcMVx1MDEwMVwxXDE1MlwxXDE1M1wxXDE1MlwxXDE1NFwxXDE1MiIgKyAiXDFcdTAxMDFcMjdcMTUyXDFcdTAxMDFcMlwxNTJcMVx1MDEwMVwyXDE1MlwxXHUwMTAxXDEwXDE1MiIgKyAiXDFcdTAxMDFcNFwxNTJcMVx1MDEwMVw3XDE1MlwxXDBcMVx1MDEwMlwxXDE1NVwxXDE1NiIgKyAiXDNcMTU1XDFcdTAxMDJcMVwxNTVcMVwxNTRcMjVcMTU1XDFcdTAxMDJcMlwxNTVcMVx1MDEwMiIgKyAiXDJcMTU1XDFcdTAxMDJcMTBcMTU1XDFcdTAxMDJcNFwxNTVcMVx1MDEwMlw3XDE1NVwxXDAiICsgIlwxXHUwMTAzXDFcMTU3XDFcMTYwXDFcMTU3XDFcMTYxXDFcMTU3XDFcdTAxMDNcMjdcMTU3IiArICJcMVx1MDEwM1wyXDE1N1wxXHUwMTAzXDJcMTU3XDFcdTAxMDNcMTBcMTU3XDFcdTAxMDNcNFwxNTciICsgIlwxXHUwMTAzXDdcMTU3XDFcMFwxXHUwMTA0XDFcMTYyXDFcMTYzXDNcMTYyXDFcdTAxMDQiICsgIlwxXDE2MlwxXDE2MVwyNVwxNjJcMVx1MDEwNFwyXDE2MlwxXHUwMTA0XDJcMTYyXDFcdTAxMDQiICsgIlwxMFwxNjJcMVx1MDEwNFw0XDE2MlwxXHUwMTA0XDdcMTYyXDFcMFwyXHUwMTA1XDFcdTAxMDYiCi0JCQkJKyAiXDFcMzQzXDFcdTAxMDdcMVwzNDNcMlx1MDEwNVwxXHUwMTA4XDFcMzQzXDFcdTAxMDlcM1x1MDEwNSIgKyAiXDJcMzQzXDRcdTAxMDVcMVwwXDQ1XHUwMTA1XDFcMFwxXHUwMTBhXDFcNTFcMVwxNjUiICsgIlwxXDUxXDFcMFwxXDUxXDFcdTAxMGFcMVw1MVwxXDBcMVw1MVw0XDAiICsgIlwyXDUxXDFcMFwzXDUxXDFcMFwxXDUxXDEwXDBcMVx1MDEwYVwyXDUxIiArICJcMVx1MDEwYVwyXDUxXDFcdTAxMGFcMlw1MVwxXDBcNFw1MVwxXDBcMVx1MDEwYSIgKyAiXDFcNTFcMVwwXDFcNTFcMVwwXDFcdTAxMGFcMlw1MVw2XDBcMVx1MDEwYiIgKyAiXDFcNTVcMVwxNjdcMVw1NVwxXDBcMVw1NVwxXHUwMTBiXDFcNTVcMVwwIiArICJcMVw1NVw0XDBcMlw1NVwxXDBcM1w1NVwxXDBcMVw1NVwxMFwwIiArICJcMVx1MDEwYlwyXDU1XDFcdTAxMGJcMlw1NVwxXHUwMTBiXDJcNTVcMVwwXDRcNTUiICsgIlwxXDBcMVx1MDEwYlwxXDU1XDFcMFwxXDU1XDFcMFwxXHUwMTBiXDJcNTUiICsgIlw2XDBcMVx1MDEwY1wxXDYyXDFcMTcxXDFcNjJcMVwwXDFcNjJcMVx1MDEwYyIgKyAiXDFcNjJcMVwwXDFcNjJcNFwwXDJcNjJcMVwwXDNcNjJcMVwwIiArICJcMVw2MlwxMFwwXDFcdTAxMGNcMlw2MlwxXHUwMTBjXDJcNjJcMVx1MDEwY1wyXDYyIiArICJcMVwwXDRcNjJcMVwwXDFcdTAxMGNcMVw2MlwxXDBcMVw2MlwxXDAiICsgIlwxXHUwMTBjXDJcNjJcNlwwXDFcdTAxMGRcMVw3MlwxXDE3NlwxXDcyXDFcMCIgKyAiXDFcNzJcMVx1MDEwZFwxXDcyXDFcMFwxXDcyXDRcMFwyXDcyXDFcMCIgKyAiXDNcNzJcMVwwXDFcNzJcMTBcMFwxXHUwMTBkXDJcNzJcMVx1MDEwZFwyXDcyIiArICJcMVx1MDEwZFwyXDcyXDFcMFw0XDcyXDFcMFwxXHUwMTBkXDFcNzJcMVwwIiArICJcMVw3MlwxXDBcMVx1MDEwZFwyXDcyXDZcMFwxXHUwMTBlXDFcMTAwXDFcMjAwIiArICJcMVwxMDBcMVwwXDFcMTAwXDFcdTAxMGVcMVwxMDBcMVwwXDFcMTAwXDRcMCIKLQkJCQkrICJcMlwxMDBcMVwwXDNcMTAwXDFcMFwxXDEwMFwxMFwwXDFcdTAxMGVcMlwxMDAiICsgIlwxXHUwMTBlXDJcMTAwXDFcdTAxMGVcMlwxMDBcMVwwXDRcMTAwXDFcMFwxXHUwMTBlIiArICJcMVwxMDBcMVwwXDFcMTAwXDFcMFwxXHUwMTBlXDJcMTAwXDZcMFwxXHUwMTBmIiArICJcMVwyMDJcMVwyMDNcMVwyMDJcMVwyMDRcMVwyMDJcMVx1MDEwZlwyN1wyMDJcMVx1MDEwZiIgKyAiXDJcMjAyXDFcdTAxMGZcMlwyMDJcMVx1MDEwZlwxMFwyMDJcMVx1MDEwZlw0XDIwMlwxXHUwMTBmIiArICJcN1wyMDJcMVwwXDFcdTAxMTBcMVwyMDVcMVwyMDZcM1wyMDVcMVx1MDExMFwxXDIwNSIgKyAiXDFcMjA0XDI1XDIwNVwxXHUwMTEwXDJcMjA1XDFcdTAxMTBcMlwyMDVcMVx1MDExMFwxMFwyMDUiICsgIlwxXHUwMTEwXDRcMjA1XDFcdTAxMTBcN1wyMDVcMVwwXDFcdTAxMTFcMVwxMDVcMVwyMDciICsgIlwxXDEwNVwxXDBcMVwxMDVcMVx1MDExMVwxXDEwNVwxXDBcMVwxMDVcNFwwIiArICJcMlwxMDVcMVwwXDNcMTA1XDFcMFwxXDEwNVwxMFwwXDFcdTAxMTFcMlwxMDUiICsgIlwxXHUwMTExXDJcMTA1XDFcdTAxMTFcMlwxMDVcMVwwXDRcMTA1XDFcMFwxXHUwMTExIiArICJcMVwxMDVcMVwwXDFcMTA1XDFcMFwxXHUwMTExXDJcMTA1XDZcMFwxXHUwMTEyIiArICJcMVwyMTFcMVwyMTJcMVwyMTFcMVwwXDFcMjExXDFcdTAxMTJcMVwyMTFcMVwwIiArICJcMVwyMTFcNFwwXDJcMjExXDFcMFwzXDIxMVwxXDBcMVwyMTFcMTBcMCIgKyAiXDFcdTAxMTJcMlwyMTFcMVx1MDExMlwyXDIxMVwxXHUwMTEyXDJcMjExXDFcMFw0XDIxMSIgKyAiXDFcMFwxXHUwMTEyXDFcMjExXDFcMFwxXDIxMVwxXDBcMVx1MDExMlwyXDIxMSIgKyAiXDZcMFwxXHUwMTEzXDFcMTEzXDFcMjE2XDFcMTEzXDFcMFwxXDExM1wxXHUwMTEzIiArICJcMVwxMTNcMVwwXDFcMTEzXDRcMFwyXDExM1wxXDBcM1wxMTNcMVwyMTciCi0JCQkJKyAiXDFcMTEzXDEwXDBcMVx1MDExM1wyXDExM1wxXHUwMTEzXDJcMTEzXDFcdTAxMTNcMlwxMTMiICsgIlwxXDBcNFwxMTNcMVwwXDFcdTAxMTNcMVwxMTNcMVwwXDFcMTEzXDFcMCIgKyAiXDFcdTAxMTNcMlwxMTNcNlwwXDFcdTAxMTRcMVwyMjFcMVwyMjJcMVwyMjFcMVwyMjMiICsgIlwxXDIyMVwxXHUwMTE0XDI3XDIyMVwxXHUwMTE0XDJcMjIxXDFcdTAxMTRcMlwyMjFcMVx1MDExNCIgKyAiXDEwXDIyMVwxXHUwMTE0XDRcMjIxXDFcdTAxMTRcN1wyMjFcMVwwXDFcdTAxMTVcMVwyMjQiICsgIlwxXDIyNVwzXDIyNFwxXHUwMTE1XDFcMjI0XDFcMjIzXDI1XDIyNFwxXHUwMTE1XDJcMjI0IiArICJcMVx1MDExNVwyXDIyNFwxXHUwMTE1XDEwXDIyNFwxXHUwMTE1XDRcMjI0XDFcdTAxMTVcN1wyMjQiICsgIlwxXDBcMVx1MDExNlwxXDIyN1wxXDIzMFwxXDIyN1wxXDBcMVwyMjdcMVx1MDExNiIgKyAiXDFcMjI3XDFcMFwxXDIyN1w0XDBcMlwyMjdcMVwwXDNcMjI3XDFcMCIgKyAiXDFcMjI3XDEwXDBcMVx1MDExNlwyXDIyN1wxXHUwMTE2XDJcMjI3XDFcdTAxMTZcMlwyMjciICsgIlwxXDBcNFwyMjdcMVwwXDFcdTAxMTZcMVwyMjdcMVwwXDFcMjI3XDFcMCIgKyAiXDFcdTAxMTZcMlwyMjdcNlwwXDFcdTAxMTdcNVwwXDFcdTAxMTdcMVwzNjJcMTVcMCIgKyAiXDJcdTAxMTdcN1wwXDJcdTAxMTdcMVwwXDJcdTAxMTdcMVwwXDJcdTAxMTdcN1wwIiArICJcMlx1MDExN1wzXDBcMlx1MDExN1w3XDBcMVx1MDExOFw1XDBcMVx1MDExOFwxNlwwIiArICJcMlx1MDExOFw3XDBcMlx1MDExOFwxXDBcMlx1MDExOFwxXDBcMlx1MDExOFw3XDAiICsgIlwyXHUwMTE4XDNcMFwyXHUwMTE4XDdcMFwyXHUwMTE5XDFcdTAxMWFcMVx1MDExYlwxXHUwMTFjIiArICJcMVx1MDExYlwyXHUwMTE5XDFcdTAxMWRcMVx1MDExYlwxXHUwMTFlXDNcdTAxMTlcMlx1MDExYlw0XHUwMTE5IgotCQkJCSsgIlwxXDBcNDVcdTAxMTlcNTRcMFwxXHUwMTFmXDE3XDBcMVx1MDEyMFwxXDI1XDFcMTMxIiArICJcMVwyNVwxXDBcMVwyNVwxXHUwMTIwXDFcMjVcMVwwXDFcMjVcNFwwIiArICJcMlwyNVwxXDBcM1wyNVwxXDBcMVwyNVwxMFwwXDFcdTAxMjBcMlwyNSIgKyAiXDFcdTAxMjBcMlwyNVwxXHUwMTIwXDJcMjVcMVwwXDRcMjVcMVwwXDFcdTAxMjAiICsgIlwxXDI1XDFcMFwxXDI1XDFcMFwxXHUwMTIwXDJcMjVcNlwwXDFcdTAxMjEiICsgIlwxXDEzNFwxXDEzNVwxXDEzNFwxXDBcMVwxMzRcMVx1MDEyMVwxXDEzNFwxXDAiICsgIlwxXDEzNFw0XDBcMlwxMzRcMVwwXDNcMTM0XDFcMFwxXDEzNFwxMFwwIiArICJcMVx1MDEyMVwyXDEzNFwxXHUwMTIxXDJcMTM0XDFcdTAxMjFcMlwxMzRcMVwwXDRcMTM0IiArICJcMVwwXDFcdTAxMjFcMVwxMzRcMVwwXDFcMTM0XDFcMFwxXHUwMTIxXDJcMTM0IiArICJcNlwwXDFcdTAxMjJcMVwxMzZcMVwxMzdcMVwxMzZcMVwwXDFcMTM2XDFcdTAxMjIiICsgIlwxXDEzNlwxXDBcMVwxMzZcNFwwXDJcMTM2XDFcMFwzXDEzNlwxXDAiICsgIlwxXDEzNlwxMFwwXDFcdTAxMjJcMlwxMzZcMVx1MDEyMlwyXDEzNlwxXHUwMTIyXDJcMTM2IiArICJcMVwwXDRcMTM2XDFcMFwxXHUwMTIyXDFcMTM2XDFcMFwxXDEzNlwxXDAiICsgIlwxXHUwMTIyXDJcMTM2XDUxXDBcMVx1MDEyM1w1MVwwXDFcdTAxMjRcMTExXDBcMlx1MDEyNSIgKyAiXDM3XDBcMVx1MDEyNlw2NlwwXDFcMzc1XDFcMFwxXDM3NVwzXDBcMVwzNzUiICsgIlwxXDM3NlwzXDBcMlwzNzVcNTNcMFwxXHUwMTI3XDFcMzMzXDFcMzM0XDFcMzMzIiArICJcMVwwXDFcMzMzXDFcdTAxMjdcMVwzMzNcMVwwXDFcMzMzXDFcMzc2XDNcMCIgKyAiXDJcMzMzXDFcMFwzXDMzM1wxXDBcMVwzMzNcMTBcMFwxXHUwMTI3XDJcMzMzIiArICJcMVx1MDEyN1wyXDMzM1wxXHUwMTI3XDJcMzMzXDFcMFw0XDMzM1wxXDBcMVx1MDEyNyIKLQkJCQkrICJcMVwzMzNcMVwwXDFcMzMzXDFcMFwxXHUwMTI3XDJcMzMzXDZcMFwxXHUwMTI4IiArICJcMVwxNDdcMVwxNTBcMVwxNDdcMVwwXDFcMTQ3XDFcdTAxMjhcMVwxNDdcMVwwIiArICJcMVwxNDdcNFwwXDJcMTQ3XDFcMFwzXDE0N1wxXDI1MlwxXDE0N1wxMFwwIiArICJcMVx1MDEyOFwyXDE0N1wxXHUwMTI4XDJcMTQ3XDFcdTAxMjhcMlwxNDdcMVwwXDRcMTQ3IiArICJcMVwwXDFcdTAxMjhcMVwxNDdcMVwwXDFcMTQ3XDFcMFwxXHUwMTI4XDJcMTQ3IiArICJcNlwwXDFcdTAxMjlcMVwxNTJcMVwxNTNcMVwxNTJcMVwxNTRcMVwxNTJcMVx1MDEyOSIgKyAiXDI3XDE1MlwxXHUwMTI5XDJcMTUyXDFcdTAxMjlcMlwxNTJcMVx1MDEyOVwxMFwxNTJcMVx1MDEyOSIgKyAiXDRcMTUyXDFcdTAxMjlcN1wxNTJcMVwwXDFcdTAxMmFcMVwxNTVcMVwxNTZcM1wxNTUiICsgIlwxXHUwMTJhXDFcMTU1XDFcMTU0XDI1XDE1NVwxXHUwMTJhXDJcMTU1XDFcdTAxMmFcMlwxNTUiICsgIlwxXHUwMTJhXDEwXDE1NVwxXHUwMTJhXDRcMTU1XDFcdTAxMmFcN1wxNTVcMVwwXDFcdTAxMmIiICsgIlwxXDE1N1wxXDE2MFwxXDE1N1wxXDE2MVwxXDE1N1wxXHUwMTJiXDI3XDE1N1wxXHUwMTJiIiArICJcMlwxNTdcMVx1MDEyYlwyXDE1N1wxXHUwMTJiXDEwXDE1N1wxXHUwMTJiXDRcMTU3XDFcdTAxMmIiICsgIlw3XDE1N1wxXDBcMVx1MDEyY1wxXDE2MlwxXDE2M1wzXDE2MlwxXHUwMTJjXDFcMTYyIiArICJcMVwxNjFcMjVcMTYyXDFcdTAxMmNcMlwxNjJcMVx1MDEyY1wyXDE2MlwxXHUwMTJjXDEwXDE2MiIgKyAiXDFcdTAxMmNcNFwxNjJcMVx1MDEyY1w3XDE2MlwxXDBcMlx1MDEwNVwxXHUwMTA2XDFcdTAxMmQiICsgIlwxXDBcM1x1MDEwNVwxXDBcMVx1MDEyZFwxXHUwMTA5XDNcdTAxMDVcMlx1MDEyZFw0XHUwMTA1IiArICJcMVwwXDQ1XHUwMTA1XDFcMFwxXHUwMTJlXDFcdTAxMDVcMVx1MDEwNlwxXHUwMTJkXDJcdTAxMDUiCi0JCQkJKyAiXDFcdTAxMmVcMlx1MDEwNVwxXHUwMTJkXDFcdTAxMmZcM1x1MDEwNVwyXHUwMTJkXDE2XHUwMTA1XDFcdTAxMmUiICsgIlwyXHUwMTA1XDFcdTAxMmVcMlx1MDEwNVwxXHUwMTJlXDEwXHUwMTA1XDFcdTAxMmVcNFx1MDEwNVwxXHUwMTJlIiArICJcN1x1MDEwNVwxXDBcMlx1MDEwN1wxXHUwMTMwXDFcMFwxXHUwMTJkXDExXHUwMTA3XDJcMCIgKyAiXDUyXHUwMTA3XDFcMFwyXHUwMTA4XDFcdTAxMzFcMVwwXDRcdTAxMDhcMVx1MDEyZFw1XHUwMTA4IiArICJcMlwwXDUyXHUwMTA4XDFcMFwxXHUwMTMyXDFcNTFcMVwxNjVcMVw1MVwxXDAiICsgIlwxXDUxXDFcdTAxMzJcMVw1MVwxXDBcMVw1MVw0XDBcMlw1MVwxXDAiICsgIlwzXDUxXDFcMFwxXDUxXDEwXDBcMVx1MDEzMlwyXDUxXDFcdTAxMzJcMlw1MSIgKyAiXDFcdTAxMzJcMlw1MVwxXDBcNFw1MVwxXDBcMVx1MDEzMlwxXDUxXDFcMCIgKyAiXDFcNTFcMVwwXDFcdTAxMzJcMlw1MVw2XDBcMVx1MDEzM1wxXDU1XDFcMTY3IiArICJcMVw1NVwxXDBcMVw1NVwxXHUwMTMzXDFcNTVcMVwwXDFcNTVcNFwwIiArICJcMlw1NVwxXDBcM1w1NVwxXDBcMVw1NVwxMFwwXDFcdTAxMzNcMlw1NSIgKyAiXDFcdTAxMzNcMlw1NVwxXHUwMTMzXDJcNTVcMVwwXDRcNTVcMVwwXDFcdTAxMzMiICsgIlwxXDU1XDFcMFwxXDU1XDFcMFwxXHUwMTMzXDJcNTVcNlwwXDFcdTAxMzQiICsgIlwxXDYyXDFcMTcxXDFcNjJcMVwwXDFcNjJcMVx1MDEzNFwxXDYyXDFcMCIgKyAiXDFcNjJcNFwwXDJcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMTBcMCIgKyAiXDFcdTAxMzRcMlw2MlwxXHUwMTM0XDJcNjJcMVx1MDEzNFwyXDYyXDFcMFw0XDYyIiArICJcMVwwXDFcdTAxMzRcMVw2MlwxXDBcMVw2MlwxXDBcMVx1MDEzNFwyXDYyIiArICJcNlwwXDFcdTAxMzVcMVw3MlwxXDE3NlwxXDcyXDFcMFwxXDcyXDFcdTAxMzUiICsgIlwxXDcyXDFcMFwxXDcyXDRcMFwyXDcyXDFcMFwzXDcyXDFcMCIKLQkJCQkrICJcMVw3MlwxMFwwXDFcdTAxMzVcMlw3MlwxXHUwMTM1XDJcNzJcMVx1MDEzNVwyXDcyIiArICJcMVwwXDRcNzJcMVwwXDFcdTAxMzVcMVw3MlwxXDBcMVw3MlwxXDAiICsgIlwxXHUwMTM1XDJcNzJcNlwwXDFcdTAxMzZcMVwxMDBcMVwyMDBcMVwxMDBcMVwwIiArICJcMVwxMDBcMVx1MDEzNlwxXDEwMFwxXDBcMVwxMDBcNFwwXDJcMTAwXDFcMCIgKyAiXDNcMTAwXDFcMFwxXDEwMFwxMFwwXDFcdTAxMzZcMlwxMDBcMVx1MDEzNlwyXDEwMCIgKyAiXDFcdTAxMzZcMlwxMDBcMVwwXDRcMTAwXDFcMFwxXHUwMTM2XDFcMTAwXDFcMCIgKyAiXDFcMTAwXDFcMFwxXHUwMTM2XDJcMTAwXDZcMFwxXHUwMTM3XDFcMjAyXDFcMjAzIiArICJcMVwyMDJcMVwyMDRcMVwyMDJcMVx1MDEzN1wyN1wyMDJcMVx1MDEzN1wyXDIwMlwxXHUwMTM3IiArICJcMlwyMDJcMVx1MDEzN1wxMFwyMDJcMVx1MDEzN1w0XDIwMlwxXHUwMTM3XDdcMjAyXDFcMCIgKyAiXDFcdTAxMzhcMVwyMDVcMVwyMDZcM1wyMDVcMVx1MDEzOFwxXDIwNVwxXDIwNFwyNVwyMDUiICsgIlwxXHUwMTM4XDJcMjA1XDFcdTAxMzhcMlwyMDVcMVx1MDEzOFwxMFwyMDVcMVx1MDEzOFw0XDIwNSIgKyAiXDFcdTAxMzhcN1wyMDVcMVwwXDFcdTAxMzlcMVwxMDVcMVwyMDdcMVwxMDVcMVwwIiArICJcMVwxMDVcMVx1MDEzOVwxXDEwNVwxXDBcMVwxMDVcNFwwXDJcMTA1XDFcMCIgKyAiXDNcMTA1XDFcMFwxXDEwNVwxMFwwXDFcdTAxMzlcMlwxMDVcMVx1MDEzOVwyXDEwNSIgKyAiXDFcdTAxMzlcMlwxMDVcMVwwXDRcMTA1XDFcMFwxXHUwMTM5XDFcMTA1XDFcMCIgKyAiXDFcMTA1XDFcMFwxXHUwMTM5XDJcMTA1XDZcMFwxXHUwMTNhXDFcMjExXDFcMjEyIiArICJcMVwyMTFcMVwwXDFcMjExXDFcdTAxM2FcMVwyMTFcMVwwXDFcMjExXDRcMCIgKyAiXDJcMjExXDFcMFwzXDIxMVwxXDBcMVwyMTFcMTBcMFwxXHUwMTNhXDJcMjExIgotCQkJCSsgIlwxXHUwMTNhXDJcMjExXDFcdTAxM2FcMlwyMTFcMVwwXDRcMjExXDFcMFwxXHUwMTNhIiArICJcMVwyMTFcMVwwXDFcMjExXDFcMFwxXHUwMTNhXDJcMjExXDZcMFwxXHUwMTNiIiArICJcMVwxMTNcMVwyMTZcMVwxMTNcMVwwXDFcMTEzXDFcdTAxM2JcMVwxMTNcMVwwIiArICJcMVwxMTNcNFwwXDJcMTEzXDFcMFwzXDExM1wxXDIxN1wxXDExM1wxMFwwIiArICJcMVx1MDEzYlwyXDExM1wxXHUwMTNiXDJcMTEzXDFcdTAxM2JcMlwxMTNcMVwwXDRcMTEzIiArICJcMVwwXDFcdTAxM2JcMVwxMTNcMVwwXDFcMTEzXDFcMFwxXHUwMTNiXDJcMTEzIiArICJcNlwwXDFcdTAxM2NcMVwyMjFcMVwyMjJcMVwyMjFcMVwyMjNcMVwyMjFcMVx1MDEzYyIgKyAiXDI3XDIyMVwxXHUwMTNjXDJcMjIxXDFcdTAxM2NcMlwyMjFcMVx1MDEzY1wxMFwyMjFcMVx1MDEzYyIgKyAiXDRcMjIxXDFcdTAxM2NcN1wyMjFcMVwwXDFcdTAxM2RcMVwyMjRcMVwyMjVcM1wyMjQiICsgIlwxXHUwMTNkXDFcMjI0XDFcMjIzXDI1XDIyNFwxXHUwMTNkXDJcMjI0XDFcdTAxM2RcMlwyMjQiICsgIlwxXHUwMTNkXDEwXDIyNFwxXHUwMTNkXDRcMjI0XDFcdTAxM2RcN1wyMjRcMVwwXDFcdTAxM2UiICsgIlwxXDIyN1wxXDIzMFwxXDIyN1wxXDBcMVwyMjdcMVx1MDEzZVwxXDIyN1wxXDAiICsgIlwxXDIyN1w0XDBcMlwyMjdcMVwwXDNcMjI3XDFcMFwxXDIyN1wxMFwwIiArICJcMVx1MDEzZVwyXDIyN1wxXHUwMTNlXDJcMjI3XDFcdTAxM2VcMlwyMjdcMVwwXDRcMjI3IiArICJcMVwwXDFcdTAxM2VcMVwyMjdcMVwwXDFcMjI3XDFcMFwxXHUwMTNlXDJcMjI3IiArICJcNlwwXDFcdTAxM2ZcNVwwXDFcdTAxM2ZcMVwzNjJcMTVcMFwyXHUwMTNmXDdcMCIgKyAiXDJcdTAxM2ZcMVwwXDJcdTAxM2ZcMVwwXDJcdTAxM2ZcN1wwXDJcdTAxM2ZcM1wwIiArICJcMlx1MDEzZlw3XDBcMVx1MDE0MFw1XDBcMVx1MDE0MFwxNlwwXDJcdTAxNDBcN1wwIgotCQkJCSsgIlwyXHUwMTQwXDFcMFwyXHUwMTQwXDFcMFwyXHUwMTQwXDdcMFwyXHUwMTQwXDNcMCIgKyAiXDJcdTAxNDBcN1wwXDJcdTAxMTlcMVx1MDExYVwxXHUwMTQxXDFcMFwzXHUwMTE5XDFcMCIgKyAiXDFcdTAxNDFcMVx1MDExZVwzXHUwMTE5XDJcdTAxNDFcNFx1MDExOVwxXDBcNDVcdTAxMTlcMVwwIiArICJcMVx1MDE0MlwxXHUwMTE5XDFcdTAxMWFcMVx1MDE0MVwyXHUwMTE5XDFcdTAxNDJcMlx1MDExOVwxXHUwMTQxIiArICJcMVx1MDE0M1wzXHUwMTE5XDJcdTAxNDFcMTZcdTAxMTlcMVx1MDE0MlwyXHUwMTE5XDFcdTAxNDJcMlx1MDExOSIgKyAiXDFcdTAxNDJcMTBcdTAxMTlcMVx1MDE0Mlw0XHUwMTE5XDFcdTAxNDJcN1x1MDExOVwxXDBcMlx1MDExYyIgKyAiXDFcdTAxNDRcMVwwXDFcdTAxNDFcMTFcdTAxMWNcMlwwXDUyXHUwMTFjXDFcMFwyXHUwMTFkIiArICJcMVx1MDE0NVwxXDBcNFx1MDExZFwxXHUwMTQxXDVcdTAxMWRcMlwwXDUyXHUwMTFkXDIzXDAiICsgIlwxXHUwMTQ2XDUwXDBcMVx1MDE0N1wxXDI1XDFcMTMxXDFcMjVcMVwwXDFcMjUiICsgIlwxXHUwMTQ3XDFcMjVcMVwwXDFcMjVcNFwwXDJcMjVcMVwwXDNcMjUiICsgIlwxXDBcMVwyNVwxMFwwXDFcdTAxNDdcMlwyNVwxXHUwMTQ3XDJcMjVcMVx1MDE0NyIgKyAiXDJcMjVcMVwwXDRcMjVcMVwwXDFcdTAxNDdcMVwyNVwxXDBcMVwyNSIgKyAiXDFcMFwxXHUwMTQ3XDJcMjVcNlwwXDFcdTAxNDhcMVwxMzRcMVwxMzVcMVwxMzQiICsgIlwxXDBcMVwxMzRcMVx1MDE0OFwxXDEzNFwxXDBcMVwxMzRcNFwwXDJcMTM0IiArICJcMVwwXDNcMTM0XDFcMFwxXDEzNFwxMFwwXDFcdTAxNDhcMlwxMzRcMVx1MDE0OCIgKyAiXDJcMTM0XDFcdTAxNDhcMlwxMzRcMVwwXDRcMTM0XDFcMFwxXHUwMTQ4XDFcMTM0IiArICJcMVwwXDFcMTM0XDFcMFwxXHUwMTQ4XDJcMTM0XDZcMFwxXHUwMTQ5XDFcMTM2IgotCQkJCSsgIlwxXDEzN1wxXDEzNlwxXDBcMVwxMzZcMVx1MDE0OVwxXDEzNlwxXDBcMVwxMzYiICsgIlw0XDBcMlwxMzZcMVwwXDNcMTM2XDFcMFwxXDEzNlwxMFwwXDFcdTAxNDkiICsgIlwyXDEzNlwxXHUwMTQ5XDJcMTM2XDFcdTAxNDlcMlwxMzZcMVwwXDRcMTM2XDFcMCIgKyAiXDFcdTAxNDlcMVwxMzZcMVwwXDFcMTM2XDFcMFwxXHUwMTQ5XDJcMTM2XDUyXDAiICsgIlwyXHUwMTRhXDczXDBcMVx1MDE0YlwxMDZcMFwyXHUwMTRjXDdcMFwxXHUwMTRkXDFcMzMzIiArICJcMVwzMzRcMVwzMzNcMVwwXDFcMzMzXDFcdTAxNGRcMVwzMzNcMVwwXDFcMzMzIiArICJcMVwzNzZcM1wwXDJcMzMzXDFcMFwzXDMzM1wxXDBcMVwzMzNcMTBcMCIgKyAiXDFcdTAxNGRcMlwzMzNcMVx1MDE0ZFwyXDMzM1wxXHUwMTRkXDJcMzMzXDFcMFw0XDMzMyIgKyAiXDFcMFwxXHUwMTRkXDFcMzMzXDFcMFwxXDMzM1wxXDBcMVx1MDE0ZFwyXDMzMyIgKyAiXDZcMFwxXHUwMTRlXDFcMTQ3XDFcMTUwXDFcMTQ3XDFcMFwxXDE0N1wxXHUwMTRlIiArICJcMVwxNDdcMVwwXDFcMTQ3XDRcMFwyXDE0N1wxXDBcM1wxNDdcMVwyNTIiICsgIlwxXDE0N1wxMFwwXDFcdTAxNGVcMlwxNDdcMVx1MDE0ZVwyXDE0N1wxXHUwMTRlXDJcMTQ3IiArICJcMVwwXDRcMTQ3XDFcMFwxXHUwMTRlXDFcMTQ3XDFcMFwxXDE0N1wxXDAiICsgIlwxXHUwMTRlXDJcMTQ3XDZcMFwxXHUwMTRmXDFcMTUyXDFcMTUzXDFcMTUyXDFcMTU0IiArICJcMVwxNTJcMVx1MDE0ZlwyN1wxNTJcMVx1MDE0ZlwyXDE1MlwxXHUwMTRmXDJcMTUyXDFcdTAxNGYiICsgIlwxMFwxNTJcMVx1MDE0Zlw0XDE1MlwxXHUwMTRmXDdcMTUyXDFcMFwxXHUwMTUwXDFcMTU1IiArICJcMVwxNTZcM1wxNTVcMVx1MDE1MFwxXDE1NVwxXDE1NFwyNVwxNTVcMVx1MDE1MFwyXDE1NSIgKyAiXDFcdTAxNTBcMlwxNTVcMVx1MDE1MFwxMFwxNTVcMVx1MDE1MFw0XDE1NVwxXHUwMTUwXDdcMTU1IgotCQkJCSsgIlwxXDBcMVx1MDE1MVwxXDE1N1wxXDE2MFwxXDE1N1wxXDE2MVwxXDE1N1wxXHUwMTUxIiArICJcMjdcMTU3XDFcdTAxNTFcMlwxNTdcMVx1MDE1MVwyXDE1N1wxXHUwMTUxXDEwXDE1N1wxXHUwMTUxIiArICJcNFwxNTdcMVx1MDE1MVw3XDE1N1wxXDBcMVx1MDE1MlwxXDE2MlwxXDE2M1wzXDE2MiIgKyAiXDFcdTAxNTJcMVwxNjJcMVwxNjFcMjVcMTYyXDFcdTAxNTJcMlwxNjJcMVx1MDE1MlwyXDE2MiIgKyAiXDFcdTAxNTJcMTBcMTYyXDFcdTAxNTJcNFwxNjJcMVx1MDE1Mlw3XDE2Mlw0XDBcMVx1MDEyZCIgKyAiXDFcMFwxXHUwMTJkXDNcMFwxXHUwMTJkXDFcdTAxMDlcM1wwXDJcdTAxMmRcNTNcMCIgKyAiXDFcdTAxNTNcMVx1MDEwNVwxXHUwMTA2XDFcdTAxMDVcMVwwXDFcdTAxMDVcMVx1MDE1M1wxXHUwMTA1IiArICJcMVwwXDFcdTAxMDVcMVx1MDEwOVwxMVx1MDEwNVwxXDBcMTFcdTAxMDVcMVx1MDE1M1wyXHUwMTA1IiArICJcMVx1MDE1M1wyXHUwMTA1XDFcdTAxNTNcMTBcdTAxMDVcMVx1MDE1M1w0XHUwMTA1XDFcdTAxNTNcN1x1MDEwNSIgKyAiXDFcMFwxXHUwMTU0XDFcdTAxMDdcMVx1MDEzMFwxXHUwMTA3XDFcdTAxNTVcMVx1MDEwN1wxXHUwMTU0IiArICJcMTBcdTAxMDdcMVx1MDE1NlwxNlx1MDEwN1wxXHUwMTU0XDJcdTAxMDdcMVx1MDE1NFwyXHUwMTA3XDFcdTAxNTQiICsgIlwxMFx1MDEwN1wxXHUwMTU0XDRcdTAxMDdcMVx1MDE1NFw3XHUwMTA3XDFcMFwxXHUwMTU3XDFcdTAxMDgiICsgIlwxXHUwMTMxXDNcdTAxMDhcMVx1MDE1N1wxXHUwMTA4XDFcdTAxNThcNlx1MDEwOFwxXHUwMTU5XDE2XHUwMTA4IiArICJcMVx1MDE1N1wyXHUwMTA4XDFcdTAxNTdcMlx1MDEwOFwxXHUwMTU3XDEwXHUwMTA4XDFcdTAxNTdcNFx1MDEwOCIgKyAiXDFcdTAxNTdcN1x1MDEwOFwxXDBcMVx1MDE1YVwxXDUxXDFcMTY1XDFcNTFcMVwwIgotCQkJCSsgIlwxXDUxXDFcdTAxNWFcMVw1MVwxXDBcMVw1MVw0XDBcMlw1MVwxXDAiICsgIlwzXDUxXDFcMFwxXDUxXDEwXDBcMVx1MDE1YVwyXDUxXDFcdTAxNWFcMlw1MSIgKyAiXDFcdTAxNWFcMlw1MVwxXDBcNFw1MVwxXDBcMVx1MDE1YVwxXDUxXDFcMCIgKyAiXDFcNTFcMVwwXDFcdTAxNWFcMlw1MVw2XDBcMVx1MDE1YlwxXDU1XDFcMTY3IiArICJcMVw1NVwxXDBcMVw1NVwxXHUwMTViXDFcNTVcMVwwXDFcNTVcNFwwIiArICJcMlw1NVwxXDBcM1w1NVwxXDBcMVw1NVwxMFwwXDFcdTAxNWJcMlw1NSIgKyAiXDFcdTAxNWJcMlw1NVwxXHUwMTViXDJcNTVcMVwwXDRcNTVcMVwwXDFcdTAxNWIiICsgIlwxXDU1XDFcMFwxXDU1XDFcMFwxXHUwMTViXDJcNTVcNlwwXDFcdTAxNWMiICsgIlwxXDYyXDFcMTcxXDFcNjJcMVwwXDFcNjJcMVx1MDE1Y1wxXDYyXDFcMCIgKyAiXDFcNjJcNFwwXDJcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMTBcMCIgKyAiXDFcdTAxNWNcMlw2MlwxXHUwMTVjXDJcNjJcMVx1MDE1Y1wyXDYyXDFcMFw0XDYyIiArICJcMVwwXDFcdTAxNWNcMVw2MlwxXDBcMVw2MlwxXDBcMVx1MDE1Y1wyXDYyIiArICJcNlwwXDFcdTAxNWRcMVw3MlwxXDE3NlwxXDcyXDFcMFwxXDcyXDFcdTAxNWQiICsgIlwxXDcyXDFcMFwxXDcyXDRcMFwyXDcyXDFcMFwzXDcyXDFcMCIgKyAiXDFcNzJcMTBcMFwxXHUwMTVkXDJcNzJcMVx1MDE1ZFwyXDcyXDFcdTAxNWRcMlw3MiIgKyAiXDFcMFw0XDcyXDFcMFwxXHUwMTVkXDFcNzJcMVwwXDFcNzJcMVwwIiArICJcMVx1MDE1ZFwyXDcyXDZcMFwxXHUwMTVlXDFcMTAwXDFcMjAwXDFcMTAwXDFcMCIgKyAiXDFcMTAwXDFcdTAxNWVcMVwxMDBcMVwwXDFcMTAwXDRcMFwyXDEwMFwxXDAiICsgIlwzXDEwMFwxXDBcMVwxMDBcMTBcMFwxXHUwMTVlXDJcMTAwXDFcdTAxNWVcMlwxMDAiICsgIlwxXHUwMTVlXDJcMTAwXDFcMFw0XDEwMFwxXDBcMVx1MDE1ZVwxXDEwMFwxXDAiCi0JCQkJKyAiXDFcMTAwXDFcMFwxXHUwMTVlXDJcMTAwXDZcMFwxXHUwMTVmXDFcMjAyXDFcMjAzIiArICJcMVwyMDJcMVwyMDRcMVwyMDJcMVx1MDE1ZlwyN1wyMDJcMVx1MDE1ZlwyXDIwMlwxXHUwMTVmIiArICJcMlwyMDJcMVx1MDE1ZlwxMFwyMDJcMVx1MDE1Zlw0XDIwMlwxXHUwMTVmXDdcMjAyXDFcMCIgKyAiXDFcdTAxNjBcMVwyMDVcMVwyMDZcM1wyMDVcMVx1MDE2MFwxXDIwNVwxXDIwNFwyNVwyMDUiICsgIlwxXHUwMTYwXDJcMjA1XDFcdTAxNjBcMlwyMDVcMVx1MDE2MFwxMFwyMDVcMVx1MDE2MFw0XDIwNSIgKyAiXDFcdTAxNjBcN1wyMDVcMVwwXDFcdTAxNjFcMVwxMDVcMVwyMDdcMVwxMDVcMVwwIiArICJcMVwxMDVcMVx1MDE2MVwxXDEwNVwxXDBcMVwxMDVcNFwwXDJcMTA1XDFcMCIgKyAiXDNcMTA1XDFcMFwxXDEwNVwxMFwwXDFcdTAxNjFcMlwxMDVcMVx1MDE2MVwyXDEwNSIgKyAiXDFcdTAxNjFcMlwxMDVcMVwwXDRcMTA1XDFcMFwxXHUwMTYxXDFcMTA1XDFcMCIgKyAiXDFcMTA1XDFcMFwxXHUwMTYxXDJcMTA1XDZcMFwxXHUwMTYyXDFcMjExXDFcMjEyIiArICJcMVwyMTFcMVwwXDFcMjExXDFcdTAxNjJcMVwyMTFcMVwwXDFcMjExXDRcMCIgKyAiXDJcMjExXDFcMFwzXDIxMVwxXDBcMVwyMTFcMTBcMFwxXHUwMTYyXDJcMjExIiArICJcMVx1MDE2MlwyXDIxMVwxXHUwMTYyXDJcMjExXDFcMFw0XDIxMVwxXDBcMVx1MDE2MiIgKyAiXDFcMjExXDFcMFwxXDIxMVwxXDBcMVx1MDE2MlwyXDIxMVw2XDBcMVx1MDE2MyIgKyAiXDFcMTEzXDFcMjE2XDFcMTEzXDFcMFwxXDExM1wxXHUwMTYzXDFcMTEzXDFcMCIgKyAiXDFcMTEzXDRcMFwyXDExM1wxXDBcM1wxMTNcMVwyMTdcMVwxMTNcMTBcMCIgKyAiXDFcdTAxNjNcMlwxMTNcMVx1MDE2M1wyXDExM1wxXHUwMTYzXDJcMTEzXDFcMFw0XDExMyIgKyAiXDFcMFwxXHUwMTYzXDFcMTEzXDFcMFwxXDExM1wxXDBcMVx1MDE2M1wyXDExMyIKLQkJCQkrICJcNlwwXDFcdTAxNjRcMVwyMjFcMVwyMjJcMVwyMjFcMVwyMjNcMVwyMjFcMVx1MDE2NCIgKyAiXDI3XDIyMVwxXHUwMTY0XDJcMjIxXDFcdTAxNjRcMlwyMjFcMVx1MDE2NFwxMFwyMjFcMVx1MDE2NCIgKyAiXDRcMjIxXDFcdTAxNjRcN1wyMjFcMVwwXDFcdTAxNjVcMVwyMjRcMVwyMjVcM1wyMjQiICsgIlwxXHUwMTY1XDFcMjI0XDFcMjIzXDI1XDIyNFwxXHUwMTY1XDJcMjI0XDFcdTAxNjVcMlwyMjQiICsgIlwxXHUwMTY1XDEwXDIyNFwxXHUwMTY1XDRcMjI0XDFcdTAxNjVcN1wyMjRcMVwwXDFcdTAxNjYiICsgIlwxXDIyN1wxXDIzMFwxXDIyN1wxXDBcMVwyMjdcMVx1MDE2NlwxXDIyN1wxXDAiICsgIlwxXDIyN1w0XDBcMlwyMjdcMVwwXDNcMjI3XDFcMFwxXDIyN1wxMFwwIiArICJcMVx1MDE2NlwyXDIyN1wxXHUwMTY2XDJcMjI3XDFcdTAxNjZcMlwyMjdcMVwwXDRcMjI3IiArICJcMVwwXDFcdTAxNjZcMVwyMjdcMVwwXDFcMjI3XDFcMFwxXHUwMTY2XDJcMjI3IiArICJcNlwwXDFcdTAxNjdcNVwwXDFcdTAxNjdcMVwzNjJcMTVcMFwyXHUwMTY3XDdcMCIgKyAiXDJcdTAxNjdcMVwwXDJcdTAxNjdcMVwwXDJcdTAxNjdcN1wwXDJcdTAxNjdcM1wwIiArICJcMlx1MDE2N1w3XDBcMVx1MDE2OFw1XDBcMVx1MDE2OFwxNlwwXDJcdTAxNjhcN1wwIiArICJcMlx1MDE2OFwxXDBcMlx1MDE2OFwxXDBcMlx1MDE2OFw3XDBcMlx1MDE2OFwzXDAiICsgIlwyXHUwMTY4XDEyXDBcMVx1MDE0MVwxXDBcMVx1MDE0MVwzXDBcMVx1MDE0MVwxXHUwMTFlIiArICJcM1wwXDJcdTAxNDFcNTNcMFwxXHUwMTY5XDFcdTAxMTlcMVx1MDExYVwxXHUwMTE5XDFcMCIgKyAiXDFcdTAxMTlcMVx1MDE2OVwxXHUwMTE5XDFcMFwxXHUwMTE5XDFcdTAxMWVcMTFcdTAxMTlcMVwwIiArICJcMTFcdTAxMTlcMVx1MDE2OVwyXHUwMTE5XDFcdTAxNjlcMlx1MDExOVwxXHUwMTY5XDEwXHUwMTE5XDFcdTAxNjkiCi0JCQkJKyAiXDRcdTAxMTlcMVx1MDE2OVw3XHUwMTE5XDFcMFwxXHUwMTZhXDFcdTAxMWNcMVx1MDE0NFwxXHUwMTFjIiArICJcMVx1MDE2YlwxXHUwMTFjXDFcdTAxNmFcMTBcdTAxMWNcMVx1MDE2Y1wxNlx1MDExY1wxXHUwMTZhXDJcdTAxMWMiICsgIlwxXHUwMTZhXDJcdTAxMWNcMVx1MDE2YVwxMFx1MDExY1wxXHUwMTZhXDRcdTAxMWNcMVx1MDE2YVw3XHUwMTFjIiArICJcMVwwXDFcdTAxNmRcMVx1MDExZFwxXHUwMTQ1XDNcdTAxMWRcMVx1MDE2ZFwxXHUwMTFkXDFcdTAxNmUiICsgIlw2XHUwMTFkXDFcdTAxNmZcMTZcdTAxMWRcMVx1MDE2ZFwyXHUwMTFkXDFcdTAxNmRcMlx1MDExZFwxXHUwMTZkIiArICJcMTBcdTAxMWRcMVx1MDE2ZFw0XHUwMTFkXDFcdTAxNmRcN1x1MDExZFw0N1wwXDFcdTAxNzBcMjRcMCIgKyAiXDJcMjVcMVwxMzFcMVwyNVwxXDBcM1wyNVwxXDBcMVwyNVw0XDAiICsgIlwyXDI1XDFcMFwzXDI1XDFcMFwxXDI1XDEwXDBcMTFcMjVcMVwwIiArICJcNFwyNVwxXDBcMlwyNVwxXDBcMVwyNVwxXDBcM1wyNVw2XDAiICsgIlwxXHUwMTcxXDFcMTM0XDFcMTM1XDFcMTM0XDFcMFwxXDEzNFwxXHUwMTcxXDFcMTM0IiArICJcMVwwXDFcMTM0XDRcMFwyXDEzNFwxXDBcM1wxMzRcMVwwXDFcMTM0IiArICJcMTBcMFwxXHUwMTcxXDJcMTM0XDFcdTAxNzFcMlwxMzRcMVx1MDE3MVwyXDEzNFwxXDAiICsgIlw0XDEzNFwxXDBcMVx1MDE3MVwxXDEzNFwxXDBcMVwxMzRcMVwwXDFcdTAxNzEiICsgIlwyXDEzNFw2XDBcMVx1MDE3MlwxXDEzNlwxXDEzN1wxXDEzNlwxXDBcMVwxMzYiICsgIlwxXHUwMTcyXDFcMTM2XDFcMFwxXDEzNlw0XDBcMlwxMzZcMVwwXDNcMTM2IiArICJcMVwwXDFcMTM2XDEwXDBcMVx1MDE3MlwyXDEzNlwxXHUwMTcyXDJcMTM2XDFcdTAxNzIiICsgIlwyXDEzNlwxXDBcNFwxMzZcMVwwXDFcdTAxNzJcMVwxMzZcMVwwXDFcMTM2IgotCQkJCSsgIlwxXDBcMVx1MDE3MlwyXDEzNlw1NFwwXDFcdTAxNzNcNjVcMFwyXHUwMTc0XDMwXDAiICsgIlwxXHUwMTc1XDFcMzMzXDFcMzM0XDFcMzMzXDFcMFwxXDMzM1wxXHUwMTc1XDFcMzMzIiArICJcMVwwXDFcMzMzXDFcMzc2XDNcMFwyXDMzM1wxXDBcM1wzMzNcMVwwIiArICJcMVwzMzNcMTBcMFwxXHUwMTc1XDJcMzMzXDFcdTAxNzVcMlwzMzNcMVx1MDE3NVwyXDMzMyIgKyAiXDFcMFw0XDMzM1wxXDBcMVx1MDE3NVwxXDMzM1wxXDBcMVwzMzNcMVwwIiArICJcMVx1MDE3NVwyXDMzM1w2XDBcMVx1MDE3NlwxXDE0N1wxXDE1MFwxXDE0N1wxXDAiICsgIlwxXDE0N1wxXHUwMTc2XDFcMTQ3XDFcMFwxXDE0N1w0XDBcMlwxNDdcMVwwIiArICJcM1wxNDdcMVwyNTJcMVwxNDdcMTBcMFwxXHUwMTc2XDJcMTQ3XDFcdTAxNzZcMlwxNDciICsgIlwxXHUwMTc2XDJcMTQ3XDFcMFw0XDE0N1wxXDBcMVx1MDE3NlwxXDE0N1wxXDAiICsgIlwxXDE0N1wxXDBcMVx1MDE3NlwyXDE0N1w2XDBcMVx1MDE3N1wxXDE1MlwxXDE1MyIgKyAiXDFcMTUyXDFcMTU0XDFcMTUyXDFcdTAxNzdcMjdcMTUyXDFcdTAxNzdcMlwxNTJcMVx1MDE3NyIgKyAiXDJcMTUyXDFcdTAxNzdcMTBcMTUyXDFcdTAxNzdcNFwxNTJcMVx1MDE3N1w3XDE1MlwxXDAiICsgIlwxXHUwMTc4XDFcMTU1XDFcMTU2XDNcMTU1XDFcdTAxNzhcMVwxNTVcMVwxNTRcMjVcMTU1IiArICJcMVx1MDE3OFwyXDE1NVwxXHUwMTc4XDJcMTU1XDFcdTAxNzhcMTBcMTU1XDFcdTAxNzhcNFwxNTUiICsgIlwxXHUwMTc4XDdcMTU1XDFcMFwxXHUwMTc5XDFcMTU3XDFcMTYwXDFcMTU3XDFcMTYxIiArICJcMVwxNTdcMVx1MDE3OVwyN1wxNTdcMVx1MDE3OVwyXDE1N1wxXHUwMTc5XDJcMTU3XDFcdTAxNzkiICsgIlwxMFwxNTdcMVx1MDE3OVw0XDE1N1wxXHUwMTc5XDdcMTU3XDFcMFwxXHUwMTdhXDFcMTYyIgotCQkJCSsgIlwxXDE2M1wzXDE2MlwxXHUwMTdhXDFcMTYyXDFcMTYxXDI1XDE2MlwxXHUwMTdhXDJcMTYyIiArICJcMVx1MDE3YVwyXDE2MlwxXHUwMTdhXDEwXDE2MlwxXHUwMTdhXDRcMTYyXDFcdTAxN2FcN1wxNjIiICsgIlwxXDBcMVx1MDE3YlwxXHUwMTA1XDFcdTAxMDZcMVx1MDEwNVwxXDBcMVx1MDEwNVwxXHUwMTdiIiArICJcMVx1MDEwNVwxXDBcMVx1MDEwNVwxXHUwMTA5XDExXHUwMTA1XDFcMFwxMVx1MDEwNVwxXHUwMTdiIiArICJcMlx1MDEwNVwxXHUwMTdiXDJcdTAxMDVcMVx1MDE3YlwxMFx1MDEwNVwxXHUwMTdiXDRcdTAxMDVcMVx1MDE3YiIgKyAiXDdcdTAxMDVcMVwwXDFcdTAxN2NcMVx1MDEwN1wxXHUwMTMwXDFcdTAxMDdcMVx1MDEyZFwxXHUwMTA3IiArICJcMVx1MDE3Y1wyN1x1MDEwN1wxXHUwMTdjXDJcdTAxMDdcMVx1MDE3Y1wyXHUwMTA3XDFcdTAxN2NcMTBcdTAxMDciICsgIlwxXHUwMTdjXDRcdTAxMDdcMVx1MDE3Y1w3XHUwMTA3XDFcMFwyXHUwMTA3XDFcdTAxMzBcMlx1MDEyZCIgKyAiXDFcdTAxNTVcM1x1MDEwN1wxXHUwMTU1XDFcdTAxN2RcM1x1MDEwN1wyXHUwMTJkXDUyXHUwMTA3XDFcMCIgKyAiXDJcdTAxMDdcMVx1MDEzMFwxXDBcMVx1MDEyZFwxMlx1MDEwN1wxXDBcNTJcdTAxMDdcMVwwIiArICJcMVx1MDE3ZVwxXHUwMTA4XDFcdTAxMzFcM1x1MDEwOFwxXHUwMTdlXDFcdTAxMDhcMVx1MDEyZFwyNVx1MDEwOCIgKyAiXDFcdTAxN2VcMlx1MDEwOFwxXHUwMTdlXDJcdTAxMDhcMVx1MDE3ZVwxMFx1MDEwOFwxXHUwMTdlXDRcdTAxMDgiICsgIlwxXHUwMTdlXDdcdTAxMDhcMVwwXDJcdTAxMDhcMVx1MDEzMVwxXHUwMTJkXDFcdTAxMDhcMVx1MDE1OCIgKyAiXDJcdTAxMDhcMVx1MDEyZFwxXHUwMTU4XDFcdTAxN2ZcM1x1MDEwOFwyXHUwMTJkXDUyXHUwMTA4XDFcMCIgKyAiXDJcdTAxMDhcMVx1MDEzMVwxXDBcNFx1MDEwOFwxXHUwMTJkXDZcdTAxMDhcMVwwXDUyXHUwMTA4IgotCQkJCSsgIlwxXDBcMlw1MVwxXDE2NVwxXDUxXDFcMFwzXDUxXDFcMFwxXDUxIiArICJcNFwwXDJcNTFcMVwwXDNcNTFcMVwwXDFcNTFcMTBcMFwxMVw1MSIgKyAiXDFcMFw0XDUxXDFcMFwyXDUxXDFcMFwxXDUxXDFcMFwzXDUxIiArICJcNlwwXDJcNTVcMVwxNjdcMVw1NVwxXDBcM1w1NVwxXDBcMVw1NSIgKyAiXDRcMFwyXDU1XDFcMFwzXDU1XDFcMFwxXDU1XDEwXDBcMTFcNTUiICsgIlwxXDBcNFw1NVwxXDBcMlw1NVwxXDBcMVw1NVwxXDBcM1w1NSIgKyAiXDZcMFwyXDYyXDFcMTcxXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjIiICsgIlw0XDBcMlw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxMFwwXDExXDYyIiArICJcMVwwXDRcNjJcMVwwXDJcNjJcMVwwXDFcNjJcMVwwXDNcNjIiICsgIlw2XDBcMlw3MlwxXDE3NlwxXDcyXDFcMFwzXDcyXDFcMFwxXDcyIiArICJcNFwwXDJcNzJcMVwwXDNcNzJcMVwwXDFcNzJcMTBcMFwxMVw3MiIgKyAiXDFcMFw0XDcyXDFcMFwyXDcyXDFcMFwxXDcyXDFcMFwzXDcyIiArICJcNlwwXDJcMTAwXDFcMjAwXDFcMTAwXDFcMFwzXDEwMFwxXDBcMVwxMDAiICsgIlw0XDBcMlwxMDBcMVwwXDNcMTAwXDFcMFwxXDEwMFwxMFwwXDExXDEwMCIgKyAiXDFcMFw0XDEwMFwxXDBcMlwxMDBcMVwwXDFcMTAwXDFcMFwzXDEwMCIgKyAiXDZcMFwxXHUwMTgwXDFcMjAyXDFcMjAzXDFcMjAyXDFcMjA0XDFcMjAyXDFcdTAxODAiICsgIlwyN1wyMDJcMVx1MDE4MFwyXDIwMlwxXHUwMTgwXDJcMjAyXDFcdTAxODBcMTBcMjAyXDFcdTAxODAiICsgIlw0XDIwMlwxXHUwMTgwXDdcMjAyXDFcMFwxXHUwMTgxXDFcMjA1XDFcMjA2XDNcMjA1IiArICJcMVx1MDE4MVwxXDIwNVwxXDIwNFwyNVwyMDVcMVx1MDE4MVwyXDIwNVwxXHUwMTgxXDJcMjA1IiArICJcMVx1MDE4MVwxMFwyMDVcMVx1MDE4MVw0XDIwNVwxXHUwMTgxXDdcMjA1XDFcMFwyXDEwNSIKLQkJCQkrICJcMVwyMDdcMVwxMDVcMVwwXDNcMTA1XDFcMFwxXDEwNVw0XDBcMlwxMDUiICsgIlwxXDBcM1wxMDVcMVwwXDFcMTA1XDEwXDBcMTFcMTA1XDFcMFw0XDEwNSIgKyAiXDFcMFwyXDEwNVwxXDBcMVwxMDVcMVwwXDNcMTA1XDZcMFwxXHUwMTgyIiArICJcMVwyMTFcMVwyMTJcMVwyMTFcMVwwXDFcMjExXDFcdTAxODJcMVwyMTFcMVwwIiArICJcMVwyMTFcNFwwXDJcMjExXDFcMFwzXDIxMVwxXDBcMVwyMTFcMTBcMCIgKyAiXDFcdTAxODJcMlwyMTFcMVx1MDE4MlwyXDIxMVwxXHUwMTgyXDJcMjExXDFcMFw0XDIxMSIgKyAiXDFcMFwxXHUwMTgyXDFcMjExXDFcMFwxXDIxMVwxXDBcMVx1MDE4MlwyXDIxMSIgKyAiXDZcMFwyXDExM1wxXDIxNlwxXDExM1wxXDBcM1wxMTNcMVwwXDFcMTEzIiArICJcNFwwXDJcMTEzXDFcMFwzXDExM1wxXDIxN1wxXDExM1wxMFwwXDExXDExMyIgKyAiXDFcMFw0XDExM1wxXDBcMlwxMTNcMVwwXDFcMTEzXDFcMFwzXDExMyIgKyAiXDZcMFwxXHUwMTgzXDFcMjIxXDFcMjIyXDFcMjIxXDFcMjIzXDFcMjIxXDFcdTAxODMiICsgIlwyN1wyMjFcMVx1MDE4M1wyXDIyMVwxXHUwMTgzXDJcMjIxXDFcdTAxODNcMTBcMjIxXDFcdTAxODMiICsgIlw0XDIyMVwxXHUwMTgzXDdcMjIxXDFcMFwxXHUwMTg0XDFcMjI0XDFcMjI1XDNcMjI0IiArICJcMVx1MDE4NFwxXDIyNFwxXDIyM1wyNVwyMjRcMVx1MDE4NFwyXDIyNFwxXHUwMTg0XDJcMjI0IiArICJcMVx1MDE4NFwxMFwyMjRcMVx1MDE4NFw0XDIyNFwxXHUwMTg0XDdcMjI0XDFcMFwxXHUwMTg1IiArICJcMVwyMjdcMVwyMzBcMVwyMjdcMVwwXDFcMjI3XDFcdTAxODVcMVwyMjdcMVwwIiArICJcMVwyMjdcNFwwXDJcMjI3XDFcMFwzXDIyN1wxXDBcMVwyMjdcMTBcMCIgKyAiXDFcdTAxODVcMlwyMjdcMVx1MDE4NVwyXDIyN1wxXHUwMTg1XDJcMjI3XDFcMFw0XDIyNyIKLQkJCQkrICJcMVwwXDFcdTAxODVcMVwyMjdcMVwwXDFcMjI3XDFcMFwxXHUwMTg1XDJcMjI3IiArICJcNlwwXDFcdTAxODZcNVwwXDFcdTAxODZcMVwzNjJcMTVcMFwyXHUwMTg2XDdcMCIgKyAiXDJcdTAxODZcMVwwXDJcdTAxODZcMVwwXDJcdTAxODZcN1wwXDJcdTAxODZcM1wwIiArICJcMlx1MDE4Nlw3XDBcMVx1MDE4N1w1XDBcMVx1MDE4N1wxNlwwXDJcdTAxODdcN1wwIiArICJcMlx1MDE4N1wxXDBcMlx1MDE4N1wxXDBcMlx1MDE4N1w3XDBcMlx1MDE4N1wzXDAiICsgIlwyXHUwMTg3XDdcMFwxXHUwMTg4XDFcdTAxMTlcMVx1MDExYVwxXHUwMTE5XDFcMFwxXHUwMTE5IiArICJcMVx1MDE4OFwxXHUwMTE5XDFcMFwxXHUwMTE5XDFcdTAxMWVcMTFcdTAxMTlcMVwwXDExXHUwMTE5IiArICJcMVx1MDE4OFwyXHUwMTE5XDFcdTAxODhcMlx1MDExOVwxXHUwMTg4XDEwXHUwMTE5XDFcdTAxODhcNFx1MDExOSIgKyAiXDFcdTAxODhcN1x1MDExOVwxXDBcMVx1MDE4OVwxXHUwMTFjXDFcdTAxNDRcMVx1MDExY1wxXHUwMTQxIiArICJcMVx1MDExY1wxXHUwMTg5XDI3XHUwMTFjXDFcdTAxODlcMlx1MDExY1wxXHUwMTg5XDJcdTAxMWNcMVx1MDE4OSIgKyAiXDEwXHUwMTFjXDFcdTAxODlcNFx1MDExY1wxXHUwMTg5XDdcdTAxMWNcMVwwXDJcdTAxMWNcMVx1MDE0NCIgKyAiXDJcdTAxNDFcMVx1MDE2YlwzXHUwMTFjXDFcdTAxNmJcMVx1MDE4YVwzXHUwMTFjXDJcdTAxNDFcNTJcdTAxMWMiICsgIlwxXDBcMlx1MDExY1wxXHUwMTQ0XDFcMFwxXHUwMTQxXDEyXHUwMTFjXDFcMFw1Mlx1MDExYyIgKyAiXDFcMFwxXHUwMThiXDFcdTAxMWRcMVx1MDE0NVwzXHUwMTFkXDFcdTAxOGJcMVx1MDExZFwxXHUwMTQxIiArICJcMjVcdTAxMWRcMVx1MDE4YlwyXHUwMTFkXDFcdTAxOGJcMlx1MDExZFwxXHUwMThiXDEwXHUwMTFkXDFcdTAxOGIiCi0JCQkJKyAiXDRcdTAxMWRcMVx1MDE4Ylw3XHUwMTFkXDFcMFwyXHUwMTFkXDFcdTAxNDVcMVx1MDE0MVwxXHUwMTFkIiArICJcMVx1MDE2ZVwyXHUwMTFkXDFcdTAxNDFcMVx1MDE2ZVwxXHUwMThjXDNcdTAxMWRcMlx1MDE0MVw1Mlx1MDExZCIgKyAiXDFcMFwyXHUwMTFkXDFcdTAxNDVcMVwwXDRcdTAxMWRcMVx1MDE0MVw2XHUwMTFkXDFcMCIgKyAiXDUyXHUwMTFkXDQyXDBcMlx1MDE4ZFwzMFwwXDJcMTM0XDFcMTM1XDFcMTM0XDFcMCIgKyAiXDNcMTM0XDFcMFwxXDEzNFw0XDBcMlwxMzRcMVwwXDNcMTM0XDFcMCIgKyAiXDFcMTM0XDEwXDBcMTFcMTM0XDFcMFw0XDEzNFwxXDBcMlwxMzRcMVwwIiArICJcMVwxMzRcMVwwXDNcMTM0XDZcMFwyXDEzNlwxXDEzN1wxXDEzNlwxXDAiICsgIlwzXDEzNlwxXDBcMVwxMzZcNFwwXDJcMTM2XDFcMFwzXDEzNlwxXDAiICsgIlwxXDEzNlwxMFwwXDExXDEzNlwxXDBcNFwxMzZcMVwwXDJcMTM2XDFcMCIgKyAiXDFcMTM2XDFcMFwzXDEzNlw0NFwwXDJcdTAxOGVcMzNcMFwxXHUwMThmXDFcMzMzIiArICJcMVwzMzRcMVwzMzNcMVwwXDFcMzMzXDFcdTAxOGZcMVwzMzNcMVwwXDFcMzMzIiArICJcMVwzNzZcM1wwXDJcMzMzXDFcMFwzXDMzM1wxXDBcMVwzMzNcMTBcMCIgKyAiXDFcdTAxOGZcMlwzMzNcMVx1MDE4ZlwyXDMzM1wxXHUwMThmXDJcMzMzXDFcMFw0XDMzMyIgKyAiXDFcMFwxXHUwMThmXDFcMzMzXDFcMFwxXDMzM1wxXDBcMVx1MDE4ZlwyXDMzMyIgKyAiXDZcMFwyXDE0N1wxXDE1MFwxXDE0N1wxXDBcM1wxNDdcMVwwXDFcMTQ3IiArICJcNFwwXDJcMTQ3XDFcMFwzXDE0N1wxXDI1MlwxXDE0N1wxMFwwXDExXDE0NyIgKyAiXDFcMFw0XDE0N1wxXDBcMlwxNDdcMVwwXDFcMTQ3XDFcMFwzXDE0NyIgKyAiXDZcMFwyXDE1MlwxXDE1M1wxXDE1MlwxXDE1NFw2NVwxNTJcMVwwXDJcMTU1IiArICJcMVwxNTZcNVwxNTVcMVwxNTRcNjFcMTU1XDFcMFwyXDE1N1wxXDE2MFwxXDE1NyIKLQkJCQkrICJcMVwxNjFcNjVcMTU3XDFcMFwyXDE2MlwxXDE2M1w1XDE2MlwxXDE2MVw2MVwxNjIiICsgIlwxXDBcMVx1MDE5MFwxXHUwMTA1XDFcdTAxMDZcMVx1MDEwNVwxXDBcMVx1MDEwNVwxXHUwMTkwIiArICJcMVx1MDEwNVwxXDBcMVx1MDEwNVwxXHUwMTA5XDExXHUwMTA1XDFcMFwxMVx1MDEwNVwxXHUwMTkwIiArICJcMlx1MDEwNVwxXHUwMTkwXDJcdTAxMDVcMVx1MDE5MFwxMFx1MDEwNVwxXHUwMTkwXDRcdTAxMDVcMVx1MDE5MCIgKyAiXDdcdTAxMDVcMVwwXDFcdTAxOTFcMVx1MDEwN1wxXHUwMTMwXDFcdTAxMDdcMVx1MDEyZFwxXHUwMTA3IiArICJcMVx1MDE5MVwyN1x1MDEwN1wxXHUwMTkxXDJcdTAxMDdcMVx1MDE5MVwyXHUwMTA3XDFcdTAxOTFcMTBcdTAxMDciICsgIlwxXHUwMTkxXDRcdTAxMDdcMVx1MDE5MVw3XHUwMTA3XDFcMFwxXHUwMTkyXDFcdTAxMDhcMVx1MDEzMSIgKyAiXDNcdTAxMDhcMVx1MDE5MlwxXHUwMTA4XDFcdTAxMmRcMjVcdTAxMDhcMVx1MDE5MlwyXHUwMTA4XDFcdTAxOTIiICsgIlwyXHUwMTA4XDFcdTAxOTJcMTBcdTAxMDhcMVx1MDE5Mlw0XHUwMTA4XDFcdTAxOTJcN1x1MDEwOFwxXDAiICsgIlwyXDIwMlwxXDIwM1wxXDIwMlwxXDIwNFw2NVwyMDJcMVwwXDJcMjA1XDFcMjA2IiArICJcNVwyMDVcMVwyMDRcNjFcMjA1XDFcMFwyXDIxMVwxXDIxMlwxXDIxMVwxXDAiICsgIlwzXDIxMVwxXDBcMVwyMTFcNFwwXDJcMjExXDFcMFwzXDIxMVwxXDAiICsgIlwxXDIxMVwxMFwwXDExXDIxMVwxXDBcNFwyMTFcMVwwXDJcMjExXDFcMCIgKyAiXDFcMjExXDFcMFwzXDIxMVw2XDBcMlwyMjFcMVwyMjJcMVwyMjFcMVwyMjMiICsgIlw2NVwyMjFcMVwwXDJcMjI0XDFcMjI1XDVcMjI0XDFcMjIzXDYxXDIyNFwxXDAiICsgIlwyXDIyN1wxXDIzMFwxXDIyN1wxXDBcM1wyMjdcMVwwXDFcMjI3XDRcMCIgKyAiXDJcMjI3XDFcMFwzXDIyN1wxXDBcMVwyMjdcMTBcMFwxMVwyMjdcMVwwIgotCQkJCSsgIlw0XDIyN1wxXDBcMlwyMjdcMVwwXDFcMjI3XDFcMFwzXDIyN1wxNVwwIiArICJcMVwzNjJcNjNcMFwxXHUwMTkzXDVcMFwxXHUwMTkzXDE2XDBcMlx1MDE5M1w3XDAiICsgIlwyXHUwMTkzXDFcMFwyXHUwMTkzXDFcMFwyXHUwMTkzXDdcMFwyXHUwMTkzXDNcMCIgKyAiXDJcdTAxOTNcN1wwXDFcdTAxOTRcMVx1MDExOVwxXHUwMTFhXDFcdTAxMTlcMVwwXDFcdTAxMTkiICsgIlwxXHUwMTk0XDFcdTAxMTlcMVwwXDFcdTAxMTlcMVx1MDExZVwxMVx1MDExOVwxXDBcMTFcdTAxMTkiICsgIlwxXHUwMTk0XDJcdTAxMTlcMVx1MDE5NFwyXHUwMTE5XDFcdTAxOTRcMTBcdTAxMTlcMVx1MDE5NFw0XHUwMTE5IiArICJcMVx1MDE5NFw3XHUwMTE5XDFcMFwxXHUwMTk1XDFcdTAxMWNcMVx1MDE0NFwxXHUwMTFjXDFcdTAxNDEiICsgIlwxXHUwMTFjXDFcdTAxOTVcMjdcdTAxMWNcMVx1MDE5NVwyXHUwMTFjXDFcdTAxOTVcMlx1MDExY1wxXHUwMTk1IiArICJcMTBcdTAxMWNcMVx1MDE5NVw0XHUwMTFjXDFcdTAxOTVcN1x1MDExY1wxXDBcMVx1MDE5NlwxXHUwMTFkIiArICJcMVx1MDE0NVwzXHUwMTFkXDFcdTAxOTZcMVx1MDExZFwxXHUwMTQxXDI1XHUwMTFkXDFcdTAxOTZcMlx1MDExZCIgKyAiXDFcdTAxOTZcMlx1MDExZFwxXHUwMTk2XDEwXHUwMTFkXDFcdTAxOTZcNFx1MDExZFwxXHUwMTk2XDdcdTAxMWQiICsgIlw2NVwwXDFcdTAxOTdcNTJcMFwyXHUwMTk4XDI1XDBcMVx1MDE5OVwxXDMzM1wxXDMzNCIgKyAiXDFcMzMzXDFcMFwxXDMzM1wxXHUwMTk5XDFcMzMzXDFcMFwxXDMzM1wxXDM3NiIgKyAiXDNcMFwyXDMzM1wxXDBcM1wzMzNcMVwwXDFcMzMzXDEwXDBcMVx1MDE5OSIgKyAiXDJcMzMzXDFcdTAxOTlcMlwzMzNcMVx1MDE5OVwyXDMzM1wxXDBcNFwzMzNcMVwwIiArICJcMVx1MDE5OVwxXDMzM1wxXDBcMVwzMzNcMVwwXDFcdTAxOTlcMlwzMzNcNlwwIgotCQkJCSsgIlwxXHUwMTlhXDFcdTAxMDVcMVx1MDEwNlwxXHUwMTA1XDFcMFwxXHUwMTA1XDFcdTAxOWFcMVx1MDEwNSIgKyAiXDFcMFwxXHUwMTA1XDFcdTAxMDlcMTFcdTAxMDVcMVwwXDExXHUwMTA1XDFcdTAxOWFcMlx1MDEwNSIgKyAiXDFcdTAxOWFcMlx1MDEwNVwxXHUwMTlhXDEwXHUwMTA1XDFcdTAxOWFcNFx1MDEwNVwxXHUwMTlhXDdcdTAxMDUiICsgIlwxXDBcMVx1MDE5YlwxXHUwMTA3XDFcdTAxMzBcMVx1MDEwN1wxXHUwMTJkXDFcdTAxMDdcMVx1MDE5YiIgKyAiXDI3XHUwMTA3XDFcdTAxOWJcMlx1MDEwN1wxXHUwMTliXDJcdTAxMDdcMVx1MDE5YlwxMFx1MDEwN1wxXHUwMTliIiArICJcNFx1MDEwN1wxXHUwMTliXDdcdTAxMDdcMVwwXDFcdTAxOWNcMVx1MDEwOFwxXHUwMTMxXDNcdTAxMDgiICsgIlwxXHUwMTljXDFcdTAxMDhcMVx1MDEyZFwyNVx1MDEwOFwxXHUwMTljXDJcdTAxMDhcMVx1MDE5Y1wyXHUwMTA4IiArICJcMVx1MDE5Y1wxMFx1MDEwOFwxXHUwMTljXDRcdTAxMDhcMVx1MDE5Y1w3XHUwMTA4XDFcMFwxXHUwMTlkIiArICJcNVwwXDFcdTAxOWRcMTZcMFwyXHUwMTlkXDdcMFwyXHUwMTlkXDFcMFwyXHUwMTlkIiArICJcMVwwXDJcdTAxOWRcN1wwXDJcdTAxOWRcM1wwXDJcdTAxOWRcN1wwXDFcdTAxOWUiICsgIlwxXHUwMTE5XDFcdTAxMWFcMVx1MDExOVwxXDBcMVx1MDExOVwxXHUwMTllXDFcdTAxMTlcMVwwIiArICJcMVx1MDExOVwxXHUwMTFlXDExXHUwMTE5XDFcMFwxMVx1MDExOVwxXHUwMTllXDJcdTAxMTlcMVx1MDE5ZSIgKyAiXDJcdTAxMTlcMVx1MDE5ZVwxMFx1MDExOVwxXHUwMTllXDRcdTAxMTlcMVx1MDE5ZVw3XHUwMTE5XDFcMCIgKyAiXDFcdTAxOWZcMVx1MDExY1wxXHUwMTQ0XDFcdTAxMWNcMVx1MDE0MVwxXHUwMTFjXDFcdTAxOWZcMjdcdTAxMWMiICsgIlwxXHUwMTlmXDJcdTAxMWNcMVx1MDE5ZlwyXHUwMTFjXDFcdTAxOWZcMTBcdTAxMWNcMVx1MDE5Zlw0XHUwMTFjIgotCQkJCSsgIlwxXHUwMTlmXDdcdTAxMWNcMVwwXDFcdTAxYTBcMVx1MDExZFwxXHUwMTQ1XDNcdTAxMWRcMVx1MDFhMCIgKyAiXDFcdTAxMWRcMVx1MDE0MVwyNVx1MDExZFwxXHUwMWEwXDJcdTAxMWRcMVx1MDFhMFwyXHUwMTFkXDFcdTAxYTAiICsgIlwxMFx1MDExZFwxXHUwMWEwXDRcdTAxMWRcMVx1MDFhMFw3XHUwMTFkXDQ3XDBcMVx1MDFhMVwyNFwwIiArICJcMlwzMzNcMVwzMzRcMVwzMzNcMVwwXDNcMzMzXDFcMFwxXDMzM1wxXDM3NiIgKyAiXDNcMFwyXDMzM1wxXDBcM1wzMzNcMVwwXDFcMzMzXDEwXDBcMTFcMzMzIiArICJcMVwwXDRcMzMzXDFcMFwyXDMzM1wxXDBcMVwzMzNcMVwwXDNcMzMzIiArICJcNlwwXDFcdTAxYTJcMVx1MDEwNVwxXHUwMTA2XDFcdTAxMDVcMVwwXDFcdTAxMDVcMVx1MDFhMiIgKyAiXDFcdTAxMDVcMVwwXDFcdTAxMDVcMVx1MDEwOVwxMVx1MDEwNVwxXDBcMTFcdTAxMDVcMVx1MDFhMiIgKyAiXDJcdTAxMDVcMVx1MDFhMlwyXHUwMTA1XDFcdTAxYTJcMTBcdTAxMDVcMVx1MDFhMlw0XHUwMTA1XDFcdTAxYTIiICsgIlw3XHUwMTA1XDFcMFwxXHUwMWEzXDFcdTAxMDdcMVx1MDEzMFwxXHUwMTA3XDFcdTAxMmRcMVx1MDEwNyIgKyAiXDFcdTAxYTNcMjdcdTAxMDdcMVx1MDFhM1wyXHUwMTA3XDFcdTAxYTNcMlx1MDEwN1wxXHUwMWEzXDEwXHUwMTA3IiArICJcMVx1MDFhM1w0XHUwMTA3XDFcdTAxYTNcN1x1MDEwN1wxXDBcMVx1MDFhNFwxXHUwMTA4XDFcdTAxMzEiICsgIlwzXHUwMTA4XDFcdTAxYTRcMVx1MDEwOFwxXHUwMTJkXDI1XHUwMTA4XDFcdTAxYTRcMlx1MDEwOFwxXHUwMWE0IiArICJcMlx1MDEwOFwxXHUwMWE0XDEwXHUwMTA4XDFcdTAxYTRcNFx1MDEwOFwxXHUwMWE0XDdcdTAxMDhcMVwwIiArICJcMVx1MDFhNVwxXHUwMTE5XDFcdTAxMWFcMVx1MDExOVwxXDBcMVx1MDExOVwxXHUwMWE1XDFcdTAxMTkiCi0JCQkJKyAiXDFcMFwxXHUwMTE5XDFcdTAxMWVcMTFcdTAxMTlcMVwwXDExXHUwMTE5XDFcdTAxYTVcMlx1MDExOSIgKyAiXDFcdTAxYTVcMlx1MDExOVwxXHUwMWE1XDEwXHUwMTE5XDFcdTAxYTVcNFx1MDExOVwxXHUwMWE1XDdcdTAxMTkiICsgIlwxXDBcMVx1MDFhNlwxXHUwMTFjXDFcdTAxNDRcMVx1MDExY1wxXHUwMTQxXDFcdTAxMWNcMVx1MDFhNiIgKyAiXDI3XHUwMTFjXDFcdTAxYTZcMlx1MDExY1wxXHUwMWE2XDJcdTAxMWNcMVx1MDFhNlwxMFx1MDExY1wxXHUwMWE2IiArICJcNFx1MDExY1wxXHUwMWE2XDdcdTAxMWNcMVwwXDFcdTAxYTdcMVx1MDExZFwxXHUwMTQ1XDNcdTAxMWQiICsgIlwxXHUwMWE3XDFcdTAxMWRcMVx1MDE0MVwyNVx1MDExZFwxXHUwMWE3XDJcdTAxMWRcMVx1MDFhN1wyXHUwMTFkIiArICJcMVx1MDFhN1wxMFx1MDExZFwxXHUwMWE3XDRcdTAxMWRcMVx1MDFhN1w3XHUwMTFkXDFcMFwyXHUwMTA1IiArICJcMVx1MDEwNlwxXHUwMTA1XDFcMFwzXHUwMTA1XDFcMFwxXHUwMTA1XDFcdTAxMDlcMTFcdTAxMDUiICsgIlwxXDBcNDVcdTAxMDVcMVwwXDFcdTAxYThcMVx1MDEwN1wxXHUwMTMwXDFcdTAxMDdcMVx1MDEyZCIgKyAiXDFcdTAxMDdcMVx1MDFhOFwyN1x1MDEwN1wxXHUwMWE4XDJcdTAxMDdcMVx1MDFhOFwyXHUwMTA3XDFcdTAxYTgiICsgIlwxMFx1MDEwN1wxXHUwMWE4XDRcdTAxMDdcMVx1MDFhOFw3XHUwMTA3XDFcMFwxXHUwMWE5XDFcdTAxMDgiICsgIlwxXHUwMTMxXDNcdTAxMDhcMVx1MDFhOVwxXHUwMTA4XDFcdTAxMmRcMjVcdTAxMDhcMVx1MDFhOVwyXHUwMTA4IiArICJcMVx1MDFhOVwyXHUwMTA4XDFcdTAxYTlcMTBcdTAxMDhcMVx1MDFhOVw0XHUwMTA4XDFcdTAxYTlcN1x1MDEwOCIgKyAiXDFcMFwyXHUwMTE5XDFcdTAxMWFcMVx1MDExOVwxXDBcM1x1MDExOVwxXDBcMVx1MDExOSIKLQkJCQkrICJcMVx1MDExZVwxMVx1MDExOVwxXDBcNDVcdTAxMTlcMVwwXDFcdTAxYWFcMVx1MDExY1wxXHUwMTQ0IiArICJcMVx1MDExY1wxXHUwMTQxXDFcdTAxMWNcMVx1MDFhYVwyN1x1MDExY1wxXHUwMWFhXDJcdTAxMWNcMVx1MDFhYSIgKyAiXDJcdTAxMWNcMVx1MDFhYVwxMFx1MDExY1wxXHUwMWFhXDRcdTAxMWNcMVx1MDFhYVw3XHUwMTFjXDFcMCIgKyAiXDFcdTAxYWJcMVx1MDExZFwxXHUwMTQ1XDNcdTAxMWRcMVx1MDFhYlwxXHUwMTFkXDFcdTAxNDFcMjVcdTAxMWQiICsgIlwxXHUwMWFiXDJcdTAxMWRcMVx1MDFhYlwyXHUwMTFkXDFcdTAxYWJcMTBcdTAxMWRcMVx1MDFhYlw0XHUwMTFkIiArICJcMVx1MDFhYlw3XHUwMTFkXDFcMFwyXHUwMTA3XDFcdTAxMzBcMVx1MDEwN1wxXHUwMTJkXDY1XHUwMTA3IiArICJcMVwwXDJcdTAxMDhcMVx1MDEzMVw1XHUwMTA4XDFcdTAxMmRcNjFcdTAxMDhcMVwwXDJcdTAxMWMiICsgIlwxXHUwMTQ0XDFcdTAxMWNcMVx1MDE0MVw2NVx1MDExY1wxXDBcMlx1MDExZFwxXHUwMTQ1XDVcdTAxMWQiICsgIlwxXHUwMTQxXDYxXHUwMTFkIjsKLQotCS8qKgotCSAqIFRoZSB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLQkgKi8KLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXl0cmFuc1tdID0geXlfdW5wYWNrKHl5X3BhY2tlZCk7Ci0KLQotCS8qIGVycm9yIGNvZGVzICovCi0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOwotCS8vIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotCS8vIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsKLQotCS8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7IlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLCAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UifTsKLQotCS8qKgotCSAqIFlZX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlCi0JICogPGNvZGU+YVN0YXRlPC9jb2RlPgotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgWVlfQVRUUklCVVRFW10gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgOSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgOSwgMSwgOSwgMSwgMSwgOSwgMSwgMSwgMSwgOSwgMSwgMSwgMSwgMSwgMSwgMSwgOSwgMSwgMSwgMSwgOSwgOSwgMSwgMSwgMSwgOSwgMSwgMywgOSwgOSwgMSwgMSwgMSwgOSwgMSwgOSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgOSwgOSwgMSwgMSwgMSwgMSwgMSwgMSwgOSwgMSwgMSwgMSwgMSwgMSwgMSwgOSwgMywgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgOSwgMCwgMCwgMCwgMCwgOSwgMCwgMCwgMCwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMTMsIDcsIDAsIDEsIDAsIDEsIDAsIDAsIDksIDAsIDAsIDAsIDEsIDEsIDAsIDAsIDAsIDksIDAsIDksIDEsIDAsIDAsIDksIDAsIDAsIDEsIDEsIDAsIDAsIDEsIDAsIDAsIDEzLCA3LCAxLCA5LCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAxLCAwLCAwLCAxLCAwLCAwLCAxLCAwLCAwLCAxLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAwLCAxLCAwLCAwLCAxLCAwLCAxLCAxLCAxLCAwLCAxLCAwLCAwLCAxLCAwLCAxLCAxLCAxLCAwLCAxLCAxLCAxLCA5LCA5LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAxLCAxLCAxLCAwLCAwLCAxLCAxLCAwLCAxLCAwLCAxLCAxLCAxLCAwLCAwLCAwLCA5LCAwLCAwLCA5LCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCA5LCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAxLCAxLCAxLCAwLCAwLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCA5LCAwLCAxLCAxLCAxLCAwLCAwLCA5LCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAxLCAxLCAxLCAwLAotCQkJCTAsIDEsIDEsIDEsIDAsIDAsIDEsIDAsIDAsIDAsIDEsIDEsIDEsIDAsIDksIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDEsIDEsIDEsIDAsIDAsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDksIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDEsIDAsIDAsIDEsIDAsIDAsIDEsIDEsIDEsIDAsIDAsIDEsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDksIDAsIDAsIDAsIDAsIDksIDAsIDAsIDAsIDksIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwotCi0JLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQlwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotCS8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLQkvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCXByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLQkvKioKLQkgKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzIHRoZSBzb3VyY2UKLQkgKiBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nCi0JICovCi0JcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOwotCi0JLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0JcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0JLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0JcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLQkvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotCS8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLQlwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLQkvKioKLQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQgZnJvbQotCSAqIGlucHV0Ci0JICovCi0JcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotCS8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQlwcml2YXRlIGludCB5eWxpbmU7Ci0KLQkvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0JLyoqCi0JICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlCi0JICogbWF0Y2hlZCB0ZXh0Ci0JICovCi0JLy8gcHJpdmF0ZSBpbnQgeXljb2x1bW47Ci0JLyoqCi0JICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYQotCSAqIGxpbmUKLQkgKi8KLQkvLyBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0JLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQlwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLQkvKiB1c2VyIGNvZGU6ICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFVOREVGSU5FRCA9ICJ1bmRlZmluZWQiOwotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZFN0YXJ0OwotCS8vIHByaXZhdGUgaW50IGZCdWZmZXJlZFRleHRMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkTGVuZ3RoOwotCS8vIHByaXZhdGUgU3RyaW5nQnVmZmVyIGZCdWZmZXJlZFRleHQgPSBudWxsOwotCXByaXZhdGUgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBDU1NUZXh0UmVnaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCXByaXZhdGUgaW50IGZJbml0aWFsU3RhdGUgPSBZWUlOSVRJQUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfTk9STUFMID0gMTYzODQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfU01BTEwgPSAyNTY7Ci0JcHJpdmF0ZSBpbnQgZkluaXRpYWxCdWZmZXJTaXplID0gQlVGRkVSX1NJWkVfTk9STUFMOwotCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFN0YXRlKGludCBzdGF0ZSkgewotCQlmSW5pdGlhbFN0YXRlID0gc3RhdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbEJ1ZmZlclNpemUoaW50IHNpemUpIHsKLQkJZkluaXRpYWxCdWZmZXJTaXplID0gc2l6ZTsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dDsKLQkJU3RyaW5nIG5leHRUb2tlblR5cGU7Ci0JCWJvb2xlYW4gc3BhY2VGb2xsb3dzOwotCQkvLyBTdHJpbmdCdWZmZXIgdGV4dDsKLQkJaW50IHN0YXJ0OwotCQlpbnQgdGV4dExlbmd0aDsKLQkJaW50IGxlbmd0aDsKLQkJaWYgKGZCdWZmZXJlZENvbnRleHQgIT0gbnVsbCkgewotCQkJY29udGV4dCA9IGZCdWZmZXJlZENvbnRleHQ7Ci0JCQkvLyB0ZXh0ID0gZkJ1ZmZlcmVkVGV4dDsKLQkJCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7Ci0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0gZkJ1ZmZlcmVkTGVuZ3RoOwotCi0JCQlmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkvLyB0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7Ci0JCQlzdGFydCA9IHl5Y2hhcjsKLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOwotCQl9Ci0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJaWYgKGNvbnRleHQgPT0gVU5ERUZJTkVEKSB7Ci0JCQkJLy8gdW5kZWYgLT4gY29uY2F0ZW5hdGUgdW5kZWYncwotCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJd2hpbGUgKG5leHRUb2tlblR5cGUgPT0gVU5ERUZJTkVEKSB7Ci0JCQkJCS8vIHRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCX0KLQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsKLQkJCQkvLyBmQnVmZmVyZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7Ci0JCQkJZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7Ci0JCQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5leHRUb2tlblR5cGUgPSBudWxsOwotCQkJCXNwYWNlRm9sbG93cyA9IGZhbHNlOwotCQkJCWlmIChDU1NSZWdpb25VdGlsLmlzRGVjbGFyYXRpb25WYWx1ZVR5cGUoY29udGV4dCkpIHsgLy8gZGVjbGFyYXRpb24KLQkJCQkJCQkJCQkJCQkJCQkJCS8vIHZhbHVlCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBjYW4KLQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNvbnRhaW4KLQkJCQkJCQkJCQkJCQkJCQkJCS8vIFZBTFVFX1MKLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJc3BhY2VGb2xsb3dzID0gKG5leHRUb2tlblR5cGUgPT0gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjYW5Db250YWluU3BhY2UoY29udGV4dCkpIHsKLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJc3BhY2VGb2xsb3dzID0gKG5leHRUb2tlblR5cGUgPT0gQ1NTX1MpOwotCQkJCX0KLQkJCQlpZiAobmV4dFRva2VuVHlwZSAhPSBudWxsKSB7IC8vIG5leHRUb2tlbiBpcyByZXRyaWV2ZWQKLQkJCQkJaWYgKHNwYWNlRm9sbG93cykgewotCQkJCQkJLy8gbmV4dCBpcyBzcGFjZSAtPiBhcHBlbmQKLQkJCQkJCS8vIHRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJCWxlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gbmV4dCBpcyBOT1Qgc3BhY2UgLT4gcHVzaCB0aGlzIGZvciBuZXh0IHRpbWUsCi0JCQkJCQkvLyByZXR1cm4gaXRzZWxmCi0JCQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsKLQkJCQkJCS8vIGZCdWZmZXJlZFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsKLQkJCQkJCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOwotCQkJCQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCWlmIChjb250ZXh0ID09IFVOREVGSU5FRCkgewotCQkJCWNvbnRleHQgPSBDU1NfVU5LTk9XTjsKLQkJCX0KLQkJCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVSZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0JLyogZm9yIHN0YW5kYWxvbmUgdXNlICovCi0JcHVibGljIGZpbmFsIExpc3QgcGFyc2VUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJTGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJQ1NTVGV4dFRva2VuIHRva2VuOwotCQlmb3IgKFN0cmluZyBraW5kID0gcHJpbUdldE5leHRUb2tlbigpOyBraW5kICE9IG51bGw7IGtpbmQgPSBwcmltR2V0TmV4dFRva2VuKCkpIHsKLQkJCXRva2VuID0gbmV3IENTU1RleHRUb2tlbigpOwotCQkJdG9rZW4ua2luZCA9IGtpbmQ7Ci0JCQl0b2tlbi5zdGFydCA9IHl5Y2hhcjsKLQkJCXRva2VuLmxlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQl0b2tlbi5pbWFnZSA9IHl5dGV4dCgpOwotCQkJdG9rZW5zLmFkZCh0b2tlbik7Ci0JCX0KLQotCQlyZXR1cm4gdG9rZW5zOwotCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBib29sZWFuIGNhbkNvbnRhaW5TcGFjZShTdHJpbmcgdHlwZSkgewotCQlpZiAodHlwZSA9PSBDU1NfREVMSU1JVEVSIHx8IHR5cGUgPT0gQ1NTX1JCUkFDRSB8fCB0eXBlID09IENTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIHl5Y2hhcjsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRU9GKCkgewotCQlyZXR1cm4geXlfYXRFT0Y7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7Ci0JCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgMCk7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgewotCQkvKiogdGhlIGlucHV0IGRldmljZSAqLwotCQl5eV9yZWFkZXIgPSBpbjsKLQotCQkvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotCQl5eV9zdGF0ZSA9IDA7Ci0KLQkJLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLQkJeXlfbGV4aWNhbF9zdGF0ZSA9IGZJbml0aWFsU3RhdGU7IC8vIFlZSU5JVElBTDsKLQotCQkvKioKLQkJICogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcyB0aGUKLQkJICogc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcKLQkJICovCi0JCWlmICh5eV9idWZmZXIubGVuZ3RoICE9IGZJbml0aWFsQnVmZmVyU2l6ZSkgewotCQkJeXlfYnVmZmVyID0gbmV3IGNoYXJbZkluaXRpYWxCdWZmZXJTaXplXTsKLQkJfQotCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikgMCk7Ci0KLQkJLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0JCXl5X21hcmtlZFBvcyA9IDA7Ci0KLQkJLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0JCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotCQkvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0JCS8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLQkJeXlfc3RhcnRSZWFkID0gMDsKLQotCQkvKioKLQkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0JCSAqIGZyb20gaW5wdXQKLQkJICovCi0JCXl5X2VuZFJlYWQgPSAwOwotCi0JCS8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkJeXlsaW5lID0gMDsKLQotCQkvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCXl5Y2hhciA9IDA7Ci0KLQkJLyoqCi0JCSAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mCi0JCSAqIHRoZSBtYXRjaGVkIHRleHQKLQkJICovCi0JCS8vIHl5Y29sdW1uID0gMDsKLQkJLyoqCi0JCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEKLQkJICogbGluZQotCQkgKi8KLQkJLy8geXlfYXRCT0wgPSBmYWxzZTsKLQkJLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQkJeXlfYXRFT0YgPSBmYWxzZTsKLQotCQkvKiB1c2VyIHZhcmlhYmxlcyAqLwotCQkvLyBmVW5kZWZpbmVkLmRlbGV0ZSgwLCBmVW5kZWZpbmVkLmxlbmd0aCgpKTsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBDU1NUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lciBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mCi0JICogdGhpcyBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gaW4KLQkgKiAgICAgICAgICAgIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0JICovCi0JcHVibGljIENTU1Rva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotCQl0aGlzLnl5X3JlYWRlciA9IGluOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4gVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMKLQkgKiBjb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gaW4KLQkgKiAgICAgICAgICAgIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLQkgKi8KLQlwdWJsaWMgQ1NTVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLQkJdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotCX0KLQotCS8qKgotCSAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgREZBIHRyYW5zaXRpb24gdGFibGUuCi0JICogCi0JICogQHBhcmFtIHBhY2tlZAotCSAqICAgICAgICAgICAgdGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0JICogQHJldHVybiB0aGUgdW5wYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIHl5X3VucGFjayhTdHJpbmcgcGFja2VkKSB7Ci0JCWludFtdIHRyYW5zID0gbmV3IGludFsyMDcwOV07Ci0JCWludCBpID0gMDsgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAqLwotCQlpbnQgaiA9IDA7IC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0JCXdoaWxlIChpIDwgMTMzOTYpIHsKLQkJCWludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLQkJCWludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLQkJCXZhbHVlLS07Ci0JCQlkbwotCQkJCXRyYW5zW2orK10gPSB2YWx1ZTsKLQkJCXdoaWxlICgtLWNvdW50ID4gMCk7Ci0JCX0KLQkJcmV0dXJuIHRyYW5zOwotCX0KLQotCS8qKgotCSAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBwYWNrZWQKLQkgKiAgICAgICAgICAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0JICogQHJldHVybiB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLQkJY2hhcltdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotCQlpbnQgaSA9IDA7IC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgKi8KLQkJaW50IGogPSAwOyAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotCQl3aGlsZSAoaSA8IDE3MCkgewotCQkJaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotCQkJY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLQkJCWRvCi0JCQkJbWFwW2orK10gPSB2YWx1ZTsKLQkJCXdoaWxlICgtLWNvdW50ID4gMCk7Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0KLQotCS8qKgotCSAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUgZW5kIG9mIHRoZQotCSAqICAgICAgICAgc3RyZWFtIGlzIHJlYWNoZWQuCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0JICovCi0JcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotCQkvKiBzdGFuZGFyZCBjYXNlICovCi0JCWlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkKLQkJCXJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotCQkvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovCi0JCWlmICh5eV9hdEVPRikKLQkJCXJldHVybiBZWUVPRjsKLQotCQkvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotCQkvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotCQlpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfYnVmZmVyLCAwLCB5eV9lbmRSZWFkIC0geXlfc3RhcnRSZWFkKTsKLQotCQkJLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLQkJCXl5X2VuZFJlYWQgLT0geXlfc3RhcnRSZWFkOwotCQkJeXlfY3VycmVudFBvcyAtPSB5eV9zdGFydFJlYWQ7Ci0JCQl5eV9tYXJrZWRQb3MgLT0geXlfc3RhcnRSZWFkOwotCQkJeXlfcHVzaGJhY2tQb3MgLT0geXlfc3RhcnRSZWFkOwotCQkJeXlfc3RhcnRSZWFkID0gMDsKLQkJfQotCi0JCS8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLQkJaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotCQkJLyogaWYgbm90OiBibG93IGl0IHVwICovCi0JCQljaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyAqIDJdOwotCQkJU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0JCQl5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0JCX0KLQotCQkvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLQkJaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIHl5X2J1ZmZlci5sZW5ndGggLSB5eV9lbmRSZWFkKTsKLQotCQlpZiAobnVtUmVhZCA9PSAtMSkKLQkJCXJldHVybiBZWUVPRjsKLQotCQl5eV9lbmRSZWFkICs9IG51bVJlYWQ7Ci0KLQkJcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCX0KLQotCi0JLyoqCi0JICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0JICovCi0JZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJeXlfYXRFT0YgPSB0cnVlOyAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotCQl5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAqLwotCQl5eV9yZWFkZXIuY2xvc2UoKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0JCXJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotCX0KLQotCS8qKgotCSAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0JICogCi0JICogQHBhcmFtIG5ld1N0YXRlCi0JICogICAgICAgICAgICB0aGUgbmV3IGxleGljYWwgc3RhdGUKLQkgKi8KLQlmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotCQl5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotCSAqLwotCWZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zIC0geXlfc3RhcnRSZWFkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0JICovCi0JZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLQkJcmV0dXJuIHl5X21hcmtlZFBvcyAtIHl5X3N0YXJ0UmVhZDsKLQl9Ci0KLQotCS8qKgotCSAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvckNvZGUKLQkgKiAgICAgICAgICAgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotCSAqLwotCXByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotCQl0cnkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsKLQkJfQotCQljYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotCQl9Ci0KLQotCX0KLQotCi0JLyoqCi0JICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0JICogCi0JICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBudW1iZXIKLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLiBUaGlzIG51bWJlciBtdXN0Ci0JICogICAgICAgICAgICBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0JICovCi0JLy8gcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotCS8vIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0JLy8geXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCS8vCi0JLy8geXlfbWFya2VkUG9zIC09IG51bWJlcjsKLQkvLyB9Ci0KLQkvKioKLQkgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLCB0aGUgZW5kCi0JICogb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXh0IHRva2VuCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0JICovCi0JcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlpbnQgeXlfaW5wdXQ7Ci0JCWludCB5eV9hY3Rpb247Ci0KLQkJeXlfcHVzaGJhY2tQb3MgPSAtMTsKLQkJYm9vbGVhbiB5eV93YXNfcHVzaGJhY2s7Ci0KLQkJd2hpbGUgKHRydWUpIHsKLQotCQkJeXljaGFyICs9IHl5bGVuZ3RoKCk7Ci0KLQkJCWJvb2xlYW4geXlfY291bnRlZCA9IGZhbHNlOwotCQkJZm9yICh5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkOyB5eV9jdXJyZW50UG9zIDwgeXlfbWFya2VkUG9zOyB5eV9jdXJyZW50UG9zKyspIHsKLQkJCQlzd2l0Y2ggKHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXSkgewotCQkJCQljYXNlICdccicgOgotCQkJCQkJeXlsaW5lKys7Ci0JCQkJCQl5eV9jb3VudGVkID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlICdcbicgOgotCQkJCQkJaWYgKHl5X2NvdW50ZWQpCi0JCQkJCQkJeXlfY291bnRlZCA9IGZhbHNlOwotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJeXlsaW5lKys7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQl5eV9jb3VudGVkID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoeXlfY291bnRlZCkgewotCQkJCWlmICh5eV9hZHZhbmNlKCkgPT0gJ1xuJykKLQkJCQkJeXlsaW5lLS07Ci0JCQkJaWYgKCF5eV9hdEVPRikKLQkJCQkJeXlfY3VycmVudFBvcy0tOwotCQkJfQotCi0JCQl5eV9hY3Rpb24gPSAtMTsKLQotCQkJeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsKLQotCQkJeXlfc3RhdGUgPSB5eV9sZXhpY2FsX3N0YXRlOwotCi0JCQl5eV93YXNfcHVzaGJhY2sgPSBmYWxzZTsKLQotCQkJeXlfZm9yQWN0aW9uIDogewotCQkJCXdoaWxlICh0cnVlKSB7Ci0KLQkJCQkJeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLQkJCQkJaWYgKHl5X2lucHV0ID09IFlZRU9GKQotCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0JCQkJCWludCB5eV9uZXh0ID0geXl0cmFuc1t5eV9yb3dNYXBbeXlfc3RhdGVdICsgeXljbWFwW3l5X2lucHV0XV07Ci0JCQkJCWlmICh5eV9uZXh0ID09IC0xKQotCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQl5eV9zdGF0ZSA9IHl5X25leHQ7Ci0KLQkJCQkJaW50IHl5X2F0dHJpYnV0ZXMgPSBZWV9BVFRSSUJVVEVbeXlfc3RhdGVdOwotCQkJCQlpZiAoKHl5X2F0dHJpYnV0ZXMgJiAyKSA+IDApCi0JCQkJCQl5eV9wdXNoYmFja1BvcyA9IHl5X2N1cnJlbnRQb3M7Ci0KLQkJCQkJaWYgKCh5eV9hdHRyaWJ1dGVzICYgMSkgPiAwKSB7Ci0JCQkJCQl5eV93YXNfcHVzaGJhY2sgPSAoeXlfYXR0cmlidXRlcyAmIDQpID4gMDsKLQkJCQkJCXl5X2FjdGlvbiA9IHl5X3N0YXRlOwotCQkJCQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsKLQkJCQkJCWlmICgoeXlfYXR0cmlidXRlcyAmIDgpID4gMCkKLQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHl5X3dhc19wdXNoYmFjaykKLQkJCQl5eV9tYXJrZWRQb3MgPSB5eV9wdXNoYmFja1BvczsKLQotCQkJc3dpdGNoICh5eV9hY3Rpb24pIHsKLQotCQkJCWNhc2UgNDE2IDogewotCQkJCQl5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsKLQkJCQkJcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQ7Ci0JCQkJfQotCQkJCWNhc2UgNDI4IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0MDcgOiB7Ci0JCQkJCXl5YmVnaW4oU1RfRk9OVF9GQUNFX0RFTElNSVRFUik7Ci0JCQkJCXJldHVybiBDU1NfRk9OVF9GQUNFOwotCQkJCX0KLQkJCQljYXNlIDQyOSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzcwIDogewotCQkJCQl5eWJlZ2luKFNUX0NIQVJTRVRfTkFNRSk7Ci0JCQkJCXJldHVybiBDU1NfQ0hBUlNFVDsKLQkJCQl9Ci0JCQkJY2FzZSA0MzAgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDMzMCA6IHsKLQkJCQkJeXliZWdpbihTVF9JTVBPUlRfVVJJKTsKLQkJCQkJcmV0dXJuIENTU19JTVBPUlQ7Ci0JCQkJfQotCQkJCWNhc2UgNDMxIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOTIgOiB7Ci0JCQkJCXl5YmVnaW4oU1RfTUVESUFfTUVESVVNKTsKLQkJCQkJcmV0dXJuIENTU19NRURJQTsKLQkJCQl9Ci0JCQkJY2FzZSA0MzIgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDI4NSA6Ci0JCQkJY2FzZSAzMjIgOgotCQkJCWNhc2UgMzkzIDoKLQkJCQljYXNlIDM5NSA6IHsKLQkJCQkJeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7Ci0JCQkJCXJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJOwotCQkJCX0KLQkJCQljYXNlIDQzMyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjY0IDoKLQkJCQljYXNlIDMwMiA6Ci0JCQkJY2FzZSAzODAgOgotCQkJCWNhc2UgMzgyIDogewotCQkJCQl5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOwotCQkJCQlyZXR1cm4gQ1NTX1VSSTsKLQkJCQl9Ci0JCQkJY2FzZSA0MzQgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDI1MCA6IHsKLQkJCQkJeXliZWdpbihTVF9QQUdFX1BTRVVET19QQUdFKTsKLQkJCQkJcmV0dXJuIENTU19QQUdFOwotCQkJCX0KLQkJCQljYXNlIDQzNSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjEyIDogewotCQkJCQlyZXR1cm4gQ1NTX0NPTU1FTlQ7Ci0JCQkJfQotCQkJCWNhc2UgNDM2IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyMTEgOiB7Ci0JCQkJCXJldHVybiBDU1NfQ0RPOwotCQkJCX0KLQkJCQljYXNlIDQzNyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjA1IDoKLQkJCQljYXNlIDI0MCA6Ci0JCQkJY2FzZSAyNzggOgotCQkJCWNhc2UgMjc5IDoKLQkJCQljYXNlIDMxOCA6Ci0JCQkJY2FzZSAzMTkgOgotCQkJCWNhc2UgMzU4IDoKLQkJCQljYXNlIDM1OSA6Ci0JCQkJY2FzZSAzODkgOgotCQkJCWNhc2UgMzkwIDoKLQkJCQljYXNlIDQwMiA6Ci0JCQkJY2FzZSA0MTIgOiB7Ci0JCQkJCXl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOwotCQkJCQlyZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0U7Ci0JCQkJfQotCQkJCWNhc2UgNDM4IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxNTkgOiB7Ci0JCQkJCXJldHVybiBDU1NfQ0RDOwotCQkJCX0KLQkJCQljYXNlIDQzOSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTU2IDogewotCQkJCQlyZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1M7Ci0JCQkJfQotCQkJCWNhc2UgNDQwIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxNTAgOgotCQkJCWNhc2UgMjA0IDoKLQkJCQljYXNlIDIzOSA6Ci0JCQkJY2FzZSAyNzcgOgotCQkJCWNhc2UgMzE3IDoKLQkJCQljYXNlIDM1NyA6Ci0JCQkJY2FzZSAzODggOiB7Ci0JCQkJCXl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOwotCQkJCQlyZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0g7Ci0JCQkJfQotCQkJCWNhc2UgNDQxIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxNDYgOgotCQkJCWNhc2UgMTk5IDoKLQkJCQljYXNlIDIwMiA6IHsKLQkJCQkJeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7Ci0JCQkJCXJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HOwotCQkJCX0KLQkJCQljYXNlIDQ0MiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNTcgOgotCQkJCWNhc2UgMTI2IDoKLQkJCQljYXNlIDE4NyA6Ci0JCQkJY2FzZSAyMzAgOgotCQkJCWNhc2UgMjY4IDoKLQkJCQljYXNlIDMwOCA6Ci0JCQkJY2FzZSAzNDggOiB7Ci0JCQkJCXl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SKTsKLQkJCQkJcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRTsKLQkJCQl9Ci0JCQkJY2FzZSA0NDMgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDU2IDogewotCQkJCQl5eWJlZ2luKFNUX1NFTEVDVE9SKTsKLQkJCQkJcmV0dXJuIENTU19TRUxFQ1RPUl9TRVBBUkFUT1I7Ci0JCQkJfQotCQkJCWNhc2UgNDQ0IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA1NSA6Ci0JCQkJY2FzZSAxMjMgOiB7Ci0JCQkJCXl5YmVnaW4oU1RfU0VMRUNUT1IpOwotCQkJCQlyZXR1cm4gQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1I7Ci0JCQkJfQotCQkJCWNhc2UgNDQ1IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA1MiA6IHsKLQkJCQkJeXliZWdpbihTVF9ERUNMQVJBVElPTik7Ci0JCQkJCXJldHVybiBDU1NfTEJSQUNFOwotCQkJCX0KLQkJCQljYXNlIDQ0NiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDkgOgotCQkJCWNhc2UgMTIxIDoKLQkJCQljYXNlIDE4NiA6Ci0JCQkJY2FzZSAyMjkgOgotCQkJCWNhc2UgMjY3IDoKLQkJCQljYXNlIDMwNyA6Ci0JCQkJY2FzZSAzNDcgOiB7Ci0JCQkJCXl5YmVnaW4oU1RfUEFHRV9ERUxJTUlURVIpOwotCQkJCQlyZXR1cm4gQ1NTX1BBR0VfU0VMRUNUT1I7Ci0JCQkJfQotCQkJCWNhc2UgNDQ3IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0OCA6IHsKLQkJCQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQkJCQlyZXR1cm4gQ1NTX0xCUkFDRTsKLQkJCQl9Ci0JCQkJY2FzZSA0NDggOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDQ3IDogewotCQkJCQl5eWJlZ2luKFNUX01FRElBX01FRElVTSk7Ci0JCQkJCXJldHVybiBDU1NfTUVESUFfU0VQQVJBVE9SOwotCQkJCX0KLQkJCQljYXNlIDQ0OSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDQgOgotCQkJCWNhc2UgMTE5IDoKLQkJCQljYXNlIDE4NSA6Ci0JCQkJY2FzZSAyMjggOgotCQkJCWNhc2UgMjY2IDoKLQkJCQljYXNlIDMwNiA6Ci0JCQkJY2FzZSAzNDYgOiB7Ci0JCQkJCXl5YmVnaW4oU1RfTUVESUFfREVMSU1JVEVSKTsKLQkJCQkJcmV0dXJuIENTU19NRURJVU07Ci0JCQkJfQotCQkJCWNhc2UgNDUwIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0MyA6IHsKLQkJCQkJeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsKLQkJCQkJcmV0dXJuIENTU19NRURJQV9TRVBBUkFUT1I7Ci0JCQkJfQotCQkJCWNhc2UgNDUxIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyMCA6Ci0JCQkJY2FzZSA4OSA6Ci0JCQkJY2FzZSAxNTggOgotCQkJCWNhc2UgMjA4IDoKLQkJCQljYXNlIDI0NCA6Ci0JCQkJY2FzZSAyODcgOgotCQkJCWNhc2UgMzI2IDogewotCQkJCQl5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsKLQkJCQkJcmV0dXJuIENTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUU7Ci0JCQkJfQotCQkJCWNhc2UgNDUyIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyMiA6Ci0JCQkJY2FzZSA1NCA6Ci0JCQkJY2FzZSA4NyA6Ci0JCQkJY2FzZSAxMjQgOgotCQkJCWNhc2UgMTU3IDogewotCQkJCQlyZXR1cm4gQ1NTX1M7Ci0JCQkJfQotCQkJCWNhc2UgNDUzIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyNyA6IHsKLQkJCQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQkJCQlyZXR1cm4gQ1NTX1JCUkFDRTsKLQkJCQl9Ci0JCQkJY2FzZSA0NTQgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDI5IDogewotCQkJCQl5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsKLQkJCQkJcmV0dXJuIENTU19TRUxFQ1RPUl9VTklWRVJTQUw7Ci0JCQkJfQotCQkJCWNhc2UgNDU1IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzMiA6IHsKLQkJCQkJeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSk7Ci0JCQkJCXJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUOwotCQkJCX0KLQkJCQljYXNlIDQ1NiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzYgOiB7Ci0JCQkJCXl5YmVnaW4oWVlJTklUSUFMKTsKLQkJCQkJcmV0dXJuIENTU19ERUxJTUlURVI7Ci0JCQkJfQotCQkJCWNhc2UgNDU3IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0MCA6Ci0JCQkJY2FzZSAxMTcgOgotCQkJCWNhc2UgMTg0IDoKLQkJCQljYXNlIDIyNyA6Ci0JCQkJY2FzZSAyNjUgOgotCQkJCWNhc2UgMzA1IDoKLQkJCQljYXNlIDM0NSA6IHsKLQkJCQkJeXliZWdpbihTVF9JTVBPUlRfREVMSU1JVEVSKTsKLQkJCQkJcmV0dXJuIENTU19NRURJVU07Ci0JCQkJfQotCQkJCWNhc2UgNDU4IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA2MCA6IHsKLQkJCQkJeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUpOwotCQkJCQlyZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUjsKLQkJCQl9Ci0JCQkJY2FzZSA0NTkgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDYyIDogewotCQkJCQl5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsKLQkJCQkJcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EOwotCQkJCX0KLQkJCQljYXNlIDQ2MCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNjMgOgotCQkJCWNhc2UgMTI4IDoKLQkJCQljYXNlIDEzMSA6Ci0JCQkJY2FzZSAxODggOgotCQkJCWNhc2UgMTkwIDoKLQkJCQljYXNlIDE5MyA6Ci0JCQkJY2FzZSAyMzEgOgotCQkJCWNhc2UgMjY5IDoKLQkJCQljYXNlIDMwOSA6Ci0JCQkJY2FzZSAzNDkgOiB7Ci0JCQkJCXl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORCk7Ci0JCQkJCXJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFOwotCQkJCX0KLQkJCQljYXNlIDQ2MSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNjggOgotCQkJCWNhc2UgMTM1IDoKLQkJCQljYXNlIDE5NSA6Ci0JCQkJY2FzZSAyMzQgOgotCQkJCWNhc2UgMjcyIDoKLQkJCQljYXNlIDMxMiA6Ci0JCQkJY2FzZSAzNTIgOiB7Ci0JCQkJCXl5YmVnaW4oU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SKTsKLQkJCQkJcmV0dXJuIENTU19ERUNMQVJBVElPTl9QUk9QRVJUWTsKLQkJCQl9Ci0JCQkJY2FzZSA0NjIgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDcxIDogewotCQkJCQl5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsKLQkJCQkJcmV0dXJuIENTU19ERUNMQVJBVElPTl9ERUxJTUlURVI7Ci0JCQkJfQotCQkJCWNhc2UgNDYzIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA3MiA6IHsKLQkJCQkJeXliZWdpbihTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUpOwotCQkJCQlyZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUjsKLQkJCQl9Ci0JCQkJY2FzZSA0NjQgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDczIDoKLQkJCQljYXNlIDE0OSA6IHsKLQkJCQkJeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7Ci0JCQkJCXJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSOwotCQkJCX0KLQkJCQljYXNlIDQ2NSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNzQgOgotCQkJCWNhc2UgODMgOgotCQkJCWNhc2UgMTQzIDoKLQkJCQljYXNlIDE1MyA6Ci0JCQkJY2FzZSAxOTcgOgotCQkJCWNhc2UgMjA2IDoKLQkJCQljYXNlIDIzNiA6Ci0JCQkJY2FzZSAyNzQgOgotCQkJCWNhc2UgMzE0IDoKLQkJCQljYXNlIDM1NCA6IHsKLQkJCQkJeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7Ci0JCQkJCXJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQ7Ci0JCQkJfQotCQkJCWNhc2UgNDY2IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA3OSA6IHsKLQkJCQkJeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7Ci0JCQkJCXJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0U7Ci0JCQkJfQotCQkJCWNhc2UgNDY3IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA4NSA6Ci0JCQkJY2FzZSA4NiA6IHsKLQkJCQkJeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7Ci0JCQkJCXJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1I7Ci0JCQkJfQotCQkJCWNhc2UgNDY4IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA5MSA6Ci0JCQkJY2FzZSAxNjAgOgotCQkJCWNhc2UgMjA5IDoKLQkJCQljYXNlIDI0NSA6Ci0JCQkJY2FzZSAyODggOgotCQkJCWNhc2UgMzI3IDoKLQkJCQljYXNlIDM2OCA6IHsKLQkJCQkJeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7Ci0JCQkJCXJldHVybiBDU1NfU0VMRUNUT1JfQ0xBU1M7Ci0JCQkJfQotCQkJCWNhc2UgNDY5IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA5MyA6Ci0JCQkJY2FzZSAxNjEgOgotCQkJCWNhc2UgMjEwIDoKLQkJCQljYXNlIDI0NiA6Ci0JCQkJY2FzZSAyODkgOgotCQkJCWNhc2UgMzI4IDoKLQkJCQljYXNlIDM2OSA6IHsKLQkJCQkJeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7Ci0JCQkJCXJldHVybiBDU1NfU0VMRUNUT1JfSUQ7Ci0JCQkJfQotCQkJCWNhc2UgNDcwIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxMDIgOgotCQkJCWNhc2UgMTcwIDoKLQkJCQljYXNlIDIyMSA6Ci0JCQkJY2FzZSAyNTMgOgotCQkJCWNhc2UgMjU1IDoKLQkJCQljYXNlIDI5NSA6Ci0JCQkJY2FzZSAzMzMgOgotCQkJCWNhc2UgMzczIDogewotCQkJCQl5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsKLQkJCQkJcmV0dXJuIENTU19TRUxFQ1RPUl9QU0VVRE87Ci0JCQkJfQotCQkJCWNhc2UgNDcxIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxMDcgOgotCQkJCWNhc2UgMTcyIDoKLQkJCQljYXNlIDE3NSA6IHsKLQkJCQkJeXliZWdpbihTVF9DSEFSU0VUX0RFTElNSVRFUik7Ci0JCQkJCXJldHVybiBDU1NfU1RSSU5HOwotCQkJCX0KLQkJCQljYXNlIDQ3MiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTEyIDoKLQkJCQljYXNlIDE3OCA6Ci0JCQkJY2FzZSAxODEgOiB7Ci0JCQkJCXl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7Ci0JCQkJCXJldHVybiBDU1NfU1RSSU5HOwotCQkJCX0KLQkJCQljYXNlIDQ3MyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMTM2IDoKLQkJCQljYXNlIDE5NiA6Ci0JCQkJY2FzZSAyMzUgOgotCQkJCWNhc2UgMjczIDoKLQkJCQljYXNlIDMxMyA6Ci0JCQkJY2FzZSAzNTMgOgotCQkJCWNhc2UgMzg1IDogewotCQkJCQl5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsKLQkJCQkJcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT047Ci0JCQkJfQotCQkJCWNhc2UgNDc0IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxNDAgOiB7Ci0JCQkJCXl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOwotCQkJCQlyZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0U7Ci0JCQkJfQotCQkJCWNhc2UgNDc1IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxNDIgOgotCQkJCWNhc2UgMjQyIDogewotCQkJCQl5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsKLQkJCQkJcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTjsKLQkJCQl9Ci0JCQkJY2FzZSA0NzYgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDE5IDoKLQkJCQljYXNlIDIxIDoKLQkJCQljYXNlIDIzIDoKLQkJCQljYXNlIDI0IDoKLQkJCQljYXNlIDI1IDoKLQkJCQljYXNlIDI2IDoKLQkJCQljYXNlIDI4IDoKLQkJCQljYXNlIDMwIDoKLQkJCQljYXNlIDMxIDoKLQkJCQljYXNlIDMzIDoKLQkJCQljYXNlIDM0IDoKLQkJCQljYXNlIDM1IDoKLQkJCQljYXNlIDM3IDoKLQkJCQljYXNlIDM4IDoKLQkJCQljYXNlIDM5IDoKLQkJCQljYXNlIDQxIDoKLQkJCQljYXNlIDQyIDoKLQkJCQljYXNlIDQ1IDoKLQkJCQljYXNlIDQ2IDoKLQkJCQljYXNlIDUwIDoKLQkJCQljYXNlIDUxIDoKLQkJCQljYXNlIDUzIDoKLQkJCQljYXNlIDU4IDoKLQkJCQljYXNlIDU5IDoKLQkJCQljYXNlIDYxIDoKLQkJCQljYXNlIDY0IDoKLQkJCQljYXNlIDY1IDoKLQkJCQljYXNlIDY2IDoKLQkJCQljYXNlIDY3IDoKLQkJCQljYXNlIDY5IDoKLQkJCQljYXNlIDcwIDoKLQkJCQljYXNlIDc1IDoKLQkJCQljYXNlIDc2IDoKLQkJCQljYXNlIDc3IDoKLQkJCQljYXNlIDc4IDoKLQkJCQljYXNlIDgwIDoKLQkJCQljYXNlIDgxIDoKLQkJCQljYXNlIDgyIDoKLQkJCQljYXNlIDg0IDogewotCQkJCQlyZXR1cm4gVU5ERUZJTkVEOwotCQkJCX0KLQkJCQljYXNlIDQ3NyA6Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLQkJCQkJCXl5X2F0RU9GID0gdHJ1ZTsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLQkJCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUnVucyB0aGUgc2Nhbm5lciBvbiBpbnB1dCBmaWxlcy4KLQkgKiAKLQkgKiBUaGlzIG1haW4gbWV0aG9kIGlzIHRoZSBkZWJ1Z2dpbmcgcm91dGluZSBmb3IgdGhlIHNjYW5uZXIuIEl0IHByaW50cwotCSAqIGVhY2ggcmV0dXJuZWQgdG9rZW4gdG8gU3lzdGVtLm91dCB1bnRpbCB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZCwgb3IKLQkgKiBhbiBlcnJvciBvY2N1cmVkLgotCSAqIAotCSAqIEBwYXJhbSBhcmd2Ci0JICogICAgICAgICAgICB0aGUgY29tbWFuZCBsaW5lLCBjb250YWlucyB0aGUgZmlsZW5hbWVzIHRvIHJ1biB0aGUgc2Nhbm5lcgotCSAqICAgICAgICAgICAgb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHsKLQkJCUNTU1Rva2VuaXplciBzY2FubmVyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc2Nhbm5lciA9IG5ldyBDU1NUb2tlbml6ZXIobmV3IGphdmEuaW8uRmlsZVJlYWRlcihhcmd2W2ldKSk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBub3QgZm91bmQgOiBcIiIgKyBhcmd2W2ldICsgIlwiIik7Ci0JCQl9Ci0JCQkvLyBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIG9wZW5pbmcgZmlsZSBcIiIrYXJndltpXSsiXCIiKTsKLQkJCS8vICAgICAgIAotCQkJLy8gfQotCQkJY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZSA6IGphdmEgQ1NTVG9rZW5pemVyIDxpbnB1dGZpbGU+Iik7Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJZG8gewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc2Nhbm5lci5wcmltR2V0TmV4dFRva2VuKCkpOwotCQkJCX0KLQkJCQl3aGlsZSAoIXNjYW5uZXIueXlfYXRFT0YpOwotCi0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJBbiBJL08gZXJyb3Igb2NjdXJlZCB3aGlsZSBzY2FubmluZyA6Iik7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOwotCi0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCi0JCQl9Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvSUNTU1Rva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvSUNTU1Rva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzE1ZWNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0lDU1NUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotLyoqCi0gKiBjdXJyZW50bHkgcHJvdmlkZSB0aGlzIGludGVyZmFjZSBidXQgbWF5IGJlIHJlbW92ZWQgaW4gZnV0dXJlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NUb2tlbml6ZXIgewotCi0Jdm9pZCBzZXRJbml0aWFsU3RhdGUoaW50IGluaXRpYWxTdGF0ZSk7Ci0KLQl2b2lkIHNldEluaXRpYWxCdWZmZXJTaXplKGludCBidWZzaXplKTsKLQotCWJvb2xlYW4gaXNFT0YoKTsKLQotCXZvaWQgcmVzZXQoUmVhZGVyIHJlYWRlciwgaW50IGkpOwotCi0JSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCXZvaWQgcmVzZXQoY2hhcltdIGNzKTsKLQotCWludCBnZXRPZmZzZXQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9DU1NUZXh0UmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9DU1NUZXh0UmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjdmZjQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQ1NTVGV4dFJlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNvbnRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLXB1YmxpYyBjbGFzcyBDU1NUZXh0UmVnaW9uRmFjdG9yeSB7Ci0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENTU1RleHRSZWdpb25GYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlUmVnaW9uKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCXJlZ2lvbiA9IG5ldyBDb250ZXh0UmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotCXByaXZhdGUgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkgZkluc3RhbmNlID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2Vyei9DU1NSZWdpb25Db250ZXh0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0NTU1JlZ2lvbkNvbnRleHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMjczNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0NTU1JlZ2lvbkNvbnRleHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcno7Ci0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENTU1JlZ2lvbkNvbnRleHRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfQ09NTUVOVCA9ICJDT01NRU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19DRE8gPSAiQ0RPIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19DREMgPSAiQ0RDIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TID0gIlMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVMSU1JVEVSID0gIkRFTElNSVRFUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfTEJSQUNFID0gIkxCUkFDRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfUkJSQUNFID0gIlJCUkFDRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19JTVBPUlQgPSAiSU1QT1JUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19QQUdFID0gIlBBR0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX01FRElBID0gIk1FRElBIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19GT05UX0ZBQ0UgPSAiRk9OVF9GQUNFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19DSEFSU0VUID0gIkNIQVJTRVQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0FUS0VZV09SRCA9ICJBVEtFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU1RSSU5HID0gIlNUUklORyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfVVJJID0gIlVSSSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfTUVESVVNID0gIk1FRElVTSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfTUVESUFfU0VQQVJBVE9SID0gIk1FRElBX1NFUEFSQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19DSEFSU0VUX05BTUUgPSAiQ0hBUlNFVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1BBR0VfU0VMRUNUT1IgPSAiQ1NTX1BBR0VfU0VMRUNUT1IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FID0gIlNFTEVDVE9SX0VMRU1FTlRfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfVU5JVkVSU0FMID0gIlNFTEVDVE9SX1VOSVZFUlNBTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfUFNFVURPID0gIlNFTEVDVE9SX1BTRVVETyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfQ0xBU1MgPSAiU0VMRUNUT1JfQ0xBU1MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1NFTEVDVE9SX0lEID0gIlNFTEVDVE9SX0lEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9DT01CSU5BVE9SID0gIlNFTEVDVE9SX0NPTUJJTkFUT1IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1NFTEVDVE9SX1NFUEFSQVRPUiA9ICJTRUxFQ1RPUl9TRVBBUkFUT1IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUID0gIlNFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORCA9ICJTRUxFQ1RPUl9BVFRSSUJVVEVfRU5EIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSA9ICJTRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFID0gIlNFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SID0gIlNFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9QUk9QRVJUWSA9ICJERUNMQVJBVElPTl9QUk9QRVJUWSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SID0gIkRFQ0xBUkFUSU9OX1NFUEFSQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSID0gIkRFQ0xBUkFUSU9OX0RFTElNSVRFUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQgPSAiREVDTEFSQVRJT05fVkFMVUVfSURFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTiA9ICJERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UgPSAiREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04gPSAiREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkcgPSAiREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkgPSAiREVDTEFSQVRJT05fVkFMVUVfVVJJIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX0hBU0giOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0UgPSAiREVDTEFSQVRJT05fVkFMVUVfVU5JQ09ERV9SQU5HRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5UID0gIkNTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9TID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX1MiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfVU5LTk9XTiA9ICJVTktOT1dOIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gRm9yIG51bGwgb2JqZWN0IDogQ1NTVG9rZW5pemVyIG5ldmVyIHNldCB0aGlzIHZhbHVlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1VOREVGSU5FRCA9ICJVTkRFRklORUQiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0gCSAqIGN1cnJlbnRseSBwcm92aWRlZCB0aGlzIGZpZWxkIGJ1dCBtYXkgYmUgcmVtb3ZlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0ZPUkVJR05fRUxFTUVOVCA9ICJGT1JFSUdOX0VMRU1FTlQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovQ1NTVGV4dFBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0NTU1RleHRQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI1MzYxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovQ1NTVGV4dFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyejsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NUb2tlbml6ZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ1NTVGV4dFBhcnNlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9TVFlMRVNIRUVUID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0RFQ0xBUkFUSU9OID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFID0gMjsKLQotCXB1YmxpYyBDU1NUZXh0UGFyc2VyKGludCBwYXJzZXJNb2RlKSB7Ci0JCWluaXRpYWxpemVQYXJzZXJNb2RlKHBhcnNlck1vZGUpOwotCX0KLQotCXB1YmxpYyBDU1NUZXh0UGFyc2VyKGludCBwYXJzZXJNb2RlLCBSZWFkZXIgcmVhZGVyKSB7Ci0JCWluaXRpYWxpemVQYXJzZXJNb2RlKHBhcnNlck1vZGUpOwotCQlyZXNldChyZWFkZXIpOwotCX0KLQotCXB1YmxpYyBDU1NUZXh0UGFyc2VyKGludCBwYXJzZXJNb2RlLCBTdHJpbmcgaW5wdXQpIHsKLQkJaW5pdGlhbGl6ZVBhcnNlck1vZGUocGFyc2VyTW9kZSk7Ci0JCXJlc2V0KGlucHV0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChSZWFkZXIgcmVhZGVyKSB7Ci0JCWdldFRva2VuaXplcigpLnJlc2V0KHJlYWRlciwgMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIGlucHV0KSB7Ci0JCWdldFRva2VuaXplcigpLnJlc2V0KG5ldyBTdHJpbmdSZWFkZXIoaW5wdXQpLCAwKTsKLQl9Ci0KLQlwdWJsaWMgQ1NTVGV4dFRva2VuW10gZ2V0VG9rZW5zKCkgewotCQlMaXN0IHRva2VuTGlzdCA9IGdldFRva2VuTGlzdCgpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBuZXcgQ1NTVGV4dFRva2VuW3Rva2VuTGlzdC5zaXplKCldOwotCQlyZXR1cm4gKENTU1RleHRUb2tlbltdKSB0b2tlbkxpc3QudG9BcnJheSh0b2tlbnMpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFRva2VuTGlzdCgpIHsKLQkJTGlzdCB0b2tlbnM7Ci0JCXRyeSB7Ci0JCQl0b2tlbnMgPSBnZXRUb2tlbml6ZXIoKS5wYXJzZVRleHQoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdG9rZW5zID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlyZXR1cm4gdG9rZW5zOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplUGFyc2VyTW9kZShpbnQgcGFyc2VyTW9kZSkgewotCQlpbnQgaW5pdGlhbFN0YXRlOwotCQlpbnQgYnVmc2l6ZTsKLQkJc3dpdGNoIChwYXJzZXJNb2RlKSB7Ci0JCQljYXNlIE1PREVfU1RZTEVTSEVFVCA6Ci0JCQkJaW5pdGlhbFN0YXRlID0gQ1NTVG9rZW5pemVyLllZSU5JVElBTDsKLQkJCQlidWZzaXplID0gQ1NTVG9rZW5pemVyLkJVRkZFUl9TSVpFX05PUk1BTDsKLQkJCQlicmVhazsKLQkJCWNhc2UgTU9ERV9ERUNMQVJBVElPTiA6Ci0JCQkJaW5pdGlhbFN0YXRlID0gQ1NTVG9rZW5pemVyLlNUX0RFQ0xBUkFUSU9OOwotCQkJCWJ1ZnNpemUgPSBDU1NUb2tlbml6ZXIuQlVGRkVSX1NJWkVfTk9STUFMOwotCQkJCWJyZWFrOwotCQkJY2FzZSBNT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFIDoKLQkJCQlpbml0aWFsU3RhdGUgPSBDU1NUb2tlbml6ZXIuU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFOwotCQkJCWJ1ZnNpemUgPSBDU1NUb2tlbml6ZXIuQlVGRkVSX1NJWkVfU01BTEw7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm47Ci0JCX0KLQkJaWYgKDAgPCBpbml0aWFsU3RhdGUpIHsKLQkJCUNTU1Rva2VuaXplciB0b2tlbml6ZXIgPSBnZXRUb2tlbml6ZXIoKTsKLQkJCXRva2VuaXplci5zZXRJbml0aWFsU3RhdGUoaW5pdGlhbFN0YXRlKTsKLQkJCXRva2VuaXplci5zZXRJbml0aWFsQnVmZmVyU2l6ZShidWZzaXplKTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ1NTVG9rZW5pemVyIGdldFRva2VuaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBDU1NUb2tlbml6ZXIoKTsKLQkJfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQlwcml2YXRlIENTU1Rva2VuaXplciBmVG9rZW5pemVyID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2Vyei9DU1NUZXh0VG9rZW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2Vyei9DU1NUZXh0VG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNjOTA3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovQ1NTVGV4dFRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcno7Ci0KLQotcHVibGljIGNsYXNzIENTU1RleHRUb2tlbiB7Ci0JcHVibGljIFN0cmluZyBraW5kOwotCXB1YmxpYyBTdHJpbmcgaW1hZ2U7Ci0JcHVibGljIGludCBzdGFydDsKLQlwdWJsaWMgaW50IGxlbmd0aDsKLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAoaW1hZ2UgIT0gbnVsbCkgPyBpbWFnZSA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9DU1NDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU0NvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA1NjI4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU0NvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkNoYXJzZXROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci0KLS8qKgotICogU2V0cyBkZWZhdWx0IHZhbHVlcyBmb3IgQ1NTIENvcmUgcHJlZmVyZW5jZXMKLSAqLwotcHVibGljIGNsYXNzIENTU0NvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0KLQkJLy8gZm9ybWF0dGluZyBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgsIDcyKTsKLQkJbm9kZS5wdXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTLCBmYWxzZSk7Ci0JCW5vZGUucHV0KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUiwgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIpOwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUsIDEpOwotCi0JCS8vIGNsZWFudXAgcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFLCB0cnVlKTsKLQotCQkvLyBjb2RlIGdlbmVyYXRpb24gcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkZWZhdWx0RW5jID0gIlVURi04IjsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBzeXN0ZW1FbmMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuZW5jb2RpbmciKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc3lzdGVtRW5jICE9IG51bGwpIHsKLQkJCWRlZmF1bHRFbmMgPSBDb21tb25DaGFyc2V0TmFtZXMuZ2V0UHJlZmVycmVkRGVmYXVsdElhbmFOYW1lKHN5c3RlbUVuYywgIlVURi04Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VULCBkZWZhdWx0RW5jKTsKLQkJbm9kZS5wdXQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuRU5EX09GX0xJTkVfQ09ERSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gdGhpcyBjb3VsZCBiZSBtYWRlIHNtYXJ0ZXIgYnkgYWN0dWFsbHkgbG9va2luZyB1cCB0aGUgY29udGVudAotCQkvLyB0eXBlJ3MgdmFsaWQgZXh0ZW5zaW9ucwotCQlub2RlLnB1dChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OLCAiY3NzIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBhZGRpdGlvbmFsIGNzcyBjb3JlIHByZWZlcmVuY2VzCi0JCW5vZGUucHV0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1BST1BfUFJFX0RFTElNLCAwKTsKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QT1NUX0RFTElNLCAxKTsKLQkJbm9kZS5wdXQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUsICJcIiIpOy8vJE5PTi1OTFMtMSQKLQkJbm9kZS5wdXQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfQkVUV0VFTl9WQUxVRSwgIiAiKTsvLyROT04tTkxTLTEkCi0JCW5vZGUucHV0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URV9JTl9VUkksIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19ORVdMSU5FX09OX09QRU5fQlJBQ0UsIGZhbHNlKTsKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIsIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfTkFNRSwgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCW5vZGUucHV0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSwgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0KLQkJLy8gQ1NTIGNsZWFudXAgcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfSURFTlRJRklFUiwgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfUFJPUEVSVFlfTkFNRSwgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfUFJPUEVSVFlfVkFMVUUsIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQVNJUyk7Ci0JCW5vZGUucHV0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9DQVNFX1NFTEVDVE9SLCBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9DU1NDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU0NvcmVQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNmYTA4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU0NvcmVQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBDU1MgY29yZSBwcmVmZXJlbmNlIGtleXMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcyB7Ci0JcHJpdmF0ZSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBlbXB0eSBwcml2YXRlIGNvbnN0cnVjdG9yIHNvIHVzZXJzIGNhbm5vdCBpbnN0YW50aWF0ZSBjbGFzcwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU0VfSURFTlRJRklFUiA9ICJpZGVudGlmaWVyQ2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVNFX1BST1BFUlRZX05BTUUgPSAicHJvcE5hbWVDYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU0VfUFJPUEVSVFlfVkFMVUUgPSAicHJvcFZhbHVlQ2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfQkVUV0VFTl9WQUxVRSA9ICJiZXR3ZWVuVmFsdWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX1BST1BfUE9TVF9ERUxJTSA9ICJwb3N0RGVsaW0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX1BST1BfUFJFX0RFTElNID0gInByZURlbGltIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9RVU9URSA9ICJxdW90ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfUVVPVEVfSU5fVVJJID0gInF1b3RlSW5VUkkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JBUFBJTkdfTkVXTElORV9PTl9PUEVOX0JSQUNFID0gIm5ld0xpbmVPbk9wZW5CcmFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUkFQUElOR19PTkVfUEVSX0xJTkUgPSAib25lUHJvcGVydHlQZXJMaW5lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUiA9ICJwcm9oaWJpdFdyYXBPbkF0dHIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBDU1MgY2xlYW51cCBwcmVmZXJlbmNlIG5hbWVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9DQVNFX0lERU5USUZJRVIgPSAiY2xlYW51cElkZW50aWZpZXJDYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFOVVBfQ0FTRV9QUk9QRVJUWV9OQU1FID0gImNsZWFudXBQcm9wTmFtZUNhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9DQVNFX1BST1BFUlRZX1ZBTFVFID0gImNsZWFudXBQcm9wVmFsdWVDYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFOVVBfQ0FTRV9TRUxFQ1RPUiA9ICJjbGVhbnVwU2VsZWN0b3JDYXNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZXh0ZW5zaW9uIHRvIHVzZSB3aGVuIG5vbmUgaXMgc3BlY2lmaWVkIGluIHRoZSBOZXcgQ1NTIEZpbGUKLQkgKiBXaXphcmQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VYVEVOU0lPTiA9ICJkZWZhdWx0RXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBtYXhpbXVtIHdpZHRoIG9mIGEgbGluZSBiZWZvcmUgYSBsaW5lIHNwbGl0IGlzIG5lZWRlZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkludGVnZXI8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1dJRFRIID0gImxpbmVXaWR0aCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIGFsbCBibGFua3MgbGluZXMgc2hvdWxkIGJlIGNsZWFyZWQgZHVyaW5nIGZvcm1hdHRpbmcuCi0JICogQmxhbmsgbGluZXMgd2lsbCBiZSBrZXB0IHdoZW4gZmFsc2UuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVJfQUxMX0JMQU5LX0xJTkVTID0gImNsZWFyQWxsQmxhbmtMaW5lcyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiAjSU5ERU5UQVRJT05fQ0hBUiBmb3IgMSBpbmRlbnRhdGlvbi4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkludGVnZXI8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFTlRBVElPTl9TSVpFID0gImluZGVudGF0aW9uU2l6ZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNoYXJhY3RlciB1c2VkIGZvciBpbmRlbnRhdGlvbi4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7VEFCLCBTUEFDRX0KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERU5UQVRJT05fQ0hBUiA9ICJpbmRlbnRhdGlvbkNoYXIiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZSAjSU5ERU5UQVRJT05fQ0hBUi4gSW5kaWNhdGVzIHRvIHVzZQotCSAqIHRhYiBjaGFyYWN0ZXIgd2hlbiBmb3JtYXR0aW5nLgotCSAqIAotCSAqIEBzZWUgI1NQQUNFCi0JICogQHNlZSAjSU5ERU5UQVRJT05fQ0hBUgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQiA9ICJ0YWIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UgI0lOREVOVEFUSU9OX0NIQVIuIEluZGljYXRlcyB0byB1c2UKLQkgKiBzcGFjZSBjaGFyYWN0ZXIgd2hlbiBmb3JtYXR0aW5nLgotCSAqIAotCSAqIEBzZWUgI1RBQgotCSAqIEBzZWUgI0lOREVOVEFUSU9OX0NIQVIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRSA9ICJzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBxdW90ZSBhbGwgYXR0cmlidXRlIHZhbHVlcyBkdXJpbmcgY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVU9URV9BVFRSX1ZBTFVFUyA9ICJxdW90ZUF0dHJWYWx1ZXMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBjbGVhbnVwIHByb2Nlc3NvciBzaG91bGQgZm9ybWF0IHNvdXJjZS4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfU09VUkNFID0gImZvcm1hdFNvdXJjZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBjYXNlIHByZWZlcmVuY2VzIEluZGljYXRlcyB0byBsZWF2ZSBjYXNlIGFzIGlzLgotCSAqIAotCSAqIEBzZWUgI0xPV0VSCi0JICogQHNlZSAjVVBQRVIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU0lTID0gMDsKLQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgY2FzZSBwcmVmZXJlbmNlcyBJbmRpY2F0ZXMgdG8gbWFrZSBuYW1lCi0JICogbG93ZXJjYXNlLgotCSAqIAotCSAqIEBzZWUgI0FTSVMKLQkgKiBAc2VlICNVUFBFUgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPV0VSID0gMTsKLQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgY2FzZSBwcmVmZXJlbmNlcyBJbmRpY2F0ZXMgdG8gbWFrZSBuYW1lCi0JICogdXBwZXJjYXNlLgotCSAqIAotCSAqIEBzZWUgI0xPV0VSCi0JICogQHNlZSAjQVNJUwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQUEVSID0gMjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSUNTU01vZGVsQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JQ1NTTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMTg4MTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JQ1NTTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTTW9kZWxBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCUlDU1NNb2RlbCBnZXRNb2RlbCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JTW9kZWxQcm92aWRlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JTW9kZWxQcm92aWRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWY5NGQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSU1vZGVsUHJvdmlkZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kZWxQcm92aWRlQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIG1vZGVsUHJvdmlkZWQoSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCk7Ci0KLQkvKioKLQkgKi8KLQl2b2lkIG1vZGVsUmVsZWFzZWQoSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCk7Ci0KLQkvKioKLQkgKi8KLQl2b2lkIG1vZGVsUmVtb3ZlZChJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZURlY2xhcmF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzZhOTM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzOwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uOwotCi0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZURlY2xhcmF0aW9uQWRhcHRlciBleHRlbmRzIElDU1NNb2RlbEFkYXB0ZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0U3R5bGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlU2VsZWN0b3JBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZVNlbGVjdG9yQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGUyOTc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlU2VsZWN0b3JBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2ltcGxlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlU2VsZWN0b3JBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICogQHBhcmFtIHBzZXVkb05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlib29sZWFuIG1hdGNoKElDU1NTaW1wbGVTZWxlY3RvciBzZWxlY3RvciwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZVNoZWV0QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JU3R5bGVTaGVldEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE0NzUyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZVNoZWV0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVyczsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQ7Ci0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZVNoZWV0QWRhcHRlciBleHRlbmRzIElDU1NNb2RlbEFkYXB0ZXIgewotCi0JLyoqCi0JICogUmV0dXJucyBIVE1ML1hNTCBlbGVtZW50IHRoYXQgaXMgdGhlIG93bmVyIG9mIHRoaXMgYWRhcHRlcgotCSAqLwotCUVsZW1lbnQgZ2V0RWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBDU1MgZG9jdW1lbnQgdGhhdCBpcyByZWxhdGVkIHRvIHRoaXMgZWxlbWVudAotCSAqLwotCXB1YmxpYyBTdHlsZVNoZWV0IGdldFNoZWV0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGNhbGxlZCBhdCB0aGUgdGltZSBvZiByZWxlYXNpbmcgSFRNTC9YTUwgbW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlZCgpOwotCi0JLyoqCi0JICogVGhpcyBpcyBjYWxsZWQgYXQgdGhlIHRpbWUgb2YgcmVtb3ZpbmcgdGhpcyBFbGVtZW50IGZyb20gdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JU3R5bGVTaGVldExpc3RBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU2Mzg4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnM7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXRMaXN0OwotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3R5bGVTaGVldExpc3RBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqLwotCUVudW1lcmF0aW9uIGdldENsYXNzZXMoKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDU1NTdHlsZURlY2xhcmF0aW9uIGdldE92ZXJyaWRlU3R5bGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3R5bGVTaGVldExpc3QgZ2V0U3R5bGVTaGVldHMoKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VTdHlsZVNoZWV0cygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9yQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk2MjJjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcywgd2l0aCBpdHMgb25lIGZpZWxkLCBpcyBhIGNvbnZpZW5jZSB0byBwcm92aWRlIGNvbXBpbGUtdGltZQotICogc2FmZXR5IHdoZW4gcmVmZXJpbmcgdG8gYSBjb250ZW50VHlwZSBJRC4gVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZAotICogZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbiBwbHVnaW4ueG1sIGZpbGUuCi0gKi8KLQotcHVibGljIGNsYXNzIENvbnRlbnRUeXBlSWRGb3JDU1MgewotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQgZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbgotCSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBzZXQgd2l0aCBkZWZhdWx0Ci0JICogcHJvdGVjdGVkIG1ldGhvZCBzbyBpdCB3aWxsIG5vdCBiZSBpbmxpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENvbnRlbnRUeXBlSURfQ1NTID0gZ2V0Q29uc3RhbnRTdHJpbmcoKTsKLQotCS8qKgotCSAqIERvbid0IGFsbG93IGluc3RhbnRpYXRpb24uCi0JICovCi0JcHJpdmF0ZSBDb250ZW50VHlwZUlkRm9yQ1NTKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlzdGF0aWMgU3RyaW5nIGdldENvbnN0YW50U3RyaW5nKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NBY2Nlc3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0FjY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDJhZmEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0FjY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NBY2Nlc3MgewotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuVmVjdG9yCi0JICovCi0JVmVjdG9yIGdldENsYXNzTmFtZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0F0dHIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0F0dHIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q4MGE4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NBdHRyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTQXR0ciBleHRlbmRzIElDU1NOb2RlIHsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICovCi0JSUNTU05vZGUgZ2V0T3duZXJDU1NOb2RlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0NoYXJzZXRSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NDaGFyc2V0UnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTM0ZWQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0NoYXJzZXRSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NDaGFyc2V0UnVsZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTQ2hhcnNldFJ1bGUgZXh0ZW5kcyBJQ1NTTm9kZSwgQ1NTQ2hhcnNldFJ1bGUgewotCi0JamF2YS5sYW5nLlN0cmluZyBFTkNPRElORyA9ICJlbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0RvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTZjMGQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0RvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1Vua25vd25SdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTRG9jdW1lbnQgZXh0ZW5kcyBJQ1NTTm9kZSB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NDaGFyc2V0UnVsZQotCSAqLwotCUlDU1NDaGFyc2V0UnVsZSBjcmVhdGVDU1NDaGFyc2V0UnVsZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlCi0JICovCi0JQ1NTRm9udEZhY2VSdWxlIGNyZWF0ZUNTU0ZvbnRGYWNlUnVsZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTSW1wb3J0UnVsZQotCSAqLwotCUlDU1NJbXBvcnRSdWxlIGNyZWF0ZUNTU0ltcG9ydFJ1bGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLklDU1NNZWRpYVJ1bGUKLQkgKi8KLQlJQ1NTTWVkaWFSdWxlIGNyZWF0ZUNTU01lZGlhUnVsZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUGFnZVJ1bGUKLQkgKi8KLQlJQ1NTUGFnZVJ1bGUgY3JlYXRlQ1NTUGFnZVJ1bGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICovCi0JSUNTU1ByaW1pdGl2ZVZhbHVlIGNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKHNob3J0IHByaW1pdGl2ZVR5cGUpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JQ1NTUnVsZSBjcmVhdGVDU1NSdWxlKFN0cmluZyBydWxlKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb24KLQkgKi8KLQlJQ1NTU3R5bGVEZWNsYXJhdGlvbiBjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JSUNTU1N0eWxlRGVjbEl0ZW0gY3JlYXRlQ1NTU3R5bGVEZWNsSXRlbShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlUnVsZQotCSAqLwotCUlDU1NTdHlsZVJ1bGUgY3JlYXRlQ1NTU3R5bGVSdWxlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NVbmtub3duUnVsZQotCSAqLwotCUNTU1Vua25vd25SdWxlIGNyZWF0ZUNTU1Vua25vd25SdWxlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdAotCSAqLwotCU1lZGlhTGlzdCBjcmVhdGVNZWRpYUxpc3QoKTsKLQotCUlDU1NNb2RlbCBnZXRNb2RlbCgpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBpc0RvY3VtZW50KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NJbXBvcnRSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NJbXBvcnRSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZDkwZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTSW1wb3J0UnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTSW1wb3J0UnVsZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTSW1wb3J0UnVsZSBleHRlbmRzIElDU1NOb2RlLCBDU1NJbXBvcnRSdWxlIHsKLQotCWphdmEubGFuZy5TdHJpbmcgSFJFRiA9ICJocmVmIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCByZWZyZXNoU3R5bGVTaGVldCgpOwotCi0JLyoqCi0JICogQHBhcmFtIGhyZWYKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQl2b2lkIHNldEhyZWYoU3RyaW5nIGhyZWYpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTWVkaWFSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NNZWRpYVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg0MDMzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NNZWRpYVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU01lZGlhUnVsZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTTWVkaWFSdWxlIGV4dGVuZHMgSUNTU05vZGUsIElDU1NSdWxlQ29udGFpbmVyLCBDU1NNZWRpYVJ1bGUgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk2ZTU3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQuSUNTU1N0eWxlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NNb2RlbCBleHRlbmRzIElDU1NTdHlsZU5vdGlmaWVyLCBJU3RydWN0dXJlZE1vZGVsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMID0gImV4dGVybmFsQ1NTIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQkVEREVEID0gImVtYmVkZGVkQ1NTIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOTElORSA9ICJpbmxpbmVDU1MiOyAvLyROT04tTkxTLTEkCi0KLQlJQ1NTRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCU5vZGUgZ2V0T3duZXJET01Ob2RlKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlPYmplY3QgZ2V0U3R5bGVTaGVldFR5cGUoKTsKLQotCS8qKgotCSAqIGNsZWFudXAgLT4gcmVidWlsZCBDU1MgTm9kZXMgVGhpcyBpcyBwcmUtYmV0YSBmaXggZm9yIDE3ODE3Ni4KLQkgKi8KLQl2b2lkIHJlZnJlc2hOb2RlcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTmFtZWROb2RlTWFwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NOYW1lZE5vZGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI4NjljMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NOYW1lZE5vZGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NOYW1lZE5vZGVNYXAgZXh0ZW5kcyBJQ1NTTm9kZUxpc3QgewotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JSUNTU05vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU05vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxN2U1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTTm9kZSB7Ci0KLQlzaG9ydCBBVFRSX05PREUgPSAtMTsKLQlzaG9ydCBVTktOT1dOUlVMRV9OT0RFID0gMDsKLQlzaG9ydCBTVFlMRVJVTEVfTk9ERSA9IDE7Ci0Jc2hvcnQgQ0hBUlNFVFJVTEVfTk9ERSA9IDI7Ci0Jc2hvcnQgSU1QT1JUUlVMRV9OT0RFID0gMzsKLQlzaG9ydCBNRURJQVJVTEVfTk9ERSA9IDQ7Ci0Jc2hvcnQgRk9OVEZBQ0VSVUxFX05PREUgPSA1OwotCXNob3J0IFBBR0VSVUxFX05PREUgPSA2OwotCXNob3J0IFNUWUxFU0hFRVRfTk9ERSA9IDc7Ci0Jc2hvcnQgU1RZTEVERUNMQVJBVElPTl9OT0RFID0gODsKLQlzaG9ydCBTVFlMRURFQ0xJVEVNX05PREUgPSA5OwotCXNob3J0IFZBTFVFTElTVF9OT0RFID0gMTA7Ci0Jc2hvcnQgUFJJTUlUSVZFVkFMVUVfTk9ERSA9IDExOwotCXNob3J0IE1FRElBTElTVF9OT0RFID0gMTI7Ci0Jc2hvcnQgRE9DVU1FTlRDU1NTVFlMRV9OT0RFID0gMTM7Ci0Jc2hvcnQgTElOS1NUWUxFX05PREUgPSAxNDsKLQlzaG9ydCBFTEVNRU5UQ1NTSU5MSU5FU1RZTEVfTk9ERSA9IDE1OwotCi0JSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOYW1lZE5vZGVNYXAKLQkgKi8KLQlJQ1NTTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKTsKLQotCUlDU1NOb2RlTGlzdCBnZXRDaGlsZE5vZGVzKCk7Ci0KLQlJQ1NTTm9kZSBnZXRGaXJzdENoaWxkKCk7Ci0KLQlJQ1NTTm9kZSBnZXRMYXN0Q2hpbGQoKTsKLQotCUlDU1NOb2RlIGdldE5leHRTaWJsaW5nKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0Jc2hvcnQgZ2V0Tm9kZVR5cGUoKTsKLQotCUlDU1NEb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCk7Ci0KLQlJQ1NTTm9kZSBnZXRQYXJlbnROb2RlKCk7Ci0KLQlJQ1NTTm9kZSBnZXRQcmV2aW91c1NpYmxpbmcoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaGFzQ2hpbGROb2RlcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTm9kZUxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU05vZGVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMGRmYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTm9kZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NOb2RlTGlzdCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotCUlDU1NOb2RlIGl0ZW0oaW50IGluZGV4KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1BhZ2VSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NQYWdlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmEyNGEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1BhZ2VSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQYWdlUnVsZTsKLQotcHVibGljIGludGVyZmFjZSBJQ1NTUGFnZVJ1bGUgZXh0ZW5kcyBJQ1NTTm9kZSwgQ1NTUGFnZVJ1bGUgewotCi0JamF2YS5sYW5nLlN0cmluZyBTRUxFQ1RPUiA9ICJzZWxlY3RvciI7IC8vJE5PTi1OTFMtMSQKLQotCUlDU1NTZWxlY3Rvckxpc3QgZ2V0U2VsZWN0b3JzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NQcmltaXRpdmVWYWx1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTUHJpbWl0aXZlVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJlYWNiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NQcmltaXRpdmVWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1ByaW1pdGl2ZVZhbHVlIGV4dGVuZHMgSUNTU05vZGUsIElDU1NWYWx1ZSwgQ1NTUHJpbWl0aXZlVmFsdWUgewotCi0Jc2hvcnQgQ1NTX0lOVEVHRVIgPSAyNjsKLQlzaG9ydCBDU1NfSEFTSCA9IDI3OwotCXNob3J0IENTU19VUkFOR0UgPSAyODsKLQlzaG9ydCBDU1NfRk9STUFUID0gMjk7Ci0Jc2hvcnQgQ1NTX0xPQ0FMID0gMzA7Ci0Jc2hvcnQgQ1NTX1NMQVNIID0gMzE7Ci0Jc2hvcnQgQ1NTX0NPTU1BID0gMzI7Ci0Jc2hvcnQgQ1NTX0lOSEVSSVRfUFJJTUlUSVZFID0gMzM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmxvYXRWYWx1ZQotCSAqICAgICAgICAgICAgZmxvYXQKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShmbG9hdCBmbG9hdFZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZ1ZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHN0cmluZ1ZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTUnVsZUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTUnVsZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWFlNTk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1J1bGVDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NSdWxlQ29udGFpbmVyIHsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JQ1NTUnVsZSBhcHBlbmRSdWxlKENTU1J1bGUgcnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gbmV3UnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcmVmUnVsZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKi8KLQlDU1NSdWxlIGluc2VydFJ1bGVCZWZvcmUoQ1NTUnVsZSBuZXdSdWxlLCBDU1NSdWxlIHJlZlJ1bGUpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCUNTU1J1bGUgcmVtb3ZlUnVsZShDU1NSdWxlIHJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBvbGRDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JQ1NTUnVsZSByZXBsYWNlUnVsZShDU1NSdWxlIG5ld1J1bGUsIENTU1J1bGUgb2xkUnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NlbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTk1NDFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1NlbGVjdG9yIHsKLQotCUlDU1NTZWxlY3Rvckl0ZW0gZ2V0SXRlbShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlJdGVyYXRvciBnZXRJdGVyYXRvcigpOwotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRTcGVjaWZpY2l0eSgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdldFN0cmluZygpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlib29sZWFuIG1hdGNoKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHBzZXVkb05hbWUpOwotCi0JLyoqCi0JICogCi0JICovCi0JSXRlcmF0b3IgZ2V0RXJyb3JzKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0RXJyb3JDb3VudCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3JDb21iaW5hdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3RvckNvbWJpbmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU0NDNjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3RvckNvbWJpbmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTZWxlY3RvckNvbWJpbmF0b3IgZXh0ZW5kcyBJQ1NTU2VsZWN0b3JJdGVtIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBERVNDRU5EQU5UID0gJyAnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDSElMRCA9ICc+JzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQURKQUNFTlQgPSAnKyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFVOS05PV04gPSAnPyc7IC8vIGVycm9yIGNhc2UKLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JY2hhciBnZXRDb21iaW5hdG9yVHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3JJdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3Rvckl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRmZThmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3Rvckl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTZWxlY3Rvckl0ZW0gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lNUExFID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01CSU5BVE9SID0gMjsKLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldEl0ZW1UeXBlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0U3RyaW5nKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3Rvckxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NlbGVjdG9yTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzdmZDBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NlbGVjdG9yTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTZWxlY3Rvckxpc3QgewotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlJdGVyYXRvciBnZXRJdGVyYXRvcigpOwotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5WZWN0b3IKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCUlDU1NTZWxlY3RvciBnZXRTZWxlY3RvcihpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdldFN0cmluZygpOwotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGdldEVycm9yQ291bnQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCUl0ZXJhdG9yIGdldEVycm9ycygpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlib29sZWFuIG1hdGNoKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHBzZXVkb05hbWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2ltcGxlU2VsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NpbXBsZVNlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOWZiODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2ltcGxlU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTaW1wbGVTZWxlY3RvciBleHRlbmRzIElDU1NTZWxlY3Rvckl0ZW0gewotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlTdHJpbmcgZ2V0QXR0cmlidXRlKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCVN0cmluZyBnZXRDbGFzcyhpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlTdHJpbmcgZ2V0SUQoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlpbnQgZ2V0TnVtT2ZBdHRyaWJ1dGVzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlpbnQgZ2V0TnVtT2ZDbGFzc2VzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlpbnQgZ2V0TnVtT2ZJRHMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWludCBnZXROdW1PZlBzZXVkb05hbWVzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCVN0cmluZyBnZXRQc2V1ZG9OYW1lKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGlzVW5pdmVyc2FsKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZURlY2xJdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZURlY2xJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyOWNkNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVEZWNsSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1N0eWxlRGVjbEl0ZW0gZXh0ZW5kcyBJQ1NTTm9kZSwgSUNTU1ZhbHVlTGlzdCB7Ci0KLQlqYXZhLmxhbmcuU3RyaW5nIElNUE9SVEFOVCA9ICJpbXBvcnRhbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCUlDU1NQcmltaXRpdmVWYWx1ZSBhcHBlbmRWYWx1ZShJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZQotCSAqLwotCUNTU1ZhbHVlIGdldENTU1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0UHJpb3JpdHkoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JSUNTU1ByaW1pdGl2ZVZhbHVlIHJlbW92ZVZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gb2xkVmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlJQ1NTUHJpbWl0aXZlVmFsdWUgcmVwbGFjZVZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZSBuZXdWYWx1ZSwgSUNTU1ByaW1pdGl2ZVZhbHVlIG9sZFZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHBhcmFtIHByaW9yaXR5Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0Jdm9pZCBzZXRQcmlvcml0eShTdHJpbmcgcHJpb3JpdHkpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVEZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVEZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTg3MzY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlRGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1N0eWxlRGVjbGFyYXRpb24gZXh0ZW5kcyBJQ1NTRG9jdW1lbnQsIENTU1N0eWxlRGVjbGFyYXRpb24gewotCi0JSUNTU1N0eWxlRGVjbEl0ZW0gZ2V0RGVjbEl0ZW1Ob2RlKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JSUNTU1N0eWxlRGVjbEl0ZW0gcmVtb3ZlRGVjbEl0ZW1Ob2RlKElDU1NTdHlsZURlY2xJdGVtIG9sZERlY2wpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQlJQ1NTU3R5bGVEZWNsSXRlbSBzZXREZWNsSXRlbU5vZGUoSUNTU1N0eWxlRGVjbEl0ZW0gbmV3RGVjbCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNGUxYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZVJ1bGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1N0eWxlUnVsZSBleHRlbmRzIElDU1NOb2RlLCBDU1NTdHlsZVJ1bGUgewotCi0JamF2YS5sYW5nLlN0cmluZyBTRUxFQ1RPUiA9ICJzZWxlY3RvciI7IC8vJE5PTi1OTFMtMSQKLQotCUlDU1NTZWxlY3Rvckxpc3QgZ2V0U2VsZWN0b3JzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZVNoZWV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZVNoZWV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNDBlYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVTaGVldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3Q7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1N0eWxlU2hlZXQgZXh0ZW5kcyBJQ1NTRG9jdW1lbnQsIElDU1NSdWxlQ29udGFpbmVyLCBDU1NTdHlsZVNoZWV0IHsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZUxpc3QKLQkgKi8KLQlOb2RlTGlzdCBnZXRPd25lck5vZGVzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGVMaXN0Ci0JICogQHBhcmFtIGRvYwotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQKLQkgKi8KLQlOb2RlTGlzdCBnZXRPd25lck5vZGVzKERvY3VtZW50IGRvYyk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlTGlzdAotCSAqLwotCUNTU1J1bGVMaXN0IGdldE93bmVyUnVsZXMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3QKLQkgKi8KLQlTdHlsZVNoZWV0TGlzdCBnZXRQYXJlbnRTdHlsZVNoZWV0cygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTVmFsdWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1ZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NjkxNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NWYWx1ZSBleHRlbmRzIENTU1ZhbHVlIHsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZXRDU1NWYWx1ZVRleHQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1ZhbHVlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTVmFsdWVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OWM1NzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTVmFsdWVMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZUxpc3Q7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1ZhbHVlTGlzdCBleHRlbmRzIElDU1NWYWx1ZSwgQ1NTVmFsdWVMaXN0IHsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKi8KLQlJQ1NTUHJpbWl0aXZlVmFsdWUgYXBwZW5kVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlIHZhbHVlKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKi8KLQlJQ1NTUHJpbWl0aXZlVmFsdWUgcmVtb3ZlVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlIHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNvdW50ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNvdW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY4MjRiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDb3VudGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5Db3VudGVyOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb3VudGVyIGV4dGVuZHMgSUNTU05vZGUsIENvdW50ZXIgewotCi0JamF2YS5sYW5nLlN0cmluZyBJREVOVElGSUVSID0gImlkZW50aWZpZXIiOyAvLyROT04tTkxTLTEkCi0JamF2YS5sYW5nLlN0cmluZyBMSVNUU1RZTEUgPSAibGlzdHN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWphdmEubGFuZy5TdHJpbmcgU0VQQVJBVE9SID0gInNlcGFyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBwYXJhbSBpZGVudGlmaWVyCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXZvaWQgc2V0SWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBsaXN0U3R5bGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0Jdm9pZCBzZXRMaXN0U3R5bGUoU3RyaW5nIGxpc3RTdHlsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBTZXBhcmF0b3IKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0Jdm9pZCBzZXRTZXBhcmF0b3IoU3RyaW5nIHNlcGFyYXRvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUltcGxlbWVudGF0aW9uQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01JbXBsZW1lbnRhdGlvbkNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzQ0ZTk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUltcGxlbWVudGF0aW9uQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5ET01JbXBsZW1lbnRhdGlvbkNTUzsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE9NSW1wbGVtZW50YXRpb25DU1MgZXh0ZW5kcyBET01JbXBsZW1lbnRhdGlvbkNTUyB7Ci0KLQlJQ1NTU3R5bGVEZWNsYXJhdGlvbiBjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURvY3VtZW50U3R5bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURvY3VtZW50U3R5bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE0NjA2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lEb2N1bWVudFN0eWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLkRvY3VtZW50U3R5bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRG9jdW1lbnRTdHlsZSBleHRlbmRzIERvY3VtZW50U3R5bGUgewotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0Ci0JICogQHBhcmFtIG5ld1NoZWV0Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0Ci0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCVN0eWxlU2hlZXQgYXBwZW5kU2hlZXQoU3R5bGVTaGVldCBuZXdTaGVldCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBwYXJhbSBuZXdTaGVldAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBwYXJhbSByZWZTaGVldAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlTdHlsZVNoZWV0IGluc2VydFNoZWV0QmVmb3JlKFN0eWxlU2hlZXQgbmV3U2hlZXQsIFN0eWxlU2hlZXQgcmVmU2hlZXQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAcGFyYW0gb2xkU2hlZXQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JU3R5bGVTaGVldCByZW1vdmVTaGVldChTdHlsZVNoZWV0IG9sZFNoZWV0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0Ci0JICogQHBhcmFtIG5ld1NoZWV0Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0Ci0JICogQHBhcmFtIG9sZFNoZWV0Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0Ci0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCVN0eWxlU2hlZXQgcmVwbGFjZVNoZWV0KFN0eWxlU2hlZXQgbmV3U2hlZXQsIFN0eWxlU2hlZXQgb2xkU2hlZXQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3ByZWZlcmVuY2VzL0NTU1ByZWZlcmVuY2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcHJlZmVyZW5jZXMvQ1NTUHJlZmVyZW5jZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWZhZmU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcHJlZmVyZW5jZXMvQ1NTUHJlZmVyZW5jZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBqdXN0IGFjY2VzcyBwcmVmZXJlbmNlcyBkaXJlY3RseQotICovCi1wdWJsaWMgY2xhc3MgQ1NTUHJlZmVyZW5jZUhlbHBlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDU1NQcmVmZXJlbmNlSGVscGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NQcmVmZXJlbmNlSGVscGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJldHdlZW5WYWx1ZVN0cmluZygpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX0JFVFdFRU5fVkFMVUUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRQcmVmZXJlbmNlcygpOwotCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJY2hhciBpbmRlbnRDaGFyID0gJyAnOwotCQkJU3RyaW5nIGluZGVudENoYXJQcmVmID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUik7Ci0JCQlpZiAoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIuZXF1YWxzKGluZGVudENoYXJQcmVmKSkgewotCQkJCWluZGVudENoYXIgPSAnXHQnOwotCQkJfQotCQkJaW50IGluZGVudGF0aW9uV2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQkJaW5kZW50LmFwcGVuZChpbmRlbnRDaGFyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZW50LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRNYXhMaW5lV2lkdGgoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWZzID0gZ2V0UHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVvdGVTdHJpbmcoSUNTU01vZGVsIG1vZGVsKSB7Ci0JCS8vIG5ha2Ftb3JpX1RPRE8gY3NzIHByZWYgdHJhbnNpdGlvbgotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3BhY2VzUG9zdERlbGltaXRlcigpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1BST1BfUE9TVF9ERUxJTSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRTcGFjZXNQcmVEZWxpbWl0ZXIoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BSRV9ERUxJTSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJZGVudFVwcGVyQ2FzZSgpIHsKLQkJaWYgKGdldFByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05ld0xpbmVPbk9wZW5CcmFjZSgpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX05FV0xJTkVfT05fT1BFTl9CUkFDRSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPbmVQcm9wZXJ0eVBlckxpbmUoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvaGliaXRXcmFwT25BdHRyKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BOYW1lVXBwZXJDYXNlKCkgewotCQlpZiAoZ2V0UHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcFZhbHVlVXBwZXJDYXNlKCkgewotCQlpZiAoZ2V0UHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1F1b3RlSW5VUkkoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEVfSU5fVVJJKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRCZXR3ZWVuVmFsdWVTdHJpbmcoU3RyaW5nIG5ld0JldHdlZW5WYWx1ZVN0cmluZykgewotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX0JFVFdFRU5fVkFMVUUsIG5ld0JldHdlZW5WYWx1ZVN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0SWRlbnRVcHBlckNhc2UoYm9vbGVhbiBuZXdJZGVudFVwcGVyQ2FzZSkgewotCQlpbnQgdGhlQ2FzZSA9IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVI7Ci0JCWlmIChuZXdJZGVudFVwcGVyQ2FzZSkKLQkJCXRoZUNhc2UgPSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSOwotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSLCB0aGVDYXNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPbmVQcm9wZXJ0eVBlckxpbmUoYm9vbGVhbiBuZXdPbmVQcm9wZXJ0eVBlckxpbmUpIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX09ORV9QRVJfTElORSwgbmV3T25lUHJvcGVydHlQZXJMaW5lKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9oaWJpdFdyYXBPbkF0dHIoYm9vbGVhbiBuZXdQcm9oaWJpdFdyYXBPbkF0dHIpIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUiwgbmV3UHJvaGliaXRXcmFwT25BdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wTmFtZVVwcGVyQ2FzZShib29sZWFuIG5ld1Byb3BOYW1lVXBwZXJDYXNlKSB7Ci0JCWludCB0aGVDYXNlID0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUjsKLQkJaWYgKG5ld1Byb3BOYW1lVXBwZXJDYXNlKQotCQkJdGhlQ2FzZSA9IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVI7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUsIHRoZUNhc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFByb3BWYWx1ZVVwcGVyQ2FzZShib29sZWFuIG5ld1Byb3BWYWx1ZVVwcGVyQ2FzZSkgewotCQlpbnQgdGhlQ2FzZSA9IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVI7Ci0JCWlmIChuZXdQcm9wVmFsdWVVcHBlckNhc2UpCi0JCQl0aGVDYXNlID0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUjsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUsIHRoZUNhc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1b3RlU3RyaW5nKFN0cmluZyBxdW90ZSkgewotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFLCBxdW90ZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BhY2VzUG9zdERlbGltaXRlcihpbnQgbnVtKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QT1NUX0RFTElNLCBudW0pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwYWNlc1ByZURlbGltaXRlcihpbnQgbnVtKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QUkVfREVMSU0sIG51bSk7Ci0JfQotCi0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKLQkJQ1NTQ29yZVBsdWdpbiBjc3NNb2RlbFBsdWdpbiA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlyZXR1cm4gY3NzTW9kZWxQbHVnaW4uZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcml2YXRlIENTU1ByZWZlcmVuY2VIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTUHJlZmVyZW5jZUhlbHBlciBmSW5zdGFuY2UgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lDU1NQYXJ0aXRpb25UeXBlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lDU1NQYXJ0aXRpb25UeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGZjZjQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JQ1NTUGFydGl0aW9uVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uVHlwZXM7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLiBJdCBkZWZpbmVzIHRoZQotICogcGFydGl0aW9uaW5nIGZvciBDU1MgYW5kIGFsbCBpdHMgcGFydGl0aW9ucy4gQ2xpZW50cyBzaG91bGQgcmVmZXJlbmNlIHRoZQotICogcGFydGl0aW9uIHR5cGUgU3RyaW5ncyBkZWZpbmVkIGhlcmUgZGlyZWN0bHkuCi0gKiAKLSAqIEBkZXByZWNhdGVkIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50ZXh0LklDU1NQYXJ0aXRpb25zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1BhcnRpdGlvblR5cGVzIGV4dGVuZHMgSVN0cnVjdHVyZWRQYXJ0aXRpb25UeXBlcyB7Ci0KLQlTdHJpbmcgU1RZTEUgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy5TVFlMRSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGFza3MvQ1NTRmlsZVRhc2tTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Rhc2tzL0NTU0ZpbGVUYXNrU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjliZmM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGFza3MvQ1NTRmlsZVRhc2tTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRhc2tzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrcy5TdHJ1Y3R1cmVkRmlsZVRhc2tTY2FubmVyOwotCi1wdWJsaWMgY2xhc3MgQ1NTRmlsZVRhc2tTY2FubmVyIGV4dGVuZHMgU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lciB7Ci0JcHVibGljIENTU0ZpbGVUYXNrU2Nhbm5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbW1lbnRlZFRleHQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgYmVnaW4sIGludCBsZW5ndGgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0ZXh0ID0gc3VwZXIuZ2V0Q29tbWVudGVkVGV4dChkb2N1bWVudCwgYmVnaW4sIGxlbmd0aCk7Ci0JCWlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5lbmRzV2l0aCgiKi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgdGV4dC5sZW5ndGgoKSAtIDIpOwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQ29tbWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgSVRleHRSZWdpb24gdGV4dFJlZ2lvbikgewotCQlyZXR1cm4gdGV4dFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGE0MjM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NSZWdpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIGNlbnRyYWxpemVkIHBsYWNlIHRvIHB1dCAicmVwYXJzaW5nIiBsb2dpYy4gVGhpcyBpcwotICogdGhlIGxvZ2ljIHRoYXQgcmVwYXJzZXMgdGhlIHRleHQgaW5jcmVtZW50YWxseSwgYXMgYSB1c2VyIHR5cGVzIGluIG5ldwotICogY2hhcmFjdGVycywgb3IgRE9NIG5vZGVzIGFyZSBpbnNlcnRlZCBvciBkZWxldGVkLiBOb3RlOiBpdCBpcyBub3QgYSB0aHJlYWQKLSAqIHNhZmUgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIHsKLQotCWNsYXNzIFJlcGFyc2VSYW5nZSB7Ci0JCVJlcGFyc2VSYW5nZSgpIHsKLQkJCXJlc2V0KCk7Ci0JCX0KLQotCQlSZXBhcnNlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCQlmUmFuZ2VTdGFydCA9IHN0YXJ0OwotCQkJZlJhbmdlRW5kID0gZW5kOwotCQl9Ci0KLQkJdm9pZCBzZXRTdGFydChpbnQgc3RhcnQpIHsKLQkJCWZSYW5nZVN0YXJ0ID0gc3RhcnQ7Ci0JCX0KLQotCQl2b2lkIHNldEVuZChpbnQgZW5kKSB7Ci0JCQlmUmFuZ2VFbmQgPSBlbmQ7Ci0JCX0KLQotCQlpbnQgZ2V0U3RhcnQoKSB7Ci0JCQlyZXR1cm4gZlJhbmdlU3RhcnQ7Ci0JCX0KLQotCQlpbnQgZ2V0RW5kKCkgewotCQkJcmV0dXJuIGZSYW5nZUVuZDsKLQkJfQotCi0JCWJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJCXJldHVybiAoMCA8IGZSYW5nZUVuZCAtIGZSYW5nZVN0YXJ0KSA/IHRydWUgOiBmYWxzZTsKLQkJfQotCi0JCXZvaWQgcmVzZXQoKSB7Ci0JCQlmUmFuZ2VTdGFydCA9IEludGVnZXIuTUFYX1ZBTFVFOwotCQkJZlJhbmdlRW5kID0gMDsKLQkJfQotCi0JCXZvaWQgZXhwYW5kKFJlcGFyc2VSYW5nZSByYW5nZSkgewotCQkJaWYgKHJhbmdlID09IG51bGwgfHwgIXJhbmdlLmlzVmFsaWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWludCBzdGFydCA9IHJhbmdlLmdldFN0YXJ0KCk7Ci0JCQlpZiAoc3RhcnQgPCBmUmFuZ2VTdGFydCkgewotCQkJCWZSYW5nZVN0YXJ0ID0gc3RhcnQ7Ci0JCQl9Ci0JCQlpbnQgZW5kID0gcmFuZ2UuZ2V0RW5kKCk7Ci0JCQlpZiAoZlJhbmdlRW5kIDwgZW5kKSB7Ci0JCQkJZlJhbmdlRW5kID0gZW5kOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgZlJhbmdlU3RhcnQ7Ci0JCXByaXZhdGUgaW50IGZSYW5nZUVuZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JLy8gcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50Ci0JLy8gY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJvdW5kcnlDYXNlczIoKSB7Ci0JLy8gU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gc3BlY2lhbFBvc2l0aW9uVXBkYXRlKGZTdGFydCwgZlN0YXJ0ICsKLQkvLyBmTGVuZ3RoVG9SZXBsYWNlIC0gMSk7Ci0JLy8gaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JLy8gcmVzdWx0ID0gY2hlY2tJbnNpZGVCcmFjZSgpOwotCS8vIH0KLQkvLyByZXR1cm4gcmVzdWx0OwotCS8vIH0KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblN5bnRheCgpIHsKLQkJaW50IGNoZWNrU3RhcnQgPSBmU3RhcnQ7Ci0JCWludCBjaGVja0VuZCA9IGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2UgLSAxOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoY2hlY2tFbmQpOwotCQlpZiAoZW5kUmVnaW9uICE9IG51bGwpIHsKLQkJCWNoZWNrRW5kID0gZW5kUmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQl9Ci0KLQkJUmVwYXJzZVJhbmdlIHJhbmdlID0gbmV3IFJlcGFyc2VSYW5nZShjaGVja1N0YXJ0LCBjaGVja0VuZCk7Ci0KLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yRGVsaW1pdGVyKHJhbmdlLmdldFN0YXJ0KCksIHJhbmdlLmdldEVuZCgpKSk7Ci0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvclVua25vd25SZWdpb24ocmFuZ2UuZ2V0U3RhcnQoKSwgcmFuZ2UuZ2V0RW5kKCkpKTsKLQotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JRdW90ZXMocmFuZ2UuZ2V0U3RhcnQoKSwgcmFuZ2UuZ2V0RW5kKCkpKTsKLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yQ29tbWVudHMocmFuZ2UuZ2V0U3RhcnQoKSwgcmFuZ2UuZ2V0RW5kKCkpKTsKLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yQnJhY2VzKHJhbmdlLmdldFN0YXJ0KCksIHJhbmdlLmdldEVuZCgpKSk7Ci0KLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0OwotCi0JCXJlc3VsdCA9IGNoZWNrSW5zaWRlQnJhY2UocmFuZ2UuZ2V0U3RhcnQoKSwgcmFuZ2UuZ2V0RW5kKCkpOwotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gcmVwYXJzZShyYW5nZS5nZXRTdGFydCgpLCByYW5nZS5nZXRFbmQoKSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgUmVwYXJzZVJhbmdlIGdldFVwZGF0ZVJhbmdlRm9yVW5rbm93blJlZ2lvbihpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJaW50IG5ld1N0YXJ0ID0gc3RhcnQ7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0IC0gMSk7Ci0JCWlmIChpdGVyYXRvci5oYXNQcmV2KCkpIHsKLQkJCWl0ZXJhdG9yLnByZXYoKTsgLy8gc2tpcCBteXNlbGYKLQkJfQotCQl3aGlsZSAoaXRlcmF0b3IuaGFzUHJldigpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyYXRvci5wcmV2KCk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTikgewotCQkJCW5ld1N0YXJ0ID0gaXRlcmF0b3IuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKHN0YXJ0ICE9IG5ld1N0YXJ0KSB7Ci0JCQlyZXR1cm4gbmV3IFJlcGFyc2VSYW5nZShuZXdTdGFydCwgZW5kKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgUmVwYXJzZVJhbmdlIGdldFVwZGF0ZVJhbmdlRm9yRGVsaW1pdGVyKGludCBzdGFydCwgaW50IGVuZCkgewotCQlpZiAoZGlydHlTdGFydCAhPSBudWxsICYmIGRpcnR5U3RhcnQuZ2V0U3RhcnQoKSA8IHN0YXJ0KSB7Ci0JCQlzdGFydCA9IGRpcnR5U3RhcnQuZ2V0U3RhcnQoKTsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY1JlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQpOwotCQlpZiAoZG9jUmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChkb2NSZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldlJlZ2lvbiA9IGRvY1JlZ2lvbi5nZXRQcmV2aW91cygpOwotCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgUmVwYXJzZVJhbmdlKHByZXZSZWdpb24uZ2V0U3RhcnQoKSwgZW5kKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgUmVwYXJzZVJhbmdlIGdldFVwZGF0ZVJhbmdlRm9yUXVvdGVzKGludCBzdGFydCwgaW50IGVuZCkgewotCQlSZXBhcnNlUmFuZ2UgcmFuZ2UgPSBuZXcgUmVwYXJzZVJhbmdlKCk7Ci0KLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yUGFpcihzdGFydCwgZW5kLCAiXCIiLCAiXCIiKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvclBhaXIoc3RhcnQsIGVuZCwgIlwnIiwgIlwnIikpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiAocmFuZ2UuaXNWYWxpZCgpKSA/IHJhbmdlIDogbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFJlcGFyc2VSYW5nZSBnZXRVcGRhdGVSYW5nZUZvckNvbW1lbnRzKGludCBzdGFydCwgaW50IGVuZCkgewotCQlSZXBhcnNlUmFuZ2UgcmFuZ2UgPSBuZXcgUmVwYXJzZVJhbmdlKCk7Ci0KLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yUGFpcihzdGFydCwgZW5kLCAiLyoiLCAiKi8iKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvclBhaXIoc3RhcnQsIGVuZCwgIjwlIiwgIiU+IikpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiAocmFuZ2UuaXNWYWxpZCgpKSA/IHJhbmdlIDogbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFJlcGFyc2VSYW5nZSBnZXRVcGRhdGVSYW5nZUZvckJyYWNlcyhpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJUmVwYXJzZVJhbmdlIHJhbmdlID0gbmV3IFJlcGFyc2VSYW5nZSgpOwotCi0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvclBhaXIoc3RhcnQsIGVuZCwgIlsiLCAiXSIpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yUGFpcihzdGFydCwgZW5kLCAiKCIsICIpIikpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JQYWlyKHN0YXJ0LCBlbmQsICJ7IiwgIn0iKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIChyYW5nZS5pc1ZhbGlkKCkpID8gcmFuZ2UgOiBudWxsOwotCX0KLQotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tJbnNpZGVCcmFjZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0KTsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlib29sZWFuIGJEZWNsYXJhdGlvbiA9IGZhbHNlOwotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmIChDU1NSZWdpb25VdGlsLmlzRGVjbGFyYXRpb25UeXBlKHR5cGUpIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCWJEZWNsYXJhdGlvbiA9IHRydWU7Ci0JCX0KLQkJaWYgKCFiRGVjbGFyYXRpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldlJlZ2lvbiA9IENTU1V0aWwuZmluZFByZXZpb3VzU2lnbmlmaWNhbnROb2RlKHJlZ2lvbik7Ci0JCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJdHlwZSA9IHByZXZSZWdpb24uZ2V0VHlwZSgpOwotCQkJCWlmIChDU1NSZWdpb25VdGlsLmlzRGVjbGFyYXRpb25UeXBlKHR5cGUpIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJCQliRGVjbGFyYXRpb24gPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIWJEZWNsYXJhdGlvbikgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0UmVnaW9uID0gQ1NTVXRpbC5maW5kTmV4dFNpZ25pZmljYW50Tm9kZShyZWdpb24pOwotCQkJaWYgKG5leHRSZWdpb24gIT0gbnVsbCkgewotCQkJCXR5cGUgPSBuZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJCQlpZiAoQ1NTUmVnaW9uVXRpbC5pc0RlY2xhcmF0aW9uVHlwZSh0eXBlKSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCQkJYkRlY2xhcmF0aW9uID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYkRlY2xhcmF0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0UmVnaW9uID0gZmluZFJ1bGVTdGFydChyZWdpb24pOwotCQkJaWYgKHN0YXJ0UmVnaW9uICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZW5kKTsKLQkJCQlpZiAoZW5kUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gcmVwYXJzZShzdGFydFJlZ2lvbiwgZW5kUmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZFJ1bGVTdGFydChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0UmVnaW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gc3RhcnRSZWdpb247Ci0JCS8vIGZpbmQgJ3snCi0JCXdoaWxlIChyZWdpb24gIT0gbnVsbCAmJiByZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpIHsKLQkJCXJlZ2lvbiA9IHJlZ2lvbi5nZXRQcmV2aW91cygpOwotCQl9Ci0JCS8vIGlmIChyZWdpb24gPT0gc3RhcnRSZWdpb24pIHsKLQkJLy8gcmV0dXJuIG51bGw7Ci0JCS8vIH0KLQkJLy8gZWxzZQotCQlpZiAocmVnaW9uICE9IG51bGwpIHsgLy8gJ3snIGlzIGZvdW5kCi0JCQlyZWdpb24gPSByZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJCWlmIChpc0xlYWRpbmdEZWNsYXJhdGlvblR5cGUocmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0xlYWRpbmdEZWNsYXJhdGlvblR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPTlRfRkFDRSB8fCBDU1NSZWdpb25VdGlsLmlzU2VsZWN0b3JUeXBlKHR5cGUpKTsKLQl9Ci0KLQkvLyBwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQKLQkvLyBjaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQm91bmRyeUNhc2VzKCkgewotCS8vIHJldHVybiBzcGVjaWFsUG9zaXRpb25VcGRhdGUoZlN0YXJ0LCBmU3RhcnQgKyBmTGVuZ3RoVG9SZXBsYWNlIC0gMSk7Ci0JLy8gfQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgUmVwYXJzZVJhbmdlIGdldFVwZGF0ZVJhbmdlRm9yUGFpcihpbnQgc3RhcnQsIGludCBlbmQsIFN0cmluZyBvcGVuZXIsIFN0cmluZyBjbG9zZXIpIHsKLQkJU3RyaW5nQnVmZmVyIGRlbGV0aW9uQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdCdWZmZXIgaW5zZXJ0aW9uQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgcXVvdGVMZW4gPSBNYXRoLm1heChvcGVuZXIubGVuZ3RoKCksIGNsb3Nlci5sZW5ndGgoKSk7Ci0JCWlmICgxIDwgcXVvdGVMZW4pIHsKLQkJCS8qKgotCQkJICogZXgpIG9wZW5lciA9ICJBQkMiLCBjbG9zZXIgPSAiWFlaIiBtb2RlbDogQUJDREVGLi4uLi4uLlVWV1hZWgotCQkJICogZGVsZXRpb246IENERUYuLi4uLi4uVVZXWCBwcmUvcG9zdDogQUIgLyBZWgotCQkJICovCi0JCQlpbnQgYWRkU3RhcnQgPSBzdGFydCAtIChxdW90ZUxlbiAtIDEpOwotCQkJaWYgKDAgPD0gYWRkU3RhcnQpIHsKLQkJCQlTdHJpbmcgYWRkU3RyID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXQoYWRkU3RhcnQsIHF1b3RlTGVuIC0gMSk7Ci0JCQkJZGVsZXRpb25CdWYuYXBwZW5kKGFkZFN0cik7Ci0JCQkJaW5zZXJ0aW9uQnVmLmFwcGVuZChhZGRTdHIpOwotCQkJfQotCQkJZGVsZXRpb25CdWYuYXBwZW5kKGZEZWxldGVkVGV4dCk7Ci0JCQlpbnNlcnRpb25CdWYuYXBwZW5kKGZDaGFuZ2VzKTsKLQkJCWlmIChlbmQgKyAocXVvdGVMZW4gLSAxKSA8IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKLQkJCQlTdHJpbmcgYWRkU3RyID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXQoZW5kICsgMSwgcXVvdGVMZW4gLSAxKTsKLQkJCQlkZWxldGlvbkJ1Zi5hcHBlbmQoYWRkU3RyKTsKLQkJCQlpbnNlcnRpb25CdWYuYXBwZW5kKGFkZFN0cik7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkZWxldGlvbkJ1Zi5hcHBlbmQoZkRlbGV0ZWRUZXh0KTsKLQkJCWluc2VydGlvbkJ1Zi5hcHBlbmQoZkNoYW5nZXMpOwotCQl9Ci0JCVN0cmluZyBkZWxldGlvbiA9IGRlbGV0aW9uQnVmLnRvU3RyaW5nKCk7Ci0JCVN0cmluZyBpbnNlcnRpb24gPSBpbnNlcnRpb25CdWYudG9TdHJpbmcoKTsKLQotCQlpbnQgcmFuZ2VTdGFydCA9IHN0YXJ0OwotCQlpbnQgcmFuZ2VFbmQgPSBlbmQ7Ci0KLQkJaWYgKDAgPD0gZGVsZXRpb24uaW5kZXhPZihvcGVuZXIpIHx8IDAgPD0gZGVsZXRpb24uaW5kZXhPZihjbG9zZXIpIHx8IDAgPD0gaW5zZXJ0aW9uLmluZGV4T2Yob3BlbmVyKSB8fCAwIDw9IGluc2VydGlvbi5pbmRleE9mKGNsb3NlcikpIHsKLQkJCWludCBzLCBlOwotCQkJdHJ5IHsKLQkJCQlpZiAoc3RhcnQgPD0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSkgewotCQkJCQlJUmVnaW9uIHN0YXJ0UmVnaW9uID0gZ2V0RmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIoKS5maW5kKHN0YXJ0IC0gMSwgb3BlbmVyLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJCWlmIChzdGFydFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlzID0gc3RhcnRSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlzID0gLTE7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXMgPSAtMTsKLQkJCQl9Ci0JCQkJaWYgKGVuZCA8IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKSB7Ci0JCQkJCUlSZWdpb24gZW5kUmVnaW9uID0gZ2V0RmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIoKS5maW5kKGVuZCArIDEsIGNsb3NlciwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJCWlmIChlbmRSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJZSA9IGVuZFJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWUgPSAtMTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZSA9IC0xOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJaWYgKDAgPD0gcykgewotCQkJCXJhbmdlU3RhcnQgPSBNYXRoLm1pbihyYW5nZVN0YXJ0LCBzKTsKLQkJCX0KLQkJCWlmICgwIDw9IGUpIHsKLQkJCQlyYW5nZUVuZCA9IE1hdGgubWF4KHJhbmdlRW5kLCBlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChyYW5nZVN0YXJ0IDwgc3RhcnQgfHwgZW5kIDwgcmFuZ2VFbmQpIHsKLQkJCXJldHVybiBuZXcgUmVwYXJzZVJhbmdlKHJhbmdlU3RhcnQsIHJhbmdlRW5kKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IENTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L0NTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYzgzYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L0NTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDU1NfR0VORVJJQyA9IDEwMTEwOTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaW50IHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZSA9IG51bGw7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBDU1NfR0VORVJJQyA6Ci0JCQkJaW5zdGFuY2UgPSBuZXcgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZDgxNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFdhbGtlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFdhbGtlciB7Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCA9IG51bGw7Ci0JSVN0cnVjdHVyZWREb2N1bWVudCBmU3RydWN0dXJlZERvY3VtZW50ID0gbnVsbDsKLQlTdHJpbmcgZk9yaWdpbmFsQ2hhbmdlcyA9IG51bGw7Ci0JaW50IGZPcmlnaW5hbE9mZnNldCA9IDA7Ci0JaW50IGZPcmlnaW5hbExlbmd0aFRvUmVwbGFjZSA9IDA7Ci0JaW50IGZMZW5ndGhEaWZmZXJlbmNlID0gMDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFdhbGtlcihTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlpbml0aWFsaXplKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmU3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIE9sZCBOb2RlczogLS1bTzFdLS1bTzJdLS1bTzNdLS0tIDogLyBcIEN1cnJlbnQgTm9kZXM6Ci0JICogLS0tW0MxXS0tLS0tW0MyXS0tLS0tW0MzXS0tLS0tW0M0XS0tLQotCSAqIAotCSAqIElucHV0OiBPMSAtPiBPdXRwdXQ6IE8yIElucHV0OiBPMiAtPiBPdXRwdXQ6IE8zIElucHV0OiBPMyAtPiBPdXRwdXQ6IEM0Ci0JICogSW5wdXQ6IENuIC0+IE91dHB1dDogQ24rMQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldE5leHROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHROb2RlID0gbnVsbDsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJbmV4dE5vZGUgPSBub2RlLmdldE5leHQoKTsKLQkJCWlmIChuZXh0Tm9kZSA9PSBudWxsKSB7Ci0JCQkJaWYgKGlzT2xkTm9kZShub2RlKSkgewotCQkJCQkvLyB0aGlzIG1heSBiZSB0aGUgZW5kIG9mIG9sZCBmbGF0bm9kZXMKLQkJCQkJaW50IG5ld1N0YXJ0ID0gbm9kZS5nZXRFbmQoKSAtIGZMZW5ndGhEaWZmZXJlbmNlOwotCQkJCQluZXh0Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobmV3U3RhcnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV4dE5vZGU7Ci0JfQotCi0JLyoqCi0JICogT2xkIE5vZGVzOiAtLVtPMV0tLVtPMl0tLVtPM10tLS0gOiAvIFwgQ3VycmVudCBOb2RlczoKLQkgKiAtLS1bQzFdLS0tLS1bQzJdLS0tLS1bQzNdLS0tLS1bQzRdLS0tCi0JICogCi0JICogSW5wdXQ6IE8qIC0+IE91dHB1dDogQzQgSW5wdXQ6IENuIC0+IE91dHB1dDogQ24rMQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldE5leHROb2RlSW5DdXJyZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHROb2RlID0gbnVsbDsKLQkJaWYgKGlzT2xkTm9kZShub2RlKSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRFbmROb2RlID0gZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QuaXRlbShmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdC5nZXRMZW5ndGgoKSAtIDEpOwotCQkJaW50IG5ld1N0YXJ0ID0gb2xkRW5kTm9kZS5nZXRFbmQoKSAtIGZMZW5ndGhEaWZmZXJlbmNlOwotCQkJbmV4dE5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG5ld1N0YXJ0KTsKLQkJfQotCQllbHNlIGlmIChub2RlICE9IG51bGwpIHsKLQkJCW5leHROb2RlID0gbm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG5leHROb2RlOwotCX0KLQotCS8qKgotCSAqIE9sZCBOb2RlczogLS1bTzFdLS1bTzJdLS1bTzNdLS0tIDogLyBcIEN1cnJlbnQgTm9kZXM6Ci0JICogLS0tW0MxXS0tLS0tW0MyXS0tLS0tW0MzXS0tLS0tW0M0XS0tLQotCSAqIAotCSAqIElucHV0OiBPMSAtPiBPdXRwdXQ6IEMxIElucHV0OiBPMiAtPiBPdXRwdXQ6IE8xIElucHV0OiBPMyAtPiBPdXRwdXQ6IE8yCi0JICogSW5wdXQ6IENuIC0+IE91dHB1dDogQ24tMQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFByZXZOb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZOb2RlID0gbnVsbDsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJcHJldk5vZGUgPSBub2RlLmdldFByZXZpb3VzKCk7Ci0JCQlpZiAocHJldk5vZGUgPT0gbnVsbCkgewotCQkJCWlmIChpc09sZE5vZGUobm9kZSkpIHsKLQkJCQkJLy8gdGhpcyBtYXkgYmUgdGhlIHN0YXJ0IG9mIG9sZCBmbGF0bm9kZXMKLQkJCQkJaW50IG5ld0VuZCA9IG5vZGUuZ2V0U3RhcnQoKSAtIDE7Ci0JCQkJCXByZXZOb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuZXdFbmQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJldk5vZGU7Ci0JfQotCi0JLyoqCi0JICogT2xkIE5vZGVzOiAtLVtPMV0tLVtPMl0tLVtPM10tLS0gOiAvIFwgQ3VycmVudCBOb2RlczoKLQkgKiAtLS1bQzFdLS0tLS1bQzJdLS0tLS1bQzNdLS0tLS1bQzRdLS0tCi0JICogCi0JICogSW5wdXQ6IE8qIC0+IE91dHB1dDogQzEgSW5wdXQ6IENuIC0+IE91dHB1dDogQ24tMQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFByZXZOb2RlSW5DdXJyZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZOb2RlID0gbnVsbDsKLQkJaWYgKGlzT2xkTm9kZShub2RlKSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRTdGFydE5vZGUgPSBmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdC5pdGVtKDApOwotCQkJaW50IG5ld0VuZCA9IG9sZFN0YXJ0Tm9kZS5nZXRTdGFydCgpIC0gMTsKLQkJCXByZXZOb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuZXdFbmQpOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJcHJldk5vZGUgPSBub2RlLmdldFByZXZpb3VzKCk7Ci0JCX0KLQkJcmV0dXJuIHByZXZOb2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJZlN0cnVjdHVyZWREb2N1bWVudCA9IGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlmT3JpZ2luYWxDaGFuZ2VzID0gZXZlbnQuZ2V0VGV4dCgpOwotCQlmT3JpZ2luYWxPZmZzZXQgPSBldmVudC5nZXRPZmZzZXQoKTsKLQkJZk9yaWdpbmFsTGVuZ3RoVG9SZXBsYWNlID0gZXZlbnQuZ2V0TGVuZ3RoKCk7Ci0JCWZMZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoZk9yaWdpbmFsQ2hhbmdlcywgZk9yaWdpbmFsTGVuZ3RoVG9SZXBsYWNlKTsKLQotCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCkgewotCQkJZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50KSBldmVudCkuZ2V0T2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOwotCQl9Ci0JCWVsc2UgewotCQkJZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPbGROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlib29sZWFuIGJPbGQgPSBmYWxzZTsKLQkJaWYgKGZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0ICE9IG51bGwpIHsKLQkJCUVudW1lcmF0aW9uIGUgPSBmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdC5lbGVtZW50cygpOwotCQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlpZiAoZS5uZXh0RWxlbWVudCgpID09IG5vZGUpIHsKLQkJCQkJYk9sZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYk9sZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThkNTNjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudGV4dC5JQ1NTUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uczsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JDU1MgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIHsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZ1tdIGxlZ2FsVHlwZXMgPSBuZXcgU3RyaW5nW117SUNTU1BhcnRpdGlvbnMuU1RZTEUsIElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTn07Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckNTUygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYXJ0aXRpb25UeXBlKCkgewotCQlyZXR1cm4gSUNTU1BhcnRpdGlvbnMuU1RZTEU7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldExlZ2FsQ29udGVudFR5cGVzKCkgewotCQlyZXR1cm4gbGVnYWxUeXBlczsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckNTUygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9BYnN0cmFjdENzc1RyYXZlcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0Fic3RyYWN0Q3NzVHJhdmVyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MTFiNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0Fic3RyYWN0Q3NzVHJhdmVyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlU2hlZXQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDc3NUcmF2ZXJzZXIgewotCi0JcHVibGljIHN0YXRpYyBzaG9ydCBUUkFWX0NPTlQgPSAwOwotCXB1YmxpYyBzdGF0aWMgc2hvcnQgVFJBVl9QUlVORSA9IDE7Ci0JcHVibGljIHN0YXRpYyBzaG9ydCBUUkFWX1NUT1AgPSAyOwotCXByb3RlY3RlZCBqYXZhLnV0aWwuU3RhY2sgdHJhdlN0YWNrOwotCXByaXZhdGUgYm9vbGVhbiBmVHJhdmVyc2VJbXBvcnRlZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmVHJhdmVyc2VJbXBvcnRGaXJzdCA9IGZhbHNlOwotCXByaXZhdGUgamF2YS51dGlsLlZlY3RvciB0cmF2ZXJzZWRTaGVldHM7Ci0KLQkvKioKLQkgKiBDc3NQcm9wQ01Ob2RlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEFic3RyYWN0Q3NzVHJhdmVyc2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU01vZGVsCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYXBwbHkoSUNTU01vZGVsIG1vZGVsKSB7Ci0JCWFwcGx5KG1vZGVsLmdldERvY3VtZW50KCkpOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIGFwcGx5KElDU1NOb2RlIHJvb3QpIHsKLQkJdHJhdlN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JCWlmIChmVHJhdmVyc2VJbXBvcnRlZCkgewotCQkJdHJhdmVyc2VkU2hlZXRzID0gbmV3IFZlY3RvcigpOwotCQkJaWYgKHJvb3QgIT0gbnVsbCAmJiByb290LmdldE93bmVyRG9jdW1lbnQoKSAhPSBudWxsICYmIHJvb3QuZ2V0T3duZXJEb2N1bWVudCgpLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVTSEVFVF9OT0RFKSB7Ci0JCQkJdHJhdmVyc2VkU2hlZXRzLmFkZChyb290LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBmaXJzdCBjYWxsIGJlZ2luKCkKLQkJYmVnaW4ocm9vdCk7Ci0KLQkJLy8gdHJhdmVyc2UKLQkJdHJhdmVyc2Uocm9vdCk7Ci0KLQkJLy8gbGFzdCBjYWxsIGVuZCgpCi0JCWVuZChyb290KTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGJlZ2luKElDU1NOb2RlIG5vZGUpIHsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGVuZChJQ1NTTm9kZSBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNUcmF2ZXJzZUltcG9ydGVkKCkgewotCQlyZXR1cm4gZlRyYXZlcnNlSW1wb3J0ZWQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgc2hvcnQgcG9zdE5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlyZXR1cm4gKHNob3J0KSAwOwotCX0KLQotCi0JcHJvdGVjdGVkIHNob3J0IHByZU5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlyZXR1cm4gKHNob3J0KSAwOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdUcmF2ZXJzZUltcG9ydGVkCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0VHJhdmVyc2VJbXBvcnRlZChib29sZWFuIG5ld1RyYXZlcnNlSW1wb3J0ZWQpIHsKLQkJZlRyYXZlcnNlSW1wb3J0ZWQgPSBuZXdUcmF2ZXJzZUltcG9ydGVkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdUcmF2ZXJzZUltcG9ydEZpcnN0Ci0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0VHJhdmVyc2VJbXBvcnRGaXJzdChib29sZWFuIG5ld1RyYXZlcnNlSW1wb3J0Rmlyc3QpIHsKLQkJZlRyYXZlcnNlSW1wb3J0Rmlyc3QgPSBuZXdUcmF2ZXJzZUltcG9ydEZpcnN0OwotCX0KLQotCi0JcHJpdmF0ZSBmaW5hbCBzaG9ydCB0cmF2ZXJzZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gVFJBVl9DT05UOwotCi0JCXRyYXZTdGFjay5wdXNoKG5vZGUpOwotCi0JCS8vIHByZS1hY3Rpb24KLQkJc2hvcnQgcmV0ID0gcHJlTm9kZShub2RlKTsKLQotCQlpZiAocmV0ID09IFRSQVZfQ09OVCkgewotCQkJaWYgKGZUcmF2ZXJzZUltcG9ydGVkICYmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuSU1QT1JUUlVMRV9OT0RFKSkgewotCQkJCUlDU1NJbXBvcnRSdWxlIHJ1bGUgPSAoSUNTU0ltcG9ydFJ1bGUpIG5vZGU7Ci0JCQkJLy8gdHJhdmVyc2UgZXh0ZXJuYWwgc3R5bGUtc2hlZXQKLQkJCQlJQ1NTU3R5bGVTaGVldCBzaGVldCA9IChJQ1NTU3R5bGVTaGVldCkgcnVsZS5nZXRTdHlsZVNoZWV0KCk7Ci0JCQkJaWYgKHNoZWV0ICE9IG51bGwgJiYgIXRyYXZlcnNlZFNoZWV0cy5jb250YWlucyhzaGVldCkpIHsgLy8gcHJldmVudAotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGxvb3AKLQkJCQkJdHJhdmVyc2VkU2hlZXRzLmFkZChzaGVldCk7Ci0JCQkJCXNob3J0IHJldEV4dCA9IHRyYXZlcnNlKHNoZWV0KTsKLQkJCQkJaWYgKHJldEV4dCA9PSBUUkFWX1NUT1ApIHsKLQkJCQkJCXRyYXZTdGFjay5wb3AoKTsKLQkJCQkJCXJldHVybiByZXRFeHQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGNvbGxlY3QgY2hpbGRyZW4KLQkJCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlDU1NOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAoZlRyYXZlcnNlSW1wb3J0Rmlyc3QpIHsKLQkJCQlBcnJheUxpc3Qgb3RoZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuSU1QT1JUUlVMRV9OT0RFKQotCQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkJZWxzZQotCQkJCQkJb3RoZXJzLmFkZChjaGlsZCk7Ci0JCQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQl9Ci0JCQkJY2hpbGRyZW4uYWRkQWxsKG90aGVycyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyB0cmF2ZXJzZSBjaGlsZHJlbgotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJCWNoaWxkID0gKElDU1NOb2RlKSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQkJc2hvcnQgcmV0Q2hpbGQgPSB0cmF2ZXJzZShjaGlsZCk7Ci0JCQkJaWYgKHJldENoaWxkID09IFRSQVZfU1RPUCkgewotCQkJCQl0cmF2U3RhY2sucG9wKCk7Ci0JCQkJCXJldHVybiByZXRDaGlsZDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocmV0ID09IFRSQVZfU1RPUCkgewotCQkJdHJhdlN0YWNrLnBvcCgpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCS8vIHBvc3QtYWN0aW9uCi0JCXJldCA9IHBvc3ROb2RlKG5vZGUpOwotCi0JCXRyYXZTdGFjay5wb3AoKTsKLQkJcmV0dXJuIChyZXQgPT0gVFJBVl9QUlVORSkgPyBUUkFWX0NPTlQgOiByZXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU0NsYXNzVHJhdmVyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTQ2xhc3NUcmF2ZXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdhMzUzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTQ2xhc3NUcmF2ZXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTWVkaWFSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2ltcGxlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVNoZWV0OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NDbGFzc1RyYXZlcnNlciBleHRlbmRzIEFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQotCUFycmF5TGlzdCBmQ2xhc3NOYW1lczsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NDbGFzc1RyYXZlcnNlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQ2xhc3NOYW1lcyhJQ1NTU3R5bGVSdWxlIHJ1bGUpIHsKLQkJSUNTU1NlbGVjdG9yTGlzdCBzZWxlY3Rvckxpc3QgPSBydWxlLmdldFNlbGVjdG9ycygpOwotCQlJdGVyYXRvciBpU2VsZWN0b3IgPSBzZWxlY3Rvckxpc3QuZ2V0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKGlTZWxlY3Rvci5oYXNOZXh0KCkpIHsKLQkJCUlDU1NTZWxlY3RvciBzZWxlY3RvciA9IChJQ1NTU2VsZWN0b3IpIGlTZWxlY3Rvci5uZXh0KCk7Ci0JCQlJdGVyYXRvciBpSXRlbSA9IHNlbGVjdG9yLmdldEl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaUl0ZW0uaGFzTmV4dCgpKSB7Ci0JCQkJSUNTU1NlbGVjdG9ySXRlbSBpdGVtID0gKElDU1NTZWxlY3Rvckl0ZW0pIGlJdGVtLm5leHQoKTsKLQkJCQlpZiAoaXRlbS5nZXRJdGVtVHlwZSgpID09IElDU1NTZWxlY3Rvckl0ZW0uU0lNUExFKSB7Ci0JCQkJCUlDU1NTaW1wbGVTZWxlY3RvciBzZWwgPSAoSUNTU1NpbXBsZVNlbGVjdG9yKSBpdGVtOwotCQkJCQlpbnQgbkNsYXNzZXMgPSBzZWwuZ2V0TnVtT2ZDbGFzc2VzKCk7Ci0JCQkJCWZvciAoaW50IGlDbGFzcyA9IDA7IGlDbGFzcyA8IG5DbGFzc2VzOyBpQ2xhc3MrKykgewotCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHNlbC5nZXRDbGFzcyhpQ2xhc3MpOwotCQkJCQkJaWYgKCFmQ2xhc3NOYW1lcy5jb250YWlucyhjbGFzc05hbWUpKQotCQkJCQkJCWZDbGFzc05hbWVzLmFkZChjbGFzc05hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmVnaW4oSUNTU05vZGUgbm9kZSkgewotCQlpZiAoZkNsYXNzTmFtZXMgPT0gbnVsbCkKLQkJCWZDbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZChJQ1NTTm9kZSBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2xhc3NOYW1lcygpIHsKLQkJcmV0dXJuIChmQ2xhc3NOYW1lcyAhPSBudWxsKSA/IGZDbGFzc05hbWVzIDogQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcG9zdE5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlyZXR1cm4gVFJBVl9DT05UOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJc2hvcnQgcmV0OwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpIHsKLQkJCWFkZENsYXNzTmFtZXMoKElDU1NTdHlsZVJ1bGUpIG5vZGUpOwotCQkJcmV0ID0gVFJBVl9QUlVORTsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQgfHwgbm9kZSBpbnN0YW5jZW9mIElDU1NNZWRpYVJ1bGUgfHwgbm9kZSBpbnN0YW5jZW9mIElDU1NJbXBvcnRSdWxlKSB7Ci0JCQlyZXQgPSBUUkFWX0NPTlQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXQgPSBUUkFWX1BSVU5FOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU0xpbmtDb252ZXJ0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NMaW5rQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3N2RjZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU0xpbmtDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NMaW5rQ29udmVydGVyIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQWJzdHJhY3RDc3NUcmF2ZXJzZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfQkVHSU4gPSAidXJsKCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0VORCA9ICIpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWSA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERfUVVPVEUgPSAiXCIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNfUVVPVEUgPSAiXCciOyAvLyROT04tTkxTLTEkCi0KLQlJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NMaW5rQ29udmVydGVyKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJYmFzZU1vZGVsID0gbW9kZWw7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCAmJiAoKElDU1NNb2RlbCkgbW9kZWwpLmdldFN0eWxlU2hlZXRUeXBlKCkgIT0gSUNTU01vZGVsLkVYVEVSTkFMKSB7Ci0JCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSAoKElDU1NNb2RlbCkgbW9kZWwpLmdldE93bmVyRE9NTm9kZSgpOwotCQkJYmFzZU1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkRnVuYyhTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKCF2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFVSTF9CRUdJTikpIHsKLQkJCS8vIHBhX1RPRE8gY3NzIHByZWYKLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQkJU3RyaW5nIHF1b3RlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQkJCXZhbHVlID0gQ1NTVXRpbC5zdHJpcFF1b3Rlcyh2YWx1ZSk7Ci0JCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUodmFsdWUsIHF1b3RlKTsKLQkJCVN0cmluZyBzdHIgPSBVUkxfQkVHSU47Ci0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQlzdHIgPSBzdHIudG9VcHBlckNhc2UoKTsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHN0cik7Ci0JCQlidWYuYXBwZW5kKHF1b3RlKTsKLQkJCWJ1Zi5hcHBlbmQodmFsdWUpOwotCQkJYnVmLmFwcGVuZChxdW90ZSk7Ci0JCQlidWYuYXBwZW5kKFVSTF9FTkQpOwotCQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmVnaW4oSUNTU05vZGUgbm9kZSkgewotCQlpZiAoYmFzZU1vZGVsID09IG51bGwpIHsKLQkJCWJhc2VNb2RlbCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCk7Ci0JCQlpZiAoYmFzZU1vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsICYmICgoSUNTU01vZGVsKSBiYXNlTW9kZWwpLmdldFN0eWxlU2hlZXRUeXBlKCkgIT0gSUNTU01vZGVsLkVYVEVSTkFMKSB7Ci0JCQkJSURPTU5vZGUgeG1sTm9kZSA9IChJRE9NTm9kZSkgKChJQ1NTTW9kZWwpIGJhc2VNb2RlbCkuZ2V0T3duZXJET01Ob2RlKCk7Ci0JCQkJYmFzZU1vZGVsID0geG1sTm9kZS5nZXRNb2RlbCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VybChTdHJpbmcgc291cmNlKSB7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJc291cmNlID0gc291cmNlLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwotCQlyZXR1cm4gc291cmNlLnN0YXJ0c1dpdGgoVVJMX0JFR0lOKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuUFJJTUlUSVZFVkFMVUVfTk9ERSkgewotCQkJdG9BYnNvbHV0ZSgoQ1NTVmFsdWUpIG5vZGUpOwotCQl9IGVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUpIHsKLQkJCUlDU1NJbXBvcnRSdWxlIGlSdWxlID0gKElDU1NJbXBvcnRSdWxlKSBub2RlOwotCQkJaVJ1bGUuc2V0SHJlZih0b0Fic29sdXRlKGFkZEZ1bmMoaVJ1bGUuZ2V0SHJlZigpKSkpOwotCQl9Ci0JCXJldHVybiBUUkFWX0NPTlQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlRnVuYyhTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gRU1QVFk7Ci0JCVN0cmluZyBmaWVsZCA9IHZhbHVlLnRyaW0oKTsKLQkJLy8gZmlyc3QgOiB0ZWFyICJ1cmwoLi4uLikiCi0JCWlmIChmaWVsZC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoVVJMX0JFR0lOKSkgewotCQkJaW50IHVybCA9IGZpZWxkLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihVUkxfQkVHSU4pOwotCQkJaW50IGVuZFBhcmVudGhlc2lzID0gZmllbGQubGFzdEluZGV4T2YoVVJMX0VORCk7Ci0JCQlpZiAoZW5kUGFyZW50aGVzaXMgPiB1cmwpIHsKLQkJCQlmaWVsZCA9IGZpZWxkLnN1YnN0cmluZyh1cmwgKyA0LCBlbmRQYXJlbnRoZXNpcyk7Ci0JCQl9IGVsc2UKLQkJCQlmaWVsZCA9IGZpZWxkLnN1YnN0cmluZyh1cmwgKyA0KTsKLQkJfQotCQlyZXR1cm4gZmllbGQudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwRnVuYyhTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gRU1QVFk7Ci0JCS8vIGZpcnN0IDogdGVhciAidXJsKC4uLi4pIgotCQlTdHJpbmcgZmllbGQgPSByZW1vdmVGdW5jKHZhbHVlKTsKLQkJLy8gc2Vjb25kIDogdGVhciBxdW90YXRpb25zCi0JCWlmIChmaWVsZC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoRF9RVU9URSkpIHsKLQkJCWludCBxdW90ZSA9IGZpZWxkLmluZGV4T2YoRF9RVU9URSk7Ci0JCQlpbnQgZW5kID0gZmllbGQubGFzdEluZGV4T2YoRF9RVU9URSk7Ci0JCQlpZiAoZW5kID4gcXVvdGUpIHsKLQkJCQlmaWVsZCA9IGZpZWxkLnN1YnN0cmluZyhxdW90ZSArIDEsIGVuZCk7Ci0JCQl9IGVsc2UKLQkJCQlmaWVsZCA9IGZpZWxkLnN1YnN0cmluZyhxdW90ZSArIDEpOwotCQl9IGVsc2UgaWYgKGZpZWxkLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChTX1FVT1RFKSkgewotCQkJaW50IHF1b3RlID0gZmllbGQuaW5kZXhPZihTX1FVT1RFKTsKLQkJCWludCBlbmQgPSBmaWVsZC5sYXN0SW5kZXhPZihTX1FVT1RFKTsKLQkJCWlmIChlbmQgPiBxdW90ZSkgewotCQkJCWZpZWxkID0gZmllbGQuc3Vic3RyaW5nKHF1b3RlICsgMSwgZW5kKTsKLQkJCX0gZWxzZQotCQkJCWZpZWxkID0gZmllbGQuc3Vic3RyaW5nKHF1b3RlICsgMSk7Ci0JCX0KLQotCQlyZXR1cm4gZmllbGQudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9BYnNvbHV0ZShTdHJpbmcgc291cmNlKSB7Ci0JCWlmIChpc1VybChzb3VyY2UpKSB7Ci0JCQlTdHJpbmcgdXJsID0gQ1NTUGF0aFNlcnZpY2UuZ2V0QWJzb2x1dGVVUkwoYmFzZU1vZGVsLCBzdHJpcEZ1bmMoc291cmNlKSk7Ci0JCQlyZXR1cm4gKHVybCAhPSBudWxsKSA/IGFkZEZ1bmModXJsKSA6IChVUkxfQkVHSU4gKyBVUkxfRU5EKTsKLQkJfQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIHRvQWJzb2x1dGUoQ1NTVmFsdWUgbm9kZSkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElDU1NQcmltaXRpdmVWYWx1ZSkgewotCQkJSUNTU1ByaW1pdGl2ZVZhbHVlIHZhbHVlID0gKElDU1NQcmltaXRpdmVWYWx1ZSkgbm9kZTsKLQkJCWlmICh2YWx1ZS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VSSSkgewotCQkJCXZhbHVlLnNldFZhbHVlKHN0cmlwRnVuYyh0b0Fic29sdXRlKFVSTF9CRUdJTiArIHZhbHVlLmdldFN0cmluZ1ZhbHVlKCkgKyBVUkxfRU5EKSkpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTUGF0aFNlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NQYXRoU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTMyODE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NQYXRoU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NQYXRoU2VydmljZSB7Ci0KLQkvLyBDb25zdGFudHMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRVVSTFNDSEVNRSA9ICJmaWxlIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTENPTE9OID0gIjoiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVVUkxQUkVGSVggPSBGSUxFVVJMU0NIRU1FICsgVVJMQ09MT04gKyAiLy8iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMU0VQQVJBVE9SID0gIi8iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBYnNvbHV0ZVVSTChJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCwgU3RyaW5nIHJlZikgewotCQlTdHJpbmcgYWJzTGluayA9IFVSTE1vZGVsUHJvdmlkZXJDU1MucmVzb2x2ZVVSSShiYXNlTW9kZWwsIHJlZiwgdHJ1ZSk7Ci0JCVN0cmluZyB1cmwgPSBhYnNMaW5rOwotCQlpZiAoYWJzTGluayAhPSBudWxsKSB7IC8vIGlmIGl0IGhhcyBub3Qgc2NoZW1lLCB3ZSBtdXN0IGFkZCAiZmlsZSIKLQkJCQkJCQkJLy8gc2NoZW1lCi0JCQl0cnkgewotCQkJCW5ldyBqYXZhLm5ldC5VUkwoYWJzTGluayk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoYWJzTGluayk7Ci0JCQkJaWYgKHBhdGggIT0gbnVsbCkKLQkJCQkJdXJsID0gdG9VUkwocGF0aCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsZSBsb2NhdGlvbjJGaWxlKFN0cmluZyBsb2NhdGlvbikgewotCQlQYXRoIHBhdGggPSBuZXcgUGF0aChsb2NhdGlvbik7Ci0JCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCAmJiBwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkKLQkJCWZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCS8qKgotCSAqIEdldHMgYSBmaWxlIFVSTCBmb3IgdGhlIHBhdGguCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvVVJMKElQYXRoIHBhdGgpIHsKLQkJcGF0aCA9IG5ldyBQYXRoKHBhdGgudG9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlpZiAocGF0aC5pc1VOQygpID09IHRydWUpIHsKLQkJCS8vIGl0J3MgVU5DLiByZXR1cm4gZmlsZTovL2hvc3QvZm9vL2Jhci9iYXouaHRtbAotCQkJcmV0dXJuIEZJTEVVUkxTQ0hFTUUgKyBVUkxDT0xPTiArIHBhdGgudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gRklMRVVSTFBSRUZJWCArIFVSTFNFUEFSQVRPUiArIHBhdGgudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTU2VsZWN0b3JMaXN0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1NlbGVjdG9yTGlzdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJjN2I4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTU2VsZWN0b3JMaXN0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkNTU1NlbGVjdG9yTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIENTU1NlbGVjdG9yTGlzdEZhY3RvcnkgewotCXN0YXRpYyBzeW5jaHJvbml6ZWQgcHVibGljIENTU1NlbGVjdG9yTGlzdEZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENTU1NlbGVjdG9yTGlzdEZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBJQ1NTU2VsZWN0b3JMaXN0IGNyZWF0ZVNlbGVjdG9yTGlzdChTdHJpbmcgc2VsZWN0b3JTdHJpbmcpIHsKLQkJcmV0dXJuIG5ldyBDU1NTZWxlY3Rvckxpc3RJbXBsKHNlbGVjdG9yU3RyaW5nKTsKLQl9Ci0KLQotCXByaXZhdGUgQ1NTU2VsZWN0b3JMaXN0RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDU1NTZWxlY3Rvckxpc3RGYWN0b3J5IGZJbnN0YW5jZTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiOThhMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkNTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5IGV4dGVuZHMgQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnlDb250ZXh0IHsKLQotCXByaXZhdGUgc3RhdGljIENTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5IGZJbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTU3R5bGVEZWNsYXJhdGlvbgotCSAqIEBwYXJhbSBkZWNsCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTU3R5bGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBJQ1NTU3R5bGVEZWNsYXJhdGlvbiBjcmVhdGVTdHlsZURlY2xhcmF0aW9uKElDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKGRlY2wgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSUNTU1N0eWxlRGVjbGFyYXRpb24gbmV3Tm9kZSA9IGNyZWF0ZVN0eWxlRGVjbGFyYXRpb24oKTsKLQotCQlpZiAobmV3Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmT3duZXJEb2N1bWVudCA9IG5ld05vZGU7Ci0JCWNsb25lQ2hpbGROb2RlcyhkZWNsLCBuZXdOb2RlKTsKLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3YzFiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1JlZ2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBDU1NVdGlsIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWJ1Z091dChTdHJpbmcgc3RyKSB7Ci0JCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJjc3Mgd2FybmluZzogIiArIHN0cik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQkvLyBwdWJsaWMgc3RhdGljIFZlY3RvciBleHRyYWN0TWVkaWFDb250ZW50cyhWZWN0b3IgcmVnaW9ucykgewotCS8vIFZlY3RvciBtZWRpYSA9IG5ldyBWZWN0b3IoKTsKLQkvLyBpZiAocmVnaW9ucyA9PSBudWxsKSB7IHJldHVybiBtZWRpYTsgfQotCS8vCi0JLy8gYm9vbGVhbiBiUmVhZHkgPSB0cnVlOwotCS8vIGZvciAoSXRlcmF0b3IgaSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCS8vIElUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbilpLm5leHQoKTsKLQkvLyBpZiAocmVnaW9uID09IG51bGwpIHsgY29udGludWU7IH0KLQkvLyBTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JLy8gaWYgKGJSZWFkeSkgewotCS8vIGlmICh0eXBlID09IElERU5UKSB7Ci0JLy8gbWVkaWEuYWRkRWxlbWVudChyZWdpb24uZ2V0VGV4dCgpKTsKLQkvLyBiUmVhZHkgPSBmYWxzZTsKLQkvLyB9Ci0JLy8gfSBlbHNlIHsKLQkvLyBpZiAodHlwZSA9PSBDT01NQSkgewotCS8vIGJSZWFkeSA9IHRydWU7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLyByZXR1cm4gbWVkaWE7Ci0JLy8gfQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dHJhY3RTdHJpbmdDb250ZW50cyhTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gc3RyaXBRdW90ZXModGV4dCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0cmFjdFVyaUNvbnRlbnRzKFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyBjb250ZW50cyA9IHRleHQudHJpbSgpOwotCQlpZiAoY29udGVudHMudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJ1cmwoIikgJiYgLy8kTk9OLU5MUy0xJAotCQkJCQljb250ZW50cy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIpIikpIHsvLyROT04tTkxTLTEkCi0JCQkvLyBzdHJpcCAidXJsKCIsICIpIgotCQkJY29udGVudHMgPSBjb250ZW50cy5zdWJzdHJpbmcoNCwgY29udGVudHMubGVuZ3RoKCkgLSAxKTsKLQkJfQotCQljb250ZW50cyA9IHN0cmlwUXVvdGVzKGNvbnRlbnRzKTsKLQotCQlyZXR1cm4gY29udGVudHM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpbmROZXh0U2lnbmlmaWNhbnROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnROb2RlKSB7Ci0JCWlmIChzdGFydE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gc3RhcnROb2RlLmdldE5leHQoKTsKLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHR5cGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKG5vZGUpOwotCQkJaWYgKHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYgdHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCAmJiB0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DRE8gJiYgdHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RDKSB7Ci0JCQkJcmV0dXJuIG5vZGU7Ci0JCQl9Ci0JCQlub2RlID0gbm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpbmROb2RlQmFja3dhcmQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kTm9kZSwgU3RyaW5nIHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlOwotCQlmb3IgKG5vZGUgPSBzdGFydE5vZGU7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UHJldmlvdXMoKSkgewotCQkJaWYgKG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA8IGVuZE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCW5vZGUgPSBudWxsOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZiAoZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShub2RlKSA9PSB0eXBlKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpbmROb2RlRm9yd2FyZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmROb2RlLCBTdHJpbmcgdHlwZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGU7Ci0JCWZvciAobm9kZSA9IHN0YXJ0Tm9kZTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0KCkpIHsKLQkJCWlmIChlbmROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgPCBub2RlLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQlub2RlID0gbnVsbDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYgKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUobm9kZSkgPT0gdHlwZSkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kUHJldmlvdXNTaWduaWZpY2FudE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydE5vZGUpIHsKLQkJaWYgKHN0YXJ0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBzdGFydE5vZGUuZ2V0UHJldmlvdXMoKTsKLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHR5cGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKG5vZGUpOwotCQkJaWYgKHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYgdHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCAmJiB0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DRE8gJiYgdHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RDKSB7Ci0JCQkJcmV0dXJuIG5vZGU7Ci0JCQl9Ci0JCQlub2RlID0gbm9kZS5nZXRQcmV2aW91cygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsYXNzU3RyaW5nKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgbmFtZSA9IG9iamVjdC5nZXRDbGFzcygpLnRvU3RyaW5nKCk7Ci0JCQlpbnQgbGFzdFBlcmlvZCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJCXJldHVybiBuYW1lLnN1YnN0cmluZyhsYXN0UGVyaW9kICsgMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5ERUZJTkVEOwotCQl9Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5ERUZJTkVEOwotCQl9Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDApOwotCQlyZXR1cm4gcmVnaW9uLmdldFR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRMZW5ndGhEaWZmZXJlbmNlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld05vZGVzLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGROb2RlcykgewotCQlpbnQgbmV3TGVuID0gZ2V0VGV4dExlbmd0aChuZXdOb2Rlcyk7Ci0JCWludCBvbGRMZW4gPSBnZXRUZXh0TGVuZ3RoKG9sZE5vZGVzKTsKLQkJcmV0dXJuIG5ld0xlbiAtIG9sZExlbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWdpb25UZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChyZWdpb25zICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBpLm5leHQoKTsKLQkJCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWJ1Zi5hcHBlbmQoZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRUZXh0TGVuZ3RoKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5vZGVzKSB7Ci0JCWludCBsZW5ndGggPSAwOwotCi0JCWlmIChub2RlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKEVudW1lcmF0aW9uIGUgPSBub2Rlcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZS5uZXh0RWxlbWVudCgpOwotCQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCWxlbmd0aCArPSBmbGF0Tm9kZS5nZXRUZXh0KCkubGVuZ3RoKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVuZ3RoKENTU1RleHRUb2tlbiB0b2tlbikgewotCQlpZiAodG9rZW4gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHRva2VuLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAodG9rZW4ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQlkb3VibGUgbnVtYmVyID0gRG91YmxlLnBhcnNlRG91YmxlKHRva2VuLmltYWdlKTsKLQkJCWlmIChudW1iZXIgPT0gMC4wKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTZWxlY3RvclRleHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nIHR5cGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKHJlZ2lvbik7Ci0JCWlmIChDU1NSZWdpb25VdGlsLmlzU2VsZWN0b3JCZWdnaW5pbmdUeXBlKHR5cGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTktOT1dOKSB7Ci0JCQkvLyBTdHJpbmcgdGV4dCA9IGZsYXROb2RlLmdldFRleHQoKTsKLQkJCS8vIGlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5pbmRleE9mKCcuJykgPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCQkvLyB9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBRdW90ZXMoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgY29udGVudHMgPSB0ZXh0LnRyaW0oKTsKLQkJaWYgKDIgPD0gY29udGVudHMubGVuZ3RoKCkpIHsKLQkJCWNoYXIgZmlyc3QgPSBjb250ZW50cy5jaGFyQXQoMCk7Ci0JCQljaGFyIGxhc3QgPSBjb250ZW50cy5jaGFyQXQoY29udGVudHMubGVuZ3RoKCkgLSAxKTsKLQkJCWlmICgoZmlyc3QgPT0gJ1wiJyAmJiBsYXN0ID09ICdcIicpIHx8IChmaXJzdCA9PSAnXCcnICYmIGxhc3QgPT0gJ1wnJykpIHsKLQkJCQljb250ZW50cyA9IGNvbnRlbnRzLnN1YnN0cmluZygxLCBjb250ZW50cy5sZW5ndGgoKSAtIDEpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250ZW50czsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXRlY3RRdW90ZShTdHJpbmcgc291cmNlLCBTdHJpbmcgZGVmYXVsdFF1b3RlKSB7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBkZWZhdWx0UXVvdGU7Ci0JCWZpbmFsIFN0cmluZyBEX1FVT1RFID0gIlwiIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgU19RVU9URSA9ICJcJyI7IC8vJE5PTi1OTFMtMSQKLQotCQlpbnQgZEluZGV4ID0gc291cmNlLmluZGV4T2YoRF9RVU9URSk7Ci0JCWludCBzSW5kZXggPSBzb3VyY2UuaW5kZXhPZihTX1FVT1RFKTsKLQkJaWYgKGRJbmRleCA8IDAgJiYgc0luZGV4IDwgMCkgewotCQkJcmV0dXJuIGRlZmF1bHRRdW90ZTsKLQkJfQotCQllbHNlIGlmIChkSW5kZXggPCAwKSB7Ci0JCQlyZXR1cm4gRF9RVU9URTsKLQkJfQotCQllbHNlIGlmIChzSW5kZXggPCAwKSB7Ci0JCQlyZXR1cm4gU19RVU9URTsKLQkJfQotCQllbHNlIGlmIChkSW5kZXggPCBzSW5kZXgpIHsKLQkJCXJldHVybiBTX1FVT1RFOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIERfUVVPVEU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc3RyaXBTdXJyb3VuZGluZ1NwYWNlKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCWlmIChyZWdpb25zID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQl3aGlsZSAoIXJlZ2lvbnMuaXNFbXB0eSgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQlyZWdpb25zLnJlbW92ZSgwKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXdoaWxlICghcmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJcmVnaW9ucy5yZW1vdmUocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0ltcG9ydFJ1bGVDb2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9JbXBvcnRSdWxlQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYzkxNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0ltcG9ydFJ1bGVDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlU2hlZXQ7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFJ1bGVDb2xsZWN0b3IgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5BYnN0cmFjdENzc1RyYXZlcnNlciB7Ci0KLQlwcm90ZWN0ZWQgamF2YS51dGlsLlZlY3RvciBydWxlcyA9IG5ldyBWZWN0b3IoKTsKLQlwcm90ZWN0ZWQgSUNTU1N0eWxlU2hlZXQgdGFyZ2V0ID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJbXBvcnRSdWxlQ29sbGVjdG9yKCkgewotCQlzdXBlcigpOwotCQlzZXRUcmF2ZXJzZUltcG9ydGVkKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSW1wb3J0UnVsZUNvbGxlY3RvcihJQ1NTU3R5bGVTaGVldCBzaGVldCkgewotCQlzdXBlcigpOwotCQl0YXJnZXQgPSBzaGVldDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLlZlY3RvciBnZXRSdWxlcygpIHsKLQkJcmV0dXJuIHJ1bGVzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQVJVTEVfTk9ERSB8fCBub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVTSEVFVF9OT0RFKSB7Ci0JCQlyZXR1cm4gVFJBVl9DT05UOwotCQl9Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuSU1QT1JUUlVMRV9OT0RFKSB7Ci0JCQlpZiAodGFyZ2V0ICE9IG51bGwpIHsKLQkJCQlJQ1NTSW1wb3J0UnVsZSBpbXAgPSAoSUNTU0ltcG9ydFJ1bGUpIG5vZGU7Ci0JCQkJaWYgKGltcC5nZXRTdHlsZVNoZWV0KCkgIT0gdGFyZ2V0KQotCQkJCQlyZXR1cm4gVFJBVl9QUlVORTsKLQkJCX0KLQkJCWlmICghcnVsZXMuY29udGFpbnMobm9kZSkpCi0JCQkJcnVsZXMuYWRkKG5vZGUpOwotCQl9Ci0JCXJldHVybiBUUkFWX1BSVU5FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9JbXBvcnRlZENvbGxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0ltcG9ydGVkQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMmE3YWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0ltcG9ydGVkQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0ZWRDb2xsZWN0b3IgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5BYnN0cmFjdENzc1RyYXZlcnNlciB7Ci0KLQlwcm90ZWN0ZWQgamF2YS51dGlsLlZlY3RvciBleHRlcm5hbHMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSW1wb3J0ZWRDb2xsZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRyYXZlcnNlSW1wb3J0ZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIExpc3QgZ2V0RXh0ZXJuYWxzKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQVJVTEVfTk9ERSkgewotCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQkJfQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFU0hFRVRfTk9ERSkgewotCQkJaWYgKCFleHRlcm5hbHMuY29udGFpbnMobm9kZSkpIHsKLQkJCQlleHRlcm5hbHMuYWRkKG5vZGUpOwotCQkJfQotCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQkJfQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSkgewotCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQkJfQotCQlyZXR1cm4gVFJBVl9QUlVORTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvUmVnaW9uSXRlcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9SZWdpb25JdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGQwMDIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9SZWdpb25JdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWdpb25JdGVyYXRvciB7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJEb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgY3VycmVudCA9IC0xOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFJlZ2lvbkl0ZXJhdG9yKElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBpbnQgaW5kZXgpIHsKLQkJc3VwZXIoKTsKLQotCQlyZXNldChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUmVnaW9uSXRlcmF0b3IoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXJlc2V0KGZsYXROb2RlLCByZWdpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGN1ckRvY3VtZW50UmVnaW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCWlmIChkb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoY3VycmVudCA8IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChjdXJyZW50IDwgZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldigpIHsKLQkJLy8gdGhlIHNhbWUgYXMgaGFzTmV4dCgpCi0JCXJldHVybiBoYXNOZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIG5leHQoKSB7Ci0JCWlmIChkb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChjdXJyZW50IDwgMCB8fCBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkgPT0gbnVsbCB8fCBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpIDw9IGN1cnJlbnQpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KGN1cnJlbnQpOwotCQljdXJEb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uOwotCi0JCWlmIChjdXJyZW50ID49IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5zaXplKCkgLSAxKSB7Ci0JCQlkb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uLmdldE5leHQoKTsKLQkJCWN1cnJlbnQgPSAtMTsKLQkJfQotCQljdXJyZW50Kys7Ci0KLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gcHJldigpIHsKLQkJaWYgKGRvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGN1cnJlbnQgPCAwIHx8IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKSA9PSBudWxsIHx8IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5zaXplKCkgPD0gY3VycmVudCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoY3VycmVudCk7Ci0JCWN1ckRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb247Ci0KLQkJaWYgKGN1cnJlbnQgPT0gMCkgewotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXRQcmV2aW91cygpOwotCQkJaWYgKGRvY3VtZW50UmVnaW9uICE9IG51bGwpCi0JCQkJY3VycmVudCA9IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5zaXplKCk7Ci0JCQllbHNlCi0JCQkJY3VycmVudCA9IDA7Ci0JCX0KLQkJY3VycmVudC0tOwotCi0JCXJldHVybiByZWdpb247Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGludCBpbmRleCkgewotCQlkb2N1bWVudFJlZ2lvbiA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbmRleCk7Ci0JCWN1ckRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb247Ci0JCWlmIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbmRleCk7Ci0JCQljdXJyZW50ID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLmluZGV4T2YocmVnaW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpZiAocmVnaW9uICE9IG51bGwgJiYgZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJdGhpcy5kb2N1bWVudFJlZ2lvbiA9IGZsYXROb2RlOwotCQkJY3VyRG9jdW1lbnRSZWdpb24gPSBmbGF0Tm9kZTsKLQkJCWN1cnJlbnQgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuaW5kZXhPZihyZWdpb24pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1NlbGVjdGlvbkNvbGxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1NlbGVjdGlvbkNvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTQ0Y2E4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9TZWxlY3Rpb25Db2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uQ29sbGVjdG9yIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQWJzdHJhY3RDc3NUcmF2ZXJzZXIgewotCi0JaW50IHN0YXJ0LCBlbmQ7Ci0JTGlzdCBzZWxlY3RlZE5vZGVzOwotCi0JLyoqCi0JICogU2VsZWN0aW9uQ29sbGVjdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFNlbGVjdGlvbkNvbGxlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBiZWdpbihJQ1NTTm9kZSBub2RlKSB7Ci0JCXNlbGVjdGVkTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VsZWN0ZWROb2RlcygpIHsKLQkJaWYgKHNlbGVjdGVkTm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KHNlbGVjdGVkTm9kZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJSW5kZXhlZFJlZ2lvbiBpTm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA8PSBlbmQgJiYgc3RhcnQgPCBpTm9kZS5nZXRFbmRPZmZzZXQoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5TVFlMRVNIRUVUX05PREUpIHsKLQkJCQlJbmRleGVkUmVnaW9uIGlGaXJzdENoaWxkID0gKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCUluZGV4ZWRSZWdpb24gaUxhc3RDaGlsZCA9IChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpOwotCQkJCWlmIChpRmlyc3RDaGlsZCA9PSBudWxsIHx8IHN0YXJ0IDwgaUZpcnN0Q2hpbGQuZ2V0U3RhcnRPZmZzZXQoKSB8fCBpTGFzdENoaWxkLmdldEVuZE9mZnNldCgpIDw9IGVuZCkKLQkJCQkJc2VsZWN0ZWROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gVFJBVl9DT05UOwotCQl9Ci0JCWlmIChpTm9kZS5nZXRTdGFydE9mZnNldCgpID4gZW5kKQotCQkJcmV0dXJuIFRSQVZfU1RPUDsKLQkJZWxzZQotCQkJcmV0dXJuIFRSQVZfUFJVTkU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVnaW9uKGludCBuZXdTdGFydCwgaW50IG5ld0VuZCkgewotCQlzdGFydCA9IG5ld1N0YXJ0OwotCQllbmQgPSBuZXdFbmQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1NlbGVjdG9yVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvU2VsZWN0b3JWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ1MmUxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvU2VsZWN0b3JWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTU2VsZWN0b3JMaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2ltcGxlU2VsZWN0b3I7Ci0KLQotcHVibGljIGNsYXNzIFNlbGVjdG9yVmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBTZWxlY3RvclZhbGlkYXRvci4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0b3JWYWxpZGF0b3IoU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIoKTsKLQkJZlRleHQgPSB0ZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGV4dCBjb25zaXN0cyBvZiBvbmUgQ0xBU1Mgc2VsZWN0b3IuIHN5bnRheCBjaGVjawotCSAqIGlzIGEgbGl0dGxlIGxvb3NlICguMTIzIGlzIHBhc3NlZCkKLQkgKiAKLQkgKiAiLmNsYXNzIiAtPiB0cnVlICIuMTIzIiAtPiB0cnVlICIuY2xhc3MgLCAuY2xhc3MyIiAtPiBmYWxzZQotCSAqICIuY2xhc3MuY2xhc3MyIiAtPiBmYWxzZSAiLjEyM3t9IiAtPiBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xhc3MoKSB7Ci0JCUlDU1NTaW1wbGVTZWxlY3RvciBzZWxlY3RvciA9IGdldE9ubHlPbmVTaW1wbGVTZWxlY3RvcigpOwotCQlpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotCQkJcmV0dXJuIChzZWxlY3Rvci5nZXROYW1lKCkubGVuZ3RoKCkgPT0gMCAmJiBzZWxlY3Rvci5nZXROdW1PZkF0dHJpYnV0ZXMoKSA9PSAwICYmIHNlbGVjdG9yLmdldE51bU9mQ2xhc3NlcygpID09IDEgJiYgc2VsZWN0b3IuZ2V0TnVtT2ZJRHMoKSA9PSAwICYmIHNlbGVjdG9yLmdldE51bU9mUHNldWRvTmFtZXMoKSA9PSAwKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSB0ZXh0IGNvbnNpc3RzIG9mIG9uZSBJRCBzZWxlY3Rvci4KLQkgKiAKLQkgKiAiI0lEIiAtPiB0cnVlICJIMSNteUlEIiAtPiBmYWxzZSAiI2FiY3t9IiAtPiBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSUQoKSB7Ci0JCUlDU1NTaW1wbGVTZWxlY3RvciBzZWxlY3RvciA9IGdldE9ubHlPbmVTaW1wbGVTZWxlY3RvcigpOwotCQlpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotCQkJcmV0dXJuIChzZWxlY3Rvci5nZXROYW1lKCkubGVuZ3RoKCkgPT0gMCAmJiBzZWxlY3Rvci5nZXROdW1PZkF0dHJpYnV0ZXMoKSA9PSAwICYmIHNlbGVjdG9yLmdldE51bU9mQ2xhc3NlcygpID09IDAgJiYgc2VsZWN0b3IuZ2V0TnVtT2ZJRHMoKSA9PSAxICYmIHNlbGVjdG9yLmdldE51bU9mUHNldWRvTmFtZXMoKSA9PSAwKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogb3ZlcmFsbCBjaGVjawotCSAqIAotCSAqICJQI2hvZ2U5OCArICo6aG92ZXIgPiBBOmxpbmssIEEuZXh0ZXJuYWw6dmlzaXRlZCIgLT4gdHJ1ZSAiSDEgSDIge30iIC0+Ci0JICogZmFsc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlwYXJzZSgpOwotCQlyZXR1cm4gKGZTZWxlY3Rvckxpc3QgIT0gbnVsbCAmJiBmU2VsZWN0b3JMaXN0LmdldEVycm9yQ291bnQoKSA9PSAwKTsKLQl9Ci0KLQlwcml2YXRlIElDU1NTaW1wbGVTZWxlY3RvciBnZXRPbmx5T25lU2ltcGxlU2VsZWN0b3IoKSB7Ci0JCXBhcnNlKCk7Ci0JCWlmIChmU2VsZWN0b3JMaXN0ICE9IG51bGwgJiYgZlNlbGVjdG9yTGlzdC5nZXRMZW5ndGgoKSA9PSAxKSB7Ci0JCQlJQ1NTU2VsZWN0b3Igc2VsZWN0b3IgPSBmU2VsZWN0b3JMaXN0LmdldFNlbGVjdG9yKDApOwotCQkJaW50IG5JdGVtID0gc2VsZWN0b3IuZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAobkl0ZW0gPT0gMSkgewotCQkJCUlDU1NTZWxlY3Rvckl0ZW0gaXRlbSA9IHNlbGVjdG9yLmdldEl0ZW0oMCk7Ci0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBJQ1NTU2ltcGxlU2VsZWN0b3IpIHsKLQkJCQkJcmV0dXJuIChJQ1NTU2ltcGxlU2VsZWN0b3IpIGl0ZW07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZSgpIHsKLQkJaWYgKGZTZWxlY3Rvckxpc3QgPT0gbnVsbCkgewotCQkJaWYgKGZUZXh0ICE9IG51bGwpIHsKLQkJCQlmU2VsZWN0b3JMaXN0ID0gbmV3IENTU1NlbGVjdG9yTGlzdEltcGwoZlRleHQpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcml2YXRlIFN0cmluZyBmVGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBJQ1NTU2VsZWN0b3JMaXN0IGZTZWxlY3Rvckxpc3QgPSBudWxsOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1NlbGVjdG9yc0NvbGxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1NlbGVjdG9yc0NvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTkzZmY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9TZWxlY3RvcnNDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0b3JzQ29sbGVjdG9yIGV4dGVuZHMgQWJzdHJhY3RDc3NUcmF2ZXJzZXIgewotCi0JcHJvdGVjdGVkIFZlY3RvciBzZWxlY3RvcnMgPSBuZXcgVmVjdG9yKCk7Ci0JcHJvdGVjdGVkIFZlY3RvciBzZWxlY3RvcnNUb0F2b2lkID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTZWxlY3RvcnNDb2xsZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRyYXZlcnNlSW1wb3J0ZWQoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdG9yVG9Bdm9pZChJQ1NTU2VsZWN0b3Igc2VsVG9Bdm9pZCkgewotCQlpZiAoc2VsVG9Bdm9pZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoc2VsZWN0b3JzVG9Bdm9pZCA9PSBudWxsKQotCQkJc2VsZWN0b3JzVG9Bdm9pZCA9IG5ldyBWZWN0b3IoKTsKLQotCQlpZiAoIXNlbGVjdG9yc1RvQXZvaWQuY29udGFpbnMoc2VsVG9Bdm9pZCkpCi0JCQlzZWxlY3RvcnNUb0F2b2lkLmFkZChzZWxUb0F2b2lkKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3RvclRvQXZvaWQoSUNTU1N0eWxlUnVsZSBydWxlKSB7Ci0JCUlDU1NTZWxlY3Rvckxpc3QgbGlzdCA9IHJ1bGUuZ2V0U2VsZWN0b3JzKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gbGlzdC5nZXRJdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJQ1NTU2VsZWN0b3Igc2VsID0gKElDU1NTZWxlY3RvcikgaXQubmV4dCgpOwotCQkJYWRkU2VsZWN0b3JUb0F2b2lkKHNlbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0U2VsZWN0b3JzKCkgewotCQlyZXR1cm4gc2VsZWN0b3JzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRVJVTEVfTk9ERSkgewotCQkJSUNTU1N0eWxlUnVsZSBydWxlID0gKElDU1NTdHlsZVJ1bGUpIG5vZGU7Ci0JCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSBydWxlLmdldFNlbGVjdG9ycygpOwotCQkJSXRlcmF0b3IgaXQgPSBsaXN0LmdldEl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoc2VsZWN0b3JzVG9Bdm9pZCAhPSBudWxsICYmIHNlbGVjdG9yc1RvQXZvaWQuY29udGFpbnMob2JqKSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKCFzZWxlY3RvcnMuY29udGFpbnMob2JqKSkKLQkJCQkJc2VsZWN0b3JzLmFkZChvYmopOwotCQkJfQotCQkJcmV0dXJuIFRSQVZfUFJVTkU7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFU0hFRVRfTk9ERSkgewotCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQkJfQotCQlyZXR1cm4gVFJBVl9QUlVORTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RvcnNUb0F2b2lkKGphdmEudXRpbC5WZWN0b3IgbmV3U2VsZWN0b3JzVG9Bdm9pZCkgewotCQlzZWxlY3RvcnNUb0F2b2lkID0gbmV3U2VsZWN0b3JzVG9Bdm9pZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvVVJMSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvVVJMSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNWUxMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1VSTEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlBhdGhIZWxwZXI7Ci0KLS8qKgotICogSHlwZXJsaW5rIG1hbmFnZXIuIFByb3ZlZCB1c2VmdWwgc2VydmljZXMgbGlrZSBsaW5rIGNvbnZlcnNpb24gQW4gdXRpbGl0eQotICogY2xhc3MgdG8gaGVscCBvdGhlciBwYXJzcmUgbW9kdWxlcyB0byBjb252ZXJ0IGxpbmtzCi0gKi8KLXB1YmxpYyBjbGFzcyBVUkxIZWxwZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0xfU0VBUkNIX1NJRyA9ICJmaWxlOi8iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTF9TSUcgPSAiZmlsZTovLy8iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUkVMQVRJVkVfUEFUSF9TSUcgPSAiLi4iOy8vJE5PTi1OTFMtMSQJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUldBUkRfU0xBU0ggPSAiLyI7Ly8kTk9OLU5MUy0xJAkKLQlwcml2YXRlIFVSTCBmQmFzZVVybCA9IG51bGw7IC8vIGJhc2UgdXJsLiBhc3N1bWVkIHRvIGEgYWJzdWx1dGUgdXJsCi0JcHJpdmF0ZSBTdHJpbmcgZkJhc2VVcmxTdHJpbmcgPSBudWxsOwotCXByaXZhdGUgVVJMIGZEb2NSb290ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmRG9jUm9vdFN0cmluZyA9IG51bGw7Ci0KLQlwdWJsaWMgVVJMSGVscGVyKFN0cmluZyBiYXNlVXJsKSB7Ci0JCWluaXRpYWxpemUoYmFzZVVybCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIFVSTEhlbHBlcihTdHJpbmcgYmFzZVVybCwgU3RyaW5nIGRvY1Jvb3QpIHsKLQkJaW5pdGlhbGl6ZShiYXNlVXJsLCBkb2NSb290KTsKLQl9Ci0KLQkvKioKLQkgKiBTcGVjaWFsIGFkdWp1c3QgZm9yIGZpbGUgdXJsCi0JICovCi0JcHVibGljIFN0cmluZyBhZGp1c3RGaWxlUHJvdG9jb2xVcmwoU3RyaW5nIHVybCkgewotCQlpZiAodXJsLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTF9TRUFSQ0hfU0lHKSkgewotCQkJdXJsID0gRklMRV9QUk9UT0NPTF9TSUcgKyB1cmwuc3Vic3RyaW5nKEZJTEVfUFJPVE9DT0xfU0VBUkNIX1NJRy5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBjb252ZXJ0KFN0cmluZyB1cmwsIFVSTCBiYXNlVXJsLCBTdHJpbmcgdXJsU3RyaW5nKSB7Ci0JCVN0cmluZyBhYnNVcmwgPSB1cmw7Ci0JCWlmIChiYXNlVXJsICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJLy8gZG8gc3BlY2lhbCB0aGluZyBmaWxlIHByb3RvY29sCi0JCQkJaWYgKGJhc2VVcmwuZ2V0UHJvdG9jb2woKS5lcXVhbHNJZ25vcmVDYXNlKCJmaWxlIikpIHsvLyROT04tTkxTLTEkCi0JCQkJCS8vIHJlbW92ZSB0aGUgZmlzdAotCQkJCQlpZiAodXJsLnN0YXJ0c1dpdGgoIi8iKSkvLyROT04tTkxTLTEkCi0JCQkJCQl1cmwgPSB1cmwuc3Vic3RyaW5nKDEpOwotCQkJCQkvLyBlbXB0eSBzdHJpbmcgY2F1c2VzIG1hbGZvcm1lZCBleGNlcHRpb24KLQkJCQkJU3RyaW5nIHRlbXBVcmwgPSB1cmw7Ci0JCQkJCWlmICgiIi5lcXVhbHModXJsKSkvLyROT04tTkxTLTEkCi0JCQkJCQl0ZW1wVXJsID0gIiAiOy8vJE5PTi1OTFMtMSQKLQkJCQkJVVJMIG5ld1VybCA9IG5ldyBVUkwoYmFzZVVybCwgdGVtcFVybCk7Ci0JCQkJCS8vIGRvIGV4dHJhIG1hdGggZm9yIGZpbGUgcHJvdG9jb2wgdG8gc3VwcG9ydCBpZSBiYXNlZAotCQkJCQlhYnNVcmwgPSBhZGp1c3RGaWxlUHJvdG9jb2xVcmwobmV3VXJsLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJVVJMIG5ld1VybCA9IG5ldyBVUkwoZkJhc2VVcmwsIHVybCk7Ci0JCQkJCWFic1VybCA9IG5ld1VybC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWUpIHsKLQkJCX0KLQkJCS8vIGNvbnZlcnQgZXZlcnl0aGluZyB0byBmb3J3YXJkIHNsYXNoCi0JCQlhYnNVcmwgPSBQYXRoSGVscGVyLnN3aXRjaFRvRm9yd2FyZFNsYXNoZXMoYWJzVXJsKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHRoZSBnaXZlbiBtYXkgYmUgYmFzZWQgb24gZmlsZQotCQkJaWYgKHVybFN0cmluZyAhPSBudWxsKSB7Ci0JCQkJLy8gc3dpY2ggdGhlIHVybCB0byBwcm9wZXIgZGlyZWN0aW9uCi0JCQkJdXJsID0gUGF0aEhlbHBlci5yZW1vdmVMZWFkaW5nU2VwYXJhdG9yKHVybCk7Ci0JCQkJRmlsZSBmbGUgPSBuZXcgRmlsZSh1cmxTdHJpbmcsIHVybCk7Ci0JCQkJYWJzVXJsID0gZmxlLmdldFBhdGgoKTsKLQotCQkJfQotCQkJLy8gY29udmVydCBldmVyeXRoaW5nIHRvIGZvcndhcmQgc2xhc2gKLQkJCWFic1VybCA9IFBhdGhIZWxwZXIuc3dpdGNoVG9Gb3J3YXJkU2xhc2hlcyhhYnNVcmwpOwotCi0JCQkvLyBpZiB0aGUgcGF0aCBlbmRzIHdpdGggIi4uIiB3ZSBuZWVkIHRvIGFkZCBhIHRlcm1pbmF0aW5nIHNsYXNoCi0JCQkvLyBvcgotCQkJLy8gZWxzZSB0aGUgbGluayB3aWxsIG5vdCBiZSByZXNvbHZlZCBjb3JyZWN0bHkuIChpdCB3aWxsIGxvb2sKLQkJCS8vIGxpa2UKLQkJCS8vIC91cmwvcGF0aC90by9zb21ld2hlcmUvLi4gaW5zdGVhZCBvZiAvdXJsL3BhdGgvdG8vCi0JCQlpZiAoYWJzVXJsLmVuZHNXaXRoKEZPUldBUkRfU0xBU0ggKyBSRUxBVElWRV9QQVRIX1NJRykpIHsKLQkJCQlhYnNVcmwgKz0gRk9SV0FSRF9TTEFTSDsKLQkJCX0KLQkJfQotCi0JCS8vIHJlc29sdmUgcmVsYXRpdmUgcGF0aCB0byBhYnNvbHV0ZQotCQlhYnNVcmwgPSBQYXRoSGVscGVyLmFkanVzdFBhdGgoYWJzVXJsKTsKLQkJcmV0dXJuIGFic1VybDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShTdHJpbmcgYmFzZVVybCwgU3RyaW5nIGRvY1Jvb3QpIHsKLQkJLy8KLQkJLy8gRmluZCBvdXQgd2hldGhlciBiYWVzIHVybCBpcyBhIHVybCBvciBmaWxlIG5hbWUKLQkJLy8KLQkJdHJ5IHsKLQkJCVN0cmluZyB0ZW1wID0gUGF0aEhlbHBlci5hcHBlbmRUcmFpbGluZ1VSTFNsYXNoKGJhc2VVcmwpOwotCQkJZkJhc2VVcmwgPSBuZXcgVVJMKHRlbXApOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSB7Ci0JCX0KLQkJaWYgKGZCYXNlVXJsID09IG51bGwpIHsKLQkJCS8vIGl0IGlzIGEgZmlsZSBiYXNlZCB1cmwKLQkJCWZCYXNlVXJsU3RyaW5nID0gYmFzZVVybDsKLQkJfQotCi0JCS8vIGRvIHRoZSBzYW1lIGZvciBkb2Mgcm9vdAotCQlpZiAoZG9jUm9vdCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyB0ZW1wID0gUGF0aEhlbHBlci5hcHBlbmRUcmFpbGluZ1VSTFNsYXNoKGRvY1Jvb3QpOwotCQkJCWZEb2NSb290ID0gbmV3IFVSTCh0ZW1wKTsKLQotCQkJfQotCQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpIHsKLQkJCX0KLQkJCWlmIChmRG9jUm9vdCA9PSBudWxsKSB7Ci0JCQkJLy8gaXQgaXMgYSBmaWxlIGJhc2VkIHVybAotCQkJCWZEb2NSb290U3RyaW5nID0gZG9jUm9vdDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIGdpdmVuIHVybCB0byBhIGFib2x1dGUgdXJsIHVzaW5nIHRoZSBiYXNlIHVybCBJbnB1dCB1cmwgY2FuCi0JICogYmUgb2YgYW55IG90aGUgZm9sbG93aW5nIGZvcm1hdCBBYnNvbHV0ZSB1cmxzIC0tLS0tLS0tLS0tLS0tIC4KLQkgKiBodHRwOi8vd3d3LmZvby5jb20vIC4gaHR0cDovL3d3dy5mb28uY29tIC4gaHR0cDovL3d3dy5mb28uY29tL2ZvbGRlciAuCi0JICogaHR0cDovL3d3dy5mb28uY29tL2ZvbGRlci8gLiBodHRwOi8vd3d3LmZvby5jb20vaW5kZXguaHRtbCAuCi0JICogaHR0cDovL3d3dy5mb28uY29tL2ZvbGRlci9pbmRleC5odG1sIC4KLQkgKiBodHRwOi8vd3d3LmZvby5jb20vZm9sZGVyLy4uL2luZGV4Lmh0bWwgVXJsIHJlbGF0aXZlIG9uIGRvY3VtZW50IHJvb3QKLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC4gLyAuIC9mb2xkZXIgLiAvaW5kZXguaHRtbCAuCi0JICogL2ZvbGRlci9pbmRleC5odG1sIC4gL2ZvbGRlci8uLi9pbmRleC5odG1sCi0JICogCi0JICogU2VsZiByZWxhdGl2ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC4gaW5kZXguaHRtbCAuIC4vaW5kZXguaHRtbCAuCi0JICogLi4vaW5kZXguaHRtbCAuIGZvbGRlci9pbmRleC5odG1sIC4gZm9sZGVyLy4uL2luZGV4Lmh0bWwKLQkgKiAKLQkgKiBmaWxlIGJhc2VkIHVybCBhZGRzIGFub3RoZXIgZGltZW5zaW9uIHNpbmNlIGl0IGRvZXNuJ3QgaGF2ZSBhIGRvY3VtZW50Ci0JICogcm9vdCBTbyB1c2VzIGZEb2NSb290IGlmIHByb3ZpZGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b0Fic29sdXRlKFN0cmluZyB1cmwpIHsKLQkJU3RyaW5nIGFic1VybCA9IHVybDsKLQotCQlVUkwgbmV3VXJsID0gbnVsbDsKLQkJLy8gdHJ5IHRvIHNlZSBpdCBpcyBhIGFic29sdXRlIHVybAotCQl0cnkgewotCQkJbmV3VXJsID0gbmV3IFVSTCh1cmwpOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWUpIHsKLQkJfQotCQkvLyBpZiBkb2N1bWVudCByb290IGlzIHByb3ZpZGVkCi0JCS8vIGRvIHNwZWNpYWwgY2FzZQotCQlpZiAobmV3VXJsID09IG51bGwpIHsKLQkJCWlmIChmRG9jUm9vdCA9PSBudWxsICYmIGZEb2NSb290U3RyaW5nID09IG51bGwpIHsKLQkJCQkvLyB0cnkgdG8gY2hlY2sgcmVsYXRpdmUgdXJsCi0JCQkJYWJzVXJsID0gY29udmVydCh1cmwsIGZCYXNlVXJsLCBmQmFzZVVybFN0cmluZyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBkb2Mgcm9vdCBpcyBwcm92aWRlZAotCQkJCS8vIGlmIHRoZSB1cmwgaXMgYSBkb2Mgcm9vdCBiYXNlZCB1c2UgZG9jIHJvb3QKLQotCQkJCWlmICh1cmwuc3RhcnRzV2l0aCgiLyIpKS8vJE5PTi1OTFMtMSQKLQkJCQkJYWJzVXJsID0gY29udmVydCh1cmwsIGZEb2NSb290LCBmRG9jUm9vdFN0cmluZyk7Ci0JCQkJZWxzZQotCQkJCQlhYnNVcmwgPSBjb252ZXJ0KHVybCwgZkJhc2VVcmwsIGZCYXNlVXJsU3RyaW5nKTsKLQotCQkJfQotCQl9Ci0JCXJldHVybiBhYnNVcmw7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBmcm9tIGFuIGFic29sdXRlIHVybCB0byByZWxhdGl2ZSB1cmwgYmFzZWQgb24gdGhlIGdpdmVuIHVybAotCSAqIEJvdGggYXJlIGFzc3VtZWQgdG8gYmUgYWJsc3V0ZSB1cmwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvUmVsYXRpdmUoU3RyaW5nIHVybCwgU3RyaW5nIGRvY3VtZW50VXJsKSB7Ci0JCVN0cmluZyBvdXRwdXQgPSB1cmw7Ci0JCS8vIGFzc3VtaW5nIGJvdGggdXJscyBhcmUgYWJzb2x1dGUKLQkJdHJ5IHsKLQkJCVVSTCBpbnB1dFVybCA9IG5ldyBVUkwodXJsKTsKLQkJCVVSTCBkb2NVcmwgPSBuZXcgVVJMKGRvY3VtZW50VXJsKTsKLQkJCS8vIGZpbHRlciBvdXQgaWYgdGhlIHVybHMgYXJlIG5vdCBmcm8gdGhlIHNhbWUgZG9tYWluCi0JCQlpZiAoIWlucHV0VXJsLmdldFByb3RvY29sKCkuZXF1YWxzKGRvY1VybC5nZXRQcm90b2NvbCgpKSB8fCAhaW5wdXRVcmwuZ2V0SG9zdCgpLmVxdWFscyhkb2NVcmwuZ2V0SG9zdCgpKSB8fCBpbnB1dFVybC5nZXRQb3J0KCkgIT0gZG9jVXJsLmdldFBvcnQoKSkKLQkJCQlyZXR1cm4gb3V0cHV0OwotCQkJLy8gYm90aCB1cmwgYXJlIGNvbWluZyBmb3JtIHRoZSBzYW1lIHBsYWNlCi0JCQkvLyBzdHJpcCBvZmYgdGhlIGRvbWFpbiBwYXJ0cwotCQkJU3RyaW5nIGlucHV0TmFtZSA9IGlucHV0VXJsLmdldEZpbGUoKTsKLQkJCVN0cmluZyBkb2NOYW1lID0gZG9jVXJsLmdldEZpbGUoKTsKLQkJCW91dHB1dCA9IFBhdGhIZWxwZXIuY29udmVydFRvUmVsYXRpdmUoaW5wdXROYW1lLCBkb2NOYW1lKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1lKSB7Ci0JCQlvdXRwdXQgPSBudWxsOwotCQl9Ci0JCXJldHVybiBvdXRwdXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1VSTE1vZGVsUHJvdmlkZXJDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9VUkxNb2RlbFByb3ZpZGVyQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMTgwZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1VSTE1vZGVsUHJvdmlkZXJDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUFscmVhZHlFeGlzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VJblVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5QYXRoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlByb2plY3RSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBVUkxNb2RlbFByb3ZpZGVyQ1NTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfTU9ERUxfRk9SX1JFQUQgPSAxOwotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfTkVXX01PREVMX0ZPUl9SRUFEID0gMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX01PREVMX0ZPUl9FRElUID0gMzsKLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX05FV19NT0RFTF9GT1JfRURJVCA9IDQ7Ci0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQURfQlVGRkVSX1NJWkUgPSA0MDk2OwotCS8vIElNb2RlbE1hbmFnZXIKLQlwcml2YXRlIElNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBVUkxNb2RlbFByb3ZpZGVyQ1NTKCkgewotCQlzdXBlcigpOwotCi0JCS8vIG9idGFpbiBtb2RlbCBtYW5hZ2VyCi0JCW1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIElEIGZyb20gYSBmaWxlbmFtZS4gVGhpcyBtdXN0IGJlIHNhbWUgYXMKLQkgKiBGaWxlTW9kZWxQcm92aWRlci5jYWxjdWxhdGVJZChJRmlsZSkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2FsY3VsYXRlSWQoSVBhdGggZnVsbElQYXRoKSB7Ci0JCXJldHVybiBmdWxsSVBhdGgudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5iYXNlTW9kZWw8L2NvZGU+OiB0aGUgbW9kZWwgY29udGFpbmluZyB0aGUgbGluawotCSAqIDxjb2RlPnJlZjwvY29kZT46IHRoZSBsaW5rIFVSTCBzdHJpbmcKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0Q29tbW9uTW9kZWxGb3IoZmluYWwgSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwsIGZpbmFsIFN0cmluZyByZWYsIGZpbmFsIGludCB3aGljaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gZmlyc3QsIGNyZWF0ZSBhYnNvbHV0ZSB1cmwKLQkJU3RyaW5nIGFic1VSTCA9IHJlc29sdmVVUkkoYmFzZU1vZGVsLCByZWYsIHRydWUpOwotCQlpZiAoKGFic1VSTCA9PSBudWxsKSB8fCAoYWJzVVJMLmxlbmd0aCgpID09IDApKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIG5lZWQgdG8gcmVtb3ZlIGZpbGU6Ly8gc2NoZW1lIGlmIG5lY2Vzc2FyeQotCQl0cnkgewotCQkJZmluYWwgVVJMIGFVUkwgPSBuZXcgVVJMKGFic1VSTCk7Ci0JCQkvLyBBbiBhY3R1YWwgVVJMIHdhcyBnaXZlbiwgb25seSBmaWxlOi8vLyBpcyBzdXBwb3J0ZWQKLQkJCS8vIHJlc29sdmUgaXQgYnkgZmluZGluZyB0aGUgZmlsZSBpdCBwb2ludHMgdG8KLQkJCWlmICghYVVSTC5nZXRQcm90b2NvbCgpLmVxdWFscygicGxhdGZvcm0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGFVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSAmJiAoYVVSTC5nZXRIb3N0KCkuZXF1YWxzKCJsb2NhbGhvc3QiKSB8fCBhVVJMLmdldEhvc3QoKS5sZW5ndGgoKSA9PSAwKSkgeyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQlhYnNVUkwgPSBhVVJMLmdldEZpbGUoKTsKLQkJCQkJZmluYWwgSVBhdGggaXBhdGggPSBuZXcgUGF0aChhYnNVUkwpOwotCQkJCQkvLyBpZiBwYXRoIGhhcyBhIGRldmljZSwgYW5kIGlmIGl0IGJlZ2lucyB3aXRoCi0JCQkJCS8vIElQYXRoLlNFUEFSQVRPUiwgcmVtb3ZlIGl0Ci0JCQkJCWZpbmFsIFN0cmluZyBkZXZpY2UgPSBpcGF0aC5nZXREZXZpY2UoKTsKLQkJCQkJaWYgKChkZXZpY2UgIT0gbnVsbCkgJiYgKGRldmljZS5sZW5ndGgoKSA+IDApKSB7Ci0JCQkJCQlpZiAoZGV2aWNlLmNoYXJBdCgwKSA9PSBJUGF0aC5TRVBBUkFUT1IpIHsKLQkJCQkJCQlmaW5hbCBTdHJpbmcgbmV3RGV2aWNlID0gZGV2aWNlLnN1YnN0cmluZygxKTsKLQkJCQkJCQlhYnNVUkwgPSBpcGF0aC5zZXREZXZpY2UobmV3RGV2aWNlKS50b1N0cmluZygpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtZnVFeGMpIHsKLQkJfQotCi0JCS8vIG5leHQsIGRlY2lkZSBwcm9qZWN0Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlmaW5hbCBJUGF0aCBmdWxsSVBhdGggPSBuZXcgUGF0aChhYnNVUkwpOwotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IHdvcmtzcGFjZS5nZXRDb250YWluZXJGb3JMb2NhdGlvbihmdWxsSVBhdGgpOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCS8vIGZ1bGxJUGF0aCBkb2Vzbid0IGV4aXN0IGluIHdvcmtzcGFjZQotCQkJcHJvamVjdCA9IGNvbnRhaW5lci5nZXRQcm9qZWN0KCk7Ci0JCX0KLQotCQkvLyBJZiBIVE1MIGRvY3VtZW50IGhhcyBhIGxpbmsgdG8gYW4gZXh0ZXJuIENTUyB3aGljaCBpcyBub3QgaW4KLQkJLy8gSVByb2plY3QKLQkJLy8gd29ya3NwYWNlLmdldENvbnRhaW5lckZvckxvYXRpb24oKSBtYXkgcmV0dXJuIG51bGwuIFdlIG5lZWQgdG8gdGFrZQotCQkvLyBjYXJlCi0JCS8vIG9mIHRoaXMgY2FzZQotCi0JCS8vIG5vdywgZ2V0IGFic1VSTCdzIElGaWxlCi0JCWlmICgocHJvamVjdCAhPSBudWxsKSAmJiAocHJvamVjdC5nZXRMb2NhdGlvbigpLmlzUHJlZml4T2YoZnVsbElQYXRoKSA9PSBmYWxzZSkpIHsKLQkJCS8vIGl0J3MgYXQgb3V0c2lkZSBvZiBQcm9qZWN0Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJUGF0aCBmaWxlUGF0aCA9IGZ1bGxJUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHByb2plY3QuZ2V0TG9jYXRpb24oKS5zZWdtZW50Q291bnQoKSk7Ci0JCQlJRmlsZSBmaWxlID0gKGZpbGVQYXRoICE9IG51bGwgJiYgIWZpbGVQYXRoLmlzRW1wdHkoKSkgPyBwcm9qZWN0LmdldEZpbGUoZmlsZVBhdGgpIDogbnVsbDsKLQkJCWlmIChmaWxlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gb2J0YWluIG1vZGVsCi0JCQlpZiAod2hpY2ggPT0gR0VUX01PREVMX0ZPUl9FRElUKSB7Ci0JCQkJbW9kZWwgPSBnZXRNb2RlbEZvckVkaXQoZmlsZSk7Ci0JCQl9Ci0JCQllbHNlIGlmICh3aGljaCA9PSBHRVRfTU9ERUxfRk9SX1JFQUQpIHsKLQkJCQltb2RlbCA9IGdldE1vZGVsRm9yUmVhZChmaWxlKTsKLQkJCX0KLQotCQkJLy8gc2V0dGluZyBzeW5jaHJvbml6YXRpb24gc3RhbXAgaXMgSU1vZGVsTWFuYWdlcidzIGNsaWVudCdzCi0JCQkvLyByZXNwb25zaWJpbGl0eQotCQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuZ2V0U3luY2hyb25pemF0aW9uU3RhbXAoKSA9PSBJUmVzb3VyY2UuTlVMTF9TVEFNUCkKLQkJCQltb2RlbC5yZXNldFN5bmNocm9uaXphdGlvblN0YW1wKGZpbGUpOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIGlkID0gbnVsbDsKLQkJCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKLQkJCS8vIG9idGFpbiByZXNvbHZlcgotCQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSAocHJvamVjdCAhPSBudWxsKSA/IChVUklSZXNvbHZlcikgcHJvamVjdC5nZXRBZGFwdGVyKFVSSVJlc29sdmVyLmNsYXNzKSA6IG51bGw7Ci0JCQlpZiAocmVzb2x2ZXIgPT0gbnVsbCkgewotCQkJCS8vIFByb2plY3RSZXNvbHZlciBjYW4gdGFrZSBjYXJlIG9mIHRoZSBjYXNlIGlmIHByb2plY3QgaXMKLQkJCQkvLyBudWxsLgotCQkJCXJlc29sdmVyID0gbmV3IFByb2plY3RSZXNvbHZlcihwcm9qZWN0KTsKLQkJCX0KLQkJCWlmIChyZXNvbHZlciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCS8vIHRoZXJlIGlzIG5vIHByb2plY3QuIHdlIGNhbid0IGV4cGVjdCBJUHJvamVjdCBoZWxwIHRvIGNyZWF0ZQotCQkJLy8gaWQvaW5wdXRTdHJlYW0KLQkJCUZpbGUgZmlsZSA9IGZ1bGxJUGF0aC50b0ZpbGUoKTsKLQotCQkJLy8gb2JhdGluIGlkCi0JCQlpZCA9IGNhbGN1bGF0ZUlkKGZ1bGxJUGF0aCk7Ci0KLQkJCS8vIG9idGFpbiBJbnB1dFN0cmVhbQotCQkJdHJ5IHsKLQkJCQlpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQl9Ci0JCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKLQkJCQkvLyB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgb3Igd2UgZG9uJ3QgaGF2ZSByZWFkIHBlcm1pc3Npb24KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gb2J0YWluIG1vZGVsCi0JCQl0cnkgewotCQkJCWlmICh3aGljaCA9PSBHRVRfTU9ERUxfRk9SX0VESVQpIHsKLQkJCQkJbW9kZWwgPSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoaWQsIGluU3RyZWFtLCByZXNvbHZlcik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHdoaWNoID09IEdFVF9NT0RFTF9GT1JfUkVBRCkgewotCQkJCQltb2RlbCA9IGdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChpZCwgaW5TdHJlYW0sIHJlc29sdmVyKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZSkgewotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJLy8gY2xvc2Ugbm93ICEKLQkJCQlpZiAoaW5TdHJlYW0gIT0gbnVsbCkgewotCQkJCQlpblN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHNldCBsb2NhdGlvbmlkCi0JCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmdldEJhc2VMb2NhdGlvbigpID09IG51bGwpIHsKLQkJCW1vZGVsLnNldEJhc2VMb2NhdGlvbihmdWxsSVBhdGgudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+YmFzZU1vZGVsPC9jb2RlPjogdGhlIG1vZGVsIGNvbnRhaW5pbmcgdGhlIGxpbmsKLQkgKiA8Y29kZT5yZWY8L2NvZGU+OiB0aGUgbGluayBVUkwgc3RyaW5nCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsLCBTdHJpbmcgcmVmKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0Q29tbW9uTW9kZWxGb3IoYmFzZU1vZGVsLCByZWYsIEdFVF9NT0RFTF9GT1JfRURJVCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbWFuYWdlciA9IGdldE1vZGVsTWFuYWdlcigpOwotCi0JCS8vIGNyZWF0ZSBhIGZha2UgSW5wdXRTdHJlYW0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JFZGl0KGZpbGUpOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZXgpIHsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yRWRpdChmaWxlLCBFbmNvZGluZ1J1bGUuRk9SQ0VfREVGQVVMVCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmJhc2VNb2RlbDwvY29kZT46IHRoZSBtb2RlbCBjb250YWluaW5nIHRoZSBsaW5rCi0JICogPGNvZGU+cmVmPC9jb2RlPjogdGhlIGxpbmsgVVJMIHN0cmluZwotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCwgU3RyaW5nIHJlZikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldENvbW1vbk1vZGVsRm9yKGJhc2VNb2RlbCwgcmVmLCBHRVRfTU9ERUxfRk9SX1JFQUQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSUZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNb2RlbE1hbmFnZXIoKTsKLQotCQkvLyBjcmVhdGUgYSBmYWtlIElucHV0U3RyZWFtCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChmaWxlKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQl0cnkgewotCQkJCW1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvclJlYWQoZmlsZSwgRW5jb2RpbmdSdWxlLkZPUkNFX0RFRkFVTFQpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElNb2RlbE1hbmFnZXIgZ2V0TW9kZWxNYW5hZ2VyKCkgewotCQlyZXR1cm4gbW9kZWxNYW5hZ2VyOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE5ld01vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSkgewotCQlpZiAoaUZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNb2RlbE1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE5ld01vZGVsRm9yRWRpdChpRmlsZSwgZmFsc2UpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWNhdGNoIChSZXNvdXJjZUluVXNlIHJpdSkgewotCQl9Ci0JCWNhdGNoIChSZXNvdXJjZUFscmVhZHlFeGlzdHMgcmFlKSB7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TmV3TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlKSB7Ci0JCWlmIChpRmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbWFuYWdlciA9IGdldE1vZGVsTWFuYWdlcigpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IG1hbmFnZXIuZ2V0TmV3TW9kZWxGb3JFZGl0KGlGaWxlLCBmYWxzZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJY2F0Y2ggKFJlc291cmNlSW5Vc2Ugcml1KSB7Ci0JCX0KLQkJY2F0Y2ggKFJlc291cmNlQWxyZWFkeUV4aXN0cyByYWUpIHsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5iYXNlTW9kZWw8L2NvZGU+OiB0aGUgbW9kZWwgY29udGFpbmluZyB0aGUgbGluawotCSAqIDxjb2RlPnJlZjwvY29kZT46IHRoZSBsaW5rIFVSTCBzdHJpbmcKLQkgKiA8Y29kZT5yZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3M8L2NvZGU+OiBJZiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MKLQkgKiBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHByb3Blcmx5IHJlc29sdmUgdGhlIFVSSSBpZiBpdCBpcwotCSAqIGEgdmFsaWQgVVJJIHBvaW50aW5nIHRvIGFub3RoZXIgKGFwcHJvcHJpYXRlKSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVVUkkoSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwsIFN0cmluZyByZWYsIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7Ci0JCWlmIChiYXNlTW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGdldCByZXNvbHZlciBpbiBNb2RlbAotCQlmaW5hbCBVUklSZXNvbHZlciByZXNvbHZlciA9IGJhc2VNb2RlbC5nZXRSZXNvbHZlcigpOwotCi0JCS8vIHJlc29sdmUgdG8gYWJzb2x1dGUgdXJsCi0JCWZpbmFsIFN0cmluZyBhYnN1cmwgPSAocmVzb2x2ZXIgIT0gbnVsbCkgPyByZXNvbHZlci5nZXRMb2NhdGlvbkJ5VVJJKHJlZiwgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSA6IG51bGw7Ci0JCWlmICgocmVzb2x2ZXIgIT0gbnVsbCkgJiYgKGFic3VybCA9PSBudWxsKSAmJiAocmVmICE9IG51bGwpICYmIChyZWYudHJpbSgpLmxlbmd0aCgpID4gMCkgJiYgKHJlZi50cmltKCkuY2hhckF0KDApID09ICcvJykpIHsKLQkJCS8vIHRvIHJlYWNoIGhlcmUgbWVhbnMgOgotCQkJLy8gcmVmIGlzIGEgRG9jcm9vdCByZWxhdGl2ZQotCQkJLy8gcmVzb2x2ZXIgY2FuJ3QgcmVzb2x2ZSByZWYKLQkJCS8vIHNvIHRoYXQgaHJlZiBpcyBhIGJyb2tlbiBhbmQgc2hvdWxkIG5vdCBjcmVhdGUgbW9kZWwKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICgoYWJzdXJsICE9IG51bGwpICYmIChhYnN1cmwubGVuZ3RoKCkgPiAwKSkgewotCQkJcmV0dXJuIGFic3VybDsKLQkJfQotCi0JCS8vIG1heWJlIHJlZiBpcyBhdCBvdXRzaWRlIG9mIHRoZSBQcm9qZWN0Ci0JCS8vIG9idGFpbiBkb2Nyb290OwotCQlmaW5hbCBJQ29udGFpbmVyIGNvbnRhaW5lciA9IChyZXNvbHZlciAhPSBudWxsKSA/IHJlc29sdmVyLmdldFJvb3RMb2NhdGlvbigpIDogbnVsbDsKLQkJU3RyaW5nIGRvY3Jvb3QgPSBudWxsOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCWRvY3Jvb3QgPSBjb250YWluZXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQl9Ci0JCWlmIChkb2Nyb290ID09IG51bGwpIHsKLQkJCWRvY3Jvb3QgPSBiYXNlTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCX0KLQkJaWYgKGRvY3Jvb3QgPT0gbnVsbCkgewotCQkJLy8gc2hvdWxkIG5vdCBiZQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBvYnRhaW4gZG9jdW1lbnQgdXJsCi0JCVN0cmluZyBtb2RlbEJhc2VMb2NhdGlvbiA9IGJhc2VNb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJaWYgKChtb2RlbEJhc2VMb2NhdGlvbiA9PSBudWxsKSB8fCAobW9kZWxCYXNlTG9jYXRpb24ubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGZhbGxiYWNrLi4uCi0JCQltb2RlbEJhc2VMb2NhdGlvbiA9IGJhc2VNb2RlbC5nZXRJZCgpOwotCQl9Ci0JCWlmICgobW9kZWxCYXNlTG9jYXRpb24gPT0gbnVsbCkgfHwgKG1vZGVsQmFzZUxvY2F0aW9uLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBpIGNhbid0IHJlc29sdmUgdXJpICEKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gcmVzb2x2ZSB1cmwKLQkJVVJMSGVscGVyIGhlbHBlciA9IG5ldyBVUkxIZWxwZXIoUGF0aEhlbHBlci5nZXRDb250YWluaW5nRm9sZGVyUGF0aChtb2RlbEJhc2VMb2NhdGlvbiksIFBhdGhIZWxwZXIuZ2V0Q29udGFpbmluZ0ZvbGRlclBhdGgoUGF0aEhlbHBlci5hcHBlbmRUcmFpbGluZ1VSTFNsYXNoKGRvY3Jvb3QpKSk7Ci0JCXJldHVybiBoZWxwZXIudG9BYnNvbHV0ZShyZWYpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JhY2tncm91bmRQb3NpdGlvblhTdWJTdHlsZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9CYWNrZ3JvdW5kUG9zaXRpb25YU3ViU3R5bGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ODAxM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JhY2tncm91bmRQb3NpdGlvblhTdWJTdHlsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5JVmFsSUQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVN1YlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NWYWx1ZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZTsKLQotCi0vKioKLSAqIGZvciBob3Jpem9udGFsIHZhbHVlIG9mICdiYWNrZ3JvdW5kLXBvc2l0aW9uJwotICovCi1wdWJsaWMgY2xhc3MgQmFja2dyb3VuZFBvc2l0aW9uWFN1YlN0eWxlQWRhcHRlciBpbXBsZW1lbnRzIElTdWJQcm9wZXJ0eUFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJhY2tncm91bmRQb3NpdGlvblhTdWJTdHlsZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIENTU1RleHRUb2tlbltdIGNvcnJlY3RNZWFuaW5nVG9rZW4oQ1NTVGV4dFRva2VuW10gc3JjKSB7Ci0JCWphdmEudXRpbC5BcnJheUxpc3QgbGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3JjLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoc3JjW2ldLmtpbmQgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYgc3JjW2ldLmtpbmQgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MgJiYgc3JjW2ldLmtpbmQgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpCi0JCQkJbGlzdC5hZGQoc3JjW2ldKTsKLQkJfQotCQlDU1NUZXh0VG9rZW5bXSByZXQgPSBuZXcgQ1NTVGV4dFRva2VuW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJU3RyaW5nIHN0ciA9IG51bGw7Ci0JCU9iamVjdCBvYmogPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUE9TSVRJT04pKTsKLQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wWCA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKTsKLQkJCVByb3BDTVByb3BlcnR5IHByb3BZID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElDU1NWYWx1ZUxpc3QpIHsKLQkJCQlJQ1NTVmFsdWVMaXN0IGxpc3QgPSAoSUNTU1ZhbHVlTGlzdCkgb2JqOwotCQkJCUlDU1NWYWx1ZSB2YWx1ZSA9IChJQ1NTVmFsdWUpIGxpc3QuaXRlbSgwKTsKLQkJCQlpZiAodmFsdWUuZ2V0Q3NzVmFsdWVUeXBlKCkgPT0gQ1NTVmFsdWUuQ1NTX1BSSU1JVElWRV9WQUxVRSkgewotCQkJCQlJQ1NTUHJpbWl0aXZlVmFsdWUgcHJpbSA9IChJQ1NTUHJpbWl0aXZlVmFsdWUpIHZhbHVlOwotCQkJCQlpZiAocHJpbS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lERU5UKSB7Ci0JCQkJCQkvLyBjaGVjayBub3QgdG9wIG9yIGJvdHRvbQotCQkJCQkJaWYgKCFwcm9wWC5jYW5IYXZlKHByaW0uZ2V0U3RyaW5nVmFsdWUoKSkgJiYgcHJvcFkuY2FuSGF2ZShwcmltLmdldFN0cmluZ1ZhbHVlKCkpKSB7Ci0JCQkJCQkJLy8gY2FzZSBvcmRlciBpcyB2ZXJ0aWNhbCAtPiBob3Jpem9udGFsCi0JCQkJCQkJdmFsdWUgPSAoSUNTU1ZhbHVlKSBsaXN0Lml0ZW0oMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc3RyID0gdmFsdWUuZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWUpIHsKLQkJCQlzdHIgPSAoKElDU1NWYWx1ZSkgb2JqKS5nZXRDU1NWYWx1ZVRleHQoKTsKLQkJCQlpZiAoc3RyLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfQk9UVE9NKSB8fCBzdHIuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9UT1ApKQotCQkJCQlzdHIgPSAiIjsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdHIgPSBvYmoudG9TdHJpbmcoKTsKLQkJCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc3RyKTsKLQkJCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0KLQkJCQl0b2tlbnMgPSBjb3JyZWN0TWVhbmluZ1Rva2VuKHRva2Vucyk7Ci0JCQkJaWYgKHRva2Vucy5sZW5ndGggPT0gMCkKLQkJCQkJc3RyID0gIiI7Ly8kTk9OLU5MUy0xJAotCQkJCWVsc2UgaWYgKHRva2Vucy5sZW5ndGggPT0gMSAmJiAodG9rZW5zWzBdLmltYWdlLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfQk9UVE9NKSB8fCB0b2tlbnNbMF0uaW1hZ2UuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9UT1ApKSkKLQkJCQkJc3RyID0gIiI7Ly8kTk9OLU5MUy0xJAotCQkJCWVsc2UKLQkJCQkJc3RyID0gdG9rZW5zWzBdLmltYWdlOwotCQkJfQotCQl9Ci0JCXJldHVybiAoc3RyICE9IG51bGwpID8gc3RyIDogIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG5ld1ZhbHVlID0gbnVsbDsKLQkJU3RyaW5nIHZhbEggPSB2YWx1ZTsKLQkJU3RyaW5nIHZhbFYgPSBwcm9wZXJ0aWVzLmdldEJhY2tncm91bmRQb3NpdGlvblkoKTsKLQkJaWYgKHZhbFYgPT0gbnVsbCB8fCB2YWxWLmxlbmd0aCgpID09IDApCi0JCQluZXdWYWx1ZSA9IHZhbEg7Ci0JCWVsc2UgaWYgKHZhbEggPT0gbnVsbCB8fCB2YWxILmxlbmd0aCgpID09IDApIHsKLQkJCUNvbGxlY3Rpb24gdmFsWCA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKS5nZXRWYWx1ZXMoKTsKLQkJCUNvbGxlY3Rpb24gdmFsWSA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKS5nZXRWYWx1ZXMoKTsKLQkJCVByb3BDTVV0aWwubWludXModmFsWSwgdmFsWCk7Ci0JCQlJdGVyYXRvciBpdCA9IHZhbFkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJCWlmIChvYmoudG9TdHJpbmcoKS5lcXVhbHModmFsVi50b0xvd2VyQ2FzZSgpKSkgewotCQkJCQkvLyBuZWVkIG5vdCBjb21wZW5zYXRlIGZvciAuLi4KLQkJCQkJbmV3VmFsdWUgPSB2YWxWOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBjb21wZW5zYXRlIGZvciBIb3Jpem9udGFsIHZhbHVlCi0JCQlpZiAobmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCS8vIGNoZWNrIHZhbFYgaXMgbGVuZ3RoIG9yIG5vdAotCQkJCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCB2YWxWLnRyaW0oKSk7Ci0JCQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQkJCWlmICh0b2tlbnMgIT0gbnVsbCAmJiB0b2tlbnMubGVuZ3RoID4gMCAmJiB0b2tlbnNbMF0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQkJbmV3VmFsdWUgPSBJVmFsSUQuVl9MRUZUICsgIiAiICsgdmFsVjsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWVsc2UKLQkJCQkJbmV3VmFsdWUgPSAiMCUgIiArIHZhbFY7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCW5ld1ZhbHVlID0gdmFsSCArICIgIiArIHZhbFY7Ly8kTk9OLU5MUy0xJAotCQlwcm9wZXJ0aWVzLnNldEJhY2tncm91bmRQb3NpdGlvbihuZXdWYWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JhY2tncm91bmRQb3NpdGlvbllTdWJTdHlsZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9CYWNrZ3JvdW5kUG9zaXRpb25ZU3ViU3R5bGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0OGRmOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JhY2tncm91bmRQb3NpdGlvbllTdWJTdHlsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5JVmFsSUQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVN1YlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NWYWx1ZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZTsKLQotCi0vKioKLSAqIGZvciB2ZXJ0aWNhbCB2YWx1ZSBvZiAnYmFja2dyb3VuZC1wb3NpdGlvbicKLSAqLwotcHVibGljIGNsYXNzIEJhY2tncm91bmRQb3NpdGlvbllTdWJTdHlsZUFkYXB0ZXIgaW1wbGVtZW50cyBJU3ViUHJvcGVydHlBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCYWNrZ3JvdW5kUG9zaXRpb25ZU3ViU3R5bGVBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBDU1NUZXh0VG9rZW5bXSBjb3JyZWN0TWVhbmluZ1Rva2VuKENTU1RleHRUb2tlbltdIHNyYykgewotCQlqYXZhLnV0aWwuQXJyYXlMaXN0IGxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNyYy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHNyY1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIHNyY1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TICYmIHNyY1tpXS5raW5kICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCWxpc3QuYWRkKHNyY1tpXSk7Ci0JCX0KLQkJQ1NTVGV4dFRva2VuW10gcmV0ID0gbmV3IENTU1RleHRUb2tlbltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShyZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCVN0cmluZyBzdHIgPSBudWxsOwotCQlPYmplY3Qgb2JqID0gcHJvcGVydGllcy5nZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1BPU0lUSU9OKSk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJUHJvcENNUHJvcGVydHkgcHJvcFggPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCk7Ci0JCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wWSA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWVMaXN0KSB7Ci0JCQkJSUNTU1ZhbHVlTGlzdCBsaXN0ID0gKElDU1NWYWx1ZUxpc3QpIG9iajsKLQkJCQlpbnQgaW5kZXggPSAxOwotCQkJCUlDU1NWYWx1ZSB2YWx1ZSA9IChJQ1NTVmFsdWUpIGxpc3QuaXRlbSgwKTsKLQkJCQlpZiAodmFsdWUuZ2V0Q3NzVmFsdWVUeXBlKCkgPT0gQ1NTVmFsdWUuQ1NTX1BSSU1JVElWRV9WQUxVRSkgewotCQkJCQlJQ1NTUHJpbWl0aXZlVmFsdWUgcHJpbSA9IChJQ1NTUHJpbWl0aXZlVmFsdWUpIHZhbHVlOwotCQkJCQlpZiAocHJpbS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lERU5UKSB7Ci0JCQkJCQkvLyBjaGVjayBub3QgdG9wIG9yIGJvdHRvbQotCQkJCQkJaWYgKCFwcm9wWC5jYW5IYXZlKHByaW0uZ2V0U3RyaW5nVmFsdWUoKSkgJiYgcHJvcFkuY2FuSGF2ZShwcmltLmdldFN0cmluZ1ZhbHVlKCkpKSB7Ci0JCQkJCQkJLy8gY2FzZSBvcmRlciBpcyB2ZXJ0aWNhbCAtPiBob3Jpem9udGFsCi0JCQkJCQkJaW5kZXggPSAwOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXN0ciA9ICgoSUNTU1ZhbHVlKSBsaXN0Lml0ZW0oaW5kZXgpKS5nZXRDU1NWYWx1ZVRleHQoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElDU1NWYWx1ZSkgewotCQkJCXN0ciA9ICgoSUNTU1ZhbHVlKSBvYmopLmdldENTU1ZhbHVlVGV4dCgpOwotCQkJCWlmICghc3RyLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfQk9UVE9NKSAmJiAhc3RyLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfVE9QKSkKLQkJCQkJc3RyID0gIiI7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3RyID0gb2JqLnRvU3RyaW5nKCk7Ci0JCQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHN0cik7Ci0JCQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCi0JCQkJdG9rZW5zID0gY29ycmVjdE1lYW5pbmdUb2tlbih0b2tlbnMpOwotCQkJCWlmICh0b2tlbnMubGVuZ3RoID09IDEgJiYgKHRva2Vuc1swXS5pbWFnZS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX0JPVFRPTSkgfHwgdG9rZW5zWzBdLmltYWdlLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfVE9QKSkpCi0JCQkJCXN0ciA9IHRva2Vuc1swXS5pbWFnZTsKLQkJCQllbHNlIGlmICh0b2tlbnMubGVuZ3RoID4gMSkKLQkJCQkJc3RyID0gdG9rZW5zWzFdLmltYWdlOwotCQkJCWVsc2UKLQkJCQkJc3RyID0gIiI7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiAoc3RyICE9IG51bGwpID8gc3RyIDogIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG5ld1ZhbHVlID0gbnVsbDsKLQkJU3RyaW5nIHZhbEggPSBwcm9wZXJ0aWVzLmdldEJhY2tncm91bmRQb3NpdGlvblgoKTsKLQkJU3RyaW5nIHZhbFYgPSB2YWx1ZTsKLQkJaWYgKHZhbEggIT0gbnVsbCAmJiAodmFsSC50cmltKCkuZXF1YWxzKCIwJSIpIC8qIGRlZmF1bHQgdmFsdWUgKi98fCAvLyROT04tTkxTLTEkCi0JCQkJCXZhbEgudHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfTEVGVCkgLyoKLQkJCQkJCQkJCQkJCQkJCQkgKiBhbm90aGVyCi0JCQkJCQkJCQkJCQkJCQkJICogZGVmYXVsdAotCQkJCQkJCQkJCQkJCQkJCSAqIHZhbHVlCi0JCQkJCQkJCQkJCQkJCQkJICovKSkKLQkJCXZhbEggPSBudWxsOwotCQlpZiAodmFsViA9PSBudWxsIHx8IHZhbFYubGVuZ3RoKCkgPT0gMCkKLQkJCW5ld1ZhbHVlID0gdmFsSDsKLQkJZWxzZSBpZiAodmFsSCA9PSBudWxsIHx8IHZhbEgubGVuZ3RoKCkgPT0gMCkgewotCQkJQ29sbGVjdGlvbiB2YWxYID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpLmdldFZhbHVlcygpOwotCQkJQ29sbGVjdGlvbiB2YWxZID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpLmdldFZhbHVlcygpOwotCQkJUHJvcENNVXRpbC5taW51cyh2YWxZLCB2YWxYKTsKLQkJCUl0ZXJhdG9yIGl0ID0gdmFsWS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG9iai50b1N0cmluZygpLmVxdWFscyh2YWxWLnRvTG93ZXJDYXNlKCkpKSB7Ci0JCQkJCS8vIG5lZWQgbm90IGNvbXBlbnNhdGUgZm9yIC4uLgotCQkJCQluZXdWYWx1ZSA9IHZhbFY7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCS8vIGNvbXBlbnNhdGUgZm9yIEhvcml6b250YWwgdmFsdWUKLQkJCWlmIChuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJLy8gY2hlY2sgdmFsViBpcyBsZW5ndGggb3Igbm90Ci0JCQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHZhbFYudHJpbSgpKTsKLQkJCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCQkJaWYgKHRva2VucyAhPSBudWxsICYmIHRva2Vucy5sZW5ndGggPiAwICYmIHRva2Vuc1swXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCQluZXdWYWx1ZSA9IElWYWxJRC5WX0xFRlQgKyAiICIgKyB2YWxWOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQluZXdWYWx1ZSA9ICIwJSAiICsgdmFsVjsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJbmV3VmFsdWUgPSB2YWxIICsgIiAiICsgdmFsVjsvLyROT04tTkxTLTEkCi0JCXByb3BlcnRpZXMuc2V0QmFja2dyb3VuZFBvc2l0aW9uKG5ld1ZhbHVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQmFja2dyb3VuZFNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9CYWNrZ3JvdW5kU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWFkMjk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9CYWNrZ3JvdW5kU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdiYWNrZ3JvdW5kJyBwcm9wZXJ0eSAnYmFja2dyb3VuZCcgd2lsbCBiZSBleHBhbmRlZCB0bwotICogJ2JhY2tncm91bmQtYXR0YWNobWVudCcsICdiYWNrZ3JvdW5kLWNvbG9yJywgJ2JhY2tncm91bmQtaW1hZ2UnLAotICogJ2JhY2tncm91bmQtcG9zaXRpb24nLCAnYmFja2dyb3VuZC1yZXBlYXQnLAotICovCi1wdWJsaWMgY2xhc3MgQmFja2dyb3VuZFNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQmFja2dyb3VuZFNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSAiIiwgaW1hZ2UgPSAiIiwgcmVwZWF0ID0gIiIsIGF0dGFjaCA9ICIiLCBwb3MgPSAiIjsvLyROT04tTkxTLTUkLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wSW1hZ2UgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfSU1BR0UpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wUmVwZWF0ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1JFUEVBVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BBdHRhY2ggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQVRUQUNITUVOVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BQb3MgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUE9TSVRJT04pOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BJbWFnZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWltYWdlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BSZXBlYXQuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlyZXBlYXQgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcEF0dGFjaC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWF0dGFjaCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wUG9zLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkgewotCQkJCQlpZiAocG9zID09IG51bGwgfHwgcG9zLmxlbmd0aCgpIDw9IDApCi0JCQkJCQlwb3MgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCWVsc2UKLQkJCQkJCXBvcyA9IHBvcyArICIgIiArIHRva2Vuc1tpXS5pbWFnZTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UpIHsKLQkJCQlpZiAocG9zID09IG51bGwgfHwgcG9zLmxlbmd0aCgpIDw9IDApCi0JCQkJCXBvcyA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlCi0JCQkJCXBvcyA9IHBvcyArICIgIiArIHRva2Vuc1tpXS5pbWFnZTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJKSB7Ci0JCQkJaW1hZ2UgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWRlc3Quc2V0KHByb3BDb2xvci5nZXROYW1lKCksIGNvbG9yKTsKLQkJZGVzdC5zZXQocHJvcEltYWdlLmdldE5hbWUoKSwgaW1hZ2UpOwotCQlkZXN0LnNldChwcm9wUmVwZWF0LmdldE5hbWUoKSwgcmVwZWF0KTsKLQkJZGVzdC5zZXQocHJvcEF0dGFjaC5nZXROYW1lKCksIGF0dGFjaCk7Ci0JCWRlc3Quc2V0KHByb3BQb3MuZ2V0TmFtZSgpLCBwb3MpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSBudWxsLCBpbWFnZSA9IG51bGwsIHJlcGVhdCA9IG51bGwsIGF0dGFjaCA9IG51bGwsIHBvcyA9IG51bGw7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BJbWFnZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19JTUFHRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BSZXBlYXQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUkVQRUFUKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcEF0dGFjaCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19BVFRBQ0hNRU5UKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFBvcyA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTik7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcEltYWdlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJaW1hZ2UgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFJlcGVhdC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXJlcGVhdCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQXR0YWNoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJYXR0YWNoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BQb3MuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKSB7Ci0JCQkJCWlmIChwb3MgPT0gbnVsbCkKLQkJCQkJCXBvcyA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJZWxzZQotCQkJCQkJcG9zID0gcG9zICsgIiAiICsgdG9rZW5zW2ldLmltYWdlOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSkgewotCQkJCWlmIChwb3MgPT0gbnVsbCkKLQkJCQkJcG9zID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UKLQkJCQkJcG9zID0gcG9zICsgIiAiICsgdG9rZW5zW2ldLmltYWdlOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkpIHsKLQkJCQlpbWFnZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3BDb2xvciA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBjb2xvcjsKLQkJZWxzZSBpZiAocHJvcEltYWdlID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGltYWdlOwotCQllbHNlIGlmIChwcm9wUmVwZWF0ID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHJlcGVhdDsKLQkJZWxzZSBpZiAocHJvcEF0dGFjaCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBhdHRhY2g7Ci0JCWVsc2UgaWYgKHByb3BQb3MgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gcG9zOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyQm90dG9tU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckJvdHRvbVNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEwN2UyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyQm90dG9tU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdib3JkZXItYm90dG9tJyBwcm9wZXJ0eSAnYm9yZGVyLWJvdHRvbScgd2lsbCBiZSBleHBhbmRlZCB0bwotICogJ2JvcmRlci1ib3R0b20tY29sb3InLCAnYm9yZGVyLWJvdHRvbS1zdHlsZScsICdib3JkZXItYm90dG9tLXdpZHRoJywKLSAqLwotcHVibGljIGNsYXNzIEJvcmRlckJvdHRvbVNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQm9yZGVyQm90dG9tU2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9ICIiLCBzdHlsZSA9ICIiLCB3aWR0aCA9ICIiOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdpZHRoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BXaWR0aC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJZGVzdC5zZXQocHJvcENvbG9yLmdldE5hbWUoKSwgY29sb3IpOwotCQlkZXN0LnNldChwcm9wU3R5bGUuZ2V0TmFtZSgpLCBzdHlsZSk7Ci0JCWRlc3Quc2V0KHByb3BXaWR0aC5nZXROYW1lKCksIHdpZHRoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gbnVsbCwgc3R5bGUgPSBudWxsLCB3aWR0aCA9IG51bGw7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcENvbG9yID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGNvbG9yOwotCQllbHNlIGlmIChwcm9wU3R5bGUgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gc3R5bGU7Ci0JCWVsc2UgaWYgKHByb3BXaWR0aCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiB3aWR0aDsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckNvbG9yU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckNvbG9yU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGNjNjc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJDb2xvclNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnYm9yZGVyLWNvbG9yJyBwcm9wZXJ0eSAnYm9yZGVyLWNvbG9yJyB3aWxsIGJlIGV4cGFuZGVkIHRvCi0gKiAnYm9yZGVyLXRvcC1jb2xvcicsICdib3JkZXItcmlnaHQtY29sb3InLCAnYm9yZGVyLWJvdHRvbS1jb2xvcicsCi0gKiAnYm9yZGVyLWxlZnQtY29sb3InLAotICovCi1wdWJsaWMgY2xhc3MgQm9yZGVyQ29sb3JTaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJvcmRlckNvbG9yU2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZ1tdIGlkZW50cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpCi0JCQkJaWRlbnRzW2orK10gPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQlpZGVudHNbaisrXSA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCVN0cmluZ1tdIGRlc3RzID0gbmV3IFN0cmluZ1s0XTsKLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChqID09IDEpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMV0gPSBkZXN0c1syXSA9IGRlc3RzWzNdID0gaWRlbnRzWzBdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJZGVzdHNbMF0gPSBkZXN0c1syXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlkZXN0c1swXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCQlkZXN0c1syXSA9IGlkZW50c1syXTsKLQkJfQotCQllbHNlIHsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgNDsgaysrKQotCQkJCWRlc3RzW2tdID0gaWRlbnRzW2tdOwotCQl9Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUiwgZGVzdHNbMF0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9DT0xPUiwgZGVzdHNbMV0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IsIGRlc3RzWzJdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUiwgZGVzdHNbM10pOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJaWRlbnRzW2orK10gPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGogPT0gMSkKLQkJCXJldHVybiBpZGVudHNbMF07Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IgfHwgcHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUikKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUikKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUikKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUikKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX0NPTE9SKQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX0NPTE9SKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9DT0xPUikKLQkJCQlyZXR1cm4gaWRlbnRzWzNdOwotCQkJZWxzZQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyTGVmdFNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJMZWZ0U2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGI3MjM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJMZWZ0U2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdib3JkZXItbGVmdCcgcHJvcGVydHkgJ2JvcmRlci1sZWZ0JyB3aWxsIGJlIGV4cGFuZGVkIHRvCi0gKiAnYm9yZGVyLWxlZnQtY29sb3InLCAnYm9yZGVyLWxlZnQtc3R5bGUnLCAnYm9yZGVyLWxlZnQtd2lkdGgnLAotICovCi1wdWJsaWMgY2xhc3MgQm9yZGVyTGVmdFNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQm9yZGVyTGVmdFNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSAiIiwgc3R5bGUgPSAiIiwgd2lkdGggPSAiIjsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdpZHRoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWRlc3Quc2V0KHByb3BDb2xvci5nZXROYW1lKCksIGNvbG9yKTsKLQkJZGVzdC5zZXQocHJvcFN0eWxlLmdldE5hbWUoKSwgc3R5bGUpOwotCQlkZXN0LnNldChwcm9wV2lkdGguZ2V0TmFtZSgpLCB3aWR0aCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9IG51bGwsIHN0eWxlID0gbnVsbCwgd2lkdGggPSBudWxsOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfV0lEVEgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BXaWR0aC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3BDb2xvciA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBjb2xvcjsKLQkJZWxzZSBpZiAocHJvcFN0eWxlID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHN0eWxlOwotCQllbHNlIGlmIChwcm9wV2lkdGggPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gd2lkdGg7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJSaWdodFNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJSaWdodFNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhNWZjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyUmlnaHRTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JvcmRlci1yaWdodCcgcHJvcGVydHkgJ2JvcmRlci1yaWdodCcgd2lsbCBiZSBleHBhbmRlZCB0bwotICogJ2JvcmRlci1yaWdodC1jb2xvcicsICdib3JkZXItcmlnaHQtc3R5bGUnLCAnYm9yZGVyLXJpZ2h0LXdpZHRoJywKLSAqLwotcHVibGljIGNsYXNzIEJvcmRlclJpZ2h0U2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCb3JkZXJSaWdodFNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSAiIiwgc3R5bGUgPSAiIiwgd2lkdGggPSAiIjsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWRlc3Quc2V0KHByb3BDb2xvci5nZXROYW1lKCksIGNvbG9yKTsKLQkJZGVzdC5zZXQocHJvcFN0eWxlLmdldE5hbWUoKSwgc3R5bGUpOwotCQlkZXN0LnNldChwcm9wV2lkdGguZ2V0TmFtZSgpLCB3aWR0aCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9IG51bGwsIHN0eWxlID0gbnVsbCwgd2lkdGggPSBudWxsOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfV0lEVEgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BXaWR0aC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3BDb2xvciA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBjb2xvcjsKLQkJZWxzZSBpZiAocHJvcFN0eWxlID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHN0eWxlOwotCQllbHNlIGlmIChwcm9wV2lkdGggPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gd2lkdGg7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjcxOGExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JvcmRlcicgcHJvcGVydHkgJ2JvcmRlcicgd2lsbCBiZSBleHBhbmRlZCB0byAnYm9yZGVyLWNvbG9yJywKLSAqICdib3JkZXItc3R5bGUnLCAnYm9yZGVyLXdpZHRoJywKLSAqLwotcHVibGljIGNsYXNzIEJvcmRlclNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQm9yZGVyU2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9ICIiLCBzdHlsZSA9ICIiLCB3aWR0aCA9ICIiOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfV0lEVEgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BXaWR0aC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJZGVzdC5zZXQocHJvcENvbG9yLmdldE5hbWUoKSwgY29sb3IpOwotCQlkZXN0LnNldChwcm9wU3R5bGUuZ2V0TmFtZSgpLCBzdHlsZSk7Ci0JCWRlc3Quc2V0KHByb3BXaWR0aC5nZXROYW1lKCksIHdpZHRoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gbnVsbCwgc3R5bGUgPSBudWxsLCB3aWR0aCA9IG51bGw7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdpZHRoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcENvbG9yID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGNvbG9yOwotCQllbHNlIGlmIChwcm9wU3R5bGUgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gc3R5bGU7Ci0JCWVsc2UgaWYgKHByb3BXaWR0aCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiB3aWR0aDsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclN0eWxlU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclN0eWxlU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTQwOWMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJTdHlsZVNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnYm9yZGVyLXN0eWxlJyBwcm9wZXJ0eSAnYm9yZGVyLXN0eWxlJyB3aWxsIGJlIGV4cGFuZGVkIHRvCi0gKiAnYm9yZGVyLXRvcC1zdHlsZScsICdib3JkZXItcmlnaHQtc3R5bGUnLCAnYm9yZGVyLWJvdHRvbS1zdHlsZScsCi0gKiAnYm9yZGVyLWxlZnQtc3R5bGUnLAotICovCi1wdWJsaWMgY2xhc3MgQm9yZGVyU3R5bGVTaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJvcmRlclN0eWxlU2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZ1tdIGlkZW50cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpCi0JCQkJaWRlbnRzW2orK10gPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQlpZiAoaiA9PSA0KQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJU3RyaW5nW10gZGVzdHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgaWYgKGogPT0gMSkgewotCQkJZGVzdHNbMF0gPSBkZXN0c1sxXSA9IGRlc3RzWzJdID0gZGVzdHNbM10gPSBpZGVudHNbMF07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAyKSB7Ci0JCQlkZXN0c1swXSA9IGRlc3RzWzJdID0gaWRlbnRzWzBdOwotCQkJZGVzdHNbMV0gPSBkZXN0c1szXSA9IGlkZW50c1sxXTsKLQkJfQotCQllbHNlIGlmIChqID09IDMpIHsKLQkJCWRlc3RzWzBdID0gaWRlbnRzWzBdOwotCQkJZGVzdHNbMV0gPSBkZXN0c1szXSA9IGlkZW50c1sxXTsKLQkJCWRlc3RzWzJdID0gaWRlbnRzWzJdOwotCQl9Ci0JCWVsc2UgewotCQkJZm9yIChpbnQgayA9IDA7IGsgPCA0OyBrKyspCi0JCQkJZGVzdHNba10gPSBpZGVudHNba107Ci0JCX0KLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFLCBkZXN0c1swXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1NUWUxFLCBkZXN0c1sxXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSwgZGVzdHNbMl0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1NUWUxFLCBkZXN0c1szXSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZ1tdIGlkZW50cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpCi0JCQkJaWRlbnRzW2orK10gPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQlpZiAoaiA9PSA0KQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChqID09IDEpCi0JCQlyZXR1cm4gaWRlbnRzWzBdOwotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFIHx8IHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUpCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUpCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUpCi0JCQkJcmV0dXJuIGlkZW50c1syXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUpCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9TVFlMRSkKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSkKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfU1RZTEUpCi0JCQkJcmV0dXJuIGlkZW50c1szXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclRvcFNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJUb3BTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NzM4ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclRvcFNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnYm9yZGVyLXRvcCcgcHJvcGVydHkgJ2JvcmRlci10b3AnIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdib3JkZXItdG9wLWNvbG9yJywgJ2JvcmRlci10b3Atc3R5bGUnLCAnYm9yZGVyLXRvcC13aWR0aCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJUb3BTaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJvcmRlclRvcFNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSAiIiwgc3R5bGUgPSAiIiwgd2lkdGggPSAiIjsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWRlc3Quc2V0KHByb3BDb2xvci5nZXROYW1lKCksIGNvbG9yKTsKLQkJZGVzdC5zZXQocHJvcFN0eWxlLmdldE5hbWUoKSwgc3R5bGUpOwotCQlkZXN0LnNldChwcm9wV2lkdGguZ2V0TmFtZSgpLCB3aWR0aCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9IG51bGwsIHN0eWxlID0gbnVsbCwgd2lkdGggPSBudWxsOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdpZHRoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfV0lEVEgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BXaWR0aC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3BDb2xvciA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBjb2xvcjsKLQkJZWxzZSBpZiAocHJvcFN0eWxlID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHN0eWxlOwotCQllbHNlIGlmIChwcm9wV2lkdGggPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gd2lkdGg7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJXaWR0aFNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJXaWR0aFNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE5OGViMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyV2lkdGhTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JvcmRlci13aWR0aCcgcHJvcGVydHkgJ2JvcmRlci13aWR0aCcgd2lsbCBiZSBleHBhbmRlZCB0bwotICogJ2JvcmRlci10b3Atd2lkdGgnLCAnYm9yZGVyLXJpZ2h0LXdpZHRoJywgJ2JvcmRlci1ib3R0b20td2lkdGgnLAotICogJ2JvcmRlci1sZWZ0LXdpZHRoJywKLSAqLwotcHVibGljIGNsYXNzIEJvcmRlcldpZHRoU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCb3JkZXJXaWR0aFNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCVN0cmluZ1tdIGRlc3RzID0gbmV3IFN0cmluZ1s0XTsKLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChqID09IDEpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMV0gPSBkZXN0c1syXSA9IGRlc3RzWzNdID0gaWRlbnRzWzBdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJZGVzdHNbMF0gPSBkZXN0c1syXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlkZXN0c1swXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCQlkZXN0c1syXSA9IGlkZW50c1syXTsKLQkJfQotCQllbHNlIHsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgNDsgaysrKQotCQkJCWRlc3RzW2tdID0gaWRlbnRzW2tdOwotCQl9Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCwgZGVzdHNbMF0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9XSURUSCwgZGVzdHNbMV0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgsIGRlc3RzWzJdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9XSURUSCwgZGVzdHNbM10pOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChqID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoaiA9PSAxKQotCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJZWxzZSBpZiAoaiA9PSAyKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCB8fCBwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJfQotCQllbHNlIGlmIChqID09IDMpIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1dJRFRIKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfV0lEVEgpCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgpCi0JCQkJcmV0dXJuIGlkZW50c1syXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1dJRFRIKQotCQkJCXJldHVybiBpZGVudHNbM107Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DU1NQcm9wZXJ0eUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DU1NQcm9wZXJ0eUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4M2E4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ1NTUHJvcGVydHlDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNU3ViUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NQcm9wZXJ0eUNvbnRleHQgaW1wbGVtZW50cyBJQ1NTMlByb3BlcnRpZXMgewotCi0JcHJvdGVjdGVkIEhhc2h0YWJsZSBmUHJvcGVydGllcyA9IG5ldyBIYXNodGFibGUoKTsKLQlIYXNoU2V0IGZNb2RpZmllZCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBzdWJQcm9wZXJ0eUFkYXB0ZXJzOwotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgc2hvcnRoYW5kQWRhcHRlcnM7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ1NTUHJvcGVydHlDb250ZXh0KCkgewotCQlzdXBlcigpOwotCQlpbml0U2hvcnRoYW5kQWRhcHRlcnMoKTsKLQkJaW5pdFN1YlByb3BlcnR5QWRhcHRlcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ1NTUHJvcGVydHlDb250ZXh0KElDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdFNob3J0aGFuZEFkYXB0ZXJzKCk7Ci0JCWluaXRTdWJQcm9wZXJ0eUFkYXB0ZXJzKCk7Ci0JCWluaXRpYWxpemUoZGVjbCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiBleHBvcnRzIGFsbCBwcm9wZXJ0eS92YWx1ZSBwYWlycyB0byAnZGVjbCcgZGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseUZ1bGwoSUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbCkgewotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlFbnVtZXJhdGlvbiBrZXlzID0gZlByb3BlcnRpZXMua2V5cygpOwotCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJT2JqZWN0IGtleSA9IGtleXMubmV4dEVsZW1lbnQoKTsKLQkJCU9iamVjdCB2YWwgPSBmUHJvcGVydGllcy5nZXQoa2V5KTsKLQkJCVN0cmluZyB2YWx1ZSA9ICh2YWwgaW5zdGFuY2VvZiBJQ1NTVmFsdWUpID8gKChJQ1NTVmFsdWUpIHZhbCkuZ2V0Q1NTVmFsdWVUZXh0KCkgOiB2YWwudG9TdHJpbmcoKTsKLQotCQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPD0gMCkKLQkJCQlkZWNsLnJlbW92ZVByb3BlcnR5KGtleS50b1N0cmluZygpKTsKLQkJCWVsc2UKLQkJCQlkZWNsLnNldFByb3BlcnR5KGtleS50b1N0cmluZygpLCB2YWx1ZS50cmltKCksICh2YWwgaW5zdGFuY2VvZiBWYWx1ZURhdGEgJiYgKChWYWx1ZURhdGEpIHZhbCkuaW1wb3J0YW50KSA/ICIhaW1wb3J0YW50IiA6ICIiKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiBleHBvcnRzIG1vZGlmaWVkIHByb3BlcnR5L3ZhbHVlIHBhaXJzIHRvICdkZWNsJwotCSAqIGRlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHlNb2RpZmllZChJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCWlmIChkZWNsID09IG51bGwgfHwgZk1vZGlmaWVkID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUl0ZXJhdG9yIGl0ID0gZk1vZGlmaWVkLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBrZXkgPSBpdC5uZXh0KCk7Ci0JCQlPYmplY3QgdmFsID0gZlByb3BlcnRpZXMuZ2V0KGtleSk7Ci0JCQlTdHJpbmcgdmFsdWUgPSAodmFsIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSA/ICgoSUNTU1ZhbHVlKSB2YWwpLmdldENTU1ZhbHVlVGV4dCgpIDogKCh2YWwgIT0gbnVsbCkgPyB2YWwudG9TdHJpbmcoKSA6IG51bGwpOwotCi0JCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA8PSAwKQotCQkJCWRlY2wucmVtb3ZlUHJvcGVydHkoa2V5LnRvU3RyaW5nKCkpOwotCQkJZWxzZQotCQkJCWRlY2wuc2V0UHJvcGVydHkoa2V5LnRvU3RyaW5nKCksIHZhbHVlLnRyaW0oKSwgKHZhbCBpbnN0YW5jZW9mIFZhbHVlRGF0YSAmJiAoKFZhbHVlRGF0YSkgdmFsKS5pbXBvcnRhbnQpID8gIiFpbXBvcnRhbnQiIDogIiIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgY2xvbmUgb2YgdGhpcyBjb250ZXh0Ci0JICovCi0JcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkJQ1NTUHJvcGVydHlDb250ZXh0IGNsb25lID0gbmV3IENTU1Byb3BlcnR5Q29udGV4dCgpOwotCQlpZiAodGhpcy5mTW9kaWZpZWQgIT0gbnVsbCkKLQkJCWNsb25lLmZNb2RpZmllZCA9IChIYXNoU2V0KSB0aGlzLmZNb2RpZmllZC5jbG9uZSgpOwotCQllbHNlCi0JCQljbG9uZS5mTW9kaWZpZWQgPSBudWxsOwotCQljbG9uZS5mUHJvcGVydGllcyA9IChIYXNodGFibGUpIHRoaXMuZlByb3BlcnRpZXMuY2xvbmUoKTsKLQkJcmV0dXJuIGNsb25lOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gZXhwYW5kcyBhIHNob3J0LWhhbmQgcHJvcGVydHkncyB2YWx1ZSB0byBlYWNoIGxlYWYKLQkgKiBwcm9wZXJ0eSdzIHZhbHVlIGFuZCBzZXQgdGhlbSB0byAnZm9yZWlnbicKLQkgKiAKLQkgKiBGb3IgZXhhbXBsZSwgZ2l2ZW4gW3Byb3A9Ym9yZGVyLXRvcCwgdmFsdWU9InNvbGlkIDFweCB5ZWxsb3ciXSB3aWxsIGJlCi0JICogZXhwYW5kZWQgdG8gW2JvcmRlci10b3AtY29sb3I9eWVsbG93LCBib3JkZXItdG9wLXN0eWxlPXNvbGlkLAotCSAqIGJvcmRlci10b3Atd2lkdGg9MXB4XSBhbmQgdGhleSBhcmUgc3RvcmVkIHRvICdmb3JlaWduJyBjb250ZXh0LgotCSAqIAotCSAqIE5vdGUgdGhhdCByZWN1cnNpdmVseSBzaG9ydGhhbmRlZCBwcm9wZXJ0eSBsaWtlICdib3JkZXInIHdpbGwgYmUKLQkgKiBleHBhbmRlZCB0byBhbGwgZGVzY2VuZGFudCBsZWFmIHByb3BlcnRpZXMgbGlrZQotCSAqICdib3JkZXItW3RvcC9yaWdodC9ib3R0b20vbGVmdF0tW2NvbG9yL3N0eWxlL3dpZHRoXScKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBmb3JlaWduCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5kZWNsYXJhdGlvbi5DU1NQcm9wZXJ0eUNvbnRleHQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZXhwYW5kVG9MZWFmKFByb3BDTVByb3BlcnR5IHByb3AsIFN0cmluZyB2YWx1ZSwgQ1NTUHJvcGVydHlDb250ZXh0IGZvcmVpZ24pIHsKLQkJLy8gZXhwYW5kIHNob3J0aGFuZCBwcm9wZXJ0eQotCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlJU2hvcnRoYW5kQWRhcHRlciBhZGFwdGVyID0gKElTaG9ydGhhbmRBZGFwdGVyKSBzaG9ydGhhbmRBZGFwdGVycy5nZXQocHJvcCk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlci5leHBhbmQodmFsdWUsIGZvcmVpZ24pOwotCQkJCWZvcmVpZ24uc2V0KHByb3AuZ2V0TmFtZSgpLCAiIik7Ly8kTk9OLU5MUy0xJAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcC5nZXROdW1DaGlsZCgpOyBpKyspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IHByb3AuZ2V0Q2hpbGRBdChpKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb3BDTVByb3BlcnR5ICYmICEob2JqIGluc3RhbmNlb2YgUHJvcENNU3ViUHJvcGVydHkpKSB7Ci0JCQkJCQlQcm9wQ01Qcm9wZXJ0eSBleHBhbmRlZFByb3AgPSAoUHJvcENNUHJvcGVydHkpIG9iajsKLQkJCQkJCXZhbHVlID0gZm9yZWlnbi5nZXQoZXhwYW5kZWRQcm9wLmdldE5hbWUoKSk7Ci0JCQkJCQlleHBhbmRUb0xlYWYoZXhwYW5kZWRQcm9wLCB2YWx1ZSwgZm9yZWlnbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICghdmFsdWUuZXF1YWxzKGZvcmVpZ24uZ2V0KHByb3AuZ2V0TmFtZSgpKSkpIHsKLQkJCQlmb3JlaWduLnNldChwcm9wLmdldE5hbWUoKSwgdmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHZhbHVlIG9mICdwcm9wJy4gUXVlcnlpbmcgdmFsdWUgbWVjaGFuaXNtIGNoZWNrcwotCSAqIHNob3J0LWhhbmQgcHJvcGVydGllcy4KLQkgKiAKLQkgKiBGb3IgZXhhbXBsZSwgZ2l2ZW4gImJhY2tncm91bmQ9Zml4ZWQgd2hpdGUiIGlzIHNldCBpbiB0aGlzIGluc2F0bmNlIGFuZAotCSAqIHBhcmFtICJwcm9wPWJhY2tncm91bmQtY29sb3IiLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgIndoaXRlIi4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXQob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eSBwcm9wKSB7Ci0JCWlmIChwcm9wIGluc3RhbmNlb2YgUHJvcENNU3ViUHJvcGVydHkpIHsKLQkJCUlTdWJQcm9wZXJ0eUFkYXB0ZXIgYWRhcHRlciA9IChJU3ViUHJvcGVydHlBZGFwdGVyKSBzdWJQcm9wZXJ0eUFkYXB0ZXJzLmdldChwcm9wLmdldE5hbWUoKSk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCXJldHVybiBhZGFwdGVyLmdldCh0aGlzKTsKLQkJfQotCQlTdHJpbmcgc3RyID0gZ2V0KHByb3AuZ2V0TmFtZSgpKTsKLQkJaWYgKChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkgJiYgcHJvcC5nZXRTaG9ydGhhbmRDb250YWluZXJDb3VudCgpID4gMCkgewotCQkJLy8gZ2V0IGV4cGFuZGVkIHByb3BlcnR5Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3AuZ2V0U2hvcnRoYW5kQ29udGFpbmVyQ291bnQoKTsgaSsrKSB7Ci0JCQkJUHJvcENNUHJvcGVydHkgcHJvcFBhcmVudCA9IHByb3Auc2hvcnRoYW5kQ29udGFpbmVyQXQoaSk7Ci0JCQkJU3RyaW5nIHN0clBhcmVudCA9IGdldChwcm9wUGFyZW50KTsKLQkJCQlpZiAoc3RyUGFyZW50ICE9IG51bGwgJiYgc3RyUGFyZW50LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJSVNob3J0aGFuZEFkYXB0ZXIgYWRhcHRlciA9IChJU2hvcnRoYW5kQWRhcHRlcikgc2hvcnRoYW5kQWRhcHRlcnMuZ2V0KHByb3BQYXJlbnQpOwotCQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgZXh0cmFjdGVkVmFsdWUgPSBhZGFwdGVyLmV4dHJhY3Qoc3RyUGFyZW50LCBwcm9wKTsKLQkJCQkJCXJldHVybiAoZXh0cmFjdGVkVmFsdWUgIT0gbnVsbCkgPyBleHRyYWN0ZWRWYWx1ZSA6ICIiOy8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB2YWx1ZSBvZiAncHJvcCcuIFF1ZXJ5aW5nIHZhbHVlIG1lY2hhbmlzbSBkb2VzCi0JICogbm90IGNhcmUgc2hvcnRoYW5kIHByb3BlcnRpZXMuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXQoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCVN0cmluZyBzdHIgPSBudWxsOwotCQlPYmplY3Qgb2JqID0gZlByb3BlcnRpZXMuZ2V0KHByb3BOYW1lKTsKLQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUNTU1ZhbHVlKQotCQkJCXN0ciA9ICgoSUNTU1ZhbHVlKSBvYmopLmdldENTU1ZhbHVlVGV4dCgpOwotCQkJZWxzZQotCQkJCXN0ciA9IG9iai50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiAoc3RyICE9IG51bGwpID8gc3RyIDogIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYXppbXV0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF6aW11dGgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0FaSU1VVEgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJhY2tncm91bmQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CRykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYmFja2dyb3VuZC1hdHRhY2htZW50IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja2dyb3VuZEF0dGFjaG1lbnQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0FUVEFDSE1FTlQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJhY2tncm91bmQtY29sb3IgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tncm91bmRDb2xvcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQ09MT1IpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJhY2tncm91bmQtaW1hZ2UgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tncm91bmRJbWFnZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJhY2tncm91bmQtcG9zaXRpb24gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tncm91bmRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUE9TSVRJT04pKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRCYWNrZ3JvdW5kUG9zaXRpb25YKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKSk7Ci0JCS8qCi0JCSAqIFN0cmluZyBzdHIgPSBudWxsOyBPYmplY3Qgb2JqID0KLQkJICogZlByb3BlcnRpZXMuZ2V0KFByb3BDTVByb3BlcnR5LlBfQkdfUE9TSVRJT04pOyBpZiAob2JqICE9IG51bGwpIHsKLQkJICogUHJvcENNUHJvcGVydHkgcHJvcFggPQotCQkgKiBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCk7Ci0JCSAqIFByb3BDTVByb3BlcnR5IHByb3BZID0KLQkJICogUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpOwotCQkgKiBpZiAob2JqIGluc3RhbmNlb2YgSUNTU1ZhbHVlTGlzdCkgeyBJQ1NTVmFsdWVMaXN0IGxpc3QgPQotCQkgKiAoSUNTU1ZhbHVlTGlzdCkgb2JqOyBJQ1NTVmFsdWUgdmFsdWUgPSAoSUNTU1ZhbHVlKSBsaXN0Lml0ZW0oMCk7IGlmCi0JCSAqICh2YWx1ZS5nZXRDc3NWYWx1ZVR5cGUoKSA9PSBDU1NWYWx1ZS5DU1NfUFJJTUlUSVZFX1ZBTFVFKSB7Ci0JCSAqIElDU1NQcmltaXRpdmVWYWx1ZSBwcmltID0gKElDU1NQcmltaXRpdmVWYWx1ZSkgdmFsdWU7IGlmCi0JCSAqIChwcmltLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSURFTlQpIHsgLy8gY2hlY2sKLQkJICogbm90IHRvcCBvciBib3R0b20gaWYgKCFwcm9wWC5jYW5IYXZlKHByaW0uZ2V0U3RyaW5nVmFsdWUoKSkgJiYKLQkJICogcHJvcFkuY2FuSGF2ZShwcmltLmdldFN0cmluZ1ZhbHVlKCkpKSB7IC8vIGNhc2Ugb3JkZXIgaXMgdmVydGljYWwgLT4KLQkJICogaG9yaXpvbnRhbCB2YWx1ZSA9IChJQ1NTVmFsdWUpIGxpc3QuaXRlbSgxKTsgfSB9IH0gc3RyID0KLQkJICogdmFsdWUuZ2V0Q1NTVmFsdWVUZXh0KCk7IH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSB7IHN0ciA9Ci0JCSAqICgoSUNTU1ZhbHVlKW9iaikuZ2V0Q1NTVmFsdWVUZXh0KCk7IH0gZWxzZSBzdHIgPSBvYmoudG9TdHJpbmcoKTsgfQotCQkgKiByZXR1cm4gKHN0ciAhPSBudWxsKSA/IHN0ciA6ICIiOwotCQkgKi8KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRCYWNrZ3JvdW5kUG9zaXRpb25ZKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKSk7Ci0JCS8qCi0JCSAqIFN0cmluZyBzdHIgPSBudWxsOyBPYmplY3Qgb2JqID0KLQkJICogZlByb3BlcnRpZXMuZ2V0KFByb3BDTVByb3BlcnR5LlBfQkdfUE9TSVRJT04pOyBpZiAob2JqICE9IG51bGwpIHsKLQkJICogUHJvcENNUHJvcGVydHkgcHJvcFggPQotCQkgKiBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCk7Ci0JCSAqIFByb3BDTVByb3BlcnR5IHByb3BZID0KLQkJICogUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpOwotCQkgKiBpZiAob2JqIGluc3RhbmNlb2YgSUNTU1ZhbHVlTGlzdCkgeyBJQ1NTVmFsdWVMaXN0IGxpc3QgPQotCQkgKiAoSUNTU1ZhbHVlTGlzdCkgb2JqOyBpbnQgaW5kZXggPSAxOyBJQ1NTVmFsdWUgdmFsdWUgPSAoSUNTU1ZhbHVlKQotCQkgKiBsaXN0Lml0ZW0oMCk7IGlmICh2YWx1ZS5nZXRDc3NWYWx1ZVR5cGUoKSA9PQotCQkgKiBDU1NWYWx1ZS5DU1NfUFJJTUlUSVZFX1ZBTFVFKSB7IElDU1NQcmltaXRpdmVWYWx1ZSBwcmltID0KLQkJICogKElDU1NQcmltaXRpdmVWYWx1ZSkgdmFsdWU7IGlmIChwcmltLmdldFByaW1pdGl2ZVR5cGUoKSA9PQotCQkgKiBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSURFTlQpIHsgLy8gY2hlY2sgbm90IHRvcCBvciBib3R0b20gaWYKLQkJICogKCFwcm9wWC5jYW5IYXZlKHByaW0uZ2V0U3RyaW5nVmFsdWUoKSkgJiYKLQkJICogcHJvcFkuY2FuSGF2ZShwcmltLmdldFN0cmluZ1ZhbHVlKCkpKSB7IC8vIGNhc2Ugb3JkZXIgaXMgdmVydGljYWwgLT4KLQkJICogaG9yaXpvbnRhbCBpbmRleCA9IDA7IH0gfSB9IHN0ciA9Ci0JCSAqICgoSUNTU1ZhbHVlKWxpc3QuaXRlbShpbmRleCkpLmdldENTU1ZhbHVlVGV4dCgpOyB9IGVsc2UgaWYgKG9iagotCQkgKiBpbnN0YW5jZW9mIElDU1NWYWx1ZSkgeyAvLyBkbyBub3RoaW5nIC0tLSB2YWx1ZSBpcyBudWxsIH0gZWxzZSBzdHIgPQotCQkgKiBvYmoudG9TdHJpbmcoKTsgfSByZXR1cm4gKHN0ciAhPSBudWxsKSA/IHN0ciA6ICIiOwotCQkgKi8KLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJhY2tncm91bmQtcmVwZWF0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja2dyb3VuZFJlcGVhdCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUkVQRUFUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXIgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItYm90dG9tIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJCb3R0b20oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT00pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1ib3R0b20tY29sb3IgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckJvdHRvbUNvbG9yKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX0NPTE9SKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItYm90dG9tLXN0eWxlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJCb3R0b21TdHlsZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLWJvdHRvbS13aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyQm90dG9tV2lkdGgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1jb2xsYXBzZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyQ29sbGFwc2UoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9DT0xMQVBTRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLWNvbG9yIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJDb2xvcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTE9SKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItbGVmdCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyTGVmdCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1sZWZ0LWNvbG9yIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJMZWZ0Q29sb3IoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX0NPTE9SKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItbGVmdC1zdHlsZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyTGVmdFN0eWxlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9TVFlMRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLWxlZnQtd2lkdGggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckxlZnRXaWR0aCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfV0lEVEgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1yaWdodCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyUmlnaHQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXJpZ2h0LWNvbG9yIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJSaWdodENvbG9yKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1yaWdodC1zdHlsZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyUmlnaHRTdHlsZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1NUWUxFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItcmlnaHQtd2lkdGggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclJpZ2h0V2lkdGgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9XSURUSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXNwYWNpbmcgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclNwYWNpbmcoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TUEFDSU5HKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItc3R5bGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclN0eWxlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1RZTEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci10b3AgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclRvcCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXRvcC1jb2xvciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyVG9wQ29sb3IoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci10b3Atc3R5bGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclRvcFN0eWxlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItdG9wLXdpZHRoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJUb3BXaWR0aCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXdpZHRoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJXaWR0aCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1dJRFRIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3R0b20gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvdHRvbSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9UVE9NKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBjYXB0aW9uLXNpZGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhcHRpb25TaWRlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DQVBUSU9OX1NJREUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGNsZWFyIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGVhcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xFQVIpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGNsaXAgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsaXAoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsaXBCb3R0b20oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfQk9UVE9NKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGlwTGVmdCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9MRUZUKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGlwUmlnaHQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfUklHSFQpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsaXBUb3AoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfVE9QKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBjb2xvciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sb3IoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPTE9SKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBjb250ZW50IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT05URU5UKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBjb3VudGVyLWluY3JlbWVudCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q291bnRlckluY3JlbWVudCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09VTlRFUl9JTkNSRU1FTlQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGNvdW50ZXItcmVzZXQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvdW50ZXJSZXNldCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09VTlRFUl9SRVNFVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZmxvYXQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENzc0Zsb2F0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GTE9BVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgY3VlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdWUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgY3VlLWFmdGVyIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdWVBZnRlcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VFX0FGVEVSKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBjdWUtYmVmb3JlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdWVCZWZvcmUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRV9CRUZPUkUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGN1cnNvciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3Vyc29yKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVVJTT1IpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGRpcmVjdGlvbiBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0aW9uKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9ESVJFQ1RJT04pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGRpc3BsYXkgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXkoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0RJU1BMQVkpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGVsZXZhdGlvbiBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWxldmF0aW9uKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9FTEVWQVRJT04pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGVtcHR5LWNlbGxzIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbXB0eUNlbGxzKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9FTVBUWV9DRUxMUykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZm9udCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9udCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZm9udC1mYW1pbHkgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnRGYW1pbHkoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfRkFNSUxZKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBmb250LXNpemUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnRTaXplKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NJWkUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGZvbnQtc2l6ZS1hZGp1c3QgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnRTaXplQWRqdXN0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NJWkVfQURKVVNUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBmb250LXN0cmV0Y2ggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnRTdHJldGNoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUUkVUQ0gpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGZvbnQtc3R5bGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnRTdHlsZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TVFlMRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZm9udC12YXJpYW50IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb250VmFyaWFudCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9WQVJJQU5UKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBmb250LXdlaWdodCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9udFdlaWdodCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9XRUlHSFQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGhlaWdodCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SGVpZ2h0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9IRUlHSFQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGxlZnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExlZnQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xFRlQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGxldHRlci1zcGFjaW5nIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMZXR0ZXJTcGFjaW5nKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MRVRURVJfU1BBQ0lORykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbGluZS1oZWlnaHQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpbmVIZWlnaHQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJTkVfSEVJR0hUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBsaXN0LXN0eWxlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXN0U3R5bGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGxpc3Qtc3R5bGUtaW1hZ2UgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpc3RTdHlsZUltYWdlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBsaXN0LXN0eWxlLXBvc2l0aW9uIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXN0U3R5bGVQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9QT1NJVElPTikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbGlzdC1zdHlsZS10eXBlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXN0U3R5bGVUeXBlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1RZUEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1hcmdpbiBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFyZ2luKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU4pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1hcmdpbi1ib3R0b20gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcmdpbkJvdHRvbSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0JPVFRPTSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbWFyZ2luLWxlZnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcmdpbkxlZnQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9MRUZUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBtYXJnaW4tcmlnaHQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcmdpblJpZ2h0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fUklHSFQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1hcmdpbi10b3AgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcmdpblRvcCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1RPUCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbWFya2VyLW9mZnNldCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFya2VyT2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJLRVJfT0ZGU0VUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBtYXJrcyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFya3MoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUktTKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBtYXgtaGVpZ2h0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXhIZWlnaHQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BWF9IRUlHSFQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1heC13aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWF4V2lkdGgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BWF9XSURUSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbWluLWhlaWdodCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWluSGVpZ2h0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NSU5fSEVJR0hUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBtaW4td2lkdGggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1pbldpZHRoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NSU5fV0lEVEgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG9ycGhhbnMgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE9ycGhhbnMoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09SUEhBTlMpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG91dGxpbmUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE91dGxpbmUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG91dGxpbmUtY29sb3IgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE91dGxpbmVDb2xvcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9DT0xPUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgb3V0bGluZS1zdHlsZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0bGluZVN0eWxlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX1NUWUxFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBvdXRsaW5lLXdpZHRoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPdXRsaW5lV2lkdGgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfV0lEVEgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG92ZXJmbG93IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPdmVyZmxvdygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1ZFUkZMT1cpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhZGRpbmcgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhZGRpbmcoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkcpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhZGRpbmctYm90dG9tIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWRkaW5nQm90dG9tKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0JPVFRPTSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGFkZGluZy1sZWZ0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWRkaW5nTGVmdCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19MRUZUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYWRkaW5nLXJpZ2h0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWRkaW5nUmlnaHQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfUklHSFQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhZGRpbmctdG9wIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWRkaW5nVG9wKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1RPUCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGFnZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGFnZS1icmVhay1hZnRlciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUJyZWFrQWZ0ZXIoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0VfQlJFQUtfQUZURVIpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhZ2UtYnJlYWstYmVmb3JlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWdlQnJlYWtCZWZvcmUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0VfQlJFQUtfQkVGT1JFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYWdlLWJyZWFrLWluc2lkZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUJyZWFrSW5zaWRlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFX0JSRUFLX0lOU0lERSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGF1c2UgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdXNlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQVVTRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGF1c2UtYWZ0ZXIgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdXNlQWZ0ZXIoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBVVNFX0FGVEVSKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYXVzZS1iZWZvcmUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdXNlQmVmb3JlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQVVTRV9CRUZPUkUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBpdGNoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQaXRjaCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUElUQ0gpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBpdGNoLXJhbmdlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQaXRjaFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QSVRDSF9SQU5HRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGxheS1kdXJpbmcgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsYXlEdXJpbmcoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BMQVlfRFVSSU5HKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwb3NpdGlvbiBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9zaXRpb24oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BPU0lUSU9OKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBxdW90ZXMgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1b3RlcygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUVVPVEVTKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSByaWNobmVzcyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmljaG5lc3MoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1JJQ0hORVNTKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSByaWdodCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmlnaHQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1JJR0hUKSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5kZWNsYXJhdGlvbi5JU2hvcnRoYW5kQWRhcHRlcgotCSAqIEBwYXJhbSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5Ci0JICovCi0JcHVibGljIHN0YXRpYyBJU2hvcnRoYW5kQWRhcHRlciBnZXRTaG9ydGhhbmRBZGFwdGVyKFByb3BDTVByb3BlcnR5IHByb3ApIHsKLQkJcmV0dXJuIChJU2hvcnRoYW5kQWRhcHRlcikgc2hvcnRoYW5kQWRhcHRlcnMuZ2V0KHByb3ApOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgc2l6ZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2l6ZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU0laRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgc3BlYWsgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWFrKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBSykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgc3BlYWstaGVhZGVyIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVha0hlYWRlcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUtfSEVBREVSKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBzcGVhay1udW1lcmFsIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVha051bWVyYWwoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLX05VTUVSQUwpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHNwZWFrLXB1bmN0dWF0aW9uIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVha1B1bmN0dWF0aW9uKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBS19QVU5DVFVBVElPTikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgc3BlZWNoLXJhdGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWVjaFJhdGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUVDSF9SQVRFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBzdHJlc3MgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmVzcygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1RSRVNTKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB0YWJsZS1sYXlvdXQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlTGF5b3V0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9UQUJMRV9MQVlPVVQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHRleHQtYWxpZ24gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHRBbGlnbigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9BTElHTikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdGV4dC1kZWNvcmF0aW9uIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0RGVjb3JhdGlvbigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9ERUNPUkFUSU9OKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB0ZXh0LWluZGVudCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEluZGVudCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9JTkRFTlQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHRleHQtc2hhZG93IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0U2hhZG93KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX1NIQURPVykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdGV4dC10cmFuc2Zvcm0gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHRUcmFuc2Zvcm0oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfVFJBTlNGT1JNKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB0b3AgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvcCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVE9QKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB1bmljb2RlLWJpZGkgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVuaWNvZGVCaWRpKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9VTklDT0RFX0JJREkpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHZlcnRpY2FsLWFsaWduIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJ0aWNhbEFsaWduKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WRVJUSUNBTF9BTElHTikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdmlzaWJpbGl0eSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmlzaWJpbGl0eSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVklTSUJJTElUWSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdm9pY2UtZmFtaWx5IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWb2ljZUZhbWlseSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVk9JQ0VfRkFNSUxZKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB2b2x1bWUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZvbHVtZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVk9MVU1FKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB3aGl0ZS1zcGFjZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2hpdGVTcGFjZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV0hJVEVfU1BBQ0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHdpZG93cyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2lkb3dzKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XSURPV1MpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHdpZHRoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV0lEVEgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHdvcmQtc3BhY2luZyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V29yZFNwYWNpbmcoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dPUkRfU1BBQ0lORykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgei1pbmRleCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0WkluZGV4KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9aX0lOREVYKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCWZQcm9wZXJ0aWVzLmNsZWFyKCk7Ci0JCWlmIChmTW9kaWZpZWQgIT0gbnVsbCkKLQkJCWZNb2RpZmllZC5jbGVhcigpOwotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWludCBuUHJvcGVydGllcyA9IGRlY2wuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgblByb3BlcnRpZXM7IGkrKykgewotCQkJU3RyaW5nIHByb3BOYW1lID0gZGVjbC5pdGVtKGkpOwotCQkJaWYgKHByb3BOYW1lICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcHJvcE4gPSBwcm9wTmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTsKLQkJCQlpZiAocHJvcE4ubGVuZ3RoKCkgIT0gMCkgewotCQkJCQlDU1NWYWx1ZSB2YWwgPSBkZWNsLmdldFByb3BlcnR5Q1NTVmFsdWUocHJvcE5hbWUpOwotCQkJCQlpZiAodmFsICE9IG51bGwpCi0JCQkJCQlmUHJvcGVydGllcy5wdXQocHJvcE4sIHZhbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIHZvaWQgaW5pdFNob3J0aGFuZEFkYXB0ZXJzKCkgewotCQlpZiAoc2hvcnRoYW5kQWRhcHRlcnMgPT0gbnVsbCkgewotCQkJc2hvcnRoYW5kQWRhcHRlcnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCQkvLyByZWdpc3RlcgotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CRyksIG5ldyBCYWNrZ3JvdW5kU2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSKSwgbmV3IEJvcmRlclNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9DT0xPUiksIG5ldyBCb3JkZXJDb2xvclNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TVFlMRSksIG5ldyBCb3JkZXJTdHlsZVNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9XSURUSCksIG5ldyBCb3JkZXJXaWR0aFNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1ApLCBuZXcgQm9yZGVyVG9wU2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUKSwgbmV3IEJvcmRlclJpZ2h0U2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTSksIG5ldyBCb3JkZXJCb3R0b21TaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVCksIG5ldyBCb3JkZXJMZWZ0U2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVCksIG5ldyBGb250U2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRSksIG5ldyBMaXN0U3R5bGVTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU4pLCBuZXcgTWFyZ2luU2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElORyksIG5ldyBQYWRkaW5nU2hvcnRoYW5kQWRhcHRlcigpKTsKLQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIHZvaWQgaW5pdFN1YlByb3BlcnR5QWRhcHRlcnMoKSB7Ci0JCWlmIChzdWJQcm9wZXJ0eUFkYXB0ZXJzID09IG51bGwpIHsKLQkJCXN1YlByb3BlcnR5QWRhcHRlcnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJCS8vIHJlZ2lzdGVyCi0JCQlzdWJQcm9wZXJ0eUFkYXB0ZXJzLnB1dChQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gsIG5ldyBCYWNrZ3JvdW5kUG9zaXRpb25YU3ViU3R5bGVBZGFwdGVyKCkpOwotCQkJc3ViUHJvcGVydHlBZGFwdGVycy5wdXQoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZLCBuZXcgQmFja2dyb3VuZFBvc2l0aW9uWVN1YlN0eWxlQWRhcHRlcigpKTsKLQkJCXN1YlByb3BlcnR5QWRhcHRlcnMucHV0KFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9UT1AsIG5ldyBDbGlwVG9wU3ViU3R5bGVBZGFwdGVyKCkpOwotCQkJc3ViUHJvcGVydHlBZGFwdGVycy5wdXQoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1JJR0hULCBuZXcgQ2xpcFJpZ2h0U3ViU3R5bGVBZGFwdGVyKCkpOwotCQkJc3ViUHJvcGVydHlBZGFwdGVycy5wdXQoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0JPVFRPTSwgbmV3IENsaXBCb3R0b21TdWJTdHlsZUFkYXB0ZXIoKSk7Ci0JCQlzdWJQcm9wZXJ0eUFkYXB0ZXJzLnB1dChQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfTEVGVCwgbmV3IENsaXBMZWZ0U3ViU3R5bGVBZGFwdGVyKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RpZmllZCgpIHsKLQkJcmV0dXJuIChmTW9kaWZpZWQgIT0gbnVsbCAmJiBmTW9kaWZpZWQuc2l6ZSgpICE9IDApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBwcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gZlByb3BlcnRpZXMua2V5cygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBwcm9wZXJ0aWVzTW9kaWZpZWQoKSB7Ci0JCWlmIChmTW9kaWZpZWQgIT0gbnVsbCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvbikgZk1vZGlmaWVkLmNsb25lKCkpLml0ZXJhdG9yKCk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkJfQotCQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGV4cGFuZHMgdGhlIHZhbHVlIG9mIHNob3J0aGFuZCAncHJvcCcgdG8gJ2ZvcmVpZ24nCi0JICogY29udGV4dC4gTm90ZSB0aGF0IGlmIHRoaXMgaGFzIHBhcmVudCBzaG9ydGhhbmQgcHJvcGVydGllcyBvZiAncHJvcCcsCi0JICogdGhleSBhcmUgYWxsIGV4cGFuZGVkIHRvICdmb3JlaWduJyBjb250ZXh0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlY3Vyc2l2ZUV4dHJhY3QoUHJvcENNUHJvcGVydHkgcHJvcCwgQ1NTUHJvcGVydHlDb250ZXh0IGZvcmVpZ24pIHsKLQkJLy8gZXhwYW5kIHNob3J0aGFuZCBwcm9wZXJ0eQotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3AuZ2V0U2hvcnRoYW5kQ29udGFpbmVyQ291bnQoKTsgaSsrKSB7Ci0JCQlyZWN1cnNpdmVFeHRyYWN0KHByb3Auc2hvcnRoYW5kQ29udGFpbmVyQXQoaSksIGZvcmVpZ24pOwotCQl9Ci0JCVN0cmluZyBzdHIgPSBnZXQocHJvcC5nZXROYW1lKCkpOwotCQlpZiAoc3RyID09IG51bGwgfHwgc3RyLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkJc3RyID0gZm9yZWlnbi5nZXQocHJvcC5nZXROYW1lKCkpOwotCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCUlTaG9ydGhhbmRBZGFwdGVyIGFkYXB0ZXIgPSAoSVNob3J0aGFuZEFkYXB0ZXIpIHNob3J0aGFuZEFkYXB0ZXJzLmdldChwcm9wKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlhZGFwdGVyLmV4cGFuZChzdHIsIGZvcmVpZ24pOwotCQkJCWZvcmVpZ24uc2V0KHByb3AuZ2V0TmFtZSgpLCAiIik7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRGVzY2VuZGFudHMoUHJvcENNUHJvcGVydHkgcHJvcCkgewotCQlpZiAocHJvcC5pc1Nob3J0aGFuZCgpKSB7Ci0JCQkvLyByZW1vdmUgcHJvcGVydGllcwotCQkJaW50IG4gPSBwcm9wLmdldE51bUNoaWxkKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBwcm9wLmdldENoaWxkQXQoaSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb3BDTVByb3BlcnR5KSB7Ci0JCQkJCXJlbW92ZURlc2NlbmRhbnRzKChQcm9wQ01Qcm9wZXJ0eSkgb2JqKTsKLQotCQkJCQlTdHJpbmcgc3RyID0gZ2V0KG9iai50b1N0cmluZygpKTsKLQkJCQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5sZW5ndGgoKSA+IDApCi0JCQkJCQlzZXQob2JqLnRvU3RyaW5nKCksICIiKTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXRNb2RpZmllZCgpIHsKLQkJaWYgKGZNb2RpZmllZCAhPSBudWxsKQotCQkJZk1vZGlmaWVkLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBwYWlyIG9mICdwcm9wJy8ndmFsdWUnLiBJZiBzaG9ydGhhbmQgcHJvcGVydGllcwotCSAqIHJlbGF0ZWQgdG8gJ3Byb3AnIGFyZSBhbHJlYWR5IGRlZmluZWQsIHRoZXkgd2lsbCBiZSBleHBhbmRlZCB0byBhdm9pZAotCSAqIHByb3BlcnR5IGNvbmZsaWN0aW9uLiBJZiBkZXNjZW5kYW50IHByb3BlcnRpZXMgb2YgJ3Byb3AnIGFyZSBhbHJlYWR5Ci0JICogZGVmaW5lZCwgdGhleSB3aWxsIGJlIHJlbW92ZWQgdG8gYXZvaWQgcHJvcGVydHkgY29uZmxpY3Rpb24uCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHkgcHJvcCwgamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wIGluc3RhbmNlb2YgUHJvcENNU3ViUHJvcGVydHkpIHsKLQkJCUlTdWJQcm9wZXJ0eUFkYXB0ZXIgYWRhcHRlciA9IChJU3ViUHJvcGVydHlBZGFwdGVyKSBzdWJQcm9wZXJ0eUFkYXB0ZXJzLmdldChwcm9wLmdldE5hbWUoKSk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlci5zZXQodGhpcywgdmFsdWUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlpZiAocHJvcC5nZXRTaG9ydGhhbmRDb250YWluZXJDb3VudCgpID4gMCkgewotCQkJLy8gZXhwYW5kIHNob3J0aGFuZCBwcm9wZXJ0eQotCQkJQ1NTUHJvcGVydHlDb250ZXh0IGNvbnRleHQgPSBuZXcgQ1NTUHJvcGVydHlDb250ZXh0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3AuZ2V0U2hvcnRoYW5kQ29udGFpbmVyQ291bnQoKTsgaSsrKSB7Ci0JCQkJcmVjdXJzaXZlRXh0cmFjdChwcm9wLnNob3J0aGFuZENvbnRhaW5lckF0KGkpLCBjb250ZXh0KTsKLQkJCX0KLQkJCUVudW1lcmF0aW9uIHByb3BlcnRpZXMgPSBjb250ZXh0LnByb3BlcnRpZXMoKTsKLQkJCXdoaWxlIChwcm9wZXJ0aWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIHByb3BGb3JlaWduID0gcHJvcGVydGllcy5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCk7Ci0JCQkJc2V0KHByb3BGb3JlaWduLCBjb250ZXh0LmdldChwcm9wRm9yZWlnbikpOwotCQkJfQotCQl9Ci0KLQkJcmVtb3ZlRGVzY2VuZGFudHMocHJvcCk7Ci0KLQkJc2V0KHByb3AuZ2V0TmFtZSgpLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBwYWlyIG9mICdwcm9wTmFtZScvJ3ZhbHVlJyByZWdhcmRsZXNzIG9mIGl0cwotCSAqIHNob3J0aGFuZCBwcm9wZXJ0aWVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldChTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBrZXkgPSBwcm9wTmFtZTsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlmUHJvcGVydGllcy5yZW1vdmUoa2V5KTsKLQkJZWxzZQotCQkJZlByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOwotCQlpZiAoZk1vZGlmaWVkID09IG51bGwpCi0JCQlmTW9kaWZpZWQgPSBuZXcgSGFzaFNldCgpOwotCQlmTW9kaWZpZWQuYWRkKGtleSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXppbXV0aChTdHJpbmcgYXppbXV0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQVpJTVVUSCksIGF6aW11dGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmQoU3RyaW5nIGJhY2tncm91bmQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHKSwgYmFja2dyb3VuZCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZEF0dGFjaG1lbnQoU3RyaW5nIGJhY2tncm91bmRBdHRhY2htZW50KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19BVFRBQ0hNRU5UKSwgYmFja2dyb3VuZEF0dGFjaG1lbnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRDb2xvcihTdHJpbmcgYmFja2dyb3VuZENvbG9yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19DT0xPUiksIGJhY2tncm91bmRDb2xvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZEltYWdlKFN0cmluZyBiYWNrZ3JvdW5kSW1hZ2UpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0lNQUdFKSwgYmFja2dyb3VuZEltYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kUG9zaXRpb24oU3RyaW5nIGJhY2tncm91bmRQb3NpdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUE9TSVRJT04pLCBiYWNrZ3JvdW5kUG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRQb3NpdGlvblgoamF2YS5sYW5nLlN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb25YKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKSwgYmFja2dyb3VuZFBvc2l0aW9uWCk7Ci0JCS8qCi0JCSAqIFN0cmluZyBuZXdWYWx1ZSA9IG51bGw7IFN0cmluZyB2YWxIID0gYmFja2dyb3VuZFBvc2l0aW9uWDsgU3RyaW5nCi0JCSAqIHZhbFYgPSBnZXRCYWNrZ3JvdW5kUG9zaXRpb25ZKCk7IGlmICh2YWxWID09IG51bGwgfHwKLQkJICogdmFsVi5sZW5ndGgoKT09IDApIG5ld1ZhbHVlID0gdmFsSDsgZWxzZSBpZiAodmFsSCA9PSBudWxsIHx8Ci0JCSAqIHZhbEgubGVuZ3RoKCkgPT0gMCkgeyBDb2xsZWN0aW9uIHZhbFggPQotCQkgKiBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCkuZ2V0VmFsdWVzKCk7Ci0JCSAqIENvbGxlY3Rpb24gdmFsWSA9Ci0JCSAqIFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKS5nZXRWYWx1ZXMoKTsKLQkJICogUHJvcENNVXRpbC5taW51cyh2YWxZLHZhbFgpOyBJdGVyYXRvciBpdCA9IHZhbFkuaXRlcmF0b3IoKTsKLQkJICogd2hpbGUoaXQuaGFzTmV4dCgpKSB7IE9iamVjdCBvYmogPSBpdC5uZXh0KCk7IGlmCi0JCSAqIChvYmoudG9TdHJpbmcoKS5lcXVhbHModmFsVi50b0xvd2VyQ2FzZSgpKSkgeyAvLyBuZWVkIG5vdAotCQkgKiBjb21wZW5zYXRlIGZvciAuLi4gbmV3VmFsdWUgPSB2YWxWOyBicmVhazsgfSB9IC8vIGNvbXBlbnNhdGUgZm9yCi0JCSAqIEhvcml6b250YWwgdmFsdWUgaWYgKG5ld1ZhbHVlID09IG51bGwpIG5ld1ZhbHVlID0gIjAlICIgKyB2YWxWOyB9Ci0JCSAqIGVsc2UgbmV3VmFsdWUgPSB2YWxIICsgIiAiICsgdmFsVjsgc2V0QmFja2dyb3VuZFBvc2l0aW9uKG5ld1ZhbHVlKTsKLQkJICovCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZFBvc2l0aW9uWShqYXZhLmxhbmcuU3RyaW5nIGJhY2tncm91bmRQb3NpdGlvblkpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpLCBiYWNrZ3JvdW5kUG9zaXRpb25ZKTsKLQkJLyoKLQkJICogU3RyaW5nIG5ld1ZhbHVlID0gbnVsbDsgU3RyaW5nIHZhbEggPSBnZXRCYWNrZ3JvdW5kUG9zaXRpb25YKCk7Ci0JCSAqIFN0cmluZyB2YWxWID0gYmFja2dyb3VuZFBvc2l0aW9uWTsgaWYgKHZhbFYgPT0gbnVsbCB8fAotCQkgKiB2YWxWLmxlbmd0aCgpPT0gMCkgbmV3VmFsdWUgPSB2YWxIOyBlbHNlIGlmICh2YWxIID09IG51bGwgfHwKLQkJICogdmFsSC5sZW5ndGgoKSA9PSAwKSB7IENvbGxlY3Rpb24gdmFsWCA9Ci0JCSAqIFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKS5nZXRWYWx1ZXMoKTsKLQkJICogQ29sbGVjdGlvbiB2YWxZID0KLQkJICogUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpLmdldFZhbHVlcygpOwotCQkgKiBQcm9wQ01VdGlsLm1pbnVzKHZhbFksdmFsWCk7IEl0ZXJhdG9yIGl0ID0gdmFsWS5pdGVyYXRvcigpOwotCQkgKiB3aGlsZShpdC5oYXNOZXh0KCkpIHsgT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsgaWYKLQkJICogKG9iai50b1N0cmluZygpLmVxdWFscyh2YWxWLnRvTG93ZXJDYXNlKCkpKSB7IC8vIG5lZWQgbm90Ci0JCSAqIGNvbXBlbnNhdGUgZm9yIC4uLiBuZXdWYWx1ZSA9IHZhbFY7IGJyZWFrOyB9IH0gLy8gY29tcGVuc2F0ZSBmb3IKLQkJICogSG9yaXpvbnRhbCB2YWx1ZSBpZiAobmV3VmFsdWUgPT0gbnVsbCkgbmV3VmFsdWUgPSAiMCUgIiArIHZhbFY7IH0KLQkJICogZWxzZSBuZXdWYWx1ZSA9IHZhbEggKyAiICIgKyB2YWxWOyBzZXRCYWNrZ3JvdW5kUG9zaXRpb24obmV3VmFsdWUpOwotCQkgKi8KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kUmVwZWF0KFN0cmluZyBiYWNrZ3JvdW5kUmVwZWF0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19SRVBFQVQpLCBiYWNrZ3JvdW5kUmVwZWF0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXIoU3RyaW5nIGJvcmRlcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSKSwgYm9yZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJCb3R0b20oU3RyaW5nIGJvcmRlckJvdHRvbSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTSksIGJvcmRlckJvdHRvbSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyQm90dG9tQ29sb3IoU3RyaW5nIGJvcmRlckJvdHRvbUNvbG9yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX0NPTE9SKSwgYm9yZGVyQm90dG9tQ29sb3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckJvdHRvbVN0eWxlKFN0cmluZyBib3JkZXJCb3R0b21TdHlsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSksIGJvcmRlckJvdHRvbVN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJCb3R0b21XaWR0aChTdHJpbmcgYm9yZGVyQm90dG9tV2lkdGgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgpLCBib3JkZXJCb3R0b21XaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyQ29sbGFwc2UoU3RyaW5nIGJvcmRlckNvbGxhcHNlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQ09MTEFQU0UpLCBib3JkZXJDb2xsYXBzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyQ29sb3IoU3RyaW5nIGJvcmRlckNvbG9yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQ09MT1IpLCBib3JkZXJDb2xvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyTGVmdChTdHJpbmcgYm9yZGVyTGVmdCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlQpLCBib3JkZXJMZWZ0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJMZWZ0Q29sb3IoU3RyaW5nIGJvcmRlckxlZnRDb2xvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfQ09MT1IpLCBib3JkZXJMZWZ0Q29sb3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckxlZnRTdHlsZShTdHJpbmcgYm9yZGVyTGVmdFN0eWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9TVFlMRSksIGJvcmRlckxlZnRTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyTGVmdFdpZHRoKFN0cmluZyBib3JkZXJMZWZ0V2lkdGgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1dJRFRIKSwgYm9yZGVyTGVmdFdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJSaWdodChTdHJpbmcgYm9yZGVyUmlnaHQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVCksIGJvcmRlclJpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJSaWdodENvbG9yKFN0cmluZyBib3JkZXJSaWdodENvbG9yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IpLCBib3JkZXJSaWdodENvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJSaWdodFN0eWxlKFN0cmluZyBib3JkZXJSaWdodFN0eWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfU1RZTEUpLCBib3JkZXJSaWdodFN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJSaWdodFdpZHRoKFN0cmluZyBib3JkZXJSaWdodFdpZHRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfV0lEVEgpLCBib3JkZXJSaWdodFdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJTcGFjaW5nKFN0cmluZyBib3JkZXJTcGFjaW5nKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1BBQ0lORyksIGJvcmRlclNwYWNpbmcpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclN0eWxlKFN0cmluZyBib3JkZXJTdHlsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1NUWUxFKSwgYm9yZGVyU3R5bGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclRvcChTdHJpbmcgYm9yZGVyVG9wKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QKSwgYm9yZGVyVG9wKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJUb3BDb2xvcihTdHJpbmcgYm9yZGVyVG9wQ29sb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpLCBib3JkZXJUb3BDb2xvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyVG9wU3R5bGUoU3RyaW5nIGJvcmRlclRvcFN0eWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFKSwgYm9yZGVyVG9wU3R5bGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclRvcFdpZHRoKFN0cmluZyBib3JkZXJUb3BXaWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCksIGJvcmRlclRvcFdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJXaWR0aChTdHJpbmcgYm9yZGVyV2lkdGgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9XSURUSCksIGJvcmRlcldpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3R0b20oU3RyaW5nIGJvdHRvbSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9UVE9NKSwgYm90dG9tKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXB0aW9uU2lkZShTdHJpbmcgY2FwdGlvblNpZGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NBUFRJT05fU0lERSksIGNhcHRpb25TaWRlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGVhcihTdHJpbmcgY2xlYXIpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMRUFSKSwgY2xlYXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsaXAoU3RyaW5nIGNsaXApIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApLCBjbGlwKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGlwQm90dG9tKGphdmEubGFuZy5TdHJpbmcgY2xpcCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9CT1RUT00pLCBjbGlwKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGlwTGVmdChqYXZhLmxhbmcuU3RyaW5nIGNsaXApIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfTEVGVCksIGNsaXApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsaXBSaWdodChqYXZhLmxhbmcuU3RyaW5nIGNsaXApIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfUklHSFQpLCBjbGlwKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGlwVG9wKGphdmEubGFuZy5TdHJpbmcgY2xpcCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9UT1ApLCBjbGlwKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2xvcihTdHJpbmcgY29sb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPTE9SKSwgY29sb3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPTlRFTlQpLCBjb250ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3VudGVySW5jcmVtZW50KFN0cmluZyBjb3VudGVySW5jcmVtZW50KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT1VOVEVSX0lOQ1JFTUVOVCksIGNvdW50ZXJJbmNyZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvdW50ZXJSZXNldChTdHJpbmcgY291bnRlclJlc2V0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT1VOVEVSX1JFU0VUKSwgY291bnRlclJlc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDc3NGbG9hdChTdHJpbmcgY3NzRmxvYXQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZMT0FUKSwgY3NzRmxvYXQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1ZShTdHJpbmcgY3VlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUUpLCBjdWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1ZUFmdGVyKFN0cmluZyBjdWVBZnRlcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VFX0FGVEVSKSwgY3VlQWZ0ZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1ZUJlZm9yZShTdHJpbmcgY3VlQmVmb3JlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUVfQkVGT1JFKSwgY3VlQmVmb3JlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJzb3IoU3RyaW5nIGN1cnNvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VSU09SKSwgY3Vyc29yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXJlY3Rpb24oU3RyaW5nIGRpcmVjdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRElSRUNUSU9OKSwgZGlyZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5KFN0cmluZyBkaXNwbGF5KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9ESVNQTEFZKSwgZGlzcGxheSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxldmF0aW9uKFN0cmluZyBlbGV2YXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0VMRVZBVElPTiksIGVsZXZhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW1wdHlDZWxscyhTdHJpbmcgZW1wdHlDZWxscykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRU1QVFlfQ0VMTFMpLCBlbXB0eUNlbGxzKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250KFN0cmluZyBmb250KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UKSwgZm9udCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9udEZhbWlseShTdHJpbmcgZm9udEZhbWlseSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9GQU1JTFkpLCBmb250RmFtaWx5KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250U2l6ZShTdHJpbmcgZm9udFNpemUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU0laRSksIGZvbnRTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250U2l6ZUFkanVzdChTdHJpbmcgZm9udFNpemVBZGp1c3QpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU0laRV9BREpVU1QpLCBmb250U2l6ZUFkanVzdCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9udFN0cmV0Y2goU3RyaW5nIGZvbnRTdHJldGNoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUUkVUQ0gpLCBmb250U3RyZXRjaCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9udFN0eWxlKFN0cmluZyBmb250U3R5bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RZTEUpLCBmb250U3R5bGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvbnRWYXJpYW50KFN0cmluZyBmb250VmFyaWFudCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9WQVJJQU5UKSwgZm9udFZhcmlhbnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvbnRXZWlnaHQoU3RyaW5nIGZvbnRXZWlnaHQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfV0VJR0hUKSwgZm9udFdlaWdodCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGVpZ2h0KFN0cmluZyBoZWlnaHQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0hFSUdIVCksIGhlaWdodCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVmdChTdHJpbmcgbGVmdCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTEVGVCksIGxlZnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExldHRlclNwYWNpbmcoU3RyaW5nIGxldHRlclNwYWNpbmcpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xFVFRFUl9TUEFDSU5HKSwgbGV0dGVyU3BhY2luZyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGluZUhlaWdodChTdHJpbmcgbGluZUhlaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElORV9IRUlHSFQpLCBsaW5lSGVpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0U3R5bGUoU3RyaW5nIGxpc3RTdHlsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRSksIGxpc3RTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdFN0eWxlSW1hZ2UoU3RyaW5nIGxpc3RTdHlsZUltYWdlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX0lNQUdFKSwgbGlzdFN0eWxlSW1hZ2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RTdHlsZVBvc2l0aW9uKFN0cmluZyBsaXN0U3R5bGVQb3NpdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9QT1NJVElPTiksIGxpc3RTdHlsZVBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0U3R5bGVUeXBlKFN0cmluZyBsaXN0U3R5bGVUeXBlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1RZUEUpLCBsaXN0U3R5bGVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXJnaW4oU3RyaW5nIG1hcmdpbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOKSwgbWFyZ2luKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXJnaW5Cb3R0b20oU3RyaW5nIG1hcmdpbkJvdHRvbSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0JPVFRPTSksIG1hcmdpbkJvdHRvbSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFyZ2luTGVmdChTdHJpbmcgbWFyZ2luTGVmdCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0xFRlQpLCBtYXJnaW5MZWZ0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXJnaW5SaWdodChTdHJpbmcgbWFyZ2luUmlnaHQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9SSUdIVCksIG1hcmdpblJpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXJnaW5Ub3AoU3RyaW5nIG1hcmdpblRvcCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1RPUCksIG1hcmdpblRvcCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFya2VyT2Zmc2V0KFN0cmluZyBtYXJrZXJPZmZzZXQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUktFUl9PRkZTRVQpLCBtYXJrZXJPZmZzZXQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcmtzKFN0cmluZyBtYXJrcykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSS1MpLCBtYXJrcyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWF4SGVpZ2h0KFN0cmluZyBtYXhIZWlnaHQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BWF9IRUlHSFQpLCBtYXhIZWlnaHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1heFdpZHRoKFN0cmluZyBtYXhXaWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFYX1dJRFRIKSwgbWF4V2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbkhlaWdodChTdHJpbmcgbWluSGVpZ2h0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NSU5fSEVJR0hUKSwgbWluSGVpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaW5XaWR0aChTdHJpbmcgbWluV2lkdGgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01JTl9XSURUSCksIG1pbldpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPcnBoYW5zKFN0cmluZyBvcnBoYW5zKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PUlBIQU5TKSwgb3JwaGFucyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0bGluZShTdHJpbmcgb3V0bGluZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORSksIG91dGxpbmUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dGxpbmVDb2xvcihTdHJpbmcgb3V0bGluZUNvbG9yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX0NPTE9SKSwgb3V0bGluZUNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdXRsaW5lU3R5bGUoU3RyaW5nIG91dGxpbmVTdHlsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9TVFlMRSksIG91dGxpbmVTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0bGluZVdpZHRoKFN0cmluZyBvdXRsaW5lV2lkdGgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfV0lEVEgpLCBvdXRsaW5lV2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJmbG93KFN0cmluZyBvdmVyZmxvdykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1ZFUkZMT1cpLCBvdmVyZmxvdyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFkZGluZyhTdHJpbmcgcGFkZGluZykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElORyksIHBhZGRpbmcpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZGRpbmdCb3R0b20oU3RyaW5nIHBhZGRpbmdCb3R0b20pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfQk9UVE9NKSwgcGFkZGluZ0JvdHRvbSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFkZGluZ0xlZnQoU3RyaW5nIHBhZGRpbmdMZWZ0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0xFRlQpLCBwYWRkaW5nTGVmdCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFkZGluZ1JpZ2h0KFN0cmluZyBwYWRkaW5nUmlnaHQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfUklHSFQpLCBwYWRkaW5nUmlnaHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZGRpbmdUb3AoU3RyaW5nIHBhZGRpbmdUb3ApIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfVE9QKSwgcGFkZGluZ1RvcCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFnZShTdHJpbmcgcGFnZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRSksIHBhZ2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZ2VCcmVha0FmdGVyKFN0cmluZyBwYWdlQnJlYWtBZnRlcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRV9CUkVBS19BRlRFUiksIHBhZ2VCcmVha0FmdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWdlQnJlYWtCZWZvcmUoU3RyaW5nIHBhZ2VCcmVha0JlZm9yZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRV9CUkVBS19CRUZPUkUpLCBwYWdlQnJlYWtCZWZvcmUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZ2VCcmVha0luc2lkZShTdHJpbmcgcGFnZUJyZWFrSW5zaWRlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFX0JSRUFLX0lOU0lERSksIHBhZ2VCcmVha0luc2lkZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGF1c2UoU3RyaW5nIHBhdXNlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQVVTRSksIHBhdXNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXVzZUFmdGVyKFN0cmluZyBwYXVzZUFmdGVyKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQVVTRV9BRlRFUiksIHBhdXNlQWZ0ZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhdXNlQmVmb3JlKFN0cmluZyBwYXVzZUJlZm9yZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFVU0VfQkVGT1JFKSwgcGF1c2VCZWZvcmUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBpdGNoKFN0cmluZyBwaXRjaCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUElUQ0gpLCBwaXRjaCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGl0Y2hSYW5nZShTdHJpbmcgcGl0Y2hSYW5nZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUElUQ0hfUkFOR0UpLCBwaXRjaFJhbmdlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQbGF5RHVyaW5nKFN0cmluZyBwbGF5RHVyaW5nKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QTEFZX0RVUklORyksIHBsYXlEdXJpbmcpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc2l0aW9uKFN0cmluZyBwb3NpdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUE9TSVRJT04pLCBwb3NpdGlvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UXVvdGVzKFN0cmluZyBxdW90ZXMpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1FVT1RFUyksIHF1b3Rlcyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmljaG5lc3MoU3RyaW5nIHJpY2huZXNzKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9SSUNITkVTUyksIHJpY2huZXNzKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSaWdodChTdHJpbmcgcmlnaHQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1JJR0hUKSwgcmlnaHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpemUoU3RyaW5nIHNpemUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NJWkUpLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGVhayhTdHJpbmcgc3BlYWspIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLKSwgc3BlYWspOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwZWFrSGVhZGVyKFN0cmluZyBzcGVha0hlYWRlcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUtfSEVBREVSKSwgc3BlYWtIZWFkZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwZWFrTnVtZXJhbChTdHJpbmcgc3BlYWtOdW1lcmFsKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBS19OVU1FUkFMKSwgc3BlYWtOdW1lcmFsKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGVha1B1bmN0dWF0aW9uKFN0cmluZyBzcGVha1B1bmN0dWF0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBS19QVU5DVFVBVElPTiksIHNwZWFrUHVuY3R1YXRpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwZWVjaFJhdGUoU3RyaW5nIHNwZWVjaFJhdGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUVDSF9SQVRFKSwgc3BlZWNoUmF0ZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RyZXNzKFN0cmluZyBzdHJlc3MpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NUUkVTUyksIHN0cmVzcyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFibGVMYXlvdXQoU3RyaW5nIHRhYmxlTGF5b3V0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9UQUJMRV9MQVlPVVQpLCB0YWJsZUxheW91dCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dEFsaWduKFN0cmluZyB0ZXh0QWxpZ24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfQUxJR04pLCB0ZXh0QWxpZ24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHREZWNvcmF0aW9uKFN0cmluZyB0ZXh0RGVjb3JhdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9ERUNPUkFUSU9OKSwgdGV4dERlY29yYXRpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRJbmRlbnQoU3RyaW5nIHRleHRJbmRlbnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfSU5ERU5UKSwgdGV4dEluZGVudCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFNoYWRvdyhTdHJpbmcgdGV4dFNoYWRvdykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9TSEFET1cpLCB0ZXh0U2hhZG93KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0VHJhbnNmb3JtKFN0cmluZyB0ZXh0VHJhbnNmb3JtKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX1RSQU5TRk9STSksIHRleHRUcmFuc2Zvcm0pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvcChTdHJpbmcgdG9wKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9UT1ApLCB0b3ApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuaWNvZGVCaWRpKFN0cmluZyB1bmljb2RlQmlkaSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVU5JQ09ERV9CSURJKSwgdW5pY29kZUJpZGkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnRpY2FsQWxpZ24oU3RyaW5nIHZlcnRpY2FsQWxpZ24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZFUlRJQ0FMX0FMSUdOKSwgdmVydGljYWxBbGlnbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmlzaWJpbGl0eShTdHJpbmcgdmlzaWJpbGl0eSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVklTSUJJTElUWSksIHZpc2liaWxpdHkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZvaWNlRmFtaWx5KFN0cmluZyB2b2ljZUZhbWlseSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVk9JQ0VfRkFNSUxZKSwgdm9pY2VGYW1pbHkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZvbHVtZShTdHJpbmcgdm9sdW1lKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WT0xVTUUpLCB2b2x1bWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdoaXRlU3BhY2UoU3RyaW5nIHdoaXRlU3BhY2UpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dISVRFX1NQQUNFKSwgd2hpdGVTcGFjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2lkb3dzKFN0cmluZyB3aWRvd3MpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dJRE9XUyksIHdpZG93cyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2lkdGgoU3RyaW5nIHdpZHRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XSURUSCksIHdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JkU3BhY2luZyhTdHJpbmcgd29yZFNwYWNpbmcpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dPUkRfU1BBQ0lORyksIHdvcmRTcGFjaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRaSW5kZXgoU3RyaW5nIHpJbmRleCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfWl9JTkRFWCksIHpJbmRleCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBCb3R0b21TdWJTdHlsZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwQm90dG9tU3ViU3R5bGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMGRhZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBCb3R0b21TdWJTdHlsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVN1YlByb3BlcnR5OwotCi0vKioKLSAqIEZvciBib3R0b20gdmFsdWUgb2YgJ2NsaXAnIHByb3BlcnR5J3MgcmVjdCgpIGZ1bmN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGlwQm90dG9tU3ViU3R5bGVBZGFwdGVyIGV4dGVuZHMgQ2xpcFN1YlN0eWxlQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ2xpcEJvdHRvbVN1YlN0eWxlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0KG9yZy53M2MuZG9tLmNzcy5SZWN0IHJlY3QpIHsKLQkJcmV0dXJuIHJlY3QuZ2V0Qm90dG9tKCkuZ2V0Q3NzVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBpbmRleCgpIHsKLQkJcmV0dXJuIDI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlTdHJpbmcgdG9wID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfVE9QKSk7Ci0JCVN0cmluZyByaWdodCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1JJR0hUKSk7Ci0JCVN0cmluZyBsZWZ0ID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfTEVGVCkpOwotCi0JCXNldChwcm9wZXJ0aWVzLCB0b3AsIHJpZ2h0LCB2YWx1ZSwgbGVmdCwgdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA9PSAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcExlZnRTdWJTdHlsZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwTGVmdFN1YlN0eWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODJiOTk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwTGVmdFN1YlN0eWxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNU3ViUHJvcGVydHk7Ci0KLS8qKgotICogRm9yIGxlZnQgdmFsdWUgb2YgJ2NsaXAnIHByb3BlcnR5J3MgcmVjdCgpIGZ1bmN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGlwTGVmdFN1YlN0eWxlQWRhcHRlciBleHRlbmRzIENsaXBTdWJTdHlsZUFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENsaXBMZWZ0U3ViU3R5bGVBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXQob3JnLnczYy5kb20uY3NzLlJlY3QgcmVjdCkgewotCQlyZXR1cm4gcmVjdC5nZXRMZWZ0KCkuZ2V0Q3NzVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBpbmRleCgpIHsKLQkJcmV0dXJuIDM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlTdHJpbmcgdG9wID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfVE9QKSk7Ci0JCVN0cmluZyByaWdodCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1JJR0hUKSk7Ci0JCVN0cmluZyBib3R0b20gPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9CT1RUT00pKTsKLQotCQlzZXQocHJvcGVydGllcywgdG9wLCByaWdodCwgYm90dG9tLCB2YWx1ZSwgdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA9PSAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcFJpZ2h0U3ViU3R5bGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcFJpZ2h0U3ViU3R5bGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZDFlMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBSaWdodFN1YlN0eWxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNU3ViUHJvcGVydHk7Ci0KLS8qKgotICogRm9yIHJpZ2h0IHZhbHVlIG9mICdjbGlwJyBwcm9wZXJ0eSdzIHJlY3QoKSBmdW5jdGlvbgotICovCi1wdWJsaWMgY2xhc3MgQ2xpcFJpZ2h0U3ViU3R5bGVBZGFwdGVyIGV4dGVuZHMgQ2xpcFN1YlN0eWxlQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ2xpcFJpZ2h0U3ViU3R5bGVBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXQob3JnLnczYy5kb20uY3NzLlJlY3QgcmVjdCkgewotCQlyZXR1cm4gcmVjdC5nZXRSaWdodCgpLmdldENzc1RleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgaW5kZXgoKSB7Ci0JCXJldHVybiAxOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvcCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1RPUCkpOwotCQlTdHJpbmcgYm90dG9tID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfQk9UVE9NKSk7Ci0JCVN0cmluZyBsZWZ0ID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfTEVGVCkpOwotCi0JCXNldChwcm9wZXJ0aWVzLCB0b3AsIHZhbHVlLCBib3R0b20sIGxlZnQsIHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBTdWJTdHlsZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwU3ViU3R5bGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZTk2YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBTdWJTdHlsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5JVmFsSUQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5SZWN0OwotCi0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgZm9yIGNsaXAgc3ViLXByb3BlcnRpZXMKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIENsaXBTdWJTdHlsZUFkYXB0ZXIgaW1wbGVtZW50cyBJU3ViUHJvcGVydHlBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDbGlwU3ViU3R5bGVBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCVN0cmluZyBzdHIgPSBudWxsOwotCQlPYmplY3Qgb2JqID0gcHJvcGVydGllcy5nZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApKTsKLQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uY3NzLlJlY3QpIHsKLQkJCQlzdHIgPSBnZXQoKG9yZy53M2MuZG9tLmNzcy5SZWN0KSBvYmopOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElDU1NWYWx1ZSkgewotCQkJCQlzdHIgPSAoKElDU1NWYWx1ZSkgb2JqKS5nZXRDU1NWYWx1ZVRleHQoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXN0ciA9IG9iai50b1N0cmluZygpOwotCQkJCX0KLQkJCQlzdHIgPSBzdHIudHJpbSgpLnRvTG93ZXJDYXNlKCk7Ci0JCQkJaW50IHBvcyA9IHN0ci5pbmRleE9mKCJyZWN0KCIpOy8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocG9zID49IDApIHsKLQkJCQkJU3RyaW5nIHN1YlN0ciA9IG51bGw7Ci0JCQkJCXBvcyArPSA1OwotCQkJCQlpbnQgaSA9IDA7Ci0JCQkJCWRvIHsKLQkJCQkJCWludCBwb3NFbmQgPSBzdHIuaW5kZXhPZigiLCIsIHBvcyk7Ly8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKHBvc0VuZCA8IDApCi0JCQkJCQkJcG9zRW5kID0gc3RyLmluZGV4T2YoIikiLCBwb3MpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChwb3NFbmQgPCAwICYmIHBvcyA8IHN0ci5sZW5ndGgoKSkKLQkJCQkJCQlwb3NFbmQgPSBzdHIubGVuZ3RoKCk7Ci0JCQkJCQlpZiAocG9zRW5kID49IHBvcykgewotCQkJCQkJCXN1YlN0ciA9IHN0ci5zdWJzdHJpbmcocG9zLCBwb3NFbmQpOwotCQkJCQkJCXBvcyA9IHBvc0VuZCArIDE7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQkJcG9zID0gLTE7Ci0JCQkJCX0KLQkJCQkJd2hpbGUgKGkrKyA8IGluZGV4KCkgJiYgcG9zID4gMCk7Ci0KLQkJCQkJaWYgKHBvcyA+IDApCi0JCQkJCQlzdHIgPSBzdWJTdHIudHJpbSgpOwotCQkJCQllbHNlCi0JCQkJCQlzdHIgPSBudWxsOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXN0ciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChzdHIgIT0gbnVsbCkgPyBzdHIgOiAiIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JYWJzdHJhY3QgU3RyaW5nIGdldChSZWN0IHJlY3QpOwotCi0JLyoqCi0JICogCi0JICovCi0JYWJzdHJhY3QgaW50IGluZGV4KCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMjAwMS8xMC8wNAotCSAqIDE5OjI1OjQ2KQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5kZWNsYXJhdGlvbi5JQ1NTMlByb3BlcnRpZXMKLQkgKiBAcGFyYW0gdG9wCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHJpZ2h0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGJvdHRvbQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBsZWZ0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHJlbW92ZUNoZWNrCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0Jdm9pZCBzZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyB0b3AsIFN0cmluZyByaWdodCwgU3RyaW5nIGJvdHRvbSwgU3RyaW5nIGxlZnQsIGJvb2xlYW4gcmVtb3ZlQ2hlY2spIHsKLQkJaWYgKHRvcCA9PSBudWxsIHx8IHRvcC5sZW5ndGgoKSA9PSAwKQotCQkJdG9wID0gSVZhbElELlZfQVVUTzsKLQkJaWYgKHJpZ2h0ID09IG51bGwgfHwgcmlnaHQubGVuZ3RoKCkgPT0gMCkKLQkJCXJpZ2h0ID0gSVZhbElELlZfQVVUTzsKLQkJaWYgKGJvdHRvbSA9PSBudWxsIHx8IGJvdHRvbS5sZW5ndGgoKSA9PSAwKQotCQkJYm90dG9tID0gSVZhbElELlZfQVVUTzsKLQkJaWYgKGxlZnQgPT0gbnVsbCB8fCBsZWZ0Lmxlbmd0aCgpID09IDApCi0JCQlsZWZ0ID0gSVZhbElELlZfQVVUTzsKLQotCQlpZiAocmVtb3ZlQ2hlY2sgJiYgdG9wLnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX0FVVE8pICYmIHJpZ2h0LnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX0FVVE8pICYmIGJvdHRvbS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9BVVRPKSAmJiBsZWZ0LnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX0FVVE8pKSB7Ci0JCQlwcm9wZXJ0aWVzLnNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCksIG51bGwpOwotCQl9Ci0JCWVsc2UKLQkJCXByb3BlcnRpZXMuc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTElQKSwgInJlY3QoIiArIHRvcCArICIsICIgKyByaWdodCArICIsICIgKyBib3R0b20gKyAiLCAiICsgbGVmdCArICIpIik7Ly8kTk9OLU5MUy01JC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcFRvcFN1YlN0eWxlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBUb3BTdWJTdHlsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE1YzEwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcFRvcFN1YlN0eWxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNU3ViUHJvcGVydHk7Ci0KLS8qKgotICogRm9yIHRvcCB2YWx1ZSBvZiAnY2xpcCcgcHJvcGVydHkncyByZWN0KCkgZnVuY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIENsaXBUb3BTdWJTdHlsZUFkYXB0ZXIgZXh0ZW5kcyBDbGlwU3ViU3R5bGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDbGlwVG9wU3ViU3R5bGVBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXQob3JnLnczYy5kb20uY3NzLlJlY3QgcmVjdCkgewotCQlyZXR1cm4gcmVjdC5nZXRUb3AoKS5nZXRDc3NUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGluZGV4KCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyByaWdodCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1JJR0hUKSk7Ci0JCVN0cmluZyBib3R0b20gPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9CT1RUT00pKTsKLQkJU3RyaW5nIGxlZnQgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9MRUZUKSk7Ci0KLQkJc2V0KHByb3BlcnRpZXMsIHZhbHVlLCByaWdodCwgYm90dG9tLCBsZWZ0LCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpID09IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Gb250U2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0ZvbnRTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlODQ4ZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0ZvbnRTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSVZhbElEOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2ZvbnQnIHByb3BlcnR5ICdmb250JyB3aWxsIGJlIGV4cGFuZGVkIHRvICdmb250LWZhbWlseScsICdmb250LXNpemUnLAotICogJ2ZvbnQtc3R5bGUnLCAnZm9udC12YXJpYW50JywgJ2ZvbnQtd2VpZ2h0JywgJ2xpbmUtaGVpZ2h0JywKLSAqLwotcHVibGljIGNsYXNzIEZvbnRTaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEZvbnRTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHN0eWxlID0gbnVsbCwgdmFyaWFudCA9IG51bGwsIHdlaWdodCA9IG51bGwsIHNpemUgPSBudWxsLCBoZWlnaHQgPSBudWxsLCBmYW1pbHkgPSBudWxsOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wRm9udCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wVmFyaWFudCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1ZBUklBTlQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2VpZ2h0ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfV0VJR0hUKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFNpemUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFKTsKLQkJYm9vbGVhbiBiTm9ybWFsU3BlY2lmaWVkID0gZmFsc2U7Ci0KLQkJaW50IGkgPSAwOwotCQlmb3IgKDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCS8vIGZpcnN0IG9mIGFsbCwgY2hlY2sgZm9udCBpZGVudHMKLQkJCQlpZiAoaSA9PSAwKSB7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvcEZvbnQuZ2V0TnVtQ2hpbGQoKTsgaisrKSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gcHJvcEZvbnQuZ2V0Q2hpbGRBdChpKTsKLQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcgJiYgdG9rZW5zW2ldLmltYWdlLmNvbXBhcmVUb0lnbm9yZUNhc2Uob2JqLnRvU3RyaW5nKCkpID09IDApCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIHZhbHVlICJub3JtYWwiIGlzIHNoYXJlZCAhIQotCQkJCWlmICh0b2tlbnNbaV0uaW1hZ2UuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9OT1JNQUwpKSB7Ci0JCQkJCWJOb3JtYWxTcGVjaWZpZWQgPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJZWxzZSBpZiAocHJvcFZhcmlhbnQuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQkJdmFyaWFudCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJZWxzZSBpZiAocHJvcFdlaWdodC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQl3ZWlnaHQgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCWVsc2UgaWYgKHByb3BTaXplLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkgewotCQkJCQkJc2l6ZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJCWJyZWFrOyAvLyBpZiBzaXplIGZvdW5kLCBicmVhayBsb29wCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSICYmIHdlaWdodCA9PSBudWxsICYmIHByb3BXZWlnaHQuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKSB7Ci0JCQkJd2VpZ2h0ID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UpIHsKLQkJCQlzaXplID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWJyZWFrOyAvLyBpZiBzaXplIGZvdW5kLCBicmVhayBsb29wCi0JCQl9Ci0JCX0KLQotCQlpZiAoYk5vcm1hbFNwZWNpZmllZCkgewotCQkJaWYgKHN0eWxlID09IG51bGwpCi0JCQkJc3R5bGUgPSBJVmFsSUQuVl9OT1JNQUw7Ci0JCQlpZiAodmFyaWFudCA9PSBudWxsKQotCQkJCXZhcmlhbnQgPSBJVmFsSUQuVl9OT1JNQUw7Ci0JCQlpZiAod2VpZ2h0ID09IG51bGwpCi0JCQkJd2VpZ2h0ID0gSVZhbElELlZfTk9STUFMOwotCQl9Ci0KLQkJLy8gc2tpcCB3aGl0ZXNwYWNlCi0JCWZvciAoaSsrOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdG9rZW5zW2ldLmtpbmQgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQkvLyBsaW5lLWhlaWdodCA/Ci0JCWlmIChpIDwgdG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgJiYgdG9rZW5zW2ldLmltYWdlLmVxdWFscygiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaSsrOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCQloZWlnaHQgPSB0b2tlbnNbaSsrXS5pbWFnZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gZm9udC1mYW1pbHkKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yICg7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJfQotCQlmYW1pbHkgPSBidWYudG9TdHJpbmcoKS50cmltKCk7Ci0KLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUWUxFLCBzdHlsZSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfRk9OVF9WQVJJQU5ULCB2YXJpYW50KTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9GT05UX1dFSUdIVCwgd2VpZ2h0KTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9GT05UX1NJWkUsIHNpemUpOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0xJTkVfSEVJR0hULCBoZWlnaHQpOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfRkFNSUxZLCBmYW1pbHkpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgc3R5bGUgPSBudWxsLCB2YXJpYW50ID0gbnVsbCwgd2VpZ2h0ID0gbnVsbCwgc2l6ZSA9IG51bGwsIGhlaWdodCA9IG51bGwsIGZhbWlseSA9IG51bGw7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BGb250ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BWYXJpYW50ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfVkFSSUFOVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXZWlnaHQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9XRUlHSFQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU2l6ZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NJWkUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wSGVpZ2h0ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJTkVfSEVJR0hUKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcEZhbWlseSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX0ZBTUlMWSk7Ci0JCWJvb2xlYW4gYk5vcm1hbFNwZWNpZmllZCA9IGZhbHNlOwotCi0JCWludCBpID0gMDsKLQkJZm9yICg7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQkvLyBmaXJzdCBvZiBhbGwsIGNoZWNrIGZvbnQgaWRlbnRzCi0JCQkJaWYgKGkgPT0gMCkgewotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHByb3BGb250LmdldE51bUNoaWxkKCk7IGorKykgewotCQkJCQkJT2JqZWN0IG9iaiA9IHByb3BGb250LmdldENoaWxkQXQoaSk7Ci0JCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nICYmIHRva2Vuc1tpXS5pbWFnZS5jb21wYXJlVG9JZ25vcmVDYXNlKG9iai50b1N0cmluZygpKSA9PSAwKQotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIHZhbHVlICJub3JtYWwiIGlzIHNoYXJlZCAhIQotCQkJCWlmICh0b2tlbnNbaV0uaW1hZ2UuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9OT1JNQUwpKSB7Ci0JCQkJCWJOb3JtYWxTcGVjaWZpZWQgPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJZWxzZSBpZiAocHJvcFZhcmlhbnQuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQkJdmFyaWFudCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJZWxzZSBpZiAocHJvcFdlaWdodC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQl3ZWlnaHQgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCWVsc2UgaWYgKHByb3BTaXplLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkgewotCQkJCQkJc2l6ZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJCWJyZWFrOyAvLyBpZiBzaXplIGZvdW5kLCBicmVhayBsb29wCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSICYmIHdlaWdodCA9PSBudWxsICYmIHByb3BXZWlnaHQuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKSB7Ci0JCQkJd2VpZ2h0ID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UpIHsKLQkJCQlzaXplID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWJyZWFrOyAvLyBpZiBzaXplIGZvdW5kLCBicmVhayBsb29wCi0JCQl9Ci0JCX0KLQotCQlpZiAoYk5vcm1hbFNwZWNpZmllZCkgewotCQkJaWYgKHN0eWxlID09IG51bGwpCi0JCQkJc3R5bGUgPSBJVmFsSUQuVl9OT1JNQUw7Ci0JCQlpZiAodmFyaWFudCA9PSBudWxsKQotCQkJCXZhcmlhbnQgPSBJVmFsSUQuVl9OT1JNQUw7Ci0JCQlpZiAod2VpZ2h0ID09IG51bGwpCi0JCQkJd2VpZ2h0ID0gSVZhbElELlZfTk9STUFMOwotCQl9Ci0KLQkJLy8gc2tpcCB3aGl0ZXNwYWNlCi0JCWZvciAoaSsrOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdG9rZW5zW2ldLmtpbmQgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQkvLyBsaW5lLWhlaWdodCA/Ci0JCWlmIChpIDwgdG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgJiYgdG9rZW5zW2ldLmltYWdlLmVxdWFscygiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaSsrOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCQloZWlnaHQgPSB0b2tlbnNbaSsrXS5pbWFnZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gZm9udC1mYW1pbHkKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yICg7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJfQotCQlmYW1pbHkgPSBidWYudG9TdHJpbmcoKS50cmltKCk7Ci0KLQkJaWYgKHByb3BTdHlsZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBzdHlsZTsKLQkJZWxzZSBpZiAocHJvcFZhcmlhbnQgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gdmFyaWFudDsKLQkJZWxzZSBpZiAocHJvcFdlaWdodCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiB3ZWlnaHQ7Ci0JCWVsc2UgaWYgKHByb3BTaXplID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHNpemU7Ci0JCWVsc2UgaWYgKHByb3BIZWlnaHQgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gaGVpZ2h0OwotCQllbHNlIGlmIChwcm9wRmFtaWx5ID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGZhbWlseTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0lDU1MyUHJvcGVydGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0lDU1MyUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmY2NDMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9JQ1NTMlByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1MyUHJvcGVydGllczsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1MyUHJvcGVydGllcyBleHRlbmRzIENTUzJQcm9wZXJ0aWVzIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgYXBwbHlGdWxsKElDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wpOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBhcHBseU1vZGlmaWVkKElDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wpOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldChQcm9wQ01Qcm9wZXJ0eSBwcm9wKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXRCYWNrZ3JvdW5kUG9zaXRpb25YKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0QmFja2dyb3VuZFBvc2l0aW9uWSgpOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldENsaXBCb3R0b20oKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXRDbGlwTGVmdCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldENsaXBSaWdodCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldENsaXBUb3AoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNNb2RpZmllZCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JRW51bWVyYXRpb24gcHJvcGVydGllcygpOwotCi0JLyoqCi0JICogCi0JICovCi0JSXRlcmF0b3IgcHJvcGVydGllc01vZGlmaWVkKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHJlc2V0TW9kaWZpZWQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0KFByb3BDTVByb3BlcnR5IHByb3AsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0QmFja2dyb3VuZFBvc2l0aW9uWChTdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRCYWNrZ3JvdW5kUG9zaXRpb25ZKFN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldENsaXBCb3R0b20oU3RyaW5nIGJhY2tncm91bmRQb3NpdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0Q2xpcExlZnQoU3RyaW5nIGJhY2tncm91bmRQb3NpdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0Q2xpcFJpZ2h0KFN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldENsaXBUb3AoU3RyaW5nIGJhY2tncm91bmRQb3NpdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9JU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0lTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZDQwNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0lTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vSVN1YlByb3BlcnR5QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0lTdWJQcm9wZXJ0eUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE2OWYwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vSVN1YlByb3BlcnR5QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3ViUHJvcGVydHlBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMpOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9MaXN0U3R5bGVTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vTGlzdFN0eWxlU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzEzMjc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9MaXN0U3R5bGVTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2xpc3Qtc3R5bGUnIHByb3BlcnR5ICdsaXN0LXN0eWxlJyB3aWxsIGJlIGV4cGFuZGVkIHRvCi0gKiAnbGlzdC1zdHlsZS1pbWFnZScsICdsaXN0LXN0eWxlLXBvc2l0aW9uJywgJ2xpc3Qtc3R5bGUtdHlwZScsCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0U3R5bGVTaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIExpc3RTdHlsZVNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgaW1hZ2UgPSAiIiwgcG9zID0gIiIsIHR5cGUgPSAiIjsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJUHJvcENNUHJvcGVydHkgcHJvcFBvcyA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1BPU0lUSU9OKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFR5cGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9UWVBFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcEltYWdlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfSU1BR0UpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BQb3MuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlwb3MgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSB7IC8vIHZhbHVlPSJub25lIiBpcyBzaGFyZWQgISEKLQkJCQkJaWYgKHByb3BUeXBlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCXR5cGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCWlmIChwcm9wSW1hZ2UuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQkJaW1hZ2UgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSkgewotCQkJCWltYWdlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQl9Ci0KLQkJZGVzdC5zZXQocHJvcFBvcy5nZXROYW1lKCksIHBvcyk7Ci0JCWRlc3Quc2V0KHByb3BUeXBlLmdldE5hbWUoKSwgdHlwZSk7Ci0JCWRlc3Quc2V0KHByb3BJbWFnZS5nZXROYW1lKCksIGltYWdlKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGltYWdlID0gbnVsbCwgcG9zID0gbnVsbCwgdHlwZSA9IG51bGw7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BQb3MgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9QT1NJVElPTik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BUeXBlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfVFlQRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BJbWFnZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX0lNQUdFKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wUG9zLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJcG9zID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgeyAvLyB2YWx1ZT0ibm9uZSIgaXMgc2hhcmVkICEhCi0JCQkJCWlmIChwcm9wVHlwZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQl0eXBlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCQlpZiAocHJvcEltYWdlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCWltYWdlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkpIHsKLQkJCQlpbWFnZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9wUG9zID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHBvczsKLQkJZWxzZSBpZiAocHJvcFR5cGUgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gdHlwZTsKLQkJZWxzZSBpZiAocHJvcEltYWdlID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGltYWdlOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vTWFyZ2luU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL01hcmdpblNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjZjFlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vTWFyZ2luU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdtYXJnaW4nIHByb3BlcnR5ICdtYXJnaW4nIHdpbGwgYmUgZXhwYW5kZWQgdG8gJ21hcmdpbi10b3AnLAotICogJ21hcmdpbi1yaWdodCcsICdtYXJnaW4tYm90dG9tJywgJ21hcmdpbi1sZWZ0JywKLSAqLwotcHVibGljIGNsYXNzIE1hcmdpblNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTWFyZ2luU2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZ1tdIGlkZW50cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UpCi0JCQkJaWRlbnRzW2orK10gPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQlpZiAoaiA9PSA0KQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJU3RyaW5nW10gZGVzdHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgaWYgKGogPT0gMSkgewotCQkJZGVzdHNbMF0gPSBkZXN0c1sxXSA9IGRlc3RzWzJdID0gZGVzdHNbM10gPSBpZGVudHNbMF07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAyKSB7Ci0JCQlkZXN0c1swXSA9IGRlc3RzWzJdID0gaWRlbnRzWzBdOwotCQkJZGVzdHNbMV0gPSBkZXN0c1szXSA9IGlkZW50c1sxXTsKLQkJfQotCQllbHNlIGlmIChqID09IDMpIHsKLQkJCWRlc3RzWzBdID0gaWRlbnRzWzBdOwotCQkJZGVzdHNbMV0gPSBkZXN0c1szXSA9IGlkZW50c1sxXTsKLQkJCWRlc3RzWzJdID0gaWRlbnRzWzJdOwotCQl9Ci0JCWVsc2UgewotCQkJZm9yIChpbnQgayA9IDA7IGsgPCA0OyBrKyspCi0JCQkJZGVzdHNba10gPSBpZGVudHNba107Ci0JCX0KLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fVE9QLCBkZXN0c1swXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1JJR0hULCBkZXN0c1sxXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0JPVFRPTSwgZGVzdHNbMl0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9MRUZULCBkZXN0c1szXSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGogPT0gMSkKLQkJCXJldHVybiBpZGVudHNbMF07Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9UT1AgfHwgcHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0JPVFRPTSkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1RPUCkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0JPVFRPTSkKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1RPUCkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1JJR0hUKQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fQk9UVE9NKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fTEVGVCkKLQkJCQlyZXR1cm4gaWRlbnRzWzNdOwotCQkJZWxzZQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL1BhZGRpbmdTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vUGFkZGluZ1Nob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UyNDM2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vUGFkZGluZ1Nob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAncGFkZGluZycgcHJvcGVydHkgJ3BhZGRpbmcnIHdpbGwgYmUgZXhwYW5kZWQgdG8gJ3BhZGRpbmctdG9wJywKLSAqICdwYWRkaW5nLXJpZ2h0JywgJ3BhZGRpbmctYm90dG9tJywgJ3BhZGRpbmctbGVmdCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWRkaW5nU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBQYWRkaW5nU2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZ1tdIGlkZW50cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlTdHJpbmdbXSBkZXN0cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWlmIChqID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSBpZiAoaiA9PSAxKSB7Ci0JCQlkZXN0c1swXSA9IGRlc3RzWzFdID0gZGVzdHNbMl0gPSBkZXN0c1szXSA9IGlkZW50c1swXTsKLQkJfQotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMl0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJZGVzdHNbMF0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQkJZGVzdHNbMl0gPSBpZGVudHNbMl07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKykKLQkJCQlkZXN0c1trXSA9IGlkZW50c1trXTsKLQkJfQotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfVE9QLCBkZXN0c1swXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfUEFERElOR19SSUdIVCwgZGVzdHNbMV0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfQk9UVE9NLCBkZXN0c1syXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfUEFERElOR19MRUZULCBkZXN0c1szXSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZ1tdIGlkZW50cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGogPT0gMSkKLQkJCXJldHVybiBpZGVudHNbMF07Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfVE9QIHx8IHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfQk9UVE9NKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJfQotCQllbHNlIGlmIChqID09IDMpIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1RPUCkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfUEFERElOR19CT1RUT00pCi0JCQkJcmV0dXJuIGlkZW50c1syXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfVE9QKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1JJR0hUKQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0JPVFRPTSkKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfUEFERElOR19MRUZUKQotCQkJCXJldHVybiBpZGVudHNbM107Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9WYWx1ZURhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9WYWx1ZURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUyODJmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vVmFsdWVEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVmFsdWVEYXRhIHsKLQotCXB1YmxpYyBTdHJpbmcgdmFsdWU7Ci0JcHVibGljIGJvb2xlYW4gaW1wb3J0YW50ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgVmFsdWVEYXRhKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBWYWx1ZURhdGEoU3RyaW5nIHZhbCwgYm9vbGVhbiBpbXApIHsKLQkJc3VwZXIoKTsKLQkJdmFsdWUgPSB2YWw7Ci0JCWltcG9ydGFudCA9IGltcDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS90ZXh0L0lDU1NQYXJ0aXRpb25zLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3RleHQvSUNTU1BhcnRpdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA2YWZjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3RleHQvSUNTU1BhcnRpdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudGV4dDsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4gSXQgZGVmaW5lcyB0aGUKLSAqIHBhcnRpdGlvbmluZyBmb3IgQ1NTIGFuZCBhbGwgaXRzIHBhcnRpdGlvbnMuIENsaWVudHMgc2hvdWxkIHJlZmVyZW5jZSB0aGUKLSAqIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1BhcnRpdGlvbnMgewotCi0JU3RyaW5nIFNUWUxFID0gIm9yZy5lY2xpcHNlLndzdC5jc3MuU1RZTEUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yzg2MjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIiAvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iCi0JCXBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL3czYy9kb20vY3NzLyoqLyoiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS8qKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlLyoqIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvKioiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9zc2UvdWkvKioiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC94bWwvdWkvKioiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvKioiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9TdHlsZUFkYXB0ZXJGYWN0b3J5IiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lDb250ZW50U2V0dGluZ3MiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vY29tcG9uZW50Y29yZS9pbnRlcm5hbC91dGlsL0lNb2R1bGVDb25zdGFudHMiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC91dGlsL2VtZi93b3JrYmVuY2gvbmxzL0VNRldvcmtiZW5jaFJlc291cmNlSGFuZGxlciIgLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iCi0JCXBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIiAvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDM3ZjhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1jc3NlZGl0b3IuamFyCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1kZXYucHJvcGVydGllcwotYmluCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZjBiNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9wcm9qZWN0aW9ucGVyZj1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDIwMzVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jc3MudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE3NGMxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotI1dlZCBNYXIgMjggMDM6MjA6NDEgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWM3YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzUyMmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZjMwZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jc3MudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4zMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmF1dG9lZGl0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0LnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmhhbmRsZXJzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5pbWFnZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5yZWdpc3RyeTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc2VsZWN0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5zdHlsZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC53aXphcmQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkudmlld3MucHJvcGVydGllcwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkudmlld3M7YnVuZGxlLXZlcnNpb249IlszLjMuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC40MDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4yLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuOC4xLDQuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YWM5NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICB0ZW1wbGF0ZXMvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCi1zb3VyY2UuLiA9IHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3Y3NzX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2Nzc193aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTRmNzUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3Y3NzX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2Nzc193aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdjc3Nfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIyODdhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2Nzc193aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXVyYWxfcHJvcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXVyYWxfcHJvcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjE3MDRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2F1cmFsX3Byb3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2JveG1vZGVsX3Byb3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2JveG1vZGVsX3Byb3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwNTBmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9ib3htb2RlbF9wcm9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jaGFyc2V0X3J1bGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2hhcnNldF9ydWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU5Mzg0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jaGFyc2V0X3J1bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2xhc3Nfc2VsZWN0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2xhc3Nfc2VsZWN0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTI0ZDdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2NsYXNzX3NlbGVjdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2NvbGJhY2tfcHJvcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY29sYmFja19wcm9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYTIzMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY29sYmFja19wcm9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jb250ZW50X3Byb3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2NvbnRlbnRfcHJvcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTMzZGVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2NvbnRlbnRfcHJvcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY3NzX3Byb3BlcnR5bmFtZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHluYW1lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRlNThhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHluYW1lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX2Z1bmN0aW9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX2Z1bmN0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNkMTJkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHl2YWx1ZV9mdW5jdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHl2YWx1ZV9pZGVudGlmaWVyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX2lkZW50aWZpZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWRiZGQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX2lkZW50aWZpZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY3NzX3Byb3BlcnR5dmFsdWVfdW5pdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHl2YWx1ZV91bml0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA4YTNhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHl2YWx1ZV91bml0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2ZvbnRfcHJvcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvZm9udF9wcm9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYTVmODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvZm9udF9wcm9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9mb250ZmFjZV9ydWxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2ZvbnRmYWNlX3J1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWY1OWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2ZvbnRmYWNlX3J1bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvaWRfc2VsZWN0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvaWRfc2VsZWN0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDg1N2QyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2lkX3NlbGVjdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2xpbmtfcnVsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9saW5rX3J1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGQ4OWNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2xpbmtfcnVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9saW5rX3NlbGVjdG9yLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2xpbmtfc2VsZWN0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODViNzhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2xpbmtfc2VsZWN0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvbWVkaWFfcnVsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9tZWRpYV9ydWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM5MWYxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9tZWRpYV9ydWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L290aGVyX3Byb3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L290aGVyX3Byb3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIwYzIyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9vdGhlcl9wcm9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9wYWdlX3J1bGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvcGFnZV9ydWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI1ZjY0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9wYWdlX3J1bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvcGFnZWRtZWRpYV9wcm9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9wYWdlZG1lZGlhX3Byb3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2MzViMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9wYWdlZG1lZGlhX3Byb3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3BzZXVkby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9wc2V1ZG8uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjZhNmRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3BzZXVkby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3J0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3NvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2M1ZDBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3NvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZWJkYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3N0eWxlX3J1bGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvc3R5bGVfcnVsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNzZmZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvc3R5bGVfcnVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9zdHlsZXNoZWV0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3N0eWxlc2hlZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGZkZTAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3N0eWxlc2hlZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFibGVfcHJvcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFibGVfcHJvcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2M3NmNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3RhYmxlX3Byb3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctdGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDFmODFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi90YWdfc2VsZWN0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnX3NlbGVjdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk4NTBmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi90YWdfc2VsZWN0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGV4dF9wcm9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi90ZXh0X3Byb3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmNjNmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi90ZXh0X3Byb3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3VpX3Byb3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3VpX3Byb3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlhOGI5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi91aV9wcm9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi91bmtub3duX3J1bGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdW5rbm93bl9ydWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU3ZTRlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi91bmtub3duX3J1bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdmlzdWFsX3Byb3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3Zpc3VhbF9wcm9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYThiMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdmlzdWFsX3Byb3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdjc3NmaWxlX3dpei5wbmcgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3Y3NzZmlsZV93aXoucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODhlNjNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdjc3NmaWxlX3dpei5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMzk4OWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1TU0UgQ1NTIFNvdXJjZSBFZGl0b3IKLUNTU19Tb3VyY2VfUGFnZV9FZGl0b3IubmFtZT1DU1MgRWRpdG9yCi1DU1NfRmlsZXMubmFtZT1DU1MgRmlsZXMKLUNTU19Tb3VyY2UubmFtZT1FZGl0b3IKLUNTU19TdHlsZXMubmFtZT1TdHlsZXMKLUNTU19UZW1wbGF0ZXMubmFtZT1UZW1wbGF0ZXMKLUNTU19TeW50YXhfQ29sb3Jpbmc9U3ludGF4IENvbG9yaW5nCi1XZWJDb250ZW50U2V0dGluZ3MubmFtZT1XZWIgQ29udGVudCBTZXR0aW5ncwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUaGUgZm9sbG93aW5nIHByb3BlcnR5IGtleXMgbWF5YmUgdW51c2VkLiBDb21tZW50ZWQgb3V0IG9uIDEyLzcvMjAwNC4gVW5jb21tZW50IGlmIG5lZWRlZC4KLSNDU1NfQW5ub3RhdGlvbnMubmFtZT1DU1MgQW5ub3RhdGlvbnMKLQotCi0jb3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyBleHRlbnNpb24gcG9pbnQKLV9VSV9XSVpBUkRfTkFNRSA9IENTUwotX1VJX1dJWkFSRF9DUkVBVEVfTkVXX0ZJTEUgPSBDcmVhdGUgYSBuZXcgQ2FzY2FkaW5nIFN0eWxlIFNoZWV0Ci0jIwotQWRkVGFzay5sYWJlbD1BZGQgJlRhc2suLi4KLUFkZFRhc2sudG9vbHRpcD1BZGQgVGFzay4uLgotQWRkQm9va21hcmsubGFiZWw9QWRkIEJvbyZrbWFyay4uLgotQWRkQm9va21hcmsudG9vbHRpcD1BZGQgQm9va21hcmsuLi4KLVNlbGVjdFJ1bGVyLmxhYmVsPVNlbGVjdCBSdWxlcgotIyMKLUNsZWFudXBEb2N1bWVudF9sYWJlbD1DbGVhbnVwIERvY3VtZW50Li4uCi1DbGVhbnVwRG9jdW1lbnRfdG9vbHRpcD1DbGVhbnVwIERvY3VtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWw9RW5jbG9zaW5nIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBlbmNsb3NpbmcgZWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbD1OZXh0IEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgbmV4dCBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbD1QcmV2aW91cyBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBwcmV2aW91cyBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsPVJlc3RvcmUgTGFzdCBTZWxlY3Rpb24KLVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcD1SZXN0b3JlIGxhc3Qgc2VsZWN0aW9uCi0jIwotQWxsX0NTU19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1BbGwgQ1NTCi1DU1NfTmV3X2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPU5ldyBDU1MKLSMjCi1wcmVmZXJlbmNlS2V5d29yZHMuZmlsZXM9ZWRpdG9yIGNzcyBjcmVhdGluZyBzYXZpbmcgZmlsZXMgc3VmZml4IHNwZWNpZmllZCBlbmNvZGluZyBpYW5hCi1wcmVmZXJlbmNlS2V5d29yZHMuc291cmNlPWVkaXRvciBjc3Mgc291cmNlIGZvcm1hdHRpbmcgbGluZSB3aWR0aCBpbnNlcnQgYnJlYWsgcHJvcGVydGllcyB3cmFwcGluZyBzdHlsZSBhdHRyaWJ1dGUgaHRtbCBpbmRlbnQgdGFicyBzcGFjZXMgc2l6ZSBjYXBpdGFsaXphdGlvbiBpZGVudGlmaWVyIHByb3BlcnR5IG5hbWUgdmFsdWUgdXBwZXJjYXNlIGxvd2VyY2FzZQotcHJlZmVyZW5jZUtleXdvcmRzLnRlbXBsYXRlcz1lZGl0b3IgY3NzIHRlbXBsYXRlcyBzbmlwcGV0IG1hY3JvcwotcHJlZmVyZW5jZUtleXdvcmRzLnN0eWxlcz1lZGl0b3IgY3NzIHN0eWxlIGN1c3RvbWl6ZSBzeW50YXggaGlnaGxpZ2h0aW5nIHR5cGUgdGV4dCBjb250ZW50IGZvcmVncm91bmQgYmFja2dyb3VuZCBib2xkIGNvbG9yCi1wcmVmZXJlbmNlS2V5d29yZHMud2ViY29udGVudD1lZGl0b3IgY3NzIHdlYiBjb250ZW50IHNldHRpbmdzIHByb2ZpbGUgc3R5bGUKLQotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5jc3MubmFtZT1FZGl0aW5nIENTUyBTb3VyY2UKLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IuY3NzLmRlc2NyaXB0aW9uPUVkaXRpbmcgQ1NTIFNvdXJjZQotCi1Db2xvcnMuYXRtYXJrUnVsZT1BdCBNYXJrIFJ1bGUKLUNvbG9ycy5zZWxlY3Rvcj1TZWxlY3RvcgotQ29sb3JzLm1lZGlhPU1lZGlhCi1Db2xvcnMuY29tbWVudD1Db21tZW50Ci1Db2xvcnMucHJvcGVydHlOYW1lPVByb3BlcnR5IE5hbWUKLUNvbG9ycy5wcm9wZXJ0eVZhbHVlPVByb3BlcnR5IFZhbHVlCi1Db2xvcnMudXJpPVVSSQotQ29sb3JzLnN0cmluZz1TdHJpbmcKLUNvbG9ycy5lcnJvcj1FcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA1NzZiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotCQk8ZWRpdG9yCi0JCQluYW1lPSIlQ1NTX1NvdXJjZV9QYWdlX0VkaXRvci5uYW1lIgotCQkJaWNvbj0iJG5sJC9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYiCi0JCQljb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkFjdGlvbkNvbnRyaWJ1dG9yQ1NTIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IiCi0JCQlzeW1ib2xpY0ZvbnROYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2Uuc291cmNlIj4KLQkJCTxjb250ZW50VHlwZUJpbmRpbmcKLQkJCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIiAvPgotCQk8L2VkaXRvcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTxjb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNTU0NvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIgLz4KLQkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIgLz4KLQkJPHByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5wcm9wZXJ0aWVzLkNTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJjaGFyYWN0ZXJwYWlybWF0Y2hlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnRleHQuQ1NTRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0ic3RydWN0dXJlZHRleHRmb2xkaW5ncHJvdmlkZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyQ1NTIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJhdXRvZWRpdHN0cmF0ZWd5IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuYXV0b2VkaXQuU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lDU1MiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuU1RZTEUiIC8+Ci0JCTxwcm92aXNpb25hbERlZmluaXRpb24KLQkJCXR5cGU9InByZWZlcmVuY2VwYWdlcyIKLQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnByZWZlcmVuY2VzLmNzcyBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmNzcy5zb3VyY2UsIG9yZy5lY2xpcHNlLndzdC5jc3MudWkucHJlZmVyZW5jZXMudGVtcGxhdGVzLCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmNzcy5zdHlsZXMiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbERlZmluaXRpb24KLQkJCXR5cGU9ImFjdGl2ZWNvbnRleHRzIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIC8+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMiPgotCQk8Y29udGV4dAotCQkJbmFtZT0iJXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IuY3NzLm5hbWUiCi0JCQlwYXJlbnRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJZGVzY3JpcHRpb249IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmNzcy5kZXNjcmlwdGlvbiIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIj4KLQkJPC9jb250ZXh0PgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbiI+Ci0JCTxhZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyQ1NTIj4KLQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIgLz4KLQkJPC9hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5hbm5vdGF0aW9uTW9kZWxDcmVhdGlvbiI+Ci0JCTxmYWN0b3J5Ci0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0JCTxwYWdlCi0JCQluYW1lPSIlQ1NTX0ZpbGVzLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMud2ViIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ1NTRmlsZXNQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnByZWZlcmVuY2VzLmNzcyI+Ci0JCQk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5maWxlcyIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlQ1NTX1NvdXJjZS5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkucHJlZmVyZW5jZXMuY3NzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ1NTU291cmNlUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5jc3Muc291cmNlIj4KLQkJCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnNvdXJjZSIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlQ1NTX1RlbXBsYXRlcy5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuY3NzLnNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNTU1RlbXBsYXRlUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5wcmVmZXJlbmNlcy50ZW1wbGF0ZXMiPgotCQkJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkudGVtcGxhdGVzIi8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVDU1NfU3ludGF4X0NvbG9yaW5nIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuY3NzLnNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNTU1N5bnRheENvbG9yaW5nUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmNzcy5zdHlsZXMiPgotICAgICAgICAgCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnN0eWxlcyIvPgotCQk8L3BhZ2U+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIENTUyBDb250ZW50IFNldHRpbmdzIFByb3BlcnR5IFBhZ2UgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+Ci0JCTxwYWdlCi0JCQluYW1lPSIlV2ViQ29udGVudFNldHRpbmdzLm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5DU1NXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5DU1NXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuY3NzIj4KLSAgICAgICAgIAk8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgICAJPGFuZD4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLQkJCQkJCTxvcj4gCi0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0JCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIiAvPgotCQkJCQkJPC9vcj4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L2FuZD4gCi0JCQk8L2VuYWJsZWRXaGVuPgotICAgICAgICAgCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLndlYmNvbnRlbnQiLz4KLQkJPC9wYWdlPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBLZXl3b3JkcyBmb3IgcHJlZmVyZW5jZSBhbmQgcHJvcGVydGllcyBwYWdlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5rZXl3b3JkcyI+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy5maWxlcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmZpbGVzIi8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy5zb3VyY2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5zb3VyY2UiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLnRlbXBsYXRlcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnRlbXBsYXRlcyIvPgotCQk8a2V5d29yZAotCQkJbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMuc3R5bGVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuc3R5bGVzIi8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy53ZWJjb250ZW50IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkud2ViY29udGVudCIvPgotICAgIDwvZXh0ZW5zaW9uPgotCi0JPCEtLSBFZGl0b3IgYWN0aW9uc2V0cyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb25zIj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5hY3Rpb25TZXQuYW5ub3RhdGlvbk5hdmlnYXRpb24iPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2Uuc291cmNlIj48L3BhcnQ+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuTmF2aWdhdGVBY3Rpb25TZXQiPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2Uuc291cmNlIj48L3BhcnQ+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBpbml0aWFsaXplIGNzcyB1aSBwcmVmZXJlbmNlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkNTU1VJUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBOZXcgQ1NTIHdpemFyZCAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLQkJPHdpemFyZAotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwud2l6YXJkLk5ld0NTU1dpemFyZCIKLQkJCW5hbWU9IiVfVUlfV0laQVJEX05BTUUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC53aXphcmQuTmV3Q1NTV2l6YXJkIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiCi0JCQlpY29uPSIkbmwkL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdjc3Nfd2l6LmdpZiI+Ci0JCQk8ZGVzY3JpcHRpb24+JV9VSV9XSVpBUkRfQ1JFQVRFX05FV19GSUxFPC9kZXNjcmlwdGlvbj4KLQkJCTxzZWxlY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIgLz4KLQkJPC93aXphcmQ+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgotCQk8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0ibWVudTplZGl0P2FmdGVyPWFkZGl0aW9ucyI+Ci0JCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5jb250ZW50QXNzaXN0LnByb3Bvc2FscyIgaWQ9IkNTU0NvbnRlbnRBc3Npc3QiIHN0eWxlPSJwdXNoIj4KLQkJCSAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuY3NzU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCQk8L3Zpc2libGVXaGVuPgotCQkJPC9jb21tYW5kPgotCQk8L21lbnVDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQkJPHZpZXdlckNvbnRyaWJ1dGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2Uuc291cmNlLlJ1bGVyQ29udGV4dCIKLQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnJ1bGVyLmNvbnRleHQuYWN0aW9ucyI+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRUYXNrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLkFkZFRhc2tfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRUYXNrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRCb29rbWFyay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiI+Ci0JCQk8L2FjdGlvbj4KLQkJPC92aWV3ZXJDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIFRlbXBsYXRlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRlbXBsYXRlcyI+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJUFsbF9DU1NfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUNTUyIKLQkJCWlkPSJjc3NfYWxsIj4KLQkJPC9jb250ZXh0VHlwZT4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlQ1NTX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlQ1NTIgotCQkJaWQ9ImNzc19uZXciPgotCQk8L2NvbnRleHRUeXBlPgotCQk8aW5jbHVkZQotCQkJZmlsZT0idGVtcGxhdGVzL2Nzc2RlZmF1bHQtdGVtcGxhdGVzLnhtbCIKLQkJCXRyYW5zbGF0aW9ucz0iJG5sJC90ZW1wbGF0ZXMvY3NzZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcyI+Ci0JCTwvaW5jbHVkZT4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLSAJCXBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+Ci0JCTxoYW5kbGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5oYW5kbGVycy5DbGVhbnVwRG9jdW1lbnRIYW5kbGVyIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNsZWFudXAuZG9jdW1lbnQiPgotCQkJPGFjdGl2ZVdoZW4+Ci0JCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuY3NzU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIi8+Ci0JCQk8L2FjdGl2ZVdoZW4+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuY3NzU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIi8+Ci0JCQk8L2VuYWJsZWRXaGVuPgotCQk8L2hhbmRsZXI+Ci0JCTxoYW5kbGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5oYW5kbGVycy5TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nSGFuZGxlciIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LmVuY2xvc2luZyI+Ci0JCQk8YWN0aXZlV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5jc3NTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iLz4KLQkJCTwvYWN0aXZlV2hlbj4KLQkJCTxlbmFibGVkV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5jc3NTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iLz4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvaGFuZGxlcj4KLQkJPGhhbmRsZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmhhbmRsZXJzLlN0cnVjdHVyZWRTZWxlY3ROZXh0SGFuZGxlciIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lm5leHQiPgotCQkJPGFjdGl2ZVdoZW4+Ci0JCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuY3NzU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIi8+Ci0JCQk8L2FjdGl2ZVdoZW4+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuY3NzU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIi8+Ci0JCQk8L2VuYWJsZWRXaGVuPgotCQk8L2hhbmRsZXI+Ci0JCTxoYW5kbGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5oYW5kbGVycy5TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNIYW5kbGVyIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QucHJldmlvdXMiPgotCQkJPGFjdGl2ZVdoZW4+Ci0JCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuY3NzU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIi8+Ci0JCQk8L2FjdGl2ZVdoZW4+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuY3NzU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIi8+Ci0JCQk8L2VuYWJsZWRXaGVuPgotCQk8L2hhbmRsZXI+Ci0JCTwhLS0gVE9ETyBVc2UgdGhlIGhhbmRsZXIgZnJvbSBTU0Ugb3IgWE1MJ3MgZGVjbGFyYXRpb24gLS0+Ci0JCTxoYW5kbGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oYW5kbGVycy5TdHJ1Y3R1cmVkU2VsZWN0SGlzdG9yeUhhbmRsZXIiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5sYXN0Ij4KLQkJCTxhY3RpdmVXaGVuPgotCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmNzc1NvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiIvPgotCQkJPC9hY3RpdmVXaGVuPgotCQkJPGVuYWJsZWRXaGVuPgotCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmNzc1NvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiIvPgotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9oYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gQ1NTIGVkaXRvciBhY3Rpb25zIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMiPgotCQk8IS0tPGVkaXRvckNvbnRyaWJ1dGlvbgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2Uuc291cmNlLmVkaXRvckFjdGlvbnMiCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZS5zb3VyY2UiPgotCQkJPGFjdGlvbgotCQkJCWlkPSJDbGVhbnVwRG9jdW1lbnQiCi0JCQkJbGFiZWw9IiVDbGVhbnVwRG9jdW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNsZWFudXAuZG9jdW1lbnQiCi0JCQkJdG9vbHRpcD0iJUNsZWFudXBEb2N1bWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXQudWkuQ2xlYW51cEFjdGlvbkNTU0RlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJDbGVhbnVwRG9jdW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5lbmNsb3NpbmciCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nQ1NTQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0TmV4dCIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubmV4dCIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0TmV4dENTU0FjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3ROZXh0Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91cyIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LnByZXZpb3VzIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNDU1NBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lmxhc3QiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEhpc3RvcnlBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0SGlzdG9yeSI+Ci0JCQk8L2FjdGlvbj4KLQkJPC9lZGl0b3JDb250cmlidXRpb24+LS0+Ci0gICAgICAgIDxlZGl0b3JDb250cmlidXRpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlLnNvdXJjZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlLnJ1bGVyLmFjdGlvbnMiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmJvb2ttYXJrX2FjdGlvbl9jb250ZXh0IgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckRvdWJsZUNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIvPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVTZWxlY3RSdWxlci5sYWJlbCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIgotICAgICAgICAgICAgICAgYWN0aW9uSUQ9IlJ1bGVyQ2xpY2siCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIvPgotICAgICAgICA8L2VkaXRvckNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuY3NzU291cmNlQ29udHJpYnV0aW9ucy5kZWZpbml0aW9uIj4KLSAgICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJhY3RpdmVDb250ZXh0cyI+Ci0JICAgICAgICAgICA8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCSAgICAgICAgICAgICAgPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIvPgotCSAgICAgICAgICAgPC9pdGVyYXRlPgotICAgICAgICAgICAgPC93aXRoPgotCQk8L2RlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSBEZWZpbmUgdGhlbWUgLS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkudGhlbWVzIj4KLQkJPHRoZW1lCi0JCQlpZD0ib3JnLmVjbGlwc2UudWkuaWRlLnN5c3RlbURlZmF1bHQiPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iQVRNQVJLX1JVTEUiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJTRUxFQ1RPUiIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9Ik1FRElBIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iQ09NTUVOVCIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9TRUxFQ1RJT04iPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iUFJPUEVSVFlfTkFNRSIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9IlBST1BFUlRZX1ZBTFVFIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iVVJJIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iU1RSSU5HIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iRVJST1IiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCTwvdGhlbWU+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJBVE1BUktfUlVMRSIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuYXRtYXJrUnVsZSIKLQkJCXZhbHVlPSI2MywgMTI3LCAxMjciPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9IlNFTEVDVE9SIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5zZWxlY3RvciIKLQkJCXZhbHVlPSI2MywgMTI3LCAxMjciPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9Ik1FRElBIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5tZWRpYSIKLQkJCXZhbHVlPSI0MiwgMCwgMjI1Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJDT01NRU5UIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5jb21tZW50IgotCQkJdmFsdWU9IjYzLCA5NSwgMTkxIj4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJQUk9QRVJUWV9OQU1FIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5wcm9wZXJ0eU5hbWUiCi0JCQl2YWx1ZT0iMTI3LCAwLCAxMjciPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9IlBST1BFUlRZX1ZBTFVFIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5wcm9wZXJ0eVZhbHVlIgotCQkJdmFsdWU9IjQyLCAwLCAyMjUiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9IlVSSSIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMudXJpIgotCQkJdmFsdWU9IjQyLCAwLCAyMjUiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9IlNUUklORyIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuc3RyaW5nIgotCQkJdmFsdWU9IjQyLCAwLCAyMjUiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9IkVSUk9SIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5lcnJvciIKLQkJCXZhbHVlPSIxOTEsIDYzLCA2MyI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gRW5hYmxlIHRoZSBGb3JtYXRIYW5kbGVyIGZvciBDU1MgQ29udGVudCBUeXBlIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KLQkJPGhhbmRsZXIgCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oYW5kbGVycy5Gb3JtYXRIYW5kbGVyIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmZvcm1hdCI+Ci0JCQk8YWN0aXZlV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5jc3NDb250ZW50VHlwZS5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCTwvYWN0aXZlV2hlbj4KLQkJCTxlbmFibGVkV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5jc3NDb250ZW50VHlwZS5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvaGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIFNldCB1cCBhIGRlZmluaXRpb24gZm9yIENTUyBDb250ZW50IFR5cGVzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotCQk8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5jc3NDb250ZW50VHlwZS5kZWZpbml0aW9uIj4KLQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotCQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnJlc291cmNlcy5jb250ZW50VHlwZUlkIgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiLz4KLQkJCQk8L2FkYXB0PgotCQkJPC9pdGVyYXRlPgotCQk8L2RlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25DU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25DU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ3MDkzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUNvbnRlbnRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50ZXh0LklDU1NQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZm9ybWF0LlN0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBhIHNvdXJjZSB2aWV3ZXIgd2hpY2ggc2hvd3MgQ1NTLgotICogPHA+Ci0gKiBDbGllbnRzIGNhbiBzdWJjbGFzcyBhbmQgb3ZlcnJpZGUganVzdCB0aG9zZSBtZXRob2RzIHdoaWNoIG11c3QgYmUgc3BlY2lmaWMKLSAqIHRvIHRoZWlyIG5lZWRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25DU1MgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gewotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uIGJlY2F1c2Ugbm90IHNvdXJjZXZpZXdlci1zcGVjaWZpYyBhbmQKLQkgKiBpdCdzIGEgU3RyaW5nIGFycmF5Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBmQ29uZmlndXJlZENvbnRlbnRUeXBlczsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZkxpbmVTdHlsZVByb3ZpZGVyRm9yQ1NTOwotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25DU1MKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uQ1NTKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJQXV0b0VkaXRTdHJhdGVneVtdIGdldEF1dG9FZGl0U3RyYXRlZ2llcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCUxpc3QgYWxsU3RyYXRlZ2llcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0KLQkJSUF1dG9FZGl0U3RyYXRlZ3lbXSBzdXBlclN0cmF0ZWdpZXMgPSBzdXBlci5nZXRBdXRvRWRpdFN0cmF0ZWdpZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJTdHJhdGVnaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhbGxTdHJhdGVnaWVzLmFkZChzdXBlclN0cmF0ZWdpZXNbaV0pOwotCQl9Ci0KLQkJcmV0dXJuIChJQXV0b0VkaXRTdHJhdGVneVtdKSBhbGxTdHJhdGVnaWVzLnRvQXJyYXkobmV3IElBdXRvRWRpdFN0cmF0ZWd5WzBdKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlpZiAoZkNvbmZpZ3VyZWRDb250ZW50VHlwZXMgPT0gbnVsbCkgewotCQkJZkNvbmZpZ3VyZWRDb250ZW50VHlwZXMgPSBuZXcgU3RyaW5nW117SUNTU1BhcnRpdGlvbnMuU1RZTEUsIElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTiwgSVN0cnVjdHVyZWRQYXJ0aXRpb25zLlVOS05PV05fUEFSVElUSU9OfTsKLQkJfQotCQlyZXR1cm4gZkNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JfQotCi0JcHJvdGVjdGVkIElDb250ZW50QXNzaXN0UHJvY2Vzc29yW10gZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yW10gcHJvY2Vzc29ycyA9IG51bGw7Ci0KLQkJaWYgKChwYXJ0aXRpb25UeXBlID09IElDU1NQYXJ0aXRpb25zLlNUWUxFKSB8fCAocGFydGl0aW9uVHlwZSA9PSBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT04pKSB7Ci0JCQlwcm9jZXNzb3JzID0gbmV3IElDb250ZW50QXNzaXN0UHJvY2Vzc29yW117bmV3IENTU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKX07Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc29yczsKLQl9Ci0KLQlwdWJsaWMgSUNvbnRlbnRGb3JtYXR0ZXIgZ2V0Q29udGVudEZvcm1hdHRlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlJQ29udGVudEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBzdXBlci5nZXRDb250ZW50Rm9ybWF0dGVyKHNvdXJjZVZpZXdlcik7Ci0JCS8vIHN1cGVyIHdhcyB1bmFibGUgdG8gY3JlYXRlIGEgZm9ybWF0dGVyLCBwcm9iYWJseSBiZWNhdXNlCi0JCS8vIHNvdXJjZVZpZXdlciBkb2VzIG5vdCBoYXZlIGRvY3VtZW50IHNldCB5ZXQsIHNvIGp1c3QgY3JlYXRlIGEKLQkJLy8gZ2VuZXJpYyBvbmUKLQkJaWYgKCEoZm9ybWF0dGVyIGluc3RhbmNlb2YgTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcikpCi0JCQlmb3JtYXR0ZXIgPSBuZXcgTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcihnZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcoc291cmNlVmlld2VyKSwgSUNTU1BhcnRpdGlvbnMuU1RZTEUpOwotCi0JCSgoTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcikgZm9ybWF0dGVyKS5zZXRNYXN0ZXJTdHJhdGVneShuZXcgU3RydWN0dXJlZEZvcm1hdHRpbmdTdHJhdGVneShuZXcgRm9ybWF0UHJvY2Vzc29yQ1NTKCkpKTsKLQotCQlyZXR1cm4gZm9ybWF0dGVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRJbmRlbnRQcmVmaXhlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCVZlY3RvciB2ZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJLy8gcHJlZml4WzBdIGlzIGVpdGhlciAnXHQnIG9yICcgJyB4IHRhYldpZHRoLCBkZXBlbmRpbmcgb24gcHJlZmVyZW5jZQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0JCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQlib29sZWFuIHVzZVNwYWNlcyA9IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0UuZXF1YWxzKGluZGVudENoYXJQcmVmKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8PSBpbmRlbnRhdGlvbldpZHRoOyBpKyspIHsKLQkJCVN0cmluZ0J1ZmZlciBwcmVmaXggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlib29sZWFuIGFwcGVuZFRhYiA9IGZhbHNlOwotCi0JCQlpZiAodXNlU3BhY2VzKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogKyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaisrKQotCQkJCQlwcmVmaXguYXBwZW5kKCcgJyk7Ci0KLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlhcHBlbmRUYWIgPSB0cnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspCi0JCQkJCXByZWZpeC5hcHBlbmQoJyAnKTsKLQotCQkJCWlmIChpICE9IGluZGVudGF0aW9uV2lkdGgpCi0JCQkJCWFwcGVuZFRhYiA9IHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChhcHBlbmRUYWIpIHsKLQkJCQlwcmVmaXguYXBwZW5kKCdcdCcpOwotCQkJCXZlY3Rvci5hZGQocHJlZml4LnRvU3RyaW5nKCkpOwotCQkJCS8vIHJlbW92ZSB0aGUgdGFiIHNvIHRoYXQgaW5kZW50YXRpb24gLSB0YWIgaXMgYWxzbyBhbiBpbmRlbnQKLQkJCQkvLyBwcmVmaXgKLQkJCQlwcmVmaXguZGVsZXRlQ2hhckF0KHByZWZpeC5sZW5ndGgoKSAtIDEpOwotCQkJfQotCQkJdmVjdG9yLmFkZChwcmVmaXgudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQl2ZWN0b3IuYWRkKCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiAoU3RyaW5nW10pIHZlY3Rvci50b0FycmF5KG5ldyBTdHJpbmdbdmVjdG9yLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJTGluZVN0eWxlUHJvdmlkZXJbXSBwcm92aWRlcnMgPSBudWxsOwotCi0JCWlmIChwYXJ0aXRpb25UeXBlID09IElDU1NQYXJ0aXRpb25zLlNUWUxFKSB7Ci0JCQlwcm92aWRlcnMgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJbXXtnZXRMaW5lU3R5bGVQcm92aWRlckZvckNTUygpfTsKLQkJfQotCi0JCXJldHVybiBwcm92aWRlcnM7Ci0JfQotCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBnZXRMaW5lU3R5bGVQcm92aWRlckZvckNTUygpIHsKLQkJaWYgKGZMaW5lU3R5bGVQcm92aWRlckZvckNTUyA9PSBudWxsKSB7Ci0JCQlmTGluZVN0eWxlUHJvdmlkZXJGb3JDU1MgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JDU1MoKTsKLQkJfQotCQlyZXR1cm4gZkxpbmVTdHlsZVByb3ZpZGVyRm9yQ1NTOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9BY3Rpb25Db250cmlidXRvckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0FjdGlvbkNvbnRyaWJ1dG9yQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YjQ1YWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0FjdGlvbkNvbnRyaWJ1dG9yQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5BY3Rpb25Db250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnMuQWN0aW9uRGVmaW5pdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnMuU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHM7Ci0KLS8qKgotICogQWN0aW9uQ29udHJpYnV0b3JDU1MKLSAqIAotICogVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIHVzZWQgaW5zaWRlIG11bHRpIHBhZ2UgZWRpdG9yJ3MKLSAqIEFjdGlvbkJhckNvbnRyaWJ1dG9yLCBzaW5jZSBjYXNjYWRlZCBpbml0KCkgY2FsbCBmcm9tIHRoZQotICogQWN0aW9uQmFyQ29udHJpYnV0b3Igd2lsbCBjYXVzZXMgZXhjZXB0aW9uIGFuZCBpdCBsZWFkcyB0byBsb3NlIHdob2xlCi0gKiB0b29sYmFycy4KLSAqIAotICogSW5zdGVhZCwgdXNlIFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvciBmb3Igc291cmNlIHBhZ2UgY29udHJpYnV0b3Igb2YKLSAqIG11bHRpIHBhZ2UgZWRpdG9yLgotICogCi0gKiBOb3RlIHRoYXQgdGhpcyBjbGFzcyBpcyBzdGlsbCB2YWxpZCBmb3Igc2luZ2xlIHBhZ2UgZWRpdG9yLgotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uQ29udHJpYnV0b3JDU1MgZXh0ZW5kcyBBY3Rpb25Db250cmlidXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRURJVE9SX0lEUyA9IHsib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZS5zb3VyY2UiLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZkNvbnRlbnRBc3Npc3QgPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZkNsZWFudXBEb2N1bWVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmRm9ybWF0RG9jdW1lbnQgPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZkZvcm1hdEFjdGl2ZUVsZW1lbnRzID0gbnVsbDsKLQotCXB1YmxpYyBBY3Rpb25Db250cmlidXRvckNTUygpIHsKLQkJc3VwZXIoKTsKLQotCQlSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IENTU1VJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQotCQkvLyBlZGl0IGNvbW1hbmRzCi0JCWZDb250ZW50QXNzaXN0ID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWZDb250ZW50QXNzaXN0LnNldEFjdGlvbkRlZmluaXRpb25JZChJVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuQ09OVEVOVF9BU1NJU1RfUFJPUE9TQUxTKTsKLQotCQkvLyBzb3VyY2UgY29tbWFuZHMKLQkJZkNsZWFudXBEb2N1bWVudCA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlmQ2xlYW51cERvY3VtZW50LnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLkNMRUFOVVBfRE9DVU1FTlQpOwotCi0JCWZGb3JtYXREb2N1bWVudCA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlmRm9ybWF0RG9jdW1lbnQuc2V0QWN0aW9uRGVmaW5pdGlvbklkKEFjdGlvbkRlZmluaXRpb25JZHMuRk9STUFUX0RPQ1VNRU5UKTsKLQotCQlmRm9ybWF0QWN0aXZlRWxlbWVudHMgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZkZvcm1hdEFjdGl2ZUVsZW1lbnRzLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLkZPUk1BVF9BQ1RJVkVfRUxFTUVOVFMpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRFeHRlbnNpb25JRHMoKSB7Ci0JCXJldHVybiBFRElUT1JfSURTOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQkvLyBlZGl0IGNvbW1hbmRzCi0JCUlNZW51TWFuYWdlciBlZGl0TWVudSA9IG1lbnUuZmluZE1lbnVVc2luZ1BhdGgoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0VESVQpOwotCQlpZiAoZWRpdE1lbnUgIT0gbnVsbCkgewotCQkJZWRpdE1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQllZGl0TWVudS5hZGQoZlRvZ2dsZUluc2VydE1vZGVBY3Rpb24pOwotCQkJZWRpdE1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQllZGl0TWVudS5hZGQoZkV4cGFuZFNlbGVjdGlvblRvTWVudSk7Ci0JCQllZGl0TWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCWVkaXRNZW51LmFkZChmQ29udGVudEFzc2lzdCk7Ci0JCQllZGl0TWVudS5hZGQoZk1lbnVBZGRpdGlvbnNHcm91cE1hcmtlcik7Ci0JCX0KLQotCQkvLyBzb3VyY2UgY29tbWFuZHMKLQkJU3RyaW5nIHNvdXJjZU1lbnVMYWJlbCA9IENTU1VJTWVzc2FnZXMuU291cmNlTWVudV9sYWJlbDsKLQkJU3RyaW5nIHNvdXJjZU1lbnVJZCA9ICJzb3VyY2VNZW51SWQiOyAvLyROT04tTkxTLTEkCi0JCUlNZW51TWFuYWdlciBzb3VyY2VNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKHNvdXJjZU1lbnVMYWJlbCwgc291cmNlTWVudUlkKTsKLQkJbWVudS5pbnNlcnRBZnRlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCwgc291cmNlTWVudSk7Ci0JCWlmIChzb3VyY2VNZW51ICE9IG51bGwpIHsKLQkJCXNvdXJjZU1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQlzb3VyY2VNZW51LmFkZChmU2hpZnRSaWdodCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmU2hpZnRMZWZ0KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZDbGVhbnVwRG9jdW1lbnQpOwotCQkJc291cmNlTWVudS5hZGQoZkZvcm1hdERvY3VtZW50KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZGb3JtYXRBY3RpdmVFbGVtZW50cyk7Ci0JCQlzb3VyY2VNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQl9Ci0JCUlNZW51TWFuYWdlciBuYXZpZ2F0ZU1lbnUgPSBtZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9OQVZJR0FURSk7Ci0JCWlmIChuYXZpZ2F0ZU1lbnUgIT0gbnVsbCkgewotCQkJSU1lbnVNYW5hZ2VyIGdvdG9Hcm91cCA9IG5hdmlnYXRlTWVudS5maW5kTWVudVVzaW5nUGF0aChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkdPX1RPKTsKLQkJCWlmIChnb3RvR3JvdXAgIT0gbnVsbCkgewotCQkJCWdvdG9Hcm91cC5hZGQoZkdvdG9NYXRjaGluZ0JyYWNrZXRBY3Rpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikgewotCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gZ2V0VGV4dEVkaXRvcihhY3RpdmVFZGl0b3IpOwotCi0JCWZDb250ZW50QXNzaXN0LnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfQ09OVEVOVEFTU0lTVF9QUk9QT1NBTFMpKTsKLQotCQlmQ2xlYW51cERvY3VtZW50LnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfQ0xFQU5VUF9ET0NVTUVOVCkpOwotCQlmRm9ybWF0RG9jdW1lbnQuc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9GT1JNQVRfRE9DVU1FTlQpKTsKLQkJZkZvcm1hdEFjdGl2ZUVsZW1lbnRzLnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfRk9STUFUX0FDVElWRV9FTEVNRU5UUykpOwotCQlmQ2xlYW51cERvY3VtZW50LnNldEVuYWJsZWQodGV4dEVkaXRvciAhPSBudWxsICYmIHRleHRFZGl0b3IuaXNFZGl0YWJsZSgpKTsKLQkJZkZvcm1hdERvY3VtZW50LnNldEVuYWJsZWQodGV4dEVkaXRvciAhPSBudWxsICYmIHRleHRFZGl0b3IuaXNFZGl0YWJsZSgpKTsKLQkJZkZvcm1hdEFjdGl2ZUVsZW1lbnRzLnNldEVuYWJsZWQodGV4dEVkaXRvciAhPSBudWxsICYmIHRleHRFZGl0b3IuaXNFZGl0YWJsZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0NTU1VJTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9DU1NVSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTc3NjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0NTU1VJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQ1NTVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmUmVzb3VyY2VCdW5kbGU7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQ1NTVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChmUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCQlmUmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJZlJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZlJlc291cmNlQnVuZGxlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTkZPX05vdF9DYXRlZ29yaXplZF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfV3JhcHBpbmdXaXRob3V0QXR0cjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX1dyYXBwaW5nSW5zZXJ0TGluZUJyZWFrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZUdyb3VwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZUlkZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZVByb3BOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZVByb3BWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0Nhc2VJZGVudFVwcGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZUlkZW50TG93ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9TZWxlY3RvclRhZ05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9DYXNlUHJvcE5hbWVVcHBlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0Nhc2VQcm9wTmFtZUxvd2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZVByb3BWYWx1ZVVwcGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZVByb3BWYWx1ZUxvd2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfU2VsZWN0b3JUYWdOYW1lVXBwZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9TZWxlY3RvclRhZ05hbWVMb3dlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yU2FtcGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JOb3JtYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvckF0bWFya1J1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvclNlbGVjdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JNZWRpYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yQ29tbWVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yUHJvcGVydHlOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JQcm9wZXJ0eVZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JVcmk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvclN0cmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yQ29sb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvclNlbWlDb2xvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yQ3VybHlCcmFjZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU29ydEFjdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfTkVXX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfTkVXX0hFQURJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfREVTQ1JJUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0NTUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGl0bGVfSW52YWxpZFZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VfSW52YWxpZFZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdE1lbnVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfdG9vbHRpcDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9ub25lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENTU19DbGVhbnVwX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJZGVudGlmaWVyX2Nhc2VfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9wZXJ0eV9uYW1lX2Nhc2VfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9wZXJ0eV92YWx1ZV9jYXNlX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0b3JfdGFnX25hbWVfY2FzZV9fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1b3RlX3ZhbHVlc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0X3NvdXJjZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXNfaXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvd2VyX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcHBlcl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU291cmNlTWVudV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXR0aW5nX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMaW5lX3dpZHRoX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kZW50X3VzaW5nX3RhYnNfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluZGVudF91c2luZ19zcGFjZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kZW50YXRpb25fc2l6ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmRlbnRhdGlvbl9zaXplX3RpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdE5leHRfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGluZ19maWxlc19lbmNvZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZUdyb3VwX25hbWVFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TVFJVQ1RVUkVEX1RFWFRfRURJVE9SX1BSRUZTX0xJTks7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQ1NTVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9DU1NVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmNlZjkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9DU1NVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC50ZW1wbGF0ZXMuQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQudGVtcGxhdGVzLkNvbnRyaWJ1dGlvblRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgQ1NTVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QuY3NzLnVpIjsgLy8kTk9OLU5MUy0xJAotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBDU1NVSVBsdWdpbiBwbHVnaW47CQotCQotCS8qKgotCSAqIFRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIGNzcyB1aS4KLQkgKi8KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlRlbXBsYXRlU3RvcmU7Ci0KLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciBjc3MgdWkuCi0JICovCi0JcHJpdmF0ZSBDb250ZXh0VHlwZVJlZ2lzdHJ5IGZDb250ZXh0VHlwZVJlZ2lzdHJ5OwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBDU1NVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBDU1NVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIGNzcyBlZGl0b3IgdGVtcGxhdGVzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgY3NzIGVkaXRvciB0ZW1wbGF0ZXMKLQkgKi8KLQlwdWJsaWMgVGVtcGxhdGVTdG9yZSBnZXRUZW1wbGF0ZVN0b3JlKCkgewotCQlpZiAoZlRlbXBsYXRlU3RvcmUgPT0gbnVsbCkgewotCQkJZlRlbXBsYXRlU3RvcmUgPSBuZXcgQ29udHJpYnV0aW9uVGVtcGxhdGVTdG9yZShnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpLCBnZXRQcmVmZXJlbmNlU3RvcmUoKSwgQ1NTVUlQcmVmZXJlbmNlTmFtZXMuVEVNUExBVEVTX0tFWSk7Ci0KLQkJCXRyeSB7Ci0JCQkJZlRlbXBsYXRlU3RvcmUubG9hZCgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZUZW1wbGF0ZVN0b3JlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGNzcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUgY3NzIHBsdWdpbgotCSAqLwotCXB1YmxpYyBDb250ZXh0VHlwZVJlZ2lzdHJ5IGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkgewotCQlpZiAoZkNvbnRleHRUeXBlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeSByZWdpc3RyeSA9IG5ldyBDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5KCk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTLkFMTCk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTLk5FVyk7Ci0KLQkJCWZDb250ZXh0VHlwZVJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCX0KLQotCQlyZXR1cm4gZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0NTU1VJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQ1NTVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM0YmI3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQ1NTVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUlORk9fTm90X0NhdGVnb3JpemVkXzE9Tm90IENhdGVnb3JpemVkCi0KLSMjIENTUyBQcmVmZXJlbmNlcyAtLSBzb3VyY2UgIyMKLVByZWZzTGFiZWxfV3JhcHBpbmdXaXRob3V0QXR0cj1EaXNhYmxlIHdyYXBwaW5nIGluIHN0eWxlICZhdHRyaWJ1dGUgb2YgSFRNTAotUHJlZnNMYWJlbF9XcmFwcGluZ0luc2VydExpbmVCcmVhaz1JbnNlcnQgJmxpbmUgYnJlYWsgYmV0d2VlbiBwcm9wZXJ0aWVzCi0KLVByZWZzTGFiZWxfQ2FzZUdyb3VwPUNhcGl0YWxpemF0aW9uIHN0eWxlCi1QcmVmc0xhYmVsX0Nhc2VJZGVudD1JZGVudGlmaWVyOgotUHJlZnNMYWJlbF9DYXNlUHJvcE5hbWU9UHJvcGVydHkgbmFtZToKLVByZWZzTGFiZWxfQ2FzZVByb3BWYWx1ZT1Qcm9wZXJ0eSB2YWx1ZToKLVByZWZzTGFiZWxfU2VsZWN0b3JUYWdOYW1lPVNlbGVjdG9yIHRhZyBuYW1lOgotCi1QcmVmc0xhYmVsX0Nhc2VJZGVudFVwcGVyPSZVcHBlcmNhc2UKLVByZWZzTGFiZWxfQ2FzZUlkZW50TG93ZXI9TCZvd2VyY2FzZQotUHJlZnNMYWJlbF9DYXNlUHJvcE5hbWVVcHBlcj1VJnBwZXJjYXNlCi1QcmVmc0xhYmVsX0Nhc2VQcm9wTmFtZUxvd2VyPUxvJndlcmNhc2UKLVByZWZzTGFiZWxfQ2FzZVByb3BWYWx1ZVVwcGVyPVVwcCZlcmNhc2UKLVByZWZzTGFiZWxfQ2FzZVByb3BWYWx1ZUxvd2VyPUxvd2UmcmNhc2UKLVByZWZzTGFiZWxfU2VsZWN0b3JUYWdOYW1lVXBwZXI9VXBwZXImY2FzZQotUHJlZnNMYWJlbF9TZWxlY3RvclRhZ05hbWVMb3dlcj1Mb3dlcmNhJnNlCi0KLSMjIENTUyBQcmVmZXJlbmNlcyAtLSBjb2xvciAjIwotCi0jIyBUaGUgZm9sbG93aW5nIGxpbmUgaXMgYSBzYW1wbGUgQ1NTIGRvY3VtZW50LiAgUGxlYXNlIHRyYW5zbGF0ZSBvbmx5IHRoZSBmb2xsb3dpbmcgcGFydHM6Ci0jIyBTYW1wbGUgU3R5bGVzCi1QcmVmc0xhYmVsX0NvbG9yU2FtcGxlPUBpbXBvcnQgdXJsKCIuLi9zYW1wbGUyLmNzcyIpO1xuXG4vKiBTYW1wbGUgU3R5bGVzICovXG5cbkJPRFkge1xuXHRjb2xvciA6IGJsYWNrO1xuXHRiYWNrZ3JvdW5kLWNvbG9yIDogcmdiKDE4MSwgMjUzLCAyMTEpO1xuXHR0ZXh0LWFsaWduIDogY2VudGVyO1xuXHRmb250LWZhbWlseSA6ICJIZWlzZWkgTWluY2hvIFczIiwgc2VyaWZcbn1cblxuQHBhZ2UgOmxlZnQgeyBtYXJnaW4tbGVmdCA6IDRjbSB9XG5cbkBtZWRpYSBhdXJhbCB7XG5cdFAuaGVpZGkge1xuXHRcdGF6aW11dGggOiBjZW50ZXItbGVmdDtcblx0XHRlbGV2YXRpb24gOiAxMi4zZGVnO1xuXHRcdHBhdXNlIDogMzBtcyAxLjZzXG5cdH1cbn1cbgotCi1QcmVmc0xhYmVsX0NvbG9yTm9ybWFsPURlZmF1bHQKLVByZWZzTGFiZWxfQ29sb3JBdG1hcmtSdWxlPUF0LVJ1bGUKLVByZWZzTGFiZWxfQ29sb3JTZWxlY3Rvcj1TZWxlY3RvcgotUHJlZnNMYWJlbF9Db2xvck1lZGlhPU1lZGlhIE5hbWUKLVByZWZzTGFiZWxfQ29sb3JDb21tZW50PUNvbW1lbnQKLVByZWZzTGFiZWxfQ29sb3JQcm9wZXJ0eU5hbWU9UHJvcGVydHkgTmFtZQotUHJlZnNMYWJlbF9Db2xvclByb3BlcnR5VmFsdWU9UHJvcGVydHkgVmFsdWUKLVByZWZzTGFiZWxfQ29sb3JVcmk9VVJJCi1QcmVmc0xhYmVsX0NvbG9yU3RyaW5nPVF1b3RlZCBTdHJpbmcKLVByZWZzTGFiZWxfQ29sb3JDb2xvbj1Qcm9wZXJ0eSBEZWxpbWl0ZXIKLVByZWZzTGFiZWxfQ29sb3JTZW1pQ29sb249U2VtaUNvbG9uCi1QcmVmc0xhYmVsX0NvbG9yQ3VybHlCcmFjZT1DdXJseSBCcmFjZQotUHJlZnNMYWJlbF9Db2xvckVycm9yPUVycm9yCi0jCi1Tb3J0QWN0aW9uXzA9U29ydAotIwotX1VJX1dJWkFSRF9ORVdfVElUTEUgPSBOZXcgQ2FzY2FkaW5nIFN0eWxlIFNoZWV0Ci1fVUlfV0laQVJEX05FV19IRUFESU5HID0gQ2FzY2FkaW5nIFN0eWxlIFNoZWV0Ci1fVUlfV0laQVJEX05FV19ERVNDUklQVElPTiA9IENyZWF0ZSBhIG5ldyBDU1MgZmlsZS4KLV9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9DU1MgPSBUaGUgZmlsZSBuYW1lIG11c3QgZW5kIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGV4dGVuc2lvbnMgezB9LgotX1dBUk5JTkdfRk9MREVSX01VU1RfQkVfSU5TSURFX1dFQl9DT05URU5UID0gRmlsZXMgY3JlYXRlZCBvdXRzaWRlIG9mIHRoZSBXZWIgQ29udGVudCBmb2xkZXIgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4geW91ciBkZXBsb3llZCBXZWIgYXBwbGljYXRpb24uIAotIwotVGl0bGVfSW52YWxpZFZhbHVlPUludmFsaWQgVmFsdWUKLU1lc3NhZ2VfSW52YWxpZFZhbHVlPUludmFsaWQgcHJvcGVydHkgdmFsdWUuCi0jIENvcGllZCBmcm9tIHNzZS51aQotRm9ybWF0TWVudV9sYWJlbD1GJm9ybWF0Ci1DbGVhbnVwRG9jdW1lbnRfbGFiZWw9QyZsZWFudXAgRG9jdW1lbnQuLi4KLUNsZWFudXBEb2N1bWVudF90b29sdGlwPUNsZWFudXAgRG9jdW1lbnQKLUNsZWFudXBEb2N1bWVudF9kZXNjcmlwdGlvbj1DbGVhbnVwIERvY3VtZW50Ci1VSV9ub25lPW5vbmUKLUNsZWFudXBfVUlfPUNsZWFudXAKLUNTU19DbGVhbnVwX1VJXz1DU1MgQ2xlYW51cAotSWRlbnRpZmllcl9jYXNlX19VSV89SWRlbnRpZmllciBjYXNlOgotUHJvcGVydHlfbmFtZV9jYXNlX19VSV89UHJvcGVydHkgbmFtZSBjYXNlOgotUHJvcGVydHlfdmFsdWVfY2FzZV9fVUlfPVByb3BlcnR5IHZhbHVlIGNhc2U6Ci1TZWxlY3Rvcl90YWdfbmFtZV9jYXNlX19VSV89U2VsZWN0b3IgdGFnIG5hbWUgY2FzZToKLVF1b3RlX3ZhbHVlc19VSV89UXVvdGUgdmFsdWVzCi1Gb3JtYXRfc291cmNlX1VJXz0mRm9ybWF0IHNvdXJjZQotQXNfaXNfVUlfPUFzLWlzCi1Mb3dlcl9VSV89TG93ZXIKLVVwcGVyX1VJXz1VcHBlcgotU291cmNlTWVudV9sYWJlbD0mU291cmNlCi1Gb3JtYXR0aW5nX1VJXz1Gb3JtYXR0aW5nCi1MaW5lX3dpZHRoX19VSV89TGluZSAmd2lkdGg6Ci1JbmRlbnRfdXNpbmdfdGFic189JkluZGVudCB1c2luZyB0YWJzCi1JbmRlbnRfdXNpbmdfc3BhY2VzPUkmbmRlbnQgdXNpbmcgc3BhY2VzCi1JbmRlbnRhdGlvbl9zaXplPUluJmRlbnRhdGlvbiBzaXplOgotSW5kZW50YXRpb25fc2l6ZV90aXA9SW5kZW50YXRpb24gc2l6ZQotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsPSZFbmNsb3NpbmcgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIGVuY2xvc2luZyBlbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfZGVzY3JpcHRpb249RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIGVuY2xvc2luZyBlbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsPSZOZXh0IEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgbmV4dCBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3ROZXh0X2Rlc2NyaXB0aW9uPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsPSZQcmV2aW91cyBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBwcmV2aW91cyBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19kZXNjcmlwdGlvbj1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgcHJldmlvdXMgc2libGluZwotIyMKLUNyZWF0aW5nX2ZpbGVzX2VuY29kaW5nPUNyZWF0aW5nIGZpbGVzIGVuY29kaW5nIHByZWZlcmVuY2UKLVJlc291cmNlR3JvdXBfbmFtZUV4aXN0cyA9IFRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuCi1OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzA9U2VsZWN0IENTUyBUZW1wbGF0ZQotTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8xPVNlbGVjdCBhIHRlbXBsYXRlIGFzIGluaXRpYWwgY29udGVudCBpbiB0aGUgQ1NTIHBhZ2UuCi1OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzI9TmFtZQotTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8zPURlc2NyaXB0aW9uCi1OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzQ9VXNlIENTUyBUZW1wbGF0ZQotTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV81PVByZXZpZXc6Ci1OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzY9VGVtcGxhdGVzIGFyZSAnTmV3IENTUycgdGVtcGxhdGVzIGZvdW5kIGluIHRoZSA8YT5DU1MgVGVtcGxhdGVzPC9hPiBwcmVmZXJlbmNlIHBhZ2UuCi0jIENTUyBDb250ZW50IFNldHRpbmdzCi1DU1NDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMD1UaGUgdHlwZSBvZiBDU1MgdG8gdXNlLiAgVGhlIHByb2plY3Qgc2V0dGluZyBpcyB1c2VkIGlmIHlvdSBzcGVjaWZ5ICJub25lLiIKLUNTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8xPUNTUyBQcm9maWxlOgotU3ludGF4Q29sb3JpbmdQYWdlXzA9U3ludGF4IEVsZW1lbnQ6Ci1TeW50YXhDb2xvcmluZ1BhZ2VfMj1FbmFibGUKLVN5bnRheENvbG9yaW5nUGFnZV8zPSZCb2xkCi1TeW50YXhDb2xvcmluZ1BhZ2VfND0mSXRhbGljCi1TeW50YXhDb2xvcmluZ1BhZ2VfNT0mU3RyaWtldGhyb3VnaAotU3ludGF4Q29sb3JpbmdQYWdlXzY9JlVuZGVybGluZQotX1VJX1NUUlVDVFVSRURfVEVYVF9FRElUT1JfUFJFRlNfTElOSz1DU1MgZWRpdGluZyBwcmVmZXJlbmNlcy4gIE5vdGUgdGhhdCBzb21lIHByZWZlcmVuY2VzIG1heSBiZSBzZXQgb24gdGhlIDxhPnswfTwvYT4gcHJlZmVyZW5jZSBwYWdlLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2ViYTVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY3NzLnVpIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgV0FSTklORzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogICAgICAgICAgICBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoCi0JICogICAgICAgICAgICAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGlzVHJhY2luZyhjYXRlZ29yeSkpIHsKLQkJCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCQotCS8qKgotCSAqIERldGVybWluZXMgaWYgY3VycmVudGx5IHRyYWNpbmcgYSBjYXRlZ29yeQotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFjaW5nIGNhdGVnb3J5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvYXV0b2VkaXQvU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9hdXRvZWRpdC9TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzFiMGNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9hdXRvZWRpdC9TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmF1dG9lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lDU1MgaW1wbGVtZW50cyBJQXV0b0VkaXRTdHJhdGVneSB7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbnVsbDsKLQotCWNsYXNzIENvbXBvdW5kUmVnaW9uIHsKLQotCQlDb21wb3VuZFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uOwotCQkJdGhpcy50ZXh0UmVnaW9uID0gdGV4dFJlZ2lvbjsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RG9jdW1lbnRSZWdpb24oKSB7Ci0JCQlyZXR1cm4gZG9jdW1lbnRSZWdpb247Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiBnZXRUZXh0UmVnaW9uKCkgewotCQkJcmV0dXJuIHRleHRSZWdpb247Ci0JCX0KLQotCQlpbnQgZ2V0U3RhcnQoKSB7Ci0JCQlyZXR1cm4gdGV4dFJlZ2lvbi5nZXRTdGFydCgpOwotCQl9Ci0KLQkJaW50IGdldEVuZCgpIHsKLQkJCXJldHVybiB0ZXh0UmVnaW9uLmdldEVuZCgpOwotCQl9Ci0KLQkJU3RyaW5nIGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gdGV4dFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJCXJldHVybiBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHRleHRSZWdpb24pOwotCQl9Ci0KLQkJaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQkJcmV0dXJuIGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHRleHRSZWdpb24pOwotCQl9Ci0KLQkJaW50IGdldEVuZE9mZnNldCgpIHsKLQkJCXJldHVybiBkb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQodGV4dFJlZ2lvbik7Ci0JCX0KLQotCQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb247Ci0JCXByaXZhdGUgSVRleHRSZWdpb24gdGV4dFJlZ2lvbjsKLQotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGF1dG9JbmRlbnRBZnRlckNsb3NlKERvY3VtZW50Q29tbWFuZCBjb21tYW5kLCBTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlpZiAoIXNldFJhbmdlRm9yQ2xvc2UoY29tbWFuZCkpCi0JCQlyZXR1cm47Ci0KLQkJaW50IHBvc2l0aW9uID0gY29tbWFuZC5vZmZzZXQgKyBjb21tYW5kLmxlbmd0aDsKLQotCQlpZiAocG9zaXRpb24gPT0gLTEgfHwgc3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGdldCBvcGVuIGJyYWNlIHJlZ2lvbgotCQlDb21wb3VuZFJlZ2lvbiByZWdpb24gPSBwcmV2Q29ycmVzcG9uZGVuY2UocG9zaXRpb24sIHJlZ2lvblR5cGUpOwotCi0JCS8vIGdldCBpbmRlbnRhdGlvbgotCQlTdHJpbmcgc3RyID0gZ2V0SW5kZW50Rm9yKHJlZ2lvbiwgZmFsc2UpOwotCi0JCS8vIGFwcGVuZCB0byBpbnB1dAotCQlpZiAoc3RyICE9IG51bGwpCi0JCQljb21tYW5kLnRleHQgPSBzdHIgKyBjb21tYW5kLnRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgcHJldmlvdXMgbGluZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhdXRvSW5kZW50QWZ0ZXJOZXdMaW5lKERvY3VtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0JCS8vIHNlbGVjdCBuZWFyZXN0IHdoaXRlIHNwYWNlcyB0byByZXBsYWNlIHdpdGggbmV3LWxpbmUKLQkJc2V0UmFuZ2VGb3JOZXdMaW5lKGNvbW1hbmQpOwotCi0JCS8vIGdldCBwb3NpdGlvbgotCQlpbnQgcG9zaXRpb24gPSBjb21tYW5kLm9mZnNldDsKLQotCQlpZiAocG9zaXRpb24gPT0gLTEgfHwgc3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGdldCBjdXJyZW50IHJlZ2lvbgotCQlDb21wb3VuZFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gZ2V0UmVnaW9uKGNvbW1hbmQub2Zmc2V0ICsgY29tbWFuZC5sZW5ndGgpOwotCi0JCS8vIGdldCBrZXkgcmVnaW9uCi0JCUNvbXBvdW5kUmVnaW9uIGtleVJlZ2lvbiA9IGdldFByZXZLZXlSZWdpb24ocG9zaXRpb24sIGN1cnJlbnRSZWdpb24pOwotCi0JCS8vIGdldCBpbmRlbnQgc3RyaW5nCi0JCVN0cmluZyBzdHIgPSBnZXRJbmRlbnRGb3Ioa2V5UmVnaW9uLCB0cnVlKTsKLQotCQkvLyBjaGVjayBhbm90aGVyIGluZGVudGF0aW9uCi0JCWludCBzaGlmdCA9IG5lZWRTaGlmdChrZXlSZWdpb24sIGNvbW1hbmQub2Zmc2V0ICsgY29tbWFuZC5sZW5ndGgpOwotCi0JCS8vIGNyZWF0ZSB0ZXh0IHRvIHJlcGxhY2UKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoY29tbWFuZC50ZXh0KTsKLQkJaWYgKHN0ciAhPSBudWxsKQotCQkJYnVmLmFwcGVuZChzdHIpOwotCQl3aGlsZSAoc2hpZnQtLSAhPSAwKQotCQkJYnVmLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCWNvbW1hbmQudGV4dCA9IGJ1Zi50b1N0cmluZygpOwotCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgY3VzdG9taXplRG9jdW1lbnRDb21tYW5kKElEb2N1bWVudCBkb2N1bWVudCwgRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJT2JqZWN0IHRleHRFZGl0b3IgPSBnZXRBY3RpdmVUZXh0RWRpdG9yKCk7Ci0JCWlmICghKHRleHRFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvckV4dGVuc2lvbjMgJiYgKChJVGV4dEVkaXRvckV4dGVuc2lvbjMpIHRleHRFZGl0b3IpLmdldEluc2VydE1vZGUoKSA9PSBJVGV4dEVkaXRvckV4dGVuc2lvbjMuU01BUlRfSU5TRVJUKSkKLQkJCXJldHVybjsKLQotCQkvLyByZXR1cm47Ci0JCS8vIC8qCi0JCXN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudDsKLQotCQlpZiAoY29tbWFuZC5sZW5ndGggPT0gMCAmJiBjb21tYW5kLnRleHQgIT0gbnVsbCkgewotCQkJaWYgKGVuZHNXaXRoKGRvY3VtZW50LmdldExlZ2FsTGluZURlbGltaXRlcnMoKSwgY29tbWFuZC50ZXh0KSAhPSAtMSkgewotCQkJCWF1dG9JbmRlbnRBZnRlck5ld0xpbmUoY29tbWFuZCk7Ci0JCQl9IGVsc2UgaWYgKGNvbW1hbmQudGV4dC5lcXVhbHMoIn0iKSkgey8vJE5PTi1OTFMtMSQKLQkJCQlhdXRvSW5kZW50QWZ0ZXJDbG9zZShjb21tYW5kLCBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKTsKLQkJCX0gZWxzZSBpZiAoY29tbWFuZC50ZXh0LmVxdWFscygiXSIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCWF1dG9JbmRlbnRBZnRlckNsb3NlKGNvbW1hbmQsIENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EKTsKLQkJCX0gZWxzZSBpZiAoY29tbWFuZC50ZXh0LmVxdWFscygiKSIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCWF1dG9JbmRlbnRBZnRlckNsb3NlKGNvbW1hbmQsIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSk7Ci0JCQl9Ci0JCX0KLQkJLy8gKi8KLQkJCi0JCS8vIHNwYWNlcyBmb3IgdGFiIGNoYXJhY3RlcgotCQlpZiAoY29tbWFuZC50ZXh0ICE9IG51bGwgJiYgY29tbWFuZC50ZXh0Lmxlbmd0aCgpID4gMCAmJiBjb21tYW5kLnRleHQuY2hhckF0KDApID09ICdcdCcpCi0JCQlzbWFydEluc2VydEZvclRhYihjb21tYW5kLCBkb2N1bWVudCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbmRlbnRGb3IoQ29tcG91bmRSZWdpb24gcmVnaW9uLCBib29sZWFuIGluZGVudEZvck5leHRSZWdpb24pIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSByZWdpb24uZ2V0RG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQl0cnkgewotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQkJLy8gZ2V0IG1lYW5mdWwgZmxhdCBub2RlCi0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbi5nZXRUZXh0UmVnaW9uKCkpOwotCQkJCWl0LnByZXYoKTsKLQkJCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHIgPSBpdC5wcmV2KCk7Ci0JCQkJCXJlZ2lvbiA9IG5ldyBDb21wb3VuZFJlZ2lvbihpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgcik7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWZsYXROb2RlID0gcmVnaW9uLmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJLy8gZ2V0IGluZGVudCBzdHJpbmcKLQkJCQlpbnQgcG9zaXRpb24gPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQkJCWludCBsaW5lID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZk9mZnNldChwb3NpdGlvbik7Ci0JCQkJaW50IHN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSk7Ci0JCQkJaW50IGVuZCA9IGZpbmRFbmRPZldoaXRlU3BhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBzdGFydCwgcG9zaXRpb24pOwotCQkJCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCB8fAotCQkJLy8gcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFSRU5USEVTSVNfT1BFTiB8fAotCQkJCQkJcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04gfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SKSB7Ci0JCQkJaW50IHBvc2l0aW9uID0gZmxhdE5vZGUuZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRTdGFydCgpOwotCQkJCWludCBsaW5lID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZk9mZnNldChwb3NpdGlvbik7Ci0JCQkJaW50IHN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSk7Ci0JCQkJaW50IGVuZCA9IGZpbmRFbmRPZldoaXRlU3BhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBzdGFydCwgcG9zaXRpb24pOwotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHN0cnVjdHVyZWREb2N1bWVudC5nZXQoc3RhcnQsIGVuZCAtIHN0YXJ0KSk7Ci0JCQkJcG9zaXRpb24gKz0gcmVnaW9uLmdldFRleHQoKS5sZW5ndGgoKTsKLQkJCQlpZiAoaW5kZW50Rm9yTmV4dFJlZ2lvbikgewotCQkJCQlpbnQgdG9rZW5TdGFydCA9IGZpbmRFbmRPZldoaXRlU3BhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBwb3NpdGlvbiwgc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSkgKyBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZUxlbmd0aChsaW5lKSAtIDEpOwotCQkJCQlpZiAodG9rZW5TdGFydCA8IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmUpICsgc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVMZW5ndGgobGluZSkgLSAxKSB7Ci0JCQkJCQlwb3NpdGlvbiA9IHRva2VuU3RhcnQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJd2hpbGUgKHBvc2l0aW9uIC0gZW5kID4gMCkgewotCQkJCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQkJCQllbmQrKzsKLQkJCQl9Ci0JCQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCQkJfSBlbHNlCi0JCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXhjcCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNwKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG91bmRSZWdpb24gZ2V0UHJldktleVJlZ2lvbihpbnQgcG9zaXRpb24sIENvbXBvdW5kUmVnaW9uIGN1cnJlbnRSZWdpb24pIHsKLQkJaWYgKGN1cnJlbnRSZWdpb24gPT0gbnVsbCkgewotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmIChjdXJyZW50UmVnaW9uICE9IG51bGwgJiYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UgfHwgY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQgfHwgY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKSkgewotCQkJcmV0dXJuIHByZXZDb3JyZXNwb25kZW5jZShjdXJyZW50UmVnaW9uKTsKLQkJfQotCi0JCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKHN0cnVjdHVyZWREb2N1bWVudCwgcG9zaXRpb24gLSAxKTsKLQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJSVRleHRSZWdpb24gciA9IGl0LnByZXYoKTsKLQkJCUNvbXBvdW5kUmVnaW9uIHJlZ2lvbiA9IG5ldyBDb21wb3VuZFJlZ2lvbihpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgcik7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8Ci0JCQkvLyByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UgfHwKLQkJCQkJCXJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCB8fAotCQkJCQkJLy8gcmVnaW9uLmdldFR5cGUoKSA9PQotCQkJCQkJLy8gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0JSQUNLRVRfQ0xPU0UgfHwKLQkJCQkJCS8vIC8vIHJlZ2lvbi5nZXRUeXBlKCkgPT0KLQkJCQkJCS8vIENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQVJFTlRIRVNJU19PUEVOIHx8Ci0JCQkJCQkvLyByZWdpb24uZ2V0VHlwZSgpID09Ci0JCQkJCQkvLyBDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFSRU5USEVTSVNfQ0xPU0UgfHwKLQkJCQkJCXJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIgfHwKLQkJCQkJCS8vIHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTE9OIHx8Ci0JCQkJCQkvLyByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UCi0JCQkJCQkvLyB8fAotCQkJCQkJcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfSBlbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORCB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkgewotCQkJCS8vIHNraXAgdG8gTEJSQUNFCi0JCQkJQ29tcG91bmRSZWdpb24gcGMgPSBwcmV2Q29ycmVzcG9uZGVuY2UocmVnaW9uKTsKLQkJCQkvLyBndWFyZCBmb3IgTlBFCi0JCQkJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExMzE4Ci0JCQkJaWYgKHBjID09IG51bGwpIGJyZWFrOwotCQkJCWl0LnJlc2V0KHBjLmdldERvY3VtZW50UmVnaW9uKCksIHBjLmdldFRleHRSZWdpb24oKSk7Ci0JCQkJaXQucHJldigpOwotCQkJfSBlbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TVFJJTkcpIHsKLQkJCQlSZWdpb25JdGVyYXRvciBpdFRtcCA9IG5ldyBSZWdpb25JdGVyYXRvcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIHBvc2l0aW9uKTsKLQkJCQlpZiAocmVnaW9uID09IGl0VG1wLnByZXYoKSkKLQkJCQkJcmV0dXJuIHJlZ2lvbjsgLy8gcG9zaXRpb24gaXMgaW5zaWRlIG9mIHN0cmluZwotCQkJfSBlbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXRUbXAgPSBuZXcgUmVnaW9uSXRlcmF0b3Ioc3RydWN0dXJlZERvY3VtZW50LCBwb3NpdGlvbik7Ci0JCQkJaWYgKHJlZ2lvbiA9PSBpdFRtcC5wcmV2KCkpCi0JCQkJCXJldHVybiByZWdpb247IC8vIHBvc2l0aW9uIGlzIGluc2lkZSBvZiBjb21tZW50Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOS05PV04pIHsKLQkJCQlTdHJpbmcgc3RyID0gcmVnaW9uLmdldFRleHQoKTsKLQkJCQlpZiAoc3RyLmNoYXJBdChzdHIubGVuZ3RoKCkgLSAxKSA9PSAnXFwnKQotCQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfSBlbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IpIHsKLQkJCQlSZWdpb25JdGVyYXRvciBpdFByZXYgPSBuZXcgUmVnaW9uSXRlcmF0b3IocmVnaW9uLmdldERvY3VtZW50UmVnaW9uKCksIHJlZ2lvbi5nZXRUZXh0UmVnaW9uKCkpOwotCQkJCXdoaWxlIChpdFByZXYuaGFzUHJldigpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvblByZXYgPSBpdFByZXYucHJldigpOwotCQkJCQlpZiAocmVnaW9uUHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZSBpZiAocmVnaW9uUHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCByZWdpb25QcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJCQl9IGVsc2UgaWYgKHJlZ2lvblByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpIHsKLQkJCQkJCXdoaWxlIChpdFByZXYuaGFzUHJldigpKSB7Ci0JCQkJCQkJcmVnaW9uUHJldiA9IGl0UHJldi5wcmV2KCk7Ci0JCQkJCQkJaWYgKHJlZ2lvblByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQSkKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJaWYgKHJlZ2lvblByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UgfHwgcmVnaW9uUHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCByZWdpb25QcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHJlZ2lvblByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpCi0JCQkJCQkJCXJldHVybiByZWdpb247Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocmVnaW9uUHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBKQotCQkJCQkJCWJyZWFrOwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiByZWdpb247Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIENvbXBvdW5kUmVnaW9uIGdldFJlZ2lvbihpbnQgcG9zaXRpb24pIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwb3NpdGlvbik7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBDb21wb3VuZFJlZ2lvbihmbGF0Tm9kZSwgZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocG9zaXRpb24pKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGludCBuZWVkU2hpZnQoQ29tcG91bmRSZWdpb24gcmVnaW9uLCBpbnQgcG9zaXRpb24pIHsKLQkJaW50IHNoaWZ0ID0gMDsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQkvLyBnZXQgbm9uIHNwYWNlIHJlZ2lvbgotCQkJQ29tcG91bmRSZWdpb24gY3IgPSBnZXRSZWdpb24ocG9zaXRpb24gLSAxKTsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGNyLmdldERvY3VtZW50UmVnaW9uKCksIGNyLmdldFRleHRSZWdpb24oKSk7Ci0JCQlJVGV4dFJlZ2lvbiBuZWFyZXN0UmVnaW9uID0gbnVsbDsKLQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQluZWFyZXN0UmVnaW9uID0gaXQucHJldigpOwotCQkJCWlmIChuZWFyZXN0UmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiBuZWFyZXN0UmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAobmVhcmVzdFJlZ2lvbiAhPSBudWxsICYmIChuZWFyZXN0UmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IG5lYXJlc3RSZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UgfHwgbmVhcmVzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCBuZWFyZXN0UmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSkKLQkJCQlzaGlmdC0tOwotCQkJZWxzZSBpZiAocmVnaW9uID09IG51bGwpCi0JCQkJc2hpZnQtLTsKLQkJCXNoaWZ0Kys7Ci0JCX0KLQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3Ioc3RydWN0dXJlZERvY3VtZW50LCBwb3NpdGlvbik7Ci0JCQlpZiAoIWl0Lmhhc1ByZXYoKSB8fCBpdC5wcmV2KCkuZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpCi0JCQkJc2hpZnQrKzsKLQkJCWVsc2UKLQkJCQlzaGlmdCA9IDA7Ci0JCX0KLQkJcmV0dXJuIHNoaWZ0OwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBDb21wb3VuZFJlZ2lvbiBwcmV2Q29ycmVzcG9uZGVuY2UoaW50IHBvc2l0aW9uLCBTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIHBvc2l0aW9uIC0gMSk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCWludCBuZXN0ID0gMTsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkgewotCQkJLy8gc2tpcCB0byBMQlJBQ0UKLQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQlyZWdpb24gPSBpdC5wcmV2KCk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkKLQkJCQkJbmVzdC0tOwotCQkJCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkKLQkJCQkJbmVzdCsrOwotCQkJCWlmIChuZXN0IDw9IDApCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKG5lc3QgPT0gMCkKLQkJCQlyZXR1cm4gbmV3IENvbXBvdW5kUmVnaW9uKGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCByZWdpb24pOwotCQl9Ci0JCWlmIChyZWdpb25UeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EKSB7Ci0JCQkvLyBza2lwIHRvIEJSQUNLRVRfT1BFTgotCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCXJlZ2lvbiA9IGl0LnByZXYoKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUKQotCQkJCQluZXN0LS07Ci0JCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORCkKLQkJCQkJbmVzdCsrOwotCQkJCWlmIChuZXN0IDw9IDApCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKG5lc3QgPT0gMCkKLQkJCQlyZXR1cm4gbmV3IENvbXBvdW5kUmVnaW9uKGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCByZWdpb24pOwotCQl9Ci0JCWlmIChyZWdpb25UeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkgewotCQkJLy8gc2tpcCB0byBQQVJFTlRIRVNJU19PUEVOCi0JCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJcmVnaW9uID0gaXQucHJldigpOwotCQkJCWlmICgvLyByZWdpb24uZ2V0VHlwZSgpID09Ci0JCQkJLy8gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1BBUkVOVEhFU0lTX09QRU4gfHwKLQkJCQlyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikKLQkJCQkJbmVzdC0tOwotCQkJCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQluZXN0Kys7Ci0JCQkJaWYgKG5lc3QgPD0gMCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAobmVzdCA9PSAwKQotCQkJCXJldHVybiBuZXcgQ29tcG91bmRSZWdpb24oaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCksIHJlZ2lvbik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIENvbXBvdW5kUmVnaW9uIHByZXZDb3JyZXNwb25kZW5jZShDb21wb3VuZFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHJlZ2lvbi5nZXREb2N1bWVudFJlZ2lvbigpOwotCQlpbnQgcG9zaXRpb24gPSBmbGF0Tm9kZS5nZXRTdGFydCgpICsgcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCXJldHVybiBwcmV2Q29ycmVzcG9uZGVuY2UocG9zaXRpb24sIHJlZ2lvbi5nZXRUeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudENvbW1hbmQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZXRSYW5nZUZvckNsb3NlKERvY3VtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0JCWludCBwb3NpdGlvbiA9IGNvbW1hbmQub2Zmc2V0OwotCi0JCWlmIChwb3NpdGlvbiA9PSAtMSB8fCBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCS8vIGZpbmQgc3RhcnQgb2YgbGluZQotCQkJaW50IHAgPSAocG9zaXRpb24gPT0gc3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpID8gcG9zaXRpb24gLSAxIDogcG9zaXRpb24pOwotCi0JCQlpbnQgbGluZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQocCk7Ci0JCQlpbnQgc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lKTsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnQpOwotCQkJYm9vbGVhbiBhbGxXaGl0ZVNwYWNlID0gZmFsc2U7Ci0JCQkvLyBjaGVjayB3aGV0aGVyIHRoZSB0ZXh0IGZyb20gbFN0YXJ0IHRvIHBvc2l0aW9uIGlzIHdoaXRlIHNwYWNlCi0JCQkvLyBvciBub3QKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpCi0JCQkJCWJyZWFrOwotCQkJCWlmIChpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKSA+IHApIHsKLQkJCQkJYWxsV2hpdGVTcGFjZSA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChhbGxXaGl0ZVNwYWNlKSB7Ci0JCQkJY29tbWFuZC5sZW5ndGggPSBjb21tYW5kLmxlbmd0aCAtIChzdGFydCAtIGNvbW1hbmQub2Zmc2V0KTsKLQkJCQljb21tYW5kLm9mZnNldCA9IHN0YXJ0OwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleGNwKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y3ApOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSYW5nZUZvck5ld0xpbmUoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJaW50IHBvc2l0aW9uID0gY29tbWFuZC5vZmZzZXQ7Ci0KLQkJaWYgKHBvc2l0aW9uID09IC0xIHx8IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgewotCQkJLy8gYWRkIHByZS1uZWFyZXN0IHdoaXRlIHNwYWNlcyB0byByZXBsYWNlIHRhcmdldAotCQkJaWYgKHBvc2l0aW9uID4gMCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocG9zaXRpb24gLSAxKTsKLQkJCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwb3NpdGlvbiAtIDEpOwotCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgewotCQkJCQkJaW50IGVuZCA9IGNvbW1hbmQub2Zmc2V0ICsgY29tbWFuZC5sZW5ndGg7Ci0JCQkJCQlpbnQgbkxpbmUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHBvc2l0aW9uKTsKLQkJCQkJCWludCBuU3RhcnRQb3MgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mZnNldChuTGluZSk7Ci0JCQkJCQlpZiAoblN0YXJ0UG9zIDwgZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSkKLQkJCQkJCQluU3RhcnRQb3MgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQkJY29tbWFuZC5vZmZzZXQgPSBuU3RhcnRQb3M7Ci0JCQkJCQljb21tYW5kLmxlbmd0aCA9IGVuZCAtIGNvbW1hbmQub2Zmc2V0OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBhZGQgcG9zdC1uZWFyZXN0IHdoaXRlIHNwYWNlcyB0byByZXBsYWNlIHRhcmdldAotCQkJaWYgKHBvc2l0aW9uIDwgc3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwb3NpdGlvbik7Ci0JCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocG9zaXRpb24pOwotCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgewotCQkJCQkJaW50IG5MaW5lID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZk9mZnNldChwb3NpdGlvbik7Ci0JCQkJCQlTdHJpbmcgY3VycmVudExpbmVEZWxpbSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lRGVsaW1pdGVyKG5MaW5lKTsKLQkJCQkJCWludCBuRW5kUG9zID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZmZzZXQobkxpbmUpICsgc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVMZW5ndGgobkxpbmUpIC0gKChjdXJyZW50TGluZURlbGltICE9IG51bGwpID8gY3VycmVudExpbmVEZWxpbS5sZW5ndGgoKSA6IDApOwotCQkJCQkJaWYgKG5FbmRQb3MgPiBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKSkKLQkJCQkJCQluRW5kUG9zID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCQljb21tYW5kLmxlbmd0aCA9IG5FbmRQb3MgLSBjb21tYW5kLm9mZnNldDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gZG8gbm90IGN1c3RvbWl6ZSBjb21tYW5kCi0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBlbmRzV2l0aChTdHJpbmdbXSBzZWFyY2hTdHJpbmdzLCBTdHJpbmcgdGV4dCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlYXJjaFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0ZXh0LmVuZHNXaXRoKHNlYXJjaFN0cmluZ3NbaV0pKQotCQkJCXJldHVybiBpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgZmluZEVuZE9mV2hpdGVTcGFjZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBlbmQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChvZmZzZXQgPCBlbmQpIHsKLQkJCWNoYXIgYyA9IGRvY3VtZW50LmdldENoYXIob2Zmc2V0KTsKLQkJCWlmIChjICE9ICcgJyAmJiBjICE9ICdcdCcpIHsKLQkJCQlyZXR1cm4gb2Zmc2V0OwotCQkJfQotCQkJb2Zmc2V0Kys7Ci0JCX0KLQkJcmV0dXJuIGVuZDsKLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIGdldEluZGVudFN0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQljaGFyIGluZGVudENoYXIgPSAnICc7Ci0JCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJCWlmIChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJaW5kZW50Q2hhciA9ICdcdCc7Ci0JCQl9Ci0JCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCWluZGVudC5hcHBlbmQoaW5kZW50Q2hhcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZGVudC50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFjdGl2ZSB0ZXh0IGVkaXRvciBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlIHRoZSBhY3RpdmUgZWRpdG9yCi0JICogcGFydC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0QWN0aXZlVGV4dEVkaXRvcigpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJCQkJCXJldHVybiBlZGl0b3I7Ci0JCQkJCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvci5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQkJCQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkKLQkJCQkJCXJldHVybiB0ZXh0RWRpdG9yOwotCQkJCQlyZXR1cm4gZWRpdG9yOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogSW5zZXJ0IHNwYWNlcyBmb3IgdGFicwotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNtYXJ0SW5zZXJ0Rm9yVGFiKERvY3VtZW50Q29tbWFuZCBjb21tYW5kLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gdGFiIGtleSB3YXMgcHJlc3NlZC4gbm93IGNoZWNrIHByZWZlcmVuY2VzIHRvIHNlZSBpZiBuZWVkIHRvIGluc2VydAotCQkvLyBzcGFjZXMgaW5zdGVhZCBvZiB0YWIKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpZiAoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5TUEFDRS5lcXVhbHMocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUikpKSB7Ci0JCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJaWYgKGluZGVudGF0aW9uV2lkdGggIT0gMCkgewotCQkJCWludCBpbmRlbnRTaXplID0gaW5kZW50YXRpb25XaWR0aDsKLQkJCQl0cnkgewotCQkJCQlJUmVnaW9uIGZpcnN0TGluZSA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGNvbW1hbmQub2Zmc2V0KTsKLQkJCQkJaW50IG9mZnNldEluTGluZSA9IGNvbW1hbmQub2Zmc2V0IC0gZmlyc3RMaW5lLmdldE9mZnNldCgpOwotCQkJCQlpbnQgcmVtYWluZGVyID0gb2Zmc2V0SW5MaW5lICUgaW5kZW50YXRpb25XaWR0aDsKLQotCQkJCQlpbmRlbnRTaXplID0gaW5kZW50YXRpb25XaWR0aCAtIHJlbWFpbmRlcjsKLQkJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudFNpemU7IGkrKykKLQkJCQkJaW5kZW50LmFwcGVuZCgnICcpOwotCQkJfQotCi0JCQkvLyByZXBsYWNlIFx0IGNoYXJhY3RlcnMgd2l0aCBzcGFjZXMKLQkJCWNvbW1hbmQudGV4dCA9IGluZGVudC50b1N0cmluZygpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTQ0FDYW5kaWRhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU0NBQ2FuZGlkYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNmY0ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTQ0FDYW5kaWRhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VUeXBlOwotCi1jbGFzcyBDU1NDQUNhbmRpZGF0ZSB7Ci0KLQlwcml2YXRlIFN0cmluZyBmUmVwbGFjZW1lbnRTdHJpbmcgPSBudWxsOwotCXByaXZhdGUgaW50IGZDdXJzb3JQb3NpdGlvbiA9IDA7Ci0JcHJpdmF0ZSBTdHJpbmcgZkRpc3BsYXlTdHJpbmcgPSBudWxsOwotCXByaXZhdGUgQ1NTSW1hZ2VUeXBlIGZJbWFnZVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogQ1NTQ0FDYW5kaWRhdGUgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NDQUNhbmRpZGF0ZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JaW50IGdldEN1cnNvclBvc2l0aW9uKCkgewotCQlyZXR1cm4gZkN1cnNvclBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlTdHJpbmcgZ2V0RGlzcGxheVN0cmluZygpIHsKLQkJcmV0dXJuIGZEaXNwbGF5U3RyaW5nOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlDU1NJbWFnZVR5cGUgZ2V0SW1hZ2VUeXBlKCkgewotCQlyZXR1cm4gZkltYWdlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JU3RyaW5nIGdldFJlcGxhY2VtZW50U3RyaW5nKCkgewotCQlyZXR1cm4gZlJlcGxhY2VtZW50U3RyaW5nOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQl2b2lkIHNldEN1cnNvclBvc2l0aW9uKGludCBjdXJzb3JQb3NpdGlvbikgewotCQlmQ3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0Jdm9pZCBzZXREaXNwbGF5U3RyaW5nKFN0cmluZyBkaXNwbGF5U3RyaW5nKSB7Ci0JCWZEaXNwbGF5U3RyaW5nID0gZGlzcGxheVN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0Jdm9pZCBzZXRJbWFnZVR5cGUoQ1NTSW1hZ2VUeXBlIGltYWdlVHlwZSkgewotCQlmSW1hZ2VUeXBlID0gaW1hZ2VUeXBlOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQl2b2lkIHNldFJlcGxhY2VtZW50U3RyaW5nKFN0cmluZyByZXBsYWNlbWVudFN0cmluZykgewotCQlmUmVwbGFjZW1lbnRTdHJpbmcgPSByZXBsYWNlbWVudFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgU3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2YgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVjZWl2ZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKGdldFJlcGxhY2VtZW50U3RyaW5nKCkpOwotCQlidWYuYXBwZW5kKCJcIiIpOy8vJE5PTi1OTFMtMSQKLQkJYnVmLmFwcGVuZChnZXREaXNwbGF5U3RyaW5nKCkpOwotCQlidWYuYXBwZW5kKCJcIiIpOy8vJE5PTi1OTFMtMSQKLQkJYnVmLmFwcGVuZCgiKCIpOy8vJE5PTi1OTFMtMSQKLQkJYnVmLmFwcGVuZChnZXRDdXJzb3JQb3NpdGlvbigpKTsKLQkJYnVmLmFwcGVuZCgiKSIpOy8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTQ29udGVudEFzc2lzdENvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU0NvbnRlbnRBc3Npc3RDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MTBjNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTQ29udGVudEFzc2lzdENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNZXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsLkNTU01ldGFNb2RlbEZpbmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi1jbGFzcyBDU1NDb250ZW50QXNzaXN0Q29udGV4dCB7Ci0KLQlwcml2YXRlIGludCBmUmVwbGFjZUJlZ2luID0gLTE7Ci0JcHJpdmF0ZSBTdHJpbmcgZlRleHRUb1JlcGxhY2UgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZUZXh0VG9Db21wYXJlID0gbnVsbDsKLQlwcml2YXRlIGludCBmVGFyZ2V0UG9zID0gLTE7Ci0JcHJpdmF0ZSBJQ1NTTm9kZSBmVGFyZ2V0Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZkN1cnNvclBvcyA9IC0xOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmU3RydWN0dXJlZERvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIGludCBmRG9jdW1lbnRPZmZzZXQgPSAwOwotCXByaXZhdGUgY2hhciBmUXVvdGUgPSAwOwotCXByaXZhdGUgSUNTU01vZGVsIGZNb2RlbCA9IG51bGw7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBDU1NDb250ZW50QXNzaXN0Q29udGV4dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JQ1NTQ29udGVudEFzc2lzdENvbnRleHQoaW50IGRvY3VtZW50UG9zaXRpb24sIElDU1NOb2RlIG5vZGUsIGludCBkb2N1bWVudE9mZnNldCwgY2hhciBxdW90ZSkgewotCQl0aGlzKCk7Ci0JCWZDdXJzb3JQb3MgPSBkb2N1bWVudFBvc2l0aW9uOwotCQlmRG9jdW1lbnRPZmZzZXQgPSBkb2N1bWVudE9mZnNldDsKLQkJZlF1b3RlID0gcXVvdGU7Ci0JCWluaXRpYWxpemUobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldEN1cnNvclBvcygpIHsKLQkJcmV0dXJuIGZDdXJzb3JQb3M7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0RG9jdW1lbnRPZmZzZXQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnRPZmZzZXQ7Ci0JfQotCi0JSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmU3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCUlDU1NNb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIGZNb2RlbDsKLQl9Ci0KLQlwcml2YXRlIElDU1NOb2RlIGdldE5vZGVBdChpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiAoSUNTU05vZGUpICgoZk1vZGVsICE9IG51bGwpID8gZk1vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0KSA6IG51bGwpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gY2hhcgotCSAqLwotCWNoYXIgZ2V0UXVvdGVPZlN0eWxlQXR0cmlidXRlKCkgewotCQlyZXR1cm4gZlF1b3RlOwotCX0KLQotCUlUZXh0UmVnaW9uIGdldFJlZ2lvbkJ5T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQkvLwlTdHJpbmcgZ2V0UmVnaW9uVGV4dCgpIHsKLQkvLwkJSVRleHRSZWdpb24gdGFyZ2V0UmVnaW9uID0gZ2V0VGFyZ2V0UmVnaW9uKCk7Ci0JLy8JCWlmICh0YXJnZXRSZWdpb24gIT0gbnVsbCkgewotCS8vCQkJcmV0dXJuIHRhcmdldFJlZ2lvbi5nZXRUZXh0KCk7Ci0JLy8JCX0gZWxzZSB7Ci0JLy8JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkvLwkJfQotCS8vCX0KLQkvKioKLQkgKiAgCi0JICovCi0JaW50IGdldFJlcGxhY2VCZWdpbigpIHsKLQkJcmV0dXJuIGZSZXBsYWNlQmVnaW47Ci0JfQotCi0JSUNTU05vZGUgZ2V0VGFyZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIGZUYXJnZXROb2RlOwotCX0KLQotCXByaXZhdGUgaW50IGdldFRhcmdldFBvcygpIHsKLQkJcmV0dXJuIGZUYXJnZXRQb3M7Ci0JfQotCi0JSVRleHRSZWdpb24gZ2V0VGFyZ2V0UmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0UmVnaW9uQnlPZmZzZXQoZ2V0VGFyZ2V0UG9zKCkpOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRUYXJnZXREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGdldERvY3VtZW50UmVnaW9uQnlPZmZzZXQoZ2V0VGFyZ2V0UG9zKCkpOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXREb2N1bWVudFJlZ2lvbkJ5T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIChmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpID8gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpIDogbnVsbDsKLQl9Ci0KLQlJVGV4dFJlZ2lvbiBnZXRUYXJnZXRSZWdpb25QcmV2aW91cygpIHsKLQkJSVRleHRSZWdpb24gcHJldmlvdXNSZWdpb24gPSBudWxsOwotCQlJVGV4dFJlZ2lvbiB0YXJnZXRSZWdpb24gPSBnZXRUYXJnZXRSZWdpb24oKTsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlcmF0b3IgPSBudWxsOwotCQlpZiAodGFyZ2V0UmVnaW9uID09IG51bGwpIHsKLQkJCWlmICgwIDwgZkN1cnNvclBvcykgewotCQkJCWl0ZXJhdG9yID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZDdXJzb3JQb3MgLSAxKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWl0ZXJhdG9yID0gZ2V0UmVnaW9uSXRlcmF0b3IoKTsKLQkJCWlmIChpdGVyYXRvci5oYXNQcmV2KCkpIHsKLQkJCQlpdGVyYXRvci5wcmV2KCk7Ci0JCQl9IGVsc2UgewotCQkJCWl0ZXJhdG9yID0gbnVsbDsKLQkJCX0KLQkJfQotCQlpZiAoaXRlcmF0b3IgIT0gbnVsbCkgewotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc1ByZXYoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXJhdG9yLnByZXYoKTsKLQkJCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYgdHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCAmJiB0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DRE8gJiYgdHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RDKSB7Ci0JCQkJCXByZXZpb3VzUmVnaW9uID0gcmVnaW9uOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcHJldmlvdXNSZWdpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdldFRleHRUb0NvbXBhcmUoKSB7Ci0JCXJldHVybiBmVGV4dFRvQ29tcGFyZTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JU3RyaW5nIGdldFRleHRUb1JlcGxhY2UoKSB7Ci0JCXJldHVybiBmVGV4dFRvUmVwbGFjZTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoSUNTU0RvY3VtZW50IGRvYykgewotCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJQ1NTTW9kZWwgbW9kZWwgPSBkb2MuZ2V0TW9kZWwoKTsKLQkJZk1vZGVsID0gbW9kZWw7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlpbml0aWFsaXplVGFyZ2V0UG9zKCk7Ci0JCWluaXRpYWxpemVUYXJnZXRUZXh0KCk7Ci0JCWluaXRpYWxpemVUYXJnZXROb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVGFyZ2V0Tm9kZSgpIHsKLQkJaWYgKGZDdXJzb3JQb3MgPT0gMCkgewotCQkJZlRhcmdldE5vZGUgPSBmTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGZpbmQgZWRnZSBvZiB0cmVlIG5vZGUKLQkJSUNTU05vZGUgY3Vyc29yTm9kZSA9IGdldE5vZGVBdChmQ3Vyc29yUG9zKTsKLQkJaWYgKGN1cnNvck5vZGUgPT0gbnVsbCkgeyAvLyBlbmQgb2YgZG9jdW1lbnQKLQkJCWN1cnNvck5vZGUgPSBmTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJfQotCQlJQ1NTTm9kZSBub2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZkN1cnNvclBvcyAtIDEpOwotCQl3aGlsZSAoZmxhdE5vZGUgIT0gbnVsbCAmJiAobm9kZSA9IGdldE5vZGVBdChmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpKSkgPT0gY3Vyc29yTm9kZSAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkgIT0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJZmxhdE5vZGUgPSBmbGF0Tm9kZS5nZXRQcmV2aW91cygpOwotCQl9Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7IC8vIHRvcCBvZiBkb2N1bWVudAotCQkJZlRhcmdldE5vZGUgPSAobm9kZSA9PSBudWxsKSA/IGZNb2RlbC5nZXREb2N1bWVudCgpIDogbm9kZTsKLQkJCXJldHVybjsKLQkJfQotCQkvLyAgIHY8LS18Ci0JCS8vICAgQUFBQUFBCi0JCS8vIEJCQkJCQkJCQkIgY3Vyc29yTm9kZTpBICwgbm9kZTpCIC0+IHRhcmdldCBpcyBBCi0JCWlmIChjdXJzb3JOb2RlICE9IG51bGwpIHsKLQkJCWZvciAoSUNTU05vZGUgcGFyZW50ID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQkJaWYgKHBhcmVudCA9PSBjdXJzb3JOb2RlKSB7Ci0JCQkJCWZUYXJnZXROb2RlID0gY3Vyc29yTm9kZTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyAgICAgdjwtLXwKLQkJLy8gICBBQUEKLQkJLy8gQkJCQkJCQkJCQiBjdXJzb3JOb2RlOkIgLCBub2RlOkEgLT4gZGVwZW5kIG9uIEEncyBub2RlIHR5cGUKLQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCWlmIChub2RlVHlwZSA9PSBJQ1NTTm9kZS5TVFlMRURFQ0xJVEVNX05PREUgfHwgbm9kZVR5cGUgPT0gSUNTU05vZGUuQ0hBUlNFVFJVTEVfTk9ERSB8fCBub2RlVHlwZSA9PSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUpIHsKLQkJCVN0cmluZyB0eXBlID0gQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQkJZlRhcmdldE5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZlRhcmdldE5vZGUgPSBub2RlOwotCQkJfQotCQkJLy8JCQlmVGFyZ2V0Tm9kZSA9IChiT3ZlclNlbWlDb2xvbikgPyBub2RlLmdldFBhcmVudE5vZGUoKSA6IG5vZGU7Ci0JCX0gZWxzZSBpZiAoQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGZsYXROb2RlKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQlmVGFyZ2V0Tm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9IGVsc2UgewotCQkJZlRhcmdldE5vZGUgPSBub2RlOwotCQl9Ci0KLQkJcmV0dXJuOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVRhcmdldFBvcygpIHsKLQkJaWYgKGZDdXJzb3JQb3MgPT0gMCB8fCBpc1NwZWNpYWxEZWxpbWl0ZXJSZWdpb24oZkN1cnNvclBvcyAtIDEpKSB7Ci0JCQlmVGFyZ2V0UG9zID0gZkN1cnNvclBvczsKLQkJfSBlbHNlIHsKLQkJCWZUYXJnZXRQb3MgPSBmQ3Vyc29yUG9zIC0gMTsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVRhcmdldFRleHQoKSB7Ci0JCUlUZXh0UmVnaW9uIHRhcmdldFJlZ2lvbiA9IGdldFRhcmdldFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gZ2V0VGFyZ2V0RG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHRhcmdldFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlmUmVwbGFjZUJlZ2luID0gZkN1cnNvclBvczsKLQkJCWZUZXh0VG9SZXBsYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWZUZXh0VG9Db21wYXJlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyByZWdpb25UZXh0ID0gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dCh0YXJnZXRSZWdpb24pOwotCQkJaW50IHJlZ2lvblN0YXJ0ID0gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQodGFyZ2V0UmVnaW9uKTsKLQkJCWlmIChyZWdpb25TdGFydCA9PSBmQ3Vyc29yUG9zIHx8IHJlZ2lvblRleHQudHJpbSgpLmxlbmd0aCgpID09IDAgfHwgcmVnaW9uU3RhcnQgKyByZWdpb25UZXh0Lmxlbmd0aCgpIC0gMSA8IGZUYXJnZXRQb3MpIHsKLQkJCQkvLyB0byBpbnNlcnRpb24KLQkJCQlmUmVwbGFjZUJlZ2luID0gZkN1cnNvclBvczsKLQkJCQlmVGV4dFRvUmVwbGFjZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJZlRleHRUb0NvbXBhcmUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQkvLyB0byByZXBsYWNlCi0JCQkJZlJlcGxhY2VCZWdpbiA9IHJlZ2lvblN0YXJ0OwotCQkJCWZUZXh0VG9SZXBsYWNlID0gcmVnaW9uVGV4dDsKLQkJCQlmVGV4dFRvQ29tcGFyZSA9IHJlZ2lvblRleHQuc3Vic3RyaW5nKDAsIGZDdXJzb3JQb3MgLSBmUmVwbGFjZUJlZ2luKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNTcGVjaWFsRGVsaW1pdGVyUmVnaW9uKGludCBwb3MpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZ2V0UmVnaW9uQnlPZmZzZXQocG9zKTsKLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlib29sZWFuIGlzVGFyZ2V0UG9zQWZ0ZXJPZihTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIGZUYXJnZXROb2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpZiAoc3RhcnQgPCAwIHx8ICgoSW5kZXhlZFJlZ2lvbikgZlRhcmdldE5vZGUpLmdldEVuZE9mZnNldCgpIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVJlZ2lvbkl0ZXJhdG9yIGlSZWdpb24gPSBuZXcgUmVnaW9uSXRlcmF0b3IoZlN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnQpOwotCQl3aGlsZSAoaVJlZ2lvbi5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGlSZWdpb24ubmV4dCgpOwotCQkJaWYgKGZUYXJnZXRQb3MgPCBpUmVnaW9uLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gcmVnaW9uVHlwZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlib29sZWFuIGlzVGFyZ2V0UG9zQmVmb3JlT2YoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJcmV0dXJuICFpc1RhcmdldFBvc0FmdGVyT2YocmVnaW9uVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIHJlZ2lvblR5cGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlib29sZWFuIHRhcmdldEZvbGxvd3MoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJUmVnaW9uSXRlcmF0b3IgaVJlZ2lvbjsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPD0gZlRhcmdldFBvcykgewotCQkJaVJlZ2lvbiA9IG5ldyBSZWdpb25JdGVyYXRvcihmU3RydWN0dXJlZERvY3VtZW50LCBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpIC0gMSk7Ci0JCX0gZWxzZSB7Ci0JCQlpUmVnaW9uID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZUYXJnZXRQb3MpOwotCQkJdHJ5IHsKLQkJCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRDaGFyKGZUYXJnZXRQb3MpKSAmJiBpUmVnaW9uLmhhc1ByZXYoKSkgewotCQkJCQlyZWdpb24gPSBpUmVnaW9uLnByZXYoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJaVJlZ2lvbiA9IG5ldyBSZWdpb25JdGVyYXRvcihmU3RydWN0dXJlZERvY3VtZW50LCBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpIC0gMSk7Ci0JCQl9Ci0JCX0KLQkJd2hpbGUgKGlSZWdpb24uaGFzUHJldigpKSB7Ci0JCQlyZWdpb24gPSBpUmVnaW9uLnByZXYoKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gcmVnaW9uVHlwZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JYm9vbGVhbiB0YXJnZXRIYXMoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBmVGFyZ2V0Tm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgZlRhcmdldE5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAoc3RhcnQgPCAwIHx8IGVuZCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJUmVnaW9uSXRlcmF0b3IgaVJlZ2lvbiA9IG5ldyBSZWdpb25JdGVyYXRvcihmU3RydWN0dXJlZERvY3VtZW50LCBzdGFydCk7Ci0JCXdoaWxlIChpUmVnaW9uLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaVJlZ2lvbi5uZXh0KCk7Ci0JCQlpZiAoZW5kIDw9IGlSZWdpb24uZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gcmVnaW9uVHlwZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlSZWdpb25JdGVyYXRvciBnZXRSZWdpb25JdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWdpb25JdGVyYXRvcihnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgZ2V0VGFyZ2V0UG9zKCkpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlDU1NNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgewotCQlDU1NNZXRhTW9kZWxGaW5kZXIgZmluZGVyID0gQ1NTTWV0YU1vZGVsRmluZGVyLmdldEluc3RhbmNlKCk7Ci0JCXJldHVybiBmaW5kZXIuZmluZE1ldGFNb2RlbEZvcihnZXRNb2RlbCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MzBjZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklDU1NNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzcy5TdHlsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgQ1NTQ29udGVudEFzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQotCXByaXZhdGUgaW50IGZEb2N1bWVudE9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBjaGFyIGZRdW90ZSA9IDA7Ci0JcHJpdmF0ZSBDU1NUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZlRlbXBsYXRlUHJvY2Vzc29yID0gbnVsbDsKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgcHJvcG9zZWQgY29kZSBjb21wbGV0aW9ucyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCi0JICogbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGN1cnNvcgotCSAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dC1lZGl0b3IgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqICAgICAgICAgICAgYSBsb2NhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50Ci0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb2RlLWFzc2lzdCBpdGVtcwotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCi0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZE5vZGUgPSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbiArIGZEb2N1bWVudE9mZnNldCk7Ci0JCUlET01Ob2RlIHhOb2RlID0gbnVsbDsKLQkJSURPTU5vZGUgcGFyZW50ID0gbnVsbDsKLQkJQ1NTUHJvcG9zYWxBcnJhbmdlciBhcnJhbmdlciA9IG51bGw7Ci0JCWJvb2xlYW4gaXNFbXB0eURvY3VtZW50ID0gZmFsc2U7Ci0KLQkJLy8gYmFpbCBpZiB3ZSBjb3VsZG4ndCBnZXQgYW4gaW5kZXhlZCBub2RlCi0JCS8vIGlmKGluZGV4ZWROb2RlID09IG51bGwpIHJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJaWYgKGluZGV4ZWROb2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCXhOb2RlID0gKElET01Ob2RlKSBpbmRleGVkTm9kZTsKLQkJCXBhcmVudCA9IChJRE9NTm9kZSkgeE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCS8vIG5lZWQgdG8gZ2V0IGluIGhlcmUgaWYgdGhlcmUgaW4gdGhlIG5vIDAgcmVnaW9uIDxzdHlsZT58PC9zdHlsZT4KLQkJLy8gY2FzZQotCQlpZiAoKHhOb2RlICE9IG51bGwpICYmIHhOb2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUpKSB7Ci0JCQkvLyBub3cgd2Uga25vdyB0aGUgY3Vyc29yIGlzIGluIGEgPHN0eWxlPiB0YWcgdy9vdXQgcmVnaW9uCi0JCQlJU3RydWN0dXJlZE1vZGVsIGNzc01vZGVsID0gZ2V0Q1NTTW9kZWwoeE5vZGUpOwotCQkJaWYgKGNzc01vZGVsICE9IG51bGwpIHsKLQkJCQkvLyBhZGp1c3Qgb2Zmc2V0cyBmb3IgZW1iZWRkZWQgc3R5bGUKLQkJCQlpbnQgb2Zmc2V0ID0gZG9jdW1lbnRQb3NpdGlvbjsKLQkJCQlpbnQgcG9zID0gMDsKLQkJCQlJbmRleGVkUmVnaW9uIGtleUluZGV4ZWROb2RlID0gY3NzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihwb3MpOwotCQkJCWlmIChrZXlJbmRleGVkTm9kZSA9PSBudWxsKSB7Ci0JCQkJCWtleUluZGV4ZWROb2RlID0gKEluZGV4ZWRSZWdpb24pICgoSUNTU01vZGVsKSBjc3NNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQl9Ci0JCQkJYXJyYW5nZXIgPSBuZXcgQ1NTUHJvcG9zYWxBcnJhbmdlcihwb3MsIChJQ1NTTm9kZSkga2V5SW5kZXhlZE5vZGUsIG9mZnNldCwgKGNoYXIpIDApOwotCQkJfQotCQl9IGVsc2UgaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgcGFyZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUpKSB7Ci0JCQkvLyBub3cgd2Uga25vdyB0aGUgY3Vyc29yIGlzIGluIGEgPHN0eWxlPiB0YWcgd2l0aCBhIHJlZ2lvbgotCQkJLy8gdXNlIHRoZSBwYXJlbnQgYmVjYXVzZSB0aGF0IHdpbGwgYmUgdGhlIDxzdHlsZT4gdGFnCi0JCQlJU3RydWN0dXJlZE1vZGVsIGNzc01vZGVsID0gZ2V0Q1NTTW9kZWwocGFyZW50KTsKLQkJCWlmIChjc3NNb2RlbCAhPSBudWxsKSB7Ci0JCQkJLy8gYWRqdXN0IG9mZnNldHMgZm9yIGVtYmVkZGVkIHN0eWxlCi0JCQkJaW50IG9mZnNldCA9IGluZGV4ZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IHBvcyA9IGRvY3VtZW50UG9zaXRpb24gLSBvZmZzZXQ7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBrZXlJbmRleGVkTm9kZSA9IGNzc01vZGVsLmdldEluZGV4ZWRSZWdpb24ocG9zKTsKLQkJCQlpZiAoa2V5SW5kZXhlZE5vZGUgPT0gbnVsbCkgewotCQkJCQlrZXlJbmRleGVkTm9kZSA9IChJbmRleGVkUmVnaW9uKSAoKElDU1NNb2RlbCkgY3NzTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJfQotCQkJCWFycmFuZ2VyID0gbmV3IENTU1Byb3Bvc2FsQXJyYW5nZXIocG9zLCAoSUNTU05vZGUpIGtleUluZGV4ZWROb2RlLCBvZmZzZXQsIChjaGFyKSAwKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChpbmRleGVkTm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkvLyBnZXQgbW9kZWwgZm9yIG5vZGUgdy8gc3R5bGUgYXR0cmlidXRlCi0JCQlJU3RydWN0dXJlZE1vZGVsIGNzc01vZGVsID0gZ2V0Q1NTTW9kZWwoKElET01Ob2RlKSBpbmRleGVkTm9kZSk7Ci0JCQlpZiAoY3NzTW9kZWwgIT0gbnVsbCkgewotCQkJCUluZGV4ZWRSZWdpb24ga2V5SW5kZXhlZE5vZGUgPSBjc3NNb2RlbC5nZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50UG9zaXRpb24gLSBmRG9jdW1lbnRPZmZzZXQpOwotCQkJCWlmIChrZXlJbmRleGVkTm9kZSA9PSBudWxsKSB7Ci0JCQkJCWtleUluZGV4ZWROb2RlID0gKEluZGV4ZWRSZWdpb24pICgoSUNTU01vZGVsKSBjc3NNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQl9Ci0JCQkJaWYgKGtleUluZGV4ZWROb2RlIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCQkJLy8gaW5saW5lIHN0eWxlIGZvciBhIHRhZywgbm90IGVtYmVkZGVkCi0JCQkJCWFycmFuZ2VyID0gbmV3IENTU1Byb3Bvc2FsQXJyYW5nZXIoZG9jdW1lbnRQb3NpdGlvbiwgKElDU1NOb2RlKSBrZXlJbmRleGVkTm9kZSwgZkRvY3VtZW50T2Zmc2V0LCBmUXVvdGUpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChpbmRleGVkTm9kZSBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkvLyB3aGVuIGVkaXRpbmcgZXh0ZXJuYWwgQ1NTIHVzaW5nIENTUyBEZXNpZ25lciwgSUNTU05vZGUgaXMKLQkJCS8vIHBhc3NlZC4KLQkJCUlDU1NEb2N1bWVudCBjc3Nkb2MgPSAoKElDU1NOb2RlKSBpbmRleGVkTm9kZSkuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGNzc2RvYyAhPSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBjc3NNb2RlbCA9IGNzc2RvYy5nZXRNb2RlbCgpOwotCQkJCWlmIChjc3NNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCUluZGV4ZWRSZWdpb24ga2V5SW5kZXhlZE5vZGUgPSBjc3NNb2RlbC5nZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50UG9zaXRpb24gLSBmRG9jdW1lbnRPZmZzZXQpOwotCQkJCQlpZiAoa2V5SW5kZXhlZE5vZGUgPT0gbnVsbCkgewotCQkJCQkJa2V5SW5kZXhlZE5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgKChJQ1NTTW9kZWwpIGNzc01vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCQl9Ci0JCQkJCWlmIChrZXlJbmRleGVkTm9kZSBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkJCQkvLyBpbmxpbmUgc3R5bGUgZm9yIGEgdGFnLCBub3QgZW1iZWRkZWQKLQkJCQkJCWFycmFuZ2VyID0gbmV3IENTU1Byb3Bvc2FsQXJyYW5nZXIoZG9jdW1lbnRQb3NpdGlvbiwgKElDU1NOb2RlKSBrZXlJbmRleGVkTm9kZSwgZkRvY3VtZW50T2Zmc2V0LCBmUXVvdGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKChpbmRleGVkTm9kZSA9PSBudWxsKSAmJiBpc1ZpZXdlckVtcHR5KHZpZXdlcikpIHsKLQkJCWlzRW1wdHlEb2N1bWVudCA9IHRydWU7Ci0JCQkvLyB0aGUgdG9wIG9mIGVtcHR5IENTUyBEb2N1bWVudAotCQkJSVN0cnVjdHVyZWRNb2RlbCBjc3NNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWNzc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZCh2aWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJaWYgKGNzc01vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQkJCUluZGV4ZWRSZWdpb24ga2V5SW5kZXhlZE5vZGUgPSBjc3NNb2RlbC5nZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50UG9zaXRpb24gLSBmRG9jdW1lbnRPZmZzZXQpOwotCQkJCQlpZiAoa2V5SW5kZXhlZE5vZGUgPT0gbnVsbCkgewotCQkJCQkJa2V5SW5kZXhlZE5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgKChJQ1NTTW9kZWwpIGNzc01vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCQl9Ci0JCQkJCWlmIChrZXlJbmRleGVkTm9kZSBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkJCQkvLyBpbmxpbmUgc3R5bGUgZm9yIGEgdGFnLCBub3QgZW1iZWRkZWQKLQkJCQkJCWFycmFuZ2VyID0gbmV3IENTU1Byb3Bvc2FsQXJyYW5nZXIoZG9jdW1lbnRQb3NpdGlvbiwgKElDU1NOb2RlKSBrZXlJbmRleGVkTm9kZSwgZkRvY3VtZW50T2Zmc2V0LCBmUXVvdGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoY3NzTW9kZWwgIT0gbnVsbCkKLQkJCQkJY3NzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCWlmIChhcnJhbmdlciAhPSBudWxsKSB7Ci0JCQlmRG9jdW1lbnRPZmZzZXQgPSAwOwotCQkJcHJvcG9zYWxzID0gYXJyYW5nZXIuZ2V0UHJvcG9zYWxzKCk7Ci0KLQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBuZXdmaWxlcHJvcG9zYWxzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCQlJQ29tcGxldGlvblByb3Bvc2FsW10gYW55cHJvcG9zYWxzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCQkvLyBhZGQgdGVtcGxhdGUgcHJvcG9zYWxzCi0JCQlpZiAoZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkgIT0gbnVsbCkgewotCQkJCWlmIChpc0VtcHR5RG9jdW1lbnQpIHsKLQkJCQkJZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuc2V0Q29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0NTUy5ORVcpOwotCQkJCQluZXdmaWxlcHJvcG9zYWxzID0gZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQl9Ci0JCQkJZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuc2V0Q29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0NTUy5BTEwpOwotCQkJCWFueXByb3Bvc2FscyA9IGdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQl9Ci0KLQkJCS8vIGFkZCBlbmQgdGFnIGlmIHBhcmVudCBpcyBub3QgY2xvc2VkCi0JCQlJQ29tcGxldGlvblByb3Bvc2FsIGVuZFRhZyA9IFhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXMuY29tcHV0ZVhNTEVuZFRhZ1Byb3Bvc2FsKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbiwgaW5kZXhlZE5vZGUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSwgU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX09CSl9UQUdfR0VORVJJQyk7IAotCi0JCQkvLyBhZGQgdGhlIGFkZGl0aW9uYWwgcHJvcG9zYWxzCi0JCQlpbnQgYWRkaXRpb25hbExlbmd0aCA9IG5ld2ZpbGVwcm9wb3NhbHMubGVuZ3RoICsgYW55cHJvcG9zYWxzLmxlbmd0aDsKLQkJCWFkZGl0aW9uYWxMZW5ndGggPSAoZW5kVGFnICE9IG51bGwpID8gKythZGRpdGlvbmFsTGVuZ3RoIDogYWRkaXRpb25hbExlbmd0aDsKLQkJCWlmIChhZGRpdGlvbmFsTGVuZ3RoID4gMCkgewotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwbHVzT25lcyA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3Byb3Bvc2Fscy5sZW5ndGggKyBhZGRpdGlvbmFsTGVuZ3RoXTsKLQkJCQlpbnQgYXBwZW5kUG9zID0gcHJvcG9zYWxzLmxlbmd0aDsKLQkJCQkvLyBhZGQgZW5kIHRhZyBwcm9wb3NhbAotCQkJCWlmIChlbmRUYWcgIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHByb3Bvc2FscywgMCwgcGx1c09uZXMsIDEsIHByb3Bvc2Fscy5sZW5ndGgpOwotCQkJCQlwbHVzT25lc1swXSA9IGVuZFRhZzsKLQkJCQkJKythcHBlbmRQb3M7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShwcm9wb3NhbHMsIDAsIHBsdXNPbmVzLCAwLCBwcm9wb3NhbHMubGVuZ3RoKTsKLQkJCQl9Ci0JCQkJLy8gYWRkIGl0ZW1zIGluIG5ld2ZpbGVwcm9wb3NhbHMKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld2ZpbGVwcm9wb3NhbHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJcGx1c09uZXNbYXBwZW5kUG9zICsgaV0gPSBuZXdmaWxlcHJvcG9zYWxzW2ldOwotCQkJCX0KLQkJCQkvLyBhZGQgaXRlbXMgaW4gYW55cHJvcG9zYWxzCi0JCQkJYXBwZW5kUG9zID0gYXBwZW5kUG9zICsgbmV3ZmlsZXByb3Bvc2Fscy5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbnlwcm9wb3NhbHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJcGx1c09uZXNbYXBwZW5kUG9zICsgaV0gPSBhbnlwcm9wb3NhbHNbaV07Ci0JCQkJfQotCQkJCXByb3Bvc2FscyA9IHBsdXNPbmVzOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9wb3NhbHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIG5vIHRleHQgb3IgaXQncyBhbGwgd2hpdGUgc3BhY2UsIG90aGVyd2lzZQotCSAqIHJldHVybnMgZmFsc2UKLQkgKiAKLQkgKiBAcGFyYW0gdHJlZU5vZGUKLQkgKiBAcGFyYW0gdGV4dFZpZXdlcgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZpZXdlckVtcHR5KElUZXh0Vmlld2VyIHRleHRWaWV3ZXIpIHsKLQkJYm9vbGVhbiBpc0VtcHR5ID0gZmFsc2U7Ci0JCVN0cmluZyB0ZXh0ID0gdGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuZ2V0VGV4dCgpOwotCQlpZiAoKHRleHQgPT0gbnVsbCkgfHwgKCh0ZXh0ICE9IG51bGwpICYmIHRleHQudHJpbSgpLmVxdWFscygiIikpKSAvLyROT04tTkxTLTEkCi0JCQlpc0VtcHR5ID0gdHJ1ZTsKLQkJcmV0dXJuIGlzRW1wdHk7Ci0JfQotCi0JLyoqCi0JICogR2V0IENTU01vZGVsIGZvciBhbiBpbmRleGVkIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXhlZE5vZGUKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkTW9kZWwKLQkgKi8KLQkvLyBwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0Q1NTTW9kZWwoSW5kZXhlZFJlZ2lvbiBpbmRleGVkTm9kZSkgewotCS8vIGlmIChpbmRleGVkTm9kZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkvLyBOb2RlIG5vZGUgPSAoTm9kZSlpbmRleGVkTm9kZTsKLQkvLyBJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JLy8gaWYgKG5vdGlmaWVyID09IG51bGwpIHJldHVybiBudWxsOwotCS8vIElOb2RlQWRhcHRlciBhZGFwdGVyID0KLQkvLyBTdHlsZUFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQobm90aWZpZXIpOwotCS8vIGlmIChhZGFwdGVyID09IG51bGwgfHwgIShhZGFwdGVyIGluc3RhbmNlb2YgQ1NTTW9kZWxBZGFwdGVyKSkgcmV0dXJuCi0JLy8gbnVsbDsKLQkvLyBDU1NNb2RlbEFkYXB0ZXIgbW9kZWxBZGFwdGVyID0gKENTU01vZGVsQWRhcHRlcilhZGFwdGVyOwotCS8vIHJldHVybiBtb2RlbEFkYXB0ZXIuZ2V0TW9kZWwoKTsKLQkvLyB9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgQ1NTbW9kZWwgZm9yIGEgZ2l2ZW4gWE1MIG5vZGUuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkTW9kZWwKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0Q1NTTW9kZWwoSURPTU5vZGUgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gU3R5bGVBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGVsZW1lbnQpOwotCQlpZiAoKGFkYXB0ZXIgPT0gbnVsbCkgfHwgIShhZGFwdGVyIGluc3RhbmNlb2YgSUNTU01vZGVsQWRhcHRlcikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUNTU01vZGVsQWRhcHRlciBtb2RlbEFkYXB0ZXIgPSAoSUNTU01vZGVsQWRhcHRlcikgYWRhcHRlcjsKLQkJcmV0dXJuIG1vZGVsQWRhcHRlci5nZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgcG9zc2libGUgY29udGV4dHMgYmFzZWQgb24gdGhlIHNwZWNpZmllZAotCSAqIGxvY2F0aW9uIHdpdGhpbiB0aGUgZG9jdW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBjdXJzb3IKLQkgKiBwb3NpdGlvbiB3aXRoaW4gdGhlIHRleHQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgd2hvc2UgZG9jdW1lbnQgaXMgdXNlZCB0byBjb21wdXRlIHRoZSBwb3NzaWJsZQotCSAqICAgICAgICAgICAgY29udGV4dHMKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqICAgICAgICAgICAgYW4gb2Zmc2V0IHdpdGhpbiB0aGUgZG9jdW1lbnQgZm9yIHdoaWNoIGNvbnRleHQgaW5mb3JtYXRpb24KLQkgKiAgICAgICAgICAgIHNob3VsZCBiZSBjb21wdXRlZAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY29udGV4dCBpbmZvcm1hdGlvbiBvYmplY3RzIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICBpZiBubyBjb250ZXh0IGNvdWxkIGJlIGZvdW5kCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uW10gY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBlbnRlcmVkIGJ5IHRoZSB1c2VyIHNob3VsZAotCSAqIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgcHJlc2VudGF0aW9uIG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBjb21wbGV0aW9uIHByb3Bvc2FsIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBhdXRvIGFjdGl2YXRpb24gaXMgZGVzaXJlZAotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIHdoZW4gZW50ZXJlZCBieSB0aGUgdXNlciBzaG91bGQKLQkgKiBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgdGhlIHByZXNlbnRhdGlvbiBvZiBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBwcmVzZW50aW5nIGNvbnRleHQKLQkgKiAgICAgICAgIGluZm9ybWF0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGF1dG8gYWN0aXZhdGlvbiBpcwotCSAqICAgICAgICAgZGVzaXJlZAotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgdmFsaWRhdG9yIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gZGlzcGxheWVkIGNvbnRleHQKLQkgKiBpbmZvcm1hdGlvbiBzaG91bGQgYmUgZGlzbWlzc2VkLiBNYXkgb25seSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGUgcHJvY2Vzc29yIGlzIGluY2FwYWJsZSBvZiBjb21wdXRpbmcgY29udGV4dCBpbmZvcm1hdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29udGV4dCBpbmZvcm1hdGlvbiB2YWxpZGF0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotCSAqICAgICAgICAgcHJvY2Vzc29yIGlzIGluY2FwYWJsZSBvZiBjb21wdXRpbmcgY29udGV4dCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVhc29uIHdoeSBjb21wdXRlUHJvcG9zYWxzIHdhcyBub3QgYWJsZSB0byBmaW5kIGFueQotCSAqIGNvbXBsZXRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gYW4gZXJyb3IgbWVzc2FnZSBvciBudWxsIGlmIG5vIGVycm9yIG9jY3VycmVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDIwMDEvMDUvMjIKLQkgKiAxMDozNzowNSkKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCWZEb2N1bWVudE9mZnNldCA9IG9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcXVvdGUKLQkgKiAgICAgICAgICAgIGNoYXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRRdW90ZUNoYXJPZlN0eWxlQXR0cmlidXRlKGNoYXIgcXVvdGUpIHsKLQkJZlF1b3RlID0gcXVvdGU7Ci0JfQotCi0JcHJpdmF0ZSBDU1NUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZlRlbXBsYXRlUHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZUZW1wbGF0ZVByb2Nlc3NvciA9IG5ldyBDU1NUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQkJfQotCQlyZXR1cm4gZlRlbXBsYXRlUHJvY2Vzc29yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsQXJyYW5nZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsQXJyYW5nZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY3ZjVjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEFycmFuZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNZWRpYVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUGFnZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVTaGVldDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlOwotCi1jbGFzcyBDU1NQcm9wb3NhbEFycmFuZ2VyIHsKLQotCXByaXZhdGUgTGlzdCBmUHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgQ1NTQ29udGVudEFzc2lzdENvbnRleHQgZkNvbnRleHQgPSBudWxsOwotCi0JLyoqCi0JICogQ1NTUHJvcG9zYWxBcnJhbmdlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgQ1NTUHJvcG9zYWxBcnJhbmdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDU1NQcm9wb3NhbEFycmFuZ2VyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTUHJvcG9zYWxBcnJhbmdlcihpbnQgZG9jdW1lbnRQb3NpdGlvbiwgSUNTU05vZGUgbm9kZSwgaW50IGRvY3VtZW50T2Zmc2V0LCBjaGFyIHF1b3RlKSB7Ci0JCXRoaXMoKTsKLQkJZkNvbnRleHQgPSBuZXcgQ1NTQ29udGVudEFzc2lzdENvbnRleHQoZG9jdW1lbnRQb3NpdGlvbiwgbm9kZSwgZG9jdW1lbnRPZmZzZXQsIHF1b3RlKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0Jdm9pZCBidWlsZFByb3Bvc2FscygpIHsKLQkJZlByb3Bvc2Fscy5jbGVhcigpOwotCi0JCS8qCi0JCSAqIFN0cmluZyB0ZXh0OyBJQ29tcGxldGlvblByb3Bvc2FsIGl0ZW07IHRleHQgPSAiLS0tLSBUZXN0Ci0JCSAqIEluZm9ybWF0aW9uIC0tLS0iOyBpdGVtID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwKLQkJICogZkNvbnRleHQuZ2V0UmVwbGFjZUJlZ2luKCksIDAsIDAsIG51bGwsIHRleHQsIG51bGwsIG51bGwpOwotCQkgKiBmUHJvcG9zYWxzLmFkZChpdGVtKTsKLQkJICogCi0JCSAqIHRleHQgPSAiVGFyZ2V0OiBcIiIgKyBmQ29udGV4dC5nZXRSZWdpb25UZXh0KCkgKyAiXCIiOwotCQkgKiAKLQkJICogaXRlbSA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIGZDb250ZXh0LmdldFJlcGxhY2VCZWdpbigpLCAwLCAwLAotCQkgKiBudWxsLCB0ZXh0LCBudWxsLCBudWxsKTsgZlByb3Bvc2Fscy5hZGQoaXRlbSk7Ci0JCSAqIAotCQkgKiB0ZXh0ID0gZkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpLmdldENsYXNzKCkudG9TdHJpbmcoKTsgaW50Ci0JCSAqIGxhc3RQZXJpb2RQb3MgPSB0ZXh0Lmxhc3RJbmRleE9mKCcuJyk7IHRleHQgPSAiTm9kZTogIiArCi0JCSAqIHRleHQuc3Vic3RyaW5nKGxhc3RQZXJpb2RQb3MgKyAxKTsgaXRlbSA9IG5ldwotCQkgKiBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIGZDb250ZXh0LmdldFJlcGxhY2VCZWdpbigpLCAwLCAwLCBudWxsLAotCQkgKiB0ZXh0LCBudWxsLCBudWxsKTsgZlByb3Bvc2Fscy5hZGQoaXRlbSk7Ci0JCSAqLwotCi0JCUlDU1NOb2RlIHRhcmdldE5vZGUgPSBmQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCS8vaW50IHRhcmdldFBvcyA9IGZDb250ZXh0LmdldFRhcmdldFBvcygpOwotCQlpZiAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0KSB7Ci0JCQlidWlsZFByb3Bvc2Fsc0ZvckFueVJ1bGUoKTsKLQkJfSBlbHNlIGlmICgodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NNZWRpYVJ1bGUgJiYgZkNvbnRleHQuaXNUYXJnZXRQb3NBZnRlck9mKENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpKSB8fCAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUgJiYgZkNvbnRleHQuaXNUYXJnZXRQb3NCZWZvcmVPZihDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSkpIHsKLQkJCWJ1aWxkUHJvcG9zYWxzRm9yQW55UnVsZSgpOwotCQkJLy8JCWJ1aWxkUHJvcG9zYWxzRm9yU3R5bGVSdWxlKCk7Ci0JCX0gZWxzZSBpZiAoKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTUGFnZVJ1bGUgJiYgZkNvbnRleHQuaXNUYXJnZXRQb3NCZWZvcmVPZihDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSkpIHsKLQkJCWJ1aWxkUHJvcG9zYWxzRm9yUGFnZVJ1bGVQc2V1ZG9DbGFzcygpOwotCQl9IGVsc2UgaWYgKCh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSB8fCB0YXJnZXROb2RlIGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlIHx8IHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTUGFnZVJ1bGUgfHwgdGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xhcmF0aW9uKSAmJiAodGFyZ2V0Tm9kZS5nZXRPd25lckRvY3VtZW50KCkgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsYXJhdGlvbiB8fCBmQ29udGV4dC50YXJnZXRGb2xsb3dzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHx8IGZDb250ZXh0LnRhcmdldEZvbGxvd3MoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkpKSB7Ci0JCQlidWlsZFByb3Bvc2Fsc0ZvckRlY2xhcmF0aW9uTmFtZSgpOwotCQl9IGVsc2UgaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJaWYgKGZDb250ZXh0LmlzVGFyZ2V0UG9zQWZ0ZXJPZihDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SKSkgewotCQkJCWJ1aWxkUHJvcG9zYWxzRm9yRGVjbGFyYXRpb25WYWx1ZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlidWlsZFByb3Bvc2Fsc0ZvckRlY2xhcmF0aW9uTmFtZSgpOwotCQkJfQotCQl9IGVsc2UgaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUpIHsKLQkJCWJ1aWxkUHJvcG9zYWxzRm9yRGVjbGFyYXRpb25WYWx1ZSgpOwotCQl9Ci0JCS8qCi0JCSAqIGVsc2UgaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUgfHwgKCh0YXJnZXROb2RlCi0JCSAqIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSB8fCB0YXJnZXROb2RlIGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlIHx8Ci0JCSAqIHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsYXJhdGlvbiB8fCB0YXJnZXROb2RlIGluc3RhbmNlb2YKLQkJICogSUNTU1N0eWxlRGVjbEl0ZW0pICYmCi0JCSAqIGZDb250ZXh0LmlzVGFyZ2V0UG9zQWZ0ZXJPZihDU1NSZWdpb25Db250ZXh0cy5DT0xPTikpKSB7Ci0JCSAqIGJ1aWxkUHJvcG9zYWxzRm9yRGVjbGFyYXRpb25WYWx1ZSgpOyB9Ci0JCSAqLwotCi0JCS8vIGZvciBUZXN0Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXZvaWQgYnVpbGRQcm9wb3NhbHNGb3JBbnlSdWxlKCkgewotCQlDU1NQcm9wb3NhbEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0JCWdlbmVyYXRvciA9IG5ldyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckF0bWFya1J1bGUoZkNvbnRleHQpOwotCQlmUHJvcG9zYWxzLmFkZEFsbChnZW5lcmF0b3IuZ2V0UHJvcG9zYWxzKCkpOwotCQlnZW5lcmF0b3IgPSBuZXcgQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JIVE1MVGFnKGZDb250ZXh0KTsKLQkJZlByb3Bvc2Fscy5hZGRBbGwoZ2VuZXJhdG9yLmdldFByb3Bvc2FscygpKTsKLQkJZ2VuZXJhdG9yID0gbmV3IENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yUHNldWRvU2VsZWN0b3IoZkNvbnRleHQpOwotCQlmUHJvcG9zYWxzLmFkZEFsbChnZW5lcmF0b3IuZ2V0UHJvcG9zYWxzKCkpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQl2b2lkIGJ1aWxkUHJvcG9zYWxzRm9yRGVjbGFyYXRpb25OYW1lKCkgewotCQlDU1NQcm9wb3NhbEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0JCWdlbmVyYXRvciA9IG5ldyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uTmFtZShmQ29udGV4dCk7Ci0JCWZQcm9wb3NhbHMuYWRkQWxsKGdlbmVyYXRvci5nZXRQcm9wb3NhbHMoKSk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXZvaWQgYnVpbGRQcm9wb3NhbHNGb3JEZWNsYXJhdGlvblZhbHVlKCkgewotCQlDU1NQcm9wb3NhbEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0JCWdlbmVyYXRvciA9IG5ldyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uVmFsdWUoZkNvbnRleHQpOwotCQlmUHJvcG9zYWxzLmFkZEFsbChnZW5lcmF0b3IuZ2V0UHJvcG9zYWxzKCkpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQl2b2lkIGJ1aWxkUHJvcG9zYWxzRm9yUGFnZVJ1bGVQc2V1ZG9DbGFzcygpIHsKLQkJQ1NTUHJvcG9zYWxHZW5lcmF0b3IgZ2VuZXJhdG9yOwotCQlnZW5lcmF0b3IgPSBuZXcgQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JQc2V1ZG9TZWxlY3RvcihmQ29udGV4dCk7Ci0JCWZQcm9wb3NhbHMuYWRkQWxsKGdlbmVyYXRvci5nZXRQcm9wb3NhbHMoKSk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXZvaWQgYnVpbGRQcm9wb3NhbHNGb3JTdHlsZVJ1bGUoKSB7Ci0JCUNTU1Byb3Bvc2FsR2VuZXJhdG9yIGdlbmVyYXRvcjsKLQkJZ2VuZXJhdG9yID0gbmV3IENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9ySFRNTFRhZyhmQ29udGV4dCk7Ci0JCWZQcm9wb3NhbHMuYWRkQWxsKGdlbmVyYXRvci5nZXRQcm9wb3NhbHMoKSk7Ci0JCWdlbmVyYXRvciA9IG5ldyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvclBzZXVkb1NlbGVjdG9yKGZDb250ZXh0KTsKLQkJZlByb3Bvc2Fscy5hZGRBbGwoZ2VuZXJhdG9yLmdldFByb3Bvc2FscygpKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFByb3Bvc2FscygpIHsKLQkJYnVpbGRQcm9wb3NhbHMoKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FsQXJyYXkgPSBuZXcgQ29tcGxldGlvblByb3Bvc2FsW2ZQcm9wb3NhbHMuc2l6ZSgpXTsKLQkJSXRlcmF0b3IgaUl0ZW0gPSBmUHJvcG9zYWxzLml0ZXJhdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpSXRlbS5oYXNOZXh0KCk7IGkrKykgewotCQkJcHJvcG9zYWxBcnJheVtpXSA9IChJQ29tcGxldGlvblByb3Bvc2FsKSBpSXRlbS5uZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIHByb3Bvc2FsQXJyYXk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMzkzMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLWFic3RyYWN0IGNsYXNzIENTU1Byb3Bvc2FsR2VuZXJhdG9yIHsKLQotCi0JcHJvdGVjdGVkIGNsYXNzIFN0cmluZ0FuZE9mZnNldCB7Ci0JCVN0cmluZ0FuZE9mZnNldChTdHJpbmcgc3RyaW5nLCBpbnQgb2Zmc2V0KSB7Ci0JCQl0aGlzLmZTdHJpbmcgPSBzdHJpbmc7Ci0JCQl0aGlzLmZPZmZzZXQgPSBvZmZzZXQ7Ci0JCX0KLQotCQlTdHJpbmcgZlN0cmluZzsKLQkJaW50IGZPZmZzZXQ7Ci0JfQotCi0JcHJvdGVjdGVkIENTU0NvbnRlbnRBc3Npc3RDb250ZXh0IGZDb250ZXh0ID0gbnVsbDsKLQotCS8qKgotCSAqIENTU1Byb3Bvc2FsR2VuZXJhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBDU1NQcm9wb3NhbEdlbmVyYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NQcm9wb3NhbEdlbmVyYXRvcihDU1NDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0KSB7Ci0JCXRoaXMoKTsKLQkJZkNvbnRleHQgPSBjb250ZXh0OwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0xlYWRpbmdDb2xvbigpIHsKLQkJYm9vbGVhbiBoYXNMZWFkaW5nQ29sb24gPSBmYWxzZTsKLQkJSVRleHRSZWdpb24gdGFyZ2V0UmVnaW9uID0gZkNvbnRleHQuZ2V0VGFyZ2V0UmVnaW9uKCk7Ci0JCWlmICh0YXJnZXRSZWdpb24gPT0gbnVsbCAmJiAwIDwgZkNvbnRleHQuZ2V0Q3Vyc29yUG9zKCkpIHsKLQkJCXRhcmdldFJlZ2lvbiA9IGZDb250ZXh0LmdldFJlZ2lvbkJ5T2Zmc2V0KGZDb250ZXh0LmdldEN1cnNvclBvcygpIC0gMSk7Ci0JCQlpZiAodGFyZ2V0UmVnaW9uICE9IG51bGwgJiYgdGFyZ2V0UmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfUFNFVURPKSB7Ci0JCQkJaGFzTGVhZGluZ0NvbG9uID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIGlmICh0YXJnZXRSZWdpb24gIT0gbnVsbCkgewotCQkJUmVnaW9uSXRlcmF0b3IgaXRlcmF0b3IgPSBmQ29udGV4dC5nZXRSZWdpb25JdGVyYXRvcigpOwotCQkJaWYgKGl0ZXJhdG9yLmhhc1ByZXYoKSkgewotCQkJCWl0ZXJhdG9yLnByZXYoKTsKLQkJCQlpZiAoaXRlcmF0b3IuaGFzUHJldigpICYmIGl0ZXJhdG9yLnByZXYoKS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1BTRVVETykgewotCQkJCQloYXNMZWFkaW5nQ29sb24gPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaGFzTGVhZGluZ0NvbG9uOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nQW5kT2Zmc2V0IGdlbmVyYXRlQnJhY2VzKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgbGluZURlbGltaXRlciA9IGZDb250ZXh0LmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTdHJpbmcgaW5kZW50U3RyID0gZ2V0SW5kZW50U3RyaW5nKCk7Ci0JCWlmIChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfTkVXTElORV9PTl9PUEVOX0JSQUNFKSkgewotCQkJYnVmLmFwcGVuZChsaW5lRGVsaW1pdGVyKTsKLQkJfQotCQlidWYuYXBwZW5kKCJ7Iik7Ly8kTk9OLU5MUy0xJAotCQlpZiAocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX09ORV9QRVJfTElORSkpIHsKLQkJCWJ1Zi5hcHBlbmQobGluZURlbGltaXRlcik7Ci0JCQlidWYuYXBwZW5kKGluZGVudFN0cik7Ci0JCX0gZWxzZSB7Ci0JCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWludCBvZmZzZXQgPSBidWYubGVuZ3RoKCk7Ci0JCWlmIChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfT05FX1BFUl9MSU5FKSkgewotCQkJYnVmLmFwcGVuZChsaW5lRGVsaW1pdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJYnVmLmFwcGVuZCgifSIpOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG5ldyBTdHJpbmdBbmRPZmZzZXQoYnVmLnRvU3RyaW5nKCksIG9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdBbmRPZmZzZXQgZ2VuZXJhdGVQYXJlbnRoZXNpcygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IG9mZnNldDsKLQkJYnVmLmFwcGVuZCgiKCIpOy8vJE5PTi1OTFMtMSQKLQkJb2Zmc2V0ID0gMTsKLQkJYnVmLmFwcGVuZCgiKSIpOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG5ldyBTdHJpbmdBbmRPZmZzZXQoYnVmLnRvU3RyaW5nKCksIG9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdBbmRPZmZzZXQgZ2VuZXJhdGVRdW90ZXMoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWNoYXIgcXVvdGVDaGFyID0gZ2V0UXVvdGVDaGFyKCk7Ci0JCWJ1Zi5hcHBlbmQocXVvdGVDaGFyKTsKLQkJYnVmLmFwcGVuZChxdW90ZUNoYXIpOwotCQlyZXR1cm4gbmV3IFN0cmluZ0FuZE9mZnNldChidWYudG9TdHJpbmcoKSwgMSk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdBbmRPZmZzZXQgZ2VuZXJhdGVTZW1pY29sb24oKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBvZmZzZXQ7Ci0JCWJ1Zi5hcHBlbmQoIjsiKTsvLyROT04tTkxTLTEkCi0JCW9mZnNldCA9IDA7Ci0JCXJldHVybiBuZXcgU3RyaW5nQW5kT2Zmc2V0KGJ1Zi50b1N0cmluZygpLCBvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nQW5kT2Zmc2V0IGdlbmVyYXRlVVJJKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkKLQkJYm9vbGVhbiBpc1F1b3RlSW5VUkkgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEVfSU5fVVJJKTsKLQkJY2hhciBxdW90ZUNoYXIgPSBnZXRRdW90ZUNoYXIoKTsKLQkJYnVmLmFwcGVuZCgidXJsKCIpOy8vJE5PTi1OTFMtMSQKLQkJaWYgKGlzUXVvdGVJblVSSSkgewotCQkJYnVmLmFwcGVuZChxdW90ZUNoYXIpOwotCQl9Ci0JCWludCBvZmZzZXQgPSBidWYubGVuZ3RoKCk7Ci0JCWlmIChpc1F1b3RlSW5VUkkpIHsKLQkJCWJ1Zi5hcHBlbmQocXVvdGVDaGFyKTsKLQkJfQotCQlidWYuYXBwZW5kKCIpIik7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IFN0cmluZ0FuZE9mZnNldChidWYudG9TdHJpbmcoKSwgb2Zmc2V0KTsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2FuZGlkYXRlcygpOwotCi0JTGlzdCBnZXRQcm9wb3NhbHMoKSB7Ci0JCUxpc3QgcHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUNTU0ltYWdlSGVscGVyIGltYWdlSGVscGVyID0gQ1NTSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKTsKLQkJSXRlcmF0b3IgaSA9IGdldENhbmRpZGF0ZXMoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDU1NDQUNhbmRpZGF0ZSBjYW5kaWRhdGUgPSAoQ1NTQ0FDYW5kaWRhdGUpIGkubmV4dCgpOwotCQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZUhlbHBlci5nZXRJbWFnZShjYW5kaWRhdGUuZ2V0SW1hZ2VUeXBlKCkpOwotCQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBpdGVtID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbChjYW5kaWRhdGUuZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKSwgZkNvbnRleHQuZ2V0UmVwbGFjZUJlZ2luKCkgKyBmQ29udGV4dC5nZXREb2N1bWVudE9mZnNldCgpLCBmQ29udGV4dC5nZXRUZXh0VG9SZXBsYWNlKCkubGVuZ3RoKCksIGNhbmRpZGF0ZS5nZXRDdXJzb3JQb3NpdGlvbigpLCBpbWFnZSwgY2FuZGlkYXRlLmdldERpc3BsYXlTdHJpbmcoKSwgbnVsbCwgbnVsbCk7Ci0JCQlwcm9wb3NhbHMuYWRkKGl0ZW0pOwotCQl9Ci0KLQkJcmV0dXJuIHByb3Bvc2FsczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGNoYXIKLQkgKi8KLQlwcml2YXRlIGNoYXIgZ2V0UXVvdGVDaGFyKCkgewotCi0JCVN0cmluZyBxdW90ZVN0ciA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQkJY2hhciBxdW90ZUNoYXIgPSAocXVvdGVTdHIgIT0gbnVsbCAmJiAwIDwgcXVvdGVTdHIubGVuZ3RoKCkpID8gcXVvdGVTdHIuY2hhckF0KDApIDogJyInOwotCQljaGFyIGF0dHJRdW90ZSA9IGZDb250ZXh0LmdldFF1b3RlT2ZTdHlsZUF0dHJpYnV0ZSgpOwotCQlpZiAoYXR0clF1b3RlICE9IDApIHsKLQkJCWlmIChhdHRyUXVvdGUgPT0gJyInICYmIHF1b3RlQ2hhciA9PSAnIicpIHsKLQkJCQlxdW90ZUNoYXIgPSAnXCcnOwotCQkJfSBlbHNlIGlmIChhdHRyUXVvdGUgPT0gJ1wnJyAmJiBxdW90ZUNoYXIgPT0gJ1wnJykgewotCQkJCXF1b3RlQ2hhciA9ICciJzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcXVvdGVDaGFyOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc01hdGNoKFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyB0ZXh0VG9Db21wYXJlID0gZkNvbnRleHQuZ2V0VGV4dFRvQ29tcGFyZSgpOwotCQlpZiAodGV4dFRvQ29tcGFyZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAodGV4dC50b1VwcGVyQ2FzZSgpLmluZGV4T2YodGV4dFRvQ29tcGFyZS50b1VwcGVyQ2FzZSgpKSA9PSAwKTsKLQkJfQotCQkvKgotCQkgKiBTdHJpbmcgdGV4dFRvUmVwbGFjZSA9IGZDb250ZXh0LmdldFRleHRUb1JlcGxhY2UoKTsgaWYKLQkJICogKHRleHRUb1JlcGxhY2UubGVuZ3RoKCkgPT0gMCkgeyByZXR1cm4gdHJ1ZTsgfSBlbHNlIHsgcmV0dXJuCi0JCSAqICh0ZXh0LnRvVXBwZXJDYXNlKCkuaW5kZXhPZih0ZXh0VG9SZXBsYWNlLnRvVXBwZXJDYXNlKCkpID09IDApOyB9Ci0JCSAqLwotCX0KLQkKLQotCXByaXZhdGUgU3RyaW5nIGdldEluZGVudFN0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQljaGFyIGluZGVudENoYXIgPSAnICc7Ci0JCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJCWlmIChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJaW5kZW50Q2hhciA9ICdcdCc7Ci0JCQl9Ci0JCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCWluZGVudC5hcHBlbmQoaW5kZW50Q2hhcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZGVudC50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yQXRtYXJrUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JBdG1hcmtSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YmEwMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JBdG1hcmtSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbC5DU1NNZXRhTW9kZWxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQ2hhcnNldFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuU2VsZWN0aW9uQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi1jbGFzcyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckF0bWFya1J1bGUgZXh0ZW5kcyBDU1NQcm9wb3NhbEdlbmVyYXRvciB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlVzZVVwcGVyQ2FzZSA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSU0VUID0gIkBjaGFyc2V0IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTlRfRkFDRSA9ICJAZm9udC1mYWNlIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVCA9ICJAaW1wb3J0IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBID0gIkBtZWRpYSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFID0gIkBwYWdlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDU1NBdG1hcmtSdWxlUHJvcG9zYWxHZW5lcmF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKi8KLQlDU1NQcm9wb3NhbEdlbmVyYXRvckZvckF0bWFya1J1bGUoQ1NTQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCkgewotCQlzdXBlcihjb250ZXh0KTsKLQkJZlVzZVVwcGVyQ2FzZSA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIENTU0NBQ2FuZGlkYXRlIGdldENhbmRpZGF0ZUNoYXJzZXRSdWxlKCkgewotCQkvLyBjaGVjayBjb250ZW50IG1vZGVsCi0JCUNTU01ldGFNb2RlbFV0aWwgdXRpbCA9IG5ldyBDU1NNZXRhTW9kZWxVdGlsKGZDb250ZXh0LmdldE1ldGFNb2RlbCgpKTsKLQkJaWYgKCF1dGlsLmNvbGxlY3ROb2Rlc0J5VHlwZShDU1NNTU5vZGUuVFlQRV9DSEFSU0VUX1JVTEUpLmhhc05leHQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBjaGVjayBpZiBlbWJlZGRlZCBvciBub3QKLQkJaWYgKGZDb250ZXh0LmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgY2FyZXQgcHJlY2VkZSBhbGwgb3RoZXIgcnVsZXMuCi0JCWludCBvZmZzZXQgPSBmQ29udGV4dC5nZXRDdXJzb3JQb3MoKTsKLQkJaWYgKDAgPCBvZmZzZXQpIHsKLQkJCVNlbGVjdGlvbkNvbGxlY3RvciB0cmF2ID0gbmV3IFNlbGVjdGlvbkNvbGxlY3RvcigpOwotCQkJdHJhdi5zZXRSZWdpb24oMCwgb2Zmc2V0IC0gMSk7Ci0JCQl0cmF2LmFwcGx5KGZDb250ZXh0LmdldE1vZGVsKCkuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlJdGVyYXRvciBpID0gdHJhdi5nZXRTZWxlY3RlZE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSUNTU05vZGUgJiYgIShvYmogaW5zdGFuY2VvZiBJQ1NTRG9jdW1lbnQpKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWludCBjdXJzb3JQb3MgPSAwOwotCQlTdHJpbmcgaWRlbnQgPSAoZlVzZVVwcGVyQ2FzZSkgPyBDSEFSU0VULnRvVXBwZXJDYXNlKCkgOiBDSEFSU0VULnRvTG93ZXJDYXNlKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoaWRlbnQpOwotCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQljdXJzb3JQb3MgPSBidWYubGVuZ3RoKCk7Ci0JCVN0cmluZ0FuZE9mZnNldCBzYW87Ci0JCXNhbyA9IGdlbmVyYXRlUXVvdGVzKCk7Ci0JCWJ1Zi5hcHBlbmQoc2FvLmZTdHJpbmcpOwotCQljdXJzb3JQb3MgKz0gc2FvLmZPZmZzZXQ7Ci0JCXNhbyA9IGdlbmVyYXRlU2VtaWNvbG9uKCk7Ci0JCWJ1Zi5hcHBlbmQoc2FvLmZTdHJpbmcpOwotCi0JCVN0cmluZyB0ZXh0ID0gYnVmLnRvU3RyaW5nKCk7Ci0KLQkJaWYgKGlzTWF0Y2godGV4dCkpIHsKLQkJCUNTU0NBQ2FuZGlkYXRlIGl0ZW0gPSBuZXcgQ1NTQ0FDYW5kaWRhdGUoKTsKLQkJCWl0ZW0uc2V0UmVwbGFjZW1lbnRTdHJpbmcodGV4dCk7Ci0JCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvcyk7Ci0JCQlpdGVtLnNldERpc3BsYXlTdHJpbmcoaWRlbnQpOwotCQkJaXRlbS5zZXRJbWFnZVR5cGUoQ1NTSW1hZ2VUeXBlLlJVTEVfQ0hBUlNFVCk7Ci0JCQlyZXR1cm4gaXRlbTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgQ1NTQ0FDYW5kaWRhdGUgZ2V0Q2FuZGlkYXRlRm9udEZhY2VSdWxlKCkgewotCQlDU1NNZXRhTW9kZWxVdGlsIHV0aWwgPSBuZXcgQ1NTTWV0YU1vZGVsVXRpbChmQ29udGV4dC5nZXRNZXRhTW9kZWwoKSk7Ci0JCWlmICghdXRpbC5jb2xsZWN0Tm9kZXNCeVR5cGUoQ1NTTU1Ob2RlLlRZUEVfRk9OVF9GQUNFX1JVTEUpLmhhc05leHQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpbnQgY3Vyc29yUG9zID0gMDsKLQkJU3RyaW5nIGlkZW50ID0gKGZVc2VVcHBlckNhc2UpID8gRk9OVF9GQUNFLnRvVXBwZXJDYXNlKCkgOiBGT05UX0ZBQ0UudG9Mb3dlckNhc2UoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZChpZGVudCk7Ci0JCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCWN1cnNvclBvcyA9IGJ1Zi5sZW5ndGgoKTsKLQkJU3RyaW5nQW5kT2Zmc2V0IHNhbzsKLQkJc2FvID0gZ2VuZXJhdGVCcmFjZXMoKTsKLQkJYnVmLmFwcGVuZChzYW8uZlN0cmluZyk7Ci0JCWN1cnNvclBvcyArPSBzYW8uZk9mZnNldDsKLQotCQlTdHJpbmcgdGV4dCA9IGJ1Zi50b1N0cmluZygpOwotCi0JCWlmIChpc01hdGNoKHRleHQpKSB7Ci0JCQlDU1NDQUNhbmRpZGF0ZSBpdGVtID0gbmV3IENTU0NBQ2FuZGlkYXRlKCk7Ci0JCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKGJ1Zi50b1N0cmluZygpKTsKLQkJCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24oY3Vyc29yUG9zKTsKLQkJCWl0ZW0uc2V0RGlzcGxheVN0cmluZyhpZGVudCk7Ci0JCQlpdGVtLnNldEltYWdlVHlwZShDU1NJbWFnZVR5cGUuUlVMRV9GT05URkFDRSk7Ci0JCQlyZXR1cm4gaXRlbTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgQ1NTQ0FDYW5kaWRhdGUgZ2V0Q2FuZGlkYXRlSW1wb3J0UnVsZSgpIHsKLQkJLy8gY2hlY2sgY29udGVudCBtb2RlbAotCQlDU1NNZXRhTW9kZWxVdGlsIHV0aWwgPSBuZXcgQ1NTTWV0YU1vZGVsVXRpbChmQ29udGV4dC5nZXRNZXRhTW9kZWwoKSk7Ci0JCWlmICghdXRpbC5jb2xsZWN0Tm9kZXNCeVR5cGUoQ1NTTU1Ob2RlLlRZUEVfSU1QT1JUX1JVTEUpLmhhc05leHQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBjaGFyc2V0IGFuZCBpbXBvcnQgY2FuIHByZWNlZGUgaW1wb3J0IHJ1bGUuCi0JCWludCBvZmZzZXQgPSBmQ29udGV4dC5nZXRDdXJzb3JQb3MoKTsKLQkJaWYgKDAgPCBvZmZzZXQpIHsKLQkJCVNlbGVjdGlvbkNvbGxlY3RvciB0cmF2ID0gbmV3IFNlbGVjdGlvbkNvbGxlY3RvcigpOwotCQkJdHJhdi5zZXRSZWdpb24oMCwgb2Zmc2V0IC0gMSk7Ci0JCQl0cmF2LmFwcGx5KGZDb250ZXh0LmdldE1vZGVsKCkuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlJdGVyYXRvciBpID0gdHJhdi5nZXRTZWxlY3RlZE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSUNTU05vZGUgJiYgIShvYmogaW5zdGFuY2VvZiBJQ1NTRG9jdW1lbnQgfHwgb2JqIGluc3RhbmNlb2YgSUNTU0NoYXJzZXRSdWxlIHx8IG9iaiBpbnN0YW5jZW9mIElDU1NJbXBvcnRSdWxlKSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpbnQgY3Vyc29yUG9zID0gMDsKLQkJU3RyaW5nIGlkZW50ID0gKGZVc2VVcHBlckNhc2UpID8gSU1QT1JULnRvVXBwZXJDYXNlKCkgOiBJTVBPUlQudG9Mb3dlckNhc2UoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZChpZGVudCk7Ci0JCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCWN1cnNvclBvcyA9IGJ1Zi5sZW5ndGgoKTsKLQkJU3RyaW5nQW5kT2Zmc2V0IHNhbzsKLQkJc2FvID0gZ2VuZXJhdGVVUkkoKTsKLQkJYnVmLmFwcGVuZChzYW8uZlN0cmluZyk7Ci0JCWN1cnNvclBvcyArPSBzYW8uZk9mZnNldDsKLQkJc2FvID0gZ2VuZXJhdGVTZW1pY29sb24oKTsKLQkJYnVmLmFwcGVuZChzYW8uZlN0cmluZyk7Ci0KLQkJU3RyaW5nIHRleHQgPSBidWYudG9TdHJpbmcoKTsKLQotCQlpZiAoaXNNYXRjaCh0ZXh0KSkgewotCQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyhidWYudG9TdHJpbmcoKSk7Ci0JCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvcyk7Ci0JCQlpdGVtLnNldERpc3BsYXlTdHJpbmcoaWRlbnQpOwotCQkJaXRlbS5zZXRJbWFnZVR5cGUoQ1NTSW1hZ2VUeXBlLlJVTEVfSU1QT1JUKTsKLQkJCXJldHVybiBpdGVtOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBDU1NDQUNhbmRpZGF0ZSBnZXRDYW5kaWRhdGVNZWRpYVJ1bGUoKSB7Ci0JCUNTU01ldGFNb2RlbFV0aWwgdXRpbCA9IG5ldyBDU1NNZXRhTW9kZWxVdGlsKGZDb250ZXh0LmdldE1ldGFNb2RlbCgpKTsKLQkJaWYgKCF1dGlsLmNvbGxlY3ROb2Rlc0J5VHlwZShDU1NNTU5vZGUuVFlQRV9NRURJQV9SVUxFKS5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaW50IGN1cnNvclBvcyA9IDA7Ci0JCVN0cmluZyBpZGVudCA9IChmVXNlVXBwZXJDYXNlKSA/IE1FRElBLnRvVXBwZXJDYXNlKCkgOiBNRURJQS50b0xvd2VyQ2FzZSgpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKGlkZW50KTsKLQkJYnVmLmFwcGVuZCgiICAiKTsvLyROT04tTkxTLTEkCi0JCWN1cnNvclBvcyA9IGJ1Zi5sZW5ndGgoKSAtIDE7Ci0JCVN0cmluZ0FuZE9mZnNldCBzYW87Ci0JCXNhbyA9IGdlbmVyYXRlQnJhY2VzKCk7Ci0JCWJ1Zi5hcHBlbmQoc2FvLmZTdHJpbmcpOwotCi0JCVN0cmluZyB0ZXh0ID0gYnVmLnRvU3RyaW5nKCk7Ci0KLQkJaWYgKGlzTWF0Y2godGV4dCkpIHsKLQkJCUNTU0NBQ2FuZGlkYXRlIGl0ZW0gPSBuZXcgQ1NTQ0FDYW5kaWRhdGUoKTsKLQkJCWl0ZW0uc2V0UmVwbGFjZW1lbnRTdHJpbmcoYnVmLnRvU3RyaW5nKCkpOwotCQkJaXRlbS5zZXRDdXJzb3JQb3NpdGlvbihjdXJzb3JQb3MpOwotCQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKGlkZW50KTsKLQkJCWl0ZW0uc2V0SW1hZ2VUeXBlKENTU0ltYWdlVHlwZS5SVUxFX01FRElBKTsKLQkJCXJldHVybiBpdGVtOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBDU1NDQUNhbmRpZGF0ZSBnZXRDYW5kaWRhdGVQYWdlUnVsZSgpIHsKLQkJQ1NTTWV0YU1vZGVsVXRpbCB1dGlsID0gbmV3IENTU01ldGFNb2RlbFV0aWwoZkNvbnRleHQuZ2V0TWV0YU1vZGVsKCkpOwotCQlpZiAoIXV0aWwuY29sbGVjdE5vZGVzQnlUeXBlKENTU01NTm9kZS5UWVBFX1BBR0VfUlVMRSkuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWludCBjdXJzb3JQb3MgPSAwOwotCQlTdHJpbmcgaWRlbnQgPSAoZlVzZVVwcGVyQ2FzZSkgPyBQQUdFLnRvVXBwZXJDYXNlKCkgOiBQQUdFLnRvTG93ZXJDYXNlKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoaWRlbnQpOwotCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQljdXJzb3JQb3MgPSBidWYubGVuZ3RoKCk7Ci0JCVN0cmluZ0FuZE9mZnNldCBzYW87Ci0JCXNhbyA9IGdlbmVyYXRlQnJhY2VzKCk7Ci0JCWJ1Zi5hcHBlbmQoc2FvLmZTdHJpbmcpOwotCQljdXJzb3JQb3MgKz0gc2FvLmZPZmZzZXQ7Ci0KLQkJU3RyaW5nIHRleHQgPSBidWYudG9TdHJpbmcoKTsKLQotCQlpZiAoaXNNYXRjaCh0ZXh0KSkgewotCQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyhidWYudG9TdHJpbmcoKSk7Ci0JCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvcyk7Ci0JCQlpdGVtLnNldERpc3BsYXlTdHJpbmcoaWRlbnQpOwotCQkJaXRlbS5zZXRJbWFnZVR5cGUoQ1NTSW1hZ2VUeXBlLlJVTEVfUEFHRSk7Ci0JCQlyZXR1cm4gaXRlbTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0Q2FuZGlkYXRlcyBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2FuZGlkYXRlcygpIHsKLQkJTGlzdCBjYW5kaWRhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZDb250ZXh0LmdldFRhcmdldFJlZ2lvblByZXZpb3VzKCk7Ci0JCS8vCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZDb250ZXh0LmdldFNpZ25pZmljYW50VGFyZ2V0UmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSAmJiB0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIpIHsKLQkJCQlyZXR1cm4gY2FuZGlkYXRlcy5pdGVyYXRvcigpOwotCQkJfQotCQl9Ci0KLQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbTsKLQkJaWYgKChpdGVtID0gZ2V0Q2FuZGlkYXRlSW1wb3J0UnVsZSgpKSAhPSBudWxsKSB7Ci0JCQljYW5kaWRhdGVzLmFkZChpdGVtKTsKLQkJfQotCQlpZiAoKGl0ZW0gPSBnZXRDYW5kaWRhdGVDaGFyc2V0UnVsZSgpKSAhPSBudWxsKSB7Ci0JCQljYW5kaWRhdGVzLmFkZChpdGVtKTsKLQkJfQotCQlpZiAoKGl0ZW0gPSBnZXRDYW5kaWRhdGVNZWRpYVJ1bGUoKSkgIT0gbnVsbCkgewotCQkJY2FuZGlkYXRlcy5hZGQoaXRlbSk7Ci0JCX0KLQkJaWYgKChpdGVtID0gZ2V0Q2FuZGlkYXRlUGFnZVJ1bGUoKSkgIT0gbnVsbCkgewotCQkJY2FuZGlkYXRlcy5hZGQoaXRlbSk7Ci0JCX0KLQkJaWYgKChpdGVtID0gZ2V0Q2FuZGlkYXRlRm9udEZhY2VSdWxlKCkpICE9IG51bGwpIHsKLQkJCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCQl9Ci0JCXJldHVybiBjYW5kaWRhdGVzLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvbk5hbWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yRGVjbGFyYXRpb25OYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OWQ3MjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvbk5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTTWV0YU1vZGVsVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VUeXBlOwotCi1jbGFzcyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uTmFtZSBleHRlbmRzIENTU1Byb3Bvc2FsR2VuZXJhdG9yIHsKLQotCS8qKgotCSAqIENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yRGVjbGFyYXRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKi8KLQlDU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uTmFtZShDU1NDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0KSB7Ci0JCXN1cGVyKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIGdldENhbmRpZGF0ZXMgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENhbmRpZGF0ZXMoKSB7Ci0JCUxpc3QgY2FuZGlkYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTdHJpbmcgcHJlRGVsaW0gPSAiIjsvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1BST1BfUFJFX0RFTElNKTsgaSsrKSB7Ci0JCQlwcmVEZWxpbSArPSAnICc7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZyBwb3N0RGVsaW0gPSAiIjsvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1BST1BfUE9TVF9ERUxJTSk7IGkrKykgewotCQkJcG9zdERlbGltICs9ICcgJzsvLyROT04tTkxTLTEkCi0JCX0KLQotCQlJQ1NTTm9kZSB0YXJnZXROb2RlID0gZkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlib29sZWFuIGJGb250UnVsZSA9IGZhbHNlOwotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSB0YXJnZXROb2RlOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlKSB7Ci0JCQkJYkZvbnRSdWxlID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCUxpc3QgbmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNTU01ldGFNb2RlbFV0aWwgdXRpbCA9IG5ldyBDU1NNZXRhTW9kZWxVdGlsKGZDb250ZXh0LmdldE1ldGFNb2RlbCgpKTsKLQkJSXRlcmF0b3IgaU5hbWVzID0gdXRpbC5jb2xsZWN0Tm9kZXNCeVR5cGUoKGJGb250UnVsZSkgPyBDU1NNTU5vZGUuVFlQRV9ERVNDUklQVE9SIDogQ1NTTU1Ob2RlLlRZUEVfUFJPUEVSVFkpOwotCQl3aGlsZSAoaU5hbWVzLmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpTmFtZXMubmV4dCgpOwotCQkJbmFtZXMuYWRkKG5vZGUpOwotCQl9Ci0JCXNvcnROYW1lcyhuYW1lcyk7Ci0JCS8vIENvbGxlY3Rpb25zLnNvcnQobmFtZXMpOwotCi0JCWJvb2xlYW4gYkFkZENvbG9uID0gdHJ1ZTsKLQkJaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSAmJiBmQ29udGV4dC50YXJnZXRIYXMoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUikpIHsKLQkJCWJBZGRDb2xvbiA9IGZhbHNlOwotCQl9Ci0KLQkJSXRlcmF0b3IgaSA9IG5hbWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpLm5leHQoKTsKLQkJCVN0cmluZyB0ZXh0ID0gbm9kZS5nZXROYW1lKCk7Ci0JCQl0ZXh0ID0gKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfTkFNRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikgPyB0ZXh0LnRvVXBwZXJDYXNlKCkgOiB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0JCQlpZiAoIWlzTWF0Y2godGV4dCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaW50IGN1cnNvclBvcyA9IDA7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYnVmLmFwcGVuZCh0ZXh0KTsKLQkJCWJ1Zi5hcHBlbmQocHJlRGVsaW0pOwotCQkJY3Vyc29yUG9zID0gYnVmLmxlbmd0aCgpOwotCQkJaWYgKGJBZGRDb2xvbikgewotCQkJCWJ1Zi5hcHBlbmQoJzonKTsvLyROT04tTkxTLTEkCi0JCQkJYnVmLmFwcGVuZChwb3N0RGVsaW0pOwotCQkJCWN1cnNvclBvcyArPSAxICsgcG9zdERlbGltLmxlbmd0aCgpOwotCQkJfQotCQkJLy8gaWYgKCEgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkpIHsKLQkJCS8vIGJ1Zi5hcHBlbmQoJzsnKTsvLyROT04tTkxTLTEkCi0JCQkvLyB9Ci0KLQkJCUNTU0NBQ2FuZGlkYXRlIGl0ZW0gPSBuZXcgQ1NTQ0FDYW5kaWRhdGUoKTsKLQkJCWl0ZW0uc2V0UmVwbGFjZW1lbnRTdHJpbmcoYnVmLnRvU3RyaW5nKCkpOwotCQkJaXRlbS5zZXRDdXJzb3JQb3NpdGlvbihjdXJzb3JQb3MpOwotCQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKHRleHQpOwotCQkJaXRlbS5zZXRJbWFnZVR5cGUoZ2V0Q2F0ZWdvcnlJbWFnZVR5cGUobm9kZSkpOwotCQkJY2FuZGlkYXRlcy5hZGQoaXRlbSk7Ci0JCX0KLQotCQlyZXR1cm4gY2FuZGlkYXRlcy5pdGVyYXRvcigpOwotCX0KLQotCXZvaWQgc29ydE5hbWVzKExpc3QgbmFtZXMpIHsKLQkJQ29sbGVjdGlvbnMuc29ydChuYW1lcywgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCQlDU1NNTU5vZGUgbm9kZTEgPSAoQ1NTTU1Ob2RlKSBvMTsKLQkJCQlDU1NNTU5vZGUgbm9kZTIgPSAoQ1NTTU1Ob2RlKSBvMjsKLQkJCQlpZiAobm9kZTEgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gMTsKLQkJCQl9IGVsc2UgaWYgKG5vZGUyID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlpbnQgZGlmZiA9IDA7Ci0JCQkJU3RyaW5nIGNhdGVnb3J5MSA9IG5vZGUxLmdldEF0dHJpYnV0ZSgiY2F0ZWdvcnkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBjYXRlZ29yeTIgPSBub2RlMi5nZXRBdHRyaWJ1dGUoImNhdGVnb3J5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoY2F0ZWdvcnkxID09IG51bGwpIHsKLQkJCQkJaWYgKGNhdGVnb3J5MiA9PSBudWxsKSB7Ci0JCQkJCQlkaWZmID0gMDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiAxOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChjYXRlZ29yeTIgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGlmZiA9IGNhdGVnb3J5MS5jb21wYXJlVG8oY2F0ZWdvcnkyKTsKLQkJCQl9Ci0JCQkJaWYgKGRpZmYgPT0gMCkgewotCQkJCQlTdHJpbmcgbmFtZSA9IG5vZGUxLmdldE5hbWUoKTsKLQkJCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIDE7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gbmFtZS5jb21wYXJlVG8obm9kZTIuZ2V0TmFtZSgpKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBkaWZmOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoKLQkgKiByZXRyaWV2ZSBkZWZhdWx0IGNhdGVnb3J5IGljb24gbmFtZSBUT0RPOiBpZiBub2RlIGhhcyAiaWNvbiIoPyksIHVzZQotCSAqIGl0LgotCSAqLwotCUNTU0ltYWdlVHlwZSBnZXRDYXRlZ29yeUltYWdlVHlwZShDU1NNTU5vZGUgbm9kZSkgewotCQlDU1NJbWFnZVR5cGUgaW1hZ2VUeXBlID0gbnVsbDsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNhdGVnb3J5ID0gbm9kZS5nZXRBdHRyaWJ1dGUoImNhdGVnb3J5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChjYXRlZ29yeSAhPSBudWxsKSB7Ci0JCQkJaW1hZ2VUeXBlID0gQ1NTSW1hZ2VUeXBlLmdldEltYWdlVHlwZShjYXRlZ29yeSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChpbWFnZVR5cGUgPT0gbnVsbCkgPyBDU1NJbWFnZVR5cGUuQ0FURUdPUllfREVGQVVMVCA6IGltYWdlVHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uVmFsdWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yRGVjbGFyYXRpb25WYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWQ5OTNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yRGVjbGFyYXRpb25WYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTUZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1OdW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbC5DU1NGdW5jdGlvbklEOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbC5DU1NNZXRhTW9kZWxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZTsKLQotY2xhc3MgQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvblZhbHVlIGV4dGVuZHMgQ1NTUHJvcG9zYWxHZW5lcmF0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVEFOVCA9ICIhaW1wb3J0YW50IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgYm9vbGVhbiBmVXNlVXBwZXJDYXNlOwotCXByaXZhdGUgYm9vbGVhbiBmQXBwZW5kU2VtaUNvbG9uOwotCi0JLyoqCi0JICogQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvblZhbHVlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICovCi0JQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvblZhbHVlKENTU0NvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIoY29udGV4dCk7Ci0JCWZVc2VVcHBlckNhc2UgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVI7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRGdW5jdGlvbihMaXN0IGNhbmRpZGF0ZXMsIENTU01NRnVuY3Rpb24gcHJvcCkgewotCQlTdHJpbmcgdGV4dCA9IHByb3AudG9TdHJpbmcoKTsKLQkJaWYgKCFpc01hdGNoKHRleHQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgY3Vyc29yUG9zID0gMDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKHByb3AuZ2V0TmFtZSgpLmVxdWFscyhDU1NGdW5jdGlvbklELkZfVVJJKSkgewotCQkJU3RyaW5nQW5kT2Zmc2V0IHNhbyA9IGdlbmVyYXRlVVJJKCk7Ci0JCQlidWYuYXBwZW5kKHNhby5mU3RyaW5nKTsKLQkJCWN1cnNvclBvcyA9IHNhby5mT2Zmc2V0OwotCQl9IGVsc2UgewotCQkJYnVmLmFwcGVuZChwcm9wLnRvU3RyaW5nKCkpOwotCQkJY3Vyc29yUG9zID0gYnVmLmxlbmd0aCgpOwotCQkJU3RyaW5nQW5kT2Zmc2V0IHNhbyA9IGdlbmVyYXRlUGFyZW50aGVzaXMoKTsKLQkJCWJ1Zi5hcHBlbmQoc2FvLmZTdHJpbmcpOwotCQkJY3Vyc29yUG9zICs9IHNhby5mT2Zmc2V0OwotCQl9Ci0KLQkJdGV4dCA9IGJ1Zi50b1N0cmluZygpOwotCQl0ZXh0ID0gKGZVc2VVcHBlckNhc2UpID8gdGV4dC50b1VwcGVyQ2FzZSgpIDogdGV4dC50b0xvd2VyQ2FzZSgpOwotCi0JCUNTU0NBQ2FuZGlkYXRlIGl0ZW0gPSBuZXcgQ1NTQ0FDYW5kaWRhdGUoKTsKLQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyh0ZXh0KTsKLQkJaXRlbS5zZXRDdXJzb3JQb3NpdGlvbihjdXJzb3JQb3MpOwotCQlpdGVtLnNldERpc3BsYXlTdHJpbmcodGV4dCk7Ci0JCWl0ZW0uc2V0SW1hZ2VUeXBlKENTU0ltYWdlVHlwZS5WQUxVRV9GVU5DVElPTik7Ci0JCWFwcGVuZFNlbWlDb2xvbihpdGVtKTsKLQkJY2FuZGlkYXRlcy5hZGQoaXRlbSk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGROdW1iZXIoTGlzdCBjYW5kaWRhdGVzLCBDU1NNTU51bWJlciBwcm9wKSB7Ci0JCVN0cmluZyBmdWxsVGV4dCA9IGZDb250ZXh0LmdldFRleHRUb1JlcGxhY2UoKTsKLQkJLy8gc2tpcCBudW1iZXIKLQkJaW50IHVuaXRJbmRleCA9IC0xOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZ1bGxUZXh0Lmxlbmd0aCgpOyBpKyspIHsKLQkJCWlmIChDaGFyYWN0ZXIuaXNEaWdpdChmdWxsVGV4dC5jaGFyQXQoaSkpKSB7Ci0JCQkJdW5pdEluZGV4ID0gaSArIDE7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIHVuaXRTdWJUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG51bVN1YlRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoMCA8PSB1bml0SW5kZXgpIHsKLQkJCW51bVN1YlRleHQgPSBmdWxsVGV4dC5zdWJzdHJpbmcoMCwgdW5pdEluZGV4KTsKLQkJCWlmICh1bml0SW5kZXggPCBmdWxsVGV4dC5sZW5ndGgoKSkgewotCQkJCXVuaXRTdWJUZXh0ID0gZnVsbFRleHQuc3Vic3RyaW5nKHVuaXRJbmRleCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl1bml0U3ViVGV4dCA9IGZ1bGxUZXh0OwotCQl9Ci0KLQkJSXRlcmF0b3IgaSA9IHByb3AuZ2V0RGVzY2VuZGFudHMoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTVVuaXQgdW5pdCA9IChDU1NNTVVuaXQpIGkubmV4dCgpOwotCQkJU3RyaW5nIHVuaXRTdHJpbmcgPSB1bml0LmdldFVuaXRTdHJpbmcoKTsKLQkJCWlmICgoMCA8IHVuaXRTdWJUZXh0Lmxlbmd0aCgpICYmIHVuaXRTdHJpbmcuaW5kZXhPZih1bml0U3ViVGV4dCkgIT0gMCkgfHwgKDAgPCBudW1TdWJUZXh0Lmxlbmd0aCgpICYmIHVuaXRTdHJpbmcuZXF1YWxzKCIjIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJU3RyaW5nIHRleHQgPSBudW1TdWJUZXh0ICsgdW5pdFN0cmluZzsKLQkJCXRleHQgPSAoZlVzZVVwcGVyQ2FzZSkgPyB0ZXh0LnRvVXBwZXJDYXNlKCkgOiB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0JCQlDU1NDQUNhbmRpZGF0ZSBpdGVtID0gbmV3IENTU0NBQ2FuZGlkYXRlKCk7Ci0JCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKHRleHQpOwotCQkJaWYgKDAgPCBudW1TdWJUZXh0Lmxlbmd0aCgpIHx8IHRleHQuZXF1YWxzKCIjIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24odGV4dC5sZW5ndGgoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24oMCk7Ci0JCQl9Ci0JCQlpdGVtLnNldERpc3BsYXlTdHJpbmcodGV4dCk7Ci0JCQlpdGVtLnNldEltYWdlVHlwZShDU1NJbWFnZVR5cGUuVkFMVUVfTlVNQkVSKTsKLQkJCWFwcGVuZFNlbWlDb2xvbihpdGVtKTsKLQkJCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja1NlbWlDb2xvbigpIHsKLQkJZkFwcGVuZFNlbWlDb2xvbiA9IGZhbHNlOwotCi0JCUlUZXh0UmVnaW9uIHRhcmdldFJlZ2lvbiA9IGZDb250ZXh0LmdldFRhcmdldFJlZ2lvbigpOwotCQlpZiAodGFyZ2V0UmVnaW9uICE9IG51bGwgJiYgdGFyZ2V0UmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQkvLyBmaW5kIHRyYWlsaW5nICI6IiBvciAiOyIKLQkJCS8vIGlmICI6IiBiZWZvcmUgIjsiIGlzIGZvdW5kLCBhZGQgIjsiCi0JCQlSZWdpb25JdGVyYXRvciBpdGVyYXRvciA9IGZDb250ZXh0LmdldFJlZ2lvbkl0ZXJhdG9yKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRhaW5lciA9IGl0ZXJhdG9yLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoaXRlcmF0b3IuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gY29udGFpbmVyKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SKSB7Ci0JCQkJCWZBcHBlbmRTZW1pQ29sb24gPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZBcHBlbmRTZW1pQ29sb24pIHsKLQkJCQkvLyBzZWNvbmQgY2hhbmNlOgotCQkJCS8vIGxlYWRpbmcgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyBub3QgIjsiCi0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gQ1NTVXRpbC5maW5kTmV4dFNpZ25pZmljYW50Tm9kZShjb250YWluZXIpOwotCQkJCWlmIChDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUobmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJCQlmQXBwZW5kU2VtaUNvbG9uID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZFNlbWlDb2xvbihDU1NDQUNhbmRpZGF0ZSBpdGVtKSB7Ci0JCWlmIChmQXBwZW5kU2VtaUNvbG9uKSB7Ci0JCQlTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcgPSBpdGVtLmdldFJlcGxhY2VtZW50U3RyaW5nKCk7Ci0JCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKHJlcGxhY2VtZW50U3RyaW5nICsgIjsiKTsgLy8kTk9OLU5MUy0xJAotCQkJaW50IGN1cnNvclBvc2l0aW9uID0gaXRlbS5nZXRDdXJzb3JQb3NpdGlvbigpOwotCQkJaWYgKHJlcGxhY2VtZW50U3RyaW5nLmxlbmd0aCgpIDw9IGN1cnNvclBvc2l0aW9uKSB7Ci0JCQkJLy8gY3Vyc29ycG9zIGlzIHRhaWwgb2Ygc3RyaW5nCi0JCQkJY3Vyc29yUG9zaXRpb24rKzsKLQkJCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvc2l0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkU2VtaUNvbG9uKExpc3QgY2FuZGlkYXRlcykgewotCQlJQ1NTTm9kZSB0YXJnZXROb2RlID0gZkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlpZiAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKSB7Ci0JCQlJQ1NTTm9kZSBmaXJzdENoaWxkID0gdGFyZ2V0Tm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAoZmlyc3RDaGlsZCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKGZpcnN0Q2hpbGQgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJaW50IHN0YXJ0T2Zmc2V0ID0gKChJbmRleGVkUmVnaW9uKSBmaXJzdENoaWxkKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCWlmIChmQ29udGV4dC5nZXRDdXJzb3JQb3MoKSA8PSBzdGFydE9mZnNldCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJYm9vbGVhbiBiQWRkQ2xvc2VyID0gZmFsc2U7Ci0KLQkJSVRleHRSZWdpb24gdGFyZ2V0UmVnaW9uID0gZkNvbnRleHQuZ2V0VGFyZ2V0UmVnaW9uKCk7Ci0JCWlmICh0YXJnZXRSZWdpb24gIT0gbnVsbCAmJiB0YXJnZXRSZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCS8vIGZpbmQgdHJhaWxpbmcgIjoiIG9yICI7IgotCQkJLy8gaWYgIjoiIGJlZm9yZSAiOyIgaXMgZm91bmQsIGFkZCAiOyIKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXJhdG9yID0gZkNvbnRleHQuZ2V0UmVnaW9uSXRlcmF0b3IoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGFpbmVyID0gaXRlcmF0b3IuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChpdGVyYXRvci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBjb250YWluZXIpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IpIHsKLQkJCQkJYkFkZENsb3NlciA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghYkFkZENsb3NlcikgewotCQkJCS8vIHNlY29uZCBjaGFuY2U6Ci0JCQkJLy8gbGVhZGluZyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIG5vdCAiOyIKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBDU1NVdGlsLmZpbmROZXh0U2lnbmlmaWNhbnROb2RlKGNvbnRhaW5lcik7Ci0JCQkJaWYgKENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQkJCWJBZGRDbG9zZXIgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChiQWRkQ2xvc2VyKSB7Ci0JCQlDU1NDQUNhbmRpZGF0ZSBpdGVtID0gbmV3IENTU0NBQ2FuZGlkYXRlKCk7Ci0JCQlTdHJpbmcgdGV4dCA9IGZDb250ZXh0LmdldFRleHRUb1JlcGxhY2UoKSArICI7IjsvLyROT04tTkxTLTEkCi0JCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKHRleHQpOwotCQkJaXRlbS5zZXRDdXJzb3JQb3NpdGlvbih0ZXh0Lmxlbmd0aCgpKTsKLQkJCWl0ZW0uc2V0RGlzcGxheVN0cmluZygiOyIpOy8vJE5PTi1OTFMtMSQKLQkJCWl0ZW0uc2V0SW1hZ2VUeXBlKG51bGwpOwotCQkJY2FuZGlkYXRlcy5hZGQoaXRlbSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFN0cmluZyhMaXN0IGNhbmRpZGF0ZXMsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmICghaXNNYXRjaCh0ZXh0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdGV4dCA9IChmVXNlVXBwZXJDYXNlKSA/IHRleHQudG9VcHBlckNhc2UoKSA6IHRleHQudG9Mb3dlckNhc2UoKTsKLQotCQlDU1NDQUNhbmRpZGF0ZSBpdGVtID0gbmV3IENTU0NBQ2FuZGlkYXRlKCk7Ci0JCWl0ZW0uc2V0UmVwbGFjZW1lbnRTdHJpbmcodGV4dCk7Ci0JCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24odGV4dC5sZW5ndGgoKSk7Ci0JCWl0ZW0uc2V0RGlzcGxheVN0cmluZyh0ZXh0KTsKLQkJaXRlbS5zZXRJbWFnZVR5cGUoQ1NTSW1hZ2VUeXBlLlZBTFVFX1NUUklORyk7Ci0JCWFwcGVuZFNlbWlDb2xvbihpdGVtKTsKLQkJY2FuZGlkYXRlcy5hZGQoaXRlbSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEltcG9ydGFudChMaXN0IGNhbmRpZGF0ZXMpIHsKLQkJSUNTU05vZGUgdGFyZ2V0Tm9kZSA9IGZDb250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJd2hpbGUgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUpIHsKLQkJCXRhcmdldE5vZGUgPSB0YXJnZXROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlpZiAoISh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gMS4gaGFzIG5vIHByaW9yaXR5IHJlZ2lvbgotCQkvLyAyLiBjdXJzb3IgcG9zaXRpb24gaXMgYWZ0ZXIgb2YgbGFzdCBjaGlsZAotCQkvLyAzLiBub3JtYWwgaXNNYXRjaCBtZXRob2QKLQkJU3RyaW5nIHByaW9yaXR5ID0gKChJQ1NTU3R5bGVEZWNsSXRlbSkgdGFyZ2V0Tm9kZSkuZ2V0UHJpb3JpdHkoKTsKLQkJaWYgKHByaW9yaXR5ID09IG51bGwgfHwgcHJpb3JpdHkubGVuZ3RoKCkgPT0gMCkgewotCQkJSUNTU05vZGUgbGFzdENoaWxkID0gdGFyZ2V0Tm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJCWlmIChsYXN0Q2hpbGQgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJaW50IHN0YXJ0T2Zmc2V0ID0gKChJbmRleGVkUmVnaW9uKSBsYXN0Q2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJLy8JaW50IGVuZE9mZnNldCA9ICgoSW5kZXhlZFJlZ2lvbilsYXN0Q2hpbGQpLmdldEVuZE9mZnNldCgpOwotCQkJCWlmIChzdGFydE9mZnNldCA8IGZDb250ZXh0LmdldEN1cnNvclBvcygpICYmIGlzTWF0Y2goSU1QT1JUQU5UKSkgewotCQkJCQlDU1NDQUNhbmRpZGF0ZSBpdGVtID0gbmV3IENTU0NBQ2FuZGlkYXRlKCk7Ci0JCQkJCWl0ZW0uc2V0UmVwbGFjZW1lbnRTdHJpbmcoSU1QT1JUQU5UKTsKLQkJCQkJaXRlbS5zZXRDdXJzb3JQb3NpdGlvbihJTVBPUlRBTlQubGVuZ3RoKCkpOwotCQkJCQlpdGVtLnNldERpc3BsYXlTdHJpbmcoSU1QT1JUQU5UKTsKLQkJCQkJaXRlbS5zZXRJbWFnZVR5cGUoQ1NTSW1hZ2VUeXBlLlZBTFVFX1NUUklORyk7Ci0JCQkJCWFwcGVuZFNlbWlDb2xvbihpdGVtKTsKLQkJCQkJY2FuZGlkYXRlcy5hZGQoaXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0Q2FuZGlkYXRlcyBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2FuZGlkYXRlcygpIHsKLQkJTGlzdCBjYW5kaWRhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWNoZWNrU2VtaUNvbG9uKCk7IC8vIGNoZWNrIHNob3VsZCBhZGQgc2VtaS1jb2xvbiBvciBub3QKLQotCQlTdHJpbmcgbmFtZSA9IGdldFByb3BlcnR5TmFtZSgpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlDU1NNZXRhTW9kZWxVdGlsIHV0aWwgPSBuZXcgQ1NTTWV0YU1vZGVsVXRpbChmQ29udGV4dC5nZXRNZXRhTW9kZWwoKSk7Ci0JCQlJdGVyYXRvciBpID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJaWYgKGlzRm9udEZhY2VSdWxlKCkpIHsKLQkJCQlDU1NNTURlc2NyaXB0b3IgZGVzYyA9IHV0aWwuZ2V0RGVzY3JpcHRvcihuYW1lKTsKLQkJCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCWkgPSBkZXNjLmdldFZhbHVlcygpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJQ1NTTU1Qcm9wZXJ0eSBwcm9wID0gdXRpbC5nZXRQcm9wZXJ0eShuYW1lKTsKLQkJCQlpZiAocHJvcCAhPSBudWxsKSB7Ci0JCQkJCWkgPSBwcm9wLmdldFZhbHVlcygpOwotCQkJCX0KLQkJCX0KLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUNTU01NTm9kZSB2YWwgPSAoQ1NTTU1Ob2RlKSBpLm5leHQoKTsKLQkJCQlTdHJpbmcgdmFsdWVUeXBlID0gdmFsLmdldFR5cGUoKTsKLQkJCQlpZiAodmFsdWVUeXBlID09IENTU01NTm9kZS5UWVBFX0tFWVdPUkQpIHsKLQkJCQkJYWRkU3RyaW5nKGNhbmRpZGF0ZXMsIHZhbC50b1N0cmluZygpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBDU1NNTU5vZGUuVFlQRV9OVU1CRVIpIHsKLQkJCQkJYWRkTnVtYmVyKGNhbmRpZGF0ZXMsIChDU1NNTU51bWJlcikgdmFsKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PSBDU1NNTU5vZGUuVFlQRV9GVU5DVElPTikgewotCQkJCQlhZGRGdW5jdGlvbihjYW5kaWRhdGVzLCAoQ1NTTU1GdW5jdGlvbikgdmFsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlhZGRJbXBvcnRhbnQoY2FuZGlkYXRlcyk7Ci0JCWFkZFNlbWlDb2xvbihjYW5kaWRhdGVzKTsKLQotCQlyZXR1cm4gY2FuZGlkYXRlcy5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKLQkJSUNTU05vZGUgdGFyZ2V0Tm9kZSA9IGZDb250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJd2hpbGUgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUpIHsKLQkJCXRhcmdldE5vZGUgPSB0YXJnZXROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlpZiAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKSB7Ci0JCQlyZXR1cm4gKChJQ1NTU3R5bGVEZWNsSXRlbSkgdGFyZ2V0Tm9kZSkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNGb250RmFjZVJ1bGUoKSB7Ci0JCUlDU1NOb2RlIHRhcmdldE5vZGUgPSBmQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCXdoaWxlICh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1ByaW1pdGl2ZVZhbHVlKSB7Ci0JCQl0YXJnZXROb2RlID0gdGFyZ2V0Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJdGFyZ2V0Tm9kZSA9IHRhcmdldE5vZGUuZ2V0UGFyZW50Tm9kZSgpOyAvLyBnZXQgRGVjbGFyYXRpb24KLQkJCWlmICh0YXJnZXROb2RlICE9IG51bGwpIHsKLQkJCQkvLyBpbmxpbmUgc3R5bGUgaGFzIG5vIHJ1bGUgbm9kZQotCQkJCXRhcmdldE5vZGUgPSB0YXJnZXROb2RlLmdldFBhcmVudE5vZGUoKTsgLy8gZ2V0IHJ1bGUKLQkJCX0KLQkJfQotCQlyZXR1cm4gKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBDU1NGb250RmFjZVJ1bGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9ySFRNTFRhZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JIVE1MVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMjhjMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JIVE1MVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5pbWFnZS5DU1NJbWFnZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTENNRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Eb2NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotY2xhc3MgQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JIVE1MVGFnIGV4dGVuZHMgQ1NTUHJvcG9zYWxHZW5lcmF0b3IgewotCi0JLyoqCi0JICogQ1NTU3R5bGVSdWxlUHJvcG9zYWxHZW5lcmF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKi8KLQlDU1NQcm9wb3NhbEdlbmVyYXRvckZvckhUTUxUYWcoQ1NTQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCkgewotCQlzdXBlcihjb250ZXh0KTsKLQotCQlpZiAoZkhUTUxUYWdzID09IG51bGwpIHsKLQkJCWZIVE1MVGFncyA9IHNldHVwSFRNTFRhZ3MoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldENhbmRpZGF0ZXMgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENhbmRpZGF0ZXMoKSB7Ci0JCUxpc3QgY2FuZGlkYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpZiAoY2hlY2tMZWFkaW5nQ29sb24oKSkgewotCQkJcmV0dXJuIGNhbmRpZGF0ZXMuaXRlcmF0b3IoKTsKLQkJfQotCi0JCS8vIFhIVE1MIHJlcXVpcmVzIGxvd2VyIGNhc2UKLQkJYm9vbGVhbiBiTG93ZXJDYXNlID0gZmFsc2U7Ci0JCWlmIChmQ29udGV4dC5nZXRNb2RlbCgpLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0gSUNTU01vZGVsLkVNQkVEREVEKSB7Ci0JCQlOb2RlIGRvbU5vZGUgPSBmQ29udGV4dC5nZXRNb2RlbCgpLmdldE93bmVyRE9NTm9kZSgpOwotCQkJaWYgKGRvbU5vZGUgIT0gbnVsbCAmJiAhKGRvbU5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkpIHsKLQkJCQlkb21Ob2RlID0gZG9tTm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJaWYgKGRvbU5vZGUgaW5zdGFuY2VvZiBJRE9NRG9jdW1lbnQpIHsKLQkJCQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gKERvY3VtZW50VHlwZUFkYXB0ZXIpICgoSURPTURvY3VtZW50KSBkb21Ob2RlKS5nZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCQkJYkxvd2VyQ2FzZSA9IChhZGFwdGVyLmdldFRhZ05hbWVDYXNlKCkgPT0gRG9jdW1lbnRUeXBlQWRhcHRlci5MT1dFUl9DQVNFKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCi0JCWludCBsZW5ndGggPSBmSFRNTFRhZ3MubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgdGFnVGV4dCA9IGZIVE1MVGFnc1tpXTsKLQkJCWlmIChiTG93ZXJDYXNlKSB7Ci0JCQkJdGFnVGV4dCA9IHRhZ1RleHQudG9Mb3dlckNhc2UoKTsKLQkJCX0KLQkJCWlmICghaXNNYXRjaCh0YWdUZXh0KSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpbnQgY3Vyc29yUG9zID0gMDsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlidWYuYXBwZW5kKHRhZ1RleHQpOwotCQkJY3Vyc29yUG9zICs9IHRhZ1RleHQubGVuZ3RoKCk7Ci0JCQlib29sZWFuIGluUnVsZSA9IChmQ29udGV4dC5nZXRUYXJnZXROb2RlKCkgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKTsKLQkJCWlmICghaW5SdWxlIHx8IGZDb250ZXh0LmdldFRleHRUb1JlcGxhY2UoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJYnVmLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJCQljdXJzb3JQb3MgKz0gMTsKLQkJCX0KLQkJCWlmICghaW5SdWxlKSB7Ci0JCQkJU3RyaW5nQW5kT2Zmc2V0IHNhbyA9IGdlbmVyYXRlQnJhY2VzKCk7Ci0JCQkJYnVmLmFwcGVuZChzYW8uZlN0cmluZyk7Ci0JCQkJY3Vyc29yUG9zICs9IHNhby5mT2Zmc2V0OwotCQkJfQotCi0JCQlDU1NDQUNhbmRpZGF0ZSBpdGVtID0gbmV3IENTU0NBQ2FuZGlkYXRlKCk7Ci0JCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKGJ1Zi50b1N0cmluZygpKTsKLQkJCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24oY3Vyc29yUG9zKTsKLQkJCWl0ZW0uc2V0RGlzcGxheVN0cmluZyh0YWdUZXh0KTsKLQkJCWl0ZW0uc2V0SW1hZ2VUeXBlKENTU0ltYWdlVHlwZS5TRUxFQ1RPUl9UQUcpOwotCQkJY2FuZGlkYXRlcy5hZGQoaXRlbSk7Ci0JCX0KLQotCQlyZXR1cm4gY2FuZGlkYXRlcy5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBzZXR1cEhUTUxUYWdzKCkgewotCQlDTURvY3VtZW50IGNtZG9jID0gSFRNTENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoQ01Eb2NUeXBlLkhUTUxfRE9DX1RZUEUpOwotCQlDTU5hbWVkTm9kZU1hcCBlbGVtZW50cyA9IGNtZG9jLmdldEVsZW1lbnRzKCk7Ci0JCVZlY3RvciBuYW1lcyA9IG5ldyBWZWN0b3IoKTsKLQkJaW50IG5FbGVtZW50cyA9IGVsZW1lbnRzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5FbGVtZW50czsgaSsrKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZGVjID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50cy5pdGVtKGkpOwotCQkJaWYgKGlzQXR0ckRlZmluZWQoZWRlYywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TVFlMRSkpIHsKLQkJCQluYW1lcy5hZGQoZWRlYy5nZXRFbGVtZW50TmFtZSgpKTsKLQkJCX0KLQkJfQotCQlDb2xsZWN0aW9ucy5zb3J0KG5hbWVzKTsKLQkJU3RyaW5nW10gdGFncyA9IG5ldyBTdHJpbmdbbmFtZXMuc2l6ZSgpXTsKLQkJSXRlcmF0b3IgaU5hbWVzID0gbmFtZXMuaXRlcmF0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGlOYW1lcy5oYXNOZXh0KCk7IGkrKykgewotCQkJdGFnc1tpXSA9IChTdHJpbmcpIGlOYW1lcy5uZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIHRhZ3M7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBdHRyRGVmaW5lZChDTUVsZW1lbnREZWNsYXJhdGlvbiBlZGVjLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKGVkZWMgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUNNTmFtZWROb2RlTWFwIGF0dHJzID0gZWRlYy5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRycyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cnMuaXRlbShpKTsKLQkJCWlmIChhdHRyID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChhdHRyLmdldEF0dHJOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZkhUTUxUYWdzID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yUHNldWRvU2VsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yUHNldWRvU2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdkZjgzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEdlbmVyYXRvckZvclBzZXVkb1NlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsLkNTU01NVHlwZUNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1JlZ2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUGFnZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5pbWFnZS5DU1NJbWFnZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLS8qKgotICogIAotICovCi1jbGFzcyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvclBzZXVkb1NlbGVjdG9yIGV4dGVuZHMgQ1NTUHJvcG9zYWxHZW5lcmF0b3IgewotCi0JLyoqCi0JICogQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JQc2V1ZG9TZWxlY3RvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqLwotCUNTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yUHNldWRvU2VsZWN0b3IoQ1NTQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCkgewotCQlzdXBlcihjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDYW5kaWRhdGVzIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDYW5kaWRhdGVzKCkgewotCQlMaXN0IGNhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJYm9vbGVhbiBoYXNMZWFkaW5nQ29sb24gPSBjaGVja0xlYWRpbmdDb2xvbigpOwotCQlTdHJpbmcgdGV4dFRvUmVwbGFjZSA9IGZDb250ZXh0LmdldFRleHRUb1JlcGxhY2UoKTsKLQkJaWYgKCFoYXNMZWFkaW5nQ29sb24gJiYgMCA8IHRleHRUb1JlcGxhY2UubGVuZ3RoKCkgJiYgIXRleHRUb1JlcGxhY2UuZXF1YWxzKGZDb250ZXh0LmdldFRleHRUb0NvbXBhcmUoKSkpIHsKLQkJCS8vIGN1cnNvciBwbGFjZWQgbWlkcG9pbnQgb2YgdGhlIHJlZ2lvbgotCQkJcmV0dXJuIGNhbmRpZGF0ZXMuaXRlcmF0b3IoKTsKLQkJfQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmQ29udGV4dC5nZXRUYXJnZXRSZWdpb24oKTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiAhQ1NTUmVnaW9uVXRpbC5pc1NlbGVjdG9yQmVnZ2luaW5nVHlwZSh0eXBlKSkgewotCQkJCXJldHVybiBjYW5kaWRhdGVzLml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCX0KLQotCQlib29sZWFuIHVzZVVwcGVyQ2FzZSA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSOwotCi0JCUxpc3QgdGFncyA9IGdldFNlbGVjdG9yVGFncygpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHRhZ3MpOwotCQlJdGVyYXRvciBpID0gdGFncy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyB0ZXh0ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQlpZiAoaGFzTGVhZGluZ0NvbG9uICYmICFpc01hdGNoKHRleHQpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQl0ZXh0ID0gKHVzZVVwcGVyQ2FzZSkgPyB0ZXh0LnRvVXBwZXJDYXNlKCkgOiB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0KLQkJCWludCBjdXJzb3JQb3MgPSAwOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWlmIChoYXNMZWFkaW5nQ29sb24pIHsKLQkJCQlidWYuYXBwZW5kKHRleHQuc3Vic3RyaW5nKDEpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnVmLmFwcGVuZCh0ZXh0VG9SZXBsYWNlKTsKLQkJCQlidWYuYXBwZW5kKHRleHQpOwotCQkJfQotCQkJY3Vyc29yUG9zICs9IGJ1Zi5sZW5ndGgoKTsKLQotCQkJaWYgKDAgPCBidWYubGVuZ3RoKCkpIHsKLQkJCQlib29sZWFuIGluUnVsZSA9IChmQ29udGV4dC5nZXRUYXJnZXROb2RlKCkgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlIHx8IGZDb250ZXh0LmdldFRhcmdldE5vZGUoKSBpbnN0YW5jZW9mIElDU1NQYWdlUnVsZSk7Ci0JCQkJaWYgKCFpblJ1bGUgfHwgKHRleHRUb1JlcGxhY2UubGVuZ3RoKCkgPT0gMCAmJiAhaGFzTGVhZGluZ0NvbG9uKSkgewotCQkJCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQkJCQljdXJzb3JQb3MgKz0gMTsKLQkJCQl9Ci0JCQkJaWYgKCFpblJ1bGUpIHsKLQkJCQkJU3RyaW5nQW5kT2Zmc2V0IHNhbyA9IGdlbmVyYXRlQnJhY2VzKCk7Ci0JCQkJCWJ1Zi5hcHBlbmQoc2FvLmZTdHJpbmcpOwotCQkJCQljdXJzb3JQb3MgKz0gc2FvLmZPZmZzZXQ7Ci0JCQkJfQotCQkJCUNTU0NBQ2FuZGlkYXRlIGl0ZW0gPSBuZXcgQ1NTQ0FDYW5kaWRhdGUoKTsKLQkJCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKGJ1Zi50b1N0cmluZygpKTsKLQkJCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvcyk7Ci0JCQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKHRleHQpOwotCQkJCWl0ZW0uc2V0SW1hZ2VUeXBlKENTU0ltYWdlVHlwZS5TRUxFQ1RPUl9QU0VVRE8pOwotCQkJCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNhbmRpZGF0ZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JTGlzdCBnZXRTZWxlY3RvclRhZ3MoKSB7Ci0JCUxpc3QgdGFnTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUNTU05vZGUgdGFyZ2V0Tm9kZSA9IGZDb250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJU3RyaW5nIHJvb3RUeXBlID0gKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTUGFnZVJ1bGUpID8gQ1NTTU1Ob2RlLlRZUEVfUEFHRV9SVUxFIDogQ1NTTU1Ob2RlLlRZUEVfU1RZTEVfUlVMRTsKLQotCQlDU1NNTVR5cGVDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IENTU01NVHlwZUNvbGxlY3RvcigpOwotCQljb2xsZWN0b3IuY29sbGVjdE5lc3RlZFR5cGUoZmFsc2UpOwotCQljb2xsZWN0b3IuYXBwbHkoZkNvbnRleHQuZ2V0TWV0YU1vZGVsKCksIHJvb3RUeXBlKTsKLQkJSXRlcmF0b3IgaTsKLQkJaSA9IGNvbGxlY3Rvci5nZXROb2RlcygpOwotCQlpZiAoIWkuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gdGFnTGlzdDsKLQkJfQotCQlDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpIGkubmV4dCgpOwotCQlpID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIGNoaWxkID0gKENTU01NTm9kZSkgaS5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX1NFTEVDVE9SKSB7Ci0JCQkJU3RyaW5nIHNlbFR5cGUgPSAoKENTU01NU2VsZWN0b3IpIGNoaWxkKS5nZXRTZWxlY3RvclR5cGUoKTsKLQkJCQlpZiAoc2VsVHlwZSA9PSBDU1NNTVNlbGVjdG9yLlRZUEVfUFNFVURPX0NMQVNTIHx8IHNlbFR5cGUgPT0gQ1NTTU1TZWxlY3Rvci5UWVBFX1BTRVVET19FTEVNRU5UKSB7Ci0JCQkJCXRhZ0xpc3QuYWRkKCgoQ1NTTU1TZWxlY3RvcikgY2hpbGQpLmdldFNlbGVjdG9yU3RyaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdGFnTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNNYXRjaChTdHJpbmcgdGV4dCkgewotCQlpZiAoIXN1cGVyLmlzTWF0Y2godGV4dCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZDb250ZXh0LmdldFRhcmdldFJlZ2lvbigpOwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1BTRVVETykgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1RlbXBsYXRlQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MDViZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLkNTU0VkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlLkNTU0ltYWdlSGVscGVyOwotCi0KLS8qKgotICogQ29tcGxldGlvbiBwcm9jZXNzb3IgZm9yIENTUyBUZW1wbGF0ZXMuIE1vc3Qgb2YgdGhlIHdvcmsgaXMgYWxyZWFkeSBkb25lCi0gKiBieSB0aGUgQ1NTIENvbnRlbnQgQXNzaXN0IHByb2Nlc3Nvciwgc28gYnkgdGhlIHRpbWUgdGhlCi0gKiBDU1NUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgaXMgYXNrZWQgZm9yIGNvbnRlbnQgYXNzaXN0IHByb3Bvc2FscywgdGhlCi0gKiBDU1MgY29udGVudCBhc3Npc3QgcHJvY2Vzc29yIGhhcyBhbHJlYWR5IHNldCB0aGUgY29udGV4dCB0eXBlIGZvcgotICogdGVtcGxhdGVzLgotICovCi1jbGFzcyBDU1NUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZXh0ZW5kcyBUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgewotCXByaXZhdGUgU3RyaW5nIGZDb250ZXh0VHlwZUlkID0gbnVsbDsKLQotCXByb3RlY3RlZCBUZW1wbGF0ZUNvbnRleHRUeXBlIGdldENvbnRleHRUeXBlKElUZXh0Vmlld2VyIHZpZXdlciwgSVJlZ2lvbiByZWdpb24pIHsKLQkJVGVtcGxhdGVDb250ZXh0VHlwZSB0eXBlID0gbnVsbDsKLQotCQlDb250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKTsKLQkJaWYgKHJlZ2lzdHJ5ICE9IG51bGwpCi0JCQl0eXBlID0gcmVnaXN0cnkuZ2V0Q29udGV4dFR5cGUoZkNvbnRleHRUeXBlSWQpOwotCi0JCXJldHVybiB0eXBlOwotCX0KLQotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZShUZW1wbGF0ZSB0ZW1wbGF0ZSkgewotCQkvLyBqdXN0IHJldHVybiB0aGUgc2FtZSBpbWFnZSBmb3Igbm93Ci0JCXJldHVybiBDU1NJbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RFTVBMQVRFKTsKLQl9Ci0KLQlwcml2YXRlIENvbnRleHRUeXBlUmVnaXN0cnkgZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGVtcGxhdGVbXSBnZXRUZW1wbGF0ZXMoU3RyaW5nIGNvbnRleHRUeXBlSWQpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGVzW10gPSBudWxsOwotCi0JCVRlbXBsYXRlU3RvcmUgc3RvcmUgPSBnZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWlmIChzdG9yZSAhPSBudWxsKQotCQkJdGVtcGxhdGVzID0gc3RvcmUuZ2V0VGVtcGxhdGVzKGNvbnRleHRUeXBlSWQpOwotCi0JCXJldHVybiB0ZW1wbGF0ZXM7Ci0JfQotCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCXJldHVybiBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVTdG9yZSgpOwotCX0KLQotCXZvaWQgc2V0Q29udGV4dFR5cGUoU3RyaW5nIGNvbnRleHRUeXBlSWQpIHsKLQkJZkNvbnRleHRUeXBlSWQgPSBjb250ZXh0VHlwZUlkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUw0ME5hbWVzcGFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSFRNTDQwTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YzBlMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSFRNTDQwTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLS8qKgotICogUHJvdmlkZSBhbGwgbmFtZXMgZGVmaW5lZCBpbiB0aGUgSFRNTCA0LjA/IHNwZWNpZmljYXRpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTDQwTmFtZXNwYWNlIHsKLQotCS8vIEVsZW1lbnQgbmFtZXMKLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBFbGVtZW50TmFtZSB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEEgPSAiQSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJCUiA9ICJBQkJSIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1JPTllNID0gIkFDUk9OWU0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERFJFU1MgPSAiQUREUkVTUyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTEVUID0gIkFQUExFVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJFQSA9ICJBUkVBIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCID0gIkIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0UgPSAiQkFTRSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRUZPTlQgPSAiQkFTRUZPTlQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJETyA9ICJCRE8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJHU09VTkQgPSAiQkdTT1VORCI7IC8vIEQyMDU1MTMKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSUcgPSAiQklHIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTElOSyA9ICJCTElOSyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxPQ0tRVU9URSA9ICJCTE9DS1FVT1RFIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0RZID0gIkJPRFkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSID0gIkJSIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVVRUT04gPSAiQlVUVE9OIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBUSU9OID0gIkNBUFRJT04iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENFTlRFUiA9ICJDRU5URVIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENJVEUgPSAiQ0lURSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERSA9ICJDT0RFIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0wgPSAiQ09MIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xHUk9VUCA9ICJDT0xHUk9VUCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREQgPSAiREQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTCA9ICJERUwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERGTiA9ICJERk4iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUiA9ICJESVIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJViA9ICJESVYiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERMID0gIkRMIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVCA9ICJEVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU0gPSAiRU0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQkVEID0gIkVNQkVEIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRFNFVCA9ICJGSUVMRFNFVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9OVCA9ICJGT05UIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNID0gIkZPUk0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQU1FID0gIkZSQU1FIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFNRVNFVCA9ICJGUkFNRVNFVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSDEgPSAiSDEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEgyID0gIkgyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIMyA9ICJIMyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSDQgPSAiSDQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEg1ID0gIkg1IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBINiA9ICJINiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBRCA9ICJIRUFEIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIUiA9ICJIUiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTCA9ICJIVE1MIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJID0gIkkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElGUkFNRSA9ICJJRlJBTUUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNRyA9ICJJTUciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUID0gIklOUFVUIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlMgPSAiSU5TIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU0lOREVYID0gIklTSU5ERVgiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtCRCA9ICJLQkQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gIkxBQkVMIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdFTkQgPSAiTEVHRU5EIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSSA9ICJMSSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOSyA9ICJMSU5LIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVAgPSAiTUFQIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRU5VID0gIk1FTlUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEEgPSAiTUVUQSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9CUiA9ICJOT0JSIjsgLy8gRDIwNTUxMyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PRU1CRUQgPSAiTk9FTUJFRCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9GUkFNRVMgPSAiTk9GUkFNRVMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PU0NSSVBUID0gIk5PU0NSSVBUIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1QgPSAiT0JKRUNUIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTCA9ICJPTCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUR1JPVVAgPSAiT1BUR1JPVVAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTiA9ICJPUFRJT04iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFAgPSAiUCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU0gPSAiUEFSQU0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRSA9ICJQUkUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFEgPSAiUSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUyA9ICJTIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQU1QID0gIlNBTVAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDUklQVCA9ICJTQ1JJUFQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVCA9ICJTRUxFQ1QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNNQUxMID0gIlNNQUxMIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFOID0gIlNQQU4iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklLRSA9ICJTVFJJS0UiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUk9ORyA9ICJTVFJPTkciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUWUxFID0gIlNUWUxFIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUIgPSAiU1VCIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVAgPSAiU1VQIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRSA9ICJUQUJMRSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEJPRFkgPSAiVEJPRFkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFREID0gIlREIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUQVJFQSA9ICJURVhUQVJFQSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEZPT1QgPSAiVEZPT1QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIID0gIlRIIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSEVBRCA9ICJUSEVBRCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSAiVElUTEUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSID0gIlRSIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUVCA9ICJUVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVSA9ICJVIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTCA9ICJVTCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSID0gIlZBUiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0JSID0gIldCUiI7IC8vIEQyMDU1MTMgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJRVUVFID0gIk1BUlFVRUUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9DT05GSUcgPSAiU1NJOkNPTkZJRyI7IC8vIEQyMTAzOTMKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfRUNITyA9ICJTU0k6RUNITyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0VYRUMgPSAiU1NJOkVYRUMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9GU0laRSA9ICJTU0k6RlNJWkUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9GTEFTVE1PRCA9ICJTU0k6RkxBU1RNT0QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9JTkNMVURFID0gIlNTSTpJTkNMVURFIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfUFJJTlRFTlYgPSAiU1NJOlBSSU5URU5WIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfU0VUID0gIlNTSTpTRVQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9XTUwgPSAid21sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQ0FSRCA9ICJjYXJkIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfVEVNUExBVEUgPSAidGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BQ0NFU1MgPSAiYWNjZXNzIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfRE8gPSAiZG8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9PTkVWRU5UID0gIm9uZXZlbnQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9USU1FUiA9ICJ0aW1lciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FOQ0hPUiA9ICJhbmNob3IiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9QUkVWID0gInByZXYiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9SRUZSRVNIID0gInJlZnJlc2giOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9HTyA9ICJnbyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX05PT1AgPSAibm9vcCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX1NFVFZBUiA9ICJzZXR2YXIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9QT1NURklFTEQgPSAicG9zdGZpZWxkIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIENoYXJhY3RlciBFbnRpdGllcwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEVudGl0eU5hbWUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQUNVVEVfVSA9ICJBYWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFBQ1VURV9MID0gImFhY3V0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNJUkNfVSA9ICJBY2lyYyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNJUkNfTCA9ICJhY2lyYyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNVVEUgPSAiYWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFFTElHX1UgPSAiQUVsaWciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFFTElHX0wgPSAiYWVsaWciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFHUkFWRV9VID0gIkFncmF2ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUdSQVZFX0wgPSAiYWdyYXZlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTEVGU1lNID0gImFsZWZzeW0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMUEhBX1UgPSAiQWxwaGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMUEhBX0wgPSAiYWxwaGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFNUCA9ICJhbXAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFORCA9ICJhbmQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFORyA9ICJhbmciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSSU5HX1UgPSAiQXJpbmciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSSU5HX0wgPSAiYXJpbmciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTWU1QID0gImFzeW1wIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVElMREVfVSA9ICJBdGlsZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUSUxERV9MID0gImF0aWxkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVNTF9VID0gIkF1bWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVTUxfTCA9ICJhdW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRFFVTyA9ICJiZHF1byI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVUQV9VID0gIkJldGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFVEFfTCA9ICJiZXRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUlZCQVIgPSAiYnJ2YmFyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUxMID0gImJ1bGwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBUCA9ICJjYXAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENDRURJTF9VID0gIkNjZWRpbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0NFRElMX0wgPSAiY2NlZGlsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRURJTCA9ICJjZWRpbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0VOVCA9ICJjZW50IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSElfVSA9ICJDaGkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENISV9MID0gImNoaSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0lSQyA9ICJjaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTFVCUyA9ICJjbHVicyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORyA9ICJjb25nIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1BZID0gImNvcHkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSQVJSID0gImNyYXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVAgPSAiY3VwIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVJSRU4gPSAiY3VycmVuIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQUdHRVJfVSA9ICJEYWdnZXIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBR0dFUl9MID0gImRhZ2dlciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFSUl9VID0gImRBcnIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBUlJfTCA9ICJkYXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUcgPSAiZGVnIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxUQV9VID0gIkRlbHRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxUQV9MID0gImRlbHRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFNUyA9ICJkaWFtcyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElWSURFID0gImRpdmlkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFDVVRFX1UgPSAiRWFjdXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQUNVVEVfTCA9ICJlYWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVDSVJDX1UgPSAiRWNpcmMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVDSVJDX0wgPSAiZWNpcmMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVHUkFWRV9VID0gIkVncmF2ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUdSQVZFX0wgPSAiZWdyYXZlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWSA9ICJlbXB0eSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1TUCA9ICJlbXNwIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlNQID0gImVuc3AiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVQU0lMT05fVSA9ICJFcHNpbG9uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUFNJTE9OX0wgPSAiZXBzaWxvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVFVSVYgPSAiZXF1aXYiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVUQV9VID0gIkV0YSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVRBX0wgPSAiZXRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVEhfVSA9ICJFVEgiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVUSF9MID0gImV0aCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVVNTF9VID0gIkV1bWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVVTUxfTCA9ICJldW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVVJPID0gImV1cm8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYSVNUID0gImV4aXN0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTk9GID0gImZub2YiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkFMTCA9ICJmb3JhbGwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUMxMiA9ICJmcmFjMTIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUMxNCA9ICJmcmFjMTQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUMzNCA9ICJmcmFjMzQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQVNMID0gImZyYXNsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHQU1NQV9VID0gIkdhbW1hIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHQU1NQV9MID0gImdhbW1hIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRSA9ICJnZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1QgPSAiZ3QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhBUlJfVSA9ICJoQXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQVJSX0wgPSAiaGFyciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBUlRTID0gImhlYXJ0cyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVMTElQID0gImhlbGxpcCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUFDVVRFX1UgPSAiSWFjdXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQUNVVEVfTCA9ICJpYWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDSVJDX1UgPSAiSWNpcmMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDSVJDX0wgPSAiaWNpcmMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElFWENMID0gImlleGNsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJR1JBVkVfVSA9ICJJZ3JhdmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElHUkFWRV9MID0gImlncmF2ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0UgPSAiaW1hZ2UiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElORklOID0gImluZmluIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlQgPSAiaW50IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJT1RBX1UgPSAiSW90YSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU9UQV9MID0gImlvdGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElRVUVTVCA9ICJpcXVlc3QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTSU4gPSAiaXNpbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVVNTF9VID0gIkl1bWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElVTUxfTCA9ICJpdW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLQVBQQV9VID0gIkthcHBhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLQVBQQV9MID0gImthcHBhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQU1CREFfVSA9ICJMYW1iZGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBTUJEQV9MID0gImxhbWJkYSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFORyA9ICJsYW5nIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVFVTyA9ICJsYXF1byI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFSUl9VID0gImxBcnIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBUlJfTCA9ICJsYXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQ0VJTCA9ICJsY2VpbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTERRVU8gPSAibGRxdW8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFID0gImxlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRkxPT1IgPSAibGZsb29yIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT1dBU1QgPSAibG93YXN0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT1ogPSAibG96IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMUk0gPSAibHJtIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMU0FRVU8gPSAibHNhcXVvIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMU1FVTyA9ICJsc3F1byI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFQgPSAibHQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BQ1IgPSAibWFjciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTURBU0ggPSAibWRhc2giOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JQ1JPID0gIm1pY3JvIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSURET1QgPSAibWlkZG90IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5VUyA9ICJtaW51cyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVfVSA9ICJNdSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVfTCA9ICJtdSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFCTEEgPSAibmFibGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5CU1AgPSAibmJzcCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkRBU0ggPSAibmRhc2giOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FID0gIm5lIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOSSA9ICJuaSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UID0gIm5vdCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9USU4gPSAibm90aW4iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TVUIgPSAibnN1YiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlRJTERFX1UgPSAiTnRpbGRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVElMREVfTCA9ICJudGlsZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VX1UgPSAiTnUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VX0wgPSAibnUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9BQ1VURV9VID0gIk9hY3V0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0FDVVRFX0wgPSAib2FjdXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQ0lSQ19VID0gIk9jaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQ0lSQ19MID0gIm9jaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPRUxJR19VID0gIk9FbGlnIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPRUxJR19MID0gIm9lbGlnIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPR1JBVkVfVSA9ICJPZ3JhdmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9HUkFWRV9MID0gIm9ncmF2ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0xJTkUgPSAib2xpbmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NRUdBX1UgPSAiT21lZ2EiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NRUdBX0wgPSAib21lZ2EiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NSUNST05fVSA9ICJPbWljcm9uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTUlDUk9OX0wgPSAib21pY3JvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BMVVMgPSAib3BsdXMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SID0gIm9yIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUkRGID0gIm9yZGYiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SRE0gPSAib3JkbSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NMQVNIX1UgPSAiT3NsYXNoIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPU0xBU0hfTCA9ICJvc2xhc2giOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9USUxERV9VID0gIk90aWxkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1RJTERFX0wgPSAib3RpbGRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVElNRVMgPSAib3RpbWVzIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVU1MX1UgPSAiT3VtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VNTF9MID0gIm91bWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkEgPSAicGFyYSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVCA9ICJwYXJ0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJNSUwgPSAicGVybWlsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJQID0gInBlcnAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBISV9VID0gIlBoaSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhJX0wgPSAicGhpIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9VID0gIlBpIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9MID0gInBpIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSVYgPSAicGl2IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVTTU4gPSAicGx1c21uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1VORCA9ICJwb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTUVfVSA9ICJQcmltZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTUVfTCA9ICJwcmltZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRCA9ICJwcm9kIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QID0gInByb3AiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBTSV9VID0gIlBzaSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFNJX0wgPSAicHNpIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVU9UID0gInF1b3QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJBRElDID0gInJhZGljIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HID0gInJhbmciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJBUVVPID0gInJhcXVvIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQVJSX1UgPSAickFyciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFSUl9MID0gInJhcnIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJDRUlMID0gInJjZWlsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRFFVTyA9ICJyZHF1byI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBTCA9ICJyZWFsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUcgPSAicmVnIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRkxPT1IgPSAicmZsb29yIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSSE9fVSA9ICJSaG8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJIT19MID0gInJobyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkxNID0gInJsbSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlNBUVVPID0gInJzYXF1byI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlNRVU8gPSAicnNxdW8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNCUVVPID0gInNicXVvIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0FST05fVSA9ICJTY2Fyb24iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDQVJPTl9MID0gInNjYXJvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0RPVCA9ICJzZG90IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNUID0gInNlY3QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIWSA9ICJzaHkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR01BX1UgPSAiU2lnbWEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR01BX0wgPSAic2lnbWEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR01BRiA9ICJzaWdtYWYiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTSA9ICJzaW0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQQURFUyA9ICJzcGFkZXMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQiA9ICJzdWIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQkUgPSAic3ViZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VNID0gInN1bSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQID0gInN1cCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQMSA9ICJzdXAxIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVAyID0gInN1cDIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUDMgPSAic3VwMyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQRSA9ICJzdXBlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWkxJRyA9ICJzemxpZyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFVX1UgPSAiVGF1IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVVfTCA9ICJ0YXUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIRVJFNCA9ICJ0aGVyZTQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIRVRBX1UgPSAiVGhldGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIRVRBX0wgPSAidGhldGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIRVRBU1lNID0gInRoZXRhc3ltIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSElOU1AgPSAidGhpbnNwIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSE9STl9VID0gIlRIT1JOIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSE9STl9MID0gInRob3JuIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSUxERSA9ICJ0aWxkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRVMgPSAidGltZXMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQURFID0gInRyYWRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVQUNVVEVfVSA9ICJVYWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVBQ1VURV9MID0gInVhY3V0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUFSUl9VID0gInVBcnIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVBUlJfTCA9ICJ1YXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVQ0lSQ19VID0gIlVjaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVQ0lSQ19MID0gInVjaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVR1JBVkVfVSA9ICJVZ3JhdmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVHUkFWRV9MID0gInVncmF2ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU1MID0gInVtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBTSUggPSAidXBzaWgiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVQU0lMT05fVSA9ICJVcHNpbG9uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUFNJTE9OX0wgPSAidXBzaWxvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVVNTF9VID0gIlV1bWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVVTUxfTCA9ICJ1dW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUlFUlAgPSAid2VpZXJwIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYSV9VID0gIlhpIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYSV9MID0gInhpIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBZQUNVVEVfVSA9ICJZYWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFlBQ1VURV9MID0gInlhY3V0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVOID0gInllbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWVVNTF9VID0gIll1bWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFlVTUxfTCA9ICJ5dW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaRVRBX1UgPSAiWmV0YSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWkVUQV9MID0gInpldGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpXSiA9ICJ6d2oiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpXTkogPSAienduaiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MNDBfVVJJID0gImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvZnJhbWVzZXQuZHRkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUw0MF9UQUdfUFJFRklYID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBnbG9iYWwgYXR0cmlidXRlIG5hbWVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lEID0gImlkIjsgLy8gJWNvcmVhdHRyczsKLQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NMQVNTID0gImNsYXNzIjsgLy8gJWNvcmVhdHRyczsKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NUWUxFID0gInN0eWxlIjsgLy8gJWNvcmVhdHRyczsKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1RJVExFID0gInRpdGxlIjsgLy8gJWNvcmVhdHRyczsKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0xBTkcgPSAibGFuZyI7IC8vICVpMThuOwotCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0RJUiA9ICJkaXIiOyAvLyAlaTE4bjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTkNMSUNLID0gIm9uY2xpY2siOyAvLyAlZXZlbnRzOwotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OREJMQ0xJQ0sgPSAib25kYmxjbGljayI7IC8vICVldmVudHM7Ci0JCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05NT1VTRURPV04gPSAib25tb3VzZWRvd24iOyAvLyAlZXZlbnRzOwotCQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05NT1VTRVVQID0gIm9ubW91c2V1cCI7IC8vICVldmVudHM7Ci0JCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OTU9VU0VPVkVSID0gIm9ubW91c2VvdmVyIjsgLy8gJWV2ZW50czsKLQkJCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OTU9VU0VNT1ZFID0gIm9ubW91c2Vtb3ZlIjsgLy8gJWV2ZW50czsKLQkJCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OTU9VU0VPVVQgPSAib25tb3VzZW91dCI7IC8vICVldmVudHM7Ci0JCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05LRVlQUkVTUyA9ICJvbmtleXByZXNzIjsgLy8gJWV2ZW50czsKLQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTktFWURPV04gPSAib25rZXlkb3duIjsgLy8gJWV2ZW50czsKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05LRVlVUCA9ICJvbmtleXVwIjsgLy8gJWV2ZW50czsKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTkhFTFAgPSAib25oZWxwIjsgLy8gJWV2ZW50czsKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQkdDT0xPUiA9ICJiZ2NvbG9yIjsgLy8gJWJvZHljb2xvcjssCi0JCQkJCQkJCQkJCQkJCQkgIC8vIFRBQkxFCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVEVYVCA9ICJ0ZXh0IjsgLy8gJWJvZHljb2xvcjsKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9MSU5LID0gImxpbmsiOyAvLyAlYm9keWNvbG9yOwotCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZMSU5LID0gInZsaW5rIjsgLy8gJWJvZHljb2xvcjsKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FMSU5LID0gImFsaW5rIjsgLy8gJWJvZHljb2xvcjsKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vIEhUTUwKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QUk9GSUxFID0gInByb2ZpbGUiOyAvLyBIRUFECi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05MT0FEID0gIm9ubG9hZCI7IC8vIEJPRFkKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05VTkxPQUQgPSAib251bmxvYWQiOyAvLyBCT0RZCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9CQUNLR1JPVU5EID0gImJhY2tncm91bmQiOyAvLyBCT0RZLAotCQkJCQkJCQkJCQkJCQkJCQkvLyBUQUJMRQotCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NSQyA9ICJzcmMiOyAvLyBJTUcgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BTFQgPSAiYWx0IjsgLy8gSU1HLEFSRUEKLQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTE9OR0RFU0MgPSAibG9uZ2Rlc2MiOyAvLyBJTUcKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX05BTUUgPSAibmFtZSI7IC8vIElNRyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hFSUdIVCA9ICJoZWlnaHQiOyAvLyBJTUcsIFRBQkxFCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1dJRFRIID0gIndpZHRoIjsgLy8gSU1HLCBUQUJMRSxIUgotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVVNFTUFQID0gInVzZW1hcCI7IC8vIElNRwotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JU01BUCA9ICJpc21hcCI7IC8vIElNRyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FMSUdOID0gImFsaWduIjsgLy8gSU1HLCBUQUJMRSxIUgotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQk9SREVSID0gImJvcmRlciI7IC8vIElNRywgVEFCTEUKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSFNQQUNFID0gImhzcGFjZSI7IC8vIElNRwotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WU1BBQ0UgPSAidnNwYWNlIjsgLy8gSU1HCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX01BUEZJTEUgPSAibWFwZmlsZSI7IC8vIElNRwotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NVTU1BUlkgPSAic3VtbWFyeSI7IC8vIFRBQkxFCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRlJBTUUgPSAiZnJhbWUiOyAvLyBUQUJMRQotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUlVMRVMgPSAicnVsZXMiOyAvLyBUQUJMRQotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0VMTFNQQUNJTkcgPSAiY2VsbHNwYWNpbmciOyAvLyBUQUJMRQotCQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0VMTFBBRERJTkcgPSAiY2VsbHBhZGRpbmciOyAvLyBUQUJMRQotCQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfREFUQVBBR0VTSVpFID0gImRhdGFwYWdlc2l6ZSI7IC8vIFRBQkxFLEhSCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPTE9SID0gImNvbG9yIjsgLy8gQkFTRUZPTlQsRk9OVAotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRkFDRSA9ICJmYWNlIjsgLy8gQkFTRUZPTlQsRk9OVAotCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NJWkUgPSAic2l6ZSI7IC8vIEJBU0VGT05ULEZPTlQKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DTEVBUiA9ICJjbGVhciI7IC8vIEJSIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0hBUEUgPSAic2hhcGUiOyAvLyBBUkVBCi0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT09SRFMgPSAiY29vcmRzIjsgLy8gQVJFQQotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9IUkVGID0gImhyZWYiOyAvLyBBUkVBIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVEFSR0VUID0gInRhcmdldCI7IC8vIEFSRUEKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTk9IUkVGID0gIm5vaHJlZiI7IC8vIEFSRUEKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVEFCSU5ERVggPSAidGFiaW5kZXgiOyAvLyBBUkVBCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BQ0NFU1NLRVkgPSAiYWNjZXNza2V5IjsgLy8gQVJFQQotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTkZPQ1VTID0gIm9uZm9jdXMiOyAvLyBBUkVBCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05CTFVSID0gIm9uYmx1ciI7IC8vIEFSRUEKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0hBUlNFVCA9ICJjaGFyc2V0IjsgLy8gTElOSwotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hSRUZMQU5HID0gImhyZWZsYW5nIjsgLy8gTElOSwotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVFlQRSA9ICJ0eXBlIjsgLy8gTElOSyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1JFTCA9ICJyZWwiOyAvLyBMSU5LIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUkVWID0gInJldiI7IC8vIExJTksgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NRURJQSA9ICJtZWRpYSI7IC8vIExJTksKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZBTFVFID0gInZhbHVlIjsgLy8gUEFSQU0KLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZBTFVFVFlQRSA9ICJ2YWx1ZXR5cGUiOyAvLyBQQVJBTQotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9OT1NIQURFID0gIm5vc2hhZGUiOyAvLyBIUgotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NIRUNLRUQgPSAiY2hlY2tlZCI7IC8vIElOUFVUCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRElTQUJMRUQgPSAiZGlzYWJsZWQiOyAvLyBJTlBVVAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUkVBRE9OTFkgPSAicmVhZG9ubHkiOyAvLyBJTlBVVAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTUFYTEVOR1RIID0gIm1heGxlbmd0aCI7IC8vIElOUFVUCi0JCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OU0VMRUNUID0gIm9uc2VsZWN0IjsgLy8gSU5QVVQKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OQ0hBTkdFID0gIm9uY2hhbmdlIjsgLy8gSU5QVVQKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FDQ0VQVCA9ICJhY2NlcHQiOyAvLyBJTlBVVAotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JU1RZTEUgPSAiaXN0eWxlIjsgLy8gSU5QVVQKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0hBUiA9ICJjaGFyIjsgLy8gQ09MIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0hBUk9GRiA9ICJjaGFyb2ZmIjsgLy8gQ09MCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVkFMSUdOID0gInZhbGlnbiI7IC8vIENPTAotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TUEFOID0gInNwYW4iOyAvLyBDT0wgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9GUkFNRUJPUkRFUiA9ICJmcmFtZWJvcmRlciI7IC8vIEZSQU1FCi0JCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NQVJHSU5XSURUSCA9ICJtYXJnaW53aWR0aCI7IC8vIEZSQU1FCi0JCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NQVJHSU5IRUlHSFQgPSAibWFyZ2luaGVpZ2h0IjsgLy8gRlJBTUUKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTk9SRVNJWkUgPSAibm9yZXNpemUiOyAvLyBGUkFNRQotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0NST0xMSU5HID0gInNjcm9sbGluZyI7IC8vIEZSQU1FCi0JCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BST01QVCA9ICJwcm9tcHQiOyAvLyBJU0lOREVYCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hUVFBfRVFVSVYgPSAiaHR0cC1lcXVpdiI7IC8vIE1FVEEKLQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT05URU5UID0gImNvbnRlbnQiOyAvLyBNRVRBCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0NIRU1FID0gInNjaGVtZSI7IC8vIE1FVEEKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRVJSTVNHID0gImVycm1zZyI7IC8vIHNzaTpjb25maWcKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0laRUZNVCA9ICJzaXplZm10IjsgLy8gc3NpOmNvbmZpZwotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1RJTUVGTVQgPSAidGltZWZtdCI7IC8vIHNzaTpjb25maWcKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WQVIgPSAidmFyIjsgLy8gc3NpOmVjaG8KLQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0dJID0gImNnaSI7IC8vIHNzaTpleGVjCi0JCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NNRCA9ICJjbWQiOyAvLyBzc2k6ZXhlYwotCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9GSUxFID0gImZpbGUiOyAvLyBzc2k6ZnNpemUKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WSVJUVUFMID0gInZpcnR1YWwiOyAvLyBzc2k6ZnNpemUKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TRUxFQ1RFRCA9ICJzZWxlY3RlZCI7IC8vIE9QVElPTgotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTEFCRUwgPSAibGFiZWwiOyAvLyBPUFRJT04KLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1JPV1MgPSAicm93cyI7IC8vIFRFWFRBUkVBCi0JCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09MUyA9ICJjb2xzIjsgLy8gVEVYVEFSRUEKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9MQU5HVUFHRSA9ICJsYW5ndWFnZSI7IC8vIFNDUklQVAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfREVGRVIgPSAiZGVmZXIiOyAvLyBTQ1JJUFQKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0VWRU5UID0gImV2ZW50IjsgLy8gU0NSSVBUCi0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9GT1IgPSAiZm9yIjsgLy8gU0NSSVBUIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09NUEFDVCA9ICJjb21wYWN0IjsgLy8gT0wvVUwKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TVEFSVCA9ICJzdGFydCI7IC8vIE9ML1VMCi0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9ESVJFQ1RLRVkgPSAiZGlyZWN0a2V5IjsgLy8gQQotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT0RFQkFTRSA9ICJjb2RlYmFzZSI7IC8vIEFQUExFVAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQVJDSElWRSA9ICJhcmNoaXZlIjsgLy8gQVBQTEVUCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09ERSA9ICJjb2RlIjsgLy8gQVBQTEVUCi0JCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT0JKRUNUID0gIm9iamVjdCI7IC8vIEFQUExFVAotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NQVlTQ1JJUFQgPSAibWF5c2NyaXB0IjsgLy8gQVBQTEVUCi0JCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NJVEUgPSAiY2l0ZSI7IC8vIEJMT0NLUVVPVEUKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NQUNSTyA9ICJtYWNybyI7IC8vIEQyVyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0RBVEVUSU1FID0gImRhdGV0aW1lIjsgLy8gSU5TL0RFTAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTE9PUCA9ICJsb29wIjsgLy8gRU1CRUQgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9ISURERU4gPSAiaGlkZGVuIjsgLy8gRU1CRUQKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVk9MVU1FID0gInZvbHVtZSI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FVVE9TVEFSVCA9ICJhdXRvc3RhcnQiOyAvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BVVRPUExBWSA9ICJhdXRvcGxheSI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BVVRPU0laRSA9ICJhdXRvc2l6ZSI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT05UUk9MTEVSID0gImNvbnRyb2xsZXIiOy8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TQ0FMRSA9ICJzY2FsZSI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TSE9XQ09OVFJPTFMgPSAic2hvd2NvbnRyb2xzIjsvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BMQVlDT1VOVCA9ICJwbGF5Y291bnQiOyAvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9SRVBFQVQgPSAicmVwZWF0IjsgLy8gRU1CRUQKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUEFORUwgPSAicGFuZWwiOyAvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUEFMRVRURSA9ICJwYWxldHRlIjsgLy8gRU1CRUQKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9URVhURk9DVVMgPSAidGV4dGZvY3VzIjsgLy8gRU1CRUQKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUNUSU9OID0gImFjdGlvbiI7IC8vIEZPUk0KLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTUVUSE9EID0gIm1ldGhvZCI7IC8vIEZPUk0KLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRU5DVFlQRSA9ICJlbmN0eXBlIjsgLy8gRk9STQotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OU1VCTUlUID0gIm9uc3VibWl0IjsgLy8gRk9STQotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05SRVNFVCA9ICJvbnJlc2V0IjsgLy8gRk9STQotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FDQ0VQVF9DSEFSU0VUID0gImFjY2VwdC1jaGFyc2V0IjsvLyBGT1JNCi0JCQkJCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0JFSEFWSU9SID0gImJlaGF2aW9yIjsgLy8gTUFSUVVFRQotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRElSRUNUSU9OID0gImRpcmVjdGlvbiI7IC8vIE1BUlFVRUUKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0NST0xMQU1PVU5UID0gInNjcm9sbGFtb3VudCI7Ly8gTUFSUVVFRQotCQkJCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NDUk9MTERFTEFZID0gInNjcm9sbGRlbGF5IjsvLyBNQVJRVUVFCi0JCQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1RSVUVTUEVFRCA9ICJ0cnVlc3BlZWQiOyAvLyBNQVJRVUVFCi0JCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0RFQ0xBUkUgPSAiZGVjbGFyZSI7IC8vIE9CSkVDVAotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NMQVNTSUQgPSAiY2xhc3NpZCI7IC8vIE9CSkVDVAotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0RBVEEgPSAiZGF0YSI7IC8vIE9CSkVDVAotCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPREVUWVBFID0gImNvZGV0eXBlIjsgLy8gT0JKRUNUCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TVEFOREJZID0gInN0YW5kYnkiOyAvLyBPQkpFQ1QKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NVUxUSVBMRSA9ICJtdWx0aXBsZSI7IC8vIFNFTEVDVAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUJCUiA9ICJhYmJyIjsgLy8gVEgvVEQgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BWElTID0gImF4aXMiOyAvLyBUSC9URCAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hFQURFUlMgPSAiaGVhZGVycyI7IC8vIFRIL1RECi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0NPUEUgPSAic2NvcGUiOyAvLyBUSC9URAotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUk9XU1BBTiA9ICJyb3dzcGFuIjsgLy8gVEgvVEQKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT0xTUEFOID0gImNvbHNwYW4iOyAvLyBUSC9URAotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX05PV1JBUCA9ICJub3dyYXAiOyAvLyBUSC9URAotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCS8vIDw8RDIwNTUxNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9UT1BNQVJHSU4gPSAidG9wbWFyZ2luIjsgLy8gQk9EWQotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9CT1RUT01NQVJHSU4gPSAiYm90dG9tbWFyZ2luIjsgLy8gQk9EWQotCQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9MRUZUTUFSR0lOID0gImxlZnRtYXJnaW4iOyAvLyBCT0RZCi0JCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUklHSFRNQVJHSU4gPSAicmlnaHRtYXJnaW4iOyAvLyBCT0RZCi0JCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9CT1JERVJDT0xPUiA9ICJib3JkZXJjb2xvciI7IC8vIFRBQkxFL1RSL1RIL1REL0ZSQU1FU0VUL0ZSQU1FCi0JCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCS8vIGZvciBXTUwKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQVRUUl9OQU1FX1RJVExFID0gInRpdGxlIjsgLy8gY2FyZAotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9ET01BSU4gPSAiZG9tYWluIjsgLy8gYWNjZXNzCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfUEFUSCA9ICJwYXRoIjsgLy8gYWNjZXNzCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9PTkVOVEVSRk9SV0FSRCA9ICJvbmVudGVyZm9yd2FyZCI7IC8vIHRlbXBsYXRlLGNhcmQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfT05FTlRFUkJBQ0tXQVJEID0gIm9uZW50ZXJiYWNrd2FyZCI7IC8vIHRlbXBsYXRlLGNhcmQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9PTlBJQ0sgPSAib25waWNrIjsgLy8gb3B0aW9uCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfT05USU1FUiA9ICJvbnRpbWVyIjsgLy8gdGVtcGxhdGUsY2FyZAotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfTkVXQ09OVEVYVCA9ICJuZXdjb250ZXh0IjsgLy8gY2FyZAotCQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfT1JERVJFRCA9ICJvcmRlcmVkIjsgLy8gY2FyZAotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfT1BUSU9OQUwgPSAib3B0aW9uYWwiOyAvLyBkbwotCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9DQUNIRV9DT05UUk9MID0gImNhY2hlLWNvbnRyb2wiOyAvLyBnbwotCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfU0VORFJFRkVSRVIgPSAic2VuZHJlZmVyZXIiOyAvLyBnbwotCQkJCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9NRVRIT0QgPSAibWV0aG9kIjsgLy8gZ28KLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9FTkNUWVBFID0gImVuY3R5cGUiOyAvLyBnbwotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfQUNDRVBUX0NIQVJTRVQgPSAiYWNjZXB0LWNoYXJzZXQiOyAvLyBnbwotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9DT0xVTU5TID0gImNvbHVtbnMiOyAvLyB0YWJsZQotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCS8vIEQyMDU1MTQKLQkvLzw8RDIxNTY4NAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9GUkFNRVNQQUNJTkcgPSAiZnJhbWVzcGFjaW5nIjsgLy8gRlJBTUVTRVQKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQkvL0QyMTU2ODQKLQkvLyBnbG9iYWwgYXR0cmlidXRlIHZhbHVlczsgbWFpbmx5IHVzZWQgaW4gZW51bWVyYXRpb24uCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9WRVJTSU9OX1RSQU5TSVRJT05BTCA9ICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1ZFUlNJT05fRlJBTUVTRVQgPSAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIEZyYW1lc2V0Ly9FTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0xUUiA9ICJsdHIiOyAvLyBkaXIgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUlRMID0gInJ0bCI7IC8vIGRpciAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgYWxpZ24gKHRvcHxtaWRkbGV8Ym90dG9tfGxlZnR8cmlnaHQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9UT1AgPSAidG9wIjsgLy8gYWxpZ24gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTUlERExFID0gIm1pZGRsZSI7IC8vIGFsaWduCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQk9UVE9NID0gImJvdHRvbSI7IC8vIGFsaWduCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTEVGVCA9ICJsZWZ0IjsgLy8gYWxpZ24KLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NFTlRFUiA9ICJjZW50ZXIiOyAvLyBhbGlnbgotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JJR0hUID0gInJpZ2h0IjsgLy8gYWxpZ24KLQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfSlVTVElGWSA9ICJqdXN0aWZ5IjsgLy8gYWxpZ24KLQkJCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NIQVIgPSAiY2hhciI7IC8vIGFsaWduCi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgdmFsaWduIChiYXNlbGluZSkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0JBU0VMSU5FID0gImJhc2VsaW5lIjsgLy8gdmFsaWduCi0JCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciBjbGVhciAobGVmdHxhbGx8cmlnaHR8bm9uZSk6IGxlZnQgYW5kIHJpZ2h0IGFyZSBhbHJlYWR5IGRlZmluZWQKLQkvLyBhYm92ZS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0FMTCA9ICJhbGwiOyAvLyBjbGVhciAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9OT05FID0gIm5vbmUiOyAvLyBjbGVhcgotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIHNoYXBlIChyZWN0fGNpcmNsZXxwb2x5fGRlZmF1bHQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SRUNUID0gInJlY3QiOyAvLyBzaGFwZQotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQ0lSQ0xFID0gImNpcmNsZSI7IC8vIHNoYXBlCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUE9MWSA9ICJwb2x5IjsgLy8gc2hhcGUKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0RFRkFVTFQgPSAiZGVmYXVsdCI7IC8vIHNoYXBlCi0JCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgdmFsdWV0eXBlIChkYXRhfHJlZnxvYmplY3QpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9EQVRBID0gImRhdGEiOyAvLyB2YWx1ZXR5cGUKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JFRiA9ICJyZWYiOyAvLyB2YWx1ZXR5cGUKLQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9PQkpFQ1QgPSAib2JqZWN0IjsgLy8gdmFsdWV0eXBlCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIHR5cGUgb2YgSU5QVVQKLQkvLyAgICAgICAodGV4dCB8IHBhc3N3b3JkIHwgY2hlY2tib3ggfCByYWRpbyB8IHN1Ym1pdCB8IHJlc2V0IHwKLQkvLyAgICAgICAgZmlsZSB8IGhpZGRlbiB8IGltYWdlIHwgYnV0dG9uKQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVEVYVCA9ICJ0ZXh0IjsgLy8gSU5QVVQ6dHlwZQotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUEFTU1dPUkQgPSAicGFzc3dvcmQiOyAvLyBJTlBVVDp0eXBlCi0JCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NIRUNLQk9YID0gImNoZWNrYm94IjsgLy8gSU5QVVQ6dHlwZQotCQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SQURJTyA9ICJyYWRpbyI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfU1VCTUlUID0gInN1Ym1pdCI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SRVNFVCA9ICJyZXNldCI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfRklMRSA9ICJmaWxlIjsgLy8gSU5QVVQ6dHlwZQotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfSElEREVOID0gImhpZGRlbiI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9JTUFHRSA9ICJpbWFnZSI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQlVUVE9OID0gImJ1dHRvbiI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3Igc3BhbiwgY29sc3Bhbiwgcm93c3BhbgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfMSA9ICIxIjsgLy8gc3BhbiAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgZnJhbWVib3JkZXIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFXzAgPSAiMCI7IC8vIEZSQU1FIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciBzY3JvbGxpbmcKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1lFUyA9ICJ5ZXMiOyAvLyBGUkFNRSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9OTyA9ICJubyI7IC8vIEZSQU1FIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0FVVE8gPSAiYXV0byI7IC8vIEZSQU1FCi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgVUwKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0RJU0MgPSAiZGlzYyI7IC8vIFVMOnR5cGUKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1NRVUFSRSA9ICJzcXVhcmUiOyAvLyBVTDp0eXBlCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIGZyYW1lIG9mIFRBQkxFCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9WT0lEID0gInZvaWQiOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQUJPVkUgPSAiYWJvdmUiOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CRUxPVyA9ICJiZWxvdyI7IC8vIFRBQkxFOmZyYW1lCi0JCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0hTSURFUyA9ICJoc2lkZXMiOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0xIUyA9ICJsaHMiOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JIUyA9ICJyaHMiOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1ZTSURFUyA9ICJ2c2lkZXMiOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0JPWCA9ICJib3giOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0JPUkRFUiA9ICJib3JkZXIiOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciBydWxlcyBvZiBUQUJMRQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfR1JPVVBTID0gImdyb3VwcyI7IC8vIFRBQkxFOnJ1bGVzCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUk9XUyA9ICJyb3dzIjsgLy8gVEVYVEFSRUEKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NPTFMgPSAiY29scyI7IC8vIFRFWFRBUkVBCi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgbWV0aG9kIG9mIEZPUk0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0dFVCA9ICJnZXQiOyAvLyBGT1JNIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1BPU1QgPSAicG9zdCI7IC8vIEZPUk0gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfV1dXX0ZPUk1fVVJMRU5DT0RFRCA9ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiOyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3Igc2NvcGUgb2YgKFRIIHwgVEQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9ST1cgPSAicm93IjsgLy8gKFRIfFREKTpzY29wZQotCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NPTCA9ICJjb2wiOyAvLyAoVEh8VEQpOnNjb3BlCi0JCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUk9XR1JPVVAgPSAicm93Z3JvdXAiOy8vIChUSHxURCk6c2NvcGUKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DT0xHUk9VUCA9ICJjb2xncm91cCI7Ly8gKFRIfFREKTpzY29wZQotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciBhdXRvPz8gb2YgRU1CRUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1RSVUUgPSAidHJ1ZSI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9GQUxTRSA9ICJmYWxzZSI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciBiZWhhdmlybyBvZiBNQVJRVUVFCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9TQ1JPTEwgPSAic2Nyb2xsIjsgLy8gTUFSUVVFRQotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1NMSURFID0gInNsaWRlIjsgLy8gTUFSUVVFRQotCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9BTFRFUk5BVEUgPSAiYWx0ZXJuYXRlIjsgLy8gTUFSUVVFRQotCQkJCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciBkaXJlY3Rpb24gb2YgTUFSUVVFRQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVVAgPSAidXAiOyAvLyBNQVJRVUVFIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0RPV04gPSAiZG93biI7IC8vIE1BUlFVRUUKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciB0eXBlIG9mIExJIChEMTk5MjQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9OVU1CRVIgPSAiMSI7IC8vIExJIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0xPV0VSX0FMUEhBID0gImEiOyAvLyBMSQotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9DU1NOb2RlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0NTU05vZGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNDQ5MDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0NTU05vZGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTWVkaWFSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5pbWFnZS5DU1NJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlLkNTU0ltYWdlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0OwotCi0vKioKLSAqIEFkYXB0cyB0aGUgQ1NTIERPTSBub2RlIHRvIGEgSkZhY2Ugdmlld2VyLgotICovCi1jbGFzcyBDU1NOb2RlQWRhcHRlciBpbXBsZW1lbnRzIElKRmFjZU5vZGVBZGFwdGVyLCBJTm9kZUFkYXB0ZXIsIFJ1bm5hYmxlIHsKLQljbGFzcyBOb3RpZnlDb250ZXh0IHsKLQkJTm90aWZ5Q29udGV4dChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCQl0aGlzLm5vdGlmaWVyID0gbm90aWZpZXI7Ci0JCQl0aGlzLmV2ZW50VHlwZSA9IGV2ZW50VHlwZTsKLQkJCXRoaXMuY2hhbmdlZEZlYXR1cmUgPSBjaGFuZ2VkRmVhdHVyZTsKLQkJCXRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTsKLQkJCXRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTsKLQkJCXRoaXMucG9zID0gcG9zOwotCQl9Ci0KLQkJdm9pZCBmaXJlKCkgewotCQkJaW50ZXJuYWxOb3RpZnlDaGFuZ2VkKG5vdGlmaWVyLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcyk7Ci0JCX0KLQotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyOwotCQlpbnQgZXZlbnRUeXBlOwotCQlPYmplY3QgY2hhbmdlZEZlYXR1cmU7Ci0JCU9iamVjdCBvbGRWYWx1ZTsKLQkJT2JqZWN0IG5ld1ZhbHVlOwotCQlpbnQgcG9zOwotCX0KLQotCWNsYXNzIFN0eWxlVmlld1VwZGF0ZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmIChsYXN0VXBkYXRlciA9PSB0aGlzKSB7Ci0JCQkJaW50ZXJuYWxBY3Rpb25QZXJmb3JtZWQoKTsKLQkJCQlsYXN0VXBkYXRlciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQlwcml2YXRlIFZlY3RvciBub3RpZnlRdWV1ZTsKLQlTdHlsZVZpZXdVcGRhdGVyIGxhc3RVcGRhdGVyOwotCXByb3RlY3RlZCBpbnQgZGVsYXlNU2VjcyA9IDUwMDsKLQlmaW5hbCBzdGF0aWMgQ2xhc3MgQURBUFRFUl9LRVkgPSBJSkZhY2VOb2RlQWRhcHRlci5jbGFzczsKLQotCXB1YmxpYyBDU1NOb2RlQWRhcHRlcihJTm9kZUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxBY3Rpb25QZXJmb3JtZWQoKSB7Ci0JCWlmIChub3RpZnlRdWV1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYm9vbGVhbiByZWZyZXNoX2FsbCA9IGZhbHNlOwotCQlib29sZWFuIHJlZnJlc2hfcnVsZSA9IGZhbHNlOwotCQlpbnQgcG9zX2FsbCA9IDA7Ci0JCUxpc3QgdGFyZ2V0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub3RpZnlRdWV1ZS5zaXplKCk7IGkrKykgewotCQkJTm90aWZ5Q29udGV4dCBjb250ZXh0ID0gKE5vdGlmeUNvbnRleHQpIG5vdGlmeVF1ZXVlLmdldChpKTsKLQkJCWlmIChjb250ZXh0Lm5vdGlmaWVyIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpIHsKLQkJCQlyZWZyZXNoX2FsbCA9IHRydWU7Ci0JCQkJcG9zX2FsbCA9IGk7Ci0JCQl9Ci0JCQlpZiAoY29udGV4dC5ub3RpZmllciBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xhcmF0aW9uKSB7Ci0JCQkJcmVmcmVzaF9ydWxlID0gdHJ1ZTsKLQkJCQl0YXJnZXRzLmFkZChjb250ZXh0KTsKLQkJCQkvLyBwb3NfcnVsZSA9IGk7Ci0JCQl9Ci0JCQkvLyAoKE5vdGlmeUNvbnRleHQpIG5vdGlmeVF1ZXVlLmdldChpKSkuZmlyZSgpOwotCQl9Ci0JCWlmIChyZWZyZXNoX2FsbCkgewotCQkJKChOb3RpZnlDb250ZXh0KSBub3RpZnlRdWV1ZS5nZXQocG9zX2FsbCkpLmZpcmUoKTsKLQkJfQotCQllbHNlIGlmIChyZWZyZXNoX3J1bGUpIHsKLQkJCUl0ZXJhdG9yIGkgPSB0YXJnZXRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQkoKE5vdGlmeUNvbnRleHQpIGkubmV4dCgpKS5maXJlKCk7Ci0JCQl9Ci0JCQkvLyBlbHNlIGlmIChyZWZyZXNoX3J1bGUpIGludGVybmFsUmVmcmVzaEFsbCgpOwotCQl9Ci0JCWVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub3RpZnlRdWV1ZS5zaXplKCk7IGkrKykgewotCQkJCSgoTm90aWZ5Q29udGV4dCkgbm90aWZ5UXVldWUuZ2V0KGkpKS5maXJlKCk7Ci0JCQl9Ci0JCX0KLQkJbm90aWZ5UXVldWUuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYnkgdGhlIG9iamVjdCBiZWluZyBhZGFwdGVyICh0aGUgbm90aWZpZXIpIHdoZW4gc29tZXRoaW5nIGhhcwotCSAqIGNoYW5nZWQuCi0JICovCi0JcHVibGljIHZvaWQgaW50ZXJuYWxOb3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSAoKElKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldExpc3RlbmVycygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBsaXN0ZW5lciA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRWaWV3ZXIpIHsKLQkJCQlub3RpZnlDaGFuZ2VkRm9yU3RydWN0dXJlZFZpZXdlcigoU3RydWN0dXJlZFZpZXdlcikgbGlzdGVuZXIsIG5vdGlmaWVyLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcyk7Ci0JCQl9Ci0JCQllbHNlIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0JCQkJbm90aWZ5Q2hhbmdlZEZvclByb3BlcnR5U2hlZXRQYWdlKChQcm9wZXJ0eVNoZWV0UGFnZSkgbGlzdGVuZXIsIG5vdGlmaWVyLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbm90aWZ5Q2hhbmdlZEZvclByb3BlcnR5U2hlZXRQYWdlKFByb3BlcnR5U2hlZXRQYWdlIHBhZ2UsIElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJaWYgKHBhZ2UuZ2V0Q29udHJvbCgpID09IG51bGwgfHwgcGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNIQU5HRSB8fCBldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5BREQgfHwgZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuUkVNT1ZFKSB7Ci0JCQlwYWdlLnJlZnJlc2goKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBub3RpZnlDaGFuZ2VkRm9yU3RydWN0dXJlZFZpZXdlcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlciwgSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlpZiAodmlld2VyLmdldENvbnRyb2woKSA9PSBudWxsIHx8IHZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNIQU5HRSkgewotCQkJaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpIHsKLQkJCQlJQ1NTTm9kZSB0ZW1wID0gKGNoYW5nZWRGZWF0dXJlICE9IG51bGwpID8gKElDU1NOb2RlKSBjaGFuZ2VkRmVhdHVyZSA6IChJQ1NTTm9kZSkgbmV3VmFsdWU7Ci0JCQkJaWYgKHRlbXAgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmb3IgKDs7KSB7Ci0JCQkJCQlpZiAodGVtcCBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCXRlbXAgPSB0ZW1wLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWlmICh0ZW1wID09IG51bGwpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAodGVtcCA9PSBudWxsIHx8IHRlbXAgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCkgewotCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXZpZXdlci5yZWZyZXNoKHRlbXApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSUNTU05vZGUgdGVtcCA9IChJQ1NTTm9kZSkgbm90aWZpZXI7Ci0JCQkJaWYgKHRlbXAgIT0gbnVsbCkgewotCQkJCQl0ZW1wID0gdGVtcC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJfQotCQkJCWlmICh0ZW1wID09IG51bGwgfHwgdGVtcCBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0KSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl2aWV3ZXIucmVmcmVzaCh0ZW1wKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkFERCkgewotCQkJaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpIHsKLQkJCQlJQ1NTTm9kZSB0ZW1wID0gKGNoYW5nZWRGZWF0dXJlICE9IG51bGwpID8gKElDU1NOb2RlKSBjaGFuZ2VkRmVhdHVyZSA6IChJQ1NTTm9kZSkgbmV3VmFsdWU7Ci0JCQkJaWYgKHRlbXAgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmb3IgKDs7KSB7Ci0JCQkJCQlpZiAodGVtcCBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCXRlbXAgPSB0ZW1wLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWlmICh0ZW1wID09IG51bGwpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAodGVtcCA9PSBudWxsIHx8ICh0ZW1wIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpKSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl2aWV3ZXIucmVmcmVzaCh0ZW1wKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAobmV3VmFsdWUgIT0gbnVsbCAmJiAobmV3VmFsdWUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkpIHsKLQkJCQkJdmlld2VyLnJlZnJlc2goKChJQ1NTTm9kZSkgbmV3VmFsdWUpLmdldFBhcmVudE5vZGUoKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlJQ1NTTm9kZSB0ZW1wID0gKElDU1NOb2RlKSBub3RpZmllcjsKLQkJCQkJaWYgKHRlbXAgIT0gbnVsbCkgewotCQkJCQkJdGVtcCA9IHRlbXAuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQl9Ci0JCQkJCWlmICh0ZW1wID09IG51bGwgfHwgKHRlbXAgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCkpIHsKLQkJCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl2aWV3ZXIucmVmcmVzaCh0ZW1wKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUpIHsKLQkJCWlmIChub3RpZmllciBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0KSB7Ci0JCQkJSUNTU05vZGUgdGVtcCA9IChjaGFuZ2VkRmVhdHVyZSAhPSBudWxsKSA/IChJQ1NTTm9kZSkgY2hhbmdlZEZlYXR1cmUgOiAoSUNTU05vZGUpIG5ld1ZhbHVlOwotCQkJCWlmICh0ZW1wIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSkgewotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZm9yICg7OykgewotCQkJCQkJaWYgKHRlbXAgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKSB7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQl0ZW1wID0gdGVtcC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQlpZiAodGVtcCA9PSBudWxsKSB7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHRlbXAgPT0gbnVsbCB8fCAodGVtcCBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0KSkgewotCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXZpZXdlci5yZWZyZXNoKHRlbXApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gdmlld2VyLnJlZnJlc2gobm90aWZpZXIpOwotCQkJCUlDU1NOb2RlIHRlbXAgPSAoSUNTU05vZGUpIG5vdGlmaWVyOwotCQkJCWlmICh0ZW1wICE9IG51bGwpIHsKLQkJCQkJdGVtcCA9IHRlbXAuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCX0KLQkJCQlpZiAodGVtcCA9PSBudWxsIHx8ICh0ZW1wIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpKSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl2aWV3ZXIucmVmcmVzaCh0ZW1wKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGludGVybmFsUmVmcmVzaEFsbCgpIHsKLQkJQ29sbGVjdGlvbiBsaXN0ZW5lcnMgPSAoKEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTKSBhZGFwdGVyRmFjdG9yeSkuZ2V0TGlzdGVuZXJzKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBsaXN0ZW5lciA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRWaWV3ZXIpIHsKLQkJCQlTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSBsaXN0ZW5lcjsKLQkJCQlpZiAodmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsICYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgUHJvcGVydHlTaGVldFBhZ2UpIHsKLQkJCQlQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlID0gKFByb3BlcnR5U2hlZXRQYWdlKSBsaXN0ZW5lcjsKLQkJCQlpZiAocGFnZS5nZXRDb250cm9sKCkgIT0gbnVsbCAmJiAhcGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCXBhZ2UucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZSBhbGxvd3MgaXQKLQkgKiB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZS5lcXVhbHMoQURBUFRFUl9LRVkpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSB0aGUgb2JqZWN0IGJlaW5nIGFkYXB0ZXIgKHRoZSBub3RpZmllcikgd2hlbiBzb21ldGhpbmcgaGFzCi0JICogY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJaWYgKG5vdGlmeVF1ZXVlID09IG51bGwpCi0JCQlub3RpZnlRdWV1ZSA9IG5ldyBWZWN0b3IoKTsKLQkJbm90aWZ5UXVldWUuYWRkKG5ldyBOb3RpZnlDb250ZXh0KG5vdGlmaWVyLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcykpOwotCQkvLyBUT0RPLWZ1dHVyZTogdGhlcmUncyBwcm9iYWJseSBhIGJldHRlciB3YXkgdGhhbiByZWx5aW5nIG9uIGFzeW5jCi0JCS8vIGV4ZWMKLQkJaWYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgPT0gZ2V0RGlzcGxheSgpLmdldFRocmVhZCgpKQotCQkJZ2V0RGlzcGxheSgpLnRpbWVyRXhlYyhkZWxheU1TZWNzLCB0aGlzKTsKLQkJZWxzZQotCQkJZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0RGlzcGxheSgpICE9IG51bGwpIHsKLQkJCQkJCWdldERpc3BsYXkoKS50aW1lckV4ZWMoZGVsYXlNU2VjcywgdGhpcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQl9Ci0KLQlEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBvbmx5IGZvciB0aW1lckV4ZWMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJbGFzdFVwZGF0ZXIgPSBuZXcgU3R5bGVWaWV3VXBkYXRlcigpOwotCQlnZXREaXNwbGF5KCkuYXN5bmNFeGVjKGxhc3RVcGRhdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIGNvbnRhaW5pbmcgYWxsIGNoaWxkIG5vZGVzIG9mIHRoZSBnaXZlbiBlbGVtZW50LAotCSAqIHdoaWNoIHJlcHJlc2VudHMgYSBub2RlIGluIGEgdHJlZS4gVGhlIGRpZmZlcmVuY2UgdG8KLQkgKiA8Y29kZT5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhPYmplY3QpPC9jb2RlPiBpcyBhcwotCSAqIGZvbGxvd3M6IDxjb2RlPmdldEVsZW1lbnRzPC9jb2RlPiBpcyBjYWxsZWQgdG8gb2J0YWluIHRoZSB0cmVlCi0JICogdmlld2VyJ3Mgcm9vdCBlbGVtZW50cy4gTWV0aG9kIDxjb2RlPmdldENoaWxkcmVuPC9jb2RlPiBpcyB1c2VkIHRvCi0JICogb2J0YWluIHRoZSBjaGlsZHJlbiBvZiBhIGdpdmVuIG5vZGUgaW4gdGhlIHRyZWUsIHdoaWNoIGNhbiBjYW4gYmUgYQotCSAqIHJvb3Qgbm9kZSwgdG9vLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJSUNTU05vZGUgbm9kZSA9IChJQ1NTTm9kZSkgb2JqZWN0OwotCi0JCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmIChub2RlVHlwZSA9PSBJQ1NTTm9kZS5TVFlMRVJVTEVfTk9ERSB8fCBub2RlVHlwZSA9PSBJQ1NTTm9kZS5QQUdFUlVMRV9OT0RFIHx8IG5vZGVUeXBlID09IElDU1NOb2RlLkZPTlRGQUNFUlVMRV9OT0RFKSB7Ci0JCQkJZm9yIChub2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbCAmJiAhKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsYXJhdGlvbik7IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCQkvLyBub3AKLQkJCQl9Ci0JCQl9Ci0JCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSUNTU05vZGUgY2hpbGQgPSAobm9kZSAhPSBudWxsKSA/IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpIDogbnVsbDsKLQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUpICYmICEoY2hpbGQgaW5zdGFuY2VvZiBNZWRpYUxpc3QpKSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJCS8qCi0JCQkJICogUmVxdWlyZWQgdG8gY29ycmVjdGx5IGNvbm5lY3QgdGhlIHJlZnJlc2hpbmcgYmVoYXZpb3IgdG8KLQkJCQkgKiB0aGUgdHJlZQotCQkJCSAqLwotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCQkJKChJTm9kZU5vdGlmaWVyKSBjaGlsZCkuZ2V0QWRhcHRlckZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQkJfQotCQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiB3aXRoIHRoZSBlbGVtZW50cyBiZWxvbmdpbmcgdG8gdGhlIHBhc3NlZAotCSAqIGVsZW1lbnQuIFRoZXNlIGVsZW1lbnRzIGNhbiBiZSBwcmVzZW50ZWQgYXMgcm93cyBpbiBhIHRhYmxlLCBpdGVtcyBpbiBhCi0JICogbGlzdCBldGMuCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVGhlIHJvb3QgaXMgdXN1YWxseSBhbiBpbnN0YW5jZSBvZiBhbiBYTUxTdHJ1Y3R1cmVkTW9kZWwgaW4KLQkJLy8gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIGV4dHJhY3QgdGhlIGRvY3VtZW50LgotCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ1NTTW9kZWwpIHsKLQkJCUFycmF5TGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJLy8gaW50ZXJuYWxHZXRFbGVtZW50cyhvYmplY3QsIHYpOwotCQkJYWRkRWxlbWVudHMob2JqZWN0LCB2KTsKLQkJCU9iamVjdFtdIGVsZW1lbnRzID0gdi50b0FycmF5KCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkvKgotCQkJCSAqIFJlcXVpcmVkIHRvIGNvcnJlY3RseSBjb25uZWN0IHRoZSByZWZyZXNoaW5nIGJlaGF2aW9yIHRvCi0JCQkJICogdGhlIHRyZWUKLQkJCQkgKi8KLQkJCQlpZiAoZWxlbWVudHNbaV0gaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQkJCSgoSU5vZGVOb3RpZmllcikgZWxlbWVudHNbaV0pLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIGVsZW1lbnRzOwotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgZm9yIHVzZSBpbiB0aGUKLQkgKiBnaXZlbiB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgVGhlIHZpZXdlciB0aGF0IGRpc3BsYXlzIHRoZSBlbGVtZW50LgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gcHJvdmlkZSB0aGUgbGFiZWwgaW1hZ2UuIEVsZW1lbnQKLQkgKiAgICAgICAgICAgIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIG5vIGlucHV0IG9iamVjdCBpcyBzZXQKLQkgKiAgICAgICAgICAgIHRvIHRoZSB2aWV3ZXIuCi0JICovCi0JcHVibGljIEltYWdlIGdldExhYmVsSW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJQ1NTSW1hZ2VIZWxwZXIgaGVscGVyID0gQ1NTSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCXJldHVybiBoZWxwZXIuZ2V0SW1hZ2UoQ1NTSW1hZ2VUeXBlLmdldEltYWdlVHlwZSgoSUNTU05vZGUpIGVsZW1lbnQpKTsKLQkJCS8vIEltYWdlIGltYWdlID0gZ2V0Q1NTTm9kZUltYWdlKGVsZW1lbnQpOwotCQkJLy8gcmV0dXJuIGltYWdlOwotCQkJLy8gcmV0dXJuIGdldEFkYXB0ZXIoZWxlbWVudCkuZ2V0TGFiZWxJbWFnZSgoSUNTU05vZGUpIGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgZm9yIHVzZSBpbiB0aGUKLQkgKiBnaXZlbiB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgVGhlIHZpZXdlciB0aGF0IGRpc3BsYXlzIHRoZSBlbGVtZW50LgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gcHJvdmlkZSB0aGUgbGFiZWwgdGV4dC4gRWxlbWVudCBjYW4KLQkgKiAgICAgICAgICAgIGJlIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgbm8gaW5wdXQgb2JqZWN0IGlzIHNldCB0bwotCSAqICAgICAgICAgICAgdGhlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsVGV4dChPYmplY3QgZWxlbWVudCkgewotCQkvLyBUaGlzIHdhcyByZXR1cm5pbmcgbnVsbCwgb24gb2NjYXNpb24gLi4uIHByb2JhYmx5IHNob3VsZCBub3QgYmUsCi0JCS8vIGJ1dAotCQkvLyB0b29rIHRoZSBxdWljayBhbmQgZWFzeSB3YXkgb3V0IGZvciBub3cuIChkbXcgMy84LzAxKQotCi0JCVN0cmluZyByZXN1bHQgPSAiIjsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBtZWRpYVRleHQ7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCXN3aXRjaCAoKChJQ1NTTm9kZSkgZWxlbWVudCkuZ2V0Tm9kZVR5cGUoKSkgewotCQkJCWNhc2UgSUNTU05vZGUuU1RZTEVSVUxFX05PREUgOgotCQkJCQlyZXN1bHQgPSAoKElDU1NTdHlsZVJ1bGUpIGVsZW1lbnQpLmdldFNlbGVjdG9ycygpLmdldFN0cmluZygpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLkZPTlRGQUNFUlVMRV9OT0RFIDoKLQkJCQkJcmVzdWx0ID0gIkBmb250LWZhY2UiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUgOgotCQkJCQlyZXN1bHQgPSAoKENTU0ltcG9ydFJ1bGUpIGVsZW1lbnQpLmdldEhyZWYoKTsKLQkJCQkJbWVkaWFUZXh0ID0gZ2V0TWVkaWFUZXh0KChDU1NJbXBvcnRSdWxlKSBlbGVtZW50KTsKLQkJCQkJaWYgKG1lZGlhVGV4dCAhPSBudWxsICYmIDAgPCBtZWRpYVRleHQubGVuZ3RoKCkpIHsKLQkJCQkJCXJlc3VsdCArPSAiICgiICsgbWVkaWFUZXh0ICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLlBBR0VSVUxFX05PREUgOgotCQkJCQlyZXN1bHQgPSAiQHBhZ2UiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUgOgotCQkJCQlyZXN1bHQgPSAicHJvcGVydGllcyI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTElURU1fTk9ERSA6Ci0JCQkJCXJlc3VsdCA9ICgoSUNTU1N0eWxlRGVjbEl0ZW0pIGVsZW1lbnQpLmdldFByb3BlcnR5TmFtZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLlBSSU1JVElWRVZBTFVFX05PREUgOgotCQkJCQlyZXN1bHQgPSAoKElDU1NQcmltaXRpdmVWYWx1ZSkgZWxlbWVudCkuZ2V0U3RyaW5nVmFsdWUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ1NTTm9kZS5NRURJQVJVTEVfTk9ERSA6Ci0JCQkJCXJlc3VsdCA9ICJAbWVkaWEiOy8vJE5PTi1OTFMtMSQKLQkJCQkJbWVkaWFUZXh0ID0gZ2V0TWVkaWFUZXh0KChJQ1NTTWVkaWFSdWxlKSBlbGVtZW50KTsKLQkJCQkJaWYgKG1lZGlhVGV4dCAhPSBudWxsICYmIDAgPCBtZWRpYVRleHQubGVuZ3RoKCkpIHsKLQkJCQkJCXJlc3VsdCArPSAiICgiICsgbWVkaWFUZXh0ICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLkNIQVJTRVRSVUxFX05PREUgOgotCQkJCQlyZXN1bHQgPSAiQGNoYXJzZXQiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSA6Ci0JCQkJCXJlc3VsdCA9ICgoTWVkaWFMaXN0KSBlbGVtZW50KS5nZXRNZWRpYVRleHQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLy8gaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkvLyBJQ1NTTm9kZSBub2RlID0gKChJQ1NTTm9kZSllbGVtZW50KTsKLQkJLy8gcmVzdWx0ID0gZ2V0QWRhcHRlcihlbGVtZW50KS5nZXRMYWJlbFRleHQoKElDU1NOb2RlKSBlbGVtZW50KTsKLQkJLy8gfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIHRoYXQgdGhlIHBhcmVudCBjYW4ndCBiZSBjb21wdXRlZC4gSW4KLQkgKiB0aGlzIGNhc2UgdGhlIHRyZWUgdmlld2VyIGNhbid0IGV4cGFuZCBhIGdpdmVuIG5vZGUgY29ycmVjdGx5IGlmCi0JICogcmVxdWVzdGVkLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQlJQ1NTTm9kZSBub2RlID0gKChJQ1NTTm9kZSkgb2JqZWN0KS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpIHsKLQkJCQkvKgotCQkJCSAqIFJlcXVpcmVkIHRvIGFsc28gY29ycmVjdGx5IGNvbm5lY3Qgc3R5bGUgZGVjbGFyYXRpb24gdG8gdGhlCi0JCQkJICogcmVmcmVzaGluZyBiZWhhdmlvciBpbiB0aGUgdHJlZQotCQkJCSAqLwotCQkJCWlmIChub2RlIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkoKElOb2RlTm90aWZpZXIpIG5vZGUpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJCX0KLQkJCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbm9kZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBlbGVtZW50IGhhcyBjaGlsZHJlbi4KLQkgKiBPdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gcmV0dXJuIGdldEFkYXB0ZXIob2JqZWN0KS5oYXNDaGlsZHJlbigoSUNTU05vZGUpIG9iamVjdCk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJLyoKLQkJCSAqIFJlcXVpcmVkIHRvIGNvcnJlY3RseSBjb25uZWN0IHRoZSByZWZyZXNoaW5nIGJlaGF2aW9yIHRvIHRoZQotCQkJICogdHJlZQotCQkJICovCi0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCSgoSU5vZGVOb3RpZmllcikgb2JqZWN0KS5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJCX0KLQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gKChJQ1NTTm9kZSkgb2JqZWN0KS5oYXNDaGlsZE5vZGVzKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFbGVtZW50cyhPYmplY3QgZWxlbWVudCwgQXJyYXlMaXN0IHYpIHsKLQotCQlJQ1NTTm9kZSBub2RlOwotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQlJQ1NTTW9kZWwgbW9kZWwgPSAoSUNTU01vZGVsKSBlbGVtZW50OwotCQkJSUNTU0RvY3VtZW50IGRvYyA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQlub2RlID0gZG9jLmdldEZpcnN0Q2hpbGQoKTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCW5vZGUgPSAoKElDU1NOb2RlKSBlbGVtZW50KS5nZXRGaXJzdENoaWxkKCk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuOwotCi0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUnVsZSkgewotCQkJCXYuYWRkKG5vZGUpOwotCQkJfQotCi0JCQlub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNZWRpYVRleHQoQ1NTUnVsZSBydWxlKSB7Ci0JCVN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlJQ1NTTm9kZSBjaGlsZCA9IChydWxlICE9IG51bGwpID8gKChJQ1NTTm9kZSkgcnVsZSkuZ2V0Rmlyc3RDaGlsZCgpIDogbnVsbDsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB7Ci0JCQkJcmVzdWx0ID0gKChNZWRpYUxpc3QpIGNoaWxkKS5nZXRNZWRpYVRleHQoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4N2U4ZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlDU1MgZXh0ZW5kcyBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0JcHVibGljIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTKCkgewotCQl0aGlzKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlDU1MoT2JqZWN0IGFkYXB0ZXJLZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIG5vZGUpIHsKLQkJaWYgKHNpbmdsZXRvbkFkYXB0ZXIgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIHRoZSBKRmFjZU5vZGVBZGFwdGVyCi0JCQlzaW5nbGV0b25BZGFwdGVyID0gbmV3IENTU05vZGVBZGFwdGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBzaW5nbGV0b25BZGFwdGVyOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzE1NWYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuQ29tYm9MaXN0OwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFRoaXMgY2xhc3Mgb25seSBjb250YWlucyBoZWxwZXIgbWV0aG9kcyB0aGF0IHlvdSBzaG91bGQKLSAqICAgICAgICAgICAgIGFjdHVhbGx5IGltcGxlbWVudCB5b3Vyc2VsZi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORSA9IENTU1VJTWVzc2FnZXMuVUlfbm9uZTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDU1NNZXRhTW9kZWxSZWdpc3RyeUludG8oQ29tYm9MaXN0IGNvbWJvKSB7Ci0JCWNvbWJvLmFkZChOT05FLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJQ1NTUHJvZmlsZVJlZ2lzdHJ5IHJlZyA9IENTU1Byb2ZpbGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlJdGVyYXRvciBpID0gcmVnLmdldFByb2ZpbGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTUHJvZmlsZSBwcm9maWxlID0gKENTU1Byb2ZpbGUpIGkubmV4dCgpOwotCQkJU3RyaW5nIGlkID0gcHJvZmlsZS5nZXRQcm9maWxlSUQoKTsKLQkJCVN0cmluZyBuYW1lID0gcHJvZmlsZS5nZXRQcm9maWxlTmFtZSgpOwotCQkJY29tYm8uYWRkKG5hbWUsIGlkKTsKLQkJfQotCQljb21iby5zb3J0QnlLZXkoMSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZjBmMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkNvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLklDb250ZW50U2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5Db21ib0xpc3RPblByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpLkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBVc2UgQ1NTV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGluc3RlYWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBleHRlbmRzIENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSB7Ci0KLQlwcml2YXRlIGZpbmFsIGludCBOX0NTU19QUk9GSUxFID0gMDsKLQotCi0KLQlwdWJsaWMgQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlKCkgewotCQlzdXBlcigpOwotCQludW1iZXJPZkNvbWJvID0gMTsKLQkJbnVtQ29scyA9IDI7Ci0JCW51bVJvd3MgPSAxOwotCQljb21ibyA9IG5ldyBDb21ib0xpc3RPblByb3BlcnR5UGFnZVtzdXBlci5udW1iZXJPZkNvbWJvXTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNTU0NvbWJvQm94KCkgewotCQlzdXBlci5jb21ib1tOX0NTU19QUk9GSUxFXSA9IHN1cGVyLmNyZWF0ZUNvbWJvQm94T2YoQ1NTX0xBQkVMKTsKLQkJQ29udGVudFNldHRpbmdzUmVnaXN0cnkuc2V0Q1NTTWV0YU1vZGVsUmVnaXN0cnlJbnRvKGNvbWJvW05fQ1NTX1BST0ZJTEVdKTsKLQkJaWYgKGNvbWJvW05fQ1NTX1BST0ZJTEVdLmdldEl0ZW1Db3VudCgpIDw9IDApCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBpbml0VmFsdWUgPSBjb250ZW50U2V0dGluZ3MuZ2V0UHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkNTU19QUk9GSUxFKTsKLQkJLy8gd2hlbiBlaXRoZXIgLmNvbnRlbnRzZXR0aW5ncyBvciBlbGVtZW50IGRvZXNuJ3QgZXhpc3QKLQkJLy8gd2hlbiBhdHRyaWJ1dGUgZG9lc24ndCBleGlzdHMsZ2V0UHJvcGVydHkgcmV0dXJucyBlbXB0eSBzdHJpbmcuCi0JCWlmIChpbml0VmFsdWUgPT0gbnVsbCkKLQkJCWluaXRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vIHNldCBpbml0IHNlbGVjdGlvbkl0ZW0gaW4gQ29tYm8KLQkJc3VwZXIuc2V0U2VsZWN0aW9uSXRlbShjb21ib1tOX0NTU19QUk9GSUxFXSwgaW5pdFZhbHVlKTsKLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU2V0dGluZ3NQYWdlR1VJKCkgewotCi0JCWludCB0eXBlID0gKChJUmVzb3VyY2UpIGdldEVsZW1lbnQoKSkuZ2V0VHlwZSgpOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJCS8vY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHByb3BlcnR5UGFnZSxudW1Db2xzLG51bVJvd3MpOwotCQkJCWNyZWF0ZUNTU0NvbWJvQm94KCk7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcm9wZXJ0eVBhZ2UsIElIZWxwQ29udGV4dElkcy5DU1NfQ09OVEVOVF9TRVRUSU5HU19IRUxQSUQpOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0IDoKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGlzIGluc3RhbnRpYXRlZCBieSByZXNvdXJjZSBleGNlcHQgRklMRSIpOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJfQotCi0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBwdXRTZWxlY3RlZFByb3BlcnR5SW50byhNYXAgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlSW5Db21ibywgaW50IGluZGV4KSB7Ci0KLQkJc3dpdGNoIChpbmRleCkgewotCQkJY2FzZSBOX0NTU19QUk9GSUxFIDoKLQkJCQkvLyBjc3MKLQkJCQlwcm9wZXJ0aWVzLnB1dChJQ29udGVudFNldHRpbmdzLkNTU19QUk9GSUxFLCB2YWx1ZUluQ29tYm8pOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbmRleCBpcyBvdXQgb2YgcmFuZ2UgaW4gcHV0U2VsZWN0ZWRQcm9wZXJ0eUludG8oKSBpbiBjbGFzcyBDU1NDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UiKTsvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZU5vbmVQcm9wZXJ0eShpbnQgaW5kZXgpIHsKLQkJc3dpdGNoIChpbmRleCkgewotCQkJY2FzZSBOX0NTU19QUk9GSUxFIDoKLQkJCQkvLyBjc3MKLQkJCQljb250ZW50U2V0dGluZ3MuZGVsZXRlUHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkNTU19QUk9GSUxFKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdCA6Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbmRleCBpcyBvdXQgb2YgcmFuZ2UgaW4gZGVsZXRlTm9uZVByb3BlcnR5KCkgaW4gY2xhc3MgQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIik7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9DU1NXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9DU1NXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UxZGZmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ1NTV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgRGF2aWQgU2NobmVpZGVyLCBkYXZpZC5zY2huZWlkZXJAdW5pc3lzLmNvbSAtIFsxNDI1MDBdIFdUUCBwcm9wZXJ0aWVzIHBhZ2VzIGZvbnRzIGRvbid0IGZvbGxvdyBFY2xpcHNlIHByZWZlcmVuY2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuQ1NTQ29udGVudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDU1NXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfTk9ORSA9IENTU1VJTWVzc2FnZXMuVUlfbm9uZTsKLQotCXByaXZhdGUgQ29tYm8gZlByb2ZpbGVDb21ibzsKLQlwcml2YXRlIExpc3QgZlByb2ZpbGVJZHM7Ci0KLQlwdWJsaWMgQ1NTV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlKCkgewotCQlzdXBlcigpOwotCQlzZXREZXNjcmlwdGlvbihDU1NVSU1lc3NhZ2VzLkNTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHByb3BlcnR5UGFnZSA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDIpOwotCi0JCS8vIENTUyBQcm9maWxlIGNvbnRyb2wKLQkJVGV4dCBsYW5ndWFnZUxhYmVsID0gbmV3IFRleHQocHJvcGVydHlQYWdlLCBTV1QuUkVBRF9PTkxZKTsKLQkJbGFuZ3VhZ2VMYWJlbC5zZXRUZXh0KENTU1VJTWVzc2FnZXMuQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzEpOwotCQlmUHJvZmlsZUNvbWJvID0gbmV3IENvbWJvKHByb3BlcnR5UGFnZSwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlmUHJvZmlsZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcG9wdWxhdGVWYWx1ZXMoKTsKLQkJaW5pdGlhbGl6ZVZhbHVlcygpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocHJvcGVydHlQYWdlLCBJSGVscENvbnRleHRJZHMuQ1NTX0NPTlRFTlRfU0VUVElOR1NfSEVMUElEKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlyZXR1cm4gcHJvcGVydHlQYWdlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcmVzb3VyY2UgdGhpcyBwcm9wZXJ0aWVzIHBhZ2UgaXMgZm9yCi0JICogCi0JICogQHJldHVybiBJUmVzb3VyY2UgZm9yIHRoaXMgcHJvcGVydGllcyBwYWdlIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8KLQkgKiAgICAgICAgIElSZXNvdXJjZQotCSAqLwotCXByaXZhdGUgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIGdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWludCBpbmRleCA9IDA7Ci0JCVN0cmluZyBwcm9maWxlID0gQ1NTQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoQ1NTQ29udGVudFByb3BlcnRpZXMuQ1NTX1BST0ZJTEUsIGdldFJlc291cmNlKCksIGZhbHNlKTsKLQkJaWYgKHByb2ZpbGUgIT0gbnVsbCAmJiBwcm9maWxlLmxlbmd0aCgpID4gMCkgewotCQkJLyoKLQkJCSAqIElmIGl0ZW0gaXMgYWxyZWFkeSBwYXJ0IG9mIGNvbWJvLCBzZWxlY3QgaXQuIE90aGVyd2lzZSwgc2VsZWN0Ci0JCQkgKiBub25lLgotCQkJICovCi0JCQlpbmRleCA9IGZQcm9maWxlSWRzLmluZGV4T2YocHJvZmlsZSk7Ci0JCX0KLQkJaW5kZXggPSBpbmRleCA+PSAwID8gaW5kZXggOiAwOwotCQlmUHJvZmlsZUNvbWJvLnNlbGVjdChpbmRleCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVmFsdWVzKCkgewotCQlmUHJvZmlsZUlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gYWRkIG5vbmUgZmlyc3QKLQkJZlByb2ZpbGVDb21iby5hZGQoU0VMRUNUX05PTkUpOwotCQlmUHJvZmlsZUlkcy5hZGQobnVsbCk7Ci0KLQkJQ1NTUHJvZmlsZVJlZ2lzdHJ5IHJlZyA9IENTU1Byb2ZpbGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlJdGVyYXRvciBpID0gcmVnLmdldFByb2ZpbGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTUHJvZmlsZSBwcm9maWxlID0gKENTU1Byb2ZpbGUpIGkubmV4dCgpOwotCQkJU3RyaW5nIGlkID0gcHJvZmlsZS5nZXRQcm9maWxlSUQoKTsKLQkJCVN0cmluZyBuYW1lID0gcHJvZmlsZS5nZXRQcm9maWxlTmFtZSgpOwotCQkJZlByb2ZpbGVDb21iby5hZGQobmFtZSk7Ci0JCQlmUHJvZmlsZUlkcy5hZGQoaWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlpbnQgaW5kZXggPSBmUHJvZmlsZUNvbWJvLmluZGV4T2YoU0VMRUNUX05PTkUpOwotCQlpZiAoaW5kZXggPiAtMSkKLQkJCWZQcm9maWxlQ29tYm8uc2VsZWN0KGluZGV4KTsKLQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWludCBpbmRleCA9IGZQcm9maWxlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGluZGV4ID4gLTEpIHsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGZQcm9maWxlSWRzLmdldChpbmRleCk7Ci0JCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwIHx8IGlkLmVxdWFsc0lnbm9yZUNhc2UoU0VMRUNUX05PTkUpKSB7Ci0JCQkJLy8gaWYgbm9uZSwgdXNlIG51bGwKLQkJCQlpZCA9IG51bGw7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCUNTU0NvbnRlbnRQcm9wZXJ0aWVzLnNldFByb3BlcnR5KENTU0NvbnRlbnRQcm9wZXJ0aWVzLkNTU19QUk9GSUxFLCBnZXRSZXNvdXJjZSgpLCBpZCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbWF5YmUgaW4gZnV0dXJlLCBsZXQgdXNlciBrbm93IHRoZXJlIHdhcyBhIHByb2JsZW0gc2F2aW5nCi0JCQkJLy8gZmlsZQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cEFjdGlvbkNTU0RlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwQWN0aW9uQ1NTRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyZDZkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwQWN0aW9uQ1NTRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DbGVhbnVwUHJvY2Vzc29yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotCi0vKioKLSAqIENsZWFudXAgYWN0aW9uIGRlbGVnYXRlIGZvciBDU1MgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGVhbnVwQWN0aW9uQ1NTRGVsZWdhdGUgaW1wbGVtZW50cyBJRWRpdG9yQWN0aW9uRGVsZWdhdGUsIElBY3Rpb25EZWxlZ2F0ZTIsIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgSUVkaXRvclBhcnQgZkVkaXRvcjsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBmQ2xlYW51cFByb2Nlc3NvcjsKLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJQWN0aW9uIGFjdGlvbiwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCWZFZGl0b3IgPSB0YXJnZXRFZGl0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbnVsbGluZyBvdXQganVzdCBpbiBjYXNlCi0JCWZFZGl0b3IgPSBudWxsOwotCQlmQ2xlYW51cFByb2Nlc3NvciA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KENTU1VJTWVzc2FnZXMuQ2xlYW51cERvY3VtZW50X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChDU1NVSU1lc3NhZ2VzLkNsZWFudXBEb2N1bWVudF90b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihDU1NVSU1lc3NhZ2VzLkNsZWFudXBEb2N1bWVudF9kZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bihhY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoZkVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQlmaW5hbCBJVGV4dEVkaXRvciBlZGl0b3IgPSAoSVRleHRFZGl0b3IpIGZFZGl0b3I7Ci0JCQlEaWFsb2cgY2xlYW51cERpYWxvZyA9IG5ldyBDbGVhbnVwRGlhbG9nQ1NTKGVkaXRvci5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQlpZiAoY2xlYW51cERpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJLy8gc2V0dXAgcnVubmFibGUKLQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IgPSBnZXRDbGVhbnVwUHJvY2Vzc29yKCk7Ci0JCQkJCQlpZiAoY2xlYW51cFByb2Nlc3NvciAhPSBudWxsKSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCQkJCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJCQkJCQljbGVhbnVwUHJvY2Vzc29yLmNsZWFudXBNb2RlbChtb2RlbCk7Ci0JCQkJCQkJfQotCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0KLQkJCQkvLyBUT0RPOiBtYWtlIGluZGVwZW5kZW50IG9mICdtb2RlbCcuCi0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCS8vIGJlZ2luIHJlY29yZGluZwotCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFNTRVVJTWVzc2FnZXMuQ2xlYW51cF9Eb2N1bWVudF9VSV8sIFNTRVVJTWVzc2FnZXMuQ2xlYW51cF9Eb2N1bWVudF9VSV8sIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcKLQkJCQkJCS8vIG1vZGVsIGNoYW5nZQotCQkJCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQkJCS8vIHJ1bgotCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZkVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIHJ1bm5hYmxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnCi0JCQkJCQkvLyBtb2RlbAotCQkJCQkJLy8gY2hhbmdlCi0JCQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQotCQkJCQkJLy8gZW5kIHJlY29yZGluZwotCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCW1vZGVsLmVuZFJlY29yZGluZyh0aGlzLCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZ2V0Q2xlYW51cFByb2Nlc3NvcigpIHsKLQkJaWYgKGZDbGVhbnVwUHJvY2Vzc29yID09IG51bGwpCi0JCQlmQ2xlYW51cFByb2Nlc3NvciA9IG5ldyBDbGVhbnVwUHJvY2Vzc29yQ1NTKCk7Ci0KLQkJcmV0dXJuIGZDbGVhbnVwUHJvY2Vzc29yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9lZGl0L3VpL0NsZWFudXBEaWFsb2dDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9lZGl0L3VpL0NsZWFudXBEaWFsb2dDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMwMDdhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwRGlhbG9nQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhbnVwRGlhbG9nQ1NTIGV4dGVuZHMgRGlhbG9nIHsKLQotCXByaXZhdGUgYm9vbGVhbiBlbWJlZGRlZENTUzsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbklkZW50Q2FzZUFzaXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25JZGVudENhc2VMb3dlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbklkZW50Q2FzZVVwcGVyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlQXNpczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZUxvd2VyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlVXBwZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlQXNpczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VMb3dlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VVcHBlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblNlbGVjdG9yVGFnQ2FzZUFzaXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VMb3dlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblNlbGVjdG9yVGFnQ2FzZVVwcGVyOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94UXVvdGVWYWx1ZXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hGb3JtYXRTb3VyY2U7Ci0KLQkvKioKLQkgKiBDU1NDbGVhbnVwRGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbAotCSAqLwotCXB1YmxpYyBDbGVhbnVwRGlhbG9nQ1NTKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKGlzRW1iZWRkZWRDU1MoKSkKLQkJCWdldFNoZWxsKCkuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkNTU19DbGVhbnVwX1VJXyk7Ci0JCWVsc2UKLQkJCWdldFNoZWxsKCkuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkNsZWFudXBfVUlfKTsKLQotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JCXBhbmVsLnNldExheW91dChsYXlvdXQpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFuZWwsIElIZWxwQ29udGV4dElkcy5DU1NfQ0xFQU5VUF9IRUxQSUQpOwotCi0JCS8vIENvbnZlcnQgaWRlbnQgY2FzZQotCQkvLyBBQ0M6IEdyb3VwIHJhZGlvIGJ1dHRvbnMgdG9nZXRoZXIgc28gYXNzb2NpYXRlZCBsYWJlbCBpcyByZWFkCi0JCS8vCQlMYWJlbCBpZGVudENhc2VMYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5VTEwpOwotCQkvLwkJaWRlbnRDYXNlTGFiZWwuc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJJZGVudGlmaWVyX2Nhc2VfX1VJXyIpKTsKLQkJLy8gLy8kTk9OLU5MUy0xJCA9ICJJZGVudGlmaWVyIGNhc2U6IgotCQkvLwkJQ2FudmFzIGlkZW50Q2FzZSA9IG5ldyBDYW52YXMocGFuZWwsIFNXVC5OVUxMKTsKLQkJR3JvdXAgaWRlbnRDYXNlID0gbmV3IEdyb3VwKHBhbmVsLCBTV1QuTlVMTCk7Ci0JCWlkZW50Q2FzZS5zZXRUZXh0KENTU1VJTWVzc2FnZXMuSWRlbnRpZmllcl9jYXNlX19VSV8pOwotCQlHcmlkTGF5b3V0IGhMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQloTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlpZGVudENhc2Uuc2V0TGF5b3V0KGhMYXlvdXQpOwotCQlmUmFkaW9CdXR0b25JZGVudENhc2VBc2lzID0gbmV3IEJ1dHRvbihpZGVudENhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbklkZW50Q2FzZUFzaXMuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkFzX2lzX1VJXyk7Ci0JCWZSYWRpb0J1dHRvbklkZW50Q2FzZUxvd2VyID0gbmV3IEJ1dHRvbihpZGVudENhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbklkZW50Q2FzZUxvd2VyLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5Mb3dlcl9VSV8pOwotCQlmUmFkaW9CdXR0b25JZGVudENhc2VVcHBlciA9IG5ldyBCdXR0b24oaWRlbnRDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25JZGVudENhc2VVcHBlci5zZXRUZXh0KENTU1VJTWVzc2FnZXMuVXBwZXJfVUlfKTsKLQotCQkvLyBDb252ZXJ0IHByb3BlcnR5IG5hbWUgY2FzZQotCQkvLyBBQ0M6IEdyb3VwIHJhZGlvIGJ1dHRvbnMgdG9nZXRoZXIgc28gYXNzb2NpYXRlZCBsYWJlbCBpcyByZWFkCi0JCS8vCQlMYWJlbCBwcm9wTmFtZUNhc2VMYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5VTEwpOwotCQkvLwkJcHJvcE5hbWVDYXNlTGFiZWwuc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJQcm9wZXJ0eV9uYW1lX2Nhc2VfX1VJXyIpKTsKLQkJLy8gLy8kTk9OLU5MUy0xJCA9ICJQcm9wZXJ0eSBuYW1lIGNhc2U6IgotCQkvLwkJQ2FudmFzIHByb3BOYW1lQ2FzZSA9IG5ldyBDYW52YXMocGFuZWwsIFNXVC5OVUxMKTsKLQkJR3JvdXAgcHJvcE5hbWVDYXNlID0gbmV3IEdyb3VwKHBhbmVsLCBTV1QuTlVMTCk7Ci0JCXByb3BOYW1lQ2FzZS5zZXRUZXh0KENTU1VJTWVzc2FnZXMuUHJvcGVydHlfbmFtZV9jYXNlX19VSV8pOwotCQloTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJaExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJcHJvcE5hbWVDYXNlLnNldExheW91dChoTGF5b3V0KTsKLQkJZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlQXNpcyA9IG5ldyBCdXR0b24ocHJvcE5hbWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25Qcm9wTmFtZUNhc2VBc2lzLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5Bc19pc19VSV8pOwotCQlmUmFkaW9CdXR0b25Qcm9wTmFtZUNhc2VMb3dlciA9IG5ldyBCdXR0b24ocHJvcE5hbWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25Qcm9wTmFtZUNhc2VMb3dlci5zZXRUZXh0KENTU1VJTWVzc2FnZXMuTG93ZXJfVUlfKTsKLQkJZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlVXBwZXIgPSBuZXcgQnV0dG9uKHByb3BOYW1lQ2FzZSwgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlVXBwZXIuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlVwcGVyX1VJXyk7Ci0KLQkJLy8gQ29udmVydCBwcm9wZXJ0eSBWYWx1ZSBjYXNlCi0JCS8vIEFDQzogR3JvdXAgcmFkaW8gYnV0dG9ucyB0b2dldGhlciBzbyBhc3NvY2lhdGVkIGxhYmVsIGlzIHJlYWQKLQkJLy8JCUxhYmVsIHByb3BWYWx1ZUNhc2VMYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5VTEwpOwotCQkvLwkJcHJvcFZhbHVlQ2FzZUxhYmVsLnNldFRleHQoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUHJvcGVydHlfdmFsdWVfY2FzZV9fVUlfIikpOwotCQkvLyAvLyROT04tTkxTLTEkID0gIlByb3BlcnR5IHZhbHVlIGNhc2U6IgotCQkvLwkJQ2FudmFzIHByb3BWYWx1ZUNhc2UgPSBuZXcgQ2FudmFzKHBhbmVsLCBTV1QuTlVMTCk7Ci0JCUdyb3VwIHByb3BWYWx1ZUNhc2UgPSBuZXcgR3JvdXAocGFuZWwsIFNXVC5OVUxMKTsKLQkJcHJvcFZhbHVlQ2FzZS5zZXRUZXh0KENTU1VJTWVzc2FnZXMuUHJvcGVydHlfdmFsdWVfY2FzZV9fVUlfKTsKLQkJaExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWhMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCXByb3BWYWx1ZUNhc2Uuc2V0TGF5b3V0KGhMYXlvdXQpOwotCQlmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlQXNpcyA9IG5ldyBCdXR0b24ocHJvcFZhbHVlQ2FzZSwgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZUFzaXMuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkFzX2lzX1VJXyk7Ci0JCWZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VMb3dlciA9IG5ldyBCdXR0b24ocHJvcFZhbHVlQ2FzZSwgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZUxvd2VyLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5Mb3dlcl9VSV8pOwotCQlmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlVXBwZXIgPSBuZXcgQnV0dG9uKHByb3BWYWx1ZUNhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VVcHBlci5zZXRUZXh0KENTU1VJTWVzc2FnZXMuVXBwZXJfVUlfKTsKLQotCQlpZiAoIWlzRW1iZWRkZWRDU1MoKSkgewotCQkJLy8gQ29udmVydCBzZWxlY3RvciB0YWcgY2FzZQotCQkJLy8gQUNDOiBHcm91cCByYWRpbyBidXR0b25zIHRvZ2V0aGVyIHNvIGFzc29jaWF0ZWQgbGFiZWwgaXMgcmVhZAotCQkJLy8JCQlMYWJlbCBzZWxlY3RvclRhZ0Nhc2VMYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5VTEwpOwotCQkJLy8JCQlzZWxlY3RvclRhZ0Nhc2VMYWJlbC5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNlbGVjdG9yX3RhZ19uYW1lX2Nhc2VfX1VJXyIpKTsKLQkJCS8vIC8vJE5PTi1OTFMtMSQgPSAiU2VsZWN0b3IgdGFnIG5hbWUgY2FzZToiCi0JCQkvLwkJCUNhbnZhcyBzZWxlY3RvclRhZ0Nhc2UgPSBuZXcgQ2FudmFzKHBhbmVsLCBTV1QuTlVMTCk7Ci0JCQlHcm91cCBzZWxlY3RvclRhZ0Nhc2UgPSBuZXcgR3JvdXAocGFuZWwsIFNXVC5OVUxMKTsKLQkJCXNlbGVjdG9yVGFnQ2FzZS5zZXRUZXh0KENTU1VJTWVzc2FnZXMuU2VsZWN0b3JfdGFnX25hbWVfY2FzZV9fVUlfKTsKLQkJCWhMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJaExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJCXNlbGVjdG9yVGFnQ2FzZS5zZXRMYXlvdXQoaExheW91dCk7Ci0JCQlmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VBc2lzID0gbmV3IEJ1dHRvbihzZWxlY3RvclRhZ0Nhc2UsIFNXVC5SQURJTyk7Ci0JCQlmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VBc2lzLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5Bc19pc19VSV8pOwotCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlTG93ZXIgPSBuZXcgQnV0dG9uKHNlbGVjdG9yVGFnQ2FzZSwgU1dULlJBRElPKTsKLQkJCWZSYWRpb0J1dHRvblNlbGVjdG9yVGFnQ2FzZUxvd2VyLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5Mb3dlcl9VSV8pOwotCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlVXBwZXIgPSBuZXcgQnV0dG9uKHNlbGVjdG9yVGFnQ2FzZSwgU1dULlJBRElPKTsKLQkJCWZSYWRpb0J1dHRvblNlbGVjdG9yVGFnQ2FzZVVwcGVyLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5VcHBlcl9VSV8pOwotCQl9Ci0KLQkJLy8gUXVvdGUgYXR0cmlidXRlIHZhbHVlcwotCQlmQ2hlY2tCb3hRdW90ZVZhbHVlcyA9IG5ldyBCdXR0b24ocGFuZWwsIFNXVC5DSEVDSyk7Ci0JCWZDaGVja0JveFF1b3RlVmFsdWVzLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5RdW90ZV92YWx1ZXNfVUlfKTsKLQotCQlpZiAoIWlzRW1iZWRkZWRDU1MoKSkgewotCQkJLy8gRm9ybWF0IHNvdXJjZQotCQkJZkNoZWNrQm94Rm9ybWF0U291cmNlID0gbmV3IEJ1dHRvbihwYW5lbCwgU1dULkNIRUNLKTsKLQkJCWZDaGVja0JveEZvcm1hdFNvdXJjZS5zZXRUZXh0KENTU1VJTWVzc2FnZXMuRm9ybWF0X3NvdXJjZV9VSV8pOwotCQl9Ci0KLQkJc2V0Q2xlYW51cE9wdGlvbnMoKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1iZWRkZWRDU1MoKSB7Ci0JCXJldHVybiBlbWJlZGRlZENTUzsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQl1cGRhdGVDbGVhbnVwT3B0aW9ucygpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q2xlYW51cE9wdGlvbnMoKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbC5nZXRJbnN0YW5jZSgpOwotCi0JCWlmIChmUmFkaW9CdXR0b25JZGVudENhc2VBc2lzICE9IG51bGwpIHsKLQkJCWlmIChzdGd5LmdldElkZW50Q2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5VUFBFUikKLQkJCQlmUmFkaW9CdXR0b25JZGVudENhc2VVcHBlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlIGlmIChzdGd5LmdldElkZW50Q2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5MT1dFUikKLQkJCQlmUmFkaW9CdXR0b25JZGVudENhc2VMb3dlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlCi0JCQkJZlJhZGlvQnV0dG9uSWRlbnRDYXNlQXNpcy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQotCQlpZiAoZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlQXNpcyAhPSBudWxsKSB7Ci0JCQlpZiAoc3RneS5nZXRQcm9wTmFtZUNhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpCi0JCQkJZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlVXBwZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZSBpZiAoc3RneS5nZXRQcm9wTmFtZUNhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuTE9XRVIpCi0JCQkJZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlTG93ZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZQotCQkJCWZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZUFzaXMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0KLQkJaWYgKGZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VBc2lzICE9IG51bGwpIHsKLQkJCWlmIChzdGd5LmdldFByb3BWYWx1ZUNhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpCi0JCQkJZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZVVwcGVyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWVsc2UgaWYgKHN0Z3kuZ2V0UHJvcFZhbHVlQ2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5MT1dFUikKLQkJCQlmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlTG93ZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZQotCQkJCWZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VBc2lzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCi0JCWlmIChmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VBc2lzICE9IG51bGwpIHsKLQkJCWlmIChzdGd5LmdldFNlbGVjdG9yVGFnQ2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5VUFBFUikKLQkJCQlmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VVcHBlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlIGlmIChzdGd5LmdldFNlbGVjdG9yVGFnQ2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5MT1dFUikKLQkJCQlmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VMb3dlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlCi0JCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlQXNpcy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQotCQlpZiAoZkNoZWNrQm94UXVvdGVWYWx1ZXMgIT0gbnVsbCkKLQkJCWZDaGVja0JveFF1b3RlVmFsdWVzLnNldFNlbGVjdGlvbihzdGd5LmlzUXVvdGVWYWx1ZXMoKSk7Ci0KLQkJaWYgKGZDaGVja0JveEZvcm1hdFNvdXJjZSAhPSBudWxsKQotCQkJZkNoZWNrQm94Rm9ybWF0U291cmNlLnNldFNlbGVjdGlvbihzdGd5LmlzRm9ybWF0U291cmNlKCkpOwotCi0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIAotCSAqIEBwYXJhbSBuZXdFbWJlZGRlZENTUwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVtYmVkZGVkQ1NTKGJvb2xlYW4gbmV3RW1iZWRkZWRDU1MpIHsKLQkJZW1iZWRkZWRDU1MgPSBuZXdFbWJlZGRlZENTUzsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2xlYW51cE9wdGlvbnMoKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbC5nZXRJbnN0YW5jZSgpOwotCi0JCWlmIChmUmFkaW9CdXR0b25JZGVudENhc2VBc2lzICE9IG51bGwpIHsKLQkJCWlmIChmUmFkaW9CdXR0b25JZGVudENhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkKLQkJCQlzdGd5LnNldElkZW50Q2FzZShDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpOwotCQkJZWxzZSBpZiAoZlJhZGlvQnV0dG9uSWRlbnRDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRJZGVudENhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LkxPV0VSKTsKLQkJCWVsc2UKLQkJCQlzdGd5LnNldElkZW50Q2FzZShDU1NDbGVhbnVwU3RyYXRlZ3kuQVNJUyk7Ci0JCX0KLQotCQlpZiAoZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlQXNpcyAhPSBudWxsKSB7Ci0JCQlpZiAoZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRQcm9wTmFtZUNhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LlVQUEVSKTsKLQkJCWVsc2UgaWYgKGZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZUxvd2VyLmdldFNlbGVjdGlvbigpKQotCQkJCXN0Z3kuc2V0UHJvcE5hbWVDYXNlKENTU0NsZWFudXBTdHJhdGVneS5MT1dFUik7Ci0JCQllbHNlCi0JCQkJc3RneS5zZXRQcm9wTmFtZUNhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LkFTSVMpOwotCQl9Ci0KLQkJaWYgKGZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VBc2lzICE9IG51bGwpIHsKLQkJCWlmIChmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRQcm9wVmFsdWVDYXNlKENTU0NsZWFudXBTdHJhdGVneS5VUFBFUik7Ci0JCQllbHNlIGlmIChmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRQcm9wVmFsdWVDYXNlKENTU0NsZWFudXBTdHJhdGVneS5MT1dFUik7Ci0JCQllbHNlCi0JCQkJc3RneS5zZXRQcm9wVmFsdWVDYXNlKENTU0NsZWFudXBTdHJhdGVneS5BU0lTKTsKLQkJfQotCi0JCWlmIChmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VBc2lzICE9IG51bGwpIHsKLQkJCWlmIChmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkKLQkJCQlzdGd5LnNldFNlbGVjdG9yVGFnQ2FzZShDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpOwotCQkJZWxzZSBpZiAoZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRTZWxlY3RvclRhZ0Nhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LkxPV0VSKTsKLQkJCWVsc2UKLQkJCQlzdGd5LnNldFNlbGVjdG9yVGFnQ2FzZShDU1NDbGVhbnVwU3RyYXRlZ3kuQVNJUyk7Ci0JCX0KLQotCQlpZiAoZkNoZWNrQm94UXVvdGVWYWx1ZXMgIT0gbnVsbCkKLQkJCXN0Z3kuc2V0UXVvdGVWYWx1ZXMoZkNoZWNrQm94UXVvdGVWYWx1ZXMuZ2V0U2VsZWN0aW9uKCkpOwotCi0JCWlmIChmQ2hlY2tCb3hGb3JtYXRTb3VyY2UgIT0gbnVsbCkKLQkJCXN0Z3kuc2V0Rm9ybWF0U291cmNlKGZDaGVja0JveEZvcm1hdFNvdXJjZS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJLy8gc2F2ZSB0aGVzZSB2YWx1ZXMgdG8gcHJlZmVyZW5jZXMKLQkJKChDU1NDbGVhbnVwU3RyYXRlZ3lJbXBsKSBzdGd5KS5zYXZlT3B0aW9ucygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9lZGl0b3IvQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdG9yL0NTU0VkaXRvclBsdWdpbkltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTU5ZTk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9lZGl0b3IvQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yOwotCi0KLS8qKgotICogQnVuZGxlIG9mIG1vc3QgaW1hZ2VzIHVzZWQgYnkgdGhlIENTUyBTb3VyY2UgRWRpdG9yIHBsdWctaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NFZGl0b3JQbHVnaW5JbWFnZXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfU09SVCA9ICJpY29ucy9mdWxsL29iajE2L3NvcnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9TVFlMRVNIRUVUID0gImljb25zL2Z1bGwvb2JqMTYvc3R5bGVzaGVldC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9SVUxFX0NIQVJTRVQgPSAiaWNvbnMvZnVsbC9vYmoxNi9jaGFyc2V0X3J1bGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfUlVMRV9GT05URkFDRSA9ICJpY29ucy9mdWxsL29iajE2L2ZvbnRmYWNlX3J1bGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfUlVMRV9JTVBPUlQgPSAiaWNvbnMvZnVsbC9vYmoxNi9saW5rX3J1bGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfUlVMRV9NRURJQSA9ICJpY29ucy9mdWxsL29iajE2L21lZGlhX3J1bGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfUlVMRV9QQUdFID0gImljb25zL2Z1bGwvb2JqMTYvcGFnZV9ydWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1JVTEVfU1RZTEUgPSAiaWNvbnMvZnVsbC9vYmoxNi9zdHlsZV9ydWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1JVTEVfVU5LTk9XTiA9ICJpY29ucy9mdWxsL29iajE2L3Vua25vd25fcnVsZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1NFTEVDVE9SX0NMQVNTID0gImljb25zL2Z1bGwvb2JqMTYvY2xhc3Nfc2VsZWN0b3IuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfU0VMRUNUT1JfSUQgPSAiaWNvbnMvZnVsbC9vYmoxNi9pZF9zZWxlY3Rvci5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9TRUxFQ1RPUl9QU0VVRE8gPSAiaWNvbnMvZnVsbC9vYmoxNi9wc2V1ZG8uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfU0VMRUNUT1JfVEFHID0gImljb25zL2Z1bGwvb2JqMTYvdGFnX3NlbGVjdG9yLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1NFTEVDVE9SX0xJTksgPSAiaWNvbnMvZnVsbC9vYmoxNi9saW5rX3NlbGVjdG9yLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1NFTEVDVE9SX0RFRkFVTFQgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWdfc2VsZWN0b3IuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9WQUxVRV9GVU5DVElPTiA9ICJpY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX2Z1bmN0aW9uLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1ZBTFVFX05VTUJFUiA9ICJpY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX3VuaXQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVkFMVUVfU1RSSU5HID0gImljb25zL2Z1bGwvb2JqMTYvY3NzX3Byb3BlcnR5dmFsdWVfaWRlbnRpZmllci5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NBVEVHT1JZX0FVUkFMID0gImljb25zL2Z1bGwvb2JqMTYvYXVyYWxfcHJvcHMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0FURUdPUllfQk9YID0gImljb25zL2Z1bGwvb2JqMTYvYm94bW9kZWxfcHJvcHMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0FURUdPUllfQ09MT1JBTkRCQUNLR1JPVU5EID0gImljb25zL2Z1bGwvb2JqMTYvY29sYmFja19wcm9wcy5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DQVRFR09SWV9DT05URU5UID0gImljb25zL2Z1bGwvb2JqMTYvY29udGVudF9wcm9wcy5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DQVRFR09SWV9GT05UID0gImljb25zL2Z1bGwvb2JqMTYvZm9udF9wcm9wcy5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DQVRFR09SWV9QQUdFID0gImljb25zL2Z1bGwvb2JqMTYvcGFnZWRtZWRpYV9wcm9wcy5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DQVRFR09SWV9UQUJMRVMgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWJsZV9wcm9wcy5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DQVRFR09SWV9URVhUID0gImljb25zL2Z1bGwvb2JqMTYvdGV4dF9wcm9wcy5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DQVRFR09SWV9VSSA9ICJpY29ucy9mdWxsL29iajE2L3VpX3Byb3BzLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NBVEVHT1JZX1ZJU1VBTCA9ICJpY29ucy9mdWxsL29iajE2L3Zpc3VhbF9wcm9wcy5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DQVRFR09SWV9ERUZBVUxUID0gImljb25zL2Z1bGwvb2JqMTYvb3RoZXJfcHJvcHMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEVNUExBVEUgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctdGVtcGxhdGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19XSVpCQU5fTkVXQ1NTRklMRSA9ICJpY29ucy9mdWxsL3dpemJhbi9uZXdjc3NmaWxlX3dpei5wbmciOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYzYyMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlQbHVnaW47Ci0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIENTUyBTb3VyY2UgRWRpdG9yLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBjb250YWlucyBjb25zdGFudHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlCi0gKiBpbXBsZW1lbnRlZC4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIZWxwQ29udGV4dElkcyB7Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBDU1NVSVBsdWdpbi5JRCArICIuIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gLy8gZmlndXJlZCBvdXQgb24gdGhlIGZseQotCS8vIC8vIENTUyBTb3VyY2UgcGFnZSBlZGl0b3IKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU09VUkNFVklFV19IRUxQSUQgPQotCS8vIENvbnRlbnRUeXBlSWRGb3JDU1MuQ29udGVudFR5cGVJRF9DU1MgKyJfc291cmNlX0hlbHBJZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIENTUyBGaWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfUFJFRldFQlhfRklMRVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDEwIjsgLy8kTk9OLU5MUy0xJAotCS8vIENTUyBTb3VyY2UgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1BSRUZXRUJYX1NPVVJDRV9IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMTEiOyAvLyROT04tTkxTLTEkCi0JLy8gQ1NTIFN0eWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAxMiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBDU1MgVGVtcGxhdGUgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMTMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBDU1MgQ2xlYW51cCBkaWFsb2cKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfQ0xFQU5VUF9IRUxQSUQgPSBQUkVGSVggKyAieG1sbTEzMDAiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBDU1MgQ29udGVudCBTZXR0aW5ncwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19DT05URU5UX1NFVFRJTkdTX0hFTFBJRCA9IFBSRUZJWCArICJtaXNjMDE4MCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBDU1MgTmV3IEZpbGUgV2l6YXJkIC0gVGVtcGxhdGUgUGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEID0gUFJFRklYICsgImNzc3cwMDEwIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2hhbmRsZXJzL0NsZWFudXBEb2N1bWVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9oYW5kbGVycy9DbGVhbnVwRG9jdW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MjNiM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2hhbmRsZXJzL0NsZWFudXBEb2N1bWVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DbGVhbnVwUHJvY2Vzc29yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdC51aS5DbGVhbnVwRGlhbG9nQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhbnVwRG9jdW1lbnRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSUhhbmRsZXIgewotCXByaXZhdGUgSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGZDbGVhbnVwUHJvY2Vzc29yOwotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbnVsbGluZyBvdXQganVzdCBpbiBjYXNlCi0JCWZDbGVhbnVwUHJvY2Vzc29yID0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZUVkaXRvcihldmVudCk7Ci0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yUGFydDsKLQkJZWxzZSB7Ci0JCQlPYmplY3QgbyA9IGVkaXRvclBhcnQuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQlpZiAobyAhPSBudWxsKQotCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIG87Ci0JCX0KLQkJCi0JCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCWZpbmFsIElUZXh0RWRpdG9yIGVkaXRvciA9IHRleHRFZGl0b3I7Ci0JCQlEaWFsb2cgY2xlYW51cERpYWxvZyA9IG5ldyBDbGVhbnVwRGlhbG9nQ1NTKGVkaXRvci5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQlpZiAoY2xlYW51cERpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJLy8gc2V0dXAgcnVubmFibGUKLQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IgPSBnZXRDbGVhbnVwUHJvY2Vzc29yKCk7Ci0JCQkJCQlpZiAoY2xlYW51cFByb2Nlc3NvciAhPSBudWxsKSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCQkJCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJCQkJCQljbGVhbnVwUHJvY2Vzc29yLmNsZWFudXBNb2RlbChtb2RlbCk7Ci0JCQkJCQkJfQotCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0KLQkJCQkvLyBUT0RPOiBtYWtlIGluZGVwZW5kZW50IG9mICdtb2RlbCcuCi0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCS8vIGJlZ2luIHJlY29yZGluZwotCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFNTRVVJTWVzc2FnZXMuQ2xlYW51cF9Eb2N1bWVudF9VSV8sIFNTRVVJTWVzc2FnZXMuQ2xlYW51cF9Eb2N1bWVudF9VSV8sIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcKLQkJCQkJCS8vIG1vZGVsIGNoYW5nZQotCQkJCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQkJCS8vIHJ1bgotCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgcnVubmFibGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBiaWcKLQkJCQkJCS8vIG1vZGVsCi0JCQkJCQkvLyBjaGFuZ2UKLQkJCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCi0JCQkJCQkvLyBlbmQgcmVjb3JkaW5nCi0JCQkJCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMsIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZ2V0Q2xlYW51cFByb2Nlc3NvcigpIHsKLQkJaWYgKGZDbGVhbnVwUHJvY2Vzc29yID09IG51bGwpCi0JCQlmQ2xlYW51cFByb2Nlc3NvciA9IG5ldyBDbGVhbnVwUHJvY2Vzc29yQ1NTKCk7Ci0KLQkJcmV0dXJuIGZDbGVhbnVwUHJvY2Vzc29yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMTk5ODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmhhbmRsZXJzLkFic3RyYWN0U3RydWN0dXJlZFNlbGVjdEhhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nSGFuZGxlciBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZFNlbGVjdEhhbmRsZXIgewotCQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEN1cnNvckluZGV4ZWRSZWdpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0KLQkJaW5kZXhlZFJlZ2lvbiA9IGdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnQsIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCi0JCXJldHVybiBpbmRleGVkUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJSUNTU05vZGUgY3Vyc29yTm9kZSA9IChJQ1NTTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQkJCVJlZ2lvbiBjdXJzb3JOb2RlUmVnaW9uID0gbmV3IFJlZ2lvbihpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJaW50IGN1cnJlbnRPZmZzZXQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpOwotCQkJaW50IGN1cnJlbnRFbmRPZmZzZXQgPSBjdXJyZW50T2Zmc2V0ICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKTsKLQkJCWlmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpID49IGN1cnJlbnRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA8PSBjdXJyZW50RW5kT2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpID49IGN1cnJlbnRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPD0gY3VycmVudEVuZE9mZnNldCkgewotCQkJCUlDU1NOb2RlIG5ld05vZGUgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbihuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIG5ld0luZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCQluZXdSZWdpb24gPSBjdXJzb3JOb2RlUmVnaW9uOwotCQl9Ci0JCXJldHVybiBuZXdSZWdpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3ROZXh0SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3ROZXh0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNjYjI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0TmV4dEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuaGFuZGxlcnMuQWJzdHJhY3RTdHJ1Y3R1cmVkU2VsZWN0SGFuZGxlcjsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3ROZXh0SGFuZGxlciBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZFNlbGVjdEhhbmRsZXIgewotCi0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJaW50IG9mZnNldCA9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpIC0gMTsKLQkJaWYgKG9mZnNldCA8IDApCi0JCQlvZmZzZXQgPSAwOwotCi0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0KLQkJaW5kZXhlZFJlZ2lvbiA9IGdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnQsIG9mZnNldCk7Ci0KLQkJcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0JfQotCi0JcHJvdGVjdGVkIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24oSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uLCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCVJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCi0JCWlmIChpbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCUlDU1NOb2RlIGN1cnNvck5vZGUgPSAoSUNTU05vZGUpIGluZGV4ZWRSZWdpb247Ci0KLQkJCVJlZ2lvbiBjdXJzb3JOb2RlUmVnaW9uID0gbmV3IFJlZ2lvbihpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJaW50IGN1cnJlbnRPZmZzZXQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpOwotCQkJaW50IGN1cnJlbnRFbmRPZmZzZXQgPSBjdXJyZW50T2Zmc2V0ICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKTsKLQkJCWlmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpID49IGN1cnJlbnRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA8PSBjdXJyZW50RW5kT2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpID49IGN1cnJlbnRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPD0gY3VycmVudEVuZE9mZnNldCkgewotCQkJCUlDU1NOb2RlIG5ld05vZGUgPSBjdXJzb3JOb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJaWYgKG5ld05vZGUgPT0gbnVsbCkgewotCQkJCQluZXdOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQkJaWYgKG5ld05vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gbmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKG5ld05vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24oY3VycmVudE9mZnNldCwgbmV3SW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIGN1cnJlbnRPZmZzZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJCW5ld1JlZ2lvbiA9IGN1cnNvck5vZGVSZWdpb247Ci0JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvaGFuZGxlcnMvU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3RQcmV2aW91c0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgyN2E0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvaGFuZGxlcnMvU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oYW5kbGVycy5BYnN0cmFjdFN0cnVjdHVyZWRTZWxlY3RIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzSGFuZGxlciBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZFNlbGVjdEhhbmRsZXIgewotCi0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLQotCQlpbmRleGVkUmVnaW9uID0gZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0KLQkJcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0JfQotCi0JcHJvdGVjdGVkIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24oSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uLCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCVJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQlpZiAoaW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQlJQ1NTTm9kZSBjdXJzb3JOb2RlID0gKElDU1NOb2RlKSBpbmRleGVkUmVnaW9uOwotCi0JCQlSZWdpb24gY3Vyc29yTm9kZVJlZ2lvbiA9IG5ldyBSZWdpb24oaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBpbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCWludCBjdXJyZW50T2Zmc2V0ID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKTsKLQkJCWludCBjdXJyZW50RW5kT2Zmc2V0ID0gY3VycmVudE9mZnNldCArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA+PSBjdXJyZW50T2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPD0gY3VycmVudEVuZE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA+PSBjdXJyZW50T2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpIDw9IGN1cnJlbnRFbmRPZmZzZXQpIHsKLQkJCQlJQ1NTTm9kZSBuZXdOb2RlID0gY3Vyc29yTm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCQlpZiAobmV3Tm9kZSA9PSBudWxsKSB7Ci0JCQkJCW5ld05vZGUgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJCUluZGV4ZWRSZWdpb24gbmV3SW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBuZXdOb2RlOwotCQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbihuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIG5ld0luZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJCUluZGV4ZWRSZWdpb24gbmV3SW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBuZXdOb2RlOwotCQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbihuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGN1cnJlbnRFbmRPZmZzZXQgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJCW5ld1JlZ2lvbiA9IGN1cnNvck5vZGVSZWdpb247Ci0JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvaW1hZ2UvQ1NTSW1hZ2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9pbWFnZS9DU1NJbWFnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDJiZTg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9pbWFnZS9DU1NJbWFnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5DU1NFZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLQotcHVibGljIGNsYXNzIENTU0ltYWdlSGVscGVyIHsKLQlwcml2YXRlIHN0YXRpYyBDU1NJbWFnZUhlbHBlciBmSW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ1NTSW1hZ2VIZWxwZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENTU0ltYWdlSGVscGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIEhhc2hNYXAgZkltYWdlRGVzY1JlZ2lzdHJ5ID0gbnVsbDsJLy8gc2F2ZSBhIGRlc2NyaXB0b3IgZm9yIGVhY2ggaW1hZ2UKLQlwcml2YXRlIE1hcCBmVHlwZU1hcCA9IG51bGw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU0ltYWdlSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgSW1hZ2UgY3JlYXRlSW1hZ2UoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBkZXNjID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENTU1VJUGx1Z2luLklELCByZXNvdXJjZSk7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQotCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQlkZXNjID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCWltYWdlID0gZGVzYy5jcmVhdGVJbWFnZSgpOwotCQl9IGVsc2UgewotCQkJaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHJlc291cmNlLCBpbWFnZSk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZyb20gdGhlIGdpdmVuIGltYWdlRmlsZVBhdGggYW5kIGFkZHMgdGhlCi0JICogaW1hZ2UgZGVzY3JpcHRvciB0byB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgYW4gaW1hZ2UKLQkgKiBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBjcmVhdGVkLCB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvcgotCSAqIGlzIHJldHVybmVkIGJ1dCBub3QgYWRkZWQgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIGltYWdlRmlsZVBhdGgKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvciBpbWFnZSBkZXNjcmlwdG9yIGZvciBpbWFnZUZpbGVQYXRoIG9yIGRlZmF1bHQKLQkgKiAgICAgICAgICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqLwotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZUltYWdlRGVzY3JpcHRvcihTdHJpbmcgaW1hZ2VGaWxlUGF0aCkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENTU1VJUGx1Z2luLklELCBpbWFnZUZpbGVQYXRoKTsKLQkJaWYgKGltYWdlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQlnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLnB1dChpbWFnZUZpbGVQYXRoLCBpbWFnZURlc2NyaXB0b3IpOwotCQl9IGVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJfQotCi0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogYnkgdHlwZQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShDU1NJbWFnZVR5cGUgdHlwZSkgewotCQlpZiAoZlR5cGVNYXAgPT0gbnVsbCkgewotCQkJZlR5cGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5TVFlMRVNIRUVULCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9TVFlMRVNIRUVUKTsKLQotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5SVUxFX0NIQVJTRVQsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1JVTEVfQ0hBUlNFVCk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlJVTEVfRk9OVEZBQ0UsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1JVTEVfRk9OVEZBQ0UpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5SVUxFX0lNUE9SVCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUlVMRV9JTVBPUlQpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5SVUxFX01FRElBLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9SVUxFX01FRElBKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuUlVMRV9QQUdFLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9SVUxFX1BBR0UpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5SVUxFX1NUWUxFLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9SVUxFX1NUWUxFKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuUlVMRV9VTktOT1dOLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9SVUxFX1VOS05PV04pOwotCi0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlNFTEVDVE9SX0NMQVNTLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9TRUxFQ1RPUl9DTEFTUyk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlNFTEVDVE9SX0lELCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9TRUxFQ1RPUl9JRCk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlNFTEVDVE9SX1BTRVVETywgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfU0VMRUNUT1JfUFNFVURPKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuU0VMRUNUT1JfVEFHLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9TRUxFQ1RPUl9UQUcpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5TRUxFQ1RPUl9MSU5LLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9TRUxFQ1RPUl9MSU5LKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuU0VMRUNUT1JfREVGQVVMVCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfU0VMRUNUT1JfREVGQVVMVCk7Ci0KLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuVkFMVUVfRlVOQ1RJT04sIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1ZBTFVFX0ZVTkNUSU9OKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuVkFMVUVfTlVNQkVSLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9WQUxVRV9OVU1CRVIpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5WQUxVRV9TVFJJTkcsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1ZBTFVFX1NUUklORyk7Ci0KLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuQ0FURUdPUllfQVVSQUwsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NBVEVHT1JZX0FVUkFMKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuQ0FURUdPUllfQk9YLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DQVRFR09SWV9CT1gpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5DQVRFR09SWV9DT0xPUkFOREJBQ0tHUk9VTkQsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NBVEVHT1JZX0NPTE9SQU5EQkFDS0dST1VORCk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX0NPTlRFTlQsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NBVEVHT1JZX0NPTlRFTlQpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5DQVRFR09SWV9GT05ULCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DQVRFR09SWV9GT05UKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuQ0FURUdPUllfUEFHRSwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0FURUdPUllfUEFHRSk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX1RBQkxFUywgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0FURUdPUllfVEFCTEVTKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuQ0FURUdPUllfVEVYVCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0FURUdPUllfVEVYVCk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX1VJLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DQVRFR09SWV9VSSk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX1ZJU1VBTCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0FURUdPUllfVklTVUFMKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuQ0FURUdPUllfREVGQVVMVCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0FURUdPUllfREVGQVVMVCk7Ci0JCX0KLQkJcmV0dXJuIGdldEltYWdlKChTdHJpbmcpIGZUeXBlTWFwLmdldCh0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogYnkgcmVsYXRpdmUgcGF0aChmcm9tIGhlcmUpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlCi0JICogZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgdGhlIGltYWdlIGRlc2NyaXB0b3IgY2Fubm90IGJlIHJldHJpZXZlZCwKLQkgKiBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZAotCSAqIGluIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIGltYWdlIGRlc2NyaXB0b3IgdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvciB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2F0ZWQgd2l0aCByZXNvdXJjZSBvcgotCSAqICAgICAgICAgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IgaWYgb25lIGNvdWxkIG5vdCBiZQotCSAqICAgICAgICAgZm91bmQKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0JCU9iamVjdCBvID0gZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAobyA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgYSBkZXNjcmlwdG9yCi0JCQlpbWFnZURlc2NyaXB0b3IgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQl9IGVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gKEltYWdlRGVzY3JpcHRvcikgbzsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSGFzaE1hcCAtIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkgewotCQlpZiAoZkltYWdlRGVzY1JlZ2lzdHJ5ID09IG51bGwpCi0JCQlmSW1hZ2VEZXNjUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZkltYWdlRGVzY1JlZ2lzdHJ5OwotCX0KLQotCXByaXZhdGUgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9pbWFnZS9DU1NJbWFnZVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9pbWFnZS9DU1NJbWFnZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyYmY5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvaW1hZ2UvQ1NTSW1hZ2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2U7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTTWV0YU1vZGVsRmluZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbC5DU1NNZXRhTW9kZWxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2ltcGxlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NDaGFyc2V0UnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NNZWRpYVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1BhZ2VSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZTsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NJbWFnZVR5cGUgewotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZk5hbWU7Ci0KLQlwcml2YXRlIENTU0ltYWdlVHlwZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLmZOYW1lID0gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZk5hbWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgU1RZTEVTSEVFVCA9IG5ldyBDU1NJbWFnZVR5cGUoIlNUWUxFU0hFRVQiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgUlVMRV9DSEFSU0VUID0gbmV3IENTU0ltYWdlVHlwZSgiUlVMRV9DSEFSU0VUIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBSVUxFX0ZPTlRGQUNFID0gbmV3IENTU0ltYWdlVHlwZSgiUlVMRV9GT05URkFDRSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgUlVMRV9JTVBPUlQgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJSVUxFX0lNUE9SVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgUlVMRV9NRURJQSA9IG5ldyBDU1NJbWFnZVR5cGUoIlJVTEVfTUVESUEiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFJVTEVfUEFHRSA9IG5ldyBDU1NJbWFnZVR5cGUoIlJVTEVfUEFHRSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgUlVMRV9TVFlMRSA9IG5ldyBDU1NJbWFnZVR5cGUoIlJVTEVfU1RZTEUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFJVTEVfVU5LTk9XTiA9IG5ldyBDU1NJbWFnZVR5cGUoIlJVTEVfVU5LTk9XTiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBTRUxFQ1RPUl9DTEFTUyA9IG5ldyBDU1NJbWFnZVR5cGUoIlNFTEVDVE9SX0NMQVNTIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBTRUxFQ1RPUl9JRCA9IG5ldyBDU1NJbWFnZVR5cGUoIlNFTEVDVE9SX0lEIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBTRUxFQ1RPUl9ERUZBVUxUID0gbmV3IENTU0ltYWdlVHlwZSgiU0VMRUNUT1JfREVGQVVMVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgU0VMRUNUT1JfUFNFVURPID0gbmV3IENTU0ltYWdlVHlwZSgiU0VMRUNUT1JfUFNFVURPIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBTRUxFQ1RPUl9UQUcgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJTRUxFQ1RPUl9UQUciKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFNFTEVDVE9SX0xJTksgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJTRUxFQ1RPUl9MSU5LIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFZBTFVFX0ZVTkNUSU9OID0gbmV3IENTU0ltYWdlVHlwZSgiVkFMVUVfRlVOQ1RJT04iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFZBTFVFX05VTUJFUiA9IG5ldyBDU1NJbWFnZVR5cGUoIlZBTFVFX05VTUJFUiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgVkFMVUVfU1RSSU5HID0gbmV3IENTU0ltYWdlVHlwZSgiVkFMVUVfU1RSSU5HIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX0FVUkFMID0gbmV3IENTU0ltYWdlVHlwZSgiQ0FURUdPUllfQVVSQUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX0JPWCA9IG5ldyBDU1NJbWFnZVR5cGUoIkNBVEVHT1JZX0JPWCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgQ0FURUdPUllfQ09MT1JBTkRCQUNLR1JPVU5EID0gbmV3IENTU0ltYWdlVHlwZSgiQ0FURUdPUllfQ09MT1JBTkRCQUNLR1JPVU5EIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBDQVRFR09SWV9DT05URU5UID0gbmV3IENTU0ltYWdlVHlwZSgiQ0FURUdPUllfQ09OVEVOVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgQ0FURUdPUllfRk9OVCA9IG5ldyBDU1NJbWFnZVR5cGUoIkNBVEVHT1JZX0ZPTlQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX1BBR0UgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJDQVRFR09SWV9QQUdFIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBDQVRFR09SWV9UQUJMRVMgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJDQVRFR09SWV9UQUJMRVMiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX1RFWFQgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJDQVRFR09SWV9URVhUIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBDQVRFR09SWV9VSSA9IG5ldyBDU1NJbWFnZVR5cGUoIkNBVEVHT1JZX1VJIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBDQVRFR09SWV9WSVNVQUwgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJDQVRFR09SWV9WSVNVQUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX0RFRkFVTFQgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJDQVRFR09SWV9ERUZBVUxUIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGJ5IG5vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENTU0ltYWdlVHlwZSBnZXRJbWFnZVR5cGUoSUNTU05vZGUgbm9kZSkgewotCQlDU1NJbWFnZVR5cGUgaW1hZ2VUeXBlID0gbnVsbDsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NDaGFyc2V0UnVsZSkgewotCQkJaW1hZ2VUeXBlID0gUlVMRV9DSEFSU0VUOwotCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NGb250RmFjZVJ1bGUpIHsKLQkJCWltYWdlVHlwZSA9IFJVTEVfRk9OVEZBQ0U7Ci0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU0ltcG9ydFJ1bGUpIHsKLQkJCWltYWdlVHlwZSA9IFJVTEVfSU1QT1JUOwotCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NNZWRpYVJ1bGUpIHsKLQkJCWltYWdlVHlwZSA9IFJVTEVfTUVESUE7Ci0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU1BhZ2VSdWxlKSB7Ci0JCQlpbWFnZVR5cGUgPSBSVUxFX1BBR0U7Ci0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlUnVsZSkgewotCQkJaW1hZ2VUeXBlID0gZ2V0SW1hZ2VUeXBlKCgoSUNTU1N0eWxlUnVsZSkgbm9kZSkuZ2V0U2VsZWN0b3JzKCkpOwotCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xhcmF0aW9uKSB7Ci0JCQlJQ1NTTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCXJldHVybiBnZXRJbWFnZVR5cGUocGFyZW50KTsKLQkJCX0KLQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pIHsKLQkJCVN0cmluZyBuYW1lID0gKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZSkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCQlJQ1NTRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlJQ1NTTW9kZWwgbW9kZWwgPSAoZG9jICE9IG51bGwpID8gZG9jLmdldE1vZGVsKCkgOiBudWxsOwotCQkJQ1NTTWV0YU1vZGVsRmluZGVyIGZpbmRlciA9IENTU01ldGFNb2RlbEZpbmRlci5nZXRJbnN0YW5jZSgpOwotCQkJQ1NTTWV0YU1vZGVsIG1ldGFNb2RlbCA9IGZpbmRlci5maW5kTWV0YU1vZGVsRm9yKG1vZGVsKTsKLQkJCS8vIGlzIGZvbnQtZmFjZSBydWxlID8KLQkJCUlDU1NOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlKSB7Ci0JCQkJCWltYWdlVHlwZSA9IENTU0ltYWdlVHlwZS5DQVRFR09SWV9GT05UOwotCQkJCX0KLQkJCX0KLQkJCWlmIChpbWFnZVR5cGUgPT0gbnVsbCkgewotCQkJCUNTU01NUHJvcGVydHkgcHJvcCA9IG5ldyBDU1NNZXRhTW9kZWxVdGlsKG1ldGFNb2RlbCkuZ2V0UHJvcGVydHkobmFtZSk7Ci0JCQkJaWYgKHByb3AgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgY2F0ZWdvcnkgPSBwcm9wLmdldEF0dHJpYnV0ZSgiY2F0ZWdvcnkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpbWFnZVR5cGUgPSBnZXRJbWFnZVR5cGUoY2F0ZWdvcnkpOwotCQkJCX0KLQkJCQlpZiAoaW1hZ2VUeXBlID09IG51bGwpIHsKLQkJCQkJaW1hZ2VUeXBlID0gQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX0RFRkFVTFQ7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NWYWx1ZSkgewotCQkJc3dpdGNoICgoKENTU1ZhbHVlKSBub2RlKS5nZXRDc3NWYWx1ZVR5cGUoKSkgewotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX05VTUJFUiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEVSQ0VOVEFHRSA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRU1TIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FWFMgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BYIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19DTSA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTU0gOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QVCA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEMgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RFRyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkFEIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19HUkFEIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NUyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSFogOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0tIWiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRElNRU5TSU9OIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5URUdFUiA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0hBU0ggOgotCQkJCQlpbWFnZVR5cGUgPSBWQUxVRV9OVU1CRVI7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0FUVFIgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPVU5URVIgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JFQ1QgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JHQkNPTE9SIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19VUkkgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19GT1JNQVQgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19MT0NBTCA6Ci0JCQkJCWltYWdlVHlwZSA9IFZBTFVFX0ZVTkNUSU9OOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJaW1hZ2VUeXBlID0gVkFMVUVfU1RSSU5HOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2VUeXBlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ1NTSW1hZ2VUeXBlIGdldEltYWdlVHlwZShJQ1NTU2VsZWN0b3JMaXN0IHNlbGVjdG9yTGlzdCkgewotCQlpZiAoc2VsZWN0b3JMaXN0ID09IG51bGwgfHwgc2VsZWN0b3JMaXN0LmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBTRUxFQ1RPUl9ERUZBVUxUOwotCQl9Ci0JCUNTU0ltYWdlVHlwZSBpbWFnZVR5cGUgPSBudWxsOwotCQlpbnQgblNlbGVjdG9ycyA9IHNlbGVjdG9yTGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuU2VsZWN0b3JzOyBpKyspIHsKLQkJCUNTU0ltYWdlVHlwZSBjYW5kaWRhdGUgPSBnZXRJbWFnZVR5cGUoc2VsZWN0b3JMaXN0LmdldFNlbGVjdG9yKGkpKTsKLQkJCWlmIChpbWFnZVR5cGUgPT0gbnVsbCkgewotCQkJCWltYWdlVHlwZSA9IGNhbmRpZGF0ZTsKLQkJCX0gZWxzZSBpZiAoaW1hZ2VUeXBlICE9IGNhbmRpZGF0ZSkgewotCQkJCWltYWdlVHlwZSA9IG51bGw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKGltYWdlVHlwZSA9PSBudWxsKSA/IFNFTEVDVE9SX0RFRkFVTFQgOiBpbWFnZVR5cGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDU1NJbWFnZVR5cGUgZ2V0SW1hZ2VUeXBlKElDU1NTZWxlY3RvciBzZWxlY3RvcikgewotCQlDU1NJbWFnZVR5cGUgaW1hZ2VUeXBlID0gU0VMRUNUT1JfREVGQVVMVDsKLQkJaWYgKHNlbGVjdG9yID09IG51bGwgfHwgc2VsZWN0b3IuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGltYWdlVHlwZTsKLQkJfQotCQlJQ1NTU2VsZWN0b3JJdGVtIGl0ZW0gPSBzZWxlY3Rvci5nZXRJdGVtKHNlbGVjdG9yLmdldExlbmd0aCgpIC0gMSk7Ci0JCWlmIChpdGVtLmdldEl0ZW1UeXBlKCkgPT0gSUNTU1NlbGVjdG9ySXRlbS5TSU1QTEUpIHsKLQkJCUlDU1NTaW1wbGVTZWxlY3RvciBzcyA9IChJQ1NTU2ltcGxlU2VsZWN0b3IpIGl0ZW07Ci0JCQlpZiAoMCA8IHNzLmdldE51bU9mSURzKCkpIHsKLQkJCQlpbWFnZVR5cGUgPSBTRUxFQ1RPUl9JRDsKLQkJCX0gZWxzZSBpZiAoMCA8IHNzLmdldE51bU9mQ2xhc3NlcygpKSB7Ci0JCQkJaW1hZ2VUeXBlID0gU0VMRUNUT1JfQ0xBU1M7Ci0JCQl9IGVsc2UgaWYgKDAgPCBzcy5nZXROdW1PZlBzZXVkb05hbWVzKCkpIHsKLQkJCQlpbWFnZVR5cGUgPSBTRUxFQ1RPUl9QU0VVRE87Ci0JCQl9IGVsc2UgewotCQkJCWltYWdlVHlwZSA9IFNFTEVDVE9SX1RBRzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2VUeXBlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ1NTSW1hZ2VUeXBlIGdldEltYWdlVHlwZShTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKGZDYXRlZ29yeU1hcCA9PSBudWxsKSB7Ci0JCQlmQ2F0ZWdvcnlNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZkNhdGVnb3J5TWFwLnB1dCgiYXVyYWwiLCBDQVRFR09SWV9BVVJBTCk7IC8vJE5PTi1OTFMtMSQKLQkJCWZDYXRlZ29yeU1hcC5wdXQoImJveCIsIENBVEVHT1JZX0JPWCk7IC8vJE5PTi1OTFMtMSQKLQkJCWZDYXRlZ29yeU1hcC5wdXQoImNvbG9yYW5kYmFja2dyb3VuZCIsIENBVEVHT1JZX0NPTE9SQU5EQkFDS0dST1VORCk7IC8vJE5PTi1OTFMtMSQKLQkJCWZDYXRlZ29yeU1hcC5wdXQoImNvbnRlbnQiLCBDQVRFR09SWV9DT05URU5UKTsgLy8kTk9OLU5MUy0xJAotCQkJZkNhdGVnb3J5TWFwLnB1dCgiZm9udCIsIENBVEVHT1JZX0ZPTlQpOyAvLyROT04tTkxTLTEkCi0JCQlmQ2F0ZWdvcnlNYXAucHV0KCJwYWdlIiwgQ0FURUdPUllfUEFHRSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZDYXRlZ29yeU1hcC5wdXQoInRhYmxlcyIsIENBVEVHT1JZX1RBQkxFUyk7IC8vJE5PTi1OTFMtMSQKLQkJCWZDYXRlZ29yeU1hcC5wdXQoInRleHQiLCBDQVRFR09SWV9URVhUKTsgLy8kTk9OLU5MUy0xJAotCQkJZkNhdGVnb3J5TWFwLnB1dCgidWkiLCBDQVRFR09SWV9VSSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZDYXRlZ29yeU1hcC5wdXQoInZpc3VhbCIsIENBVEVHT1JZX1ZJU1VBTCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlDU1NJbWFnZVR5cGUgaW1hZ2VUeXBlID0gKENTU0ltYWdlVHlwZSkgZkNhdGVnb3J5TWFwLmdldChjYXRlZ29yeSk7Ci0JCXJldHVybiAoaW1hZ2VUeXBlID09IG51bGwpID8gQ0FURUdPUllfREVGQVVMVCA6IGltYWdlVHlwZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXAgZkNhdGVnb3J5TWFwID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9DU1NVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU1VJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NzE0ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU1VJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci0KLS8qKgotICogU2V0cyBkZWZhdWx0IHZhbHVlcyBmb3IgQ1NTIFVJIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NVSVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlDb2xvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRUaGVtZU1hbmFnZXIoKS5nZXRDdXJyZW50VGhlbWUoKS5nZXRDb2xvclJlZ2lzdHJ5KCk7Ci0JCQotCQkvLyBDU1MgU3R5bGUgUHJlZmVyZW5jZXMKLQkJU3RyaW5nIE5PQkFDS0dST1VOREJPTEQgPSAiIHwgbnVsbCB8IGZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgSlVTVElUQUxJQyA9ICIgfCBudWxsIHwgZmFsc2UgfCB0cnVlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3R5bGVWYWx1ZSA9ICJudWxsIiArIE5PQkFDS0dST1VOREJPTEQ7IC8vJE5PTi1OTFMtMSQKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuTk9STUFMLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFLCA2MywgMTI3LCAxMjcpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUsIHN0eWxlVmFsdWUpOwotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SLCA2MywgMTI3LCAxMjcpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNDU1MuTUVESUEsIDQyLCAwLCAyMjUpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuTUVESUEsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCwgNjMsIDk1LCAxOTEpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9OQU1FLCAxMjcsIDAsIDEyNykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9OQU1FLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFLCA0MiwgMCwgMjI1KSArIEpVU1RJVEFMSUM7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFLCBzdHlsZVZhbHVlKTsKLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0NTUy5VUkksIDQyLCAwLCAyMjUpICsgSlVTVElUQUxJQzsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuVVJJLCBzdHlsZVZhbHVlKTsKLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0NTUy5TVFJJTkcsIDQyLCAwLCAyMjUpICsgSlVTVElUQUxJQzsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuU1RSSU5HLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gIm51bGwiICsgTk9CQUNLR1JPVU5EQk9MRDsgLy8kTk9OLU5MUy0xJAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0NTUy5DT0xPTiwgc3R5bGVWYWx1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTUlfQ09MT04sIHN0eWxlVmFsdWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRSwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0NTUy5FUlJPUiwgMTkxLCA2MywgNjMpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuRVJST1IsIHN0eWxlVmFsdWUpOwotCQkKLQkJLy8gc2V0IGRlZmF1bHQgbmV3IGNzcyBmaWxlIHRlbXBsYXRlIHRvIHVzZSBpbiBuZXcgZmlsZSB3aXphcmQKLQkJLyoKLQkJICogTmVlZCB0byBmaW5kIHRlbXBsYXRlIG5hbWUgdGhhdCBnb2VzIHdpdGggZGVmYXVsdCB0ZW1wbGF0ZSBpZCAobmFtZQotCQkgKiBtYXkgY2hhbmdlIGZvciBkaWZmZXJudCBsYW5ndWFnZSkKLQkJICovCi0JCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCkuZmluZFRlbXBsYXRlQnlJZCgib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXMubmV3Y3NzIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpCi0JCQl0ZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoQ1NTVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSwgdGVtcGxhdGVOYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9DU1NVSVByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU1VJUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YWI3ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU1VJUHJlZmVyZW5jZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBrZXlzIGZvciBDU1MgVUkKLSAqLwotcHVibGljIGNsYXNzIENTU1VJUHJlZmVyZW5jZU5hbWVzIHsKLQlwcml2YXRlIENTU1VJUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIGluc3RhbmNlCi0JfQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgY3VzdG9taXplZCB0ZW1wbGF0ZXMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURVNfS0VZID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY3VzdG9tX3RlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBuZXcgQ1NTIGZpbGUgd2l6YXJkLgotCSAqIFRlbXBsYXRlIG5hbWUgaXMgc3RvcmVkIGluc3RlYWQgb2YgdGVtcGxhdGUgaWQgYmVjYXVzZSB1c2VyLWNyZWF0ZWQKLQkgKiB0ZW1wbGF0ZXMgZG8gbm90IGhhdmUgdGVtcGxhdGUgaWRzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSA9ICJuZXdGaWxlVGVtcGxhdGVOYW1lIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU0NvbG9yUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU0NvbG9yUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjYzYmYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NDb2xvclBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RDb2xvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5TdHlsZWRUZXh0Q29sb3JQaWNrZXI7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIENTU0NvbG9yUGFnZSBleHRlbmRzIEFic3RyYWN0Q29sb3JQYWdlIHsKLQotCS8qKgotCSAqIFNldCB1cCBhbGwgdGhlIHN0eWxlIHByZWZlcmVuY2Uga2V5cyBpbiB0aGUgb3ZlcmxheSBzdG9yZQotCSAqLwotCXByb3RlY3RlZCBPdmVybGF5S2V5W10gY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpIHsKLQkJQXJyYXlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUFycmF5TGlzdCBzdHlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWluaXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQkJSXRlcmF0b3IgaSA9IHN0eWxlTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuU1RSSU5HLCAoU3RyaW5nKSBpLm5leHQoKSkpOwotCQl9Ci0KLQkJT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10ga2V5cyA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbb3ZlcmxheUtleXMuc2l6ZSgpXTsKLQkJb3ZlcmxheUtleXMudG9BcnJheShrZXlzKTsKLQkJcmV0dXJuIGtleXM7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFnZUNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEpOwotCQkoKEdyaWREYXRhKSBwYWdlQ29tcG9uZW50LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTDsKLQotCQlzdXBlci5jcmVhdGVDb250ZW50cyhwYWdlQ29tcG9uZW50KTsKLQotCQkvLyBhc3NpZ25pbmcgb25lIGhlbHAgZm9yIHdob2xlIGdyb3VwCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFnZUNvbXBvbmVudCwgSUhlbHBDb250ZXh0SWRzLkNTU19QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQotCQlyZXR1cm4gcGFnZUNvbXBvbmVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUNvbG9yaW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbG9yaW5nQ29tcG9zaXRlID0gc3VwZXIuY3JlYXRlQ29sb3JpbmdDb21wb3NpdGUocGFyZW50KTsKLQotCQkvLyBhc3NpZ25pbmcgb25lIGhlbHAgZm9yIHdob2xlIGdyb3VwCi0JCXJldHVybiBjb2xvcmluZ0NvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRTYW1wbGVUZXh0IG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2FtcGxlVGV4dCgpIHsKLQkJcmV0dXJuIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvclNhbXBsZTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0U3R5bGVNYXAKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5EaWN0aW9uYXJ5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRleHRTdHlsZU1hcChEaWN0aW9uYXJ5IGNvbnRleHRTdHlsZU1hcCkgewotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5ULCBJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NETywgSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19DREMsIElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5UKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfUywgSVN0eWxlQ29uc3RhbnRzQ1NTLk5PUk1BTCk7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSLCBJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkNVUkxZX0JSQUNFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFLCBJU3R5bGVDb25zdGFudHNDU1MuQ1VSTFlfQlJBQ0UpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEsIElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPTlRfRkFDRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQVRLRVlXT1JELCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORywgSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORyk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VSSSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlVSSSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElVTSwgSVN0eWxlQ29uc3RhbnRzQ1NTLk1FRElBKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUFfU0VQQVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NIQVJTRVRfTkFNRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORyk7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRV9TRUxFQ1RPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLk1FRElBKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUUsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfUFNFVURPLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DTEFTUywgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfSUQsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ09NQklOQVRPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfU0VQQVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRElNRU5TSU9OLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkksIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0UsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTE9OKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSLCBJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTik7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTiwgSVN0eWxlQ29uc3RhbnRzQ1NTLkVSUk9SKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb25zCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuRGljdGlvbmFyeQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXREZXNjcmlwdGlvbnMoRGljdGlvbmFyeSBkZXNjcmlwdGlvbnMpIHsKLQkJLy8gY3JlYXRlIGRlc2NyaXB0aW9ucyBmb3IgaGlsaWdodGluZyB0eXBlcwotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0NTUy5OT1JNQUwsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvck5vcm1hbCk7Ly8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yQXRtYXJrUnVsZSk7Ly8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUiwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yU2VsZWN0b3IpOy8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNDU1MuTUVESUEsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvck1lZGlhKTsvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvckNvbW1lbnQpOy8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfTkFNRSwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yUHJvcGVydHlOYW1lKTsvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JQcm9wZXJ0eVZhbHVlKTsvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLlVSSSwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yVXJpKTsvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORywgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yU3RyaW5nKTsvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTE9OLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JDb2xvbik7Ly8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0NTUy5TRU1JX0NPTE9OLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JTZW1pQ29sb24pOy8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNDU1MuQ1VSTFlfQlJBQ0UsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvckN1cmx5QnJhY2UpOy8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNDU1MuRVJST1IsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvckVycm9yKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGxpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0U3R5bGVMaXN0KEFycmF5TGlzdCBsaXN0KSB7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5OT1JNQUwpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9OQU1FKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLlVSSSk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5TVFJJTkcpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNDU1MuQ09MT04pOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTik7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRSk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5FUlJPUik7Ci0JfQotCi0JLyoqCi0JICogc2V0dXBQaWNrZXIgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBQaWNrZXIoU3R5bGVkVGV4dENvbG9yUGlja2VyIHBpY2tlcikgewotCQlJTW9kZWxNYW5hZ2VyIG1tYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJcGlja2VyLnNldFBhcnNlcihtbWFuYWdlci5jcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUykuZ2V0UGFyc2VyKCkpOwotCi0JCURpY3Rpb25hcnkgZGVzY3JpcHRpb25zID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpbml0RGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0KLQkJRGljdGlvbmFyeSBjb250ZXh0U3R5bGVNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWluaXRDb250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQotCQlBcnJheUxpc3Qgc3R5bGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbml0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0KLQkJcGlja2VyLnNldENvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCQlwaWNrZXIuc2V0RGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0JCXBpY2tlci5zZXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdENvbG9yUGFnZSNzYXZlUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVQcmVmZXJlbmNlcygpIHsKLQkJQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ1NTRmlsZXNQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU0ZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdjYmU3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ1NTRmlsZXNQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTEZpbGVzUHJlZmVyZW5jZVBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBDU1NGaWxlc1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgWE1MRmlsZXNQcmVmZXJlbmNlUGFnZSB7Ci0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCkgewotCQlDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gbW9kZWwKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgc2Nyb2xsZWRDb21wb3NpdGUgPSBjcmVhdGVTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQpOwotCQljcmVhdGVDb250ZW50c0ZvckNyZWF0aW5nR3JvdXAoc2Nyb2xsZWRDb21wb3NpdGUpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2Nyb2xsZWRDb21wb3NpdGUsIElIZWxwQ29udGV4dElkcy5DU1NfUFJFRldFQlhfRklMRVNfSEVMUElEKTsKLQkJCi0JCXNldFNpemUoc2Nyb2xsZWRDb21wb3NpdGUpOwotCQlsb2FkUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHNjcm9sbGVkQ29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9yQ1NTLkNvbnRlbnRUeXBlSURfQ1NTKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJaW5pdGlhbGl6ZVZhbHVlc0ZvckNyZWF0aW5nR3JvdXAoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlwZXJmb3JtRGVmYXVsdHNGb3JDcmVhdGluZ0dyb3VwKCk7Ci0KLSAgICAgICAgdXBkYXRlQXBwbHlCdXR0b24oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCXN0b3JlVmFsdWVzRm9yQ3JlYXRpbmdHcm91cCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NTb3VyY2VQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU1NvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNTM3M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU1NvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LkdyaWREYXRhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VMaW5rQXJlYTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIENTU1NvdXJjZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSB7Ci0JLy8gQ29udGVudCBBc3Npc3QKLQlwcm90ZWN0ZWQgQnV0dG9uIGZBdXRvUHJvcG9zZTsKLQlwcm90ZWN0ZWQgTGFiZWwgZkF1dG9Qcm9wb3NlTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBmQXV0b1Byb3Bvc2VUZXh0OwotCXByb3RlY3RlZCBCdXR0b24gZkNsZWFyQWxsQmxhbmtMaW5lczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZJZGVudExvd2VyOwotCS8vIGNhc2Ugb2Ygb3V0cHV0IGNoYXJhY3RlcgotCS8vIGNhc2Ugb2YgaWRlbnRpZmllcgotCXByb3RlY3RlZCBCdXR0b24gZklkZW50VXBwZXI7Ci0JcHJpdmF0ZSBTcGlubmVyIGZJbmRlbnRhdGlvblNpemU7Ci0JcHJpdmF0ZSBCdXR0b24gZkluZGVudFVzaW5nU3BhY2VzOwotCQotCXByaXZhdGUgQnV0dG9uIGZJbmRlbnRVc2luZ1RhYnM7Ci0JLy8gRm9ybWF0dGluZwotCXByb3RlY3RlZCBMYWJlbCBmTGluZVdpZHRoTGFiZWw7Ci0JCi0JcHJvdGVjdGVkIFRleHQgZkxpbmVXaWR0aFRleHQ7Ci0JLy8gcHJvaGliaXQgd3JhcHBpbmcgaWYgc3R5bGUgYXR0cmlidXRlCi0JcHJvdGVjdGVkIEJ1dHRvbiBmTm93cmFwQXR0cjsKLQkvLyBvbmUgcHJvcGVydHkgcGVyIG9uZSBsaW5lCi0JcHJvdGVjdGVkIEJ1dHRvbiBmUHJvcGVydHlQZXJMaW5lOwotCXByb3RlY3RlZCBCdXR0b24gZlByb3BOYW1lTG93ZXI7Ci0KLQkvLyBjYXNlIG9mIHByb3BlcnR5IG5hbWUKLQlwcm90ZWN0ZWQgQnV0dG9uIGZQcm9wTmFtZVVwcGVyOwotCXByb3RlY3RlZCBCdXR0b24gZlByb3BWYWx1ZUxvd2VyOwotCS8vIGNhc2Ugb2YgcHJvcGVydHkgdmFsdWUKLQlwcm90ZWN0ZWQgQnV0dG9uIGZQcm9wVmFsdWVVcHBlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZTcGxpdE11bHRpQXR0cnM7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX0lOREVOVEFUSU9OX1NJWkUgPSAxNjsKLQlwcml2YXRlIGZpbmFsIGludCBNSU5fSU5ERU5UQVRJT05fU0laRSA9IDA7Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuQ1NTX1BSRUZXRUJYX1NPVVJDRV9IRUxQSUQpOwotCi0JCW5ldyBQcmVmZXJlbmNlTGlua0FyZWEoY29tcG9zaXRlLCBTV1QuV1JBUCB8IFNXVC5NVUxUSSwgIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuZWRpdG9yIiwgQ1NTVUlNZXNzYWdlcy5fVUlfU1RSVUNUVVJFRF9URVhUX0VESVRPUl9QUkVGU19MSU5LLC8vJE5PTi1OTFMtMSQKLQkJCQkJKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyKSBnZXRDb250YWluZXIoKSwgbnVsbCkuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmhpbnQoMTUwLCBTV1QuREVGQVVMVCkuY3JlYXRlKCkpOwotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3Rvcnkuc3d0RGVmYXVsdHMoKS5jcmVhdGUoKSk7Ci0KLQkJY3JlYXRlQ29udGVudHNGb3JGb3JtYXR0aW5nR3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlQ29udGVudHNGb3JDb250ZW50QXNzaXN0R3JvdXAoY29tcG9zaXRlKTsKLQkJc2V0U2l6ZShjb21wb3NpdGUpOwotCQlsb2FkUHJlZmVyZW5jZXMoKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50c0ZvckNvbnRlbnRBc3Npc3RHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIG5vdCBjb250ZW50IGFzc2lzdCwgYnV0IHByZWZlcnJlZCBjYXNlCi0JCUdyb3VwIGNhc2VHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMyk7Ci0JCWNhc2VHcm91cC5zZXRUZXh0KENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9DYXNlR3JvdXApOwotCi0JCS8vIHVzZSBncm91cCBmb3IgcmFkaW8gYnV0dG9ucyBzbyB0aGF0IGFzc29jaWF0ZWQgbGFiZWwgaXMgcmVhZAotCQlHcm91cCBpZGVudEdyb3VwID0gY3JlYXRlR3JvdXAoY2FzZUdyb3VwLCAxKTsKLQkJaWRlbnRHcm91cC5zZXRUZXh0KENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9DYXNlSWRlbnQpOwotCQlmSWRlbnRVcHBlciA9IGNyZWF0ZVJhZGlvQnV0dG9uKGlkZW50R3JvdXAsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9DYXNlSWRlbnRVcHBlcik7Ci0JCWZJZGVudExvd2VyID0gY3JlYXRlUmFkaW9CdXR0b24oaWRlbnRHcm91cCwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0Nhc2VJZGVudExvd2VyKTsKLQotCQkvLyB1c2UgZ3JvdXAgZm9yIHJhZGlvIGJ1dHRvbnMgc28gdGhhdCBhc3NvY2lhdGVkIGxhYmVsIGlzIHJlYWQKLQkJR3JvdXAgcHJvcE5hbWVHcm91cCA9IGNyZWF0ZUdyb3VwKGNhc2VHcm91cCwgMSk7Ci0JCXByb3BOYW1lR3JvdXAuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ2FzZVByb3BOYW1lKTsKLQkJZlByb3BOYW1lVXBwZXIgPSBjcmVhdGVSYWRpb0J1dHRvbihwcm9wTmFtZUdyb3VwLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ2FzZVByb3BOYW1lVXBwZXIpOwotCQlmUHJvcE5hbWVMb3dlciA9IGNyZWF0ZVJhZGlvQnV0dG9uKHByb3BOYW1lR3JvdXAsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9DYXNlUHJvcE5hbWVMb3dlcik7Ci0KLQkJLy8gdXNlIGdyb3VwIGZvciByYWRpbyBidXR0b25zIHNvIHRoYXQgYXNzb2NpYXRlZCBsYWJlbCBpcyByZWFkCi0JCUdyb3VwIHByb3BWYWx1ZUdyb3VwID0gY3JlYXRlR3JvdXAoY2FzZUdyb3VwLCAxKTsKLQkJcHJvcFZhbHVlR3JvdXAuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ2FzZVByb3BWYWx1ZSk7Ci0JCWZQcm9wVmFsdWVVcHBlciA9IGNyZWF0ZVJhZGlvQnV0dG9uKHByb3BWYWx1ZUdyb3VwLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ2FzZVByb3BWYWx1ZVVwcGVyKTsKLQkJZlByb3BWYWx1ZUxvd2VyID0gY3JlYXRlUmFkaW9CdXR0b24ocHJvcFZhbHVlR3JvdXAsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9DYXNlUHJvcFZhbHVlTG93ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50c0ZvckZvcm1hdHRpbmdHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGZvcm1hdHRpbmdHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0JCWZvcm1hdHRpbmdHcm91cC5zZXRUZXh0KENTU1VJTWVzc2FnZXMuRm9ybWF0dGluZ19VSV8pOwotCi0JCWZMaW5lV2lkdGhMYWJlbCA9IGNyZWF0ZUxhYmVsKGZvcm1hdHRpbmdHcm91cCwgQ1NTVUlNZXNzYWdlcy5MaW5lX3dpZHRoX19VSV8pOwotCQlmTGluZVdpZHRoVGV4dCA9IG5ldyBUZXh0KGZvcm1hdHRpbmdHcm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWdEYXRhLndpZHRoSGludCA9IDI1OwotCQlmTGluZVdpZHRoVGV4dC5zZXRMYXlvdXREYXRhKGdEYXRhKTsKLQkJZkxpbmVXaWR0aFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0KLQkJZlByb3BlcnR5UGVyTGluZSA9IGNyZWF0ZUNoZWNrQm94KGZvcm1hdHRpbmdHcm91cCwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX1dyYXBwaW5nSW5zZXJ0TGluZUJyZWFrKTsKLQkJKChHcmlkRGF0YSkgZlByb3BlcnR5UGVyTGluZS5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQlmTm93cmFwQXR0ciA9IGNyZWF0ZUNoZWNrQm94KGZvcm1hdHRpbmdHcm91cCwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX1dyYXBwaW5nV2l0aG91dEF0dHIpOwotCQkoKEdyaWREYXRhKSBmTm93cmFwQXR0ci5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJCi0JCWZJbmRlbnRVc2luZ1RhYnMgPSBjcmVhdGVSYWRpb0J1dHRvbihmb3JtYXR0aW5nR3JvdXAsIENTU1VJTWVzc2FnZXMuSW5kZW50X3VzaW5nX3RhYnNfKTsKLQkJKChHcmlkRGF0YSkgZkluZGVudFVzaW5nVGFicy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkluZGVudFVzaW5nU3BhY2VzID0gY3JlYXRlUmFkaW9CdXR0b24oZm9ybWF0dGluZ0dyb3VwLCBDU1NVSU1lc3NhZ2VzLkluZGVudF91c2luZ19zcGFjZXMpOwotCQkoKEdyaWREYXRhKSBmSW5kZW50VXNpbmdTcGFjZXMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQotCQljcmVhdGVMYWJlbChmb3JtYXR0aW5nR3JvdXAsIENTU1VJTWVzc2FnZXMuSW5kZW50YXRpb25fc2l6ZSk7Ci0JCWZJbmRlbnRhdGlvblNpemUgPSBuZXcgU3Bpbm5lcihmb3JtYXR0aW5nR3JvdXAsIFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0VG9vbFRpcFRleHQoQ1NTVUlNZXNzYWdlcy5JbmRlbnRhdGlvbl9zaXplX3RpcCk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0TWluaW11bShNSU5fSU5ERU5UQVRJT05fU0laRSk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0TWF4aW11bShNQVhfSU5ERU5UQVRJT05fU0laRSk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0SW5jcmVtZW50KDEpOwotCQlmSW5kZW50YXRpb25TaXplLnNldFBhZ2VJbmNyZW1lbnQoNCk7Ci0JCWZJbmRlbnRhdGlvblNpemUuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNkb0dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpIHsKLQkJQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gbW9kZWwKLQl9Ci0JCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWluaXRpYWxpemVWYWx1ZXNGb3JGb3JtYXR0aW5nR3JvdXAoKTsKLQkJaW5pdGlhbGl6ZVZhbHVlc0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpIHsKLQkJLy8gbm90IGNvbnRlbnQgYXNzaXN0LCBidXQgcHJlZmVycmVkIGNhc2UKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCWZJZGVudFVwcGVyLnNldFNlbGVjdGlvbihwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlmSWRlbnRMb3dlci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJZlByb3BOYW1lVXBwZXIuc2V0U2VsZWN0aW9uKHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfTkFNRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWZQcm9wTmFtZUxvd2VyLnNldFNlbGVjdGlvbihwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlmUHJvcFZhbHVlVXBwZXIuc2V0U2VsZWN0aW9uKHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlmUHJvcFZhbHVlTG93ZXIuc2V0U2VsZWN0aW9uKHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzRm9yRm9ybWF0dGluZ0dyb3VwKCkgewotCQkvLyBGb3JtYXR0aW5nCi0JCVByZWZlcmVuY2VzIHByZWZzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpOwotCQlmTGluZVdpZHRoVGV4dC5zZXRUZXh0KHByZWZzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKTsKLQkJZlByb3BlcnR5UGVyTGluZS5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX09ORV9QRVJfTElORSkpOwotCQlmTm93cmFwQXR0ci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUikpOwotCQkKLQkJaWYgKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUikpKSB7Ci0JCQlmSW5kZW50VXNpbmdUYWJzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWZJbmRlbnRVc2luZ1NwYWNlcy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9IGVsc2UgewotCQkJZkluZGVudFVzaW5nU3BhY2VzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWZJbmRlbnRVc2luZ1RhYnMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQkJCi0JCWZJbmRlbnRhdGlvblNpemUuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJcGVyZm9ybURlZmF1bHRzRm9yRm9ybWF0dGluZ0dyb3VwKCk7Ci0JCXBlcmZvcm1EZWZhdWx0c0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpOwotCi0JCXZhbGlkYXRlVmFsdWVzKCk7Ci0JCWVuYWJsZVZhbHVlcygpOwotCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcGVyZm9ybURlZmF1bHRzRm9yQ29udGVudEFzc2lzdEdyb3VwKCkgewotCQkvLyBub3QgY29udGVudCBhc3Npc3QsIGJ1dCBwcmVmZXJyZWQgY2FzZQotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJZklkZW50VXBwZXIuc2V0U2VsZWN0aW9uKHByZWZzLmdldERlZmF1bHRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlmSWRlbnRMb3dlci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0RGVmYXVsdEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCWZQcm9wTmFtZVVwcGVyLnNldFNlbGVjdGlvbihwcmVmcy5nZXREZWZhdWx0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJZlByb3BOYW1lTG93ZXIuc2V0U2VsZWN0aW9uKHByZWZzLmdldERlZmF1bHRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlmUHJvcFZhbHVlVXBwZXIuc2V0U2VsZWN0aW9uKHByZWZzLmdldERlZmF1bHRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJZlByb3BWYWx1ZUxvd2VyLnNldFNlbGVjdGlvbihwcmVmcy5nZXREZWZhdWx0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckZvcm1hdHRpbmdHcm91cCgpIHsKLQkJLy8gRm9ybWF0dGluZwotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJZkxpbmVXaWR0aFRleHQuc2V0VGV4dChwcmVmcy5nZXREZWZhdWx0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpOwotCQlmUHJvcGVydHlQZXJMaW5lLnNldFNlbGVjdGlvbihwcmVmcy5nZXREZWZhdWx0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX09ORV9QRVJfTElORSkpOwotCQlmTm93cmFwQXR0ci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0RGVmYXVsdEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpKTsKLQkJCi0JCWlmIChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKSkpIHsKLQkJCWZJbmRlbnRVc2luZ1RhYnMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZkluZGVudFVzaW5nU3BhY2VzLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlmSW5kZW50VXNpbmdTcGFjZXMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZkluZGVudFVzaW5nVGFicy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9CQkKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIHJlc3VsdCA9IHN1cGVyLnBlcmZvcm1PaygpOwotCi0JCWRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCXN0b3JlVmFsdWVzRm9yRm9ybWF0dGluZ0dyb3VwKCk7Ci0JCXN0b3JlVmFsdWVzRm9yQ29udGVudEFzc2lzdEdyb3VwKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzRm9yQ29udGVudEFzc2lzdEdyb3VwKCkgewotCQkvLyBub3QgY29udGVudCBhc3Npc3QsIGJ1dCBwcmVmZXJyZWQgY2FzZQotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJcHJlZnMuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIsIChmSWRlbnRVcHBlci5nZXRTZWxlY3Rpb24oKSkgPyBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSIDogQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCXByZWZzLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FLCAoZlByb3BOYW1lVXBwZXIuZ2V0U2VsZWN0aW9uKCkpID8gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUiA6IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlwcmVmcy5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUsIChmUHJvcFZhbHVlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpID8gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUiA6IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCX0KLQlwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXNGb3JGb3JtYXR0aW5nR3JvdXAoKSB7Ci0JCS8vIEZvcm1hdHRpbmcKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCXByZWZzLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCwgZkxpbmVXaWR0aFRleHQuZ2V0VGV4dCgpKTsKLQkJcHJlZnMuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUsIGZQcm9wZXJ0eVBlckxpbmUuZ2V0U2VsZWN0aW9uKCkpOwotCQlwcmVmcy5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUiwgZk5vd3JhcEF0dHIuZ2V0U2VsZWN0aW9uKCkpOwotCQkKLQkJaWYgKGZJbmRlbnRVc2luZ1RhYnMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIsIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVEFCKTsKLQkJfSBlbHNlIHsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIsIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0UpOwotCQl9Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUsIGZJbmRlbnRhdGlvblNpemUuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NTeW50YXhDb2xvcmluZ1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NTeW50YXhDb2xvcmluZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZkNDAxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ1NTU3ludGF4Q29sb3JpbmdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuQ29sb3JTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0NTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotLyoqCi0gKiBBIHByZWZlcmVuY2UgcGFnZSB0byBjb25maWd1cmUgb3VyIFhNTCBzeW50YXggY29sb3IuIEl0IHJlc2VtYmxlcyB0aGUgSkRUCi0gKiBhbmQgQ0RUIHBhZ2VzIGZhciBtb3JlIHRoYW4gb3VyIG9yaWdpbmFsIGNvbG9yIHBhZ2Ugd2hpbGUgcmV0YWluaW5nIHRoZQotICogZXh0cmEgImNsaWNrLXRvLWZpbmQiIGZ1bmN0aW9uYWxpdHkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDU1NTeW50YXhDb2xvcmluZ1BhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmQm9sZDsKLQlwcml2YXRlIExhYmVsIGZGb3JlZ3JvdW5kTGFiZWw7Ci0JcHJpdmF0ZSBMYWJlbCBmQmFja2dyb3VuZExhYmVsOwotCXByaXZhdGUgQnV0dG9uIGZDbGVhclN0eWxlOwotCXByaXZhdGUgTWFwIGZDb250ZXh0VG9TdHlsZU1hcDsKLQlwcml2YXRlIENvbG9yIGZEZWZhdWx0Rm9yZWdyb3VuZCA9IG51bGw7Ci0JcHJpdmF0ZSBDb2xvciBmRGVmYXVsdEJhY2tncm91bmQgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBDb2xvclNlbGVjdG9yIGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3I7Ci0JcHJpdmF0ZSBDb2xvclNlbGVjdG9yIGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3I7Ci0JcHJpdmF0ZSBCdXR0b24gZkl0YWxpYzsKLQlwcml2YXRlIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZk92ZXJsYXlTdG9yZTsKLQlwcml2YXRlIEJ1dHRvbiBmU3RyaWtlOwotCXByaXZhdGUgQ29sbGVjdGlvbiBmU3R5bGVQcmVmZXJlbmNlS2V5czsKLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgZlN0eWxlc1ZpZXdlciA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgZlN0eWxlVG9EZXNjcmlwdGlvbk1hcDsKLQlwcml2YXRlIFN0eWxlZFRleHQgZlRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gZlVuZGVybGluZTsKLQotCS8vIGFjdGl2YXRlIGNvbnRyb2xzIGJhc2VkIG9uIHRoZSBnaXZlbiBsb2NhbCBjb2xvciB0eXBlCi0JcHJpdmF0ZSB2b2lkIGFjdGl2YXRlKFN0cmluZyBuYW1lZFN0eWxlKSB7Ci0JCUNvbG9yIGZvcmVncm91bmQgPSBmRGVmYXVsdEZvcmVncm91bmQ7Ci0JCUNvbG9yIGJhY2tncm91bmQgPSBmRGVmYXVsdEJhY2tncm91bmQ7Ci0JCWlmIChuYW1lZFN0eWxlID09IG51bGwpIHsKLQkJCWZDbGVhclN0eWxlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmSXRhbGljLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZlN0cmlrZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZVbmRlcmxpbmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJhY2tncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJvbGQuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZJdGFsaWMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZTdHJpa2Uuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZVbmRlcmxpbmUuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCVRleHRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlRm9yKG5hbWVkU3R5bGUpOwotCQkJZkNsZWFyU3R5bGUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCb2xkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmSXRhbGljLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmU3RyaWtlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmVW5kZXJsaW5lLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQm9sZC5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOwotCQkJZkl0YWxpYy5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7Ci0JCQlmU3RyaWtlLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0gpICE9IDApOwotCQkJZlVuZGVybGluZS5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkUpICE9IDApOwotCQkJaWYgKGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCkgIT0gbnVsbCkgewotCQkJCWZvcmVncm91bmQgPSBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJfQotCQkJaWYgKGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCkgIT0gbnVsbCkgewotCQkJCWJhY2tncm91bmQgPSBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpOwotCQkJfQotCQl9Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5zZXRDb2xvclZhbHVlKGZvcmVncm91bmQuZ2V0UkdCKCkpOwotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldENvbG9yVmFsdWUoYmFja2dyb3VuZC5nZXRSR0IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29sb3IgdGhlIHRleHQgaW4gdGhlIHNhbXBsZSBhcmVhIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBwcmVmZXJlbmNlcwotCSAqLwotCXZvaWQgYXBwbHlTdHlsZXMoKSB7Ci0JCWlmIChmVGV4dCA9PSBudWxsIHx8IGZUZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGZEb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJLy8gbG9va3VwIHRoZSBsb2NhbCBjb2xvcmluZyB0eXBlIGFuZCBhcHBseSBpdAotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKFN0cmluZykgZkNvbnRleHRUb1N0eWxlTWFwLmdldChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSk7Ci0JCQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGVGb3IobmFtZWRTdHlsZSk7Ci0JCQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY3VycmVudFJlZ2lvbiksIGN1cnJlbnRSZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0U3R5bGUoKSk7Ci0JCQkJc3R5bGUuc3RyaWtlb3V0ID0gKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIKSAhPSAwOwotCQkJCXN0eWxlLnVuZGVybGluZSA9IChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FKSAhPSAwOwotCQkJCWZUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCQkJfQotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQl9Ci0KLQlCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29tcG9zaXRlIGNvbnRyb2wgYW5kIHNldHMgdGhlIGRlZmF1bHQgbGF5b3V0IGRhdGEuCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0JCWZEZWZhdWx0Rm9yZWdyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCk7Ci0JCWZEZWZhdWx0QmFja2dyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0JCUNvbXBvc2l0ZSBwYWdlQ29tcG9uZW50ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFnZUNvbXBvbmVudCwgSUhlbHBDb250ZXh0SWRzLkNTU19QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhwYWdlQ29tcG9uZW50LCBTV1QuV1JBUCk7Ci0JCWxpbmsuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nX0xpbmspOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24ocGFyZW50LmdldFNoZWxsKCksIGUudGV4dCwgbnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyaWREYXRhIGxpbmtEYXRhPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGlua0RhdGEud2lkdGhIaW50PSAxNTA7IC8vIG9ubHkgZXhwYW5kIGZ1cnRoZXIgaWYgYW55b25lIGVsc2UgcmVxdWlyZXMgaXQKLQkJbGluay5zZXRMYXlvdXREYXRhKGxpbmtEYXRhKTsKLQotCQluZXcgTGFiZWwocGFnZUNvbXBvbmVudCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQluZXcgTGFiZWwocGFnZUNvbXBvbmVudCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCVNhc2hGb3JtIGVkaXRvciA9IG5ldyBTYXNoRm9ybShwYWdlQ29tcG9uZW50LCBTV1QuVkVSVElDQUwpOwotCQlHcmlkRGF0YSBncmlkRGF0YTIgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEyLmhvcml6b250YWxTcGFuID0gMjsKLQkJZWRpdG9yLnNldExheW91dERhdGEoZ3JpZERhdGEyKTsKLQkJU2FzaEZvcm0gdG9wID0gbmV3IFNhc2hGb3JtKGVkaXRvciwgU1dULkhPUklaT05UQUwpOwotCQlDb21wb3NpdGUgc3R5bGVFZGl0b3IgPSBjcmVhdGVDb21wb3NpdGUodG9wLCAxKTsKLQkJKChHcmlkTGF5b3V0KSBzdHlsZUVkaXRvci5nZXRMYXlvdXQoKSkubWFyZ2luUmlnaHQgPSA1OwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gMDsKLQkJY3JlYXRlTGFiZWwoc3R5bGVFZGl0b3IsIENTU1VJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzApOwotCQlmU3R5bGVzVmlld2VyID0gY3JlYXRlU3R5bGVzVmlld2VyKHN0eWxlRWRpdG9yKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSBNYXRoLm1heChncmlkRGF0YS53aWR0aEhpbnQsIGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhpdGVyYXRvci5uZXh0KCkudG9TdHJpbmcoKS5sZW5ndGgoKSkpOwotCQl9Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQlmU3R5bGVzVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlDb21wb3NpdGUgZWRpdGluZ0NvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b3AsIDEpOwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gNTsKLQkJY3JlYXRlTGFiZWwoZWRpdGluZ0NvbXBvc2l0ZSwgIiIpOwotCQlCdXR0b24gZW5hYmxlciA9IGNyZWF0ZUNoZWNrYm94KGVkaXRpbmdDb21wb3NpdGUsIENTU1VJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzIpOwotCQllbmFibGVyLnNldEVuYWJsZWQoZmFsc2UpOwotCQllbmFibGVyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJQ29tcG9zaXRlIGVkaXRDb250cm9scyA9IGNyZWF0ZUNvbXBvc2l0ZShlZGl0aW5nQ29tcG9zaXRlLCAyKTsKLQkJKChHcmlkTGF5b3V0KSBlZGl0Q29udHJvbHMuZ2V0TGF5b3V0KCkpLm1hcmdpbkxlZnQgPSAyMDsKLQotCQlmRm9yZWdyb3VuZExhYmVsID0gY3JlYXRlTGFiZWwoZWRpdENvbnRyb2xzLCBTU0VVSU1lc3NhZ2VzLkZvcmVncm91bmRfVUlfKTsKLQkJKChHcmlkRGF0YSkgZkZvcmVncm91bmRMYWJlbC5nZXRMYXlvdXREYXRhKCkpLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJZkZvcmVncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yID0gbmV3IENvbG9yU2VsZWN0b3IoZWRpdENvbnRyb2xzKTsKLQkJQnV0dG9uIGZGb3JlZ3JvdW5kQ29sb3IgPSBmRm9yZWdyb3VuZENvbG9yRWRpdG9yLmdldEJ1dHRvbigpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJZkZvcmVncm91bmRDb2xvci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlmQmFja2dyb3VuZExhYmVsID0gY3JlYXRlTGFiZWwoZWRpdENvbnRyb2xzLCBTU0VVSU1lc3NhZ2VzLkJhY2tncm91bmRfVUlfKTsKLQkJKChHcmlkRGF0YSkgZkJhY2tncm91bmRMYWJlbC5nZXRMYXlvdXREYXRhKCkpLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJZkJhY2tncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yID0gbmV3IENvbG9yU2VsZWN0b3IoZWRpdENvbnRyb2xzKTsKLQkJQnV0dG9uIGZCYWNrZ3JvdW5kQ29sb3IgPSBmQmFja2dyb3VuZENvbG9yRWRpdG9yLmdldEJ1dHRvbigpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJZkJhY2tncm91bmRDb2xvci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZkJhY2tncm91bmRDb2xvckVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlmQm9sZCA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywgQ1NTVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfMyk7Ci0JCWZCb2xkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBmQm9sZC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkl0YWxpYyA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywgQ1NTVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfNCk7Ci0JCWZJdGFsaWMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZJdGFsaWMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZTdHJpa2UgPSBjcmVhdGVDaGVja2JveChlZGl0Q29udHJvbHMsIENTU1VJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzUpOwotCQlmU3RyaWtlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBmU3RyaWtlLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmVW5kZXJsaW5lID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBDU1NVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV82KTsKLQkJZlVuZGVybGluZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJKChHcmlkRGF0YSkgZlVuZGVybGluZS5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkNsZWFyU3R5bGUgPSBuZXcgQnV0dG9uKGVkaXRpbmdDb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJZkNsZWFyU3R5bGUuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlJlc3RvcmVfRGVmYXVsdF9VSV8pOyAvLyROT04tTkxTLTEkID0gIlJlc3RvcmUgRGVmYXVsdCIKLQkJZkNsZWFyU3R5bGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORykpOwotCQkoKEdyaWREYXRhKWZDbGVhclN0eWxlLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlDb21wb3NpdGUgc2FtcGxlQXJlYSA9IGNyZWF0ZUNvbXBvc2l0ZShlZGl0b3IsIDEpOwotCi0JCSgoR3JpZExheW91dCkgc2FtcGxlQXJlYS5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDU7Ci0JCSgoR3JpZExheW91dCkgc2FtcGxlQXJlYS5nZXRMYXlvdXQoKSkubWFyZ2luVG9wID0gNTsKLQkJY3JlYXRlTGFiZWwoc2FtcGxlQXJlYSwgU1NFVUlNZXNzYWdlcy5TYW1wbGVfdGV4dF9fVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICImU2FtcGxlIHRleHQ6IgotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbmV3IFNvdXJjZVZpZXdlcihzYW1wbGVBcmVhLCBudWxsLCBTV1QuQk9SREVSIHwgU1dULkxFRlRfVE9fUklHSFQgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZlRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlHcmlkRGF0YSBncmlkRGF0YTMgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEzLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyMCk7Ci0JCWdyaWREYXRhMy5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJZ3JpZERhdGEzLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YTMpOwotCQlmVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWZUZXh0LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsKLQkJZlRleHQuYWRkS2V5TGlzdGVuZXIoZ2V0VGV4dEtleUxpc3RlbmVyKCkpOwotCQlmVGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRUZXh0U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZE1vdXNlTGlzdGVuZXIoZ2V0VGV4dE1vdXNlTGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZFRyYXZlcnNlTGlzdGVuZXIoZ2V0VHJhdmVyc2VMaXN0ZW5lcigpKTsKLQkJc2V0QWNjZXNzaWJsZShmVGV4dCwgU1NFVUlNZXNzYWdlcy5TYW1wbGVfdGV4dF9fVUlfKTsKLQkJZkRvY3VtZW50ID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5jcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUyk7Ci0JCWZEb2N1bWVudC5zZXQoZ2V0RXhhbXBsZVRleHQoKSk7Ci0JCXZpZXdlci5zZXREb2N1bWVudChmRG9jdW1lbnQpOwotCi0JCXRvcC5zZXRXZWlnaHRzKG5ldyBpbnRbXXsxLCAxfSk7Ci0JCWVkaXRvci5zZXRXZWlnaHRzKG5ldyBpbnRbXXsxLCAxfSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFnZUNvbXBvbmVudCwgSUhlbHBDb250ZXh0SWRzLkNTU19QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQotCQlmU3R5bGVzVmlld2VyLnNldElucHV0KGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKSk7Ci0KLQkJYXBwbHlTdHlsZXMoKTsKLQotCQlmU3R5bGVzVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFldmVudC5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQkJCQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuYWRkTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhDb2xvclNlbGVjdG9yLlBST1BfQ09MT1JDSEFOR0UpKSB7Ci0JCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMF07Ci0JCQkJCQkvLyBvcGVuIGNvbG9yIGRpYWxvZyB0byBnZXQgbmV3IGNvbG9yCi0JCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBDb2xvckhlbHBlci50b1JHQlN0cmluZyhmRm9yZWdyb3VuZENvbG9yRWRpdG9yLmdldENvbG9yVmFsdWUoKSk7Ci0KLQkJCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJCXN0eWxlUHJlZnNbMF0gPSBuZXdWYWx1ZTsKLQkJCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuYWRkTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhDb2xvclNlbGVjdG9yLlBST1BfQ09MT1JDSEFOR0UpKSB7Ci0JCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMV07Ci0JCQkJCQkvLyBvcGVuIGNvbG9yIGRpYWxvZyB0byBnZXQgbmV3IGNvbG9yCi0JCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBDb2xvckhlbHBlci50b1JHQlN0cmluZyhmQmFja2dyb3VuZENvbG9yRWRpdG9yLmdldENvbG9yVmFsdWUoKSk7Ci0KLQkJCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJCXN0eWxlUHJlZnNbMV0gPSBuZXdWYWx1ZTsKLQkJCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCQkJYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZCb2xkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMl07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZCb2xkLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzJdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZJdGFsaWMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1szXTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZkl0YWxpYy5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJc3R5bGVQcmVmc1szXSA9IG5ld1ZhbHVlOwotCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmU3RyaWtlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbNF07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZTdHJpa2UuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbNF0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZlVuZGVybGluZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkvLyBnZXQgY3VycmVudCAobmV3bHkgb2xkKSBzdHlsZQotCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzVdOwotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBTdHJpbmcudmFsdWVPZihmVW5kZXJsaW5lLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzVdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZkNsZWFyU3R5bGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm47Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKS50b1N0cmluZygpOwotCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFRvRGVmYXVsdChuYW1lZFN0eWxlKTsKLQkJCQlhcHBseVN0eWxlcygpOwotCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gcGFnZUNvbXBvbmVudDsKLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGFiZWwuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0QmFja2dyb3VuZCgpKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8vIHByb3RlY3RlZCBMYWJlbCBjcmVhdGVEZXNjcmlwdGlvbkxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0KLQkvKioKLQkgKiBTZXQgdXAgYWxsIHRoZSBzdHlsZSBwcmVmZXJlbmNlIGtleXMgaW4gdGhlIG92ZXJsYXkgc3RvcmUKLQkgKi8KLQlwcml2YXRlIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUl0ZXJhdG9yIGkgPSBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgKFN0cmluZykgaS5uZXh0KCkpKTsKLQkJfQotCi0JCU92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGtleXMgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W292ZXJsYXlLZXlzLnNpemUoKV07Ci0JCW92ZXJsYXlLZXlzLnRvQXJyYXkoa2V5cyk7Ci0JCXJldHVybiBrZXlzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIExpc3Qgdmlld2VyIHdoZXJlIHdlIHNlZSB0aGUgdmFyaW91cyBzeW50YXggZWxlbWVudCBkaXNwbGF5Ci0JICogbmFtZXMtLXdvdWxkIGl0IGV2ZXIgYmUgYSBUcmVlIGxpa2UgSkRUJ3M/Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgY3JlYXRlU3R5bGVzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RydWN0dXJlZFZpZXdlciBzdHlsZXNWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJc3R5bGVzVmlld2VyLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKSkpOwotCQlzdHlsZXNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCU9iamVjdCBkZXNjcmlwdGlvbiA9IGZTdHlsZVRvRGVzY3JpcHRpb25NYXAuZ2V0KGVsZW1lbnQpOwotCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotCQkJCQlyZXR1cm4gZGVzY3JpcHRpb24udG9TdHJpbmcoKTsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQkJfSk7Ci0JCXN0eWxlc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKS50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHN0eWxlc1ZpZXdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQlmT3ZlcmxheVN0b3JlLnN0b3AoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihTdHJpbmcgbmFtZWRTdHlsZSkgewotCQlUZXh0QXR0cmlidXRlIHRhID0gbmV3IFRleHRBdHRyaWJ1dGUoZkRlZmF1bHRGb3JlZ3JvdW5kLCBmRGVmYXVsdEJhY2tncm91bmQsIFNXVC5OT1JNQUwpOwotCi0JCWlmIChuYW1lZFN0eWxlICE9IG51bGwgJiYgZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQkvLyBub3RlOiAibmFtZWRTdHlsZSIgKmlzKiB0aGUgcHJlZmVyZW5jZSBrZXkKLQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCQlSR0IgYmFja2dyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMV0pOwotCi0JCQkJaW50IGZvbnRNb2RpZmllciA9IFNXVC5OT1JNQUw7Ci0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAyKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAzKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1szXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDQpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzRdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiA1KSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1s1XSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQotCQkJCXRhID0gbmV3IFRleHRBdHRyaWJ1dGUoKGZvcmVncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGZvcmVncm91bmQpIDogbnVsbCwgKGJhY2tncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGJhY2tncm91bmQpIDogbnVsbCwgZm9udE1vZGlmaWVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGE7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RXhhbXBsZVRleHQoKSB7Ci0JCXJldHVybiBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JTYW1wbGU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJLy8gZW5zdXJlIHRoZSBvZmZzZXQgaXMgY2xlYW4KLQkJaWYgKG9mZnNldCA+PSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpCi0JCQlyZXR1cm4gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KGZEb2N1bWVudC5nZXRMZW5ndGgoKSAtIDEpOwotCQllbHNlIGlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuIGdldE5hbWVkU3R5bGVBdE9mZnNldCgwKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGZEb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCAmJiAhZG9jdW1lbnRSZWdpb24uY29udGFpbnNPZmZzZXQob2Zmc2V0KSkgewotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQkJaWYgKGRvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIGZpbmQgdGhlIElUZXh0UmVnaW9uJ3MgQ29udGV4dCBhdCB0aGlzIG9mZnNldAotCQkJSVRleHRSZWdpb24gaW50ZXJlc3QgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKGludGVyZXN0ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAob2Zmc2V0ID4gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChpbnRlcmVzdCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlTdHJpbmcgcmVnaW9uQ29udGV4dCA9IGludGVyZXN0LmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25Db250ZXh0ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkvLyBmaW5kIHRoZSBuYW1lZCBzdHlsZSAoaW50ZXJuYWwvc2VsZWN0YWJsZSBuYW1lKSBmb3IgdGhhdAotCQkJLy8gY29udGV4dAotCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoU3RyaW5nKSBmQ29udGV4dFRvU3R5bGVNYXAuZ2V0KHJlZ2lvbkNvbnRleHQpOwotCQkJaWYgKG5hbWVkU3R5bGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBuYW1lZFN0eWxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBnZXRPdmVybGF5U3RvcmUoKSB7Ci0JCXJldHVybiBmT3ZlcmxheVN0b3JlOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCkgewotCQlpZiAoZlN0eWxlUHJlZmVyZW5jZUtleXMgPT0gbnVsbCkgewotCQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5OT1JNQUwpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9OQU1FKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLlVSSSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5TVFJJTkcpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuQ09MT04pOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTik7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5FUlJPUik7Ci0JCQlmU3R5bGVQcmVmZXJlbmNlS2V5cyA9IHN0eWxlczsKLQkJfQotCQlyZXR1cm4gZlN0eWxlUHJlZmVyZW5jZUtleXM7Ci0JfQotCi0JcHJpdmF0ZSBLZXlMaXN0ZW5lciBnZXRUZXh0S2V5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb3VzZUxpc3RlbmVyIGdldFRleHRNb3VzZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vdXNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZ2V0VGV4dFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KGUueCk7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQkoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24oZS54KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KGUueCk7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQkoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24oZS54KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmF2ZXJzZUxpc3RlbmVyIGdldFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXIja2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWlmICgoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9ORVhUKSB8fCAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUykpCi0JCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCXNldERlc2NyaXB0aW9uKFNTRVVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdfRGVzY3JpcHRpb24pOwotCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCWluaXRTdHlsZVRvRGVzY3JpcHRpb25NYXAoKTsKLQkJaW5pdFJlZ2lvbkNvbnRleHRUb1N0eWxlTWFwKCk7Ci0KLQkJZk92ZXJsYXlTdG9yZSA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlKGdldFByZWZlcmVuY2VTdG9yZSgpLCBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkpOwotCQlmT3ZlcmxheVN0b3JlLmxvYWQoKTsKLQkJZk92ZXJsYXlTdG9yZS5zdGFydCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UmVnaW9uQ29udGV4dFRvU3R5bGVNYXAoKSB7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQsIElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5UKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RPLCBJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NEQywgSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TLCBJU3R5bGVDb25zdGFudHNDU1MuTk9STUFMKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIsIElTdHlsZUNvbnN0YW50c0NTUy5TRU1JX0NPTE9OKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFLCBJU3R5bGVDb25zdGFudHNDU1MuQ1VSTFlfQlJBQ0UpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UsIElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRSk7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JULCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFLCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfRk9OVF9GQUNFLCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VULCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19BVEtFWVdPUkQsIElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSk7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU1RSSU5HLCBJU3R5bGVDb25zdGFudHNDU1MuU1RSSU5HKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfVVJJLCBJU3R5bGVDb25zdGFudHNDU1MuVVJJKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESVVNLCBJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQV9TRVBBUkFUT1IsIElTdHlsZUNvbnN0YW50c0NTUy5NRURJQSk7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVF9OQU1FLCBJU3R5bGVDb25zdGFudHNDU1MuU1RSSU5HKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFX1NFTEVDVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfVU5JVkVSU0FMLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8sIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9JRCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DT01CSU5BVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9TRVBBUkFUT1IsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfTkFNRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5ULCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04sIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04sIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkcsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVU5JQ09ERV9SQU5HRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5ULCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUywgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuQ09MT04pOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIsIElTdHlsZUNvbnN0YW50c0NTUy5TRU1JX0NPTE9OKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTktOT1dOLCBJU3R5bGVDb25zdGFudHNDU1MuRVJST1IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0U3R5bGVUb0Rlc2NyaXB0aW9uTWFwKCkgewotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNDU1MuTk9STUFMLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JOb3JtYWwpOy8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JBdG1hcmtSdWxlKTsvLyROT04tTkxTLTEkCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUiwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yU2VsZWN0b3IpOy8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLk1FRElBLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JNZWRpYSk7Ly8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yQ29tbWVudCk7Ly8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfTkFNRSwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yUHJvcGVydHlOYW1lKTsvLyROT04tTkxTLTEkCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yUHJvcGVydHlWYWx1ZSk7Ly8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNDU1MuVVJJLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JVcmkpOy8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORywgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yU3RyaW5nKTsvLyROT04tTkxTLTEkCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0NTUy5DT0xPTiwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yQ29sb24pOy8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTUlfQ09MT04sIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvclNlbWlDb2xvbik7Ly8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNDU1MuQ1VSTFlfQlJBQ0UsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvckN1cmx5QnJhY2UpOy8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLkVSUk9SLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JFcnJvcik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWdldE92ZXJsYXlTdG9yZSgpLmxvYWREZWZhdWx0cygpOwotCQlhcHBseVN0eWxlcygpOwotCQlmU3R5bGVzVmlld2VyLnNldFNlbGVjdGlvbihTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQkJYWN0aXZhdGUobnVsbCk7Ci0JCWZUZXh0LnJlZHJhdygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJZ2V0T3ZlcmxheVN0b3JlKCkucHJvcGFnYXRlKCk7Ci0KLQkJQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZWxlY3RDb2xvckF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBnZXROYW1lZFN0eWxlQXRPZmZzZXQob2Zmc2V0KTsKLQkJaWYgKG5hbWVkU3R5bGUgIT0gbnVsbCkgewotCQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmFtZWRTdHlsZSkpOwotCQkJZlN0eWxlc1ZpZXdlci5yZXZlYWwobmFtZWRTdHlsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmU3R5bGVzVmlld2VyLnNldFNlbGVjdGlvbihTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQkJfQotCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBTcGVjaWZpY2FsbHkgc2V0IHRoZSByZXBvcnRpbmcgbmFtZSBvZiBhIGNvbnRyb2wgZm9yIGFjY2Vzc2liaWxpdHkKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0QWNjZXNzaWJsZShDb250cm9sIGNvbnRyb2wsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChjb250cm9sID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZpbmFsIFN0cmluZyBuID0gbmFtZTsKLQkJY29udHJvbC5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5jaGlsZElEID09IEFDQy5DSElMRElEX1NFTEYpCi0JCQkJCWUucmVzdWx0ID0gbjsKLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU1RlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOTM1MWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU1RlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBDU1MgdGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSB7Ci0KLQljbGFzcyBDU1NFZGl0VGVtcGxhdGVEaWFsb2cgZXh0ZW5kcyBFZGl0VGVtcGxhdGVEaWFsb2cgewotCQlwdWJsaWMgQ1NTRWRpdFRlbXBsYXRlRGlhbG9nKFNoZWxsIHBhcmVudCwgVGVtcGxhdGUgdGVtcGxhdGUsIGJvb2xlYW4gZWRpdCwgYm9vbGVhbiBpc05hbWVNb2RpZmlhYmxlLCBDb250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCQlzdXBlcihwYXJlbnQsIHRlbXBsYXRlLCBlZGl0LCBpc05hbWVNb2RpZmlhYmxlLCByZWdpc3RyeSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7CQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25DU1MoKTsKLQotCQkJcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQkJfQotCi0JCQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RhbnQgZ2V0Q29udGVudEFzc2lzdGFudChJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCUNvbnRlbnRBc3Npc3RhbnQgYXNzaXN0YW50ID0gbmV3IENvbnRlbnRBc3Npc3RhbnQoKTsKLQkJCQlhc3Npc3RhbnQuZW5hYmxlQXV0b0FjdGl2YXRpb24odHJ1ZSk7Ci0JCQkJYXNzaXN0YW50LmVuYWJsZUF1dG9JbnNlcnQodHJ1ZSk7Ci0JCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoZ2V0VGVtcGxhdGVQcm9jZXNzb3IoKSwgSURvY3VtZW50LkRFRkFVTFRfQ09OVEVOVF9UWVBFKTsKLQkJCQlyZXR1cm4gYXNzaXN0YW50OwotCQkJfQotCQl9OwotCQlyZXR1cm4gZG9DcmVhdGVWaWV3ZXIocGFyZW50LCBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKTsKLX0KLQl9Ci0KLQlwdWJsaWMgQ1NTVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSgpIHsKLQkJQ1NTVUlQbHVnaW4gY3NzVUlQbHVnaW4gPSBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0KLQkJc2V0UHJlZmVyZW5jZVN0b3JlKGNzc1VJUGx1Z2luLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJc2V0VGVtcGxhdGVTdG9yZShjc3NVSVBsdWdpbi5nZXRUZW1wbGF0ZVN0b3JlKCkpOwotCQlzZXRDb250ZXh0VHlwZVJlZ2lzdHJ5KGNzc1VJUGx1Z2luLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gb2sgPSBzdXBlci5wZXJmb3JtT2soKTsKLQkJQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gb2s7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnRlbXBsYXRlcy5UZW1wbGF0ZVByZWZlcmVuY2VQYWdlI2lzU2hvd0Zvcm1hdHRlclNldHRpbmcoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU2hvd0Zvcm1hdHRlclNldHRpbmcoKSB7Ci0JCS8vIHRlbXBsYXRlIGZvcm1hdHRpbmcgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb250cm9sIGMgPSBzdXBlci5jcmVhdGVDb250ZW50cyhhbmNlc3Rvcik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYywgSUhlbHBDb250ZXh0SWRzLkNTU19QUkVGV0VCWF9URU1QTEFURVNfSEVMUElEKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnRlbXBsYXRlcy5UZW1wbGF0ZVByZWZlcmVuY2VQYWdlI2NyZWF0ZVZpZXdlcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIFNvdXJjZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGJhc2VDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUygpOwotCi0JCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBkb0NyZWF0ZVZpZXdlcihwYXJlbnQsIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24pOwotCX0KLQotCVNvdXJjZVZpZXdlciBkb0NyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHZpZXdlckNvbmZpZ3VyYXRpb24pIHsKLQkJU291cmNlVmlld2VyIHZpZXdlciA9IG51bGw7Ci0JCVN0cmluZyBjb250ZW50VHlwZUlEID0gQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUzsKLQkJdmlld2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIpLmdldFRleHRXaWRnZXQoKS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnQoIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWRNb2RlbCBzY3JhdGNoTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihjb250ZW50VHlwZUlEKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gc2NyYXRjaE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQl2aWV3ZXIuY29uZmlndXJlKHZpZXdlckNvbmZpZ3VyYXRpb24pOwotCQl2aWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGVkaXQgZGlhbG9nLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlCi0JICogYSBjdXN0b20gZGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wbGF0ZQotCSAqICAgICAgICAgICAgdGhlIHRlbXBsYXRlIGJlaW5nIGVkaXRlZAotCSAqIEBwYXJhbSBlZGl0Ci0JICogICAgICAgICAgICB3aGV0aGVyIHRoZSBkaWFsb2cgc2hvdWxkIGJlIGVkaXRhYmxlCi0JICogQHBhcmFtIGlzTmFtZU1vZGlmaWFibGUKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIHRlbXBsYXRlIG5hbWUgbWF5IGJlIG1vZGlmaWVkCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBvciBtb2RpZmllZCB0ZW1wbGF0ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogICAgICAgICBlZGl0aW9uIGZhaWxlZAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwcm90ZWN0ZWQgVGVtcGxhdGUgZWRpdFRlbXBsYXRlKFRlbXBsYXRlIHRlbXBsYXRlLCBib29sZWFuIGVkaXQsIGJvb2xlYW4gaXNOYW1lTW9kaWZpYWJsZSkgewotCQlFZGl0VGVtcGxhdGVEaWFsb2cgZGlhbG9nID0gbmV3IENTU0VkaXRUZW1wbGF0ZURpYWxvZyhnZXRTaGVsbCgpLCB0ZW1wbGF0ZSwgZWRpdCwgaXNOYW1lTW9kaWZpYWJsZSwgZ2V0Q29udGV4dFR5cGVSZWdpc3RyeSgpKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm4gZGlhbG9nLmdldFRlbXBsYXRlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNTEwOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotCi0vKioKLSAqIENvbnRhaW5zIGEgc2V0IG9mIHByb2plY3Rpb24gbW9kZWwgYWRkaXRpb25zL2RlbGV0aW9ucy9tb2RpZmljYXRpb25zCi0gKi8KLWNsYXNzIFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBsb2NhdGVkIGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBjaGFuZ2UgTm9kZSB0byBJQ1NTTm9kZQotCXByaXZhdGUgSUNTU05vZGUgZk5vZGU7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uW10gZkRlbGV0aW9uczsKLQlwcml2YXRlIE1hcCBmQWRkaXRpb25zOwotCXByaXZhdGUgQW5ub3RhdGlvbltdIGZNb2RpZmljYXRpb25zOwotCi0JcHVibGljIFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKElDU1NOb2RlIG5vZGUsIEFubm90YXRpb25bXSBkZWxldGlvbnMsIE1hcCBhZGRpdGlvbnMsIEFubm90YXRpb25bXSBtb2RpZmljYXRpb25zKSB7Ci0JCWZOb2RlID0gbm9kZTsKLQkJZkRlbGV0aW9ucyA9IGRlbGV0aW9uczsKLQkJZkFkZGl0aW9ucyA9IGFkZGl0aW9uczsKLQkJZk1vZGlmaWNhdGlvbnMgPSBtb2RpZmljYXRpb25zOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0QWRkaXRpb25zKCkgewotCQlyZXR1cm4gZkFkZGl0aW9uczsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbltdIGdldERlbGV0aW9ucygpIHsKLQkJcmV0dXJuIGZEZWxldGlvbnM7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb25bXSBnZXRNb2RpZmljYXRpb25zKCkgewotCQlyZXR1cm4gZk1vZGlmaWNhdGlvbnM7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGdldE5vZGUoKSB7Ci0JCXJldHVybiBmTm9kZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2ZTU2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci0KLS8qKgotICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgd2l0aCBwcm9qZWN0aW9uIGFubm90YXRpb25zIGZvciB0aGlzCi0gKiBhZGFwdGVyIG5vZGUncyBjaGlsZHJlbgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJDU1MgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZGVidWdQcm9qZWN0aW9uUGVyZiA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuY3NzLnVpL3Byb2plY3Rpb25wZXJmIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiRcCi0KLQlwcml2YXRlIGNsYXNzIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGV4dGVuZHMgUHJvamVjdGlvbkFubm90YXRpb24gewotCQlwcml2YXRlIGJvb2xlYW4gZklzVmlzaWJsZSA9IGZhbHNlOyAvKiB3b3JrYXJvdW5kIGZvciBCVUc4NTg3NCAqLwotCQlwcml2YXRlIElDU1NOb2RlIGZOb2RlOwotCi0JCXB1YmxpYyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbihJQ1NTTm9kZSBub2RlLCBib29sZWFuIGlzQ29sbGFwc2VkKSB7Ci0JCQlzdXBlcihpc0NvbGxhcHNlZCk7Ci0JCQlmTm9kZSA9IG5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgSUNTU05vZGUgZ2V0Tm9kZSgpIHsKLQkJCXJldHVybiBmTm9kZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldE5vZGUoSUNTU05vZGUgbm9kZSkgewotCQkJZk5vZGUgPSBub2RlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIERvZXMgbm90IHBhaW50IGhpZGRlbiBhbm5vdGF0aW9ucy4gQW5ub3RhdGlvbnMgYXJlIGhpZGRlbiB3aGVuIHRoZXkKLQkJICogb25seSBzcGFuIG9uZSBsaW5lLgotCQkgKiAKLQkJICogQHNlZSBQcm9qZWN0aW9uQW5ub3RhdGlvbiNwYWludChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsCi0JCSAqICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgQ2FudmFzIGNhbnZhcywgUmVjdGFuZ2xlIHJlY3RhbmdsZSkgewotCQkJLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJCS8qCi0JCQkgKiBvbmx5IG5lZWQgdG8gY2hlY2sgYW5ub3RhdGlvbnMgdGhhdCBhcmUgZXhwYW5kZWQgYmVjYXVzZSBoaWRkZW4KLQkJCSAqIGFubm90YXRpb25zIHNob3VsZCBuZXZlciBoYXZlIGJlZW4gZ2l2ZW4gdGhlIGNoYW5jZSB0bwotCQkJICogY29sbGFwc2UuCi0JCQkgKi8KLQkJCWlmICghaXNDb2xsYXBzZWQoKSkgewotCQkJCS8vIHdvcmtpbmcgd2l0aCByZWN0YW5nbGUsIHNvIGxpbmUgaGVpZ2h0Ci0JCQkJRm9udE1ldHJpY3MgbWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCQkJaWYgKG1ldHJpY3MgIT0gbnVsbCkgewotCQkJCQkvLyBkbyBub3QgZHJhdyBhbm5vdGF0aW9ucyB0aGF0IG9ubHkgc3BhbiBvbmUgbGluZSBhbmQKLQkJCQkJLy8gbWFyayB0aGVtIGFzIG5vdCB2aXNpYmxlCi0JCQkJCWlmICgocmVjdGFuZ2xlLmhlaWdodCAvIG1ldHJpY3MuZ2V0SGVpZ2h0KCkpIDw9IDEpIHsKLQkJCQkJCWZJc1Zpc2libGUgPSBmYWxzZTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZJc1Zpc2libGUgPSB0cnVlOwotCQkJc3VwZXIucGFpbnQoZ2MsIGNhbnZhcywgcmVjdGFuZ2xlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbiNtYXJrQ29sbGFwc2VkKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1hcmtDb2xsYXBzZWQoKSB7Ci0JCQkvKiB3b3JrYXJvdW5kIGZvciBCVUc4NTg3NCAqLwotCQkJLy8gZG8gbm90IG1hcmsgY29sbGFwc2VkIGlmIGFubm90YXRpb24gaXMgbm90IHZpc2libGUKLQkJCWlmIChmSXNWaXNpYmxlKQotCQkJCXN1cGVyLm1hcmtDb2xsYXBzZWQoKTsKLQkJfQotCX0KLQotCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUNTUyBmQWRhcHRlckZhY3Rvcnk7Ci0JcHJpdmF0ZSBNYXAgZlRhZ0Fubm90YXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUyhQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MgZmFjdG9yeSkgewotCQlmQWRhcHRlckZhY3RvcnkgPSBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHByb2plY3Rpb24gcG9zaXRpb24gZnJvbSB0aGUgZ2l2ZW4gbm9kZS4gQWJsZSB0byBnZXQKLQkgKiBwcm9qZWN0aW9uIHBvc2l0aW9uIGlmIG5vZGUgaXNOb2RlUHJvamVjdGFibGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIG51bGwgaWYgbm8gcHJvamVjdGlvbiBwb3NpdGlvbiBwb3NzaWJsZSwgYSBQb3NpdGlvbiBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIFBvc2l0aW9uIGNyZWF0ZVByb2plY3Rpb25Qb3NpdGlvbihJQ1NTTm9kZSBub2RlKSB7Ci0JCVBvc2l0aW9uIHBvcyA9IG51bGw7Ci0JCWlmIChpc05vZGVQcm9qZWN0YWJsZShub2RlKSAmJiBub2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJLy8gSURvY3VtZW50IGRvY3VtZW50ID0KLQkJCS8vIGZBZGFwdGVyRmFjdG9yeS5nZXRQcm9qZWN0aW9uVmlld2VyKCkuZ2V0RG9jdW1lbnQoKTsKLQkJCS8vIGlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJbmRleGVkUmVnaW9uIGlub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCQlpbnQgc3RhcnQgPSBpbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGVuZCA9IGlub2RlLmdldEVuZE9mZnNldCgpOwotCQkJaWYgKHN0YXJ0ID49IDAgJiYgc3RhcnQgPCBlbmQpIHsKLQkJCQkvLyByZWdpb24tYmFzZWQKLQkJCQkvLyBleHRyYSBsaW5lIHdoZW4gY29sbGFwc2VkLCBidXQgbm8gcmVnaW9uIGluY3JlYXNlIHdoZW4KLQkJCQkvLyBhZGQgbmV3bGluZQotCQkJCXBvcyA9IG5ldyBQb3NpdGlvbihzdGFydCwgZW5kIC0gc3RhcnQpOwotCQkJCS8vIHRyeSB7Ci0JCQkJLy8gLy8gbGluZS1iYXNlZAotCQkJCS8vIC8vIGV4dHJhIGxpbmUgd2hlbiBjb2xsYXBzZWQsIGJ1dCBubyByZWdpb24KLQkJCQkvLyAvLyBpbmNyZWFzZSB3aGVuIGFkZCBuZXdsaW5lCi0JCQkJLy8gSVJlZ2lvbiBzdGFydExpbmVSZWdpb24gPQotCQkJCS8vIGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkvLyBJUmVnaW9uIGVuZExpbmVSZWdpb24gPQotCQkJCS8vIGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGVuZCk7Ci0JCQkJLy8gaW50IHN0YXJ0T2Zmc2V0ID0gc3RhcnRMaW5lUmVnaW9uLmdldE9mZnNldCgpOwotCQkJCS8vIGludCBlbmRPZmZzZXQgPSBlbmRMaW5lUmVnaW9uLmdldE9mZnNldCgpICsKLQkJCQkvLyBlbmRMaW5lUmVnaW9uLmdldExlbmd0aCgpOwotCQkJCS8vIGlmIChlbmRPZmZzZXQgPiBzdGFydE9mZnNldCkgewotCQkJCS8vIHBvcyA9IG5ldyBQb3NpdGlvbihzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0KLQkJCQkvLyBzdGFydE9mZnNldCk7Ci0JCQkJLy8gfQotCQkJCS8vCi0JCQkJLy8gLy8gbGluZS1iYXNlZAotCQkJCS8vIC8vIG5vIGV4dHJhIGxpbmUgd2hlbiBjb2xsYXBzZWQsIGJ1dCByZWdpb24gaW5jcmVhc2UKLQkJCQkvLyAvLyB3aGVuIGFkZCBuZXdsaW5lCi0JCQkJLy8gaW50IHN0YXJ0TGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJLy8gaW50IGVuZExpbmUgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZW5kKTsKLQkJCQkvLyBpZiAoZW5kTGluZSArIDEgPCBkb2N1bWVudC5nZXROdW1iZXJPZkxpbmVzKCkpIHsKLQkJCQkvLyBpbnQgb2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChzdGFydExpbmUpOwotCQkJCS8vIGludCBlbmRPZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGVuZExpbmUgKyAxKTsKLQkJCQkvLyBwb3MgPSBuZXcgUG9zaXRpb24ob2Zmc2V0LCBlbmRPZmZzZXQgLSBvZmZzZXQpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQkvLyBMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBudWxsLCB4KTsKLQkJCQkvLyB9Ci0JCQl9Ci0JCQkvLyB9Ci0JCX0KLQkJcmV0dXJuIHBvczsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGZvciBub2RlIGluIHRoZSBjdXJyZW50IGxpc3Qgb2YgcHJvamVjdGlvbgotCSAqIGFubm90YXRpb25zIGZvciB0aGlzIGFkYXB0ZXIKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gVGFnUHJvamVjdGlvbkFubm90YXRpb24KLQkgKi8KLQlwcml2YXRlIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGdldEV4aXN0aW5nQW5ub3RhdGlvbihJQ1NTTm9kZSBub2RlKSB7Ci0JCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGFubm8gPSBudWxsOwotCi0JCWlmICgobm9kZSAhPSBudWxsKSAmJiAoIWZUYWdBbm5vdGF0aW9ucy5pc0VtcHR5KCkpKSB7Ci0JCQlJdGVyYXRvciBpdCA9IGZUYWdBbm5vdGF0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSAmJiBhbm5vID09IG51bGwpIHsKLQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBhID0gKFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJSUNTU05vZGUgbiA9IGEuZ2V0Tm9kZSgpOwotCQkJCWlmIChub2RlLmVxdWFscyhuKSkgewotCQkJCQlhbm5vID0gYTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFubm87Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUy5jbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgbm9kZSBpcyBhIG5vZGUgdHlwZSBhYmxlIHRvIGZvbGQKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG5vZGUgaXMgcHJvamVjdGFibGUsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc05vZGVQcm9qZWN0YWJsZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXNob3J0IHR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBJQ1NTTm9kZS5TVFlMRVJVTEVfTk9ERSB8fCB0eXBlID09IElDU1NOb2RlLlBBR0VSVUxFX05PREUgfHwgdHlwZSA9PSBJQ1NTTm9kZS5NRURJQVJVTEVfTk9ERSB8fCB0eXBlID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSB8fCB0eXBlID09IElDU1NOb2RlLkZPTlRGQUNFUlVMRV9OT0RFIHx8IHR5cGUgPT0gSUNTU05vZGUuQ0hBUlNFVFJVTEVfTk9ERSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCS8vIGNoZWNrIGlmIGZvbGRpbmcgaXMgZXZlbiBlbmFibGVkLCBpZiBub3QsIGp1c3QgaWdub3JlIG5vdGlmeUNoYW5nZWQKLQkJLy8gZXZlbnRzCi0JCWlmICghZkFkYXB0ZXJGYWN0b3J5LmlzQWN0aXZlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIHdvcmthcm91bmQgZm9yIEJ1Zzg1MzQyIC0gU1RSVUNUUkVfQ0hBTkdFRCBpcyBuZXZlciBmaXJlZCBzbyBuZWVkCi0JCS8vIHRvIGxpc3RlbiBmb3IgZXZlcnkgQURELCBSRU1PVkUKLQkJLy8gaWYgKChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCkgJiYgKG5vdGlmaWVyCi0JCS8vIGluc3RhbmNlb2YgSUNTU05vZGUpKSB7Ci0JCWlmICgoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQUREIHx8IGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLlJFTU9WRSkgJiYgKG5vdGlmaWVyIGluc3RhbmNlb2YgSUNTU05vZGUpKSB7Ci0JCQl1cGRhdGVBZGFwdGVyKChJQ1NTTm9kZSkgbm90aWZpZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBwcm9qZWN0aW9uIGFubm90YXRpb24gb2YgYWxsIHRoZSBub2RlcyB0aGF0IGFyZSBjaGlsZHJlbiBvZgotCSAqIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXZvaWQgdXBkYXRlQWRhcHRlcihJQ1NTTm9kZSBub2RlKSB7Ci0JCXVwZGF0ZUFkYXB0ZXIobm9kZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBwcm9qZWN0aW9uIGFubm90YXRpb24gb2YgYWxsIHRoZSBub2RlcyB0aGF0IGFyZSBjaGlsZHJlbiBvZgotCSAqIG5vZGUgYW5kIGFkZHMgYWxsIHByb2plY3Rpb24gYW5ub3RhdGlvbnMgdG8gdmlld2VyIChmb3IgbmV3bHkgYWRkZWQKLQkgKiB2aWV3ZXJzKQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXZvaWQgdXBkYXRlQWRhcHRlcihJQ1NTTm9kZSBub2RlLCBQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJTWFwIGFkZGl0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCU1hcCBwcm9qZWN0aW9uQW5ub3RhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCS8vIGdvIHRocm91Z2ggaW1tZWRpYXRlIGNoaWxkIG5vZGVzIGFuZCBmaWd1cmUgb3V0IHByb2plY3Rpb24KLQkJLy8gbW9kZWwgYW5ub3RhdGlvbnMKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJSUNTU05vZGUgY2hpbGROb2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAoY2hpbGROb2RlICE9IG51bGwpIHsKLQkJCQlQb3NpdGlvbiBuZXdQb3MgPSBjcmVhdGVQcm9qZWN0aW9uUG9zaXRpb24oY2hpbGROb2RlKTsKLQkJCQlpZiAobmV3UG9zICE9IG51bGwpIHsKLQkJCQkJVGFnUHJvamVjdGlvbkFubm90YXRpb24gbmV3QW5ub3RhdGlvbiA9IG5ldyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbihjaGlsZE5vZGUsIGZhbHNlKTsKLQkJCQkJVGFnUHJvamVjdGlvbkFubm90YXRpb24gZXhpc3RpbmcgPSBnZXRFeGlzdGluZ0Fubm90YXRpb24oY2hpbGROb2RlKTsKLQkJCQkJaWYgKGV4aXN0aW5nID09IG51bGwpIHsKLQkJCQkJCS8vIGFkZCB0byBtYXAgY29udGFpbmluZyBhbGwgYW5ub3RhdGlvbnMgZm9yIHRoaXMKLQkJCQkJCS8vIGFkYXB0ZXIKLQkJCQkJCXByb2plY3Rpb25Bbm5vdGF0aW9ucy5wdXQobmV3QW5ub3RhdGlvbiwgbmV3UG9zKTsKLQkJCQkJCS8vIGFkZCB0byBtYXAgY29udGFpbmluZyBhbm5vdGF0aW9ucyB0byBhZGQKLQkJCQkJCWFkZGl0aW9ucy5wdXQobmV3QW5ub3RhdGlvbiwgbmV3UG9zKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGFkZCB0byBtYXAgY29udGFpbmluZyBhbGwgYW5ub3RhdGlvbnMgZm9yIHRoaXMKLQkJCQkJCS8vIGFkYXB0ZXIKLQkJCQkJCXByb2plY3Rpb25Bbm5vdGF0aW9ucy5wdXQoZXhpc3RpbmcsIG5ld1Bvcyk7Ci0JCQkJCQkvLyByZW1vdmUgZnJvbSBtYXAgY29udGFpbmluZyBhbm5vdGF0aW9ucyB0byBkZWxldGUKLQkJCQkJCWZUYWdBbm5vdGF0aW9ucy5yZW1vdmUoZXhpc3RpbmcpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNoaWxkTm9kZSA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJfQotCi0JCQkvLyBpbiB0aGUgZW5kLCB3YW50IHRvIGRlbGV0ZSBhbnl0aGluZyBsZWZ0b3ZlciBpbiBvbGQgbGlzdCwgYWRkCi0JCQkvLyBldmVyeXRoaW5nIGluIGFkZGl0aW9ucywgYW5kIHVwZGF0ZSBldmVyeXRoaW5nIGluCi0JCQkvLyBwcm9qZWN0aW9uQW5ub3RhdGlvbnMKLQkJCVByb2plY3Rpb25Bbm5vdGF0aW9uW10gb2xkTGlzdCA9IG51bGw7Ci0JCQlpZiAoIWZUYWdBbm5vdGF0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQlvbGRMaXN0ID0gKFByb2plY3Rpb25Bbm5vdGF0aW9uW10pIGZUYWdBbm5vdGF0aW9ucy5rZXlTZXQoKS50b0FycmF5KG5ldyBQcm9qZWN0aW9uQW5ub3RhdGlvblswXSk7Ci0JCQl9Ci0JCQlQcm9qZWN0aW9uQW5ub3RhdGlvbltdIG1vZGlmeUxpc3QgPSBudWxsOwotCQkJaWYgKCFwcm9qZWN0aW9uQW5ub3RhdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJbW9kaWZ5TGlzdCA9IChQcm9qZWN0aW9uQW5ub3RhdGlvbltdKSBwcm9qZWN0aW9uQW5ub3RhdGlvbnMua2V5U2V0KCkudG9BcnJheShuZXcgUHJvamVjdGlvbkFubm90YXRpb25bMF0pOwotCQkJfQotCi0JCQkvLyBzcGVjaWZpY2FsbHkgYWRkIGFsbCBhbm5vdGF0aW9ucyB0byB2aWV3ZXIKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiAhcHJvamVjdGlvbkFubm90YXRpb25zLmlzRW1wdHkoKSkgewotCQkJCWZBZGFwdGVyRmFjdG9yeS5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobm9kZSwgbnVsbCwgcHJvamVjdGlvbkFubm90YXRpb25zLCBudWxsLCB2aWV3ZXIpOwotCQkJfQotCi0JCQkvLyBvbmx5IHVwZGF0ZSB3aGVuIHRoZXJlIGlzIHNvbWV0aGluZyB0byB1cGRhdGUKLQkJCWlmICgob2xkTGlzdCAhPSBudWxsICYmIG9sZExpc3QubGVuZ3RoID4gMCkgfHwgKCFhZGRpdGlvbnMuaXNFbXB0eSgpKSB8fCAobW9kaWZ5TGlzdCAhPSBudWxsICYmIG1vZGlmeUxpc3QubGVuZ3RoID4gMCkpCi0JCQkJZkFkYXB0ZXJGYWN0b3J5LnF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhub2RlLCBvbGRMaXN0LCBhZGRpdGlvbnMsIG1vZGlmeUxpc3QpOwotCQl9Ci0KLQkJLy8gc2F2ZSBuZXcgbGlzdCBvZiBhbm5vdGF0aW9ucwotCQlmVGFnQW5ub3RhdGlvbnMgPSBwcm9qZWN0aW9uQW5ub3RhdGlvbnM7Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTdHJpbmcgbm9kZU5hbWUgPSBub2RlICE9IG51bGwgPyBub2RlLnRvU3RyaW5nKCkgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJDU1MudXBkYXRlQWRhcHRlciAoIiArIG5vZGVOYW1lICsgIik6IiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZDcyMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IHsKLQkvKioKLQkgKiBMaXN0IG9mIHByb2plY3Rpb24gdmlld2VycyBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdGlvbgotCSAqIG1vZGVsIG5vZGUgYWRhcHRlciBmYWN0b3J5LgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBmUHJvamVjdGlvblZpZXdlcnM7Ci0KLQlwdWJsaWMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTKCkgewotCQl0aGlzKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyQ1NTLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUNTUyhPYmplY3QgYWRhcHRlcktleSkgewotCQlzdXBlcihhZGFwdGVyS2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJDU1MgYWRhcHRlciA9IG51bGw7Ci0KLQkJaWYgKChpc0FjdGl2ZSgpKSAmJiAodGFyZ2V0IGluc3RhbmNlb2YgSUNTU05vZGUpKSB7Ci0JCQlJQ1NTTm9kZSBub2RlID0gKElDU1NOb2RlKSB0YXJnZXQ7Ci0JCQlzaG9ydCB0eXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJLy8gb25seSBhZGQgZm9yIHRvcCBzdHlsZXNoZWV0IG5vZGUKLQkJCWlmICh0eXBlID09IElDU1NOb2RlLlNUWUxFU0hFRVRfTk9ERSkgewotCQkJCWFkYXB0ZXIgPSBuZXcgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJDU1ModGhpcyk7Ci0JCQkJYWRhcHRlci51cGRhdGVBZGFwdGVyKG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBmYWN0b3J5IGlzIGN1cnJlbnRseSBhY3RpdmVseSBtYW5hZ2luZyBwcm9qZWN0aW9uCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCXJldHVybiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwgJiYgIWZQcm9qZWN0aW9uVmlld2Vycy5pc0VtcHR5KCkpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGlmIGRvY3VtZW50IGlzIG5vdCBpbiBmbHV4LgotCSAqIE90aGVyd2lzZSwgcXVldWVzIHVwIHRoZSBjaGFuZ2VzIHRvIGJlIGFwcGxpZWQgd2hlbiBkb2N1bWVudCBpcyByZWFkeS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBkZWxldGlvbnMKLQkgKiBAcGFyYW0gYWRkaXRpb25zCi0JICogQHBhcmFtIG1vZGlmaWNhdGlvbnMKLQkgKi8KLQl2b2lkIHF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhJQ1NTTm9kZSBub2RlLCBBbm5vdGF0aW9uW10gZGVsZXRpb25zLCBNYXAgYWRkaXRpb25zLCBBbm5vdGF0aW9uW10gbW9kaWZpY2F0aW9ucykgewotCQlxdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobm9kZSwgZGVsZXRpb25zLCBhZGRpdGlvbnMsIG1vZGlmaWNhdGlvbnMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGZvciBhIHNwZWNpZmljIHByb2plY3Rpb24gdmlld2VyIGlmCi0JICogZG9jdW1lbnQgaXMgbm90IGluIGZsdXguIE90aGVyd2lzZSwgcXVldWVzIHVwIHRoZSBjaGFuZ2VzIHRvIGJlIGFwcGxpZWQKLQkgKiB3aGVuIGRvY3VtZW50IGlzIHJlYWR5LgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGRlbGV0aW9ucwotCSAqIEBwYXJhbSBhZGRpdGlvbnMKLQkgKiBAcGFyYW0gbW9kaWZpY2F0aW9ucwotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQl2b2lkIHF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhJQ1NTTm9kZSBub2RlLCBBbm5vdGF0aW9uW10gZGVsZXRpb25zLCBNYXAgYWRkaXRpb25zLCBBbm5vdGF0aW9uW10gbW9kaWZpY2F0aW9ucywgUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gY3JlYXRlIGEgY2hhbmdlIG9iamVjdCBmb3IgbGF0ZXN0IGNoYW5nZSBhbmQgYWRkIHRvIHF1ZXVlCi0JCVByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIG5ld0NoYW5nZSA9IG5ldyBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhub2RlLCBkZWxldGlvbnMsIGFkZGl0aW9ucywgbW9kaWZpY2F0aW9ucyk7Ci0JCWlmIChmUHJvamVjdGlvblZpZXdlcnMgIT0gbnVsbCkgewotCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBmUHJvamVjdGlvblZpZXdlcnMuZ2V0KHZpZXdlcik7Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQlpbmZvLnF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhuZXdDaGFuZ2UpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCUl0ZXJhdG9yIGluZm9zID0gZlByb2plY3Rpb25WaWV3ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGluZm9zLmhhc05leHQoKSkgewotCQkJCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IChQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24pIGluZm9zLm5leHQoKTsKLQkJCQkJaW5mby5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobmV3Q2hhbmdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBnbyB0aHJvdWdoIGV2ZXJ5IHByb2plY3Rpb252aWV3ZXIgYW5kIGNhbGwKLQkJLy8gcmVtb3ZlUHJvamVjdGlvblZpZXdlcih2aWV3ZXIpOwotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGluZm9zID0gZlByb2plY3Rpb25WaWV3ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaW5mb3MuaGFzTmV4dCgpKSB7Ci0JCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBpbmZvcy5uZXh0KCk7Ci0JCQkJaW5mby5kaXNwb3NlKCk7Ci0JCQkJaW5mb3MucmVtb3ZlKCk7Ci0JCQl9Ci0JCQlmUHJvamVjdGlvblZpZXdlcnMgPSBudWxsOwotCQl9Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHZpZXdlciB0byBsaXN0IG9mIHByb2plY3Rpb24gdmlld2VycyB0aGlzIGZhY3RvcnkgaXMgYXNzb2NpYXRlZAotCSAqIHdpdGgKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgdmlld2VyJ3MgZG9jdW1lbnQgYW5kIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbAotCSAqICAgICAgICAgICAgYXJlIG5vdCBudWxsCi0JICovCi0Jdm9pZCBhZGRQcm9qZWN0aW9uVmlld2VyKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIHJlbW92ZSBvbGQgZW50cnkgaWYgaXQgZXhpc3RzCi0JCXJlbW92ZVByb2plY3Rpb25WaWV3ZXIodmlld2VyKTsKLQotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzID09IG51bGwpIHsKLQkJCWZQcm9qZWN0aW9uVmlld2VycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgbmV3IG9iamVjdCBjb250YWluaW5nIHByb2plY3Rpb24gdmlld2VyIGFuZCBpdHMgaW5mbwotCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IG5ldyBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24odmlld2VyKTsKLQkJZlByb2plY3Rpb25WaWV3ZXJzLnB1dCh2aWV3ZXIsIGluZm8pOwotCQlpbmZvLmluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiB2aWV3ZXIgZnJvbSB0aGUgbGlzdCBvZiBwcm9qZWN0aW9uIHZpZXdlcnMgdGhpcwotCSAqIGZhY3RvciBpcyBhc3NvY2lhdGVkIHdpdGgKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0Jdm9pZCByZW1vdmVQcm9qZWN0aW9uVmlld2VyKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmUHJvamVjdGlvblZpZXdlcnMgIT0gbnVsbCkgewotCQkJLy8gcmVtb3ZlIGVudHJ5IGZyb20gbGlzdCBvZiB2aWV3ZXJzCi0JCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IChQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24pIGZQcm9qZWN0aW9uVmlld2Vycy5yZW1vdmUodmlld2VyKTsKLQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQlpbmZvLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCS8vIGlmIHJlbW92aW5nIGxhc3QgcHJvamVjdGlvbiB2aWV3ZXIsIGNsZWFyIG91dCBldmVyeXRoaW5nCi0JCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzLmlzRW1wdHkoKSkgewotCQkJCWZQcm9qZWN0aW9uVmlld2VycyA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDU4ZmQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcm9qZWN0aW9uIHZpZXdlciBhbmQgYWxzbyBtYW5hZ2VzIHVwZGF0aW5nCi0gKiB0aGUgdmlld2VyJ3MgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsCi0gKi8KLWNsYXNzIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgbG9jYXRlZCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0KLQkvKioKLQkgKiBMaXN0ZW5zIHRvIGRvY3VtZW50IHRvIGJlIGF3YXJlIG9mIHdoZW4gdG8gdXBkYXRlIHRoZSBwcm9qZWN0aW9uCi0JICogYW5ub3RhdGlvbiBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRMaXN0ZW5lciB7Ci0JCXByaXZhdGUgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGZJbmZvOwotCi0JCXB1YmxpYyBEb2N1bWVudExpc3RlbmVyKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvKSB7Ci0JCQlmSW5mbyA9IGluZm87Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZXZlbnQuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChmSW5mby5nZXREb2N1bWVudCgpID09IGRvY3VtZW50KSB7Ci0JCQkJZkluZm8uc2V0SXNEb2N1bWVudENoYW5naW5nKHRydWUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCS8vIHJlZ2lzdGVyIGEgcG9zdCBub3RpZmljYXRpb24gcmVwbGFjZSBzbyB0aGF0IHByb2plY3Rpb24KLQkJCS8vIGFubm90YXRpb24gbW9kZWwgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGFsbCBkb2N1bWVudENoYW5nZWQKLQkJCS8vIGxpc3RlbmVycyBoYXZlIGJlZW4gbm90aWZpZWQKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGV2ZW50LmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb24gJiYgZkluZm8uZ2V0RG9jdW1lbnQoKSA9PSBkb2N1bWVudCkgewotCQkJCWlmIChmSW5mby5oYXNDaGFuZ2VzUXVldWVkKCkpCi0JCQkJCSgoSURvY3VtZW50RXh0ZW5zaW9uKSBkb2N1bWVudCkucmVnaXN0ZXJQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZSh0aGlzLCBuZXcgUG9zdERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZJbmZvKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFc3NlbnRpYWxseSBhIHBvc3QgZG9jdW1lbnQgY2hhbmdlZCBsaXN0ZW5lciBiZWNhdXNlIGl0IGlzIGNhbGxlZCBhZnRlcgotCSAqIGRvY3VtZW50Y2hhbmdlZCBoYXMgYmVlbiBmaXJlZC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFBvc3REb2N1bWVudENoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElEb2N1bWVudEV4dGVuc2lvbi5JUmVwbGFjZSB7Ci0JCXByaXZhdGUgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGZJbmZvOwotCi0JCXB1YmxpYyBQb3N0RG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8pIHsKLQkJCWZJbmZvID0gaW5mbzsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBlcmZvcm0oSURvY3VtZW50IGRvY3VtZW50LCBJRG9jdW1lbnRMaXN0ZW5lciBvd25lcikgewotCQkJZkluZm8uYXBwbHlBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKCk7Ci0JCQlmSW5mby5zZXRJc0RvY3VtZW50Q2hhbmdpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGN1cnJlbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdGlvbgotCSAqIHZpZXdlcgotCSAqLwotCXByaXZhdGUgUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCBmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbDsKLQkvKioKLQkgKiBEb2N1bWVudCBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdGlvbiB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JLyoqCi0JICogTGlzdGVuZXIgdG8gZlByb2plY3Rpb25WaWV3ZXIncyBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgSURvY3VtZW50TGlzdGVuZXIgZkRvY3VtZW50TGlzdGVuZXI7Ci0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGRvY3VtZW50IGlzIGluIHRoZSBtaWRkbGUgb2YgY2hhbmdpbmcKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZklzRG9jdW1lbnRDaGFuZ2luZyA9IGZhbHNlOwotCS8qKgotCSAqIExpc3Qgb2YgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGNoYW5nZXMgdGhhdCBuZWVkIHRvIGJlIGFwcGxpZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzOwotCi0JcHVibGljIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbihQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlmRG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwgPSB2aWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpOwotCX0KLQotCUlEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0UXVldWVkQW5ub3RhdGlvbkNoYW5nZXMoKSB7Ci0JCWlmIChmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMgPT0gbnVsbCkgewotCQkJZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXM7Ci0JfQotCi0Jdm9pZCBzZXRJc0RvY3VtZW50Q2hhbmdpbmcoYm9vbGVhbiBjaGFuZ2luZykgewotCQlmSXNEb2N1bWVudENoYW5naW5nID0gY2hhbmdpbmc7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRG9jdW1lbnRDaGFuZ2luZygpIHsKLQkJcmV0dXJuIGZJc0RvY3VtZW50Q2hhbmdpbmc7Ci0JfQotCi0JLyoqCi0JICogQXBwbGllcyB0aGUgcGVuZGluZyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgY2hhbmdlcyB0byB0aGUKLQkgKiBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwuCi0JICovCi0Jdm9pZCBhcHBseUFubm90YXRpb25Nb2RlbENoYW5nZXMoKSB7Ci0JCUxpc3QgcXVldWVkQ2hhbmdlcyA9IGdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCk7Ci0JCS8vIGdvIHRocm91Z2ggYWxsIHRoZSBwZW5kaW5nIGFubm90YXRpb24gY2hhbmdlcyBhbmQgYXBwbHkKLQkJLy8gdGhlbSB0bwotCQkvLyB0aGUgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsCi0JCXdoaWxlICghcXVldWVkQ2hhbmdlcy5pc0VtcHR5KCkpIHsKLQkJCVByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIGNoYW5nZXMgPSAoUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMpIHF1ZXVlZENoYW5nZXMucmVtb3ZlKDApOwotCQkJdHJ5IHsKLQkJCQlmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbC5tb2RpZnlBbm5vdGF0aW9ucyhjaGFuZ2VzLmdldERlbGV0aW9ucygpLCBjaGFuZ2VzLmdldEFkZGl0aW9ucygpLCBjaGFuZ2VzLmdldE1vZGlmaWNhdGlvbnMoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZiBhbnl0aGluZyBnb2VzIHdyb25nLCBsb2cgaXQgYmUgY29udGludWUKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIGFubm90YXRpb24gY2hhbmdlcyBxdWV1ZWQgdXAsIGZhbHNlIG90aGVyd2lzZQotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaGFzQ2hhbmdlc1F1ZXVlZCgpIHsKLQkJcmV0dXJuICFnZXRRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcygpLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBpZiBkb2N1bWVudCBpcyBub3QgaW4gZmx1eC4KLQkgKiBPdGhlcndpc2UsIHF1ZXVlcyB1cCB0aGUgY2hhbmdlcyB0byBiZSBhcHBsaWVkIHdoZW4gZG9jdW1lbnQgaXMgcmVhZHkuCi0JICovCi0JcHVibGljIHZvaWQgcXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIG5ld0NoYW5nZSkgewotCQkvKgotCQkgKiBmdXR1cmVfVE9ETzogbWF5YmUgaW1wcm92ZSBieSBjaGVja2luZyBpZiBhbm5vdGF0aW9uIHByb2plY3Rpb24KLQkJICogbW9kZWwgY2hhbmdlIGFscmVhZHkgZXhpc3RzIGZvciBub2RlLiBpZiBzbywgdGhyb3cgb3V0IG9sZCBjaGFuZ2UuCi0JCSAqLwotCQlnZXRRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcygpLmFkZChuZXdDaGFuZ2UpOwotCi0JCS8vIGlmIGRvY3VtZW50IGlzbid0IGNoYW5naW5nLCBnbyBhaGVhZCBhbmQgYXBwbHkgaXQKLQkJaWYgKCFpc0RvY3VtZW50Q2hhbmdpbmcoKSkgewotCQkJYXBwbHlBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQkvLyBhZGQgZG9jdW1lbnQgbGlzdGVuZXIKLQkJaWYgKGZEb2N1bWVudExpc3RlbmVyID09IG51bGwpIHsKLQkJCWZEb2N1bWVudExpc3RlbmVyID0gbmV3IERvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJZ2V0RG9jdW1lbnQoKS5hZGREb2N1bWVudExpc3RlbmVyKGZEb2N1bWVudExpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyByZW1vdmUgZG9jdW1lbnQgbGlzdGVuZXIKLQkJaWYgKGZEb2N1bWVudExpc3RlbmVyICE9IG51bGwpIHsKLQkJCWdldERvY3VtZW50KCkucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcihmRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyBjbGVhciBvdXQgbGlzdCBvZiBxdWV1ZWQgY2hhbmdlcyBzaW5jZSBpdCBtYXkgbm8gbG9uZ2VyCi0JCS8vIGJlIGFjY3VyYXRlCi0JCWlmIChmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMgIT0gbnVsbCkgewotCQkJZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzLmNsZWFyKCk7Ci0JCQlmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1N0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMDYyMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uSVByb2plY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb24uSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyOwotCi0vKioKLSAqIFVwZGF0ZXMgdGhlIHByb2plY3Rpb24gbW9kZWwgb2YgYSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciBDU1MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckNTUyBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlciwgSVByb2plY3Rpb25MaXN0ZW5lciwgSVRleHRJbnB1dExpc3RlbmVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGRlYnVnUHJvamVjdGlvblBlcmYgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmNzcy51aS9wcm9qZWN0aW9ucGVyZiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkXAotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgUHJvamVjdGlvblZpZXdlciBmVmlld2VyOwotCXByaXZhdGUgYm9vbGVhbiBmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEp1c3QgYWRkIGFkYXB0ZXIgdG8gdG9wIHN0eWxlc2hlZXQgbm9kZS4gVGhpcyBhZGFwdGVyIHdpbGwgdHJhY2sKLQkgKiBjaGlsZHJlbiBhZGRpdGlvbi9kZWxldGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQWxsQWRhcHRlcnMoKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJCWlmIChzTW9kZWwgaW5zdGFuY2VvZiBJQ1NTTW9kZWwpIHsKLQkJCQkJSUNTU01vZGVsIGNzc01vZGVsID0gKElDU1NNb2RlbCkgc01vZGVsOwotCQkJCQlJQ1NTRG9jdW1lbnQgY3NzRG9jID0gY3NzTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJaWYgKGNzc0RvYyBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCQkJCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgY3NzRG9jOwotCQkJCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJDU1MgYWRhcHRlciA9IChQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUykgbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyQ1NTLmNsYXNzKTsKLQkJCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCQlhZGFwdGVyLnVwZGF0ZUFkYXB0ZXIoY3NzRG9jLCBmVmlld2VyKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGp1c3QgY2FsbCBnZXRhZGFwdGVyIHNvIHRoZSBhZGFwdGVyIGlzIGNyZWF0ZWQKLQkJCQkJCQkvLyBhbmQKLQkJCQkJCQkvLyBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVkCi0JCQkJCQkJbm90aWZpZXIuZ2V0QWRhcHRlckZvcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUy5jbGFzcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckNTUy5hZGRBbGxBZGFwdGVyczogIiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUNTUyB0byB1c2Ugd2l0aCB0aGlzIHByb3ZpZGVyLgotCSAqIAotCSAqIEByZXR1cm4gUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTCi0JICovCi0JcHJpdmF0ZSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MgZ2V0QWRhcHRlckZhY3RvcnkoYm9vbGVhbiBjcmVhdGVJZk5lZWRlZCkgewotCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MgZmFjdG9yeSA9IG51bGw7Ci0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCUZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5UmVnaXN0cnkgPSBzTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0KLQkJCQkJLy8gZ2V0dGluZyB0aGUgcHJvamVjdGlvbm1vZGVsbm9kZWFkYXB0ZXIgZm9yIHRoZSBmaXJzdAotCQkJCQkvLyB0aW1lCi0JCQkJCS8vIHNvIGRvIHNvbWUgaW5pdGlhbGl6aW5nCi0JCQkJCWlmICghZmFjdG9yeVJlZ2lzdHJ5LmNvbnRhaW5zKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyQ1NTLmNsYXNzKSAmJiBjcmVhdGVJZk5lZWRlZCkgewotCQkJCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTIG5ld0ZhY3RvcnkgPSBuZXcgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTKCk7Ci0KLQkJCQkJCS8vIGFkZCBmYWN0b3J5IHRvIGZhY3RvcnkgcmVnaXN0cnkKLQkJCQkJCWZhY3RvcnlSZWdpc3RyeS5hZGRGYWN0b3J5KG5ld0ZhY3RvcnkpOwotCQkJCQl9Ci0KLQkJCQkJLy8gdHJ5IGFuZCBnZXQgdGhlIGZhY3RvcnkKLQkJCQkJZmFjdG9yeSA9IChQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MpIGZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5Rm9yKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyQ1NTLmNsYXNzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoaXMgcHJvdmlkZXIgd2l0aCB0aGUgY29ycmVjdCBkb2N1bWVudC4gQXNzdW1lcyBwcm9qZWN0aW9uCi0JICogaXMgZW5hYmxlZC4gKG90aGVyd2lzZSwgb25seSBpbnN0YWxsIHdvdWxkIGhhdmUgYmVlbiBjYWxsZWQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaWYgKCFpc0luc3RhbGxlZCgpKQotCQkJcmV0dXJuOwotCi0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJLy8gY2xlYXIgb3V0IG9sZCBpbmZvCi0JCXByb2plY3Rpb25EaXNhYmxlZCgpOwotCi0JCWZEb2N1bWVudCA9IGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQotCQkvLyBzZXQgcHJvamVjdGlvbiB2aWV3ZXIgb24gbmV3IGRvY3VtZW50J3MgYWRhcHRlciBmYWN0b3J5Ci0JCWlmIChmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKSAhPSBudWxsKSB7Ci0JCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MgZmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5KHRydWUpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkuYWRkUHJvamVjdGlvblZpZXdlcihmVmlld2VyKTsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk4MzA0Ci0JCQkJLy8gZGlzYWJsZSByZWRyYXcgd2hpbGUgYWRkaW5nIGFsbCBhZGFwdGVycwotCQkJCWZWaWV3ZXIuc2V0UmVkcmF3KGZhbHNlKTsKLQkJCQlhZGRBbGxBZGFwdGVycygpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJZlZpZXdlci5zZXRSZWRyYXcodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyQ1NTLmluaXRpYWxpemU6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQXNzb2NpYXRlIGEgUHJvamVjdGlvblZpZXdlciB3aXRoIHRoaXMgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyCi0JICogCi0JICogQHBhcmFtIHZpZXdlciAtCi0JICogICAgICAgICAgICBhc3N1bWVzIG5vdCBudWxsCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQkvLyB1bmluc3RhbGwgYmVmb3JlIHRyeWluZyB0byBpbnN0YWxsIG5ldyB2aWV3ZXIKLQkJaWYgKGlzSW5zdGFsbGVkKCkpIHsKLQkJCXVuaW5zdGFsbCgpOwotCQl9Ci0JCWZWaWV3ZXIgPSB2aWV3ZXI7Ci0JCWZWaWV3ZXIuYWRkUHJvamVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlmVmlld2VyLmFkZFRleHRJbnB1dExpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0luc3RhbGxlZCgpIHsKLQkJcmV0dXJuIGZWaWV3ZXIgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9qZWN0aW9uRGlzYWJsZWQoKSB7Ci0JCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUNTUyBmYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkoZmFsc2UpOwotCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlmYWN0b3J5LnJlbW92ZVByb2plY3Rpb25WaWV3ZXIoZlZpZXdlcik7Ci0JCX0KLQotCQkvLyBjbGVhciBvdXQgYWxsIGFubm90YXRpb25zCi0JCWlmIChmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKSAhPSBudWxsKQotCQkJZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkucmVtb3ZlQWxsQW5ub3RhdGlvbnMoKTsKLQotCQlyZW1vdmVBbGxBZGFwdGVycygpOwotCi0JCWZEb2N1bWVudCA9IG51bGw7Ci0JCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb2plY3Rpb25FbmFibGVkKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhZGFwdGVyIGZyb20gdG9wIHN0eWxlc2hlZXQgbm9kZQotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVBbGxBZGFwdGVycygpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0JCQkJaWYgKHNNb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJCQlJQ1NTTW9kZWwgY3NzTW9kZWwgPSAoSUNTU01vZGVsKSBzTW9kZWw7Ci0JCQkJCUlDU1NEb2N1bWVudCBjc3NEb2MgPSBjc3NNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCQlpZiAoY3NzRG9jIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBjc3NEb2M7Ci0JCQkJCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUy5jbGFzcyk7Ci0JCQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQkJbm90aWZpZXIucmVtb3ZlQWRhcHRlcihhZGFwdGVyKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyQ1NTLmFkZEFsbEFkYXB0ZXJzOiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCS8vIGlmIGZvbGRpbmcgaXMgZW5hYmxlZCBhbmQgbmV3IGRvY3VtZW50IGlzIGdvaW5nIHRvIGJlIGEgdG90YWxseQotCQkvLyBkaWZmZXJlbnQgZG9jdW1lbnQsIGRpc2FibGUgcHJvamVjdGlvbgotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwgJiYgZkRvY3VtZW50ICE9IG5ld0lucHV0KSB7Ci0JCQkvLyBkaXNhYmxlIHByb2plY3Rpb24gYW5kIGRpc2Nvbm5lY3QgZXZlcnl0aGluZwotCQkJcHJvamVjdGlvbkRpc2FibGVkKCk7Ci0JCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXREb2N1bWVudENoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJLy8gaWYgcHJvamVjdGlvbiB3YXMgcHJldmlvdXNseSBlbmFibGVkIGJlZm9yZSBpbnB1dCBkb2N1bWVudCBjaGFuZ2VkCi0JCS8vIGFuZCBuZXcgZG9jdW1lbnQgaXMgZGlmZmVyZW50IHRoYW4gb2xkIGRvY3VtZW50Ci0JCWlmIChmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgJiYgZkRvY3VtZW50ID09IG51bGwgJiYgbmV3SW5wdXQgIT0gbnVsbCkgewotCQkJcHJvamVjdGlvbkVuYWJsZWQoKTsKLQkJCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzY29ubmVjdCB0aGlzIElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlciBmcm9tIHByb2plY3Rpb24gdmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsKCkgewotCQlpZiAoaXNJbnN0YWxsZWQoKSkgewotCQkJcHJvamVjdGlvbkRpc2FibGVkKCk7Ci0KLQkJCWZWaWV3ZXIucmVtb3ZlUHJvamVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkJZlZpZXdlci5yZW1vdmVUZXh0SW5wdXRMaXN0ZW5lcih0aGlzKTsKLQkJCWZWaWV3ZXIgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQ1NTUHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0NTU1Byb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNjBlOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQ1NTUHJvcGVydHlTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTTWV0YU1vZGVsRmluZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbC5DU1NNZXRhTW9kZWxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBBIElQcm9wZXJ0eVNvdXJjZSBpbXBsZW1lbnRhdGlvbiBmb3IgYSBKRmFjZSB2aWV3ZXIgdXNlZCB0byBkaXNwbGF5Ci0gKiBwcm9wZXJ0aWVzIG9mIENTUyBub2Rlcy4KLSAqLwotcHVibGljIGNsYXNzIENTU1Byb3BlcnR5U291cmNlIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlLCBJUHJvcGVydHlTb3VyY2VFeHRlbnNpb24gewotCXByb3RlY3RlZCBJQ1NTTm9kZSBmTm9kZSA9IG51bGw7Ci0JLy8gZm9yIHBlcmZvcm1hbmNlLi4uCi0JZmluYWwgc3RhdGljIENsYXNzIEFEQVBURVJfS0VZID0gSVByb3BlcnR5U291cmNlLmNsYXNzOwotCWZpbmFsIGJvb2xlYW4gUEVSRl9HRVRERVNDUklQVE9SUyA9IGZhbHNlOwotCXByaXZhdGUgbG9uZyB0aW1lMDsKLQotCXB1YmxpYyBDU1NQcm9wZXJ0eVNvdXJjZShJQ1NTTm9kZSB0YXJnZXQpIHsKLQkJc3VwZXIoKTsKLQkJZk5vZGUgPSAgdGFyZ2V0OwotCX0KLQotCXByb3RlY3RlZCBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJLy8gdGhlIGRpc3BsYXlOYW1lIE1VU1QgYmUgc2V0Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDU1NUZXh0UHJvcGVydHlEZXNjcmlwdG9yKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZU5hbWUsIGZOb2RlKTsKLQkJLy8gSVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3Ci0JCS8vIFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZSk7Ci0JCXJldHVybiBkZXNjcmlwdG9yOwotCX0KLQotCXByb3RlY3RlZCBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihDU1NNTU5vZGUgbm9kZSwgU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCXJldHVybiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3Iobm9kZS5nZXROYW1lKCksIGNhdGVnb3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIG5hbWUsIFN0cmluZyBjYXRlZ29yeSkgewotCQlJUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBudWxsOwotCQlpZiAobmFtZSAhPSBudWxsICYmIDAgPCBuYW1lLmxlbmd0aCgpKSB7Ci0JCQluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKGNhdGVnb3J5ID09IG51bGwpIHsKLQkJCQljYXRlZ29yeSA9IENTU1VJTWVzc2FnZXMuSU5GT19Ob3RfQ2F0ZWdvcml6ZWRfMTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZGVzY3JpcHRvciA9IG5ldyBDU1NUZXh0UHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIG5hbWUsIGZOb2RlLCBjYXRlZ29yeSk7Ci0JCQkvLyBpZiAoY2F0ZWdvcnkgPT0gbnVsbCkgewotCQkJLy8gZGVzY3JpcHRvciA9IG5ldyBDU1NUZXh0UHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIG5hbWUsIGZOb2RlKTsKLQkJCS8vIH0gZWxzZSB7Ci0JCQkvLyBkZXNjcmlwdG9yID0gbmV3IENTU1RleHRQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwgbmFtZSwgZk5vZGUsCi0JCQkvLyBjYXRlZ29yeSk7Ci0JCQkvLyB9Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHZhbHVlIGZvciB0aGlzIG9iamVjdCB0aGF0IGNhbiBiZSBlZGl0dGVkIGluIGEgcHJvcGVydHkKLQkgKiBzaGVldC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgdmFsdWUgdGhhdCBjYW4gYmUgZWRpdHRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBjb2xsZWN0aW9uIG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzLgotCSAqIAotCSAqIEByZXR1cm4gYSB2ZWN0b3IgY29udGFpbmluZyBhbGwgZGVzY3JpcHRvcnMuCi0JICovCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCUNTU01ldGFNb2RlbCBtZXRhbW9kZWwgPSBDU1NNZXRhTW9kZWxGaW5kZXIuZ2V0SW5zdGFuY2UoKS5maW5kTWV0YU1vZGVsRm9yKGZOb2RlKTsKLQkJSXRlcmF0b3IgaVByb3BlcnRpZXMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCXN3aXRjaCAoZk5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBJQ1NTTm9kZS5TVFlMRVJVTEVfTk9ERSA6Ci0JCQljYXNlIElDU1NOb2RlLkZPTlRGQUNFUlVMRV9OT0RFIDoKLQkJCWNhc2UgSUNTU05vZGUuUEFHRVJVTEVfTk9ERSA6Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSA6Ci0JCQkJQ1NTTU1Ob2RlIG1tUGFyZW50ID0gbmV3IENTU01ldGFNb2RlbFV0aWwobWV0YW1vZGVsKS5nZXRNZXRhTW9kZWxOb2RlRm9yKGZOb2RlKTsKLQkJCQlpZiAobW1QYXJlbnQgIT0gbnVsbCkgewotCQkJCQlpUHJvcGVydGllcyA9IG1tUGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTElURU1fTk9ERSA6Ci0JCQkJQ1NTTU1Ob2RlIG1tTm9kZSA9IG5ldyBDU1NNZXRhTW9kZWxVdGlsKG1ldGFtb2RlbCkuZ2V0TWV0YU1vZGVsTm9kZUZvcihmTm9kZSk7Ci0JCQkJaWYgKG1tTm9kZSAhPSBudWxsKSB7Ci0JCQkJCWlQcm9wZXJ0aWVzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtbU5vZGUpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQkvLyBzZXR1cCBjYXRlZ29yaWVzCi0JCU1hcCBjYXRlZ29yaWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJSXRlcmF0b3IgaUNhdGVnb3JpZXMgPSBtZXRhbW9kZWwuZ2V0Q2F0ZWdvcmllcygpOwotCQl3aGlsZSAoaUNhdGVnb3JpZXMuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTUNhdGVnb3J5IGNhdGVnb3J5ID0gKENTU01NQ2F0ZWdvcnkpIGlDYXRlZ29yaWVzLm5leHQoKTsKLQkJCWNhdGVnb3JpZXMucHV0KGNhdGVnb3J5LmdldE5hbWUoKSwgY2F0ZWdvcnkuZ2V0Q2FwdGlvbigpKTsKLQkJfQotCi0JCS8vIGNvbGxlY3QgcHJvcGVydHkgbmFtZXMKLQkJU2V0IGRlY2xhcmVkUHJvcGVydGllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChpUHJvcGVydGllcy5oYXNOZXh0KCkpIHsKLQkJCUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBnZXREZWNsYXJhdGlvbk5vZGUoKTsKLQkJCWlmIChkZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJSUNTU05vZGVMaXN0IG5vZGVMaXN0ID0gKChJQ1NTTm9kZSkgZGVjbGFyYXRpb24pLmdldENoaWxkTm9kZXMoKTsKLQkJCQlpbnQgblByb3BzID0gKG5vZGVMaXN0ICE9IG51bGwpID8gbm9kZUxpc3QuZ2V0TGVuZ3RoKCkgOiAwOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgblByb3BzOyBpKyspIHsKLQkJCQkJSUNTU05vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQkJCWlmIChub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pIHsKLQkJCQkJCVN0cmluZyBuYW1lID0gKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZSkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCQkJCQlpZiAobmFtZSAhPSBudWxsICYmIDAgPCBuYW1lLmxlbmd0aCgpKSB7Ci0JCQkJCQkJZGVjbGFyZWRQcm9wZXJ0aWVzLmFkZChuYW1lLnRvTG93ZXJDYXNlKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJTGlzdCBkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBmaXJzdDogcHJvcGVydGllcyBmcm9tIGNvbnRlbnQgbW9kZWwKLQkJd2hpbGUgKGlQcm9wZXJ0aWVzLmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpUHJvcGVydGllcy5uZXh0KCk7Ci0JCQlpZiAobm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfUFJPUEVSVFkgfHwgbm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfREVTQ1JJUFRPUikgewotCQkJCVN0cmluZyBjYXRlZ29yeSA9IChTdHJpbmcpIGNhdGVnb3JpZXMuZ2V0KG5vZGUuZ2V0QXR0cmlidXRlKCJjYXRlZ29yeSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBuYW1lID0gbm9kZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKTsKLQkJCQlpZiAoZGVjbGFyZWRQcm9wZXJ0aWVzLmNvbnRhaW5zKG5hbWUpKSB7Ci0JCQkJCWRlY2xhcmVkUHJvcGVydGllcy5yZW1vdmUobmFtZSk7Ci0JCQkJfQotCQkJCUlQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBjYXRlZ29yeSk7Ci0JCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQlkZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gc2Vjb25kOiBleGlzdGluZyBwcm9wZXJ0aWVzIGJ1dCBub3QgaW4gY29udGVudCBtb2RlbAotCQlJdGVyYXRvciBpUmVtYWlucyA9IGRlY2xhcmVkUHJvcGVydGllcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaVJlbWFpbnMuaGFzTmV4dCgpKSB7Ci0JCQlJUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoKFN0cmluZykgaVJlbWFpbnMubmV4dCgpLCBudWxsKTsKLQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQlkZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0JCQl9Ci0JCX0KLQotCQlJUHJvcGVydHlEZXNjcmlwdG9yW10gcmVzdWx0QXJyYXkgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltkZXNjcmlwdG9ycy5zaXplKCldOwotCQlpZiAoUEVSRl9HRVRERVNDUklQVE9SUykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzOiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiAoSVByb3BlcnR5RGVzY3JpcHRvcltdKSBkZXNjcmlwdG9ycy50b0FycmF5KHJlc3VsdEFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGUgbmFtZWQgcHJvcGVydHkuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBhcyBuYW1lZCBieSBpdHMgcHJvcGVydHkgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJU3RyaW5nIHZhbHVlU3RyaW5nID0gbnVsbDsKLQkJU3RyaW5nIG5hbWVTdHJpbmcgPSBuYW1lLnRvU3RyaW5nKCk7Ci0KLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IG51bGw7Ci0KLQkJc3dpdGNoIChmTm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTElURU1fTk9ERSA6Ci0JCQkJdmFsdWVTdHJpbmcgPSAoKElDU1NTdHlsZURlY2xJdGVtKSBmTm9kZSkuZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFUlVMRV9OT0RFIDoKLQkJCWNhc2UgSUNTU05vZGUuRk9OVEZBQ0VSVUxFX05PREUgOgotCQkJY2FzZSBJQ1NTTm9kZS5QQUdFUlVMRV9OT0RFIDoKLQkJCQlkZWNsYXJhdGlvbiA9IChDU1NTdHlsZURlY2xhcmF0aW9uKSBmTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCQkJdmFsdWVTdHJpbmcgPSBkZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKG5hbWVTdHJpbmcpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFIDoKLQkJCQl2YWx1ZVN0cmluZyA9ICgoQ1NTU3R5bGVEZWNsYXJhdGlvbikgZk5vZGUpLmdldFByb3BlcnR5VmFsdWUobmFtZVN0cmluZyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlBSSU1JVElWRVZBTFVFX05PREUgOgotCQkJCUlDU1NOb2RlIHBhcmVudCA9IGZOb2RlOwotCQkJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKSkgewotCQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCX0KLQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJdmFsdWVTdHJpbmcgPSAoKElDU1NTdHlsZURlY2xJdGVtKSBwYXJlbnQpLmdldENTU1ZhbHVlVGV4dCgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHZhbHVlU3RyaW5nID09IG51bGwpIHsKLQkJCXZhbHVlU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiB2YWx1ZVN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHByb3BlcnR5IHZhbHVlIGhhcyBjaGFuZ2VkIGZyb20gdGhlIGRlZmF1bHQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBoYXMKLQkgKiAgICAgICAgIGNoYW5nZWQgZnJvbSBpdHMgb3JpZ2luYWwgZGVmYXVsdCB2YWx1ZTsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eVNldChPYmplY3QgcHJvcGVydHkpIHsKLQkJaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gZ2V0RGVjbGFyYXRpb25Ob2RlKCk7Ci0JCWlmIChkZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBkZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5LnRvU3RyaW5nKCkpOwotCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgMCA8IHZhbHVlLmxlbmd0aCgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkncyB2YWx1ZSB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSB0byByZXNldAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3Qgc3RyKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBnZXREZWNsYXJhdGlvbk5vZGUoKTsKLQkJaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCWRlY2xhcmF0aW9uLnJlbW92ZVByb3BlcnR5KHN0ci50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWVkIHByb3BlcnR5IHRvIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIHNldAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgdmFsdWVTdHJpbmcgPSAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZS50b1N0cmluZygpIDogbnVsbDsKLQkJU3RyaW5nIG5hbWVTdHJpbmcgPSBuYW1lLnRvU3RyaW5nKCk7Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBnZXREZWNsYXJhdGlvbk5vZGUoKTsKLQkJaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHZhbHVlU3RyaW5nID09IG51bGwgfHwgdmFsdWVTdHJpbmcubGVuZ3RoKCkgPD0gMCkgewotCQkJCQlkZWNsYXJhdGlvbi5yZW1vdmVQcm9wZXJ0eShuYW1lU3RyaW5nKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRlY2xhcmF0aW9uLnNldFByb3BlcnR5KG5hbWVTdHJpbmcsIHZhbHVlU3RyaW5nLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJU3RyaW5nIHRpdGxlID0gQ1NTVUlNZXNzYWdlcy5UaXRsZV9JbnZhbGlkVmFsdWU7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IENTU1VJTWVzc2FnZXMuTWVzc2FnZV9JbnZhbGlkVmFsdWU7IC8vJE5PTi1OTFMtMSQKLQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5XYXJuaW5nKHdpbmRvdy5nZXRTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb25Ob2RlKCkgewotCQlDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gbnVsbDsKLQotCQlzd2l0Y2ggKGZOb2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVERUNMSVRFTV9OT0RFIDoKLQkJCQlkZWNsYXJhdGlvbiA9IChDU1NTdHlsZURlY2xhcmF0aW9uKSBmTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFUlVMRV9OT0RFIDoKLQkJCWNhc2UgSUNTU05vZGUuRk9OVEZBQ0VSVUxFX05PREUgOgotCQkJY2FzZSBJQ1NTTm9kZS5QQUdFUlVMRV9OT0RFIDoKLQkJCQlkZWNsYXJhdGlvbiA9IChDU1NTdHlsZURlY2xhcmF0aW9uKSBmTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSA6Ci0JCQkJZGVjbGFyYXRpb24gPSAoQ1NTU3R5bGVEZWNsYXJhdGlvbikgZk5vZGU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDU1NOb2RlLlBSSU1JVElWRVZBTFVFX05PREUgOgotCQkJCUlDU1NOb2RlIHBhcmVudCA9IGZOb2RlOwotCQkJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb24pKSB7Ci0JCQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJfQotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlkZWNsYXJhdGlvbiA9IChDU1NTdHlsZURlY2xhcmF0aW9uKSBwYXJlbnQ7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gZGVjbGFyYXRpb247Ci0JfQotCi0JLy8gQnVnIDEzMDAzOSAtIEltcGxlbWVudCBJUHJvcGVydHlTb3VyY2VFeHRlbnNpb24KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5UmVtb3ZhYmxlKE9iamVjdCBuYW1lKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KE9iamVjdCBuYW1lKSB7Ci0JCWlmKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBnZXREZWNsYXJhdGlvbk5vZGUoKTsKLQkJCi0JCWlmKGRlY2xhcmF0aW9uICE9IG51bGwpCi0JCQlkZWNsYXJhdGlvbi5yZW1vdmVQcm9wZXJ0eShuYW1lLnRvU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0NTU1RleHRQcm9wZXJ0eURlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0NTU1RleHRQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdjMjdhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9DU1NUZXh0UHJvcGVydHlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5UZXh0UHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1BhdGhTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NUZXh0UHJvcGVydHlEZXNjcmlwdG9yIGV4dGVuZHMgVGV4dFByb3BlcnR5RGVzY3JpcHRvciB7Ci0JcHJpdmF0ZSBmaW5hbCBJQ1NTTm9kZSBmTm9kZTsKLQotCS8qKgotCSAqIENTU1RleHRQcm9wZXJ0eURlc2NyaXB0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGlzcGxheU5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ1NTVGV4dFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgaWQsIFN0cmluZyBkaXNwbGF5TmFtZSwgSUNTU05vZGUgbm9kZSkgewotCQlzdXBlcihpZCwgZGlzcGxheU5hbWUpOwotCQl0aGlzLmZOb2RlID0gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgQ1NTVGV4dFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgaWQsIFN0cmluZyBkaXNwbGF5TmFtZSwgSUNTU05vZGUgbm9kZSwgU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCXN1cGVyKGlkLCBkaXNwbGF5TmFtZSk7Ci0JCXRoaXMuZk5vZGUgPSBub2RlOwotCQlzZXRDYXRlZ29yeShjYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3IKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgQ2VsbEVkaXRvciBjcmVhdGVQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGZOb2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAobW9kZWwuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRVhURVJOQUwgJiYgZmluZEVkaXRvcihtb2RlbCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBjaGVjayB3aGV0aGVyIElGaWxlIGlzIHJlYWRvbmx5IHRvIHByb2hpYml0IGVkaXRpbmcgYmVmb3JlCi0JCS8vIHZhbGlkYXRlRWRpdCgpCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbW9kZWw7Ci0JCWlmIChtb2RlbC5nZXRTdHlsZVNoZWV0VHlwZSgpICE9IElDU1NNb2RlbC5FWFRFUk5BTCkgewotCQkJc3RydWN0dXJlZE1vZGVsID0gKChJRE9NTm9kZSkgbW9kZWwuZ2V0T3duZXJET01Ob2RlKCkpLmdldE1vZGVsKCk7Ci0JCQlpZiAoc3RydWN0dXJlZE1vZGVsID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSUZpbGUgZmlsZSA9IENTU1BhdGhTZXJ2aWNlLmxvY2F0aW9uMkZpbGUoc3RydWN0dXJlZE1vZGVsLmdldEJhc2VMb2NhdGlvbigpKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCB8fCBmaWxlLmlzUmVhZE9ubHkoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiBzdXBlci5jcmVhdGVQcm9wZXJ0eUVkaXRvcihwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElFZGl0b3JQYXJ0IGZpbmRFZGl0b3IoSUNTU01vZGVsIG1vZGVsKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJSVdvcmtiZW5jaFdpbmRvd1tdIHdpbmRvd3MgPSB3b3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd3MubGVuZ3RoOyBpKyspIHsKLQkJCUlXb3JrYmVuY2hQYWdlW10gcGFnZXMgPSB3aW5kb3dzW2ldLmdldFBhZ2VzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHBhZ2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvcnMgPSBwYWdlc1tqXS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBlZGl0b3JzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCUlFZGl0b3JQYXJ0IGVkaXRQYXJ0ID0gZWRpdG9yc1trXS5nZXRFZGl0b3IoZmFsc2UpOwotCQkJCQlpZiAoZWRpdFBhcnQgIT0gbnVsbCkgewotCQkJCQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZWRpdFBhcnQuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQkJCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCQkJCQlJRmlsZSBmaWxlID0gKChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dCkuZ2V0RmlsZSgpOwotCQkJCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJCQkJLy9UT0RPIFVyZ2VudCBuZWVkcyB0byBiZSBmaXhlZAotCQkJCQkJCQkvLyBJIHRoaW5rIHdlIG5lZWQgJ2VxdWFscycgKG9yICdlcXVpdmFsZW50JwotCQkJCQkJCQkvLyBvbiBtb2RlbCkgZm9yIGNhc2VzIGxpa2UgdGhpcwotCQkJCQkJCQlpZiAoU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5jYWxjdWxhdGVJZChmaWxlKS5lcXVhbHMobW9kZWwuZ2V0SWQoKSkpIHsKLQkJCQkJCQkJCXJldHVybiBlZGl0UGFydDsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE3ZGNiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJDU1MgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihJRG9jdW1lbnRUeXBlSGFuZGxlciBjb250ZW50VHlwZURlc2NyaXB0aW9uKSB7Ci0JCXJldHVybiAoY29udGVudFR5cGVEZXNjcmlwdGlvbiBpbnN0YW5jZW9mIE1vZGVsSGFuZGxlckZvckNTUyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQWRhcHRlckZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyBhZGQgdGhlIG5vcm1hbCBjb250ZW50IGJhc2VkIGZhY3RvcmllcyB0byBtb2RlbCdzIHJlZ2lzdHJ5Ci0JCWFkZENvbnRlbnRCYXNlZEZhY3RvcmllcyhzdHJ1Y3R1cmVkTW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRlbnRCYXNlZEZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5ID0gc3RydWN0dXJlZE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGZhY3RvcnlSZWdpc3RyeSwgIlByb2dyYW0gRXJyb3I6IGNsaWVudCBjYWxsZXIgbXVzdCBlbnN1cmUgbW9kZWwgaGFzIGZhY3RvcnkgcmVnaXN0cnkiKTsgLy8kTk9OLU5MUy0xJAotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCi0JCWZhY3RvcnkgPSBmYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCWZhY3RvcnkgPSBuZXcgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlDU1MoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCQkJZmFjdG9yeVJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWluaXRpYWxpemVGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nQ1NTQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ0NTU0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMWE3MjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nQ1NTQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogU2VsZWN0cyBlbmNsb3NpbmcgQ1NTIGVsZW1lbnQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdDU1NBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIFN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KENTU1VJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChDU1NVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihDU1NVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19kZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24gPSBudWxsOwotCi0JCWluZGV4ZWRSZWdpb24gPSBnZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQotCQlyZXR1cm4gaW5kZXhlZFJlZ2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVnaW9uIGdldE5ld1NlbGVjdGlvblJlZ2lvbihJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24sIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJUmVnaW9uIG5ld1JlZ2lvbiA9IG51bGw7Ci0JCWlmIChpbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCUlDU1NOb2RlIGN1cnNvck5vZGUgPSAoSUNTU05vZGUpIGluZGV4ZWRSZWdpb247Ci0JCQlSZWdpb24gY3Vyc29yTm9kZVJlZ2lvbiA9IG5ldyBSZWdpb24oaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBpbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCWludCBjdXJyZW50T2Zmc2V0ID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKTsKLQkJCWludCBjdXJyZW50RW5kT2Zmc2V0ID0gY3VycmVudE9mZnNldCArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA+PSBjdXJyZW50T2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPD0gY3VycmVudEVuZE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA+PSBjdXJyZW50T2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpIDw9IGN1cnJlbnRFbmRPZmZzZXQpIHsKLQkJCQlJQ1NTTm9kZSBuZXdOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gbmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQkJbmV3UmVnaW9uID0gY3Vyc29yTm9kZVJlZ2lvbjsKLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdE5leHRDU1NBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0TmV4dENTU0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMTIyYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0TmV4dENTU0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlOwotCi0vKioKLSAqIFNlbGVjdHMgbmV4dCBDU1MgZWxlbWVudAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFNlbGVjdE5leHRDU1NBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIFN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlpbnQgb2Zmc2V0ID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgLSAxOwotCQlpZiAob2Zmc2V0IDwgMCkKLQkJCW9mZnNldCA9IDA7Ci0KLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLQotCQlpbmRleGVkUmVnaW9uID0gZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudCwgb2Zmc2V0KTsKLQotCQlyZXR1cm4gaW5kZXhlZFJlZ2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVnaW9uIGdldE5ld1NlbGVjdGlvblJlZ2lvbihJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24sIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJUmVnaW9uIG5ld1JlZ2lvbiA9IG51bGw7Ci0KLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJSUNTU05vZGUgY3Vyc29yTm9kZSA9IChJQ1NTTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQotCQkJUmVnaW9uIGN1cnNvck5vZGVSZWdpb24gPSBuZXcgUmVnaW9uKGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgaW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlpbnQgY3VycmVudE9mZnNldCA9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQgY3VycmVudEVuZE9mZnNldCA9IGN1cnJlbnRPZmZzZXQgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpOwotCQkJaWYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPj0gY3VycmVudE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpIDw9IGN1cnJlbnRFbmRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPj0gY3VycmVudE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA8PSBjdXJyZW50RW5kT2Zmc2V0KSB7Ci0JCQkJSUNTU05vZGUgbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAobmV3Tm9kZSA9PSBudWxsKSB7Ci0JCQkJCW5ld05vZGUgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJCUluZGV4ZWRSZWdpb24gbmV3SW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBuZXdOb2RlOwotCQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbihuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIG5ld0luZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJCUluZGV4ZWRSZWdpb24gbmV3SW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBuZXdOb2RlOwotCQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbihjdXJyZW50T2Zmc2V0LCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gY3VycmVudE9mZnNldCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQkJbmV3UmVnaW9uID0gY3Vyc29yTm9kZVJlZ2lvbjsKLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KENTU1VJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihDU1NVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdE5leHRfZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RQcmV2aW91c0NTU0FjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RQcmV2aW91c0NTU0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4Mjg5YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNDU1NBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBTZWxlY3RzIHByZXZpb3VzIENTUyBlbGVtZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNDU1NBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIFN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24gPSBudWxsOwotCi0JCWluZGV4ZWRSZWdpb24gPSBnZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQotCQlyZXR1cm4gaW5kZXhlZFJlZ2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVnaW9uIGdldE5ld1NlbGVjdGlvblJlZ2lvbihJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24sIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJUmVnaW9uIG5ld1JlZ2lvbiA9IG51bGw7Ci0JCWlmIChpbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCUlDU1NOb2RlIGN1cnNvck5vZGUgPSAoSUNTU05vZGUpIGluZGV4ZWRSZWdpb247Ci0KLQkJCVJlZ2lvbiBjdXJzb3JOb2RlUmVnaW9uID0gbmV3IFJlZ2lvbihpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJaW50IGN1cnJlbnRPZmZzZXQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpOwotCQkJaW50IGN1cnJlbnRFbmRPZmZzZXQgPSBjdXJyZW50T2Zmc2V0ICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKTsKLQkJCWlmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpID49IGN1cnJlbnRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA8PSBjdXJyZW50RW5kT2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpID49IGN1cnJlbnRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPD0gY3VycmVudEVuZE9mZnNldCkgewotCQkJCUlDU1NOb2RlIG5ld05vZGUgPSBjdXJzb3JOb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCWlmIChuZXdOb2RlID09IG51bGwpIHsKLQkJCQkJbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgbmV3SW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgY3VycmVudEVuZE9mZnNldCAtIG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQkJbmV3UmVnaW9uID0gY3Vyc29yTm9kZVJlZ2lvbjsKLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChDU1NVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXApOwotCQkJYWN0aW9uLnNldERlc2NyaXB0aW9uKENTU1VJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YjUzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0NTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLS8qKgotICogQ29udGFpbnMgdGhlIHN5bWJvbGljIG5hbWUgb2Ygc3R5bGVzIHVzZWQgYnkgTGluZVN0eWxlUHJvdmlkZXIsCi0gKiBDb2xvck1hbmFnZXIsIGFuZCBhbnkgb3RoZXJzIHdobyBtYXkgYmUgaW50ZXJlc3RlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZUNvbnN0YW50c0NTUyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9STUFMID0gIk5PUk1BTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVE1BUktfUlVMRSA9ICJBVE1BUktfUlVMRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RPUiA9ICJTRUxFQ1RPUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRURJQSA9ICJNRURJQSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UID0gIkNPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTkFNRSA9ICJQUk9QRVJUWV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1ZBTFVFID0gIlBST1BFUlRZX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSSA9ICJVUkkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HID0gIlNUUklORyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPTiA9ICJDT0xPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRU1JX0NPTE9OID0gIlNFTUlfQ09MT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSTFlfQlJBQ0UgPSAiQ1VSTFlfQlJBQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1IgPSAiRVJST1IiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjA1MDI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnN0eWxlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JDU1MgZXh0ZW5kcyBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyIGltcGxlbWVudHMgTGluZVN0eWxlUHJvdmlkZXIgewotCS8qKiBDb250YWlucyByZWdpb24gdG8gc3R5bGUgbWFwcGluZyAqLwotCXByaXZhdGUgTWFwIGZDb2xvclR5cGVzOwotCi0JLyoqCi0JICogTGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlckZvckNTUygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVGb3IodHlwZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNDU1MuTk9STUFMKTsKLQl9Ci0KLQkvKioKLQkgKiBMb29rIHVwIHRoZSBUZXh0QXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gcmVnaW9uIGNvbnRleHQuIE1pZ2h0IHJldHVybgotCSAqIG51bGwgZm9yIHVudXN1YWwgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChmQ29sb3JUeXBlcy5nZXQodHlwZSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0QXR0cmlidXRlcygpIHsKLQkJaWYgKGZDb2xvclR5cGVzID09IG51bGwpIHsKLQkJCWZDb2xvclR5cGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQsIElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5UKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19DRE8sIElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5UKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19DREMsIElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5UKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TLCBJU3R5bGVDb25zdGFudHNDU1MuTk9STUFMKTsKLQotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTUlfQ09MT04pOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkNVUkxZX0JSQUNFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UsIElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRSk7Ci0KLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19JTVBPUlQsIElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19GT05UX0ZBQ0UsIElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19BVEtFWVdPUkQsIElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSk7Ci0KLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TVFJJTkcsIElTdHlsZUNvbnN0YW50c0NTUy5TVFJJTkcpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VSSSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlVSSSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESVVNLCBJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBX1NFUEFSQVRPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLk1FRElBKTsKLQotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NIQVJTRVRfTkFNRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORyk7Ci0KLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFX1NFTEVDVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCi0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8sIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfSUQsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0KLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DT01CSU5BVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1NFUEFSQVRPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCi0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fUFJPUEVSVFksIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9OQU1FKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04sIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04sIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNILCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0UsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5ULCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuQ09MT04pOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTUlfQ09MT04pOwotCi0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTiwgSVN0eWxlQ29uc3RhbnRzQ1NTLk5PUk1BTCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3R5bGVLZXkgPSBudWxsOwotCi0JCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZktleSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkvLyBjaGVjayBpZiBwcmVmZXJlbmNlIGNoYW5nZWQgaXMgYSBzdHlsZSBwcmVmZXJlbmNlCi0JCQlpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuQ09MT04uZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNDU1MuQ09MT047Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5ULmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQ7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRTsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLkVSUk9SLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLkVSUk9SOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuTUVESUEuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNDU1MuTUVESUE7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5OT1JNQUwuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNDU1MuTk9STUFMOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfTkFNRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9OQU1FOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUU7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUjsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTUlfQ09MT04uZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTjsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORy5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0NTUy5TVFJJTkc7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5VUkkuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNDU1MuVVJJOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gdGhpcyBpcyBhcm91bmQgZm9yIG9sZCBkZXByZWNhdGVkIHByZWZlcmVuY2VzQ2hhbmdlZCgpIG1ldGhvZAotCQkJLy8gVE9ETyByZW1vdmUgd2hlbiBwcmVmZXJlbmNlc0NoYW5nZWQoKSBpcyByZW1vdmVkCi0JCQlsb2FkQ29sb3JzKCk7Ci0JCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCX0KLQotCQlpZiAoc3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gb3ZlcndyaXRlIHN0eWxlIHByZWZlcmVuY2Ugd2l0aCBuZXcgdmFsdWUKLQkJCWFkZFRleHRBdHRyaWJ1dGUoc3R5bGVLZXkpOwotCQkJc3VwZXIuaGFuZGxlUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYgKGZDb2xvclR5cGVzICE9IG51bGwpIHsKLQkJCWZDb2xvclR5cGVzLmNsZWFyKCk7Ci0JCQlmQ29sb3JUeXBlcyA9IG51bGw7Ci0JCX0KLQkJc3VwZXIucmVsZWFzZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWRDb2xvcnMoKSB7Ci0JCWluaXRBdHRyaWJ1dGVzKCk7Ci0JCQotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTE9OKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLkNVUkxZX0JSQUNFKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuRVJST1IpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0NTUy5NRURJQSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLk5PUk1BTCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX05BTUUpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORyk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLlVSSSk7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0Q29sb3JQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yRW1iZWRkZWRDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NkYzg4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnN0eWxlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUyBleHRlbmRzIExpbmVTdHlsZVByb3ZpZGVyRm9yQ1NTIHsKLQotCXB1YmxpYyBib29sZWFuIHByZXBhcmVSZWdpb25zKElUeXBlZFJlZ2lvbiB0eXBlZFJlZ2lvbiwgaW50IGxpbmVSZXF1ZXN0U3RhcnQsIGludCBsaW5lUmVxdWVzdExlbmd0aCwgQ29sbGVjdGlvbiBob2xkUmVzdWx0cykgewotCQlpbnQgcmVnaW9uU3RhcnQgPSB0eXBlZFJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJaW50IHJlZ2lvbkVuZCA9IHJlZ2lvblN0YXJ0ICsgdHlwZWRSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gd2hvbGVSZWdpb24gPSBnZXREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHJlZ2lvblN0YXJ0KTsKLQotCQlMaXN0IHRva2VuczsKLQkJaW50IG9mZnNldDsKLQotCQlQYXJzZXJDYWNoZSBjYWNoZSA9IGdldENhY2hlZFBhcnNpbmdSZXN1bHQod2hvbGVSZWdpb24pOwotCQlpZiAoY2FjaGUgPT0gbnVsbCkgewotCQkJb2Zmc2V0ID0gd2hvbGVSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCVN0cmluZyBjb250ZW50OwotCQkJY29udGVudCA9IHdob2xlUmVnaW9uLmdldFRleHQoKTsKLQotCQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfU1RZTEVTSEVFVCwgY29udGVudCk7Ci0JCQl0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5MaXN0KCk7Ci0JCQljYWNoZVBhcnNpbmdSZXN1bHQod2hvbGVSZWdpb24sIG5ldyBQYXJzZXJDYWNoZShvZmZzZXQsIHRva2VucykpOwotCQl9IGVsc2UgewotCQkJdG9rZW5zID0gY2FjaGUudG9rZW5zOwotCQkJb2Zmc2V0ID0gY2FjaGUub2Zmc2V0OwotCQl9Ci0KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAoMCA8IHRva2Vucy5zaXplKCkpIHsKLQkJCWludCBzdGFydCA9IG9mZnNldDsKLQkJCUl0ZXJhdG9yIGkgPSB0b2tlbnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUNTU1RleHRUb2tlbiB0b2tlbiA9IChDU1NUZXh0VG9rZW4pIGkubmV4dCgpOwotCQkJCWlmIChyZWdpb25TdGFydCA8PSBzdGFydCAmJiBzdGFydCA8IHJlZ2lvbkVuZCkgewotCQkJCQlUZXh0QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGdldEF0dHJpYnV0ZUZvcih0b2tlbi5raW5kKTsKLQkJCQkJaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJCQlob2xkUmVzdWx0cy5hZGQobmV3IFN0eWxlUmFuZ2Uoc3RhcnQsIHRva2VuLmxlbmd0aCwgYXR0cmlidXRlLmdldEZvcmVncm91bmQoKSwgYXR0cmlidXRlLmdldEJhY2tncm91bmQoKSwgYXR0cmlidXRlLmdldFN0eWxlKCkpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWhvbGRSZXN1bHRzLmFkZChuZXcgU3R5bGVSYW5nZShzdGFydCwgdG9rZW4ubGVuZ3RoLCBudWxsLCBudWxsKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc3RhcnQgKz0gdG9rZW4ubGVuZ3RoOwotCQkJfQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlRm9yKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYW51cENhY2hlKCkgewotCQlmQ2FjaGVLZXkgPSAtMTsKLQkJZkNhY2hlUmVzdWx0ID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFBhcnNlckNhY2hlIGdldENhY2hlZFBhcnNpbmdSZXN1bHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKGZDYWNoZUtleSA9PSByZWdpb24uZ2V0VGV4dCgpLmhhc2hDb2RlKCkpIHsKLQkJCXJldHVybiBmQ2FjaGVSZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhY2hlUGFyc2luZ1Jlc3VsdChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgUGFyc2VyQ2FjaGUgcmVzdWx0KSB7Ci0JCWZDYWNoZUtleSA9IHJlZ2lvbi5nZXRUZXh0KCkuaGFzaENvZGUoKTsKLQkJZkNhY2hlUmVzdWx0ID0gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQkJY2xlYW51cENhY2hlKCk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBQYXJzZXJDYWNoZSB7Ci0JCVBhcnNlckNhY2hlKGludCBuZXdPZmZzZXQsIExpc3QgbmV3VG9rZW5zKSB7Ci0JCQlvZmZzZXQgPSBuZXdPZmZzZXQ7Ci0JCQl0b2tlbnMgPSBuZXdUb2tlbnM7Ci0JCX0KLQotCQlpbnQgb2Zmc2V0OwotCQlMaXN0IHRva2VuczsKLQl9Ci0KLQlpbnQgZkNhY2hlS2V5ID0gLTE7Ci0JUGFyc2VyQ2FjaGUgZkNhY2hlUmVzdWx0ID0gbnVsbDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU3ZGE2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL0VuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuU2ltcGxlVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotCi0KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckNTUyBleHRlbmRzIFNpbXBsZVRlbXBsYXRlVmFyaWFibGVSZXNvbHZlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX1RZUEUgPSBnZXRFbmNvZGluZ1R5cGUoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFbmNvZGluZ1R5cGUoKSB7Ci0JCXJldHVybiAiZW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlbmNvZGluZyB2YXJpYWJsZQotCSAqLwotCXB1YmxpYyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckNTUygpIHsKLQkJc3VwZXIoRU5DT0RJTkdfVFlQRSwgQ1NTVUlNZXNzYWdlcy5DcmVhdGluZ19maWxlc19lbmNvZGluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlKFRlbXBsYXRlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U5ODFjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5HbG9iYWxUZW1wbGF0ZVZhcmlhYmxlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIENTUyB0ZW1wbGF0ZSBjb250ZXh0IHR5cGVzLiBUZW1wbGF0ZXMgb2YgdGhpcyBjb250ZXh0IHR5cGUKLSAqIGFwcGx5IHRvIGFueSBwbGFjZSB3aXRoaW4gQ1NTIGNvbnRlbnQgdHlwZS4KLSAqLwotcHVibGljIGNsYXNzIFRlbXBsYXRlQ29udGV4dFR5cGVDU1MgZXh0ZW5kcyBUZW1wbGF0ZUNvbnRleHRUeXBlIHsKLQotCXB1YmxpYyBUZW1wbGF0ZUNvbnRleHRUeXBlQ1NTKCkgewotCQlzdXBlcigpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuQ3Vyc29yKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuRGF0ZSgpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkRvbGxhcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkxpbmVTZWxlY3Rpb24oKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5UaW1lKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuVXNlcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLldvcmRTZWxlY3Rpb24oKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5ZZWFyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJDU1MoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBhMTM0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLQotcHVibGljIGNsYXNzIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMID0gImNzc19hbGwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVcgPSAiY3NzX25ldyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZXh0L0NTU0RvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZXh0L0NTU0RvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAyZGJjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGV4dC9DU1NEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLXB1YmxpYyBjbGFzcyBDU1NEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIGltcGxlbWVudHMgSUNoYXJhY3RlclBhaXJNYXRjaGVyIHsKLQotCXByaXZhdGUgaW50IGZBbmNob3IgPSBJQ2hhcmFjdGVyUGFpck1hdGNoZXIuTEVGVDsKLQotCS8qKgotCSAqIEBwYXJhbSB2YWxpZENvbnRleHRzCi0JICogQHBhcmFtIG5leHRNYXRjaGVyCi0JICovCi0JcHVibGljIENTU0RvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjY2xlYXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjZ2V0QW5jaG9yKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFuY2hvcigpIHsKLQkJcmV0dXJuIGZBbmNob3I7Ci0JfQotCi0JcHVibGljIElSZWdpb24gbWF0Y2goSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gciA9ICgoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlpZiAociAhPSBudWxsKSB7Ci0JCQkJaWYgKHIuZ2V0UHJldmlvdXMoKSAhPSBudWxsICYmIHIuZ2V0U3RhcnRPZmZzZXQoKSA9PSBvZmZzZXQgJiYgci5nZXRQcmV2aW91cygpLmdldFR5cGUoKS5lcXVhbHMoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkpIHsKLQkJCQkJciA9IHIuZ2V0UHJldmlvdXMoKTsKLQkJCQl9Ci0JCQkJaWYgKHIuZ2V0VHlwZSgpLmVxdWFscyhDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSkgewotCQkJCQl3aGlsZSAociAhPSBudWxsICYmICFyLmdldFR5cGUoKS5lcXVhbHMoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkpIHsKLQkJCQkJCXIgPSByLmdldFByZXZpb3VzKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHIgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIG5ldyBSZWdpb24oci5nZXRTdGFydE9mZnNldCgpLCAxKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoci5nZXRUeXBlKCkuZXF1YWxzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpKSB7Ci0JCQkJCXdoaWxlIChyICE9IG51bGwgJiYgIXIuZ2V0VHlwZSgpLmVxdWFscyhDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSkgewotCQkJCQkJciA9IHIuZ2V0TmV4dCgpOwotCQkJCQl9Ci0JCQkJCWlmIChyICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBuZXcgUmVnaW9uKHIuZ2V0RW5kT2Zmc2V0KCkgLSAxLCAxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL0ZhY2V0TW9kdWxlQ29yZVN1cHBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC93aXphcmQvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzZjNjkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC93aXphcmQvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGVuY2Fwc3VsYXRlcyBhbnkgdXNlZCBNb2R1bGUgQ29yZSBhbmQgRmFjZXRzIEFQSXMgYWxvbmcgd2l0aAotICogZmFsbGJhY2tzIGZvciB1c2Ugb24gbm9uLWNvbXBsaWFudCBwcm9qZWN0cyBhbmQgd2hlbiB0aG9zZSBzZXJ2aWNlcyBhcmUgbm90Ci0gKiBhdmFpbGFibGUgYXQgcnVudGltZS4KLSAqIAotICogQmVjYXVzZSBNb2R1bGVDb3JlIEFQSSBjYWxscyBjYW4gcmVzdWx0IGluIGxvY2tzIG5lZWRpbmcgdG8gYmUgYWNxdWlyZWQsCi0gKiBub25lIG9mIHRoZXNlIG1ldGhvZHMgc2hvdWxkIGJlIGNhbGxlZCB3aGlsZSBvdGhlciB0aHJlYWQgbG9ja3MgaGF2ZQotICogYWxyZWFkeSBiZWVuIGFjcXVpcmVkLgotICovCi1maW5hbCBjbGFzcyBGYWNldE1vZHVsZUNvcmVTdXBwb3J0IHsKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBfZHVtcF9OQ0RGRSA9IGZhbHNlOwotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIHRoZSBJUGF0aCB0byB0aGUgInJvb3QiIG9mIHRoZSB3ZWIgY29udGVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFdlYkNvbnRlbnRSb290UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBhdGggPSBGYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuZ2V0V2ViQ29udGVudFJvb3RQYXRoKHByb2plY3QpOwotCQl9Ci0JCWNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0JCQlpZiAoX2R1bXBfTkNERkUpCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2ViUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBGYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuaXNXZWJQcm9qZWN0KHByb2plY3QpOwotCQl9Ci0JCWNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0JCQlpZiAoX2R1bXBfTkNERkUpCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3dpemFyZC9GYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC93aXphcmQvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZjE5MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3dpemFyZC9GYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIFdyYXBwZXIgY2xhc3MgZm9yIGFsbCBGYWNldC1yZWxhdGVkIGNhbGxzLiBJZiB0aGUgRmFjZXQgb3IgTW9kdWxlQ29yZQotICogYnVuZGxlcyBhcmUgbm90IGF2YWlsYWJsZSwgdGhpcyBjbGFzcyB3aWxsIG5vdCBsb2FkLCBvciBpZiBpdCBkb2VzLCBpdHMKLSAqIG1ldGhvZHMgd2lsbCBjYXVzZSBOb0NsYXNzRGVmRm91bmRFcnJvcnMuIFRoaXMgYWxsb3dzIHVzIHRvCi0gKiBjb21wYXJ0bWVudGFsaXplIHRoZSBkZXBlbmRlbmNpZXMuCi0gKiAKLSAqLwotZmluYWwgY2xhc3MgRmFjZXRNb2R1bGVDb3JlU3VwcG9ydERlbGVnYXRlIHsKLQkvKioKLQkgKiBDb3BpZWQgdG8gYXZvaWQgdW5uZWVkZWQgZXh0cmEgZGVwZW5kZW5jeSAocGx1cyBpdCdzIHVuY2xlYXIgd2h5IHRoZQotCSAqIHZhbHVlIGlzIGluIHRoYXQgcGx1Zy1pbikuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEpTVF9XRUJfTU9EVUxFID0gImpzdC53ZWIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NUX1dFQl9NT0RVTEUgPSAid3N0LndlYiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybiB0aGUgSVBhdGggdG8gdGhlICJyb290IiBvZiB0aGUgd2ViIGNvbnRlbnRzCi0JICovCi0Jc3RhdGljIElQYXRoIGdldFdlYkNvbnRlbnRSb290UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmICghTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChwcm9qZWN0KSkKLQkJCXJldHVybiBwcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0KLQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlpZiAoY29tcG9uZW50ICE9IG51bGwgJiYgY29tcG9uZW50LmV4aXN0cygpKSB7Ci0JCQlwYXRoID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKTsKLQkJfQotCQllbHNlIHsKLQkJCXBhdGggPSBwcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gaXNXZWJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJYm9vbGVhbiBpcyA9IGZhbHNlOwotCQl0cnkgewotCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZiAoUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcm9qZWN0RmFjZXREZWZpbmVkKEpTVF9XRUJfTU9EVUxFKSkgewotCQkJCUlQcm9qZWN0RmFjZXQgZmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSlNUX1dFQl9NT0RVTEUpOwotCQkJCWlzID0gaXMgfHwgKGZhY2V0ZWQgIT0gbnVsbCAmJiBmYWNldGVkLmhhc1Byb2plY3RGYWNldChmYWNldCkpOwotCQkJfQotCQkJaWYgKFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZChXU1RfV0VCX01PRFVMRSkpIHsKLQkJCQlJUHJvamVjdEZhY2V0IGZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KFdTVF9XRUJfTU9EVUxFKTsKLQkJCQlpcyA9IGlzIHx8IChmYWNldGVkICE9IG51bGwgJiYgZmFjZXRlZC5oYXNQcm9qZWN0RmFjZXQoZmFjZXQpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBpczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU0ZpbGVXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU0ZpbGVXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYzY0MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3dpemFyZC9OZXdDU1NGaWxlV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSU1lc3NhZ2VzOwotCi1jbGFzcyBOZXdDU1NGaWxlV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgewotCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkNvbnRlbnRUeXBlOwotCXByaXZhdGUgTGlzdCBmVmFsaWRFeHRlbnNpb25zID0gbnVsbDsKLQkKLQlwdWJsaWMgTmV3Q1NTRmlsZVdpemFyZFBhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgc3VwZXIocGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0gICAgfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiB0byBzZXQgdGhlIHNlbGVjdGVkIGZvbGRlciB0byB3ZWIgY29udGVudHMgCi0JICogZm9sZGVyIGlmIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpcyBvdXRzaWRlIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyLiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsUG9wdWxhdGVDb250YWluZXJOYW1lRmllbGQoKSB7Ci0JCXN1cGVyLmluaXRpYWxQb3B1bGF0ZUNvbnRhaW5lck5hbWVGaWVsZCgpOwotCQkKLQkJSVBhdGggZnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEZyb21QYXRoKGZ1bGxQYXRoKTsKLQkJSVBhdGggd2ViQ29udGVudFBhdGggPSBnZXRXZWJDb250ZW50UGF0aChwcm9qZWN0KTsKLQkJCi0JCWlmICh3ZWJDb250ZW50UGF0aCAhPSBudWxsICYmICF3ZWJDb250ZW50UGF0aC5pc1ByZWZpeE9mKGZ1bGxQYXRoKSkgewotCQkJc2V0Q29udGFpbmVyRnVsbFBhdGgod2ViQ29udGVudFBhdGgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiB0byBzZXQgYWRkaXRpb25hbCB2YWxpZGF0aW9uIHNwZWNpZmljIHRvIAotCSAqIGNzcyBmaWxlcy4gCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQlzZXRNZXNzYWdlKG51bGwpOwotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQotCQlpZiAoIXN1cGVyLnZhbGlkYXRlUGFnZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0JCUlQYXRoIGZ1bGxQYXRoID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQkJaWYgKChmdWxsUGF0aCAhPSBudWxsKSAmJiAoZnVsbFBhdGguaXNFbXB0eSgpID09IGZhbHNlKSAmJiAoZmlsZU5hbWUgIT0gbnVsbCkpIHsKLQkJCS8vIGNoZWNrIHRoYXQgZmlsZW5hbWUgZG9lcyBub3QgY29udGFpbiBpbnZhbGlkIGV4dGVuc2lvbgotCQkJaWYgKCFleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKGZpbGVOYW1lKSkgewotCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChDU1NVSU1lc3NhZ2VzLl9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9DU1MsIGdldFZhbGlkRXh0ZW5zaW9ucygpLnRvU3RyaW5nKCkpKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkvLyBubyBmaWxlIGV4dGVuc2lvbiBzcGVjaWZpZWQgc28gY2hlY2sgYWRkaW5nIGRlZmF1bHQKLQkJCS8vIGV4dGVuc2lvbiBkb2Vzbid0IGVxdWFsIGEgZmlsZSB0aGF0IGFscmVhZHkgZXhpc3RzCi0JCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSA9PSAtMSkgewotCQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGFkZERlZmF1bHRFeHRlbnNpb24oZmlsZU5hbWUpOwotCQkJCUlQYXRoIHJlc291cmNlUGF0aCA9IGZ1bGxQYXRoLmFwcGVuZChuZXdGaWxlTmFtZSk7Ci0KLQkJCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCQlJU3RhdHVzIHJlc3VsdCA9IHdvcmtzcGFjZS52YWxpZGF0ZVBhdGgocmVzb3VyY2VQYXRoLnRvU3RyaW5nKCksIElSZXNvdXJjZS5GT0xERVIpOwotCQkJCWlmICghcmVzdWx0LmlzT0soKSkgewotCQkJCQkvLyBwYXRoIGludmFsaWQKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKHJlc3VsdC5nZXRNZXNzYWdlKCkpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJaWYgKCh3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZvbGRlcihyZXNvdXJjZVBhdGgpLmV4aXN0cygpIHx8IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZShyZXNvdXJjZVBhdGgpLmV4aXN0cygpKSkgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoQ1NTVUlNZXNzYWdlcy5SZXNvdXJjZUdyb3VwX25hbWVFeGlzdHMpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBnZXQgdGhlIElQcm9qZWN0IGZvciB0aGUgc2VsZWN0aW9uIHBhdGgKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0RnJvbVBhdGgoZnVsbFBhdGgpOwotCQkJLy8gaWYgaW5zaWRlIHdlYiBwcm9qZWN0LCBjaGVjayBpZiBpbnNpZGUgd2ViQ29udGVudCBmb2xkZXIKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgaXNXZWJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJLy8gY2hlY2sgdGhhdCB0aGUgcGF0aCBpcyBpbnNpZGUgdGhlIHdlYkNvbnRlbnQgZm9sZGVyCi0JCQkJSVBhdGggd2ViQ29udGVudFBhdGggPSBnZXRXZWJDb250ZW50UGF0aChwcm9qZWN0KTsKLQkJCQlpZiAoIXdlYkNvbnRlbnRQYXRoLmlzUHJlZml4T2YoZnVsbFBhdGgpKSB7Ci0JCQkJCXNldE1lc3NhZ2UoQ1NTVUlNZXNzYWdlcy5fV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQsIFdBUk5JTkcpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgY29udGVudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5ldyBmaWxlIHdpemFyZAotCSAqIAotCSAqIEByZXR1cm4gSUNvbnRlbnRUeXBlCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCWlmIChmQ29udGVudFR5cGUgPT0gbnVsbCkKLQkJCWZDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JDU1MuQ29udGVudFR5cGVJRF9DU1MpOwotCQlyZXR1cm4gZkNvbnRlbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIEdldCBsaXN0IG9mIHZhbGlkIGV4dGVuc2lvbnMgZm9yIENTUyBDb250ZW50IHR5cGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFZhbGlkRXh0ZW5zaW9ucygpIHsKLQkJaWYgKGZWYWxpZEV4dGVuc2lvbnMgPT0gbnVsbCkgewotCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkJZlZhbGlkRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdCh0eXBlLmdldEZpbGVTcGVjcyhJQ29udGVudFR5cGUuRklMRV9FWFRFTlNJT05fU1BFQykpKTsKLQkJfQotCQlyZXR1cm4gZlZhbGlkRXh0ZW5zaW9uczsKLQl9Ci0JCi0JLyoqCi0JICogVmVyaWZpZXMgaWYgZmlsZU5hbWUgaXMgdmFsaWQgbmFtZSBmb3IgY29udGVudCB0eXBlLiBUYWtlcyBiYXNlIGNvbnRlbnQKLQkgKiB0eXBlIGludG8gY29uc2lkZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcmV0dXJuIHRydWUgaWYgZXh0ZW5zaW9uIGlzIHZhbGlkIGZvciB0aGlzIGNvbnRlbnQgdHlwZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKFN0cmluZyBmaWxlTmFtZSkgewotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0KLQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkvLyB0aGVyZSBpcyBjdXJyZW50bHkgYW4gZXh0ZW5zaW9uCi0JCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICE9IC0xKSB7Ci0JCQkvLyBjaGVjayB3aGF0IGNvbnRlbnQgdHlwZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBjdXJyZW50IGV4dGVuc2lvbgotCQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVzRm9yKGZpbGVOYW1lKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdHlwZXMubGVuZ3RoICYmICF2YWxpZCkgewotCQkJCXZhbGlkID0gdHlwZXNbaV0uaXNLaW5kT2YodHlwZSk7Ci0JCQkJKytpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXZhbGlkID0gdHJ1ZTsgLy8gbm8gZXh0ZW5zaW9uIHNvIHZhbGlkCi0JCXJldHVybiB2YWxpZDsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGRlZmF1bHQgZXh0ZW5zaW9uIHRvIHRoZSBmaWxlbmFtZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlbmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgYWRkRGVmYXVsdEV4dGVuc2lvbihTdHJpbmcgZmlsZW5hbWUpIHsKLQkJU3RyaW5nQnVmZmVyIG5ld0ZpbGVOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcihmaWxlbmFtZSk7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBleHQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQotCQluZXdGaWxlTmFtZS5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQluZXdGaWxlTmFtZS5hcHBlbmQoZXh0KTsKLQotCQlyZXR1cm4gbmV3RmlsZU5hbWUudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgcGF0aAotCSAqIAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHdoaWNoIHByb2plY3QgaXMgbmVlZGVkCi0JICogQHJldHVybiBJUHJvamVjdCBvYmplY3QuIElmIHBhdGggaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlIHJldHVybiB2YWx1ZSAKLQkgKiAJCSAgIGlzIGFsc28gPGNvZGU+bnVsbDwvY29kZT4uIAotCSAqLwotCXByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdEZyb21QYXRoKElQYXRoIHBhdGgpIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQkKLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJaWYgKHdvcmtzcGFjZS52YWxpZGF0ZVBhdGgocGF0aC50b1N0cmluZygpLCBJUmVzb3VyY2UuUFJPSkVDVCkuaXNPSygpKSB7Ci0JCQkJcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoLnRvU3RyaW5nKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpLmdldFByb2plY3QoKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIHByb2plY3QgaXMgYSB3ZWIgcHJvamVjdC4gCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgcHJvamVjdCB0byBiZSBjaGVja2VkCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9qZWN0IGlzIHdlYiBwcm9qZWN0LCBvdGhlcndpc2UgZmFsc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNXZWJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQuaXNXZWJQcm9qZWN0KHByb2plY3QpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHdoaWNoIHdlYiBjb250ZW50cyBwYXRoIGlzIG5lZWRlZAotCSAqIEByZXR1cm4gSVBhdGggb2YgdGhlIHdlYiBjb250ZW50cyBmb2xkZXIKLQkgKi8KLQlwcml2YXRlIElQYXRoIGdldFdlYkNvbnRlbnRQYXRoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIEZhY2V0TW9kdWxlQ29yZVN1cHBvcnQuZ2V0V2ViQ29udGVudFJvb3RQYXRoKHByb2plY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3dpemFyZC9OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEwMDM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkRvY3VtZW50VGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkNTU1VJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi0vKioKLSAqIFRlbXBsYXRlcyBwYWdlIGluIG5ldyBmaWxlIHdpemFyZC4gQWxsb3dzIHVzZXJzIHRvIHNlbGVjdCBhIG5ldyBmaWxlCi0gKiB0ZW1wbGF0ZSB0byBiZSBhcHBsaWVkIGluIG5ldyBmaWxlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBDb250ZW50IHByb3ZpZGVyIGZvciB0ZW1wbGF0ZXMKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRlbXBsYXRlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQkvKiogVGhlIHRlbXBsYXRlIHN0b3JlLiAqLwotCQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlN0b3JlOwotCi0JCS8qCi0JCSAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlmU3RvcmUgPSBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KSB7Ci0JCQlyZXR1cm4gZlN0b3JlLmdldFRlbXBsYXRlcyhUZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTLk5FVyk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCWZTdG9yZSA9IChUZW1wbGF0ZVN0b3JlKSBuZXdJbnB1dDsKLQkJfQotCX0KLQotCS8qKgotCSAqIExhYmVsIHByb3ZpZGVyIGZvciB0ZW1wbGF0ZXMuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUZW1wbGF0ZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBpbnQpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgaW50KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gKFRlbXBsYXRlKSBlbGVtZW50OwotCi0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJcmV0dXJuIHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJCQljYXNlIDEgOgotCQkJCQlyZXR1cm4gdGVtcGxhdGUuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiogTGFzdCBzZWxlY3RlZCB0ZW1wbGF0ZSBuYW1lICovCi0JcHJpdmF0ZSBTdHJpbmcgZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZTsKLQkvKiogVGhlIHZpZXdlciBkaXNwbGF5cyB0aGUgcGF0dGVybiBvZiBzZWxlY3RlZCB0ZW1wbGF0ZS4gKi8KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBmUGF0dGVyblZpZXdlcjsKLQkvKiogVGhlIHRhYmxlIHByZXNlbnRpbmcgdGhlIHRlbXBsYXRlcy4gKi8KLQlwcml2YXRlIFRhYmxlVmlld2VyIGZUYWJsZVZpZXdlcjsKLQkvKiogVGVtcGxhdGUgc3RvcmUgdXNlZCBieSB0aGlzIHdpemFyZCBwYWdlICovCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZUZW1wbGF0ZVN0b3JlOwotCS8qKiBDaGVja2JveCBmb3IgdXNpbmcgdGVtcGxhdGVzLiAqLwotCXByaXZhdGUgQnV0dG9uIGZVc2VUZW1wbGF0ZUJ1dHRvbjsKLQotCXB1YmxpYyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlKCkgewotCQlzdXBlcigiTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZSIsIENTU1VJTWVzc2FnZXMuTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8wLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihDU1NVSU1lc3NhZ2VzLk5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfMSk7Ci0JfQotCi0JLyoqCi0JICogQ29ycmVjdGx5IHJlc2l6ZXMgdGhlIHRhYmxlIHNvIG5vIHBoYW50b20gY29sdW1ucyBhcHBlYXIKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcGFyYW0gYnV0dG9ucwotCSAqICAgICAgICAgICAgdGhlIGJ1dHRvbnMKLQkgKiBAcGFyYW0gdGFibGUKLQkgKiAgICAgICAgICAgIHRoZSB0YWJsZQotCSAqIEBwYXJhbSBjb2x1bW4xCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgY29sdW1uCi0JICogQHBhcmFtIGNvbHVtbjIKLQkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgY29sdW1uCi0JICogQHBhcmFtIGNvbHVtbjMKLQkgKiAgICAgICAgICAgIHRoZSB0aGlyZCBjb2x1bW4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY29uZmlndXJlVGFibGVSZXNpemluZyhmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBUYWJsZSB0YWJsZSwgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMSwgZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMikgewotCQlwYXJlbnQuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJUmVjdGFuZ2xlIGFyZWEgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCVBvaW50IHByZWZlcnJlZFNpemUgPSB0YWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJCWludCB3aWR0aCA9IGFyZWEud2lkdGggLSAyICogdGFibGUuZ2V0Qm9yZGVyV2lkdGgoKTsKLQkJCQlpZiAocHJlZmVycmVkU2l6ZS55ID4gYXJlYS5oZWlnaHQpIHsKLQkJCQkJLy8gU3VidHJhY3QgdGhlIHNjcm9sbGJhciB3aWR0aCBmcm9tIHRoZSB0b3RhbCBjb2x1bW4KLQkJCQkJLy8gd2lkdGgKLQkJCQkJLy8gaWYgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIgd2lsbCBiZSByZXF1aXJlZAotCQkJCQlQb2ludCB2QmFyU2l6ZSA9IHRhYmxlLmdldFZlcnRpY2FsQmFyKCkuZ2V0U2l6ZSgpOwotCQkJCQl3aWR0aCAtPSB2QmFyU2l6ZS54OwotCQkJCX0KLQotCQkJCVBvaW50IG9sZFNpemUgPSB0YWJsZS5nZXRTaXplKCk7Ci0JCQkJaWYgKG9sZFNpemUueCA+IHdpZHRoKSB7Ci0JCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgc21hbGxlciBzbyBtYWtlIHRoZSBjb2x1bW5zCi0JCQkJCS8vIHNtYWxsZXIgZmlyc3QgYW5kIHRoZW4gcmVzaXplIHRoZSB0YWJsZSB0bwotCQkJCQkvLyBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCXRhYmxlLnNldFNpemUod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRhYmxlIGlzIGdldHRpbmcgYmlnZ2VyIHNvIG1ha2UgdGhlIHRhYmxlCi0JCQkJCS8vIGJpZ2dlciBmaXJzdCBhbmQgdGhlbiBtYWtlIHRoZSBjb2x1bW5zIHdpZGVyCi0JCQkJCS8vIHRvIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQl0YWJsZS5zZXRTaXplKHdpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQkJCWNvbHVtbjEuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJY29sdW1uMi5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgYW5jZXN0b3IpIHsKLQkJQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoYW5jZXN0b3IsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBjcmVhdGUgY2hlY2tib3ggZm9yIHVzZXIgdG8gdXNlIENTUyBUZW1wbGF0ZQotCQlmVXNlVGVtcGxhdGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVuYWJsZVRlbXBsYXRlcygpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgY29tcG9zaXRlIGZvciBUZW1wbGF0ZXMgdGFibGUKLQkJQ29tcG9zaXRlIGlubmVyUGFyZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBpbm5lckxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWlubmVyTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlpbm5lckxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlpbm5lckxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWlubmVyUGFyZW50LnNldExheW91dChpbm5lckxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSk7Ci0JCWlubmVyUGFyZW50LnNldExheW91dERhdGEoZ2QpOwotCi0JCS8vIENyZWF0ZSBsaW5rZWQgdGV4dCB0byBqdXN0IHRvIHRlbXBsYXRlcyBwcmVmZXJlbmNlIHBhZ2UKLQkJTGluayBsaW5rID0gbmV3IExpbmsoaW5uZXJQYXJlbnQsIFNXVC5OT05FKTsKLQkJbGluay5zZXRUZXh0KENTU1VJTWVzc2FnZXMuTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV82KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWxpbmtDbGlja2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSB0aGF0IGRpc3BsYXlzIHRlbXBsYXRlcwotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShpbm5lclBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxMCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4xLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzIpOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uMi5zZXRUZXh0KENTU1VJTWVzc2FnZXMuTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8zKTsKLQotCQlmVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQlmVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVGVtcGxhdGVMYWJlbFByb3ZpZGVyKCkpOwotCQlmVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBUZW1wbGF0ZUNvbnRlbnRQcm92aWRlcigpKTsKLQotCQlmVGFibGVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9iamVjdDEsIE9iamVjdCBvYmplY3QyKSB7Ci0JCQkJaWYgKChvYmplY3QxIGluc3RhbmNlb2YgVGVtcGxhdGUpICYmIChvYmplY3QyIGluc3RhbmNlb2YgVGVtcGxhdGUpKSB7Ci0JCQkJCVRlbXBsYXRlIGxlZnQgPSAoVGVtcGxhdGUpIG9iamVjdDE7Ci0JCQkJCVRlbXBsYXRlIHJpZ2h0ID0gKFRlbXBsYXRlKSBvYmplY3QyOwotCQkJCQlpbnQgcmVzdWx0ID0gbGVmdC5nZXROYW1lKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXROYW1lKCkpOwotCQkJCQlpZiAocmVzdWx0ICE9IDApCi0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQlyZXR1cm4gbGVmdC5nZXREZXNjcmlwdGlvbigpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgb2JqZWN0MSwgb2JqZWN0Mik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzU29ydGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9KTsKLQotCQlmVGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZSkgewotCQkJCXVwZGF0ZVZpZXdlcklucHV0KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSB2aWV3ZXIgdGhhdCBkaXNwbGF5cyBjdXJyZW50bHkgc2VsZWN0ZWQgdGVtcGxhdGUncyBjb250ZW50cwotCQlmUGF0dGVyblZpZXdlciA9IGRvQ3JlYXRlVmlld2VyKHBhcmVudCk7Ci0KLQkJZlRlbXBsYXRlU3RvcmUgPSBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVTdG9yZSgpOwotCQlmVGFibGVWaWV3ZXIuc2V0SW5wdXQoZlRlbXBsYXRlU3RvcmUpOwotCi0JCWNvbmZpZ3VyZVRhYmxlUmVzaXppbmcoaW5uZXJQYXJlbnQsIHRhYmxlLCBjb2x1bW4xLCBjb2x1bW4yKTsKLQkJbG9hZExhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElIZWxwQ29udGV4dElkcy5DU1NfTkVXV0laQVJEX1RFTVBMQVRFX0hFTFBJRCk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJc2V0Q29udHJvbChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMsIGNvbmZpZ3VyZXMgYW5kIHJldHVybnMgYSBzb3VyY2Ugdmlld2VyIHRvIHByZXNlbnQgdGhlIHRlbXBsYXRlCi0JICogcGF0dGVybiBvbiB0aGUgcHJlZmVyZW5jZSBwYWdlLiBDbGllbnRzIG1heSBvdmVycmlkZSB0byBwcm92aWRlIGEKLQkgKiBjdXN0b20gc291cmNlIHZpZXdlciBmZWF0dXJpbmcgZS5nLiBzeW50YXggY29sb3JpbmcuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHJldHVybiBhIGNvbmZpZ3VyZWQgc291cmNlIHZpZXdlcgotCSAqLwotCXByaXZhdGUgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gc291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uQ1NTKCk7Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJCX0KLQkJfTsKLQkJU291cmNlVmlld2VyIHZpZXdlciA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlcihwYXJlbnQsIG51bGwsIG51bGwsIGZhbHNlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyKS5nZXRUZXh0V2lkZ2V0KCkuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRGb250KCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IikpOyAvLyROT04tTkxTLTEkCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc2NyYXRjaE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5jcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUyk7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHNjcmF0Y2hNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJdmlld2VyLmNvbmZpZ3VyZShzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKTsKLQkJdmlld2VyLnNldERvY3VtZW50KGRvY3VtZW50KTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBkb0NyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KENTU1VJTWVzc2FnZXMuTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV81KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gY3JlYXRlVmlld2VyKHBhcmVudCk7Ci0JCXZpZXdlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJQ29udHJvbCBjb250cm9sID0gdmlld2VyLmdldENvbnRyb2woKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlL2Rpc2FibGUgY29udHJvbHMgaW4gcGFnZSBiYXNlZCBvbiBmVXNlVGVtcGxhdGVCdXR0b24ncyBjdXJyZW50Ci0JICogc3RhdGUuCi0JICovCi0Jdm9pZCBlbmFibGVUZW1wbGF0ZXMoKSB7Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IGZVc2VUZW1wbGF0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoIWVuYWJsZWQpIHsKLQkJCS8vIHNhdmUgbGFzdCBzZWxlY3RlZCB0ZW1wbGF0ZQotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkKLQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJZWxzZQotCQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQlmVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG51bGwpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0U2VsZWN0ZWRUZW1wbGF0ZShmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lKTsKLQkJfQotCi0JCWZUYWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZlBhdHRlcm5WaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZW1wbGF0ZSBwcmVmZXJlbmNlIHBhZ2UgaWQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZmVyZW5jZVBhZ2VJZCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnByZWZlcmVuY2VzLnRlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZSBnZXRTZWxlY3RlZFRlbXBsYXRlKCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCXRlbXBsYXRlID0gKFRlbXBsYXRlKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHRlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGVtcGxhdGUgc3RyaW5nIHRvIGluc2VydC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0byBpbnNlcnQgb3IgbnVsbCBpZiBub25lIGlzIHRvIGJlIGluc2VydGVkCi0JICovCi0JU3RyaW5nIGdldFRlbXBsYXRlU3RyaW5nKCkgewotCQlTdHJpbmcgdGVtcGxhdGVTdHJpbmcgPSBudWxsOwotCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJVGVtcGxhdGVDb250ZXh0VHlwZSBjb250ZXh0VHlwZSA9IENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpLmdldENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MuTkVXKTsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpOwotCQkJVGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBuZXcgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCAwLCAwKTsKLQkJCXRyeSB7Ci0JCQkJVGVtcGxhdGVCdWZmZXIgYnVmZmVyID0gY29udGV4dC5ldmFsdWF0ZSh0ZW1wbGF0ZSk7Ci0JCQkJdGVtcGxhdGVTdHJpbmcgPSBidWZmZXIuZ2V0U3RyaW5nKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wbGF0ZSBmb3IgbmV3IGNzcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdGVtcGxhdGVTdHJpbmc7Ci0JfQotCi0Jdm9pZCBsaW5rQ2xpY2tlZCgpIHsKLQkJU3RyaW5nIHBhZ2VJZCA9IGdldFByZWZlcmVuY2VQYWdlSWQoKTsKLQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIHBhZ2VJZCwgbmV3IFN0cmluZ1tde3BhZ2VJZH0sIG51bGwpOwotCQlkaWFsb2cub3BlbigpOwotCQlmVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIGxhc3QgdGVtcGxhdGUgbmFtZSB1c2VkIGluIE5ldyBDU1MgRmlsZSB3aXphcmQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRMYXN0U2F2ZWRQcmVmZXJlbmNlcygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9IENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoQ1NTVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSk7Ci0JCWlmICh0ZW1wbGF0ZU5hbWUgPT0gbnVsbCB8fCB0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZU5hbWU7Ci0JCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JCWVuYWJsZVRlbXBsYXRlcygpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGVtcGxhdGUgbmFtZSB1c2VkIGZvciBuZXh0IGNhbGwgdG8gTmV3IENTUyBGaWxlIHdpemFyZC4KLQkgKi8KLQl2b2lkIHNhdmVMYXN0U2F2ZWRQcmVmZXJlbmNlcygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQl0ZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoQ1NTVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSwgdGVtcGxhdGVOYW1lKTsKLQkJQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdCBhIHRlbXBsYXRlIGluIHRoZSB0YWJsZSB2aWV3ZXIgZ2l2ZW4gdGhlIHRlbXBsYXRlIG5hbWUuIElmCi0JICogdGVtcGxhdGUgbmFtZSBjYW5ub3QgYmUgZm91bmQgb3IgdGVtcGxhdGVOYW1lIGlzIG51bGwsIGp1c3Qgc2VsZWN0Ci0JICogZmlyc3QgaXRlbSBpbiB0YWJsZS4gSWYgbm8gaXRlbXMgaW4gdGFibGUgc2VsZWN0IG5vdGhpbmcuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlTmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZFRlbXBsYXRlKFN0cmluZyB0ZW1wbGF0ZU5hbWUpIHsKLQkJT2JqZWN0IHRlbXBsYXRlID0gbnVsbDsKLQotCQlpZiAodGVtcGxhdGVOYW1lICE9IG51bGwgJiYgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJLy8gcGljayB0aGUgbGFzdCB1c2VkIHRlbXBsYXRlCi0JCQl0ZW1wbGF0ZSA9IGZUZW1wbGF0ZVN0b3JlLmZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MuTkVXKTsKLQkJfQotCi0JCS8vIG5vIHJlY29yZCBvZiBsYXN0IHVzZWQgdGVtcGxhdGUgc28ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJaWYgKHRlbXBsYXRlID09IG51bGwpIHsKLQkJCS8vIGp1c3QgcGljayBmaXJzdCBlbGVtZW50Ci0JCQl0ZW1wbGF0ZSA9IGZUYWJsZVZpZXdlci5nZXRFbGVtZW50QXQoMCk7Ci0JCX0KLQotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGVtcGxhdGUpOwotCQkJZlRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgcGF0dGVybiB2aWV3ZXIuCi0JICovCi0Jdm9pZCB1cGRhdGVWaWV3ZXJJbnB1dCgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU1dpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3dpemFyZC9OZXdDU1NXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiNDU2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU1dpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0b3IuQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLQotcHVibGljIGNsYXNzIE5ld0NTU1dpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCXByaXZhdGUgTmV3Q1NTRmlsZVdpemFyZFBhZ2UgZk5ld0ZpbGVQYWdlOwotCXByaXZhdGUgTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZSBmTmV3RmlsZVRlbXBsYXRlc1BhZ2U7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWZOZXdGaWxlUGFnZSA9IG5ldyBOZXdDU1NGaWxlV2l6YXJkUGFnZSgiQ1NTV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSIsIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKElERS5jb21wdXRlU2VsZWN0ZWRSZXNvdXJjZXMoZlNlbGVjdGlvbikpKTsgLy8kTk9OLU5MUy0xJAotCQlmTmV3RmlsZVBhZ2Uuc2V0VGl0bGUoQ1NTVUlNZXNzYWdlcy5fVUlfV0laQVJEX05FV19IRUFESU5HKTsgLy8kTk9OLU5MUy0xJAotCQlmTmV3RmlsZVBhZ2Uuc2V0RGVzY3JpcHRpb24oQ1NTVUlNZXNzYWdlcy5fVUlfV0laQVJEX05FV19ERVNDUklQVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkUGFnZShmTmV3RmlsZVBhZ2UpOwotCi0JCWZOZXdGaWxlVGVtcGxhdGVzUGFnZSA9IG5ldyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlKCk7Ci0JCWFkZFBhZ2UoZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBhcHBseUxpbmVEZWxpbWl0ZXIoSUZpbGUgZmlsZSwgU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRTdHJpbmcoUGxhdGZvcm0uUElfUlVOVElNRSwgUGxhdGZvcm0uUFJFRl9MSU5FX1NFUEFSQVRPUiwgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpLCBuZXcgSVNjb3BlQ29udGV4dFtdIHtuZXcgUHJvamVjdFNjb3BlKGZpbGUuZ2V0UHJvamVjdCgpKSwgbmV3IEluc3RhbmNlU2NvcGUoKSB9KTsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBjb252ZXJ0ZWRUZXh0ID0gU3RyaW5nVXRpbHMucmVwbGFjZSh0ZXh0LCAiXHJcbiIsICJcbiIpOwotCQljb252ZXJ0ZWRUZXh0ID0gU3RyaW5nVXRpbHMucmVwbGFjZShjb252ZXJ0ZWRUZXh0LCAiXHIiLCAiXG4iKTsKLQkJY29udmVydGVkVGV4dCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UoY29udmVydGVkVGV4dCwgIlxuIiwgbGluZURlbGltaXRlcik7Ci0JCXJldHVybiBjb252ZXJ0ZWRUZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JCWZTZWxlY3Rpb24gPSBhU2VsZWN0aW9uOwotCQlzZXRXaW5kb3dUaXRsZShDU1NVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfTkVXX1RJVExFKTsgLy8kTk9OLU5MUy0xJAotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IENTU0ltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfV0laQkFOX05FV0NTU0ZJTEUpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcihmaW5hbCBJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgZmlsZSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJYm9vbGVhbiBwZXJmb3JtZWRPSyA9IGZhbHNlOwotCi0JCS8vIHNhdmUgdXNlciBvcHRpb25zIGZvciBuZXh0IHVzZQotCQlmTmV3RmlsZVRlbXBsYXRlc1BhZ2Uuc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGFkZCBkZWZhdWx0IGV4dGVuc2lvbgotCQlTdHJpbmcgZmlsZU5hbWUgPSBmTmV3RmlsZVBhZ2UuZ2V0RmlsZU5hbWUoKTsKLQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGZOZXdGaWxlUGFnZS5hZGREZWZhdWx0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkJCWZOZXdGaWxlUGFnZS5zZXRGaWxlTmFtZShuZXdGaWxlTmFtZSk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgYSBuZXcgZW1wdHkgZmlsZQotCQlJRmlsZSBmaWxlID0gZk5ld0ZpbGVQYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQkvLyBpZiB0aGVyZSB3YXMgcHJvYmxlbSB3aXRoIGNyZWF0aW5nIGZpbGUsIGl0IHdpbGwgYmUgbnVsbCwgc28gbWFrZQotCQkvLyBzdXJlIHRvIGNoZWNrCi0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCS8vIHB1dCB0ZW1wbGF0ZSBjb250ZW50cyBpbnRvIGZpbGUKLQkJCVN0cmluZyB0ZW1wbGF0ZVN0cmluZyA9IGZOZXdGaWxlVGVtcGxhdGVzUGFnZS5nZXRUZW1wbGF0ZVN0cmluZygpOwotCQkJaWYgKHRlbXBsYXRlU3RyaW5nICE9IG51bGwpIHsKLQkJCQl0ZW1wbGF0ZVN0cmluZyA9IGFwcGx5TGluZURlbGltaXRlcihmaWxlLCB0ZW1wbGF0ZVN0cmluZyk7Ci0JCQkJLy8gZGV0ZXJtaW5lIHRoZSBlbmNvZGluZyBmb3IgdGhlIG5ldyBmaWxlCi0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQkJU3RyaW5nIGNoYXJTZXQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0KLQkJCQl0cnkgewotCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0U3RyZWFtV3JpdGVyID0gbnVsbDsKLQkJCQkJaWYgKGNoYXJTZXQgPT0gbnVsbCB8fCBjaGFyU2V0LnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIGp1c3QgdXNlIGRlZmF1bHQgZW5jb2RpbmcKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtLCBjaGFyU2V0KTsKLQkJCQkJfQotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIud3JpdGUodGVtcGxhdGVTdHJpbmcpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmNsb3NlKCk7Ci0JCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJCQkJZmlsZS5zZXRDb250ZW50cyhpbnB1dFN0cmVhbSwgdHJ1ZSwgZmFsc2UsIG51bGwpOwotCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCBjcmVhdGUgY29udGVudHMgZm9yIG5ldyBDU1MgZmlsZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJLy8gb3BlbiB0aGUgZmlsZSBpbiBlZGl0b3IKLQkJCW9wZW5FZGl0b3IoZmlsZSk7Ci0KLQkJCS8vIGV2ZXJ5dGhpbmcncyBmaW5lCi0JCQlwZXJmb3JtZWRPSyA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHBlcmZvcm1lZE9LOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9DU1NDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9DU1NDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJjOWQ4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvY29udGVudG91dGxpbmUvQ1NTQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBvdXRsaW5lIHZpZXcgcGFnZSB3aGljaCBzaG93cyBDU1MgY29udGVudC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ1NTQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIGV4dGVuZHMgQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIHsKLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgZkNvbnRlbnRQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBmTGFiZWxQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT1VUTElORV9TT1JUX1BSRUYgPSAib3V0bGluZS1zb3J0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBDU1NDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ1NTQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJQ29udHJpYnV0aW9uSXRlbVtdIGNyZWF0ZVRvb2xiYXJDb250cmlidXRpb25zKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBzdXBlci5jcmVhdGVUb29sYmFyQ29udHJpYnV0aW9ucyh2aWV3ZXIpOwotCi0JCVNvcnRBY3Rpb24gc29ydEFjdGlvbiA9IG5ldyBTb3J0QWN0aW9uKHZpZXdlciwgQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLCBPVVRMSU5FX1NPUlRfUFJFRik7Ci0JCUlDb250cmlidXRpb25JdGVtIHNvcnRJdGVtID0gbmV3IFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbShzb3J0QWN0aW9uKTsKLQotCQlpZiAoaXRlbXMgPT0gbnVsbCkgewotCQkJaXRlbXMgPSBuZXcgSUNvbnRyaWJ1dGlvbkl0ZW1bMV07Ci0JCQlpdGVtc1swXSA9IHNvcnRJdGVtOwotCQl9Ci0JCWVsc2UgewotCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBjb21iaW5lZEl0ZW1zID0gbmV3IElDb250cmlidXRpb25JdGVtW2l0ZW1zLmxlbmd0aCArIDFdOwotCQkJY29tYmluZWRJdGVtc1swXSA9IHNvcnRJdGVtOwotCQkJU3lzdGVtLmFycmF5Y29weShpdGVtcywgMCwgY29tYmluZWRJdGVtcywgMSwgaXRlbXMubGVuZ3RoKTsKLQkJCWl0ZW1zID0gY29tYmluZWRJdGVtczsKLQkJfQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0JcHVibGljIElDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmQ29udGVudFByb3ZpZGVyID09IG51bGwpCi0JCQlmQ29udGVudFByb3ZpZGVyID0gbmV3IEpGYWNlTm9kZUNvbnRlbnRQcm92aWRlckNTUygpOwotCQlyZXR1cm4gZkNvbnRlbnRQcm92aWRlcjsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBnZXRGaWx0ZXJlZE5vZGUoT2JqZWN0IG8pIHsKLQkJSUNTU05vZGUgbm9kZSA9IG51bGw7Ci0JCWlmIChvIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCW5vZGUgPSAoSUNTU05vZGUpIG87Ci0JCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSB7Ci0JCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiAhKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkpIHsKLQkJCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGVUeXBlID09IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkgewotCQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGVUeXBlID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB7Ci0JCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gZ2V0RmlsdGVyZWROb2RlcyhPYmplY3RbXSBvYmplY3RzKSB7Ci0JCU9iamVjdFtdIGZpbHRlcmVkID0gbmV3IE9iamVjdFtvYmplY3RzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVyZWQubGVuZ3RoOyBpKyspIHsKLQkJCWZpbHRlcmVkW2ldID0gZ2V0RmlsdGVyZWROb2RlKG9iamVjdHNbaV0pOwotCQl9Ci0JCXJldHVybiBmaWx0ZXJlZDsKLQl9Ci0KLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQlpZiAoZkxhYmVsUHJvdmlkZXIgPT0gbnVsbCkKLQkJCWZMYWJlbFByb3ZpZGVyID0gbmV3IEpGYWNlTm9kZUxhYmVsUHJvdmlkZXJDU1MoKTsKLQkJcmV0dXJuIGZMYWJlbFByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5TdHJ1Y3R1cmVkQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbihUcmVlVmlld2VyIHZpZXdlciwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSVNlbGVjdGlvbiBmaWx0ZXJlZFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlPYmplY3RbXSBmaWx0ZXJlZE5vZGVzID0gZ2V0RmlsdGVyZWROb2RlcygoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvQXJyYXkoKSk7Ci0JCQlmaWx0ZXJlZFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpbHRlcmVkTm9kZXMpOwotCQl9Ci0JCXJldHVybiBmaWx0ZXJlZFNlbGVjdGlvbjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUNvbnRlbnRQcm92aWRlckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUNvbnRlbnRQcm92aWRlckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGYzNTNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVDb250ZW50UHJvdmlkZXJDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotCi0vKioKLSAqIEEgQ29udGVudCBwcm92aWRlciBmb3IgYSBKRmFjZSB2aWV3ZXIgdXNlZCB0byBkaXNwbGF5IENTUyBub2Rlcy4gVGhpcwotICogY29udGVudCBwcm92aWRlciBkb2VzIG5vdCB1c2UgYWRhcHRlcnMuCi0gKi8KLWNsYXNzIEpGYWNlTm9kZUNvbnRlbnRQcm92aWRlckNTUyBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotCXB1YmxpYyBKRmFjZU5vZGVDb250ZW50UHJvdmlkZXJDU1MoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbGVtZW50cyhPYmplY3QgZWxlbWVudCwgQXJyYXlMaXN0IHYpIHsKLQotCQlJQ1NTTm9kZSBub2RlOwotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQlJQ1NTTW9kZWwgbW9kZWwgPSAoSUNTU01vZGVsKSBlbGVtZW50OwotCQkJSUNTU0RvY3VtZW50IGRvYyA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQlub2RlID0gZG9jLmdldEZpcnN0Q2hpbGQoKTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCW5vZGUgPSAoKElDU1NOb2RlKSBlbGVtZW50KS5nZXRGaXJzdENoaWxkKCk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuOwotCi0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUnVsZSkgewotCQkJCXYuYWRkKG5vZGUpOwotCQkJfQotCi0JCQlub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgdmlzdWFsIHBhcnQgdGhhdCBpcyB1c2luZyB0aGlzIGNvbnRlbnQgcHJvdmlkZXIgaXMgYWJvdXQgdG8gYmUKLQkgKiBkaXNwb3NlZC4gRGVhbGxvY2F0ZSBhbGwgYWxsb2NhdGVkIFNXVCByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIGNvbnRhaW5pbmcgYWxsIGNoaWxkIG5vZGVzIG9mIHRoZSBnaXZlbiBlbGVtZW50LAotCSAqIHdoaWNoIHJlcHJlc2VudHMgYSBub2RlIGluIGEgdHJlZS4gVGhlIGRpZmZlcmVuY2UgdG8KLQkgKiA8Y29kZT5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhPYmplY3QpPC9jb2RlPiBpcyBhcwotCSAqIGZvbGxvd3M6IDxjb2RlPmdldEVsZW1lbnRzPC9jb2RlPiBpcyBjYWxsZWQgdG8gb2J0YWluIHRoZSB0cmVlCi0JICogdmlld2VyJ3Mgcm9vdCBlbGVtZW50cy4gTWV0aG9kIDxjb2RlPmdldENoaWxkcmVuPC9jb2RlPiBpcyB1c2VkIHRvCi0JICogb2J0YWluIHRoZSBjaGlsZHJlbiBvZiBhIGdpdmVuIG5vZGUgaW4gdGhlIHRyZWUsIHdoaWNoIGNhbiBjYW4gYmUgYQotCSAqIHJvb3Qgbm9kZSwgdG9vLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKG9iamVjdCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCi0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gd2l0aCB0aGUgZWxlbWVudHMgYmVsb25naW5nIHRvIHRoZSBwYXNzZWQKLQkgKiBlbGVtZW50LiBUaGVzZSBlbGVtZW50cyBjYW4gYmUgcHJlc2VudGVkIGFzIHJvd3MgaW4gYSB0YWJsZSwgaXRlbXMgaW4gYQotCSAqIGxpc3QgZXRjLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKG9iamVjdCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlci5nZXRFbGVtZW50cyhvYmplY3QpOwotCi0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIHRoYXQgdGhlIHBhcmVudCBjYW4ndCBiZSBjb21wdXRlZC4gSW4KLQkgKiB0aGlzIGNhc2UgdGhlIHRyZWUgdmlld2VyIGNhbid0IGV4cGFuZCBhIGdpdmVuIG5vZGUgY29ycmVjdGx5IGlmCi0JICogcmVxdWVzdGVkLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIob2JqZWN0KTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBhZGFwdGVyLmdldFBhcmVudChvYmplY3QpOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGVsZW1lbnQgaGFzIGNoaWxkcmVuLgotCSAqIE90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlJSkZhY2VOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcihvYmplY3QpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuaGFzQ2hpbGRyZW4ob2JqZWN0KTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKG9sZElucHV0ICE9IG51bGwgJiYgb2xkSW5wdXQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZE1vZGVsKSB7Ci0JCQlJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkpICgoSVN0cnVjdHVyZWRNb2RlbCkgb2xkSW5wdXQpLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkucmVtb3ZlTGlzdGVuZXIodmlld2VyKTsKLQkJCX0KLQkJfQotCQlpZiAobmV3SW5wdXQgIT0gbnVsbCAmJiBuZXdJbnB1dCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCUlKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKElKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSkgKChJU3RydWN0dXJlZE1vZGVsKSBuZXdJbnB1dCkuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeUZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJZmFjdG9yeS5hZGRMaXN0ZW5lcih2aWV3ZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGVsZW1lbnQgaXMgZGVsZXRlZCBvciBub3QuCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEpGYWNlIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGFibGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QgVGhlIG9iamVjdCB0byBnZXQgdGhlIGFkYXB0ZXIgZm9yCi0JICovCi0JcHJpdmF0ZSBJSkZhY2VOb2RlQWRhcHRlciBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGUpIHsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0JCWlmIChhZGFwdGFibGUgaW5zdGFuY2VvZiBJQ1NTTW9kZWwpIHsKLQkJCWFkYXB0YWJsZSA9ICgoSUNTU01vZGVsKSBhZGFwdGFibGUpLmdldERvY3VtZW50KCk7Ci0JCX0KLQkJaWYgKGFkYXB0YWJsZSBpbnN0YW5jZW9mIElDU1NOb2RlICYmIGFkYXB0YWJsZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9ICgoSU5vZGVOb3RpZmllcikgYWRhcHRhYmxlKS5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChub2RlQWRhcHRlciBpbnN0YW5jZW9mIElKRmFjZU5vZGVBZGFwdGVyKQotCQkJCWFkYXB0ZXIgPSAoSUpGYWNlTm9kZUFkYXB0ZXIpIG5vZGVBZGFwdGVyOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVMYWJlbFByb3ZpZGVyQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvY29udGVudG91dGxpbmUvSkZhY2VOb2RlTGFiZWxQcm92aWRlckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjRkZTJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVMYWJlbFByb3ZpZGVyQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotCi1jbGFzcyBKRmFjZU5vZGVMYWJlbFByb3ZpZGVyQ1NTIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBKRmFjZU5vZGVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEpGYWNlTm9kZUxhYmVsUHJvdmlkZXJDU1MoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSkZhY2UgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGFkYXB0YWJsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCBUaGUgb2JqZWN0IHRvIGdldCB0aGUgYWRhcHRlciBmb3IKLQkgKi8KLQlwcml2YXRlIElKRmFjZU5vZGVBZGFwdGVyIGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZSkgewotCQlJSkZhY2VOb2RlQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLQkJaWYgKGFkYXB0YWJsZSBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJYWRhcHRhYmxlID0gKChJQ1NTTW9kZWwpIGFkYXB0YWJsZSkuZ2V0RG9jdW1lbnQoKTsKLQkJfQotCQlpZiAoYWRhcHRhYmxlIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJSU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gKChJTm9kZU5vdGlmaWVyKSBhZGFwdGFibGUpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKG5vZGVBZGFwdGVyIGluc3RhbmNlb2YgSUpGYWNlTm9kZUFkYXB0ZXIpCi0JCQkJYWRhcHRlciA9IChJSkZhY2VOb2RlQWRhcHRlcikgbm9kZUFkYXB0ZXI7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgZm9yIHVzZSBpbiB0aGUKLQkgKiBnaXZlbiB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgVGhlIHZpZXdlciB0aGF0IGRpc3BsYXlzIHRoZSBlbGVtZW50LgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gcHJvdmlkZSB0aGUgbGFiZWwgaW1hZ2UuIEVsZW1lbnQKLQkgKiAgICAgICAgICAgIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIG5vIGlucHV0IG9iamVjdCBpcyBzZXQKLQkgKiAgICAgICAgICAgIHRvIHRoZSB2aWV3ZXIuCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIoZWxlbWVudCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlpbWFnZSA9IGFkYXB0ZXIuZ2V0TGFiZWxJbWFnZShlbGVtZW50KTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgZm9yIHVzZSBpbiB0aGUKLQkgKiBnaXZlbiB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgVGhlIHZpZXdlciB0aGF0IGRpc3BsYXlzIHRoZSBlbGVtZW50LgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gcHJvdmlkZSB0aGUgbGFiZWwgdGV4dC4gRWxlbWVudCBjYW4KLQkgKiAgICAgICAgICAgIGJlIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgbm8gaW5wdXQgb2JqZWN0IGlzIHNldCB0bwotCSAqICAgICAgICAgICAgdGhlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlJSkZhY2VOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcihlbGVtZW50KTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJdGV4dCA9IGFkYXB0ZXIuZ2V0TGFiZWxUZXh0KGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgbGFiZWwgcHJvdmlkZXIgaXMgYWZmZWN0ZWQgYnkgdGhlIGdpdmVuIGRvbWFpbgotCSAqIGV2ZW50LgotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZmZlY3RlZChPYmplY3QgZHVtbXkpIHsvLyBEb21haW5FdmVudCBldmVudCkgewotCQkvLyByZXR1cm4gZXZlbnQuaXNNb2RpZmllcihEb21haW5FdmVudC5OT05fU1RSVUNUVVJFX0NIQU5HRSk7Ci0JCXJldHVybiB0cnVlOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBsYWJlbCB3b3VsZCBiZSBhZmZlY3RlZCBieSBhIGNoYW5nZSB0byB0aGUgZ2l2ZW4KLQkgKiBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byBvcHRpbWl6ZSBhCi0JICogbm9uLXN0cnVjdHVyYWwgdmlld2VyIHVwZGF0ZS4gSWYgdGhlIHByb3BlcnR5IG1lbnRpb25lZCBpbiB0aGUgdXBkYXRlCi0JICogZG9lcyBub3QgYWZmZWN0IHRoZSBsYWJlbCwgdGhlbiB0aGUgdmlld2VyIG5lZWQgbm90IHVwZGF0ZSB0aGUgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIHByb3BlcnR5Ci0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsYWJlbCB3b3VsZCBiZSBhZmZlY3RlZCwgYW5kCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgd291bGQgYmUgdW5hZmZlY3RlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvY29udGVudG91dGxpbmUvU29ydEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL1NvcnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcwZGJmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvY29udGVudG91dGxpbmUvU29ydEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5DU1NFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbjsKLQotLyoKLSAqIEJhc2VkIG9uIERURENvbnRlbnRPdXRsaW5lUGFnZSNTb3J0QWN0aW9uCi0gKi8KLWNsYXNzIFNvcnRBY3Rpb24gZXh0ZW5kcyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbiB7Ci0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwdWJsaWMgU29ydEFjdGlvbihUcmVlVmlld2VyIHZpZXdlciwgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIHByZWZlcmVuY2VLZXkpIHsKLQkJc3VwZXIoQ1NTVUlNZXNzYWdlcy5Tb3J0QWN0aW9uXzAsIHN0b3JlLCBwcmVmZXJlbmNlS2V5LCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oQ1NTVUlQbHVnaW4uSUQsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1NPUlQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoZGVzYyk7Ci0JCXNldFRvb2xUaXBUZXh0KGdldFRleHQoKSk7Ci0JCXRyZWVWaWV3ZXIgPSB2aWV3ZXI7Ci0JCWlmIChpc0NoZWNrZWQoKSkgewotCQkJdHJlZVZpZXdlci5zZXRDb21wYXJhdG9yKG5ldyBWaWV3ZXJDb21wYXJhdG9yKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KGZhbHNlKTsKLQkJT2JqZWN0W10gZXhwYW5kZWRFbGVtZW50cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOwotCQlpZiAoaXNDaGVja2VkKCkpIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q29tcGFyYXRvcihuZXcgVmlld2VyQ29tcGFyYXRvcigpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q29tcGFyYXRvcihudWxsKTsKLQkJfQotCQl0cmVlVmlld2VyLnNldElucHV0KHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRFbGVtZW50cyhleHBhbmRlZEVsZW1lbnRzKTsKLQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9wcm9wZXJ0aWVzL0NTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvcHJvcGVydGllcy9DU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGMxZmE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9wcm9wZXJ0aWVzL0NTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnZpZXdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb3BlcnRpZXMuQ1NTUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZm9yIHByb3BlcnR5IHNoZWV0IHBhZ2Ugd2hpY2ggc2hvd3MgQ1NTIGNvbnRlbnQuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiBleHRlbmRzIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIHsKLQlwcml2YXRlIGNsYXNzIENTU1Byb3BlcnR5U2hlZXRSZWZyZXNoQWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciB7Ci0JCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkJaWYgKGZQcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7Ci0JCQkJZ2V0UHJvcGVydGllc1JlZnJlc2hKb2IoKS5hZGRQcm9wZXJ0eVNoZWV0UGFnZShmUHJvcGVydHlTaGVldFBhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDU1NQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlUHJvdmlkZXIgewotCQlwcml2YXRlIElQcm9wZXJ0eVNvdXJjZSBmUHJvcGVydHlTb3VyY2UgPSBudWxsOwotCQlwcml2YXRlIElDU1NOb2RlIGZTb3VyY2UgPSBudWxsOwotCi0JCXB1YmxpYyBJUHJvcGVydHlTb3VyY2UgZ2V0UHJvcGVydHlTb3VyY2UoT2JqZWN0IG9iamVjdCkgewotCQkJaWYgKGZTb3VyY2UgIT0gbnVsbCAmJiBvYmplY3QuZXF1YWxzKGZTb3VyY2UpKSB7Ci0JCQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZTsKLQkJCX0KLQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkJZlNvdXJjZSA9IChJQ1NTTm9kZSlvYmplY3Q7Ci0JCQkJZlByb3BlcnR5U291cmNlID0gbmV3IENTU1Byb3BlcnR5U291cmNlKGZTb3VyY2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZlNvdXJjZSA9IG51bGw7Ci0JCQkJZlByb3BlcnR5U291cmNlID0gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBmUHJvcGVydHlTb3VyY2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFByb3BlcnRpZXNSZWZyZXNoSm9iIGV4dGVuZHMgVUlKb2IgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUERBVEVfREVMQVkgPSAyMDA7Ci0KLQkJcHJpdmF0ZSBTZXQgcHJvcGVydHlTaGVldFBhZ2VzID0gbnVsbDsKLQotCQlwdWJsaWMgUHJvcGVydGllc1JlZnJlc2hKb2IoKSB7Ci0JCQlzdXBlcihYTUxVSU1lc3NhZ2VzLkpGYWNlTm9kZUFkYXB0ZXJfMSk7Ci0JCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JCQlzZXRQcmlvcml0eShKb2IuU0hPUlQpOwotCQkJcHJvcGVydHlTaGVldFBhZ2VzID0gbmV3IEhhc2hTZXQoMSk7Ci0JCX0KLQotCQl2b2lkIGFkZFByb3BlcnR5U2hlZXRQYWdlKElQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlKSB7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZXMuYWRkKHBhZ2UpOwotCQkJc2NoZWR1bGUoVVBEQVRFX0RFTEFZKTsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlPYmplY3RbXSBwYWdlcyA9IHByb3BlcnR5U2hlZXRQYWdlcy50b0FycmF5KCk7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZXMuY2xlYXIoKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UgPSAoUHJvcGVydHlTaGVldFBhZ2UpIHBhZ2VzW2ldOwotCQkJCWlmIChwYWdlLmdldENvbnRyb2woKSAhPSBudWxsICYmICFwYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJcGFnZS5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCX0KLQotCXByaXZhdGUgUHJvcGVydGllc1JlZnJlc2hKb2IgZlByb3BlcnRpZXNSZWZyZXNoSm9iID0gbnVsbDsKLQotCUlQcm9wZXJ0eVNoZWV0UGFnZSBmUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQlwcml2YXRlIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyID0gbnVsbDsKLQotCXByaXZhdGUgSU5vZGVBZGFwdGVyIGZSZWZyZXNoQWRhcHRlciA9IG5ldyBDU1NQcm9wZXJ0eVNoZWV0UmVmcmVzaEFkYXB0ZXIoKTsKLQotCXByaXZhdGUgSU5vZGVOb3RpZmllcltdIGZTZWxlY3RlZE5vdGlmaWVyczsKLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0SW5wdXRTZWxlY3Rpb24oSVdvcmtiZW5jaFBhcnQgc2VsZWN0aW5nUGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gcmVtb3ZlIFVJIHJlZnJlc2ggYWRhcHRlcnMKLQkJaWYgKGZTZWxlY3RlZE5vdGlmaWVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZTZWxlY3RlZE5vdGlmaWVycy5sZW5ndGg7IGkrKykgewotCQkJCWZTZWxlY3RlZE5vdGlmaWVyc1tpXS5yZW1vdmVBZGFwdGVyKGZSZWZyZXNoQWRhcHRlcik7Ci0JCQl9Ci0JCQlmU2VsZWN0ZWROb3RpZmllcnMgPSBudWxsOwotCQl9Ci0KLQkJSVNlbGVjdGlvbiBwcmVmZXJyZWRTZWxlY3Rpb24gPSBzdXBlci5nZXRJbnB1dFNlbGVjdGlvbihzZWxlY3RpbmdQYXJ0LCBzZWxlY3Rpb24pOwotCQlpZiAocHJlZmVycmVkU2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCU9iamVjdFtdIHNlbGVjdGVkT2JqZWN0cyA9IG5ldyBPYmplY3RbKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5zaXplKCldOwotCQkJU3lzdGVtLmFycmF5Y29weSgoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvQXJyYXkoKSwgMCwgc2VsZWN0ZWRPYmplY3RzLCAwLCBzZWxlY3RlZE9iamVjdHMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRPYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHNlbGVjdGVkT2JqZWN0c1tpXSBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkJCUlDU1NOb2RlIG5vZGUgPSAoSUNTU05vZGUpIHNlbGVjdGVkT2JqZWN0c1tpXTsKLQkJCQkJd2hpbGUgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5QUklNSVRJVkVWQUxVRV9OT0RFIHx8IG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRURFQ0xJVEVNX05PREUpIHsKLQkJCQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCXNlbGVjdGVkT2JqZWN0c1tpXSA9IG5vZGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBBZGQgVUkgcmVmcmVzaCBhZGFwdGVycyBhbmQgcmVtZW1iZXIgbm90aWZpZXJzIGZvciBsYXRlcgotCQkJICogcmVtb3ZhbAotCQkJICovCi0JCQlpZiAoc2VsZWN0ZWRPYmplY3RzLmxlbmd0aCA+IDApIHsKLQkJCQlMaXN0IHNlbGVjdGVkTm90aWZpZXJzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkT2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoc2VsZWN0ZWRPYmplY3RzW2ldIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkJc2VsZWN0ZWROb3RpZmllcnMuYWRkKHNlbGVjdGVkT2JqZWN0c1tpXSk7Ci0JCQkJCQkoKElOb2RlTm90aWZpZXIpIHNlbGVjdGVkT2JqZWN0c1tpXSkuYWRkQWRhcHRlcihmUmVmcmVzaEFkYXB0ZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZTZWxlY3RlZE5vdGlmaWVycyA9IChJTm9kZU5vdGlmaWVyW10pIHNlbGVjdGVkTm90aWZpZXJzLnRvQXJyYXkobmV3IElOb2RlTm90aWZpZXJbc2VsZWN0ZWROb3RpZmllcnMuc2l6ZSgpXSk7Ci0JCQl9Ci0JCQlwcmVmZXJyZWRTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3RlZE9iamVjdHMpOwotCQl9Ci0JCXJldHVybiBwcmVmZXJyZWRTZWxlY3Rpb247Ci0JfQotCi0JUHJvcGVydGllc1JlZnJlc2hKb2IgZ2V0UHJvcGVydGllc1JlZnJlc2hKb2IoKSB7Ci0JCWlmIChmUHJvcGVydGllc1JlZnJlc2hKb2IgPT0gbnVsbCkgewotCQkJZlByb3BlcnRpZXNSZWZyZXNoSm9iID0gbmV3IFByb3BlcnRpZXNSZWZyZXNoSm9iKCk7Ci0JCX0KLQkJcmV0dXJuIGZQcm9wZXJ0aWVzUmVmcmVzaEpvYjsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5U291cmNlUHJvdmlkZXIgZ2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihJUHJvcGVydHlTaGVldFBhZ2UgcGFnZSkgewotCQlpZiAoZlByb3BlcnR5U291cmNlUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZlByb3BlcnR5U291cmNlUHJvdmlkZXIgPSBuZXcgQ1NTUHJvcGVydHlTb3VyY2VQcm92aWRlcigpOwotCQkJZlByb3BlcnR5U2hlZXRQYWdlID0gcGFnZTsKLQkJfQotCQlyZXR1cm4gZlByb3BlcnR5U291cmNlUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmUoKSB7Ci0JCXN1cGVyLnVuY29uZmlndXJlKCk7Ci0JCWlmIChmU2VsZWN0ZWROb3RpZmllcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmU2VsZWN0ZWROb3RpZmllcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlmU2VsZWN0ZWROb3RpZmllcnNbaV0ucmVtb3ZlQWRhcHRlcihmUmVmcmVzaEFkYXB0ZXIpOwotCQkJfQotCQkJZlNlbGVjdGVkTm90aWZpZXJzID0gbnVsbDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvdGVtcGxhdGVzL2Nzc2RlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvdGVtcGxhdGVzL2Nzc2RlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjgyZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3RlbXBsYXRlcy9jc3NkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVRlbXBsYXRlcy5uZXdjc3MubmFtZT1OZXcgQ1NTIEZpbGUKLVRlbXBsYXRlcy5uZXdjc3MuZGVzYz1uZXcgY3NzIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS90ZW1wbGF0ZXMvY3NzZGVmYXVsdC10ZW1wbGF0ZXMueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3RlbXBsYXRlcy9jc3NkZWZhdWx0LXRlbXBsYXRlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZTBmMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3RlbXBsYXRlcy9jc3NkZWZhdWx0LXRlbXBsYXRlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC0tPgotPHRlbXBsYXRlcz4KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLm5ld2Nzcy5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5uZXdjc3MuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzLm5ld2NzcyIgY29udGV4dD0iY3NzX25ldyIgZW5hYmxlZD0idHJ1ZSI+QENIQVJTRVQgIiR7ZW5jb2Rpbmd9Ijs8L3RlbXBsYXRlPgotPC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM1NWViYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbnRlbnRtb2RlbC8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJlbWZtb2RlbC8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzYXhwYXJzZXIvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLXZhbGlkYXRpb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmExMzk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotcnVudGltZQotZHRkY29yZS5qYXIKLSouemlwCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1AZG90Ci1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjI0OWU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmY5YjM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSNTYXQgTWFyIDI0IDAyOjE2OjMyIEVEVCAyMDA3DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzgwOTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNXZWQgTm92IDE1IDAyOjA4OjQ1IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjE5ODgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jV2VkIE5vdiAxNSAwMjowODo0NSBFU1QgMjAwNg0KLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MA0KLWNvbXBpbGVycy5wLmJ1aWxkPTANCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTENCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wDQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTANCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wDQotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MA0KLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MA0KLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xDQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wDQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MA0KLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTANCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MA0KLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlDQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDE4NjdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjIwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERDb3JlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5jb250ZW50O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5ldmVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50YXNrczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50b2tlbml6ZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS50ZXh0LAotIHJvc2UKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMSwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMi4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjguMSw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenk7IGV4Y2x1ZGU6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuY29udGVudCIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMzMyYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbAotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgY29udGVudG1vZGVsLyxcCi0gICAgICAgICAgIGVtZm1vZGVsLyxcCi0gICAgICAgICAgIHNheHBhcnNlci8sXAotICAgICAgICAgICBzcmMtdmFsaWRhdGlvbi8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGRjMTJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3QuZHRkIj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3dlYnRvb2xzL3dzdC9jb21wb25lbnRzL2R0ZC9vdmVydmlldy5odG1sIiAvPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQiIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZSIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IkRURENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AiIGZyYWdtZW50PSJmYWxzZSIgLz4KLTwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudEZhY3RvcnlEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnRGYWN0b3J5RFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZTY0YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudEZhY3RvcnlEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5LkNNRG9jdW1lbnRGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgYnVpbGRlciBoYW5kbGVzIGJ1aWxkaW5nIC5kdGQgZ3JhbW1hciBmaWxlcwotICovCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudEZhY3RvcnlEVEQgaW1wbGVtZW50cyBDTURvY3VtZW50RmFjdG9yeSB7Ci0JcHVibGljIENNRG9jdW1lbnRGYWN0b3J5RFREKCkgewotCX0KLQotCi0JcHVibGljIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudChTdHJpbmcgdXJpKSB7Ci0JCS8vIHdvcmsgYXJvdW5kIGEgYnVnIGluIG91ciBwYXJzZXJzCi0JCS8vIHRvZG8uLi4gcmV2aXNpdCB0aGlzCi0JCS8vCi0vLwkJaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDQ4MQotLy8JCVN0cmluZyBmaWxlUHJvdG9jb2wgPSAiZmlsZToiOyAvLyROT04tTkxTLTEkCi0vLwkJaWYgKHVyaS5zdGFydHNXaXRoKGZpbGVQcm90b2NvbCkpIHsKLS8vCQkJdXJpID0gdXJpLnN1YnN0cmluZyhmaWxlUHJvdG9jb2wubGVuZ3RoKCkpOwotLy8JCX0KLQotCQlDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBEVERJbXBsLmJ1aWxkQ01Eb2N1bWVudCh1cmkpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiY291bGQgbm90IGNyZWF0ZSBjb250ZW50IG1vZGVsIGZvciBVUkk6ICIgKyB1cmksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZTdjNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ01Ob2RlSW1wbCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQ01Ob2RlIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ET0NVTUVOVEFUSU9OID0gImRvY3VtZW50YXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRE9DVU1FTlRBVElPTl9TT1VSQ0UgPSAiZG9jdW1lbnRhdGlvblNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ET0NVTUVOVEFUSU9OX0xBTkdVQUdFID0gImRvY3VtZW50YXRpb25MYW5ndWFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9NT0ZfTk9USUZJRVIgPSAia2V5IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFRklOSVRJT05fSU5GTyA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvZGVmaW5pdGlvbkluZm8iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfREVGSU5JVElPTiA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvZGVmaW5pdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0S2V5KCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX01PRl9OT1RJRklFUik7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvYmplY3QpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9EVERJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9EVERJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MTgwY2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvRFRESW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQW55Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEREZWZhdWx0S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbC5EVERCYXNpY1R5cGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbC5EVERQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFRETWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbnRpdHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmFubm90YXRpb24uQW5ub3RhdGlvbk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNRGF0YVR5cGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01FbnRpdHlEZWNsYXJhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5hbWVkTm9kZU1hcEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5vZGVMaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01EZXNjcmlwdGlvbkJ1aWxkZXI7Ci0KLQotcHVibGljIGNsYXNzIERUREltcGwgewotCXN0YXRpYyB7Ci0JCS8vIENhbGwgaW5pdCBvbiB0aGUgRFREIHBhY2thZ2UgdG8gYXZvaWQgc3RyYW5nZSBpbml0aWFsaXphdGlvbiBidWdzCi0JCS8vCi0JCURURFBhY2thZ2VJbXBsLmluaXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIERUREFkYXB0ZXJGYWN0b3J5SW1wbCBkdGRBZGFwdGVyRmFjdG9yeUltcGwgPSBuZXcgRFREQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBDTURhdGFUeXBlSW5mb1RhYmxlIGNtRGF0YVR5cGVJbmZvVGFibGUgPSBuZXcgQ01EYXRhVHlwZUluZm9UYWJsZSgpOwotCi0JcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGJ1aWxkQ01Eb2N1bWVudChTdHJpbmcgdXJpKSB7Ci0JCURUREZpbGUgZHRkRmlsZSA9IGJ1aWxkRFRETW9kZWwodXJpKTsKLQkJQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoZHRkRmlsZSk7Ci0JCQotCQlyZXR1cm4gY21Eb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERUREZpbGUgYnVpbGREVERNb2RlbChTdHJpbmcgdXJpKSB7Ci0JCURURFV0aWwgZHRkVXRpbCA9IG5ldyBEVERVdGlsKCk7Ci0JCWR0ZFV0aWwuc2V0ZXhwYW5kRW50aXR5UmVmZXJlbmNlcyh0cnVlKTsKLQkJZHRkVXRpbC5wYXJzZShuZXcgUmVzb3VyY2VTZXRJbXBsKCksIHVyaSk7Ci0JCXJldHVybiBkdGRVdGlsLmdldERUREZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENNRG9jdW1lbnQgYnVpbGRDTURvY3VtZW50KERUREZpbGUgZHRkRmlsZSkgewotCQlyZXR1cm4gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoZHRkRmlsZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDTU5vZGUgZ2V0QWRhcHRlcihOb3RpZmllciBvKSB7Ci0JCXJldHVybiAoQ01Ob2RlKSBkdGRBZGFwdGVyRmFjdG9yeUltcGwuYWRhcHQobyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TWluT2NjdXJIZWxwZXIoRFREUmVwZWF0YWJsZUNvbnRlbnQgY29udGVudCkgewotCQlpbnQgb2NjdXJlbmNlID0gY29udGVudC5nZXRPY2N1cnJlbmNlKCkuZ2V0VmFsdWUoKTsKLQkJYm9vbGVhbiBpc09wdGlvbmFsID0gKG9jY3VyZW5jZSA9PSBEVERPY2N1cnJlbmNlVHlwZS5PUFRJT05BTCB8fCBvY2N1cmVuY2UgPT0gRFRET2NjdXJyZW5jZVR5cGUuWkVST19PUl9NT1JFKTsKLQkJcmV0dXJuIGlzT3B0aW9uYWwgPyAwIDogMTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRNYXhPY2N1ckhlbHBlcihEVERSZXBlYXRhYmxlQ29udGVudCBjb250ZW50KSB7Ci0JCWludCBvY2N1cmVuY2UgPSBjb250ZW50LmdldE9jY3VycmVuY2UoKS5nZXRWYWx1ZSgpOwotCQlib29sZWFuIGlzTXVsdGkgPSAob2NjdXJlbmNlID09IERURE9jY3VycmVuY2VUeXBlLk9ORV9PUl9NT1JFIHx8IG9jY3VyZW5jZSA9PSBEVERPY2N1cnJlbmNlVHlwZS5aRVJPX09SX01PUkUpOwotCQlyZXR1cm4gaXNNdWx0aSA/IC0xIDogMTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERUREFkYXB0ZXJGYWN0b3J5SW1wbCBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCQlBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAodGFyZ2V0ICE9IG51bGwpIHsKLQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgRFREQXR0cmlidXRlKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBEVERBdHRyaWJ1dGVBZGFwdGVyKChEVERBdHRyaWJ1dGUpIHRhcmdldCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIERUREVsZW1lbnQpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IERUREVsZW1lbnRBZGFwdGVyKChEVERFbGVtZW50KSB0YXJnZXQpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJCQlyZXN1bHQgPSBuZXcgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRBZGFwdGVyKChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRFRERmlsZSkgewotCQkJCQlyZXN1bHQgPSBuZXcgRFRERmlsZUFkYXB0ZXIoKERUREZpbGUpIHRhcmdldCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIERUREdyb3VwQ29udGVudCkgewotCQkJCQlyZXN1bHQgPSBuZXcgRFRER3JvdXBDb250ZW50QWRhcHRlcigoRFRER3JvdXBDb250ZW50KSB0YXJnZXQpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBEVERFbnRpdHkpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IERUREVudGl0eUFkYXB0ZXIoKERUREVudGl0eSkgdGFyZ2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCQlyZXR1cm4gYWRhcHQodGFyZ2V0LCB0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERUREJhc2VBZGFwdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBEVERCYXNlQWRhcHRlciBleHRlbmRzIENNTm9kZUltcGwgewotCQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gdHlwZSA9PSBkdGRBZGFwdGVyRmFjdG9yeUltcGw7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIkNNRG9jdW1lbnQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0ID0gZ2V0Q01Eb2N1bWVudCgpOwotCQkJfQotCQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9ET0NVTUVOVEFUSU9OKSkgewotCQkJCXJlc3VsdCA9IGdldERvY3VtZW50YXRpb24oKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfREVGSU5JVElPTl9JTkZPKSkgewotCQkJCXJlc3VsdCA9IGdldERlZmluaXRpb25JbmZvKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RFRklOSVRJT04pKSB7Ci0JCQkJcmVzdWx0ID0gZ2V0RGVmaW5pdGlvbigpOwotCQkJfQotCQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9NT0ZfTk9USUZJRVIpKSB7Ci0JCQkJcmVzdWx0ID0gZ2V0S2V5KCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJzcGVjIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IGdldFNwZWMoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCUNNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENNRG9jdW1lbnQoKTsKLQkJCQkJaWYgKGNtRG9jdW1lbnQgaW5zdGFuY2VvZiBEVERGaWxlQWRhcHRlcikgewotCQkJCQkJQW5ub3RhdGlvbk1hcCBtYXAgPSAoKERUREZpbGVBZGFwdGVyKSBjbURvY3VtZW50KS5hbm5vdGF0aW9uTWFwOwotCQkJCQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQkJCQkJU3RyaW5nIHNwZWMgPSBnZXRTcGVjKCk7Ci0JCQkJCQkJaWYgKHNwZWMgIT0gbnVsbCkgewotCQkJCQkJCQlyZXN1bHQgPSBtYXAuZ2V0UHJvcGVydHkoZ2V0U3BlYygpLCBwcm9wZXJ0eU5hbWUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQkJCU1hcCBnbG9iYWxQcm9wZXJ0eU1hcCA9ICgoRFRERmlsZUFkYXB0ZXIpIGNtRG9jdW1lbnQpLmdsb2JhbFByb3BlcnR5TWFwOwotCQkJCQkJCXJlc3VsdCA9IGdsb2JhbFByb3BlcnR5TWFwLmdldChwcm9wZXJ0eU5hbWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXByb3RlY3RlZCBDTU5vZGVMaXN0IGdldERvY3VtZW50YXRpb24oKSB7Ci0JCQlyZXR1cm4gbmV3IENNTm9kZUxpc3RJbXBsKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmluaXRpb25JbmZvKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGdldERlZmluaXRpb24oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U3BlYygpIHsKLQkJCXJldHVybiBnZXROb2RlTmFtZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRFREQXR0cmlidXRlQWRhcHRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRFREQXR0cmlidXRlQWRhcHRlciBleHRlbmRzIERUREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiB7Ci0JCXByb3RlY3RlZCBEVERBdHRyaWJ1dGUgYXR0cmlidXRlOwotCQlwcm90ZWN0ZWQgQ01EYXRhVHlwZSBkYXRhVHlwZTsKLQotCQlwdWJsaWMgRFREQXR0cmlidXRlQWRhcHRlcihEVERBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCQl0aGlzLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTsKLQkJCWRhdGFUeXBlID0gbmV3IERhdGFUeXBlSW1wbCgpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0JCQlyZXR1cm4gYXR0cmlidXRlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRTcGVjKCkgewotCQkJcmV0dXJuIGF0dHJpYnV0ZS5nZXREVERFbGVtZW50KCkuZ2V0TmFtZSgpICsgIi9AIiArIGF0dHJpYnV0ZS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQlyZXR1cm4gQVRUUklCVVRFX0RFQ0xBUkFUSU9OOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBdHRyTmFtZSgpIHsKLQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIENNRGF0YVR5cGUgZ2V0QXR0clR5cGUoKSB7Ci0JCQlyZXR1cm4gZGF0YVR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgRW51bWVyYXRpb24gZ2V0RW51bUF0dHIoKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oYXR0cmlidXRlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKSk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldFVzYWdlKCkgewotCQkJaW50IHVzYWdlID0gT1BUSU9OQUw7Ci0JCQlzd2l0Y2ggKGF0dHJpYnV0ZS5nZXREZWZhdWx0S2luZCgpLmdldFZhbHVlKCkpIHsKLQkJCQljYXNlIERURERlZmF1bHRLaW5kLlJFUVVJUkVEIDogewotCQkJCQl1c2FnZSA9IFJFUVVJUkVEOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBEVEREZWZhdWx0S2luZC5GSVhFRCA6IHsKLQkJCQkJdXNhZ2UgPSBGSVhFRDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHVzYWdlOwotCQl9Ci0KLQkJcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpIHsKLQkJCURUREZpbGUgZHRkRmlsZSA9IGF0dHJpYnV0ZS5nZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpOwotCQkJcmV0dXJuIGR0ZEZpbGUgIT0gbnVsbCA/IChDTURvY3VtZW50KSBnZXRBZGFwdGVyKGR0ZEZpbGUpIDogbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBjbGFzcyBEYXRhVHlwZUltcGwgaW1wbGVtZW50cyBDTURhdGFUeXBlIHsKLQkJCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQkJcmV0dXJuIENNTm9kZS5EQVRBX1RZUEU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQkJcmV0dXJuIGdldERhdGFUeXBlTmFtZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscygiaXNWYWxpZEVtcHR5VmFsdWUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBkYXRhVHlwZU5hbWUgPSBnZXREYXRhVHlwZU5hbWUoKTsKLQkJCQkJcmVzdWx0ID0gKGRhdGFUeXBlTmFtZSA9PSBudWxsIHx8IGRhdGFUeXBlTmFtZS5lcXVhbHMoQ01EYXRhVHlwZS5DREFUQSkpID8gInRydWUiIDogImZhbHNlIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGVOYW1lKCkgewotCQkJCXJldHVybiBjbURhdGFUeXBlSW5mb1RhYmxlLmdldERhdGFUeXBlTmFtZShhdHRyaWJ1dGUuZ2V0RFREVHlwZSgpKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZW5lcmF0ZUluc3RhbmNlVmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGNtRGF0YVR5cGVJbmZvVGFibGUuZ2V0SW5zdGFuY2VWYWx1ZShhdHRyaWJ1dGUuZ2V0RFREVHlwZSgpKTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRJbXBsaWVkVmFsdWVLaW5kKCkgewotCQkJCWludCByZXN1bHQgPSBJTVBMSUVEX1ZBTFVFX05PTkU7Ci0JCQkJaW50IGRlZmF1bHRWYWx1ZUtpbmQgPSBhdHRyaWJ1dGUuZ2V0RGVmYXVsdEtpbmQoKS5nZXRWYWx1ZSgpOwotCQkJCWlmIChkZWZhdWx0VmFsdWVLaW5kID09IERURERlZmF1bHRLaW5kLk5PRklYRUQpIHsKLQkJCQkJcmVzdWx0ID0gSU1QTElFRF9WQUxVRV9ERUZBVUxUOwotCQkJCX0KLQkJCQllbHNlIGlmIChkZWZhdWx0VmFsdWVLaW5kID09IERURERlZmF1bHRLaW5kLkZJWEVEKSB7Ci0JCQkJCXJlc3VsdCA9IElNUExJRURfVkFMVUVfRklYRUQ7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SW1wbGllZFZhbHVlKCkgewotCQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRFbnVtZXJhdGVkVmFsdWVzKCkgewotCQkJCU9iamVjdFtdIG9iamVjdExpc3QgPSBhdHRyaWJ1dGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpLnRvQXJyYXkoKTsKLQkJCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW29iamVjdExpc3QubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdExpc3QubGVuZ3RoOyBpKyspIHsKLQkJCQkJcmVzdWx0W2ldID0gb2JqZWN0TGlzdFtpXS50b1N0cmluZygpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBEVERFbGVtZW50QmFzZUFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIERUREVsZW1lbnRCYXNlQWRhcHRlciBleHRlbmRzIERUREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01FbGVtZW50RGVjbGFyYXRpb24gewotCQlwcm90ZWN0ZWQgQ01EYXRhVHlwZSBkYXRhVHlwZTsKLQotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgRFRERWxlbWVudCBnZXREVERFbGVtZW50KCk7Ci0KLQkJcHJvdGVjdGVkIENNRG9jdW1lbnRhdGlvbiBkb2N1bWVudGF0aW9uID0gbnVsbDsKLQotCQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQkJcmV0dXJuIEVMRU1FTlRfREVDTEFSQVRJT047Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQkJcmV0dXJuIGdldERUREVsZW1lbnQoKS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJCUNNTmFtZWROb2RlTWFwSW1wbCByZXN1bHQgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCQlMaXN0IGF0dHJpYnV0ZUxpc3QgPSBnZXREVERFbGVtZW50KCkuZ2V0RFREQXR0cmlidXRlKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBhdHRyaWJ1dGVMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCURUREF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoRFREQXR0cmlidXRlKSBpLm5leHQoKTsKLQkJCQlyZXN1bHQuZ2V0SGFzaHRhYmxlKCkucHV0KGF0dHJpYnV0ZS5nZXROYW1lKCksIGdldEFkYXB0ZXIoYXR0cmlidXRlKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQkJcmV0dXJuIChDTUNvbnRlbnQpIGdldEFkYXB0ZXIoZ2V0RFRERWxlbWVudCgpLmdldENvbnRlbnQoKSk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQkJLy8gdG9kbwotCQkJaW50IHJlc3VsdCA9IEVMRU1FTlQ7Ci0JCQlEVERFbGVtZW50Q29udGVudCBkdGRFbGVtZW50Q29udGVudCA9IGdldERUREVsZW1lbnQoKS5nZXRDb250ZW50KCk7Ci0JCQlpZiAoZHRkRWxlbWVudENvbnRlbnQgaW5zdGFuY2VvZiBEVERQQ0RhdGFDb250ZW50KSB7Ci0JCQkJcmVzdWx0ID0gUENEQVRBOwotCQkJfQotCQkJZWxzZSBpZiAoZHRkRWxlbWVudENvbnRlbnQgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpIHsKLQkJCQlEVERHcm91cENvbnRlbnQgZ3JvdXBDb250ZW50ID0gKERUREdyb3VwQ29udGVudCkgZHRkRWxlbWVudENvbnRlbnQ7Ci0JCQkJaW50IGdyb3VwS2luZCA9IGdyb3VwQ29udGVudC5nZXRHcm91cEtpbmQoKS5nZXRWYWx1ZSgpOwotCQkJCWlmIChncm91cEtpbmQgPT0gRFRER3JvdXBLaW5kLkNIT0lDRSkgewotCQkJCQlMaXN0IGxpc3QgPSBncm91cENvbnRlbnQuZ2V0Q29udGVudCgpOwotCQkJCQlpZiAobGlzdC5zaXplKCkgPiAwICYmIGxpc3QuZ2V0KDApIGluc3RhbmNlb2YgRFREUENEYXRhQ29udGVudCkgewotCQkJCQkJcmVzdWx0ID0gTUlYRUQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChkdGRFbGVtZW50Q29udGVudCBpbnN0YW5jZW9mIERUREFueUNvbnRlbnQpIHsKLQkJCQlyZXN1bHQgPSBBTlk7Ci0JCQl9Ci0JCQllbHNlIGlmIChkdGRFbGVtZW50Q29udGVudCBpbnN0YW5jZW9mIERUREVtcHR5Q29udGVudCkgewotCQkJCXJlc3VsdCA9IEVNUFRZOwotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJCXJldHVybiBnZXREVERFbGVtZW50KCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIENNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKSB7Ci0JCQlpbnQgY29udGVudFR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkJYm9vbGVhbiBoYXNEYXRhVHlwZSA9IGNvbnRlbnRUeXBlID09IFBDREFUQSB8fCBjb250ZW50VHlwZSA9PSBNSVhFRDsKLQkJCXJldHVybiBoYXNEYXRhVHlwZSA/IGRhdGFUeXBlIDogbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRMb2NhbEVsZW1lbnRzKCkgewotCQkJcmV0dXJuIENNTmFtZWROb2RlTWFwSW1wbC5FTVBUWV9OQU1FRF9OT0RFX01BUDsKLQkJfQotCi0JCXB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCQlEVERGaWxlIGR0ZEZpbGUgPSBnZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpOwotCQkJcmV0dXJuIGR0ZEZpbGUgIT0gbnVsbCA/IChDTURvY3VtZW50KSBnZXRBZGFwdGVyKGR0ZEZpbGUpIDogbnVsbDsKLQkJfQotCi0JCXByb3RlY3RlZCBDTU5vZGVMaXN0IGdldERvY3VtZW50YXRpb24oKSB7Ci0JCQlDTU5vZGVMaXN0SW1wbCBub2RlTGlzdCA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotCQkJaWYgKGRvY3VtZW50YXRpb24gPT0gbnVsbCkgewotCQkJCVN0cmluZyBjb21tZW50ID0gZ2V0RFRERWxlbWVudCgpLmdldENvbW1lbnQoKTsKLQkJCQlpZiAoY29tbWVudCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY29tbWVudCwgIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJdmFsdWUgKz0gc3QubmV4dFRva2VuKCkudHJpbSgpICsgIlxuIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWRvY3VtZW50YXRpb24gPSBuZXcgQ01Eb2N1bWVudGF0aW9uSW1wbCh2YWx1ZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRvY3VtZW50YXRpb24gIT0gbnVsbCkgewotCQkJCW5vZGVMaXN0LmdldExpc3QoKS5hZGQoZG9jdW1lbnRhdGlvbik7Ci0JCQl9Ci0JCQlyZXR1cm4gbm9kZUxpc3Q7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ01Eb2N1bWVudGF0aW9uSW1wbCBpbXBsZW1lbnRzIENNRG9jdW1lbnRhdGlvbiB7Ci0JCXByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0KLQkJcHVibGljIENNRG9jdW1lbnRhdGlvbkltcGwoU3RyaW5nIHZhbHVlKSB7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQkJcmV0dXJuIERPQ1VNRU5UQVRJT047Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIERUREVsZW1lbnRBZGFwdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEVERFbGVtZW50QWRhcHRlciBleHRlbmRzIERUREVsZW1lbnRCYXNlQWRhcHRlciB7Ci0JCXByb3RlY3RlZCBEVERFbGVtZW50IGVsZW1lbnQ7Ci0KLQkJcHVibGljIERUREVsZW1lbnRBZGFwdGVyKERUREVsZW1lbnQgZWxlbWVudCkgewotCQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJCWRhdGFUeXBlID0gbmV3IENNRGF0YVR5cGVJbXBsKCIjUENEQVRBIiwgZ2V0RFRERWxlbWVudCgpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgRFRERWxlbWVudCBnZXREVERFbGVtZW50KCkgewotCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQkJcmV0dXJuIDE7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1heE9jY3VyKCkgewotCQkJcmV0dXJuIDE7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmluaXRpb25JbmZvKCkgewotCQkJcmV0dXJuICJnbG9iYWwiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGdldERlZmluaXRpb24oKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRBZGFwdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEFkYXB0ZXIgZXh0ZW5kcyBEVERFbGVtZW50QmFzZUFkYXB0ZXIgewotCQlwcm90ZWN0ZWQgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgY29udGVudDsKLQotCQlwdWJsaWMgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRBZGFwdGVyKERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGNvbnRlbnQpIHsKLQkJCXRoaXMuY29udGVudCA9IGNvbnRlbnQ7Ci0JCQlkYXRhVHlwZSA9IG5ldyBDTURhdGFUeXBlSW1wbCgiI1BDREFUQSIsIGdldERUREVsZW1lbnQoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLQkJCXJldHVybiBjb250ZW50OwotCQl9Ci0KLQkJcHJvdGVjdGVkIERUREVsZW1lbnQgZ2V0RFRERWxlbWVudCgpIHsKLQkJCXJldHVybiBjb250ZW50LmdldFJlZmVyZW5jZWRFbGVtZW50KCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQkJcmV0dXJuIGdldE1pbk9jY3VySGVscGVyKGNvbnRlbnQpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJCXJldHVybiBnZXRNYXhPY2N1ckhlbHBlcihjb250ZW50KTsKLQkJfQotCi0KLQkJcHVibGljIENNTm9kZSBnZXREZWZpbml0aW9uKCkgewotCQkJcmV0dXJuIGdldEFkYXB0ZXIoZ2V0RFRERWxlbWVudCgpKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogRFRERW50aXR5QWRhcHRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRFRERW50aXR5QWRhcHRlciBleHRlbmRzIERUREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01FbnRpdHlEZWNsYXJhdGlvbiB7Ci0JCXByb3RlY3RlZCBEVERFbnRpdHkgZHRkRW50aXR5OwotCi0JCXB1YmxpYyBEVERFbnRpdHlBZGFwdGVyKERUREVudGl0eSBkdGRFbnRpdHkpIHsKLQkJCXRoaXMuZHRkRW50aXR5ID0gZHRkRW50aXR5OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBFTlRJVFlfREVDTEFSQVRJT047Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLQkJCXJldHVybiBkdGRFbnRpdHk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gZHRkRW50aXR5LmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGR0ZEVudGl0eS5nZXRDb250ZW50KCkgaW5zdGFuY2VvZiBEVERJbnRlcm5hbEVudGl0eSkgewotCQkJCURUREludGVybmFsRW50aXR5IGNvbnRlbnQgPSAoRFRESW50ZXJuYWxFbnRpdHkpIGR0ZEVudGl0eS5nZXRDb250ZW50KCk7Ci0JCQkJdmFsdWUgPSBjb250ZW50LmdldFZhbHVlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIERUREdyb3VwQ29udGVudEFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERUREdyb3VwQ29udGVudEFkYXB0ZXIgZXh0ZW5kcyBEVERCYXNlQWRhcHRlciBpbXBsZW1lbnRzIENNR3JvdXAgewotCQlwcm90ZWN0ZWQgRFRER3JvdXBDb250ZW50IGNvbnRlbnQ7Ci0KLQkJcHVibGljIERUREdyb3VwQ29udGVudEFkYXB0ZXIoRFRER3JvdXBDb250ZW50IGNvbnRlbnQpIHsKLQkJCXRoaXMuY29udGVudCA9IGNvbnRlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLQkJCXJldHVybiBjb250ZW50OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBHUk9VUDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQlDTURlc2NyaXB0aW9uQnVpbGRlciBkZXNjcmlwdGlvbkJ1aWxkZXIgPSBuZXcgQ01EZXNjcmlwdGlvbkJ1aWxkZXIoKTsKLQkJCXJldHVybiBkZXNjcmlwdGlvbkJ1aWxkZXIuYnVpbGREZXNjcmlwdGlvbih0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0JCQlMaXN0IGxpc3QgPSBjb250ZW50LmdldENvbnRlbnQoKTsKLQkJCUNNTm9kZUxpc3RJbXBsIHJlc3VsdCA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotCQkJZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlDTU5vZGUgbm9kZSA9IGdldEFkYXB0ZXIoKE5vdGlmaWVyKSBpLm5leHQoKSk7Ci0JCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQuZ2V0TGlzdCgpLmFkZChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQotCQlwdWJsaWMgaW50IGdldE1heE9jY3VyKCkgewotCQkJcmV0dXJuIGdldE1heE9jY3VySGVscGVyKGNvbnRlbnQpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRNaW5PY2N1cigpIHsKLQkJCXJldHVybiBnZXRNaW5PY2N1ckhlbHBlcihjb250ZW50KTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0T3BlcmF0b3IoKSB7Ci0JCQkvLyB0b2RvLi4uIGhhbmRsZSBBTE9ORSBjYXNlIGJ5IGNoZWNraWcgaWYgY2hpbGQgY291bnQgPT0gMQotCQkJaW50IGdyb3VwS2luZCA9IGNvbnRlbnQuZ2V0R3JvdXBLaW5kKCkuZ2V0VmFsdWUoKTsKLQkJCXJldHVybiAoZ3JvdXBLaW5kID09IERUREdyb3VwS2luZC5DSE9JQ0UpID8gQ0hPSUNFIDogU0VRVUVOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEVERGaWxlQWRhcHRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRFRERmlsZUFkYXB0ZXIgZXh0ZW5kcyBEVERCYXNlQWRhcHRlciBpbXBsZW1lbnRzIENNRG9jdW1lbnQgewotCQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIERFRkFVTFRfUk9PVF9OQU1FID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9kZWZhdWx0Um9vdE5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkJcHJvdGVjdGVkIERUREZpbGUgZHRkRmlsZTsKLQkJcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBuYW1lZE5vZGVNYXA7Ci0JCXByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgZW50aXR5Tm9kZU1hcDsKLQotCQlwcm90ZWN0ZWQgQW5ub3RhdGlvbk1hcCBhbm5vdGF0aW9uTWFwID0gbmV3IEFubm90YXRpb25NYXAoKTsKLQkJcHJvdGVjdGVkIE1hcCBnbG9iYWxQcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJcHVibGljIERUREZpbGVBZGFwdGVyKERUREZpbGUgZHRkRmlsZSkgewotCQkJdGhpcy5kdGRGaWxlID0gZHRkRmlsZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotCQkJcmV0dXJuIGR0ZEZpbGU7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbk1hcCBnZXRBbm5vdGF0aW9uTWFwKCkgewotCQkJcmV0dXJuIGFubm90YXRpb25NYXA7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RWxlbWVudHMoKSB7Ci0JCQlpZiAobmFtZWROb2RlTWFwID09IG51bGwpIHsKLQkJCQluYW1lZE5vZGVNYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGR0ZEZpbGUubGlzdERUREVsZW1lbnQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCURUREVsZW1lbnQgZHRkRWxlbWVudCA9IChEVERFbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCW5hbWVkTm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoZHRkRWxlbWVudC5nZXROYW1lKCksIGdldEFkYXB0ZXIoZHRkRWxlbWVudCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuYW1lZE5vZGVNYXA7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCQlpZiAoZW50aXR5Tm9kZU1hcCA9PSBudWxsKSB7Ci0JCQkJZW50aXR5Tm9kZU1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkJCS8vIGFkZCB0aGUgYnVpbHQgaW4gZW50aXR5IGRlY2xhcmF0aW9ucwotCQkJCS8vCi0JCQkJZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoImFtcCIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgiYW1wIiwgIiYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoImx0IiwgbmV3IENNRW50aXR5RGVjbGFyYXRpb25JbXBsKCJsdCIsICI8IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCWVudGl0eU5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KCJndCIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgiZ3QiLCAiPiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQllbnRpdHlOb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dCgicXVvdCIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgicXVvdCIsICJcIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQllbnRpdHlOb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dCgiYXBvcyIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgiYXBvcyIsICInIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCQkJZm9yIChJdGVyYXRvciBpID0gZHRkRmlsZS5saXN0RFRERW50aXR5KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJCURUREVudGl0eSBkdGRFbnRpdHkgPSAoRFRERW50aXR5KSBpLm5leHQoKTsKLQkJCQkJaWYgKCFkdGRFbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSAmJiBkdGRFbnRpdHkuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQkJCS8vIGZvciBub3cuLi4ganVzdCBoYW5kbGUgRFRESW50ZXJuYWxFbnRpdHkKLQkJCQkJCS8vCi0JCQkJCQlpZiAoZHRkRW50aXR5LmdldENvbnRlbnQoKSBpbnN0YW5jZW9mIERUREludGVybmFsRW50aXR5KSB7Ci0JCQkJCQkJZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoZHRkRW50aXR5LmdldE5hbWUoKSwgZ2V0QWRhcHRlcihkdGRFbnRpdHkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBlbnRpdHlOb2RlTWFwOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBET0NVTUVOVDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQlyZXR1cm4gZHRkRmlsZS5nZXROYW1lKCkgKyAiLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhERUZBVUxUX1JPT1RfTkFNRSkpIHsKLQkJCQlEVERNZXRyaWNzIG1ldHJpY3MgPSBuZXcgRFRETWV0cmljcyhkdGRGaWxlKTsKLQkJCQlEVERFbGVtZW50IGR0ZEVsZW1lbnQgPSBtZXRyaWNzLmdldExlYXN0UmVmZXJlbmNlZEVsZW1lbnQoKTsKLQkJCQlpZiAoZHRkRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IGR0ZEVsZW1lbnQuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImFubm90YXRpb25NYXAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0ID0gYW5ub3RhdGlvbk1hcDsKLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImdsb2JhbFByb3BlcnR5TWFwIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IGdsb2JhbFByb3BlcnR5TWFwOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzdWx0ID0gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ01EYXRhVHlwZUluZm9UYWJsZSB7Ci0JCXByb3RlY3RlZCBTdHJpbmdbXSBpbnN0YW5jZVZhbHVlVGFibGU7Ci0JCXByb3RlY3RlZCBTdHJpbmdbXSBkYXRhVHlwZU5hbWVUYWJsZTsKLQotCQlwdWJsaWMgQ01EYXRhVHlwZUluZm9UYWJsZSgpIHsKLQkJCS8vIGhhc2h0YWJsZS5wdXQoRFREVHlwZS5DREFUQSwgbnVsbCkpOwotCQkJaW5zdGFuY2VWYWx1ZVRhYmxlID0gbmV3IFN0cmluZ1tEVERCYXNpY1R5cGVJbXBsLmJhc2ljVHlwZUtpbmRzLmxlbmd0aF07Ci0JCQlpbnN0YW5jZVZhbHVlVGFibGVbRFREQmFzaWNUeXBlS2luZC5FTlRJVFldID0gImVudGl0eSI7IC8vJE5PTi1OTFMtMSQKLQkJCWluc3RhbmNlVmFsdWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLkVOVElUSUVTXSA9ICJlbnRpdGllcyI7IC8vJE5PTi1OTFMtMSQKLQkJCWluc3RhbmNlVmFsdWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLk5NVE9LRU5dID0gIm5tdG9rZW4iOyAvLyROT04tTkxTLTEkCi0JCQlpbnN0YW5jZVZhbHVlVGFibGVbRFREQmFzaWNUeXBlS2luZC5OTVRPS0VOU10gPSAibm10b2tlbnMiOyAvLyROT04tTkxTLTEkCi0KLQkJCWRhdGFUeXBlTmFtZVRhYmxlID0gbmV3IFN0cmluZ1tEVERCYXNpY1R5cGVJbXBsLmJhc2ljVHlwZUtpbmRzLmxlbmd0aF07Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLkNEQVRBXSA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLklEXSA9IENNRGF0YVR5cGUuSUQ7Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLklEUkVGXSA9IENNRGF0YVR5cGUuSURSRUY7Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLkVOVElUWV0gPSBDTURhdGFUeXBlLkVOVElUWTsKLQkJCWRhdGFUeXBlTmFtZVRhYmxlW0RUREJhc2ljVHlwZUtpbmQuRU5USVRJRVNdID0gQ01EYXRhVHlwZS5FTlRJVElFUzsKLQkJCWRhdGFUeXBlTmFtZVRhYmxlW0RUREJhc2ljVHlwZUtpbmQuTk1UT0tFTl0gPSBDTURhdGFUeXBlLk5NVE9LRU47Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLk5NVE9LRU5TXSA9IENNRGF0YVR5cGUuTk1UT0tFTlM7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEluc3RhbmNlVmFsdWUoRFREVHlwZSBkdGRUeXBlKSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJCWlmIChkdGRUeXBlIGluc3RhbmNlb2YgRFREQmFzaWNUeXBlKSB7Ci0JCQkJaW50IGtpbmQgPSAoKERUREJhc2ljVHlwZSkgZHRkVHlwZSkuZ2V0S2luZCgpLmdldFZhbHVlKCk7Ci0JCQkJaWYgKGtpbmQgPj0gMCAmJiBraW5kIDwgRFREQmFzaWNUeXBlSW1wbC5iYXNpY1R5cGVEZXNjcmlwdGlvbnMubGVuZ3RoKSB7Ci0JCQkJCXJlc3VsdCA9IGluc3RhbmNlVmFsdWVUYWJsZVtraW5kXTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoRFREVHlwZSBkdGRUeXBlKSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJCWlmIChkdGRUeXBlIGluc3RhbmNlb2YgRFREQmFzaWNUeXBlKSB7Ci0JCQkJaW50IGtpbmQgPSAoKERUREJhc2ljVHlwZSkgZHRkVHlwZSkuZ2V0S2luZCgpLmdldFZhbHVlKCk7Ci0JCQkJaWYgKGtpbmQgPj0gMCAmJiBraW5kIDwgRFREQmFzaWNUeXBlSW1wbC5iYXNpY1R5cGVEZXNjcmlwdGlvbnMubGVuZ3RoKSB7Ci0JCQkJCXJlc3VsdCA9IGRhdGFUeXBlTmFtZVRhYmxlW2tpbmRdOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGR0ZFR5cGUgaW5zdGFuY2VvZiBEVERFbnVtZXJhdGlvblR5cGUpIHsKLQkJCQlyZXN1bHQgPSBDTURhdGFUeXBlLkVOVU07Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERBbnlDb250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREFueUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUxM2JmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREFueUNvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QW55IENvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERBbnlDb250ZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREFueUNvbnRlbnQgZXh0ZW5kcyBEVERFbGVtZW50Q29udGVudCB7Ci19IC8vIERUREFueUNvbnRlbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQXR0cmlidXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTk4NDFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXR0cmlidXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERlZmF1bHRLaW5kIDxlbT5EZWZhdWx0IEtpbmQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREZWZhdWx0VmFsdWVTdHJpbmcgPGVtPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZWQgRW50aXR5PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RFRERWxlbWVudCA8ZW0+RFREIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREQXR0cmlidXRlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREF0dHJpYnV0ZSBleHRlbmRzIEVBdHRyaWJ1dGUsIERURE9iamVjdCwgRFREU291cmNlT2Zmc2V0IHsKLQkvLyBOT04tR0VOIGludGVyZmFjZXMgRFRET2JqZWN0LCBEVERTb3VyY2VPZmZzZXQKLQotCXB1YmxpYyBEVERUeXBlIGdldERURFR5cGUoKTsKLQotCXB1YmxpYyB2b2lkIHNldERURFR5cGUoRFREVHlwZSB0eXBlKTsKLQotCXB1YmxpYyB2b2lkIHNldERUREJhc2ljVHlwZShpbnQgdmFsdWUpOwotCi0JcHVibGljIERUREVudW1lcmF0aW9uVHlwZSBjcmVhdGVEVERFbnVtZXJhdGlvbihTdHJpbmdbXSBlbnVtVmFsdWVzLCBpbnQgZW51bUtpbmQpOwotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbW1lbnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREF0dHJpYnV0ZV9Db21tZW50KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvbW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29tbWVudChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBLaW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlZmF1bHQgS2luZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IEtpbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEREZWZhdWx0S2luZAotCSAqIEBzZWUgI3NldERlZmF1bHRLaW5kKERURERlZmF1bHRLaW5kKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREF0dHJpYnV0ZV9EZWZhdWx0S2luZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURURERlZmF1bHRLaW5kIGdldERlZmF1bHRLaW5kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREZWZhdWx0S2luZCA8ZW0+RGVmYXVsdCBLaW5kPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgS2luZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kCi0JICogQHNlZSAjZ2V0RGVmYXVsdEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRLaW5kKERURERlZmF1bHRLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9iPjwvZW0+JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWZhdWx0IFZhbHVlIFN0cmluZzwvZW0+JyBhdHRyaWJ1dGUKLQkgKiBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFZhbHVlIFN0cmluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVmYXVsdFZhbHVlU3RyaW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERBdHRyaWJ1dGVfRGVmYXVsdFZhbHVlU3RyaW5nKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRWYWx1ZVN0cmluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RGVmYXVsdFZhbHVlU3RyaW5nIDxlbT5EZWZhdWx0IFZhbHVlIFN0cmluZzwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFZhbHVlIFN0cmluZzwvZW0+JwotCSAqICAgICAgICAgICAgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlZmF1bHRWYWx1ZVN0cmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdFZhbHVlU3RyaW5nKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+JwotCSAqIHJlZmVyZW5jZSBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24KLQkgKiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nCi0JICogICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoRFRERW50aXR5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlCi0JICogQG1vZGVsIG9wcG9zaXRlPSJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbnRpdHkgZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5IDxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+JwotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eShEVERFbnRpdHkgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlIDxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicKLQkgKiByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uCi0JICogaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+JwotCSAqICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KERUREVudGl0eSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERBdHRyaWJ1dGVfQXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iYXR0cmlidXRlVHlwZVJlZmVyZW5jZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW50aXR5IGdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSA8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoRFRERW50aXR5IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRURCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXREVERBdHRyaWJ1dGUgPGVtPkRURCBBdHRyaWJ1dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RFREIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZQotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRURCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lcgotCSAqICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERUREVsZW1lbnQoRFRERWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERBdHRyaWJ1dGVfRFRERWxlbWVudCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0RFREQXR0cmlidXRlCi0JICogQG1vZGVsIG9wcG9zaXRlPSJEVERBdHRyaWJ1dGUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVsZW1lbnQgZ2V0RFRERWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RFRERWxlbWVudCA8ZW0+RFREIEVsZW1lbnQ8L2VtPn0nCi0JICogY29udGFpbmVyIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRURCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldERUREVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERUREVsZW1lbnQoRFRERWxlbWVudCB2YWx1ZSk7Ci0KLX0gLy8gRFREQXR0cmlidXRlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREJhc2ljVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERCYXNpY1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwMzI4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREJhc2ljVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2ljIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZSNnZXRLaW5kIDxlbT5LaW5kPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREJhc2ljVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERCYXNpY1R5cGUgZXh0ZW5kcyBFQ2xhc3MsIERURFR5cGUgewotCS8vIE5PTi1HRU4gaW50ZXJmYWNlcyBEVERUeXBlCi0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgYXR0cmlidXRlLiBUaGUKLQkgKiBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPktpbmQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLCB0aGVyZQotCSAqIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQKLQkgKiBAc2VlICNzZXRLaW5kKERUREJhc2ljVHlwZUtpbmQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREQmFzaWNUeXBlX0tpbmQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERCYXNpY1R5cGVLaW5kIGdldEtpbmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlI2dldEtpbmQgPGVtPktpbmQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRLaW5kKERUREJhc2ljVHlwZUtpbmQgdmFsdWUpOwotfSAvLyBEVERCYXNpY1R5cGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQmFzaWNUeXBlS2luZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERCYXNpY1R5cGVLaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZmU5Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERCYXNpY1R5cGVLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+QmFzaWMgVHlwZSBLaW5kPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREQmFzaWNUeXBlS2luZCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERUREJhc2ljVHlwZUtpbmQgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk9ORV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DREFUQTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNDREFUQV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0RBVEEgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjSURfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklEUkVGPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0lEUkVGX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRFJFRiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JRFJFRlM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjSURSRUZTX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRFJFRlMgPSA0OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RU5USVRZPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0VOVElUWV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZID0gNTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVOVElUSUVTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0VOVElUSUVTX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVElFUyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OTVRPS0VOPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05NVE9LRU5fTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5NVE9LRU4gPSA3OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk1UT0tFTlM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk1UT0tFTlNfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5NVE9LRU5TID0gODsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOT05FCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kIE5PTkVfTElURVJBTCA9IG5ldyBEVERCYXNpY1R5cGVLaW5kKE5PTkUsICJOT05FIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNEQVRBPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q0RBVEE8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjQ0RBVEEKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREJhc2ljVHlwZUtpbmQgQ0RBVEFfTElURVJBTCA9IG5ldyBEVERCYXNpY1R5cGVLaW5kKENEQVRBLCAiQ0RBVEEiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjSUQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREJhc2ljVHlwZUtpbmQgSURfTElURVJBTCA9IG5ldyBEVERCYXNpY1R5cGVLaW5kKElELCAiSUQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SURSRUY8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JRFJFRjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNJRFJFRgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFREQmFzaWNUeXBlS2luZCBJRFJFRl9MSVRFUkFMID0gbmV3IERUREJhc2ljVHlwZUtpbmQoSURSRUYsICJJRFJFRiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JRFJFRlM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JRFJFRlM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjSURSRUZTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kIElEUkVGU19MSVRFUkFMID0gbmV3IERUREJhc2ljVHlwZUtpbmQoSURSRUZTLCAiSURSRUZTIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVOVElUWTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkVOVElUWTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNFTlRJVFkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREJhc2ljVHlwZUtpbmQgRU5USVRZX0xJVEVSQUwgPSBuZXcgRFREQmFzaWNUeXBlS2luZChFTlRJVFksICJFTlRJVFkiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RU5USVRJRVM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FTlRJVElFUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNFTlRJVElFUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFREQmFzaWNUeXBlS2luZCBFTlRJVElFU19MSVRFUkFMID0gbmV3IERUREJhc2ljVHlwZUtpbmQoRU5USVRJRVMsICJFTlRJVElFUyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OTVRPS0VOPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk1UT0tFTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOTVRPS0VOCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kIE5NVE9LRU5fTElURVJBTCA9IG5ldyBEVERCYXNpY1R5cGVLaW5kKE5NVE9LRU4sICJOTVRPS0VOIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5NVE9LRU5TPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk1UT0tFTlM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk1UT0tFTlMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREJhc2ljVHlwZUtpbmQgTk1UT0tFTlNfTElURVJBTCA9IG5ldyBEVERCYXNpY1R5cGVLaW5kKE5NVE9LRU5TLCAiTk1UT0tFTlMiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkJhc2ljIFR5cGUgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERUREJhc2ljVHlwZUtpbmRbXSBWQUxVRVNfQVJSQVkgPSBuZXcgRFREQmFzaWNUeXBlS2luZFtde05PTkVfTElURVJBTCwgQ0RBVEFfTElURVJBTCwgSURfTElURVJBTCwgSURSRUZfTElURVJBTCwgSURSRUZTX0xJVEVSQUwsIEVOVElUWV9MSVRFUkFMLCBFTlRJVElFU19MSVRFUkFMLCBOTVRPS0VOX0xJVEVSQUwsIE5NVE9LRU5TX0xJVEVSQUwsfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5CYXNpYyBUeXBlIEtpbmQ8L2I+PC9lbT4nCi0JICogZW51bWVyYXRvcnMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5CYXNpYyBUeXBlIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFREQmFzaWNUeXBlS2luZCBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCURUREJhc2ljVHlwZUtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5CYXNpYyBUeXBlIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERUREJhc2ljVHlwZUtpbmQgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIE5PTkUgOgotCQkJCXJldHVybiBOT05FX0xJVEVSQUw7Ci0JCQljYXNlIENEQVRBIDoKLQkJCQlyZXR1cm4gQ0RBVEFfTElURVJBTDsKLQkJCWNhc2UgSUQgOgotCQkJCXJldHVybiBJRF9MSVRFUkFMOwotCQkJY2FzZSBJRFJFRiA6Ci0JCQkJcmV0dXJuIElEUkVGX0xJVEVSQUw7Ci0JCQljYXNlIElEUkVGUyA6Ci0JCQkJcmV0dXJuIElEUkVGU19MSVRFUkFMOwotCQkJY2FzZSBFTlRJVFkgOgotCQkJCXJldHVybiBFTlRJVFlfTElURVJBTDsKLQkJCWNhc2UgRU5USVRJRVMgOgotCQkJCXJldHVybiBFTlRJVElFU19MSVRFUkFMOwotCQkJY2FzZSBOTVRPS0VOIDoKLQkJCQlyZXR1cm4gTk1UT0tFTl9MSVRFUkFMOwotCQkJY2FzZSBOTVRPS0VOUyA6Ci0JCQkJcmV0dXJuIE5NVE9LRU5TX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERUREJhc2ljVHlwZUtpbmQoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vIERUREJhc2ljVHlwZUtpbmQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjNmYjc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1wdWJsaWMgY2xhc3MgRFREQ29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERfRVJST1JfTElORV9QUkVGSVggPSAiPCEtLUVSUk9SICI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERfRVJST1JfTElORV9TVUZGSVggPSAiIC0tPiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfRVhURU5TSU9OID0gImR0ZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRVhURU5TSU9OID0gInhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUlfRVhURU5TSU9OID0gInhtaSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfWE1JX0VYVEVOU0lPTiA9ICJkdGQueG1pIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERDb250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURENvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA2Njc1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURENvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50I2dldERUREZpbGUgPGVtPkRURCBGaWxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURENvbnRlbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERURENvbnRlbnQgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EVEQgRmlsZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFREQ29udGVudCA8ZW0+RFREIENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RFREIEZpbGU8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRURCBGaWxlPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RFRERmlsZShEVERGaWxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURENvbnRlbnRfRFRERmlsZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFREQ29udGVudAotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iRFREQ29udGVudCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERmlsZSBnZXREVERGaWxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQjZ2V0RFRERmlsZSA8ZW0+RFREIEZpbGU8L2VtPn0nCi0JICogY29udGFpbmVyIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRURCBGaWxlPC9lbT4nIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldERUREZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERUREZpbGUoRFRERmlsZSB2YWx1ZSk7Ci0KLX0gLy8gRFREQ29udGVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVEREZWZhdWx0S2luZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVEREZWZhdWx0S2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTU3YzVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERGVmYXVsdEtpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5EZWZhdWx0IEtpbmQ8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVEREZWZhdWx0S2luZCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERURERlZmF1bHRLaW5kIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTVBMSUVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0lNUExJRURfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNUExJRUQgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UkVRVUlSRUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjUkVRVUlSRURfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUVVJUkVEID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZJWEVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0ZJWEVEX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSVhFRCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT0ZJWEVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05PRklYRURfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PRklYRUQgPSA0OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU1QTElFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklNUExJRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjSU1QTElFRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRERGVmYXVsdEtpbmQgSU1QTElFRF9MSVRFUkFMID0gbmV3IERURERlZmF1bHRLaW5kKElNUExJRUQsICJJTVBMSUVEIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJFUVVJUkVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UkVRVUlSRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjUkVRVUlSRUQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERURERlZmF1bHRLaW5kIFJFUVVJUkVEX0xJVEVSQUwgPSBuZXcgRFRERGVmYXVsdEtpbmQoUkVRVUlSRUQsICJSRVFVSVJFRCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GSVhFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkZJWEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0ZJWEVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVEREZWZhdWx0S2luZCBGSVhFRF9MSVRFUkFMID0gbmV3IERURERlZmF1bHRLaW5kKEZJWEVELCAiRklYRUQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9GSVhFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5PRklYRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk9GSVhFRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRERGVmYXVsdEtpbmQgTk9GSVhFRF9MSVRFUkFMID0gbmV3IERURERlZmF1bHRLaW5kKE5PRklYRUQsICJOT0ZJWEVEIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5EZWZhdWx0IEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEVEREZWZhdWx0S2luZFtdIFZBTFVFU19BUlJBWSA9IG5ldyBEVEREZWZhdWx0S2luZFtde0lNUExJRURfTElURVJBTCwgUkVRVUlSRURfTElURVJBTCwgRklYRURfTElURVJBTCwgTk9GSVhFRF9MSVRFUkFMLH07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+RGVmYXVsdCBLaW5kPC9iPjwvZW0+JwotCSAqIGVudW1lcmF0b3JzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGVmYXVsdCBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIG5hbWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERURERlZmF1bHRLaW5kIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJRFRERGVmYXVsdEtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5EZWZhdWx0IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERURERlZmF1bHRLaW5kIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBJTVBMSUVEIDoKLQkJCQlyZXR1cm4gSU1QTElFRF9MSVRFUkFMOwotCQkJY2FzZSBSRVFVSVJFRCA6Ci0JCQkJcmV0dXJuIFJFUVVJUkVEX0xJVEVSQUw7Ci0JCQljYXNlIEZJWEVEIDoKLQkJCQlyZXR1cm4gRklYRURfTElURVJBTDsKLQkJCWNhc2UgTk9GSVhFRCA6Ci0JCQkJcmV0dXJuIE5PRklYRURfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRFRERGVmYXVsdEtpbmQoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vIERURERlZmF1bHRLaW5kCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODEwOTdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldERUREF0dHJpYnV0ZSA8ZW0+RFREIEF0dHJpYnV0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbGVtZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREVsZW1lbnQgZXh0ZW5kcyBFQ2xhc3MsIERURENvbnRlbnQsIERURE9iamVjdCwgRFREU291cmNlT2Zmc2V0IHsKLQotCXB1YmxpYyB2b2lkIGFkZERUREF0dHJpYnV0ZShEVERBdHRyaWJ1dGUgYXR0cmlidXRlKTsKLQotCS8vIHJldHVybnMgYWxsIHJlZmVyZW5jZXMgaW4gdGhlIHNhbWUgRFRERmlsZSB0aGF0IHJlZmVyZW5jZSB0aGlzIGVsZW1lbnQKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZWZlcmVuY2VzKCk7Ci0KLQkvLyByZXR1cm4gYSBicmllZiBzdHJpbmcgbGlzdGluZyB0aGUgYXR0cmlidXRlcwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlRGV0YWlsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbW1lbnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVsZW1lbnRfQ29tbWVudCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb21tZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb21tZW50KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250ZW50PC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRlbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlCi0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q29udGVudChEVERFbGVtZW50Q29udGVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbGVtZW50X0NvbnRlbnQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRFbGVtZW50Ci0JICogQG1vZGVsIG9wcG9zaXRlPSJlbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVsZW1lbnRDb250ZW50IGdldENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59JwotCSAqIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRlbnQ8L2VtPicgY29udGFpbm1lbnQKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb250ZW50KERUREVsZW1lbnRDb250ZW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRURCBBdHRyaWJ1dGU8L2I+PC9lbT4nCi0JICogY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlCi0JICoge0BsaW5rIERUREF0dHJpYnV0ZX0uIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERUREVsZW1lbnQgPGVtPkRURCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRURCBBdHRyaWJ1dGU8L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEKLQkgKiBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRURCBBdHRyaWJ1dGU8L2VtPicgY29udGFpbm1lbnQKLQkgKiAgICAgICAgIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVsZW1lbnRfRFREQXR0cmlidXRlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERUREVsZW1lbnQKLQkgKiBAbW9kZWwgdHlwZT0iRFREQXR0cmlidXRlIiBvcHBvc2l0ZT0iRFRERWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERUREF0dHJpYnV0ZSgpOwotCi19IC8vIERUREVsZW1lbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERWxlbWVudENvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERWxlbWVudENvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczNmFiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVsZW1lbnRDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50IENvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbGVtZW50Q29udGVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERWxlbWVudENvbnRlbnQgZXh0ZW5kcyBFT2JqZWN0LCBEVERPYmplY3QsIERURFNvdXJjZU9mZnNldCB7Ci0KLQkvLyBmb3Igc2hvd2luZyBuYW1lcyB0byBiZSB1c2VkIGluIHRoZSB0cmVlCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50TmFtZSgpOwotCi0JLy8gZm9yIHNob3dpbmcgaXRlbXMgaW4gdGhlIHRhYmxlCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50RGV0YWlsKCk7Ci0KLQlwdWJsaWMgRFRERWxlbWVudCBnZXREVERFbGVtZW50KCk7Ci0KLQkvLyBnZXQgdGhlIG1vc3Qgb3V0ZXIgRFRER3JvdXBDb250ZW50Ci0JcHVibGljIERUREdyb3VwQ29udGVudCBnZXREVERHcm91cENvbnRlbnQoKTsKLQotCS8vIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgY29udGVudCBpcyB0aGUgZmlyc3QKLQkvLyBpbiB0aGUgZWxlbWVudAotCS8vIGVnIDwhRUxFTUVOVCBibGFoIGZpcnN0RWxlbWVudD4KLQkvLyA8IUVMRU1FTlQgYmxhaCAoKGZpcnN0RWxlbWVudCwgc2Vjb25kRWxlbWVudCkgfCBsYXN0RWxlbWVudCkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZpcnN0RWxlbWVudENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0R3JvdXAoRFRER3JvdXBDb250ZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVsZW1lbnRDb250ZW50X0dyb3VwKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50I2dldENvbnRlbnQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImNvbnRlbnQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREdyb3VwQ29udGVudCBnZXRHcm91cCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nCi0JICogY29udGFpbmVyIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHcm91cChEVERHcm91cENvbnRlbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0Q29udGVudCA8ZW0+Q29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RWxlbWVudChEVERFbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVsZW1lbnRDb250ZW50X0VsZW1lbnQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldENvbnRlbnQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImNvbnRlbnQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVsZW1lbnQgZ2V0RWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59JwotCSAqIGNvbnRhaW5lciByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVsZW1lbnQoRFRERWxlbWVudCB2YWx1ZSk7Ci0KLX0gLy8gRFRERWxlbWVudENvbnRlbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRlMWJiZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50IFJlZmVyZW5jZSBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCNnZXRSZWZlcmVuY2VkRWxlbWVudCA8ZW0+UmVmZXJlbmNlZCBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGV4dGVuZHMgRFREUmVwZWF0YWJsZUNvbnRlbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgRWxlbWVudDwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBFbGVtZW50PC9lbT4nIHJlZmVyZW5jZSBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQgRWxlbWVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmVmZXJlbmNlZEVsZW1lbnQoRFRERWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudF9SZWZlcmVuY2VkRWxlbWVudCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbGVtZW50IGdldFJlZmVyZW5jZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50I2dldFJlZmVyZW5jZWRFbGVtZW50IDxlbT5SZWZlcmVuY2VkIEVsZW1lbnQ8L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBFbGVtZW50PC9lbT4nCi0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlZmVyZW5jZWRFbGVtZW50KERUREVsZW1lbnQgdmFsdWUpOwotCi19IC8vIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVtcHR5Q29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbXB0eUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYyNjgyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVtcHR5Q29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbXB0eSBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW1wdHlDb250ZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREVtcHR5Q29udGVudCBleHRlbmRzIERUREVsZW1lbnRDb250ZW50IHsKLX0gLy8gRFRERW1wdHlDb250ZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0YjQ1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2lzUGFyYW1ldGVyRW50aXR5IDxlbT5QYXJhbWV0ZXIgRW50aXR5PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29udGVudCA8ZW0+Q29udGVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldFBhcm1FbnRpdHlSZWYgPGVtPlBhcm0gRW50aXR5IFJlZjwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEVudGl0eVJlZmVyZW5jZSA8ZW0+RW50aXR5IFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UgPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHkoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERW50aXR5IGV4dGVuZHMgRU5hbWVkRWxlbWVudCwgRFREQ29udGVudCwgRFRET2JqZWN0LCBEVERTb3VyY2VPZmZzZXQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29tbWVudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW50aXR5X0NvbW1lbnQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29tbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb21tZW50KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJhbWV0ZXIgRW50aXR5PC9iPjwvZW0+JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJhbWV0ZXIgRW50aXR5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcmFtZXRlciBFbnRpdHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhcmFtZXRlckVudGl0eShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eV9QYXJhbWV0ZXJFbnRpdHkoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUGFyYW1ldGVyRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNpc1BhcmFtZXRlckVudGl0eSA8ZW0+UGFyYW1ldGVyIEVudGl0eTwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbWV0ZXIgRW50aXR5PC9lbT4nCi0JICogICAgICAgICAgICBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNQYXJhbWV0ZXJFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcmFtZXRlckVudGl0eShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRlbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQjZ2V0RFRERW50aXR5IDxlbT5EVEQgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRlbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlCi0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q29udGVudChEVERFbnRpdHlDb250ZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eV9Db250ZW50KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudCNnZXREVERFbnRpdHkKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9IkRUREVudGl0eSIgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbnRpdHlDb250ZW50IGdldENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn0nCi0JICogY29udGFpbm1lbnQgcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudDwvZW0+JyBjb250YWlubWVudAotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnRlbnQoRFRERW50aXR5Q29udGVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJtIEVudGl0eSBSZWY8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJtIEVudGl0eSBSZWY8L2VtPicgcmVmZXJlbmNlIGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFybSBFbnRpdHkgUmVmPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQYXJtRW50aXR5UmVmKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlfUGFybUVudGl0eVJlZigpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSNnZXRFbnRpdHkKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImVudGl0eSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBnZXRQYXJtRW50aXR5UmVmKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRQYXJtRW50aXR5UmVmIDxlbT5QYXJtIEVudGl0eSBSZWY8L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFybSBFbnRpdHkgUmVmPC9lbT4nCi0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGFybUVudGl0eVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFybUVudGl0eVJlZihEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW50aXR5IFJlZmVyZW5jZTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUKLQkgKiB7QGxpbmsgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudH0uIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cwotCSAqIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50I2dldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5IDxlbT5FbGVtZW50IFJlZmVyZW5jZWQgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudGl0eSBSZWZlcmVuY2U8L2VtPicgcmVmZXJlbmNlIGxpc3QKLQkgKiBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdHkgUmVmZXJlbmNlPC9lbT4nIHJlZmVyZW5jZQotCSAqICAgICAgICAgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlfRW50aXR5UmVmZXJlbmNlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCNnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eQotCSAqIEBtb2RlbCB0eXBlPSJEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IgotCSAqICAgICAgICBvcHBvc2l0ZT0iZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEVudGl0eVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgRFREQXR0cmlidXRlfS4gSXQKLQkgKiBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSA8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9lbT4nIHJlZmVyZW5jZQotCSAqIGxpc3QgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9lbT4nCi0JICogICAgICAgICByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlfQXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eQotCSAqIEBtb2RlbCB0eXBlPSJEVERBdHRyaWJ1dGUiIG9wcG9zaXRlPSJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgRFREQXR0cmlidXRlfS4gSXQKLQkgKiBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSA8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlPC9lbT4nIHJlZmVyZW5jZQotCSAqIGxpc3QgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlPC9lbT4nCi0JICogICAgICAgICByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlfQXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eQotCSAqIEBtb2RlbCB0eXBlPSJEVERBdHRyaWJ1dGUiIG9wcG9zaXRlPSJhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpOwotCi19IC8vIERUREVudGl0eQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnRpdHlDb250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudGl0eUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2MjZjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudGl0eUNvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW50aXR5IENvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQjZ2V0RFRERW50aXR5IDxlbT5EVEQgRW50aXR5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eUNvbnRlbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREVudGl0eUNvbnRlbnQgZXh0ZW5kcyBFT2JqZWN0LCBEVERPYmplY3QgewotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EVEQgRW50aXR5PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RFREIEVudGl0eTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlCi0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RFREIEVudGl0eTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERUREVudGl0eShEVERFbnRpdHkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW50aXR5Q29udGVudF9EVERFbnRpdHkoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29udGVudAotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iY29udGVudCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW50aXR5IGdldERUREVudGl0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50I2dldERUREVudGl0eSA8ZW0+RFREIEVudGl0eTwvZW0+fScKLQkgKiBjb250YWluZXIgcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RFREIEVudGl0eTwvZW0+JyBjb250YWluZXIKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREVERFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERUREVudGl0eShEVERFbnRpdHkgdmFsdWUpOwotCi19IC8vIERUREVudGl0eUNvbnRlbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW50aXR5UmVmZXJlbmNlQ29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Yjk3ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbnRpdHkgUmVmZXJlbmNlIENvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQjZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgPGVtPkVsZW1lbnQgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IGV4dGVuZHMgRFREUmVwZWF0YWJsZUNvbnRlbnQgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudCBSZWZlcmVuY2VkIEVudGl0eTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEVudGl0eVJlZmVyZW5jZSA8ZW0+RW50aXR5IFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbGVtZW50IFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nCi0JICogcmVmZXJlbmNlIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbgotCSAqIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudCBSZWZlcmVuY2VkIEVudGl0eTwvZW0+JwotCSAqICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KERUREVudGl0eSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50X0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEVudGl0eVJlZmVyZW5jZQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iZW50aXR5UmVmZXJlbmNlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW50aXR5IGdldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQjZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgPGVtPkVsZW1lbnQgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudCBSZWZlcmVuY2VkIEVudGl0eTwvZW0+JwotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eShEVERFbnRpdHkgdmFsdWUpOwotCi19IC8vIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnVtR3JvdXBLaW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudW1Hcm91cEtpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAwM2RjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudW1Hcm91cEtpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5FbnVtIEdyb3VwIEtpbmQ8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnVtR3JvdXBLaW5kKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRERW51bUdyb3VwS2luZCBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+TkFNRSBUT0tFTiBHUk9VUDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOQU1FX1RPS0VOX0dST1VQX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQU1FX1RPS0VOX0dST1VQID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PVEFUSU9OIEdST1VQPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05PVEFUSU9OX0dST1VQX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RBVElPTl9HUk9VUCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OQU1FIFRPS0VOIEdST1VQPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TkFNRSBUT0tFTiBHUk9VUDwvYj48L2VtPicgbGl0ZXJhbAotCSAqIG9iamVjdCBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24KLQkgKiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05BTUVfVE9LRU5fR1JPVVAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREVudW1Hcm91cEtpbmQgTkFNRV9UT0tFTl9HUk9VUF9MSVRFUkFMID0gbmV3IERUREVudW1Hcm91cEtpbmQoTkFNRV9UT0tFTl9HUk9VUCwgIk5BTUVfVE9LRU5fR1JPVVAiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9UQVRJT04gR1JPVVA8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OT1RBVElPTiBHUk9VUDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QKLQkgKiBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOT1RBVElPTl9HUk9VUAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRERW51bUdyb3VwS2luZCBOT1RBVElPTl9HUk9VUF9MSVRFUkFMID0gbmV3IERUREVudW1Hcm91cEtpbmQoTk9UQVRJT05fR1JPVVAsICJOT1RBVElPTl9HUk9VUCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+RW51bSBHcm91cCBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRFRERW51bUdyb3VwS2luZFtdIFZBTFVFU19BUlJBWSA9IG5ldyBEVERFbnVtR3JvdXBLaW5kW117TkFNRV9UT0tFTl9HUk9VUF9MSVRFUkFMLCBOT1RBVElPTl9HUk9VUF9MSVRFUkFMLH07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+RW51bSBHcm91cCBLaW5kPC9iPjwvZW0+JwotCSAqIGVudW1lcmF0b3JzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RW51bSBHcm91cCBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIG5hbWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERUREVudW1Hcm91cEtpbmQgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlEVERFbnVtR3JvdXBLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RW51bSBHcm91cCBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERFbnVtR3JvdXBLaW5kIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBOQU1FX1RPS0VOX0dST1VQIDoKLQkJCQlyZXR1cm4gTkFNRV9UT0tFTl9HUk9VUF9MSVRFUkFMOwotCQkJY2FzZSBOT1RBVElPTl9HUk9VUCA6Ci0JCQkJcmV0dXJuIE5PVEFUSU9OX0dST1VQX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERUREVudW1Hcm91cEtpbmQoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vIERUREVudW1Hcm91cEtpbmQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW51bWVyYXRpb25UeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudW1lcmF0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTAxYjJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW51bWVyYXRpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVudW1lcmF0aW9uIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSNnZXRLaW5kIDxlbT5LaW5kPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUjZ2V0RFRERmlsZSA8ZW0+RFREIEZpbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW51bWVyYXRpb25UeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREVudW1lcmF0aW9uVHlwZSBleHRlbmRzIEVFbnVtLCBEVERUeXBlIHsKLQotCXB1YmxpYyBFTGlzdCBnZXRFbnVtTGl0ZXJhbHMoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW51bWVyYXRpb25UeXBlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gVGhlCi0JICogbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5LaW5kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwgdGhlcmUKLQkgKiByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPktpbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kCi0JICogQHNlZSAjc2V0S2luZChEVERFbnVtR3JvdXBLaW5kKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudW1lcmF0aW9uVHlwZV9LaW5kKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW51bUdyb3VwS2luZCBnZXRLaW5kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSNnZXRLaW5kIDxlbT5LaW5kPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPktpbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0S2luZChEVERFbnVtR3JvdXBLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRURCBGaWxlPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXREVERFbnVtZXJhdGlvblR5cGUgPGVtPkRURCBFbnVtZXJhdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRURCBGaWxlPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EVEQgRmlsZTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERUREZpbGUoRFRERmlsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnVtZXJhdGlvblR5cGVfRFRERmlsZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFRERW51bWVyYXRpb25UeXBlCi0JICogQG1vZGVsIG9wcG9zaXRlPSJEVERFbnVtZXJhdGlvblR5cGUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREZpbGUgZ2V0RFRERmlsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUjZ2V0RFRERmlsZSA8ZW0+RFREIEZpbGU8L2VtPn0nCi0JICogY29udGFpbmVyIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRURCBGaWxlPC9lbT4nIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldERUREZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERUREZpbGUoRFRERmlsZSB2YWx1ZSk7Ci0KLX0gLy8gRFRERW51bWVyYXRpb25UeXBlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVycm9yTWVzc2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFcnJvck1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzZTljNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVycm9yTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotcHVibGljIGNsYXNzIERUREVycm9yTWVzc2FnZSB7Ci0JcHVibGljIFN0cmluZyBlcnJvcktleTsKLQlwdWJsaWMgU3RyaW5nIGVycm9yTWVzc2FnZTsKLQlwdWJsaWMgU3RyaW5nIGxpbmVObzsKLQlwdWJsaWMgU3RyaW5nIGNoYXJPZmZTZXQ7Ci0JcHVibGljIFN0cmluZyBkZWNsYXJhdGlvblR5cGU7Ci0JcHVibGljIFN0cmluZyBkZWNsYXJhdGlvbk5hbWU7Ci0JcHVibGljIFN0cmluZyBzb3VyY2VMaW5lOwotCi0KLQlwdWJsaWMgRFRERXJyb3JNZXNzYWdlKFN0cmluZyBkZWNsYXJhdGlvblR5cGUsIFN0cmluZyBkZWNsYXJhdGlvbk5hbWUsIFN0cmluZyBsaW5lTm8sIFN0cmluZyBjaGFyT2ZmU2V0LCBTdHJpbmcgZXJyb3JLZXksIFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKLQkJdGhpcyhkZWNsYXJhdGlvblR5cGUsIGRlY2xhcmF0aW9uTmFtZSwgbGluZU5vLCBjaGFyT2ZmU2V0LCBlcnJvcktleSwgZXJyb3JNZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgRFRERXJyb3JNZXNzYWdlKFN0cmluZyBkZWNsYXJhdGlvblR5cGUsIFN0cmluZyBkZWNsYXJhdGlvbk5hbWUsIFN0cmluZyBsaW5lTm8sIFN0cmluZyBjaGFyT2ZmU2V0LCBTdHJpbmcgZXJyb3JLZXksIFN0cmluZyBlcnJvck1lc3NhZ2UsIFN0cmluZyBzcmNMaW5lKSB7Ci0JCXRoaXMuZGVjbGFyYXRpb25UeXBlID0gZGVjbGFyYXRpb25UeXBlOwotCQl0aGlzLmRlY2xhcmF0aW9uTmFtZSA9IGRlY2xhcmF0aW9uTmFtZTsKLQkJdGhpcy5saW5lTm8gPSBsaW5lTm87Ci0JCXRoaXMuY2hhck9mZlNldCA9IGNoYXJPZmZTZXQ7Ci0JCXRoaXMuZXJyb3JLZXkgPSBlcnJvcktleTsKLQkJdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7Ci0JCXRoaXMuc291cmNlTGluZSA9IHNyY0xpbmU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICIoIiArIGRlY2xhcmF0aW9uVHlwZSArICI6IiArIGRlY2xhcmF0aW9uTmFtZSArICIpICIgKyBsaW5lTm8gKyAiOiIgKyBjaGFyT2ZmU2V0ICsgIiAiICsgZXJyb3JNZXNzYWdlOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0b1N0cmluZ0dlbigpIHsKLQotCQlyZXR1cm4gIigiICsgZGVjbGFyYXRpb25UeXBlICsgIjoiICsgZGVjbGFyYXRpb25OYW1lICsgIikgIiArIGxpbmVObyArICI6IiArIGNoYXJPZmZTZXQgKyAiICIgKyBlcnJvck1lc3NhZ2U7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERXh0ZW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERXh0ZW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlkZTM2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREV4dGVuZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgYW4gSURvbWFpbk1vZGVsIHRvIGF1Z21lbnQKLSAqIGdldEVsZW1lbnRQcm9wZXJ0eSBmb3IgYW55IERURCBvYmplY3QuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERXh0ZW5kZXIgewotCXB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KERURE9iamVjdCBkdGRPYmplY3QsIE9iamVjdCBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFeHRlcm5hbEVudGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFeHRlcm5hbEVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjhiMzRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERXh0ZXJuYWxFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlcm5hbCBFbnRpdHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldFN5c3RlbUlEIDxlbT5TeXN0ZW0gSUQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldFB1YmxpY0lEIDxlbT5QdWJsaWMgSUQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldE5vdGF0aW9uIDxlbT5Ob3RhdGlvbjwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSA8ZW0+RW50aXR5IFJlZmVyZW5jZWQgRnJvbSBBbm90aGVyIEZpbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERXh0ZXJuYWxFbnRpdHkoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERXh0ZXJuYWxFbnRpdHkgZXh0ZW5kcyBEVERFbnRpdHlDb250ZW50IHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN5c3RlbSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3lzdGVtIElEPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN5c3RlbSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3lzdGVtSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREV4dGVybmFsRW50aXR5X1N5c3RlbUlEKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFN5c3RlbUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldFN5c3RlbUlEIDxlbT5TeXN0ZW0gSUQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3lzdGVtIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTeXN0ZW1JRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3lzdGVtSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlB1YmxpYyBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHVibGljIElEPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlB1YmxpYyBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHVibGljSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREV4dGVybmFsRW50aXR5X1B1YmxpY0lEKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFB1YmxpY0lEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldFB1YmxpY0lEIDxlbT5QdWJsaWMgSUQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVibGljIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQdWJsaWNJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHVibGljSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vdGF0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuIEl0Ci0JICogaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ob3RhdGlvbjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob3RhdGlvbjwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Tm90YXRpb24oRFRETm90YXRpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERXh0ZXJuYWxFbnRpdHlfTm90YXRpb24oKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRFbnRpdHkKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImVudGl0eSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRETm90YXRpb24gZ2V0Tm90YXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0Tm90YXRpb24gPGVtPk5vdGF0aW9uPC9lbT59JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vdGF0aW9uPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXROb3RhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Tm90YXRpb24oRFRETm90YXRpb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW50aXR5IFJlZmVyZW5jZWQgRnJvbSBBbm90aGVyIEZpbGU8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudGl0eSBSZWZlcmVuY2VkIEZyb20gQW5vdGhlciBGaWxlPC9lbT4nCi0JICogcmVmZXJlbmNlIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbgotCSAqIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW50aXR5IFJlZmVyZW5jZWQgRnJvbSBBbm90aGVyIEZpbGU8L2VtPicKLQkgKiAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKERUREZpbGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERXh0ZXJuYWxFbnRpdHlfRW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREZpbGUgZ2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlIDxlbT5FbnRpdHkgUmVmZXJlbmNlZCBGcm9tIEFub3RoZXIgRmlsZTwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdHkgUmVmZXJlbmNlZCBGcm9tIEFub3RoZXIgRmlsZTwvZW0+JwotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoRFRERmlsZSB2YWx1ZSk7Ci0KLX0gLy8gRFRERXh0ZXJuYWxFbnRpdHkKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgyNzc3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4gSXQgcHJvdmlkZXMgYQotICogY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLiA8IS0tIGVuZC11c2VyLWRvYwotICogLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREZhY3RvcnkgZUlOU1RBTkNFID0gbmV3IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbC5EVERGYWN0b3J5SW1wbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Hcm91cCBDb250ZW50PC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3JvdXAgQ29udGVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRER3JvdXBDb250ZW50IGNyZWF0ZURUREdyb3VwQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BdHRyaWJ1dGU8L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BdHRyaWJ1dGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREF0dHJpYnV0ZSBjcmVhdGVEVERBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWxlbWVudDwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVsZW1lbnQgY3JlYXRlRFRERWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbXB0eSBDb250ZW50PC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW1wdHkgQ29udGVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW1wdHlDb250ZW50IGNyZWF0ZURUREVtcHR5Q29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BbnkgQ29udGVudDwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFueSBDb250ZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERBbnlDb250ZW50IGNyZWF0ZURUREFueUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UEMgRGF0YSBDb250ZW50PC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UEMgRGF0YSBDb250ZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERQQ0RhdGFDb250ZW50IGNyZWF0ZURURFBDRGF0YUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RWxlbWVudCBSZWZlcmVuY2UgQ29udGVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVsZW1lbnQgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGNyZWF0ZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZpbGU8L2VtPicuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GaWxlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERGaWxlIGNyZWF0ZURUREZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmFzaWMgVHlwZTwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJhc2ljIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREJhc2ljVHlwZSBjcmVhdGVEVERCYXNpY1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW51bWVyYXRpb24gVHlwZTwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVudW1lcmF0aW9uIFR5cGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVudW1lcmF0aW9uVHlwZSBjcmVhdGVEVERFbnVtZXJhdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Tm90YXRpb248L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Ob3RhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRETm90YXRpb24gY3JlYXRlRFRETm90YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW50aXR5PC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW50aXR5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbnRpdHkgY3JlYXRlRFRERW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVybmFsIEVudGl0eTwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVybmFsIEVudGl0eTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERXh0ZXJuYWxFbnRpdHkgY3JlYXRlRFRERXh0ZXJuYWxFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW50ZXJuYWwgRW50aXR5PC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW50ZXJuYWwgRW50aXR5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERJbnRlcm5hbEVudGl0eSBjcmVhdGVEVERJbnRlcm5hbEVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYXJhbWV0ZXIgRW50aXR5IFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhcmFtZXRlciBFbnRpdHkgUmVmZXJlbmNlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgY3JlYXRlRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVudGl0eSBSZWZlcmVuY2UgQ29udGVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVudGl0eSBSZWZlcmVuY2UgQ29udGVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBjcmVhdGVEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERQYWNrYWdlIGdldERURFBhY2thZ2UoKTsKLQotfSAvLyBEVERGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREZpbGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmFlMjhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmlsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2lzUGFyc2VFcnJvciA8ZW0+UGFyc2UgRXJyb3I8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFREQ29udGVudCA8ZW0+RFREIENvbnRlbnQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFRERW51bWVyYXRpb25UeXBlIDxlbT5EVEQgRW51bWVyYXRpb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERGaWxlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREZpbGUgZXh0ZW5kcyBFTmFtZWRFbGVtZW50LCBEVERPYmplY3QgewotCi0JcHVibGljIEVMaXN0IGdldERURE9iamVjdCgpOwotCi0JcHVibGljIExpc3QgbGlzdERUREVsZW1lbnQoKTsKLQotCXB1YmxpYyBMaXN0IGxpc3REVEROb3RhdGlvbigpOwotCi0JcHVibGljIExpc3QgbGlzdERUREVudGl0eSgpOwotCi0JcHVibGljIExpc3QgbGlzdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpOwotCi0JcHVibGljIExpc3QgbGlzdERUREVsZW1lbnRBbmREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQotCXB1YmxpYyBEVERFbGVtZW50IGZpbmRFbGVtZW50KFN0cmluZyBuYW1lKTsKLQotCXB1YmxpYyBEVERFbnRpdHkgZmluZEVudGl0eShTdHJpbmcgbmFtZSk7Ci0KLQlwdWJsaWMgRFRETm90YXRpb24gZmluZE5vdGF0aW9uKFN0cmluZyBuYW1lKTsKLQotCXB1YmxpYyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgZmluZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShTdHJpbmcgbmFtZSk7Ci0KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2UoYm9vbGVhbiBpbmNsdWRlRXJyb3IpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29tbWVudDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb21tZW50KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERGaWxlX0NvbW1lbnQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29tbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29tbWVudChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyc2UgRXJyb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnNlIEVycm9yPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcnNlIEVycm9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJzZUVycm9yKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERmlsZV9QYXJzZUVycm9yKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1BhcnNlRXJyb3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNpc1BhcnNlRXJyb3IgPGVtPlBhcnNlIEVycm9yPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcnNlIEVycm9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1BhcnNlRXJyb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcnNlRXJyb3IoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EVEQgQ29udGVudDwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIERURENvbnRlbnR9LiBJdAotCSAqIGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudCNnZXREVERGaWxlIDxlbT5EVEQgRmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EVEQgQ29udGVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UKLQkgKiBsaXN0IGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRURCBDb250ZW50PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogICAgICAgICByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERGaWxlX0RURENvbnRlbnQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50I2dldERUREZpbGUKLQkgKiBAbW9kZWwgdHlwZT0iRFREQ29udGVudCIgb3Bwb3NpdGU9IkRUREZpbGUiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREVERDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EVEQgRW51bWVyYXRpb24gVHlwZTwvYj48L2VtPicKLQkgKiBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4gVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUKLQkgKiB7QGxpbmsgRFRERW51bWVyYXRpb25UeXBlfS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUjZ2V0RFRERmlsZSA8ZW0+RFREIEZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RFREIEVudW1lcmF0aW9uIFR5cGU8L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEKLQkgKiBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRURCBFbnVtZXJhdGlvbiBUeXBlPC9lbT4nCi0JICogICAgICAgICBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERGaWxlX0RUREVudW1lcmF0aW9uVHlwZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSNnZXREVERGaWxlCi0JICogQG1vZGVsIHR5cGU9IkRUREVudW1lcmF0aW9uVHlwZSIgb3Bwb3NpdGU9IkRUREZpbGUiIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXREVERFbnVtZXJhdGlvblR5cGUoKTsKLQotfSAvLyBEVERGaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREdyb3VwQ29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERHcm91cENvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNzIwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREdyb3VwQ29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JvdXAgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50I2dldEdyb3VwS2luZCA8ZW0+R3JvdXAgS2luZDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRER3JvdXBDb250ZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREdyb3VwQ29udGVudCBleHRlbmRzIERURFJlcGVhdGFibGVDb250ZW50IHsKLQotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFBvc2l0aW9uKERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAgS2luZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmR9LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAgS2luZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cCBLaW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kCi0JICogQHNlZSAjc2V0R3JvdXBLaW5kKERUREdyb3VwS2luZCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERHcm91cENvbnRlbnRfR3JvdXBLaW5kKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRER3JvdXBLaW5kIGdldEdyb3VwS2luZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQjZ2V0R3JvdXBLaW5kIDxlbT5Hcm91cCBLaW5kPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwIEtpbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQKLQkgKiBAc2VlICNnZXRHcm91cEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEdyb3VwS2luZChEVERHcm91cEtpbmQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGVudDwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIERUREVsZW1lbnRDb250ZW50fS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250ZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Ci0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UKLQkgKiAgICAgICAgIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRER3JvdXBDb250ZW50X0NvbnRlbnQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRHcm91cAotCSAqIEBtb2RlbCB0eXBlPSJEVERFbGVtZW50Q29udGVudCIgb3Bwb3NpdGU9Imdyb3VwIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiAgICAgICAgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENvbnRlbnQoKTsKLQotfSAvLyBEVERHcm91cENvbnRlbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRER3JvdXBLaW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREdyb3VwS2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGQ4YjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRER3JvdXBLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5Hcm91cCBLaW5kPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRER3JvdXBLaW5kKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRER3JvdXBLaW5kIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TRVFVRU5DRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNTRVFVRU5DRV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VRVUVOQ0UgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0hPSUNFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0NIT0lDRV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNFUVVFTkNFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U0VRVUVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjU0VRVUVOQ0UKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREdyb3VwS2luZCBTRVFVRU5DRV9MSVRFUkFMID0gbmV3IERUREdyb3VwS2luZChTRVFVRU5DRSwgIlNFUVVFTkNFIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNIT0lDRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNIT0lDRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNDSE9JQ0UKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREdyb3VwS2luZCBDSE9JQ0VfTElURVJBTCA9IG5ldyBEVERHcm91cEtpbmQoQ0hPSUNFLCAiQ0hPSUNFIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5Hcm91cCBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRFRER3JvdXBLaW5kW10gVkFMVUVTX0FSUkFZID0gbmV3IERUREdyb3VwS2luZFtde1NFUVVFTkNFX0xJVEVSQUwsIENIT0lDRV9MSVRFUkFMLH07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+R3JvdXAgS2luZDwvYj48L2VtPicKLQkgKiBlbnVtZXJhdG9ycy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkdyb3VwIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFRER3JvdXBLaW5kIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJRFRER3JvdXBLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+R3JvdXAgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFRER3JvdXBLaW5kIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBTRVFVRU5DRSA6Ci0JCQkJcmV0dXJuIFNFUVVFTkNFX0xJVEVSQUw7Ci0JCQljYXNlIENIT0lDRSA6Ci0JCQkJcmV0dXJuIENIT0lDRV9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEVERHcm91cEtpbmQoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vIERUREdyb3VwS2luZApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERJbnRlcm5hbEVudGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERJbnRlcm5hbEVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjI4NzI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRESW50ZXJuYWxFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkludGVybmFsIEVudGl0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREludGVybmFsRW50aXR5KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREludGVybmFsRW50aXR5IGV4dGVuZHMgRFRERW50aXR5Q29udGVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwgdGhlcmUKLQkgKiByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRESW50ZXJuYWxFbnRpdHlfVmFsdWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEVERJbnRlcm5hbEVudGl0eQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERMZXhpY2FsSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERMZXhpY2FsSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTc5OTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRETGV4aWNhbEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1wdWJsaWMgY2xhc3MgRFRETGV4aWNhbEluZm8gaW1wbGVtZW50cyBEVERTb3VyY2VPZmZzZXQgewotCS8vIEJlZ2luIFVzZXIgRGVmaW5lZCBNZXRob2RzCi0JaW50IHN0YXJ0T2Zmc2V0OwotCWludCBlbmRPZmZzZXQ7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIHN0YXJ0T2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgdikgewotCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gdjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGVuZE9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRPZmZzZXQoaW50IHYpIHsKLQotCQl0aGlzLmVuZE9mZnNldCA9IHY7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0U3RhcnRPZmZzZXRHZW4oKSB7Ci0KLQkJcmV0dXJuIHN0YXJ0T2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzdGFydE9mZnNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTdGFydE9mZnNldEdlbihpbnQgdikgewotCi0JCXRoaXMuc3RhcnRPZmZzZXQgPSB2OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0RW5kT2Zmc2V0R2VuKCkgewotCi0JCXJldHVybiBlbmRPZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW5kT2Zmc2V0R2VuKGludCB2KSB7Ci0KLQotCQl0aGlzLmVuZE9mZnNldCA9IHY7Ci0JfQotfS8vIERURFNvdXJjZU9mZnNldApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVEROb3RhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVEROb3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDZiYjdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRETm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5vdGF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRTeXN0ZW1JRCA8ZW0+U3lzdGVtIElEPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRQdWJsaWNJRCA8ZW0+UHVibGljIElEPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVEROb3RhdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVEROb3RhdGlvbiBleHRlbmRzIEVOYW1lZEVsZW1lbnQsIERURENvbnRlbnQsIERURE9iamVjdCwgRFREU291cmNlT2Zmc2V0IHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29tbWVudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRETm90YXRpb25fQ29tbWVudCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb21tZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29tbWVudChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3lzdGVtIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TeXN0ZW0gSUQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3lzdGVtIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTeXN0ZW1JRChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRETm90YXRpb25fU3lzdGVtSUQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U3lzdGVtSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0U3lzdGVtSUQgPGVtPlN5c3RlbSBJRDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TeXN0ZW0gSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN5c3RlbUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTeXN0ZW1JRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHVibGljIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QdWJsaWMgSUQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHVibGljIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQdWJsaWNJRChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRETm90YXRpb25fUHVibGljSUQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHVibGljSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0UHVibGljSUQgPGVtPlB1YmxpYyBJRDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QdWJsaWMgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFB1YmxpY0lEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQdWJsaWNJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgRFRERXh0ZXJuYWxFbnRpdHl9LiBJdCBpcwotCSAqIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0Tm90YXRpb24gPGVtPk5vdGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudGl0eTwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eTwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVEROb3RhdGlvbl9FbnRpdHkoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXROb3RhdGlvbgotCSAqIEBtb2RlbCB0eXBlPSJEVERFeHRlcm5hbEVudGl0eSIgb3Bwb3NpdGU9Im5vdGF0aW9uIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRFbnRpdHkoKTsKLQotfSAvLyBEVEROb3RhdGlvbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERPYmplY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRET2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwM2RiNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0vLyBSZWYgcGFja2FnZQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIERURE9iamVjdCBleHRlbmRzIEVPYmplY3QgewotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKTsKLQotCXB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKTsKLQotfSAvLyBEVERPYmplY3QKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRET2NjdXJyZW5jZVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRET2NjdXJyZW5jZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM4ZmI0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURE9jY3VycmVuY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+T2NjdXJyZW5jZSBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRET2NjdXJyZW5jZVR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVERPY2N1cnJlbmNlVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+T05FPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI09ORV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT05FID0gNDk7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PUFRJT05BTDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNPUFRJT05BTF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OQUwgPSA2MzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9ORSBPUiBNT1JFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI09ORV9PUl9NT1JFX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPTkVfT1JfTU9SRSA9IDQzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+WkVSTyBPUiBNT1JFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1pFUk9fT1JfTU9SRV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWkVST19PUl9NT1JFID0gNDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI09ORQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRET2NjdXJyZW5jZVR5cGUgT05FX0xJVEVSQUwgPSBuZXcgRFRET2NjdXJyZW5jZVR5cGUoT05FLCAiT05FIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9QVElPTkFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T1BUSU9OQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjT1BUSU9OQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERURE9jY3VycmVuY2VUeXBlIE9QVElPTkFMX0xJVEVSQUwgPSBuZXcgRFRET2NjdXJyZW5jZVR5cGUoT1BUSU9OQUwsICJPUFRJT05BTCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PTkUgT1IgTU9SRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk9ORSBPUiBNT1JFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdAotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI09ORV9PUl9NT1JFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERPY2N1cnJlbmNlVHlwZSBPTkVfT1JfTU9SRV9MSVRFUkFMID0gbmV3IERURE9jY3VycmVuY2VUeXBlKE9ORV9PUl9NT1JFLCAiT05FX09SX01PUkUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+WkVSTyBPUiBNT1JFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+WkVSTyBPUiBNT1JFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdAotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1pFUk9fT1JfTU9SRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRET2NjdXJyZW5jZVR5cGUgWkVST19PUl9NT1JFX0xJVEVSQUwgPSBuZXcgRFRET2NjdXJyZW5jZVR5cGUoWkVST19PUl9NT1JFLCAiWkVST19PUl9NT1JFIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5PY2N1cnJlbmNlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEVERPY2N1cnJlbmNlVHlwZVtdIFZBTFVFU19BUlJBWSA9IG5ldyBEVERPY2N1cnJlbmNlVHlwZVtde09ORV9MSVRFUkFMLCBPUFRJT05BTF9MSVRFUkFMLCBPTkVfT1JfTU9SRV9MSVRFUkFMLCBaRVJPX09SX01PUkVfTElURVJBTCx9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPk9jY3VycmVuY2UgVHlwZTwvYj48L2VtPicKLQkgKiBlbnVtZXJhdG9ycy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk9jY3VycmVuY2UgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBuYW1lLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERPY2N1cnJlbmNlVHlwZSBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCURURE9jY3VycmVuY2VUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+T2NjdXJyZW5jZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERPY2N1cnJlbmNlVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgT05FIDoKLQkJCQlyZXR1cm4gT05FX0xJVEVSQUw7Ci0JCQljYXNlIE9QVElPTkFMIDoKLQkJCQlyZXR1cm4gT1BUSU9OQUxfTElURVJBTDsKLQkJCWNhc2UgT05FX09SX01PUkUgOgotCQkJCXJldHVybiBPTkVfT1JfTU9SRV9MSVRFUkFMOwotCQkJY2FzZSBaRVJPX09SX01PUkUgOgotCQkJCXJldHVybiBaRVJPX09SX01PUkVfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRFRET2NjdXJyZW5jZVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi19IC8vIERURE9jY3VycmVuY2VUeXBlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFBDRGF0YUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUENEYXRhQ29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2FmNWRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUENEYXRhQ29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UEMgRGF0YSBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREUENEYXRhQ29udGVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERQQ0RhdGFDb250ZW50IGV4dGVuZHMgRFRERWxlbWVudENvbnRlbnQgewotfSAvLyBEVERQQ0RhdGFDb250ZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFBhY2thZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGU4NGMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLiBJdCBjb250YWlucwotICogYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogPGxpPmVhY2ggZW51bSw8L2xpPgotICogPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGYWN0b3J5Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFREUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAiZHRkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovLy9jb20vaWJtL2V0b29scy9kdGQuZWNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURURFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsLkRURFBhY2thZ2VJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVsZW1lbnRDb250ZW50SW1wbCA8ZW0+RWxlbWVudCBDb250ZW50PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbGVtZW50Q29udGVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERFbGVtZW50Q29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9DT05URU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVAgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FbGVtZW50IENvbnRlbnQ8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERSZXBlYXRhYmxlQ29udGVudEltcGwgPGVtPlJlcGVhdGFibGUgQ29udGVudDwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUmVwZWF0YWJsZUNvbnRlbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX1JFUEVBVEFCTEVfQ09OVEVOVCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQID0gRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVCA9IERURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2NjdXJyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfUkVQRUFUQUJMRV9DT05URU5UX19PQ0NVUlJFTkNFID0gRFREX0VMRU1FTlRfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UmVwZWF0YWJsZSBDb250ZW50PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfUkVQRUFUQUJMRV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgPSBEVERfRUxFTUVOVF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRER3JvdXBDb250ZW50SW1wbCA8ZW0+R3JvdXAgQ29udGVudDwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRER3JvdXBDb250ZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREdyb3VwQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfR1JPVVBfQ09OVEVOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9HUk9VUF9DT05URU5UX19HUk9VUCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9HUk9VUF9DT05URU5UX19FTEVNRU5UID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PY2N1cnJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9HUk9VUF9DT05URU5UX19PQ0NVUlJFTkNFID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fT0NDVVJSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cCBLaW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9HUk9VUF9DT05URU5UX19HUk9VUF9LSU5EID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50PC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Hcm91cCBDb250ZW50PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfR1JPVVBfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREF0dHJpYnV0ZUltcGwgPGVtPkF0dHJpYnV0ZTwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQXR0cmlidXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19FQU5OT1RBVElPTlMgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fTkFNRSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVUeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0VUWVBFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0VUWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fQ0hBTkdFQUJMRSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19DSEFOR0VBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZvbGF0aWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX1ZPTEFUSUxFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX1ZPTEFUSUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zaWVudDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19UUkFOU0lFTlQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fVFJBTlNJRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19VTklRVUUgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fVU5JUVVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWUgTGl0ZXJhbDwvYj48L2VtPicKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUwgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvd2VyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0xPV0VSX0JPVU5EID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0xPV0VSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVwcGVyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX1VQUEVSX0JPVU5EID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX1VQUEVSX0JPVU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fTUFOWSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19NQU5ZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX1JFUVVJUkVEID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVDb250YWluaW5nIENsYXNzPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0VDT05UQUlOSU5HX0NMQVNTID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0VDT05UQUlOSU5HX0NMQVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuc2V0dGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fVU5TRVRUQUJMRSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19VTlNFVFRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0lEID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19FQVRUUklCVVRFX1RZUEUgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fRUFUVFJJQlVURV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fQ09NTUVOVCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgS2luZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19ERUZBVUxUX0tJTkQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlIFN0cmluZzwvYj48L2VtPicKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX1NUUklORyA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRURfRU5USVRZID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFRF9FTlRJVFkgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QXR0cmlidXRlPC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVsZW1lbnRJbXBsIDxlbT5FbGVtZW50PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FQU5OT1RBVElPTlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fTkFNRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFuY2UgQ2xhc3MgTmFtZTwvYj48L2VtPicKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOU1RBTkNFX0NMQVNTX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFuY2UgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0lOU1RBTkNFX0NMQVNTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5TVEFOQ0VfQ0xBU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fREVGQVVMVF9WQUxVRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0RFRkFVTFRfVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FUEFDS0FHRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VQQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19BQlNUUkFDVCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fSU5URVJGQUNFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5URVJGQUNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdXBlciBUeXBlczwvYj48L2VtPicgcmVmZXJlbmNlCi0JICogbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FU1VQRVJfVFlQRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FU1VQRVJfVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU9wZXJhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRU9QRVJBVElPTlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FT1BFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIEF0dHJpYnV0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZQotCSAqIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRUFMTF9BVFRSSUJVVEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9BVFRSSUJVVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlCi0JICogbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FQUxMX1JFRkVSRU5DRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX1JFRkVSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVJlZmVyZW5jZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRVJFRkVSRU5DRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FUkVGRVJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FQVRUUklCVVRFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBVFRSSUJVVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgQ29udGFpbm1lbnRzPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VBTExfQ09OVEFJTk1FTlRTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9DT05UQUlOTUVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBPcGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UKLQkgKiBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VBTExfT1BFUkFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfT1BFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFN0cnVjdHVyYWwgRmVhdHVyZXM8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgU3VwZXIgVHlwZXM8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRUFMTF9TVVBFUl9UWVBFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfU1VQRVJfVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUlEIEF0dHJpYnV0ZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRUlEX0FUVFJJQlVURSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VJRF9BVFRSSUJVVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEZpbGU8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19EVERfRklMRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tbWVudDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fQ09NTUVOVCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudDwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fQ09OVEVOVCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEF0dHJpYnV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19EVERfQVRUUklCVVRFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RWxlbWVudDwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbXB0eUNvbnRlbnRJbXBsIDxlbT5FbXB0eSBDb250ZW50PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbXB0eUNvbnRlbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERW1wdHlDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9FTVBUWV9DT05URU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQID0gRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQgPSBEVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FbXB0eSBDb250ZW50PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU1QVFlfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gRFREX0VMRU1FTlRfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREFueUNvbnRlbnRJbXBsIDxlbT5BbnkgQ29udGVudDwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQW55Q29udGVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERBbnlDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9BTllfQ09OVEVOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BTllfQ09OVEVOVF9fR1JPVVAgPSBEVERfRUxFTUVOVF9DT05URU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQU5ZX0NPTlRFTlRfX0VMRU1FTlQgPSBEVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5BbnkgQ29udGVudDwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FOWV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgPSBEVERfRUxFTUVOVF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUENEYXRhQ29udGVudEltcGwgPGVtPlBDIERhdGEgQ29udGVudDwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUENEYXRhQ29udGVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERQQ0RhdGFDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9QQ19EQVRBX0NPTlRFTlQgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfUENfREFUQV9DT05URU5UX19HUk9VUCA9IERURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9QQ19EQVRBX0NPTlRFTlRfX0VMRU1FTlQgPSBEVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QQyBEYXRhIENvbnRlbnQ8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9QQ19EQVRBX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IERURF9FTEVNRU5UX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEltcGwgPGVtPkVsZW1lbnQgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9jY3VycmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX19PQ0NVUlJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgRWxlbWVudDwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fUkVGRVJFTkNFRF9FTEVNRU5UID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RWxlbWVudCBSZWZlcmVuY2UgQ29udGVudDwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERGaWxlSW1wbCA8ZW0+RmlsZTwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERmlsZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9GSUxFID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9GSUxFX19DT01NRU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJzZSBFcnJvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRklMRV9fUEFSU0VfRVJST1IgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBDb250ZW50PC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0ZJTEVfX0RURF9DT05URU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgRW51bWVyYXRpb24gVHlwZTwvYj48L2VtPicKLQkgKiBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0ZJTEVfX0RURF9FTlVNRVJBVElPTl9UWVBFID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RmlsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0ZJTEVfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERCYXNpY1R5cGVJbXBsIDxlbT5CYXNpYyBUeXBlPC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERCYXNpY1R5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFREQmFzaWNUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VBTk5PVEFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19OQU1FID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW5jZSBDbGFzcyBOYW1lPC9iPjwvZW0+JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5TVEFOQ0VfQ0xBU1NfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW5jZSBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlNUQU5DRV9DTEFTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19ERUZBVUxUX1ZBTFVFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fREVGQVVMVF9WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUGFja2FnZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VQQUNLQUdFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVBBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0FCU1RSQUNUID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19JTlRFUkZBQ0UgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlRFUkZBQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN1cGVyIFR5cGVzPC9iPjwvZW0+JyByZWZlcmVuY2UKLQkgKiBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VTVVBFUl9UWVBFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VTVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FT3BlcmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FT1BFUkFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VPUEVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgQXR0cmlidXRlczwvYj48L2VtPicgcmVmZXJlbmNlCi0JICogbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FQUxMX0FUVFJJQlVURVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX0FUVFJJQlVURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBSZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UKLQkgKiBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VBTExfUkVGRVJFTkNFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfUkVGRVJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUmVmZXJlbmNlczwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FUkVGRVJFTkNFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VSRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VBVFRSSUJVVEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFUVFJJQlVURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBDb250YWlubWVudHM8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRUFMTF9DT05UQUlOTUVOVFMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX0NPTlRBSU5NRU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIE9wZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZQotCSAqIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRUFMTF9PUEVSQVRJT05TID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9PUEVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgU3RydWN0dXJhbCBGZWF0dXJlczwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBTdXBlciBUeXBlczwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FQUxMX1NVUEVSX1RZUEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9TVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FSUQgQXR0cmlidXRlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FSURfQVRUUklCVVRFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUlEX0FUVFJJQlVURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19LSU5EID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QmFzaWMgVHlwZTwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnVtZXJhdGlvblR5cGVJbXBsIDxlbT5FbnVtZXJhdGlvbiBUeXBlPC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnVtZXJhdGlvblR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERW51bWVyYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VBTk5PVEFUSU9OUyA9IEVjb3JlUGFja2FnZS5FRU5VTV9fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEVfX05BTUUgPSBFY29yZVBhY2thZ2UuRUVOVU1fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFuY2UgQ2xhc3MgTmFtZTwvYj48L2VtPicKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA9IEVjb3JlUGFja2FnZS5FRU5VTV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW5jZSBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgPSBFY29yZVBhY2thZ2UuRUVOVU1fX0lOU1RBTkNFX0NMQVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RFRkFVTFRfVkFMVUUgPSBFY29yZVBhY2thZ2UuRUVOVU1fX0RFRkFVTFRfVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFX19FUEFDS0FHRSA9IEVjb3JlUGFja2FnZS5FRU5VTV9fRVBBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VyaWFsaXphYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFX19TRVJJQUxJWkFCTEUgPSBFY29yZVBhY2thZ2UuRUVOVU1fX1NFUklBTElaQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FTGl0ZXJhbHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRV9fRUxJVEVSQUxTID0gRWNvcmVQYWNrYWdlLkVFTlVNX19FTElURVJBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRV9fS0lORCA9IEVjb3JlUGFja2FnZS5FRU5VTV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgRmlsZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFID0gRWNvcmVQYWNrYWdlLkVFTlVNX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FbnVtZXJhdGlvbiBUeXBlPC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRV9GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVFTlVNX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQ29udGVudEltcGwgPGVtPkNvbnRlbnQ8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURENvbnRlbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFREQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfQ09OVEVOVCA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBGaWxlPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQ09OVEVOVF9fRFREX0ZJTEUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Db250ZW50PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURE5vdGF0aW9uSW1wbCA8ZW0+Tm90YXRpb248L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURE5vdGF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERURE5vdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9OT1RBVElPTiA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBGaWxlPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfTk9UQVRJT05fX0RURF9GSUxFID0gRFREX0NPTlRFTlRfX0RURF9GSUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX05PVEFUSU9OX19DT01NRU5UID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3lzdGVtIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9OT1RBVElPTl9fU1lTVEVNX0lEID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVibGljIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9OT1RBVElPTl9fUFVCTElDX0lEID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX05PVEFUSU9OX19FTlRJVFkgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+Tm90YXRpb248L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9OT1RBVElPTl9GRUFUVVJFX0NPVU5UID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlJbXBsIDxlbT5FbnRpdHk8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWSA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBGaWxlPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX19EVERfRklMRSA9IERURF9DT05URU5UX19EVERfRklMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfX0NPTU1FTlQgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJhbWV0ZXIgRW50aXR5PC9iPjwvZW0+JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFkgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50PC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfX0NPTlRFTlQgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJtIEVudGl0eSBSZWY8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IFJlZmVyZW5jZTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2U8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0UgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2U8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0UgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RW50aXR5PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX0ZFQVRVUkVfQ09VTlQgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUNvbnRlbnRJbXBsIDxlbT5FbnRpdHkgQ29udGVudDwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW50aXR5Q29udGVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERFbnRpdHlDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9FTlRJVFlfQ09OVEVOVCA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBFbnRpdHk8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkVudGl0eSBDb250ZW50PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFeHRlcm5hbEVudGl0eUltcGwgPGVtPkV4dGVybmFsIEVudGl0eTwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERXh0ZXJuYWxFbnRpdHlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERXh0ZXJuYWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0VYVEVSTkFMX0VOVElUWSA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBFbnRpdHk8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgPSBEVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3lzdGVtIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FWFRFUk5BTF9FTlRJVFlfX1NZU1RFTV9JRCA9IERURF9FTlRJVFlfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdWJsaWMgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VYVEVSTkFMX0VOVElUWV9fUFVCTElDX0lEID0gRFREX0VOVElUWV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vdGF0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FWFRFUk5BTF9FTlRJVFlfX05PVEFUSU9OID0gRFREX0VOVElUWV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBSZWZlcmVuY2VkIEZyb20gQW5vdGhlciBGaWxlPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFID0gRFREX0VOVElUWV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FeHRlcm5hbCBFbnRpdHk8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FWFRFUk5BTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCA9IERURF9FTlRJVFlfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREludGVybmFsRW50aXR5SW1wbCA8ZW0+SW50ZXJuYWwgRW50aXR5PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERJbnRlcm5hbEVudGl0eUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERJbnRlcm5hbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfSU5URVJOQUxfRU5USVRZID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEVudGl0eTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0lOVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA9IERURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfSU5URVJOQUxfRU5USVRZX19WQUxVRSA9IERURF9FTlRJVFlfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SW50ZXJuYWwgRW50aXR5PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfSU5URVJOQUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgPSBEVERfRU5USVRZX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsIDxlbT5QYXJhbWV0ZXIgRW50aXR5IFJlZmVyZW5jZTwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0UgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgRmlsZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSA9IERURF9DT05URU5UX19EVERfRklMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRpdHk8L2I+PC9lbT4nIHJlZmVyZW5jZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFkgPSBEVERfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2U8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9GRUFUVVJFX0NPVU5UID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50SW1wbCA8ZW0+RW50aXR5IFJlZmVyZW5jZSBDb250ZW50PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVCA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9jY3VycmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fT0NDVVJSRU5DRSA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBSZWZlcmVuY2VkIEVudGl0eTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RW50aXR5IFJlZmVyZW5jZSBDb250ZW50PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlIDxlbT5PY2N1cnJlbmNlIFR5cGU8L2VtPn0nCi0JICogZW51bS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRET2NjdXJyZW5jZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX09DQ1VSUkVOQ0VfVFlQRSA9IDIwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kIDxlbT5EZWZhdWx0IEtpbmQ8L2VtPn0nCi0JICogZW51bS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERGVmYXVsdEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0RFRkFVTFRfS0lORCA9IDIxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQgPGVtPkJhc2ljIFR5cGUgS2luZDwvZW0+fScKLQkgKiBlbnVtLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREJhc2ljVHlwZUtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfS0lORCA9IDIyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1Hcm91cEtpbmQgPGVtPkVudW0gR3JvdXAgS2luZDwvZW0+fScKLQkgKiBlbnVtLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREVudW1Hcm91cEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1fR1JPVVBfS0lORCA9IDIzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZCA8ZW0+R3JvdXAgS2luZDwvZW0+fScKLQkgKiBlbnVtLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRER3JvdXBLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9HUk9VUF9LSU5EID0gMjQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuWE1MU2NoZW1hRGVmaW5lZFR5cGUgPGVtPlhNTCBTY2hlbWEgRGVmaW5lZCBUeXBlPC9lbT59JwotCSAqIGVudW0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5YTUxTY2hlbWFEZWZpbmVkVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldFhNTFNjaGVtYURlZmluZWRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFhNTF9TQ0hFTUFfREVGSU5FRF9UWVBFID0gMjU7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQgPGVtPkVsZW1lbnQgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RWxlbWVudCBDb250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRERWxlbWVudENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5Hcm91cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQjZ2V0R3JvdXAoKQotCSAqIEBzZWUgI2dldERUREVsZW1lbnRDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbGVtZW50Q29udGVudF9Hcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRFbGVtZW50KCkKLQkgKiBAc2VlICNnZXREVERFbGVtZW50Q29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERWxlbWVudENvbnRlbnRfRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQgPGVtPkdyb3VwIENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkdyb3VwIENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRER3JvdXBDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50I2dldEdyb3VwS2luZCA8ZW0+R3JvdXAgS2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Hcm91cCBLaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQjZ2V0R3JvdXBLaW5kKCkKLQkgKiBAc2VlICNnZXREVERHcm91cENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREdyb3VwQ29udGVudF9Hcm91cEtpbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudCNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50I2dldENvbnRlbnQoKQotCSAqIEBzZWUgI2dldERUREdyb3VwQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRER3JvdXBDb250ZW50X0NvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlIDxlbT5BdHRyaWJ1dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db21tZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0Q29tbWVudCgpCi0JICogQHNlZSAjZ2V0RFREQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERBdHRyaWJ1dGVfQ29tbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREZWZhdWx0S2luZCA8ZW0+RGVmYXVsdCBLaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQgS2luZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERlZmF1bHRLaW5kKCkKLQkgKiBAc2VlICNnZXREVERBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREF0dHJpYnV0ZV9EZWZhdWx0S2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREZWZhdWx0VmFsdWVTdHJpbmcgPGVtPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkKLQkgKiBAc2VlICNnZXREVERBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREF0dHJpYnV0ZV9EZWZhdWx0VmFsdWVTdHJpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKQotCSAqIEBzZWUgI2dldERUREF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFREQXR0cmlidXRlX0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5IDxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KCkKLQkgKiBAc2VlICNnZXREVERBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RFRERWxlbWVudCA8ZW0+RFREIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkRURCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RFRERWxlbWVudCgpCi0JICogQHNlZSAjZ2V0RFREQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERBdHRyaWJ1dGVfRFRERWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0Q29tbWVudCgpCi0JICogQHNlZSAjZ2V0RFRERWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRERWxlbWVudF9Db21tZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0Q29udGVudCgpCi0JICogQHNlZSAjZ2V0RFRERWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERWxlbWVudF9Db250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldERUREF0dHJpYnV0ZSA8ZW0+RFREIEF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRURCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0RFREQXR0cmlidXRlKCkKLQkgKiBAc2VlICNnZXREVERFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbGVtZW50X0RUREF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQgPGVtPkVtcHR5IENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVtcHR5IENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVtcHR5Q29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRERW1wdHlDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQgPGVtPkFueSBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BbnkgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQW55Q29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFREQW55Q29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50IDxlbT5QQyBEYXRhIENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBDIERhdGEgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUENEYXRhQ29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFREUENEYXRhQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCA8ZW0+RWxlbWVudCBSZWZlcmVuY2UgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RWxlbWVudCBSZWZlcmVuY2UgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQjZ2V0UmVmZXJlbmNlZEVsZW1lbnQgPGVtPlJlZmVyZW5jZWQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5SZWZlcmVuY2VkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50I2dldFJlZmVyZW5jZWRFbGVtZW50KCkKLQkgKiBAc2VlICNnZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRfUmVmZXJlbmNlZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQgPGVtPlJlcGVhdGFibGUgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVwZWF0YWJsZSBDb250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXBlYXRhYmxlQ29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXBlYXRhYmxlQ29udGVudCNnZXRPY2N1cnJlbmNlIDxlbT5PY2N1cnJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9jY3VycmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50I2dldE9jY3VycmVuY2UoKQotCSAqIEBzZWUgI2dldERURFJlcGVhdGFibGVDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERSZXBlYXRhYmxlQ29udGVudF9PY2N1cnJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUgPGVtPkZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkZpbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29tbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXRDb21tZW50KCkKLQkgKiBAc2VlICNnZXREVERGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERGaWxlX0NvbW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2lzUGFyc2VFcnJvciA8ZW0+UGFyc2UgRXJyb3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFyc2UgRXJyb3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjaXNQYXJzZUVycm9yKCkKLQkgKiBAc2VlICNnZXREVERGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERGaWxlX1BhcnNlRXJyb3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFREQ29udGVudCA8ZW0+RFREIENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EVEQgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXREVERDb250ZW50KCkKLQkgKiBAc2VlICNnZXREVERGaWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERGaWxlX0RURENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFRERW51bWVyYXRpb25UeXBlIDxlbT5EVEQgRW51bWVyYXRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRURCBFbnVtZXJhdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldERUREVudW1lcmF0aW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0RFRERmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERmlsZV9EVERFbnVtZXJhdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlIDxlbT5CYXNpYyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CYXNpYyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREJhc2ljVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZSNnZXRLaW5kIDxlbT5LaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPktpbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZSNnZXRLaW5kKCkKLQkgKiBAc2VlICNnZXREVERCYXNpY1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREJhc2ljVHlwZV9LaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSA8ZW0+RW51bWVyYXRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RW51bWVyYXRpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERFbnVtZXJhdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5LaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUjZ2V0S2luZCgpCi0JICogQHNlZSAjZ2V0RFRERW51bWVyYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERFbnVtZXJhdGlvblR5cGVfS2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUjZ2V0RFRERmlsZSA8ZW0+RFREIEZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkRURCBGaWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUjZ2V0RFRERmlsZSgpCi0JICogQHNlZSAjZ2V0RFRERW51bWVyYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbnVtZXJhdGlvblR5cGVfRFRERmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiA8ZW0+Tm90YXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk5vdGF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRETm90YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldENvbW1lbnQoKQotCSAqIEBzZWUgI2dldERURE5vdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVEROb3RhdGlvbl9Db21tZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0U3lzdGVtSUQgPGVtPlN5c3RlbSBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TeXN0ZW0gSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldFN5c3RlbUlEKCkKLQkgKiBAc2VlICNnZXREVEROb3RhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRETm90YXRpb25fU3lzdGVtSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRQdWJsaWNJRCA8ZW0+UHVibGljIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlB1YmxpYyBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0UHVibGljSUQoKQotCSAqIEBzZWUgI2dldERURE5vdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVEROb3RhdGlvbl9QdWJsaWNJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0RW50aXR5IDxlbT5FbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5FbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldEVudGl0eSgpCi0JICogQHNlZSAjZ2V0RFRETm90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERURE5vdGF0aW9uX0VudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkgPGVtPkVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRDb21tZW50KCkKLQkgKiBAc2VlICNnZXREVERFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREVudGl0eV9Db21tZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2lzUGFyYW1ldGVyRW50aXR5IDxlbT5QYXJhbWV0ZXIgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhcmFtZXRlciBFbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNpc1BhcmFtZXRlckVudGl0eSgpCi0JICogQHNlZSAjZ2V0RFRERW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERFbnRpdHlfUGFyYW1ldGVyRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldENvbnRlbnQoKQotCSAqIEBzZWUgI2dldERUREVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERW50aXR5X0NvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0UGFybUVudGl0eVJlZiA8ZW0+UGFybSBFbnRpdHkgUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlBhcm0gRW50aXR5IFJlZjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldFBhcm1FbnRpdHlSZWYoKQotCSAqIEBzZWUgI2dldERUREVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERW50aXR5X1Bhcm1FbnRpdHlSZWYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRFbnRpdHlSZWZlcmVuY2UgPGVtPkVudGl0eSBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5FbnRpdHkgUmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0RW50aXR5UmVmZXJlbmNlKCkKLQkgKiBAc2VlICNnZXREVERFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVudGl0eV9FbnRpdHlSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlIDxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkKLQkgKiBAc2VlICNnZXREVERFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVudGl0eV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSA8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpCi0JICogQHNlZSAjZ2V0RFRERW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbnRpdHlfQXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50IDxlbT5FbnRpdHkgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RW50aXR5IENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREVudGl0eUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudCNnZXREVERFbnRpdHkgPGVtPkRURCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkRURCBFbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQjZ2V0RFRERW50aXR5KCkKLQkgKiBAc2VlICNnZXREVERFbnRpdHlDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbnRpdHlDb250ZW50X0RUREVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSA8ZW0+RXh0ZXJuYWwgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FeHRlcm5hbCBFbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERFeHRlcm5hbEVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldFN5c3RlbUlEIDxlbT5TeXN0ZW0gSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3lzdGVtIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXRTeXN0ZW1JRCgpCi0JICogQHNlZSAjZ2V0RFRERXh0ZXJuYWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREV4dGVybmFsRW50aXR5X1N5c3RlbUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0UHVibGljSUQgPGVtPlB1YmxpYyBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdWJsaWMgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldFB1YmxpY0lEKCkKLQkgKiBAc2VlICNnZXREVERFeHRlcm5hbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRERXh0ZXJuYWxFbnRpdHlfUHVibGljSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXROb3RhdGlvbiA8ZW0+Tm90YXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+Tm90YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldE5vdGF0aW9uKCkKLQkgKiBAc2VlICNnZXREVERFeHRlcm5hbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERXh0ZXJuYWxFbnRpdHlfTm90YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlIDxlbT5FbnRpdHkgUmVmZXJlbmNlZCBGcm9tIEFub3RoZXIgRmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FbnRpdHkgUmVmZXJlbmNlZCBGcm9tIEFub3RoZXIgRmlsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSgpCi0JICogQHNlZSAjZ2V0RFRERXh0ZXJuYWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREV4dGVybmFsRW50aXR5X0VudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHkgPGVtPkludGVybmFsIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SW50ZXJuYWwgRW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRESW50ZXJuYWxFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5I2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXREVERJbnRlcm5hbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRESW50ZXJuYWxFbnRpdHlfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIDxlbT5QYXJhbWV0ZXIgRW50aXR5IFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlI2dldEVudGl0eSA8ZW0+RW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlI2dldEVudGl0eSgpCi0JICogQHNlZSAjZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VfRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgPGVtPkVudGl0eSBSZWZlcmVuY2UgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RW50aXR5IFJlZmVyZW5jZSBDb250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCNnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSA8ZW0+RWxlbWVudCBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FbGVtZW50IFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50I2dldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCkKLQkgKiBAc2VlICNnZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50X0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERURENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudCNnZXREVERGaWxlIDxlbT5EVEQgRmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+RFREIEZpbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQjZ2V0RFRERmlsZSgpCi0JICogQHNlZSAjZ2V0RFREQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFREQ29udGVudF9EVERGaWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGUgPGVtPk9jY3VycmVuY2UgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5PY2N1cnJlbmNlIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldERURE9jY3VycmVuY2VUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQgPGVtPkRlZmF1bHQgS2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5EZWZhdWx0IEtpbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldERURERlZmF1bHRLaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZCA8ZW0+QmFzaWMgVHlwZSBLaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkJhc2ljIFR5cGUgS2luZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXREVERCYXNpY1R5cGVLaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZCA8ZW0+RW51bSBHcm91cCBLaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkVudW0gR3JvdXAgS2luZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXREVERFbnVtR3JvdXBLaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kIDxlbT5Hcm91cCBLaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkdyb3VwIEtpbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXREVERHcm91cEtpbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5YTUxTY2hlbWFEZWZpbmVkVHlwZSA8ZW0+WE1MIFNjaGVtYSBEZWZpbmVkIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+WE1MIFNjaGVtYSBEZWZpbmVkIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLlhNTFNjaGVtYURlZmluZWRUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFhNTFNjaGVtYURlZmluZWRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERmFjdG9yeSBnZXREVERGYWN0b3J5KCk7Ci0KLX0gLy8gRFREUGFja2FnZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNGY5MTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGV4dGVuZHMgRU5hbWVkRWxlbWVudCwgRFREQ29udGVudCwgRFRET2JqZWN0LCBEVERTb3VyY2VPZmZzZXQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudGl0eTwvYj48L2VtPicgcmVmZXJlbmNlLiBJdCBpcwotCSAqIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldFBhcm1FbnRpdHlSZWYgPGVtPlBhcm0gRW50aXR5IFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnRpdHk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW50aXR5PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFbnRpdHkoRFRERW50aXR5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZV9FbnRpdHkoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0UGFybUVudGl0eVJlZgotCSAqIEBtb2RlbCBvcHBvc2l0ZT0icGFybUVudGl0eVJlZiIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVudGl0eSBnZXRFbnRpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlI2dldEVudGl0eSA8ZW0+RW50aXR5PC9lbT59JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbnRpdHkoRFRERW50aXR5IHZhbHVlKTsKLQotfSAvLyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUmVwZWF0YWJsZUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUmVwZWF0YWJsZUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjliNTEyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFJlcGVhdGFibGVDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlcGVhdGFibGUgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQjZ2V0T2NjdXJyZW5jZSA8ZW0+T2NjdXJyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERSZXBlYXRhYmxlQ29udGVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFREUmVwZWF0YWJsZUNvbnRlbnQgZXh0ZW5kcyBEVERFbGVtZW50Q29udGVudCB7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHVucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T2NjdXJyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZX0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PY2N1cnJlbmNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9jY3VycmVuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZQotCSAqIEBzZWUgI3NldE9jY3VycmVuY2UoRFRET2NjdXJyZW5jZVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnRfT2NjdXJyZW5jZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURURE9jY3VycmVuY2VUeXBlIGdldE9jY3VycmVuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQjZ2V0T2NjdXJyZW5jZSA8ZW0+T2NjdXJyZW5jZTwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PY2N1cnJlbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGUKLQkgKiBAc2VlICNnZXRPY2N1cnJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPY2N1cnJlbmNlKERURE9jY3VycmVuY2VUeXBlIHZhbHVlKTsKLQotfSAvLyBEVERSZXBlYXRhYmxlQ29udGVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERSZXNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWRkMWZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLQotcHVibGljIGludGVyZmFjZSBEVERSZXNvdXJjZSB7Ci0JLy8gRW51bWVyYXRpb24gQ29uc3RhbnRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5ZSUNPTiA9ICJpY29ucy9hbnkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRJQ09OID0gImljb25zL2VsZW1lbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWUlDT04gPSAiaWNvbnMvZW50aXR5LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVJQ09OID0gImljb25zL2F0dHJpYnV0ZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT05JQ09OID0gImljb25zL25vdGF0aW9uLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWUlDT04gPSAiaWNvbnMvZW1wdHljb250ZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0RBVEFJQ09OID0gImljb25zL29uZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZUkVGRVJFTkNFSUNPTiA9ICJpY29ucy9lbnRpdHlfcmVmZXJlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORUlDT04gPSAiaWNvbnMvb25lLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05BTElDT04gPSAiaWNvbnMvb3B0aW9uYWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORU9STU9SRUlDT04gPSAiaWNvbnMvb25lb3Jtb3JlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaRVJPT1JNT1JFSUNPTiA9ICJpY29ucy96ZXJvb3Jtb3JlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORVNFUVVFTkNFSUNPTiA9ICJpY29ucy9vbmVzZXF1ZW5jZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OQUxTRVFVRU5DRUlDT04gPSAiaWNvbnMvb3B0aW9uYWxzZXF1ZW5jZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FT1JNT1JFU0VRVUVOQ0VJQ09OID0gImljb25zL29uZW9ybW9yZXNlcXVlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaRVJPT1JNT1JFU0VRVUVOQ0VJQ09OID0gImljb25zL3plcm9vcm1vcmVzZXF1ZW5jZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVDSE9JQ0VJQ09OID0gImljb25zL29uZWNob2ljZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OQUxDSE9JQ0VJQ09OID0gImljb25zL29wdGlvbmFsY2hvaWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVPUk1PUkVDSE9JQ0VJQ09OID0gImljb25zL29uZW9ybW9yZWNob2ljZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWkVST09STU9SRUNIT0lDRUlDT04gPSAiaWNvbnMvemVyb29ybW9yZWNob2ljZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERGSUxFSUNPTiA9ICJpY29ucy9EVERGaWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV0RURCA9ICJpY29ucy9uZXdkdGRfd2l6LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdIVE1MRk9STSA9ICJpY29ucy9nZW5odG1mb3JtX3dpei5naWYiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFNvdXJjZU9mZnNldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERTb3VyY2VPZmZzZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzNjI4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFNvdXJjZU9mZnNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotcHVibGljIGludGVyZmFjZSBEVERTb3VyY2VPZmZzZXQgewotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpOwotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZE9mZnNldChpbnQgdik7Ci0KLX0vLyBEVERTb3VyY2VPZmZzZXQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NzQ2MjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1wdWJsaWMgaW50ZXJmYWNlIERURFR5cGUgZXh0ZW5kcyBEVERPYmplY3QgewotCS8vIGNvbnN0YW50IHN0cmluZ3MgZm9yIGR0ZCBhdHRyaWJ1dGUgdHlwZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FID0gIk5vbmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQSA9ICJDaGFyYWN0ZXIgRGF0YSAoQ0RBVEEpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIklkZW50aWZpZXIgKElEKSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRFJFRiA9ICJJRCBSZWZlcmVuY2UgKElEUkVGKSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRFJFRlMgPSAiSUQgUmVmZXJlbmNlcyAoSURSRUZTKSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFkgPSAiRW50aXR5IE5hbWUgKEVOVElUWSkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRJRVMgPSAiRW50aXR5IE5hbWVzIChFTlRJVElFUykiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk1UT0tFTiA9ICJOYW1lIFRva2VuIChOTVRPS0VOKSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOTVRPS0VOUyA9ICJOYW1lIFRva2VucyAoTk1UT0tFTlMpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVU1fTkFNRV9UT0tFTl9HUk9VUCA9ICJFbnVtZXJhdGVkIE5hbWUgVG9rZW5zIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVU1fTk9UQVRJT05fR1JPVVAgPSAiRW51bWVyYXRlZCBOT1RBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9YTUxTY2hlbWFEZWZpbmVkVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9YTUxTY2hlbWFEZWZpbmVkVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGM2OGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvWE1MU2NoZW1hRGVmaW5lZFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5YTUwgU2NoZW1hIERlZmluZWQgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldFhNTFNjaGVtYURlZmluZWRUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MU2NoZW1hRGVmaW5lZFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk9ORV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORSA9IC0xOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U1RSSU5HPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1NUUklOR19MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSSU5HID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkJPT0xFQU48L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjQk9PTEVBTl9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9PTEVBTiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GTE9BVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNGTE9BVF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxPQVQgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RE9VQkxFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0RPVUJMRV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9VQkxFID0gNDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRFQ0lNQUw8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjREVDSU1BTF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVDSU1BTCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5USU1FSU5TVEFOVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNUSU1FSU5TVEFOVF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElNRUlOU1RBTlQgPSA2OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VElNRURVUkFUSU9OPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1RJTUVEVVJBVElPTl9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElNRURVUkFUSU9OID0gNzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJFQ1VSUklOR0lOU1RBTlQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjUkVDVVJSSU5HSU5TVEFOVF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVDVVJSSU5HSU5TVEFOVCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5CSU5BUlk8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjQklOQVJZX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSU5BUlkgPSA5OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1VSSV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVJJID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTlRFR0VSPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0lOVEVHRVJfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVHRVIgPSAxMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRBVEU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjREFURV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREFURSA9IDEyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VElNRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNUSU1FX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSU1FID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk9ORQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgTk9ORV9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKE5PTkUsICJOT05FIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNUUklORzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNUUklORzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNTVFJJTkcKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIFNUUklOR19MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKFNUUklORywgIlNUUklORyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5CT09MRUFOPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Qk9PTEVBTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNCT09MRUFOCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBCT09MRUFOX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoQk9PTEVBTiwgIkJPT0xFQU4iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RkxPQVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5GTE9BVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNGTE9BVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgRkxPQVRfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShGTE9BVCwgIkZMT0FUIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRPVUJMRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkRPVUJMRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNET1VCTEUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIERPVUJMRV9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKERPVUJMRSwgIkRPVUJMRSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5ERUNJTUFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+REVDSU1BTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNERUNJTUFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBERUNJTUFMX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoREVDSU1BTCwgIkRFQ0lNQUwiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VElNRUlOU1RBTlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5USU1FSU5TVEFOVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QKLQkgKiBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNUSU1FSU5TVEFOVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgVElNRUlOU1RBTlRfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShUSU1FSU5TVEFOVCwgIlRJTUVJTlNUQU5UIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlRJTUVEVVJBVElPTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlRJTUVEVVJBVElPTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QKLQkgKiBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNUSU1FRFVSQVRJT04KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIFRJTUVEVVJBVElPTl9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKFRJTUVEVVJBVElPTiwgIlRJTUVEVVJBVElPTiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRUNVUlJJTkdJTlNUQU5UPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UkVDVVJSSU5HSU5TVEFOVDwvYj48L2VtPicgbGl0ZXJhbAotCSAqIG9iamVjdCBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24KLQkgKiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1JFQ1VSUklOR0lOU1RBTlQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIFJFQ1VSUklOR0lOU1RBTlRfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShSRUNVUlJJTkdJTlNUQU5ULCAiUkVDVVJSSU5HSU5TVEFOVCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5CSU5BUlk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5CSU5BUlk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjQklOQVJZCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBCSU5BUllfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShCSU5BUlksICJCSU5BUlkiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlVSSTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNVUkkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIFVSSV9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKFVSSSwgIlVSSSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTlRFR0VSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU5URUdFUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNJTlRFR0VSCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBJTlRFR0VSX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoSU5URUdFUiwgIklOVEVHRVIiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+REFURTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5EQVRFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0RBVEUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIERBVEVfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShEQVRFLCAiREFURSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5USU1FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlRJTUU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjVElNRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgVElNRV9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKFRJTUUsICJUSU1FIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5YTUwgU2NoZW1hIERlZmluZWQgVHlwZTwvYj48L2VtPicKLQkgKiBlbnVtZXJhdG9ycy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlW10gVkFMVUVTX0FSUkFZID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlW117Tk9ORV9MSVRFUkFMLCBTVFJJTkdfTElURVJBTCwgQk9PTEVBTl9MSVRFUkFMLCBGTE9BVF9MSVRFUkFMLCBET1VCTEVfTElURVJBTCwgREVDSU1BTF9MSVRFUkFMLCBUSU1FSU5TVEFOVF9MSVRFUkFMLCBUSU1FRFVSQVRJT05fTElURVJBTCwgUkVDVVJSSU5HSU5TVEFOVF9MSVRFUkFMLCBCSU5BUllfTElURVJBTCwgVVJJX0xJVEVSQUwsIElOVEVHRVJfTElURVJBTCwgREFURV9MSVRFUkFMLCBUSU1FX0xJVEVSQUwsfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5YTUwgU2NoZW1hIERlZmluZWQgVHlwZTwvYj48L2VtPicKLQkgKiBlbnVtZXJhdG9ycy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhNTCBTY2hlbWEgRGVmaW5lZCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIG5hbWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhNTFNjaGVtYURlZmluZWRUeXBlIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJWE1MU2NoZW1hRGVmaW5lZFR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5YTUwgU2NoZW1hIERlZmluZWQgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoCi0JICogdGhlIHNwZWNpZmllZCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWE1MU2NoZW1hRGVmaW5lZFR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIE5PTkUgOgotCQkJCXJldHVybiBOT05FX0xJVEVSQUw7Ci0JCQljYXNlIFNUUklORyA6Ci0JCQkJcmV0dXJuIFNUUklOR19MSVRFUkFMOwotCQkJY2FzZSBCT09MRUFOIDoKLQkJCQlyZXR1cm4gQk9PTEVBTl9MSVRFUkFMOwotCQkJY2FzZSBGTE9BVCA6Ci0JCQkJcmV0dXJuIEZMT0FUX0xJVEVSQUw7Ci0JCQljYXNlIERPVUJMRSA6Ci0JCQkJcmV0dXJuIERPVUJMRV9MSVRFUkFMOwotCQkJY2FzZSBERUNJTUFMIDoKLQkJCQlyZXR1cm4gREVDSU1BTF9MSVRFUkFMOwotCQkJY2FzZSBUSU1FSU5TVEFOVCA6Ci0JCQkJcmV0dXJuIFRJTUVJTlNUQU5UX0xJVEVSQUw7Ci0JCQljYXNlIFRJTUVEVVJBVElPTiA6Ci0JCQkJcmV0dXJuIFRJTUVEVVJBVElPTl9MSVRFUkFMOwotCQkJY2FzZSBSRUNVUlJJTkdJTlNUQU5UIDoKLQkJCQlyZXR1cm4gUkVDVVJSSU5HSU5TVEFOVF9MSVRFUkFMOwotCQkJY2FzZSBCSU5BUlkgOgotCQkJCXJldHVybiBCSU5BUllfTElURVJBTDsKLQkJCWNhc2UgVVJJIDoKLQkJCQlyZXR1cm4gVVJJX0xJVEVSQUw7Ci0JCQljYXNlIElOVEVHRVIgOgotCQkJCXJldHVybiBJTlRFR0VSX0xJVEVSQUw7Ci0JCQljYXNlIERBVEUgOgotCQkJCXJldHVybiBEQVRFX0xJVEVSQUw7Ci0JCQljYXNlIFRJTUUgOgotCQkJCXJldHVybiBUSU1FX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFhNTFNjaGVtYURlZmluZWRUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotfSAvLyBYTUxTY2hlbWFEZWZpbmVkVHlwZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREFueUNvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQW55Q29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU4MTI4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQW55Q29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBbnlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BbnkgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERBbnlDb250ZW50SW1wbCBleHRlbmRzIERUREVsZW1lbnRDb250ZW50SW1wbCBpbXBsZW1lbnRzIERUREFueUNvbnRlbnQgewotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudE5hbWUoKSB7Ci0JCXJldHVybiAiQU5ZIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFREQW55Q29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFREQW55Q29udGVudCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCwgRFRER3JvdXBDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQXR0cmlidXRlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREF0dHJpYnV0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg2MDIwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQXR0cmlidXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkNoYWluSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW1MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVBdHRyaWJ1dGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1Hcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERMZXhpY2FsSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERUeXBlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkF0dHJpYnV0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERBdHRyaWJ1dGVJbXBsI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQXR0cmlidXRlSW1wbCNnZXREZWZhdWx0S2luZCA8ZW0+RGVmYXVsdCBLaW5kPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREF0dHJpYnV0ZUltcGwjZ2V0RGVmYXVsdFZhbHVlU3RyaW5nIDxlbT5EZWZhdWx0IFZhbHVlIFN0cmluZzwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERBdHRyaWJ1dGVJbXBsI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5IDxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERBdHRyaWJ1dGVJbXBsI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5IDxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERBdHRyaWJ1dGVJbXBsI2dldERUREVsZW1lbnQgPGVtPkRURCBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREF0dHJpYnV0ZUltcGwgZXh0ZW5kcyBFQXR0cmlidXRlSW1wbCBpbXBsZW1lbnRzIERUREF0dHJpYnV0ZSB7Ci0KLQlwdWJsaWMgRFREQXR0cmlidXRlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRFREVHlwZSBnZXREVERUeXBlKCkgewotCQlyZXR1cm4gKERURFR5cGUpIGdldEVUeXBlKCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXREVERUeXBlKERURFR5cGUgdHlwZSkgewotCQlzZXRFVHlwZSgoRUNsYXNzaWZpZXIpIHR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERUREJhc2ljVHlwZShpbnQgdmFsdWUpIHsKLQkJRFRERmFjdG9yeUltcGwgZmFjdG9yeSA9IChEVERGYWN0b3J5SW1wbCkgRFRERmFjdG9yeUltcGwuaW5zdGFuY2UoKTsKLQkJLy8gc2V0IGF0dHJpYnV0ZSB0eXBlCi0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgMCA6Ci0JCQkJc2V0RFREVHlwZShmYWN0b3J5LmdldERUREJhc2ljVHlwZV9OT05FKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxIDoKLQkJCQlzZXREVERUeXBlKGZhY3RvcnkuZ2V0RFREQmFzaWNUeXBlX0NEQVRBKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyIDoKLQkJCQlzZXREVERUeXBlKGZhY3RvcnkuZ2V0RFREQmFzaWNUeXBlX0lEKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzIDoKLQkJCQlzZXREVERUeXBlKGZhY3RvcnkuZ2V0RFREQmFzaWNUeXBlX0lEUkVGKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSA0IDoKLQkJCQlzZXREVERUeXBlKGZhY3RvcnkuZ2V0RFREQmFzaWNUeXBlX0lEUkVGUygpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNSA6Ci0JCQkJc2V0RFREVHlwZShmYWN0b3J5LmdldERUREJhc2ljVHlwZV9FTlRJVFkoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDYgOgotCQkJCXNldERURFR5cGUoZmFjdG9yeS5nZXREVERCYXNpY1R5cGVfRU5USVRJRVMoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDcgOgotCQkJCXNldERURFR5cGUoZmFjdG9yeS5nZXREVERCYXNpY1R5cGVfTk1UT0tFTigpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgOCA6Ci0JCQkJc2V0RFREVHlwZShmYWN0b3J5LmdldERUREJhc2ljVHlwZV9OTVRPS0VOUygpKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZSgpIHsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoMTI4KTsKLQotCi0JCXJlc3VsdC5hcHBlbmQoZ2V0TmFtZSgpKTsKLQotCi0JCVN0cmluZ0J1ZmZlciB2YWx1ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc3dpdGNoIChnZXREZWZhdWx0S2luZCgpLmdldFZhbHVlKCkpIHsKLQkJCWNhc2UgRFRERGVmYXVsdEtpbmQuSU1QTElFRCA6Ci0JCQkJdmFsdWUuYXBwZW5kKCIjSU1QTElFRCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIERURERlZmF1bHRLaW5kLlJFUVVJUkVEIDoKLQkJCQl2YWx1ZS5hcHBlbmQoIiNSRVFVSVJFRCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIERURERlZmF1bHRLaW5kLkZJWEVEIDoKLQkJCQlTdHJpbmcgdHlwZSA9IGdldERURFR5cGUoKS50b1N0cmluZygpOwotCQkJCWlmICghKHR5cGUuZXF1YWxzKERURFR5cGUuSUQpIHx8IHR5cGUuZXF1YWxzKERURFR5cGUuSURSRUYpIHx8IHR5cGUuZXF1YWxzKERURFR5cGUuRU5VTV9OQU1FX1RPS0VOX0dST1VQKSB8fCB0eXBlLmVxdWFscyhEVERUeXBlLklEUkVGUykpKSB7Ci0JCQkJCXZhbHVlLmFwcGVuZCgiI0ZJWEVEIFwiIikuYXBwZW5kKGdldERlZmF1bHRWYWx1ZVN0cmluZygpKS5hcHBlbmQoIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRFRERGVmYXVsdEtpbmQuTk9GSVhFRCA6Ci0JCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGdldERlZmF1bHRWYWx1ZVN0cmluZygpOwotCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkKLQkJCQkJdmFsdWUuYXBwZW5kKCJcIiIpLmFwcGVuZChkZWZhdWx0VmFsdWUpLmFwcGVuZCgiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJYnJlYWs7Ci0JCX0KLQotCi0JCS8vIEdldCB0aGUgYXR0cmlidXRlIHR5cGUKLQkJRFRERW50aXR5IHR5cGVFbnQgPSBnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpOwotCQlpZiAodHlwZUVudCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuYXBwZW5kKCIgJSIgKyB0eXBlRW50LmdldE5hbWUoKSArICI7ICIpLmFwcGVuZCh2YWx1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVsc2UgewotCQkJRFREVHlwZSBkdGRUeXBlID0gZ2V0RFREVHlwZSgpOwotCQkJaWYgKGR0ZFR5cGUgaW5zdGFuY2VvZiBEVERCYXNpY1R5cGUpIHsKLQkJCQlzd2l0Y2ggKCgoRFREQmFzaWNUeXBlKSBkdGRUeXBlKS5nZXRLaW5kKCkuZ2V0VmFsdWUoKSkgewotCQkJCQljYXNlIERUREJhc2ljVHlwZUtpbmQuQ0RBVEEgOgotCQkJCQkJcmVzdWx0LmFwcGVuZCgiIENEQVRBICIpLmFwcGVuZCh2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIERUREJhc2ljVHlwZUtpbmQuSUQgOgotCQkJCQkJcmVzdWx0LmFwcGVuZCgiIElEICIpLmFwcGVuZCh2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIERUREJhc2ljVHlwZUtpbmQuSURSRUYgOgotCQkJCQkJcmVzdWx0LmFwcGVuZCgiIElEUkVGICIpLmFwcGVuZCh2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIERUREJhc2ljVHlwZUtpbmQuSURSRUZTIDoKLQkJCQkJCXJlc3VsdC5hcHBlbmQoIiBJRFJFRlMgIikuYXBwZW5kKHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgRFREQmFzaWNUeXBlS2luZC5FTlRJVFkgOgotCQkJCQkJcmVzdWx0LmFwcGVuZCgiIEVOVElUWSAiKS5hcHBlbmQodmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBEVERCYXNpY1R5cGVLaW5kLkVOVElUSUVTIDoKLQkJCQkJCXJlc3VsdC5hcHBlbmQoIiBFTlRJVElFUyAiKS5hcHBlbmQodmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBEVERCYXNpY1R5cGVLaW5kLk5NVE9LRU4gOgotCQkJCQkJcmVzdWx0LmFwcGVuZCgiIE5NVE9LRU4gIikuYXBwZW5kKHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgRFREQmFzaWNUeXBlS2luZC5OTVRPS0VOUyA6Ci0JCQkJCQlyZXN1bHQuYXBwZW5kKCIgTk1UT0tFTlMgIikuYXBwZW5kKHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoZHRkVHlwZSBpbnN0YW5jZW9mIERUREVudW1lcmF0aW9uVHlwZSkgewotCQkJCXJlc3VsdC5hcHBlbmQoIiAiKS5hcHBlbmQoYnVpbGRFbnVtU3RyaW5nKChEVERFbnVtZXJhdGlvblR5cGUpIGR0ZFR5cGUpKS5hcHBlbmQodmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRW51bVN0cmluZyhEVERFbnVtZXJhdGlvblR5cGUgZW51bVR5cGUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQotCQlpZiAoZW51bVR5cGUuZ2V0S2luZCgpLmdldFZhbHVlKCkgPT0gRFRERW51bUdyb3VwS2luZC5OT1RBVElPTl9HUk9VUCkKLQkJCXJlc3VsdCArPSAiTk9UQVRJT04gIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkJSXRlcmF0b3IgaSA9IGVudW1UeXBlLmdldEVudW1MaXRlcmFscygpLml0ZXJhdG9yKCk7Ci0JCWlmIChpLmhhc05leHQoKSkgewotCQkJcmVzdWx0ICs9ICIoIiArICgoRUVudW1MaXRlcmFsKSBpLm5leHQoKSkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJcmVzdWx0ICs9ICIgfCAiICsgKChFRW51bUxpdGVyYWwpIGkubmV4dCgpKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXN1bHQgKz0gIikgIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBEVERFbnVtZXJhdGlvblR5cGUgY3JlYXRlRFRERW51bWVyYXRpb24oU3RyaW5nW10gZW51bVZhbHVlcywgaW50IGVudW1LaW5kKSB7Ci0JCURUREVudW1lcmF0aW9uVHlwZSBlbnVtZXJhdGlvbiA9IERUREZhY3RvcnlJbXBsLmluc3RhbmNlKCkuY3JlYXRlRFRERW51bWVyYXRpb25UeXBlKCk7Ci0JCS8vIGVudW0uc2V0SUQoIkVudW1fIiArICgoRFRERWxlbWVudClnZXRNT0ZEb21haW4oKSkuZ2V0TmFtZSgpICsgIl8iICsKLQkJLy8gZ2V0TmFtZSgpKTsKLQkJRFRERW51bUdyb3VwS2luZCBncm91cEtpbmQgPSBEVERFbnVtR3JvdXBLaW5kLmdldChlbnVtS2luZCk7Ci0JCWVudW1lcmF0aW9uLnNldEtpbmQoZ3JvdXBLaW5kKTsKLQkJLy8gRW51bWVyYXRpb24gdmFsdWVzCi0JCWlmIChlbnVtVmFsdWVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW51bVZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJCUVjb3JlUGFja2FnZSBlUGFja2FnZSA9IChFY29yZVBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjb3JlUGFja2FnZS5lTlNfVVJJKTsKLQkJCQlFRW51bUxpdGVyYWwgZW51bUxpdGVyYWwgPSAoKEVjb3JlRmFjdG9yeSkgZVBhY2thZ2UuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVFRW51bUxpdGVyYWwoKTsKLQkJCQkvLyBNT0YyRU1GIFBvcnQKLQkJCQkvLyBlbnVtTGl0ZXJhbC5yZWZTZXRMaXRlcmFsKGVudW1WYWx1ZXNbaV0pOwotCQkJCWVudW1MaXRlcmFsLnNldE5hbWUoZW51bVZhbHVlc1tpXSk7Ci0JCQkJLy8gTU9GMkVNRiBQb3J0Ci0JCQkJLy8gZW51bUxpdGVyYWwucmVmU2V0TGl0ZXJhbChpKTsKLQkJCQllbnVtTGl0ZXJhbC5zZXRWYWx1ZShpKTsKLQotCQkJCWVudW1lcmF0aW9uLmdldEVudW1MaXRlcmFscygpLmFkZChlbnVtTGl0ZXJhbCk7Ci0JCQl9Ci0JCX0KLQkJZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKS5nZXREVERFbnVtZXJhdGlvblR5cGUoKS5hZGQoZW51bWVyYXRpb24pOwotCQlyZXR1cm4gZW51bWVyYXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JCS8vIFRPRE86IGZpbmlzaCBwb3J0Ci0JCS8vIHJldHVybiBEVERQYXRobmFtZVV0aWwubWFrZVBhdGgoZ2V0RFRERWxlbWVudCgpLmdldFBhdGhuYW1lKCksCi0JCS8vICJBdHRyIiwgZ2V0TmFtZSgpLCAtMSk7Ci0JfQotCi0KLQlwdWJsaWMgRFRET2JqZWN0IGZpbmRPYmplY3QoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlyZXR1cm4gbnVsbDsKLQkJLy8gVE9ETzogZmluaXNoIHBvcnQKLQkJLyoKLQkJICogT2JqZWN0W10gcmVzdWx0ID0gRFREUGF0aG5hbWVVdGlsLnBhcnNlUGF0aENvbXBvbmVudChyZWxhdGl2ZVBhdGgpOwotCQkgKiAKLQkJICogCi0JCSAqIFN0cmluZyB0eXBlID0gKFN0cmluZylyZXN1bHRbMF07Ci0JCSAqIAotCQkgKiAKLQkJICogaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCSAqIAotCQkgKiAKLQkJICogRFRET2JqZWN0IG9iaiA9IG51bGw7IGlmICh0eXBlLmVxdWFscygiVHlwZSIpKSB7IG9iaiA9Ci0JCSAqIGdldERhdGFUeXBlKCk7IH0gZWxzZSB7IHJldHVybiBudWxsOyB9Ci0JCSAqIAotCQkgKiAKLQkJICogU3RyaW5nIHJlc3RQYXRoID0gKFN0cmluZylyZXN1bHRbM107Ci0JCSAqIAotCQkgKiBpZiAoKHJlc3RQYXRoID09IG51bGwpIHx8IChvYmogPT0gbnVsbCkpIHsgcmV0dXJuIG9iajsgfSBlbHNlIHsKLQkJICogcmV0dXJuIG9iai5maW5kT2JqZWN0KHJlc3RQYXRoKTsgfQotCQkgKi8KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFbnVtZXJhdGVkVmFsdWVzKCkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCi0JCURURFR5cGUgdHlwZSA9IGdldERURFR5cGUoKTsKLQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBEVERFbnVtZXJhdGlvblR5cGUpIHsKLQkJCURUREVudW1lcmF0aW9uVHlwZSBlbnVtVHlwZSA9IChEVERFbnVtZXJhdGlvblR5cGUpIHR5cGU7Ci0JCQlJdGVyYXRvciBpID0gZW51bVR5cGUuZ2V0RW51bUxpdGVyYWxzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCXJlc3VsdC5hZGQoKChFRW51bUxpdGVyYWwpIGkubmV4dCgpKS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLQkvLyBXb3VsZCByYXRoZXIgaGF2ZSBhbGwgdGhpcyBzdHVmZiBpbiBhIGJhc2UgY2xhc3MgYnV0IHRoZXNlCi0JLy8gY2xhc3NlcyBhcmUgaW5oZXJpdGluZyBmcm9tIHNvbWV0aW1lcyBkaWZmZXJlbnQgbW9mIGNsYXNzZXMKLQlEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgdikgewotCQlsZXhJbmZvLnNldFN0YXJ0T2Zmc2V0KHYpOwotCX0KLQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBsZXhJbmZvLmdldEVuZE9mZnNldCgpOwotCX0KLQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0RW5kT2Zmc2V0KHYpOwotCX0KLQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbW1lbnQoKSA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tbWVudCgpIDxlbT5Db21tZW50PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb21tZW50ID0gQ09NTUVOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0S2luZCgpIDxlbT5EZWZhdWx0IEtpbmQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXREZWZhdWx0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEVEREZWZhdWx0S2luZCBERUZBVUxUX0tJTkRfRURFRkFVTFQgPSBEVEREZWZhdWx0S2luZC5JTVBMSUVEX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0S2luZCgpIDxlbT5EZWZhdWx0IEtpbmQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXREZWZhdWx0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERURERlZmF1bHRLaW5kIGRlZmF1bHRLaW5kID0gREVGQVVMVF9LSU5EX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRWYWx1ZVN0cmluZygpIDxlbT5EZWZhdWx0IFZhbHVlIFN0cmluZzwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldERlZmF1bHRWYWx1ZVN0cmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9WQUxVRV9TVFJJTkdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkgPGVtPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZVN0cmluZyA9IERFRkFVTFRfVkFMVUVfU1RSSU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKSA8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERUREVudGl0eSBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpIDxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFRERW50aXR5IGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5ID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREF0dHJpYnV0ZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBuZXdDb21tZW50KSB7Ci0JCVN0cmluZyBvbGRDb21tZW50ID0gY29tbWVudDsKLQkJY29tbWVudCA9IG5ld0NvbW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQ09NTUVOVCwgb2xkQ29tbWVudCwgY29tbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERGVmYXVsdEtpbmQgZ2V0RGVmYXVsdEtpbmQoKSB7Ci0JCXJldHVybiBkZWZhdWx0S2luZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdEtpbmQoRFRERGVmYXVsdEtpbmQgbmV3RGVmYXVsdEtpbmQpIHsKLQkJRFRERGVmYXVsdEtpbmQgb2xkRGVmYXVsdEtpbmQgPSBkZWZhdWx0S2luZDsKLQkJZGVmYXVsdEtpbmQgPSBuZXdEZWZhdWx0S2luZCA9PSBudWxsID8gREVGQVVMVF9LSU5EX0VERUZBVUxUIDogbmV3RGVmYXVsdEtpbmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9LSU5ELCBvbGREZWZhdWx0S2luZCwgZGVmYXVsdEtpbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWVTdHJpbmcoKSB7Ci0JCXJldHVybiBkZWZhdWx0VmFsdWVTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZVN0cmluZyhTdHJpbmcgbmV3RGVmYXVsdFZhbHVlU3RyaW5nKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0VmFsdWVTdHJpbmcgPSBkZWZhdWx0VmFsdWVTdHJpbmc7Ci0JCWRlZmF1bHRWYWx1ZVN0cmluZyA9IG5ld0RlZmF1bHRWYWx1ZVN0cmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX1NUUklORywgb2xkRGVmYXVsdFZhbHVlU3RyaW5nLCBkZWZhdWx0VmFsdWVTdHJpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREVudGl0eSBnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJaWYgKGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwgJiYgYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkuZUlzUHJveHkoKSkgewotCQkJRFRERW50aXR5IG9sZEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5ID0gYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHk7Ci0JCQlhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSA9IChEVERFbnRpdHkpIEVjb3JlVXRpbC5yZXNvbHZlKGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5LCB0aGlzKTsKLQkJCWlmIChhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSAhPSBvbGRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFRF9FTlRJVFksIG9sZEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5LCBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREVudGl0eSBiYXNpY0dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCkgewotCQlyZXR1cm4gYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KERUREVudGl0eSBuZXdBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEVERFbnRpdHkgb2xkQXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgPSBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eTsKLQkJYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgPSBuZXdBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBuZXcgTm90aWZpY2F0aW9uQ2hhaW5JbXBsKDQpOwotCQkJbXNncy5hZGQobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFRF9FTlRJVFksIG9sZEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5LCBuZXdBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSkpOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eShEVERFbnRpdHkgbmV3QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkpIHsKLQkJaWYgKG5ld0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5ICE9IGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFLCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSkuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0UsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eShuZXdBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFRF9FTlRJVFksIG5ld0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5LCBuZXdBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KCkgewotCQlpZiAoYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbCAmJiBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eS5lSXNQcm94eSgpKSB7Ci0JCQlEVERFbnRpdHkgb2xkQXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgPSBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eTsKLQkJCWF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5ID0gKERUREVudGl0eSkgRWNvcmVVdGlsLnJlc29sdmUoYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHksIHRoaXMpOwotCQkJaWYgKGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5ICE9IG9sZEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSwgb2xkQXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHksIGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGJhc2ljR2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoRFRERW50aXR5IG5ld0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCURUREVudGl0eSBvbGRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSA9IGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5OwotCQlhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSA9IG5ld0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5ldyBOb3RpZmljYXRpb25DaGFpbkltcGwoNCk7Ci0JCQltc2dzLmFkZChuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSwgb2xkQXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHksIG5ld0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KSk7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KERUREVudGl0eSBuZXdBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSkgewotCQlpZiAobmV3QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgIT0gYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSkuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0UsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KG5ld0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSwgbmV3QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHksIG5ld0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbGVtZW50IGdldERUREVsZW1lbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChEVERFbGVtZW50KSBlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREVERFbGVtZW50KERUREVsZW1lbnQgbmV3RFRERWxlbWVudCkgewotCQlpZiAobmV3RFRERWxlbWVudCAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQgJiYgbmV3RFRERWxlbWVudCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0RUREVsZW1lbnQpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdEVERFbGVtZW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdEVERFbGVtZW50KS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfQVRUUklCVVRFLCBEVERFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3RFRERWxlbWVudCwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQsIG5ld0RUREVsZW1lbnQsIG5ld0RUREVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQkJaWYgKGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRSwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCQkJcmV0dXJuIGJhc2ljU2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKERUREVudGl0eSkgb3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJCWlmIChhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSAhPSBudWxsKQotCQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSkuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0UsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KChEVERFbnRpdHkpIG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19FQU5OT1RBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJCXJldHVybiBiYXNpY1NldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJCXJldHVybiBiYXNpY1NldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0FUVFJJQlVURSwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19FQU5OT1RBVElPTlMgOgotCQkJCXJldHVybiBnZXRFQW5ub3RhdGlvbnMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VUWVBFIDoKLQkJCQlpZiAocmVzb2x2ZSkKLQkJCQkJcmV0dXJuIGdldEVUeXBlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RVR5cGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19DSEFOR0VBQkxFIDoKLQkJCQlyZXR1cm4gaXNDaGFuZ2VhYmxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1ZPTEFUSUxFIDoKLQkJCQlyZXR1cm4gaXNWb2xhdGlsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19UUkFOU0lFTlQgOgotCQkJCXJldHVybiBpc1RyYW5zaWVudCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VTklRVUUgOgotCQkJCXJldHVybiBpc1VuaXF1ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUwgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWVMaXRlcmFsKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRSA6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0xPV0VSX0JPVU5EIDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0TG93ZXJCb3VuZCgpKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VUFBFUl9CT1VORCA6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFVwcGVyQm91bmQoKSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fTUFOWSA6Ci0JCQkJcmV0dXJuIGlzTWFueSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19SRVFVSVJFRCA6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRUNPTlRBSU5JTkdfQ0xBU1MgOgotCQkJCXJldHVybiBnZXRFQ29udGFpbmluZ0NsYXNzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVU5TRVRUQUJMRSA6Ci0JCQkJcmV0dXJuIGlzVW5zZXR0YWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19JRCA6Ci0JCQkJcmV0dXJuIGlzSUQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRUFUVFJJQlVURV9UWVBFIDoKLQkJCQlpZiAocmVzb2x2ZSkKLQkJCQkJcmV0dXJuIGdldEVBdHRyaWJ1dGVUeXBlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RUF0dHJpYnV0ZVR5cGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19DT01NRU5UIDoKLQkJCQlyZXR1cm4gZ2V0Q29tbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfS0lORCA6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRLaW5kKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9TVFJJTkcgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWVTdHJpbmcoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJaWYgKHJlc29sdmUpCi0JCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpOwotCQkJCXJldHVybiBiYXNpY0dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCWlmIChyZXNvbHZlKQotCQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RFRERWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRUFOTk9UQVRJT05TIDoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVBbm5vdGF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19OQU1FIDoKLQkJCQlzZXROYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRVRZUEUgOgotCQkJCXNldEVUeXBlKChFQ2xhc3NpZmllcikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19DSEFOR0VBQkxFIDoKLQkJCQlzZXRDaGFuZ2VhYmxlKCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVk9MQVRJTEUgOgotCQkJCXNldFZvbGF0aWxlKCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVFJBTlNJRU5UIDoKLQkJCQlzZXRUcmFuc2llbnQoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VTklRVUUgOgotCQkJCXNldFVuaXF1ZSgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfTElURVJBTCA6Ci0JCQkJc2V0RGVmYXVsdFZhbHVlTGl0ZXJhbCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0xPV0VSX0JPVU5EIDoKLQkJCQlzZXRMb3dlckJvdW5kKCgoSW50ZWdlcikgbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VUFBFUl9CT1VORCA6Ci0JCQkJc2V0VXBwZXJCb3VuZCgoKEludGVnZXIpIG5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVU5TRVRUQUJMRSA6Ci0JCQkJc2V0VW5zZXR0YWJsZSgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0lEIDoKLQkJCQlzZXRJRCgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0NPTU1FTlQgOgotCQkJCXNldENvbW1lbnQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX0tJTkQgOgotCQkJCXNldERlZmF1bHRLaW5kKChEVEREZWZhdWx0S2luZCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX1NUUklORyA6Ci0JCQkJc2V0RGVmYXVsdFZhbHVlU3RyaW5nKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCXNldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KChEVERFbnRpdHkpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCXNldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KChEVERFbnRpdHkpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQgOgotCQkJCXNldERUREVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19FQU5OT1RBVElPTlMgOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX05BTUUgOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VUWVBFIDoKLQkJCQlzZXRFVHlwZSgoRUNsYXNzaWZpZXIpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19DSEFOR0VBQkxFIDoKLQkJCQlzZXRDaGFuZ2VhYmxlKENIQU5HRUFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19WT0xBVElMRSA6Ci0JCQkJc2V0Vm9sYXRpbGUoVk9MQVRJTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19UUkFOU0lFTlQgOgotCQkJCXNldFRyYW5zaWVudChUUkFOU0lFTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VTklRVUUgOgotCQkJCXNldFVuaXF1ZShVTklRVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUwgOgotCQkJCXNldERlZmF1bHRWYWx1ZUxpdGVyYWwoREVGQVVMVF9WQUxVRV9MSVRFUkFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fTE9XRVJfQk9VTkQgOgotCQkJCXNldExvd2VyQm91bmQoTE9XRVJfQk9VTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VUFBFUl9CT1VORCA6Ci0JCQkJc2V0VXBwZXJCb3VuZChVUFBFUl9CT1VORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1VOU0VUVEFCTEUgOgotCQkJCXNldFVuc2V0dGFibGUoVU5TRVRUQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0lEIDoKLQkJCQlzZXRJRChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0NPTU1FTlQgOgotCQkJCXNldENvbW1lbnQoQ09NTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfS0lORCA6Ci0JCQkJc2V0RGVmYXVsdEtpbmQoREVGQVVMVF9LSU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9TVFJJTkcgOgotCQkJCXNldERlZmF1bHRWYWx1ZVN0cmluZyhERUZBVUxUX1ZBTFVFX1NUUklOR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQlzZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgoRFRERW50aXR5KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCXNldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KChEVERFbnRpdHkpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCA6Ci0JCQkJc2V0RFRERWxlbWVudCgoRFRERWxlbWVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJcmV0dXJuIGVBbm5vdGF0aW9ucyAhPSBudWxsICYmICFnZXRFQW5ub3RhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fTkFNRSA6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19FVFlQRSA6Ci0JCQkJcmV0dXJuIGVUeXBlICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQ0hBTkdFQUJMRSA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQ0hBTkdFQUJMRV9FRkxBRykgIT0gMCkgIT0gQ0hBTkdFQUJMRV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19WT0xBVElMRSA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgVk9MQVRJTEVfRUZMQUcpICE9IDApICE9IFZPTEFUSUxFX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1RSQU5TSUVOVCA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgVFJBTlNJRU5UX0VGTEFHKSAhPSAwKSAhPSBUUkFOU0lFTlRfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVU5JUVVFIDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBVTklRVUVfRUZMQUcpICE9IDApICE9IFVOSVFVRV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUwgOgotCQkJCXJldHVybiBERUZBVUxUX1ZBTFVFX0xJVEVSQUxfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRWYWx1ZUxpdGVyYWwgIT0gbnVsbCA6ICFERUZBVUxUX1ZBTFVFX0xJVEVSQUxfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRWYWx1ZUxpdGVyYWwpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUUgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0xPV0VSX0JPVU5EIDoKLQkJCQlyZXR1cm4gbG93ZXJCb3VuZCAhPSBMT1dFUl9CT1VORF9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VUFBFUl9CT1VORCA6Ci0JCQkJcmV0dXJuIHVwcGVyQm91bmQgIT0gVVBQRVJfQk9VTkRfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fTUFOWSA6Ci0JCQkJcmV0dXJuIGlzTWFueSgpICE9IGZhbHNlOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1JFUVVJUkVEIDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpICE9IGZhbHNlOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VDT05UQUlOSU5HX0NMQVNTIDoKLQkJCQlyZXR1cm4gZ2V0RUNvbnRhaW5pbmdDbGFzcygpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVU5TRVRUQUJMRSA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgVU5TRVRUQUJMRV9FRkxBRykgIT0gMCkgIT0gVU5TRVRUQUJMRV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19JRCA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgSURfRUZMQUcpICE9IDApICE9IElEX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VBVFRSSUJVVEVfVFlQRSA6Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RUF0dHJpYnV0ZVR5cGUoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0NPTU1FTlQgOgotCQkJCXJldHVybiBDT01NRU5UX0VERUZBVUxUID09IG51bGwgPyBjb21tZW50ICE9IG51bGwgOiAhQ09NTUVOVF9FREVGQVVMVC5lcXVhbHMoY29tbWVudCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9LSU5EIDoKLQkJCQlyZXR1cm4gZGVmYXVsdEtpbmQgIT0gREVGQVVMVF9LSU5EX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfU1RSSU5HIDoKLQkJCQlyZXR1cm4gREVGQVVMVF9WQUxVRV9TVFJJTkdfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRWYWx1ZVN0cmluZyAhPSBudWxsIDogIURFRkFVTFRfVkFMVUVfU1RSSU5HX0VERUZBVUxULmVxdWFscyhkZWZhdWx0VmFsdWVTdHJpbmcpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQlyZXR1cm4gYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5ICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXREVERFbGVtZW50KCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29tbWVudDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjb21tZW50KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0S2luZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0S2luZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdFZhbHVlU3RyaW5nOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGRlZmF1bHRWYWx1ZVN0cmluZyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBEVERBdHRyaWJ1dGVJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQmFzaWNUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREJhc2ljVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdmOWE4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQmFzaWNUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREVHlwZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CYXNpYyBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREJhc2ljVHlwZUltcGwjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERCYXNpY1R5cGVJbXBsIGV4dGVuZHMgRUNsYXNzSW1wbCBpbXBsZW1lbnRzIERUREJhc2ljVHlwZSwgRUNsYXNzIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIGJhc2ljVHlwZVN0cmluZ3NbXSA9IHtEVERUeXBlLk5PTkUsIERURFR5cGUuQ0RBVEEsIERURFR5cGUuSUQsIERURFR5cGUuSURSRUYsIERURFR5cGUuSURSRUZTLCBEVERUeXBlLkVOVElUWSwgRFREVHlwZS5FTlRJVElFUywgRFREVHlwZS5OTVRPS0VOLCBEVERUeXBlLk5NVE9LRU5TfTsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIGJhc2ljVHlwZURlc2NyaXB0aW9uc1tdID0ge0RURENvcmVNZXNzYWdlcy5fVUlfTk9ORV9ERVNDLCBEVERDb3JlTWVzc2FnZXMuX1VJX0NIQVJBQ1RFUl9EQVRBX0RFU0MsIERURENvcmVNZXNzYWdlcy5fVUlfSURFTlRJRklFUl9ERVNDLCBEVERDb3JlTWVzc2FnZXMuX1VJX0lEX1JFRkVSRU5DRV9ERVNDLCBEVERDb3JlTWVzc2FnZXMuX1VJX0lEX1JFRkVSRU5DRVNfREVTQywgRFREQ29yZU1lc3NhZ2VzLl9VSV9FTlRJVFlfTkFNRV9ERVNDLCBEVERDb3JlTWVzc2FnZXMuX1VJX0VOVElUWV9OQU1FU19ERVNDLCBEVERDb3JlTWVzc2FnZXMuX1VJX05BTUVfVE9LRU5fREVTQywgRFREQ29yZU1lc3NhZ2VzLl9VSV9OQU1FX1RPS0VOU19ERVNDfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkIC8vJE5PTi1OTFMtOSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IGJhc2ljVHlwZUtpbmRzW10gPSB7RFREQmFzaWNUeXBlS2luZC5OT05FLCBEVERCYXNpY1R5cGVLaW5kLkNEQVRBLCBEVERCYXNpY1R5cGVLaW5kLklELCBEVERCYXNpY1R5cGVLaW5kLklEUkVGLCBEVERCYXNpY1R5cGVLaW5kLklEUkVGUywgRFREQmFzaWNUeXBlS2luZC5FTlRJVFksIERUREJhc2ljVHlwZUtpbmQuRU5USVRJRVMsIERUREJhc2ljVHlwZUtpbmQuTk1UT0tFTiwgRFREQmFzaWNUeXBlS2luZC5OTVRPS0VOU307Ci0KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2UoKSB7Ci0JCXJldHVybiBnZXRUeXBlU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKCkgewotCQlpbnQga2luZCA9IGdldEtpbmQoKS5nZXRWYWx1ZSgpOwotCQlpZiAoa2luZCA+PSAwICYmIGtpbmQgPCBiYXNpY1R5cGVTdHJpbmdzLmxlbmd0aCkgewotCQkJcmV0dXJuIGJhc2ljVHlwZVN0cmluZ3Nba2luZF07Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGdldFR5cGVEZXNjcmlwdGlvbihnZXRLaW5kKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlRGVzY3JpcHRpb24oaW50IHR5cGVLaW5kKSB7Ci0JCWlmICh0eXBlS2luZCA+PSAwICYmIHR5cGVLaW5kIDwgYmFzaWNUeXBlRGVzY3JpcHRpb25zLmxlbmd0aCkgewotCQkJcmV0dXJuIGJhc2ljVHlwZURlc2NyaXB0aW9uc1t0eXBlS2luZF07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJLy8gVEJECi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2luZCgpIDxlbT5LaW5kPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kIEtJTkRfRURFRkFVTFQgPSBEVERCYXNpY1R5cGVLaW5kLk5PTkVfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtpbmQoKSA8ZW0+S2luZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEVERCYXNpY1R5cGVLaW5kIGtpbmQgPSBLSU5EX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEVERCYXNpY1R5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREJhc2ljVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREQmFzaWNUeXBlS2luZCBnZXRLaW5kKCkgewotCQlyZXR1cm4ga2luZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2luZChEVERCYXNpY1R5cGVLaW5kIG5ld0tpbmQpIHsKLQkJRFREQmFzaWNUeXBlS2luZCBvbGRLaW5kID0ga2luZDsKLQkJa2luZCA9IG5ld0tpbmQgPT0gbnVsbCA/IEtJTkRfRURFRkFVTFQgOiBuZXdLaW5kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19LSU5ELCBvbGRLaW5kLCBraW5kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VQQUNLQUdFIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUEFDS0FHRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FT1BFUkFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVPcGVyYXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVBbm5vdGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUEFDS0FHRSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVBBQ0tBR0UsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRU9QRVJBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFT3BlcmF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUkVGRVJFTkNFUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVSZWZlcmVuY2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBVFRSSUJVVEVTIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUF0dHJpYnV0ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVBBQ0tBR0UgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfX0VDTEFTU0lGSUVSUywgRVBhY2thZ2UuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0SW5zdGFuY2VDbGFzc05hbWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXJldHVybiBnZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0RFRkFVTFRfVkFMVUUgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVBBQ0tBR0UgOgotCQkJCXJldHVybiBnZXRFUGFja2FnZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19BQlNUUkFDVCA6Ci0JCQkJcmV0dXJuIGlzQWJzdHJhY3QoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0lOVEVSRkFDRSA6Ci0JCQkJcmV0dXJuIGlzSW50ZXJmYWNlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FU1VQRVJfVFlQRVMgOgotCQkJCXJldHVybiBnZXRFU3VwZXJUeXBlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FT1BFUkFUSU9OUyA6Ci0JCQkJcmV0dXJuIGdldEVPcGVyYXRpb25zKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfQVRUUklCVVRFUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfUkVGRVJFTkNFUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxSZWZlcmVuY2VzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VSRUZFUkVOQ0VTIDoKLQkJCQlyZXR1cm4gZ2V0RVJlZmVyZW5jZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFUVFJJQlVURVMgOgotCQkJCXJldHVybiBnZXRFQXR0cmlidXRlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX0NPTlRBSU5NRU5UUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxDb250YWlubWVudHMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFMTF9PUEVSQVRJT05TIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbE9wZXJhdGlvbnMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX1NVUEVSX1RZUEVTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbFN1cGVyVHlwZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUlEX0FUVFJJQlVURSA6Ci0JCQkJcmV0dXJuIGdldEVJREF0dHJpYnV0ZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19LSU5EIDoKLQkJCQlyZXR1cm4gZ2V0S2luZCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX05BTUUgOgotCQkJCXNldE5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzc05hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXNldEluc3RhbmNlQ2xhc3MoKENsYXNzKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19BQlNUUkFDVCA6Ci0JCQkJc2V0QWJzdHJhY3QoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5URVJGQUNFIDoKLQkJCQlzZXRJbnRlcmZhY2UoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVNVUEVSX1RZUEVTIDoKLQkJCQlnZXRFU3VwZXJUeXBlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RVN1cGVyVHlwZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VPUEVSQVRJT05TIDoKLQkJCQlnZXRFT3BlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RU9wZXJhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VSRUZFUkVOQ0VTIDoKLQkJCQlnZXRFUmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RVJlZmVyZW5jZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBVFRSSUJVVEVTIDoKLQkJCQlnZXRFQXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUF0dHJpYnV0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0tJTkQgOgotCQkJCXNldEtpbmQoKERUREJhc2ljVHlwZUtpbmQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fTkFNRSA6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUUgOgotCQkJCXNldEluc3RhbmNlQ2xhc3NOYW1lKElOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXNldEluc3RhbmNlQ2xhc3MoSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fQUJTVFJBQ1QgOgotCQkJCXNldEFic3RyYWN0KEFCU1RSQUNUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0lOVEVSRkFDRSA6Ci0JCQkJc2V0SW50ZXJmYWNlKElOVEVSRkFDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FU1VQRVJfVFlQRVMgOgotCQkJCWdldEVTdXBlclR5cGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VPUEVSQVRJT05TIDoKLQkJCQlnZXRFT3BlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUkVGRVJFTkNFUyA6Ci0JCQkJZ2V0RVJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFUVFJJQlVURVMgOgotCQkJCWdldEVBdHRyaWJ1dGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0tJTkQgOgotCQkJCXNldEtpbmQoS0lORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQU5OT1RBVElPTlMgOgotCQkJCXJldHVybiBlQW5ub3RhdGlvbnMgIT0gbnVsbCAmJiAhZ2V0RUFubm90YXRpb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19OQU1FIDoKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlyZXR1cm4gSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gaW5zdGFuY2VDbGFzc05hbWUgIT0gbnVsbCA6ICFJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxULmVxdWFscyhpbnN0YW5jZUNsYXNzTmFtZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0lOU1RBTkNFX0NMQVNTIDoKLQkJCQlyZXR1cm4gSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGluc3RhbmNlQ2xhc3MgIT0gbnVsbCA6ICFJTlNUQU5DRV9DTEFTU19FREVGQVVMVC5lcXVhbHMoaW5zdGFuY2VDbGFzcyk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0RFRkFVTFRfVkFMVUUgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUEFDS0FHRSA6Ci0JCQkJcmV0dXJuIGdldEVQYWNrYWdlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fQUJTVFJBQ1QgOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEFCU1RSQUNUX0VGTEFHKSAhPSAwKSAhPSBBQlNUUkFDVF9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5URVJGQUNFIDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBJTlRFUkZBQ0VfRUZMQUcpICE9IDApICE9IElOVEVSRkFDRV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVNVUEVSX1RZUEVTIDoKLQkJCQlyZXR1cm4gZVN1cGVyVHlwZXMgIT0gbnVsbCAmJiAhZ2V0RVN1cGVyVHlwZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VPUEVSQVRJT05TIDoKLQkJCQlyZXR1cm4gZU9wZXJhdGlvbnMgIT0gbnVsbCAmJiAhZ2V0RU9wZXJhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfQVRUUklCVVRFUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsQXR0cmlidXRlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFMTF9SRUZFUkVOQ0VTIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxSZWZlcmVuY2VzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUkVGRVJFTkNFUyA6Ci0JCQkJcmV0dXJuIGVSZWZlcmVuY2VzICE9IG51bGwgJiYgIWdldEVSZWZlcmVuY2VzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQVRUUklCVVRFUyA6Ci0JCQkJcmV0dXJuIGVBdHRyaWJ1dGVzICE9IG51bGwgJiYgIWdldEVBdHRyaWJ1dGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX0NPTlRBSU5NRU5UUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsQ29udGFpbm1lbnRzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX09QRVJBVElPTlMgOgotCQkJCXJldHVybiAhZ2V0RUFsbE9wZXJhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX1NVUEVSX1RZUEVTIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxTdXBlclR5cGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FSURfQVRUUklCVVRFIDoKLQkJCQlyZXR1cm4gZ2V0RUlEQXR0cmlidXRlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fS0lORCA6Ci0JCQkJcmV0dXJuIGtpbmQgIT0gS0lORF9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoa2luZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChraW5kKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIERUREJhc2ljVHlwZUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURENvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MTQ3Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURENvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTmFtZWRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci0KLQotcHVibGljIGNsYXNzIERURENvbnRlbnRJbXBsIGV4dGVuZHMgRU5hbWVkRWxlbWVudEltcGwgaW1wbGVtZW50cyBEVERDb250ZW50LCBFT2JqZWN0IHsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFREQ29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFREQ29udGVudCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERmlsZSBnZXREVERGaWxlKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBEVERQYWNrYWdlLkRURF9DT05URU5UX19EVERfRklMRSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKERUREZpbGUpIGVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERUREZpbGUoRFRERmlsZSBuZXdEVERGaWxlKSB7Ci0JCWlmIChuZXdEVERGaWxlICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUgJiYgbmV3RFRERmlsZSAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0RUREZpbGUpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdEVERGaWxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdEVERGaWxlKS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCwgRFRERmlsZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0RUREZpbGUsIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUsIG5ld0RUREZpbGUsIG5ld0RUREZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9DT05URU5UX19EVERfRklMRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQsIERUREZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvLyBEVERDb250ZW50SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVsZW1lbnRDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVsZW1lbnRDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzY2OTQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbGVtZW50Q29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETGV4aWNhbEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERQYXRobmFtZVV0aWw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWxlbWVudCBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVsZW1lbnRDb250ZW50SW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERWxlbWVudENvbnRlbnRJbXBsI2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRFRERWxlbWVudENvbnRlbnRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBEVERFbGVtZW50Q29udGVudCB7Ci0KLQlwdWJsaWMgRFRERWxlbWVudENvbnRlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBEVERFbGVtZW50IGdldERUREVsZW1lbnQoKSB7Ci0JCURUREVsZW1lbnRDb250ZW50IGMgPSBnZXREVERHcm91cENvbnRlbnQoKTsKLQkJaWYgKGMgIT0gbnVsbCkKLQkJCXJldHVybiBjLmdldEVsZW1lbnQoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQl9Ci0KLQkvLyBnZXQgdGhlIG1vc3Qgb3V0ZXIgRFRER3JvdXBDb250ZW50Ci0JcHVibGljIERUREdyb3VwQ29udGVudCBnZXREVERHcm91cENvbnRlbnQoKSB7Ci0JCURUREVsZW1lbnRDb250ZW50IGMgPSB0aGlzOwotCQl3aGlsZSAoYy5nZXRHcm91cCgpICE9IG51bGwpIHsKLQkJCWMgPSBjLmdldEdyb3VwKCk7Ci0JCX0KLQkJcmV0dXJuICgoYyBpbnN0YW5jZW9mIERUREdyb3VwQ29udGVudCkgPyAoRFRER3JvdXBDb250ZW50KSBjIDogbnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJaW50IGNudCA9IDA7Ci0JCURURE9iamVjdCBwYXJlbnQgPSBnZXRHcm91cCgpOwotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXBhcmVudCA9IGdldEVsZW1lbnQoKTsKLQkJfQotCQllbHNlIHsKLQkJCURUREdyb3VwQ29udGVudCBncm91cCA9IChEVERHcm91cENvbnRlbnQpIHBhcmVudDsKLQkJCUl0ZXJhdG9yIGkgPSBncm91cC5nZXRDb250ZW50KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCURUREVsZW1lbnRDb250ZW50IGNvbnRlbnQgPSAoRFRERWxlbWVudENvbnRlbnQpIGkubmV4dCgpOwotCQkJCWlmIChjb250ZW50ID09IHRoaXMpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICgoY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB8fCAoY29udGVudCBpbnN0YW5jZW9mIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQljbnQrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRFREUGF0aG5hbWVVdGlsLm1ha2VQYXRoKCgocGFyZW50ID09IG51bGwpID8gIk5VTExfUEFSRU5UIiA6IHBhcmVudC5nZXRQYXRobmFtZSgpKSwgIkNvbnRlbnQiLCBudWxsLCBjbnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgRFRET2JqZWN0IGZpbmRPYmplY3QoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpcnN0RWxlbWVudENvbnRlbnQoKSB7Ci0JCURUREVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkvLyBUaGlzIG1lYW5zIHRoaXMgaXMgdGhlIG9ubHkgZWxlbWVudCBjb250ZW50IGluIHRoZSBlbGVtZW50Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQotCQlEVERHcm91cENvbnRlbnQgZ3JvdXAgPSBnZXRHcm91cCgpOwotCQlpbnQgcG9zID0gZ3JvdXAuZ2V0Q29udGVudFBvc2l0aW9uKHRoaXMpOwotCQlpZiAocG9zID09IDApIHsKLQkJCS8vIG5vdyByZWN1cnNlIGFuZCBlbnN1cmUgdGhpcyBncm91cCBpcyB0aGUgZmlyc3QgZ3JvdXAKLQkJCXJldHVybiBncm91cC5pc0ZpcnN0RWxlbWVudENvbnRlbnQoKTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnREZXRhaWwoKSB7Ci0JCS8vIG1vc3QgdGltZXMsIGNvbnRlbnQgbmFtZSBpcyBmaW5lLiBIb3dldmVyIGZvciBncm91cHMsCi0JCS8vIHdlIGRpZG4ndCB3YW50IGEgbG9uZyBuYW1lIHRvIHNob3cgdXAgaW4gdGhlIHRyZWUsCi0JCS8vIHNvIHdlIGNyZWF0ZWQgYSBnZXQgY29udGVudGRldGFpbCB0byBnZXQgdG8gdGhlIGxvbmcKLQkJLy8gbmFtZSAoZ2V0Q29udGVudE5hbWUgd2lsbCBnZXQgdGhlIHNob3J0IG9uZS4KLQkJcmV0dXJuIGdldENvbnRlbnROYW1lKCk7Ci0JfQotCi0JLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLQkvLyBXb3VsZCByYXRoZXIgaGF2ZSBhbGwgdGhpcyBzdHVmZiBpbiBhIGJhc2UgY2xhc3MgYnV0IHRoZXNlCi0JLy8gY2xhc3NlcyBhcmUgaW5oZXJpdGluZyBmcm9tIHNvbWV0aW1lcyBkaWZmZXJlbnQgbW9mIGNsYXNzZXMKLQlEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRTdGFydE9mZnNldCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0RW5kT2Zmc2V0KHYpOwotCX0KLQotCS8qCi0JICogQHNlZSBEVERFbGVtZW50Q29udGVudCNnZXRDb250ZW50TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50TmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERWxlbWVudENvbnRlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREdyb3VwQ29udGVudCBnZXRHcm91cCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKERUREdyb3VwQ29udGVudCkgZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R3JvdXAoRFRER3JvdXBDb250ZW50IG5ld0dyb3VwKSB7Ci0JCWlmIChuZXdHcm91cCAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVAgJiYgbmV3R3JvdXAgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdHcm91cCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSArICIuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0dyb3VwICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdHcm91cCkuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCwgRFRER3JvdXBDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3R3JvdXAsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQLCBuZXdHcm91cCwgbmV3R3JvdXApKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRFRERWxlbWVudCkgZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChEVERFbGVtZW50IG5ld0VsZW1lbnQpIHsKLQkJaWYgKG5ld0VsZW1lbnQgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQgJiYgbmV3RWxlbWVudCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0VsZW1lbnQpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdFbGVtZW50KS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5ULCBEVERFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3RWxlbWVudCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5ULCBuZXdFbGVtZW50LCBuZXdFbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5ULCBEVERHcm91cENvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvLyBEVERFbGVtZW50Q29udGVudEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbGVtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMjc0ZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25DaGFpbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERMZXhpY2FsSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFBhdGhuYW1lVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREVmlzaXRvcjsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREVsZW1lbnRJbXBsIGV4dGVuZHMgRUNsYXNzSW1wbCBpbXBsZW1lbnRzIERUREVsZW1lbnQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21tZW50KCkgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0VERUZBVUxUID0gbnVsbDsKLQotCXB1YmxpYyBEVERFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbGVtZW50KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRFREQXR0cmlidXRlKERUREF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJZ2V0RFREQXR0cmlidXRlKCkuYWRkKGF0dHJpYnV0ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJcmV0dXJuIERURFBhdGhuYW1lVXRpbC5tYWtlUGF0aChudWxsLCAiRWxlbSIsIGdldE5hbWUoKSwgLTEpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIERURE9iamVjdCBmaW5kT2JqZWN0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJT2JqZWN0W10gcmVzdWx0ID0gRFREUGF0aG5hbWVVdGlsLnBhcnNlUGF0aENvbXBvbmVudChyZWxhdGl2ZVBhdGgpOwotCi0JCVN0cmluZyB0eXBlID0gKFN0cmluZykgcmVzdWx0WzBdOwotCi0JCWlmICh0eXBlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlEVERPYmplY3Qgb2JqID0gbnVsbDsKLQkJaWYgKHR5cGUuZXF1YWxzKCJBdHRyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gVE9ETzogZml4IHBvcnQKLQkJCS8vIG9iaiA9IGZpbmRBdHRyaWJ1dGUobmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAoKHR5cGUuZXF1YWxzKCJDb250ZW50IikpIHx8ICh0eXBlLmVxdWFscygiRWxlbVJlZiIpKSB8fCAodHlwZS5lcXVhbHMoIkVudFJlZiIpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJb2JqID0gZ2V0Q29udGVudCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgcmVzdFBhdGggPSAoU3RyaW5nKSByZXN1bHRbM107Ci0KLQkJaWYgKChyZXN0UGF0aCA9PSBudWxsKSB8fCAob2JqID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gb2JqOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG9iai5maW5kT2JqZWN0KHJlc3RQYXRoKTsKLQkJfQotCX0KLQotCS8vIHJldHVybnMgYWxsIHJlZmVyZW5jZXMgaW4gdGhlIHNhbWUgRFRERmlsZSB0aGF0IHJlZmVyZW5jZSB0aGlzIGVsZW1lbnQKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZWZlcmVuY2VzKCkgewotCQlEVERGaWxlIGZpbGUgPSBnZXREVERGaWxlKCk7Ci0JCWZpbmFsIENvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCURURFZpc2l0b3IgdmlzaXRSZWZzID0gbmV3IERURFZpc2l0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2aXNpdERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnRSZWZlcmVuY2VDb250ZW50LmdldFJlZmVyZW5jZWRFbGVtZW50KCkgPT0gRFRERWxlbWVudEltcGwudGhpcykgewotCQkJCQlyZXN1bHQuYWRkKGVsZW1lbnRSZWZlcmVuY2VDb250ZW50KTsKLQkJCQl9IC8vIGVuZCBvZiBpZiAoKQotCQkJfQotCQl9OwotCQl2aXNpdFJlZnMudmlzaXREVERGaWxlKGZpbGUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlRGV0YWlsKCkgewotCQlTdHJpbmcgYXR0cmlidXRlU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJQ29sbGVjdGlvbiBhdHRyaWJ1dGVzID0gZ2V0RFREQXR0cmlidXRlKCk7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gc2Vlbk9uZSA9IGZhbHNlOwotCQkJZm9yIChqYXZhLnV0aWwuSXRlcmF0b3IgaSA9IGF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJaWYgKHNlZW5PbmUpIHsKLQkJCQkJYXR0cmlidXRlU3RyaW5nID0gYXR0cmlidXRlU3RyaW5nICsgIiwgIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc2Vlbk9uZSA9IHRydWU7Ci0JCQkJfSAvLyBlbmQgb2YgZWxzZQotCi0JCQkJYXR0cmlidXRlU3RyaW5nID0gYXR0cmlidXRlU3RyaW5nICsgKChEVERBdHRyaWJ1dGUpIGkubmV4dCgpKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0JCXJldHVybiBhdHRyaWJ1dGVTdHJpbmc7Ci0JfQotCi0KLQkvLyB1Z2x5IGhhY2sgZm9yIG5vdyBzaW5jZSB3ZSBkb24ndCBoYXZlIG11bHRpcGxlIGluaGVyaXRhbmNlLgotCS8vIFdvdWxkIHJhdGhlciBoYXZlIGFsbCB0aGlzIHN0dWZmIGluIGEgYmFzZSBjbGFzcyBidXQgdGhlc2UKLQkvLyBjbGFzc2VzIGFyZSBpbmhlcml0aW5nIGZyb20gc29tZXRpbWVzIGRpZmZlcmVudCBtb2YgY2xhc3NlcwotCURURExleGljYWxJbmZvIGxleEluZm8gPSBuZXcgRFRETGV4aWNhbEluZm8oKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbW1lbnQgPSBDT01NRU5UX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBEVERFbGVtZW50Q29udGVudCBjb250ZW50ID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZHRkQXR0cmlidXRlID0gbnVsbDsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gbGV4SW5mby5nZXRTdGFydE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgdikgewotCQlsZXhJbmZvLnNldFN0YXJ0T2Zmc2V0KHYpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gbGV4SW5mby5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRFbmRPZmZzZXQodik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIG5ld0NvbW1lbnQpIHsKLQkJU3RyaW5nIG9sZENvbW1lbnQgPSBjb21tZW50OwotCQljb21tZW50ID0gbmV3Q29tbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09NTUVOVCwgb2xkQ29tbWVudCwgY29tbWVudCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIERUREVsZW1lbnRDb250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb250ZW50KERUREVsZW1lbnRDb250ZW50IG5ld0NvbnRlbnQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRFRERWxlbWVudENvbnRlbnQgb2xkQ29udGVudCA9IGNvbnRlbnQ7Ci0JCWNvbnRlbnQgPSBuZXdDb250ZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5ldyBOb3RpZmljYXRpb25DaGFpbkltcGwoNCk7Ci0JCQltc2dzLmFkZChuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgb2xkQ29udGVudCwgbmV3Q29udGVudCkpOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnQoRFRERWxlbWVudENvbnRlbnQgbmV3Q29udGVudCkgewotCQlpZiAobmV3Q29udGVudCAhPSBjb250ZW50KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBjb250ZW50KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQsIERUREVsZW1lbnRDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdDb250ZW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdDb250ZW50KS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQsIERUREVsZW1lbnRDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvbnRlbnQobmV3Q29udGVudCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQsIG5ld0NvbnRlbnQsIG5ld0NvbnRlbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREVERBdHRyaWJ1dGUoKSB7Ci0JCWlmIChkdGRBdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJZHRkQXR0cmlidXRlID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoRFREQXR0cmlidXRlLmNsYXNzLCB0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfQVRUUklCVVRFLCBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5UKTsKLQkJfQotCQlyZXR1cm4gZHRkQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FUEFDS0FHRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVBBQ0tBR0UsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRU9QRVJBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFT3BlcmF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCA6Ci0JCQkJCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGNvbnRlbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5ULCBudWxsLCBtc2dzKTsKLQkJCQkJcmV0dXJuIGJhc2ljU2V0Q29udGVudCgoRFRERWxlbWVudENvbnRlbnQpIG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9BVFRSSUJVVEUgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXREVERBdHRyaWJ1dGUoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFOTk9UQVRJT05TIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VQQUNLQUdFIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FUEFDS0FHRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FT1BFUkFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVPcGVyYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VSRUZFUkVOQ0VTIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RVJlZmVyZW5jZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFUVFJJQlVURVMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFQXR0cmlidXRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCA6Ci0JCQkJCXJldHVybiBiYXNpY1NldENvbnRlbnQobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfQVRUUklCVVRFIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RFREQXR0cmlidXRlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VQQUNLQUdFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19FQ0xBU1NJRklFUlMsIEVQYWNrYWdlLmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQsIERUREZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0SW5zdGFuY2VDbGFzc05hbWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXJldHVybiBnZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RFRkFVTFRfVkFMVUUgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVBBQ0tBR0UgOgotCQkJCXJldHVybiBnZXRFUGFja2FnZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19BQlNUUkFDVCA6Ci0JCQkJcmV0dXJuIGlzQWJzdHJhY3QoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0lOVEVSRkFDRSA6Ci0JCQkJcmV0dXJuIGlzSW50ZXJmYWNlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FU1VQRVJfVFlQRVMgOgotCQkJCXJldHVybiBnZXRFU3VwZXJUeXBlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FT1BFUkFUSU9OUyA6Ci0JCQkJcmV0dXJuIGdldEVPcGVyYXRpb25zKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTExfQVRUUklCVVRFUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTExfUkVGRVJFTkNFUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxSZWZlcmVuY2VzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VSRUZFUkVOQ0VTIDoKLQkJCQlyZXR1cm4gZ2V0RVJlZmVyZW5jZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFUVFJJQlVURVMgOgotCQkJCXJldHVybiBnZXRFQXR0cmlidXRlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX0NPTlRBSU5NRU5UUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxDb250YWlubWVudHMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9PUEVSQVRJT05TIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbE9wZXJhdGlvbnMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX1NVUEVSX1RZUEVTIDoKLQkJCQlyZXR1cm4gZ2V0RUFsbFN1cGVyVHlwZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUlEX0FUVFJJQlVURSA6Ci0JCQkJcmV0dXJuIGdldEVJREF0dHJpYnV0ZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSA6Ci0JCQkJcmV0dXJuIGdldERUREZpbGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09NTUVOVCA6Ci0JCQkJcmV0dXJuIGdldENvbW1lbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0FUVFJJQlVURSA6Ci0JCQkJcmV0dXJuIGdldERUREF0dHJpYnV0ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFOTk9UQVRJT05TIDoKLQkJCQlyZXR1cm4gZUFubm90YXRpb25zICE9IG51bGwgJiYgIWdldEVBbm5vdGF0aW9ucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fTkFNRSA6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJcmV0dXJuIElOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGluc3RhbmNlQ2xhc3NOYW1lICE9IG51bGwgOiAhSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVC5lcXVhbHMoaW5zdGFuY2VDbGFzc05hbWUpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJcmV0dXJuIElOU1RBTkNFX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBpbnN0YW5jZUNsYXNzICE9IG51bGwgOiAhSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGluc3RhbmNlQ2xhc3MpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19ERUZBVUxUX1ZBTFVFIDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVBBQ0tBR0UgOgotCQkJCXJldHVybiBnZXRFUGFja2FnZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0FCU1RSQUNUIDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBBQlNUUkFDVF9FRkxBRykgIT0gMCkgIT0gQUJTVFJBQ1RfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0lOVEVSRkFDRSA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgSU5URVJGQUNFX0VGTEFHKSAhPSAwKSAhPSBJTlRFUkZBQ0VfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VTVVBFUl9UWVBFUyA6Ci0JCQkJcmV0dXJuIGVTdXBlclR5cGVzICE9IG51bGwgJiYgIWdldEVTdXBlclR5cGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FT1BFUkFUSU9OUyA6Ci0JCQkJcmV0dXJuIGVPcGVyYXRpb25zICE9IG51bGwgJiYgIWdldEVPcGVyYXRpb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX0FUVFJJQlVURVMgOgotCQkJCXJldHVybiAhZ2V0RUFsbEF0dHJpYnV0ZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTExfUkVGRVJFTkNFUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsUmVmZXJlbmNlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVJFRkVSRU5DRVMgOgotCQkJCXJldHVybiBlUmVmZXJlbmNlcyAhPSBudWxsICYmICFnZXRFUmVmZXJlbmNlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFUVFJJQlVURVMgOgotCQkJCXJldHVybiBlQXR0cmlidXRlcyAhPSBudWxsICYmICFnZXRFQXR0cmlidXRlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9DT05UQUlOTUVOVFMgOgotCQkJCXJldHVybiAhZ2V0RUFsbENvbnRhaW5tZW50cygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9PUEVSQVRJT05TIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxPcGVyYXRpb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVMgOgotCQkJCXJldHVybiAhZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9TVVBFUl9UWVBFUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsU3VwZXJUeXBlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUlEX0FUVFJJQlVURSA6Ci0JCQkJcmV0dXJuIGdldEVJREF0dHJpYnV0ZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTU1FTlQgOgotCQkJCXJldHVybiBDT01NRU5UX0VERUZBVUxUID09IG51bGwgPyBjb21tZW50ICE9IG51bGwgOiAhQ09NTUVOVF9FREVGQVVMVC5lcXVhbHMoY29tbWVudCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQgOgotCQkJCXJldHVybiBjb250ZW50ICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9BVFRSSUJVVEUgOgotCQkJCXJldHVybiBkdGRBdHRyaWJ1dGUgIT0gbnVsbCAmJiAhZ2V0RFREQXR0cmlidXRlKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IERURENvbnRlbnQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEU7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBEVERDb250ZW50LmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNvbW1lbnQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoY29tbWVudCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX05BTUUgOgotCQkJCXNldE5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzc05hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXNldEluc3RhbmNlQ2xhc3MoKENsYXNzKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19BQlNUUkFDVCA6Ci0JCQkJc2V0QWJzdHJhY3QoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5URVJGQUNFIDoKLQkJCQlzZXRJbnRlcmZhY2UoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVNVUEVSX1RZUEVTIDoKLQkJCQlnZXRFU3VwZXJUeXBlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RVN1cGVyVHlwZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VPUEVSQVRJT05TIDoKLQkJCQlnZXRFT3BlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RU9wZXJhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VSRUZFUkVOQ0VTIDoKLQkJCQlnZXRFUmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RVJlZmVyZW5jZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBVFRSSUJVVEVTIDoKLQkJCQlnZXRFQXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUF0dHJpYnV0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT01NRU5UIDoKLQkJCQlzZXRDb21tZW50KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQgOgotCQkJCXNldENvbnRlbnQoKERUREVsZW1lbnRDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfQVRUUklCVVRFIDoKLQkJCQlnZXREVERBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCWdldERUREF0dHJpYnV0ZSgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX05BTUUgOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzTmFtZShJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0lOU1RBTkNFX0NMQVNTIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzKElOU1RBTkNFX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0FCU1RSQUNUIDoKLQkJCQlzZXRBYnN0cmFjdChBQlNUUkFDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlRFUkZBQ0UgOgotCQkJCXNldEludGVyZmFjZShJTlRFUkZBQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVNVUEVSX1RZUEVTIDoKLQkJCQlnZXRFU3VwZXJUeXBlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FT1BFUkFUSU9OUyA6Ci0JCQkJZ2V0RU9wZXJhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVJFRkVSRU5DRVMgOgotCQkJCWdldEVSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBVFRSSUJVVEVTIDoKLQkJCQlnZXRFQXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT01NRU5UIDoKLQkJCQlzZXRDb21tZW50KENPTU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCA6Ci0JCQkJc2V0Q29udGVudCgoRFRERWxlbWVudENvbnRlbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0FUVFJJQlVURSA6Ci0JCQkJZ2V0RFREQXR0cmlidXRlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChEVERGaWxlKSBlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERUREZpbGUoRFRERmlsZSBuZXdEVERGaWxlKSB7Ci0JCWlmIChuZXdEVERGaWxlICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUgJiYgbmV3RFRERmlsZSAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0RUREZpbGUpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdEVERGaWxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdEVERGaWxlKS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCwgRFRERmlsZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0RUREZpbGUsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUsIG5ld0RUREZpbGUsIG5ld0RUREZpbGUpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JkOTkzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50SW1wbCBleHRlbmRzIERURFJlcGVhdGFibGVDb250ZW50SW1wbCBpbXBsZW1lbnRzIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBEVERFbGVtZW50IHJlZmVyZW5jZWRFbGVtZW50ID0gbnVsbDsKLQotCXB1YmxpYyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpIHsKLQkJcmV0dXJuIGdldENvbnRlbnROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50TmFtZSgpIHsKLQkJRFRERWxlbWVudCBlID0gZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKTsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRFRERWxlbWVudCBnZXRSZWZlcmVuY2VkRWxlbWVudCgpIHsKLQkJaWYgKHJlZmVyZW5jZWRFbGVtZW50ICE9IG51bGwgJiYgcmVmZXJlbmNlZEVsZW1lbnQuZUlzUHJveHkoKSkgewotCQkJRFRERWxlbWVudCBvbGRSZWZlcmVuY2VkRWxlbWVudCA9IHJlZmVyZW5jZWRFbGVtZW50OwotCQkJcmVmZXJlbmNlZEVsZW1lbnQgPSAoRFRERWxlbWVudCkgRWNvcmVVdGlsLnJlc29sdmUocmVmZXJlbmNlZEVsZW1lbnQsIHRoaXMpOwotCQkJaWYgKHJlZmVyZW5jZWRFbGVtZW50ICE9IG9sZFJlZmVyZW5jZWRFbGVtZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fUkVGRVJFTkNFRF9FTEVNRU5ULCBvbGRSZWZlcmVuY2VkRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlZEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbGVtZW50IGJhc2ljR2V0UmVmZXJlbmNlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiByZWZlcmVuY2VkRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkRWxlbWVudChEVERFbGVtZW50IG5ld1JlZmVyZW5jZWRFbGVtZW50KSB7Ci0JCURUREVsZW1lbnQgb2xkUmVmZXJlbmNlZEVsZW1lbnQgPSByZWZlcmVuY2VkRWxlbWVudDsKLQkJcmVmZXJlbmNlZEVsZW1lbnQgPSBuZXdSZWZlcmVuY2VkRWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fUkVGRVJFTkNFRF9FTEVNRU5ULCBvbGRSZWZlcmVuY2VkRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQsIERUREdyb3VwQ29udGVudC5jbGFzcywgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlyZXR1cm4gZ2V0T2NjdXJyZW5jZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19SRUZFUkVOQ0VEX0VMRU1FTlQgOgotCQkJCWlmIChyZXNvbHZlKQotCQkJCQlyZXR1cm4gZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRSZWZlcmVuY2VkRWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJcmV0dXJuIG9jY3VycmVuY2UgIT0gT0NDVVJSRU5DRV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fUkVGRVJFTkNFRF9FTEVNRU5UIDoKLQkJCQlyZXR1cm4gcmVmZXJlbmNlZEVsZW1lbnQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXNldE9jY3VycmVuY2UoKERURE9jY3VycmVuY2VUeXBlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19SRUZFUkVOQ0VEX0VMRU1FTlQgOgotCQkJCXNldFJlZmVyZW5jZWRFbGVtZW50KChEVERFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlzZXRPY2N1cnJlbmNlKE9DQ1VSUkVOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fUkVGRVJFTkNFRF9FTEVNRU5UIDoKLQkJCQlzZXRSZWZlcmVuY2VkRWxlbWVudCgoRFRERWxlbWVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVtcHR5Q29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbXB0eUNvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ODljNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVtcHR5Q29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREVtcHR5Q29udGVudEltcGwgZXh0ZW5kcyBEVERFbGVtZW50Q29udGVudEltcGwgaW1wbGVtZW50cyBEVERFbXB0eUNvbnRlbnQgewotCi0JcHVibGljIERUREVtcHR5Q29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW1wdHlDb250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5ULCBEVERHcm91cENvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQsIERUREVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudE5hbWUoKSB7Ci0JCXJldHVybiAiRU1QVFkiOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW50aXR5Q29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnRpdHlDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjE3ZDMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnRpdHlDb250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUGF0aG5hbWVVdGlsOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERUREVudGl0eUNvbnRlbnRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBEVERFbnRpdHlDb250ZW50IHsKLQotCXB1YmxpYyBEVERFbnRpdHlDb250ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlDb250ZW50KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJcmV0dXJuIERURFBhdGhuYW1lVXRpbC5tYWtlUGF0aChnZXREVERFbnRpdHkoKS5nZXRQYXRobmFtZSgpLCAiQ29udGVudCIsIG51bGwsIC0xKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIERUREVudGl0eSBnZXREVERFbnRpdHkoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRFRERW50aXR5KSBlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERUREVudGl0eShEVERFbnRpdHkgbmV3RFRERW50aXR5KSB7Ci0JCWlmIChuZXdEVERFbnRpdHkgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSAmJiBuZXdEVERFbnRpdHkgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdEVERFbnRpdHkpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdEVERFbnRpdHkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0RUREVudGl0eSkuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5ULCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdEVERFbnRpdHksIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFksIG5ld0RUREVudGl0eSwgbmV3RFRERW50aXR5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFkgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGdldERUREVudGl0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFkgOgotCQkJCXJldHVybiBnZXREVERFbnRpdHkoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSA6Ci0JCQkJc2V0RFRERW50aXR5KChEVERFbnRpdHkpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSA6Ci0JCQkJc2V0RFRERW50aXR5KChEVERFbnRpdHkpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRFRERW50aXR5Q29udGVudCN1bnBhcnNlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudGl0eUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnRpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZjc5NjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudGl0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25DaGFpbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURExleGljYWxJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUGF0aG5hbWVVdGlsOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUltcGwjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlJbXBsI2lzUGFyYW1ldGVyRW50aXR5IDxlbT5QYXJhbWV0ZXIgRW50aXR5PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUltcGwjZ2V0Q29udGVudCA8ZW0+Q29udGVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlJbXBsI2dldFBhcm1FbnRpdHlSZWYgPGVtPlBhcm0gRW50aXR5IFJlZjwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlJbXBsI2dldEVudGl0eVJlZmVyZW5jZSA8ZW0+RW50aXR5IFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlJbXBsI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlJbXBsI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UgPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERFbnRpdHlJbXBsIGV4dGVuZHMgRFREQ29udGVudEltcGwgaW1wbGVtZW50cyBEVERFbnRpdHksIEVOYW1lZEVsZW1lbnQsIERURENvbnRlbnQgewotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJcmV0dXJuIERURFBhdGhuYW1lVXRpbC5tYWtlUGF0aChudWxsLCAiRW50IiwgZ2V0TmFtZSgpLCAtMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCXB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IERURFBhdGhuYW1lVXRpbC5wYXJzZVBhdGhDb21wb25lbnQocmVsYXRpdmVQYXRoKTsKLQotCi0JCVN0cmluZyB0eXBlID0gKFN0cmluZykgcmVzdWx0WzBdOwotCi0KLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0KLQkJRFRET2JqZWN0IG9iaiA9IG51bGw7Ci0JCWlmICh0eXBlLmVxdWFscygiQ29udGVudCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCW9iaiA9IGdldENvbnRlbnQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQotCQlTdHJpbmcgcmVzdFBhdGggPSAoU3RyaW5nKSByZXN1bHRbM107Ci0KLQkJaWYgKChyZXN0UGF0aCA9PSBudWxsKSB8fCAob2JqID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gb2JqOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG9iai5maW5kT2JqZWN0KHJlc3RQYXRoKTsKLQkJfQotCX0KLQotCi0JLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLQkvLyBXb3VsZCByYXRoZXIgaGF2ZSBhbGwgdGhpcyBzdHVmZiBpbiBhIGJhc2UgY2xhc3MgYnV0IHRoZXNlCi0JLy8gY2xhc3NlcyBhcmUgaW5oZXJpdGluZyBmcm9tIHNvbWV0aW1lcyBkaWZmZXJlbnQgbW9mIGNsYXNzZXMKLQlEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRTdGFydE9mZnNldCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0RW5kT2Zmc2V0KHYpOwotCX0KLQotCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tbWVudCgpIDxlbT5Db21tZW50PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21tZW50KCkgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbW1lbnQgPSBDT01NRU5UX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUGFyYW1ldGVyRW50aXR5KCkgPGVtPlBhcmFtZXRlciBFbnRpdHk8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNpc1BhcmFtZXRlckVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBBUkFNRVRFUl9FTlRJVFlfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUGFyYW1ldGVyRW50aXR5KCkgPGVtPlBhcmFtZXRlciBFbnRpdHk8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNpc1BhcmFtZXRlckVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcGFyYW1ldGVyRW50aXR5ID0gUEFSQU1FVEVSX0VOVElUWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRlbnQoKSA8ZW0+Q29udGVudDwvZW0+fScKLQkgKiBjb250YWlubWVudCByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEVERFbnRpdHlDb250ZW50IGNvbnRlbnQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFybUVudGl0eVJlZigpIDxlbT5QYXJtIEVudGl0eSBSZWY8L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRQYXJtRW50aXR5UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRpdHlSZWYgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW50aXR5UmVmZXJlbmNlKCkgPGVtPkVudGl0eSBSZWZlcmVuY2U8L2VtPn0nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEVudGl0eVJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGVudGl0eVJlZmVyZW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZTwvZW0+fScKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2U8L2VtPn0nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFRERW50aXR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgewotCQlyZXR1cm4gY29tbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgbmV3Q29tbWVudCkgewotCQlTdHJpbmcgb2xkQ29tbWVudCA9IGNvbW1lbnQ7Ci0JCWNvbW1lbnQgPSBuZXdDb21tZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQsIG9sZENvbW1lbnQsIGNvbW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJFbnRpdHkoKSB7Ci0JCXJldHVybiBwYXJhbWV0ZXJFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmFtZXRlckVudGl0eShib29sZWFuIG5ld1BhcmFtZXRlckVudGl0eSkgewotCQlib29sZWFuIG9sZFBhcmFtZXRlckVudGl0eSA9IHBhcmFtZXRlckVudGl0eTsKLQkJcGFyYW1ldGVyRW50aXR5ID0gbmV3UGFyYW1ldGVyRW50aXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFksIG9sZFBhcmFtZXRlckVudGl0eSwgcGFyYW1ldGVyRW50aXR5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbnRpdHlDb250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb250ZW50KERUREVudGl0eUNvbnRlbnQgbmV3Q29udGVudCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEVERFbnRpdHlDb250ZW50IG9sZENvbnRlbnQgPSBjb250ZW50OwotCQljb250ZW50ID0gbmV3Q29udGVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBuZXcgTm90aWZpY2F0aW9uQ2hhaW5JbXBsKDQpOwotCQkJbXNncy5hZGQobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCwgb2xkQ29udGVudCwgbmV3Q29udGVudCkpOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50KERUREVudGl0eUNvbnRlbnQgbmV3Q29udGVudCkgewotCQlpZiAobmV3Q29udGVudCAhPSBjb250ZW50KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBjb250ZW50KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSwgRFRERW50aXR5Q29udGVudC5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3Q29udGVudCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3Q29udGVudCkuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFksIERUREVudGl0eUNvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29udGVudChuZXdDb250ZW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5ULCBuZXdDb250ZW50LCBuZXdDb250ZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgZ2V0UGFybUVudGl0eVJlZigpIHsKLQkJaWYgKHBhcm1FbnRpdHlSZWYgIT0gbnVsbCAmJiBwYXJtRW50aXR5UmVmLmVJc1Byb3h5KCkpIHsKLQkJCURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBvbGRQYXJtRW50aXR5UmVmID0gcGFybUVudGl0eVJlZjsKLQkJCXBhcm1FbnRpdHlSZWYgPSAoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSBFY29yZVV0aWwucmVzb2x2ZShwYXJtRW50aXR5UmVmLCB0aGlzKTsKLQkJCWlmIChwYXJtRW50aXR5UmVmICE9IG9sZFBhcm1FbnRpdHlSZWYpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiwgb2xkUGFybUVudGl0eVJlZiwgcGFybUVudGl0eVJlZikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXJtRW50aXR5UmVmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGJhc2ljR2V0UGFybUVudGl0eVJlZigpIHsKLQkJcmV0dXJuIHBhcm1FbnRpdHlSZWY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBhcm1FbnRpdHlSZWYoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIG5ld1Bhcm1FbnRpdHlSZWYsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIG9sZFBhcm1FbnRpdHlSZWYgPSBwYXJtRW50aXR5UmVmOwotCQlwYXJtRW50aXR5UmVmID0gbmV3UGFybUVudGl0eVJlZjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBuZXcgTm90aWZpY2F0aW9uQ2hhaW5JbXBsKDQpOwotCQkJbXNncy5hZGQobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGLCBvbGRQYXJtRW50aXR5UmVmLCBuZXdQYXJtRW50aXR5UmVmKSk7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcm1FbnRpdHlSZWYoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIG5ld1Bhcm1FbnRpdHlSZWYpIHsKLQkJaWYgKG5ld1Bhcm1FbnRpdHlSZWYgIT0gcGFybUVudGl0eVJlZikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocGFybUVudGl0eVJlZiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgcGFybUVudGl0eVJlZikuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSwgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdQYXJtRW50aXR5UmVmICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQYXJtRW50aXR5UmVmKS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZLCBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UGFybUVudGl0eVJlZihuZXdQYXJtRW50aXR5UmVmLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYsIG5ld1Bhcm1FbnRpdHlSZWYsIG5ld1Bhcm1FbnRpdHlSZWYpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVudGl0eVJlZmVyZW5jZSgpIHsKLQkJaWYgKGVudGl0eVJlZmVyZW5jZSA9PSBudWxsKSB7Ci0JCQllbnRpdHlSZWZlcmVuY2UgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3QoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudC5jbGFzcywgdGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlRfUkVGRVJFTkNFRF9FTlRJVFkpOwotCQl9Ci0JCXJldHVybiBlbnRpdHlSZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkgewotCQlpZiAoYXR0cmlidXRlTmFtZVJlZmVyZW5jZSA9PSBudWxsKSB7Ci0JCQlhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0KERUREF0dHJpYnV0ZS5jbGFzcywgdGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0UsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFRF9FTlRJVFkpOwotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpIHsKLQkJaWYgKGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UgPT0gbnVsbCkgewotCQkJYXR0cmlidXRlVHlwZVJlZmVyZW5jZSA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdChEVERBdHRyaWJ1dGUuY2xhc3MsIHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFLCBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRURfRU5USVRZKTsKLQkJfQotCQlyZXR1cm4gYXR0cmlidXRlVHlwZVJlZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCA6Ci0JCQkJCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGNvbnRlbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQsIG51bGwsIG1zZ3MpOwotCQkJCQlyZXR1cm4gYmFzaWNTZXRDb250ZW50KChEVERFbnRpdHlDb250ZW50KSBvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiA6Ci0JCQkJCWlmIChwYXJtRW50aXR5UmVmICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHBhcm1FbnRpdHlSZWYpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFksIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5jbGFzcywgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldFBhcm1FbnRpdHlSZWYoKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgb3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RW50aXR5UmVmZXJlbmNlKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQgOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRDb250ZW50KG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYgOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRQYXJtRW50aXR5UmVmKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RW50aXR5UmVmZXJlbmNlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5ULCBEVERGaWxlLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQgOgotCQkJCXJldHVybiBnZXRDb21tZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGlzUGFyYW1ldGVyRW50aXR5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQgOgotCQkJCXJldHVybiBnZXRDb250ZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGIDoKLQkJCQlpZiAocmVzb2x2ZSkKLQkJCQkJcmV0dXJuIGdldFBhcm1FbnRpdHlSZWYoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRQYXJtRW50aXR5UmVmKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRSA6Ci0JCQkJcmV0dXJuIGdldEVudGl0eVJlZmVyZW5jZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRSA6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0UgOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UIDoKLQkJCQlzZXRDb21tZW50KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWSA6Ci0JCQkJc2V0UGFyYW1ldGVyRW50aXR5KCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCA6Ci0JCQkJc2V0Q29udGVudCgoRFRERW50aXR5Q29udGVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYgOgotCQkJCXNldFBhcm1FbnRpdHlSZWYoKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFIDoKLQkJCQlnZXRFbnRpdHlSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJCWdldEVudGl0eVJlZmVyZW5jZSgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0UgOgotCQkJCWdldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJCWdldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFIDoKLQkJCQlnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCQlnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UIDoKLQkJCQlzZXRDb21tZW50KENPTU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZIDoKLQkJCQlzZXRQYXJhbWV0ZXJFbnRpdHkoUEFSQU1FVEVSX0VOVElUWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQgOgotCQkJCXNldENvbnRlbnQoKERUREVudGl0eUNvbnRlbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYgOgotCQkJCXNldFBhcm1FbnRpdHlSZWYoKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UgOgotCQkJCWdldEVudGl0eVJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRSA6Ci0JCQkJZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSA6Ci0JCQkJZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09NTUVOVCA6Ci0JCQkJcmV0dXJuIENPTU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGNvbW1lbnQgIT0gbnVsbCA6ICFDT01NRU5UX0VERUZBVUxULmVxdWFscyhjb21tZW50KTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZIDoKLQkJCQlyZXR1cm4gcGFyYW1ldGVyRW50aXR5ICE9IFBBUkFNRVRFUl9FTlRJVFlfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGNvbnRlbnQgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYgOgotCQkJCXJldHVybiBwYXJtRW50aXR5UmVmICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRSA6Ci0JCQkJcmV0dXJuIGVudGl0eVJlZmVyZW5jZSAhPSBudWxsICYmICFnZXRFbnRpdHlSZWZlcmVuY2UoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFIDoKLQkJCQlyZXR1cm4gYXR0cmlidXRlTmFtZVJlZmVyZW5jZSAhPSBudWxsICYmICFnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSA6Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UgIT0gbnVsbCAmJiAhZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29tbWVudDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjb21tZW50KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJhbWV0ZXJFbnRpdHk6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocGFyYW1ldGVyRW50aXR5KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIERUREVudGl0eUltcGwKLQotLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotLy8KLQotLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotLy8gLy9wdWJsaWMgY2xhc3MgRFRERW50aXR5SW1wbCBleHRlbmRzIEVOYW1lc3BhY2VJbXBsIGltcGxlbWVudHMgRFRERW50aXR5LAotLy8gRU5hbWVzcGFjZSwgRFREQ29udGVudHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUklDUlVMRVMuSlNFRC0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgU3RyaW5nIGNvbW1lbnQgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBCb29sZWFuIHBhcmFtZXRlckVudGl0eSA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIERUREVudGl0eUNvbnRlbnQgY29udGVudCA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5UmVmID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRUxpc3QgZW50aXR5UmVmZXJlbmNlID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRUxpc3QgYXR0cmlidXRlTmFtZVJlZmVyZW5jZSA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIEVMaXN0IGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBib29sZWFuIHNldENvbW1lbnQgPSBmYWxzZTsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgYm9vbGVhbiBzZXRQYXJhbWV0ZXJFbnRpdHkgPSBmYWxzZTsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgYm9vbGVhbiBzZXRDb250ZW50ID0gZmFsc2U7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2V0UGFybUVudGl0eVJlZiA9IGZhbHNlOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByaXZhdGUgRFREQ29udGVudEltcGwgZHRkQ29udGVudERlbGVnYXRlID0gbnVsbDsKLQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBFT2JqZWN0IGluaXRJbnN0YW5jZSgpIHsKLS8vIHNldEVNZXRhT2JqKGVDbGFzc0RUREVudGl0eSgpKTsKLS8vIGluaXRJbnN0YW5jZURlbGVnYXRlcygpOwotLy8gcmV0dXJuIHRoaXM7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIHZvaWQgaW5pdEluc3RhbmNlRGVsZWdhdGVzKCkgewotLy8gc3VwZXIuaW5pdEluc3RhbmNlRGVsZWdhdGVzKCk7Ci0vLwotLy8gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkucmVmU2V0RGVsZWdhdGVPd25lcih0aGlzKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRFREUGFja2FnZSBlUGFja2FnZURURCgpIHsKLS8vIHJldHVybgotLy8gKERURFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRFREUGFja2FnZS5lTlNfVVJJKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRUNsYXNzIGVDbGFzc0RUREVudGl0eSgpIHsKLS8vIHJldHVybgotLy8gKChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSkpLmdldERUREVudGl0eSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgewotLy8gaWYgKHRoaXMuc2V0Q29tbWVudCkgcmV0dXJuIHRoaXMuY29tbWVudDsKLS8vIGVsc2UgcmV0dXJuCi0vLyAoU3RyaW5nKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9Db21tZW50KCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgdmFsdWUpIHsKLS8vIHJlZlNldFZhbHVlRm9yU2ltcGxlU0YoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0NvbW1lbnQoKSx0aGlzLmNvbW1lbnQsdmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0Q29tbWVudCgpIHsKLS8vIGVOb3RpZnkocmVmQmFzaWNVbnNldFZhbHVlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9Db21tZW50KCkpKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldENvbW1lbnQoKSB7Ci0vLyByZXR1cm4gc2V0Q29tbWVudDsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBCb29sZWFuIGdldFBhcmFtZXRlckVudGl0eSgpIHsKLS8vIGlmICh0aGlzLnNldFBhcmFtZXRlckVudGl0eSkgcmV0dXJuIHRoaXMucGFyYW1ldGVyRW50aXR5OwotLy8gZWxzZSByZXR1cm4KLS8vIChCb29sZWFuKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJhbWV0ZXJFbnRpdHkoKS5nZXREZWZhdWx0VmFsdWUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyRW50aXR5KCkgewotLy8gQm9vbGVhbiByZXN1bHQgPSBnZXRQYXJhbWV0ZXJFbnRpdHkoKTsKLS8vIHJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdC5ib29sZWFuVmFsdWUoKSA6IGZhbHNlOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlckVudGl0eShCb29sZWFuIHZhbHVlKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNpbXBsZVNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJhbWV0ZXJFbnRpdHkoKSx0aGlzLnBhcmFtZXRlckVudGl0eSx2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyRW50aXR5KGJvb2xlYW4gdmFsdWUpIHsKLS8vIHNldFBhcmFtZXRlckVudGl0eSh2YWx1ZT9Cb29sZWFuLlRSVUU6Qm9vbGVhbi5GQUxTRSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXRQYXJhbWV0ZXJFbnRpdHkoKSB7Ci0vLyBlTm90aWZ5KHJlZkJhc2ljVW5zZXRWYWx1ZShEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfUGFyYW1ldGVyRW50aXR5KCkpKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldFBhcmFtZXRlckVudGl0eSgpIHsKLS8vIHJldHVybiBzZXRQYXJhbWV0ZXJFbnRpdHk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgRFRERW50aXR5Q29udGVudCBnZXRDb250ZW50KCkgewotLy8gdHJ5IHsKLS8vIGlmICh0aGlzLmNvbnRlbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0vLyB0aGlzLmNvbnRlbnQgPSAoRFRERW50aXR5Q29udGVudCkKLS8vICgoSW50ZXJuYWxFT2JqZWN0KXRoaXMuY29udGVudCkucmVzb2x2ZSh0aGlzKTsKLS8vIGlmICh0aGlzLmNvbnRlbnQ9PW51bGwpIHRoaXMuc2V0Q29udGVudCA9IGZhbHNlOwotLy8gcmV0dXJuIHRoaXMuY29udGVudDsKLS8vIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gbnVsbDsKLS8vIH0KLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXRDb250ZW50KERUREVudGl0eUNvbnRlbnQgbCkgewotLy8gcmVmU2V0VmFsdWVGb3JSZWZPYmplY3RTRihEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQ29udGVudCgpLHRoaXMuY29udGVudCxsKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldENvbnRlbnQoKSB7Ci0vLyByZWZVbnNldFZhbHVlRm9yUmVmT2JqZWN0U0YoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0NvbnRlbnQoKSx0aGlzLmNvbnRlbnQpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0Q29udGVudCgpIHsKLS8vIHJldHVybiBzZXRDb250ZW50OwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBnZXRQYXJtRW50aXR5UmVmKCkgewotLy8gdHJ5IHsKLS8vIGlmICh0aGlzLnBhcm1FbnRpdHlSZWYgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0vLyB0aGlzLnBhcm1FbnRpdHlSZWYgPSAoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKQotLy8gKChJbnRlcm5hbEVPYmplY3QpdGhpcy5wYXJtRW50aXR5UmVmKS5yZXNvbHZlKHRoaXMsCi0vLyBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfUGFybUVudGl0eVJlZigpKTsKLS8vIGlmICh0aGlzLnBhcm1FbnRpdHlSZWY9PW51bGwpIHRoaXMuc2V0UGFybUVudGl0eVJlZiA9IGZhbHNlOwotLy8gcmV0dXJuIHRoaXMucGFybUVudGl0eVJlZjsKLS8vIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gbnVsbDsKLS8vIH0KLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXRQYXJtRW50aXR5UmVmKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBsKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNWUmVmZXJlbmNlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJtRW50aXR5UmVmKCksdGhpcy5wYXJtRW50aXR5UmVmLGwpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0UGFybUVudGl0eVJlZigpIHsKLS8vIHJlZlVuc2V0VmFsdWVGb3JTVlJlZmVyZW5jZShEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfUGFybUVudGl0eVJlZigpLHRoaXMucGFybUVudGl0eVJlZik7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNTZXRQYXJtRW50aXR5UmVmKCkgewotLy8gcmV0dXJuIHNldFBhcm1FbnRpdHlSZWY7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgRUxpc3QgZ2V0RW50aXR5UmVmZXJlbmNlKCkgewotLy8gaWYgKHRoaXMuZW50aXR5UmVmZXJlbmNlPT1udWxsKSB7Ci0vLyB0aGlzLmVudGl0eVJlZmVyZW5jZT1uZXdDb2xsZWN0aW9uKHRoaXMsRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0VudGl0eVJlZmVyZW5jZSgpLAotLy8gdHJ1ZSk7Ci0vLyB9Ci0vLyByZXR1cm4gdGhpcy5lbnRpdHlSZWZlcmVuY2U7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgRUxpc3QgZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpIHsKLS8vIGlmICh0aGlzLmF0dHJpYnV0ZU5hbWVSZWZlcmVuY2U9PW51bGwpIHsKLS8vIHRoaXMuYXR0cmlidXRlTmFtZVJlZmVyZW5jZT1uZXdDb2xsZWN0aW9uKHRoaXMsRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKSwKLS8vIHRydWUpOwotLy8gfQotLy8gcmV0dXJuIHRoaXMuYXR0cmlidXRlTmFtZVJlZmVyZW5jZTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBFTGlzdCBnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkgewotLy8gaWYgKHRoaXMuYXR0cmlidXRlVHlwZVJlZmVyZW5jZT09bnVsbCkgewotLy8gdGhpcy5hdHRyaWJ1dGVUeXBlUmVmZXJlbmNlPW5ld0NvbGxlY3Rpb24odGhpcyxEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpLAotLy8gdHJ1ZSk7Ci0vLyB9Ci0vLyByZXR1cm4gdGhpcy5hdHRyaWJ1dGVUeXBlUmVmZXJlbmNlOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERFbnRpdHkoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQ6IHJldHVybiBnZXRDb21tZW50KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWTogcmV0dXJuIGdldFBhcmFtZXRlckVudGl0eSgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQ6IHJldHVybiBnZXRDb250ZW50KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGOiByZXR1cm4gZ2V0UGFybUVudGl0eVJlZigpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0U6IHJldHVybiBnZXRFbnRpdHlSZWZlcmVuY2UoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0U6IHJldHVybgotLy8gZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRTogcmV0dXJuCi0vLyBnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRFREX0ZJTEU6IHJldHVybiBnZXREVERGaWxlKCk7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE9iamVjdCByZWZCYXNpY1ZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREVudGl0eSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09NTUVOVDoKLS8vIHJldHVybiB0aGlzLnNldENvbW1lbnQ/IHRoaXMuY29tbWVudCA6IG51bGw7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWToKLS8vIHJldHVybiB0aGlzLnNldFBhcmFtZXRlckVudGl0eT8gdGhpcy5wYXJhbWV0ZXJFbnRpdHkgOiBudWxsOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQ6Ci0vLyBpZiAoIXRoaXMuc2V0Q29udGVudHx8dGhpcy5jb250ZW50PT1udWxsKSByZXR1cm4gbnVsbDsKLS8vIGlmICgoKEludGVybmFsRU9iamVjdCl0aGlzLmNvbnRlbnQpLnJlZklzRGVsZXRlZCgpKSB7dGhpcy5jb250ZW50PW51bGw7Ci0vLyB0aGlzLnNldENvbnRlbnQ9ZmFsc2U7fQotLy8gcmV0dXJuIHRoaXMuY29udGVudDsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUY6Ci0vLyBpZiAoIXRoaXMuc2V0UGFybUVudGl0eVJlZnx8dGhpcy5wYXJtRW50aXR5UmVmPT1udWxsKSByZXR1cm4gbnVsbDsKLS8vIGlmICgoKEludGVybmFsRU9iamVjdCl0aGlzLnBhcm1FbnRpdHlSZWYpLnJlZklzRGVsZXRlZCgpKQotLy8ge3RoaXMucGFybUVudGl0eVJlZj1udWxsOyB0aGlzLnNldFBhcm1FbnRpdHlSZWY9ZmFsc2U7fQotLy8gcmV0dXJuIHRoaXMucGFybUVudGl0eVJlZjsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFOgotLy8gcmV0dXJuIHRoaXMuZW50aXR5UmVmZXJlbmNlOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRToKLS8vIHJldHVybiB0aGlzLmF0dHJpYnV0ZU5hbWVSZWZlcmVuY2U7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFOgotLy8gcmV0dXJuIHRoaXMuYXR0cmlidXRlVHlwZVJlZmVyZW5jZTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRTogcmV0dXJuCi0vLyAoKEludGVybmFsRU9iamVjdClnZXREdGRDb250ZW50RGVsZWdhdGUoKSkucmVmQmFzaWNWYWx1ZShmZWF0dXJlKTsKLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERFbnRpdHkoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQ6IHJldHVybiBpc1NldENvbW1lbnQoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZOiByZXR1cm4KLS8vIGlzU2V0UGFyYW1ldGVyRW50aXR5KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVDogcmV0dXJuIGlzU2V0Q29udGVudCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRjogcmV0dXJuIGlzU2V0UGFybUVudGl0eVJlZigpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFOiByZXR1cm4gaXNTZXREVERGaWxlKCk7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyBzdXBlci5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERW50aXR5KCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UOiB7Ci0vLyBzZXRDb21tZW50KChTdHJpbmcpbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFk6IHsKLS8vIHNldFBhcmFtZXRlckVudGl0eSgobmV3VmFsdWUgaW5zdGFuY2VvZgotLy8gU3RyaW5nKT9Cb29sZWFuLnZhbHVlT2YoKFN0cmluZyluZXdWYWx1ZSk6KEJvb2xlYW4pbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQ6IHsKLS8vIHNldENvbnRlbnQoKERUREVudGl0eUNvbnRlbnQpbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRjogewotLy8gc2V0UGFybUVudGl0eVJlZigoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKW5ld1ZhbHVlKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRTogewotLy8gc2V0RFRERmlsZSgoRFRERmlsZSluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLwotLy8gfQotLy8gc3VwZXIuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE5vdGlmaWNhdGlvbiBlQmFzaWNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLS8vIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUJhc2ljU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERW50aXR5KCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmNvbW1lbnQ7Ci0vLyB0aGlzLmNvbW1lbnQgPSAoU3RyaW5nKW5ld1ZhbHVlOwotLy8gdGhpcy5zZXRDb21tZW50ID0gdHJ1ZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0NvbW1lbnQoKSxvbGRWYWx1ZSxuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWTogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5wYXJhbWV0ZXJFbnRpdHk7Ci0vLyB0aGlzLnBhcmFtZXRlckVudGl0eSA9IChCb29sZWFuKW5ld1ZhbHVlOwotLy8gdGhpcy5zZXRQYXJhbWV0ZXJFbnRpdHkgPSB0cnVlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfUGFyYW1ldGVyRW50aXR5KCksb2xkVmFsdWUsbmV3VmFsdWUpOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuY29udGVudDsKLS8vIHRoaXMuY29udGVudCA9IChEVERFbnRpdHlDb250ZW50KW5ld1ZhbHVlOwotLy8gdGhpcy5zZXRDb250ZW50ID0gdHJ1ZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0NvbnRlbnQoKSxvbGRWYWx1ZSxuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLnBhcm1FbnRpdHlSZWY7Ci0vLyB0aGlzLnBhcm1FbnRpdHlSZWYgPSAoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKW5ld1ZhbHVlOwotLy8gdGhpcy5zZXRQYXJtRW50aXR5UmVmID0gdHJ1ZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X1Bhcm1FbnRpdHlSZWYoKSxvbGRWYWx1ZSxuZXdWYWx1ZSk7Ci0vLyB9Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVCYXNpY1NldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gc3VwZXIuZVVuc2V0KGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERFbnRpdHkoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQ6IHsKLS8vIHVuc2V0Q29tbWVudCgpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFk6IHsKLS8vIHVuc2V0UGFyYW1ldGVyRW50aXR5KCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVDogewotLy8gdW5zZXRDb250ZW50KCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGOiB7Ci0vLyB1bnNldFBhcm1FbnRpdHlSZWYoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRTogewotLy8gdW5zZXREVERGaWxlKCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLwotLy8gfQotLy8gc3VwZXIuZVVuc2V0KGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBOb3RpZmljYXRpb24gcmVmQmFzaWNVbnNldFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVW5zZXRWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERW50aXR5KCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmNvbW1lbnQ7Ci0vLyB0aGlzLmNvbW1lbnQgPSBudWxsOwotLy8gdGhpcy5zZXRDb21tZW50ID0gZmFsc2U7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlVOU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0NvbW1lbnQoKSxvbGRWYWx1ZSxnZXRDb21tZW50KCkpOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFk6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMucGFyYW1ldGVyRW50aXR5OwotLy8gdGhpcy5wYXJhbWV0ZXJFbnRpdHkgPSBudWxsOwotLy8gdGhpcy5zZXRQYXJhbWV0ZXJFbnRpdHkgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfUGFyYW1ldGVyRW50aXR5KCksb2xkVmFsdWUsZ2V0UGFyYW1ldGVyRW50aXR5KCkpOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuY29udGVudDsKLS8vIHRoaXMuY29udGVudCA9IG51bGw7Ci0vLyB0aGlzLnNldENvbnRlbnQgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQ29udGVudCgpLG9sZFZhbHVlLG51bGwpOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRjogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5wYXJtRW50aXR5UmVmOwotLy8gdGhpcy5wYXJtRW50aXR5UmVmID0gbnVsbDsKLS8vIHRoaXMuc2V0UGFybUVudGl0eVJlZiA9IGZhbHNlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5VTlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJtRW50aXR5UmVmKCksb2xkVmFsdWUsbnVsbCk7Ci0vLyB9Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVW5zZXRWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRFREQ29udGVudEltcGwgZ2V0RHRkQ29udGVudERlbGVnYXRlKCkgewotLy8gaWYgKGR0ZENvbnRlbnREZWxlZ2F0ZSA9PSBudWxsKSB7Ci0vLyBEVERQYWNrYWdlIHBrZyA9Ci0vLyAoRFREUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEVERQYWNrYWdlLmVOU19VUkkpOwotLy8gZHRkQ29udGVudERlbGVnYXRlPShEVERDb250ZW50SW1wbClwa2cuZUNyZWF0ZUluc3RhbmNlKHBrZy5EVERfQ09OVEVOVCk7Ci0vLyBkdGRDb250ZW50RGVsZWdhdGUuaW5pdEluc3RhbmNlKCk7Ci0vLyB9Ci0vLyByZXR1cm4gZHRkQ29udGVudERlbGVnYXRlOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBFQ2xhc3MgZUNsYXNzRFREQ29udGVudCgpIHsKLS8vIHJldHVybiBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5lQ2xhc3MoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRFRERmlsZSBnZXREVERGaWxlKCkgewotLy8gcmV0dXJuIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLmdldERUREZpbGUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXREVERGaWxlKERUREZpbGUgdmFsdWUpIHsKLS8vIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLnNldERUREZpbGUodmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0RFRERmlsZSgpIHsKLS8vIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLnVuc2V0RFRERmlsZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0RFRERmlsZSgpIHsKLS8vIHJldHVybiBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5pc1NldERUREZpbGUoKTsKLS8vIH0KLS8vIH0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUklDUlVMRVMuSlNFRC0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOTdmZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uQ2hhaW5JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETGV4aWNhbEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50SW1wbCBleHRlbmRzIERURFJlcGVhdGFibGVDb250ZW50SW1wbCBpbXBsZW1lbnRzIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgewotCi0JcHVibGljIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnROYW1lKCkgewotCQlEVERFbnRpdHkgZSA9IGdldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCk7Ci0JCWlmIChlID09IG51bGwpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGUuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZVJlcGVhdGFibGVDb250ZW50KCkgewotCQlEVERFbnRpdHkgZW50aXR5UmVmID0gZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKTsKLQkJaWYgKGVudGl0eVJlZi5pc1BhcmFtZXRlckVudGl0eSgpKSB7Ci0JCQlyZXR1cm4gIiUiICsgZ2V0Q29udGVudE5hbWUoKSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gIiYiICsgZ2V0Q29udGVudE5hbWUoKSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvLyB1Z2x5IGhhY2sgZm9yIG5vdyBzaW5jZSB3ZSBkb24ndCBoYXZlIG11bHRpcGxlIGluaGVyaXRhbmNlLgotCS8vIFdvdWxkIHJhdGhlciBoYXZlIGFsbCB0aGlzIHN0dWZmIGluIGEgYmFzZSBjbGFzcyBidXQgdGhlc2UKLQkvLyBjbGFzc2VzIGFyZSBpbmhlcml0aW5nIGZyb20gc29tZXRpbWVzIGRpZmZlcmVudCBtb2YgY2xhc3NlcwotCURURExleGljYWxJbmZvIGxleEluZm8gPSBuZXcgRFRETGV4aWNhbEluZm8oKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRFRERW50aXR5IGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ID0gbnVsbDsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gbGV4SW5mby5nZXRTdGFydE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgdikgewotCQlsZXhJbmZvLnNldFN0YXJ0T2Zmc2V0KHYpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gbGV4SW5mby5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRFbmRPZmZzZXQodik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGdldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCkgewotCQlpZiAoZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbCAmJiBlbGVtZW50UmVmZXJlbmNlZEVudGl0eS5lSXNQcm94eSgpKSB7Ci0JCQlEVERFbnRpdHkgb2xkRWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgPSBlbGVtZW50UmVmZXJlbmNlZEVudGl0eTsKLQkJCWVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ID0gKERUREVudGl0eSkgRWNvcmVVdGlsLnJlc29sdmUoZWxlbWVudFJlZmVyZW5jZWRFbnRpdHksIHRoaXMpOwotCQkJaWYgKGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ICE9IG9sZEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZLCBvbGRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSwgZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudFJlZmVyZW5jZWRFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbnRpdHkgYmFzaWNHZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJcmV0dXJuIGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eShEVERFbnRpdHkgbmV3RWxlbWVudFJlZmVyZW5jZWRFbnRpdHksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRFRERW50aXR5IG9sZEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ID0gZWxlbWVudFJlZmVyZW5jZWRFbnRpdHk7Ci0JCWVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ID0gbmV3RWxlbWVudFJlZmVyZW5jZWRFbnRpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbmV3IE5vdGlmaWNhdGlvbkNoYWluSW1wbCg0KTsKLQkJCW1zZ3MuYWRkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlRfUkVGRVJFTkNFRF9FTlRJVFksIG9sZEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5LCBuZXdFbGVtZW50UmVmZXJlbmNlZEVudGl0eSkpOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KERUREVudGl0eSBuZXdFbGVtZW50UmVmZXJlbmNlZEVudGl0eSkgewotCQlpZiAobmV3RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgIT0gZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBlbGVtZW50UmVmZXJlbmNlZEVudGl0eSkuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFLCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdFbGVtZW50UmVmZXJlbmNlZEVudGl0eSkuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFLCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkobmV3RWxlbWVudFJlZmVyZW5jZWRFbnRpdHksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlRfUkVGRVJFTkNFRF9FTlRJVFksIG5ld0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5LCBuZXdFbGVtZW50UmVmZXJlbmNlZEVudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQkJaWYgKGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KChEVERFbnRpdHkpIG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCwgRFRER3JvdXBDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQsIERUREVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJcmV0dXJuIGdldE9jY3VycmVuY2UoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQlpZiAocmVzb2x2ZSkKLQkJCQkJcmV0dXJuIGdldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXJldHVybiBvY2N1cnJlbmNlICE9IE9DQ1VSUkVOQ0VfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlzZXRPY2N1cnJlbmNlKChEVERPY2N1cnJlbmNlVHlwZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQlzZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgoRFRERW50aXR5KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlzZXRPY2N1cnJlbmNlKE9DQ1VSUkVOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQlzZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgoRFRERW50aXR5KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW51bWVyYXRpb25UeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudW1lcmF0aW9uVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzZjY1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW51bWVyYXRpb25UeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRW51bUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1Hcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREVudW1lcmF0aW9uVHlwZUltcGwgZXh0ZW5kcyBFRW51bUltcGwgaW1wbGVtZW50cyBEVERFbnVtZXJhdGlvblR5cGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLaW5kKCkgPGVtPktpbmQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERUREVudW1Hcm91cEtpbmQgS0lORF9FREVGQVVMVCA9IERUREVudW1Hcm91cEtpbmQuTkFNRV9UT0tFTl9HUk9VUF9MSVRFUkFMOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgZW51bWVyYXRpb25UeXBlRGVzY3JpcHRpb25zW10gPSB7RFREQ29yZU1lc3NhZ2VzLl9VSV9FTlVNX05BTUVfVE9LRU5TX0RFU0MsIERURENvcmVNZXNzYWdlcy5fVUlfRU5VTV9OT1RBVElPTl9ERVNDfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBlbnVtZXJhdGlvblR5cGVLaW5kc1tdID0ge0RUREVudW1Hcm91cEtpbmQuTkFNRV9UT0tFTl9HUk9VUCwgRFRERW51bUdyb3VwS2luZC5OT1RBVElPTl9HUk9VUH07Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRFRERW51bUdyb3VwS2luZCBraW5kID0gS0lORF9FREVGQVVMVDsKLQotCXB1YmxpYyBEVERFbnVtZXJhdGlvblR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudW1lcmF0aW9uVHlwZSgpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFbnVtTGl0ZXJhbHMoKSB7Ci0JCXJldHVybiBnZXRFTGl0ZXJhbHMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVudW1lcmF0aW9uVHlwZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZ2V0RW51bWVyYXRpb25UeXBlRGVzY3JpcHRpb24oZ2V0S2luZCgpLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVudW1lcmF0aW9uVHlwZURlc2NyaXB0aW9uKGludCBraW5kKSB7Ci0JCS8vIGl0IGNhbiBvbmx5IGJlIDEgb3IgMiwgYnV0IG1heWJlIGxhdGVyLi4uCi0JCWlmIChraW5kID49IDEgJiYga2luZCA8PSAyKSB7Ci0JCQkvLyB3ZSBzdWJ0cmFjdCAxIHNpbmNlIHRoZSBraW5kIGlzIDEgLSBiYXNlZCBub3QgemVybyBiYXNlZAotCQkJcmV0dXJuIGVudW1lcmF0aW9uVHlwZURlc2NyaXB0aW9uc1traW5kIC0gMV07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJLy8gVEJECi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIERUREVudW1Hcm91cEtpbmQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIGtpbmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEtpbmQoRFRERW51bUdyb3VwS2luZCBuZXdLaW5kKSB7Ci0JCURUREVudW1Hcm91cEtpbmQgb2xkS2luZCA9IGtpbmQ7Ci0JCWtpbmQgPSBuZXdLaW5kID09IG51bGwgPyBLSU5EX0VERUZBVUxUIDogbmV3S2luZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fS0lORCwgb2xkS2luZCwga2luZCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChEVERGaWxlKSBlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERUREZpbGUoRFRERmlsZSBuZXdEVERGaWxlKSB7Ci0JCWlmIChuZXdEVERGaWxlICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUgJiYgbmV3RFRERmlsZSAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0RUREZpbGUpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdEVERGaWxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdEVERGaWxlKS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfRU5VTUVSQVRJT05fVFlQRSwgRFRERmlsZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0RUREZpbGUsIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUsIG5ld0RUREZpbGUsIG5ld0RUREZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FQU5OT1RBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRVBBQ0tBR0UgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VQQUNLQUdFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VMSVRFUkFMUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVMaXRlcmFscygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VQQUNLQUdFIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FUEFDS0FHRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FTElURVJBTFMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFTGl0ZXJhbHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VQQUNLQUdFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19FQ0xBU1NJRklFUlMsIEVQYWNrYWdlLmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEUsIERUREZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJcmV0dXJuIGdldEVBbm5vdGF0aW9ucygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0SW5zdGFuY2VDbGFzc05hbWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXJldHVybiBnZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RFRkFVTFRfVkFMVUUgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRVBBQ0tBR0UgOgotCQkJCXJldHVybiBnZXRFUGFja2FnZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19TRVJJQUxJWkFCTEUgOgotCQkJCXJldHVybiBpc1NlcmlhbGl6YWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUxJVEVSQUxTIDoKLQkJCQlyZXR1cm4gZ2V0RUxpdGVyYWxzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0tJTkQgOgotCQkJCXJldHVybiBnZXRLaW5kKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQlyZXR1cm4gZUFubm90YXRpb25zICE9IG51bGwgJiYgIWdldEVBbm5vdGF0aW9ucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fTkFNRSA6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJcmV0dXJuIElOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGluc3RhbmNlQ2xhc3NOYW1lICE9IG51bGwgOiAhSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVC5lcXVhbHMoaW5zdGFuY2VDbGFzc05hbWUpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJcmV0dXJuIElOU1RBTkNFX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBpbnN0YW5jZUNsYXNzICE9IG51bGwgOiAhSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGluc3RhbmNlQ2xhc3MpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19ERUZBVUxUX1ZBTFVFIDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRVBBQ0tBR0UgOgotCQkJCXJldHVybiBnZXRFUGFja2FnZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX1NFUklBTElaQUJMRSA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgU0VSSUFMSVpBQkxFX0VGTEFHKSAhPSAwKSAhPSBTRVJJQUxJWkFCTEVfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VMSVRFUkFMUyA6Ci0JCQkJcmV0dXJuIGVMaXRlcmFscyAhPSBudWxsICYmICFnZXRFTGl0ZXJhbHMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0tJTkQgOgotCQkJCXJldHVybiBraW5kICE9IEtJTkRfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX05BTUUgOgotCQkJCXNldE5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzc05hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXNldEluc3RhbmNlQ2xhc3MoKENsYXNzKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19TRVJJQUxJWkFCTEUgOgotCQkJCXNldFNlcmlhbGl6YWJsZSgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FTElURVJBTFMgOgotCQkJCWdldEVMaXRlcmFscygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUxpdGVyYWxzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19LSU5EIDoKLQkJCQlzZXRLaW5kKChEVERFbnVtR3JvdXBLaW5kKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX05BTUUgOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzTmFtZShJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0lOU1RBTkNFX0NMQVNTIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzKElOU1RBTkNFX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX1NFUklBTElaQUJMRSA6Ci0JCQkJc2V0U2VyaWFsaXphYmxlKFNFUklBTElaQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FTElURVJBTFMgOgotCQkJCWdldEVMaXRlcmFscygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19LSU5EIDoKLQkJCQlzZXRLaW5kKEtJTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGtpbmQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoa2luZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREV4dGVybmFsRW50aXR5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREV4dGVybmFsRW50aXR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmI1ZDAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFeHRlcm5hbEVudGl0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25DaGFpbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFRERXh0ZXJuYWxFbnRpdHlJbXBsIGV4dGVuZHMgRFRERW50aXR5Q29udGVudEltcGwgaW1wbGVtZW50cyBEVERFeHRlcm5hbEVudGl0eSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN5c3RlbUlEKCkgPGVtPlN5c3RlbSBJRDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFN5c3RlbUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzeXN0ZW1JRCA9IFNZU1RFTV9JRF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVibGljSUQoKSA8ZW0+UHVibGljIElEPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0UHVibGljSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY0lEID0gUFVCTElDX0lEX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBEVEROb3RhdGlvbiBub3RhdGlvbiA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIERUREZpbGUgZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSA9IG51bGw7Ci0KLQlwdWJsaWMgRFRERXh0ZXJuYWxFbnRpdHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREV4dGVybmFsRW50aXR5KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlKCkgewotCQlTdHJpbmdCdWZmZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKLQkJaWYgKGdldFB1YmxpY0lEKCkgPT0gbnVsbCB8fCBnZXRQdWJsaWNJRCgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdGV4dC5hcHBlbmQoIlNZU1RFTSAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJdGV4dC5hcHBlbmQoIlBVQkxJQyBcIiIpLmFwcGVuZChnZXRQdWJsaWNJRCgpKS5hcHBlbmQoIlwiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlTdHJpbmcgc3lzdGVtSWQgPSBnZXRTeXN0ZW1JRCgpOwotCi0JCXRleHQuYXBwZW5kKCJcIiIpLmFwcGVuZChzeXN0ZW1JZCkuYXBwZW5kKCJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlEVEROb3RhdGlvbiBub3RhdGlvbiA9IGdldE5vdGF0aW9uKCk7Ci0JCWlmIChub3RhdGlvbiAhPSBudWxsKQotCQkJdGV4dC5hcHBlbmQoIiBOREFUQSAiKS5hcHBlbmQobm90YXRpb24uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiB0ZXh0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlEKCkgewotCQlyZXR1cm4gc3lzdGVtSUQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lzdGVtSUQoU3RyaW5nIG5ld1N5c3RlbUlEKSB7Ci0JCVN0cmluZyBvbGRTeXN0ZW1JRCA9IHN5c3RlbUlEOwotCQlzeXN0ZW1JRCA9IG5ld1N5c3RlbUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1NZU1RFTV9JRCwgb2xkU3lzdGVtSUQsIHN5c3RlbUlEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lEKCkgewotCQlyZXR1cm4gcHVibGljSUQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSUQoU3RyaW5nIG5ld1B1YmxpY0lEKSB7Ci0JCVN0cmluZyBvbGRQdWJsaWNJRCA9IHB1YmxpY0lEOwotCQlwdWJsaWNJRCA9IG5ld1B1YmxpY0lEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1BVQkxJQ19JRCwgb2xkUHVibGljSUQsIHB1YmxpY0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRFRETm90YXRpb24gZ2V0Tm90YXRpb24oKSB7Ci0JCWlmIChub3RhdGlvbiAhPSBudWxsICYmIG5vdGF0aW9uLmVJc1Byb3h5KCkpIHsKLQkJCURURE5vdGF0aW9uIG9sZE5vdGF0aW9uID0gbm90YXRpb247Ci0JCQlub3RhdGlvbiA9IChEVEROb3RhdGlvbikgRWNvcmVVdGlsLnJlc29sdmUobm90YXRpb24sIHRoaXMpOwotCQkJaWYgKG5vdGF0aW9uICE9IG9sZE5vdGF0aW9uKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiwgb2xkTm90YXRpb24sIG5vdGF0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRETm90YXRpb24gYmFzaWNHZXROb3RhdGlvbigpIHsKLQkJcmV0dXJuIG5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXROb3RhdGlvbihEVEROb3RhdGlvbiBuZXdOb3RhdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEVEROb3RhdGlvbiBvbGROb3RhdGlvbiA9IG5vdGF0aW9uOwotCQlub3RhdGlvbiA9IG5ld05vdGF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5ldyBOb3RpZmljYXRpb25DaGFpbkltcGwoNCk7Ci0JCQltc2dzLmFkZChuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiwgb2xkTm90YXRpb24sIG5ld05vdGF0aW9uKSk7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm90YXRpb24oRFRETm90YXRpb24gbmV3Tm90YXRpb24pIHsKLQkJaWYgKG5ld05vdGF0aW9uICE9IG5vdGF0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChub3RhdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbm90YXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFksIERURE5vdGF0aW9uLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdOb3RhdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3Tm90YXRpb24pLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFksIERURE5vdGF0aW9uLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE5vdGF0aW9uKG5ld05vdGF0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiwgbmV3Tm90YXRpb24sIG5ld05vdGF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRFRERmlsZSBnZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKCkgewotCQlpZiAoZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSAhPSBudWxsICYmIGVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUuZUlzUHJveHkoKSkgewotCQkJRFRERmlsZSBvbGRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlID0gZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZTsKLQkJCWVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUgPSAoRFRERmlsZSkgRWNvcmVVdGlsLnJlc29sdmUoZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSwgdGhpcyk7Ci0JCQlpZiAoZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSAhPSBvbGRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFRF9GUk9NX0FOT1RIRVJfRklMRSwgb2xkRW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSwgZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERmlsZSBiYXNpY0dldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKSB7Ci0JCXJldHVybiBlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoRFRERmlsZSBuZXdFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKSB7Ci0JCURUREZpbGUgb2xkRW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSA9IGVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGU7Ci0JCWVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUgPSBuZXdFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFLCBvbGRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlLCBlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFksIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiA6Ci0JCQkJCWlmIChub3RhdGlvbiAhPSBudWxsKQotCQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBub3RhdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0VOVElUWSwgRFRETm90YXRpb24uY2xhc3MsIG1zZ3MpOwotCQkJCQlyZXR1cm4gYmFzaWNTZXROb3RhdGlvbigoRFRETm90YXRpb24pIG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19EVERfRU5USVRZLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04gOgotCQkJCQlyZXR1cm4gYmFzaWNTZXROb3RhdGlvbihudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCXJldHVybiBnZXREVERFbnRpdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19TWVNURU1fSUQgOgotCQkJCXJldHVybiBnZXRTeXN0ZW1JRCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1BVQkxJQ19JRCA6Ci0JCQkJcmV0dXJuIGdldFB1YmxpY0lEKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04gOgotCQkJCWlmIChyZXNvbHZlKQotCQkJCQlyZXR1cm4gZ2V0Tm90YXRpb24oKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXROb3RhdGlvbigpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFIDoKLQkJCQlpZiAocmVzb2x2ZSkKLQkJCQkJcmV0dXJuIGdldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCXJldHVybiBnZXREVERFbnRpdHkoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1NZU1RFTV9JRCA6Ci0JCQkJcmV0dXJuIFNZU1RFTV9JRF9FREVGQVVMVCA9PSBudWxsID8gc3lzdGVtSUQgIT0gbnVsbCA6ICFTWVNURU1fSURfRURFRkFVTFQuZXF1YWxzKHN5c3RlbUlEKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19QVUJMSUNfSUQgOgotCQkJCXJldHVybiBQVUJMSUNfSURfRURFRkFVTFQgPT0gbnVsbCA/IHB1YmxpY0lEICE9IG51bGwgOiAhUFVCTElDX0lEX0VERUZBVUxULmVxdWFscyhwdWJsaWNJRCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04gOgotCQkJCXJldHVybiBub3RhdGlvbiAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFIDoKLQkJCQlyZXR1cm4gZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCXNldERUREVudGl0eSgoRFRERW50aXR5KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1NZU1RFTV9JRCA6Ci0JCQkJc2V0U3lzdGVtSUQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19QVUJMSUNfSUQgOgotCQkJCXNldFB1YmxpY0lEKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04gOgotCQkJCXNldE5vdGF0aW9uKChEVEROb3RhdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFRF9GUk9NX0FOT1RIRVJfRklMRSA6Ci0JCQkJc2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSgoRFRERmlsZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJc2V0RFRERW50aXR5KChEVERFbnRpdHkpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19TWVNURU1fSUQgOgotCQkJCXNldFN5c3RlbUlEKFNZU1RFTV9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1BVQkxJQ19JRCA6Ci0JCQkJc2V0UHVibGljSUQoUFVCTElDX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04gOgotCQkJCXNldE5vdGF0aW9uKChEVEROb3RhdGlvbikgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFIDoKLQkJCQlzZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKChEVERGaWxlKSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzeXN0ZW1JRDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzeXN0ZW1JRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHVibGljSUQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocHVibGljSUQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZGVmYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5YTUxTY2hlbWFEZWZpbmVkVHlwZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIERUREZhY3RvcnkgewotCXByb3RlY3RlZCBEVERCYXNpY1R5cGUgZHRkQmFzaWNUeXBlX05PTkU7Ci0JcHJvdGVjdGVkIERUREJhc2ljVHlwZSBkdGRCYXNpY1R5cGVfQ0RBVEE7Ci0JcHJvdGVjdGVkIERUREJhc2ljVHlwZSBkdGRCYXNpY1R5cGVfSUQ7Ci0JcHJvdGVjdGVkIERUREJhc2ljVHlwZSBkdGRCYXNpY1R5cGVfSURSRUY7Ci0JcHJvdGVjdGVkIERUREJhc2ljVHlwZSBkdGRCYXNpY1R5cGVfSURSRUZTOwotCXByb3RlY3RlZCBEVERCYXNpY1R5cGUgZHRkQmFzaWNUeXBlX0VOVElUWTsKLQlwcm90ZWN0ZWQgRFREQmFzaWNUeXBlIGR0ZEJhc2ljVHlwZV9FTlRJVElFUzsKLQlwcm90ZWN0ZWQgRFREQmFzaWNUeXBlIGR0ZEJhc2ljVHlwZV9OTVRPS0VOOwotCXByb3RlY3RlZCBEVERCYXNpY1R5cGUgZHRkQmFzaWNUeXBlX05NVE9LRU5TOwotCi0KLQotCXB1YmxpYyBzdGF0aWMgRFRERmFjdG9yeSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIChEVERGYWN0b3J5KSBnZXRQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR0ZEJhc2ljVHlwZV9OT05FLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERURFR5cGUKLQkgKi8KLQlwdWJsaWMgRFREVHlwZSBnZXREVERCYXNpY1R5cGVfTk9ORSgpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9OT05FID09IG51bGwpIHsKLQkJCShkdGRCYXNpY1R5cGVfTk9ORSA9IGNyZWF0ZURUREJhc2ljVHlwZSgpKS5zZXRLaW5kKERUREJhc2ljVHlwZUtpbmQuQ0RBVEFfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZV9OT05FOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR0ZEJhc2ljVHlwZV9DREFUQS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBEVERUeXBlCi0JICovCi0JcHVibGljIERURFR5cGUgZ2V0RFREQmFzaWNUeXBlX0NEQVRBKCkgewotCQlpZiAoZHRkQmFzaWNUeXBlX0NEQVRBID09IG51bGwpIHsKLQkJCShkdGRCYXNpY1R5cGVfQ0RBVEEgPSBjcmVhdGVEVERCYXNpY1R5cGUoKSkuc2V0S2luZChEVERCYXNpY1R5cGVLaW5kLkNEQVRBX0xJVEVSQUwpOwotCQl9Ci0JCXJldHVybiBkdGRCYXNpY1R5cGVfQ0RBVEE7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZHRkQmFzaWNUeXBlX0lELgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERURFR5cGUKLQkgKi8KLQlwdWJsaWMgRFREVHlwZSBnZXREVERCYXNpY1R5cGVfSUQoKSB7Ci0JCWlmIChkdGRCYXNpY1R5cGVfSUQgPT0gbnVsbCkgewotCQkJKGR0ZEJhc2ljVHlwZV9JRCA9IGNyZWF0ZURUREJhc2ljVHlwZSgpKS5zZXRLaW5kKERUREJhc2ljVHlwZUtpbmQuSURfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZV9JRDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkdGRCYXNpY1R5cGVfSURSRUYuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRFREVHlwZQotCSAqLwotCXB1YmxpYyBEVERUeXBlIGdldERUREJhc2ljVHlwZV9JRFJFRigpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9JRFJFRiA9PSBudWxsKSB7Ci0JCQkoZHRkQmFzaWNUeXBlX0lEUkVGID0gY3JlYXRlRFREQmFzaWNUeXBlKCkpLnNldEtpbmQoRFREQmFzaWNUeXBlS2luZC5JRFJFRl9MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gZHRkQmFzaWNUeXBlX0lEUkVGOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR0ZEJhc2ljVHlwZV9JRFJFRlMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRFREVHlwZQotCSAqLwotCXB1YmxpYyBEVERUeXBlIGdldERUREJhc2ljVHlwZV9JRFJFRlMoKSB7Ci0JCWlmIChkdGRCYXNpY1R5cGVfSURSRUZTID09IG51bGwpIHsKLQkJCShkdGRCYXNpY1R5cGVfSURSRUZTID0gY3JlYXRlRFREQmFzaWNUeXBlKCkpLnNldEtpbmQoRFREQmFzaWNUeXBlS2luZC5JRFJFRlNfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZV9JRFJFRlM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZHRkQmFzaWNUeXBlX0VOVElUWS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBEVERUeXBlCi0JICovCi0JcHVibGljIERURFR5cGUgZ2V0RFREQmFzaWNUeXBlX0VOVElUWSgpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9FTlRJVFkgPT0gbnVsbCkgewotCQkJKGR0ZEJhc2ljVHlwZV9FTlRJVFkgPSBjcmVhdGVEVERCYXNpY1R5cGUoKSkuc2V0S2luZChEVERCYXNpY1R5cGVLaW5kLkVOVElUWV9MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gZHRkQmFzaWNUeXBlX0VOVElUWTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkdGRCYXNpY1R5cGVfRU5USVRJRVMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRFREVHlwZQotCSAqLwotCXB1YmxpYyBEVERUeXBlIGdldERUREJhc2ljVHlwZV9FTlRJVElFUygpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9FTlRJVElFUyA9PSBudWxsKSB7Ci0JCQkoZHRkQmFzaWNUeXBlX0VOVElUSUVTID0gY3JlYXRlRFREQmFzaWNUeXBlKCkpLnNldEtpbmQoRFREQmFzaWNUeXBlS2luZC5FTlRJVElFU19MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gZHRkQmFzaWNUeXBlX0VOVElUSUVTOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR0ZEJhc2ljVHlwZV9OTVRPS0VOLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERURFR5cGUKLQkgKi8KLQlwdWJsaWMgRFREVHlwZSBnZXREVERCYXNpY1R5cGVfTk1UT0tFTigpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9OTVRPS0VOID09IG51bGwpIHsKLQkJCShkdGRCYXNpY1R5cGVfTk1UT0tFTiA9IGNyZWF0ZURUREJhc2ljVHlwZSgpKS5zZXRLaW5kKERUREJhc2ljVHlwZUtpbmQuTk1UT0tFTl9MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gZHRkQmFzaWNUeXBlX05NVE9LRU47Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZHRkQmFzaWNUeXBlX05NVE9LRU5TLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERURFR5cGUKLQkgKi8KLQlwdWJsaWMgRFREVHlwZSBnZXREVERCYXNpY1R5cGVfTk1UT0tFTlMoKSB7Ci0JCWlmIChkdGRCYXNpY1R5cGVfTk1UT0tFTlMgPT0gbnVsbCkgewotCQkJKGR0ZEJhc2ljVHlwZV9OTVRPS0VOUyA9IGNyZWF0ZURUREJhc2ljVHlwZSgpKS5zZXRLaW5kKERUREJhc2ljVHlwZUtpbmQuTk1UT0tFTlNfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZV9OTVRPS0VOUzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRER3JvdXBDb250ZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURSA6Ci0JCQkJcmV0dXJuIGNyZWF0ZURUREF0dHJpYnV0ZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERWxlbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERW1wdHlDb250ZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFREQW55Q29udGVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlQgOgotCQkJCXJldHVybiBjcmVhdGVEVERQQ0RhdGFDb250ZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlQgOgotCQkJCXJldHVybiBjcmVhdGVEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERmlsZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFREQmFzaWNUeXBlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEUgOgotCQkJCXJldHVybiBjcmVhdGVEVERFbnVtZXJhdGlvblR5cGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT04gOgotCQkJCXJldHVybiBjcmVhdGVEVEROb3RhdGlvbigpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFkgOgotCQkJCXJldHVybiBjcmVhdGVEVERFbnRpdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERXh0ZXJuYWxFbnRpdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRESW50ZXJuYWxFbnRpdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0UgOgotCQkJCXJldHVybiBjcmVhdGVEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9PQ0NVUlJFTkNFX1RZUEUgOgotCQkJCXJldHVybiBEVERPY2N1cnJlbmNlVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfREVGQVVMVF9LSU5EIDoKLQkJCQlyZXR1cm4gRFRERGVmYXVsdEtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfS0lORCA6Ci0JCQkJcmV0dXJuIERUREJhc2ljVHlwZUtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1fR1JPVVBfS0lORCA6Ci0JCQkJcmV0dXJuIERUREVudW1Hcm91cEtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0tJTkQgOgotCQkJCXJldHVybiBEVERHcm91cEtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuWE1MX1NDSEVNQV9ERUZJTkVEX1RZUEUgOgotCQkJCXJldHVybiBYTUxTY2hlbWFEZWZpbmVkVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfT0NDVVJSRU5DRV9UWVBFIDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfREVGQVVMVF9LSU5EIDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9LSU5EIDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTV9HUk9VUF9LSU5EIDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfS0lORCA6Ci0JCQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuWE1MX1NDSEVNQV9ERUZJTkVEX1RZUEUgOgotCQkJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRER3JvdXBDb250ZW50IGNyZWF0ZURUREdyb3VwQ29udGVudCgpIHsKLQkJRFRER3JvdXBDb250ZW50SW1wbCBkdGRHcm91cENvbnRlbnQgPSBuZXcgRFRER3JvdXBDb250ZW50SW1wbCgpOwotCQlyZXR1cm4gZHRkR3JvdXBDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREQXR0cmlidXRlIGNyZWF0ZURUREF0dHJpYnV0ZSgpIHsKLQkJRFREQXR0cmlidXRlSW1wbCBkdGRBdHRyaWJ1dGUgPSBuZXcgRFREQXR0cmlidXRlSW1wbCgpOwotCQlyZXR1cm4gZHRkQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERWxlbWVudCBjcmVhdGVEVERFbGVtZW50KCkgewotCQlEVERFbGVtZW50SW1wbCBkdGRFbGVtZW50ID0gbmV3IERUREVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBkdGRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW1wdHlDb250ZW50IGNyZWF0ZURUREVtcHR5Q29udGVudCgpIHsKLQkJRFRERW1wdHlDb250ZW50SW1wbCBkdGRFbXB0eUNvbnRlbnQgPSBuZXcgRFRERW1wdHlDb250ZW50SW1wbCgpOwotCQlyZXR1cm4gZHRkRW1wdHlDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREQW55Q29udGVudCBjcmVhdGVEVERBbnlDb250ZW50KCkgewotCQlEVERBbnlDb250ZW50SW1wbCBkdGRBbnlDb250ZW50ID0gbmV3IERUREFueUNvbnRlbnRJbXBsKCk7Ci0JCXJldHVybiBkdGRBbnlDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREUENEYXRhQ29udGVudCBjcmVhdGVEVERQQ0RhdGFDb250ZW50KCkgewotCQlEVERQQ0RhdGFDb250ZW50SW1wbCBkdGRwY0RhdGFDb250ZW50ID0gbmV3IERURFBDRGF0YUNvbnRlbnRJbXBsKCk7Ci0JCXJldHVybiBkdGRwY0RhdGFDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgY3JlYXRlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKSB7Ci0JCURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50SW1wbCBkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudCA9IG5ldyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEltcGwoKTsKLQkJcmV0dXJuIGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERmlsZSBjcmVhdGVEVERGaWxlKCkgewotCQlEVERGaWxlSW1wbCBkdGRGaWxlID0gbmV3IERUREZpbGVJbXBsKCk7Ci0JCXJldHVybiBkdGRGaWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREQmFzaWNUeXBlIGNyZWF0ZURUREJhc2ljVHlwZSgpIHsKLQkJRFREQmFzaWNUeXBlSW1wbCBkdGRCYXNpY1R5cGUgPSBuZXcgRFREQmFzaWNUeXBlSW1wbCgpOwotCQlyZXR1cm4gZHRkQmFzaWNUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW51bWVyYXRpb25UeXBlIGNyZWF0ZURUREVudW1lcmF0aW9uVHlwZSgpIHsKLQkJRFRERW51bWVyYXRpb25UeXBlSW1wbCBkdGRFbnVtZXJhdGlvblR5cGUgPSBuZXcgRFRERW51bWVyYXRpb25UeXBlSW1wbCgpOwotCQlyZXR1cm4gZHRkRW51bWVyYXRpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRETm90YXRpb24gY3JlYXRlRFRETm90YXRpb24oKSB7Ci0JCURURE5vdGF0aW9uSW1wbCBkdGROb3RhdGlvbiA9IG5ldyBEVEROb3RhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGR0ZE5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGNyZWF0ZURUREVudGl0eSgpIHsKLQkJRFRERW50aXR5SW1wbCBkdGRFbnRpdHkgPSBuZXcgRFRERW50aXR5SW1wbCgpOwotCQlyZXR1cm4gZHRkRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERXh0ZXJuYWxFbnRpdHkgY3JlYXRlRFRERXh0ZXJuYWxFbnRpdHkoKSB7Ci0JCURUREV4dGVybmFsRW50aXR5SW1wbCBkdGRFeHRlcm5hbEVudGl0eSA9IG5ldyBEVERFeHRlcm5hbEVudGl0eUltcGwoKTsKLQkJcmV0dXJuIGR0ZEV4dGVybmFsRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRESW50ZXJuYWxFbnRpdHkgY3JlYXRlRFRESW50ZXJuYWxFbnRpdHkoKSB7Ci0JCURUREludGVybmFsRW50aXR5SW1wbCBkdGRJbnRlcm5hbEVudGl0eSA9IG5ldyBEVERJbnRlcm5hbEVudGl0eUltcGwoKTsKLQkJcmV0dXJuIGR0ZEludGVybmFsRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGNyZWF0ZURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpIHsKLQkJRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbCBkdGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgPSBuZXcgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbCgpOwotCQlyZXR1cm4gZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBjcmVhdGVEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCkgewotCQlEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50SW1wbCBkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50ID0gbmV3IERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRJbXBsKCk7Ci0JCXJldHVybiBkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREUGFja2FnZSBnZXREVERQYWNrYWdlKCkgewotCQlyZXR1cm4gKERURFBhY2thZ2UpIGdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFREUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREZpbGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM4NDZkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5hbWVkRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERQYXRobmFtZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFByaW50ZXI7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GaWxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREZpbGVJbXBsI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERmlsZUltcGwjaXNQYXJzZUVycm9yIDxlbT5QYXJzZSBFcnJvcjwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERGaWxlSW1wbCNnZXREVERDb250ZW50IDxlbT5EVEQgQ29udGVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERGaWxlSW1wbCNnZXREVERFbnVtZXJhdGlvblR5cGUgPGVtPkRURCBFbnVtZXJhdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREZpbGVJbXBsIGV4dGVuZHMgRU5hbWVkRWxlbWVudEltcGwgaW1wbGVtZW50cyBEVERGaWxlLCBFTmFtZWRFbGVtZW50IHsKLQotCXB1YmxpYyBFTGlzdCBnZXREVERPYmplY3QoKSB7Ci0JCXJldHVybiBnZXREVERDb250ZW50KCk7Ci0JfQotCi0KLQlwdWJsaWMgTGlzdCBsaXN0RFRERWxlbWVudCgpIHsKLQkJcmV0dXJuIGdldENvbnRlbnRMaXN0T2YoRFRERWxlbWVudC5jbGFzcywgbnVsbCk7Ci0JfQotCi0KLQlwdWJsaWMgTGlzdCBsaXN0RFRETm90YXRpb24oKSB7Ci0JCXJldHVybiBnZXRDb250ZW50TGlzdE9mKERURE5vdGF0aW9uLmNsYXNzLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBsaXN0RFRERW50aXR5KCkgewotCQlyZXR1cm4gZ2V0Q29udGVudExpc3RPZihEVERFbnRpdHkuY2xhc3MsIG51bGwpOwotCX0KLQotCXB1YmxpYyBMaXN0IGxpc3REVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBnZXRDb250ZW50TGlzdE9mKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5jbGFzcywgbnVsbCk7Ci0JfQotCi0JcHVibGljIExpc3QgbGlzdERUREVsZW1lbnRBbmREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBnZXRDb250ZW50TGlzdE9mKERUREVsZW1lbnQuY2xhc3MsIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldENvbnRlbnRMaXN0T2YoQ2xhc3MgY2xhc3MxLCBDbGFzcyBjbGFzczIpIHsKLQkJTGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpID0gZ2V0RFREQ29udGVudCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJaWYgKGNsYXNzMS5pc0luc3RhbmNlKG9iaikpIHsKLQkJCQl2LmFkZChvYmopOwotCQkJfQotCQkJZWxzZSBpZiAoKGNsYXNzMiAhPSBudWxsKSAmJiAoY2xhc3MyLmlzSW5zdGFuY2Uob2JqKSkpIHsKLQkJCQl2LmFkZChvYmopOwotCQkJfQotCQl9Ci0JCXJldHVybiB2OwotCX0KLQotCXB1YmxpYyBEVERFbGVtZW50IGZpbmRFbGVtZW50KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3REVERFbGVtZW50KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlEVERFbGVtZW50IGUgPSAoRFRERWxlbWVudCkgaS5uZXh0KCk7Ci0JCQlpZiAoZS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERUREVudGl0eSBmaW5kRW50aXR5KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3REVERFbnRpdHkoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCURUREVudGl0eSBlID0gKERUREVudGl0eSkgaS5uZXh0KCk7Ci0JCQlpZiAoZS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERURE5vdGF0aW9uIGZpbmROb3RhdGlvbihTdHJpbmcgbmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0RFRETm90YXRpb24oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCURURE5vdGF0aW9uIGUgPSAoRFRETm90YXRpb24pIGkubmV4dCgpOwotCQkJaWYgKGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgZmluZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgZSA9IChEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIGkubmV4dCgpOwotCQkJaWYgKGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZShib29sZWFuIGluY2x1ZGUpIHsKLQkJRFREUHJpbnRlciBwcmludGVyID0gbmV3IERURFByaW50ZXIodHJ1ZSk7Ci0JCXByaW50ZXIudmlzaXREVERGaWxlKHRoaXMpOwotCQlyZXR1cm4gcHJpbnRlci5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQlwdWJsaWMgRFRET2JqZWN0IGZpbmRPYmplY3QoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlPYmplY3RbXSByZXN1bHQgPSBEVERQYXRobmFtZVV0aWwucGFyc2VQYXRoQ29tcG9uZW50KHJlbGF0aXZlUGF0aCk7Ci0KLQotCQlTdHJpbmcgdHlwZSA9IChTdHJpbmcpIHJlc3VsdFswXTsKLQotCi0JCWlmICh0eXBlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCi0JCVN0cmluZyBuYW1lID0gKFN0cmluZykgcmVzdWx0WzFdOwotCi0JCURURE9iamVjdCBvYmogPSBudWxsOwotCQlpZiAodHlwZS5lcXVhbHMoIkVsZW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlvYmogPSBmaW5kRWxlbWVudChuYW1lKTsKLQkJfQotCQllbHNlIGlmICh0eXBlLmVxdWFscygiRW50IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJb2JqID0gZmluZEVudGl0eShuYW1lKTsKLQkJfQotCQllbHNlIGlmICh0eXBlLmVxdWFscygiUEVudCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCW9iaiA9IGZpbmRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UobmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZS5lcXVhbHMoIk5vdGEiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlvYmogPSBmaW5kTm90YXRpb24obmFtZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0KLQkJU3RyaW5nIHJlc3RQYXRoID0gKFN0cmluZykgcmVzdWx0WzNdOwotCi0JCWlmICgocmVzdFBhdGggPT0gbnVsbCkgfHwgKG9iaiA9PSBudWxsKSkgewotCQkJcmV0dXJuIG9iajsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBvYmouZmluZE9iamVjdChyZXN0UGF0aCk7Ci0JCX0KLQl9Ci0KLQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbW1lbnQoKSA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tbWVudCgpIDxlbT5Db21tZW50PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb21tZW50ID0gQ09NTUVOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1BhcnNlRXJyb3IoKSA8ZW0+UGFyc2UgRXJyb3I8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNpc1BhcnNlRXJyb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBQQVJTRV9FUlJPUl9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQYXJzZUVycm9yKCkgPGVtPlBhcnNlIEVycm9yPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjaXNQYXJzZUVycm9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwYXJzZUVycm9yID0gUEFSU0VfRVJST1JfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREVERDb250ZW50KCkgPGVtPkRURCBDb250ZW50PC9lbT59JwotCSAqIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldERURENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkdGRDb250ZW50ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERUREVudW1lcmF0aW9uVHlwZSgpIDxlbT5EVEQgRW51bWVyYXRpb24gVHlwZTwvZW0+fScKLQkgKiBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXREVERFbnVtZXJhdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkdGRFbnVtZXJhdGlvblR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEVERGaWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKLQkJcmV0dXJuIGNvbW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIG5ld0NvbW1lbnQpIHsKLQkJU3RyaW5nIG9sZENvbW1lbnQgPSBjb21tZW50OwotCQljb21tZW50ID0gbmV3Q29tbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRklMRV9fQ09NTUVOVCwgb2xkQ29tbWVudCwgY29tbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnNlRXJyb3IoKSB7Ci0JCXJldHVybiBwYXJzZUVycm9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJzZUVycm9yKGJvb2xlYW4gbmV3UGFyc2VFcnJvcikgewotCQlib29sZWFuIG9sZFBhcnNlRXJyb3IgPSBwYXJzZUVycm9yOwotCQlwYXJzZUVycm9yID0gbmV3UGFyc2VFcnJvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1IsIG9sZFBhcnNlRXJyb3IsIHBhcnNlRXJyb3IpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERURENvbnRlbnQoKSB7Ci0JCWlmIChkdGRDb250ZW50ID09IG51bGwpIHsKLQkJCWR0ZENvbnRlbnQgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChEVERDb250ZW50LmNsYXNzLCB0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCwgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUpOwotCQl9Ci0JCXJldHVybiBkdGRDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RFRERW51bWVyYXRpb25UeXBlKCkgewotCQlpZiAoZHRkRW51bWVyYXRpb25UeXBlID09IG51bGwpIHsKLQkJCWR0ZEVudW1lcmF0aW9uVHlwZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KERUREVudW1lcmF0aW9uVHlwZS5jbGFzcywgdGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEUsIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFKTsKLQkJfQotCQlyZXR1cm4gZHRkRW51bWVyYXRpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5UIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RFREQ29udGVudCgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfRU5VTUVSQVRJT05fVFlQRSA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldERUREVudW1lcmF0aW9uVHlwZSgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldERURENvbnRlbnQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEUgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXREVERFbnVtZXJhdGlvblR5cGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0NPTU1FTlQgOgotCQkJCXJldHVybiBnZXRDb21tZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SIDoKLQkJCQlyZXR1cm4gaXNQYXJzZUVycm9yKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGdldERURENvbnRlbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEUgOgotCQkJCXJldHVybiBnZXREVERFbnVtZXJhdGlvblR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19DT01NRU5UIDoKLQkJCQlzZXRDb21tZW50KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SIDoKLQkJCQlzZXRQYXJzZUVycm9yKCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5UIDoKLQkJCQlnZXREVERDb250ZW50KCkuY2xlYXIoKTsKLQkJCQlnZXREVERDb250ZW50KCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfRU5VTUVSQVRJT05fVFlQRSA6Ci0JCQkJZ2V0RFRERW51bWVyYXRpb25UeXBlKCkuY2xlYXIoKTsKLQkJCQlnZXREVERFbnVtZXJhdGlvblR5cGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fQ09NTUVOVCA6Ci0JCQkJc2V0Q29tbWVudChDT01NRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SIDoKLQkJCQlzZXRQYXJzZUVycm9yKFBBUlNFX0VSUk9SX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5UIDoKLQkJCQlnZXREVERDb250ZW50KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9FTlVNRVJBVElPTl9UWVBFIDoKLQkJCQlnZXREVERFbnVtZXJhdGlvblR5cGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fQ09NTUVOVCA6Ci0JCQkJcmV0dXJuIENPTU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGNvbW1lbnQgIT0gbnVsbCA6ICFDT01NRU5UX0VERUZBVUxULmVxdWFscyhjb21tZW50KTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1IgOgotCQkJCXJldHVybiBwYXJzZUVycm9yICE9IFBBUlNFX0VSUk9SX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGR0ZENvbnRlbnQgIT0gbnVsbCAmJiAhZ2V0RFREQ29udGVudCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEUgOgotCQkJCXJldHVybiBkdGRFbnVtZXJhdGlvblR5cGUgIT0gbnVsbCAmJiAhZ2V0RFRERW51bWVyYXRpb25UeXBlKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb21tZW50OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNvbW1lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhcnNlRXJyb3I6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocGFyc2VFcnJvcik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBEVERGaWxlSW1wbAotCi0vLyArKysrKysrKysrKysrKysrKysrR0VORVJJQ1JVTEVTLkpTRUQrKysrKysrKysrKysrKysrKysrCi0vLwotCi0vLyArKysrKysrKysrKysrKysrKysrR0VORVJJQ1JVTEVTLkpTRUQrKysrKysrKysrKysrKysrKysrCi0vLyAvL3B1YmxpYyBjbGFzcyBEVERGaWxlSW1wbCBleHRlbmRzIEVOYW1lc3BhY2VJbXBsIGltcGxlbWVudHMgRFRERmlsZSwKLS8vIEVOYW1lc3BhY2V7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbgotLy8gMjAwMi4iOwotLy8KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgU3RyaW5nIGNvbW1lbnQgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBCb29sZWFuIHBhcnNlRXJyb3IgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBFTGlzdCBkdGRDb250ZW50ID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRUxpc3QgZHRkRW51bWVyYXRpb25UeXBlID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgYm9vbGVhbiBzZXRDb21tZW50ID0gZmFsc2U7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2V0UGFyc2VFcnJvciA9IGZhbHNlOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBFT2JqZWN0IGluaXRJbnN0YW5jZSgpIHsKLS8vIHNldEVNZXRhT2JqKGVDbGFzc0RUREZpbGUoKSk7Ci0vLyBpbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKTsKLS8vIHJldHVybiB0aGlzOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBEVERQYWNrYWdlIGVQYWNrYWdlRFREKCkgewotLy8gcmV0dXJuCi0vLyAoRFREUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEVERQYWNrYWdlLmVOU19VUkkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBFQ2xhc3MgZUNsYXNzRFRERmlsZSgpIHsKLS8vIHJldHVybgotLy8gKChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSkpLmdldERUREZpbGUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKLS8vIGlmICh0aGlzLnNldENvbW1lbnQpIHJldHVybiB0aGlzLmNvbW1lbnQ7Ci0vLyBlbHNlIHJldHVybgotLy8gKFN0cmluZylEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX0NvbW1lbnQoKS5nZXREZWZhdWx0VmFsdWUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyB2YWx1ZSkgewotLy8gcmVmU2V0VmFsdWVGb3JTaW1wbGVTRihEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX0NvbW1lbnQoKSx0aGlzLmNvbW1lbnQsdmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0Q29tbWVudCgpIHsKLS8vIGVOb3RpZnkocmVmQmFzaWNVbnNldFZhbHVlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfQ29tbWVudCgpKSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNTZXRDb21tZW50KCkgewotLy8gcmV0dXJuIHNldENvbW1lbnQ7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgQm9vbGVhbiBnZXRQYXJzZUVycm9yKCkgewotLy8gaWYgKHRoaXMuc2V0UGFyc2VFcnJvcikgcmV0dXJuIHRoaXMucGFyc2VFcnJvcjsKLS8vIGVsc2UgcmV0dXJuCi0vLyAoQm9vbGVhbilEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX1BhcnNlRXJyb3IoKS5nZXREZWZhdWx0VmFsdWUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzUGFyc2VFcnJvcigpIHsKLS8vIEJvb2xlYW4gcmVzdWx0ID0gZ2V0UGFyc2VFcnJvcigpOwotLy8gcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0LmJvb2xlYW5WYWx1ZSgpIDogZmFsc2U7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0UGFyc2VFcnJvcihCb29sZWFuIHZhbHVlKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNpbXBsZVNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfUGFyc2VFcnJvcigpLHRoaXMucGFyc2VFcnJvcix2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0UGFyc2VFcnJvcihib29sZWFuIHZhbHVlKSB7Ci0vLyBzZXRQYXJzZUVycm9yKHZhbHVlP0Jvb2xlYW4uVFJVRTpCb29sZWFuLkZBTFNFKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldFBhcnNlRXJyb3IoKSB7Ci0vLyBlTm90aWZ5KHJlZkJhc2ljVW5zZXRWYWx1ZShEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX1BhcnNlRXJyb3IoKSkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0UGFyc2VFcnJvcigpIHsKLS8vIHJldHVybiBzZXRQYXJzZUVycm9yOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIEVMaXN0IGdldERURENvbnRlbnQoKSB7Ci0vLyBpZiAodGhpcy5kdGRDb250ZW50PT1udWxsKSB7Ci0vLyB0aGlzLmR0ZENvbnRlbnQ9bmV3Q29sbGVjdGlvbih0aGlzLERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfRFREQ29udGVudCgpLAotLy8gdHJ1ZSk7Ci0vLyB9Ci0vLyByZXR1cm4gdGhpcy5kdGRDb250ZW50OwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIEVMaXN0IGdldERUREVudW1lcmF0aW9uVHlwZSgpIHsKLS8vIGlmICh0aGlzLmR0ZEVudW1lcmF0aW9uVHlwZT09bnVsbCkgewotLy8gdGhpcy5kdGRFbnVtZXJhdGlvblR5cGU9bmV3Q29sbGVjdGlvbih0aGlzLERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfRFRERW51bWVyYXRpb25UeXBlKCksCi0vLyB0cnVlKTsKLS8vIH0KLS8vIHJldHVybiB0aGlzLmR0ZEVudW1lcmF0aW9uVHlwZTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERmlsZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0NPTU1FTlQ6IHJldHVybiBnZXRDb21tZW50KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SOiByZXR1cm4gZ2V0UGFyc2VFcnJvcigpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVDogcmV0dXJuIGdldERURENvbnRlbnQoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEU6IHJldHVybgotLy8gZ2V0RFRERW51bWVyYXRpb25UeXBlKCk7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE9iamVjdCByZWZCYXNpY1ZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREZpbGUoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19DT01NRU5UOgotLy8gcmV0dXJuIHRoaXMuc2V0Q29tbWVudD8gdGhpcy5jb21tZW50IDogbnVsbDsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1I6Ci0vLyByZXR1cm4gdGhpcy5zZXRQYXJzZUVycm9yPyB0aGlzLnBhcnNlRXJyb3IgOiBudWxsOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVDoKLS8vIHJldHVybiB0aGlzLmR0ZENvbnRlbnQ7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9FTlVNRVJBVElPTl9UWVBFOgotLy8gcmV0dXJuIHRoaXMuZHRkRW51bWVyYXRpb25UeXBlOwotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1ZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREZpbGUoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19DT01NRU5UOiByZXR1cm4gaXNTZXRDb21tZW50KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SOiByZXR1cm4gaXNTZXRQYXJzZUVycm9yKCk7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyBzdXBlci5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERmlsZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0NPTU1FTlQ6IHsKLS8vIHNldENvbW1lbnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SOiB7Ci0vLyBzZXRQYXJzZUVycm9yKChuZXdWYWx1ZSBpbnN0YW5jZW9mCi0vLyBTdHJpbmcpP0Jvb2xlYW4udmFsdWVPZigoU3RyaW5nKW5ld1ZhbHVlKTooQm9vbGVhbiluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLwotLy8gfQotLy8gc3VwZXIuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE5vdGlmaWNhdGlvbiBlQmFzaWNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLS8vIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUJhc2ljU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERmlsZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0NPTU1FTlQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuY29tbWVudDsKLS8vIHRoaXMuY29tbWVudCA9IChTdHJpbmcpbmV3VmFsdWU7Ci0vLyB0aGlzLnNldENvbW1lbnQgPSB0cnVlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX0NvbW1lbnQoKSxvbGRWYWx1ZSxuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLnBhcnNlRXJyb3I7Ci0vLyB0aGlzLnBhcnNlRXJyb3IgPSAoQm9vbGVhbiluZXdWYWx1ZTsKLS8vIHRoaXMuc2V0UGFyc2VFcnJvciA9IHRydWU7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfUGFyc2VFcnJvcigpLG9sZFZhbHVlLG5ld1ZhbHVlKTsKLS8vIH0KLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUJhc2ljU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyBzdXBlci5lVW5zZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREZpbGUoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19DT01NRU5UOiB7Ci0vLyB1bnNldENvbW1lbnQoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1I6IHsKLS8vIHVuc2V0UGFyc2VFcnJvcigpOwotLy8gcmV0dXJuOwotLy8gfQotLy8KLS8vIH0KLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgTm90aWZpY2F0aW9uIHJlZkJhc2ljVW5zZXRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1Vuc2V0VmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREZpbGUoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19DT01NRU5UOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmNvbW1lbnQ7Ci0vLyB0aGlzLmNvbW1lbnQgPSBudWxsOwotLy8gdGhpcy5zZXRDb21tZW50ID0gZmFsc2U7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlVOU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERmlsZV9Db21tZW50KCksb2xkVmFsdWUsZ2V0Q29tbWVudCgpKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fUEFSU0VfRVJST1I6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMucGFyc2VFcnJvcjsKLS8vIHRoaXMucGFyc2VFcnJvciA9IG51bGw7Ci0vLyB0aGlzLnNldFBhcnNlRXJyb3IgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX1BhcnNlRXJyb3IoKSxvbGRWYWx1ZSxnZXRQYXJzZUVycm9yKCkpOwotLy8gfQotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1Vuc2V0VmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLS8vIFN0cmluZyBvdXQ9IigiOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotLy8gYm9vbGVhbiBmaXJzdD10cnVlOwotLy8gYm9vbGVhbiBlbXB0eUxpc3Q9dHJ1ZTsKLS8vIGlmKGlzU2V0Q29tbWVudCgpKSB7Ci0vLyBpZighZW1wdHlMaXN0KSBvdXQrPSIsICI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0vLyBvdXQrPSJjb21tZW50OiAiK3RoaXMuY29tbWVudDsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLS8vIGZpcnN0PWZhbHNlOwotLy8gZW1wdHlMaXN0PWZhbHNlOwotLy8gfQotLy8gaWYoaXNTZXRQYXJzZUVycm9yKCkpIHsKLS8vIGlmKCFlbXB0eUxpc3QpIG91dCs9IiwgIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLS8vIG91dCs9InBhcnNlRXJyb3I6ICIrdGhpcy5wYXJzZUVycm9yOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotLy8gZmlyc3Q9ZmFsc2U7Ci0vLyBlbXB0eUxpc3Q9ZmFsc2U7Ci0vLyB9Ci0vLyBvdXQrPSIpIjsKLS8vIGlmICghZmlyc3QpIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIiAiICtvdXQ7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0vLyByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLS8vIH0KLS8vIH0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUklDUlVMRVMuSlNFRC0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERHcm91cENvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRER3JvdXBDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGUwMjFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERHcm91cENvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUHJpbnRlcjsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREdyb3VwQ29udGVudEltcGwgZXh0ZW5kcyBEVERSZXBlYXRhYmxlQ29udGVudEltcGwgaW1wbGVtZW50cyBEVERHcm91cENvbnRlbnQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cEtpbmQoKSA8ZW0+R3JvdXAgS2luZDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEdyb3VwS2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEVERHcm91cEtpbmQgR1JPVVBfS0lORF9FREVGQVVMVCA9IERUREdyb3VwS2luZC5TRVFVRU5DRV9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIERUREdyb3VwS2luZCBncm91cEtpbmQgPSBHUk9VUF9LSU5EX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjb250ZW50ID0gbnVsbDsKLQotCXB1YmxpYyBEVERHcm91cENvbnRlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREdyb3VwQ29udGVudCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFBvc2l0aW9uKERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQpIHsKLQkJRUxpc3QgbGlzdCA9IGdldENvbnRlbnQoKTsKLQkJcmV0dXJuIGxpc3QuaW5kZXhPZihjb250ZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnROYW1lKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnREZXRhaWwoKSB7Ci0JCURURFByaW50ZXIgcHJpbnRlciA9IG5ldyBEVERQcmludGVyKGZhbHNlKTsKLQkJcHJpbnRlci52aXNpdERUREdyb3VwQ29udGVudCh0aGlzKTsKLQotCQlyZXR1cm4gcHJpbnRlci5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZVJlcGVhdGFibGVDb250ZW50KCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBEVERHcm91cEtpbmQgZ2V0R3JvdXBLaW5kKCkgewotCQlyZXR1cm4gZ3JvdXBLaW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHcm91cEtpbmQoRFRER3JvdXBLaW5kIG5ld0dyb3VwS2luZCkgewotCQlEVERHcm91cEtpbmQgb2xkR3JvdXBLaW5kID0gZ3JvdXBLaW5kOwotCQlncm91cEtpbmQgPSBuZXdHcm91cEtpbmQgPT0gbnVsbCA/IEdST1VQX0tJTkRfRURFRkFVTFQgOiBuZXdHcm91cEtpbmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQX0tJTkQsIG9sZEdyb3VwS2luZCwgZ3JvdXBLaW5kKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkgewotCQkJY29udGVudCA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KERUREVsZW1lbnRDb250ZW50LmNsYXNzLCB0aGlzLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5ULCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQKTsKLQkJfQotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5UIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0Q29udGVudCgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5UIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0Q29udGVudCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQsIERUREdyb3VwQ29udGVudC5jbGFzcywgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlyZXR1cm4gZ2V0T2NjdXJyZW5jZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUF9LSU5EIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXBLaW5kKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQgOgotCQkJCXJldHVybiBnZXRDb250ZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlyZXR1cm4gb2NjdXJyZW5jZSAhPSBPQ0NVUlJFTkNFX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUF9LSU5EIDoKLQkJCQlyZXR1cm4gZ3JvdXBLaW5kICE9IEdST1VQX0tJTkRfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQgOgotCQkJCXJldHVybiBjb250ZW50ICE9IG51bGwgJiYgIWdldENvbnRlbnQoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlzZXRPY2N1cnJlbmNlKChEVERPY2N1cnJlbmNlVHlwZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fR1JPVVBfS0lORCA6Ci0JCQkJc2V0R3JvdXBLaW5kKChEVERHcm91cEtpbmQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQgOgotCQkJCWdldENvbnRlbnQoKS5jbGVhcigpOwotCQkJCWdldENvbnRlbnQoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXNldE9jY3VycmVuY2UoT0NDVVJSRU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUF9LSU5EIDoKLQkJCQlzZXRHcm91cEtpbmQoR1JPVVBfS0lORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5UIDoKLQkJCQlnZXRDb250ZW50KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cEtpbmQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZ3JvdXBLaW5kKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRESWRIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERJZEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGRlZWIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERJZEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBDRGF0YUNvbnRlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBEVERJZEhlbHBlciB7Ci0JcHVibGljIERURElkSGVscGVyKCkgewotCX0KLQotCXB1YmxpYyBTdHJpbmcgY29tcHV0ZUNvbnRlbnRJZChEVERFbGVtZW50Q29udGVudCBjb250ZW50KSB7Ci0JCVN0cmluZyBpZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERW1wdHlDb250ZW50KSB7Ci0JCQlpZCA9ICIjRU1QVFkiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERURFBDRGF0YUNvbnRlbnQpIHsKLQkJCWlkID0gIiNQQ0RBVEEiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVtcHR5Q29udGVudCkgewotCQkJaWQgPSAiI0VNUFRZIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJaWQgPSAiIyIgKyAoKERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSBjb250ZW50KS5nZXRSZWZlcmVuY2VkRWxlbWVudCgpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQlpZCA9ICIjIiArICgoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgY29udGVudCkuZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRER3JvdXBDb250ZW50KSB7Ci0JCQlpZCA9IGNvbXB1dGVHcm91cElkKChEVERHcm91cENvbnRlbnQpIGNvbnRlbnQpOwotCQl9Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGNvbXB1dGVHcm91cElkKERUREdyb3VwQ29udGVudCBncnApIHsKLQkJU3RyaW5nIGdyb3VwSWQgPSAiXyI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGdyb3VwSWQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZUNvbnRlbnRJZEdlbihEVERFbGVtZW50Q29udGVudCBjb250ZW50KSB7Ci0KLQkJU3RyaW5nIGlkID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbXB0eUNvbnRlbnQpIHsKLQkJCWlkID0gIiNFTVBUWSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFREUENEYXRhQ29udGVudCkgewotCQkJaWQgPSAiI1BDREFUQSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERW1wdHlDb250ZW50KSB7Ci0JCQlpZCA9ICIjRU1QVFkiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQlpZCA9ICIjIiArICgoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIGNvbnRlbnQpLmdldFJlZmVyZW5jZWRFbGVtZW50KCkuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCWlkID0gIiMiICsgKChEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KSBjb250ZW50KS5nZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpIHsKLQkJCWlkID0gY29tcHV0ZUdyb3VwSWQoKERUREdyb3VwQ29udGVudCkgY29udGVudCk7Ci0JCX0KLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVHcm91cElkR2VuKERUREdyb3VwQ29udGVudCBncnApIHsKLQotCQlTdHJpbmcgZ3JvdXBJZCA9ICJfIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZ3JvdXBJZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRESW50ZXJuYWxFbnRpdHlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRESW50ZXJuYWxFbnRpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNDdlNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREludGVybmFsRW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IGphdmEudGV4dC5DaGFyYWN0ZXJJdGVyYXRvcjsKLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFRESW50ZXJuYWxFbnRpdHlJbXBsIGV4dGVuZHMgRFRERW50aXR5Q29udGVudEltcGwgaW1wbGVtZW50cyBEVERJbnRlcm5hbEVudGl0eSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCXB1YmxpYyBEVERJbnRlcm5hbEVudGl0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRESW50ZXJuYWxFbnRpdHkoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2UoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoNjQpOwotCQlpZiAoZ2V0VmFsdWUoKSA9PSBudWxsKQotCQkJc2IuYXBwZW5kKCJcIlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSB7Ci0JCQlzYi5hcHBlbmQoIlwiIikuYXBwZW5kKHJlcGxhY2VEb3VibGVRdW90ZXMoZ2V0VmFsdWUoKSkpLmFwcGVuZCgiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8gdGhpcyBtZXRob2QgcmVwbGFjZXMgYW55IG9jY3VycmVuY2Ugb2YgJyAiICcgd2l0aCB0aGUgZXF1aXZhbGVudCB2YWx1ZQotCS8vIG9mICYjMzQ7Ci0JcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZURvdWJsZVF1b3RlcyhTdHJpbmcgaW5wdXQpIHsKLQkJU3RyaW5nQnVmZmVyIG5ld1ZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCVN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yIGNoYXJhY3RlcnMgPSBuZXcgU3RyaW5nQ2hhcmFjdGVySXRlcmF0b3IoaW5wdXQpOwotCi0JCXdoaWxlIChjaGFyYWN0ZXJzLmN1cnJlbnQoKSAhPSBDaGFyYWN0ZXJJdGVyYXRvci5ET05FKSB7Ci0JCQljaGFyIGN1cnJlbnQgPSBjaGFyYWN0ZXJzLmN1cnJlbnQoKTsKLQotCQkJaWYgKGN1cnJlbnQgPT0gJyInKSB7Ci0JCQkJbmV3VmFsdWUuYXBwZW5kKCImIzM0OyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQluZXdWYWx1ZS5hcHBlbmQoY3VycmVudCk7Ci0JCQl9Ci0JCQljaGFyYWN0ZXJzLm5leHQoKTsKLQkJfQotCi0JCXJldHVybiBuZXdWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFksIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFksIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5ULCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGdldERUREVudGl0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX1ZBTFVFIDoKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGdldERUREVudGl0eSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fVkFMVUUgOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCXNldERUREVudGl0eSgoRFRERW50aXR5KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX1ZBTFVFIDoKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQlzZXREVERFbnRpdHkoKERUREVudGl0eSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX1ZBTFVFIDoKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVEROb3RhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVEROb3RhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlYzkyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRETm90YXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETGV4aWNhbEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFBhdGhuYW1lVXRpbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ob3RhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVEROb3RhdGlvbkltcGwjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVEROb3RhdGlvbkltcGwjZ2V0U3lzdGVtSUQgPGVtPlN5c3RlbSBJRDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVEROb3RhdGlvbkltcGwjZ2V0UHVibGljSUQgPGVtPlB1YmxpYyBJRDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVEROb3RhdGlvbkltcGwjZ2V0RW50aXR5IDxlbT5FbnRpdHk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFRETm90YXRpb25JbXBsIGV4dGVuZHMgRFREQ29udGVudEltcGwgaW1wbGVtZW50cyBEVEROb3RhdGlvbiwgRFREQ29udGVudCB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhuYW1lKCkgewotCQlyZXR1cm4gRFREUGF0aG5hbWVVdGlsLm1ha2VQYXRoKG51bGwsICJOb3RhIiwgZ2V0TmFtZSgpLCAtMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCXB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLQkvLyBXb3VsZCByYXRoZXIgaGF2ZSBhbGwgdGhpcyBzdHVmZiBpbiBhIGJhc2UgY2xhc3MgYnV0IHRoZXNlCi0JLy8gY2xhc3NlcyBhcmUgaW5oZXJpdGluZyBmcm9tIHNvbWV0aW1lcyBkaWZmZXJlbnQgbW9mIGNsYXNzZXMKLQlEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRTdGFydE9mZnNldCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0RW5kT2Zmc2V0KHYpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21tZW50KCkgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbW1lbnQoKSA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tbWVudCA9IENPTU1FTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3lzdGVtSUQoKSA8ZW0+U3lzdGVtIElEPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0U3lzdGVtSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTeXN0ZW1JRCgpIDxlbT5TeXN0ZW0gSUQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRTeXN0ZW1JRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzeXN0ZW1JRCA9IFNZU1RFTV9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdWJsaWNJRCgpIDxlbT5QdWJsaWMgSUQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRQdWJsaWNJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1YmxpY0lEKCkgPGVtPlB1YmxpYyBJRDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFB1YmxpY0lEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY0lEID0gUFVCTElDX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW50aXR5KCkgPGVtPkVudGl0eTwvZW0+fScKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0RW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZW50aXR5ID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFRETm90YXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKLQkJcmV0dXJuIGNvbW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIG5ld0NvbW1lbnQpIHsKLQkJU3RyaW5nIG9sZENvbW1lbnQgPSBjb21tZW50OwotCQljb21tZW50ID0gbmV3Q29tbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQsIG9sZENvbW1lbnQsIGNvbW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIHN5c3RlbUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JRChTdHJpbmcgbmV3U3lzdGVtSUQpIHsKLQkJU3RyaW5nIG9sZFN5c3RlbUlEID0gc3lzdGVtSUQ7Ci0JCXN5c3RlbUlEID0gbmV3U3lzdGVtSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQsIG9sZFN5c3RlbUlELCBzeXN0ZW1JRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lEKCkgewotCQlyZXR1cm4gcHVibGljSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lEKFN0cmluZyBuZXdQdWJsaWNJRCkgewotCQlTdHJpbmcgb2xkUHVibGljSUQgPSBwdWJsaWNJRDsKLQkJcHVibGljSUQgPSBuZXdQdWJsaWNJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRCwgb2xkUHVibGljSUQsIHB1YmxpY0lEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFbnRpdHkoKSB7Ci0JCWlmIChlbnRpdHkgPT0gbnVsbCkgewotCQkJZW50aXR5ID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0KERUREV4dGVybmFsRW50aXR5LmNsYXNzLCB0aGlzLCBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRU5USVRZLCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX05PVEFUSU9OKTsKLQkJfQotCQlyZXR1cm4gZW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19EVERfRklMRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFkgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFbnRpdHkoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0VOVElUWSA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVudGl0eSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCwgRFRERmlsZS5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVCA6Ci0JCQkJcmV0dXJuIGdldENvbW1lbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1NZU1RFTV9JRCA6Ci0JCQkJcmV0dXJuIGdldFN5c3RlbUlEKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19QVUJMSUNfSUQgOgotCQkJCXJldHVybiBnZXRQdWJsaWNJRCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRU5USVRZIDoKLQkJCQlyZXR1cm4gZ2V0RW50aXR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVCA6Ci0JCQkJc2V0Q29tbWVudCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEIDoKLQkJCQlzZXRTeXN0ZW1JRCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEIDoKLQkJCQlzZXRQdWJsaWNJRCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRU5USVRZIDoKLQkJCQlnZXRFbnRpdHkoKS5jbGVhcigpOwotCQkJCWdldEVudGl0eSgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQgOgotCQkJCXNldENvbW1lbnQoQ09NTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEIDoKLQkJCQlzZXRTeXN0ZW1JRChTWVNURU1fSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRCA6Ci0JCQkJc2V0UHVibGljSUQoUFVCTElDX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFkgOgotCQkJCWdldEVudGl0eSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQgOgotCQkJCXJldHVybiBDT01NRU5UX0VERUZBVUxUID09IG51bGwgPyBjb21tZW50ICE9IG51bGwgOiAhQ09NTUVOVF9FREVGQVVMVC5lcXVhbHMoY29tbWVudCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQgOgotCQkJCXJldHVybiBTWVNURU1fSURfRURFRkFVTFQgPT0gbnVsbCA/IHN5c3RlbUlEICE9IG51bGwgOiAhU1lTVEVNX0lEX0VERUZBVUxULmVxdWFscyhzeXN0ZW1JRCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19QVUJMSUNfSUQgOgotCQkJCXJldHVybiBQVUJMSUNfSURfRURFRkFVTFQgPT0gbnVsbCA/IHB1YmxpY0lEICE9IG51bGwgOiAhUFVCTElDX0lEX0VERUZBVUxULmVxdWFscyhwdWJsaWNJRCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFkgOgotCQkJCXJldHVybiBlbnRpdHkgIT0gbnVsbCAmJiAhZ2V0RW50aXR5KCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb21tZW50OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNvbW1lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN5c3RlbUlEOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHN5c3RlbUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwdWJsaWNJRDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwdWJsaWNJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBEVEROb3RhdGlvbkltcGwKLQotLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotLy8KLQotLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotLy8gLy9wdWJsaWMgY2xhc3MgRFRETm90YXRpb25JbXBsIGV4dGVuZHMgRU5hbWVzcGFjZUltcGwgaW1wbGVtZW50cwotLy8gRFRETm90YXRpb24sIEVOYW1lc3BhY2UsIERURENvbnRlbnR7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbgotLy8gMjAwMi4iOwotLy8KLS8vIHB1YmxpYyBEVEROb3RhdGlvbkltcGwoKQotLy8gewotLy8gc3VwZXIoKTsKLS8vIH0KLS8vIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKQotLy8gewotLy8gcmV0dXJuIERURFBhdGhuYW1lVXRpbC5tYWtlUGF0aChudWxsLCAiTm90YSIsIGdldE5hbWUoKSwgLTEpOwotLy8gfQotLy8KLS8vIHB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKQotLy8gewotLy8gcmV0dXJuIG51bGw7Ci0vLyB9Ci0vLwotLy8gLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLS8vIC8vIFdvdWxkIHJhdGhlciBoYXZlIGFsbCB0aGlzIHN0dWZmIGluIGEgYmFzZSBjbGFzcyBidXQgdGhlc2UKLS8vIC8vIGNsYXNzZXMgYXJlIGluaGVyaXRpbmcgZnJvbSBzb21ldGltZXMgZGlmZmVyZW50IG1vZiBjbGFzc2VzCi0vLyBEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBTdHJpbmcgY29tbWVudCA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIFN0cmluZyBzeXN0ZW1JRCA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIFN0cmluZyBwdWJsaWNJRCA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIEVMaXN0IGVudGl0eSA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2V0Q29tbWVudCA9IGZhbHNlOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBib29sZWFuIHNldFN5c3RlbUlEID0gZmFsc2U7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2V0UHVibGljSUQgPSBmYWxzZTsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcml2YXRlIERURENvbnRlbnRJbXBsIGR0ZENvbnRlbnREZWxlZ2F0ZSA9IG51bGw7Ci0vLyAvKioKLS8vICogR2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLS8vICogQHJldHVybiB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLS8vICovCi0vLyBwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkKLS8vIHsKLS8vIHJldHVybiBsZXhJbmZvLmdldFN0YXJ0T2Zmc2V0KCk7Ci0vLyB9Ci0vLyAgCi0vLyAvKioKLS8vICogU2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLS8vICogQHBhcmFtIHYgVmFsdWUgdG8gYXNzaWduIHRvIHN0YXJ0T2Zmc2V0LgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCB2KQotLy8gewotLy8gbGV4SW5mby5zZXRTdGFydE9mZnNldCh2KTsKLS8vIH0KLS8vICAKLS8vIC8qKgotLy8gKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLS8vICogQHJldHVybiB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0vLyAqLwotLy8gcHVibGljIGludCBnZXRFbmRPZmZzZXQoKQotLy8gewotLy8gcmV0dXJuIGxleEluZm8uZ2V0RW5kT2Zmc2V0KCk7Ci0vLyB9Ci0vLyAgCi0vLyAvKioKLS8vICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0vLyAqIEBwYXJhbSB2IFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KQotLy8gewotLy8gbGV4SW5mby5zZXRFbmRPZmZzZXQodik7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVPYmplY3QgaW5pdEluc3RhbmNlKCkgewotLy8gc2V0RU1ldGFPYmooZUNsYXNzRFRETm90YXRpb24oKSk7Ci0vLyBpbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKTsKLS8vIHJldHVybiB0aGlzOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCB2b2lkIGluaXRJbnN0YW5jZURlbGVnYXRlcygpIHsKLS8vIHN1cGVyLmluaXRJbnN0YW5jZURlbGVnYXRlcygpOwotLy8KLS8vIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLnJlZlNldERlbGVnYXRlT3duZXIodGhpcyk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIERURFBhY2thZ2UgZVBhY2thZ2VEVEQoKSB7Ci0vLyByZXR1cm4KLS8vIChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVDbGFzcyBlQ2xhc3NEVEROb3RhdGlvbigpIHsKLS8vIHJldHVybgotLy8gKChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSkpLmdldERURE5vdGF0aW9uKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0vLyBpZiAodGhpcy5zZXRDb21tZW50KSByZXR1cm4gdGhpcy5jb21tZW50OwotLy8gZWxzZSByZXR1cm4KLS8vIChTdHJpbmcpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRETm90YXRpb25fQ29tbWVudCgpLmdldERlZmF1bHRWYWx1ZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIHZhbHVlKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNpbXBsZVNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX0NvbW1lbnQoKSx0aGlzLmNvbW1lbnQsdmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0Q29tbWVudCgpIHsKLS8vIGVOb3RpZnkocmVmQmFzaWNVbnNldFZhbHVlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX0NvbW1lbnQoKSkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0Q29tbWVudCgpIHsKLS8vIHJldHVybiBzZXRDb21tZW50OwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JRCgpIHsKLS8vIGlmICh0aGlzLnNldFN5c3RlbUlEKSByZXR1cm4gdGhpcy5zeXN0ZW1JRDsKLS8vIGVsc2UgcmV0dXJuCi0vLyAoU3RyaW5nKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1N5c3RlbUlEKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0U3lzdGVtSUQoU3RyaW5nIHZhbHVlKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNpbXBsZVNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1N5c3RlbUlEKCksdGhpcy5zeXN0ZW1JRCx2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXRTeXN0ZW1JRCgpIHsKLS8vIGVOb3RpZnkocmVmQmFzaWNVbnNldFZhbHVlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1N5c3RlbUlEKCkpKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldFN5c3RlbUlEKCkgewotLy8gcmV0dXJuIHNldFN5c3RlbUlEOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIFN0cmluZyBnZXRQdWJsaWNJRCgpIHsKLS8vIGlmICh0aGlzLnNldFB1YmxpY0lEKSByZXR1cm4gdGhpcy5wdWJsaWNJRDsKLS8vIGVsc2UgcmV0dXJuCi0vLyAoU3RyaW5nKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1B1YmxpY0lEKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0UHVibGljSUQoU3RyaW5nIHZhbHVlKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNpbXBsZVNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1B1YmxpY0lEKCksdGhpcy5wdWJsaWNJRCx2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXRQdWJsaWNJRCgpIHsKLS8vIGVOb3RpZnkocmVmQmFzaWNVbnNldFZhbHVlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1B1YmxpY0lEKCkpKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldFB1YmxpY0lEKCkgewotLy8gcmV0dXJuIHNldFB1YmxpY0lEOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIEVMaXN0IGdldEVudGl0eSgpIHsKLS8vIGlmICh0aGlzLmVudGl0eT09bnVsbCkgewotLy8gdGhpcy5lbnRpdHk9bmV3Q29sbGVjdGlvbih0aGlzLERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX0VudGl0eSgpLAotLy8gdHJ1ZSk7Ci0vLyB9Ci0vLyByZXR1cm4gdGhpcy5lbnRpdHk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURE5vdGF0aW9uKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQ6IHJldHVybiBnZXRDb21tZW50KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQ6IHJldHVybiBnZXRTeXN0ZW1JRCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEOiByZXR1cm4gZ2V0UHVibGljSUQoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0VOVElUWTogcmV0dXJuIGdldEVudGl0eSgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEU6IHJldHVybiBnZXREVERGaWxlKCk7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE9iamVjdCByZWZCYXNpY1ZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURE5vdGF0aW9uKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQ6Ci0vLyByZXR1cm4gdGhpcy5zZXRDb21tZW50PyB0aGlzLmNvbW1lbnQgOiBudWxsOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEOgotLy8gcmV0dXJuIHRoaXMuc2V0U3lzdGVtSUQ/IHRoaXMuc3lzdGVtSUQgOiBudWxsOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEOgotLy8gcmV0dXJuIHRoaXMuc2V0UHVibGljSUQ/IHRoaXMucHVibGljSUQgOiBudWxsOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRU5USVRZOgotLy8gcmV0dXJuIHRoaXMuZW50aXR5OwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEU6IHJldHVybgotLy8gKChJbnRlcm5hbEVPYmplY3QpZ2V0RHRkQ29udGVudERlbGVnYXRlKCkpLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRETm90YXRpb24oKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVDogcmV0dXJuIGlzU2V0Q29tbWVudCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEOiByZXR1cm4gaXNTZXRTeXN0ZW1JRCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEOiByZXR1cm4gaXNTZXRQdWJsaWNJRCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEU6IHJldHVybiBpc1NldERUREZpbGUoKTsKLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHN1cGVyLmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVEROb3RhdGlvbigpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19DT01NRU5UOiB7Ci0vLyBzZXRDb21tZW50KChTdHJpbmcpbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEOiB7Ci0vLyBzZXRTeXN0ZW1JRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRDogewotLy8gc2V0UHVibGljSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19EVERfRklMRTogewotLy8gc2V0RFRERmlsZSgoRFRERmlsZSluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLwotLy8gfQotLy8gc3VwZXIuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE5vdGlmaWNhdGlvbiBlQmFzaWNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLS8vIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUJhc2ljU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRETm90YXRpb24oKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5jb21tZW50OwotLy8gdGhpcy5jb21tZW50ID0gKFN0cmluZyluZXdWYWx1ZTsKLS8vIHRoaXMuc2V0Q29tbWVudCA9IHRydWU7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX0NvbW1lbnQoKSxvbGRWYWx1ZSxuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuc3lzdGVtSUQ7Ci0vLyB0aGlzLnN5c3RlbUlEID0gKFN0cmluZyluZXdWYWx1ZTsKLS8vIHRoaXMuc2V0U3lzdGVtSUQgPSB0cnVlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9TeXN0ZW1JRCgpLG9sZFZhbHVlLG5ld1ZhbHVlKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5wdWJsaWNJRDsKLS8vIHRoaXMucHVibGljSUQgPSAoU3RyaW5nKW5ld1ZhbHVlOwotLy8gdGhpcy5zZXRQdWJsaWNJRCA9IHRydWU7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1B1YmxpY0lEKCksb2xkVmFsdWUsbmV3VmFsdWUpOwotLy8gfQotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5lQmFzaWNTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRETm90YXRpb24oKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVDogewotLy8gdW5zZXRDb21tZW50KCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQ6IHsKLS8vIHVuc2V0U3lzdGVtSUQoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRDogewotLy8gdW5zZXRQdWJsaWNJRCgpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEU6IHsKLS8vIHVuc2V0RFRERmlsZSgpOwotLy8gcmV0dXJuOwotLy8gfQotLy8KLS8vIH0KLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgTm90aWZpY2F0aW9uIHJlZkJhc2ljVW5zZXRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1Vuc2V0VmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURE5vdGF0aW9uKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuY29tbWVudDsKLS8vIHRoaXMuY29tbWVudCA9IG51bGw7Ci0vLyB0aGlzLnNldENvbW1lbnQgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9Db21tZW50KCksb2xkVmFsdWUsZ2V0Q29tbWVudCgpKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1NZU1RFTV9JRDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5zeXN0ZW1JRDsKLS8vIHRoaXMuc3lzdGVtSUQgPSBudWxsOwotLy8gdGhpcy5zZXRTeXN0ZW1JRCA9IGZhbHNlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5VTlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1N5c3RlbUlEKCksb2xkVmFsdWUsZ2V0U3lzdGVtSUQoKSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19QVUJMSUNfSUQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMucHVibGljSUQ7Ci0vLyB0aGlzLnB1YmxpY0lEID0gbnVsbDsKLS8vIHRoaXMuc2V0UHVibGljSUQgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9QdWJsaWNJRCgpLG9sZFZhbHVlLGdldFB1YmxpY0lEKCkpOwotLy8gfQotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1Vuc2V0VmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIERURENvbnRlbnRJbXBsIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpIHsKLS8vIGlmIChkdGRDb250ZW50RGVsZWdhdGUgPT0gbnVsbCkgewotLy8gRFREUGFja2FnZSBwa2cgPQotLy8gKERURFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRFREUGFja2FnZS5lTlNfVVJJKTsKLS8vIGR0ZENvbnRlbnREZWxlZ2F0ZT0oRFREQ29udGVudEltcGwpcGtnLmVDcmVhdGVJbnN0YW5jZShwa2cuRFREX0NPTlRFTlQpOwotLy8gZHRkQ29udGVudERlbGVnYXRlLmluaXRJbnN0YW5jZSgpOwotLy8gfQotLy8gcmV0dXJuIGR0ZENvbnRlbnREZWxlZ2F0ZTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRUNsYXNzIGVDbGFzc0RURENvbnRlbnQoKSB7Ci0vLyByZXR1cm4gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuZUNsYXNzKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLS8vIHJldHVybiBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5nZXREVERGaWxlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0RFRERmlsZShEVERGaWxlIHZhbHVlKSB7Ci0vLyBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5zZXREVERGaWxlKHZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldERUREZpbGUoKSB7Ci0vLyBnZXREdGRDb250ZW50RGVsZWdhdGUoKS51bnNldERUREZpbGUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldERUREZpbGUoKSB7Ci0vLyByZXR1cm4gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuaXNTZXREVERGaWxlKCk7Ci0vLyB9Ci0vLyB9Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERQQ0RhdGFDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFBDRGF0YUNvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YzAwZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFBDRGF0YUNvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUENEYXRhQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFREUENEYXRhQ29udGVudEltcGwgZXh0ZW5kcyBEVERFbGVtZW50Q29udGVudEltcGwgaW1wbGVtZW50cyBEVERQQ0RhdGFDb250ZW50IHsKLQotCXB1YmxpYyBEVERQQ0RhdGFDb250ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERQQ0RhdGFDb250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5ULCBEVERHcm91cENvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudE5hbWUoKSB7Ci0JCXJldHVybiAiI1BDREFUQSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREUGFja2FnZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWIxZDJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVjb3JlUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBbnlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEREZWZhdWx0S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBDRGF0YUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5YTUxTY2hlbWFEZWZpbmVkVHlwZTsKLQotCi0vKioKLSAqIEBsYXN0Z2VuIGNsYXNzIERURFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgRFREUGFja2FnZSwKLSAqICAgICAgICAgIEVQYWNrYWdlIHt9Ci0gKi8KLXB1YmxpYyBjbGFzcyBEVERQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIERURFBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRFbGVtZW50Q29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkR3JvdXBDb250ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRBdHRyaWJ1dGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEVtcHR5Q29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkQW55Q29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkcGNEYXRhQ29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZFJlcGVhdGFibGVDb250ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRGaWxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRCYXNpY1R5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEVudW1lcmF0aW9uVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkTm90YXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEVudGl0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkRW50aXR5Q29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEludGVybmFsRW50aXR5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZENvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gZHRkT2NjdXJyZW5jZVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBkdGREZWZhdWx0S2luZEVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGR0ZEJhc2ljVHlwZUtpbmRFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBkdGRFbnVtR3JvdXBLaW5kRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gZHRkR3JvdXBLaW5kRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0geG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkKLQkgKiB0aGUgcGFja2FnZSBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD4KLQkgKiBOb3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljIGZhY3RvcnkKLQkgKiBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gb2YgdGhlCi0JICogcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLCBpZiBvbmUgYWxyZWFkeSBleGlzdHMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRFREUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIERUREZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvLyBwdWJsaWMgRFREUGFja2FnZUltcGwoKQotCS8vIHsKLQkvLyBzdXBlcihlTlNfVVJJKTsKLQkvLyBpbml0aWFsaXplUGFja2FnZShudWxsKTsKLQkvLyB9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwKLQkgKiBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiBTaW1wbGUgZGVwZW5kZW5jaWVzIGFyZQotCSAqIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbCBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nCi0JICogYW55dGhpbmcgZWxzZS4gVGhpcyBtZXRob2QgZHJpdmVzIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudAotCSAqIHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbCB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPgotCSAqIE9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2ggaGF2ZSBub3QKLQkgKiB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQgYW5kCi0JICogcmVnaXN0ZXJlZC4gVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczogbWV0YS1tb2RlbAotCSAqIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueSBhcmUgaW5pdGlhbGl6ZWQsCi0JICogc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+Ci0JICogSW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFREUGFja2FnZSBpbml0KCkgewotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlIGFuZCBpbnRlcmRlcGVuZGVuY2llcwotCQlEVERQYWNrYWdlSW1wbCB0aGVEVERQYWNrYWdlID0gKERURFBhY2thZ2VJbXBsKSAoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgRVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgRFREUGFja2FnZUltcGwoKSk7Ci0JCUVjb3JlUGFja2FnZUltcGwgdGhlRWNvcmVQYWNrYWdlID0gKEVjb3JlUGFja2FnZUltcGwpIChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoRWNvcmVQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoRWNvcmVQYWNrYWdlLmVOU19VUkkpIDogRWNvcmVQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gU3RlcCAxOiBjcmVhdGUgbWV0YS1tb2RlbCBvYmplY3RzCi0JCXRoZURURFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjb3JlUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBTdGVwIDI6IGNvbXBsZXRlIGluaXRpYWxpemF0aW9uCi0JCXRoZURURFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY29yZVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCXJldHVybiB0aGVEVERQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREVsZW1lbnRDb250ZW50KCkgewotCQlyZXR1cm4gZHRkRWxlbWVudENvbnRlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVsZW1lbnRDb250ZW50X0dyb3VwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEVsZW1lbnRDb250ZW50RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbGVtZW50Q29udGVudF9FbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEVsZW1lbnRDb250ZW50RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREdyb3VwQ29udGVudCgpIHsKLQkJcmV0dXJuIGR0ZEdyb3VwQ29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRER3JvdXBDb250ZW50X0dyb3VwS2luZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRHcm91cENvbnRlbnRFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREdyb3VwQ29udGVudF9Db250ZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEdyb3VwQ29udGVudEVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBkdGRBdHRyaWJ1dGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREF0dHJpYnV0ZV9Db21tZW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEF0dHJpYnV0ZUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFREQXR0cmlidXRlX0RlZmF1bHRLaW5kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEF0dHJpYnV0ZUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFREQXR0cmlidXRlX0RlZmF1bHRWYWx1ZVN0cmluZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRBdHRyaWJ1dGVFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRBdHRyaWJ1dGVFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRBdHRyaWJ1dGVFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREF0dHJpYnV0ZV9EVERFbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEF0dHJpYnV0ZUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERFbGVtZW50KCkgewotCQlyZXR1cm4gZHRkRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRERWxlbWVudF9Db21tZW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEVsZW1lbnRFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVsZW1lbnRfQ29udGVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbGVtZW50RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbGVtZW50X0RUREF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbGVtZW50RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREVtcHR5Q29udGVudCgpIHsKLQkJcmV0dXJuIGR0ZEVtcHR5Q29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERBbnlDb250ZW50KCkgewotCQlyZXR1cm4gZHRkQW55Q29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERQQ0RhdGFDb250ZW50KCkgewotCQlyZXR1cm4gZHRkcGNEYXRhQ29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpIHsKLQkJcmV0dXJuIGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudF9SZWZlcmVuY2VkRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudEVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERSZXBlYXRhYmxlQ29udGVudCgpIHsKLQkJcmV0dXJuIGR0ZFJlcGVhdGFibGVDb250ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERSZXBlYXRhYmxlQ29udGVudF9PY2N1cnJlbmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZFJlcGVhdGFibGVDb250ZW50RUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREZpbGUoKSB7Ci0JCXJldHVybiBkdGRGaWxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERGaWxlX0NvbW1lbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkRmlsZUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRERmlsZV9QYXJzZUVycm9yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEZpbGVFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREZpbGVfRFREQ29udGVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRGaWxlRUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERGaWxlX0RUREVudW1lcmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRGaWxlRUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREJhc2ljVHlwZSgpIHsKLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFREQmFzaWNUeXBlX0tpbmQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkQmFzaWNUeXBlRUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREVudW1lcmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIGR0ZEVudW1lcmF0aW9uVHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRERW51bWVyYXRpb25UeXBlX0tpbmQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkRW51bWVyYXRpb25UeXBlRUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbnVtZXJhdGlvblR5cGVfRFRERmlsZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbnVtZXJhdGlvblR5cGVFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFRETm90YXRpb24oKSB7Ci0JCXJldHVybiBkdGROb3RhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRETm90YXRpb25fQ29tbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGROb3RhdGlvbkVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRETm90YXRpb25fU3lzdGVtSUQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkTm90YXRpb25FQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERURE5vdGF0aW9uX1B1YmxpY0lEKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZE5vdGF0aW9uRUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVEROb3RhdGlvbl9FbnRpdHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkTm90YXRpb25FQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFRERW50aXR5KCkgewotCQlyZXR1cm4gZHRkRW50aXR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERFbnRpdHlfQ29tbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRFbnRpdHlFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREVudGl0eV9QYXJhbWV0ZXJFbnRpdHkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkRW50aXR5RUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbnRpdHlfQ29udGVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbnRpdHlFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVudGl0eV9QYXJtRW50aXR5UmVmKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEVudGl0eUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERW50aXR5X0VudGl0eVJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbnRpdHlFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVudGl0eV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEVudGl0eUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERW50aXR5X0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRW50aXR5RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREVudGl0eUNvbnRlbnQoKSB7Ci0JCXJldHVybiBkdGRFbnRpdHlDb250ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbnRpdHlDb250ZW50X0RUREVudGl0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbnRpdHlDb250ZW50RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREV4dGVybmFsRW50aXR5KCkgewotCQlyZXR1cm4gZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREV4dGVybmFsRW50aXR5X1N5c3RlbUlEKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEV4dGVybmFsRW50aXR5RUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERFeHRlcm5hbEVudGl0eV9QdWJsaWNJRCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRFeHRlcm5hbEVudGl0eUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERXh0ZXJuYWxFbnRpdHlfTm90YXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREV4dGVybmFsRW50aXR5X0VudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFRESW50ZXJuYWxFbnRpdHkoKSB7Ci0JCXJldHVybiBkdGRJbnRlcm5hbEVudGl0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRESW50ZXJuYWxFbnRpdHlfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkSW50ZXJuYWxFbnRpdHlFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VfRW50aXR5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCkgewotCQlyZXR1cm4gZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudF9FbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERURENvbnRlbnQoKSB7Ci0JCXJldHVybiBkdGRDb250ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERDb250ZW50X0RUREZpbGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkQ29udGVudEVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldERURE9jY3VycmVuY2VUeXBlKCkgewotCQlyZXR1cm4gZHRkT2NjdXJyZW5jZVR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldERURERlZmF1bHRLaW5kKCkgewotCQlyZXR1cm4gZHRkRGVmYXVsdEtpbmRFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldERUREJhc2ljVHlwZUtpbmQoKSB7Ci0JCXJldHVybiBkdGRCYXNpY1R5cGVLaW5kRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXREVERFbnVtR3JvdXBLaW5kKCkgewotCQlyZXR1cm4gZHRkRW51bUdyb3VwS2luZEVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0RFRER3JvdXBLaW5kKCkgewotCQlyZXR1cm4gZHRkR3JvdXBLaW5kRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRYTUxTY2hlbWFEZWZpbmVkVHlwZSgpIHsKLQkJcmV0dXJuIHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERGYWN0b3J5IGdldERUREZhY3RvcnkoKSB7Ci0JCXJldHVybiAoRFRERmFjdG9yeSkgZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiBUaGlzIG1ldGhvZCBpcyBndWFyZGVkCi0JICogdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKQotCQkJcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlkdGRFbGVtZW50Q29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfRUxFTUVOVF9DT05URU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbGVtZW50Q29udGVudEVDbGFzcywgRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVApOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVsZW1lbnRDb250ZW50RUNsYXNzLCBEVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UKTsKLQotCQlkdGRHcm91cENvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0dST1VQX0NPTlRFTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEdyb3VwQ29udGVudEVDbGFzcywgRFREX0dST1VQX0NPTlRFTlRfX0dST1VQX0tJTkQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEdyb3VwQ29udGVudEVDbGFzcywgRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQpOwotCi0JCWR0ZEF0dHJpYnV0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfQVRUUklCVVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRBdHRyaWJ1dGVFQ2xhc3MsIERURF9BVFRSSUJVVEVfX0NPTU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEF0dHJpYnV0ZUVDbGFzcywgRFREX0FUVFJJQlVURV9fREVGQVVMVF9LSU5EKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRBdHRyaWJ1dGVFQ2xhc3MsIERURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfU1RSSU5HKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRBdHRyaWJ1dGVFQ2xhc3MsIERURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRURfRU5USVRZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRBdHRyaWJ1dGVFQ2xhc3MsIERURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRURfRU5USVRZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRBdHRyaWJ1dGVFQ2xhc3MsIERURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5UKTsKLQotCQlkdGRFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRFbGVtZW50RUNsYXNzLCBEVERfRUxFTUVOVF9fQ09NTUVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRWxlbWVudEVDbGFzcywgRFREX0VMRU1FTlRfX0NPTlRFTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVsZW1lbnRFQ2xhc3MsIERURF9FTEVNRU5UX19EVERfQVRUUklCVVRFKTsKLQotCQlkdGRFbXB0eUNvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0VNUFRZX0NPTlRFTlQpOwotCi0JCWR0ZEFueUNvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0FOWV9DT05URU5UKTsKLQotCQlkdGRwY0RhdGFDb250ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9QQ19EQVRBX0NPTlRFTlQpOwotCi0JCWR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudEVDbGFzcywgRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX1JFRkVSRU5DRURfRUxFTUVOVCk7Ci0KLQkJZHRkUmVwZWF0YWJsZUNvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX1JFUEVBVEFCTEVfQ09OVEVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkUmVwZWF0YWJsZUNvbnRlbnRFQ2xhc3MsIERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0UpOwotCi0JCWR0ZEZpbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0ZJTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEZpbGVFQ2xhc3MsIERURF9GSUxFX19DT01NRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRGaWxlRUNsYXNzLCBEVERfRklMRV9fUEFSU0VfRVJST1IpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEZpbGVFQ2xhc3MsIERURF9GSUxFX19EVERfQ09OVEVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRmlsZUVDbGFzcywgRFREX0ZJTEVfX0RURF9FTlVNRVJBVElPTl9UWVBFKTsKLQotCQlkdGRCYXNpY1R5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0JBU0lDX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEJhc2ljVHlwZUVDbGFzcywgRFREX0JBU0lDX1RZUEVfX0tJTkQpOwotCi0JCWR0ZEVudW1lcmF0aW9uVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfRU5VTUVSQVRJT05fVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkRW51bWVyYXRpb25UeXBlRUNsYXNzLCBEVERfRU5VTUVSQVRJT05fVFlQRV9fS0lORCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRW51bWVyYXRpb25UeXBlRUNsYXNzLCBEVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUpOwotCi0JCWR0ZE5vdGF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9OT1RBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkTm90YXRpb25FQ2xhc3MsIERURF9OT1RBVElPTl9fQ09NTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkTm90YXRpb25FQ2xhc3MsIERURF9OT1RBVElPTl9fU1lTVEVNX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGROb3RhdGlvbkVDbGFzcywgRFREX05PVEFUSU9OX19QVUJMSUNfSUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZE5vdGF0aW9uRUNsYXNzLCBEVERfTk9UQVRJT05fX0VOVElUWSk7Ci0KLQkJZHRkRW50aXR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9FTlRJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEVudGl0eUVDbGFzcywgRFREX0VOVElUWV9fQ09NTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkRW50aXR5RUNsYXNzLCBEVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbnRpdHlFQ2xhc3MsIERURF9FTlRJVFlfX0NPTlRFTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVudGl0eUVDbGFzcywgRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbnRpdHlFQ2xhc3MsIERURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVudGl0eUVDbGFzcywgRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbnRpdHlFQ2xhc3MsIERURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSk7Ci0KLQkJZHRkRW50aXR5Q29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfRU5USVRZX0NPTlRFTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVudGl0eUNvbnRlbnRFQ2xhc3MsIERURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSk7Ci0KLQkJZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0VYVEVSTkFMX0VOVElUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MsIERURF9FWFRFUk5BTF9FTlRJVFlfX1NZU1RFTV9JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MsIERURF9FWFRFUk5BTF9FTlRJVFlfX1BVQkxJQ19JRCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MsIERURF9FWFRFUk5BTF9FTlRJVFlfX05PVEFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFeHRlcm5hbEVudGl0eUVDbGFzcywgRFREX0VYVEVSTkFMX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRURfRlJPTV9BTk9USEVSX0ZJTEUpOwotCi0JCWR0ZEludGVybmFsRW50aXR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9JTlRFUk5BTF9FTlRJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEludGVybmFsRW50aXR5RUNsYXNzLCBEVERfSU5URVJOQUxfRU5USVRZX19WQUxVRSk7Ci0KLQkJZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRUNsYXNzLCBEVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSk7Ci0KLQkJZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50RUNsYXNzLCBEVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZKTsKLQotCQlkdGRDb250ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9DT05URU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRDb250ZW50RUNsYXNzLCBEVERfQ09OVEVOVF9fRFREX0ZJTEUpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQlkdGRPY2N1cnJlbmNlVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oRFREX09DQ1VSUkVOQ0VfVFlQRSk7Ci0JCWR0ZERlZmF1bHRLaW5kRUVudW0gPSBjcmVhdGVFRW51bShEVERfREVGQVVMVF9LSU5EKTsKLQkJZHRkQmFzaWNUeXBlS2luZEVFbnVtID0gY3JlYXRlRUVudW0oRFREX0JBU0lDX1RZUEVfS0lORCk7Ci0JCWR0ZEVudW1Hcm91cEtpbmRFRW51bSA9IGNyZWF0ZUVFbnVtKERURF9FTlVNX0dST1VQX0tJTkQpOwotCQlkdGRHcm91cEtpbmRFRW51bSA9IGNyZWF0ZUVFbnVtKERURF9HUk9VUF9LSU5EKTsKLQkJeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFhNTF9TQ0hFTUFfREVGSU5FRF9UWVBFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkKLQkJCXJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlFY29yZVBhY2thZ2VJbXBsIHRoZUVjb3JlUGFja2FnZSA9IChFY29yZVBhY2thZ2VJbXBsKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQlkdGRHcm91cENvbnRlbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERSZXBlYXRhYmxlQ29udGVudCgpKTsKLQkJZHRkQXR0cmlidXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFQXR0cmlidXRlKCkpOwotCQlkdGRFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFQ2xhc3MoKSk7Ci0JCWR0ZEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERDb250ZW50KCkpOwotCQlkdGRFbXB0eUNvbnRlbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERFbGVtZW50Q29udGVudCgpKTsKLQkJZHRkQW55Q29udGVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERUREVsZW1lbnRDb250ZW50KCkpOwotCQlkdGRwY0RhdGFDb250ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFRERWxlbWVudENvbnRlbnQoKSk7Ci0JCWR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnQoKSk7Ci0JCWR0ZFJlcGVhdGFibGVDb250ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFRERWxlbWVudENvbnRlbnQoKSk7Ci0JCWR0ZEJhc2ljVHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY29yZVBhY2thZ2UuZ2V0RUNsYXNzKCkpOwotCQlkdGRFbnVtZXJhdGlvblR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVFbnVtKCkpOwotCQlkdGROb3RhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERURENvbnRlbnQoKSk7Ci0JCWR0ZEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERURENvbnRlbnQoKSk7Ci0JCWR0ZEV4dGVybmFsRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFRERW50aXR5Q29udGVudCgpKTsKLQkJZHRkSW50ZXJuYWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERFbnRpdHlDb250ZW50KCkpOwotCQlkdGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERDb250ZW50KCkpOwotCQlkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnQoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhkdGRFbGVtZW50Q29udGVudEVDbGFzcywgRFRERWxlbWVudENvbnRlbnQuY2xhc3MsICJEVERFbGVtZW50Q29udGVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbGVtZW50Q29udGVudF9Hcm91cCgpLCB0aGlzLmdldERUREdyb3VwQ29udGVudCgpLCB0aGlzLmdldERUREdyb3VwQ29udGVudF9Db250ZW50KCksICJncm91cCIsIG51bGwsIDAsIDEsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbGVtZW50Q29udGVudF9FbGVtZW50KCksIHRoaXMuZ2V0RFRERWxlbWVudCgpLCB0aGlzLmdldERUREVsZW1lbnRfQ29udGVudCgpLCAiZWxlbWVudCIsIG51bGwsIDAsIDEsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkR3JvdXBDb250ZW50RUNsYXNzLCBEVERHcm91cENvbnRlbnQuY2xhc3MsICJEVERHcm91cENvbnRlbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREdyb3VwQ29udGVudF9Hcm91cEtpbmQoKSwgdGhpcy5nZXREVERHcm91cEtpbmQoKSwgImdyb3VwS2luZCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRER3JvdXBDb250ZW50X0NvbnRlbnQoKSwgdGhpcy5nZXREVERFbGVtZW50Q29udGVudCgpLCB0aGlzLmdldERUREVsZW1lbnRDb250ZW50X0dyb3VwKCksICJjb250ZW50IiwgbnVsbCwgMSwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkQXR0cmlidXRlRUNsYXNzLCBEVERBdHRyaWJ1dGUuY2xhc3MsICJEVERBdHRyaWJ1dGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREF0dHJpYnV0ZV9Db21tZW50KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb21tZW50IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERBdHRyaWJ1dGVfRGVmYXVsdEtpbmQoKSwgdGhpcy5nZXREVEREZWZhdWx0S2luZCgpLCAiZGVmYXVsdEtpbmQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREF0dHJpYnV0ZV9EZWZhdWx0VmFsdWVTdHJpbmcoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlZmF1bHRWYWx1ZVN0cmluZyIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFREQXR0cmlidXRlX0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5X0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKSwgImF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpLCB0aGlzLmdldERUREVudGl0eSgpLCB0aGlzLmdldERUREVudGl0eV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCksICJhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERBdHRyaWJ1dGVfRFRERWxlbWVudCgpLCB0aGlzLmdldERUREVsZW1lbnQoKSwgdGhpcy5nZXREVERFbGVtZW50X0RUREF0dHJpYnV0ZSgpLCAiRFRERWxlbWVudCIsIG51bGwsIDAsIDEsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkRWxlbWVudEVDbGFzcywgRFRERWxlbWVudC5jbGFzcywgIkRUREVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREVsZW1lbnRfQ29tbWVudCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29tbWVudCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERWxlbWVudF9Db250ZW50KCksIHRoaXMuZ2V0RFRERWxlbWVudENvbnRlbnQoKSwgdGhpcy5nZXREVERFbGVtZW50Q29udGVudF9FbGVtZW50KCksICJjb250ZW50IiwgbnVsbCwgMSwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVsZW1lbnRfRFREQXR0cmlidXRlKCksIHRoaXMuZ2V0RFREQXR0cmlidXRlKCksIHRoaXMuZ2V0RFREQXR0cmlidXRlX0RUREVsZW1lbnQoKSwgIkRUREF0dHJpYnV0ZSIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEVtcHR5Q29udGVudEVDbGFzcywgRFRERW1wdHlDb250ZW50LmNsYXNzLCAiRFRERW1wdHlDb250ZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkQW55Q29udGVudEVDbGFzcywgRFREQW55Q29udGVudC5jbGFzcywgIkRUREFueUNvbnRlbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRwY0RhdGFDb250ZW50RUNsYXNzLCBEVERQQ0RhdGFDb250ZW50LmNsYXNzLCAiRFREUENEYXRhQ29udGVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50RUNsYXNzLCBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudC5jbGFzcywgIkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudF9SZWZlcmVuY2VkRWxlbWVudCgpLCB0aGlzLmdldERUREVsZW1lbnQoKSwgbnVsbCwgInJlZmVyZW5jZWRFbGVtZW50IiwgbnVsbCwgMSwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRSZXBlYXRhYmxlQ29udGVudEVDbGFzcywgRFREUmVwZWF0YWJsZUNvbnRlbnQuY2xhc3MsICJEVERSZXBlYXRhYmxlQ29udGVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERSZXBlYXRhYmxlQ29udGVudF9PY2N1cnJlbmNlKCksIHRoaXMuZ2V0RFRET2NjdXJyZW5jZVR5cGUoKSwgIm9jY3VycmVuY2UiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRGaWxlRUNsYXNzLCBEVERGaWxlLmNsYXNzLCAiRFRERmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFRERmlsZV9Db21tZW50KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb21tZW50IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERGaWxlX1BhcnNlRXJyb3IoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJwYXJzZUVycm9yIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERGaWxlX0RURENvbnRlbnQoKSwgdGhpcy5nZXREVERDb250ZW50KCksIHRoaXMuZ2V0RFREQ29udGVudF9EVERGaWxlKCksICJEVERDb250ZW50IiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERGaWxlX0RUREVudW1lcmF0aW9uVHlwZSgpLCB0aGlzLmdldERUREVudW1lcmF0aW9uVHlwZSgpLCB0aGlzLmdldERUREVudW1lcmF0aW9uVHlwZV9EVERGaWxlKCksICJEVERFbnVtZXJhdGlvblR5cGUiLCBudWxsLCAwLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRCYXNpY1R5cGVFQ2xhc3MsIERUREJhc2ljVHlwZS5jbGFzcywgIkRUREJhc2ljVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFREQmFzaWNUeXBlX0tpbmQoKSwgdGhpcy5nZXREVERCYXNpY1R5cGVLaW5kKCksICJraW5kIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkRW51bWVyYXRpb25UeXBlRUNsYXNzLCBEVERFbnVtZXJhdGlvblR5cGUuY2xhc3MsICJEVERFbnVtZXJhdGlvblR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREVudW1lcmF0aW9uVHlwZV9LaW5kKCksIHRoaXMuZ2V0RFRERW51bUdyb3VwS2luZCgpLCAia2luZCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERW51bWVyYXRpb25UeXBlX0RUREZpbGUoKSwgdGhpcy5nZXREVERGaWxlKCksIHRoaXMuZ2V0RFRERmlsZV9EVERFbnVtZXJhdGlvblR5cGUoKSwgIkRUREZpbGUiLCBudWxsLCAwLCAxLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZE5vdGF0aW9uRUNsYXNzLCBEVEROb3RhdGlvbi5jbGFzcywgIkRURE5vdGF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVEROb3RhdGlvbl9Db21tZW50KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb21tZW50IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVEROb3RhdGlvbl9TeXN0ZW1JRCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic3lzdGVtSUQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERURE5vdGF0aW9uX1B1YmxpY0lEKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwdWJsaWNJRCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRETm90YXRpb25fRW50aXR5KCksIHRoaXMuZ2V0RFRERXh0ZXJuYWxFbnRpdHkoKSwgdGhpcy5nZXREVERFeHRlcm5hbEVudGl0eV9Ob3RhdGlvbigpLCAiZW50aXR5IiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkRW50aXR5RUNsYXNzLCBEVERFbnRpdHkuY2xhc3MsICJEVERFbnRpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREVudGl0eV9Db21tZW50KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb21tZW50IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERFbnRpdHlfUGFyYW1ldGVyRW50aXR5KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicGFyYW1ldGVyRW50aXR5IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbnRpdHlfQ29udGVudCgpLCB0aGlzLmdldERUREVudGl0eUNvbnRlbnQoKSwgdGhpcy5nZXREVERFbnRpdHlDb250ZW50X0RUREVudGl0eSgpLCAiY29udGVudCIsIG51bGwsIDEsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbnRpdHlfUGFybUVudGl0eVJlZigpLCB0aGlzLmdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpLCB0aGlzLmdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZV9FbnRpdHkoKSwgInBhcm1FbnRpdHlSZWYiLCBudWxsLCAxLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERW50aXR5X0VudGl0eVJlZmVyZW5jZSgpLCB0aGlzLmdldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKSwgdGhpcy5nZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50X0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCksICJlbnRpdHlSZWZlcmVuY2UiLCBudWxsLCAwLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVudGl0eV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCksIHRoaXMuZ2V0RFREQXR0cmlidXRlKCksIHRoaXMuZ2V0RFREQXR0cmlidXRlX0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCksICJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlIiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbnRpdHlfQXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpLCB0aGlzLmdldERUREF0dHJpYnV0ZSgpLCB0aGlzLmdldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpLCAiYXR0cmlidXRlVHlwZVJlZmVyZW5jZSIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEVudGl0eUNvbnRlbnRFQ2xhc3MsIERUREVudGl0eUNvbnRlbnQuY2xhc3MsICJEVERFbnRpdHlDb250ZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVudGl0eUNvbnRlbnRfRFRERW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5X0NvbnRlbnQoKSwgIkRUREVudGl0eSIsIG51bGwsIDAsIDEsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MsIERUREV4dGVybmFsRW50aXR5LmNsYXNzLCAiRFRERXh0ZXJuYWxFbnRpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREV4dGVybmFsRW50aXR5X1N5c3RlbUlEKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzeXN0ZW1JRCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFRERXh0ZXJuYWxFbnRpdHlfUHVibGljSUQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInB1YmxpY0lEIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFeHRlcm5hbEVudGl0eV9Ob3RhdGlvbigpLCB0aGlzLmdldERURE5vdGF0aW9uKCksIHRoaXMuZ2V0RFRETm90YXRpb25fRW50aXR5KCksICJub3RhdGlvbiIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFeHRlcm5hbEVudGl0eV9FbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKCksIHRoaXMuZ2V0RFRERmlsZSgpLCBudWxsLCAiZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkSW50ZXJuYWxFbnRpdHlFQ2xhc3MsIERUREludGVybmFsRW50aXR5LmNsYXNzLCAiRFRESW50ZXJuYWxFbnRpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREludGVybmFsRW50aXR5X1ZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUVDbGFzcywgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmNsYXNzLCAiRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VfRW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5X1Bhcm1FbnRpdHlSZWYoKSwgImVudGl0eSIsIG51bGwsIDEsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudEVDbGFzcywgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudC5jbGFzcywgIkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRfRWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKSwgdGhpcy5nZXREVERFbnRpdHkoKSwgdGhpcy5nZXREVERFbnRpdHlfRW50aXR5UmVmZXJlbmNlKCksICJlbGVtZW50UmVmZXJlbmNlZEVudGl0eSIsIG51bGwsIDEsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkQ29udGVudEVDbGFzcywgRFREQ29udGVudC5jbGFzcywgIkRURENvbnRlbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFREQ29udGVudF9EVERGaWxlKCksIHRoaXMuZ2V0RFRERmlsZSgpLCB0aGlzLmdldERUREZpbGVfRFREQ29udGVudCgpLCAiRFRERmlsZSIsIG51bGwsIDAsIDEsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bShkdGRPY2N1cnJlbmNlVHlwZUVFbnVtLCBEVERPY2N1cnJlbmNlVHlwZS5jbGFzcywgIkRURE9jY3VycmVuY2VUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZE9jY3VycmVuY2VUeXBlRUVudW0sIERURE9jY3VycmVuY2VUeXBlLk9ORV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZE9jY3VycmVuY2VUeXBlRUVudW0sIERURE9jY3VycmVuY2VUeXBlLk9QVElPTkFMX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkT2NjdXJyZW5jZVR5cGVFRW51bSwgRFRET2NjdXJyZW5jZVR5cGUuT05FX09SX01PUkVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRPY2N1cnJlbmNlVHlwZUVFbnVtLCBEVERPY2N1cnJlbmNlVHlwZS5aRVJPX09SX01PUkVfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGR0ZERlZmF1bHRLaW5kRUVudW0sIERURERlZmF1bHRLaW5kLmNsYXNzLCAiRFRERGVmYXVsdEtpbmQiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwoZHRkRGVmYXVsdEtpbmRFRW51bSwgRFRERGVmYXVsdEtpbmQuSU1QTElFRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZERlZmF1bHRLaW5kRUVudW0sIERURERlZmF1bHRLaW5kLlJFUVVJUkVEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkRGVmYXVsdEtpbmRFRW51bSwgRFRERGVmYXVsdEtpbmQuRklYRURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGREZWZhdWx0S2luZEVFbnVtLCBEVEREZWZhdWx0S2luZC5OT0ZJWEVEX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShkdGRCYXNpY1R5cGVLaW5kRUVudW0sIERUREJhc2ljVHlwZUtpbmQuY2xhc3MsICJEVERCYXNpY1R5cGVLaW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEJhc2ljVHlwZUtpbmRFRW51bSwgRFREQmFzaWNUeXBlS2luZC5OT05FX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkQmFzaWNUeXBlS2luZEVFbnVtLCBEVERCYXNpY1R5cGVLaW5kLkNEQVRBX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkQmFzaWNUeXBlS2luZEVFbnVtLCBEVERCYXNpY1R5cGVLaW5kLklEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkQmFzaWNUeXBlS2luZEVFbnVtLCBEVERCYXNpY1R5cGVLaW5kLklEUkVGX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkQmFzaWNUeXBlS2luZEVFbnVtLCBEVERCYXNpY1R5cGVLaW5kLklEUkVGU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEJhc2ljVHlwZUtpbmRFRW51bSwgRFREQmFzaWNUeXBlS2luZC5FTlRJVFlfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRCYXNpY1R5cGVLaW5kRUVudW0sIERUREJhc2ljVHlwZUtpbmQuRU5USVRJRVNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRCYXNpY1R5cGVLaW5kRUVudW0sIERUREJhc2ljVHlwZUtpbmQuTk1UT0tFTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEJhc2ljVHlwZUtpbmRFRW51bSwgRFREQmFzaWNUeXBlS2luZC5OTVRPS0VOU19MSVRFUkFMKTsKLQotCQlpbml0RUVudW0oZHRkRW51bUdyb3VwS2luZEVFbnVtLCBEVERFbnVtR3JvdXBLaW5kLmNsYXNzLCAiRFRERW51bUdyb3VwS2luZCIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChkdGRFbnVtR3JvdXBLaW5kRUVudW0sIERUREVudW1Hcm91cEtpbmQuTkFNRV9UT0tFTl9HUk9VUF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEVudW1Hcm91cEtpbmRFRW51bSwgRFRERW51bUdyb3VwS2luZC5OT1RBVElPTl9HUk9VUF9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0oZHRkR3JvdXBLaW5kRUVudW0sIERUREdyb3VwS2luZC5jbGFzcywgIkRUREdyb3VwS2luZCIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChkdGRHcm91cEtpbmRFRW51bSwgRFRER3JvdXBLaW5kLlNFUVVFTkNFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkR3JvdXBLaW5kRUVudW0sIERUREdyb3VwS2luZC5DSE9JQ0VfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLmNsYXNzLCAiWE1MU2NoZW1hRGVmaW5lZFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuTk9ORV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLlNUUklOR19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLkJPT0xFQU5fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5GTE9BVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLkRPVUJMRV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLkRFQ0lNQUxfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5USU1FSU5TVEFOVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLlRJTUVEVVJBVElPTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLlJFQ1VSUklOR0lOU1RBTlRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5CSU5BUllfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5VUklfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5JTlRFR0VSX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuREFURV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLlRJTUVfTElURVJBTCk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotCi19IC8vIERURFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFlMjZiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkNoYWluSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURExleGljYWxJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUGF0aG5hbWVVdGlsOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbCNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsIGV4dGVuZHMgRFREQ29udGVudEltcGwgaW1wbGVtZW50cyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UsIEVOYW1lZEVsZW1lbnQsIERURENvbnRlbnQgewotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlEVERFbnRpdHkgZW50aXR5ID0gZ2V0RW50aXR5KCk7Ci0JCWlmIChlbnRpdHkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEVudGl0eSgpLmdldE5hbWUoKTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJcmV0dXJuIERURFBhdGhuYW1lVXRpbC5tYWtlUGF0aChudWxsLCAiUEVudCIsIGdldE5hbWUoKSwgLTEpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIERURE9iamVjdCBmaW5kT2JqZWN0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLQkvLyBXb3VsZCByYXRoZXIgaGF2ZSBhbGwgdGhpcyBzdHVmZiBpbiBhIGJhc2UgY2xhc3MgYnV0IHRoZXNlCi0JLy8gY2xhc3NlcyBhcmUgaW5oZXJpdGluZyBmcm9tIHNvbWV0aW1lcyBkaWZmZXJlbnQgbW9mIGNsYXNzZXMKLQlEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRTdGFydE9mZnNldCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0RW5kT2Zmc2V0KHYpOwotCX0KLQotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW50aXR5KCkgPGVtPkVudGl0eTwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERUREVudGl0eSBlbnRpdHkgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGdldEVudGl0eSgpIHsKLQkJaWYgKGVudGl0eSAhPSBudWxsICYmIGVudGl0eS5lSXNQcm94eSgpKSB7Ci0JCQlEVERFbnRpdHkgb2xkRW50aXR5ID0gZW50aXR5OwotCQkJZW50aXR5ID0gKERUREVudGl0eSkgRWNvcmVVdGlsLnJlc29sdmUoZW50aXR5LCB0aGlzKTsKLQkJCWlmIChlbnRpdHkgIT0gb2xkRW50aXR5KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSwgb2xkRW50aXR5LCBlbnRpdHkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGJhc2ljR2V0RW50aXR5KCkgewotCQlyZXR1cm4gZW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFbnRpdHkoRFRERW50aXR5IG5ld0VudGl0eSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEVERFbnRpdHkgb2xkRW50aXR5ID0gZW50aXR5OwotCQllbnRpdHkgPSBuZXdFbnRpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbmV3IE5vdGlmaWNhdGlvbkNoYWluSW1wbCg0KTsKLQkJCW1zZ3MuYWRkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZLCBvbGRFbnRpdHksIG5ld0VudGl0eSkpOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbnRpdHkoRFRERW50aXR5IG5ld0VudGl0eSkgewotCQlpZiAobmV3RW50aXR5ICE9IGVudGl0eSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBlbnRpdHkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGLCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld0VudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3RW50aXR5KS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEVudGl0eShuZXdFbnRpdHksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZLCBuZXdFbnRpdHksIG5ld0VudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFkgOgotCQkJCQlpZiAoZW50aXR5ICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGVudGl0eSkuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldEVudGl0eSgoRFRERW50aXR5KSBvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZIDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RW50aXR5KG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQsIERUREZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSA6Ci0JCQkJcmV0dXJuIGdldERUREZpbGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSA6Ci0JCQkJaWYgKHJlc29sdmUpCi0JCQkJCXJldHVybiBnZXRFbnRpdHkoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFbnRpdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFkgOgotCQkJCXNldEVudGl0eSgoRFRERW50aXR5KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZIDoKLQkJCQlzZXRFbnRpdHkoKERUREVudGl0eSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGVudGl0eSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy8gRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbAotCi0vLyArKysrKysrKysrKysrKysrKysrR0VORVJJQ1JVTEVTLkpTRUQrKysrKysrKysrKysrKysrKysrCi0vLyAvL3B1YmxpYyBjbGFzcyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsIGV4dGVuZHMgRU5hbWVzcGFjZUltcGwKLS8vIGltcGxlbWVudHMgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLCBFTmFtZXNwYWNlLCBEVERDb250ZW50ewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBEVERFbnRpdHkgZW50aXR5ID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgYm9vbGVhbiBzZXRFbnRpdHkgPSBmYWxzZTsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcml2YXRlIERURENvbnRlbnRJbXBsIGR0ZENvbnRlbnREZWxlZ2F0ZSA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVPYmplY3QgaW5pdEluc3RhbmNlKCkgewotLy8gc2V0RU1ldGFPYmooZUNsYXNzRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkpOwotLy8gaW5pdEluc3RhbmNlRGVsZWdhdGVzKCk7Ci0vLyByZXR1cm4gdGhpczsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgdm9pZCBpbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKSB7Ci0vLyBzdXBlci5pbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKTsKLS8vCi0KLS8vIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLnJlZlNldERlbGVnYXRlT3duZXIodGhpcyk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIERURFBhY2thZ2UgZVBhY2thZ2VEVEQoKSB7Ci0vLyByZXR1cm4KLS8vIChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVDbGFzcyBlQ2xhc3NEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKSB7Ci0vLyByZXR1cm4KLS8vICgoRFREUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEVERQYWNrYWdlLmVOU19VUkkpKS5nZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBEVERFbnRpdHkgZ2V0RW50aXR5KCkgewotLy8gdHJ5IHsKLS8vIGlmICh0aGlzLmVudGl0eSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLS8vIHRoaXMuZW50aXR5ID0gKERUREVudGl0eSkgKChJbnRlcm5hbEVPYmplY3QpdGhpcy5lbnRpdHkpLnJlc29sdmUodGhpcywKLS8vIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZV9FbnRpdHkoKSk7Ci0vLyBpZiAodGhpcy5lbnRpdHk9PW51bGwpIHRoaXMuc2V0RW50aXR5ID0gZmFsc2U7Ci0vLyByZXR1cm4gdGhpcy5lbnRpdHk7Ci0vLyB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIG51bGw7Ci0vLyB9Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0RW50aXR5KERUREVudGl0eSBsKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclNWUmVmZXJlbmNlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZV9FbnRpdHkoKSx0aGlzLmVudGl0eSxsKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldEVudGl0eSgpIHsKLS8vIHJlZlVuc2V0VmFsdWVGb3JTVlJlZmVyZW5jZShEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VfRW50aXR5KCksdGhpcy5lbnRpdHkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0RW50aXR5KCkgewotLy8gcmV0dXJuIHNldEVudGl0eTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWTogcmV0dXJuIGdldEVudGl0eSgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEU6IHJldHVybgotLy8gZ2V0RFRERmlsZSgpOwotLy8KLQotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE9iamVjdCByZWZCYXNpY1ZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFk6Ci0vLyBpZiAoIXRoaXMuc2V0RW50aXR5fHx0aGlzLmVudGl0eT09bnVsbCkgcmV0dXJuIG51bGw7Ci0vLyBpZiAoKChJbnRlcm5hbEVPYmplY3QpdGhpcy5lbnRpdHkpLnJlZklzRGVsZXRlZCgpKSB7dGhpcy5lbnRpdHk9bnVsbDsKLS8vIHRoaXMuc2V0RW50aXR5PWZhbHNlO30KLS8vIHJldHVybiB0aGlzLmVudGl0eTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFOiByZXR1cm4KLS8vICgoSW50ZXJuYWxFT2JqZWN0KWdldER0ZENvbnRlbnREZWxlZ2F0ZSgpKS5yZWZCYXNpY1ZhbHVlKGZlYXR1cmUpOwotLy8KLQotLy8gfQotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWTogcmV0dXJuCi0vLyBpc1NldEVudGl0eSgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEU6IHJldHVybgotLy8gaXNTZXREVERGaWxlKCk7Ci0vLwotCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHN1cGVyLmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZOiB7Ci0vLyBzZXRFbnRpdHkoKERUREVudGl0eSluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRTogewotLy8gc2V0RFRERmlsZSgoRFRERmlsZSluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLwotCi0vLyB9Ci0vLyBzdXBlci5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgTm90aWZpY2F0aW9uIGVCYXNpY1NldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotLy8gewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5lQmFzaWNTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmVudGl0eTsKLS8vIHRoaXMuZW50aXR5ID0gKERUREVudGl0eSluZXdWYWx1ZTsKLS8vIHRoaXMuc2V0RW50aXR5ID0gdHJ1ZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlX0VudGl0eSgpLG9sZFZhbHVlLG5ld1ZhbHVlKTsKLS8vIH0KLS8vCi0KLS8vIH0KLS8vIHJldHVybiBzdXBlci5lQmFzaWNTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWTogewotLy8gdW5zZXRFbnRpdHkoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFOiB7Ci0vLyB1bnNldERUREZpbGUoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vCi0KLS8vIH0KLS8vIHN1cGVyLmVVbnNldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgTm90aWZpY2F0aW9uIHJlZkJhc2ljVW5zZXRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1Vuc2V0VmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFk6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZW50aXR5OwotLy8gdGhpcy5lbnRpdHkgPSBudWxsOwotLy8gdGhpcy5zZXRFbnRpdHkgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VfRW50aXR5KCksb2xkVmFsdWUsbnVsbCk7Ci0vLyB9Ci0vLwotCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNVbnNldFZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBEVERDb250ZW50SW1wbCBnZXREdGRDb250ZW50RGVsZWdhdGUoKSB7Ci0vLyBpZiAoZHRkQ29udGVudERlbGVnYXRlID09IG51bGwpIHsKLS8vIERURFBhY2thZ2UgcGtnID0KLS8vIChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSk7Ci0vLyBkdGRDb250ZW50RGVsZWdhdGU9KERURENvbnRlbnRJbXBsKXBrZy5lQ3JlYXRlSW5zdGFuY2UocGtnLkRURF9DT05URU5UKTsKLS8vIGR0ZENvbnRlbnREZWxlZ2F0ZS5pbml0SW5zdGFuY2UoKTsKLS8vIH0KLS8vIHJldHVybiBkdGRDb250ZW50RGVsZWdhdGU7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVDbGFzcyBlQ2xhc3NEVERDb250ZW50KCkgewotLy8gcmV0dXJuIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLmVDbGFzcygpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0vLyByZXR1cm4gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuZ2V0RFRERmlsZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldERUREZpbGUoRFRERmlsZSB2YWx1ZSkgewotLy8gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuc2V0RFRERmlsZSh2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXREVERGaWxlKCkgewotLy8gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkudW5zZXREVERGaWxlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNTZXREVERGaWxlKCkgewotLy8gcmV0dXJuIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLmlzU2V0RFRERmlsZSgpOwotLy8gfQotLy8gfQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFJlcGVhdGFibGVDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFJlcGVhdGFibGVDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGYyMjdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERSZXBlYXRhYmxlQ29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERURFJlcGVhdGFibGVDb250ZW50SW1wbCBleHRlbmRzIERUREVsZW1lbnRDb250ZW50SW1wbCBpbXBsZW1lbnRzIERURFJlcGVhdGFibGVDb250ZW50IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2NjdXJyZW5jZSgpIDxlbT5PY2N1cnJlbmNlPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0T2NjdXJyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEVERPY2N1cnJlbmNlVHlwZSBPQ0NVUlJFTkNFX0VERUZBVUxUID0gRFRET2NjdXJyZW5jZVR5cGUuT05FX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZSA9IE9DQ1VSUkVOQ0VfRURFRkFVTFQ7Ci0KLQlwdWJsaWMgRFREUmVwZWF0YWJsZUNvbnRlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURFJlcGVhdGFibGVDb250ZW50KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDEyOCk7Ci0JCWlmIChnZXRPY2N1cnJlbmNlKCkuZ2V0VmFsdWUoKSAhPSBEVERPY2N1cnJlbmNlVHlwZS5PTkUpIHsKLQkJCWlmICh0aGlzIGluc3RhbmNlb2YgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgewotCQkJCXNiLmFwcGVuZCgiKCIpLmFwcGVuZCh1bnBhcnNlUmVwZWF0YWJsZUNvbnRlbnQoKSkuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2IuYXBwZW5kKHVucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpKTsKLQkJCX0KLQotCQkJLy8gTU9GMkVNRiBQb3J0Ci0JCQkvLyBFRW51bUxpdGVyYWwgbGl0ID0gZ2V0T2NjdXJyZW5jZSgpOwotCQkJRFRET2NjdXJyZW5jZVR5cGUgbGl0ID0gZ2V0T2NjdXJyZW5jZSgpOwotCQkJaWYgKGxpdCAhPSBudWxsKSB7Ci0JCQkJc2IuYXBwZW5kKChjaGFyKSBsaXQuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzYi5hcHBlbmQodW5wYXJzZVJlcGVhdGFibGVDb250ZW50KCkpOwotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiAgICAgICAgICAgIEpVU1RfT05FPSAtMSBPTkVfT1JfTU9SRT00MyBPUFRJT05BTD02MyBaRVJPX09SX01PUkU9NDIKLQkgKi8KLQlwdWJsaWMgRFRET2NjdXJyZW5jZVR5cGUgZ2V0T2NjdXJyZW5jZSgpIHsKLQkJcmV0dXJuIG9jY3VycmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9jY3VycmVuY2UoRFRET2NjdXJyZW5jZVR5cGUgbmV3T2NjdXJyZW5jZSkgewotCQlEVERPY2N1cnJlbmNlVHlwZSBvbGRPY2N1cnJlbmNlID0gb2NjdXJyZW5jZTsKLQkJb2NjdXJyZW5jZSA9IG5ld09jY3VycmVuY2UgPT0gbnVsbCA/IE9DQ1VSUkVOQ0VfRURFRkFVTFQgOiBuZXdPY2N1cnJlbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0UsIG9sZE9jY3VycmVuY2UsIG9jY3VycmVuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQsIERUREdyb3VwQ29udGVudC5jbGFzcywgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5ULCBEVERFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXJldHVybiBnZXRPY2N1cnJlbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlyZXR1cm4gb2NjdXJyZW5jZSAhPSBPQ0NVUlJFTkNFX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJc2V0T2NjdXJyZW5jZSgoRFRET2NjdXJyZW5jZVR5cGUpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXNldE9jY3VycmVuY2UoT0NDVVJSRU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAob2NjdXJyZW5jZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChvY2N1cnJlbmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIERURFJlcGVhdGFibGVDb250ZW50I3VucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpCi0JICovCi0JcHVibGljIFN0cmluZyB1bnBhcnNlUmVwZWF0YWJsZUNvbnRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBEVERFbGVtZW50Q29udGVudCNnZXRDb250ZW50TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50TmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGFiNmI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50OwotCi0KLQotcHVibGljIGNsYXNzIERUREFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgRFREUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRFREQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gRFREUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERURFN3aXRjaCBtb2RlbFN3aXRjaCA9IG5ldyBEVERTd2l0Y2goKSB7Ci0JCXB1YmxpYyBPYmplY3QgY2FzZURUREVsZW1lbnRDb250ZW50KERUREVsZW1lbnRDb250ZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREVsZW1lbnRDb250ZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRER3JvdXBDb250ZW50KERUREdyb3VwQ29udGVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERHcm91cENvbnRlbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERBdHRyaWJ1dGUoRFREQXR0cmlidXRlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREF0dHJpYnV0ZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREVsZW1lbnQoRFRERWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRERW1wdHlDb250ZW50KERUREVtcHR5Q29udGVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERFbXB0eUNvbnRlbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERBbnlDb250ZW50KERUREFueUNvbnRlbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFREQW55Q29udGVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURURFBDRGF0YUNvbnRlbnQoRFREUENEYXRhQ29udGVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERQQ0RhdGFDb250ZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERSZXBlYXRhYmxlQ29udGVudChEVERSZXBlYXRhYmxlQ29udGVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERSZXBlYXRhYmxlQ29udGVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREZpbGUoRFRERmlsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERGaWxlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFREQmFzaWNUeXBlKERUREJhc2ljVHlwZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERCYXNpY1R5cGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbnVtZXJhdGlvblR5cGUoRFRERW51bWVyYXRpb25UeXBlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREVudW1lcmF0aW9uVHlwZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURURE5vdGF0aW9uKERURE5vdGF0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURURE5vdGF0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRERW50aXR5KERUREVudGl0eSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERFbnRpdHlBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbnRpdHlDb250ZW50KERUREVudGl0eUNvbnRlbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRERW50aXR5Q29udGVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREV4dGVybmFsRW50aXR5KERUREV4dGVybmFsRW50aXR5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREV4dGVybmFsRW50aXR5QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRESW50ZXJuYWxFbnRpdHkoRFRESW50ZXJuYWxFbnRpdHkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRESW50ZXJuYWxFbnRpdHlBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFREQ29udGVudChEVERDb250ZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURURENvbnRlbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFTW9kZWxFbGVtZW50KEVNb2RlbEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRU1vZGVsRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVOYW1lZEVsZW1lbnQoRU5hbWVkRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFTmFtZWRFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRVR5cGVkRWxlbWVudChFVHlwZWRFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVUeXBlZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFU3RydWN0dXJhbEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVTdHJ1Y3R1cmFsRmVhdHVyZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFQXR0cmlidXRlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRUNsYXNzaWZpZXIoRUNsYXNzaWZpZXIgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRUNsYXNzaWZpZXJBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFQ2xhc3MoRUNsYXNzIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVDbGFzc0FkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVEYXRhVHlwZShFRGF0YVR5cGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRURhdGFUeXBlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRUVudW0oRUVudW0gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRUVudW1BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KSB0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCBjcmVhdGUgbWV0aG9kcyByZXR1cm4gbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlCi0JICogY2FzZXMuIEl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUKLQkgKiBjYXNlcyBhbnl3YXkuCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURURE5vdGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFREQ29udGVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREVudGl0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREVudGl0eUNvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERFeHRlcm5hbEVudGl0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREludGVybmFsRW50aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURURFJlcGVhdGFibGVDb250ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERWxlbWVudENvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERFbXB0eUNvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0IGNyZWF0ZSBtZXRob2RzIHJldHVybiBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUKLQkgKiBjYXNlcy4gSXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZQotCSAqIGNhc2VzIGFueXdheS4KLQkgKi8KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREFueUNvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERQQ0RhdGFDb250ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRER3JvdXBDb250ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFREQXR0cmlidXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERW51bWVyYXRpb25UeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFREQmFzaWNUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUNsYXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUF0dHJpYnV0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVFbnVtQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU1vZGVsRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVOYW1lZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFU3RydWN0dXJhbEZlYXR1cmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFRGF0YVR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRVR5cGVkRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVDbGFzc2lmaWVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vIERUREFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFRETWV0cmljcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURE1ldHJpY3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzExODhkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFRETWV0cmljcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci0KLQotcHVibGljIGNsYXNzIERURE1ldHJpY3MgewotCXByb3RlY3RlZCBEVERGaWxlIGR0ZEZpbGU7Ci0JcHJvdGVjdGVkIEhhc2h0YWJsZSBlbGVtZW50UmVmZXJlbmNlTWFwOwotCi0JcHVibGljIERURE1ldHJpY3MoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCXRoaXMuZHRkRmlsZSA9IGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIEhhc2h0YWJsZSBnZXRFbGVtZW50UmVmZXJlbmNlcygpIHsKLQkJaWYgKGVsZW1lbnRSZWZlcmVuY2VNYXAgPT0gbnVsbCkgewotCQkJZWxlbWVudFJlZmVyZW5jZU1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQkJCW5ldyBEVERWaXNpdG9yKCkgewotCi0JCQkJcHVibGljIHZvaWQgdmlzaXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJCQlEVERFbGVtZW50IGR0ZEVsZW1lbnQgPSBlbGVtZW50UmVmZXJlbmNlQ29udGVudC5nZXRSZWZlcmVuY2VkRWxlbWVudCgpOwotCQkJCQlPYmplY3QgdmlzaXRhdGlvbiA9IGVsZW1lbnRSZWZlcmVuY2VNYXAuZ2V0KGR0ZEVsZW1lbnQpOwotCQkJCQlpZiAodmlzaXRhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCQllbGVtZW50UmVmZXJlbmNlTWFwLnB1dChkdGRFbGVtZW50LCB2aXNpdGF0aW9uID0gbmV3IFZlY3RvcigpKTsKLQkJCQkJfQotCQkJCQkoKFZlY3RvcikgdmlzaXRhdGlvbikuYWRkRWxlbWVudChlbGVtZW50UmVmZXJlbmNlQ29udGVudCk7Ci0JCQkJfQotCQkJfS52aXNpdERUREZpbGUoZHRkRmlsZSk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFJlZmVyZW5jZU1hcDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVsZW1lbnRSZWZlcmVuY2VDb3VudChEVERFbGVtZW50IGR0ZEVsZW1lbnQpIHsKLQkJT2JqZWN0IGVsZW1lbnRSZWZlcmVuY2VzID0gZ2V0RWxlbWVudFJlZmVyZW5jZXMoKS5nZXQoZHRkRWxlbWVudCk7Ci0JCXJldHVybiBlbGVtZW50UmVmZXJlbmNlcyA9PSBudWxsID8gMCA6ICgoVmVjdG9yKSBlbGVtZW50UmVmZXJlbmNlcykuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBEVERFbGVtZW50IGdldExlYXN0UmVmZXJlbmNlZEVsZW1lbnQoKSB7Ci0JCURUREVsZW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IGxvd2VzdFJlZmVyZW5jZUNvdW50ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0KLQkJQ29sbGVjdGlvbiBlbGVtZW50cyA9IGR0ZEZpbGUubGlzdERUREVsZW1lbnQoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlEVERFbGVtZW50IGVsZW1lbnQgPSAoRFRERWxlbWVudCkgaS5uZXh0KCk7Ci0JCQlpbnQgY291bnQgPSBnZXRFbGVtZW50UmVmZXJlbmNlQ291bnQoZWxlbWVudCk7Ci0JCQlpZiAoY291bnQgPCBsb3dlc3RSZWZlcmVuY2VDb3VudCkgewotCQkJCXJlc3VsdCA9IGVsZW1lbnQ7Ci0JCQkJbG93ZXN0UmVmZXJlbmNlQ291bnQgPSBjb3VudDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBIYXNodGFibGUgZ2V0RWxlbWVudFJlZmVyZW5jZXNHZW4oKSB7Ci0KLQkJaWYgKGVsZW1lbnRSZWZlcmVuY2VNYXAgPT0gbnVsbCkgewotCQkJZWxlbWVudFJlZmVyZW5jZU1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQkJCW5ldyBEVERWaXNpdG9yKCkgewotCi0JCQkJcHVibGljIHZvaWQgdmlzaXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJCQlEVERFbGVtZW50IGR0ZEVsZW1lbnQgPSBlbGVtZW50UmVmZXJlbmNlQ29udGVudC5nZXRSZWZlcmVuY2VkRWxlbWVudCgpOwotCQkJCQlPYmplY3QgdmlzaXRhdGlvbiA9IGVsZW1lbnRSZWZlcmVuY2VNYXAuZ2V0KGR0ZEVsZW1lbnQpOwotCQkJCQlpZiAodmlzaXRhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCQllbGVtZW50UmVmZXJlbmNlTWFwLnB1dChkdGRFbGVtZW50LCB2aXNpdGF0aW9uID0gbmV3IFZlY3RvcigpKTsKLQkJCQkJfQotCQkJCQkoKFZlY3RvcikgdmlzaXRhdGlvbikuYWRkRWxlbWVudChlbGVtZW50UmVmZXJlbmNlQ29udGVudCk7Ci0JCQkJfQotCQkJfS52aXNpdERUREZpbGUoZHRkRmlsZSk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFJlZmVyZW5jZU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRFbGVtZW50UmVmZXJlbmNlQ291bnRHZW4oRFRERWxlbWVudCBkdGRFbGVtZW50KSB7Ci0KLQkJT2JqZWN0IGVsZW1lbnRSZWZlcmVuY2VzID0gZ2V0RWxlbWVudFJlZmVyZW5jZXMoKS5nZXQoZHRkRWxlbWVudCk7Ci0JCXJldHVybiBlbGVtZW50UmVmZXJlbmNlcyA9PSBudWxsID8gMCA6ICgoVmVjdG9yKSBlbGVtZW50UmVmZXJlbmNlcykuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFRERWxlbWVudCBnZXRMZWFzdFJlZmVyZW5jZWRFbGVtZW50R2VuKCkgewotCi0JCURUREVsZW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IGxvd2VzdFJlZmVyZW5jZUNvdW50ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0KLQkJQ29sbGVjdGlvbiBlbGVtZW50cyA9IGR0ZEZpbGUubGlzdERUREVsZW1lbnQoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlEVERFbGVtZW50IGVsZW1lbnQgPSAoRFRERWxlbWVudCkgaS5uZXh0KCk7Ci0JCQlpbnQgY291bnQgPSBnZXRFbGVtZW50UmVmZXJlbmNlQ291bnQoZWxlbWVudCk7Ci0JCQlpZiAoY291bnQgPCBsb3dlc3RSZWZlcmVuY2VDb3VudCkgewotCQkJCXJlc3VsdCA9IGVsZW1lbnQ7Ci0JCQkJbG93ZXN0UmVmZXJlbmNlQ291bnQgPSBjb3VudDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURE1vZGVsQnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURE1vZGVsQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGRkMWRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERNb2RlbEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW1MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGwuRFRERmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5BdHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuQXR0bGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuQ01Hcm91cE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5DTU5vZGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuQ01SZWZlcmVuY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuQ01SZXBlYXRhYmxlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkRURFNheEFydGlmYWN0VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkVsZW1lbnREZWNsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuRW50aXR5RGVjbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkVycm9yTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLk5vdGF0aW9uRGVjbDsKLQotcHVibGljIGNsYXNzIERURE1vZGVsQnVpbGRlciBleHRlbmRzIERURFNheEFydGlmYWN0VmlzaXRvciB7Ci0JRFREIGR0ZDsKLQlEVERVdGlsIGR0ZFV0aWw7Ci0JRFRERmlsZSBkdGRGaWxlOwotCVJlc291cmNlU2V0IHJlc291cmNlczsKLQotCXB1YmxpYyBEVERNb2RlbEJ1aWxkZXIoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBEVERVdGlsIGR0ZFV0aWwsIERURCBkdGQsIERUREZpbGUgZHRkRmlsZSkgewotCQl0aGlzLnJlc291cmNlcyA9IHJlc291cmNlczsKLQkJdGhpcy5kdGRVdGlsID0gZHRkVXRpbDsKLQkJdGhpcy5kdGQgPSBkdGQ7Ci0JCXRoaXMuZHRkRmlsZSA9IGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIERUREZhY3RvcnlJbXBsIGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoRFRERmFjdG9yeUltcGwpIGR0ZFV0aWwuZ2V0RmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0JCXJldHVybiBkdGRGaWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFREKERURCBkdGQpIHsKLQkJc3VwZXIudmlzaXREVEQoZHRkKTsKLQotCQkvLyAtIDJuZCBwYXNzIC0KLQkJLy8gZG8gZmluYWwgcHJvY2Vzc2luZyBmb3IgQXR0bGlzdHMgYW5kIGFkZGluZyBjb250ZW50TW9kZWwKLQkJYWRkQXR0bGlzdEFuZENvbnRlbnRNb2RlbChkdGQsIGR0ZEZpbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2woRWxlbWVudERlY2wgZWxlbWVudCkgewotCQkvLyBFbGVtZW50IG1pZ2h0IGhhdmUgYmVlbiBhZGRlZCBlYXJsaWVyIGJlY2F1c2UgaXQgaXMgcmVmZXJlbmNlZAotCQlTdHJpbmcgZGVjbE5hbWUgPSBlbGVtZW50LmdldE5vZGVOYW1lKCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigicHJvY2VzcyBFbGVtZW50RGVjbDoiICsgZGVjbE5hbWUgKTsKLQkJRFRERWxlbWVudCBkdGRlbGVtZW50ID0gKERUREVsZW1lbnQpIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5nZXQoZGVjbE5hbWUpOwotCQlpZiAoZHRkZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInByb2Nlc3MgRWxlbWVudERlY2wgLSBub3QgZm91bmQgLSBjcmVhdGUiCi0JCQkvLyApOwotCQkJZHRkZWxlbWVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbGVtZW50KCk7Ci0JCQlkdGRlbGVtZW50LnNldE5hbWUoZGVjbE5hbWUpOwotCQkJZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoZHRkZWxlbWVudCk7Ci0JCQlkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkucHV0KGRlY2xOYW1lLCBkdGRlbGVtZW50KTsKLQkJfQotCi0JCXN1cGVyLnZpc2l0RWxlbWVudERlY2woZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXROb3RhdGlvbkRlY2woTm90YXRpb25EZWNsIG5vdGF0aW9uKSB7Ci0JCS8vIE5vdGF0aW9uIG1pZ2h0IGhhdmUgYmVlbiBhZGRlZCBlYXJsaWVyIGJlY2F1c2UgaXQgaXMgcmVmZXJlbmNlZAotCQkvLyBieSBhbiBlbnRpdHkKLQkJRFRETm90YXRpb24gZHRkbm90ID0gZHRkRmlsZS5maW5kTm90YXRpb24obm90YXRpb24uZ2V0Tm9kZU5hbWUoKSk7Ci0JCWlmIChkdGRub3QgPT0gbnVsbCkgewotCQkJZHRkbm90ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURURE5vdGF0aW9uKCk7Ci0JCQlkdGRGaWxlLmdldERURE9iamVjdCgpLmFkZChkdGRub3QpOwotCQl9Ci0JCWR0ZG5vdC5zZXROYW1lKG5vdGF0aW9uLmdldE5vZGVOYW1lKCkpOwotCi0JCWlmIChub3RhdGlvbi5nZXRTeXN0ZW1JZCgpICE9IG51bGwpCi0JCQlkdGRub3Quc2V0U3lzdGVtSUQobm90YXRpb24uZ2V0U3lzdGVtSWQoKSk7Ci0JCWlmIChub3RhdGlvbi5nZXRQdWJsaWNJZCgpICE9IG51bGwpCi0JCQlkdGRub3Quc2V0UHVibGljSUQobm90YXRpb24uZ2V0UHVibGljSWQoKSk7Ci0KLQkJaWYgKG5vdGF0aW9uLmdldENvbW1lbnQoKSAhPSBudWxsKQotCQkJZHRkbm90LnNldENvbW1lbnQobm90YXRpb24uZ2V0Q29tbWVudCgpKTsKLQkJaWYgKG5vdGF0aW9uLmdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCWFkZEVycm9yTWVzc2FnZShub3RhdGlvbi5nZXRFcnJvck1lc3NhZ2UoKSwgZHRkbm90KTsKLQkJfQotCi0JCXN1cGVyLnZpc2l0Tm90YXRpb25EZWNsKG5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZURlY2woRW50aXR5RGVjbCBlbnRpdHkpIHsKLQkJLy8gVGhpcyBpcyBhIHBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlLgotCQkvLyBBZGQgdGhlIGxpbmsgdG8gdGhlIHJlYWwgZW50aXR5IHRoYXQgaXQgcmVmZXJlbmNlcwotCQlEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudFJlZiA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQkJZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQocGFybUVudFJlZik7Ci0KLQkJU3RyaW5nIGVudGl0eU5hbWUgPSBlbnRpdHkuZ2V0Tm9kZU5hbWUoKTsKLQotCQkvLyBBZGQgdGhlIHJlZmVyZW5jZSB0byB0aGUgRFRERW50aXR5Ci0JCURUREVudGl0eSBkdGRlbnRpdHkgPSBnZXREVERGaWxlKCkuZmluZEVudGl0eShlbnRpdHlOYW1lKTsKLQkJaWYgKGR0ZGVudGl0eSAhPSBudWxsKSB7Ci0JCQlwYXJtRW50UmVmLnNldEVudGl0eShkdGRlbnRpdHkpOwotCQl9Ci0JCWlmIChlbnRpdHkuZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJYWRkRXJyb3JNZXNzYWdlKGVudGl0eS5nZXRFcnJvck1lc3NhZ2UoKSwgZHRkZW50aXR5KTsKLQkJfQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImFkZGluZyBQRSByZWZlcmVuY2U6ICIgKyBkZWNsTmFtZSk7Ci0KLQkJc3VwZXIudmlzaXRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VEZWNsKGVudGl0eSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFeHRlcm5hbEVudGl0eURlY2woRW50aXR5RGVjbCBlbnRpdHkpIHsKLQkJRFRERW50aXR5IGR0ZEVudGl0eSA9IGNyZWF0ZURUREVudGl0eShlbnRpdHkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImFkZGluZyBlbnRpdHk6ICIgKyBkZWNsTmFtZSk7Ci0JCURUREV4dGVybmFsRW50aXR5IGV4dEVudGl0eSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFeHRlcm5hbEVudGl0eSgpOwotCQlkdGRFbnRpdHkuc2V0Q29udGVudChleHRFbnRpdHkpOwotCi0JCWZpbmlzaEV4dGVybmFsRW50aXR5KGV4dEVudGl0eSwgZW50aXR5KTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgZXh0IGVudGl0eSB0b01vZjogIiApOwotCQlpZiAoZHRkRW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkpIHsKLQotCQkJZHRkVXRpbC5nZXRQRVBvb2woKS5wdXQoIiUiICsgZW50aXR5LmdldE5vZGVOYW1lKCkgKyAiOyIsIGR0ZEVudGl0eSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJc3VwZXIudmlzaXRFeHRlcm5hbEVudGl0eURlY2woZW50aXR5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEludGVybmFsRW50aXR5RGVjbChFbnRpdHlEZWNsIGVudGl0eSkgewotCQlEVERFbnRpdHkgZHRkRW50aXR5ID0gY3JlYXRlRFRERW50aXR5KGVudGl0eSk7Ci0KLQkJRFRESW50ZXJuYWxFbnRpdHkgaW50RW50aXR5ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREludGVybmFsRW50aXR5KCk7Ci0JCWR0ZEVudGl0eS5zZXRDb250ZW50KGludEVudGl0eSk7Ci0JCWludEVudGl0eS5zZXRWYWx1ZShlbnRpdHkuZ2V0VmFsdWUoKSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGludCBlbnRpdHkgdG9Nb2Y6ICIgKTsKLQkJaWYgKGR0ZEVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKSB7Ci0JCQlkdGRVdGlsLmdldFBFUG9vbCgpLnB1dCgiJSIgKyBlbnRpdHkuZ2V0Tm9kZU5hbWUoKSArICI7IiwgZHRkRW50aXR5KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlzdXBlci52aXNpdEludGVybmFsRW50aXR5RGVjbChlbnRpdHkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRBdHRsaXN0QW5kQ29udGVudE1vZGVsKERURCBkdGQsIERUREZpbGUgZEZpbGUpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJhZGRBdHRMaXN0QW5kQ290ZW50TW9kZWwgLSBkdGQ6IiArCi0JCS8vIGR0ZC5nZXROYW1lKCkpOwotCQlFbnVtZXJhdGlvbiBlbiA9IGR0ZC5leHRlcm5hbEVsZW1lbnRzKCk7Ci0JCXdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJT2JqZWN0IGUgPSBlbi5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBFbGVtZW50RGVjbCkgewotCQkJCURUREVsZW1lbnQgZHRkZWxlbWVudCA9IChEVERFbGVtZW50KSBkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkuZ2V0KCgoRWxlbWVudERlY2wpIGUpLmdldE5vZGVOYW1lKCkpOwotCQkJCWlmIChkdGRlbGVtZW50ID09IG51bGwpIHsKLQkJCQkJZHRkZWxlbWVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbGVtZW50KCk7Ci0JCQkJCWR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKGR0ZGVsZW1lbnQpOwotCQkJCX0KLQkJCQlmaW5pc2hFbGVtZW50RGVjbChkdGRlbGVtZW50LCAoRWxlbWVudERlY2wpIGUpOwotCQkJfQotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEF0dGxpc3QpIHsKLQkJCQlwcm9jZXNzQXR0TGlzdCgoQXR0bGlzdCkgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzQXR0TGlzdChBdHRsaXN0IGF0dExpc3QpIHsKLQkJRFRERWxlbWVudCBlID0gKERUREVsZW1lbnQpIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5nZXQoYXR0TGlzdC5nZXROb2RlTmFtZSgpKTsKLQkJaWYgKGUgIT0gbnVsbCkgewotCQkJLy8gRWxlbWVudCBoYXMgYmVlbiBhZGRlZC4gQWRkIHRoZSBhdHRyaWJ1dGVzCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBwcm9jZXNzQXR0bGlzdCAtIGFkZGluZyBBdHRsaXN0OiIgKwotCQkJLy8gYXR0TGlzdC5nZXROb2RlTmFtZSgpKTsKLQkJCWNyZWF0ZUF0dHJpYnV0ZXMoZSwgYXR0TGlzdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiEhISEhISEhISBlbGVtZW50IGlzIG51bGwgIik7Ci0JCX0KLQl9Ci0KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8KLQkvLyBNZXRob2RzIGZvciBmaW5pc2hpbmcgdGhlIGltcG9ydCBvZiBhIERUREV4dGVybmFsRW50aXR5Ci0JLy8KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0Jdm9pZCBmaW5pc2hFeHRlcm5hbEVudGl0eShEVERFeHRlcm5hbEVudGl0eSBleHRFbnRpdHksIEVudGl0eURlY2wgZW50aXR5RGVjbCkgewotCQl1cGRhdGVTeXN0ZW1JRChleHRFbnRpdHksIGVudGl0eURlY2wpOwotCQlleHRFbnRpdHkuc2V0UHVibGljSUQoZW50aXR5RGVjbC5nZXRQdWJsaWNJZCgpKTsKLQotCQlTdHJpbmcgbm90YXRpb25OYW1lID0gZW50aXR5RGVjbC5nZXROb3RhdGlvbk5hbWUoKTsKLQkJaWYgKG5vdGF0aW9uTmFtZSAhPSBudWxsKSB7Ci0JCQlEVEROb3RhdGlvbiBkdGROb3RhdGlvbiA9IGNyZWF0ZU9yRmluZE5vdGF0aW9uKGV4dEVudGl0eSwgbm90YXRpb25OYW1lLCB0cnVlKTsKLQkJCWV4dEVudGl0eS5zZXROb3RhdGlvbihkdGROb3RhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRFRETm90YXRpb24gY3JlYXRlT3JGaW5kTm90YXRpb24oRFRERXh0ZXJuYWxFbnRpdHkgZXh0RW50aXR5LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBjcmVhdGUpIHsKLQkJRFRETm90YXRpb24gYU5vdGF0aW9uID0gZXh0RW50aXR5LmdldERUREVudGl0eSgpLmdldERUREZpbGUoKS5maW5kTm90YXRpb24obmFtZSk7Ci0JCWlmIChhTm90YXRpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGFOb3RhdGlvbjsKLQkJfQotCi0JCS8vCi0JCS8vIENyZWF0ZSBhIG5vdGF0aW9uIGZvciB0aGUgcmVmZXJlbmNlCi0JCS8vCi0JCWlmIChjcmVhdGUpIHsKLQkJCWFOb3RhdGlvbiA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVEROb3RhdGlvbigpOwotCQkJZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoYU5vdGF0aW9uKTsKLQkJCWFOb3RhdGlvbi5zZXROYW1lKG5hbWUpOwotCQl9Ci0JCXJldHVybiBhTm90YXRpb247Ci0JfQotCi0JLyoqCi0JICogVGhlIFN5c3RlbUlEIGF0dHJpYnV0ZSBpcyBzZXQgdG8gd2hhdGV2ZXIgdGhlIHVzZXIgZW50ZXJzIGUuZy4KLQkgKiBjb20vaWJtL2IyYi94bWltb2RlbHMveHh4LmR0ZC54bWkKLQkgKiAKLQkgKiBJbiB0aGUgdW5wYXJzZSgpIG1ldGhvZCwgcGFyc2Ugb3V0IHRoZSBEVEQgZmlsZSBuYW1lIGZyb20gdGhlIGNsYXNzcGF0aAotCSAqIG5hbWUuIGUuZy4gcmV0dXJucyB4eHguZHRkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVN5c3RlbUlEKERUREV4dGVybmFsRW50aXR5IGV4dEVudGl0eSwgRW50aXR5RGVjbCBlbnRpdHlEZWNsKSB7Ci0JCVN0cmluZyBzeXN0ZW1JZCA9IGVudGl0eURlY2wuZ2V0U3lzdGVtSWQoKTsKLQkJU3RyaW5nIHB1YmxpY0lkID0gZW50aXR5RGVjbC5nZXRQdWJsaWNJZCgpOwotCQlpZiAoc3lzdGVtSWQgIT0gbnVsbCkgewotCQkJVVJJUmVzb2x2ZXIgaWRSZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7Ci0JCQlTdHJpbmcgdXJpID0gaWRSZXNvbHZlci5yZXNvbHZlKGR0ZC5nZXROYW1lKCksIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCQlFeHRlcm5hbERURE1vZGVsIGVkID0gZHRkVXRpbC5nZXRFeHRlcm5hbERURE1vZGVsKHJlc291cmNlcywgdXJpKTsKLQkJCWlmIChlZCAhPSBudWxsKSB7Ci0JCQkJRFRERmlsZSByZWZlcmVuY2VEdGRGaWxlID0gZWQuZ2V0RXh0ZXJuYWxEVERGaWxlKCk7Ci0JCQkJZXh0RW50aXR5LnNldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUocmVmZXJlbmNlRHRkRmlsZSk7Ci0JCQkJZXh0RW50aXR5LnNldFN5c3RlbUlEKHN5c3RlbUlkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChlbnRpdHlEZWNsLmdldEVycm9yTWVzc2FnZSgpID09IG51bGwpIHsKLQkJCQkJRXJyb3JNZXNzYWdlIGR0ZEVycm9yID0gbmV3IEVycm9yTWVzc2FnZSgpOwotCQkJCQlkdGRFcnJvci5zZXRFcnJvck1lc3NhZ2UoRFREQ29yZU1lc3NhZ2VzLl9FUlJPUl9JTkNMX0ZJTEVfTE9BRF9GQUlMVVJFICsgIiAnIiArIHN5c3RlbUlkICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJYWRkRXJyb3JNZXNzYWdlKGR0ZEVycm9yLCBleHRFbnRpdHkuZ2V0RFRERW50aXR5KCkpOwotCQkJCX0KLQotCQkJCWlmIChzeXN0ZW1JZCAhPSBudWxsKSB7Ci0JCQkJCWV4dEVudGl0eS5zZXRTeXN0ZW1JRChzeXN0ZW1JZCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlleHRFbnRpdHkuc2V0U3lzdGVtSUQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9IC8vIGVuZCBvZiBpZiAoKQotCQllbHNlIHsKLQkJCS8vIHNldCB0aGUgc3lzdGVtIGlkIHRvIGJlICIiCi0JCQlleHRFbnRpdHkuc2V0U3lzdGVtSUQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgRFRERW50aXR5IGNyZWF0ZURUREVudGl0eShFbnRpdHlEZWNsIGVudGl0eSkgewotCQkvLyBjcmVhdGUgYW5kIGRvIHdoYXQgd2UgY2FuIHRvIGZpbGwgaW4gc29tZSBiYXNpYyB0aGluZ3MKLQkJRFRERW50aXR5IGR0ZEVudGl0eSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbnRpdHkoKTsKLQkJZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoZHRkRW50aXR5KTsKLQotCQlkdGRFbnRpdHkuc2V0TmFtZShlbnRpdHkuZ2V0Tm9kZU5hbWUoKSk7Ci0JCWR0ZEVudGl0eS5zZXRQYXJhbWV0ZXJFbnRpdHkoZW50aXR5LmlzUGFyYW1ldGVyKCkpOwotCQlpZiAoZW50aXR5LmdldENvbW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlkdGRFbnRpdHkuc2V0Q29tbWVudChlbnRpdHkuZ2V0Q29tbWVudCgpKTsKLQkJfQotCQlpZiAoZW50aXR5LmdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCWFkZEVycm9yTWVzc2FnZShlbnRpdHkuZ2V0RXJyb3JNZXNzYWdlKCksIGR0ZEVudGl0eSk7Ci0JCX0KLQotCQlyZXR1cm4gZHRkRW50aXR5OwotCX0KLQotCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vCi0JLy8gTWV0aG9kcyBmb3IgZmluaXNoaW5nIHRoZSBpbXBvcnQgb2YgYSBEVERFbGVtZW50Ci0JLy8KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JcHVibGljIHZvaWQgZmluaXNoRWxlbWVudERlY2woRFRERWxlbWVudCBkdGRFbGVtZW50LCBFbGVtZW50RGVjbCBlZCkgewotCQlkdGRFbGVtZW50LnNldE5hbWUoZWQuZ2V0Tm9kZU5hbWUoKSk7Ci0KLQkJQ01Ob2RlIGNtTm9kZSA9IGVkLmdldENvbnRlbnRNb2RlbE5vZGUoKTsKLQotCQlpZiAoZWQuZ2V0Q29tbWVudCgpICE9IG51bGwpIHsKLQkJCWR0ZEVsZW1lbnQuc2V0Q29tbWVudChlZC5nZXRDb21tZW50KCkpOwotCQl9Ci0JCWlmIChlZC5nZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQlhZGRFcnJvck1lc3NhZ2UoZWQuZ2V0RXJyb3JNZXNzYWdlKCksIGR0ZEVsZW1lbnQpOwotCQl9Ci0KLQkJaWYgKGNtTm9kZSBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQlDTUJhc2ljTm9kZSBibiA9IChDTUJhc2ljTm9kZSkgY21Ob2RlOwotCQkJc3dpdGNoIChibi5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIENNTm9kZVR5cGUuRU1QVFkgOgotCQkJCQlEVERFbXB0eUNvbnRlbnQgZW1wdHlDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVtcHR5Q29udGVudCgpOwotCQkJCQlkdGRFbGVtZW50LnNldENvbnRlbnQoZW1wdHlDb250ZW50KTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIENNTm9kZVR5cGUuQU5ZIDoKLQkJCQkJRFREQW55Q29udGVudCBhbnlDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREFueUNvbnRlbnQoKTsKLQkJCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGFueUNvbnRlbnQpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQ01Ob2RlVHlwZS5QQ0RBVEEgOgotCQkJCQlEVERQQ0RhdGFDb250ZW50IHBjRGF0YSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERQQ0RhdGFDb250ZW50KCk7Ci0JCQkJCWR0ZEVsZW1lbnQuc2V0Q29udGVudChwY0RhdGEpOwotCQkJfQotCi0JCX0KLQkJZWxzZSBpZiAoY21Ob2RlIGluc3RhbmNlb2YgQ01SZWZlcmVuY2VOb2RlKSB7Ci0JCQlDTVJlZmVyZW5jZU5vZGUgcm4gPSAoQ01SZWZlcmVuY2VOb2RlKSBjbU5vZGU7Ci0JCQlpZiAocm4uZ2V0VHlwZSgpID09IENNTm9kZVR5cGUuRU5USVRZX1JFRkVSRU5DRSkgewotCQkJCVN0cmluZyBlbnRpdHlOYW1lID0gcm4uZ2V0TmFtZSgpLnRyaW0oKTsKLQotCQkJCURUREVudGl0eSBhbkVudGl0eSA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KGVudGl0eU5hbWUpOwotCQkJCWlmIChhbkVudGl0eSAhPSBudWxsKSB7Ci0JCQkJCS8vCi0JCQkJCS8vIENyZWF0ZSBhbiBEVERFbnRpdHlSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZAotCQkJCQkvLyBlbGVtZW50Ci0JCQkJCS8vCi0JCQkJCURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgZW5SZWYgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpOwotCQkJCQllblJlZi5zZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eShhbkVudGl0eSk7Ci0KLQkJCQkJRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPSBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkJCQkJZW5SZWYuc2V0T2NjdXJyZW5jZShvY2N1cnJlbmNlVHlwZSk7Ci0KLQkJCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGVuUmVmKTsKLQkJCQl9Ci0JCQkJZWxzZSB7IC8vIGNyZWF0ZSBkZWZhdWx0IGNvbnRlbnQKLQkJCQkJRFRERW1wdHlDb250ZW50IGVtcHR5Q29udGVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbXB0eUNvbnRlbnQoKTsKLQkJCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGVtcHR5Q29udGVudCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8KLQkJCQkvLyBGaW5kIHRoZSByZWFsIGVsZW1lbnQgZm9yIHRoaXMgZWxlbWVudCByZWZlcmVuY2VzCi0JCQkJLy8gSWYgdGhlIHJlYWwgZWxlbWVudCBkb2VzIG5vdCB5ZXQgZXhpc3QsIGNyZWF0ZSBpdAotCQkJCS8vCi0JCQkJRFRERWxlbWVudCBhbkVsZW1lbnQgPSBjcmVhdGVPckZpbmRFbGVtZW50KHJuLmdldE5hbWUoKSwgZHRkRWxlbWVudCk7Ci0KLQkJCQkvLwotCQkJCS8vIENyZWF0ZSBhbiBEVERFbGVtZW50UmVmZXJlbmNlIGFuZCBzZXQgaXRzIHJlZmVyZW5jZWQKLQkJCQkvLyBlbGVtZW50Ci0JCQkJLy8KLQkJCQlEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtUmVmID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCk7Ci0JCQkJZWxlbVJlZi5zZXRSZWZlcmVuY2VkRWxlbWVudChhbkVsZW1lbnQpOwotCi0JCQkJRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPSBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkJCQllbGVtUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCi0JCQkJLy8gc2V0Q29udGVudCB0byBEVERFbGVtZW50UmVmZXJlbmNlCi0JCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGVsZW1SZWYpOwotCi0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoY21Ob2RlIGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCUNNR3JvdXBOb2RlIGdycE5vZGUgPSAoQ01Hcm91cE5vZGUpIGNtTm9kZTsKLQkJCURUREdyb3VwQ29udGVudCBncm91cENvbnRlbnQgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRER3JvdXBDb250ZW50KCk7Ci0JCQlEVERHcm91cEtpbmQgZ3JvdXBLaW5kID0gRFRER3JvdXBLaW5kLmdldChjb21wdXRlTW9mR3JvdXBLaW5kKGdycE5vZGUuZ2V0R3JvdXBLaW5kKCkpKTsKLQkJCWdyb3VwQ29udGVudC5zZXRHcm91cEtpbmQoZ3JvdXBLaW5kKTsKLQkJCURURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKGdycE5vZGUpKTsKLQkJCWdyb3VwQ29udGVudC5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQotCQkJLy8ganVzdCB1c2UgdGhlIGxvY2F0b3IgZm9yIHRoZSBlbGVtZW50IGFzIHRoZSBjbG9zZXN0IGd1ZXNzCi0JCQlwcm9jZXNzR3JvdXBDb250ZW50KGdyb3VwQ29udGVudCwgZ3JwTm9kZSk7Ci0JCQlkdGRFbGVtZW50LnNldENvbnRlbnQoZ3JvdXBDb250ZW50KTsKLQkJfQotCQllbHNlIGlmIChjbU5vZGUgPT0gbnVsbCkgewotCQkJLy8gYmFkIHRoaW5nIGhhcHBlbmVkIGhlcmUsIGp1c3QgY3JlYXRlIGEgcGNkYXRhCi0JCQlEVERFbXB0eUNvbnRlbnQgZW1wdHlDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVtcHR5Q29udGVudCgpOwotCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGVtcHR5Q29udGVudCk7Ci0JCX0KLQotCi0JfQotCi0KLQkvKioKLQkgKiBBZGQgYSBuZXcgZ3JvdXAgdG8gdGhlIGN1cnJlbnQgZ3JvdXAKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IC0KLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgbm9kZSBmb3IgdGhpcyBncm91cCBlbGVtZW50Ci0JICogQHBhcmFtIG9wMU5vZGUgLQotCSAqICAgICAgICAgICAgdGhlIGdyb3VwIGUuZy4gKGEsYikKLQkgKiBAcGFyYW0gb3AyTm9kZSAtCi0JICogICAgICAgICAgICBzZXQgb25seSBpZiBjYWxsZWQgYnkgcHJvY2Vzc0NNMW9wIGUuZy4gKGEsYikrCi0JICovCi0Jdm9pZCBwcm9jZXNzR3JvdXBDb250ZW50KERUREdyb3VwQ29udGVudCBwYXJlbnQsIENNR3JvdXBOb2RlIGdycE5vZGUpIHsKLQkJRW51bWVyYXRpb24gY2hpbGRyZW4gPSBncnBOb2RlLmdldENoaWxkcmVuKCkuZWxlbWVudHMoKTsKLQkJRFRERmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSgpOwotCQl3aGlsZSAoY2hpbGRyZW4uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCUNNTm9kZSBjbm9kZSA9IChDTU5vZGUpIGNoaWxkcmVuLm5leHRFbGVtZW50KCk7Ci0KLQkJCWlmIChjbm9kZSBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKSB7Ci0JCQkJQ01Hcm91cE5vZGUgZ05vZGUgPSAoQ01Hcm91cE5vZGUpIGNub2RlOwotCQkJCURUREdyb3VwQ29udGVudCBncm91cENvbnRlbnQgPSBmYWN0b3J5LmNyZWF0ZURUREdyb3VwQ29udGVudCgpOwotCQkJCURUREdyb3VwS2luZCBncm91cEtpbmQgPSBEVERHcm91cEtpbmQuZ2V0KGNvbXB1dGVNb2ZHcm91cEtpbmQoZ05vZGUuZ2V0R3JvdXBLaW5kKCkpKTsKLQkJCQlncm91cENvbnRlbnQuc2V0R3JvdXBLaW5kKGdyb3VwS2luZCk7Ci0JCQkJRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPSBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2UoZ05vZGUpKTsKLQkJCQlncm91cENvbnRlbnQuc2V0T2NjdXJyZW5jZShvY2N1cnJlbmNlVHlwZSk7Ci0KLQkJCQlwYXJlbnQuZ2V0Q29udGVudCgpLmFkZChncm91cENvbnRlbnQpOwotCQkJCXByb2Nlc3NHcm91cENvbnRlbnQoZ3JvdXBDb250ZW50LCBnTm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjbm9kZSBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQkJQ01CYXNpY05vZGUgbiA9IChDTUJhc2ljTm9kZSkgY25vZGU7Ci0JCQkJaWYgKG4uZ2V0VHlwZSgpID09IENNTm9kZVR5cGUuUENEQVRBKSB7Ci0JCQkJCS8vIENyZWF0ZSBhIERURFBDRGF0YUNvbnRlbnQgZm9yIGEgbGVhZiBQQ0RhdGEgbm9kZQotCQkJCQkvLwotCQkJCQlEVERQQ0RhdGFDb250ZW50IHBjRGF0YSA9IGZhY3RvcnkuY3JlYXRlRFREUENEYXRhQ29udGVudCgpOwotCQkJCQkvLyBBZGQgI1BDREFUQSB0byB0aGUgR3JvdXAsIGkuZSBNaXhlZCBjb250ZW50IG1vZGVsCi0JCQkJCXBhcmVudC5nZXRDb250ZW50KCkuYWRkKHBjRGF0YSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoY25vZGUgaW5zdGFuY2VvZiBDTVJlZmVyZW5jZU5vZGUpIHsKLQkJCQlDTVJlZmVyZW5jZU5vZGUgcm4gPSAoQ01SZWZlcmVuY2VOb2RlKSBjbm9kZTsKLQkJCQlpZiAocm4uZ2V0VHlwZSgpID09IENNTm9kZVR5cGUuRUxFTUVOVF9SRUZFUkVOQ0UpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJDTSBFbGVtZW50IFJlZiBuYW1lOiAiICsKLQkJCQkJLy8gcm4uZ2V0TmFtZSgpKTsKLQkJCQkJLy8KLQkJCQkJLy8gQ3JlYXRlIGFuIERUREVsZW1lbnRSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZAotCQkJCQkvLyBlbGVtZW50Ci0JCQkJCS8vCi0JCQkJCURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGVsZW1SZWYgPSBmYWN0b3J5LmNyZWF0ZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCk7Ci0KLQkJCQkJLy8KLQkJCQkJLy8gRmluZCB0aGUgcmVhbCBlbGVtZW50IGZvciB0aGlzIGVsZW1lbnQgcmVmZXJlbmNlcwotCQkJCQkvLyBJZiB0aGUgcmVhbCBlbGVtZW50IGRvZXMgbm90IHlldCBleGlzdCwgY3JlYXRlIGl0Ci0JCQkJCS8vCi0JCQkJCURUREVsZW1lbnQgYW5FbGVtZW50ID0gY3JlYXRlT3JGaW5kRWxlbWVudChybi5nZXROYW1lKCksIGVsZW1SZWYpOwotCi0JCQkJCWVsZW1SZWYuc2V0UmVmZXJlbmNlZEVsZW1lbnQoYW5FbGVtZW50KTsKLQotCQkJCQlEVERPY2N1cnJlbmNlVHlwZSBvY2N1cnJlbmNlVHlwZSA9IERURE9jY3VycmVuY2VUeXBlLmdldChjb21wdXRlTW9mT2NjdXJyZW5jZShybikpOwotCQkJCQllbGVtUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCi0JCQkJCS8vIEFkZCBEVERFbGVtZW50UmVmZXJlbmNlIHRvIHRoZSBHcm91cAotCQkJCQlwYXJlbnQuZ2V0Q29udGVudCgpLmFkZChlbGVtUmVmKTsKLQkJCQl9Ci0JCQkJZWxzZSAvLyBQRSBSZWZlcmVuY2UKLQkJCQl7Ci0JCQkJCVN0cmluZyBlbnRpdHlOYW1lID0gcm4uZ2V0TmFtZSgpLnRyaW0oKTsKLQotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNNIFBFIFJlZiBuYW1lOiAiICsgZW50aXR5TmFtZSk7Ci0JCQkJCURUREVudGl0eSBhbkVudGl0eSA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KGVudGl0eU5hbWUpOwotCQkJCQlpZiAoYW5FbnRpdHkgIT0gbnVsbCkgewotCQkJCQkJLy8KLQkJCQkJCS8vIENyZWF0ZSBhbiBEVERFbnRpdHlSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZAotCQkJCQkJLy8gZWxlbWVudAotCQkJCQkJLy8KLQkJCQkJCURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgZW5SZWYgPSBmYWN0b3J5LmNyZWF0ZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKTsKLQkJCQkJCWVuUmVmLnNldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KGFuRW50aXR5KTsKLQotCQkJCQkJRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPSBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkJCQkJCWVuUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCi0JCQkJCQkvLyBBZGQgRFRERW50aXR5UmVmZXJlbmNlIHRvIHRoZSBHcm91cAotCQkJCQkJcGFyZW50LmdldENvbnRlbnQoKS5hZGQoZW5SZWYpOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaW5kIHRoZSByZWFsIGVsZW1lbnQgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IHRoZSBjdXJyZW50IGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIERUREVsZW1lbnQgY3JlYXRlT3JGaW5kRWxlbWVudChTdHJpbmcgbmFtZSwgT2JqZWN0IG9iaikgewotCQkvLyBEVERFbGVtZW50IGFFbGVtZW50ID0gZ2V0RFRERmlsZSgpLmZpbmRFbGVtZW50KG5hbWUpOwotCi0JCURUREVsZW1lbnQgYUVsZW1lbnQgPSAoRFRERWxlbWVudCkgZHRkVXRpbC5nZXRFbGVtZW50UG9vbCgpLmdldChuYW1lKTsKLQotCQlpZiAoYUVsZW1lbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFFbGVtZW50OwotCQl9Ci0KLQkJU3RyaW5nIGVycm9yTXNnID0gRFREQ29yZU1lc3NhZ2VzLl9FUlJPUl9VTkRFQ0xBUkVEX0VMRU1FTlRfMTsgLy8kTk9OLU5MUy0xJAotCQllcnJvck1zZyArPSAiXCIiICsgbmFtZSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQllcnJvck1zZyArPSBEVERDb3JlTWVzc2FnZXMuX1VJX0VSUk9SUEFSVF9VTkRFQ0xBUkVEX0VMRU1FTlRfMjsgLy8kTk9OLU5MUy0xJAotCi0JCUVycm9yTWVzc2FnZSBkdGRFcnJvciA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQotCQlkdGRFcnJvci5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNc2cpOwotCQlhZGRFcnJvck1lc3NhZ2UoZHRkRXJyb3IsIG9iaik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihlcnJvck1zZyk7Ci0JCS8vIHNldERUREVycm9yTWVzc2FnZShlcnJvck1zZyk7Ci0JCWdldERUREZpbGUoKS5zZXRQYXJzZUVycm9yKHRydWUpOwotCi0JCS8vCi0JCS8vIENyZWF0ZSBhbiBlbXB0eSBlbGVtZW50IGZvciB0aGUgcmVmZXJlbmNlIHRvIG1ha2UgaXQgdmFsaWQKLQkJLy8KLQotCQlEVERGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KCk7Ci0JCURUREVsZW1lbnQgZHRkZWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlRFRERWxlbWVudCgpOwotCQlkdGRlbGVtZW50LnNldE5hbWUobmFtZSk7Ci0KLQkJRFRERW1wdHlDb250ZW50IGVtcHR5Q29udGVudCA9IGZhY3RvcnkuY3JlYXRlRFRERW1wdHlDb250ZW50KCk7Ci0JCWR0ZGVsZW1lbnQuc2V0Q29udGVudChlbXB0eUNvbnRlbnQpOwotCi0JCWdldERUREZpbGUoKS5nZXREVERPYmplY3QoKS5hZGQoZHRkZWxlbWVudCk7Ci0JCWR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5wdXQobmFtZSwgZHRkZWxlbWVudCk7Ci0JCXJldHVybiBkdGRlbGVtZW50OwotCX0KLQotCi0JLyoqCi0JICogQ29tcHV0ZSB0aGUgTU9GIG9jY3VycmVuY2UgZnJvbSB0aGUgeG1sNGogb2NjdXJyZW5jZQotCSAqLwotCXByaXZhdGUgaW50IGNvbXB1dGVNb2ZPY2N1cnJlbmNlKENNUmVwZWF0YWJsZU5vZGUgcm5vZGUpIHsKLQkJaW50IG9jY3VycmVuY2UgPSBybm9kZS5nZXRPY2N1cnJlbmNlKCk7Ci0JCWludCBtb2ZvY2N1ciA9IERURE9jY3VycmVuY2VUeXBlLk9ORTsKLQotCQlpZiAob2NjdXJyZW5jZSA9PSBDTU5vZGVUeXBlLlpFUk9fT1JfTU9SRSkgewotCQkJbW9mb2NjdXIgPSBEVERPY2N1cnJlbmNlVHlwZS5aRVJPX09SX01PUkU7Ci0JCX0KLQkJZWxzZSBpZiAob2NjdXJyZW5jZSA9PSBDTU5vZGVUeXBlLk9ORV9PUl9NT1JFKSB7Ci0JCQltb2ZvY2N1ciA9IERURE9jY3VycmVuY2VUeXBlLk9ORV9PUl9NT1JFOwotCQl9Ci0JCWVsc2UgaWYgKG9jY3VycmVuY2UgPT0gQ01Ob2RlVHlwZS5PUFRJT05BTCkgewotCQkJbW9mb2NjdXIgPSBEVERPY2N1cnJlbmNlVHlwZS5PUFRJT05BTDsKLQkJfQotCQlyZXR1cm4gbW9mb2NjdXI7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZSB0aGUgTU9GIG1vZGVsIGdyb3VwIGZyb20gdGhlIHhtbDRqIG1vZGVsIGdyb3VwCi0JICovCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZU1vZkdyb3VwS2luZChpbnQgdHlwZSkgewotCQlpZiAodHlwZSA9PSBDTU5vZGVUeXBlLkdST1VQX0NIT0lDRSkgewotCQkJcmV0dXJuIERUREdyb3VwS2luZC5DSE9JQ0U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gRFRER3JvdXBLaW5kLlNFUVVFTkNFOwotCQl9Ci0JfQotCi0KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8KLQkvLyBNZXRob2RzIGZvciBjcmVhdGluZyB0aGUgYXR0cmlidXRlcyBvZiBhIERUREVsZW1lbnQKLQkvLwotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQlwdWJsaWMgdm9pZCBjcmVhdGVBdHRyaWJ1dGVzKERUREVsZW1lbnQgZWxlbWVudCwgQXR0bGlzdCBhdHRMaXN0KSB7Ci0JCWlmIChhdHRMaXN0LmdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCWFkZEVycm9yTWVzc2FnZShhdHRMaXN0LmdldEVycm9yTWVzc2FnZSgpLCBlbGVtZW50KTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0TGlzdC5zaXplKCk7IGkrKykgewotCQkJQXR0Tm9kZSBhZCA9IGF0dExpc3QuZWxlbWVudEF0KGkpOwotCQkJLy8gRFREQXR0cmlidXRlRWxlbWVudCBkdGRBdHQ9Ci0JCQkvLyBnZXREVERBdHRyaWJ1dGVFbGVtZW50KGEuZ2V0TmFtZSgpKTsKLQotCQkJLy8gb25seSBhZGQgdGhlIEF0dERlZiBpZiBpdCBpcyBub3QgYWRkZWQgeWV0Ci0JCQkvLyBpZ25vcmUgdGhlIGR1cCBBdHREZWYgYXMgZG9jdW1lbnRlZCBpbiB0aGUgWE1MIDEuMCBzcGVjcwotCQkJLy8gaWYoIGR0ZEF0dD09bnVsbCkKLQkJCWFkZEF0dHJpYnV0ZShlbGVtZW50LCBhZCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIERUREF0dHJpYnV0ZSBmcm9tIHRoZSB4bWw0aiBhdHRyaWJ1dGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoRFRERWxlbWVudCBkdGRlbGVtZW50LCBBdHROb2RlIGFkKSB7Ci0JCURUREF0dHJpYnV0ZSBkdGRhdHRyID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREF0dHJpYnV0ZSgpOwotCQlkdGRlbGVtZW50LmdldERUREF0dHJpYnV0ZSgpLmFkZChkdGRhdHRyKTsKLQkJZmluaXNoQXR0cmlidXRlKGR0ZGF0dHIsIGFkKTsKLQl9Ci0KLQkvLyBTdHVmZiBmb3IgcG9wdWxhdGluZyBhdHRyaWJ1dGUKLQlwdWJsaWMgdm9pZCBmaW5pc2hBdHRyaWJ1dGUoRFREQXR0cmlidXRlIGR0ZGF0dHIsIEF0dE5vZGUgYXR0ZGVmKSB7Ci0JCWJvb2xlYW4gcGFyc2VFcnJvciA9IGZhbHNlOwotCi0JCWlmIChhdHRkZWYubmFtZS5zdGFydHNXaXRoKCIlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHBlTmFtZSA9IGF0dGRlZi5uYW1lLnRyaW0oKTsKLQkJCURUREVudGl0eSBlbiA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KHBlTmFtZSk7Ci0JCQlpZiAoZW4gIT0gbnVsbCkgewotCQkJCWR0ZGF0dHIuc2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoZW4pOwotCQkJfQotCQl9Ci0KLQkJZHRkYXR0ci5zZXROYW1lKGF0dGRlZi5uYW1lKTsKLQotCQlpbnQgYXR0clR5cGUgPSBhdHRkZWYuZ2V0RGVjbGFyZWRUeXBlKCk7Ci0KLQkJaWYgKGF0dHJUeXBlID09IEF0dE5vZGUuUEVSRUZFUkVOQ0UgJiYgYXR0ZGVmLnR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHBlTmFtZSA9IGF0dGRlZi50eXBlLnRyaW0oKTsKLQkJCURUREVudGl0eSBlbiA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KHBlTmFtZSk7Ci0JCQlpZiAoZW4gIT0gbnVsbCkgewotCQkJCWR0ZGF0dHIuc2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoZW4pOwotCQkJCXNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfQ0RBVEEoKSk7IC8vIGhhY2ssCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHNvCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHdlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNhbgotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBnZXQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYmFjawotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZGVmYXVsdAotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB2YWx1ZQotCQkJfQotCQkJZWxzZQotCQkJCS8vIHNldCBkZWZhdWx0IHR5cGUKLQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0NEQVRBKCkpOwotCi0JCX0KLQkJZWxzZSB7Ci0JCQlzd2l0Y2ggKGF0dHJUeXBlKSB7Ci0JCQkJY2FzZSBBdHROb2RlLkNEQVRBIDoKLQkJCQkJc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9DREFUQSgpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEF0dE5vZGUuRU5USVRJRVMgOgotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0VOVElUSUVTKCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQXR0Tm9kZS5FTlRJVFkgOgotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0VOVElUWSgpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEF0dE5vZGUuSUQgOgotCQkJCQkvLyBjaGVjayBmb3IgZHVwbGljYXRlIElEIGF0dHJpYnV0ZQotCQkJCQlpZiAoaGFzSURBdHRyaWJ1dGUoZHRkYXR0cikpIHsKLQkJCQkJCVN0cmluZyBlcnJNc2cgPSBEVERDb3JlTWVzc2FnZXMuX0VSUk9SX0RVUF9JRF9BVFRSSUJVVEVfMTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZXJyTXNnICs9IGF0dGRlZi5uYW1lICsgRFREQ29yZU1lc3NhZ2VzLl9VSV9FUlJPUlBBUlRfRFVQX0lEX0FUVFJJQlVURV8yOyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBkdGRhdHRyLmdldERUREVsZW1lbnQoKS5nZXRJRWxlbWVudCgpLnNldERUREVycm9yTWVzc2FnZShlcnJNc2cpOwotCQkJCQkJLy8gZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpLnNldFBhcnNlRXJyb3IodHJ1ZSk7Ci0JCQkJCQlwYXJzZUVycm9yID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0lEKCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQXR0Tm9kZS5JRFJFRiA6Ci0JCQkJCXNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfSURSRUYoKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBBdHROb2RlLklEUkVGUyA6Ci0JCQkJCXNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfSURSRUZTKCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQXR0Tm9kZS5FTlVNRVJBVElPTiA6Ci0JCQkJCXNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGNyZWF0ZURUREVudW1lcmF0aW9uKGR0ZGF0dHIsIGF0dGRlZiwgRFRERW51bUdyb3VwS2luZC5OQU1FX1RPS0VOX0dST1VQKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBBdHROb2RlLk5PVEFUSU9OIDoKLQkJCQkJc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgY3JlYXRlRFRERW51bWVyYXRpb24oZHRkYXR0ciwgYXR0ZGVmLCBEVERFbnVtR3JvdXBLaW5kLk5PVEFUSU9OX0dST1VQKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBBdHROb2RlLk5NVE9LRU4gOgotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX05NVE9LRU4oKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBBdHROb2RlLk5NVE9LRU5TIDoKLQkJCQkJc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9OTVRPS0VOUygpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQlkZWZhdWx0IDoKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRFREQVRUUiAnIiArYXR0ZGVmLm5hbWUgKyAiJ1Vua25vd24KLQkJCS8vIHR5cGUuLi4iICsgYXR0clR5cGUpOwotCQkJfQotCQl9Ci0KLQkJaW50IGF0dHJEZWZhdWx0ID0gYXR0ZGVmLmdldERlZmF1bHRUeXBlKCk7Ci0JCWludCBkZWZhdWx0S2luZCA9IERURERlZmF1bHRLaW5kLklNUExJRUQ7Ci0JCXN3aXRjaCAoYXR0ckRlZmF1bHQpIHsKLQkJCWNhc2UgQXR0Tm9kZS5GSVhFRCA6Ci0JCQkJZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5GSVhFRDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBdHROb2RlLklNUExJRUQgOgotCQkJCWRlZmF1bHRLaW5kID0gRFRERGVmYXVsdEtpbmQuSU1QTElFRDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBdHROb2RlLlJFUVVJUkVEIDoKLQkJCQlkZWZhdWx0S2luZCA9IERURERlZmF1bHRLaW5kLlJFUVVJUkVEOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEF0dE5vZGUuTk9GSVhFRCA6Ci0JCQkJZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5OT0ZJWEVEOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0IDoKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJEVERBVFRSICciICthdHRkZWYubmFtZSArICInIFVua25vd24gZGVmYXVsdAotCQkvLyB0eXBlLi4uICIgKyBhdHRyRGVmYXVsdCk7Ci0JCX0KLQotCQlEVEREZWZhdWx0S2luZCBkZWZhdWx0S2luZE9iaiA9IERURERlZmF1bHRLaW5kLmdldChkZWZhdWx0S2luZCk7Ci0JCWR0ZGF0dHIuc2V0RGVmYXVsdEtpbmQoZGVmYXVsdEtpbmRPYmopOwotCi0JCWlmIChwYXJzZUVycm9yKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gYXR0ZGVmLmRlZmF1bHRWYWx1ZTsKLQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlpZiAoYXR0clR5cGUgPT0gQXR0Tm9kZS5FTlVNRVJBVElPTiB8fCBhdHRyVHlwZSA9PSBBdHROb2RlLk5PVEFUSU9OKSB7Ci0JCQkJaWYgKCFpc0RlZmF1bHRFbnVtVmFsdWVWYWxpZChhdHRkZWYsIGRlZmF1bHRWYWx1ZSkpIHsKLQkJCQkJU3RyaW5nIHR5cGVTdHJpbmcgPSAoYXR0clR5cGUgPT0gQXR0Tm9kZS5FTlVNRVJBVElPTiA/ICJlbnVtZXJhdGlvbiIgOiAibm90YXRpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCVN0cmluZyBlcnJNc2cgPSBEVERDb3JlTWVzc2FnZXMuX0VSUk9SX0lOVkFMSURfREVGQVVMVF9BVFRSX1ZBTFVFXzE7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZXJyTXNnICs9IHR5cGVTdHJpbmcgKyBEVERDb3JlTWVzc2FnZXMuX1VJX0VSUk9SUEFSVF9JTlZBTElEX0RFRkFVTFRfQVRUUl9WQUxVRV8yOyAvLyROT04tTkxTLTEkCi0JCQkJCWVyck1zZyArPSBhdHRkZWYubmFtZSArICInIjsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCS8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldElFbGVtZW50KCkuc2V0RFRERXJyb3JNZXNzYWdlKGVyck1zZyk7Ci0JCQkJCS8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKS5zZXRQYXJzZUVycm9yKHRydWUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJZHRkYXR0ci5zZXREZWZhdWx0VmFsdWVTdHJpbmcoZGVmYXVsdFZhbHVlKTsKLQkJfQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRUREF0dHIgLSB0b01vZiBnZXREZWZhdWx0VmFsdWVTdHJpbmcgIiArCi0JCS8vIGdldERlZmF1bHRWYWx1ZVN0cmluZygpKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJEVERBdHRyIC0gdG9Nb2YgZ2V0RGVmYXVsdFZhbHVlOiAiICsKLQkJLy8gZ2V0RGVmYXVsdFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0lEQXR0cmlidXRlKERUREF0dHJpYnV0ZSBkdGRhdHRyKSB7Ci0JCWJvb2xlYW4gaGFzSUQgPSBmYWxzZTsKLQotCQlEVERFbGVtZW50IGVsZW1lbnQgPSBkdGRhdHRyLmdldERUREVsZW1lbnQoKTsKLQkJRUxpc3QgYXR0cnMgPSBlbGVtZW50LmdldERUREF0dHJpYnV0ZSgpOwotCi0JCUl0ZXJhdG9yIGkgPSBhdHRycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCURUREF0dHJpYnV0ZSBhdHRyID0gKERUREF0dHJpYnV0ZSkgaS5uZXh0KCk7Ci0JCQlEVERUeXBlIGRUeXBlID0gYXR0ci5nZXREVERUeXBlKCk7Ci0JCQlpZiAoZFR5cGUgaW5zdGFuY2VvZiBEVERCYXNpY1R5cGUpIHsKLQkJCQlpZiAoKChEVERCYXNpY1R5cGUpIGRUeXBlKS5nZXRLaW5kKCkuZ2V0VmFsdWUoKSA9PSBEVERCYXNpY1R5cGVLaW5kLklEKSB7Ci0JCQkJCWhhc0lEID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBoYXNJRDsKLQl9Ci0KLQlwdWJsaWMgRFRERW51bWVyYXRpb25UeXBlIGNyZWF0ZURUREVudW1lcmF0aW9uKERUREF0dHJpYnV0ZSBkdGRhdHRyLCBTdHJpbmdbXSBlbnVtVmFsdWVzLCBpbnQgZW51bUtpbmQpIHsKLQkJRFRERW51bWVyYXRpb25UeXBlIGVudW1lcmF0aW9uID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVudW1lcmF0aW9uVHlwZSgpOwotCQlEVERFbnVtR3JvdXBLaW5kIGdyb3VwS2luZCA9IERUREVudW1Hcm91cEtpbmQuZ2V0KGVudW1LaW5kKTsKLQkJZW51bWVyYXRpb24uc2V0S2luZChncm91cEtpbmQpOwotCQkvLyBFbnVtZXJhdGlvbiB2YWx1ZXMKLQkJaWYgKGVudW1WYWx1ZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtVmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRUVudW1MaXRlcmFsIGVudW1MaXRlcmFsID0gY3JlYXRlRUVudW1MaXRlcmFsKCk7Ci0JCQkJLy8gZW51bVZhbC5zZXRYTUlEb2N1bWVudChkdGRhdHRyLmdldFhNSURvY3VtZW50KCkpOwotCQkJCS8vIE1PRjJFTUYgUG9ydAotCQkJCS8vIGVudW1MaXRlcmFsLnJlZlNldExpdGVyYWwoZW51bVZhbHVlc1tpXSk7Ci0JCQkJZW51bUxpdGVyYWwuc2V0TmFtZShlbnVtVmFsdWVzW2ldKTsKLQotCQkJCS8vIGVudW1MaXRlcmFsLnNldE51bWJlcihpKTsKLQkJCQllbnVtZXJhdGlvbi5nZXRFbnVtTGl0ZXJhbHMoKS5hZGQoZW51bUxpdGVyYWwpOwotCQkJfQotCQl9Ci0JCWR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKS5nZXREVERFbnVtZXJhdGlvblR5cGUoKS5hZGQoZW51bWVyYXRpb24pOwotCQlyZXR1cm4gZW51bWVyYXRpb247Ci0JfQotCi0JcHJpdmF0ZSBFRW51bUxpdGVyYWwgY3JlYXRlRUVudW1MaXRlcmFsKCkgewotCQlFY29yZVBhY2thZ2UgZVBhY2thZ2UgPSAoRWNvcmVQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7Ci0JCS8vIE1PRjJFTUYgUG9ydAotCQkvLyByZXR1cm4gKChFY29yZUZhY3RvcnkpZVBhY2thZ2UuZ2V0RmFjdG9yeSgpKS5jcmVhdGVFRW51bUxpdGVyYWwoKTsKLQkJcmV0dXJuIGVQYWNrYWdlLmdldEVjb3JlRmFjdG9yeSgpLmNyZWF0ZUVFbnVtTGl0ZXJhbCgpOwotCX0KLQotCXByaXZhdGUgRFRERW51bWVyYXRpb25UeXBlIGNyZWF0ZURUREVudW1lcmF0aW9uKERUREF0dHJpYnV0ZSBkdGRhdHRyLCBBdHROb2RlIGF0dGRlZiwgaW50IGVudW1LaW5kKSB7Ci0JCURUREVudW1lcmF0aW9uVHlwZSBlbnVtZXJhdGlvbiA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbnVtZXJhdGlvblR5cGUoKTsKLQkJRFRERW51bUdyb3VwS2luZCBncm91cEtpbmQgPSBEVERFbnVtR3JvdXBLaW5kLmdldChlbnVtS2luZCk7Ci0JCWVudW1lcmF0aW9uLnNldEtpbmQoZ3JvdXBLaW5kKTsKLQkJZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpLmdldERUREVudW1lcmF0aW9uVHlwZSgpLmFkZChlbnVtZXJhdGlvbik7Ci0KLQkJLy8gRW51bWVyYXRpb24gdmFsdWVzCi0JCUVudW1lcmF0aW9uIHRva2VuSXRlciA9IGF0dGRlZi5lbGVtZW50cygpOwotCQlpZiAodG9rZW5JdGVyICE9IG51bGwpIHsKLQkJCXdoaWxlICh0b2tlbkl0ZXIuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlTdHJpbmcgdmFsID0gKFN0cmluZykgdG9rZW5JdGVyLm5leHRFbGVtZW50KCk7Ci0JCQkJRUVudW1MaXRlcmFsIGVudW1MaXRlcmFsID0gY3JlYXRlRUVudW1MaXRlcmFsKCk7Ci0JCQkJLy8gZW51bUxpdGVyYWwuc2V0WE1JRG9jdW1lbnQoZHRkYXR0ci5nZXRYTUlEb2N1bWVudCgpKTsKLQkJCQkvLyBNT0YyRU1GIFBvcnQKLQkJCQkvLyBlbnVtTGl0ZXJhbC5yZWZTZXRMaXRlcmFsKHZhbCk7Ci0JCQkJZW51bUxpdGVyYWwuc2V0TmFtZSh2YWwpOwotCi0KLQkJCQkvLyBlbnVtTGl0ZXJhbC5zZXROdW1iZXIoaSsrKTsKLQkJCQllbnVtZXJhdGlvbi5nZXRFbnVtTGl0ZXJhbHMoKS5hZGQoZW51bUxpdGVyYWwpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVudW1lcmF0aW9uOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHRFbnVtVmFsdWVWYWxpZChBdHROb2RlIGF0dGRlZiwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0JCWJvb2xlYW4gY29udGFpbnNQZXJjZW50ID0gZmFsc2U7Ci0KLQkJLy8gRW51bWVyYXRpb24gdmFsdWVzCi0JCUVudW1lcmF0aW9uIGVudW1WYWx1ZXMgPSBhdHRkZWYuZWxlbWVudHMoKTsKLQkJd2hpbGUgKGVudW1WYWx1ZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVN0cmluZyB2YWwgPSAoU3RyaW5nKSBlbnVtVmFsdWVzLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAodmFsLmVxdWFscyhkZWZhdWx0VmFsdWUpKSB7Ci0JCQkJdmFsaWQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHZhbC5pbmRleE9mKCclJykgPj0gMCkgewotCQkJCWNvbnRhaW5zUGVyY2VudCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbGlkIHx8IGNvbnRhaW5zUGVyY2VudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyRFREVHlwZShEVERBdHRyaWJ1dGUgZHRkYXR0ciwgRFREVHlwZSB0eXBlKSB7Ci0JCWR0ZGF0dHIuc2V0RFREVHlwZSh0eXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFcnJvck1lc3NhZ2UoRXJyb3JNZXNzYWdlIGVyck1zZywgT2JqZWN0IG9iaikgewotCQllcnJNc2cuc2V0T2JqZWN0KG9iaik7Ci0JCWR0ZFV0aWwuYWRkRXJyb3JNZXNzYWdlKGVyck1zZyk7Ci0JfQotCi0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgRFRERmFjdG9yeUltcGwgZ2V0RmFjdG9yeUdlbigpIHsKLQkvLwotCS8vIHJldHVybiAoRFRERmFjdG9yeUltcGwpZHRkVXRpbC5nZXRGYWN0b3J5KCk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIERUREZpbGUgZ2V0RFRERmlsZUdlbigpIHsKLQkvLwotCS8vIHJldHVybiBkdGRGaWxlOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0RFRER2VuKERURCBkdGQpIHsKLQkvLwotCS8vIHN1cGVyLnZpc2l0RFREKGR0ZCk7Ci0JLy8KLQkvLwotCS8vIC8vIC0gMm5kIHBhc3MgLQotCS8vIC8vIGRvIGZpbmFsIHByb2Nlc3NpbmcgZm9yIEF0dGxpc3RzIGFuZCBhZGRpbmcgY29udGVudE1vZGVsCi0JLy8gYWRkQXR0bGlzdEFuZENvbnRlbnRNb2RlbChkdGQsZHRkRmlsZSk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXRFbGVtZW50RGVjbEdlbihFbGVtZW50RGVjbCBlbGVtZW50KSB7Ci0JLy8KLQkvLyAvLyBFbGVtZW50IG1pZ2h0IGhhdmUgYmVlbiBhZGRlZCBlYXJsaWVyIGJlY2F1c2UgaXQgaXMgcmVmZXJlbmNlZAotCS8vIFN0cmluZyBkZWNsTmFtZSA9IGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSA7Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJwcm9jZXNzIEVsZW1lbnREZWNsOiIgKyBkZWNsTmFtZSApOwotCS8vIERUREVsZW1lbnQgZHRkZWxlbWVudCA9IChEVERFbGVtZW50KQotCS8vIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5nZXQoZGVjbE5hbWUpOwotCS8vIGlmIChkdGRlbGVtZW50ID09IG51bGwpCi0JLy8gewotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigicHJvY2VzcyBFbGVtZW50RGVjbCAtIG5vdCBmb3VuZCAtIGNyZWF0ZSIgKTsKLQkvLyBkdGRlbGVtZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVsZW1lbnQoKTsKLQkvLyBkdGRlbGVtZW50LnNldE5hbWUoZGVjbE5hbWUpOwotCS8vIGR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKGR0ZGVsZW1lbnQpOwotCS8vIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5wdXQoZGVjbE5hbWUsZHRkZWxlbWVudCk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBzdXBlci52aXNpdEVsZW1lbnREZWNsKGVsZW1lbnQpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0Tm90YXRpb25EZWNsR2VuKE5vdGF0aW9uRGVjbCBub3RhdGlvbikgewotCS8vCi0JLy8gLy8gTm90YXRpb24gbWlnaHQgaGF2ZSBiZWVuIGFkZGVkIGVhcmxpZXIgYmVjYXVzZSBpdCBpcyByZWZlcmVuY2VkCi0JLy8gLy8gYnkgYW4gZW50aXR5Ci0JLy8gRFRETm90YXRpb24gZHRkbm90ID0gZHRkRmlsZS5maW5kTm90YXRpb24oIG5vdGF0aW9uLmdldE5vZGVOYW1lKCkgKTsKLQkvLyBpZiAoZHRkbm90ID09IG51bGwpCi0JLy8gewotCS8vIGR0ZG5vdCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVEROb3RhdGlvbigpOwotCS8vIGR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKGR0ZG5vdCk7Ci0JLy8gfQotCS8vIGR0ZG5vdC5zZXROYW1lKG5vdGF0aW9uLmdldE5vZGVOYW1lKCkpOwotCS8vCi0JLy8KLQkvLyBpZiAobm90YXRpb24uZ2V0U3lzdGVtSWQoKSE9IG51bGwgKQotCS8vIGR0ZG5vdC5zZXRTeXN0ZW1JRChub3RhdGlvbi5nZXRTeXN0ZW1JZCgpKTsKLQkvLyBpZiAobm90YXRpb24uZ2V0UHVibGljSWQoKSE9IG51bGwgKQotCS8vIGR0ZG5vdC5zZXRQdWJsaWNJRChub3RhdGlvbi5nZXRQdWJsaWNJZCgpKTsKLQkvLwotCS8vCi0JLy8gaWYgKG5vdGF0aW9uLmdldENvbW1lbnQoKSE9bnVsbCkKLQkvLyBkdGRub3Quc2V0Q29tbWVudChub3RhdGlvbi5nZXRDb21tZW50KCkpOwotCS8vIGlmIChub3RhdGlvbi5nZXRFcnJvck1lc3NhZ2UoKSE9bnVsbCkKLQkvLyB7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKG5vdGF0aW9uLmdldEVycm9yTWVzc2FnZSgpLCBkdGRub3QpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gc3VwZXIudmlzaXROb3RhdGlvbkRlY2wobm90YXRpb24pOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0UGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRGVjbEdlbihFbnRpdHlEZWNsIGVudGl0eSkKLQkvLyB7Ci0JLy8KLQkvLyAvLyBUaGlzIGlzIGEgcGFyYW1ldGVyIGVudGl0eSByZWZlcmVuY2UuCi0JLy8gLy8gQWRkIHRoZSBsaW5rIHRvIHRoZSByZWFsIGVudGl0eSB0aGF0IGl0IHJlZmVyZW5jZXMKLQkvLyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudFJlZiA9Ci0JLy8gZ2V0RmFjdG9yeSgpLmNyZWF0ZURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpOwotCS8vIGR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKHBhcm1FbnRSZWYpOwotCS8vCi0JLy8KLQkvLyBTdHJpbmcgZW50aXR5TmFtZSA9IGVudGl0eS5nZXROb2RlTmFtZSgpOwotCS8vCi0JLy8KLQkvLyAvLyBBZGQgdGhlIHJlZmVyZW5jZSB0byB0aGUgRFRERW50aXR5Ci0JLy8gRFRERW50aXR5IGR0ZGVudGl0eSA9IGdldERUREZpbGUoKS5maW5kRW50aXR5KGVudGl0eU5hbWUpOwotCS8vIGlmIChkdGRlbnRpdHkgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gcGFybUVudFJlZi5zZXRFbnRpdHkoZHRkZW50aXR5KTsKLQkvLyB9Ci0JLy8gaWYgKGVudGl0eS5nZXRFcnJvck1lc3NhZ2UoKSE9bnVsbCkKLQkvLyB7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGVudGl0eS5nZXRFcnJvck1lc3NhZ2UoKSwgZHRkZW50aXR5KTsKLQkvLyB9Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJhZGRpbmcgUEUgcmVmZXJlbmNlOiAiICsgZGVjbE5hbWUpOwotCS8vCi0JLy8KLQkvLyBzdXBlci52aXNpdFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZURlY2woZW50aXR5KTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdEV4dGVybmFsRW50aXR5RGVjbEdlbihFbnRpdHlEZWNsIGVudGl0eSkgewotCS8vCi0JLy8gRFRERW50aXR5IGR0ZEVudGl0eSA9IGNyZWF0ZURUREVudGl0eShlbnRpdHkpOwotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiYWRkaW5nIGVudGl0eTogIiArIGRlY2xOYW1lKTsKLQkvLyBEVERFeHRlcm5hbEVudGl0eSBleHRFbnRpdHkgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERXh0ZXJuYWxFbnRpdHkoKTsKLQkvLyBkdGRFbnRpdHkuc2V0Q29udGVudChleHRFbnRpdHkpOwotCS8vCi0JLy8KLQkvLyBmaW5pc2hFeHRlcm5hbEVudGl0eShleHRFbnRpdHksIGVudGl0eSk7Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCIgZXh0IGVudGl0eSB0b01vZjogIiApOwotCS8vIGlmIChkdGRFbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkKLQkvLyB7Ci0JLy8KLQkvLwotCS8vIGR0ZFV0aWwuZ2V0UEVQb29sKCkucHV0KCIlIitlbnRpdHkuZ2V0Tm9kZU5hbWUoKSsiOyIsIGR0ZEVudGl0eSk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBzdXBlci52aXNpdEV4dGVybmFsRW50aXR5RGVjbChlbnRpdHkpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0SW50ZXJuYWxFbnRpdHlEZWNsR2VuKEVudGl0eURlY2wgZW50aXR5KSB7Ci0JLy8KLQkvLyBEVERFbnRpdHkgZHRkRW50aXR5ID0gY3JlYXRlRFRERW50aXR5KGVudGl0eSk7Ci0JLy8KLQkvLwotCS8vIERUREludGVybmFsRW50aXR5IGludEVudGl0eSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERJbnRlcm5hbEVudGl0eSgpOwotCS8vIGR0ZEVudGl0eS5zZXRDb250ZW50KGludEVudGl0eSk7Ci0JLy8gaW50RW50aXR5LnNldFZhbHVlKGVudGl0eS5nZXRWYWx1ZSgpKTsKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBpbnQgZW50aXR5IHRvTW9mOiAiICk7Ci0JLy8gaWYgKGR0ZEVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKQotCS8vIHsKLQkvLyBkdGRVdGlsLmdldFBFUG9vbCgpLnB1dCgiJSIrZW50aXR5LmdldE5vZGVOYW1lKCkrIjsiLCBkdGRFbnRpdHkpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gc3VwZXIudmlzaXRJbnRlcm5hbEVudGl0eURlY2woZW50aXR5KTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRsaXN0QW5kQ29udGVudE1vZGVsR2VuKERURCBkdGQsIERUREZpbGUgZEZpbGUpIHsKLQkvLwotCS8vIC8vU3lzdGVtLm91dC5wcmludGxuKCJhZGRBdHRMaXN0QW5kQ290ZW50TW9kZWwgLSBkdGQ6IiArCi0JLy8gZHRkLmdldE5hbWUoKSk7Ci0JLy8gRW51bWVyYXRpb24gZW4gPSBkdGQuZXh0ZXJuYWxFbGVtZW50cygpOwotCS8vIHdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkKLQkvLyB7Ci0JLy8gT2JqZWN0IGUgPSBlbi5uZXh0RWxlbWVudCgpOwotCS8vIGlmICggZSBpbnN0YW5jZW9mIEVsZW1lbnREZWNsICkKLQkvLyB7Ci0JLy8gRFRERWxlbWVudCBkdGRlbGVtZW50ID0gKERUREVsZW1lbnQpIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5nZXQoCi0JLy8gKChFbGVtZW50RGVjbCllKS5nZXROb2RlTmFtZSgpICk7Ci0JLy8gaWYgKGR0ZGVsZW1lbnQgPT0gbnVsbCkKLQkvLyB7Ci0JLy8gZHRkZWxlbWVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbGVtZW50KCk7Ci0JLy8gZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoZHRkZWxlbWVudCk7Ci0JLy8gfQotCS8vIGZpbmlzaEVsZW1lbnREZWNsKGR0ZGVsZW1lbnQsIChFbGVtZW50RGVjbCkgZSk7Ci0JLy8gfQotCS8vIGVsc2UgaWYgKCBlIGluc3RhbmNlb2YgQXR0bGlzdCApCi0JLy8gewotCS8vIHByb2Nlc3NBdHRMaXN0KChBdHRsaXN0KSBlKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NBdHRMaXN0R2VuKEF0dGxpc3QgYXR0TGlzdCkgewotCS8vCi0JLy8gRFRERWxlbWVudCBlID0gKERUREVsZW1lbnQpCi0JLy8gZHRkVXRpbC5nZXRFbGVtZW50UG9vbCgpLmdldChhdHRMaXN0LmdldE5vZGVOYW1lKCkpOwotCS8vIGlmICggZSAhPSBudWxsICkKLQkvLyB7Ci0JLy8gLy8gRWxlbWVudCBoYXMgYmVlbiBhZGRlZC4gQWRkIHRoZSBhdHRyaWJ1dGVzCi0JLy8gLy9TeXN0ZW0ub3V0LnByaW50bG4oIiBwcm9jZXNzQXR0bGlzdCAtIGFkZGluZyBBdHRsaXN0OiIgKwotCS8vIGF0dExpc3QuZ2V0Tm9kZU5hbWUoKSk7Ci0JLy8gY3JlYXRlQXR0cmlidXRlcyhlLCBhdHRMaXN0KTsKLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyAvL1N5c3RlbS5vdXQucHJpbnRsbigiISEhISEhISEhIGVsZW1lbnQgaXMgbnVsbCAiKTsKLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgZmluaXNoRXh0ZXJuYWxFbnRpdHlHZW4oRFRERXh0ZXJuYWxFbnRpdHkgZXh0RW50aXR5LAotCS8vIEVudGl0eURlY2wgZW50aXR5RGVjbCkgewotCS8vCi0JLy8gdXBkYXRlU3lzdGVtSUQoZXh0RW50aXR5LCBlbnRpdHlEZWNsKTsKLQkvLyBleHRFbnRpdHkuc2V0UHVibGljSUQoZW50aXR5RGVjbC5nZXRQdWJsaWNJZCgpKTsKLQkvLwotCS8vCi0JLy8gU3RyaW5nIG5vdGF0aW9uTmFtZSA9IGVudGl0eURlY2wuZ2V0Tm90YXRpb25OYW1lKCk7Ci0JLy8gaWYgKG5vdGF0aW9uTmFtZSAhPSBudWxsKQotCS8vIHsKLQkvLyBEVEROb3RhdGlvbiBkdGROb3RhdGlvbiA9IGNyZWF0ZU9yRmluZE5vdGF0aW9uKGV4dEVudGl0eSwKLQkvLyBub3RhdGlvbk5hbWUsdHJ1ZSk7Ci0JLy8gZXh0RW50aXR5LnNldE5vdGF0aW9uKGR0ZE5vdGF0aW9uKTsKLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIERURE5vdGF0aW9uIGNyZWF0ZU9yRmluZE5vdGF0aW9uR2VuKERUREV4dGVybmFsRW50aXR5Ci0JLy8gZXh0RW50aXR5LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBjcmVhdGUpIHsKLQkvLwotCS8vIERURE5vdGF0aW9uIGFOb3RhdGlvbiA9Ci0JLy8gZXh0RW50aXR5LmdldERUREVudGl0eSgpLmdldERUREZpbGUoKS5maW5kTm90YXRpb24obmFtZSk7Ci0JLy8gaWYgKGFOb3RhdGlvbiAhPSBudWxsKQotCS8vIHsKLQkvLyByZXR1cm4gYU5vdGF0aW9uOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gLy8KLQkvLyAvLyBDcmVhdGUgYSBub3RhdGlvbiBmb3IgdGhlIHJlZmVyZW5jZQotCS8vIC8vCi0JLy8gaWYgKGNyZWF0ZSkKLQkvLyB7Ci0JLy8gYU5vdGF0aW9uID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURURE5vdGF0aW9uKCk7Ci0JLy8gZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoYU5vdGF0aW9uKTsKLQkvLyBhTm90YXRpb24uc2V0TmFtZShuYW1lKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIGFOb3RhdGlvbjsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBUaGUgU3lzdGVtSUQgYXR0cmlidXRlIGlzIHNldCB0byB3aGF0ZXZlciB0aGUgdXNlciBlbnRlcnMKLQkvLyAqIGUuZy4gY29tL2libS9iMmIveG1pbW9kZWxzL3h4eC5kdGQueG1pCi0JLy8gKgotCS8vICogSW4gdGhlIHVucGFyc2UoKSBtZXRob2QsIHBhcnNlIG91dCB0aGUgRFREIGZpbGUgbmFtZSBmcm9tCi0JLy8gKiB0aGUgY2xhc3NwYXRoIG5hbWUuCi0JLy8gKiBlLmcuIHJldHVybnMgeHh4LmR0ZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3lzdGVtSURHZW4oRFRERXh0ZXJuYWxFbnRpdHkgZXh0RW50aXR5LAotCS8vIEVudGl0eURlY2wgZW50aXR5RGVjbCkgewotCS8vCi0JLy8gU3RyaW5nIHN5c3RlbUlkID0gZW50aXR5RGVjbC5nZXRTeXN0ZW1JZCgpOwotCS8vIFN0cmluZyBwdWJsaWNJZCA9IGVudGl0eURlY2wuZ2V0UHVibGljSWQoKTsKLQkvLyBpZiAoc3lzdGVtSWQgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gSWRSZXNvbHZlciBpZFJlc29sdmVyID0gbmV3IElkUmVzb2x2ZXJJbXBsKGR0ZC5nZXROYW1lKCkpOwotCS8vIFN0cmluZyB1cmkgPSBpZFJlc29sdmVyLnJlc29sdmVJZChwdWJsaWNJZCwgc3lzdGVtSWQpOwotCS8vIEV4dGVybmFsRFRETW9kZWwgZWQgPSBkdGRVdGlsLmdldEV4dGVybmFsRFRETW9kZWwocmVzb3VyY2VzLCB1cmkpOwotCS8vIGlmIChlZCAhPSBudWxsKQotCS8vIHsKLQkvLyBEVERGaWxlIHJlZmVyZW5jZUR0ZEZpbGUgPSBlZC5nZXRFeHRlcm5hbERUREZpbGUoKTsKLQkvLyBleHRFbnRpdHkuc2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZShyZWZlcmVuY2VEdGRGaWxlKTsKLQkvLyBleHRFbnRpdHkuc2V0U3lzdGVtSUQoc3lzdGVtSWQpOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIGlmIChlbnRpdHlEZWNsLmdldEVycm9yTWVzc2FnZSgpID09IG51bGwpCi0JLy8gewotCS8vIEVycm9yTWVzc2FnZSBkdGRFcnJvciA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQkvLyBkdGRFcnJvci5zZXRFcnJvck1lc3NhZ2UoRFREQ29yZU1lc3NhZ2VzLmdldFN0cmluZygiX0VSUk9SX0lOQ0xfRklMRV9MT0FEX0ZBSUxVUkUiKQotCS8vICsgIiAnIiArIHN5c3RlbUlkICsgIiciKTsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZHRkRXJyb3IsIGV4dEVudGl0eS5nZXREVERFbnRpdHkoKSk7Ci0JLy8gfQotCS8vICAgICAgICAKLQkvLyBpZiAoc3lzdGVtSWQgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gZXh0RW50aXR5LnNldFN5c3RlbUlEKHN5c3RlbUlkKTsKLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyBleHRFbnRpdHkuc2V0U3lzdGVtSUQoIiIpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkvLyBlbHNlCi0JLy8gewotCS8vIC8vIHNldCB0aGUgc3lzdGVtIGlkIHRvIGJlICIiCi0JLy8gZXh0RW50aXR5LnNldFN5c3RlbUlEKCIiKTsKLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIERUREVudGl0eSBjcmVhdGVEVERFbnRpdHlHZW4oRW50aXR5RGVjbCBlbnRpdHkpIHsKLQkvLwotCS8vIC8vIGNyZWF0ZSBhbmQgZG8gd2hhdCB3ZSBjYW4gdG8gZmlsbCBpbiBzb21lIGJhc2ljIHRoaW5ncwotCS8vIERUREVudGl0eSBkdGRFbnRpdHkgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW50aXR5KCk7Ci0JLy8gZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoZHRkRW50aXR5KTsKLQkvLwotCS8vCi0JLy8gZHRkRW50aXR5LnNldE5hbWUoZW50aXR5LmdldE5vZGVOYW1lKCkpOwotCS8vIGR0ZEVudGl0eS5zZXRQYXJhbWV0ZXJFbnRpdHkoZW50aXR5LmlzUGFyYW1ldGVyKCkpOwotCS8vIGlmIChlbnRpdHkuZ2V0Q29tbWVudCgpIT1udWxsKQotCS8vIHsKLQkvLyBkdGRFbnRpdHkuc2V0Q29tbWVudChlbnRpdHkuZ2V0Q29tbWVudCgpKTsKLQkvLyB9Ci0JLy8gaWYgKGVudGl0eS5nZXRFcnJvck1lc3NhZ2UoKSE9bnVsbCkKLQkvLyB7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGVudGl0eS5nZXRFcnJvck1lc3NhZ2UoKSwgZHRkRW50aXR5KTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIHJldHVybiBkdGRFbnRpdHk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgZmluaXNoRWxlbWVudERlY2xHZW4oRFRERWxlbWVudCBkdGRFbGVtZW50LCBFbGVtZW50RGVjbAotCS8vIGVkKSB7Ci0JLy8KLQkvLyBkdGRFbGVtZW50LnNldE5hbWUoZWQuZ2V0Tm9kZU5hbWUoKSk7Ci0JLy8KLQkvLwotCS8vIENNTm9kZSBjbU5vZGUgPSBlZC5nZXRDb250ZW50TW9kZWxOb2RlKCk7Ci0JLy8KLQkvLwotCS8vIGlmIChlZC5nZXRDb21tZW50KCkhPW51bGwpCi0JLy8gewotCS8vIGR0ZEVsZW1lbnQuc2V0Q29tbWVudChlZC5nZXRDb21tZW50KCkpOwotCS8vIH0KLQkvLyBpZiAoZWQuZ2V0RXJyb3JNZXNzYWdlKCkhPW51bGwpCi0JLy8gewotCS8vIGFkZEVycm9yTWVzc2FnZShlZC5nZXRFcnJvck1lc3NhZ2UoKSwgZHRkRWxlbWVudCk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBpZiAoY21Ob2RlIGluc3RhbmNlb2YgQ01CYXNpY05vZGUpCi0JLy8gewotCS8vIENNQmFzaWNOb2RlIGJuID0gKENNQmFzaWNOb2RlKWNtTm9kZTsKLQkvLyBzd2l0Y2ggKGJuLmdldFR5cGUoKSkKLQkvLyB7Ci0JLy8gY2FzZSBDTU5vZGVUeXBlLkVNUFRZIDoKLQkvLyBEVERFbXB0eUNvbnRlbnQgZW1wdHlDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVtcHR5Q29udGVudCgpOwotCS8vIGR0ZEVsZW1lbnQuc2V0Q29udGVudChlbXB0eUNvbnRlbnQpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIENNTm9kZVR5cGUuQU5ZIDoKLQkvLyBEVERBbnlDb250ZW50IGFueUNvbnRlbnQgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFREQW55Q29udGVudCgpOwotCS8vIGR0ZEVsZW1lbnQuc2V0Q29udGVudChhbnlDb250ZW50KTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBDTU5vZGVUeXBlLlBDREFUQToKLQkvLyBEVERQQ0RhdGFDb250ZW50IHBjRGF0YSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERQQ0RhdGFDb250ZW50KCk7Ci0JLy8gZHRkRWxlbWVudC5zZXRDb250ZW50KHBjRGF0YSk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyB9Ci0JLy8gZWxzZSBpZiAoY21Ob2RlIGluc3RhbmNlb2YgQ01SZWZlcmVuY2VOb2RlKQotCS8vIHsKLQkvLyBDTVJlZmVyZW5jZU5vZGUgcm4gPSAoQ01SZWZlcmVuY2VOb2RlKSBjbU5vZGU7Ci0JLy8gaWYgKHJuLmdldFR5cGUoKSA9PSBDTU5vZGVUeXBlLkVOVElUWV9SRUZFUkVOQ0UpCi0JLy8gewotCS8vIFN0cmluZyBlbnRpdHlOYW1lID0gcm4uZ2V0TmFtZSgpLnRyaW0oKTsKLQkvLwotCS8vCi0JLy8gRFRERW50aXR5IGFuRW50aXR5ID0gKERUREVudGl0eSkgZHRkVXRpbC5nZXRQRVBvb2woKS5nZXQoZW50aXR5TmFtZSk7Ci0JLy8gaWYgKGFuRW50aXR5IT1udWxsKQotCS8vIHsKLQkvLyAvLwotCS8vIC8vIENyZWF0ZSBhbiBEVERFbnRpdHlSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZCBlbGVtZW50Ci0JLy8gLy8KLQkvLyBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IGVuUmVmID0KLQkvLyBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpOwotCS8vIGVuUmVmLnNldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KGFuRW50aXR5KTsKLQkvLwotCS8vIERURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0KLQkvLyBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkvLyBlblJlZi5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQkvLwotCS8vIGR0ZEVsZW1lbnQuc2V0Q29udGVudChlblJlZik7Ci0JLy8gfQotCS8vIGVsc2UKLQkvLyB7IC8vIGNyZWF0ZSBkZWZhdWx0IGNvbnRlbnQKLQkvLyBEVERFbXB0eUNvbnRlbnQgZW1wdHlDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVtcHR5Q29udGVudCgpOwotCS8vIGR0ZEVsZW1lbnQuc2V0Q29udGVudChlbXB0eUNvbnRlbnQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyAvLwotCS8vIC8vIEZpbmQgdGhlIHJlYWwgZWxlbWVudCBmb3IgdGhpcyBlbGVtZW50IHJlZmVyZW5jZXMKLQkvLyAvLyBJZiB0aGUgcmVhbCBlbGVtZW50IGRvZXMgbm90IHlldCBleGlzdCwgY3JlYXRlIGl0Ci0JLy8gLy8KLQkvLyBEVERFbGVtZW50IGFuRWxlbWVudCA9IGNyZWF0ZU9yRmluZEVsZW1lbnQocm4uZ2V0TmFtZSgpLCBkdGRFbGVtZW50KTsKLQkvLwotCS8vCi0JLy8gLy8KLQkvLyAvLyBDcmVhdGUgYW4gRFRERWxlbWVudFJlZmVyZW5jZSBhbmQgc2V0IGl0cyByZWZlcmVuY2VkIGVsZW1lbnQKLQkvLyAvLwotCS8vIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGVsZW1SZWYgPQotCS8vIGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpOwotCS8vIGVsZW1SZWYuc2V0UmVmZXJlbmNlZEVsZW1lbnQoYW5FbGVtZW50KTsKLQkvLwotCS8vIERURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0KLQkvLyBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkvLyBlbGVtUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCS8vCi0JLy8gLy8gc2V0Q29udGVudCB0byBEVERFbGVtZW50UmVmZXJlbmNlCi0JLy8gZHRkRWxlbWVudC5zZXRDb250ZW50KGVsZW1SZWYpOwotCS8vCi0JLy8KLQkvLyB9Ci0JLy8gfQotCS8vIGVsc2UgaWYgKGNtTm9kZSBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKQotCS8vIHsKLQkvLyBDTUdyb3VwTm9kZSBncnBOb2RlID0gKENNR3JvdXBOb2RlKWNtTm9kZTsKLQkvLyBEVERHcm91cENvbnRlbnQgZ3JvdXBDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREdyb3VwQ29udGVudCgpOwotCS8vIERUREdyb3VwS2luZCBncm91cEtpbmQgPQotCS8vIERUREdyb3VwS2luZC5nZXQoY29tcHV0ZU1vZkdyb3VwS2luZChncnBOb2RlLmdldEdyb3VwS2luZCgpKSk7Ci0JLy8gZ3JvdXBDb250ZW50LnNldEdyb3VwS2luZChncm91cEtpbmQpOwotCS8vIERURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0KLQkvLyBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2UoZ3JwTm9kZSkpOwotCS8vIGdyb3VwQ29udGVudC5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQkvLwotCS8vIC8vIGp1c3QgdXNlIHRoZSBsb2NhdG9yIGZvciB0aGUgZWxlbWVudCBhcyB0aGUgY2xvc2VzdCBndWVzcwotCS8vIHByb2Nlc3NHcm91cENvbnRlbnQoZ3JvdXBDb250ZW50LCBncnBOb2RlKTsKLQkvLyBkdGRFbGVtZW50LnNldENvbnRlbnQoZ3JvdXBDb250ZW50KTsKLQkvLyB9Ci0JLy8gZWxzZSBpZiAoY21Ob2RlID09IG51bGwpCi0JLy8gewotCS8vIC8vIGJhZCB0aGluZyBoYXBwZW5lZCBoZXJlLCBqdXN0IGNyZWF0ZSBhIHBjZGF0YQotCS8vIERUREVtcHR5Q29udGVudCBlbXB0eUNvbnRlbnQgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW1wdHlDb250ZW50KCk7Ci0JLy8gZHRkRWxlbWVudC5zZXRDb250ZW50KGVtcHR5Q29udGVudCk7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEFkZCBhIG5ldyBncm91cCB0byB0aGUgY3VycmVudCBncm91cAotCS8vICogQHBhcmFtIHBhcmVudCAtIHRoZSBwYXJlbnQgbm9kZSBmb3IgdGhpcyBncm91cCBlbGVtZW50Ci0JLy8gKiBAcGFyYW0gb3AxTm9kZSAtIHRoZSBncm91cAotCS8vICogZS5nLiAoYSxiKQotCS8vICogQHBhcmFtIG9wMk5vZGUgLSBzZXQgb25seSBpZiBjYWxsZWQgYnkgcHJvY2Vzc0NNMW9wCi0JLy8gKiBlLmcuIChhLGIpKwotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0dyb3VwQ29udGVudEdlbihEVERHcm91cENvbnRlbnQgcGFyZW50LAotCS8vIENNR3JvdXBOb2RlIGdycE5vZGUpIHsKLQkvLwotCS8vIEVudW1lcmF0aW9uIGNoaWxkcmVuID0gZ3JwTm9kZS5nZXRDaGlsZHJlbigpLmVsZW1lbnRzKCk7Ci0JLy8gRFRERmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSgpOwotCS8vIHdoaWxlIChjaGlsZHJlbi5oYXNNb3JlRWxlbWVudHMoKSkKLQkvLyB7Ci0JLy8gQ01Ob2RlIGNub2RlID0gKENNTm9kZSkgY2hpbGRyZW4ubmV4dEVsZW1lbnQoKTsKLQkvLwotCS8vCi0JLy8gaWYgKGNub2RlIGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpCi0JLy8gewotCS8vIENNR3JvdXBOb2RlIGdOb2RlID0gKENNR3JvdXBOb2RlKWNub2RlOwotCS8vIERUREdyb3VwQ29udGVudCBncm91cENvbnRlbnQgPSBmYWN0b3J5LmNyZWF0ZURUREdyb3VwQ29udGVudCgpOwotCS8vIERUREdyb3VwS2luZCBncm91cEtpbmQgPQotCS8vIERUREdyb3VwS2luZC5nZXQoY29tcHV0ZU1vZkdyb3VwS2luZChnTm9kZS5nZXRHcm91cEtpbmQoKSkpOwotCS8vIGdyb3VwQ29udGVudC5zZXRHcm91cEtpbmQoZ3JvdXBLaW5kKTsKLQkvLyBEVERPY2N1cnJlbmNlVHlwZSBvY2N1cnJlbmNlVHlwZSA9Ci0JLy8gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKGdOb2RlKSk7Ci0JLy8gZ3JvdXBDb250ZW50LnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCS8vCi0JLy8gcGFyZW50LmdldENvbnRlbnQoKS5hZGQoZ3JvdXBDb250ZW50KTsKLQkvLyBwcm9jZXNzR3JvdXBDb250ZW50KGdyb3VwQ29udGVudCxnTm9kZSk7Ci0JLy8gfQotCS8vIGVsc2UgaWYgKGNub2RlIGluc3RhbmNlb2YgQ01CYXNpY05vZGUpCi0JLy8gewotCS8vIENNQmFzaWNOb2RlIG4gPSAoQ01CYXNpY05vZGUpY25vZGU7Ci0JLy8gaWYgKG4uZ2V0VHlwZSgpID09IENNTm9kZVR5cGUuUENEQVRBKQotCS8vIHsKLQkvLyAvLyBDcmVhdGUgYSBEVERQQ0RhdGFDb250ZW50IGZvciBhIGxlYWYgUENEYXRhIG5vZGUKLQkvLyAvLwotCS8vIERURFBDRGF0YUNvbnRlbnQgcGNEYXRhID0gZmFjdG9yeS5jcmVhdGVEVERQQ0RhdGFDb250ZW50KCk7Ci0JLy8gLy8gQWRkICNQQ0RBVEEgdG8gdGhlIEdyb3VwLCBpLmUgTWl4ZWQgY29udGVudCBtb2RlbAotCS8vIHBhcmVudC5nZXRDb250ZW50KCkuYWRkKHBjRGF0YSk7Ci0JLy8gfQotCS8vIH0KLQkvLyBlbHNlIGlmIChjbm9kZSBpbnN0YW5jZW9mIENNUmVmZXJlbmNlTm9kZSkKLQkvLyB7Ci0JLy8gQ01SZWZlcmVuY2VOb2RlIHJuID0gKENNUmVmZXJlbmNlTm9kZSljbm9kZTsKLQkvLyBpZiAocm4uZ2V0VHlwZSgpPT1DTU5vZGVUeXBlLkVMRU1FTlRfUkVGRVJFTkNFKQotCS8vIHsKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNNIEVsZW1lbnQgUmVmIG5hbWU6ICIgKyBybi5nZXROYW1lKCkpOwotCS8vIC8vCi0JLy8gLy8gQ3JlYXRlIGFuIERUREVsZW1lbnRSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZCBlbGVtZW50Ci0JLy8gLy8KLQkvLyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtUmVmID0KLQkvLyBmYWN0b3J5LmNyZWF0ZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCk7Ci0JLy8KLQkvLwotCS8vIC8vCi0JLy8gLy8gRmluZCB0aGUgcmVhbCBlbGVtZW50IGZvciB0aGlzIGVsZW1lbnQgcmVmZXJlbmNlcwotCS8vIC8vIElmIHRoZSByZWFsIGVsZW1lbnQgZG9lcyBub3QgeWV0IGV4aXN0LCBjcmVhdGUgaXQKLQkvLyAvLwotCS8vIERUREVsZW1lbnQgYW5FbGVtZW50ID0gY3JlYXRlT3JGaW5kRWxlbWVudChybi5nZXROYW1lKCksIGVsZW1SZWYpOwotCS8vCi0JLy8KLQkvLyBlbGVtUmVmLnNldFJlZmVyZW5jZWRFbGVtZW50KGFuRWxlbWVudCk7Ci0JLy8gRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPQotCS8vIERURE9jY3VycmVuY2VUeXBlLmdldChjb21wdXRlTW9mT2NjdXJyZW5jZShybikpOwotCS8vIGVsZW1SZWYuc2V0T2NjdXJyZW5jZShvY2N1cnJlbmNlVHlwZSk7Ci0JLy8KLQkvLyAvLyBBZGQgRFRERWxlbWVudFJlZmVyZW5jZSB0byB0aGUgR3JvdXAKLQkvLyBwYXJlbnQuZ2V0Q29udGVudCgpLmFkZChlbGVtUmVmKTsKLQkvLyB9Ci0JLy8gZWxzZSAvLyBQRSBSZWZlcmVuY2UKLQkvLyB7Ci0JLy8gU3RyaW5nIGVudGl0eU5hbWUgPSBybi5nZXROYW1lKCkudHJpbSgpOwotCS8vCi0JLy8KLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNNIFBFIFJlZiBuYW1lOiAiICsgZW50aXR5TmFtZSk7Ci0JLy8gRFRERW50aXR5IGFuRW50aXR5ID0gKERUREVudGl0eSkgZHRkVXRpbC5nZXRQRVBvb2woKS5nZXQoZW50aXR5TmFtZSk7Ci0JLy8gaWYgKGFuRW50aXR5IT1udWxsKQotCS8vIHsKLQkvLyAvLwotCS8vIC8vIENyZWF0ZSBhbiBEVERFbnRpdHlSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZCBlbGVtZW50Ci0JLy8gLy8KLQkvLyBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IGVuUmVmID0KLQkvLyBmYWN0b3J5LmNyZWF0ZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKTsKLQkvLyBlblJlZi5zZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eShhbkVudGl0eSk7Ci0JLy8gICAgICAgICAgICAgCi0JLy8gRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPQotCS8vIERURE9jY3VycmVuY2VUeXBlLmdldChjb21wdXRlTW9mT2NjdXJyZW5jZShybikpOwotCS8vIGVuUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCS8vCi0JLy8KLQkvLyAvLyBBZGQgRFRERW50aXR5UmVmZXJlbmNlIHRvIHRoZSBHcm91cAotCS8vIHBhcmVudC5nZXRDb250ZW50KCkuYWRkKGVuUmVmKTsKLQkvLwotCS8vCi0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEZpbmQgdGhlIHJlYWwgZWxlbWVudCB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgdGhlIGN1cnJlbnQgZWxlbWVudAotCS8vICovCi0JLy8gcHJvdGVjdGVkIERUREVsZW1lbnQgY3JlYXRlT3JGaW5kRWxlbWVudEdlbihTdHJpbmcgbmFtZSwgT2JqZWN0IG9iaikgewotCS8vCi0JLy8gLy8gRFRERWxlbWVudCBhRWxlbWVudCA9IGdldERUREZpbGUoKS5maW5kRWxlbWVudChuYW1lKTsKLQkvLwotCS8vCi0JLy8gRFRERWxlbWVudCBhRWxlbWVudCA9IChEVERFbGVtZW50KSBkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkuZ2V0KG5hbWUpOwotCS8vCi0JLy8KLQkvLyBpZiAoYUVsZW1lbnQgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gcmV0dXJuIGFFbGVtZW50OwotCS8vIH0KLQkvLwotCS8vCi0JLy8gU3RyaW5nIGVycm9yTXNnID0KLQkvLyBEVERDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJfRVJST1JfVU5ERUNMQVJFRF9FTEVNRU5UXzEiKTsKLQkvLyBlcnJvck1zZyArPSAiXCIiICsgbmFtZSArICJcIiI7Ci0JLy8gZXJyb3JNc2cgKz0KLQkvLyBEVERDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJfVUlfRVJST1JQQVJUX1VOREVDTEFSRURfRUxFTUVOVF8yIik7Ci0JLy8KLQkvLwotCS8vIEVycm9yTWVzc2FnZSBkdGRFcnJvciA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQkvLyAgICAgCi0JLy8gZHRkRXJyb3Iuc2V0RXJyb3JNZXNzYWdlKGVycm9yTXNnKTsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZHRkRXJyb3IsIG9iaik7Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKGVycm9yTXNnKTsKLQkvLyAvLyBzZXREVERFcnJvck1lc3NhZ2UoZXJyb3JNc2cpOwotCS8vIGdldERUREZpbGUoKS5zZXRQYXJzZUVycm9yKHRydWUpOwotCS8vCi0JLy8KLQkvLyAvLwotCS8vIC8vIENyZWF0ZSBhbiBlbXB0eSBlbGVtZW50IGZvciB0aGUgcmVmZXJlbmNlIHRvIG1ha2UgaXQgdmFsaWQKLQkvLyAvLwotCS8vCi0JLy8KLQkvLyBEVERGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KCk7Ci0JLy8gRFRERWxlbWVudCBkdGRlbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVEVERFbGVtZW50KCk7Ci0JLy8gZHRkZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCS8vCi0JLy8KLQkvLyBEVERFbXB0eUNvbnRlbnQgZW1wdHlDb250ZW50ID0gZmFjdG9yeS5jcmVhdGVEVERFbXB0eUNvbnRlbnQoKTsKLQkvLyBkdGRlbGVtZW50LnNldENvbnRlbnQoZW1wdHlDb250ZW50KTsKLQkvLwotCS8vCi0JLy8gZ2V0RFRERmlsZSgpLmdldERURE9iamVjdCgpLmFkZChkdGRlbGVtZW50KTsKLQkvLyBkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkucHV0KG5hbWUsZHRkZWxlbWVudCk7Ci0JLy8gcmV0dXJuIGR0ZGVsZW1lbnQ7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQ29tcHV0ZSB0aGUgTU9GIG9jY3VycmVuY2UgZnJvbSB0aGUgeG1sNGogb2NjdXJyZW5jZQotCS8vICovCi0JLy8gcHJvdGVjdGVkIGludCBjb21wdXRlTW9mT2NjdXJyZW5jZUdlbihDTVJlcGVhdGFibGVOb2RlIHJub2RlKSB7Ci0JLy8KLQkvLyBpbnQgb2NjdXJyZW5jZSA9IHJub2RlLmdldE9jY3VycmVuY2UoKTsKLQkvLyBpbnQgbW9mb2NjdXIgPSBEVERPY2N1cnJlbmNlVHlwZS5PTkU7Ci0JLy8KLQkvLwotCS8vIGlmIChvY2N1cnJlbmNlID09IENNTm9kZVR5cGUuWkVST19PUl9NT1JFKQotCS8vIHsKLQkvLyBtb2ZvY2N1ciA9IERURE9jY3VycmVuY2VUeXBlLlpFUk9fT1JfTU9SRTsKLQkvLyB9Ci0JLy8gZWxzZSBpZiAob2NjdXJyZW5jZSA9PSBDTU5vZGVUeXBlLk9ORV9PUl9NT1JFKQotCS8vIHsKLQkvLyBtb2ZvY2N1ciA9IERURE9jY3VycmVuY2VUeXBlLk9ORV9PUl9NT1JFOwotCS8vIH0KLQkvLyBlbHNlIGlmIChvY2N1cnJlbmNlID09IENNTm9kZVR5cGUuT1BUSU9OQUwpCi0JLy8gewotCS8vIG1vZm9jY3VyID0gRFRET2NjdXJyZW5jZVR5cGUuT1BUSU9OQUw7Ci0JLy8gfQotCS8vIHJldHVybiBtb2ZvY2N1cjsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBDb21wdXRlIHRoZSBNT0YgbW9kZWwgZ3JvdXAgZnJvbSB0aGUgeG1sNGogbW9kZWwgZ3JvdXAKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBpbnQgY29tcHV0ZU1vZkdyb3VwS2luZEdlbihpbnQgdHlwZSkgewotCS8vCi0JLy8gaWYgKHR5cGUgPT0gQ01Ob2RlVHlwZS5HUk9VUF9DSE9JQ0UpCi0JLy8gewotCS8vIHJldHVybiBEVERHcm91cEtpbmQuQ0hPSUNFOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIHJldHVybiBEVERHcm91cEtpbmQuU0VRVUVOQ0U7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZXNHZW4oRFRERWxlbWVudCBlbGVtZW50LCBBdHRsaXN0IGF0dExpc3QpCi0JLy8gewotCS8vCi0JLy8gaWYgKGF0dExpc3QuZ2V0RXJyb3JNZXNzYWdlKCkhPW51bGwpCi0JLy8gewotCS8vIGFkZEVycm9yTWVzc2FnZShhdHRMaXN0LmdldEVycm9yTWVzc2FnZSgpLCBlbGVtZW50KTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIGZvciAoaW50IGk9MDtpPGF0dExpc3Quc2l6ZSgpO2krKykKLQkvLyB7Ci0JLy8gQXR0Tm9kZSBhZCA9IChBdHROb2RlKSBhdHRMaXN0LmVsZW1lbnRBdChpKTsKLQkvLyAvLyBEVERBdHRyaWJ1dGVFbGVtZW50IGR0ZEF0dD0gZ2V0RFREQXR0cmlidXRlRWxlbWVudChhLmdldE5hbWUoKSk7Ci0JLy8KLQkvLwotCS8vIC8vIG9ubHkgYWRkIHRoZSBBdHREZWYgaWYgaXQgaXMgbm90IGFkZGVkIHlldAotCS8vIC8vIGlnbm9yZSB0aGUgZHVwIEF0dERlZiBhcyBkb2N1bWVudGVkIGluIHRoZSBYTUwgMS4wIHNwZWNzCi0JLy8gLy9pZiggZHRkQXR0PT1udWxsKQotCS8vIGFkZEF0dHJpYnV0ZShlbGVtZW50LCBhZCk7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIENyZWF0ZSBhIERUREF0dHJpYnV0ZSBmcm9tIHRoZSB4bWw0aiBhdHRyaWJ1dGUKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZUdlbihEVERFbGVtZW50IGR0ZGVsZW1lbnQsIEF0dE5vZGUgYWQpIHsKLQkvLwotCS8vIERUREF0dHJpYnV0ZSBkdGRhdHRyID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREF0dHJpYnV0ZSgpOwotCS8vIGR0ZGVsZW1lbnQuZ2V0RFREQXR0cmlidXRlKCkuYWRkKGR0ZGF0dHIpOwotCS8vIGZpbmlzaEF0dHJpYnV0ZShkdGRhdHRyLCBhZCk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgZmluaXNoQXR0cmlidXRlR2VuKERUREF0dHJpYnV0ZSBkdGRhdHRyLCBBdHROb2RlIGF0dGRlZikKLQkvLyB7Ci0JLy8KLQkvLyBib29sZWFuIHBhcnNlRXJyb3IgPSBmYWxzZTsKLQkvLwotCS8vCi0JLy8gaWYgKGF0dGRlZi5uYW1lLnN0YXJ0c1dpdGgoIiUiKSkKLQkvLyB7Ci0JLy8gU3RyaW5nIHBlTmFtZSA9IGF0dGRlZi5uYW1lLnRyaW0oKTsKLQkvLyBEVERFbnRpdHkgZW4gPSAoRFRERW50aXR5KSBkdGRVdGlsLmdldFBFUG9vbCgpLmdldChwZU5hbWUpOwotCS8vIGlmIChlbiE9bnVsbCkKLQkvLyB7Ci0JLy8gZHRkYXR0ci5zZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eShlbik7Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vCi0JLy8gZHRkYXR0ci5zZXROYW1lKGF0dGRlZi5uYW1lKTsKLQkvLwotCS8vCi0JLy8gaW50IGF0dHJUeXBlID0gYXR0ZGVmLmdldERlY2xhcmVkVHlwZSgpOwotCS8vCi0JLy8KLQkvLyBpZiAoYXR0clR5cGU9PUF0dE5vZGUuUEVSRUZFUkVOQ0UgJiYgYXR0ZGVmLnR5cGUhPW51bGwpCi0JLy8gewotCS8vIFN0cmluZyBwZU5hbWUgPSBhdHRkZWYudHlwZS50cmltKCk7Ci0JLy8gRFRERW50aXR5IGVuID0gKERUREVudGl0eSkgZHRkVXRpbC5nZXRQRVBvb2woKS5nZXQocGVOYW1lKTsKLQkvLyBpZiAoZW4hPW51bGwpCi0JLy8gewotCS8vIGR0ZGF0dHIuc2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoZW4pOwotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfQ0RBVEEoKSk7IC8vIGhhY2ssCi0JLy8gc28gd2UgY2FuIGdldCBiYWNrIHRoZSBkZWZhdWx0IHZhbHVlCi0JLy8gfQotCS8vIGVsc2UgLy9zZXQgZGVmYXVsdCB0eXBlCi0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9DREFUQSgpKTsKLQkvLwotCS8vCi0JLy8gfQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gc3dpdGNoIChhdHRyVHlwZSkKLQkvLyB7Ci0JLy8gY2FzZSBBdHROb2RlLkNEQVRBOgotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfQ0RBVEEoKSk7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGNhc2UgQXR0Tm9kZS5FTlRJVElFUzoKLQkvLyBzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0VOVElUSUVTKCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuRU5USVRZOgotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfRU5USVRZKCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuSUQ6Ci0JLy8gLy8gY2hlY2sgZm9yIGR1cGxpY2F0ZSBJRCBhdHRyaWJ1dGUKLQkvLyBpZiAoaGFzSURBdHRyaWJ1dGUoZHRkYXR0cikpCi0JLy8gewotCS8vIFN0cmluZyBlcnJNc2cgPSBEVERDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJfRVJST1JfRFVQX0lEX0FUVFJJQlVURV8xIik7Ci0JLy8gZXJyTXNnICs9IGF0dGRlZi5uYW1lICsKLQkvLyBEVERDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJfVUlfRVJST1JQQVJUX0RVUF9JRF9BVFRSSUJVVEVfMiIpOwotCS8vIC8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldElFbGVtZW50KCkuc2V0RFRERXJyb3JNZXNzYWdlKGVyck1zZyk7Ci0JLy8gLy8gZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpLnNldFBhcnNlRXJyb3IodHJ1ZSk7Ci0JLy8gcGFyc2VFcnJvciA9IHRydWU7Ci0JLy8gfQotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfSUQoKSk7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGNhc2UgQXR0Tm9kZS5JRFJFRjoKLQkvLyBzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0lEUkVGKCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuSURSRUZTOgotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfSURSRUZTKCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuRU5VTUVSQVRJT046Ci0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgY3JlYXRlRFRERW51bWVyYXRpb24oZHRkYXR0ciwgYXR0ZGVmLAotCS8vIERUREVudW1Hcm91cEtpbmQuTkFNRV9UT0tFTl9HUk9VUCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuTk9UQVRJT046Ci0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgY3JlYXRlRFRERW51bWVyYXRpb24oZHRkYXR0ciwgYXR0ZGVmLAotCS8vIERUREVudW1Hcm91cEtpbmQuTk9UQVRJT05fR1JPVVApKTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLk5NVE9LRU46Ci0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9OTVRPS0VOKCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuTk1UT0tFTlM6Ci0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9OTVRPS0VOUygpKTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gZGVmYXVsdDoKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRUREFUVFIgJyIgK2F0dGRlZi5uYW1lICsgIidVbmtub3duIHR5cGUuLi4iICsKLQkvLyBhdHRyVHlwZSk7Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vCi0JLy8gaW50IGF0dHJEZWZhdWx0ID0gYXR0ZGVmLmdldERlZmF1bHRUeXBlKCk7Ci0JLy8gaW50IGRlZmF1bHRLaW5kID0gRFRERGVmYXVsdEtpbmQuSU1QTElFRDsKLQkvLyBzd2l0Y2ggKGF0dHJEZWZhdWx0KQotCS8vIHsKLQkvLyBjYXNlIEF0dE5vZGUuRklYRUQ6Ci0JLy8gZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5GSVhFRDsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLklNUExJRUQ6Ci0JLy8gZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5JTVBMSUVEOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuUkVRVUlSRUQ6Ci0JLy8gZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5SRVFVSVJFRDsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLk5PRklYRUQ6Ci0JLy8gZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5OT0ZJWEVEOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBkZWZhdWx0OgotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRFREQVRUUiAnIiArYXR0ZGVmLm5hbWUgKyAiJyBVbmtub3duIGRlZmF1bHQKLQkvLyB0eXBlLi4uICIgKyBhdHRyRGVmYXVsdCk7Ci0JLy8gfQotCS8vCi0JLy8gRFRERGVmYXVsdEtpbmQgZGVmYXVsdEtpbmRPYmogPSBEVEREZWZhdWx0S2luZC5nZXQoZGVmYXVsdEtpbmQpOwotCS8vIGR0ZGF0dHIuc2V0RGVmYXVsdEtpbmQoZGVmYXVsdEtpbmRPYmopOwotCS8vCi0JLy8gaWYgKHBhcnNlRXJyb3IpCi0JLy8gewotCS8vIHJldHVybjsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIFN0cmluZyBkZWZhdWx0VmFsdWUgPSBhdHRkZWYuZGVmYXVsdFZhbHVlOwotCS8vIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gaWYgKGF0dHJUeXBlID09IEF0dE5vZGUuRU5VTUVSQVRJT04gfHwgYXR0clR5cGUgPT0gQXR0Tm9kZS5OT1RBVElPTikKLQkvLyB7Ci0JLy8gaWYgKCEgaXNEZWZhdWx0RW51bVZhbHVlVmFsaWQoYXR0ZGVmLGRlZmF1bHRWYWx1ZSkpCi0JLy8gewotCS8vIFN0cmluZyB0eXBlU3RyaW5nID0KLQkvLyAoYXR0clR5cGU9PUF0dE5vZGUuRU5VTUVSQVRJT04/ImVudW1lcmF0aW9uIjoibm90YXRpb24iKTsKLQkvLyBTdHJpbmcgZXJyTXNnID0KLQkvLyBEVERDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJfRVJST1JfSU5WQUxJRF9ERUZBVUxUX0FUVFJfVkFMVUVfMSIpOwotCS8vIGVyck1zZyArPSB0eXBlU3RyaW5nICsKLQkvLyBEVERDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJfVUlfRVJST1JQQVJUX0lOVkFMSURfREVGQVVMVF9BVFRSX1ZBTFVFXzIiKTsKLQkvLyBlcnJNc2cgKz0gYXR0ZGVmLm5hbWUgKyAiJyI7Ci0JLy8KLQkvLwotCS8vIC8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldElFbGVtZW50KCkuc2V0RFRERXJyb3JNZXNzYWdlKGVyck1zZyk7Ci0JLy8gLy8gZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpLnNldFBhcnNlRXJyb3IodHJ1ZSk7Ci0JLy8gcmV0dXJuOwotCS8vIH0KLQkvLyB9Ci0JLy8gZHRkYXR0ci5zZXREZWZhdWx0VmFsdWVTdHJpbmcoZGVmYXVsdFZhbHVlKTsKLQkvLyB9Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJEVERBdHRyIC0gdG9Nb2YgZ2V0RGVmYXVsdFZhbHVlU3RyaW5nICIgKwotCS8vIGdldERlZmF1bHRWYWx1ZVN0cmluZygpKTsKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRUREF0dHIgLSB0b01vZiBnZXREZWZhdWx0VmFsdWU6ICIgKwotCS8vIGdldERlZmF1bHRWYWx1ZSgpKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNJREF0dHJpYnV0ZUdlbihEVERBdHRyaWJ1dGUgZHRkYXR0cikgewotCS8vCi0JLy8gYm9vbGVhbiBoYXNJRCA9IGZhbHNlOwotCS8vCi0JLy8KLQkvLyBEVERFbGVtZW50IGVsZW1lbnQgPSBkdGRhdHRyLmdldERUREVsZW1lbnQoKTsKLQkvLyBFTGlzdCBhdHRycyA9IGVsZW1lbnQuZ2V0RFREQXR0cmlidXRlKCk7Ci0JLy8KLQkvLwotCS8vIEl0ZXJhdG9yIGkgPSBhdHRycy5pdGVyYXRvcigpOwotCS8vIHdoaWxlIChpLmhhc05leHQoKSkKLQkvLyB7Ci0JLy8gRFREQXR0cmlidXRlIGF0dHIgPSAoRFREQXR0cmlidXRlKSBpLm5leHQoKTsKLQkvLyBEVERUeXBlIGRUeXBlID0gYXR0ci5nZXREVERUeXBlKCk7Ci0JLy8gaWYgKGRUeXBlIGluc3RhbmNlb2YgRFREQmFzaWNUeXBlKQotCS8vIHsKLQkvLyBpZiAoICgoRFREQmFzaWNUeXBlKWRUeXBlKS5nZXRLaW5kKCkuZ2V0VmFsdWUoKSA9PSBEVERCYXNpY1R5cGVLaW5kLklEKQotCS8vIHsKLQkvLyBoYXNJRCA9IHRydWU7Ci0JLy8gYnJlYWs7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGhhc0lEOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBEVERFbnVtZXJhdGlvblR5cGUgY3JlYXRlRFRERW51bWVyYXRpb25HZW4oRFREQXR0cmlidXRlCi0JLy8gZHRkYXR0ciwgU3RyaW5nW10gZW51bVZhbHVlcywgaW50IGVudW1LaW5kKSB7Ci0JLy8KLQkvLyBEVERFbnVtZXJhdGlvblR5cGUgZW51bSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbnVtZXJhdGlvblR5cGUoKTsKLQkvLyAvLyBUaGlzIGlzIGdyb3NzLCBidXQgdGhpcyBpcyB3aGF0IHdhcyBkb25lIGJlZm9yZS4KLQkvLyBEVERBdHRyaWJ1dGVJbXBsIGR0ZGF0dHJpbXBsID0gKERUREF0dHJpYnV0ZUltcGwpIGR0ZGF0dHI7Ci0JLy8gLy8gZW51bS5zZXRJRCgiRW51bV8iICsKLQkvLyAoKERUREVsZW1lbnQpZHRkYXR0cmltcGwuZ2V0TU9GRG9tYWluKCkpLmdldE5hbWUoKSArICJfIiArCi0JLy8gZHRkYXR0ci5nZXROYW1lKCkpOwotCS8vIERUREVudW1Hcm91cEtpbmQgZ3JvdXBLaW5kID0gRFRERW51bUdyb3VwS2luZC5nZXQoZW51bUtpbmQpOwotCS8vIGVudW0uc2V0S2luZChncm91cEtpbmQpOwotCS8vIC8vIEVudW1lcmF0aW9uIHZhbHVlcwotCS8vIGlmIChlbnVtVmFsdWVzIT1udWxsKQotCS8vIHsKLQkvLyBmb3IoaW50IGk9MDtpPGVudW1WYWx1ZXMubGVuZ3RoO2krKykKLQkvLyB7Ci0JLy8gRUVudW1MaXRlcmFsIGVudW1MaXRlcmFsID0gY3JlYXRlRUVudW1MaXRlcmFsKCk7Ci0JLy8gLy8gZW51bVZhbC5zZXRYTUlEb2N1bWVudChkdGRhdHRyLmdldFhNSURvY3VtZW50KCkpOwotCS8vIGVudW1MaXRlcmFsLnJlZlNldExpdGVyYWwoZW51bVZhbHVlc1tpXSk7Ci0JLy8gLy8gZW51bUxpdGVyYWwuc2V0TnVtYmVyKGkpOwotCS8vIGVudW0uZ2V0RW51bUxpdGVyYWxzKCkuYWRkKGVudW1MaXRlcmFsKTsKLQkvLyB9Ci0JLy8gfQotCS8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKS5nZXREVERFbnVtZXJhdGlvblR5cGUoKS5hZGQoZW51bSk7Ci0JLy8gcmV0dXJuIGVudW07Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIEVFbnVtTGl0ZXJhbCBjcmVhdGVFRW51bUxpdGVyYWxHZW4oKSB7Ci0JLy8KLQkvLyBFY29yZVBhY2thZ2UgZVBhY2thZ2UgPQotCS8vIChFY29yZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOwotCS8vIHJldHVybiAoKEVjb3JlRmFjdG9yeSllUGFja2FnZS5nZXRGYWN0b3J5KCkpLmNyZWF0ZUVFbnVtTGl0ZXJhbCgpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBEVERFbnVtZXJhdGlvblR5cGUgY3JlYXRlRFRERW51bWVyYXRpb25HZW4oRFREQXR0cmlidXRlCi0JLy8gZHRkYXR0ciwgQXR0Tm9kZSBhdHRkZWYsIGludCBlbnVtS2luZCkgewotCS8vCi0JLy8gRFRERW51bWVyYXRpb25UeXBlIGVudW0gPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW51bWVyYXRpb25UeXBlKCk7Ci0JLy8gLy8gVGhpcyBpcyBncm9zcywgYnV0IHRoaXMgaXMgd2hhdCB3YXMgZG9uZSBiZWZvcmUuCi0JLy8gRFREQXR0cmlidXRlSW1wbCBkdGRhdHRyaW1wbCA9IChEVERBdHRyaWJ1dGVJbXBsKSBkdGRhdHRyOwotCS8vIC8vIGVudW0uc2V0SUQoIkVudW1fIiArCi0JLy8gKChEVERFbGVtZW50KWR0ZGF0dHJpbXBsLmdldE1PRkRvbWFpbigpKS5nZXROYW1lKCkgKyAiXyIgKwotCS8vIGR0ZGF0dHIuZ2V0TmFtZSgpKTsKLQkvLyBEVERFbnVtR3JvdXBLaW5kIGdyb3VwS2luZCA9IERUREVudW1Hcm91cEtpbmQuZ2V0KGVudW1LaW5kKTsKLQkvLyBlbnVtLnNldEtpbmQoZ3JvdXBLaW5kKTsKLQkvLyBkdGRhdHRyLmdldERUREVsZW1lbnQoKS5nZXREVERGaWxlKCkuZ2V0RFRERW51bWVyYXRpb25UeXBlKCkuYWRkKGVudW0pOwotCS8vCi0JLy8KLQkvLyAvLyBFbnVtZXJhdGlvbiB2YWx1ZXMKLQkvLyBFbnVtZXJhdGlvbiB0b2tlbkl0ZXIgPSBhdHRkZWYuZWxlbWVudHMoKTsKLQkvLyBpZiAodG9rZW5JdGVyICE9IG51bGwpIHsKLQkvLyBpbnQgaT0wOwotCS8vIHdoaWxlICh0b2tlbkl0ZXIuaGFzTW9yZUVsZW1lbnRzKCkpCi0JLy8gewotCS8vIFN0cmluZyB2YWwgPSAoU3RyaW5nKXRva2VuSXRlci5uZXh0RWxlbWVudCgpOwotCS8vIEVFbnVtTGl0ZXJhbCBlbnVtTGl0ZXJhbCA9IGNyZWF0ZUVFbnVtTGl0ZXJhbCgpOwotCS8vIC8vIGVudW1MaXRlcmFsLnNldFhNSURvY3VtZW50KGR0ZGF0dHIuZ2V0WE1JRG9jdW1lbnQoKSk7Ci0JLy8gICAgICAgIAotCS8vCi0JLy8gZW51bUxpdGVyYWwucmVmU2V0TGl0ZXJhbCh2YWwpOwotCS8vIC8vIGVudW1MaXRlcmFsLnNldE51bWJlcihpKyspOwotCS8vIGVudW0uZ2V0RW51bUxpdGVyYWxzKCkuYWRkKGVudW1MaXRlcmFsKTsKLQkvLyB9Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyByZXR1cm4gZW51bTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlZmF1bHRFbnVtVmFsdWVWYWxpZEdlbihBdHROb2RlIGF0dGRlZiwgU3RyaW5nCi0JLy8gZGVmYXVsdFZhbHVlKSB7Ci0JLy8KLQkvLyBib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0JLy8gYm9vbGVhbiBjb250YWluc1BlcmNlbnQgPSBmYWxzZTsKLQkvLwotCS8vCi0JLy8gLy8gRW51bWVyYXRpb24gdmFsdWVzCi0JLy8gRW51bWVyYXRpb24gZW51bVZhbHVlcyA9IGF0dGRlZi5lbGVtZW50cygpOwotCS8vIHdoaWxlIChlbnVtVmFsdWVzLmhhc01vcmVFbGVtZW50cygpKQotCS8vIHsKLQkvLyBTdHJpbmcgdmFsID0gKFN0cmluZyllbnVtVmFsdWVzLm5leHRFbGVtZW50KCk7Ci0JLy8gaWYgKHZhbC5lcXVhbHMoZGVmYXVsdFZhbHVlKSkKLQkvLyB7Ci0JLy8gdmFsaWQgPSB0cnVlOwotCS8vIGJyZWFrOwotCS8vIH0KLQkvLyBpZiAodmFsLmluZGV4T2YoJyUnKSA+PSAwKQotCS8vIHsKLQkvLyBjb250YWluc1BlcmNlbnQgPSB0cnVlOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIHZhbGlkIHx8IGNvbnRhaW5zUGVyY2VudDsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBzZXRBdHRyRFREVHlwZUdlbihEVERBdHRyaWJ1dGUgZHRkYXR0ciwgRFREVHlwZSB0eXBlKSB7Ci0JLy8KLQkvLyBkdGRhdHRyLnNldERURFR5cGUodHlwZSk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgYWRkRXJyb3JNZXNzYWdlR2VuKEVycm9yTWVzc2FnZSBlcnJNc2csIE9iamVjdCBvYmopIHsKLQkvLwotCS8vIGVyck1zZy5zZXRPYmplY3Qob2JqKTsKLQkvLyBkdGRVdGlsLmFkZEVycm9yTWVzc2FnZShlcnJNc2cpOwotCS8vIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERPYmplY3RGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERPYmplY3RGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY0YTMxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFRET2JqZWN0RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFNvdXJjZU9mZnNldDsKLQotcHVibGljIGNsYXNzIERURE9iamVjdEZpbmRlciBleHRlbmRzIERURFZpc2l0b3IgewotCXB1YmxpYyBjbGFzcyBTb3VyY2VPZmZzZXQgewotCQkvLyBDb252ZW5pZW5jZSBjbGFzcyB0byBmaW5kIGNvbnRhaW5tZW50IG9mIG9iamVjdAotCQlwcml2YXRlIGludCBzdGFydCwgZW5kOwotCi0JCXB1YmxpYyBTb3VyY2VPZmZzZXQoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCQl0aGlzLnN0YXJ0ID0gc3RhcnQ7Ci0JCQl0aGlzLmVuZCA9IGVuZDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFNvdXJjZU9mZnNldCBvdGhlcikgewotCQkJaWYgKHRoaXMuc3RhcnQgPD0gb3RoZXIuc3RhcnQgJiYgb3RoZXIuc3RhcnQgPD0gdGhpcy5lbmQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gLy8gZW5kIG9mIGlmICgpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCX0KLQotCVNvdXJjZU9mZnNldCBzZWFyY2hMb2NhdGlvbjsKLQotCXByaXZhdGUgU291cmNlT2Zmc2V0IG9mZnNldE9iamVjdEZvcihEVERTb3VyY2VPZmZzZXQgcykgewotCQlyZXR1cm4gbmV3IFNvdXJjZU9mZnNldChzLmdldFN0YXJ0T2Zmc2V0KCksIHMuZ2V0RW5kT2Zmc2V0KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0NvbnRhaW5tZW50KERURE9iamVjdCBvKSB7Ci0JCWlmIChvZmZzZXRPYmplY3RGb3IoKERURFNvdXJjZU9mZnNldCkgbykuY29udGFpbnMoc2VhcmNoTG9jYXRpb24pKSB7Ci0JCQljbG9zZXN0T2JqZWN0ID0gbzsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQl9Ci0KLQlwdWJsaWMgRFRET2JqZWN0RmluZGVyKGludCBzdGFydE9mZnNldCwgaW50IGVuZE9mZnNldCkgewotCQlzZWFyY2hMb2NhdGlvbiA9IG5ldyBTb3VyY2VPZmZzZXQoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVEROb3RhdGlvbihEVEROb3RhdGlvbiBub3RhdGlvbikgewotCQljaGVja0NvbnRhaW5tZW50KG5vdGF0aW9uKTsKLQkJc3VwZXIudmlzaXREVEROb3RhdGlvbihub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERFbnRpdHkoRFRERW50aXR5IGVudGl0eSkgewotCQljaGVja0NvbnRhaW5tZW50KGVudGl0eSk7Ci0JCXN1cGVyLnZpc2l0RFRERW50aXR5KGVudGl0eSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERFbGVtZW50KERUREVsZW1lbnQgZWxlbWVudCkgewotCQljaGVja0NvbnRhaW5tZW50KGVsZW1lbnQpOwotCQlzdXBlci52aXNpdERUREVsZW1lbnQoZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERBdHRyaWJ1dGUoRFREQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQljaGVja0NvbnRhaW5tZW50KGF0dHJpYnV0ZSk7Ci0JCXN1cGVyLnZpc2l0RFREQXR0cmlidXRlKGF0dHJpYnV0ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRpdHkpIHsKLQkJY2hlY2tDb250YWlubWVudChwYXJtRW50aXR5KTsKLQkJc3VwZXIudmlzaXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UocGFybUVudGl0eSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERFbGVtZW50Q29udGVudChEVERFbGVtZW50Q29udGVudCBjb250ZW50KSB7Ci0JCWNoZWNrQ29udGFpbm1lbnQoY29udGVudCk7Ci0JCXN1cGVyLnZpc2l0RFRERWxlbWVudENvbnRlbnQoY29udGVudCk7Ci0JfQotCi0JcHJpdmF0ZSBEVERPYmplY3QgY2xvc2VzdE9iamVjdCA9IG51bGw7Ci0KLQlwdWJsaWMgRFRET2JqZWN0IGdldENsb3Nlc3RPYmplY3QoKSB7Ci0JCXJldHVybiBjbG9zZXN0T2JqZWN0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU291cmNlT2Zmc2V0IG9mZnNldE9iamVjdEZvckdlbihEVERTb3VyY2VPZmZzZXQgcykgewotCi0JCXJldHVybiBuZXcgU291cmNlT2Zmc2V0KHMuZ2V0U3RhcnRPZmZzZXQoKSwgcy5nZXRFbmRPZmZzZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoZWNrQ29udGFpbm1lbnRHZW4oRFRET2JqZWN0IG8pIHsKLQotCQlpZiAob2Zmc2V0T2JqZWN0Rm9yKChEVERTb3VyY2VPZmZzZXQpIG8pLmNvbnRhaW5zKHNlYXJjaExvY2F0aW9uKSkgewotCQkJY2xvc2VzdE9iamVjdCA9IG87Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRETm90YXRpb25HZW4oRFRETm90YXRpb24gbm90YXRpb24pIHsKLQotCQljaGVja0NvbnRhaW5tZW50KG5vdGF0aW9uKTsKLQkJc3VwZXIudmlzaXREVEROb3RhdGlvbihub3RhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRERW50aXR5R2VuKERUREVudGl0eSBlbnRpdHkpIHsKLQotCQljaGVja0NvbnRhaW5tZW50KGVudGl0eSk7Ci0JCXN1cGVyLnZpc2l0RFRERW50aXR5KGVudGl0eSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRERWxlbWVudEdlbihEVERFbGVtZW50IGVsZW1lbnQpIHsKLQotCQljaGVja0NvbnRhaW5tZW50KGVsZW1lbnQpOwotCQlzdXBlci52aXNpdERUREVsZW1lbnQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFREQXR0cmlidXRlR2VuKERUREF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQotCQljaGVja0NvbnRhaW5tZW50KGF0dHJpYnV0ZSk7Ci0JCXN1cGVyLnZpc2l0RFREQXR0cmlidXRlKGF0dHJpYnV0ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlR2VuKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5KSB7Ci0KLQkJY2hlY2tDb250YWlubWVudChwYXJtRW50aXR5KTsKLQkJc3VwZXIudmlzaXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UocGFybUVudGl0eSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRERWxlbWVudENvbnRlbnRHZW4oRFRERWxlbWVudENvbnRlbnQgY29udGVudCkgewotCi0JCWNoZWNrQ29udGFpbm1lbnQoY29udGVudCk7Ci0JCXN1cGVyLnZpc2l0RFRERWxlbWVudENvbnRlbnQoY29udGVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEVERPYmplY3QgZ2V0Q2xvc2VzdE9iamVjdEdlbigpIHsKLQotCQlyZXR1cm4gY2xvc2VzdE9iamVjdDsKLQl9Ci19Ly8gRFRET2JqZWN0RmluZGVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUGF0aG5hbWVVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUGF0aG5hbWVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMDYzYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFBhdGhuYW1lVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotCi0KLXB1YmxpYyBjbGFzcyBEVERQYXRobmFtZVV0aWwgewotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIG1ha2VQYXRoKFN0cmluZyBwYXJlbnRQYXRoLCBTdHJpbmcgdHlwZSwgU3RyaW5nIG5hbWUsIGludCBjbnQpIHsKLQkJU3RyaW5nIHBuID0gbnVsbDsKLQkJbmFtZSA9IGVuY29kZShuYW1lKTsKLQkJaWYgKChuYW1lID09IG51bGwpICYmIChjbnQgPD0gMCkpIHsKLQkJCXBuID0gdHlwZTsKLQkJfQotCQllbHNlIGlmIChjbnQgPD0gMCkgewotCQkJcG4gPSB0eXBlICsgIjoiICsgKChuYW1lID09IG51bGwpID8gIiIgOiBuYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSB7Ci0JCQlwbiA9IHR5cGUgKyAiOiIgKyAoKG5hbWUgPT0gbnVsbCkgPyAiIiA6IG5hbWUpICsgIjoiICsgY250OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0KLQkJaWYgKHBhcmVudFBhdGggIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhcmVudFBhdGggKyAiLiIgKyBwbjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHBuOwotCQl9Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyBPYmplY3RbXSBwYXJzZVBhdGhDb21wb25lbnQoU3RyaW5nIHBhdGgpIHsKLQkJLyoKLQkJICogVGhpcyByb3V0aW5lIHBhcnNlIHRoZSBmaXJzdCBjb21wb25lbnQgb2YgdGhlIHBhdGggYW5kIHJldHVybnMgdGhlCi0JCSAqIHJlc3VsdCBpbiBhbiBhcnJyYXkgb2YgU3RyaW5ncy4gcmVzdWx0WzBdID0gdHlwZSAoU3RyaW5nKSByZXN1bHRbMV0gPQotCQkgKiBuYW1lIChTdHJpbmcpIHJlc3VsdFsyXSA9IGNvdW50IChJbnRlZ2VyKSByZXN1bHRbM10gPSB0aGUgcmVzdCBvZgotCQkgKiB0aGUgcGF0aCAoU3RyaW5nKQotCQkgKiAKLQkJICogRS5nLiBQYXRoQ29tcG9uZW50IHJlc3VsdFswXSByZXN1bHRbMV0gcmVzdWx0WzJdIHJlc3VsdFszXQotCQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGUKLQkJICogdHlwZSA8bnVsbD4gPG51bGw+IDxudWxsPiB0eXBlLnJlc3QgdHlwZSA8bnVsbD4gPG51bGw+IHJlc3QKLQkJICogdHlwZTpuYW1lIHR5cGUgbmFtZSA8bnVsbD4gPG51bGw+IHR5cGU6bmFtZS5yZXN0IHR5cGUgbmFtZSA8bnVsbD4KLQkJICogcmVzdCB0eXBlOjpuIHR5cGUgPG51bGw+IG4gPG51bGw+IHR5cGU6Om4ucmVzdCB0eXBlIDxudWxsPiBuIHJlc3QKLQkJICogdHlwZTpuYW1lOm4gdHlwZSBuYW1lIG4gPG51bGw+IHR5cGU6bmFtZTpuLnJlc3QgdHlwZSBuYW1lIG4gcmVzdAotCQkgKi8KLQotCQlPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0WzRdOwotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdDsKLQotCQlpbnQgaSA9IHBhdGguaW5kZXhPZignLicpOwotCQlpbnQgbGVuZ3RoID0gcGF0aC5sZW5ndGgoKTsKLQotCQlpZiAoaSA8IDApIHsKLQkJCWkgPSBsZW5ndGg7Ci0JCX0KLQotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJSW50ZWdlciBuID0gbnVsbDsKLQkJU3RyaW5nIHJlc3QgPSBudWxsOwotCi0JCS8vIGdldCB0aGUgdHlwZQotCQlpbnQgaiA9IHBhdGguaW5kZXhPZignOicpOwotCQlpZiAoaiA+IGkpCi0JCQlqID0gLTE7Ci0JCWlmIChqIDwgMCkgewotCQkJdHlwZSA9IHBhdGguc3Vic3RyaW5nKDAsIGkpOwotCQl9Ci0JCWVsc2UgewotCQkJdHlwZSA9IHBhdGguc3Vic3RyaW5nKDAsIGopOwotCi0JCQkvLyBnZXQgdGhlIG5hbWUKLQkJCWludCBrID0gcGF0aC5pbmRleE9mKCc6JywgaiArIDEpOwotCQkJaWYgKGsgPiBpKQotCQkJCWsgPSAtMTsKLQkJCWlmIChrIDwgMCkgewotCQkJCW5hbWUgPSBwYXRoLnN1YnN0cmluZyhqICsgMSwgaSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQluYW1lID0gcGF0aC5zdWJzdHJpbmcoaiArIDEsIGspOwotCi0JCQkJLy8gZ2V0IHRoZSBjb3VudAotCQkJCXRyeSB7Ci0JCQkJCW4gPSBuZXcgSW50ZWdlcihwYXRoLnN1YnN0cmluZyhrICsgMSwgaSkpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJCX0KLQkJCQlpZiAoKG4gIT0gbnVsbCkgJiYgKG4uaW50VmFsdWUoKSA8IDApKSB7Ci0JCQkJCW4gPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICgobmFtZSAhPSBudWxsKSAmJiAobmFtZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJbmFtZSA9IG51bGw7Ci0JCX0KLQotCQlpZiAoaSA8IGxlbmd0aCkgewotCQkJcmVzdCA9IHBhdGguc3Vic3RyaW5nKGkgKyAxKTsKLQkJfQotCi0JCXJlc3VsdFswXSA9IHR5cGU7Ci0JCXJlc3VsdFsxXSA9IGRlY29kZShuYW1lKTsKLQkJcmVzdWx0WzJdID0gbjsKLQkJcmVzdWx0WzNdID0gcmVzdDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlKFN0cmluZyBzKSB7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIG8gPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkpOwotCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gcy5jaGFyQXQoaSk7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjKSB8fCAoYyA9PSAnLScpKSB7Ci0JCQkJby5hcHBlbmQoYyk7Ci0JCQl9Ci0JCQllbHNlIHsgLy8gaWYgKChjID09ICcuJykgfHwgKGMgPT0gJzonKSB8fCAoYyA9PSAnXycpIHx8IC4uLikKLQkJCQkvLyBjb252ZXJ0IHRoZSBjaGFyYWN0ZXIgdG8gYSA0IGRpZ2l0IGhleCBjb2RlIHByZWZpeGVkIGJ5ICJfIgotCQkJCVN0cmluZyBoZXggPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKGMpOwotCQkJCWludCBsID0gaGV4Lmxlbmd0aCgpOwotCQkJCWlmIChsID09IDEpIHsKLQkJCQkJby5hcHBlbmQoIl8wMDAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlvLmFwcGVuZChoZXgpOwotCQkJCX0KLQkJCQllbHNlIGlmIChsID09IDIpIHsKLQkJCQkJby5hcHBlbmQoIl8wMCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW8uYXBwZW5kKGhleCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGwgPT0gMykgewotCQkJCQlvLmFwcGVuZCgiXzAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlvLmFwcGVuZChoZXgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJby5hcHBlbmQoJ18nKTsKLQkJCQkJby5hcHBlbmQoaGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gLy8gZm9yCi0JCXJldHVybiBvLnRvU3RyaW5nKCk7Ci0JfQotCi0Jc3RhdGljIHByaXZhdGUgU3RyaW5nIGRlY29kZShTdHJpbmcgcykgewotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBvID0gbmV3IFN0cmluZ0J1ZmZlcihzLmxlbmd0aCgpKTsKLQkJaW50IGxlbiA9IHMubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgYyA9IHMuY2hhckF0KGkpOwotCQkJaWYgKGMgIT0gJ18nKSB7Ci0JCQkJby5hcHBlbmQoYyk7Ci0JCQl9Ci0JCQllbHNlIHsgLy8gbmV4dCA0IGNoYXJhY3RlcnMgYXJlIHRoZSBoZXggY29kZQotCQkJCVN0cmluZyBoZXg7Ci0JCQkJaWYgKGxlbiA+IGkgKyA0KSB7Ci0JCQkJCWhleCA9IHMuc3Vic3RyaW5nKGkgKyAxLCBpICsgNSk7Ci0JCQkJCWkgKz0gNDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWhleCA9IHMuc3Vic3RyaW5nKGkgKyAxKTsKLQkJCQkJaSA9IGxlbiAtIDE7Ci0JCQkJfQotCQkJCW8uYXBwZW5kKChjaGFyKSBJbnRlZ2VyLnBhcnNlSW50KGhleCwgMTYpKTsKLQkJCX0KLQkJfSAvLyBmb3IKLQkJcmV0dXJuIG8udG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgbWFrZVBhdGhHZW4oU3RyaW5nIHBhcmVudFBhdGgsIFN0cmluZyB0eXBlLCBTdHJpbmcgbmFtZSwgaW50IGNudCkgewotCi0JCVN0cmluZyBwbiA9IG51bGw7Ci0JCW5hbWUgPSBlbmNvZGUobmFtZSk7Ci0JCWlmICgobmFtZSA9PSBudWxsKSAmJiAoY250IDw9IDApKSB7Ci0JCQlwbiA9IHR5cGU7Ci0JCX0KLQkJZWxzZSBpZiAoY250IDw9IDApIHsKLQkJCXBuID0gdHlwZSArICI6IiArICgobmFtZSA9PSBudWxsKSA/ICIiIDogbmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVsc2UgewotCQkJcG4gPSB0eXBlICsgIjoiICsgKChuYW1lID09IG51bGwpID8gIiIgOiBuYW1lKSArICI6IiArIGNudDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCi0JCWlmIChwYXJlbnRQYXRoICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJlbnRQYXRoICsgIi4iICsgcG47IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBwbjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE9iamVjdFtdIHBhcnNlUGF0aENvbXBvbmVudEdlbihTdHJpbmcgcGF0aCkgewotCi0JCS8qCi0JCSAqIFRoaXMgcm91dGluZSBwYXJzZSB0aGUgZmlyc3QgY29tcG9uZW50IG9mIHRoZSBwYXRoIGFuZCByZXR1cm5zIHRoZQotCQkgKiByZXN1bHQgaW4gYW4gYXJycmF5IG9mIFN0cmluZ3MuIHJlc3VsdFswXSA9IHR5cGUgKFN0cmluZykgcmVzdWx0WzFdID0KLQkJICogbmFtZSAoU3RyaW5nKSByZXN1bHRbMl0gPSBjb3VudCAoSW50ZWdlcikgcmVzdWx0WzNdID0gdGhlIHJlc3Qgb2YKLQkJICogdGhlIHBhdGggKFN0cmluZykKLQkJICogCi0JCSAqIEUuZy4gUGF0aENvbXBvbmVudCByZXN1bHRbMF0gcmVzdWx0WzFdIHJlc3VsdFsyXSByZXN1bHRbM10KLQkJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0eXBlCi0JCSAqIHR5cGUgPG51bGw+IDxudWxsPiA8bnVsbD4gdHlwZS5yZXN0IHR5cGUgPG51bGw+IDxudWxsPiByZXN0Ci0JCSAqIHR5cGU6bmFtZSB0eXBlIG5hbWUgPG51bGw+IDxudWxsPiB0eXBlOm5hbWUucmVzdCB0eXBlIG5hbWUgPG51bGw+Ci0JCSAqIHJlc3QgdHlwZTo6biB0eXBlIDxudWxsPiBuIDxudWxsPiB0eXBlOjpuLnJlc3QgdHlwZSA8bnVsbD4gbiByZXN0Ci0JCSAqIHR5cGU6bmFtZTpuIHR5cGUgbmFtZSBuIDxudWxsPiB0eXBlOm5hbWU6bi5yZXN0IHR5cGUgbmFtZSBuIHJlc3QKLQkJICovCi0KLQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFs0XTsKLQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0KLQkJaW50IGkgPSBwYXRoLmluZGV4T2YoJy4nKTsKLQkJaW50IGxlbmd0aCA9IHBhdGgubGVuZ3RoKCk7Ci0KLQkJaWYgKGkgPCAwKSB7Ci0JCQlpID0gbGVuZ3RoOwotCQl9Ci0KLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCUludGVnZXIgbiA9IG51bGw7Ci0JCVN0cmluZyByZXN0ID0gbnVsbDsKLQotCQkvLyBnZXQgdGhlIHR5cGUKLQkJaW50IGogPSBwYXRoLmluZGV4T2YoJzonKTsKLQkJaWYgKGogPiBpKQotCQkJaiA9IC0xOwotCQlpZiAoaiA8IDApIHsKLQkJCXR5cGUgPSBwYXRoLnN1YnN0cmluZygwLCBpKTsKLQkJfQotCQllbHNlIHsKLQkJCXR5cGUgPSBwYXRoLnN1YnN0cmluZygwLCBqKTsKLQotCQkJLy8gZ2V0IHRoZSBuYW1lCi0JCQlpbnQgayA9IHBhdGguaW5kZXhPZignOicsIGogKyAxKTsKLQkJCWlmIChrID4gaSkKLQkJCQlrID0gLTE7Ci0JCQlpZiAoayA8IDApIHsKLQkJCQluYW1lID0gcGF0aC5zdWJzdHJpbmcoaiArIDEsIGkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmFtZSA9IHBhdGguc3Vic3RyaW5nKGogKyAxLCBrKTsKLQotCQkJCS8vIGdldCB0aGUgY291bnQKLQkJCQl0cnkgewotCQkJCQluID0gbmV3IEludGVnZXIocGF0aC5zdWJzdHJpbmcoayArIDEsIGkpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCQl9Ci0JCQkJaWYgKChuICE9IG51bGwpICYmIChuLmludFZhbHVlKCkgPCAwKSkgewotCQkJCQluID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoKG5hbWUgIT0gbnVsbCkgJiYgKG5hbWUubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCW5hbWUgPSBudWxsOwotCQl9Ci0KLQkJaWYgKGkgPCBsZW5ndGgpIHsKLQkJCXJlc3QgPSBwYXRoLnN1YnN0cmluZyhpICsgMSk7Ci0JCX0KLQotCQlyZXN1bHRbMF0gPSB0eXBlOwotCQlyZXN1bHRbMV0gPSBkZWNvZGUobmFtZSk7Ci0JCXJlc3VsdFsyXSA9IG47Ci0JCXJlc3VsdFszXSA9IHJlc3Q7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGVuY29kZUdlbihTdHJpbmcgcykgewotCi0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIG8gPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkpOwotCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gcy5jaGFyQXQoaSk7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjKSB8fCAoYyA9PSAnLScpKSB7Ci0JCQkJby5hcHBlbmQoYyk7Ci0JCQl9Ci0JCQllbHNlIHsgLy8gaWYgKChjID09ICcuJykgfHwgKGMgPT0gJzonKSB8fCAoYyA9PSAnXycpIHx8IC4uLikKLQkJCQkvLyBjb252ZXJ0IHRoZSBjaGFyYWN0ZXIgdG8gYSA0IGRpZ2l0IGhleCBjb2RlIHByZWZpeGVkIGJ5ICJfIgotCQkJCVN0cmluZyBoZXggPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKGMpOwotCQkJCWludCBsID0gaGV4Lmxlbmd0aCgpOwotCQkJCWlmIChsID09IDEpIHsKLQkJCQkJby5hcHBlbmQoIl8wMDAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlvLmFwcGVuZChoZXgpOwotCQkJCX0KLQkJCQllbHNlIGlmIChsID09IDIpIHsKLQkJCQkJby5hcHBlbmQoIl8wMCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW8uYXBwZW5kKGhleCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGwgPT0gMykgewotCQkJCQlvLmFwcGVuZCgiXzAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlvLmFwcGVuZChoZXgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJby5hcHBlbmQoJ18nKTsKLQkJCQkJby5hcHBlbmQoaGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gLy8gZm9yCi0JCXJldHVybiBvLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGRlY29kZUdlbihTdHJpbmcgcykgewotCi0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIG8gPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkpOwotCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gcy5jaGFyQXQoaSk7Ci0JCQlpZiAoYyAhPSAnXycpIHsKLQkJCQlvLmFwcGVuZChjKTsKLQkJCX0KLQkJCWVsc2UgeyAvLyBuZXh0IDQgY2hhcmFjdGVycyBhcmUgdGhlIGhleCBjb2RlCi0JCQkJU3RyaW5nIGhleDsKLQkJCQlpZiAobGVuID4gaSArIDQpIHsKLQkJCQkJaGV4ID0gcy5zdWJzdHJpbmcoaSArIDEsIGkgKyA1KTsKLQkJCQkJaSArPSA0OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaGV4ID0gcy5zdWJzdHJpbmcoaSArIDEpOwotCQkJCQlpID0gbGVuIC0gMTsKLQkJCQl9Ci0JCQkJby5hcHBlbmQoKGNoYXIpIEludGVnZXIucGFyc2VJbnQoaGV4LCAxNikpOwotCQkJfQotCQl9IC8vIGZvcgotCQlyZXR1cm4gby50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERQcmludGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUHJpbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDRmODU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERQcmludGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBDRGF0YUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXBlYXRhYmxlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFNvdXJjZU9mZnNldDsKLQotCi1wdWJsaWMgY2xhc3MgRFREUHJpbnRlciBleHRlbmRzIERURFZpc2l0b3IgewotCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlib29sZWFuIHVwZGF0ZU9mZnNldCA9IHRydWU7Ci0KLQlwdWJsaWMgRFREUHJpbnRlcihib29sZWFuIHVwZGF0ZU9mZnNldCkgewotCQl0aGlzLnVwZGF0ZU9mZnNldCA9IHVwZGF0ZU9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGdldEJ1ZmZlcigpIHsKLQkJcmV0dXJuIHNiOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERmlsZShEVERGaWxlIGZpbGUpIHsKLQkJc3VwZXIudmlzaXREVERGaWxlKGZpbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRETm90YXRpb24oRFRETm90YXRpb24gbm90YXRpb24pIHsKLQkJZ2VuZXJhdGVDb21tZW50KG5vdGF0aW9uKTsKLQkJdXBkYXRlU3RhcnRPZmZzZXQobm90YXRpb24sIHNiLmxlbmd0aCgpKTsKLQkJc2IuYXBwZW5kKCI8IU5PVEFUSU9OICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChub3RhdGlvbi5nZXROYW1lKCkpLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIHB1YmxpY0lEID0gbm90YXRpb24uZ2V0UHVibGljSUQoKTsKLQkJU3RyaW5nIHN5c3RlbUlEID0gbm90YXRpb24uZ2V0U3lzdGVtSUQoKTsKLQkJaWYgKHB1YmxpY0lEID09IG51bGwgfHwgcHVibGljSUQuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlzYi5hcHBlbmQoIlNZU1RFTSAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJc2IuYXBwZW5kKCJQVUJMSUMgXCIiKS5hcHBlbmQocHVibGljSUQpLmFwcGVuZCgiXCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJaWYgKHN5c3RlbUlEID09IG51bGwpIHsKLQkJCXNiLmFwcGVuZCgiXCJcIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlzYi5hcHBlbmQoIlwiIikuYXBwZW5kKHN5c3RlbUlEKS5hcHBlbmQoIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVuZFRhZygpOwotCQl1cGRhdGVFbmRPZmZzZXQobm90YXRpb24sIHNiLmxlbmd0aCgpIC0gMSk7IC8vIC0xIGZvciB0aGUgbmV3bGluZSBjaGFyCi0JCXN1cGVyLnZpc2l0RFRETm90YXRpb24obm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERW50aXR5KERUREVudGl0eSBlbnRpdHkpIHsKLQkJZ2VuZXJhdGVDb21tZW50KGVudGl0eSk7Ci0JCXVwZGF0ZVN0YXJ0T2Zmc2V0KGVudGl0eSwgc2IubGVuZ3RoKCkpOwotCQlzYi5hcHBlbmQoIjwhRU5USVRZICIpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKQotCQkJc2IuYXBwZW5kKCIlICIpOyAvLyROT04tTkxTLTEkCi0KLQkJc2IuYXBwZW5kKGVudGl0eS5nZXROYW1lKCkpLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChlbnRpdHkuZ2V0Q29udGVudCgpLnVucGFyc2UoKSk7Ci0KLQkJZW5kVGFnKCk7Ci0JCXVwZGF0ZUVuZE9mZnNldChlbnRpdHksIHNiLmxlbmd0aCgpIC0gMSk7IC8vIC0xIGZvciB0aGUgbmV3bGluZSBjaGFyCi0JCXN1cGVyLnZpc2l0RFRERW50aXR5KGVudGl0eSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERFbGVtZW50KERUREVsZW1lbnQgZWxlbWVudCkgewotCQlnZW5lcmF0ZUNvbW1lbnQoZWxlbWVudCk7Ci0JCXVwZGF0ZVN0YXJ0T2Zmc2V0KGVsZW1lbnQsIHNiLmxlbmd0aCgpKTsKLQkJc2IuYXBwZW5kKCI8IUVMRU1FTlQgIiArIGVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlEVERFbGVtZW50Q29udGVudCBjb250ZW50ID0gZWxlbWVudC5nZXRDb250ZW50KCk7Ci0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgRFREUENEYXRhQ29udGVudCB8fCBjb250ZW50IGluc3RhbmNlb2YgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCXNiLmFwcGVuZCgiICgiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3VwZXIudmlzaXREVERFbGVtZW50KGVsZW1lbnQpOwotCQkJc2IuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJZWxzZSB7Ci0JCQlzYi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3VwZXIudmlzaXREVERFbGVtZW50KGVsZW1lbnQpOwotCQl9IC8vIGVuZCBvZiBlbHNlCi0JCWVuZFRhZygpOwotCQl1cGRhdGVFbmRPZmZzZXQoZWxlbWVudCwgc2IubGVuZ3RoKCkgLSAxKTsgLy8gLTEgZm9yIHRoZSBuZXdsaW5lIGNoYXIKLQkJdmlzaXRBdHRyaWJ1dGVzKGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5KSB7Ci0JCWdlbmVyYXRlQ29tbWVudChwYXJtRW50aXR5KTsKLQkJdXBkYXRlU3RhcnRPZmZzZXQocGFybUVudGl0eSwgc2IubGVuZ3RoKCkpOwotCQlzYi5hcHBlbmQoIiUiICsgcGFybUVudGl0eS5nZXROYW1lKCkgKyAiO1xuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl1cGRhdGVFbmRPZmZzZXQocGFybUVudGl0eSwgc2IubGVuZ3RoKCkgLSAxKTsgLy8gLTEgZm9yIHRoZSBuZXdsaW5lCi0JCQkJCQkJCQkJCQkJCS8vIGNoYXIKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVsZW1lbnRDb250ZW50KERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQpIHsKLQkJdXBkYXRlU3RhcnRPZmZzZXQoY29udGVudCwgc2IubGVuZ3RoKCkpOwotCQlTdHJpbmcgdHJhaWxpbmdDaGFycyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgRFREUmVwZWF0YWJsZUNvbnRlbnQpIHsKLQkJCURURFJlcGVhdGFibGVDb250ZW50IHJlcGVhdENvbnRlbnQgPSAoRFREUmVwZWF0YWJsZUNvbnRlbnQpIGNvbnRlbnQ7Ci0JCQlEVERPY2N1cnJlbmNlVHlwZSBvY2N1cnJlbmNlVHlwZSA9IHJlcGVhdENvbnRlbnQuZ2V0T2NjdXJyZW5jZSgpOwotCQkJLy8gSW50ZWdlciBvY2N1cnJlbmNlID0gcmVwZWF0Q29udGVudC5nZXRPY2N1cnJlbmNlKCk7Ci0JCQlpZiAob2NjdXJyZW5jZVR5cGUgIT0gbnVsbCkgewotCQkJCWludCBvY2N1clR5cGUgPSBvY2N1cnJlbmNlVHlwZS5nZXRWYWx1ZSgpOwotCQkJCWlmIChvY2N1clR5cGUgIT0gRFRET2NjdXJyZW5jZVR5cGUuT05FKSB7Ci0JCQkJCWlmIChyZXBlYXRDb250ZW50IGluc3RhbmNlb2YgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgewotCQkJCQkJc2IuYXBwZW5kKCIoIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXRyYWlsaW5nQ2hhcnMgPSAiKSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQl0cmFpbGluZ0NoYXJzICs9IChjaGFyKSBvY2N1clR5cGU7Ci0JCQkJfQotCQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREdyb3VwQ29udGVudCkgewotCQkJc3VwZXIudmlzaXREVERFbGVtZW50Q29udGVudChjb250ZW50KTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IHx8IGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQlzYi5hcHBlbmQoKChEVERSZXBlYXRhYmxlQ29udGVudCkgY29udGVudCkudW5wYXJzZVJlcGVhdGFibGVDb250ZW50KCkpOwotCQl9IC8vIGVuZCBvZiBpZiAoKQotCQllbHNlIHsKLQkJCS8vIGhhbmRsZSBEVERQQ0RhdGFDb250ZW50LCBEVERBbnlDb250ZW50IGFuZCBEVERFbXB0eUNvbnRlbnQgaGVyZQotCQkJc2IuYXBwZW5kKGNvbnRlbnQuZ2V0Q29udGVudE5hbWUoKSk7Ci0JCX0gLy8gZW5kIG9mIGVsc2UKLQkJc2IuYXBwZW5kKHRyYWlsaW5nQ2hhcnMpOwotCQl1cGRhdGVFbmRPZmZzZXQoY29udGVudCwgc2IubGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRER3JvdXBDb250ZW50KERUREdyb3VwQ29udGVudCBncm91cCkgewotCQlzYi5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAotCQlEVERHcm91cEtpbmQga2luZCA9IGdyb3VwLmdldEdyb3VwS2luZCgpOwotCQkvLyBNT0YyRU1GIFBvcnQKLQkJLy8gSW50ZWdlciBncm91cEtpbmQgPSBncm91cC5nZXRHcm91cEtpbmQoKTsKLQkJaWYgKGtpbmQgPT0gbnVsbCkgewotCQkJZ3JvdXAuc2V0R3JvdXBLaW5kKERUREdyb3VwS2luZC5nZXQoRFRER3JvdXBLaW5kLlNFUVVFTkNFKSk7Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0KLQkJU3RyaW5nIGNvbiA9IGdyb3VwLmdldEdyb3VwS2luZCgpLmdldFZhbHVlKCkgPT0gRFRER3JvdXBLaW5kLkNIT0lDRSA/ICIgfCAiIDogIiwgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJLy8gTG9vcCB0aHJ1IHRoZSBjaGlsZHJlbiBvZiB0aGUgY3VycmVudCBncm91cAotCQlDb2xsZWN0aW9uIGNvbnRlbnQgPSBncm91cC5nZXRDb250ZW50KCk7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gZmlyc3RDb250ZW50ID0gdHJ1ZTsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGNvbnRlbnQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJaWYgKCFmaXJzdENvbnRlbnQpIHsKLQkJCQkJc2IuYXBwZW5kKGNvbik7Ci0JCQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJCQllbHNlIHsKLQkJCQkJZmlyc3RDb250ZW50ID0gZmFsc2U7Ci0JCQkJfSAvLyBlbmQgb2YgZWxzZQotCQkJCXZpc2l0RFRERWxlbWVudENvbnRlbnQoKERUREVsZW1lbnRDb250ZW50KSBpLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlzYi5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCB2aXNpdEF0dHJpYnV0ZXMoRFRERWxlbWVudCBlbGVtKSB7Ci0JCUNvbGxlY3Rpb24gYXR0cnMgPSBlbGVtLmdldERUREF0dHJpYnV0ZSgpOwotCQlJdGVyYXRvciBpID0gYXR0cnMuaXRlcmF0b3IoKTsKLQkJaWYgKGF0dHJzICE9IG51bGwgJiYgaS5oYXNOZXh0KCkpIHsKLQkJCURUREF0dHJpYnV0ZSBhdHRyaWIgPSAoRFREQXR0cmlidXRlKSBpLm5leHQoKTsKLQkJCVN0cmluZyBjb21tZW50ID0gYXR0cmliLmdldENvbW1lbnQoKTsKLQkJCWlmIChjb21tZW50ICE9IG51bGwgJiYgY29tbWVudC5sZW5ndGgoKSA+IDApCi0JCQkJc2IuYXBwZW5kKCI8IS0tXG4gIikuYXBwZW5kKGNvbW1lbnQpLmFwcGVuZCgiXG4tLT5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXNiLmFwcGVuZCgiPCFBVFRMSVNUICIgKyBlbGVtLmdldE5hbWUoKSArICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXNiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQl1cGRhdGVTdGFydE9mZnNldChhdHRyaWIsIHNiLmxlbmd0aCgpKTsKLQkJCXNiLmFwcGVuZChhdHRyaWIudW5wYXJzZSgpKTsKLQkJCXVwZGF0ZUVuZE9mZnNldChhdHRyaWIsIHNiLmxlbmd0aCgpKTsKLQkJCXNiLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yICg7IGkuaGFzTmV4dCgpOykgewotCQkJCWF0dHJpYiA9IChEVERBdHRyaWJ1dGUpIGkubmV4dCgpOwotCQkJCWNvbW1lbnQgPSBhdHRyaWIuZ2V0Q29tbWVudCgpOwotCQkJCWlmIChjb21tZW50ICE9IG51bGwgJiYgY29tbWVudC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJc2IuYXBwZW5kKCI+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoY29tbWVudCAhPSBudWxsICYmIGNvbW1lbnQubGVuZ3RoKCkgPiAwKQotCQkJCQkJc2IuYXBwZW5kKCI8IS0tXG4gIikuYXBwZW5kKGNvbW1lbnQpLmFwcGVuZCgiXG4tLT5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJc2IuYXBwZW5kKCI8IUFUVExJU1QgIiArIGVsZW0uZ2V0TmFtZSgpICsgIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlzYi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXVwZGF0ZVN0YXJ0T2Zmc2V0KGF0dHJpYiwgc2IubGVuZ3RoKCkpOwotCQkJCXNiLmFwcGVuZChhdHRyaWIudW5wYXJzZSgpKTsKLQkJCQl1cGRhdGVFbmRPZmZzZXQoYXR0cmliLCBzYi5sZW5ndGgoKSk7Ci0JCQkJc2IuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzYi5hcHBlbmQoIj5cbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5kVGFnKCkgewotCQlzYi5hcHBlbmQoIj5cbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0YXJ0T2Zmc2V0KERURFNvdXJjZU9mZnNldCBvLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmICh1cGRhdGVPZmZzZXQpIHsKLQkJCW8uc2V0U3RhcnRPZmZzZXQob2Zmc2V0KTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlRW5kT2Zmc2V0KERURFNvdXJjZU9mZnNldCBvLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmICh1cGRhdGVPZmZzZXQpIHsKLQkJCW8uc2V0RW5kT2Zmc2V0KG9mZnNldCk7Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQ29tbWVudChEVERPYmplY3QgZHRkT2JqZWN0KSB7Ci0JCVN0cmluZyBjb21tZW50U3RyaW5nID0gbnVsbDsKLQotCQlpZiAoZHRkT2JqZWN0IGluc3RhbmNlb2YgRFRERWxlbWVudCkKLQkJCWNvbW1lbnRTdHJpbmcgPSAoKERUREVsZW1lbnQpIGR0ZE9iamVjdCkuZ2V0Q29tbWVudCgpOwotCQllbHNlIGlmIChkdGRPYmplY3QgaW5zdGFuY2VvZiBEVERFbnRpdHkpCi0JCQljb21tZW50U3RyaW5nID0gKChEVERFbnRpdHkpIGR0ZE9iamVjdCkuZ2V0Q29tbWVudCgpOwotCQllbHNlIGlmIChkdGRPYmplY3QgaW5zdGFuY2VvZiBEVEROb3RhdGlvbikKLQkJCWNvbW1lbnRTdHJpbmcgPSAoKERURE5vdGF0aW9uKSBkdGRPYmplY3QpLmdldENvbW1lbnQoKTsKLQotCQlpZiAoY29tbWVudFN0cmluZyAhPSBudWxsICYmIGNvbW1lbnRTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzYi5hcHBlbmQoIjwhLS0iKS5hcHBlbmQoY29tbWVudFN0cmluZykuYXBwZW5kKCItLT5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCi0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIGdldEJ1ZmZlckdlbigpIHsKLQkvLwotCS8vIHJldHVybiBzYjsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREZpbGVHZW4oRFRERmlsZSBmaWxlKSB7Ci0JLy8KLQkvLyBzdXBlci52aXNpdERUREZpbGUoZmlsZSk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXREVEROb3RhdGlvbkdlbihEVEROb3RhdGlvbiBub3RhdGlvbikgewotCS8vCi0JLy8gZ2VuZXJhdGVDb21tZW50KG5vdGF0aW9uKTsKLQkvLyB1cGRhdGVTdGFydE9mZnNldChub3RhdGlvbiwgc2IubGVuZ3RoKCkpOwotCS8vIHNiLmFwcGVuZCgiPCFOT1RBVElPTiAiKTsKLQkvLyBzYi5hcHBlbmQobm90YXRpb24uZ2V0TmFtZSgpKS5hcHBlbmQoIiAiKTsKLQkvLwotCS8vCi0JLy8gU3RyaW5nIHB1YmxpY0lEID0gbm90YXRpb24uZ2V0UHVibGljSUQoKTsKLQkvLyBTdHJpbmcgc3lzdGVtSUQgPSBub3RhdGlvbi5nZXRTeXN0ZW1JRCgpOwotCS8vIGlmIChwdWJsaWNJRCA9PSBudWxsIHx8IHB1YmxpY0lELmVxdWFscygiIikpCi0JLy8gewotCS8vIHNiLmFwcGVuZCgiU1lTVEVNICIpOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIHNiLmFwcGVuZCgiUFVCTElDIFwiIikuYXBwZW5kKHB1YmxpY0lEKS5hcHBlbmQoIlwiICIpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gaWYgKHN5c3RlbUlEPT1udWxsKQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIlwiXCIiKTsKLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIlwiIikuYXBwZW5kKHN5c3RlbUlEKS5hcHBlbmQoIlwiIik7Ci0JLy8gfQotCS8vIGVuZFRhZygpOwotCS8vIHVwZGF0ZUVuZE9mZnNldChub3RhdGlvbiwgc2IubGVuZ3RoKCkgLSAxKTsgLy8gLTEgZm9yIHRoZSBuZXdsaW5lIGNoYXIKLQkvLyBzdXBlci52aXNpdERURE5vdGF0aW9uKG5vdGF0aW9uKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREVudGl0eUdlbihEVERFbnRpdHkgZW50aXR5KSB7Ci0JLy8KLQkvLyBnZW5lcmF0ZUNvbW1lbnQoZW50aXR5KTsKLQkvLyB1cGRhdGVTdGFydE9mZnNldChlbnRpdHksIHNiLmxlbmd0aCgpKTsKLQkvLyBzYi5hcHBlbmQoIjwhRU5USVRZICIpOwotCS8vCi0JLy8KLQkvLyBpZiAoZW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkpCi0JLy8gc2IuYXBwZW5kKCIlICIpOwotCS8vCi0JLy8KLQkvLyBzYi5hcHBlbmQoZW50aXR5LmdldE5hbWUoKSkuYXBwZW5kKCIgIik7Ci0JLy8gc2IuYXBwZW5kKGVudGl0eS5nZXRDb250ZW50KCkudW5wYXJzZSgpKTsKLQkvLwotCS8vCi0JLy8gZW5kVGFnKCk7Ci0JLy8gdXBkYXRlRW5kT2Zmc2V0KGVudGl0eSwgc2IubGVuZ3RoKCkgLSAxKTsgLy8gLTEgZm9yIHRoZSBuZXdsaW5lIGNoYXIKLQkvLyBzdXBlci52aXNpdERUREVudGl0eShlbnRpdHkpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0RFRERWxlbWVudEdlbihEVERFbGVtZW50IGVsZW1lbnQpIHsKLQkvLwotCS8vIGdlbmVyYXRlQ29tbWVudChlbGVtZW50KTsKLQkvLyB1cGRhdGVTdGFydE9mZnNldChlbGVtZW50LCBzYi5sZW5ndGgoKSk7Ci0JLy8gc2IuYXBwZW5kKCI8IUVMRU1FTlQgIiArIGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkvLyBEVERFbGVtZW50Q29udGVudCBjb250ZW50ID0gZWxlbWVudC5nZXRDb250ZW50KCk7Ci0JLy8gaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERQQ0RhdGFDb250ZW50IHx8Ci0JLy8gY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIiAoIik7Ci0JLy8gc3VwZXIudmlzaXREVERFbGVtZW50KGVsZW1lbnQpOwotCS8vIHNiLmFwcGVuZCgiKSIpOwotCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JLy8gZWxzZQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIiAiKTsKLQkvLyBzdXBlci52aXNpdERUREVsZW1lbnQoZWxlbWVudCk7Ci0JLy8gfSAvLyBlbmQgb2YgZWxzZQotCS8vIGVuZFRhZygpOwotCS8vIHVwZGF0ZUVuZE9mZnNldChlbGVtZW50LCBzYi5sZW5ndGgoKSAtIDEpOyAvLyAtMSBmb3IgdGhlIG5ld2xpbmUgY2hhcgotCS8vIHZpc2l0QXR0cmlidXRlcyhlbGVtZW50KTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZAotCS8vIHZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlR2VuKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZQotCS8vIHBhcm1FbnRpdHkpIHsKLQkvLwotCS8vIGdlbmVyYXRlQ29tbWVudChwYXJtRW50aXR5KTsKLQkvLyB1cGRhdGVTdGFydE9mZnNldChwYXJtRW50aXR5LCBzYi5sZW5ndGgoKSk7Ci0JLy8gc2IuYXBwZW5kKCIlIiArIHBhcm1FbnRpdHkuZ2V0TmFtZSgpICsgIjtcbiIpOwotCS8vIHVwZGF0ZUVuZE9mZnNldChwYXJtRW50aXR5LCBzYi5sZW5ndGgoKSAtIDEpOyAvLyAtMSBmb3IgdGhlIG5ld2xpbmUKLQkvLyBjaGFyCi0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbGVtZW50Q29udGVudEdlbihEVERFbGVtZW50Q29udGVudCBjb250ZW50KSB7Ci0JLy8KLQkvLyB1cGRhdGVTdGFydE9mZnNldChjb250ZW50LCBzYi5sZW5ndGgoKSk7Ci0JLy8gU3RyaW5nIHRyYWlsaW5nQ2hhcnMgPSAiIjsKLQkvLyBpZiAoY29udGVudCBpbnN0YW5jZW9mIERURFJlcGVhdGFibGVDb250ZW50ICkKLQkvLyB7Ci0JLy8gRFREUmVwZWF0YWJsZUNvbnRlbnQgcmVwZWF0Q29udGVudCA9IChEVERSZXBlYXRhYmxlQ29udGVudCkgY29udGVudDsKLQkvLyBJbnRlZ2VyIG9jY3VycmVuY2UgPSByZXBlYXRDb250ZW50LmdldE9jY3VycmVuY2UoKTsKLQkvLyBpZiAob2NjdXJyZW5jZSAhPSBudWxsKQotCS8vIHsKLQkvLyBpbnQgb2NjdXJUeXBlID0gb2NjdXJyZW5jZS5pbnRWYWx1ZSgpOwotCS8vIGlmIChvY2N1clR5cGUgIT0gRFRET2NjdXJyZW5jZVR5cGUuT05FKQotCS8vIHsKLQkvLyBpZiAocmVwZWF0Q29udGVudCBpbnN0YW5jZW9mIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpCi0JLy8gewotCS8vIHNiLmFwcGVuZCgiKCIpOwotCS8vIHRyYWlsaW5nQ2hhcnMgPSAiKSI7Ci0JLy8gfQotCS8vIHRyYWlsaW5nQ2hhcnMgKz0gKGNoYXIpIG9jY3VyVHlwZTsKLQkvLyB9Ci0JLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkvLyB9IC8vIGVuZCBvZiBpZiAoKQotCS8vICAgIAotCS8vIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRER3JvdXBDb250ZW50KQotCS8vIHsKLQkvLyBzdXBlci52aXNpdERUREVsZW1lbnRDb250ZW50KGNvbnRlbnQpOwotCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JLy8gZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IHx8Ci0JLy8gY29udGVudCBpbnN0YW5jZW9mIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpCi0JLy8gewotCS8vIHNiLmFwcGVuZCgoKERURFJlcGVhdGFibGVDb250ZW50KWNvbnRlbnQpLnVucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpKTsKLQkvLyB9IC8vIGVuZCBvZiBpZiAoKQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gLy8gaGFuZGxlIERURFBDRGF0YUNvbnRlbnQsIERUREFueUNvbnRlbnQgYW5kIERUREVtcHR5Q29udGVudCBoZXJlCi0JLy8gc2IuYXBwZW5kKGNvbnRlbnQuZ2V0Q29udGVudE5hbWUoKSk7Ci0JLy8gfSAvLyBlbmQgb2YgZWxzZQotCS8vIHNiLmFwcGVuZCh0cmFpbGluZ0NoYXJzKTsKLQkvLyB1cGRhdGVFbmRPZmZzZXQoY29udGVudCwgc2IubGVuZ3RoKCkpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0RFRER3JvdXBDb250ZW50R2VuKERUREdyb3VwQ29udGVudCBncm91cCkgewotCS8vCi0JLy8gc2IuYXBwZW5kKCIoIik7Ci0JLy8gICAgCi0JLy8gSW50ZWdlciBncm91cEtpbmQgPSBncm91cC5nZXRHcm91cEtpbmQoKTsKLQkvLyBpZiAoZ3JvdXBLaW5kID09IG51bGwpCi0JLy8gewotCS8vIGdyb3VwLnNldEdyb3VwS2luZChEVERHcm91cEtpbmQuU0VRVUVOQ0UpOwotCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JLy8gICAgCi0JLy8gU3RyaW5nIGNvbiA9IGdyb3VwLmdldEdyb3VwS2luZCgpLmludFZhbHVlKCkgPT0gRFRER3JvdXBLaW5kLkNIT0lDRSA/ICIKLQkvLyB8ICIgOiAiLCAiOwotCS8vCi0JLy8KLQkvLyAvLyBMb29wIHRocnUgdGhlIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IGdyb3VwCi0JLy8gQ29sbGVjdGlvbiBjb250ZW50ID0gZ3JvdXAuZ2V0Q29udGVudCgpOwotCS8vIGlmIChjb250ZW50ICE9IG51bGwpCi0JLy8gewotCS8vIGJvb2xlYW4gZmlyc3RDb250ZW50ID0gdHJ1ZTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGkgPSBjb250ZW50Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0JLy8gewotCS8vIGlmICghZmlyc3RDb250ZW50KQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoY29uKTsKLQkvLyB9IC8vIGVuZCBvZiBpZiAoKQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gZmlyc3RDb250ZW50ID0gZmFsc2U7Ci0JLy8gfSAvLyBlbmQgb2YgZWxzZQotCS8vIHZpc2l0RFRERWxlbWVudENvbnRlbnQoKERUREVsZW1lbnRDb250ZW50KSBpLm5leHQoKSk7Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vCi0JLy8gc2IuYXBwZW5kKCIpIik7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXRBdHRyaWJ1dGVzR2VuKERUREVsZW1lbnQgZWxlbSkgewotCS8vCi0JLy8gQ29sbGVjdGlvbiBhdHRycyA9IGVsZW0uZ2V0RFREQXR0cmlidXRlKCk7Ci0JLy8gSXRlcmF0b3IgaSA9IGF0dHJzLml0ZXJhdG9yKCk7Ci0JLy8gaWYgKGF0dHJzICE9IG51bGwgJiYgaS5oYXNOZXh0KCkpCi0JLy8gewotCS8vIERUREF0dHJpYnV0ZSBhdHRyaWIgPSAoRFREQXR0cmlidXRlKSBpLm5leHQoKTsKLQkvLyBTdHJpbmcgY29tbWVudCA9IGF0dHJpYi5nZXRDb21tZW50KCk7Ci0JLy8gaWYgKGNvbW1lbnQhPW51bGwgJiYgY29tbWVudC5sZW5ndGgoKT4wKQotCS8vIHNiLmFwcGVuZCgiPCEtLVxuICIpLmFwcGVuZChjb21tZW50KS5hcHBlbmQoIlxuLS0+XG4iKTsKLQkvLyBzYi5hcHBlbmQoIjwhQVRUTElTVCAiICsgZWxlbS5nZXROYW1lKCkgKyAiXG4iKTsKLQkvLyBzYi5hcHBlbmQoIiAiKTsKLQkvLyB1cGRhdGVTdGFydE9mZnNldChhdHRyaWIsIHNiLmxlbmd0aCgpKTsKLQkvLyBzYi5hcHBlbmQoYXR0cmliLnVucGFyc2UoKSk7Ci0JLy8gdXBkYXRlRW5kT2Zmc2V0KGF0dHJpYiwgc2IubGVuZ3RoKCkpOwotCS8vIHNiLmFwcGVuZCgiXG4iKTsKLQkvLyBmb3IgKDsgaS5oYXNOZXh0KCk7ICkKLQkvLyB7Ci0JLy8gYXR0cmliID0gKERUREF0dHJpYnV0ZSkgaS5uZXh0KCk7Ci0JLy8gY29tbWVudCA9IGF0dHJpYi5nZXRDb21tZW50KCk7Ci0JLy8gaWYgKGNvbW1lbnQhPW51bGwgJiYgY29tbWVudC5sZW5ndGgoKT4wKQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIj5cbiIpOwotCS8vIGlmIChjb21tZW50IT1udWxsICYmIGNvbW1lbnQubGVuZ3RoKCk+MCkKLQkvLyBzYi5hcHBlbmQoIjwhLS1cbiAiKS5hcHBlbmQoY29tbWVudCkuYXBwZW5kKCJcbi0tPlxuIik7Ci0JLy8gc2IuYXBwZW5kKCI8IUFUVExJU1QgIiArIGVsZW0uZ2V0TmFtZSgpICsgIlxuIik7Ci0JLy8gfQotCS8vIHNiLmFwcGVuZCgiICIpOwotCS8vIHVwZGF0ZVN0YXJ0T2Zmc2V0KGF0dHJpYiwgc2IubGVuZ3RoKCkpOwotCS8vIHNiLmFwcGVuZChhdHRyaWIudW5wYXJzZSgpKTsKLQkvLyB1cGRhdGVFbmRPZmZzZXQoYXR0cmliLCBzYi5sZW5ndGgoKSk7Ci0JLy8gc2IuYXBwZW5kKCJcbiIpOwotCS8vIH0KLQkvLyBzYi5hcHBlbmQoIj5cbiIpOwotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBlbmRUYWdHZW4oKSB7Ci0JLy8KLQkvLyBzYi5hcHBlbmQoIj5cbiIpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXJ0T2Zmc2V0R2VuKERURFNvdXJjZU9mZnNldCBvLCBpbnQgb2Zmc2V0KSB7Ci0JLy8KLQkvLyBpZiAodXBkYXRlT2Zmc2V0KQotCS8vIHsKLQkvLyBvLnNldFN0YXJ0T2Zmc2V0KG9mZnNldCk7Ci0JLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFbmRPZmZzZXRHZW4oRFREU291cmNlT2Zmc2V0IG8sIGludCBvZmZzZXQpIHsKLQkvLwotCS8vIGlmICh1cGRhdGVPZmZzZXQpCi0JLy8gewotCS8vIG8uc2V0RW5kT2Zmc2V0KG9mZnNldCk7Ci0JLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUNvbW1lbnRHZW4oRFRET2JqZWN0IGR0ZE9iamVjdCkgewotCS8vCi0JLy8gU3RyaW5nIGNvbW1lbnRTdHJpbmcgPSBudWxsOwotCS8vCi0JLy8KLQkvLyBpZiAoZHRkT2JqZWN0IGluc3RhbmNlb2YgRFRERWxlbWVudCkKLQkvLyBjb21tZW50U3RyaW5nID0gKChEVERFbGVtZW50KWR0ZE9iamVjdCkuZ2V0Q29tbWVudCgpOwotCS8vIGVsc2UgaWYgKGR0ZE9iamVjdCBpbnN0YW5jZW9mIERUREVudGl0eSkKLQkvLyBjb21tZW50U3RyaW5nID0gKChEVERFbnRpdHkpZHRkT2JqZWN0KS5nZXRDb21tZW50KCk7Ci0JLy8gZWxzZSBpZiAoZHRkT2JqZWN0IGluc3RhbmNlb2YgRFRETm90YXRpb24pCi0JLy8gY29tbWVudFN0cmluZyA9ICgoRFRETm90YXRpb24pZHRkT2JqZWN0KS5nZXRDb21tZW50KCk7Ci0JLy8KLQkvLwotCS8vIGlmICggY29tbWVudFN0cmluZyE9bnVsbCAmJiBjb21tZW50U3RyaW5nLmxlbmd0aCgpPjApCi0JLy8gewotCS8vIHNiLmFwcGVuZCgiPCEtLSIpLmFwcGVuZChjb21tZW50U3RyaW5nKS5hcHBlbmQoIi0tPlxuIik7Ci0JLy8gfQotCS8vIH0KLX0vLyBEVERQcmludGVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFJlc291cmNlRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk4NmMzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBEVERSZXNvdXJjZUZhY3RvcnlJbXBsIGV4dGVuZHMgUmVzb3VyY2VGYWN0b3J5SW1wbCB7Ci0JcHVibGljIERURFJlc291cmNlRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFN0cmluZyBmaWxlbmFtZSkgewotCQlyZXR1cm4gbmV3IERURFJlc291cmNlSW1wbChmaWxlbmFtZSk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJcmV0dXJuIG5ldyBEVERSZXNvdXJjZUltcGwodXJpKTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBVUkkgdXJpKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbmV3IERURFJlc291cmNlSW1wbCh1cmkpOwotCQlyZXNvdXJjZXMuZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc291cmNlKTsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShSZXNvdXJjZVNldCByZXNvdXJjZXMsIFN0cmluZyB1cmkpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgRFREUmVzb3VyY2VJbXBsKHVyaSk7Ci0JCXJlc291cmNlcy5nZXRSZXNvdXJjZXMoKS5hZGQocmVzb3VyY2UpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGxvYWQoU3RyaW5nIHVyaSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gY3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJcmVzb3VyY2UubG9hZChuZXcgSGFzaE1hcCgpKTsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBsb2FkKFVSSSB1cmkpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JCXJlc291cmNlLmxvYWQobmV3IEhhc2hNYXAoKSk7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgbG9hZChSZXNvdXJjZVNldCByZXNvdXJjZXMsIFN0cmluZyB1cmkpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gbG9hZChyZXNvdXJjZXMsIHVyaSwgbmV3IEhhc2hNYXAoKSk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGxvYWQoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBVUkkgdXJpKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGxvYWQocmVzb3VyY2VzLCB1cmksIG5ldyBIYXNoTWFwKCkpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBsb2FkKFJlc291cmNlU2V0IHJlc291cmNlcywgU3RyaW5nIHVyaSwgTWFwIG9wdGlvbnMpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlKHJlc291cmNlcywgdXJpKTsKLQkJcmVzb3VyY2UubG9hZChvcHRpb25zKTsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBsb2FkKFJlc291cmNlU2V0IHJlc291cmNlcywgVVJJIHVyaSwgTWFwIG9wdGlvbnMpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlKHJlc291cmNlcywgdXJpKTsKLQkJcmVzb3VyY2UubG9hZChvcHRpb25zKTsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLX0gLy8gRFREUmVzb3VyY2VGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFJlc291cmNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDA4NWJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLQotCi1wdWJsaWMgY2xhc3MgRFREUmVzb3VyY2VJbXBsIGV4dGVuZHMgUmVzb3VyY2VJbXBsIHsKLQotCXB1YmxpYyBEVERSZXNvdXJjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIERURFJlc291cmNlSW1wbChTdHJpbmcgZmlsZW5hbWUpIHsKLQkJc3VwZXIoVVJJLmNyZWF0ZVVSSShmaWxlbmFtZSkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIj4+Pj4gRFREUmVzb3VyY2VJbXBsIGN0b3IgMSIpOwotCX0KLQotCXB1YmxpYyBEVERSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIj4+Pj4gRFREUmVzb3VyY2VJbXBsIGN0b3IgMiIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc29sdmVkIG9iamVjdCBmb3IgdGhlIGdpdmVuIFVSSQotCSAqIHtAbGluayBVUkkjZnJhZ21lbnQgZnJhZ21lbnR9LgotCSAqIDxwPgotCSAqIFRoZSBmcmFnbWVudCBlbmNvZGluZyB3aWxsIHR5cGljYWxseSBiZSB0aGF0IHByb2R1Y2VkIGJ5Ci0JICoge0BsaW5rICNnZXRVUklGcmFnbWVudCBnZXRVUklGcmFnbWVudH0uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB1cmlGcmFnbWVudAotCSAqICAgICAgICAgICAgdGhlIGZyYWdtZW50IHRvIHJlc29sdmUuCi0JICogQHJldHVybiB0aGUgcmVzb2x2ZWQgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gZnJhZ21lbnQuCi0JICogQHNlZSAjZ2V0VVJJRnJhZ21lbnQoRU9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCNnZXRFT2JqZWN0KFVSSSwgYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbCNyZXNvbHZlKEVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QjZU9iamVjdEZvclVSSUZyYWdtZW50U2VnbWVudChTdHJpbmcpCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMgbmF2aWdhdGluZyB0aGUgZnJhZ21lbnQuCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdChqYXZhLmxhbmcuU3RyaW5nIHVyaUZyYWdtZW50KSB7Ci0JCUVMaXN0IGNvbnRlbnRzID0gZ2V0Q29udGVudHMoKTsKLQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGkgPSBjb250ZW50cy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEVERGaWxlKSB7Ci0JCQkJCS8vIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSBEVERGaWxlIGluIGEgRFREIGV4dGVudAotCQkJCQlFT2JqZWN0IHJlc3VsdCA9ICgoRFRERmlsZSkgb2JqKS5maW5kT2JqZWN0KHVyaUZyYWdtZW50KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCI+Pj4gRFRES2V5IEVycm9yOiBjYW5ub3QgZmluZCBvYmplY3QgIiArIHVyaUZyYWdtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc3VwZXIuZ2V0RU9iamVjdCh1cmlGcmFnbWVudCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJJIHtAbGluayBVUkkjZnJhZ21lbnQgZnJhZ21lbnR9IHRoYXQsIHdoZW4gcGFzc2VkIHRvCi0JICoge0BsaW5rICNnZXRFT2JqZWN0IGdldEVPYmplY3R9IHdpbGwgcmV0dXJuIHRoZSBnaXZlbiBvYmplY3QuCi0JICogPHA+Ci0JICogSW4gb3RoZXIgd29yZHMsIHRoZSBmb2xsb3dpbmcgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGFueSBvYmplY3QKLQkgKiBjb250YWluZWQgYnkgYSByZXNvdXJjZToKLQkgKiAKLQkgKiA8cHJlPgotCSAqIAotCSAqICAgIFJlc291cmNlIHJlc291cmNlID0gZU9iamVjdC5lUmVzb3VyY2UoKTsKLQkgKiAgICBlT2JqZWN0ID09IHJlc291cmNlLmdldEVPYmplY3QocmVzb3VyY2UuZ2V0VVJJRnJhZ21lbnQoZU9iamVjdCkpCi0JICogCi0JICogPC9wcmU+Ci0JICogCi0JICogQW4gaW1wbGVtZW50YXRpb24gbWF5IGNob29zZSB0byB1c2UgSURzIG9yIHRvIHVzZSBzdHJ1Y3R1cmVkIFVSSQotCSAqIGZyYWdtZW50cywgYXMgc3VwcG9ydGVkIGJ5Ci0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QjZVVSSUZyYWdtZW50U2VnbWVudCBlVVJJRnJhZ21lbnRTZWdtZW50fS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGVPYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gaWRlbnRpZnkuCi0JICogQHJldHVybiB0aGUgVVJJIHtAbGluayBVUkkjZnJhZ21lbnQgZnJhZ21lbnR9IGZvciB0aGUgb2JqZWN0LgotCSAqIEBzZWUgI2dldEVPYmplY3QoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCNlVVJJRnJhZ21lbnRTZWdtZW50KG9yZy5lY2xpcHNlLmVtZi5jb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwKLQkgKiAgICAgIEVPYmplY3QpCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VVJJRnJhZ21lbnQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChlT2JqZWN0IGluc3RhbmNlb2YgRFRET2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChEVERPYmplY3QpIGVPYmplY3QpLmdldFBhdGhuYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFVSSUZyYWdtZW50KGVPYmplY3QpOwotCX0KLQotCXByaXZhdGUgRFREVXRpbCBkdGRVdGlsOwotCi0JcHVibGljIERURFV0aWwgZ2V0RFREVXRpbCgpIHsKLQkJcmV0dXJuIGR0ZFV0aWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RFREVXRpbChEVERVdGlsIGR0ZFV0aWwpIHsKLQkJdGhpcy5kdGRVdGlsID0gZHRkVXRpbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKE1hcCBvcHRpb25zKSB7Ci0KLQkJU3RyaW5nIHVyaVN0cmluZyA9IGdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JCXRyeSB7Ci0JCQlEVERVdGlsIGR0ZFV0aWwgPSBuZXcgRFREVXRpbCgpOwotCQkJZHRkVXRpbC5wYXJzZShnZXRSZXNvdXJjZVNldCgpLCB1cmlTdHJpbmcpOwotCQkJZHRkVXRpbC5zZXRSZXNvdXJjZSh0aGlzKTsKLQkJCXNldERURFV0aWwoZHRkVXRpbCk7Ci0JCQlnZXRDb250ZW50cygpLmFkZChkdGRVdGlsLmdldERUREZpbGUoKSk7Ci0KLQkJCS8vIFJlc2V0IHRoZSBkaXJ0eSBmbGFnIGFmdGVyIHRoZSByZXNvdXJjZSBpcyBsb2FkZWQKLQkJCXNldE1vZGlmaWVkKGZhbHNlKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZShPdXRwdXRTdHJlYW0gb3MsIE9iamVjdCBvcHRpb25zKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGkgPSBjb250ZW50cy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEVERGaWxlKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlEVERQcmludGVyIHByaW50ZXIgPSBuZXcgRFREUHJpbnRlcih0cnVlKTsKLQkJCQkJCXByaW50ZXIudmlzaXREVERGaWxlKChEVERGaWxlKSBvYmopOwotCi0JCQkJCQlTdHJpbmcgcyA9IHByaW50ZXIuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsKLQkJCQkJCW9zLndyaXRlKHMuZ2V0Qnl0ZXMoKSk7Ci0JCQkJCQkvLyBSZXNldCB0aGUgZGlydHkgZmxhZyBhZnRlciB0aGUgcmVzb3VyY2UgaXMgc2F2ZWQKLQkJCQkJCXNldE1vZGlmaWVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKFppcE91dHB1dFN0cmVhbSB6b3MsIFN0cmluZyBlbnRyeSwgU3RyaW5nIG1ldGFNb2RlbE5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRXhjZXB0aW9uKERURENvcmVNZXNzYWdlcy5fRVhDX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERTd2l0Y2guamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkwM2I2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50OwotCi0KLQotcHVibGljIGNsYXNzIERURFN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIERURFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIERURFN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBEVERQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCUVDbGFzcyB0aGVFQ2xhc3MgPSB0aGVFT2JqZWN0LmVDbGFzcygpOwotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXN3aXRjaCAodGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UIDogewotCQkJCQlEVERHcm91cENvbnRlbnQgZHRkR3JvdXBDb250ZW50ID0gKERUREdyb3VwQ29udGVudCkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERHcm91cENvbnRlbnQoZHRkR3JvdXBDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURURFJlcGVhdGFibGVDb250ZW50KGR0ZEdyb3VwQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERFbGVtZW50Q29udGVudChkdGRHcm91cENvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEUgOiB7Ci0JCQkJCURUREF0dHJpYnV0ZSBkdGRBdHRyaWJ1dGUgPSAoRFREQXR0cmlidXRlKSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREF0dHJpYnV0ZShkdGRBdHRyaWJ1dGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRUF0dHJpYnV0ZShkdGRBdHRyaWJ1dGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRVN0cnVjdHVyYWxGZWF0dXJlKGR0ZEF0dHJpYnV0ZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFVHlwZWRFbGVtZW50KGR0ZEF0dHJpYnV0ZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGR0ZEF0dHJpYnV0ZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGR0ZEF0dHJpYnV0ZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlQgOiB7Ci0JCQkJCURUREVsZW1lbnQgZHRkRWxlbWVudCA9IChEVERFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREVsZW1lbnQoZHRkRWxlbWVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFQ2xhc3MoZHRkRWxlbWVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERDb250ZW50KGR0ZEVsZW1lbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRUNsYXNzaWZpZXIoZHRkRWxlbWVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGR0ZEVsZW1lbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChkdGRFbGVtZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVCA6IHsKLQkJCQkJRFRERW1wdHlDb250ZW50IGR0ZEVtcHR5Q29udGVudCA9IChEVERFbXB0eUNvbnRlbnQpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRERW1wdHlDb250ZW50KGR0ZEVtcHR5Q29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERFbGVtZW50Q29udGVudChkdGRFbXB0eUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVCA6IHsKLQkJCQkJRFREQW55Q29udGVudCBkdGRBbnlDb250ZW50ID0gKERUREFueUNvbnRlbnQpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFREQW55Q29udGVudChkdGRBbnlDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURUREVsZW1lbnRDb250ZW50KGR0ZEFueUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlQgOiB7Ci0JCQkJCURURFBDRGF0YUNvbnRlbnQgZHRkcGNEYXRhQ29udGVudCA9IChEVERQQ0RhdGFDb250ZW50KSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURURFBDRGF0YUNvbnRlbnQoZHRkcGNEYXRhQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERFbGVtZW50Q29udGVudChkdGRwY0RhdGFDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVCA6IHsKLQkJCQkJRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgPSAoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFREUmVwZWF0YWJsZUNvbnRlbnQoZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFRERWxlbWVudENvbnRlbnQoZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFIDogewotCQkJCQlEVERGaWxlIGR0ZEZpbGUgPSAoRFRERmlsZSkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERGaWxlKGR0ZEZpbGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFIDogewotCQkJCQlEVERCYXNpY1R5cGUgZHRkQmFzaWNUeXBlID0gKERUREJhc2ljVHlwZSkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERCYXNpY1R5cGUoZHRkQmFzaWNUeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVDbGFzcyhkdGRCYXNpY1R5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRUNsYXNzaWZpZXIoZHRkQmFzaWNUeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVOYW1lZEVsZW1lbnQoZHRkQmFzaWNUeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoZHRkQmFzaWNUeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRSA6IHsKLQkJCQkJRFRERW51bWVyYXRpb25UeXBlIGR0ZEVudW1lcmF0aW9uVHlwZSA9IChEVERFbnVtZXJhdGlvblR5cGUpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRERW51bWVyYXRpb25UeXBlKGR0ZEVudW1lcmF0aW9uVHlwZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFRW51bShkdGRFbnVtZXJhdGlvblR5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRURhdGFUeXBlKGR0ZEVudW1lcmF0aW9uVHlwZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFQ2xhc3NpZmllcihkdGRFbnVtZXJhdGlvblR5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChkdGRFbnVtZXJhdGlvblR5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChkdGRFbnVtZXJhdGlvblR5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTiA6IHsKLQkJCQkJRFRETm90YXRpb24gZHRkTm90YXRpb24gPSAoRFRETm90YXRpb24pIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRETm90YXRpb24oZHRkTm90YXRpb24pOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFREQ29udGVudChkdGROb3RhdGlvbik7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWSA6IHsKLQkJCQkJRFRERW50aXR5IGR0ZEVudGl0eSA9IChEVERFbnRpdHkpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRERW50aXR5KGR0ZEVudGl0eSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERDb250ZW50KGR0ZEVudGl0eSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWSA6IHsKLQkJCQkJRFRERXh0ZXJuYWxFbnRpdHkgZHRkRXh0ZXJuYWxFbnRpdHkgPSAoRFRERXh0ZXJuYWxFbnRpdHkpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRERXh0ZXJuYWxFbnRpdHkoZHRkRXh0ZXJuYWxFbnRpdHkpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFRERW50aXR5Q29udGVudChkdGRFeHRlcm5hbEVudGl0eSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWSA6IHsKLQkJCQkJRFRESW50ZXJuYWxFbnRpdHkgZHRkSW50ZXJuYWxFbnRpdHkgPSAoRFRESW50ZXJuYWxFbnRpdHkpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRESW50ZXJuYWxFbnRpdHkoZHRkSW50ZXJuYWxFbnRpdHkpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFRERW50aXR5Q29udGVudChkdGRJbnRlcm5hbEVudGl0eSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFIDogewotCQkJCQlEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlID0gKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURURENvbnRlbnQoZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UIDogewotCQkJCQlEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IGR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnQgPSAoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KGR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFREUmVwZWF0YWJsZUNvbnRlbnQoZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERFbGVtZW50Q29udGVudChkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREZpbGUoRFRERmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRETm90YXRpb24oRFRETm90YXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURURENvbnRlbnQoRFREQ29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRERW50aXR5KERUREVudGl0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRERW50aXR5Q29udGVudChEVERFbnRpdHlDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFeHRlcm5hbEVudGl0eShEVERFeHRlcm5hbEVudGl0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRESW50ZXJuYWxFbnRpdHkoRFRESW50ZXJuYWxFbnRpdHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFREUmVwZWF0YWJsZUNvbnRlbnQoRFREUmVwZWF0YWJsZUNvbnRlbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbGVtZW50KERUREVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREVsZW1lbnRDb250ZW50KERUREVsZW1lbnRDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbXB0eUNvbnRlbnQoRFRERW1wdHlDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERBbnlDb250ZW50KERUREFueUNvbnRlbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURURFBDRGF0YUNvbnRlbnQoRFREUENEYXRhQ29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRER3JvdXBDb250ZW50KERUREdyb3VwQ29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFREQXR0cmlidXRlKERUREF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRERW51bWVyYXRpb25UeXBlKERUREVudW1lcmF0aW9uVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFREQmFzaWNUeXBlKERUREJhc2ljVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotCS8vCi0JLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotCS8vIC8vIHB1YmxpYyBPYmplY3QgY2FzZUVOYW1lc3BhY2UoRU5hbWVzcGFjZSBvYmplY3QpIHsKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gcmV0dXJuIG51bGw7Ci0JLy8gfQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUklDUlVMRVMuSlNFRC0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFQ2xhc3MoRUNsYXNzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFQXR0cmlidXRlKEVBdHRyaWJ1dGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVFbnVtKEVFbnVtIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFTW9kZWxFbGVtZW50KEVNb2RlbEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVOYW1lZEVsZW1lbnQoRU5hbWVkRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRVN0cnVjdHVyYWxGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRURhdGFUeXBlKEVEYXRhVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRVR5cGVkRWxlbWVudChFVHlwZWRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFQ2xhc3NpZmllcihFQ2xhc3NpZmllciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotCS8vCi0JLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotCS8vIC8vIHB1YmxpYyBPYmplY3QgY2FzZUludGVybmFsRUNsYXNzaWZpZXIoSW50ZXJuYWxFQ2xhc3NpZmllciBvYmplY3QpIHsKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gcmV0dXJuIG51bGw7Ci0JLy8gfQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUklDUlVMRVMuSlNFRC0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvLyBEVERTd2l0Y2gKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERVbmlxdWVOYW1lSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREVW5pcXVlTmFtZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjhmZjNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERVbmlxdWVOYW1lSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotCi0KLQotcHVibGljIGNsYXNzIERURFVuaXF1ZU5hbWVIZWxwZXIgewotCXB1YmxpYyBEVERVbmlxdWVOYW1lSGVscGVyKCkgewotCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlRWxlbWVudE5hbWUoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCUxpc3QgZWxlbWVudHMgPSBkdGRGaWxlLmxpc3REVERFbGVtZW50KCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKGVsZW1lbnRzLCAiTmV3RWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlRW50aXR5TmFtZShEVERGaWxlIGR0ZEZpbGUpIHsKLQkJTGlzdCBlbnRpdGllcyA9IGR0ZEZpbGUubGlzdERUREVudGl0eSgpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShlbnRpdGllcywgIk5ld0VudGl0eSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlTm90YXRpb25OYW1lKERUREZpbGUgZHRkRmlsZSkgewotCQlMaXN0IG5vdGF0aW9ucyA9IGR0ZEZpbGUubGlzdERURE5vdGF0aW9uKCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKG5vdGF0aW9ucywgIk5ld05vdGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRVbmlxdWVBdHRyaWJ1dGVOYW1lKERUREVsZW1lbnQgZWxlbWVudCkgewotCQlMaXN0IGF0dHJzID0gZWxlbWVudC5nZXREVERBdHRyaWJ1dGUoKTsKLQkJcmV0dXJuIGdldFVuaXF1ZU5hbWUoYXR0cnMsICJOZXdBdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZU5hbWUoTGlzdCBvYmpzLCBTdHJpbmcgdG9rZW4pIHsKLQkJaW50IGNvdW50ZXIgPSAxOwotCi0JCWJvb2xlYW4gdW5pcXVlTmFtZSA9IGZhbHNlOwotCQl3aGlsZSAoIXVuaXF1ZU5hbWUpIHsKLQkJCVN0cmluZyBuZXdOYW1lID0gdG9rZW4gKyBuZXcgSW50ZWdlcihjb3VudGVyKyspOwotCQkJdW5pcXVlTmFtZSA9IHRydWU7Ci0JCQlJdGVyYXRvciBpdGVyID0gb2Jqcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCVN0cmluZyBvYmpOYW1lID0gZ2V0TmFtZShvYmopOwotCQkJCWlmIChvYmpOYW1lLmVxdWFscyhuZXdOYW1lKSkgewotCQkJCQl1bmlxdWVOYW1lID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICh1bmlxdWVOYW1lKSB7Ci0JCQkJcmV0dXJuIG5ld05hbWU7Ci0JCQl9Ci0JCX0KLQkJLy8gd2Ugc2hvdWxkbid0IGdldCBoZXJlCi0JCXJldHVybiAiTm8gTmFtZSBmb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXROYW1lKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERUREVsZW1lbnQpIHsKLQkJCXJldHVybiAoKERUREVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERUREVudGl0eSkgewotCQkJcmV0dXJuICgoRFRERW50aXR5KSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEVEROb3RhdGlvbikgewotCQkJcmV0dXJuICgoRFRETm90YXRpb24pIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERUREF0dHJpYnV0ZSkgewotCQkJcmV0dXJuICgoRFREQXR0cmlidXRlKSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVFbGVtZW50TmFtZUdlbihEVERGaWxlIGR0ZEZpbGUpIHsKLQotCQlMaXN0IGVsZW1lbnRzID0gZHRkRmlsZS5saXN0RFRERWxlbWVudCgpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShlbGVtZW50cywgIk5ld0VsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVFbnRpdHlOYW1lR2VuKERUREZpbGUgZHRkRmlsZSkgewotCi0JCUxpc3QgZW50aXRpZXMgPSBkdGRGaWxlLmxpc3REVERFbnRpdHkoKTsKLQkJcmV0dXJuIGdldFVuaXF1ZU5hbWUoZW50aXRpZXMsICJOZXdFbnRpdHkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVOb3RhdGlvbk5hbWVHZW4oRFRERmlsZSBkdGRGaWxlKSB7Ci0KLQkJTGlzdCBub3RhdGlvbnMgPSBkdGRGaWxlLmxpc3REVEROb3RhdGlvbigpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShub3RhdGlvbnMsICJOZXdOb3RhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZUF0dHJpYnV0ZU5hbWVHZW4oRFRERWxlbWVudCBlbGVtZW50KSB7Ci0KLQkJTGlzdCBhdHRycyA9IGVsZW1lbnQuZ2V0RFREQXR0cmlidXRlKCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKGF0dHJzLCAiTmV3QXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlTmFtZUdlbihMaXN0IG9ianMsIFN0cmluZyB0b2tlbikgewotCi0JCWludCBjb3VudGVyID0gMTsKLQotCQlib29sZWFuIHVuaXF1ZU5hbWUgPSBmYWxzZTsKLQkJd2hpbGUgKCF1bmlxdWVOYW1lKSB7Ci0JCQlTdHJpbmcgbmV3TmFtZSA9IHRva2VuICsgbmV3IEludGVnZXIoY291bnRlcisrKTsKLQkJCXVuaXF1ZU5hbWUgPSB0cnVlOwotCQkJSXRlcmF0b3IgaXRlciA9IG9ianMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlTdHJpbmcgb2JqTmFtZSA9IGdldE5hbWUob2JqKTsKLQkJCQlpZiAob2JqTmFtZS5lcXVhbHMobmV3TmFtZSkpIHsKLQkJCQkJdW5pcXVlTmFtZSA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodW5pcXVlTmFtZSkgewotCQkJCXJldHVybiBuZXdOYW1lOwotCQkJfQotCQl9Ci0JCS8vIHdlIHNob3VsZG4ndCBnZXQgaGVyZQotCQlyZXR1cm4gIk5vIE5hbWUgZm91bmQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldE5hbWVHZW4oT2JqZWN0IG9iaikgewotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBEVERFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChEVERFbGVtZW50KSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEVERFbnRpdHkpIHsKLQkJCXJldHVybiAoKERUREVudGl0eSkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRFRETm90YXRpb24pIHsKLQkJCXJldHVybiAoKERURE5vdGF0aW9uKSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEVERBdHRyaWJ1dGUpIHsKLQkJCXJldHVybiAoKERUREF0dHJpYnV0ZSkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotfS8vIERURFVuaXF1ZU5hbWVIZWxwZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjlhN2RmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbC5EVERGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkRURFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkVycm9yTWVzc2FnZTsKLQotLyoqCi0gKiBDcmVhdGUgTU9GIG9iamVjdHMgZnJvbSB0aGUgcGFyc2VkIERURCBJZiBubyBEVEQgZmlsZSBpcyBzcGVjaWZlZCwgY3JlYXRlCi0gKiB0aGUgcm9vdCBNT0Ygb2JqZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBEVERVdGlsIHsKLQlEVERGYWN0b3J5IGZhY3Rvcnk7Ci0JRUxpc3QgZXh0ZW50OwotCVJlc291cmNlIHJlc291cmNlOwotCURUREZpbGUgZHRkRmlsZTsKLQlTdHJpbmcgZHRkTW9kZWxGaWxlOwotCWJvb2xlYW4gZXhwYW5kRW50aXR5UmVmZXJlbmNlczsKLQotCXByaXZhdGUgSGFzaHRhYmxlIGV4dGVybmFsRFRETW9kZWxzID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgSGFzaHRhYmxlIHBlUG9vbCA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIEhhc2h0YWJsZSBlbGVtZW50UG9vbCA9IG5ldyBIYXNodGFibGUoKTsKLQotCXByaXZhdGUgRFREUGFyc2VyIHBhcnNlcjsKLQotCXByaXZhdGUgVmVjdG9yIGVycm9yTXNncyA9IG5ldyBWZWN0b3IoKTsKLQotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSB1dGlsQ2FjaGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlzdGF0aWMgcHVibGljIERURFV0aWwgZ2V0RFREVXRpbEZvcihTdHJpbmcgZmlsZW5hbWUpIHsKLQkJRFREVXRpbCB1dGlsID0gKERURFV0aWwpIHV0aWxDYWNoZS5nZXQoZmlsZW5hbWUpOwotCQlpZiAodXRpbCA9PSBudWxsKSB7Ci0JCQl1dGlsID0gbmV3IERURFV0aWwoKTsKLQkJCXV0aWxDYWNoZS5wdXQoZmlsZW5hbWUsIHV0aWwpOwotCQl9Ci0KLQkJcmV0dXJuIHV0aWw7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBwYXJzZShTdHJpbmcgdXJpKSB7Ci0JCXBhcnNlKG5ldyBSZXNvdXJjZVNldEltcGwoKSwgdXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnZva2UgcGFyc2UgdG8gcGFyc2UgYSAuZHRkIGZpbGUgaW50byBhIE1PRiBvYmplY3QgbW9kZWwgVGhpcyBpcwotCSAqIGludm9rZWQgYnkgdGhlIFJlZ2lzdGVyZWREVERQYXJzZXIgdGhhdCByZWdpc3RlcnMgdGhpcyBwYXJzZXIgZm9yIE1PRgotCSAqIHRvIHVzZSBhZ2FpbnN0IHRoZSAuZHRkIHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUgLQotCSAqICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmVkIG5hbWUgb2YgYSAuZHRkIGZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZShSZXNvdXJjZVNldCByZXNvdXJjZXMsIFN0cmluZyBmaWxlbmFtZSkgewotCQkvLyBHZXQgdGhlIGR0ZCBuYW1lIGZyb20gdGhlIGZpbGUgbmFtZQotCQlQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlbmFtZSk7Ci0JCUlQYXRoIGlQYXRoID0gcGF0aC5yZW1vdmVGaWxlRXh0ZW5zaW9uKCk7Ci0JCVN0cmluZyBkdGROYW1lID0gaVBhdGgudG9GaWxlKCkuZ2V0TmFtZSgpOwotCi0JCXRyeSB7Ci0JCQlwYXJzZXIgPSBuZXcgRFREUGFyc2VyKGZhbHNlKTsKLQkJCWlmIChleHBhbmRFbnRpdHlSZWZlcmVuY2VzKSB7Ci0JCQkJcGFyc2VyLnNldEV4cGFuZEVudGl0eVJlZmVyZW5jZXMoZXhwYW5kRW50aXR5UmVmZXJlbmNlcyk7Ci0JCQl9Ci0JCQlwYXJzZXIucGFyc2UoZmlsZW5hbWUpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCQl9Ci0KLQkJZHRkTW9kZWxGaWxlID0gZmlsZW5hbWU7Ci0KLQkJZmFjdG9yeSA9IERUREZhY3RvcnlJbXBsLmluc3RhbmNlKCk7Ci0KLQkJZXh0ZW50ID0gbmV3IEJhc2ljRUxpc3QoKTsKLQotCQlkdGRGaWxlID0gZmFjdG9yeS5jcmVhdGVEVERGaWxlKCk7Ci0JCWV4dGVudC5hZGQoZHRkRmlsZSk7Ci0KLQkJZHRkRmlsZS5zZXROYW1lKGR0ZE5hbWUpOwotCi0JCXBvcHVsYXRlRFREKHJlc291cmNlcywgZXhwYW5kRW50aXR5UmVmZXJlbmNlcyk7Ci0JfQotCi0JcHVibGljIERUREZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLQkJcmV0dXJuIGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIEhhc2h0YWJsZSBnZXRQRVBvb2woKSB7Ci0JCXJldHVybiBwZVBvb2w7Ci0JfQotCi0JcHVibGljIEhhc2h0YWJsZSBnZXRFbGVtZW50UG9vbCgpIHsKLQkJcmV0dXJuIGVsZW1lbnRQb29sOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRDb250ZW50cygpIHsKLQkJcmV0dXJuIGV4dGVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgewotCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRleHBhbmRFbnRpdHlSZWZlcmVuY2VzKGJvb2xlYW4gZXhwYW5kRW50aXR5UmVmZXJlbmNlcykgewotCQl0aGlzLmV4cGFuZEVudGl0eVJlZmVyZW5jZXMgPSBleHBhbmRFbnRpdHlSZWZlcmVuY2VzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEV4cGFuZEVudGl0eVJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBleHBhbmRFbnRpdHlSZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBtb2RlbCBoYXMgYmVlbiBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW9kZWxEaXJ0eSgpIHsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJldHVybiByZXNvdXJjZS5pc01vZGlmaWVkKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGhlIC5kdGQgZmlsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhdmUoKSB7Ci0JCXRyeSB7Ci0JCQlNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlyZXNvdXJjZS5zYXZlKG9wdGlvbnMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTYXZlIG1vZGVsIGV4Y2VwdGlvbiAiICsgZXgpOyAvLyROT04tTkxTLTEkCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHNhdmVBcyhTdHJpbmcgbmV3RmlsZW5hbWUpIHsKLQkJcmVzb3VyY2Uuc2V0VVJJKFVSSS5jcmVhdGVVUkkobmV3RmlsZW5hbWUpKTsKLQkJYm9vbGVhbiBvayA9IHNhdmUoKTsKLQotCQlpZiAob2spIHsKLQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKG5ld0ZpbGVuYW1lKTsKLQkJCUlQYXRoIGlQYXRoID0gcGF0aC5yZW1vdmVGaWxlRXh0ZW5zaW9uKCk7Ci0JCQlTdHJpbmcgZHRkTmFtZSA9IGlQYXRoLnRvRmlsZSgpLmdldE5hbWUoKTsKLQotCQkJZHRkRmlsZS5zZXROYW1lKGR0ZE5hbWUpOwotCQl9Ci0JCXJldHVybiBvazsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzYXZlRFRERmlsZShTdHJpbmcgZmlsZW5hbWUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQl0cnkgewotCQkJUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZmlsZW5hbWUpLCB0cnVlKTsKLQkJCURURFByaW50ZXIgcHJpbnRlciA9IG5ldyBEVERQcmludGVyKHRydWUpOwotCQkJcHJpbnRlci52aXNpdERUREZpbGUoZHRkRmlsZSk7Ci0KLQkJCVN0cmluZyBzID0gcHJpbnRlci5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotCQkJcHcucHJpbnRsbihzKTsKLQkJCXB3LmNsb3NlKCk7Ci0JCX0KLQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREVERTb3VyY2UoYm9vbGVhbiBpbmNsdWRlRXJyb3IpIHsKLQkJcmV0dXJuIGR0ZEZpbGUudW5wYXJzZShpbmNsdWRlRXJyb3IpOyAvLyB0cnVlID0gaW5jbHVkZSBlcnJvciBsaW5lcwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBNT0Ygb2JqZWN0cyBmcm9tIERURAotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZURURChSZXNvdXJjZVNldCByZXNvdXJjZXMsIGJvb2xlYW4gZXhwYW5kRW50aXR5UmVmZXJlbmNlcykgewotCQlWZWN0b3IgZHRkTGlzdCA9IHBhcnNlci5nZXREVERMaXN0KCk7Ci0KLQkJLy8gY3JlYXRlIFhNSU1vZGVsIGZvciB0aGUgaW5jbHVkZWQgRFREcwotCQlpZiAoZHRkTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlpZiAoIWV4cGFuZEVudGl0eVJlZmVyZW5jZXMpIHsKLQkJCQlmb3IgKGludCBpID0gZHRkTGlzdC5zaXplKCkgLSAxOyBpID4gMDsgaS0tKSB7Ci0JCQkJCURURCBkdGQgPSAoRFREKSBkdGRMaXN0LmVsZW1lbnRBdChpKTsKLQkJCQkJbG9hZEluY2x1ZGVkRFREKHJlc291cmNlcywgZHRkKTsKLQkJCQl9Ci0KLQkJCQlEVEQgZHRkID0gKERURCkgZHRkTGlzdC5lbGVtZW50QXQoMCk7Ci0JCQkJcG9wdWxhdGVEVEQocmVzb3VyY2VzLCBkdGQsIGR0ZEZpbGUpOyAvLyBwb3B1bGF0ZSB0aGUgbWFpbgotCQkJCQkJCQkJCQkJCQkvLyBEVEQKLQkJCQkvLyB2YWxpZGF0ZVdpdGhNb2RlbChkdGQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZm9yIChpbnQgaSA9IGR0ZExpc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJRFREIGR0ZCA9IChEVEQpIGR0ZExpc3QuZWxlbWVudEF0KGkpOwotCQkJCQlwb3B1bGF0ZURURChyZXNvdXJjZXMsIGR0ZCwgZHRkRmlsZSk7Ci0JCQkJCS8vIHZhbGlkYXRlV2l0aE1vZGVsKGR0ZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLy8gcmV0dXJuIHRoZSBpbnN0YW5jZSB1bmlxdWUgdG8gdGhpcyBEVERVdGlsIGZpbGUgdGhhdCByZXByZXNlbnRzIGFuCi0JLy8gZXh0ZXJuYWxseSBsb2FkZWQgZHRkICh3aWxsIGNyZWF0ZSBpZiBvbmUgZG9lc24ndCBleGlzdCB5ZXQpCi0JcHVibGljIEV4dGVybmFsRFRETW9kZWwgZ2V0RXh0ZXJuYWxEVERNb2RlbChSZXNvdXJjZVNldCByZXNvdXJjZXMsIFN0cmluZyB1cmkpIHsKLQkJaWYgKGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gRGVmYXVsdE1zZ0xvZ2dlci53cml0ZSgiRXh0ZXJuYWwgRFREIG5hbWU6ICIgKyB1cmkpOwotCi0JCWlmIChleHRlcm5hbERURE1vZGVscy5jb250YWluc0tleSh1cmkpKSB7Ci0JCQlyZXR1cm4gKEV4dGVybmFsRFRETW9kZWwpIGV4dGVybmFsRFRETW9kZWxzLmdldCh1cmkpOwotCQl9Ci0JCWVsc2UgewotCQkJRXh0ZXJuYWxEVERNb2RlbCBleHRNb2RlbCA9IG5ldyBFeHRlcm5hbERURE1vZGVsKCk7Ci0JCQlpZiAoZXh0TW9kZWwubG9hZE1vZGVsKHJlc291cmNlcywgdXJpKSkgewotCQkJCWV4dGVybmFsRFRETW9kZWxzLnB1dCh1cmksIGV4dE1vZGVsKTsKLQkJCQlyZXR1cm4gZXh0TW9kZWw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gbG9hZCB4bWlNb2RlbHMgZm9yIGluY2x1ZGVkIERURHMKLQlwcml2YXRlIHZvaWQgbG9hZEluY2x1ZGVkRFREKFJlc291cmNlU2V0IHJlc291cmNlcywgRFREIGR0ZCkgewotCQlFeHRlcm5hbERURE1vZGVsIGV4dE1vZGVsID0gZ2V0RXh0ZXJuYWxEVERNb2RlbChyZXNvdXJjZXMsIGR0ZC5nZXROYW1lKCkpOwotCQlpZiAoZXh0TW9kZWwgIT0gbnVsbCkgewotCQkJLy8gbm93IGZpbGwgb3VyIGhhc2ggdGFibGVzIGZvciBlbGVtZW50cyBhbmQgcGFyYW1ldGVyIGVudGl0aWVzCi0JCQkvLyBzbyB0aGF0IHdlIGtub3cgd2hhdCBjYW4gYmUgcmVmZXJlbmNlZCBieSBvdXIgbWFpbiBkdGQKLQkJCURUREZpbGUgZmlsZSA9IGV4dE1vZGVsLmdldEV4dGVybmFsRFRERmlsZSgpOwotCQkJQ29sbGVjdGlvbiBlbGVtZW50TGlzdCA9IGZpbGUubGlzdERUREVsZW1lbnQoKTsKLQkJCUNvbGxlY3Rpb24gZW50aXR5TGlzdCA9IGZpbGUubGlzdERUREVudGl0eSgpOwotCi0JCQlJdGVyYXRvciBpID0gZWxlbWVudExpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCURURE9iamVjdCBvYmplY3QgPSAoRFRET2JqZWN0KSBpLm5leHQoKTsKLQkJCQllbGVtZW50UG9vbC5wdXQoZ2V0QmFzZU5hbWUob2JqZWN0KSwgb2JqZWN0KTsKLQkJCX0KLQotCQkJaSA9IGVudGl0eUxpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCURUREVudGl0eSBlbnRpdHkgPSAoRFRERW50aXR5KSBpLm5leHQoKTsKLQkJCQlpZiAoZW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkpIHsKLQkJCQkJcGVQb29sLnB1dChnZXRCYXNlTmFtZShlbnRpdHkpLCBlbnRpdHkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBNT0Ygb2JqZWN0cyBmcm9tIERURAotCSAqIAotCSAqIDEpIHdpbGwgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIERURCBNb2Ygb2JqZWN0IGZvciBFbnRpdHlEZWNsLAotCSAqIE5vdGF0aW9uRGVjbCBhbmQgRWxlbWVudERlY2wgZGVjbGFyYXRpb25zIGR1cmluZyB0aGUgMXN0IHBhc3MgMikgRHVyaW5nCi0JICogdGhlIDJuZCBwYXNzLCBpdCB3aWxsIGFkZCB0aGUgY29udGVudE1vZGVsIGFuZCBBdHRsaXN0IHRvIGFsbAotCSAqIEVsZW1lbnREZWNsLgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZURURChSZXNvdXJjZVNldCByZXNvdXJjZXMsIERURCBkdGQsIERUREZpbGUgZEZpbGUpIHsKLQkJRFRETW9kZWxCdWlsZGVyIG1vZGVsQnVpbGRlciA9IG5ldyBEVERNb2RlbEJ1aWxkZXIocmVzb3VyY2VzLCB0aGlzLCBkdGQsIGRGaWxlKTsKLQotCQltb2RlbEJ1aWxkZXIudmlzaXREVEQoZHRkKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGVtcHR5RXJyb3JNZXNzYWdlcygpIHsKLQkJZXJyb3JNc2dzLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRXJyb3JNZXNzYWdlKEVycm9yTWVzc2FnZSBlcnJvcikgewotCQlpbnQgdmVjdG9yU2l6ZSA9IGVycm9yTXNncy5zaXplKCk7Ci0JCWJvb2xlYW4gYWRkID0gdHJ1ZTsKLQotCQlpZiAodmVjdG9yU2l6ZSAhPSAwKSB7Ci0JCQlpbnQgaW5kZXggPSAwOwotCi0JCQl3aGlsZSAoYWRkID09IHRydWUgJiYgaW5kZXggPCB2ZWN0b3JTaXplKSB7Ci0JCQkJaWYgKCgoRXJyb3JNZXNzYWdlKSBlcnJvck1zZ3MuZWxlbWVudEF0KGluZGV4KSkuZXF1YWxzKGVycm9yKSkgewotCQkJCQlhZGQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGFkZCkgewotCQkJZXJyb3JNc2dzLmFkZEVsZW1lbnQoZXJyb3IpOwotCQl9Ci0JfQotCi0JcHVibGljIFZlY3RvciBnZXRFcnJvcnMoKSB7Ci0JCXJldHVybiBlcnJvck1zZ3M7Ci0JfQotCi0JLy8gVGhpcyBnZXRzIHRoZSBuYW1lIHdpdGhvdXQgYW55IHBzZXVkbyBuYW1lc3BhY2UgcHJlZml4Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmFzZU5hbWUoRFRET2JqZWN0IG9iaikgewotCQlyZXR1cm4gZ2V0TmFtZShvYmosIG51bGwpOwotCX0KLQotCS8vIFRoaXMgZ2V0cyB0aGUgbmFtZSB3aXRoIHBzZXVkbyBuYW1lc3BhY2UgcHJlZml4ZXMgaWYgZHRkRmlsZSBpcyBub3QKLQkvLyBudWxsCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShEVERPYmplY3Qgb2JqLCBEVERGaWxlIGR0ZEZpbGUpIHsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAob2JqIGluc3RhbmNlb2YgRFRERW50aXR5KSB7Ci0JCQlEVERFbnRpdHkgZW50aXR5ID0gKERUREVudGl0eSkgb2JqOwotCQkJaWYgKGR0ZEZpbGUgIT0gbnVsbCAmJiAhZW50aXR5LmdldERUREZpbGUoKS5lcXVhbHMoZHRkRmlsZSkpIHsKLQkJCQluYW1lID0gbmV3IFBhdGgoZW50aXR5LmdldERUREZpbGUoKS5nZXROYW1lKCkpLmxhc3RTZWdtZW50KCkgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQluYW1lICs9ICIlIiArICgoRFRERW50aXR5KSBvYmopLmdldE5hbWUoKSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRFRERWxlbWVudCkgewotCQkJRFRERWxlbWVudCBlbGVtZW50ID0gKERUREVsZW1lbnQpIG9iajsKLQkJCWlmIChkdGRGaWxlICE9IG51bGwgJiYgIWVsZW1lbnQuZ2V0RFRERmlsZSgpLmVxdWFscyhkdGRGaWxlKSkgewotCQkJCW5hbWUgPSBuZXcgUGF0aChlbGVtZW50LmdldERUREZpbGUoKS5nZXROYW1lKCkpLmxhc3RTZWdtZW50KCkgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQluYW1lICs9ICgoRFRERWxlbWVudCkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRFRERWxlbWVudENvbnRlbnQpIHsKLQkJCXJldHVybiAoKERUREVsZW1lbnRDb250ZW50KSBvYmopLmdldENvbnRlbnROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R3JvdXBUeXBlKGludCBncm91cEtpbmQsIGludCBvY2N1cnJlbmNlKSB7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQotCQlzd2l0Y2ggKGdyb3VwS2luZCkgewotCQkJY2FzZSBEVERHcm91cEtpbmQuU0VRVUVOQ0UgOgotCQkJCXR5cGUgPSAiRFREU2VxdWVuY2UiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIERUREdyb3VwS2luZC5DSE9JQ0UgOgotCQkJCXR5cGUgPSAiRFREQ2hvaWNlIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0KLQkJdHlwZSArPSBnZXRSZXBlYXRhYmxlVHlwZVN1ZmZpeChvY2N1cnJlbmNlKTsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlVHlwZShpbnQgb2NjdXJyZW5jZSkgewotCQlTdHJpbmcgdHlwZSA9ICJEVERSZWZlcmVuY2UiOyAvLyROT04tTkxTLTEkCi0JCXR5cGUgKz0gZ2V0UmVwZWF0YWJsZVR5cGVTdWZmaXgob2NjdXJyZW5jZSk7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRSZXBlYXRhYmxlVHlwZVN1ZmZpeChpbnQgb2NjdXJyZW5jZSkgewotCQlyZXR1cm4gIigiICsgKGNoYXIpIG9jY3VycmVuY2UgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcblN0YXJ0aW5nIC4uLiIpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGFyZ3MubGVuZ3RoICE9IDEpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInVzYWdlOiBEdGRVdGlsIGlucHV0ZmlsZS5kdGQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWphdmEuaW8uRmlsZSBpbnB1dEZpbGUgPSBuZXcgRmlsZShhcmdzWzBdKTsKLQotCQlTdHJpbmcgZHRkRmlsZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJZHRkRmlsZU5hbWUgPSBpbnB1dEZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQl9Ci0KLQkJU3RyaW5nIGR0ZE1vZGVsTmFtZSA9IGR0ZEZpbGVOYW1lOwotCi0JCWlmIChEVERDb25zdGFudHMuRFREX0VYVEVOU0lPTi5lcXVhbHMobmV3IFBhdGgoZHRkRmlsZU5hbWUpLmdldEZpbGVFeHRlbnNpb24oKSkpIHsKLQkJCWR0ZE1vZGVsTmFtZSA9IG5ldyBQYXRoKGR0ZEZpbGVOYW1lKS5yZW1vdmVGaWxlRXh0ZW5zaW9uKCkubGFzdFNlZ21lbnQoKTsKLQkJfQotCQlEVERVdGlsIGQybSA9IG5ldyBEVERVdGlsKCk7Ci0JCS8vIFRPRE86IGZpeCBwb3J0Ci0JCS8vIGQybS5wYXJzZShkdGRGaWxlTmFtZSk7Ci0JCXRyeSB7Ci0JCQlkMm0uc2F2ZUFzKGR0ZE1vZGVsTmFtZSArICIuIiArIERURENvbnN0YW50cy5EVERfWE1JX0VYVEVOU0lPTik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHRocm93biBkdXJpbmcgbW9kZWwgc2F2ZTogIiArIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJEb25lLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCBnZXRQYXRoKCkgewotCQlQYXRoIGN1cnJlbnREVERQYXRoID0gbmV3IFBhdGgoZHRkTW9kZWxGaWxlKTsKLQkJaWYgKGN1cnJlbnREVERQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJcmV0dXJuIGN1cnJlbnREVERQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBQYXRoKCIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyBEVERVdGlsIGdldERURFV0aWxGb3JHZW4oU3RyaW5nIGZpbGVuYW1lKSB7Ci0JLy8KLQkvLyBEVERVdGlsIHV0aWwgPSAoRFREVXRpbCkgdXRpbENhY2hlLmdldChmaWxlbmFtZSk7Ci0JLy8gaWYgKHV0aWwgPT0gbnVsbCkKLQkvLyB7Ci0JLy8gdXRpbCA9IG5ldyBEVERVdGlsKCk7Ci0JLy8gdXRpbENhY2hlLnB1dChmaWxlbmFtZSwgdXRpbCk7Ci0JLy8gfQotCS8vICAgIAotCS8vIHJldHVybiB1dGlsOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHBhcnNlR2VuKFN0cmluZyB1cmkpIHsKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCS8vIHBhcnNlKG5ldyBSZXNvdXJjZVNldEltcGwoKSwgdXJpKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBJbnZva2UgcGFyc2UgdG8gcGFyc2UgYSAuZHRkIGZpbGUgaW50byBhIE1PRiBvYmplY3QgbW9kZWwKLQkvLyAqIFRoaXMgaXMgaW52b2tlZCBieSB0aGUgUmVnaXN0ZXJlZERURFBhcnNlciB0aGF0IHJlZ2lzdGVycyB0aGlzIHBhcnNlcgotCS8vIGZvciBNT0YgdG8gdXNlCi0JLy8gKiBhZ2FpbnN0IHRoZSAuZHRkIHR5cGUKLQkvLyAqIEBwYXJhbSBmaWxlbmFtZSAtIHRoZSBmdWxseSBxdWFsaWZlZCBuYW1lIG9mIGEgLmR0ZCBmaWxlCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBwYXJzZUdlbihSZXNvdXJjZVNldCByZXNvdXJjZXMsIFN0cmluZyBmaWxlbmFtZSkgewotCS8vCi0JLy8gLy8gR2V0IHRoZSBkdGQgbmFtZSBmcm9tIHRoZSBmaWxlIG5hbWUKLQkvLyBQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlbmFtZSk7Ci0JLy8gSVBhdGggaVBhdGggPSBwYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKTsKLQkvLyBTdHJpbmcgZHRkTmFtZSA9IGlQYXRoLnRvRmlsZSgpLmdldE5hbWUoKTsKLQkvLwotCS8vCi0JLy8gdHJ5Ci0JLy8gewotCS8vIHBhcnNlciA9IG5ldyBEVERQYXJzZXIoZmFsc2UpOwotCS8vIGlmIChleHBhbmRFbnRpdHlSZWZlcmVuY2VzKQotCS8vIHsKLQkvLyBwYXJzZXIuc2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcyhleHBhbmRFbnRpdHlSZWZlcmVuY2VzKTsKLQkvLyB9Ci0JLy8gcGFyc2VyLnBhcnNlKGZpbGVuYW1lKTsKLQkvLyB9Ci0JLy8gY2F0Y2goSU9FeGNlcHRpb24gZXgpCi0JLy8gewotCS8vIGV4LnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIGR0ZE1vZGVsRmlsZSA9IGZpbGVuYW1lOwotCS8vCi0JLy8KLQkvLyBmYWN0b3J5ID0gRFRERmFjdG9yeUltcGwuaW5zdGFuY2UoKTsKLQkvLwotCS8vCi0JLy8gZXh0ZW50ID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkvLwotCS8vCi0JLy8gZHRkRmlsZSA9IGZhY3RvcnkuY3JlYXRlRFRERmlsZSgpOwotCS8vIGV4dGVudC5hZGQoZHRkRmlsZSk7Ci0JLy8KLQkvLwotCS8vIGR0ZEZpbGUuc2V0TmFtZShkdGROYW1lKTsKLQkvLwotCS8vCi0JLy8gcG9wdWxhdGVEVEQocmVzb3VyY2VzLCBleHBhbmRFbnRpdHlSZWZlcmVuY2VzKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgRFRERmFjdG9yeSBnZXRGYWN0b3J5R2VuKCkgewotCS8vCi0JLy8gcmV0dXJuIGZhY3Rvcnk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIERUREZpbGUgZ2V0RFRERmlsZUdlbigpIHsKLQkvLwotCS8vIHJldHVybiBkdGRGaWxlOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBIYXNodGFibGUgZ2V0UEVQb29sR2VuKCkgewotCS8vCi0JLy8gcmV0dXJuIHBlUG9vbDsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgSGFzaHRhYmxlIGdldEVsZW1lbnRQb29sR2VuKCkgewotCS8vCi0JLy8gcmV0dXJuIGVsZW1lbnRQb29sOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBFTGlzdCBnZXRFeHRlbnRHZW4oKSB7Ci0JLy8KLQkvLyByZXR1cm4gZXh0ZW50OwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHNldFJlc291cmNlR2VuKFJlc291cmNlIHJlc291cmNlKSB7Ci0JLy8KLQkvLyB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIFJlc291cmNlIGdldFJlc291cmNlR2VuKFJlc291cmNlIHJlc291cmNlKSB7Ci0JLy8KLQkvLyByZXR1cm4gcmVzb3VyY2U7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgc2V0ZXhwYW5kRW50aXR5UmVmZXJlbmNlc0dlbihib29sZWFuCi0JLy8gZXhwYW5kRW50aXR5UmVmZXJlbmNlcykgewotCS8vCi0JLy8gdGhpcy5leHBhbmRFbnRpdHlSZWZlcmVuY2VzID0gZXhwYW5kRW50aXR5UmVmZXJlbmNlczsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBnZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzR2VuKCkgewotCS8vCi0JLy8gcmV0dXJuIGV4cGFuZEVudGl0eVJlZmVyZW5jZXM7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogUmV0dXJuIHRydWUgaWYgdGhlIG1vZGVsIGhhcyBiZWVuIG1vZGlmaWVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBpc01vZGVsRGlydHlHZW4oKSB7Ci0JLy8KLQkvLyBpZiAocmVzb3VyY2UgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gcmV0dXJuIHJlc291cmNlLmlzTW9kaWZpZWQoKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIFNhdmUgdGhlIC5kdGQgZmlsZQotCS8vICovCi0JLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2F2ZUdlbigpIHsKLQkvLwotCS8vIHRyeQotCS8vIHsKLQkvLyByZXNvdXJjZS5zYXZlKCk7Ci0JLy8gcmV0dXJuIHRydWU7Ci0JLy8gfQotCS8vIGNhdGNoIChFeGNlcHRpb24gZXgpCi0JLy8gewotCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2F2ZSBtb2RlbCBleGNlcHRpb24gIiArIGV4KTsKLQkvLyBleC5wcmludFN0YWNrVHJhY2UoKTsKLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBib29sZWFuIHNhdmVBc0dlbihTdHJpbmcgbmV3RmlsZW5hbWUpIHsKLQkvLwotCS8vIHJlc291cmNlLnNldFVSSShuZXdGaWxlbmFtZSk7Ci0JLy8gYm9vbGVhbiBvayA9IHNhdmUoKTsKLQkvLwotCS8vCi0JLy8gaWYgKG9rKQotCS8vIHsKLQkvLyBQYXRoIHBhdGggPSBuZXcgUGF0aChuZXdGaWxlbmFtZSk7Ci0JLy8gSVBhdGggaVBhdGggPSBwYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKTsKLQkvLyBTdHJpbmcgZHRkTmFtZSA9IGlQYXRoLnRvRmlsZSgpLmdldE5hbWUoKTsKLQkvLwotCS8vCi0JLy8gZHRkRmlsZS5zZXROYW1lKGR0ZE5hbWUpOwotCS8vIH0KLQkvLyByZXR1cm4gb2s7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2F2ZURUREZpbGVHZW4oU3RyaW5nIGZpbGVuYW1lKSB7Ci0JLy8KLQkvLyBib29sZWFuIHJlc3VsdD10cnVlOwotCS8vIHRyeQotCS8vIHsKLQkvLyBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZVdyaXRlcihmaWxlbmFtZSksdHJ1ZSk7Ci0JLy8gRFREUHJpbnRlciBwcmludGVyID0gbmV3IERURFByaW50ZXIodHJ1ZSk7Ci0JLy8gcHJpbnRlci52aXNpdERUREZpbGUoZHRkRmlsZSk7Ci0JLy8KLQkvLwotCS8vIFN0cmluZyBzID0gcHJpbnRlci5nZXRCdWZmZXIoKS5nZXROYW1lKCkudG9TdHJpbmcoKTsKLQkvLyBwdy5wcmludGxuKHMpOwotCS8vIHB3LmNsb3NlKCk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JLy8gewotCS8vIHJlc3VsdCA9IGZhbHNlOwotCS8vIH0KLQkvLyByZXR1cm4gcmVzdWx0OwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBTdHJpbmcgZ2V0RFREU291cmNlR2VuKGJvb2xlYW4gaW5jbHVkZUVycm9yKSB7Ci0JLy8KLQkvLyByZXR1cm4gZHRkRmlsZS51bnBhcnNlKGluY2x1ZGVFcnJvcik7IC8vIHRydWUgPSBpbmNsdWRlIGVycm9yIGxpbmVzCi0JLy8gfQotCS8vIC8qKgotCS8vICogQ3JlYXRlIE1PRiBvYmplY3RzIGZyb20gRFRECi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZURUREdlbihSZXNvdXJjZVNldCByZXNvdXJjZXMsIGJvb2xlYW4KLQkvLyBleHBhbmRFbnRpdHlSZWZlcmVuY2VzKSB7Ci0JLy8KLQkvLyBWZWN0b3IgZHRkTGlzdCA9IHBhcnNlci5nZXREVERMaXN0KCk7Ci0JLy8KLQkvLwotCS8vIC8vIGNyZWF0ZSBYTUlNb2RlbCBmb3IgdGhlIGluY2x1ZGVkIERURHMKLQkvLyBpZiAoIGR0ZExpc3Quc2l6ZSgpID4gMCkKLQkvLyB7Ci0JLy8gaWYgKCFleHBhbmRFbnRpdHlSZWZlcmVuY2VzKQotCS8vIHsKLQkvLyBmb3IgKGludCBpPWR0ZExpc3Quc2l6ZSgpIC0gMTsgaSA+IDA7IGktLSkKLQkvLyB7Ci0JLy8gRFREIGR0ZCA9IChEVEQpIGR0ZExpc3QuZWxlbWVudEF0KGkpOwotCS8vIGxvYWRJbmNsdWRlZERURChyZXNvdXJjZXMsIGR0ZCk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBEVEQgZHRkID0gKERURCkgZHRkTGlzdC5lbGVtZW50QXQoMCk7Ci0JLy8gcG9wdWxhdGVEVEQocmVzb3VyY2VzLCBkdGQsIGR0ZEZpbGUpOyAvLyBwb3B1bGF0ZSB0aGUgbWFpbiBEVEQKLQkvLyAvLyB2YWxpZGF0ZVdpdGhNb2RlbChkdGQpOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIGZvciAoaW50IGkgPSBkdGRMaXN0LnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKQotCS8vIHsKLQkvLyBEVEQgZHRkID0gKERURCkgZHRkTGlzdC5lbGVtZW50QXQoaSk7Ci0JLy8gcG9wdWxhdGVEVEQocmVzb3VyY2VzLCBkdGQsIGR0ZEZpbGUpOwotCS8vIC8vIHZhbGlkYXRlV2l0aE1vZGVsKGR0ZCk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIEV4dGVybmFsRFRETW9kZWwgZ2V0RXh0ZXJuYWxEVERNb2RlbEdlbihSZXNvdXJjZVNldAotCS8vIHJlc291cmNlcywgU3RyaW5nIHVyaSkgewotCS8vCi0JLy8gaWYgKGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpCi0JLy8gewotCS8vIHJldHVybiBudWxsOwotCS8vIH0KLQkvLyAgICAgICAKLQkvLyBEZWZhdWx0TXNnTG9nZ2VyLndyaXRlKCJFeHRlcm5hbCBEVEQgbmFtZTogIiArIHVyaSk7Ci0JLy8KLQkvLwotCS8vIGlmIChleHRlcm5hbERURE1vZGVscy5jb250YWluc0tleSh1cmkpKQotCS8vIHsKLQkvLyByZXR1cm4gKEV4dGVybmFsRFRETW9kZWwpIGV4dGVybmFsRFRETW9kZWxzLmdldCh1cmkpOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIEV4dGVybmFsRFRETW9kZWwgZXh0TW9kZWwgPSBuZXcgRXh0ZXJuYWxEVERNb2RlbCgpOwotCS8vIGlmIChleHRNb2RlbC5sb2FkTW9kZWwocmVzb3VyY2VzLCB1cmkpKQotCS8vIHsKLQkvLyBleHRlcm5hbERURE1vZGVscy5wdXQodXJpLCBleHRNb2RlbCk7Ci0JLy8gcmV0dXJuIGV4dE1vZGVsOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIG51bGw7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgbG9hZEluY2x1ZGVkRFRER2VuKFJlc291cmNlU2V0IHJlc291cmNlcywgRFREIGR0ZCkgewotCS8vCi0JLy8gRXh0ZXJuYWxEVERNb2RlbCBleHRNb2RlbCA9IGdldEV4dGVybmFsRFRETW9kZWwocmVzb3VyY2VzLAotCS8vIGR0ZC5nZXROYW1lKCkpOwotCS8vIGlmIChleHRNb2RlbCAhPSBudWxsKQotCS8vIHsKLQkvLyAvLyBub3cgZmlsbCBvdXIgaGFzaCB0YWJsZXMgZm9yIGVsZW1lbnRzIGFuZCBwYXJhbWV0ZXIgZW50aXRpZXMKLQkvLyAvLyBzbyB0aGF0IHdlIGtub3cgd2hhdCBjYW4gYmUgcmVmZXJlbmNlZCBieSBvdXIgbWFpbiBkdGQKLQkvLyBEVERGaWxlIGZpbGUgPSBleHRNb2RlbC5nZXRFeHRlcm5hbERUREZpbGUoKTsKLQkvLyBDb2xsZWN0aW9uIGVsZW1lbnRMaXN0ID0gZmlsZS5saXN0RFRERWxlbWVudCgpOwotCS8vIENvbGxlY3Rpb24gZW50aXR5TGlzdCA9IGZpbGUubGlzdERUREVudGl0eSgpOwotCS8vCi0JLy8KLQkvLyBJdGVyYXRvciBpID0gZWxlbWVudExpc3QuaXRlcmF0b3IoKTsKLQkvLyB3aGlsZSAoaS5oYXNOZXh0KCkpCi0JLy8gewotCS8vIERURE9iamVjdCBvYmplY3QgPSAoRFRET2JqZWN0KSBpLm5leHQoKTsKLQkvLyBlbGVtZW50UG9vbC5wdXQoZ2V0QmFzZU5hbWUob2JqZWN0KSwgb2JqZWN0KTsKLQkvLyB9Ci0JLy8gICAgICAKLQkvLyBpID0gZW50aXR5TGlzdC5pdGVyYXRvcigpOwotCS8vIHdoaWxlIChpLmhhc05leHQoKSkKLQkvLyB7Ci0JLy8gRFRERW50aXR5IGVudGl0eSA9IChEVERFbnRpdHkpIGkubmV4dCgpOwotCS8vIGlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkKLQkvLyB7Ci0JLy8gcGVQb29sLnB1dChnZXRCYXNlTmFtZShlbnRpdHkpLCBlbnRpdHkpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIENyZWF0ZSBNT0Ygb2JqZWN0cyBmcm9tIERURAotCS8vICoKLQkvLyAqIDEpIHdpbGwgY3JlYXRlIHRoZSBjb3JyZXNwb25kaW5nIERURCBNb2Ygb2JqZWN0IGZvciBFbnRpdHlEZWNsLAotCS8vIE5vdGF0aW9uRGVjbAotCS8vICogYW5kIEVsZW1lbnREZWNsIGRlY2xhcmF0aW9ucyBkdXJpbmcgdGhlIDFzdCBwYXNzCi0JLy8gKiAyKSBEdXJpbmcgdGhlIDJuZCBwYXNzLCBpdCB3aWxsIGFkZCB0aGUgY29udGVudE1vZGVsIGFuZCBBdHRsaXN0IHRvCi0JLy8gYWxsCi0JLy8gKiBFbGVtZW50RGVjbC4KLQkvLyAqCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZURUREdlbihSZXNvdXJjZVNldCByZXNvdXJjZXMsIERURCBkdGQsIERUREZpbGUKLQkvLyBkRmlsZSkgewotCS8vCi0JLy8gRFRETW9kZWxCdWlsZGVyIG1vZGVsQnVpbGRlciA9IG5ldyBEVERNb2RlbEJ1aWxkZXIocmVzb3VyY2VzLCB0aGlzLAotCS8vIGR0ZCwgZEZpbGUpOwotCS8vCi0JLy8KLQkvLyBtb2RlbEJ1aWxkZXIudmlzaXREVEQoZHRkKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBlbXB0eUVycm9yTWVzc2FnZXNHZW4oKSB7Ci0JLy8KLQkvLyBlcnJvck1zZ3MucmVtb3ZlQWxsRWxlbWVudHMoKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBhZGRFcnJvck1lc3NhZ2VHZW4oRXJyb3JNZXNzYWdlIGVycm9yKSB7Ci0JLy8KLQkvLyBpbnQgdmVjdG9yU2l6ZSA9IGVycm9yTXNncy5zaXplKCk7Ci0JLy8gYm9vbGVhbiBhZGQgPSB0cnVlOwotCS8vCi0JLy8KLQkvLyBpZiAodmVjdG9yU2l6ZSAhPSAwKQotCS8vIHsKLQkvLyBpbnQgaW5kZXggPSAwOwotCS8vCi0JLy8KLQkvLyB3aGlsZSAoYWRkID09IHRydWUgJiYgaW5kZXggPCB2ZWN0b3JTaXplKQotCS8vIHsKLQkvLyBpZiAoKChFcnJvck1lc3NhZ2UpIGVycm9yTXNncy5lbGVtZW50QXQoaW5kZXgpKS5lcXVhbHMoZXJyb3IpKQotCS8vIHsKLQkvLyBhZGQgPWZhbHNlOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIGluZGV4Kys7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLwotCS8vIGlmIChhZGQpCi0JLy8gewotCS8vIGVycm9yTXNncy5hZGRFbGVtZW50KGVycm9yKTsKLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIFZlY3RvciBnZXRFcnJvcnNHZW4oKSB7Ci0JLy8KLQkvLyByZXR1cm4gZXJyb3JNc2dzOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlRFRER2VuKCkgewotCS8vCi0JLy8gU3RyaW5nIHRlbXBEVERGaWxlPWdldFBhdGgoKS50b09TU3RyaW5nKCkrInRlbXBWYWxpZGF0aW5nRmlsZU5hbWUuZHRkIjsKLQkvLyB0cnkKLQkvLyB7Ci0JLy8gc2F2ZURUREZpbGUodGVtcERUREZpbGUpOwotCS8vCi0JLy8KLQkvLyBwYXJzZXIgPSBuZXcgRFREUGFyc2VyKGZhbHNlKTsKLQkvLyBpZiAoRmlsZVV0aWxpdHkuZmlsZUV4aXN0cyh0ZW1wRFRERmlsZSkpCi0JLy8gewotCS8vIHBhcnNlci5wYXJzZSh0ZW1wRFRERmlsZSk7Ci0JLy8gfQotCS8vIFZlY3RvciBkdGRMaXN0ID0gcGFyc2VyLmdldERURExpc3QoKTsKLQkvLyBpZiAoIGR0ZExpc3Quc2l6ZSgpID4gMCkKLQkvLyB7Ci0JLy8gLy8gcmVzZXQgdGhlIGVycm9ycyBhbmQgdXBkYXRlIHdoYXQgd2UgaGF2ZSBpbiB0aGUgZWxlbWVudCBwb29sCi0JLy8gZW1wdHlFcnJvck1lc3NhZ2VzKCk7Ci0JLy8gdXBkYXRlRWxlbWVudEhhc2h0YWJsZSgpOwotCS8vCi0JLy8KLQkvLyAvLyBUT0RPOiBkbyB3ZSBqdXN0IHZhbGlkYXRlIHRoZSBjdXJyZW50IG9uZT8KLQkvLyB2YWxpZGF0ZVdpdGhNb2RlbCgoRFREKWR0ZExpc3QuZWxlbWVudEF0KDApKTsKLQkvLyB9Ci0JLy8gfQotCS8vIGNhdGNoKElPRXhjZXB0aW9uIGV4KQotCS8vIHsKLQkvLyBleC5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0JLy8gRmlsZVV0aWxpdHkuZGVsZXRlKHRlbXBEVERGaWxlKTsKLQkvLyB9Ci0JLy8gRmlsZVV0aWxpdHkuZGVsZXRlKHRlbXBEVERGaWxlKTsKLQkvLwotCS8vCi0JLy8gcmV0dXJuIGR0ZEZpbGUuaXNQYXJzZUVycm9yKCk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVXaXRoTW9kZWxHZW4oRFREIGR0ZCkgewotCS8vCi0JLy8gRW51bWVyYXRpb24gZW4gPSBkdGQuZXh0ZXJuYWxFbGVtZW50cygpOwotCS8vIHdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkKLQkvLyB7Ci0JLy8gT2JqZWN0IGUgPSBlbi5uZXh0RWxlbWVudCgpOwotCS8vCi0JLy8KLQkvLyBpZiAoIGUgaW5zdGFuY2VvZiBFbnRpdHlEZWNsICkKLQkvLyB7Ci0JLy8gRW50aXR5RGVjbCBlbnRpdHkgPSAoRW50aXR5RGVjbCkgZTsKLQkvLyBFcnJvck1lc3NhZ2UgZXJyTXNnID0gZW50aXR5LmdldEVycm9yTWVzc2FnZSgpOwotCS8vIGlmICggZXJyTXNnIT0gbnVsbCkKLQkvLyB7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGVyck1zZyk7Ci0JLy8gLy8gZHRkRmlsZS5zZXRQYXJzZUVycm9yKHRydWUpOwotCS8vIH0KLQkvLyB9Ci0JLy8gZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBFbGVtZW50RGVjbCApCi0JLy8gewotCS8vIEVsZW1lbnREZWNsIGVsZW0gPSAoRWxlbWVudERlY2wpIGU7Ci0JLy8gRXJyb3JNZXNzYWdlIGVyck1zZyA9IGVsZW0uZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JLy8gRFRERWxlbWVudCBkdGRlbGVtZW50ID0gKERUREVsZW1lbnQpCi0JLy8gZ2V0RWxlbWVudFBvb2woKS5nZXQoZWxlbS5nZXROb2RlTmFtZSgpKTsKLQkvLwotCS8vCi0JLy8gaWYgKCBlcnJNc2chPSBudWxsKQotCS8vIHsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQkvLyB9Ci0JLy8gY2hlY2tGb3JNaXNzaW5nRWxlbWVudFJlZmVyZW5jZXMoZHRkZWxlbWVudCk7Ci0JLy8gfQotCS8vIGVsc2UgaWYgKCBlIGluc3RhbmNlb2YgTm90YXRpb25EZWNsICkKLQkvLyB7Ci0JLy8gTm90YXRpb25EZWNsIG5vdGF0aW9uID0gKE5vdGF0aW9uRGVjbCkgZTsKLQkvLyBFcnJvck1lc3NhZ2UgZXJyTXNnID0gbm90YXRpb24uZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JLy8gaWYgKCBlcnJNc2chPSBudWxsKQotCS8vIHsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQkvLyB9Ci0JLy8gfQotCS8vIGVsc2UgaWYgKCBlIGluc3RhbmNlb2YgQXR0bGlzdCApCi0JLy8gewotCS8vIEF0dGxpc3QgYXR0TGlzdCA9IChBdHRsaXN0KSBlOwotCS8vIEVycm9yTWVzc2FnZSBlcnJNc2cgPSBhdHRMaXN0LmdldEVycm9yTWVzc2FnZSgpOwotCS8vIGlmICggZXJyTXNnIT0gbnVsbCkKLQkvLyB7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGVyck1zZyk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLwotCS8vIGNoZWNrRm9yRHVwbGljYXRlSURBdHRyaWJ1dGUoKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFbGVtZW50SGFzaHRhYmxlR2VuKCkgewotCS8vCi0JLy8gZWxlbWVudFBvb2wuY2xlYXIoKTsKLQkvLyBDcmVhdGVMaXN0SXRlbXMgaXRlbXNIZWxwZXIgPSBuZXcgQ3JlYXRlTGlzdEl0ZW1zKGR0ZEZpbGUpOwotCS8vCi0JLy8KLQkvLyBWZWN0b3IgYWxsRWxlbWVudHMgPSBpdGVtc0hlbHBlci5nZXRFbGVtZW50cygpOwotCS8vIC8vIGdvIHRocm91Z2ggYWxsIHRoZSBkdGRGaWxlcyBhbmQgbGlzdCB0aGUgZWxlbWVudHMKLQkvLyBpbnQgbnVtRWxlbWVudHMgPSBhbGxFbGVtZW50cy5zaXplKCk7Ci0JLy8KLQkvLwotCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRWxlbWVudHM7IGkrKykKLQkvLyB7Ci0JLy8gRFRERWxlbWVudCBlbGVtZW50ID0gKERUREVsZW1lbnQpIGFsbEVsZW1lbnRzLmVsZW1lbnRBdChpKTsKLQkvLyBlbGVtZW50UG9vbC5wdXQoZ2V0QmFzZU5hbWUoZWxlbWVudCksIGVsZW1lbnQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFbnRpdHlIYXNodGFibGVHZW4oKSB7Ci0JLy8KLQkvLyB1cGRhdGVIYXNoVGFibGUocGVQb29sLCBkdGRGaWxlLmxpc3REVERFbnRpdHkoKSk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdXBkYXRlSGFzaFRhYmxlR2VuKEhhc2h0YWJsZSBoLCBDb2xsZWN0aW9uIGR0ZE9iamVjdHMpIHsKLQkvLwotCS8vIGguY2xlYXIoKTsKLQkvLyBJdGVyYXRvciBpID0gZHRkT2JqZWN0cy5pdGVyYXRvcigpOwotCS8vIHdoaWxlIChpLmhhc05leHQoKSkKLQkvLyB7Ci0JLy8gU3RyaW5nIG5hbWUgPSAiIjsKLQkvLyBEVERPYmplY3QgbyA9IChEVERPYmplY3QpIGkubmV4dCgpOwotCS8vIG5hbWUgPSBnZXRCYXNlTmFtZShvKTsKLQkvLyBoLnB1dChuYW1lLG8pOwotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRCYXNlTmFtZUdlbihEVERPYmplY3Qgb2JqKSB7Ci0JLy8KLQkvLyByZXR1cm4gZ2V0TmFtZShvYmosIG51bGwpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldE5hbWVHZW4oRFRET2JqZWN0IG9iaiwgRFRERmlsZSBkdGRGaWxlKSB7Ci0JLy8KLQkvLyBTdHJpbmcgbmFtZSA9ICIiOwotCS8vIGlmIChvYmogaW5zdGFuY2VvZiBEVERFbnRpdHkpCi0JLy8gewotCS8vIERUREVudGl0eSBlbnRpdHkgPSAoRFRERW50aXR5KSBvYmo7Ci0JLy8gaWYgKGR0ZEZpbGUgIT0gbnVsbCAmJgotCS8vICFlbnRpdHkuZ2V0RFRERmlsZSgpLmVxdWFscyhkdGRGaWxlKSkKLQkvLyB7Ci0JLy8gbmFtZSA9IG5ldyBQYXRoKGVudGl0eS5nZXREVERGaWxlKCkuZ2V0TmFtZSgpKS5sYXN0U2VnbWVudCgpICsgIjogIjsKLQkvLyB9Ci0JLy8gbmFtZSArPSAiJSIgKyAoKERUREVudGl0eSlvYmopLmdldE5hbWUoKSArICI7IjsKLQkvLyB9Ci0JLy8gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRFRERWxlbWVudCkKLQkvLyB7Ci0JLy8gRFRERWxlbWVudCBlbGVtZW50ID0gKERUREVsZW1lbnQpIG9iajsKLQkvLyBpZiAoZHRkRmlsZSAhPSBudWxsICYmCi0JLy8gIWVsZW1lbnQuZ2V0RFRERmlsZSgpLmVxdWFscyhkdGRGaWxlKSkKLQkvLyB7Ci0JLy8gbmFtZSA9IG5ldyBQYXRoKGVsZW1lbnQuZ2V0RFRERmlsZSgpLmdldE5hbWUoKSkubGFzdFNlZ21lbnQoKSArICI6ICI7Ci0JLy8gfQotCS8vIG5hbWUgKz0gKChEVERFbGVtZW50KW9iaikuZ2V0TmFtZSgpOwotCS8vIH0KLQkvLyBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEVERFbGVtZW50Q29udGVudCkKLQkvLyB7Ci0JLy8gcmV0dXJuICgoRFRERWxlbWVudENvbnRlbnQpIG9iaikuZ2V0Q29udGVudE5hbWUoKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIG5hbWU7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgY2hlY2tGb3JNaXNzaW5nRWxlbWVudFJlZmVyZW5jZXNHZW4oRFRERWxlbWVudCBlbGVtZW50KQotCS8vIHsKLQkvLwotCS8vIFN0cmluZyBkdGRTdHJpbmcgPSBudWxsOwotCS8vIGlmICggZWxlbWVudCA9PSBudWxsICkKLQkvLyByZXR1cm47Ci0JLy8KLQkvLwotCS8vIFZlY3RvciBlbGVtZW50UmVmcyA9IG5ldyBWZWN0b3IoKTsKLQkvLyBmaW5kRWxlbWVudFJlZmVyZW5jZXMoZWxlbWVudC5nZXRDb250ZW50KCksZWxlbWVudFJlZnMpOwotCS8vCi0JLy8KLQkvLyBFbnVtZXJhdGlvbiBlbiA9IGVsZW1lbnRSZWZzLmVsZW1lbnRzKCk7Ci0JLy8gd2hpbGUgKGVuLmhhc01vcmVFbGVtZW50cygpKQotCS8vIHsKLQkvLyBTdHJpbmcgZWxlbWVudFJlZk5hbWUgPSAiIjsKLQkvLyBEVERPYmplY3QgZHRkT2JqZWN0ID0gKERURE9iamVjdCkgZW4ubmV4dEVsZW1lbnQoKTsKLQkvLwotCS8vCi0JLy8gaWYgKCBkdGRPYmplY3QgaW5zdGFuY2VvZiBEVERFbGVtZW50KQotCS8vIHsKLQkvLyBlbGVtZW50UmVmTmFtZSA9ICgoRFRERWxlbWVudClkdGRPYmplY3QpLmdldE5hbWUoKTsKLQkvLyBpZiAoIGdldEVsZW1lbnRQb29sKCkuZ2V0KGVsZW1lbnRSZWZOYW1lKSA9PSBudWxsKQotCS8vIHsKLQkvLyBpZiAoZHRkU3RyaW5nID09IG51bGwpCi0JLy8gewotCS8vIGR0ZFN0cmluZyA9IGdldERURFNvdXJjZShmYWxzZSk7Ci0JLy8gfQotCS8vIFN0cmluZyBlcnJvck1zZyA9ICJFbGVtZW50IFwiIiArIGVsZW1lbnQuZ2V0TmFtZSgpICsgIlwiLCByZWZlcnMgdG8KLQkvLyB1bmRlY2xhcmVkIGVsZW1lbnQgIgotCS8vICsgIlwiIiArIGVsZW1lbnRSZWZOYW1lICsgIlwiLCBpbiBjb250ZW50IG1vZGVsLlxuIjsKLQkvLyBFcnJvck1lc3NhZ2UgZHRkRXJyb3IgPSBuZXcgRXJyb3JNZXNzYWdlKCk7Ci0JLy8gZHRkRXJyb3Iuc2V0RXJyb3JNZXNzYWdlKGVycm9yTXNnKTsKLQkvLyBTb3VyY2VMb2NhdGlvbkhlbHBlci5MaW5lQ29sdW1uIGxpbmVDb2x1bW4gPQotCS8vIFNvdXJjZUxvY2F0aW9uSGVscGVyLm9mZnNldFRvTGluZUNvbHVtbihkdGRTdHJpbmcsCi0JLy8gZWxlbWVudC5nZXRTdGFydE9mZnNldCgpKTsKLQkvLyBkdGRFcnJvci5zZXRFcnJvckxpbmUobGluZUNvbHVtbi5nZXRMaW5lKCkpOwotCS8vIGR0ZEVycm9yLnNldEVycm9yQ29sdW1uKGxpbmVDb2x1bW4uZ2V0Q29sdW1uKCkpOwotCS8vIGFkZEVycm9yTWVzc2FnZShkdGRFcnJvcik7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgZmluZEVsZW1lbnRSZWZlcmVuY2VzR2VuKERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQsCi0JLy8gVmVjdG9yIHJlc3VsdCkgewotCS8vCi0JLy8KLQkvLyBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KQotCS8vIHsKLQkvLyByZXN1bHQuYWRkRWxlbWVudCgoKERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KWNvbnRlbnQpLmdldFJlZmVyZW5jZWRFbGVtZW50KCkpOwotCS8vIH0KLQkvLyBlbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkKLQkvLyB7Ci0JLy8gcmVzdWx0LmFkZEVsZW1lbnQoKChEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KWNvbnRlbnQpLmdldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCkpOwotCS8vIH0KLQkvLyBlbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRER3JvdXBDb250ZW50KQotCS8vIHsKLQkvLyBEVERHcm91cENvbnRlbnQgZ3JvdXAgPSAoRFRER3JvdXBDb250ZW50KWNvbnRlbnQ7Ci0JLy8gRUxpc3QgY29udGVudHMgPSBncm91cC5nZXRDb250ZW50KCk7Ci0JLy8gSXRlcmF0b3IgaSA9IGNvbnRlbnRzLml0ZXJhdG9yKCk7Ci0JLy8gd2hpbGUgKGkuaGFzTmV4dCgpKQotCS8vIHsKLQkvLyBmaW5kRWxlbWVudFJlZmVyZW5jZXMoKERUREVsZW1lbnRDb250ZW50KSBpLm5leHQoKSwgcmVzdWx0KTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGNoZWNrRm9yRHVwbGljYXRlSURBdHRyaWJ1dGVHZW4oKSB7Ci0JLy8KLQkvLyBTdHJpbmcgZHRkU3RyaW5nID0gbnVsbDsKLQkvLyBDb2xsZWN0aW9uIGVsZW1lbnRzID0gZHRkRmlsZS5saXN0RFRERWxlbWVudCgpOwotCS8vIEl0ZXJhdG9yIGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOwotCS8vIHdoaWxlIChpLmhhc05leHQoKSkKLQkvLyB7Ci0JLy8gRFRERWxlbWVudCBlbGVtZW50ID0gKERUREVsZW1lbnQpIGkubmV4dCgpOwotCS8vIEl0ZXJhdG9yIGsgPSBlbGVtZW50LmdldERUREF0dHJpYnV0ZSgpLml0ZXJhdG9yKCk7Ci0JLy8gYm9vbGVhbiBzYXcxc3RJRCA9IGZhbHNlOwotCS8vIHdoaWxlIChrLmhhc05leHQoKSkKLQkvLyB7Ci0JLy8gRFREQXR0cmlidXRlIGF0dHIgPSAoRFREQXR0cmlidXRlKSBrLm5leHQoKTsKLQkvLyBEVERUeXBlIGRUeXBlID0gYXR0ci5nZXREVERUeXBlKCk7Ci0JLy8gaWYgKGRUeXBlIGluc3RhbmNlb2YgRFREQmFzaWNUeXBlKQotCS8vIHsKLQkvLyBpZiAoICgoRFREQmFzaWNUeXBlKWRUeXBlKS5nZXRLaW5kKCkuaW50VmFsdWUoKSA9PSBEVERCYXNpY1R5cGVLaW5kLklEKQotCS8vIHsKLQkvLyBpZiAoc2F3MXN0SUQpCi0JLy8gewotCS8vIGlmIChkdGRTdHJpbmcgPT0gbnVsbCkKLQkvLyB7Ci0JLy8gZHRkU3RyaW5nID0gZ2V0RFREU291cmNlKGZhbHNlKTsKLQkvLyB9Ci0JLy8gU3RyaW5nIGVyck1zZyA9IERURFBsdWdpbi5nZXREVERTdHJpbmcoIl9FUlJPUl9EVVBfSURfQVRUUklCVVRFXzEiKTsKLQkvLyBlcnJNc2cgKz0gYXR0ci5nZXROYW1lKCkgKwotCS8vIERURFBsdWdpbi5nZXREVERTdHJpbmcoIl9VSV9FUlJPUlBBUlRfRFVQX0lEX0FUVFJJQlVURV8yIik7Ci0JLy8gICAgICAgICAgICAgIAotCS8vIEVycm9yTWVzc2FnZSBkdGRFcnJvciA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQkvLyBkdGRFcnJvci5zZXRFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQkvLyBTb3VyY2VMb2NhdGlvbkhlbHBlci5MaW5lQ29sdW1uIGxpbmVDb2x1bW4gPQotCS8vIFNvdXJjZUxvY2F0aW9uSGVscGVyLm9mZnNldFRvTGluZUNvbHVtbihkdGRTdHJpbmcsCi0JLy8gYXR0ci5nZXRTdGFydE9mZnNldCgpKTsKLQkvLyBkdGRFcnJvci5zZXRFcnJvckxpbmUobGluZUNvbHVtbi5nZXRMaW5lKCkpOwotCS8vIGR0ZEVycm9yLnNldEVycm9yQ29sdW1uKGxpbmVDb2x1bW4uZ2V0Q29sdW1uKCkpOwotCS8vIGR0ZEVycm9yLnNldE9iamVjdChhdHRyKTsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZHRkRXJyb3IpOwotCS8vIC8vIGR0ZEZpbGUuc2V0UGFyc2VFcnJvcih0cnVlKTsKLQkvLyBicmVhazsKLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyBzYXcxc3RJRCA9IHRydWU7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRHcm91cFR5cGVHZW4oaW50IGdyb3VwS2luZCwgaW50IG9jY3VycmVuY2UpCi0JLy8gewotCS8vCi0JLy8gU3RyaW5nIHR5cGUgPSBudWxsOwotCS8vCi0JLy8KLQkvLyBzd2l0Y2ggKGdyb3VwS2luZCkKLQkvLyB7Ci0JLy8gY2FzZSBEVERHcm91cEtpbmQuU0VRVUVOQ0U6Ci0JLy8gdHlwZSA9ICJEVERTZXF1ZW5jZSI7Ci0JLy8gYnJlYWs7Ci0JLy8gY2FzZSBEVERHcm91cEtpbmQuQ0hPSUNFOgotCS8vIHR5cGUgPSAiRFREQ2hvaWNlIjsKLQkvLyBicmVhazsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIHR5cGUgKz0gZ2V0UmVwZWF0YWJsZVR5cGVTdWZmaXgob2NjdXJyZW5jZSk7Ci0JLy8gcmV0dXJuIHR5cGU7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlVHlwZUdlbihpbnQgb2NjdXJyZW5jZSkgewotCS8vCi0JLy8gU3RyaW5nIHR5cGUgPSAiRFREUmVmZXJlbmNlIjsKLQkvLyB0eXBlICs9IGdldFJlcGVhdGFibGVUeXBlU3VmZml4KG9jY3VycmVuY2UpOwotCS8vIHJldHVybiB0eXBlOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFJlcGVhdGFibGVUeXBlU3VmZml4R2VuKGludCBvY2N1cnJlbmNlKSB7Ci0JLy8KLQkvLyByZXR1cm4gIigiICsgKGNoYXIpb2NjdXJyZW5jZSArICIpIjsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgbWFpbkdlbihTdHJpbmdbXSBhcmdzKSB7Ci0JLy8KLQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlxuU3RhcnRpbmcgLi4uIik7Ci0JLy8KLQkvLwotCS8vIGlmIChhcmdzLmxlbmd0aCAhPSAxKQotCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidXNhZ2U6IER0ZFV0aWwgaW5wdXRmaWxlLmR0ZCIpOwotCS8vCi0JLy8KLQkvLyBqYXZhLmlvLkZpbGUgaW5wdXRGaWxlID0gbmV3IEZpbGUoYXJnc1swXSk7Ci0JLy8KLQkvLwotCS8vIFN0cmluZyBkdGRGaWxlTmFtZSA9ICIiOwotCS8vIHRyeQotCS8vIHsKLQkvLyBkdGRGaWxlTmFtZSA9IGlucHV0RmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JLy8gfQotCS8vIGNhdGNoKElPRXhjZXB0aW9uIGV4KQotCS8vIHt9Ci0JLy8KLQkvLwotCS8vIFN0cmluZyBkdGRNb2RlbE5hbWUgPSBkdGRGaWxlTmFtZTsKLQkvLwotCS8vCi0JLy8gaWYgKERURENvbnN0YW50cy5EVERfRVhURU5TSU9OLmVxdWFscyhuZXcKLQkvLyBQYXRoKGR0ZEZpbGVOYW1lKS5nZXRGaWxlRXh0ZW5zaW9uKCkpKQotCS8vIHsKLQkvLyBkdGRNb2RlbE5hbWU9IG5ldwotCS8vIFBhdGgoZHRkRmlsZU5hbWUpLnJlbW92ZUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpOwotCS8vIH0KLQkvLyBEVERVdGlsIGQybSA9IG5ldyBEVERVdGlsKCk7Ci0JLy8gLy8gVE9ETzogZml4IHBvcnQKLQkvLyAvLyBkMm0ucGFyc2UoZHRkRmlsZU5hbWUpOwotCS8vIHRyeQotCS8vIHsKLQkvLyBkMm0uc2F2ZUFzKGR0ZE1vZGVsTmFtZSArICIuIiArIERURENvbnN0YW50cy5EVERfWE1JX0VYVEVOU0lPTik7Ci0JLy8gfQotCS8vIGNhdGNoIChFeGNlcHRpb24gZSkKLQkvLyB7Ci0JLy8gU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gdGhyb3duIGR1cmluZyBtb2RlbCBzYXZlOiAiICsgZSk7Ci0JLy8gfQotCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRG9uZS4iKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoIGdldFBhdGhHZW4oKSB7Ci0JLy8KLQkvLyBQYXRoIGN1cnJlbnREVERQYXRoID0gbmV3IFBhdGgoZHRkTW9kZWxGaWxlKTsKLQkvLyBpZiAoY3VycmVudERURFBhdGguc2VnbWVudENvdW50KCkgPiAxKQotCS8vIHsKLQkvLyByZXR1cm4gY3VycmVudERURFBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0JLy8gfQotCS8vICAgIAotCS8vIHJldHVybiBuZXcgUGF0aCgiIik7Ci0JLy8gfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NTY1N2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVtcHR5Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRFREVmlzaXRvciB7Ci0KLQlwdWJsaWMgRFREVmlzaXRvcigpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREZpbGUoRFRERmlsZSBmaWxlKSB7Ci0JCUNvbGxlY3Rpb24gbm90YXRpb25zID0gZmlsZS5saXN0RFRETm90YXRpb24oKTsKLQkJZm9yIChJdGVyYXRvciBpID0gbm90YXRpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJdmlzaXREVEROb3RhdGlvbigoRFRETm90YXRpb24pIGkubmV4dCgpKTsKLQkJfQotCi0JCUNvbGxlY3Rpb24gZW50aXRpZXMgPSBmaWxlLmxpc3REVERFbnRpdHkoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZW50aXRpZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQl2aXNpdERUREVudGl0eSgoRFRERW50aXR5KSBpLm5leHQoKSk7Ci0JCX0KLQotCQlDb2xsZWN0aW9uIG9iamVjdHMgPSBmaWxlLmxpc3REVERFbGVtZW50QW5kRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG9iamVjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlEVERPYmplY3Qgb2JqZWN0ID0gKERURE9iamVjdCkgaS5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRFRERWxlbWVudCkgewotCQkJCXZpc2l0RFRERWxlbWVudCgoRFRERWxlbWVudCkgb2JqZWN0KTsKLQkJCX0gLy8gZW5kIG9mIGlmICgpCi0JCQllbHNlIHsKLQkJCQl2aXNpdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSBvYmplY3QpOwotCQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVEROb3RhdGlvbihEVEROb3RhdGlvbiBub3RhdGlvbikgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERW50aXR5KERUREVudGl0eSBlbnRpdHkpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVsZW1lbnQoRFRERWxlbWVudCBlbGVtZW50KSB7Ci0JCXZpc2l0RFRERWxlbWVudENvbnRlbnQoZWxlbWVudC5nZXRDb250ZW50KCkpOwotCQl2aXNpdERUREF0dHJpYnV0ZUxpc3QoZWxlbWVudC5nZXREVERBdHRyaWJ1dGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRpdHkpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERWxlbWVudENvbnRlbnQoRFRERWxlbWVudENvbnRlbnQgY29udGVudCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInZpc2l0RFRERWxlbWVudENvbnRlbnQgOiAiICsgY29udGVudCk7Ci0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERW1wdHlDb250ZW50KSB7Ci0JCQl2aXNpdERUREVtcHR5Q29udGVudCgoRFRERW1wdHlDb250ZW50KSBjb250ZW50KTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFREQW55Q29udGVudCkgewotCQkJdmlzaXREVERBbnlDb250ZW50KChEVERBbnlDb250ZW50KSBjb250ZW50KTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFREUENEYXRhQ29udGVudCkgewotCQkJdmlzaXREVERQQ0RhdGFDb250ZW50KChEVERQQ0RhdGFDb250ZW50KSBjb250ZW50KTsKLQkJfQotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERURFJlcGVhdGFibGVDb250ZW50KSB7Ci0JCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREdyb3VwQ29udGVudCkgewotCQkJCXZpc2l0RFRER3JvdXBDb250ZW50KChEVERHcm91cENvbnRlbnQpIGNvbnRlbnQpOwotCQkJfQotCQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQkJdmlzaXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIGNvbnRlbnQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdmlzaXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KChEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KSBjb250ZW50KTsKLQkJCX0gLy8gZW5kIG9mIGVsc2UKLQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJvY2N1cnJlbmNlOiAiICsKLQkJCS8vIChjaGFyKSgoRFREUmVwZWF0YWJsZUNvbnRlbnQpY29udGVudCkuZ2V0T2NjdXJyZW5jZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERW1wdHlDb250ZW50KERUREVtcHR5Q29udGVudCBkdGRFbXB0eUNvbnRlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb250ZW50OiBFTVBUWSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFREQW55Q29udGVudChEVERBbnlDb250ZW50IGR0ZEFueUNvbnRlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb250ZW50OiBBTlkiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERURFBDRGF0YUNvbnRlbnQoRFREUENEYXRhQ29udGVudCBwY0RhdGFDb250ZW50KSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGVudDogUENEQVRBIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERHcm91cENvbnRlbnQoRFRER3JvdXBDb250ZW50IGdyb3VwQ29udGVudCkgewotCQlpZiAoZ3JvdXBDb250ZW50LmdldEdyb3VwS2luZCgpLmdldFZhbHVlKCkgPT0gRFRER3JvdXBLaW5kLlNFUVVFTkNFKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQ6IFNlcXVlbmNlIik7Ci0JCX0KLQkJZWxzZSAvLyBpZiAoY29udGVudGdldEdyb3VwS2luZCgpID09IERUREdyb3VwS2luZC5DSE9JQ0UpCi0JCXsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGVudDogQ2hvaWNlIik7Ci0JCX0KLQotCQlDb2xsZWN0aW9uIGdyb3VwQ29udGVudHMgPSBncm91cENvbnRlbnQuZ2V0Q29udGVudCgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBncm91cENvbnRlbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJdmlzaXREVERFbGVtZW50Q29udGVudCgoRFRERWxlbWVudENvbnRlbnQpIGkubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgZWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBlbnRpdHlSZWZlcmVuY2VDb250ZW50KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERBdHRyaWJ1dGVMaXN0KExpc3QgYXR0cnMpIHsKLQkJSXRlcmF0b3IgaXRlciA9IGF0dHJzLml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQl2aXNpdERUREF0dHJpYnV0ZSgoRFREQXR0cmlidXRlKSBpdGVyLm5leHQoKSk7Ci0JCX0gLy8gZW5kIG9mIHdoaWxlICgpCi0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERBdHRyaWJ1dGUoRFREQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREZpbGVHZW4oRFRERmlsZSBmaWxlKSB7Ci0KLQkJQ29sbGVjdGlvbiBub3RhdGlvbnMgPSBmaWxlLmxpc3REVEROb3RhdGlvbigpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBub3RhdGlvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQl2aXNpdERURE5vdGF0aW9uKChEVEROb3RhdGlvbikgaS5uZXh0KCkpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbiBlbnRpdGllcyA9IGZpbGUubGlzdERUREVudGl0eSgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBlbnRpdGllcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCXZpc2l0RFRERW50aXR5KChEVERFbnRpdHkpIGkubmV4dCgpKTsKLQkJfQotCi0JCUNvbGxlY3Rpb24gb2JqZWN0cyA9IGZpbGUubGlzdERUREVsZW1lbnRBbmREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gb2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCURURE9iamVjdCBvYmplY3QgPSAoRFRET2JqZWN0KSBpLm5leHQoKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEVERFbGVtZW50KSB7Ci0JCQkJdmlzaXREVERFbGVtZW50KChEVERFbGVtZW50KSBvYmplY3QpOwotCQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJCWVsc2UgewotCQkJCXZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKChEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIG9iamVjdCk7Ci0JCQl9IC8vIGVuZCBvZiBpZiAoKQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRETm90YXRpb25HZW4oRFRETm90YXRpb24gbm90YXRpb24pIHsKLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREVudGl0eUdlbihEVERFbnRpdHkgZW50aXR5KSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbGVtZW50R2VuKERUREVsZW1lbnQgZWxlbWVudCkgewotCi0JCXZpc2l0RFRERWxlbWVudENvbnRlbnQoZWxlbWVudC5nZXRDb250ZW50KCkpOwotCQl2aXNpdERUREF0dHJpYnV0ZUxpc3QoZWxlbWVudC5nZXREVERBdHRyaWJ1dGUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlR2VuKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5KSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbGVtZW50Q29udGVudEdlbihEVERFbGVtZW50Q29udGVudCBjb250ZW50KSB7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ2aXNpdERUREVsZW1lbnRDb250ZW50IDogIiArIGNvbnRlbnQpOwotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVtcHR5Q29udGVudCkgewotCQkJdmlzaXREVERFbXB0eUNvbnRlbnQoKERUREVtcHR5Q29udGVudCkgY29udGVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREFueUNvbnRlbnQpIHsKLQkJCXZpc2l0RFREQW55Q29udGVudCgoRFREQW55Q29udGVudCkgY29udGVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERURFBDRGF0YUNvbnRlbnQpIHsKLQkJCXZpc2l0RFREUENEYXRhQ29udGVudCgoRFREUENEYXRhQ29udGVudCkgY29udGVudCk7Ci0JCX0KLQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERSZXBlYXRhYmxlQ29udGVudCkgewotCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpIHsKLQkJCQl2aXNpdERUREdyb3VwQ29udGVudCgoRFRER3JvdXBDb250ZW50KSBjb250ZW50KTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJCXZpc2l0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSBjb250ZW50KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXZpc2l0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgY29udGVudCk7Ci0JCQl9IC8vIGVuZCBvZiBlbHNlCi0KLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigib2NjdXJyZW5jZTogIiArCi0JCQkvLyAoY2hhcikoKERURFJlcGVhdGFibGVDb250ZW50KWNvbnRlbnQpLmdldE9jY3VycmVuY2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbXB0eUNvbnRlbnRHZW4oRFRERW1wdHlDb250ZW50IGR0ZEVtcHR5Q29udGVudCkgewotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGVudDogRU1QVFkiKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERBbnlDb250ZW50R2VuKERUREFueUNvbnRlbnQgZHRkQW55Q29udGVudCkgewotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGVudDogQU5ZIik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFREUENEYXRhQ29udGVudEdlbihEVERQQ0RhdGFDb250ZW50IHBjRGF0YUNvbnRlbnQpIHsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQ6IFBDREFUQSIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREdyb3VwQ29udGVudEdlbihEVERHcm91cENvbnRlbnQgZ3JvdXBDb250ZW50KSB7Ci0KLQkJaWYgKGdyb3VwQ29udGVudC5nZXRHcm91cEtpbmQoKS5nZXRWYWx1ZSgpID09IERUREdyb3VwS2luZC5TRVFVRU5DRSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb250ZW50OiBTZXF1ZW5jZSIpOwotCQl9Ci0JCWVsc2UgLy8gaWYgKGNvbnRlbnRnZXRHcm91cEtpbmQoKSA9PSBEVERHcm91cEtpbmQuQ0hPSUNFKQotCQl7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQ6IENob2ljZSIpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbiBncm91cENvbnRlbnRzID0gZ3JvdXBDb250ZW50LmdldENvbnRlbnQoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZ3JvdXBDb250ZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCXZpc2l0RFRERWxlbWVudENvbnRlbnQoKERUREVsZW1lbnRDb250ZW50KSBpLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEdlbihEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudEdlbihEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IGVudGl0eVJlZmVyZW5jZUNvbnRlbnQpIHsKLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREF0dHJpYnV0ZUxpc3RHZW4oTGlzdCBhdHRycykgewotCi0JCUl0ZXJhdG9yIGl0ZXIgPSBhdHRycy5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJdmlzaXREVERBdHRyaWJ1dGUoKERUREF0dHJpYnV0ZSkgaXRlci5uZXh0KCkpOwotCQl9IC8vIGVuZCBvZiB3aGlsZSAoKQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREF0dHJpYnV0ZUdlbihEVERBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRXh0ZXJuYWxEVERNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0V4dGVybmFsRFRETW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwNTM2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRXh0ZXJuYWxEVERNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotCi0KLS8qKgotICogTG9hZCBhbm90aGVyIERURCBtb2RlbCAtIHVzZSB3aGVuIHRoZXJlIGlzIGV4dGVybmFsIGVudGl0eSByZWZlcmVuY2VzIGZyb20KLSAqIGFub3RoZXIgbW9kZWwKLSAqLwotcHVibGljIGNsYXNzIEV4dGVybmFsRFRETW9kZWwgewotCURUREZpbGUgZHRkRmlsZSA9IG51bGw7Ci0KLQlwdWJsaWMgRXh0ZXJuYWxEVERNb2RlbCgpIHsKLQl9Ci0KLQlwdWJsaWMgRFRERmlsZSBnZXRFeHRlcm5hbERUREZpbGUoKSB7Ci0JCXJldHVybiBkdGRGaWxlOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIERURCBtb2RlbCBzcGVjaWZpZWQgYnkgdGhlIHVyaSBlLmcuCi0JICogZmlsZTpDOi9lY2xpcHNlL2V4YW1wbGVzL3B1cmNoYXNlb3JkZXIuZHRkCi0JICovCi0JcHVibGljIGJvb2xlYW4gbG9hZE1vZGVsKFJlc291cmNlU2V0IHJlc291cmNlcywgU3RyaW5nIHVyaSkgewotCQlib29sZWFuIHJjID0gdHJ1ZTsKLQotCQlpZiAodXJpID09IG51bGwgfHwgdXJpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCS8vIHRvZG8uLi4gSW52ZXN0aWdhdGUgd2h5IHdlIGNhbiBub3QgY3JlYXRlIGEgbmV3IERURFV0aWwgdG8gbG9hZAotCQkJLy8gdGhlIGV4dGVybmFsCi0JCQkvLyB3aXRob3V0IGJyZWFraW5nIHRoZSBidnQgdGVzdCBidWNrZXQgb24gdGhlIG9hZ2lzIGNhc2VzLgotCQkJLy8gQXJlIGRlcGVuZGluZyBvbiBtb2YncyBidWlsdCBpbiBjYWNoaW5nIHZpYQotCQkJLy8gcmVzb3VyY2VzLmxvYWQodXJpKT8KLQkJCS8vCi0JCQlVUkkgdXJpT2JqID0gVVJJLmNyZWF0ZVVSSSh1cmkpOwotCQkJUmVzb3VyY2UgciA9IHJlc291cmNlcy5jcmVhdGVSZXNvdXJjZSh1cmlPYmopOwotCQkJTWFwIG9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJci5sb2FkKG9wdGlvbnMpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByZXNvdXJjZXMuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJRFRERmlsZSBjdXJyZW50RmlsZSA9IChEVERGaWxlKSAoKFJlc291cmNlKSBpLm5leHQoKSkuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCQkJU3RyaW5nIGN1cnJlbnRVUkkgPSBjdXJyZW50RmlsZS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b1N0cmluZygpOwotCQkJCS8vIG5vdGUgOiBtb2Ygc3RvcmVzIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHVyaSB0aGFuIHRoZSBvbmUgd2UKLQkJCQkvLyBwYXNzZWQgaW4gdG8gcmVzb3VyY2VzLmxvYWQodXJpKQotCQkJCS8vIEluIHRoZSAnZmlsZTonIHByb3RvY29sIGNhc2UsIHRoZSBjYWxsCi0JCQkJLy8gcmVzb3VyY2UubG9hZCgiZmlsZTpEOlx4LmR0ZCIpIHdpbGwgc3RvcmUgYSByZXNvdXJjZSB3aXRoCi0JCQkJLy8gdXJpICJEOlx4LmR0ZCIuCi0JCQkJLy8gVGhpcyBpcyB3aHkgd2UgdXNlICdlbmRzd2l0aCgpJyBpbnN0ZWFkIG9mICdlcXVhbHMoKScgdG8KLQkJCQkvLyBjb21wYXJlLgotCQkJCWlmICh1cmkuZW5kc1dpdGgoY3VycmVudFVSSSkpIHsKLQkJCQkJZHRkRmlsZSA9IGN1cnJlbnRGaWxlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZHRkRmlsZSA9PSBudWxsKSB7Ci0JCQkJcmMgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlyYyA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiByYzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9yb3NlL0RURC5jYXQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9yb3NlL0RURC5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwOTcyNzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvcm9zZS9EVEQuY2F0CisrKyAvZGV2L251bGwKQEAgLTEsMzgxMiArMCwwIEBACi0NCi0ob2JqZWN0IFBldGFsDQotICAgIHZlcnNpb24gICAgCTQ1DQotICAgIF93cml0dGVuICAgCSJSb3NlIDcuNS4wMTAzLjE5MjAiDQotICAgIGNoYXJTZXQgICAgCTApDQotDQotKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiZHRkIg0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIklETCINCi0JICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVkNTczMC04NTBiLTExZTEtMDAwMC0wMDVjZjQ2OTFjNGM6MSIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIg0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgImR0ZCIpKQ0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkgICAgbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIg0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIm9yZy5lY2xpcHNlLndzdC5kdGQiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJwcmVmaXgiDQotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRFREIikpKQ0KLSAgICBxdWlkICAgICAgIAkiMzg1N0IxQzAwMjkzIg0KLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIg0KLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkob2JqZWN0IENsYXNzICJEVERFbGVtZW50Q29udGVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWQ1NzMwLTg1MGItMTFlMS0wMDAxLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3Q0JFQUNGMDIxMyINCi0JICAgIGFic3RyYWN0ICAgCVRSVUUpDQotCShvYmplY3QgQ2xhc3MgIkRUREdyb3VwQ29udGVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDAwLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3Q0JFQUVGMDIzMiINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDAxLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0Q5QUQ5MjAzNjMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERSZXBlYXRhYmxlQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFENEMwMUQxIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZ3JvdXBLaW5kIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwMi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkM5RUMwMTg5Ig0KLQkJICAgIHR5cGUgICAgICAgCSJEVERHcm91cEtpbmQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZDQTU1MDIxNiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERBdHRyaWJ1dGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwMy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0NDMTg3OTAwRUEiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwNC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlCN0YxNTkwMURBIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQXR0cmlidXRlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTIzODQ3MjAzOUQiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb21tZW50Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwNS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzgzOURDOUEwMTNCIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZWZhdWx0S2luZCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMDYtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RTE0NEJGMDI2MSINCi0JCSAgICB0eXBlICAgICAgIAkiRFRERGVmYXVsdEtpbmQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RTE0NERDMDNBRCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRlZmF1bHRWYWx1ZVN0cmluZyINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMDctMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5NkI5QkJGMDA2QiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRURE9jY3VycmVuY2VUeXBlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMDgtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdDQzE5QUYwMDdEIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfE9ORT00OSANCi18T1BUSU9OQUw9NjMgT05FX09SX01PUkU9NDMgWkVST19PUl9NT1JFPTQyDQotCSAgICANCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIpDQotCShvYmplY3QgQ2xhc3MgIkRUREVsZW1lbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwOS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0Q5QUFGNzAwNzEiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwYS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlCN0YwQUYwMkE4Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQ2xhc3MiDQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENUJGMDAwQSIpDQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzOUZFMkI4MzAyOUIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkI1RTAyREUiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb21tZW50Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwYi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzgzOURDODEwMDYyIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFRERW1wdHlDb250ZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMGMtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdEOUFCNDcwMzdBIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMGQtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RDlBQkYzMDMyNyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnRDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUFDRjAyMTMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRUREFueUNvbnRlbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwZS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0Q5QUI1MDAzMDQiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwZi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdEOUFCRUUwMjA3Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQUNGMDIxMyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFREUENEYXRhQ29udGVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDEwLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RDlBQjVDMDEzNSINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDExLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0Q5QUJFOTAyNzgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50Q29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQkVBQ0YwMjEzIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDEyLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RDlBQjdEMDAxMCINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDEzLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0Q5QUQ4QzAzQUEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERSZXBlYXRhYmxlQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFENEMwMUQxIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERSZXBlYXRhYmxlQ29udGVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDE0LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RDlBRDRDMDFEMSINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDE1LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0Q5QURCNzAzQzAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50Q29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQkVBQ0YwMjEzIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib2NjdXJyZW5jZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMTYtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3Q0MxOEE5MDE0OCINCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiSlVTVF9PTkU9IC0xICBPTkVfT1JfTU9SRT00MyBPUFRJT05BTD02MyBaRVJPX09SX01PUkU9NDIiDQotCQkgICAgdHlwZSAgICAgICAJIkRURE9jY3VycmVuY2VUeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NDMTlBRjAwN0QiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQ0KLQkgICAgYWJzdHJhY3QgICAJVFJVRSkNCi0JKG9iamVjdCBDbGFzcyAiRFRERmlsZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDE3LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RDlCMDhFMDE4RiINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDE4LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOUI3RjA3RjAxMTgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OmVOYW1lZEVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENEVFMDAxNCIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbW1lbnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDE5LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODM5REJFRjAxMkIiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhcnNlRXJyb3IiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDFhLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODhDOTk1RjAyNUIiDQotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFRERGVmYXVsdEtpbmQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwMC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0UxNDREQzAzQUQiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiSU1QTElFRD0xIFJFUVVJUkVEPTIgRklYRUQ9MyBOT0ZJWEVEPTQiDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iKQ0KLQkob2JqZWN0IENsYXNzICJEVERCYXNpY1R5cGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwMS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0UxNDY0RjAwREEiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwMi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlCN0YyODAwMzE1Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQ2xhc3MiDQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENUJGMDAwQSIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImtpbmQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDAzLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0UxNDY4QTAwMTYiDQotCQkgICAgdHlwZSAgICAgICAJIkRUREJhc2ljVHlwZUtpbmQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RTE0OTA1MDIyQyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERFbnVtZXJhdGlvblR5cGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwNC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0UxNDY2ODAzMDYiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwNS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlCN0YyODEwMzAyIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFRW51bSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlBNDczRTkwMUQ0IikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAia2luZCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMDYtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RTE0NkFDMDNCOCINCi0JCSAgICB0eXBlICAgICAgIAkiRFRERW51bUdyb3VwS2luZCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFMTQ5QjIwMUFEIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRUREJhc2ljVHlwZUtpbmQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwNy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0UxNDkwNTAyMkMiDQotCSAgICBkb2N1bWVudGF0aW9uIAkiTk9ORT0wIENEQVRBPTEgSUQ9MiBJRFJFRj0zIElEUkVGUz00IEVOVElUWT01IEVOVElUSUVTPTYgTk1UT0tFTj03IE5NVE9LRU5TPTgiDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iKQ0KLQkob2JqZWN0IENsYXNzICJEVERFbnVtR3JvdXBLaW5kIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMDgtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFMTQ5QjIwMUFEIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIk5BTUVfVE9LRU5fR1JPVVA9MSBOT1RBVElPTl9HUk9VUD0yIg0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIikNCi0JKG9iamVjdCBDbGFzcyAiRFRER3JvdXBLaW5kIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMDktMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFRkNBNTUwMjE2Ig0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIlNFUVVFTkNFPTEgQ0hPSUNFPTIiDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iKQ0KLQkob2JqZWN0IENsYXNzICJEVEROb3RhdGlvbiINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDBhLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RUZEMEVGMDBDOSINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDBiLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOUI3RjBFMzAyMzQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OmVOYW1lZEVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENEVFMDAxNCIpDQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzOUZFMkI4NTAxMTgiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkI1RTAyREUiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb21tZW50Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwYy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzgzOURDMEEwMjRDIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzeXN0ZW1JRCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMGQtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMTAyMDM5NyINCi0JCSAgICB0eXBlICAgICAgIAkic3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHVibGljSUQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDBlLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDEwRTAxOEMiDQotCQkgICAgdHlwZSAgICAgICAJInN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERFbnRpdHkiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwZi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0VGRDEyQjAzQzgiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAxMC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlCN0YwRTcwMUVBIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjplTmFtZWRFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDRFRTAwMTQiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiMzlGRTJCODYwMzA0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCNUUwMkRFIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29tbWVudCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMTEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MzlEQzM3MDA4RSINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFyYW1ldGVyRW50aXR5Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAxMi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQxM0MwMTdFIg0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRUREVudGl0eUNvbnRlbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAxMy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0VGRDE5RDAwODMiDQotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQ0KLQkob2JqZWN0IENsYXNzICJEVERFeHRlcm5hbEVudGl0eSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDE0LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RUZEMUY4MDNFMSINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDE1LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDMyNDAwRjMiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHlDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDE5RDAwODMiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzeXN0ZW1JRCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMDAtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMkU1MDE2MSINCi0JCSAgICB0eXBlICAgICAgIAkic3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHVibGljSUQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDAxLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDJFQzAxRjciDQotCQkgICAgdHlwZSAgICAgICAJInN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERJbnRlcm5hbEVudGl0eSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDAyLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RUZEMkJBMDI2RSINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDAzLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDMyQjAzMkUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHlDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDE5RDAwODMiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMDQtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMkNCMDI2OCINCi0JCSAgICB0eXBlICAgICAgIAkic3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDA1LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4NTI4N0NBMDE2MyINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDA2LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOUI3RjBEMTAwNzYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OmVOYW1lZEVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENEVFMDAxNCIpDQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIHF1aWQgICAgICAgCSIzOUZFMkI4QTAyODciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkI1RTAyREUiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwNy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzODUyOTAwRTAxMjciDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwOC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzg1MjkwNDQwMTFCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREUmVwZWF0YWJsZUNvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBRDRDMDFEMSIpKSkNCi0JKG9iamVjdCBDbGFzcyAiWE1MU2NoZW1hRGVmaW5lZFR5cGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwOS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzODlGMEM2RDAxMEUiDQotCSAgICBkb2N1bWVudGF0aW9uIAkNCi18Tk9ORT0tMQ0KLXxTVFJJTkc9MQ0KLXxCT09MRUFOPTINCi18RkxPQVQ9Mw0KLXxET1VCTEU9NA0KLXxERUNJTUFMPTUNCi18VElNRUlOU1RBTlQ9Ng0KLXxUSU1FRFVSQVRJT049Nw0KLXxSRUNVUlJJTkdJTlNUQU5UPTgNCi18QklOQVJZPTkNCi18VVJJPTEwDQotfElOVEVHRVI9MTENCi18REFURT0xMg0KLXxUSU1FPTEzDQotCSAgICANCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIpDQotCShvYmplY3QgQ2xhc3MgIkRURENvbnRlbnQiDQotCSAgICBxdWlkICAgICAgIAkiMzlGRTJCNUUwMkRFIg0KLQkgICAgYWJzdHJhY3QgICAJVFJVRSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDBhLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3Q0JFQjZGMDA1RCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJjb250ZW50Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwYi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdDQkVCNzAwMDZEIg0KLQkJICAgIGxhYmVsICAgICAgCSJjb250ZW50Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQUNGMDIxMyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpDQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIg0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJncm91cCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMGMtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3Q0JFQjcwMDBBQiINCi0JCSAgICBsYWJlbCAgICAgIAkiZ3JvdXAiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERHcm91cENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQUVGMDIzMiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwZC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0Q5QUMwRTAwQ0QiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZWxlbWVudCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMGUtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RDlBQzBGMDM5RiINCi0JCSAgICBsYWJlbCAgICAgIAkiZWxlbWVudCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQUY3MDA3MSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJjb250ZW50Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwZi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdEOUFDMEYwM0E5Ig0KLQkJICAgIGxhYmVsICAgICAgCSJjb250ZW50Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQUNGMDIxMyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMiINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDEwLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RDlBRjExMDAxQSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlbGVtZW50UmVmZXJlbmNlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxMS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdEOUFGMUIwMjA5Ig0KLQkJICAgIGxhYmVsICAgICAgCSJlbGVtZW50UmVmZXJlbmNlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQjdEMDAxMCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpKQ0KLQkJKG9iamVjdCBSb2xlICJyZWZlcmVuY2VkRWxlbWVudCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMTItMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RDlBRjFCMDIwQSINCi0JCSAgICBsYWJlbCAgICAgIAkicmVmZXJlbmNlZEVsZW1lbnQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUFGNzAwNzEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMTMtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFRkQxQzkwMkRGIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDE0LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDFDQTAzMUQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMTJCMDNDOCINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImNvbnRlbnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDE1LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDFDQTAzMjciDQotCQkgICAgbGFiZWwgICAgICAJImNvbnRlbnQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHlDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDE5RDAwODMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxNi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0VGRDM0NDAwRTUiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAibm90YXRpb24iDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDE3LTAwNWNmNDY5MWM0YzoxIikpDQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJImVDb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpDQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDM0NTAyMDkiDQotCQkgICAgbGFiZWwgICAgICAJIm5vdGF0aW9uIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRETm90YXRpb24iDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMEVGMDBDOSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJlbnRpdHkiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDE4LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDM0NTAyMTMiDQotCQkgICAgbGFiZWwgICAgICAJImVudGl0eSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREV4dGVybmFsRW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDFGODAzRTEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMTktMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzg1Mjg5NzkwMDVGIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgInBhcm1FbnRpdHlSZWYiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDFhLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODUyODk3QzAzNTIiDQotCQkgICAgbGFiZWwgICAgICAJInBhcm1FbnRpdHlSZWYiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UiDQotCQkgICAgcXVpZHUgICAgICAJIjM4NTI4N0NBMDE2MyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJlbnRpdHkiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDFiLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODUyODk3QzAzNTMiDQotCQkgICAgbGFiZWwgICAgICAJImVudGl0eSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxMkIwM0M4Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNyINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDFjLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4NTI5NEVCMDI0MyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJlbnRpdHlSZWZlcmVuY2UiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDFkLTAwNWNmNDY5MWM0YzoxIikpDQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJImVDb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODUyOTRFRjAzQkIiDQotCQkgICAgbGFiZWwgICAgICAJImVudGl0eVJlZmVyZW5jZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM4NTI5MDBFMDEyNyINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJlbGVtZW50UmVmZXJlbmNlZEVudGl0eSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMWUtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4NTI5NEVGMDNCQyINCi0JCSAgICBsYWJlbCAgICAgIAkiZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMTJCMDNDOCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDgiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxZi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzODUyOTcyRDAyQ0IiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiYXR0cmlidXRlTmFtZVJlZmVyZW5jZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMjAtMDA1Y2Y0NjkxYzRjOjEiKSkNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiZUNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4NTI5NzM2MDI5MSINCi0JCSAgICBsYWJlbCAgICAgIAkiYXR0cmlidXRlTmFtZVJlZmVyZW5jZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREF0dHJpYnV0ZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQzE4NzkwMEVBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAyMS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzg1Mjk3MzYwMjlCIg0KLQkJICAgIGxhYmVsICAgICAgCSJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxMkIwM0M4Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDIyLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4QjY4QTczMDJCOCINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMjMtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4QjY4QTc4MDA4NCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREV4dGVybmFsRW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDFGODAzRTEiKQ0KLQkJKG9iamVjdCBSb2xlICJlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAyNC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhCNjhBNzgwMDhFIg0KLQkJICAgIGxhYmVsICAgICAgCSJlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERmlsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUIwOEUwMThGIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAyNS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEJENDkwODAxM0QiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiYXR0cmlidXRlVHlwZVJlZmVyZW5jZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMjYtMDA1Y2Y0NjkxYzRjOjEiKSkNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiZUNvcmUiDQotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4QkQ0OTE0MDEzMCINCi0JCSAgICBsYWJlbCAgICAgIAkiYXR0cmlidXRlVHlwZVJlZmVyZW5jZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREF0dHJpYnV0ZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQzE4NzkwMEVBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAyNy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzhCRDQ5MTQwMTRFIg0KLQkJICAgIGxhYmVsICAgICAgCSJhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxMkIwM0M4Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTIiDQotCSAgICBxdWlkICAgICAgIAkiMzlGRTJBOTUwMENDIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzIg0KLQkJICAgIHF1aWQgICAgICAgCSIzOUZFMkE5NTAzMTEiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUFGNzAwNzEiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNCINCi0JCSAgICBxdWlkICAgICAgIAkiMzlGRTJBOTUwMzFCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQXR0cmlidXRlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NDMTg3OTAwRUEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5RkUyQkJFMDJEQyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNiINCi0JCSAgICBxdWlkICAgICAgIAkiMzlGRTJCQkYwMUIxIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERmlsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUIwOEUwMThGIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTciDQotCQkgICAgcXVpZCAgICAgICAJIjM5RkUyQkJGMDFCQiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRURENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQjVFMDJERSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgiDQotCSAgICBxdWlkICAgICAgIAkiMzlGRTMwRDgwMzNFIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUZFMzBEOTAxMDUiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERGaWxlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QjA4RTAxOEYiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMCINCi0JCSAgICBxdWlkICAgICAgIAkiMzlGRTMwRDkwMTM3Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW51bWVyYXRpb25UeXBlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0UxNDY2ODAzMDYiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpKQ0KLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIk1haW4iDQotCSAgICBxdWlkICAgICAgIAkiMzdDQUIwRTYwMTc3Ig0KLQkgICAgdGl0bGUgICAgICAJIk1haW4iDQotCSAgICB6b29tICAgICAgIAk5OA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBOb3RlVmlldyBAMQ0KLQkJICAgIGxvY2F0aW9uICAgCSgzMjY0LCAyNDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMQ0KLQkJCWxvY2F0aW9uICAgCSgyOTEwLCA2NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTcNCi0JCQltYXhfd2lkdGggIAk2NzMNCi0JCQlsYWJlbCAgICAgIAkNCi18RFRERWxlbWVudCdzLCANCi18RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlJ3MsIERUREVudGl0eSdzLCBhbmQgRFRETm90YXRpb24ncyBhcmUgYWRkZWQgdG8gRFRERmlsZSdzIHVzaW5nIHRoZQ0KLXxvd25lZEVsZW1lbnQgcmVsYXRpb25zaGlwDQotfGJldHdlZW4gTU9GTmFtZXNwYWNlDQotfGFuZCBNT0ZPYmplY3QNCi0JCQkpDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgd2lkdGggICAgICAJNzMzDQotCQkgICAgaGVpZ2h0ICAgICAJMzYzKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREludGVybmFsRW50aXR5IiBAMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODI0LCAxODcyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDINCi0JCQlsb2NhdGlvbiAgIAkoMTY0NywgMTgxNykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREludGVybmFsRW50aXR5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQyQkEwMjZFIg0KLQkJICAgIHdpZHRoICAgICAgCTM3Mg0KLQkJICAgIGhlaWdodCAgICAgCTEzNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnQiIEAzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDU5MiwgMTIwMCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAzDQotCQkJbG9jYXRpb24gICAJKDQxNywgMTE0NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNTANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREVsZW1lbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUFGNzAwNzEiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDMNCi0JCQlsb2NhdGlvbiAgIAkoNDE3LCAxMjA0KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzcxKQ0KLQkJICAgIHdpZHRoICAgICAgCTM2OA0KLQkJICAgIGhlaWdodCAgICAgCTEzNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eUNvbnRlbnQiIEA0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE1MjAsIDE0ODgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA0DQotCQkJbG9jYXRpb24gICAJKDEzNDEsIDE0MzgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzU4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFbnRpdHlDb250ZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxOUQwMDgzIg0KLQkJICAgIHdpZHRoICAgICAgCTM3Ng0KLQkJICAgIGhlaWdodCAgICAgCTEyNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTUyMCwgMTY0MCkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBzdXBwbGllciAgIAlANA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNTIwLCAxNjQwKQ0KLQkJCSgxNTIwLCAxNTUwKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIiBANg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNDgwLCAxMjE2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDYNCi0JCQlsb2NhdGlvbiAgIAkoMjE4NiwgMTE2NikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1ODgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4NTI4N0NBMDE2MyINCi0JCSAgICB3aWR0aCAgICAgIAk2MDYNCi0JCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHkiIEA3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE1MjAsIDEyMTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANw0KLQkJCWxvY2F0aW9uICAgCSgxMjcwLCAxMTM3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUwMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERW50aXR5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxMkIwM0M4Ig0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUA3DQotCQkJbG9jYXRpb24gICAJKDEyNzAsIDExOTYpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkJYW5jaG9yICAgICAJMg0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAk1MjUpDQotCQkgICAgd2lkdGggICAgICAJNTE4DQotCQkgICAgaGVpZ2h0ICAgICAJMTgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMyIgQDgNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU0NiwgMTM2NikNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDFDOTAyREYiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNCIgQDkNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTQsIDI0NikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDFDQTAzMUQiDQotCQkJICAgIGNsaWVudCAgICAgCUA4DQotCQkJICAgIHN1cHBsaWVyICAgCUA3DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTQ2LCAxMzY2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU0NiwgMTMwNykpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDEwDQotCQkJICAgIFBhcmVudF9WaWV3IAlAOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU0LCAyNDYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTENCi0JCQkJUGFyZW50X1ZpZXcgCUAxMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTQ0MywgMTQwNykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE5MQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrY29udGVudCINCi0JCQkJcGN0RGlzdCAgICAJMC42OTkyNDgNCi0JCQkJaGVpZ2h0ICAgICAJMTA0DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMUNBMDMyNyINCi0JCQkgICAgY2xpZW50ICAgICAJQDgNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NDYsIDEzNjYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTQ2LCAxNDI2KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMg0KLQkJCQlQYXJlbnRfVmlldyAJQDEwDQotCQkJCWxvY2F0aW9uICAgCSgxNTY4LCAxNDA4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC43MjE4MDQNCi0JCQkJaGVpZ2h0ICAgICAJMjINCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNiIgQDEzDQotCQkgICAgbG9jYXRpb24gICAJKDE5NzgsIDEyNTYpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzg1Mjg5NzkwMDVGIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgInBhcm1FbnRpdHlSZWYiIEAxNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzDQotCQkJICAgIGxvY2F0aW9uICAgCSg2MDIsIDQ4OCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE0DQotCQkJCWxvY2F0aW9uICAgCSgyMDM4LCAxMjk5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzI4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitwYXJtRW50aXR5UmVmIg0KLQkJCQlwY3REaXN0ICAgIAkwLjMwNTQxOQ0KLQkJCQloZWlnaHQgICAgIAk0Mw0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzODUyODk3QzAzNTIiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMw0KLQkJCSAgICBzdXBwbGllciAgIAlANg0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTk3OCwgMTI1NikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIxNzcsIDEyNTYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2DQotCQkJCVBhcmVudF9WaWV3IAlAMTQNCi0JCQkJbG9jYXRpb24gICAJKDIxNDEsIDEyMjgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjgyNjQ4NA0KLQkJCQloZWlnaHQgICAgIAkyOQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZW50aXR5IiBAMTcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjAyLCA0ODgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNw0KLQkJCQlsb2NhdGlvbiAgIAkoMTg2MiwgMTIxNykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZW50aXR5Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjU4OTEwOQ0KLQkJCQloZWlnaHQgICAgIAk0MA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzODUyODk3QzAzNTMiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMw0KLQkJCSAgICBzdXBwbGllciAgIAlANw0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTk3OCwgMTI1NikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3NzksIDEyNTYpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5DQotCQkJCVBhcmVudF9WaWV3IAlAMTcNCi0JCQkJbG9jYXRpb24gICAJKDE4MjMsIDEzMDkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIxIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc3NjkyMw0KLQkJCQloZWlnaHQgICAgIAk1Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OmVOYW1lZEVsZW1lbnQiIEAyMA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0ODgsIDE3NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDIwDQotCQkJbG9jYXRpb24gICAJKDEzNTIsIDEzMSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJImVOYW1lZEVsZW1lbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcxNzUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q0RUUwMDE0Ig0KLQkJICAgIHdpZHRoICAgICAgCTI5MA0KLQkJICAgIGhlaWdodCAgICAgCTExNQ0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RUNsYXNzIiBAMjENCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1NzYsIDk2MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMQ0KLQkJCWxvY2F0aW9uICAgCSg0OTIsIDg2MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkxNjgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVDbGFzcyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzE3NQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDVCRjAwMEEiDQotCQkgICAgd2lkdGggICAgICAJMTg2DQotCQkgICAgaGVpZ2h0ICAgICAJMjE4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUI3RjBBRjAyQTgiDQotCQkgICAgY2xpZW50ICAgICAJQDMNCi0JCSAgICBzdXBwbGllciAgIAlAMjENCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1NzEsIDExMzIpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDU3MSwgMTA2OSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjplTmFtZWRFbGVtZW50IiBAMjMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyNTYwLCA4NjQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMw0KLQkJCWxvY2F0aW9uICAgCSgyNDI0LCA4MTkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjcyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJlTmFtZWRFbGVtZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MTc1DQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENEVFMDAxNCINCi0JCSAgICB3aWR0aCAgICAgIAkyOTANCi0JCSAgICBoZWlnaHQgICAgIAkxMTUNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAyNA0KLQkJICAgIGxvY2F0aW9uICAgCSgyNTYwLCAxMDM2KQ0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBzdXBwbGllciAgIAlAMjMNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMjU2MCwgMTAzNikNCi0JCQkoMjU2MCwgOTIxKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUI3RjBFNzAxRUEiDQotCQkgICAgY2xpZW50ICAgICAJQDcNCi0JCSAgICBzdXBwbGllciAgIAlAMjMNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjY5LCAxMTI1KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjY5LCAxMDM2KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDI0KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjYNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCN0YwRDEwMDc2Ig0KLQkJICAgIGNsaWVudCAgICAgCUA2DQotCQkgICAgc3VwcGxpZXIgICAJQDIzDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjYxOCwgMTE1MykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYxOCwgMTAzNikNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyNCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVEROb3RhdGlvbiIgQDI3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDk5MiwgMTIzMikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyNw0KLQkJCWxvY2F0aW9uICAgCSg4MTcsIDExMjkpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzUwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVEROb3RhdGlvbiIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMEVGMDBDOSINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlAMjcNCi0JCQlsb2NhdGlvbiAgIAkoODE3LCAxMTg4KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkzDQotCQkJbWF4X3dpZHRoICAJMzcxKQ0KLQkJICAgIHdpZHRoICAgICAgCTM2OA0KLQkJICAgIGhlaWdodCAgICAgCTIzMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREV4dGVybmFsRW50aXR5IiBAMjgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTM0NCwgMTg3MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyOA0KLQkJCWxvY2F0aW9uICAgCSgxMTU4LCAxNzkzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM3Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERXh0ZXJuYWxFbnRpdHkiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDFGODAzRTEiDQotCQkgICAgd2lkdGggICAgICAJMzkwDQotCQkgICAgaGVpZ2h0ICAgICAJMTgyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNSIgQDI5DQotCQkgICAgbG9jYXRpb24gICAJKDk2OSwgMTY3NykNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDM0NDAwRTUiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAibm90YXRpb24iIEAzMA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI5DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMjQ3LCAyMDUpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzENCi0JCQkJUGFyZW50X1ZpZXcgCUAzMA0KLQkJCQlsb2NhdGlvbiAgIAkoODM0LCAxMzkwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMjAzDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitub3RhdGlvbiINCi0JCQkJcGN0RGlzdCAgICAJMC44NzA3MzQNCi0JCQkJaGVpZ2h0ICAgICAJMTM2DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMzQ1MDIwOSINCi0JCQkgICAgY2xpZW50ICAgICAJQDI5DQotCQkJICAgIHN1cHBsaWVyICAgCUAyNw0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTY5LCAxNjc3KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTY5LCAxMzQ3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMg0KLQkJCQlQYXJlbnRfVmlldyAJQDMwDQotCQkJCWxvY2F0aW9uICAgCSgxMDQwLCAxMzg4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNzINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC44Nzc5MzQNCi0JCQkJaGVpZ2h0ICAgICAJNzENCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVudGl0eSIgQDMzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjkNCi0JCQkgICAgbG9jYXRpb24gICAJKC0yNDcsIDIwNSkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNA0KLQkJCQlQYXJlbnRfVmlldyAJQDMzDQotCQkJCWxvY2F0aW9uICAgCSgxMDgyLCAxNzg2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUwDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlbnRpdHkiDQotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwDQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMzQ1MDIxMyINCi0JCQkgICAgY2xpZW50ICAgICAJQDI5DQotCQkJICAgIHN1cHBsaWVyICAgCUAyOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDk2OSwgMTY3NykNCi0JCQkJKDk2OSwgMTgyNykNCi0JCQkJKDExNDksIDE4MjcpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTY5LCAxNjc3KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE0OSwgMTgyNykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzUNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTEwNCwgMTg1MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuODYzNTAxDQotCQkJCWhlaWdodCAgICAgCTI2DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzYNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDMyNDAwRjMiDQotCQkgICAgY2xpZW50ICAgICAJQDI4DQotCQkgICAgc3VwcGxpZXIgICAJQDQNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjc0LCAxNzgxKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjc0LCAxNjQwKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQ29udGVudCIgQDM3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ3MiwgODAwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMzcNCi0JCQlsb2NhdGlvbiAgIAkoMTM0NCwgNzUwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI1Ng0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFREQ29udGVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQjVFMDJERSINCi0JCSAgICB3aWR0aCAgICAgIAkyNzQNCi0JCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzOA0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDcyLCA5OTApDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgc3VwcGxpZXIgICAJQDM3DQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDE0NzIsIDk5MCkNCi0JCQkoMTQ3MiwgODYyKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQjgzMDI5QiINCi0JCSAgICBjbGllbnQgICAgIAlAMw0KLQkJICAgIHN1cHBsaWVyICAgCUAzNw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDcxOSwgMTEzMikNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzE5LCA5OTApDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMzgpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQjg2MDMwNCINCi0JCSAgICBjbGllbnQgICAgIAlANw0KLQkJICAgIHN1cHBsaWVyICAgCUAzNw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0NTIsIDExMjQpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTIsIDk5MCkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAzOCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCOEEwMjg3Ig0KLQkJICAgIGNsaWVudCAgICAgCUA2DQotCQkgICAgc3VwcGxpZXIgICAJQDM3DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjM0NywgMTE1NCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM0NywgOTkwKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDM4KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREZpbGUiIEA0Mg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDg4LCA0NDgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANDINCi0JCQlsb2NhdGlvbiAgIAkoMTI4MSwgMzY5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQxNA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERmlsZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlCMDhFMDE4RiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANDINCi0JCQlsb2NhdGlvbiAgIAkoMTI4MSwgNDI4KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNDI1KQ0KLQkJICAgIHdpZHRoICAgICAgCTQzMg0KLQkJICAgIGhlaWdodCAgICAgCTE4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkiIEA0Mw0KLQkJICAgIGxvY2F0aW9uICAgCSgzNTQsIDEwNDkpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzhCNjhBNzMwMkI4Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwIiBANDQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEwOSwgMjA3KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QjY4QTc4MDA4NCINCi0JCQkgICAgY2xpZW50ICAgICAJQDQzDQotCQkJICAgIHN1cHBsaWVyICAgCUAyOA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDM1NCwgMTA0OSkNCi0JCQkJKDM1NCwgMTc4MSkNCi0JCQkJKDExNDksIDE3ODEpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzU0LCAxMDQ5KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE0OSwgMTc4MSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSIgQDQ1DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDMNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xMDksIDIwNykNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDQ1DQotCQkJCWxvY2F0aW9uICAgCSgyOTYsIDQ1MzcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk3MzINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUiDQotCQkJCXBjdERpc3QgICAgCS0yLjI4MzMzMw0KLQkJCQloZWlnaHQgICAgIAk1OQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEI2OEE3ODAwOEUiDQotCQkJICAgIGNsaWVudCAgICAgCUA0Mw0KLQkJCSAgICBzdXBwbGllciAgIAlANDINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzNTQsIDEwNDkpDQotCQkJCSgzNTQsIDQzOSkNCi0JCQkJKDEyNzIsIDQzOSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzNTQsIDEwNDkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjcyLCA0MzkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3DQotCQkJCVBhcmVudF9WaWV3IAlANDUNCi0JCQkJbG9jYXRpb24gICAJKDEyMDYsIDUwMCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTU3MTI5DQotCQkJCWhlaWdodCAgICAgCTYxDQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDgNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCN0YwN0YwMTE4Ig0KLQkJICAgIGNsaWVudCAgICAgCUA0Mg0KLQkJICAgIHN1cHBsaWVyICAgCUAyMA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0ODgsIDM1NykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4OCwgMjMzKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNSIgQDQ5DQotCQkgICAgbG9jYXRpb24gICAJKDE0NzIsIDYzOCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkJCRTAyREMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTYiIEA1MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5DQotCQkJICAgIGxvY2F0aW9uICAgCSgwLCAtMTYyKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQkJGMDFCMSINCi0JCQkgICAgY2xpZW50ICAgICAJQDQ5DQotCQkJICAgIHN1cHBsaWVyICAgCUA0Mg0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ3MiwgNjM4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ3MiwgNTM5KSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNyIgQDUxDQotCQkJICAgIFBhcmVudF9WaWV3IAlANDkNCi0JCQkgICAgbG9jYXRpb24gICAJKDAsIC0xNjIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkJCRjAxQkIiDQotCQkJICAgIGNsaWVudCAgICAgCUA0OQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMzcNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0NzIsIDYzOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0NzIsIDczOCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTINCi0JCQkJUGFyZW50X1ZpZXcgCUA1MQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTUyNiwgNzEyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC43MzYyNDgNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW51bWVyYXRpb25UeXBlIiBANTMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQ0OCwgNDY0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDUzDQotCQkJbG9jYXRpb24gICAJKDIxODQsIDM4NSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MjgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREVudW1lcmF0aW9uVHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RTE0NjY4MDMwNiINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANTMNCi0JCQlsb2NhdGlvbiAgIAkoMjE4NCwgNDQ0KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNTQ2KQ0KLQkJICAgIHdpZHRoICAgICAgCTU0Ng0KLQkJICAgIGhlaWdodCAgICAgCTE4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4IiBANTQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkzOSwgNDQ5KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUzMEQ4MDMzRSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOSIgQDU1DQotCQkJICAgIFBhcmVudF9WaWV3IAlANTQNCi0JCQkgICAgbG9jYXRpb24gICAJKC00NjEsIC0zMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMzBEOTAxMDUiDQotCQkJICAgIGNsaWVudCAgICAgCUA1NA0KLQkJCSAgICBzdXBwbGllciAgIAlANDINCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5MzksIDQ0OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDQsIDQ0OSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjAiIEA1Ng0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDU0DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNDYxLCAtMzEpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMzBEOTAxMzciDQotCQkJICAgIGNsaWVudCAgICAgCUA1NA0KLQkJCSAgICBzdXBwbGllciAgIAlANTMNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5MzksIDQ0OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIxNzUsIDQ0OSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTcNCi0JCQkJUGFyZW50X1ZpZXcgCUA1Ng0KLQkJCQlsb2NhdGlvbiAgIAkoMjEyMCwgNDg2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4ubiINCi0JCQkJcGN0RGlzdCAgICAJMC43Njc4MzcNCi0JCQkJaGVpZ2h0ICAgICAJMzcNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1OA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUI3RjBFMzAyMzQiDQotCQkgICAgY2xpZW50ICAgICAJQDI3DQotCQkgICAgc3VwcGxpZXIgICAJQDIzDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA2NCwgMTExNikNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA2NCwgMTAzNikNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyNCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDU5DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCODUwMTE4Ig0KLQkJICAgIGNsaWVudCAgICAgCUAyNw0KLQkJICAgIHN1cHBsaWVyICAgCUAzNw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk0MSwgMTExNykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTQxLCA5OTApDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMzgpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMzJCMDMyRSINCi0JCSAgICBjbGllbnQgICAgIAlAMg0KLQkJICAgIHN1cHBsaWVyICAgCUA0DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc4MiwgMTgwNSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc4MiwgMTY0MCkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA1KSkpDQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJFbGVtZW50RGVmaW5pdGlvbiINCi0JICAgIHF1aWQgICAgICAgCSIzN0UxNDMzMDAzMkYiDQotCSAgICB0aXRsZSAgICAgIAkiRWxlbWVudERlZmluaXRpb24iDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJNDI2DQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVtcHR5Q29udGVudCIgQDYxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDQ2NywgMTQ0OCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2MQ0KLQkJCWxvY2F0aW9uICAgCSgyODEsIDE0MDMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzcyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFbXB0eUNvbnRlbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUI0NzAzN0EiDQotCQkgICAgd2lkdGggICAgICAJMzkwDQotCQkgICAgaGVpZ2h0ICAgICAJMTE0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQW55Q29udGVudCIgQDYyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDg4NiwgMTQ0NSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2Mg0KLQkJCWxvY2F0aW9uICAgCSg3MjgsIDE0MDApDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzE2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERBbnlDb250ZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFCNTAwMzA0Ig0KLQkJICAgIHdpZHRoICAgICAgCTMzNA0KLQkJICAgIGhlaWdodCAgICAgCTExNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRURFBDRGF0YUNvbnRlbnQiIEA2Mw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjk4LCAxNDUxKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDYzDQotCQkJbG9jYXRpb24gICAJKDEwOTksIDE0MDYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzk4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERQQ0RhdGFDb250ZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFCNUMwMTM1Ig0KLQkJICAgIHdpZHRoICAgICAgCTQxNg0KLQkJICAgIGhlaWdodCAgICAgCTExNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRURFJlcGVhdGFibGVDb250ZW50IiBANjQNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg4OCwgMTQ1NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDY0DQotCQkJbG9jYXRpb24gICAJKDE1NzIsIDE0MDQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNjMyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERSZXBlYXRhYmxlQ29udGVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBRDRDMDFEMSINCi0JCSAgICB3aWR0aCAgICAgIAk2NTANCi0JCSAgICBoZWlnaHQgICAgIAkxMjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2NQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODc4LCAxNjE4KQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUA2NA0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxODc4LCAxNjE4KQ0KLQkJCSgxODc4LCAxNTIwKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQXR0cmlidXRlIiBANjYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTM2LCA0MDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjYNCi0JCQlsb2NhdGlvbiAgIAkoMTg1NSwgMzI1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTE2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUF0dHJpYnV0ZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzE3NQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTIzODQ3MjAzOUQiDQotCQkgICAgaGVpZ2h0ICAgICAJMTc0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQ2xhc3MiIEA2Nw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDkyOCwgMzg0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDY3DQotCQkJbG9jYXRpb24gICAJKDg0NywgMzA5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTE2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUNsYXNzIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MTc1DQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENUJGMDAwQSINCi0JCSAgICBoZWlnaHQgICAgIAkxNzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERHcm91cENvbnRlbnQiIEA2OA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgyMTkyLCAxNzc2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDY4DQotCQkJbG9jYXRpb24gICAJKDE5MzEsIDE3MjcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTIyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERHcm91cENvbnRlbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUFFRjAyMzIiDQotCQkgICAgd2lkdGggICAgICAJNTQwDQotCQkgICAgaGVpZ2h0ICAgICAJMTIyDQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBRDkyMDM2MyINCi0JCSAgICBjbGllbnQgICAgIAlANjgNCi0JCSAgICBzdXBwbGllciAgIAlANjQNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjIxLCAxNzE0KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjIxLCAxNjE4KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDY1KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQiIEA3MA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDg4LCAxNzYwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDcwDQotCQkJbG9jYXRpb24gICAJKDEyMjMsIDE3MTUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTMwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzg1MjkwMEUwMTI3Ig0KLQkJICAgIHdpZHRoICAgICAgCTU0OA0KLQkJICAgIGhlaWdodCAgICAgCTExNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzENCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzODUyOTA0NDAxMUIiDQotCQkgICAgY2xpZW50ICAgICAJQDcwDQotCQkgICAgc3VwcGxpZXIgICAJQDY0DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQ3NCwgMTcwMikNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ3NCwgMTYxOCkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA2NSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50Q29udGVudCIgQDcyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDkxMiwgMTA1NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDcyDQotCQkJbG9jYXRpb24gICAJKDcwNCwgMTAwOCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREVsZW1lbnRDb250ZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQkVBQ0YwMjEzIg0KLQkJICAgIHdpZHRoICAgICAgCTQzNA0KLQkJICAgIGhlaWdodCAgICAgCTEyMA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEA3Mw0KLQkJICAgIGxvY2F0aW9uICAgCSgyMjg5LCAxMDQ4KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQjZGMDA1RCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50IiBANzQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA3Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyNSwgOCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDc0DQotCQkJCWxvY2F0aW9uICAgCSgxMjIzLCAxMDAxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitjb250ZW50Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjkxOTQyNA0KLQkJCQloZWlnaHQgICAgIAk0OA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUI3MDAwNkQiDQotCQkJICAgIGNsaWVudCAgICAgCUA3Mw0KLQkJCSAgICBzdXBwbGllciAgIAlANzINCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIyODksIDEwNDgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI5LCAxMDQ4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3Ng0KLQkJCQlQYXJlbnRfVmlldyAJQDc0DQotCQkJCWxvY2F0aW9uICAgCSgxMTg2LCAxMDgzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNzINCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMS4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC45NTEzODENCi0JCQkJaGVpZ2h0ICAgICAJMzUNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc3DQotCQkJCVBhcmVudF9WaWV3IAlANzQNCi0JCQkJbG9jYXRpb24gICAJKDEyNDYsIDk0MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTMNCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1OQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iDQotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwDQotCQkJCWhlaWdodCAgICAgCTEwOA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZ3JvdXAiIEA3OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDczDQotCQkJICAgIGxvY2F0aW9uICAgCSgxMDI1LCA4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5DQotCQkJCVBhcmVudF9WaWV3IAlANzgNCi0JCQkJbG9jYXRpb24gICAJKDI1MzUsIDE3NDUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNDQNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2dyb3VwIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkzNzc0NA0KLQkJCQloZWlnaHQgICAgIAk0MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUI3MDAwQUIiDQotCQkJICAgIGNsaWVudCAgICAgCUA3Mw0KLQkJCSAgICBzdXBwbGllciAgIAlANjgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyMjg5LCAxMDQ4KQ0KLQkJCQkoMjU4NywgMTA0OCkNCi0JCQkJKDI1ODcsIDE3ODUpDQotCQkJCSgyNDYyLCAxNzg1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIyODksIDEwNDgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDYyLCAxNzg1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MA0KLQkJCQlQYXJlbnRfVmlldyAJQDc4DQotCQkJCWxvY2F0aW9uICAgCSgyNTI2LCAxODI3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45NDUwODUNCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODENCi0JCSAgICBsb2NhdGlvbiAgIAkoOTEwLCAxMjkxKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUA3Mg0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSg5MTAsIDEyOTEpDQotCQkJKDkxMCwgMTExNikpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODINCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUJFOTAyNzgiDQotCQkgICAgY2xpZW50ICAgICAJQDYzDQotCQkgICAgc3VwcGxpZXIgICAJQDcyDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMTM5NCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NywgMTI5MSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA4MSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDgzDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFCRjMwMzI3Ig0KLQkJICAgIGNsaWVudCAgICAgCUA2MQ0KLQkJICAgIHN1cHBsaWVyICAgCUA3Mg0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQ2NiwgMTM5MSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDY2LCAxMjkxKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDgxKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODQNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUJFRTAyMDciDQotCQkgICAgY2xpZW50ICAgICAJQDYyDQotCQkgICAgc3VwcGxpZXIgICAJQDcyDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODgxLCAxMzg4KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4ODEsIDEyOTEpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAODEpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBREI3MDNDMCINCi0JCSAgICBjbGllbnQgICAgIAlANjQNCi0JCSAgICBzdXBwbGllciAgIAlANzINCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTAzLCAxMzkyKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTAzLCAxMjkxKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDgxKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IiBAODYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNzg0LCAxNzYwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDg2DQotCQkJbG9jYXRpb24gICAJKDQ5MiwgMTcxNSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1ODQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFCN0QwMDEwIg0KLQkJICAgIHdpZHRoICAgICAgCTYwMg0KLQkJICAgIGhlaWdodCAgICAgCTExNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODcNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUQ4QzAzQUEiDQotCQkgICAgY2xpZW50ICAgICAJQDg2DQotCQkgICAgc3VwcGxpZXIgICAJQDY0DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjUwLCAxNzAzKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NTAsIDE2MTgpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlANjUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5IiBAODgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ4OCwgMjA2NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA4OA0KLQkJCWxvY2F0aW9uICAgCSgxMjQ0LCAxOTkyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ4OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERW50aXR5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxMkIwM0M4Ig0KLQkJICAgIHdpZHRoICAgICAgCTUwNg0KLQkJICAgIGhlaWdodCAgICAgCTE2OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDciIEA4OQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDgwLCAxODk4KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4NTI5NEVCMDI0MyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbnRpdHlSZWZlcmVuY2UiIEA5MA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDg5DQotCQkJICAgIGxvY2F0aW9uICAgCSgzMTIsIC03MCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MQ0KLQkJCQlQYXJlbnRfVmlldyAJQDkwDQotCQkJCWxvY2F0aW9uICAgCSgxMjgwLCAxODQyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMzEyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlbnRpdHlSZWZlcmVuY2UiDQotCQkJCXBjdERpc3QgICAgCTAuNjkzNzUwDQotCQkJCWhlaWdodCAgICAgCTIwMQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzODUyOTRFRjAzQkIiDQotCQkJICAgIGNsaWVudCAgICAgCUA4OQ0KLQkJCSAgICBzdXBwbGllciAgIAlANzANCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0ODAsIDE4OTgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDgwLCAxODE3KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5Mg0KLQkJCQlQYXJlbnRfVmlldyAJQDkwDQotCQkJCWxvY2F0aW9uICAgCSgxNTM0LCAxODQyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC42OTM3NTANCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVsZW1lbnRSZWZlcmVuY2VkRW50aXR5IiBAOTMNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzEyLCAtNzApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTQNCi0JCQkJUGFyZW50X1ZpZXcgCUA5Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTIyMCwgMTk1NCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ4MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkiDQotCQkJCXBjdERpc3QgICAgCTAuNjg1MzE1DQotCQkJCWhlaWdodCAgICAgCTI2MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzODUyOTRFRjAzQkMiDQotCQkJICAgIGNsaWVudCAgICAgCUA4OQ0KLQkJCSAgICBzdXBwbGllciAgIAlAODgNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0ODAsIDE4OTgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDgwLCAxOTgwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NQ0KLQkJCQlQYXJlbnRfVmlldyAJQDkzDQotCQkJCWxvY2F0aW9uICAgCSgxNTI0LCAxOTU4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC43MzQyMzQNCi0JCQkJaGVpZ2h0ICAgICAJNDQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudCIgQDk2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDkxMiwgNzUyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDk2DQotCQkJbG9jYXRpb24gICAJKDc0NCwgNzAyKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMzNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERWxlbWVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQUY3MDA3MSINCi0JCSAgICB3aWR0aCAgICAgIAkzNTQNCi0JCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxIiBAOTcNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTEyLCA5MDQpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFDMEUwMENEIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVsZW1lbnQiIEA5OA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDk3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMjUsIDk2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk5DQotCQkJCVBhcmVudF9WaWV3IAlAOTgNCi0JCQkJbG9jYXRpb24gICAJKDEwMTQsIDg2NSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZWxlbWVudCINCi0JCQkJcGN0RGlzdCAgICAJMC40Mjg1NzENCi0JCQkJaGVpZ2h0ICAgICAJMTAyDQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQzBGMDM5RiINCi0JCQkgICAgY2xpZW50ICAgICAJQDk3DQotCQkJICAgIHN1cHBsaWVyICAgCUA5Ng0KLQkJCSAgICBsaW5lX3N0eWxlIAkwDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMA0KLQkJCQlQYXJlbnRfVmlldyAJQDk4DQotCQkJCWxvY2F0aW9uICAgCSg4NTcsIDg1MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuNTk4MjE0DQotCQkJCWhlaWdodCAgICAgCTU2DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50IiBAMTAxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAOTcNCi0JCQkgICAgbG9jYXRpb24gICAJKC0yNSwgOTYpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyDQotCQkJCVBhcmVudF9WaWV3IAlAMTAxDQotCQkJCWxvY2F0aW9uICAgCSgxMDE0LCA5NjQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2NvbnRlbnQiDQotCQkJCXBjdERpc3QgICAgCTAuNjY0MDYzDQotCQkJCWhlaWdodCAgICAgCTEwMg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUMwRjAzQTkiDQotCQkJICAgIGNsaWVudCAgICAgCUA5Nw0KLQkJCSAgICBzdXBwbGllciAgIAlANzINCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDMNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDENCi0JCQkJbG9jYXRpb24gICAJKDg3MSwgOTYyKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC42NDA2MjUNCi0JCQkJaGVpZ2h0ICAgICAJNDINCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMiIgQDEwNA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjMsIDExMjIpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFGMTEwMDFBIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVsZW1lbnRSZWZlcmVuY2UiIEAxMDUNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQNCi0JCQkgICAgbG9jYXRpb24gICAJKC05ODEsIDY0MikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDUNCi0JCQkJbG9jYXRpb24gICAJKDMyMSwgMTgyNSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM0OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZWxlbWVudFJlZmVyZW5jZSINCi0JCQkJcGN0RGlzdCAgICAJMC44NDAwMzUNCi0JCQkJaGVpZ2h0ICAgICAJNTYNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzdEOUFGMUIwMjA5Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAMTA0DQotCQkJICAgIHN1cHBsaWVyICAgCUA4Ng0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDEyMywgMTEyMikNCi0JCQkJKDEyMywgMTc2OSkNCi0JCQkJKDQ4MywgMTc2OSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMsIDExMjIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0ODMsIDE3NjkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNw0KLQkJCQlQYXJlbnRfVmlldyAJQDEwNQ0KLQkJCQlsb2NhdGlvbiAgIAkoNDIyLCAxNzI2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC45NDA1NTkNCi0JCQkJaGVpZ2h0ICAgICAJNDQNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgInJlZmVyZW5jZWRFbGVtZW50IiBAMTA4DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0DQotCQkJICAgIGxvY2F0aW9uICAgCSgtOTgxLCA2NDIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5DQotCQkJCVBhcmVudF9WaWV3IAlAMTA4DQotCQkJCWxvY2F0aW9uICAgCSg1MzIsIDY4NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTM2MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcmVmZXJlbmNlZEVsZW1lbnQiDQotCQkJCXBjdERpc3QgICAgCTAuNzk5NjUwDQotCQkJCWhlaWdodCAgICAgCTQzDQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3RDlBRjFCMDIwQSINCi0JCQkgICAgY2xpZW50ICAgICAJQDEwNA0KLQkJCSAgICBzdXBwbGllciAgIAlAOTYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMjMsIDExMjIpDQotCQkJCSgxMjMsIDcyOCkNCi0JCQkJKDczNSwgNzI4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMywgMTEyMikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDczNSwgNzI4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTANCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDgNCi0JCQkJbG9jYXRpb24gICAJKDcwMSwgNzczKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC45NjY5NjUNCi0JCQkJaGVpZ2h0ICAgICAJNDUNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTENCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCN0YwQUYwMkE4Ig0KLQkJICAgIGNsaWVudCAgICAgCUA5Ng0KLQkJICAgIHN1cHBsaWVyICAgCUA2Nw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDkyMywgNjkwKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjMsIDQ3MCkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQXR0cmlidXRlIiBAMTEyDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4ODgsIDc1MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMTINCi0JCQlsb2NhdGlvbiAgIAkoMTYxMiwgNjU3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTU1Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFREQXR0cmlidXRlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQzE4NzkwMEVBIg0KLQkJICAgIHdpZHRoICAgICAgCTU3MA0KLQkJICAgIGhlaWdodCAgICAgCTIxNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgiIEAxMTMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjc3NSwgMTYyOCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzODUyOTcyRDAyQ0IiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlTmFtZVJlZmVyZW5jZSIgQDExNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5MSwgLTU2NCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTQNCi0JCQkJbG9jYXRpb24gICAJKDI0MjIsIDgwOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrYXR0cmlidXRlTmFtZVJlZmVyZW5jZSINCi0JCQkJcGN0RGlzdCAgICAJMC44Mjk2MzANCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzg1Mjk3MzYwMjkxIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTEzDQotCQkJICAgIHN1cHBsaWVyICAgCUAxMTINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyNzc1LCAxNjI4KQ0KLQkJCQkoMjc3NSwgNzY4KQ0KLQkJCQkoMjE3MywgNzY4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI3NzUsIDE2MjgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTczLCA3NjgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNg0KLQkJCQlQYXJlbnRfVmlldyAJQDExNA0KLQkJCQlsb2NhdGlvbiAgIAkoMjIyMiwgODcxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC45NjY2NDkNCi0JCQkJaGVpZ2h0ICAgICAJMTAyDQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSIgQDExNw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDExMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5MSwgLTU2NCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTcNCi0JCQkJbG9jYXRpb24gICAJKDIwNzYsIDIwOTApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk1ODgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjc3MTQ2OQ0KLQkJCQloZWlnaHQgICAgIAkzNQ0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzODUyOTczNjAyOUIiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMTMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDg4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjc3NSwgMTYyOCkNCi0JCQkJKDI3NzUsIDIwNTUpDQotCQkJCSgxNzQxLCAyMDU1KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI3NzUsIDE2MjgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQxLCAyMDU1KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTkNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTcNCi0JCQkJbG9jYXRpb24gICAJKDE4MTMsIDIwMTgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk1MTQ0Mg0KLQkJCQloZWlnaHQgICAgIAkzOA0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMSIgQDEyMA0KLQkJICAgIGxvY2F0aW9uICAgCSgyOTQ1LCAxODkxKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QkQ0OTA4MDEzRCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlIiBAMTIxDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwDQotCQkJICAgIGxvY2F0aW9uICAgCSgxNDg5LCAtNjc2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMg0KLQkJCQlQYXJlbnRfVmlldyAJQDEyMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjQzNSwgNjU2KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNDQ0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIithdHRyaWJ1dGVUeXBlUmVmZXJlbmNlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg2NjAyNg0KLQkJCQloZWlnaHQgICAgIAk1NA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEJENDkxNDAxMzAiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjANCi0JCQkgICAgc3VwcGxpZXIgICAJQDExMg0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI5NDUsIDE4OTEpDQotCQkJCSgyOTQ1LCA3MDgpDQotCQkJCSgyMTczLCA3MDgpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjk0NSwgMTg5MSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIxNzMsIDcwOCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzDQotCQkJCVBhcmVudF9WaWV3IAlAMTIxDQotCQkJCWxvY2F0aW9uICAgCSgyMzQ1LCA2MDMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjkxMjUzOA0KLQkJCQloZWlnaHQgICAgIAkxMDcNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5IiBAMTI0DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwDQotCQkJICAgIGxvY2F0aW9uICAgCSgxNDg5LCAtNjc2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEyNA0KLQkJCQlsb2NhdGlvbiAgIAkoMTY3OSwgMjI5OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTU3Ng0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkiDQotCQkJCXBjdERpc3QgICAgCTAuODI4NjAxDQotCQkJCWhlaWdodCAgICAgCTU2DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4QkQ0OTE0MDE0RSINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyMA0KLQkJCSAgICBzdXBwbGllciAgIAlAODgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyOTQ1LCAxODkxKQ0KLQkJCQkoMjk0NSwgMjI0MykNCi0JCQkJKDE0MzgsIDIyNDMpDQotCQkJCSgxNDM4LCAyMTQ4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI5NDUsIDE4OTEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDM4LCAyMTQ4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjQNCi0JCQkJbG9jYXRpb24gICAJKDEzNjUsIDIxNzgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk4NDc3NA0KLQkJCQloZWlnaHQgICAgIAk3NA0KLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyNw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUI3RjE1OTAxREEiDQotCQkgICAgY2xpZW50ICAgICAJQDExMg0KLQkJICAgIHN1cHBsaWVyICAgCUA2Ng0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5NTAsIDY0NSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk1MCwgNDg2KSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMiIgQDEyOA0KLQkJICAgIGxvY2F0aW9uICAgCSgxMzQ2LCA3NTIpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJBOTUwMENDIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzIiBAMTI5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNTQyLCAtMTYpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlGRTJBOTUwMzExIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTI4DQotCQkJICAgIHN1cHBsaWVyICAgCUA5Ng0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTM0NiwgNzUyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4OSwgNzUyKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNCIgQDEzMA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU0MiwgLTE2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlGRTJBOTUwMzFCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTI4DQotCQkJICAgIHN1cHBsaWVyICAgCUAxMTINCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzNDYsIDc1MikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2MDMsIDc1MikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMxDQotCQkJCVBhcmVudF9WaWV3IAlAMTMwDQotCQkJCWxvY2F0aW9uICAgCSgxNTQ0LCA3OTEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4qIg0KLQkJCQlwY3REaXN0ICAgIAkwLjc3MzM5MA0KLQkJCQloZWlnaHQgICAgIAkzOQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiQXR0cmlidXRlRGVmaW5pdGlvbiINCi0JICAgIHF1aWQgICAgICAgCSIzN0UxNDQ1NzAyNTciDQotCSAgICB0aXRsZSAgICAgIAkiQXR0cmlidXRlRGVmaW5pdGlvbiINCi0JICAgIHpvb20gICAgICAgCTEwMA0KLQkgICAgbWF4X2hlaWdodCAJMjgzNTANCi0JICAgIG1heF93aWR0aCAgCTIxNjAwDQotCSAgICBvcmlnaW5feCAgIAkwDQotCSAgICBvcmlnaW5feSAgIAkwDQotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdA0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREF0dHJpYnV0ZSIgQDEzMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTEyLCA2NTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTMyDQotCQkJbG9jYXRpb24gICAJKDIzNiwgNTM5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTU1Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFREQXR0cmlidXRlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQzE4NzkwMEVBIg0KLQkJICAgIHdpZHRoICAgICAgCTU3MA0KLQkJICAgIGhlaWdodCAgICAgCTI1OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREJhc2ljVHlwZSIgQDEzMw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI2NCwgNjU2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEzMw0KLQkJCWxvY2F0aW9uICAgCSgxMDE3LCA1ODQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDk0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERCYXNpY1R5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0UxNDY0RjAwREEiDQotCQkgICAgd2lkdGggICAgICAJNTEyDQotCQkgICAgaGVpZ2h0ICAgICAJMTY4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW51bWVyYXRpb25UeXBlIiBAMTM0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTA0LCA2NTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTM0DQotCQkJbG9jYXRpb24gICAJKDE2NDYsIDU4NCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREVudW1lcmF0aW9uVHlwZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RTE0NjY4MDMwNiINCi0JCSAgICB3aWR0aCAgICAgIAk1MzQNCi0JCSAgICBoZWlnaHQgICAgIAkxNjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgTm90ZVZpZXcgQDEzNQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5MTIsIDExMjApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTM1DQotCQkJbG9jYXRpb24gICAJKDQ5MiwgOTI2KQ0KLQkJCW5saW5lcyAgICAgCTkNCi0JCQltYXhfd2lkdGggIAk4MDUNCi0JCQlsYWJlbCAgICAgIAkNCi18QSBEVEQgYXR0cmlidXRlJ3MgdHlwZSBhbmQgaW5pdGlhbA0KLXx2YWx1ZSBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgdGhlIGVUeXBlIGFuZCBkZWZhdWx0IHZhbHVlIHN0b3JlZCBpbiBlQXR0cmlidXRlLiBUaGUgZVR5cGUgd2lsbCBhbHdheXMgYmUgZWl0aGVyIERUREJhc2ljVHlwZSAoc3ViY2xhc3Mgb2YgZUNsYXNzKSBvciBEVERFbnVtZXJhdGlvblR5cGUgKHN1YmNsYXNzIG9mIGVFbnVtKS4NCi0JCQkpDQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCSAgICB3aWR0aCAgICAgIAk4NjUNCi0JCSAgICBoZWlnaHQgICAgIAk0MDApDQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDEzNg0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBjbGllbnQgICAgIAlAMTMyDQotCQkgICAgc3VwcGxpZXIgICAJQDEzNQ0KLQkJICAgIGxpbmVfc3R5bGUgCTApDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQ2xhc3MiIEAxMzcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxMjY0LCAyNzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTM3DQotCQkJbG9jYXRpb24gICAJKDExODMsIDE5NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkxNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVDbGFzcyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzE3NQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDVCRjAwMEEiDQotCQkgICAgaGVpZ2h0ICAgICAJMTc0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFRW51bSIgQDEzOA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE5MDQsIDI3MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMzgNCi0JCQlsb2NhdGlvbiAgIAkoMTgyMywgMTk3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTE2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUVudW0iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcxNzUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlBNDczRTkwMUQ0Ig0KLQkJICAgIGhlaWdodCAgICAgCTE3NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTM5DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgcXVpZHUgICAgICAJIjM5QjdGMjgwMDMxNSINCi0JCSAgICBjbGllbnQgICAgIAlAMTMzDQotCQkgICAgc3VwcGxpZXIgICAJQDEzNw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyNjAsIDU3MikNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI2MCwgMzU5KSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0MA0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUI3RjI4MTAzMDIiDQotCQkgICAgY2xpZW50ICAgICAJQDEzNA0KLQkJICAgIHN1cHBsaWVyICAgCUAxMzgNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTAzLCA1NzIpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE5MDMsIDM1OSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQXR0cmlidXRlIiBAMTQxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTI4LCAyNzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTQxDQotCQkJbG9jYXRpb24gICAJKDQ0NywgMTk3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTE2Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRUF0dHJpYnV0ZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzE3NQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTIzODQ3MjAzOUQiDQotCQkgICAgaGVpZ2h0ICAgICAJMTc0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDINCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCN0YxNTkwMURBIg0KLQkJICAgIGNsaWVudCAgICAgCUAxMzINCi0JCSAgICBzdXBwbGllciAgIAlAMTQxDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTIwLCA1MjcpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDUyMCwgMzU5KSkpKSkpDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvcm9zZS9kdGRtb2RlbC5tZGwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9yb3NlL2R0ZG1vZGVsLm1kbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U1NjI3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9yb3NlL2R0ZG1vZGVsLm1kbAorKysgL2Rldi9udWxsCkBAIC0xLDc1MjYgKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk0NQ0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA3LjUuMDEwMy4xOTIwIg0KLSAgICBjaGFyU2V0ICAgIAkwKQ0KLQ0KLShvYmplY3QgRGVzaWduICJMb2dpY2FsIFZpZXciDQotICAgIGlzX3VuaXQgICAgCVRSVUUNCi0gICAgaXNfbG9hZGVkICAJVFJVRQ0KLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiSmF2YSINCi0JICAgIG5hbWUgICAgICAgCSJJREUiDQotCSAgICB2YWx1ZSAgICAgIAkiSW50ZXJuYWwgRWRpdG9yIikpDQotICAgIHF1aWQgICAgICAgCSIzRTM2QkVCNjAxMzMiDQotICAgIGRlZmF1bHRzICAgCShvYmplY3QgZGVmYXVsdHMNCi0JcmlnaHRNYXJnaW4gCTAuMjUwMDAwDQotCWxlZnRNYXJnaW4gCTAuMjUwMDAwDQotCXRvcE1hcmdpbiAgCTAuMjUwMDAwDQotCWJvdHRvbU1hcmdpbiAJMC41MDAwMDANCi0JcGFnZU92ZXJsYXAgCTAuMjUwMDAwDQotCWNsaXBJY29uTGFiZWxzIAlUUlVFDQotCWF1dG9SZXNpemUgCVRSVUUNCi0Jc25hcFRvR3JpZCAJVFJVRQ0KLQlncmlkWCAgICAgIAkxNg0KLQlncmlkWSAgICAgIAkxNg0KLQlkZWZhdWx0Rm9udCAJKG9iamVjdCBGb250DQotCSAgICBzaXplICAgICAgIAkxMA0KLQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JICAgIGNvbG9yICAgICAgCTANCi0JICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCXNob3dNZXNzYWdlTnVtIAkxDQotCXNob3dDbGFzc09mT2JqZWN0IAlUUlVFDQotCW5vdGF0aW9uICAgCSJVbmlmaWVkIikNCi0gICAgcm9vdF91c2VjYXNlX3BhY2thZ2UgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIlVzZSBDYXNlIFZpZXciDQotCXF1aWQgICAgICAgCSIzQTBDNzVGNDAxRjciDQotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiDQotCWdsb2JhbCAgICAgCVRSVUUNCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpDQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBVc2VDYXNlRGlhZ3JhbSAiTWFpbiINCi0JCXF1aWQgICAgICAgCSIzQTBDNzVGNDAyMEIiDQotCQl0aXRsZSAgICAgIAkiTWFpbiINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkNCi0gICAgcm9vdF9jYXRlZ29yeSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiTG9naWNhbCBWaWV3Ig0KLQlxdWlkICAgICAgIAkiM0EwQzc1RjQwMUY2Ig0KLQlleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQlnbG9iYWwgICAgIAlUUlVFDQotCXN1YnN5c3RlbSAgCSJDb21wb25lbnQgVmlldyINCi0JcXVpZHUgICAgICAJIjNBMEM3NUY0MDFGOCINCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImVjb3JlIg0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkVkFCQVNFX1BMVUdJTlNfUEFUSFxcb3JnLmVjbGlwc2UuZW1mLmVjb3JlXFxzcmNcXG1vZGVsXFxvcmcuZWNsaXBzZS5lbWYuRUNvcmUuY2F0Ig0KLQkJcXVpZCAgICAgICAJIjM5QTVFRDA0MDA0RSIpDQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJkdGQiDQotCQlpc191bml0ICAgIAlUUlVFDQotCQlpc19sb2FkZWQgIAlGQUxTRQ0KLQkJZmlsZV9uYW1lICAJIiRWQUJBU0VfUExVR0lOU19QQVRIXFxvcmcuZWNsaXBzZS53c3QuZHRkXFxzcmNcXHJvc2VcXERURC5jYXQiDQotCQlxdWlkICAgICAgIAkiMzg1N0IxQzAwMjkzIikpDQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIk1haW4iDQotCQlxdWlkICAgICAgIAkiM0EwQzc1RjQwMUZGIg0KLQkJdGl0bGUgICAgICAJIk1haW4iDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjplY29yZSIgQDENCi0JCQlsb2NhdGlvbiAgIAkoOTYwLCAzMDQpDQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkgICAgY29sb3IgICAgICAJMA0KLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJICAgIFBhcmVudF9WaWV3IAlAMQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoODE2LCAyMjApDQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJICAgIG5saW5lcyAgICAgCTINCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4DQotCQkJICAgIGp1c3RpZnkgICAgCTANCi0JCQkgICAgbGFiZWwgICAgICAJImVjb3JlIikNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiMzlBNUVEMDQwMDRFIg0KLQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkNCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpkdGQiIEAyDQotCQkJbG9jYXRpb24gICAJKDM2OCwgMjU2KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDINCi0JCQkgICAgbG9jYXRpb24gICAJKDIyNCwgMTcyKQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJkdGQiKQ0KLQkJCWljb25fc3R5bGUgCSJJY29uIg0KLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCXF1aWR1ICAgICAgCSIzODU3QjFDMDAyOTMiDQotCQkJd2lkdGggICAgICAJMzAwDQotCQkJaGVpZ2h0ICAgICAJMTgwKSkpKSkNCi0gICAgcm9vdF9zdWJzeXN0ZW0gCShvYmplY3QgU3ViU3lzdGVtICJDb21wb25lbnQgVmlldyINCi0JcXVpZCAgICAgICAJIjNBMEM3NUY0MDFGOCINCi0JcGh5c2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQ0KLQlwaHlzaWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IE1vZHVsZV9EaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjNBMEM3NUY0MDIwQSINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQ0KLSAgICBwcm9jZXNzX3N0cnVjdHVyZSAJKG9iamVjdCBQcm9jZXNzZXMNCi0JcXVpZCAgICAgICAJIjNBMEM3NUY0MDFGOSINCi0JUHJvY3NORGV2cyAJKGxpc3QNCi0JICAgIChvYmplY3QgUHJvY2Vzc19EaWFncmFtICJEZXBsb3ltZW50IFZpZXciDQotCQlxdWlkICAgICAgIAkiM0EwQzc1RjQwMUZCIg0KLQkJdGl0bGUgICAgICAJIkRlcGxveW1lbnQgVmlldyINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkNCi0gICAgcHJvcGVydGllcyAJKG9iamVjdCBQcm9wZXJ0aWVzDQotCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRERMIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRERMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRGF0YUJhc2UiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhQmFzZVNldCIgODAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRhdGFCYXNlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQkJbmFtZSAgICAgICAJIkFOU0kiDQotCQkJCXZhbHVlICAgICAgCTgwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQkJbmFtZSAgICAgICAJIk9yYWNsZSINCi0JCQkJdmFsdWUgICAgICAJODAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiU1FMU2VydmVyIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJTeWJhc2UiDQotCQkJCXZhbHVlICAgICAgCTgwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQkJbmFtZSAgICAgICAJIldhdGNvbSINCi0JCQkJdmFsdWUgICAgICAJODA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiSWQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1KSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiVl8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJUXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJJbmhlcml0U3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSJfViIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiQmFzZVZpZXdzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiQ29sdW1uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiVkFSQ0hBUiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJOdWxsc09LIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiQ29tcG9zaXRlVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRETCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJlc2VydmVSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdFNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJRExFbGVtZW50Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJRExTcGVjaWZpY2F0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIklETFNwZWNTZXQiIDIyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklETFNwZWNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiSW50ZXJmYWNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlR5cGVkZWYiDQotCQkJCXZhbHVlICAgICAgCTU0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiRW51bWVyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJNzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJFeGNlcHRpb24iDQotCQkJCXZhbHVlICAgICAgCTYxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiU3RydWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAk1MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlVuaW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk4MSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL29yZy5lY2xpcHNlLndzdC5kdGQvc3JjL3Jvc2UvZHRkbW9kZWwubWRsLCBvcmcuZWNsaXBzZS53c3QuZHRkLCB3dHBNMSwgMjAwNDExMjIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUlETE1vZHVsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuZHRkL3NyYy9yb3NlL2R0ZG1vZGVsLm1kbCwgb3JnLmVjbGlwc2Uud3N0LmR0ZCwgd3RwTTEsIDIwMDQxMTIyIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIlJhaXNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEhhc1JlbFR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJIYXNSZWxUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlNDQyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImVDb3JlIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiZUNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiZUNvcmUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVnZW4gTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJlQ29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiZUNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImVDb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImVDb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJlQ29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImVDb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJlQ29yZSINCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJlQ29yZSINCi0JCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJSb290UGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiQysrIFJldmVyc2UgRW5naW5lZXJlZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsSGVhZGVySW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEJvZHlJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkhlYWRlclNvdXJjZUZpbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5U291cmNlRmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIklzTmFtZXNwYWNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFOU0kgQysrIEV2ZW50IFdhdGNoZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBTlNJQ29udmVydCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODM4MzI2MjAwIikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWRhIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWR+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWQjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWRhIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWR+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWQjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQm9kaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiW3N0YXRlbWVudF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJVc2VGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUFEQTgzX1NPVVJDRSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc05hbWUiDQotCQkJdmFsdWUgICAgICAJIk9iamVjdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzQWNjZXNzIg0KLQkJCXZhbHVlICAgICAgCSgiSW1wbGVtZW50YXRpb25TZXQiIDQzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNTdWJ0eXBlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJQb2x5bW9ycGhpY1VuaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkhhbmRsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkhhbmRsZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkhhbmRsZUFjY2VzcyINCi0JCQl2YWx1ZSAgICAgIAkoIkltcGxlbWVudGF0aW9uU2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRW51bWVyYXRpb25MaXRlcmFsUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJBXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJUaGVfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJUaGlzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnN0cnVjdG9yS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiQ29uc3RydWN0b3JLaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDb3B5IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRnJlZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzRXF1YWxpdHlPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkhhbmRsZUVxdWFsaXR5T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNUYXNrIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkxpbWl0ZWRQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzU3VidW5pdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZW5hbWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhcmFtZXRlck1vZGUiDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSIke2RlZmF1bHR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJTcGVjIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkJvZHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlNlcGFyYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkluIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIk91dCINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJJbk91dCINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvblJldHVybiINCi0JCQkJdmFsdWUgICAgICAJMjA2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHtzdXBwbGllcn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyINCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHthdHRyaWJ1dGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJWYXJpYW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXNzb2NpYXRpb259IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHthc3NvY2lhdGlvbn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NpYXRlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEaXNzb2NpYXRlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRGlzc29jaWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZURpc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7dGFyZ2V0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7dGFyZ2V0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiDQotCQkJdmFsdWUgICAgICAJIkxpc3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MzgzMjYyMDAiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZGEiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMS5hZCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZGEiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMi5hZCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVXNlQ29sb25Ob3RhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUJvZGllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29kZUJvZHkiDQotCQkJdmFsdWUgICAgICAJIltzdGF0ZW1lbnRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIg0KLQkJCXZhbHVlICAgICAgCTYwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVXNlRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VBREE5NV9TT1VSQ0UiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIk9iamVjdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVHlwZVZpc2liaWxpdHlTZXQiIDQzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiVHlwZUltcGxlbWVudGF0aW9uU2V0IiAyMDgpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbCINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVDb250cm9sU2V0IiAyMjUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNvbnRyb2xsZWRfJHt0eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVEZWZpbml0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRJbXBsZW1lbnRhdGlvblNldCIgMjA5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkS2luZFBhY2thZ2VOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke2NsYXNzfV9SZWNvcmRfS2luZHMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0xpbWl0ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzU3VidHlwZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVBY2Nlc3NUeXBlU2V0IiAyMzApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiSGFuZGxlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlRGVmaW5pdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0NsYXNzV2lkZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJNYXliZUFsaWFzZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvblNldCIgMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnRDbGFzc05hbWUiDQotCQkJdmFsdWUgICAgICAJIlN1cGVyY2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbkxpdGVyYWxQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIkFfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIlRoZV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBcnJheU9mVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFycmF5X09mXyR7dHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NBcnJheU9mVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFjY2Vzc19BcnJheV9PZl8ke3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlPZkFjY2Vzc1R5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBcnJheV9PZl8ke2FjY2Vzc190eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0FycmF5T2ZBY2Nlc3NUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQWNjZXNzX0FycmF5X09mXyR7YWNjZXNzX3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlJbmRleERlZmluaXRpb24iDQotCQkJdmFsdWUgICAgICAJIlBvc2l0aXZlIHJhbmdlIDw+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJUaGlzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDb3B5IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRnJlZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlVHlwZUVxdWFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlRXF1YWxpdHlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3F1b3RlfT0ke3F1b3RlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlRhZ2dlZCINCi0JCQkJdmFsdWUgICAgICAJMjA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJSZWNvcmQiDQotCQkJCXZhbHVlICAgICAgCTIxMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiTWl4aW4iDQotCQkJCXZhbHVlICAgICAgCTIxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiVGFzayINCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVHlwZSINCi0JCQkJdmFsdWUgICAgICAJMjA5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJNdWx0aXBsZVR5cGVzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyINCi0JCQkJdmFsdWUgICAgICAJMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlVuY29uc3RyYWluZWQiDQotCQkJCXZhbHVlICAgICAgCTIxNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2xTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkluaXRpYWxpemF0aW9uT25seSINCi0JCQkJdmFsdWUgICAgICAJMjI2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50RmluYWxpemF0aW9uT25seSINCi0JCQkJdmFsdWUgICAgICAJMjI3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTIyOCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBbHdheXMiDQotCQkJCXZhbHVlICAgICAgCTIyOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQXV0byINCi0JCQkJdmFsdWUgICAgICAJMjMwKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsUGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzUHJpdmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzU3VidW5pdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZW5hbWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRpbmciDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJNb2RlIg0KLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJDbGFzc1dpZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSIke2RlZmF1bHR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRW50cnlCYXJyaWVyQ29uZGl0aW9uIg0KLQkJCXZhbHVlICAgICAgCSJUcnVlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJTcGVjIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkJvZHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nQXNCb2R5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMzEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlNlcGFyYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkluIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk91dCINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJJbk91dCINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3MiDQotCQkJCXZhbHVlICAgICAgCTIyMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7c3VwcGxpZXJ9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHtyZWxhdGlvbnNoaXB9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IiAyMTcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIg0KLQkJCXZhbHVlICAgICAgCSJMaXN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiDQotCQkJCXZhbHVlICAgICAgCTIxNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTIxNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyINCi0JCQkJdmFsdWUgICAgICAJMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2F0dHJpYnV0ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCINCi0JCQkJdmFsdWUgICAgICAJMjE2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXNzb2NpYXRpb259IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRpc3NvY2lhdGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJEaXNzb2NpYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGlzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiIDIxNykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiDQotCQkJdmFsdWUgICAgICAJIkxpc3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiDQotCQkJCXZhbHVlICAgICAgCTIxNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTIxNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyINCi0JCQkJdmFsdWUgICAgICAJMTEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvciINCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiDQotCQkJCXZhbHVlICAgICAgCTEwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuZHRkL3NyYy9yb3NlL2R0ZG1vZGVsLm1kbCwgb3JnLmVjbGlwc2Uud3N0LmR0ZCwgd3RwTTEsIDIwMDQxMTIyIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL29yZy5lY2xpcHNlLndzdC5kdGQvc3JjL3Jvc2UvZHRkbW9kZWwubWRsLCBvcmcuZWNsaXBzZS53c3QuZHRkLCB3dHBNMSwgMjAwNDExMjIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDb250ZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc09uZVdheSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJInByb2plY3QiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlZpZXdDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEb21haW5Db3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTUFBhY2thZ2VDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSW5kZXhDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU3RvcmVQcm9jZWR1cmVDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRm9yZWlnbktleUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkpvaW5Db3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiY09OVEFJTkVSQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJWaWV3UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRG9tYWluUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkluZGV4UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlN0b3JlUHJvY2VkdXJlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvcmVpZ25LZXlQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGF0YWJhc2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYXJnZXREYXRhYmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkxvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNUYWJsZVNwYWNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0RlYXVsdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkJ1ZmZlclBvb2wiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJFeHRlbnRTaXplIg0KLQkJCXZhbHVlICAgICAgCTEpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQcmVmZXRjaFNpemUiDQotCQkJdmFsdWUgICAgICAJMSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhZ2VTaXplIg0KLQkJCXZhbHVlICAgICAgCTQpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJNYW5hZ2VkQnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJMaXN0Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtU2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1Eb21haW5QYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0RvbWFpblBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1Jvb3RTY2hlbWEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1Jvb3REb21haW5QYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWFQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGF0YWJhc2VJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRCTVMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNUYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVmlldyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRG9tYWluIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNTUFBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTeW5vbnltbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb3JyZWxhdGlvbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0ZWFibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrT3B0aW9uIg0KLQkJCXZhbHVlICAgICAgCSJOb25lIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU25hcFNob3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0Rpc3RpbmN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGVyc2lzdFRvU2VydmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJPcmRpbmFsIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0lkZW50aXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJOYXRpdmUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJPSUQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNSZWxhdGlvbnNoaXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSSU1ldGhvZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudFVwZGF0ZVJ1bGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnRVcGRhdGVSdWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmVudERlbGV0ZVJ1bGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnREZWxldGVSdWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGlsZEluc2VydFJlc3RyaWN0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoaWxkTXVsdGlwbGljaXR5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNJbmRleCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVHJpZ2dlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU3RvcmVkUHJvY2VkdXJlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNDbHVzdGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZpbGxGYWN0b3IiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIktleUxpc3QiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGVja1ByZWRpY2F0ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmZXJhbE1vZGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ2hlY2tUaW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0luc2VydEV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNVcGRhdGVFdmVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGVsZXRlRXZlbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZWZPbGRUYWJsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJlZk5ld1RhYmxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmVmT2xkUm93Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmVmTmV3Um93Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNSb3ciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJXaGVuQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTGFuZ3VhZ2UiDQotCQkJdmFsdWUgICAgICAJIlNRTCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiUHJvY2VkdXJlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzRGV0ZXJtaW5pc3RpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlclN0eWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmV0dXJuZWROdWxsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRXh0ZXJuYWxOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW1ldGVyIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNJblBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNPdXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJPcmRpbmFsIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklEIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciBDb21tdW5pY2F0b3IiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJmcmFtZXdvcmsiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJvb3REaXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlUHJlZml4ZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQXV0b1N5bmMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTm90U2hvd1Jvc2VJRERsZyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTaG93Q29kZWdlbkRsZyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVJvc2VJRCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdFJldHVybkxpbmUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdEF1dGhvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRTaW5jZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTEiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDEiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jTnVtQXN0ZXJpc2tzIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWF4TnVtQ2hhcnMiDQotCQkJdmFsdWUgICAgICAJODApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWTSINCi0JCQl2YWx1ZSAgICAgIAkoIlZNVHlwZSIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhdGgiDQotCQkJdmFsdWUgICAgICAJIi47QzpcXElCTVxcU1FMTElCXFxqYXZhXFxkYjJqYXZhLnppcDtDOlxcSUJNXFxTUUxMSUJcXGphdmFcXGRiMmpjYy5qYXI7QzpcXElCTVxcU1FMTElCXFxqYXZhXFxzcWxqLnppcDtDOlxcSUJNXFxTUUxMSUJcXGJpbjtDOlxcSUJNXFxTUUxMSUJcXGphdmFcXGNvbW1vbi5qYXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlZmVyZW5jZUNsYXNzcGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWTVR5cGUiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN1biINCi0JCQkJdmFsdWUgICAgICAJMjAwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVkFKYXZhV29ya2luZ0ZvbGRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZVZhcmlhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzVmFyaWFibGVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEF0dHJpYnV0ZURhdGFUeXBlIg0KLQkJCXZhbHVlICAgICAgCSJpbnQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRPcGVyYXRpb25SZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJ2b2lkIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJOb0NsYXNzQ3VzdG9tRGxnIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdsb2JhbEltcG9ydHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZUNsYXNzU3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VNZXRob2RTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlU3BhY2VzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3BhY2luZ0l0ZW1zIg0KLQkJCXZhbHVlICAgICAgCTMpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUm9zZURlZmF1bHRDb21tZW50U3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBc3Rlcmlza0NvbW1lbnRTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFDb21tZW50U3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jQXV0aG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NTaW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5TdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVtb3RlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlbW90ZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJIb21lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkhvbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5U3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkRURExvY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREVERMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0RUpCVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0U2VydmxldFZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIg0KLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk2MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTYzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTY0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiDQotCQkJCXZhbHVlICAgICAgCTY1KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJIdHRwX1NlcnZsZXRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X0VKQl9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIxMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQmVhbiINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciINCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25TeW5jIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiMi4wIg0KLQkJCQl2YWx1ZSAgICAgIAkyMzApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiMS54Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJOYXRpdmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemVkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRSZXR1cm4iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVwbGFjZUV4aXN0aW5nQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlRyYW5zaWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJCZWFuUHJvcGVydHlfU2V0IiA3MSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQmVhblByb3BlcnR5X1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiTm90IEEgUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTcxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSINCi0JCQkJdmFsdWUgICAgICAJNzIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQm91bmQiDQotCQkJCXZhbHVlICAgICAgCTczKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbmVkIg0KLQkJCQl2YWx1ZSAgICAgIAk3NCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgJiBXcml0ZSINCi0JCQkJdmFsdWUgICAgICAJODEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCBPbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAk4MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJXcml0ZSBPbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAk4MykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkZpbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlRyYW5zaWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJCZWFuUHJvcGVydHlfU2V0IiA3MSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQmVhblByb3BlcnR5X1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiTm90IEEgUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTcxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSINCi0JCQkJdmFsdWUgICAgICAJNzIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQm91bmQiDQotCQkJCXZhbHVlICAgICAgCTczKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbmVkIg0KLQkJCQl2YWx1ZSAgICAgIAk3NCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgJiBXcml0ZSINCi0JCQkJdmFsdWUgICAgICAJODEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiUmVhZCBPbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAk4MikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJXcml0ZSBPbmx5Ig0KLQkJCQl2YWx1ZSAgICAgIAk4MykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJc05hdmlnYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiMzYwMDAwMDAyIikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkRETFNjcmlwdEZpbGVuYW1lIg0KLQkJCXZhbHVlICAgICAgCSJEREwxLlNRTCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiRHJvcENsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiX0lEIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiTlVNQkVSKDUsMCkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9JRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJXaGVyZUNsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVQcmVjaXNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVTY2FsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uT2ZSRUZTIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJNZXRob2RLaW5kU2V0IiAxOTAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPdmVybG9hZElEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE5vRGF0YVN0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE5vUHJvY2Vzc1N0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb0RhdGFTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9Qcm9jZXNzU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNTZWxmaXNoIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlclR5cGVTZXQiIDE4MDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudCINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJFdmVudFNldCIgMTYwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclJlZmVyZW5jaW5nTmFtZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2giDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRm9yRWFjaFNldCIgMTcwMSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlcldoZW5DbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiTWFwTWV0aG9kIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk9yZGVyTWV0aG9kIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMTkwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJPcGVyYXRvciINCi0JCQkJdmFsdWUgICAgICAJMTkwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvciINCi0JCQkJdmFsdWUgICAgICAJMTkwNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlRyaWdnZXIiDQotCQkJCXZhbHVlICAgICAgCTE5MDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQ2FsY3VsYXRlZCINCi0JCQkJdmFsdWUgICAgICAJMTkwOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJBRlRFUiINCi0JCQkJdmFsdWUgICAgICAJMTgwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJCRUZPUkUiDQotCQkJCXZhbHVlICAgICAgCTE4MDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TVEVBRCBPRiINCi0JCQkJdmFsdWUgICAgICAJMTgwMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJST1ciDQotCQkJCXZhbHVlICAgICAgCTE3MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiU1RBVEVNRU5UIg0KLQkJCQl2YWx1ZSAgICAgIAkxNzAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQiDQotCQkJCXZhbHVlICAgICAgCTE2MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiVVBEQVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkRFTEVURSINCi0JCQkJdmFsdWUgICAgICAJMTYwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiVVBEQVRFIE9SIERFTEVURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIE9SIERFTEVURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiUHJlY2lzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2FsZSINCi0JCQl2YWx1ZSAgICAgIAkiNiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNJbmRleCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1ByaW1hcnlLZXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ29tcG9zaXRlVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ29tcG9uZW50VGVzdCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVXNlTVNWQyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImh+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcCMiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiDQotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiY29tcGlsZXIyLjFfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJofiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJpbnQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPbmVCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpLCRsaW1pdCkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcyksJGxpbWl0KSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZSgkbGltaXQpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2UoJGxpbWl0KSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcykpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVJlZmVyZW5jZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWUoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5UmVmZXJlbmNlKHNpemVvZigkcXVhbHR5cGUpLCBzaXplb2YoJHF1YWxjb250KSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlKHNpemVvZigkcXVhbHR5cGUpLCBzaXplb2YoJHF1YWxjb250KSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiY29tcGlsZXIzLjBfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJofiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJpbnQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NLZXkiDQotCQkJdmFsdWUgICAgICAJImNsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQdXRCb2RpZXNJblNwZWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXREZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3RvclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXRDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVzdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvcktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzaWdubWVudE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc2lnbm1lbnRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXF1YWxpdHlPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHlPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVJlbGF0aW9uYWxPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVSZWxhdGlvbmFsT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3JhZ2VNZ210VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3RvcmFnZU1nbXRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN1YnNjcmlwdE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0VmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0S2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0UmVzdWx0VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3Vic2NyaXB0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlcmVmZXJlbmNlT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VSZXN1bHRUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXJlZmVyZW5jZU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmRpcmVjdGlvbk9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25WaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvbktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uUmVzdWx0VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lSW5kaXJlY3Rpb25PcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RyZWFtT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3RyZWFtVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3RyZWFtT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVGhyZWVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRnJpZW5kS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZUFuZERlZmluZSINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlT25seSINCi0JCQkJdmFsdWUgICAgICAJMjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJEb05vdERlY2xhcmUiDQotCQkJCXZhbHVlICAgICAgCTIwNikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmR0ZC9zcmMvcm9zZS9kdGRtb2RlbC5tZGwsIG9yZy5lY2xpcHNlLndzdC5kdGQsIHd0cE0xLCAyMDA0MTEyMiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCANCi18Ly8gJHBhY2thZ2UNCi18I2luY2x1ZGUgIiRmaWxlIg0KLXwNCi0JCQkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwNykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuZHRkL3NyYy9yb3NlL2R0ZG1vZGVsLm1kbCwgb3JnLmVjbGlwc2Uud3N0LmR0ZCwgd3RwTTEsIDIwMDQxMTIyIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVGb3JtYXQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgDQotfC8vICRwYWNrYWdlDQotfCNpbmNsdWRlICIkZmlsZSINCi18DQotCQkJKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVByZWNvbXBpbGVkSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiDQotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iDQotCQkJCXZhbHVlICAgICAgCTIwNykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIk9wZXJhdGlvbktpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBYnN0cmFjdEJvZHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnJpZW5kQm9keSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGcmllbmREZWNsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTcGVjaWFsRGVjbFJldHVyblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzRXhwbGljaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDQ1JlZ2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5QW5ub3RhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3JkZXJlZCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHJlbGF0aW9uc2hpcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVHJ1ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXJyYXkiDQotCQkJCXZhbHVlICAgICAgCTI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZUFyZ3VtZW50cyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2V0Ig0KLQkJCXZhbHVlICAgICAgCSIkZGF0YS5nZXQoJGtleXMpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyU2V0Ig0KLQkJCXZhbHVlICAgICAgCSIkZGF0YS5zZXQoJGtleXMsJHZhbHVlKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZENvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0NvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHN1cHBsaWVyICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVHJ1ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAkoIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVHJ1ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19HZXRTZXRCeVJlZmVyZW5jZSINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZEdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRTZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZFNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0ZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkYXR0cmlidXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0QXR0cmlidXRlVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjExKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kYXR0cmlidXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRhdHRyaWJ1dGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJUcnVlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ0NSZWdpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkJvZHlSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5SXNPblNlYXJjaExpc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlByZWNvbXBpbGVkSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kZW50Ig0KLQkJCXZhbHVlICAgICAgCTIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSI1LjAiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNDbGFzc1R5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNDbGFzc1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJJbnRlcmZhY2VfUGFydCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uX1BhcnQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQ2xhc3NfRmFjdG9yeSINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkR5bmFtaWMiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRHluY3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlNlcmlhbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGVHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfREFUQV9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpZWxkR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0ZJRUxEX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZUdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSgiT0xFRmFjdG9yeVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJCdWlsdF9pbiINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTGljZW5zZWQiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUNsYXNzSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVDdGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUN0bFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVUeXBlTGliIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWFqb3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1pbm9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcFBhZ2VJRHMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFUHJvcFBhZ2VJRHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcGF0Y2hNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydGllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tGdW5jdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoRGVmVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwSWRFbnVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQX0lEX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW50ZXJmYWNlTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIklOVEVSRkFDRV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiSW5pdEludGVyZmFjZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50TWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja0V2ZW50cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudFNpbmtNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlByb3BOb3RpZnlTaW5rcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25Qb2ludElJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJJbmhlcml0YW5jZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFQ29tbWFuZHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1GQ0RlY2xhcmVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRkNJbXBsZW1lbnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBVExfRGVjbGFyZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ09NTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPTV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uUG9pbnRNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9QT0lOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNc2dNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTVNHX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BlcnR5TWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBST1BFUlRZX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ09wZXJhdGlvblR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNPcGVyYXRpb25UeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbF9PdmVycmlkZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNZXNzYWdlX0hhbmRsZXIiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlzcGF0Y2hfSGFuZGxlciINCi0JCQkJdmFsdWUgICAgICAJMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJFdmVudF9GaXJpbmdfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRXZlbnRfU2lua19IYW5kbGVyIg0KLQkJCQl2YWx1ZSAgICAgIAk1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlN0ZF9PTEVfTWV0aG9kIg0KLQkJCQl2YWx1ZSAgICAgIAk2KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1hbmRfUGFyc2VyIg0KLQkJCQl2YWx1ZSAgICAgIAk3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X0dldF9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9TZXRfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfTm90aWZ5X0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJNYWNyb19HZW5lcmF0ZWRfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTExKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5SW1hZ2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSINCi0JCQkJdmFsdWUgICAgICAJNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJNSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlJvc2UgTW9kZWwgSW50ZWdyYXRvciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlJvc2UgV2ViIFB1Ymxpc2hlciINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlRvcExpbmsiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJUeXBlS2luZHMiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiZW51bSINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkicmVjb3JkIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJtb2R1bGUiDQotCQkJCXZhbHVlICAgICAgCTEwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImludGVyZmFjZSINCi0JCQkJdmFsdWUgICAgICAJMTAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiZGlzcGludGVyZmFjZSINCi0JCQkJdmFsdWUgICAgICAJMTA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiY29jbGFzcyINCi0JCQkJdmFsdWUgICAgICAJMTA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkiYWxpYXMiDQotCQkJCXZhbHVlICAgICAgCTEwNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJInVuaW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJtYXgiDQotCQkJCXZhbHVlICAgICAgCTEwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJIihub25lKSINCi0JCQkJdmFsdWUgICAgICAJMTA5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkia2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVLaW5kcyIgMTA5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJInV1aWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJ2ZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBjb250ZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImRsbG5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhbGlhcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJmaWxlbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImxpYnJhcnkiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkidmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwZmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBjb250ZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkibGNpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWZXJzaW9uIENvbnRyb2wiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVNb2RlbCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2luZ1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWNOb3RDcmVhdGFibGUiDQotCQkJCXZhbHVlICAgICAgCTIxMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiR2xvYmFsU2luZ2xlVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJNdWx0aVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiR2xvYmFsTXVsdGlVc2UiDQotCQkJCXZhbHVlICAgICAgCTIyMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQmFzZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiDQotCQkJCXZhbHVlICAgICAgCTIyMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIjAiDQotCQkJCXZhbHVlICAgICAgCTIyMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIjEiDQotCQkJCXZhbHVlICAgICAgCTIyNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkoIkJhc2VTZXQiIDIyMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25FeHBsaWNpdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQ29tcGFyZSINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbXBhcmVTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jaW5nIg0KLQkJCXZhbHVlICAgICAgCSgiSW5zdGFuY2luZ1NldCIgMjE5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkNvbXBhcmVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJCaW5hcnkiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIlRleHQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJMaWJyYXJ5TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkFsaWFzTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIklzU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJSZXBsYWNlRXhpc3RpbmdCb2R5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEJvZHkiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJOZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRnVsbE5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudHNEZWxlZ2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJGdWxsTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJCeVZhbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkJ5UmVmIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQYXJhbUFycmF5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2plY3RGaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlTW9kZWwiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkltcG9ydFJlZmVyZW5jZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlF1aWNrSW1wb3J0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbXBvcnRCaW5hcnkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsU3R1ZGlvIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiV2ViIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvciINCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkVudGl0eV9TeXN0ZW1JRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFbnRpdHlfUHVibGljSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25WYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJJbnRlcm5hbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlckVudGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFeHRlcm5hbEVudGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvbl9TeXN0ZW1JRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvbl9QdWJsaWNJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0RGVjbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJBc3NpZ24gQWxsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudFBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkibnNQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zVVJJIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJjbGFzc2lmaWVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm9wZXJhdGlvbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNJRCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJyZWZlcmVuY2VOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpKQ0KLQlxdWlkICAgICAgIAkiM0EwQzc1RjQwMUZBIikpDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9EVERGaWxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvRFRERmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZWU1MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9EVERGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYW55LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYW55LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAxN2Q5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2FueS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYmI3YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGVfbGlzdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZV9saXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk1ZWI1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZV9saXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvY29tbWVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2NvbW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGMyY2NiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvY29tbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VsZW1lbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmNDg4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50X3JlZi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VsZW1lbnRfcmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ5YWNmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VsZW1lbnRfcmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZW1wdHljb250ZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZW1wdHljb250ZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM4ZTY2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VtcHR5Y29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VudGl0eS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOTE4ODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHlfcmVmZXJlbmNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5X3JlZmVyZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMGIyNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHlfcmVmZXJlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9lbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDFjMTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9lbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmIyY2E3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX25vdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfbm90LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwOTY2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfbm90LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl91bnJlYy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfdW5yZWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmQ4MmU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl91bnJlYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZvbGRlcl9hdHRsaXN0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZvbGRlcl9hdHRsaXN0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NDljNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mb2xkZXJfYXR0bGlzdF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mb2xkZXJfY29tbWVudHNfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZm9sZGVyX2NvbW1lbnRzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZjA5NDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mb2xkZXJfY29tbWVudHNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZ2VuaHRtZm9ybV93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9nZW5odG1mb3JtX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNTQ3MDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9nZW5odG1mb3JtX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L25vdGF0aW9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvbm90YXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTlkZjk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvbm90YXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTRjMjZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lY2hvaWNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lY2hvaWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzYmEyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZWNob2ljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZW9ybW9yZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZW9ybW9yZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMmIzNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmVjaG9pY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmVjaG9pY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjM5OGMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3JlY2hvaWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3Jlc2VxdWVuY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmVzZXF1ZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MWRiMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmVzZXF1ZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZXNlcXVlbmNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lc2VxdWVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjk2NThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lc2VxdWVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29wdGlvbmFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0MjJkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29wdGlvbmFsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWxjaG9pY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbGNob2ljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNGY5YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbGNob2ljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29wdGlvbmFsc2VxdWVuY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbHNlcXVlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhkNTI4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29wdGlvbmFsc2VxdWVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi90eHRleHQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi90eHRleHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmE3YTM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvdHh0ZXh0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvdW5yZWNvZ25pemVkX2NvbnRlbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi91bnJlY29nbml6ZWRfY29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ODk5N2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi91bnJlY29nbml6ZWRfY29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3JlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFmNTE0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3JlY2hvaWNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZWNob2ljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYWMxMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3JlY2hvaWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZXNlcXVlbmNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZXNlcXVlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVkNGNiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmVzZXF1ZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzc0MGQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVN0cnVjdHVyZWQgU291cmNlIERURCBDb3JlCi0jCi1TdHJ1Y3R1cmVkX0RURF9Eb2N1bWVudF9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lPVN0cnVjdHVyZWQgRFREIERvY3VtZW50IEZhY3RvcnkgRXh0ZW5zaW9uCi1EVERfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9RFRECi1fRFREX1ZBTElEQVRPUl9OQU1FICAgICAgICAgICAgICAgPSBEVEQgVmFsaWRhdG9yCi1fdmFsaWRhdGlvbk1hcmtlci5uYW1lPURURCBQcm9ibGVtCi1fdGFza01hcmtlci5uYW1lPURURCBUYXNrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYjQ2MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbEhhbmRsZXIiPgotCQk8bW9kZWxIYW5kbGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JEVEQiCi0JCQlhc3NvY2lhdGVkQ29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyIj4KLQkJPC9tb2RlbEhhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGFza3NjYW5uZXIiPgotCQk8c2Nhbm5lcgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50YXNrcy5EVERGaWxlVGFza1NjYW5uZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRhc2tzLkRUREZpbGVUYXNrU2Nhbm5lcjpvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudGFza01hcmtlciIKLQkJCWNvbnRlbnRUeXBlSWRzPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJaWQ9InRhc2tNYXJrZXIiCi0JCW5hbWU9IiVfdGFza01hcmtlci5uYW1lIgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0JCTxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy50YXNrbWFya2VyIi8+Ci0JCTxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+Ci0JPC9leHRlbnNpb24+Ci0gICAgPGV4dGVuc2lvbgotICAgICAgIGlkPSJ2YWxpZGF0aW9uTWFya2VyIgotICAgICAgICBuYW1lPSIlX3ZhbGlkYXRpb25NYXJrZXIubmFtZSIKLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgotICAgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnByb2JsZW1tYXJrZXIiLz4KLSAgICAgIDxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+Ci0gICAgPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmRvY3VtZW50Q3JlYXRpb24iCi0JCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZG9jdW1lbnRmYWN0b3JpZXMiCi0JCW5hbWU9IiVTdHJ1Y3R1cmVkX0RURF9Eb2N1bWVudF9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lIj4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZpbGVidWZmZXJzLkJhc2ljU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5maWxlVHlwZXMiPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJkdGQiIC8+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249Im1vZCIgLz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0iZW50IiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyI+Ci0JCTxjb250ZW50LXR5cGUKLQkJCWZpbGUtZXh0ZW5zaW9ucz0iZHRkLG1vZCxlbnQiCi0JCQlwcmlvcml0eT0ibm9ybWFsIgotCQkJbmFtZT0iJURURF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWlkPSJkdGRzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS50ZXh0IgotCQkJZGVmYXVsdC1jaGFyc2V0PSJVVEYtOCI+Ci0JCQk8ZGVzY3JpYmVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5jb250ZW50LkNvbnRlbnREZXNjcmliZXJGb3JEVEQiIC8+Ci0JCTwvY29udGVudC10eXBlPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmV4dGVuc2lvbl9wYXJzZXIiPgotCQk8cGFyc2VyCi0JCQl0eXBlPSJkdGQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFJlc291cmNlRmFjdG9yeUltcGwiPgotCQk8L3BhcnNlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5leHRlbnNpb25fcGFyc2VyIj4KLQkJPHBhcnNlcgotCQkJdHlwZT0iZW50IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERSZXNvdXJjZUZhY3RvcnlJbXBsIj4KLQkJPC9wYXJzZXI+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotCQk8cGFja2FnZQotCQkJdXJpPSJEVEQueG1pIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbC5EVERQYWNrYWdlSW1wbCI+Ci0JCTwvcGFja2FnZT4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudEZhY3RvcmllcyI+Ci0JCTxmYWN0b3J5Ci0JCQl0eXBlPSJkdGQsIGVudCwgbW9kLCB4bWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50RmFjdG9yeURURCI+Ci0JCTwvZmFjdG9yeT4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gaW5pdGlhbGl6ZSBkdGQgY29yZSBwcmVmZXJlbmNlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREQ29yZVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFJlZ2lzdGVyIHRoZSBEVEQgdmFsaWRhdG9yIHdpdGggdGhlIChuZXcpIHZhbGlkYXRpb24gICAtLT4KLQk8IS0tIGZyYW1ld29yay4gCQkJCQkJCQkJCSAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24gaWQ9ImR0ZERURFZhbGlkYXRvciIgbmFtZT0iJV9EVERfVkFMSURBVE9SX05BTUUiIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JWMiI+Ci0gICAgICA8dmFsaWRhdG9yCi0gICAgICAgICAgICBidWlsZD0idHJ1ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlZhbGlkYXRvciIKLSAgICAgICAgICAgIG1hbnVhbD0idHJ1ZSIKLSAgICAgICAgICAgIHNvdXJjZWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmR0ZHNvdXJjZXZhbGlkYXRvciIKLSAgICAgICAgICAgIHZlcnNpb249IjEiCi0gICAgICAgICAgICBtYXJrZXJJZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnZhbGlkYXRpb25NYXJrZXIiPgotICAgICAgICAgPGluY2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0gICAgICAgICAgICAgICA8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0IGNhc2VTZW5zaXRpdmU9ImZhbHNlIiBleHQ9ImR0ZCIvPgotICAgICAgICAgICAgICAgPGZpbGVleHQgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiIGV4dD0iZW50Ii8+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dCBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIgZXh0PSJtb2QiLz4KLSAgICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBEVEQgYXMgeW91IHR5cGUgdmFsaWRhdGlvbgkJCQkJCQkJLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uIj4KLQkJPHZhbGlkYXRvcgotCQkJc2NvcGU9InRvdGFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuZHRkc291cmNldmFsaWRhdG9yIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuREVGQVVMVCI+Ci0JCQkJPC9wYXJ0aXRpb25UeXBlPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCTwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9BdHROb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9BdHROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNzUzNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQXR0Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQXR0Tm9kZSB7Ci0JLy8KLQkvLyBhdHRUeXBlCi0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDREFUQSA9IDAsIElEID0gMSwgSURSRUYgPSAyLCBJRFJFRlMgPSAzLCBFTlRJVFkgPSA0LCBFTlRJVElFUyA9IDUsIE5NVE9LRU4gPSA2LCBOTVRPS0VOUyA9IDcsIE5PVEFUSU9OID0gOCwgRU5VTUVSQVRJT04gPSA5LCBQRVJFRkVSRU5DRSA9IDEwOwotCi0JLy8KLQkvLyBLZWVwIHRoaXMgYXJyYXkgaW4tc3luYyB3aXRoIHRoZSBBVFRUWVBFIGRlZmluaXRpb25zCi0JLy8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBmZ0F0dFR5cGVTdHJpbmcgPSB7IkNEQVRBIiwgLy8gMCAvLyROT04tTkxTLTEkCi0JCQkJIklEIiwgLy8gMSAvLyROT04tTkxTLTEkCi0JCQkJIklEUkVGIiwgLy8gMiAvLyROT04tTkxTLTEkCi0JCQkJIklEUkVGUyIsIC8vIDMgLy8kTk9OLU5MUy0xJAotCQkJCSJFTlRJVFkiLCAvLyA0IC8vJE5PTi1OTFMtMSQKLQkJCQkiRU5USVRJRVMiLCAvLyA1IC8vJE5PTi1OTFMtMSQKLQkJCQkiTk1UT0tFTiIsIC8vIDYgLy8kTk9OLU5MUy0xJAotCQkJCSJOTVRPS0VOUyIsIC8vIDcgLy8kTk9OLU5MUy0xJAotCQkJCSJOT1RBVElPTiIsIC8vIDggLy8kTk9OLU5MUy0xJAotCQkJCSJFTlVNRVJBVElPTiIsIC8vIDkgKHJlcGxhY2VkIHdpdGggIk5NVE9LRU4iIGJ5IFNBWCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCS8vIEF0dHJpYnV0ZUxpc3QgaGFuZGxlcikKLQkJCQkiJUVOVElUWVJFRkVSRU5DRTsifTsgLy8kTk9OLU5MUy0xJAotCi0JLy8KLQkvLyBhdHREZWZhdWx0VHlwZQotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9GSVhFRCA9IDEsIC8vIEF0dFZhbHVlCi0JCQkJUkVRVUlSRUQgPSAyLCAvLyAjUkVRVUlSRUQKLQkJCQlJTVBMSUVEID0gMywgLy8gI0lNUExJRUQKLQkJCQlGSVhFRCA9IDQ7IC8vICNGSVhFRCBBdHRWYWx1ZQotCi0JcHVibGljIFN0cmluZyBuYW1lID0gbnVsbDsKLQlwdWJsaWMgU3RyaW5nIHR5cGUgPSBudWxsOwotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFR5cGUgPSBudWxsOwotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFZhbHVlID0gbnVsbDsKLQlwdWJsaWMgVmVjdG9yIGVudW1MaXN0ID0gbnVsbDsgLy8gbGlzdCBvZiBOb3RhdGlvbnMgb3IgRW51bSB2YWx1ZXMKLQotCXB1YmxpYyBpbnQgZ2V0RGVjbGFyZWRUeXBlKCkgewotCQlpbnQgdCA9IC0xOwotCQlpZiAodHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIHQ7Ci0KLQkJaWYgKHR5cGUuc3RhcnRzV2l0aCgiJSIpICYmIHR5cGUuZW5kc1dpdGgoIjsiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gUEVSRUZFUkVOQ0U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZ0F0dFR5cGVTdHJpbmcubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0eXBlLmVxdWFscyhmZ0F0dFR5cGVTdHJpbmdbaV0pKSB7Ci0JCQkJdCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHQ7Ci0JfQotCi0JcHVibGljIEVudW1lcmF0aW9uIGVsZW1lbnRzKCkgewotCQlpZiAoZW51bUxpc3QgPT0gbnVsbCkKLQkJCWVudW1MaXN0ID0gbmV3IFZlY3RvcigpOwotCQlyZXR1cm4gZW51bUxpc3QuZWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldERlZmF1bHRUeXBlKCkgewotCQlpZiAoZGVmYXVsdFR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlpZiAoZGVmYXVsdFR5cGUuc3RhcnRzV2l0aCgiJSIpICYmIGRlZmF1bHRUeXBlLmVuZHNXaXRoKCI7IikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIFBFUkVGRVJFTkNFOwotCQllbHNlIGlmIChkZWZhdWx0VHlwZS5lcXVhbHMoIiNSRVFVSVJFRCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gUkVRVUlSRUQ7Ci0JCWVsc2UgaWYgKGRlZmF1bHRUeXBlLmVxdWFscygiI0lNUExJRUQiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIElNUExJRUQ7Ci0JCWVsc2UgaWYgKGRlZmF1bHRUeXBlLmVxdWFscygiI0ZJWEVEIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBGSVhFRDsKLQkJZWxzZQotCQkJcmV0dXJuIE5PRklYRUQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJBdHQgTmFtZTogIiArIG5hbWUgKyAiIFR5cGU6ICIgKyB0eXBlICsgIiBkZWZhdWx0VHlwZTogIiArIGRlZmF1bHRUeXBlICsgIiBkZWZhdWx0VmFsdWU6ICIgKyBkZWZhdWx0VmFsdWU7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9BdHRsaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9BdHRsaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNzdhMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQXR0bGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIEF0dGxpc3QgZXh0ZW5kcyBCYXNlTm9kZSB7Ci0JVmVjdG9yIGF0dERlZnMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgbGlzdCdzIG5hbWU7IHRoaXMgdmFsdWUgaXMgYWxzbyBrbm93biBhcyB0aGUKLQkgKiAgICAgICAgICAgIEVsZW1lbnQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgQXR0bGlzdChTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFREKSB7Ci0JCXRoaXMobmFtZSwgb3duZXJEVEQsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBBdHRsaXN0KFN0cmluZyBuYW1lLCBTdHJpbmcgb3duZXJEVEQsIFN0cmluZyBjb21tZW50LCBFcnJvck1lc3NhZ2UgZXJyb3JNZXNzYWdlKSB7Ci0JCXN1cGVyKG5hbWUsIG93bmVyRFRELCBjb21tZW50LCBlcnJvck1lc3NhZ2UpOwotCX0KLQotCi0JLyoqCi0JICogQWRkcyB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBkZWZpbml0aW9uIHRvIHRoZSBlbmQgb2YgdGhpcyBhdHRyaWJ1dGUKLQkgKiBsaXN0IC4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0RGVmCi0JICogICAgICAgICAgICBBdHRyaWJ1dGUgZGVmaW5pdGlvbiB0byBhZGQgdG8gdGhpcyBhdHJpYnV0ZSBsaXN0LgotCSAqIEByZXR1cm4gPXRydWUgaWYgdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4KLQkgKiAgICAgICAgIHRoaXMgYXR0cmlidXRlIGxpc3Q7IG90aGVyd2lzZSwgPWZhbHNlLgotCSAqIEBzZWUgI2VsZW1lbnRBdAotCSAqIEBzZWUgI2dldEF0dERlZgotCSAqIEBzZWUgI2NvbnRhaW5zCi0JICogQHNlZSAjc2l6ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZEVsZW1lbnQoQXR0Tm9kZSBhdHREZWYpIHsKLQkJaWYgKGNvbnRhaW5zKGF0dERlZi5uYW1lKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJdGhpcy5hdHREZWZzLmFkZEVsZW1lbnQoYXR0RGVmKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXR0cmlidXRlIGRlZmluaXRpb24gYXQgdGhlIHNwZWNpZmllZCA8dmFyPmluZGV4PC92YXI+IGluCi0JICogdGhpcyBhdHRyaWJ1dGUgbGlzdAotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgSW5kZXggaW50byB0aGlzIGxpc3Qgb2YgYXR0cmlidXRlIGRlZmluaXRpb25zLgotCSAqIEByZXR1cm4gQXR0cmlidXRlIGRlZmluaXRpb24gYXQgdGhlIHNwZWNpZmllZCBpbmRleCwgb3IgPHZhcj5udWxsPC92YXI+Ci0JICogICAgICAgICBpZiBhbiBpbnZhbGlkIGluZGV4LgotCSAqIEBzZWUgI2FkZEVsZW1lbnQKLQkgKiBAc2VlICNnZXRBdHREZWYKLQkgKiBAc2VlICNjb250YWlucwotCSAqIEBzZWUgI3NpemUKLQkgKi8KLQlwdWJsaWMgQXR0Tm9kZSBlbGVtZW50QXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiAoQXR0Tm9kZSkgdGhpcy5hdHREZWZzLmVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXR0cmlidXRlIGRlZmluaXRpb24gdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogZGVmaW5pdGlvbiBuYW1lIGluIHRoaXMgYXR0cmlidXRlIGxpc3QuCi0JICogCi0JICogQHBhcmFtIGF0dERlZk5hbWUKLQkgKiAgICAgICAgICAgIEF0dHJpYnV0ZSBkZWZpbml0aW9uIG5hbWUgdG8gbWF0Y2ggaW4gdGhpcyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAcmV0dXJuIFRoZSBtYXRjaGluZyBhdHRyaWJ1dGUgZGVmaW5pdGlvbiwgb3IgPHZhcj5udWxsPC92YXI+IGlmIHRoZQotCSAqICAgICAgICAgYXR0cmlidXRlIGlzIG5vdCBjdXJyZW50bHkgZGVmaW5lZC4KLQkgKiBAc2VlICNhZGRFbGVtZW50Ci0JICogQHNlZSAjZWxlbWVudEF0Ci0JICogQHNlZSAjY29udGFpbnMKLQkgKiBAc2VlICNzaXplCi0JICogQHNlZSAjZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgQXR0Tm9kZSBnZXRBdHREZWYoU3RyaW5nIGF0dERlZk5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotCQkJQXR0Tm9kZSBhZCA9IGVsZW1lbnRBdChpKTsKLQkJCWlmIChhdHREZWZOYW1lLmVxdWFscyhhZC5uYW1lKSkKLQkJCQlyZXR1cm4gYWQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGRlZmluaXRpb24gbmFtZSBpcyBjdXJyZW50bHkKLQkgKiBkZWZpbmVkIGluIHRoaXMgYXR0cmlidXRlIGxpc3QuCi0JICogCi0JICogQHBhcmFtIGF0dERlZk5hbWUKLQkgKiAgICAgICAgICAgIEF0dHJpYnV0ZSBkZWZpbml0aW9uIG5hbWUgdG8gbWF0Y2ggaW4gdGhpcyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAcmV0dXJuID10cnVlIGlmIDx2YXI+YXR0RGVmTmFtZTwvdmFyPiBpcyBkZWZpbmVkOyBvdGhlcndpc2UsID1mYWxzZS4KLQkgKiBAc2VlICNhZGRFbGVtZW50Ci0JICogQHNlZSAjZWxlbWVudEF0Ci0JICogQHNlZSAjZ2V0QXR0RGVmCi0JICogQHNlZSAjc2l6ZQotCSAqIEBzZWUgI2VsZW1lbnRzCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIGF0dERlZk5hbWUpIHsKLQkJcmV0dXJuIG51bGwgIT0gZ2V0QXR0RGVmKGF0dERlZk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMgaW4gdGhpcyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIE51bWJlciBvZiBhdHRyaWJ1dGUgbGlzdCBkZWZpbml0aW9ucywgb3IgPHZhcj5udWxsPC92YXI+IGlmIG5vCi0JICogICAgICAgICBkZWZpbml0aW9ucyBkZWZpbmVkLgotCSAqIEBzZWUgI2FkZEVsZW1lbnQKLQkgKiBAc2VlICNlbGVtZW50QXQKLQkgKiBAc2VlICNnZXRBdHREZWYKLQkgKiBAc2VlICNjb250YWlucwotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYXR0RGVmcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiBhbGwgYXR0cmlidXRlIGRlZmluaXRpb25zIGluIHRoaXMgYXR0cmlidXRlCi0JICogbGlzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuIGVudW1lcmF0aW9uIG9mIGFsbCBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMsIG9yIDx2YXI+bnVsbDwvdmFyPgotCSAqICAgICAgICAgaWYgbm9uZSBzcGVjaWZpZWQuCi0JICogQHNlZSAjYWRkRWxlbWVudAotCSAqIEBzZWUgI2VsZW1lbnRBdAotCSAqIEBzZWUgI2dldEF0dERlZgotCSAqIEBzZWUgI2NvbnRhaW5zCi0JICogQHNlZSAjc2l6ZQotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBlbGVtZW50cygpIHsKLQkJcmV0dXJuIHRoaXMuYXR0RGVmcy5lbGVtZW50cygpOwotCX0KLQotCXZvaWQgc2V0QXR0RGVmcyhWZWN0b3IgYXR0cnMpIHsKLQkJYXR0RGVmcyA9IGF0dHJzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0Jhc2VOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9CYXNlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWIzOWJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0Jhc2VOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlTm9kZSB7Ci0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gbnVsbDsKLQlwcm90ZWN0ZWQgRXJyb3JNZXNzYWdlIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JLy8gcHJvdGVjdGVkIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgY29tbWVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBvd25lckRURCA9IG51bGw7Ci0KLQkvKiogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gKi8KLQlwdWJsaWMgQmFzZU5vZGUoU3RyaW5nIG5hbWUsIFN0cmluZyBvd25lckRURCkgewotCQl0aGlzKG5hbWUsIG93bmVyRFRELCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgQmFzZU5vZGUoU3RyaW5nIG5hbWUsIFN0cmluZyBvd25lckRURCwgU3RyaW5nIGNvbW1lbnQsIEVycm9yTWVzc2FnZSBlcnJvck1lc3NhZ2UpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5vd25lckRURCA9IG93bmVyRFREOwotCQl0aGlzLmNvbW1lbnQgPSBjb21tZW50OwotCQl0aGlzLmVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb2RlTmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0T3duZXJEVEQoKSB7Ci0JCXJldHVybiBvd25lckRURDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPd25lckRURChTdHJpbmcgb3duZXIpIHsKLQkJb3duZXJEVEQgPSBvd25lcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIGNvbW1lbnQpIHsKLQkJdGhpcy5jb21tZW50ID0gY29tbWVudDsKLQl9Ci0KLQlwdWJsaWMgRXJyb3JNZXNzYWdlIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoRXJyb3JNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJZXJyb3JNZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNQmFzaWNOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTUJhc2ljTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWMwZmMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNQmFzaWNOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQ01CYXNpY05vZGUgZXh0ZW5kcyBDTU5vZGUgewotCXByaXZhdGUgaW50IHR5cGUgPSBDTU5vZGVUeXBlLkVNUFRZOyAvLyBwb3NzaWJsZSB0eXBlcyA6Ci0KLQkvLyBDTU5vZGVUeXBlLkVNUFRZCi0JLy8gQ01Ob2RlVHlwZS5BTlkKLQkvLyBDTU5vZGVUeXBlLlBDREFUQQotCi0JLyoqIERlZmF1bHQgY29uc3RydWN0b3IuICovCi0JcHVibGljIENNQmFzaWNOb2RlKFN0cmluZyByZWZOYW1lKSB7Ci0JCXN1cGVyKHJlZk5hbWUpOwotCX0KLQotCXB1YmxpYyBDTUJhc2ljTm9kZShTdHJpbmcgcmVmTmFtZSwgaW50IHR5cGUpIHsKLQkJc3VwZXIocmVmTmFtZSk7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICIgQmFzaWNOb2RlTmFtZTogIiArIGdldE5hbWUoKSArICIgVHlwZTogIiArIGdldFR5cGUoKSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01Hcm91cE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNR3JvdXBOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZTIwMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01Hcm91cE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIENNR3JvdXBOb2RlIGV4dGVuZHMgQ01SZXBlYXRhYmxlTm9kZSB7Ci0JcHJpdmF0ZSBpbnQgdHlwZSA9IENNTm9kZVR5cGUuR1JPVVA7Ci0JcHJpdmF0ZSBpbnQgZ3JvdXBLaW5kID0gQ01Ob2RlVHlwZS5HUk9VUF9TRVFVRU5DRTsKLQlwcml2YXRlIFZlY3RvciBjaGlsZHJlbiA9IG5ldyBWZWN0b3IoKTsKLQotCXB1YmxpYyBDTUdyb3VwTm9kZSgpIHsKLQkJc3VwZXIoIkdST1VQIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8vIGltcGxlbWVudCBzdXBlciBjbGFzcwotCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IHR5cGUpIHsKLQkJLy8gY2FuJ3QgY2hhbmdlIC0gb25seSBvbmUgdHlwZSBhbGxvd3MKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEdyb3VwS2luZCgpIHsKLQkJcmV0dXJuIGdyb3VwS2luZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRHcm91cEtpbmQoaW50IGtpbmQpIHsKLQkJZ3JvdXBLaW5kID0ga2luZDsKLQl9Ci0KLQlwdWJsaWMgVmVjdG9yIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ2hpbGQoQ01Ob2RlIGNoaWxkKSB7Ci0JCWNoaWxkcmVuLmFkZEVsZW1lbnQoY2hpbGQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSAiR3JvdXAgKCAtIGtpbmQ6ICIgKyBnZXRHcm91cEtpbmQoKSArICIgT2NjVHlwZTogIiArIGdldE9jY3VycmVuY2UoKSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJRW51bWVyYXRpb24gZW4gPSBjaGlsZHJlbi5lbGVtZW50cygpOwotCQl3aGlsZSAoZW4uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCXJlc3VsdCArPSAiICIgKyBlbi5uZXh0RWxlbWVudCgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXN1bHQgKz0gIkdyb3VwICkiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMxYmNhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTU5vZGUgewotCXByaXZhdGUgU3RyaW5nIHJlZk5hbWU7Ci0KLQkvKiogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gKi8KLQlwdWJsaWMgQ01Ob2RlKFN0cmluZyByZWZOYW1lKSB7Ci0JCXRoaXMucmVmTmFtZSA9IHJlZk5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gcmVmTmFtZTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldFR5cGUoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFR5cGUoaW50IHR5cGUpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTU5vZGVUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTU5vZGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYThkODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01Ob2RlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotcHVibGljIGludGVyZmFjZSBDTU5vZGVUeXBlIHsKLQlzdGF0aWMgcHVibGljIGludCBFTVBUWSA9IDE7Ci0Jc3RhdGljIHB1YmxpYyBpbnQgQU5ZID0gMjsKLQlzdGF0aWMgcHVibGljIGludCBQQ0RBVEEgPSAzOwotCXN0YXRpYyBwdWJsaWMgaW50IEVMRU1FTlRfUkVGRVJFTkNFID0gNDsKLQlzdGF0aWMgcHVibGljIGludCBFTlRJVFlfUkVGRVJFTkNFID0gNTsKLQlzdGF0aWMgcHVibGljIGludCBHUk9VUCA9IDY7Ci0KLQlzdGF0aWMgcHVibGljIGludCBPTkUgPSA3OwotCXN0YXRpYyBwdWJsaWMgaW50IE9QVElPTkFMID0gODsKLQlzdGF0aWMgcHVibGljIGludCBPTkVfT1JfTU9SRSA9IDk7Ci0Jc3RhdGljIHB1YmxpYyBpbnQgWkVST19PUl9NT1JFID0gMTA7Ci0KLQlzdGF0aWMgcHVibGljIGludCBHUk9VUF9DSE9JQ0UgPSAxMTsKLQlzdGF0aWMgcHVibGljIGludCBHUk9VUF9TRVFVRU5DRSA9IDEyOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTVJlZmVyZW5jZU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNUmVmZXJlbmNlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mjc4OGY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNUmVmZXJlbmNlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotcHVibGljIGNsYXNzIENNUmVmZXJlbmNlTm9kZSBleHRlbmRzIENNUmVwZWF0YWJsZU5vZGUgewotCXByaXZhdGUgaW50IHR5cGUgPSBDTU5vZGVUeXBlLkVMRU1FTlRfUkVGRVJFTkNFOwotCi0JcHVibGljIENNUmVmZXJlbmNlTm9kZShTdHJpbmcgcmVmTmFtZSkgewotCQl0aGlzKHJlZk5hbWUsIENNTm9kZVR5cGUuRUxFTUVOVF9SRUZFUkVOQ0UpOwotCX0KLQotCXB1YmxpYyBDTVJlZmVyZW5jZU5vZGUoU3RyaW5nIHJlZk5hbWUsIGludCB0eXBlKSB7Ci0JCXN1cGVyKHJlZk5hbWUpOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICIgUmVmTmFtZTogIiArIGdldE5hbWUoKSArICIgVHlwZTogIiArIGdldFR5cGUoKSArICIgT2NjVHlwZTogIiArIGdldE9jY3VycmVuY2UoKSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTVJlcGVhdGFibGVOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTVJlcGVhdGFibGVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NmQ5NjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01SZXBlYXRhYmxlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENNUmVwZWF0YWJsZU5vZGUgZXh0ZW5kcyBDTU5vZGUgewotCXByaXZhdGUgaW50IG9jY1R5cGUgPSBDTU5vZGVUeXBlLk9ORTsKLQotCXB1YmxpYyBDTVJlcGVhdGFibGVOb2RlKFN0cmluZyByZWZOYW1lKSB7Ci0JCXN1cGVyKHJlZk5hbWUpOwotCX0KLQotCXB1YmxpYyBDTVJlcGVhdGFibGVOb2RlKFN0cmluZyByZWZOYW1lLCBpbnQgb2NjVHlwZSkgewotCQlzdXBlcihyZWZOYW1lKTsKLQkJdGhpcy5vY2NUeXBlID0gb2NjVHlwZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9jY3VycmVuY2UoKSB7Ci0JCXJldHVybiBvY2NUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9jY3VycmVuY2UoaW50IG9jY1R5cGUpIHsKLQkJdGhpcy5vY2NUeXBlID0gb2NjVHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNTA5YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBEVEQgewotCS8vCi0JLy8gQ29uc3RhbnRzCi0JLy8KLQotCVZlY3RvciBleHRlcm5hbEVsZW1lbnRzID0gbmV3IFZlY3RvcigpOwotCVN0cmluZyBuYW1lID0gbnVsbDsKLQotCWJvb2xlYW4gaXNFeGNlcHRpb25EdXJpbmdQYXJzZSA9IGZhbHNlOwotCi0JLy8KLQkvLyBDb25zdHJ1Y3RvcnMKLQkvLwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IuCi0JICovCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIGZpbGUgbmFtZSBvZiB0aGlzIERURC4KLQkgKiBAc2VlICNnZXROYW1lCi0JICogQHNlZSAjc2V0TmFtZQotCSAqLwotCXB1YmxpYyBEVEQoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgRFREJ3MgZmlsZSBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gVGhpcyBEVEQncyBmaWxlIG5hbWUsIG9yIDx2YXI+bnVsbDwvdmFyPiBpZiBubyBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoaXMgRFREJ3MgZmlsZSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGlzIERURCdzIG5hbWUuCi0JICogQHNlZSAjZ2V0TmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIEVudW1lcmF0aW9uIGluc3RhbmNlIG9mIGFsbCBleHRlcm5hbCBzdWJzZXQgY2hpbGRyZW4gb2YgdGhpcwotCSAqIERURC4KLQkgKiAKLQkgKiBAcmV0dXJuIEFuIGVudW1lcmF0aW9uIG9mIGFsbCBleHRlcm5hbCBzdWJzZXQgY2hpbGRyZW4gb2YgdGhpcyBEVEQuCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIGV4dGVybmFsRWxlbWVudHMoKSB7Ci0JCXJldHVybiBleHRlcm5hbEVsZW1lbnRzLmVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRGVjbChCYXNlTm9kZSBkZWNsKSB7Ci0JCWV4dGVybmFsRWxlbWVudHMuYWRkRWxlbWVudChkZWNsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJc0V4Y2VwdGlvbkR1cmluZ1BhcnNlKGJvb2xlYW4gb24pIHsKLQkJaXNFeGNlcHRpb25EdXJpbmdQYXJzZSA9IG9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldElzRXhjZXB0aW9uRHVyaW5nUGFyc2UoKSB7Ci0JCXJldHVybiBpc0V4Y2VwdGlvbkR1cmluZ1BhcnNlOwotCX0KLQotfSAvLyBjbGFzcyBEVEQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURFBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFREUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YTY2YTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFREUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5MYXp5VVJMSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRFRESGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotcHVibGljIGNsYXNzIERURFBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIGltcGxlbWVudHMgQ29udGVudEhhbmRsZXIsIERUREhhbmRsZXIsIEVycm9ySGFuZGxlciwgRGVjbEhhbmRsZXIsIExleGljYWxIYW5kbGVyIHsKLQlwcml2YXRlIFN0cmluZyBjb250ZW50U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBkZWNsU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qIENhbm9uaWNhbCBvdXRwdXQuICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2Fub25pY2FsOwotCi0JcHJvdGVjdGVkIFhNTFJlYWRlciByZWFkZXI7Ci0JaW50IGVudGl0eURlcHRoOwotCi0JLy8gZG13IDExLzE1IHByaXZhdGUgZmllbGQgbmV2ZXIgcmVhZCBsb2NhbGx5Ci0JLy8gcHJpdmF0ZSBWZWN0b3IgZGVjbEVsZW1lbnRzOwotCXByaXZhdGUgU3RyaW5nIGNvbW1lbnQgPSBudWxsOwotCXByaXZhdGUgRXJyb3JNZXNzYWdlIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGVycm9yTWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBEZWNsTm9kZSBwcmV2aW91c0RlY2xOb2RlID0gbnVsbDsKLQlwcml2YXRlIERlY2xOb2RlIGN1cnJlbnREZWNsTm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBCYXNlTm9kZSBsYXN0QmFzZU5vZGUgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGVudGl0eUVuZCA9IGZhbHNlOwotCXByaXZhdGUgaW50IGxpbmVOdW1iZXI7Ci0KLQlwcml2YXRlIERURCBjdXJyZW50RFREID0gbnVsbDsKLQlwcml2YXRlIFZlY3RvciBkdGRMaXN0ID0gbmV3IFZlY3RvcigpOwotCi0JcHJpdmF0ZSBTdGFjayBkdGRTdGFjayA9IG5ldyBTdGFjaygpOwotCXByaXZhdGUgU3RhY2sgcGVSZWZTdGFjayA9IG5ldyBTdGFjaygpOwotCXByaXZhdGUgU3RhY2sgcGFyc2luZ1BFUmVmU3RhY2sgPSBuZXcgU3RhY2soKTsKLQotCXByaXZhdGUgRW50aXR5UG9vbCBlbnRpdHlQb29sID0gbmV3IEVudGl0eVBvb2woKTsKLQlwcml2YXRlIFN0cmluZyBleHBhbmRlZEVudGl0eVZhbHVlID0gbnVsbDsKLQlwcml2YXRlIEhhc2h0YWJsZSBlbGVtZW50UG9vbCA9IG5ldyBIYXNodGFibGUoKTsKLQotCWJvb2xlYW4gcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBleHBhbmRFbnRpdHlSZWZlcmVuY2VzID0gdHJ1ZTsKLQotCXByaXZhdGUgTG9jYXRvciBsb2NhdG9yID0gbnVsbDsKLQotCXByaXZhdGUgTG9jYXRvciBnZXRMb2NhdG9yKCkgewotCQlyZXR1cm4gbG9jYXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBsb2NhdG9yKSB7Ci0JCXRoaXMubG9jYXRvciA9IGxvY2F0b3I7Ci0JfQotCi0JcHVibGljIERURFBhcnNlcihib29sZWFuIGNhbm9uaWNhbCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotCQl0aGlzKG51bGwsIGNhbm9uaWNhbCk7Ci0JfQotCi0JcHJvdGVjdGVkIERURFBhcnNlcihTdHJpbmcgZW5jb2RpbmcsIGJvb2xlYW4gY2Fub25pY2FsKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0KLQkJaWYgKGVuY29kaW5nID09IG51bGwpCi0JCQllbmNvZGluZyA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQotCQl0aGlzLmNhbm9uaWNhbCA9IGNhbm9uaWNhbDsKLQkJdHJ5IHsKLQkJCVNBWFBhcnNlciBzcGFyc2VyID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1NBWFBhcnNlcigpOwotCQkJcmVhZGVyID0gc3BhcnNlci5nZXRYTUxSZWFkZXIoKTsKLQkJCXJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvZGVjbGFyYXRpb24taGFuZGxlciIsIHRoaXMpOyAvLyROT04tTkxTLTEkCi0JCQlyZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2xleGljYWwtaGFuZGxlciIsIHRoaXMpOyAvLyROT04tTkxTLTEkCi0JCQlyZWFkZXIuc2V0Q29udGVudEhhbmRsZXIodGhpcyk7Ci0JCQlyZWFkZXIuc2V0RFRESGFuZGxlcih0aGlzKTsKLQkJCXJlYWRlci5zZXRFcnJvckhhbmRsZXIodGhpcyk7Ci0JCQlyZWFkZXIuc2V0RW50aXR5UmVzb2x2ZXIodGhpcyk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQl9Ci0KLQkvKiBQcmludHMgdGhlIG91dHB1dCBmcm9tIHRoZSBTQVggY2FsbGJhY2tzLiAqLwotCXB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyBsb2dpY2FsVVJJKSB7Ci0JCXRyeSB7CQkJCi0JCQkvLyBDUyBlbnN1cmUgdGhhdCB0aGUgcGh5c2ljYWwgVVJJIGlzIGNvbnNpZGVyZWQgd2hlcmUgc3RyZWFtcyBhcmUgcmVxdWlyZWQKLQkJCS8vIGFuZCB0aGUgbG9naWNhbFVSSSBpcyB1c2VkIGFzIHRoZSBEVEQncyBiYXNlTG9jYXRpb24KLQkJCVN0cmluZyBwaHlzaWNhbFVSSSA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24oIiIsICIiLCBsb2dpY2FsVVJJKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlib29sZWFuIGlzUmVhZGFibGUgPSBVUklIZWxwZXIuaXNSZWFkYWJsZVVSSShwaHlzaWNhbFVSSSwgdHJ1ZSk7Ci0JCQlpZiAoIWlzUmVhZGFibGUpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJEVEQgcGFyc2UgZXJyb3IuIENhbiBub3QgcmVhZCB0aGUgc3BlY2lmaWVkIFVSSSA6ICIgKyBsb2dpY2FsVVJJKTsgLy8kTk9OLU5MUy0xJAotCQkJfQkJCQotCQkJU3RyaW5nIGRvY3VtZW50ID0gIjwhRE9DVFlQRSByb290IFNZU1RFTSBcIiIgKyBsb2dpY2FsVVJJICsgIlwiPjxyb290Lz4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWVudGl0eURlcHRoID0gMDsKLQkJCWN1cnJlbnREVEQgPSBuZXcgRFREKGxvZ2ljYWxVUkkpOwotCQkJSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcihkb2N1bWVudCkpOwotCQkJaW5wdXRTb3VyY2Uuc2V0U3lzdGVtSWQobG9naWNhbFVSSSArICIueG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJlYWRlci5wYXJzZShpbnB1dFNvdXJjZSk7Ci0JCX0KLQkJY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIHNlKSB7Ci0JCQlpZiAoY3VycmVudERURCAhPSBudWxsKQotCQkJCWN1cnJlbnREVEQuc2V0SXNFeGNlcHRpb25EdXJpbmdQYXJzZSh0cnVlKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChjdXJyZW50RFREICE9IG51bGwpCi0JCQkJY3VycmVudERURC5zZXRJc0V4Y2VwdGlvbkR1cmluZ1BhcnNlKHRydWUpOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIEBkZXByZWNhdGVkIEVudGl0eSByZWZlcmVuY2VzIGFyZSBhbHdheXMgZXhwYW5kZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcyhib29sZWFuIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpIHsKLQkJdGhpcy5leHBhbmRFbnRpdHlSZWZlcmVuY2VzID0gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIEBkZXByZWNhdGVkIEVudGl0eSByZWZlcmVuY2VzIGFyZSBhbHdheXMgZXhwYW5kZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIGV4cGFuZEVudGl0eVJlZmVyZW5jZXM7Ci0JfQotCi0JcHVibGljIFZlY3RvciBnZXREVERMaXN0KCkgewotCQlyZXR1cm4gZHRkTGlzdDsKLQl9Ci0KLQlwdWJsaWMgSGFzaHRhYmxlIGdldEVsZW1lbnRQb29sKCkgewotCQlyZXR1cm4gZWxlbWVudFBvb2w7Ci0JfQotCi0JcHVibGljIEVudGl0eVBvb2wgZ2V0RW50aXR5UG9vbCgpIHsKLQkJcmV0dXJuIGVudGl0eVBvb2w7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RXJyb3JNZXNzYWdlcygpIHsKLQkJcmV0dXJuIGVycm9yTWVzc2FnZXM7Ci0JfQotCi0JLy8KLQkvLyBEb2N1bWVudEhhbmRsZXIgbWV0aG9kcwotCS8vCi0KLQlwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgewotCX0KLQotCXB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkgewotCX0KLQotCS8vCi0JLy8gRFRESGFuZGxlciBtZXRob2RzCi0JLy8KLQotCXB1YmxpYyB2b2lkIHVucGFyc2VkRW50aXR5RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIFN0cmluZyBub3RhdGlvbk5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGF0aW9uRGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlzdGFydERlY2xhcmF0aW9uKERlY2xOb2RlLk5PVEFUSU9OKTsKLQkJZGVjbFN0cmluZyA9ICI8IU5PVEFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZW50aXR5RGVwdGggPT0gMSB8fCBwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkgewotCQkJU3RyaW5nIHhzID0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQl4cyArPSBuYW1lOwotCQkJaWYgKHB1YmxpY0lkID09IG51bGwpCi0JCQkJeHMgKz0gIiBTWVNURU0gIiArICJcIiIgKyBzeXN0ZW1JZCArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQllbHNlCi0JCQkJeHMgKz0gIiBQVUJMSUMgIiArICJcIiIgKyBwdWJsaWNJZCArICJcIiAiICsgIlwiIiArIHN5c3RlbUlkICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQljb250ZW50U3RyaW5nICs9IHhzOwotCQkJcGFyc2VDdXJyZW50RGVjbGFyYXRpb24oKTsKLQkJfQotCX0KLQotCS8vCi0JLy8gRGVjbEhhbmRsZXIgbWV0aG9kcwotCS8vCi0KLQlwdWJsaWMgdm9pZCBlbGVtZW50RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG1vZGVsKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5FTEVNRU5UKTsKLQkJZGVjbFN0cmluZyA9ICI8IUVMRU1FTlQiOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gS0I6IFdpdGggZWFybHkgdmVyc2lvbnMgb2YgWGVyY2VzIDIueCwgc3RhcnRFbnRpdHkoIltkdGRdIikgdXNlZCB0bwotCQkvLyBiZSBjYWxsZWQgYmVmb3JlIHRoaXMgbWV0aG9kCi0JCS8vIHNvIGVudGl0eURlcHRoIHdhcyAxLiBVc2luZyBKQVhQIGNoYW5nZWQgdGhhdCBhbmQgc3RhcnRFbnRpdHkoKSBpcwotCQkvLyBub3QgY2FsbGVkIGJhY2sgYW55bW9yZS4KLQkJLy8gQmVjYXVzZSBvZiB0aGlzLCB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBlbnRpdHlEZXB0aCA9PSAwCi0JCS8vIGFzIHdlbGwuCi0JCWlmIChlbnRpdHlEZXB0aCA9PSAwIHx8IGVudGl0eURlcHRoID09IDEgfHwgcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UpCi0JCQlwYXJzZUN1cnJlbnREZWNsYXJhdGlvbkhlbHBlcihuYW1lICsgIiAiICsgbW9kZWwpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBhdHRyaWJ1dGVTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHZvaWQgYXR0cmlidXRlRGVjbChTdHJpbmcgZU5hbWUsIFN0cmluZyBhTmFtZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZURlZmF1bHQsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXN0YXJ0RGVjbGFyYXRpb24oRGVjbE5vZGUuQVRUTElTVCk7Ci0JCWRlY2xTdHJpbmcgPSAiPCFBVFRMSVNUIjsgLy8kTk9OLU5MUy0xJAotCi0JCWF0dHJpYnV0ZVN0cmluZyArPSAiICIgKyBhTmFtZTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodHlwZSAhPSBudWxsKQotCQkJYXR0cmlidXRlU3RyaW5nICs9ICIgIiArIHR5cGU7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHZhbHVlRGVmYXVsdCAhPSBudWxsKQotCQkJYXR0cmlidXRlU3RyaW5nICs9ICIgIiArIHZhbHVlRGVmYXVsdDsgLy8kTk9OLU5MUy0xJAotCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZVN0cmluZyArPSAiICciICsgdmFsdWUgKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWF0dHJpYnV0ZVN0cmluZyA9IGVOYW1lICsgIiAiICsgYXR0cmlidXRlU3RyaW5nICsgIj4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcGFyc2VDdXJyZW50RGVjbGFyYXRpb25IZWxwZXIoYXR0cmlidXRlU3RyaW5nKTsKLQkJYXR0cmlidXRlU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnRlcm5hbEVudGl0eURlY2woU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXN0YXJ0RGVjbGFyYXRpb24oRGVjbE5vZGUuSU5URVJOQUxfRU5USVRZKTsKLQkJZGVjbFN0cmluZyA9ICI8IUVOVElUWSI7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoZW50aXR5RGVwdGggPT0gMSB8fCBwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkgewotCQkJLy8gYnVpbGQgdXAgYSBzdHJpbmc6IGUuZy4gIiAlIFNUUkRPTSAiKCNQQ0RBVEEpIj4iCi0JCQlTdHJpbmcgeHMgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIiUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJeHMgKz0gIiUgIjsgLy8kTk9OLU5MUy0xJAotCQkJCXhzICs9IG5hbWUuc3Vic3RyaW5nKDEpOwotCQkJfQotCQkJZWxzZQotCQkJCXhzICs9IG5hbWU7Ci0KLQkJCXhzICs9ICIgXCIiICsgdmFsdWUgKyAiXCI+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCWNvbnRlbnRTdHJpbmcgKz0geHM7Ci0JCQkvLyBzYXZlIGV4cGFuZGVkIGVudGl0eSB2YWx1ZQotCQkJZXhwYW5kZWRFbnRpdHlWYWx1ZSA9IHZhbHVlOwotCQkJcGFyc2VDdXJyZW50RGVjbGFyYXRpb24oKTsKLQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZXh0ZXJuYWxFbnRpdHlEZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXN0YXJ0RGVjbGFyYXRpb24oRGVjbE5vZGUuRVhURVJOQUxfRU5USVRZKTsKLQkJZGVjbFN0cmluZyA9ICI8IUVOVElUWSI7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoZW50aXR5RGVwdGggPT0gMSB8fCBwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkgewotCQkJLy8gYnVpbGQgdXAgYSBzdHJpbmc6Ci0JCQkvLyBleDEpICIgJSBGSUVMRCBTWVNURU0gIm9hZ2lzX2ZpZWxkcy5kdGQiPiIKLQkJCS8vIGV4MikgIiAlIEZJRUxEIFBVQkxJQyAiRk9PIj4iCi0JCQlTdHJpbmcgeHMgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIiUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJeHMgKz0gIiUgIjsgLy8kTk9OLU5MUy0xJAotCQkJCXhzICs9IG5hbWUuc3Vic3RyaW5nKDEpOwotCQkJfQotCQkJZWxzZQotCQkJCXhzICs9IG5hbWU7Ci0KLQkJCWlmIChzeXN0ZW1JZCAhPSBudWxsKQotCQkJCXhzICs9ICIgU1lTVEVNIFwiIiArIHN5c3RlbUlkICsgIlwiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZWxzZSBpZiAocHVibGljSWQgIT0gbnVsbCkKLQkJCQl4cyArPSAiIFBVQkxJQyBcIiIgKyBwdWJsaWNJZCArICJcIj4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJY29udGVudFN0cmluZyArPSB4czsKLQkJCXBhcnNlQ3VycmVudERlY2xhcmF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvLwotCS8vIExleGljYWxIYW5kbGVyIG1ldGhvZHMKLQkvLwotCi0JcHVibGljIHZvaWQgc3RhcnRDREFUQSgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCX0KLQotCXB1YmxpYyB2b2lkIGVuZENEQVRBKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnREVEQoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJZHRkTGlzdC5yZW1vdmVBbGxFbGVtZW50cygpOwotCQlkdGRMaXN0LmFkZEVsZW1lbnQoY3VycmVudERURCk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IHRoZSBlbmQgb2YgRFREIGRlY2xhcmF0aW9ucy4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgotCSAqIEBzZWUgI3N0YXJ0RFRECi0JICovCi0JcHVibGljIHZvaWQgZW5kRFREKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXN0YXJ0RGVjbGFyYXRpb24oRGVjbE5vZGUuRU5EX0RURCk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IHRoZSBiZWdpbm5pbmcgb2YgYW4gZW50aXR5LgotCSAqIAotCSAqIFRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBkb2N1bWVudCBlbnRpdHkgYXJlIG5vdCByZXBvcnRlZC4gVGhlIHN0YXJ0Ci0JICogYW5kIGVuZCBvZiB0aGUgZXh0ZXJuYWwgRFREIHN1YnNldCBhcmUgcmVwb3J0ZWQgdXNpbmcgdGhlIHBzZXVkby1uYW1lCi0JICogIltkdGRdIi4gQWxsIG90aGVyIGV2ZW50cyBtdXN0IGJlIHByb3Blcmx5IG5lc3RlZCB3aXRoaW4gc3RhcnQvZW5kCi0JICogZW50aXR5IGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGVudGl0eS4gSWYgaXQgaXMgYSBwYXJhbWV0ZXIgZW50aXR5LCB0aGUKLQkgKiAgICAgICAgICAgIG5hbWUgd2lsbCBiZWdpbiB3aXRoICclJy4KLQkgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgotCSAqIEBzZWUgI2VuZEVudGl0eQotCSAqLwotCi0JcHVibGljIHZvaWQgc3RhcnRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAobmFtZS5lcXVhbHMoIltkdGRdIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5TVEFSVF9FTlRJVFlfRFREKTsKLQkJfQotCQllbHNlIGlmIChjdXJyZW50RGVjbE5vZGUgPT0gbnVsbCkgewotCQkJLy8gUEUgcmVmZXJlbmNlIGluIG1hcmt1cGRlY2wgc2VjdGlvbgotCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgcGVOYW1lID0gbmFtZS5zdWJzdHJpbmcoMSk7Ci0JCQkJRW50aXR5RGVjbCBlbiA9IGVudGl0eVBvb2wucmVmZXJQYXJhKHBlTmFtZSk7Ci0KLQkJCQlwZVJlZlN0YWNrLnB1c2gobmFtZSk7Ci0JCQkJcGFyc2luZ1BFUmVmU3RhY2sucHVzaChuZXcgQm9vbGVhbihwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkpOwotCi0JCQkJU3RyaW5nIHN5c3RlbUlkID0gZW4uZ2V0U3lzdGVtSWQoKTsKLQkJCQlTdHJpbmcgcHVibGljSWQgPSBlbi5nZXRQdWJsaWNJZCgpOwotCQkJCWlmIChzeXN0ZW1JZCA9PSBudWxsKSB7Ci0JCQkJCXBhcnNpbmdFeHRlcm5hbFBFUmVmZXJlbmNlID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlVUklSZXNvbHZlciBpZFJlc29sdmVyID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKTsKLQkJCQkJU3RyaW5nIHVyaSA9IGlkUmVzb2x2ZXIucmVzb2x2ZShjdXJyZW50RFRELmdldE5hbWUoKSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJCQkJaWYgKCFpc0RURExvYWRlZCh1cmkpKSB7Ci0JCQkJCQkvLyBub3QgbG9hZGVkCi0JCQkJCQkvLyBvdXQucHJpbnRsbigiIERURCBub3QgbG9hZGVkIC4uIGNyZWF0ZSBuZXcgRFREOiAiCi0JCQkJCQkvLyApOwotCQkJCQkJZHRkU3RhY2sucHVzaChjdXJyZW50RFREKTsKLQkJCQkJCURURCBuZXdEVEQgPSBuZXcgRFREKHVyaSk7Ci0JCQkJCQlkdGRMaXN0LmFkZEVsZW1lbnQobmV3RFREKTsKLQkJCQkJCWN1cnJlbnREVEQgPSBuZXdEVEQ7Ci0JCQkJCQlwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBvdXQucHJpbnRsbigiIERURCBhbHJlYWR5IGxvYWRlZCAuLiAiICk7Ci0JCQkJCQlwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGVudGl0eURlcHRoID09IDEgfHwgcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UpIHsKLQkJCVN0cmluZyB4cyA9IChTdHJpbmcpIHJlYWRlci5nZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMveG1sLXN0cmluZyIpOyAvLyROT04tTkxTLTEkCi0JCQljb250ZW50U3RyaW5nICs9IHhzOwotCQl9Ci0JCWVudGl0eURlcHRoKys7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IHRoZSBlbmQgb2YgYW4gZW50aXR5LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgZW50aXR5IHRoYXQgaXMgZW5kaW5nLgotCSAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIG1heSByYWlzZSBhbiBleGNlcHRpb24uCi0JICogQHNlZSAjc3RhcnRFbnRpdHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAobmFtZS5lcXVhbHMoIltkdGRdIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5FTkRfRU5USVRZX0RURCk7Ci0JCX0KLQkJZWxzZSBpZiAoIXBlUmVmU3RhY2suZW1wdHkoKSkgewotCQkJcGFyc2VFeHRlcm5hbFBFUmVmZXJlbmNlKG5hbWUpOwotCQl9Ci0JCWVsc2UgaWYgKGVudGl0eURlcHRoID09IDEgfHwgcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UpIHsKLQkJCWlmICghY29udGVudFN0cmluZy5lbmRzV2l0aChuYW1lICsgIjsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHhzID0gKFN0cmluZykgcmVhZGVyLmdldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy94bWwtc3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljb250ZW50U3RyaW5nICs9IHhzOwotCQkJfQotCQl9Ci0JCWVudGl0eURlcHRoLS07Ci0JCWVudGl0eUVuZCA9IHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VFeHRlcm5hbFBFUmVmZXJlbmNlKFN0cmluZyBuYW1lKSB7Ci0JCWlmICghcGVSZWZTdGFjay5lbXB0eSgpKSB7Ci0JCQlpZiAoKChTdHJpbmcpIHBlUmVmU3RhY2sucGVlaygpKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlwZVJlZlN0YWNrLnBvcCgpOwotCQkJCWlmIChwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkgewotCQkJCQljdXJyZW50RFREID0gKERURCkgZHRkU3RhY2sucG9wKCk7Ci0JCQkJCWFkZFBFUmVmZXJlbmNlTm9kZShuYW1lKTsKLQkJCQl9Ci0JCQkJcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UgPSAoKEJvb2xlYW4pIHBhcnNpbmdQRVJlZlN0YWNrLnBvcCgpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGFuIFhNTCBjb21tZW50IGFueXdoZXJlIGluIHRoZSBkb2N1bWVudC4KLQkgKiAKLQkgKiBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgdXNlZCBmb3IgY29tbWVudHMgaW5zaWRlIG9yIG91dHNpZGUgdGhlIGRvY3VtZW50Ci0JICogZWxlbWVudCwgaW5jbHVkaW5nIGNvbW1lbnRzIGluIHRoZSBleHRlcm5hbCBEVEQgc3Vic2V0IChpZiByZWFkKS4KLQkgKiAKLQkgKiBAcGFyYW0gY2gKLQkgKiAgICAgICAgICAgIEFuIGFycmF5IGhvbGRpbmcgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIGNvbW1lbnQuCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICBUaGUgc3RhcnRpbmcgcG9zaXRpb24gaW4gdGhlIGFycmF5LgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB1c2UgZnJvbSB0aGUgYXJyYXkuCi0JICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21tZW50KGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5DT01NRU5UKTsKLQotCQlpZiAoY29tbWVudCA9PSBudWxsKQotCQkJY29tbWVudCA9IG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpOwotCQllbHNlCi0JCQljb21tZW50ICs9ICJcbiIgKyBuZXcgU3RyaW5nKGNoLCBzdGFydCwgbGVuZ3RoKTsgLy8gYXBwZW5kIGFsbCBjb21tZW50cy4gLy8kTk9OLU5MUy0xJAotCQkvLyBUaGUgY29tbWVudCB3aWxsIGdldCByZXNldCBhZnRlcgotCQkvLyBpdCBoYXMgYmVlbiBhdHRhY2hlZCB0byB0aGUgZm9sbG93aW5nCi0JCS8vIGRlY2xhcmF0aW9uLgotCX0KLQotCS8vCi0JLy8gRXJyb3JIYW5kbGVyIG1ldGhvZHMKLQkvLwotCi0JLyogV2FybmluZy4gKi8KLQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB7Ci0JCVN0cmluZyBlcnJvciA9ICJbU291cmNlIExpbmVdICIgKyBkZWNsU3RyaW5nICsgY29udGVudFN0cmluZyArICJcbiI7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQllcnJvciArPSAiW1dhcm5pbmcgICAgXSAiICsgZ2V0TG9jYXRpb25TdHJpbmcoZXgpICsgIjogIiArIGV4LmdldE1lc3NhZ2UoKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCXNldEVycm9ySW5mb3JtYXRpb24oZXgsICJ3YXJuaW5nIik7IC8vJE5PTi1OTFMtMSQKLQotCQlwYXJzZUN1cnJlbnREZWNsYXJhdGlvbigpOwotCX0KLQotCS8qIEVycm9yLiAqLwotCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB7Ci0JCVN0cmluZyBlcnJvciA9ICJbU291cmNlIExpbmVdICIgKyBkZWNsU3RyaW5nICsgY29udGVudFN0cmluZyArICJcbiI7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQllcnJvciArPSAiW0Vycm9yICAgXSAiICsgZ2V0TG9jYXRpb25TdHJpbmcoZXgpICsgIjogIiArIGV4LmdldE1lc3NhZ2UoKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCXNldEVycm9ySW5mb3JtYXRpb24oZXgsICJlcnJvciIpOyAvLyROT04tTkxTLTEkCi0KLQkJcGFyc2VDdXJyZW50RGVjbGFyYXRpb24oKTsKLQl9Ci0KLQkvKiBGYXRhbCBlcnJvci4gKi8KLQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGVycm9yID0gIltTb3VyY2UgTGluZV0gIiArIGRlY2xTdHJpbmcgKyBjb250ZW50U3RyaW5nICsgIlxuIjsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWVycm9yICs9ICJbRmF0YWwgRXJyb3JdICIgKyBnZXRMb2NhdGlvblN0cmluZyhleCkgKyAiOiAiICsgZXguZ2V0TWVzc2FnZSgpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJc2V0RXJyb3JJbmZvcm1hdGlvbihleCwgImZhdGFsIik7IC8vJE5PTi1OTFMtMSQKLQotCQlwYXJzZUN1cnJlbnREZWNsYXJhdGlvbigpOwotCX0KLQotCS8qIFJldHVybnMgYSBzdHJpbmcgb2YgdGhlIGxvY2F0aW9uLiAqLwotCXByaXZhdGUgU3RyaW5nIGdldExvY2F0aW9uU3RyaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJU3RyaW5nIHN5c3RlbUlkID0gZXguZ2V0U3lzdGVtSWQoKTsKLQkJaWYgKHN5c3RlbUlkICE9IG51bGwpIHsKLQkJCWludCBpbmRleCA9IHN5c3RlbUlkLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpCi0JCQkJc3lzdGVtSWQgPSBzeXN0ZW1JZC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJCXN0ci5hcHBlbmQoc3lzdGVtSWQpOwotCQl9Ci0JCXN0ci5hcHBlbmQoJzonKTsKLQkJc3RyLmFwcGVuZChleC5nZXRMaW5lTnVtYmVyKCkpOwotCQlzdHIuYXBwZW5kKCc6Jyk7Ci0JCXN0ci5hcHBlbmQoZXguZ2V0Q29sdW1uTnVtYmVyKCkpOwotCi0JCXJldHVybiBzdHIudG9TdHJpbmcoKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydERlY2xhcmF0aW9uKGludCB0eXBlKSB7Ci0JCWlmICh0eXBlID09IERlY2xOb2RlLkVORF9EVEQgfHwgdHlwZSA9PSBEZWNsTm9kZS5FTkRfRU5USVRZX0RURCB8fCB0eXBlID09IERlY2xOb2RlLkNPTU1FTlQgfHwgdHlwZSA9PSBEZWNsTm9kZS5FUlJPUikgewotCQkJcHJldmlvdXNEZWNsTm9kZSA9IGN1cnJlbnREZWNsTm9kZTsKLQkJCWN1cnJlbnREZWNsTm9kZSA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljdXJyZW50RGVjbE5vZGUgPSBuZXcgRGVjbE5vZGUodHlwZSk7Ci0JCQljb250ZW50U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWRlY2xTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZXhwYW5kZWRFbnRpdHlWYWx1ZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VDdXJyZW50RGVjbGFyYXRpb24oKSB7Ci0JCXBhcnNlQ3VycmVudERlY2xhcmF0aW9uSGVscGVyKGNvbnRlbnRTdHJpbmcpOwotCQljb250ZW50U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VDdXJyZW50RGVjbGFyYXRpb25IZWxwZXIoU3RyaW5nIGRlY2xhcmF0aW9uU3RyaW5nKSB7Ci0JCURURFNjYW5uZXIgc2Nhbm5lcjsKLQkJU3RyaW5nIG5hbWU7Ci0KLQkJaWYgKGN1cnJlbnREZWNsTm9kZSA9PSBudWxsICYmIHByZXZpb3VzRGVjbE5vZGUgIT0gbnVsbCAmJiBlbnRpdHlFbmQpIHsKLQkJCWN1cnJlbnREZWNsTm9kZSA9IHByZXZpb3VzRGVjbE5vZGU7Ci0JCX0KLQotCQkvLyBzYXZlIHRoZSBwcmV2aW91cyBkZWNsTm9kZQotCQlpZiAoY3VycmVudERlY2xOb2RlICE9IG51bGwpIHsKLQkJCUJhc2VOb2RlIGJhc2VOb2RlID0gbnVsbDsKLQkJCS8vIHN0cmlwIG91dCB0aGUgZW5kaW5nIG1hcmt1cCBzeW1ib2wgIj4iCi0JCQlpZiAoZGVjbGFyYXRpb25TdHJpbmcuZW5kc1dpdGgoIj4iKSkgLy8kTk9OLU5MUy0xJAotCQkJCWRlY2xhcmF0aW9uU3RyaW5nID0gZGVjbGFyYXRpb25TdHJpbmcuc3Vic3RyaW5nKDAsIGRlY2xhcmF0aW9uU3RyaW5nLmxlbmd0aCgpIC0gMSk7Ci0KLQkJCWludCBzSW5kZXg7Ci0JCQlTdHJpbmcgY1N0cmluZzsKLQkJCWludCB0eXBlID0gY3VycmVudERlY2xOb2RlLmdldFR5cGUoKTsKLQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgRGVjbE5vZGUuRUxFTUVOVCA6IHsKLQkJCQkJbmFtZSA9IFRTdHJpbmcud29yZChkZWNsYXJhdGlvblN0cmluZywgMSk7Ci0KLQkJCQkJLy8gc3RyaXAgb3V0IHRoZSBuYW1lCi0JCQkJCXNJbmRleCA9IGRlY2xhcmF0aW9uU3RyaW5nLmluZGV4T2YobmFtZSkgKyBuYW1lLmxlbmd0aCgpOwotCQkJCQljU3RyaW5nID0gZGVjbGFyYXRpb25TdHJpbmcuc3Vic3RyaW5nKHNJbmRleCk7Ci0KLQkJCQkJYmFzZU5vZGUgPSBuZXcgRWxlbWVudERlY2wobmFtZSwgY3VycmVudERURC5nZXROYW1lKCkpOwotCQkJCQlzY2FubmVyID0gbmV3IERURFNjYW5uZXIoY3VycmVudERURC5nZXROYW1lKCksIGNTdHJpbmcpOwotCQkJCQlDTU5vZGUgY29udGVudE1vZGVsID0gc2Nhbm5lci5zY2FuQ29udGVudE1vZGVsKCk7Ci0JCQkJCWlmIChjb250ZW50TW9kZWwgPT0gbnVsbCAmJiBlcnJvck1lc3NhZ2UgPT0gbnVsbCkgewotCQkJCQkJY3JlYXRlRXJyb3JNZXNzYWdlKCJFeHBlY3RpbmcgJygnIGluIGNvbnRlbnQgbW9kZWwiLCAiZXJyb3IiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQotCQkJCQkoKEVsZW1lbnREZWNsKSBiYXNlTm9kZSkuc2V0Q29udGVudE1vZGVsTm9kZShjb250ZW50TW9kZWwpOwotCQkJCQllbGVtZW50UG9vbC5wdXQobmFtZSwgYmFzZU5vZGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBEZWNsTm9kZS5JTlRFUk5BTF9FTlRJVFkgOgotCQkJCWNhc2UgRGVjbE5vZGUuRVhURVJOQUxfRU5USVRZIDogewotCQkJCQlpZiAoIXBhcnNlRXh0ZXJuYWxQRVJlZmVyZW5jZShkZWNsYXJhdGlvblN0cmluZykpIHsKLQkJCQkJCXNjYW5uZXIgPSBuZXcgRFREU2Nhbm5lcihjdXJyZW50RFRELmdldE5hbWUoKSwgZGVjbGFyYXRpb25TdHJpbmcpOwotCQkJCQkJYmFzZU5vZGUgPSBzY2FubmVyLnNjYW5FbnRpdHlEZWNsKCk7Ci0JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS1iYXNlTm9kZSAoIiArCi0JCQkJCQkvLyBkZWNsYXJhdGlvblN0cmluZyArICIpIiArIGJhc2VOb2RlKTsKLQkJCQkJCWlmICh0eXBlID09IERlY2xOb2RlLklOVEVSTkFMX0VOVElUWSAmJiBleHBhbmRlZEVudGl0eVZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQkoKEVudGl0eURlY2wpIGJhc2VOb2RlKS5leHBhbmRlZFZhbHVlID0gZXhwYW5kZWRFbnRpdHlWYWx1ZTsKLQkJCQkJCX0KLQkJCQkJCWlmIChiYXNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJZW50aXR5UG9vbC5hZGQoKEVudGl0eURlY2wpIGJhc2VOb2RlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIERlY2xOb2RlLk5PVEFUSU9OIDogewotCQkJCQlzY2FubmVyID0gbmV3IERURFNjYW5uZXIoY3VycmVudERURC5nZXROYW1lKCksIGRlY2xhcmF0aW9uU3RyaW5nKTsKLQkJCQkJYmFzZU5vZGUgPSBzY2FubmVyLnNjYW5Ob3RhdGlvbkRlY2woKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgRGVjbE5vZGUuQVRUTElTVCA6IHsKLQkJCQkJbmFtZSA9IFRTdHJpbmcud29yZChkZWNsYXJhdGlvblN0cmluZywgMSk7Ci0KLQkJCQkJLy8gc3RyaXAgb3V0IHRoZSBuYW1lCi0JCQkJCXNJbmRleCA9IGRlY2xhcmF0aW9uU3RyaW5nLmluZGV4T2YobmFtZSkgKyBuYW1lLmxlbmd0aCgpOwotCQkJCQljU3RyaW5nID0gZGVjbGFyYXRpb25TdHJpbmcuc3Vic3RyaW5nKHNJbmRleCk7Ci0KLQkJCQkJYmFzZU5vZGUgPSBuZXcgQXR0bGlzdChuYW1lLCBjdXJyZW50RFRELmdldE5hbWUoKSk7Ci0JCQkJCXNjYW5uZXIgPSBuZXcgRFREU2Nhbm5lcihjdXJyZW50RFRELmdldE5hbWUoKSwgY1N0cmluZy50cmltKCkpOwotCQkJCQlWZWN0b3IgYXR0cnMgPSBzY2FubmVyLnNjYW5BdHRsaXN0RGVjbChlbnRpdHlQb29sKTsKLQkJCQkJU3RyaW5nIGVycm9yU3RyaW5nID0gc2Nhbm5lci5nZXRFcnJvclN0cmluZygpOwotCi0JCQkJCWlmIChhdHRycy5zaXplKCkgPiAwKSB7Ci0JCQkJCQkoKEF0dGxpc3QpIGJhc2VOb2RlKS5zZXRBdHREZWZzKGF0dHJzKTsKLQkJCQkJfQotCQkJCQlpZiAoZXJyb3JTdHJpbmcgIT0gbnVsbCkgewotCQkJCQkJY3JlYXRlRXJyb3JNZXNzYWdlKGVycm9yU3RyaW5nLCAiZXJyb3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlkZWZhdWx0IDogewotCQkJCQljdXJyZW50RGVjbE5vZGUgPSBudWxsOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGJhc2VOb2RlICE9IG51bGwpIHsKLQkJCQlpZiAoY29tbWVudCAhPSBudWxsKSB7Ci0JCQkJCWJhc2VOb2RlLnNldENvbW1lbnQoY29tbWVudCk7Ci0JCQkJCWNvbW1lbnQgPSBudWxsOwotCQkJCX0KLQotCQkJCWlmIChlcnJvck1lc3NhZ2UgIT0gbnVsbCkgewotCQkJCQliYXNlTm9kZS5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQkJCQkJZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJCQl9Ci0KLQkJCQlpZiAoY3VycmVudERlY2xOb2RlICE9IG51bGwpIHsKLQkJCQkJY3VycmVudERURC5hZGREZWNsKGJhc2VOb2RlKTsKLQkJCQl9Ci0JCQkJbGFzdEJhc2VOb2RlID0gYmFzZU5vZGU7Ci0JCQl9Ci0KLQkJCWN1cnJlbnREZWNsTm9kZSA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAobGFzdEJhc2VOb2RlICE9IG51bGwgJiYgZXJyb3JNZXNzYWdlICE9IG51bGwgJiYgbGFzdEJhc2VOb2RlLmdldEVycm9yTWVzc2FnZSgpID09IG51bGwpIHsKLQkJCQlsYXN0QmFzZU5vZGUuc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0JCQkJZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQRVJlZmVyZW5jZU5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygxKTsgLy8gc3RyaXAgb3V0IHRoZSAlIGZyb20gZW50aXR5IG5hbWUKLQkJfQotCQlFbnRpdHlEZWNsIGUgPSBuZXcgRW50aXR5RGVjbChuYW1lLCBjdXJyZW50RFRELmdldE5hbWUoKSwgbnVsbCwgdHJ1ZSk7Ci0JCWUuc2V0RW50aXR5UmVmZXJlbmNlZCh0cnVlKTsKLQkJZS5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQkJZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJY3VycmVudERURC5hZGREZWNsKGUpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RURExvYWRlZChTdHJpbmcgdXJpKSB7Ci0JCWJvb2xlYW4gbG9hZGVkID0gZmFsc2U7Ci0JCVN0cmluZyBsaXN0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGR0ZExpc3QgIT0gbnVsbCkgewotCQkJRW51bWVyYXRpb24gZW4gPSBkdGRMaXN0LmVsZW1lbnRzKCk7Ci0JCQl3aGlsZSAoZW4uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlEVEQgZHRkID0gKERURCkgZW4ubmV4dEVsZW1lbnQoKTsKLQkJCQlsaXN0ICs9IGR0ZC5nZXROYW1lKCk7Ci0JCQkJbGlzdCArPSAiLCI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoZHRkLmdldE5hbWUoKS5lcXVhbHModXJpKSkgewotCQkJCQlsb2FkZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxvYWRlZDsKLQl9Ci0KLQlwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCUlucHV0U291cmNlIHJlc3VsdCA9IG51bGw7Ci0JCVVSSVJlc29sdmVyIGlkUmVzb2x2ZXIgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOwotCQlTdHJpbmcgbG9naWNhbFVSSSA9IGlkUmVzb2x2ZXIucmVzb2x2ZShjdXJyZW50RFRELmdldE5hbWUoKSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICAgICAgLy8gYnVnIDExMzUzNywgZW5zdXJlIHBoeXNpY2FsIHJlc29sdXRpb24gZ2V0cyBkb25lIGhlcmUKLQkJLy8gcmlnaHQgYmVmb3JlIHdlIGF0dGVtcHQgdG8gb3BlbiBhIHN0cmVhbQotCQlTdHJpbmcgcGh5c2ljYWxVUkkgPSBpZFJlc29sdmVyLnJlc29sdmVQaHlzaWNhbExvY2F0aW9uKGN1cnJlbnREVEQuZ2V0TmFtZSgpLCBwdWJsaWNJZCwgbG9naWNhbFVSSSk7Ci0JCXJlc3VsdCA9IG5ldyBJbnB1dFNvdXJjZShsb2dpY2FsVVJJKTsKLQkJaWYoIShwaHlzaWNhbFVSSSA9PSBudWxsIHx8IHBoeXNpY2FsVVJJLmVxdWFscygiIikgfHwgVVJJSGVscGVyLmhhc1Byb3RvY29sKHBoeXNpY2FsVVJJKSkpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkgIHBoeXNpY2FsVVJJID0gImZpbGU6Ly8vIiArIHBoeXNpY2FsVVJJOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmVzdWx0LnNldEJ5dGVTdHJlYW0obmV3IExhenlVUkxJbnB1dFN0cmVhbShwaHlzaWNhbFVSSSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vCi0JLy8gTWFpbgotCS8vCi0KLQkvKiogTWFpbiBwcm9ncmFtIGVudHJ5IHBvaW50LiAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHsKLQotCQkvLyBpcyB0aGVyZSBhbnl0aGluZyB0byBkbz8KLQkJaWYgKGFyZ3YubGVuZ3RoID09IDApIHsKLQkJCXByaW50VXNhZ2UoKTsKLQkJCVN5c3RlbS5leGl0KDEpOwotCQl9Ci0KLQkJLy8gdmFycwotCQlib29sZWFuIGNhbm9uaWNhbCA9IGZhbHNlOwotCQlib29sZWFuIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMgPSBmYWxzZTsKLQkJRFREUGFyc2VyIHBhcnNlcjsKLQotCQkvLyBjaGVjayBwYXJhbWV0ZXJzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGFyZyA9IGFyZ3ZbaV07Ci0KLQkJCS8vIG9wdGlvbnMKLQkJCWlmIChhcmcuc3RhcnRzV2l0aCgiLSIpKSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJCWlmIChhcmcuZXF1YWxzKCItYyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY2Fub25pY2FsID0gdHJ1ZTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKGFyZy5lcXVhbHMoIi14IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlleHBhbmRFbnRpdHlSZWZlcmVuY2VzID0gdHJ1ZTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKGFyZy5lcXVhbHMoIi1oIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcmludFVzYWdlKCk7Ci0JCQkJCVN5c3RlbS5leGl0KDEpOwotCQkJCX0KLQkJCX0KLQkJCXRyeSB7Ci0JCQkJcGFyc2VyID0gbmV3IERURFBhcnNlcihjYW5vbmljYWwpOwotCQkJCXBhcnNlci5zZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpOwotCQkJCXBhcnNlci5wYXJzZShhcmcpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JfSAvLyBtYWluKFN0cmluZ1tdKQotCi0JLyoqIFByaW50cyB0aGUgdXNhZ2UuICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFVzYWdlKCkgewotCi0JCVN5c3RlbS5lcnIucHJpbnRsbigidXNhZ2U6IGphdmEgc2F4LkRURFBhcnNlciAob3B0aW9ucykgdXJpIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5lcnIucHJpbnRsbigpOwotCQlTeXN0ZW0uZXJyLnByaW50bG4oIm9wdGlvbnM6Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLmVyci5wcmludGxuKCIgIC1jICAgICAgIENhbm9uaWNhbCBYTUwgb3V0cHV0LiIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5lcnIucHJpbnRsbigiICAteCAgICAgICBFeHBhbmQgZW50aXR5IHJlZmVyZW5jZXMuIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLmVyci5wcmludGxuKCIgIC1oICAgICAgIFRoaXMgaGVscCBzY3JlZW4uIik7IC8vJE5PTi1OTFMtMSQKLQotCX0gLy8gcHJpbnRVc2FnZSgpCi0KLQlwcml2YXRlIHZvaWQgc2V0RXJyb3JJbmZvcm1hdGlvbihTQVhQYXJzZUV4Y2VwdGlvbiBleCwgU3RyaW5nIHNldmVyaXR5KSB7Ci0JCWVycm9yTWVzc2FnZSA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQotCQlpZiAoZXguZ2V0TGluZU51bWJlcigpID09IC0xKSB7Ci0JCQllcnJvck1lc3NhZ2Uuc2V0RXJyb3JMaW5lKGxpbmVOdW1iZXIpOwotCQl9Ci0JCWVsc2UgewotCQkJZXJyb3JNZXNzYWdlLnNldEVycm9yTGluZShleC5nZXRMaW5lTnVtYmVyKCkpOwotCQl9Ci0KLQotCQllcnJvck1lc3NhZ2Uuc2V0RXJyb3JNZXNzYWdlKGV4LmdldE1lc3NhZ2UoKSk7Ci0JCWVycm9yTWVzc2FnZS5zZXRFcnJvckNvbHVtbihleC5nZXRDb2x1bW5OdW1iZXIoKSk7Ci0JCWVycm9yTWVzc2FnZS5zZXRTZXZlcml0eShzZXZlcml0eSk7Ci0JCWVycm9yTWVzc2FnZXMuYWRkKGVycm9yTWVzc2FnZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVycm9yTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHNldmVyaXR5KSB7Ci0JCWVycm9yTWVzc2FnZSA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQotCQlMb2NhdG9yIGxvY2F0b3IgPSBnZXRMb2NhdG9yKCk7Ci0KLQkJZXJyb3JNZXNzYWdlLnNldEVycm9yTGluZShsb2NhdG9yLmdldExpbmVOdW1iZXIoKSk7Ci0JCWVycm9yTWVzc2FnZS5zZXRFcnJvckNvbHVtbihsb2NhdG9yLmdldENvbHVtbk51bWJlcigpKTsKLQotCQllcnJvck1lc3NhZ2Uuc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOwotCQllcnJvck1lc3NhZ2Uuc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOwotCi0JCWVycm9yTWVzc2FnZXMuYWRkKGVycm9yTWVzc2FnZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9EVERTYXhBcnRpZmFjdFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURFNheEFydGlmYWN0VmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjkwNjNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURFNheEFydGlmYWN0VmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBEVERTYXhBcnRpZmFjdFZpc2l0b3IgewotCXB1YmxpYyB2b2lkIHZpc2l0RFREKERURCBkdGQpIHsKLQkJRW51bWVyYXRpb24gZW4gPSBkdGQuZXh0ZXJuYWxFbGVtZW50cygpOwotCi0JCXdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJT2JqZWN0IGUgPSBlbi5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBFbnRpdHlEZWNsKSB7Ci0JCQkJdmlzaXRFbnRpdHlEZWNsKChFbnRpdHlEZWNsKSBlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBFbGVtZW50RGVjbCkgewotCQkJCXZpc2l0RWxlbWVudERlY2woKEVsZW1lbnREZWNsKSBlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBOb3RhdGlvbkRlY2wpIHsKLQkJCQl2aXNpdE5vdGF0aW9uRGVjbCgoTm90YXRpb25EZWNsKSBlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Tm90YXRpb25EZWNsKE5vdGF0aW9uRGVjbCBub3RhdGlvbikgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2woRWxlbWVudERlY2wgZWxlbWVudCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RW50aXR5RGVjbChFbnRpdHlEZWNsIGVudGl0eSkgewotCQlpZiAoZW50aXR5LmlzRW50aXR5UmVmZXJlbmNlZCgpKSB7Ci0JCQl2aXNpdFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZURlY2woZW50aXR5KTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChlbnRpdHkuaXNFeHRlcm5hbCgpKSB7Ci0JCQkJdmlzaXRFeHRlcm5hbEVudGl0eURlY2woZW50aXR5KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXZpc2l0SW50ZXJuYWxFbnRpdHlEZWNsKGVudGl0eSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZURlY2woRW50aXR5RGVjbCBlbnRpdHkpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEV4dGVybmFsRW50aXR5RGVjbChFbnRpdHlEZWNsIGVudGl0eSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0SW50ZXJuYWxFbnRpdHlEZWNsKEVudGl0eURlY2wgZW50aXR5KSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFREU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFREU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjVjZWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURFNjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogU2Nhbm5pbmcgLyBwYXJzaW5nIHRoZSBjb250ZW50IHN0cmluZyBmcm9tIHRoZSBEZWNsIHN0YXRlbWVudAotICogCi0gKiBAdmVyc2lvbgotICovCi1wdWJsaWMgY2xhc3MgRFREU2Nhbm5lciB7Ci0JLy8gZWxlbWVudCBjb250ZW50IG1vZGVsIHN0cmluZ3MKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gZW1wdHlfc3RyaW5nID0geydFJywgJ00nLCAnUCcsICdUJywgJ1knfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gYW55X3N0cmluZyA9IHsnQScsICdOJywgJ1knfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gcGNkYXRhX3N0cmluZyA9IHsnIycsICdQJywgJ0MnLCAnRCcsICdBJywgJ1QnLCAnQSd9OwotCi0JLy8gYXR0cmlidXRlIHR5cGUgYW5kIGRlZmF1bHQgdHlwZSBzdHJpbmdzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGNkYXRhX3N0cmluZyA9IHsnQycsICdEJywgJ0EnLCAnVCcsICdBJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGlkX3N0cmluZyA9IHsnSScsICdEJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIHJlZl9zdHJpbmcgPSB7J1InLCAnRScsICdGJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGVudGl0X3N0cmluZyA9IHsnRScsICdOJywgJ1QnLCAnSScsICdUJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGllc19zdHJpbmcgPSB7J0knLCAnRScsICdTJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIG5tdG9rZW5fc3RyaW5nID0geydOJywgJ00nLCAnVCcsICdPJywgJ0snLCAnRScsICdOJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIG5vdGF0aW9uX3N0cmluZyA9IHsnTicsICdPJywgJ1QnLCAnQScsICdUJywgJ0knLCAnTycsICdOJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIHJlcXVpcmVkX3N0cmluZyA9IHsnIycsICdSJywgJ0UnLCAnUScsICdVJywgJ0knLCAnUicsICdFJywgJ0QnfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gaW1wbGllZF9zdHJpbmcgPSB7JyMnLCAnSScsICdNJywgJ1AnLCAnTCcsICdJJywgJ0UnLCAnRCd9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBmaXhlZF9zdHJpbmcgPSB7JyMnLCAnRicsICdJJywgJ1gnLCAnRScsICdEJ307Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gc3lzdGVtX3N0cmluZyA9IHsnUycsICdZJywgJ1MnLCAnVCcsICdFJywgJ00nfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gcHVibGljX3N0cmluZyA9IHsnUCcsICdVJywgJ0InLCAnTCcsICdJJywgJ0MnfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gbmRhdGFfc3RyaW5nID0geydOJywgJ0QnLCAnQScsICdUJywgJ0EnfTsKLQotCXByaXZhdGUgaW50W10gZk9wU3RhY2sgPSBudWxsOwotCXByaXZhdGUgQ01Hcm91cE5vZGVbXSBmR3JwU3RhY2sgPSBudWxsOwotCi0JcHJpdmF0ZSBFbnRpdHlQb29sIGVudGl0eVBvb2w7Ci0KLQkvKiBBdHRyaWJ1dGUgRGVmIHNjYW5uZXIgc3RhdGUgKi8KLQlzdGF0aWMgZmluYWwgaW50IEF0dF9TY2FubmVyX1N0YXRlX05hbWUgPSAxLCBBdHRfU2Nhbm5lcl9TdGF0ZV9UeXBlID0gMiwgQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGUgPSAzLCBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VmFsdWUgPSA0OwotCi0JcHJpdmF0ZSBTdHJpbmdQYXJzZXIgY29udGVudFN0cmluZzsKLQlwcml2YXRlIFN0cmluZyBjRGF0YTsKLQlwcml2YXRlIGludCBwcmV2Tm9kZU9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBpbnQgbm9kZU9mZnNldCA9IDE7Ci0JcHJpdmF0ZSBTdHJpbmcgb3duZXJEVEQ7Ci0KLQlwcml2YXRlIFN0cmluZyBlcnJvclN0cmluZzsKLQotCXB1YmxpYyBEVERTY2FubmVyKFN0cmluZyBvd25lckRURCwgU3RyaW5nIGNtKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ206ICIgKyBjbSk7Ci0JCWNvbnRlbnRTdHJpbmcgPSBuZXcgU3RyaW5nUGFyc2VyKGNtKTsKLQkJY0RhdGEgPSBjbTsKLQkJdGhpcy5vd25lckRURCA9IG93bmVyRFREOwotCX0KLQotCS8vCi0JLy8gWzQ2XSBjb250ZW50c3BlYyA6Oj0gJ0VNUFRZJyB8ICdBTlknIHwgTWl4ZWQgfCBjaGlsZHJlbgotCS8vCi0JLy8gU3BlY2lmaWMgdG8gVmlzdWFsRFREIDogYWxzbyBhbGxvd3MgJVBFUmVmZXJlbmNlOwotCS8vCi0JcHVibGljIENNTm9kZSBzY2FuQ29udGVudE1vZGVsKCkgewotCQlDTU5vZGUgY21Ob2RlID0gbnVsbDsKLQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQlpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKGVtcHR5X3N0cmluZykpIHsKLQkJCWNtTm9kZSA9IG5ldyBDTUJhc2ljTm9kZSgiRU1QVFkiLCBDTU5vZGVUeXBlLkVNUFRZKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhhbnlfc3RyaW5nKSkgewotCQkJY21Ob2RlID0gbmV3IENNQmFzaWNOb2RlKCJBTlkiLCBDTU5vZGVUeXBlLkFOWSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJyUnLCB0cnVlKSkgewotCQkJY21Ob2RlID0gbmV3IENNUmVmZXJlbmNlTm9kZShjb250ZW50U3RyaW5nLmdldERhdGEoKSwgQ01Ob2RlVHlwZS5FTlRJVFlfUkVGRVJFTkNFKTsKLQkJfQotCQllbHNlIGlmICghY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcoJywgdHJ1ZSkpIHsKLQkJCS8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgY29udGVudG1vZGVsIHN0cmluZyBpcyBiYWQuLi4KLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiISEhIGV4Y2VwdGlvbiAtIG5vICgiKTsKLQkJCXJldHVybiBjbU5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlbWFpbmluZyBTdHJpbmcgPSAiICsKLQkJCS8vIGNvbnRlbnRTdHJpbmcuZ2V0UmVtYWluaW5nU3RyaW5nKCkpOwotCi0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQlib29sZWFuIHNraXBwZWRQQ0RBVEEgPSBjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcocGNkYXRhX3N0cmluZyk7Ci0JCQlpZiAoc2tpcHBlZFBDREFUQSkgewotCQkJCWNtTm9kZSA9IHNjYW5NaXhlZCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY21Ob2RlID0gc2NhbkNoaWxkcmVuKCk7Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gY21Ob2RlOwotCX0KLQotCS8vCi0JLy8gWzUxXSBNaXhlZCA6Oj0gJygnIFM/ICcjUENEQVRBJyAoUz8gJ3wnIFM/IE5hbWUpKiBTPyAnKSonIHwgJygnIFM/Ci0JLy8gJyNQQ0RBVEEnIFM/ICcpJwotCS8vCi0JLy8gQ2FsbGVkIGFmdGVyIHNjYW5uaW5nIHBhc3QgJygnIFM/ICcjUENEQVRBJwotCS8vCi0JcHJpdmF0ZSBDTU5vZGUgc2Nhbk1peGVkKCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlNjYW5NaXhlZC4uLiIpOwotCQlDTUdyb3VwTm9kZSBjbU5vZGUgPSBuZXcgQ01Hcm91cE5vZGUoKTsKLQkJY21Ob2RlLnNldEdyb3VwS2luZChDTU5vZGVUeXBlLkdST1VQX0NIT0lDRSk7Ci0JCWNtTm9kZS5hZGRDaGlsZChuZXcgQ01CYXNpY05vZGUoIiNQQ0RBVEEiLCBDTU5vZGVUeXBlLlBDREFUQSkpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gaW50IHByZXZOb2RlSW5kZXggPSAtMTsKLQkJYm9vbGVhbiBzdGFyUmVxdWlyZWQgPSBmYWxzZTsKLQotCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkgewotCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCX0KLQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJCWlmICghY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCd8JywgdHJ1ZSkpIHsKLQkJCQlpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKScsIHRydWUpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcqJywgdHJ1ZSkpIHsKLQkJCQkJY21Ob2RlLnNldE9jY3VycmVuY2UoQ01Ob2RlVHlwZS5aRVJPX09SX01PUkUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChzdGFyUmVxdWlyZWQpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgKiBpcyByZXF1aXJlZCAuLi4gIik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkgewotCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCX0KLQotCQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJaWYgKG5vZGVPZmZzZXQgIT0gLTEpIHsKLQkJCQkvLyBza2lwIHBhc3MgInwiCi0JCQkJcHJldk5vZGVPZmZzZXQgPSBub2RlT2Zmc2V0OwotCQkJfQotCi0JCQlzdGFyUmVxdWlyZWQgPSB0cnVlOwotCQkJY29udGVudFN0cmluZy5za2lwUGFzdE5hbWVBbmRQRVJlZmVyZW5jZSgnKScpOwotCQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCi0JCQlpZiAobm9kZU9mZnNldCA9PSAtMSkKLQkJCQlicmVhazsKLQotCQkJLy8gYWRkIGxlYXZlIG5vZGUKLQkJCWludCBsZW4gPSBub2RlT2Zmc2V0IC0gcHJldk5vZGVPZmZzZXQ7Ci0JCQlTdHJpbmcgcmVmTmFtZSA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQkJcHJldk5vZGVPZmZzZXQgPSBub2RlT2Zmc2V0OwotCQkJaWYgKHJlZk5hbWUuc3RhcnRzV2l0aCgiJSIpKSAvLyROT04tTkxTLTEkCi0JCQkJY21Ob2RlLmFkZENoaWxkKG5ldyBDTVJlZmVyZW5jZU5vZGUocmVmTmFtZSwgQ01Ob2RlVHlwZS5FTlRJVFlfUkVGRVJFTkNFKSk7Ci0JCQllbHNlCi0JCQkJY21Ob2RlLmFkZENoaWxkKG5ldyBDTVJlZmVyZW5jZU5vZGUocmVmTmFtZSwgQ01Ob2RlVHlwZS5FTEVNRU5UX1JFRkVSRU5DRSkpOwotCi0JCX0gLy8gZW5kIHdoaWxlCi0KLQotCQlpZiAoY21Ob2RlLmdldENoaWxkcmVuKCkuc2l6ZSgpID09IDEpIHsKLQkJCS8vIHNpbXBsaWZ5IHRoZSBjb250ZW50TW9kZWwgaWYgdGhlIENNR3JvdXBOb2RlIG9ubHkgaGFzIG9uZSBjaGlsZAotCQkJLy8gbm9kZS4KLQkJCXJldHVybiAoQ01CYXNpY05vZGUpIGNtTm9kZS5nZXRDaGlsZHJlbigpLmVsZW1lbnRBdCgwKTsKLQkJfQotCi0JCXJldHVybiBjbU5vZGU7Ci0JfQotCi0JLy8KLQkvLyBbNDddIGNoaWxkcmVuIDo6PSAoY2hvaWNlIHwgc2VxKSAoJz8nIHwgJyonIHwgJysnKT8KLQkvLyBbNDldIGNob2ljZSA6Oj0gJygnIFM/IGNwICggUz8gJ3wnIFM/IGNwICkqIFM/ICcpJwotCS8vIFs1MF0gc2VxIDo6PSAnKCcgUz8gY3AgKCBTPyAnLCcgUz8gY3AgKSogUz8gJyknCi0JLy8gWzQ4XSBjcCA6Oj0gKE5hbWUgfCBjaG9pY2UgfCBzZXEpICgnPycgfCAnKicgfCAnKycpPwotCS8vCi0JLy8gQ2FsbGVkIGFmdGVyIHNjYW5uaW5nIHBhc3QgJygnCi0KLQlwcml2YXRlIENNTm9kZSBzY2FuQ2hpbGRyZW4oKSB7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzY2FuQ2hpbGRyZW4uLi4iKTsKLQotCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkgewotCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQl9Ci0KLQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQlpbnQgZGVwdGggPSAxOwotCQlpbml0aWFsaXplQ29udGVudE1vZGVsU3RhY2soZGVwdGgpOwotCQlpbnQgbGVuOwotCi0JCVN0cmluZyBub2RlTmFtZTsKLQkJQ01Hcm91cE5vZGUgY21Ob2RlID0gbmV3IENNR3JvdXBOb2RlKCk7Ci0JCWZHcnBTdGFja1tkZXB0aF0gPSBjbU5vZGU7Ci0KLQkJd2hpbGUgKHRydWUpIHsKLQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgQmVnaW4gb3V0dGVyIHdoaWxlIGxvb3AgLi4uIiApOwotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKCcsIHRydWUpKSB7Ci0JCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQkJLy8gc2tpcCBwYXN0IGFueSB3aGl0ZSBzcGFjZXMgYWZ0ZXIgdGhlICcoJwotCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQkJfQotCi0JCQkJZGVwdGgrKzsKLQkJCQlpbml0aWFsaXplQ29udGVudE1vZGVsU3RhY2soZGVwdGgpOwotCQkJCWZHcnBTdGFja1tkZXB0aF0gPSBuZXcgQ01Hcm91cE5vZGUoKTsKLQkJCQlmR3JwU3RhY2tbZGVwdGggLSAxXS5hZGRDaGlsZChmR3JwU3RhY2tbZGVwdGhdKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3ROYW1lQW5kUEVSZWZlcmVuY2UoJyknKTsKLQkJCW5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQotCQkJLyoKLQkJCSAqIFN5c3RlbS5vdXQucHJpbnRsbigiIHByZXZOb2RlT0Zmc2V0ICIgKyBwcmV2Tm9kZU9mZnNldCk7Ci0JCQkgKiBTeXN0ZW0ub3V0LnByaW50bG4oIiBjdXJyZW50Tm9kZU9GZnNldCAiICsgbm9kZU9mZnNldCk7Ci0JCQkgKi8KLQotCQkJbGVuID0gbm9kZU9mZnNldCAtIHByZXZOb2RlT2Zmc2V0OwotCi0JCQlpZiAobm9kZU9mZnNldCA9PSAtMSB8fCBsZW4gPCAxKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCW5vZGVOYW1lID0gY29udGVudFN0cmluZy5nZXRTdHJpbmcocHJldk5vZGVPZmZzZXQsIGxlbik7Ci0KLQkJCUNNUmVwZWF0YWJsZU5vZGUgcm47Ci0JCQlpZiAobm9kZU5hbWUuc3RhcnRzV2l0aCgiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlybiA9IG5ldyBDTVJlZmVyZW5jZU5vZGUobm9kZU5hbWUsIENNTm9kZVR5cGUuRU5USVRZX1JFRkVSRU5DRSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlybiA9IG5ldyBDTVJlZmVyZW5jZU5vZGUobm9kZU5hbWUsIENNTm9kZVR5cGUuRUxFTUVOVF9SRUZFUkVOQ0UpOwotCQkJfQotCi0JCQlmR3JwU3RhY2tbZGVwdGhdLmFkZENoaWxkKHJuKTsKLQotCQkJcHJldk5vZGVPZmZzZXQgPSBub2RlT2Zmc2V0OwotCi0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCc/JywgdHJ1ZSkpIHsKLQkJCQlybi5zZXRPY2N1cnJlbmNlKENNTm9kZVR5cGUuT1BUSU9OQUwpOwotCQkJfQotCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcqJywgdHJ1ZSkpIHsKLQkJCQlybi5zZXRPY2N1cnJlbmNlKENNTm9kZVR5cGUuWkVST19PUl9NT1JFKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKycsIHRydWUpKSB7Ci0JCQkJcm4uc2V0T2NjdXJyZW5jZShDTU5vZGVUeXBlLk9ORV9PUl9NT1JFKTsKLQkJCX0KLQotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQl9Ci0KLQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgQmVnaW4gaW5uZXIgd2hpbGUgbG9vcCAuLi4gZGVwdGggIiArCi0JCQkJLy8gZGVwdGggKTsKLQkJCQlpZiAoZk9wU3RhY2tbZGVwdGhdICE9IENNTm9kZVR5cGUuR1JPVVBfU0VRVUVOQ0UgJiYgY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCd8JywgdHJ1ZSkpIHsKLQkJCQkJZk9wU3RhY2tbZGVwdGhdID0gQ01Ob2RlVHlwZS5HUk9VUF9DSE9JQ0U7Ci0JCQkJCWZHcnBTdGFja1tkZXB0aF0uc2V0R3JvdXBLaW5kKENNTm9kZVR5cGUuR1JPVVBfQ0hPSUNFKTsKLQkJCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpCi0JCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQllbHNlIGlmIChmT3BTdGFja1tkZXB0aF0gIT0gQ01Ob2RlVHlwZS5HUk9VUF9DSE9JQ0UgJiYgY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcsJywgdHJ1ZSkpIHsKLQkJCQkJZk9wU3RhY2tbZGVwdGhdID0gQ01Ob2RlVHlwZS5HUk9VUF9TRVFVRU5DRTsKLQkJCQkJZkdycFN0YWNrW2RlcHRoXS5zZXRHcm91cEtpbmQoQ01Ob2RlVHlwZS5HUk9VUF9TRVFVRU5DRSk7Ci0JCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKQotCQkJCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKCFjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJyknLCB0cnVlKSkgewotCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgZXJyb3IgKSBub3QgZm91bmQiKTsKLQkJCQkJfQotCQkJCQkvLyBlbmQgb2YgdGhlIGN1cmVudCBncm91cCBub2RlCi0JCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJz8nLCB0cnVlKSkgewotCQkJCQkJZkdycFN0YWNrW2RlcHRoXS5zZXRPY2N1cnJlbmNlKENNTm9kZVR5cGUuT1BUSU9OQUwpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKicsIHRydWUpKSB7Ci0JCQkJCQlmR3JwU3RhY2tbZGVwdGhdLnNldE9jY3VycmVuY2UoQ01Ob2RlVHlwZS5aRVJPX09SX01PUkUpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKycsIHRydWUpKSB7Ci0JCQkJCQlmR3JwU3RhY2tbZGVwdGhdLnNldE9jY3VycmVuY2UoQ01Ob2RlVHlwZS5PTkVfT1JfTU9SRSk7Ci0JCQkJCX0KLQkJCQkJZGVwdGgtLTsKLQkJCQkJaWYgKGRlcHRoID09IDApIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKQotCQkJCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCi0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIEVuZCBlbmQgaW5uZXIgd2hpbGUgbG9vcCAuLi4gZGVwdGgKLQkJCQkJLy8gIiArIGRlcHRoICk7Ci0KLQkJCQl9Ci0JCQl9IC8vIGlubmVyIHdoaWxlCi0KLQkJCWlmIChkZXB0aCA9PSAwKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gLy8gb3V0ZXIgd2hpbGUKLQotCQlpZiAoY21Ob2RlLmdldENoaWxkcmVuKCkuc2l6ZSgpID09IDEpIHsKLQkJCS8vIHNpbXBsaWZ5IHRoZSBjb250ZW50TW9kZWwgaWYgdGhlIENNR3JvdXBOb2RlIG9ubHkgaGFzIG9uZSBjaGlsZAotCQkJLy8gbm9kZSBhbmQgdGhhdCBub2RlIGlzIGFuIGVsZW1lbnQgcmVmLgotCQkJQ01SZXBlYXRhYmxlTm9kZSBybiA9IChDTVJlcGVhdGFibGVOb2RlKSBjbU5vZGUuZ2V0Q2hpbGRyZW4oKS5lbGVtZW50QXQoMCk7Ci0JCQlpZiAocm4gaW5zdGFuY2VvZiBDTVJlZmVyZW5jZU5vZGUpIHsKLQkJCQlDTVJlZmVyZW5jZU5vZGUgcmVmID0gKENNUmVmZXJlbmNlTm9kZSkgcm47Ci0JCQkJaWYgKHJlZi5nZXRUeXBlKCkgPT0gQ01Ob2RlVHlwZS5FTEVNRU5UX1JFRkVSRU5DRSkgewotCQkJCQlpZiAocmVmLmdldE9jY3VycmVuY2UoKSA9PSBDTU5vZGVUeXBlLk9ORSkgewotCQkJCQkJcmVmLnNldE9jY3VycmVuY2UoY21Ob2RlLmdldE9jY3VycmVuY2UoKSk7Ci0JCQkJCQlyZXR1cm4gcmVmOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNtTm9kZS5nZXRPY2N1cnJlbmNlKCkgPT0gQ01Ob2RlVHlwZS5PTkUpIHsKLQkJCQkJCXJldHVybiByZWY7Ci0JCQkJCX0KLQkJCQl9IC8vIGVuZCBvZiBpZiAoKQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNtTm9kZTsKLQl9Ci0KLQkvLwotCS8vIFs1Ml0gQXR0bGlzdERlY2wgOjo9ICc8IUFUVExJU1QnIFMgTmFtZSBBdHREZWYqIFM/ICc+JwotCS8vIFs1M10gQXR0RGVmIDo6PSBTIE5hbWUgUyBBdHRUeXBlIFMgRGVmYXVsdERlY2wKLQkvLyBbNjBdIERlZmF1bHREZWNsIDo6PSAnI1JFUVVJUkVEJyB8ICcjSU1QTElFRCcgfCAoKCcjRklYRUQnIFMpPwotCS8vIEF0dFZhbHVlKQotCS8vCi0KLQlwdWJsaWMgVmVjdG9yIHNjYW5BdHRsaXN0RGVjbChFbnRpdHlQb29sIGVudGl0eVBvb2wpIHsKLQkJVmVjdG9yIGF0dExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCXRoaXMuZW50aXR5UG9vbCA9IGVudGl0eVBvb2w7Ci0KLQkJaW50IHNjYW5uZXJTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX05hbWU7Ci0JCQotCQlBdHROb2RlIGF0dE5vZGU7Ci0KLQkJd2hpbGUgKHRydWUpIHsKLQkJCWF0dE5vZGUgPSBuZXcgQXR0Tm9kZSgpOwotCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBzY2FubmVyIHN0YXRlOiAiICsgc2Nhbm5lclN0YXRlKTsKLQotCQkJLy8gc2Nhbm5pbmcgYXR0IG5hbWUKLQkJCWlmIChzY2FubmVyU3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfTmFtZSkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2NhbiBhdHQgTmFtZS4uLiIpOwotCQkJCXNjYW5uZXJTdGF0ZSA9IGNoZWNrRm9yQXR0cmlidXRlV2l0aFBFUmVmZXJlbmNlKGF0dE5vZGUsIHNjYW5uZXJTdGF0ZSk7Ci0JCQkJaWYgKHNjYW5uZXJTdGF0ZSA9PSAtMSkgewotCQkJCQlyZXR1cm4gYXR0TGlzdDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHNjYW5uaW5nIGF0dCB0eXBlCi0JCQlpZiAoc2Nhbm5lclN0YXRlID09IEF0dF9TY2FubmVyX1N0YXRlX1R5cGUpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNjYW4gYXR0IHR5cGUuLi4iKTsKLQotCQkJCWlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcoY2RhdGFfc3RyaW5nKSkgewotCQkJCQlhdHROb2RlLnR5cGUgPSBuZXcgU3RyaW5nKGNkYXRhX3N0cmluZyk7Ci0JCQkJCXNjYW5uZXJTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlOwotCQkJCX0KLQkJCQllbHNlIGlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcoaWRfc3RyaW5nKSkgewotCQkJCQlpZiAoIWNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhyZWZfc3RyaW5nKSkgewotCQkJCQkJYXR0Tm9kZS50eXBlID0gbmV3IFN0cmluZyhpZF9zdHJpbmcpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKCFjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ1MnLCB0cnVlKSkgewotCQkJCQkJYXR0Tm9kZS50eXBlID0gIklEUkVGIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYXR0Tm9kZS50eXBlID0gIklEUkVGUyI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlzY2FubmVyU3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKGVudGl0X3N0cmluZykpIHsKLQkJCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignWScsIHRydWUpKSB7Ci0JCQkJCQlhdHROb2RlLnR5cGUgPSAiRU5USVRZIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhpZXNfc3RyaW5nKSkgewotCQkJCQkJYXR0Tm9kZS50eXBlID0gIkVOVElUSUVTIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXNjYW5uZXJTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlOwotCQkJCX0KLQkJCQllbHNlIGlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcobm10b2tlbl9zdHJpbmcpKSB7Ci0JCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ1MnLCB0cnVlKSkgewotCQkJCQkJYXR0Tm9kZS50eXBlID0gIk5NVE9LRU5TIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYXR0Tm9kZS50eXBlID0gIk5NVE9LRU4iOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJc2Nhbm5lclN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhub3RhdGlvbl9zdHJpbmcpKSB7Ci0JCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKCFjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJygnLCB0cnVlKSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgbWlzc2luZyAoIGluIG5vdGF0aW9uICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJYXR0Tm9kZS50eXBlID0gIk5PVEFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlhdHROb2RlLmVudW1MaXN0ID0gc2NhbkVudW1lcmF0aW9uKGNvbnRlbnRTdHJpbmcsIHRydWUpOwotCQkJCQlzY2FubmVyU3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcoJywgdHJ1ZSkpIHsKLQkJCQkJYXR0Tm9kZS50eXBlID0gIkVOVU1FUkFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlhdHROb2RlLmVudW1MaXN0ID0gc2NhbkVudW1lcmF0aW9uKGNvbnRlbnRTdHJpbmcsIGZhbHNlKTsKLQkJCQkJc2Nhbm5lclN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzY2FubmVyU3RhdGUgPSBjaGVja0ZvckF0dHJpYnV0ZVdpdGhQRVJlZmVyZW5jZShhdHROb2RlLCBzY2FubmVyU3RhdGUpOwotCQkJCQlpZiAoc2Nhbm5lclN0YXRlID09IEF0dF9TY2FubmVyX1N0YXRlX1R5cGUpIHsKLQkJCQkJCXNldEVycm9yU3RyaW5nKCJGYWlsZWQgdG8gZmluZCB0eXBlIGZvciBhdHRyaWJ1dGUgJyIgKyBhdHROb2RlLm5hbWUgKyAiJy4gIFBsZWFzZSByZWZlciB0byB0aGUgb3JpZ2luYWwgRFREIGZpbGUuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLy8gd2UgZmFpbGVkIHRvIGZpbmQgYSB0eXBlIGZvciB0aGlzIGF0dHJpYnV0ZQotCQkJCQkJcmV0dXJuIGF0dExpc3Q7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChzY2FubmVyU3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGUpIHsKLQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzY2FuIGRlZmF1bHQgdHlwZS4uLiIpOwotCQkJCWlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcocmVxdWlyZWRfc3RyaW5nKSkgewotCQkJCQlhdHROb2RlLmRlZmF1bHRUeXBlID0gbmV3IFN0cmluZyhyZXF1aXJlZF9zdHJpbmcpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcoaW1wbGllZF9zdHJpbmcpKSB7Ci0JCQkJCWF0dE5vZGUuZGVmYXVsdFR5cGUgPSBuZXcgU3RyaW5nKGltcGxpZWRfc3RyaW5nKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcoZml4ZWRfc3RyaW5nKSkgewotCQkJCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJCQkJYXR0Tm9kZS5kZWZhdWx0VHlwZSA9IG5ldyBTdHJpbmcoZml4ZWRfc3RyaW5nKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQkvLyAiZGVmYXVsdCIKLQkJCQkJCWF0dE5vZGUuZGVmYXVsdFR5cGUgPSAiTk9GSVhFRCI7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkKLQkJCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCQkJYXR0Tm9kZS5kZWZhdWx0VmFsdWUgPSBzY2FuRGVmYXVsdEF0dFZhbHVlKGNvbnRlbnRTdHJpbmcpOwotCQkJCX0KLQkJCQlzY2FubmVyU3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9OYW1lOyAvLyBuZXh0Ci0JCQl9Ci0KLQotCQkJYXR0TGlzdC5hZGRFbGVtZW50KGF0dE5vZGUpOwotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpCi0JCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCi0JCQlpZiAobm9kZU9mZnNldCA+PSBjRGF0YS5sZW5ndGgoKSkKLQkJCQlyZXR1cm4gYXR0TGlzdDsKLQotCQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQotCQl9Ly8gZW5kIHdoaWxlIGxvb3AKLQl9Ci0KLQkvLwotCS8vIGNvbnRlbnQgbW9kZWwgc3RhY2sKLQkvLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQ29udGVudE1vZGVsU3RhY2soaW50IGRlcHRoKSB7Ci0JCWlmIChmT3BTdGFjayA9PSBudWxsKSB7Ci0JCQlmT3BTdGFjayA9IG5ldyBpbnRbOF07Ci0JCQlmR3JwU3RhY2sgPSBuZXcgQ01Hcm91cE5vZGVbOF07Ci0JCX0KLQkJZWxzZSBpZiAoZGVwdGggPT0gZk9wU3RhY2subGVuZ3RoKSB7Ci0JCQlpbnRbXSBuZXdTdGFjayA9IG5ldyBpbnRbZGVwdGggKiAyXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZk9wU3RhY2ssIDAsIG5ld1N0YWNrLCAwLCBkZXB0aCk7Ci0JCQlmT3BTdGFjayA9IG5ld1N0YWNrOwotCi0JCQlDTUdyb3VwTm9kZVtdIG5ld0dycFN0YWNrID0gbmV3IENNR3JvdXBOb2RlW2RlcHRoICogMl07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGZHcnBTdGFjaywgMCwgbmV3R3JwU3RhY2ssIDAsIGRlcHRoKTsKLQkJCWZHcnBTdGFjayA9IG5ld0dycFN0YWNrOwotCQl9Ci0JCWZPcFN0YWNrW2RlcHRoXSA9IC0xOwotCQlmR3JwU3RhY2tbZGVwdGhdID0gbnVsbDsKLQl9Ci0KLQkvLwotCXByaXZhdGUgaW50IGNoZWNrRm9yQXR0cmlidXRlV2l0aFBFUmVmZXJlbmNlKEF0dE5vZGUgYXR0Tm9kZSwgaW50IHNjYW5uZXJTdGF0ZSkgewotCQlpbnQgc3RhdGUgPSAtMTsKLQkJaW50IGxlbjsKLQkJU3RyaW5nIHJhd1RleHQ7Ci0JCUVudGl0eURlY2wgcEVudGl0eTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBjaGVja2ZvckFUVFBFUlJlZmVyZW5jZS0gc3RhcnQgc2Nhbm5lclN0YXRlOiAiCi0JCS8vICsgc2Nhbm5lclN0YXRlKTsKLQkJaWYgKHNjYW5uZXJTdGF0ZSA9PSBBdHRfU2Nhbm5lcl9TdGF0ZV9OYW1lKSB7Ci0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0TmFtZUFuZFBFUmVmZXJlbmNlKCcgJyk7Ci0JCQlub2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQlsZW4gPSBub2RlT2Zmc2V0IC0gcHJldk5vZGVPZmZzZXQ7Ci0KLQkJCXJhd1RleHQgPSBjb250ZW50U3RyaW5nLmdldFN0cmluZyhwcmV2Tm9kZU9mZnNldCwgbGVuKTsKLQkJCWF0dE5vZGUubmFtZSA9IHJhd1RleHQ7Ci0KLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhdGVfbmFtZSA6ICIgKyByYXdUZXh0KTsKLQotCQkJaWYgKHJhd1RleHQuc3RhcnRzV2l0aCgiJSIpICYmIHJhd1RleHQuZW5kc1dpdGgoIjsiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTdHJpbmcgcGUgPSByYXdUZXh0LnN1YnN0cmluZygxLCByYXdUZXh0Lmxlbmd0aCgpIC0gMSk7Ci0KLQkJCQlwRW50aXR5ID0gZW50aXR5UG9vbC5yZWZlclBhcmEocGUpOwotCQkJCWlmIChwRW50aXR5ICE9IG51bGwpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgbmFtZSA6IiArIHJhd1RleHQgKyIgZXhwYW5kVG86IiArCi0JCQkJCS8vIHBFbnRpdHkuZXhwYW5kZWRWYWx1ZSk7Ci0JCQkJCXN0YXRlID0gd2hhdElzVGhlTmV4dEF0dHJpYnV0ZVNjYW5uaW5nU3RhdGUocEVudGl0eS5leHBhbmRlZFZhbHVlLCBzY2FubmVyU3RhdGUpOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNoZWNrRm9yQXR0cndpdGhQRVIgLSBuZXh0c3RhdGU6ICIKLQkJCQkJLy8gKyBzdGF0ZSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJc3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9UeXBlOwotCQkJfQotCQkJZWxzZQotCQkJCXN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfVHlwZTsKLQotCQl9Ci0JCWVsc2UgaWYgKHNjYW5uZXJTdGF0ZSA9PSBBdHRfU2Nhbm5lcl9TdGF0ZV9UeXBlKSB7Ci0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCclJywgdHJ1ZSkpIHsKLQkJCQlyYXdUZXh0ID0gZ2V0UEVOYW1lKCk7Ci0JCQkJYXR0Tm9kZS50eXBlID0gIiUiICsgcmF3VGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBwZU5hbWUgPSByYXdUZXh0LnN1YnN0cmluZygwLCByYXdUZXh0Lmxlbmd0aCgpIC0gMSk7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdGF0ZV90eXBlIDogcGUtICIgKyBwZU5hbWUpOwotCQkJCXBFbnRpdHkgPSBlbnRpdHlQb29sLnJlZmVyUGFyYShwZU5hbWUpOwotCQkJCWlmIChwRW50aXR5ICE9IG51bGwpIHsKLQkJCQkJc3RhdGUgPSB3aGF0SXNUaGVOZXh0QXR0cmlidXRlU2Nhbm5pbmdTdGF0ZShwRW50aXR5LmV4cGFuZGVkVmFsdWUsIHNjYW5uZXJTdGF0ZSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJc3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlzdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX1R5cGU7Ci0JCX0KLQkJZWxzZSBpZiAoc2Nhbm5lclN0YXRlID09IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlKSB7Ci0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCclJywgdHJ1ZSkpIHsKLQkJCQlyYXdUZXh0ID0gZ2V0UEVOYW1lKCk7Ci0JCQkJYXR0Tm9kZS5kZWZhdWx0VHlwZSA9IHJhd1RleHQ7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdGF0ZV9kZWZhdWx0VHlwZSA6ICIgKyByYXdUZXh0KTsKLQkJCQlwRW50aXR5ID0gZW50aXR5UG9vbC5yZWZlclBhcmEocmF3VGV4dC5zdWJzdHJpbmcoMSwgcmF3VGV4dC5sZW5ndGgoKSAtIDEpKTsKLQkJCQlpZiAocEVudGl0eSAhPSBudWxsKSB7Ci0JCQkJCXN0YXRlID0gd2hhdElzVGhlTmV4dEF0dHJpYnV0ZVNjYW5uaW5nU3RhdGUocEVudGl0eS5leHBhbmRlZFZhbHVlLCBzY2FubmVyU3RhdGUpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFZhbHVlOwotCQkJfQotCQkJZWxzZQotCQkJCXN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGU7Ci0JCX0KLQkJZWxzZSBpZiAoc2Nhbm5lclN0YXRlID09IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRWYWx1ZSkgewotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignJScsIHRydWUpKSB7Ci0JCQkJcmF3VGV4dCA9IGdldFBFTmFtZSgpOwotCQkJCWF0dE5vZGUuZGVmYXVsdFZhbHVlID0gcmF3VGV4dDsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXRlX2RlZmF1bHRWYWx1ZSA6ICIgKyByYXdUZXh0KTsKLQotCQkJCXBFbnRpdHkgPSBlbnRpdHlQb29sLnJlZmVyUGFyYShyYXdUZXh0LnN1YnN0cmluZygxLCByYXdUZXh0Lmxlbmd0aCgpIC0gMSkpOwotCQkJCWlmIChwRW50aXR5ICE9IG51bGwpIHsKLQkJCQkJc3RhdGUgPSB3aGF0SXNUaGVOZXh0QXR0cmlidXRlU2Nhbm5pbmdTdGF0ZShwRW50aXR5LmV4cGFuZGVkVmFsdWUsIHNjYW5uZXJTdGF0ZSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJc3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VmFsdWU7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJc3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VmFsdWU7Ci0JCX0KLQotCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkKLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJcmV0dXJuIHN0YXRlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFBFTmFtZSgpIHsKLQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJY29udGVudFN0cmluZy5za2lwVG9DaGFyKCc7JywgdHJ1ZSk7Ci0JCW5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJaW50IGxlbiA9IG5vZGVPZmZzZXQgLSBwcmV2Tm9kZU9mZnNldDsKLQkJcmV0dXJuIGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCX0KLQotCXByaXZhdGUgaW50IHdoYXRJc1RoZU5leHRBdHRyaWJ1dGVTY2FubmluZ1N0YXRlKFN0cmluZyBhdHRyQ29udGVudFN0cmluZywgaW50IGN1cnJlbnRTdGF0ZSkgewotCQlTdHJpbmdQYXJzZXIgc3AgPSBuZXcgU3RyaW5nUGFyc2VyKGF0dHJDb250ZW50U3RyaW5nLnRyaW0oKSk7Ci0KLQotCQlpbnQgbmV4dFN0YXRlID0gY3VycmVudFN0YXRlOwotCQlpbnQgbk9mZnNldCA9IDA7Ci0KLQkJLyoKLQkJICogU3lzdGVtLm91dC5wcmludGxuKCJXaGF0aXN0aGVOZXh0IEF0dENvbnRlbnRTdHJpbmd0IDogIiArCi0JCSAqIGF0dHJDb250ZW50U3RyaW5nKTsgU3lzdGVtLm91dC5wcmludGxuKCJXaGF0aXN0aGVOZXh0Ci0JCSAqIEF0dENvbnRlbnRTdHJpbmdMIDogIiArIGF0dHJDb250ZW50U3RyaW5nLmxlbmd0aCgpKTsKLQkJICogU3lzdGVtLm91dC5wcmludGxuKCJXaGF0aXN0aGVOZXh0IGN1cnJlbnRzdGF0ZSA6ICIgKyBjdXJyZW50U3RhdGUpOwotCQkgKi8KLQotCQl3aGlsZSAodHJ1ZSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJXaGF0aXN0aGVOZXh0IGluc2lkZSB3aGlsIG5leHRzdGF0ZSA6ICIgKwotCQkJLy8gbmV4dFN0YXRlKTsKLQkJCWlmIChuZXh0U3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfTmFtZSkgeyAvLyB0aGUgY3VycmVudAotCQkJCQkJCQkJCQkJCQkvLyBzY2FubmluZyBzdGF0ZSBpcwotCQkJCQkJCQkJCQkJCQkvLyBBdHRyIE5hbWUsIGlzIHRoZQotCQkJCQkJCQkJCQkJCQkvLyBuZXh0IHBhcnQgQXR0ciBUeXBlCi0JCQkJCQkJCQkJCQkJCS8vID8KLQkJCQlpZiAoaXNBdHRyTmFtZShzcCkpIHsKLQkJCQkJbmV4dFN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfVHlwZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXh0U3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfVHlwZSkgeyAvLyB0aGUgY3VycmVudAotCQkJCQkJCQkJCQkJCQkJLy8gc2Nhbm5pbmcgc3RhdGUKLQkJCQkJCQkJCQkJCQkJCS8vIGlzIEF0dHIgVHlwZSwKLQkJCQkJCQkJCQkJCQkJCS8vIGlzIHRoZSBuZXh0Ci0JCQkJCQkJCQkJCQkJCQkvLyBwYXJ0IERlZmF1bHQKLQkJCQkJCQkJCQkJCQkJCS8vIEF0dHIgVHlwZSA/Ci0KLQkJCQlpZiAoaXNBdHRyVHlwZShzcCkpIHsKLQkJCQkJbmV4dFN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGU7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJXaGF0aXN0aGVOZXh0IEF0dHIgUGFydCAtIGlzIG5vdCBhbiBBdHRyIFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQl9Ci0KLQkJCWlmIChuZXh0U3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGUpIHsKLQotCQkJCWludCBkVHlwZSA9IGlzQXR0ckRlZmF1bHRUeXBlKHNwKTsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIldoYXRpc3RoZU5leHQgaW5zaWRlIGRUeXBlIDogIiArCi0JCQkJLy8gZFR5cGUpOwotCQkJCWlmIChkVHlwZSA9PSAxKSAvLyAjUkVRVUlSRUQgb3IgI0lNUExJRUQKLQkJCQl7Ci0JCQkJCW5leHRTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX05hbWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoZFR5cGUgPT0gMikgLy8gI0ZJWEVECi0JCQkJCXsKLQkJCQkJCS8vIG5lZWQgdG8gbG9vayBhdCB0aGlzIGFnYWluCi0JCQkJCQluZXh0U3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZTsKLQkJCQkJfQotCi0JCQkJCWlmIChzY2FuRGVmYXVsdEF0dFZhbHVlKHNwKSAhPSBudWxsKSB7Ci0JCQkJCQluZXh0U3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9OYW1lOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXNwLnNraXBQYXN0U3BhY2VzKCk7Ci0KLQkJCWlmIChuT2Zmc2V0ID09IHNwLmdldEN1cnJlbnRPZmZzZXQoKSkKLQkJCQlicmVhazsKLQotCQkJbk9mZnNldCA9IHNwLmdldEN1cnJlbnRPZmZzZXQoKTsKLQotCQkJaWYgKG5PZmZzZXQgPj0gYXR0ckNvbnRlbnRTdHJpbmcubGVuZ3RoKCkgfHwgbk9mZnNldCA9PSAtMSkKLQkJCQlicmVhazsKLQotCQl9IC8vIGVuZCB3aGlsZQotCi0JCXJldHVybiBuZXh0U3RhdGU7Ci0JfQotCi0KLQlwcml2YXRlIGJvb2xlYW4gaXNBdHRyTmFtZShTdHJpbmdQYXJzZXIgc3ApIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpc0F0dHJOYW1lIC0gc3A6IiArIHNwLmZEYXRhKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpc0F0dHJOYW1lIC0gY3VycmVudE9mZnNldDoiICsKLQkJLy8gc3AuZ2V0Q3VycmVudE9mZnNldCgpKTsKLQkJYm9vbGVhbiBpc0F0dHJOYW1lID0gZmFsc2U7Ci0JCWludCBwcmV2ID0gc3AuZ2V0Q3VycmVudE9mZnNldCgpOwotCQlzcC5za2lwUGFzdE5hbWUoJyAnKTsKLQkJaWYgKChzcC5nZXRDdXJyZW50T2Zmc2V0KCkgLSBwcmV2KSA+IDApCi0JCQlpc0F0dHJOYW1lID0gdHJ1ZTsKLQkJcmV0dXJuIGlzQXR0ck5hbWU7Ci0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNBdHRyVHlwZShTdHJpbmdQYXJzZXIgc3ApIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpc0F0dHJUeXBlIC0gc3A6IiArIHNwLmZEYXRhKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpc0F0dHJUeXBlIC0gY3VycmVudE9mZnNldDoiICsKLQkJLy8gc3AuZ2V0Q3VycmVudE9mZnNldCgpKTsKLQkJYm9vbGVhbiBpc0F0dHJUeXBlID0gZmFsc2U7Ci0JCWlmIChzcC5za2lwcGVkU3RyaW5nKGNkYXRhX3N0cmluZykpIHsKLQkJCWlzQXR0clR5cGUgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHNwLnNraXBwZWRTdHJpbmcoaWRfc3RyaW5nKSkgewotCQkJaWYgKCFzcC5za2lwcGVkU3RyaW5nKHJlZl9zdHJpbmcpKSB7Ci0JCQkJaXNBdHRyVHlwZSA9IHRydWU7IC8vIElECi0JCQl9Ci0JCQllbHNlIGlmICghc3AubG9va2luZ0F0Q2hhcignUycsIHRydWUpKSB7Ci0JCQkJaXNBdHRyVHlwZSA9IHRydWU7IC8vIElEUkVGUwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaXNBdHRyVHlwZSA9IHRydWU7IC8vIElEUkVGCi0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoc3Auc2tpcHBlZFN0cmluZyhlbnRpdF9zdHJpbmcpKSB7Ci0JCQlpZiAoc3AubG9va2luZ0F0Q2hhcignWScsIHRydWUpKSB7Ci0JCQkJaXNBdHRyVHlwZSA9IHRydWU7IC8vIEVOVElUWQotCQkJfQotCQkJZWxzZSBpZiAoc3Auc2tpcHBlZFN0cmluZyhpZXNfc3RyaW5nKSkgewotCQkJCWlzQXR0clR5cGUgPSB0cnVlOyAvLyBFTlRJVElURVMKLQkJCX0KLQkJfQotCQllbHNlIGlmIChzcC5za2lwcGVkU3RyaW5nKG5tdG9rZW5fc3RyaW5nKSkgewotCQkJaWYgKHNwLmxvb2tpbmdBdENoYXIoJ1MnLCB0cnVlKSkgewotCQkJCWlzQXR0clR5cGUgPSB0cnVlOyAvLyBOTVRPS0VOUwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaXNBdHRyVHlwZSA9IHRydWU7IC8vIE5NVE9LRU4KLQkJCX0KLQkJfQotCQllbHNlIGlmIChzcC5za2lwcGVkU3RyaW5nKG5vdGF0aW9uX3N0cmluZykpIHsKLQkJCWlmICghc3AubG9va2luZ0F0Q2hhcignKCcsIHRydWUpKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgbWlzc2luZyAoIGluIG5vdGF0aW9uICIpOwotCQkJfQotCQkJVmVjdG9yIGVudW1MaXN0ID0gc2NhbkVudW1lcmF0aW9uKHNwLCB0cnVlKTsKLQkJCWlmIChlbnVtTGlzdCA9PSBudWxsIHx8IGVudW1MaXN0LnNpemUoKSA9PSAwKQotCQkJCWlzQXR0clR5cGUgPSBmYWxzZTsKLQkJCWVsc2UKLQkJCQlpc0F0dHJUeXBlID0gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChzcC5sb29raW5nQXRDaGFyKCcoJywgdHJ1ZSkpIHsKLQkJCS8vICJFTlVNRVJBVElPTiI7Ci0JCQlWZWN0b3IgZW51bUxpc3QgPSBzY2FuRW51bWVyYXRpb24oc3AsIGZhbHNlKTsKLQkJCWlmIChlbnVtTGlzdCA9PSBudWxsIHx8IGVudW1MaXN0LnNpemUoKSA9PSAwKQotCQkJCWlzQXR0clR5cGUgPSBmYWxzZTsKLQkJCWVsc2UKLQkJCQlpc0F0dHJUeXBlID0gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBpc0F0dHJUeXBlOwotCi0JfQotCi0JLyoKLQkgKiByZXR1cm4gMCAtIG5vdCBkZWZhdWx0IHR5cGUgMSAtICNSRVFVSVJFRCBvciAjSU1QTElFRCAyIC0gI0ZJWEVECi0JICovCi0KLQlwcml2YXRlIGludCBpc0F0dHJEZWZhdWx0VHlwZShTdHJpbmdQYXJzZXIgc3ApIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpc0F0dHJEZWZhdWx0VHlwZSAtIHNwOiIgKyBzcC5mRGF0YSk7Ci0JCWludCByZXN1bHQgPSAwOwotCQlpZiAoc3Auc2tpcHBlZFN0cmluZyhyZXF1aXJlZF9zdHJpbmcpKSB7Ci0JCQlyZXN1bHQgPSAxOwotCQl9Ci0JCWVsc2UgaWYgKHNwLnNraXBwZWRTdHJpbmcoaW1wbGllZF9zdHJpbmcpKSB7Ci0JCQlyZXN1bHQgPSAxOwotCQl9Ci0JCWVsc2UgaWYgKHNwLnNraXBwZWRTdHJpbmcoZml4ZWRfc3RyaW5nKSkgewotCQkJcmVzdWx0ID0gMjsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vCi0JLy8gWzU4XSBOb3RhdGlvblR5cGUgOjo9ICdOT1RBVElPTicgUyAnKCcgUz8gTmFtZSAoUz8gJ3wnIFM/IE5hbWUpKiBTPyAnKScKLQkvLyBbNTldIEVudW1lcmF0aW9uIDo6PSAnKCcgUz8gTm10b2tlbiAoUz8gJ3wnIFM/IE5tdG9rZW4pKiBTPyAnKScKLQkvLwotCS8vIENhbGxlZCBhZnRlciBzY2FubmluZyAnKCcKLQkvLwotCXByaXZhdGUgVmVjdG9yIHNjYW5FbnVtZXJhdGlvbihTdHJpbmdQYXJzZXIgc3AsIGJvb2xlYW4gaXNOb3RhdGlvblR5cGUpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgc2NhbkVudW0gLi4uIik7Ci0JCVZlY3RvciBlbnVtTGlzdCA9IG51bGw7Ci0JCWludCBsZW47Ci0KLQkJaWYgKHNwLmxvb2tpbmdBdFNwYWNlKHRydWUpKQotCQkJc3Auc2tpcFBhc3RTcGFjZXMoKTsKLQotCQlpbnQgcHJldk5vZGVPZmZzZXQgPSBzcC5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCWludCBub2RlT2Zmc2V0OwotCi0JCVN0cmluZyBub2RlTmFtZTsKLQotCQl3aGlsZSAodHJ1ZSkgewotCi0JCQlpZiAoaXNOb3RhdGlvblR5cGUpCi0JCQkJc3Auc2tpcFBhc3ROYW1lQW5kUEVSZWZlcmVuY2UoJyknKTsKLQkJCWVsc2UKLQkJCQlzcC5za2lwUGFzdE5tdG9rZW5BbmRQRVJlZmVyZW5jZSgnKScpOwotCi0JCQlub2RlT2Zmc2V0ID0gc3AuZ2V0Q3VycmVudE9mZnNldCgpOwotCi0JCQlpZiAobm9kZU9mZnNldCA9PSAtMSkgewotCQkJCXJldHVybiBlbnVtTGlzdDsKLQkJCX0KLQotCQkJbGVuID0gbm9kZU9mZnNldCAtIHByZXZOb2RlT2Zmc2V0OwotCQkJbm9kZU5hbWUgPSBzcC5nZXRTdHJpbmcocHJldk5vZGVPZmZzZXQsIGxlbik7Ci0KLQkJCWlmIChlbnVtTGlzdCA9PSBudWxsKQotCQkJCWVudW1MaXN0ID0gbmV3IFZlY3RvcigpOwotCi0JCQllbnVtTGlzdC5hZGRFbGVtZW50KG5vZGVOYW1lKTsKLQotCQkJaWYgKHNwLmxvb2tpbmdBdFNwYWNlKHRydWUpKQotCQkJCXNwLnNraXBQYXN0U3BhY2VzKCk7Ci0KLQkJCWlmICghc3AubG9va2luZ0F0Q2hhcignfCcsIHRydWUpKSB7Ci0JCQkJaWYgKCFzcC5sb29raW5nQXRDaGFyKCcpJywgdHJ1ZSkpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJzY2FubmluZyBlbnVtIHZhbHVlcyAtIGVycm9yIG1pc3NpbmcgJyknIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoc3AubG9va2luZ0F0U3BhY2UodHJ1ZSkpCi0JCQkJc3Auc2tpcFBhc3RTcGFjZXMoKTsKLQotCQkJcHJldk5vZGVPZmZzZXQgPSBzcC5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGVudW1MaXN0OwotCX0KLQotCS8vCi0JLy8gWzEwXSBBdHRWYWx1ZSA6Oj0gJyInIChbXjwmIl0gfCBSZWZlcmVuY2UpKiAnIicKLQkvLyB8ICInIiAoW148JiddIHwgUmVmZXJlbmNlKSogIiciCi0JLy8KLQkvKioKLQkgKiBTY2FuIHRoZSBkZWZhdWx0IHZhbHVlIGluIGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50VHlwZQotCSAqICAgICAgICAgICAgaGFuZGxlIHRvIHRoZSBlbGVtZW50IHRoYXQgb3ducyB0aGUgYXR0cmlidXRlCi0JICogQHBhcmFtIGF0dHJOYW1lCi0JICogICAgICAgICAgICBoYW5kbGUgaW4gdGhlIHN0cmluZyBwb29sIGZvciB0aGUgYXR0cmlidXRlIG5hbWUKLQkgKiBAcmV0dXJuIGhhbmRsZSBpbiB0aGUgc3RyaW5nIHBvb2wgZm9yIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZSB2YWx1ZQotCSAqIEBleGNlcHRpb24gamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgc2NhbkRlZmF1bHRBdHRWYWx1ZShTdHJpbmdQYXJzZXIgc3ApIHsKLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzY2FuIGRlZmF1bHQgQVRUIFZhbHVlLi4uIHNwOiIgKyBzcC5mRGF0YSk7Ci0KLQkJc3Auc2tpcFBhc3RTcGFjZXMoKTsKLQotCQlib29sZWFuIHNpbmdsZTsKLQkJaWYgKCEoc2luZ2xlID0gc3AubG9va2luZ0F0Q2hhcignXCcnLCB0cnVlKSkgJiYgIXNwLmxvb2tpbmdBdENoYXIoJ1wiJywgdHJ1ZSkpIHsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCi0JCWNoYXIgcWNoYXIgPSBzaW5nbGUgPyAnXCcnIDogJ1wiJzsKLQkJaW50IHNPZmZzZXQgPSBzcC5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCS8vQlVHIDIwMzQ5NCAtIFNraXAgdG8gdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUgcWNoYXIgdGhhdCB3YXkKLQkJLy8gYWxsIGNoYXJhY3RlcnMgYmV0d2VlbiBhcmUgb2J0YWluZWQKLQkJc3Auc2tpcFRvTGFzdE9mQ2hhcihxY2hhciwgdHJ1ZSk7Ci0JCWludCBsZW4gPSBzcC5nZXRDdXJyZW50T2Zmc2V0KCkgLSBzT2Zmc2V0IC0gMTsKLQkJaWYgKGxlbiA9PSAwKQotCQkJdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQl2YWx1ZSA9IHNwLmdldFN0cmluZyhzT2Zmc2V0LCBsZW4pOwotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvLwotCS8vIFs3MF0gRW50aXR5RGVjbCA6Oj0gR0VEZWNsIHwgUEVEZWNsCi0JLy8gWzcxXSBHRURlY2wgOjo9ICc8IUVOVElUWScgUyBOYW1lIFMgRW50aXR5RGVmIFM/ICc+JwotCS8vIFs3Ml0gUEVEZWNsIDo6PSAnPCFFTlRJVFknIFMgJyUnIFMgTmFtZSBTIFBFRGVmIFM/ICc+JwotCS8vIFs3M10gRW50aXR5RGVmIDo6PSBFbnRpdHlWYWx1ZSB8IChFeHRlcm5hbElEIE5EYXRhRGVjbD8pCi0JLy8gWzc0XSBQRURlZiA6Oj0gRW50aXR5VmFsdWUgfCBFeHRlcm5hbElECi0JLy8gWzc1XSBFeHRlcm5hbElEIDo6PSAnU1lTVEVNJyBTIFN5c3RlbUxpdGVyYWwKLQkvLyB8ICdQVUJMSUMnIFMgUHViaWRMaXRlcmFsIFMgU3lzdGVtTGl0ZXJhbAotCS8vIFs3Nl0gTkRhdGFEZWNsIDo6PSBTICdOREFUQScgUyBOYW1lCi0JLy8gWzldIEVudGl0eVZhbHVlIDo6PSAnIicgKFteJSYiXSB8IFBFUmVmZXJlbmNlIHwgUmVmZXJlbmNlKSogJyInCi0JLy8gfCAiJyIgKFteJSYnXSB8IFBFUmVmZXJlbmNlIHwgUmVmZXJlbmNlKSogIiciCi0JLy8KLQkvLyBDYWxsZWQgYWZ0ZXIgc2Nhbm5pbmcgJ0VOVElUWScKLQkvLwotCXB1YmxpYyBFbnRpdHlEZWNsIHNjYW5FbnRpdHlEZWNsKCkgewotCQlwcmV2Tm9kZU9mZnNldCA9IDE7Ci0JCW5vZGVPZmZzZXQgPSAxOwotCQlpbnQgbGVuOwotCQlib29sZWFuIGlzUEVEZWNsID0gZmFsc2U7Ci0JCUVudGl0eURlY2wgZW50aXR5RGVjbCA9IG51bGw7Ci0KLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlTdHJpbmcgbmRhdGEgPSBudWxsOwotCi0JCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQlpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignJScsIHRydWUpKSB7Ci0JCQkJaXNQRURlY2wgPSBmYWxzZTsgLy8gPCFFTlRJVFkgeCAieCI+Ci0JCQl9Ci0JCQllbHNlIGlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQkJaXNQRURlY2wgPSB0cnVlOyAvLyA8IUVOVElUWSAlIHggIngiPgotCQkJfQotCQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3ROYW1lKCcgJyk7Ci0JCQlub2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQlsZW4gPSBub2RlT2Zmc2V0IC0gcHJldk5vZGVPZmZzZXQ7Ci0JCQlpZiAobGVuID4gMCkgewotCQkJCW5hbWUgPSBjb250ZW50U3RyaW5nLmdldFN0cmluZyhwcmV2Tm9kZU9mZnNldCwgbGVuKTsKLQkJCQlwcmV2Tm9kZU9mZnNldCA9IG5vZGVPZmZzZXQ7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCi0JCWJvb2xlYW4gc2luZ2xlOwotCQlpZiAoKHNpbmdsZSA9IGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignXCcnLCB0cnVlKSkgfHwgY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCdcIicsIHRydWUpKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBzY2FuRW50aXR5VmFsdWUoc2luZ2xlKTsKLQkJCWVudGl0eURlY2wgPSBuZXcgRW50aXR5RGVjbChuYW1lLCBvd25lckRURCwgdmFsdWUsIGlzUEVEZWNsKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGV4dGVybmFsIGVudGl0eQotCQkJRXh0ZXJuYWxJRCB4SUQgPSBzY2FuRXh0ZXJuYWxJRCgpOwotCQkJaWYgKHhJRCAhPSBudWxsKSB7Ci0JCQkJaWYgKCFpc1BFRGVjbCkgLy8gZ2VuZXJhbCBlbnRpdHkKLQkJCQl7Ci0JCQkJCWJvb2xlYW4gdW5wYXJzZWQgPSBmYWxzZTsKLQkJCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJCQl1bnBhcnNlZCA9IGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhuZGF0YV9zdHJpbmcpOwotCQkJCQlpZiAodW5wYXJzZWQpIHsKLQkJCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0TmFtZSgnICcpOwotCQkJCQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJCQkJbGVuID0gbm9kZU9mZnNldCAtIHByZXZOb2RlT2Zmc2V0OwotCQkJCQkJbmRhdGEgPSBjb250ZW50U3RyaW5nLmdldFN0cmluZyhwcmV2Tm9kZU9mZnNldCwgbGVuKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbnRpdHlEZWNsID0gbmV3IEVudGl0eURlY2wobmFtZSwgb3duZXJEVEQsIHhJRCwgaXNQRURlY2wsIG5kYXRhKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW50aXR5RGVjbDsKLQl9Ci0KLQotCS8vCi0JLy8gWzgyXSBOb3RhdGlvbkRlY2wgOjo9ICc8IU5PVEFUSU9OJyBTIE5hbWUgUyAoRXh0ZXJuYWxJRCB8IFB1YmxpY0lEKSBTPwotCS8vICc+JwotCS8vIFs3NV0gRXh0ZXJuYWxJRCA6Oj0gJ1NZU1RFTScgUyBTeXN0ZW1MaXRlcmFsCi0JLy8gfCAnUFVCTElDJyBTIFB1YmlkTGl0ZXJhbCBTIFN5c3RlbUxpdGVyYWwKLQkvLyBbODNdIFB1YmxpY0lEIDo6PSAnUFVCTElDJyBTIFB1YmlkTGl0ZXJhbAotCS8vCi0JLy8gQ2FsbGVkIGFmdGVyIHNjYW5uaW5nICdOT1RBVElPTicKLQkvLwotCXB1YmxpYyBOb3RhdGlvbkRlY2wgc2Nhbk5vdGF0aW9uRGVjbCgpIHsKLQkJcHJldk5vZGVPZmZzZXQgPSAxOwotCQlub2RlT2Zmc2V0ID0gMTsKLQkJaW50IGxlbjsKLQkJTm90YXRpb25EZWNsIG5vdGF0aW9uRGVjbCA9IG51bGw7Ci0KLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCi0JCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJY29udGVudFN0cmluZy5za2lwUGFzdE5hbWUoJyAnKTsKLQkJCW5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJCWxlbiA9IG5vZGVPZmZzZXQgLSBwcmV2Tm9kZU9mZnNldDsKLQkJCWlmIChsZW4gPiAwKSB7Ci0JCQkJbmFtZSA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQkJCXByZXZOb2RlT2Zmc2V0ID0gbm9kZU9mZnNldDsKLQkJCX0KLQkJfQotCi0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJbm90YXRpb25EZWNsID0gbmV3IE5vdGF0aW9uRGVjbChuYW1lLCBvd25lckRURCk7Ci0KLQkJRXh0ZXJuYWxJRCB4SUQgPSBzY2FuRXh0ZXJuYWxJRCgpOwotCQlpZiAoeElEICE9IG51bGwpIHsKLQkJCWlmICh4SUQuZ2V0U3lzdGVtTGl0ZXJhbCgpICE9IG51bGwpIHsKLQkJCQlub3RhdGlvbkRlY2wuc2V0U3lzdGVtSWQoeElELmdldFN5c3RlbUxpdGVyYWwoKSk7Ci0JCQl9Ci0JCQlpZiAoeElELmdldFB1YklkTGl0ZXJhbCgpICE9IG51bGwpIHsKLQkJCQlub3RhdGlvbkRlY2wuc2V0UHVibGljSWQoeElELmdldFB1YklkTGl0ZXJhbCgpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBub3RhdGlvbkRlY2w7Ci0JfQotCi0KLQlwcml2YXRlIFN0cmluZyBzY2FuRW50aXR5VmFsdWUoYm9vbGVhbiBzaW5nbGUpIHsKLQkJY2hhciBxY2hhciA9IHNpbmdsZSA/ICdcJycgOiAnXCInOwotCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQljb250ZW50U3RyaW5nLnNraXBUb0NoYXIocWNoYXIsIGZhbHNlKTsKLQkJaW50IGxlbiA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpIC0gcHJldk5vZGVPZmZzZXQ7Ci0JCVN0cmluZyB2YWx1ZSA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLy8KLQkvLyBbNzVdIEV4dGVybmFsSUQgOjo9ICdTWVNURU0nIFMgU3lzdGVtTGl0ZXJhbAotCS8vIHwgJ1BVQkxJQycgUyBQdWJpZExpdGVyYWwgUyBTeXN0ZW1MaXRlcmFsCi0JcHJpdmF0ZSBFeHRlcm5hbElEIHNjYW5FeHRlcm5hbElEKCkgewotCQlFeHRlcm5hbElEIHhJRCA9IG51bGw7Ci0JCWNoYXIgcWNoYXIgPSAnXCInOwotCQlpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKHN5c3RlbV9zdHJpbmcpKSB7Ci0JCQlpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignXCcnLCB0cnVlKSkKLQkJCQlxY2hhciA9ICdcJyc7Ci0JCQllbHNlIGlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ1wiJywgdHJ1ZSkpCi0JCQkJcWNoYXIgPSAnXCInOwotCi0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJY29udGVudFN0cmluZy5za2lwVG9DaGFyKHFjaGFyLCB0cnVlKTsKLQkJCWludCBsZW4gPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKSAtIHByZXZOb2RlT2Zmc2V0IC0gMTsKLQkJCVN0cmluZyBzeXN0ZW1JZCA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzeXN0ZW1pZC4uLiIgKyBzeXN0ZW1JZCk7Ci0JCQl4SUQgPSBuZXcgRXh0ZXJuYWxJRChzeXN0ZW1JZCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKHB1YmxpY19zdHJpbmcpKSB7Ci0JCQlpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignXCcnLCB0cnVlKSkKLQkJCQlxY2hhciA9ICdcJyc7Ci0JCQllbHNlIGlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ1wiJywgdHJ1ZSkpCi0JCQkJcWNoYXIgPSAnXCInOwotCi0JCQkvLyBwdWJsaWNMaXRlcmFsCi0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJY29udGVudFN0cmluZy5za2lwVG9DaGFyKHFjaGFyLCB0cnVlKTsKLQkJCWludCBsZW4gPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKSAtIHByZXZOb2RlT2Zmc2V0IC0gMTsKLQkJCVN0cmluZyBwdWJsaWNJZCA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCi0JCQkvLyBzeXN0ZW1MaXRlcmFsCi0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCdcJycsIHRydWUpKQotCQkJCXFjaGFyID0gJ1wnJzsKLQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignXCInLCB0cnVlKSkKLQkJCQlxY2hhciA9ICdcIic7Ci0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJY29udGVudFN0cmluZy5za2lwVG9DaGFyKHFjaGFyLCB0cnVlKTsKLQkJCWxlbiA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpIC0gcHJldk5vZGVPZmZzZXQgLSAxOwotCi0JCQlpZiAobGVuID4gMCkgewotCQkJCVN0cmluZyBzeXN0ZW1JZCA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQkJCXhJRCA9IG5ldyBFeHRlcm5hbElEKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl4SUQgPSBuZXcgRXh0ZXJuYWxJRChwdWJsaWNJZCwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHhJRDsKLQl9Ci0KLQkvLwotCS8vIFs4M10gUHVibGljSUQgOjo9ICdQVUJMSUMnIFMgUHViaWRMaXRlcmFsCi0JLy8KLQotCS8vIGRtdyAxMS8xNSBwcml2YXRlIG1ldGhvZCBuZXZlciByZWFkIGxvY2FsbHkKLQkvLyBUT0RPOiBjaGFuZ2UgdG8gcHJpdmF0ZSBpZiB1c2VkLCBvdGhlcndpc2Ugc2hvdWxkIGJlIHJlbW92ZWQKLQlTdHJpbmcgc2NhblB1YmxpY0lEKCkgewotCQlTdHJpbmcgcElEID0gbnVsbDsKLQkJaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhwdWJsaWNfc3RyaW5nKSkgewotCQkJaWYgKCFjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQkJcmV0dXJuIHBJRDsKLQkJCX0KLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFRvQ2hhcignICcsIHRydWUpOwotCQkJaW50IGxlbiA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpIC0gcHJldk5vZGVPZmZzZXQ7Ci0JCQlwSUQgPSBjb250ZW50U3RyaW5nLmdldFN0cmluZyhwcmV2Tm9kZU9mZnNldCwgbGVuKTsKLQkJfQotCi0JCXJldHVybiBwSUQ7Ci0JfQotCi0JLy8KLQkvLyBNYWluCi0JLy8KLQotCS8qKiBNYWluIHByb2dyYW0gZW50cnkgcG9pbnQuICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotCi0JCS8vIGlzIHRoZXJlIGFueXRoaW5nIHRvIGRvPwotCQlpZiAoYXJndi5sZW5ndGggPT0gMCkgewotCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCX0KLQotCQkvLyBEVERTY2FubmVyIHNjID0gbmV3IERURFNjYW5uZXIoYXJndlswXSk7Ci0JCURURFNjYW5uZXIgc2MgPSBuZXcgRFREU2Nhbm5lcigiaGVsbG8uZHRkIiwgIiBnaWYgU1lTVEVNIFwiR0lGIEZpbGVcIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJTm90YXRpb25EZWNsIG4gPSBzYy5zY2FuTm90YXRpb25EZWNsKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiTm9hdGlvbiBOYW1lOiAiICsgbi5nZXROb2RlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN5c3RlbUlkOiAiICsgbi5nZXRTeXN0ZW1JZCgpKTsgLy8kTk9OLU5MUy0xJAotCi0KLQkJLy8gQXR0cmlidXRlcwotCQkvLyBWZWN0b3IgbGlzdHMgPSBzYy5zY2FuQXR0bGlzdERlY2woKTsKLQkJLy8gc2MucHJpbnRBdHRMaXN0KGxpc3RzKTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNNOiAiICsgc2Muc2NhbkNvbnRlbnRNb2RlbCgpKTsKLQotCX0gLy8gbWFpbihTdHJpbmdbXSkKLQotCS8qKgotCSAqIEdldHMgdGhlIGVycm9yU3RyaW5nCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvclN0cmluZygpIHsKLQkJcmV0dXJuIGVycm9yU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGVycm9yU3RyaW5nCi0JICogCi0JICogQHBhcmFtIGVycm9yU3RyaW5nCi0JICogICAgICAgICAgICBUaGUgZXJyb3JTdHJpbmcgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RXJyb3JTdHJpbmcoU3RyaW5nIGVycm9yU3RyaW5nKSB7Ci0JCXRoaXMuZXJyb3JTdHJpbmcgPSBlcnJvclN0cmluZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RlY2xOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9EZWNsTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjIzMDZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RlY2xOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotcHVibGljIGNsYXNzIERlY2xOb2RlIHsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBJTlZBTElEID0gLTE7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgRUxFTUVOVCA9IDE7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgQVRUTElTVCA9IDI7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgRU5USVRZID0gMzsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBJTlRFUk5BTF9FTlRJVFkgPSA0OwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IEVYVEVSTkFMX0VOVElUWSA9IDU7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgSU5URVJOQUxfR0VORVJBTF9FTlRJVFkgPSA2OwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IElOVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFkgPSA3OwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IEVYVEVSTkFMX0dFTkVSQUxfRU5USVRZID0gODsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBFWFRFUk5BTF9QQVJBTUVURVJfRU5USVRZID0gOTsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBQQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRSA9IDEwOwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IE5PVEFUSU9OID0gMTE7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgQ09NTUVOVCA9IDEyOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgU1RBUlRfRFREID0gMjE7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgRU5EX0RURCA9IDIyOwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IFNUQVJUX0VOVElUWV9EVEQgPSAyMzsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBFTkRfRU5USVRZX0RURCA9IDI0OwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IEVSUk9SID0gMjU7Ci0KLQlwdWJsaWMgaW50IHR5cGUgPSBJTlZBTElEOwotCXByaXZhdGUgU3RyaW5nIGRlY2xOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBjb250ZW50U3RyaW5nID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGNvbW1lbnQgPSBudWxsOwotCi0JLy8KLQkvLyBDb25zdGFudHMKLQkvLwotCi0JLyoqIERlZmF1bHQgY29uc3RydWN0b3IuICovCi0JcHVibGljIERlY2xOb2RlKGludCB0eXBlKSB7Ci0JCXRoaXMobnVsbCwgdHlwZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIERlY2xOb2RlKFN0cmluZyBuYW1lLCBpbnQgdHlwZSwgU3RyaW5nIGNvbnRlbnRTdHJpbmcpIHsKLQkJdGhpcy5kZWNsTmFtZSA9IG5hbWU7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMuY29udGVudFN0cmluZyA9IGNvbnRlbnRTdHJpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWNsTmFtZSgpIHsKLQkJcmV0dXJuIGRlY2xOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlY2xOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWRlY2xOYW1lID0gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IHR5cGUpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJZXJyb3JNZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRTdHJpbmcoKSB7Ci0JCXJldHVybiBjb250ZW50U3RyaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRTdHJpbmcoU3RyaW5nIGNvbnRlbnQpIHsKLQkJdGhpcy5jb250ZW50U3RyaW5nID0gY29udGVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIGNvbW1lbnQpIHsKLQkJdGhpcy5jb21tZW50ID0gY29tbWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQotCXsKLQkJcmV0dXJuICJOb2RlIE5hbWU6ICIgKyBkZWNsTmFtZSArICIgVHlwZTogIiArIHR5cGUgKyAiIENvbnRlbnRTdHJpbmc6ICIgKyBjb250ZW50U3RyaW5nOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbGVtZW50RGVjbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRWxlbWVudERlY2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU1Yzc3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbGVtZW50RGVjbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEVsZW1lbnREZWNsIGV4dGVuZHMgQmFzZU5vZGUgewotCUNNTm9kZSBjb250ZW50TW9kZWxOb2RlID0gbnVsbDsKLQotCXB1YmxpYyBFbGVtZW50RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFREKSB7Ci0JCXRoaXMobmFtZSwgb3duZXJEVEQsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBFbGVtZW50RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFRELCBTdHJpbmcgY29tbWVudCwgRXJyb3JNZXNzYWdlIGVycm9yTWVzc2FnZSkgewotCQlzdXBlcihuYW1lLCBvd25lckRURCwgY29tbWVudCwgZXJyb3JNZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgQ01Ob2RlIGdldENvbnRlbnRNb2RlbE5vZGUoKSB7Ci0JCXJldHVybiBjb250ZW50TW9kZWxOb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRNb2RlbE5vZGUoQ01Ob2RlIGNtbm9kZSkgewotCQljb250ZW50TW9kZWxOb2RlID0gY21ub2RlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRW50aXR5RGVjbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRW50aXR5RGVjbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njg4NzdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0VudGl0eURlY2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5RGVjbCBleHRlbmRzIEJhc2VOb2RlIHsKLQlib29sZWFuIGlzUGFyYW1ldGVyID0gZmFsc2U7Ci0JU3RyaW5nIGV4cGFuZGVkVmFsdWUgPSBudWxsOyAvLyBBbHdheXMgPHZhcj5udWxsPC92YXI+IGZvciBleHRlcm5hbAotCQkJCQkJCQkJLy8gRW50aXRpZXMKLQlTdHJpbmcgdmFsdWUgPSBudWxsOyAvLyBBbHdheXMgPHZhcj5udWxsPC92YXI+IGZvciBleHRlcm5hbCBFbnRpdGllcwotCUV4dGVybmFsSUQgZXh0ZXJuYWxJRCA9IG51bGw7IC8vIEFsd2F5cyA8dmFyPm51bGw8L3Zhcj4gZm9yIGludGVybmFsCi0JCQkJCQkJCQkvLyBFbnRpdGllcwotCVN0cmluZyBuZGF0YSA9IG51bGw7IC8vIEFsd2F5cyA8dmFyPm51bGw8L3Zhcj4gZm9yIGludGVybmFsIEVudGl0aWVzCi0KLQlib29sZWFuIHBhcnNlZCA9IGZhbHNlOwotCURURFBhcnNlciBkdGQgPSBudWxsOyAvLyBBbHdheXMgbnVsbCwgZXhjZXB0IHdoZW4gaXQgaGFzIGJlZW4gcGFyc2VkLgotCi0JYm9vbGVhbiBlbnRpdHlSZWZlcmVuY2VkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgaW50ZXJuYWwgRW50aXRpZXMuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIE5hbWUgb2YgdGhpcyBFbnRpdHkuCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBUaGUgWE1MLWVuY29kZWQgdmFsdWUgdGhhdCB3YXMgZGlyZWN0bHkgYXNzaWduZWQgdG8gdGhlCi0JICogICAgICAgICAgICBFbnRpdHkuCi0JICogQHBhcmFtIGlzUGFyYW1ldGVyCi0JICogICAgICAgICAgICA9dHJ1ZSBpZiBhIHBhcmFtZXRlciBFbnRpdHk7IG90aGVyd2lzZSA9ZmFsc2UuCi0JICovCi0JcHVibGljIEVudGl0eURlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBvd25lckRURCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGlzUGFyYW1ldGVyKSB7Ci0JCXN1cGVyKG5hbWUsIG93bmVyRFRELCBudWxsLCBudWxsKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmlzUGFyYW1ldGVyID0gaXNQYXJhbWV0ZXI7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIGV4dGVybmFsIEVudGl0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBOYW1lIG9mIHRoZSBFbnRpdHkuCi0JICogQHBhcmFtIGV4dGVybmFsSUQKLQkgKiAgICAgICAgICAgIFRoZSByZWZlcmVuY2UocykgdG8gdGhlIGV4dGVybmFsIGVudGl0eSB0byByZXRyaWV2ZS4KLQkgKiBAcGFyYW0gaXNQYXJhbWV0ZXIKLQkgKiAgICAgICAgICAgID10cnVlIGlmIGEgcGFyYW1ldGVyIEVudGl0eTsgb3RoZXJ3aXNlID1mYWxzZS4KLQkgKiBAcGFyYW0gbmRhdGEKLQkgKiAgICAgICAgICAgIFRoZSBub3RhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGJpbmFyeSBFbnRpdHksIG9yIDx2YXI+bnVsbDwvdmFyPgotCSAqICAgICAgICAgICAgaWYgdGhlIEVudGl0eSBpcyBhIHRleHQgRW50aXR5LgotCSAqIEBzZWUgc2F4LkV4dGVybmFsSUQKLQkgKi8KLQlwdWJsaWMgRW50aXR5RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFRELCBFeHRlcm5hbElEIGV4dGVybmFsSUQsIGJvb2xlYW4gaXNQYXJhbWV0ZXIsIFN0cmluZyBuZGF0YSkgewotCQlzdXBlcihuYW1lLCBvd25lckRURCwgbnVsbCwgbnVsbCk7Ci0JCXRoaXMuZXh0ZXJuYWxJRCA9IGV4dGVybmFsSUQ7Ci0JCXRoaXMuaXNQYXJhbWV0ZXIgPSBpc1BhcmFtZXRlcjsKLQkJdGhpcy5uZGF0YSA9IG5kYXRhOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIEVudGl0eSBpcyBhIHBhcmFtZXRlciBFbnRpdHkuCi0JICogCi0JICogQHJldHVybiA9dHJ1ZSBpZiBhbiBpbnRlcm5hbCBwYXJhbWV0ZXIgRW50aXR5OyBvdGhlcndpc2UgPWZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyKCkgewotCQlyZXR1cm4gdGhpcy5pc1BhcmFtZXRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIEVudGl0eS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBYTUwtZW5jb2RlZCB2YWx1ZSB0aGF0IHdhcyBkaXJlY3RseSBhc3NpZ25lZCB0byB0aGUKLQkgKiAgICAgICAgIGludGVybmFsIEVudGl0eTsgb3RoZXJ3aXNlLCA8dmFyPm51bGw8L3Zhcj4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbnRpdHlSZWZlcmVuY2VkKCkgewotCQlyZXR1cm4gZW50aXR5UmVmZXJlbmNlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbnRpdHlSZWZlcmVuY2VkKGJvb2xlYW4gcmVmZXJlbmNlKSB7Ci0JCWVudGl0eVJlZmVyZW5jZWQgPSByZWZlcmVuY2U7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzeXN0ZW0gaWRlbnRpZmllciBvZiB0aGUgTm90YXRpb24uIEEgc3lzdGVtIGlkZW50aWZpZXIgaXMgYQotCSAqIFVSSSwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gcmV0cmlldmUgYW4gZXh0ZXJuYWwgZW50aXR5J3MgY29udGVudC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBkZWZpbmVkIGJ5IERPTS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzeXN0ZW0gaWRlbnRpZmllciwgb3IgPHZhcj5udWxsPC92YXI+IGlmIHRoZSBpZGVudGlmaWVyIGlzCi0JICogICAgICAgICBub3QgZGVmaW5lZC4KLQkgKiBAc2VlIG9yZy5lY2xpcGNzZS53c3QuZHRkLnBhcnNlci5FeHRlcm5hbElEI2dldFN5c3RlbUxpdGVyYWwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotCQlpZiAoZXh0ZXJuYWxJRCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UKLQkJCXJldHVybiB0aGlzLmV4dGVybmFsSUQuZ2V0U3lzdGVtTGl0ZXJhbCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIHRoZSBOb3RhdGlvbi4gQSBzeXN0ZW0gaWRlbnRpZmllciBpcyBhCi0JICogVVJJLCB3aGljaCBtYXkgYmUgdXNlZCB0byByZXRyaWV2ZSBhbiBleHRlcm5hbCBlbnRpdHkncyBjb250ZW50LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGRlZmluZWQgYnkgRE9NLgotCSAqIAotCSAqIEBwYXJhbSBzeXN0ZW1JZGVudGlmaWVyCi0JICogICAgICAgICAgICBUaGUgc3lzdGVtIGlkZW50aWZpZXIuCi0JICogQHNlZSBvcmcuZWNsaXBjc2Uud3N0LmR0ZC5wYXJzZXIuRXh0ZXJuYWxJRAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBzeXN0ZW1JZGVudGlmaWVyKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2V0U1lzdGVtSWQgLSBleHRlcm5hbElkOiAiICsgZXh0ZXJuYWxJRCk7Ci0JCXRoaXMuZXh0ZXJuYWxJRCA9IG5ldyBFeHRlcm5hbElEKHRoaXMuZXh0ZXJuYWxJRC5nZXRQdWJJZExpdGVyYWwoKSwgc3lzdGVtSWRlbnRpZmllcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHVibGljIGlkZW50aWZpZXIgb2YgdGhlIE5vdGF0aW9uLiBUaGlzIHZhbHVlIGlzIG9ubHkgdmFsaWQKLQkgKiBpZiB0aGUgaWRlbnRpZmllciBpcyBkZWZpbmVkIGFzIDx2YXI+cHVibGljPC92YXI+IChhcyBvcHBvc2VkIHRvCi0JICogPHZhcj5zeXN0ZW08L3Zhcj4pLiBQdWJsaWMgaWRlbnRpZmllcnMgbWF5IGJlIHVzZWQgdG8gdHJ5IHRvIGdlbmVyYXRlCi0JICogYW4gYWx0ZXJuYXRpdmUgVVJJIGluIG9yZGVyIHRvIHJldHJpZXZlIHRoZSBhbiBleHRlcm5hbCBlbnRpdGllcwotCSAqIGNvbnRlbnQuIElmIHJldHJpZXZhbCBmYWlscyB1c2luZyB0aGUgcHVibGljIGlkZW50aWZpZXIsIGFuIGF0dGVtcHQKLQkgKiBtdXN0IGJlIG1hZGUgdG8gcmV0cmlldmUgY29udGVudCB1c2luZyB0aGUgc3lzdGVtIGlkZW50aWZpZXIuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgZGVmaW5lZCBieSBET00uCi0JICogCi0JICogQHJldHVybiBUaGUgcHVibGljIGlkZW50aWZpZXIsIG9yIDx2YXI+bnVsbDwvdmFyPiBpZiB0aGUgaWRlbnRpZmllciBpcwotCSAqICAgICAgICAgbm90IGRlZmluZWQuCi0JICogQHNlZSBvcmcuZWNsaXBjc2Uud3N0LmR0ZC5wYXJzZXIuRXh0ZXJuYWxJRAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0JCWlmIChleHRlcm5hbElEID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZQotCQkJcmV0dXJuIHRoaXMuZXh0ZXJuYWxJRC5nZXRQdWJJZExpdGVyYWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGUgTm90YXRpb24uIFRoaXMgdmFsdWUgaXMgb25seSB2YWxpZCBpZgotCSAqIHRoZSBpZGVudGlmaWVyIGlzIGRlZmluZWQgYXMgPHZhcj5wdWJsaWM8L3Zhcj4gKGFzIG9wcG9zZWQgdG8KLQkgKiA8dmFyPnN5c3RlbTwvdmFyPikuIFB1YmxpYyBpZGVudGlmaWVycyBtYXkgYmUgdXNlZCB0byB0cnkgdG8gZ2VuZXJhdGUKLQkgKiBhbiBhbHRlcm5hdGl2ZSBVUkkgaW4gb3JkZXIgdG8gcmV0cmlldmUgdGhlIGFuIGV4dGVybmFsIGVudGl0aWVzCi0JICogY29udGVudC4gSWYgcmV0cmlldmFsIGZhaWxzIHVzaW5nIHRoZSBwdWJsaWMgaWRlbnRpZmllciwgYW4gYXR0ZW1wdAotCSAqIG11c3QgYmUgbWFkZSB0byByZXRyaWV2ZSBjb250ZW50IHVzaW5nIHRoZSBzeXN0ZW0gaWRlbnRpZmllci4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBkZWZpbmVkIGJ5IERPTS4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSWRlbnRpZmllcgotCSAqICAgICAgICAgICAgVGhlIHB1YmxpYyBpZGVudGlmaWVyLgotCSAqIEBzZWUgI2dldFB1YmxpY0lkCi0JICogQHNlZSBvcmcuZWNsaXBjc2Uud3N0LmR0ZC5wYXJzZXIuRXh0ZXJuYWxJRAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lkKFN0cmluZyBwdWJsaWNJZGVudGlmaWVyKSB7Ci0JCXRoaXMuZXh0ZXJuYWxJRCA9IG5ldyBFeHRlcm5hbElEKHB1YmxpY0lkZW50aWZpZXIsIHRoaXMuZXh0ZXJuYWxJRC5nZXRTeXN0ZW1MaXRlcmFsKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4dGVybmFsIElEIG9mIHRoaXMgRW50aXR5LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHJlZmVyZW5jZShzKSB0byB0aGUgZXh0ZXJuYWwgZW50aXR5IHRvIHJldHJpZXZlOyBvdGhlcndpc2UsCi0JICogICAgICAgICA8dmFyPm51bGw8L3Zhcj4uCi0JICogQHNlZSBvcmcuZWNsaXBjc2Uud3N0LmR0ZC5wYXJzZXIuRXh0ZXJuYWxJRAotCSAqLwotCXB1YmxpYyBFeHRlcm5hbElEIGdldEV4dGVybmFsSUQoKSB7Ci0JCXJldHVybiB0aGlzLmV4dGVybmFsSUQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZW50aXR5IHZhbHVlIGlzIGV4dGVybmFsLgotCSAqIAotCSAqIEByZXR1cm4gPXRydWUgaWYgZW50aXR5IGlzIGV4dGVybmFsOyBvdGhlcndpc2UsID1mYWxzZS4KLQkgKiBAc2VlIG9yZy5lY2xpcGNzZS53c3QuZHRkLnBhcnNlci5FeHRlcm5hbElECi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbCgpIHsKLQkJcmV0dXJuIHRoaXMuZXh0ZXJuYWxJRCAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5vdGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVudGl0eS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBub3RhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGV4dGVybmFsIGJpbmFyeSBFbnRpdHksCi0JICogICAgICAgICBvdGhlcndpc2UsIDx2YXI+bnVsbDwvdmFyPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vdGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5uZGF0YTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb3RhdGlvbihTdHJpbmcgbmRhdGEpIHsKLQkJdGhpcy5uZGF0YSA9IG5kYXRhOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5vdGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVudGl0eS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBkZWZpbmVkIGJ5IERPTS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBub3RhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGV4dGVybmFsIGJpbmFyeSBFbnRpdHksCi0JICogICAgICAgICBvdGhlcndpc2UsIDx2YXI+bnVsbDwvdmFyPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmRhdGE7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgZGVmaW5lZCBieSBET00uCi0JICogCi0JICogcHVibGljIHZvaWQgc2V0Tm90YXRpb25OYW1lKFN0cmluZyBhcmcpIHsgdGhpcy5uZGF0YSA9IGFyZzsgfQotCSAqLwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZXJlIGlzIGEgbm90YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZW50aXR5IHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gPXRydWUgaWYgdGhlIGV4dGVybmFsIGJpbmFyeSBlbnRpdHkgY29udGFpbnMgYSBub3RhdGlvbjsKLQkgKiAgICAgICAgIG90aGVyd2lzZSwgPWZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLm5kYXRhICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHMpIHsKLQkJdGhpcy52YWx1ZSA9IHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyc2VkKGJvb2xlYW4gcCkgewotCQl0aGlzLnBhcnNlZCA9IHA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0UGFyc2VkKCkgewotCQlyZXR1cm4gdGhpcy5wYXJzZWQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbnRpdHlQb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbnRpdHlQb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YmQxZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRW50aXR5UG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5UG9vbCB7Ci0JcHJpdmF0ZSBIYXNodGFibGUgbV9lbnRpdHkgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JcHJpdmF0ZSBIYXNodGFibGUgbV9wYXJhID0gbmV3IEhhc2h0YWJsZSgpOyAvLyBwYXJhbWV0ZXIgcmVmZXJlbmNlcwotCi0JcHVibGljIEVudGl0eVBvb2woKSB7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkKEVudGl0eURlY2wgZW50aXR5KSB7Ci0JCVN0cmluZyBuYW1lID0gZW50aXR5LmdldE5vZGVOYW1lKCk7Ci0JCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXIoKSkgewotCQkJaWYgKG1fcGFyYS5jb250YWluc0tleShuYW1lKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQltX3BhcmEucHV0KG5hbWUsIGVudGl0eSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAobV9lbnRpdHkuY29udGFpbnNLZXkobmFtZSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJbV9lbnRpdHkucHV0KG5hbWUsIGVudGl0eSk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIEVudGl0eURlY2wgcmVmZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChFbnRpdHlEZWNsKSBtX2VudGl0eS5nZXQobmFtZSk7Ci0JfQotCi0JcHVibGljIEVudGl0eURlY2wgcmVmZXJQYXJhKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAoRW50aXR5RGVjbCkgbV9wYXJhLmdldChuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gPENPREU+RW51bWVyYXRpb248L0NPREU+IG9mIDxDT0RFPkVudGl0eURlY2w8L0NPREU+LgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwY3NlLndzdC5kdGQucGFyc2VyLkVudGl0eURlY2wKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gZWxlbWVudHMoKSB7Ci0JCXJldHVybiBtX2VudGl0eS5lbGVtZW50cygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiA8Q09ERT5FbnVtZXJhdGlvbjwvQ09ERT4gb2YgPENPREU+RW50aXR5RGVjbDwvQ09ERT4gZm9yCi0JICogcGFyYW1ldGVyIGVudGl0aWVzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwY3NlLndzdC5kdGQucGFyc2VyLkVudGl0eURlY2wKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gcGFyYW1ldGVyRW50aXR5RWxlbWVudHMoKSB7Ci0JCXJldHVybiBtX3BhcmEuZWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgRFREI2dldEVudGl0aWVzKCk7Ci0JICovCi0JSGFzaHRhYmxlIGdldEVudGl0eUhhc2goKSB7Ci0JCXJldHVybiB0aGlzLm1fZW50aXR5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0Vycm9yTWVzc2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRXJyb3JNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMTIzNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRXJyb3JNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBFcnJvck1lc3NhZ2UgewotCXByaXZhdGUgaW50IGVycm9yTGluZSwgZXJyb3JDb2x1bW4sIHNldmVyaXR5OwotCXByaXZhdGUgU3RyaW5nIGVycm9yU3RyaW5nOwotCi0KLQlwdWJsaWMgRXJyb3JNZXNzYWdlKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3IpIHsKLQkJZXJyb3JTdHJpbmcgPSBlcnJvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXZlcml0eShpbnQgc2V2ZXJpdHkpIHsKLQkJdGhpcy5zZXZlcml0eSA9IHNldmVyaXR5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNldmVyaXR5KFN0cmluZyBzZXZlcml0eSkgewotCQlpZiAoc2V2ZXJpdHkgPT0gIndhcm5pbmciKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMuc2V2ZXJpdHkgPSAwOwotCQl9Ci0JCWVsc2UgaWYgKHNldmVyaXR5ID09ICJlcnJvciIpIHsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5zZXZlcml0eSA9IDE7Ci0JCX0KLQkJZWxzZSBpZiAoc2V2ZXJpdHkgPT0gImZhdGFsIikgeyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLnNldmVyaXR5ID0gMjsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVycm9yTGluZShpbnQgbGluZSkgewotCQllcnJvckxpbmUgPSBsaW5lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVycm9yQ29sdW1uKGludCBjb2x1bW4pIHsKLQkJZXJyb3JDb2x1bW4gPSBjb2x1bW47Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBlcnJvclN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNldmVyaXR5KCkgewotCQlyZXR1cm4gc2V2ZXJpdHk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFcnJvckxpbmUoKSB7Ci0JCXJldHVybiBlcnJvckxpbmU7Ci0JfQotCi0JcHVibGljIGludCBnZXRFcnJvckNvbHVtbigpIHsKLQkJcmV0dXJuIGVycm9yQ29sdW1uOwotCX0KLQotCXByaXZhdGUgaW50IHN0YXJ0T2Zmc2V0ID0gLTE7Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvclN0YXJ0T2Zmc2V0KGludCBzdGFydCkgewotCQlzdGFydE9mZnNldCA9IHN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RXJyb3JTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIHN0YXJ0T2Zmc2V0OwotCX0KLQotCXByaXZhdGUgaW50IGVuZE9mZnNldCA9IC0xOwotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JFbmRPZmZzZXQoaW50IGVuZCkgewotCQllbmRPZmZzZXQgPSBlbmQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRFcnJvckVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGVuZE9mZnNldDsKLQl9Ci0KLQotCU9iamVjdCBvYmplY3Q7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBjbG9zZXN0IG9iamVjdCB0byB0aGUgZXJyb3IuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBvYmplY3QuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBjbG9zZXN0IG9iamVjdCB0byB0aGUgZXJyb3IuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCB2KSB7Ci0JCXRoaXMub2JqZWN0ID0gdjsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkZE5ld0Vycm9yTWVzc2FnZUxpbmUoU3RyaW5nIG5ld0xpbmUpIHsKLQkJZXJyb3JTdHJpbmcgKz0gIlxuIiArIG5ld0xpbmU7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FeHRlcm5hbElELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FeHRlcm5hbElELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYjAwOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRXh0ZXJuYWxJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlcm5hbElEIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVF9TWVNURU0gPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUX1BVQkxJQyA9IDE7Ci0KLQlpbnQgdHlwZSA9IFRfUFVCTElDOwotCVN0cmluZyBwdWJsaWNJRCA9IG51bGw7Ci0JU3RyaW5nIHN5c3RlbUlEID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBzeXN0ZW0gSURzLgotCSAqIAotCSAqIEBwYXJhbSBzeXN0ZW1JRAotCSAqICAgICAgICAgICAgVVJJLCB3aGljaCBtYXkgYmUgdXNlZCB0byByZXRyaWV2ZSBhbiBleHRlcm5hbCBlbnRpdHkncwotCSAqICAgICAgICAgICAgY29udGVudC4KLQkgKi8KLQlwdWJsaWMgRXh0ZXJuYWxJRChTdHJpbmcgc3lzdGVtSUQpIHsKLQkJdGhpcy50eXBlID0gVF9TWVNURU07Ci0JCXRoaXMucHVibGljSUQgPSBudWxsOwotCQl0aGlzLnN5c3RlbUlEID0gc3lzdGVtSUQ7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIHB1YmxpYyBhbmQgc3lzdGVtIElEcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSUQKLQkgKiAgICAgICAgICAgIElkZW50aWZpZXIgdG8gYmUgdXNlZCB0byB0cnkgdG8gZ2VuZXJhdGUgYW4gYWx0ZXJuYXRpdmUgVVJJCi0JICogICAgICAgICAgICBpbiBvcmRlciB0byByZXRyaWV2ZSB0aGUgZXh0ZXJuYWwgZW50aXR5J3MgY29udGVudCwgb3IKLQkgKiAgICAgICAgICAgIDx2YXI+bnVsbDwvdmFyPiBpZiBhIHN5c3RlbSBpZGVudGl0aWVyIGlzIHRvIGJlCi0JICogICAgICAgICAgICBjb25zdHJ1Y3RlZC4KLQkgKiBAcGFyYW0gc3lzdGVtSUQKLQkgKiAgICAgICAgICAgIFVSSSwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gcmV0cmlldmUgYW4gZXh0ZXJuYWwgZW50aXR5J3MKLQkgKiAgICAgICAgICAgIGNvbnRlbnQuCi0JICovCi0JcHVibGljIEV4dGVybmFsSUQoU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgc3lzdGVtSUQpIHsKLQkJdGhpcy50eXBlID0gVF9QVUJMSUM7Ci0JCXRoaXMucHVibGljSUQgPSBwdWJsaWNJRDsKLQkJdGhpcy5zeXN0ZW1JRCA9IHN5c3RlbUlEOwotCQlpZiAobnVsbCA9PSB0aGlzLnB1YmxpY0lEKQotCQkJdGhpcy50eXBlID0gVF9TWVNURU07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpZiB0aGlzIGV4dGVybmFsIElEIGlzIGEgc3lzdGVtIElEIChvciBwdWJsaWMgSUQpLgotCSAqIAotCSAqIEByZXR1cm4gU3lzdGVtIElEPXRydWUsIFB1YmxpYyBJRD1mYWxzZS4KLQkgKiBAc2VlICNpc1B1YmxpYwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3lzdGVtKCkgewotCQlyZXR1cm4gdGhpcy50eXBlID09IFRfU1lTVEVNOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgaWYgdGhpcyBleHRlcm5hbCBJRCBpcyBhIHB1YmxpYyBJRCAob3Igc3lzdGVtIElEKS4KLQkgKiAKLQkgKiBAcmV0dXJuIFB1YmxpYyBJRD10cnVlLCBTeXN0ZW0gSUQ9ZmFsc2UuCi0JICogQHNlZSAjaXNTeXN0ZW0KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1B1YmxpYygpIHsKLQkJcmV0dXJuIHRoaXMudHlwZSA9PSBUX1BVQkxJQzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzeXN0ZW0gaWRlbnRpZmllciBvZiB0aGlzIGV4dGVybmFsIElELiBBIHN5c3RlbSBpZGVudGlmaWVyCi0JICogaXMgYSBVUkksIHdoaWNoIG1heSBiZSB1c2VkIHRvIHJldHJpZXZlIGFuIGV4dGVybmFsIGVudGl0eSdzIGNvbnRlbnQuCi0JICogCi0JICogQHJldHVybiBUaGUgc3lzdGVtIGlkZW50aWZpZXIsIG9yIDx2YXI+bnVsbDwvdmFyPiBpZiB0aGUgaWRlbnRpZmllciBpcwotCSAqICAgICAgICAgbm90IGRlZmluZWQuCi0JICogQHNlZSAjZ2V0UHViaWRMaXRlcmFsCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1MaXRlcmFsKCkgewotCQlyZXR1cm4gdGhpcy5zeXN0ZW1JRDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGlzIGV4dGVybmFsIElELiBUaGlzIHZhbHVlIGlzIG9ubHkKLQkgKiB2YWxpZCBpZiB0aGUgaWRlbnRpZmllciBpcyBkZWZpbmVkIGFzIDx2YXI+cHVibGljPC92YXI+IChhcyBvcHBvc2VkIHRvCi0JICogPHZhcj5zeXN0ZW08L3Zhcj4pLiBQdWJsaWMgaWRlbnRpZmllcnMgbWF5IGJlIHVzZWQgdG8gdHJ5IHRvIGdlbmVyYXRlCi0JICogYW4gYWx0ZXJuYXRpdmUgVVJJIGluIG9yZGVyIHRvIHJldHJpZXZlIGFuIGV4dGVybmFsIGVudGl0eSdzIGNvbnRlbnQuCi0JICogSWYgcmV0cmlldmFsIGZhaWxzIHVzaW5nIHRoZSBwdWJsaWMgaWRlbnRpZmllciwgYW4gYXR0ZW1wdCBtdXN0IGJlIG1hZGUKLQkgKiB0byByZXRyaWV2ZSBjb250ZW50IHVzaW5nIHRoZSBzeXN0ZW0gaWRlbnRpZmllci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBwdWJsaWMgaWRlbnRpZmllciwgb3IgPHZhcj5udWxsPC92YXI+IGlmIHRoZSBpZGVudGlmaWVyIGlzCi0JICogICAgICAgICBub3QgZGVmaW5lZC4KLQkgKiBAc2VlICNnZXRTeXN0ZW1MaXRlcmFsCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJJZExpdGVyYWwoKSB7Ci0JCXJldHVybiB0aGlzLnB1YmxpY0lEOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBleHRlcm5hbCBJRCBpbiB0aGUgZm9ybWF0IGl0IHdhcyBkZWNsYXJlZDogPENPREU+U1lTVEVNCi0JICogJnF1b3Q7PFZBUj5zeXN0ZW1JRDwvVkFSPiZxdW90OzwvQ09ERT4gb3IgPENPREU+UFVCTElDICZxdW90OzxWQVI+cHVibGljSUQ8L1ZBUj4mcXVvdDsKLQkgKiAmcXVvdDs8VkFSPnN5c3RlbUlEPC9WQVI+JnF1b3Q7PC9DT0RFPi4KLQkgKiAKLQkgKiBAcmV0dXJuIFhNTCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb250ZW50IG9mIHRoZSBleHRlcm5hbCBJRCAobmV2ZXIKLQkgKiAgICAgICAgIDx2YXI+bnVsbDwvdmFyPikuCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIHJldDsKLQkJaWYgKGlzU3lzdGVtKCkpIHsKLQkJCXJldCA9ICJTWVNURU0gXCIiICsgZ2V0U3lzdGVtTGl0ZXJhbCgpICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSBpZiAobnVsbCAhPSBnZXRTeXN0ZW1MaXRlcmFsKCkpIHsKLQkJCXJldCA9ICJQVUJMSUMgXCIiICsgZ2V0UHViSWRMaXRlcmFsKCkgKyAiXCIgXCIiICsgZ2V0U3lzdGVtTGl0ZXJhbCgpICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQllbHNlIHsKLQkJCXJldCA9ICJQVUJMSUMgXCIiICsgZ2V0UHViSWRMaXRlcmFsKCkgKyAiXCIiOyAvLyBmb3IgTk9UQVRJT04gLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghKG9iaiBpbnN0YW5jZW9mIEV4dGVybmFsSUQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlFeHRlcm5hbElEIGVpZCA9IChFeHRlcm5hbElEKSBvYmo7Ci0JCWlmICghKChlaWQucHVibGljSUQgPT0gbnVsbCAmJiB0aGlzLnB1YmxpY0lEID09IG51bGwpIHx8IGVpZC5wdWJsaWNJRCAhPSBudWxsICYmIGVpZC5wdWJsaWNJRC5lcXVhbHModGhpcy5wdWJsaWNJRCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoISgoZWlkLnN5c3RlbUlEID09IG51bGwgJiYgdGhpcy5zeXN0ZW1JRCA9PSBudWxsKSB8fCBlaWQuc3lzdGVtSUQgIT0gbnVsbCAmJiBlaWQuc3lzdGVtSUQuZXF1YWxzKHRoaXMuc3lzdGVtSUQpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgcmV0dmFsID0gMDsKLQkJaWYgKHB1YmxpY0lEICE9IG51bGwpCi0JCQlyZXR2YWwgPSBwdWJsaWNJRC5oYXNoQ29kZSgpOwotCQlpZiAoc3lzdGVtSUQgIT0gbnVsbCkKLQkJCXJldHZhbCArPSBzeXN0ZW1JRC5oYXNoQ29kZSgpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvTm90YXRpb25EZWNsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9Ob3RhdGlvbkRlY2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxNTgwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9Ob3RhdGlvbkRlY2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLS8qKgotICogTm90YXRpb25zIGFyZSBob3cgdGhlIERvY3VtZW50IFR5cGUgRGVzY3JpcHRpb24gKERURCkgcmVjb3JkcyBoaW50cyBhYm91dAotICogdGhlIGZvcm1hdCBvZiBhbiBYTUwgInVucGFyc2VkIGVudGl0eSIgLS0gaW4gb3RoZXIgd29yZHMsIG5vbi1YTUwgZGF0YQotICogYm91bmQgdG8gdGhpcyBkb2N1bWVudCB0eXBlLCB3aGljaCBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBjb25zdWx0Ci0gKiB3aGVuIG1hbmlwdWxhdGluZyB0aGUgZG9jdW1lbnQuIEEgTm90YXRpb24gcmVwcmVzZW50cyBhIG5hbWUtdmFsdWUgcGFpciwKLSAqIHdpdGggaXRzIG5vZGVOYW1lIGJlaW5nIHNldCB0byB0aGUgZGVjbGFyZWQgbmFtZSBvZiB0aGUgbm90YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3RhdGlvbkRlY2wgZXh0ZW5kcyBCYXNlTm9kZSB7Ci0JLyoqIFB1YmxpYyBpZGVudGlmaWVyLiAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVibGljSWQgPSBudWxsOwotCi0JLyoqIFN5c3RlbSBpZGVudGlmaWVyLiAqLwotCXByb3RlY3RlZCBTdHJpbmcgc3lzdGVtSWQgPSBudWxsOwotCi0JLy8KLQkvLyBDb25zdHJ1Y3RvcnMKLQkvLwotCi0JLyoqIEZhY3RvcnkgY29uc3RydWN0b3IuICovCi0JcHVibGljIE5vdGF0aW9uRGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFREKSB7Ci0JCXN1cGVyKG5hbWUsIG93bmVyRFREKTsKLQl9Ci0KLQkvLwotCS8vIE5vdGF0aW9uIG1ldGhvZHMKLQkvLwotCi0JLyoqCi0JICogVGhlIFB1YmxpYyBJZGVudGlmaWVyIGZvciB0aGlzIE5vdGF0aW9uLiBJZiBubyBwdWJsaWMgaWRlbnRpZmllciB3YXMKLQkgKiBzcGVjaWZpZWQsIHRoaXMgd2lsbCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0JCXJldHVybiBwdWJsaWNJZDsKLQl9IC8vIGdldFB1YmxpY0lkKCk6U3RyaW5nCi0KLQkvKioKLQkgKiBUaGUgU3lzdGVtIElkZW50aWZpZXIgZm9yIHRoaXMgTm90YXRpb24uIElmIG5vIHN5c3RlbSBpZGVudGlmaWVyIHdhcwotCSAqIHNwZWNpZmllZCwgdGhpcyB3aWxsIGJlIG51bGwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIHN5c3RlbUlkOwotCX0gLy8gZ2V0U3lzdGVtSWQoKTpTdHJpbmcKLQotCS8vCi0JLy8gUHVibGljIG1ldGhvZHMKLQkvLwotCi0JLyoqCi0JICogTk9OLURPTTogVGhlIFB1YmxpYyBJZGVudGlmaWVyIGZvciB0aGlzIE5vdGF0aW9uLiBJZiBubyBwdWJsaWMKLQkgKiBpZGVudGlmaWVyIHdhcyBzcGVjaWZpZWQsIHRoaXMgd2lsbCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lkKFN0cmluZyBpZCkgewotCQlwdWJsaWNJZCA9IGlkOwotCX0gLy8gc2V0UHVibGljSWQoU3RyaW5nKQotCi0JLyoqCi0JICogTk9OLURPTTogVGhlIFN5c3RlbSBJZGVudGlmaWVyIGZvciB0aGlzIE5vdGF0aW9uLiBJZiBubyBzeXN0ZW0KLQkgKiBpZGVudGlmaWVyIHdhcyBzcGVjaWZpZWQsIHRoaXMgd2lsbCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBpZCkgewotCQlzeXN0ZW1JZCA9IGlkOwotCX0gLy8gc2V0U3lzdGVtSWQoU3RyaW5nKQotCi19IC8vIGNsYXNzIE5vdGF0aW9uSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvU3RyaW5nUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9TdHJpbmdQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk5Yjc0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9TdHJpbmdQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi0vKioKLSAqIFJlYWRlciBmb3IgcHJvY2Vzc2luZy9wYXJzaW5nIHhtbCBzdHJpbmcKLSAqIAotICogQHZlcnNpb24KLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ1BhcnNlciB7Ci0JU3RyaW5nIGZEYXRhID0gbnVsbDsKLQlpbnQgZkVuZE9mZnNldDsKLQlpbnQgZk1vc3RSZWNlbnRDaGFyOwotCWludCBmQ3VycmVudE9mZnNldDsKLQlib29sZWFuIGZDYWxsZWRDaGFyUHJvcEluaXQgPSBmYWxzZTsKLQotCXB1YmxpYyBTdHJpbmdQYXJzZXIoU3RyaW5nIGRhdGEpIHsKLQkJZkRhdGEgPSBkYXRhOwotCQlmQ3VycmVudE9mZnNldCA9IDA7Ci0JCWZFbmRPZmZzZXQgPSBmRGF0YS5sZW5ndGgoKTsKLQkJZk1vc3RSZWNlbnRDaGFyID0gZkVuZE9mZnNldCA9PSAwID8gLTEgOiBmRGF0YS5jaGFyQXQoMCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlpZiAobGVuZ3RoID09IDApCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGZEYXRhLnN1YnN0cmluZyhvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhKCkgewotCQlyZXR1cm4gZkRhdGE7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZW1haW5pbmdTdHJpbmcoKSB7Ci0JCXJldHVybiBmRGF0YS5zdWJzdHJpbmcoZ2V0Q3VycmVudE9mZnNldCgpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEN1cnJlbnRPZmZzZXQoKSB7Ci0JCXJldHVybiBmQ3VycmVudE9mZnNldDsKLQl9Ci0KLQkvLwotCS8vCi0JcHVibGljIGludCBsb2FkTmV4dENoYXIoKSB7Ci0JCWlmICgrK2ZDdXJyZW50T2Zmc2V0ID49IGZFbmRPZmZzZXQpIHsKLQkJCWZNb3N0UmVjZW50Q2hhciA9IC0xOwotCQl9Ci0JCWVsc2UgewotCQkJZk1vc3RSZWNlbnRDaGFyID0gZkRhdGEuY2hhckF0KGZDdXJyZW50T2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gZk1vc3RSZWNlbnRDaGFyOwotCX0KLQkKLQlwdWJsaWMgaW50IGxvYWRQcmV2aW91c0NoYXIoKSB7Ci0JCWlmICgtLWZDdXJyZW50T2Zmc2V0IDwgMCkgCi0JCQlmTW9zdFJlY2VudENoYXIgPSAtMTsKLQkJZWxzZQotCQkJZk1vc3RSZWNlbnRDaGFyID0gZkRhdGEuY2hhckF0KGZDdXJyZW50T2Zmc2V0KTsKLQkJcmV0dXJuIGZNb3N0UmVjZW50Q2hhcjsKLQl9Ci0KLQkvLwotCS8vCi0JcHVibGljIGJvb2xlYW4gbG9va2luZ0F0Q2hhcihjaGFyIGNociwgYm9vbGVhbiBza2lwUGFzdENoYXIpIHsKLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCQlpZiAoY2ggIT0gY2hyKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHNraXBQYXN0Q2hhcikgewotCQkJaWYgKCsrZkN1cnJlbnRPZmZzZXQgPj0gZkVuZE9mZnNldCkgewotCQkJCWZNb3N0UmVjZW50Q2hhciA9IC0xOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZk1vc3RSZWNlbnRDaGFyID0gZkRhdGEuY2hhckF0KGZDdXJyZW50T2Zmc2V0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLwotCS8vCi0JLy8KLQlwdWJsaWMgYm9vbGVhbiBsb29raW5nQXRWYWxpZENoYXIoYm9vbGVhbiBza2lwUGFzdENoYXIpIHsKLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCQlpZiAoY2ggPCAweEQ4MDApIHsKLQkJCWlmIChjaCA8IDB4MjAgJiYgY2ggIT0gMHgwOSAmJiBjaCAhPSAweDBBICYmIGNoICE9IDB4MEQpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoc2tpcFBhc3RDaGFyKSB7Ci0JCQkJaWYgKCsrZkN1cnJlbnRPZmZzZXQgPj0gZkVuZE9mZnNldCkgewotCQkJCQlmTW9zdFJlY2VudENoYXIgPSAtMTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZNb3N0UmVjZW50Q2hhciA9IGZEYXRhLmNoYXJBdChmQ3VycmVudE9mZnNldCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGNoID4gMHhGRkZEKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGNoIDwgMHhEQzAwKSB7Ci0JCQlpZiAoZkN1cnJlbnRPZmZzZXQgKyAxID49IGZFbmRPZmZzZXQpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQljaCA9IGZEYXRhLmNoYXJBdChmQ3VycmVudE9mZnNldCArIDEpOwotCQkJaWYgKGNoIDwgMHhEQzAwIHx8IGNoID49IDB4RTAwMCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgaWYgKCFza2lwUGFzdENoYXIpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZDdXJyZW50T2Zmc2V0Kys7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoY2ggPCAweEUwMDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoc2tpcFBhc3RDaGFyKSB7Ci0JCQlpZiAoKytmQ3VycmVudE9mZnNldCA+PSBmRW5kT2Zmc2V0KSB7Ci0JCQkJZk1vc3RSZWNlbnRDaGFyID0gLTE7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmTW9zdFJlY2VudENoYXIgPSBmRGF0YS5jaGFyQXQoZkN1cnJlbnRPZmZzZXQpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vCi0JLy8KLQkvLwotCXB1YmxpYyBib29sZWFuIGxvb2tpbmdBdFNwYWNlKGJvb2xlYW4gc2tpcFBhc3RDaGFyKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJaWYgKGNoID4gMHgyMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGNoID09IDB4MjAgfHwgY2ggPT0gMHgwQSB8fCBjaCA9PSAweDBEIHx8IGNoID09IDB4MDkpIHsKLQkJCWlmIChza2lwUGFzdENoYXIpIHsKLQkJCQlsb2FkTmV4dENoYXIoKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLwotCS8vCi0JLy8KLQlwdWJsaWMgdm9pZCBza2lwVG9DaGFyKGNoYXIgY2hyLCBib29sZWFuIHNraXBQYXN0Q2hhcikgewotCQkvLwotCQkvLyBSRVZJU0lUIC0gdGhpcyB3aWxsIHNraXAgaW52YWxpZCBjaGFyYWN0ZXJzIHdpdGhvdXQgcmVwb3J0aW5nIHRoZW0uCi0JCS8vCi0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChjaCA9PSBjaHIpIHsKLQkJCQlpZiAoc2tpcFBhc3RDaGFyKSB7Ci0JCQkJCWxvYWROZXh0Q2hhcigpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoY2ggPT0gLTEpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljaCA9IGxvYWROZXh0Q2hhcigpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIHNraXBzIHRvIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIuCi0JICogaWYgPGNvZGU+c2tpcFBhc3RDaGFyPC9jb2RlPiBpcyB0cnVlLCB0aGUgcGFyc2VyIGlzCi0JICogaW5jcmVtZW50ZWQgcGFzdCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZSBjaGFyYWN0ZXIuCi0JICogVGhpcyBtZXRob2Qgc3RhcnRzIGF0IHRoZSBlbmQgb2YgdGhlIGNoYXJhY3RlciBkYXRhLCBhbmQKLQkgKiBtb3ZlcyBiYWNrd2FyZHMgdG8gZmluZCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZSBjaGFyYWN0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBza2lwVG9MYXN0T2ZDaGFyKGNoYXIgY2hyLCBib29sZWFuIHNraXBQYXN0Q2hhcikgewotCQlpbnQgY2ggPSAtMTsKLQkJCi0JCS8vIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgZW5kIG9mZnNldCB0byBzY2FuIGJhY2t3YXJkcy4KLQkJZkN1cnJlbnRPZmZzZXQgPSBmRW5kT2Zmc2V0OwotCQkKLQkJZG8gewotCQkJY2ggPSBsb2FkUHJldmlvdXNDaGFyKCk7Ci0JCQkKLQkJCWlmKGNoID09IC0xKQotCQkJCXJldHVybjsKLQkJCQotCQkJaWYgKGNoID09IGNocikgewotCQkJCWlmKHNraXBQYXN0Q2hhcikKLQkJCQkJbG9hZE5leHRDaGFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCX0gd2hpbGUodHJ1ZSk7Ci0JfQotCi0JLy8KLQkvLwotCS8vCi0JcHVibGljIHZvaWQgc2tpcFBhc3RTcGFjZXMoKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJaWYgKGNoID09IC0xKSB7Ci0JCQkvLyBjaGFuZ2VSZWFkZXJzKCkuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCXJldHVybjsKLQkJfQotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKGNoID4gMHgyMCB8fCAoY2ggIT0gMHgyMCAmJiBjaCAhPSAweDBBICYmIGNoICE9IDB4MDkgJiYgY2ggIT0gMHgwRCkpIHsKLQkJCQlmTW9zdFJlY2VudENoYXIgPSBjaDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoKytmQ3VycmVudE9mZnNldCA+PSBmRW5kT2Zmc2V0KSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJY2ggPSBmRGF0YS5jaGFyQXQoZkN1cnJlbnRPZmZzZXQpOwotCQl9Ci0JfQotCi0JLy8KLQkvLwotCS8vCi0KLQlwdWJsaWMgdm9pZCBza2lwUGFzdE5hbWVBbmRQRVJlZmVyZW5jZShjaGFyIGZhc3RjaGVjaykgewotCQlpbnQgY2ggPSBmTW9zdFJlY2VudENoYXI7Ci0KLQkJaWYgKGNoICE9ICclJykgewotCQkJaWYgKGNoIDwgMHg4MCkgewotCQkJCWlmIChjaCA9PSAtMSB8fCBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQXNjaWlJbml0aWFsTmFtZUNoYXJbY2hdID09IDApCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICghZkNhbGxlZENoYXJQcm9wSW5pdCkgewotCQkJCQlYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmluaXRDaGFyRmxhZ3MoKTsKLQkJCQkJZkNhbGxlZENoYXJQcm9wSW5pdCA9IHRydWU7Ci0JCQkJfQotCQkJCWlmICgoWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5mZ0NoYXJGbGFnc1tjaF0gJiBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLkVfSW5pdGlhbE5hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQljaCA9IGxvYWROZXh0Q2hhcigpOwotCQkJaWYgKGZhc3RjaGVjayA9PSBjaCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoY2ggPT0gJyUnIHx8IGNoID09ICc7JykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoY2ggPCAweDgwKSB7Ci0JCQkJaWYgKGNoID09IC0xIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaU5hbWVDaGFyW2NoXSA9PSAwKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIWZDYWxsZWRDaGFyUHJvcEluaXQpIHsKLQkJCQkJWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5pbml0Q2hhckZsYWdzKCk7Ci0JCQkJCWZDYWxsZWRDaGFyUHJvcEluaXQgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAoKFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdDaGFyRmxhZ3NbY2hdICYgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5FX05hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2tpcFBhc3ROYW1lKGNoYXIgZmFzdGNoZWNrKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJza2lwcGFzdE5hbWUgY2g6ICIgK2NoKTsKLQotCQlpZiAoY2ggPCAweDgwKSB7Ci0JCQlpZiAoY2ggPT0gLTEgfHwgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5mZ0FzY2lpSW5pdGlhbE5hbWVDaGFyW2NoXSA9PSAwKQotCQkJCXJldHVybjsKLQkJfQotCQllbHNlIHsKLQkJCWlmICghZkNhbGxlZENoYXJQcm9wSW5pdCkgewotCQkJCVhNTENoYXJhY3RlclByb3BlcnRpZXMuaW5pdENoYXJGbGFncygpOwotCQkJCWZDYWxsZWRDaGFyUHJvcEluaXQgPSB0cnVlOwotCQkJfQotCQkJaWYgKChYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQ2hhckZsYWdzW2NoXSAmIFhNTENoYXJhY3RlclByb3BlcnRpZXMuRV9Jbml0aWFsTmFtZUNoYXJGbGFnKSA9PSAwKQotCQkJCXJldHVybjsKLQkJfQotCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQljaCA9IGxvYWROZXh0Q2hhcigpOwotCQkJaWYgKGZhc3RjaGVjayA9PSBjaCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoY2ggPCAweDgwKSB7Ci0JCQkJaWYgKGNoID09IC0xIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaU5hbWVDaGFyW2NoXSA9PSAwKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIWZDYWxsZWRDaGFyUHJvcEluaXQpIHsKLQkJCQkJWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5pbml0Q2hhckZsYWdzKCk7Ci0JCQkJCWZDYWxsZWRDaGFyUHJvcEluaXQgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAoKFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdDaGFyRmxhZ3NbY2hdICYgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5FX05hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLy8KLQkvLwotCS8vCi0KLQlwdWJsaWMgdm9pZCBza2lwUGFzdE5tdG9rZW4oY2hhciBmYXN0Y2hlY2spIHsKLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKGZhc3RjaGVjayA9PSBjaCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoY2ggPCAweDgwKSB7Ci0JCQkJaWYgKGNoID09IC0xIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaU5hbWVDaGFyW2NoXSA9PSAwKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIWZDYWxsZWRDaGFyUHJvcEluaXQpIHsKLQkJCQkJWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5pbml0Q2hhckZsYWdzKCk7Ci0JCQkJCWZDYWxsZWRDaGFyUHJvcEluaXQgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAoKFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdDaGFyRmxhZ3NbY2hdICYgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5FX05hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJY2ggPSBsb2FkTmV4dENoYXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNraXBQYXN0Tm10b2tlbkFuZFBFUmVmZXJlbmNlKGNoYXIgZmFzdGNoZWNrKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChmYXN0Y2hlY2sgPT0gY2gpCi0JCQkJcmV0dXJuOwotCQkJaWYgKGNoID09ICclJyB8fCBjaCA9PSAnOycpIHsKLQkJCQljaCA9IGxvYWROZXh0Q2hhcigpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGNoIDwgMHg4MCkgewotCQkJCWlmIChjaCA9PSAtMSB8fCBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQXNjaWlOYW1lQ2hhcltjaF0gPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKCFmQ2FsbGVkQ2hhclByb3BJbml0KSB7Ci0JCQkJCVhNTENoYXJhY3RlclByb3BlcnRpZXMuaW5pdENoYXJGbGFncygpOwotCQkJCQlmQ2FsbGVkQ2hhclByb3BJbml0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKChYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQ2hhckZsYWdzW2NoXSAmIFhNTENoYXJhY3RlclByb3BlcnRpZXMuRV9OYW1lQ2hhckZsYWcpID09IDApCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWNoID0gbG9hZE5leHRDaGFyKCk7Ci0JCX0KLQl9Ci0KLQkvLwotCS8vCi0JLy8KLQlwdWJsaWMgYm9vbGVhbiBza2lwcGVkU3RyaW5nKGNoYXJbXSBzKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJaWYgKGNoICE9IHNbMF0pIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoZkN1cnJlbnRPZmZzZXQgKyBzLmxlbmd0aCA+IGZFbmRPZmZzZXQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZEYXRhLmNoYXJBdChmQ3VycmVudE9mZnNldCArIGkpICE9IHNbaV0pCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZDdXJyZW50T2Zmc2V0ICs9IChzLmxlbmd0aCAtIDEpOwotCQlsb2FkTmV4dENoYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8KLQkvLwotCS8vCi0JcHVibGljIGludCBzY2FuSW52YWxpZENoYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCQlsb2FkTmV4dENoYXIoKTsKLQkJcmV0dXJuIGNoOwotCX0KLQotCS8vCi0JLy8KLQkvLwotCS8qCi0JICogcHVibGljIGludCBzY2FuQ2hhclJlZihib29sZWFuIGhleCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGludCBjaCA9Ci0JICogZk1vc3RSZWNlbnRDaGFyOyBpZiAoY2ggPT0gLTEpIC8vIHJldHVybgotCSAqIGNoYW5nZVJlYWRlcnMoKS5zY2FuQ2hhclJlZihoZXgpOyByZXR1cm4gY2g7IGludCBudW0gPSAwOyBpZiAoaGV4KSB7IGlmCi0JICogKGNoID4gJ2YnIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaVhEaWdpdENoYXJbY2hdID09IDApIHJldHVybgotCSAqIFhNTEVudGl0eUhhbmRsZXIuQ0hBUlJFRl9SRVNVTFRfSU5WQUxJRF9DSEFSOyBudW0gPSBjaCAtIChjaCA8ICdBJyA/Ci0JICogJzAnIDogKGNoIDwgJ2EnID8gJ0EnIDogJ2EnKSAtIDEwKTsgfSBlbHNlIHsgaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknKQotCSAqIHJldHVybiBYTUxFbnRpdHlIYW5kbGVyLkNIQVJSRUZfUkVTVUxUX0lOVkFMSURfQ0hBUjsgbnVtID0gY2ggLSAnMCc7IH0KLQkgKiBib29sZWFuIHRvb2JpZyA9IGZhbHNlOyB3aGlsZSAodHJ1ZSkgeyBjaCA9IGxvYWROZXh0Q2hhcigpOyBpZiAoY2ggPT0KLQkgKiAtMSkgcmV0dXJuIFhNTEVudGl0eUhhbmRsZXIuQ0hBUlJFRl9SRVNVTFRfU0VNSUNPTE9OX1JFUVVJUkVEOyBpZiAoaGV4KSB7Ci0JICogaWYgKGNoID4gJ2YnIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaVhEaWdpdENoYXJbY2hdID09IDApCi0JICogYnJlYWs7IH0gZWxzZSB7IGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykgYnJlYWs7IH0gaWYgKGhleCkgeyBpbnQgZGlnID0KLQkgKiBjaCAtIChjaCA8ICdBJyA/ICcwJyA6IChjaCA8ICdhJyA/ICdBJyA6ICdhJykgLSAxMCk7IG51bSA9IChudW0gPDwgNCkgKwotCSAqIGRpZzsgfSBlbHNlIHsgaW50IGRpZyA9IGNoIC0gJzAnOyBudW0gPSAobnVtICogMTApICsgZGlnOyB9IGlmIChudW0gPgotCSAqIDB4MTBGRkZGKSB7IHRvb2JpZyA9IHRydWU7IG51bSA9IDA7IH0gfSBpZiAoY2ggIT0gJzsnKSByZXR1cm4KLQkgKiBYTUxFbnRpdHlIYW5kbGVyLkNIQVJSRUZfUkVTVUxUX1NFTUlDT0xPTl9SRVFVSVJFRDsgbG9hZE5leHRDaGFyKCk7IGlmCi0JICogKHRvb2JpZykgcmV0dXJuIFhNTEVudGl0eUhhbmRsZXIuQ0hBUlJFRl9SRVNVTFRfT1VUX09GX1JBTkdFOyByZXR1cm4KLQkgKiBudW07IH0KLQkgKi8KLQkvLwotCS8vCi0JLy8KLQkvKgotCSAqIHB1YmxpYyBpbnQgc2NhblN0cmluZ0xpdGVyYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsgYm9vbGVhbiBzaW5nbGU7IGlmCi0JICogKCEoc2luZ2xlID0gbG9va2luZ0F0Q2hhcignXCcnLCB0cnVlKSkgJiYgIWxvb2tpbmdBdENoYXIoJ1wiJywgdHJ1ZSkpIHsKLQkgKiByZXR1cm4gWE1MRW50aXR5SGFuZGxlci5TVFJJTkdMSVRfUkVTVUxUX1FVT1RFX1JFUVVJUkVEOyB9IGludCBvZmZzZXQgPQotCSAqIGZDdXJyZW50T2Zmc2V0OyBjaGFyIHFjaGFyID0gc2luZ2xlID8gJ1wnJyA6ICdcIic7IHdoaWxlCi0JICogKCFsb29raW5nQXRDaGFyKHFjaGFyLCBmYWxzZSkpIHsgaWYgKCFsb29raW5nQXRWYWxpZENoYXIodHJ1ZSkpIHsKLQkgKiByZXR1cm4gWE1MRW50aXR5SGFuZGxlci5TVFJJTkdMSVRfUkVTVUxUX0lOVkFMSURfQ0hBUjsgfSB9IC8vIGludAotCSAqIHN0cmluZ0luZGV4ID0gYWRkU3RyaW5nKG9mZnNldCwgZkN1cnJlbnRPZmZzZXQgLSBvZmZzZXQpOyBpbnQKLQkgKiBzdHJpbmdJbmRleCA9IGFkZFN0cmluZyhvZmZzZXQsIGZDdXJyZW50T2Zmc2V0IC0gb2Zmc2V0KTsKLQkgKiBsb29raW5nQXRDaGFyKHFjaGFyLCB0cnVlKTsgLy8gbW92ZSBwYXN0IHFjaGFyIHJldHVybiBzdHJpbmdJbmRleDsgfQotCSAqLwotCi0JLy8KLQkvLwotCXB1YmxpYyBib29sZWFuIHNjYW5BdHRWYWx1ZShjaGFyIHFjaGFyKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChsb29raW5nQXRDaGFyKHFjaGFyLCBmYWxzZSkpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChsb29raW5nQXRDaGFyKCcgJywgdHJ1ZSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICghbG9va2luZ0F0VmFsaWRDaGFyKHRydWUpKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJbG9va2luZ0F0Q2hhcihxY2hhciwgdHJ1ZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8KLQkvLyBbOV0gRW50aXR5VmFsdWUgOjo9ICciJyAoW14lJiJdIHwgUEVSZWZlcmVuY2UgfCBSZWZlcmVuY2UpKiAnIicKLQkvLyB8ICInIiAoW14lJiddIHwgUEVSZWZlcmVuY2UgfCBSZWZlcmVuY2UpKiAiJyIKLQkvLwotCS8vIFRoZSB2YWx1ZXMgaW4gdGhlIGZvbGxvd2luZyB0YWJsZSBhcmUgZGVmaW5lZCBhczoKLQkvLwotCS8vIDAgLSBub3Qgc3BlY2lhbAotCS8vIDEgLSBxdW90ZSBjaGFyYWN0ZXIKLQkvLyAyIC0gcmVmZXJlbmNlCi0JLy8gMyAtIHBlcmVmCi0JLy8gNCAtIGludmFsaWQKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpRW50aXR5VmFsdWVDaGFyW10gPSB7NCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgMCwgMCwgNCwgNCwgMCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgMCwgMCwgMSwgMCwgMCwgMywgMiwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gJ1wiJywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICclJywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICcmJywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdcJycKLQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKLQotCS8qCi0JICogcHVibGljIGludCBzY2FuRW50aXR5VmFsdWUoaW50IHFjaGFyLCBib29sZWFuIGNyZWF0ZVN0cmluZykgdGhyb3dzCi0JICogRXhjZXB0aW9uIHsgaW50IG9mZnNldCA9IGZDdXJyZW50T2Zmc2V0OyBpbnQgY2ggPSBmTW9zdFJlY2VudENoYXI7Ci0JICogd2hpbGUgKHRydWUpIHsgaWYgKGNoID09IC0xKSB7IGNoYW5nZVJlYWRlcnMoKTsgLy8gZG8gbm90IGNhbGwgbmV4dAotCSAqIHJlYWRlciwgb3VyIGNhbGxlciBtYXkgbmVlZCB0byBjaGFuZ2UgdGhlIHBhcmFtZXRlcnMgcmV0dXJuCi0JICogWE1MRW50aXR5SGFuZGxlci5FTlRJVFlWQUxVRV9SRVNVTFRfRU5EX09GX0lOUFVUOyB9IGlmIChjaCA8IDB4ODApIHsKLQkgKiBzd2l0Y2ggKGZnQXNjaWlFbnRpdHlWYWx1ZUNoYXJbY2hdKSB7IGNhc2UgMTogLy8gcXVvdGUgY2hhciBpZiAoY2ggPT0KLQkgKiBxY2hhcikgeyBpZiAoIWNyZWF0ZVN0cmluZykgcmV0dXJuCi0JICogWE1MRW50aXR5SGFuZGxlci5FTlRJVFlWQUxVRV9SRVNVTFRfRklOSVNIRUQ7IGludCBsZW5ndGggPQotCSAqIGZDdXJyZW50T2Zmc2V0IC0gb2Zmc2V0OyBpbnQgcmVzdWx0ID0gbGVuZ3RoID09IDAgPwotCSAqIFN0cmluZ1Bvb2wuRU1QVFlfU1RSSU5HIDogYWRkU3RyaW5nKG9mZnNldCwgbGVuZ3RoKTsgbG9hZE5leHRDaGFyKCk7Ci0JICogcmV0dXJuIHJlc3VsdDsgfSAvLyB0aGUgb3RoZXIgcXVvdGUgY2hhcmFjdGVyIGlzIG5vdCBzcGVjaWFsIC8vIGZhbGwKLQkgKiB0aHJvdWdoIGNhc2UgMDogLy8gbm9uLXNwZWNpYWwgY2hhciBpZiAoKytmQ3VycmVudE9mZnNldCA+PSBmRW5kT2Zmc2V0KSB7Ci0JICogaWYgKG93ZVRyYWlsaW5nU3BhY2UpIHsgb3dlVHJhaWxpbmdTcGFjZSA9IGZhbHNlOyBjaCA9IGZNb3N0UmVjZW50Q2hhciA9ICcgJzsgfQotCSAqIGVsc2UgeyBjaCA9IGZNb3N0UmVjZW50Q2hhciA9IC0xOyB9IH0gZWxzZSB7IGNoID0gZk1vc3RSZWNlbnRDaGFyID0KLQkgKiBmRGF0YS5jaGFyQXQoZkN1cnJlbnRPZmZzZXQpOyB9IGNvbnRpbnVlOyBjYXNlIDI6IC8vIHJlZmVyZW5jZSByZXR1cm4KLQkgKiBYTUxFbnRpdHlIYW5kbGVyLkVOVElUWVZBTFVFX1JFU1VMVF9SRUZFUkVOQ0U7IGNhc2UgMzogLy8gcGVyZWYgcmV0dXJuCi0JICogWE1MRW50aXR5SGFuZGxlci5FTlRJVFlWQUxVRV9SRVNVTFRfUEVSRUY7IGNhc2UgNDogLy8gaW52YWxpZCByZXR1cm4KLQkgKiBYTUxFbnRpdHlIYW5kbGVyLkVOVElUWVZBTFVFX1JFU1VMVF9JTlZBTElEX0NIQVI7IH0gfSBlbHNlIGlmIChjaCA8Ci0JICogMHhEODAwKSB7IGNoID0gbG9hZE5leHRDaGFyKCk7IH0gZWxzZSBpZiAoY2ggPj0gMHhFMDAwICYmIChjaCA8PSAweEZGRkQgfHwKLQkgKiAoY2ggPj0gMHgxMDAwMCAmJiBjaCA8PSAweDEwRkZGRikpKSB7IC8vIC8vIFJFVklTSVQgLSBuZWVkcyBtb3JlIGNvZGUKLQkgKiB0byBjaGVjayBzdXJyb2dhdGVzLiAvLyBjaCA9IGxvYWROZXh0Q2hhcigpOyB9IGVsc2UgeyByZXR1cm4KLQkgKiBYTUxFbnRpdHlIYW5kbGVyLkVOVElUWVZBTFVFX1JFU1VMVF9JTlZBTElEX0NIQVI7IH0gfSB9Ci0JICovCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvVFN0cmluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvVFN0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjEyZTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL1RTdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdGF0aWMgbWV0aG9kcyBmb3Igc29tZSBvZiB0aGUgdmVyeSB1c2VkIElTdHJpbmcKLSAqIG9wZXJhdGlvbnMKLSAqLwotCi1wdWJsaWMgY2xhc3MgVFN0cmluZyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFMUEhBQkVUID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFMUEhBTlVNRVJJQyA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNRVJJQyA9ICIwMTIzNDU2Nzg5IjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gY2hhbmdlIGFsbCBvY2N1cnJlbmNlcyBvZiBvbGRQYXQgdG8gbmV3UGF0Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hhbmdlKFN0cmluZyBpbiwgU3RyaW5nIG9sZFBhdCwgU3RyaW5nIG5ld1BhdCkgewotCQlpZiAob2xkUGF0Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gaW47Ci0JCWlmIChvbGRQYXQubGVuZ3RoKCkgPT0gMSAmJiBuZXdQYXQubGVuZ3RoKCkgPT0gMSkKLQkJCXJldHVybiBpbi5yZXBsYWNlKG9sZFBhdC5jaGFyQXQoMCksIG5ld1BhdC5jaGFyQXQoMCkpOwotCi0JCWludCBsYXN0SW5kZXggPSAwOwotCQlpbnQgbmV3SW5kZXggPSAwOwotCQlTdHJpbmdCdWZmZXIgbmV3U3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKDs7KSB7Ci0JCQluZXdJbmRleCA9IGluLmluZGV4T2Yob2xkUGF0LCBsYXN0SW5kZXgpOwotCQkJaWYgKG5ld0luZGV4ICE9IC0xKSB7Ci0JCQkJbmV3U3RyaW5nLmFwcGVuZChpbi5zdWJzdHJpbmcobGFzdEluZGV4LCBuZXdJbmRleCkgKyBuZXdQYXQpOwotCQkJCWxhc3RJbmRleCA9IG5ld0luZGV4ICsgb2xkUGF0Lmxlbmd0aCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmV3U3RyaW5nLmFwcGVuZChpbi5zdWJzdHJpbmcobGFzdEluZGV4KSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld1N0cmluZy50b1N0cmluZygpOwotCX0KLQotCS8vIGNoYW5nZSB0aGUgb2NjdXJyZW5jZXMgb2Ygb2xkUGF0IHRvIG5ld1BhdCBzdGFydGluZyBhdCBzdGFydFBvc2l0aW9uCi0JLy8gZm9yIG51bWJlciBvZiBudW1DaGFuZ2VzCi0JLy8gTm90ZTogdGhlIDFzdCBjaGFyIGluIHRoZSBzdHJpbmcgaGFzIHBvc2l0aW9uIG9mIDAKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoYW5nZShTdHJpbmcgaW4sIFN0cmluZyBvbGRQYXQsIFN0cmluZyBuZXdQYXQsIGludCBzdGFydFBvcywgaW50IG51bUNoYW5nZXMpIHsKLQkJaWYgKG9sZFBhdC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGluOwotCQlpZiAob2xkUGF0Lmxlbmd0aCgpID09IDEgJiYgbmV3UGF0Lmxlbmd0aCgpID09IDEpCi0JCQlyZXR1cm4gaW4ucmVwbGFjZShvbGRQYXQuY2hhckF0KDApLCBuZXdQYXQuY2hhckF0KDApKTsKLQotCQlpbnQgaW5MZW4gPSBpbi5sZW5ndGgoKTsKLQotCQlpZiAoc3RhcnRQb3MgPj0gaW5MZW4pCi0JCQlyZXR1cm4gaW47Ci0KLQkJaW50IGxhc3RJbmRleCA9IHN0YXJ0UG9zOwotCQlpbnQgbmV3SW5kZXggPSAwOwotCQlpbnQgY291bnRDaGFuZ2VzID0gMDsKLQotCi0JCVN0cmluZ0J1ZmZlciBuZXdTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJZm9yICg7OykgewotCQkJbmV3SW5kZXggPSBpbi5pbmRleE9mKG9sZFBhdCwgbGFzdEluZGV4KTsKLQkJCWlmIChuZXdJbmRleCAhPSAtMSkgewotCQkJCW5ld1N0cmluZy5hcHBlbmQoaW4uc3Vic3RyaW5nKGxhc3RJbmRleCwgbmV3SW5kZXgpICsgbmV3UGF0KTsKLQkJCQlsYXN0SW5kZXggPSBuZXdJbmRleCArIG9sZFBhdC5sZW5ndGgoKTsKLQkJCQljb3VudENoYW5nZXMrKzsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5ld1N0cmluZy5hcHBlbmQoaW4uc3Vic3RyaW5nKGxhc3RJbmRleCkpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoY291bnRDaGFuZ2VzID09IG51bUNoYW5nZXMpIHsKLQkJCQluZXdTdHJpbmcuYXBwZW5kKGluLnN1YnN0cmluZyhsYXN0SW5kZXgpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXdTdHJpbmcudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JkKFN0cmluZyBpbiwgaW50IGkpIHsKLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbik7Ci0JCWlmIChpIDw9IDAgfHwgaSA+IHN0LmNvdW50VG9rZW5zKCkpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSB7Ci0JCQlTdHJpbmcgcmV0ID0gbmV3IFN0cmluZygpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCXJldCA9IHN0Lm5leHRUb2tlbigpOwotCQkJCWlmICgtLWkgPT0gMCkKLQkJCQkJcmV0dXJuIHJldDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JkcyhTdHJpbmcgaW4sIGludCBpKSB7Ci0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW4pOwotCQlpZiAoaSA8PSAwIHx8IGkgPiBzdC5jb3VudFRva2VucygpKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgewotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCWlmICgtLWkgPT0gMCkKLQkJCQkJYnJlYWs7Ci0JCQkJc3QubmV4dFRva2VuKCk7Ci0JCQl9Ci0JCQlpZiAoc3QuaGFzTW9yZVRva2VucygpKQotCQkJCXJldHVybiBzdC5uZXh0VG9rZW4oIiIpOyAvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBlbmRTcGFjZXMoU3RyaW5nIGluLCBpbnQgbGVuKSB7Ci0JCWlmIChsZW4gPCAxKQotCQkJcmV0dXJuIGluOwotCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoaW4pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlzYi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IG51bVdvcmRzKFN0cmluZyBpbikgewotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluKTsKLQkJcmV0dXJuIHN0LmNvdW50VG9rZW5zKCk7Ci0JfQotCi0JLy8gcmV0dXJuIHRoZSBmaXJzdCBpbmRleCB3aXRoaW4gc3JjU3RyaW5nIHRoYXQgaXMgbm90IGluIHRoZSB2YWxpZFN0cmluZwotCS8vIGV4YW1wbGU6Ci0JLy8gc3JjU3RyaW5nID0gImFiY2RlZmciCi0JLy8gdmFsaWRTdHJpbmcgPSAiYmNmZyIKLQkvLyByZXR1cm4gPSAwIChpLmUuIGNoYXIgYSBpcyBub3QgaW4gImJjZmciKSAtIDFzdCBpbmRleCA9IDAKLQotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2ZBbnlCdXQoU3RyaW5nIHNyY1N0cmluZywgU3RyaW5nIHZhbGlkU3RyaW5nKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJaW50IHNyY0xlbiA9IHNyY1N0cmluZy5sZW5ndGgoKTsKLQotCQkvLyB3YWxrIGJhY2t3YXJkIHRvIGZpbmQgaWYgYSBjaGFyIHdpdGhpbiBzcmNTdHJpbmcgaXMgaW4gdmFsaWRTdHJpbmcKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcmNMZW47IGkrKykgewotCQkJLy8gbm90IGZvdW5kLCBzdG9wIGl0Ci0JCQlpZiAodmFsaWRTdHJpbmcuaW5kZXhPZihzcmNTdHJpbmcuY2hhckF0KGkpKSA9PSAtMSkgewotCQkJCXJlc3VsdCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gcmV0dXJuIHRoZSBsYXN0IGluZGV4IHdpdGhpbiBzcmNTdHJpbmcgdGhhdCBpcyBub3QgaW4gdGhlIHZhbGlkU3RyaW5nCi0JLy8gZXhhbXBsZToKLQkvLyBzcmNTdHJpbmcgPSAiYWJjZGVmZyIKLQkvLyB2YWxpZFN0cmluZyA9ICJiY2ZnIgotCS8vIHJldHVybiA9IDQgKGkuZS4gY2hhciBlIGlzIG5vdCBpbiAiYmNmZyIpIC0gMXN0IGluZGV4ID0gMAotCi0JcHVibGljIHN0YXRpYyBpbnQgbGFzdEluZGV4T2ZBbnlCdXQoU3RyaW5nIHNyY1N0cmluZywgU3RyaW5nIHZhbGlkU3RyaW5nKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJaW50IHNyY0xlbiA9IHNyY1N0cmluZy5sZW5ndGgoKTsKLQotCQkvLyB3YWxrIGJhY2t3YXJkIHRvIGZpbmQgaWYgYSBjaGFyIHdpdGhpbiBzcmNTdHJpbmcgaXMgaW4gdmFsaWRTdHJpbmcKLQkJZm9yIChpbnQgaSA9IHNyY0xlbiAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkvLyBub3QgZm91bmQsIHN0b3AgaXQKLQkJCWlmICh2YWxpZFN0cmluZy5pbmRleE9mKHNyY1N0cmluZy5jaGFyQXQoaSkpID09IC0xKSB7Ci0JCQkJcmVzdWx0ID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyByZXR1cm4gbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHNlYXJjaENoYXIgd2l0aGluIHNyY1N0cmluZwotCS8vIGV4YW1wbGU6Ci0JLy8gc3JjU3RyaW5nID0gIjo6Zjo6Zjo6ZyIKLQkvLyBzZWFjaHJDaGFyID0gJzonCi0JLy8gcmV0dXJuID0gNgotCi0JcHVibGljIHN0YXRpYyBpbnQgb2NjdXJyZW5jZU9mKFN0cmluZyBzcmNTdHJpbmcsIGNoYXIgc2VhcmNoQ2hhcikgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJLy8gd2FsayBiYWNrd2FyZCB0byBmaW5kIGlmIGEgY2hhciB3aXRoaW4gc3JjU3RyaW5nIGlzIGluIHZhbGlkU3RyaW5nCi0JCWlmIChzcmNTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3JjU3RyaW5nLmxlbmd0aCgpOyBpKyspIHsKLQkJCQkvLyBmb3VuZCwgaW5jcmVtZW50IHRoZSBjb3VudAotCQkJCWlmIChzZWFyY2hDaGFyID09IHNyY1N0cmluZy5jaGFyQXQoaSkpCi0JCQkJCXJlc3VsdCsrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyBzdHJpcCB0aGUgbGVhZGluZyBwU3RyaW5nIGluIHRoZSBzcmNTdHJpbmcKLQkvLyBleGFtcGxlOgotCS8vIHNyY1N0cmluZyA9ICI6OmY6OmY6OmciCi0JLy8gcFN0cmluZyAiOjoiCi0JLy8gcmV0dXJuID0gImY6OmY6OmciCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpcExlYWRpbmcoU3RyaW5nIHNyY1N0cmluZywgU3RyaW5nIHBTdHJpbmcpIHsKLQkJU3RyaW5nIHJlc3VsdDsKLQotCQlpZiAoc3JjU3RyaW5nLnN0YXJ0c1dpdGgocFN0cmluZykpIC8vIGxlYWRpbmcgcGF0U3RyaW5nIGZvdW5kCi0JCQlyZXN1bHQgPSBzcmNTdHJpbmcuc3Vic3RyaW5nKHBTdHJpbmcubGVuZ3RoKCksIHNyY1N0cmluZy5sZW5ndGgoKSk7Ci0JCWVsc2UKLQkJCS8vIG5vdCBmb3VuZAotCQkJcmVzdWx0ID0gc3JjU3RyaW5nOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gc3RyaXAgdGhlIHRyYWlsaW5nIHBTdHJpbmcgaW4gdGhlIHNyY1N0cmluZwotCS8vIGV4YW1wbGU6Ci0JLy8gc3JjU3RyaW5nID0gImY6OmY6Omc6OiIKLQkvLyBwU3RyaW5nICI6OiIKLQkvLyByZXR1cm4gPSAiZjo6Zjo6ZyIKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwVHJhaWxpbmcoU3RyaW5nIHNyY1N0cmluZywgU3RyaW5nIHBTdHJpbmcpIHsKLQkJU3RyaW5nIHJlc3VsdDsKLQotCQlpZiAoc3JjU3RyaW5nLmVuZHNXaXRoKHBTdHJpbmcpKSAvLyBsZWFkaW5nIHBhdFN0cmluZyBmb3VuZAotCQkJcmVzdWx0ID0gc3JjU3RyaW5nLnN1YnN0cmluZygwLCBzcmNTdHJpbmcubGFzdEluZGV4T2YocFN0cmluZykpOwotCQllbHNlCi0JCQkvLyBub3QgZm91bmQKLQkJCXJlc3VsdCA9IHNyY1N0cmluZzsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIHN0cmlwIHRoZSB0cmFpbGluZyBibGFua3MgaW4gdGhlIHNyYwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwVHJhaWxpbmdCbGFua3MoU3RyaW5nIHNyYykgewotCi0JCWlmIChzcmMgIT0gbnVsbCkgewotCQkJd2hpbGUgKHNyYy5sZW5ndGgoKSA+IDApIHsKLQkJCQlpZiAoc3JjLmVuZHNXaXRoKCIgIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJc3JjID0gc3JjLnN1YnN0cmluZygwLCBzcmMubGVuZ3RoKCkgLSAxKTsKLQkJCQllbHNlCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHNyYzsKLQl9Ci0KLQotCi0JLy8gcmV0dXJuIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgbnVtYmVyIG9mIGNvcGllcyBvZiBzcmNTdHJpbmcKLQkvLyBleGFtcGxlOgotCS8vIHNyY1N0cmluZyA9ICJhYmMiCi0JLy8gbnVtYmVyT2ZDb3BpZXMgPSAyCi0JLy8gcmV0dXJuIHN0cmluZyA9ICJhYmNhYmMiCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5KFN0cmluZyBzcmNTdHJpbmcsIGludCBudW1iZXJPZkNvcGllcykgewotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWlmIChudW1iZXJPZkNvcGllcyA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAxOyBpIDw9IG51bWJlck9mQ29waWVzOyBpKyspCi0JCQkJcmVzdWx0LmFwcGVuZChzcmNTdHJpbmcpOwotCQl9Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3JjU3RyaW5nKTsKLQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8KLQkvLyByZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcnMgaW4gc3JjU3RyaW5nIGFyZSBpbiB7YS4uLnp9IG9yIHtBLi4uWn0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FscGhhYmV0aWMoU3RyaW5nIHNyY1N0cmluZykgewotCQlyZXR1cm4gKGxhc3RJbmRleE9mQW55QnV0KHNyY1N0cmluZywgQUxQSEFCRVQpID09IC0xKTsKLQl9Ci0KLQkvLwotCS8vIHJldHVybiB0cnVlIGlmIGFsbCBjaGFycyBpbiBzcmNTdHJpbmcgYXJlIGluIHthLi4ueix9IG9yIHtBLi4uWn0KLQkvLyB7MC4uLjl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbHBoYW51bWVyaWMoU3RyaW5nIHNyY1N0cmluZykgewotCQlyZXR1cm4gKGxhc3RJbmRleE9mQW55QnV0KHNyY1N0cmluZywgQUxQSEFOVU1FUklDKSA9PSAtMSk7Ci0JfQotCi0KLQkvLwotCS8vIHJldHVybiB0cnVlIGlmIGFsbCBjaGFycyBhcmUgaW4gJzAnIC0gJzknCi0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEaWdpdHMoU3RyaW5nIHNyY1N0cmluZykgewotCQlyZXR1cm4gKGxhc3RJbmRleE9mQW55QnV0KHNyY1N0cmluZywgTlVNRVJJQykgPT0gLTEpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW1wdHlPck51bGwoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nID09IG51bGwgfHwgc3RyaW5nLmxlbmd0aCgpID09IDA7Ci0JfQotCi0KLQkvLwotCS8vIHJldHVybiB0aGUgc3RyaW5nIGFmdGVyIHRoZSBtYXRjaGluZyB0b2tlbiBpcyByZW1vdmVkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWF0Y2goU3RyaW5nIGluLCBTdHJpbmcgdG9rZW4pIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoaW4gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWluID0gaW4udHJpbSgpOwotCQlpZiAoaW4uc3RhcnRzV2l0aCh0b2tlbikpCi0JCQlyZXR1cm4gaW4uc3Vic3RyaW5nKHRva2VuLmxlbmd0aCgpLCBpbi5sZW5ndGgoKSk7Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkV4cGVjdGVkOiAiICsgdG9rZW4gKyAiIGJ1dCBnb3Q6IiArIHdvcmQoaW4sIDEpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHN0YXRpYyBsb25nIGdldExvbmcoU3RyaW5nIHN0cikgewotCQl0cnkgewotCQkJcmV0dXJuIExvbmcucGFyc2VMb25nKHN0cik7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBtKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCS8vIHJldHVybiB0cnVlIGlmIHRoZSAiICIgYXBwZWFycyB3aXRoaW4gc3JjU3RyaW5nCi0JLy8gZXhhbXBsZToKLQkvLyBzcmNTdHJpbmcgPSAiYSBtIgotCS8vIHJldHVybiA9IHRydWUKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0RvdWJsZUJsYW5rcyhTdHJpbmcgc3JjU3RyaW5nKSB7Ci0JCVN0cmluZyBiYiA9ICIgICI7IC8vJE5PTi1OTFMtMSQKLQkJY2hhciBiID0gYmIuY2hhckF0KDApOwotCi0JCWlmIChzcmNTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IChzcmNTdHJpbmcubGVuZ3RoKCkgLSAxKTsgaSsrKSB7Ci0JCQkJaWYgKChiID09IHNyY1N0cmluZy5jaGFyQXQoaSkpICYgKGIgPT0gc3JjU3RyaW5nLmNoYXJBdChpICsgMSkpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzM4MDM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL1hNTENoYXJhY3RlclByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotLyoqCi0gKiBBIGNsYXNzIHJlcHJlc2VudGluZyBwcm9wZXJ0aWVzIG9mIGNoYXJhY3RlcnMgYWNjb3JkaW5nIHRvIHZhcmlvdXMgVzNDCi0gKiByZWNvbW1lbmRhdGlvbnMKLSAqIAotICogWE1MQ2hhcmFjdGVyUHJvcGVydGllcyBwcm92aWRlcyBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBjb21tb25seSB1c2VkCi0gKiBjaGFyYWN0ZXIgdGVzdHMuCi0gKiAKLSAqIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGUgdGFibGVzIHVzZWQgYnkgdGhlIGNvbnZlbmllbmNlIG1ldGhvZHMgYXJlCi0gKiBhbHNvIHB1YmxpYywgYW5kIGFyZSBkaXJlY3RseSBhY2Nlc3NlZCBieSBwZXJmb3JtYW5jZSBjcml0aWNhbCByb3V0aW5lcy4KLSAqIAotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzIHsKLQkvKgotCSAqIFsyNl0gVmVyc2lvbk51bSA6Oj0gKFthLXpBLVowLTlfLjpdIHwgJy0nKSsKLQkgKiAKLQkgKiBOb3RlOiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBhc2NpaSBwb3J0aW9uIG9mIHRoZSBOYW1lQ2hhciBkZWZpbml0aW9uLgotCSAqLwotCS8qKgotCSAqIENoZWNrIHRvIHNlZSBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIHZlcnNpb24gc3RyaW5nIGFjY29yZGluZyB0byBbMjZdIGluCi0JICogdGhlIFhNTCAxLjAgUmVjb21tZW5kYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gdmVyc2lvbgotCSAqICAgICAgICAgICAgc3RyaW5nIHRvIGNoZWNrCi0JICogQHJldHVybiB0cnVlIGlmIHZlcnNpb24gaXMgYSB2YWxpZCB2ZXJzaW9uIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZFZlcnNpb25OdW0oU3RyaW5nIHZlcnNpb24pIHsKLQkJaWYgKHZlcnNpb24ubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2ZXJzaW9uLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgY2ggPSB2ZXJzaW9uLmNoYXJBdChpKTsKLQkJCWlmIChjaCA+ICd6JyB8fCBmZ0FzY2lpTmFtZUNoYXJbY2hdID09IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogWzgxXSBFbmNOYW1lIDo6PSBbQS1aYS16XSAoW0EtWmEtejAtOS5fXSB8ICctJykqCi0JICovCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgZW5jb2RpbmcgbmFtZSBhY2NvcmRpbmcgdG8gWzgxXSBpbgotCSAqIHRoZSBYTUwgMS4wIFJlY29tbWVuZGF0aW9uCi0JICogCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICogICAgICAgICAgICBzdHJpbmcgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRydWUgaWYgZW5jb2RpbmcgaXMgYSB2YWxpZCBlbmNvZGluZyBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkRW5jTmFtZShTdHJpbmcgZW5jb2RpbmcpIHsKLQkJaWYgKGVuY29kaW5nLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWNoYXIgY2ggPSBlbmNvZGluZy5jaGFyQXQoMCk7Ci0JCWlmIChjaCA+ICd6JyB8fCBmZ0FzY2lpQWxwaGFDaGFyW2NoXSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMTsgaSA8IGVuY29kaW5nLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoID0gZW5jb2RpbmcuY2hhckF0KGkpOwotCQkJaWYgKGNoID4gJ3onIHx8IGZnQXNjaWlFbmNOYW1lQ2hhcltjaF0gPT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiBbMTNdIFB1YmlkQ2hhciA6Oj0gI3gyMCB8ICN4RCB8ICN4QSB8IFthLXpBLVowLTldIHwKLQkgKiBbLScoKSssLi86PT87ISojQCRfJV0KLQkgKi8KLQkvKioKLQkgKiBDaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBwdWJsaWMgaWRlbnRpZmllciBhY2NvcmRpbmcgdG8gWzEzXQotCSAqIGluIHRoZSBYTUwgMS4wIFJlY29tbWVuZGF0aW9uCi0JICogCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogICAgICAgICAgICBzdHJpbmcgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRydWUgaWYgcHVibGljSWQgaXMgYSB2YWxpZCBwdWJsaWMgaWRlbnRpZmllcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHZhbGlkUHVibGljSWQoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmIChwdWJsaWNJZC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIC0xOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHB1YmxpY0lkLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBwdWJsaWNJZC5jaGFyQXQoaSk7Ci0JCQlpZiAoY2ggPiAneicgfHwgZmdBc2NpaVB1YmlkQ2hhcltjaF0gPT0gMCkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoKLQkgKiBbNV0gTmFtZSA6Oj0gKExldHRlciB8ICdfJyB8ICc6JykgKE5hbWVDaGFyKSoKLQkgKi8KLQkvKioKLQkgKiBDaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBOYW1lIGFjY29yZGluZyB0byBbNV0gaW4gdGhlIFhNTAotCSAqIDEuMCBSZWNvbW1lbmRhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBzdHJpbmcgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRydWUgaWYgbmFtZSBpcyBhIHZhbGlkIE5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVhNTENoYXJhY3RlclByb3BlcnRpZXMuaW5pdENoYXJGbGFncygpOwotCQlpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQljaGFyIGNoID0gbmFtZS5jaGFyQXQoMCk7Ci0JCWlmIChjaCA+ICd6JykgewotCQkJaWYgKChmZ0NoYXJGbGFnc1tjaF0gJiBFX0luaXRpYWxOYW1lQ2hhckZsYWcpID09IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgaWYgKGZnQXNjaWlJbml0aWFsTmFtZUNoYXJbY2hdID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7Ci0JCQljaCA9IG5hbWUuY2hhckF0KGkpOwotCQkJaWYgKGNoID4gJ3onKSB7Ci0JCQkJaWYgKChmZ0NoYXJGbGFnc1tjaF0gJiBFX05hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSBpZiAoZmdBc2NpaU5hbWVDaGFyW2NoXSA9PSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIGZyb20gdGhlIG5hbWVzcGFjZSByZWMgWzVdIE5DTmFtZSA6Oj0gKExldHRlciB8ICdfJyB8ICc6JykKLQkgKiAoTmFtZU5DQ2hhcikqCi0JICovCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgTkNOYW1lIGFjY29yZGluZyB0byBbNV0gZnJvbSB0aGUKLQkgKiBYTUwgTmFtZXNwYWNlcyAxLjAgUmVjb21tZW5kYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgc3RyaW5nIHRvIGNoZWNrCi0JICogQHJldHVybiB0cnVlIGlmIG5hbWUgaXMgYSB2YWxpZCBOQ05hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWROQ05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5pbml0Q2hhckZsYWdzKCk7Ci0JCWlmIChuYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWNoYXIgY2ggPSBuYW1lLmNoYXJBdCgwKTsKLQkJaWYgKGNoID4gJ3onKSB7Ci0JCQlpZiAoKGZnQ2hhckZsYWdzW2NoXSAmIEVfSW5pdGlhbE5hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSBpZiAoZmdBc2NpaUluaXRpYWxOQ05hbWVDaGFyW2NoXSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMTsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykgewotCQkJY2ggPSBuYW1lLmNoYXJBdChpKTsKLQkJCWlmIChjaCA+ICd6JykgewotCQkJCWlmICgoZmdDaGFyRmxhZ3NbY2hdICYgRV9OYW1lQ2hhckZsYWcpID09IDApCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZnQXNjaWlOQ05hbWVDaGFyW2NoXSA9PSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8qCi0JICogWzddIE5tdG9rZW4gOjo9IChOYW1lQ2hhcikrCi0JICovCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgTm10b2tlbiBhY2NvcmRpbmcgdG8gWzddIGluIHRoZSBYTUwKLQkgKiAxLjAgUmVjb21tZW5kYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gbm10b2tlbgotCSAqICAgICAgICAgICAgc3RyaW5nIHRvIGNoZWNqCi0JICogQHJldHVybiB0cnVlIGlmIG5tdG9rZW4gaXMgYSB2YWxpZCBObXRva2VuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkTm10b2tlbihTdHJpbmcgbm10b2tlbikgewotCQlYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmluaXRDaGFyRmxhZ3MoKTsKLQkJaWYgKG5tdG9rZW4ubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBubXRva2VuLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBubXRva2VuLmNoYXJBdChpKTsKLQkJCWlmIChjaCA+ICd6JykgewotCQkJCWlmICgoZmdDaGFyRmxhZ3NbY2hdICYgRV9OYW1lQ2hhckZsYWcpID09IDApCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZnQXNjaWlOYW1lQ2hhcltjaF0gPT0gMCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIEhlcmUgYXJlIHRhYmxlcyB1c2VkIHRvIGJ1aWxkIGNoYXJhY3RlciBwcm9wZXJ0aWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpWERpZ2l0Q2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICcwJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIC0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnOScKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAnQScgLSAnRicKLQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAnYScKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAtCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2YnCi0JCQkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlBbHBoYUNoYXJbXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnQScKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAtCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ08nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgLy8gJ1AnIC0gJ1onCi0JCQkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJ2EnIC0gJ28nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCAvLyAncCcgLSAneicKLQl9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpRW5jTmFtZUNoYXJbXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAvLyAnLScKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyRAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJy4nCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MkUKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAnMCcgLSAnOScKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnQScgLSAnTycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAvLyAnUCcgLSAnWicKLQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQgJ18nIGlzCi0JCQkJCQkJCQkJCQkJCQkJLy8gMHg1RgotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdhJyAtICdvJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAgLy8gJ3AnIC0gJ3onCi0JfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgZmdBc2NpaVB1YmlkQ2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIDEsIDEsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICcgJywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnIScsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJyMnLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICckJywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnJScsCi0JCQkJLy8gJ1wnJywgJygnLCAnKScsICcqJywgJysnLCAnLCcsICctJywgJy4nLCAnLycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAxLCAwLCAxLCAvLyAnMCcgLSAnOScsCi0JCQkJCQkJCQkJCQkJCQkJLy8gJzonLCAnOycsCi0JCQkJCQkJCQkJCQkJCQkJLy8gJz0nLCAnPycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnQCcsICdBJyAtCi0JCQkJCQkJCQkJCQkJCQkJLy8gJ08nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgLy8gJ1AnIC0gJ1onCi0JCQkJCQkJCQkJCQkJCQkJLy8gYW5kICdfJyBpcwotCQkJCQkJCQkJCQkJCQkJCS8vIDB4NUYKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnYScgLSAnbycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIC8vICdwJyAtICd6JwotCX07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlJbml0aWFsTmFtZUNoYXJbXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAvLyAnOicKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAweDNBCi0JCQkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJ0EnIC0gJ08nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgLy8gJ1AnIC0gJ1onCi0JCQkJCQkJCQkJCQkJCQkJLy8gYW5kICdfJyBpcwotCQkJCQkJCQkJCQkJCQkJCS8vIDB4NUYKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnYScgLSAnbycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIC8vICdwJyAtICd6JwotCX07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlOYW1lQ2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIC8vICctJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyRAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGFuZAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICcuJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyRQotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIC8vICcwJyAtICc5JwotCQkJCQkJCQkJCQkJCQkJCS8vIGFuZCAnOicgaXMKLQkJCQkJCQkJCQkJCQkJCQkvLyAweDNBCi0JCQkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJ0EnIC0gJ08nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgLy8gJ1AnIC0gJ1onCi0JCQkJCQkJCQkJCQkJCQkJLy8gYW5kICdfJyBpcwotCQkJCQkJCQkJCQkJCQkJCS8vIDB4NUYKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnYScgLSAnbycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIC8vICdwJyAtICd6JwotCX07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlJbml0aWFsTkNOYW1lQ2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICc6JwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4M0EKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnQScgLSAnTycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAvLyAnUCcgLSAnWicKLQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQgJ18nIGlzCi0JCQkJCQkJCQkJCQkJCQkJLy8gMHg1RgotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdhJyAtICdvJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAgLy8gJ3AnIC0gJ3onCi0JfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgZmdBc2NpaU5DTmFtZUNoYXJbXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAvLyAnLScKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MkQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnLicKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MkUKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAnMCcgLSAnOScKLQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQgJzonIGlzCi0JCQkJCQkJCQkJCQkJCQkJLy8gMHgzQQotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdBJyAtICdPJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIC8vICdQJyAtICdaJwotCQkJCQkJCQkJCQkJCQkJCS8vIGFuZCAnXycgaXMKLQkJCQkJCQkJCQkJCQkJCQkvLyAweDVGCi0JCQkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJ2EnIC0gJ28nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCAvLyAncCcgLSAneicKLQl9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpQ2hhckRhdGFbXSA9IHs0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCAwLCA0LCA0LCA0LCA0LCA0LCA0LCAvLyB0YWIKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MDkKLQkJCQk0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCAwLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAnJicKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MjYKLQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAvLyAnPCcgaXMgMHgzQwotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDMsIDAsIDAsIC8vICddJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHg1RAotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpV1NDaGFyRGF0YVtdID0gezQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDUsIDUsIDQsIDQsIDUsIDQsIDQsIC8vIHRhYgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgwOSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBMRgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgwQSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBDUgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgwRAotCQkJCTQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDUsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICcgJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyMCwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnJicKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4MjYKLQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAvLyAnPCcgaXMgMHgzQwotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDMsIDAsIDAsIC8vICddJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHg1RAotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBFX0NoYXJEYXRhRmxhZyA9IDEgPDwgMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRV9Jbml0aWFsTmFtZUNoYXJGbGFnID0gMSA8PCAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBFX05hbWVDaGFyRmxhZyA9IDEgPDwgMjsKLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBmZ0NoYXJGbGFncyA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGluaXRDaGFyRmxhZ3MoKSB7Ci0JCWlmIChmZ0NoYXJGbGFncyA9PSBudWxsKSB7Ci0JCQlmZ0NoYXJGbGFncyA9IG5ldyBieXRlWzB4MTAwMDBdOwotCQkJc2V0RmxhZ0ZvclJhbmdlKGZnQ2hhckRhdGFSYW5nZXMsIEVfQ2hhckRhdGFGbGFnKTsKLQkJCXNldEZsYWdGb3JSYW5nZShmZ0luaXRpYWxOYW1lQ2hhclJhbmdlcywgKGJ5dGUpIChFX0luaXRpYWxOYW1lQ2hhckZsYWcgfCBFX05hbWVDaGFyRmxhZykpOwotCQkJc2V0RmxhZ0ZvclJhbmdlKGZnTmFtZUNoYXJSYW5nZXMsIEVfTmFtZUNoYXJGbGFnKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0RmxhZ0ZvclJhbmdlKGNoYXJbXSByYW5nZXMsIGJ5dGUgZmxhZykgewotCQlpbnQgaTsKLQkJaW50IGNoOwotCQlmb3IgKGkgPSAwOyAoY2ggPSByYW5nZXNbaV0pICE9IDA7IGkgKz0gMikgewotCQkJaW50IGVuZGNoID0gcmFuZ2VzW2kgKyAxXTsKLQkJCXdoaWxlIChjaCA8PSBlbmRjaCkKLQkJCQlmZ0NoYXJGbGFnc1tjaCsrXSB8PSBmbGFnOwotCQl9Ci0JCWZvciAoaSsrOyAoY2ggPSByYW5nZXNbaV0pICE9IDA7IGkrKykKLQkJCWZnQ2hhckZsYWdzW2NoXSB8PSBmbGFnOwotCX0KLQotCS8qCi0JICogWzJdIENoYXIgOjo9ICN4OSB8ICN4QSB8ICN4RCB8IFsjeDIwLSN4RDdGRl0gLy8gYW55IFVuaWNvZGUgY2hhcmFjdGVyLAotCSAqIGV4Y2x1ZGluZyB0aGUgfCBbI3hFMDAwLSN4RkZGRF0gfCBbI3gxMDAwMC0jeDEwRkZGRl0gLy8gc3Vycm9nYXRlCi0JICogYmxvY2tzLCBGRkZFLCBhbmQgRkZGRi4gWzE0XSBDaGFyRGF0YSA6Oj0gW148Jl0qIC0gKFtePCZdKiAnXV0+JyBbXjwmXSopCi0JICogCi0JICogV2Ugd2lsbCB1c2UgQ2hhciAtICggW148Jl0gfCAnXScgfCAjeEEgfCAjeEQgKSBhbmQgaGFuZGxlIHRoZSBzcGVjaWFsCi0JICogY2FzZXMgaW5saW5lLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgZmdDaGFyRGF0YVJhbmdlc1tdID0gezB4MDAyMCwgMHgwMDI1LCAvLyAnJicgaXMKLQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgwMDI2Ci0JCQkJMHgwMDI3LCAweDAwM0IsIC8vICc8JyBpcyAweDAwM0MKLQkJCQkweDAwM0QsIDB4MDA1QywgLy8gJ10nIGlzIDB4MDA1RAotCQkJCTB4MDA1RSwgMHhEN0ZGLCAweEUwMDAsIDB4RkZGRCwgMHgwMDAwLCAweDAwMDksIC8vIHRhYgotCQkJCTB4MDAwMH07Ci0JLyoKLQkgKiBbNV0gTmFtZSA6Oj0gKExldHRlciB8ICdfJyB8ICc6JykgKE5hbWVDaGFyKSogWzRdIE5hbWVDaGFyIDo6PSBMZXR0ZXIgfAotCSAqIERpZ2l0IHwgJy4nIHwgJy0nIHwgJ18nIHwgJzonIHwgQ29tYmluaW5nQ2hhciB8IEV4dGVuZGVyIFs4NF0gTGV0dGVyCi0JICogOjo9IEJhc2VDaGFyIHwgSWRlb2dyYXBoaWMgWzg1XSBCYXNlQ2hhciA6Oj0gPHNlZSBzdGFuZGFyZD4gWzg2XQotCSAqIElkZW9ncmFwaGljIDo6PSA8c2VlIHN0YW5kYXJkPiBbODddIENvbWJpbmluZ0NoYXIgOjo9IDxzZWUgc3RhbmRhcmQ+Ci0JICogWzg4XSBEaWdpdCA6Oj0gPHNlZSBzdGFuZGFyZD4gWzg5XSBFeHRlbmRlciA6Oj0gPHNlZSBzdGFuZGFyZD4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIGZnSW5pdGlhbE5hbWVDaGFyUmFuZ2VzW10gPSB7Ci0JLy8KLQkJCQkvLyBSYW5nZXM6Ci0JCQkJLy8KLQkJCQkvLyBCYXNlQ2hhciByYW5nZXMKLQkJCQkvLwotCQkJCTB4MDA0MSwgMHgwMDVBLCAweDAwNjEsIDB4MDA3QSwgMHgwMEMwLCAweDAwRDYsIDB4MDBEOCwgMHgwMEY2LCAweDAwRjgsIDB4MDEzMSwgMHgwMTM0LCAweDAxM0UsIDB4MDE0MSwgMHgwMTQ4LCAweDAxNEEsIDB4MDE3RSwgMHgwMTgwLCAweDAxQzMsIDB4MDFDRCwgMHgwMUYwLCAweDAxRjQsIDB4MDFGNSwgMHgwMUZBLCAweDAyMTcsIDB4MDI1MCwgMHgwMkE4LCAweDAyQkIsIDB4MDJDMSwgMHgwMzg4LCAweDAzOEEsIDB4MDM4RSwgMHgwM0ExLCAweDAzQTMsIDB4MDNDRSwgMHgwM0QwLCAweDAzRDYsIDB4MDNFMiwgMHgwM0YzLCAweDA0MDEsIDB4MDQwQywgMHgwNDBFLCAweDA0NEYsIDB4MDQ1MSwgMHgwNDVDLCAweDA0NUUsIDB4MDQ4MSwgMHgwNDkwLCAweDA0QzQsIDB4MDRDNywgMHgwNEM4LCAweDA0Q0IsIDB4MDRDQywgMHgwNEQwLCAweDA0RUIsIDB4MDRFRSwgMHgwNEY1LCAweDA0RjgsIDB4MDRGOSwgMHgwNTMxLCAweDA1NTYsIDB4MDU2MSwgMHgwNTg2LCAweDA1RDAsIDB4MDVFQSwgMHgwNUYwLCAweDA1RjIsIDB4MDYyMSwgMHgwNjNBLCAweDA2NDEsIDB4MDY0QSwgMHgwNjcxLCAweDA2QjcsIDB4MDZCQSwgMHgwNkJFLCAweDA2QzAsIDB4MDZDRSwgMHgwNkQwLCAweDA2RDMsIDB4MDZFNSwgMHgwNkU2LCAweDA5MDUsIDB4MDkzOSwgMHgwOTU4LCAweDA5NjEsIDB4MDk4NSwgMHgwOThDLCAweDA5OEYsIDB4MDk5MCwgMHgwOTkzLCAweDA5QTgsIDB4MDlBQSwgMHgwOUIwLCAweDA5QjYsIDB4MDlCOSwgMHgwOURDLCAweDA5REQsIDB4MDlERiwgMHgwOUUxLCAweDA5RjAsIDB4MDlGMSwgMHgwQTA1LCAweDBBMEEsIDB4MEEwRiwgMHgwQTEwLCAweDBBMTMsIDB4MEEyOCwgMHgwQTJBLCAweDBBMzAsIDB4MEEzMiwgMHgwQTMzLCAweDBBMzUsIDB4MEEzNiwgMHgwQTM4LCAweDBBMzksIDB4MEE1OSwgMHgwQTVDLCAweDBBNzIsIDB4MEE3NCwgMHgwQTg1LCAweDBBOEIsIDB4MEE4RiwgMHgwQTkxLAotCQkJCTB4MEE5MywgMHgwQUE4LCAweDBBQUEsIDB4MEFCMCwgMHgwQUIyLCAweDBBQjMsIDB4MEFCNSwgMHgwQUI5LCAweDBCMDUsIDB4MEIwQywgMHgwQjBGLCAweDBCMTAsIDB4MEIxMywgMHgwQjI4LCAweDBCMkEsIDB4MEIzMCwgMHgwQjMyLCAweDBCMzMsIDB4MEIzNiwgMHgwQjM5LCAweDBCNUMsIDB4MEI1RCwgMHgwQjVGLCAweDBCNjEsIDB4MEI4NSwgMHgwQjhBLCAweDBCOEUsIDB4MEI5MCwgMHgwQjkyLCAweDBCOTUsIDB4MEI5OSwgMHgwQjlBLCAweDBCOUUsIDB4MEI5RiwgMHgwQkEzLCAweDBCQTQsIDB4MEJBOCwgMHgwQkFBLCAweDBCQUUsIDB4MEJCNSwgMHgwQkI3LCAweDBCQjksIDB4MEMwNSwgMHgwQzBDLCAweDBDMEUsIDB4MEMxMCwgMHgwQzEyLCAweDBDMjgsIDB4MEMyQSwgMHgwQzMzLCAweDBDMzUsIDB4MEMzOSwgMHgwQzYwLCAweDBDNjEsIDB4MEM4NSwgMHgwQzhDLCAweDBDOEUsIDB4MEM5MCwgMHgwQzkyLCAweDBDQTgsIDB4MENBQSwgMHgwQ0IzLCAweDBDQjUsIDB4MENCOSwgMHgwQ0UwLCAweDBDRTEsIDB4MEQwNSwgMHgwRDBDLCAweDBEMEUsIDB4MEQxMCwgMHgwRDEyLCAweDBEMjgsIDB4MEQyQSwgMHgwRDM5LCAweDBENjAsIDB4MEQ2MSwgMHgwRTAxLCAweDBFMkUsIDB4MEUzMiwgMHgwRTMzLCAweDBFNDAsIDB4MEU0NSwgMHgwRTgxLCAweDBFODIsIDB4MEU4NywgMHgwRTg4LCAweDBFOTQsIDB4MEU5NywgMHgwRTk5LCAweDBFOUYsIDB4MEVBMSwgMHgwRUEzLCAweDBFQUEsIDB4MEVBQiwgMHgwRUFELCAweDBFQUUsIDB4MEVCMiwgMHgwRUIzLCAweDBFQzAsIDB4MEVDNCwgMHgwRjQwLCAweDBGNDcsIDB4MEY0OSwgMHgwRjY5LCAweDEwQTAsIDB4MTBDNSwgMHgxMEQwLCAweDEwRjYsIDB4MTEwMiwgMHgxMTAzLCAweDExMDUsIDB4MTEwNywgMHgxMTBCLCAweDExMEMsIDB4MTEwRSwgMHgxMTEyLCAweDExNTQsIDB4MTE1NSwgMHgxMTVGLCAweDExNjEsIDB4MTE2RCwgMHgxMTZFLAotCQkJCTB4MTE3MiwgMHgxMTczLCAweDExQUUsIDB4MTFBRiwgMHgxMUI3LCAweDExQjgsIDB4MTFCQywgMHgxMUMyLCAweDFFMDAsIDB4MUU5QiwgMHgxRUEwLCAweDFFRjksIDB4MUYwMCwgMHgxRjE1LCAweDFGMTgsIDB4MUYxRCwgMHgxRjIwLCAweDFGNDUsIDB4MUY0OCwgMHgxRjRELCAweDFGNTAsIDB4MUY1NywgMHgxRjVGLCAweDFGN0QsIDB4MUY4MCwgMHgxRkI0LCAweDFGQjYsIDB4MUZCQywgMHgxRkMyLCAweDFGQzQsIDB4MUZDNiwgMHgxRkNDLCAweDFGRDAsIDB4MUZEMywgMHgxRkQ2LCAweDFGREIsIDB4MUZFMCwgMHgxRkVDLCAweDFGRjIsIDB4MUZGNCwgMHgxRkY2LCAweDFGRkMsIDB4MjEyQSwgMHgyMTJCLCAweDIxODAsIDB4MjE4MiwgMHgzMDQxLCAweDMwOTQsIDB4MzBBMSwgMHgzMEZBLCAweDMxMDUsIDB4MzEyQywgMHhBQzAwLCAweEQ3QTMsCi0JCQkJLy8KLQkJCQkvLyBJZGVvZ3JhcGhpYyByYW5nZXMKLQkJCQkvLwotCQkJCTB4MzAyMSwgMHgzMDI5LCAweDRFMDAsIDB4OUZBNSwKLQkJCQkvLwotCQkJCS8vIFJhbmdlcyBlbmQgbWFya2VyCi0JCQkJLy8KLQkJCQkweDAwMDAsCi0JCQkJLy8KLQkJCQkvLyBTaW5nbGUgY2hhciB2YWx1ZXMKLQkJCQkvLwotCQkJCTB4MDAzQSwgLy8gJzonCi0JCQkJMHgwMDVGLCAvLyAnXycKLQkJCQkvLwotCQkJCS8vIEJhc2VDaGFyIHNpbmdsZXMKLQkJCQkvLwotCQkJCTB4MDM4NiwgMHgwMzhDLCAweDAzREEsIDB4MDNEQywgMHgwM0RFLCAweDAzRTAsIDB4MDU1OSwgMHgwNkQ1LCAweDA5M0QsIDB4MDlCMiwgMHgwQTVFLCAweDBBOEQsIDB4MEFCRCwgMHgwQUUwLCAweDBCM0QsIDB4MEI5QywgMHgwQ0RFLCAweDBFMzAsIDB4MEU4NCwgMHgwRThBLCAweDBFOEQsIDB4MEVBNSwgMHgwRUE3LCAweDBFQjAsIDB4MEVCRCwgMHgxMTAwLCAweDExMDksIDB4MTEzQywgMHgxMTNFLCAweDExNDAsIDB4MTE0QywgMHgxMTRFLCAweDExNTAsIDB4MTE1OSwgMHgxMTYzLCAweDExNjUsIDB4MTE2NywgMHgxMTY5LCAweDExNzUsIDB4MTE5RSwgMHgxMUE4LCAweDExQUIsIDB4MTFCQSwgMHgxMUVCLCAweDExRjAsIDB4MTFGOSwgMHgxRjU5LCAweDFGNUIsIDB4MUY1RCwgMHgxRkJFLCAweDIxMjYsIDB4MjEyRSwKLQkJCQkvLwotCQkJCS8vIElkZW9ncmFwaGljIHNpbmdsZXMKLQkJCQkvLwotCQkJCTB4MzAwNywKLQkJCQkvLwotCQkJCS8vIFNpbmdsZXMgZW5kIG1hcmtlcgotCQkJCS8vCi0JCQkJMHgwMDAwfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIGZnTmFtZUNoYXJSYW5nZXNbXSA9IHsKLQkvLwotCQkJCS8vIFJhbmdlczoKLQkJCQkvLwotCQkJCTB4MDAyRCwgMHgwMDJFLCAvLyAnLScgYW5kICcuJwotCQkJCS8vCi0JCQkJLy8gQ29tYmluaW5nQ2hhciByYW5nZXMKLQkJCQkvLwotCQkJCTB4MDMwMCwgMHgwMzQ1LCAweDAzNjAsIDB4MDM2MSwgMHgwNDgzLCAweDA0ODYsIDB4MDU5MSwgMHgwNUExLCAweDA1QTMsIDB4MDVCOSwgMHgwNUJCLCAweDA1QkQsIDB4MDVDMSwgMHgwNUMyLCAweDA2NEIsIDB4MDY1MiwgMHgwNkQ2LCAweDA2REMsIDB4MDZERCwgMHgwNkRGLCAweDA2RTAsIDB4MDZFNCwgMHgwNkU3LCAweDA2RTgsIDB4MDZFQSwgMHgwNkVELCAweDA5MDEsIDB4MDkwMywgMHgwOTNFLCAweDA5NEMsIDB4MDk1MSwgMHgwOTU0LCAweDA5NjIsIDB4MDk2MywgMHgwOTgxLCAweDA5ODMsIDB4MDlDMCwgMHgwOUM0LCAweDA5QzcsIDB4MDlDOCwgMHgwOUNCLCAweDA5Q0QsIDB4MDlFMiwgMHgwOUUzLCAweDBBNDAsIDB4MEE0MiwgMHgwQTQ3LCAweDBBNDgsIDB4MEE0QiwgMHgwQTRELCAweDBBNzAsIDB4MEE3MSwgMHgwQTgxLCAweDBBODMsIDB4MEFCRSwgMHgwQUM1LCAweDBBQzcsIDB4MEFDOSwgMHgwQUNCLCAweDBBQ0QsIDB4MEIwMSwgMHgwQjAzLCAweDBCM0UsIDB4MEI0MywgMHgwQjQ3LCAweDBCNDgsIDB4MEI0QiwgMHgwQjRELCAweDBCNTYsIDB4MEI1NywgMHgwQjgyLCAweDBCODMsIDB4MEJCRSwgMHgwQkMyLCAweDBCQzYsIDB4MEJDOCwgMHgwQkNBLCAweDBCQ0QsIDB4MEMwMSwgMHgwQzAzLCAweDBDM0UsIDB4MEM0NCwgMHgwQzQ2LCAweDBDNDgsIDB4MEM0QSwgMHgwQzRELCAweDBDNTUsIDB4MEM1NiwgMHgwQzgyLCAweDBDODMsIDB4MENCRSwgMHgwQ0M0LCAweDBDQzYsIDB4MENDOCwgMHgwQ0NBLCAweDBDQ0QsIDB4MENENSwgMHgwQ0Q2LCAweDBEMDIsIDB4MEQwMywgMHgwRDNFLCAweDBENDMsIDB4MEQ0NiwgMHgwRDQ4LCAweDBENEEsIDB4MEQ0RCwgMHgwRTM0LCAweDBFM0EsIDB4MEU0NywgMHgwRTRFLCAweDBFQjQsIDB4MEVCOSwgMHgwRUJCLCAweDBFQkMsIDB4MEVDOCwgMHgwRUNELCAweDBGMTgsIDB4MEYxOSwgMHgwRjcxLCAweDBGODQsIDB4MEY4NiwgMHgwRjhCLAotCQkJCTB4MEY5MCwgMHgwRjk1LCAweDBGOTksIDB4MEZBRCwgMHgwRkIxLCAweDBGQjcsIDB4MjBEMCwgMHgyMERDLCAweDMwMkEsIDB4MzAyRiwKLQkJCQkvLwotCQkJCS8vIERpZ2l0IHJhbmdlcwotCQkJCS8vCi0JCQkJMHgwMDMwLCAweDAwMzksIDB4MDY2MCwgMHgwNjY5LCAweDA2RjAsIDB4MDZGOSwgMHgwOTY2LCAweDA5NkYsIDB4MDlFNiwgMHgwOUVGLCAweDBBNjYsIDB4MEE2RiwgMHgwQUU2LCAweDBBRUYsIDB4MEI2NiwgMHgwQjZGLCAweDBCRTcsIDB4MEJFRiwgMHgwQzY2LCAweDBDNkYsIDB4MENFNiwgMHgwQ0VGLCAweDBENjYsIDB4MEQ2RiwgMHgwRTUwLCAweDBFNTksIDB4MEVEMCwgMHgwRUQ5LCAweDBGMjAsIDB4MEYyOSwKLQkJCQkvLwotCQkJCS8vIEV4dGVuZGVyIHJhbmdlcwotCQkJCS8vCi0JCQkJMHgzMDMxLCAweDMwMzUsIDB4MzA5RCwgMHgzMDlFLCAweDMwRkMsIDB4MzBGRSwKLQkJCQkvLwotCQkJCS8vIFJhbmdlcyBlbmQgbWFya2VyCi0JCQkJLy8KLQkJCQkweDAwMDAsCi0JCQkJLy8KLQkJCQkvLyBTaW5nbGUgY2hhciB2YWx1ZXMKLQkJCQkvLwotCQkJCS8vIENvbWJpbmluZ0NoYXIgc2luZ2xlcwotCQkJCS8vCi0JCQkJMHgwNUJGLCAweDA1QzQsIDB4MDY3MCwgMHgwOTNDLCAweDA5NEQsIDB4MDlCQywgMHgwOUJFLCAweDA5QkYsIDB4MDlENywgMHgwQTAyLCAweDBBM0MsIDB4MEEzRSwgMHgwQTNGLCAweDBBQkMsIDB4MEIzQywgMHgwQkQ3LCAweDBENTcsIDB4MEUzMSwgMHgwRUIxLCAweDBGMzUsIDB4MEYzNywgMHgwRjM5LCAweDBGM0UsIDB4MEYzRiwgMHgwRjk3LCAweDBGQjksIDB4MjBFMSwgMHgzMDk5LCAweDMwOUEsCi0JCQkJLy8KLQkJCQkvLyBFeHRlbmRlciBzaW5nbGVzCi0JCQkJLy8KLQkJCQkweDAwQjcsIDB4MDJEMCwgMHgwMkQxLCAweDAzODcsIDB4MDY0MCwgMHgwRTQ2LCAweDBFQzYsIDB4MzAwNSwKLQkJCQkvLwotCQkJCS8vIFNpbmdsZXMgZW5kIG1hcmtlcgotCQkJCS8vCi0JCQkJMHgwMDAwfTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RURFZhbGlkYXRpb25NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOWYyYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IERURCBWYWxpZGF0aW9uCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRFREVmFsaWRhdGlvbk1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfUkVGX0VMRU1FTlRfVU5ERUZJTkVEOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19EVERfSU5WQUxJRF9URVhUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9ESUFMT0dfRFREX0lOVkFMSURfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19EVERfVkFMSURfVEVYVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRElBTE9HX0RURF9WQUxJRF9USVRMRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRFREVmFsaWRhdGlvblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3NpbmdfcmVxdWlyZWRfZmlsZXNfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNaXNzaW5nX3JlcXVpcmVkX2ZpbGVzXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlzc2luZ19yZXF1aXJlZF9maWxlc18zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3NpbmdfcmVxdWlyZWRfZmlsZXNfNDsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBEVERWYWxpZGF0aW9uTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RURFZhbGlkYXRpb25SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RURFZhbGlkYXRpb25SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJhMmQ2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9EVERWYWxpZGF0aW9uUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSEKLSEgVmFsaWRhdGUgRFRECi0hCi1fVUlfRElBTE9HX0RURF9JTlZBTElEX1RJVExFICA9IFZhbGlkYXRpb24gRmFpbGVkCi1fVUlfRElBTE9HX0RURF9WQUxJRF9USVRMRSAgICA9IFZhbGlkYXRpb24gU3VjY2VlZGVkCi1fVUlfRElBTE9HX0RURF9WQUxJRF9URVhUICAgICA9IFRoZSBEVEQgZmlsZSBpcyB2YWxpZC4KLV9VSV9ESUFMT0dfRFREX0lOVkFMSURfVEVYVCAgID0gVGhlIERURCBmaWxlIGlzIG5vdCB2YWxpZC4gU2VlIHRoZSBQcm9ibGVtcyB2aWV3IGZvciBlcnJvciBtZXNzYWdlcy4KLQotIQotISBSZWZlcmVuY2VkIEVsZW1lbnQgVmFsaWRhdGlvbgotIQotX0VSUk9SX1JFRl9FTEVNRU5UX1VOREVGSU5FRCA9IFRoZSBlbGVtZW50IHswfSBoYXMgbm90IGJlZW4gZGVjbGFyZWQuCi1NaXNzaW5nX3JlcXVpcmVkX2ZpbGVzXzE9UmVxdWlyZWQgZmlsZXMgeGVyY2VzSW1wbC5qYXIgYW5kIHhtbFBhcnNlckFQSXMuamFyIGNhbm5vdCBiZSBmb3VuZC5cblxuCi1NaXNzaW5nX3JlcXVpcmVkX2ZpbGVzXzI9RG93bmxvYWQgWGVyY2VzIDIuNi4yIGFuZCBwbGFjZSB4ZXJjZXNJbXBsLmphciBhbmQgeG1sUGFyc2VyQVBJcy5qYXIgaW4gYSBmb2xkZXIgZW50aXRsZWQgamFycyBpbiB0aGUgb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uIHBsdWdpbi5cblxuCi1NaXNzaW5nX3JlcXVpcmVkX2ZpbGVzXzM9Rm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHd3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy93c3QvY29tcG9uZW50cy94bWwveGVyY2VzSW5mby54bWwuCi1NaXNzaW5nX3JlcXVpcmVkX2ZpbGVzXzQ9TWlzc2luZyBYZXJjZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RURFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYWIwYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5MYXp5VVJMSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogRFREIHZhbGlkYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERWYWxpZGF0b3IgewotCS8qKgotCSAqIEFuIGVudGl0eSByZXNvbHZlciB0aGF0IHdyYXBzIGEgVVJJIHJlc29sdmVyLgotCSAqLwotCWNsYXNzIERUREVudGl0eVJlc29sdmVyIGltcGxlbWVudHMgRW50aXR5UmVzb2x2ZXIgewotCQlwcml2YXRlIFN0cmluZyBmQmFzZUxvY2F0aW9uID0gbnVsbDsKLQkJcHJpdmF0ZSBVUklSZXNvbHZlciBmVVJJUmVzb2x2ZXIgPSBudWxsOwotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3Rvci4KLQkJICogCi0JCSAqIEBwYXJhbSBpZHJlc29sdmVyCi0JCSAqICAgICAgICAgICAgVGhlIGlkcmVzb2x2ZXIgdGhpcyBlbnRpdHkgcmVzb2x2ZXIgd3JhcHMuCi0JCSAqIEBwYXJhbSBiYXNlbG9jYXRpb24KLQkJICogICAgICAgICAgICBUaGUgYmFzZSBsb2NhdGlvbiB0byByZXNvbHZlIHdpdGguCi0JCSAqLwotCQlwdWJsaWMgRFRERW50aXR5UmVzb2x2ZXIoVVJJUmVzb2x2ZXIgdXJpcmVzb2x2ZXIsIFN0cmluZyBiYXNlbG9jYXRpb24pIHsKLQkJCXRoaXMuZlVSSVJlc29sdmVyID0gdXJpcmVzb2x2ZXI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFRPRE8gY3M6IHdlIG5ldmVyIHNlZW0gdG8gc2V0IGEgVVJJUmVzb2x2ZXIKLSAgICAgICAgICAgIC8vIEkgY3JlYXRlIG9uZSBoZXJlIHVwIGZyb250IGp1c3QgaW5jYXNlCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgaWYgKGZVUklSZXNvbHZlciA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmVVJJUmVzb2x2ZXIgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOyAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9ICAKLQkJCXRoaXMuZkJhc2VMb2NhdGlvbiA9IGJhc2Vsb2NhdGlvbjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkJU3RyaW5nIGxvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0JCQlpZiAoZkJhc2VMb2NhdGlvbi5lcXVhbHMoc3lzdGVtSWQpKSB7Ci0JCQkJbG9jYXRpb24gPSBzeXN0ZW1JZDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWxvY2F0aW9uID0gZlVSSVJlc29sdmVyLnJlc29sdmUoZkJhc2VMb2NhdGlvbiwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJCX0KLQkJCUlucHV0U291cmNlIGlzID0gbnVsbDsKLQkJCWlmIChsb2NhdGlvbiAhPSBudWxsICYmICFsb2NhdGlvbi5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkgIC8vIENTIDogd2hpbGUgd29ya2luZyBvbiBidWcgMTEzNTM3IEkgbm90aWNlZCB3ZSdyZSBub3QgdXNpbmcgdGhlIExhenlVUkxJbnB1dFN0cmVhbQotCQkgICAgICAvLyBzbyBmaXhlZCB0aGlzIHRvIGF2b2lkIGxlYWtpbmcgZmlsZSBoYW5kbGVzCi0JCQkgIC8vCi0gICAgICAgICAgICAgIFN0cmluZyBwaHlzaWNhbCA9IGZVUklSZXNvbHZlci5yZXNvbHZlUGh5c2ljYWxMb2NhdGlvbihmQmFzZUxvY2F0aW9uLCBwdWJsaWNJZCwgbG9jYXRpb24pOyAKLQkJCSAgaXMgPSBuZXcgSW5wdXRTb3VyY2UobG9jYXRpb24pOwotCQkJICBpcy5zZXRCeXRlU3RyZWFtKG5ldyBMYXp5VVJMSW5wdXRTdHJlYW0ocGh5c2ljYWwpKTsKLQkJCX0KLQkJCXJldHVybiBpczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFuIGVycm9yIGhhbmRsZXIgZm9yIERURCB2YWxpZGF0aW9uLgotCSAqIAotCSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLQkgKi8KLQljbGFzcyBEVERFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBFcnJvckhhbmRsZXIgewotCi0JCXByaXZhdGUgZmluYWwgaW50IEVSUk9SID0gMDsKLQkJcHJpdmF0ZSBmaW5hbCBWYWxpZGF0aW9uSW5mbyBmVmFsaWRhdGlvbkluZm87Ci0KLQkJcHJpdmF0ZSBmaW5hbCBpbnQgV0FSTklORyA9IDE7Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdG9yLgotCQkgKiAKLQkJICogQHBhcmFtIHZhbGluZm8KLQkJICogICAgICAgICAgICBUaGUgdmFsaWRhdGlvbiBpbmZvIG9iamVjdCB0byB1c2UgdG8gcmVnaXN0ZXIgdmFsaWRhdGlvbgotCQkgKiAgICAgICAgICAgIG1lc3NhZ2VzLgotCQkgKi8KLQkJcHVibGljIERUREVycm9ySGFuZGxlcihWYWxpZGF0aW9uSW5mbyB2YWxpbmZvKSB7Ci0JCQl0aGlzLmZWYWxpZGF0aW9uSW5mbyA9IHZhbGluZm87Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIGEgdmFsaWRhdGlvbiBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIHNldmVyaXR5LgotCQkgKiAKLQkJICogQHBhcmFtIGV4Y2VwdGlvbgotCQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gdGhhdCBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JCSAqICAgICAgICAgICAgbWVzc2FnZS4KLQkJICogQHBhcmFtIHNldmVyaXR5Ci0JCSAqICAgICAgICAgICAgVGhlIHNldmVyaXR5IG9mIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBhZGRWYWxpZGF0aW9uTWVzc2FnZShTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24sIGludCBzZXZlcml0eSkgewotCQkJaWYgKGV4Y2VwdGlvbi5nZXRTeXN0ZW1JZCgpICE9IG51bGwpIHsKLQkJCQlpZiAoc2V2ZXJpdHkgPT0gV0FSTklORykgewotCQkJCQlmVmFsaWRhdGlvbkluZm8uYWRkV2FybmluZyhleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBleGNlcHRpb24uZ2V0TGluZU51bWJlcigpLCBleGNlcHRpb24uZ2V0Q29sdW1uTnVtYmVyKCksIGV4Y2VwdGlvbi5nZXRTeXN0ZW1JZCgpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZWYWxpZGF0aW9uSW5mby5hZGRFcnJvcihleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBleGNlcHRpb24uZ2V0TGluZU51bWJlcigpLCBleGNlcHRpb24uZ2V0Q29sdW1uTnVtYmVyKCksIGV4Y2VwdGlvbi5nZXRTeXN0ZW1JZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNlcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShleGNlcHRpb24sIEVSUk9SKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2ZhdGFsRXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShleGNlcHRpb24sIEVSUk9SKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI3dhcm5pbmcob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShleGNlcHRpb24sIFdBUk5JTkcpOwotCQl9Ci0JfQotCi0JY2xhc3MgTXVsdGlIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgaW1wbGVtZW50cyBvcmcueG1sLnNheC5EVERIYW5kbGVyLCBDb250ZW50SGFuZGxlciwgTGV4aWNhbEhhbmRsZXIsIERlY2xIYW5kbGVyIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTU9ESUZJRVJTID0gIiorPyI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxfREVMSU1JVEVSUyA9ICIsKCl8ICI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcml2YXRlIExpc3QgZkVsZW1EZWNscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwcml2YXRlIEhhc2h0YWJsZSBmRWxlbVJlZnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJcHJpdmF0ZSBMaXN0IGZJZ25vcmVFbGVtTW9kZWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHJpdmF0ZSBMaXN0IGZJZ25vcmVFbGVtUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwcml2YXRlIExvY2F0b3IgZkxvY2F0b3IgPSBudWxsOwotCi0JCXB1YmxpYyBNdWx0aUhhbmRsZXIoKSB7Ci0JCQlmSWdub3JlRWxlbVJlZnMuYWRkKCIjUENEQVRBIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZJZ25vcmVFbGVtTW9kZWwuYWRkKCJBTlkiKTsgLy8kTk9OLU5MUy0xJAotCQkJZklnbm9yZUVsZW1Nb2RlbC5hZGQoIkVNUFRZIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyI2F0dHJpYnV0ZURlY2woamF2YS5sYW5nLlN0cmluZywKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhdHRyaWJ1dGVEZWNsKFN0cmluZyBlTmFtZSwgU3RyaW5nIGFOYW1lLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZhbHVlRGVmYXVsdCwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIE5vIG1ldGhvZCBpbXBsLgotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjY29tbWVudChjaGFyW10sIGludCwgaW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgY29tbWVudChjaGFyW10gYXJnMCwgaW50IGFyZzEsIGludCBhcmcyKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIE5vIG1ldGhvZCBpbXBsLgotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjZWxlbWVudERlY2woamF2YS5sYW5nLlN0cmluZywKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZWxlbWVudERlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBtb2RlbCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBBZGQgdGhpcyBlbGVtZW50IHRvIHRoZSBsaXN0IG9mIGRlY2xhcmVkIGVsZW1lbnRzLgotCQkJZkVsZW1EZWNscy5hZGQobmFtZSk7Ci0KLQkJCS8vIFJldHVybiBpZiB0aGUgZWxlbWVudCBtb2RlbCBzaG91bGQgYmUgaWdub3JlZC4gVGhlIG1vZGVsIHNob3VsZAotCQkJLy8gYmUKLQkJCS8vIGlnbm9yZWQgaW4gc3VjaCBjYXNlcyBhcyB3aGVuIGl0IGlzIGVxdWFsIHRvIEVNUFRZIG9yIEFOWS4KLQkJCWlmIChmSWdub3JlRWxlbU1vZGVsLmNvbnRhaW5zKG1vZGVsKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8vIEFkZCBlYWNoIHJlZmVyZW5jZWQgZWxlbWVudCB0byB0aGUgbGlzdCBvZiByZWZlcmVuY2VkIGVsZW1lbnRzCi0JCQlpbnQgbGluZSA9IGZMb2NhdG9yLmdldExpbmVOdW1iZXIoKTsKLQkJCWludCBjb2x1bW4gPSBmTG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKTsKLQkJCVN0cmluZyB1cmkgPSBmTG9jYXRvci5nZXRTeXN0ZW1JZCgpOwotCi0JCQlTdHJpbmdUb2tlbml6ZXIgc3RydG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihtb2RlbCwgTU9ERUxfREVMSU1JVEVSUyk7Ci0JCQl3aGlsZSAoc3RydG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyB0b2tlbiA9IHN0cnRvay5uZXh0VG9rZW4oKTsKLQkJCQlpbnQgdG9rZW5sZW5ndGggPSB0b2tlbi5sZW5ndGgoKTsKLQkJCQlpZiAoRUxFTUVOVF9NT0RJRklFUlMuaW5kZXhPZih0b2tlbi5jaGFyQXQodG9rZW5sZW5ndGggLSAxKSkgIT0gLTEpIHsKLQkJCQkJdG9rZW4gPSB0b2tlbi5zdWJzdHJpbmcoMCwgdG9rZW5sZW5ndGggLSAxKTsKLQkJCQkJLy8gSWYgdGhlIHRva2VuIGlzIG5vdyBlbXB0eSAoaXQgd2FzIG9ubHkgPywqIG9yICspIHRoZW4KLQkJCQkJLy8gY29udGludWUuCi0JCQkJCWlmICh0b2tlbi5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZklnbm9yZUVsZW1SZWZzLmNvbnRhaW5zKHRva2VuKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJRWxlbWVudFJlZkxvY2F0aW9uIGVsZW1Mb2MgPSAoRWxlbWVudFJlZkxvY2F0aW9uKSBmRWxlbVJlZnMuZ2V0KHRva2VuKTsKLQkJCQlFbGVtZW50UmVmTG9jYXRpb24gdG9rZW5Mb2MgPSBuZXcgRWxlbWVudFJlZkxvY2F0aW9uKGxpbmUsIGNvbHVtbiwgdXJpLCBlbGVtTG9jKTsKLQkJCQlmRWxlbVJlZnMucHV0KHRva2VuLCB0b2tlbkxvYyk7Ci0JCQl9Ci0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI2VuZENEQVRBKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGVuZENEQVRBKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBObyBtZXRob2QgaW1wbC4KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI2VuZERURCgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBlbmREVEQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIE5vIG1ldGhvZCBpbXBsLgotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjZW5kRW50aXR5KGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBlbmRFbnRpdHkoU3RyaW5nIGFyZzApIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gTm8gbWV0aG9kIGltcGwuCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlciNleHRlcm5hbEVudGl0eURlY2woamF2YS5sYW5nLlN0cmluZywKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZXh0ZXJuYWxFbnRpdHlEZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBObyBtZXRob2QgaW1wbC4KLQkJfQotCi0JCS8qKgotCQkgKiBHZXQgdGhlIGxpc3Qgb2YgZWxlbWVudCBkZWNsYXJhdGlvbnMuCi0JCSAqIAotCQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGVsZW1lbnQgZGVjbGFyYXRpb25zLgotCQkgKi8KLQkJcHVibGljIExpc3QgZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpIHsKLQkJCXJldHVybiBmRWxlbURlY2xzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldCB0aGUgZWxlbWVudCByZWZlcmVuY2VzIGhhc2h0YWJsZS4KLQkJICogCi0JCSAqIEByZXR1cm4gVGhlIGVsZW1lbnQgcmVmZXJlbmNlcyBoYXNodGFibGUuCi0JCSAqLwotCQlwdWJsaWMgSGFzaHRhYmxlIGdldEVsZW1lbnRSZWZlcmVuY2VzKCkgewotCQkJcmV0dXJuIGZFbGVtUmVmczsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyI2ludGVybmFsRW50aXR5RGVjbChqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnRlcm5hbEVudGl0eURlY2woU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBObyBtZXRob2QgaW1wbC4KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc2V0RG9jdW1lbnRMb2NhdG9yKG9yZy54bWwuc2F4LkxvY2F0b3IpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBsb2NhdG9yKSB7Ci0JCQlzdXBlci5zZXREb2N1bWVudExvY2F0b3IobG9jYXRvcik7Ci0JCQl0aGlzLmZMb2NhdG9yID0gbG9jYXRvcjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI3N0YXJ0Q0RBVEEoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc3RhcnRDREFUQSgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gTm8gbWV0aG9kIGltcGwuCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNzdGFydERURChqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzdGFydERURChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gTm8gbWV0aG9kIGltcGwuCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNzdGFydEVudGl0eShqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc3RhcnRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gTm8gbWV0aG9kIGltcGwuCi0JCX0KLQl9Ci0KLQkKLQotCXByaXZhdGUgVVJJUmVzb2x2ZXIgZlJlc29sdmVyID0gbnVsbDsKLQotCXB1YmxpYyBEVERWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBVUkkgcmVzb2x2ZXIgdG8gdXNlIHdpdGggWFNEIHZhbGlkYXRpb24uCi0JICogCi0JICogQHBhcmFtIHVyaXJlc29sdmVyCi0JICogICAgICAgICAgICBUaGUgVVJJIHJlc29sdmVyIHRvIHVzZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVUklSZXNvbHZlcihVUklSZXNvbHZlciB1cmlyZXNvbHZlcikgewotCQl0aGlzLmZSZXNvbHZlciA9IHVyaXJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBEVEQgZmlsZSBsb2NhdGVkIGF0IHRoZSBVUkkuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgVGhlIFVSSSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZS4KLQkgKiBAcmV0dXJuIEEgdmFsaWRhdGlvbiByZXBvcnQgZm9yIHRoZSB2YWxpZGF0aW9uLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmkpIHsKLQkJVmFsaWRhdGlvbkluZm8gdmFsaW5mbyA9IG5ldyBWYWxpZGF0aW9uSW5mbyh1cmkpOwotCQl0cnkgewotCQkJU0FYUGFyc2VyIHBhcnNlciA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdTQVhQYXJzZXIoKTsKLQkJCVhNTFJlYWRlciByZWFkZXIgPSBwYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0JCQlNdWx0aUhhbmRsZXIgZHRkSGFuZGxlciA9IG5ldyBNdWx0aUhhbmRsZXIoKTsKLQkJCXJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvZGVjbGFyYXRpb24taGFuZGxlciIsIGR0ZEhhbmRsZXIpOyAvLyROT04tTkxTLTEkCi0JCQlyZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2xleGljYWwtaGFuZGxlciIsIGR0ZEhhbmRsZXIpOyAvLyROT04tTkxTLTEkCi0JCQlyZWFkZXIuc2V0Q29udGVudEhhbmRsZXIoZHRkSGFuZGxlcik7Ci0JCQlyZWFkZXIuc2V0RFRESGFuZGxlcihkdGRIYW5kbGVyKTsKLQkJCXJlYWRlci5zZXRFcnJvckhhbmRsZXIobmV3IERUREVycm9ySGFuZGxlcih2YWxpbmZvKSk7Ci0JCQlyZWFkZXIuc2V0RW50aXR5UmVzb2x2ZXIobmV3IERUREVudGl0eVJlc29sdmVyKGZSZXNvbHZlciwgdXJpKSk7Ci0JCQlTdHJpbmcgZG9jdW1lbnQgPSAiPCFET0NUWVBFIHJvb3QgU1lTVEVNIFwiIiArIHVyaSArICJcIj48cm9vdC8+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCXJlYWRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcihkb2N1bWVudCkpKTsKLQotCQkJTGlzdCBlbGVtRGVjbHMgPSBkdGRIYW5kbGVyLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKTsKLQkJCUhhc2h0YWJsZSBlbGVtUmVmcyA9IGR0ZEhhbmRsZXIuZ2V0RWxlbWVudFJlZmVyZW5jZXMoKTsKLQkJCXZhbGlkYXRlRWxlbWVudFJlZmVyZW5jZXMoZWxlbURlY2xzLCBlbGVtUmVmcywgdmFsaW5mbyk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCi0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQotCQl9Ci0JCWNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCi0JCX0KLQkJcmV0dXJuIHZhbGluZm87Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIGVsZW1lbnQgcmVmZXJlbmNlcyBpbiB0aGUgRFRELiBBbiBlbGVtZW50IHJlZmVyZW5jZSBpcwotCSAqIDwhRUxFTUVOVCBlbGVtIChlbGVtZW50UmVmZXJlbmNlKT4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbURlY2xzCi0JICogICAgICAgICAgICBBIGxpc3Qgb2YgdmFsaWQgZWxlbWVudCBkZWNsYXJhdGlvbnMuCi0JICogQHBhcmFtIGVsZW1SZWZzCi0JICogICAgICAgICAgICBBIGhhc2h0YWJsZSBjb250YWluaW5nIGVsZW1lbnQgcmVmZXJlbmNlcyBhcyBrZXlzIGFuZAotCSAqICAgICAgICAgICAgbG9jYXRpb25zIGluIHRoZSBkb2N1bWVudCBhcyB2YWx1ZXMuCi0JICogQHBhcmFtIHZhbGluZm8KLQkgKiAgICAgICAgICAgIFRoZSB2YWxpZGF0aW9uIGluZm8gb2JqZWN0IHRvIHN0b3JlIHZhbGlkYXRpb24gaW5mb3JtYXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRWxlbWVudFJlZmVyZW5jZXMoTGlzdCBlbGVtRGVjbHMsIEhhc2h0YWJsZSBlbGVtUmVmcywgVmFsaWRhdGlvbkluZm8gdmFsaW5mbykgewotCQlFbnVtZXJhdGlvbiBrZXlzID0gZWxlbVJlZnMua2V5cygpOwotCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJU3RyaW5nIGVsZW1SZWYgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0JCQkvLyBJZiB0aGUgZWxlbWVudCBoYXNuJ3QgYmVlbiBkZWNsYXJlZCBjcmVhdGUgYW4gZXJyb3IuCi0JCQlpZiAoIWVsZW1EZWNscy5jb250YWlucyhlbGVtUmVmKSkgewotCQkJCUVsZW1lbnRSZWZMb2NhdGlvbiBlbGVtTG9jID0gKEVsZW1lbnRSZWZMb2NhdGlvbikgZWxlbVJlZnMuZ2V0KGVsZW1SZWYpOwotCQkJCWRvIHsKLQkJCQkJdmFsaW5mby5hZGRFcnJvcihOTFMuYmluZChEVERWYWxpZGF0aW9uTWVzc2FnZXMuX0VSUk9SX1JFRl9FTEVNRU5UX1VOREVGSU5FRCwgIiciICsgZWxlbVJlZiArICInIiksIGVsZW1Mb2MuZ2V0TGluZSgpLCBlbGVtTG9jLmdldENvbHVtbigpLCBlbGVtTG9jLmdldFVSSSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWVsZW1Mb2MgPSBlbGVtTG9jLmdldE5leHQoKTsKLQkJCQl9Ci0JCQkJd2hpbGUgKGVsZW1Mb2MgIT0gbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9FbGVtZW50UmVmTG9jYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0VsZW1lbnRSZWZMb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWZmMDdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0VsZW1lbnRSZWZMb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLS8qKgotICogQW4gZWxlbWVudCByZWZlcmVuY2VzIGxvY2F0aW9uIGhvbGRzIHRoZSBsb2NhdGlvbiBvZiBhbiBlbGVtZW50IHJlZmVyZW5jZS4KLSAqIEFuIGVsZW1lbnQgcmVmZXJlbmNlIGlzIGRlY2xhcmVkIGluIGEgRFREIGVsZW1lbnQgZGVjbGFyYXRpb24gc3VjaCBhcwotICogPCFFTEVNRU5UIG15ZWxlbSAoZWxlbWVudHJlZik+IEFuIGVsZW1lbnQgcmVmZXJlbmNlIG1heSBiZSBwYXJ0IG9mIGEgbGlua2VkCi0gKiBsaXN0IGFuZCBjYW4gY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgbmV4dCBlbGVtZW50IHJlZmVyZW5jZSBpbiB0aGUgbGlzdC4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1jbGFzcyBFbGVtZW50UmVmTG9jYXRpb24gewotCXByaXZhdGUgaW50IGNvbHVtbiA9IC0xOwotCi0JcHJpdmF0ZSBpbnQgbGluZSA9IC0xOwotCi0JcHJpdmF0ZSBFbGVtZW50UmVmTG9jYXRpb24gbmV4dCA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyB1cmk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gbGluZQotCSAqICAgICAgICAgICAgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLgotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLgotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIFRoZSBVUkkgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgZWxlbWVudCByZWZlcmVuY2UuCi0JICogQHBhcmFtIG5leHQKLQkgKiAgICAgICAgICAgIFRoZSBuZXh0IGVsZW1lbnQgcmVmZXJlbmNlIGluIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBFbGVtZW50UmVmTG9jYXRpb24oaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmksIEVsZW1lbnRSZWZMb2NhdGlvbiBuZXh0KSB7Ci0JCXRoaXMubGluZSA9IGxpbmU7Ci0JCXRoaXMuY29sdW1uID0gY29sdW1uOwotCQl0aGlzLnVyaSA9IHVyaTsKLQkJdGhpcy5uZXh0ID0gbmV4dDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBlbGVtZW50IHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbHVtbigpIHsKLQkJcmV0dXJuIGNvbHVtbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGluZSgpIHsKLQkJcmV0dXJuIGxpbmU7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgcmVmZXJlbmNlIGluIHRoZSBsaW5rZWQgbGlzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuZXh0IGVsZW1lbnQgcmVmZXJlbmNlIGluIHRoZSBsaW5rZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudFJlZkxvY2F0aW9uIGdldE5leHQoKSB7Ci0JCXJldHVybiBuZXh0OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgVVJJIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIFVSSSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50IHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvRFREVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL0RURFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzQ0YTY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvRFREVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotCi0vKioKLSAqIEFuIERURCB2YWxpZGF0b3Igc3BlY2lmaWMgdG8gRWNsaXBzZS4gVGhpcyB2YWxpZGF0b3Igd2lsbCB3cmFwIHRoZSBpbnRlcm5hbAotICogRFREIHZhbGlkYXRvciB0byBwcm92aWRlIGF1dG9tYXRpYyBVUkkgcmVzb2x1dGlvbiBzdXBwb3J0LgotICogVXNpbmcgdGhpcyBjbGFzcyBpcyBlcXVpdmFsZW50IHRvIHVzaW5nIHRoZSBpbnRlcm5hbCBEVEQgdmFsaWRhdG9yIGFuZCByZWdpc3RlcmluZwotICogdGhlIFVSSSByZXNvbHZlciBmcm9tIHRoZSBVUkkgcmVzb2x1dGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERWYWxpZGF0b3IgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EVERWYWxpZGF0b3IgCi17Ci0gIHByaXZhdGUgc3RhdGljIERURFZhbGlkYXRvciBfaW5zdGFuY2UgPSBudWxsOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLiBSZWdpc3RlcnMgVVJJIHJlc29sdXRpb24gZnJhbWV3b3JrIHdpdGggdGhlIERURCB2YWxpZGF0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgRFREVmFsaWRhdG9yKCkKLSAgewotCXN1cGVyKCk7Ci0Jc2V0VVJJUmVzb2x2ZXIoVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2Ugc3BlY2lmaWMgRFREIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEByZXR1cm4KLSAgICogCQlUaGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHNwZWNpZmljIERURCB2YWxpZGF0b3IuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIERURFZhbGlkYXRvciBnZXRJbnN0YW5jZSgpIAotICB7Ci0JaWYgKF9pbnN0YW5jZSA9PSBudWxsKSAKLQl7Ci0JICBfaW5zdGFuY2UgPSBuZXcgRFREVmFsaWRhdG9yKCk7Ci0JfQotCXJldHVybiBfaW5zdGFuY2U7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMzk0MGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25SZXBvcnQ7Ci0KLS8qKgotICogRFREIHZhbGlkYXRvciB0aGF0IGlzIGNvbnRyaWJ1dGVkIHRvIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0TmVzdGVkVmFsaWRhdG9yIAotewotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yI3ZhbGlkYXRlKGphdmEubGFuZy5TdHJpbmcsIGphdmEuaW8uSW5wdXRTdHJlYW0sIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0c3RyZWFtLCBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIAotICB7Ci0JRFREVmFsaWRhdG9yIHZhbGlkYXRvciA9IERURFZhbGlkYXRvci5nZXRJbnN0YW5jZSgpOwotCi0JVmFsaWRhdGlvblJlcG9ydCB2YWxyZXBvcnQgPSBudWxsOwotCXZhbHJlcG9ydCA9IHZhbGlkYXRvci52YWxpZGF0ZSh1cmkpOwotCQotCXJldHVybiB2YWxyZXBvcnQ7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYzI0NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLy8gYmFzZSBjbGFzcyBmb3IgYW4gRWxlbWVudCdzIGNvbnRlbnRtb2RlbAotcHVibGljIGNsYXNzIEF0dHJpYnV0ZSBleHRlbmRzIERURE5vZGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEEgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0NIQVJBQ1RFUl9EQVRBX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVElFUyA9IERURENvcmVNZXNzYWdlcy5fVUlfRU5USVRZX05BTUVTX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFkgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0VOVElUWV9OQU1FX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlVNRVJBVEVEX05BTUUgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0VOVU1fTkFNRV9UT0tFTlNfREVTQzsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVU1FUkFURURfTk9UQVRJT04gPSBEVERDb3JlTWVzc2FnZXMuX1VJX0VOVU1fTk9UQVRJT05fREVTQzsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJWEVEID0gIiNGSVhFRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9IERURENvcmVNZXNzYWdlcy5fVUlfSURFTlRJRklFUl9ERVNDOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUYgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0lEX1JFRkVSRU5DRV9ERVNDOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUZTID0gRFREQ29yZU1lc3NhZ2VzLl9VSV9JRF9SRUZFUkVOQ0VTX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExJRUQgPSAiI0lNUExJRUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk1UT0tFTiA9IERURENvcmVNZXNzYWdlcy5fVUlfTkFNRV9UT0tFTl9ERVNDOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk1UT0tFTlMgPSBEVERDb3JlTWVzc2FnZXMuX1VJX05BTUVfVE9LRU5TX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRCA9ICIjUkVRVUlSRUQiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIEhhc2h0YWJsZSB0eXBlSGFzaCA9IG5ldyBIYXNodGFibGUoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gdHlwZXMgPSB7Q0RBVEEsIElELCBJRFJFRiwgSURSRUZTLCBFTlRJVFksIEVOVElUSUVTLCBOTVRPS0VOLCBOTVRPS0VOUywgRU5VTUVSQVRFRF9OQU1FLCBFTlVNRVJBVEVEX05PVEFUSU9OfTsKLQotCXsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLkNEQVRBX0tFWVdPUkQsIENEQVRBKTsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLklEX0tFWVdPUkQsIElEKTsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLklEUkVGX0tFWVdPUkQsIElEUkVGKTsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLklEUkVGU19LRVlXT1JELCBJRFJFRlMpOwotCQl0eXBlSGFzaC5wdXQoRFREUmVnaW9uVHlwZXMuRU5USVRZX0tFWVdPUkQsIEVOVElUWSk7Ci0JCXR5cGVIYXNoLnB1dChEVERSZWdpb25UeXBlcy5FTlRJVElFU19LRVlXT1JELCBFTlRJVElFUyk7Ci0JCXR5cGVIYXNoLnB1dChEVERSZWdpb25UeXBlcy5OTVRPS0VOX0tFWVdPUkQsIE5NVE9LRU4pOwotCQl0eXBlSGFzaC5wdXQoRFREUmVnaW9uVHlwZXMuTk1UT0tFTlNfS0VZV09SRCwgTk1UT0tFTlMpOwotCQl0eXBlSGFzaC5wdXQoRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fS0VZV09SRCwgRU5VTUVSQVRFRF9OT1RBVElPTik7Ci0JCS8vIHRoaXMgb25lJ3MgYSBzcGVjaWFsIGNhc2Ugc2luY2UgdGhlcmUgaXMgbm8ga2V5d29yZCBmb3IKLQkJLy8gZW51bWVyYXRlZCBuYW1lIHRva2VucwotCQl0eXBlSGFzaC5wdXQoIigpIiwgRU5VTUVSQVRFRF9OQU1FKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIG5vdyBwdXQgdGhlIHJldmVyc2UgaW4gcGxhY2UuIFRoaXMgZ2l2ZXMgdXMgYSAyIHdheSBsb29rdXAKLQkJLy8gZm9yIHdoZW4gd2Ugd2FudCB0byByZXRyaWV2ZSB0aGUgdmFsdWUgYW5kIHdoZW4gd2Ugd2FudCB0byBzZXQgaXQKLQkJdHlwZUhhc2gucHV0KENEQVRBLCAiQ0RBVEEiKTsgLy8kTk9OLU5MUy0xJAotCQl0eXBlSGFzaC5wdXQoSUQsICJJRCIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChJRFJFRiwgIklEUkVGIik7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZUhhc2gucHV0KElEUkVGUywgIklEUkVGUyIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChFTlRJVFksICJFTlRJVFkiKTsgLy8kTk9OLU5MUy0xJAotCQl0eXBlSGFzaC5wdXQoRU5USVRJRVMsICJFTlRJVElFUyIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChOTVRPS0VOLCAiTk1UT0tFTiIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChOTVRPS0VOUywgIk5NVE9LRU5TIik7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZUhhc2gucHV0KEVOVU1FUkFURURfTkFNRSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChFTlVNRVJBVEVEX05PVEFUSU9OLCAiTk9UQVRJT04iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgQXR0cmlidXRlRW51bUxpc3QgZW51bUxpc3QgPSBudWxsOwotCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTElFRCA9ICJJTVBMSUVEIjsKLQotCXB1YmxpYyBBdHRyaWJ1dGUoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRLaW5kKCkgewotCQlJVGV4dFJlZ2lvbiBkZWZhdWx0S2luZFJlZ2lvbiA9IGdldERlZmF1bHRLaW5kUmVnaW9uKCk7Ci0JCWlmIChkZWZhdWx0S2luZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChkZWZhdWx0S2luZFJlZ2lvbik7Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0RGVmYXVsdEtpbmRSZWdpb24oKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuSU1QTElFRF9LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuUkVRVUlSRURfS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkZJWEVEX0tFWVdPUkQpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlJVGV4dFJlZ2lvbiBkZWZhdWx0VmFsdWUgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyYXRvcigpKTsKLQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VmFsdWVGcm9tUXVvdGVkUmVnaW9uKGRlZmF1bHRWYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEF0dHJpYnV0ZUVudW1MaXN0IGdldEVudW1MaXN0KCkgewotCQlyZXR1cm4gZW51bUxpc3Q7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkFUVFJJQlVURUlDT04pOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5BVFRSSUJVVEVfTkFNRSk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5leHRRdW90ZWRMaXRlcmFsKFJlZ2lvbkl0ZXJhdG9yIGl0ZXIpIHsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCkgfHwgcmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldE9mZnNldEFmdGVyVHlwZSgpIHsKLQkJSVRleHRSZWdpb24gdHlwZVJlZ2lvbiA9IGdldFR5cGVSZWdpb24oKTsKLQotCQlTdHJpbmcgdHlwZSA9IGdldFR5cGUoKTsKLQkJYm9vbGVhbiBpc0VudW1lcmF0aW9uID0gdHlwZS5lcXVhbHMoRU5VTUVSQVRFRF9OQU1FKSB8fCB0eXBlLmVxdWFscyhFTlVNRVJBVEVEX05PVEFUSU9OKTsKLQkJaWYgKGlzRW51bWVyYXRpb24pIHsKLQkJCS8vIG5vdyBjaGVjayBpZiBtYXliZSB0aGlzIGlzIGFuIGVudW1lcmF0aW9uCi0JCQlpZiAoZ2V0RW51bUxpc3QoKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldEVudW1MaXN0KCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHR5cGVSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCh0eXBlUmVnaW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5hbWVSZWdpb24pOwotCQkJLy8gLy8gY3JlYXRlIG9uZQotCQkJLy8gdHlwZVJlZ2lvbiA9Ci0JCQkvLyBmaW5kT3JDcmVhdGVUeXBlUmVnaW9uKChTdHJpbmcpdHlwZUhhc2guZ2V0KENEQVRBKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldFR5cGVSZWdpb24oKTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IChTdHJpbmcpIHR5cGVIYXNoLmdldChyZWdpb24uZ2V0VHlwZSgpKTsKLQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkvLyBqdXN0IHJldHVybiB0aGUgdGV4dCBvZiB0aGUgdHlwZSByZWdpb24gc2luY2UgdGhpcyBtYXkgYmUKLQkJCQkvLyBhbiBlbnRpdHkgcmVwcmVzZW50aW5nIHRoZSB0eXBlOwotCQkJCXJldHVybiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQl9Ci0JCQlyZXR1cm4gdHlwZTsKLQkJfQotCQllbHNlIGlmIChnZXRFbnVtTGlzdCgpICE9IG51bGwpIHsKLQkJCS8vIGVudW1lcmF0ZWQgbmFtZSB0b2tlbnMgZG9uJ3QgaGF2ZSBhIHR5cGUga2V5d29yZC4ganVzdAotCQkJLy8gdGhlIGV4aXN0ZW5jZSBvZiB0aGUgbGVmdCBwYXJlbiBpcyBlbm91Z2gKLQkJCXJldHVybiAoU3RyaW5nKSB0eXBlSGFzaC5nZXQoIigpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRUeXBlUmVnaW9uKCkgewotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuQ0RBVEFfS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLklEX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5JRFJFRl9LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuSURSRUZTX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkVOVElUSUVTX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5OTVRPS0VOX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5OTVRPS0VOU19LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLlBBUk1fRU5USVRZX1RZUEUpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVGcm9tUXVvdGVkUmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlLmVxdWFscyhEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCkgfHwgdHlwZS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocmVnaW9uKTsKLQkJCXJldHVybiB0ZXh0LnN1YnN0cmluZygxLCB0ZXh0Lmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZVJlZ2lvbnMoKSB7Ci0JCXJlbW92ZUNoaWxkTm9kZXMoKTsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pKSB7Ci0JCQkJZW51bUxpc3QgPSBuZXcgQXR0cmlidXRlRW51bUxpc3QoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQl9Ci0JCQlpZiAoZW51bUxpc3QgIT0gbnVsbCkgewotCQkJCWVudW1MaXN0LmFkZFJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuUklHSFRfUEFSRU4pIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdEtpbmQoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIGtpbmQpIHsKLQotCQlJVGV4dFJlZ2lvbiBkZWZhdWx0S2luZFJlZ2lvbiA9IGdldERlZmF1bHRLaW5kUmVnaW9uKCk7Ci0JCVN0cmluZyBvbGREZWZhdWx0S2luZCA9IGRlZmF1bHRLaW5kUmVnaW9uID09IG51bGwgPyAiIiA6IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoZGVmYXVsdEtpbmRSZWdpb24pOyAvLyROT04tTkxTLTEkCi0JCWlmICgha2luZC5lcXVhbHMob2xkRGVmYXVsdEtpbmQpKSB7Ci0JCQlTdHJpbmcgbmV3VGV4dCA9IGtpbmQ7Ci0JCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJaW50IGxlbmd0aCA9IDA7Ci0JCQlpZiAoZGVmYXVsdEtpbmRSZWdpb24gIT0gbnVsbCkgewotCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoZGVmYXVsdEtpbmRSZWdpb24pOwotCQkJCWxlbmd0aCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChkZWZhdWx0S2luZFJlZ2lvbikgLSBzdGFydE9mZnNldDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0T2Zmc2V0QWZ0ZXJUeXBlKCk7Ci0JCQkJbmV3VGV4dCA9ICIgIiArIG5ld1RleHQ7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJSVRleHRSZWdpb24gZGVmYXVsdFZhbHVlID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcmF0b3IoKSk7Ci0KLQkJCWlmIChraW5kLmVxdWFscyhBdHRyaWJ1dGUuRklYRUQpIHx8IGtpbmQuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGRlZmF1bHRWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCS8vIHdlIGFyZSBjaGFuZ2luZyB0byBmaXhlZCBhbmQgd2VoYXZlIG5vIHF1b3RlZCByZWdpb24uCi0JCQkJCS8vIHB1dCBpbiBhbiBlbXB0eSB2YWx1ZQotCQkJCQluZXdUZXh0ICs9ICIgXCJcIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCQkJbGVuZ3RoID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGRlZmF1bHRWYWx1ZSkgLSBzdGFydE9mZnNldDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCBsZW5ndGgsIG5ld1RleHQpOwotCQkJLy8gZG8gc29tZXRoaW5nIGlmIHRoZXJlIGlzIG5vICJraW5kIiByZWdpb24KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRLaW5kKFN0cmluZyBraW5kKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQVRUUl9ERUZBVUxUX0tJTkQpOyAvLyROT04tTkxTLTEkCi0JCXNldERlZmF1bHRLaW5kKHRoaXMsIGtpbmQpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBmaXhlZCkgewotCQlJVGV4dFJlZ2lvbiBkZWZhdWx0VmFsdWUgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyYXRvcigpKTsKLQkJU3RyaW5nIHF1b3RlQ2hhciA9IHZhbHVlLmluZGV4T2YoIlwiIikgPT0gLTEgPyAiXCIiIDogIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQlpbnQgZW5kT2Zmc2V0ID0gMDsKLQkJU3RyaW5nIG5ld1RleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBvbGRWYWx1ZSA9IGdldERlZmF1bHRWYWx1ZSgpOwotCQlib29sZWFuIG9sZEtpbmRJc0ZpeGVkID0gZ2V0RGVmYXVsdEtpbmQoKS5lcXVhbHMoQXR0cmlidXRlLkZJWEVEKTsKLQkJaWYgKG9sZFZhbHVlLmVxdWFscyh2YWx1ZSkgJiYgZml4ZWQgPT0gb2xkS2luZElzRml4ZWQpIHsKLQkJCS8vIG5vdGhpbmcgdG8gZG8KLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChkZWZhdWx0VmFsdWUpOwotCQkJZW5kT2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGRlZmF1bHRWYWx1ZSk7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiBkZWZhdWx0S2luZFJlZ2lvbiA9IGdldERlZmF1bHRLaW5kUmVnaW9uKCk7Ci0JCWlmIChkZWZhdWx0S2luZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KGRlZmF1bHRLaW5kUmVnaW9uKTsKLQkJCWVuZE9mZnNldCA9IGVuZE9mZnNldCA9PSAwID8gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGRlZmF1bHRLaW5kUmVnaW9uKSA6IGVuZE9mZnNldDsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChzdGFydE9mZnNldCA9PSAwKSB7Ci0JCQkJZW5kT2Zmc2V0ID0gc3RhcnRPZmZzZXQgPSBnZXRPZmZzZXRBZnRlclR5cGUoKTsKLQkJCQluZXdUZXh0ICs9ICIgIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJSVRleHRSZWdpb24gdHlwZVJlZ2lvbiA9IGdldFR5cGVSZWdpb24oKTsKLQkJCWlmICh0eXBlUmVnaW9uID09IG51bGwgJiYgZ2V0RW51bUxpc3QoKSA9PSBudWxsKSB7Ci0JCQkJLy8gdGFjayBvbiBhIGRlZmF1bHQgdHlwZQotCQkJCS8vIG5ld1RleHQgKz0gIkNEQVRBICI7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpeGVkKSB7Ci0JCQluZXdUZXh0ICs9ICIjRklYRUQgIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGdldERlZmF1bHRLaW5kKCkuZXF1YWxzKCIiKSAmJiB2YWx1ZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCS8vIGlmIG5vdCBmaXhlZCBhbmQgdmFsdWUgaXMgIiIgdGhlbiByZXNldCB0aGUgZGVmYXVsdCBraW5kIHRvCi0JCQkJLy8gaW1wbGllZAotCQkJCW5ld1RleHQgKz0gIiNJTVBMSUVEIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJaWYgKCFnZXRUeXBlKCkuZXF1YWxzKCIiKSAmJiAhdmFsdWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCW5ld1RleHQgKz0gcXVvdGVDaGFyICsgdmFsdWUgKyBxdW90ZUNoYXI7Ci0JCX0KLQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsIG5ld1RleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZShTdHJpbmcgdmFsdWUsIGJvb2xlYW4gZml4ZWQpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9BVFRSX0RFRkFVTFRfVkFMKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZWZhdWx0VmFsdWUodGhpcywgdmFsdWUsIGZpeGVkKTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIHR5cGUpIHsKLQkJU3RyaW5nIG9sZFR5cGUgPSBnZXRUeXBlKCk7Ci0JCWlmICghdHlwZS5lcXVhbHMob2xkVHlwZSkpIHsKLQkJCWJvb2xlYW4gd2FzRW51bWVyYXRpb24gPSBvbGRUeXBlLmVxdWFscyhFTlVNRVJBVEVEX05BTUUpIHx8IG9sZFR5cGUuZXF1YWxzKEVOVU1FUkFURURfTk9UQVRJT04pOwotCQkJYm9vbGVhbiBpc0VudW1lcmF0aW9uID0gdHlwZS5lcXVhbHMoRU5VTUVSQVRFRF9OQU1FKSB8fCB0eXBlLmVxdWFscyhFTlVNRVJBVEVEX05PVEFUSU9OKTsKLQkJCVN0cmluZyBuZXdUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCQlpbnQgZW5kT2Zmc2V0ID0gMDsKLQotCQkJaWYgKHdhc0VudW1lcmF0aW9uICYmICFpc0VudW1lcmF0aW9uKSB7Ci0JCQkJLy8gZ2V0IHJpZCBvZiB0aGUgb2xkIGVudW1saXN0Ci0JCQkJQXR0cmlidXRlRW51bUxpc3QgZW51bUxpc3QgPSBnZXRFbnVtTGlzdCgpOwotCQkJCWlmIChlbnVtTGlzdCAhPSBudWxsKSB7Ci0JCQkJCXN0YXJ0T2Zmc2V0ID0gZW51bUxpc3QuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJZW5kT2Zmc2V0ID0gZW51bUxpc3QuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJfQotCQkJfQotCi0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRUeXBlUmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJaWYgKGVuZE9mZnNldCA9PSAwKSB7Ci0JCQkJCWVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHN0YXJ0T2Zmc2V0ID09IDApIHsKLQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gZ2V0TmFtZVJlZ2lvbigpOwotCQkJCW5ld1RleHQgKz0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQkJZW5kT2Zmc2V0ID0gc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmFtZVJlZ2lvbik7Ci0JCQl9Ci0KLQkJCVN0cmluZyBuZXdUeXBlV29yZCA9IChTdHJpbmcpIHR5cGVIYXNoLmdldCh0eXBlKTsKLQkJCWlmIChuZXdUeXBlV29yZCA9PSBudWxsKSB7Ci0JCQkJLy8gdGhlbiB0aGlzIG11c3QgYmUgYSBwYXJtIGVudGl0eSBiZWluZyB1c2VkIGluIHRoZSB0eXBlCi0JCQkJLy8gdXNlIHRoZSB0eXBlIHRleHQgZGlyZWN0bHkKLQkJCQluZXdUeXBlV29yZCA9IHR5cGU7Ci0JCQl9Ci0KLQkJCW5ld1RleHQgKz0gbmV3VHlwZVdvcmQ7Ci0KLQkJCWlmIChpc0VudW1lcmF0aW9uICYmICF3YXNFbnVtZXJhdGlvbikgewotCQkJCS8vIHB1dCBpbiBhIG5ldyBudW1saXN0Ci0JCQkJYm9vbGVhbiBpc1NwYWNlTmVlZGVkID0gIXR5cGUuZXF1YWxzKEVOVU1FUkFURURfTkFNRSk7Ci0JCQkJbmV3VGV4dCArPSBpc1NwYWNlTmVlZGVkID8gIiAiIDogIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCW5ld1RleHQgKz0gIigpIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsIG5ld1RleHQpOwotCQkJaWYgKG5ld1R5cGVXb3JkLmVxdWFscygiIikgJiYgIXR5cGUuZXF1YWxzKEVOVU1FUkFURURfTkFNRSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIHRoZSBzZXQgdGhlIGRlZmF1bHRraW5kIHRvICIiCi0JCQkJLy8gc2V0RGVmYXVsdEtpbmQocmVxdWVzdG9yLCAiIik7Ci0JCQkJc2V0RGVmYXVsdFZhbHVlKHJlcXVlc3RvciwgIiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQVRUUl9UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUeXBlKHRoaXMsIHR5cGUpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGVFbnVtTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGVFbnVtTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDIwNTdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQXR0cmlidXRlRW51bUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlRW51bUxpc3QgZXh0ZW5kcyBEVEROb2RlIHsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgQXR0cmlidXRlRW51bUxpc3QoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCS8vIG5ldmVyIGV4cG9zZWQgaW4gdHJlZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyByZXR1cm4gdGhlIGl0ZW1zIHRoYXQgYXJlIGluIHRoaXMgZW51bWVyYXRlZCBsaXN0Ci0JcHVibGljIExpc3QgZ2V0SXRlbXMoKSB7Ci0JCWxpc3QuY2xlYXIoKTsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gbmFtZSA9IGdldE5leHRSZWdpb24oaXRlciwgRFREUmVnaW9uVHlwZXMuTkFNRSk7Ci0JCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJbGlzdC5hZGQoZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChuYW1lKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXRlbXMoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nW10gaXRlbXMpIHsKLQkJaWYgKGl0ZW1zICE9IG51bGwpIHsKLQkJCVN0cmluZyB0ZXh0ID0gIigiOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgPiAwKSB7Ci0JCQkJCXRleHQgKz0gIiB8ICIgKyBpdGVtc1tpXTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGV4dCArPSBpdGVtc1tpXTsKLQkJCQl9Ci0JCQl9Ci0JCQl0ZXh0ICs9ICIpIjsgLy8kTk9OLU5MUy0xJAotCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdGFydE9mZnNldCgpLCBnZXROb2RlTGVuZ3RoKCksIHRleHQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXRlbXMoU3RyaW5nW10gaXRlbXMpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9BVFRSX0VOVU1fSVRFTVMpOyAvLyROT04tTkxTLTEkCi0JCXNldEl0ZW1zKHRoaXMsIGl0ZW1zKTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQXR0cmlidXRlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMjI0NTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGVMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVMaXN0IGV4dGVuZHMgTmFtZWRUb3BMZXZlbE5vZGUgewotCXB1YmxpYyBBdHRyaWJ1dGVMaXN0KERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSwgRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0FUVFJfTElTVF9BREQpOyAvLyROT04tTkxTLTEkCi0KLQkJRFRETm9kZSBsYXN0QXR0cmlidXRlID0gKERURE5vZGUpIGdldExhc3RDaGlsZCgpOwotCQlpZiAobGFzdEF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQlyZXBsYWNlVGV4dCh0aGlzLCBsYXN0QXR0cmlidXRlLmdldEVuZE9mZnNldCgpLCAwLCAiXG5cdCIgKyBuYW1lICsgIiBDREFUQSAjSU1QTElFRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQllbHNlIHsKLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5hbWVSZWdpb24pLCAwLCAiXG5cdCIgKyBuYW1lICsgIiBDREFUQSAjSU1QTElFRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQl9Ci0KLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5BVFRSSUJVVEVMSVNUSUNPTik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zZXJ0SW50b01vZGVsKE9iamVjdCByZXF1ZXN0b3IsIEF0dHJpYnV0ZSByZWZlcmVuY2UsIEF0dHJpYnV0ZSBub2RlLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCVN0cmluZyBuZXdUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5vZGVUZXh0ID0gbm9kZS5nZXRGdWxsTm9kZVRleHQoKTsKLQkJaWYgKCFpc0FmdGVyKSB7Ci0JCQlvZmZzZXQgPSByZWZlcmVuY2UuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHRyeSBhbmQgZ2V0IG5leHQgY2hpbGQKLQkJCUF0dHJpYnV0ZSBhdHRyID0gKEF0dHJpYnV0ZSkgcmVmZXJlbmNlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJb2Zmc2V0ID0gYXR0ci5nZXRTdGFydE9mZnNldCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8ganVzdCB1c2UgdGhlIGVuZCBvZmZzZXQKLQkJCQlvZmZzZXQgPSByZWZlcmVuY2UuZ2V0V2hpdGVzcGFjZUVuZE9mZnNldCgpOwotCQkJfQotCQl9Ci0JCW5ld1RleHQgKz0gbm9kZVRleHQ7Ly8gKyAoaXNMYXN0Q2hpbGQgPyAiXG4iIDogIlxuXHQiKTsKLQkJaWYgKCFub2RlLmhhc1RyYWlsaW5nV2hpdGVzcGFjZSgpKSB7Ci0JCQluZXdUZXh0ICs9ICJcblx0IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgb2Zmc2V0LCAwLCBuZXdUZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNvbHZlUmVnaW9ucygpIHsKLQkJcmVtb3ZlQ2hpbGROb2RlcygpOwotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQotCQlpZiAoZ2V0TmFtZVJlZ2lvbigpICE9IG51bGwpIHsKLQkJCS8vIHdlIHNraXAgcGFzdCB0aGUgbmFtZSB0b2tlbiBpcyBvdXIgbmFtZQotCQkJc2tpcFBhc3ROYW1lKGl0ZXIpOwotCQl9Ci0KLQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlBdHRyaWJ1dGUgYXR0cmlidXRlID0gbnVsbDsKLQkJYm9vbGVhbiB0cmFpbGluZ1doaXRlc3BhY2UgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkFUVFJJQlVURV9OQU1FKSkgewotCQkJCWF0dHJpYnV0ZSA9IG5ldyBBdHRyaWJ1dGUoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJY2hpbGRyZW4uYWRkKGF0dHJpYnV0ZSk7Ci0JCQkJYXBwZW5kQ2hpbGQoYXR0cmlidXRlKTsKLQkJCQl0cmFpbGluZ1doaXRlc3BhY2UgPSBmYWxzZTsKLQkJCX0KLQkJCWlmIChhdHRyaWJ1dGUgIT0gbnVsbCAmJiBjdXJyZW50UmVnaW9uLmdldFR5cGUoKSAhPSBEVERSZWdpb25UeXBlcy5FTkRfVEFHKSB7Ci0JCQkJaWYgKCF0cmFpbGluZ1doaXRlc3BhY2UpIHsKLQkJCQkJYXR0cmlidXRlLmFkZFJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKSB7Ci0JCQkJCQlhdHRyaWJ1dGUuYWRkV2hpdGVzcGFjZVJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHRoZSBmb2xsb3dpbmcgcHJldmVudHMgZXh0cmEgd2hpdGVzcGFjZSBmcm9tIGJlaW5nIHBpY2tlZAotCQkJCS8vIHVwIGJ5IHRoZSBhdHRyaWJ1dGUKLQkJCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuUkVRVUlSRURfS0VZV09SRCB8fCBjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5JTVBMSUVEX0tFWVdPUkQgfHwgY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwgfHwgY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpIHsKLQkJCQkJdHJhaWxpbmdXaGl0ZXNwYWNlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaW50IG51bUtpZHMgPSBjaGlsZHJlbi5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtS2lkczsgaSsrKSB7Ci0JCQkoKEF0dHJpYnV0ZSkgY2hpbGRyZW4uZ2V0KGkpKS5yZXNvbHZlUmVnaW9ucygpOwotCQl9IC8vIGVuZCBvZiBmb3IgKCkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNQmFzaWNOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNQmFzaWNOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OWFhM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9DTUJhc2ljTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qCi0gKiBDTUJhc2ljTm9kZSBjb21iaW5lcyBhbGwgdGhlIGRpZmZlcmVudCBjb250ZW50IHR5cGVzIGludG8gb25lLiBUaGUgaWRlYQotICogYmVoaW5kIHRoaXMgaXMgdG8gYWxsb3cgYXJiaXRyYXJ5IG5hbWUgY2hhbmdlcyB0byBub3QgcmVxdWlyZSBhIHRyZWUKLSAqIHVwZGF0ZS4KLSAqLwotcHVibGljIGNsYXNzIENNQmFzaWNOb2RlIGV4dGVuZHMgQ01SZXBlYXRhYmxlTm9kZSB7Ci0KLQkvLyBzdGF0aWMgZmluYWwgaW50IEVNUFRZID0gMDsKLQkvLyBzdGF0aWMgZmluYWwgaW50IEFOWSA9IDE7Ci0JLy8gc3RhdGljIGZpbmFsIGludCBQQ0RBVEEgPSAyOwotCi0JcHVibGljIENNQmFzaWNOb2RlKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlmaW5hbCBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJSVRleHRSZWdpb24gcGNkYXRhID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSk7Ci0JCWlmIChwY2RhdGEgIT0gbnVsbCkgewotCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5QQ0RBVEFJQ09OKTsKLQkJfQotCi0JCWlmIChpc1Jvb3RFbGVtZW50Q29udGVudCgpKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoRU1QVFkpKSB7Ci0JCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5FTVBUWUlDT04pOwotCQkJfQotCQkJZWxzZSBpZiAobmFtZS5lcXVhbHMoQU5ZKSkgewotCQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuQU5ZSUNPTik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBPdGhlcndpc2UgdGhpcyBpcyBqdXN0IGFuIGVsZW1lbnQgcmVmZXJlbmNlIG5vZGUuIEp1c3QgcmV0dXJuCi0JCS8vIHdoYXQgQ01SZXBlYXRhYmxlTm9kZSB3b3VsZCBnaXZlIHVzCi0JCXJldHVybiBzdXBlci5nZXRJbWFnZSgpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKCkgewotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLk5BTUUgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gcmV0dXJucyB0aGUgb2NjdXJyZW5jZXRva2VuLCBvciB0aGUgdG9rZW4gd2hlcmUgdGhlIG9jY3VycmVuY2UgdG9rZW4KLQkvLyBzaG91bGQgYXBwZWFyIGFmdGVyCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE9jY3VycmVuY2VSZWdpb24oKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQlza2lwUGFzdE5hbWUoaXRlcik7Ci0JCWlmIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0TmFtZVJlZ2lvbigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJSVRleHRSZWdpb24gcGNkYXRhID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSk7Ci0JCWlmIChwY2RhdGEgIT0gbnVsbCkgewotCQkJcmV0dXJuIFBDREFUQTsKLQkJfQotCi0JCWlmIChpc1Jvb3RFbGVtZW50Q29udGVudCgpKSB7Ci0JCQlmaW5hbCBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJCWlmIChpc1Jvb3RFbGVtZW50Q29udGVudCgpKSB7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKEVNUFRZKSkgewotCQkJCQlyZXR1cm4gRU1QVFk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5hbWUuZXF1YWxzKEFOWSkpIHsKLQkJCQkJcmV0dXJuIEFOWTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG90aGVyd2lzZSBqdXN0IHJldHVybiBpdCdzIG5hbWUgYXMgdGhlIHR5cGUKLQkJCQkJcmV0dXJuIG5hbWU7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eUFueU9yUENEYXRhKCkgewotCQlpZiAoaXNQQ0RhdGEoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCi0JCWZpbmFsIFN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQlpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkgewotCQkJaWYgKG5hbWUuZXF1YWxzKEVNUFRZKSB8fCBuYW1lLmVxdWFscyhBTlkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUENEYXRhKCkgewotCQlJVGV4dFJlZ2lvbiBwY2RhdGEgPSBnZXROZXh0UmVnaW9uKGl0ZXJhdG9yKCksIERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBKTsKLQkJaWYgKHBjZGF0YSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gcHVibGljIE5vZGUgaW5zZXJ0UmVnaW9uKFJlZ2lvbiB0b2tlbikKLQkvLyB7Ci0JLy8gaWYgKCF0b2tlblN0cmVhbS5jb250YWluc1Rva2VuKHRva2VuKSAmJiB0b2tlbi5nZXRUeXBlKCkgPT0KLQkvLyBUb2tlbi5PQ0NVUl9UWVBFKQotCS8vIHsKLQkvLyAvLyB0aGVuIGFkZCBpdCBzbyB0aGF0IG91ciByYW5nZSBjb250YWlucyBpdAotCS8vIGluc2VydEludG9Ub2tlblN0cmVhbSh0b2tlbik7Ci0JLy8gfQotCS8vIHJldHVybiB0aGlzOwotCS8vIH0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gIWlzRW1wdHlBbnlPclBDRGF0YSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIG5hbWUpIHsKLQkJLy8gYmVnaW5SZWNvcmRpbmcocmVxdWVzdG9yLCAiTmFtZSBDaGFuZ2UiKTsKLQotCQlzdXBlci5zZXROYW1lKHJlcXVlc3RvciwgbmFtZSk7Ci0JCWlmICghaXNSZWZlcmVuY2UoKSkgewotCQkJLy8gaWYgaXQgaXMgbm8gbG9uZ2VyIGEgcmVmZXJlbmNlIG5vZGUsIHJlbW92ZSB0aGUgb2NjdXJyZW5jZQotCQkJLy8gdG9rZW4KLQkJCXNldE9jY3VycmVuY2UocmVxdWVzdG9yLCBDTVJlcGVhdGFibGVOb2RlLk9OQ0UpOwotCQl9Ci0KLQkJLy8gZW5kUmVjb3JkaW5nKHJlcXVlc3Rvcik7Ci0JfQotCi0JLyoKLQkgKiBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lKGludCB0eXBlKSB7IHN3aXRjaCAodHlwZSkgeyBjYXNlIEVNUFRZOgotCSAqIHJldHVybiBlbXB0eVN0cmluZzsgY2FzZSBBTlk6IHJldHVybiBhbnlTdHJpbmc7IGNhc2UgUENEQVRBOiByZXR1cm4KLQkgKiBwY2RhdGFTdHJpbmc7IGRlZmF1bHQ6IGJyZWFrOyB9IC8vIGVuZCBvZiBzd2l0Y2ggKCkgcmV0dXJuICIiOyB9Ci0JICovCi0KLX0vLyBDTUJhc2ljTm9kZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9DTUdyb3VwTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9DTUdyb3VwTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmQ1Mzg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ01Hcm91cE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5EVERVbmlxdWVOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIENNR3JvdXBOb2RlIGV4dGVuZHMgQ01SZXBlYXRhYmxlTm9kZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0hPSUNFID0gJ3wnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBTRVFVRU5DRSA9ICcsJzsKLQotCXByb3RlY3RlZCBjaGFyIGNvbm5lY3RvciA9IFNFUVVFTkNFOwotCi0JLy8gcHJvdGVjdGVkIEFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBDTUdyb3VwTm9kZShEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENoaWxkKCkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0FERF9DSElMRCk7IC8vJE5PTi1OTFMtMSQKLQkJRFRETm9kZSBsYXN0Tm9kZSA9IChEVEROb2RlKSBnZXRMYXN0Q2hpbGQoKTsKLQkJU3RyaW5nIGVsZW1lbnROYW1lID0gRFREVW5pcXVlTmFtZUhlbHBlci5nZXRVbmlxdWVOYW1lKGdldENoaWxkcmVuTGlzdCgpLCAiQ2hpbGROb2RlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCXJlcGxhY2VUZXh0KHRoaXMsIGxhc3ROb2RlLmdldEVuZE9mZnNldCgpLCAwLCBTdHJpbmcudmFsdWVPZihnZXRDb25uZWN0b3IoKSkgKyBlbGVtZW50TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCXJlcGxhY2VUZXh0KHRoaXMsIGdldFN0YXJ0T2Zmc2V0KCkgKyAxLCAwLCBlbGVtZW50TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRHcm91cCgpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9DTV9HUlBfTk9ERV9BRERfR1JQKTsgLy8kTk9OLU5MUy0xJAotCQlEVEROb2RlIGxhc3ROb2RlID0gKERURE5vZGUpIGdldExhc3RDaGlsZCgpOwotCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJcmVwbGFjZVRleHQodGhpcywgbGFzdE5vZGUuZ2V0RW5kT2Zmc2V0KCksIDAsIFN0cmluZy52YWx1ZU9mKGdldENvbm5lY3RvcigpKSArICIgKCkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RhcnRPZmZzZXQoKSArIDEsIDAsICIoKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlKE9iamVjdCByZXF1ZXN0b3IsIERURE5vZGUgY2hpbGQpIHsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCi0JCWlmIChjaGlsZHJlbi5sZW5ndGggPT0gMSAmJiBnZXRGaXJzdENoaWxkKCkgPT0gY2hpbGQpIHsKLQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgY2hpbGQuZ2V0U3RhcnRPZmZzZXQoKSwgY2hpbGQuZ2V0Tm9kZUxlbmd0aCgpLCBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCQlEVEROb2RlIGNoaWxkQSA9IChEVEROb2RlKSBjaGlsZHJlbltpXTsKLQkJCURURE5vZGUgY2hpbGRCID0gKERURE5vZGUpIGNoaWxkcmVuW2kgKyAxXTsKLQotCQkJYm9vbGVhbiBjaGlsZEFEZWxldGVkID0gY2hpbGRBID09IGNoaWxkOwotCQkJYm9vbGVhbiBjaGlsZEJEZWxldGVkID0gY2hpbGRCID09IGNoaWxkOwotCQkJaWYgKGNoaWxkQURlbGV0ZWQgfHwgY2hpbGRCRGVsZXRlZCkgewotCQkJCS8vIHdlIGZvdW5kIHRoZSBjaGlsZAotCQkJCWludCBzdGFydE9mZnNldCA9IGNoaWxkQURlbGV0ZWQgPyBjaGlsZEEuZ2V0U3RhcnRPZmZzZXQoKSA6IGNoaWxkQS5nZXRFbmRPZmZzZXQoKTsKLQkJCQlpbnQgZW5kT2Zmc2V0ID0gY2hpbGRBRGVsZXRlZCA/IGNoaWxkQi5nZXRTdGFydE9mZnNldCgpIDogY2hpbGRCLmdldEVuZE9mZnNldCgpOwotCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGNvbm5lY3Rvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGNvbm5lY3Rvci4KLQkgKi8KLQlwdWJsaWMgY2hhciBnZXRDb25uZWN0b3IoKSB7Ci0JCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGggLSAxOyBpKyspIHsKLQkJCURURE5vZGUgY2hpbGRBID0gKERURE5vZGUpIGNoaWxkcmVuW2ldOwotCQkJRFRETm9kZSBjaGlsZEIgPSAoRFRETm9kZSkgY2hpbGRyZW5baSArIDFdOwotCi0JCQkvLyBjcmVhdGUgYSBzdHJlYW0gYmV0d2VlbiB0aGUgdHdvIHNpYmxpbmdzIGFuZCB3YWxrIGl0Ci0JCQkvLyBub3RlIHRoYXQgdGhpcyBzdHJlYW0gaW5jbHVkZXMgdGhlIGxhc3QgcmVnaW9uIG9mIHRoZSBmaXJzdAotCQkJLy8gc2libGluZyBhbmQgdGhlIGZpcnN0IHJlZ2lvbiBvZiB0aGUgbmV4dCBzaWJsaW5nLgotCQkJLy8gYm90aCB0aGVzZSBzaG91bGQgYmUgaWdub3JlZAotCQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IG5ldyBSZWdpb25JdGVyYXRvcihnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSwgY2hpbGRBLmdldEVuZE9mZnNldCgpLCBjaGlsZEIuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkvLyBzdHJlYW0uc2V0Rmlyc3RSZWdpb24oY2hpbGRBLmdldExhc3RSZWdpb24oKSk7Ci0JCQkvLyBzdHJlYW0uc2V0TGFzdFJlZ2lvbihjaGlsZEIuZ2V0Rmlyc3RSZWdpb24oKSk7Ci0JCQkvLyBJdGVyYXRvciBpdGVyID0gc3RyZWFtLml0ZXJhdG9yKCk7Ci0JCQkvLyBza2lwIHRoZSBmaXJzdCByZWdpb24gd2hpY2ggaXMgdGhlIGxhc3QgcmVnaW9uIG9mIGNoaWxkQQotCQkJLy8gZG8gd2UgbmVlZCB0aGlzIG5vdyA/Ci0JCQkvLyBpdGVyLm5leHQoKTsKLQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBudWxsOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpICYmIGN1cnJlbnRSZWdpb24gIT0gY2hpbGRCLmdldFN0YXJ0UmVnaW9uKCkpIHsKLQkJCQljdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUikgewotCQkJCQljb25uZWN0b3IgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KGN1cnJlbnRSZWdpb24pLmNoYXJBdCgwKTsKLQkJCQkJcmV0dXJuIGNvbm5lY3RvcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbm5lY3RvcjsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCURURENvcmVQbHVnaW4gcmVzb3VyY2VQbHVnaW4gPSBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JCXN3aXRjaCAoZ2V0Q29ubmVjdG9yKCkpIHsKLQkJCWNhc2UgU0VRVUVOQ0UgOgotCQkJCXJldHVybiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5PTkVTRVFVRU5DRUlDT04pOwotCQkJLyoKLQkJCSAqIHN3aXRjaCAoZ2V0T2NjdXJyZW5jZSgpKSB7IGNhc2UgT05DRSA6IHJldHVybgotCQkJICogcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuT05FU0VRVUVOQ0VJQ09OKTsgY2FzZQotCQkJICogT1BUSU9OQUwgOiByZXR1cm4KLQkJCSAqIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLk9QVElPTkFMU0VRVUVOQ0VJQ09OKTsgY2FzZQotCQkJICogT05FX09SX01PUkUgOiByZXR1cm4KLQkJCSAqIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLk9ORU9STU9SRVNFUVVFTkNFSUNPTik7Ci0JCQkgKiBjYXNlIFpFUk9fT1JfTU9SRSA6IHJldHVybgotCQkJICogcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuWkVST09STU9SRVNFUVVFTkNFSUNPTik7IH0KLQkJCSAqLwotCQkJY2FzZSBDSE9JQ0UgOgotCQkJCXJldHVybiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5PTkVDSE9JQ0VJQ09OKTsKLQkJLyoKLQkJICogc3dpdGNoIChnZXRPY2N1cnJlbmNlKCkpIHsgY2FzZSBPTkNFIDogcmV0dXJuCi0JCSAqIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLk9ORUNIT0lDRUlDT04pOyBjYXNlIE9QVElPTkFMIDoKLQkJICogcmV0dXJuIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLk9QVElPTkFMQ0hPSUNFSUNPTik7Ci0JCSAqIGNhc2UgT05FX09SX01PUkUgOiByZXR1cm4KLQkJICogcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuT05FT1JNT1JFQ0hPSUNFSUNPTik7IGNhc2UKLQkJICogWkVST19PUl9NT1JFIDogcmV0dXJuCi0JCSAqIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLlpFUk9PUk1PUkVDSE9JQ0VJQ09OKTsgfQotCQkgKi8KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIHJldHVybnMgdGhlIG9jY3VycmVuY2VyZWdpb24sIG9yIHRoZSBsYXN0IHJlZ2lvbiB3aGVyZSB0aGUgb2NjdXJyZW5jZQotCS8vIHJlZ2lvbiBzaG91bGQgYXBwZWFyIGFmdGVyCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE9jY3VycmVuY2VSZWdpb24oKSB7Ci0JCWludCBuZXN0aW5nID0gMDsKLQotCQkvLyB3ZSBza2lwIHBhc3QgdGhlIGZpcnN0IGxlZnQgcGFyZW4gd2Ugc2VlIHNpbmNlIHRoYXQgaXMgdGhlCi0JCS8vIGJlZ2lubmluZyBvZiBvdXIgb3duIG5vZGUKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCS8vIHdlIGFzc3VtZSB0aGUgZmlyc3QgcmVnaW9uIGlzIHRoZSAnKCcKLQkJaXRlci5uZXh0KCk7Ci0JCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBudWxsOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgbmVzdGluZyA+PSAwKSB7Ci0JCQljdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuTEVGVF9QQVJFTikgewotCQkJCW5lc3RpbmcrKzsKLQkJCX0KLQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5SSUdIVF9QQVJFTikgewotCQkJCW5lc3RpbmctLTsKLQkJCX0KLQkJfQotCQlpZiAobmVzdGluZyA8IDApIHsKLQkJCS8vIFRoaXMgbWVhbnMgd2UgaGF2ZSBwYXNzZWQgb3ZlciB0aGUgcmlnaHQgcGFyZW4gdGhhdCBtYXJrcyB0aGUKLQkJCS8vIGVuZCBvZiBvdXIgZ3JvdXBpbmcuCi0JCQkvLyBMb29rIGZvciBhbiBvY2N1cnJlbmNlIHJlZ2lvbgotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJY3VycmVudFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSB7Ci0JCQkJCXJldHVybiBjdXJyZW50UmVnaW9uOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBpZiB3ZSdyZSBoZXJlLCB0aGlzIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gb2NjdXIgcmVnaW9uLiByZXR1cm4gdGhlCi0JCS8vIGxhc3QgcmVnaW9uCi0JCXJldHVybiBpdGVyLnByZXZpb3VzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkgewotCQkJaWYgKGdldEZpcnN0Q2hpbGQoKSAhPSBudWxsKSB7Ci0JCQkJQ01Ob2RlIG5vZGUgPSAoQ01Ob2RlKSBnZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKG5vZGUuZ2V0VHlwZSgpLmVxdWFscyhQQ0RBVEEpKSB7Ci0JCQkJCXJldHVybiBNSVhFRDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBDSElMRFJFTjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgaW5zZXJ0Q2hpbGROb2RlKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyBub2RlVGV4dCwgaW50IHBvc2l0aW9uKSB7Ci0JCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQotCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQlTdHJpbmcgbmV3VGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChwb3NpdGlvbiA8IGNoaWxkcmVuLmxlbmd0aCkgewotCQkJRFRETm9kZSByZWZlcmVuY2UgPSAoRFRETm9kZSkgY2hpbGRyZW5bcG9zaXRpb25dOwotCQkJc3RhcnRPZmZzZXQgPSByZWZlcmVuY2UuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCW5ld1RleHQgPSBub2RlVGV4dCArICIgIiArIFN0cmluZy52YWx1ZU9mKGdldENvbm5lY3RvcigpKSArICIgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSBpZiAocG9zaXRpb24gPT0gY2hpbGRyZW4ubGVuZ3RoKSB7Ci0JCQkvLyBhZGQgdG8gZW5kCi0JCQlEVEROb2RlIHJlZmVyZW5jZSA9IChEVEROb2RlKSBjaGlsZHJlbltwb3NpdGlvbiAtIDFdOwotCQkJc3RhcnRPZmZzZXQgPSByZWZlcmVuY2UuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQluZXdUZXh0ID0gIiAiICsgU3RyaW5nLnZhbHVlT2YoZ2V0Q29ubmVjdG9yKCkpICsgIiAiICsgbm9kZVRleHQ7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIDAsIG5ld1RleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydENoaWxkTm9kZShTdHJpbmcgbm9kZVRleHQsIGludCBwb3NpdGlvbikgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0lOU0VSVF9FTEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlpbnNlcnRDaGlsZE5vZGUodGhpcywgbm9kZVRleHQsIHBvc2l0aW9uKTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydEludG9Nb2RlbChPYmplY3QgcmVxdWVzdG9yLCBDTU5vZGUgcmVmZXJlbmNlLCBDTU5vZGUgbm9kZSwgYm9vbGVhbiBpc0FmdGVyKSB7Ci0JCVN0cmluZyBub2RlVGV4dCA9IG5vZGUuZ2V0Tm9kZVRleHQoKTsKLQkJTGlzdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuTGlzdCgpOwotCi0JCWludCBpbmRleCA9IGNoaWxkcmVuLmluZGV4T2YocmVmZXJlbmNlKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkvLyBubyByZWZlcmVuY2Ugbm9kZSwgYWRkIGl0IHRvIHRoZSBlbmQ/PwotCQkJaW5kZXggPSBjaGlsZHJlbi5zaXplKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBnb3QgYW4gaW5kZXguIGlmIHdlIHdhbnQgdG8gYWRkIGFmdGVyLCBpbmNyZWFzZSBieSAxCi0JCQlpbmRleCA9IGlzQWZ0ZXIgPyBpbmRleCArIDEgOiBpbmRleDsKLQkJfQotCQlpbnNlcnRDaGlsZE5vZGUocmVxdWVzdG9yLCBub2RlVGV4dCwgaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc29sdmVSZWdpb25zKCkgewotCQlpbnQgbmVzdGluZyA9IDA7Ci0JCS8vIGNoaWxkcmVuLmNsZWFyKCk7Ci0JCXJlbW92ZUNoaWxkTm9kZXMoKTsKLQkJRFRETm9kZSBjdXJyZW50R3JvdXBOb2RlID0gbnVsbDsKLQkJQ01CYXNpY05vZGUgY3VycmVudFJlZmVyZW5jZU5vZGUgPSBudWxsOwotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJLy8gd2UgYXNzdW1lIHRoZSBmaXJzdCByZWdpb24gaXMgdGhlICcoJwotCQlpdGVyLm5leHQoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpICYmIG5lc3RpbmcgPj0gMCkgewotCQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKG5lc3RpbmcgPT0gMCkgewotCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9QQ0RBVEEpKSB7Ci0JCQkJCWN1cnJlbnRHcm91cE5vZGUgPSBjdXJyZW50UmVmZXJlbmNlTm9kZSA9IG51bGw7Ci0JCQkJCURURE5vZGUgcGNEYXRhID0gbmV3IENNQmFzaWNOb2RlKGdldERUREZpbGUoKSwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkpOwotCQkJCQlwY0RhdGEuYWRkUmVnaW9uKGN1cnJlbnRSZWdpb24pOwotCQkJCQlhcHBlbmRDaGlsZChwY0RhdGEpOwotCQkJCQkvLyBjaGlsZHJlbi5hZGQocGNEYXRhKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLk5BTUUpKSB7Ci0JCQkJCS8vIHdlIGhhdmUgaGl0IGEgbmV3IHJlZmVyZW5jZSBub2RlLiBNYWtlIHN1cmUgd2UgcmVzZXQKLQkJCQkJLy8gdGhlIGdyb3Vwbm9kZSB2YXIgc28gaXQgZG9lc24ndCBjb2xsZWN0IG1vcmUgcmVnaW9ucwotCQkJCQljdXJyZW50R3JvdXBOb2RlID0gbnVsbDsKLQkJCQkJY3VycmVudFJlZmVyZW5jZU5vZGUgPSBuZXcgQ01CYXNpY05vZGUoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJCWN1cnJlbnRSZWZlcmVuY2VOb2RlLmFkZFJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQkJYXBwZW5kQ2hpbGQoY3VycmVudFJlZmVyZW5jZU5vZGUpOwotCQkJCQkvLyBjaGlsZHJlbi5hZGQoY3VycmVudFJlZmVyZW5jZU5vZGUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSkpIHsKLQkJCQkJLy8gd2UgY291bGQgcG90ZW50aWFsbHkgZmxhZyBhbiBlcnJvciBoZXJlIGlmIHdlIGhpdCBhbgotCQkJCQkvLyBvY2N1cnJlbmNlIHR5cGUgYW5kIGN1cnJlbnRSZWZOb2RlIGFuZCBjdXJyZW50R3JvdXBOb2RlCi0JCQkJCS8vIGFyZSBudWxsCi0JCQkJCWlmIChjdXJyZW50UmVmZXJlbmNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBjdXJyZW50UmVmZXJlbmNlTm9kZS5zZXRPY2N1cnJlbmNlKGN1cnJlbnRSZWdpb24uZ2V0VGV4dCgpLnRvQ2hhckFycmF5KClbMF0pOwotCQkJCQkJY3VycmVudFJlZmVyZW5jZU5vZGUuYWRkUmVnaW9uKGN1cnJlbnRSZWdpb24pOwotCQkJCQkJY3VycmVudFJlZmVyZW5jZU5vZGUgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5DT05ORUNUT1IpKSB7Ci0JCQkJCS8vIG5vdGUgdGhhdCBpZiBjb25uZWN0b3IgaXMgYWxyZWFkeSBzZXQgYW5kIGl0IGlzCi0JCQkJCS8vIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IGNvbm5lY3RvciByZWdpb24sIHRoZW4gd2UKLQkJCQkJLy8gaGF2ZSBhbiBlcnJvciEKLQkJCQkJLy8gc2V0Q29ubmVjdG9yKGN1cnJlbnRSZWdpb24uZ2V0VGV4dCgpLnRvQ2hhckFycmF5KClbMF0pOwotCQkJCX0KLQkJCQllbHNlIGlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTEVGVF9QQVJFTikpIHsKLQkJCQkJaWYgKGN1cnJlbnRHcm91cE5vZGUgPT0gbnVsbCkgewotCQkJCQkJLy8gd2UgaGF2ZSBoaXQgYSBuZXcgZ3JvdXAuIE1ha2Ugc3VyZSB3ZSByZXNldCB0aGUKLQkJCQkJCS8vIHJlZmVyZW5jZW5vZGUgdmFyIHNvIGl0IGRvZXNuJ3QgY29sbGVjdCBhbnkgbW9yZQotCQkJCQkJLy8gcmVnaW9ucwotCQkJCQkJY3VycmVudFJlZmVyZW5jZU5vZGUgPSBudWxsOwotCQkJCQkJY3VycmVudEdyb3VwTm9kZSA9IG5ldyBDTUdyb3VwTm9kZShnZXREVERGaWxlKCksIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCQkJCWFwcGVuZENoaWxkKGN1cnJlbnRHcm91cE5vZGUpOwotCQkJCQkJLy8gY2hpbGRyZW4uYWRkKGN1cnJlbnRHcm91cE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pKSB7Ci0JCQkJbmVzdGluZysrOwotCQkJfQotCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5SSUdIVF9QQVJFTikpIHsKLQkJCQluZXN0aW5nLS07Ci0JCQkJaWYgKG5lc3RpbmcgPT0gMCAmJiBjdXJyZW50R3JvdXBOb2RlICE9IG51bGwpIHsKLQkJCQkJY3VycmVudEdyb3VwTm9kZS5hZGRSZWdpb24oY3VycmVudFJlZ2lvbik7Ci0JCQkJCS8vIHBlZWsgYXQgbmV4dCByZWdpb24gdG8gc2VlIGlmIGl0IGlzIGFuIG9jY3VyIHJlZ2lvbi4gaWYKLQkJCQkJLy8gc28sIGFkZCBpdCB0byB0aGUgZ3JvdXBub2RlCi0JCQkJCWlmIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJSVRleHRSZWdpb24gbmV4dFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKG5leHRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSkgewotCQkJCQkJCWN1cnJlbnRHcm91cE5vZGUuYWRkUmVnaW9uKG5leHRSZWdpb24pOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gT3RoZXJ3aXNlLCBwdXNoIGl0IGJhY2sgYXMgdGhlIG5leHQgaXRlbSB0byBiZQotCQkJCQkJCS8vIHJldHJpZXZlZCBieSBhIGZ1dHVyZSBuZXh0KCkgY2FsbAotCQkJCQkJCWl0ZXIucHJldmlvdXMoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljdXJyZW50R3JvdXBOb2RlID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY3VycmVudEdyb3VwTm9kZSAhPSBudWxsKSB7Ci0JCQkJY3VycmVudEdyb3VwTm9kZS5hZGRSZWdpb24oY3VycmVudFJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobmVzdGluZyA8IDApIHsKLQkJCS8vIFRoaXMgbWVhbnMgd2UgaGF2ZSBwYXNzZWQgb3ZlciB0aGUgcmlnaHQgcGFyZW4gdGhhdCBtYXJrcyB0aGUKLQkJCS8vIGVuZCBvZiBvdXIgZ3JvdXBpbmcuCi0JCQkvLyBMb29rIGZvciBhbiBvY2N1cnJlbmNlIHJlZ2lvbgotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSkpIHsKLQkJCQkJLy8gc2V0T2NjdXJyZW5jZShjdXJyZW50UmVnaW9uLmdldFRleHQoKS50b0NoYXJBcnJheSgpWzBdKTsKLQkJCQl9Ci0JCQl9IC8vIGVuZCBvZiB3aGlsZSAoKQotCQl9Ci0KLQkJLy8gZm9yIChvcmcudzNjLmRvbS5Ob2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZAotCQkvLyA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpCi0JCS8vIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjaGlsZCBmb3VuZCA9ICIgKyBjaGlsZCk7Ci0JCS8vIH0KLQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY2hpbGRyZW4gbGVnbnRoID0gIiArIGNoaWxkcmVuLmxlbmd0aCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJRFRETm9kZSBjdXJyZW50Tm9kZSA9IChEVEROb2RlKSBjaGlsZHJlbltpXTsKLQkJCWN1cnJlbnROb2RlLnJlc29sdmVSZWdpb25zKCk7Ci0JCX0gLy8gZW5kIG9mIHdoaWxlICgpCi0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGNvbm5lY3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGNvbm5lY3Rvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25uZWN0b3IoY2hhciB2KSB7Ci0JCWlmIChjb25uZWN0b3IgIT0gdikgewotCQkJY29ubmVjdG9yID0gdjsKLQkJCS8vIHdhbGsgdGhyb3VnaCBvdXIga2lkcyBhbmQgc2VlIGlmIHRoZXJlIGlzIGEgY29ubmVjdG9yIGJldHdlZW4KLQkJCS8vIGVhY2ggc2libGluZy4gaWYgbm90LCBjcmVhdGUgb25lIGFuZCBzZXQgdGhlIGNvbm5lY3Rvci4gaWYKLQkJCS8vIHRoZXJlIGlzCi0JCQkvLyB0aGVuIGp1c3QgY2hhbmdlIHRoZSB0ZXh0IG9mIHRoZSBjb25uZWN0b3IKLQkJCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJCWlmIChjaGlsZHJlbi5sZW5ndGggPD0gMSkgewotCQkJCS8vIHRoZXJlIHdvbid0IGJlIGFueSBjb25uZWN0b3IgZXhpc3RpbmcgYmV0d2VlbiB0aGUgY2hpbGRyZW4KLQkJCQkvLyBqdXN0IG5vdGlmeSBhIGNoYW5nZSBpbiB0aGUgbm9kZSBhbmQgcmV0dXJuOwotCQkJCWdldERUREZpbGUoKS5ub3RpZnlOb2RlQ2hhbmdlZCh0aGlzKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0NPTk5FQ1RPUik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCQkJRFRETm9kZSBjaGlsZEEgPSAoRFRETm9kZSkgY2hpbGRyZW5baV07Ci0JCQkJRFRETm9kZSBjaGlsZEIgPSAoRFRETm9kZSkgY2hpbGRyZW5baSArIDFdOwotCi0JCQkJLy8gY3JlYXRlIGEgc3RyZWFtIGJldHdlZW4gdGhlIHR3byBzaWJsaW5ncyBhbmQgd2FsayBpdAotCQkJCS8vIG5vdGUgdGhhdCB0aGlzIHN0cmVhbSBpbmNsdWRlcyB0aGUgbGFzdCByZWdpb24gb2YgdGhlIGZpcnN0Ci0JCQkJLy8gc2libGluZyBhbmQgdGhlIGZpcnN0IHJlZ2lvbiBvZiB0aGUgbmV4dCBzaWJsaW5nLgotCQkJCS8vIGJvdGggdGhlc2Ugc2hvdWxkIGJlIGlnbm9yZWQKLQkJCQlSZWdpb25JdGVyYXRvciBpdGVyID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLCBjaGlsZEEuZ2V0RW5kT2Zmc2V0KCksIGNoaWxkQi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkvLyBza2lwIHRoZSBmaXJzdCByZWdpb24gd2hpY2ggaXMgdGhlIGxhc3QgcmVnaW9uIG9mIGNoaWxkQQotCi0JCQkJLy8gZG8gd2Ugc3RpbGwgbmVlZCB0aGlzCi0JCQkJLy8gaXRlci5uZXh0KCk7Ci0JCQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IG51bGw7Ci0JCQkJYm9vbGVhbiBmb3VuZENvbm5lY3RvciA9IGZhbHNlOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSAmJiBjdXJyZW50UmVnaW9uICE9IGNoaWxkQi5nZXRTdGFydFJlZ2lvbigpKSB7Ci0JCQkJCWN1cnJlbnRSZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUikgewotCQkJCQkJZm91bmRDb25uZWN0b3IgPSB0cnVlOwotCQkJCQkJLy8gUmVnaW9uIG9sZFJlZ2lvbiA9IGN1cnJlbnRSZWdpb24uY3JlYXRlQ29weSgpOwotCQkJCQkJLy8gZm91bmQgYSBjb25uZWN0b3IhIG9uIHRvIHRoZSBuZXh0IHNpYmxpbmcgcGFpcgotCQkJCQkJLy8gY3VycmVudFJlZ2lvbi51cGRhdGVUZXh0KFN0cmluZy52YWx1ZU9mKHYpKTsKLQkJCQkJCXJlcGxhY2VUZXh0KHRoaXMsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KGN1cnJlbnRSZWdpb24pLCAxLCBTdHJpbmcudmFsdWVPZihjb25uZWN0b3IpKTsKLQkJCQkJCS8vIGNoYW5nZVN0cnVjdHVyZWREb2N1bWVudChvbGRSZWdpb24sIGN1cnJlbnRSZWdpb24pOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoIWZvdW5kQ29ubmVjdG9yKSB7Ci0JCQkJCS8vIGlmIHdlJ3JlIGhlcmUsIHRoYXQgbWVhbnMgd2UgbmVlZCB0byBpbnNlcnQgYSBuZXcKLQkJCQkJLy8gY29ubmVjdG9yIHJlZ2lvbiBhZnRlciBjaGlsZEEKLQkJCQkJcmVwbGFjZVRleHQodGhpcywgY2hpbGRBLmdldEVuZE9mZnNldCgpLCAwLCBTdHJpbmcudmFsdWVPZihjb25uZWN0b3IpKTsKLQkJCQkJLy8gRFREUmVnaW9uIGNvbm5lY3RvclJlZ2lvbiA9IG5ldwotCQkJCQkvLyBEVERSZWdpb24oRFREUmVnaW9uVHlwZXMuQ09OTkVDVE9SLAotCQkJCQkvLyBjaGlsZEEuZ2V0RW5kT2Zmc2V0KCksIDEpOwotCQkJCQkvLyBpbnNlcnRJbnRvU3RydWN0dXJlZERvY3VtZW50KGNvbm5lY3RvclJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCQl9Ci0JfQotCi0JLy8gcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKCkKLQkvLyB7Ci0JLy8gcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkoKTsKLQkvLyB9Ci19Ly8gQ01Hcm91cE5vZGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ01Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzYzNzQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ01Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLS8vIGJhc2UgY2xhc3MgZm9yIGFuIEVsZW1lbnQncyBjb250ZW50bW9kZWwKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTU5vZGUgZXh0ZW5kcyBEVEROb2RlIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTlkgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfQU5ZOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hJTERSRU4gPSBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfQ0hJTERfQ09OVEVOVDsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFkgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfRU1QVFk7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSVhFRCA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9NSVhfQ09OVEVOVDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBDREFUQSA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9QQ0RBVEE7IC8vJE5PTi1OTFMtMSQKLQotCi0JYm9vbGVhbiByb290RWxlbWVudENvbnRlbnQ7Ci0KLQlwdWJsaWMgQ01Ob2RlKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSk7Ci0JfQotCi0JLy8gdGhpcyBpcyBvbmx5IHZhbGlkIHRvIGFzayBpZiB0aGUgY29udGVudCBpcyBhIHJvb3QgZWxlbWVudCBjb250ZW50Ci0JYWJzdHJhY3QgcHVibGljIFN0cmluZyBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHJvb3RFbGVtZW50Q29udGVudC4gVGhpcyB0ZWxscyB1cyB3aGV0aGVyIHRoaXMgZWxlbWVudAotCSAqIGNvbnRlbnQncyBwYXJlbnQgaXMgYSBkaXJlY3QgZGVjZW5kZW50IG9mIHRoZSBjb250YWluaW5nIGVsZW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHJvb3RFbGVtZW50Q29udGVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Jvb3RFbGVtZW50Q29udGVudCgpIHsKLQkJcmV0dXJuIHJvb3RFbGVtZW50Q29udGVudDsKLQl9Ci0KLQkvLyBpZiB0aGlzIGlzIGEgcm9vdCBlbGVtZW50LCBjaGFuZ2UgdGhlIGNvbnRlbnQgdG8gY2hpbGRyZW4KLQkvLyBpZSAuIChjaGlsZDEpCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRyZW5Db250ZW50KFN0cmluZyBuZXdDaGlsZCkgewotCQlpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkgewotCQkJaWYgKCFuZXdDaGlsZC5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfU0VUX0NISUxEX0NPTlRFTlQpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RhcnRPZmZzZXQoKSwgZ2V0Tm9kZUxlbmd0aCgpLCAiKCIgKyBuZXdDaGlsZCArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWVuZFJlY29yZGluZyh0aGlzKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmICghZ2V0VHlwZSgpLmVxdWFscyhDSElMRFJFTikpIHsKLQkJCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfU0VUX0NISUxEX0NPTlRFTlQpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHRoaXMgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdGFydE9mZnNldCgpLCBnZXROb2RlTGVuZ3RoKCksICIobmV3Q2hpbGQpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG5vdyBtdXN0IGNvbnZlcnQgZnJvbSBtaXhlZCBjb250ZW50IHRvIHRoaXMgb25lLiBtdXN0Ci0JCQkJCS8vIHByZXNlcnZlIHRoZSByZW1haW5pbmcgY2hpbGRyZW4KLQkJCQkJQ01Hcm91cE5vZGUgZ3JvdXAgPSAoQ01Hcm91cE5vZGUpIHRoaXM7Ci0JCQkJCUNNTm9kZSBmaXJzdENoaWxkID0gKENNTm9kZSkgZ3JvdXAuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCQlpZiAoZmlyc3RDaGlsZC5nZXRUeXBlKCkuZXF1YWxzKFBDREFUQSkpIHsKLQkJCQkJCWdyb3VwLmRlbGV0ZShmaXJzdENoaWxkKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWVuZFJlY29yZGluZyh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHsKLQkJaWYgKGlzUm9vdEVsZW1lbnRDb250ZW50KCkpIHsKLQkJCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9TRVQgKyAiICIgKyBjb250ZW50ICsgIiAiICsgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9DTV9OT0RFX0NPTlRFTlQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdGFydE9mZnNldCgpLCBnZXROb2RlTGVuZ3RoKCksIGNvbnRlbnQpOwotCQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCQl9Ci0JfQotCi0JLy8gaWYgdGhpcyBpcyBhIHJvb3QgZWxlbWVudCwgY2hhbmdlIHRoZSBjb250ZW50IHRvIG1peGVkCi0JLy8gaWUgLiAoI1BDREFUQSwgY2hpbGQxKQotCXB1YmxpYyB2b2lkIHNldE1peGVkQ29udGVudCgpIHsKLQkJaWYgKGlzUm9vdEVsZW1lbnRDb250ZW50KCkpIHsKLQkJCWlmICghZ2V0VHlwZSgpLmVxdWFscyhNSVhFRCkpIHsKLQkJCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfU0VUX01JWF9DT05URU5UKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICh0aGlzIGluc3RhbmNlb2YgQ01CYXNpY05vZGUpIHsKLQkJCQkJcmVwbGFjZVRleHQodGhpcywgZ2V0U3RhcnRPZmZzZXQoKSwgZ2V0Tm9kZUxlbmd0aCgpLCAiKCNQQ0RBVEEgfCBuZXdDaGlsZCkqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG5vdyBtdXN0IGNvbnZlcnQgZnJvbSBjaGlsZHJlbiBjb250ZW50IHRvIHRoaXMgb25lLgotCQkJCQkvLyBtdXN0Ci0JCQkJCS8vIHByZXNlcnZlIHRoZSBjaGlsZHJlbgotCQkJCQlDTUdyb3VwTm9kZSBncm91cCA9IChDTUdyb3VwTm9kZSkgdGhpczsKLQkJCQkJZ3JvdXAuc2V0Q29ubmVjdG9yKENNR3JvdXBOb2RlLkNIT0lDRSk7Ci0JCQkJCWdyb3VwLnNldE9jY3VycmVuY2UoQ01SZXBlYXRhYmxlTm9kZS5aRVJPX09SX01PUkUpOwotCQkJCQlDTU5vZGUgZmlyc3RDaGlsZCA9IChDTU5vZGUpIGdyb3VwLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQkJaWYgKCFmaXJzdENoaWxkLmdldFR5cGUoKS5lcXVhbHMoUENEQVRBKSkgewotCQkJCQkJZ3JvdXAuaW5zZXJ0Q2hpbGROb2RlKCIjUENEQVRBIiwgMCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHJvb3RFbGVtZW50Q29udGVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHJvb3RFbGVtZW50Q29udGVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb290RWxlbWVudENvbnRlbnQoYm9vbGVhbiB2KSB7Ci0JCXRoaXMucm9vdEVsZW1lbnRDb250ZW50ID0gdjsKLQl9Ci0KLQkvLyBwdWJsaWMgdm9pZCBkZWxldGUoKQotCS8vIHsKLQkvLyBpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkKLQkvLyB7Ci0JLy8gLy8gdGhlbiB0aGUgc3VwZXJjbGFzc2VzIGRlbGV0ZSB3aWxsIGJlIGZpbmUKLQkvLyBzdXBlci5kZWxldGUoKTsKLQkvLyByZXR1cm47Ci0JLy8gfQotCi0JLy8gQ01Hcm91cE5vZGUgcGFyZW50ID0gKENNR3JvdXBOb2RlKSBnZXRQYXJlbnROb2RlKCk7Ci0JLy8gcGFyZW50LnJlbW92ZUNoaWxkTm9kZSh0aGlzKTsKLQkvLyB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9DTVJlcGVhdGFibGVOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNUmVwZWF0YWJsZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRhOGJmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNUmVwZWF0YWJsZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTVJlcGVhdGFibGVOb2RlIGV4dGVuZHMgQ01Ob2RlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPTkNFID0gJzEnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPTkVfT1JfTU9SRSA9ICcrJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgT1BUSU9OQUwgPSAnPyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFpFUk9fT1JfTU9SRSA9ICcqJzsKLQotCi0JcHVibGljIENNUmVwZWF0YWJsZU5vZGUoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCURURENvcmVQbHVnaW4gcmVzb3VyY2VQbHVnaW4gPSBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JCXJldHVybiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5FTEVNRU5UUkVGSUNPTik7Ci0JfQotCi0JcHVibGljIGNoYXIgZ2V0T2NjdXJyZW5jZSgpIHsKLQkJSVRleHRSZWdpb24gb2NjdXJSZWdpb24gPSBnZXRPY2N1cnJlbmNlUmVnaW9uKCk7Ci0JCWlmIChvY2N1clJlZ2lvbiAhPSBudWxsICYmIG9jY3VyUmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSB7Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChvY2N1clJlZ2lvbikuY2hhckF0KDApOwotCQl9Ci0JCXJldHVybiBDTVJlcGVhdGFibGVOb2RlLk9OQ0U7Ci0JfQotCi0JLy8gcmV0dXJucyB0aGUgb2NjdXJyZW5jZXJlZ2lvbiwgb3IgdGhlIGxhc3QgcmVnaW9uIHdoZXJlIHRoZSBvY2N1cnJlbmNlCi0JLy8gcmVnaW9uIHNob3VsZCBhcHBlYXIgYWZ0ZXIKLQlhYnN0cmFjdCBwdWJsaWMgSVRleHRSZWdpb24gZ2V0T2NjdXJyZW5jZVJlZ2lvbigpOwotCi0JcHVibGljIHZvaWQgc2V0T2NjdXJyZW5jZShjaGFyIG9jY3VycmVuY2UpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9DTV9SRVBfTk9ERV9DSEdfT0NDVVIpOyAvLyROT04tTkxTLTEkCi0JCXNldE9jY3VycmVuY2UodGhpcywgb2NjdXJyZW5jZSk7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPY2N1cnJlbmNlKE9iamVjdCByZXF1ZXN0b3IsIGNoYXIgb2NjdXJyZW5jZSkgewotCQlpZiAoZ2V0T2NjdXJyZW5jZSgpICE9IG9jY3VycmVuY2UpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldE9jY3VycmVuY2VSZWdpb24oKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSkgewotCQkJCQlpZiAob2NjdXJyZW5jZSA9PSBDTVJlcGVhdGFibGVOb2RlLk9OQ0UpIHsKLQkJCQkJCS8vIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBvY2N1ciByZWdpb24gZnJvbSB0aGUgZmxhdAotCQkJCQkJLy8gbW9kZWw7Ci0JCQkJCQlnZXREVERGaWxlKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pLCAxLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIFJlZ2lvbiBvbGRPY2N1ciA9IHJlZ2lvbi5jcmVhdGVDb3B5KCk7Ci0JCQkJCQlnZXREVERGaWxlKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pLCAxLCBTdHJpbmcudmFsdWVPZihvY2N1cnJlbmNlKSk7Ci0JCQkJCQkvLyBjaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnQob2xkT2NjdXIsIHJlZ2lvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAob2NjdXJyZW5jZSAhPSBDTVJlcGVhdGFibGVOb2RlLk9OQ0UpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldFN0cmluZygpKTsKLQkJCQkJLy8gd2UgbmVlZCB0byBjcmVhdGUgYW4gb2NjdXJyZW5jZVJlZ2lvbgotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pLCAwLCBTdHJpbmcudmFsdWVPZihvY2N1cnJlbmNlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19Ly8gQ01SZXBlYXRhYmxlTm9kZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Db21tZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NvbW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRlODI1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NvbW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBDb21tZW50IGV4dGVuZHMgTmFtZWRUb3BMZXZlbE5vZGUgewotCi0JcHVibGljIGNsYXNzIFN0YXJ0RW5kUGFpciB7Ci0JCXB1YmxpYyBpbnQgc3RhcnRPZmZzZXQsIGVuZE9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgQ29tbWVudChEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUsIERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5DT01NRU5USUNPTik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgdGV4dCA9IGdldFRleHQoKTsKLQkJaWYgKHRleHQubGVuZ3RoKCkgPD0gMzApIHsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIDI5KSArICIuLi4iOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0U3RhcnRBbmRFbmRPZmZzZXRGb3JUZXh0KFN0YXJ0RW5kUGFpciBwYWlyKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiBjb21tZW50U3RhcnRUYWcgPSBnZXRTdGFydFRhZyhpdGVyKTsKLQkJSVRleHRSZWdpb24gZW5kQ29tbWVudFRhZyA9IGdldE5leHRSZWdpb24oaXRlciwgRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9FTkQpOwotCQlwYWlyLmVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCgpOwotCQlpZiAoY29tbWVudFN0YXJ0VGFnICE9IG51bGwpIHsKLQkJCXBhaXIuc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoY29tbWVudFN0YXJ0VGFnKTsKLQkJfQotCQlpZiAoZW5kQ29tbWVudFRhZyAhPSBudWxsKSB7Ci0JCQlwYWlyLmVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KGVuZENvbW1lbnRUYWcpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoKTsKLQkJaW50IGZsYXROb2RlU3RhcnQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpOwotCQlTdGFydEVuZFBhaXIgcGFpciA9IG5ldyBTdGFydEVuZFBhaXIoKTsKLQkJZ2V0U3RhcnRBbmRFbmRPZmZzZXRGb3JUZXh0KHBhaXIpOwotCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcocGFpci5zdGFydE9mZnNldCAtIGZsYXROb2RlU3RhcnQsIHBhaXIuZW5kT2Zmc2V0IC0gZmxhdE5vZGVTdGFydCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgbmV3VGV4dCkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NPTU1FTlRfQ0hHKTsgLy8kTk9OLU5MUy0xJAotCQlTdGFydEVuZFBhaXIgcGFpciA9IG5ldyBTdGFydEVuZFBhaXIoKTsKLQkJZ2V0U3RhcnRBbmRFbmRPZmZzZXRGb3JUZXh0KHBhaXIpOwotCQlyZXBsYWNlVGV4dCh0aGlzLCBwYWlyLnN0YXJ0T2Zmc2V0LCBwYWlyLmVuZE9mZnNldCAtIHBhaXIuc3RhcnRPZmZzZXQsIG5ld1RleHQpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURENvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUxMmY4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURENvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgRFREIENvcmUKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERDb3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX05PTkVfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ0hBUkFDVEVSX0RBVEFfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSURFTlRJRklFUl9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9JRF9SRUZFUkVOQ0VfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSURfUkVGRVJFTkNFU19ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FTlRJVFlfTkFNRV9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FTlRJVFlfTkFNRVNfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTkFNRV9UT0tFTl9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9OQU1FX1RPS0VOU19ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FTlVNX05BTUVfVE9LRU5TX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VOVU1fTk9UQVRJT05fREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUl9ERUZBVUxUX1ZBTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUl9ERUZBVUxUX0tJTkQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0FUVFJfVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUl9FTlVNX0lURU1TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BVFRSX0xJU1RfQUREOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9HUlBfTk9ERV9DT05ORUNUT1I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0lOU0VSVF9FTEVNRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9HUlBfTk9ERV9BRERfR1JQOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9HUlBfTk9ERV9BRERfQ0hJTEQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX05PREVfTUlYX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX05PREVfQ0hJTERfQ09OVEVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fTk9ERV9TRVRfTUlYX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX05PREVfU0VUX0NISUxEX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX05PREVfU0VUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9OT0RFX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX05PREVfUENEQVRBOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9OT0RFX0FOWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fTk9ERV9FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fUkVQX05PREVfQ0hHX09DQ1VSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DT01NRU5UX0NIRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRFREX0ZJTEVfQUREX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9GSUxFX0FERF9FTlRJVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9GSUxFX0FERF9DT01NRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9EVERfRklMRV9BRERfUEFSTV9FTlRJVFlfUkVGOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9EVERfRklMRV9BRERfTk9UQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9GSUxFX0FERF9BVFRSX0xJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9GSUxFX0RFTEVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRFREX05PREVfTkFNRV9DSEc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9OT0RFX0RFTEVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRUxFTUVOVF9BRERfQVRUUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRUxFTUVOVF9BRERfR1JQOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTEVNRU5UX0FERF9DSElMRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRU5USVRZX1NFVF9QQVJNX0VOVElUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRU5USVRZX1NFVF9HRU5FUkFMX0VOVElUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRU5USVRZX1NFVF9FWFRfRU5USVRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTlRJVFlfU0VUX0lOVF9FTlRJVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VOVElUWV9WQUxVRV9DSEc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VOVElUWV9OREFUQV9DSEFOR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VYVF9OT0RFX1BVQkxJQ19JRF9DSEc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VYVF9OT0RFX1NZU1RFTV9JRF9DSEc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05PREVfTElTVF9FTEVNRU5UUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTk9ERV9MSVNUX0VOVElUSUVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OT0RFX0xJU1RfTk9UQVRJT05TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OT0RFX0xJU1RfQ09NTUVOVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05PREVfTElTVF9PVEhFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTk9ERV9MSVNUX0FUVFJJQlVURVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1BBUk1fRU5USVRZX1JFRl9DSEdfRU5USVRZX1JFRjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUEFSTV9FTlRJVFlfUkVGX0NPTU1FTlRfQ0hHOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9UT1BfTEVWRUxfTk9ERV9ERUxFVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0lOQ0xfRklMRV9MT0FEX0ZBSUxVUkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX1VOREVDTEFSRURfRUxFTUVOVF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUlBBUlRfVU5ERUNMQVJFRF9FTEVNRU5UXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0RVUF9JRF9BVFRSSUJVVEVfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JQQVJUX0RVUF9JRF9BVFRSSUJVVEVfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfSU5WQUxJRF9ERUZBVUxUX0FUVFJfVkFMVUVfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JQQVJUX0lOVkFMSURfREVGQVVMVF9BVFRSX1ZBTFVFXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VYQ19PUEVSQVRJT05fTk9UX1NVUFBPUlRFRDsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBEVERDb3JlTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFREQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNTU2MjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRFREQ29yZVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCXByaXZhdGUgc3RhdGljIERURENvcmVQbHVnaW4gaW5zdGFuY2U7Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldERUREltYWdlKFN0cmluZyBpY29uTmFtZSkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShpY29uTmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0RFRESW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpY29uTmFtZSkgewotCQlTdHJpbmcgdGhpc0lEID0gZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbih0aGlzSUQsIGljb25OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBEVERDb3JlUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEVERDb3JlUGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBEVERDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyBpY29uTmFtZSkgewotCQlJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnkgPSBnZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JCUltYWdlIGltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpOwotCi0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgdGhpc0lEID0gZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJCWltYWdlUmVnaXN0cnkucHV0KGljb25OYW1lLCBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKHRoaXNJRCwgaWNvbk5hbWUpKTsKLQkJCWltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFREQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YWMzZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotISBTdHJpbmdzIGZvciBEVERCYXNpY1R5cGVJbXBsIHR5cGUgZGVzY3JpcHRpb25zCi1fVUlfTk9ORV9ERVNDPU5vbmUKLQotISEgTk9URSBUTyBUUkFOU0xBVE9SOiBEbyBub3QgdHJhbnNsYXRlIGZvbGxvd2luZyB0ZXh0IGluIHBhcmVudGhlc2VzIG9uIGZvbGxvd2luZyAxMCBsaW5lcyBpLmUuKENEQVRBKQotX1VJX0NIQVJBQ1RFUl9EQVRBX0RFU0M9Q2hhcmFjdGVyIERhdGEgKENEQVRBKQotX1VJX0lERU5USUZJRVJfREVTQz1JZGVudGlmaWVyIChJRCkKLV9VSV9JRF9SRUZFUkVOQ0VfREVTQz1JRCBSZWZlcmVuY2UgKElEUkVGKQotX1VJX0lEX1JFRkVSRU5DRVNfREVTQz1JRCBSZWZlcmVuY2VzIChJRFJFRlMpCi1fVUlfRU5USVRZX05BTUVfREVTQz1FbnRpdHkgTmFtZSAoRU5USVRZKQotX1VJX0VOVElUWV9OQU1FU19ERVNDPUVudGl0eSBOYW1lcyAoRU5USVRJRVMpCi1fVUlfTkFNRV9UT0tFTl9ERVNDPU5hbWUgVG9rZW4gKE5NVE9LRU4pCi1fVUlfTkFNRV9UT0tFTlNfREVTQz1OYW1lIFRva2VucyAoTk1UT0tFTlMpCi1fVUlfRU5VTV9OQU1FX1RPS0VOU19ERVNDPUVudW1lcmF0ZWQgTmFtZSBUb2tlbnMKLV9VSV9FTlVNX05PVEFUSU9OX0RFU0M9RW51bWVyYXRlZCBOT1RBVElPTgotCi0hIFN0cmluZ3MgZnJvbSBzZWQvbW9kZWwKLQotISBBdHRyaWJ1dGUuamF2YQotX1VJX0xBQkVMX0FUVFJfREVGQVVMVF9WQUw9QXR0cmlidXRlIERlZmF1bHQgQ2hhbmdlIFZhbHVlCi1fVUlfTEFCRUxfQVRUUl9ERUZBVUxUX0tJTkQ9Q2hhbmdlIEF0dHJpYnV0ZSBEZWZhdWx0IFZhbHVlCi1fVUlfTEFCRUxfQVRUUl9UWVBFPUNoYW5nZSBBdHRyaWJ1dGUgVHlwZQotCi0hIEF0dHJpYnV0ZUVudW1MaXN0Ci1fVUlfTEFCRUxfQVRUUl9FTlVNX0lURU1TPUNoYW5nZSBBdHRyaWJ1dGUgRW51bWVyYXRpb24gVmFsdWUKLQotISBBdHRyaWJ1dGVMaXN0Ci1fVUlfTEFCRUxfQVRUUl9MSVNUX0FERD1BZGQgQXR0cmlidXRlCi0KLSEgQ01Hcm91cE5vZGUKLV9VSV9MQUJFTF9DTV9HUlBfTk9ERV9DT05ORUNUT1I9Q2hhbmdlIENvbm5lY3RvcgotX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0lOU0VSVF9FTEVNRU5UPUluc2VydCBFbGVtZW50Ci1fVUlfTEFCRUxfQ01fR1JQX05PREVfQUREX0dSUD1BZGQgR3JvdXAKLV9VSV9MQUJFTF9DTV9HUlBfTk9ERV9BRERfQ0hJTEQ9QWRkIENoaWxkIEVsZW1lbnQKLQotISBDTU5vZGUKLV9VSV9MQUJFTF9DTV9OT0RFX01JWF9DT05URU5UPU1peGVkIENvbnRlbnQKLV9VSV9MQUJFTF9DTV9OT0RFX0NISUxEX0NPTlRFTlQ9Q2hpbGRyZW4gQ29udGVudAotX1VJX0xBQkVMX0NNX05PREVfU0VUX01JWF9DT05URU5UPVNldCBNaXhlZCBDb250ZW50Ci1fVUlfTEFCRUxfQ01fTk9ERV9TRVRfQ0hJTERfQ09OVEVOVD1TZXQgQ2hpbGRyZW4gQ29udGVudAotCi0hISBOT1RFIFRPIFRSQU5TTEFUT1IgLSBVU0FHRTogIlNldCA8dmFyaWFibGUgY29udGVudD4gQ29udGVudCIKLV9VSV9MQUJFTF9DTV9OT0RFX1NFVD1TZXQKLV9VSV9MQUJFTF9DTV9OT0RFX0NPTlRFTlQ9Q29udGVudAotCi0hISBOT1RFIFRPIFRSQU5TTEFUT1IgLSBETyBOT1QgVFJBTlNMQVRFIEZPTExPV0lORyAzIExJTkVTCi1fVUlfTEFCRUxfQ01fTk9ERV9QQ0RBVEE9KCNQQ0RBVEEpCi1fVUlfTEFCRUxfQ01fTk9ERV9BTlk9QU5ZCi1fVUlfTEFCRUxfQ01fTk9ERV9FTVBUWT1FTVBUWQotCi0hIENNUmVwZWF0YWJsZU5vZGUKLV9VSV9MQUJFTF9DTV9SRVBfTk9ERV9DSEdfT0NDVVI9Q2hhbmdlIE9jY3VycmVuY2UKLQotISBDb21tZW50Ci1fVUlfTEFCRUxfQ09NTUVOVF9DSEc9Q29tbWVudCBDaGFuZ2UKLQotISBEVERGaWxlCi1fVUlfTEFCRUxfRFREX0ZJTEVfQUREX0VMRU1FTlQ9QWRkIEVsZW1lbnQKLV9VSV9MQUJFTF9EVERfRklMRV9BRERfRU5USVRZPUFkZCBFbnRpdHkKLV9VSV9MQUJFTF9EVERfRklMRV9BRERfQ09NTUVOVD1BZGQgQ29tbWVudAotX1VJX0xBQkVMX0RURF9GSUxFX0FERF9QQVJNX0VOVElUWV9SRUY9QWRkIFBhcmFtZXRlciBFbnRpdHkgUmVmZXJlbmNlCi1fVUlfTEFCRUxfRFREX0ZJTEVfQUREX05PVEFUSU9OPUFkZCBOb3RhdGlvbgotX1VJX0xBQkVMX0RURF9GSUxFX0FERF9BVFRSX0xJU1Q9QWRkIEF0dHJpYnV0ZSBMaXN0Ci1fVUlfTEFCRUxfRFREX0ZJTEVfREVMRVRFPURlbGV0ZQotCi0hIERURE5vZGUKLV9VSV9MQUJFTF9EVERfTk9ERV9OQU1FX0NIRz1OYW1lIENoYW5nZQotX1VJX0xBQkVMX0RURF9OT0RFX0RFTEVURT1EZWxldGUKLQotISBFbGVtZW50Ci1fVUlfTEFCRUxfRUxFTUVOVF9BRERfQVRUUj1BZGQgQXR0cmlidXRlCi1fVUlfTEFCRUxfRUxFTUVOVF9BRERfR1JQPUFkZCBHcm91cAotX1VJX0xBQkVMX0VMRU1FTlRfQUREX0NISUxEPUFkZCBDaGlsZCBFbGVtZW50Ci0KLSEgRW50aXR5Ci1fVUlfTEFCRUxfRU5USVRZX1NFVF9QQVJNX0VOVElUWT1TZXQgUGFyYW1ldGVyIEVudGl0eQotX1VJX0xBQkVMX0VOVElUWV9TRVRfR0VORVJBTF9FTlRJVFk9U2V0IEdlbmVyYWwgRW50aXR5Ci1fVUlfTEFCRUxfRU5USVRZX1NFVF9FWFRfRU5USVRZPVNldCBFeHRlcm5hbCBFbnRpdHkKLV9VSV9MQUJFTF9FTlRJVFlfU0VUX0lOVF9FTlRJVFk9U2V0IEludGVybmFsIEVudGl0eQotX1VJX0xBQkVMX0VOVElUWV9WQUxVRV9DSEc9RW50aXR5IFZhbHVlIENoYW5nZQotCi0hISBOT1RFIFRPIFRSQU5TTEFUT1IgLSBVU0FHRTogIk5EQVRBIENoYW5nZSIKLV9VSV9MQUJFTF9FTlRJVFlfTkRBVEFfQ0hBTkdFPUNoYW5nZQotCi0hIEV4dGVybmFsTm9kZQotX1VJX0xBQkVMX0VYVF9OT0RFX1BVQkxJQ19JRF9DSEc9UHVibGljIElEIENoYW5nZQotX1VJX0xBQkVMX0VYVF9OT0RFX1NZU1RFTV9JRF9DSEc9U3lzdGVtIElEIENoYW5nZQotCi0hIE5vZGVMaXN0Ci1fVUlfTEFCRUxfTk9ERV9MSVNUX0VMRU1FTlRTPUVsZW1lbnRzCi1fVUlfTEFCRUxfTk9ERV9MSVNUX0VOVElUSUVTPUVudGl0aWVzCi1fVUlfTEFCRUxfTk9ERV9MSVNUX05PVEFUSU9OUz1Ob3RhdGlvbnMKLV9VSV9MQUJFTF9OT0RFX0xJU1RfQ09NTUVOVFM9Q29tbWVudHMKLV9VSV9MQUJFTF9OT0RFX0xJU1RfT1RIRVI9T3RoZXIKLV9VSV9MQUJFTF9OT0RFX0xJU1RfQVRUUklCVVRFUz1BdHRyaWJ1dGVzCi0KLSEgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlCi1fVUlfTEFCRUxfUEFSTV9FTlRJVFlfUkVGX0NIR19FTlRJVFlfUkVGPUNoYW5nZSBFbnRpdHkgUmVmZXJlbmNlCi1fVUlfTEFCRUxfUEFSTV9FTlRJVFlfUkVGX0NPTU1FTlRfQ0hHPUNvbW1lbnQgQ2hhbmdlCi0KLSEgVG9wTGV2ZWxOb2RlCi1fVUlfTEFCRUxfVE9QX0xFVkVMX05PREVfREVMRVRFPURlbGV0ZQotCi1fRVJST1JfSU5DTF9GSUxFX0xPQURfRkFJTFVSRSAgICAgICA9IEZhaWxlZCB0byBsb2FkIGluY2x1ZGVkIGZpbGUKLQotISB1c2FnZTogX0VSUk9SX1VOREVDTEFSRURfRUxFTUVOVF8xICArIDxlbGVtZW50TmFtZT4gKyBfUEFSVEVSUk9SX1VOREVDTEFSRURfRUxFTUVOVF8yCi1fRVJST1JfVU5ERUNMQVJFRF9FTEVNRU5UXzEgICAgICAgICA9IFJlZmVyZW5jZSB0byB1bmRlY2xhcmVkIGVsZW1lbnQgJwotX1VJX0VSUk9SUEFSVF9VTkRFQ0xBUkVEX0VMRU1FTlRfMiAgPScgaW4gY29udGVudCBtb2RlbC4KLQotISB1c2FnZTogX0VSUk9SX0RVUF9JRF9BVFRSSUJVVEVfMSAgKyA8YXR0cmlidXRlTmFtZT4gKyBfUEFSVEVSUk9SX0RVUF9JRF9BVFRSSUJVVEVfMgotX0VSUk9SX0RVUF9JRF9BVFRSSUJVVEVfMSAgICAgICAgID0gRHVwbGljYXRlIElEIGF0dHJpYnV0ZSAnCi1fVUlfRVJST1JQQVJUX0RVUF9JRF9BVFRSSUJVVEVfMiAgPSAnLiBPbmx5IG9uZSBJRCBhdHRyaWJ1dGUgY2FuIGJlIHNwZWNpZmllZCBwZXIgRUxFTUVOVCB0eXBlLgotCi0hIHVzYWdlOl9FUlJPUl9JTlZBTElEX0RFRkFVTFRfQVRUUl9WQUxVRV8xICsgPHR5cGVTdHJpbmc+ICsgX1BBUlRFUlJPUl9JTlZBTElEX0RFRkFVTFRfQVRUUl9WQUxVRV8yICsgPGF0dHJpYnV0ZU5hbWU+Ci1fRVJST1JfSU5WQUxJRF9ERUZBVUxUX0FUVFJfVkFMVUVfMSAgICAgICAgID0gSW52YWxpZCBkZWZhdWx0Ci1fVUlfRVJST1JQQVJUX0lOVkFMSURfREVGQVVMVF9BVFRSX1ZBTFVFXzIgID0gIHZhbHVlIGZvciBhdHRyaWJ1dGUgJwotCi1fRVhDX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEICA9IE9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RUREZpbGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFRERmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmNmMDMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFRERmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZXZlbnQuSURUREZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZXZlbnQuTm9kZXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLkRUREV4dGVybmFsUmVmZXJlbmNlUmVtb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5EVERNb2RlbFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWwuRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTmV3RG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotcHVibGljIGNsYXNzIERUREZpbGUgaW1wbGVtZW50cyBJbmRleGVkUmVnaW9uIHsKLQlwcml2YXRlIE5vZGVMaXN0IGF0dGxpc3RMaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKTsKLQlwcml2YXRlIE5vZGVMaXN0IGNvbW1lbnRMaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQpOwotCi0JYm9vbGVhbiBjcmVhdGluZ05ld01vZGVsID0gZmFsc2U7Ci0JcHJpdmF0ZSBEVERNb2RlbEltcGwgZkRURE1vZGVsOwotCi0JcHJpdmF0ZSBOb2RlTGlzdCBlbGVtZW50TGlzdCA9IG5ldyBOb2RlTGlzdCh0aGlzLCBEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRyk7Ci0JcHJpdmF0ZSBOb2RlTGlzdCBlbnRpdHlMaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpOwotCi0JcHJpdmF0ZSBMaXN0IGZvbGRlckxpc3QgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzTW92aW5nTm9kZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBMaXN0IG1vZGVsTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBMaXN0IG5vZGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTm9kZUxpc3Qgbm90YXRpb25MaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRyk7Ci0JcHJpdmF0ZSBOb2RlTGlzdCB1bnJlY29nbml6ZWRMaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7Ci0KLQlwdWJsaWMgRFRERmlsZShEVERNb2RlbEltcGwgZHRkTW9kZWwpIHsKLQkJdGhpcy5mRFRETW9kZWwgPSBkdGRNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREVERGaWxlTGlzdGVuZXIoSURUREZpbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQltb2RlbExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE5vZGUoRFRETm9kZSBub2RlKSB7Ci0JCWFkZE5vZGUobm9kZUxpc3Quc2l6ZSgpLCBub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb2RlKGludCBpbmRleCwgRFRETm9kZSBub2RlKSB7Ci0JCW5vZGVMaXN0LmFkZChpbmRleCwgbm9kZSk7Ci0JCS8qCi0JCSAqIGlmIChpbmRleCA8IG5vZGVMaXN0LnNpemUoKSkgeyBpbnNlcnRCZWZvcmUobm9kZSwgKERURE5vZGUpCi0JCSAqIG5vZGVMaXN0LmdldChpbmRleCkpOyB9IGVsc2UgeyBhcHBlbmRDaGlsZChub2RlKTsgfQotCQkgKi8KLQl9Ci0KLQlwdWJsaWMgRFRETm9kZSBidWlsZE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQkvLyBJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJRFRETm9kZSBub2RlID0gbnVsbDsKLQkJaWYgKGlzRWxlbWVudChmbGF0Tm9kZSkpIHsKLQkJCS8vIHRoZW4gdGhpcyBpcyBhbiBlbGVtZW50Ci0JCQlub2RlID0gbmV3IEVsZW1lbnQodGhpcywgZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKGlzRW50aXR5KGZsYXROb2RlKSkgewotCQkJbm9kZSA9IG5ldyBFbnRpdHkodGhpcywgZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKGlzTm90YXRpb24oZmxhdE5vZGUpKSB7Ci0JCQlub2RlID0gbmV3IE5vdGF0aW9uKHRoaXMsIGZsYXROb2RlKTsKLQkJfQotCQllbHNlIGlmIChpc0F0dHJpYnV0ZUxpc3QoZmxhdE5vZGUpKSB7Ci0JCQlub2RlID0gbmV3IEF0dHJpYnV0ZUxpc3QodGhpcywgZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKGlzQ29tbWVudChmbGF0Tm9kZSkpIHsKLQkJCW5vZGUgPSBuZXcgQ29tbWVudCh0aGlzLCBmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAoaXNQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoZmxhdE5vZGUpKSB7Ci0JCQlub2RlID0gbmV3IFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSh0aGlzLCBmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAoIWZsYXROb2RlLmdldFRleHQoKS50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlub2RlID0gbmV3IFVucmVjb2duaXplZCh0aGlzLCBmbGF0Tm9kZSk7Ci0JCX0KLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJaW5zZXJ0Tm9kZShub2RlKTsKLQkJCW5vZGUucmVzb2x2ZVJlZ2lvbnMoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBidWlsZE5vZGVzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGxpc3QpIHsKLQkJTm9kZXNFdmVudCBhZGRlZERURE5vZGVzID0gbmV3IE5vZGVzRXZlbnQoKTsKLQotCQlUb3BMZXZlbE5vZGUgcHJldmlvdXNOb2RlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBsaXN0Lml0ZW0oaSk7Ci0JCQlUb3BMZXZlbE5vZGUgbm9kZSA9IChUb3BMZXZlbE5vZGUpIGJ1aWxkTm9kZShmbGF0Tm9kZSk7Ci0JCQkvLyBpZiB3ZSBkb24ndCBjcmVhdGUgYSBub2RlLCB0aGVuIHdlIGFzc3VtZSB0aGF0IHRoZSBmbGF0Ci0JCQkvLyBub2RlIHdhcyB3aGl0ZXNwYWNlLiBUYWNrIGl0IG9uIHRvIGEgcHJldmlvdXMgdG9wbGV2ZWwKLQkJCS8vIG5vZGUKLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlwcmV2aW91c05vZGUgPSBub2RlOwotCQkJCWFkZGVkRFRETm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKHByZXZpb3VzTm9kZSAhPSBudWxsKSB7Ci0JCQkJCXByZXZpb3VzTm9kZS5hZGRXaGl0ZXNwYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYWRkZWREVEROb2Rlcy5nZXROb2RlcygpLnNpemUoKSA+IDApLy8gJiYKLQkJLy8gY3JlYXRpbmdOZXdNb2RlbCA9PSBmYWxzZSkKLQkJewotCQkJLy8gbm93IHRlbGwgcGVvcGxlIGFib3V0IHRoZSBhZGRpdGlvbnMKLQkJCW5vdGlmeU5vZGVzQWRkZWQoYWRkZWREVEROb2Rlcyk7Ci0JCX0KLQl9Ci0KLQkvLyBJbXBsZW1lbnRzIEluZGV4ZWRSZWdpb24KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCB0ZXN0UG9zaXRpb24pIHsKLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KCkgPD0gdGVzdFBvc2l0aW9uICYmIHRlc3RQb3NpdGlvbiA8PSBnZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVBdHRyaWJ1dGVMaXN0KERURE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNBZnRlcikgewotCQlnZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRFREX0ZJTEVfQUREX0FUVFJfTElTVCk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5ld1N0cmVhbSA9ICI8IUFUVExJU1QgIiArIG5hbWUgKyAiPlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWludCBvZmZzZXQgPSBnZXRJbnNlcnRPZmZzZXQobm9kZSwgaXNBZnRlcik7Ci0JCWdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsIG9mZnNldCwgMCwgbmV3U3RyZWFtKTsKLQkJZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29tbWVudChEVEROb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0RURF9GSUxFX0FERF9DT01NRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbmV3U3RyZWFtID0gIjwhLS0gIiArIG5hbWUgKyAiIC0tPlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWludCBvZmZzZXQgPSBnZXRJbnNlcnRPZmZzZXQobm9kZSwgaXNBZnRlcik7Ci0JCWdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsIG9mZnNldCwgMCwgbmV3U3RyZWFtKTsKLQkJZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlRWxlbWVudChEVEROb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0RURF9GSUxFX0FERF9FTEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbmV3U3RyZWFtID0gIjwhRUxFTUVOVCAiICsgbmFtZSArICIgRU1QVFk+XG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW50IG9mZnNldCA9IGdldEluc2VydE9mZnNldChub2RlLCBpc0FmdGVyKTsKLQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQodGhpcywgb2Zmc2V0LCAwLCBuZXdTdHJlYW0pOwotCQlnZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVFbnRpdHkoRFRETm9kZSBub2RlLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0FmdGVyKSB7Ci0JCWdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9EVERfRklMRV9BRERfRU5USVRZKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbmV3U3RyZWFtID0gIjwhRU5USVRZICIgKyBuYW1lICsgIiBcIlwiPlxuIjsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJaW50IG9mZnNldCA9IGdldEluc2VydE9mZnNldChub2RlLCBpc0FmdGVyKTsKLQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQodGhpcywgb2Zmc2V0LCAwLCBuZXdTdHJlYW0pOwotCQlnZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVOb3RhdGlvbihEVEROb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0RURF9GSUxFX0FERF9OT1RBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5ld1N0cmVhbSA9ICI8IU5PVEFUSU9OICIgKyBuYW1lICsgIiBTWVNURU0gXCJcIj5cbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbnQgb2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KG5vZGUsIGlzQWZ0ZXIpOwotCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLCBvZmZzZXQsIDAsIG5ld1N0cmVhbSk7Ci0JCWdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShEVEROb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0RURF9GSUxFX0FERF9QQVJNX0VOVElUWV9SRUYpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBuZXdTdHJlYW0gPSBuYW1lICsgIlxuIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgb2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KG5vZGUsIGlzQWZ0ZXIpOwotCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLCBvZmZzZXQsIDAsIG5ld1N0cmVhbSk7Ci0JCWdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZU5vZGUoRFRETm9kZSBub2RlKSB7Ci0JCWdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9EVERfRklMRV9ERUxFVEUpOyAvLyROT04tTkxTLTEkCi0JCWRlbGV0ZU5vZGUodGhpcywgbm9kZSk7Ci0JCWdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZU5vZGUoT2JqZWN0IHJlcXVlc3RvciwgRFRETm9kZSBub2RlKSB7Ci0JCURURE5vZGUgcGFyZW50ID0gKERURE5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5kZWxldGUocmVxdWVzdG9yLCBub2RlKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmICghaXNNb3ZpbmdOb2RlKSB7Ci0JCQkJRFRETW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBuZXcgRFRETW9kZWxVcGRhdGVyKCk7Ci0JCQkJdXBkYXRlci5vYmplY3RBYm91dFRvQmVEZWxldGVkKHJlcXVlc3Rvciwgbm9kZSk7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIHsKLQkJCQkJRW50aXR5IHJlZmVyZW5jZWRFbnRpdHkgPSAoKFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgbm9kZSkuZ2V0RW50aXR5T2JqZWN0KCk7Ci0JCQkJCWlmIChyZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpIHsKLQkJCQkJCS8vIHJlbW92ZSByZWZlcmVuY2VzIHRvIGFsbCBlbGVtZW50cyBhbmQgcGFybSBlbnRpdGllcwotCQkJCQkJLy8gY29udGFpbmVkIGluIG91ciBjdXJyZW50IG1vZGVsCi0JCQkJCQlEVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIgcmVtb3ZlciA9IG5ldyBEVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIoKTsKLQkJCQkJCXJlbW92ZXIuZXh0ZXJuYWxSZWZlcmVuY2VBYm91dFRvQ2hhbmdlKHJlcXVlc3RvciwgcmVmZXJlbmNlZEVudGl0eSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIE5vdGF0aW9uKSB7Ci0JCQkJCU5vdGF0aW9uIG5vdGF0aW9uID0gKChOb3RhdGlvbikgbm9kZSk7Ci0JCQkJCURURE5vdGF0aW9uUmVmZXJlbmNlUmVtb3ZlciByZW1vdmVyID0gbmV3IERURE5vdGF0aW9uUmVmZXJlbmNlUmVtb3ZlcigpOwotCQkJCQlyZW1vdmVyLm5vdGF0aW9uQWJvdXRUb0JlRGVsZXRlZChyZXF1ZXN0b3IsIG5vdGF0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG5vIHBhcmVudD8gdGhlbiBkZWxldGUgdXAgdW50aWwgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IG5vZGUKLQkJCS8vIGlmIGl0IGlzIGEgdG9wIGxldmVsIG5vZGUKLQkJCWludCBzdGFydE9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWludCBlbmRPZmZzZXQgPSBub2RlLmdldFdoaXRlc3BhY2VFbmRPZmZzZXQoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgVG9wTGV2ZWxOb2RlKSB7Ci0JCQkJZW5kT2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KG5vZGUsIHRydWUpOwotCQkJfQotCQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsICIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIE5vZGVMaXN0IGdldENvbW1lbnRzKCkgewotCQlyZXR1cm4gY29tbWVudExpc3Q7Ci0JfQotCi0JcHVibGljIERURE1vZGVsSW1wbCBnZXREVERNb2RlbCgpIHsKLQkJcmV0dXJuIGZEVERNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNBbmRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gZWxlbWVudExpc3Q7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gcmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJaW50IHN0YXJ0ID0gZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaWYgKHN0YXJ0ID49IDApIHsKLQkJCWludCBlbmQgPSBnZXRFbmRPZmZzZXQoKTsKLQkJCWlmIChlbmQgPj0gMCkgewotCQkJCXJlc3VsdCA9IGVuZCAtIHN0YXJ0OwotCQkJCWlmIChyZXN1bHQgPCAtMSkgewotCQkJCQlyZXN1bHQgPSAtMTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RW50aXRpZXMoKSB7Ci0JCXJldHVybiBlbnRpdHlMaXN0OwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5EVERGSUxFSUNPTik7Ci0JfQotCi0KLQotCXB1YmxpYyBpbnQgZ2V0SW5zZXJ0T2Zmc2V0KERURE5vZGUgbm9kZSwgYm9vbGVhbiBpc0FmdGVyKSB7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAoaXNBZnRlcikgewotCQkJCS8vIHRoZW4gZ2V0IHRoZSBuZXh0IG5vZGUgYW5kIHVzZSBpdCdzIHN0YXJ0IG9mZnNldAotCQkJCWludCBpbmRleCA9IGdldE5vZGVzKCkuaW5kZXhPZihnZXROb2RlKG5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkpKTsKLQotCQkJCURURE5vZGUgYWZ0ZXJOb2RlID0gbnVsbDsKLQkJCQlpZiAoaW5kZXggKyAxIDwgZ2V0Tm9kZXMoKS5zaXplKCkpIHsKLQkJCQkJYWZ0ZXJOb2RlID0gKERURE5vZGUpIGdldE5vZGVzKCkuZ2V0KGluZGV4ICsgMSk7Ci0JCQkJfQotCQkJCWlmIChhZnRlck5vZGUgIT0gbnVsbCkgewotCQkJCQlvZmZzZXQgPSBhZnRlck5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGFkZCB0byBlbmQKLQkJCQkJaWYgKGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQkJCQlvZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlvZmZzZXQgPSBub2RlLmdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBhZGQgdG8gZW5kCi0JCQlpZiAoZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpIHsKLQkJCQlvZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoIHBhdGggPSBuZXcgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGgoZ2V0RFRETW9kZWwoKS5nZXRJZCgpLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gcGF0aC5sYXN0U2VnbWVudCgpOwotCX0KLQotCXB1YmxpYyBEVEROb2RlIGdldE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgbm9kZUxpc3QuZ2V0KGkpOwotCQkJaWYgKG5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkgPT0gZmxhdE5vZGUpIHsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSW5kZXhlZFJlZ2lvbiBnZXROb2RlQXQoaW50IG9mZnNldCkgewotCQlEVEROb2RlIG5vZGUgPSBnZXRUb3BMZXZlbE5vZGVBdChvZmZzZXQpOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbm9kZS5nZXREZWVwZXN0Tm9kZShvZmZzZXQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJbmRleGVkUmVnaW9uIGdldE5vZGVBdChpbnQgc3RhcnRPZmZzZXQsIGludCBlbmRPZmZzZXQpIHsKLQkJRFRETm9kZSBub2RlID0gZ2V0VG9wTGV2ZWxOb2RlQXQoc3RhcnRPZmZzZXQpOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbm9kZS5nZXREZWVwZXN0Tm9kZShzdGFydE9mZnNldCwgZW5kT2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXROb2RlTGlzdHMoKSB7Ci0JCWlmIChmb2xkZXJMaXN0ID09IG51bGwpIHsKLQkJCWZvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb2xkZXJMaXN0LmFkZChub3RhdGlvbkxpc3QpOwotCQkJZm9sZGVyTGlzdC5hZGQoZW50aXR5TGlzdCk7Ci0JCQlmb2xkZXJMaXN0LmFkZChlbGVtZW50TGlzdCk7Ci0JCQlmb2xkZXJMaXN0LmFkZChhdHRsaXN0TGlzdCk7Ci0JCQlmb2xkZXJMaXN0LmFkZChjb21tZW50TGlzdCk7Ci0JCQlmb2xkZXJMaXN0LmFkZCh1bnJlY29nbml6ZWRMaXN0KTsKLQkJfQotCQlyZXR1cm4gZm9sZGVyTGlzdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXROb2RlcygpIHsKLQkJcmV0dXJuIG5vZGVMaXN0OwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXROb3RhdGlvbnMoKSB7Ci0JCXJldHVybiBub3RhdGlvbkxpc3Q7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gcmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRFRETW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JfQotCi0JcHVibGljIERURE5vZGUgZ2V0VG9wTGV2ZWxOb2RlQXQoaW50IG9mZnNldCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgbm9kZUxpc3QuZ2V0KGkpOwotCQkJaWYgKG5vZGUuY29udGFpbnMob2Zmc2V0KSkgewotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRVbnJlY29nbml6ZWQoKSB7Ci0JCXJldHVybiB1bnJlY29nbml6ZWRMaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydEludG9Nb2RlbChPYmplY3QgcmVxdWVzdG9yLCBEVEROb2RlIHJlZmVyZW5jZSwgRFRETm9kZSBub2RlLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJU3RyaW5nIG5vZGVUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBUb3BMZXZlbE5vZGUpIHsKLQkJCW5vZGVUZXh0ID0gKChUb3BMZXZlbE5vZGUpIG5vZGUpLmdldEZ1bGxUZXh0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlVGV4dCA9IG5vZGUuZ2V0Tm9kZVRleHQoKTsKLQkJfQotCQlpbnQgb2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KHJlZmVyZW5jZSwgaXNBZnRlcik7Ci0JCWdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgb2Zmc2V0LCAwLCBub2RlVGV4dCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBpbnNlcnROb2RlKERURE5vZGUgbm9kZSkgewotCQlpbnQgc3RhcnRPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBpbnNlcnRJbmRleCA9IC0xOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInN0YXJ0b2Zmc2V0ID0gIiArIHN0YXJ0T2Zmc2V0KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXROb2RlcygpLnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjdXJyZW50Tm9kZSBlbmRPZmZzZXQgPSAiCi0JCQkvLyArY3VycmVudE5vZGUuZ2V0RW5kT2Zmc2V0KCkpOwotCi0JCQlpZiAoY3VycmVudE5vZGUuZ2V0RW5kT2Zmc2V0KCkgPiBzdGFydE9mZnNldCkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZW5kb2Zmc2V0ICIgKwotCQkJCS8vIGN1cnJlbnROb2RlLmdldEVuZE9mZnNldCgpICsgIiA+ICIgKyBzdGFydE9mZnNldCk7Ci0JCQkJaW5zZXJ0SW5kZXggPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChpbnNlcnRJbmRleCA9PSAtMSkgewotCQkJaW5zZXJ0SW5kZXggPSBnZXROb2RlcygpLnNpemUoKTsKLQkJfQotCi0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpbnNlcnQgaW5kZXggPSAiICsgaW5zZXJ0SW5kZXgpOwotCi0JCWFkZE5vZGUoaW5zZXJ0SW5kZXgsIG5vZGUpOwotCX0KLQotCS8vIGl0IGlzIGFzc3VtZWQgdGhhdCBmbGF0bm9kZSBjb250YWlucyBhdCBsZWFzdCAzIHJlZ2lvbnMKLQlwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZUxpc3QoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9ucygpLnNpemUoKSA+PSAzKSB7Ci0JCQlJVGV4dFJlZ2lvbiBzZWNvbmQgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJSVRleHRSZWdpb24gdGhpcmQgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDIpOwotCQkJaWYgKHNlY29uZC5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OKSAmJiB0aGlyZC5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBpdCBpcyBhc3N1bWVkIHRoYXQgZmxhdG5vZGUgY29udGFpbnMgYXQgbGVhc3QgMyByZWdpb25zCi0JcHVibGljIGJvb2xlYW4gaXNDb21tZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbnMoKS5zaXplKCkgPj0gMikgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBpdCBpcyBhc3N1bWVkIHRoYXQgZmxhdG5vZGUgY29udGFpbnMgYXQgbGVhc3QgMyByZWdpb25zCi0JcHVibGljIGJvb2xlYW4gaXNFbGVtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbnMoKS5zaXplKCkgPj0gMykgewotCQkJSVRleHRSZWdpb24gc2Vjb25kID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCUlUZXh0UmVnaW9uIHRoaXJkID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgyKTsKLQkJCWlmIChzZWNvbmQuZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FWENMQU1BVElPTikgJiYgdGhpcmQuZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gaXQgaXMgYXNzdW1lZCB0aGF0IGZsYXRub2RlIGNvbnRhaW5zIGF0IGxlYXN0IDMgcmVnaW9ucwotCXB1YmxpYyBib29sZWFuIGlzRW50aXR5KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbnMoKS5zaXplKCkgPj0gMykgewotCQkJSVRleHRSZWdpb24gc2Vjb25kID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCUlUZXh0UmVnaW9uIHRoaXJkID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgyKTsKLQkJCWlmIChzZWNvbmQuZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FWENMQU1BVElPTikgJiYgdGhpcmQuZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBpdCBpcyBhc3N1bWVkIHRoYXQgZmxhdG5vZGUgY29udGFpbnMgYXQgbGVhc3QgMyByZWdpb25zCi0JcHVibGljIGJvb2xlYW4gaXNOb3RhdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZS5nZXRSZWdpb25zKCkuc2l6ZSgpID49IDMpIHsKLQkJCUlUZXh0UmVnaW9uIHNlY29uZCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQlJVGV4dFJlZ2lvbiB0aGlyZCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMik7Ci0JCQlpZiAoc2Vjb25kLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRVhDTEFNQVRJT04pICYmIHRoaXJkLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBpdCBpcyBhc3N1bWVkIHRoYXQgZmxhdG5vZGUgY29udGFpbnMgYXQgbGVhc3QgMyByZWdpb25zCi0JcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9ucygpLnNpemUoKSA9PSAxKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDApOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkVOVElUWV9QQVJNKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlib29sZWFuIGlzU2FtZVRvcExldmVsVHlwZShEVEROb2RlIGFmZmVjdGVkTm9kZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gYWZmZWN0ZWROb2RlLmdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpOwotCQkvLyByZXR1cm4gdHJ1ZSBpZiB0aGUgZmxhdG5vZGUgc3RpbGwgbWF0Y2hlcyB3aGF0IHRoZSBhZmZlY3RlZE5vZGUKLQkJLy8gaXMgcmVwcmVzZW50aW5nCi0JCWlmIChhZmZlY3RlZE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50ICYmIGlzRWxlbWVudChmbGF0Tm9kZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhZmZlY3RlZE5vZGUgaW5zdGFuY2VvZiBFbnRpdHkgJiYgaXNFbnRpdHkoZmxhdE5vZGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoYWZmZWN0ZWROb2RlIGluc3RhbmNlb2YgQ29tbWVudCAmJiBpc0NvbW1lbnQoZmxhdE5vZGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoYWZmZWN0ZWROb2RlIGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCAmJiBpc0F0dHJpYnV0ZUxpc3QoZmxhdE5vZGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoYWZmZWN0ZWROb2RlIGluc3RhbmNlb2YgTm90YXRpb24gJiYgaXNOb3RhdGlvbihmbGF0Tm9kZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhZmZlY3RlZE5vZGUgaW5zdGFuY2VvZiBVbnJlY29nbml6ZWQgJiYgaXNVbnJlY29nbml6ZWQoZmxhdE5vZGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNVbnJlY29nbml6ZWQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlyZXR1cm4gIWlzRWxlbWVudChmbGF0Tm9kZSkgJiYgIWlzRW50aXR5KGZsYXROb2RlKSAmJiAhaXNOb3RhdGlvbihmbGF0Tm9kZSkgJiYgIWlzUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKGZsYXROb2RlKSAmJiAhaXNBdHRyaWJ1dGVMaXN0KGZsYXROb2RlKSAmJiAhaXNDb21tZW50KGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlTm9kZShPYmplY3QgcmVxdWVzdG9yLCBEVEROb2RlIHJlZmVyZW5jZU5vZGUsIERURE5vZGUgbm9kZVRvTW92ZSwgYm9vbGVhbiBpc0FmdGVyKSB7Ci0JCWlzTW92aW5nTm9kZSA9IHRydWU7Ci0KLQkJZGVsZXRlTm9kZShyZXF1ZXN0b3IsIG5vZGVUb01vdmUpOwotCQlpbnNlcnRJbnRvTW9kZWwocmVxdWVzdG9yLCByZWZlcmVuY2VOb2RlLCBub2RlVG9Nb3ZlLCBpc0FmdGVyKTsKLQkJaXNNb3ZpbmdOb2RlID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgbmV3TW9kZWwoTmV3RG9jdW1lbnRFdmVudCBldmVudCkgewotCQljcmVhdGluZ05ld01vZGVsID0gdHJ1ZTsKLQkJbm9kZUxpc3QuY2xlYXIoKTsKLQkJTm9kZXNFdmVudCByZW1vdmVFdmVudCA9IG5ldyBOb2Rlc0V2ZW50KCk7Ci0JCXJlbW92ZUV2ZW50LmdldE5vZGVzKCkuYWRkQWxsKG5vZGVMaXN0KTsKLQkJbm90aWZ5Tm9kZXNSZW1vdmVkKHJlbW92ZUV2ZW50KTsKLQkJLyogcmVtb3ZlQ2hpbGROb2RlcygpOyAqLwotCi0JCWlmIChldmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSAhPSBudWxsICYmIGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkxpc3QoKSAhPSBudWxsKSB7Ci0JCQlidWlsZE5vZGVzKGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkxpc3QoKSk7Ci0JCX0KLQkJY3JlYXRpbmdOZXdNb2RlbCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkTm9kZXMgPSBldmVudC5nZXRPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCU5vZGVzRXZlbnQgcmVtb3ZlZERURE5vZGVzID0gbmV3IE5vZGVzRXZlbnQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGROb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gb2xkTm9kZXMuaXRlbShpKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkgPT0gZmxhdE5vZGUpIHsKLQkJCQkJcmVtb3ZlZERURE5vZGVzLmFkZChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlidWlsZE5vZGVzKGV2ZW50LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSk7Ci0KLQkJaWYgKHJlbW92ZWREVEROb2Rlcy5nZXROb2RlcygpLnNpemUoKSA+IDApIHsKLQkJCW5vdGlmeU5vZGVzUmVtb3ZlZChyZW1vdmVkRFRETm9kZXMpOwotCQkJcmVtb3ZlTm9kZXMocmVtb3ZlZERURE5vZGVzLmdldE5vZGVzKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Tm9kZUNoYW5nZWQoRFRETm9kZSBub2RlKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBtb2RlbExpc3RlbmVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlEVERGaWxlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSURUREZpbGVMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5ub2RlQ2hhbmdlZChub2RlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeU5vZGVzQWRkZWQoTm9kZXNFdmVudCBhZGRlZE5vZGVzKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBtb2RlbExpc3RlbmVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlEVERGaWxlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSURUREZpbGVMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5ub2Rlc0FkZGVkKGFkZGVkTm9kZXMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5Tm9kZXNSZW1vdmVkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJSXRlcmF0b3IgaXRlciA9IG1vZGVsTGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSURUREZpbGVMaXN0ZW5lciBsaXN0ZW5lciA9IChJRFRERmlsZUxpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCWxpc3RlbmVyLm5vZGVzUmVtb3ZlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWJ1aWxkTm9kZXMoTGlzdCBub2RlcykgewotCQkvLyByZW1vdmUgdGhlIG9sZCBub2RlcwotCQlyZW1vdmVOb2Rlcyhub2Rlcyk7Ci0KLQkJLy8gbm93IHJlYnVpbGQgdGhlbQotCQlOb2Rlc0V2ZW50IGFkZGVkRFRETm9kZXMgPSBuZXcgTm9kZXNFdmVudCgpOwotCQlJdGVyYXRvciBkdGROb2RlcyA9IG5vZGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChkdGROb2Rlcy5oYXNOZXh0KCkpIHsKLQkJCURURE5vZGUgZHRkTm9kZSA9IChEVEROb2RlKSBkdGROb2Rlcy5uZXh0KCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInJlYnVpbGRpbmcgIiArCi0JCQkvLyBkdGROb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoKSk7Ci0KLQkJCURURE5vZGUgbm9kZSA9IGJ1aWxkTm9kZShkdGROb2RlLmdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlhZGRlZERURE5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCQlpZiAoYWRkZWREVEROb2Rlcy5nZXROb2RlcygpLnNpemUoKSA+IDApIHsKLQkJCS8vIG5vdyB0ZWxsIHBlb3BsZSBhYm91dCB0aGUgYWRkaXRpb25zCi0JCQlub3RpZnlOb2Rlc0FkZGVkKGFkZGVkRFRETm9kZXMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJSVRleHRSZWdpb24gY2hhbmdlZFJlZ2lvbiA9IGV2ZW50LmdldFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCURURE5vZGUgYWZmZWN0ZWROb2RlID0gKERURE5vZGUpIGdldE5vZGVBdChmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChjaGFuZ2VkUmVnaW9uKSwgZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KGNoYW5nZWRSZWdpb24pKTsKLQkJaWYgKGFmZmVjdGVkTm9kZSAhPSBudWxsKSB7Ci0JCQkvLyBubyBuZWVkIHRvIHJlc29sdmUgcmVnaW9ucyBhcyBpdCBpcyBqdXN0IGEgY2hhbmdlCi0JCQkvLyBhZmZlY3RlZE5vZGUucmVzb2x2ZVJlZ2lvbnMoKTsKLQkJCW5vdGlmeU5vZGVDaGFuZ2VkKGFmZmVjdGVkTm9kZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJTGlzdCBub2Rlc1RvUmVidWlsZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlEVEROb2RlIGFmZmVjdGVkTm9kZSA9IGdldE5vZGUoZmxhdE5vZGUpOwotCi0JCWlmICghaXNTYW1lVG9wTGV2ZWxUeXBlKGFmZmVjdGVkTm9kZSkpIHsKLQkJCS8vIEJ1ZyAxMTExMDAgLSBGaXJlIG9mZiBhIG5vZGUgcmVtb3ZhbCBldmVudAotCQkJLy8gdG8gcmVtb3ZlIHRoZSBub2RlIGZyb20gdGhlIHRyZWUgdmlld2VyCi0JCQlOb2Rlc0V2ZW50IHJlbW92ZWREVEROb2RlcyA9IG5ldyBOb2Rlc0V2ZW50KCk7Ci0JCQlyZW1vdmVkRFRETm9kZXMuYWRkKGFmZmVjdGVkTm9kZSk7Ci0JCQlub3RpZnlOb2Rlc1JlbW92ZWQocmVtb3ZlZERURE5vZGVzKTsKLQkJCW5vZGVzVG9SZWJ1aWxkLmFkZChhZmZlY3RlZE5vZGUpOwotCQkJcmVidWlsZE5vZGVzKG5vZGVzVG9SZWJ1aWxkKTsKLQkJfQotCQllbHNlIHsKLQkJCWFmZmVjdGVkTm9kZS5yZXNvbHZlUmVnaW9ucygpOwotCQkJbm90aWZ5Tm9kZUNoYW5nZWQoYWZmZWN0ZWROb2RlKTsKLQkJCS8vIG5vdyB0cnkgYW5kIGRldGVybWluZSB3aGljaCBvbmVzIHdlcmUgYWRkZWQKLQkJCU5vZGVzRXZlbnQgYWRkZWREVEROb2RlcyA9IG5ldyBOb2Rlc0V2ZW50KCk7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucyA9IGV2ZW50LmdldE5ld1JlZ2lvbnMoKTsKLQkJCWludCBzaXplID0gbmV3UmVnaW9ucy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG5ld1JlZ2lvbnMuZ2V0KGkpOwotCQkJCURURE5vZGUgZGVlcGVzdE5vZGUgPSBhZmZlY3RlZE5vZGUuZ2V0RGVlcGVzdE5vZGUoZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSwgZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbikpOwotCQkJCS8vIEJ1ZyAxMTExMDAgLSBXZSBkbyBub3QgbmVlZCB0byBmaXJlIGEgbm9kZSBhZGRlZCBldmVudAotCQkJCS8vIGZvciB0aGUgYWZmZWN0ZWROb2RlIGJlY2F1c2UgdGhhdCBpcyBhbHJlYWR5IGhhbmRsZWQgYnkKLQkJCQkvLyB0aGUgbm9kZSBjaGFuZ2VkIGV2ZW50IGFib3ZlCi0JCQkJaWYgKGRlZXBlc3ROb2RlICE9IGFmZmVjdGVkTm9kZSAmJiAhYWRkZWREVEROb2Rlcy5nZXROb2RlcygpLmNvbnRhaW5zKGRlZXBlc3ROb2RlKSkgewotCQkJCQlhZGRlZERURE5vZGVzLmFkZChkZWVwZXN0Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFkZGVkRFRETm9kZXMuZ2V0Tm9kZXMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJbm90aWZ5Tm9kZXNBZGRlZChhZGRlZERURE5vZGVzKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURUREZpbGVMaXN0ZW5lcihJRFRERmlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCW1vZGVsTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm9kZXMoTGlzdCBub2RlcykgewotCQlnZXROb2RlcygpLnJlbW92ZUFsbChub2Rlcyk7Ci0JCS8qCi0JCSAqIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJICogcmVtb3ZlQ2hpbGQoKERURE5vZGUpbm9kZXMuZ2V0KGkpKTsgfSAvLyBlbmQgb2YgZm9yICgpCi0JCSAqLwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFRETm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVEROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYTVjN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVEROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuVGV4dFJlZ2lvbkxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIERURE5vZGUgZXh0ZW5kcyBOb2RlQ29udGFpbmVyIGltcGxlbWVudHMgSW5kZXhlZFJlZ2lvbiB7Ci0KLQkvLyB0aGVzZSBhcmUgY2hhcmFjdGVyb2Zmc2V0cwotCXByb3RlY3RlZCBEVERGaWxlIGR0ZEZpbGU7Ci0KLQkvLyBmbGF0IG5vZGUgdGhhdCBjb250YWlucyB0aGlzIG5vZGUKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZTsKLQotCXByb3RlY3RlZCBUZXh0UmVnaW9uTGlzdEltcGwgcmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoKTsKLQotCXByb3RlY3RlZCBUZXh0UmVnaW9uTGlzdEltcGwgd2hpdGVzcGFjZSA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoKTsKLQotCXB1YmxpYyBEVEROb2RlKERUREZpbGUgZHRkRmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQl0aGlzLmR0ZEZpbGUgPSBkdGRGaWxlOwotCQl0aGlzLmZsYXROb2RlID0gZmxhdE5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQkvKgotCQkgKiBpZiAoc3RhcnRSZWdpb24gPT0gbnVsbCkgeyBzdGFydFJlZ2lvbiA9IHJlZ2lvbjsgfSBlbmRSZWdpb24gPQotCQkgKiByZWdpb247Ci0JCSAqLwotCQlyZWdpb25zLmFkZChyZWdpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFdoaXRlc3BhY2VSZWdpb24oSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXdoaXRlc3BhY2UuYWRkKHJlZ2lvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIGxhYmVsKSB7Ci0JCWdldERUREZpbGUoKS5nZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHJlcXVlc3RvciwgbGFiZWwpOwotCX0KLQotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXBlc3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHRlc3RQb3NpdGlvbikgewotCQlyZXR1cm4gY29udGFpbnNSYW5nZSh0ZXN0UG9zaXRpb24sIHRlc3RQb3NpdGlvbik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KCkgPD0gc3RhcnQgJiYgZW5kIDw9IGdldEVuZE9mZnNldCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZShEVEROb2RlIGNoaWxkKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRFREX05PREVfREVMRVRFKTsgLy8kTk9OLU5MUy0xJAotCQlkZWxldGUodGhpcywgY2hpbGQpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlKE9iamVjdCByZXF1ZXN0b3IsIERURE5vZGUgY2hpbGQpIHsKLQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBjaGlsZC5nZXRTdGFydE9mZnNldCgpLCBjaGlsZC5nZXRGdWxsTm9kZUxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RvcikgewotCQlnZXREVERGaWxlKCkuZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcocmVxdWVzdG9yKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbkxpc3QoKS50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Q2hpbGRyZW5MaXN0KCkgewotCQlOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJfQotCQkJcmV0dXJuIGNoaWxkcmVuOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRFRETm9kZSBnZXREZWVwZXN0Tm9kZShpbnQgb2Zmc2V0KSB7Ci0JCWlmIChjb250YWlucyhvZmZzZXQpKSB7Ci0JCQkvLyBub3cgc2VlIGlmIGEgY2hpbGQgY29udGFpbnMgdGhpcyBvZmZzZXQKLQkJCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlEVEROb2RlIGNoaWxkID0gKERURE5vZGUpIGNoaWxkcmVuW2ldOwotCQkJCURURE5vZGUgZGVlcGVzdCA9IGNoaWxkLmdldERlZXBlc3ROb2RlKG9mZnNldCk7Ci0JCQkJaWYgKGRlZXBlc3QgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZGVlcGVzdDsKLQkJCQl9Ci0JCQl9IC8vIGVuZCBvZiBmb3IgKCkKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBEVEROb2RlIGdldERlZXBlc3ROb2RlKGludCBzdGFydCwgaW50IGVuZCkgewotCQlpZiAoY29udGFpbnNSYW5nZShzdGFydCwgZW5kKSkgewotCQkJLy8gbm93IHNlZSBpZiBhIGNoaWxkIGNvbnRhaW5zIHRoaXMgb2Zmc2V0Ci0JCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRFRETm9kZSBjaGlsZCA9IChEVEROb2RlKSBjaGlsZHJlbltpXTsKLQkJCQlEVEROb2RlIGRlZXBlc3QgPSBjaGlsZC5nZXREZWVwZXN0Tm9kZShzdGFydCwgZW5kKTsKLQkJCQlpZiAoZGVlcGVzdCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBkZWVwZXN0OwotCQkJCX0KLQkJCX0gLy8gZW5kIG9mIGZvciAoKQotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLQkJcmV0dXJuIGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoZ2V0RW5kUmVnaW9uKCkpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRFbmRSZWdpb24oKSB7Ci0JCXJldHVybiByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOy8vIGVuZFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRmFjdG9yeVJlZ2lzdHJ5IGdldEZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJRFRETW9kZWxJbXBsIG1vZGVsID0gZHRkRmlsZS5nZXREVERNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJRmFjdG9yeVJlZ2lzdHJ5IHJlZyA9IG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQkJaWYgKHJlZyAhPSBudWxsKQotCQkJCXJldHVybiByZWc7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXRGdWxsTm9kZUxlbmd0aCgpIHsKLQkJcmV0dXJuIGdldFdoaXRlc3BhY2VFbmRPZmZzZXQoKSAtIGdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsTm9kZVRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0Tm9kZVRleHQoKTsKLQkJaWYgKHdoaXRlc3BhY2Uuc2l6ZSgpID4gMCkgewotCQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IG5ldyBSZWdpb25JdGVyYXRvcih3aGl0ZXNwYWNlKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCXRleHQgKz0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChyZWdpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCWFic3RyYWN0IHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TmFtZVJlZ2lvbigpIHsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5OQU1FKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyByZXR1cm4gdGhlIGZpcnN0IHRva2VuIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCB0b2tlbiB0eXBlCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5leHRSZWdpb24oUmVnaW9uSXRlcmF0b3IgaXRlciwgU3RyaW5nIHR5cGUpIHsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyh0eXBlKSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXROb2RlTGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0RW5kT2Zmc2V0KCkgLSBnZXRTdGFydE9mZnNldCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlVGV4dCgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJc2IuYXBwZW5kKGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocmVnaW9uKSk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KGdldFN0YXJ0UmVnaW9uKCkpOwotCX0KLQotCS8vIHByaXZhdGUgUmVnaW9uIHN0YXJ0UmVnaW9uLGVuZFJlZ2lvbjsKLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0U3RhcnRSZWdpb24oKSB7Ci0JCXJldHVybiByZWdpb25zLmdldCgwKTsKLQkJLy8gcmV0dXJuIHN0YXJ0UmVnaW9uOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZmxhdE5vZGUuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBmbGF0Tm9kZS4KLQkgKiAKLQkgKiBJU1NVRTpuYW1lZCBjaGFuZ2VkIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZAotCSAqIHN1cGVyIGNsYXNzIG1ldGhvZCwgYnV0IHNob3VsZCByZS10aGluayBpZiB0aGlzIGlzIGNvcnJlY3QgdGVjaG5pcXVlLgotCSAqIFBlcmhhcHMgZ2V0Rmlyc3RSZWdpb24/Ci0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZmxhdE5vZGU7Ci0JfQotCi0JLy8gcmV0dXJuIGVuZCBvZmZzZXQgaW5jbHVkaW5nIHdoaXRlc3BhY2UKLQkvLyBvciBqdXN0IHRoZSBlbmQgb2Zmc2V0IGlmIHRoZXJlIGlzIG5vIHdoaXRlc3BhY2UKLQlwdWJsaWMgaW50IGdldFdoaXRlc3BhY2VFbmRPZmZzZXQoKSB7Ci0JCWlmICh3aGl0ZXNwYWNlLnNpemUoKSA+IDApIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHdoaXRlc3BhY2UuZ2V0KHdoaXRlc3BhY2Uuc2l6ZSgpIC0gMSk7Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzVHJhaWxpbmdXaGl0ZXNwYWNlKCkgewotCQlyZXR1cm4gd2hpdGVzcGFjZS5zaXplKCkgPiAwOwotCX0KLQotCXB1YmxpYyBSZWdpb25JdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGUgcmVnaW9uIGl0ZXIgIiArIHRoaXMuZ2V0Q2xhc3MoKSArICIgd2l0aAotCQkvLyBzdGFydCAsIGVuZCA9ICIgKyBnZXRTdGFydE9mZnNldCgpICsgIiwgIiArZ2V0RW5kT2Zmc2V0KCkpOwotCQlyZXR1cm4gbmV3IFJlZ2lvbkl0ZXJhdG9yKHJlZ2lvbnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlcGxhY2VUZXh0KE9iamVjdCByZXF1ZXN0b3IsIGludCBzdGFydCwgaW50IGxlbmd0aCwgU3RyaW5nIG5ld1RleHQpIHsKLQkJZ2V0RFRERmlsZSgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnQsIGxlbmd0aCwgbmV3VGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZVJlZ2lvbnMoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgbmFtZSkgewotCQlpZiAoIWdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJLy8gbmFtZVRva2VuLnVwZGF0ZVRleHQobmFtZSk7Ci0JCQkJZ2V0RFRERmlsZSgpLmdldERURE1vZGVsKCkuZ2V0UmVmZXJlbmNlVXBkYXRlcigpLm5hbWVBYm91dFRvQ2hhbmdlKHJlcXVlc3RvciwgdGhpcywgbmFtZSk7Ci0JCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKSwgbmFtZVJlZ2lvbi5nZXRMZW5ndGgoKSwgbmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRFREX05PREVfTkFNRV9DSEcpOyAvLyROT04tTkxTLTEkCi0JCXNldE5hbWUodGhpcywgbmFtZSk7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGZsYXROb2RlLgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZmxhdE5vZGUuIElTU1VFOm5hbWVkIGNoYW5nZWQgbm90IHRvIGJlCi0JICogICAgICAgICAgICBjb25mdXNlZCB3aXRoIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBzdXBlciBjbGFzcyBtZXRob2QsCi0JICogICAgICAgICAgICBidXQgc2hvdWxkIHJlLXRoaW5rIGlmIHRoaXMgaXMgY29ycmVjdCB0ZWNobmlxdWUKLQkgKi8KLQl2b2lkIHNldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHYpIHsKLQkJdGhpcy5mbGF0Tm9kZSA9IHY7Ci0JfQotCi0JLy8gc2tpcHMgcGFzdCBuZXh0IG5hbWUgdG9rZW4gaW4gdGhlIGl0ZXJhdG9yCi0JcHJvdGVjdGVkIHZvaWQgc2tpcFBhc3ROYW1lKFJlZ2lvbkl0ZXJhdG9yIGl0ZXIpIHsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuTkFNRSkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoamF2YS5sYW5nLlN0cmluZyBmZWF0dXJlLCBqYXZhLmxhbmcuU3RyaW5nIHZlcnNpb24pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERSZXNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzZkYjliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFREUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLQotcHVibGljIGludGVyZmFjZSBEVERSZXNvdXJjZSB7Ci0JLy8gRW51bWVyYXRpb24gQ29uc3RhbnRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5ZSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2FueS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFTElTVElDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGVfbGlzdC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVElDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9jb21tZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERUREZJTEVJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvRFRERmlsZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVElDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UUkVGSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L2VsZW1lbnRfcmVmLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9lbXB0eWNvbnRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWVJFRkVSRU5DRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHlfcmVmZXJlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTERSX0FUVExJU1QgPSAiaWNvbnMvZnVsbC9vYmoxNi9mb2xkZXJfYXR0bGlzdF9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMRFJfQ09NTSA9ICJpY29ucy9mdWxsL29iajE2L2ZvbGRlcl9jb21tZW50c19vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxEUl9FTCA9ICJpY29ucy9mdWxsL29iajE2L2ZsZHJfZWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMRFJfRU5UID0gImljb25zL2Z1bGwvb2JqMTYvZmxkcl9lbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMRFJfTk9UID0gImljb25zL2Z1bGwvb2JqMTYvZmxkcl9ub3QuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMRFJfVU5SRUMgPSAiaWNvbnMvZnVsbC9vYmoxNi9mbGRyX3VucmVjLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV0hUTUxGT1JNID0gImljb25zL2Z1bGwvb2JqMTYvZ2VuaHRtZm9ybV93aXouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L25vdGF0aW9uLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORUNIT0lDRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9vbmVjaG9pY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29uZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FT1JNT1JFQ0hPSUNFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29uZW9ybW9yZWNob2ljZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FT1JNT1JFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29uZW9ybW9yZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FT1JNT1JFU0VRVUVOQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3Jlc2VxdWVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FU0VRVUVOQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvb25lc2VxdWVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTkFMQ0hPSUNFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29wdGlvbmFsY2hvaWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05BTElDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OQUxTRVFVRU5DRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbHNlcXVlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0RBVEFJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvdHh0ZXh0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTlJFQ09HTklaRURJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvdW5yZWNvZ25pemVkX2NvbnRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpFUk9PUk1PUkVDSE9JQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZWNob2ljZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWkVST09STU9SRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3JlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaRVJPT1JNT1JFU0VRVUVOQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZXNlcXVlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMTAzMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBFbGVtZW50IGV4dGVuZHMgTmFtZWRUb3BMZXZlbE5vZGUgewotCi0JTGlzdCBhdHRMaXN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCUxpc3QgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBDTU5vZGUgZkNvbnRlbnRNb2RlbDsKLQotCXB1YmxpYyBFbGVtZW50KERUREZpbGUgZHRkRmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihkdGRGaWxlLCBmbGF0Tm9kZSwgRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0VMRU1FTlRfQUREX0FUVFIpOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgYXR0TGlzdHMgPSBnZXRBdHRyaWJ1dGVMaXN0cygpOwotCQlpZiAoYXR0TGlzdHMuc2l6ZSgpID09IDApIHsKLQkJCWdldERUREZpbGUoKS5jcmVhdGVBdHRyaWJ1dGVMaXN0KHRoaXMsIGdldE5hbWUoKSwgdHJ1ZSk7Ci0JCQlhdHRMaXN0cyA9IGdldEF0dHJpYnV0ZUxpc3RzKCk7Ci0JCX0KLQkJaWYgKGF0dExpc3RzLnNpemUoKSA+IDApIHsKLQkJCUF0dHJpYnV0ZUxpc3QgYXR0TGlzdCA9IChBdHRyaWJ1dGVMaXN0KSBhdHRMaXN0cy5nZXQoYXR0TGlzdHMuc2l6ZSgpIC0gMSk7Ci0JCQlhdHRMaXN0LmFkZEF0dHJpYnV0ZShuYW1lKTsKLQkJfQotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ2hpbGQoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRUxFTUVOVF9BRERfQ0hJTEQpOyAvLyROT04tTkxTLTEkCi0JCWFkZENvbnRlbnQodGhpcywgIiBFTVBUWSIpOyAvLyROT04tTkxTLTEkCi0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZW50KE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyBjb250ZW50KSB7Ci0JCUlUZXh0UmVnaW9uIHdoaXRlc3BhY2UgPSBnZXRXaGl0ZXNwYWNlQWZ0ZXJOYW1lKCk7Ci0JCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSAwOwotCQlpZiAod2hpdGVzcGFjZSAhPSBudWxsKSB7Ci0JCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHdoaXRlc3BhY2UpOwotCQkJbGVuZ3RoID0gd2hpdGVzcGFjZS5nZXRMZW5ndGgoKSA+PSAyID8gMSA6IDA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gZ2V0TmFtZVJlZ2lvbigpOwotCQkJaWYgKG5hbWVSZWdpb24gIT0gbnVsbCkgewotCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5hbWVSZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSVRleHRSZWdpb24gZWxlbWVudFRhZyA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpOwotCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGVsZW1lbnRUYWcpOwotCQkJfQotCQl9Ci0JCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIGxlbmd0aCwgY29udGVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkR3JvdXAoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRUxFTUVOVF9BRERfR1JQKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRDb250ZW50KHRoaXMsICIgKCkiKTsgLy8kTk9OLU5MUy0xJAotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlyZXR1cm4gbmV3IEVsZW1lbnQoZHRkRmlsZSwgZmxhdE5vZGUpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEF0dHJpYnV0ZUxpc3RzKCkgewotCQlhdHRMaXN0TGlzdC5jbGVhcigpOwotCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBnZXROYW1lKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBkdGRGaWxlLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QgJiYgbm9kZS5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotCQkJCWF0dExpc3RMaXN0LmFkZChub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXR0TGlzdExpc3Q7Ci0JfQotCi0KLQotCXB1YmxpYyBDTU5vZGUgZ2V0Q29udGVudE1vZGVsKCkgewotCQkvLyBPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCkKLQkJcmV0dXJuIChDTU5vZGUpIGdldEZpcnN0Q2hpbGQoKTsvLyBjb250ZW50TW9kZWw7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RWxlbWVudEF0dHJpYnV0ZXMoKSB7Ci0JCWF0dHJpYnV0ZXMuY2xlYXIoKTsKLQkJSXRlcmF0b3IgYXR0TGlzdHMgPSBnZXRBdHRyaWJ1dGVMaXN0cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChhdHRMaXN0cy5oYXNOZXh0KCkpIHsKLQkJCUF0dHJpYnV0ZUxpc3QgYXR0TGlzdCA9IChBdHRyaWJ1dGVMaXN0KSBhdHRMaXN0cy5uZXh0KCk7Ci0KLQkJCU9iamVjdFtdIGNoaWxkcmVuID0gYXR0TGlzdC5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCWF0dHJpYnV0ZXMuYWRkKGNoaWxkcmVuW2ldKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRUxFTUVOVElDT04pOwotCX0KLQotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIE5vZGUuRUxFTUVOVF9OT0RFOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlcGxhY2VDb250ZW50TW9kZWwoT2JqZWN0IHJlcXVlc3RvciwgQ01Ob2RlIG5vZGUpIHsKLQkJcmVwbGFjZUNvbnRlbnRNb2RlbChyZXF1ZXN0b3IsIG5vZGUuZ2V0Tm9kZVRleHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVwbGFjZUNvbnRlbnRNb2RlbChPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgbm9kZVRleHQpIHsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSAwOwotCQlDTU5vZGUgY29udGVudE1vZGVsID0gZ2V0Q29udGVudE1vZGVsKCk7Ci0JCWlmIChjb250ZW50TW9kZWwgIT0gbnVsbCkgewotCQkJb2Zmc2V0ID0gY29udGVudE1vZGVsLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlsZW5ndGggPSBjb250ZW50TW9kZWwuZ2V0V2hpdGVzcGFjZUVuZE9mZnNldCgpIC0gb2Zmc2V0OwotCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBvZmZzZXQsIGxlbmd0aCwgbm9kZVRleHQpOwotCQl9Ci0JCWVsc2UgewotCQkJYWRkQ29udGVudChyZXF1ZXN0b3IsIG5vZGVUZXh0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlc29sdmVSZWdpb25zKCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImVsZW1lbnQgbm9kZSBzdHJlYW0gPSAiICsKLQkJLy8gdG9rZW5TdHJlYW0uZ2V0U3RyaW5nKCkpOwotCQlmQ29udGVudE1vZGVsID0gbnVsbDsKLQkJcmVtb3ZlQ2hpbGROb2RlcygpOwotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQotCQlpZiAoZ2V0TmFtZVJlZ2lvbigpICE9IG51bGwpIHsKLQkJCS8vIHdlIHNraXAgcGFzdCB0aGUgbmFtZSB0b2tlbiBpcyBvdXIgbmFtZQotCQkJc2tpcFBhc3ROYW1lKGl0ZXIpOwotCQl9Ci0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0KLQkJCWlmIChmQ29udGVudE1vZGVsID09IG51bGwpIHsKLQkJCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLk5BTUUpKSB7Ci0JCQkJCWZDb250ZW50TW9kZWwgPSBuZXcgQ01CYXNpY05vZGUoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSkpIHsKLQkJCQkJZkNvbnRlbnRNb2RlbCA9IG5ldyBDTUJhc2ljTm9kZShnZXREVERGaWxlKCksIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pKSB7Ci0JCQkJCWZDb250ZW50TW9kZWwgPSBuZXcgQ01Hcm91cE5vZGUoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoZkNvbnRlbnRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJaWYgKCFjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRU5EX1RBRykpIHsKLQkJCQkJLy8gY29udGVudCBtb2RlbCBnZXRzIGFsbCByZWdpb25zIGV4Y2VwdCBmb3IgdGhlICc+JwotCQkJCQlmQ29udGVudE1vZGVsLmFkZFJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGlmIGl0IGlzIGVxdWFsIHRvIHRoZSBlbmQgdGFnLCB0aGVuIGRvbid0IGFkZCBhbnltb3JlCi0JCQkJCS8vIHJlZ2lvbnMKLQkJCQkJLy8gZm9yIHRoZSBjb250ZW50IG1vZGVsCi0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJfQotCi0JCX0KLQkJaWYgKGZDb250ZW50TW9kZWwgIT0gbnVsbCkgewotCQkJYXBwZW5kQ2hpbGQoZkNvbnRlbnRNb2RlbCk7Ci0JCQkvLyB0aGlzIGlzIHRoZSByb290IGVsZW1lbnQgY29udGVudCBzbyBzZXQgaXQgdHJ1ZQotCQkJZkNvbnRlbnRNb2RlbC5zZXRSb290RWxlbWVudENvbnRlbnQodHJ1ZSk7Ci0JCQkvLyBub3cgdGVsbCB0aGUgY29udGVudCBtb2RlbCB0byByZXNvbHZlIGl0J3MgcmVnaW9ucwotCQkJZkNvbnRlbnRNb2RlbC5yZXNvbHZlUmVnaW9ucygpOwotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50TW9kZWwoQ01Ob2RlIGNvbnRlbnRNb2RlbCkgewotCQl0aGlzLmZDb250ZW50TW9kZWwgPSBjb250ZW50TW9kZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9FbnRpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZjdjM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9FbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vLyBleHRlcm5hbCBub2RlIGNvbnRhaW5zIGNvZGUgdG8gaGVscCBzZXQgYW5kIGdldCBwdWJsaWMgaWRzCi1wdWJsaWMgY2xhc3MgRW50aXR5IGV4dGVuZHMgRXh0ZXJuYWxOb2RlIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzZXRFeHRlcm5hbEVudGl0eSA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX1NFVF9FWFRfRU5USVRZOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNldEdlbmVyYWxFbnRpdHkgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0VOVElUWV9TRVRfR0VORVJBTF9FTlRJVFk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2V0SW50ZXJuYWxFbnRpdHkgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0VOVElUWV9TRVRfSU5UX0VOVElUWTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNldFBhcmFtZXRlckVudGl0eSA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX1NFVF9QQVJNX0VOVElUWTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEVudGl0eShEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUsIERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5FTlRJVFlJQ09OKTsKLQl9Ci0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygbm90YXRpb25OYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygbm90YXRpb25OYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm90YXRpb25OYW1lKCkgewotCQlJVGV4dFJlZ2lvbiBuZGF0YVJlZ2lvbiA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuTkRBVEFfVkFMVUUpOwotCQlpZiAobmRhdGFSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQobmRhdGFSZWdpb24pOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRQZXJjZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5QRVJDRU5UKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJaWYgKCFpc0V4dGVybmFsRW50aXR5KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcmF0b3IoKSk7Ci0JCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiBnZXRWYWx1ZUZyb21RdW90ZWRSZWdpb24odmFsdWVSZWdpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZXh0ZXJuYWxFbnRpdHkuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBleHRlcm5hbEVudGl0eS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsRW50aXR5KCkgewotCQlyZXR1cm4gZ2V0UHVibGljS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKSAhPSBudWxsIHx8IGdldFN5c3RlbUtleXdvcmRSZWdpb24oaXRlcmF0b3IoKSkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGlzUGFyYW1ldGVyRW50aXR5LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgaXNQYXJhbWV0ZXJFbnRpdHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJFbnRpdHkoKSB7Ci0JCXJldHVybiBnZXRQZXJjZW50UmVnaW9uKCkgIT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTkRhdGEoT2JqZWN0IHJlcXVlc3RvcikgewotCQlJVGV4dFJlZ2lvbiBuZGF0YVJlZ2lvbiA9IG51bGw7Ci0KLQkJLy8gc2VlIGlmIHdlIGhhdmUgYW4gTkRBVEEga2V5d29yZAotCQluZGF0YVJlZ2lvbiA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuTkRBVEFfS0VZV09SRCk7Ci0JCWludCBzdGFydE9mZnNldCA9IDAsIGVuZE9mZnNldCA9IDA7Ci0JCWlmIChuZGF0YVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KG5kYXRhUmVnaW9uKTsKLQkJCWVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuZGF0YVJlZ2lvbik7Ci0JCX0KLQkJSVRleHRSZWdpb24gdmFsdWUgPSBnZXROZXh0UmVnaW9uKGl0ZXJhdG9yKCksIERURFJlZ2lvblR5cGVzLk5EQVRBX1ZBTFVFKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCWlmIChzdGFydE9mZnNldCA9PSAwKSB7Ci0JCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCh2YWx1ZSk7Ci0JCQl9Ci0JCQllbmRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQodmFsdWUpOwotCQl9Ci0JCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGV4dGVybmFsRW50aXR5LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZXh0ZXJuYWxFbnRpdHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0ZXJuYWxFbnRpdHkoYm9vbGVhbiBpc0V4dGVybmFsRW50aXR5KSB7Ci0JCWlmIChpc0V4dGVybmFsRW50aXR5KCkgIT0gaXNFeHRlcm5hbEVudGl0eSkgewotCQkJLy8gZXh0ZXJuYWxFbnRpdHkgPSB2OwotCQkJYmVnaW5SZWNvcmRpbmcodGhpcywgaXNFeHRlcm5hbEVudGl0eSA/IHNldEV4dGVybmFsRW50aXR5IDogc2V0SW50ZXJuYWxFbnRpdHkpOwotCQkJaWYgKGlzRXh0ZXJuYWxFbnRpdHkpIHsKLQkJCQkvLyB3ZSBuZWVkIHRvIGdldCByaWQgb2YgdGhlIHZhbHVlIGxpdGVyYWwKLQkJCQlJVGV4dFJlZ2lvbiBxdW90ZSA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwpOwotCQkJCWlmIChxdW90ZSA9PSBudWxsKSB7Ci0JCQkJCXF1b3RlID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCk7Ci0JCQkJfQotCQkJCWlmIChxdW90ZSAhPSBudWxsKSB7Ci0JCQkJCXJlcGxhY2VUZXh0KHRoaXMsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHF1b3RlKSwgcXVvdGUuZ2V0TGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlzZXRTeXN0ZW1JRCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHdlIG5lZWQgdG8gZ2V0IHJpZCBvZiB0ZXh0IGJldHdlZW4gZW5kIG9mIG5hbWUgcmVnaW9uIGFuZAotCQkJCS8vIHRoZSBsYXN0IGRvdWJsZSBxdW90ZWQgbGl0ZXJhbAotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCUlUZXh0UmVnaW9uIGtleXdvcmQgPSBnZXRTeXN0ZW1LZXl3b3JkUmVnaW9uKGl0ZXIpOwotCQkJCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCQkJaW50IGxlbmd0aCA9IDA7Ci0JCQkJaWYgKGtleXdvcmQgPT0gbnVsbCkgewotCQkJCQkvLyByZXNldCB0aGUgaXRlcmF0b3IKLQkJCQkJaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCQkJCWtleXdvcmQgPSBnZXRQdWJsaWNLZXl3b3JkUmVnaW9uKGl0ZXIpOwotCQkJCX0KLQkJCQlpZiAoa2V5d29yZCAhPSBudWxsKSB7Ci0JCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoa2V5d29yZCk7Ci0JCQkJCS8vIHN0YXJ0IHdpdGggYSBsZW5ndGgganVzdCBlcXVhbCB0byB0aGUga2V5d29yZCBmb3Igbm93Ci0JCQkJCWxlbmd0aCA9IGtleXdvcmQuZ2V0TGVuZ3RoKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyByZXNldCB0aGUgaXRlcmF0b3Igc2luY2Ugd2UgZGlkbid0IGZpbmQgdGhlIGtleXdvcmQKLQkJCQkJaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCQkJCS8vIGp1c3QgZ28gZnJvbSBhZnRlciB0aGUgbmFtZQotCQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChnZXROYW1lUmVnaW9uKCkpOwotCQkJCX0KLQotCQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgdGhlIHN0YXJ0LCBsb29rIGZvciB0aGUgZW5kCi0JCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IG51bGw7Ci0KLQkJCQlpZiAobGFzdFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCS8vIHRoZW4gbG9vayBmb3IgbGFzdCBxdW90ZWQgbGl0ZXJhbAotCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCUlUZXh0UmVnaW9uIGxpdGVyYWwgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyKTsKLQkJCQkJCWlmIChsaXRlcmFsICE9IG51bGwpIHsKLQkJCQkJCQlsYXN0UmVnaW9uID0gbGl0ZXJhbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChsYXN0UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJbGVuZ3RoID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGxhc3RSZWdpb24pIC0gc3RhcnRPZmZzZXQ7Ci0JCQkJfQotCQkJCXJlcGxhY2VUZXh0KHRoaXMsIHN0YXJ0T2Zmc2V0LCBsZW5ndGgsICJcIlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZW1vdmVORGF0YSh0aGlzKTsKLQkJCX0KLQkJCWVuZFJlY29yZGluZyh0aGlzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vdGF0aW9uTmFtZShPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgbmV3Tm90YXRpb24pIHsKLQkJaWYgKCFnZXROb3RhdGlvbk5hbWUoKS5lcXVhbHMobmV3Tm90YXRpb24pKSB7Ci0JCQlpZiAoIW5ld05vdGF0aW9uLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIAotCQkJCUlUZXh0UmVnaW9uIG5kYXRhUmVnaW9uID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5OREFUQV9WQUxVRSk7Ci0JCQkJaWYgKG5kYXRhUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChuZGF0YVJlZ2lvbiksIG5kYXRhUmVnaW9uLmdldExlbmd0aCgpLCBuZXdOb3RhdGlvbik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyB0aW1lIHRvIGNyZWF0ZSBvbmUKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCQkJU3RyaW5nIHN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCQlJVGV4dFJlZ2lvbiBuZGF0YUtleXdvcmQgPSBnZXROZXh0UmVnaW9uKGl0ZXIsIERURFJlZ2lvblR5cGVzLk5EQVRBX0tFWVdPUkQpOwotCQkJCQlpZiAobmRhdGFLZXl3b3JkID09IG51bGwpIHsKLQkJCQkJCS8vIHdlJ2xsIG5lZWQgdG8gY3JlYXRlIG9uZSBhZnRlciB0aGUgbGFzdCBxdW90ZWQKLQkJCQkJCS8vIGxpdGVyYWwKLQkJCQkJCS8vIFJlc2V0IGl0ZXJhdG9yCi0JCQkJCQlzdHJpbmcgKz0gIiBOREFUQSAiOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpdGVyID0gaXRlcmF0b3IoKTsKLQkJCQkJCUlUZXh0UmVnaW9uIGxhc3RRdW90ZWRMaXRlcmFsID0gbnVsbDsKLQkJCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJCUlUZXh0UmVnaW9uIGxpdGVyYWwgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyKTsKLQkJCQkJCQlpZiAobGl0ZXJhbCAhPSBudWxsKSB7Ci0JCQkJCQkJCWxhc3RRdW90ZWRMaXRlcmFsID0gbGl0ZXJhbDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobGFzdFF1b3RlZExpdGVyYWwgIT0gbnVsbCkgewotCQkJCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGxhc3RRdW90ZWRMaXRlcmFsKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGNyZWF0ZWQgYWZ0ZXIgdGhlIHN5c3RlbSBvciBwdWJsaWMga2V5d29yZAotCQkJCQkJCUlUZXh0UmVnaW9uIGtleXdvcmQgPSBnZXRQdWJsaWNLZXl3b3JkUmVnaW9uKGl0ZXJhdG9yKCkpOwotCQkJCQkJCWlmIChrZXl3b3JkID09IG51bGwpIHsKLQkJCQkJCQkJa2V5d29yZCA9IGdldFN5c3RlbUtleXdvcmRSZWdpb24oaXRlcmF0b3IoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIHdlIHNob3VsZG4ndCBiZSBudWxsIGhlcmUgc2luY2Ugd2UgY2hlY2sgaWYgd2UKLQkJCQkJCQkvLyB3ZXJlIGV4dGVybmFsIGFscmVhZHkKLQkJCQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChrZXl3b3JkKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmRhdGFLZXl3b3JkKTsKLQkJCQkJfQotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCAwLCBzdHJpbmcgKyBuZXdOb3RhdGlvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gbmVlZCB0byByZW1vdmUgdGhlIG5kYXRhIHN0dWZmCi0JCQkJcmVtb3ZlTkRhdGEocmVxdWVzdG9yKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygbm90YXRpb25OYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuZXdOb3RhdGlvbgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIG5vdGF0aW9uTmFtZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb3RhdGlvbk5hbWUoU3RyaW5nIG5ld05vdGF0aW9uKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsICJOREFUQSAiICsgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9FTlRJVFlfTkRBVEFfQ0hBTkdFKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNldE5vdGF0aW9uTmFtZSh0aGlzLCBuZXdOb3RhdGlvbik7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGlzUGFyYW1ldGVyRW50aXR5LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gaXNQYXJhbWV0ZXJFbnRpdHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyRW50aXR5KGJvb2xlYW4gdikgewotCQlpZiAoaXNQYXJhbWV0ZXJFbnRpdHkoKSAhPSB2KSB7Ci0JCQliZWdpblJlY29yZGluZyh0aGlzLCB2ID8gc2V0UGFyYW1ldGVyRW50aXR5IDogc2V0R2VuZXJhbEVudGl0eSk7Ci0JCQlpZiAodikgewotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCUlUZXh0UmVnaW9uIHN0YXJ0VGFnID0gZ2V0TmV4dFJlZ2lvbihpdGVyLCBEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHKTsKLQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAwLCBsZW5ndGggPSAwOwotCi0JCQkJaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UgJiYgcmVnaW9uLmdldExlbmd0aCgpID4gMSkgewotCQkJCQkJbGVuZ3RoID0gMTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoc3RhcnRUYWcpOwotCQkJCX0KLQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBzdGFydE9mZnNldCwgbGVuZ3RoLCAiICUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIG5vdyBnZXQgcmlkIG9mIGFueSBORGF0YSBzaW5jZSBpdCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlCi0JCQkJLy8gZW50aXR5IGlzIGEgZ2VuZXJhbCBlbnRpdHkgYW5kIG5vdCBhIHBhcmFtZXRlciBlbnRpdHkKLQkJCQlyZW1vdmVORGF0YSh0aGlzKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGdldCByaWQgb2YgcGVyY2VudCByZWdpb24KLQkJCQlJVGV4dFJlZ2lvbiBwZXJjZW50UmVnaW9uID0gZ2V0UGVyY2VudFJlZ2lvbigpOwotCQkJCXJlcGxhY2VUZXh0KHRoaXMsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHBlcmNlbnRSZWdpb24pLCBwZXJjZW50UmVnaW9uLmdldExlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyB2KSB7Ci0JCWlmICghaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQlpZiAoIWdldFZhbHVlKCkuZXF1YWxzKHYpKSB7Ci0JCQkJLy8gdGhlbiBpdCBtYWtlcyBzZW5zZSB0byBjaGFuZ2UgdGhlIHZhbHVlCi0JCQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyYXRvcigpKTsKLQkJCQlTdHJpbmcgcXVvdGVDaGFyID0gdi5pbmRleE9mKCJcIiIpID09IC0xID8gIlwiIiA6ICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKSwgdmFsdWVSZWdpb24uZ2V0TGVuZ3RoKCksIHF1b3RlQ2hhciArIHYgKyBxdW90ZUNoYXIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldE5leHRSZWdpb24oaXRlciwgRFREUmVnaW9uVHlwZXMuTkFNRSk7Ci0JCQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCQkJLy8gY3JlYXRlIGl0IGFmdGVyIHRoZSBwZXJjZW50IGlmIHRoZXJlIGlzIG9uZQotCQkJCQkJcmVnaW9uID0gZ2V0UGVyY2VudFJlZ2lvbigpOwotCQkJCQl9Ci0JCQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCQkJLy8gaWYgc3RpbGwgbnVsbCwgdGhlbiBjcmVhdGUgaXQgYWZ0ZXIgdGhlIGVsZW1lbnQgdGFnCi0JCQkJCQlyZWdpb24gPSBnZXRTdGFydFRhZyhpdGVyYXRvcigpKTsKLQkJCQkJfQotCi0JCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIDAsIHF1b3RlQ2hhciArIHYgKyBxdW90ZUNoYXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2KSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX1ZBTFVFX0NIRyk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VmFsdWUodGhpcywgdik7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRXh0ZXJuYWxOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0V4dGVybmFsTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTNjZWE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRXh0ZXJuYWxOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vLyBiYXNlIGNsYXNzIGZvciBub2RlcyB0aGF0IGNhbiBjb250YWluIGV4dGVybmFsIGNvbnRlbnQKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHRlcm5hbE5vZGUgZXh0ZW5kcyBOYW1lZFRvcExldmVsTm9kZSB7Ci0KLQlTdHJpbmcgcHVibGljSUQ7Ci0KLQlTdHJpbmcgc3lzdGVtSUQ7Ci0KLQlwdWJsaWMgRXh0ZXJuYWxOb2RlKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgU3RyaW5nIHRhZ1R5cGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUsIHRhZ1R5cGUpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROZXh0UXVvdGVkTGl0ZXJhbChSZWdpb25JdGVyYXRvciBpdGVyKSB7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwpIHx8IHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBwdWJsaWNJRC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHB1YmxpY0lELgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSUQoKSB7Ci0JCUlUZXh0UmVnaW9uIHB1YmxpY1ZhbHVlID0gZ2V0UHVibGljVmFsdWVSZWdpb24oKTsKLQkJaWYgKHB1YmxpY1ZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRWYWx1ZUZyb21RdW90ZWRSZWdpb24ocHVibGljVmFsdWUpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRQdWJsaWNLZXl3b3JkUmVnaW9uKFJlZ2lvbkl0ZXJhdG9yIGl0ZXIpIHsKLQkJcmV0dXJuIGdldE5leHRSZWdpb24oaXRlciwgRFREUmVnaW9uVHlwZXMuUFVCTElDX0tFWVdPUkQpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRQdWJsaWNWYWx1ZVJlZ2lvbigpIHsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0KLQkJSVRleHRSZWdpb24gcHVibGljS2V5d29yZCA9IGdldFB1YmxpY0tleXdvcmRSZWdpb24oaXRlcik7Ci0KLQkJaWYgKHB1YmxpY0tleXdvcmQgIT0gbnVsbCAmJiBpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcXVvdGVkTGl0ZXJhbCA9IGdldE5leHRRdW90ZWRMaXRlcmFsKGl0ZXIpOwotCQkJaWYgKHF1b3RlZExpdGVyYWwgIT0gbnVsbCkgewotCQkJCXJldHVybiBxdW90ZWRMaXRlcmFsOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygc3lzdGVtSUQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBzeXN0ZW1JRC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlEKCkgewotCQlJVGV4dFJlZ2lvbiBzeXN0ZW1WYWx1ZSA9IGdldFN5c3RlbVZhbHVlUmVnaW9uKCk7Ci0JCWlmIChzeXN0ZW1WYWx1ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VmFsdWVGcm9tUXVvdGVkUmVnaW9uKHN5c3RlbVZhbHVlKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0U3lzdGVtS2V5d29yZFJlZ2lvbihSZWdpb25JdGVyYXRvciBpdGVyKSB7Ci0JCXJldHVybiBnZXROZXh0UmVnaW9uKGl0ZXIsIERURFJlZ2lvblR5cGVzLlNZU1RFTV9LRVlXT1JEKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0U3lzdGVtVmFsdWVSZWdpb24oKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCi0JCUlUZXh0UmVnaW9uIHN5c3RlbUtleXdvcmQgPSBnZXRTeXN0ZW1LZXl3b3JkUmVnaW9uKGl0ZXIpOwotCQlpZiAoc3lzdGVtS2V5d29yZCAhPSBudWxsICYmIGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBxdW90ZWRMaXRlcmFsID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcik7Ci0JCQlpZiAocXVvdGVkTGl0ZXJhbCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHF1b3RlZExpdGVyYWw7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB0cnkgYW5kIHNlZSBpZiB0aGVyZSBpcyBhIHNlY29uZCBxdW90ZWQgbGl0ZXJhbCBhZnRlciBhIHB1YmxpYwotCQkJLy8ga2V5d29yZAotCQkJaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCQlJVGV4dFJlZ2lvbiBwdWJsaWNLZXl3b3JkID0gZ2V0UHVibGljS2V5d29yZFJlZ2lvbihpdGVyKTsKLQotCQkJaWYgKHB1YmxpY0tleXdvcmQgIT0gbnVsbCAmJiBpdGVyLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHF1b3RlZExpdGVyYWwgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyKTsKLQkJCQlpZiAocXVvdGVkTGl0ZXJhbCAhPSBudWxsICYmIGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCS8vIG5vdyBnZXQgdGhlIHNlY29uZCBxdW90ZWQgbGl0ZXJhbAotCQkJCQlxdW90ZWRMaXRlcmFsID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcik7Ci0JCQkJCWlmIChxdW90ZWRMaXRlcmFsICE9IG51bGwpIHsKLQkJCQkJCS8vIGdvdCBpdCEKLQkJCQkJCXJldHVybiBxdW90ZWRMaXRlcmFsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVGcm9tUXVvdGVkUmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlLmVxdWFscyhEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCkgfHwgdHlwZS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocmVnaW9uKTsKLQkJCXJldHVybiB0ZXh0LnN1YnN0cmluZygxLCB0ZXh0Lmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBwdWJsaWNJRC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHB1YmxpY0lELgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lEKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyB2KSB7Ci0JCWlmICghdi5lcXVhbHMocHVibGljSUQpKSB7Ci0JCQlwdWJsaWNJRCA9IHY7Ci0JCQlJVGV4dFJlZ2lvbiBwdWJsaWNWYWx1ZSA9IGdldFB1YmxpY1ZhbHVlUmVnaW9uKCk7Ci0JCQlJVGV4dFJlZ2lvbiBwdWJsaWNLZXl3b3JkID0gZ2V0UHVibGljS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKTsKLQkJCUlUZXh0UmVnaW9uIHN5c3RlbUtleXdvcmQgPSBnZXRTeXN0ZW1LZXl3b3JkUmVnaW9uKGl0ZXJhdG9yKCkpOwotCQkJSVRleHRSZWdpb24gc3lzdGVtVmFsdWUgPSBnZXRTeXN0ZW1WYWx1ZVJlZ2lvbigpOwotCi0JCQlpZiAodi5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocHVibGljS2V5d29yZCAhPSBudWxsKSB7Ci0JCQkJCS8vIHRpbWUgdG8gZ2V0IHJpZCBvZiB0aGUgcHVibGljIGtleXdvcmQgYW5kIHZhbHVlCi0JCQkJCS8vIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIHN5c3RlbSBvbmUKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocHVibGljS2V5d29yZCk7Ci0JCQkJCVN0cmluZyBuZXdTdHJpbmcgPSAiU1lTVEVNIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoc3lzdGVtVmFsdWUgPT0gbnVsbCkgewotCQkJCQkJbmV3U3RyaW5nICs9ICIgXCJcIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocHVibGljVmFsdWUpIC0gc3RhcnRPZmZzZXQsIG5ld1N0cmluZyk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gaGVyZSB3ZXJlIHNldHRpbmcgYSBub24gZW1wdHkgdmFsdWUKLQkJCQlTdHJpbmcgcXVvdGVDaGFyID0gdi5pbmRleE9mKCJcIiIpID09IC0xID8gIlwiIiA6ICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQlpZiAocHVibGljVmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHB1YmxpY1ZhbHVlKSwgcHVibGljVmFsdWUuZ2V0TGVuZ3RoKCksIHF1b3RlQ2hhciArIHB1YmxpY0lEICsgcXVvdGVDaGFyKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRpbWUgdG8gY3JlYXRlIHN0dWZmCi0JCQkJCWlmIChwdWJsaWNLZXl3b3JkICE9IG51bGwpIHsKLQkJCQkJCS8vIHRoZW4ganVzdCBwdXQgb3VyIG5ldyB2YWx1ZSBhZnRlciB0aGUga2V5d29yZAotCQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocHVibGljS2V5d29yZCksIDAsICIgIiArIHF1b3RlQ2hhciArIHYgKyBxdW90ZUNoYXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyB3ZSBuZWVkIHRoZSBwdWJsaWMga2V5d29yZCBhcyB3ZWxsCi0JCQkJCQlpZiAoc3lzdGVtS2V5d29yZCAhPSBudWxsKSB7Ci0JCQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChzeXN0ZW1LZXl3b3JkKSwgc3lzdGVtS2V5d29yZC5nZXRMZW5ndGgoKSwgIlBVQkxJQyAiICsgcXVvdGVDaGFyICsgdiArIHF1b3RlQ2hhcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmFtZVJlZ2lvbiksIDAsICIgUFVCTElDICIgKyBxdW90ZUNoYXIgKyB2ICsgcXVvdGVDaGFyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHB1YmxpY0lELgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gcHVibGljSUQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSUQoU3RyaW5nIHYpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9FWFRfTk9ERV9QVUJMSUNfSURfQ0hHKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRQdWJsaWNJRCh0aGlzLCB2KTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3lzdGVtSUQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzeXN0ZW1JRC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JRChPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgdikgewotCQlpZiAoIXYuZXF1YWxzKHN5c3RlbUlEKSB8fCAoZ2V0UHVibGljS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKSA9PSBudWxsICYmIGdldFN5c3RlbUtleXdvcmRSZWdpb24oaXRlcmF0b3IoKSkgPT0gbnVsbCkpIHsKLQkJCXN5c3RlbUlEID0gdjsKLQkJCVN0cmluZyBxdW90ZUNoYXIgPSB2LmluZGV4T2YoIlwiIikgPT0gLTEgPyAiXCIiIDogIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJSVRleHRSZWdpb24gc3lzdGVtVmFsdWUgPSBnZXRTeXN0ZW1WYWx1ZVJlZ2lvbigpOwotCQkJaWYgKHN5c3RlbVZhbHVlICE9IG51bGwpIHsKLQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHN5c3RlbVZhbHVlKSwgc3lzdGVtVmFsdWUuZ2V0TGVuZ3RoKCksIHF1b3RlQ2hhciArIHN5c3RlbUlEICsgcXVvdGVDaGFyKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlUZXh0UmVnaW9uIHN5c3RlbUtleXdvcmQgPSBnZXRTeXN0ZW1LZXl3b3JkUmVnaW9uKGl0ZXJhdG9yKCkpOwotCi0JCQkJLy8gdGltZSB0byBjcmVhdGUgc3R1ZmYKLQkJCQlpZiAoc3lzdGVtS2V5d29yZCAhPSBudWxsKSB7Ci0JCQkJCS8vIHRoZW4ganVzdCBwdXQgb3VyIG5ldyB2YWx1ZSBhZnRlciB0aGUga2V5d29yZAotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChzeXN0ZW1LZXl3b3JkKSwgMCwgIiAiICsgcXVvdGVDaGFyICsgdiArIHF1b3RlQ2hhcik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHNlZSBpZiB3ZSBoYXZlIGEgcHVibGljIGtleXdvcmQKLQkJCQkJSVRleHRSZWdpb24gcHVibGljS2V5d29yZCA9IGdldFB1YmxpY0tleXdvcmRSZWdpb24oaXRlcmF0b3IoKSk7Ci0JCQkJCWlmIChwdWJsaWNLZXl3b3JkID09IG51bGwpIHsKLQkJCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0KLQkJCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5hbWVSZWdpb24pLCAwLCAiIFNZU1RFTSAiICsgcXVvdGVDaGFyICsgdiArIHF1b3RlQ2hhcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIHB1dCBpdCBhZnRlciB0aGUgcHVibGljIHZhbHVlIHJlZ2lvbgotCQkJCQkJSVRleHRSZWdpb24gcHVibGljVmFsdWVSZWdpb24gPSBnZXRQdWJsaWNWYWx1ZVJlZ2lvbigpOwotCQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocHVibGljVmFsdWVSZWdpb24pLCAwLCAiICIgKyBxdW90ZUNoYXIgKyB2ICsgcXVvdGVDaGFyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBzeXN0ZW1JRC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHN5c3RlbUlELgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlEKFN0cmluZyB2KSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRVhUX05PREVfU1lTVEVNX0lEX0NIRyk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0U3lzdGVtSUQodGhpcywgdik7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU4ZjQ4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogICAgICAgICAgICBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoCi0JICogICAgICAgICAgICAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCQkJaWYgKGJ1bmRsZSAhPSBudWxsKQotCQkJCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL05hbWVkVG9wTGV2ZWxOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL05hbWVkVG9wTGV2ZWxOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmN2Y1MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9OYW1lZFRvcExldmVsTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLy8gaW50ZXJmYWNlIGZvciBub2RlcyB0aGF0IGNhbiBleGlzdCBhdCB0aGUgdG9wIGxldmVsIGluIGEgZHRkZmlsZQotLy8gZWcuIGVudGl0eSwgbm90YXRpb24sIGVsZW1lbnQsIGNvbW1lbnQsIGF0dGxpc3QsIG9yIHVucmVjb2duaXplZCBzdHVmZiAoaWUKLS8vIDxqdW5rIGRrZmpkbD4KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOYW1lZFRvcExldmVsTm9kZSBleHRlbmRzIFRvcExldmVsTm9kZSB7Ci0KLQlwcml2YXRlIFN0cmluZyB0YWdTdGFydFR5cGU7Ci0KLQlwdWJsaWMgTmFtZWRUb3BMZXZlbE5vZGUoRFRERmlsZSBkdGRGaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBTdHJpbmcgdHlwZSkgewotCQlzdXBlcihkdGRGaWxlLCBmbGF0Tm9kZSk7Ci0JCXRhZ1N0YXJ0VHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5hbWVSZWdpb24oKSB7Ci0JCS8vIG5hbWUgcmVnaW9uIGlzIGxvY2F0ZWQgYWZ0ZXIgdGhlIHdoaXRlc3BhY2UgKHdoaWNoIGlzIGFmdGVyCi0JCS8vIHRoZSBlbGVtZW50dGFnCi0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQlnZXROZXh0UmVnaW9uKGl0ZXIsIHRhZ1N0YXJ0VHlwZSk7Ci0KLQkJaWYgKCFpdGVyLmhhc05leHQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJaWYgKCFyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoIWl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTkFNRSkpIHsKLQkJCXJldHVybiByZWdpb247Ci0JCX0KLQotCQkvLyB3ZSBub3JtYWxseSBzdG9wIGhlcmUsIGJ1dCBmb3IgZW50aXRpZXMsIHdlIGhhdmUgdG8gc2VlIGlmIHdlIGFyZQotCQkvLyBhdCBhICclJy4gaWYgc28sIHdlIHNraXAgdGhhdCBhbmQgZmluZCB0aGUgbmFtZSBhZnRlciB0aGUKLQkJLy8gd2hpdGVzcGFjZSBhZ2FpbgotCQlpZiAodGFnU3RhcnRUeXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcgJiYgcmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuUEVSQ0VOVCkgJiYgaXRlci5oYXNOZXh0KCkpIHsKLQkJCXJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCi0JCQlpZiAoIXJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCWlmICghaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTkFNRSkpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFN0YXJ0VGFnKFJlZ2lvbkl0ZXJhdG9yIGl0ZXIpIHsKLQkJcmV0dXJuIGdldE5leHRSZWdpb24oaXRlciwgdGFnU3RhcnRUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0V2hpdGVzcGFjZUFmdGVyTmFtZSgpIHsKLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGdldE5hbWVSZWdpb24oKTsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCS8vIHNraXAgcGFzdCB0aGUgZWxlbWVudCB0YWcgcmVnaW9uCi0JCWdldE5leHRSZWdpb24oaXRlciwgdGFnU3RhcnRUeXBlKTsKLQkJYm9vbGVhbiBmb3VuZE5hbWUgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmICghZm91bmROYW1lICYmIG5hbWVSZWdpb24gIT0gbnVsbCAmJiByZWdpb24gPT0gbmFtZVJlZ2lvbikgewotCQkJCWZvdW5kTmFtZSA9IHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKSkgewotCQkJCS8vIHRoZXJlIGlzIG5vIG5hbWUgcmVnaW9uIG9yIHdlIGhhdmUgYWxyZWFkeSBwYXNzZWQgaXQKLQkJCQlpZiAobmFtZVJlZ2lvbiA9PSBudWxsIHx8IGZvdW5kTmFtZSkgewotCQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyBuYW1lKSB7Ci0JCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCWlmIChuYW1lUmVnaW9uICE9IG51bGwpIHsKLQkJCXN1cGVyLnNldE5hbWUocmVxdWVzdG9yLCBuYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJSVRleHRSZWdpb24gZWxlbWVudFRhZ1JlZ2lvbiA9IGdldE5leHRSZWdpb24oaXRlciwgdGFnU3RhcnRUeXBlKTsKLQkJCWludCByZXBsYWNlTGVuZ3RoID0gMDsKLQkJCWlmIChpdGVyLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKSkgewotCQkJCQlpZiAocmVnaW9uLmdldExlbmd0aCgpID49IDIpIHsKLQkJCQkJCS8vIHRoZXJlIGFyZSAyIHNwYWNlcyBiZXR3ZWVuICdFTEVNRU5UJyBhbmQgdGhlCi0JCQkJCQkvLyBjb250ZW50Ci0JCQkJCQkvLyBDaGFuZ2UgcmVwbGFjZSBsZW5ndGggdG8gMSBzbyB0aGF0IHRoZSBuZXcgbmFtZSBhbmQKLQkJCQkJCS8vIHRoZSBjb250ZW50IGFyZSBzZXBhcmF0ZWQgYnkgYSBzaW5nbGUgc3BhY2UKLQkJCQkJCXJlcGxhY2VMZW5ndGggPSAxOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBiZWdpblJlY29yZGluZyhyZXF1ZXN0b3IsICJOYW1lIENoYW5nZSIpOwotCQkJU3RyaW5nIG5ld1RleHQgPSAiICIgKyBuYW1lOyAvLyROT04tTkxTLTEkCi0JCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChlbGVtZW50VGFnUmVnaW9uKSwgcmVwbGFjZUxlbmd0aCwgbmV3VGV4dCk7Ci0JCQkvLyBlbmRSZWNvcmRpbmcocmVxdWVzdG9yKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Ob2RlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Ob2RlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQ1YTJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTm9kZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLQotCi1wdWJsaWMgY2xhc3MgTm9kZUxpc3QgewotCXByb3RlY3RlZCBEVERGaWxlIGR0ZEZpbGU7Ci0KLQlBcnJheUxpc3QgbGlzdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIFN0cmluZyBsaXN0VHlwZTsKLQotCXB1YmxpYyBOb2RlTGlzdChEVERGaWxlIGR0ZEZpbGUsIFN0cmluZyB0b2tlblR5cGUpIHsKLQkJbGlzdFR5cGUgPSB0b2tlblR5cGU7Ci0JCXRoaXMuZHRkRmlsZSA9IGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpIHsKLQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRkxEUl9FTCk7Ci0JCX0KLQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5USVRZX1RBRykgewotCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5GTERSX0VOVCk7Ci0JCX0KLQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKSB7Ci0JCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkZMRFJfTk9UKTsKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUKSB7Ci0JCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkZMRFJfQ09NTSk7Ci0JCX0KLQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpIHsKLQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRkxEUl9BVFRMSVNUKTsKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpIHsKLQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRkxEUl9VTlJFQyk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMaXN0VHlwZSgpIHsKLQkJcmV0dXJuIGxpc3RUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHKSB7Ci0JCQlyZXR1cm4gRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9OT0RFX0xJU1RfRUxFTUVOVFM7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHKSB7Ci0JCQlyZXR1cm4gRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9OT0RFX0xJU1RfRU5USVRJRVM7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5OT1RBVElPTl9UQUcpIHsKLQkJCXJldHVybiBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX05PREVfTElTVF9OT1RBVElPTlM7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUKSB7Ci0JCQlyZXR1cm4gRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9OT0RFX0xJU1RfQ09NTUVOVFM7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5BVFRMSVNUX1RBRykgewotCQkJcmV0dXJuIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfTk9ERV9MSVNUX0FUVFJJQlVURVM7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpIHsKLQkJCXJldHVybiBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX05PREVfTElTVF9PVEhFUjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBBcnJheUxpc3QgZ2V0Tm9kZXMoKSB7Ci0JCWxpc3ROb2Rlcy5jbGVhcigpOwotCQlJdGVyYXRvciBpdGVyID0gZHRkRmlsZS5nZXROb2RlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHICYmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSkgewotCQkJCWxpc3ROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5BVFRMSVNUX1RBRyAmJiBub2RlIGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCkgewotCQkJCWxpc3ROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHICYmIG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlsaXN0Tm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHICYmIG5vZGUgaW5zdGFuY2VvZiBOb3RhdGlvbikgewotCQkJCWxpc3ROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUICYmIG5vZGUgaW5zdGFuY2VvZiBDb21tZW50KSB7Ci0JCQkJbGlzdE5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCAmJiBub2RlIGluc3RhbmNlb2YgVW5yZWNvZ25pemVkKSB7Ci0JCQkJbGlzdE5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdE5vZGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTm90YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZhYmQ3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL05vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgTm90YXRpb24gZXh0ZW5kcyBFeHRlcm5hbE5vZGUgewotCi0JcHVibGljIE5vdGF0aW9uKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSwgRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuTk9UQVRJT05JQ09OKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1BhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9QYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwMDUzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1BhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBleHRlbmRzIE5hbWVkVG9wTGV2ZWxOb2RlIHsKLQotCi0KLQlwdWJsaWMgY2xhc3MgU3RhcnRFbmRQYWlyIHsKLQkJcHVibGljIGludCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0OwotCX0KLQotCXByaXZhdGUgRW50aXR5IGNhY2hlZEVudGl0eSA9IG51bGw7Ci0KLQlwdWJsaWMgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSwgRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCk7Ci0JfQotCi0JcHVibGljIEVudGl0eSBnZXRFbnRpdHlPYmplY3QoKSB7Ci0JCWlmIChjYWNoZWRFbnRpdHkgIT0gbnVsbCAmJiAhY2FjaGVkRW50aXR5LmdldE5hbWUoKS5lcXVhbHMoZ2V0UmVmZXJlbmNlZEVudGl0eSgpKSkgewotCQkJLy8gaWYgd2UgaGF2ZSBhIGNhY2hlZCBlbnRpdHksIGJ1dCB0aGUgbmFtZSBkb2VzbnQgbWF0Y2gsCi0JCQkvLyBudWxsIGl0IG5vdywgc28gd2UgcGVyZm9ybSBhIGxvb2t1cAotCQkJY2FjaGVkRW50aXR5ID0gbnVsbDsKLQkJfQotCi0JCWlmIChjYWNoZWRFbnRpdHkgPT0gbnVsbCkgewotCQkJTGlzdCBub2RlcyA9IGdldERUREZpbGUoKS5nZXROb2RlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5zaXplKCk7IGkrKykgewotCQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBub2Rlcy5nZXQoaSk7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIG5vZGU7Ci0JCQkJCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSAmJiBlbnRpdHkuZ2V0TmFtZSgpLmVxdWFscyhnZXRSZWZlcmVuY2VkRW50aXR5KCkpKSB7Ci0JCQkJCQljYWNoZWRFbnRpdHkgPSBlbnRpdHk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZEVudGl0eTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRU5USVRZUkVGRVJFTkNFSUNPTik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXROYW1lKCk7Ci0JCXJldHVybiBnZXROYW1lKCkuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkgLSAxKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0U3RhcnRBbmRFbmRPZmZzZXRGb3JUZXh0KFN0YXJ0RW5kUGFpciBwYWlyKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiBjb21tZW50U3RhcnRUYWcgPSBnZXRTdGFydFRhZyhpdGVyKTsKLQkJSVRleHRSZWdpb24gZW5kQ29tbWVudFRhZyA9IGdldE5leHRSZWdpb24oaXRlciwgRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9FTkQpOwotCQlwYWlyLmVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCgpOwotCQlpZiAoY29tbWVudFN0YXJ0VGFnICE9IG51bGwpIHsKLQkJCXBhaXIuc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoY29tbWVudFN0YXJ0VGFnKTsKLQkJfQotCQlpZiAoZW5kQ29tbWVudFRhZyAhPSBudWxsKSB7Ci0JCQlwYWlyLmVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChlbmRDb21tZW50VGFnKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KCk7Ci0JCWludCBmbGF0Tm9kZVN0YXJ0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJU3RhcnRFbmRQYWlyIHBhaXIgPSBuZXcgU3RhcnRFbmRQYWlyKCk7Ci0JCWdldFN0YXJ0QW5kRW5kT2Zmc2V0Rm9yVGV4dChwYWlyKTsKLQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKHBhaXIuc3RhcnRPZmZzZXQgLSBmbGF0Tm9kZVN0YXJ0LCBwYWlyLmVuZE9mZnNldCAtIGZsYXROb2RlU3RhcnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRFbnRpdHkoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIG5hbWUpIHsKLQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRMZW5ndGgoKSwgIiUiICsgbmFtZSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRFbnRpdHkoU3RyaW5nIG5hbWUpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9QQVJNX0VOVElUWV9SRUZfQ0hHX0VOVElUWV9SRUYpOyAvLyROT04tTkxTLTEkCi0JCXNldFJlZmVyZW5jZWRFbnRpdHkodGhpcywgbmFtZSk7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBuZXdUZXh0KSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfUEFSTV9FTlRJVFlfUkVGX0NPTU1FTlRfQ0hHKTsgLy8kTk9OLU5MUy0xJAotCQlTdGFydEVuZFBhaXIgcGFpciA9IG5ldyBTdGFydEVuZFBhaXIoKTsKLQkJZ2V0U3RhcnRBbmRFbmRPZmZzZXRGb3JUZXh0KHBhaXIpOwotCQlyZXBsYWNlVGV4dCh0aGlzLCBwYWlyLnN0YXJ0T2Zmc2V0LCBwYWlyLmVuZE9mZnNldCAtIHBhaXIuc3RhcnRPZmZzZXQsIG5ld1RleHQpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1RvcExldmVsTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Ub3BMZXZlbE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhjMjdjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1RvcExldmVsTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vLyBpbnRlcmZhY2UgZm9yIG5vZGVzIHRoYXQgY2FuIGV4aXN0IGF0IHRoZSB0b3AgbGV2ZWwgaW4gYSBkdGRmaWxlCi0vLyBlZy4gZW50aXR5LCBub3RhdGlvbiwgZWxlbWVudCwgY29tbWVudCwgYXR0bGlzdCwgb3IgdW5yZWNvZ25pemVkIHN0dWZmIChpZQotLy8gPGp1bmsgZGtmamRsPgotcHVibGljIGFic3RyYWN0IGNsYXNzIFRvcExldmVsTm9kZSBleHRlbmRzIERURE5vZGUgewotCi0JcHJpdmF0ZSBBcnJheUxpc3QgZmxhdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIFRvcExldmVsTm9kZShEVERGaWxlIGR0ZEZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZHRkRmlsZSwgZmxhdE5vZGUpOwotCQlmbGF0Tm9kZXMuYWRkKGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRXaGl0ZXNwYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlmbGF0Tm9kZXMuYWRkKG5vZGUpOwotCX0KLQotCS8vIHNwZWNpYWxpemUgdGhpcyBzbyB3ZSBkZWxldGUgdGhlIG9iamVjdHMgZmxhdCBub2RlIHJhbmdlCi0JLy8gQU5EIGFueSB3aGl0ZXNwYWNlCi0JcHVibGljIHZvaWQgZGVsZXRlKCkgewotCQliZWdpblJlY29yZGluZyhnZXREVERGaWxlKCksIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfVE9QX0xFVkVMX05PREVfREVMRVRFKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGZsYXROb2Rlcy5nZXQoMCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdCA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBmbGF0Tm9kZXMuZ2V0KGZsYXROb2Rlcy5zaXplKCkgLSAxKTsKLQkJaW50IHN0YXJ0T2Zmc2V0ID0gZmlyc3QuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZE9mZnNldCA9IGxhc3QuZ2V0RW5kT2Zmc2V0KCk7Ci0KLQkJcmVwbGFjZVRleHQoZ2V0RFRERmlsZSgpLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsICIiKTsgLy8kTk9OLU5MUy0xJAotCQllbmRSZWNvcmRpbmcoZ2V0RFRERmlsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0RW5kUmVnaW9uKCkgewotCQlpbnQgc2l6ZSA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5zaXplKCk7Ci0JCWlmIChzaXplID4gMCkgewotCQkJcmV0dXJuIGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoc2l6ZSAtIDEpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIGluY2x1ZGVzIHdoYXQgZ2V0dGV4dCBnaXZlcyB1cyBwbHVzIGFueSB3aGl0ZXNwYWNlCi0JLy8gdHJhaWxpbmcgaXQKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBmbGF0Tm9kZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZOb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGl0ZXIubmV4dCgpOwotCQkJc2IuYXBwZW5kKGZOb2RlLmdldFRleHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFN0YXJ0UmVnaW9uKCkgewotCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9ucygpLnNpemUoKSA+IDApIHsKLQkJCXJldHVybiBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDApOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBSZWdpb25JdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGUgcmVnaW9uIGl0ZXIgIiArIHRoaXMuZ2V0Q2xhc3MoKSArICIgd2l0aAotCQkvLyBzdGFydCAsIGVuZCA9ICIgKyBnZXRTdGFydE9mZnNldCgpICsgIiwgIiArZ2V0RW5kT2Zmc2V0KCkpOwotCQlyZXR1cm4gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCBnZXRTdGFydE9mZnNldCgpLCBnZXRFbmRPZmZzZXQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9VbnJlY29nbml6ZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvVW5yZWNvZ25pemVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMzQ4YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9VbnJlY29nbml6ZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgVW5yZWNvZ25pemVkIGV4dGVuZHMgVG9wTGV2ZWxOb2RlIHsKLQotCXB1YmxpYyBVbnJlY29nbml6ZWQoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuVU5SRUNPR05JWkVESUNPTik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgdGV4dCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoKTsKLQkJaWYgKHRleHQubGVuZ3RoKCkgPD0gMzApIHsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIDI5KSArICIuLi4iOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudC9Db250ZW50RGVzY3JpYmVyRm9yRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2NvbnRlbnQvQ29udGVudERlc2NyaWJlckZvckRURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGYxMTBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudC9Db250ZW50RGVzY3JpYmVyRm9yRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5jb250ZW50OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JVGV4dENvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcjsKLQotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZW50RGVzY3JpYmVyRm9yRFREIGltcGxlbWVudHMgSVRleHRDb250ZW50RGVzY3JpYmVyIHsKLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBRdWFsaWZpZWROYW1lW10gU1VQUE9SVEVEX09QVElPTlMgPSB7SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVH07Ci0JcHVibGljIGludCBkZXNjcmliZShJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBkZXNjcmliZShSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCi0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCWVsc2UgewotCQkJY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhjb250ZW50cywgZGVzY3JpcHRpb24pOwotCQkJcmVzdWx0ID0gY29tcHV0ZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBRdWFsaWZpZWROYW1lW10gZ2V0U3VwcG9ydGVkT3B0aW9ucygpIHsKLQotCQlyZXR1cm4gU1VQUE9SVEVEX09QVElPTlM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50cwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGNvbXB1dGVWYWxpZGl0eShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQkvLyBjdXJyZW50bHkgbm8gc3BlY2lmaWMgY2hlY2sgZm9yIHZhbGlkaWx0eQotCQkvLyBiYXNlZCBvbiBjb250ZW50cy4KLQkJcmV0dXJuIElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZVZhbGlkaXR5KFJlYWRlciByZWFkZXIpIHsKLQkJLy8gY3VycmVudGx5IG5vIHNwZWNpZmljIGNoZWNrIGZvciB2YWxpZGlsdHkKLQkJLy8gYmFzZWQgb24gY29udGVudHMuCi0JCXJldHVybiBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCX0KLQotCS8vIHNhbWUgcnVsZXMgYXMgZm9yIFhNTAotCXByaXZhdGUgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGdldERldGVjdG9yKCkgewotCQkJcmV0dXJuIG5ldyBYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGV0ZWN0b3IKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNhbGN1bGF0aW9ucyhJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIG5vdGU6IGlmIHdlJ3JlIGFza2VkIGZvciBvbmUsIHdlIHNldCB0aGVtIGFsbC4gSSBuZWVkIHRvIGJlIHN1cmUgaWYKLQkJLy8gY2FsbGVkCi0JCS8vIG11bGl0aXBsZSB0aW1lcyAob25lIGZvciBlYWNoLCBzYXkpIHRoYXQgd2UgZG9uJ3Qgd2FzdGUgdGltZQotCQkvLyBwcm9jZXNzaW5nIHNhbWUKLQkJLy8gY29udGVudCBhZ2Fpbi4KLQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9ICgoWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcikuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCS8vIFRPRE86IEkgbmVlZCB0byB2ZXJpZnkgdG8gc2VlIGlmIHRoaXMgQk9NIHdvcmsgaXMgYWx3YXlzIGRvbmUKLQkJLy8gYnkgdGV4dCB0eXBlLgotCQlPYmplY3QgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrID0gZW5jb2RpbmdNZW1lbnRvLmdldFVuaWNvZGVCT00oKTsKLQkJaWYgKGRldGVjdGVkQnl0ZU9yZGVyTWFyayAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdCeXRlT3JkZXJNYXJrID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspOwotCQkJLy8gbm90IHN1cmUgd2h5IHdvdWxkIGV2ZXIgYmUgZGlmZmVyZW50LCBzbyBpZiBpcyBkaWZmZXJlbnQsIG1heQotCQkJLy8gbmVlZCB0byAicHVzaCIgdXAgaW50byBiYXNlLgotCQkJaWYgKCFkZXRlY3RlZEJ5dGVPcmRlck1hcmsuZXF1YWxzKGV4aXN0aW5nQnl0ZU9yZGVyTWFyaykpCi0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIGRldGVjdGVkQnl0ZU9yZGVyTWFyayk7Ci0JCX0KLQotCi0JCWlmICghZW5jb2RpbmdNZW1lbnRvLmlzVmFsaWQoKSkgewotCQkJLy8gbm90ZTogYWZ0ZXIgc2V0dGluZyBoZXJlLCBpdHMgdGhlIG1lcmUgcHJlc2VuY2Ugb2YKLQkJCS8vIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUCi0JCQkvLyBpbiB0aGUgcmVzb3VyY2UncyBkZXNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBpZgotCQkJLy8gaW52YWxpZAotCQkJLy8gaW4gdGhvc2UgY2FzZXMsIHRoZSAiZGV0ZWN0ZWQiIHByb3BlcnR5IGNvbnRhaW5zIGFuCi0JCQkvLyAiYXBwcm9wcmlhdGUgZGVmYXVsdCIgdG8gdXNlLgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIGVuY29kaW5nTWVtZW50by5nZXRJbnZhbGlkRW5jb2RpbmcoKSk7Ci0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCwgZW5jb2RpbmdNZW1lbnRvLmdldEFwcHJvcHJpYXRlRGVmYXVsdCgpKTsKLQkJfQotCi0JCU9iamVjdCBkZXRlY3RlZENoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQlPYmplY3QgamF2YUNoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCk7Ci0KLQkJLy8gd2UgYWx3YXlzIGluY2x1ZGUgZGV0ZWN0ZWQsIGlmIGl0cyBkaWZmZXJlbnQgdGhhbiBqYXZhCi0JCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCi0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdDaGFyc2V0ID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKTsKLQkJCWlmIChqYXZhQ2hhcnNldC5lcXVhbHMoZXhpc3RpbmdDaGFyc2V0KSkgewotCQkJCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gd2UgbWF5IG5lZWQgdG8gYWRkIHdoYXQgd2UgZm91bmQsIGJ1dCBvbmx5IG5lZWQgdG8gYWRkCi0JCQkJLy8gaWYgZGlmZmVyZW50IGZyb20gZGVmYXVsdC50aGUKLQkJCQlPYmplY3QgZGVmYXVsdENoYXJzZXQgPSBnZXREZXRlY3RvcigpLmdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJCQlpZiAoZGVmYXVsdENoYXJzZXQgIT0gbnVsbCkgewotCQkJCQlpZiAoIWRlZmF1bHRDaGFyc2V0LmVxdWFscyhqYXZhQ2hhcnNldCkpIHsKLQkJCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBhc3N1bWluZyBpZiB0aGVyZSBpcyBubyBzcGVjIGRlZmF1bHQsIHdlIGFsd2F5cyBuZWVkIHRvCi0JCQkJCS8vIGFkZCwgSSdtIGFzc3VtaW5nCi0JCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgT2JqZWN0IGRldGVjdGVkQ2hhcnNldCwgT2JqZWN0IGphdmFDaGFyc2V0KSB7Ci0JCS8vIHNpbmNlIGVxdWFsLCB3ZSBkb24ndCBuZWVkIHRvIGFkZCwgYnV0IGlmIG91ciBkZXRlY3RlZCB2ZXJzaW9uIGlzCi0JCS8vIGRpZmZlcmVudCB0aGFuCi0JCS8vIGphdmFDaGFyc2V0LCB0aGVuIHdlIHNob3VsZCBhZGQgaXQuIFRoaXMgd2lsbCBoYXBwZW4sIGZvciBleGFtcGxlLAotCQkvLyBpZiB0aGVyZSdzCi0JCS8vIGRpZmZlcmVuY2VzIGluIGNhc2UsIG9yIGRpZmZlcmVuY2VzIGR1ZSB0byBvdmVycmlkZSBwcm9wZXJ0aWVzCi0JCWlmIChkZXRlY3RlZENoYXJzZXQgIT0gbnVsbCkgewotCQkJLy8gaWYgKCFkZXRlY3RlZENoYXJzZXQuZXF1YWxzKGphdmFDaGFyc2V0KSkgewotCQkJLy8gZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsCi0JCQkvLyBkZXRlY3RlZENoYXJzZXQpOwotCQkJLy8gfQotCi0JCQkvLyBPbmNlIHdlIGRldGVjdGVkIGEgY2hhcnNldCwgd2Ugc2hvdWxkIHNldCB0aGUgcHJvcGVydHkgZXZlbgotCQkJLy8gdGhvdWdoIGl0J3MgdGhlIHNhbWUgYXMgamF2YUNoYXJzZXQKLQkJCS8vIGJlY2F1c2UgdGhlcmUgYXJlIGNsaWVudHMgdGhhdCByZWx5IG9uIHRoaXMgcHJvcGVydHkgdG8KLQkJCS8vIGRldGVybWluZSBpZiB0aGUgY2hhcnNldCBpcyBhY3R1YWxseSBkZXRlY3RlZCBpbiBmaWxlIG9yIG5vdC4KLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBkZXRlY3RlZENoYXJzZXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1JlbGV2ZW50KElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9EVERNb2RlbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRFRETW9kZWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNzMyOWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9EVERNb2RlbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmV2ZW50LklEVERGaWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmV2ZW50Lk5vZGVzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LkRURE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLkRURFJlZmVyZW5jZVVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWwuTGFiZWxWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkFic3RyYWN0U3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTmV3RG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5vQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVERNb2RlbEltcGwgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciwgRFRETW9kZWwgewotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZUZpbGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJLy8gY3JlYXRlIHRoZSB0ZW1wIEZpbGUgb2JqZWN0Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQlyZXN1bHQgPSBmaWxlLmRlbGV0ZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgRFRERmlsZSBkb2N1bWVudDsKLQotCS8vIHByaXZhdGUgTGlzdCBlcnJvck1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gZW50aXR5IHJlZmVyZW5jZSBuYW1lcyBmb3VuZCBpbiB0aGUgY29uZGl0aW9uYWwgSUdOT1JFIHNlY3Rpb25zCi0JcHJpdmF0ZSBWZWN0b3IgaWdub3JlZEVudGl0eVJlZnM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVmcmVzaFJlcXVpcmVkID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgRFREUmVmZXJlbmNlVXBkYXRlciByZWZVcGRhdGVyID0gbmV3IERURFJlZmVyZW5jZVVwZGF0ZXIoKTsKLQotCXB1YmxpYyBEVERNb2RlbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWRvY3VtZW50ID0gbmV3IERUREZpbGUodGhpcyk7Ci0JCWRvY3VtZW50LmFkZERUREZpbGVMaXN0ZW5lcihuZXcgSURUREZpbGVMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgbm9kZUNoYW5nZWQoRFRETm9kZSBub2RlKSB7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIG5vZGU7Ci0JCQkJCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSAmJiBlbnRpdHkuaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQkJCQkvLyBqdXN0IHNheSB0aGV5IGhhdmUgY2hhbmdlZCBmb3Igbm93Ci0JCQkJCQlzZXRSZWZlcmVuY2VkTW9kZWxzQ2hhbmdlZCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBub2Rlc0FkZGVkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJCQljaGVja0lmRXh0ZXJuYWxSZWZlcmVuY2VzQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG5vZGVzUmVtb3ZlZChOb2Rlc0V2ZW50IGV2ZW50KSB7Ci0JCQkJY2hlY2tJZkV4dGVybmFsUmVmZXJlbmNlc0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIuYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBsYWJlbCk7Ci0JCS8vIGNsZWFyIHJlZmVyZW5jZSB1cGRhdGVyIGNhY2hlCi0JCWdldFJlZmVyZW5jZVVwZGF0ZXIoKS5jbGVhckNhY2hlKCk7Ci0JfQotCi0Jdm9pZCBjaGVja0lmRXh0ZXJuYWxSZWZlcmVuY2VzQ2hhbmdlZChOb2Rlc0V2ZW50IGV2ZW50KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBldmVudC5nZXROb2RlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgbm9kZTsKLQkJCQlpZiAoZW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkgJiYgZW50aXR5LmlzRXh0ZXJuYWxFbnRpdHkoKSkgewotCQkJCQkvLyBqdXN0IHNheSB0aGV5IGhhdmUgY2hhbmdlZCBmb3Igbm93Ci0JCQkJCXNldFJlZmVyZW5jZWRNb2RlbHNDaGFuZ2VkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLy8KLQkvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGhlbHBzIGRldGVybWluZSB0aGUgbGlzdCBvZiB0aGluZ3MgdGhhdAotCS8vIGNhbiBiZSB1c2VkIGluIGEgcGFyYW1ldGVyIGVudGl0eSByZWZlcmVuY2UgY29udGVudAotCS8vIE9wdGlvbmFsIHBhcmFtZXRlciBpcyB0byBhbGxvdyB0aGUgY3VycmVudGx5IHVzZWQgRFRERW50aXR5IHRvCi0JLy8gYmUgaW5jbHVkZWQgaW4gdGhlIGNvbWJvYm94LgotCS8vCi0JcHVibGljIExhYmVsVmFsdWVQYWlyW10gY3JlYXRlUGFybUVudGl0eUNvbnRlbnRJdGVtcyhFbnRpdHkgZW50aXR5KSB7Ci0JCU5vZGVMaXN0IGVudGl0aWVzID0gZ2V0RFRERmlsZSgpLmdldEVudGl0aWVzKCk7Ci0KLQkJVmVjdG9yIGl0ZW1zID0gbmV3IFZlY3RvcigpOwotCi0JCWlmIChlbnRpdHkgIT0gbnVsbCkgewotCQkJU3RyaW5nIG5hbWUgPSAiJSIgKyBlbnRpdHkuZ2V0TmFtZSgpICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWl0ZW1zLmFkZEVsZW1lbnQobmV3IExhYmVsVmFsdWVQYWlyKG5hbWUsIG5hbWUpKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaSA9IGVudGl0aWVzLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlFbnRpdHkgZW50aXR5QXQgPSAoRW50aXR5KSBpLm5leHQoKTsKLQkJCWlmIChlbnRpdHlBdC5pc1BhcmFtZXRlckVudGl0eSgpICYmIGVudGl0eUF0LmlzRXh0ZXJuYWxFbnRpdHkoKSkgewotCQkJCVN0cmluZyBuYW1lID0gIiUiICsgZW50aXR5QXQuZ2V0TmFtZSgpICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlpdGVtcy5hZGRFbGVtZW50KG5ldyBMYWJlbFZhbHVlUGFpcihuYW1lLCBuYW1lKSk7Ci0JCQl9Ci0JCX0KLQkJTGFiZWxWYWx1ZVBhaXJbXSBjb21ib0FycmF5ID0gbmV3IExhYmVsVmFsdWVQYWlyW2l0ZW1zLnNpemUoKV07Ci0JCWl0ZW1zLmNvcHlJbnRvKGNvbWJvQXJyYXkpOwotCQlyZXR1cm4gY29tYm9BcnJheTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlcikgewotCQlzdXBlci5lbmRSZWNvcmRpbmcocmVxdWVzdGVyKTsKLQkJLy8gY2xlYXIgcmVmZXJlbmNlIHVwZGF0ZXIgY2FjaGUKLQkJZ2V0UmVmZXJlbmNlVXBkYXRlcigpLmNsZWFyQ2FjaGUoKTsKLQl9Ci0KLQotCXB1YmxpYyBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQkvLyBSZXR1cm5zIGVudGl0eSByZWZlcmVuY2UgbmFtZXMgdGhhdCBhcmUgaW4KLQkvLyB0aGUgY29uZGl0aW9uYWwgSUdOT1JFIHNlY3Rpb25zLgotCXB1YmxpYyBWZWN0b3IgZ2V0SWdub3JlZEVudGl0eVJlZnMoKSB7Ci0JCWlmIChpZ25vcmVkRW50aXR5UmVmcyA9PSBudWxsKQotCQkJaWdub3JlZEVudGl0eVJlZnMgPSBuZXcgVmVjdG9yKCk7Ci0JCXJldHVybiBpZ25vcmVkRW50aXR5UmVmczsKLQl9Ci0KLQlwdWJsaWMgSW5kZXhlZFJlZ2lvbiBnZXRJbmRleGVkUmVnaW9uKGludCBvZmZzZXQpIHsKLQkJaWYgKHRoaXMuZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImdldE5vZGUgYXQgIiArIG9mZnNldCArICIgcmV0dXJuaW5nID0gIiArCi0JCS8vIHRoaXMuZG9jdW1lbnQuZ2V0Tm9kZUF0KG9mZnNldCkpOwotCi0JCXJldHVybiB0aGlzLmRvY3VtZW50LmdldE5vZGVBdChvZmZzZXQpOwotCX0KLQotCXB1YmxpYyBEVERSZWZlcmVuY2VVcGRhdGVyIGdldFJlZmVyZW5jZVVwZGF0ZXIoKSB7Ci0JCXJldHVybiByZWZVcGRhdGVyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlZE1vZGVsc0NoYW5nZWQoKSB7Ci0JCXJldHVybiByZWZyZXNoUmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWZyZXNoUmVxdWlyZWQoKSB7Ci0JCXJldHVybiByZWZyZXNoUmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgbmV3TW9kZWwoTmV3RG9jdW1lbnRFdmVudCBmbGF0TW9kZWxFdmVudCkgewotCQlkb2N1bWVudC5uZXdNb2RlbChmbGF0TW9kZWxFdmVudCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXG5uZXdtb2RlbCIpOwotCQlvdXRwdXRTdHJ1Y3R1cmVkRG9jdW1lbnQoZmxhdE1vZGVsRXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgZmxhdE1vZGVsRXZlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcbm5vY2hhbmdlIik7Ci0JCW91dHB1dFN0cnVjdHVyZWREb2N1bWVudChmbGF0TW9kZWxFdmVudCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGZsYXRNb2RlbEV2ZW50KSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXG5ub2Rlc3JlcGxhY2VkIik7Ci0JCWRvY3VtZW50Lm5vZGVzUmVwbGFjZWQoZmxhdE1vZGVsRXZlbnQpOwotCQlvdXRwdXRTdHJ1Y3R1cmVkRG9jdW1lbnQoZmxhdE1vZGVsRXZlbnQpOwotCi0JfQotCi0JcHVibGljIHZvaWQgb3V0cHV0U3RydWN0dXJlZERvY3VtZW50KFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGZsYXRNb2RlbEV2ZW50KSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic3RydWN0dXJlZERvY3VtZW50IHNvdXJjZSA9ICciICsKLQkJLy8gZmxhdE1vZGVsRXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0VGV4dCgpICsgIiciKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJuZXcgU3RyaW5nID0gJyIgKwotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXRPcmlnaW5hbENoYW5nZXMoKSArIiciKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJkZWxldGVkIFN0cmluZyA9ICciICsKLQkJLy8gZmxhdE1vZGVsRXZlbnQuZ2V0RGVsZXRlZFRleHQoKSArIiciKTsKLQkJLy8gRW51bWVyYXRpb24gZSA9Ci0JCS8vIGZsYXRNb2RlbEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldE5vZGVzKCkuZWxlbWVudHMoKTsKLQkJLy8gaW50IGkgPSAwOwotCQkvLyBmb3IgKDsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKQotCQkvLyB7Ci0JCS8vIEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPQotCQkvLyAoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJLy8gb3V0cHV0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5vZGUpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiAiICsgaSArIi4gIiArIG5vZGUuaGFzaENvZGUoKSArICIgJyIKLQkJLy8gK25vZGUuZ2V0VGV4dCgpICsgIiciKTsKLQkJLy8gfQotCX0KLQotCXB1YmxpYyB2b2lkIG91dHB1dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCS8vIGludCBzaXplID0gZmxhdE5vZGUuZ2V0TnVtYmVyT2ZSZWdpb25zKCk7Ci0JCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkvLyB7Ci0JCS8vIFJlZ2lvbiByZWdpb24gPSAoUmVnaW9uKSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KGkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oaSArICIuICIgKyByZWdpb24uZ2V0VHlwZSgpKTsKLQotCQkvLyB9IC8vIGVuZCBvZiBmb3IgKCkKLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lvbkNoYW5nZWQoUmVnaW9uQ2hhbmdlZEV2ZW50IGZsYXRNb2RlbEV2ZW50KSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXG5yZWdpb24gY2hhbmdlZCIpOwotCQlkb2N1bWVudC5yZWdpb25DaGFuZ2VkKGZsYXRNb2RlbEV2ZW50KTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCI9ICIgKwotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KCkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInJlZ2lvbiBjaGFuZ2VkICIgKwotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXRSZWdpb24oKS5oYXNoQ29kZSgpICsgIiA9ICIgKwotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXRSZWdpb24oKSk7Ci0KLQkJb3V0cHV0U3RydWN0dXJlZERvY3VtZW50KGZsYXRNb2RlbEV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgZmxhdE1vZGVsRXZlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcbnJlZ2lvbiByZXBsYWNlZCIpOwotCQlkb2N1bWVudC5yZWdpb25zUmVwbGFjZWQoZmxhdE1vZGVsRXZlbnQpOwotCQlvdXRwdXRTdHJ1Y3R1cmVkRG9jdW1lbnQoZmxhdE1vZGVsRXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRNb2RlbHNDaGFuZ2VkKCkgewotCQlyZWZyZXNoUmVxdWlyZWQgPSB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZnJlc2hSZXF1aXJlZChib29sZWFuIHZhbHVlKSB7Ci0JCXJlZnJlc2hSZXF1aXJlZCA9IHZhbHVlOwotCX0KLQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1N0cnVjdHVyZWREb2N1bWVudAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IG5ld1N0cnVjdHVyZWREb2N1bWVudCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IG9sZFN0cnVjdHVyZWREb2N1bWVudCA9IHN1cGVyLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50ID09IG9sZFN0cnVjdHVyZWREb2N1bWVudCkKLQkJCXJldHVybjsgLy8gbm90aW5nIHRvIGRvCi0KLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKQotCQkJb2xkU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcih0aGlzKTsKLQkJc3VwZXIuc2V0U3RydWN0dXJlZERvY3VtZW50KG5ld1N0cnVjdHVyZWREb2N1bWVudCk7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQluZXdNb2RlbChuZXcgTmV3RG9jdW1lbnRFdmVudChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQsIHRoaXMpKTsKLQkJCX0KLQkJCW5ld1N0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5naW5nTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMzQ5NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciB7Ci0KLQlwcm90ZWN0ZWQgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudG87Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSGVhZGVyUGFyc2VkOwotCi0JcHJvdGVjdGVkIFJlYWRlciBmUmVhZGVyOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vdGU6IG9uY2UgdGhpcyBpbnN0YW5jZSBpcyBjcmVhdGVkLCB0cmFjZSBpbmZvIHN0aWxsIG5lZWRzIHRvIGJlCi0JICogYXBwZW5kZWQgYnkgY2FsbGVyLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaXRzIGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGRldGVjdGVkQ2hhcnNldE5hbWUpKTsKLQkJZkVuY29kaW5nTWVtZW50by5zZXREZXRlY3RlZENoYXJzZXROYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyBUT0RPOiBpZiBkZXRlY3RlZENoYXJzZXQgYW5kIHNwZWMgZGVmYXVsdCBpcwotCQkvLyBudWxsLCBuZWVkIHRvIHVzZSAid29yawotCQkvLyBiZW5jaCBiYXNlZCIgZGVmYXVsdHMuCi0JCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHBhcmFtIHJlYXNvbgotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgU3RyaW5nIHJlYXNvbikgewotCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGVuc3VyZUlucHV0U2V0KCkgewotCQlpZiAoZlJlYWRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnB1dCBtdXN0IGJlIHNldCBiZWZvcmUgdXNlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4gbnVsbCwgaWYgaW52YWxpZCBjaGFyc2V0IG5hbWUgKGluIHdoaWNoIGNhc2UKLQkgKiAiYXBwcm9wcmlhdGVEZWZhdWx0IiBzaG91bGQgYmUgdXNlZCwgaWYgYSBuYW1lIGlzIHJlYWxseSBuZWVkIGZvciBzb21lCi0JICogInNhdmUgYW55d2F5IiBjYXNlcykuCi0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gMS4gQ2hlY2sgZXhwbGljaXQgbWFwcGluZyBvdmVycmlkZXMgZnJvbQotCQkvLyBwcm9wZXJ0eSBmaWxlIC0tIGl0cyBoZXJlIHdlIHBpY2sgdXAgInJ1bGVzIiBmb3IgY2FzZXMKLQkJLy8gdGhhdCBhcmUgbm90IGV2ZW4gaW4gSmF2YQotCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gMi4gVXNlIHRoZSAiY2Fub25pY2FsIiBuYW1lIGZyb20gSlJFIG1hcHBpbmdzCi0JCS8vIE5vdGU6IHNlZSBDaGFyc2V0IEphdmFEb2MsIHRoZSBuYW1lIHlvdSBnZXQgb25lCi0JCS8vIHdpdGggY2FuIGJlIGFsaWFzLAotCQkvLyB0aGUgbmFtZSB5b3UgZ2V0IGJhY2sgaXMgInN0YW5kYXJkIiBuYW1lLgotCQlDaGFyc2V0IGphdmFDaGFyc2V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWphdmFDaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotCQkJLy8gb25seSBzZXQgaW52YWxpZCwgaWYgcmVzdWx0IGlzIHNhbWUgYXMgZGV0ZWN0ZWQgLS0gdGhleSB3b24ndAotCQkJLy8gYmUgZXF1YWwgaWYKLQkJCS8vIG92ZXJyaWRkZW4KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldE5hbWUpKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50by5zZXRJbnZhbGlkRW5jb2RpbmcoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfQotCQkvLyBnaXZlIHByaW9yaXR5IHRvIGphdmEgY29ub25pY2FsIG5hbWUsIGlmIHByZXNlbnQKLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGphdmFDaGFyc2V0Lm5hbWUoKTsKLQkJCS8vIGJ1dCBzdGlsbCBhbGxvdyBvdmVycmlkZXMKLQkJCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldEVuY29kaW5nTWVtZW50bygpLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQl9Ci0KLQkvLyB0byBlbnN1cmUgY29uc2lzdCBvdmVyYWxsIHJ1bGVzIHVzZWQsIHdlJ2xsIG1hcmsgYXMKLQkvLyBmaW5hbCwKLQkvLyBhbmQgcmVxdWlyZSBzdWJjbGFzc2VzIHRvIHByb3ZpZGUgY2VydGFpbiBwaWVjZXMgb2YKLQkvLyB0aGUKLQkvLyBpbXBsZW1lbnRhdGlvbgotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCQkvLyB3ZSBrZWVwIHRyYWNrIG9mIGlmIGhlYWRlcidzIGFscmVhZHkgYmVlbgotCQkJLy8gcGFyc2UsIHNvIGNhbiBtYWtlCi0JCQkvLyBtdWx0aXBsZSAnZ2V0JyBjYWxscywgd2l0aG91dCBjYXVzaW5nCi0JCQkvLyByZXBhcnNpbmcuCi0JCQlmSGVhZGVyUGFyc2VkID0gdHJ1ZTsKLQkJCS8vIE5vdGU6IHRoZXJlIGlzIGEgImhpZGRlbiBhc3N1bXB0aW9uIiBoZXJlCi0JCQkvLyB0aGF0IGFuIGVtcHR5Ci0JCQkvLyBzdHJpbmcgaW4gY29udGVudCBzaG91bGQgYmUgdHJlYXRlZCBzYW1lIGFzCi0JCQkvLyBub3QgcHJlc2VudC4KLQkJfQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQloYW5kbGVTcGVjRGVmYXVsdCgpOwotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCS8vIHNhZnR5IG5ldAotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBOdWxsTWVtZW50bygpOwotCQl9Ci0JCXJldHVybiBmRW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdG8gcmV0dXJuIGEgZGVmYXVsdCBlbmNvZGluZyAtLSBhcyBzcGVjaWZpZWQgYnkgYW4gaW5kdXN0cnkKLQkgKiBjb250ZW50IHR5cGUgc3BlYyAtLSB3aGVuIG5vdCBwcmVzZW50IGluIHRoZSBzdHJlYW0sIGZvciBleGFtcGxlLCBYTUwKLQkgKiBzcGVjaWZpZXMgVVRGLTgsIEpTUCBzcGVjaWZpZXMgSVNPLTg4NTktMS4gVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybgotCSAqIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCAic3BlYyBkZWZhdWx0Ii4KLQkgKi8KLQlhYnN0cmFjdCBwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgZW5jID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERUZBVUxUU19BU1NVTUVEX0ZPUl9FTVBUWV9JTlBVVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmMpOwotCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTcGVjRGVmYXVsdCgpIHsKLQkJU3RyaW5nIGVuY29kaW5nTmFtZTsKLQkJZW5jb2RpbmdOYW1lID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jb2RpbmdOYW1lICE9IG51bGwpIHsKLQkJCS8vIGNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmNvZGluZ05hbWUsCi0JCQkvLyBFbmNvZGluZ01lbWVudG8uVVNFRF9DT05URU5UX1RZUEVfREVGQVVMVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRKYXZhQ2hhcnNldE5hbWUoZW5jb2RpbmdOYW1lKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGVuY29kaW5nTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFdmVyeSBzdWJjbGFzcyBtdXN0IHByb3ZpZGUgYSB3YXkgdG8gcGFyc2UgdGhlIGlucHV0LiBUaGlzIG1ldGhvZCBoYXMKLQkgKiBzZXZlcmFsIGNyaXRpY2FsIHJlc3BvbnNpYmlsaXRpZXM6Ci0JICogPGxpPnNldCB0aGUgZkVuY29kaW5nTWVtZW50byBmaWVsZCBhcHByb3ByaWF0ZWx5LCBhY2NvcmRpbmcgdG8gdGhlCi0JICogcmVzdWx0cyBvZiB0aGUgcGFyc2Ugb2YgZlJlYWRlci48L2xpPgotCSAqIDxsaT5zZXQgZkhhcmRlclBhcnNlZCB0byB0cnVlLCB0byBhdm9pZCB3YXN0ZWQgcmUtcGFyc2luZy48L2xpPgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXRBbGwoKSB7Ci0JCWZSZWFkZXIgPSBudWxsOwotCQlmSGVhZGVyUGFyc2VkID0gZmFsc2U7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gbmV3IEJ5dGVSZWFkZXIoaW5wdXRTdHJlYW0pOwotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlIGtub3cgQnl0ZVJlYWRlcgotCQkJLy8gc3VwcG9ydHMgbWFya2luZwotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElTdG9yYWdlIGlTdG9yYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaVN0b3JhZ2UuZ2V0Q29udGVudHMoKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJlc2V0dGFibGVTdHJlYW0ubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlzZXQocmVzZXR0YWJsZVN0cmVhbSk7Ci0JCS8vIFRPRE8gd2UnbGwgbmVlZCB0byAicmVtZW1iZXIiIElGaWxlLCBvcgotCQkvLyBnZXQgaXRzIChvciBpdHMgcHJvamVjdCdzKSBzZXR0aW5ncywgaW4gY2FzZQotCQkvLyB0aG9zZSBhcmUgbmVlZGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVuIHRoZQotCQkvLyBlbmNvZGluZyBpcyBub3QgaW4gdGhlIGZpbGUgc3RyZWFtLgotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQnl0ZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9CeXRlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YzliZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9CeXRlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotCi0vKioKLSAqIFRoaXMgaXMgYW4gImFkYXB0ZXIiIGNsYXNzLCBzaW1wbHkgdG8gZ2V0IGluIGlucHV0IHN0cmVhbSB0byBhY3QgbGlrZSBhCi0gKiByZWFkZXIuIFdlIGNvdWxkIG5vdCB1c2UgSW5wdXRTdHJlYW1SZWFkZXIgZGlyZWN0bHkgYmVjYXVzZSBpdHMgaW50ZXJuYWwKLSAqIGJ1ZmZlcnMgYXJlIG5vdCBjb250cm9sbGFibGUsIGFuZCBpdCBzb21ldGltZXMgcHVsbHMgdG9vIG11Y2ggb3V0IG9mIGlucHV0Ci0gKiBzdHJlYW0gKGV2ZW4gd2hlbiBpdCB3YXNuJ3QgbmVlZGVkIGZvciBvdXIgcHVycG9zZXMpLgotICogCi0gKiBUaGUgdXNlIG9mIHRoaXMgY2xhc3MgaXMgaGlnaGx5IHNwZWNpYWxpemVkIGFuZCBieSBub3QgbWVhbnMgbWVhbnQgdG8gYmUKLSAqIGdlbmVyYWwgcHVycG9zZS4gSXRzIHVzZSBpcyByZXN0cmljdGVkIHRvIHRob3NlIGNhc2VzIHdoZXJlIHRoZSBpbnB1dAotICogc3RyZWFtIGNhbiBiZSByZWdhcmRlZCBhcyBhc2NpaSBqdXN0IGxvbmcgZW5vdWdoIHRvIGRldGVybWluZSB3aGF0IHRoZSByZWFsCi0gKiBlbmNvZGluZyBzaG91bGQgYmUuCi0gKi8KLQotcHVibGljIGNsYXNzIEJ5dGVSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IENvZGVkSU8uTUFYX0JVRl9TSVpFOwotCi0JcHJvdGVjdGVkIGJ5dGVbXSBmQnVmZmVyOwotCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIGZJbnB1dFN0cmVhbTsKLQotCXByb3RlY3RlZCBCeXRlUmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXRoaXMoaW5wdXRTdHJlYW0sIERFRkFVTFRfQlVGRkVSX1NJWkUpOwotCQlpZiAoIWlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVJlYWRlciBpcyByZXF1aXJlZCB0byBoYXZlIGEgcmVzZXR0YWJsZSBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIEJ5dGVSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGludCBzaXplKSB7Ci0JCXRoaXMuZklucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5mQnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZEFoZWFkTGltaXQpIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0ubWFyayhyZWFkQWhlYWRMaW1pdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGIwID0gdGhpcy5mSW5wdXRTdHJlYW0ucmVhZCgpOwotCQlyZXR1cm4gKGIwICYgMHgwMEZGKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoY2hhciBjaFtdLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAobGVuZ3RoID4gdGhpcy5mQnVmZmVyLmxlbmd0aCkgewotCQkJbGVuZ3RoID0gdGhpcy5mQnVmZmVyLmxlbmd0aDsKLQkJfQotCi0JCWludCBjb3VudCA9IHRoaXMuZklucHV0U3RyZWFtLnJlYWQodGhpcy5mQnVmZmVyLCAwLCBsZW5ndGgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJaW50IGIwID0gdGhpcy5mQnVmZmVyW2ldOwotCQkJLy8gdGhlIDB4MDBGRiBpcyB0byAibG9zZSIgdGhlIG5lZ2F0aXZlIGJpdHMgZmlsbGVkIGluIHRoZSBieXRlIHRvCi0JCQkvLyBpbnQgY29udmVyc2lvbgotCQkJLy8gKGFuZCB3aGljaCB3b3VsZCBiZSB0aGVyZSBpZiBjYXN0IGRpcmVjdGx5IGZyb20gYnl0ZSB0byBjaGFyKS4KLQkJCWNoYXIgYzAgPSAoY2hhcikgKGIwICYgMHgwMEZGKTsKLQkJCWNoW29mZnNldCArIGldID0gYzA7Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZklucHV0U3RyZWFtLmF2YWlsYWJsZSgpID4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLnJlc2V0KCk7Ci0JfQotCi0JcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmZJbnB1dFN0cmVhbS5za2lwKG4pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9EVEREb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9EVEREb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTJiNWEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvRFRERG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gMjgtQXVnLTAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5YTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLQotCi0vKioKLSAqIEBhdXRob3Iga2JvbwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRERG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElEb2N1bWVudENoYXJzZXREZXRlY3RvciB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIFVURi04IGFzIHBlciBYTUwgc3BlYwotCQlmaW5hbCBTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2VJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlEb2N1bWVudENoYXJzZXREZXRlY3RvciBkb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPSBuZXcgWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IoKTsKLQkJZG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yLnNldChmUmVhZGVyKTsKLQkJZkVuY29kaW5nTWVtZW50byA9ICgoWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKWRvY3VtZW50RW5jb2RpbmdEZXRlY3RvcikuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXNldChuZXcgRG9jdW1lbnRSZWFkZXIoZG9jdW1lbnQsIDApKTsKLQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0RURERvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0RURERvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2OGYwOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9EVEREb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuRFREU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQWJzdHJhY3REb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIERURERvY3VtZW50TG9hZGVyIGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudExvYWRlciB7Ci0KLQlwdWJsaWMgRFRERG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JEVEQoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJaWYgKGZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9IG5ldyBEVEREb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCQl9Ci0JCXJldHVybiBmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlyZXR1cm4gbmV3IERURFJlZ2lvblBhcnNlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoSUZpbGUgZmlsZSkgewotCQlTdHJpbmcgZGVsaW1pdGVyID0gQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLmdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoQ29udGVudFR5cGVJZEZvckRURC5Db250ZW50VHlwZUlEX0RURCk7Ci0JCWlmIChkZWxpbWl0ZXIgPT0gbnVsbCkKLQkJCWRlbGltaXRlciA9IHN1cGVyLmdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoZmlsZSk7Ci0JCXJldHVybiBkZWxpbWl0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQlTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCXByb3RlY3RlZCBJRW5jb2RlZERvY3VtZW50IG5ld0VuY29kZWREb2N1bWVudCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCA9IFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoZ2V0UGFyc2VyKCkpOwotCQlEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciByZVBhcnNlciA9IG5ldyBEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpOwotCQlyZVBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoZG9jdW1lbnQpOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpLnNldFJlUGFyc2VyKHJlUGFyc2VyKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL051bGxNZW1lbnRvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL051bGxNZW1lbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNjAzNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9OdWxsTWVtZW50by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLk5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXM7Ci0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgYW4gRW5jb2RpbmdNZW1lbnRvIChpdHMgc3VwZXIgY2xhc3MpLAotICogd2hlbiB0aGVyZSBpcyBub3QgaW4gZmFjdCBBTlkgZW5jb2RpbmcgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLCB3aGVuIGEKLSAqIHN0cnVjdHVyZWREb2N1bWVudCBpcyBjcmVhdGVkIGRpcmVjdGx5IGZyb20gYSBTdHJpbmcKLSAqLwotcHVibGljIGNsYXNzIE51bGxNZW1lbnRvIGV4dGVuZHMgRW5jb2RpbmdNZW1lbnRvIHsKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTnVsbE1lbWVudG8oKSB7Ci0JCXN1cGVyKCk7Ci0JCVN0cmluZyBkZWZhdWx0Q2hhcnNldCA9IE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhudWxsKTsKLQkJc2V0SmF2YUNoYXJzZXROYW1lKGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2V2ZW50L0lEVERGaWxlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZXZlbnQvSURUREZpbGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDkwOTY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZXZlbnQvSURUREZpbGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElEVERGaWxlTGlzdGVuZXIgewotCi0JcHVibGljIHZvaWQgbm9kZUNoYW5nZWQoRFRETm9kZSBub2RlKTsKLQotCXB1YmxpYyB2b2lkIG5vZGVzQWRkZWQoTm9kZXNFdmVudCBldmVudCk7Ci0KLQlwdWJsaWMgdm9pZCBub2Rlc1JlbW92ZWQoTm9kZXNFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2V2ZW50L05vZGVzRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZXZlbnQvTm9kZXNFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzk3MmMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZXZlbnQvTm9kZXNFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgTm9kZXNFdmVudCB7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgY2hhbmdlZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIHZvaWQgYWRkKERURE5vZGUgY2hhbmdlZE5vZGUpIHsKLQkJY2hhbmdlZE5vZGVzLmFkZChjaGFuZ2VkTm9kZSk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Tm9kZXMoKSB7Ci0JCXJldHVybiBjaGFuZ2VkTm9kZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9EVERNb2RlbExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRFRETW9kZWxMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI1MWFjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9EVERNb2RlbExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5EVEREb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgRFRETW9kZWxMb2FkZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsTG9hZGVyIHsKLQlwdWJsaWMgRFRETW9kZWxMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJaWYgKGRvY3VtZW50TG9hZGVySW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG5ldyBEVEREb2N1bWVudExvYWRlcigpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudExvYWRlckluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgRFRETW9kZWxMb2FkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCgpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG5ldyBEVERNb2RlbEltcGwoKTsKLQkJLy8gbm93IGRvbmUgaW4gY3JlYXRlCi0JCS8vIG1vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudChjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCS8vIG1vZGVsLnNldEZhY3RvcnlSZWdpc3RyeShkZWZhdWx0RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCQlyZXR1cm4gbW9kZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9yRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JEVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkwZTEwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVuY29kaW5nLkRURERvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5EVEREb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuQWJzdHJhY3RNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBNb2RlbEhhbmRsZXJGb3JEVEQgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSGFuZGxlciBpbXBsZW1lbnRzIElNb2RlbEhhbmRsZXIgewotCXByaXZhdGUgc3RhdGljIFN0cmluZyBBc3NvY2lhdGVkQ29udGVudFR5cGVJZCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNb2RlbEhhbmRsZXJJRCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIE1vZGVsSGFuZGxlckZvckRURCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0SWQoTW9kZWxIYW5kbGVySUQpOwotCQlzZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChBc3NvY2lhdGVkQ29udGVudFR5cGVJZCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBEVEREb2N1bWVudExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBEVEREb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgZ2V0TW9kZWxMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgRFRETW9kZWxMb2FkZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0RURFJlZ2lvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0RURFJlZ2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M5Y2I4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3BhcnNlci9EVERSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ29udGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotcHVibGljIGNsYXNzIERURFJlZ2lvbkZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgSVRleHRSZWdpb24gY3JlYXRlUmVnaW9uKFN0cmluZyB0b2tlbktpbmQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlpZiAodG9rZW5LaW5kICE9IG51bGwpIHsKLQkJCS8vIElTU1VFOiBEVEQgcmVnaW9ucyBkb24ndCBkaXN0aW5ndWlzaCB0ZXh0IGZyb20gd2hpdGUgc3BhY2UKLQkJCXJlZ2lvbiA9IG5ldyBDb250ZXh0UmVnaW9uKHRva2VuS2luZCwgc3RhcnQsIGxlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wYXJzZXIvRFREUmVnaW9uUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3BhcnNlci9EVERSZWdpb25QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJlNmYxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3BhcnNlci9EVERSZWdpb25QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50b2tlbml6ZXIuRFREVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50b2tlbml6ZXIuVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIERURFJlZ2lvblBhcnNlciBpbXBsZW1lbnRzIFJlZ2lvblBhcnNlciB7Ci0JcHJpdmF0ZSBWZWN0b3IgY2FjaGVkUmVnaW9ucyA9IG51bGw7Ci0JcHJpdmF0ZSBEVERUb2tlbml6ZXIgdG9rZW5pemVyID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY2FjaGVkTm9kZSA9IG51bGw7IC8vIHRvcCBvZiBub2RlCi0JCQkJCQkJCQkJCQkJCQkvLyBjaGFpbgotCi0JcHVibGljIFJlZ2lvblBhcnNlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBEVERSZWdpb25QYXJzZXIoKTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYWRkTmV3Tm9kZXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSwgVmVjdG9yIHJlZ2lvbnMpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsZWFkaW5nU3BhY2VOb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50Tm9kZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdHJhaWxpbmdTcGFjZU5vZGUgPSBudWxsOwotCQlMaW5rZWRMaXN0IG5vZGVTZWVkcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWludCBuUmVnaW9ucyA9IHJlZ2lvbnMuc2l6ZSgpOwotCQlpbnQgbGVhZGluZ1NwYWNlRW5kID0gLTE7Ci0JCWludCB0cmFpbGluZ1NwYWNlQmVnaW4gPSBuUmVnaW9uczsKLQotCQkvLyBmaW5kIGxlYWRpbmcgc3BhY2UKLQkJbm9kZVNlZWRzLmNsZWFyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgblJlZ2lvbnM7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLmdldChpKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChpc0JsYW5rUmVnaW9uKHR5cGUpKSB7Ci0JCQkJbGVhZGluZ1NwYWNlRW5kID0gaTsKLQkJCQlub2RlU2VlZHMuYWRkTGFzdChyZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFub2RlU2VlZHMuaXNFbXB0eSgpKSB7Ci0JCQlsZWFkaW5nU3BhY2VOb2RlID0gY3JlYXRlTm9kZShub2RlU2VlZHMpOwotCQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCQlsYXN0Tm9kZS5zZXROZXh0KGxlYWRpbmdTcGFjZU5vZGUpOwotCQkJCWxlYWRpbmdTcGFjZU5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJfQotCQkJbGFzdE5vZGUgPSBsZWFkaW5nU3BhY2VOb2RlOwotCQl9Ci0KLQkJLy8gZmluZCB0cmFpbGluZyBzcGFjZQotCQlpZiAobGVhZGluZ1NwYWNlRW5kIDwgblJlZ2lvbnMgLSAxKSB7Ci0JCQlub2RlU2VlZHMuY2xlYXIoKTsKLQkJCWZvciAoaW50IGkgPSBuUmVnaW9ucyAtIDE7IDAgPD0gaTsgaS0tKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLmdldChpKTsKLQkJCQlTdHJpbmcgdHlwZSA9ICgoSVRleHRSZWdpb24pIHJlZ2lvbnMuZ2V0KGkpKS5nZXRUeXBlKCk7Ci0JCQkJaWYgKGlzQmxhbmtSZWdpb24odHlwZSkpIHsKLQkJCQkJdHJhaWxpbmdTcGFjZUJlZ2luID0gaTsKLQkJCQkJbm9kZVNlZWRzLmFkZEZpcnN0KHJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIW5vZGVTZWVkcy5pc0VtcHR5KCkpIHsKLQkJCQl0cmFpbGluZ1NwYWNlTm9kZSA9IGNyZWF0ZU5vZGUobm9kZVNlZWRzKTsKLQkJCX0KLQotCQkJbm9kZVNlZWRzLmNsZWFyKCk7Ci0JCQlmb3IgKGludCBpID0gbGVhZGluZ1NwYWNlRW5kICsgMTsgaSA8IHRyYWlsaW5nU3BhY2VCZWdpbjsgaSsrKSB7Ci0JCQkJbm9kZVNlZWRzLmFkZExhc3QocmVnaW9ucy5nZXQoaSkpOwotCQkJfQotCQkJaWYgKCFub2RlU2VlZHMuaXNFbXB0eSgpKSB7Ci0JCQkJY29udGVudE5vZGUgPSBjcmVhdGVOb2RlKG5vZGVTZWVkcyk7Ci0JCQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCQkJbGFzdE5vZGUuc2V0TmV4dChjb250ZW50Tm9kZSk7Ci0JCQkJCWNvbnRlbnROb2RlLnNldFByZXZpb3VzKGxhc3ROb2RlKTsKLQkJCQl9Ci0JCQkJbGFzdE5vZGUgPSBjb250ZW50Tm9kZTsKLQkJCX0KLQkJCWlmICh0cmFpbGluZ1NwYWNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJbGFzdE5vZGUuc2V0TmV4dCh0cmFpbGluZ1NwYWNlTm9kZSk7Ci0JCQkJdHJhaWxpbmdTcGFjZU5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJCWxhc3ROb2RlID0gdHJhaWxpbmdTcGFjZU5vZGU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGFzdE5vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNyZWF0ZU5vZGUoTGlua2VkTGlzdCByZWdpb25zKSB7Ci0JCWlmIChyZWdpb25zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IERURFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkuY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKERURFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkuRFREX0dFTkVSSUMpOwotCQlpbnQgc3RhcnQgPSAoKElUZXh0UmVnaW9uKSByZWdpb25zLmdldEZpcnN0KCkpLmdldFN0YXJ0KCk7Ci0JCWludCBsZW5ndGggPSAoKElUZXh0UmVnaW9uKSByZWdpb25zLmdldExhc3QoKSkuZ2V0RW5kKCkgLSBzdGFydDsKLQkJbm9kZS5zZXRTdGFydChzdGFydCk7Ci0JCW5vZGUuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yIGkgPSByZWdpb25zLmxpc3RJdGVyYXRvcigwKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGkubmV4dCgpOwotCQkJbm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtc3RhcnQpOwotCQl9Ci0JCW5vZGUuc2V0RW5kZWQodHJ1ZSk7Ci0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNyZWF0ZU5vZGVDaGFpbihMaXN0IHJlZ2lvbnMpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSBudWxsOwotCQlWZWN0b3Igbm9kZVNlZWRzID0gbmV3IFZlY3RvcigpOwotCi0JCWZvciAoSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsgZS5oYXNOZXh0KCk7KSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJLy8gSWYgdGhlIGZvbGxvd2luZyByZWdpb25zIGFwcGVhciwKLQkJCS8vIGEgcHJldmlvdXMgbm9kZSBpcyBjbG9zZWQgaW4gZnJvbnQgb2YgaXQuCi0JCQlpZiAoIW5vZGVTZWVkcy5pc0VtcHR5KCkgJiYgaXNCZWdpbm5pbmdSZWdpb24odHlwZSkpIHsKLQkJCQlsYXN0Tm9kZSA9IGFkZE5ld05vZGVzKGxhc3ROb2RlLCBub2RlU2VlZHMpOwotCQkJCW5vZGVTZWVkcy5jbGVhcigpOwotCQkJfQotCQkJbm9kZVNlZWRzLmFkZEVsZW1lbnQocmVnaW9uKTsKLQotCQkJLy8gVGhlIGZvbGxvd2luZyByZWdpb25zIGNsb3NlIHRoZSBjdXJyZW50IG5vZGUuCi0JCQlpZiAoIW5vZGVTZWVkcy5pc0VtcHR5KCkgJiYgaXNFbmRpbmdSZWdpb24odHlwZSkpIHsKLQkJCQlsYXN0Tm9kZSA9IGFkZE5ld05vZGVzKGxhc3ROb2RlLCBub2RlU2VlZHMpOwotCQkJCW5vZGVTZWVkcy5jbGVhcigpOwotCQkJfQotCi0JCQlpZiAoaGVhZE5vZGUgPT0gbnVsbCAmJiBsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJaGVhZE5vZGUgPSBmaW5kRmlyc3ROb2RlKGxhc3ROb2RlKTsKLQkJCX0KLQkJfQotCi0JCS8vIGNsb3NlIGN1cnJlbnQgbm9kZSBmb3JjaWJseS4KLQkJaWYgKCFub2RlU2VlZHMuaXNFbXB0eSgpKSB7Ci0JCQlsYXN0Tm9kZSA9IGFkZE5ld05vZGVzKGxhc3ROb2RlLCBub2RlU2VlZHMpOwotCQkJaWYgKGhlYWROb2RlID09IG51bGwgJiYgbGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCWhlYWROb2RlID0gZmluZEZpcnN0Tm9kZShsYXN0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGhlYWROb2RlOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kRmlyc3ROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9IG5vZGU7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldk5vZGUgPSBudWxsOwotCQl3aGlsZSAoKHByZXZOb2RlID0gZmlyc3ROb2RlLmdldFByZXZpb3VzKCkpICE9IG51bGwpIHsKLQkJCWZpcnN0Tm9kZSA9IHByZXZOb2RlOwotCQl9Ci0JCXJldHVybiBmaXJzdE5vZGU7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RG9jdW1lbnRSZWdpb25zKCkgewotCQlpZiAoY2FjaGVkTm9kZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY2FjaGVkTm9kZTsKLQkJfQotCi0JCUxpc3QgcmVnaW9ucyA9IGdldFJlZ2lvbnMoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSA9IGNyZWF0ZU5vZGVDaGFpbihyZWdpb25zKTsKLQkJY2FjaGVkTm9kZSA9IGhlYWROb2RlOwotCi0JCXJldHVybiBoZWFkTm9kZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRSZWdpb25zKCkgewotCQlpZiAoY2FjaGVkUmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY2FjaGVkUmVnaW9uczsKLQkJfQotCi0JCVZlY3RvciByZWdpb25zID0gbmV3IFZlY3RvcigpOwotCQlUb2tlbiBjdXJyZW50VG9rZW4gPSBudWxsOwotCQlkbyB7Ci0JCQl0cnkgewotCQkJCWN1cnJlbnRUb2tlbiA9IChUb2tlbikgdG9rZW5pemVyLnl5bGV4KCk7Ci0JCQkJaWYgKGN1cnJlbnRUb2tlbiAhPSBudWxsKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IERURFJlZ2lvbkZhY3RvcnkuY3JlYXRlUmVnaW9uKGN1cnJlbnRUb2tlbi5nZXRUeXBlKCksIGN1cnJlbnRUb2tlbi5nZXRTdGFydE9mZnNldCgpLCBjdXJyZW50VG9rZW4uZ2V0TGVuZ3RoKCkpOwotCQkJCQlyZWdpb25zLmFkZChyZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIG5vdCBmb3VuZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBvcGVuaW5nIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXdoaWxlIChjdXJyZW50VG9rZW4gIT0gbnVsbCk7Ci0KLQkJY2FjaGVkUmVnaW9ucyA9IHJlZ2lvbnM7Ci0JCXJldHVybiByZWdpb25zOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFJlYWRlciByZWFkZXIpIHsKLQkJaWYgKHRva2VuaXplciA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXRva2VuaXplciA9IG5ldyBEVERUb2tlbml6ZXIocmVhZGVyKTsKLQkJCX0KLQkJCWNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2UgOiBqYXZhIERURFRva2VuaXplciA8aW5wdXRmaWxlPiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCXRva2VuaXplci55eXJlc2V0KHJlYWRlcik7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBvcGVuaW5nIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJY2FjaGVkTm9kZSA9IG51bGw7Ci0JCWNhY2hlZFJlZ2lvbnMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEFuIGFkZGl0aW9uYWwgb2Zmc2V0IGZvciB1c2Ugd2l0aCBhbnkgcG9zaXRpb24tZGVwZW5kYW50IHBhcnNpbmcgcnVsZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChSZWFkZXIgcmVhZGVyLCBpbnQgb2Zmc2V0KSB7Ci0JCXJlc2V0KHJlYWRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIGlucHV0KSB7Ci0JCXJlc2V0KG5ldyBTdHJpbmdSZWFkZXIoaW5wdXQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgaW5wdXQsIGludCBvZmZzZXQpIHsKLQkJcmVzZXQoaW5wdXQpOwotCX0KLQotCS8vIG5ldmVyIHVzZWQKLQlEVERUb2tlbml6ZXIgZ2V0VG9rZW5pemVyKCkgewotCQlyZXR1cm4gdG9rZW5pemVyOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0JlZ2lubmluZ1JlZ2lvbihTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuU1RBUlRfVEFHKSB8fCAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfUEFSTSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQmxhbmtSZWdpb24oU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0VuZGluZ1JlZ2lvbihTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5EX1RBRykgfHwgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5USVRZX1BBUk0pIHx8ICh0eXBlID09IERURFJlZ2lvblR5cGVzLkNPTU1FTlRfRU5EKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3BhcnNlci9EVERSZWdpb25UeXBlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wYXJzZXIvRFREUmVnaW9uVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0YjY2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3BhcnNlci9EVERSZWdpb25UeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRFREUmVnaW9uVHlwZXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHJlZ2lvblByZWZpeCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5wYXJzZXIuRFREUmVnaW9uVHlwZXMuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9IHJlZ2lvblByZWZpeCArICJOQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RBRyA9IHJlZ2lvblByZWZpeCArICJTVEFSVF9UQUciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX1RBRyA9IHJlZ2lvblByZWZpeCArICJFTkRfVEFHIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFRlRfUEFSRU4gPSByZWdpb25QcmVmaXggKyAiTEVGVF9QQVJFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSSUdIVF9QQVJFTiA9IHJlZ2lvblByZWZpeCArICJSSUdIVF9QQVJFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSElURVNQQUNFID0gcmVnaW9uUHJlZml4ICsgIldISVRFU1BBQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SID0gcmVnaW9uUHJlZml4ICsgIkNPTk5FQ1RPUiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9DQ1VSX1RZUEUgPSByZWdpb25QcmVmaXggKyAiT0NDVVJfVFlQRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMQU1BVElPTiA9IHJlZ2lvblByZWZpeCArICJFWENMQU1BVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJDRU5UID0gcmVnaW9uUHJlZml4ICsgIlBFUkNFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VNSUNPTE9OID0gcmVnaW9uUHJlZml4ICsgIlNFTUlDT0xPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX1NUQVJUID0gcmVnaW9uUHJlZml4ICsgIkNPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9DT05URU5UID0gcmVnaW9uUHJlZml4ICsgIkNPTU1FTlRfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0VORCA9IHJlZ2lvblByZWZpeCArICJDT01NRU5UX0VORCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OX1RBRyA9IHJlZ2lvblByZWZpeCArICJOT1RBVElPTl9UQUciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT05fQ09OVEVOVCA9IHJlZ2lvblByZWZpeCArICJOT1RBVElPTl9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1RBRyA9IHJlZ2lvblByZWZpeCArICJFTlRJVFlfVEFHIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9QQVJNID0gcmVnaW9uUHJlZml4ICsgIkVOVElUWV9QQVJNIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9DT05URU5UID0gcmVnaW9uUHJlZml4ICsgIkVOVElUWV9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5EQVRBX1ZBTFVFID0gcmVnaW9uUHJlZml4ICsgIk5EQVRBX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9UQUcgPSByZWdpb25QcmVmaXggKyAiRUxFTUVOVF9UQUciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DT05URU5UID0gcmVnaW9uUHJlZml4ICsgIkVMRU1FTlRfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0VNUFRZID0gcmVnaW9uUHJlZml4ICsgIkNPTlRFTlRfRU1QVFkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9BTlkgPSByZWdpb25QcmVmaXggKyAiQ09OVEVOVF9BTlkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9QQ0RBVEEgPSByZWdpb25QcmVmaXggKyAiQ09OVEVOVF9QQ0RBVEEiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRMSVNUX1RBRyA9IHJlZ2lvblByZWZpeCArICJBVFRMSVNUX1RBRyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIlNZU1RFTV9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIlBVQkxJQ19LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5EQVRBX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiTkRBVEFfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVRVU9URURfTElURVJBTCA9IHJlZ2lvblByZWZpeCArICJTSU5HTEVRVU9URURfTElURVJBTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVRVU9URURfTElURVJBTCA9IHJlZ2lvblByZWZpeCArICJET1VCTEVRVU9URURfTElURVJBTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX0NPTlRFTlQgPSByZWdpb25QcmVmaXggKyAiVU5LTk9XTl9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX05BTUUgPSByZWdpb25QcmVmaXggKyAiQVRUUklCVVRFX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBhdHRyaWJ1dGUgdHlwZSBrZXl3b3JkcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiQ0RBVEFfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIklEX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUZfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJJRFJFRl9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEUkVGU19LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIklEUkVGU19LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIkVOVElUWV9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUSUVTX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiRU5USVRJRVNfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOTVRPS0VOX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiTk1UT0tFTl9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5NVE9LRU5TX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiTk1UT0tFTlNfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RBVElPTl9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIk5PVEFUSU9OX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5VTV9DSE9JQ0UgPSByZWdpb25QcmVmaXggKyAiRU5VTV9DSE9JQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9FTlRJVFlfVFlQRSA9IHJlZ2lvblByZWZpeCArICJQQVJNX0VOVElUWV9UWVBFIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gYXR0cmlidXRlIGRlZmF1bHRzIGtleXdvcmRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRURfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJSRVFVSVJFRF9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExJRURfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJJTVBMSUVEX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklYRURfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJGSVhFRF9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotfS8vIERURFJlZ2lvblR5cGVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2ZiNjVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBTZXRzIGRlZmF1bHQgdmFsdWVzIGZvciBEVEQgQ29yZSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgRFREQ29yZVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0KLQkJLy8gdGhpcyBjb3VsZCBiZSBtYWRlIHNtYXJ0ZXIgYnkgYWN0dWFsbHkgbG9va2luZyB1cCB0aGUgY29udGVudAotCQkvLyB0eXBlJ3MgdmFsaWQgZXh0ZW5zaW9ucwotCQlub2RlLnB1dChEVERDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OLCAiZHRkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQ4ZTBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBDb21tb24gcHJlZmVyZW5jZSBrZXlzIHVzZWQgYnkgRFREIGNvcmUKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERDb3JlUHJlZmVyZW5jZU5hbWVzIHsKLQlwcml2YXRlIERURENvcmVQcmVmZXJlbmNlTmFtZXMoKSB7Ci0JCS8vIGVtcHR5IHByaXZhdGUgY29uc3RydWN0b3Igc28gdXNlcnMgY2Fubm90IGluc3RhbnRpYXRlIGNsYXNzCi0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZXh0ZW5zaW9uIHRvIHVzZSB3aGVuIG5vbmUgaXMgc3BlY2lmaWVkIGluIHRoZSBOZXcgRmlsZQotCSAqIFdpemFyZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVhURU5TSU9OID0gImRlZmF1bHRFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckRURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzc1OGViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckRURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlOwotCi0vKioKLSAqIDxwPgotICogVGhpcyBjbGFzcywgd2l0aCBpdHMgb25lIGZpZWxkLCBpcyBhIGNvbnZlbmllbmNlIHRvIHByb3ZpZGUgY29tcGlsZS10aW1lCi0gKiBzYWZldHkgd2hlbiByZWZlcnJpbmcgdG8gdGhlIERURCBjb250ZW50VHlwZSBJRC4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudFR5cGVJZEZvckRURCB7Ci0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSBDb250ZW50VHlwZUlEX0RURCBpZCBmaWVsZCB3aWxsIG1hdGNoIHdoYXQgaXMKLQkgKiBzcGVjaWZpZWQgaW4gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3BsdWdpbi54bWwgZm9yIHRoZSBEVEQgY29udGVudAotCSAqIHR5cGUuCi0JICogCi0JICogVGhpcyB2YWx1ZSBpcyBpbnRlbnRpb25hbGx5IHNldCB0aHJvdWdoIGEgZGVmYXVsdCBwcm90ZWN0ZWQgbWV0aG9kIHNvCi0JICogdGhhdCBpdCB3aWxsIG5vdCBiZSBpbmxpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENvbnRlbnRUeXBlSURfRFREID0gZ2V0Q29uc3RhbnRTdHJpbmcoKTsKLQotCXByaXZhdGUgQ29udGVudFR5cGVJZEZvckRURCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBEVEQgQ29udGVudCBUeXBlIElkZW50aWZpZXIgSUQgYXMgYSBTdHJpbmcKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldENvbnN0YW50U3RyaW5nKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9EVERNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9EVERNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWM3MDFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvRFRETW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotLyoqCi0gKiA8cD4KLSAqIEFuIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGUgU1NFLWJhc2VkIERURCBtb2RlbC4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBEVERNb2RlbCBleHRlbmRzIElTdHJ1Y3R1cmVkTW9kZWx7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSURURFBhcnRpdGlvblR5cGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSURURFBhcnRpdGlvblR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMzVmNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lEVERQYXJ0aXRpb25UeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4KLSAqIEl0IGRlZmluZXMgdGhlIHBhcnRpdGlvbiB0eXBlcyBEVEQuCi0gKiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAZGVwcmVjYXRlZCB1c2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnRleHQuSURURFBhcnRpdGlvbnMKLSAqLwotcHVibGljIGludGVyZmFjZSBJRFREUGFydGl0aW9uVHlwZXMgewotCQotCVN0cmluZyBEVERfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLkRFRkFVTFQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rhc2tzL0RUREZpbGVUYXNrU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90YXNrcy9EVERGaWxlVGFza1NjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM3ZTI3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rhc2tzL0RUREZpbGVUYXNrU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3MuU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lcjsKLQotcHVibGljIGNsYXNzIERUREZpbGVUYXNrU2Nhbm5lciBleHRlbmRzIFN0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXIgewotCXB1YmxpYyBEVERGaWxlVGFza1NjYW5uZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21tZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uKSB7Ci0JCXJldHVybiB0ZXh0UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9DT05URU5UKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvRFREU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2UxYTE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIHsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQm91bmRyeUNhc2VzKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZlN0YXJ0KTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChmU3RhcnQgKyBmTGVuZ3RoVG9SZXBsYWNlIC0gMSk7Ci0JCXJldHVybiByZXBhcnNlKHN0YXJ0Tm9kZS5nZXRTdGFydCgpLCBlbmROb2RlLmdldEVuZCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyI25ld0luc3RhbmNlKCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgRFREU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwYXJzZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5U3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlFbmQpIHsKLQkJcmV0dXJuIHN1cGVyLnJlcGFyc2UoZGlydHlTdGFydCwgZGlydHlFbmQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvRFREU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2QyYzJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEVERfR0VORVJJQyA9IDU7Ci0KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGludCB0eXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2UgPSBudWxsOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgRFREX0dFTkVSSUMgOgotCQkJCWluc3RhbmNlID0gbmV3IEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L1JlZ2lvbkl0ZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvUmVnaW9uSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5MWIyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvUmVnaW9uSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIFJlZ2lvbkl0ZXJhdG9yIHsKLQotCXByaXZhdGUgaW50IGN1cnJlbnRJbmRleDsKLQotCS8vIHByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZTsKLQlwcml2YXRlIElUZXh0UmVnaW9uTGlzdCByZWdpb25zOwotCS8vIHByaXZhdGUgaW50IHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQ7Ci0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBzdGFydFJlZ2lvbiwgZW5kUmVnaW9uOwotCi0JcHVibGljIFJlZ2lvbkl0ZXJhdG9yKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQl0aGlzKG5vZGUsIG5vZGUuZ2V0U3RhcnQoKSwgbm9kZS5nZXRFbmQoKSk7Ci0JfQotCi0JcHVibGljIFJlZ2lvbkl0ZXJhdG9yKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSwgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgZW5kT2Zmc2V0KSB7Ci0JCXJlZ2lvbnMgPSBub2RlLmdldFJlZ2lvbnMoKTsKLQkJc3RhcnRSZWdpb24gPSBub2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0T2Zmc2V0KTsKLQkJZW5kUmVnaW9uID0gbm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChlbmRPZmZzZXQgLSAxKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHN0YXJ0UmVnaW9uID09IHJlZ2lvbikgewotCQkJCWN1cnJlbnRJbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUmVnaW9uSXRlcmF0b3IoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJdGhpcy5yZWdpb25zID0gcmVnaW9uczsKLQkJc3RhcnRSZWdpb24gPSByZWdpb25zLmdldCgwKTsKLQkJZW5kUmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJY3VycmVudEluZGV4ID0gMDsKLQkJLy8gdGhpcyhub2RlLCBub2RlLmdldFN0YXJ0KCksIG5vZGUuZ2V0RW5kKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCWlmIChjdXJyZW50SW5kZXggPCByZWdpb25zLnNpemUoKSkgewotCQkJcmV0dXJuIGN1cnJlbnRJbmRleCA8PSByZWdpb25zLmluZGV4T2YoZW5kUmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCWlmIChjdXJyZW50SW5kZXggPj0gMCkgewotCQkJcmV0dXJuIGN1cnJlbnRJbmRleCA+PSByZWdpb25zLmluZGV4T2Yoc3RhcnRSZWdpb24pOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gbmV4dCgpIHsKLQkJaWYgKGhhc05leHQoKSkgewotCQkJcmV0dXJuIHJlZ2lvbnMuZ2V0KGN1cnJlbnRJbmRleCsrKTsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBwcmV2aW91cygpIHsKLQkJaWYgKGhhc1ByZXZpb3VzKCkpIHsKLQkJCXJldHVybiByZWdpb25zLmdldCgtLWN1cnJlbnRJbmRleCk7Ci0JCX0KLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JEVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVkYTA2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnRleHQuSURURFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnM7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yRFREIGV4dGVuZHMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciB7Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIjZ2V0RGVmYXVsdCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIElEVERQYXJ0aXRpb25zLkRURF9ERUZBVUxUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciNpbml0TGVnYWxDb250ZW50VHlwZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRMZWdhbENvbnRlbnRUeXBlcygpIHsKLQkJZlN1cHBvcnRlZFR5cGVzID0gbmV3IFN0cmluZ1tde0lEVERQYXJ0aXRpb25zLkRURF9ERUZBVUxULCBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT059OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL0RURFRva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvRFREVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YmI0OTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvRFREVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4zLjUgb24gMy8xNC8wNSA5OjM3IFBNICovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50b2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotCi0vKiogCi0gKiBHZW5lcmF0ZSB3aXRoICJkdGRza2VsZXRvbiIuCi0gKgotICogSXQgcmVtb3ZlcyBzb21lIHVudXNlZCBmaWVsZHMgYW5kIGF2b2lkcyBzb21lIGNvbXBpbGVyIHdhcm5pbmdzIAotICovCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmpmbGV4LmRlLyI+SkZsZXg8L2E+IDEuMy41Ci0gKiBvbiAzLzE0LzA1IDk6MzcgUE0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovRDovZWNsaXBzZS53dHAvd29ya3NwYWNlL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9kdGQuZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEVERUb2tlbml6ZXIgewotCi0gIC8qKiBUaGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBpbml0aWFsIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0JVRkZFUlNJWkUgPSAxNjM4NDsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgQVRUUklCVVRFX0VOVU1FUkFUSU9OID0gMTM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IE5PVEFUSU9OX05BTUUgPSA2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFTEVNRU5UX0NISUxEID0gMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRU5USVRZX0NPTlRFTlQgPSA0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBDT01NRU5UX0NPTlRFTlQgPSA4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBBVFRMSVNUX05BTUUgPSA5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFWFRFUk5BTElEX0NPTlRFTlQgPSA3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFTEVNRU5UX0NPTlRFTlQgPSAxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFTEVNRU5UX01JWEVEID0gMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRUxFTUVOVF9NSVhFRF9PUl9DSElMRCA9IDE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEFUVFJJQlVURV9DT05URU5UID0gMTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEVOVElUWV9OQU1FID0gMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgQVRUUklCVVRFX0RFRkFVTFQgPSAxMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRUxFTUVOVF9OQU1FID0gMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgTkRBVEFfQ09OVEVOVCA9IDU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEFUVExJU1RfQ09OVEVOVCA9IDEwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBOT0RFID0gMTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDEwXDBcMVwwXDFcNVwxXDNcMVwwXDFcMFwxXDJcMjJcMFwxXDVcMVw2IisKLSAgICAiXDFcMVwxXDM3XDFcMFwxXDIzXDFcMFwxXDQ2XDFcNDJcMVw0M1wxXDRcMVw3IisKLSAgICAiXDFcNDVcMVwxMlwxXDBcMVwwXDEyXDBcMVwwXDFcMTBcMVwxMVwxXDBcMVwxMyIrCi0gICAgIlwxXDRcMVwwXDFcMjVcMVwzMVwxXDMyXDFcMzNcMVwxNFwxXDM1XDJcMFwxXDIxIisKLSAgICAiXDFcMFwxXDM2XDFcMTVcMVwxNlwxXDE3XDFcMjRcMVwyN1wxXDQwXDFcMzRcMVwyNiIrCi0gICAgIlwxXDIwXDFcMzBcMlwwXDFcNDFcMVwyMlwxXDBcMVwwXDFcMFwyXDBcMVwwIisKLSAgICAiXDFcMFwzMlwwXDFcMFwxXDQ0XHVmZjgzXDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5Y21hcCA9IHl5X3VucGFja19jbWFwKHl5Y21hcF9wYWNrZWQpOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBhIHN0YXRlIHRvIGEgcm93IGluZGV4IGluIHRoZSB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXlfcm93TWFwIFtdID0geyAKLSAgICAgICAgMCwgICAgMzksICAgIDc4LCAgIDExNywgICAxNTYsICAgMTk1LCAgIDIzNCwgICAyNzMsICAgMzEyLCAgIDM1MSwgCi0gICAgICAzOTAsICAgNDI5LCAgIDQ2OCwgICA1MDcsICAgNTQ2LCAgIDU4NSwgICA2MjQsICAgIDM5LCAgICAzOSwgICAgMzksIAotICAgICAgNjYzLCAgIDcwMiwgICA3NDEsICAgNzgwLCAgIDgxOSwgICAgMzksICAgIDM5LCAgIDg1OCwgICA4OTcsICAgIDM5LCAKLSAgICAgICAzOSwgICA5MzYsICAgOTM2LCAgIDk3NSwgIDEwMTQsICAxMDUzLCAgMTA5MiwgIDExMzEsICAxMTcwLCAgMTIwOSwgCi0gICAgIDEyNDgsICAxMjg3LCAgMTMyNiwgIDEzNjUsICAxNDA0LCAgMTQ0MywgICAgMzksICAxNDgyLCAgMTUyMSwgIDE1NjAsIAotICAgICAxNTk5LCAgMTYzOCwgICAgMzksICAxNjc3LCAgMTcxNiwgIDE3NTUsICAxNzk0LCAgMTgzMywgIDE4NzIsICAgIDM5LCAKLSAgICAgICAzOSwgIDE5MTEsICAxOTUwLCAgMTk4OSwgIDIwMjgsICAyMDY3LCAgMjEwNiwgICAgMzksICAgIDM5LCAgICAzOSwgCi0gICAgIDIxNDUsICAyMTg0LCAgMjIyMywgIDIyNjIsICAyMzAxLCAgMjM0MCwgIDIzNzksICAgODk3LCAgMjQxOCwgICA5NzUsIAotICAgICAyNDU3LCAgMjQ5NiwgIDI1MzUsICAyNTc0LCAgIDk3NSwgIDI2MTMsICAyNjUyLCAgMjY5MSwgIDI3MzAsICAxNTYwLCAKLSAgICAgMjc2OSwgIDI4MDgsICAyODQ3LCAgMjg4NiwgIDI5MjUsICAyOTY0LCAgMzAwMywgIDMwNDIsICAzMDgxLCAgMzEyMCwgCi0gICAgIDE5NTAsICAzMTU5LCAgMzE5OCwgIDMyMzcsICAzMjc2LCAgMzMxNSwgIDE5NTAsICAgIDM5LCAgMzM1NCwgIDMzOTMsIAotICAgICAzNDMyLCAgICAzOSwgIDM0NzEsICAzNTEwLCAgMzU0OSwgICAgMzksICAzNTg4LCAgMzYyNywgICAgMzksICAzNjY2LCAKLSAgICAgMzcwNSwgIDM3NDQsICAgIDM5LCAgICAzOSwgIDM3ODMsICAzODIyLCAgMzg2MSwgIDM5MDAsICAzOTM5LCAgMzk3OCwgCi0gICAgIDQwMTcsICA0MDU2LCAgICAzOSwgIDQwOTUsICA0MTM0LCAgNDE3MywgICAgMzksICA0MjEyLCAgNDI1MSwgIDQyOTAsIAotICAgICA0MzI5LCAgNDM2OCwgIDQ0MDcsICA0NDQ2LCAgNDQ4NSwgIDQ1MjQsICA0NTYzLCAgNDYwMiwgIDQ2NDEsICA0NjgwLCAKLSAgICAgNDcxOSwgIDQ3NTgsICA0Nzk3LCAgNDgzNiwgIDQ4NzUsICA0OTE0LCAgNDk1MywgIDQ5OTIsICA1MDMxLCAgNTA3MCwgCi0gICAgIDUxMDksICA1MTQ4LCAgNTE4NywgIDUyMjYsICA1MjY1LCAgNTMwNCwgIDUzNDMsICAgOTc1LCAgNTM4MiwgIDU0MjEsIAotICAgICA1NDYwLCAgNTQ5OSwgIDU1MzgsICA1NTc3LCAgMTU2MCwgIDU2MTYsICA1NjU1LCAgNTY5NCwgIDU3MzMsICA1NzcyLCAKLSAgICAgNTgxMSwgIDU4NTAsICAgNTQ2LCAgNTg4OSwgIDU5MjgsICA1OTY3LCAgNjAwNiwgICA5NzUsICAgOTc1LCAgIDk3NSwgCi0gICAgIDYwNDUsICAxNTYwLCAgNjA4NCwgIDYxMjMsICAxNTYwLCAgNjE2MiwgIDYyMDEsICA2MjQwLCAgMTk1MCwgICA1NDYsIAotICAgICA2Mjc5LCAgIDU0NiwgICA4MTksICA2MzE4LCAgNjM1NywgIDYzOTYsICA2NDM1LCAgNjQ3NCwgIDY1MTMsICAgNTQ2LCAKLSAgICAgNjU1MiwgIDE1NjAsICAxNTYwLCAgMTU2MCwgIDE5NTAsICA2NTkxLCAgICAzOSwgIDE5NTAKLSAgfTsKLQotICAvKiogCi0gICAqIFRoZSBwYWNrZWQgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBIChwYXJ0IDApCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXlfcGFja2VkMCA9IAotICAgICJcMlwxN1wyXDIwXDFcMTdcMVwyMFwxXDIxXDFcMTdcMVwyMlwxXDIzIisKLSAgICAiXDFcMTdcMVwyNFwxXDI1XDJcMTdcMVwyNlwzXDE3XDFcMjdcMVwxNyIrCi0gICAgIlwxXDMwXDIxXDE3XDQ3XDBcMlwzMVwyXDIwXDFcMzJcMVwyMFwxXDAiKwotICAgICJcMVwzMlwxXDMxXDFcMzNcMVwzMVwxXDMzXDIzXDMxXDFcMzRcMlwzMSIrCi0gICAgIlwxXDM1XDFcMzZcMlwzN1wxXDMxXDJcNDBcMlwyMFwxXDBcMVwyMCIrCi0gICAgIlwzXDQwXDFcMzNcMVw0MFwxXDMzXDdcNDBcMVw0MVwxNlw0MFw0XDAiKwotICAgICJcMVw0MFwxXDQyXDFcNDNcMlwyMFwxXDQyXDFcMjBcM1w0MlwxXDMzIisKLSAgICAiXDFcNDJcMVwzM1wxMlw0MlwxXDQ0XDFcNDVcMTZcNDJcMVw0NlwyXDQ3IisKLSAgICAiXDJcMjBcMVw0N1wxXDIwXDNcNDdcMVwzM1wxXDQ3XDFcMzNcMzNcNDciKwotICAgICJcMlw1MFwyXDIwXDFcMFwxXDIwXDJcMFwxXDUwXDFcMzNcMVw1MCIrCi0gICAgIlwxXDMzXDI2XDUwXDRcMFwxXDUwXDFcNDJcMVw0M1wyXDIwXDFcNDIiKwotICAgICJcMVwyMFwzXDQyXDFcMzNcMVw0MlwxXDMzXDNcNDJcMVw1MVw2XDQyIisKLSAgICAiXDFcNTJcMVw1M1wxNlw0MlwxXDQ2XDJcNTRcMlw1NVwxXDU0XDFcNTUiKwotICAgICJcNFw1NFwxXDU2XDFcNTdcMzNcNTRcMlw2MFwyXDIwXDFcNDJcMVwyMCIrCi0gICAgIlwyXDQyXDFcNjBcMVwzM1wxXDYwXDFcMzNcMjZcNjBcNFw0MlwxXDYwIisKLSAgICAiXDJcNjFcMlwyMFwxXDQyXDFcMjBcMlw0MlwxXDYxXDFcMzNcMVw2MSIrCi0gICAgIlwxXDMzXDI2XDYxXDRcNDJcMVw2MVwxXDYyXDFcNjNcMVw2NFwxXDY1IisKLSAgICAiXDFcNjJcMVw2NlwzXDYyXDFcMzNcMVw2MlwxXDMzXDFcNjdcMlw2MiIrCi0gICAgIlwxXDcwXDFcNjJcMVw3MVwxMFw2MlwxXDcyXDRcNjJcMVw3M1wyXDYyIisKLSAgICAiXDFcNzRcMlw3NVwxXDYyXDFcNzZcMVw3N1wxXDEwMFwyXDIwXDFcNzciKwotICAgICJcMVwyMFwzXDc3XDFcMzNcMVw3N1wxXDMzXDIzXDc3XDFcMTAxXDZcNzciKwotICAgICJcMVwxMDJcMlwxMDNcMlwyMFwxXDEwM1wxXDIwXDNcMTAzXDFcMzNcMVwxMDMiKwotICAgICJcMVwzM1wyNlwxMDNcMVwxMDRcMVwxMDVcMVwxMDZcMlwxMDNcMlwxN1wyXDAiKwotICAgICJcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcN1wxN1wxXDAiKwotICAgICJcMjNcMTdcMlwwXDJcMjBcMVwwXDFcMjBcNTNcMFwxXDEwN1wzNFwwIisKLSAgICAiXDJcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwIisKLSAgICAiXDFcMTdcMVwxMTBcMVwxN1wxXDExMVwzXDE3XDFcMFwyNVwxN1wyXDAiKwotICAgICJcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcN1wxN1wxXDAiKwotICAgICJcMVwxMTJcMjJcMTdcMlwxMTNcMlwwXDFcMTEzXDJcMFwxXDExM1wyXDAiKwotICAgICJcMVwxMTNcMVwwXDdcMTEzXDFcMFwyM1wxMTNcMlwxN1wyXDBcMVwxNyIrCi0gICAgIlwyXDBcMVwxN1wyXDBcMVwxN1wxXDBcNFwxN1wxXDExNFwyXDE3IisKLSAgICAiXDFcMFwyM1wxN1wyXDMxXDZcMFwxXDMxXDFcMFwxXDMxXDFcMCIrCi0gICAgIlwyNlwzMVw0XDBcM1wzMVw2XDBcMVwzMVwxXDBcMVwzMVwxXDAiKwotICAgICJcMTNcMzFcMVwxMTVcMTJcMzFcNFwwXDFcMzFcMlwwXDJcMTE2XDFcMCIrCi0gICAgIlwxXDExNlwzMVwwXDFcMTE3XDdcMFwyXDQwXDRcMFwzXDQwXDFcMCIrCi0gICAgIlwxXDQwXDFcMFwyNlw0MFw0XDBcMVw0MFwyXDQyXDJcMFwxXDQyIisKLSAgICAiXDFcMFwzXDQyXDFcMFwxXDQyXDFcMFwzM1w0MlwxXDQzXDFcMTIwIisKLSAgICAiXDJcMTIxXDFcNDNcMVwxMjFcM1w0M1wxXDEyMVwxXDQzXDFcMTIxXDMzXDQzIisKLSAgICAiXDJcNDJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwIisKLSAgICAiXDZcNDJcMVwxMjJcMjZcNDJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwIisKLSAgICAiXDFcNDJcMVwwXDE0XDQyXDFcMTIzXDE2XDQyXDJcNDZcMlwxMjRcMVw0NiIrCi0gICAgIlwxXDEyNFwzXDQ2XDFcMTI0XDFcNDZcMVwxMjRcMzJcNDZcMVwxMjVcMlw0NyIrCi0gICAgIlwyXDBcMVw0N1wxXDBcM1w0N1wxXDBcMVw0N1wxXDBcMzNcNDciKwotICAgICJcMlw1MFw2XDBcMVw1MFwxXDBcMVw1MFwxXDBcMjZcNTBcNFwwIisKLSAgICAiXDFcNTBcMlw0MlwyXDBcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MiIrCi0gICAgIlwxXDBcMTdcNDJcMVwxMjZcMTVcNDJcMlwwXDFcNDJcMVwwXDNcNDIiKwotICAgICJcMVwwXDFcNDJcMVwwXDZcNDJcMVwxMjdcMjZcNDJcMlwwXDFcNDIiKwotICAgICJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDE0XDQyXDFcMTMwXDE2XDQyIisKLSAgICAiXDEyXDU0XDJcMFwzNVw1NFwyXDU1XDFcNTRcMVw1NVw0XDU0XDJcMCIrCi0gICAgIlwzM1w1NFwxMlwwXDFcMTMxXDM0XDBcMlw2MFwyXDBcMVw0MlwxXDAiKwotICAgICJcMlw0MlwxXDYwXDFcMFwxXDYwXDFcMFwyNlw2MFw0XDQyXDFcNjAiKwotICAgICJcMlw2MVwyXDBcMVw0MlwxXDBcMlw0MlwxXDYxXDFcMFwxXDYxIisKLSAgICAiXDFcMFwyNlw2MVw0XDQyXDFcNjFcMlw2MlwyXDBcMVw2MlwxXDAiKwotICAgICJcM1w2MlwxXDBcMVw2MlwxXDBcMjZcNjJcM1wwXDJcNjJcMVw2MyIrCi0gICAgIlwxXDEzMlwyXDEzM1wxXDYzXDFcMTMzXDNcNjNcMVwxMzNcMVw2M1wxXDEzMyIrCi0gICAgIlwyNlw2M1wzXDEzM1wyXDYzXDNcMFwxXDY1XDUwXDBcMVw2Nlw0MVwwIisKLSAgICAiXDJcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwIisKLSAgICAiXDNcNjJcMVwxMzRcMjJcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwIisKLSAgICAiXDNcNjJcMVwwXDFcNjJcMVwwXDJcNjJcMVwxMzVcNVw2MlwxXDEzNiIrCi0gICAgIlwxNVw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDAiKwotICAgICJcMVw2MlwxXDBcMTdcNjJcMVwxMzdcNlw2MlwzXDBcNFw2MlwyXDAiKwotICAgICJcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMTdcNjJcMVwxNDAiKwotICAgICJcNlw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDAiKwotICAgICJcMVw2MlwxXDBcNVw2MlwxXDE0MVwxMlw2MlwxXDE0MlwxXDE0M1w0XDYyIisKLSAgICAiXDNcMFwyXDYyXDJcNzZcMlwxNDRcMVw3NlwxXDE0NFwzXDc2XDFcMTQ0IisKLSAgICAiXDFcNzZcMVwxNDRcMjZcNzZcM1wxNDRcMVw3NlwxXDEzMlwyXDc3XDJcMCIrCi0gICAgIlwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3XDFcMFwzM1w3N1wxXDEwMCIrCi0gICAgIlwxXDE0NVwyXDE0NlwxXDEwMFwxXDE0NlwzXDEwMFwxXDE0NlwxXDEwMFwxXDE0NiIrCi0gICAgIlwzM1wxMDBcMlw3N1wyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3NyIrCi0gICAgIlwxXDBcNVw3N1wxXDE0N1wxMlw3N1wxXDE1MFwxXDE1MVwxMVw3N1wyXDEwMiIrCi0gICAgIlwyXDE1MlwxXDEwMlwxXDE1MlwzXDEwMlwxXDE1MlwxXDEwMlwxXDE1MlwzMlwxMDIiKwotICAgICJcMVwxNTNcMlwxMDNcMlwwXDFcMTAzXDFcMFwzXDEwM1wxXDBcMVwxMDMiKwotICAgICJcMVwwXDI2XDEwM1wzXDBcMlwxMDNcMTJcMFwxXDE1NFwzNFwwXDJcMTciKwotICAgICJcMlwwXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDFcMTU1IisKLSAgICAiXDZcMTdcMVwwXDI1XDE3XDJcMFwxXDE3XDJcMFwxXDE3XDJcMCIrCi0gICAgIlwxXDE3XDFcMFw0XDE3XDFcMTU2XDJcMTdcMVwwXDI1XDE3XDJcMCIrCi0gICAgIlwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw0XDE3XDFcMTU3IisKLSAgICAiXDJcMTdcMVwwXDIzXDE3XDJcMTEzXDJcMFwxXDExM1wyXDBcMVwxMTMiKwotICAgICJcMVwxNjBcMVwwXDFcMTEzXDFcMFw3XDExM1wxXDBcMjNcMTEzXDJcMTciKwotICAgICJcMlwwXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDRcMTciKwotICAgICJcMVwxNjFcMlwxN1wxXDBcMjNcMTdcMlwzMVw2XDBcMVwzMVwxXDAiKwotICAgICJcMVwzMVwxXDBcMTZcMzFcMVwxNjJcN1wzMVw0XDBcMVwzMVwyN1wwIisKLSAgICAiXDFcMTYzXDE3XDBcMVwxMjFcMVwxNjRcNDVcMTIxXDJcNDJcMlwwXDFcNDIiKwotICAgICJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDEyXDQyXDFcMTY1XDIyXDQyIisKLSAgICAiXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyXDFcMFwxNVw0MiIrCi0gICAgIlwxXDE2NlwxNVw0Mlw0NlwxMjRcMVwxNjdcMlw0MlwyXDBcMVw0MlwxXDAiKwotICAgICJcM1w0MlwxXDBcMVw0MlwxXDBcMTFcNDJcMVwxNzBcMjNcNDJcMlwwIisKLSAgICAiXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDEyXDQyXDFcMTcxIisKLSAgICAiXDIyXDQyXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyXDFcMCIrCi0gICAgIlwxNVw0MlwxXDE3MlwxNVw0MlwxM1wwXDFcMTczXDMzXDBcMVwxMzNcMVwxNzQiKwotICAgICJcNDVcMTMzXDJcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcMVwwXDRcNjJcMVwxNzVcMjFcNjJcM1wwXDRcNjJcMlwwXDFcNjIiKwotICAgICJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDRcNjJcMVwxNzZcMjFcNjIiKwotICAgICJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcMVwwXDRcNjJcMVwxNzdcMjFcNjJcM1wwXDRcNjJcMlwwXDFcNjIiKwotICAgICJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDIwXDYyXDFcMjAwXDVcNjIiKwotICAgICJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcMVwwXDExXDYyXDFcMjAxXDE0XDYyXDNcMFw0XDYyXDJcMFwxXDYyIisKLSAgICAiXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFwyXDYyXDFcMjAyXDIzXDYyIisKLSAgICAiXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyIisKLSAgICAiXDFcMFwxXDIwM1wyNVw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDAiKwotICAgICJcM1w2MlwxXDBcMVw2MlwxXDBcNVw2MlwxXDIwNFwyMFw2MlwzXDAiKwotICAgICJcMlw2Mlw0NlwxNDRcMVwxNzRcMVwxNDZcMVwyMDVcNDVcMTQ2XDJcNzdcMlwwIisKLSAgICAiXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzdcMVwwXDJcNzdcMVwyMDYiKwotICAgICJcMzJcNzdcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzdcMVwwIisKLSAgICAiXDFcMjA3XDM0XDc3XDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3IisKLSAgICAiXDFcMFw1XDc3XDFcMjEwXDI1XDc3XDQ2XDE1MlwxXDIxMVwyXDE3XDJcMCIrCi0gICAgIlwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFwyXDE3XDFcMjEyIisKLSAgICAiXDRcMTdcMVwwXDI1XDE3XDJcMFwxXDE3XDJcMFwxXDE3XDJcMCIrCi0gICAgIlwxXDE3XDFcMFw1XDE3XDFcMjEzXDFcMTdcMVwwXDI1XDE3XDJcMCIrCi0gICAgIlwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw3XDE3XDFcMCIrCi0gICAgIlwxXDE3XDFcMjE0XDIzXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDJcMCIrCi0gICAgIlwxXDE3XDFcMFwxXDE3XDFcMjE1XDVcMTdcMVwwXDIzXDE3XDJcMzEiKwotICAgICJcNlwwXDFcMzFcMVwwXDFcMzFcMVwwXDE3XDMxXDFcMjE2XDZcMzEiKwotICAgICJcNFwwXDFcMzFcMzJcMFwxXDIxN1wxNFwwXDJcNDJcMlwwXDFcNDIiKwotICAgICJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDRcNDJcMVwyMjBcMzBcNDIiKwotICAgICJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDFcNDIiKwotICAgICJcMVwyMjFcMzNcNDJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDIiKwotICAgICJcMVwwXDRcNDJcMVwyMjJcMzBcNDJcMlwwXDFcNDJcMVwwXDNcNDIiKwotICAgICJcMVwwXDFcNDJcMVwwXDRcNDJcMVwyMjNcMzBcNDJcMlwwXDFcNDIiKwotICAgICJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDFcNDJcMVwyMjRcMzFcNDIiKwotICAgICJcMlw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDAiKwotICAgICJcNVw2MlwxXDIyNVwyMFw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDAiKwotICAgICJcM1w2MlwxXDBcMVw2MlwxXDBcMTBcNjJcMVwyMjZcMTVcNjJcM1wwIisKLSAgICAiXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwIisKLSAgICAiXDExXDYyXDFcMjI3XDE0XDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMCIrCi0gICAgIlwzXDYyXDFcMFwxXDYyXDFcMFwxXDIzMFwyNVw2MlwzXDBcNFw2MiIrCi0gICAgIlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcNFw2MiIrCi0gICAgIlwxXDIzMVwyMVw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MiIrCi0gICAgIlwxXDBcMVw2MlwxXDBcMTNcNjJcMVwyMzJcMTJcNjJcM1wwXDRcNjIiKwotICAgICJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDI0XDYyIisKLSAgICAiXDFcMjMzXDFcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjIiKwotICAgICJcMVwwXDFcNjJcMVwwXDI1XDYyXDFcMjM0XDNcMFwyXDYyXDJcNzciKwotICAgICJcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzdcMVwwXDEzXDc3IisKLSAgICAiXDFcMjM1XDIxXDc3XDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3IisKLSAgICAiXDFcMFwyNFw3N1wxXDIzNlwxMFw3N1wyXDBcMVw3N1wxXDBcM1w3NyIrCi0gICAgIlwxXDBcMVw3N1wxXDBcMjVcNzdcMVwyMzdcNVw3N1wyXDE3XDJcMCIrCi0gICAgIlwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFwxXDI0MFw2XDE3IisKLSAgICAiXDFcMFwyNVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wyXDBcMVwxNyIrCi0gICAgIlwxXDBcNFwxN1wxXDI0MVwyXDE3XDFcMFwyNVwxN1wyXDBcMVwxNyIrCi0gICAgIlwyXDBcMVwxN1wyXDBcMVwxN1wxXDBcNFwxN1wxXDI0MlwyXDE3IisKLSAgICAiXDFcMFwyNVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wyXDBcMVwxNyIrCi0gICAgIlwxXDBcNVwxN1wxXDI0M1wxXDE3XDFcMFwyM1wxN1wyXDMxXDZcMCIrCi0gICAgIlwxXDMxXDFcMFwxXDMxXDFcMFwxMVwzMVwxXDI0NFwxNFwzMVw0XDAiKwotICAgICJcMVwzMVwzM1wwXDFcMjQ1XDEzXDBcMlw0MlwyXDBcMVw0MlwxXDAiKwotICAgICJcM1w0MlwxXDBcMVw0MlwxXDBcMVwyNDZcMzRcNDJcMlwwXDFcNDIiKwotICAgICJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDVcNDJcMVwyNDdcMjdcNDIiKwotICAgICJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDExXDQyIisKLSAgICAiXDFcMjUwXDIzXDQyXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyIisKLSAgICAiXDFcMFwxXDI1MVwzNFw0MlwyXDBcMVw0MlwxXDBcM1w0MlwxXDAiKwotICAgICJcMVw0MlwxXDBcNVw0MlwxXDI1MlwyNVw0MlwyXDYyXDJcMFwxXDYyIisKLSAgICAiXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFw0XDYyXDFcMjUzXDIxXDYyIisKLSAgICAiXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyIisKLSAgICAiXDFcMFwyMlw2MlwxXDI1NFwzXDYyXDNcMFw0XDYyXDJcMFwxXDYyIisKLSAgICAiXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFw0XDYyXDFcMjU1XDIxXDYyIisKLSAgICAiXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyIisKLSAgICAiXDFcMFwyMVw2MlwxXDI1Nlw0XDYyXDNcMFw0XDYyXDJcMFwxXDYyIisKLSAgICAiXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFwxMVw2MlwxXDI1N1wxNFw2MiIrCi0gICAgIlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MiIrCi0gICAgIlwxXDBcMVw2MlwxXDI2MFwyNFw2MlwzXDBcNFw2MlwyXDBcMVw2MiIrCi0gICAgIlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMTRcNjJcMVwyNjFcMTFcNjIiKwotICAgICJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcMVwwXDFcMjYyXDI1XDYyXDNcMFwyXDYyXDJcNzdcMlwwXDFcNzciKwotICAgICJcMVwwXDNcNzdcMVwwXDFcNzdcMVwwXDFcNzdcMVwyNjNcMzNcNzciKwotICAgICJcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzdcMVwwXDE0XDc3IisKLSAgICAiXDFcMjY0XDIwXDc3XDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3IisKLSAgICAiXDFcMFwxXDI2NVwzMlw3N1wyXDE3XDJcMFwxXDE3XDJcMFwxXDE3IisKLSAgICAiXDJcMFwxXDE3XDFcMFwzXDE3XDFcMjY2XDNcMTdcMVwwXDI1XDE3IisKLSAgICAiXDJcMFwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw2XDE3IisKLSAgICAiXDFcMjY3XDFcMFwyNVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wyXDAiKwotICAgICJcMVwxN1wxXDBcNVwxN1wxXDI3MFwxXDE3XDFcMFwyNVwxN1wyXDAiKwotICAgICJcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcN1wxN1wxXDAiKwotICAgICJcMlwxN1wxXDI3MVwyMFwxN1wyXDMxXDZcMFwxXDMxXDFcMFwxXDMxIisKLSAgICAiXDFcMFw0XDMxXDFcMjcyXDIxXDMxXDRcMFwxXDMxXDI1XDBcMVwyNzMiKwotICAgICJcMjFcMFwyXDQyXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyIisKLSAgICAiXDFcMFwyXDQyXDFcMjc0XDMyXDQyXDJcMFwxXDQyXDFcMFwzXDQyIisKLSAgICAiXDFcMFwxXDQyXDFcMFwxNlw0MlwxXDI3NFwxNlw0MlwyXDBcMVw0MiIrCi0gICAgIlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMlw0MlwxXDI3NVwzMlw0MiIrCi0gICAgIlwyXDBcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMTZcNDIiKwotICAgICJcMVwyNzZcMTRcNDJcMlw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDAiKwotICAgICJcMVw2MlwxXDBcNVw2MlwxXDI3N1wxXDMwMFwxN1w2MlwzXDBcNFw2MiIrCi0gICAgIlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMVwzMDEiKwotICAgICJcMjVcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwIisKLSAgICAiXDFcNjJcMVwwXDVcNjJcMVwzMDJcMjBcNjJcM1wwXDRcNjJcMlwwIisKLSAgICAiXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDEyXDYyXDFcMzAzIisKLSAgICAiXDEzXDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMCIrCi0gICAgIlwxXDYyXDFcMFw1XDYyXDFcMjM0XDIwXDYyXDNcMFw0XDYyXDJcMCIrCi0gICAgIlwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFw1XDYyXDFcMzA0IisKLSAgICAiXDIwXDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMCIrCi0gICAgIlwxXDYyXDFcMFwxN1w2MlwxXDEzMlw2XDYyXDNcMFwyXDYyXDJcNzciKwotICAgICJcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzdcMVwwXDVcNzciKwotICAgICJcMVwzMDVcMjdcNzdcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzciKwotICAgICJcMVwwXDVcNzdcMVwzMDZcMjdcNzdcMlwwXDFcNzdcMVwwXDNcNzciKwotICAgICJcMVwwXDFcNzdcMVwwXDE3XDc3XDFcMzA3XDEzXDc3XDJcMTdcMlwwIisKLSAgICAiXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDRcMTdcMVwzMTAiKwotICAgICJcMlwxN1wxXDBcMjVcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMlwwIisKLSAgICAiXDFcMTdcMVwwXDdcMTdcMVwwXDFcMzExXDI0XDE3XDJcMFwxXDE3IisKLSAgICAiXDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw0XDE3XDFcMzEyXDJcMTciKwotICAgICJcMVwwXDIzXDE3XDJcMzFcNlwwXDFcMzFcMVwwXDFcMzFcMVwwIisKLSAgICAiXDExXDMxXDFcMzEzXDE0XDMxXDRcMFwxXDMxXDIwXDBcMVwzMTRcMjZcMCIrCi0gICAgIlwyXDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMCIrCi0gICAgIlwxXDMxNVwyNVw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MiIrCi0gICAgIlwxXDBcMVw2MlwxXDBcM1w2MlwxXDMxNlwyMlw2MlwzXDBcNFw2MiIrCi0gICAgIlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMTBcNjIiKwotICAgICJcMVwzMTdcMTVcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjIiKwotICAgICJcMVwwXDFcNjJcMVwwXDIwXDYyXDFcMjM0XDVcNjJcM1wwXDJcNjIiKwotICAgICJcMlw3N1wyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3N1wxXDAiKwotICAgICJcMVwzMjBcMzRcNzdcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzciKwotICAgICJcMVwwXDIwXDc3XDFcMzIxXDEyXDc3XDJcMTdcMlwwXDFcMTdcMlwwIisKLSAgICAiXDFcMTdcMlwwXDFcMTdcMVwwXDNcMTdcMVwzMjJcM1wxN1wxXDAiKwotICAgICJcMjNcMTdcMjVcMFwxXDMyM1wyMVwwXDJcNjJcMlwwXDFcNjJcMVwwIisKLSAgICAiXDNcNjJcMVwwXDFcNjJcMVwwXDEyXDYyXDFcMzI0XDEzXDYyXDNcMCIrCi0gICAgIlw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMCIrCi0gICAgIlwxMlw2MlwxXDMyNVwxM1w2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDAiKwotICAgICJcM1w2MlwxXDBcMVw2MlwxXDBcM1w2MlwxXDMyNlwyMlw2MlwzXDAiKwotICAgICJcMlw2MlwyXDc3XDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3IisKLSAgICAiXDFcMFwxN1w3N1wxXDMyN1wxNVw3N1wyXDBcMVw3N1wxXDBcM1w3NyIrCi0gICAgIlwxXDBcMVw3N1wxXDBcMVwzMzBcMzJcNzdcMlwwXDJcMzIzXDFcMCIrCi0gICAgIlwxXDMyM1wzNVwwXDFcMzMxXDNcMFwyXDc3XDJcMFwxXDc3XDFcMCIrCi0gICAgIlwzXDc3XDFcMFwxXDc3XDFcMFwxN1w3N1wxXDMzMlwxM1w3NyI7Ci0KLSAgLyoqIAotICAgKiBUaGUgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXl0cmFucyBbXSA9IHl5X3VucGFjaygpOwotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOwotICBmaW5hbCBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqCi0gICAqIFlZX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgWVlfQVRUUklCVVRFW10gPSB7Ci0gICAgIDAsICA4LCAgMCwgIDAsICAxLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgOSwgIDksICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsICAxLCAgOSwgIDksICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICA5LCAgOSwgIDksICAwLCAgMSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMCwgIDAsICAxLCAKLSAgICAgMCwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDAsICAxLCAgOSwgIDEsICAxLCAgMSwgIDksIAotICAgICAxLCAgMSwgIDAsICA5LCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyW1lZX0JVRkZFUlNJWkVdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHl5X2VuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICBpbnQgeXljb2x1bW47IAotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBhdCB0aGUgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0JaW50IG5vZGVfY291bnQgPSAwOwotCVN0cmluZyBjdXJyZW50U3RyaW5nOwotCi0JcHJpdmF0ZSBUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gbmV3IFRva2VuKHR5cGUsIHl5dGV4dCgpLCB5eWxpbmUsIHl5Y2hhciArIHN0YXJ0T2Zmc2V0LCB5eWxlbmd0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIGludCBzdGFydE9mZnNldCA9IDA7Ci0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IG9mZnNldCkgewotCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpbmUoaW50IGxpbmUpIHsKLQkJdGhpcy55eWxpbmUgPSBsaW5lOwotCX0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBEVERUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnl5X3JlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgRFREVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIHNwbGl0LCBjb21wcmVzc2VkIERGQSB0cmFuc2l0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSB1bnBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBpbnQgW10geXlfdW5wYWNrKCkgewotICAgIGludCBbXSB0cmFucyA9IG5ldyBpbnRbNjYzMF07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0geXlfdW5wYWNrKHl5X3BhY2tlZDAsIG9mZnNldCwgdHJhbnMpOwotICAgIHJldHVybiB0cmFuczsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBERkEgdHJhbnNpdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGVudHJ5Ci0gICAqLwotICBwcml2YXRlIHN0YXRpYyBpbnQgeXlfdW5wYWNrKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSB0cmFucykgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICB2YWx1ZS0tOwotICAgICAgZG8gdHJhbnNbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eV91bnBhY2tfY21hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxMzApIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlZmlsbHMgdGhlIGlucHV0IGJ1ZmZlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgaWZmIHRoZXJlIHdhcyBuZXcgaW5wdXQuCi0gICAqIAotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9yZWZpbGwoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7Ci0KLSAgICBpZiAobnVtUmVhZCA8IDApIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOyAgCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLQotICAgIGlmICh5eV9yZWFkZXIgIT0gbnVsbCkKLSAgICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSBjdXJyZW50IHN0cmVhbSwgYW5kIHJlc2V0cyB0aGUKLSAgICogc2Nhbm5lciB0byByZWFkIGZyb20gYSBuZXcgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBBbGwgaW50ZXJuYWwgdmFyaWFibGVzIGFyZSByZXNldCwgdGhlIG9sZCBpbnB1dCBzdHJlYW0gCi0gICAqIDxiPmNhbm5vdDwvYj4gYmUgcmV1c2VkIChpbnRlcm5hbCBidWZmZXIgaXMgZGlzY2FyZGVkIGFuZCBsb3N0KS4KLSAgICogTGV4aWNhbCBzdGF0ZSBpcyBzZXQgdG8gPHR0PllZX0lOSVRJQUw8L3R0Pi4KLSAgICoKLSAgICogQHBhcmFtIHJlYWRlciAgIHRoZSBuZXcgaW5wdXQgc3RyZWFtIAotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXlyZXNldChqYXZhLmlvLlJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eWNsb3NlKCk7Ci0gICAgeXlfcmVhZGVyID0gcmVhZGVyOwotICAgIHl5X2F0RU9GICA9IGZhbHNlOwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQgPSAwOwotICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgPSB5eV9wdXNoYmFja1BvcyA9IDA7Ci0gICAgeXlsaW5lID0geXljaGFyID0geXljb2x1bW4gPSAwOwotICAgIHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiA8dHQ+cG9zPC90dD4gZnJvbSB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dC4gCi0gICAqIAotICAgKiBJdCBpcyBlcXVpdmFsZW50IHRvIHl5dGV4dCgpLmNoYXJBdChwb3MpLCBidXQgZmFzdGVyCi0gICAqCi0gICAqIEBwYXJhbSBwb3MgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgdG8gZmV0Y2guIAotICAgKiAgICAgICAgICAgIEEgdmFsdWUgZnJvbSAwIHRvIHl5bGVuZ3RoKCktMS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIHBvcwotICAgKi8KLSAgZmluYWwgcHVibGljIGNoYXIgeXljaGFyYXQoaW50IHBvcykgewotICAgIHJldHVybiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkK3Bvc107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEluIGEgd2VsbGZvcm1lZCBzY2FubmVyIChubyBvciBvbmx5IGNvcnJlY3QgdXNhZ2Ugb2YgCi0gICAqIHl5cHVzaGJhY2soaW50KSBhbmQgYSBtYXRjaC1hbGwgZmFsbGJhY2sgcnVsZSkgdGhpcyBtZXRob2QgCi0gICAqIHdpbGwgb25seSBiZSBjYWxsZWQgd2l0aCB0aGluZ3MgdGhhdCAiQ2FuJ3QgUG9zc2libHkgSGFwcGVuIi4KLSAgICogSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBzb21ldGhpbmcgaXMgc2VyaW91c2x5IHdyb25nCi0gICAqIChlLmcuIGEgSkZsZXggYnVnIHByb2R1Y2luZyBhIGZhdWx0eSBzY2FubmVyIGV0Yy4pLgotICAgKgotICAgKiBVc3VhbCBzeW50YXgvc2Nhbm5lciBsZXZlbCBlcnJvciBoYW5kbGluZyBzaG91bGQgYmUgZG9uZQotICAgKiBpbiBlcnJvciBmYWxsYmFjayBydWxlcy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIFN0cmluZyBtZXNzYWdlOwotICAgIHRyeSB7Ci0gICAgICBtZXNzYWdlID0gWVlfRVJST1JfTVNHW2Vycm9yQ29kZV07Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgbWVzc2FnZSA9IFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXTsKLSAgICB9Ci0KLSAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFl5dG9rZW4geXlsZXgoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHl5X2lucHV0OwotICAgIGludCB5eV9hY3Rpb247Ci0KLSAgICAvLyBjYWNoZWQgZmllbGRzOgotICAgIGludCB5eV9jdXJyZW50UG9zX2w7Ci0gICAgaW50IHl5X21hcmtlZFBvc19sOwotICAgIGludCB5eV9lbmRSZWFkX2wgPSB5eV9lbmRSZWFkOwotICAgIGNoYXIgW10geXlfYnVmZmVyX2wgPSB5eV9idWZmZXI7Ci0gICAgY2hhciBbXSB5eWNtYXBfbCA9IHl5Y21hcDsKLQotICAgIGludCBbXSB5eXRyYW5zX2wgPSB5eXRyYW5zOwotICAgIGludCBbXSB5eV9yb3dNYXBfbCA9IHl5X3Jvd01hcDsKLSAgICBieXRlIFtdIHl5X2F0dHJfbCA9IFlZX0FUVFJJQlVURTsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB5eV9tYXJrZWRQb3NfbCA9IHl5X21hcmtlZFBvczsKLQotICAgICAgeXljaGFyKz0geXlfbWFya2VkUG9zX2wteXlfc3RhcnRSZWFkOwotCi0gICAgICB5eV9hY3Rpb24gPSAtMTsKLQotICAgICAgeXlfY3VycmVudFBvc19sID0geXlfY3VycmVudFBvcyA9IAotICAgICAgICAgICAgICAgICAgICAgICB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3NfbDsKLSAgCi0gICAgICB5eV9zdGF0ZSA9IHl5X2xleGljYWxfc3RhdGU7Ci0KLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0gICAgICAgICAgaWYgKHl5X2N1cnJlbnRQb3NfbCA8IHl5X2VuZFJlYWRfbCkKLSAgICAgICAgICAgIHl5X2lucHV0ID0geXlfYnVmZmVyX2xbeXlfY3VycmVudFBvc19sKytdOwotICAgICAgICAgIGVsc2UgaWYgKHl5X2F0RU9GKSB7Ci0gICAgICAgICAgICB5eV9pbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9ucwotICAgICAgICAgICAgeXlfY3VycmVudFBvcyAgPSB5eV9jdXJyZW50UG9zX2w7Ci0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgICA9IHl5X21hcmtlZFBvc19sOwotICAgICAgICAgICAgYm9vbGVhbiBlb2YgPSB5eV9yZWZpbGwoKTsKLSAgICAgICAgICAgIC8vIGdldCB0cmFuc2xhdGVkIHBvc2l0aW9ucyBhbmQgcG9zc2libHkgbmV3IGJ1ZmZlcgotICAgICAgICAgICAgeXlfY3VycmVudFBvc19sICA9IHl5X2N1cnJlbnRQb3M7Ci0gICAgICAgICAgICB5eV9tYXJrZWRQb3NfbCAgID0geXlfbWFya2VkUG9zOwotICAgICAgICAgICAgeXlfYnVmZmVyX2wgICAgICA9IHl5X2J1ZmZlcjsKLSAgICAgICAgICAgIHl5X2VuZFJlYWRfbCAgICAgPSB5eV9lbmRSZWFkOwotICAgICAgICAgICAgaWYgKGVvZikgewotICAgICAgICAgICAgICB5eV9pbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgICBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgeXlfaW5wdXQgPSB5eV9idWZmZXJfbFt5eV9jdXJyZW50UG9zX2wrK107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGludCB5eV9uZXh0ID0geXl0cmFuc19sWyB5eV9yb3dNYXBfbFt5eV9zdGF0ZV0gKyB5eWNtYXBfbFt5eV9pbnB1dF0gXTsKLSAgICAgICAgICBpZiAoeXlfbmV4dCA9PSAtMSkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIHl5X3N0YXRlID0geXlfbmV4dDsKLQotICAgICAgICAgIGludCB5eV9hdHRyaWJ1dGVzID0geXlfYXR0cl9sW3l5X3N0YXRlXTsKLSAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgMSkgPT0gMSApIHsKLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvc19sID0geXlfY3VycmVudFBvc19sOyAKLSAgICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiA4KSA9PSA4ICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9uCi0gICAgICB5eV9tYXJrZWRQb3MgPSB5eV9tYXJrZWRQb3NfbDsKLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsKLQotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7ICB9Ci0gICAgICAgIGNhc2UgMjE5OiBicmVhazsKLSAgICAgICAgY2FzZSA4OTogCi0gICAgICAgIGNhc2UgMTIzOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgIH0KLSAgICAgICAgY2FzZSAyMjA6IGJyZWFrOwotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgY2FzZSA2MjogCi0gICAgICAgIGNhc2UgNjM6IAotICAgICAgICBjYXNlIDY0OiAKLSAgICAgICAgY2FzZSA2NTogCi0gICAgICAgIGNhc2UgMTAyOiAKLSAgICAgICAgY2FzZSAxMDM6IAotICAgICAgICBjYXNlIDEwNDogCi0gICAgICAgIGNhc2UgMTMzOiAKLSAgICAgICAgY2FzZSAxMzQ6IAotICAgICAgICBjYXNlIDEzNTogCi0gICAgICAgIGNhc2UgMTU2OiAKLSAgICAgICAgY2FzZSAxNTc6IAotICAgICAgICBjYXNlIDE1ODogCi0gICAgICAgIGNhc2UgMTc4OiAKLSAgICAgICAgY2FzZSAxNzk6IAotICAgICAgICBjYXNlIDE4MDogCi0gICAgICAgIGNhc2UgMTk2OiAKLSAgICAgICAgY2FzZSAxOTc6IAotICAgICAgICBjYXNlIDIwNzogCi0gICAgICAgIGNhc2UgMjA4OiAKLSAgICAgICAgY2FzZSAyMTU6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgIH0KLSAgICAgICAgY2FzZSAyMjE6IGJyZWFrOwotICAgICAgICBjYXNlIDUxOiAKLSAgICAgICAgY2FzZSA1MjogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyAgfQotICAgICAgICBjYXNlIDIyMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA1OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5NVE9LRU5fS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjIzOiBicmVhazsKLSAgICAgICAgY2FzZSAxOTQ6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSURSRUZTX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDIyNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTkxOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVElUWV9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyMjU6IGJyZWFrOwotICAgICAgICBjYXNlIDEwNzogCi0gICAgICAgICAgeyAgeXliZWdpbihDT01NRU5UX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCk7ICB9Ci0gICAgICAgIGNhc2UgMjI2OiBicmVhazsKLSAgICAgICAgY2FzZSA0ODogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5BVFRSSUJVVEVfTkFNRSk7ICB9Ci0gICAgICAgIGNhc2UgMjI3OiBicmVhazsKLSAgICAgICAgY2FzZSAzOTogCi0gICAgICAgICAgeyAgeXliZWdpbihFWFRFUk5BTElEX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7ICB9Ci0gICAgICAgIGNhc2UgMjI4OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDY6IAotICAgICAgICBjYXNlIDEzNjogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwpOyAgfQotICAgICAgICBjYXNlIDIyOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTAwOiAKLSAgICAgICAgY2FzZSAxMzI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKTsgIH0KLSAgICAgICAgY2FzZSAyMzA6IGJyZWFrOwotICAgICAgICBjYXNlIDIwMjogCi0gICAgICAgIGNhc2UgMjE2OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9QQ0RBVEEpOyAgfQotICAgICAgICBjYXNlIDIzMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg5OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUFVCTElDX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDIzMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg4OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuU1lTVEVNX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDIzMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICBjYXNlIDcxOiAKLSAgICAgICAgY2FzZSA3MjogCi0gICAgICAgIGNhc2UgNzM6IAotICAgICAgICBjYXNlIDc1OiAKLSAgICAgICAgY2FzZSAxMDg6IAotICAgICAgICBjYXNlIDEwOTogCi0gICAgICAgIGNhc2UgMTEwOiAKLSAgICAgICAgY2FzZSAxMTI6IAotICAgICAgICBjYXNlIDEzNzogCi0gICAgICAgIGNhc2UgMTM4OiAKLSAgICAgICAgY2FzZSAxMzk6IAotICAgICAgICBjYXNlIDE0MDogCi0gICAgICAgIGNhc2UgMTU5OiAKLSAgICAgICAgY2FzZSAxNjA6IAotICAgICAgICBjYXNlIDE2MTogCi0gICAgICAgIGNhc2UgMTYyOiAKLSAgICAgICAgY2FzZSAxODE6IAotICAgICAgICBjYXNlIDE4MzogCi0gICAgICAgIGNhc2UgMTg0OiAKLSAgICAgICAgY2FzZSAyMDA6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyAgfQotICAgICAgICBjYXNlIDIzNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDogCi0gICAgICAgIGNhc2UgMzM6IAotICAgICAgICBjYXNlIDM0OiAKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgIGNhc2UgMzY6IAotICAgICAgICBjYXNlIDM3OiAKLSAgICAgICAgY2FzZSA4MTogCi0gICAgICAgIGNhc2UgODI6IAotICAgICAgICBjYXNlIDExNjogCi0gICAgICAgIGNhc2UgMTE3OiAKLSAgICAgICAgY2FzZSAxNDM6IAotICAgICAgICBjYXNlIDE0NDogCi0gICAgICAgIGNhc2UgMTY1OiAKLSAgICAgICAgY2FzZSAxNjY6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyAgfQotICAgICAgICBjYXNlIDIzNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzogCi0gICAgICAgIGNhc2UgNDA6IAotICAgICAgICBjYXNlIDQxOiAKLSAgICAgICAgY2FzZSA0MjogCi0gICAgICAgIGNhc2UgODU6IAotICAgICAgICBjYXNlIDg2OiAKLSAgICAgICAgY2FzZSA4NzogCi0gICAgICAgIGNhc2UgMTE5OiAKLSAgICAgICAgY2FzZSAxMjA6IAotICAgICAgICBjYXNlIDEyMTogCi0gICAgICAgIGNhc2UgMTQ1OiAKLSAgICAgICAgY2FzZSAxNDY6IAotICAgICAgICBjYXNlIDE0NzogCi0gICAgICAgIGNhc2UgMTY4OiAKLSAgICAgICAgY2FzZSAxNjk6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyAgfQotICAgICAgICBjYXNlIDIzNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7ICB9Ci0gICAgICAgIGNhc2UgMjM3OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7ICB9Ci0gICAgICAgIGNhc2UgMjM4OiBicmVhazsKLSAgICAgICAgY2FzZSA0MzogCi0gICAgICAgIGNhc2UgNDU6IAotICAgICAgICBjYXNlIDQ2OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9DT05URU5UKTsgIH0KLSAgICAgICAgY2FzZSAyMzk6IGJyZWFrOwotICAgICAgICBjYXNlIDYwOiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgIH0KLSAgICAgICAgY2FzZSAyNDA6IGJyZWFrOwotICAgICAgICBjYXNlIDE5ODogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkZJWEVEX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDI0MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE0OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5JTVBMSUVEX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDI0MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5NVE9LRU5TX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDI0MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjExOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVElUSUVTX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDI0NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA5OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKE5PVEFUSU9OX05BTUUpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKTsgIH0KLSAgICAgICAgY2FzZSAyNDU6IGJyZWFrOwotICAgICAgICBjYXNlIDIwMTogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRMSVNUX05BTUUpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpOyAgfQotICAgICAgICBjYXNlIDI0NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk5OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEVMRU1FTlRfTkFNRSk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRyk7ICB9Ci0gICAgICAgIGNhc2UgMjQ3OiBicmVhazsKLSAgICAgICAgY2FzZSAxODI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oRU5USVRZX05BTUUpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRZX1RBRyk7ICB9Ci0gICAgICAgIGNhc2UgMjQ4OiBicmVhazsKLSAgICAgICAgY2FzZSAxNjc6IAotICAgICAgICAgIHsgIHl5YmVnaW4oTkRBVEFfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OREFUQV9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNDk6IGJyZWFrOwotICAgICAgICBjYXNlIDExMTogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVElUWV9QQVJNKTsgIH0KLSAgICAgICAgY2FzZSAyNTA6IGJyZWFrOwotICAgICAgICBjYXNlIDk0OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLklEX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDI1MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKTsgIH0KLSAgICAgICAgY2FzZSAyNTI6IGJyZWFrOwotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRVhDTEFNQVRJT04pOyAgfQotICAgICAgICBjYXNlIDI1MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgIH0KLSAgICAgICAgY2FzZSAyNTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgY2FzZSA0OTogCi0gICAgICAgIGNhc2UgNTA6IAotICAgICAgICBjYXNlIDU0OiAKLSAgICAgICAgY2FzZSA1NTogCi0gICAgICAgIGNhc2UgNTY6IAotICAgICAgICBjYXNlIDU3OiAKLSAgICAgICAgY2FzZSA1ODogCi0gICAgICAgIGNhc2UgNjE6IAotICAgICAgICBjYXNlIDkxOiAKLSAgICAgICAgY2FzZSA5MjogCi0gICAgICAgIGNhc2UgOTM6IAotICAgICAgICBjYXNlIDk1OiAKLSAgICAgICAgY2FzZSA5NjogCi0gICAgICAgIGNhc2UgOTc6IAotICAgICAgICBjYXNlIDk4OiAKLSAgICAgICAgY2FzZSAxMjQ6IAotICAgICAgICBjYXNlIDEyNTogCi0gICAgICAgIGNhc2UgMTI2OiAKLSAgICAgICAgY2FzZSAxMjc6IAotICAgICAgICBjYXNlIDEyODogCi0gICAgICAgIGNhc2UgMTI5OiAKLSAgICAgICAgY2FzZSAxMzA6IAotICAgICAgICBjYXNlIDEzMTogCi0gICAgICAgIGNhc2UgMTQ4OiAKLSAgICAgICAgY2FzZSAxNDk6IAotICAgICAgICBjYXNlIDE1MDogCi0gICAgICAgIGNhc2UgMTUxOiAKLSAgICAgICAgY2FzZSAxNTI6IAotICAgICAgICBjYXNlIDE1MzogCi0gICAgICAgIGNhc2UgMTU0OiAKLSAgICAgICAgY2FzZSAxNTU6IAotICAgICAgICBjYXNlIDE3MDogCi0gICAgICAgIGNhc2UgMTcxOiAKLSAgICAgICAgY2FzZSAxNzI6IAotICAgICAgICBjYXNlIDE3NTogCi0gICAgICAgIGNhc2UgMTc2OiAKLSAgICAgICAgY2FzZSAxNzc6IAotICAgICAgICBjYXNlIDE5MDogCi0gICAgICAgIGNhc2UgMTkyOiAKLSAgICAgICAgY2FzZSAxOTM6IAotICAgICAgICBjYXNlIDE5NTogCi0gICAgICAgIGNhc2UgMjA0OiAKLSAgICAgICAgY2FzZSAyMDY6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUEFSTV9FTlRJVFlfVFlQRSk7ICB9Ci0gICAgICAgIGNhc2UgMjU1OiBicmVhazsKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pOyAgfQotICAgICAgICBjYXNlIDI1NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5SSUdIVF9QQVJFTik7ICB9Ci0gICAgICAgIGNhc2UgMjU3OiBicmVhazsKLSAgICAgICAgY2FzZSA0NDogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyAgfQotICAgICAgICBjYXNlIDI1ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTM6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgIH0KLSAgICAgICAgY2FzZSAyNTk6IGJyZWFrOwotICAgICAgICBjYXNlIDU5OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKEFUVFJJQlVURV9FTlVNRVJBVElPTik7ICB9Ci0gICAgICAgIGNhc2UgMjYwOiBicmVhazsKLSAgICAgICAgY2FzZSA2NzogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pOyAgfQotICAgICAgICBjYXNlIDI2MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjg6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUklHSFRfUEFSRU4pOyAgfQotICAgICAgICBjYXNlIDI2MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjk6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlVNX0NIT0lDRSk7ICB9Ci0gICAgICAgIGNhc2UgMjYzOiBicmVhazsKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgICAgeyAgeXliZWdpbihFTlRJVFlfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgIH0KLSAgICAgICAgY2FzZSAyNjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDQ3OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgIH0KLSAgICAgICAgY2FzZSAyNjU6IGJyZWFrOwotICAgICAgICBjYXNlIDE4NzogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihFWFRFUk5BTElEX0NPTlRFTlQpOyAgfQotICAgICAgICBjYXNlIDI2NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEzOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9FTlVNRVJBVElPTik7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OT1RBVElPTl9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNjc6IGJyZWFrOwotICAgICAgICBjYXNlIDE3NDogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DREFUQV9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNjg6IGJyZWFrOwotICAgICAgICBjYXNlIDE3MzogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5JRFJFRl9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNjk6IGJyZWFrOwotICAgICAgICBjYXNlIDIxNzogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUkVRVUlSRURfS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjcwOiBicmVhazsKLSAgICAgICAgY2FzZSAxMjI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTU1FTlRfRU5EKTsgIH0KLSAgICAgICAgY2FzZSAyNzE6IGJyZWFrOwotICAgICAgICBjYXNlIDg0OiAKLSAgICAgICAgY2FzZSAxMTg6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCk7ICB9Ci0gICAgICAgIGNhc2UgMjcyOiBicmVhazsKLSAgICAgICAgY2FzZSA3OTogCi0gICAgICAgIGNhc2UgMTE1OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpOyAgfQotICAgICAgICBjYXNlIDI3MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICBjYXNlIDI3OiAKLSAgICAgICAgY2FzZSA3NjogCi0gICAgICAgIGNhc2UgMTEzOiAKLSAgICAgICAgY2FzZSAxNDE6IAotICAgICAgICBjYXNlIDE2MzogCi0gICAgICAgIGNhc2UgMTg1OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7ICB9Ci0gICAgICAgIGNhc2UgMjc0OiBicmVhazsKLSAgICAgICAgY2FzZSA1OiAKLSAgICAgICAgY2FzZSAzODogCi0gICAgICAgICAgeyAgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkRBVEFfVkFMVUUpOyAgfQotICAgICAgICBjYXNlIDI3NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICBjYXNlIDY2OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7ICB9Ci0gICAgICAgIGNhc2UgMjc2OiBicmVhazsKLSAgICAgICAgY2FzZSAxODogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNUQVJUX1RBRyk7ICB9Ci0gICAgICAgIGNhc2UgMjc3OiBicmVhazsKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNFTUlDT0xPTik7ICB9Ci0gICAgICAgIGNhc2UgMjc4OiBicmVhazsKLSAgICAgICAgY2FzZSAzMDogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUik7ICB9Ci0gICAgICAgIGNhc2UgMjc5OiBicmVhazsKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlBFUkNFTlQpOyAgfQotICAgICAgICBjYXNlIDI4MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTkRfVEFHKTsgIH0KLSAgICAgICAgY2FzZSAyODE6IGJyZWFrOwotICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUEVSQ0VOVCk7ICB9Ci0gICAgICAgIGNhc2UgMjgyOiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvVG9rZW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL1Rva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYWZlN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudG9rZW5pemVyOwotCi1wdWJsaWMgY2xhc3MgVG9rZW4gZXh0ZW5kcyBZeXRva2VuIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01NRU5UX1NUQVJUID0gOTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUT1IgPSA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfQU5ZID0gNDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9FTVBUWSA9IDQyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfUENEQVRBID0gNDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9DT05URU5UID0gNDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UX1RBRyA9IDQwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVORF9UQUcgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9DT05URU5UID0gMzI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX1BBUk0gPSAzMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9UQUcgPSAzMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWENMQU1BVElPTiA9IDg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVGVF9QQVJFTiA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UQVRJT05fQ09OVEVOVCA9IDIxOwotCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RBVElPTl9UQUcgPSAyMDsKLQotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfQ0hPSUNFID0gNTsKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX1NFUVVFTkNFID0gNjsKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQ0NVUl9PUFRJT05BTCA9IDc7Ci0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0NDVVJfT05FX09SX01PUkUgPSA4OwotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9DQ1VSX1pFUk9fT1JfTU9SRSA9IDk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0NDVVJfVFlQRSA9IDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRfUEFSRU4gPSA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1RBRyA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0hJVEVTUEFDRSA9IDU7Ci0KLQotCXB1YmxpYyBUb2tlbihTdHJpbmcgdHlwZSkgewotCQlzdXBlcih0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgVG9rZW4oU3RyaW5nIHR5cGUsIFN0cmluZyB0ZXh0LCBpbnQgbGluZSwgaW50IGNoYXJCZWdpbiwgaW50IGxlbmd0aCkgewotCQlzdXBlcih0eXBlLCB0ZXh0LCBsaW5lLCBjaGFyQmVnaW4sIGxlbmd0aCk7Ci0JfQotCi0JcHVibGljIFRva2VuIGNyZWF0ZUNvcHkoKSB7Ci0JCVRva2VuIGNvcHkgPSBuZXcgVG9rZW4oZ2V0VHlwZSgpLCBnZXRUZXh0KCksIGdldFN0YXJ0TGluZSgpLCBnZXRTdGFydE9mZnNldCgpLCBnZXRMZW5ndGgoKSk7Ci0JCXJldHVybiBjb3B5OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvWXl0b2tlbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvWXl0b2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjQ3OTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL1l5dG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudG9rZW5pemVyOwotCi1jbGFzcyBZeXRva2VuIHsKLQlwdWJsaWMgaW50IG1fY2hhckJlZ2luOwotCXB1YmxpYyBpbnQgbV9sZW5ndGg7Ci0JcHVibGljIGludCBtX2xpbmU7Ci0JcHVibGljIFN0cmluZyBtX3RleHQ7Ci0JcHVibGljIFN0cmluZyBtX3R5cGU7Ci0KLQlZeXRva2VuKFN0cmluZyB0eXBlKSB7Ci0JCW1fdHlwZSA9IHR5cGU7Ci0JfQotCi0JWXl0b2tlbihTdHJpbmcgdHlwZSwgU3RyaW5nIHRleHQsIGludCBsaW5lLCBpbnQgY2hhckJlZ2luLCBpbnQgbGVuZ3RoKSB7Ci0JCW1fdHlwZSA9IHR5cGU7Ci0JCW1fdGV4dCA9IG5ldyBTdHJpbmcodGV4dCk7Ci0JCW1fbGluZSA9IGxpbmU7Ci0JCW1fY2hhckJlZ2luID0gY2hhckJlZ2luOwotCQltX2xlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGUoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCWludCBzdHJpbmdTdGFydCA9IHN0YXJ0IC0gbV9jaGFyQmVnaW47Ci0JCVN0cmluZyBvbGRTdHJpbmcgPSBtX3RleHQ7Ci0JCW1fdGV4dCA9IG9sZFN0cmluZy5zdWJzdHJpbmcoMCwgc3RyaW5nU3RhcnQpOwotCQltX3RleHQgKz0gb2xkU3RyaW5nLnN1YnN0cmluZyhzdHJpbmdTdGFydCArIGxlbmd0aCk7Ci0KLQkJbV9sZW5ndGggPSBtX3RleHQubGVuZ3RoKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigibmV3IHN0cmluZyA9ICIgKyBtX3RleHQpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoWXl0b2tlbiBvdGhlcikgewotCQlyZXR1cm4gbV90eXBlID09IG90aGVyLmdldFR5cGUoKSAmJiBtX3RleHQuZXF1YWxzKG90aGVyLmdldFRleHQoKSkgJiYgbV9saW5lID09IG90aGVyLmdldFN0YXJ0TGluZSgpICYmIG1fY2hhckJlZ2luID09IG90aGVyLmdldFN0YXJ0T2Zmc2V0KCkgJiYgbV9sZW5ndGggPT0gb3RoZXIuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBtX2NoYXJCZWdpbiArIG1fbGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gbV9sZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydExpbmUoKSB7Ci0JCXJldHVybiBtX2xpbmU7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIG1fY2hhckJlZ2luOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIG1fdGV4dDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBtX3R5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHN0YXJ0T2Zmc2V0KSB7Ci0JCW1fY2hhckJlZ2luID0gc3RhcnRPZmZzZXQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJUZXh0ICAgOiAiICsgbV90ZXh0ICsgIlxudHlwZSA6ICIgKyBtX3R5cGUgKyAiXG5saW5lICA6ICIgKyBtX2xpbmUgKyAiXG5jQmVnLiA6ICIgKyBtX2NoYXJCZWdpbiArICJcbmNFbmQuIDogIiArIGdldEVuZE9mZnNldCgpICsgIlxuY0xlbmd0aC4gOiAiICsgbV9sZW5ndGg7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCi0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlT2Zmc2V0KGludCBkZWx0YSkgewotCQltX2NoYXJCZWdpbiArPSBkZWx0YTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVUZXh0KFN0cmluZyBuZXdUZXh0KSB7Ci0JCW1fdGV4dCA9IG5ld1RleHQ7Ci0JCW1fbGVuZ3RoID0gbmV3VGV4dC5sZW5ndGgoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9kdGQuZmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL2R0ZC5mbGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2ExNGFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL2R0ZC5mbGV4CisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLQotLyoqIAotICogR2VuZXJhdGUgd2l0aCAiZHRkc2tlbGV0b24iLgotICoKLSAqIEl0IHJlbW92ZXMgc29tZSB1bnVzZWQgZmllbGRzIGFuZCBhdm9pZHMgc29tZSBjb21waWxlciB3YXJuaW5ncyAKLSAqLwotCi0lJQotCi0lewotCWludCBub2RlX2NvdW50ID0gMDsKLQlTdHJpbmcgY3VycmVudFN0cmluZzsKLQotCXByaXZhdGUgVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIG5ldyBUb2tlbih0eXBlLCB5eXRleHQoKSwgeXlsaW5lLCB5eWNoYXIgKyBzdGFydE9mZnNldCwgeXlsZW5ndGgoKSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgc3RhcnRPZmZzZXQgPSAwOwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJdGhpcy5zdGFydE9mZnNldCA9IG9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaW5lKGludCBsaW5lKSB7Ci0JCXRoaXMueXlsaW5lID0gbGluZTsKLQl9Ci0lfQotCi0lY2xhc3MgRFREVG9rZW5pemVyCi0lcHVibGljCi0ldW5pY29kZQotJWNoYXIKLQotJXN0YXRlIE5PREUKLSVzdGF0ZSBFTEVNRU5UX05BTUUKLSVzdGF0ZSBFTEVNRU5UX0NPTlRFTlQKLSVzdGF0ZSBFTEVNRU5UX01JWEVEX09SX0NISUxECi0lc3RhdGUgRUxFTUVOVF9NSVhFRAotJXN0YXRlIEVMRU1FTlRfQ0hJTEQKLSVzdGF0ZSBFTlRJVFlfTkFNRQotJXN0YXRlIEVOVElUWV9DT05URU5UCi0lc3RhdGUgTkRBVEFfQ09OVEVOVAotCi0lc3RhdGUgTk9UQVRJT05fTkFNRQotJXN0YXRlIEVYVEVSTkFMSURfQ09OVEVOVAotCi0lc3RhdGUgQ09NTUVOVF9DT05URU5UCi0lc3RhdGUgQVRUTElTVF9OQU1FCi0lc3RhdGUgQVRUTElTVF9DT05URU5UCi0lc3RhdGUgQVRUUklCVVRFX0NPTlRFTlQKLSVzdGF0ZSBBVFRSSUJVVEVfREVGQVVMVAotJXN0YXRlIEFUVFJJQlVURV9FTlVNRVJBVElPTgotCi0KLUFMUEhBPVtBLVphLXpdCi1ESUdJVD1bMC05XQotTk9OTkVXTElORV9XSElURV9TUEFDRV9DSEFSPVtcIFx0XGJcMDEyXQotU1RSSU5HX1RFWFQ9KFxcXCJ8W15cblxyXCJdfFxce1dISVRFX1NQQUNFX0NIQVJ9K1xcKSoKLUNPTU1FTlRfVEVYVD0oW14qL1xuXXxbXipcbl0iLyJbXipcbl18W14vXG5dIioiW14vXG5dfCIqIlteL1xuXXwiLyJbXipcbl0pKgotSWRlbnQgPSB7QUxQSEF9KHtBTFBIQX18e0RJR0lUfXxfKSoKLUlucHV0Q2hhcmFjdGVyID0gW15cclxuXQotCi1MaW5lVGVybWluYXRvciA9IFxyfFxufFxyXG4KLQotLyogMyAtIFdoaXRlIFNwYWNlICovCi1TICAgICAgICAgICAgICA9ICAgIChceDIwIHwgXHgwOSB8IFx4MEQgfCBceDBBKSsKLU5vbkxpbmVUZXJtaW5hdG9yV2hpdGVzcGFjZSA9IChceDIwIHwgXHgwOSkrCi0KLVdoaXRlU3BhY2UgICAgID0ge0xpbmVUZXJtaW5hdG9yfSB8IFsgXHRcZl0KLQotLyogODQgKi8KLS8qTGV0dGVyICAgICAgICAgPSAgICB7QmFzZUNoYXJ9IHwge0lkZW9ncmFwaGljfQotCi0vKiA4NSAqLwotQmFzZUNoYXIgICAgICAgPSAgICBbXHUwMDQxLVx1MDA1QV0gfCBbXHUwMDYxLVx1MDA3QV0gfCBbXHUwMEMwLVx1MDBENl0gfCBbXHUwMEQ4LVx1MDBGNl0gfCBbXHUwMEY4LVx1MDBGRl0gfCBbXHUwMTAwLVx1MDEzMV0gfCBbXHUwMTM0LVx1MDEzRV0gfCBbXHUwMTQxLVx1MDE0OF0gfCBbXHUwMTRBLVx1MDE3RV0gfCBbXHUwMTgwLVx1MDFDM10gfCBbXHUwMUNELVx1MDFGMF0gfCBbXHUwMUY0LVx1MDFGNV0gfCBbXHUwMUZBLVx1MDIxN10gfCBbXHUwMjUwLVx1MDJBOF0gfCBbXHUwMkJCLVx1MDJDMV0gfCBcdTAzODYgfCBbXHUwMzg4LVx1MDM4QV0gfCBcdTAzOEMgfCBbXHUwMzhFLVx1MDNBMV0gfCBbXHUwM0EzLVx1MDNDRV0gfCBbXHUwM0QwLVx1MDNENl0gfCBcdTAzREEgfCBcdTAzREMgfCBcdTAzREUgfCBcdTAzRTAgfCBbXHUwM0UyLVx1MDNGM10gfCBbXHUwNDAxLVx1MDQwQ10gfCBbXHUwNDBFLVx1MDQ0Rl0gfCBbXHUwNDUxLVx1MDQ1Q10gfCBbXHUwNDVFLVx1MDQ4MV0gfCBbXHUwNDkwLVx1MDRDNF0gfCBbXHUwNEM3LVx1MDRDOF0gfCBbXHUwNENCLVx1MDRDQ10gfCBbXHUwNEQwLVx1MDRFQl0gfCBbXHUwNEVFLVx1MDRGNV0gfCBbXHUwNEY4LVx1MDRGOV0gfCBbXHUwNTMxLVx1MDU1Nl0gfCBcdTA1NTkgfCBbXHUwNTYxLVx1MDU4Nl0gfCBbXHUwNUQwLVx1MDVFQV0gfCBbXHUwNUYwLVx1MDVGMl0gfCBbXHUwNjIxLVx1MDYzQV0gfCBbXHUwNjQxLVx1MDY0QV0gfCBbXHUwNjcxLVx1MDZCN10gfCBbXHUwNkJBLVx1MDZCRV0gfCBbXHUwNkMwLVx1MDZDRV0gfCBbXHUwNkQwLVx1MDZEM10gfCBcdTA2RDUgfCBbXHUwNkU1LVx1MDZFNl0gfCBbXHUwOTA1LVx1MDkzOV0gfCBcdTA5M0QgfCBbXHUwOTU4LVx1MDk2MV0gfCBbXHUwOTg1LVx1MDk4Q10gfCBbXHUwOThGLVx1MDk5MF0gfCBbXHUwOTkzLVx1MDlBOF0gfCBbXHUwOUFBLVx1MDlCMF0gfCBcdTA5QjIgfCBbXHUwOUI2LVx1MDlCOV0gfCBbXHUwOURDLVx1MDlERF0gfCBbXHUwOURGLVx1MDlFMV0gfCBbXHUwOUYwLVx1MDlGMV0gfCBbXHUwQTA1LVx1MEEwQV0gfCBbXHUwQTBGLVx1MEExMF0gfCBbXHUwQTEzLVx1MEEyOF0gfCBbXHUwQTJBLVx1MEEzMF0gfCBbXHUwQTMyLVx1MEEzM10gfCBbXHUwQTM1LVx1MEEzNl0gfCBbXHUwQTM4LVx1MEEzOV0gfCBbXHUwQTU5LVx1MEE1Q10gfCBcdTBBNUUgfCBbXHUwQTcyLVx1MEE3NF0gfCBbXHUwQTg1LVx1MEE4Ql0gfCBcdTBBOEQgfCBbXHUwQThGLVx1MEE5MV0gfCBbXHUwQTkzLVx1MEFBOF0gfCBbXHUwQUFBLVx1MEFCMF0gfCBbXHUwQUIyLVx1MEFCM10gfCBbXHUwQUI1LVx1MEFCOV0gfCBcdTBBQkQgfCBcdTBBRTAgfCBbXHUwQjA1LVx1MEIwQ10gfCBbXHUwQjBGLVx1MEIxMF0gfCBbXHUwQjEzLVx1MEIyOF0gfCBbXHUwQjJBLVx1MEIzMF0gfCBbXHUwQjMyLVx1MEIzM10gfCBbXHUwQjM2LVx1MEIzOV0gfCBcdTBCM0QgfCBbXHUwQjVDLVx1MEI1RF0gfCBbXHUwQjVGLVx1MEI2MV0gfCBbXHUwQjg1LVx1MEI4QV0gfCBbXHUwQjhFLVx1MEI5MF0gfCBbXHUwQjkyLVx1MEI5NV0gfCBbXHUwQjk5LVx1MEI5QV0gfCBcdTBCOUMgfCBbXHUwQjlFLVx1MEI5Rl0gfCBbXHUwQkEzLVx1MEJBNF0gfCBbXHUwQkE4LVx1MEJBQV0gfCBbXHUwQkFFLVx1MEJCNV0gfCBbXHUwQkI3LVx1MEJCOV0gfCBbXHUwQzA1LVx1MEMwQ10gfCBbXHUwQzBFLVx1MEMxMF0gfCBbXHUwQzEyLVx1MEMyOF0gfCBbXHUwQzJBLVx1MEMzM10gfCBbXHUwQzM1LVx1MEMzOV0gfCBbXHUwQzYwLVx1MEM2MV0gfCBbXHUwQzg1LVx1MEM4Q10gfCBbXHUwQzhFLVx1MEM5MF0gfCBbXHUwQzkyLVx1MENBOF0gfCBbXHUwQ0FBLVx1MENCM10gfCBbXHUwQ0I1LVx1MENCOV0gfCBcdTBDREUgfCBbXHUwQ0UwLVx1MENFMV0gfCBbXHUwRDA1LVx1MEQwQ10gfCBbXHUwRDBFLVx1MEQxMF0gfCBbXHUwRDEyLVx1MEQyOF0gfCBbXHUwRDJBLVx1MEQzOV0gfCBbXHUwRDYwLVx1MEQ2MV0gfCBbXHUwRTAxLVx1MEUyRV0gfCBcdTBFMzAgfCBbXHUwRTMyLVx1MEUzM10gfCBbXHUwRTQwLVx1MEU0NV0gfCBbXHUwRTgxLVx1MEU4Ml0gfCBcdTBFODQgfCBbXHUwRTg3LVx1MEU4OF0gfCBcdTBFOEEgfCBcdTBFOEQgfCBbXHUwRTk0LVx1MEU5N10gfCBbXHUwRTk5LVx1MEU5Rl0gfCBbXHUwRUExLVx1MEVBM10gfCBcdTBFQTUgfCBcdTBFQTcgfCBbXHUwRUFBLVx1MEVBQl0gfCBbXHUwRUFELVx1MEVBRV0gfCBcdTBFQjAgfCBbXHUwRUIyLVx1MEVCM10gfCBcdTBFQkQgfCBbXHUwRUMwLVx1MEVDNF0gfCBbXHUwRjQwLVx1MEY0N10gfCBbXHUwRjQ5LVx1MEY2OV0gfCBbXHUxMEEwLVx1MTBDNV0gfCBbXHUxMEQwLVx1MTBGNl0gfCBcdTExMDAgfCBbXHUxMTAyLVx1MTEwM10gfCBbXHUxMTA1LVx1MTEwN10gfCBcdTExMDkgfCBbXHUxMTBCLVx1MTEwQ10gfCBbXHUxMTBFLVx1MTExMl0gfCBcdTExM0MgfCBcdTExM0UgfCBcdTExNDAgfCBcdTExNEMgfCBcdTExNEUgfCBcdTExNTAgfCBbXHUxMTU0LVx1MTE1NV0gfCBcdTExNTkgfCBbXHUxMTVGLVx1MTE2MV0gfCBcdTExNjMgfCBcdTExNjUgfCBcdTExNjcgfCBcdTExNjkgfCBbXHUxMTZELVx1MTE2RV0gfCBbXHUxMTcyLVx1MTE3M10gfCBcdTExNzUgfCBcdTExOUUgfCBcdTExQTggfCBcdTExQUIgfCBbXHUxMUFFLVx1MTFBRl0gfCBbXHUxMUI3LVx1MTFCOF0gfCBcdTExQkEgfCBbXHUxMUJDLVx1MTFDMl0gfCBcdTExRUIgfCBcdTExRjAgfCBcdTExRjkgfCBbXHUxRTAwLVx1MUU5Ql0gfCBbXHUxRUEwLVx1MUVGOV0gfCBbXHUxRjAwLVx1MUYxNV0gfCBbXHUxRjE4LVx1MUYxRF0gfCBbXHUxRjIwLVx1MUY0NV0gfCBbXHUxRjQ4LVx1MUY0RF0gfCBbXHUxRjUwLVx1MUY1N10gfCBcdTFGNTkgfCBcdTFGNUIgfCBcdTFGNUQgfCBbXHUxRjVGLVx1MUY3RF0gfCBbXHUxRjgwLVx1MUZCNF0gfCBbXHUxRkI2LVx1MUZCQ10gfCBcdTFGQkUgfCBbXHUxRkMyLVx1MUZDNF0gfCBbXHUxRkM2LVx1MUZDQ10gfCBbXHUxRkQwLVx1MUZEM10gfCBbXHUxRkQ2LVx1MUZEQl0gfCBbXHUxRkUwLVx1MUZFQ10gfCBbXHUxRkYyLVx1MUZGNF0gfCBbXHUxRkY2LVx1MUZGQ10gfCBcdTIxMjYgfCBbXHUyMTJBLVx1MjEyQl0gfCBcdTIxMkUgfCBbXHUyMTgwLVx1MjE4Ml0gfCBbXHUzMDQxLVx1MzA5NF0gfCBbXHUzMEExLVx1MzBGQV0gfCBbXHUzMTA1LVx1MzEyQ10gfCBbXHVBQzAwLVx1RDdBM10gIAotCi0vKiA4NiAqLwotSWRlb2dyYXBoaWMgICAgPSAgICBbXHU0RTAwLVx1OUZBNV0gfCBcdTMwMDcgfCBbXHUzMDIxLVx1MzAyOV0gIAotCi0vKiA0ICovICAvKiBpcyAnLicgdG8gYmUgZXNjYXBlZD8/ICovCi1OYW1lQ2hhciAgICAgICA9ICAgIHtMZXR0ZXJ9IHwge0RpZ2l0fSB8IC4gfCAtIHwgXyB8IDogfCB7Q29tYmluaW5nQ2hhcn0gfCB7RXh0ZW5kZXJ9Ci0KLS8qIDUgKi8KLU5hbWUgICAgICAgICAgID0gKHtMZXR0ZXJ9IHwgXyB8IDopIHtOYW1lQ2hhcn0qIAotCi0vKiA4NyAqLwotQ29tYmluaW5nQ2hhciAgPSAgICBbXHUwMzAwLVx1MDM0NV0gfCBbXHUwMzYwLVx1MDM2MV0gfCBbXHUwNDgzLVx1MDQ4Nl0gfCBbXHUwNTkxLVx1MDVBMV0gfCBbXHUwNUEzLVx1MDVCOV0gfCBbXHUwNUJCLVx1MDVCRF0gfCBcdTA1QkYgfCBbXHUwNUMxLVx1MDVDMl0gfCBcdTA1QzQgfCBbXHUwNjRCLVx1MDY1Ml0gfCBcdTA2NzAgfCBbXHUwNkQ2LVx1MDZEQ10gfCBbXHUwNkRELVx1MDZERl0gfCBbXHUwNkUwLVx1MDZFNF0gfCBbXHUwNkU3LVx1MDZFOF0gfCBbXHUwNkVBLVx1MDZFRF0gfCBbXHUwOTAxLVx1MDkwM10gfCBcdTA5M0MgfCBbXHUwOTNFLVx1MDk0Q10gfCBcdTA5NEQgfCBbXHUwOTUxLVx1MDk1NF0gfCBbXHUwOTYyLVx1MDk2M10gfCBbXHUwOTgxLVx1MDk4M10gfCBcdTA5QkMgfCBcdTA5QkUgfCBcdTA5QkYgfCBbXHUwOUMwLVx1MDlDNF0gfCBbXHUwOUM3LVx1MDlDOF0gfCBbXHUwOUNCLVx1MDlDRF0gfCBcdTA5RDcgfCBbXHUwOUUyLVx1MDlFM10gfCBcdTBBMDIgfCBcdTBBM0MgfCBcdTBBM0UgfCBcdTBBM0YgfCBbXHUwQTQwLVx1MEE0Ml0gfCBbXHUwQTQ3LVx1MEE0OF0gfCBbXHUwQTRCLVx1MEE0RF0gfCBbXHUwQTcwLVx1MEE3MV0gfCBbXHUwQTgxLVx1MEE4M10gfCBcdTBBQkMgfCBbXHUwQUJFLVx1MEFDNV0gfCBbXHUwQUM3LVx1MEFDOV0gfCBbXHUwQUNCLVx1MEFDRF0gfCBbXHUwQjAxLVx1MEIwM10gfCBcdTBCM0MgfCBbXHUwQjNFLVx1MEI0M10gfCBbXHUwQjQ3LVx1MEI0OF0gfCBbXHUwQjRCLVx1MEI0RF0gfCBbXHUwQjU2LVx1MEI1N10gfCBbXHUwQjgyLVx1MEI4M10gfCBbXHUwQkJFLVx1MEJDMl0gfCBbXHUwQkM2LVx1MEJDOF0gfCBbXHUwQkNBLVx1MEJDRF0gfCBcdTBCRDcgfCBbXHUwQzAxLVx1MEMwM10gfCBbXHUwQzNFLVx1MEM0NF0gfCBbXHUwQzQ2LVx1MEM0OF0gfCBbXHUwQzRBLVx1MEM0RF0gfCBbXHUwQzU1LVx1MEM1Nl0gfCBbXHUwQzgyLVx1MEM4M10gfCBbXHUwQ0JFLVx1MENDNF0gfCBbXHUwQ0M2LVx1MENDOF0gfCBbXHUwQ0NBLVx1MENDRF0gfCBbXHUwQ0Q1LVx1MENENl0gfCBbXHUwRDAyLVx1MEQwM10gfCBbXHUwRDNFLVx1MEQ0M10gfCBbXHUwRDQ2LVx1MEQ0OF0gfCBbXHUwRDRBLVx1MEQ0RF0gfCBcdTBENTcgfCBcdTBFMzEgfCBbXHUwRTM0LVx1MEUzQV0gfCBbXHUwRTQ3LVx1MEU0RV0gfCBcdTBFQjEgfCBbXHUwRUI0LVx1MEVCOV0gfCBbXHUwRUJCLVx1MEVCQ10gfCBbXHUwRUM4LVx1MEVDRF0gfCBbXHUwRjE4LVx1MEYxOV0gfCBcdTBGMzUgfCBcdTBGMzcgfCBcdTBGMzkgfCBcdTBGM0UgfCBcdTBGM0YgfCBbXHUwRjcxLVx1MEY4NF0gfCBbXHUwRjg2LVx1MEY4Ql0gfCBbXHUwRjkwLVx1MEY5NV0gfCBcdTBGOTcgfCBbXHUwRjk5LVx1MEZBRF0gfCBbXHUwRkIxLVx1MEZCN10gfCBcdTBGQjkgfCBbXHUyMEQwLVx1MjBEQ10gfCBcdTIwRTEgfCBbXHUzMDJBLVx1MzAyRl0gfCBcdTMwOTkgfCBcdTMwOUEgIAotCi0vKiA4OCAqLwotRGlnaXQgICAgICAgICAgPSAgICBbXHUwMDMwLVx1MDAzOV0gfCBbXHUwNjYwLVx1MDY2OV0gfCBbXHUwNkYwLVx1MDZGOV0gfCBbXHUwOTY2LVx1MDk2Rl0gfCBbXHUwOUU2LVx1MDlFRl0gfCBbXHUwQTY2LVx1MEE2Rl0gfCBbXHUwQUU2LVx1MEFFRl0gfCBbXHUwQjY2LVx1MEI2Rl0gfCBbXHUwQkU3LVx1MEJFRl0gfCBbXHUwQzY2LVx1MEM2Rl0gfCBbXHUwQ0U2LVx1MENFRl0gfCBbXHUwRDY2LVx1MEQ2Rl0gfCBbXHUwRTUwLVx1MEU1OV0gfCBbXHUwRUQwLVx1MEVEOV0gfCBbXHUwRjIwLVx1MEYyOV0gIAotCi0vKiA4OSAqLwotRXh0ZW5kZXIgICAgICAgPSAgICBcdTAwQjcgfCBcdTAyRDAgfCBcdTAyRDEgfCBcdTAzODcgfCBcdTA2NDAgfCBcdTBFNDYgfCBcdTBFQzYgfCBcdTMwMDUgfCBbXHUzMDMxLVx1MzAzNV0gfCBbXHUzMDlELVx1MzA5RV0gfCBbXHUzMEZDLVx1MzBGRV0gIAotKi8KLQotTGV0dGVyICAgICAgICAgPSBbYS16QS1aXQotTmFtZUNoYXIgICAgICAgPSB7TGV0dGVyfSB8IFswLTldCi0vL05hbWUgICAgICAgICAgID0gKHtMZXR0ZXJ9IHwgXyB8IDopIHtOYW1lQ2hhcn0qIAotLy9OYW1lICAgICAgICAgICA9IFteXHgyMFx4MDlceDBEXHgwQV0rCi1OYW1lICAgICAgICAgICA9IFteXHgyMFx4MDlceDBEXHgwQVx8LFwhXD9cK1wqXChcKTw+XSsKLUVsZW1lbnRSZWZOYW1lID0gW15ceDIwXHgwOVx4MERceDBBXHwsXD9cK1wqXChcKTw+XSsKLUVudGl0eU5hbWUgICAgID0gW15ceDIwXHgwOVx4MERceDBBXHwsXD9cKlwoXCk8Pl0rCi1QYXJtRW50aXR5TmFtZSA9IFteXHgyMFx4MDlceDBEXHgwQVwhJTs8Pl0rCi0KLUNvbW1lbnRTdGFydCAgID0gXCEtLQotQ29tbWVudENvbnRlbnQgPSBbXi0+XSsKLUNvbW1lbnRFbmQgICAgID0gLS0+Ci1FbGVtZW50U3RhcnQgICA9IEVMRU1FTlQKLUVsZW1lbnRDb250ZW50ID0gW148Pl0qCi0KLUVudGl0eVN0YXJ0ICAgID0gRU5USVRZCi1FbnRpdHlfUGFybSAgICA9ICV7U30KLUVudGl0eUNvbnRlbnQgID0ge1N9W148Pl0qCi0KLU5vdGF0aW9uU3RhcnQgID0gTk9UQVRJT04KLU5vdGF0aW9uQ29udGVudCA9IHtTfVtePD5dKgotQXR0TGlzdCAgICAgICAgPSBBVFRMSVNUCi1FeHRlcm5hbFBhcm1FbnRpdHlSZWYgPSAle1Bhcm1FbnRpdHlOYW1lfTsKLUVuZFRhZyAgICAgICAgID0gPgotU3RhcnRUYWcgICAgICAgPSA8Ci1TeXN0ZW0gICAgICAgICA9IFNZU1RFTQotUHVibGljICAgICAgICAgPSBQVUJMSUMKLU5EYXRhICAgICAgICAgID0gTkRBVEEKLQotLy8gdGhlc2UgYXJlIGF0dHJpYnV0ZSB0eXBlIGtleXdvcmRzCi0vLyAgIHdlIHJldXNlIE5PVEFUSU9OIGZyb20gTm90YXRpb25TdGFydAotLy8gICB3ZSByZXVzZSBFTlRJVFkgZnJvbSBFbnRpdHlTdGFydAotQ0RhdGEgICAgICAgICAgPSBDREFUQQotSUQgICAgICAgICAgICAgPSBJRAotSURSZWYgICAgICAgICAgPSBJRFJFRgotSURSZWZzICAgICAgICAgPSBJRFJFRlMKLUVudGl0aWVzICAgICAgID0gRU5USVRJRVMKLU5NVG9rZW4gICAgICAgID0gTk1UT0tFTgotTk1Ub2tlbnMgICAgICAgPSBOTVRPS0VOUwotCi0vLyB0aGVzZSBhcmUgYXR0cmlidXRlIGRlZmF1bHRzIGtleXdvcmRzCi1SZXF1aXJlZCAgICAgICA9ICNSRVFVSVJFRAotSW1wbGllZCAgICAgICAgPSAjSU1QTElFRAotRml4ZWQgICAgICAgICAgPSAjRklYRUQKLQotCi1FbXB0eSAgICAgICAgICA9IEVNUFRZCi1BbnkgICAgICAgICAgICA9IEFOWQotUGNEYXRhICAgICAgICAgPSAjUENEQVRBCi1MZWZ0UGFyZW4gICAgICA9IFwoCi1SaWdodFBhcmVuICAgICA9IFwpCi0KLVBlcmNlbnQgICAgICAgID0gJQotU2VtaWNvbG9uICAgICAgPSA7Ci1QbHVzICAgICAgICAgICA9IFwrCi1DaG9pY2UgID0gXHwKLVNlcXVlbmNlID0gLAotQ29ubmVjdG9yICAgICAgPSB7Q2hvaWNlfXx7U2VxdWVuY2V9Ci1PY2N1ck9wdGlvbmFsICA9IFw/Ci1PY2N1ck9uZU9yTW9yZSA9IFwrCi1PY2N1clplcm9Pck1vcmUgPSBcKgotT2NjdXJUeXBlICAgICAgPSB7T2NjdXJPcHRpb25hbH18e09jY3VyT25lT3JNb3JlfXx7T2NjdXJaZXJvT3JNb3JlfQotRXhjbGFtYXRpb24gICA9IFwhCi1TaW5nbGVRdW90ZWRMaXRlcmFsID0gJ1teJ10qJwotRG91YmxlUXVvdGVkTGl0ZXJhbCA9IFwiW15cIl0qXCIKLU5vblRhZ0NvbnRlbnQgPSBbXlx4MjBceDA5XHgwRFx4MEE8Pl0qCi1Ob25FbnVtQ29udGVudCA9IFteXHgyMFx4MDlceDBEXHgwQTw+XChcKVx8XSoKLQotJSUKLQotPFlZSU5JVElBTD4gewotICB7U3RhcnRUYWd9ICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNUQVJUX1RBRyk7IH0KLSAge0VuZFRhZ30gICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTkRfVEFHKTsgfQotICB7RXhjbGFtYXRpb259ICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OKTsgfQotICB7UGVyY2VudH0gICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlBFUkNFTlQpOyB9Ci0gIHtTZW1pY29sb259ICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuU0VNSUNPTE9OKTsgfQotCi0gIHtFbGVtZW50U3RhcnR9ICAgeyB5eWJlZ2luKEVMRU1FTlRfTkFNRSk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRyk7IH0KLSAge0NvbW1lbnRTdGFydH0gICB7IHl5YmVnaW4oQ09NTUVOVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQpOyB9Ci0gIHtFbnRpdHlTdGFydH0gICAgeyB5eWJlZ2luKEVOVElUWV9OQU1FKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpOyB9Ci0gIHtOb3RhdGlvblN0YXJ0fSAgeyB5eWJlZ2luKE5PVEFUSU9OX05BTUUpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKTsgfQotICB7QXR0TGlzdH0gICAgICAgIHsgeXliZWdpbihBVFRMSVNUX05BTUUpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpOyB9Ci0KLSAge0V4dGVybmFsUGFybUVudGl0eVJlZn0gICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlRJVFlfUEFSTSk7IH0KLS8vIGp1c3QgYSBwYXJtZW50aXR5bmFtZSBieSBpdHNlbGYgaXMgbm8gZ29vZC4gIHdlIHVzZSB0aGlzCi0vLyB0byBjYXB0dXJlIGdhcmJhZ2UgY29udGVudCBhdCB0aGUgdG9wIGxldmVsCi0gIHtQYXJtRW50aXR5TmFtZX0gICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgfQotCi0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLX0KLQotPEVMRU1FTlRfTkFNRT4gewotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci0gIHtQY0RhdGF9fFwoe1N9KntQY0RhdGF9e1N9KlwpIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBKTsgfQotICB7TmFtZX0gICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyB9Ci0KLSAge0xlZnRQYXJlbn0gICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5MRUZUX1BBUkVOKTsgfQotICB7Q29ubmVjdG9yfSAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUik7IH0gICAgCi0gIHtPY2N1clR5cGV9ICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSk7IH0KLSAge1JpZ2h0UGFyZW59ICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5SSUdIVF9QQVJFTik7IH0KLQotICB7U3RhcnRUYWd9ICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci0gIHtFbmRUYWd9ICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLX0KLQotLy8gKioqKioqKiogPCFBVFRMSVNULi4uPgotPEFUVExJU1RfTkFNRT4gewotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci0gIHtOYW1lfSAgICAgICAgICAgeyB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgfQotICB7Tm9uVGFnQ29udGVudH0gIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7IH0KLSAge1N0YXJ0VGFnfSB8IHtFbmRUYWd9IHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci19Ci0KLTxBVFRMSVNUX0NPTlRFTlQ+IHsKLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7TmFtZX0gICAgICAgICAgIHsgeXliZWdpbihBVFRSSUJVVEVfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5BVFRSSUJVVEVfTkFNRSk7IH0KLSAge05vblRhZ0NvbnRlbnR9ICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyB9Ci0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotCi08QVRUUklCVVRFX0NPTlRFTlQ+IHsKLSAge0xpbmVUZXJtaW5hdG9yfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgfQotICB7Tm9uTGluZVRlcm1pbmF0b3JXaGl0ZXNwYWNlfQotICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci0gIHtDRGF0YX0gICAgICAgICAgeyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNEQVRBX0tFWVdPUkQpOyB9ICAKLQotICB7SUR9ICAgICAgICAgICAgIHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5JRF9LRVlXT1JEKTsgfSAgICAgICAKLSAge0lEUmVmfSAgICAgICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSURSRUZfS0VZV09SRCk7IH0gIAotICB7SURSZWZzfSAgICAgICAgIHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5JRFJFRlNfS0VZV09SRCk7IH0gIAotICB7RW50aXR5U3RhcnR9ICAgIHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlRJVFlfS0VZV09SRCk7IH0gIAotICB7RW50aXRpZXN9ICAgICAgIHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlRJVElFU19LRVlXT1JEKTsgfSAgCi0gIHtOTVRva2VufSAgICAgICAgeyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5NVE9LRU5fS0VZV09SRCk7IH0gIAotICB7Tk1Ub2tlbnN9ICAgICAgIHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OTVRPS0VOU19LRVlXT1JEKTsgfSAgCi0gIHtOb3RhdGlvblN0YXJ0fSAgeyB5eWJlZ2luKEFUVFJJQlVURV9FTlVNRVJBVElPTik7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OT1RBVElPTl9LRVlXT1JEKTsgfSAgCi0KLSAge1JlcXVpcmVkfSB8IHtJbXBsaWVkfSB8IHtGaXhlZH0gfCB7U2luZ2xlUXVvdGVkTGl0ZXJhbH0gfCB7IERvdWJsZVF1b3RlZExpdGVyYWx9Ci0gICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgfQotCi0gIHtMZWZ0UGFyZW59ICAgICAgeyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKEFUVFJJQlVURV9FTlVNRVJBVElPTik7IH0gIAotICB7Tm9uRW51bUNvbnRlbnR9IHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5QQVJNX0VOVElUWV9UWVBFKTsgfQotICB7Tm9uRW51bUNvbnRlbnR9fHtSaWdodFBhcmVufXx7Q2hvaWNlfSAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgfQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLX0KLQotPEFUVFJJQlVURV9ERUZBVUxUPiB7Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge1JlcXVpcmVkfSAgICAgICB7IHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlJFUVVJUkVEX0tFWVdPUkQpOyB9Ci0gIHtJbXBsaWVkfSAgICAgICAgeyB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5JTVBMSUVEX0tFWVdPUkQpOyB9Ci0gIHtGaXhlZH0gICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRklYRURfS0VZV09SRCk7IH0KLSAge1NpbmdsZVF1b3RlZExpdGVyYWx9ICB7IHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMKTsgfQotICB7RG91YmxlUXVvdGVkTGl0ZXJhbH0gIHsgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpOyB9Ci0gIHtOb25UYWdDb250ZW50fSAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyB9IC8vcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7IH0KLSAge1N0YXJ0VGFnfSB8IHtFbmRUYWd9IHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci19Ci0KLTxBVFRSSUJVVEVfRU5VTUVSQVRJT04+IHsKLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7TGVmdFBhcmVufSAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pOyB9Ci0gIHtDaG9pY2V9ICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5VTV9DSE9JQ0UpOyB9Ci0gIHtSaWdodFBhcmVufSAgICAgeyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlJJR0hUX1BBUkVOKTsgfQotICB7Tm9uRW51bUNvbnRlbnR9ICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7IH0KLSAge1N0YXJ0VGFnfSB8IHtFbmRUYWd9IHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci19Ci0KLQotLy8gKioqKioqKiogPCFFTlRJVFkuLi4+Ci08RU5USVRZX05BTUU+IHsKLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7UGVyY2VudH0gICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlBFUkNFTlQpOyB9Ci0gIHtFbnRpdHlOYW1lfSAgICAgeyB5eWJlZ2luKEVOVElUWV9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyB9Ci0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotCi08RU5USVRZX0NPTlRFTlQ+IHsKLS8vICB7RW50aXR5Q29udGVudH0geyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlRJVFlfQ09OVEVOVCk7IH0KLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7U3lzdGVtfSB8IHtQdWJsaWN9IHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihFWFRFUk5BTElEX0NPTlRFTlQpOyB9Ci0gIHtTaW5nbGVRdW90ZWRMaXRlcmFsfSAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwpOyB9Ci0gIHtEb3VibGVRdW90ZWRMaXRlcmFsfSAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpOyB9Ci0gIHtOb25UYWdDb250ZW50fSAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7IH0KLSAge1N0YXJ0VGFnfSB8IHtFbmRUYWd9IHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci19Ci0KLQotLy8gKioqKioqKiogPCFOT1RBVElPTi4uLj4KLTxOT1RBVElPTl9OQU1FPiB7Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge05hbWV9ICAgICAgICAgICB7IHl5YmVnaW4oRVhURVJOQUxJRF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyB9Ci0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotCi08RVhURVJOQUxJRF9DT05URU5UPiB7Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge1N5c3RlbX0gICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TWVNURU1fS0VZV09SRCk7IH0gIAotICB7UHVibGljfSAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlBVQkxJQ19LRVlXT1JEKTsgfSAgCi0gIHtTaW5nbGVRdW90ZWRMaXRlcmFsfSAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwpOyB9Ci0gIHtEb3VibGVRdW90ZWRMaXRlcmFsfSAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpOyB9Ci0gIHtORGF0YX0gICAgICAgICAgeyB5eWJlZ2luKE5EQVRBX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkRBVEFfS0VZV09SRCk7IH0KLSAge05vblRhZ0NvbnRlbnR9ICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgfQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLX0KLQotPE5EQVRBX0NPTlRFTlQ+IHsKLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7Tm9uVGFnQ29udGVudH0gIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkRBVEFfVkFMVUUpOyB9Ci0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotICAKLQotLy8gKioqKioqKiogPCEtLSAuLi4+Ci08Q09NTUVOVF9DT05URU5UPiB7Ci0gIHtDb21tZW50RW5kfSAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT01NRU5UX0VORCk7IH0KLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7Q29tbWVudENvbnRlbnR9IHwgIi0iIHwgIj4iICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT01NRU5UX0NPTlRFTlQpOyB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvZHRkc2tlbGV0b24gYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9kdGRza2VsZXRvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RiZTA4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9kdGRza2VsZXRvbgorKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi0KLSAgLyoqIFRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGluaXRpYWwgc2l6ZSBvZiB0aGUgbG9va2FoZWFkIGJ1ZmZlciAqLwotLS0tIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9CVUZGRVJTSVpFID0gLi4uOwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotLS0tICBsZXhpY2FsIHN0YXRlcywgY2hhcm1hcAotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLSAgZmluYWwgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0tLS0gaXNGaW5hbCBsaXN0Ci0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhcltZWV9CVUZGRVJTSVpFXTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgaW50IHl5Y29sdW1uOyAKLQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgYXQgdGhlIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLS0tLSB1c2VyIGNsYXNzIGNvZGUKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotLS0tIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uCi0KLQotICAvKioKLSAgICogUmVmaWxscyB0aGUgaW5wdXQgYnVmZmVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpZmYgdGhlcmUgd2FzIG5ldyBpbnB1dC4KLSAgICogCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X3JlZmlsbCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmIChudW1SZWFkIDwgMCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7ICAKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotCi0gICAgaWYgKHl5X3JlYWRlciAhPSBudWxsKQotICAgICAgeXlfcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGN1cnJlbnQgc3RyZWFtLCBhbmQgcmVzZXRzIHRoZQotICAgKiBzY2FubmVyIHRvIHJlYWQgZnJvbSBhIG5ldyBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIEFsbCBpbnRlcm5hbCB2YXJpYWJsZXMgYXJlIHJlc2V0LCB0aGUgb2xkIGlucHV0IHN0cmVhbSAKLSAgICogPGI+Y2Fubm90PC9iPiBiZSByZXVzZWQgKGludGVybmFsIGJ1ZmZlciBpcyBkaXNjYXJkZWQgYW5kIGxvc3QpLgotICAgKiBMZXhpY2FsIHN0YXRlIGlzIHNldCB0byA8dHQ+WVlfSU5JVElBTDwvdHQ+LgotICAgKgotICAgKiBAcGFyYW0gcmVhZGVyICAgdGhlIG5ldyBpbnB1dCBzdHJlYW0gCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eXJlc2V0KGphdmEuaW8uUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5Y2xvc2UoKTsKLSAgICB5eV9yZWFkZXIgPSByZWFkZXI7Ci0gICAgeXlfYXRFT0YgID0gZmFsc2U7Ci0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyA9IHl5X3B1c2hiYWNrUG9zID0gMDsKLSAgICB5eWxpbmUgPSB5eWNoYXIgPSB5eWNvbHVtbiA9IDA7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIDx0dD5wb3M8L3R0PiBmcm9tIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0LiAKLSAgICogCi0gICAqIEl0IGlzIGVxdWl2YWxlbnQgdG8geXl0ZXh0KCkuY2hhckF0KHBvcyksIGJ1dCBmYXN0ZXIKLSAgICoKLSAgICogQHBhcmFtIHBvcyB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciB0byBmZXRjaC4gCi0gICAqICAgICAgICAgICAgQSB2YWx1ZSBmcm9tIDAgdG8geXlsZW5ndGgoKS0xLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gcG9zCi0gICAqLwotICBmaW5hbCBwdWJsaWMgY2hhciB5eWNoYXJhdChpbnQgcG9zKSB7Ci0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9zdGFydFJlYWQrcG9zXTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogSW4gYSB3ZWxsZm9ybWVkIHNjYW5uZXIgKG5vIG9yIG9ubHkgY29ycmVjdCB1c2FnZSBvZiAKLSAgICogeXlwdXNoYmFjayhpbnQpIGFuZCBhIG1hdGNoLWFsbCBmYWxsYmFjayBydWxlKSB0aGlzIG1ldGhvZCAKLSAgICogd2lsbCBvbmx5IGJlIGNhbGxlZCB3aXRoIHRoaW5ncyB0aGF0ICJDYW4ndCBQb3NzaWJseSBIYXBwZW4iLgotICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHNvbWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcKLSAgICogKGUuZy4gYSBKRmxleCBidWcgcHJvZHVjaW5nIGEgZmF1bHR5IHNjYW5uZXIgZXRjLikuCi0gICAqCi0gICAqIFVzdWFsIHN5bnRheC9zY2FubmVyIGxldmVsIGVycm9yIGhhbmRsaW5nIHNob3VsZCBiZSBkb25lCi0gICAqIGluIGVycm9yIGZhbGxiYWNrIHJ1bGVzLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLS0tLSB5eV9TY2FuRXJyb3IgZGVjbGFyYXRpb24gIAotICAgIFN0cmluZyBtZXNzYWdlOwotICAgIHRyeSB7Ci0gICAgICBtZXNzYWdlID0gWVlfRVJST1JfTVNHW2Vycm9yQ29kZV07Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgbWVzc2FnZSA9IFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXTsKLSAgICB9Ci0KLS0tLSB0aHJvd3MgY2xhdXNlCi0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLS0tLSB5eXB1c2hiYWNrIGRlY2wgKGNvbnRhaW5zIHl5X1NjYW5FcnJvciBleGNlcHRpb24pCi0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCi0tLS0geXlfZG9Fb2YKLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLS0tLSB5eWxleCBkZWNsYXJhdGlvbgotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0gICAgLy8gY2FjaGVkIGZpZWxkczoKLSAgICBpbnQgeXlfY3VycmVudFBvc19sOwotICAgIGludCB5eV9tYXJrZWRQb3NfbDsKLSAgICBpbnQgeXlfZW5kUmVhZF9sID0geXlfZW5kUmVhZDsKLSAgICBjaGFyIFtdIHl5X2J1ZmZlcl9sID0geXlfYnVmZmVyOwotICAgIGNoYXIgW10geXljbWFwX2wgPSB5eWNtYXA7Ci0KLS0tLSBsb2NhbCBkZWNsYXJhdGlvbnMKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB5eV9tYXJrZWRQb3NfbCA9IHl5X21hcmtlZFBvczsKLQotLS0tIHN0YXJ0IGFkbWluIChsaW5lLCBjaGFyLCBjb2wgY291bnQpCi0gICAgICB5eV9hY3Rpb24gPSAtMTsKLQotICAgICAgeXlfY3VycmVudFBvc19sID0geXlfY3VycmVudFBvcyA9IAotICAgICAgICAgICAgICAgICAgICAgICB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3NfbDsKLSAgCi0tLS0gc3RhcnQgYWRtaW4gKGxleHN0YXRlIGV0YykKLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0tLS0gbmV4dCBpbnB1dCwgbGluZSwgY29sLCBjaGFyIGNvdW50LCBuZXh0IHRyYW5zaXRpb24sIGlzRmluYWwgYWN0aW9uCi0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3NfbCA9IHl5X2N1cnJlbnRQb3NfbDsgCi0tLS0gbGluZSBjb3VudCB1cGRhdGUKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbgotICAgICAgeXlfbWFya2VkUG9zID0geXlfbWFya2VkUG9zX2w7Ci0tLS0gY2hhciBjb3VudCB1cGRhdGUKLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsKLQotLS0tIGFjdGlvbnMKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0tLS0gZW9mdmFsdWUKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotLS0tIG5vIG1hdGNoCi0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0tLS0gbWFpbgotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFREQmF0Y2hOb2RlRGVsZXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFREQmF0Y2hOb2RlRGVsZXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNTE0ZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RUREJhdGNoTm9kZURlbGV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotCi0KLXB1YmxpYyBjbGFzcyBEVERCYXRjaE5vZGVEZWxldGUgewotCXByb3RlY3RlZCBEVERGaWxlIGR0ZEZpbGU7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBEVERCYXRjaE5vZGVEZWxldGUoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCXRoaXMuZHRkRmlsZSA9IGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTm9kZShEVEROb2RlIG5vZGUpIHsKLQkJLy8gZmlyc3QgY2hlY2sgaWYgdGhlIG5vZGUgaXMgY29udGFpbmVkIGJ5IGFueW9uZQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIG5vZGVzLmdldChpKTsKLQotCQkJaWYgKGN1cnJlbnROb2RlLmNvbnRhaW5zUmFuZ2Uobm9kZS5nZXRTdGFydE9mZnNldCgpLCBub2RlLmdldEVuZE9mZnNldCgpKSkgewotCQkJCS8vIHRoZW4gbm8gbmVlZCB0byBhZGQgdGhlIG5vZGUgdG8gdGhlIGxpc3QgdG8gYmUgZGVsZXRlZAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA8IGN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgJiYgbm9kZS5nZXRFbmRPZmZzZXQoKSA8PSBjdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJbm9kZXMuYWRkKGksIG5vZGUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkvLyBpZiB3ZSBnZXQgaGVyZSwgdGhlbiBhZGQgaXQgdG8gdGhlIGVuZAotCQlub2Rlcy5hZGQobm9kZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlTm9kZXMoT2JqZWN0IHJlcXVlc3RvcikgewotCQlmb3IgKGludCBpID0gbm9kZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBub2Rlcy5nZXQoaSk7Ci0JCQlkdGRGaWxlLmRlbGV0ZU5vZGUocmVxdWVzdG9yLCBub2RlKTsKLQkJfQotCQlub2Rlcy5jbGVhcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU4NTNiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFRERXh0ZXJuYWxSZWZlcmVuY2VSZW1vdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci0KLQotLyoKLSAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHVwZGF0aW5nIHRoZSBtb2RlbCB3aGVuIGl0ZW1zIGFyZSBkZWxldGVkIG9yCi0gKiBzbyB0aGF0IGl0ZW1zIHJlZmVyZW5jZWQgYnkgaXQgYXJlIGNsZWFuZWQgdXAgbm90ZSB0aGF0IHRvcCBsZXZlbCBub2RlcyBhcmUKLSAqIHF1ZXVlZCB1cCBmb3IgZGVsZXRpb24gc28gdGhhdCBpdGVyYXRpb24gb3ZlciB0aGUgbGlzdCBvZiBub2RlcyBmcm9tIHRoZQotICogZHRkZmlsZSBpcyBub3QgbWVzc2VkIHVwLiBOb3RlIHRoYXQgd2hlbiBhbiBleHRlcm5hbCBwYXJtZXRlciBlbnRpdHkKLSAqIGNoYW5nZXMsIHRoZSBjbGllbnQgb2YgdGhlIG1vZGVsIChlLmcuIGVkaXRvcikgbXVzdCBiZSBhIERUREZpbGVMaXN0ZW5lcgotICogaW1wbGVtZW50aW5nIHRoZSBsaXN0ZW5lcidzIGludGVyZmFjZSB0byBrZWVwIHRoZSBtb2RlbCdzIHJlZmVyZW50aWFsCi0gKiBpbnRlZ3JpdHkgKFNlZSBEVERNb2RlbEltcGwgZm9yIGV4YW1wbGUpLgotICovCi0KLXB1YmxpYyBjbGFzcyBEVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIgZXh0ZW5kcyBEVERWaXNpdG9yIHsKLQotCXByb3RlY3RlZCBEVERCYXRjaE5vZGVEZWxldGUgYmF0Y2hEZWxldGU7Ci0JcHJvdGVjdGVkIExpc3QgZXh0ZXJuYWxFbGVtZW50c0FuZFBhcm1FbnRpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzUGFybUVudGl0eSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNVcGRhdGluZyA9IGZhbHNlOwotCXByb3RlY3RlZCBEVEROb2RlIG5vZGVUb0RlbGV0ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG9sZFJlZk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBPYmplY3QgcmVxdWVzdG9yOwotCi0JcHVibGljIERUREV4dGVybmFsUmVmZXJlbmNlUmVtb3ZlcigpIHsKLQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBleHRlcm5hbFJlZmVyZW5jZUFib3V0VG9DaGFuZ2UoT2JqZWN0IHJlcXVlc3RvciwgRW50aXR5IGVudGl0eSkgewotCQlpZiAoaXNVcGRhdGluZykgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghZW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkgfHwgIWVudGl0eS5pc0V4dGVybmFsRW50aXR5KCkpIHsKLQkJCS8vIGlmIGl0IGlzIG5vdCBhbiBleHRlcm5hbCBwYXJhbWV0ZXIgZW50aXR5LCBpZ25vcmUgYXMgd2VsbAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaXNVcGRhdGluZyA9IHRydWU7Ci0JCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOwotCi0JCURUREZpbGUgZHRkRmlsZSA9IGVudGl0eS5nZXREVERGaWxlKCk7Ci0JCWlmIChiYXRjaERlbGV0ZSA9PSBudWxsKSB7Ci0JCQliYXRjaERlbGV0ZSA9IG5ldyBEVERCYXRjaE5vZGVEZWxldGUoZHRkRmlsZSk7Ci0JCX0KLQotCQkvLyBTZWUgdGhlIGNvbW1lbnQgYXQgdGhlIGhlYWQgb2YgdGhpcyBmaWxlIHJlZ2FyZGluZwotCQkvLyBleHRlcm5hbCBwYXJhbWV0ZXIgZW50aXRpZXMuCi0JCS8vIGV4dGVybmFsRWxlbWVudHNBbmRQYXJtRW50aXRpZXMgPQotCQkvLyBkdGRGaWxlLmdldERURE1vZGVsKCkuZ2V0RXh0ZXJuYWxNb2RlbHMoKS5nZXRFbGVtZW50Q29udGVudE5hbWVzKGVudGl0eS5nZXRQdWJsaWNJRCgpLAotCQkvLyBkdGRGaWxlLmdldERURE1vZGVsKCkucmVzb2x2ZUlEKGVudGl0eS5nZXRQdWJsaWNJRCgpLAotCQkvLyBlbnRpdHkuZ2V0U3lzdGVtSUQoKSkpOwotCi0JCXZpc2l0KGR0ZEZpbGUpOwotCi0JCWJhdGNoRGVsZXRlLmRlbGV0ZU5vZGVzKHJlcXVlc3Rvcik7Ci0KLQkJaXNVcGRhdGluZyA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWF0Y2hpbmdOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBleHRlcm5hbEVsZW1lbnRzQW5kUGFybUVudGl0aWVzLmNvbnRhaW5zKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyKSB7Ci0JCXN1cGVyLnZpc2l0QXR0cmlidXRlKGF0dHIpOwotCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJU3RyaW5nIGF0dHJUeXBlID0gYXR0ci5nZXRUeXBlKCk7Ci0KLQkJaWYgKGlzUGFyYW1ldGVyRW50aXR5UmVmKGF0dHJOYW1lKSkgewotCQkJaWYgKGlzTWF0Y2hpbmdOYW1lKGF0dHJOYW1lKSkgewotCQkJCWF0dHIuc2V0TmFtZShyZXF1ZXN0b3IsICJUZW1wTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJaWYgKGlzUGFyYW1ldGVyRW50aXR5UmVmKGF0dHJUeXBlKSkgewotCQkJaWYgKGlzTWF0Y2hpbmdOYW1lKGF0dHJUeXBlKSkgewotCQkJCWF0dHIuc2V0VHlwZShyZXF1ZXN0b3IsIEF0dHJpYnV0ZS5DREFUQSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUxpc3QoQXR0cmlidXRlTGlzdCBhdHRMaXN0KSB7Ci0JCXN1cGVyLnZpc2l0QXR0cmlidXRlTGlzdChhdHRMaXN0KTsKLQkJU3RyaW5nIGF0dExpc3ROYW1lID0gYXR0TGlzdC5nZXROYW1lKCk7Ci0JCWlmIChpc1BhcmFtZXRlckVudGl0eVJlZihhdHRMaXN0TmFtZSkpIHsKLQkJCWlmIChpc01hdGNoaW5nTmFtZShhdHRMaXN0TmFtZSkpIHsKLQkJCQlhdHRMaXN0LnNldE5hbWUocmVxdWVzdG9yLCAiVGVtcE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKLQkJaWYgKGlzUGFyYW1ldGVyRW50aXR5UmVmKGVsZW1lbnROYW1lKSkgewotCQkJaWYgKGlzTWF0Y2hpbmdOYW1lKGVsZW1lbnROYW1lKSkgewotCQkJCWVsZW1lbnQuc2V0TmFtZShyZXF1ZXN0b3IsICJUZW1wTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJc3VwZXIudmlzaXRFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0UmVmZXJlbmNlKENNQmFzaWNOb2RlIG5vZGUpIHsKLQkJc3VwZXIudmlzaXRSZWZlcmVuY2Uobm9kZSk7Ci0JCVN0cmluZyByZWZOYW1lID0gbm9kZS5nZXROYW1lKCk7Ci0JCWlmIChpc01hdGNoaW5nTmFtZShyZWZOYW1lKSkgewotCQkJYmF0Y2hEZWxldGUuYWRkTm9kZShub2RlKTsKLQkJfQotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFRETW9kZWxVcGRhdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFRETW9kZWxVcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOWNkZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURE1vZGVsVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5QYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci0KLQotLy8gdGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgdXBkYXRpbmcgdGhlIG1vZGVsIHdoZW4gaXRlbXMKLS8vIGFyZSBkZWxldGVkIG9yIGEgZXh0ZXJuYWwgcGFybSBlbnRpdHkgY2hhbmdlcyBzbyB0aGF0Ci0vLyBpdGVtcyByZWZlcmVuY2VkIGJ5IGl0IGFyZSBjbGVhbmVkIHVwCi0vLyBub3RlIHRoYXQgdG9wIGxldmVsIG5vZGVzIGFyZSBxdWV1ZWQgdXAgZm9yIGRlbGV0aW9uIHNvIHRoYXQKLS8vIGl0ZXJhdGlvbiBvdmVyIHRoZSBsaXN0IG9mIG5vZGVzIGZyb20gdGhlIGR0ZGZpbGUgaXMgbm90IG1lc3NlZCB1cAotcHVibGljIGNsYXNzIERURE1vZGVsVXBkYXRlciBleHRlbmRzIERURFZpc2l0b3IgewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJtRW50aXR5ID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1VwZGF0aW5nID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBub2Rlc1RvRGVsZXRlID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBEVEROb2RlIG5vZGVUb0RlbGV0ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG9sZFJlZk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBPYmplY3QgcmVxdWVzdG9yOwotCi0JcHVibGljIERURE1vZGVsVXBkYXRlcigpIHsKLQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBvYmplY3RBYm91dFRvQmVEZWxldGVkKE9iamVjdCByZXF1ZXN0b3IsIERURE5vZGUgbm9kZSkgewotCQlpZiAoaXNVcGRhdGluZykgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkgfHwgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7Ci0JCQkvLyBqdXN0IGlnbm9yZSBpZiBpdCBpcyBub3Qgb25lIG9mIHRoZXNlCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkgJiYgISgoRW50aXR5KSBub2RlKS5pc1BhcmFtZXRlckVudGl0eSgpKSB7Ci0JCQkvLyBpZiBpdCBpcyBub3QgYSBwYXJhbWV0ZXIgZW50aXR5LCBpZ25vcmUgYXMgd2VsbAotCQkJcmV0dXJuOwotCQl9Ci0KLQotCQlpc1VwZGF0aW5nID0gdHJ1ZTsKLQkJdGhpcy5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7Ci0JCXRoaXMubm9kZVRvRGVsZXRlID0gbm9kZTsKLQkJb2xkUmVmTmFtZSA9IG5vZGUuZ2V0TmFtZSgpOwotCQlpc1Bhcm1FbnRpdHkgPSBmYWxzZTsKLQkJbm9kZXNUb0RlbGV0ZS5jbGVhcigpOwotCi0JCWlmIChub2RlIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQlpc1Bhcm1FbnRpdHkgPSB0cnVlOwotCQkJb2xkUmVmTmFtZSA9ICIlIiArIG9sZFJlZk5hbWUgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJRFRERmlsZSBkdGRGaWxlID0gbm9kZS5nZXREVERGaWxlKCk7Ci0JCXZpc2l0KGR0ZEZpbGUpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXNUb0RlbGV0ZS5zaXplKCk7IGkrKykgewotCQkJZHRkRmlsZS5kZWxldGVOb2RlKHJlcXVlc3RvciwgKERURE5vZGUpIG5vZGVzVG9EZWxldGUuZ2V0KGkpKTsKLQkJfQotCi0JCWlzVXBkYXRpbmcgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZShBdHRyaWJ1dGUgYXR0cikgewotCQlzdXBlci52aXNpdEF0dHJpYnV0ZShhdHRyKTsKLQkJaWYgKGlzUGFybUVudGl0eSkgewotCQkJaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJCWF0dHIuc2V0TmFtZShyZXF1ZXN0b3IsICJUZW1wTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoYXR0ci5nZXRUeXBlKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQkJYXR0ci5zZXRUeXBlKHJlcXVlc3RvciwgQXR0cmlidXRlLkNEQVRBKTsKLQkJCX0KLQkJfQotCQkvLyBjaGVjayB0aGUgYXR0ciBuYW1lIGFuZCB0aGUgYXR0ciB0eXBlIHRvIHNlZSBpZiBpdAotCQkvLyBuZWVkcyB1cGRhdGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlTGlzdChBdHRyaWJ1dGVMaXN0IGF0dExpc3QpIHsKLQkJc3VwZXIudmlzaXRBdHRyaWJ1dGVMaXN0KGF0dExpc3QpOwotCQlpZiAoYXR0TGlzdC5nZXROYW1lKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQlpZiAoaXNQYXJtRW50aXR5KSB7Ci0JCQkJYXR0TGlzdC5zZXROYW1lKHJlcXVlc3RvciwgIlRlbXBOYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHNhdmUgdXAgZm9yIGxhdGVyIGRlbGV0aW9uCi0JCQkJbm9kZXNUb0RlbGV0ZS5hZGQoYXR0TGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChpc1Bhcm1FbnRpdHkpIHsKLQkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCQllbGVtZW50LnNldE5hbWUocmVxdWVzdG9yLCAiVGVtcE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXN1cGVyLnZpc2l0RWxlbWVudChlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEV4dGVybmFsUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5UmVmKSB7Ci0JCXN1cGVyLnZpc2l0RXh0ZXJuYWxQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UocGFybUVudGl0eVJlZik7Ci0JCWlmIChpc1Bhcm1FbnRpdHkgJiYgcGFybUVudGl0eVJlZi5nZXROYW1lKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQlub2Rlc1RvRGVsZXRlLmFkZChwYXJtRW50aXR5UmVmKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0UmVmZXJlbmNlKENNQmFzaWNOb2RlIG5vZGUpIHsKLQkJc3VwZXIudmlzaXRSZWZlcmVuY2Uobm9kZSk7Ci0KLQkJaWYgKG5vZGUuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJRFRETm9kZSBwYXJlbnQgPSAoRFRETm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlwYXJlbnQuZGVsZXRlKHJlcXVlc3Rvciwgbm9kZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYjllNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURE5vdGF0aW9uUmVmZXJlbmNlUmVtb3Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlRW51bUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIERURE5vdGF0aW9uUmVmZXJlbmNlUmVtb3ZlciB7Ci0JcHJvdGVjdGVkIE5vdGF0aW9uIG5vdGF0aW9uOwotCXByb3RlY3RlZCBTdHJpbmcgbm90YXRpb25OYW1lOwotCi0JcHJvdGVjdGVkIE9iamVjdCByZXF1ZXN0b3I7Ci0KLQlwdWJsaWMgRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyKCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgbm90YXRpb25BYm91dFRvQmVEZWxldGVkKE9iamVjdCByZXF1ZXN0b3IsIE5vdGF0aW9uIG5vdGF0aW9uKSB7Ci0JCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOwotCQl0aGlzLm5vdGF0aW9uID0gbm90YXRpb247Ci0JCW5vdGF0aW9uTmFtZSA9IG5vdGF0aW9uLmdldE5hbWUoKTsKLQotCQl2aXNpdChub3RhdGlvbi5nZXREVERGaWxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0KERUREZpbGUgZmlsZSkgewotCQlMaXN0IG5vZGVzID0gZmlsZS5nZXROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIG5vZGVzLmdldChpKTsKLQkJCWlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCXZpc2l0RW50aXR5KChFbnRpdHkpIGN1cnJlbnROb2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCkgewotCQkJCXZpc2l0QXR0cmlidXRlTGlzdCgoQXR0cmlidXRlTGlzdCkgY3VycmVudE5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGUoQXR0cmlidXRlIGF0dHIpIHsKLQkJaWYgKGF0dHIuZ2V0VHlwZSgpLmVxdWFscyhBdHRyaWJ1dGUuRU5VTUVSQVRFRF9OT1RBVElPTikpIHsKLQkJCUF0dHJpYnV0ZUVudW1MaXN0IGVudW1MaXN0ID0gYXR0ci5nZXRFbnVtTGlzdCgpOwotCQkJTGlzdCBub3RhdGlvbk5hbWVzID0gZW51bUxpc3QuZ2V0SXRlbXMoKTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBub3RhdGlvbk5hbWVzLml0ZXJhdG9yKCk7Ci0JCQlib29sZWFuIHVwZGF0ZVJlcXVpcmVkID0gZmFsc2U7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcgbm90YXRpb24gPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAobm90YXRpb24uZXF1YWxzKG5vdGF0aW9uTmFtZSkpIHsKLQkJCQkJdXBkYXRlUmVxdWlyZWQgPSB0cnVlOwotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJCWlmICh1cGRhdGVSZXF1aXJlZCkgewotCQkJCVN0cmluZ1tdIG5ld0l0ZW1zID0gbmV3IFN0cmluZ1tub3RhdGlvbk5hbWVzLnNpemUoKV07Ci0JCQkJbm90YXRpb25OYW1lcy50b0FycmF5KG5ld0l0ZW1zKTsKLQkJCQllbnVtTGlzdC5zZXRJdGVtcyhyZXF1ZXN0b3IsIG5ld0l0ZW1zKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlTGlzdChBdHRyaWJ1dGVMaXN0IGF0dExpc3QpIHsKLQkJQXR0cmlidXRlIGF0dHIgPSAoQXR0cmlidXRlKSBhdHRMaXN0LmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGF0dHIgIT0gbnVsbCkgewotCQkJdmlzaXRBdHRyaWJ1dGUoYXR0cik7Ci0JCQlhdHRyID0gKEF0dHJpYnV0ZSkgYXR0ci5nZXROZXh0U2libGluZygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFbnRpdHkoRW50aXR5IGVudGl0eSkgewotCQlpZiAoZW50aXR5LmdldE5vdGF0aW9uTmFtZSgpLmVxdWFscyhub3RhdGlvbk5hbWUpKSB7Ci0JCQllbnRpdHkuc2V0Tm90YXRpb25OYW1lKHJlcXVlc3RvciwgIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0vLyBEVEROb3RhdGlvblJlbW92ZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERSZWZlcmVuY2VVcGRhdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFREUmVmZXJlbmNlVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTkyOTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERSZWZlcmVuY2VVcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUVudW1MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotCi0KLS8vIHRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHVwZGF0aW5nIGFueSBkdGQgbm9kZSBpbgotLy8gcmVzcG9uc2UgdG8gYSBjaGFuZ2UgaW4gdGhlIG5vZGUgdGhhdCB0aGV5IHJlZmVyZW5jZQotcHVibGljIGNsYXNzIERURFJlZmVyZW5jZVVwZGF0ZXIgZXh0ZW5kcyBEVERWaXNpdG9yIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdGF0aW9uID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Bhcm1FbnRpdHkgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzVXBkYXRpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5ld05hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgb2xkUmVmTmFtZSA9ICIiLCBuZXdSZWZOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXByb3RlY3RlZCBEVEROb2RlIHJlZmVyZW5jZWROb2RlID0gbnVsbDsKLQotCS8vIHRoZSByZWZlcmVuY2VzIExpc3QgaXMgYSBjYWNoZSBvZiB0aGUgRFRETm9kZXMgdGhhdCBhcmUgY2hhbmdlZAotCS8vIGFzIGEgcmVzdWx0IG9mIGEgY2FsbCB0byBuYW1lQWJvdXRUb0NoYW5nZSgpLiBUaGUgaWRlYSBpcyB0aGF0Ci0JLy8gaWYgYSBzdWJzZXF1ZW50IGNhbGwgY29tZXMgaW4gdGhhdCBjaGFuZ2VzIHRoZSBuYW1lIG9mIHRoZSBzYW1lCi0JLy8gb2JqZWN0IGZvciB3aGljaCB0aGlzIGNhY2hlIGV4aXN0cyBmb3IsIHRoZW4gd2Ugb3B0aW1pemUgdGhlCi0JLy8gcGF0aCBieSBqdXN0IHdhbGtpbmcgdGhlIGNhY2hlCi0JcHJpdmF0ZSBMaXN0IHJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIE9iamVjdCByZXF1ZXN0b3I7Ci0KLQlwdWJsaWMgRFREUmVmZXJlbmNlVXBkYXRlcigpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyQ2FjaGUoKSB7Ci0JCXJlZmVyZW5jZWROb2RlID0gbnVsbDsKLQkJcmVmZXJlbmNlcy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBuYW1lQWJvdXRUb0NoYW5nZShPYmplY3QgcmVxdWVzdG9yLCBEVEROb2RlIHJlZmVyZW5jZWROb2RlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAoaXNVcGRhdGluZykgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghKHJlZmVyZW5jZWROb2RlIGluc3RhbmNlb2YgRW50aXR5IHx8IHJlZmVyZW5jZWROb2RlIGluc3RhbmNlb2YgRWxlbWVudCB8fCByZWZlcmVuY2VkTm9kZSBpbnN0YW5jZW9mIE5vdGF0aW9uKSkgewotCQkJLy8ganVzdCBpZ25vcmUgaWYgaXQgaXMgbm90IG9uZSBvZiB0aGVzZQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChyZWZlcmVuY2VkTm9kZSBpbnN0YW5jZW9mIEVudGl0eSAmJiAhKChFbnRpdHkpIHJlZmVyZW5jZWROb2RlKS5pc1BhcmFtZXRlckVudGl0eSgpKSB7Ci0JCQkvLyBpZiBpdCBpcyBub3QgYSBwYXJhbWV0ZXIgZW50aXR5LCBpZ25vcmUgYXMgd2VsbAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaXNVcGRhdGluZyA9IHRydWU7Ci0JCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOwotCQlvbGRSZWZOYW1lID0gcmVmZXJlbmNlZE5vZGUuZ2V0TmFtZSgpOwotCQl0aGlzLm5ld05hbWUgPSBuZXdSZWZOYW1lID0gbmV3TmFtZTsKLQkJaXNQYXJtRW50aXR5ID0gZmFsc2U7Ci0JCWlzTm90YXRpb24gPSByZWZlcmVuY2VkTm9kZSBpbnN0YW5jZW9mIE5vdGF0aW9uOwotCi0JCWlmIChyZWZlcmVuY2VkTm9kZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJaXNQYXJtRW50aXR5ID0gdHJ1ZTsKLQkJCW9sZFJlZk5hbWUgPSAiJSIgKyBvbGRSZWZOYW1lICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCW5ld1JlZk5hbWUgPSAiJSIgKyBuZXdSZWZOYW1lICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWlmICh0aGlzLnJlZmVyZW5jZWROb2RlICE9IG51bGwpIHsKLQkJCS8vIGNoZWNrIGlmIHRoZSBwcmV2aW91cyByZWZlcmVuY2VkIG5vZGUgdGhhdCB3YXMgY2hhbmdlZAotCQkJLy8gaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB0aGF0IGlzIGNvbWluZyBpbi4gaWYgc28sIGp1c3QKLQkJCS8vIGNoYW5nZSB0aGUgcHJldmlvdXMgcmVnaW9ucwotCQkJaWYgKHRoaXMucmVmZXJlbmNlZE5vZGUgPT0gcmVmZXJlbmNlZE5vZGUpIHsKLQkJCQlxdWlja1VwZGF0ZSgpOwotCQkJCWlzVXBkYXRpbmcgPSBmYWxzZTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyBjbGVhciB0aGUgY2FjaGUgaWYgd2UgZ2V0IGhlcmUKLQkJdGhpcy5yZWZlcmVuY2VkTm9kZSA9IHJlZmVyZW5jZWROb2RlOwotCQlyZWZlcmVuY2VzLmNsZWFyKCk7Ci0JCURUREZpbGUgZHRkRmlsZSA9IHJlZmVyZW5jZWROb2RlLmdldERUREZpbGUoKTsKLQkJdmlzaXQoZHRkRmlsZSk7Ci0JCWlzVXBkYXRpbmcgPSBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBxdWlja1VwZGF0ZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgcmVmZXJlbmNlcy5nZXQoaSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQl2aXNpdEVsZW1lbnQoKEVsZW1lbnQpIG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QpIHsKLQkJCQl2aXNpdEF0dHJpYnV0ZUxpc3QoKEF0dHJpYnV0ZUxpc3QpIG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJCXZpc2l0QXR0cmlidXRlKChBdHRyaWJ1dGUpIG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQkJdmlzaXRSZWZlcmVuY2UoKENNQmFzaWNOb2RlKSBub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIHsKLQkJCQl2aXNpdEV4dGVybmFsUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKChQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIG5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGUoQXR0cmlidXRlIGF0dHIpIHsKLQkJc3VwZXIudmlzaXRBdHRyaWJ1dGUoYXR0cik7Ci0JCWlmIChpc1Bhcm1FbnRpdHkpIHsKLQkJCS8vIGNoZWNrIHRoZSBhdHRyIG5hbWUgYW5kIHRoZSBhdHRyIHR5cGUgdG8gc2VlIGlmIGl0Ci0JCQkvLyBuZWVkcyB1cGRhdGluZwotCQkJaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJCWF0dHIuc2V0TmFtZShyZXF1ZXN0b3IsIG5ld1JlZk5hbWUpOwotCQkJCXJlZmVyZW5jZXMuYWRkKGF0dHIpOwotCQkJfQotCQkJaWYgKGF0dHIuZ2V0VHlwZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJCWF0dHIuc2V0VHlwZShyZXF1ZXN0b3IsIG5ld1JlZk5hbWUpOwotCQkJCXJlZmVyZW5jZXMuYWRkKGF0dHIpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGlzTm90YXRpb24gJiYgYXR0ci5nZXRUeXBlKCkuZXF1YWxzKEF0dHJpYnV0ZS5FTlVNRVJBVEVEX05PVEFUSU9OKSkgewotCQkJQXR0cmlidXRlRW51bUxpc3QgZW51bUxpc3QgPSBhdHRyLmdldEVudW1MaXN0KCk7Ci0JCQlMaXN0IGl0ZW1zID0gZW51bUxpc3QuZ2V0SXRlbXMoKTsKLQkJCWJvb2xlYW4gdXBkYXRlTmVlZGVkID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5vdGF0aW9uTmFtZSA9IChTdHJpbmcpIGl0ZW1zLmdldChpKTsKLQkJCQlpZiAobm90YXRpb25OYW1lLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJCQl1cGRhdGVOZWVkZWQgPSB0cnVlOwotCQkJCQlpdGVtcy5zZXQoaSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHVwZGF0ZU5lZWRlZCkgewotCQkJCVN0cmluZ1tdIG5ld0l0ZW1zID0gbmV3IFN0cmluZ1tpdGVtcy5zaXplKCldOwotCi0JCQkJZW51bUxpc3Quc2V0SXRlbXMoKFN0cmluZ1tdKSBpdGVtcy50b0FycmF5KG5ld0l0ZW1zKSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlTGlzdChBdHRyaWJ1dGVMaXN0IGF0dExpc3QpIHsKLQkJaWYgKCFpc05vdGF0aW9uICYmIGF0dExpc3QuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJYXR0TGlzdC5zZXROYW1lKHJlcXVlc3RvciwgbmV3UmVmTmFtZSk7Ci0JCQlyZWZlcmVuY2VzLmFkZChhdHRMaXN0KTsKLQkJfQotCQlzdXBlci52aXNpdEF0dHJpYnV0ZUxpc3QoYXR0TGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoaXNQYXJtRW50aXR5KSB7Ci0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQkJZWxlbWVudC5zZXROYW1lKHJlcXVlc3RvciwgbmV3UmVmTmFtZSk7Ci0JCQkJcmVmZXJlbmNlcy5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIudmlzaXRFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RXh0ZXJuYWxQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRpdHlSZWYpIHsKLQkJc3VwZXIudmlzaXRFeHRlcm5hbFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShwYXJtRW50aXR5UmVmKTsKLQkJaWYgKHBhcm1FbnRpdHlSZWYuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJcGFybUVudGl0eVJlZi5zZXRSZWZlcmVuY2VkRW50aXR5KHJlcXVlc3RvciwgbmV3TmFtZSk7Ci0JCQlyZWZlcmVuY2VzLmFkZChwYXJtRW50aXR5UmVmKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0UmVmZXJlbmNlKENNQmFzaWNOb2RlIG5vZGUpIHsKLQkJc3VwZXIudmlzaXRSZWZlcmVuY2Uobm9kZSk7Ci0JCWlmIChpc1BhcmFtZXRlckVudGl0eVJlZihvbGRSZWZOYW1lKSAmJiAhaXNQYXJtRW50aXR5KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAobm9kZS5nZXROYW1lKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQlub2RlLnNldE5hbWUocmVxdWVzdG9yLCBuZXdSZWZOYW1lKTsKLQkJCXJlZmVyZW5jZXMuYWRkKG5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURFVuaXF1ZU5hbWVIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERVbmlxdWVOYW1lSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NDIxNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURFVuaXF1ZU5hbWVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBEVERVbmlxdWVOYW1lSGVscGVyIHsKLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJcmV0dXJuICgoRWxlbWVudCkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQlyZXR1cm4gKChFbnRpdHkpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE5vdGF0aW9uKSB7Ci0JCQlyZXR1cm4gKChOb3RhdGlvbikgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQXR0cmlidXRlKSB7Ci0JCQlyZXR1cm4gKChBdHRyaWJ1dGUpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSAvLyBNb2RlbCBHcm91cCBDb250ZW50Ci0JCXsKLQkJCXJldHVybiAoKENNQmFzaWNOb2RlKSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRVbmlxdWVBdHRyaWJ1dGVOYW1lKEVsZW1lbnQgZWxlbWVudCkgewotCQlMaXN0IGF0dHJzID0gZWxlbWVudC5nZXRFbGVtZW50QXR0cmlidXRlcygpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShhdHRycywgIk5ld0F0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlRWxlbWVudE5hbWUoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCUxpc3QgZWxlbWVudHMgPSBkdGRGaWxlLmdldEVsZW1lbnRzQW5kUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlcygpLmdldE5vZGVzKCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKGVsZW1lbnRzLCAiTmV3RWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlRW50aXR5TmFtZShEVERGaWxlIGR0ZEZpbGUpIHsKLQkJTGlzdCBlbnRpdGllcyA9IGR0ZEZpbGUuZ2V0RW50aXRpZXMoKS5nZXROb2RlcygpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShlbnRpdGllcywgIk5ld0VudGl0eSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlTmFtZShMaXN0IG9ianMsIFN0cmluZyB0b2tlbikgewotCQlpbnQgY291bnRlciA9IDE7Ci0KLQkJYm9vbGVhbiB1bmlxdWVOYW1lID0gZmFsc2U7Ci0JCXdoaWxlICghdW5pcXVlTmFtZSkgewotCQkJU3RyaW5nIG5ld05hbWUgPSB0b2tlbiArIG5ldyBJbnRlZ2VyKGNvdW50ZXIrKyk7Ci0JCQl1bmlxdWVOYW1lID0gdHJ1ZTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBvYmpzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJU3RyaW5nIG9iak5hbWUgPSBnZXROYW1lKG9iaik7Ci0JCQkJaWYgKG9iak5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJCXVuaXF1ZU5hbWUgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHVuaXF1ZU5hbWUpIHsKLQkJCQlyZXR1cm4gbmV3TmFtZTsKLQkJCX0KLQkJfQotCQkvLyB3ZSBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJcmV0dXJuICJObyBOYW1lIGZvdW5kIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZU5vdGF0aW9uTmFtZShEVERGaWxlIGR0ZEZpbGUpIHsKLQkJTGlzdCBub3RhdGlvbnMgPSBkdGRGaWxlLmdldE5vdGF0aW9ucygpLmdldE5vZGVzKCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKG5vdGF0aW9ucywgIk5ld05vdGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgRFREVW5pcXVlTmFtZUhlbHBlcigpIHsKLQl9Ci0KLX0gLy8gRFREVW5pcXVlTmFtZUhlbHBlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiN2I3YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5QYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci0KLQotcHVibGljIGNsYXNzIERURFZpc2l0b3IgewotCi0JcHVibGljIERURFZpc2l0b3IoKSB7Ci0KLQl9Ci0KLQkvLyB1dGlsaXR5IG1ldGhvZAotCXB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyRW50aXR5UmVmKFN0cmluZyByZWZlcmVuY2UpIHsKLQkJaWYgKHJlZmVyZW5jZS5sZW5ndGgoKSA+IDApIHsKLQkJCXJldHVybiByZWZlcmVuY2UuY2hhckF0KDApID09ICclJyAmJiByZWZlcmVuY2UuY2hhckF0KHJlZmVyZW5jZS5sZW5ndGgoKSAtIDEpID09ICc7JzsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXQoRFRERmlsZSBmaWxlKSB7Ci0JCUxpc3Qgbm9kZXMgPSBmaWxlLmdldE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJCURURE5vZGUgY3VycmVudE5vZGUgPSAoRFRETm9kZSkgbm9kZXMuZ2V0KGkpOwotCQkJaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCXZpc2l0RWxlbWVudCgoRWxlbWVudCkgY3VycmVudE5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQkJdmlzaXRBdHRyaWJ1dGVMaXN0KChBdHRyaWJ1dGVMaXN0KSBjdXJyZW50Tm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgewotCQkJCXZpc2l0RXh0ZXJuYWxQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgY3VycmVudE5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGUoQXR0cmlidXRlIGF0dHIpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUxpc3QoQXR0cmlidXRlTGlzdCBhdHRMaXN0KSB7Ci0JCS8vIG5vdGUgdGhhdCB3ZSBkb24ndCB2aXNpdCBhdHRyaWJ1dGVzIGhlcmUgYmVjYXVzZSB3ZQotCQkvLyB3YW50IHRoZSBlbGVtZW50IHRvIHZpc2l0IHRoZW0gd2l0aCBpdCdzIGNvbnNvbGlkYXRlZCBsaXN0Ci0JCS8vIHRoYXQgaXQgY3JlYXRlcyBieSBnYXRoZXJpbmcgYWxsIGF0dHJpYnV0ZSBsaXN0cyB0b2dldGhlcgotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlcyhMaXN0IGF0dHJpYnV0ZXMpIHsKLQkJaW50IHNpemUgPSBhdHRyaWJ1dGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUF0dHJpYnV0ZSBhdHRyID0gKEF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoaSk7Ci0JCQl2aXNpdEF0dHJpYnV0ZShhdHRyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Q29udGVudE5vZGUoQ01Ob2RlIGNvbnRlbnQpIHsKLQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJQ01CYXNpY05vZGUgYmFzaWNOb2RlID0gKENNQmFzaWNOb2RlKSBjb250ZW50OwotCQkJaWYgKGJhc2ljTm9kZS5pc1JlZmVyZW5jZSgpKSB7Ci0JCQkJdmlzaXRSZWZlcmVuY2UoYmFzaWNOb2RlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCXZpc2l0R3JvdXBOb2RlKChDTUdyb3VwTm9kZSkgY29udGVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNNTm9kZSBjb250ZW50ID0gZWxlbWVudC5nZXRDb250ZW50TW9kZWwoKTsKLQkJdmlzaXRDb250ZW50Tm9kZShjb250ZW50KTsKLQkJdmlzaXRBdHRyaWJ1dGVzKGVsZW1lbnQuZ2V0RWxlbWVudEF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFeHRlcm5hbFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudGl0eVJlZikgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0R3JvdXBOb2RlKENNR3JvdXBOb2RlIGdyb3VwKSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSBncm91cC5nZXRDaGlsZHJlbkxpc3QoKTsKLQkJaW50IHNpemUgPSBjaGlsZHJlbi5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQl2aXNpdENvbnRlbnROb2RlKChDTU5vZGUpIGNoaWxkcmVuLmdldChpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFJlZmVyZW5jZShDTUJhc2ljTm9kZSBub2RlKSB7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9MYWJlbFZhbHVlUGFpci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0xhYmVsVmFsdWVQYWlyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YjhjZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0xhYmVsVmFsdWVQYWlyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLQotcHVibGljIGNsYXNzIExhYmVsVmFsdWVQYWlyIHsKLQotCXB1YmxpYyBTdHJpbmcgZkxhYmVsOwotCXB1YmxpYyBPYmplY3QgZlZhbHVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBuYW1lL3ZhbHVlIGl0ZW0KLQkgKi8KLQlwdWJsaWMgTGFiZWxWYWx1ZVBhaXIoU3RyaW5nIGxhYmVsLCBPYmplY3QgdmFsdWUpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShsYWJlbCAhPSBudWxsKTsKLQkJZkxhYmVsID0gbGFiZWw7Ci0JCWZWYWx1ZSA9IHZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvdGV4dC9JRFREUGFydGl0aW9ucy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS90ZXh0L0lEVERQYXJ0aXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YjYyOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS90ZXh0L0lEVERQYXJ0aXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnRleHQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgotICogSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uIHR5cGVzIERURC4KLSAqIENsaWVudHMgc2hvdWxkIHJlZmVyZW5jZSB0aGUgcGFydGl0aW9uIHR5cGUgU3RyaW5ncyBkZWZpbmVkIGhlcmUgZGlyZWN0bHkuCi0gKiAKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJRFREUGFydGl0aW9ucyB7Ci0JCi0JU3RyaW5nIERURF9ERUZBVUxUID0gIm9yZy5lY2xpcHNlLndzdC5kdGQuREVGQVVMVCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZTVmNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtcHJvcGVydGllcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDQ1NjYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLXJ1bnRpbWUKLWR0ZHVpLmphcgotKi56aXAKLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLUBkb3QKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxNzNlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3Byb2plY3Rpb25wZXJmPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YjIwOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmR0ZC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzkyMTY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jU2F0IE1hciAyNCAwMjo1NzozNSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYzdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTIyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jTW9uIEFwciAxNyAwMjowMTozMyBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMyZjk3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmR0ZC51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjMwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5kdGQudWksCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZG5kO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnJlZ2lzdHJ5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5zdHlsZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGVtcGxhdGVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC50ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5wcm9wZXJ0aWVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC53aXphcmQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDEsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjQwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAxLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDEsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjguMSw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTc5ZTgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICBEYXZpZCBDYXJ2ZXIsIFNUQVIgLSBhZGQgbmV3IGR0ZCBmaWxlIHRlbXBsYXRlcywgYnVnIDE2MjMyMQotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICB0ZW1wbGF0ZXMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICBzcmMtcHJvcGVydGllcy8KLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9EVERGaWxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9EVERGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRlZTUzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvRFRERmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvYnJvd3NlYnV0dG9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9icm93c2VidXR0b24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2RhZTU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9icm93c2VidXR0b24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfQXR0cmlidXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2N0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYmI3YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfQXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2N0b29sMTYvQUREX0VsZW1lbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjQ4ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhODIzNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2N0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNjhmYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9BdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2ZiNzgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9FbGVtZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0VsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzU1ZTVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0VsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTU4ZTExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0VsZW1lbnRUb0Nvbk1vZGVsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9Hcm91cFRvQ29uTW9kZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTI1YTIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2R0ZF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdkdGRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNmNjM0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2R0ZF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfQXR0cmlidXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYmI3YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfQXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvQUREX0VsZW1lbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjQ4ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhODIzNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNjhmYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvZ2VuZXJhdGVfeG1sLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvZ2VuZXJhdGVfeG1sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkNWRkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2dlbmVyYXRlX3htbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2R0ZF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdkdGRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBiMWE3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2R0ZF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0NvbW1lbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0NvbW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTYxMWQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0FERF9Db21tZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0FERF9FbnRpdHkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0VudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNDE1MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0VudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9BRERfRW50aXR5X1JlZmVyZW5jZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9BRERfRW50aXR5X1JlZmVyZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZmE5YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0VudGl0eV9SZWZlcmVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX05vdGF0aW9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0FERF9Ob3RhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YWQwODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX05vdGF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0RUREZpbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvRFRERmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMWM0MzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvRFRERmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9uZXdkdGRfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L25ld2R0ZF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzExNWZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L25ld2R0ZF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvb3JnYW5pemVfZHRkX2xvZ2ljYWxseS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9vcmdhbml6ZV9kdGRfbG9naWNhbGx5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzYzZiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9vcmdhbml6ZV9kdGRfbG9naWNhbGx5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L3NvcnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvc29ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYzVkMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvc29ydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlYmRiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvdmFsaWRhdGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvdmFsaWRhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjE5NmU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L3ZhbGlkYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdkdGRmaWxlX3dpei5wbmcgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3ZHRkZmlsZV93aXoucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzZkNzkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdkdGRmaWxlX3dpei5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNWI1MGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hIFByb3BlcnRpZXMgZmlsZSBmb3IgY29tcG9uZW50OiBYTURURCAtIFhNTCBUb29scyBEVEQgRWRpdG9yCi0hIFBhY2thZ2VkIGZvciB0cmFuc2xhdGlvbiBpbjogIHhtbC56aXAKLQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVNTRSBEVEQgU291cmNlIEVkaXRvcgotCi1EVERfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWU9RFREIEVkaXRvcgotX1VJX0xBQkVMX0RURF9GSUxFUz1EVEQgRmlsZXMKLURURF9UZW1wbGF0ZXMubmFtZT1UZW1wbGF0ZXMKLV9VSV9MQUJFTF9EVERfU1RZTEVTPVN0eWxlcwotRFREX1N5bnRheF9Db2xvcmluZz1TeW50YXggQ29sb3JpbmcKLV9VSV9XSVpBUkRfTkVXX0RURD1EVEQKLV9VSV9DUkVBVEVfTkVXX0RURF9GSUxFPUNyZWF0ZSBhIG5ldyBEVEQgZmlsZQotIyMKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbD1FbmNsb3NpbmcgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIGVuY2xvc2luZyBlbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsPU5leHQgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsPVByZXZpb3VzIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWw9UmVzdG9yZSBMYXN0IFNlbGVjdGlvbgotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwPVJlc3RvcmUgbGFzdCBzZWxlY3Rpb24KLSMjCi1BZGRUYXNrLmxhYmVsPUFkZCAmVGFzay4uLgotQWRkVGFzay50b29sdGlwPUFkZCBUYXNrLi4uCi1BZGRCb29rbWFyay5sYWJlbD1BZGQgQm9vJmttYXJrLi4uCi1BZGRCb29rbWFyay50b29sdGlwPUFkZCBCb29rbWFyay4uLgotU2VsZWN0UnVsZXIubGFiZWw9U2VsZWN0IFJ1bGVyCi0jIwotX1VJX01FTlVfVkFMSURBVEVfRFREICAgICAgICAgICAgICAgPSAmVmFsaWRhdGUgRFREIEZpbGUKLQotRFREX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1OZXcgRFRECi1fVUlfTEFCRUxfR0VORVJBTD1HZW5lcmFsCi1fVUlfTEFCRUxfT1RIRVI9T3RoZXIKLV9VSV9MQUJFTF9BVFRSSUJVVEVTPUF0dHJpYnV0ZXMKLV9VSV9MQUJFTF9ET0NVTUVOVEFUSU9OPURvY3VtZW50YXRpb24KLSMjCi1wcmVmZXJlbmNlS2V5d29yZHMuZmlsZXM9ZWRpdG9yIGR0ZCBjcmVhdGluZyBmaWxlcyBzdWZmaXggc3BlY2lmaWVkCi1wcmVmZXJlbmNlS2V5d29yZHMudGVtcGxhdGVzPWVkaXRvciBkdGQgdGVtcGxhdGVzIHNuaXBwZXQgbWFjcm9zCi1wcmVmZXJlbmNlS2V5d29yZHMuc3R5bGVzPWVkaXRvciBkdGQgc3R5bGUgY3VzdG9taXplIHN5bnRheCBoaWdobGlnaHRpbmcgdHlwZSB0ZXh0IGNvbnRlbnQgZm9yZWdyb3VuZCBiYWNrZ3JvdW5kIGJvbGQgY29sb3IKLQotQ29sb3JzLmR0ZERlZmF1bHQ9RFREIERlZmF1bHQKLUNvbG9ycy5kdGRUYWc9RFREIFRhZwotQ29sb3JzLmR0ZFRhZ05hbWU9RFREIFRhZyBOYW1lCi1Db2xvcnMuZHRkQ29tbWVudD1EVEQgQ29tbWVudAotQ29sb3JzLmR0ZEtleXdvcmQ9RFREIEtleXdvcmQKLUNvbG9ycy5kdGRTdHJpbmc9RFREIFN0cmluZwotQ29sb3JzLmR0ZERhdGE9RFREIERhdGEKLUNvbG9ycy5kdGRTeW1ib2w9RFREIFN5bWJvbAotCQkJClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE1YzI1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotCQk8IS0tIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIiAtLT4KLQkJPGVkaXRvcgotCQkJbmFtZT0iJURURF9Tb3VyY2VfUGFnZV9FZGl0b3IubmFtZSIKLQkJCWljb249IiRubCQvaWNvbnMvZnVsbC9vYmoxNi9EVERGaWxlLmdpZiIKLQkJCWNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yLkFjdGlvbkNvbnRyaWJ1dG9yRFREIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFRERWRpdG9yIgotCQkJc3ltYm9saWNGb250TmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlLnNvdXJjZSI+Ci0JCQk8Y29udGVudFR5cGVCaW5kaW5nCi0JCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIgLz4KLQkJPC9lZGl0b3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXRvckNvbmZpZ3VyYXRpb24iPgotCQk8Y29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZS5EVERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiIC8+Ci0JCTxzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImNoYXJhY3RlcnBhaXJtYXRjaGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGV4dC5EVEREb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIiAvPgotCQk8IS0tIGNvbW1lbnQgb3V0IHRpbGwgYWJsZSB0byBpbXByb3ZlIGR0ZCBmb2xkaW5nCi0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9InN0cnVjdHVyZWR0ZXh0Zm9sZGluZ3Byb3ZpZGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvamVjdGlvbi5TdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckRURCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIgLz4KLQkJLS0+Ci0JCTxwcm92aXNpb25hbERlZmluaXRpb24KLQkJCXR5cGU9InByZWZlcmVuY2VwYWdlcyIKLQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnByZWZlcmVuY2VzLmR0ZCwgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5kdGQudGVtcGxhdGVzLCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmR0ZC5zdHlsZXMiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiIC8+Ci0JCTwhLS0gcHJvdmlkZSBzeW50YXggaGlnaGxpZ2h0aW5nIGZvciBEVEQgc3Vic2V0IHdpdGhpbiBYTUwgLS0+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImxpbmVzdHlsZXByb3ZpZGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JEVERTdWJTZXQiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC54bWwuZHRkLmludGVybmFsX3N1YnNldCIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0ic3BlbGxpbmdyZWdpb25zIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLnBhcnNlci5EVERSZWdpb25UeXBlcy5DT01NRU5UX0NPTlRFTlQiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JBY3Rpb25zIj4KLQkJPGVkaXRvckNvbnRyaWJ1dGlvbgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2Uuc291cmNlLmVkaXRvckFjdGlvbnMiCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QuZW5jbG9zaW5nIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdE5leHQiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lm5leHQiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdE5leHRYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0TmV4dCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5wcmV2aW91cyIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5IgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5sYXN0IgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RIaXN0b3J5QWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiPgotCQkJPC9hY3Rpb24+Ci0JCTwvZWRpdG9yQ29udHJpYnV0aW9uPgotICAgICAgICA8ZWRpdG9yQ29udHJpYnV0aW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5ydWxlci5hY3Rpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJEb3VibGVDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iLz4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlU2VsZWN0UnVsZXIubGFiZWwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iLz4KLSAgICAgICAgPC9lZGl0b3JDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIHVzZSBhIHNwZWNpZmljIGFubm90YXRpb24gbW9kZWwgd2l0aCBGaWxlQnVmZmVycyAtLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmFubm90YXRpb25Nb2RlbENyZWF0aW9uIj4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWxGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBSZWdpc3RlciB0aGUgVUkgYWRhcHRlciBmYWN0b3J5IHByb3ZpZGVyIC0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbiI+Ci0JCTxhZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yRFREIj4KLQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIgLz4KLQkJPC9hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBFZGl0b3IgYWN0aW9uc2V0cyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb25zIj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5hY3Rpb25TZXQuYW5ub3RhdGlvbk5hdmlnYXRpb24iPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2Uuc291cmNlIiAvPgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLk5hdmlnYXRlQWN0aW9uU2V0Ij4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlLnNvdXJjZSIgLz4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotCQk8cGFnZQotCQkJbmFtZT0iJV9VSV9MQUJFTF9EVERfRklMRVMiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcmVmZXJlbmNlcy54bWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5EVERGaWxlc1ByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkucHJlZmVyZW5jZXMuZHRkIj4KLSAgICAgICAgIAk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5maWxlcyIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlRFREX1RlbXBsYXRlcy5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkucHJlZmVyZW5jZXMuZHRkIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmR0ZC50ZW1wbGF0ZXMiPgotICAgICAgICAgCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnRlbXBsYXRlcyIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlRFREX1N5bnRheF9Db2xvcmluZyIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnByZWZlcmVuY2VzLmR0ZCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkRURFN5bnRheENvbG9yaW5nUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmR0ZC5zdHlsZXMiPgotICAgICAgICAgCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnN0eWxlcyIvPgotCQk8L3BhZ2U+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSBLZXl3b3JkcyBmb3IgcHJlZmVyZW5jZSBhbmQgcHJvcGVydGllcyBwYWdlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5rZXl3b3JkcyI+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy5maWxlcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmZpbGVzIi8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy50ZW1wbGF0ZXMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS50ZW1wbGF0ZXMiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLnN0eWxlcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnN0eWxlcyIvPgotICAgIDwvZXh0ZW5zaW9uPgotCi0JPCEtLSBOZXcgRFREIHdpemFyZCAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLQkJPHdpemFyZAotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwud2l6YXJkLk5ld0RURFdpemFyZCIKLQkJCW5hbWU9IiVfVUlfV0laQVJEX05FV19EVEQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC53aXphcmQuTmV3RFREV2l6YXJkIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5YTUxDYXRlZ29yeSIKLQkJCWljb249IiRubCQvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2R0ZF93aXouZ2lmIj4KLQkJCTxkZXNjcmlwdGlvbj4lX1VJX0NSRUFURV9ORVdfRFREX0ZJTEU8L2Rlc2NyaXB0aW9uPgotCQkJPHNlbGVjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIiAvPgotCQk8L3dpemFyZD4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gaW5pdGlhbGl6ZSBEVEQgdWkgcHJlZmVyZW5jZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5EVERVSVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCQk8dmlld2VyQ29udHJpYnV0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UuUnVsZXJDb250ZXh0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IucnVsZXIuY29udGV4dC5hY3Rpb25zIj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZFRhc2subGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuQWRkVGFza19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZFRhc2sudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmJvb2ttYXJrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZEJvb2ttYXJrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIj4KLQkJCTwvYWN0aW9uPgotCQk8L3ZpZXdlckNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gVGVtcGxhdGVzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGVtcGxhdGVzIj4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlRFREX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlRFREIgotCQkJaWQ9ImR0ZF9uZXciPgotCQk8L2NvbnRleHRUeXBlPgotICA8aW5jbHVkZQotICAgICAgICBmaWxlPSJ0ZW1wbGF0ZXMvZHRkZGVmYXVsdC10ZW1wbGF0ZXMueG1sIgotICAgICAgICB0cmFuc2xhdGlvbnM9IiRubCQvdGVtcGxhdGVzL2R0ZGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMiPgotICA8L2luY2x1ZGU+Ci0JPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnByb3BlcnR5Q29udHJpYnV0b3IiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQucHJvcGVydHlDb250cmlidXRvciI+Ci0gICAgICA8cHJvcGVydHlDb250cmlidXRvcgotICAgICAgICAgICAgY29udHJpYnV0b3JJZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiCi0gICAgICAgICAgICBsYWJlbFByb3ZpZGVyPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5EVERTZWN0aW9uTGFiZWxQcm92aWRlciIKLSAgICAgICAgICAgIHR5cGVNYXBwZXI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkRURFR5cGVNYXBwZXIiPgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJkdGQudWkuZ2VuZXJhbCIvPgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJkdGQudWkub3RoZXIiLz4KLSAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5Ci0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZHRkLnVpLmF0dHJpYnV0ZXMiLz4KLSAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5Ci0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZHRkLnVpLmRvY3VtZW50YXRpb24iLz4KLSAgICAgIDwvcHJvcGVydHlDb250cmlidXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQucHJvcGVydHlUYWJzIj4KLSAgICAgIDxwcm9wZXJ0eVRhYnMKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9ySWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2Uuc291cmNlIj4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfTEFCRUxfR0VORVJBTCIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJkdGQudWkuZ2VuZXJhbCIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmdlbmVyYWwiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZ2VuZXJhbCIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJkdGQudWkuYXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9MQUJFTF9BVFRSSUJVVEVTIi8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZHRkLnVpLm90aGVyIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkub3RoZXIiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9MQUJFTF9PVEhFUiIvPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBhZnRlclRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5hdHRyaWJ1dGVzIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImR0ZC51aS5kb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX0xBQkVMX0RPQ1VNRU5UQVRJT04iLz4KLSAgICAgIDwvcHJvcGVydHlUYWJzPgotICAgPC9leHRlbnNpb24+ICAgCi0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLnByb3BlcnR5U2VjdGlvbnMiPgotICAgPHByb3BlcnR5U2VjdGlvbnMgY29udHJpYnV0b3JJZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiPgotCSA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5OYW1lU2VjdGlvbiIKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk5hbWVTZWN0aW9uIgotICAgICAgICB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZ2VuZXJhbCI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQiLz4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlIi8+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3QiLz4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm90YXRpb24iLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5nZW5lcmFsIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkF0dHJpYnV0ZURlZmF1bHRTZWN0aW9uIiAgCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQXR0cmlidXRlRGVmYXVsdFNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGUiLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAkKLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZ2VuZXJhbCIgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db21tZW50U2VjdGlvbiIgIAotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbW1lbnRTZWN0aW9uIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ29tbWVudCIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5nZW5lcmFsIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbEdyb3VwU2VjdGlvbiIgIAotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbEdyb3VwU2VjdGlvbiI+Ci0JICAgIAk8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlIi8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAJCi0JIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbE5hbWVTZWN0aW9uIgotICAgICAgICBmaWx0ZXI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbE5hbWVGaWx0ZXIiCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db250ZW50TW9kZWxOYW1lU2VjdGlvbiIKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmdlbmVyYWwiPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZSIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5vdGhlciIgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db250ZW50TW9kZWxUeXBlU2VjdGlvbiIgIAotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbFR5cGVTZWN0aW9uIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGUiLz4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Hcm91cE5vZGUiLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAkKLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZG9jdW1lbnRhdGlvbiIgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Eb2N1bWVudFNlY3Rpb24iICAKLQkgCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Eb2N1bWVudFNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50Ii8+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eSIvPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0Ii8+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vdGF0aW9uIi8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAJCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmdlbmVyYWwiIAotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW1wdHlTZWN0aW9uIiAgCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW1wdHlTZWN0aW9uIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIi8+Ci0JCSAJPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uIi8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAJCi0JIDwhLS0JCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLm90aGVyIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkVudGl0eVR5cGVTZWN0aW9uIiAgCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW50aXR5VHlwZVNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHkiLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuYXR0cmlidXRlcyIgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5FbnRpdHlWYWx1ZVNlY3Rpb24iICAKLQkgCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5FbnRpdHlWYWx1ZVNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHkiLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIC0tPgotCSAJCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmdlbmVyYWwiIAotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uTmV3RW50aXR5U2VjdGlvbiIgIAotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk5ld0VudGl0eVNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlIi8+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eSIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5nZW5lcmFsIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk5vdGF0aW9uU2VjdGlvbiIgIAotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk5vdGF0aW9uU2VjdGlvbiI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vdGF0aW9uIi8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAJCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmF0dHJpYnV0ZXMiIAotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uT2NjdXJyZW5jZVNlY3Rpb24iICAKLSAgICAgICAgZmlsdGVyPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5PY2N1cnJlbmNlRmlsdGVyIgotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk9jY3VycmVuY2VTZWN0aW9uIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGUiLz4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01SZXBlYXRhYmxlTm9kZSIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5hdHRyaWJ1dGVzIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLlR5cGVTZWN0aW9uIiAgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uVHlwZVNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGUiLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gIDwvcHJvcGVydHlTZWN0aW9ucz4KLTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBEZWZpbmUgdGhlbWUgLS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkudGhlbWVzIj4KLQkJPHRoZW1lCi0JCQlpZD0ib3JnLmVjbGlwc2UudWkuaWRlLnN5c3RlbURlZmF1bHQiPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iZHRkRGVmYXVsdCIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9ImR0ZFRhZyIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9ImR0ZFRhZ05hbWUiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJkdGRDb21tZW50IgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX1NFTEVDVElPTiI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJkdGRLZXl3b3JkIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iZHRkU3RyaW5nIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iZHRkRGF0YSIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9ImR0ZFN5bWJvbCIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJPC90aGVtZT4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImR0ZERlZmF1bHQiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmR0ZERlZmF1bHQiCi0JCQl2YWx1ZT0iMCwgMCwgMCI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iZHRkVGFnIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5kdGRUYWciCi0JCQl2YWx1ZT0iNjMsIDYzLCAxOTEiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImR0ZFRhZ05hbWUiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmR0ZFRhZ05hbWUiCi0JCQl2YWx1ZT0iNjMsIDYzLCAxOTEiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImR0ZENvbW1lbnQiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmR0ZENvbW1lbnQiCi0JCQl2YWx1ZT0iMTI3LCAxMjcsIDEyNyI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iZHRkS2V5d29yZCIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuZHRkS2V5d29yZCIKLQkJCXZhbHVlPSIxMjgsIDAsIDAiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImR0ZFN0cmluZyIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuZHRkU3RyaW5nIgotCQkJdmFsdWU9IjYzLCAxNTksIDk1Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJkdGREYXRhIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5kdGREYXRhIgotCQkJdmFsdWU9IjE5MSwgOTUsIDk1Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJkdGRTeW1ib2wiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmR0ZFN5bWJvbCIKLQkJCXZhbHVlPSIxMjgsIDAsIDAiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFRERWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRhZDdmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklQb3N0U2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLQotLyoqCi0gKiBBIERURCBFZGl0b3Igc3ViY2xhc3MgU3RydWN0dXJlZFRleHRFZGl0b3IsIHJlcXVpcmVkIHRvIHN1cHBseSBhIGNvbXBsZXRlCi0gKiByZXBsYWNlbWVudCBmb3IgdGhlIHByb3BlcnR5IHNoZWV0IHBhZ2UuIFdoZW4gYSBiZXR0ZXIgc29sdXRpb24gaXMgZm91bmQsCi0gKiB0aGlzIGNsYXNzIHdpbGwgYmUgcmVtb3ZlZC4KLSAqLwotcHVibGljIGNsYXNzIERUREVkaXRvciBleHRlbmRzIFN0cnVjdHVyZWRUZXh0RWRpdG9yIHsKLQljbGFzcyBEVERQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IgewotCQlEVERQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IjZ2V0Q29udHJpYnV0b3JJZCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldENvbnRyaWJ1dG9ySWQoKSB7Ci0JCQlyZXR1cm4gZ2V0RWRpdG9yU2l0ZSgpLmdldElkKCk7Ci0JCX0KLQl9Ci0KLQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBmUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQlwdWJsaWMgRFRERWRpdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBJQWRhcHRhYmxlI2dldEFkYXB0ZXIoQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIHJlcXVpcmVkKSB7Ci0JCWlmIChJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MuZXF1YWxzKHJlcXVpcmVkKSkgewotCQkJaWYgKGZQcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7Ci0JCQkJZlByb3BlcnR5U2hlZXRQYWdlID0gbmV3IERURFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKG5ldyBEVERQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKCkpOwotCQkJCS8qCi0JCQkJICogQWRkIHRoZSBwcm9wZXJ0eSBzaGVldCBwYWdlIGFzIGEgZGlyZWN0IHBvc3Qgc2VsZWN0aW9uCi0JCQkJICogbGlzdGVuZXIgc28gc3RhbmRhcmQgY3Vyc29yIG5hdmlnYXRpb24gdHJpZ2dlcnMgYSBzZWxlY3Rpb24KLQkJCQkgKiBub3RpZmljYXRpb24uIFRoZSBkZWZhdWx0IHRhYmJlZCBwcm9wZXJ0eSBzaGVldCBkb2VzIG5vdAotCQkJCSAqIGxpc3RlbiB0byBwb3N0IHNlbGVjdGlvbi4KLQkJCQkgKi8KLQkJCQkoKElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIGdldFNlbGVjdGlvblByb3ZpZGVyKCkpLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlpZiAoZlByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwgJiYgIWZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJZlByb3BlcnR5U2hlZXRQYWdlLnNlbGVjdGlvbkNoYW5nZWQoRFRERWRpdG9yLnRoaXMsIGdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZlByb3BlcnR5U2hlZXRQYWdlOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKHJlcXVpcmVkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBlZGl0b3JJbnB1dCk7Ci0KLQkJSVdvcmtiZW5jaFdpbmRvdyBkdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBkdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCXRyeSB7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJcGFnZS5zaG93VmlldyhJUGFnZUxheW91dC5JRF9QUk9QX1NIRUVUKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERQcm9wZXJ0aWVzTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFByb3BlcnRpZXNNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjhmOTBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFByb3BlcnRpZXNNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIERURFByb3BlcnRpZXNNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5PY2N1cnJlbmNlU2VjdGlvbi5qYXZhCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX09OQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX09ORV9PUl9NT1JFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9PUFRJT05BTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWkVST19PUl9NT1JFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9PQ0NVUlJFTkNFOwotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkF0dHJpYnVlRGVmYXVsdFNlY3Rpb24uamF2YQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9ERUZBVUxUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9VU0FHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfREVGQVVMVF9WQUxVRTsKLQotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbEdyb3VwU2VjdGlvbi5qYXZhCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NFUVVFTkNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DSE9JQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX01PREVMX0dST1VQOwotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsTmFtZVNlY3Rpb24uamF2YQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DT05URU5UX01PREVMOwotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsVHlwZVNlY3Rpb24uamF2YQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DT05URU5UX1RZUEU7Ci0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5OYW1lU2VjdGlvbi5qYXZhCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05BTUU7Ci0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5UeXBlU2VjdGlvbi5qYXZhCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1RZUEU7Ci0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5FbnRpdHlUeXBlU2VjdGlvbi5qYXZhCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VOVElUWV9UWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FWFRFUk5BTF9FTlRJVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1BBUkFNRVRFUl9FTlRJVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0dFTkVSQUxfRU5USVRZOwotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW50aXR5VmFsdWVTZWN0aW9uLmphdmEKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRU5USVRZX1ZBTFVFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9QVUJMSUNfSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NZU1RFTV9JRDsKLQotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkRURFNlY3Rpb25MYWJlbFByb3ZpZGVyCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9FTEVNRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfRUxFTUVOVF9SRUY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9DSE9JQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9TRVFVRU5DRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0FUVFJJQlVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0FUVExJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9DT01NRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfRU5USVRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfTk9UQVRJT047Ci0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5OZXdFbnRpdHlTZWN0aW9uCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0ZJTEVESUFMT0dfU0VMRUNUX0RURDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRklMRURJQUxPR19TRUxFQ1RfRFREX0RFU0M7Ci0KLQkvLyBOZXcgcHJvcGVydHkgdGFicwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9HRU5FUkFMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9PVEhFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUklCVVRFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRE9DVU1FTlRBVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERFZGl0b3JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERFZGl0b3JfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERFZGl0b3JfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERFZGl0b3JfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERTZWN0aW9uTGFiZWxQcm92aWRlcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMTA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERTZWN0aW9uTGFiZWxQcm92aWRlcl83OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfOTsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZSZXNvdXJjZUJ1bmRsZTsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZlJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQkJZlJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQkJfQotCQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCWZSZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZSZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQlwcml2YXRlIERURFByb3BlcnRpZXNNZXNzYWdlcygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFByb3BlcnRpZXNNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREUHJvcGVydGllc01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMTliYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREUHJvcGVydGllc01lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hIFByb3BlcnRpZXMgZmlsZSBmb3IgY29tcG9uZW50OiBYTUwgdG9vbHMgRFREIEVkaXRvcgotISBQYWNrYWdlZCBmb3IgdHJhbnNsYXRpb24gaW46ICB4bWwuemlwCi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uT2NjdXJyZW5jZVNlY3Rpb24uamF2YQotX1VJX09OQ0UgICAgICAgICAgICAgPSBKdXN0IG9uY2UgKDEpCi1fVUlfT05FX09SX01PUkUgICAgICA9IE9uZSBvciBtb3JlICgrKQotX1VJX09QVElPTkFMICAgICAgICAgPSBPcHRpb25hbCAoPykKLV9VSV9aRVJPX09SX01PUkUgICAgID0gWmVybyBvciBtb3JlICgqKQotX1VJX0xBQkVMX09DQ1VSUkVOQ0UgPSBPY2N1cnJlbmNlCi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQXR0cmlidXRlRGVmYXVsdFNlY3Rpb24uamF2YQotX1VJX0RFRkFVTFQgICAgICAgICAgICAgPSBEZWZhdWx0Ci1fVUlfTEFCRUxfVVNBR0UgICAgICAgICA9IFVzYWdlCi1fVUlfTEFCRUxfREVGQVVMVF9WQUxVRSA9IERlZmF1bHQgVmFsdWUKLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db250ZW50TW9kZWxHcm91cFNlY3Rpb24uamF2YQotX1VJX1NFUVVFTkNFICAgICAgICAgID0gU2VxdWVuY2UgKCwpCi1fVUlfQ0hPSUNFICAgICAgICAgICAgPSBDaG9pY2UgKHwpCi1fVUlfTEFCRUxfTU9ERUxfR1JPVVAgPSBNb2RlbCBHcm91cAotCi0hIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbE5hbWVTZWN0aW9uLmphdmEKLV9VSV9MQUJFTF9DT05URU5UX01PREVMID0gQ29udGVudCBNb2RlbAotCi0hIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbFR5cGVTZWN0aW9uLmphdmEKLV9VSV9MQUJFTF9DT05URU5UX1RZUEUgPSBDb250ZW50IFR5cGUKLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5OYW1lU2VjdGlvbi5qYXZhCi1fVUlfTEFCRUxfTkFNRSA9IE5hbWUKLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5UeXBlU2VjdGlvbi5qYXZhCi1fVUlfTEFCRUxfVFlQRSA9IFR5cGUKLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5FbnRpdHlUeXBlU2VjdGlvbi5qYXZhCi1fVUlfTEFCRUxfRU5USVRZX1RZUEUgICAgICA9IEVudGl0eSBUeXBlCi1fVUlfTEFCRUxfRVhURVJOQUxfRU5USVRZICA9IEV4dGVybmFsCi1fVUlfTEFCRUxfUEFSQU1FVEVSX0VOVElUWSA9IFBhcmFtZXRlcgotX1VJX0xBQkVMX0dFTkVSQUxfRU5USVRZICAgPSBHZW5lcmFsCi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW50aXR5VmFsdWVTZWN0aW9uLmphdmEKLV9VSV9MQUJFTF9FTlRJVFlfVkFMVUUgPSBFbnRpdHkgVmFsdWUKLV9VSV9MQUJFTF9QVUJMSUNfSUQgICAgPSBQdWJsaWMgSUQKLV9VSV9MQUJFTF9TWVNURU1fSUQgICAgPSBTeXN0ZW0gSUQKLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5EVERTZWN0aW9uTGFiZWxQcm92aWRlcgotX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9FTEVNRU5UICAgICA9IGVsZW1lbnQKLV9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfRUxFTUVOVF9SRUYgPSBlbGVtZW50IHJlZmVyZW5jZQotX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9DSE9JQ0UgICAgICA9IGNob2ljZQotX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9TRVFVRU5DRSAgICA9IHNlcXVlbmNlCi1fVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0FUVFJJQlVURSAgID0gYXR0cmlidXRlCi1fVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0FUVExJU1QgICAgID0gYXR0cmlidXRlIGxpc3QKLV9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfQ09NTUVOVCAgICAgPSBjb21tZW50Ci1fVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0VOVElUWSAgICAgID0gZW50aXR5Ci1fVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX05PVEFUSU9OICAgID0gbm90YXRpb24KLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5OZXdFbnRpdHlTZWN0aW9uCi1fVUlfRklMRURJQUxPR19TRUxFQ1RfRFREID0gU2VsZWN0IERURCBmaWxlCi1fVUlfRklMRURJQUxPR19TRUxFQ1RfRFREX0RFU0MgICA9IFNlbGVjdCBhIERURCBmaWxlIGZyb20gdGhlIFdvcmtiZW5jaCBwcm9qZWN0cwotCi0hIE5ldyBwcm9wZXJ0eSB0YWJzCi1fVUlfTEFCRUxfR0VORVJBTCAgICAgICA9IEdlbmVyYWwKLV9VSV9MQUJFTF9PVEhFUiAgICAgICAgID0gT3RoZXIKLV9VSV9MQUJFTF9BVFRSSUJVVEVTICAgID0gQXR0cmlidXRlcwotX1VJX0xBQkVMX0RPQ1VNRU5UQVRJT04gPSBEb2N1bWVudGF0aW9uCi0hIGVuZAotRFRERWRpdG9yXzA9Z2VuZXJhbAotRFRERWRpdG9yXzE9b3RoZXIKLURUREVkaXRvcl8yPWF0dHJpYnV0ZXMKLURUREVkaXRvcl8zPWRvY3VtZW50YXRpb24KLURURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzA9Y2hvaWNlCi1EVERTZWN0aW9uTGFiZWxQcm92aWRlcl8xPXNlcXVlbmNlCi1EVERTZWN0aW9uTGFiZWxQcm92aWRlcl82PWVsZW1lbnQKLURURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzc9YXR0cmlidXRlCi1EVERTZWN0aW9uTGFiZWxQcm92aWRlcl84PWF0dHJpYnV0ZSBsaXN0Ci1EVERTZWN0aW9uTGFiZWxQcm92aWRlcl85PWNvbW1lbnQKLURURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzEwPWVudGl0eQotRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMTE9bm90YXRpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGNhODVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotY2xhc3MgRFREVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgZXh0ZW5kcyBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB7Ci0KLQlwcml2YXRlIElTZWxlY3Rpb24gb2xkU2VsZWN0aW9uID0gbnVsbDsKLQotCXB1YmxpYyBEVERUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZShJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKSB7Ci0JCXN1cGVyKHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yID0gYWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoYWN0aXZlRWRpdG9yICE9IG51bGwpIHsKLQkJCQkJLy8gbWFrZSBzdXJlIHRoZSBjb3JyZWN0IGVkaXRvciBpcyBhY3RpdmUKLQkJCQkJaWYgKGFjdGl2ZUVkaXRvci5nZXRBZGFwdGVyKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcykgPT0gRFREVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UudGhpcykgewotCQkJCQkJaWYgKG9sZFNlbGVjdGlvbiA9PSBudWxsIHx8ICFvbGRTZWxlY3Rpb24uZXF1YWxzKHNlbGVjdGlvbikpIHsKLQkJCQkJCQlvbGRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCQkJCQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChwYXJ0LCBzZWxlY3Rpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0Fic3RyYWN0U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0Fic3RyYWN0U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjc0NzQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BYnN0cmFjdFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RTZWN0aW9uIGltcGxlbWVudHMgSVNlY3Rpb24sIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLCBMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIgewotCXByaXZhdGUgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeTsKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhcnQgZldvcmtiZW5jaFBhcnQ7Ci0JcHJvdGVjdGVkIElTZWxlY3Rpb24gZlNlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgT2JqZWN0IGZJbnB1dDsKLQlwcm90ZWN0ZWQgaW50IHJpZ2h0TWFyZ2luU3BhY2U7Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQljcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmdldFdpZGdldEZhY3RvcnkoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGFGYWN0b3J5KSB7Ci0JCXRoaXMuZmFjdG9yeSA9IGFGYWN0b3J5OwotCQlHQyBnYyA9IG5ldyBHQyhwYXJlbnQpOwotCQlQb2ludCBleHRlbnQgPSBnYy50ZXh0RXh0ZW50KCIgIC4uLiAgIik7IC8vJE5PTi1OTFMtMSQKLQkJcmlnaHRNYXJnaW5TcGFjZSA9IGV4dGVudC54OwotCQlnYy5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jc2V0SW5wdXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWwpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiwgInNlbGVjdGlvbiAiICsgc2VsLmdldENsYXNzKCkgKyAiaXMgbm90IHN0cnVjdHVyZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRoaXMuZldvcmtiZW5jaFBhcnQgPSBwYXJ0OwotCQl0aGlzLmZTZWxlY3Rpb24gPSBzZWw7Ci0JCXRoaXMuZklucHV0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCS8qCi0JCSAqIGlmIChmSW5wdXQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkgeyB4c2RTY2hlbWEgPQotCQkgKiAoKFhTRENvbmNyZXRlQ29tcG9uZW50KWZJbnB1dCkuZ2V0U2NoZW1hKCk7IH0KLQkJICovCi0KLQkJLy8gcmVmcmVzaCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI2Fib3V0VG9CZVNob3duKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhYm91dFRvQmVTaG93bigpIHsKLQkJcmVmcmVzaCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI2Fib3V0VG9CZUhpZGRlbigpCi0JICovCi0JcHVibGljIHZvaWQgYWJvdXRUb0JlSGlkZGVuKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jZ2V0TWluaW11bUhlaWdodCgpCi0JICovCi0JcHVibGljIGludCBnZXRNaW5pbXVtSGVpZ2h0KCkgewotCQlyZXR1cm4gU1dULkRFRkFVTFQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldElucHV0KCkgewotCQlpZiAoZklucHV0IGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJLy8gZklucHV0ID0geHNkU2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQoKEVsZW1lbnQpZklucHV0KTsKLQkJfQotCQlyZXR1cm4gZklucHV0OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgd2lkZ2V0IGZhY3RvcnkuCi0JICogCi0JICogQHJldHVybiB0aGUgd2lkZ2V0IGZhY3RvcnkuCi0JICovCi0JcHVibGljIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGdldFdpZGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRvV2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChpc0xpc3RlbmVyRW5hYmxlZCgpICYmIGdldElucHV0KCkgIT0gbnVsbCAmJiAhaXNJbkRvSGFuZGxlKSB7Ci0JCQlpc0luRG9IYW5kbGUgPSB0cnVlOwotCQkJZG9XaWRnZXREZWZhdWx0U2VsZWN0ZWQoZSk7Ci0JCQlpc0luRG9IYW5kbGUgPSBmYWxzZTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkgJiYgZ2V0SW5wdXQoKSAhPSBudWxsICYmICFpc0luRG9IYW5kbGUpIHsKLQkJCWlzSW5Eb0hhbmRsZSA9IHRydWU7Ci0JCQlkb1dpZGdldFNlbGVjdGVkKGUpOwotCQkJaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0JCX0KLQotCX0KLQotCWJvb2xlYW4gbGlzdGVuZXJFbmFibGVkID0gdHJ1ZTsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGlzdGVuZXJFbmFibGVkKCkgewotCQlyZXR1cm4gbGlzdGVuZXJFbmFibGVkOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gbGlzdGVuZXJFbmFibGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RlbmVyRW5hYmxlZChib29sZWFuIHYpIHsKLQkJdGhpcy5saXN0ZW5lckVuYWJsZWQgPSB2OwotCX0KLQotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChpc0xpc3RlbmVyRW5hYmxlZCgpICYmICFpc0luRG9IYW5kbGUpIHsKLQkJCWlzSW5Eb0hhbmRsZSA9IHRydWU7Ci0JCQlzdGFydERlbGF5ZWRFdmVudChldmVudCk7Ci0JCQlpc0luRG9IYW5kbGUgPSBmYWxzZTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgRGVsYXllZEV2ZW50IGRlbGF5ZWRUYXNrOwotCi0JcHJvdGVjdGVkIHZvaWQgc3RhcnREZWxheWVkRXZlbnQoRXZlbnQgZSkgewotCQlpZiAoZGVsYXllZFRhc2sgPT0gbnVsbCB8fCBkZWxheWVkVGFzay5nZXRFdmVudCgpID09IG51bGwpIHsKLQkJCWRlbGF5ZWRUYXNrID0gbmV3IERlbGF5ZWRFdmVudCgpOwotCQkJZGVsYXllZFRhc2suc2V0RXZlbnQoZSk7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS50aW1lckV4ZWMoNTAwLCBkZWxheWVkVGFzayk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlFdmVudCBkZWxheWVkRXZlbnQgPSBkZWxheWVkVGFzay5nZXRFdmVudCgpOwotCi0JCQlpZiAoZS53aWRnZXQgPT0gZGVsYXllZEV2ZW50LndpZGdldCAmJiBlLnR5cGUgPT0gZGVsYXllZEV2ZW50LnR5cGUpIHsKLQkJCQkvLyBzYW1lIGV2ZW50LCBqdXN0IGRpZmZlcmVudCBkYXRhLCBkZWxheSBuZXcgZXZlbnQKLQkJCQlkZWxheWVkVGFzay5zZXRFdmVudChudWxsKTsKLQkJCX0KLQkJCWRlbGF5ZWRUYXNrID0gbmV3IERlbGF5ZWRFdmVudCgpOwotCQkJZGVsYXllZFRhc2suc2V0RXZlbnQoZSk7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS50aW1lckV4ZWMoNTAwLCBkZWxheWVkVGFzayk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBEZWxheWVkRXZlbnQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXByb3RlY3RlZCBFdmVudCBldmVudDsKLQotCQkvKgotCQkgKiBAc2VlIFJ1bm5hYmxlI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAoZXZlbnQgIT0gbnVsbCkgewotCQkJCWlzSW5Eb0hhbmRsZSA9IHRydWU7Ci0JCQkJZG9IYW5kbGVFdmVudChldmVudCk7Ci0JCQkJaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0JCQkJZXZlbnQgPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldHMgdGhlIGV2ZW50LgotCQkgKiAKLQkJICogQHJldHVybiBSZXR1cm5zIGEgRXZlbnQKLQkJICovCi0JCXB1YmxpYyBFdmVudCBnZXRFdmVudCgpIHsKLQkJCXJldHVybiBldmVudDsKLQkJfQotCi0JCS8qKgotCQkgKiBTZXRzIHRoZSBldmVudC4KLQkJICogCi0JCSAqIEBwYXJhbSBldmVudAotCQkgKiAgICAgICAgICAgIFRoZSBldmVudCB0byBzZXQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEV2ZW50KEV2ZW50IGUpIHsKLQkJCXRoaXMuZXZlbnQgPSBlOwotCQl9Ci0KLQl9Ci0KLQlib29sZWFuIGlzSW5Eb0hhbmRsZTsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgaXNJbkRvSGFuZGxlLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgaXNJbkRvSGFuZGxlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW5Eb0hhbmRsZSgpIHsKLQkJcmV0dXJuIGlzSW5Eb0hhbmRsZTsKLQl9Ci0KLQlzdGF0aWMgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGdldEFjdGl2ZUVkaXRvcigpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCk7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQotCQlyZXR1cm4gZWRpdG9yUGFydDsKLQl9Ci0KLQlzdGF0aWMgcHJvdGVjdGVkIElTdGF0dXNMaW5lTWFuYWdlciBnZXRTdGF0dXNMaW5lTWFuYWdlcihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KSB7Ci0JCUlTdGF0dXNMaW5lTWFuYWdlciByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSAoRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpIGVkaXRvclBhcnQuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0JCQlyZXN1bHQgPSBjb250cmlidXRvci5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCURvY3VtZW50SW1wbCBnZXREb2N1bWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChEb2N1bWVudEltcGwpIGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKFN0cmluZyBkZXNjcmlwdGlvbiwgRWxlbWVudCBlbGVtZW50KSB7Ci0JCURvY3VtZW50SW1wbCBkb2MgPSBnZXREb2N1bWVudChlbGVtZW50KTsKLQkJZG9jLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgZGVzY3JpcHRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJRG9jdW1lbnRJbXBsIGRvYyA9IGdldERvY3VtZW50KGVsZW1lbnQpOwotCi0JCWRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVMYW5ndWFnZShTdHJpbmcgbGFuZykgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVByZWZpeChTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BdHRyaWJ1dGVEZWZhdWx0U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0F0dHJpYnV0ZURlZmF1bHRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNGIxODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0F0dHJpYnV0ZURlZmF1bHRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlRGVmYXVsdFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU1QTElFRCA9IEF0dHJpYnV0ZS5JTVBMSUVEOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFJFUVVJUkVEID0gQXR0cmlidXRlLlJFUVVJUkVEOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIEZJWEVEID0gQXR0cmlidXRlLkZJWEVEOwotCi0JcHJpdmF0ZSBDQ29tYm8gdXNhZ2VDb21ibzsKLQlwcml2YXRlIFN0cmluZ1tdIHVzYWdlQ29tYm9WYWx1ZXMgPSB7SU1QTElFRCwgUkVRVUlSRUQsIEZJWEVELCBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0RFRkFVTFR9OwotCXByaXZhdGUgVGV4dCBkZWZhdWx0VmFsdWVUZXh0OwotCXByaXZhdGUgQ0xhYmVsIGRlZmF1bHRWYWx1ZUxhYmVsOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIHVzYWdlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9VU0FHRSk7Ci0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJUG9pbnQgcCA9IHVzYWdlTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWludCBsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQl1c2FnZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJdXNhZ2VDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHVzYWdlTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh1c2FnZUxhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJdXNhZ2VDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl1c2FnZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQl1c2FnZUNvbWJvLnNldEl0ZW1zKHVzYWdlQ29tYm9WYWx1ZXMpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCWRlZmF1bHRWYWx1ZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfREVGQVVMVF9WQUxVRSk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlwID0gZGVmYXVsdFZhbHVlTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodXNhZ2VMYWJlbCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlkZWZhdWx0VmFsdWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWRlZmF1bHRWYWx1ZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChkZWZhdWx0VmFsdWVMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGRlZmF1bHRWYWx1ZUxhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkZWZhdWx0VmFsdWVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLQkJCQlTdHJpbmcga2luZCA9ICgoQXR0cmlidXRlKSBpbnB1dCkuZ2V0RGVmYXVsdEtpbmQoKTsKLQkJCQlpZiAoIiIuZXF1YWxzKGtpbmQpKSAvLyROT04tTkxTLTEkCi0JCQkJCXVzYWdlQ29tYm8uc2V0VGV4dChEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0RFRkFVTFQpOwotCQkJCWVsc2UKLQkJCQkJdXNhZ2VDb21iby5zZXRUZXh0KGtpbmQpOwotCi0JCQkJaWYgKCIiLmVxdWFscyhraW5kKSB8fCBGSVhFRC5lcXVhbHMoa2luZCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlkZWZhdWx0VmFsdWVMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQlkZWZhdWx0VmFsdWVUZXh0LnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCWRlZmF1bHRWYWx1ZVRleHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRUZXh0KCgoQXR0cmlidXRlKSBpbnB1dCkuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlkZWZhdWx0VmFsdWVMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IHVzYWdlQ29tYm8pIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLQkJCQlTdHJpbmcgdXNhZ2UgPSB1c2FnZUNvbWJvLmdldFRleHQoKTsKLQkJCQlBdHRyaWJ1dGUgYXR0cmlidXRlID0gKEF0dHJpYnV0ZSkgaW5wdXQ7Ci0JCQkJaWYgKHVzYWdlLmVxdWFscyhEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0RFRkFVTFQpKQotCQkJCQlhdHRyaWJ1dGUuc2V0RGVmYXVsdEtpbmQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJZWxzZQotCQkJCQlhdHRyaWJ1dGUuc2V0RGVmYXVsdEtpbmQodXNhZ2UpOwotCi0JCQkJaWYgKERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfREVGQVVMVC5lcXVhbHModXNhZ2UpIHx8IEZJWEVELmVxdWFscyh1c2FnZSkpIHsKLQkJCQkJZGVmYXVsdFZhbHVlTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQlkZWZhdWx0VmFsdWVUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlkZWZhdWx0VmFsdWVMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJaWYgKGV2ZW50LndpZGdldCA9PSBkZWZhdWx0VmFsdWVUZXh0KSB7Ci0JCQkJU3RyaW5nIG5ld1ZhbHVlID0gZGVmYXVsdFZhbHVlVGV4dC5nZXRUZXh0KCk7Ci0JCQkJKChBdHRyaWJ1dGUpIGlucHV0KS5zZXREZWZhdWx0VmFsdWUobmV3VmFsdWUsIHVzYWdlQ29tYm8uZ2V0VGV4dCgpLmVxdWFscyhGSVhFRCkpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db21tZW50U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbW1lbnRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOWYyZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbW1lbnRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNvbW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDb21tZW50U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBUZXh0IGNvbW1lbnRUZXh0OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJY29tbWVudFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiLCBTV1QuTVVMVEkgfCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJY29tbWVudFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgQ29tbWVudFNlY3Rpb24udGhpcyk7Ci0KLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWNvbW1lbnRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJY29tbWVudFRleHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJY29tbWVudFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIENvbW1lbnQpCi0JCQkJY29tbWVudFRleHQuc2V0VGV4dCgoKENvbW1lbnQpIGlucHV0KS5nZXRUZXh0KCkpOwotCQl9Ci0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IGNvbW1lbnRUZXh0LmdldFRleHQoKTsKLQkJCWlmIChuZXdWYWx1ZS5sZW5ndGgoKSA+IDAgJiYgaW5wdXQgaW5zdGFuY2VvZiBDb21tZW50KSB7Ci0JCQkJQ29tbWVudCBjb21tZW50ID0gKENvbW1lbnQpIGlucHV0OwotCQkJCWNvbW1lbnQuc2V0VGV4dChuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxHcm91cFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxHcm91cFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc1MTg1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsR3JvdXBTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Hcm91cE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZW50TW9kZWxHcm91cFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgZmluYWwgU3RyaW5nIFNFUVVFTkNFID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9TRVFVRU5DRTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBDSE9JQ0UgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0NIT0lDRTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBNT0RFTF9HUk9VUCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfTU9ERUxfR1JPVVA7Ci0KLQlwcml2YXRlIENDb21ibyBtb2RlbEdyb3VwQ29tYm87Ci0JcHJpdmF0ZSBTdHJpbmdbXSBtb2RlbEdyb3VwQ29tYm9WYWx1ZXMgPSB7U0VRVUVOQ0UsIENIT0lDRX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgY0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1PREVMX0dST1VQKTsKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCVBvaW50IHAgPSBjTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWludCBsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQljTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQltb2RlbEdyb3VwQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQltb2RlbEdyb3VwQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbW9kZWxHcm91cENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQltb2RlbEdyb3VwQ29tYm8uc2V0SXRlbXMobW9kZWxHcm91cENvbWJvVmFsdWVzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCQlDTUdyb3VwTm9kZSBub2RlID0gKENNR3JvdXBOb2RlKSBpbnB1dDsKLQkJCQljaGFyIG1vZGVsVHlwZSA9IG5vZGUuZ2V0Q29ubmVjdG9yKCk7Ci0JCQkJaWYgKENNR3JvdXBOb2RlLkNIT0lDRSA9PSBtb2RlbFR5cGUpCi0JCQkJCW1vZGVsR3JvdXBDb21iby5zZXRUZXh0KENIT0lDRSk7Ci0JCQkJZWxzZSBpZiAoQ01Hcm91cE5vZGUuU0VRVUVOQ0UgPT0gbW9kZWxUeXBlKQotCQkJCQltb2RlbEdyb3VwQ29tYm8uc2V0VGV4dChTRVFVRU5DRSk7Ci0JCQl9Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IG1vZGVsR3JvdXBDb21ibykgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKSB7Ci0JCQkJQ01Hcm91cE5vZGUgbm9kZSA9IChDTUdyb3VwTm9kZSkgaW5wdXQ7Ci0JCQkJaWYgKENIT0lDRS5lcXVhbHMobW9kZWxHcm91cENvbWJvLmdldFRleHQoKSkpCi0JCQkJCW5vZGUuc2V0Q29ubmVjdG9yKENNR3JvdXBOb2RlLkNIT0lDRSk7Ci0JCQkJZWxzZSBpZiAoU0VRVUVOQ0UuZXF1YWxzKG1vZGVsR3JvdXBDb21iby5nZXRUZXh0KCkpKQotCQkJCQlub2RlLnNldENvbm5lY3RvcihDTUdyb3VwTm9kZS5TRVFVRU5DRSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsTmFtZUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbE5hbWVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1MGJmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsTmFtZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZW50TW9kZWxOYW1lRmlsdGVyIGltcGxlbWVudHMgSUZpbHRlciB7Ci0JcHVibGljIGJvb2xlYW4gc2VsZWN0KE9iamVjdCB0b1Rlc3QpIHsKLQkJcmV0dXJuIHRvVGVzdCBpbnN0YW5jZW9mIENNQmFzaWNOb2RlICYmICEoKENNQmFzaWNOb2RlKSB0b1Rlc3QpLmlzUm9vdEVsZW1lbnRDb250ZW50KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbE5hbWVTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsTmFtZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZiMWVjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsTmFtZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgQ29udGVudE1vZGVsTmFtZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgZmluYWwgU3RyaW5nIENPTlRFTlRfTU9ERUwgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0NPTlRFTlRfTU9ERUw7Ci0KLQlwcml2YXRlIENDb21ibyB0eXBlQ29tYm87Ci0JcHJpdmF0ZSBTdHJpbmdbXSB0eXBlQ29tYm9WYWx1ZXMgPSB7Q01Ob2RlLlBDREFUQX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgY0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIENPTlRFTlRfTU9ERUwpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJUG9pbnQgcCA9IGNMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJaW50IGxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWNMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXR5cGVDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCB8IFNXVC5SRUFEX09OTFkpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQl0eXBlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQl0eXBlQ29tYm8uc2V0SXRlbXModHlwZUNvbWJvVmFsdWVzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCi0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJCXR5cGVDb21iby5yZW1vdmVBbGwoKTsKLQkJCQl0eXBlQ29tYm8uYWRkKENNTm9kZS5QQ0RBVEEpOwotCQkJCS8vIE5vZGVMaXN0IGxpc3QgPQotCQkJCS8vICgoQ01CYXNpY05vZGUpZklucHV0KS5nZXREVERGaWxlKCkuZ2V0RWxlbWVudHNBbmRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VzKCk7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSAoKENNQmFzaWNOb2RlKSBpbnB1dCkuZ2V0RFRERmlsZSgpLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJCQlib29sZWFuIGlzRm9yUm9vdENvbnRlbnQgPSAoKENNQmFzaWNOb2RlKSBpbnB1dCkuaXNSb290RWxlbWVudENvbnRlbnQoKTsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmICghaXNGb3JSb290Q29udGVudCAmJiBub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLQkJCQkJCXR5cGVDb21iby5hZGQobm9kZS5nZXROYW1lKCkpOwotCQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVudGl0eSAmJiAoKEVudGl0eSkgbm9kZSkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkKLQkJCQkJCXR5cGVDb21iby5hZGQoIiUiICsgbm9kZS5nZXROYW1lKCkgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0KLQkJCQl0eXBlQ29tYm8uc2V0VGV4dCgoKENNQmFzaWNOb2RlKSBpbnB1dCkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IHR5cGVDb21ibykgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQkJQ01CYXNpY05vZGUgbm9kZSA9IChDTUJhc2ljTm9kZSkgaW5wdXQ7Ci0JCQkJU3RyaW5nIHNlbGVjdGVkID0gdHlwZUNvbWJvLmdldFRleHQoKTsKLQkJCQkvLyBpZiAoQ01Ob2RlLlBDREFUQS5lcXVhbHMoc2VsZWN0ZWQpKQotCQkJCW5vZGUuc2V0TmFtZShzZWxlY3RlZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxUeXBlRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsVHlwZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmRhYzgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxUeXBlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Hcm91cE5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZW50TW9kZWxUeXBlRmlsdGVyIGltcGxlbWVudHMgSUZpbHRlciB7Ci0JcHVibGljIGJvb2xlYW4gc2VsZWN0KE9iamVjdCB0b1Rlc3QpIHsKLQkJaWYgKHRvVGVzdCBpbnN0YW5jZW9mIENNQmFzaWNOb2RlICYmICEoKENNQmFzaWNOb2RlKSB0b1Rlc3QpLmlzUm9vdEVsZW1lbnRDb250ZW50KCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHRvVGVzdCBpbnN0YW5jZW9mIENNR3JvdXBOb2RlICYmICgoQ01Hcm91cE5vZGUpIHRvVGVzdCkuaXNSb290RWxlbWVudENvbnRlbnQoKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbFR5cGVTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsVHlwZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY0YTg5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsVHlwZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFByb3BlcnRpZXNNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIENvbnRlbnRNb2RlbFR5cGVTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0NPTlRFTlRfVFlQRTsKLQotCXByaXZhdGUgQ0NvbWJvIHR5cGVDb21ibzsKLQlwcml2YXRlIFN0cmluZ1tdIHR5cGVDb21ib1ZhbHVlcyA9IHtDTU5vZGUuQU5ZLCBDTU5vZGUuRU1QVFksIENNTm9kZS5QQ0RBVEEsIENNTm9kZS5DSElMRFJFTiwgQ01Ob2RlLk1JWEVEfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCBjTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgQ09OVEVOVF9UWVBFKTsKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCVBvaW50IHAgPSBjTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWludCBsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQljTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl0eXBlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQl0eXBlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQl0eXBlQ29tYm8uc2V0SXRlbXModHlwZUNvbWJvVmFsdWVzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCi0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDTU5vZGUpIHsKLQkJCQl0eXBlQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkJdHlwZUNvbWJvLmFkZChDTU5vZGUuQU5ZKTsKLQkJCQl0eXBlQ29tYm8uYWRkKENNTm9kZS5FTVBUWSk7Ci0JCQkJdHlwZUNvbWJvLmFkZChDTU5vZGUuUENEQVRBKTsKLQkJCQl0eXBlQ29tYm8uYWRkKENNTm9kZS5DSElMRFJFTik7Ci0JCQkJdHlwZUNvbWJvLmFkZChDTU5vZGUuTUlYRUQpOwotCi0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSAoKENNTm9kZSkgaW5wdXQpLmdldERUREZpbGUoKS5nZXROb2RlcygpLml0ZXJhdG9yKCk7Ci0JCQkJU3RyaW5nIG5vZGVOYW1lID0gbnVsbDsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCW5vZGVOYW1lID0gbm9kZS5nZXROYW1lKCk7Ci0JCQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCAmJiB0eXBlQ29tYm8uaW5kZXhPZihub2RlTmFtZSkgPT0gLTEpCi0JCQkJCQl0eXBlQ29tYm8uYWRkKG5vZGVOYW1lKTsKLQkJCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEVudGl0eSAmJiAoKEVudGl0eSkgbm9kZSkuaXNQYXJhbWV0ZXJFbnRpdHkoKSAmJiB0eXBlQ29tYm8uaW5kZXhPZihub2RlTmFtZSkgPT0gLTEpCi0JCQkJCQl0eXBlQ29tYm8uYWRkKCIlIiArIG5vZGVOYW1lICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKQotCQkJCQl0eXBlQ29tYm8uc2V0VGV4dCgoKENNR3JvdXBOb2RlKSBpbnB1dCkuZ2V0VHlwZSgpKTsKLQkJCQllbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKQotCQkJCQl0eXBlQ29tYm8uc2V0VGV4dCgoKENNQmFzaWNOb2RlKSBpbnB1dCkuZ2V0VHlwZSgpKTsKLQkJCX0KLQkJfSAvLyBlbmQgaWYgKGZJbnB1dCAhPSBudWxsKQotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IHR5cGVDb21ibykgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIENNR3JvdXBOb2RlIHx8IGlucHV0IGluc3RhbmNlb2YgQ01CYXNpY05vZGUpIHsKLQkJCQlDTU5vZGUgbm9kZSA9IChDTU5vZGUpIGlucHV0OwotCQkJCVN0cmluZyBzZWxlY3RlZCA9IHR5cGVDb21iby5nZXRUZXh0KCk7Ci0JCQkJaWYgKENNTm9kZS5NSVhFRC5lcXVhbHMoc2VsZWN0ZWQpKQotCQkJCQlub2RlLnNldE1peGVkQ29udGVudCgpOwotCQkJCWVsc2UgaWYgKENNTm9kZS5DSElMRFJFTi5lcXVhbHMoc2VsZWN0ZWQpKQotCQkJCQlub2RlLnNldENoaWxkcmVuQ29udGVudCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbHNlIGlmIChDTU5vZGUuRU1QVFkuZXF1YWxzKHNlbGVjdGVkKSB8fCBDTU5vZGUuQU5ZLmVxdWFscyhzZWxlY3RlZCkgfHwgQ01Ob2RlLlBDREFUQS5lcXVhbHMoc2VsZWN0ZWQpKQotCQkJCQlub2RlLnNldENvbnRlbnQoc2VsZWN0ZWQpOwotCQkJCWVsc2UKLQkJCQkJbm9kZS5zZXRDaGlsZHJlbkNvbnRlbnQoc2VsZWN0ZWQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRFREU2VjdGlvbkxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9EVERTZWN0aW9uTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmQzN2FjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9EVERTZWN0aW9uTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTVJlcGVhdGFibGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Db21tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5QYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBEVERTZWN0aW9uTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsIHx8IG9iamVjdC5lcXVhbHMoU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSW1hZ2UgcmVzdWx0ID0gbnVsbDsKLQotCQlPYmplY3Qgc2VsZWN0ZWQgPSBvYmplY3Q7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJc2VsZWN0ZWQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBvYmplY3QpLmdldEZpcnN0RWxlbWVudCgpOwotCQl9Ci0JCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIERUREZpbGUpIHsKLQkJCXJldHVybiBudWxsOyAvLyAoKERUREZpbGUpIHNlbGVjdGVkKS5nZXRJbWFnZSgpOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuICgoRFRETm9kZSkgc2VsZWN0ZWQpLmdldEltYWdlKCk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5FbGVtZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsIHx8IG9iamVjdC5lcXVhbHMoU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJT2JqZWN0IHNlbGVjdGVkID0gb2JqZWN0OwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCXNlbGVjdGVkID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgb2JqZWN0KS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJfQotCi0JCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIERUREZpbGUpIHsKLQkJCXJldHVybiAoKERUREZpbGUpIHNlbGVjdGVkKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJaWYgKCgoQ01CYXNpY05vZGUpIHNlbGVjdGVkKS5pc1JlZmVyZW5jZSgpKQotCQkJCXJldHVybiBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9FTEVNRU5UX1JFRjsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gKChDTUJhc2ljTm9kZSkgc2VsZWN0ZWQpLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIENNUmVwZWF0YWJsZU5vZGUpIHsKLQkJCUNNUmVwZWF0YWJsZU5vZGUgbm9kZSA9IChDTVJlcGVhdGFibGVOb2RlKSBzZWxlY3RlZDsKLQkJCVN0cmluZyBuYW1lID0gbm9kZS5nZXROYW1lKCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKSB7Ci0JCQkJaWYgKCgoQ01Hcm91cE5vZGUpIG5vZGUpLmdldENvbm5lY3RvcigpID09IENNR3JvdXBOb2RlLkNIT0lDRSkKLQkJCQkJbmFtZSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5EVERTZWN0aW9uTGFiZWxQcm92aWRlcl8wOwotCQkJCWVsc2UKLQkJCQkJbmFtZSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5EVERTZWN0aW9uTGFiZWxQcm92aWRlcl8xOwotCQkJfQotCQkJY2hhciBvY2N1cnJlbmNlID0gbm9kZS5nZXRPY2N1cnJlbmNlKCk7Ci0JCQlzd2l0Y2ggKG9jY3VycmVuY2UpIHsKLQkJCQljYXNlIENNUmVwZWF0YWJsZU5vZGUuT05DRSA6Ci0JCQkJCW5hbWUgKz0gIiBbMS4uMV0iOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ01SZXBlYXRhYmxlTm9kZS5PUFRJT05BTCA6Ci0JCQkJCW5hbWUgKz0gIiBbMC4uMV0iOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ01SZXBlYXRhYmxlTm9kZS5PTkVfT1JfTU9SRSA6Ci0JCQkJCW5hbWUgKz0gIiBbMS4uKl0iOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ01SZXBlYXRhYmxlTm9kZS5aRVJPX09SX01PUkUgOgotCQkJCQluYW1lICs9ICIgWzAuLipdIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiBuYW1lOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgRWxlbWVudCkKLQkJCQlyZXR1cm4gRFREUHJvcGVydGllc01lc3NhZ2VzLkRURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzY7Ci0JCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkKLQkJCQlyZXR1cm4gRFREUHJvcGVydGllc01lc3NhZ2VzLkRURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzc7Ci0JCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QpCi0JCQkJcmV0dXJuIERURFByb3BlcnRpZXNNZXNzYWdlcy5EVERTZWN0aW9uTGFiZWxQcm92aWRlcl84OwotCQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBDb21tZW50KQotCQkJCXJldHVybiBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfOTsKLQkJCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgRW50aXR5KQotCQkJCXJldHVybiBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMTA7Ci0JCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIE5vdGF0aW9uKQotCQkJCXJldHVybiBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMTE7Ci0JCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkKLQkJCQkvLyByZXR1cm4gInBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlIjsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gKChEVEROb2RlKSBzZWxlY3RlZCkuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uRWxlbWVudCkgewotCQkJcmV0dXJuICgob3JnLnczYy5kb20uRWxlbWVudCkgc2VsZWN0ZWQpLmdldExvY2FsTmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9EVERTZWxlY3RJbmNsdWRlRmlsZVdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RURFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMTUzMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RURFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2Vycy5TZWxlY3RTaW5nbGVGaWxlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci0KLS8qKgotICogRXh0ZW5kIHRoZSBiYXNlIHdpemFyZCB0byBzZWxlY3QgYSBmaWxlIGZyb20gdGhlIHByb2plY3Qgb3Igb3V0c2lkZSB0aGUKLSAqIHdvcmtiZW5jaCBhbmQgYWRkIGVycm9yIGhhbmRsaW5nCi0gKi8KLWNsYXNzIERURFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0JRFREU2VsZWN0U2luZ2xlRmlsZVBhZ2UgZmlsZVBhZ2U7Ci0KLQlJRmlsZSByZXN1bHRGaWxlOwotCi0JcHVibGljIERURFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkKFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2MsIFZpZXdlckZpbHRlciBmaWx0ZXIsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZSh0aXRsZSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIERURFJlc291cmNlLk5FV0RURCkpOwotCi0JCS8vIFNlbGVjdCBGaWxlIFBhZ2UKLQkJZmlsZVBhZ2UgPSBuZXcgRFREU2VsZWN0U2luZ2xlRmlsZVBhZ2UoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgc2VsZWN0aW9uLCB0cnVlKTsKLQkJZmlsZVBhZ2Uuc2V0VGl0bGUodGl0bGUpOwotCQlmaWxlUGFnZS5zZXREZXNjcmlwdGlvbihkZXNjKTsKLQkJZmlsZVBhZ2UuYWRkRmlsdGVyKGZpbHRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIGFXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJYWRkUGFnZShmaWxlUGFnZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlyZXR1cm4gZmlsZVBhZ2UuaXNQYWdlQ29tcGxldGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlyZXN1bHRGaWxlID0gZmlsZVBhZ2UuZ2V0RmlsZSgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0UmVzdWx0RmlsZSgpIHsKLQkJcmV0dXJuIHJlc3VsdEZpbGU7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IERURCBGaWxlCi0JICovCi0JY2xhc3MgRFREU2VsZWN0U2luZ2xlRmlsZVBhZ2UgZXh0ZW5kcyBTZWxlY3RTaW5nbGVGaWxlUGFnZSB7Ci0JCXB1YmxpYyBEVERTZWxlY3RTaW5nbGVGaWxlUGFnZShJV29ya2JlbmNoIHcsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgYm9vbGVhbiBpc0ZpbGVNYW5kYXRvcnkpIHsKLQkJCXN1cGVyKHcsIHNlbGVjdGlvbiwgaXNGaWxlTWFuZGF0b3J5KTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQkJcmV0dXJuIHN1cGVyLmlzUGFnZUNvbXBsZXRlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRFREVHlwZU1hcHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RURFR5cGVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlMzVkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRFREVHlwZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUeXBlTWFwcGVyOwotCi1wdWJsaWMgY2xhc3MgRFREVHlwZU1hcHBlciBpbXBsZW1lbnRzIElUeXBlTWFwcGVyIHsKLQlwdWJsaWMgRFREVHlwZU1hcHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgbWFwVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvYmplY3QuZ2V0Q2xhc3MoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRG9jdW1lbnRTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRG9jdW1lbnRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNzIwZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RvY3VtZW50U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ29tbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLQotcHVibGljIGNsYXNzIERvY3VtZW50U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBUZXh0IGNvbW1lbnRUZXh0OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJY29tbWVudFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiLCBTV1QuTVVMVEkgfCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJY29tbWVudFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWNvbW1lbnRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJY29tbWVudFRleHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJY29tbWVudFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCQlDb21tZW50IGNvbW1lbnQgPSBnZXRDb21tZW50Tm9kZSgoRFRETm9kZSkgaW5wdXQpOwotCQkJCWlmIChjb21tZW50ICE9IG51bGwpCi0JCQkJCWNvbW1lbnRUZXh0LnNldFRleHQoY29tbWVudC5nZXRUZXh0KCkpOwotCQkJfQotCQl9Ci0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSBjb21tZW50VGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBEVEROb2RlKSB7Ci0JCQkJQ29tbWVudCBjb21tZW50ID0gZ2V0Q29tbWVudE5vZGUoKERURE5vZGUpIGlucHV0KTsKLQkJCQlpZiAoY29tbWVudCAhPSBudWxsKQotCQkJCQljb21tZW50LnNldFRleHQobmV3VmFsdWUpOwotCQkJCWVsc2UgewotCQkJCQkvLyBDcmVhdGUgYSBuZXcgY29tbWVudCBub2RlLgotCQkJCQkoKERURE5vZGUpIGlucHV0KS5nZXREVERGaWxlKCkuY3JlYXRlQ29tbWVudCgoRFRETm9kZSkgaW5wdXQsIG5ld1ZhbHVlLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIENvbW1lbnQgZ2V0Q29tbWVudE5vZGUoRFRETm9kZSBub2RlKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbm9kZS5nZXREVERGaWxlKCkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOwotCQlEVEROb2RlIGN1cnJlbnROb2RlID0gbnVsbDsKLQkJRFRETm9kZSBwcmV2Tm9kZSA9IG51bGw7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWN1cnJlbnROb2RlID0gKERURE5vZGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChub2RlID09IGN1cnJlbnROb2RlICYmIHByZXZOb2RlICE9IG51bGwgJiYgcHJldk5vZGUgaW5zdGFuY2VvZiBDb21tZW50KQotCQkJCXJldHVybiAoQ29tbWVudCkgcHJldk5vZGU7Ci0JCQllbHNlCi0JCQkJcHJldk5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbXB0eVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbXB0eVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhmNDI5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRW1wdHlTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRW1wdHlTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmRvSGFuZGxlRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzdXBlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldE1pbmltdW1IZWlnaHQoKSB7Ci0JCXJldHVybiAwOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRW50aXR5VHlwZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbnRpdHlUeXBlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjYzNGJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbnRpdHlUeXBlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5VHlwZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgZmluYWwgU3RyaW5nIEVOVElUWV9UWVBFID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9FTlRJVFlfVFlQRTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9FTlRJVFkgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0VYVEVSTkFMX0VOVElUWTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQQVJBTUVURVIgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1BBUkFNRVRFUl9FTlRJVFk7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgR0VORVJBTCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfR0VORVJBTF9FTlRJVFk7Ci0KLQlwcml2YXRlIENDb21ibyB0eXBlQ29tYm87Ci0JcHJpdmF0ZSBTdHJpbmdbXSB0eXBlQ29tYm9WYWx1ZXMgPSB7UEFSQU1FVEVSLCBHRU5FUkFMfTsKLQlwcml2YXRlIEJ1dHRvbiBjaGVja0JveDsKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0V4dGVybmFsRW50aXR5ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgY0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIEVOVElUWV9UWVBFKTsKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCVBvaW50IHAgPSBjTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWludCBsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQljTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl0eXBlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQl0eXBlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQl0eXBlQ29tYm8uc2V0SXRlbXModHlwZUNvbWJvVmFsdWVzKTsKLQotCQljaGVja0JveCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBFWFRFUk5BTF9FTlRJVFksIFNXVC5DSEVDSyk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlwID0gY2hlY2tCb3guY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCg5NSwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQljaGVja0JveC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCi0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJaWYgKGVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKQotCQkJCQl0eXBlQ29tYm8uc2V0VGV4dChQQVJBTUVURVIpOwotCQkJCWVsc2UKLQkJCQkJdHlwZUNvbWJvLnNldFRleHQoR0VORVJBTCk7Ci0KLQkJCQlpZiAoZW50aXR5LmlzRXh0ZXJuYWxFbnRpdHkoKSkgewotCQkJCQljaGVja0JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJCWlzRXh0ZXJuYWxFbnRpdHkgPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY2hlY2tCb3guc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQkJaXNFeHRlcm5hbEVudGl0eSA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoZS53aWRnZXQgPT0gdHlwZUNvbWJvKSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IG5vZGUgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQlTdHJpbmcgc2VsZWN0ZWQgPSB0eXBlQ29tYm8uZ2V0VGV4dCgpOwotCQkJCWlmIChQQVJBTUVURVIuZXF1YWxzKHNlbGVjdGVkKSkKLQkJCQkJbm9kZS5zZXRQYXJhbWV0ZXJFbnRpdHkodHJ1ZSk7Ci0JCQkJZWxzZQotCQkJCQlub2RlLnNldFBhcmFtZXRlckVudGl0eShmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZS53aWRnZXQgPT0gY2hlY2tCb3gpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgbm9kZSA9IChFbnRpdHkpIGlucHV0OwotCQkJCWJvb2xlYW4gc2VsZWN0ZWQgPSBjaGVja0JveC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCQkJbm9kZS5zZXRFeHRlcm5hbEVudGl0eSh0cnVlKTsKLQkJCQkJaXNFeHRlcm5hbEVudGl0eSA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlub2RlLnNldEV4dGVybmFsRW50aXR5KGZhbHNlKTsKLQkJCQkJaXNFeHRlcm5hbEVudGl0eSA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0VudGl0eVZhbHVlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0VudGl0eVZhbHVlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmYzNTY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbnRpdHlWYWx1ZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5VmFsdWVTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBWQUxVRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX1ZBTFVFOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBVQkxJQ19JRCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfUFVCTElDX0lEOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFNZU1RFTV9JRCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfU1lTVEVNX0lEOwotCi0JcHJpdmF0ZSBUZXh0IHZhbHVlVGV4dDsKLQlwcml2YXRlIFRleHQgcHVibGljSWRUZXh0OwotCXByaXZhdGUgVGV4dCBzeXN0ZW1JZFRleHQ7Ci0KLQlwcml2YXRlIENMYWJlbCB2YWx1ZUxhYmVsOwotCXByaXZhdGUgQ0xhYmVsIHB1YmxpY0lkTGFiZWw7Ci0JcHJpdmF0ZSBDTGFiZWwgc3lzdGVtSWRMYWJlbDsKLQotCXB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LndpZGdldCA9PSB2YWx1ZVRleHQpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSB2YWx1ZVRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGlucHV0OwotCQkJCWVudGl0eS5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHB1YmxpY0lkVGV4dCkgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IHB1YmxpY0lkVGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJZW50aXR5LnNldFB1YmxpY0lEKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gc3lzdGVtSWRUZXh0KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gc3lzdGVtSWRUZXh0LmdldFRleHQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQllbnRpdHkuc2V0U3lzdGVtSUQobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJdmFsdWVMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBWQUxVRSk7Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlQb2ludCBwID0gdmFsdWVMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJaW50IGxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCXZhbHVlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBFbnRpdHkgVmFsdWUKLQkJdmFsdWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodmFsdWVMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHZhbHVlTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQl2YWx1ZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdmFsdWVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCXB1YmxpY0lkTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgUFVCTElDX0lEKTsKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCXAgPSBwdWJsaWNJZExhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHZhbHVlTGFiZWwsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJcHVibGljSWRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIFB1YmxpYyBJRAotCQlwdWJsaWNJZFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChwdWJsaWNJZExhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHVibGljSWRMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXB1YmxpY0lkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlwdWJsaWNJZFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJc3lzdGVtSWRMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBTWVNURU1fSUQpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJcCA9IHN5c3RlbUlkTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHVibGljSWRMYWJlbCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlzeXN0ZW1JZExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gU3lzdGVtIElECi0JCXN5c3RlbUlkVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHN5c3RlbUlkTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChzeXN0ZW1JZExhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJc3lzdGVtSWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN5c3RlbUlkVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQlpZiAoaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQl2YWx1ZUxhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCQkJdmFsdWVUZXh0LnNldFZpc2libGUoZmFsc2UpOwotCQkJcHVibGljSWRMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJcHVibGljSWRUZXh0LnNldFZpc2libGUodHJ1ZSk7Ci0JCQlzeXN0ZW1JZExhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlzeXN0ZW1JZFRleHQuc2V0VmlzaWJsZSh0cnVlKTsKLQotCQkJcHVibGljSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQlzeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGlucHV0OwotCQkJCXB1YmxpY0lkVGV4dC5zZXRUZXh0KChlbnRpdHkpLmdldFB1YmxpY0lEKCkpOwotCQkJCXN5c3RlbUlkVGV4dC5zZXRUZXh0KChlbnRpdHkpLmdldFN5c3RlbUlEKCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdmFsdWVMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJdmFsdWVUZXh0LnNldFZpc2libGUodHJ1ZSk7Ci0JCQlwdWJsaWNJZExhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCQkJcHVibGljSWRUZXh0LnNldFZpc2libGUoZmFsc2UpOwotCQkJc3lzdGVtSWRMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCXN5c3RlbUlkVGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQkJdmFsdWVUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkKLQkJCQl2YWx1ZVRleHQuc2V0VGV4dCgoKEVudGl0eSkgaW5wdXQpLmdldFZhbHVlKCkpOwotCQl9Ci0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNzaG91bGRVc2VFeHRyYVNwYWNlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRXh0ZXJuYWxFbnRpdHkoKSB7Ci0JCXJldHVybiBFbnRpdHlUeXBlU2VjdGlvbi5pc0V4dGVybmFsRW50aXR5OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDE0YzY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgTkFNRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfTkFNRTsKLQlwcml2YXRlIFRleHQgbmFtZVRleHQ7Ci0KLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gbmFtZVRleHQpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSBuYW1lVGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAobmV3VmFsdWUubGVuZ3RoKCkgPiAwICYmIGlucHV0IGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJCURURE5vZGUgZHRkTm9kZSA9IChEVEROb2RlKSBpbnB1dDsKLQkJCQlkdGROb2RlLnNldE5hbWUobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIG5hbWVMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBOQU1FKTsKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCVBvaW50IHAgPSBuYW1lTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWludCBsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQluYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQluYW1lVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCW5hbWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCW5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCS8vIGxpc3RlbmVyLnN0YXJ0TGlzdGVuaW5nRm9yRW50ZXIobmFtZVRleHQpOwotCQkvLyBsaXN0ZW5lci5zdGFydExpc3RlbmluZ1RvKG5hbWVUZXh0KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQluYW1lVGV4dC5zZXRFbmFibGVkKHRydWUpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQluYW1lVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRFRETm9kZSkKLQkJCQluYW1lVGV4dC5zZXRUZXh0KCgoRFRETm9kZSkgaW5wdXQpLmdldE5hbWUoKSk7Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3Nob3VsZFVzZUV4dHJhU3BhY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05ld0VudGl0eVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OZXdFbnRpdHlTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NDkyMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05ld0VudGl0eVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuUmVzb3VyY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBOZXdFbnRpdHlTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBOQU1FID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIEVOVElUWV9UWVBFID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9FTlRJVFlfVFlQRTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9FTlRJVFkgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0VYVEVSTkFMX0VOVElUWTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQQVJBTUVURVIgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1BBUkFNRVRFUl9FTlRJVFk7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgR0VORVJBTCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfR0VORVJBTF9FTlRJVFk7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVkFMVUUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0VOVElUWV9WQUxVRTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQVUJMSUNfSUQgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1BVQkxJQ19JRDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBTWVNURU1fSUQgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1NZU1RFTV9JRDsKLQotCXByaXZhdGUgVGV4dCBzeXN0ZW1JZFRleHQ7Ci0JcHJpdmF0ZSBUZXh0IHB1YmxpY0lkVGV4dDsKLQlwcml2YXRlIFRleHQgbmFtZVRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gd2l6YXJkQnV0dG9uOwotCi0JcHJpdmF0ZSBUZXh0IGVudGl0eVZhbHVlVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiBjaGVja0JveDsKLQotCXByaXZhdGUgQ0NvbWJvIHR5cGVDb21ibzsKLQlwcml2YXRlIFN0cmluZ1tdIHR5cGVDb21ib1ZhbHVlcyA9IHtQQVJBTUVURVIsIEdFTkVSQUx9OwotCXByaXZhdGUgUGFnZUJvb2sgcGFnZUJvb2s7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotCQljcmVhdGVFbnRpdHlDb21tb25Db21wb3NpdGUoY29tcG9zaXRlKTsKLQotCQlwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZW50aXR5Q29tbW9uQ29tcG9zaXRlLCAwKTsKLQkJZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQljcmVhdGVFeHRlcm5hbEVudGl0eUNvbXBvc2l0ZShwYWdlQm9vayk7Ci0JCWNyZWF0ZUludGVybmFsRW50aXR5Q29tcG9zaXRlKHBhZ2VCb29rKTsKLQotCQlwYWdlQm9vay5zaG93UGFnZShleHRlcm5hbEVudGl0eUNvbXBvc2l0ZSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgZW50aXR5Q29tbW9uQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlRW50aXR5Q29tbW9uQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZW50aXR5Q29tbW9uQ29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQllbnRpdHlDb21tb25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgbmFtZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChlbnRpdHlDb21tb25Db21wb3NpdGUsIE5BTUUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlQb2ludCBwID0gbmFtZUxhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlpbnQgbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJbmFtZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJbmFtZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChlbnRpdHlDb21tb25Db21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQgICAgCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCW5hbWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCW5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCBjTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGVudGl0eUNvbW1vbkNvbXBvc2l0ZSwgRU5USVRZX1RZUEUpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJcCA9IGNMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChuYW1lTGFiZWwsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJY0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gQ3JlYXRlIENoZWNrYm94Ci0JCWNoZWNrQm94ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihlbnRpdHlDb21tb25Db21wb3NpdGUsIEVYVEVSTkFMX0VOVElUWSwgU1dULkNIRUNLKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJY2hlY2tCb3guc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJY2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gQ3JlYXRlIENDb21ibwotCQl0eXBlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGVudGl0eUNvbW1vbkNvbXBvc2l0ZSwgU1dULkZMQVQgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSAtIDIpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNoZWNrQm94LCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXR5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0eXBlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCXR5cGVDb21iby5zZXRJdGVtcyh0eXBlQ29tYm9WYWx1ZXMpOwotCQl0eXBlQ29tYm8uc2V0VGV4dChQQVJBTUVURVIpOwotCi0JCXJldHVybiBlbnRpdHlDb21tb25Db21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgaW50ZXJuYWxFbnRpdHlDb21wb3NpdGU7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVJbnRlcm5hbEVudGl0eUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWludGVybmFsRW50aXR5Q29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGVudGl0eUNvbW1vbkNvbXBvc2l0ZSwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlpbnRlcm5hbEVudGl0eUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCBlbnRpdHlWYWx1ZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChpbnRlcm5hbEVudGl0eUNvbXBvc2l0ZSwgVkFMVUUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MTEwNgotCQlQb2ludCBwID0gZW50aXR5VmFsdWVMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJaW50IGxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWVudGl0eVZhbHVlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQllbnRpdHlWYWx1ZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChpbnRlcm5hbEVudGl0eUNvbXBvc2l0ZSwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChlbnRpdHlWYWx1ZUxhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZW50aXR5VmFsdWVMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCWVudGl0eVZhbHVlVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQllbnRpdHlWYWx1ZVRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCWVudGl0eVZhbHVlVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQotCQlyZXR1cm4gaW50ZXJuYWxFbnRpdHlDb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgZXh0ZXJuYWxFbnRpdHlDb21wb3NpdGU7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVFeHRlcm5hbEVudGl0eUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWV4dGVybmFsRW50aXR5Q29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGVudGl0eUNvbW1vbkNvbXBvc2l0ZSwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlleHRlcm5hbEVudGl0eUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCBwdWJsaWNJZExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChleHRlcm5hbEVudGl0eUNvbXBvc2l0ZSwgUFVCTElDX0lEKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJUG9pbnQgcCA9IHB1YmxpY0lkTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWludCBsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlwdWJsaWNJZExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcHVibGljSWRUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoZXh0ZXJuYWxFbnRpdHlDb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljSWRUZXh0LnNldEVkaXRhYmxlKHRydWUpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChwdWJsaWNJZExhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHVibGljSWRMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXB1YmxpY0lkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlwdWJsaWNJZFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJLy8gQ3JlYXRlIFN5c3RlbSBJRCBMYWJlbAotCQlDTGFiZWwgc3lzdGVtSWRMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoZXh0ZXJuYWxFbnRpdHlDb21wb3NpdGUsIFNZU1RFTV9JRCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCXAgPSBzeXN0ZW1JZExhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHB1YmxpY0lkTGFiZWwsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLQkJc3lzdGVtSWRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIENyZWF0ZSBXaXphcmQgQnV0dG9uCi0JCXdpemFyZEJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oZXh0ZXJuYWxFbnRpdHlDb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJd2l6YXJkQnV0dG9uLnNldEltYWdlKEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksICJpY29ucy9icm93c2VidXR0b24uZ2lmIikuY3JlYXRlSW1hZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHN5c3RlbUlkTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQl3aXphcmRCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJd2l6YXJkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIENyZWF0ZSBTeXN0ZW0gSUQgVGV4dAotCQlzeXN0ZW1JZFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChleHRlcm5hbEVudGl0eUNvbXBvc2l0ZSwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBzeXN0ZW1JZFRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChzeXN0ZW1JZExhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQod2l6YXJkQnV0dG9uLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHN5c3RlbUlkTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQlzeXN0ZW1JZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3lzdGVtSWRUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCXJldHVybiBleHRlcm5hbEVudGl0eUNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChlLndpZGdldCA9PSB0eXBlQ29tYm8pIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgbm9kZSA9IChFbnRpdHkpIGlucHV0OwotCQkJCVN0cmluZyBzZWxlY3RlZCA9IHR5cGVDb21iby5nZXRUZXh0KCk7Ci0JCQkJaWYgKFBBUkFNRVRFUi5lcXVhbHMoc2VsZWN0ZWQpKQotCQkJCQlub2RlLnNldFBhcmFtZXRlckVudGl0eSh0cnVlKTsKLQkJCQllbHNlCi0JCQkJCW5vZGUuc2V0UGFyYW1ldGVyRW50aXR5KGZhbHNlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChlLndpZGdldCA9PSBjaGVja0JveCkgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBub2RlID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJYm9vbGVhbiBzZWxlY3RlZCA9IGNoZWNrQm94LmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3RlZCkgewotCQkJCQlub2RlLnNldEV4dGVybmFsRW50aXR5KHRydWUpOwotCQkJCQlwYWdlQm9vay5zaG93UGFnZShleHRlcm5hbEVudGl0eUNvbXBvc2l0ZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlub2RlLnNldEV4dGVybmFsRW50aXR5KGZhbHNlKTsKLQkJCQkJcGFnZUJvb2suc2hvd1BhZ2UoaW50ZXJuYWxFbnRpdHlDb21wb3NpdGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChlLndpZGdldCA9PSB3aXphcmRCdXR0b24pIHsKLQkJCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJCUlGaWxlIGN1cnJlbnRJRmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpOwotCQkJVmlld2VyRmlsdGVyIGZpbHRlciA9IG5ldyBSZXNvdXJjZUZpbHRlcihuZXcgU3RyaW5nW117Ii5kdGQifSwgbmV3IElGaWxlW117Y3VycmVudElGaWxlfSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJRFREU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQgZmlsZVNlbGVjdFdpemFyZCA9IG5ldyBEVERTZWxlY3RJbmNsdWRlRmlsZVdpemFyZChEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0ZJTEVESUFMT0dfU0VMRUNUX0RURCwgRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9GSUxFRElBTE9HX1NFTEVDVF9EVERfREVTQywgZmlsdGVyLCAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTZWxlY3Rpb24pOwotCi0JCQlXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgZmlsZVNlbGVjdFdpemFyZCk7Ci0JCQl3aXphcmREaWFsb2cuY3JlYXRlKCk7Ci0JCQl3aXphcmREaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlpbnQgcmVzdWx0ID0gd2l6YXJkRGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZXN1bHQgPT0gV2luZG93Lk9LKSB7Ci0JCQkJU3RyaW5nIHZhbHVlID0gc3lzdGVtSWRUZXh0LmdldFRleHQoKTsKLQkJCQlJRmlsZSBzZWxlY3RlZElGaWxlID0gZmlsZVNlbGVjdFdpemFyZC5nZXRSZXN1bHRGaWxlKCk7Ci0JCQkJU3RyaW5nIGR0ZEZpbGVTdHJpbmcgPSB2YWx1ZTsKLQkJCQlpZiAoc2VsZWN0ZWRJRmlsZSAhPSBudWxsKSB7Ci0JCQkJCWR0ZEZpbGVTdHJpbmcgPSBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkoc2VsZWN0ZWRJRmlsZS5nZXRGdWxsUGF0aCgpLCBjdXJyZW50SUZpbGUuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJfQotCQkJCXN5c3RlbUlkVGV4dC5zZXRUZXh0KGR0ZEZpbGVTdHJpbmcpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJbmFtZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQluYW1lVGV4dC5zZXRUZXh0KGVudGl0eS5nZXROYW1lKCkpOwotCi0JCQkJaWYgKGVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKQotCQkJCQl0eXBlQ29tYm8uc2V0VGV4dChQQVJBTUVURVIpOwotCQkJCWVsc2UKLQkJCQkJdHlwZUNvbWJvLnNldFRleHQoR0VORVJBTCk7Ci0KLQkJCQlpZiAoZW50aXR5LmlzRXh0ZXJuYWxFbnRpdHkoKSkgewotCQkJCQljaGVja0JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJCXBhZ2VCb29rLnNob3dQYWdlKGV4dGVybmFsRW50aXR5Q29tcG9zaXRlKTsKLQkJCQkJcHVibGljSWRUZXh0LnNldFRleHQoZW50aXR5LmdldFB1YmxpY0lEKCkpOwotCQkJCQlzeXN0ZW1JZFRleHQuc2V0VGV4dChlbnRpdHkuZ2V0U3lzdGVtSUQoKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljaGVja0JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCQlwYWdlQm9vay5zaG93UGFnZShpbnRlcm5hbEVudGl0eUNvbXBvc2l0ZSk7Ci0JCQkJCWVudGl0eVZhbHVlVGV4dC5zZXRUZXh0KGVudGl0eS5nZXRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3Nob3VsZFVzZUV4dHJhU3BhY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LndpZGdldCA9PSBuYW1lVGV4dCkgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IG5hbWVUZXh0LmdldFRleHQoKTsKLQkJCWlmIChuZXdWYWx1ZS5sZW5ndGgoKSA+IDAgJiYgaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJZW50aXR5LnNldE5hbWUobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBlbnRpdHlWYWx1ZVRleHQpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSBlbnRpdHlWYWx1ZVRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGlucHV0OwotCQkJCWVudGl0eS5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHB1YmxpY0lkVGV4dCkgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IHB1YmxpY0lkVGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJZW50aXR5LnNldFB1YmxpY0lEKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gc3lzdGVtSWRUZXh0KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gc3lzdGVtSWRUZXh0LmdldFRleHQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQllbnRpdHkuc2V0U3lzdGVtSUQobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTm90YXRpb25TZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTm90YXRpb25TZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlOTYwZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05vdGF0aW9uU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFByb3BlcnRpZXNNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIE5vdGF0aW9uU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUFVCTElDX0lEID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9QVUJMSUNfSUQ7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1lTVEVNX0lEID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9TWVNURU1fSUQ7Ci0KLQlwcml2YXRlIFRleHQgcHVibGljSWRUZXh0OwotCXByaXZhdGUgVGV4dCBzeXN0ZW1JZFRleHQ7Ci0KLQlwcml2YXRlIENMYWJlbCBwdWJsaWNJZExhYmVsOwotCXByaXZhdGUgQ0xhYmVsIHN5c3RlbUlkTGFiZWw7Ci0KLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gcHVibGljSWRUZXh0KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gcHVibGljSWRUZXh0LmdldFRleHQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIE5vdGF0aW9uKSB7Ci0JCQkJTm90YXRpb24gbm90YXRpb24gPSAoTm90YXRpb24pIGlucHV0OwotCQkJCW5vdGF0aW9uLnNldFB1YmxpY0lEKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gc3lzdGVtSWRUZXh0KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gc3lzdGVtSWRUZXh0LmdldFRleHQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIE5vdGF0aW9uKSB7Ci0JCQkJTm90YXRpb24gbm90YXRpb24gPSAoTm90YXRpb24pIGlucHV0OwotCQkJCW5vdGF0aW9uLnNldFN5c3RlbUlEKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCXB1YmxpY0lkTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgUFVCTElDX0lEKTsKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQxMTA2Ci0JCVBvaW50IHAgPSBwdWJsaWNJZExhYmVsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UpOwotCQlpbnQgbGFiZWxXaWR0aCA9IE1hdGgubWF4KHAueCwgOTgpOwotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJcHVibGljSWRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIFB1YmxpYyBJRAotCQlwdWJsaWNJZFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChwdWJsaWNJZExhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHVibGljSWRMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXB1YmxpY0lkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlwdWJsaWNJZFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJc3lzdGVtSWRMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBTWVNURU1fSUQpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJcCA9IHN5c3RlbUlkTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHVibGljSWRMYWJlbCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlzeXN0ZW1JZExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gU3lzdGVtIElECi0JCXN5c3RlbUlkVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHN5c3RlbUlkTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChzeXN0ZW1JZExhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJc3lzdGVtSWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN5c3RlbUlkVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQlwdWJsaWNJZFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBOb3RhdGlvbikgewotCQkJTm90YXRpb24gbm90YXRpb24gPSAoTm90YXRpb24pIGlucHV0OwotCQkJcHVibGljSWRUZXh0LnNldFRleHQoKG5vdGF0aW9uKS5nZXRQdWJsaWNJRCgpKTsKLQkJCXN5c3RlbUlkVGV4dC5zZXRUZXh0KChub3RhdGlvbikuZ2V0U3lzdGVtSUQoKSk7Ci0JCX0KLQotCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vT2NjdXJyZW5jZUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL09jY3VycmVuY2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI1N2UwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vT2NjdXJyZW5jZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNUmVwZWF0YWJsZU5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBPY2N1cnJlbmNlRmlsdGVyIGltcGxlbWVudHMgSUZpbHRlciB7Ci0JcHVibGljIGJvb2xlYW4gc2VsZWN0KE9iamVjdCB0b1Rlc3QpIHsKLQkJaWYgKHRvVGVzdCBpbnN0YW5jZW9mIENNQmFzaWNOb2RlICYmICgoQ01CYXNpY05vZGUpIHRvVGVzdCkuaXNFbXB0eUFueU9yUENEYXRhKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UgaWYgKHRvVGVzdCBpbnN0YW5jZW9mIENNUmVwZWF0YWJsZU5vZGUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9PY2N1cnJlbmNlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL09jY3VycmVuY2VTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZjVmZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL09jY3VycmVuY2VTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNUmVwZWF0YWJsZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBPY2N1cnJlbmNlU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT05DRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfT05DRTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBPTkVfT1JfTU9SRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfT05FX09SX01PUkU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT1BUSU9OQUwgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX09QVElPTkFMOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFpFUk9fT1JfTU9SRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfWkVST19PUl9NT1JFOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9DQ1VSRU5DRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfT0NDVVJSRU5DRTsKLQotCXByaXZhdGUgQ0NvbWJvIG9jY3VycmVuY2VDb21ibzsKLQlwcml2YXRlIFN0cmluZ1tdIG9jY3VycmVuY2VDb21ib1ZhbHVlcyA9IHtPTkNFLCBPTkVfT1JfTU9SRSwgT1BUSU9OQUwsIFpFUk9fT1JfTU9SRX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgdXNhZ2VMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBPQ0NVUkVOQ0UpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJUG9pbnQgcCA9IHVzYWdlTGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmYWxzZSk7Ci0JCWludCBsYWJlbFdpZHRoID0gTWF0aC5tYXgocC54LCA5OCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQl1c2FnZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJb2NjdXJyZW5jZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodXNhZ2VMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHVzYWdlTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQlvY2N1cnJlbmNlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJb2NjdXJyZW5jZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlvY2N1cnJlbmNlQ29tYm8uc2V0SXRlbXMob2NjdXJyZW5jZUNvbWJvVmFsdWVzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDTVJlcGVhdGFibGVOb2RlKSB7Ci0JCQljaGFyIG9jY3VyZW5jZSA9ICgoQ01SZXBlYXRhYmxlTm9kZSkgaW5wdXQpLmdldE9jY3VycmVuY2UoKTsKLQkJCWlmIChDTVJlcGVhdGFibGVOb2RlLk9OQ0UgPT0gb2NjdXJlbmNlKQotCQkJCW9jY3VycmVuY2VDb21iby5zZXRUZXh0KE9OQ0UpOwotCQkJZWxzZSBpZiAoQ01SZXBlYXRhYmxlTm9kZS5PTkVfT1JfTU9SRSA9PSBvY2N1cmVuY2UpCi0JCQkJb2NjdXJyZW5jZUNvbWJvLnNldFRleHQoT05FX09SX01PUkUpOwotCQkJZWxzZSBpZiAoQ01SZXBlYXRhYmxlTm9kZS5PUFRJT05BTCA9PSBvY2N1cmVuY2UpCi0JCQkJb2NjdXJyZW5jZUNvbWJvLnNldFRleHQoT1BUSU9OQUwpOwotCQkJZWxzZSBpZiAoQ01SZXBlYXRhYmxlTm9kZS5aRVJPX09SX01PUkUgPT0gb2NjdXJlbmNlKQotCQkJCW9jY3VycmVuY2VDb21iby5zZXRUZXh0KFpFUk9fT1JfTU9SRSk7Ci0JCQllbHNlCi0JCQkJb2NjdXJyZW5jZUNvbWJvLnNldFRleHQoT05DRSk7Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ01SZXBlYXRhYmxlTm9kZSkgewotCQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJCUNNUmVwZWF0YWJsZU5vZGUgbm9kZSA9IChDTVJlcGVhdGFibGVOb2RlKSBpbnB1dDsKLQkJCVN0cmluZyBvY2N1cnJlbmNlID0gb2NjdXJyZW5jZUNvbWJvLmdldFRleHQoKTsKLQkJCWlmIChPTkNFLmVxdWFscyhvY2N1cnJlbmNlKSkKLQkJCQlub2RlLnNldE9jY3VycmVuY2UoQ01SZXBlYXRhYmxlTm9kZS5PTkNFKTsKLQkJCWVsc2UgaWYgKE9ORV9PUl9NT1JFLmVxdWFscyhvY2N1cnJlbmNlKSkKLQkJCQlub2RlLnNldE9jY3VycmVuY2UoQ01SZXBlYXRhYmxlTm9kZS5PTkVfT1JfTU9SRSk7Ci0JCQllbHNlIGlmIChPUFRJT05BTC5lcXVhbHMob2NjdXJyZW5jZSkpCi0JCQkJbm9kZS5zZXRPY2N1cnJlbmNlKENNUmVwZWF0YWJsZU5vZGUuT1BUSU9OQUwpOwotCQkJZWxzZSBpZiAoWkVST19PUl9NT1JFLmVxdWFscyhvY2N1cnJlbmNlKSkKLQkJCQlub2RlLnNldE9jY3VycmVuY2UoQ01SZXBlYXRhYmxlTm9kZS5aRVJPX09SX01PUkUpOwotCQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9UeXBlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1R5cGVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxODc5NWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1R5cGVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgVHlwZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgZmluYWwgU3RyaW5nIFRZUEUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1RZUEU7Ci0KLQlwcml2YXRlIENDb21ibyB0eXBlQ29tYm87Ci0JcHJpdmF0ZSBTdHJpbmdbXSB0eXBlQ29tYm9WYWx1ZXMgPSB7QXR0cmlidXRlLkNEQVRBLCBBdHRyaWJ1dGUuSUQsIEF0dHJpYnV0ZS5JRFJFRiwgQXR0cmlidXRlLklEUkVGUywgQXR0cmlidXRlLkVOVElUWSwgQXR0cmlidXRlLkVOVElUSUVTLCBBdHRyaWJ1dGUuTk1UT0tFTiwgQXR0cmlidXRlLk5NVE9LRU5TLCBBdHRyaWJ1dGUuRU5VTUVSQVRFRF9OQU1FLCBBdHRyaWJ1dGUuRU5VTUVSQVRFRF9OT1RBVElPTn07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgY0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFRZUEUpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDExMDYKLQkJUG9pbnQgcCA9IGNMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlKTsKLQkJaW50IGxhYmVsV2lkdGggPSBNYXRoLm1heChwLngsIDk4KTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQljTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl0eXBlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQl0eXBlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQl0eXBlQ29tYm8uc2V0SXRlbXModHlwZUNvbWJvVmFsdWVzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCi0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpCi0JCQkJdHlwZUNvbWJvLnNldFRleHQoKChBdHRyaWJ1dGUpIGlucHV0KS5nZXRUeXBlKCkpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoZS53aWRnZXQgPT0gdHlwZUNvbWJvKSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQXR0cmlidXRlKSB7Ci0JCQkJQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChBdHRyaWJ1dGUpIGlucHV0OwotCQkJCWF0dHJpYnV0ZS5zZXRUeXBlKHR5cGVDb21iby5nZXRUZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYTVkZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkRURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS50ZXh0LklEVERQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0KLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBhIHNvdXJjZSB2aWV3ZXIgd2hpY2ggc2hvd3MgRFREIGNvbnRlbnQuCi0gKiA8cD4KLSAqIENsaWVudHMgY2FuIHN1YmNsYXNzIGFuZCBvdmVycmlkZSBqdXN0IHRob3NlIG1ldGhvZHMgd2hpY2ggbXVzdCBiZSBzcGVjaWZpYwotICogdG8gdGhlaXIgbmVlZHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkRURCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiB7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24gYmVjYXVzZSBub3Qgc291cmNldmlld2VyLXNwZWNpZmljIGFuZAotCSAqIGl0J3MgYSBTdHJpbmcgYXJyYXkKLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGZDb25maWd1cmVkQ29udGVudFR5cGVzOwotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlcltdIGZMaW5lU3R5bGVQcm92aWRlcnM7Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkRURAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQoKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJaWYgKGZDb25maWd1cmVkQ29udGVudFR5cGVzID09IG51bGwpIHsKLQkJCWZDb25maWd1cmVkQ29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tde0lEVERQYXJ0aXRpb25zLkRURF9ERUZBVUxULCBJU3RydWN0dXJlZFBhcnRpdGlvbnMuREVGQVVMVF9QQVJUSVRJT04sIElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTn07Ci0JCX0KLQkJcmV0dXJuIGZDb25maWd1cmVkQ29udGVudFR5cGVzOwotCX0KLQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJaWYgKGZMaW5lU3R5bGVQcm92aWRlcnMgPT0gbnVsbCkgewotCQkJZkxpbmVTdHlsZVByb3ZpZGVycyA9IG5ldyBMaW5lU3R5bGVQcm92aWRlcltde2NyZWF0ZUxpbmVTdHlsZVByb3ZpZGVyRm9yRFREKCl9OwotCQl9Ci0JCXJldHVybiBmTGluZVN0eWxlUHJvdmlkZXJzOwotCX0KLQotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgY3JlYXRlTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQoKSB7Ci0JCXJldHVybiBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERVSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzc3NTkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgRFREIFVJCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRFREVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FUVFJJQlVURUxJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRFREX05PVEFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0RURF9FTlRJVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRFREX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRFREX0NPTU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9EVERfREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FUVFJJQlVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0dST1VQX0FERF9HUk9VUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9FTEVNRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9CVVRUT05fR1JPVVBfSVRFTVNfTE9HSUNBTExZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9CVVRUT05fU09SVF9JVEVNUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9QQVJBTV9FTlRJVFlfUkVGOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NT1ZFX0FUVFJJQlVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTU9WRV9DT05URU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NT1ZFX05PREU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01PVkVfTk9ERVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0RURDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGluZ19maWxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERGaWxlc1ByZWZlcmVuY2VQYWdlX0V4dGVuc2lvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERUREZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREQ29sb3JQYWdlXzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU291cmNlTWVudV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ1JFQVRFX05FV19EVERfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19EVERfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfRFREX0VYUEw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9GSUxFX0RFTEVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZUdyb3VwX25hbWVFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TVFJVQ1RVUkVEX1RFWFRfRURJVE9SX1BSRUZTX0xJTks7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRFREVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc2ZTZkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQudGVtcGxhdGVzLkNvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc0RURDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIERURFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBEVERVSVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgZHRkIHVpLgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQotCS8qKgotCSAqIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIGR0ZCB1aS4KLQkgKi8KLQlwcml2YXRlIENvbnRleHRUeXBlUmVnaXN0cnkgZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgRFREVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgZHRkIGVkaXRvciB0ZW1wbGF0ZXMuCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBkdGQgZWRpdG9yIHRlbXBsYXRlcwotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCWlmIChmVGVtcGxhdGVTdG9yZSA9PSBudWxsKSB7Ci0JCQlmVGVtcGxhdGVTdG9yZSA9IG5ldyBDb250cmlidXRpb25UZW1wbGF0ZVN0b3JlKGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCksIGdldFByZWZlcmVuY2VTdG9yZSgpLCBEVERVSVByZWZlcmVuY2VOYW1lcy5URU1QTEFURVNfS0VZKTsKLQotCQkJdHJ5IHsKLQkJCQlmVGVtcGxhdGVTdG9yZS5sb2FkKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlRlbXBsYXRlU3RvcmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUgZHRkIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBkdGQgcGx1Z2luCi0JICovCi0JcHVibGljIENvbnRleHRUeXBlUmVnaXN0cnkgZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSB7Ci0JCWlmIChmQ29udGV4dFR5cGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbmV3IENvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkoKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNEVEQuTkVXKTsKLQotCQkJZkNvbnRleHRUeXBlUmVnaXN0cnkgPSByZWdpc3RyeTsKLQkJfQotCi0JCXJldHVybiBmQ29udGV4dFR5cGVSZWdpc3RyeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGFlOTZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVMSVNUPUFkZCBBdHRyaWJ1dGUgJkxpc3QKLQotIURURE91dGxpbmVyCi1fVUlfQUNUSU9OX0FERF9EVERfTk9UQVRJT049QWRkICZOb3RhdGlvbgotX1VJX0FDVElPTl9BRERfRFREX0VOVElUWT1BZGQgJkVudGl0eQotX1VJX0FDVElPTl9BRERfRFREX0VMRU1FTlQ9QWRkIEVsZSZtZW50Ci1fVUlfQUNUSU9OX0FERF9EVERfQ09NTUVOVD1BZGQgJkNvbW1lbnQKLV9VSV9BQ1RJT05fRFREX0RFTEVURT0mRGVsZXRlCi1fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEU9QWRkICZBdHRyaWJ1dGUKLV9VSV9BQ1RJT05fR1JPVVBfQUREX0dST1VQPUFkZCBHcm91cCB0byBDb24mdGVudCBNb2RlbAotX1VJX0FDVElPTl9BRERfRUxFTUVOVD1BZGQgRWxlbWVudCB0byBDJm9udGVudCBNb2RlbAotCi0hRFREQ29udGVudE91dGxpbmVQYWdlCi1fVUlfQlVUVE9OX0dST1VQX0lURU1TX0xPR0lDQUxMWT1Hcm91cCBpdGVtcyBsb2dpY2FsbHkuCi1fVUlfQlVUVE9OX1NPUlRfSVRFTVM9U29ydCBpdGVtcyBhbHBoYWJldGljYWxseS4KLQotIURURENvbnRleHRDb250cmlidXRlcgotX1VJX0FDVElPTl9BRERfUEFSQU1fRU5USVRZX1JFRj1BZGQgJlBhcmFtZXRlciBFbnRpdHkgUmVmZXJlbmNlCi0KLSFEcmFnQXR0cmlidXRlQ29tbWFuZAotX1VJX01PVkVfQVRUUklCVVRFPU1vdmUgQXR0cmlidXRlCi0KLSFEcmFnQ29udGVudE1vZGVsQ29tbWFuZAotX1VJX01PVkVfQ09OVEVOVD1Nb3ZlIENvbnRlbnQKLQotIURyYWdUb3BMZXZlbE5vZGVzQ29tbWFuZAotX1VJX01PVkVfTk9ERT1Nb3ZlIE5vZGUKLV9VSV9NT1ZFX05PREVTPU1vdmUgTm9kZXMKLQotX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0RURD1UaGUgZmlsZSBuYW1lIG11c3QgZW5kIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGV4dGVuc2lvbnMgezB9LgotCi0jRFREIEZpbGUgcGFnZQotQ3JlYXRpbmdfZmlsZXM9Q3JlYXRpbmcgZmlsZXMKLURUREZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uTGFiZWw9QWRkIHRoaXMgc3VmZml4IChpZiBub3Qgc3BlY2lmaWVkKToKLURUREZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uRXJyb3I9U3VmZml4IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgezB9LgotCi0jRFREIFN0eWxlIHBhZ2UKLURURENvbG9yUGFnZV8wPTwhRUxFTUVOVCBNYWluIChPbmUsVHdvKyk+XHJcbjwhRUxFTUVOVCBPbmUgKFRocmVlLEZvdXIpPlxyXG48IUFUVExJU1QgT25lXHJcbiBvbmVvbmUgQ0RBVEEgI1JFUVVJUkVEXHJcbj5cclxuPCEtLSBZb3UgbmVlZCB0aGlzIC0tPlxyXG48IUVMRU1FTlQgVHdvIChtb3JlbW9yZSopPlxyXG48IUFUVExJU1QgVHdvXHJcbiB0d290d28gQ0RBVEEgI1JFUVVJUkVEXHJcbiB0d290aHJlZSAoYWFhIHwgYmJiKSAiYWFhIlxyXG4+XHJcbgotRFREQ29sb3JQYWdlXzE9Q29tbWVudHMKLURURENvbG9yUGFnZV8yPURhdGEKLURURENvbG9yUGFnZV8zPURlZmF1bHQKLURURENvbG9yUGFnZV80PUtleXdvcmRzCi1EVERDb2xvclBhZ2VfNT1TdHJpbmdzCi1EVERDb2xvclBhZ2VfNj1TeW1ib2xzCi1EVERDb2xvclBhZ2VfNz1UYWcgRGVsaW1pdGVycwotRFREQ29sb3JQYWdlXzg9VGFnIE5hbWVzCi1EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMD1OYW1lCi1EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMT1Db250ZW50cwotRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyXzI9QXR0cmlidXRlcwotCi0hIE5ld0RURFdpemFyZC5qYXZhCi1fVUlfQ1JFQVRFX05FV19EVERfRklMRSAgICAgID0gQ3JlYXRlIGEgbmV3IERURCBmaWxlLgotX1VJX1dJWkFSRF9ORVdfRFREX1RJVExFICAgICA9IENyZWF0ZSBEVEQKLV9VSV9XSVpBUkRfTkVXX0RURF9FWFBMICAgICAgPSBDcmVhdGUgYSBuZXcgRFREIGZpbGUuIFNwZWNpZnkgdGhlIGZvbGRlciBhbmQgbmFtZSBmb3IgdGhlIGZpbGUuCi0KLSMgY29waWVkIGZyb20gZHRkIGNvcmUKLV9VSV9MQUJFTF9EVERfRklMRV9ERUxFVEU9RGVsZXRlCi0jIwotUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzID0gVGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLU5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMD1TZWxlY3QgRFREIFRlbXBsYXRlCi1OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzE9U2VsZWN0IGEgdGVtcGxhdGUgYXMgaW5pdGlhbCBjb250ZW50IGluIHRoZSBEVEQgcGFnZS4KLU5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMj1OYW1lCi1OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzM9RGVzY3JpcHRpb24KLU5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfND1Vc2UgRFREIFRlbXBsYXRlCi1OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzU9UHJldmlldzoKLU5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfNj1UZW1wbGF0ZXMgYXJlICdOZXcgRFREJyB0ZW1wbGF0ZXMgZm91bmQgaW4gdGhlIDxhPkRURCBUZW1wbGF0ZXM8L2E+IHByZWZlcmVuY2UgcGFnZS4KLQotU291cmNlTWVudV9sYWJlbD1Tb3VyY2UKLQotU3ludGF4Q29sb3JpbmdQYWdlXzA9U3ludGF4IEVsZW1lbnQ6Ci1TeW50YXhDb2xvcmluZ1BhZ2VfMj1FbmFibGUKLVN5bnRheENvbG9yaW5nUGFnZV8zPSZCb2xkCi1TeW50YXhDb2xvcmluZ1BhZ2VfND0mSXRhbGljCi1TeW50YXhDb2xvcmluZ1BhZ2VfNT0mU3RyaWtldGhyb3VnaAotU3ludGF4Q29sb3JpbmdQYWdlXzY9JlVuZGVybGluZQotCi1fVUlfU1RSVUNUVVJFRF9URVhUX0VESVRPUl9QUkVGU19MSU5LPURURCBwcmVmZXJlbmNlcy4gIE5vdGUgdGhhdCBzb21lIHByZWZlcmVuY2VzIG1heSBiZSBzZXQgb24gdGhlIDxhPnswfTwvYT4gcHJlZmVyZW5jZSBwYWdlLgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMjRlZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYKLSAqIGRlc2lyZWQsIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzCi0gKiBwbHVnaW4uIE90aGVyIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKQotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9kbmQvRFRERHJhZ0FuZERyb3BNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RURERyYWdBbmREcm9wTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTUwNTBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9kbmQvRFRERHJhZ0FuZERyb3BNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5EcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQuRHJhZ0FuZERyb3BNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuVG9wTGV2ZWxOb2RlOwotCi1wdWJsaWMgY2xhc3MgRFRERHJhZ0FuZERyb3BNYW5hZ2VyIGltcGxlbWVudHMgRHJhZ0FuZERyb3BNYW5hZ2VyIHsKLQotCXB1YmxpYyBEcmFnQW5kRHJvcENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3QgdGFyZ2V0LCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gc291cmNlKSB7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBEVEROb2RlKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgdGFyZ2V0OwotCi0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFRvcExldmVsTm9kZSkgewotCQkJCXJldHVybiBuZXcgRHJhZ1RvcExldmVsTm9kZXNDb21tYW5kKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlKTsKLQkJCX0KLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQXR0cmlidXRlKSB7Ci0JCQkJcmV0dXJuIG5ldyBEcmFnQXR0cmlidXRlQ29tbWFuZCh0YXJnZXQsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZSk7Ci0JCQl9Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENNTm9kZSkgewotCQkJCXJldHVybiBuZXcgRHJhZ0NvbnRlbnRNb2RlbENvbW1hbmQodGFyZ2V0LCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBzb3VyY2UpOwotCQkJfQotCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdBdHRyaWJ1dGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdBdHRyaWJ1dGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NTExYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2RuZC9EcmFnQXR0cmlidXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQuRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlNZXNzYWdlczsKLQotCi0KLXB1YmxpYyBjbGFzcyBEcmFnQXR0cmlidXRlQ29tbWFuZCBleHRlbmRzIERlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQgewotCi0JcHVibGljIERyYWdBdHRyaWJ1dGVDb21tYW5kKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2VzKSB7Ci0JCXN1cGVyKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJSXRlcmF0b3IgaXRlciA9IHNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgc291cmNlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIShzb3VyY2UgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCURURE5vZGUgcmVmZXJlbmNlTm9kZSA9IChEVEROb2RlKSB0YXJnZXQ7Ci0JCURUREZpbGUgZHRkRmlsZSA9IHJlZmVyZW5jZU5vZGUuZ2V0RFRERmlsZSgpOwotCQlpZiAocmVmZXJlbmNlTm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJZHRkRmlsZS5nZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIERURFVJTWVzc2FnZXMuX1VJX01PVkVfQVRUUklCVVRFKTsgLy8kTk9OLU5MUy0xJAotCQkJQXR0cmlidXRlTGlzdCBhdHRMaXN0ID0gKEF0dHJpYnV0ZUxpc3QpIHJlZmVyZW5jZU5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJSXRlcmF0b3IgaXRlciA9IHNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJCQlhdHRMaXN0Lmluc2VydEludG9Nb2RlbCh0aGlzLCAoQXR0cmlidXRlKSByZWZlcmVuY2VOb2RlLCAoQXR0cmlidXRlKSBub2RlLCBpc0FmdGVyKCkpOwotCQkJCQlkdGRGaWxlLmRlbGV0ZU5vZGUodGhpcywgbm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJZHRkRmlsZS5nZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9kbmQvRHJhZ0NvbnRlbnRNb2RlbENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9kbmQvRHJhZ0NvbnRlbnRNb2RlbENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjZGI4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdDb250ZW50TW9kZWxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmRuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLkRlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlNZXNzYWdlczsKLQotCi1wdWJsaWMgY2xhc3MgRHJhZ0NvbnRlbnRNb2RlbENvbW1hbmQgZXh0ZW5kcyBEZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kIHsKLQotCXB1YmxpYyBEcmFnQ29udGVudE1vZGVsQ29tbWFuZChPYmplY3QgdGFyZ2V0LCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gc291cmNlcykgewotCQlzdXBlcih0YXJnZXQsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCWlmICghKHRhcmdldCBpbnN0YW5jZW9mIENNTm9kZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCEoc291cmNlIGluc3RhbmNlb2YgQ01Ob2RlKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlEVEROb2RlIHJlZmVyZW5jZU5vZGUgPSAoRFRETm9kZSkgdGFyZ2V0OwotCi0JCWlmIChyZWZlcmVuY2VOb2RlIGluc3RhbmNlb2YgQ01Ob2RlKSB7Ci0JCQlEVERGaWxlIGR0ZEZpbGUgPSByZWZlcmVuY2VOb2RlLmdldERUREZpbGUoKTsKLQotCQkJRFRETm9kZSBwYXJlbnQgPSAoRFRETm9kZSkgcmVmZXJlbmNlTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlkdGRGaWxlLmdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgRFREVUlNZXNzYWdlcy5fVUlfTU9WRV9DT05URU5UKTsgLy8kTk9OLU5MUy0xJAotCQkJYm9vbGVhbiBwYXJlbnRJc0VsZW1lbnQgPSBmYWxzZTsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCQlDTUdyb3VwTm9kZSBncm91cCA9IG51bGw7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCXBhcmVudElzRWxlbWVudCA9IHRydWU7Ci0JCQkJZWxlbWVudCA9IChFbGVtZW50KSBwYXJlbnQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlncm91cCA9IChDTUdyb3VwTm9kZSkgcGFyZW50OwotCQkJfQotCi0JCQlpZiAoZWxlbWVudCA9PSBudWxsICYmIGdyb3VwID09IG51bGwpIHsKLQkJCQkvLyBubyBwYXJlbnQgdG8gYWRkIHRvCi0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlJdGVyYXRvciBpdGVyID0gc291cmNlcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ01Ob2RlKSB7Ci0JCQkJCWlmIChwYXJlbnRJc0VsZW1lbnQpIHsKLQkJCQkJCWlmIChlbGVtZW50LmdldENvbnRlbnRNb2RlbCgpID09IG5vZGUpIHsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCWVsZW1lbnQucmVwbGFjZUNvbnRlbnRNb2RlbCh0aGlzLCAoQ01Ob2RlKSBub2RlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChyZWZlcmVuY2VOb2RlID09IG5vZGUgfHwgKGlzQWZ0ZXIoKSAmJiByZWZlcmVuY2VOb2RlLmdldE5leHRTaWJsaW5nKCkgPT0gbm9kZSkgfHwgKCFpc0FmdGVyKCkgJiYgbm9kZS5nZXROZXh0U2libGluZygpID09IHJlZmVyZW5jZU5vZGUpKSB7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0KLQkJCQkJCWdyb3VwLmluc2VydEludG9Nb2RlbCh0aGlzLCAoQ01Ob2RlKSByZWZlcmVuY2VOb2RlLCAoQ01Ob2RlKSBub2RlLCBpc0FmdGVyKCkpOwotCi0JCQkJCX0KLQkJCQkJRFRETm9kZSBub2RlUGFyZW50ID0gKERURE5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQlub2RlUGFyZW50LmRlbGV0ZSh0aGlzLCBub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlkdGRGaWxlLmdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBnZXRGZWVkYmFjaygpIHsKLQkJRFRETm9kZSByZWZlcmVuY2VOb2RlID0gKERURE5vZGUpIHRhcmdldDsKLQkJaWYgKHJlZmVyZW5jZU5vZGUgaW5zdGFuY2VvZiBDTU5vZGUpIHsKLQkJCUNNTm9kZSBjbU5vZGUgPSAoQ01Ob2RlKSByZWZlcmVuY2VOb2RlOwotCQkJaWYgKGNtTm9kZS5pc1Jvb3RFbGVtZW50Q29udGVudCgpICYmIGNtTm9kZSBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQkJcmV0dXJuIERORC5GRUVEQkFDS19TRUxFQ1Q7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0RmVlZGJhY2soKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdUb3BMZXZlbE5vZGVzQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2RuZC9EcmFnVG9wTGV2ZWxOb2Rlc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliODcyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdUb3BMZXZlbE5vZGVzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmRuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLkRlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLlRvcExldmVsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBEcmFnVG9wTGV2ZWxOb2Rlc0NvbW1hbmQgZXh0ZW5kcyBEZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kIHsKLQotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBtb3ZlTm9kZSA9IERURFVJTWVzc2FnZXMuX1VJX01PVkVfTk9ERTsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBtb3ZlTm9kZXMgPSBEVERVSU1lc3NhZ2VzLl9VSV9NT1ZFX05PREVTOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgRHJhZ1RvcExldmVsTm9kZXNDb21tYW5kKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2VzKSB7Ci0JCXN1cGVyKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgVG9wTGV2ZWxOb2RlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSXRlcmF0b3IgaXRlciA9IHNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgc291cmNlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIShzb3VyY2UgaW5zdGFuY2VvZiBUb3BMZXZlbE5vZGUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCURURE5vZGUgcmVmZXJlbmNlTm9kZSA9IChEVEROb2RlKSB0YXJnZXQ7Ci0KLQkJRFRERmlsZSBkdGRGaWxlID0gcmVmZXJlbmNlTm9kZS5nZXREVERGaWxlKCk7Ci0JCWR0ZEZpbGUuZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBzb3VyY2VzLnNpemUoKSA+IDEgPyBtb3ZlTm9kZXMgOiBtb3ZlTm9kZSk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBUb3BMZXZlbE5vZGUpIHsKLQkJCQlkdGRGaWxlLm1vdmVOb2RlKHRoaXMsIHJlZmVyZW5jZU5vZGUsIG5vZGUsIGlzQWZ0ZXIoKSk7Ci0JCQl9Ci0JCX0KLQkJZHRkRmlsZS5nZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0FjdGlvbkNvbnRyaWJ1dG9yRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0FjdGlvbkNvbnRyaWJ1dG9yRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MjQ5MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9BY3Rpb25Db250cmlidXRvckRURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLkFjdGlvbkNvbnRyaWJ1dG9yOwotCi0vKioKLSAqIFhNTEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yCi0gKiAKLSAqIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSB1c2VkIGluc2lkZSBtdWx0aSBwYWdlIGVkaXRvcidzCi0gKiBBY3Rpb25CYXJDb250cmlidXRvciwgc2luY2UgY2FzY2FkZWQgaW5pdCgpIGNhbGwgZnJvbSB0aGUKLSAqIEFjdGlvbkJhckNvbnRyaWJ1dG9yIHdpbGwgY2F1c2VzIGV4Y2VwdGlvbiBhbmQgaXQgbGVhZHMgdG8gbG9zZSB3aG9sZQotICogdG9vbGJhcnMuCi0gKiAKLSAqIEluc3RlYWQsIHVzZSBTb3VyY2VQYWdlQWN0aW9uQ29udHJpYnV0b3IgZm9yIHNvdXJjZSBwYWdlIGNvbnRyaWJ1dG9yIG9mCi0gKiBtdWx0aSBwYWdlIGVkaXRvci4KLSAqIAotICogTm90ZSB0aGF0IHRoaXMgY2xhc3MgaXMgc3RpbGwgdmFsaWQgZm9yIHNpbmdsZSBwYWdlIGVkaXRvci4KLSAqLwotcHVibGljIGNsYXNzIEFjdGlvbkNvbnRyaWJ1dG9yRFREIGV4dGVuZHMgQWN0aW9uQ29udHJpYnV0b3IgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRURJVE9SX0lEUyA9IHsib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0LnV0aWwuQWN0aW9uQ29udHJpYnV0b3IjZ2V0RXh0ZW5zaW9uSURzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RXh0ZW5zaW9uSURzKCkgewotCQlyZXR1cm4gRURJVE9SX0lEUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJLy8gZWRpdCBjb21tYW5kcwotCQlJTWVudU1hbmFnZXIgZWRpdE1lbnUgPSBtZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElUKTsKLQkJaWYgKGVkaXRNZW51ICE9IG51bGwpIHsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZUb2dnbGVJbnNlcnRNb2RlQWN0aW9uKTsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZFeHBhbmRTZWxlY3Rpb25Ub01lbnUpOwotCQkJZWRpdE1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQllZGl0TWVudS5hZGQoZk1lbnVBZGRpdGlvbnNHcm91cE1hcmtlcik7Ci0JCX0KLQotCQkvLyBzb3VyY2UgY29tbWFuZHMKLQkJU3RyaW5nIHNvdXJjZU1lbnVMYWJlbCA9IERURFVJTWVzc2FnZXMuU291cmNlTWVudV9sYWJlbDsKLQkJU3RyaW5nIHNvdXJjZU1lbnVJZCA9ICJzb3VyY2VNZW51SWQiOyAvLyROT04tTkxTLTEkCi0JCUlNZW51TWFuYWdlciBzb3VyY2VNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKHNvdXJjZU1lbnVMYWJlbCwgc291cmNlTWVudUlkKTsKLQkJbWVudS5pbnNlcnRBZnRlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCwgc291cmNlTWVudSk7Ci0JCWlmIChzb3VyY2VNZW51ICE9IG51bGwpIHsKLQkJCXNvdXJjZU1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQlzb3VyY2VNZW51LmFkZChmU2hpZnRSaWdodCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmU2hpZnRMZWZ0KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCX0KLQkJSU1lbnVNYW5hZ2VyIG5hdmlnYXRlTWVudSA9IG1lbnUuZmluZE1lbnVVc2luZ1BhdGgoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX05BVklHQVRFKTsKLQkJaWYgKG5hdmlnYXRlTWVudSAhPSBudWxsKSB7Ci0JCQlJTWVudU1hbmFnZXIgZ290b0dyb3VwID0gbmF2aWdhdGVNZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuR09fVE8pOwotCQkJaWYgKGdvdG9Hcm91cCAhPSBudWxsKSB7Ci0JCQkJZ290b0dyb3VwLmFkZChmR290b01hdGNoaW5nQnJhY2tldEFjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0RUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0RUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZDk0OWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9EVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIGltYWdlcyBwcm92aWRlZCBieSB0aGlzIHBsdWctaW4uCi0gKiAKLSAqIE5PVEU6IEZvciBpbnRlcm5hbCB1c2Ugb25seS4gRm9yIGltYWdlcyB1c2VkIGV4dGVybmFsbHksIHBsZWFzZSB1c2UgdGhlCi0gKiBTaGFyZWQqKipJbWFnZUhlbHBlciBjbGFzcyBpbnN0ZWFkLgotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLXB1YmxpYyBjbGFzcyBEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLy8gc2F2ZSBhIGRlc2NyaXB0b3IgZm9yIGVhY2ggaW1hZ2UKLQlwcml2YXRlIEhhc2hNYXAgZkltYWdlRGVzY1JlZ2lzdHJ5ID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQTFVHSU5JRCA9IERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIGFkZHMgdGhlIGltYWdlIHRvIHRoZQotCSAqIGltYWdlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gSW1hZ2UKLQkgKi8KLQlwcml2YXRlIEltYWdlIGNyZWF0ZUltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IGdldEltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQotCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJCS8vIGRvbnQgYWRkIHRoZSBtaXNzaW5nIGltYWdlIGRlc2NyaXB0b3IgaW1hZ2UgdG8gdGhlIGltYWdlCi0JCQkvLyByZWdpc3RyeQotCQkJaWYgKCFkZXNjLmVxdWFscyhJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKSkKLQkJCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHJlc291cmNlLCBpbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmcm9tIHRoZSBnaXZlbiBpbWFnZUZpbGVQYXRoIGFuZCBhZGRzIHRoZQotCSAqIGltYWdlIGRlc2NyaXB0b3IgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIGFuIGltYWdlCi0JICogZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgY3JlYXRlZCwgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IKLQkgKiBpcyByZXR1cm5lZCBidXQgbm90IGFkZGVkIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVQYXRoCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgaW1hZ2UgZGVzY3JpcHRvciBmb3IgaW1hZ2VGaWxlUGF0aCBvciBkZWZhdWx0Ci0JICogICAgICAgICAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGltYWdlRmlsZVBhdGgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5JRCwgaW1hZ2VGaWxlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5wdXQoaW1hZ2VGaWxlUGF0aCwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqIElmIHRoZSBpbWFnZSBjYW5ub3QgYmUgcmV0cmlldmVkLCBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGF0Ci0JICogdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2UgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBvciBudWxsIGlmIG9uZSBjb3VsZAotCSAqICAgICAgICAgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGFuIGltYWdlCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZQotCSAqIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGNhbm5vdCBiZSByZXRyaWV2ZWQsCi0JICogYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQKLQkgKiBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NhdGVkIHdpdGggcmVzb3VyY2Ugb3IKLQkgKiAgICAgICAgIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIG9uZSBjb3VsZCBub3QgYmUKLQkgKiAgICAgICAgIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlPYmplY3QgbyA9IGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGEgZGVzY3JpcHRvcgotCQkJaW1hZ2VEZXNjcmlwdG9yID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IChJbWFnZURlc2NyaXB0b3IpIG87Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEhhc2hNYXAgLSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJaWYgKGZJbWFnZURlc2NSZWdpc3RyeSA9PSBudWxsKQotCQkJZkltYWdlRGVzY1JlZ2lzdHJ5ID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGZJbWFnZURlc2NSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiBJbWFnZVJlZ2lzdHJ5IC0gaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSBJbWFnZVJlZ2lzdHJ5IGdldEltYWdlUmVnaXN0cnkoKSB7Ci0JCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9EVERFZGl0b3JQbHVnaW5JbWFnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9lZGl0b3IvRFRERWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMmJlZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9EVERFZGl0b3JQbHVnaW5JbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLS8qKgotICogQnVuZGxlIG9mIG1vc3QgaW1hZ2VzIHVzZWQgYnkgdGhlIERURCBTb3VyY2UgRWRpdG9yIHBsdWctaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERFZGl0b3JQbHVnaW5JbWFnZXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DVE9PTF9BRERfQVRUUklCVVRFID0gImljb25zL2Z1bGwvY3Rvb2wxNi9BRERfQXR0cmlidXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DVE9PTF9BRERfRUxFTUVOVCA9ICJpY29ucy9mdWxsL2N0b29sMTYvQUREX0VsZW1lbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NUT09MX0FERF9FTEVNRU5UVE9DT05NT0RFTCA9ICJpY29ucy9mdWxsL2N0b29sMTYvQUREX0VsZW1lbnRUb0Nvbk1vZGVsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DVE9PTF9BRERfR1JPVVBUT0NPTk1PREVMID0gImljb25zL2Z1bGwvY3Rvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfQUREX0FUVFJJQlVURSA9ICJpY29ucy9mdWxsL2R0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX0FERF9FTEVNRU5UID0gImljb25zL2Z1bGwvZHRvb2wxNi9BRERfRWxlbWVudC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX0FERF9FTEVNRU5UVE9DT05NT0RFTCA9ICJpY29ucy9mdWxsL2R0b29sMTYvQUREX0VsZW1lbnRUb0Nvbk1vZGVsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfQUREX0dST1VQVE9DT05NT0RFTCA9ICJpY29ucy9mdWxsL2R0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0FERF9BVFRSSUJVVEUgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9BdHRyaWJ1dGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9BRERfRUxFTUVOVCA9ICJpY29ucy9mdWxsL2V0b29sMTYvQUREX0VsZW1lbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9BRERfRUxFTUVOVFRPQ09OTU9ERUwgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0FERF9HUk9VUFRPQ09OTU9ERUwgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9Hcm91cFRvQ29uTW9kZWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9BRERfQ09NTUVOVCA9ICJpY29ucy9mdWxsL29iajE2L0FERF9Db21tZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0FERF9FTlRJVFkgPSAiaWNvbnMvZnVsbC9vYmoxNi9BRERfRW50aXR5LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0FERF9FTlRJVFlfUkVGRVJFTkNFID0gImljb25zL2Z1bGwvb2JqMTYvQUREX0VudGl0eV9SZWZlcmVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQUREX05PVEFUSU9OID0gImljb25zL2Z1bGwvb2JqMTYvQUREX05vdGF0aW9uLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX09SR0FOSVpFX0RURF9MT0dJQ0FMTFkgPSAiaWNvbnMvZnVsbC9vYmoxNi9vcmdhbml6ZV9kdGRfbG9naWNhbGx5LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1NPUlQgPSAiaWNvbnMvZnVsbC9vYmoxNi9zb3J0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1ZBTElEQVRFID0gImljb25zL2Z1bGwvb2JqMTYvdmFsaWRhdGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19XSVpCQU5fTkVXRFRERklMRSA9ICJpY29ucy9mdWxsL3dpemJhbi9uZXdkdGRmaWxlX3dpei5wbmciOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBjZTIxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLQotLyoqCi0gKiBIZWxwIGNvbnRleHQgaWRzIGZvciB0aGUgRFREIFNvdXJjZSBFZGl0b3IuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUKLSAqIGltcGxlbWVudGVkLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUhlbHBDb250ZXh0SWRzIHsKLQotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpICsgIi4iOyAvLyROT04tTkxTLTEkCi0JLy8gRFREIEZpbGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9QUkVGV0VCWF9GSUxFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMjAiOyAvLyROT04tTkxTLTEkCi0JLy8gRFREIFN0eWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAyMSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBEVEQgVGVtcGxhdGUgUHJlZmVyZW5jZSBwYWdlIChubyBpZCBmb3IgdGhpcyB5ZXQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMjIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyAvLyBmaWd1cmVkIG91dCBvbiB0aGUgZmx5Ci0JLy8gLy8gRFREIFNvdXJjZSBwYWdlIGVkaXRvcgotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9TT1VSQ0VWSUVXX0hFTFBJRCA9Ci0JLy8gQ29udGVudFR5cGVJZEZvckRURC5Db250ZW50VHlwZUlEX0RURCArICJfc291cmNlX0hlbHBJZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIERURCBOZXcgRmlsZSBXaXphcmQgLSBUZW1wbGF0ZSBQYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX05FV1dJWkFSRF9URU1QTEFURV9IRUxQSUQgPSBQUkVGSVggKyAiZHRkdzAwMTAiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29sb3JQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29sb3JQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMTg1NWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURENvbG9yUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzRFREOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0Q29sb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU3R5bGVkVGV4dENvbG9yUGlja2VyOwotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERDb2xvclBhZ2UgZXh0ZW5kcyBBYnN0cmFjdENvbG9yUGFnZSB7Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYWdlQ29tcG9uZW50ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCSgoR3JpZERhdGEpIHBhZ2VDb21wb25lbnQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOwotCi0JCXN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhZ2VDb21wb25lbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhZ2VDb21wb25lbnQsIElIZWxwQ29udGV4dElkcy5EVERfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCk7Ci0KLQkJcmV0dXJuIHBhZ2VDb21wb25lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHVwIGFsbCB0aGUgc3R5bGUgcHJlZmVyZW5jZSBrZXlzIGluIHRoZSBvdmVybGF5IHN0b3JlCi0JICovCi0JcHJvdGVjdGVkIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlBcnJheUxpc3Qgb3ZlcmxheUtleXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJQXJyYXlMaXN0IHN0eWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW5pdFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCQlJdGVyYXRvciBpID0gc3R5bGVMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5TVFJJTkcsIChTdHJpbmcpIGkubmV4dCgpKSk7Ci0JCX0KLQotCQlPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbXSBrZXlzID0gbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtvdmVybGF5S2V5cy5zaXplKCldOwotCQlvdmVybGF5S2V5cy50b0FycmF5KGtleXMpOwotCQlyZXR1cm4ga2V5czsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNhbXBsZVRleHQoKSB7Ci0JCXJldHVybiBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV8wOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRleHRTdHlsZU1hcChEaWN0aW9uYXJ5IGNvbnRleHRTdHlsZU1hcCkgewotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTlRFTlRfRU1QVFksIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9BTlksIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9QQ0RBVEEsIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTkRBVEFfVkFMVUUsIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTkFNRSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5FTlRJVFlfUEFSTSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcsIElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcsIElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09OTkVDVE9SLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuU1RBUlRfVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRyk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRU5EX1RBRywgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRyk7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJULCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTU1FTlRfQ09OVEVOVCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5UKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5DT01NRU5UX0VORCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5UKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORyk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwsIElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlNZU1RFTV9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlBVQkxJQ19LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk5EQVRBX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ0RBVEFfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5JRF9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLklEUkVGX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuSURSRUZTX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRU5USVRZX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRU5USVRJRVNfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5OTVRPS0VOX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTk1UT0tFTlNfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5OT1RBVElPTl9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlJFUVVJUkVEX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuSU1QTElFRF9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkZJWEVEX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERlc2NyaXB0aW9ucyhEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucykgewotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVCwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfMSk7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzIpOyAvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxULCBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV8zKTsgLy8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfNCk7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORywgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfNSk7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfNik7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRywgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfNyk7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFN0eWxlTGlzdChBcnJheUxpc3QgbGlzdCkgewotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RFRkFVTFQpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORyk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0RURC5EVERfU1lNQk9MKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldHVwUGlja2VyKFN0eWxlZFRleHRDb2xvclBpY2tlciBwaWNrZXIpIHsKLQkJSU1vZGVsTWFuYWdlciBtbWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCXBpY2tlci5zZXRQYXJzZXIobW1hbmFnZXIuY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKENvbnRlbnRUeXBlSWRGb3JEVEQuQ29udGVudFR5cGVJRF9EVEQpLmdldFBhcnNlcigpKTsKLQotCQlEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucyA9IG5ldyBIYXNodGFibGUoKTsKLQkJaW5pdERlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCi0JCURpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpbml0Q29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0KLQkJQXJyYXlMaXN0IHN0eWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW5pdFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCi0JCXBpY2tlci5zZXRDb250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQkJcGlja2VyLnNldERlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCQlwaWNrZXIuc2V0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0Q29sb3JQYWdlI3NhdmVQcmVmZXJlbmNlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgewotCQlEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RUREZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZmYxNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RUREZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuR3JpZERhdGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VMaW5rQXJlYTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBEVERGaWxlc1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSB7Ci0JcHJpdmF0ZSBDb21ibyBmRGVmYXVsdFN1ZmZpeCA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZWYWxpZEV4dGVuc2lvbnMgPSBudWxsOwotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuRFREX1BSRUZXRUJYX0ZJTEVTX0hFTFBJRCk7Ci0KLQkJbmV3IFByZWZlcmVuY2VMaW5rQXJlYShjb21wb3NpdGUsIFNXVC5XUkFQIHwgU1dULk1VTFRJLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5lZGl0b3IiLCBEVERVSU1lc3NhZ2VzLl9VSV9TVFJVQ1RVUkVEX1RFWFRfRURJVE9SX1BSRUZTX0xJTkssLy8kTk9OLU5MUy0xJAotCQkJCQkoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpIGdldENvbnRhaW5lcigpLCBudWxsKS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuaGludCgxNTAsIFNXVC5ERUZBVUxUKS5jcmVhdGUoKSk7Ci0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5zd3REZWZhdWx0cygpLmNyZWF0ZSgpKTsKLQotCi0JCUdyb3VwIGNyZWF0aW5nR3JvdXAgPSBjcmVhdGVHcm91cChjb21wb3NpdGUsIDIpOwotCQljcmVhdGluZ0dyb3VwLnNldFRleHQoRFREVUlNZXNzYWdlcy5DcmVhdGluZ19maWxlcyk7Ci0KLQkJLy8gRGVmYXVsdCBleHRlbnNpb24gZm9yIE5ldyBmaWxlIFdpemFyZAotCQljcmVhdGVMYWJlbChjcmVhdGluZ0dyb3VwLCBEVERVSU1lc3NhZ2VzLkRUREZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uTGFiZWwpOwotCQlmRGVmYXVsdFN1ZmZpeCA9IGNyZWF0ZURyb3BEb3duQm94KGNyZWF0aW5nR3JvdXApOwotCQlTdHJpbmdbXSB2YWxpZEV4dGVuc2lvbnMgPSAoU3RyaW5nW10pIGdldFZhbGlkRXh0ZW5zaW9ucygpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCUFycmF5cy5zb3J0KHZhbGlkRXh0ZW5zaW9ucyk7Ci0JCWZEZWZhdWx0U3VmZml4LnNldEl0ZW1zKHZhbGlkRXh0ZW5zaW9ucyk7Ci0JCWZEZWZhdWx0U3VmZml4LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCXNldFNpemUoY29tcG9zaXRlKTsKLQkJbG9hZFByZWZlcmVuY2VzKCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmRGVmYXVsdFN1ZmZpeC5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpIHsKLQkJRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOyAvLyBtb2RlbAotCX0KLQotCS8qKgotCSAqIEdldCBjb250ZW50IHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmV3IGZpbGUgd2l6YXJkCi0JICogCi0JICogQHJldHVybiBJQ29udGVudFR5cGUKLQkgKi8KLQlwcml2YXRlIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JEVEQuQ29udGVudFR5cGVJRF9EVEQpOwotCX0KLQotCS8qKgotCSAqIEdldCBsaXN0IG9mIHZhbGlkIGV4dGVuc2lvbnMKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0VmFsaWRFeHRlbnNpb25zKCkgewotCQlpZiAoZlZhbGlkRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCQlmVmFsaWRFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RmlsZVNwZWNzKElDb250ZW50VHlwZS5GSUxFX0VYVEVOU0lPTl9TUEVDKSkpOwotCQl9Ci0JCXJldHVybiBmVmFsaWRFeHRlbnNpb25zOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlI2dldE1vZGVsUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJU3RyaW5nIHN1ZmZpeCA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoRFREQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTik7Ci0JCWZEZWZhdWx0U3VmZml4LnNldFRleHQoc3VmZml4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCVN0cmluZyBzdWZmaXggPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdFN0cmluZyhEVERDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQkJZkRlZmF1bHRTdWZmaXguc2V0VGV4dChzdWZmaXgpOwotCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtT2soKTsKLQotCQlkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlTdHJpbmcgc3VmZml4ID0gZkRlZmF1bHRTdWZmaXguZ2V0VGV4dCgpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoRFREQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTiwgc3VmZml4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVZhbHVlcygpIHsKLQkJYm9vbGVhbiBpc1ZhbGlkID0gZmFsc2U7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRWYWxpZEV4dGVuc2lvbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkgJiYgIWlzVmFsaWQpIHsKLQkJCVN0cmluZyBleHRlbnNpb24gPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCWlzVmFsaWQgPSBleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZShmRGVmYXVsdFN1ZmZpeC5nZXRUZXh0KCkpOwotCQl9Ci0KLQkJaWYgKCFpc1ZhbGlkKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoRFREVUlNZXNzYWdlcy5EVERGaWxlc1ByZWZlcmVuY2VQYWdlX0V4dGVuc2lvbkVycm9yLCBnZXRWYWxpZEV4dGVuc2lvbnMoKS50b1N0cmluZygpKSk7Ci0JCQlzZXRWYWxpZChmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlzZXRWYWxpZCh0cnVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERTeW50YXhDb2xvcmluZ1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERTeW50YXhDb2xvcmluZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY3NWNiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREU3ludGF4Q29sb3JpbmdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuQ29sb3JTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzRFREOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkVkaXRvclV0aWxpdHk7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIEEgcHJlZmVyZW5jZSBwYWdlIHRvIGNvbmZpZ3VyZSBvdXIgWE1MIHN5bnRheCBjb2xvci4gSXQgcmVzZW1ibGVzIHRoZSBKRFQKLSAqIGFuZCBDRFQgcGFnZXMgZmFyIG1vcmUgdGhhbiBvdXIgb3JpZ2luYWwgY29sb3IgcGFnZSB3aGlsZSByZXRhaW5pbmcgdGhlCi0gKiBleHRyYSAiY2xpY2stdG8tZmluZCIgZnVuY3Rpb25hbGl0eS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERURFN5bnRheENvbG9yaW5nUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgQnV0dG9uIGZCb2xkOwotCXByaXZhdGUgTGFiZWwgZkZvcmVncm91bmRMYWJlbDsKLQlwcml2YXRlIExhYmVsIGZCYWNrZ3JvdW5kTGFiZWw7Ci0JcHJpdmF0ZSBCdXR0b24gZkNsZWFyU3R5bGU7Ci0JcHJpdmF0ZSBNYXAgZkNvbnRleHRUb1N0eWxlTWFwOwotCXByaXZhdGUgQ29sb3IgZkRlZmF1bHRGb3JlZ3JvdW5kID0gbnVsbDsKLQlwcml2YXRlIENvbG9yIGZEZWZhdWx0QmFja2dyb3VuZCA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIENvbG9yU2VsZWN0b3IgZkZvcmVncm91bmRDb2xvckVkaXRvcjsKLQlwcml2YXRlIENvbG9yU2VsZWN0b3IgZkJhY2tncm91bmRDb2xvckVkaXRvcjsKLQlwcml2YXRlIEJ1dHRvbiBmSXRhbGljOwotCXByaXZhdGUgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBmT3ZlcmxheVN0b3JlOwotCXByaXZhdGUgQnV0dG9uIGZTdHJpa2U7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGZTdHlsZVByZWZlcmVuY2VLZXlzOwotCXByaXZhdGUgU3RydWN0dXJlZFZpZXdlciBmU3R5bGVzVmlld2VyID0gbnVsbDsKLQlwcml2YXRlIE1hcCBmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwOwotCXByaXZhdGUgU3R5bGVkVGV4dCBmVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiBmVW5kZXJsaW5lOwotCi0JLy8gYWN0aXZhdGUgY29udHJvbHMgYmFzZWQgb24gdGhlIGdpdmVuIGxvY2FsIGNvbG9yIHR5cGUKLQlwcml2YXRlIHZvaWQgYWN0aXZhdGUoU3RyaW5nIG5hbWVkU3R5bGUpIHsKLQkJQ29sb3IgZm9yZWdyb3VuZCA9IGZEZWZhdWx0Rm9yZWdyb3VuZDsKLQkJQ29sb3IgYmFja2dyb3VuZCA9IGZEZWZhdWx0QmFja2dyb3VuZDsKLQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkgewotCQkJZkNsZWFyU3R5bGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQm9sZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZJdGFsaWMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmU3RyaWtlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZlVuZGVybGluZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZGb3JlZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQm9sZC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJZkl0YWxpYy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJZlN0cmlrZS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJZlVuZGVybGluZS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGVGb3IobmFtZWRTdHlsZSk7Ci0JCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKHRydWUpOwotCQkJZkJvbGQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZJdGFsaWMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZTdHJpa2Uuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZVbmRlcmxpbmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZGb3JlZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCYWNrZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCb2xkLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7Ci0JCQlmSXRhbGljLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsKLQkJCWZTdHJpa2Uuc2V0U2VsZWN0aW9uKChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuU1RSSUtFVEhST1VHSCkgIT0gMCk7Ci0JCQlmVW5kZXJsaW5lLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlVOREVSTElORSkgIT0gMCk7Ci0JCQlpZiAoYXR0cmlidXRlLmdldEZvcmVncm91bmQoKSAhPSBudWxsKSB7Ci0JCQkJZm9yZWdyb3VuZCA9IGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCk7Ci0JCQl9Ci0JCQlpZiAoYXR0cmlidXRlLmdldEJhY2tncm91bmQoKSAhPSBudWxsKSB7Ci0JCQkJYmFja2dyb3VuZCA9IGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCk7Ci0JCQl9Ci0JCX0KLQotCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldENvbG9yVmFsdWUoZm9yZWdyb3VuZC5nZXRSR0IoKSk7Ci0JCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0Q29sb3JWYWx1ZShiYWNrZ3JvdW5kLmdldFJHQigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb2xvciB0aGUgdGV4dCBpbiB0aGUgc2FtcGxlIGFyZWEgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHByZWZlcmVuY2VzCi0JICovCi0Jdm9pZCBhcHBseVN0eWxlcygpIHsKLQkJaWYgKGZUZXh0ID09IG51bGwgfHwgZlRleHQuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gZkRvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCXdoaWxlIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkvLyBsb29rdXAgdGhlIGxvY2FsIGNvbG9yaW5nIHR5cGUgYW5kIGFwcGx5IGl0Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoU3RyaW5nKSBmQ29udGV4dFRvU3R5bGVNYXAuZ2V0KGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpKTsKLQkJCQlpZiAobmFtZWRTdHlsZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlUZXh0QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGdldEF0dHJpYnV0ZUZvcihuYW1lZFN0eWxlKTsKLQkJCQlpZiAoYXR0cmlidXRlID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCVN0eWxlUmFuZ2Ugc3R5bGUgPSBuZXcgU3R5bGVSYW5nZShkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChjdXJyZW50UmVnaW9uKSwgY3VycmVudFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCksIGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCksIGF0dHJpYnV0ZS5nZXRTdHlsZSgpKTsKLQkJCQlzdHlsZS5zdHJpa2VvdXQgPSAoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0gpICE9IDA7Ci0JCQkJc3R5bGUudW5kZXJsaW5lID0gKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkUpICE9IDA7Ci0JCQkJZlRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JCQl9Ci0JCQlkb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uLmdldE5leHQoKTsKLQkJfQotCX0KLQotCUJ1dHRvbiBjcmVhdGVDaGVja2JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKSk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBjb21wb3NpdGUgY29udHJvbCBhbmQgc2V0cyB0aGUgZGVmYXVsdCBsYXlvdXQgZGF0YS4KLQkgKi8KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IGZhbHNlOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0KLQkJZkRlZmF1bHRGb3JlZ3JvdW5kID0gcGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKTsKLQkJZkRlZmF1bHRCYWNrZ3JvdW5kID0gcGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKTsKLQkJQ29tcG9zaXRlIHBhZ2VDb21wb25lbnQgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50LCAyKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYWdlQ29tcG9uZW50LCBJSGVscENvbnRleHRJZHMuRFREX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQpOwotCi0JCUxpbmsgbGluayA9IG5ldyBMaW5rKHBhZ2VDb21wb25lbnQsIFNXVC5XUkFQKTsKLQkJbGluay5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdfTGluayk7Ci0JCWxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihwYXJlbnQuZ2V0U2hlbGwoKSwgZS50ZXh0LCBudWxsLCBudWxsKTsKLQkJCX0KLQkJfSk7Ci0KLQkJR3JpZERhdGEgbGlua0RhdGE9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlsaW5rRGF0YS53aWR0aEhpbnQ9IDE1MDsgLy8gb25seSBleHBhbmQgZnVydGhlciBpZiBhbnlvbmUgZWxzZSByZXF1aXJlcyBpdAotCQlsaW5rLnNldExheW91dERhdGEobGlua0RhdGEpOwotCi0JCW5ldyBMYWJlbChwYWdlQ29tcG9uZW50LCBTV1QuTk9ORSkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCW5ldyBMYWJlbChwYWdlQ29tcG9uZW50LCBTV1QuTk9ORSkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0KLQkJU2FzaEZvcm0gZWRpdG9yID0gbmV3IFNhc2hGb3JtKHBhZ2VDb21wb25lbnQsIFNXVC5WRVJUSUNBTCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhMiA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YTIuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQllZGl0b3Iuc2V0TGF5b3V0RGF0YShncmlkRGF0YTIpOwotCQlTYXNoRm9ybSB0b3AgPSBuZXcgU2FzaEZvcm0oZWRpdG9yLCBTV1QuSE9SSVpPTlRBTCk7Ci0JCUNvbXBvc2l0ZSBzdHlsZUVkaXRvciA9IGNyZWF0ZUNvbXBvc2l0ZSh0b3AsIDEpOwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5SaWdodCA9IDU7Ci0JCSgoR3JpZExheW91dCkgc3R5bGVFZGl0b3IuZ2V0TGF5b3V0KCkpLm1hcmdpbkxlZnQgPSAwOwotCQljcmVhdGVMYWJlbChzdHlsZUVkaXRvciwgRFREVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfMCk7Ci0JCWZTdHlsZXNWaWV3ZXIgPSBjcmVhdGVTdHlsZXNWaWV3ZXIoc3R5bGVFZGl0b3IpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IE1hdGgubWF4KGdyaWREYXRhLndpZHRoSGludCwgY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGl0ZXJhdG9yLm5leHQoKS50b1N0cmluZygpLmxlbmd0aCgpKSk7Ci0JCX0KLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoNSk7Ci0JCWZTdHlsZXNWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCUNvbXBvc2l0ZSBlZGl0aW5nQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvcCwgMSk7Ci0JCSgoR3JpZExheW91dCkgc3R5bGVFZGl0b3IuZ2V0TGF5b3V0KCkpLm1hcmdpbkxlZnQgPSA1OwotCQljcmVhdGVMYWJlbChlZGl0aW5nQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnV0dG9uIGVuYWJsZXIgPSBjcmVhdGVDaGVja2JveChlZGl0aW5nQ29tcG9zaXRlLCBEVERVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV8yKTsKLQkJZW5hYmxlci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZW5hYmxlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCUNvbXBvc2l0ZSBlZGl0Q29udHJvbHMgPSBjcmVhdGVDb21wb3NpdGUoZWRpdGluZ0NvbXBvc2l0ZSwgMik7Ci0JCSgoR3JpZExheW91dCkgZWRpdENvbnRyb2xzLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gMjA7Ci0KLQkJZkZvcmVncm91bmRMYWJlbCA9IGNyZWF0ZUxhYmVsKGVkaXRDb250cm9scywgU1NFVUlNZXNzYWdlcy5Gb3JlZ3JvdW5kX1VJXyk7Ci0JCSgoR3JpZERhdGEpIGZGb3JlZ3JvdW5kTGFiZWwuZ2V0TGF5b3V0RGF0YSgpKS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5DRU5URVI7Ci0JCWZGb3JlZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvciA9IG5ldyBDb2xvclNlbGVjdG9yKGVkaXRDb250cm9scyk7Ci0JCUJ1dHRvbiBmRm9yZWdyb3VuZENvbG9yID0gZkZvcmVncm91bmRDb2xvckVkaXRvci5nZXRCdXR0b24oKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0JCWZGb3JlZ3JvdW5kQ29sb3Iuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJZkJhY2tncm91bmRMYWJlbCA9IGNyZWF0ZUxhYmVsKGVkaXRDb250cm9scywgU1NFVUlNZXNzYWdlcy5CYWNrZ3JvdW5kX1VJXyk7Ci0JCSgoR3JpZERhdGEpIGZCYWNrZ3JvdW5kTGFiZWwuZ2V0TGF5b3V0RGF0YSgpKS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5DRU5URVI7Ci0JCWZCYWNrZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJZkJhY2tncm91bmRDb2xvckVkaXRvciA9IG5ldyBDb2xvclNlbGVjdG9yKGVkaXRDb250cm9scyk7Ci0JCUJ1dHRvbiBmQmFja2dyb3VuZENvbG9yID0gZkJhY2tncm91bmRDb2xvckVkaXRvci5nZXRCdXR0b24oKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0JCWZCYWNrZ3JvdW5kQ29sb3Iuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJZkJvbGQgPSBjcmVhdGVDaGVja2JveChlZGl0Q29udHJvbHMsIERURFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzMpOwotCQlmQm9sZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJKChHcmlkRGF0YSkgZkJvbGQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZJdGFsaWMgPSBjcmVhdGVDaGVja2JveChlZGl0Q29udHJvbHMsIERURFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzQpOwotCQlmSXRhbGljLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBmSXRhbGljLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmU3RyaWtlID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBEVERVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV81KTsKLQkJZlN0cmlrZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJKChHcmlkRGF0YSkgZlN0cmlrZS5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlVuZGVybGluZSA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywgRFREVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfNik7Ci0JCWZVbmRlcmxpbmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZVbmRlcmxpbmUuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZDbGVhclN0eWxlID0gbmV3IEJ1dHRvbihlZGl0aW5nQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWZDbGVhclN0eWxlLnNldFRleHQoU1NFVUlNZXNzYWdlcy5SZXN0b3JlX0RlZmF1bHRfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJSZXN0b3JlIERlZmF1bHQiCi0JCWZDbGVhclN0eWxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcpKTsKLQkJKChHcmlkRGF0YSlmQ2xlYXJTdHlsZS5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxJbmRlbnQgPSAyMDsKLQkJZkNsZWFyU3R5bGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJQ29tcG9zaXRlIHNhbXBsZUFyZWEgPSBjcmVhdGVDb21wb3NpdGUoZWRpdG9yLCAxKTsKLQotCQkoKEdyaWRMYXlvdXQpIHNhbXBsZUFyZWEuZ2V0TGF5b3V0KCkpLm1hcmdpbkxlZnQgPSA1OwotCQkoKEdyaWRMYXlvdXQpIHNhbXBsZUFyZWEuZ2V0TGF5b3V0KCkpLm1hcmdpblRvcCA9IDU7Ci0JCWNyZWF0ZUxhYmVsKHNhbXBsZUFyZWEsIFNTRVVJTWVzc2FnZXMuU2FtcGxlX3RleHRfX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiJlNhbXBsZSB0ZXh0OiIKLQkJU291cmNlVmlld2VyIHZpZXdlciA9IG5ldyBTb3VyY2VWaWV3ZXIoc2FtcGxlQXJlYSwgbnVsbCwgU1dULkJPUkRFUiB8IFNXVC5MRUZUX1RPX1JJR0hUIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULlJFQURfT05MWSk7Ci0JCWZUZXh0ID0gdmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEzID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdyaWREYXRhMy53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoMjApOwotCQlncmlkRGF0YTMuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoNSk7Ci0JCWdyaWREYXRhMy5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEzKTsKLQkJZlRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQlmVGV4dC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnQoIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiKSk7Ly8kTk9OLU5MUy0xJAotCQlmVGV4dC5hZGRLZXlMaXN0ZW5lcihnZXRUZXh0S2V5TGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldFRleHRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJZlRleHQuYWRkTW91c2VMaXN0ZW5lcihnZXRUZXh0TW91c2VMaXN0ZW5lcigpKTsKLQkJZlRleHQuYWRkVHJhdmVyc2VMaXN0ZW5lcihnZXRUcmF2ZXJzZUxpc3RlbmVyKCkpOwotCQlzZXRBY2Nlc3NpYmxlKGZUZXh0LCBTU0VVSU1lc3NhZ2VzLlNhbXBsZV90ZXh0X19VSV8pOwotCQlmRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihDb250ZW50VHlwZUlkRm9yRFRELkNvbnRlbnRUeXBlSURfRFREKTsKLQkJZkRvY3VtZW50LnNldChnZXRFeGFtcGxlVGV4dCgpKTsKLQkJdmlld2VyLnNldERvY3VtZW50KGZEb2N1bWVudCk7Ci0KLQkJdG9wLnNldFdlaWdodHMobmV3IGludFtdezEsIDF9KTsKLQkJZWRpdG9yLnNldFdlaWdodHMobmV3IGludFtdezEsIDF9KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYWdlQ29tcG9uZW50LCBJSGVscENvbnRleHRJZHMuRFREX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQpOwotCi0JCWZTdHlsZXNWaWV3ZXIuc2V0SW5wdXQoZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpKTsKLQotCQlhcHBseVN0eWxlcygpOwotCi0JCWZTdHlsZXNWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIWV2ZW50LmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkgewotCQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkJCQlpZiAobmFtZWRTdHlsZSA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5hZGRMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKENvbG9yU2VsZWN0b3IuUFJPUF9DT0xPUkNIQU5HRSkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1swXTsKLQkJCQkJCS8vIG9wZW4gY29sb3IgZGlhbG9nIHRvIGdldCBuZXcgY29sb3IKLQkJCQkJCVN0cmluZyBuZXdWYWx1ZSA9IENvbG9ySGVscGVyLnRvUkdCU3RyaW5nKGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0Q29sb3JWYWx1ZSgpKTsKLQotCQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQkJc3R5bGVQcmVmc1swXSA9IG5ld1ZhbHVlOwotCQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkJhY2tncm91bmRDb2xvckVkaXRvci5hZGRMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKENvbG9yU2VsZWN0b3IuUFJPUF9DT0xPUkNIQU5HRSkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1sxXTsKLQkJCQkJCS8vIG9wZW4gY29sb3IgZGlhbG9nIHRvIGdldCBuZXcgY29sb3IKLQkJCQkJCVN0cmluZyBuZXdWYWx1ZSA9IENvbG9ySGVscGVyLnRvUkdCU3RyaW5nKGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0Q29sb3JWYWx1ZSgpKTsKLQotCQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQkJc3R5bGVQcmVmc1sxXSA9IG5ld1ZhbHVlOwotCQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkJvbGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1syXTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZkJvbGQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbMl0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkl0YWxpYy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkvLyBnZXQgY3VycmVudCAobmV3bHkgb2xkKSBzdHlsZQotCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzNdOwotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBTdHJpbmcudmFsdWVPZihmSXRhbGljLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzNdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZTdHJpa2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1s0XTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZlN0cmlrZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJc3R5bGVQcmVmc1s0XSA9IG5ld1ZhbHVlOwotCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmVW5kZXJsaW5lLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbNV07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZVbmRlcmxpbmUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbNV0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlmQ2xlYXJTdHlsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpCi0JCQkJCXJldHVybjsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpLnRvU3RyaW5nKCk7Ci0JCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VG9EZWZhdWx0KG5hbWVkU3R5bGUpOwotCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBwYWdlQ29tcG9uZW50OwotCX0KLQotCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuV1JBUCk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsYWJlbC5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXRCYWNrZ3JvdW5kKCkpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLy8gcHJvdGVjdGVkIExhYmVsIGNyZWF0ZURlc2NyaXB0aW9uTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCS8vIHJldHVybiBudWxsOwotCS8vIH0KLQotCS8qKgotCSAqIFNldCB1cCBhbGwgdGhlIHN0eWxlIHByZWZlcmVuY2Uga2V5cyBpbiB0aGUgb3ZlcmxheSBzdG9yZQotCSAqLwotCXByaXZhdGUgT3ZlcmxheUtleVtdIGNyZWF0ZU92ZXJsYXlTdG9yZUtleXMoKSB7Ci0JCUxpc3Qgb3ZlcmxheUtleXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJSXRlcmF0b3IgaSA9IGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuU1RSSU5HLCAoU3RyaW5nKSBpLm5leHQoKSkpOwotCQl9Ci0KLQkJT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10ga2V5cyA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbb3ZlcmxheUtleXMuc2l6ZSgpXTsKLQkJb3ZlcmxheUtleXMudG9BcnJheShrZXlzKTsKLQkJcmV0dXJuIGtleXM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgTGlzdCB2aWV3ZXIgd2hlcmUgd2Ugc2VlIHRoZSB2YXJpb3VzIHN5bnRheCBlbGVtZW50IGRpc3BsYXkKLQkgKiBuYW1lcy0td291bGQgaXQgZXZlciBiZSBhIFRyZWUgbGlrZSBKRFQncz8KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZFZpZXdlciBjcmVhdGVTdHlsZXNWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTdHJ1Y3R1cmVkVmlld2VyIHN0eWxlc1ZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlzdHlsZXNWaWV3ZXIuc2V0Q29tcGFyYXRvcihuZXcgVmlld2VyQ29tcGFyYXRvcihDb2xsYXRvci5nZXRJbnN0YW5jZSgpKSk7Ci0JCXN0eWxlc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJT2JqZWN0IGRlc2NyaXB0aW9uID0gZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5nZXQoZWxlbWVudCk7Ci0JCQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0JCQkJCXJldHVybiBkZXNjcmlwdGlvbi50b1N0cmluZygpOwotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCQl9KTsKLQkJc3R5bGVzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpLnRvQXJyYXkoKTsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gc3R5bGVzVmlld2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChmT3ZlcmxheVN0b3JlICE9IG51bGwpIHsKLQkJCWZPdmVybGF5U3RvcmUuc3RvcCgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcml2YXRlIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlRm9yKFN0cmluZyBuYW1lZFN0eWxlKSB7Ci0JCVRleHRBdHRyaWJ1dGUgdGEgPSBuZXcgVGV4dEF0dHJpYnV0ZShmRGVmYXVsdEZvcmVncm91bmQsIGZEZWZhdWx0QmFja2dyb3VuZCwgU1dULk5PUk1BTCk7Ci0KLQkJaWYgKG5hbWVkU3R5bGUgIT0gbnVsbCAmJiBmT3ZlcmxheVN0b3JlICE9IG51bGwpIHsKLQkJCS8vIG5vdGU6ICJuYW1lZFN0eWxlIiAqaXMqIHRoZSBwcmVmZXJlbmNlIGtleQotCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMF0pOwotCQkJCVJHQiBiYWNrZ3JvdW5kID0gQ29sb3JIZWxwZXIudG9SR0Ioc3R5bGVQcmVmc1sxXSk7Ci0KLQkJCQlpbnQgZm9udE1vZGlmaWVyID0gU1dULk5PUk1BTDsKLQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDIpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzJdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDMpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzNdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgU1dULklUQUxJQzsKLQkJCQl9Ci0JCQkJaWYgKHN0eWxlUHJlZnMubGVuZ3RoID4gNCkgewotCQkJCQlib29sZWFuIG9uID0gQm9vbGVhbi52YWx1ZU9mKHN0eWxlUHJlZnNbNF0pLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQlpZiAob24pCi0JCQkJCQlmb250TW9kaWZpZXIgPSBmb250TW9kaWZpZXIgfCBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJfQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDUpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzVdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkU7Ci0JCQkJfQotCi0JCQkJdGEgPSBuZXcgVGV4dEF0dHJpYnV0ZSgoZm9yZWdyb3VuZCAhPSBudWxsKSA/IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IoZm9yZWdyb3VuZCkgOiBudWxsLCAoYmFja2dyb3VuZCAhPSBudWxsKSA/IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IoYmFja2dyb3VuZCkgOiBudWxsLCBmb250TW9kaWZpZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0YTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRFeGFtcGxlVGV4dCgpIHsKLQkJcmV0dXJuIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzA7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJLy8gZW5zdXJlIHRoZSBvZmZzZXQgaXMgY2xlYW4KLQkJaWYgKG9mZnNldCA+PSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpCi0JCQlyZXR1cm4gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KGZEb2N1bWVudC5nZXRMZW5ndGgoKSAtIDEpOwotCQllbHNlIGlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuIGdldE5hbWVkU3R5bGVBdE9mZnNldCgwKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGZEb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCAmJiAhZG9jdW1lbnRSZWdpb24uY29udGFpbnNPZmZzZXQob2Zmc2V0KSkgewotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQkJaWYgKGRvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIGZpbmQgdGhlIElUZXh0UmVnaW9uJ3MgQ29udGV4dCBhdCB0aGlzIG9mZnNldAotCQkJSVRleHRSZWdpb24gaW50ZXJlc3QgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKGludGVyZXN0ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAob2Zmc2V0ID4gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChpbnRlcmVzdCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlTdHJpbmcgcmVnaW9uQ29udGV4dCA9IGludGVyZXN0LmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25Db250ZXh0ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkvLyBmaW5kIHRoZSBuYW1lZCBzdHlsZSAoaW50ZXJuYWwvc2VsZWN0YWJsZSBuYW1lKSBmb3IgdGhhdAotCQkJLy8gY29udGV4dAotCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoU3RyaW5nKSBmQ29udGV4dFRvU3R5bGVNYXAuZ2V0KHJlZ2lvbkNvbnRleHQpOwotCQkJaWYgKG5hbWVkU3R5bGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBuYW1lZFN0eWxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBnZXRPdmVybGF5U3RvcmUoKSB7Ci0JCXJldHVybiBmT3ZlcmxheVN0b3JlOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCkgewotCQlpZiAoZlN0eWxlUHJlZmVyZW5jZUtleXMgPT0gbnVsbCkgewotCQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBKTsgLy8kTk9OLU5MUy0xJAotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RFRkFVTFQpOyAvLyROT04tTkxTLTEkCi0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TVFJJTkcpOyAvLyROT04tTkxTLTEkCi0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c0RURC5EVERfU1lNQk9MKTsgLy8kTk9OLU5MUy0xJAotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRyk7IC8vJE5PTi1OTFMtMSQKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FKTsgLy8kTk9OLU5MUy0xJAotCQkJZlN0eWxlUHJlZmVyZW5jZUtleXMgPSBzdHlsZXM7Ci0JCX0KLQkJcmV0dXJuIGZTdHlsZVByZWZlcmVuY2VLZXlzOwotCX0KLQotCXByaXZhdGUgS2V5TGlzdGVuZXIgZ2V0VGV4dEtleUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEtleUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW91c2VMaXN0ZW5lciBnZXRUZXh0TW91c2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb3VzZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJaW50IHggPSAoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5nZXRDYXJldE9mZnNldCgpOwotCQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KHgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGdldFRleHRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0Q29sb3JBdE9mZnNldChlLngpOwotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJKChTdHlsZWRUZXh0KSBlLndpZGdldCkuc2V0U2VsZWN0aW9uKGUueCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0Q29sb3JBdE9mZnNldChlLngpOwotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJKChTdHlsZWRUZXh0KSBlLndpZGdldCkuc2V0U2VsZWN0aW9uKGUueCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhdmVyc2VMaXN0ZW5lciBnZXRUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyI2tleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpZiAoKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCkgfHwgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfUFJFVklPVVMpKQotCQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQlzZXREZXNjcmlwdGlvbihTU0VVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nX0Rlc2NyaXB0aW9uKTsKLQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlpbml0U3R5bGVUb0Rlc2NyaXB0aW9uTWFwKCk7Ci0JCWluaXRSZWdpb25Db250ZXh0VG9TdHlsZU1hcCgpOwotCi0JCWZPdmVybGF5U3RvcmUgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZShnZXRQcmVmZXJlbmNlU3RvcmUoKSwgY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpKTsKLQkJZk92ZXJsYXlTdG9yZS5sb2FkKCk7Ci0JCWZPdmVybGF5U3RvcmUuc3RhcnQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFJlZ2lvbkNvbnRleHRUb1N0eWxlTWFwKCkgewotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTlRFTlRfRU1QVFksIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9BTlksIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9QQ0RBVEEsIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTkRBVEFfVkFMVUUsIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTkFNRSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5FTlRJVFlfUEFSTSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcsIElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcsIElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09OTkVDVE9SLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuU1RBUlRfVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRyk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRU5EX1RBRywgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRyk7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJULCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTU1FTlRfQ09OVEVOVCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5UKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5DT01NRU5UX0VORCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5UKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORyk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwsIElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlNZU1RFTV9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlBVQkxJQ19LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk5EQVRBX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ0RBVEFfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5JRF9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLklEUkVGX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuSURSRUZTX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRU5USVRZX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRU5USVRJRVNfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5OTVRPS0VOX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTk1UT0tFTlNfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5OT1RBVElPTl9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlJFUVVJUkVEX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuSU1QTElFRF9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkZJWEVEX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRTdHlsZVRvRGVzY3JpcHRpb25NYXAoKSB7Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVCwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfMSk7IC8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBLCBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV8yKTsgLy8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RFRkFVTFQsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzMpOyAvLyROT04tTkxTLTEkCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfNCk7IC8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TVFJJTkcsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzUpOyAvLyROT04tTkxTLTEkCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c0RURC5EVERfU1lNQk9MLCBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV82KTsgLy8kTk9OLU5MUy0xJAotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRywgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfNyk7IC8vJE5PTi1OTFMtMSQKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FLCBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV84KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWdldE92ZXJsYXlTdG9yZSgpLmxvYWREZWZhdWx0cygpOwotCQlhcHBseVN0eWxlcygpOwotCQlmU3R5bGVzVmlld2VyLnNldFNlbGVjdGlvbihTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQkJYWN0aXZhdGUobnVsbCk7Ci0JCWZUZXh0LnJlZHJhdygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJZ2V0T3ZlcmxheVN0b3JlKCkucHJvcGFnYXRlKCk7Ci0KLQkJRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZWxlY3RDb2xvckF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBnZXROYW1lZFN0eWxlQXRPZmZzZXQob2Zmc2V0KTsKLQkJaWYgKG5hbWVkU3R5bGUgIT0gbnVsbCkgewotCQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmFtZWRTdHlsZSkpOwotCQkJZlN0eWxlc1ZpZXdlci5yZXZlYWwobmFtZWRTdHlsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmU3R5bGVzVmlld2VyLnNldFNlbGVjdGlvbihTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQkJfQotCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBTcGVjaWZpY2FsbHkgc2V0IHRoZSByZXBvcnRpbmcgbmFtZSBvZiBhIGNvbnRyb2wgZm9yIGFjY2Vzc2liaWxpdHkKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0QWNjZXNzaWJsZShDb250cm9sIGNvbnRyb2wsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChjb250cm9sID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZpbmFsIFN0cmluZyBuID0gbmFtZTsKLQkJY29udHJvbC5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5jaGlsZElEID09IEFDQy5DSElMRElEX1NFTEYpCi0JCQkJCWUucmVzdWx0ID0gbjsKLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjY2EzODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBEVEQgdGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSB7Ci0KLQljbGFzcyBEVERFZGl0VGVtcGxhdGVEaWFsb2cgZXh0ZW5kcyBFZGl0VGVtcGxhdGVEaWFsb2cgewotCQlwdWJsaWMgRFRERWRpdFRlbXBsYXRlRGlhbG9nKFNoZWxsIHBhcmVudCwgVGVtcGxhdGUgdGVtcGxhdGUsIGJvb2xlYW4gZWRpdCwgYm9vbGVhbiBpc05hbWVNb2RpZmlhYmxlLCBDb250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCQlzdXBlcihwYXJlbnQsIHRlbXBsYXRlLCBlZGl0LCBpc05hbWVNb2RpZmlhYmxlLCByZWdpc3RyeSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQoKTsKLQotCQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQkJfQotCi0JCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCQkJfQotCi0JCQkJcHVibGljIElDb250ZW50QXNzaXN0YW50IGdldENvbnRlbnRBc3Npc3RhbnQoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQkJQ29udGVudEFzc2lzdGFudCBhc3Npc3RhbnQgPSBuZXcgQ29udGVudEFzc2lzdGFudCgpOwotCQkJCQlhc3Npc3RhbnQuZW5hYmxlQXV0b0FjdGl2YXRpb24odHJ1ZSk7Ci0JCQkJCWFzc2lzdGFudC5lbmFibGVBdXRvSW5zZXJ0KHRydWUpOwotCQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihnZXRUZW1wbGF0ZVByb2Nlc3NvcigpLCBJRG9jdW1lbnQuREVGQVVMVF9DT05URU5UX1RZUEUpOwotCQkJCQlyZXR1cm4gYXNzaXN0YW50OwotCQkJCX0KLQkJCX07Ci0JCQlyZXR1cm4gZG9DcmVhdGVWaWV3ZXIocGFyZW50LCBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyBEVERUZW1wbGF0ZVByZWZlcmVuY2VQYWdlKCkgewotCQlEVERVSVBsdWdpbiBkdGRVSVBsdWdpbiA9IERURFVJUGx1Z2luLmdldERlZmF1bHQoKTsKLQotCQlzZXRQcmVmZXJlbmNlU3RvcmUoZHRkVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlzZXRUZW1wbGF0ZVN0b3JlKGR0ZFVJUGx1Z2luLmdldFRlbXBsYXRlU3RvcmUoKSk7Ci0JCXNldENvbnRleHRUeXBlUmVnaXN0cnkoZHRkVUlQbHVnaW4uZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiBvayA9IHN1cGVyLnBlcmZvcm1PaygpOwotCQlEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBvazsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UjaXNTaG93Rm9ybWF0dGVyU2V0dGluZygpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaG93Rm9ybWF0dGVyU2V0dGluZygpIHsKLQkJLy8gdGVtcGxhdGUgZm9ybWF0dGluZyBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIGFuY2VzdG9yKSB7Ci0JCUNvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKGFuY2VzdG9yKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjLCBJSGVscENvbnRleHRJZHMuRFREX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UjY3JlYXRlVmlld2VyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gc291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uRFREKCk7Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGRvQ3JlYXRlVmlld2VyKHBhcmVudCwgc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci0JfQotCi0JU291cmNlVmlld2VyIGRvQ3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gdmlld2VyQ29uZmlndXJhdGlvbikgewotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlSUQgPSBDb250ZW50VHlwZUlkRm9yRFRELkNvbnRlbnRUeXBlSURfRFREOwotCQl2aWV3ZXIgPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXIocGFyZW50LCBudWxsLCBudWxsLCBmYWxzZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlcikuZ2V0VGV4dFdpZGdldCgpLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZE1vZGVsIHNjcmF0Y2hNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKGNvbnRlbnRUeXBlSUQpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzY3JhdGNoTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXZpZXdlci5jb25maWd1cmUodmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCXZpZXdlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZWRpdCBkaWFsb2cuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUKLQkgKiBhIGN1c3RvbSBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlCi0JICogICAgICAgICAgICB0aGUgdGVtcGxhdGUgYmVpbmcgZWRpdGVkCi0JICogQHBhcmFtIGVkaXQKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGRpYWxvZyBzaG91bGQgYmUgZWRpdGFibGUKLQkgKiBAcGFyYW0gaXNOYW1lTW9kaWZpYWJsZQotCSAqICAgICAgICAgICAgd2hldGhlciB0aGUgdGVtcGxhdGUgbmFtZSBtYXkgYmUgbW9kaWZpZWQKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIG9yIG1vZGlmaWVkIHRlbXBsYXRlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiAgICAgICAgIGVkaXRpb24gZmFpbGVkCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByb3RlY3RlZCBUZW1wbGF0ZSBlZGl0VGVtcGxhdGUoVGVtcGxhdGUgdGVtcGxhdGUsIGJvb2xlYW4gZWRpdCwgYm9vbGVhbiBpc05hbWVNb2RpZmlhYmxlKSB7Ci0JCUVkaXRUZW1wbGF0ZURpYWxvZyBkaWFsb2cgPSBuZXcgRFRERWRpdFRlbXBsYXRlRGlhbG9nKGdldFNoZWxsKCksIHRlbXBsYXRlLCBlZGl0LCBpc05hbWVNb2RpZmlhYmxlLCBnZXRDb250ZXh0VHlwZVJlZ2lzdHJ5KCkpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXJldHVybiBkaWFsb2cuZ2V0VGVtcGxhdGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGQ1NThkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0RURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotCi0vKioKLSAqIFNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIERURCBVSSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgRFREVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlDb2xvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRUaGVtZU1hbmFnZXIoKS5nZXRDdXJyZW50VGhlbWUoKS5nZXRDb2xvclJlZ2lzdHJ5KCk7Ci0JCQotCQkvLyBEVEQgU3R5bGUgUHJlZmVyZW5jZXMKLQkJU3RyaW5nIE5PQkFDS0dST1VOREJPTEQgPSAiIHwgbnVsbCB8IGZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgSlVTVElUQUxJQyA9ICIgfCBudWxsIHwgZmFsc2UgfCB0cnVlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0RURC5EVERfREVGQVVMVCwgMCwgMCwgMCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREVGQVVMVCwgc3R5bGVWYWx1ZSk7IC8vIGJsYWNrCi0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHLCA2MywgNjMsIDE5MSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHLCBzdHlsZVZhbHVlKTsgLy8gYmx1ZQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FLCA2MywgNjMsIDE5MSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSwgc3R5bGVWYWx1ZSk7IC8vIGJsdWUKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5ULCAxMjcsIDEyNywgMTI3KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5ULCBzdHlsZVZhbHVlKTsgLy8gZ3JleQotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQsIDEyOCwgMCwgMCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCwgc3R5bGVWYWx1ZSk7IC8vIGRhcmsKLQkJLy8gcmVkCi0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HLCA2MywgMTU5LCA5NSkgKyBKVVNUSVRBTElDOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HLCBzdHlsZVZhbHVlKTsgLy8gZ3JlZW4KLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBLCAxOTEsIDk1LCA5NSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSwgc3R5bGVWYWx1ZSk7IC8vIGxpZ2h0Ci0JCS8vIHJlZAotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCwgMTI4LCAwLCAwKSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wsIHN0eWxlVmFsdWUpOyAvLyBkYXJrCi0JCS8vIHJlZAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERVSVByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURFVJUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZjJmNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURFVJUHJlZmVyZW5jZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBrZXlzIGZvciBEVEQgVUkKLSAqLwotcHVibGljIGNsYXNzIERURFVJUHJlZmVyZW5jZU5hbWVzIHsKLQlwcml2YXRlIERURFVJUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIGluc3RhbmNlCi0JfQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgY3VzdG9taXplZCB0ZW1wbGF0ZXMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURVNfS0VZID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY3VzdG9tX3RlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBuZXcgRFREIGZpbGUgd2l6YXJkLgotCSAqIFRlbXBsYXRlIG5hbWUgaXMgc3RvcmVkIGluc3RlYWQgb2YgdGVtcGxhdGUgaWQgYmVjYXVzZSB1c2VyLWNyZWF0ZWQKLQkgKiB0ZW1wbGF0ZXMgZG8gbm90IGhhdmUgdGVtcGxhdGUgaWRzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSA9ICJuZXdGaWxlVGVtcGxhdGVOYW1lIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1N0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZGQxM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLklQcm9qZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLlRvcExldmVsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5ldmVudC5JRFRERmlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5ldmVudC5Ob2Rlc0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5JU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBVcGRhdGVzIHRoZSBwcm9qZWN0aW9uIG1vZGVsIG9mIGEgc3RydWN0dXJlZCBtb2RlbCBmb3IgRFRELgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJEVEQgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIsIElQcm9qZWN0aW9uTGlzdGVuZXIsIElEVERGaWxlTGlzdGVuZXIsIElUZXh0SW5wdXRMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1Byb2plY3Rpb25QZXJmID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5kdGQudWkvcHJvamVjdGlvbnBlcmYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBjbGFzcyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBleHRlbmRzIFByb2plY3Rpb25Bbm5vdGF0aW9uIHsKLQkJcHJpdmF0ZSBib29sZWFuIGZJc1Zpc2libGUgPSBmYWxzZTsgLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJcHJpdmF0ZSBOb2RlIGZOb2RlOwotCi0JCXB1YmxpYyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbihOb2RlIG5vZGUsIGJvb2xlYW4gaXNDb2xsYXBzZWQpIHsKLQkJCXN1cGVyKGlzQ29sbGFwc2VkKTsKLQkJCWZOb2RlID0gbm9kZTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gZk5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXROb2RlKE5vZGUgbm9kZSkgewotCQkJZk5vZGUgPSBub2RlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIERvZXMgbm90IHBhaW50IGhpZGRlbiBhbm5vdGF0aW9ucy4gQW5ub3RhdGlvbnMgYXJlIGhpZGRlbiB3aGVuIHRoZXkKLQkJICogb25seSBzcGFuIG9uZSBsaW5lLgotCQkgKiAKLQkJICogQHNlZSBQcm9qZWN0aW9uQW5ub3RhdGlvbiNwYWludChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsCi0JCSAqICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgQ2FudmFzIGNhbnZhcywgUmVjdGFuZ2xlIHJlY3RhbmdsZSkgewotCQkJLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJCS8qCi0JCQkgKiBvbmx5IG5lZWQgdG8gY2hlY2sgYW5ub3RhdGlvbnMgdGhhdCBhcmUgZXhwYW5kZWQgYmVjYXVzZSBoaWRkZW4KLQkJCSAqIGFubm90YXRpb25zIHNob3VsZCBuZXZlciBoYXZlIGJlZW4gZ2l2ZW4gdGhlIGNoYW5jZSB0bwotCQkJICogY29sbGFwc2UuCi0JCQkgKi8KLQkJCWlmICghaXNDb2xsYXBzZWQoKSkgewotCQkJCS8vIHdvcmtpbmcgd2l0aCByZWN0YW5nbGUsIHNvIGxpbmUgaGVpZ2h0Ci0JCQkJRm9udE1ldHJpY3MgbWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCQkJaWYgKG1ldHJpY3MgIT0gbnVsbCkgewotCQkJCQkvLyBkbyBub3QgZHJhdyBhbm5vdGF0aW9ucyB0aGF0IG9ubHkgc3BhbiBvbmUgbGluZSBhbmQKLQkJCQkJLy8gbWFyayB0aGVtIGFzIG5vdCB2aXNpYmxlCi0JCQkJCWlmICgocmVjdGFuZ2xlLmhlaWdodCAvIG1ldHJpY3MuZ2V0SGVpZ2h0KCkpIDw9IDEpIHsKLQkJCQkJCWZJc1Zpc2libGUgPSBmYWxzZTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZJc1Zpc2libGUgPSB0cnVlOwotCQkJc3VwZXIucGFpbnQoZ2MsIGNhbnZhcywgcmVjdGFuZ2xlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbiNtYXJrQ29sbGFwc2VkKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1hcmtDb2xsYXBzZWQoKSB7Ci0JCQkvKiB3b3JrYXJvdW5kIGZvciBCVUc4NTg3NCAqLwotCQkJLy8gZG8gbm90IG1hcmsgY29sbGFwc2VkIGlmIGFubm90YXRpb24gaXMgbm90IHZpc2libGUKLQkJCWlmIChmSXNWaXNpYmxlKQotCQkJCXN1cGVyLm1hcmtDb2xsYXBzZWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExpc3RlbnMgdG8gZG9jdW1lbnQgdG8gYmUgYXdhcmUgb2Ygd2hlbiB0byB1cGRhdGUgdGhlIHByb2plY3Rpb24KLQkgKiBhbm5vdGF0aW9uIG1vZGVsLgotCSAqLwotCWNsYXNzIERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZkRvY3VtZW50ID09IGV2ZW50LmdldERvY3VtZW50KCkpCi0JCQkJZklzRG9jdW1lbnRDaGFuZ2luZyA9IHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJLy8gcmVnaXN0ZXIgYSBwb3N0IG5vdGlmaWNhdGlvbiByZXBsYWNlIHNvIHRoYXQgcHJvamVjdGlvbgotCQkJLy8gYW5ub3RhdGlvbiBtb2RlbCB3aWxsIGJlIHVwZGF0ZWQgYWZ0ZXIgYWxsIGRvY3VtZW50Q2hhbmdlZAotCQkJLy8gbGlzdGVuZXJzIGhhdmUgYmVlbiBub3RpZmllZAotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZXZlbnQuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbiAmJiBmRG9jdW1lbnQgPT0gZG9jdW1lbnQpIHsKLQkJCQlpZiAoZlZpZXdlciAhPSBudWxsICYmIGZRdWV1ZWROb2RlQ2hhbmdlcyAhPSBudWxsICYmICFmUXVldWVkTm9kZUNoYW5nZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCSgoSURvY3VtZW50RXh0ZW5zaW9uKSBkb2N1bWVudCkucmVnaXN0ZXJQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZSh0aGlzLCBuZXcgUG9zdERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEVzc2VudGlhbGx5IGEgcG9zdCBkb2N1bWVudCBjaGFuZ2VkIGxpc3RlbmVyIGJlY2F1c2UgaXQgaXMgY2FsbGVkIGFmdGVyCi0JICogZG9jdW1lbnRjaGFuZ2VkIGhhcyBiZWVuIGZpcmVkLgotCSAqLwotCWNsYXNzIFBvc3REb2N1bWVudENoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElEb2N1bWVudEV4dGVuc2lvbi5JUmVwbGFjZSB7Ci0JCXB1YmxpYyB2b2lkIHBlcmZvcm0oSURvY3VtZW50IGRvY3VtZW50LCBJRG9jdW1lbnRMaXN0ZW5lciBvd25lcikgewotCQkJYXBwbHlBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKCk7Ci0JCQlmSXNEb2N1bWVudENoYW5naW5nID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb250YWlucyBub2RlIGFuZCBhbiBpbmRpY2F0aW9uIG9uIGhvdyBpdCBjaGFuZ2VkCi0JICovCi0JY2xhc3MgTm9kZUNoYW5nZSB7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgQUREID0gMTsKLQkJc3RhdGljIGZpbmFsIGludCBSRU1PVkUgPSAyOwotCi0JCXByaXZhdGUgTm9kZSBmTm9kZTsKLQkJcHJpdmF0ZSBpbnQgZkNoYW5nZVR5cGU7Ci0KLQkJcHVibGljIE5vZGVDaGFuZ2UoTm9kZSBub2RlLCBpbnQgY2hhbmdlVHlwZSkgewotCQkJZk5vZGUgPSBub2RlOwotCQkJZkNoYW5nZVR5cGUgPSBjaGFuZ2VUeXBlOwotCQl9Ci0KLQkJcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJCXJldHVybiBmTm9kZTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Q2hhbmdlVHlwZSgpIHsKLQkJCXJldHVybiBmQ2hhbmdlVHlwZTsKLQkJfQotCX0KLQotCUlEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JUHJvamVjdGlvblZpZXdlciBmVmlld2VyOwotCXByaXZhdGUgYm9vbGVhbiBmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQkvKioKLQkgKiBMaXN0ZW5lciB0byBmUHJvamVjdGlvblZpZXdlcidzIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBJRG9jdW1lbnRMaXN0ZW5lciBmRG9jdW1lbnRMaXN0ZW5lcjsKLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgZG9jdW1lbnQgaXMgaW4gdGhlIG1pZGRsZSBvZiBjaGFuZ2luZwotCSAqLwotCWJvb2xlYW4gZklzRG9jdW1lbnRDaGFuZ2luZyA9IGZhbHNlOwotCS8qKgotCSAqIExpc3Qgb2YgY2hhbmdlZCBub2RlcyB0aGF0IG5lZWQgdG8gYmUgcmVjYWxjdWxhdGVkCi0JICovCi0JTGlzdCBmUXVldWVkTm9kZUNoYW5nZXMgPSBudWxsOwotCi0JLyoqCi0JICogUHJvY2Vzc2VzIGFsbCB0aGUgcXVldWVkIG5vZGUgY2hhbmdlcyBhbmQgdXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24KLQkgKiBtb2RlbC4KLQkgKi8KLQl2b2lkIGFwcGx5QW5ub3RhdGlvbk1vZGVsQ2hhbmdlcygpIHsKLQkJaWYgKGZWaWV3ZXIgIT0gbnVsbCAmJiBmUXVldWVkTm9kZUNoYW5nZXMgIT0gbnVsbCAmJiAhZlF1ZXVlZE5vZGVDaGFuZ2VzLmlzRW1wdHkoKSkgewotCQkJUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCBhbm5vdGF0aW9uTW9kZWwgPSBmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKTsKLQotCQkJLy8gZ28gdGhyb3VnaCBhbGwgdGhlIHBlbmRpbmcgYW5ub3RhdGlvbiBjaGFuZ2VzIGFuZCBhcHBseSB0aGVtIHRvCi0JCQkvLyB0aGUgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsCi0JCQl3aGlsZSAoIWZRdWV1ZWROb2RlQ2hhbmdlcy5pc0VtcHR5KCkpIHsKLQkJCQlOb2RlQ2hhbmdlIGNoYW5nZXMgPSAoTm9kZUNoYW5nZSkgZlF1ZXVlZE5vZGVDaGFuZ2VzLnJlbW92ZSgwKTsKLQkJCQlpZiAoY2hhbmdlcy5nZXRDaGFuZ2VUeXBlKCkgPT0gTm9kZUNoYW5nZS5BREQpIHsKLQkJCQkJLy8gYWRkCi0JCQkJCU5vZGUgbm9kZSA9IGNoYW5nZXMuZ2V0Tm9kZSgpOwotCQkJCQlQb3NpdGlvbiBuZXdQb3MgPSBjcmVhdGVQcm9qZWN0aW9uUG9zaXRpb24obm9kZSk7Ci0JCQkJCWlmIChuZXdQb3MgIT0gbnVsbCkgewotCQkJCQkJVGFnUHJvamVjdGlvbkFubm90YXRpb24gbmV3QW5ub3RhdGlvbiA9IG5ldyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbihub2RlLCBmYWxzZSk7Ci0JCQkJCQkvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgdG8gYWRkCi0JCQkJCQl0cnkgewotCQkJCQkJCWFubm90YXRpb25Nb2RlbC5hZGRBbm5vdGF0aW9uKG5ld0Fubm90YXRpb24sIG5ld1Bvcyk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBpZiBhbnl0aGluZyBnb2VzIHdyb25nLCBsb2cgaXQgYW5kIGNvbnRpbnVlCi0JCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNoYW5nZXMuZ2V0Q2hhbmdlVHlwZSgpID09IE5vZGVDaGFuZ2UuUkVNT1ZFKSB7Ci0JCQkJCS8vIHJlbW92ZQotCQkJCQlOb2RlIG5vZGUgPSBjaGFuZ2VzLmdldE5vZGUoKTsKLQkJCQkJVGFnUHJvamVjdGlvbkFubm90YXRpb24gYW5ubyA9IGZpbmRFeGlzdGluZ0Fubm90YXRpb24obm9kZSk7Ci0JCQkJCWlmIChhbm5vICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJYW5ub3RhdGlvbk1vZGVsLnJlbW92ZUFubm90YXRpb24oYW5ubyk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBpZiBhbnl0aGluZyBnb2VzIHdyb25nLCBsb2cgaXQgYW5kIGNvbnRpbnVlCi0JCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZlF1ZXVlZE5vZGVDaGFuZ2VzID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdvZXMgdGhyb3VnaCBldmVyeSBub2RlIGNyZWF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIGlmIG5lZWRlZAotCSAqIAotCSAqIEBwYXJhbSBEVERGaWxlCi0JICogICAgICAgICAgICBhc3N1bWVzIGZpbGUgaXMgbm90IG51bGwKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQWxsQW5ub3RhdGlvbnMoRFRERmlsZSBmaWxlKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlMaXN0IG5vZGVzID0gZmlsZS5nZXROb2RlcygpOwotCQlJdGVyYXRvciBpdCA9IG5vZGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdC5uZXh0KCk7Ci0JCQlQb3NpdGlvbiBuZXdQb3MgPSBjcmVhdGVQcm9qZWN0aW9uUG9zaXRpb24obm9kZSk7Ci0JCQlpZiAobmV3UG9zICE9IG51bGwpIHsKLQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uID0gbmV3IFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKG5vZGUsIGZhbHNlKTsKLQkJCQkvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgdG8gYWRkCi0JCQkJZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkuYWRkQW5ub3RhdGlvbihuZXdBbm5vdGF0aW9uLCBuZXdQb3MpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyRFRELmFkZEFsbEFubm90YXRpb25zOiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHByb2plY3Rpb24gcG9zaXRpb24gZnJvbSB0aGUgZ2l2ZW4gbm9kZS4gQWJsZSB0byBnZXQKLQkgKiBwcm9qZWN0aW9uIHBvc2l0aW9uIGlmIG5vZGUgaXNOb2RlUHJvamVjdGFibGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIG51bGwgaWYgbm8gcHJvamVjdGlvbiBwb3NpdGlvbiBwb3NzaWJsZSwgYSBQb3NpdGlvbiBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIFBvc2l0aW9uIGNyZWF0ZVByb2plY3Rpb25Qb3NpdGlvbihOb2RlIG5vZGUpIHsKLQkJUG9zaXRpb24gcG9zID0gbnVsbDsKLQkJaWYgKGlzTm9kZVByb2plY3RhYmxlKG5vZGUpICYmIG5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBmVmlld2VyLmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCUluZGV4ZWRSZWdpb24gaW5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJCQlpbnQgc3RhcnQgPSBpbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJCWludCBlbmQgPSBpbm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQlpZiAoc3RhcnQgPj0gMCAmJiBzdGFydCA8IGVuZCkgewotCQkJCQlwb3MgPSBuZXcgUG9zaXRpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBvczsKLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyB0aHJvdWdoIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBhbmQgcmV0cmlldmVzCi0JICogVGFnUHJvamVjdGlvbkFubm90YXRpb24gZm9yIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gVGFnUHJvamVjdGlvbkFubm90YXRpb24gZm9yIG5vZGUgb3IgbnVsbCBpZiBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGZpbmRFeGlzdGluZ0Fubm90YXRpb24oTm9kZSBub2RlKSB7Ci0JCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGFubm8gPSBudWxsOwotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpICYmIGFubm8gPT0gbnVsbCkgewotCQkJCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGEgPSAoVGFnUHJvamVjdGlvbkFubm90YXRpb24pIGl0Lm5leHQoKTsKLQkJCQlpZiAobm9kZS5lcXVhbHMoYS5nZXROb2RlKCkpKQotCQkJCQlhbm5vID0gYTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYW5ubzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGR0ZCBmaWxlIGZvciB0aGUgZkRvY3VtZW50Ci0JICogCi0JICogQHJldHVybiBEVERGaWxlIGlmIGl0IGV4aXN0cywgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLQkJRFRERmlsZSBkdGRGaWxlID0gbnVsbDsKLQotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJCWlmIChzTW9kZWwgaW5zdGFuY2VvZiBEVERNb2RlbEltcGwpIHsKLQkJCQkJZHRkRmlsZSA9ICgoRFRETW9kZWxJbXBsKSBzTW9kZWwpLmdldERUREZpbGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZHRkRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoaXMgcHJvdmlkZXIgd2l0aCB0aGUgY29ycmVjdCBkb2N1bWVudC4gQXNzdW1lcyBwcm9qZWN0aW9uCi0JICogaXMgZW5hYmxlZC4gKG90aGVyd2lzZSwgb25seSBpbnN0YWxsIHdvdWxkIGhhdmUgYmVlbiBjYWxsZWQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaWYgKCFpc0luc3RhbGxlZCgpKQotCQkJcmV0dXJuOwotCi0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJLy8gcmVtb3ZlIG9sZCBpbmZvCi0JCXByb2plY3Rpb25EaXNhYmxlZCgpOwotCi0JCWZEb2N1bWVudCA9IGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJRFRERmlsZSBmaWxlID0gZ2V0RFRERmlsZSgpOwotCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCAmJiBmaWxlICE9IG51bGwgJiYgZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkgIT0gbnVsbCkgewotCQkJaWYgKGZEb2N1bWVudExpc3RlbmVyID09IG51bGwpCi0JCQkJZkRvY3VtZW50TGlzdGVuZXIgPSBuZXcgRG9jdW1lbnRMaXN0ZW5lcigpOwotCi0JCQlmRG9jdW1lbnQuYWRkRG9jdW1lbnRMaXN0ZW5lcihmRG9jdW1lbnRMaXN0ZW5lcik7Ci0KLQkJCS8vIGFkZCBkdGQgZmlsZSBsaXN0ZW5lciB0byBuZXcgZHRkIGZpbGUKLQkJCWZpbGUuYWRkRFRERmlsZUxpc3RlbmVyKHRoaXMpOwotCi0JCQl0cnkgewotCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTgzMDQKLQkJCQkvLyBkaXNhYmxlIHJlZHJhdyB3aGlsZSBhZGRpbmcgYWxsIGFkYXB0ZXJzCi0JCQkJZlZpZXdlci5zZXRSZWRyYXcoZmFsc2UpOwotCQkJCWFkZEFsbEFubm90YXRpb25zKGZpbGUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJZlZpZXdlci5zZXRSZWRyYXcodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyRFRELmluaXRpYWxpemU6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQXNzb2NpYXRlIGEgUHJvamVjdGlvblZpZXdlciB3aXRoIHRoaXMgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGwoUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gdW5pbnN0YWxsIGJlZm9yZSB0cnlpbmcgdG8gaW5zdGFsbCBuZXcgdmlld2VyCi0JCWlmIChpc0luc3RhbGxlZCgpKSB7Ci0JCQl1bmluc3RhbGwoKTsKLQkJfQotCQlmVmlld2VyID0gdmlld2VyOwotCQlmVmlld2VyLmFkZFByb2plY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlZpZXdlci5hZGRUZXh0SW5wdXRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNJbnN0YWxsZWQoKSB7Ci0JCXJldHVybiBmVmlld2VyICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIG5vZGUgaXMgYSBub2RlIHR5cGUgYWJsZSB0byBmb2xkCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBub2RlIGlzIHByb2plY3RhYmxlLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNOb2RlUHJvamVjdGFibGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgVG9wTGV2ZWxOb2RlKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlQ2hhbmdlZChEVEROb2RlIG5vZGUpIHsKLQkJLyoKLQkJICogRG9uJ3QgYmVsaWV2ZSB0aGlzIGlzIG5lY2Vzc2FyeSAodXNlZCB0byBuZWVkIGl0IHRvIG9ubHkgYWRkCi0JCSAqIHByb2plY3Rpb24gYW5ub3RhdGlvbnMgdG8gZWxlbWVudHMgdGhhdCBzcGFuIG1vcmUgdGhhbiBvbmUgbGluZSwKLQkJICogYnV0IG5vdyBqdXN0IGFsd2F5cyBhZGQgcHJvamVjdGlvbiBhbm5vdGF0aW9uKQotCQkgKi8KLQkJLy8gbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkvLyAvLyByZWNhbGN1bGF0ZSBwcm9qZWN0aW9uIGFubm90YXRpb25zIGZvciBub2RlCi0JCS8vIC8vIGNoZWNrIGlmIHRoaXMgd2FzIGV2ZW4gYSBwcm9qZWN0YWJsZSBub2RlIHRvIHN0YXJ0IHdpdGgKLQkJLy8gaWYgKGlzTm9kZVByb2plY3RhYmxlKG5vZGUpKSB7Ci0JCS8vIC8vIGZpbmQgdGhlIGV4aXN0aW5nIGFubm90YXRpb24KLQkJLy8gVGFnUHJvamVjdGlvbkFubm90YXRpb24gYW5ubyA9IGZpbmRFeGlzdGluZ0Fubm90YXRpb24obm9kZSk7Ci0JCS8vIC8vIGlmIGFibGUgdG8gcHJvamVjdCBub2RlIHNlZSBpZiBwcm9qZWN0aW9uIGFubm90YXRpb24gd2FzCi0JCS8vIC8vIGFscmVhZHkgY3JlYXRlZCBhbmQgY3JlYXRlIG5ldyBpZiBuZWVkZWQKLQkJLy8gUG9zaXRpb24gbmV3UG9zID0gY3JlYXRlUHJvamVjdGlvblBvc2l0aW9uKG5vZGUpOwotCQkvLyBpZiAobmV3UG9zICE9IG51bGwgJiYgYW5ubyA9PSBudWxsKSB7Ci0JCS8vIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIG5ld0Fubm90YXRpb24gPSBuZXcKLQkJLy8gVGFnUHJvamVjdGlvbkFubm90YXRpb24obm9kZSwgZmFsc2UpOwotCQkvLyAvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgdG8gYWRkCi0JCS8vIGZWaWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpLmFkZEFubm90YXRpb24obmV3QW5ub3RhdGlvbiwKLQkJLy8gbmV3UG9zKTsKLQkJLy8gfQotCQkvLyAvLyBpZiBub3QgYWJsZSB0byBwcm9qZWN0IG5vZGUgc2VlIGlmIHByb2plY3Rpb24gYW5ub3RhdGlvbiB3YXMKLQkJLy8gLy8gYWxyZWFkeSBjcmVhdGVkIGFuZCByZW1vdmUgaXQKLQkJLy8gaWYgKG5ld1BvcyA9PSBudWxsICYmIGFubm8gIT0gbnVsbCkgewotCQkvLyBmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKS5yZW1vdmVBbm5vdGF0aW9uKGFubm8pOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8KLQkJLy8gbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJLy8gaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJLy8gU3RyaW5nIG5vZGVOYW1lID0gbm9kZSAhPSBudWxsID8gbm9kZS5nZXROb2RlTmFtZSgpIDogIm51bGwiOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJEVEQubm9kZUNoYW5nZWQgKCIKLQkJLy8gKyBub2RlTmFtZSArICIpOiIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCS8vIH0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2Rlc0FkZGVkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCXByb2Nlc3NOb2Rlc0V2ZW50KGV2ZW50LCBOb2RlQ2hhbmdlLkFERCk7Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyRFRELm5vZGVzQWRkZWQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogR29lcyB0aHJvdWdoIGV2ZXJ5IGNoYW5nZWQgbm9kZSBpbiBldmVudCBhbmQgYWRkIHRvIHF1ZXVlIG9mIG5vZGUKLQkgKiBjaGFuZ2VzIHRoYXQgd2lsbCBiZSByZWNhbGN1bGF0ZWQgZm9yIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiBAcGFyYW0gY2hhbmdlVHlwZQotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzTm9kZXNFdmVudChOb2Rlc0V2ZW50IGV2ZW50LCBpbnQgY2hhbmdlVHlwZSkgewotCQlMaXN0IG5vZGVzID0gZXZlbnQuZ2V0Tm9kZXMoKTsKLQkJSXRlcmF0b3IgaXQgPSBub2Rlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXQubmV4dCgpOwotCQkJaWYgKGlzTm9kZVByb2plY3RhYmxlKG5vZGUpKSB7Ci0JCQkJaWYgKGZRdWV1ZWROb2RlQ2hhbmdlcyA9PSBudWxsKSB7Ci0JCQkJCWZRdWV1ZWROb2RlQ2hhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQl9Ci0KLQkJCQlpbnQgZXhpc3RpbmdJbmRleCA9IGZRdWV1ZWROb2RlQ2hhbmdlcy5pbmRleE9mKG5vZGUpOwotCQkJCWlmIChleGlzdGluZ0luZGV4ID4gLTEpIHsKLQkJCQkJLy8gbm9kZSBpcyBhbHJlYWR5IHF1ZXVlZCB1cAotCQkJCQlOb2RlQ2hhbmdlIGV4aXN0aW5nQ2hhbmdlID0gKE5vZGVDaGFuZ2UpIGZRdWV1ZWROb2RlQ2hhbmdlcy5yZW1vdmUoZXhpc3RpbmdJbmRleCk7Ci0JCQkJCS8vIGRvbid0IGFkZCBpZiBhZGRlZCB0aGVuIHJlbW92ZWQgbm9kZSBvciB2aWNlIHZlcnNhCi0JCQkJCWlmIChleGlzdGluZ0NoYW5nZS5nZXRDaGFuZ2VUeXBlKCkgPT0gY2hhbmdlVHlwZSkgewotCQkJCQkJTm9kZUNoYW5nZSBuZXdDaGFuZ2UgPSBuZXcgTm9kZUNoYW5nZShub2RlLCBjaGFuZ2VUeXBlKTsKLQkJCQkJCWZRdWV1ZWROb2RlQ2hhbmdlcy5hZGQobmV3Q2hhbmdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gbm90IHF1ZXVlZCB1cCB5ZXQsIHNvIHF1ZXVlIG5vZGUKLQkJCQkJTm9kZUNoYW5nZSBuZXdDaGFuZ2UgPSBuZXcgTm9kZUNoYW5nZShub2RlLCBjaGFuZ2VUeXBlKTsKLQkJCQkJZlF1ZXVlZE5vZGVDaGFuZ2VzLmFkZChuZXdDaGFuZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBpZiBkb2N1bWVudCBpc24ndCBjaGFuZ2luZywgZ28gYWhlYWQgYW5kIGFwcGx5IGl0Ci0JCWlmICghZklzRG9jdW1lbnRDaGFuZ2luZykgewotCQkJYXBwbHlBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2Rlc1JlbW92ZWQoTm9kZXNFdmVudCBldmVudCkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJcHJvY2Vzc05vZGVzRXZlbnQoZXZlbnQsIE5vZGVDaGFuZ2UuUkVNT1ZFKTsKLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJEVEQubm9kZXNSZW1vdmVkOiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHByb2plY3Rpb25EaXNhYmxlZCgpIHsKLQkJRFRERmlsZSBmaWxlID0gZ2V0RFRERmlsZSgpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlmaWxlLnJlbW92ZURUREZpbGVMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCS8vIHJlbW92ZSBkb2N1bWVudCBsaXN0ZW5lcgotCQlpZiAoZkRvY3VtZW50TGlzdGVuZXIgIT0gbnVsbCAmJiBmRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJZkRvY3VtZW50LnJlbW92ZURvY3VtZW50TGlzdGVuZXIoZkRvY3VtZW50TGlzdGVuZXIpOwotCQkJZkRvY3VtZW50ID0gbnVsbDsKLQotCQkJLy8gY2xlYXIgb3V0IGxpc3Qgb2YgcXVldWVkIGNoYW5nZXMgc2luY2UgaXQgbWF5IG5vIGxvbmdlciBiZQotCQkJLy8gYWNjdXJhdGUKLQkJCWlmIChmUXVldWVkTm9kZUNoYW5nZXMgIT0gbnVsbCkgewotCQkJCWZRdWV1ZWROb2RlQ2hhbmdlcy5jbGVhcigpOwotCQkJCWZRdWV1ZWROb2RlQ2hhbmdlcyA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlmRG9jdW1lbnQgPSBudWxsOwotCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9qZWN0aW9uRW5hYmxlZCgpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCS8vIGlmIGZvbGRpbmcgaXMgZW5hYmxlZCBhbmQgbmV3IGRvY3VtZW50IGlzIGdvaW5nIHRvIGJlIGEgdG90YWxseQotCQkvLyBkaWZmZXJlbnQgZG9jdW1lbnQsIGRpc2FibGUgcHJvamVjdGlvbgotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwgJiYgZkRvY3VtZW50ICE9IG5ld0lucHV0KSB7Ci0JCQkvLyBkaXNhYmxlIHByb2plY3Rpb24gYW5kIGRpc2Nvbm5lY3QgZXZlcnl0aGluZwotCQkJcHJvamVjdGlvbkRpc2FibGVkKCk7Ci0JCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXREb2N1bWVudENoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJLy8gaWYgcHJvamVjdGlvbiB3YXMgcHJldmlvdXNseSBlbmFibGVkIGJlZm9yZSBpbnB1dCBkb2N1bWVudCBjaGFuZ2VkCi0JCS8vIGFuZCBuZXcgZG9jdW1lbnQgaXMgZGlmZmVyZW50IHRoYW4gb2xkIGRvY3VtZW50Ci0JCWlmIChmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgJiYgZkRvY3VtZW50ID09IG51bGwgJiYgbmV3SW5wdXQgIT0gbnVsbCkgewotCQkJcHJvamVjdGlvbkVuYWJsZWQoKTsKLQkJCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzY29ubmVjdCB0aGlzIElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlciBmcm9tIHByb2plY3Rpb24gdmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsKCkgewotCQlpZiAoaXNJbnN0YWxsZWQoKSkgewotCQkJcHJvamVjdGlvbkRpc2FibGVkKCk7Ci0KLQkJCWZWaWV3ZXIucmVtb3ZlUHJvamVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkJZlZpZXdlci5hZGRUZXh0SW5wdXRMaXN0ZW5lcih0aGlzKTsKLQkJCWZWaWV3ZXIgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYTIyZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSURvY3VtZW50VHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotCi0vKioKLSAqIEBhdXRob3Igbml0aW4KLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JEVEQgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yRFREKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyI2FkZEFkYXB0ZXJGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBZGFwdGVyRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCUZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5UmVnaXN0cnkgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZmFjdG9yeVJlZ2lzdHJ5LCAiUHJvZ3JhbSBFcnJvcjogY2xpZW50IGNhbGxlciBtdXN0IGVuc3VyZSBtb2RlbCBoYXMgZmFjdG9yeSByZWdpc3RyeSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSURvY3VtZW50VHlwZUhhbmRsZXIgY29udGVudFR5cGVEZXNjcmlwdGlvbikgewotCQlyZXR1cm4gKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gaW5zdGFuY2VvZiBNb2RlbEhhbmRsZXJGb3JEVEQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlaW5pdGlhbGl6ZUZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyBub3RoaW5nIHRvIGRvLCBzaW5jZSBubyBlbWJlZGRlZCB0eXBlCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0RURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0RURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGJkYjVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnN0eWxlOwotCi0vKioKLSAqIENvbnRhaW5zIHRoZSBzeW1ib2xpYyBuYW1lIG9mIHN0eWxlcyB1c2VkIGJ5IExpbmVTdHlsZVByb3ZpZGVyLAotICogQ29sb3JNYW5hZ2VyLCBhbmQgYW55IG90aGVycyB3aG8gbWF5IGJlIGludGVyZXN0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3R5bGVDb25zdGFudHNEVEQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX0NPTU1FTlQgPSAiZHRkQ29tbWVudCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIERhdGEgYXJlIHZhcmlhYmxlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9EQVRBID0gImR0ZERhdGEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX0RFRkFVTFQgPSAiZHRkRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGtleXdvcmRzIGFyZSBjb25zdGFudHMgbGlrZSBJTVBMSUVEIG9yIFBDREFUQQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9LRVlXT1JEID0gImR0ZEtleXdvcmQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBzdHJpbmdzIGFyZSBhbnl0aGluZyBpbiBxdW90ZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfU1RSSU5HID0gImR0ZFN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIEFsbCB0aGUgcmVtYWluaW5nIHN5bWJvbHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfU1lNQk9MID0gImR0ZFN5bWJvbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHRhZ3MgYXJlICc8JywgJyEnLCBvciAnPicKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfVEFHID0gImR0ZFRhZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHRhZ25hbWVzIGFyZSBsaWtlIEVMRU1FTlQsIEFUVExJU1QsIGV0Yy4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfVEFHTkFNRSA9ICJkdGRUYWdOYW1lIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQzYTk0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5zdHlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIExpbmVTdHlsZVByb3ZpZGVyRm9yRFREIGV4dGVuZHMgQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlciBpbXBsZW1lbnRzIExpbmVTdHlsZVByb3ZpZGVyIHsKLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlRm9yKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQkvKioKLQkJICogYSBtZXRob2QgdG8gY2VudHJhbGl6ZSBhbGwgdGhlICJmb3JtYXQgcnVsZXMiIGZvciByZWdpb25zCi0JCSAqIHNwZWNpZmljYWxseSBhc3NvY2lhdGVkIGZvciBob3cgdG8gIm9wZW4iIHRoZSByZWdpb24uCi0JCSAqLwotCQkvLyBub3Qgc3VyZSB3aHkgdGhpcyBpcyBjb21pbmcgdGhyb3VnaCBudWxsLCBidXQganVzdCB0byBjYXRjaCBpdAotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxUKTsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlID09IERURFJlZ2lvblR5cGVzLkNPTlRFTlRfRU1QVFkgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT05URU5UX0FOWSB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRyB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5BVFRMSVNUX1RBRyB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRykgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQ09OTkVDVE9SIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5OREFUQV9WQUxVRSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuU1RBUlRfVEFHIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5EX1RBRyB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT01NRU5UX0NPTlRFTlQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT01NRU5UX0VORCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORyk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5TWVNURU1fS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLlBVQkxJQ19LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTkRBVEFfS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkNEQVRBX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5JRF9LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuSURSRUZfS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLklEUkVGU19LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5USVRZX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVElFU19LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTk1UT0tFTl9LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTk1UT0tFTlNfS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5SRVFVSVJFRF9LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuSU1QTElFRF9LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRklYRURfS0VZV09SRCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTkFNRSB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9QQVJNKSB7Ci0JCQkvLyBpZiAocmVnaW9uIGluc3RhbmNlb2YgRFREUmVnaW9uKSB7Ci0JCQkvLyBEVERSZWdpb24gZHRkUmVnaW9uID0gKERURFJlZ2lvbikgcmVnaW9uOwotCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGR0ZFJlZ2lvbi5nZXRQYXJlbnQoKTsKLQkJCS8vIFN0cmluZyByZWdpb25UZXh0ID0gZmxhdE5vZGUuZ2V0VGV4dChkdGRSZWdpb24pOwotCQkJLy8gaWYgKHJlZ2lvblRleHQuZXF1YWxzKCJBTlkiKSB8fCByZWdpb25UZXh0LmVxdWFscygiRU1QVFkiKSkgewotCQkJLy8gcmV0dXJuIG5ldyBUZXh0QXR0cmlidXRlKERURENvbG9ycy5EVERfS0VZV09SRCk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCX0KLQotCQkvLyBkZWZhdWx0LCByZXR1cm4gbnVsbCB0byBzaWduYWwgIm5vdCBoYW5kbGVkIgotCQkvLyBpbiB3aGljaCBjYXNlLCBvdGhlciBmYWN0b3JpZXMgc2hvdWxkIGJlIHRyaWVkCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3R5bGVLZXkgPSBudWxsOwotCi0JCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZktleSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkvLyBjaGVjayBpZiBwcmVmZXJlbmNlIGNoYW5nZWQgaXMgYSBzdHlsZSBwcmVmZXJlbmNlCi0JCQlpZiAoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxULmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxUOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRzsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRTsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVDsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRDsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TVFJJTkc7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEE7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0RURC5EVERfU1lNQk9MOwotCQkJfQotCQl9Ci0KLQkJaWYgKHN0eWxlS2V5ICE9IG51bGwpIHsKLQkJCS8vIG92ZXJ3cml0ZSBzdHlsZSBwcmVmZXJlbmNlIHdpdGggbmV3IHZhbHVlCi0JCQlhZGRUZXh0QXR0cmlidXRlKHN0eWxlS2V5KTsKLQkJCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRDb2xvcnMoKSB7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxUKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRyk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TVFJJTkcpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvckRURFN1YlNldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yRFREU3ViU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMjViN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yRFREU3ViU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudGV4dC5JRFREUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JEVERTdWJTZXQgZXh0ZW5kcyBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyIGltcGxlbWVudHMgTGluZVN0eWxlUHJvdmlkZXIgewotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBmSW50ZXJuYWxNb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlckZvckRURCBmSW50ZXJuYWxQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHlsZVJhbmdlW10gZkludGVybmFsUmFuZ2VzOwotCXByaXZhdGUgU3RyaW5nIGZQYXJ0aXRpb25pbmcgPSBudWxsOwotCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyRm9yRFREU3ViU2V0KCkgewotCQlzdXBlcigpOwotCQlmSW50ZXJuYWxQcm92aWRlciA9IG5ldyBMaW5lU3R5bGVQcm92aWRlckZvckRURCgpOwotCQlmSW50ZXJuYWxSYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVswXTsKLQkJZlBhcnRpdGlvbmluZyA9IElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkc7Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gbGluZVJlcXVlc3RTdGFydAotCSAqIEBwYXJhbSBsaW5lUmVxdWVzdExlbmd0aAotCSAqIEBwYXJhbSBob2xkUmVzdWx0cwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRTdHlsZVJhbmdlcyhpbnQgbGluZVJlcXVlc3RTdGFydCwgaW50IGxpbmVSZXF1ZXN0TGVuZ3RoLCBDb2xsZWN0aW9uIGhvbGRSZXN1bHRzLCBpbnQgYWRqdXN0bWVudCkgewotCQlpbnQgbGluZVJlcXVlc3RFbmQgPSBsaW5lUmVxdWVzdFN0YXJ0ICsgbGluZVJlcXVlc3RMZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkludGVybmFsUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgYWRqdXN0ZWRTdHlsZVJhbmdlU3RhcnQgPSBhZGp1c3RtZW50ICsgZkludGVybmFsUmFuZ2VzW2ldLnN0YXJ0OwotCQkJaW50IGFkanVzdGVkU3R5bGVSYW5nZUVuZCA9IGFkanVzdGVkU3R5bGVSYW5nZVN0YXJ0ICsgZkludGVybmFsUmFuZ2VzW2ldLmxlbmd0aDsKLQkJCWlmIChhZGp1c3RlZFN0eWxlUmFuZ2VFbmQgPCBsaW5lUmVxdWVzdFN0YXJ0IHx8IGxpbmVSZXF1ZXN0RW5kIDwgYWRqdXN0ZWRTdHlsZVJhbmdlU3RhcnQpCi0JCQkJY29udGludWU7Ci0JCQlpbnQgZW5kID0gTWF0aC5taW4oYWRqdXN0ZWRTdHlsZVJhbmdlRW5kLCBsaW5lUmVxdWVzdEVuZCk7Ci0JCQlTdHlsZVJhbmdlIHJhbmdlID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQkJCXJhbmdlLnN0YXJ0ID0gTWF0aC5tYXgoYWRqdXN0ZWRTdHlsZVJhbmdlU3RhcnQsIGxpbmVSZXF1ZXN0U3RhcnQpOwotCQkJcmFuZ2UubGVuZ3RoID0gZW5kIC0gcmFuZ2Uuc3RhcnQ7Ci0JCQlyYW5nZS5mb250U3R5bGUgPSBmSW50ZXJuYWxSYW5nZXNbaV0uZm9udFN0eWxlOwotCQkJcmFuZ2UuZm9yZWdyb3VuZCA9IGZJbnRlcm5hbFJhbmdlc1tpXS5mb3JlZ3JvdW5kOwotCQkJcmFuZ2UuYmFja2dyb3VuZCA9IGZJbnRlcm5hbFJhbmdlc1tpXS5iYWNrZ3JvdW5kOwotCQkJaG9sZFJlc3VsdHMuYWRkKHJhbmdlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCVRleHRBdHRyaWJ1dGUgdGEgPSBudWxsOwotCi0JCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0Q29sb3JQcmVmZXJlbmNlcygpLmdldFN0cmluZyhJU3R5bGVDb25zdGFudHNEVEQuRFREX0RFRkFVTFQpOwotCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCVJHQiBiYWNrZ3JvdW5kID0gQ29sb3JIZWxwZXIudG9SR0Ioc3R5bGVQcmVmc1sxXSk7Ci0JCQlib29sZWFuIGJvbGQgPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgYmFja2dyb3VuZCwgYm9sZCk7Ci0JCX0KLQkJcmV0dXJuIHRhOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRJbnRlcm5hbERvY3VtZW50KCkgewotCQlpZiAoZkludGVybmFsTW9kZWwgPT0gbnVsbCkgewotCQkJZkludGVybmFsTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihDb250ZW50VHlwZUlkRm9yRFRELkNvbnRlbnRUeXBlSURfRFREKTsKLQkJfQotCQlyZXR1cm4gZkludGVybmFsTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWQuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlciNwcmVwYXJlUmVnaW9ucyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbiwKLQkgKiAgICAgIGludCwgaW50LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcmVwYXJlUmVnaW9ucyhJVHlwZWRSZWdpb24gdHlwZWRSZWdpb24sIGludCBsaW5lUmVxdWVzdFN0YXJ0LCBpbnQgbGluZVJlcXVlc3RMZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJaWYgKCFJRFREUGFydGl0aW9ucy5EVERfREVGQVVMVC5lcXVhbHModHlwZWRSZWdpb24uZ2V0VHlwZSgpKSkgewotCQkJLy8gY29tcHV0ZSBhbiBpbnRlcm5hbCBEVEQgbW9kZWwgYW5kIHJldHVybiBsaW5lc3R5bGVzIGZvciBpdAotCQkJSVRleHRSZWdpb24gZHRkQ29udGVudFJlZ2lvbiA9IG51bGw7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3R5cGUgPSBmRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQodHlwZWRSZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJaWYgKGRvY3R5cGUgIT0gbnVsbCkKLQkJCQlkdGRDb250ZW50UmVnaW9uID0gZG9jdHlwZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCh0eXBlZFJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQlTdHJpbmcgY29udGVudHMgPSBkdGRDb250ZW50UmVnaW9uICE9IG51bGwgPyBkb2N0eXBlLmdldEZ1bGxUZXh0KGR0ZENvbnRlbnRSZWdpb24pIDogbnVsbDsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRJbnRlcm5hbERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCXVwZGF0ZVN0eWxlUmFuZ2VzKGRvY3VtZW50LCBjb250ZW50cyk7Ci0KLQkJCWFkZFN0eWxlUmFuZ2VzKGxpbmVSZXF1ZXN0U3RhcnQsIGxpbmVSZXF1ZXN0TGVuZ3RoLCBob2xkUmVzdWx0cywgZG9jdHlwZS5nZXRTdGFydE9mZnNldChkdGRDb250ZW50UmVnaW9uKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJc3VwZXIucmVsZWFzZSgpOwotCQlpZiAoZkludGVybmFsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJZkludGVybmFsUHJvdmlkZXIucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0eWxlUmFuZ2VzKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBjb250ZW50cykgewotCQlpZiAoIWRvY3VtZW50LmdldCgpLmVxdWFscyhjb250ZW50cykpIHsKLQkJCWRvY3VtZW50LnNldChjb250ZW50cyk7Ci0JCQl0cnkgewotCQkJCUlUeXBlZFJlZ2lvbiByZWdpb25zW10gPSBUZXh0VXRpbGl0aWVzLmNvbXB1dGVQYXJ0aXRpb25pbmcoZ2V0SW50ZXJuYWxEb2N1bWVudCgpLCBmUGFydGl0aW9uaW5nLCAwLCBkb2N1bWVudC5nZXRMZW5ndGgoKSwgZmFsc2UpOwotCQkJCUxpc3QgcmFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZJbnRlcm5hbFByb3ZpZGVyLmluaXQoZ2V0SW50ZXJuYWxEb2N1bWVudCgpLCBmUmVjSGlnaGxpZ2h0ZXIpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlmSW50ZXJuYWxQcm92aWRlci5wcmVwYXJlUmVnaW9ucyhyZWdpb25zW2ldLCByZWdpb25zW2ldLmdldE9mZnNldCgpLCByZWdpb25zW2ldLmdldExlbmd0aCgpLCByYW5nZXMpOwotCQkJCX0KLQkJCQlmSW50ZXJuYWxSYW5nZXMgPSAoU3R5bGVSYW5nZVtdKSByYW5nZXMudG9BcnJheShuZXcgU3R5bGVSYW5nZVswXSk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCWZJbnRlcm5hbFJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzBdOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkQ29sb3JzKCkgewotCQlmSW50ZXJuYWxQcm92aWRlci5sb2FkQ29sb3JzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVEVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzZDU5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyLCBTVEFSIC0gYWRkZWQgRW5jb2RpbmcgQ29udGVudCBSZXNvbHZlciwgYnVnIDE2MjMyMQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5FbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlclhNTDsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBEVEQgdGVtcGxhdGUgY29udGV4dCB0eXBlcy4gVGVtcGxhdGVzIG9mIHRoaXMgY29udGV4dCB0eXBlCi0gKiBhcHBseSB0byBhbnkgcGxhY2Ugd2l0aGluIERURCBjb250ZW50IHR5cGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUNvbnRleHRUeXBlRFREIGV4dGVuZHMgVGVtcGxhdGVDb250ZXh0VHlwZSB7Ci0KLQlwdWJsaWMgVGVtcGxhdGVDb250ZXh0VHlwZURURCgpIHsKLQkJc3VwZXIoKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkN1cnNvcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkRhdGUoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Eb2xsYXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5MaW5lU2VsZWN0aW9uKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuVGltZSgpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlVzZXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Xb3JkU2VsZWN0aW9uKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuWWVhcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEVuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyWE1MKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUlkc0RURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYTRlZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi0KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFREIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVcgPSAiZHRkX25ldyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC90ZXh0L0RURERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC90ZXh0L0RURERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNmOWE2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdGV4dC9EVEREb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRleHQuRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcjsKLQotCi1wdWJsaWMgY2xhc3MgRFRERG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciBleHRlbmRzIERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHZhbGlkQ29udGV4dHMKLQkgKiBAcGFyYW0gbmV4dE1hdGNoZXIKLQkgKi8KLQlwdWJsaWMgRFRERG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcigpIHsKLQkJc3VwZXIobmV3IFN0cmluZ1tde0RURFJlZ2lvblR5cGVzLlNUQVJUX1RBRywgRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVH0sIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEF0dHJpYnV0ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkQXR0cmlidXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOTRiYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkQXR0cmlidXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgQWRkQXR0cmlidXRlQWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0KLQlwdWJsaWMgQWRkQXR0cmlidXRlQWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIHNlbGVjdGVkTm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCVN0cmluZyBuZXdOYW1lID0gIk5ld0F0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNlbGVjdGVkTm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QpIHsKLQkJCSgoQXR0cmlidXRlTGlzdCkgc2VsZWN0ZWROb2RlKS5hZGRBdHRyaWJ1dGUobmV3TmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWROb2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJKChFbGVtZW50KSBzZWxlY3RlZE5vZGUpLmFkZEF0dHJpYnV0ZShuZXdOYW1lKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJYm9vbGVhbiByYyA9IHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQlEVEROb2RlIG5vZGUgPSBnZXRGaXJzdE5vZGVTZWxlY3RlZChzZWxlY3Rpb24pOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiYXR0cmlidXRlIHNldCB0byB0cnVlIik7Ci0JCQlzZXRFbmFibGVkKHRydWUpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJhdHRyaWJ1dGUgc2V0IHRvIGZhbHNlIik7Ci0JCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JCXJldHVybiByYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEF0dHJpYnV0ZUxpc3RBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEF0dHJpYnV0ZUxpc3RBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjYzVhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRBdHRyaWJ1dGVMaXN0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLQotcHVibGljIGNsYXNzIEFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRBdHRyaWJ1dGVMaXN0QWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIHNlbGVjdGVkTm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCURUREZpbGUgZHRkRmlsZSA9IGdldE1vZGVsKCkuZ2V0RFRERmlsZSgpOwotCQlTdHJpbmcgYXR0TGlzdE5hbWUgPSAiTmV3QXR0TGlzdCI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNlbGVjdGVkTm9kZSAhPSBudWxsKSB7Ci0JCQlEVEROb2RlIHRvcExldmVsTm9kZSA9IGR0ZEZpbGUuZ2V0VG9wTGV2ZWxOb2RlQXQoc2VsZWN0ZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJaWYgKHRvcExldmVsTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlhdHRMaXN0TmFtZSA9ICgoRWxlbWVudCkgdG9wTGV2ZWxOb2RlKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0KLQotCQlnZXRNb2RlbCgpLmdldERUREZpbGUoKS5jcmVhdGVBdHRyaWJ1dGVMaXN0KHNlbGVjdGVkTm9kZSwgYXR0TGlzdE5hbWUsIHRydWUpOwotCQkvLyBuZXdFbGVtZW50LnNldE5hbWUoRFREVW5pcXVlTmFtZUhlbHBlci5nZXRVbmlxdWVFbGVtZW50TmFtZShkdGRGaWxlKSk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRDb21tZW50QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRDb21tZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZDk2MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkQ29tbWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLQotcHVibGljIGNsYXNzIEFkZENvbW1lbnRBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRDb21tZW50QWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIHNlbGVjdGVkTm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCWdldE1vZGVsKCkuZ2V0RFRERmlsZSgpLmNyZWF0ZUNvbW1lbnQoc2VsZWN0ZWROb2RlLCAiTmV3Q29tbWVudCIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkRWxlbWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkRWxlbWVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjAwYTI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLkRURFVuaXF1ZU5hbWVIZWxwZXI7Ci0KLQotcHVibGljIGNsYXNzIEFkZEVsZW1lbnRBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRFbGVtZW50QWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIHNlbGVjdGVkTm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCURUREZpbGUgZHRkRmlsZSA9IGdldE1vZGVsKCkuZ2V0RFRERmlsZSgpOwotCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBEVERVbmlxdWVOYW1lSGVscGVyLmdldFVuaXF1ZUVsZW1lbnROYW1lKGR0ZEZpbGUpOwotCQlkdGRGaWxlLmNyZWF0ZUVsZW1lbnQoc2VsZWN0ZWROb2RlLCBlbGVtZW50TmFtZSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzk4Y2Y5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBBZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgbm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSkgewotCQkJKChDTUdyb3VwTm9kZSkgbm9kZSkuYWRkQ2hpbGQoKTsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJKChFbGVtZW50KSBub2RlKS5hZGRDaGlsZCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlib29sZWFuIHJjID0gc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCURURE5vZGUgbm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKHNlbGVjdGlvbik7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCXNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gcmM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkRW50aXR5QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRFbnRpdHlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUxNjY5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRFbnRpdHlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBBZGRFbnRpdHlBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRFbnRpdHlBY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgc2VsZWN0ZWROb2RlID0gZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoKTsKLQotCQlnZXRNb2RlbCgpLmdldERUREZpbGUoKS5jcmVhdGVFbnRpdHkoc2VsZWN0ZWROb2RlLCAiTmV3RW50aXR5IiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gbmV3RWxlbWVudC5zZXROYW1lKERURFVuaXF1ZU5hbWVIZWxwZXIuZ2V0VW5pcXVlRWxlbWVudE5hbWUoZHRkRmlsZSkpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjZlMWM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLQotcHVibGljIGNsYXNzIEFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIG5vZGUgPSBnZXRGaXJzdE5vZGVTZWxlY3RlZCgpOwotCi0JCWlmIChub2RlIGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCSgoQ01Hcm91cE5vZGUpIG5vZGUpLmFkZEdyb3VwKCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCSgoRWxlbWVudCkgbm9kZSkuYWRkR3JvdXAoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZE5vdGF0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGROb3RhdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTFmODJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZE5vdGF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLQotcHVibGljIGNsYXNzIEFkZE5vdGF0aW9uQWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0KLQlwdWJsaWMgQWRkTm90YXRpb25BY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgc2VsZWN0ZWROb2RlID0gZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoKTsKLQotCQlnZXRNb2RlbCgpLmdldERUREZpbGUoKS5jcmVhdGVOb3RhdGlvbihzZWxlY3RlZE5vZGUsICJOZXdOb3RhdGlvbiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gbmV3Tm90YXRpb24uc2V0TmFtZShEVERVbmlxdWVOYW1lSGVscGVyLmdldFVuaXF1ZU5vdGF0aW9uTmFtZShkdGRGaWxlKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlYmNlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5MYWJlbFZhbHVlUGFpcjsKLQotCi1wdWJsaWMgY2xhc3MgQWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0JcHVibGljIEFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbihEVERNb2RlbEltcGwgbW9kZWwsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihtb2RlbCwgbGFiZWwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3RFeHRlcm5hbFBhcmFtZXRlckVudGl0eShEVERGaWxlIGR0ZEZpbGUpIHsKLQkJTGFiZWxWYWx1ZVBhaXJbXSBmcmVlRXh0ZXJuYWxFbnRpdGllcyA9IGR0ZEZpbGUuZ2V0RFRETW9kZWwoKS5jcmVhdGVQYXJtRW50aXR5Q29udGVudEl0ZW1zKG51bGwpOwotCi0JCWlmIChmcmVlRXh0ZXJuYWxFbnRpdGllcy5sZW5ndGggPiAwKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgZnJlZUV4dGVybmFsRW50aXRpZXNbMF0uZlZhbHVlOwotCQkJLy8gcmV0dXJuIChFbnRpdHkpIGZyZWVFeHRlcm5hbEVudGl0aWVzWzBdLmZWYWx1ZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURUREZpbGUgZHRkRmlsZSA9IGdldE1vZGVsKCkuZ2V0RFRERmlsZSgpOwotCQlTdHJpbmcgZXh0RW50aXR5ID0gZ2V0Rmlyc3RFeHRlcm5hbFBhcmFtZXRlckVudGl0eShkdGRGaWxlKTsKLQkJRFRETm9kZSBzZWxlY3RlZE5vZGUgPSBnZXRGaXJzdE5vZGVTZWxlY3RlZCgpOwotCQlpZiAoZXh0RW50aXR5ICE9IG51bGwpIHsKLQkJCWR0ZEZpbGUuY3JlYXRlUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKHNlbGVjdGVkTm9kZSwgZXh0RW50aXR5LCB0cnVlKTsKLQkJfQotCQllbHNlIHsKLQkJCWR0ZEZpbGUuY3JlYXRlUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKHNlbGVjdGVkTm9kZSwgIiVOZXdFbnRpdHlSZWZlcmVuY2U7IiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0Jhc2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0Jhc2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDExZTljMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9CYXNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIEJhc2VBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnRleHRDb250cmlidXRvcjsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZk1vZGVsOwotCi0JcHVibGljIEJhc2VBY3Rpb24oSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgU3RyaW5nIHRleHQpIHsKLQkJdGhpcyhtb2RlbCwgdGV4dCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEJhc2VBY3Rpb24oSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgU3RyaW5nIHRleHQsIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2MpIHsKLQkJc3VwZXIodGV4dCk7Ci0JCWZNb2RlbCA9IG1vZGVsOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRFRETm9kZSBnZXRGaXJzdE5vZGVTZWxlY3RlZCgpIHsKLQkJcmV0dXJuIGdldEZpcnN0Tm9kZVNlbGVjdGVkKGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIERURE5vZGUgZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJLy8gRFRETm9kZSByZWZlcmVuY2VQb2ludCA9IG51bGw7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJCXJldHVybiAoRFRETm9kZSkgZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRFRETW9kZWxJbXBsIGdldE1vZGVsKCkgewotCQlyZXR1cm4gKERURE1vZGVsSW1wbCkgZk1vZGVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRleHRDb250cmlidXRvcihJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29udHJpYnV0b3IpIHsKLQkJY29udGV4dENvbnRyaWJ1dG9yID0gY29udHJpYnV0b3I7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9EZWxldGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0RlbGV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzljMWRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0RlbGV0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5EVERCYXRjaE5vZGVEZWxldGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBEZWxldGVBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0KLQlwdWJsaWMgRGVsZXRlQWN0aW9uKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0KLQkJSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQlEVERCYXRjaE5vZGVEZWxldGUgYmF0Y2hEZWxldGUgPSBudWxsOwotCQlEVERGaWxlIGR0ZEZpbGUgPSBudWxsOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgZWxlbWVudDsKLQkJCQlkdGRGaWxlID0gbm9kZS5nZXREVERGaWxlKCk7Ci0JCQkJaWYgKGJhdGNoRGVsZXRlID09IG51bGwpIHsKLQkJCQkJYmF0Y2hEZWxldGUgPSBuZXcgRFREQmF0Y2hOb2RlRGVsZXRlKGR0ZEZpbGUpOwotCQkJCX0KLQkJCQliYXRjaERlbGV0ZS5hZGROb2RlKChEVEROb2RlKSBlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlkdGRGaWxlLmdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgRFREVUlNZXNzYWdlcy5fVUlfTEFCRUxfRFREX0ZJTEVfREVMRVRFKTsgLy8kTk9OLU5MUy0xJAotCQliYXRjaERlbGV0ZS5kZWxldGVOb2Rlcyh0aGlzKTsKLQkJZHRkRmlsZS5nZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsKSB7Ci0JCWlmICghc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBEVEROb2RlICYmICEoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBDTU5vZGUgJiYgKChDTU5vZGUpIHNlbGVjdGVkT2JqZWN0KS5pc1Jvb3RFbGVtZW50Q29udGVudCgpKSkgewotCQkJc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXJldHVybiB0cnVlOyAvLyBlbmFibGUgZGVsZXRlIG1lbnUgaXRlbQotCQl9Ci0JCWVsc2UgewotCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm4gZmFsc2U7IC8vIGRpc2FibGUgaXQgLSBncmV5IG91dAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvUmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9SZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUyMzk2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9SZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLXB1YmxpYyBjbGFzcyBSZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBSZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgbm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJQ01Ob2RlIGNvbnRlbnRNb2RlbCA9ICgoRWxlbWVudCkgbm9kZSkuZ2V0Q29udGVudE1vZGVsKCk7Ci0JCQlpZiAoQ01Ob2RlLkVNUFRZLmVxdWFscyhjb250ZW50TW9kZWwuZ2V0VHlwZSgpKSkgewotCQkJCWdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgZ2V0VGV4dCgpKTsKLQkJCQkoKEVsZW1lbnQpIG5vZGUpLnJlcGxhY2VDb250ZW50TW9kZWwodGhpcywgIigpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJYm9vbGVhbiByYyA9IHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQlEVEROb2RlIG5vZGUgPSBnZXRGaXJzdE5vZGVTZWxlY3RlZChzZWxlY3Rpb24pOwotCQlzZXRFbmFibGVkKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KTsKLQkJcmV0dXJuIHJjOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL0RURFByb3BlcnR5U291cmNlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL3Byb3BlcnRpZXMvRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOTAyODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL3Byb3BlcnRpZXMvRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3BlcnRpZXMuQ3VzdG9tUHJvcGVydHlEZXNjcmlwdG9yOwotCi0KLS8qKgotICogQW4gSVByb3BlcnR5U291cmNlIGltcGxlbWVudGF0aW9uIGZvciBhIEpGYWNlIHZpZXdlciB1c2VkIHRvIGRpc3BsYXkKLSAqIHByb3BlcnRpZXMgb2YgRE9NIG5vZGVzLiBSZXF1aXJlcyBhbiBhZGFwdGVyIGZhY3RvcnkgdG8gY3JlYXRlIEpGYWNlCi0gKiBhZGFwdGVycyBmb3IgdGhlIG5vZGVzIGluIHRoZSB0cmVlLgotICovCi1wdWJsaWMgY2xhc3MgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyLCBJUHJvcGVydHlTb3VyY2UgewotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIENBVEVHT1JZX0FUVFJJQlVURVMgPSAiQXR0cmlidXRlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9OQU1FID0gRFREVUlNZXNzYWdlcy5EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMDsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9URVhUID0gRFREVUlNZXNzYWdlcy5EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBmRGVzY3JpcHRvcnMgPSBudWxsOwotCXByb3RlY3RlZCBJTm9kZU5vdGlmaWVyIGZOb2RlID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdGFjayBmVmFsdWVzQmVpbmdTZXQgPSBuZXcgU3RhY2soKTsKLQotCXB1YmxpYyBEVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJc3VwZXIoKTsKLQkJZk5vZGUgPSB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVByb3BlcnR5RGVzY3JpcHRvcltdIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0JCUN1c3RvbVByb3BlcnR5RGVzY3JpcHRvciBuYW1lRGVzY3JpcHRvciA9IG5ldyBDdXN0b21Qcm9wZXJ0eURlc2NyaXB0b3IoSURfTkFNRSwgSURfTkFNRSwgbnVsbCk7Ci0JCW5hbWVEZXNjcmlwdG9yLnNldENhdGVnb3J5KERURFVJTWVzc2FnZXMuRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyXzIpOyAvLyROT04tTkxTLTEkCi0JCS8vIEN1c3RvbVByb3BlcnR5RGVzY3JpcHRvciBjb250ZW50RGVzY3JpcHRvciA9IG5ldwotCQkvLyBDdXN0b21Qcm9wZXJ0eURlc2NyaXB0b3IoSURfVEVYVCwgSURfVEVYVCwgbnVsbCk7Ci0JCS8vIGNvbnRlbnREZXNjcmlwdG9yLnNldENhdGVnb3J5KCJBdHRyaWJ1dGVzIik7Ci0JCXJldHVybiBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltde25hbWVEZXNjcmlwdG9yfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgdmFsdWUgZm9yIHRoaXMgTm9kZSB0aGF0IGNhbiBiZSBlZGl0dGVkIGluIGEgcHJvcGVydHkgc2hlZXQuCi0JICogCi0JICogQHJldHVybiBhIHZhbHVlIHRoYXQgY2FuIGJlIGVkaXR0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29sbGVjdGlvbiBvZiBwcm9wZXJ0eSBkZXNjcmlwdG9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCB2YWxpZCBkZXNjcmlwdG9ycy4KLQkgKi8KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0JCWlmIChmRGVzY3JpcHRvcnMgPT0gbnVsbCB8fCBmRGVzY3JpcHRvcnMubGVuZ3RoID09IDApIHsKLQkJCWZEZXNjcmlwdG9ycyA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQkJfQotCQllbHNlIHsKLQkJCXVwZGF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQkJfQotCQlyZXR1cm4gZkRlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjZ2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpIHsKLQkJT2JqZWN0IHZhbHVlID0gbnVsbDsKLQkJaWYgKGlkLmVxdWFscyhJRF9OQU1FKSAmJiBmTm9kZSBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCXZhbHVlID0gKChEVEROb2RlKSBmTm9kZSkuZ2V0TmFtZSgpOwotCQl9Ci0JCWlmIChpZC5lcXVhbHMoSURfVEVYVCkgJiYgZk5vZGUgaW5zdGFuY2VvZiBEVEROb2RlKSB7Ci0JCQl2YWx1ZSA9ICgoRFRETm9kZSkgZk5vZGUpLmdldEZ1bGxOb2RlVGV4dCgpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUgPT0gSVByb3BlcnR5U291cmNlLmNsYXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2UjaXNQcm9wZXJ0eVNldChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IGlkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI3Jlc2V0UHJvcGVydHlWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBuYW1lT2JqZWN0LCBPYmplY3QgdmFsdWUpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL0RURFByb3BlcnR5U291cmNlQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL0RURFByb3BlcnR5U291cmNlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk2MDZiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvcHJvcGVydGllcy9EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotCi0KLXB1YmxpYyBjbGFzcyBEVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoSVByb3BlcnR5U291cmNlLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyRmFjdG9yeShnZXRBZGFwdGVyS2V5KCksIGlzU2hvdWxkUmVnaXN0ZXJBZGFwdGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQkvLyBhdCB0aGUgbW9tZW50LCBvbmx5IG9uZSBpbXBsZW1lbnRhdGlvbiBleGlzdHMKLQkJcmV0dXJuIG5ldyBEVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXIodGFyZ2V0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC93aXphcmQvTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2E1MmYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC93aXphcmQvTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc0RURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0KLS8qKgotICogVGVtcGxhdGVzIHBhZ2UgaW4gbmV3IGZpbGUgd2l6YXJkLiBBbGxvd3MgdXNlcnMgdG8gc2VsZWN0IGEgbmV3IGZpbGUKLSAqIHRlbXBsYXRlIHRvIGJlIGFwcGxpZWQgaW4gbmV3IGZpbGUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIENvbnRlbnQgcHJvdmlkZXIgZm9yIHRlbXBsYXRlcwotCSAqLwotCXByaXZhdGUgY2xhc3MgVGVtcGxhdGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCS8qKiBUaGUgdGVtcGxhdGUgc3RvcmUuICovCi0JCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmU3RvcmU7Ci0KLQkJLyoKLQkJICogQHNlZSBJQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWZTdG9yZSA9IG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXQpIHsKLQkJCXJldHVybiBmU3RvcmUuZ2V0VGVtcGxhdGVzKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNEVEQuTkVXKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJZlN0b3JlID0gKFRlbXBsYXRlU3RvcmUpIG5ld0lucHV0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGFiZWwgcHJvdmlkZXIgZm9yIHRlbXBsYXRlcy4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRlbXBsYXRlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGludCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBpbnQpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSAoVGVtcGxhdGUpIGVsZW1lbnQ7Ci0KLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQljYXNlIDAgOgotCQkJCQlyZXR1cm4gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJCWNhc2UgMSA6Ci0JCQkJCXJldHVybiB0ZW1wbGF0ZS5nZXREZXNjcmlwdGlvbigpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKiBMYXN0IHNlbGVjdGVkIHRlbXBsYXRlIG5hbWUgKi8KLQlwcml2YXRlIFN0cmluZyBmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lOwotCS8qKiBUaGUgdmlld2VyIGRpc3BsYXlzIHRoZSBwYXR0ZXJuIG9mIHNlbGVjdGVkIHRlbXBsYXRlLiAqLwotCXByaXZhdGUgU291cmNlVmlld2VyIGZQYXR0ZXJuVmlld2VyOwotCS8qKiBUaGUgdGFibGUgcHJlc2VudGluZyB0aGUgdGVtcGxhdGVzLiAqLwotCXByaXZhdGUgVGFibGVWaWV3ZXIgZlRhYmxlVmlld2VyOwotCS8qKiBUZW1wbGF0ZSBzdG9yZSB1c2VkIGJ5IHRoaXMgd2l6YXJkIHBhZ2UgKi8KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlRlbXBsYXRlU3RvcmU7Ci0JLyoqIENoZWNrYm94IGZvciB1c2luZyB0ZW1wbGF0ZXMuICovCi0JcHJpdmF0ZSBCdXR0b24gZlVzZVRlbXBsYXRlQnV0dG9uOwotCi0JcHVibGljIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2UoKSB7Ci0JCXN1cGVyKCJOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlIiwgRFREVUlNZXNzYWdlcy5OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzAsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKERURFVJTWVzc2FnZXMuTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV8xKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3JyZWN0bHkgcmVzaXplcyB0aGUgdGFibGUgc28gbm8gcGhhbnRvbSBjb2x1bW5zIGFwcGVhcgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBidXR0b25zCi0JICogICAgICAgICAgICB0aGUgYnV0dG9ucwotCSAqIEBwYXJhbSB0YWJsZQotCSAqICAgICAgICAgICAgdGhlIHRhYmxlCi0JICogQHBhcmFtIGNvbHVtbjEKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMgotCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMwotCSAqICAgICAgICAgICAgdGhlIHRoaXJkIGNvbHVtbgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmVUYWJsZVJlc2l6aW5nKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFRhYmxlIHRhYmxlLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yKSB7Ci0JCXBhcmVudC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlSZWN0YW5nbGUgYXJlYSA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJUG9pbnQgcHJlZmVycmVkU2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJaW50IHdpZHRoID0gYXJlYS53aWR0aCAtIDIgKiB0YWJsZS5nZXRCb3JkZXJXaWR0aCgpOwotCQkJCWlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCkgewotCQkJCQkvLyBTdWJ0cmFjdCB0aGUgc2Nyb2xsYmFyIHdpZHRoIGZyb20gdGhlIHRvdGFsIGNvbHVtbgotCQkJCQkvLyB3aWR0aAotCQkJCQkvLyBpZiBhIHZlcnRpY2FsIHNjcm9sbGJhciB3aWxsIGJlIHJlcXVpcmVkCi0JCQkJCVBvaW50IHZCYXJTaXplID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCk7Ci0JCQkJCXdpZHRoIC09IHZCYXJTaXplLng7Ci0JCQkJfQotCi0JCQkJUG9pbnQgb2xkU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCQlpZiAob2xkU2l6ZS54ID4gd2lkdGgpIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBzbWFsbGVyIHNvIG1ha2UgdGhlIGNvbHVtbnMKLQkJCQkJLy8gc21hbGxlciBmaXJzdCBhbmQgdGhlbiByZXNpemUgdGhlIHRhYmxlIHRvCi0JCQkJCS8vIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJdGFibGUuc2V0U2l6ZSh3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBiaWdnZXIgc28gbWFrZSB0aGUgdGFibGUKLQkJCQkJLy8gYmlnZ2VyIGZpcnN0IGFuZCB0aGVuIG1ha2UgdGhlIGNvbHVtbnMgd2lkZXIKLQkJCQkJLy8gdG8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCXRhYmxlLnNldFNpemUod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShhbmNlc3RvciwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIGNyZWF0ZSBjaGVja2JveCBmb3IgdXNlciB0byB1c2UgRFREIFRlbXBsYXRlCi0JCWZVc2VUZW1wbGF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0VGV4dChEVERVSU1lc3NhZ2VzLk5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfNCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZW5hYmxlVGVtcGxhdGVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSBjb21wb3NpdGUgZm9yIFRlbXBsYXRlcyB0YWJsZQotCQlDb21wb3NpdGUgaW5uZXJQYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGlubmVyTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJaW5uZXJMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWlubmVyTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWlubmVyTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJaW5uZXJQYXJlbnQuc2V0TGF5b3V0KGlubmVyTGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKTsKLQkJaW5uZXJQYXJlbnQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJLy8gQ3JlYXRlIGxpbmtlZCB0ZXh0IHRvIGp1c3QgdG8gdGVtcGxhdGVzIHByZWZlcmVuY2UgcGFnZQotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhpbm5lclBhcmVudCwgU1dULk5PTkUpOwotCQlsaW5rLnNldFRleHQoRFREVUlNZXNzYWdlcy5OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzYpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlsaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbGlua0NsaWNrZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIHRhYmxlIHRoYXQgZGlzcGxheXMgdGVtcGxhdGVzCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKGlubmVyUGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDIpOwotCQlkYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDEwKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotCQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbjEuc2V0VGV4dChEVERVSU1lc3NhZ2VzLk5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMik7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4yLnNldFRleHQoRFREVUlNZXNzYWdlcy5OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzMpOwotCi0JCWZUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUZW1wbGF0ZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRlbXBsYXRlQ29udGVudFByb3ZpZGVyKCkpOwotCi0JCWZUYWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIpIHsKLQkJCQlpZiAoKG9iamVjdDEgaW5zdGFuY2VvZiBUZW1wbGF0ZSkgJiYgKG9iamVjdDIgaW5zdGFuY2VvZiBUZW1wbGF0ZSkpIHsKLQkJCQkJVGVtcGxhdGUgbGVmdCA9IChUZW1wbGF0ZSkgb2JqZWN0MTsKLQkJCQkJVGVtcGxhdGUgcmlnaHQgPSAoVGVtcGxhdGUpIG9iamVjdDI7Ci0JCQkJCWludCByZXN1bHQgPSBsZWZ0LmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJpZ2h0LmdldE5hbWUoKSk7Ci0JCQkJCWlmIChyZXN1bHQgIT0gMCkKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCXJldHVybiBsZWZ0LmdldERlc2NyaXB0aW9uKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBvYmplY3QxLCBvYmplY3QyKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNTb3J0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0pOwotCi0JCWZUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJdXBkYXRlVmlld2VySW5wdXQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIHZpZXdlciB0aGF0IGRpc3BsYXlzIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZSdzIGNvbnRlbnRzCi0JCWZQYXR0ZXJuVmlld2VyID0gZG9DcmVhdGVWaWV3ZXIocGFyZW50KTsKLQotCQlmVGVtcGxhdGVTdG9yZSA9IERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWZUYWJsZVZpZXdlci5zZXRJbnB1dChmVGVtcGxhdGVTdG9yZSk7Ci0KLQkJY29uZmlndXJlVGFibGVSZXNpemluZyhpbm5lclBhcmVudCwgdGFibGUsIGNvbHVtbjEsIGNvbHVtbjIpOwotCQlsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSUhlbHBDb250ZXh0SWRzLkRURF9ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlzZXRDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcywgY29uZmlndXJlcyBhbmQgcmV0dXJucyBhIHNvdXJjZSB2aWV3ZXIgdG8gcHJlc2VudCB0aGUgdGVtcGxhdGUKLQkgKiBwYXR0ZXJuIG9uIHRoZSBwcmVmZXJlbmNlIHBhZ2UuIENsaWVudHMgbWF5IG92ZXJyaWRlIHRvIHByb3ZpZGUgYQotCSAqIGN1c3RvbSBzb3VyY2Ugdmlld2VyIGZlYXR1cmluZyBlLmcuIHN5bnRheCBjb2xvcmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgY29uZmlndXJlZCBzb3VyY2Ugdmlld2VyCi0JICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQoKTsKLQotCQkJcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQkJfQotCQl9OwotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIpLmdldFRleHRXaWRnZXQoKS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnQoIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWRNb2RlbCBzY3JhdGNoTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihDb250ZW50VHlwZUlkRm9yRFRELkNvbnRlbnRUeXBlSURfRFREKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gc2NyYXRjaE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQl2aWV3ZXIuY29uZmlndXJlKHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24pOwotCQl2aWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCXByaXZhdGUgU291cmNlVmlld2VyIGRvQ3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoRFREVUlNZXNzYWdlcy5OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBjcmVhdGVWaWV3ZXIocGFyZW50KTsKLQkJdmlld2VyLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotCQlDb250cm9sIGNvbnRyb2wgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQljb250cm9sLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUvZGlzYWJsZSBjb250cm9scyBpbiBwYWdlIGJhc2VkIG9uIGZVc2VUZW1wbGF0ZUJ1dHRvbidzIGN1cnJlbnQKLQkgKiBzdGF0ZS4KLQkgKi8KLQl2b2lkIGVuYWJsZVRlbXBsYXRlcygpIHsKLQkJYm9vbGVhbiBlbmFibGVkID0gZlVzZVRlbXBsYXRlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCi0JCWlmICghZW5hYmxlZCkgewotCQkJLy8gc2F2ZSBsYXN0IHNlbGVjdGVkIHRlbXBsYXRlCi0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJCWlmICh0ZW1wbGF0ZSAhPSBudWxsKQotCQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCQllbHNlCi0JCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCWZUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obnVsbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRTZWxlY3RlZFRlbXBsYXRlKGZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUpOwotCQl9Ci0KLQkJZlRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmUGF0dGVyblZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRlbXBsYXRlIHByZWZlcmVuY2UgcGFnZSBpZAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlkKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuZHRkLnRlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZSBnZXRTZWxlY3RlZFRlbXBsYXRlKCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCXRlbXBsYXRlID0gKFRlbXBsYXRlKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHRlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGVtcGxhdGUgc3RyaW5nIHRvIGluc2VydC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0byBpbnNlcnQgb3IgbnVsbCBpZiBub25lIGlzIHRvIGJlIGluc2VydGVkCi0JICovCi0JU3RyaW5nIGdldFRlbXBsYXRlU3RyaW5nKCkgewotCQlTdHJpbmcgdGVtcGxhdGVTdHJpbmcgPSBudWxsOwotCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJVGVtcGxhdGVDb250ZXh0VHlwZSBjb250ZXh0VHlwZSA9IERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpLmdldENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNEVEQuTkVXKTsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpOwotCQkJVGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBuZXcgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCAwLCAwKTsKLQkJCXRyeSB7Ci0JCQkJVGVtcGxhdGVCdWZmZXIgYnVmZmVyID0gY29udGV4dC5ldmFsdWF0ZSh0ZW1wbGF0ZSk7Ci0JCQkJdGVtcGxhdGVTdHJpbmcgPSBidWZmZXIuZ2V0U3RyaW5nKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wbGF0ZSBmb3IgbmV3IGR0ZCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdGVtcGxhdGVTdHJpbmc7Ci0JfQotCi0Jdm9pZCBsaW5rQ2xpY2tlZCgpIHsKLQkJU3RyaW5nIHBhZ2VJZCA9IGdldFByZWZlcmVuY2VQYWdlSWQoKTsKLQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIHBhZ2VJZCwgbmV3IFN0cmluZ1tde3BhZ2VJZH0sIG51bGwpOwotCQlkaWFsb2cub3BlbigpOwotCQlmVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIGxhc3QgdGVtcGxhdGUgbmFtZSB1c2VkIGluIE5ldyBEVEQgRmlsZSB3aXphcmQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRMYXN0U2F2ZWRQcmVmZXJlbmNlcygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9IERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoRFREVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSk7Ci0JCWlmICh0ZW1wbGF0ZU5hbWUgPT0gbnVsbCB8fCB0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZU5hbWU7Ci0JCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JCWVuYWJsZVRlbXBsYXRlcygpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGVtcGxhdGUgbmFtZSB1c2VkIGZvciBuZXh0IGNhbGwgdG8gTmV3IERURCBGaWxlIHdpemFyZC4KLQkgKi8KLQl2b2lkIHNhdmVMYXN0U2F2ZWRQcmVmZXJlbmNlcygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQl0ZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoRFREVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSwgdGVtcGxhdGVOYW1lKTsKLQkJRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdCBhIHRlbXBsYXRlIGluIHRoZSB0YWJsZSB2aWV3ZXIgZ2l2ZW4gdGhlIHRlbXBsYXRlIG5hbWUuIElmCi0JICogdGVtcGxhdGUgbmFtZSBjYW5ub3QgYmUgZm91bmQgb3IgdGVtcGxhdGVOYW1lIGlzIG51bGwsIGp1c3Qgc2VsZWN0Ci0JICogZmlyc3QgaXRlbSBpbiB0YWJsZS4gSWYgbm8gaXRlbXMgaW4gdGFibGUgc2VsZWN0IG5vdGhpbmcuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlTmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZFRlbXBsYXRlKFN0cmluZyB0ZW1wbGF0ZU5hbWUpIHsKLQkJT2JqZWN0IHRlbXBsYXRlID0gbnVsbDsKLQotCQlpZiAodGVtcGxhdGVOYW1lICE9IG51bGwgJiYgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJLy8gcGljayB0aGUgbGFzdCB1c2VkIHRlbXBsYXRlCi0JCQl0ZW1wbGF0ZSA9IGZUZW1wbGF0ZVN0b3JlLmZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNEVEQuTkVXKTsKLQkJfQotCi0JCS8vIG5vIHJlY29yZCBvZiBsYXN0IHVzZWQgdGVtcGxhdGUgc28ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJaWYgKHRlbXBsYXRlID09IG51bGwpIHsKLQkJCS8vIGp1c3QgcGljayBmaXJzdCBlbGVtZW50Ci0JCQl0ZW1wbGF0ZSA9IGZUYWJsZVZpZXdlci5nZXRFbGVtZW50QXQoMCk7Ci0JCX0KLQotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGVtcGxhdGUpOwotCQkJZlRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgcGF0dGVybiB2aWV3ZXIuCi0JICovCi0Jdm9pZCB1cGRhdGVWaWV3ZXJJbnB1dCgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0RURFdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3dpemFyZC9OZXdEVERXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZlMTVhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0RURFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkRURENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yLkRUREVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yLkRUREVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi1wdWJsaWMgY2xhc3MgTmV3RFREV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0JcHJpdmF0ZSBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIGZOZXdGaWxlUGFnZTsKLQlwcml2YXRlIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2UgZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlOwotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZlNlbGVjdGlvbjsKLQlwcml2YXRlIElDb250ZW50VHlwZSBmQ29udGVudFR5cGU7Ci0JcHJpdmF0ZSBMaXN0IGZWYWxpZEV4dGVuc2lvbnMgPSBudWxsOwotCi0JLyoqCi0JICogQWRkcyBkZWZhdWx0IGV4dGVuc2lvbiB0byB0aGUgZmlsZW5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGFkZERlZmF1bHRFeHRlbnNpb24oU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciBuZXdGaWxlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoZmlsZW5hbWUpOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2UgPSBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIGV4dCA9IHByZWZlcmVuY2UuZ2V0U3RyaW5nKERURENvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04pOwotCi0JCW5ld0ZpbGVOYW1lLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCi0JCW5ld0ZpbGVOYW1lLmFwcGVuZChleHQpOwotCi0JCXJldHVybiBuZXdGaWxlTmFtZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEdldCBjb250ZW50IHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmV3IGZpbGUgd2l6YXJkCi0JICogCi0JICogQHJldHVybiBJQ29udGVudFR5cGUKLQkgKi8KLQlJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCWlmIChmQ29udGVudFR5cGUgPT0gbnVsbCkKLQkJCWZDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JEVEQuQ29udGVudFR5cGVJRF9EVEQpOwotCQlyZXR1cm4gZkNvbnRlbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIEdldCBsaXN0IG9mIHZhbGlkIGV4dGVuc2lvbnMgZm9yIERURCBDb250ZW50IHR5cGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JTGlzdCBnZXRWYWxpZEV4dGVuc2lvbnMoKSB7Ci0JCWlmIChmVmFsaWRFeHRlbnNpb25zID09IG51bGwpIHsKLQkJCUlDb250ZW50VHlwZSB0eXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLQkJCWZWYWxpZEV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QodHlwZS5nZXRGaWxlU3BlY3MoSUNvbnRlbnRUeXBlLkZJTEVfRVhURU5TSU9OX1NQRUMpKSk7Ci0JCX0KLQkJcmV0dXJuIGZWYWxpZEV4dGVuc2lvbnM7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYXBwbHlMaW5lRGVsaW1pdGVyKElGaWxlIGZpbGUsIFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0U3RyaW5nKFBsYXRmb3JtLlBJX1JVTlRJTUUsIFBsYXRmb3JtLlBSRUZfTElORV9TRVBBUkFUT1IsIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSwgbmV3IElTY29wZUNvbnRleHRbXSB7bmV3IFByb2plY3RTY29wZShmaWxlLmdldFByb2plY3QoKSksIG5ldyBJbnN0YW5jZVNjb3BlKCkgfSk7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY29udmVydGVkVGV4dCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UodGV4dCwgIlxyXG4iLCAiXG4iKTsKLQkJY29udmVydGVkVGV4dCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UoY29udmVydGVkVGV4dCwgIlxyIiwgIlxuIik7Ci0JCWNvbnZlcnRlZFRleHQgPSBTdHJpbmdVdGlscy5yZXBsYWNlKGNvbnZlcnRlZFRleHQsICJcbiIsIGxpbmVEZWxpbWl0ZXIpOwotCQlyZXR1cm4gY29udmVydGVkVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBWZXJpZmllcyBpZiBmaWxlTmFtZSBpcyB2YWxpZCBuYW1lIGZvciBjb250ZW50IHR5cGUuIFRha2VzIGJhc2UgY29udGVudAotCSAqIHR5cGUgaW50byBjb25zaWRlcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBleHRlbnNpb24gaXMgdmFsaWQgZm9yIHRoaXMgY29udGVudCB0eXBlCi0JICovCi0JYm9vbGVhbiBleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKFN0cmluZyBmaWxlTmFtZSkgewotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0KLQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkvLyB0aGVyZSBpcyBjdXJyZW50bHkgYW4gZXh0ZW5zaW9uCi0JCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICE9IC0xKSB7Ci0JCQkvLyBjaGVjayB3aGF0IGNvbnRlbnQgdHlwZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBjdXJyZW50IGV4dGVuc2lvbgotCQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVzRm9yKGZpbGVOYW1lKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdHlwZXMubGVuZ3RoICYmICF2YWxpZCkgewotCQkJCXZhbGlkID0gdHlwZXNbaV0uaXNLaW5kT2YodHlwZSk7Ci0JCQkJKytpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXZhbGlkID0gdHJ1ZTsgLy8gbm8gZXh0ZW5zaW9uIHNvIHZhbGlkCi0JCXJldHVybiB2YWxpZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWZOZXdGaWxlUGFnZSA9IG5ldyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlKCJEVERXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIiwgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oSURFLmNvbXB1dGVTZWxlY3RlZFJlc291cmNlcyhmU2VsZWN0aW9uKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQkJCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0JCQkJSVBhdGggZnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQkJCWlmICgoZnVsbFBhdGggIT0gbnVsbCkgJiYgKGZ1bGxQYXRoLmlzRW1wdHkoKSA9PSBmYWxzZSkgJiYgKGZpbGVOYW1lICE9IG51bGwpKSB7Ci0JCQkJCS8vIGNoZWNrIHRoYXQgZmlsZW5hbWUgZG9lcyBub3QgY29udGFpbiBpbnZhbGlkIGV4dGVuc2lvbgotCQkJCQlpZiAoIWV4dGVuc2lvblZhbGlkRm9yQ29udGVudFR5cGUoZmlsZU5hbWUpKSB7Ci0JCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoRFREVUlNZXNzYWdlcy5fRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfRFRELCBnZXRWYWxpZEV4dGVuc2lvbnMoKS50b1N0cmluZygpKSk7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGNoZWNrIGFkZGluZyBkZWZhdWx0Ci0JCQkJCS8vIGV4dGVuc2lvbiBkb2Vzbid0IGVxdWFsIGEgZmlsZSB0aGF0IGFscmVhZHkgZXhpc3RzCi0JCQkJCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpID09IC0xKSB7Ci0JCQkJCQlTdHJpbmcgbmV3RmlsZU5hbWUgPSBhZGREZWZhdWx0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkJCQkJCUlQYXRoIHJlc291cmNlUGF0aCA9IGZ1bGxQYXRoLmFwcGVuZChuZXdGaWxlTmFtZSk7Ci0KLQkJCQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJCQkJSVN0YXR1cyByZXN1bHQgPSB3b3Jrc3BhY2UudmFsaWRhdGVQYXRoKHJlc291cmNlUGF0aC50b1N0cmluZygpLCBJUmVzb3VyY2UuRk9MREVSKTsKLQkJCQkJCWlmICghcmVzdWx0LmlzT0soKSkgewotCQkJCQkJCS8vIHBhdGggaW52YWxpZAotCQkJCQkJCXNldEVycm9yTWVzc2FnZShyZXN1bHQuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmICgod29ya3NwYWNlLmdldFJvb3QoKS5nZXRGb2xkZXIocmVzb3VyY2VQYXRoKS5leGlzdHMoKSB8fCB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGUocmVzb3VyY2VQYXRoKS5leGlzdHMoKSkpIHsKLQkJCQkJCQlzZXRFcnJvck1lc3NhZ2UoRFREVUlNZXNzYWdlcy5SZXNvdXJjZUdyb3VwX25hbWVFeGlzdHMpOwotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlUGFnZSgpOwotCQkJfQotCQl9OwotCQlmTmV3RmlsZVBhZ2Uuc2V0VGl0bGUoRFREVUlNZXNzYWdlcy5fVUlfQ1JFQVRFX05FV19EVERfRklMRSk7Ci0JCWZOZXdGaWxlUGFnZS5zZXREZXNjcmlwdGlvbihEVERVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfTkVXX0RURF9FWFBMKTsKLQotCQlhZGRQYWdlKGZOZXdGaWxlUGFnZSk7Ci0KLQkJZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlID0gbmV3IE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2UoKTsKLQkJYWRkUGFnZShmTmV3RmlsZVRlbXBsYXRlc1BhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JCWZTZWxlY3Rpb24gPSBhU2VsZWN0aW9uOwotCQlzZXRXaW5kb3dUaXRsZShEVERVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfTkVXX0RURF9USVRMRSk7IC8vJE5PTi1OTFMtMSQKLQotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfV0laQkFOX05FV0RUREZJTEUpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcihmaW5hbCBJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgZmlsZSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJYm9vbGVhbiBwZXJmb3JtZWRPSyA9IGZhbHNlOwotCi0JCS8vIHNhdmUgdXNlciBvcHRpb25zIGZvciBuZXh0IHVzZQotCQlmTmV3RmlsZVRlbXBsYXRlc1BhZ2Uuc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGFkZCBkZWZhdWx0IGV4dGVuc2lvbgotCQlTdHJpbmcgZmlsZU5hbWUgPSBmTmV3RmlsZVBhZ2UuZ2V0RmlsZU5hbWUoKTsKLQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGFkZERlZmF1bHRFeHRlbnNpb24oZmlsZU5hbWUpOwotCQkJZk5ld0ZpbGVQYWdlLnNldEZpbGVOYW1lKG5ld0ZpbGVOYW1lKTsKLQkJfQotCi0JCS8vIGNyZWF0ZSBhIG5ldyBlbXB0eSBmaWxlCi0JCUlGaWxlIGZpbGUgPSBmTmV3RmlsZVBhZ2UuY3JlYXRlTmV3RmlsZSgpOwotCi0JCS8vIGlmIHRoZXJlIHdhcyBwcm9ibGVtIHdpdGggY3JlYXRpbmcgZmlsZSwgaXQgd2lsbCBiZSBudWxsLCBzbyBtYWtlCi0JCS8vIHN1cmUgdG8gY2hlY2sKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJLy8gcHV0IHRlbXBsYXRlIGNvbnRlbnRzIGludG8gZmlsZQotCQkJU3RyaW5nIHRlbXBsYXRlU3RyaW5nID0gZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlLmdldFRlbXBsYXRlU3RyaW5nKCk7Ci0JCQlpZiAodGVtcGxhdGVTdHJpbmcgIT0gbnVsbCkgewotCQkJCXRlbXBsYXRlU3RyaW5nID0gYXBwbHlMaW5lRGVsaW1pdGVyKGZpbGUsIHRlbXBsYXRlU3RyaW5nKTsKLQkJCQkvLyBkZXRlcm1pbmUgdGhlIGVuY29kaW5nIGZvciB0aGUgbmV3IGZpbGUKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQkJU3RyaW5nIGNoYXJTZXQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0KLQkJCQl0cnkgewotCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0U3RyZWFtV3JpdGVyID0gbnVsbDsKLQkJCQkJaWYgKGNoYXJTZXQgPT0gbnVsbCB8fCBjaGFyU2V0LnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIGp1c3QgdXNlIGRlZmF1bHQgZW5jb2RpbmcKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtLCBjaGFyU2V0KTsKLQkJCQkJfQotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIud3JpdGUodGVtcGxhdGVTdHJpbmcpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmNsb3NlKCk7Ci0JCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJCQkJZmlsZS5zZXRDb250ZW50cyhpbnB1dFN0cmVhbSwgdHJ1ZSwgZmFsc2UsIG51bGwpOwotCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCBjcmVhdGUgY29udGVudHMgZm9yIG5ldyBEVEQgZmlsZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCQkvLyBvcGVuIHRoZSBmaWxlIGluIGVkaXRvcgotCQkJb3BlbkVkaXRvcihmaWxlKTsKLQotCQkJLy8gZXZlcnl0aGluZydzIGZpbmUKLQkJCXBlcmZvcm1lZE9LID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcGVyZm9ybWVkT0s7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDI4NjljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkxvY2FsU2VsZWN0aW9uVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5UcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQuRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmRuZC5EVEREcmFnQW5kRHJvcE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBvdXRsaW5lIHZpZXcgcGFnZSB3aGljaCBzaG93cyBEVEQgY29udGVudC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRFREQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIGV4dGVuZHMgQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIHsKLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgZkNvbnRlbnRQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBmTGFiZWxQcm92aWRlciA9IG51bGw7Ci0KLQlwcml2YXRlIERURENvbnRleHRNZW51SGVscGVyIGZNZW51SGVscGVyOwotCXByaXZhdGUgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJbXSBmVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzOwotCXByaXZhdGUgVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJbXSBmVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzOwotCXByaXZhdGUgTWFwIGZWaWV3ZXJDb250cmlidXRpb25zOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9VVExJTkVfT1JERVJfUFJFRiA9ICJvdXRsaW5lLW9yZGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9VVExJTkVfU09SVF9QUkVGID0gIm91dGxpbmUtc29ydCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IgZm9yIERURENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRFREQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCQlmVmlld2VyQ29udHJpYnV0aW9ucyA9IG5ldyBIYXNoTWFwKDIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jY3JlYXRlVG9vbGJhckNvbnRyaWJ1dGlvbnMob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyBJQ29udHJpYnV0aW9uSXRlbVtdIGNyZWF0ZVRvb2xiYXJDb250cmlidXRpb25zKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCUFzc2VydC5pc1RydWUoZ2V0Q29udGVudFByb3ZpZGVyKHZpZXdlcikgaW5zdGFuY2VvZiBEVERUcmVlQ29udGVudFByb3ZpZGVyLCAiaW52YWxpZCBjb250ZW50IHByb3ZpZGVyIG9uIHZpZXdlciIpOyAvLyROT04tTkxTLTEkCi0JCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBzdXBlci5jcmVhdGVUb29sYmFyQ29udHJpYnV0aW9ucyh2aWV3ZXIpOwotCi0JCVNvcnRBY3Rpb24gc29ydEFjdGlvbiA9IG5ldyBTb3J0QWN0aW9uKHZpZXdlciwgRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLCBPVVRMSU5FX1NPUlRfUFJFRik7Ci0JCU9yZGVyQWN0aW9uIG9yZGVyQWN0aW9uID0gbmV3IE9yZGVyQWN0aW9uKHZpZXdlciwgKERURFRyZWVDb250ZW50UHJvdmlkZXIpIGdldENvbnRlbnRQcm92aWRlcih2aWV3ZXIpLCBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksIE9VVExJTkVfT1JERVJfUFJFRik7Ci0JCUlDb250cmlidXRpb25JdGVtIHNvcnRJdGVtID0gbmV3IFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbShzb3J0QWN0aW9uKTsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gb3JkZXJJdGVtID0gbmV3IFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbShvcmRlckFjdGlvbik7Ci0KLQkJaWYgKGl0ZW1zID09IG51bGwpIHsKLQkJCWl0ZW1zID0gbmV3IElDb250cmlidXRpb25JdGVtWzJdOwotCQkJaXRlbXNbMF0gPSBzb3J0SXRlbTsKLQkJCWl0ZW1zWzFdID0gb3JkZXJJdGVtOwotCQl9Ci0JCWVsc2UgewotCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBjb21iaW5lZEl0ZW1zID0gbmV3IElDb250cmlidXRpb25JdGVtW2l0ZW1zLmxlbmd0aCArIDJdOwotCQkJY29tYmluZWRJdGVtc1swXSA9IHNvcnRJdGVtOwotCQkJY29tYmluZWRJdGVtc1sxXSA9IG9yZGVySXRlbTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoaXRlbXMsIDAsIGNvbWJpbmVkSXRlbXMsIDIsIGl0ZW1zLmxlbmd0aCk7Ci0JCQlpdGVtcyA9IGNvbWJpbmVkSXRlbXM7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0Q29udGVudFByb3ZpZGVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZDb250ZW50UHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZkNvbnRlbnRQcm92aWRlciA9IG5ldyBEVERUcmVlQ29udGVudFByb3ZpZGVyKCk7Ci0JCX0KLQkJLy8gcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQcm92aWRlcih2aWV3ZXIpOwotCQlyZXR1cm4gZkNvbnRlbnRQcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldExhYmVsUHJvdmlkZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmTGFiZWxQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmTGFiZWxQcm92aWRlciA9IG5ldyBEVERMYWJlbFByb3ZpZGVyKCk7Ci0JCX0KLQkJLy8gcmV0dXJuIHN1cGVyLmdldExhYmVsUHJvdmlkZXIodmlld2VyKTsKLQkJcmV0dXJuIGZMYWJlbFByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0TWVudUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgSU1lbnVMaXN0ZW5lciBnZXRNZW51TGlzdGVuZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJSU1lbnVMaXN0ZW5lciBsaXN0ZW5lciA9IG51bGw7Ci0JCWlmIChmTWVudUhlbHBlciA9PSBudWxsICYmIHZpZXdlci5nZXRJbnB1dCgpIGluc3RhbmNlb2YgRFRETW9kZWxJbXBsKSB7Ci0JCQlmTWVudUhlbHBlciA9IG5ldyBEVERDb250ZXh0TWVudUhlbHBlcigoRFRETW9kZWxJbXBsKSB2aWV3ZXIuZ2V0SW5wdXQoKSk7Ci0JCQlmTWVudUhlbHBlci5jcmVhdGVNZW51TGlzdGVuZXJzRm9yKHZpZXdlcik7Ci0JCX0KLQkJaWYgKGZNZW51SGVscGVyICE9IG51bGwpIHsKLQkJCWxpc3RlbmVyID0gZk1lbnVIZWxwZXIuZ2V0TWVudUxpc3RlbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3RlbmVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnMob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyBUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcltdIGdldFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVycyhmaW5hbCBUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJaWYgKGZUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJZlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVycyA9IG5ldyBUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcltde25ldyBUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCUxvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKS5zZXRTZWxlY3Rpb24obnVsbCk7Ci0JCQkJfQotCQotCQkJCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJCX0KLQkKLQkJCQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCUxvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKS5zZXRTZWxlY3Rpb24odHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQotCQkJCXB1YmxpYyBUcmFuc2ZlciBnZXRUcmFuc2ZlcigpIHsKLQkJCQkJcmV0dXJuIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKTsKLQkJCQl9Ci0JCQl9fTsKLQkJfQotCQotCQlyZXR1cm4gZlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyczsKLQl9Ci0KLQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycyhvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JCSAqLwotCXB1YmxpYyBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcltdIGdldFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycyhmaW5hbCBUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJaWYgKGZUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJZlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycyA9IG5ldyBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcltde25ldyBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJfQotCQotCQkJCXB1YmxpYyB2b2lkIGRyYWdMZWF2ZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQl9Ci0JCi0JCQkJcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJfQotCQotCQkJCXB1YmxpYyB2b2lkIGRyYWdPdmVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCQlldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19TRUxFQ1Q7Ci0JCQkJCWZsb2F0IGZlZWRiYWNrRmxvYXQgPSBnZXRIZWlnaHRJbkl0ZW0oZXZlbnQpOwotCQkJCQlpZiAoZmVlZGJhY2tGbG9hdCA+IDAuNzUpIHsKLQkJCQkJCWV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX0lOU0VSVF9BRlRFUjsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChmZWVkYmFja0Zsb2F0IDwgMC4yNSkgewotCQkJCQkJZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfSU5TRVJUX0JFRk9SRTsKLQkJCQkJfQotCQkJCQlldmVudC5mZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfRVhQQU5EIHwgRE5ELkZFRURCQUNLX1NDUk9MTDsKLQkJCQl9Ci0JCi0JCQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKGV2ZW50Lm9wZXJhdGlvbnMgIT0gRE5ELkRST1BfTk9ORSAmJiBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgZXZlbnQuaXRlbSAhPSBudWxsICYmIGV2ZW50Lml0ZW0uZ2V0RGF0YSgpICE9IG51bGwpIHsKLQkJCQkJCQkvKgotCQkJCQkJCSAqIHRoZSBjb21tYW5kIHVzZXMgdGhlc2UgbnVtYmVycyBpbnN0ZWFkIG9mIHRoZQotCQkJCQkJCSAqIGZlZWRiYWNrIGNvbnN0YW50cyAoZXZlbiB0aG91Z2ggaXQgY29udmVydHMgaW4KLQkJCQkJCQkgKiB0aGUgb3RoZXIgZGlyZWN0aW9uIGFzIHdlbGwpCi0JCQkJCQkJICovCi0JCQkJCQkJZmxvYXQgZmVlZGJhY2tGbG9hdCA9IGdldEhlaWdodEluSXRlbShldmVudCk7Ci0JCi0JCQkJCQkJZmluYWwgRHJhZ0FuZERyb3BDb21tYW5kIGNvbW1hbmQgPSBuZXcgRFRERHJhZ0FuZERyb3BNYW5hZ2VyKCkuY3JlYXRlQ29tbWFuZChldmVudC5pdGVtLmdldERhdGEoKSwgZmVlZGJhY2tGbG9hdCwgZXZlbnQub3BlcmF0aW9ucywgZXZlbnQuZGV0YWlsLCBzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJCWlmIChjb21tYW5kICE9IG51bGwgJiYgY29tbWFuZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQkJCQkJU2FmZVJ1bm5hYmxlLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCQkJCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkKLQkJCQlwdWJsaWMgdm9pZCBkcm9wQWNjZXB0KERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCX0KLQkKLQkJCQlwcml2YXRlIGZsb2F0IGdldEhlaWdodEluSXRlbShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYoZXZlbnQuaXRlbSA9PSBudWxsKSByZXR1cm4gLjVmOwotCQkJCQlpZiAoZXZlbnQuaXRlbSBpbnN0YW5jZW9mIFRyZWVJdGVtKSB7Ci0JCQkJCQlUcmVlSXRlbSB0cmVlSXRlbSA9IChUcmVlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCQkJCUNvbnRyb2wgY29udHJvbCA9IHRyZWVJdGVtLmdldFBhcmVudCgpOwotCQkJCQkJUG9pbnQgcG9pbnQgPSBjb250cm9sLnRvQ29udHJvbChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotCQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHRyZWVJdGVtLmdldEJvdW5kcygpOwotCQkJCQkJcmV0dXJuIChmbG9hdCkgKHBvaW50LnkgLSBib3VuZHMueSkgLyAoZmxvYXQpIGJvdW5kcy5oZWlnaHQ7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoZXZlbnQuaXRlbSBpbnN0YW5jZW9mIFRhYmxlSXRlbSkgewotCQkJCQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IChUYWJsZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQkJCQlDb250cm9sIGNvbnRyb2wgPSB0YWJsZUl0ZW0uZ2V0UGFyZW50KCk7Ci0JCQkJCQlQb2ludCBwb2ludCA9IGNvbnRyb2wudG9Db250cm9sKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0JCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQkJCQkJCXJldHVybiAoZmxvYXQpIChwb2ludC55IC0gYm91bmRzLnkpIC8gKGZsb2F0KSBib3VuZHMuaGVpZ2h0OwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcmV0dXJuIDAuMEY7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcHVibGljIFRyYW5zZmVyIGdldFRyYW5zZmVyKCkgewotCQkJCQlyZXR1cm4gTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpOwotCQkJCX0KLQkKLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJCXJldHVybiBnZXRUcmFuc2ZlcigpLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpOwotCQkJCX0KLQkJCX19OwotCQl9Ci0JCXJldHVybiBmVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jdW5jb25maWd1cmUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuY29uZmlndXJlKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyLnVuY29uZmlndXJlKHZpZXdlcik7Ci0JCWZWaWV3ZXJDb250cmlidXRpb25zLnJlbW92ZSh2aWV3ZXIpOwotCQlpZiAoZk1lbnVIZWxwZXIgIT0gbnVsbCkgewotCQkJZk1lbnVIZWxwZXIucmVtb3ZlTWVudUxpc3RlbmVyc0Zvcih2aWV3ZXIpOwotCQkJZk1lbnVIZWxwZXIgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURENvbnRleHRNZW51SGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFREQ29udGV4dE1lbnVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcyYTlhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFREQ29udGV4dE1lbnVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWwuTGFiZWxWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yLkRUREVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yLkRUREVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnMuQWRkQXR0cmlidXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5BZGRBdHRyaWJ1dGVMaXN0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5BZGRDb21tZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5BZGRFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5BZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLkFkZEVudGl0eUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnMuQWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnMuQWRkTm90YXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLkFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnMuRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5SZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb247Ci0KLS8qKgotICogTWVudSBoZWxwZXIgZm9yIENvbnRlbnQgT3V0bGluZSBwYWdlLiBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCBlbHNld2hlcmUuCi0gKi8KLWNsYXNzIERURENvbnRleHRNZW51SGVscGVyIHsKLQljbGFzcyBEVERNZW51TGlzdGVuZXIgaW1wbGVtZW50cyBJTWVudUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQkvLyB1cGRhdGUgdGhlIGFjdGlvbiBzZWxlY3Rpb24gbm93Ci0JCQlhZGROb3RhdGlvbkFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGZWaWV3ZXJTZWxlY3Rpb24pOwotCQkJYWRkRW50aXR5QWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZlZpZXdlclNlbGVjdGlvbik7Ci0JCQlhZGRFbGVtZW50QWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZlZpZXdlclNlbGVjdGlvbik7Ci0JCQlhZGRDb21tZW50QWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZlZpZXdlclNlbGVjdGlvbik7Ci0JCQlhZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWRlbGV0ZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGZWaWV3ZXJTZWxlY3Rpb24pOwotCQkJYWRkQXR0cmlidXRlQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZlZpZXdlclNlbGVjdGlvbik7Ci0JCQlhZGRBdHRyaWJ1dGVMaXN0QWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZlZpZXdlclNlbGVjdGlvbik7Ci0JCQlhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZlZpZXdlclNlbGVjdGlvbik7Ci0JCQlhZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCXJlcGxhY2VFbXB0eUNvbnRlbnRNb2RlbFdpdGhHcm91cEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGZWaWV3ZXJTZWxlY3Rpb24pOwotCi0KLQkJCWlmICghZlZpZXdlclNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQlhZGRBY3Rpb25JdGVtc0ZvclNlbGVjdGlvbihmVmlld2VyU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpLCBtYW5hZ2VyKTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIFZpZXdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlfc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQlBZGRBdHRyaWJ1dGVBY3Rpb24gYWRkQXR0cmlidXRlQWN0aW9uOwotCi0JQWRkQXR0cmlidXRlTGlzdEFjdGlvbiBhZGRBdHRyaWJ1dGVMaXN0QWN0aW9uOwotCUFkZENvbW1lbnRBY3Rpb24gYWRkQ29tbWVudEFjdGlvbjsKLQlBZGRFbGVtZW50QWN0aW9uIGFkZEVsZW1lbnRBY3Rpb247Ci0JQWRkRWxlbWVudFRvQ29udGVudE1vZGVsQWN0aW9uIGFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbjsKLQlBZGRFbnRpdHlBY3Rpb24gYWRkRW50aXR5QWN0aW9uOwotCUFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24gYWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbjsKLQlBZGROb3RhdGlvbkFjdGlvbiBhZGROb3RhdGlvbkFjdGlvbjsKLQlBZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24gYWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uOwotCURlbGV0ZUFjdGlvbiBkZWxldGVBY3Rpb247Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGZJbnRlcm5hbFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG5ldyBWaWV3ZXJTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpOwotCi0JcHJpdmF0ZSBJTWVudUxpc3RlbmVyIGZNZW51TGlzdGVuZXI7Ci0JcHJpdmF0ZSBEVERNb2RlbEltcGwgZk1vZGVsOwotCXByaXZhdGUgTGlzdCBmVmlld2VyTGlzdDsKLQotCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZWaWV3ZXJTZWxlY3Rpb24gPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCi0JUmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uIHJlcGxhY2VFbXB0eUNvbnRlbnRNb2RlbFdpdGhHcm91cEFjdGlvbjsKLQotCXB1YmxpYyBEVERDb250ZXh0TWVudUhlbHBlcihEVERNb2RlbEltcGwgbW9kZWwpIHsKLQkJZk1vZGVsID0gbW9kZWw7Ci0JCWZWaWV3ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJZk1lbnVMaXN0ZW5lciA9IG5ldyBEVERNZW51TGlzdGVuZXIoKTsKLQotCQlhZGROb3RhdGlvbkFjdGlvbiA9IG5ldyBBZGROb3RhdGlvbkFjdGlvbihtb2RlbCwgRFREVUlNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9EVERfTk9UQVRJT04pOyAvLyROT04tTkxTLTEkCi0JCWFkZEVudGl0eUFjdGlvbiA9IG5ldyBBZGRFbnRpdHlBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRFREX0VOVElUWSk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRWxlbWVudEFjdGlvbiA9IG5ldyBBZGRFbGVtZW50QWN0aW9uKG1vZGVsLCBEVERVSU1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0RURF9FTEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRDb21tZW50QWN0aW9uID0gbmV3IEFkZENvbW1lbnRBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRFREX0NPTU1FTlQpOyAvLyROT04tTkxTLTEkCi0KLQkJYWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uID0gbmV3IEFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbihtb2RlbCwgRFREVUlNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9QQVJBTV9FTlRJVFlfUkVGKTsgLy8kTk9OLU5MUy0xJAotCQlkZWxldGVBY3Rpb24gPSBuZXcgRGVsZXRlQWN0aW9uKERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9EVERfREVMRVRFKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRBdHRyaWJ1dGVBY3Rpb24gPSBuZXcgQWRkQXR0cmlidXRlQWN0aW9uKG1vZGVsLCBEVERVSU1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURSk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkQXR0cmlidXRlTGlzdEFjdGlvbiA9IG5ldyBBZGRBdHRyaWJ1dGVMaXN0QWN0aW9uKG1vZGVsLCBEVERVSU1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURUxJU1QpOyAvLyROT04tTkxTLTEkCi0KLQkJYWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbiA9IG5ldyBBZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uKG1vZGVsLCBEVERVSU1lc3NhZ2VzLl9VSV9BQ1RJT05fR1JPVVBfQUREX0dST1VQKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24gPSBuZXcgQWRkRWxlbWVudFRvQ29udGVudE1vZGVsQWN0aW9uKG1vZGVsLCBEVERVSU1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0VMRU1FTlQpOyAvLyROT04tTkxTLTEkCi0KLQkJcmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uID0gbmV3IFJlcGxhY2VFbXB0eUNvbnRlbnRNb2RlbFdpdGhHcm91cEFjdGlvbihtb2RlbCwgRFREVUlNZXNzYWdlcy5fVUlfQUNUSU9OX0dST1VQX0FERF9HUk9VUCk7IC8vJE5PTi1OTFMtMSQKLQotCQlhZGROb3RhdGlvbkFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQUREX05PVEFUSU9OKSk7Ci0JCWFkZEVudGl0eUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQUREX0VOVElUWSkpOwotCQlhZGRDb21tZW50QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BRERfQ09NTUVOVCkpOwotCQlhZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FERF9FTlRJVFlfUkVGRVJFTkNFKSk7Ci0KLQkJLy8gVHJpLXN0YXRlIGltYWdlcwotCQlhZGRFbGVtZW50QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VUT09MX0FERF9FTEVNRU5UKSk7Ci0JCWFkZEVsZW1lbnRBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19DVE9PTF9BRERfRUxFTUVOVCkpOwotCQlhZGRFbGVtZW50QWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfQUREX0VMRU1FTlQpKTsKLQotCQlhZGRBdHRyaWJ1dGVBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQUREX0FUVFJJQlVURSkpOwotCQlhZGRBdHRyaWJ1dGVBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19DVE9PTF9BRERfQVRUUklCVVRFKSk7Ci0JCWFkZEF0dHJpYnV0ZUFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0FERF9BVFRSSUJVVEUpKTsKLQotCQlhZGRBdHRyaWJ1dGVMaXN0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VUT09MX0FERF9BVFRSSUJVVEUpKTsKLQkJYWRkQXR0cmlidXRlTGlzdEFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0NUT09MX0FERF9BVFRSSUJVVEUpKTsKLQkJYWRkQXR0cmlidXRlTGlzdEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0FERF9BVFRSSUJVVEUpKTsKLQotCQlhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VUT09MX0FERF9HUk9VUFRPQ09OTU9ERUwpKTsKLQkJYWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0NUT09MX0FERF9HUk9VUFRPQ09OTU9ERUwpKTsKLQkJYWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0FERF9HUk9VUFRPQ09OTU9ERUwpKTsKLQotCQlhZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQUREX0VMRU1FTlRUT0NPTk1PREVMKSk7Ci0JCWFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0NUT09MX0FERF9FTEVNRU5UVE9DT05NT0RFTCkpOwotCQlhZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19EVE9PTF9BRERfRUxFTUVOVFRPQ09OTU9ERUwpKTsKLQotCQkvLyB1c2UgdGhlIHNhbWUgaW1hZ2VzIGFzIGFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24KLQkJcmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VUT09MX0FERF9HUk9VUFRPQ09OTU9ERUwpKTsKLQkJcmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfQ1RPT0xfQUREX0dST1VQVE9DT05NT0RFTCkpOwotCQlyZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19EVE9PTF9BRERfR1JPVVBUT0NPTk1PREVMKSk7Ci0JfQotCi0Jdm9pZCBfc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJLyoKLQkJICogU2F2ZSB0aGUgc2VsZWN0aW9uIHNvIHdlIG9ubHkgbm90aWZ5IHRoZSBhY3Rpb25zIHdoZW4gdGhlIG1lbnUgaXMKLQkJICogc2hvd24KLQkJICovCi0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJZlZpZXdlclNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQl9Ci0JCWVsc2UgewotCQkJZlZpZXdlclNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGFkZEFjdGlvbkl0ZW1zRm9yU2VsZWN0aW9uKE9iamVjdCBzZWxlY3RlZE9iamVjdCwgSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgTm9kZUxpc3QpIHsKLQkJCS8vIGFkZCBhcHByb3ByaWF0ZSBtZW51IHRvIGxvZ2ljYWwgdmlldwotCQkJTm9kZUxpc3QgZm9sZGVyID0gKE5vZGVMaXN0KSBzZWxlY3RlZE9iamVjdDsKLQkJCWlmIChmb2xkZXIuZ2V0TGlzdFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKSkgewotCQkJCW1lbnUuYWRkKGFkZE5vdGF0aW9uQWN0aW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZvbGRlci5nZXRMaXN0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHKSkgewotCQkJCW1lbnUuYWRkKGFkZEVudGl0eUFjdGlvbik7Ci0JCQl9Ci0JCQllbHNlIGlmIChmb2xkZXIuZ2V0TGlzdFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpKSB7Ci0JCQkJTGFiZWxWYWx1ZVBhaXJbXSBhdmFpbGFibGVFbnRpdGllcyA9IGZNb2RlbC5jcmVhdGVQYXJtRW50aXR5Q29udGVudEl0ZW1zKG51bGwpOwotCQkJCWFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbi5zZXRFbmFibGVkKGF2YWlsYWJsZUVudGl0aWVzLmxlbmd0aCA+IDApOwotCi0JCQkJbWVudS5hZGQoYWRkRWxlbWVudEFjdGlvbik7Ci0JCQkJbWVudS5hZGQoYWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZvbGRlci5nZXRMaXN0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5BVFRMSVNUX1RBRykpIHsKLQkJCQltZW51LmFkZChhZGRBdHRyaWJ1dGVBY3Rpb24pOwotCQkJfQotCQl9Ci0JCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIERUREZpbGUgfHwgc2VsZWN0ZWRPYmplY3QgPT0gbnVsbCkgewotCQkJTGFiZWxWYWx1ZVBhaXJbXSBhdmFpbGFibGVFbnRpdGllcyA9IGZNb2RlbC5jcmVhdGVQYXJtRW50aXR5Q29udGVudEl0ZW1zKG51bGwpOwotCQkJYWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uLnNldEVuYWJsZWQoYXZhaWxhYmxlRW50aXRpZXMubGVuZ3RoID4gMCk7Ci0KLQkJCW1lbnUuYWRkKGFkZEVsZW1lbnRBY3Rpb24pOwotCQkJbWVudS5hZGQoYWRkRW50aXR5QWN0aW9uKTsKLQkJCW1lbnUuYWRkKGFkZE5vdGF0aW9uQWN0aW9uKTsKLQkJCW1lbnUuYWRkKGFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbik7Ci0JCQltZW51LmFkZChhZGRDb21tZW50QWN0aW9uKTsKLQkJCW1lbnUuYWRkKGFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24pOwotCQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJfQotCi0JCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCUVsZW1lbnQgZHRkRWxlbWVudCA9IChFbGVtZW50KSBzZWxlY3RlZE9iamVjdDsKLQotCQkJQ01Ob2RlIGNvbnRlbnRNb2RlbCA9IGR0ZEVsZW1lbnQuZ2V0Q29udGVudE1vZGVsKCk7Ci0JCQlpZiAoY29udGVudE1vZGVsID09IG51bGwpIHsKLQkJCQltZW51LmFkZChhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uKTsKLQkJCQltZW51LmFkZChhZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24pOwotCQkJfQotCQkJZWxzZSBpZiAoY29udGVudE1vZGVsICE9IG51bGwgJiYgQ01Ob2RlLkVNUFRZLmVxdWFscyhjb250ZW50TW9kZWwuZ2V0VHlwZSgpKSkgewotCQkJCW1lbnUuYWRkKHJlcGxhY2VFbXB0eUNvbnRlbnRNb2RlbFdpdGhHcm91cEFjdGlvbik7Ci0JCQl9Ci0JCQkvLyBpZiAoISgoKEVsZW1lbnQpc2VsZWN0ZWRPYmplY3QpLmdldENvbnRlbnRNb2RlbCgpIGluc3RhbmNlb2YKLQkJCS8vIENNR3JvdXBOb2RlKSkKLQkJCS8vIHsKLQkJCS8vIG1lbnUuYWRkKGFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24pOwotCQkJLy8gfQotCQkJLy8gYWRkQXR0cmlidXRlQWN0aW9uLnNldEVsZW1lbnQoc2VsZWN0ZWRPYmplY3QpOwotCQkJbWVudS5hZGQoYWRkQXR0cmlidXRlQWN0aW9uKTsKLQkJfQotCQllbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKSB7Ci0JCQkvLyBhZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24uc2V0RWxlbWVudChzZWxlY3RlZE9iamVjdCk7Ci0JCQkvLyBhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uLnNldEVsZW1lbnQoc2VsZWN0ZWRPYmplY3QpOwotCQkJbWVudS5hZGQoYWRkRWxlbWVudFRvQ29udGVudE1vZGVsQWN0aW9uKTsKLQkJCW1lbnUuYWRkKGFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCkgewotCQkJbWVudS5hZGQoYWRkQXR0cmlidXRlQWN0aW9uKTsKLQkJfQotCi0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCWFkZEVkaXRBY3Rpb25zKG1lbnUpOwotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0JCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIERURE5vZGUgJiYgIShzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIENNTm9kZSAmJiAoKENNTm9kZSkgc2VsZWN0ZWRPYmplY3QpLmlzUm9vdEVsZW1lbnRDb250ZW50KCkpKSB7Ci0JCQltZW51LmFkZChkZWxldGVBY3Rpb24pOwotCQkJZGVsZXRlQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkvLyBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBEVERFbGVtZW50Q29udGVudCkKLQkJCS8vIHsKLQkJCS8vIERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQgPSAoRFRERWxlbWVudENvbnRlbnQpIHNlbGVjdGVkT2JqZWN0OwotCQkJLy8gaWYgKGNvbnRlbnQuZ2V0RWxlbWVudCgpICE9IG51bGwgJiYgKGNvbnRlbnQgaW5zdGFuY2VvZgotCQkJLy8gRFREUENEYXRhQ29udGVudCB8fCBjb250ZW50IGluc3RhbmNlb2YgRFRERW1wdHlDb250ZW50KSkKLQkJCS8vIHsKLQkJCS8vIGRlbGV0ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JCQkvLyB9IC8vIGVuZCBvZiBpZiAoKQotCQl9Ci0JfQotCi0Jdm9pZCBhZGRFZGl0QWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSkgewotCQkvLyBtZW51LmFkZCh1bmRvQWN0aW9uKTsKLQkJLy8gbWVudS5hZGQocmVkb0FjdGlvbik7Ci0JCS8vIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCS8vIG1lbnUuYWRkKGN1dEFjdGlvbik7Ci0JCS8vIG1lbnUuYWRkKGNvcHlBY3Rpb24pOwotCQkvLyBtZW51LmFkZChwYXN0ZUFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlTWVudUxpc3RlbmVyc0ZvcihWaWV3ZXIgdmlld2VyKSB7Ci0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZkludGVybmFsU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJZlZpZXdlclNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQl9Ci0JCWVsc2UgewotCQkJZlZpZXdlclNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0JCX0KLQotCQlmVmlld2VyTGlzdC5hZGQodmlld2VyKTsKLQl9Ci0KLQlwdWJsaWMgSU1lbnVMaXN0ZW5lciBnZXRNZW51TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBmTWVudUxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU1lbnVMaXN0ZW5lcnNGb3IoVmlld2VyIHZpZXdlcikgewotCQl2aWV3ZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZJbnRlcm5hbFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCWZWaWV3ZXJMaXN0LnJlbW92ZSh2aWV3ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFRETGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzdmYjFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vZGVMaXN0OwotCi1jbGFzcyBEVERMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgRFRETGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmb3IgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gcHJvdmlkZSB0aGUgbGFiZWwgaW1hZ2UKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSB1c2VkIHRvIGxhYmVsIHRoZSBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICAgICAgICAgdGhlc2UgaXMgbm8gaW1hZ2UgZm9yIHRoZSBnaXZlbiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCWltYWdlID0gKChEVEROb2RlKSBlbGVtZW50KS5nZXRJbWFnZSgpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlTGlzdCkgewotCQkJaW1hZ2UgPSAoKE5vZGVMaXN0KSBlbGVtZW50KS5nZXRJbWFnZSgpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEVERGaWxlKSB7Ci0JCQlpbWFnZSA9ICgoRFRERmlsZSkgZWxlbWVudCkuZ2V0SW1hZ2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlID0gc3VwZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIHByb3ZpZGUgdGhlIGxhYmVsIHRleHQKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IHN0cmluZyB1c2VkIHRvIGxhYmVsIHRoZSBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgaWYgdGhlc2UgaXMgbm8gdGV4dCBsYWJlbCBmb3IgdGhlIGdpdmVuIG9iamVjdAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCVN0cmluZyBuYW1lID0gKChEVEROb2RlKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0KLQkJCS8vIHN0cmlwIGxlYWRpbmcgd2hpdGVzcGFjZSAodXNlZnVsIGZvciBtdWx0aS1saW5lIGNvbW1lbnRzKQotCQkJaW50IGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIgPSAwOwotCQkJaW50IGxhc3RWaXNpYmxlQ2hhcmFjdGVyID0gbmFtZS5sZW5ndGgoKSAtIDE7Ci0JCQlmb3IgKGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIgPSAwOyBmaXJzdFNpZ25pZmljYW50Q2hhcmFjdGVyIDwgbmFtZS5sZW5ndGgoKTsgZmlyc3RTaWduaWZpY2FudENoYXJhY3RlcisrKSB7Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG5hbWUuY2hhckF0KGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIpKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvLyBrZWVwIG9ubHkgdGhlIGZpcnN0IGxpbmUgb2YgdGV4dCBpbiBhIG11bHRpLWxpbmUgbmFtZQotCQkJaWYgKGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIgPCBsYXN0VmlzaWJsZUNoYXJhY3RlcikgewotCQkJCWZvciAobGFzdFZpc2libGVDaGFyYWN0ZXIgPSBmaXJzdFNpZ25pZmljYW50Q2hhcmFjdGVyICsgMTsgbGFzdFZpc2libGVDaGFyYWN0ZXIgPCBuYW1lLmxlbmd0aCgpOyBsYXN0VmlzaWJsZUNoYXJhY3RlcisrKSB7Ci0JCQkJCWNoYXIgY2hhcmFjdGVyID0gbmFtZS5jaGFyQXQobGFzdFZpc2libGVDaGFyYWN0ZXIpOwotCQkJCQlpZiAoY2hhcmFjdGVyID09ICdccicgfHwgY2hhcmFjdGVyID09ICdcbicpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZmlyc3RTaWduaWZpY2FudENoYXJhY3RlciA+IDAgJiYgZmlyc3RTaWduaWZpY2FudENoYXJhY3RlciA8IG5hbWUubGVuZ3RoKCkgLSAxKSB7Ci0JCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIsIGxhc3RWaXNpYmxlQ2hhcmFjdGVyKTsKLQkJCX0KLQotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE5vZGVMaXN0KSB7Ci0JCQkvLyByZXR1cm4gKChOb2RlTGlzdCkgZWxlbWVudCkuZ2V0TGlzdFR5cGUoKTsKLQkJCXJldHVybiAoKE5vZGVMaXN0KSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERUREZpbGUpIHsKLQkJCXJldHVybiAoKERUREZpbGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFREVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiZjU0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFREVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Db21tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmV2ZW50LklEVERGaWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmV2ZW50Lk5vZGVzRXZlbnQ7Ci0KLWNsYXNzIERURFRyZWVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciwgSURUREZpbGVMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIE9iamVjdCBmSW5wdXRPYmplY3Q7Ci0JcHJvdGVjdGVkIFZpZXdlciBmVmlld2VyOwotCi0JLy8gQSBjYWNoZWQgc2V0IG9mIEluZGV4ZWROb2RlTGlzdHMsIHJlcXVpcmVkIGZvciBnZXRQYXJlbnQgdG8gcmV0dXJuIHRoZQotCS8vIGNvcnJlY3QgaW5zdGFuY2VzIG1hcHBpbmcgdG8gVHJlZUl0ZW1zCi0JcHJvdGVjdGVkIE9iamVjdFtdIGxvZ2ljYWxOb2RlTGlzdHMgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIHNob3dMb2dpY2FsT3JkZXIgPSBmYWxzZTsKLQotCXB1YmxpYyBEVERUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZWaWV3ZXIgPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBleHBhbmRUb05vZGUoRFRETm9kZSBub2RlKSB7Ci0JCURUREZpbGUgZHRkRmlsZSA9IG5vZGUuZ2V0RFRERmlsZSgpOwotCQkvLyBmaXJzdCBleHBhbmQgdGhlIHJvb3QKLQkJQWJzdHJhY3RUcmVlVmlld2VyIHZpZXdlciA9IChBYnN0cmFjdFRyZWVWaWV3ZXIpIGZWaWV3ZXI7Ci0JCXZpZXdlci5leHBhbmRUb0xldmVsKGR0ZEZpbGUsIDEpOwotCQlOb2RlTGlzdCBsaXN0VG9FeHBhbmQgPSBudWxsOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgewotCQkJbGlzdFRvRXhwYW5kID0gZHRkRmlsZS5nZXRFbGVtZW50c0FuZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZXMoKTsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgTm90YXRpb24pIHsKLQkJCWxpc3RUb0V4cGFuZCA9IGR0ZEZpbGUuZ2V0Tm90YXRpb25zKCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJbGlzdFRvRXhwYW5kID0gZHRkRmlsZS5nZXRFbnRpdGllcygpOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDb21tZW50KSB7Ci0JCQlsaXN0VG9FeHBhbmQgPSBkdGRGaWxlLmdldENvbW1lbnRzKCk7Ci0JCX0KLQkJaWYgKGxpc3RUb0V4cGFuZCAhPSBudWxsKSB7Ci0JCQl2aWV3ZXIuZXhwYW5kVG9MZXZlbChsaXN0VG9FeHBhbmQsIDEpOwotCQl9Ci0JCXZpZXdlci5leHBhbmRUb0xldmVsKG5vZGUsIDApOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkvLyByZXR1cm4gdGhlIGxpc3RzIG9mIG5vZGVzIHdoZW4gaW4gbG9naWNhbCBvcmRlciBtb2RlLCBhbGwgdGhlIE5vZGVzCi0JCS8vIG90aGVyd2lzZQotCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIERUREZpbGUpIHsKLQkJCWlmIChpc1Nob3dMb2dpY2FsT3JkZXIoKSkgewotCQkJCS8vIHJldHVybiB0aGUgdmlzaWJsZSBub2RlIGxpc3RzCi0JCQkJaWYgKGxvZ2ljYWxOb2RlTGlzdHMgPT0gbnVsbCkgewotCQkJCQlJdGVyYXRvciBub2RlTGlzdHMgPSAoKERUREZpbGUpIHBhcmVudEVsZW1lbnQpLmdldE5vZGVMaXN0cygpLml0ZXJhdG9yKCk7Ci0JCQkJCUxpc3QgdmlzaWJsZUxpc3RzID0gbmV3IEFycmF5TGlzdCg3KTsKLQkJCQkJd2hpbGUgKG5vZGVMaXN0cy5oYXNOZXh0KCkpIHsKLQkJCQkJCU5vZGVMaXN0IGxpc3QgPSAoTm9kZUxpc3QpIG5vZGVMaXN0cy5uZXh0KCk7Ci0JCQkJCQlpZiAoaXNWaXNpYmxlTm9kZUxpc3QobGlzdCkpIHsKLQkJCQkJCQl2aXNpYmxlTGlzdHMuYWRkKGxpc3QpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWxvZ2ljYWxOb2RlTGlzdHMgPSB2aXNpYmxlTGlzdHMudG9BcnJheSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gbG9naWNhbE5vZGVMaXN0czsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHJldHVybiB0aGUgdmlzaWJsZSBub2RlcwotCQkJCUxpc3QgYWxsTm9kZXMgPSAoKERUREZpbGUpIHBhcmVudEVsZW1lbnQpLmdldE5vZGVzKCk7Ci0JCQkJTGlzdCB2aXNpYmxlTm9kZXMgPSBuZXcgQXJyYXlMaXN0KGFsbE5vZGVzLnNpemUoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxOb2Rlcy5zaXplKCk7IGkrKykgewotCQkJCQlPYmplY3QgbyA9IGFsbE5vZGVzLmdldChpKTsKLQkJCQkJaWYgKGlzVmlzaWJsZU5vZGUobykpIHsKLQkJCQkJCXZpc2libGVOb2Rlcy5hZGQobyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHZpc2libGVOb2Rlcy50b0FycmF5KCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE5vZGVMaXN0KSB7Ci0JCQlyZXR1cm4gKChOb2RlTGlzdCkgcGFyZW50RWxlbWVudCkuZ2V0Tm9kZXMoKS50b0FycmF5KCk7Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCS8vIGFsd2F5cyBncm91cCB0aGUgYXR0cmlidXRlcyBkaXJlY3RseSB1bmRlciB0aGUgZWxlbWVudAotCQkJT2JqZWN0W10gY2hpbGRyZW4gPSAoKERURE5vZGUpIHBhcmVudEVsZW1lbnQpLmdldENoaWxkcmVuKCk7Ci0JCQlMaXN0IGF0dHJpYnV0ZXMgPSAoKEVsZW1lbnQpIHBhcmVudEVsZW1lbnQpLmdldEVsZW1lbnRBdHRyaWJ1dGVzKCk7Ci0JCQlPYmplY3RbXSBsb2dpY2FsQ2hpbGRyZW4gPSBuZXcgT2JqZWN0W2NoaWxkcmVuLmxlbmd0aCArIGF0dHJpYnV0ZXMuc2l6ZSgpXTsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGg7IGluZGV4KyspIHsKLQkJCQlsb2dpY2FsQ2hpbGRyZW5baW5kZXhdID0gY2hpbGRyZW5baW5kZXhdOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlsb2dpY2FsQ2hpbGRyZW5baW5kZXgrK10gPSBpdGVyLm5leHQoKTsKLQkJCX0KLQkJCXJldHVybiBsb2dpY2FsQ2hpbGRyZW47Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCXJldHVybiAoKERURE5vZGUpIHBhcmVudEVsZW1lbnQpLmdldENoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QudG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlPYmplY3RbXSBlbGVtZW50cyA9IG51bGw7Ci0JCS8vIEFsd2F5cyBzaG93IHRoZSBEVERGaWxlICJub2RlIgotCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgRFRETW9kZWxJbXBsKSB7Ci0JCQllbGVtZW50cyA9IG5ldyBPYmplY3RbXXsoKERURE1vZGVsSW1wbCkgaW5wdXRFbGVtZW50KS5nZXREVERGaWxlKCl9OwotCQl9Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQllbGVtZW50cyA9IG5ldyBPYmplY3RbMF07Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBlbGVtZW50OwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLQkJCQkvLyB0aGVuIHdlIG11c3Qgc2F5IHRoYXQgdGhlIGVsZW1lbnQgd2l0aCB0aGUgc2FtZSBuYW1lCi0JCQkJLy8gYXMgb3VyIGF0dHJpYnV0ZSdzIHBhcmVudCBhdHRyaWJ1dGVsaXN0IGlzIG91ciBwYXJlbnQKLQkJCQlwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50IGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCkgewotCQkJCQlyZXR1cm4gZ2V0UGFyZW50KHBhcmVudCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQkJLy8gdGhlbiB3ZSBtdXN0IHNheSB0aGF0IHRoZSBlbGVtZW50IHdpdGggdGhlIHNhbWUgbmFtZQotCQkJCS8vIGFzIG91ciBhdHRyaWJ1dGVsaXN0IGlzIG91ciBwYXJlbnQKLQkJCQlTdHJpbmcgYXR0TGlzdE5hbWUgPSAoKEF0dHJpYnV0ZUxpc3QpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQlJdGVyYXRvciBpdGVyID0gbm9kZS5nZXREVERGaWxlKCkuZ2V0RWxlbWVudHNBbmRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VzKCkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSAmJiBwYXJlbnQgPT0gbnVsbCkgewotCQkJCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50ICYmIGN1cnJlbnROb2RlLmdldE5hbWUoKS5lcXVhbHMoYXR0TGlzdE5hbWUpKSB7Ci0JCQkJCQlwYXJlbnQgPSBjdXJyZW50Tm9kZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJcGFyZW50ID0gKChEVEROb2RlKSBlbGVtZW50KS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0KLQkJCS8vIGlmIHNob3dpbmcgaW4gdGhlIGxvZ2ljYWwgb3JkZXIsIHJldHVybiB0aGUgSW5kZXhlZE5vZGVMaXN0Ci0JCQkvLyBhY3RpbmcgYXMgdGhlIHBhcmVudCBpbiB0aGUgdHJlZQotCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJaWYgKGlzU2hvd0xvZ2ljYWxPcmRlcigpKSB7Ci0JCQkJCU9iamVjdFtdIGluZGV4ZWROb2RlTGlzdHMgPSBnZXRDaGlsZHJlbigoKERURE1vZGVsSW1wbCkgZklucHV0T2JqZWN0KS5nZXREVERGaWxlKCkpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4ZWROb2RlTGlzdHMubGVuZ3RoICYmIHBhcmVudCA9PSBudWxsOyBpKyspIHsKLQkJCQkJCWlmIChpbmRleGVkTm9kZUxpc3RzW2ldIGluc3RhbmNlb2YgTm9kZUxpc3QpIHsKLQkJCQkJCQlpZiAoKChOb2RlTGlzdCkgaW5kZXhlZE5vZGVMaXN0c1tpXSkuZ2V0Tm9kZXMoKS5jb250YWlucyhlbGVtZW50KSkKLQkJCQkJCQkJcGFyZW50ID0gaW5kZXhlZE5vZGVMaXN0c1tpXTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcGFyZW50ID0gKChEVERNb2RlbEltcGwpIGZJbnB1dE9iamVjdCkuZ2V0RFRERmlsZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTm9kZUxpc3QgJiYgZklucHV0T2JqZWN0IGluc3RhbmNlb2YgRFRETW9kZWxJbXBsKSB7Ci0JCQlwYXJlbnQgPSAoKERURE1vZGVsSW1wbCkgZklucHV0T2JqZWN0KS5nZXREVERGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKGVsZW1lbnQpOwotCQlyZXR1cm4gY2hpbGRyZW4ubGVuZ3RoID4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJZlZpZXdlciA9IHZpZXdlcjsKLQotCQlpZiAoZklucHV0T2JqZWN0IGluc3RhbmNlb2YgRFRETW9kZWxJbXBsKSB7Ci0JCQkoKERURE1vZGVsSW1wbCkgZklucHV0T2JqZWN0KS5nZXREVERGaWxlKCkucmVtb3ZlRFRERmlsZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCWZJbnB1dE9iamVjdCA9IG5ld0lucHV0OwotCQlpZiAoZklucHV0T2JqZWN0IGluc3RhbmNlb2YgRFRETW9kZWxJbXBsKSB7Ci0JCQkoKERURE1vZGVsSW1wbCkgZklucHV0T2JqZWN0KS5nZXREVERGaWxlKCkuYWRkRFRERmlsZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBzaG93TG9naWNhbE9yZGVyLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc2hvd0xvZ2ljYWxPcmRlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3dMb2dpY2FsT3JkZXIoKSB7Ci0JCXJldHVybiBzaG93TG9naWNhbE9yZGVyOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1Zpc2libGVOb2RlKE9iamVjdCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1Zpc2libGVOb2RlTGlzdChOb2RlTGlzdCBub2RlTGlzdCkgewotCQkvKgotCQkgKiBBbGwgTm9kZXNMaXN0cyBzaG91bGQgYmUgdmlzaWJsZSBiZWNhdXNlIHlvdSBjYW4gbW9tZW50YXJpbHkgaGF2ZQotCQkgKiBhbiBBVFRMSVNUIChmb3IgZXhhbXBsZSkgd2l0aG91dCBhIGNvcnJlc3BvbmRpbmcgRUxFTUVOVAotCQkgKiBkZWNsYXJhdGlvbgotCQkgKi8KLQkJcmV0dXJuIHRydWU7Ly8gIW5vZGVMaXN0LmdldExpc3RUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlQ2hhbmdlZChEVEROb2RlIG5vZGUpIHsKLQkJaWYgKGZWaWV3ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVmlld2VyKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm5vZGUgY2hhbmdlZCBub3RpZmllZCIpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3Rpb24gYmVmb3JlID0gIiArCi0JCQkvLyAoKFN0cnVjdHVyZWRWaWV3ZXIpdmlldykuZ2V0U2VsZWN0aW9uKCkpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0ICYmIGlzU2hvd0xvZ2ljYWxPcmRlcigpKSB7Ci0JCQkJLy8gaW4gdGhpcyBjYXNlLCB3ZSBhcmUgc2hvd2luZyBhdHRyaWJ1dGVzIHVuZGVyIHRoZSBlbGVtZW50LgotCQkJCS8vIHJlZnJlc2ggdGhlIGVsZW1lbnQgb2JqZWN0IGluc3RlYWQKLQkJCQlJdGVyYXRvciBpdGVyID0gbm9kZS5nZXREVERGaWxlKCkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlEVEROb2RlIGN1cnJlbnROb2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoY3VycmVudE5vZGUuZ2V0TmFtZSgpLmVxdWFscyhub2RlLmdldE5hbWUoKSkgJiYgY3VycmVudE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJCQkoKFN0cnVjdHVyZWRWaWV3ZXIpIGZWaWV3ZXIpLnJlZnJlc2goY3VycmVudE5vZGUpOwotCQkJCQl9Ci0JCQkJfSAvLyBlbmQgb2Ygd2hpbGUgKCkKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGRvIHN0YW5kYXJkIHN0dWZmCi0JCQkJKChTdHJ1Y3R1cmVkVmlld2VyKSBmVmlld2VyKS5yZWZyZXNoKG5vZGUpOwotCQkJfQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3Rpb24gYWZ0ZXIgPSAiICsKLQkJCS8vICgoU3RydWN0dXJlZFZpZXdlcil2aWV3KS5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2Rlc0FkZGVkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZWaWV3ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFRyZWVWaWV3ZXIpIHsKLQkJCVN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIGZWaWV3ZXI7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQotCQkJT2JqZWN0IGZpcnN0T2JqID0gKCFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSA/ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkgOiBudWxsOwotCQkJRFRETm9kZSBvbGRTZWxlY3RlZE5vZGUgPSBudWxsOwotCQkJaWYgKGZpcnN0T2JqIGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJCW9sZFNlbGVjdGVkTm9kZSA9IChEVEROb2RlKSBmaXJzdE9iajsKLQkJCX0KLQotCQkJQWJzdHJhY3RUcmVlVmlld2VyIGFic3RyYWN0VHJlZVZpZXdlciA9IChBYnN0cmFjdFRyZWVWaWV3ZXIpIGZWaWV3ZXI7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZXZlbnQuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG5vZGUgPSBpdC5uZXh0KCk7Ci0JCQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChub2RlKTsKLQkJCQkvLyBCdWcgMTExMTAwIC0gSWYgaXQgaXMgYSB0b3AgbGV2ZWwgbm9kZSAoaWUuIHBhcmVudCBpcyBhCi0JCQkJLy8gRFRERmlsZSksCi0JCQkJLy8gaW5zZXJ0IHRoZSBub2RlIGRpcmVjdGx5IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRFRERmlsZSkgewotCQkJCQlPYmplY3RbXSBvYmpzID0gZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAob2Jqc1tpXSA9PSBub2RlKSB7Ci0JCQkJCQkJYWJzdHJhY3RUcmVlVmlld2VyLmluc2VydChwYXJlbnQsIG5vZGUsIGkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIElmIHRoZSBwYXJlbnQgbm9kZSBpcyBub3QgYSBEVERGaWxlLCBqdXN0IHJlZnJlc2ggdGhlCi0JCQkJLy8gcGFyZW50IGZvciBub3cKLQkJCQllbHNlIGlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlhYnN0cmFjdFRyZWVWaWV3ZXIucmVmcmVzaChwYXJlbnQpOwotCQkJCX0KLQkJCQkvLyBZb3Ugc2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgYmxvY2ssIGlmIHlvdSBkbywganVzdCByZWZyZXNoCi0JCQkJLy8gdGhlIHdob2xlIHRyZWUKLQkJCQllbHNlIHsKLQkJCQkJYWJzdHJhY3RUcmVlVmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUl0ZXJhdG9yIGl0ZXIgPSBldmVudC5nZXROb2RlcygpLml0ZXJhdG9yKCk7Ci0JCQlMaXN0IG5ld1NlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAob2xkU2VsZWN0ZWROb2RlID09IG51bGwgfHwgbm9kZS5nZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSAhPSBvbGRTZWxlY3RlZE5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkgfHwgbm9kZS5nZXRTdGFydE9mZnNldCgpICE9IG9sZFNlbGVjdGVkTm9kZS5nZXRTdGFydE9mZnNldCgpIHx8IG5vZGUuZ2V0RW5kT2Zmc2V0KCkgIT0gb2xkU2VsZWN0ZWROb2RlLmdldEVuZE9mZnNldCgpKSB7Ci0JCQkJCS8vIGFkZCB0byBzZWxlY3Rpb24KLQkJCQkJbmV3U2VsZWN0aW9uLmFkZChub2RlKTsKLQkJCQkJZXhwYW5kVG9Ob2RlKG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChuZXdTZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3U2VsZWN0aW9uKSk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVzUmVtb3ZlZChOb2Rlc0V2ZW50IGV2ZW50KSB7Ci0JCWlmIChmVmlld2VyIGluc3RhbmNlb2YgQWJzdHJhY3RUcmVlVmlld2VyKSB7Ci0JCQlBYnN0cmFjdFRyZWVWaWV3ZXIgYWJzdHJhY3RUcmVlVmlld2VyID0gKEFic3RyYWN0VHJlZVZpZXdlcikgZlZpZXdlcjsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGV2ZW50LmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJYWJzdHJhY3RUcmVlVmlld2VyLnJlbW92ZShpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc2hvd0xvZ2ljYWxPcmRlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzaG93TG9naWNhbE9yZGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNob3dMb2dpY2FsT3JkZXIoYm9vbGVhbiB2YWx1ZSkgewotCQl0aGlzLnNob3dMb2dpY2FsT3JkZXIgPSB2YWx1ZTsKLQkJaWYgKCF2YWx1ZSkgewotCQkJLy8gaWYgbm90IHVzaW5nIGxvZ2ljYWwgb3JkZXIsIGxvc2UgdGhlIGNhY2hlZCBsaXN0cwotCQkJbG9naWNhbE5vZGVMaXN0cyA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvT3JkZXJBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9PcmRlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjdiYzc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9PcmRlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMjIsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuRFRERWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb247Ci0KLWNsYXNzIE9yZGVyQWN0aW9uIGV4dGVuZHMgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb24gewotCXByaXZhdGUgRFREVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwdWJsaWMgT3JkZXJBY3Rpb24oVHJlZVZpZXdlciB2aWV3ZXIsIERURFRyZWVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIsIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBwcmVmZXJlbmNlS2V5KSB7Ci0JCXN1cGVyKERURFVJTWVzc2FnZXMuX1VJX0JVVFRPTl9HUk9VUF9JVEVNU19MT0dJQ0FMTFksIHN0b3JlLCBwcmVmZXJlbmNlS2V5LCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX09SR0FOSVpFX0RURF9MT0dJQ0FMTFkpKTsKLQkJdHJlZVZpZXdlciA9IHZpZXdlcjsKLQkJY29udGVudFByb3ZpZGVyID0gcHJvdmlkZXI7Ci0JCXNldFRvb2xUaXBUZXh0KGdldFRleHQoKSk7Ci0JCWNvbnRlbnRQcm92aWRlci5zZXRTaG93TG9naWNhbE9yZGVyKGlzQ2hlY2tlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRSZWRyYXcoZmFsc2UpOwotCQlzZXRDaGVja2VkKGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oZ2V0UHJlZmVyZW5jZUtleSgpKSk7Ci0JCU9iamVjdFtdIGV4cGFuZGVkRWxlbWVudHMgPSB0cmVlVmlld2VyLmdldEV4cGFuZGVkRWxlbWVudHMoKTsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQljb250ZW50UHJvdmlkZXIuc2V0U2hvd0xvZ2ljYWxPcmRlcihpc0NoZWNrZWQoKSk7Ci0KLQkJLy8gdHJlZVZpZXdlci5zZXRJbnB1dCh0cmVlVmlld2VyLmdldElucHV0KCkpOwotCQl0cmVlVmlld2VyLnJlZnJlc2godHJlZVZpZXdlci5nZXRJbnB1dCgpKTsKLQotCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkRWxlbWVudHMoZXhwYW5kZWRFbGVtZW50cyk7Ci0JCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyh0cnVlKTsKLQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvU29ydEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL1NvcnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyYTFmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvU29ydEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuRFRERWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb247Ci0KLWNsYXNzIFNvcnRBY3Rpb24gZXh0ZW5kcyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbiB7Ci0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwdWJsaWMgU29ydEFjdGlvbihUcmVlVmlld2VyIHZpZXdlciwgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIHByZWZlcmVuY2VLZXkpIHsKLQkJc3VwZXIoRFREVUlNZXNzYWdlcy5fVUlfQlVUVE9OX1NPUlRfSVRFTVMsIHN0b3JlLCBwcmVmZXJlbmNlS2V5LCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1NPUlQpKTsKLQkJc2V0VG9vbFRpcFRleHQoZ2V0VGV4dCgpKTsKLQkJdHJlZVZpZXdlciA9IHZpZXdlcjsKLQkJaWYgKGlzQ2hlY2tlZCgpKSB7Ci0JCQl0cmVlVmlld2VyLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZSN1cGRhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyhmYWxzZSk7Ci0JCU9iamVjdFtdIGV4cGFuZGVkRWxlbWVudHMgPSB0cmVlVmlld2VyLmdldEV4cGFuZGVkRWxlbWVudHMoKTsKLQkJaWYgKGlzQ2hlY2tlZCgpKSB7Ci0JCQl0cmVlVmlld2VyLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0cmVlVmlld2VyLnNldENvbXBhcmF0b3IobnVsbCk7Ci0JCX0KLQkJdHJlZVZpZXdlci5zZXRJbnB1dCh0cmVlVmlld2VyLmdldElucHV0KCkpOwotCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkRWxlbWVudHMoZXhwYW5kZWRFbGVtZW50cyk7Ci0JCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyh0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvdGVtcGxhdGVzL2R0ZGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvdGVtcGxhdGVzL2R0ZGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NjgyYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3RlbXBsYXRlcy9kdGRkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgU1RBUiBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgRGF2aWQgQ2FydmVyLCBTVEFSIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uLCBidWcgMTYyMzIxCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVRlbXBsYXRlcy54bWxkZWNsYXJhdGlvbi5uYW1lPXhtbCBkZWNsYXJhdGlvbgotVGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uLmRlc2M9eG1sIGRlY2xhcmF0aW9uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvdGVtcGxhdGVzL2R0ZGRlZmF1bHQtdGVtcGxhdGVzLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS90ZW1wbGF0ZXMvZHRkZGVmYXVsdC10ZW1wbGF0ZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmM2NDIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS90ZW1wbGF0ZXMvZHRkZGVmYXVsdC10ZW1wbGF0ZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIGluaXRpYWwgY29udHJpYnV0aW9uLCBidWcgMTYyMzIxCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAtLT4KLTx0ZW1wbGF0ZXM+Ci0gIDx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnRlbXBsYXRlcy54bWxkZWNsYXJhdGlvbiIgY29udGV4dD0iZHRkX25ldyIgZW5hYmxlZD0idHJ1ZSI+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iJHtlbmNvZGluZ30iPyZndDs8L3RlbXBsYXRlPgotPC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzZmOGMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL3czYy9kb20vY3NzLyoqLyoiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmNhNmNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLWh0bWxtb2RlbC5qYXIKLXRlbXAuZm9sZGVyCi1kZXYucHJvcGVydGllcwotYnVpbGQueG1sCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NmE1OWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RlYnVnPXRydWUKLW9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGVidWcvdHJhY2VmaWx0ZXI9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2E5ZmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2N2UzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotI1dlZCBNYXIgMjggMDM6MjM6MDcgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWM3YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjFjZDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYNCi1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTANCi1jb21waWxlcnMucC5idWlsZD0wDQotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xDQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MA0KLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wDQotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MA0KLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTANCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTANCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MA0KLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MA0KLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTANCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wDQotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTANCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjU5ZjAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMjAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaGFuZGxlcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuc3NpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjguMSw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAxLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5O2V4Y2x1ZGU6PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWEyYjdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBkYXRhLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbCxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzCi1zb3VyY2UuLiA9IHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9jb21wb25lbnQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NjVhZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3QuaHRtbCI+Ci0JPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuc3RhbmRhcmQuZHRkcyIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3dlYnRvb2xzL3dzdC9jb21wb25lbnRzL2h0bWwvb3ZlcnZpZXcuaHRtbCIgLz4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aSIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwiIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudmlld3MuY29udGVudG91dGxpbmUiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJIVE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AiIGZyYWdtZW50PSJmYWxzZSIgLz4KLTwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RhdGEvaHRtcmVmLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGF0YS9odG1yZWYucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkNDYwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGF0YS9odG1yZWYucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1BVGFnSW5mbz1BIGxpbmsgaWYgdGhlIGhyZWYgYXR0cmlidXRlIGlzIHByZXNlbnQsIGFuZCB0aGUgdGFyZ2V0IGZvciBhIGxpbmsgaWYgdGhlIG5hbWUgYXR0cmlidXRlIGlzIHByZXNlbnQKLUFCQlJUYWdJbmZvPUFuIGFiYnJldmlhdGlvbiAoZm9yIGV4YW1wbGUsIFdXVywgSFRUUCkKLUFDUk9OWU1UYWdJbmZvPUFuIGFjcm9ueW0gKGZvciBleGFtcGxlLCBTQ1VCQSkKLUFERFJFU1NUYWdJbmZvPUFkZHJlc3MgaW5mb3JtYXRpb24gZm9yIHRoZSBhdXRob3Igb2YgdGhlIHBhZ2UKLUFQUExFVFRhZ0luZm89QSBKYXZhIGFwcGxldAotQVJFQVRhZ0luZm89RGVmaW5lcyBhIGNsaWVudC1zaWRlIGltYWdlIG1hcCBhcmVhCi1CVGFnSW5mbz1EaXNwbGF5cyBjb250YWluZWQgdGV4dCBhcyBib2xkCi1CQVNFVGFnSW5mbz1UaGUgYmFzZSBVUkkgZm9yIHRoZSBwYWdlLCB0byBiZSB1c2VkIHdoZW4gY2FsY3VsYXRpbmcgcmVsYXRpdmUgcGF0aHMKLUJBU0VGT05UVGFnSW5mbz1UaGUgYmFzZSBmb250IHNpemUgZm9yIHRoZSBwYWdlCi1CRE9UYWdJbmZvPU92ZXJyaWRlcyBkZWZhdWx0IGJpZGlyZWN0aW9uYWwgZGlzcGxheS4gRm9yIHVzZSB3aXRoIGJpZGlyZWN0aW9uYWwgbGFuZ3VhZ2VzLgotQklHVGFnSW5mbz1EaXNwbGF5cyBjb250YWluZWQgdGV4dCBhcyBsYXJnZQotQkdTT1VORFRhZ0luZm89RGVmaW5lcyBhIHNvdW5kIGZpbGUgZm9yIHRoZSBwYWdlLiBOb3Qgc3VwcG9ydGVkIGJ5IFczQyBIVE1MIDQuMDEuCi1CTElOS1RhZ0luZm89RGlzcGxheXMgdGV4dCBhcyBibGlua2luZy4gTm90IHN1cHBvcnRlZCBieSBXM0MgSFRNTCA0LjAxLgotQkxPQ0tRVU9URVRhZ0luZm89QSBsb25nIHF1b3RhdGlvbgotQk9EWVRhZ0luZm89VGhlIGRvY3VtZW50IGJvZHkuIENvbnRhaW5zIGFsbCB0aGUgY29udGVudCBmb3IgdGhlIHBhZ2UuCi1CUlRhZ0luZm89Rm9yY2VzIGEgbGluZSBicmVhawotQlVUVE9OVGFnSW5mbz1EZWZpbmVzIGEgcHVzaCBidXR0b24KLUNBUFRJT05UYWdJbmZvPURlZmluZXMgYSB0YWJsZSBjYXB0aW9uCi1DRU5URVJUYWdJbmZvPURpc3BsYXlzIGNvbnRhaW5lZCB0ZXh0IGNlbnRlcmVkLiBFcXVpdmFsZW50IHRvIERJViB3aXRoIGFsaWduPWNlbnRlci4KLUNJVEVUYWdJbmZvPUEgY2l0YXRpb24KLUNPREVUYWdJbmZvPUEgY29tcHV0ZXIgY29kZSBmcmFnbWVudAotQ09MVGFnSW5mbz1BIHRhYmxlIGNvbHVtbgotQ09MR1JPVVBUYWdJbmZvPUEgZ3JvdXAgb2YgdGFibGUgY29sdW1ucwotRERUYWdJbmZvPUEgZGVmaW5pdGlvbiBvciBkZXNjcmlwdGlvbiBpbiBhIGRlZmluaXRpb24gb3IgZGVzY3JpcHRpb24gbGlzdAotREVMVGFnSW5mbz1EaXNwbGF5cyB0ZXh0IGFzIGRlbGV0ZWQKLURGTlRhZ0luZm89QSBkZWZpbml0aW9uCi1ESVJUYWdJbmZvPUEgZGlyZWN0b3J5IGxpc3RpbmcKLURJVlRhZ0luZm89QSBnZW5lcmljIGNvbnRhaW5lciwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGRlZmluaW5nIGxhbmd1YWdlIG9yIHN0eWxlIGZvciB0aGUgY29udGVudHMKLURMVGFnSW5mbz1BIGRlZmluaXRpb24gb3IgZGVzY3JpcHRpb24gbGlzdAotRFRUYWdJbmZvPUEgdGVybSBvciBzdWJqZWN0IGluIGEgZGVmaW5pdGlvbiBvciBkZXNjcmlwdGlvbiBsaXN0Ci1FTVRhZ0luZm89RGlzcGxheXMgdGV4dCBlbXBoYXNpemVkIChnZW5lcmFsbHkgaXRhbGljaXplZCkKLUVNQkVEVGFnSW5mbz1EZWZpbmVzIGFuIGVtYmVkZGVkIHBsdWctaW4uIE5vdCBzdXBwb3J0ZWQgYnkgVzNDIEhUTUwgNC4wMS4KLUZJRUxEU0VUVGFnSW5mbz1EZWZpbmVzIGEgZm9ybSBjb250cm9sIGdyb3VwCi1GT05UVGFnSW5mbz1EaXNwbGF5cyB0ZXh0IGluIHRoZSBnaXZlbiBmb250Ci1GT1JNVGFnSW5mbz1EZWZpbmVzIGFuIGludGVyYWN0aXZlIGZvcm0KLUZSQU1FVGFnSW5mbz1EZWZpbmVzIGEgZnJhbWUgd2l0aGluIHRoZSBjdXJyZW50IHdpbmRvdwotRlJBTUVTRVRUYWdJbmZvPURlZmluZXMgYSBmcmFtZXNldCB0aGF0IGRpdmlkZXMgdGhlIHdpbmRvdyBpbnRvIGZyYW1lcwotSDFUYWdJbmZvPUEgdG9wLWxldmVsIGhlYWRpbmcKLUgyVGFnSW5mbz1BIHNlY29uZC1sZXZlbCBoZWFkaW5nCi1IM1RhZ0luZm89QSB0aGlyZC1sZXZlbCBoZWFkaW5nCi1INFRhZ0luZm89QSBmb3VydGgtbGV2ZWwgaGVhZGluZwotSDVUYWdJbmZvPUEgZmlmdGgtbGV2ZWwgaGVhZGluZwotSDZUYWdJbmZvPUEgc2l4dGgtbGV2ZWwgaGVhZGluZwotSEVBRFRhZ0luZm89Q29udGFpbnMgbWV0YWRhdGEgYW5kIHdpbmRvdyB0aXRsZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGRvY3VtZW50Ci1IUlRhZ0luZm89QSBob3Jpem9udGFsIHJ1bGUKLUhUTUxUYWdJbmZvPVRoZSByb290IGVsZW1lbnQgZm9yIHRoZSBkb2N1bWVudC4KLUlUYWdJbmZvPURpc3BsYXlzIHRleHQgYXMgaXRhbGljCi1JRlJBTUVUYWdJbmZvPURlZmluZXMgYW4gaW5saW5lIHN1YndpbmRvdwotSU1HVGFnSW5mbz1EaXNwbGF5cyB0aGUgcmVmZXJlbmNlZCBpbWFnZSBhcyBlbWJlZGRlZCBjb250ZW50Ci1JTlBVVFRhZ0luZm89RGVmaW5lcyBhIGZvcm0gY29udHJvbCBmb3IgdXNlciBpbnB1dAotSU5TVGFnSW5mbz1EZWZpbmVzIGluc2VydGVkIHRleHQKLUlTSU5ERVhUYWdJbmZvPURlZmluZXMgYSBzaW5nbGUgbGluZSBwcm9tcHQKLUtCRFRhZ0luZm89RGVmaW5lcyB0ZXh0IHRvIGJlIGVudGVyZWQgYnkgdGhlIHVzZXIKLUxBQkVMVGFnSW5mbz1EZWZpbmVzIHRoZSBsYWJlbCBmb3IgYSBmb3JtIGZpZWxkCi1MRUdFTkRUYWdJbmZvPURlZmluZXMgdGhlIGxhYmVsIGZvciBhIHNldCBvZiBmb3JtIGZpZWxkcwotTElUYWdJbmZvPURlZmluZXMgYSBsaXN0IGl0ZW0gd2l0aGluIGEgbGlzdAotTElOS1RhZ0luZm89QSBtZWRpYS1pbmRlcGVuZGVudCBsaW5rCi1NQVBUYWdJbmZvPURlZmluZXMgYSBjbGllbnQtc2lkZSBpbWFnZSBtYXAKLU1BUlFVRUVUYWdJbmZvPURpc3BsYXlzIHRleHQgYXMgc2Nyb2xsaW5nLiBOb3Qgc3VwcG9ydGVkIGJ5IFczQyBIVE1MIDQuMDEuCi1NRU5VVGFnSW5mbz1EZWZpbmVzIGEgbWVudSBsaXN0Ci1NRVRBVGFnSW5mbz1EZWZpbmVzIG1ldGFkYXRhIGluZm9ybWF0aW9uIGZvciB0aGUgZG9jdW1lbnQKLU5PQlJUYWdJbmZvPU92ZXJyaWRlcyBhbmQgcHJldmVudHMgbGluZSBicmVha3MuIE5vdCBzdXBwb3J0ZWQgYnkgVzNDIEhUTUwgNC4wMS4KLU5PRlJBTUVTVGFnSW5mbz1Qcm92aWRlcyBpbmZvcm1hdGlvbiB0byBkaXNwbGF5IGlmIHRoZSBjdXJyZW50IGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBmcmFtZXMKLU5PU0NSSVBUVGFnSW5mbz1Qcm92aWRlcyBpbmZvcm1hdGlvbiB0byBkaXNwbGF5IGlmIHRoZSBjdXJyZW50IGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBzY3JpcHRpbmcKLU9CSkVDVFRhZ0luZm89RGVmaW5lcyBhIGdlbmVyaWMgZW1iZWRkZWQgb2JqZWN0Ci1PTFRhZ0luZm89QW4gb3JkZXJlZCBsaXN0Ci1PUFRHUk9VUFRhZ0luZm89QW4gb3B0aW9uIGdyb3VwCi1PUFRJT05UYWdJbmZvPUEgc2VsZWN0YWJsZSBjaG9pY2UKLVBUYWdJbmZvPUEgcGFyYWdyYXBoCi1QQVJBTVRhZ0luZm89QSBuYW1lZCBwcm9wZXJ0eSB2YWx1ZQotUFJFVGFnSW5mbz1QcmVmb3JtYXR0ZWQgdGV4dAotUVRhZ0luZm89QSBzaG9ydCBpbmxpbmUgcXVvdGF0aW9uCi1TVGFnSW5mbz1EaXNwbGF5IHRleHQgaW4gc3RyaWtlLXRocm91Z2ggc3R5bGUKLVNBTVBUYWdJbmZvPVNhbXBsZSBwcm9ncmFtIG91dHB1dCwgc2NyaXB0cywgZXRjLiBEaXNwbGF5cyBpbiBtb25vc3BhY2UgZm9udC4KLVNDUklQVFRhZ0luZm89U2NyaXB0IHN0YXRlbWVudHMKLVNFTEVDVFRhZ0luZm89QW4gb3B0aW9uIHNlbGVjdG9yCi1TTUFMTFRhZ0luZm89RGlzcGxheXMgdGV4dCBhcyBzbWFsbAotU1BBTlRhZ0luZm89QSBnZW5lcmljIGNvbnRhaW5lciwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGRlZmluaW5nIGxhbmd1YWdlIG9yIHN0eWxlIGZvciB0aGUgY29udGVudHMKLVNUUklLRVRhZ0luZm89RGlzcGxheSB0ZXh0IGluIHN0cmlrZS10aHJvdWdoIHN0eWxlCi1TVFJPTkdUYWdJbmZvPURpc3BsYXlzIHRleHQgYXMgc3Ryb25nbHkgZW1waGFzaXplZCAoZ2VuZXJhbGx5IGJvbGQpCi1TVFlMRVRhZ0luZm89RGVmaW5lcyBhIHN0eWxlIGZvciB0aGUgY29udGFpbmVkIGluZm9ybWF0aW9uCi1TVUJUYWdJbmZvPURpc3BsYXkgYXMgc3Vic2NyaXB0Ci1TVVBUYWdJbmZvPURpc3BsYXkgYXMgc3VwZXJzY3JpcHQKLVRBQkxFVGFnSW5mbz1EZWZpbmVzIGEgdGFibGUKLVRCT0RZVGFnSW5mbz1UaGUgYm9keSBvZiB0aGUgdGFibGUKLVREVGFnSW5mbz1BIGNlbGwgd2l0aGluIGEgdGFibGUKLVRFWFRBUkVBVGFnSW5mbz1BIG11bHRpLWxpbmUgdGV4dCBmaWVsZAotVEZPT1RUYWdJbmZvPUEgdGFibGUgZm9vdGVyCi1USFRhZ0luZm89QSB0YWJsZSBoZWFkZXIgY2VsbAotVEhFQURUYWdJbmZvPUEgdGFibGUgaGVhZGVyCi1USVRMRVRhZ0luZm89VGhlIGRvY3VtZW50IHRpdGxlLCBkaXNwbGF5ZWQgaW4gdGhlIGJyb3dzZXIncyB0aXRsZSBiYXIKLVRSVGFnSW5mbz1BIHRhYmxlIHJvdwotVFRUYWdJbmZvPURpc3BsYXlzIHRleHQgaW4gdGVsZXR5cGUgb3IgbW9ub3NwYWNlZCB0ZXh0IHN0eWxlCi1VVGFnSW5mbz1EaXNwbGF5cyB0ZXh0IGFzIHVuZGVybGluZWQKLVVMVGFnSW5mbz1BbiB1bm9yZGVyZWQgbGlzdAotVkFSVGFnSW5mbz1BbiBpbnN0YW5jZSBvZiBhIHZhcmlhYmxlIG9yIHByb2dyYW0gYXJndW1lbnQKLVdCUlRhZ0luZm89QWxsb3dzIGEgbGluZSBicmVhayB3aXRoaW4gPEI+Jmx0O05PQlImZ3Q7PC9CPiB0YWcuIE5vdCBzdXBwb3J0ZWQgYnkgVzNDIEhUTUwgNC4wMS4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGF0YS9odG1yZWYueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2JjZDY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAtLT4KLTxhYnN0cmFjdEdyYW1tYXJBbm5vdGF0aW9ucyBwcm9wZXJ0aWVzTG9jYXRpb249Imh0bXJlZiIgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkEiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUFUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQUJCUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQUJCUlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJBQ1JPTllNIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVBQ1JPTllNVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkFERFJFU1MiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUFERFJFU1NUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQVBQTEVUIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVBUFBMRVRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQVJFQSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQVJFQVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVCVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkJBU0UiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUJBU0VUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQkFTRUZPTlQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUJBU0VGT05UVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkJETyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQkRPVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkJHU09VTkQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUJHU09VTkRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQklHIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVCSUdUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQkxJTksiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUJMSU5LVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkJMT0NLUVVPVEUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUJMT0NLUVVPVEVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQk9EWSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQk9EWVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQlJUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQlVUVE9OIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVCVVRUT05UYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQ0FQVElPTiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQ0FQVElPTlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJDRU5URVIiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUNFTlRFUlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJDSVRFIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVDSVRFVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkNPREUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUNPREVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQ09MIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVDT0xUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQ09MR1JPVVAiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUNPTEdST1VQVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkREIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVERFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJERUwiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JURFTFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJERk4iPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JURGTlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJESVIiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JURJUlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJESVYiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JURJVlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJETCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRExUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iRFQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JURUVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkVNIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVFTVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJFTUJFRCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRU1CRURUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iRklFTERTRVQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUZJRUxEU0VUVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkZPTlQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUZPTlRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iRk9STSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRk9STVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJGUkFNRSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRlJBTUVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iRlJBTUVTRVQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUZSQU1FU0VUVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkgxIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVIMVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJIMiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSDJUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSDMiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUgzVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ikg0Ij4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVINFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJINSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSDVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSDYiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUg2VGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkhFQUQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUhFQURUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSFIiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUhSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkhUTUwiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUhUTUxUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJJRlJBTUUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUlGUkFNRVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJJTUciPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUlNR1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJJTlBVVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSU5QVVRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSU5TIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVJTlNUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSVNJTkRFWCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSVNJTkRFWFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJLQkQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUtCRFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJMQUJFTCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTEFCRUxUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iTEVHRU5EIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVMRUdFTkRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iTEkiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUxJVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkxJTksiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUxJTktUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iTUFQIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVNQVBUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iTUFSUVVFRSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTUFSUVVFRVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJNRU5VIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVNRU5VVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ik1FVEEiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JU1FVEFUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iTk9CUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTk9CUlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJOT0ZSQU1FUyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTk9GUkFNRVNUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iTk9TQ1JJUFQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JU5PU0NSSVBUVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ik9CSkVDVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lT0JKRUNUVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ik9MIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVPTFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJPUFRHUk9VUCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lT1BUR1JPVVBUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iT1BUSU9OIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVPUFRJT05UYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iUCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lUFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJQQVJBTSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lUEFSQU1UYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iUFJFIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVQUkVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iUSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lUVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVTVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlNBTVAiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNBTVBUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU0NSSVBUIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVTQ1JJUFRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU0VMRUNUIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVTRUxFQ1RUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU01BTEwiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNNQUxMVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlNQQU4iPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNQQU5UYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU1RSSUtFIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVTVFJJS0VUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU1RST05HIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVTVFJPTkdUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU1RZTEUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNUWUxFVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlNVQiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lU1VCVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlNVUCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lU1VQVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlRBQkxFIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVUQUJMRVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJUQk9EWSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVEJPRFlUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVEQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVREVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlRFWFRBUkVBIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVURVhUQVJFQVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJURk9PVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVEZPT1RUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVEgiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVRIVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlRIRUFEIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVUSEVBRFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJUSVRMRSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVElUTEVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVFIiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVRSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlRUIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVUVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJVIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVVVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlVMIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVVTFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJWQVIiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVZBUlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJXQlIiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVdCUlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLTwvYWJzdHJhY3RHcmFtbWFyQW5ub3RhdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmEyNDg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1TdHJ1Y3R1cmVkIFNvdXJjZSBIVE1MIE1vZGVsCi1TdHJ1Y3R1cmVkX0hUTUxfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZT1TdHJ1Y3R1cmVkIEhUTUwgRG9jdW1lbnQgRmFjdG9yeSBFeHRlbnNpb24KLUhUTUxfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SFRNTAotX3Rhc2tNYXJrZXIubmFtZT1IVE1MIFRhc2sKLV92YWxpZGF0aW9uTWFya2VyLm5hbWU9SFRNTCBQcm9ibGVtCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmQ1NjI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsSGFuZGxlciI+Ci0JCTxtb2RlbEhhbmRsZXIKLQkJCWRlZmF1bHQ9Im5vIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckhUTUwiCi0JCQlhc3NvY2lhdGVkQ29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyIj4KLQkJPC9tb2RlbEhhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZW1iZWRkZWRUeXBlSGFuZGxlciI+Ci0JCTxlbWJlZGRlZFR5cGVIYW5kbGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRIVE1MIj4KLQkJPC9lbWJlZGRlZFR5cGVIYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRhc2tzY2FubmVyIj4KLQkJPHNjYW5uZXIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnRhc2tzLkhUTUxGaWxlVGFza1NjYW5uZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRhc2tzLlhNTEZpbGVUYXNrU2Nhbm5lcjpvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRhc2tNYXJrZXIiCi0JCQljb250ZW50VHlwZUlkcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJaWQ9InRhc2tNYXJrZXIiCi0JCW5hbWU9IiVfdGFza01hcmtlci5uYW1lIgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0JCTxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy50YXNrbWFya2VyIi8+Ci0JCTxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+Ci0JPC9leHRlbnNpb24+Ci0gICAgPGV4dGVuc2lvbgotICAgICAgIGlkPSJ2YWxpZGF0aW9uTWFya2VyIgotICAgICAgICBuYW1lPSIlX3ZhbGlkYXRpb25NYXJrZXIubmFtZSIKLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgotICAgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnByb2JsZW1tYXJrZXIiLz4KLSAgICAgIDxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+Ci0gICAgPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmRvY3VtZW50Q3JlYXRpb24iCi0JCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmRvY3VtZW50ZmFjdG9yaWVzIgotCQluYW1lPSIlU3RydWN0dXJlZF9IVE1MX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5maWxlYnVmZmVycy5CYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY29tbWVudEVsZW1lbnRIYW5kbGVyIj4KLQkJPGhhbmRsZXItY3VzdG9tCi0JCQljb21tZW50dHlwZT0ieG1sIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaGFuZGxlcnMuQ29tbWVudEVsZW1lbnRIYW5kbGVyRm9yU1NJIj4KLQkJCTxzdGFydHdpdGggcHJlZml4PSIjIj48L3N0YXJ0d2l0aD4KLQkJPC9oYW5kbGVyLWN1c3RvbT4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5maWxlVHlwZXMiPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJodG1sIj4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249Imh0bSI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJ4aHRtbCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJodHBsIj4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249IndtbCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJzaHRtbCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJzaHRtIj4KLQkJPC9maWxlVHlwZXM+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0UHJvY2Vzc29ycyI+Ci0JCTxwcm9jZXNzb3IKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdC5IVE1MRm9ybWF0UHJvY2Vzc29ySW1wbCIKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSI+Ci0JCTwvcHJvY2Vzc29yPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBFeHRlbnNpb24gcG9pbnQgZm9yIHRhZ2hlbHAgZG9jdW1lbnRhdGlvbiAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuYW5ub3RhdGlvbkZpbGVzIj4KLQkJPGFubm90YXRpb25GaWxlCi0JCQlsb2NhdGlvbj0iZGF0YS9odG1yZWYueG1sIgotCQkJcHVibGljSWQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIj4KLQkJPC9hbm5vdGF0aW9uRmlsZT4KLQkJPGFubm90YXRpb25GaWxlCi0JCQlsb2NhdGlvbj0iZGF0YS9odG1yZWYueG1sIgotCQkJcHVibGljSWQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQkJPC9hbm5vdGF0aW9uRmlsZT4KLQkJPGFubm90YXRpb25GaWxlCi0JCQlsb2NhdGlvbj0iZGF0YS9odG1yZWYueG1sIgotCQkJcHVibGljSWQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBGcmFtZXNldC8vRU4iPgotCQk8L2Fubm90YXRpb25GaWxlPgotCQk8YW5ub3RhdGlvbkZpbGUKLQkJCWxvY2F0aW9uPSJkYXRhL2h0bXJlZi54bWwiCi0JCQlwdWJsaWNJZD0iLS8vVzNDLy9EVEQgWEhUTUwgQmFzaWMgMS4wLy9FTiI+Ci0JCTwvYW5ub3RhdGlvbkZpbGU+Ci0JCTxhbm5vdGF0aW9uRmlsZQotCQkJbG9jYXRpb249ImRhdGEvaHRtcmVmLnhtbCIKLQkJCXB1YmxpY0lkPSItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIj4KLQkJPC9hbm5vdGF0aW9uRmlsZT4KLQkJPGFubm90YXRpb25GaWxlCi0JCQlsb2NhdGlvbj0iZGF0YS9odG1yZWYueG1sIgotCQkJcHVibGljSWQ9Ii0vL1dBUEZPUlVNLy9EVEQgWEhUTUwgTW9iaWxlIDEuMC8vRU4iPgotCQk8L2Fubm90YXRpb25GaWxlPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyI+Ci0JCTxjb250ZW50LXR5cGUKLQkJCWZpbGUtZXh0ZW5zaW9ucz0iaHRtbCxodG0seGh0bWwsaHRwbCx3bWwsc2h0bWwsc2h0bSIKLQkJCXByaW9yaXR5PSJoaWdoIgotCQkJbmFtZT0iJUhUTUxfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQlpZD0iaHRtbHNvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnRleHQiPgotCQkJPCEtLSBub3RlOiBubyBkZWZhdWx0LWNoYXJzZXQgZm9yIEhUTUwsIHNob3VsZCB1c2UgJ3BsYXRmb3JtJyAtLT4KLQkJCTxkZXNjcmliZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5Db250ZW50RGVzY3JpYmVyRm9ySFRNTCIgLz4KLQkJPC9jb250ZW50LXR5cGU+Ci0JPC9leHRlbnNpb24+Ci0KLTwhLS0gbW92ZWQgdG8gd2hlcmUgdGhlIGR0ZCdzIGFyZSBjb250cmlidXRlZAotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRvY3VtZW50VHlwZXMiPgotCQk8ZG9jdW1lbnRUeXBlCi0JCQllbGVtZW50TmFtZT0iaHRtbCIKLQkJCWRpc3BsYXlOYW1lPSJYSFRNTCAxLjAgU3RyaWN0IgotCQkJbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotCQkJaXNYSFRNTD0idHJ1ZSIKLQkJCWhhc0ZyYW1lc2V0PSJmYWxzZSIKLQkJCXB1YmxpY0lEPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLQkJCXN5c3RlbUlEPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLQkJPC9kb2N1bWVudFR5cGU+Ci0JCTxkb2N1bWVudFR5cGUKLQkJCWVsZW1lbnROYW1lPSJodG1sIgotCQkJZGlzcGxheU5hbWU9IlhIVE1MIDEuMCBUcmFuc2l0aW9uYWwiCi0JCQluYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0JCQlpc1hIVE1MPSJ0cnVlIgotCQkJaGFzRnJhbWVzZXQ9ImZhbHNlIgotCQkJcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotCQkJZGVmYXVsdFhIVE1MPSJ0cnVlIgotCQkJc3lzdGVtSUQ9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotCQk8L2RvY3VtZW50VHlwZT4KLQkJPGRvY3VtZW50VHlwZQotCQkJZWxlbWVudE5hbWU9Imh0bWwiCi0JCQlkaXNwbGF5TmFtZT0iWEhUTUwgMS4wIEZyYW1lc2V0IgotCQkJbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotCQkJaXNYSFRNTD0idHJ1ZSIKLQkJCWhhc0ZyYW1lc2V0PSJ0cnVlIgotCQkJcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBGcmFtZXNldC8vRU4iCi0JCQlzeXN0ZW1JRD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtZnJhbWVzZXQuZHRkIj4KLQkJPC9kb2N1bWVudFR5cGU+Ci0JCTxkb2N1bWVudFR5cGUKLQkJCWVsZW1lbnROYW1lPSJodG1sIgotCQkJZGlzcGxheU5hbWU9IlhIVE1MIEJhc2ljIDEuMCIKLQkJCW5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLQkJCWlzWEhUTUw9InRydWUiCi0JCQloYXNGcmFtZXNldD0iZmFsc2UiCi0JCQlwdWJsaWNJRD0iLS8vVzNDLy9EVEQgWEhUTUwgQmFzaWMgMS4wLy9FTiIKLQkJCXN5c3RlbUlEPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1iYXNpYy94aHRtbC1iYXNpYzEwLmR0ZCI+Ci0JCTwvZG9jdW1lbnRUeXBlPgotCQk8ZG9jdW1lbnRUeXBlCi0JCQllbGVtZW50TmFtZT0iaHRtbCIKLQkJCWRpc3BsYXlOYW1lPSJYSFRNTCAxLjEiCi0JCQluYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0JCQlpc1hIVE1MPSJ0cnVlIgotCQkJaGFzRnJhbWVzZXQ9ImZhbHNlIgotCQkJcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iCi0JCQlzeXN0ZW1JRD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPgotCQk8L2RvY3VtZW50VHlwZT4KLQkJPGRvY3VtZW50VHlwZQotCQkJZWxlbWVudE5hbWU9Imh0bWwiCi0JCQlkaXNwbGF5TmFtZT0iWEhUTUwgTVAgMS4wIgotCQkJbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotCQkJaXNYSFRNTD0idHJ1ZSIKLQkJCWhhc0ZyYW1lc2V0PSJmYWxzZSIKLQkJCXB1YmxpY0lEPSItLy9XQVBGT1JVTS8vRFREIFhIVE1MIE1vYmlsZSAxLjAvL0VOIgotCQkJc3lzdGVtSUQ9Imh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC94aHRtbC1tb2JpbGUxMC5kdGQiPgotCQk8L2RvY3VtZW50VHlwZT4KLQkJPGRvY3VtZW50VHlwZQotCQkJZWxlbWVudE5hbWU9IndtbCIKLQkJCWRpc3BsYXlOYW1lPSJXTUwgMS4zIgotCQkJbmFtZXNwYWNlVVJJPSIiCi0JCQlpc1dNTD0idHJ1ZSIKLQkJCWhhc0ZyYW1lc2V0PSJmYWxzZSIKLQkJCXB1YmxpY0lEPSItLy9XQVBGT1JVTS8vRFREIFdNTCAxLjMvL0VOIgotCQkJZGVmYXVsdFdNTD0idHJ1ZSIKLQkJCXN5c3RlbUlEPSJodHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQvd21sMTMuZHRkIj4KLQkJPC9kb2N1bWVudFR5cGU+Ci0JPC9leHRlbnNpb24+Ci0tLT4KLQk8IS0tIGluaXRpYWxpemUgaHRtbCBjb3JlIHByZWZlcmVuY2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0hUTUxDb250ZW50QnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0hUTUxDb250ZW50QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTMzZjFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9IVE1MQ29udGVudEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NQ29udGVudEJ1aWxkZXJJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MQ29udGVudEJ1aWxkZXIgZXh0ZW5kcyBET01Db250ZW50QnVpbGRlckltcGwgewotCi0JcHJpdmF0ZSBpbnQgZlRhZ0Nhc2U7Ci0JcHJpdmF0ZSBpbnQgZkF0dHJDYXNlOwotCi0JLyoqCi0JICogRE9NQ29udGVudEJ1aWxkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gZG9jdW1lbnQgb3JnLnczYy5kb20uRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSFRNTENvbnRlbnRCdWlsZGVyKERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXN1cGVyKGRvY3VtZW50KTsKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJZlRhZ0Nhc2UgPSBwcmVmcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSk7Ci0JCWZBdHRyQ2FzZSA9IHByZWZzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSk7Ci0JCS8vCUVsZW1lbnQgY2FzZVNldHRpbmdzID0gSFRNTFByZWZlcmVuY2VNYW5hZ2VyLmdldEhUTUxJbnN0YW5jZSgpLmdldEVsZW1lbnQoUHJlZmVyZW5jZU5hbWVzLlBSRUZFUlJFRF9DQVNFKTsKLQkJLy8JZlRhZ0Nhc2UgPSBjYXNlU2V0dGluZ3MuZ2V0QXR0cmlidXRlKFByZWZlcmVuY2VOYW1lcy5UQUdOQU1FKTsKLQkJLy8JZkF0dHJDYXNlID0gY2FzZVNldHRpbmdzLmdldEF0dHJpYnV0ZShQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFTkFNRSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBjb21wdXRlTmFtZShDTU5vZGUgY21ub2RlLCBOb2RlIHBhcmVudCkgewotCQlTdHJpbmcgbmFtZSA9IHN1cGVyLmNvbXB1dGVOYW1lKGNtbm9kZSwgcGFyZW50KTsKLQkJLy8gZG9uJ3QgY2hhbmdlIHRoZSBjYXNlIHVubGVzcyB3ZSdyZSBjZXJ0YWluIGl0IGlzIG1lYW5pbmdsZXNzCi0JCS8vCWlmIChjbW5vZGUgaW5zdGFuY2VvZiBIVE1MQ01Ob2RlICYmICgoSFRNTENNTm9kZSkgY21ub2RlKS5zaG91bGRJZ25vcmVDYXNlKCkpIHsKLQkJaWYgKHNob3VsZElnbm9yZUNhc2UoY21ub2RlKSkgewotCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJaWYgKGZUYWdDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKQotCQkJCQluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQkJCWVsc2UgaWYgKGZUYWdDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCQluYW1lID0gbmFtZS50b1VwcGVyQ2FzZSgpOwotCQkJCS8vIGVsc2UgZG8gbm90aGluZwotCQkJfQotCQkJZWxzZSBpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCWlmIChmQXR0ckNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpCi0JCQkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJZWxzZSBpZiAoZkF0dHJDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCQluYW1lID0gbmFtZS50b1VwcGVyQ2FzZSgpOwotCQkJCS8vIGVsc2UgZG8gbm90aGluZwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZElnbm9yZUNhc2UoQ01Ob2RlIGNtbm9kZSkgewotCQlpZiAoIWNtbm9kZS5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoKEJvb2xlYW4pIGNtbm9kZS5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9IVE1MQ29yZU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmY2ZGYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9IVE1MQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgSFRNTCBDb3JlCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSFRNTENvcmVNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vX2Vycm9yX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5kZWZpbmVkX2F0dHJpYnV0ZV9uYW1lX19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuZGVmaW5lZF9hdHRyaWJ1dGVfdmFsdWVfX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNdWx0aXBsZV92YWx1ZXNfc3BlY2lmaWVkX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX25hbWVfX18wX19fdXNlc19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfYXR0cmlidXRlX25hbWVfX18wX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkX2F0dHJpYnV0ZV9fXzBfX19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfbG9jYXRpb25fb2ZfdGFnX19fX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEdXBsaWNhdGVfdGFnX19fMF9fX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fc3RhcnRfdGFnX19fXzBfX19fX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb19lbmRfdGFnX19fX18wX19fX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kX3RhZ19fX19fMF9fX19ub3RfbmVlZGVfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVua25vd25fdGFnX19fMF9fX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnX25hbWVfX18wX19fdXNlc193cm9uZ19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfdGFnX25hbWVfX18wX19fX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkX0pTUF9kaXJlY3RpdmVfX18wX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZF90ZXh0X3N0cmluZ19fXzBfX19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfY2hhcmFjdGVyX3VzZWRfaW5fX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmtub3duX2Vycm9yX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhcnRfdGFnX19fXzBfX19fbm90X2Nsb3NfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZF90YWdfX19fXzBfX19fbm90X2Nsb3NlX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfdmFsdWVfX18wX19fdXNlc19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbWVudF9ub3RfY2xvc2VkX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRE9DVFlQRV9kZWNsYXJhdGlvbl9ub3RfY2xfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NpbmdfaW5zdHJ1Y3Rpb25fbm90X0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDREFUQV9zZWN0aW9uX25vdF9jbG9zZWRfX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfVGFnX19fMF9fX3Nob3VsZF9iZV9hbl9lbXB0eV9lbGVtZW50X3RhZ18xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9BdHRyaWJ1dGVfdmFsdWVfX18wX19fbm90X2Nsb3NlZF9fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmc7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSFRNTENvcmVNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgSFRNTENvcmVNZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9IVE1MQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWE0ODZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9IVE1MQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIEhUTUxDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEhUTUxDb3JlUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgSFRNTENvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSFRNTENvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQotCQkvLyBsaXN0ZW4gZm9yIHJlc291cmNlIGNoYW5nZXMgdG8gdXBkYXRlIGNvbnRlbnQgcHJvcGVydGllcyBrZXlzCi0JCUhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXIuc3RhcnR1cCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gc3RvcCBsaXN0ZW5uaW5nIGZvciByZXNvdXJjZSBjaGFuZ2VzIHRvIHVwZGF0ZSBjb250ZW50IHByb3BlcnRpZXMKLQkJLy8ga2V5cwotCQlIVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLnNodXRkb3duKCk7Ci0KLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9IVE1MQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2IwNGI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9IVE1MQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTm9fZXJyb3JfX1VJXz1ObyBlcnJvci4KLVVuZGVmaW5lZF9hdHRyaWJ1dGVfbmFtZV9fX0VSUk9SXz1VbmRlZmluZWQgYXR0cmlidXRlIG5hbWUgKHswfSkuCi1VbmRlZmluZWRfYXR0cmlidXRlX3ZhbHVlX19FUlJPUl89VW5kZWZpbmVkIGF0dHJpYnV0ZSB2YWx1ZSAoezB9KS4KLU11bHRpcGxlX3ZhbHVlc19zcGVjaWZpZWRfX0VSUk9SXz1NdWx0aXBsZSB2YWx1ZXMgc3BlY2lmaWVkIGZvciBhbiBhdHRyaWJ1dGUgKHswfSkuCi1BdHRyaWJ1dGVfbmFtZV9fXzBfX191c2VzX19FUlJPUl89QXR0cmlidXRlIG5hbWUgKHswfSkgdXNlcyB3cm9uZyBjYXNlIGNoYXJhY3Rlci4KLUludmFsaWRfYXR0cmlidXRlX25hbWVfX18wX0VSUk9SXz1JbnZhbGlkIGF0dHJpYnV0ZSBuYW1lICh7MH0pLgotSW52YWxpZF9hdHRyaWJ1dGVfX18wX19fX0VSUk9SXz1JbnZhbGlkIGF0dHJpYnV0ZSAoezB9KS4KLUludmFsaWRfbG9jYXRpb25fb2ZfdGFnX19fX0VSUk9SXz1JbnZhbGlkIGxvY2F0aW9uIG9mIHRhZyAoezB9KS4KLUR1cGxpY2F0ZV90YWdfX18wX19fX0VSUk9SXz1EdXBsaWNhdGUgdGFnICh7MH0pLgotTm9fc3RhcnRfdGFnX19fXzBfX19fX0VSUk9SXz1ObyBzdGFydCB0YWcgKDx7MH0+KS4KLU5vX2VuZF90YWdfX19fXzBfX19fX0VSUk9SXz1ObyBlbmQgdGFnICg8L3swfT4pLgotRW5kX3RhZ19fX19fMF9fX19ub3RfbmVlZGVfRVJST1JfPUVuZCB0YWcgKDwvezB9Pikgbm90IG5lZWRlZC4KLVVua25vd25fdGFnX19fMF9fX19FUlJPUl89VW5rbm93biB0YWcgKHswfSkuCi1UYWdfbmFtZV9fXzBfX191c2VzX3dyb25nX19FUlJPUl89VGFnIG5hbWUgKHswfSkgdXNlcyB3cm9uZyBjYXNlIGNoYXJhY3Rlci4KLUludmFsaWRfdGFnX25hbWVfX18wX19fX0VSUk9SXz1JbnZhbGlkIHRhZyBuYW1lICh7MH0pLgotSW52YWxpZF9KU1BfZGlyZWN0aXZlX19fMF9fRVJST1JfPUludmFsaWQgSlNQIGRpcmVjdGl2ZSAoezB9KS4KLUludmFsaWRfdGV4dF9zdHJpbmdfX18wX19fX0VSUk9SXz1JbnZhbGlkIHRleHQgc3RyaW5nICh7MH0pLgotSW52YWxpZF9jaGFyYWN0ZXJfdXNlZF9pbl9fRVJST1JfPUludmFsaWQgY2hhcmFjdGVyIHVzZWQgaW4gdGV4dCBzdHJpbmcgKHswfSkuCi1Vbmtub3duX2Vycm9yX19FUlJPUl89VW5rbm93biBlcnJvci4KLVN0YXJ0X3RhZ19fX18wX19fX25vdF9jbG9zX0VSUk9SXz1TdGFydCB0YWcgKDx7MH0+KSBub3QgY2xvc2VkLgotRW5kX3RhZ19fX19fMF9fX19ub3RfY2xvc2VfRVJST1JfPUVuZCB0YWcgKDwvezB9Pikgbm90IGNsb3NlZC4KLUF0dHJpYnV0ZV92YWx1ZV9fXzBfX191c2VzX0VSUk9SXz1BdHRyaWJ1dGUgdmFsdWUgKHswfSkgdXNlcyB3cm9uZyBjYXNlIGNoYXJhY3Rlci4KLUNvbW1lbnRfbm90X2Nsb3NlZF9fRVJST1JfPUNvbW1lbnQgbm90IGNsb3NlZC4KLURPQ1RZUEVfZGVjbGFyYXRpb25fbm90X2NsX0VSUk9SXz1ET0NUWVBFIGRlY2xhcmF0aW9uIG5vdCBjbG9zZWQuCi1Qcm9jZXNzaW5nX2luc3RydWN0aW9uX25vdF9FUlJPUl89UHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub3QgY2xvc2VkLgotQ0RBVEFfc2VjdGlvbl9ub3RfY2xvc2VkX19FUlJPUl89Q0RBVEEgc2VjdGlvbiBub3QgY2xvc2VkLgotIyBGcm9tIGhlcmUsIHRoZSBuZXcgbWVzc2FnZXMgYXJlIGFkZGVkIGZvciBWNQotX0VSUk9SX1RhZ19fXzBfX19zaG91bGRfYmVfYW5fZW1wdHlfZWxlbWVudF90YWdfMT1UYWcgKHswfSkgc2hvdWxkIGJlIGFuIGVtcHR5LWVsZW1lbnQgdGFnLgotX0VSUk9SX0F0dHJpYnV0ZV92YWx1ZV9fXzBfX19ub3RfY2xvc2VkX18xPUF0dHJpYnV0ZSB2YWx1ZSAoezB9KSBub3QgY2xvc2VkLgotIwotSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZz1VcGRhdGluZyBXZWIgQ29udGVudCBTZXR0aW5ncwotSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9Qcm9ibGVtc19VcGRhdGluZz1Qcm9ibGVtIHNhdmluZyBXZWIgQ29udGVudCBTZXR0aW5ncyBmb3IgezB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NDc5NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYgZGVzaXJlZCwKLSAqIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzIHBsdWdpbi4gT3RoZXIKLSAqIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgV0FSTklORzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiBAcGFyYW0gbGV2ZWwgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwgT0tfREVCVUcsIElORk9fREVCVUcsIFdBUk5JTkdfREVCVUcsIEVSUk9SX0RFQlVHKQotCSAqIEBwYXJhbSBtZXNzYWdlIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiBAcGFyYW0gbWVzc2FnZSB0ZXh0IHRvIHByaW50Ci0JICogQHBhcmFtIGNhdGVnb3J5IGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGN1cnJlbnRseSB0cmFjaW5nIGEgY2F0ZWdvcnkKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdHJhY2luZyBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2luZyhTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvQWJzdHJhY3ROb2RlQ2xlYW51cEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0Fic3RyYWN0Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MzU2MTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvQWJzdHJhY3ROb2RlQ2xlYW51cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROb2RlQ2xlYW51cEhhbmRsZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIHsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBmQ2xlYW51cFByZWZlcmVuY2VzID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBmUHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQotCXB1YmxpYyB2b2lkIHNldENsZWFudXBQcmVmZXJlbmNlcyhJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBjbGVhbnVwUHJlZmVyZW5jZXMpIHsKLQotCQlmQ2xlYW51cFByZWZlcmVuY2VzID0gY2xlYW51cFByZWZlcmVuY2VzOwotCX0KLQotCi0JcHVibGljIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGdldENsZWFudXBQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGZDbGVhbnVwUHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkNsZWFudXBQcmVmZXJlbmNlcyA9IG5ldyBTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzKCk7Ci0JCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRUYWdOYW1lQ2FzZShwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9UQUdfTkFNRV9DQVNFKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRBdHRyTmFtZUNhc2UocHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQVRUUl9OQU1FX0NBU0UpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbXByZXNzRW1wdHlFbGVtZW50VGFncyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTVBSRVNTX0VNUFRZX0VMRU1FTlRfVEFHUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0SW5zZXJ0UmVxdWlyZWRBdHRycyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9SRVFVSVJFRF9BVFRSUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0SW5zZXJ0TWlzc2luZ1RhZ3MocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRRdW90ZUF0dHJWYWx1ZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Rm9ybWF0U291cmNlKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSkpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Q29udmVydEVPTENvZGVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEVPTENvZGUocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmQ2xlYW51cFByZWZlcmVuY2VzOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0KLQkJZlByb2dyZXNzTW9uaXRvciA9IHByb2dyZXNzTW9uaXRvcjsKLQl9Ci0KLQlzdGF0aWMgcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGxhY2VTb3VyY2UoSURPTU1vZGVsIG1vZGVsLCBPYmplY3QgcmVxdWVzdGVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc291cmNlKSB7Ci0KLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlzb3VyY2UgPSBuZXcgU3RyaW5nKCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQuY29udGFpbnNSZWFkT25seShvZmZzZXQsIGxlbmd0aCkpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlpZiAocmVxdWVzdGVyID09IG51bGwpIHsKLQkJCXJlcXVlc3RlciA9IHN0cnVjdHVyZWREb2N1bWVudDsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHJlcXVlc3Rlciwgb2Zmc2V0LCBsZW5ndGgsIHNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DU1NUZXh0Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DU1NUZXh0Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1Njc1YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvQ1NTVGV4dE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8vIG5ha2Ftb3JpX1RPRE86IGNoZWNrIGFuZCByZW1vdmUKLQotcHVibGljIGNsYXNzIENTU1RleHROb2RlQ2xlYW51cEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdE5vZGVDbGVhbnVwSGFuZGxlciB7Ci0KLQlwdWJsaWMgTm9kZSBjbGVhbnVwKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG5vZGU7Ci0JCUlET01Nb2RlbCBtb2RlbCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG5vZGU7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBub2RlOwotCi0JCVN0cmluZyBjb250ZW50ID0gZ2V0Q1NTQ29udGVudChub2RlKTsKLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBub2RlOwotCi0JCWludCBvZmZzZXQgPSAoKElET01Ob2RlKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgLSBvZmZzZXQ7Ci0JCXJlcGxhY2VTb3VyY2UobW9kZWwsIHRoaXMsIG9mZnNldCwgbGVuZ3RoLCBjb250ZW50KTsKLQkJcmV0dXJuIChJRE9NTm9kZSkgbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldENTU0NvbnRlbnQoTm9kZSB0ZXh0KSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldENTU01vZGVsKHRleHQpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJQ1NTTm9kZSBkb2N1bWVudCA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQ7Ci0JCUNTU1NvdXJjZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSAoQ1NTU291cmNlRm9ybWF0dGVyKSBub3RpZmllci5nZXRBZGFwdGVyRm9yKENTU1NvdXJjZUZvcm1hdHRlci5jbGFzcyk7Ci0JCS8vIHRyeSBhbm90aGVyIHdheSB0byBnZXQgZm9ybWF0dGVyCi0JCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkKLQkJCWZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIobm90aWZpZXIpOwotCQlpZiAoZm9ybWF0dGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IGZvcm1hdHRlci5jbGVhbnVwKGRvY3VtZW50KTsKLQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElDU1NNb2RlbCBnZXRDU1NNb2RlbChOb2RlIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIHRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIShhZGFwdGVyIGluc3RhbmNlb2YgSVN0eWxlU2hlZXRBZGFwdGVyKSkKLQkJCXJldHVybiBudWxsOwotCQlJU3R5bGVTaGVldEFkYXB0ZXIgc3R5bGVBZGFwdGVyID0gKElTdHlsZVNoZWV0QWRhcHRlcikgYWRhcHRlcjsKLQkJcmV0dXJuIHN0eWxlQWRhcHRlci5nZXRNb2RlbCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9FbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9FbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYWY3NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuSW5zZXJ0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8vIG5ha2Ftb3JpX1RPRE86IGNoZWNrIGFuZCByZW1vdmUgQ1NTIGZvcm1hdHRpbmcKLQotcHVibGljIGNsYXNzIEVsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdE5vZGVDbGVhbnVwSGFuZGxlciB7Ci0KLQkvKiogTm9uLU5MUyBzdHJpbmdzICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVEFHX09QRU4gPSAiPCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfVEFHX09QRU4gPSAiPC8iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NMT1NFID0gIj4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfVEFHX0NMT1NFID0gIi8+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRV9RVU9URVMgPSAiJyciOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFX1FVT1RFUyA9ICJcIlwiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBTSU5HTEVfUVVPVEUgPSAnXCcnOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIERPVUJMRV9RVU9URSA9ICdcIic7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBOb2RlIGNsZWFudXAoTm9kZSBub2RlKSB7Ci0JCUlET01Ob2RlIHJlbmFtZWROb2RlID0gKElET01Ob2RlKSBjbGVhbnVwQ2hpbGRyZW4obm9kZSk7Ci0KLQkJLy8gY2FsbCBxdW90ZUF0dHJWYWx1ZSgpIGZpcnN0IHNvIGl0IHdpbGwgY2xvc2UgYW55IHVuY2xvc2VkIGF0dHIKLQkJLy8gcXVvdGVBdHRyVmFsdWUoKSB3aWxsIHJldHVybiB0aGUgbmV3IHN0YXJ0IHRhZyBpZiB0aGVyZSBpcyBhCi0JCS8vIHN0cnVjdHVyZSBjaGFuZ2UKLQkJcmVuYW1lZE5vZGUgPSBxdW90ZUF0dHJWYWx1ZShyZW5hbWVkTm9kZSk7Ci0KLQkJLy8gaW5zZXJ0IHRhZyBjbG9zZSBpZiBtaXNzaW5nCi0JCS8vIGlmIG5vZGUgaXMgbm90IGNvbW1lbnQgdGFnCi0JCS8vIGFuZCBub3QgaW1wbGljaXQgdGFnCi0JCWlmICghKChJRE9NRWxlbWVudCkgcmVuYW1lZE5vZGUpLmlzQ29tbWVudFRhZygpICYmIChyZW5hbWVkTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpKSB7Ci0JCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gcmVuYW1lZE5vZGUuZ2V0TW9kZWwoKTsKLQotCQkJLy8gc2F2ZSBzdGFydCBvZmZzZXQgYmVmb3JlIGluc2VydFRhZ0Nsb3NlKCkKLQkJCS8vIG9yIGVsc2UgcmVuYW1lZE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSB3aWxsIGJlIHplcm8gaWYKLQkJCS8vIHJlbmFtZWROb2RlIHJlcGxhY2VkIGJ5IGluc2VydFRhZ0Nsb3NlKCkKLQkJCWludCBzdGFydFRhZ1N0YXJ0T2Zmc2V0ID0gcmVuYW1lZE5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQkJLy8gZm9yIHN0YXJ0IHRhZwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHJlbmFtZWROb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpbnNlcnRUYWdDbG9zZShzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQkJLy8gdXBkYXRlIHJlbmFtZWROb2RlIGFuZCBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhZnRlcgotCQkJLy8gaW5zZXJ0VGFnQ2xvc2UoKQotCQkJcmVuYW1lZE5vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOwotCQkJc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSByZW5hbWVkTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCQkvLyBmb3IgZW5kIHRhZwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSByZW5hbWVkTm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJaW5zZXJ0VGFnQ2xvc2Uoc3RydWN0dXJlZE1vZGVsLCBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQl9Ci0KLQkJLy8gY2FsbCBpbnNlcnRNaXNzaW5nVGFncygpIG5leHQsIGl0IHdpbGwgZ2VuZXJhdGUgaW1wbGljaXQgdGFncyBpZgotCQkvLyB0aGVyZSBhcmUgYW55Ci0JCS8vIGluc2VydE1pc3NpbmdUYWdzKCkgd2lsbCByZXR1cm4gdGhlIG5ldyBtaXNzaW5nIHN0YXJ0IHRhZyBpZiBvbmUgaXMKLQkJLy8gbWlzc2luZwotCQkvLyBhcHBseVRhZ05hbWVDYXNlKCkgd2lsbCByZXR1cm4gdGhlIHJlbmFtZWQgbm9kZS4KLQkJLy8gVGhlIHJlbmFtZWQvbmV3IG5vZGUgd2lsbCBiZSBzYXZlZCBhbmQgcmV0dXJuZWQgdG8gY2FsbGVyIHdoZW4gYWxsCi0JCS8vIGNsZWFudXAgaXMgZG9uZS4KLQkJcmVuYW1lZE5vZGUgPSBpbnNlcnRNaXNzaW5nVGFncyhyZW5hbWVkTm9kZSk7Ci0JCXJlbmFtZWROb2RlID0gaW5zZXJ0UmVxdWlyZWRBdHRycyhyZW5hbWVkTm9kZSk7Ci0JCXJlbmFtZWROb2RlID0gYXBwbHlUYWdOYW1lQ2FzZShyZW5hbWVkTm9kZSk7Ci0JCWFwcGx5QXR0ck5hbWVDYXNlKHJlbmFtZWROb2RlKTsKLQkJY2xlYW51cENTU0F0dHJWYWx1ZShyZW5hbWVkTm9kZSk7Ci0KLQkJcmV0dXJuIHJlbmFtZWROb2RlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBjbGVhbnVwIHNob3VsZCBtb2RpZnkgY2FzZS4gUmV0dXJucyB0cnVlIGNhc2Ugc2hvdWxkIGJlCi0JICogcHJlc2VydmVkLCBmYWxzZSBvdGhlcndpc2UuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRydWUgaWYgZWxlbWVudCBpcyBjYXNlIHNlbnNpdGl2ZSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFByZXNlcnZlQ2FzZShJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCS8vIGNhc2Ugb3B0aW9uIGNhbiBiZSBhcHBsaWVkIHRvIG5vIG5hbWVzcGFjZSB0YWdzCi0JCXJldHVybiAhZWxlbWVudC5pc0dsb2JhbFRhZygpOwotCQkvKgotCQkgKiBNb2RlbFF1ZXJ5QWRhcHRlciBtcWFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpCi0JCSAqIGVsZW1lbnQuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7IE1vZGVsUXVlcnkgbXEgPQotCQkgKiBudWxsOyBDTU5vZGUgbm9kZWRlY2wgPSBudWxsOyBpZiAobXFhZGFwdGVyICE9IG51bGwpIG1xID0KLQkJICogbXFhZGFwdGVyLmdldE1vZGVsUXVlcnkoKTsgaWYgKG1xICE9IG51bGwpIG5vZGVkZWNsID0KLQkJICogbXEuZ2V0Q01Ob2RlKG5vZGUpOyAvLyBpZiBhIE5vZGUgaXNuJ3QgcmVjb2duaXplZCBhcyBIVE1MIG9yIGlzIGFuZAotCQkgKiBjYXJlcyBhYm91dCBjYXNlLCBkbyBub3QgYWx0ZXIgaXQgLy8gaWYgKG5vZGVkZWNsID09IG51bGwgfHwKLQkJICogKG5vZGVkZWNsIGluc3RhbmNlb2YgSFRNTENNTm9kZSAmJiAoKEhUTUxDTU5vZGUpCi0JCSAqIG5vZGVkZWNsKS5zaG91bGRJZ25vcmVDYXNlKCkpKSBpZiAoIQotCQkgKiBub2RlZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpIHJldHVybgotCQkgKiBmYWxzZTsgcmV0dXJuCi0JCSAqICgoQm9vbGVhbiljbW5vZGUuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKS5ib29sZWFuVmFsdWUoKTsKLQkJICovCi0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGNsZWFudXAgc2hvdWxkIGZvcmNlIG1vZGlmeWluZyBlbGVtZW50IG5hbWUgdG8gYWxsIGxvd2VyY2FzZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBjbGVhbnVwIHNob3VsZCBsb3dlcmNhc2UgZWxlbWVudCBuYW1lLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNYTUxUYWcoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gZWxlbWVudC5pc1hNTFRhZygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFwcGx5QXR0ck5hbWVDYXNlKElET01Ob2RlIG5vZGUpIHsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpCi0JCQlyZXR1cm47IC8vIGRvIG5vdGhpbmcKLQotCQlpbnQgYXR0ck5hbWVDYXNlID0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVNJUzsKLQkJaWYgKCFzaG91bGRQcmVzZXJ2ZUNhc2UoZWxlbWVudCkpIHsKLQkJCWlmIChpc1hNTFRhZyhlbGVtZW50KSkKLQkJCQlhdHRyTmFtZUNhc2UgPSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUjsKLQkJCWVsc2UKLQkJCQlhdHRyTmFtZUNhc2UgPSBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKS5nZXRBdHRyTmFtZUNhc2UoKTsKLQkJfQotCi0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWludCBhdHRyaWJ1dGVzTGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNMZW5ndGg7IGkrKykgewotCQkJSURPTU5vZGUgZWFjaEF0dHIgPSAoSURPTU5vZGUpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCVN0cmluZyBvbGRBdHRyTmFtZSA9IGVhY2hBdHRyLmdldE5vZGVOYW1lKCk7Ci0JCQlTdHJpbmcgbmV3QXR0ck5hbWUgPSBvbGRBdHRyTmFtZTsKLQkJCS8qCi0JCQkgKiAyNTQ5NjEgLSBhbGwgSFRNTCB0YWcgbmFtZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcyBzaG91bGQgYmUgaW4KLQkJCSAqIEVuZ2xpc2ggZXZlbiBmb3IgSFRNTCBmaWxlcyBpbiBvdGhlciBsYW5ndWFnZXMgbGlrZSBKYXBhbmVzZSBvcgotCQkJICogVHVya2lzaC4gRW5nbGlzaCBsb2NhbGUgc2hvdWxkIGJlIHVzZWQgdG8gY29udmVydCBiZXR3ZWVuCi0JCQkgKiB1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZSAob3RoZXJ3aXNlICJsaW5rIiB3b3VsZCBiZSBjb252ZXJ0ZWQgdG8KLQkJCSAqIFR1cmtpc2ggIkkgT3ZlcmRvdCBDYXBpdGFsIikuCi0JCQkgKi8KLQkJCWlmIChhdHRyTmFtZUNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpCi0JCQkJbmV3QXR0ck5hbWUgPSBvbGRBdHRyTmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpOwotCQkJZWxzZSBpZiAoYXR0ck5hbWVDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCW5ld0F0dHJOYW1lID0gb2xkQXR0ck5hbWUudG9VcHBlckNhc2UoTG9jYWxlLlVTKTsKLQotCQkJaWYgKG5ld0F0dHJOYW1lLmNvbXBhcmVUbyhvbGRBdHRyTmFtZSkgIT0gMCkgewotCQkJCWludCBhdHRyTmFtZVN0YXJ0T2Zmc2V0ID0gZWFjaEF0dHIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgYXR0ck5hbWVMZW5ndGggPSBvbGRBdHRyTmFtZS5sZW5ndGgoKTsKLQotCQkJCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJcmVwbGFjZVNvdXJjZShzdHJ1Y3R1cmVkTW9kZWwsIHN0cnVjdHVyZWREb2N1bWVudCwgYXR0ck5hbWVTdGFydE9mZnNldCwgYXR0ck5hbWVMZW5ndGgsIG5ld0F0dHJOYW1lKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBJRE9NTm9kZSBhcHBseVRhZ05hbWVDYXNlKElET01Ob2RlIG5vZGUpIHsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpCi0JCQlyZXR1cm4gbm9kZTsgLy8gZG8gbm90aGluZwotCi0JCWludCB0YWdOYW1lQ2FzZSA9IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVM7Ci0KLQkJaWYgKCFzaG91bGRQcmVzZXJ2ZUNhc2UoZWxlbWVudCkpIHsKLQkJCWlmIChpc1hNTFRhZyhlbGVtZW50KSkKLQkJCQl0YWdOYW1lQ2FzZSA9IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSOwotCQkJZWxzZQotCQkJCXRhZ05hbWVDYXNlID0gZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkuZ2V0VGFnTmFtZUNhc2UoKTsKLQkJfQotCi0JCVN0cmluZyBvbGRUYWdOYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQlTdHJpbmcgbmV3VGFnTmFtZSA9IG9sZFRhZ05hbWU7Ci0JCUlET01Ob2RlIG5ld05vZGUgPSBub2RlOwotCi0JCS8qCi0JCSAqIDI1NDk2MSAtIGFsbCBIVE1MIHRhZyBuYW1lcyBhbmQgYXR0cmlidXRlIG5hbWVzIHNob3VsZCBiZSBpbgotCQkgKiBFbmdsaXNoIGV2ZW4gZm9yIEhUTUwgZmlsZXMgaW4gb3RoZXIgbGFuZ3VhZ2VzIGxpa2UgSmFwYW5lc2Ugb3IKLQkJICogVHVya2lzaC4gRW5nbGlzaCBsb2NhbGUgc2hvdWxkIGJlIHVzZWQgdG8gY29udmVydCBiZXR3ZWVuIHVwcGVyY2FzZQotCQkgKiBhbmQgbG93ZXJjYXNlIChvdGhlcndpc2UgImxpbmsiIHdvdWxkIGJlIGNvbnZlcnRlZCB0byBUdXJraXNoICJJCi0JCSAqIE92ZXJkb3QgQ2FwaXRhbCIpLgotCQkgKi8KLQkJaWYgKHRhZ05hbWVDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKQotCQkJbmV3VGFnTmFtZSA9IG9sZFRhZ05hbWUudG9Mb3dlckNhc2UoTG9jYWxlLlVTKTsKLQkJZWxzZSBpZiAodGFnTmFtZUNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQluZXdUYWdOYW1lID0gb2xkVGFnTmFtZS50b1VwcGVyQ2FzZShMb2NhbGUuVVMpOwotCi0JCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWlmIChyZWdpb25zICE9IG51bGwgJiYgcmVnaW9ucy5zaXplKCkgPiAwKSB7Ci0JCQkJSVRleHRSZWdpb24gc3RhcnRUYWdOYW1lUmVnaW9uID0gcmVnaW9ucy5nZXQoMSk7Ci0JCQkJaW50IHN0YXJ0VGFnTmFtZVN0YXJ0T2Zmc2V0ID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoc3RhcnRUYWdOYW1lUmVnaW9uKTsKLQkJCQlpbnQgc3RhcnRUYWdOYW1lTGVuZ3RoID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChzdGFydFRhZ05hbWVSZWdpb24pIC0gc3RhcnRUYWdOYW1lU3RhcnRPZmZzZXQ7Ci0KLQkJCQlyZXBsYWNlU291cmNlKHN0cnVjdHVyZWRNb2RlbCwgc3RydWN0dXJlZERvY3VtZW50LCBzdGFydFRhZ05hbWVTdGFydE9mZnNldCwgc3RhcnRUYWdOYW1lTGVuZ3RoLCBuZXdUYWdOYW1lKTsKLQkJCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ05hbWVTdGFydE9mZnNldCk7IC8vIHNhdmUKLQkJCQkvLyBuZXcKLQkJCQkvLyBub2RlCi0JCQl9Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJaWYgKHJlZ2lvbnMgIT0gbnVsbCAmJiByZWdpb25zLnNpemUoKSA+IDApIHsKLQkJCQlJVGV4dFJlZ2lvbiBlbmRUYWdOYW1lUmVnaW9uID0gcmVnaW9ucy5nZXQoMSk7Ci0JCQkJaW50IGVuZFRhZ05hbWVTdGFydE9mZnNldCA9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChlbmRUYWdOYW1lUmVnaW9uKTsKLQkJCQlpbnQgZW5kVGFnTmFtZUxlbmd0aCA9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KGVuZFRhZ05hbWVSZWdpb24pIC0gZW5kVGFnTmFtZVN0YXJ0T2Zmc2V0OwotCi0JCQkJaWYgKHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQkJcmVwbGFjZVNvdXJjZShzdHJ1Y3R1cmVkTW9kZWwsIHN0cnVjdHVyZWREb2N1bWVudCwgZW5kVGFnTmFtZVN0YXJ0T2Zmc2V0LCBlbmRUYWdOYW1lTGVuZ3RoLCBuZXdUYWdOYW1lKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByb3RlY3RlZCBOb2RlIGNsZWFudXBDaGlsZHJlbihOb2RlIG5vZGUpIHsKLQkJTm9kZSBwYXJlbnROb2RlID0gbm9kZTsKLQotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlOb2RlIGNoaWxkTm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeSBmYWN0b3J5ID0gSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQkJd2hpbGUgKGNoaWxkTm9kZSAhPSBudWxsKSB7Ci0JCQkJLy8gY2xlYW51cCB0aGlzIGNoaWxkIG5vZGUKLQkJCQlJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGNsZWFudXBIYW5kbGVyID0gZmFjdG9yeS5jcmVhdGVIYW5kbGVyKGNoaWxkTm9kZSwgZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkpOwotCQkJCWNoaWxkTm9kZSA9IGNsZWFudXBIYW5kbGVyLmNsZWFudXAoY2hpbGROb2RlKTsKLQotCQkJCS8vIGdldCBuZXcgcGFyZW50IG5vZGUKLQkJCQlwYXJlbnROb2RlID0gY2hpbGROb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCS8vIGdldCBuZXh0IGNoaWxkIG5vZGUKLQkJCQljaGlsZE5vZGUgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBwYXJlbnROb2RlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFudXBDU1NBdHRyVmFsdWUoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybjsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJaWYgKCFlbGVtZW50LmlzR2xvYmFsVGFnKCkpCi0JCQlyZXR1cm47Ci0KLQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKCJzdHlsZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyB2YWx1ZSA9IGdldENTU1ZhbHVlKGF0dHIpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIG9sZFZhbHVlID0gKChJRE9NTm9kZSkgYXR0cikuZ2V0VmFsdWVTb3VyY2UoKTsKLQkJaWYgKG9sZFZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkKLQkJCXJldHVybjsKLQkJYXR0ci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJQ1NTTW9kZWwgZ2V0Q1NTTW9kZWwoQXR0ciBhdHRyKSB7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIShhZGFwdGVyIGluc3RhbmNlb2YgSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyKSkKLQkJCXJldHVybiBudWxsOwotCQlJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIgc3R5bGVBZGFwdGVyID0gKElTdHlsZURlY2xhcmF0aW9uQWRhcHRlcikgYWRhcHRlcjsKLQkJcmV0dXJuIHN0eWxlQWRhcHRlci5nZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldENTU1ZhbHVlKEF0dHIgYXR0cikgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRDU1NNb2RlbChhdHRyKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUNTU05vZGUgZG9jdW1lbnQgPSBtb2RlbC5nZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGRvY3VtZW50OwotCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gKENTU1NvdXJjZUZvcm1hdHRlcikgbm90aWZpZXIuZ2V0QWRhcHRlckZvcihDU1NTb3VyY2VGb3JtYXR0ZXIuY2xhc3MpOwotCQkvLyB0cnkgYW5vdGhlciB3YXkgdG8gZ2V0IGZvcm1hdHRlcgotCQlpZiAoZm9ybWF0dGVyID09IG51bGwpCi0JCQlmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKG5vdGlmaWVyKTsKLQkJaWYgKGZvcm1hdHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBmb3JtYXR0ZXIuY2xlYW51cChkb2N1bWVudCk7Ci0JCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRW1wdHlFbGVtZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQkvLyB1bmRlZmluZWQgdGFnLCByZXR1cm4gZGVmYXVsdAotCQkJcmV0dXJuIGZhbHNlOwotCi0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9jdW1lbnQpOwotCQlpZiAobW9kZWxRdWVyeSA9PSBudWxsKQotCQkJLy8gdW5kZWZpbmVkIHRhZywgcmV0dXJuIGRlZmF1bHQKLQkJCXJldHVybiBmYWxzZTsKLQotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCS8vIHVuZGVmaW5lZCB0YWcsIHJldHVybiBkZWZhdWx0Ci0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIChkZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpOwotCX0KLQotCXByb3RlY3RlZCBJRE9NTm9kZSBpbnNlcnRFbmRUYWcoSURPTU5vZGUgbm9kZSkgewotCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCi0JCWludCBzdGFydFRhZ1N0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQlJRE9NTm9kZSBuZXdOb2RlID0gbnVsbDsKLQotCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCWVsc2UgaWYgKGlzRW1wdHlFbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQkJcmVwbGFjZVNvdXJjZShzdHJ1Y3R1cmVkTW9kZWwsIHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQobGFzdFJlZ2lvbiksIGxhc3RSZWdpb24uZ2V0TGVuZ3RoKCksIEVNUFRZX1RBR19DTE9TRSk7Ci0KLQkJCWlmIChyZWdpb25zLnNpemUoKSA+IDEpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb25CZWZvcmVUYWdDbG9zZSA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSAtIDEpOwotCi0JCQkJLy8gaW5zZXJ0IGEgc3BhY2Ugc2VwYXJhdG9yIGJlZm9yZSB0YWcgY2xvc2UgaWYgdGhlIHByZXZpb3VzCi0JCQkJLy8gcmVnaW9uIGRvZXMgbm90IGhhdmUgZXh0cmEgc3BhY2VzCi0JCQkJaWYgKHJlZ2lvbkJlZm9yZVRhZ0Nsb3NlLmdldFRleHRMZW5ndGgoKSA9PSByZWdpb25CZWZvcmVUYWdDbG9zZS5nZXRMZW5ndGgoKSkKLQkJCQkJcmVwbGFjZVNvdXJjZShzdHJ1Y3R1cmVkTW9kZWwsIHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQobGFzdFJlZ2lvbiksIDAsICIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyB0YWdOYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJU3RyaW5nIGVuZFRhZyA9IEVORF9UQUdfT1BFTi5jb25jYXQodGFnTmFtZSkuY29uY2F0KFRBR19DTE9TRSk7Ci0KLQkJCUlET01Ob2RlIGxhc3RDaGlsZCA9IChJRE9NTm9kZSkgbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJCWludCBlbmRUYWdTdGFydE9mZnNldCA9IDA7Ci0JCQlpZiAobGFzdENoaWxkICE9IG51bGwpCi0JCQkJLy8gaWYgdGhpcyBub2RlIGhhcyBjaGlsZHJlbiwgaW5zZXJ0IHRoZSBlbmQgdGFnIGFmdGVyIHRoZQotCQkJCS8vIGxhc3QgY2hpbGQKLQkJCQllbmRUYWdTdGFydE9mZnNldCA9IGxhc3RDaGlsZC5nZXRFbmRPZmZzZXQoKTsKLQkJCWVsc2UKLQkJCQkvLyBpZiB0aGlzIG5vZGUgZG9lcyBub3QgaGFzIGNoaWxkcmVuLCBpbnNlcnQgdGhlIGVuZCB0YWcKLQkJCQkvLyBhZnRlciB0aGUgc3RhcnQgdGFnCi0JCQkJZW5kVGFnU3RhcnRPZmZzZXQgPSBub2RlLmdldEVuZE9mZnNldCgpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCXJlcGxhY2VTb3VyY2Uoc3RydWN0dXJlZE1vZGVsLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGVuZFRhZ1N0YXJ0T2Zmc2V0LCAwLCBlbmRUYWcpOwotCQl9Ci0KLQkJbmV3Tm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdTdGFydE9mZnNldCk7IC8vIHNhdmUKLQkJLy8gbmV3Ci0JCS8vIG5vZGUKLQotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURPTU5vZGUgaW5zZXJ0TWlzc2luZ1RhZ3MoSURPTU5vZGUgbm9kZSkgewotCQlib29sZWFuIGluc2VydE1pc3NpbmdUYWdzID0gZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkuZ2V0SW5zZXJ0TWlzc2luZ1RhZ3MoKTsKLQkJSURPTU5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0KLQkJaWYgKGluc2VydE1pc3NpbmdUYWdzKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCQkvLyBpbXBsaWNpdCBzdGFydCB0YWc7IGdlbmVyYXRlIHRhZyBmb3IgaXQKLQkJCQluZXdOb2RlID0gaW5zZXJ0U3RhcnRUYWcobm9kZSk7Ci0JCQkJc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXdOb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQl9Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3Tm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbkxpc3QgPSBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlpZiAoc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCAmJiByZWdpb25MaXN0ICE9IG51bGwgJiYgcmVnaW9uTGlzdC5nZXQocmVnaW9uTGlzdC5zaXplKCkgLSAxKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCS8vIHN0YXJ0IHRhZyBtaXNzaW5nCi0JCQkJCWlmIChpc1N0YXJ0VGFnUmVxdWlyZWQobmV3Tm9kZSkpCi0JCQkJCQluZXdOb2RlID0gaW5zZXJ0U3RhcnRUYWcobmV3Tm9kZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCS8vIGVuZCB0YWcgbWlzc2luZwotCQkJCQlpZiAoaXNFbmRUYWdSZXF1aXJlZChuZXdOb2RlKSkKLQkJCQkJCW5ld05vZGUgPSBpbnNlcnRFbmRUYWcobmV3Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIElET01Ob2RlIGluc2VydFN0YXJ0VGFnKElET01Ob2RlIG5vZGUpIHsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpCi0JCQlyZXR1cm4gbm9kZTsgLy8gZG8gbm90aGluZwotCi0JCUlET01Ob2RlIG5ld05vZGUgPSBudWxsOwotCi0JCVN0cmluZyB0YWdOYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQlTdHJpbmcgc3RhcnRUYWcgPSBTVEFSVF9UQUdfT1BFTi5jb25jYXQodGFnTmFtZSkuY29uY2F0KFRBR19DTE9TRSk7Ci0JCWludCBzdGFydFRhZ1N0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCi0JCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlyZXBsYWNlU291cmNlKHN0cnVjdHVyZWRNb2RlbCwgc3RydWN0dXJlZERvY3VtZW50LCBzdGFydFRhZ1N0YXJ0T2Zmc2V0LCAwLCBzdGFydFRhZyk7Ci0JCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0JCS8vIG5ldwotCQkvLyBub2RlCi0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0VGFnQ2xvc2UoSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoKGZsYXROb2RlICE9IG51bGwpICYmIChmbGF0Tm9kZS5nZXRSZWdpb25zKCkgIT0gbnVsbCkpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0ID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IHJlZ2lvbkxpc3QuZ2V0KHJlZ2lvbkxpc3Quc2l6ZSgpIC0gMSk7Ci0JCQlpZiAobGFzdFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBsYXN0UmVnaW9uLmdldFR5cGUoKTsKLQkJCQlpZiAoKHJlZ2lvblR5cGUgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSAmJiAocmVnaW9uVHlwZSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCQkJCS8vIGluc2VydCAiPiIgYWZ0ZXIgbGFzdFJlZ2lvbiBvZiBmbGF0Tm9kZQotCQkJCQkvLyBhcyBpbiAiPGE8L2E+IiBpZiBmbGF0Tm9kZSBpcyBmb3Igc3RhcnQgdGFnLCBvciBpbgotCQkJCQkvLyAiPGE+PC9hIiBpZiBmbGF0Tm9kZSBpcyBmb3IgZW5kIHRhZwotCQkJCQlyZXBsYWNlU291cmNlKHN0cnVjdHVyZWRNb2RlbCwgc3RydWN0dXJlZERvY3VtZW50LCBmbGF0Tm9kZS5nZXRUZXh0RW5kT2Zmc2V0KGxhc3RSZWdpb24pLCAwLCAiPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmRUYWdSZXF1aXJlZChJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBub2RlLmlzQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGVuZCB0YWdzIG9mIEhUTUwgRU1QVFkgY29udGVudCB0eXBlLCBzdWNoIGFzIElNRywgYW5kIEhUTUwKLQkgKiB1bmRlZmluZWQgdGFncyBhcmUgcGFyc2VkIHNlcGFyYXRlbHkgZnJvbSB0aGUgc3RhcnQgdGFncy4gU28gaW5zZXJ0aW5nCi0JICogdGhlIG1pc3Npbmcgc3RhcnQgdGFnIGlzIHVzZWxlc3MgYW5kIGV2ZW4gaGFybWZ1bC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N0YXJ0VGFnUmVxdWlyZWQoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gbm9kZS5pc0NvbnRhaW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzWE1MVHlwZShJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsICYmIHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpCi0JCQkJcmVzdWx0ID0gZG9jdW1lbnQuaXNYTUxUeXBlKCk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBJRE9NTm9kZSBxdW90ZUF0dHJWYWx1ZShJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCWlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKQotCQkJcmV0dXJuIG5vZGU7IC8vIGRvIG5vdGhpbmcKLQotCQlib29sZWFuIHF1b3RlQXR0clZhbHVlcyA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldFF1b3RlQXR0clZhbHVlcygpOwotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQlpZiAocXVvdGVBdHRyVmFsdWVzKSB7Ci0JCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IG5ld05vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJaW50IGF0dHJpYnV0ZXNMZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQkJSVNvdXJjZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBub2RlLmdldE1vZGVsKCkuZ2V0R2VuZXJhdG9yKCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlc0xlbmd0aDsgaSsrKSB7Ci0JCQkJYXR0cmlidXRlcyA9IG5ld05vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCWF0dHJpYnV0ZXNMZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQkJCUlET01BdHRyIGVhY2hBdHRyID0gKElET01BdHRyKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0JCQkJLy8gSVRleHRSZWdpb24gb2xkQXR0clZhbHVlUmVnaW9uID0gZWFjaEF0dHIuZ2V0VmFsdWVSZWdpb24oKTsKLQkJCQlTdHJpbmcgb2xkQXR0clZhbHVlID0gZWFjaEF0dHIuZ2V0VmFsdWVSZWdpb25UZXh0KCk7Ci0JCQkJaWYgKG9sZEF0dHJWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCQkJCWlmIChpc1hNTFR5cGUoc3RydWN0dXJlZE1vZGVsKSkgewotCQkJCQkJLy8gVE9ETzogS2l0LCBwbGVhc2UgY2hlY2suIElzIHRoZXJlIGFueSB3YXkgdG8gbm90Ci0JCQkJCQkvLyByZWx5IG9uIGdldHRpbmcgcmVnaW9ucyBmcm9tIGF0dHJpYnV0ZXM/Ci0JCQkJCQlTdHJpbmcgbmV3QXR0clZhbHVlID0gIj1cIiIgKyBlYWNoQXR0ci5nZXROYW1lUmVnaW9uVGV4dCgpICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCQkJcmVwbGFjZVNvdXJjZShzdHJ1Y3R1cmVkTW9kZWwsIHN0cnVjdHVyZWREb2N1bWVudCwgZWFjaEF0dHIuZ2V0TmFtZVJlZ2lvbkVuZE9mZnNldCgpLCAwLCBuZXdBdHRyVmFsdWUpOwotCQkJCQkJbmV3Tm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24obm9kZS5nZXRTdGFydE9mZnNldCgpKTsgLy8gc2F2ZQotCQkJCQkJLy8gbmV3Ci0JCQkJCQkvLyBub2RlCi0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0KLQkJCQkJY2hhciBxdW90ZSA9IFN0cmluZ1V0aWxzLmlzUXVvdGVkKG9sZEF0dHJWYWx1ZSkgPyBvbGRBdHRyVmFsdWUuY2hhckF0KDApIDogRE9VQkxFX1FVT1RFOwotCQkJCQlTdHJpbmcgbmV3QXR0clZhbHVlID0gZ2VuZXJhdG9yLmdlbmVyYXRlQXR0clZhbHVlKGVhY2hBdHRyLCBxdW90ZSk7Ci0KLQkJCQkJLy8gVGhlcmUgaXMgYSBwcm9ibGVtIGluCi0JCQkJCS8vIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0QXR0clZhbHVlKElUZXh0UmVnaW9uKQotCQkJCQkvLyB3aGVuIHRoZSByZWdpb24gaXMgaW5zdGFuY2VvZiBDb250ZXh0UmVnaW9uLgotCQkJCQkvLyBXb3JrYXJvdW5kIGZvciBub3cuLi4KLQkJCQkJaWYgKG9sZEF0dHJWYWx1ZS5sZW5ndGgoKSA9PSAxKSB7Ci0JCQkJCQljaGFyIGZpcnN0Q2hhciA9IG9sZEF0dHJWYWx1ZS5jaGFyQXQoMCk7Ci0JCQkJCQlpZiAoZmlyc3RDaGFyID09IFNJTkdMRV9RVU9URSkKLQkJCQkJCQluZXdBdHRyVmFsdWUgPSBTSU5HTEVfUVVPVEVTOwotCQkJCQkJZWxzZSBpZiAoZmlyc3RDaGFyID09IERPVUJMRV9RVU9URSkKLQkJCQkJCQluZXdBdHRyVmFsdWUgPSBET1VCTEVfUVVPVEVTOwotCQkJCQl9Ci0KLQkJCQkJaWYgKG5ld0F0dHJWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAobmV3QXR0clZhbHVlLmNvbXBhcmVUbyhvbGRBdHRyVmFsdWUpICE9IDApIHsKLQkJCQkJCQlpbnQgYXR0clZhbHVlU3RhcnRPZmZzZXQgPSBlYWNoQXR0ci5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQkJaW50IGF0dHJWYWx1ZUxlbmd0aCA9IG9sZEF0dHJWYWx1ZS5sZW5ndGgoKTsKLQkJCQkJCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQkJCQkJCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCQkJcmVwbGFjZVNvdXJjZShzdHJ1Y3R1cmVkTW9kZWwsIHN0cnVjdHVyZWREb2N1bWVudCwgYXR0clZhbHVlU3RhcnRPZmZzZXQsIGF0dHJWYWx1ZUxlbmd0aCwgbmV3QXR0clZhbHVlKTsKLQkJCQkJCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsgLy8gc2F2ZQotCQkJCQkJCS8vIG5ldwotCQkJCQkJCS8vIG5vZGUKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByaXZhdGUgSURPTU5vZGUgaW5zZXJ0UmVxdWlyZWRBdHRycyhJRE9NTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gaW5zZXJ0UmVxdWlyZWRBdHRycyA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldEluc2VydFJlcXVpcmVkQXR0cnMoKTsKLQkJSURPTU5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0KLQkJaWYgKGluc2VydFJlcXVpcmVkQXR0cnMpIHsKLQkJCUxpc3QgcmVxdWlyZWRBdHRycyA9IGdldFJlcXVpcmVkQXR0cnMobmV3Tm9kZSk7Ci0JCQlpZiAocmVxdWlyZWRBdHRycy5zaXplKCkgPiAwKSB7Ci0JCQkJTmFtZWROb2RlTWFwIGN1cnJlbnRBdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCUxpc3QgaW5zZXJ0QXR0cnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGN1cnJlbnRBdHRycy5nZXRMZW5ndGgoKSA9PSAwKQotCQkJCQlpbnNlcnRBdHRycy5hZGRBbGwocmVxdWlyZWRBdHRycyk7Ci0JCQkJZWxzZSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWlyZWRBdHRycy5zaXplKCk7IGkrKykgewotCQkJCQkJU3RyaW5nIHJlcXVpcmVkQXR0ck5hbWUgPSAoKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIHJlcXVpcmVkQXR0cnMuZ2V0KGkpKS5nZXRBdHRyTmFtZSgpOwotCQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjdXJyZW50QXR0cnMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJCVN0cmluZyBjdXJyZW50QXR0ck5hbWUgPSBjdXJyZW50QXR0cnMuaXRlbShqKS5nZXROb2RlTmFtZSgpOwotCQkJCQkJCWlmIChyZXF1aXJlZEF0dHJOYW1lLmNvbXBhcmVUb0lnbm9yZUNhc2UoY3VycmVudEF0dHJOYW1lKSA9PSAwKSB7Ci0JCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKCFmb3VuZCkKLQkJCQkJCQlpbnNlcnRBdHRycy5hZGQocmVxdWlyZWRBdHRycy5nZXQoaSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChpbnNlcnRBdHRycy5zaXplKCkgPiAwKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXdOb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCWludCBpbmRleCA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGFzdFJlZ2lvbigpOwotCQkJCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB7Ci0JCQkJCQlpbmRleC0tOwotCQkJCQkJbGFzdFJlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluZGV4IC0gMSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJCQlpbmRleCA9IGluZGV4IC0gMjsKLQkJCQkJCWxhc3RSZWdpb24gPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbmRleCAtIDEpOwotCQkJCQl9Ci0JCQkJCU11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmb3IgKGludCBpID0gaW5zZXJ0QXR0cnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGluc2VydEF0dHJzLmdldChpKTsKLQkJCQkJCQlTdHJpbmcgcmVxdWlyZWRBdHRyaWJ1dGVOYW1lID0gYXR0ckRlY2wuZ2V0QXR0ck5hbWUoKTsKLQkJCQkJCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gYXR0ckRlY2wuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQkJCQkJaWYgKGRlZmF1bHRWYWx1ZSA9PSBudWxsKQotCQkJCQkJCQlkZWZhdWx0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBuYW1lQW5kRGVmYXVsdFZhbHVlID0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKGkgPT0gMCAmJiBsYXN0UmVnaW9uLmdldExlbmd0aCgpID4gbGFzdFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpCi0JCQkJCQkJCW5hbWVBbmREZWZhdWx0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW5hbWVBbmREZWZhdWx0VmFsdWUgKz0gcmVxdWlyZWRBdHRyaWJ1dGVOYW1lICsgIj1cIiIgKyBkZWZhdWx0VmFsdWUgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQltdWx0aVRleHRFZGl0LmFkZENoaWxkKG5ldyBJbnNlcnRFZGl0KGluZGV4LCBuYW1lQW5kRGVmYXVsdFZhbHVlKSk7Ci0JCQkJCQkJLy8gQlVHMzM4MTogTXVsdGlUZXh0RWRpdCBhcHBsaWVzIGFsbCBjaGlsZAotCQkJCQkJCS8vIFRleHRFZGl0J3MgYmFzaW5nIG9uIG9mZnNldHMKLQkJCQkJCQkvLyBpbiB0aGUgZG9jdW1lbnQgYmVmb3JlIHRoZSBmaXJzdCBUZXh0RWRpdCwgbm90Ci0JCQkJCQkJLy8gYWZ0ZXIgZWFjaAotCQkJCQkJCS8vIGNoaWxkIFRleHRFZGl0LiBUaGVyZWZvcmUsIGRvIG5vdCBuZWVkIHRvCi0JCQkJCQkJLy8gYWR2YW5jZSB0aGUgaW5kZXguCi0JCQkJCQkJLy8gaW5kZXggKz0gbmFtZUFuZERlZmF1bHRWYWx1ZS5sZW5ndGgoKTsKLQkJCQkJCX0KLQkJCQkJCW11bHRpVGV4dEVkaXQuYXBwbHkobmV3Tm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGxvZyBvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCi0JcHJvdGVjdGVkIE1vZGVsUXVlcnkgZ2V0TW9kZWxRdWVyeShOb2RlIG5vZGUpIHsKLQkJTW9kZWxRdWVyeSByZXN1bHQgPSBudWxsOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJcmVzdWx0ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSgoRG9jdW1lbnQpIG5vZGUpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShub2RlLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRSZXF1aXJlZEF0dHJzKE5vZGUgbm9kZSkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBnZXRNb2RlbFF1ZXJ5KG5vZGUpOwotCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIG5vZGUpOwotCQkJaWYgKGVsZW1lbnREZWNsICE9IG51bGwpIHsKLQkJCQlDTU5hbWVkTm9kZU1hcCBhdHRyTWFwID0gZWxlbWVudERlY2wuZ2V0QXR0cmlidXRlcygpOwotCQkJCUl0ZXJhdG9yIGl0ID0gYXR0ck1hcC5pdGVyYXRvcigpOwotCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IG51bGw7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlhdHRyID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGl0Lm5leHQoKTsKLQkJCQkJaWYgKGF0dHIuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKSB7Ci0JCQkJCQlyZXN1bHQuYWRkKGF0dHIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTYwNzkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0hUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vLyBuYWthbW9yaV9UT0RPOiBjaGVjayBhbmQgcmVtb3ZlIENTUyBmb3JtYXR0aW5nCi0KLWNsYXNzIEhUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkgewotCi0KLQotCXByaXZhdGUgc3RhdGljIEhUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkgZkluc3RhbmNlID0gbnVsbDsKLQotCXN0YXRpYyBzeW5jaHJvbml6ZWQgSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBIVE1MQ2xlYW51cEhhbmRsZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCUlTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgY3JlYXRlSGFuZGxlcihOb2RlIG5vZGUsIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGNsZWFudXBQcmVmZXJlbmNlcykgewotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQlpZiAoaXNKU1BUYWcobm9kZSkpCi0JCQkJCWhhbmRsZXIgPSBuZXcgSlNQRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlcigpOwotCQkJCWVsc2UKLQkJCQkJaGFuZGxlciA9IG5ldyBFbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCWlmIChpc1BhcmVudFN0eWxlVGFnKG5vZGUpKQotCQkJCQloYW5kbGVyID0gbmV3IENTU1RleHROb2RlQ2xlYW51cEhhbmRsZXIoKTsKLQkJCQllbHNlCi0JCQkJCWhhbmRsZXIgPSBuZXcgTm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkZWZhdWx0IDogewotCQkJCWhhbmRsZXIgPSBuZXcgTm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQl9Ci0JCX0KLQotCQloYW5kbGVyLnNldENsZWFudXBQcmVmZXJlbmNlcyhjbGVhbnVwUHJlZmVyZW5jZXMpOwotCi0JCXJldHVybiBoYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0KLQlwcml2YXRlIGJvb2xlYW4gaXNKU1BUYWcoTm9kZSBub2RlKSB7Ci0KLQkJZmluYWwgU3RyaW5nIEpTUF9DTE9TRSA9ICJKU1BfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JCS8vIGZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9DTE9TRSA9ICJKU1BfQ09NTUVOVF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfT1BFTiA9ICJKU1BfQ09NTUVOVF9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfVEVYVCA9ICJKU1BfQ09NTUVOVF9URVhUIjsgLy8kTk9OLU5MUy0xJAotCi0JCWZpbmFsIFN0cmluZyBKU1BfQ09OVEVOVCA9ICJKU1BfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIEpTUF9ERUNMQVJBVElPTl9PUEVOID0gIkpTUF9ERUNMQVJBVElPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9DTE9TRSA9ICJKU1BfRElSRUNUSVZFX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9OQU1FID0gIkpTUF9ESVJFQ1RJVkVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCQlmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9PUEVOID0gIkpTUF9ESVJFQ1RJVkVfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIEpTUF9FWFBSRVNTSU9OX09QRU4gPSAiSlNQX0VYUFJFU1NJT05fT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBmaW5hbCBTdHJpbmcgSlNQX1JPT1RfVEFHX05BTUUgPSAiSlNQX1JPT1RfVEFHX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQkJZmluYWwgU3RyaW5nIEpTUF9TQ1JJUFRMRVRfT1BFTiA9ICJKU1BfU0NSSVBUTEVUX09QRU4iOyAvLyROT04tTkxTLTEkCi0KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCS8vIGluIHNvbWUgY2FzZXMsIHRoZSBub2RlcyBleGlzdHMsIGJ1dCBoYXNuJ3QgYmVlbiBhc3NvY2lhdGVkCi0JCQkvLyB3aXRoCi0JCQkvLyBhIGZsYXRub2RlIHlldCAodGhlIHNjcmVlbiB1cGRhdGVzIGNhbiBiZSBpbml0aWF0ZWQgb24gYQotCQkJLy8gZGlmZmVyZW50IHRocmVhZCwKLQkJCS8vIHNvIHRoZSByZXF1ZXN0IGZvciBhIGZsYXRub2RlIGNhbiBjb21lIGluIGJlZm9yZSB0aGUgbm9kZSBpcwotCQkJLy8gZnVsbHkgZm9ybWVkLgotCQkJLy8gaWYgdGhlIGZsYXRub2RlIGlzIG51bGwsIHdlJ2xsIGp1c3QgYWxsb3cgdGhlIGRlZmF1bHRzIHRvCi0JCQkvLyBhcHBseS4KLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGZsYXROb2RlVHlwZSA9IGZsYXROb2RlLmdldFR5cGUoKTsKLQkJCQkvLyBzaG91bGQgbm90IGJlIG51bGwsIGJ1dCBqdXN0IHRvIGJlIHN1cmUKLQkJCQlpZiAoZmxhdE5vZGVUeXBlICE9IG51bGwpIHsKLQkJCQkJaWYgKChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9DT05URU5UKSkgfHwgKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX0VYUFJFU1NJT05fT1BFTikpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9TQ1JJUFRMRVRfT1BFTikpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9ERUNMQVJBVElPTl9PUEVOKSkgfHwgKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX0RJUkVDVElWRV9DTE9TRSkpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9ESVJFQ1RJVkVfTkFNRSkpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9ESVJFQ1RJVkVfT1BFTikpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9DTE9TRSkpKSB7Ci0JCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNQYXJlbnRTdHlsZVRhZyhOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCEobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9ICgoSURPTU5vZGUpIG5vZGUpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZmxhdE5vZGUuZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyBjaGVjayBpZiB0aGUgcGFyZW50IGlzIFNUWUxFIGVsZW1lbnQKLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBuYW1lID0gcGFyZW50LmdldE5vZGVOYW1lKCk7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJTVFlMRSIpKS8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9IVE1MQ2xlYW51cFByb2Nlc3NvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0hUTUxDbGVhbnVwUHJvY2Vzc29ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGIyOTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0hUTUxDbGVhbnVwUHJvY2Vzc29ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0LkhUTUxGb3JtYXRQcm9jZXNzb3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5BYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MQ2xlYW51cFByb2Nlc3NvckltcGwgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIHsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGZDbGVhbnVwUHJlZmVyZW5jZXMgPSBudWxsOwotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDb250ZW50VHlwZUlkRm9ySFRNTC5Db250ZW50VHlwZUlEX0hUTUw7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgZ2V0Q2xlYW51cEhhbmRsZXIoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBIVE1MQ2xlYW51cEhhbmRsZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlSGFuZGxlcihub2RlLCBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKSk7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGdldENsZWFudXBQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGZDbGVhbnVwUHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkNsZWFudXBQcmVmZXJlbmNlcyA9IG5ldyBTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzKCk7Ci0KLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpOwotCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldFRhZ05hbWVDYXNlKHByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX1RBR19OQU1FX0NBU0UpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEF0dHJOYW1lQ2FzZShwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9BVFRSX05BTUVfQ0FTRSkpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NUFJFU1NfRU1QVFlfRUxFTUVOVF9UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRJbnNlcnRSZXF1aXJlZEF0dHJzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX1JFUVVJUkVEX0FUVFJTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRJbnNlcnRNaXNzaW5nVGFncyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9NSVNTSU5HX1RBR1MpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldFF1b3RlQXR0clZhbHVlcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRGb3JtYXRTb3VyY2UocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRDb252ZXJ0RU9MQ29kZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT05WRVJUX0VPTF9DT0RFUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0RU9MQ29kZShwcmVmZXJlbmNlcy5nZXRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9FT0xfQ09ERSkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZDbGVhbnVwUHJlZmVyZW5jZXM7Ci0JfQotCQotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBnZXRGb3JtYXRQcm9jZXNzb3IoKSB7Ci0JCXJldHVybiBuZXcgSFRNTEZvcm1hdFByb2Nlc3NvckltcGwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ2xlYW51cFByZWZlcmVuY2VzKCkgewotCQlmQ2xlYW51cFByZWZlcmVuY2VzID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9KU1BFbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9KU1BFbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYzhhNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvSlNQRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgSlNQRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlciBleHRlbmRzIEFic3RyYWN0Tm9kZUNsZWFudXBIYW5kbGVyIHsKLQotCXB1YmxpYyBOb2RlIGNsZWFudXAoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBub2RlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL05vZGVDbGVhbnVwSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvTm9kZUNsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMWYzNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvTm9kZUNsZWFudXBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBOb2RlQ2xlYW51cEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdE5vZGVDbGVhbnVwSGFuZGxlciB7Ci0KLQlwdWJsaWMgTm9kZSBjbGVhbnVwKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbm9kZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaGFuZGxlcnMvQ29tbWVudEVsZW1lbnRIYW5kbGVyRm9yU1NJLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaGFuZGxlcnMvQ29tbWVudEVsZW1lbnRIYW5kbGVyRm9yU1NJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNTI4YmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L2hhbmRsZXJzL0NvbW1lbnRFbGVtZW50SGFuZGxlckZvclNTSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmhhbmRsZXJzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LnV0aWwuQ29tbWVudEVsZW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC51dGlsLlRhZ1NjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci0KLXB1YmxpYyBjbGFzcyBDb21tZW50RWxlbWVudEhhbmRsZXJGb3JTU0kgaW1wbGVtZW50cyBDb21tZW50RWxlbWVudEhhbmRsZXIgewotCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGRhdGEsIGJvb2xlYW4gaXNKU1BUYWcpIHsKLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb2N1bWVudCk7Ci0JCWlmIChtb2RlbFF1ZXJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUNNRG9jdW1lbnQgY20gPSBtb2RlbFF1ZXJ5LmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KGRvY3VtZW50KTsKLQkJaWYgKGNtID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUNNTmFtZWROb2RlTWFwIG1hcCA9IGNtLmdldEVsZW1lbnRzKCk7Ci0JCWlmIChtYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlUYWdTY2FubmVyIHNjYW5uZXIgPSBuZXcgVGFnU2Nhbm5lcihkYXRhLCAxKTsKLQkJU3RyaW5nIG5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKG5hbWUubGVuZ3RoKCkgKyA0KTsKLQkJYnVmZmVyLmFwcGVuZChTU0lfUFJFRklYKTsKLQkJYnVmZmVyLmFwcGVuZCgnOicpOwotCQlidWZmZXIuYXBwZW5kKG5hbWUpOwotCQlTdHJpbmcgdGFnTmFtZSA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkvLyBjaGVjayBpZiB2YWxpZCAoZGVmaW5lZCkgU1NJIHRhZyBvciBub3QKLQkJaWYgKG1hcC5nZXROYW1lZEl0ZW0odGFnTmFtZSkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDb21tZW50RWxlbWVudEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBDb21tZW50RWxlbWVudEZhY3RvcnkoZG9jdW1lbnQsIGlzSlNQVGFnLCB0aGlzKTsKLQkJRWxlbWVudCBlbGVtZW50ID0gZmFjdG9yeS5jcmVhdGUodGFnTmFtZSwgQ29tbWVudEVsZW1lbnRGYWN0b3J5LklTX1NUQVJUKTsKLQotCQkvLyBzZXQgYXR0cmlidXRlcwotCQlTdHJpbmcgYXR0ck5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCXdoaWxlIChhdHRyTmFtZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgYXR0clZhbHVlID0gc2Nhbm5lci5uZXh0VmFsdWUoKTsKLQkJCUF0dHIgYXR0ciA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShhdHRyTmFtZSk7Ci0JCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsKQotCQkJCQlhdHRyLnNldFZhbHVlKGF0dHJWYWx1ZSk7Ci0JCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQkJfQotCQkJYXR0ck5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVN0YXJ0VGFnQ29udGVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gZWxlbWVudC5nZXRNb2RlbCgpLmdldEdlbmVyYXRvcigpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWJ1ZmZlci5hcHBlbmQoJyMnKTsKLQkJYnVmZmVyLmFwcGVuZChlbGVtZW50LmdldExvY2FsTmFtZSgpKTsKLQotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpbnQgbGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ciBhdHRyID0gKEF0dHIpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCVN0cmluZyBhdHRyTmFtZSA9IGdlbmVyYXRvci5nZW5lcmF0ZUF0dHJOYW1lKGF0dHIpOwotCQkJaWYgKGF0dHJOYW1lICE9IG51bGwpIHsKLQkJCQlidWZmZXIuYXBwZW5kKGF0dHJOYW1lKTsKLQkJCX0KLQkJCVN0cmluZyBhdHRyVmFsdWUgPSBnZW5lcmF0b3IuZ2VuZXJhdGVBdHRyVmFsdWUoYXR0cik7Ci0JCQlpZiAoYXR0clZhbHVlICE9IG51bGwpIHsKLQkJCQkvLyBhdHRyIG5hbWUgb25seSBmb3IgSFRNTCBib29sZWFuIGFuZCBKU1AKLQkJCQlidWZmZXIuYXBwZW5kKCc9Jyk7Ci0JCQkJYnVmZmVyLmFwcGVuZChhdHRyVmFsdWUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVFbmRUYWdDb250ZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7IC8vIGFsd2F5cyBlbXB0eQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29tbWVudEVsZW1lbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb2N1bWVudCk7Ci0JCWlmIChtb2RlbFF1ZXJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlDTURvY3VtZW50IGNtID0gbW9kZWxRdWVyeS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChkb2N1bWVudCk7Ci0JCWlmIChjbSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQ01OYW1lZE5vZGVNYXAgbWFwID0gY20uZ2V0RWxlbWVudHMoKTsKLQkJaWYgKG1hcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHByZWZpeCA9IGVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0JCWlmIChwcmVmaXggPT0gbnVsbCB8fCAhcHJlZml4LmVxdWFscyhTU0lfUFJFRklYKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCWlmICh0YWdOYW1lLmxlbmd0aCgpIDw9IDQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAobWFwLmdldE5hbWVkSXRlbSh0YWdOYW1lKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfUFJFRklYID0gInNzaSI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9BdHRyaWJ1dGVDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0F0dHJpYnV0ZUNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIyYTcxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0F0dHJpYnV0ZUNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotICovCi1maW5hbCBjbGFzcyBBdHRyaWJ1dGVDb2xsZWN0aW9uIGV4dGVuZHMgQ01OYW1lZE5vZGVNYXBJbXBsIGltcGxlbWVudHMgSFRNTDQwTmFtZXNwYWNlIHsKLQotCS8qKiBib2R5Y29sb3JzLiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEJPRFlDT0xPUlMgPSB7QVRUUl9OQU1FX0JHQ09MT1IsIEFUVFJfTkFNRV9URVhULCBBVFRSX05BTUVfTElOSywgQVRUUl9OQU1FX1ZMSU5LLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSU5LfTsKLQkvKiogY29yZWF0dHJzLiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPUkUgPSB7QVRUUl9OQU1FX0lELCBBVFRSX05BTUVfQ0xBU1MsIEFUVFJfTkFNRV9TVFlMRSwgQVRUUl9OQU1FX1RJVExFfTsKLQkvKiogZXZlbnRzLiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVWRU5UUyA9IHtBVFRSX05BTUVfT05DTElDSywgQVRUUl9OQU1FX09OREJMQ0xJQ0ssIEFUVFJfTkFNRV9PTk1PVVNFRE9XTiwgQVRUUl9OQU1FX09OTU9VU0VVUCwgQVRUUl9OQU1FX09OTU9VU0VPVkVSLCBBVFRSX05BTUVfT05NT1VTRU1PVkUsIEFUVFJfTkFNRV9PTk1PVVNFT1VULCBBVFRSX05BTUVfT05LRVlQUkVTUywgQVRUUl9OQU1FX09OS0VZRE9XTiwgQVRUUl9OQU1FX09OS0VZVVAsIEFUVFJfTkFNRV9PTkhFTFB9OwotCS8qKiBpMThuLiBsYW5nLCBkaXIgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBJMThOID0ge0FUVFJfTkFNRV9MQU5HLCBBVFRSX05BTUVfRElSfTsKLQkvKiogY2VsbGhhbGlnaC4gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDRUxMSEFMSUdOID0ge0FUVFJfTkFNRV9DSEFSLCBBVFRSX05BTUVfQ0hBUk9GRn07Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlQ29sbGVjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBhdHRyTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByaXZhdGUgSFRNTEF0dHJEZWNsSW1wbCBjcmVhdGUoU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0KLQkJaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0FCQlIpKSB7Ci0JCQkvLyAoYWJiciAlVGV4dDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuVEVYVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FCQlIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0FDQ0VQVCkpIHsKLQkJCS8vIChhY2NlcHQgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09OVEVOVF9UWVBFKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUNDRVBULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BQ0NFUFRfQ0hBUlNFVCkpIHsKLQkJCS8vIChhY2NlcHQtY2hhcnNldCAlQ2hhcnNldHM7OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DSEFSU0VUUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FDQ0VQVF9DSEFSU0VULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BQ1RJT04pKSB7Ci0JCQkvLyAoYWN0aW9uICVVUkkgI1JFUVVJUkVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUNUSU9OLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BUkNISVZFKSkgewotCQkJLy8gKGFyY2hpdmUgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FSQ0hJVkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0FDQ0VTU0tFWSkpIHsKLQkJCS8vIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ0hBUkFDVEVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUNDRVNTS0VZLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BTElOSykpIHsKLQkJCS8vIChhbGluayAlQ29sb3I7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTE9SKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxJTkssIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0FMVCkpIHsKLQkJCS8vIChhbHQgJVRleHQ7ICNSRVFVSVJFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5URVhUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BVVRPU1RBUlQpKSB7Ci0JCQkvLyAoYXV0b3N0YXJ0ICh0cnVlfGZhbHNlKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FVVE9TVEFSVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQVVUT1BMQVkpKSB7Ci0JCQkvLyAoYXV0b3BsYXkgKHRydWV8ZmFsc2UpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UUlVFLCBBVFRSX1ZBTFVFX0ZBTFNFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQVVUT1BMQVksIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0FVVE9TSVpFKSkgewotCQkJLy8gKGF1dG9zaXplICh0cnVlfGZhbHNlKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FVVE9TSVpFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BWElTKSkgewotCQkJLy8gKGF4aXMgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FYSVMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0JBQ0tHUk9VTkQpKSB7Ci0JCQkvLyAoYmFja2dyb3VuZCAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0JBQ0tHUk9VTkQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0JFSEFWSU9SKSkgewotCQkJLy8gKGJlaGF2aW9yIChzY3JvbGx8c2xpZGV8YWx0ZXJuYXRlKSBzY3JvbGwpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1NDUk9MTCwgQVRUUl9WQUxVRV9TTElERSwgQVRUUl9WQUxVRV9BTFRFUk5BVEV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1NDUk9MTCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0JFSEFWSU9SLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9CR0NPTE9SKSkgewotCQkJLy8gKGJnY29sb3IgJUNvbG9yOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT0xPUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0JHQ09MT1IsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0JPUkRFUikpIHsKLQkJCS8vIChib3JkZXIgJVBpeGVsczsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuUElYRUxTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQk9SREVSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DRUxMU1BBQ0lORykpIHsKLQkJCS8vIChjZWxsc3BhY2luZyAlTGVuZ3RoOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5MRU5HVEgpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DRUxMU1BBQ0lORywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0VMTFBBRERJTkcpKSB7Ci0JCQkvLyAoY2VsbHBhZGRpbmcgJUxlbmd0aDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEVOR1RIKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0VMTFBBRERJTkcsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NHSSkpIHsKLQkJCS8vIChjZ2kgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DR0ksIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NIQVIpKSB7Ci0JCQkvLyAoY2hhciAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DSEFSQUNURVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DSEFSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DSEFST0ZGKSkgewotCQkJLy8gKGNoYXJvZmYgJUxlbmd0aDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEVOR1RIKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0hBUk9GRiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0hBUlNFVCkpIHsKLQkJCS8vIChjaGFyc2V0ICVDaGFyc2V0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DSEFSU0VUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0hBUlNFVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0lURSkpIHsKLQkJCS8vIChjaXRlICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0lURSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0xBU1MpKSB7Ci0JCQkvLyAoY2xhc3MgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NMQVNTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DTEFTU0lEKSkgewotCQkJLy8gKGNsYXNzaWQgJVVSSSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NMQVNTSUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NNRCkpIHsKLQkJCS8vIChjbWQgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NNRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0hFQ0tFRCkpIHsKLQkJCS8vIChjaGVja2VkIChjaGVja2VkKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9DSEVDS0VEfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0hFQ0tFRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0xFQVIpKSB7Ci0JCQkvLyAoY2xlYXIgKGxlZnQgfCBhbGwgfCByaWdodCB8IG5vbmUpIG5vbmUpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0xFRlQsIEFUVFJfVkFMVUVfQUxMLCBBVFRSX1ZBTFVFX1JJR0hULCBBVFRSX1ZBTFVFX05PTkV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX05PTkUpOwotCi0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NMRUFSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT0RFKSkgewotCQkJLy8gKGNvZGUgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPREUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NPREVCQVNFKSkgewotCQkJLy8gKGNvZGViYXNlICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ09ERUJBU0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NPREVUWVBFKSkgewotCQkJLy8gKGNvZGV0eXBlICVDb3RlbnRUeXBlOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT05URU5UX1RZUEUpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT0RFVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ09MT1IpKSB7Ci0JCQkvLyAoY29sb3IgJUNvbG9yOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT0xPUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPTE9SLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT01QQUNUKSkgewotCQkJLy8gKGNvbXBhY3QgKGNvbXBhY3QpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX0NPTVBBQ1R9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT01QQUNULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT0xTKSkgewotCQkJLy8gKGNvbHMgTlVNQkVSICNSRVFVSVJFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPTFMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NPTFNQQU4pKSB7Ci0JCQkvLyAoY29sc3BhbiBOVU1CRVIgMSkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfMSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPTFNQQU4sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NPTlRFTlQpKSB7Ci0JCQkvLyAoY29udGVudCBDREFUQSAjUkVRVUlSRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPTlRFTlQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NPTlRST0xMRVIpKSB7Ci0JCQkvLyAoY29udHJvbGxlciAodHJ1ZXxmYWxzZSkgdHJ1ZSkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfVFJVRSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPTlRST0xMRVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NPT1JEUykpIHsKLQkJCS8vIChjb29yZHMgJUNvb3JkczsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09PUkRTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ09PUkRTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9EQVRBKSkgewotCQkJLy8gKGRhdGEgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9EQVRBLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9EQVRFVElNRSkpIHsKLQkJCS8vIChkYXRldGltZSAlRGF0ZXRpbWU7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkRBVEVUSU1FKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfREFURVRJTUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0RBVEFQQUdFU0laRSkpIHsKLQkJCS8vIChkYXRhcGFnZXNpemUgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0RBVEFQQUdFU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfREVDTEFSRSkpIHsKLQkJCS8vIChkZWNsYXJlIChkZWNsYXJlKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9ERUNMQVJFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfREVDTEFSRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfREVGRVIpKSB7Ci0JCQkvLyAoZGVmZXIgKGRlZmVyKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9ERUZFUn07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0RFRkVSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9ESVIpKSB7Ci0JCQkvLyAoZGlyIChsdHJ8cnRsKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfTFRSLCBBVFRSX1ZBTFVFX1JUTH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0RJUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRElSRUNUSU9OKSkgewotCQkJLy8gKGRpcmVjdGlvbiAobGVmdHxyaWdodHx1cHxkb3duKSBsZWZ0KQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX1JJR0hULCBBVFRSX1ZBTFVFX1VQLCBBVFRSX1ZBTFVFX0RPV059OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ESVJFQ1RJT04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0RJUkVDVEtFWSkpIHsKLQkJCS8vIChkaXJlY3RrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ0hBUkFDVEVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRElSRUNUS0VZLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9ESVNBQkxFRCkpIHsKLQkJCS8vIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQkvLyBib29sZWFuIGF0dHJpYnV0ZSBtdXN0IGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgaXRzIG5hbWUuCi0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX0RJU0FCTEVEfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRElTQUJMRUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0VOQ1RZUEUpKSB7Ci0JCQkvLyAoZW5jdHlwZSAlQ29udGVudFR5cGU7ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTlRFTlRfVFlQRSk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfV1dXX0ZPUk1fVVJMRU5DT0RFRCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0VOQ1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0VSUk1TRykpIHsKLQkJCS8vIChlcnJtc2cgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0VSUk1TRywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRVZFTlQpKSB7Ci0JCQkvLyAoZXZlbnQgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0VWRU5ULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9GQUNFKSkgewotCQkJLy8gKGZhY2UgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0ZBQ0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0ZJTEUpKSB7Ci0JCQkvLyAoZmlsZSAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0ZJTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0ZPUikpIHsKLQkJCS8vIChmb3IgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GT1IsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0ZSQU1FKSkgewotCQkJLy8gKGZyYW1lICVURnJhbWU7ICNJTVBMSUVEKQotCQkJLy8gJVRGcmFtZTsgaXMKLQkJCS8vICh2b2lkfGFib3ZlfGJlbG93fGhzaWRlc3xsaHN8cmhzfHZzaWRlc3xib3h8Ym9yZGVyKS4KLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVk9JRCwgQVRUUl9WQUxVRV9BQk9WRSwgQVRUUl9WQUxVRV9CRUxPVywgQVRUUl9WQUxVRV9IU0lERVMsIEFUVFJfVkFMVUVfTEhTLCBBVFRSX1ZBTFVFX1JIUywgQVRUUl9WQUxVRV9WU0lERVMsIEFUVFJfVkFMVUVfQk9YLCBBVFRSX1ZBTFVFX0JPUkRFUn07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0ZSQU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9GUkFNRUJPUkRFUikpIHsKLQkJCS8vIChmcmFtZWJvcmRlciAoMXwwKSAxKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV8xLCBBVFRSX1ZBTFVFXzB9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFXzEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GUkFNRUJPUkRFUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCQkvLyA8PEQyMTU2ODQKLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9GUkFNRVNQQUNJTkcpKSB7Ci0JCQkvLyAoZnJhbWVzcGFjaW5nIENEQVRBOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRlJBTUVTUEFDSU5HLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCQkvLyBEMjE1Njg0Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSEVBREVSUykpIHsKLQkJCS8vIChIRUFERVJTIElEUkVGUzsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuSURSRUZTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSEVBREVSUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSEVJR0hUKSkgewotCQkJLy8gKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5MRU5HVEgpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9IRUlHSFQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hJRERFTikpIHsKLQkJCS8vIChoaWRkZW4gQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hJRERFTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSFJFRikpIHsKLQkJCS8vIChocmVmICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSFJFRiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSFJFRkxBTkcpKSB7Ci0JCQkvLyAoaHJlZmxhbmcgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEFOR1VBR0VfQ09ERSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hSRUZMQU5HLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9IU1BBQ0UpKSB7Ci0JCQkvLyAoaHNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hTUEFDRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSFRUUF9FUVVJVikpIHsKLQkJCS8vIChodHRwLWVxdWl2IE5BTUUgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTkFNRSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hUVFBfRVFVSVYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0lEKSkgewotCQkJLy8gKGlkIElEICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuSUQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9JRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSVNNQVApKSB7Ci0JCQkvLyAoaXNtYXAgKGlzbWFwKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9JU01BUH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0lTTUFQLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9JU1RZTEUpKSB7Ci0JCQkvLyAoaXN0eWxlIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9JU1RZTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0xBQkVMKSkgewotCQkJLy8gKGxhYmVsICVUZXh0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5URVhUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTEFCRUwsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0xBTkcpKSB7Ci0JCQkvLyAobGFuZyAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5MQU5HVUFHRV9DT0RFKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTEFORywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTEFOR1VBR0UpKSB7Ci0JCQkvLyAobGFuZ3VhZ2UgJUNEQVRBOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTEFOR1VBR0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0xJTkspKSB7Ci0JCQkvLyAobGluayAlQ29sb3I7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTE9SKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTElOSywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTE9OR0RFU0MpKSB7Ci0JCQkvLyAobG9uZ2Rlc2MgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9MT05HREVTQywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTE9PUCkpIHsKLQkJCS8vIChsb29wIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9MT09QLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NQUNSTykpIHsKLQkJCS8vIChtYWNybyBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTUFDUk8sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX01BUEZJTEUpKSB7Ci0JCQkvLyAobWFwZmlsZSAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01BUEZJTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX01BUkdJTldJRFRIKSkgewotCQkJLy8gKG1hcmdpbndpZHRoICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01BUkdJTldJRFRILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NQVJHSU5IRUlHSFQpKSB7Ci0JCQkvLyAobWFyZ2luaGVpZ2h0ICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01BUkdJTkhFSUdIVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTUFYTEVOR1RIKSkgewotCQkJLy8gKG1heGxlbmd0aCBOVU1CRVIgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NQVhMRU5HVEgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX01BWVNDUklQVCkpIHsKLQkJCS8vIChtYXlzY3JpcHQgKG1heXNjcmlwdCkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfTUFZU0NSSVBUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTUFZU0NSSVBULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NRURJQSkpIHsKLQkJCS8vIChtZWRpYSAlTWVkaWFEZXNjOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5NRURJQV9ERVNDKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTUVESUEsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX01FVEhPRCkpIHsKLQkJCS8vIChtZXRob2QgKEdFVHxQT1NUKSBHRVQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0dFVCwgQVRUUl9WQUxVRV9QT1NUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9HRVQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NRVRIT0QsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX01VTFRJUExFKSkgewotCQkJLy8gKG11bHRpcGxlIChtdWx0aXBsZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfTVVMVElQTEV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NVUxUSVBMRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTkFNRSkpIHsKLQkJCS8vIChuYW1lIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9OQU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9OT0hSRUYpKSB7Ci0JCQkvLyAobm9ocmVmIChub2hyZWYpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX05PSFJFRn07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX05PSFJFRiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTk9SRVNJWkUpKSB7Ci0JCQkvLyAobm9yZXNpemUgKG5vcmVzaXplKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9OT1JFU0laRX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX05PUkVTSVpFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9OT1NIQURFKSkgewotCQkJLy8gKG5vc2hhZGUgKG5vc2hhZGUpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX05PU0hBREV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9OT1NIQURFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9OT1dSQVApKSB7Ci0JCQkvLyAobm93cmFwIChub3dyYXApICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX05PV1JBUH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX05PV1JBUCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT0JKRUNUKSkgewotCQkJLy8gKG9iamVjdCBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9PQkpFQ1R9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PQkpFQ1QsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OQkxVUikpIHsKLQkJCS8vIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05CTFVSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTkNMSUNLKSkgewotCQkJLy8gKG9uY2xpY2sgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05DTElDSywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05DSEFOR0UpKSB7Ci0JCQkvLyAob25jaGFuZ2UgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05DSEFOR0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OREJMQ0xJQ0spKSB7Ci0JCQkvLyAob25kYmxjbGljayAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTkRCTENMSUNLLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTkZPQ1VTKSkgewotCQkJLy8gKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05GT0NVUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05IRUxQKSkgewotCQkJLy8gKG9uaGVscCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTkhFTFAsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OS0VZUFJFU1MpKSB7Ci0JCQkvLyAob25rZXlwcmVzcyAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTktFWVBSRVNTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTktFWURPV04pKSB7Ci0JCQkvLyAob25rZXlkb3duICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OS0VZRE9XTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05LRVlVUCkpIHsKLQkJCS8vIChvbmt5ZXVwICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OS0VZVVAsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OTE9BRCkpIHsKLQkJCS8vIChvbmxvYWQgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05MT0FELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTk1PVVNFRE9XTikpIHsKLQkJCS8vIChvbm1vdXNlZG93biAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTk1PVVNFRE9XTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05NT1VTRVVQKSkgewotCQkJLy8gKG9ubW91c2V1cCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTk1PVVNFVVAsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OTU9VU0VPVkVSKSkgewotCQkJLy8gKG9ubW91c2VvdmVyICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OTU9VU0VPVkVSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTk1PVVNFTU9WRSkpIHsKLQkJCS8vIChvbm1vdXNlbW92ZSAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTk1PVVNFTU9WRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05NT1VTRU9VVCkpIHsKLQkJCS8vIChvbm1vdXNlb3V0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OTU9VU0VPVVQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OUkVTRVQpKSB7Ci0JCQkvLyAob25yZXNldCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTlJFU0VULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTlNFTEVDVCkpIHsKLQkJCS8vIChvbnNlbGVjdCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTlNFTEVDVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05TVUJNSVQpKSB7Ci0JCQkvLyAob25zdWJtaXQgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05TVUJNSVQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OVU5MT0FEKSkgewotCQkJLy8gKG9udW5sb2FkICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OVU5MT0FELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9QQUxFVFRFKSkgewotCQkJLy8gKHBhbGV0dGUgQ0RBVEE7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9QQUxFVFRFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9QQU5FTCkpIHsKLQkJCS8vIChwYW5lbCBDREFUQTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1BBTkVMLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9QTEFZQ09VTlQpKSB7Ci0JCQkvLyAocGxheWNvdW50IE5VTUJFUjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9QTEFZQ09VTlQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1BST0ZJTEUpKSB7Ci0JCQkvLyAocHJvZmlsZSAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1BST0ZJTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1BST01QVCkpIHsKLQkJCS8vIChwcm9tcHQgJVRleHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlRFWFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9QUk9NUFQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1JFQURPTkxZKSkgewotCQkJLy8gKHJlYWRvbmx5IChyZWFkb25seSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfUkVBRE9OTFl9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9SRUFET05MWSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUkVQRUFUKSkgewotCQkJLy8gKHJlcGVhdCBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUkVQRUFULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9SRUwpKSB7Ci0JCQkvLyAocmVsICVMaW5rVHlwZXM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxJTktfVFlQRVMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9SRUwsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1JFVikpIHsKLQkJCS8vIChyZXYgJUxpbmtUeXBlczsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTElOS19UWVBFUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1JFViwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUk9XUykpIHsKLQkJCS8vIChyb3dzIE5VTUJFUiAjUkVRVUlSRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ST1dTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9ST1dTUEFOKSkgewotCQkJLy8gKHJvd3NwYW4gTlVNQkVSIDEpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFXzEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ST1dTUEFOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9SVUxFUykpIHsKLQkJCS8vIChydWxlcyAlVFJ1bGVzOyAjSU1QTElFRCkKLQkJCS8vICVUUnVsZXM7IGlzIChub25lIHwgZ3JvdXBzIHwgcm93cyB8IGNvbHMgfCBhbGwpLgotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9OT05FLCBBVFRSX1ZBTFVFX0dST1VQUywgQVRUUl9WQUxVRV9ST1dTLCBBVFRSX1ZBTFVFX0NPTFMsIEFUVFJfVkFMVUVfQUxMfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUlVMRVMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NDQUxFKSkgewotCQkJLy8gKHNjYWxlIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TQ0FMRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0NIRU1FKSkgewotCQkJLy8gKHNjaGVtZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0NIRU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TRUxFQ1RFRCkpIHsKLQkJCS8vIChzZWxlY3RlZCAoc2VsZWN0ZWQpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX1NFTEVDVEVEfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0VMRUNURUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NDT1BFKSkgewotCQkJLy8gKFNDT1BFICVTY29wZTsgI0lNUExJRUQpCi0JCQkvLyAlU2NvcGU7IGlzIChyb3d8Y29sfHJvd2dyb3VwfGNvbGdyb3VwKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9ST1csIEFUVFJfVkFMVUVfQ09MLCBBVFRSX1ZBTFVFX1JPV0dST1VQLCBBVFRSX1ZBTFVFX0NPTEdST1VQfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0NPUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NDUk9MTEFNT1VOVCkpIHsKLQkJCS8vIChzY3JvbGxhbW91bnQgTlVNQkVSICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0NST0xMQU1PVU5ULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TQ1JPTExERUxBWSkpIHsKLQkJCS8vIChzY3JvbGxkZWxheSBOVU1CRVIgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TQ1JPTExERUxBWSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0NST0xMSU5HKSkgewotCQkJLy8gKHNjcm9sbGluZyAoeWVzfG5vfGF1dG8pIGF1dG8pCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1lFUywgQVRUUl9WQUxVRV9OTywgQVRUUl9WQUxVRV9BVVRPfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9BVVRPKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0NST0xMSU5HLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TSEFQRSkpIHsKLQkJCS8vIChzaGFwZSAlU2hhcGU7IHJlY3QpOiAlU2hhcGU7IGlzIChyZWN0fGNpcmNsZXxwb2x5fGRlZmF1bHQpLgotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9SRUNULCBBVFRSX1ZBTFVFX0NJUkNMRSwgQVRUUl9WQUxVRV9QT0xZLCBBVFRSX1ZBTFVFX0RFRkFVTFR9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1JFQ1QpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TSEFQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0hPV0NPTlRST0xTKSkgewotCQkJLy8gKHNob3djb250cm9scyAodHJ1ZXxmYWxzZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TSE9XQ09OVFJPTFMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NJWkUpKSB7Ci0JCQkvLyAoc2l6ZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TSVpFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TSVpFRk1UKSkgewotCQkJLy8gKHNpemVmbXQgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NJWkVGTVQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NQQU4pKSB7Ci0JCQkvLyAoc3BhbiBOVU1CRVIgMSkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfMSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NQQU4sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NSQykpIHsKLQkJCS8vIChzcmMgJVVSSTsgI0lNUExJRUQpCi0JCQkvLyBOT1RFOiAic3JjIiBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkIGluIHNldmVyYWwgZWxlbWVudHMuCi0JCQkvLyBUaGUgZGVmaW5pdGlvbiBvZiBJTUcgaXMgZGlmZmVyZW50IGZyb20gb3RoZXJzLgotCQkJLy8gU28sIGl0IHNob3VsZCBiZSBsb2NhbGx5IGRlZmluZWQuCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TUkMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NUQVJUKSkgewotCQkJLy8gKHN0YXJ0IE5VTUJFUiAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NUQVJULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TVEFOREJZKSkgewotCQkJLy8gKHN0YW5kYnkgJVRleHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlRFWFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TVEFOREJZLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TVFlMRSkpIHsKLQkJCS8vIChzdHlsZSAlU3R5bGVTaGVldDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU1RZTEVfU0hFRVQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TVFlMRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU1VNTUFSWSkpIHsKLQkJCS8vIChzdW1tYXJ5ICVUZXh0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5URVhUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU1VNTUFSWSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVEFCSU5ERVgpKSB7Ci0JCQkvLyAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVEFCSU5ERVgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1RBUkdFVCkpIHsKLQkJCS8vICh0YXJnZXQgJUZyYW1lVGFyZ2V0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5GUkFNRV9UQVJHRVQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9UQVJHRVQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1RFWFQpKSB7Ci0JCQkvLyAodGV4dCAlQ29sb3I7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTE9SKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVEVYVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVEVYVEZPQ1VTKSkgewotCQkJLy8gKHRleHRmb2N1cyBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVEVYVEZPQ1VTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9USVRMRSkpIHsKLQkJCS8vICh0aXRsZSAlVGV4dDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuVEVYVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RJVExFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9USU1FRk1UKSkgewotCQkJLy8gKHRpbWVmbXQgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RJTUVGTVQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1RSVUVTUEVFRCkpIHsKLQkJCS8vICh0cnVlc3BlZWQgKHRydWVzcGVlZCkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfVFJVRVNQRUVEfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVFJVRVNQRUVELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9UWVBFKSkgewotCQkJLy8gKHR5cGUgJUNvdGVudFR5cGU7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTlRFTlRfVFlQRSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1VTRU1BUCkpIHsKLQkJCS8vICh1c2VtYXAgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9VU0VNQVAsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZBTElHTikpIHsKLQkJCS8vICh2YWxpZ24gKHRvcHxtaWRkbGV8Ym90dG9tfGJhc2VsaW5lKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVE9QLCBBVFRSX1ZBTFVFX01JRERMRSwgQVRUUl9WQUxVRV9CT1RUT00sIEFUVFJfVkFMVUVfQkFTRUxJTkV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZBTFVFKSkgewotCQkJLy8gKHZhbHVlIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WQUxVRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVkFMVUVUWVBFKSkgewotCQkJLy8gKHZhbHVldHlwZSAoREFUQXxSRUZ8T0JKRUNUKSBEQVRBKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9EQVRBLCBBVFRSX1ZBTFVFX1JFRiwgQVRUUl9WQUxVRV9PQkpFQ1R9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WQUxVRVRZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZBUikpIHsKLQkJCS8vICh2YXIgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZBUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVkVSU0lPTikpIHsKLQkJCS8vICh2ZXJzaW9uIENEQVRBICNGSVhFRCAnJUhUTUwuVmVyc2lvbjspCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0ZJWEVELCBBVFRSX1ZBTFVFX1ZFUlNJT05fVFJBTlNJVElPTkFMKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVkVSU0lPTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uRklYRUQpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVklSVFVBTCkpIHsKLQkJCS8vICh2aXJ0dWFsICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVklSVFVBTCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVkxJTkspKSB7Ci0JCQkvLyAodmxpbmsgJUNvbG9yOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT0xPUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZMSU5LLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WT0xVTUUpKSB7Ci0JCQkvLyAodm9sdW1lIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WT0xVTUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1dJRFRIKSkgewotCQkJLy8gKHdpZHRoICVMZW5ndGg7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxFTkdUSCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1dJRFRILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WU1BBQ0UpKSB7Ci0JCQkvLyAodnNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZTUEFDRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCQkvLyA8PEQyMDU1MTQKLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9UT1BNQVJHSU4pKSB7Ci0JCQkvLyAodG9wbWFyZ2luLCBDREFUQSwgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RPUE1BUkdJTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQk9UVE9NTUFSR0lOKSkgewotCQkJLy8gKGJvdHRvbW1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9CT1RUT01NQVJHSU4sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0xFRlRNQVJHSU4pKSB7Ci0JCQkvLyAobGVmdG1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9MRUZUTUFSR0lOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9SSUdIVE1BUkdJTikpIHsKLQkJCS8vIChyaWdodG1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9SSUdIVE1BUkdJTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQk9SREVSQ09MT1IpKSB7Ci0JCQkvLyAoYm9yZGVyY29sb3IsICVDb2xvcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09MT1IpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9CT1JERVJDT0xPUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJLy8gRDIwNTUxNAotCi0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB1bmtub3duIGF0dHJpYnV0ZTsgbWF5YmUgZXJyb3IuCi0JCQkvLyBzaG91bGQgd2Fybi4KLQkJCWF0dHIgPSBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsaWduIGF0dHJpYnV0ZSB3aGljaCBoYXMgJUNBbGlnbjsgYXMgdmFsdWVzLi4gQXQgdGhpcyB0aW1lCi0JICogKDQvMTkvMjAwMSksIGl0IGlzIGlkZW50aWNhbCB0byAlTEFsaWduOy4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEhUTUxBdHRyRGVjbEltcGwgY3JlYXRlQWxpZ25Gb3JDYXB0aW9uKCkgewotCQkvLyBhbGlnbiAobG9jYWwpCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJLy8gc2V0IGVudW0gdmFsdWVzCi0JCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RPUCwgQVRUUl9WQUxVRV9CT1RUT00sIEFUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9SSUdIVH07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsaWduIGF0dHJpYnV0ZSB3aGljaCBoYXMgJUlBbGlnbjsgYXMgdmFsdWVzLi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEhUTUxBdHRyRGVjbEltcGwgY3JlYXRlQWxpZ25Gb3JJbWFnZSgpIHsKLQkJLy8gYWxpZ24gKGxvY2FsKQotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCS8vIHNldCBlbnVtIHZhbHVlcwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UT1AsIEFUVFJfVkFMVUVfTUlERExFLCBBVFRSX1ZBTFVFX0JPVFRPTSwgQVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX1JJR0hUfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BTElHTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWxpZ24gYXR0cmlidXRlIHdoaWNoIGhhcyAlTEFsaWduOyBhcyB2YWx1ZXMuLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRNTEF0dHJEZWNsSW1wbCBjcmVhdGVBbGlnbkZvckxlZ2VuZCgpIHsKLQkJLy8gYWxpZ24gKGxvY2FsKQotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCS8vIHNldCBlbnVtIHZhbHVlcwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UT1AsIEFUVFJfVkFMVUVfQk9UVE9NLCBBVFRSX1ZBTFVFX0xFRlQsIEFUVFJfVkFMVUVfUklHSFR9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb24gZm9yIDxjb2RlPmFsaWduPC9jb2RlPiBpbiBzZXZlcmFsCi0JICogZWxlbWVudHMsIGxpa2UgPGNvZGU+UDwvY29kZT4sIDxjb2RlPkRJVjwvY29kZT4uIFRoZSB2YWx1ZXMgYXJlCi0JICogZGlmZmVyZW50IGZyb20gYXR0cmlidXRlcyB0aG9zZSBoYXZlIHRoZSBzYW1lIG5hbWUgaW4gb3RoZXIgZWxlbWVudHMgKDxjb2RlPklNRzwvY29kZT4KLQkgKiBhbmQgPGNvZGU+VEFCTEU8L2NvZGU+KS4gU28sIGl0IGNhbid0IHRyZWF0IGFzIGdsb2JhbCBhdHRyaWJ1dGVzLgotCSAqIDxzdHJvbmc+Tk9URTogVGhlc2UgYXR0cmlidXRlIGRlY2xhcmF0aW9uIGhhcyBubyBvd25lciBDTURvY3VtZW50Ci0JICogaW5zdGFuY2UuPC9zdHJvbmc+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBIVE1MQXR0ckRlY2xJbXBsIGNyZWF0ZUFsaWduRm9yUGFyYWdyYXBoKCkgewotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCS8vIHNldCBlbnVtIHZhbHVlczogbGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeQotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX0NFTlRFUiwgQVRUUl9WQUxVRV9SSUdIVCwgQVRUUl9WQUxVRV9KVVNUSUZZfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BTElHTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgJWF0dHJzOyBkZWNsYXJhdGlvbnMuICVhdHRyczsgY29uc2lzdHMgb2YgJWNvcmVhdHRyczssICVpMThuLCBhbmQKLQkgKiAlZXZlbnRzOy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRBdHRycyhDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zKSB7Ci0JCS8vICVjb3JlYXR0cnM7Ci0JCUl0ZXJhdG9yIG5hbWVzID0gQXJyYXlzLmFzTGlzdChDT1JFKS5pdGVyYXRvcigpOwotCQlnZXREZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zLCBuYW1lcyk7Ci0JCS8vICVpMThuOwotCQluYW1lcyA9IEFycmF5cy5hc0xpc3QoSTE4TikuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCQkvLyAlZXZlbnRzOwotCQluYW1lcyA9IEFycmF5cy5hc0xpc3QoRVZFTlRTKS5pdGVyYXRvcigpOwotCQlnZXREZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zLCBuYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0ICVib2R5Y29sb3JzOyBkZWNsYXJhdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0Qm9keWNvbG9ycyhDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zKSB7Ci0JCUl0ZXJhdG9yIG5hbWVzID0gQXJyYXlzLmFzTGlzdChCT0RZQ09MT1JTKS5pdGVyYXRvcigpOwotCQlnZXREZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zLCBuYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0ICVjZWxsaGFsaWduOyBkZWNsYXJhdGlvbnMuICVjZWxsaGFsaWdoOyBjb25zaXN0cyBvZjogLSAoYWxpZ24KLQkgKiAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeXxjaGFyKSAjSU1QTElFRCkgLSAoY2hhciAlQ2hhcmFjdGVyOwotCSAqICNJTVBMSUVEKSAtIChjaGFyb2ZmICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqLwotCXB1YmxpYyB2b2lkIGdldENlbGxoYWxpZ24oQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQkvLyAoYWxpZ24gKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnl8Y2hhcikgI0lNUExJRUQpIHNob3VsZCBiZSBkZWZpbmVkCi0JCS8vIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJLy8gc2V0IGVudW0gdmFsdWVzCi0JCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0xFRlQsIEFUVFJfVkFMVUVfQ0VOVEVSLCBBVFRSX1ZBTFVFX1JJR0hULCBBVFRSX1ZBTFVFX0pVU1RJRlksIEFUVFJfVkFMVUVfQ0hBUn07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQotCQkvLyB0aGUgcmVzdC4KLQkJSXRlcmF0b3IgbmFtZXMgPSBBcnJheXMuYXNMaXN0KENFTExIQUxJR04pLml0ZXJhdG9yKCk7Ci0JCWdldERlY2xhcmF0aW9ucyhkZWNsYXJhdGlvbnMsIG5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgJWNlbGx2YWxpZ247IGRlY2xhcmF0aW9ucy4gJWNlbGxoYWxpZ2g7IGlzOiAtICh2YWxpZ24KLQkgKiAodG9wfG1pZGRsZXxib3R0b218YmFzZWxpbmUpICNJTVBMSUVEKQotCSAqLwotCXB1YmxpYyB2b2lkIGdldENlbGx2YWxpZ24oQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gZGVjID0gZ2V0RGVjbGFyYXRpb24oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxJR04pOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMSUdOLCBkZWMpOwotCX0KLQotCS8qKgotCSAqIEdldCAlY29yZWF0dHJzOyBkZWNsYXJhdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0Q29yZShDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zKSB7Ci0JCUl0ZXJhdG9yIG5hbWVzID0gQXJyYXlzLmFzTGlzdChDT1JFKS5pdGVyYXRvcigpOwotCQlnZXREZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zLCBuYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgZ2xvYmFsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0ck5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldERlY2xhcmF0aW9uKFN0cmluZyBhdHRyTmFtZSkgewotCQlDTU5vZGUgY21ub2RlID0gZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJaWYgKGNtbm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIChIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24pIGNtbm9kZTsgLy8gYWxyZWFkeSBleGlzdHMuCi0KLQkJSFRNTEF0dHJEZWNsSW1wbCBkZWMgPSBjcmVhdGUoYXR0ck5hbWUpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQlwdXROYW1lZEl0ZW0oYXR0ck5hbWUsIGRlYyk7Ci0KLQkJcmV0dXJuIGRlYzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZGVjbGFyYXRpb25zIHdoaWNoIGFyZSBzcGVjaWZpZWQgYnkgbmFtZXMuCi0JICogCi0JICogQHBhcmFtIG5hbWVzCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXREZWNsYXJhdGlvbnMoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucywgSXRlcmF0b3IgbmFtZXMpIHsKLQkJd2hpbGUgKG5hbWVzLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGF0dHJOYW1lID0gKFN0cmluZykgbmFtZXMubmV4dCgpOwotCQkJSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGRlYyA9IGdldERlY2xhcmF0aW9uKGF0dHJOYW1lKTsKLQkJCWlmIChkZWMgIT0gbnVsbCkKLQkJCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKGF0dHJOYW1lLCBkZWMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0ICVldmVudHM7IGRlY2xhcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRFdmVudHMoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQlJdGVyYXRvciBuYW1lcyA9IEFycmF5cy5hc0xpc3QoRVZFTlRTKS5pdGVyYXRvcigpOwotCQlnZXREZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zLCBuYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0ICVpMThuOyBkZWNsYXJhdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0STE4bihDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zKSB7Ci0JCUl0ZXJhdG9yIG5hbWVzID0gQXJyYXlzLmFzTGlzdChJMThOKS5pdGVyYXRvcigpOwotCQlnZXREZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zLCBuYW1lcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQ29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5NzNhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQ29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotCi0KLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBDTUNvbnRlbnQgZm9yIEhUTUwgQ00uCi0gKi8KLWFic3RyYWN0IGNsYXNzIENNQ29udGVudEltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgQ01Db250ZW50IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOQk9VTkRFRCA9IC0xOwotCS8qKiAgLTE6IGl0J3MgVU5CT1VOREVELiAqLwotCXByaXZhdGUgaW50IG1heE9jY3VyID0gVU5CT1VOREVEOwotCS8qKiAgMDogaXQncyBPUFRJT05BTCwgMSwgaXQncyBSRVFVSVJFRC4gKi8KLQlwcml2YXRlIGludCBtaW5PY2N1ciA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgcHJpbWFyeSBjb25zdHVyY3Rvci4KLQkgKiBVc2UgdGhpcyBvbmUgZm9yIHVzdWFsIGNhc2VzLjxicj4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50SW1wbChTdHJpbmcgbmFtZSwgaW50IG1pbiwgaW50IG1heCkgewotCQlzdXBlcihuYW1lKTsKLQkJbWluT2NjdXIgPSBtaW47Ci0JCW1heE9jY3VyID0gbWF4OwotCX0KLQotCS8qKgotCSAqIGdldE1heE9jY3VyIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBJZiAtMSwgaXQncyBVTkJPVU5ERUQuCi0JICovCi0JcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJcmV0dXJuIG1heE9jY3VyOwotCX0KLQotCS8qKgotCSAqIGdldE1pbk9jY3VyIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBJZiAwLCBpdCdzIE9QVElPTkFMLgotCSAqIElmIDEsIGl0J3MgUkVRVUlSRUQuCi0JICovCi0JcHVibGljIGludCBnZXRNaW5PY2N1cigpIHsKLQkJcmV0dXJuIG1pbk9jY3VyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Hcm91cEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Hcm91cEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEwOGM2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLQotLyoqCi0gKi8KLWNsYXNzIENNR3JvdXBJbXBsIGV4dGVuZHMgQ01Db250ZW50SW1wbCBpbXBsZW1lbnRzIENNR3JvdXAgewotCi0JcHJpdmF0ZSBpbnQgb3BlcmF0b3IgPSBDTUdyb3VwLlNFUVVFTkNFOwotCXByaXZhdGUgQ01Ob2RlTGlzdEltcGwgY2hpbGRyZW4gPSBudWxsOwotCi0JLyoqCi0JICogQ01Hcm91cEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Hcm91cEltcGwoaW50IG9wLCBpbnQgbWluT2NjdXIsIGludCBtYXhPY2N1cikgewotCQlzdXBlcihudWxsLCBtaW5PY2N1ciwgbWF4T2NjdXIpOwotCQlzd2l0Y2ggKG9wKSB7Ci0JCQljYXNlIENNR3JvdXAuQUxMIDoKLQkJCWNhc2UgQ01Hcm91cC5DSE9JQ0UgOgotCQkJY2FzZSBDTUdyb3VwLlNFUVVFTkNFIDoKLQkJCQlvcGVyYXRvciA9IG9wOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJLy8gc2hvdWxkIHdhcm4uCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICogQHBhcmFtIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHJvdGVjdGVkIENNTm9kZSBhcHBlbmRDaGlsZChDTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpCi0JCQljaGlsZHJlbiA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotCQlyZXR1cm4gY2hpbGRyZW4uYXBwZW5kTm9kZShjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3QKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIEdST1VQLCBFTlRJVFlfREVDTEFSQVRJT04uCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5HUk9VUDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRPcGVyYXRpb24gbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiBBTE9ORSAoYSksIFNFUVVFTkNFIChhLGIpLCBDSE9JQ0UgKGF8YiksIEFMTCAoYSZiKS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE9wZXJhdG9yKCkgewotCQlyZXR1cm4gb3BlcmF0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5hbWVkTm9kZU1hcEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YTVlNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5hbWVkTm9kZU1hcEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIENNTmFtZWROb2RlTWFwIGludGVyZmFjZS4gVGhpcyBjbGFzcyBpcyBpbnRlbnRlZAotICogdG8gYmUgdXNlZCBhcyBhIGNvbnRhaW5lciBvZiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLiBJZiBzb21lb25lIHdhbnRzIHRvCi0gKiB1c2UgdGhpcyBjbGFzcyBmb3Igb3RoZXIgcHVycG9zZSwgaGUgbXVzdCBwYXkgYXR0ZW50aW9uIHRvIHRoZSBmYWN0IHRoYXQKLSAqIHRoaXMgY2xhc3MgaXMgdG9sZXJhbnQgb2YgdGhlIGtleSBuYW1lIGNhc2UuIFRoYXQgaXMsIHRoaXMgY2xhc3MgZG9lcyBub3QKLSAqIGRpc3Rpbmd1aXNoICJuYW1lIiwgIk5BTUUiLCBhbmQgIk5hbWUiIGFzIGEga2V5IG5hbWUuCi0gKi8KLWNsYXNzIENNTmFtZWROb2RlTWFwSW1wbCBpbXBsZW1lbnRzIENNTmFtZWROb2RlTWFwIHsKLQotCXByaXZhdGUgSGFzaHRhYmxlIGl0ZW1zID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWl0ZW1zID0gbmV3IEhhc2h0YWJsZSgpOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gaXRlbXMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIGdldE5hbWVkSXRlbSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIENNTm9kZSA8Y29kZT5udWxsPC9jb2RlPiBmb3IgdW5rbm93biBrZXlzLgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIGNvb2tlZE5hbWUgPSBtYWtlQ2Fub25pY2FsRm9ybShuYW1lKTsKLQkJaWYgKCFpdGVtcy5jb250YWluc0tleShjb29rZWROYW1lKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKENNTm9kZSkgaXRlbXMuZ2V0KGNvb2tlZE5hbWUpOwotCX0KLQotCS8qKgotCSAqIGl0ZW0gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJQ01Ob2RlIG5vZGUgPSAoQ01Ob2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmICgtLWluZGV4IDwgMCkKLQkJCQlyZXR1cm4gbm9kZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIGl0ZW1zLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHJhd0Zvcm0KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBtYWtlQ2Fub25pY2FsRm9ybShTdHJpbmcgcmF3KSB7Ci0JCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAwMTUyCi0JCS8vIHdlIGFyZSBhYmxlIHRvICJjaGVhdCIgaGVyZSBhIGxpdHRsZSBhbmQgdXNlIFVTIExvY2FsZQotCQkvLyB0byBnZXQgYSBnb29kIGNvbm9uaWNhbCBmb3JtLCBzaW5jZSB3ZSBhcmUgdXNpbmcgdGhpcyBvbmx5Ci0JCS8vIGZvciBIVE1MIGFuZCBKU1Agc3RhbmRhcmQgdGFncy4KLQkJLy8gTG9uZyB0ZXJtLCBmb3Igc2ltaWxhciBuZWVkcyB3aXRoIFhNTCAxLjEgKGZvciBleGFtcGxlKQotCQkvLyB3ZSBzaG91bGQgdXNlIGEgY2xhc3Mgc3VjaCBhcyBjb20uaWJtLmljdS50ZXh0Lk5vcm1hbGl6ZXIKLQkJcmV0dXJuIHJhdy50b1VwcGVyQ2FzZShMb2NhbGUuVVMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaXRlbQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXZvaWQgcHV0TmFtZWRJdGVtKFN0cmluZyBuYW1lLCBDTU5vZGUgaXRlbSkgewotCQlTdHJpbmcgY29va2VkTmFtZSA9IG1ha2VDYW5vbmljYWxGb3JtKG5hbWUpOwotCQlpZiAoaXRlbXMuY29udGFpbnNLZXkoY29va2VkTmFtZSkpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgcmVnaXN0ZXJlZC4KLQkJaXRlbXMucHV0KGNvb2tlZE5hbWUsIGl0ZW0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lc3BhY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTmFtZXNwYWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWY3MzdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lc3BhY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBDTU5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotY2xhc3MgQ01OYW1lc3BhY2VJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIENNTmFtZXNwYWNlIHsKLQotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0JLyoqCi0JICogQ01OYW1lc3BhY2VJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNTmFtZXNwYWNlSW1wbChTdHJpbmcgdXJpLCBTdHJpbmcgcGZ4KSB7Ci0JCXN1cGVyKHVyaSk7Ci0JCXByZWZpeCA9IHBmeDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5OQU1FX1NQQUNFOwotCX0KLQotCS8qKgotCSAqIGdldFByZWZpeCBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIHByZWZpeDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRVUkkgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNmViNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLQotCi0vKioKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIENNTm9kZSB7Ci0KLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTU5vZGVJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNTm9kZUltcGwoU3RyaW5nIG5tKSB7Ci0JCXN1cGVyKCk7Ci0JCW5hbWUgPSBubTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKgotCSAqIFJldHVybnMgdGhlIG9iamVjdCBwcm9wZXJ0eSBkZXNjaXBlZCBieSB0aGUgcHJvcGVydHlOYW1lCi0JICoKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19YSFRNTCkpCi0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBzdXBwb3J0cyBtZXRob2QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YmYyMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLQotLyoqCi0gKiBBbmFsb2cgb2YgZG9tLk5vZGVMaXN0IGZvciBDTS4KLSAqIFNvLCB0aGUgaW1wbGVtZW50YXRpb24gaXMgdmVyeSBzaW1pbGFyIHRvCi0gKiBOb2RlTGlzdEltcGw8YnI+Ci0gKi8KLWNsYXNzIENNTm9kZUxpc3RJbXBsIGltcGxlbWVudHMgQ01Ob2RlTGlzdCB7Ci0KLQlwcml2YXRlIGphdmEudXRpbC5WZWN0b3Igbm9kZXMgPSBudWxsOwotCi0JLyoqCi0JICogQ01Ob2RlTGlzdEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Ob2RlTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCW5vZGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICogQHBhcmFtIG5vZGUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Ob2RlIGFwcGVuZE5vZGUoQ01Ob2RlIG5vZGUpIHsKLQkJbm9kZXMuYWRkRWxlbWVudChub2RlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGVuZ3RoIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBub2Rlcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogaXRlbSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZQotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbm9kZXMuc2l6ZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01Ob2RlKSBub2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ29tcGxleFR5cGVEZWZpbml0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NvbXBsZXhUeXBlRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWRiYTdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ29tcGxleFR5cGVEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gcmVwcmVzZW50IGEgY29tcGxleCB0eXBlIGRlZmluaXRpb24KLSAqIGluIFhNTCBTY2hlbWEuPGJyPgotICovCi1hYnN0cmFjdCBjbGFzcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JcHJvdGVjdGVkIENNR3JvdXBJbXBsIGNvbnRlbnQgPSBudWxsOwotCXByb3RlY3RlZCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHByaW1hcnlDYW5kaWRhdGVOYW1lID0gbnVsbDsKLQotCS8qKgotCSAqIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDb21wbGV4VHlwZURlZmluaXRpb24oRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQkJY29sbGVjdGlvbiA9IGVsZW1lbnRDb2xsZWN0aW9uOwotCQljcmVhdGVDb250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFjdHVhbCBjb250ZW50IG1vZGVsLgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb25jZSBhbmQgb25seSBvbmNlIGluIHRoZSBjb25zdHJ1Y3Rvci48YnI+Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY3JlYXRlQ29udGVudCgpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXAKLQkgKi8KLQlwdWJsaWMgQ01Hcm91cCBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQkvKiBOT1RFOiBEbyB3ZSBuZWVkIExPR0lDQUwgdHlwZT8KLQkgKiAtLSAzLzcvMjAwMQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Q29udGVudFR5cGUoKTsKLQotCS8qKgotCSAqIEdldCBjb250ZW50IGhpbnQuCi0JICovCi0JcHVibGljIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZ2V0UHJpbWFyeUNhbmRpZGF0ZSgpIHsKLQkJaWYgKHByaW1hcnlDYW5kaWRhdGVOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChIVE1MRWxlbWVudERlY2xhcmF0aW9uKSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShwcmltYXJ5Q2FuZGlkYXRlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogTmFtZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiBFYWNoIHNpbmdsZXRvbiBtdXN0IGtub3cgaXRzIG93biBuYW1lLgotCSAqIEFsbCBuYW1lcyBzaG91bGQgYmUgZGVmaW5lZCBpbgotCSAqIHtAbGluayA8Y29kZT5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5PC9jb2RlPn0gYXMgY29uc3RhbnRzLjxicj4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFR5cGVOYW1lKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTM4ZDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLS8qKgotICogRmFjdG9yeSBvZiBDb21wbGV4VHlwZURlZmluaXRpb24uCi0gKi8KLWZpbmFsIGNsYXNzIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0JcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaHRhYmxlIGRlZmluaXRpb25zID0gbnVsbDsKLQkvLyBjb25zdGFudHMgZm9yIGNvbXBsZXggdHlwZSBuYW1lCi0JLyoqIGZvciBBRERSRVNTLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0FERFJFU1MgPSAiQ1RZUEVfQUREUkVTUyI7Ly8kTk9OLU5MUy0xJAotCS8qKiBDREFUQSBjb250ZW50LiBObyBDb21wbGV4VHlwZURlZmluaXRpb24gaW5zdGFuY2Ugc2h1bGQgYmUgY3JlYXRlZC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9DREFUQSA9ICJDVFlQRV9DREFUQSI7Ly8kTk9OLU5MUy0xJAotCS8qKiBjb2wgZ3JvdXAgY29udGVudC4gQ09MKiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0NPTFVNTl9HUk9VUCA9ICJDVFlQRV9DT0xVTU5fR1JPVVAiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIERMLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0RFRklOSVRJT05fTElTVCA9ICJDVFlQRV9ERUZJTklUSU9OX0xJU1QiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIEVNQkVELiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0VNQkVEID0gIkNUWVBFX0VNQkVEIjsvLyROT04tTkxTLTEkCi0JLyoqIGVtcHR5IGNvbnRlbnQuIE5vIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBpbnN0YW5jZSBzaG91bGQgYmUgY3JlYXRlZC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9FTVBUWSA9ICJDVFlQRV9FTVBUWSI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgRklFTERTRVQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfRklFTERTRVQgPSAiQ1RZUEVfRklFTERTRVQiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIEZSQU1FU0VULiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0ZSQU1FU0VUID0gIkNUWVBFX0ZSQU1FU0VUIjsvLyROT04tTkxTLTEkCi0JLyoqIGZsb3cgY29udGVudC4gKCVmbG93OykqICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfRkxPV19DT05UQUlORVIgPSAiQ1RZUEVfRkxPV19DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogaHRtbCBjb250ZW50LiBIRUFELCAoRlJBTUVTRVR8Qk9EWSkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9IVE1MID0gIkNUWVBFX0hUTUwiOy8vJE5PTi1OTFMtMSQKLQkvKiogaGVhZCBjb250ZW50LiBUSVRMRSAmIElTSU5ERVg/ICYgQkFTRT8gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9IRUFEID0gIkNUWVBFX0hFQUQiOy8vJE5PTi1OTFMtMSQKLQkvKiogaW5saW5lIGNvbnRlbnQuICglaW5saW5lOykqICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUiA9ICJDVFlQRV9JTkxJTkVfQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIGxpc3QgaXRlbSBjb250YWluZXIuIChMSSkrICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfTElfQ09OVEFJTkVSID0gIkNUWVBFX0xJX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgTUFQLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX01BUCA9ICJDVFlQRV9NQVAiOy8vJE5PTi1OTFMtMSQKLQkvKiogbm9mcmFtZXMgY29udGVudC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9OT0ZSQU1FU19DT05URU5UID0gIkNUWVBFX05PRlJBTUVTX0NPTlRFTlQiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIE9QVEdST1VQLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX09QVElPTl9DT05UQUlORVIgPSAiQ1RZUEVfT1BUSU9OX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiBwYXJhbSBjb250YWluZXIuIEZvciBPQkpFQ1QvQVBQTEVULiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1BBUkFNX0NPTlRBSU5FUiA9ICJDVFlQRV9QQVJBTV9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogUENEQVRBIGNvbnRlbnQuIE5vIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBpbnN0YW5jZSBzaHVsZCBiZSBjcmVhdGVkLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1BDREFUQSA9ICJDVFlQRV9QQ0RBVEEiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIFNFTEVDVC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9TRUxFQ1QgPSAiQ1RZUEVfU0VMRUNUIjsvLyROT04tTkxTLTEkCi0JLyoqIHRhYmxlIGNvbnRlbnQuIENBUFRJT04/LCAoQ09MKnxDT0xHUk9VUCopLCBUSEVBRD8sIFRGT09UPywgVEJPRFkrICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfVEFCTEUgPSAiQ1RZUEVfVEFCTEUiOy8vJE5PTi1OTFMtMSQKLQkvKiogdGFibGUgY2VsbCBjb250YWllci4gKFRIfFREKSsgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9UQ0VMTF9DT05UQUlORVIgPSAiQ1RZUEVfVENFTExfQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIHRhYmxlIHJlY29yZCBjb250YWluZXIuIChUUikrICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfVFJfQ09OVEFJTkVSID0gIkNUWVBFX1RSX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJZGVmaW5pdGlvbnMgPSBuZXcgamF2YS51dGlsLkhhc2h0YWJsZSgpOwotCX0KLQotCS8qKgotCSAqIEZhY3RvcnkgbWV0aG9kIGZvciBDb21wbGV4VHlwZURlZmluaXRpb24uCi0JICogRWFjaCBpbnN0YW5jZSBjcmVhdGVkIGluIHRoaXMgbWV0aG9kIG11c3QgYmUgcmVnaXN0ZXJlZCBpbnRvCi0JICogdGhlIG1hcCB3aXRoIGl0cyBuYW1lLgotCSAqIEBwYXJhbSBkZWZpbml0aW9uTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjcmVhdGVUeXBlRGVmaW5pdGlvbihTdHJpbmcgZGVmaW5pdGlvbk5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCWlmIChkZWZpbml0aW9ucy5jb250YWluc0tleShkZWZpbml0aW9uTmFtZSkpIHsKLQkJCXJldHVybiAoQ29tcGxleFR5cGVEZWZpbml0aW9uKSBkZWZpbml0aW9ucy5nZXQoZGVmaW5pdGlvbk5hbWUpOwotCQl9Ci0KLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IG51bGw7Ci0JCWlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9BRERSRVNTKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkQWRkcmVzcyhlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9DT0xVTU5fR1JPVVApIHsKLQkJCWRlZiA9IG5ldyBDdGRDb2x1bW5Hcm91cChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9ERUZJTklUSU9OX0xJU1QpIHsKLQkJCWRlZiA9IG5ldyBDdGREbChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9FTUJFRCkgewotCQkJZGVmID0gbmV3IEN0ZEVtYmVkKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0ZJRUxEU0VUKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkRmllbGRzZXQoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfRkxPV19DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRGbG93Q29udGFpbmVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0ZSQU1FU0VUKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkRnJhbWVzZXQoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfSEVBRCkgewotCQkJZGVmID0gbmV3IEN0ZEhlYWQoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfSFRNTCkgewotCQkJZGVmID0gbmV3IEN0ZEh0bWwoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZElubGluZUNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9MSV9DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRMaUNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9NQVApIHsKLQkJCWRlZiA9IG5ldyBDdGRNYXAoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfTk9GUkFNRVNfQ09OVEVOVCkgewotCQkJZGVmID0gbmV3IEN0ZE5vZnJhbWVzQ29udGVudChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9PUFRJT05fQ09OVEFJTkVSKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkT3B0aW9uQ29udGFpbmVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX1BBUkFNX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZFBhcmFtQ29udGFpbmVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX1NFTEVDVCkgewotCQkJZGVmID0gbmV3IEN0ZFNlbGVjdChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9UQUJMRSkgewotCQkJZGVmID0gbmV3IEN0ZFRhYmxlKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX1RDRUxMX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZFRhYmxlQ2VsbENvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9UUl9DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRUckNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIHsKLQkJCWRlZiA9IG51bGw7Ci0JCX0KLQkJaWYgKGRlZiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGZhaWwgdG8gY3JlYXRlLgotCQlkZWZpbml0aW9ucy5wdXQoZGVmaW5pdGlvbk5hbWUsIGRlZik7Ci0JCXJldHVybiBkZWY7Ci0JfQotCi0JLyoqCi0JICogRm9yIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgIT0gbnVsbCkKLQkJCXJldHVybiBpbnN0YW5jZTsKLQkJaW5zdGFuY2UgPSBuZXcgQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRBZGRyZXNzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEFkZHJlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4NDdkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEFkZHJlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBmb3IgQUREUkVTUy4KLSAqLwotZmluYWwgY2xhc3MgQ3RkQWRkcmVzcyBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkQWRkcmVzcyhFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogKCglaW5saW5lKSB8IFApKi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCB8ICkqCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gKCVpbmxpbmUpCi0JCUNNR3JvdXBJbXBsIGlubGluZXMgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlpZiAoaW5saW5lcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb2xsZWN0aW9uLmdldElubGluZShpbmxpbmVzKTsKLQkJY29udGVudC5hcHBlbmRDaGlsZChpbmxpbmVzKTsKLQkJLy8gUAotCQlDTU5vZGUgcCA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QKTsKLQkJaWYgKHAgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQocCk7Ci0JfQotCi0JLyoqCi0JICogKCglaW5saW5lKSB8IFApKi4KLQkgKiBCZWNhdXNlICVpbmxpbmU7IGNvbnRhaW5zICNQQ0RBVEEsIHRoZSB0eXBlIGlzIE1JWEVELgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9BRERSRVNTOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkQ29sdW1uR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkQ29sdW1uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIzMzk5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZENvbHVtbkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQ09MIGdyb3VwLgotICogKENPTCkqCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZENvbHVtbkdyb3VwIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRDb2x1bW5Hcm91cChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogKENPTCkqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggKSoKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vIENPTAotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNPTCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiAoQ09MKSoKLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0NPTFVNTl9HUk9VUDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZERsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZERsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNmViOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGREbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBETC4KLSAqLwotZmluYWwgY2xhc3MgQ3RkRGwgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZERsKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQ7Ci0JfQotCi0JLyoqCi0JICogKERUIHwgREQpKwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoIHwgKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyBEVAotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRUKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCQkvLyBERAotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREQpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGRlYyk7Ci0JfQotCi0JLyoqCi0JICogKERUIHwgREQpKy4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9ERUZJTklUSU9OX0xJU1Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRFbWJlZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRFbWJlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTVlNzI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRW1iZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBmb3IgRU1CRUQuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZEVtYmVkIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRFbWJlZChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PRU1CRUQ7Ci0JfQotCi0JLyoqCi0JICogKE5PRU1CRUQpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoICkKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJLy8gTk9FTUJFRAotCQlDTU5vZGUgbm9lbWJlZCA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0VNQkVEKTsKLQkJaWYgKG5vZW1iZWQgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQobm9lbWJlZCk7Ci0JfQotCi0JLyoqCi0JICogKE5PRU1CRUQpLgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0VNQkVEOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRmllbGRzZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRmllbGRzZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRmMmRmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEZpZWxkc2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogZm9yIEZJRUxEU0VULgotICovCi1maW5hbCBjbGFzcyBDdGRGaWVsZHNldCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkRmllbGRzZXQoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MRUdFTkQ7Ci0JfQotCi0JLyoqCi0JICogKCNQQ0RBVEEsIExFR0VORCwgKCVmbG93OykqKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoICwgLCApCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCS8vICNQQ0RBVEEKLQkJLy8gLi4uPz8KLQotCQkvLyBMRUdFTkQKLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MRUdFTkQpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGRlYyk7Ci0JCS8vICglZmxvdzspKgotCQlDTUdyb3VwSW1wbCBmbG93cyA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQlpZiAoZmxvd3MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29sbGVjdGlvbi5nZXRGbG93KGZsb3dzKTsKLQkJY29udGVudC5hcHBlbmRDaGlsZChmbG93cyk7Ci0JfQotCi0JLyoqCi0JICogKCNQQ0RBVEEsIExFR0VORCwgKCVmbG93OykqKQotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9GSUVMRFNFVDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEZsb3dDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRmxvd0NvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzdhMDhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRmxvd0NvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotCi0vKioKLSAqIENvbXBsZXggdHlwZSBkZWZpbml0aW9uIGZvciBjb250YWluZXJzIG9mIDxjb2RlPiVmbG93OzwvY29kZT4uCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZEZsb3dDb250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICovCi0JcHVibGljIEN0ZEZsb3dDb250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqICglZmxvdzspKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWNvbGxlY3Rpb24uZ2V0Rmxvdyhjb250ZW50KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRkxPV19DT05UQUlORVI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRGcmFtZXNldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRGcmFtZXNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2RhNGI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRnJhbWVzZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBmb3IgRlJBTUVTRVQuCi0gKiAoKEZSQU1FU0VUIHwgRlJBTUUpKyAmIE5PRlJBTUVTPykKLSAqLwotZmluYWwgY2xhc3MgQ3RkRnJhbWVzZXQgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZEZyYW1lc2V0KEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRlJBTUU7Ci0JfQotCi0JLyoqCi0JICogKChGUkFNRVNFVCB8IEZSQU1FKSsgJiBOT0ZSQU1FUz8pLgotCSAqIC0tPiAoKEZSQU1FU0VUIHwgRlJBTUUpKyAmIChOT0ZSQU1FUyk/KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoICYgKQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQUxMLCAxLCAxKTsKLQotCQkvLyAoIHwgKSsKLQkJQ01Hcm91cEltcGwgZ3JvdXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZ3JvdXApOwotCi0JCS8vIEZSQU1FU0VUCi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRlJBTUVTRVQpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQlncm91cC5hcHBlbmRDaGlsZChkZWMpOwotCQkvLyBGUkFNRQotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRlJBTUUpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQlncm91cC5hcHBlbmRDaGlsZChkZWMpOwotCi0JCS8vICggKT8KLQkJZ3JvdXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgMSk7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb250ZW50LmFwcGVuZENoaWxkKGdyb3VwKTsKLQotCQkvLyBOT0ZSQU1FUwotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9GUkFNRVMpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQlncm91cC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqICgoRlJBTUVTRVQgfCBGUkFNRSkrICYgTk9GUkFNRVM/KQotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRlJBTUVTRVQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRIZWFkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEhlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhiYzI0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEhlYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIENvbXBsZXggdHlwZSBkZWZpbml0aW9uIGZvciB0aGUgaGVhZCBjb250ZW50LgotICogQ29udGVudCBNb2RlbDogKFRJVExFICYgSVNJTkRFWD8gJiBCQVNFPykKLSAqLwotZmluYWwgY2xhc3MgQ3RkSGVhZCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ3RkSGVhZChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRJVExFOwotCX0KLQotCS8qKgotCSAqIGZvciBIRUFELgotCSAqIFRvIGF2b2lkIHVzaW5nIGluY2x1c2lvbiwgdGhlIGNvbnRlbnQgbW9kZWwgY29tZXMgZnJvbSB0aGUgWEhUTUwgMS4wLgotCSAqCi0JICogKCVoZWFkLm1pc2M7LCAoKHRpdGxlLCAlaGVhZC5taXNjOywgKGJhc2UsICVoZWFkLm1pc2M7KT8pIHwgKGJhc2UsICVoZWFkLm1pc2M7LCAodGl0bGUsICVoZWFkLm1pc2M7KSkpKQotCSAqIEFuZCAlaGVhZC5taXNjOyBpczoKLQkgKiAoc2NyaXB0fHN0eWxlfG1ldGF8bGlua3xvYmplY3R8aXNpbmRleCkqCi0JICoKLQkgKiAwOiAoJWhlYWQubWlzYywgQSkKLQkgKiBBOiAoQiB8IEMpCi0JICogQjogKHRpdGxlLCAlaGVhZC5taXNjOywgRCkKLQkgKiBDOiAoYmFzZSwgJWhlYWQubWlzYzssIEUpCi0JICogRDogKGJhc2UsICVoZWFkLm1pc2M7KT8KLQkgKiBFOiAodGl0bGUsICVoZWFkLm1pc2M7KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBBdCAxc3QsIGNyZWF0ZSAlaGVhZC5taXNjOyBjb250ZW50LgotCQkvLyAlaGVhZC5taXNjOwotCQkvLyAgICggfCApKgotCQlDTUdyb3VwSW1wbCBtaXNjID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWlmIChtaXNjID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FVEEsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSU5LLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT0JKRUNULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSVNJTkRFWH07Ci0JCWNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG1pc2MsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCQkvLyAybmQsIGdldCBhIHRpdGxlCi0JCUNNTm9kZSB0aXRsZSA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USVRMRSk7Ci0JCS8vIDNyZCwgZ2V0IGEgYmFzZQotCQlDTU5vZGUgYmFzZSA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFKTsKLQkJaWYgKHRpdGxlID09IG51bGwgfHwgYmFzZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIFRvcCBsZXZlbCBjb250ZW50IGlzIGEgc2VxdWVuY2Ugb2YgJWhlYWQubWlzYzsgYW5kIEEuCi0JCS8vIDA6ICglaGVhZC5taXNjOywgQSkKLQkJLy8gICBjcmVhdGUgYSBzZXF1ZW5jZQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyAgIGFwcGVuZCAlaGVhZC5taXNjOwotCQljb250ZW50LmFwcGVuZENoaWxkKG1pc2MpOwotCQkvLyAgIGNyZWF0ZSBBIGFuZCBhcHBlbmQgaXQgdG8gdGhlIHRvcCBsZXZlbC4KLQkJewotCQkJLy8gQSBpcyBhIGNob2ljZSBvZiBCIGFuZCBDLgotCQkJLy8gQTogKEIgfCBDKQotCQkJLy8gICBjcmVhdGUgYSBjaG9pY2UKLQkJCUNNR3JvdXBJbXBsIGdBID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJCWlmIChnQSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCS8vICAgYXBwZW5kIEEgdG8gdGhlIHRvcCBsZXZlbC4KLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZ0EpOwotCi0JCQkvLyBjcmVhdGUgQiBhbmQgYXBwZW5kIGl0IHRvIEEKLQkJCXsKLQkJCQkvLyBCIGlzIGEgc2VxdWVuY2Ugb2YgdGl0bGUsICVoZWFkLm1pc2M7LCBhbmQgRC4KLQkJCQkvLyBCOiAodGl0bGUsICVoZWFkLm1pc2M7LCBEKQotCQkJCS8vICAgY3JlYXRlIGEgc2VxdWVuY2UKLQkJCQlDTUdyb3VwSW1wbCBnQiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJCQlpZiAoZ0IgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCS8vICAgYXBwZW5kIEIgdG8gQS4KLQkJCQlnQS5hcHBlbmRDaGlsZChnQik7Ci0KLQkJCQkvLyAgIGFwcGVuZCB0aXRsZSB0byBCCi0JCQkJZ0IuYXBwZW5kQ2hpbGQodGl0bGUpOwotCQkJCS8vICAgYXBwZW5kICVoZWFkLm1pc2M7IHRvIEIKLQkJCQlnQi5hcHBlbmRDaGlsZChtaXNjKTsKLQkJCQkvLyAgIGNyZWF0ZSBEIGFuZCBhcHBlbmQgaXQgdG8gQi4KLQkJCQl7Ci0JCQkJCS8vIEQgaXMgYSBzZXF1ZW5jZSBvZiBiYXNlLCAlaGVhZC5taXNjOy4KLQkJCQkJLy8gRDogKGJhc2UsICVoZWFkLm1pc2M7KT8KLQkJCQkJLy8gICBjcmVhdGUgYSBzZXF1ZW5jZQotCQkJCQlDTUdyb3VwSW1wbCBnRCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAwLCAxKTsKLQkJCQkJaWYgKGdEID09IG51bGwpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCS8vICAgYXBwZW5kIEQgdG8gQi4KLQkJCQkJZ0IuYXBwZW5kQ2hpbGQoZ0QpOwotCi0JCQkJCS8vICAgYXBwZW5kIGJhc2UgdG8gRAotCQkJCQlnRC5hcHBlbmRDaGlsZChiYXNlKTsKLQkJCQkJLy8gICBhcHBlbmQgJWhlYWQubWlzYzsgdG8gRC4KLQkJCQkJZ0QuYXBwZW5kQ2hpbGQobWlzYyk7Ci0JCQkJfQotCQkJfQotCQkJLy8gY3JlYXRlIEMgYW5kIGFwcGVuZCBpdCB0byBBCi0JCQl7Ci0JCQkJLy8gQyBpcyBhIHNlcXVlbmNlIG9mIGJhc2UsICVoZWFkLm1pc2M7LCBhbmQgRQotCQkJCS8vIEM6IChiYXNlLCAlaGVhZC5taXNjOywgRSkKLQkJCQkvLyAgIGNyZWF0ZSBhIHNlcXVlbmNlCi0JCQkJQ01Hcm91cEltcGwgZ0MgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCQkJaWYgKGdDID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQkvLyAgIGFwcGVuZCBDIHRvIEEuCi0JCQkJZ0EuYXBwZW5kQ2hpbGQoZ0MpOwotCi0JCQkJLy8gICBhcHBlbmQgYmFzZSB0byBDCi0JCQkJZ0MuYXBwZW5kQ2hpbGQoYmFzZSk7Ci0JCQkJLy8gICBhcHBlbmQgJWhlYWQubWlzYzsgdG8gQwotCQkJCWdDLmFwcGVuZENoaWxkKG1pc2MpOwotCi0JCQkJLy8gICBjcmVhdGUgRSBhbmQgYXBwZW5kIGl0IHRvIEMuCi0JCQkJewotCQkJCQkvLyBFIGlzIGEgc2VxdWVuY2Ugb2YgdGl0bGUgYW5kICVoZWFkLm1pc2M7LgotCQkJCQkvLyBFOiAodGl0bGUsICVoZWFkLm1pc2M7KQotCQkJCQkvLyAgIGNyZWF0ZSBhIHNlcXVlbmNlCi0JCQkJCUNNR3JvdXBJbXBsIGdFID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQkJCQlpZiAoZ0UgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQkJCQkJLy8gICBhcHBlbmQgRSB0byBDLgotCQkJCQlnQy5hcHBlbmRDaGlsZChnRSk7Ci0KLQkJCQkJLy8gICBhcHBlbmQgdGl0bGUgdG8gRQotCQkJCQlnRS5hcHBlbmRDaGlsZCh0aXRsZSk7Ci0JCQkJCS8vICAgYXBwZW5kICVoZWFkLm1pc2M7IHRvIEUuCi0JCQkJCWdFLmFwcGVuZENoaWxkKG1pc2MpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEVsZW1lbnQgY29udGVudC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0hFQUQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRIdG1sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEh0bWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIzOTZmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEh0bWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIENvbXBsZXggdHlwZSBkZWZpbml0aW9uIGZvciA8Y29kZT5IVE1MPC9jb2RlPi48YnI+Ci0gKiBDb250ZW50IE1vZGVsOgotICogSEVBRCwgKEZSQU1FU0VUfEJPRFkpPGJyPgotICovCi1maW5hbCBjbGFzcyBDdGRIdG1sIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDdGRIdG1sKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRDsKLQl9Ci0KLQkvKioKLQkgKiAoJWh0bWwuY29udGVudDspLgotCSAqICVodG1sLmNvbnRlbnQ7IGlzIEhFQUQsIChGUkFNRVNFVCB8IEJPRFkpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoICkKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBIRUFECi0JCUNNTm9kZSBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCQkvLyAoIHwgKQotCQlDTUdyb3VwSW1wbCBncm91cCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZ3JvdXApOwotCi0JCS8vIEZSQU1FU0VULCBCT0RZCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GUkFNRVNFVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFl9OwotCQljb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gc2luY2UgQk9EWSBzdGFydCBhbmQgZW5kIGFyZSBvbWlzc2FibGUKLQkJLy8gYWRkaW5nIHZhbGlkIGNoaWxkcmVuIG9mIEJPRFkgaGVyZSB1bmRlciBIVE1MCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NzM0MgotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1BUCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUFJFKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CRE8pOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklOUFVUKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT1NDUklQVCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlVUVE9OKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MQUJFTCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDYpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNFTlRFUik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRUZPTlQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlMpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJMT0NLUVVPVEUpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgzKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5VTCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0VMRUNUKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5RKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFJJS0UpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQUJCUik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQklHKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU1HKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BQ1JPTllNKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERUwpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PRlJBTUVTKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URVhUQVJFQSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDIpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPTlQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9CSkVDVCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuS0JEKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JRlJBTUUpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhSKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5INCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQU1QKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTlMpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg1KTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVVApOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkEpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRGTik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSVNJTkRFWCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREwpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlZBUik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRklFTERTRVQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CUik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVFQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCQllZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFQUExFVCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT0wpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNNQUxMKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DSVRFKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVYpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNPREUpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNQQU4pOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNVQik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRU0pOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlUpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFERFJFU1MpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUUk9ORyk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCX0KLQotCS8qKgotCSAqIEVsZW1lbnQgY29udGVudC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9IVE1MOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkSW5saW5lQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZElubGluZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmJmZWFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkSW5saW5lQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci0KLS8qKgotICogQ29tcGxleCB0eXBlIGRlZmluaXRpb24gZm9yICglaW5saW5lOykqLgotICovCi1maW5hbCBjbGFzcyBDdGRJbmxpbmVDb250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZElubGluZUNvbnRhaW5lcihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogKCVpbmxpbmUpKi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQljb2xsZWN0aW9uLmdldElubGluZShjb250ZW50KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZExpQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZExpQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjY2IwNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRMaUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIExpc3QgaXRlbSBjb250YWluZXIuCi0gKiAoTEkpKwotICovCi1maW5hbCBjbGFzcyBDdGRMaUNvbnRhaW5lciBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVuQ29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRMaUNvbnRhaW5lcihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJOwotCX0KLQotCS8qKgotCSAqIChMSSkrLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoTEkpKwotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJQ01Ob2RlIGxpID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJKTsKLQkJaWYgKGxpICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGxpKTsKLQl9Ci0KLQkvKioKLQkgKiBFTEVNRU5UIGNvbnRlbnQuPGJyPgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfTElfQ09OVEFJTkVSOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkTWFwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZE1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmYyYTE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogZm9yIE1BUC4KLSAqLwotZmluYWwgY2xhc3MgQ3RkTWFwIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRNYXAoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BUkVBOwotCX0KLQotCS8qKgotCSAqICgoJWJsb2NrOykgfCBBUkVBKSsuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggfCApKwotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vICglYmxvY2s7KQotCQlDTUdyb3VwSW1wbCBibG9ja3MgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlpZiAoYmxvY2tzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbGxlY3Rpb24uZ2V0QmxvY2soYmxvY2tzKTsKLQkJY29udGVudC5hcHBlbmRDaGlsZChibG9ja3MpOwotCQkvLyBBUkVBCi0JCUNNTm9kZSBhcmVhID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFSRUEpOwotCQlpZiAoYXJlYSAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChhcmVhKTsKLQl9Ci0KLQkvKioKLQkgKiAoKCVibG9jazspIHwgQVJFQSkrLgotCSAqIEJlY2F1c2UgJWJsb2NrOyBjb25zaXN0cyBvZiBlbGVtZW50cyBvbmx5LCB0aGUgdHlwZSBpcyBFTEVNRU5ULgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX01BUDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZE5vZnJhbWVzQ29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGROb2ZyYW1lc0NvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE5M2E2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZE5vZnJhbWVzQ29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBOT0ZSQU1FUy4KLSAqLwotZmluYWwgY2xhc3MgQ3RkTm9mcmFtZXNDb250ZW50IGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGROb2ZyYW1lc0NvbnRlbnQoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZOwotCX0KLQotCS8qKgotCSAqIChCT0RZKS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCApCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCS8vIEJPRFkKLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqIChCT0RZKQotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX05PRlJBTUVTX0NPTlRFTlQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRPcHRpb25Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkT3B0aW9uQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MzQ4MGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRPcHRpb25Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBPUFRJT04gY29udGFpbmVyLgotICogKE9QVElPTikrCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZE9wdGlvbkNvbnRhaW5lciBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkT3B0aW9uQ29udGFpbmVyKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OOwotCX0KLQotCS8qKgotCSAqIChPUFRJT04pKy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCApKwotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gT1BUSU9OCi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqIChPUFRJT04pKwotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfT1BUSU9OX0NPTlRBSU5FUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZFBhcmFtQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZFBhcmFtQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MzIxOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRQYXJhbUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIFBBUkFNIGNvbnRhaW5lci4gIEZvciBPQkpFQ1QgYW5kIEFQUExFVC4KLSAqLwotZmluYWwgY2xhc3MgQ3RkUGFyYW1Db250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZFBhcmFtQ29udGFpbmVyKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAoUEFSQU0gfCAlZmxvdzspKi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCB8ICkqCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gUEFSQU0KLQkJQ01Ob2RlIHBhcmFtID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNKTsKLQkJaWYgKHBhcmFtICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKHBhcmFtKTsKLQkJLy8gJWZsb3c7Ci0JCUNNR3JvdXBJbXBsIGZsb3dzID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJaWYgKGZsb3dzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbGxlY3Rpb24uZ2V0SW5saW5lKGZsb3dzKTsKLQkJY29udGVudC5hcHBlbmRDaGlsZChmbG93cyk7Ci0JfQotCi0JLyoqCi0JICogKFBBUkFNIHwgJWZsb3c7KSouCi0JICogQmVjYXVzZSAlZmxvdzsgY29udGFpbnMgI1BDREFUQSwgdGhlIHR5cGUgaXMgTUlYRUQuCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1BBUkFNX0NPTlRBSU5FUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZFNlbGVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRTZWxlY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFkMTI4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZFNlbGVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBTRUxFQ1QuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZFNlbGVjdCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkU2VsZWN0KEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OOwotCX0KLQotCS8qKgotCSAqIChPUFRHUk9VUCB8IE9QVElPTikrLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoIHwgKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyBPUFRHUk9VUAotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVEdST1VQKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCQkvLyBPUFRJT04KLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTik7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiAoT1BUR1JPVVAgfCBPUFRJT04pKy4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9TRUxFQ1Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRUYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmQ3M2Q1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogZm9yIFRBQkxFLgotICogKENBUFRJT04/LCAoQ09MKnxDT0xHUk9VUCopLCBUSEVBRD8sIFRGT09UPywgVEJPRFkrLCBUUispCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZFRhYmxlIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRUYWJsZShFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRCT0RZOwotCX0KLQotCS8qKgotCSAqIChDQVBUSU9OPywgKENPTCp8Q09MR1JPVVAqKSwgVEhFQUQ/LCBURk9PVD8sIFRCT0RZKykKLQkgKiAtLT4gKChDQVBUSU9OKT8sICgoQ09MKSogfCAoQ09MR1JPVVApKiksIChUSEVBRCk/LCAoVEZPT1QpPywgKFRCT0RZKSssIChUUikrKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoICwgLCAsICwpCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0KLQkJLy8gKENBUFRJT04pPwotCQkvLyAgICAgKCApPwotCQlDTUdyb3VwSW1wbCB3cmFwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDAsIDEpOwotCQlpZiAod3JhcCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb250ZW50LmFwcGVuZENoaWxkKHdyYXApOwotCQkvLyAgICAgQ0FQVElPTgotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNBUFRJT04pOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQl3cmFwLmFwcGVuZENoaWxkKGRlYyk7Ci0KLQkJLy8gKChDT0wpKiB8IChDT0xHUk9VUCkqKQotCQkvLyAgICAgKCB8ICkKLQkJQ01Hcm91cEltcGwgZ3JvdXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29udGVudC5hcHBlbmRDaGlsZChncm91cCk7Ci0JCS8vICAgICAgICAgKENPTCkqCi0JCXdyYXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQlpZiAod3JhcCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlncm91cC5hcHBlbmRDaGlsZCh3cmFwKTsKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNPTCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCXdyYXAuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJLy8gICAgICAgICAoQ09MR1JPVVApKgotCQl3cmFwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJaWYgKHdyYXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ3JvdXAuYXBwZW5kQ2hpbGQod3JhcCk7Ci0JCWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DT0xHUk9VUCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCXdyYXAuYXBwZW5kQ2hpbGQoZGVjKTsKLQotCQkvLyAoVEhFQUQpPwotCQl3cmFwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDAsIDEpOwotCQlpZiAod3JhcCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb250ZW50LmFwcGVuZENoaWxkKHdyYXApOwotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEhFQUQpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQl3cmFwLmFwcGVuZENoaWxkKGRlYyk7Ci0KLQkJLy8gKFRGT09UKT8KLQkJd3JhcCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAwLCAxKTsKLQkJaWYgKHdyYXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29udGVudC5hcHBlbmRDaGlsZCh3cmFwKTsKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRGT09UKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJd3JhcC5hcHBlbmRDaGlsZChkZWMpOwotCi0JCS8vIChUQk9EWSkrCi0JCS8vIFRCT0RZIGhhcyBvcHRpb25hbCBzdGFydCBhbmQgZW5kIHRhZ3MKLQkJd3JhcCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWlmICh3cmFwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQod3JhcCk7Ci0JCWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQk9EWSk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCXdyYXAuYXBwZW5kQ2hpbGQoZGVjKTsKLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTYxMDEKLQkJLy8gVEJPRFkgc3RhcnQgYW5kIGVuZCB0YWcgYXJlIG9wdGlvbmFsLCBzbyBUUiBzaG91bGQgYmUgYWxsb3dlZCBoZXJlCi0JCS8vIChUUikrCi0JCXdyYXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQlpZiAod3JhcCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb250ZW50LmFwcGVuZENoaWxkKHdyYXApOwotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVFIpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQl3cmFwLmFwcGVuZENoaWxkKGRlYyk7Ci0JfQotCi0JLyoqCi0JICogKChGUkFNRVNFVCB8IEZSQU1FKSsgJiBOT0ZSQU1FUz8pCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogTmFtZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiBFYWNoIHNpbmdsZXRvbiBtdXN0IGtub3cgaXRzIG93biBuYW1lLgotCSAqIEFsbCBuYW1lcyBzaG91bGQgYmUgZGVmaW5lZCBpbgotCSAqIHtAbGluayA8Y29kZT5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5PC9jb2RlPn0gYXMgY29uc3RhbnRzLjxicj4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9UQUJMRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZFRhYmxlQ2VsbENvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRUYWJsZUNlbGxDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIwNzg3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZFRhYmxlQ2VsbENvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIFRhYmxlIGNlbGwgY29udGFpbmVyLgotICogKFRIIHwgVEQpKwotICovCi1maW5hbCBjbGFzcyBDdGRUYWJsZUNlbGxDb250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZFRhYmxlQ2VsbENvbnRhaW5lcihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlREOwotCX0KLQotCS8qKgotCSAqIChUSCB8IFREKSsuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyBUSAotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRIKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCQkvLyBURAotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEQpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGRlYyk7Ci0JfQotCi0JLyoqCi0JICogKFRIIHwgVEQpKwotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfVENFTExfQ09OVEFJTkVSOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkVHJDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkVHJDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM0YzIwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZFRyQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogVGFibGUgcmVjb3JkIGNvbnRhaW5lci4KLSAqIChUUikrCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZFRyQ29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRUckNvbnRhaW5lcihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRSOwotCX0KLQotCS8qKgotCSAqIChUUikrLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoVFIpKwotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJQ01Ob2RlIHRyID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRSKTsKLQkJaWYgKHRyICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBFTEVNRU5UIGNvbnRlbnQuPGJyPgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfVFJfQ09OVEFJTkVSOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvRGVjbENvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvRGVjbENvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVhYWI1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0RlY2xDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKi8KLWFic3RyYWN0IGNsYXNzIERlY2xDb2xsZWN0aW9uIGltcGxlbWVudHMgQ01OYW1lZE5vZGVNYXAgewotCi0KLQlwcm90ZWN0ZWQgY2xhc3MgRHVhbE1hcCB7Ci0JCXB1YmxpYyBEdWFsTWFwKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBEdWFsTWFwKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJCXN1cGVyKCk7Ci0JCQlpbml0aWFsaXplKG9iamVjdHMpOwotCQl9Ci0KLQkJcHVibGljIGludCBzaXplKCkgewotCQkJcmV0dXJuIHRhYmxlLmxlbmd0aDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoaW50IGtleSkgewotCQkJaWYgKCFpc1ZhbGlkSW5kZXgoa2V5KSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiB0YWJsZVtrZXldOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRLZXkoT2JqZWN0IHZhbHVlKSB7Ci0JCQlJbnRlZ2VyIGtleU9iaiA9IChJbnRlZ2VyKSBtYXAuZ2V0KHZhbHVlKTsKLQkJCWlmIChrZXlPYmogPT0gbnVsbCkKLQkJCQlyZXR1cm4gSURfVU5LTk9XTjsKLQkJCXJldHVybiBrZXlPYmouaW50VmFsdWUoKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoT2JqZWN0W10gb2JqZWN0cykgewotCQkJaWYgKG9iamVjdHMgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQl0YWJsZSA9IG9iamVjdHM7Ci0JCQltYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChpbnQga2V5ID0gMDsga2V5IDwgb2JqZWN0cy5sZW5ndGg7IGtleSsrKSB7Ci0JCQkJT2JqZWN0IHZhbHVlID0gdGFibGVba2V5XTsKLQkJCQltYXAucHV0KHZhbHVlLCBuZXcgSW50ZWdlcihrZXkpKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgT2JqZWN0W10gdGFibGUgPSBudWxsOwotCQlwcml2YXRlIEhhc2hNYXAgbWFwID0gbnVsbDsKLQotCQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZEluZGV4KGludCBpbmRleCkgewotCQkJcmV0dXJuIGluZGV4ID49IDAgJiYgaW5kZXggPCB0YWJsZS5sZW5ndGg7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgVG9sZXJhbnRTdHJpbmdEdWFsTWFwIGV4dGVuZHMgRHVhbE1hcCB7Ci0JCXB1YmxpYyBUb2xlcmFudFN0cmluZ0R1YWxNYXAoU3RyaW5nW10gbmFtZXMpIHsKLQkJCXN1cGVyKCk7Ci0JCQlPYmplY3RbXSBvYmplY3RzID0gbmV3IE9iamVjdFtuYW1lcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCW9iamVjdHNbaV0gPSBtYWtlQ2Fub25pY2FsRm9ybShuYW1lc1tpXSk7Ci0JCQl9Ci0JCQlpbml0aWFsaXplKG9iamVjdHMpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRLZXkoT2JqZWN0IHZhbHVlKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEtleShtYWtlQ2Fub25pY2FsRm9ybShuYW1lKSk7Ci0JCQl9Ci0JCQljYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gSURfVU5LTk9XTjsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nIG1ha2VDYW5vbmljYWxGb3JtKFN0cmluZyByYXcpIHsKLQkJCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAwMTUyCi0JCQkvLyB3ZSBhcmUgYWJsZSB0byAiY2hlYXQiIGhlcmUgYSBsaXR0bGUgYW5kIHVzZSBVUyBMb2NhbGUgCi0JCQkvLyB0byBnZXQgYSBnb29kIGNvbm9uaWNhbCBmb3JtLCBzaW5jZSB3ZSBhcmUgdXNpbmcgdGhpcyBvbmx5IAotCQkJLy8gZm9yIEhUTUwgYW5kIEpTUCBzdGFuZGFyZCB0YWdzLiAKLQkJCS8vIExvbmcgdGVybSwgZm9yIHNpbWlsYXIgbmVlZHMgd2l0aCBYTUwgMS4xIChmb3IgZXhhbXBsZSkKLQkJCS8vIHdlIHNob3VsZCB1c2UgYSBjbGFzcyBzdWNoIGFzIGNvbS5pYm0uaWN1LnRleHQuTm9ybWFsaXplcgotCQkJcmV0dXJuIHJhdy50b1VwcGVyQ2FzZShMb2NhbGUuVVMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBEZWNsSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0JCXB1YmxpYyBEZWNsSXRlcmF0b3IoKSB7Ci0JCQltYXhpZCA9IGZEZWNscy5sZW5ndGggLSAxOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiBpZCA8IG1heGlkOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJaWYgKCFoYXNOZXh0KCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gaXRlbSgrK2lkKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsgLyogbm90aGluZyBzaG91bGQgYmUgZG9uZS4gKi8KLQkJfQotCi0JCXByaXZhdGUgaW50IGlkID0gLTE7Ci0JCXByaXZhdGUgaW50IG1heGlkID0gLTE7Ci0JfQotCi0JQ01Ob2RlW10gZkRlY2xzID0gbnVsbDsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGJvb2xlYW4gU1RSSUNUX0NBU0UgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGJvb2xlYW4gVE9MRVJBTlRfQ0FTRSA9IHRydWU7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgSURfVU5LTk9XTiA9IC0xOwotCXByaXZhdGUgRHVhbE1hcCBmTWFwID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBEZWNsQ29sbGVjdGlvbihTdHJpbmdbXSBuYW1lcywgYm9vbGVhbiB0b2xlcmFudCkgewotCQlzdXBlcigpOwotCQlmRGVjbHMgPSBuZXcgQ01Ob2RlW25hbWVzLmxlbmd0aF07Ci0JCWlmICh0b2xlcmFudCkgewotCQkJZk1hcCA9IG5ldyBUb2xlcmFudFN0cmluZ0R1YWxNYXAobmFtZXMpOwotCQl9Ci0JCWVsc2UgewotCQkJZk1hcCA9IG5ldyBEdWFsTWFwKG5hbWVzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKiBAcGFyYW0gaWQgaW50Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IENNTm9kZSBjcmVhdGUoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldERlY2xhcmF0aW9ucyhTdHJpbmdbXSBuYW1lcykgewotCQlDTU5hbWVkTm9kZU1hcEltcGwgbWFwID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IG5hbWVzW2ldOwotCQkJQ01Ob2RlIG5vZGUgPSBnZXROYW1lZEl0ZW0obmFtZSk7Ci0JCQlpZiAobm9kZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJbWFwLnB1dE5hbWVkSXRlbShuYW1lLCBub2RlKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lcyBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXREZWNsYXJhdGlvbnMoQ01Hcm91cEltcGwgZ3JvdXAsIEl0ZXJhdG9yIG5hbWVzKSB7Ci0JCXdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBlbnRpdHlOYW1lID0gKFN0cmluZykgbmFtZXMubmV4dCgpOwotCQkJQ01Ob2RlIGRlYyA9IGdldE5hbWVkSXRlbShlbnRpdHlOYW1lKTsKLQkJCWlmIChkZWMgIT0gbnVsbCkKLQkJCQlncm91cC5hcHBlbmRDaGlsZChkZWMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFwIG5hbWUgdG8gaWQuCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRJRChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZk1hcC5nZXRLZXkobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGVuZ3RoIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmRGVjbHMubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpZCBpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWUoaW50IGlkKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBmTWFwLmdldFZhbHVlKGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lZEl0ZW0gbWV0aG9kCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJaW50IGlkID0gZ2V0SUQobmFtZSk7Ci0JCWlmICghaXNWYWxpZElEKGlkKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gaXRlbShpZCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIGlkIGludAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkSUQoaW50IGlkKSB7Ci0JCXJldHVybiBpZCA+PSAwICYmIGlkIDwgZkRlY2xzLmxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBpdGVtIG1ldGhvZAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1ZhbGlkSUQoaW5kZXgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNNTm9kZSBkZWNsID0gZkRlY2xzW2luZGV4XTsKLQkJaWYgKGRlY2wgIT0gbnVsbCkKLQkJCXJldHVybiBkZWNsOyAvLyBhbHJlYWR5IGV4aXN0LgotCi0JCWRlY2wgPSBjcmVhdGUoZ2V0TmFtZShpbmRleCkpOwotCQlmRGVjbHNbaW5kZXhdID0gZGVjbDsKLQkJcmV0dXJuIGRlY2w7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IERlY2xJdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvRWxlbWVudENvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvRWxlbWVudENvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM0OTk2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0VsZW1lbnRDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGVsZW1lbnQgZGVjbGFyYXRpb25zLgotICovCi1maW5hbCBjbGFzcyBFbGVtZW50Q29sbGVjdGlvbiBleHRlbmRzIERlY2xDb2xsZWN0aW9uIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUgewotCi0KLQkvLyBFbGVtZW50IElEcwotCXByaXZhdGUgc3RhdGljIGNsYXNzIElkcyB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0EgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQkJSID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUNST05ZTSA9IDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FERFJFU1MgPSAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BUFBMRVQgPSA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BUkVBID0gNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQiA9IDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JBU0UgPSA3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CQVNFRk9OVCA9IDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JETyA9IDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JJRyA9IDEwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CTElOSyA9IDExOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CTE9DS1FVT1RFID0gMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JPRFkgPSAxMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQlIgPSAxNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQlVUVE9OID0gMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NBUFRJT04gPSAxNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0VOVEVSID0gMTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NJVEUgPSAxODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ09ERSA9IDE5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DT0wgPSAyMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ09MR1JPVVAgPSAyMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREQgPSAyMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREVMID0gMjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RGTiA9IDI0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESVIgPSAyNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElWID0gMjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RMID0gMjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RUID0gMjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VNID0gMjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VNQkVEID0gMzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZJRUxEU0VUID0gMzE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZPTlQgPSAzMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRk9STSA9IDMzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GUkFNRSA9IDM0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GUkFNRVNFVCA9IDM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IMSA9IDM2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IMiA9IDM3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IMyA9IDM4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9INCA9IDM5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9INSA9IDQwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9INiA9IDQxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IRUFEID0gNDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hSID0gNDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hUTUwgPSA0NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSSA9IDQ1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JRlJBTUUgPSA0NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU1HID0gNDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lOUFVUID0gNDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lOUyA9IDQ5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JU0lOREVYID0gNTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0tCRCA9IDUxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQUJFTCA9IDUyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MRUdFTkQgPSA1MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEkgPSA1NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTElOSyA9IDU1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NQVAgPSA1NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUVOVSA9IDU3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NRVRBID0gNTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05PRU1CRUQgPSA1OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTk9GUkFNRVMgPSA2MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTk9TQ1JJUFQgPSA2MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0JKRUNUID0gNjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09MID0gNjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09QVEdST1VQID0gNjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09QVElPTiA9IDY1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QID0gNjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BBUkFNID0gNjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BSRSA9IDY4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9RID0gNjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1MgPSA3MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0FNUCA9IDcxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TQ1JJUFQgPSA3MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0VMRUNUID0gNzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NNQUxMID0gNzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NQQU4gPSA3NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1RSSUtFID0gNzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NUUk9ORyA9IDc3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVFlMRSA9IDc4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVUIgPSA3OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VQID0gODA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RBQkxFID0gODE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RCT0RZID0gODI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1REID0gODM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RFWFRBUkVBID0gODQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RGT09UID0gODU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIID0gODY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRUFEID0gODc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RJVExFID0gODg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RSID0gODk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RUID0gOTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1UgPSA5MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUwgPSA5MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVkFSID0gOTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01BUlFVRUUgPSA5NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0NPTkZJRyA9IDk1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfRUNITyA9IDk2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfRVhFQyA9IDk3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfRlNJWkUgPSA5ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0ZMQVNUTU9EID0gOTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9JTkNMVURFID0gMTAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfUFJJTlRFTlYgPSAxMDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9TRVQgPSAxMDI7Ci0JCS8vIDw8RDIwNTUxMwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CR1NPVU5EID0gMTAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OT0JSID0gMTA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9XQlIgPSAxMDU7Ci0KLQkJLy8gRDIwNTUxMwotCi0JCXB1YmxpYyBzdGF0aWMgaW50IGdldE51bU9mSWRzKCkgewotCQkJaWYgKG51bW9maWRzICE9IC0xKQotCQkJCXJldHVybiBudW1vZmlkczsKLQotCQkJLy8gTk9URTogSWYgdGhlIHJlZmxlY3Rpb24gaXMgdG9vIHNsb3csIHRoaXMgbWV0aG9kIHNob3VsZAotCQkJLy8ganVzdCByZXR1cm4gdGhlIGxpdGVyYWwgdmFsdWUsIGxpa2UgMTA1LgotCQkJLy8gLS0gNS8yNS8yMDAxCi0JCQlDbGFzcyBjbGF6eiA9IElkcy5jbGFzczsKLQkJCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RmllbGRzKCk7Ci0JCQludW1vZmlkcyA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gZmllbGRzW2ldLmdldE5hbWUoKTsKLQkJCQlpZiAobmFtZS5zdGFydHNXaXRoKCJJRF8iKSkvLyROT04tTkxTLTEkCi0JCQkJCW51bW9maWRzKys7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVtb2ZpZHM7Ci0JCX0KLQotCQkvLyBjaGFjaGUgdGhlIHJlc3VsdCBvZiB0aGUgcmVmbGVjdGlvbi4KLQkJcHJpdmF0ZSBzdGF0aWMgaW50IG51bW9maWRzID0gLTE7Ci0JfQotCi0JLyoqICVmb250c3R5bGU7LiBUVCB8IEkgfCBCIHwgVSB8IFMgfCBTVFJJS0UgfCBCSUcgfCBTTUFMTCB8IEJMSU5LICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRk9OVFNUWUxFID0ge1RULCBJLCBCLCBVLCBTLCBTVFJJS0UsIEJJRywgU01BTEwsIEJMSU5LfTsKLQkvKiogJWZvcm1jdGw7LiBJTlBVVCB8IFNFTEVDVCB8IFRFWFRBUkVBIHwgTEFCRUwgfCBCVVRUT04gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGT1JNQ1RMID0ge0lOUFVULCBTRUxFQ1QsIFRFWFRBUkVBLCBMQUJFTCwgQlVUVE9OfTsKLQkvKiogJXBocmFzZTsuCi0JICogRU0gfCBTVFJPTkcgfCBERk4gfCBDT0RFIHwgU0FNUCB8IEtCRCB8IFZBUiB8IENJVEUgfCBBQkJSIHwgQUNST05ZTQotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBIUkFTRSA9IHtFTSwgU1RST05HLCBERk4sIENPREUsIFNBTVAsIEtCRCwgVkFSLCBDSVRFLCBBQkJSLCBBQ1JPTllNfTsKLQkvKiogJXNwZWNpYWw7LgotCSAqIEEgfCBJTUcgfCBBUFBMRVQgfCBPQkpFQ1QgfCBGT05UIHwgQkFTRUZPTlQgfCBCUiB8IFNDUklQVCB8Ci0JICogTUFQIHwgUSB8IFNVQiB8IFNVUCB8IFNQQU4gfCBCRE8gfCBJRlJBTUUgfCBFTUJFRCB8IE1BUlFVRUUgfAotCSAqIEQyVyB8IFNVQk1JVAotCSAqIFdCUiB8IE5PQlIgfCBCR1NPVU5ECi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1BFQ0lBTCA9IHtBLCBJTUcsIEFQUExFVCwgT0JKRUNULCBGT05ULCBCQVNFRk9OVCwgQlIsIFdCUiwgLy8gRDIwNTUxMwotCQkJCVNDUklQVCwgTUFQLCBRLCBTVUIsIFNVUCwgU1BBTiwgQkRPLCBJRlJBTUUsIEVNQkVELCBCR1NPVU5ELCAvLyBEMjA1NTEzCi0JCQkJTUFSUVVFRSwgTk9CUiAvLyBEMjA1NTEzCi0JfTsKLQkvKiogJWhlYWRpbmc7LiBIWzEtNl0gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBIRUFESU5HID0ge0gxLCBIMiwgSDMsIEg0LCBINSwgSDZ9OwotCS8qKiAlbGlzdDsuIFVMIHwgT0wgfCBESVIgfCBNRU5VICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTElTVCA9IHtVTCwgT0wsIERJUiwgTUVOVX07Ci0JLyoqICVwcmVmb3JtYXR0ZWQ7LiBQUkUgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQUkVGT1JNQVRURUQgPSB7UFJFfTsKLQlwcml2YXRlIEF0dHJpYnV0ZUNvbGxlY3Rpb24gYXR0cmlidXRlQ29sbGVjdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZk5hbWVzID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCWZOYW1lcyA9IG5ldyBTdHJpbmdbSWRzLmdldE51bU9mSWRzKCldOwotCQlmTmFtZXNbSWRzLklEX0FdID0gQTsKLQkJZk5hbWVzW0lkcy5JRF9BQkJSXSA9IEFCQlI7Ci0JCWZOYW1lc1tJZHMuSURfQUNST05ZTV0gPSBBQ1JPTllNOwotCQlmTmFtZXNbSWRzLklEX0FERFJFU1NdID0gQUREUkVTUzsKLQkJZk5hbWVzW0lkcy5JRF9BUFBMRVRdID0gQVBQTEVUOwotCQlmTmFtZXNbSWRzLklEX0FSRUFdID0gQVJFQTsKLQkJZk5hbWVzW0lkcy5JRF9CXSA9IEI7Ci0JCWZOYW1lc1tJZHMuSURfQkFTRV0gPSBCQVNFOwotCQlmTmFtZXNbSWRzLklEX0JBU0VGT05UXSA9IEJBU0VGT05UOwotCQlmTmFtZXNbSWRzLklEX0JET10gPSBCRE87Ci0JCWZOYW1lc1tJZHMuSURfQklHXSA9IEJJRzsKLQkJZk5hbWVzW0lkcy5JRF9CTElOS10gPSBCTElOSzsKLQkJZk5hbWVzW0lkcy5JRF9CTE9DS1FVT1RFXSA9IEJMT0NLUVVPVEU7Ci0JCWZOYW1lc1tJZHMuSURfQk9EWV0gPSBCT0RZOwotCQlmTmFtZXNbSWRzLklEX0JSXSA9IEJSOwotCQlmTmFtZXNbSWRzLklEX0JVVFRPTl0gPSBCVVRUT047Ci0JCWZOYW1lc1tJZHMuSURfQ0FQVElPTl0gPSBDQVBUSU9OOwotCQlmTmFtZXNbSWRzLklEX0NFTlRFUl0gPSBDRU5URVI7Ci0JCWZOYW1lc1tJZHMuSURfQ0lURV0gPSBDSVRFOwotCQlmTmFtZXNbSWRzLklEX0NPREVdID0gQ09ERTsKLQkJZk5hbWVzW0lkcy5JRF9DT0xdID0gQ09MOwotCQlmTmFtZXNbSWRzLklEX0NPTEdST1VQXSA9IENPTEdST1VQOwotCQlmTmFtZXNbSWRzLklEX0REXSA9IEREOwotCQlmTmFtZXNbSWRzLklEX0RFTF0gPSBERUw7Ci0JCWZOYW1lc1tJZHMuSURfREZOXSA9IERGTjsKLQkJZk5hbWVzW0lkcy5JRF9ESVJdID0gRElSOwotCQlmTmFtZXNbSWRzLklEX0RJVl0gPSBESVY7Ci0JCWZOYW1lc1tJZHMuSURfRExdID0gREw7Ci0JCWZOYW1lc1tJZHMuSURfRFRdID0gRFQ7Ci0JCWZOYW1lc1tJZHMuSURfRU1dID0gRU07Ci0JCWZOYW1lc1tJZHMuSURfRU1CRURdID0gRU1CRUQ7Ci0JCWZOYW1lc1tJZHMuSURfRklFTERTRVRdID0gRklFTERTRVQ7Ci0JCWZOYW1lc1tJZHMuSURfRk9OVF0gPSBGT05UOwotCQlmTmFtZXNbSWRzLklEX0ZPUk1dID0gRk9STTsKLQkJZk5hbWVzW0lkcy5JRF9GUkFNRV0gPSBGUkFNRTsKLQkJZk5hbWVzW0lkcy5JRF9GUkFNRVNFVF0gPSBGUkFNRVNFVDsKLQkJZk5hbWVzW0lkcy5JRF9IMV0gPSBIMTsKLQkJZk5hbWVzW0lkcy5JRF9IMl0gPSBIMjsKLQkJZk5hbWVzW0lkcy5JRF9IM10gPSBIMzsKLQkJZk5hbWVzW0lkcy5JRF9INF0gPSBINDsKLQkJZk5hbWVzW0lkcy5JRF9INV0gPSBINTsKLQkJZk5hbWVzW0lkcy5JRF9INl0gPSBINjsKLQkJZk5hbWVzW0lkcy5JRF9IRUFEXSA9IEhFQUQ7Ci0JCWZOYW1lc1tJZHMuSURfSFJdID0gSFI7Ci0JCWZOYW1lc1tJZHMuSURfSFRNTF0gPSBIVE1MOwotCQlmTmFtZXNbSWRzLklEX0ldID0gSTsKLQkJZk5hbWVzW0lkcy5JRF9JRlJBTUVdID0gSUZSQU1FOwotCQlmTmFtZXNbSWRzLklEX0lNR10gPSBJTUc7Ci0JCWZOYW1lc1tJZHMuSURfSU5QVVRdID0gSU5QVVQ7Ci0JCWZOYW1lc1tJZHMuSURfSU5TXSA9IElOUzsKLQkJZk5hbWVzW0lkcy5JRF9JU0lOREVYXSA9IElTSU5ERVg7Ci0JCWZOYW1lc1tJZHMuSURfS0JEXSA9IEtCRDsKLQkJZk5hbWVzW0lkcy5JRF9MQUJFTF0gPSBMQUJFTDsKLQkJZk5hbWVzW0lkcy5JRF9MRUdFTkRdID0gTEVHRU5EOwotCQlmTmFtZXNbSWRzLklEX0xJXSA9IExJOwotCQlmTmFtZXNbSWRzLklEX0xJTktdID0gTElOSzsKLQkJZk5hbWVzW0lkcy5JRF9NQVBdID0gTUFQOwotCQlmTmFtZXNbSWRzLklEX01FTlVdID0gTUVOVTsKLQkJZk5hbWVzW0lkcy5JRF9NRVRBXSA9IE1FVEE7Ci0JCWZOYW1lc1tJZHMuSURfTk9FTUJFRF0gPSBOT0VNQkVEOwotCQlmTmFtZXNbSWRzLklEX05PRlJBTUVTXSA9IE5PRlJBTUVTOwotCQlmTmFtZXNbSWRzLklEX05PU0NSSVBUXSA9IE5PU0NSSVBUOwotCQlmTmFtZXNbSWRzLklEX09CSkVDVF0gPSBPQkpFQ1Q7Ci0JCWZOYW1lc1tJZHMuSURfT0xdID0gT0w7Ci0JCWZOYW1lc1tJZHMuSURfT1BUR1JPVVBdID0gT1BUR1JPVVA7Ci0JCWZOYW1lc1tJZHMuSURfT1BUSU9OXSA9IE9QVElPTjsKLQkJZk5hbWVzW0lkcy5JRF9QXSA9IFA7Ci0JCWZOYW1lc1tJZHMuSURfUEFSQU1dID0gUEFSQU07Ci0JCWZOYW1lc1tJZHMuSURfUFJFXSA9IFBSRTsKLQkJZk5hbWVzW0lkcy5JRF9RXSA9IFE7Ci0JCWZOYW1lc1tJZHMuSURfU10gPSBTOwotCQlmTmFtZXNbSWRzLklEX1NBTVBdID0gU0FNUDsKLQkJZk5hbWVzW0lkcy5JRF9TQ1JJUFRdID0gU0NSSVBUOwotCQlmTmFtZXNbSWRzLklEX1NFTEVDVF0gPSBTRUxFQ1Q7Ci0JCWZOYW1lc1tJZHMuSURfU01BTExdID0gU01BTEw7Ci0JCWZOYW1lc1tJZHMuSURfU1BBTl0gPSBTUEFOOwotCQlmTmFtZXNbSWRzLklEX1NUUklLRV0gPSBTVFJJS0U7Ci0JCWZOYW1lc1tJZHMuSURfU1RST05HXSA9IFNUUk9ORzsKLQkJZk5hbWVzW0lkcy5JRF9TVFlMRV0gPSBTVFlMRTsKLQkJZk5hbWVzW0lkcy5JRF9TVUJdID0gU1VCOwotCQlmTmFtZXNbSWRzLklEX1NVUF0gPSBTVVA7Ci0JCWZOYW1lc1tJZHMuSURfVEFCTEVdID0gVEFCTEU7Ci0JCWZOYW1lc1tJZHMuSURfVEJPRFldID0gVEJPRFk7Ci0JCWZOYW1lc1tJZHMuSURfVERdID0gVEQ7Ci0JCWZOYW1lc1tJZHMuSURfVEVYVEFSRUFdID0gVEVYVEFSRUE7Ci0JCWZOYW1lc1tJZHMuSURfVEZPT1RdID0gVEZPT1Q7Ci0JCWZOYW1lc1tJZHMuSURfVEhdID0gVEg7Ci0JCWZOYW1lc1tJZHMuSURfVEhFQURdID0gVEhFQUQ7Ci0JCWZOYW1lc1tJZHMuSURfVElUTEVdID0gVElUTEU7Ci0JCWZOYW1lc1tJZHMuSURfVFJdID0gVFI7Ci0JCWZOYW1lc1tJZHMuSURfVFRdID0gVFQ7Ci0JCWZOYW1lc1tJZHMuSURfVV0gPSBVOwotCQlmTmFtZXNbSWRzLklEX1VMXSA9IFVMOwotCQlmTmFtZXNbSWRzLklEX1ZBUl0gPSBWQVI7Ci0JCWZOYW1lc1tJZHMuSURfTUFSUVVFRV0gPSBNQVJRVUVFOwotCQlmTmFtZXNbSWRzLklEX1NTSV9DT05GSUddID0gU1NJX0NPTkZJRzsKLQkJZk5hbWVzW0lkcy5JRF9TU0lfRUNIT10gPSBTU0lfRUNITzsKLQkJZk5hbWVzW0lkcy5JRF9TU0lfRVhFQ10gPSBTU0lfRVhFQzsKLQkJZk5hbWVzW0lkcy5JRF9TU0lfRlNJWkVdID0gU1NJX0ZTSVpFOwotCQlmTmFtZXNbSWRzLklEX1NTSV9GTEFTVE1PRF0gPSBTU0lfRkxBU1RNT0Q7Ci0JCWZOYW1lc1tJZHMuSURfU1NJX0lOQ0xVREVdID0gU1NJX0lOQ0xVREU7Ci0JCWZOYW1lc1tJZHMuSURfU1NJX1BSSU5URU5WXSA9IFNTSV9QUklOVEVOVjsKLQkJZk5hbWVzW0lkcy5JRF9TU0lfU0VUXSA9IFNTSV9TRVQ7Ci0JCWZOYW1lc1tJZHMuSURfQkdTT1VORF0gPSBCR1NPVU5EOwotCQlmTmFtZXNbSWRzLklEX05PQlJdID0gTk9CUjsKLQkJZk5hbWVzW0lkcy5JRF9XQlJdID0gV0JSOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbGVtZW50Q29sbGVjdGlvbihBdHRyaWJ1dGVDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZk5hbWVzLCBUT0xFUkFOVF9DQVNFKTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbiA9IGNvbGxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQWN0dWFsbHkgY3JlYXRlcyBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGluc3RhbmNlLgotCSAqIEByZXR1cm4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBDTU5vZGUgY3JlYXRlKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlIVE1MRWxlbURlY2xJbXBsIGVkZWMgPSBudWxsOwotCi0JCWlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEEpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEEodGhpcyk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShBQkJSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQaHJhc2UoQUJCUiwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFDUk9OWU0pKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBocmFzZShBQ1JPTllNLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQUREUkVTUykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQUREUkVTUyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVBQTEVUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRBUFBMRVQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFSRUEpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEFSRUEodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZvbnRTdHlsZShCLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQkFTRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQkFTRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQkFTRUZPTlQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEJBU0VGT05UKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCRE8pKSB7Ci0JCQllZGVjID0gbmV3IEhlZEJETyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQklHKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGb250U3R5bGUoQklHLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQkxJTkspKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZvbnRTdHlsZShCTElOSywgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJMT0NLUVVPVEUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEJMT0NLUVVPVEUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJPRFkpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEJPRFkodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCUih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQlVUVE9OKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCVVRUT04odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKENBUFRJT04pKSB7Ci0JCQllZGVjID0gbmV3IEhlZENBUFRJT04odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKENFTlRFUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQ0VOVEVSKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShDSVRFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQaHJhc2UoQ0lURSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKENPREUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBocmFzZShDT0RFLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQ09MKSkgewotCQkJZWRlYyA9IG5ldyBIZWRDT0wodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKENPTEdST1VQKSkgewotCQkJZWRlYyA9IG5ldyBIZWRDT0xHUk9VUCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoREQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEREKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShERUwpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE1hcmtDaGFuZ2VzKERFTCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKERGTikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUGhyYXNlKERGTiwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKERJUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTUVOVShESVIsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShESVYpKSB7Ci0JCQllZGVjID0gbmV3IEhlZERJVih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoREwpKSB7Ci0JCQllZGVjID0gbmV3IEhlZERMKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShEVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRFQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEVNKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQaHJhc2UoRU0sIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShFTUJFRCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRU1CRUQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEZJRUxEU0VUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGSUVMRFNFVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRk9OVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRk9OVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRk9STSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRk9STSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRlJBTUUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZSQU1FKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShGUkFNRVNFVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRlJBTUVTRVQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEgxKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEgxLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDIsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIMykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhIMywgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEg0KSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEg0LCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDUsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShINikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhINiwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhFQUQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhFQUQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIUih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSFRNTCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRm9udFN0eWxlKEksIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShJRlJBTUUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZElGUkFNRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSU1HKSkgewotCQkJZWRlYyA9IG5ldyBIZWRJTUcodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKElOUFVUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRJTlBVVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSU5TKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNYXJrQ2hhbmdlcyhJTlMsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShJU0lOREVYKSkgewotCQkJZWRlYyA9IG5ldyBIZWRJU0lOREVYKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShLQkQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBocmFzZShLQkQsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShMQUJFTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTEFCRUwodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKExFR0VORCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTEVHRU5EKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShMSSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTEkodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKExJTkspKSB7Ci0JCQllZGVjID0gbmV3IEhlZExJTksodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE1BUCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTUFQKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShNQVJRVUVFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNQVJRVUVFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShNRU5VKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNRU5VKE1FTlUsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShNRVRBKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNRVRBKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShOT0VNQkVEKSkgewotCQkJZWRlYyA9IG5ldyBIZWROT0VNQkVEKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShOT0ZSQU1FUykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTk9GUkFNRVModGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE5PU0NSSVBUKSkgewotCQkJZWRlYyA9IG5ldyBIZWROT1NDUklQVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoT0JKRUNUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRPQkpFQ1QodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE9MKSkgewotCQkJZWRlYyA9IG5ldyBIZWRPTCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoT1BUR1JPVVApKSB7Ci0JCQllZGVjID0gbmV3IEhlZE9QVEdST1VQKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShPUFRJT04pKSB7Ci0JCQllZGVjID0gbmV3IEhlZE9QVElPTih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoUCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoUEFSQU0pKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBBUkFNKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShQUkUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBSRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoUSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoUykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRm9udFN0eWxlKFMsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTQU1QKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQaHJhc2UoU0FNUCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNDUklQVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU0NSSVBUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTRUxFQ1QpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNFTEVDVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU01BTEwpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZvbnRTdHlsZShTTUFMTCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNQQU4pKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNQQU4odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNUUklLRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRm9udFN0eWxlKFNUUklLRSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNUUk9ORykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUGhyYXNlKFNUUk9ORywgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNUWUxFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTVFlMRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1VCKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTY3JpcHRzKFNVQiwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNVUCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU2NyaXB0cyhTVVAsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShUQUJMRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVEFCTEUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRCT0RZKSkgewotCQkJZWRlYyA9IG5ldyBIZWRUYWJsZUJvZHkoVEJPRFksIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShURCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVGFibGVDZWxsKFRELCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVEVYVEFSRUEpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRFWFRBUkVBKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShURk9PVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVGFibGVCb2R5KFRGT09ULCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVEgpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRhYmxlQ2VsbChUSCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRIRUFEKSkgewotCQkJZWRlYyA9IG5ldyBIZWRUYWJsZUJvZHkoVEhFQUQsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShUSVRMRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVElUTEUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRUUih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVFQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZvbnRTdHlsZShUVCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZvbnRTdHlsZShVLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVUwpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFVMKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShWQVIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBocmFzZShWQVIsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfQ09ORklHKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lDb25maWcodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9FQ0hPKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lFY2hvKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfRVhFQykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJRXhlYyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0ZTSVpFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lGc2l6ZSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0ZMQVNUTU9EKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lGbGFzdG1vZCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0lOQ0xVREUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUluY2x1ZGUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9QUklOVEVOVikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJUHJpbnRlbnYodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9TRVQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSVNldCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQkdTT1VORCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQkdTT1VORCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTk9CUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTk9CUih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoV0JSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRXQlIodGhpcyk7Ci0KLQkJfSAvLyB1bmtub3duCi0JCWVsc2UgewotCQkJLy8gTk9URTogV2UgZG9uJ3QgZGVmaW5lIHRoZSBVTktOT1dOIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0JCQkvLyA8Y29kZT5udWxsPC9jb2RlPiBmb3IgYSBkZWNsYXJhdGlvbiBpcyBhIHNpZ24gb2YKLQkJCS8vIHRoZSB0YXJnZXQgZWxlbWVudCBpcyB1bmtub3duLgotCQkJLy8gLS0gMy85LzIwMDEKLQkJCWVkZWMgPSBudWxsOwotCQl9Ci0JCXJldHVybiBlZGVjOwotCX0KLQotCXB1YmxpYyBBdHRyaWJ1dGVDb2xsZWN0aW9uIGdldEF0dHJpYnV0ZUNvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVDb2xsZWN0aW9uOwotCX0KLQotCXB1YmxpYyBmaW5hbCBDb2xsZWN0aW9uIGdldE5hbWVzT2ZCbG9jaygpIHsKLQkJLy8gUCwgREwsIERJViwgQ0VOVEVSLCBOT1NDUklQVCwgTk9GUkFNRVMsIEJMT0NLUVVPVEUsIEZPUk0sIElTSU5ERVgsIEhSLAotCQkvLyBUQUJMRSwgRklFTERTRVQsIEFERFJFU1MKLQkJU3RyaW5nW10gYmxvY2tNaXNjID0ge1AsIERMLCBESVYsIENFTlRFUiwgTk9TQ1JJUFQsIE5PRlJBTUVTLCBCTE9DS1FVT1RFLCBGT1JNLCBJU0lOREVYLCBIUiwgVEFCTEUsIEZJRUxEU0VULCBBRERSRVNTfTsKLQkJVmVjdG9yIG5hbWVzID0gbmV3IFZlY3RvcihBcnJheXMuYXNMaXN0KGJsb2NrTWlzYykpOwotCQkvLyAlaGVhZGluZzsKLQkJbmFtZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoSEVBRElORykpOwotCQkvLyAlbGlzdDsKLQkJbmFtZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoTElTVCkpOwotCQkvLyAlcHJlZm9ybWF0dGVkOwotCQluYW1lcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChQUkVGT1JNQVRURUQpKTsKLQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JLyoqCi0JICogJWJsb2NrOy4KLQkgKiAlYmxvY2s7IGlzOgotCSAqIFAgfCAlaGVhZGluZzsgfCAlbGlzdDsgfCAlcHJlZm9ybWF0dGVkOyB8IERMIHwgRElWIHwgQ0VOVEVSIHwKLQkgKiBOT1NDUklQVCB8IE5PRlJBTUVTIHwgQkxPQ0tRVU9URSB8IEZPUk0gfCBJU0lOREVYIHwgSFIgfAotCSAqIFRBQkxFIHwgRklFTERTRVQgfCBBRERSRVNTLjxicj4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRCbG9jayhDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBnZXROYW1lc09mQmxvY2soKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0KLQkgKiBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+IGluc3RhbmNlLgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldEZsb3coQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldEJsb2NrKGdyb3VwKTsKLQkJZ2V0SW5saW5lKGdyb3VwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0gaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPgotCSAqIGluc3RhbmNlLjxicj4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRGb250c3R5bGUoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChGT05UU1RZTEUpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgc3RvcmUgdGhlbSBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+Ci0JICogaW5zdGFuY2UuPGJyPgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldEZvcm1jdHJsKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoRk9STUNUTCkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogJWhlYWRpbmc7LgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldEhlYWRpbmcoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KEhFQURJTkcpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgc3RvcmUgdGhlbQotCSAqIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4gaW5zdGFuY2UuCi0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0SW5saW5lKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXRGb250c3R5bGUoZ3JvdXApOwotCQlnZXRQaHJhc2UoZ3JvdXApOwotCQlnZXRTcGVjaWFsKGdyb3VwKTsKLQkJZ2V0Rm9ybWN0cmwoZ3JvdXApOwotCX0KLQotCS8qKgotCSAqICVsaXN0Oy4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRMaXN0KENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChMSVNUKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0gaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPgotCSAqIGluc3RhbmNlLjxicj4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRQaHJhc2UoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChQSFJBU0UpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqICVwcmVmb3JtYXR0ZWQ7Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0UHJlZm9ybWF0dGVkKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChQUkVGT1JNQVRURUQpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgc3RvcmUgdGhlbSBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+Ci0JICogaW5zdGFuY2UuPGJyPgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldFNwZWNpYWwoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChTUEVDSUFMKS5pdGVyYXRvcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0VudGl0eUNvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvRW50aXR5Q29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGE3MDQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvRW50aXR5Q29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGVudGl0eSBkZWNsYXJhdGlvbnMuCi0gKi8KLWZpbmFsIGNsYXNzIEVudGl0eUNvbGxlY3Rpb24gZXh0ZW5kcyBEZWNsQ29sbGVjdGlvbiBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlLkVudGl0eU5hbWUgewotCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJZHMgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQUNVVEVfTCA9IDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FBQ1VURV9VID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUNJUkNfTCA9IDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FDSVJDX1UgPSAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQ1VURSA9IDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FFTElHX0wgPSA1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BRUxJR19VID0gNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUdSQVZFX0wgPSA3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BR1JBVkVfVSA9IDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FMRUZTWU0gPSA5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTFBIQV9MID0gMTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FMUEhBX1UgPSAxMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQU1QID0gMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FORCA9IDEzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTkcgPSAxNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVJJTkdfTCA9IDE1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BUklOR19VID0gMTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FTWU1QID0gMTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FUSUxERV9MID0gMTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FUSUxERV9VID0gMTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FVTUxfTCA9IDIwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVU1MX1UgPSAyMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkRRVU8gPSAyMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkVUQV9MID0gMjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JFVEFfVSA9IDI0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CUlZCQVIgPSAyNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQlVMTCA9IDI2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DQVAgPSAyNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0NFRElMX0wgPSAyODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0NFRElMX1UgPSAyOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0VESUwgPSAzMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0VOVCA9IDMxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DSElfTCA9IDMyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DSElfVSA9IDMzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DSVJDID0gMzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NMVUJTID0gMzU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NPTkcgPSAzNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ09QWSA9IDM3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DUkFSUiA9IDM4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DVVAgPSAzOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ1VSUkVOID0gNDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RBR0dFUl9MID0gNDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RBR0dFUl9VID0gNDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RBUlJfTCA9IDQzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EQVJSX1UgPSA0NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREVHID0gNDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RFTFRBX0wgPSA0NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREVMVEFfVSA9IDQ3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESUFNUyA9IDQ4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESVZJREUgPSA0OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUFDVVRFX0wgPSA1MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUFDVVRFX1UgPSA1MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUNJUkNfTCA9IDUyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FQ0lSQ19VID0gNTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VHUkFWRV9MID0gNTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VHUkFWRV9VID0gNTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VNUFRZID0gNTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VNU1AgPSA1NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRU5TUCA9IDU4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FUFNJTE9OX0wgPSA1OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVBTSUxPTl9VID0gNjA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VRVUlWID0gNjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VUQV9MID0gNjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VUQV9VID0gNjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VUSF9MID0gNjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VUSF9VID0gNjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VVTUxfTCA9IDY2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVU1MX1UgPSA2NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVVSTyA9IDY4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FWElTVCA9IDY5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GTk9GID0gNzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZPUkFMTCA9IDcxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GUkFDMTIgPSA3MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRlJBQzE0ID0gNzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZSQUMzNCA9IDc0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GUkFTTCA9IDc1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9HQU1NQV9MID0gNzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dBTU1BX1UgPSA3NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfR0UgPSA3ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfR1QgPSA3OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSEFSUl9MID0gODA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hBUlJfVSA9IDgxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IRUFSVFMgPSA4MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSEVMTElQID0gODM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lBQ1VURV9MID0gODQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lBQ1VURV9VID0gODU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lDSVJDX0wgPSA4NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUNJUkNfVSA9IDg3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JRVhDTCA9IDg4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JR1JBVkVfTCA9IDg5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JR1JBVkVfVSA9IDkwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JTUFHRSA9IDkxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JTkZJTiA9IDkyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JTlQgPSA5MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU9UQV9MID0gOTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lPVEFfVSA9IDk1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JUVVFU1QgPSA5NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSVNJTiA9IDk3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JVU1MX0wgPSA5ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSVVNTF9VID0gOTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0tBUFBBX0wgPSAxMDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0tBUFBBX1UgPSAxMDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBTUJEQV9MID0gMTAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQU1CREFfVSA9IDEwMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFORyA9IDEwNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFRVU8gPSAxMDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBUlJfTCA9IDEwNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFSUl9VID0gMTA3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQ0VJTCA9IDEwODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTERRVU8gPSAxMDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xFID0gMTEwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MRkxPT1IgPSAxMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xPV0FTVCA9IDExMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTE9aID0gMTEzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MUk0gPSAxMTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xTQVFVTyA9IDExNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTFNRVU8gPSAxMTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xUID0gMTE3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NQUNSID0gMTE4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NREFTSCA9IDExOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUlDUk8gPSAxMjA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01JRERPVCA9IDEyMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUlOVVMgPSAxMjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01VX0wgPSAxMjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01VX1UgPSAxMjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05BQkxBID0gMTI1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OQlNQID0gMTI2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OREFTSCA9IDEyNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTkUgPSAxMjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05JID0gMTI5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OT1QgPSAxMzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05PVElOID0gMTMxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OU1VCID0gMTMyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OVElMREVfTCA9IDEzMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTlRJTERFX1UgPSAxMzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05VX0wgPSAxMzU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05VX1UgPSAxMzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09BQ1VURV9MID0gMTM3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PQUNVVEVfVSA9IDEzODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0NJUkNfTCA9IDEzOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0NJUkNfVSA9IDE0MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0VMSUdfTCA9IDE0MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0VMSUdfVSA9IDE0MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0dSQVZFX0wgPSAxNDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09HUkFWRV9VID0gMTQ0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PTElORSA9IDE0NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT01FR0FfTCA9IDE0NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT01FR0FfVSA9IDE0NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT01JQ1JPTl9MID0gMTQ4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PTUlDUk9OX1UgPSAxNDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09QTFVTID0gMTUwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PUiA9IDE1MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1JERiA9IDE1MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1JETSA9IDE1MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1NMQVNIX0wgPSAxNTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09TTEFTSF9VID0gMTU1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PVElMREVfTCA9IDE1NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1RJTERFX1UgPSAxNTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09USU1FUyA9IDE1ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1VNTF9MID0gMTU5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PVU1MX1UgPSAxNjA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BBUkEgPSAxNjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BBUlQgPSAxNjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BFUk1JTCA9IDE2MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUEVSUCA9IDE2NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUEhJX0wgPSAxNjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BISV9VID0gMTY2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSVYgPSAxNjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BJX0wgPSAxNjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BJX1UgPSAxNjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BMVVNNTiA9IDE3MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUE9VTkQgPSAxNzE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BSSU1FX0wgPSAxNzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BSSU1FX1UgPSAxNzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BST0QgPSAxNzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BST1AgPSAxNzU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BTSV9MID0gMTc2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QU0lfVSA9IDE3NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUVVPVCA9IDE3ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkFESUMgPSAxNzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JBTkcgPSAxODA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JBUVVPID0gMTgxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQVJSX0wgPSAxODI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JBUlJfVSA9IDE4MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkNFSUwgPSAxODQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JEUVVPID0gMTg1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SRUFMID0gMTg2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SRUcgPSAxODc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JGTE9PUiA9IDE4ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkhPX0wgPSAxODk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JIT19VID0gMTkwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9STE0gPSAxOTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JTQVFVTyA9IDE5MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUlNRVU8gPSAxOTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NCUVVPID0gMTk0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TQ0FST05fTCA9IDE5NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0NBUk9OX1UgPSAxOTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NET1QgPSAxOTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NFQ1QgPSAxOTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NIWSA9IDE5OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0lHTUFGID0gMjAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TSUdNQV9MID0gMjAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TSUdNQV9VID0gMjAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TSU0gPSAyMDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NQQURFUyA9IDIwNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VCID0gMjA1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVUJFID0gMjA2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVU0gPSAyMDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUCA9IDIwODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VQMSA9IDIwOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VQMiA9IDIxMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VQMyA9IDIxMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VQRSA9IDIxMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1pMSUcgPSAyMTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RBVV9MID0gMjE0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UQVVfVSA9IDIxNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhFUkU0ID0gMjE2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USEVUQVNZTSA9IDIxNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhFVEFfTCA9IDIxODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhFVEFfVSA9IDIxOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhJTlNQID0gMjIwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USE9STl9MID0gMjIxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USE9STl9VID0gMjIyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USUxERSA9IDIyMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVElNRVMgPSAyMjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RSQURFID0gMjI1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VQUNVVEVfTCA9IDIyNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUFDVVRFX1UgPSAyMjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VBUlJfTCA9IDIyODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUFSUl9VID0gMjI5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VQ0lSQ19MID0gMjMwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VQ0lSQ19VID0gMjMxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VR1JBVkVfTCA9IDIzMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUdSQVZFX1UgPSAyMzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VNTCA9IDIzNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVVBTSUggPSAyMzU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VQU0lMT05fTCA9IDIzNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVVBTSUxPTl9VID0gMjM3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VVU1MX0wgPSAyMzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VVTUxfVSA9IDIzOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfV0VJRVJQID0gMjQwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9YSV9MID0gMjQxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9YSV9VID0gMjQyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ZQUNVVEVfTCA9IDI0MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWUFDVVRFX1UgPSAyNDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1lFTiA9IDI0NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWVVNTF9MID0gMjQ2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ZVU1MX1UgPSAyNDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1pFVEFfTCA9IDI0ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWkVUQV9VID0gMjQ5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9aV0ogPSAyNTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1pXTkogPSAyNTE7Ci0KLQkJcHVibGljIHN0YXRpYyBpbnQgZ2V0TnVtT2ZJZHMoKSB7Ci0JCQlpZiAobnVtb2ZpZHMgIT0gLTEpCi0JCQkJcmV0dXJuIG51bW9maWRzOwotCi0JCQkvLyBOT1RFOiBJZiB0aGUgcmVmbGVjdGlvbiBpcyB0b28gc2xvdywgdGhpcyBtZXRob2Qgc2hvdWxkCi0JCQkvLyBqdXN0IHJldHVybiB0aGUgbGl0ZXJhbCB2YWx1ZSwgbGlrZSAyNTIuCi0JCQkvLyAtLSA1LzI0LzIwMDEKLQkJCUNsYXNzIGNsYXp6ID0gSWRzLmNsYXNzOwotCQkJRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXRGaWVsZHMoKTsKLQkJCW51bW9maWRzID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBmaWVsZHNbaV0uZ2V0TmFtZSgpOwotCQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIklEXyIpKS8vJE5PTi1OTFMtMSQKLQkJCQkJbnVtb2ZpZHMrKzsKLQkJCX0KLQkJCXJldHVybiBudW1vZmlkczsKLQkJfQotCi0JCS8vIGNoYWNoZSB0aGUgcmVzdWx0IG9mIHRoZSByZWZsZWN0aW9uLgotCQlwcml2YXRlIHN0YXRpYyBpbnQgbnVtb2ZpZHMgPSAtMTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBuYW1lcyA9IG51bGw7Ci0KLQlzdGF0aWMgewotCQluYW1lcyA9IG5ldyBTdHJpbmdbSWRzLmdldE51bU9mSWRzKCldOwotCQluYW1lc1tJZHMuSURfQUFDVVRFX0xdID0gQUFDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9BQUNVVEVfVV0gPSBBQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX0FDSVJDX0xdID0gQUNJUkNfTDsKLQkJbmFtZXNbSWRzLklEX0FDSVJDX1VdID0gQUNJUkNfVTsKLQkJbmFtZXNbSWRzLklEX0FDVVRFXSA9IEFDVVRFOwotCQluYW1lc1tJZHMuSURfQUVMSUdfTF0gPSBBRUxJR19MOwotCQluYW1lc1tJZHMuSURfQUVMSUdfVV0gPSBBRUxJR19VOwotCQluYW1lc1tJZHMuSURfQUdSQVZFX0xdID0gQUdSQVZFX0w7Ci0JCW5hbWVzW0lkcy5JRF9BR1JBVkVfVV0gPSBBR1JBVkVfVTsKLQkJbmFtZXNbSWRzLklEX0FMRUZTWU1dID0gQUxFRlNZTTsKLQkJbmFtZXNbSWRzLklEX0FMUEhBX0xdID0gQUxQSEFfTDsKLQkJbmFtZXNbSWRzLklEX0FMUEhBX1VdID0gQUxQSEFfVTsKLQkJbmFtZXNbSWRzLklEX0FNUF0gPSBBTVA7Ci0JCW5hbWVzW0lkcy5JRF9BTkRdID0gQU5EOwotCQluYW1lc1tJZHMuSURfQU5HXSA9IEFORzsKLQkJbmFtZXNbSWRzLklEX0FSSU5HX0xdID0gQVJJTkdfTDsKLQkJbmFtZXNbSWRzLklEX0FSSU5HX1VdID0gQVJJTkdfVTsKLQkJbmFtZXNbSWRzLklEX0FTWU1QXSA9IEFTWU1QOwotCQluYW1lc1tJZHMuSURfQVRJTERFX0xdID0gQVRJTERFX0w7Ci0JCW5hbWVzW0lkcy5JRF9BVElMREVfVV0gPSBBVElMREVfVTsKLQkJbmFtZXNbSWRzLklEX0FVTUxfTF0gPSBBVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9BVU1MX1VdID0gQVVNTF9VOwotCQluYW1lc1tJZHMuSURfQkRRVU9dID0gQkRRVU87Ci0JCW5hbWVzW0lkcy5JRF9CRVRBX0xdID0gQkVUQV9MOwotCQluYW1lc1tJZHMuSURfQkVUQV9VXSA9IEJFVEFfVTsKLQkJbmFtZXNbSWRzLklEX0JSVkJBUl0gPSBCUlZCQVI7Ci0JCW5hbWVzW0lkcy5JRF9CVUxMXSA9IEJVTEw7Ci0JCW5hbWVzW0lkcy5JRF9DQVBdID0gQ0FQOwotCQluYW1lc1tJZHMuSURfQ0NFRElMX0xdID0gQ0NFRElMX0w7Ci0JCW5hbWVzW0lkcy5JRF9DQ0VESUxfVV0gPSBDQ0VESUxfVTsKLQkJbmFtZXNbSWRzLklEX0NFRElMXSA9IENFRElMOwotCQluYW1lc1tJZHMuSURfQ0VOVF0gPSBDRU5UOwotCQluYW1lc1tJZHMuSURfQ0hJX0xdID0gQ0hJX0w7Ci0JCW5hbWVzW0lkcy5JRF9DSElfVV0gPSBDSElfVTsKLQkJbmFtZXNbSWRzLklEX0NJUkNdID0gQ0lSQzsKLQkJbmFtZXNbSWRzLklEX0NMVUJTXSA9IENMVUJTOwotCQluYW1lc1tJZHMuSURfQ09OR10gPSBDT05HOwotCQluYW1lc1tJZHMuSURfQ09QWV0gPSBDT1BZOwotCQluYW1lc1tJZHMuSURfQ1JBUlJdID0gQ1JBUlI7Ci0JCW5hbWVzW0lkcy5JRF9DVVBdID0gQ1VQOwotCQluYW1lc1tJZHMuSURfQ1VSUkVOXSA9IENVUlJFTjsKLQkJbmFtZXNbSWRzLklEX0RBR0dFUl9MXSA9IERBR0dFUl9MOwotCQluYW1lc1tJZHMuSURfREFHR0VSX1VdID0gREFHR0VSX1U7Ci0JCW5hbWVzW0lkcy5JRF9EQVJSX0xdID0gREFSUl9MOwotCQluYW1lc1tJZHMuSURfREFSUl9VXSA9IERBUlJfVTsKLQkJbmFtZXNbSWRzLklEX0RFR10gPSBERUc7Ci0JCW5hbWVzW0lkcy5JRF9ERUxUQV9MXSA9IERFTFRBX0w7Ci0JCW5hbWVzW0lkcy5JRF9ERUxUQV9VXSA9IERFTFRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9ESUFNU10gPSBESUFNUzsKLQkJbmFtZXNbSWRzLklEX0RJVklERV0gPSBESVZJREU7Ci0JCW5hbWVzW0lkcy5JRF9FQUNVVEVfTF0gPSBFQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX0VBQ1VURV9VXSA9IEVBQ1VURV9VOwotCQluYW1lc1tJZHMuSURfRUNJUkNfTF0gPSBFQ0lSQ19MOwotCQluYW1lc1tJZHMuSURfRUNJUkNfVV0gPSBFQ0lSQ19VOwotCQluYW1lc1tJZHMuSURfRUdSQVZFX0xdID0gRUdSQVZFX0w7Ci0JCW5hbWVzW0lkcy5JRF9FR1JBVkVfVV0gPSBFR1JBVkVfVTsKLQkJbmFtZXNbSWRzLklEX0VNUFRZXSA9IEVNUFRZOwotCQluYW1lc1tJZHMuSURfRU1TUF0gPSBFTVNQOwotCQluYW1lc1tJZHMuSURfRU5TUF0gPSBFTlNQOwotCQluYW1lc1tJZHMuSURfRVBTSUxPTl9MXSA9IEVQU0lMT05fTDsKLQkJbmFtZXNbSWRzLklEX0VQU0lMT05fVV0gPSBFUFNJTE9OX1U7Ci0JCW5hbWVzW0lkcy5JRF9FUVVJVl0gPSBFUVVJVjsKLQkJbmFtZXNbSWRzLklEX0VUQV9MXSA9IEVUQV9MOwotCQluYW1lc1tJZHMuSURfRVRBX1VdID0gRVRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9FVEhfTF0gPSBFVEhfTDsKLQkJbmFtZXNbSWRzLklEX0VUSF9VXSA9IEVUSF9VOwotCQluYW1lc1tJZHMuSURfRVVNTF9MXSA9IEVVTUxfTDsKLQkJbmFtZXNbSWRzLklEX0VVTUxfVV0gPSBFVU1MX1U7Ci0JCW5hbWVzW0lkcy5JRF9FVVJPXSA9IEVVUk87Ci0JCW5hbWVzW0lkcy5JRF9FWElTVF0gPSBFWElTVDsKLQkJbmFtZXNbSWRzLklEX0ZOT0ZdID0gRk5PRjsKLQkJbmFtZXNbSWRzLklEX0ZPUkFMTF0gPSBGT1JBTEw7Ci0JCW5hbWVzW0lkcy5JRF9GUkFDMTJdID0gRlJBQzEyOwotCQluYW1lc1tJZHMuSURfRlJBQzE0XSA9IEZSQUMxNDsKLQkJbmFtZXNbSWRzLklEX0ZSQUMzNF0gPSBGUkFDMzQ7Ci0JCW5hbWVzW0lkcy5JRF9GUkFTTF0gPSBGUkFTTDsKLQkJbmFtZXNbSWRzLklEX0dBTU1BX0xdID0gR0FNTUFfTDsKLQkJbmFtZXNbSWRzLklEX0dBTU1BX1VdID0gR0FNTUFfVTsKLQkJbmFtZXNbSWRzLklEX0dFXSA9IEdFOwotCQluYW1lc1tJZHMuSURfR1RdID0gR1Q7Ci0JCW5hbWVzW0lkcy5JRF9IQVJSX0xdID0gSEFSUl9MOwotCQluYW1lc1tJZHMuSURfSEFSUl9VXSA9IEhBUlJfVTsKLQkJbmFtZXNbSWRzLklEX0hFQVJUU10gPSBIRUFSVFM7Ci0JCW5hbWVzW0lkcy5JRF9IRUxMSVBdID0gSEVMTElQOwotCQluYW1lc1tJZHMuSURfSUFDVVRFX0xdID0gSUFDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9JQUNVVEVfVV0gPSBJQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX0lDSVJDX0xdID0gSUNJUkNfTDsKLQkJbmFtZXNbSWRzLklEX0lDSVJDX1VdID0gSUNJUkNfVTsKLQkJbmFtZXNbSWRzLklEX0lFWENMXSA9IElFWENMOwotCQluYW1lc1tJZHMuSURfSUdSQVZFX0xdID0gSUdSQVZFX0w7Ci0JCW5hbWVzW0lkcy5JRF9JR1JBVkVfVV0gPSBJR1JBVkVfVTsKLQkJbmFtZXNbSWRzLklEX0lNQUdFXSA9IElNQUdFOwotCQluYW1lc1tJZHMuSURfSU5GSU5dID0gSU5GSU47Ci0JCW5hbWVzW0lkcy5JRF9JTlRdID0gSU5UOwotCQluYW1lc1tJZHMuSURfSU9UQV9MXSA9IElPVEFfTDsKLQkJbmFtZXNbSWRzLklEX0lPVEFfVV0gPSBJT1RBX1U7Ci0JCW5hbWVzW0lkcy5JRF9JUVVFU1RdID0gSVFVRVNUOwotCQluYW1lc1tJZHMuSURfSVNJTl0gPSBJU0lOOwotCQluYW1lc1tJZHMuSURfSVVNTF9MXSA9IElVTUxfTDsKLQkJbmFtZXNbSWRzLklEX0lVTUxfVV0gPSBJVU1MX1U7Ci0JCW5hbWVzW0lkcy5JRF9LQVBQQV9MXSA9IEtBUFBBX0w7Ci0JCW5hbWVzW0lkcy5JRF9LQVBQQV9VXSA9IEtBUFBBX1U7Ci0JCW5hbWVzW0lkcy5JRF9MQU1CREFfTF0gPSBMQU1CREFfTDsKLQkJbmFtZXNbSWRzLklEX0xBTUJEQV9VXSA9IExBTUJEQV9VOwotCQluYW1lc1tJZHMuSURfTEFOR10gPSBMQU5HOwotCQluYW1lc1tJZHMuSURfTEFRVU9dID0gTEFRVU87Ci0JCW5hbWVzW0lkcy5JRF9MQVJSX0xdID0gTEFSUl9MOwotCQluYW1lc1tJZHMuSURfTEFSUl9VXSA9IExBUlJfVTsKLQkJbmFtZXNbSWRzLklEX0xDRUlMXSA9IExDRUlMOwotCQluYW1lc1tJZHMuSURfTERRVU9dID0gTERRVU87Ci0JCW5hbWVzW0lkcy5JRF9MRV0gPSBMRTsKLQkJbmFtZXNbSWRzLklEX0xGTE9PUl0gPSBMRkxPT1I7Ci0JCW5hbWVzW0lkcy5JRF9MT1dBU1RdID0gTE9XQVNUOwotCQluYW1lc1tJZHMuSURfTE9aXSA9IExPWjsKLQkJbmFtZXNbSWRzLklEX0xSTV0gPSBMUk07Ci0JCW5hbWVzW0lkcy5JRF9MU0FRVU9dID0gTFNBUVVPOwotCQluYW1lc1tJZHMuSURfTFNRVU9dID0gTFNRVU87Ci0JCW5hbWVzW0lkcy5JRF9MVF0gPSBMVDsKLQkJbmFtZXNbSWRzLklEX01BQ1JdID0gTUFDUjsKLQkJbmFtZXNbSWRzLklEX01EQVNIXSA9IE1EQVNIOwotCQluYW1lc1tJZHMuSURfTUlDUk9dID0gTUlDUk87Ci0JCW5hbWVzW0lkcy5JRF9NSURET1RdID0gTUlERE9UOwotCQluYW1lc1tJZHMuSURfTUlOVVNdID0gTUlOVVM7Ci0JCW5hbWVzW0lkcy5JRF9NVV9MXSA9IE1VX0w7Ci0JCW5hbWVzW0lkcy5JRF9NVV9VXSA9IE1VX1U7Ci0JCW5hbWVzW0lkcy5JRF9OQUJMQV0gPSBOQUJMQTsKLQkJbmFtZXNbSWRzLklEX05CU1BdID0gTkJTUDsKLQkJbmFtZXNbSWRzLklEX05EQVNIXSA9IE5EQVNIOwotCQluYW1lc1tJZHMuSURfTkVdID0gTkU7Ci0JCW5hbWVzW0lkcy5JRF9OSV0gPSBOSTsKLQkJbmFtZXNbSWRzLklEX05PVF0gPSBOT1Q7Ci0JCW5hbWVzW0lkcy5JRF9OT1RJTl0gPSBOT1RJTjsKLQkJbmFtZXNbSWRzLklEX05TVUJdID0gTlNVQjsKLQkJbmFtZXNbSWRzLklEX05USUxERV9MXSA9IE5USUxERV9MOwotCQluYW1lc1tJZHMuSURfTlRJTERFX1VdID0gTlRJTERFX1U7Ci0JCW5hbWVzW0lkcy5JRF9OVV9MXSA9IE5VX0w7Ci0JCW5hbWVzW0lkcy5JRF9OVV9VXSA9IE5VX1U7Ci0JCW5hbWVzW0lkcy5JRF9PQUNVVEVfTF0gPSBPQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX09BQ1VURV9VXSA9IE9BQ1VURV9VOwotCQluYW1lc1tJZHMuSURfT0NJUkNfTF0gPSBPQ0lSQ19MOwotCQluYW1lc1tJZHMuSURfT0NJUkNfVV0gPSBPQ0lSQ19VOwotCQluYW1lc1tJZHMuSURfT0VMSUdfTF0gPSBPRUxJR19MOwotCQluYW1lc1tJZHMuSURfT0VMSUdfVV0gPSBPRUxJR19VOwotCQluYW1lc1tJZHMuSURfT0dSQVZFX0xdID0gT0dSQVZFX0w7Ci0JCW5hbWVzW0lkcy5JRF9PR1JBVkVfVV0gPSBPR1JBVkVfVTsKLQkJbmFtZXNbSWRzLklEX09MSU5FXSA9IE9MSU5FOwotCQluYW1lc1tJZHMuSURfT01FR0FfTF0gPSBPTUVHQV9MOwotCQluYW1lc1tJZHMuSURfT01FR0FfVV0gPSBPTUVHQV9VOwotCQluYW1lc1tJZHMuSURfT01JQ1JPTl9MXSA9IE9NSUNST05fTDsKLQkJbmFtZXNbSWRzLklEX09NSUNST05fVV0gPSBPTUlDUk9OX1U7Ci0JCW5hbWVzW0lkcy5JRF9PUExVU10gPSBPUExVUzsKLQkJbmFtZXNbSWRzLklEX09SXSA9IE9SOwotCQluYW1lc1tJZHMuSURfT1JERl0gPSBPUkRGOwotCQluYW1lc1tJZHMuSURfT1JETV0gPSBPUkRNOwotCQluYW1lc1tJZHMuSURfT1NMQVNIX0xdID0gT1NMQVNIX0w7Ci0JCW5hbWVzW0lkcy5JRF9PU0xBU0hfVV0gPSBPU0xBU0hfVTsKLQkJbmFtZXNbSWRzLklEX09USUxERV9MXSA9IE9USUxERV9MOwotCQluYW1lc1tJZHMuSURfT1RJTERFX1VdID0gT1RJTERFX1U7Ci0JCW5hbWVzW0lkcy5JRF9PVElNRVNdID0gT1RJTUVTOwotCQluYW1lc1tJZHMuSURfT1VNTF9MXSA9IE9VTUxfTDsKLQkJbmFtZXNbSWRzLklEX09VTUxfVV0gPSBPVU1MX1U7Ci0JCW5hbWVzW0lkcy5JRF9QQVJBXSA9IFBBUkE7Ci0JCW5hbWVzW0lkcy5JRF9QQVJUXSA9IFBBUlQ7Ci0JCW5hbWVzW0lkcy5JRF9QRVJNSUxdID0gUEVSTUlMOwotCQluYW1lc1tJZHMuSURfUEVSUF0gPSBQRVJQOwotCQluYW1lc1tJZHMuSURfUEhJX0xdID0gUEhJX0w7Ci0JCW5hbWVzW0lkcy5JRF9QSElfVV0gPSBQSElfVTsKLQkJbmFtZXNbSWRzLklEX1BJVl0gPSBQSVY7Ci0JCW5hbWVzW0lkcy5JRF9QSV9MXSA9IFBJX0w7Ci0JCW5hbWVzW0lkcy5JRF9QSV9VXSA9IFBJX1U7Ci0JCW5hbWVzW0lkcy5JRF9QTFVTTU5dID0gUExVU01OOwotCQluYW1lc1tJZHMuSURfUE9VTkRdID0gUE9VTkQ7Ci0JCW5hbWVzW0lkcy5JRF9QUklNRV9MXSA9IFBSSU1FX0w7Ci0JCW5hbWVzW0lkcy5JRF9QUklNRV9VXSA9IFBSSU1FX1U7Ci0JCW5hbWVzW0lkcy5JRF9QUk9EXSA9IFBST0Q7Ci0JCW5hbWVzW0lkcy5JRF9QUk9QXSA9IFBST1A7Ci0JCW5hbWVzW0lkcy5JRF9QU0lfTF0gPSBQU0lfTDsKLQkJbmFtZXNbSWRzLklEX1BTSV9VXSA9IFBTSV9VOwotCQluYW1lc1tJZHMuSURfUVVPVF0gPSBRVU9UOwotCQluYW1lc1tJZHMuSURfUkFESUNdID0gUkFESUM7Ci0JCW5hbWVzW0lkcy5JRF9SQU5HXSA9IFJBTkc7Ci0JCW5hbWVzW0lkcy5JRF9SQVFVT10gPSBSQVFVTzsKLQkJbmFtZXNbSWRzLklEX1JBUlJfTF0gPSBSQVJSX0w7Ci0JCW5hbWVzW0lkcy5JRF9SQVJSX1VdID0gUkFSUl9VOwotCQluYW1lc1tJZHMuSURfUkNFSUxdID0gUkNFSUw7Ci0JCW5hbWVzW0lkcy5JRF9SRFFVT10gPSBSRFFVTzsKLQkJbmFtZXNbSWRzLklEX1JFQUxdID0gUkVBTDsKLQkJbmFtZXNbSWRzLklEX1JFR10gPSBSRUc7Ci0JCW5hbWVzW0lkcy5JRF9SRkxPT1JdID0gUkZMT09SOwotCQluYW1lc1tJZHMuSURfUkhPX0xdID0gUkhPX0w7Ci0JCW5hbWVzW0lkcy5JRF9SSE9fVV0gPSBSSE9fVTsKLQkJbmFtZXNbSWRzLklEX1JMTV0gPSBSTE07Ci0JCW5hbWVzW0lkcy5JRF9SU0FRVU9dID0gUlNBUVVPOwotCQluYW1lc1tJZHMuSURfUlNRVU9dID0gUlNRVU87Ci0JCW5hbWVzW0lkcy5JRF9TQlFVT10gPSBTQlFVTzsKLQkJbmFtZXNbSWRzLklEX1NDQVJPTl9MXSA9IFNDQVJPTl9MOwotCQluYW1lc1tJZHMuSURfU0NBUk9OX1VdID0gU0NBUk9OX1U7Ci0JCW5hbWVzW0lkcy5JRF9TRE9UXSA9IFNET1Q7Ci0JCW5hbWVzW0lkcy5JRF9TRUNUXSA9IFNFQ1Q7Ci0JCW5hbWVzW0lkcy5JRF9TSFldID0gU0hZOwotCQluYW1lc1tJZHMuSURfU0lHTUFGXSA9IFNJR01BRjsKLQkJbmFtZXNbSWRzLklEX1NJR01BX0xdID0gU0lHTUFfTDsKLQkJbmFtZXNbSWRzLklEX1NJR01BX1VdID0gU0lHTUFfVTsKLQkJbmFtZXNbSWRzLklEX1NJTV0gPSBTSU07Ci0JCW5hbWVzW0lkcy5JRF9TUEFERVNdID0gU1BBREVTOwotCQluYW1lc1tJZHMuSURfU1VCXSA9IFNVQjsKLQkJbmFtZXNbSWRzLklEX1NVQkVdID0gU1VCRTsKLQkJbmFtZXNbSWRzLklEX1NVTV0gPSBTVU07Ci0JCW5hbWVzW0lkcy5JRF9TVVBdID0gU1VQOwotCQluYW1lc1tJZHMuSURfU1VQMV0gPSBTVVAxOwotCQluYW1lc1tJZHMuSURfU1VQMl0gPSBTVVAyOwotCQluYW1lc1tJZHMuSURfU1VQM10gPSBTVVAzOwotCQluYW1lc1tJZHMuSURfU1VQRV0gPSBTVVBFOwotCQluYW1lc1tJZHMuSURfU1pMSUddID0gU1pMSUc7Ci0JCW5hbWVzW0lkcy5JRF9UQVVfTF0gPSBUQVVfTDsKLQkJbmFtZXNbSWRzLklEX1RBVV9VXSA9IFRBVV9VOwotCQluYW1lc1tJZHMuSURfVEhFUkU0XSA9IFRIRVJFNDsKLQkJbmFtZXNbSWRzLklEX1RIRVRBU1lNXSA9IFRIRVRBU1lNOwotCQluYW1lc1tJZHMuSURfVEhFVEFfTF0gPSBUSEVUQV9MOwotCQluYW1lc1tJZHMuSURfVEhFVEFfVV0gPSBUSEVUQV9VOwotCQluYW1lc1tJZHMuSURfVEhJTlNQXSA9IFRISU5TUDsKLQkJbmFtZXNbSWRzLklEX1RIT1JOX0xdID0gVEhPUk5fTDsKLQkJbmFtZXNbSWRzLklEX1RIT1JOX1VdID0gVEhPUk5fVTsKLQkJbmFtZXNbSWRzLklEX1RJTERFXSA9IFRJTERFOwotCQluYW1lc1tJZHMuSURfVElNRVNdID0gVElNRVM7Ci0JCW5hbWVzW0lkcy5JRF9UUkFERV0gPSBUUkFERTsKLQkJbmFtZXNbSWRzLklEX1VBQ1VURV9MXSA9IFVBQ1VURV9MOwotCQluYW1lc1tJZHMuSURfVUFDVVRFX1VdID0gVUFDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9VQVJSX0xdID0gVUFSUl9MOwotCQluYW1lc1tJZHMuSURfVUFSUl9VXSA9IFVBUlJfVTsKLQkJbmFtZXNbSWRzLklEX1VDSVJDX0xdID0gVUNJUkNfTDsKLQkJbmFtZXNbSWRzLklEX1VDSVJDX1VdID0gVUNJUkNfVTsKLQkJbmFtZXNbSWRzLklEX1VHUkFWRV9MXSA9IFVHUkFWRV9MOwotCQluYW1lc1tJZHMuSURfVUdSQVZFX1VdID0gVUdSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9VTUxdID0gVU1MOwotCQluYW1lc1tJZHMuSURfVVBTSUhdID0gVVBTSUg7Ci0JCW5hbWVzW0lkcy5JRF9VUFNJTE9OX0xdID0gVVBTSUxPTl9MOwotCQluYW1lc1tJZHMuSURfVVBTSUxPTl9VXSA9IFVQU0lMT05fVTsKLQkJbmFtZXNbSWRzLklEX1VVTUxfTF0gPSBVVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9VVU1MX1VdID0gVVVNTF9VOwotCQluYW1lc1tJZHMuSURfV0VJRVJQXSA9IFdFSUVSUDsKLQkJbmFtZXNbSWRzLklEX1hJX0xdID0gWElfTDsKLQkJbmFtZXNbSWRzLklEX1hJX1VdID0gWElfVTsKLQkJbmFtZXNbSWRzLklEX1lBQ1VURV9MXSA9IFlBQ1VURV9MOwotCQluYW1lc1tJZHMuSURfWUFDVVRFX1VdID0gWUFDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9ZRU5dID0gWUVOOwotCQluYW1lc1tJZHMuSURfWVVNTF9MXSA9IFlVTUxfTDsKLQkJbmFtZXNbSWRzLklEX1lVTUxfVV0gPSBZVU1MX1U7Ci0JCW5hbWVzW0lkcy5JRF9aRVRBX0xdID0gWkVUQV9MOwotCQluYW1lc1tJZHMuSURfWkVUQV9VXSA9IFpFVEFfVTsKLQkJbmFtZXNbSWRzLklEX1pXSl0gPSBaV0o7Ci0JCW5hbWVzW0lkcy5JRF9aV05KXSA9IFpXTko7Ci0JfQotCXByaXZhdGUgc3RhdGljIGNoYXJbXSB2YWx1ZXMgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJdmFsdWVzID0gbmV3IGNoYXJbSWRzLmdldE51bU9mSWRzKCldOwotCQl2YWx1ZXNbSWRzLklEX0FBQ1VURV9MXSA9IDIyNTsKLQkJdmFsdWVzW0lkcy5JRF9BQUNVVEVfVV0gPSAxOTM7Ci0JCXZhbHVlc1tJZHMuSURfQUNJUkNfTF0gPSAyMjY7Ci0JCXZhbHVlc1tJZHMuSURfQUNJUkNfVV0gPSAxOTQ7Ci0JCXZhbHVlc1tJZHMuSURfQUNVVEVdID0gMTgwOwotCQl2YWx1ZXNbSWRzLklEX0FFTElHX0xdID0gMjMwOwotCQl2YWx1ZXNbSWRzLklEX0FFTElHX1VdID0gMTk4OwotCQl2YWx1ZXNbSWRzLklEX0FHUkFWRV9MXSA9IDIyNDsKLQkJdmFsdWVzW0lkcy5JRF9BR1JBVkVfVV0gPSAxOTI7Ci0JCXZhbHVlc1tJZHMuSURfQUxFRlNZTV0gPSA4NTAxOwotCQl2YWx1ZXNbSWRzLklEX0FMUEhBX0xdID0gOTQ1OwotCQl2YWx1ZXNbSWRzLklEX0FMUEhBX1VdID0gOTEzOwotCQl2YWx1ZXNbSWRzLklEX0FNUF0gPSAzODsKLQkJdmFsdWVzW0lkcy5JRF9BTkRdID0gODc0MzsKLQkJdmFsdWVzW0lkcy5JRF9BTkddID0gODczNjsKLQkJdmFsdWVzW0lkcy5JRF9BUklOR19MXSA9IDIyOTsKLQkJdmFsdWVzW0lkcy5JRF9BUklOR19VXSA9IDE5NzsKLQkJdmFsdWVzW0lkcy5JRF9BU1lNUF0gPSA4Nzc2OwotCQl2YWx1ZXNbSWRzLklEX0FUSUxERV9MXSA9IDIyNzsKLQkJdmFsdWVzW0lkcy5JRF9BVElMREVfVV0gPSAxOTU7Ci0JCXZhbHVlc1tJZHMuSURfQVVNTF9MXSA9IDIyODsKLQkJdmFsdWVzW0lkcy5JRF9BVU1MX1VdID0gMTk2OwotCQl2YWx1ZXNbSWRzLklEX0JEUVVPXSA9IDgyMjI7Ci0JCXZhbHVlc1tJZHMuSURfQkVUQV9MXSA9IDk0NjsKLQkJdmFsdWVzW0lkcy5JRF9CRVRBX1VdID0gOTE0OwotCQl2YWx1ZXNbSWRzLklEX0JSVkJBUl0gPSAxNjY7Ci0JCXZhbHVlc1tJZHMuSURfQlVMTF0gPSA4MjI2OwotCQl2YWx1ZXNbSWRzLklEX0NBUF0gPSA4NzQ1OwotCQl2YWx1ZXNbSWRzLklEX0NDRURJTF9MXSA9IDIzMTsKLQkJdmFsdWVzW0lkcy5JRF9DQ0VESUxfVV0gPSAxOTk7Ci0JCXZhbHVlc1tJZHMuSURfQ0VESUxdID0gMTg0OwotCQl2YWx1ZXNbSWRzLklEX0NFTlRdID0gMTYyOwotCQl2YWx1ZXNbSWRzLklEX0NISV9MXSA9IDk2NzsKLQkJdmFsdWVzW0lkcy5JRF9DSElfVV0gPSA5MzU7Ci0JCXZhbHVlc1tJZHMuSURfQ0lSQ10gPSA3MTA7Ci0JCXZhbHVlc1tJZHMuSURfQ0xVQlNdID0gOTgyNzsKLQkJdmFsdWVzW0lkcy5JRF9DT05HXSA9IDg3NzM7Ci0JCXZhbHVlc1tJZHMuSURfQ09QWV0gPSAxNjk7Ci0JCXZhbHVlc1tJZHMuSURfQ1JBUlJdID0gODYyOTsKLQkJdmFsdWVzW0lkcy5JRF9DVVBdID0gODc0NjsKLQkJdmFsdWVzW0lkcy5JRF9DVVJSRU5dID0gMTY0OwotCQl2YWx1ZXNbSWRzLklEX0RBR0dFUl9MXSA9IDgyMjQ7Ci0JCXZhbHVlc1tJZHMuSURfREFHR0VSX1VdID0gODIyNTsKLQkJdmFsdWVzW0lkcy5JRF9EQVJSX0xdID0gODU5NTsKLQkJdmFsdWVzW0lkcy5JRF9EQVJSX1VdID0gODY1OTsKLQkJdmFsdWVzW0lkcy5JRF9ERUddID0gMTc2OwotCQl2YWx1ZXNbSWRzLklEX0RFTFRBX0xdID0gOTQ4OwotCQl2YWx1ZXNbSWRzLklEX0RFTFRBX1VdID0gOTE2OwotCQl2YWx1ZXNbSWRzLklEX0RJQU1TXSA9IDk4MzA7Ci0JCXZhbHVlc1tJZHMuSURfRElWSURFXSA9IDI0NzsKLQkJdmFsdWVzW0lkcy5JRF9FQUNVVEVfTF0gPSAyMzM7Ci0JCXZhbHVlc1tJZHMuSURfRUFDVVRFX1VdID0gMjAxOwotCQl2YWx1ZXNbSWRzLklEX0VDSVJDX0xdID0gMjM0OwotCQl2YWx1ZXNbSWRzLklEX0VDSVJDX1VdID0gMjAyOwotCQl2YWx1ZXNbSWRzLklEX0VHUkFWRV9MXSA9IDIzMjsKLQkJdmFsdWVzW0lkcy5JRF9FR1JBVkVfVV0gPSAyMDA7Ci0JCXZhbHVlc1tJZHMuSURfRU1QVFldID0gODcwOTsKLQkJdmFsdWVzW0lkcy5JRF9FTVNQXSA9IDgxOTU7Ci0JCXZhbHVlc1tJZHMuSURfRU5TUF0gPSA4MTk0OwotCQl2YWx1ZXNbSWRzLklEX0VQU0lMT05fTF0gPSA5NDk7Ci0JCXZhbHVlc1tJZHMuSURfRVBTSUxPTl9VXSA9IDkxNzsKLQkJdmFsdWVzW0lkcy5JRF9FUVVJVl0gPSA4ODAxOwotCQl2YWx1ZXNbSWRzLklEX0VUQV9MXSA9IDk1MTsKLQkJdmFsdWVzW0lkcy5JRF9FVEFfVV0gPSA5MTk7Ci0JCXZhbHVlc1tJZHMuSURfRVRIX0xdID0gMjQwOwotCQl2YWx1ZXNbSWRzLklEX0VUSF9VXSA9IDIwODsKLQkJdmFsdWVzW0lkcy5JRF9FVU1MX0xdID0gMjM1OwotCQl2YWx1ZXNbSWRzLklEX0VVTUxfVV0gPSAyMDM7Ci0JCXZhbHVlc1tJZHMuSURfRVVST10gPSA4MzY0OwotCQl2YWx1ZXNbSWRzLklEX0VYSVNUXSA9IDg3MDc7Ci0JCXZhbHVlc1tJZHMuSURfRk5PRl0gPSA0MDI7Ci0JCXZhbHVlc1tJZHMuSURfRk9SQUxMXSA9IDg3MDQ7Ci0JCXZhbHVlc1tJZHMuSURfRlJBQzEyXSA9IDE4OTsKLQkJdmFsdWVzW0lkcy5JRF9GUkFDMTRdID0gMTg4OwotCQl2YWx1ZXNbSWRzLklEX0ZSQUMzNF0gPSAxOTA7Ci0JCXZhbHVlc1tJZHMuSURfRlJBU0xdID0gODI2MDsKLQkJdmFsdWVzW0lkcy5JRF9HQU1NQV9MXSA9IDk0NzsKLQkJdmFsdWVzW0lkcy5JRF9HQU1NQV9VXSA9IDkxNTsKLQkJdmFsdWVzW0lkcy5JRF9HRV0gPSA4ODA1OwotCQl2YWx1ZXNbSWRzLklEX0dUXSA9IDYyOwotCQl2YWx1ZXNbSWRzLklEX0hBUlJfTF0gPSA4NTk2OwotCQl2YWx1ZXNbSWRzLklEX0hBUlJfVV0gPSA4NjYwOwotCQl2YWx1ZXNbSWRzLklEX0hFQVJUU10gPSA5ODI5OwotCQl2YWx1ZXNbSWRzLklEX0hFTExJUF0gPSA4MjMwOwotCQl2YWx1ZXNbSWRzLklEX0lBQ1VURV9MXSA9IDIzNzsKLQkJdmFsdWVzW0lkcy5JRF9JQUNVVEVfVV0gPSAyMDU7Ci0JCXZhbHVlc1tJZHMuSURfSUNJUkNfTF0gPSAyMzg7Ci0JCXZhbHVlc1tJZHMuSURfSUNJUkNfVV0gPSAyMDY7Ci0JCXZhbHVlc1tJZHMuSURfSUVYQ0xdID0gMTYxOwotCQl2YWx1ZXNbSWRzLklEX0lHUkFWRV9MXSA9IDIzNjsKLQkJdmFsdWVzW0lkcy5JRF9JR1JBVkVfVV0gPSAyMDQ7Ci0JCXZhbHVlc1tJZHMuSURfSU1BR0VdID0gODQ2NTsKLQkJdmFsdWVzW0lkcy5JRF9JTkZJTl0gPSA4NzM0OwotCQl2YWx1ZXNbSWRzLklEX0lOVF0gPSA4NzQ3OwotCQl2YWx1ZXNbSWRzLklEX0lPVEFfTF0gPSA5NTM7Ci0JCXZhbHVlc1tJZHMuSURfSU9UQV9VXSA9IDkyMTsKLQkJdmFsdWVzW0lkcy5JRF9JUVVFU1RdID0gMTkxOwotCQl2YWx1ZXNbSWRzLklEX0lTSU5dID0gODcxMjsKLQkJdmFsdWVzW0lkcy5JRF9JVU1MX0xdID0gMjM5OwotCQl2YWx1ZXNbSWRzLklEX0lVTUxfVV0gPSAyMDc7Ci0JCXZhbHVlc1tJZHMuSURfS0FQUEFfTF0gPSA5NTQ7Ci0JCXZhbHVlc1tJZHMuSURfS0FQUEFfVV0gPSA5MjI7Ci0JCXZhbHVlc1tJZHMuSURfTEFNQkRBX0xdID0gOTU1OwotCQl2YWx1ZXNbSWRzLklEX0xBTUJEQV9VXSA9IDkyMzsKLQkJdmFsdWVzW0lkcy5JRF9MQU5HXSA9IDkwMDE7Ci0JCXZhbHVlc1tJZHMuSURfTEFRVU9dID0gMTcxOwotCQl2YWx1ZXNbSWRzLklEX0xBUlJfTF0gPSA4NTkyOwotCQl2YWx1ZXNbSWRzLklEX0xBUlJfVV0gPSA4NjU2OwotCQl2YWx1ZXNbSWRzLklEX0xDRUlMXSA9IDg5Njg7Ci0JCXZhbHVlc1tJZHMuSURfTERRVU9dID0gODIyMDsKLQkJdmFsdWVzW0lkcy5JRF9MRV0gPSA4ODA0OwotCQl2YWx1ZXNbSWRzLklEX0xGTE9PUl0gPSA4OTcwOwotCQl2YWx1ZXNbSWRzLklEX0xPV0FTVF0gPSA4NzI3OwotCQl2YWx1ZXNbSWRzLklEX0xPWl0gPSA5Njc0OwotCQl2YWx1ZXNbSWRzLklEX0xSTV0gPSA4MjA2OwotCQl2YWx1ZXNbSWRzLklEX0xTQVFVT10gPSA4MjQ5OwotCQl2YWx1ZXNbSWRzLklEX0xTUVVPXSA9IDgyMTY7Ci0JCXZhbHVlc1tJZHMuSURfTFRdID0gNjA7Ci0JCXZhbHVlc1tJZHMuSURfTUFDUl0gPSAxNzU7Ci0JCXZhbHVlc1tJZHMuSURfTURBU0hdID0gODIxMjsKLQkJdmFsdWVzW0lkcy5JRF9NSUNST10gPSAxODE7Ci0JCXZhbHVlc1tJZHMuSURfTUlERE9UXSA9IDE4MzsKLQkJdmFsdWVzW0lkcy5JRF9NSU5VU10gPSA4NzIyOwotCQl2YWx1ZXNbSWRzLklEX01VX0xdID0gOTU2OwotCQl2YWx1ZXNbSWRzLklEX01VX1VdID0gOTI0OwotCQl2YWx1ZXNbSWRzLklEX05BQkxBXSA9IDg3MTE7Ci0JCXZhbHVlc1tJZHMuSURfTkJTUF0gPSAxNjA7Ci0JCXZhbHVlc1tJZHMuSURfTkRBU0hdID0gODIxMTsKLQkJdmFsdWVzW0lkcy5JRF9ORV0gPSA4ODAwOwotCQl2YWx1ZXNbSWRzLklEX05JXSA9IDg3MTU7Ci0JCXZhbHVlc1tJZHMuSURfTk9UXSA9IDE3MjsKLQkJdmFsdWVzW0lkcy5JRF9OT1RJTl0gPSA4NzEzOwotCQl2YWx1ZXNbSWRzLklEX05TVUJdID0gODgzNjsKLQkJdmFsdWVzW0lkcy5JRF9OVElMREVfTF0gPSAyNDE7Ci0JCXZhbHVlc1tJZHMuSURfTlRJTERFX1VdID0gMjA5OwotCQl2YWx1ZXNbSWRzLklEX05VX0xdID0gOTU3OwotCQl2YWx1ZXNbSWRzLklEX05VX1VdID0gOTI1OwotCQl2YWx1ZXNbSWRzLklEX09BQ1VURV9MXSA9IDI0MzsKLQkJdmFsdWVzW0lkcy5JRF9PQUNVVEVfVV0gPSAyMTE7Ci0JCXZhbHVlc1tJZHMuSURfT0NJUkNfTF0gPSAyNDQ7Ci0JCXZhbHVlc1tJZHMuSURfT0NJUkNfVV0gPSAyMTI7Ci0JCXZhbHVlc1tJZHMuSURfT0VMSUdfTF0gPSAzMzk7Ci0JCXZhbHVlc1tJZHMuSURfT0VMSUdfVV0gPSAzMzg7Ci0JCXZhbHVlc1tJZHMuSURfT0dSQVZFX0xdID0gMjQyOwotCQl2YWx1ZXNbSWRzLklEX09HUkFWRV9VXSA9IDIxMDsKLQkJdmFsdWVzW0lkcy5JRF9PTElORV0gPSA4MjU0OwotCQl2YWx1ZXNbSWRzLklEX09NRUdBX0xdID0gOTY5OwotCQl2YWx1ZXNbSWRzLklEX09NRUdBX1VdID0gOTM3OwotCQl2YWx1ZXNbSWRzLklEX09NSUNST05fTF0gPSA5NTk7Ci0JCXZhbHVlc1tJZHMuSURfT01JQ1JPTl9VXSA9IDkyNzsKLQkJdmFsdWVzW0lkcy5JRF9PUExVU10gPSA4ODUzOwotCQl2YWx1ZXNbSWRzLklEX09SXSA9IDg3NDQ7Ci0JCXZhbHVlc1tJZHMuSURfT1JERl0gPSAxNzA7Ci0JCXZhbHVlc1tJZHMuSURfT1JETV0gPSAxODY7Ci0JCXZhbHVlc1tJZHMuSURfT1NMQVNIX0xdID0gMjQ4OwotCQl2YWx1ZXNbSWRzLklEX09TTEFTSF9VXSA9IDIxNjsKLQkJdmFsdWVzW0lkcy5JRF9PVElMREVfTF0gPSAyNDU7Ci0JCXZhbHVlc1tJZHMuSURfT1RJTERFX1VdID0gMjEzOwotCQl2YWx1ZXNbSWRzLklEX09USU1FU10gPSA4ODU1OwotCQl2YWx1ZXNbSWRzLklEX09VTUxfTF0gPSAyNDY7Ci0JCXZhbHVlc1tJZHMuSURfT1VNTF9VXSA9IDIxNDsKLQkJdmFsdWVzW0lkcy5JRF9QQVJBXSA9IDE4MjsKLQkJdmFsdWVzW0lkcy5JRF9QQVJUXSA9IDg3MDY7Ci0JCXZhbHVlc1tJZHMuSURfUEVSTUlMXSA9IDgyNDA7Ci0JCXZhbHVlc1tJZHMuSURfUEVSUF0gPSA4ODY5OwotCQl2YWx1ZXNbSWRzLklEX1BISV9MXSA9IDk2NjsKLQkJdmFsdWVzW0lkcy5JRF9QSElfVV0gPSA5MzQ7Ci0JCXZhbHVlc1tJZHMuSURfUElWXSA9IDk4MjsKLQkJdmFsdWVzW0lkcy5JRF9QSV9MXSA9IDk2MDsKLQkJdmFsdWVzW0lkcy5JRF9QSV9VXSA9IDkyODsKLQkJdmFsdWVzW0lkcy5JRF9QTFVTTU5dID0gMTc3OwotCQl2YWx1ZXNbSWRzLklEX1BPVU5EXSA9IDE2MzsKLQkJdmFsdWVzW0lkcy5JRF9QUklNRV9MXSA9IDgyNDI7Ci0JCXZhbHVlc1tJZHMuSURfUFJJTUVfVV0gPSA4MjQzOwotCQl2YWx1ZXNbSWRzLklEX1BST0RdID0gODcxOTsKLQkJdmFsdWVzW0lkcy5JRF9QUk9QXSA9IDg3MzM7Ci0JCXZhbHVlc1tJZHMuSURfUFNJX0xdID0gOTY4OwotCQl2YWx1ZXNbSWRzLklEX1BTSV9VXSA9IDkzNjsKLQkJdmFsdWVzW0lkcy5JRF9RVU9UXSA9IDM0OwotCQl2YWx1ZXNbSWRzLklEX1JBRElDXSA9IDg3MzA7Ci0JCXZhbHVlc1tJZHMuSURfUkFOR10gPSA5MDAyOwotCQl2YWx1ZXNbSWRzLklEX1JBUVVPXSA9IDE4NzsKLQkJdmFsdWVzW0lkcy5JRF9SQVJSX0xdID0gODU5NDsKLQkJdmFsdWVzW0lkcy5JRF9SQVJSX1VdID0gODY1ODsKLQkJdmFsdWVzW0lkcy5JRF9SQ0VJTF0gPSA4OTY5OwotCQl2YWx1ZXNbSWRzLklEX1JEUVVPXSA9IDgyMjE7Ci0JCXZhbHVlc1tJZHMuSURfUkVBTF0gPSA4NDc2OwotCQl2YWx1ZXNbSWRzLklEX1JFR10gPSAxNzQ7Ci0JCXZhbHVlc1tJZHMuSURfUkZMT09SXSA9IDg5NzE7Ci0JCXZhbHVlc1tJZHMuSURfUkhPX0xdID0gOTYxOwotCQl2YWx1ZXNbSWRzLklEX1JIT19VXSA9IDkyOTsKLQkJdmFsdWVzW0lkcy5JRF9STE1dID0gODIwNzsKLQkJdmFsdWVzW0lkcy5JRF9SU0FRVU9dID0gODI1MDsKLQkJdmFsdWVzW0lkcy5JRF9SU1FVT10gPSA4MjE3OwotCQl2YWx1ZXNbSWRzLklEX1NCUVVPXSA9IDgyMTg7Ci0JCXZhbHVlc1tJZHMuSURfU0NBUk9OX0xdID0gMzUzOwotCQl2YWx1ZXNbSWRzLklEX1NDQVJPTl9VXSA9IDM1MjsKLQkJdmFsdWVzW0lkcy5JRF9TRE9UXSA9IDg5MDE7Ci0JCXZhbHVlc1tJZHMuSURfU0VDVF0gPSAxNjc7Ci0JCXZhbHVlc1tJZHMuSURfU0hZXSA9IDE3MzsKLQkJdmFsdWVzW0lkcy5JRF9TSUdNQUZdID0gOTYyOwotCQl2YWx1ZXNbSWRzLklEX1NJR01BX0xdID0gOTYzOwotCQl2YWx1ZXNbSWRzLklEX1NJR01BX1VdID0gOTMxOwotCQl2YWx1ZXNbSWRzLklEX1NJTV0gPSA4NzY0OwotCQl2YWx1ZXNbSWRzLklEX1NQQURFU10gPSA5ODI0OwotCQl2YWx1ZXNbSWRzLklEX1NVQl0gPSA4ODM0OwotCQl2YWx1ZXNbSWRzLklEX1NVQkVdID0gODgzODsKLQkJdmFsdWVzW0lkcy5JRF9TVU1dID0gODcyMTsKLQkJdmFsdWVzW0lkcy5JRF9TVVBdID0gODgzNTsKLQkJdmFsdWVzW0lkcy5JRF9TVVAxXSA9IDE4NTsKLQkJdmFsdWVzW0lkcy5JRF9TVVAyXSA9IDE3ODsKLQkJdmFsdWVzW0lkcy5JRF9TVVAzXSA9IDE3OTsKLQkJdmFsdWVzW0lkcy5JRF9TVVBFXSA9IDg4Mzk7Ci0JCXZhbHVlc1tJZHMuSURfU1pMSUddID0gMjIzOwotCQl2YWx1ZXNbSWRzLklEX1RBVV9MXSA9IDk2NDsKLQkJdmFsdWVzW0lkcy5JRF9UQVVfVV0gPSA5MzI7Ci0JCXZhbHVlc1tJZHMuSURfVEhFUkU0XSA9IDg3NTY7Ci0JCXZhbHVlc1tJZHMuSURfVEhFVEFTWU1dID0gOTc3OwotCQl2YWx1ZXNbSWRzLklEX1RIRVRBX0xdID0gOTUyOwotCQl2YWx1ZXNbSWRzLklEX1RIRVRBX1VdID0gOTIwOwotCQl2YWx1ZXNbSWRzLklEX1RISU5TUF0gPSA4MjAxOwotCQl2YWx1ZXNbSWRzLklEX1RIT1JOX0xdID0gMjU0OwotCQl2YWx1ZXNbSWRzLklEX1RIT1JOX1VdID0gMjIyOwotCQl2YWx1ZXNbSWRzLklEX1RJTERFXSA9IDczMjsKLQkJdmFsdWVzW0lkcy5JRF9USU1FU10gPSAyMTU7Ci0JCXZhbHVlc1tJZHMuSURfVFJBREVdID0gODQ4MjsKLQkJdmFsdWVzW0lkcy5JRF9VQUNVVEVfTF0gPSAyNTA7Ci0JCXZhbHVlc1tJZHMuSURfVUFDVVRFX1VdID0gMjE4OwotCQl2YWx1ZXNbSWRzLklEX1VBUlJfTF0gPSA4NTkzOwotCQl2YWx1ZXNbSWRzLklEX1VBUlJfVV0gPSA4NjU3OwotCQl2YWx1ZXNbSWRzLklEX1VDSVJDX0xdID0gMjUxOwotCQl2YWx1ZXNbSWRzLklEX1VDSVJDX1VdID0gMjE5OwotCQl2YWx1ZXNbSWRzLklEX1VHUkFWRV9MXSA9IDI0OTsKLQkJdmFsdWVzW0lkcy5JRF9VR1JBVkVfVV0gPSAyMTc7Ci0JCXZhbHVlc1tJZHMuSURfVU1MXSA9IDE2ODsKLQkJdmFsdWVzW0lkcy5JRF9VUFNJSF0gPSA5Nzg7Ci0JCXZhbHVlc1tJZHMuSURfVVBTSUxPTl9MXSA9IDk2NTsKLQkJdmFsdWVzW0lkcy5JRF9VUFNJTE9OX1VdID0gOTMzOwotCQl2YWx1ZXNbSWRzLklEX1VVTUxfTF0gPSAyNTI7Ci0JCXZhbHVlc1tJZHMuSURfVVVNTF9VXSA9IDIyMDsKLQkJdmFsdWVzW0lkcy5JRF9XRUlFUlBdID0gODQ3MjsKLQkJdmFsdWVzW0lkcy5JRF9YSV9MXSA9IDk1ODsKLQkJdmFsdWVzW0lkcy5JRF9YSV9VXSA9IDkyNjsKLQkJdmFsdWVzW0lkcy5JRF9ZQUNVVEVfTF0gPSAyNTM7Ci0JCXZhbHVlc1tJZHMuSURfWUFDVVRFX1VdID0gMjIxOwotCQl2YWx1ZXNbSWRzLklEX1lFTl0gPSAxNjU7Ci0JCXZhbHVlc1tJZHMuSURfWVVNTF9MXSA9IDI1NTsKLQkJdmFsdWVzW0lkcy5JRF9ZVU1MX1VdID0gMzc2OwotCQl2YWx1ZXNbSWRzLklEX1pFVEFfTF0gPSA5NTA7Ci0JCXZhbHVlc1tJZHMuSURfWkVUQV9VXSA9IDkxODsKLQkJdmFsdWVzW0lkcy5JRF9aV0pdID0gODIwNTsKLQkJdmFsdWVzW0lkcy5JRF9aV05KXSA9IDgyMDQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEVudGl0eUNvbGxlY3Rpb24oKSB7Ci0JCXN1cGVyKG5hbWVzLCBTVFJJQ1RfQ0FTRSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGVudGl0eSBkZWNsYXJhdGlvbi4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICogQHBhcmFtIGF0dHJOYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Ob2RlIGNyZWF0ZShTdHJpbmcgZW50aXR5TmFtZSkgewotCQlpbnQgaWQgPSBnZXRJRChlbnRpdHlOYW1lKTsKLQkJaWYgKGlkID09IElEX1VOS05PV04pCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgdmFsdWUgPSBTdHJpbmcudmFsdWVPZih2YWx1ZXNbaWRdKTsKLQkJSFRNTEVudGl0eURlY2xJbXBsIGRlYyA9IG5ldyBIVE1MRW50aXR5RGVjbEltcGwoZW50aXR5TmFtZSwgdmFsdWUpOwotCi0JCXJldHVybiBkZWM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IQ01Eb2NJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hDTURvY0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJhMjMzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hDTURvY0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQ01Eb2N1bWVudCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEhUTUwuCi0gKi8KLWNsYXNzIEhDTURvY0ltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgSFRNTENNRG9jdW1lbnQgewotCi0JLyoqIE5hbWVzcGFjZSBmb3IgYWxsIG5hbWVzIG9mIGVsZW1lbnRzLCBlbnRpdGllcyBhbmQgYXR0cmlidXRlcy4gKi8KLQlwcml2YXRlIENNTmFtZXNwYWNlSW1wbCBuYW1lc3BhY2UgPSBudWxsOwotCXByaXZhdGUgRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudHMgPSBudWxsOwotCXByaXZhdGUgRW50aXR5Q29sbGVjdGlvbiBlbnRpdGllcyA9IG51bGw7Ci0JcHJpdmF0ZSBBdHRyaWJ1dGVDb2xsZWN0aW9uIGF0dHJpYnV0ZXMgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIEhDTURvY0ltcGwoU3RyaW5nIGRvY1R5cGVOYW1lLCBDTU5hbWVzcGFjZUltcGwgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0JCXN1cGVyKGRvY1R5cGVOYW1lKTsKLQkJbmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotCQlhdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZUNvbGxlY3Rpb24oKTsKLQkJZWxlbWVudHMgPSBuZXcgRWxlbWVudENvbGxlY3Rpb24oYXR0cmlidXRlcyk7Ci0JCWVudGl0aWVzID0gbmV3IEVudGl0eUNvbGxlY3Rpb24oKTsKLQl9Ci0KLQlBdHRyaWJ1dGVDb2xsZWN0aW9uIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCXB1YmxpYyBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGdldEVsZW1lbnREZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChIVE1MRWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50cy5nZXROYW1lZEl0ZW0oZWxlbWVudE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50Ci0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCXJldHVybiBlbnRpdGllczsKLQl9Ci0KLQlwdWJsaWMgSFRNTEVudGl0eURlY2xhcmF0aW9uIGdldEVudGl0eURlY2xhcmF0aW9uKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCWlmIChlbnRpdGllcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSFRNTEVudGl0eURlY2xhcmF0aW9uKSBlbnRpdGllcy5nZXROYW1lZEl0ZW0oZW50aXR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ01Ob2RlCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5ET0NVTUVOVDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxBdHRyRGVjbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEF0dHJEZWNsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTkzOGUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEF0dHJEZWNsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBjbGFzcyBvZiB7QGxpbmsgPGNvZGU+SFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uPC9jb2RlPn0gaW50ZXJmYWNlLjxicj4KLSAqLwotY2xhc3MgSFRNTEF0dHJEZWNsSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gewotCi0JcHJpdmF0ZSBIVE1MQ01EYXRhVHlwZUltcGwgdHlwZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgdXNhZ2UgPSAwOwotCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxBdHRyRGVjbEltcGwoU3RyaW5nIGF0dHJOYW1lLCBIVE1MQ01EYXRhVHlwZUltcGwgdmFsdWVUeXBlLCBpbnQgdmFsdWVVc2FnZSkgewotCQlzdXBlcihhdHRyTmFtZSk7Ci0JCXRoaXMudHlwZSA9IHZhbHVlVHlwZTsKLQotCQlzd2l0Y2ggKHZhbHVlVXNhZ2UpIHsKLQkJCWNhc2UgT1BUSU9OQUwgOgotCQkJY2FzZSBSRVFVSVJFRCA6Ci0JCQljYXNlIEZJWEVEIDoKLQkJCWNhc2UgUFJPSElCSVRFRCA6Ci0JCQkJdGhpcy51c2FnZSA9IHZhbHVlVXNhZ2U7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQkvLyBzaG91bGQgd2Fybi4uLgotCQkJCXRoaXMudXNhZ2UgPSBPUFRJT05BTDsgLy8gZmFsbCBiYWNrCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJOYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIENNRGF0YVR5cGUKLQkgKi8KLQlwdWJsaWMgQ01EYXRhVHlwZSBnZXRBdHRyVHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgYnkgc3VwZXJpbnRlcmZhY2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJaWYgKHR5cGUuZ2V0SW1wbGllZFZhbHVlS2luZCgpICE9IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxUKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB0eXBlLmdldEltcGxpZWRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGJ5IHN1cGVyaW50ZXJmYWNlCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIGdldEVudW1BdHRyKCkgewotCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoQXJyYXlzLmFzTGlzdCh0eXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKSkpOwotCQlyZXR1cm4gdi5lbGVtZW50cygpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogRUxFTUVOVF9ERUNMQVJBVElPTiwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBHUk9VUCwgRU5USVRZX0RFQ0xBUkFUSU9OLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRVc2FnZSgpIHsKLQkJcmV0dXJuIHVzYWdlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19TQ1JJUFRBQkxFKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gc3VwZXIuc3VwcG9ydHMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKQotCQkJcmV0dXJuIG5ldyBCb29sZWFuKHRydWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfU0NSSVBUQUJMRSkpIHsKLQkJCXJldHVybiBnZXRBdHRyVHlwZSgpLmdldERhdGFUeXBlTmFtZSgpID09IEhUTUxDTURhdGFUeXBlLlNDUklQVCA/IG5ldyBCb29sZWFuKHRydWUpIDogbmV3IEJvb2xlYW4oZmFsc2UpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzVkYzU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci0KLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGludGVuZGVkIHRvIGJlIGEgcHVibGljIGludGVyZmFjZSB3aGljaCBoYXMKLSAqIGludGVyZmFjZXMgZGVmaW5lZCBpbiBib3RoIG9mIHtAbGluayA8Y29kZT5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uPC9jb2RlPn0KLSAqIGFuZCB7QGxpbmsgPGNvZGU+SFRNTENNTm9kZTwvY29kZT59Ljxicj4KLSAqLwotcHVibGljIGludGVyZmFjZSBIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gZXh0ZW5kcyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQ01EYXRhVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQ01EYXRhVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmEwYjg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNRGF0YVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICogSFRNTCBleHRlbnNpb24gZm9yIGRhdGEgdHlwZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTENNRGF0YVR5cGUgZXh0ZW5kcyBDTURhdGFUeXBlIHsKLQotCS8qKiBCb29sZWFuOyBpdCBzaG91bGQgYmUgZGVmaW5lZCBpbiBDTURhdGFUeXBlLiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0xFQU4gPSAiQk9PTEVBTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUiA9ICJDT0xPUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVCA9ICJFVkVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRFJFRlMgPSAiSURSRUZTIjsgLy8kTk9OLU5MUy0xJAotCS8qKiBOYW1lOyBpdCBzaG91bGQgYmUgZGVmaW5lZCBpbiBDTURhdGFUeXBlLiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBGb2xsb3dpbmcgdHlwZXMgYXJlIGp1c3QgYWxpYXNlcy4KLQkvKiogJUNoYXJhY3RlcjsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSQUNURVIgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlQ2hhcnNldDsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSU0VUID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJUNoYXJzZXRzOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJTRVRTID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJUNvbnRlbnRUeXBlOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRSA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVDb29yZHM7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09PUkRTID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJURhdGV0aW1lOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVUSU1FID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJUZyYW1lVGFyZ2V0OyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQU1FX1RBUkdFVCA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVMYW5ndWFnZUNvZGU7ID09IE5BTUUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQU5HVUFHRV9DT0RFID0gTkFNRTsKLQkvKiogJUxlbmd0aDsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRU5HVEggPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlTGlua1R5cGVzOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfVFlQRVMgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlTElTdHlsZTsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSV9TVFlMRSA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVNZWRpYURlc2M7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUFfREVTQyA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVNdWx0aUxlbmd0aDsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSV9MRU5HVEggPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlT0xTdHlsZTsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTF9TVFlMRSA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVQaXhsZXM7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElYRUxTID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJVNjcmlwdDsgPT0gRVZFTlQgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JJUFQgPSBFVkVOVDsKLQkvKiogJVN0eWxlU2hlZXQ7ID09IEVWRU5UICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVfU0hFRVQgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlVGV4dDsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUID0gQ01EYXRhVHlwZS5DREFUQTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNRGF0YVR5cGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURhdGFUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTUwYzc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNRGF0YVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLQotCi0vKioKLSAqLwotY2xhc3MgSFRNTENNRGF0YVR5cGVJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIEhUTUxDTURhdGFUeXBlIHsKLQotCXByaXZhdGUgaW50IGltcGxpZWRWYWx1ZUtpbmQgPSBJTVBMSUVEX1ZBTFVFX05PTkU7Ci0JcHJpdmF0ZSBTdHJpbmcgaW1wbGllZFZhbHVlID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBlbXB0eUFycmF5ID0gbmV3IFN0cmluZ1swXTsKLQlwcml2YXRlIFN0cmluZ1tdIGVudW1WYWx1ZXMgPSBlbXB0eUFycmF5OwotCXByaXZhdGUgU3RyaW5nIGluc3RhbmNlVmFsdWUgPSBudWxsOwotCi0JLyoqCi0JICogSFRNTENNRGF0YVR5cGVJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIG5tIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSFRNTENNRGF0YVR5cGVJbXBsKFN0cmluZyB0eXBlTmFtZSkgewotCQlzdXBlcih0eXBlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogSFRNTENNRGF0YVR5cGVJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIG5tIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSFRNTENNRGF0YVR5cGVJbXBsKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIGluc3RhbmNlVmFsdWUpIHsKLQkJc3VwZXIodHlwZU5hbWUpOwotCQl0aGlzLmluc3RhbmNlVmFsdWUgPSBpbnN0YW5jZVZhbHVlOwotCX0KLQotCS8qKgotCSAqIGdldFR5cGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHN1aXRhYmxlIGRlZmF1bHQgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGFuIGluc3RhbmNlIG9mIHRoZSBkYXRhIHR5cGUgaXMgY3JlYXRlZC4KLQkgKiBUaGlzIHJldHVybnMgbnVsbCBvZiBhIHN1aXRhYmxlIGRlZmF1bHQgaXMgbm90IGF2YWlsYWJsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlSW5zdGFuY2VWYWx1ZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nW10KLQkgKgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRFbnVtZXJhdGVkVmFsdWVzKCkgewotCQlyZXR1cm4gZW51bVZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUeXBlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcgIAotCSAqCi0JICogUmV0dXJucyB0aGUgaW1wbGllZCB2YWx1ZSBvciBudWxsIGlmIG5vbmUgZXhpc3RzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wbGllZFZhbHVlKCkgewotCQlyZXR1cm4gaW1wbGllZFZhbHVlOwotCX0KLQotCS8qKgotCSAqIGdldEltcGxpZWRWYWx1ZUtpbmQgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiBJTVBMSUVEX1ZBTFVFX05PTkUsIElNUExJRURfVkFMVUVfRklYRUQsIElNUExJRURfVkFMVUVfREVGQVVMVC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEltcGxpZWRWYWx1ZUtpbmQoKSB7Ci0JCXJldHVybiBpbXBsaWVkVmFsdWVLaW5kOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkRBVEFfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHNldEVudW1WYWx1ZXMoU3RyaW5nW10gdmFsdWVzKSB7Ci0JCWVudW1WYWx1ZXMgPSBuZXcgU3RyaW5nW3ZhbHVlcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJZW51bVZhbHVlc1tpXSA9IHZhbHVlc1tpXTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHBhY2thZ2Ugc2NvcGUuCi0JICovCi0Jdm9pZCBzZXRJbXBsaWVkVmFsdWUoaW50IGtpbmQsIFN0cmluZyB2YWx1ZSkgewotCQlzd2l0Y2ggKGtpbmQpIHsKLQkJCWNhc2UgSU1QTElFRF9WQUxVRV9GSVhFRCA6Ci0JCQljYXNlIElNUExJRURfVkFMVUVfREVGQVVMVCA6Ci0JCQkJaW1wbGllZFZhbHVlS2luZCA9IGtpbmQ7Ci0JCQkJaW1wbGllZFZhbHVlID0gdmFsdWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElNUExJRURfVkFMVUVfTk9ORSA6Ci0JCQlkZWZhdWx0IDoKLQkJCQlpbXBsaWVkVmFsdWVLaW5kID0gSU1QTElFRF9WQUxVRV9OT05FOwotCQkJCWltcGxpZWRWYWx1ZSA9IG51bGw7IC8vIG1heWJlIGEgbnVsbCBzdHJpbmc/Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNmM3ZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQ01Eb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotCi0KLQotLyoqCi0gKiBIVE1MIGV4dGVuc2lvbiBmb3IgQ01Eb2N1bWVudC4KLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIHNvbWUgc2hvcnQgaGFuZCBtZXRob2RzIHRvIGdldCBkZWNsYXJhdGlvbnMKLSAqIGJ5IGEgbmFtZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBIVE1MQ01Eb2N1bWVudCBleHRlbmRzIENNRG9jdW1lbnQgewotCi0JLyoqCi0JICogQSBzaG9ydCBoYW5kIG1ldGhvZCB0byBnZXQgYSBlbGVtZW50IGRlY2xhcmF0aW9uIGZvciBhIEhUTUwgZWxlbWVudC48YnI+Ci0JICogQHBhcmFtIGVsZW1lbnROYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlIVE1MRWxlbWVudERlY2xhcmF0aW9uIGdldEVsZW1lbnREZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudE5hbWUpOwotCi0JLyoqCi0JICogQSBzaG9ydCBoYW5kIG1ldGhvZCB0byBnZXQgYSBlbnRpdHkgZGVjbGFyYXRpb24gb2YgSFRNTCBkb2N1bWVudHMuPGJyPgotCSAqIEBwYXJhbSBlbnRpdHlOYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlIVE1MRW50aXR5RGVjbGFyYXRpb24gZ2V0RW50aXR5RGVjbGFyYXRpb24oU3RyaW5nIGVudGl0eU5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQ01Eb2N1bWVudEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNRG9jdW1lbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MzE2ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQ01Eb2N1bWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbC5DSENNRG9jSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci0KLS8qKgotICogSU5vZGVBZGFwdGVyIGZhY3RvcnkgZm9yIEhUTUwgYW5kIEpTUCBkb2N1bWVudHMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBIVE1MQ01Eb2N1bWVudEZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIGNtZG9jcyA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIHN0YXRpYyBMaXN0IHN1cHBvcnRlZENNdHlwZXMgPSBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXXtDTURvY1R5cGUuSFRNTF9ET0NfVFlQRSwgQ01Eb2NUeXBlLkNIVE1MX0RPQ19UWVBFLCBDTURvY1R5cGUuSlNQMTFfRE9DX1RZUEUsIENNRG9jVHlwZS5KU1AxMl9ET0NfVFlQRSwgQ01Eb2NUeXBlLkpTUDIwX0RPQ19UWVBFLCBDTURvY1R5cGUuVEFHMjBfRE9DX1RZUEV9KTsKLQotCXByaXZhdGUgc3RhdGljIEpDTURvY0ltcGwganNwMTFkb2MgPSBudWxsOwotCi0JLyoqCi0JICogSFRNTENNQWRhcHRlckZhY3RvcnkgY29uc3RydWN0b3IuCi0JICovCi0JcHJpdmF0ZSBIVE1MQ01Eb2N1bWVudEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKiBAcGFyYW0gY210eXBlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoU3RyaW5nIGNtdHlwZSkgewotCQlPYmplY3Qgb2JqID0gY21kb2NzLmdldChjbXR5cGUpOwotCQlpZiAob2JqID09IG51bGwgJiYgY210eXBlICE9IG51bGwpIHsKLQkJCWlmIChzdXBwb3J0ZWRDTXR5cGVzLmNvbnRhaW5zKGNtdHlwZSkpIHsKLQkJCQlvYmogPSBkb0NyZWF0ZUNNRG9jdW1lbnQoY210eXBlKTsKLQkJCQljbWRvY3MucHV0KGNtdHlwZSwgb2JqKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAoQ01Eb2N1bWVudCkgb2JqOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE9iamVjdCBkb0NyZWF0ZUNNRG9jdW1lbnQoU3RyaW5nIGNtdHlwZSkgewotCQlpZiAoQ01Eb2NUeXBlLkhUTUxfRE9DX1RZUEUuZXF1YWxzKGNtdHlwZSkpIHsKLQkJCUNNTmFtZXNwYWNlSW1wbCBoNDBucyA9IG5ldyBDTU5hbWVzcGFjZUltcGwoSFRNTDQwTmFtZXNwYWNlLkhUTUw0MF9VUkksIEhUTUw0ME5hbWVzcGFjZS5IVE1MNDBfVEFHX1BSRUZJWCk7Ci0JCQlIQ01Eb2NJbXBsIGh0bWw0MGRvYyA9IG5ldyBIQ01Eb2NJbXBsKENNRG9jVHlwZS5IVE1MX0RPQ19UWVBFLCBoNDBucyk7Ci0JCQlyZXR1cm4gaHRtbDQwZG9jOwotCQl9Ci0KLQkJZWxzZSBpZiAoQ01Eb2NUeXBlLkpTUDIwX0RPQ19UWVBFLmVxdWFscyhjbXR5cGUpKSB7Ci0JCQlDTU5hbWVzcGFjZUltcGwgajIwbnMgPSBuZXcgQ01OYW1lc3BhY2VJbXBsKEpTUDIwTmFtZXNwYWNlLkpTUDIwX1VSSSwgSlNQMTFOYW1lc3BhY2UuSlNQX1RBR19QUkVGSVgpOwotCQkJSkNNMjBEb2NJbXBsIGpzcDIwZG9jID0gbmV3IEpDTTIwRG9jSW1wbChDTURvY1R5cGUuSlNQMjBfRE9DX1RZUEUsIGoyMG5zKTsKLQkJCXJldHVybiBqc3AyMGRvYzsKLQkJfQotCi0JCWVsc2UgaWYgKENNRG9jVHlwZS5UQUcyMF9ET0NfVFlQRS5lcXVhbHMoY210eXBlKSkgewotCQkJQ01OYW1lc3BhY2VJbXBsIGoyMG5zID0gbmV3IENNTmFtZXNwYWNlSW1wbChKU1AyME5hbWVzcGFjZS5KU1AyMF9VUkksIEpTUDExTmFtZXNwYWNlLkpTUF9UQUdfUFJFRklYKTsKLQkJCVRhZ0NNRG9jSW1wbCB0YWcyMGRvYyA9IG5ldyBUYWdDTURvY0ltcGwoQ01Eb2NUeXBlLlRBRzIwX0RPQ19UWVBFLCBqMjBucyk7Ci0JCQlyZXR1cm4gdGFnMjBkb2M7Ci0JCX0KLQotCQllbHNlIGlmIChDTURvY1R5cGUuSlNQMTFfRE9DX1RZUEUuZXF1YWxzKGNtdHlwZSkgfHwgQ01Eb2NUeXBlLkpTUDEyX0RPQ19UWVBFLmVxdWFscyhjbXR5cGUpKSB7Ci0JCQlpZiAoanNwMTFkb2MgPT0gbnVsbCkgewotCQkJCUNNTmFtZXNwYWNlSW1wbCBqMTFucyA9IG5ldyBDTU5hbWVzcGFjZUltcGwoSlNQMTFOYW1lc3BhY2UuSlNQMTFfVVJJLCBKU1AxMU5hbWVzcGFjZS5KU1BfVEFHX1BSRUZJWCk7Ci0JCQkJanNwMTFkb2MgPSBuZXcgSkNNRG9jSW1wbChDTURvY1R5cGUuSlNQMTFfRE9DX1RZUEUsIGoxMW5zKTsKLQkJCX0KLQkJCXJldHVybiBqc3AxMWRvYzsKLQkJfQotCi0JCWVsc2UgaWYgKENNRG9jVHlwZS5DSFRNTF9ET0NfVFlQRS5lcXVhbHMoY210eXBlKSkgewotCQkJQ01OYW1lc3BhY2VJbXBsIGNINDBucyA9IG5ldyBDTU5hbWVzcGFjZUltcGwoSFRNTDQwTmFtZXNwYWNlLkhUTUw0MF9VUkksIEhUTUw0ME5hbWVzcGFjZS5IVE1MNDBfVEFHX1BSRUZJWCk7Ci0JCQlDSENNRG9jSW1wbCBjaHRtbGRvYyA9IG5ldyBDSENNRG9jSW1wbChDTURvY1R5cGUuQ0hUTUxfRE9DX1RZUEUsIGNINDBucyk7Ci0JCQlyZXR1cm4gY2h0bWxkb2M7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzYyM2VjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTENNTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLS8qKgotICogSW4gSFRNTCBEb2N1bWVudHMsIG5hbWUgYW5kIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZS9lbGVtZW50L2VudGl0eQotICogc2hvdWxkIGJlIHRyZWF0ZWQgaWdub3JpbmcgdGhlaXJzIGNhc2UuICBIb3dldmVyLCBpbiBYTUwgZG9jdW1lbnRzLAotICogdGhleSBzaG91bGQgYmUgZGlzdGluZ3Vpc2hlZCB3aXRoIHNlbnNpdGl2ZW5lc3Mgb2YgdGhlaXIgY2FzZS4KLSAqIENNTm9kZSBpcyBiYXNpY2FsbHkgZGVzaWduZWQgdG8gcmVwcmVzZW50IERURHMgb3IgU2NoZW1hcyBmb3IgWE1MCi0gKiBkb2N1bWVudHMuICBTbywgaXQgZG9lc24ndCBoYXZlIGludGVyZmFjZXMgdG8gcmV0cmlldmUgc3VjaCBpbmZvcm1hdGlvbi4KLSAqIEhvd2V2ZXIsIGRlY2xhcmF0aW9ucyBpbiB0aGUgSFRNTCBDTSBzaG91bGQgcHJvdmlkZSBzdWNoIGluZm9ybWF0aW9uLgotICogVGhpcyBpbnRlcm1lZGlhdGUgaW50ZXJmYWNlIGlzIGludGVuZGVkIHRvIHByb3ZpZGUgd2hldGhlciBpZ25vcmUgY2FzZXMKLSAqIG9yIG5vdC48YnI+Ci0gKi8KLWludGVyZmFjZSBIVE1MQ01Ob2RlIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUgewotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiwgaWYgZGVjbGFyYXRpb24gaXMgZm9yIEhUTUwgYXR0cmlidXRlL2VsZW1lbnQvZW50aXR5LgotCSAqIE90aGVyd2lzZSwgcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBzaG91bGRJZ25vcmVDYXNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxFbGVtRGVjbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVsZW1EZWNsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGIxNDcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVsZW1EZWNsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhbGwgSGVkPz8/PyBjbGFzc2VzLgotICovCi1hYnN0cmFjdCBjbGFzcyBIVE1MRWxlbURlY2xJbXBsIGV4dGVuZHMgQ01Db250ZW50SW1wbCBpbXBsZW1lbnRzIEhUTUxFbGVtZW50RGVjbGFyYXRpb24sIEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIHsKLQotCS8vIERURAotCXByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgYXR0cmlidXRlcyA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyB0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0VNUFRZOwotCS8qKiBOZXZlciBhY2Nlc3MgdGhpcyBmaWVsZCBkaXJlY3RseS4gIEluc3RlYWQsIHVzZSBnZXRDb21wbGV4VHlwZURlZmluaXRpb24gbWV0aG9kLiAqLwotCXByaXZhdGUgQ29tcGxleFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ01Hcm91cEltcGwgaW5jbHVzaW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ01Hcm91cEltcGwgZXhjbHVzaW9uID0gbnVsbDsKLQkvLyBhZHZhbmNlZCBpbmZvcm1hdGlvbgotCXByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcCBwcm9oaWJpdGVkQW5jZXN0b3JzID0gbnVsbDsKLQlwcm90ZWN0ZWQgaW50IGNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9OT05FOwotCXByb3RlY3RlZCBpbnQgZm9ybWF0VHlwZSA9IEZPUk1BVF9IVE1MOwotCXByb3RlY3RlZCBpbnQgbGF5b3V0VHlwZSA9IExBWU9VVF9OT05FOwotCXByb3RlY3RlZCBpbnQgb21pdFR5cGUgPSBPTUlUX05PTkU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4ga2VlcFNwYWNlcyA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGluZGVudENoaWxkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgQXR0cmlidXRlQ29sbGVjdGlvbiBhdHRyaWJ1dGVDb2xsZWN0aW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIENNTmFtZWROb2RlTWFwIEVNUFRZX01BUCA9IG5ldyBDTU5hbWVkTm9kZU1hcCgpIHsKLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQkJcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkJfQotCQkJfTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBIVE1MRWxlbURlY2xJbXBsIGNvbnN0cnVjdG9yLgotCSAqIEluIHRoZSBIVE1MIERURCwgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiBoYXMgbm8gc3BlY2lmaWNhdGlvbgotCSAqIGZvciBpdHMgb2NjdXJyZW5jZS4gIE9jY3VycmVuY2UgaXMgc3BlY2lmZWQgaW4gY29udGVudCBtb2RlbCwgbGlrZQotCSAqIDxjb2RlPihMSSkrPC9jb2RlPi4gIFRvIGF2b2lkIGNvbmZ1c2lvbiAoYW5kIGNvbXBsZXhpdHkpLAotCSAqIG9jY3VycmVuY2Ugb2YgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiBpcyBhbHdheXMgMSAoaXQgbWVhbnMsIG1pbiA9IDEgYW5kCi0JICogbWF4ID0gMSkuICBJbnN0ZWFkLCBvY2N1cnJlbmNlIG9mIENNR3JvdXAgcmVwcmVzZW50cyBhY3R1YWwgb2NjdXJyZW5jZQotCSAqIG9mIHRoZSBjb250ZW50LgotCSAqIDxicj4KLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEhUTUxFbGVtRGVjbEltcGwoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCAxLCAxKTsKLQkJZWxlbWVudENvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uID0gY29sbGVjdGlvbi5nZXRBdHRyaWJ1dGVDb2xsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCk7Ci0KLQlwcml2YXRlIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjcmVhdGVDb21wbGV4VHlwZURlZmluaXRpb24oKSB7Ci0JCWlmICh0eXBlRGVmaW5pdGlvbk5hbWUuZXF1YWxzKENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfQ0RBVEEpIHx8IHR5cGVEZWZpbml0aW9uTmFtZS5lcXVhbHMoQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9FTVBUWSkgfHwgdHlwZURlZmluaXRpb25OYW1lLmVxdWFscyhDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1BDREFUQSkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5IGZhY3RvcnkgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZmF0YWwgZXJyb3IuCi0KLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGZhY3RvcnkuY3JlYXRlVHlwZURlZmluaXRpb24odHlwZURlZmluaXRpb25OYW1lLCBlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXJldHVybiBkZWY7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQljcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKTsKLQkJCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7IC8vIGZhaWwgdG8gY3JlYXRlCi0JCX0KLQotCQlDTU5vZGUgY21ub2RlID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpOwotCQlpZiAoY21ub2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIChIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24pIGNtbm9kZTsgLy8gYWxyZWFkeSBleGlzdHMuCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKLQkJCWNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpOyAvLyBsYXp5IGV2YWwuCi0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIEdldCBhbiBpbnN0YW5jZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKi8KLQlwcml2YXRlIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBnZXRDb21wbGV4VHlwZURlZmluaXRpb24oKSB7Ci0JCWlmICh0eXBlRGVmaW5pdGlvbiA9PSBudWxsKQotCQkJdHlwZURlZmluaXRpb24gPSBjcmVhdGVDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLQkJcmV0dXJuIHR5cGVEZWZpbml0aW9uOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQuPGJyPgotCSAqIEVsZW1lbnQgZGVjbGFyYXRpb25zIHdoaWNoIHR5cGUgaXMgRU1QVFkgb3IgQ0RBVEEgKG1heWJlIFBDREFUQSkKLQkgKiA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIGFsd2F5cyByZXR1cm4gbnVsbC4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHRyaWVzIHRvIGNyZWF0ZSBhIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uCi0JICogaW5zdGFuY2UgYW5kIGFjY2VzcyB0byBpdC4KLQkgKiA8YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlDb21wbGV4VHlwZURlZmluaXRpb24gZGVmID0gZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uKCk7IC8vIGxhenkgZXZhbC4KLQkJcmV0dXJuIChkZWYgIT0gbnVsbCkgPyBkZWYuZ2V0Q29udGVudCgpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50IHR5cGUuPGJyPgotCSAqIEVsZW1lbnQgZGVjbGFyYXRpb25zIHdoaWNoIHR5cGUgaXMgRU1QVFkgb3IgQ0RBVEEgKG1heWJlIFBDREFUQSkKLQkgKiA8c3Ryb25nPk1VU1Q8L3N0cm9uZz4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIHJldHVybiBhbiBhcHByb3ByaWF0ZSB0eXBlLgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgdHJpZXMgdG8gY3JlYXRlIGEgY29tcGxleCB0eXBlIGRlZmluaXRpb24KLQkgKiBpbnN0YW5jZSBhbmQgYWNjZXNzIHRvIGl0LgotCSAqIDxicj4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlDb21wbGV4VHlwZURlZmluaXRpb24gZGVmID0gZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uKCk7IC8vIGxhenkgZXZhbC4KLQkJcmV0dXJuIChkZWYgIT0gbnVsbCkgPyBkZWYuZ2V0Q29udGVudFR5cGUoKSA6IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiNnZXRDb3JyZWN0aW9uVHlwZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29ycmVjdGlvblR5cGUoKSB7Ci0JCXJldHVybiBjb3JyZWN0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBIVE1MIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBkYXRhIHR5cGUuICBTbywgdGhpcyBtZXRob2QgYWx3YXlzCi0JICogcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi48YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiBBbG1vc3QgZWxlbWVudHMgZG9uJ3QgaGF2ZSBhIGV4Y2x1c2lvbi4KLQkgKiBPbmx5IGNsYXNzZXMgdGhvc2UgaGF2ZSBleGNsdXNpb24gc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGZvcm1hdCB0eXBlIGlzIDxjb2RlPkZPUk1BVF9IVE1MPC9jb2RlPi48YnI+Ci0JICovCi0JcHVibGljIGludCBnZXRGb3JtYXRUeXBlKCkgewotCQlyZXR1cm4gZm9ybWF0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBJbmNsdXNpb24uCi0JICogQWxtb3N0IGVsZW1lbnRzIGRvbid0IGhhdmUgYSBpbmNsdXNpb24uCi0JICogT25seSBjbGFzc2VzIHRob3NlIGhhdmUgaW5jbHVzaW9uIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEluY2x1c2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRMYXlvdXRUeXBlKCkgewotCQlyZXR1cm4gbGF5b3V0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBMaW5lIGJyZWFrIGhpbnQgaXMgc3Ryb25nbHkgcmVsYXRlZCB0byBsYXlvdXQgdHlwZS4KLQkgKiBJbmRlZWQsIGluIHRoZSBDKytET00sIGl0IGlzIGRldGVybWluZWQgZnJvbSBsYXlvdXQgdHlwZSBvbmx5LgotCSAqIFNvLCB0aGlzIGltcGxlbWVudGF0aW9uLCBhcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgYWxsIGRlY2xhcmF0aW9ucywKLQkgKiBhbHNvIGRldGVybWluZXMgZnJvbSBsYXlvdXQgdHlwZSBvbmx5Ljxicj4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGluZUJyZWFrSGludCgpIHsKLQkJc3dpdGNoIChnZXRMYXlvdXRUeXBlKCkpIHsKLQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfQkxPQ0sgOgotCQkJCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EOwotCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9CUkVBSyA6Ci0JCQkJcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfQUZURVJfU1RBUlQ7Ci0JCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTiA6Ci0JCQkJcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQ7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19OT05FOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTm8gSFRNTCBlbGVtZW50IGhhcyBsb2NhbCBlbGVtZW50cy4gIFNvLCB0aGlzIG1ldGhvZCBhbHdheXMKLQkgKiByZXR1cm5zIGFuIGVtcHR5IG1hcC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0TG9jYWxFbGVtZW50cygpIHsKLQkJcmV0dXJuIEVNUFRZX01BUDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T21pdFR5cGUoKSB7Ci0JCXJldHVybiBvbWl0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJcmV0dXJuIEVNUFRZX01BUDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLkNPTlRFTlRfSElOVCkpIHsKLQkJCUNvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWYgPSBnZXRDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLQkJCXJldHVybiAoZGVmICE9IG51bGwpOwotCQl9Ci0JCWVsc2UgewotCQkJUHJvcGVydHlQcm92aWRlciBwcCA9IFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5LmdldFByb3ZpZGVyKHByb3BlcnR5TmFtZSk7Ci0JCQlpZiAocHAgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gcHAuc3VwcG9ydHModGhpcyk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuQ09OVEVOVF9ISU5UKSkgewotCQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotCQkJcmV0dXJuIChkZWYgIT0gbnVsbCkgPyBkZWYuZ2V0UHJpbWFyeUNhbmRpZGF0ZSgpIDogbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCVByb3BlcnR5UHJvdmlkZXIgcHAgPSBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5nZXRQcm92aWRlcihwcm9wZXJ0eU5hbWUpOwotCQkJaWYgKHBwID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gcHAuZ2V0KHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGVsZW1lbnQgbmFtZXMgd2hpY2ggdGVybWluYXRlcyB0aGlzIGVsZW1lbnQuPGJyPgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBlbGVtZW50IGlzIGEgSlNQIGVsZW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNKU1AoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBJbiBzb21lIGVsZW1lbnRzLCBzdWNoIGFzIEFQUExFVCwgYSBzb3VyY2UgZ2VuZXJhdG9yIHNob3VsZCBpbmRlbnQgY2hpbGQKLQkgKiBlbGVtZW50cyB0aGF0IHRoZWlyIHBhcmVudHMuICBUaGF0IGlzLCBhIHNvdXJjZSBnZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlCi0JICogc291cmNlICBvZiBBUFBMRVQgYW5kIFBBUkFNUyBsaWtlIHRoaXM6Ci0JICogPFBSRT4KLQkgKiAgICZsdDtBUFBMRVQgLi4uJmd0OwotCSAqICAgICAmbHQ7UEFSQU0gLi4uICZndDsKLQkgKiAgICAgJmx0O1BBUkFNIC4uLiAmZ3Q7Ci0JICogICAmbHQ7L0FQUExFVCZndDsKLQkgKiA8UFJFPgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZEluZGVudENoaWxkU291cmNlKCkgewotCQlyZXR1cm4gaW5kZW50Q2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogTW9zdCBvZiBlbGVtZW50cyBjYW4gY29tcGFjdCBzcGFjZXMgaW4gdGhlaXIgY2hpbGQgdGV4dCBub2Rlcy4KLQkgKiBTb21lIHNwZWNpYWwgZWxlbWVudHMgc2hvdWxkIGtlZXAgdGhlbSBpbiB0aGVpciBzb3VyY2UuCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkS2VlcFNwYWNlcygpIHsKLQkJcmV0dXJuIGtlZXBTcGFjZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVGVybWluYXRlQXQoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBuZXh0RWxlbWVudCkgewotCQlJdGVyYXRvciBpID0gZ2V0VGVybWluYXRvcnMoKTsKLQkJaWYgKGkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIG5leHROYW1lID0gbmV4dEVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlpZiAobmV4dE5hbWUuZXF1YWxzKGkubmV4dCgpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MRWxlbWVudERlY2xhcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxFbGVtZW50RGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiZjBjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxFbGVtZW50RGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGludGVuZGVkIHRvIGJlIGEgcHVibGljIGludGVyZmFjZSB3aGljaCBoYXMKLSAqIGludGVyZmFjZXMgZGVmaW5lZCBpbiBib3RoIG9mIHtAbGluayA8Y29kZT5DTUVsZW1lbnREZWNsYXJhdGlvbjwvY29kZT59Ci0gKiBhbmQge0BsaW5rIDxjb2RlPkhUTUxDTU5vZGU8L2NvZGU+fS48YnI+Ci0gKiBJbiBhZGRpdGlvbiB0byB0aGlzLCBzb21lIGludGVyZmFjZXMgYXJlIGFkZGVkIHRvIHRoaXMgaW50ZXJmYWNlLAotICogdGhvc2UgYXJlIHNwZWNpYWxseSB0byBIVE1MIGVsZW1lbnRzLjxicj4KLSAqLwotcHVibGljIGludGVyZmFjZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGV4dGVuZHMgQ01FbGVtZW50RGVjbGFyYXRpb24gewotCi0JLyoqIFRhZyBvbW1pc3Npb247IE5vdCBvbW1pc2libGUuICovCi0JaW50IE9NSVRfTk9ORSA9IDA7Ci0JLyoqIFRhZyBvbW1pc3Npb247IEJvdGggdGFncyBhcmUgb21taXNpYmxlLiAqLwotCWludCBPTUlUX0JPVEggPSAxOwotCS8qKiBUYWcgb21taXNzaW9uOyBUaGUgZW5kIHRhZyBpcyBvbW1pc2libGUuICovCi0JaW50IE9NSVRfRU5EID0gMjsKLQkvKiogVGFnIG9tbWlzc2lvbjsgVGhlIGVuZCB0YWcgaXMgb21taXR0ZWQgd2hlbiBjcmVhdGVkLiAqLwotCWludCBPTUlUX0VORF9ERUZBVUxUID0gMzsKLQkvKiogVGFnIG9tbWlzc2lvbjsgVGhlIGVuZCB0YWcgbXVzdCBiZSBvbWl0dGVkLiAqLwotCWludCBPTUlUX0VORF9NVVNUID0gNDsKLQkvKiogTGluZSBCcmVhazsgTm8gYnJlYWsuICovCi0JaW50IEJSRUFLX05PTkUgPSAxMDsKLQkvKiogTGluZSBCcmVhazsgQnJlYWsgYWZ0ZXIgdGhlIHN0YXJ0IHRhZy4gKi8KLQlpbnQgQlJFQUtfQUZURVJfU1RBUlQgPSAxMTsKLQkvKiogTGluZSBCcmVhazsgQnJlYWsgYm90aCBiZWZvcmUgdGhlIHN0YXJ0IHRhZ24gYW5kIGFmdGVyIHRoZSBlbmQgdGFnLiAqLwotCWludCBCUkVBS19CRUZPUkVfU1RBUlRfQU5EX0FGVEVSX0VORCA9IDEyOwotCS8qIExheW91dCAqLwotCS8qKiBpbml0aWFsIHZhbHVlOyB0aGUgdmFsdWUgc2hvdWxkIG5ldmVyIHJldHVybnMgdG8gY2xpZW50IHByb2dyYW1zLiAqLwotCWludCBMQVlPVVRfTk9ORSA9IDEwMDsKLQlpbnQgTEFZT1VUX0JMT0NLID0gMTAxOwotCWludCBMQVlPVVRfV1JBUCA9IDEwMjsKLQkvKiogTm8gd3JhcCBvYmplY3Q7IGxpa2UgSU1HLCBBUFBMRVQsLi4uICovCi0JaW50IExBWU9VVF9PQkpFQ1QgPSAxMDM7Ci0JLyoqIEJSICovCi0JaW50IExBWU9VVF9CUkVBSyA9IDEwNDsKLQkvKiogSGlkZGVuIG9iamVjdDsgbGlrZSBIVE1MIG9yIEhFQUQgKi8KLQlpbnQgTEFZT1VUX0hJRERFTiA9IDEwNTsKLQkvKiBDb3JyZWN0aW9uICovCi0JLyoqIENvcnJlY3Q7IE5vIGNvcnJlY3QuICovCi0JaW50IENPUlJFQ1RfTk9ORSA9IDEwMDA7Ci0JLyoqIENvcnJlY3Q7IE1lYW5pbmdsZXNzIHdoZW4gdGhlIGNvbnRlbnQgaXMgZW1wdHkuICovCi0JaW50IENPUlJFQ1RfRU1QVFkgPSAxMDAxOwotCS8qKiBDb3JyZWN0OyBNZWFuaW5nbGVzcyB3aGVuIG5vIGF0dHJpYnV0IGlzIHNldC4gKi8KLQlpbnQgQ09SUkVDVF9ORVVUUkFMID0gMTAwMjsKLQkvKiogQ29ycmVjdDsgTWVhbmluZ2xlc3Mgd2hlbiBzYW1lIGVsZW1lbnQgaXMgbmVzdGVkLiAqLwotCWludCBDT1JSRUNUX0RVUExJQ0FURUQgPSAxMDAzOwotCS8qKiBGb3JtYXQ7IEhUTUwgKi8KLQlpbnQgRk9STUFUX0hUTUwgPSAxMDAwMDsKLQkvKiogRm9ybWF0OyBTU0kgKi8KLQlpbnQgRk9STUFUX1NTSSA9IDEwMDAxOwotCS8qKiBGb3JtYXQ7IEpTUCBzY3JpcHQgKi8KLQlpbnQgRk9STUFUX0pTUF9TQ1JJUFQgPSAxMDAwMjsKLQkvKiogRm9ybWF0OyBKU1AgZGlyZWN0aXZlICovCi0JaW50IEZPUk1BVF9KU1BfRElSRUNUSVZFID0gMTAwMDM7Ci0JLyoqIEZvcm1hdDsgWE1MICovCi0JaW50IEZPUk1BVF9YTUwgPSAxMDAwNDsKLQkvKiogRm9ybWF0OyBNVyAqLwotCWludCBGT1JNQVRfTVcgPSAxMDAwNTsKLQotCS8qKgotCSAqIEEgc2hvcnQgaGFuZCBtZXRob2QgdG8gZ2V0IGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbiBvZiBhIEhUTUwgZWxlbWVudC4KLQkgKiBAcGFyYW0gYXR0ck5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCUhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihTdHJpbmcgYXR0ck5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MRW50aXR5RGVjbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVudGl0eURlY2xJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0M2RiMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MRW50aXR5RGVjbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotCi0KLS8qKgotICovCi1jbGFzcyBIVE1MRW50aXR5RGVjbEltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgSFRNTEVudGl0eURlY2xhcmF0aW9uIHsKLQotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB2YWx1ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTUVudGl0eURlY2xJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIGVudGl0eU5hbWUgamF2YS5sYW5nLlN0cmluZzsgRW50aXR5IG5hbWUuCi0JICogQHBhcmFtIGVudGl0eVZhbHVlIGphdmEubGFuZy5TdHJpbmc7IFZhbHVlIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgSFRNTEVudGl0eURlY2xJbXBsKFN0cmluZyBlbnRpdHlOYW1lLCBTdHJpbmcgZW50aXR5VmFsdWUpIHsKLQkJc3VwZXIoZW50aXR5TmFtZSk7Ci0JCXZhbHVlID0gZW50aXR5VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEdldCBDTU5vZGUgdHlwZS48YnI+Ci0JICogQHJldHVybiBpbnQ7IEFsd2F5cyByZXR1cm4gRU5USVRZX0RFQ0xBUkFUSU9OLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuRU5USVRZX0RFQ0xBUkFUSU9OOwotCX0KLQotCS8qKgotCSAqIGdldFZhbHVlIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gc3VwZXIuc3VwcG9ydHMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBFbnRpdGllcyBpbiBIVE1MIGRvY3VtZW50cyBhcmUgYWx3YXlzIHRyZWF0ZWQgd2l0aCBpZ25vcmluZyBjYXNlcy4KLQkgKiBCZWNhdXNlIG5vIHNwZWNpYWwgZW50aXRpZXMgYXJlIGRlZmluZWQgaW4gSlNQIDEuMCwgdGhpcyBtZXRob2QKLQkgKiBjYW4gYWx3YXlzIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi48YnI+Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MRW50aXR5RGVjbGFyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVudGl0eURlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmN2IyZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MRW50aXR5RGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW50ZW5kZWQgdG8gYmUgYSBwdWJsaWMgaW50ZXJmYWNlIHdoaWNoIGhhcwotICogaW50ZXJmYWNlcyBkZWZpbmVkIGluIGJvdGggb2Yge0BsaW5rIDxjb2RlPkNNRW50aXR5RGVjbGFyYXRpb248L2NvZGU+fQotICogYW5kIHtAbGluayA8Y29kZT5IVE1MQ01Ob2RlPC9jb2RlPn0uPGJyPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUxFbnRpdHlEZWNsYXJhdGlvbiBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbnRpdHlEZWNsYXJhdGlvbiB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTFByb3BlcnR5RGVjbGFyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTFByb3BlcnR5RGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ4YmZiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxQcm9wZXJ0eURlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBjb21tb25seSB1c2VkIGluIGRlY2xhcmF0aW9uIGltcGxlbWVudGF0aW9uLCBhbmQgaW50ZXJuYWwgdXNlLgotICogVXNlIGdldFByb3BlcnR5KCkgbWV0aG9kIGZvciBwdWJsaWMgdXNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIHsKLQkvKioKLQkgKiBUbyBkZXRlcm1pbiB0aGUgdHlwZSwgbG9vayB1cCB0aGUgZm9sbG93aW5nIGtleXdvcmRzIGluIEMrK0RPTS9EVERQYXJzZXIuY3BwOgotCSAqIDx1bD4KLQkgKiAgIDxsaT5DT1JSRUNUX0RVUExJQ0FURUQgLSA8Y29kZT5HUk9VUF9OT0RVUDwvY29kZT48L2xpPgotCSAqICAgPGxpPkNPUlJFQ1RfRU1QVFkgLSA8Y29kZT5HUk9VUF9DT01QQUNUPC9jb2RlPjwvbGk+Ci0JICogICA8bGk+Q09SUkVDVF9ORVVUUkFMIC0gPGNvZGU+R1JPVVBfTkVVVFJBTDwvY29kZT48L2xpPgotCSAqICAgPGxpPkNPUlJFQ1RfTk9ORSAtIDxjb2RlPihOL0EpPC9jb2RlPjwvbGk+Ci0JICogPC91bD4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRDb3JyZWN0aW9uVHlwZSgpOwotCS8qKgotCSAqIEdldCB0aGUgbGlzdCBvZiBkZWNsYXJhdGlvbnMgdGhvc2Ugc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIGNvbnRlbnQuPGJyPgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCk7Ci0JLyoqCi0JICogVG8gZGV0ZXJtaW4gdGhlIHR5cGUsIHNlZSB0aGUgZm9sbG93aW5nIGZpbGVzIGluIHRoZSBDKytET006Ci0JICogICBFbGVtZW50VHlwZS5jcHAgLSBFbGVtZW50VHlwZSNzZXRHcm91cCgpLgotCSAqICAgRWxlbWVudC5jcHAgLSBFbGVtZW50I2dldFN0YXJ0VGFnKCkuCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0Rm9ybWF0VHlwZSgpOwotCS8qKgotCSAqIEdldCB0aGUgbGlzdCBvZiBkZWNsYXJhdGlvbnMgdGhvc2Ugc2hvdWxkIGJlIGluY2x1ZGVkIGludG8gdGhlIGNvbnRlbnQuPGJyPgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlDTUNvbnRlbnQgZ2V0SW5jbHVzaW9uKCk7Ci0JLyoqCi0JICogVG8gZGV0ZXJtaW4gdGhlIHR5cGUsIGxvb2sgdXAgdGhlIGZvbGxvd2luZyBrZXl3b3JkcyBpbiBDKytET00vRFREUGFyc2VyLmNwcDoKLQkgKiA8dWw+Ci0JICogICA8bGk+TEFZT1VUX0JMT0NLIC0gPGNvZGU+R1JPVVBfQkxPQ0s8L2NvZGU+PC9saT4KLQkgKiAgIDxsaT5MQVlPVVRfQlJFQUsgLSA8Y29kZT5HUk9VUF9CUkVBSzwvY29kZT48L2xpPgotCSAqICAgPGxpPkxBWU9VVF9ISURERU4gLSA8Y29kZT5HUk9VUF9ISURERU48L2NvZGU+PC9saT4KLQkgKiAgIDxsaT5MQVlPVVRfTk9ORSAtIDxjb2RlPihOL0EpPC9jb2RlPjwvbGk+Ci0JICogICA8bGk+TEFZT1VUX09CSkVDVCAtIDxjb2RlPkdST1VQX05PV1JBUDwvY29kZT48L2xpPgotCSAqICAgPGxpPkxBWU9VVF9XUkFQIC0gPGNvZGU+KE4vQSk8L2NvZGU+PC9saT4KLQkgKiA8L3VsPgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldExheW91dFR5cGUoKTsKLQkvKioKLQkgKiBUbyBkZXRlcm1pbmUgdGhlIHR5cGUsIHNlZSA8Y29kZT5FbGVtZW50Ojppc0JyZWFraW5nQmVmb3JlRWxlbWVudCgpPC9jb2RlPgotCSAqIGFuZCA8Y29kZT5FbGVtZW50Ojppc0JyZWFraW5nQWZ0ZXJFbGVtZW50KCk8L2NvZGU+IGRlZmluZWQgaW4gQysrRE9NL0VsZW1lbnQuY3BwLjxicj4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRMaW5lQnJlYWtIaW50KCk7Ci0JLyoqCi0JICogVG8gZGV0ZXJtaW5lIHRoZSB0eXBlLCBDaGVjayB0aGUgSFRNTCBEVEQuCi0JICogQW5kIGxvb2sgdXAgPGNvZGU+R1JPVVBfTk9FTkQ8L2NvZGU+IGluIEMrK0RPTS9EVERQYXJzZXIuY3BwLjxicj4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRPbWl0VHlwZSgpOwotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcAotCSAqLwotCUNNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKTsKLQkvKioKLQkgKiByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBlbGVtZW50IGlzIGEgSlNQIGVsZW1lbnQuCi0JICovCi0JYm9vbGVhbiBpc0pTUCgpOwotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gc2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UoKTsKLQkvKioKLQkgKiBTb21lIGVsZW1lbnRzIHNob3VsZCBrZWVwIHNwYWNlcyBpbiBpdHMgY2hpbGQgdGV4dCBub2Rlcy4KLQkgKiBGb3IgZXhhbXBsZSwgUFJFIGFuZCBURVhUQVJFQS4gIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSwKLQkgKiBpZiBhIHRhcmdldCBlbGVtZW50IGlzIG9uZSBvZiBzdWNoIGVsZW1lbnRzLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gc2hvdWxkS2VlcFNwYWNlcygpOwotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4sIGlmIDxjb2RlPm5leHRFbGVtZW50PC9jb2RlPiB0ZXJtaW5hdGVzCi0JICogdGhlIGN1cnJlbnQgZWxlbWVudC4KLQkgKiBTb21lIGVsZW1lbnRzIGxpa2UgPGNvZGU+UDwvY29kZT4gdGVybWluYXRlcyBvdGhlciA8Y29kZT5QPC9jb2RlPi4KLQkgKiBUaGF0IGlzLCB3aGVuIDxjb2RlPiZsdDtQJmd0OzwvY29kZT4gYXBwZWFycyBhdCB0aGUgbmV4dCB0byA8Y29kZT5QPC9jb2RlPiwKLQkgKiB3aGljaCBlbmQgdGFncyBpcyBvbWl0dGVkLCBpdCByZXByZXNlbnRzIG5vdCBvbmx5IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0JICogbmV3IDxjb2RlPlA8L2NvZGU+IGVsZW1lbnQgYnV0IGFsc28gdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgPGNvZGU+UDwvY29kZT4uCi0JICovCi0JYm9vbGVhbiBzaG91bGRUZXJtaW5hdGVBdChIVE1MRWxlbWVudERlY2xhcmF0aW9uIG5leHRFbGVtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZWIyOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEEuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEEgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEEoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQSwgY29sbGVjdGlvbik7Ci0JCS8vIENPUlJFQ1RfRU1QVFkgLSBHUk9VUF9DT01QQUNUCi0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGNoYXJzZXQgJUNoYXJzZXQ7ICNJTVBMSUVEKQotCSAqICh0eXBlICVDb250ZW50VHlwZTsgI0lNUExJRUQpCi0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKGhyZWYgJVVSSTsgI0lNUExJRUQpCi0JICogKGhyZWZsYW5nICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEKQotCSAqICh0YXJnZXQgJUZyYW1lVGFyZ2V0OyAjSU1QTElFRCkKLQkgKiAocmVsICVMaW5rVHlwZXM7ICNJTVBMSUVEKQotCSAqIChyZXYgJUxpbmtUeXBlczsgI0lNUExJRUQpCi0JICogKGFjY2Vzc2tleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkgKiAoZGlyZWN0a2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCSAqIChzaGFwZSAlU2hhcGU7IHJlY3QpCi0JICogKGNvb3JkcyAlQ29vcmRzOyAjSU1QTElFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0hBUlNFVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IUkVGTEFORywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQVJHRVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUkVMLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JFViwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ0NFU1NLRVksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRElSRUNUS0VZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NIQVBFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPT1JEUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQUJJTkRFWCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkZPQ1VTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OQkxVUn07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5BPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT5BPC9jb2RlPiBpdHNlbGYuCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlDTU5vZGUgYSA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQSk7Ci0JCWlmIChhICE9IG51bGwpCi0JCQlleGNsdXNpb24uYXBwZW5kQ2hpbGQoYSk7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlVUVE9OfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRBRERSRVNTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEFERFJFU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ5MTNmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEFERFJFU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIEFERFJFU1MuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEFERFJFU1MgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRBRERSRVNTKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFERFJFU1MsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0FERFJFU1M7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQVBQTEVULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEFQUExFVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTU0NmY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQVBQTEVULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogQVBQTEVULgotICovCi1maW5hbCBjbGFzcyBIZWRBUFBMRVQgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRBUFBMRVQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQVBQTEVULCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9QQVJBTV9DT05UQUlORVI7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWNvcmVhdHRyczsKLQkgKiAoY29kZWJhc2UgJVVSSTsgI0lNUExJRUQpCi0JICogKGFyY2hpdmUgQ0RBVEEgI0lNUExJRUQpCi0JICogKGNvZGUgQ0RBVEEgI0lNUExJRUQpCi0JICogKG9iamVjdCBDREFUQSAjSU1QTElFRCkKLQkgKiAoYWx0ICVUZXh0OyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHdpZHRoICVMZW5ndGg7ICNSRVFVSVJFRCkKLQkgKiAoaGVpZ2h0ICVMZW5ndGg7ICNSRVFVSVJFRCkKLQkgKiAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpCi0JICogKGhzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAodnNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChtYXlzY3JpcHQgKG1heXNjcmlwdCkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlY29yZWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENvcmUoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0RFQkFTRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BUkNISVZFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPREUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT0JKRUNULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IU1BBQ0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVlNQQUNFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01BWVNDUklQVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vICVhbGlnbjsgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JJbWFnZSgpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRBUkVBLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEFSRUEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FmYWQwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEFSRUEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBBUkVBLgotICovCi1maW5hbCBjbGFzcyBIZWRBUkVBIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEFSRUEoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQVJFQSwgY29sbGVjdGlvbik7Ci0JCS8vIExBWU9VVF9ISURERU4uCi0JCS8vIEJlY2F1c2UsIEFSRUEgaXMgR1JPVVBfSElEREVOIGluIHRoZSBDKytET00vRFREUGFyc2VyLmNwcC4KLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogQVJFQS4KLQkgKiAlYXR0cnM7Ci0JICogKHNoYXBlICVTaGFwZTsgcmVjdCkKLQkgKiAoY29vcmRzICVDb29yZHM7ICNJTVBMSUVEKQotCSAqIChocmVmICVVUkk7ICNJTVBMSUVEKQotCSAqICh0YXJnZXQgJUZyYW1lVGFyZ2V0OyAjSU1QTElFRCkKLQkgKiAobm9ocmVmIChub2hyZWYpICNJTVBMSUVEKQotCSAqIChhbHQgJVRleHQ7ICNSRVFVSVJFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uYmx1ciAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSEFQRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT09SRFMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQVJHRVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTk9IUkVGLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQUJJTkRFWCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ0NFU1NLRVksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05GT0NVUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkJMVVJ9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJBU0UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQkFTRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTI4ODE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQkFTRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIEJBU0UuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEJBU0UgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQkFTRShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFLCBjb2xsZWN0aW9uKTsKLQkJLy8gTEFZT1VUX0hJRERFTi4KLQkJLy8gQmVjYXVzZSwgQkFTRSBpcyBHUk9VUF9ISURERU4gaW4gdGhlIEMrK0RPTS9EVERQYXJzZXIuY3BwLgotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBCQVNFLgotCSAqIChocmVmICVVUkk7ICNJTVBMSUVEKQotCSAqICh0YXJnZXQgJUZyYW1lVGFyZ2V0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQVJHRVR9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJBU0VGT05ULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJBU0VGT05ULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOTEwOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCQVNFRk9OVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIEJBU0VGT05ULgotICovCi1maW5hbCBjbGFzcyBIZWRCQVNFRk9OVCBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRCQVNFRk9OVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFRk9OVCwgY29sbGVjdGlvbik7Ci0JCS8vIExBWU9VVF9PQkpFQ1QgLSBHUk9VUF9OT1dSQVAuCi0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqIEJBU0VGT05ULgotCSAqIChpZCBJRCAjSU1QTElFRCkKLQkgKiAoc2l6ZSBDREFUQSAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgbG9jYWx5IGRlZmluZWQuCi0JICogKGNvbG9yICVDb2xvcjsgI0lNUExJRUQpCi0JICogKGZhY2UgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0lELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTE9SLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZBQ0V9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAoc2l6ZSBDREFUQSAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgbG9jYWx5IGRlZmluZWQuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0dHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQkRPLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJETy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2VlNTFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQkRPLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICogQkRPLgotICovCi1maW5hbCBjbGFzcyBIZWRCRE8gZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEJETyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CRE8sIGNvbGxlY3Rpb24pOwotCQkvLyBDT1JSRUNUX0VNUFRZIC0gR1JPVVBfQ09NUEFDVAotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JfQotCi0JLyoqCi0JICogJWNvcmVhdHRyczsKLQkgKiAobGFuZyAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCkKLQkgKiAoZGlyIChsdHJ8cnRsKSAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWNvcmVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDb3JlKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTEFOR307Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vICAoZGlyIChsdHJ8cnRsKSAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9MVFIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JUTH07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RJUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RJUiwgYXR0cik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCR1NPVU5ELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJHU09VTkQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U3MzFkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJHU09VTkQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLQotCi1maW5hbCBjbGFzcyBIZWRCR1NPVU5EIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JcHVibGljIEhlZEJHU09VTkQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkdTT1VORCwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqIChzcmMsIENEQVRBLCAjSU1QTElFRCkKLQkgKiAobG9vcCwgQ0RBVEEsICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQkJLy8gc3JjCi0JCUhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbihIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQyk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgYXR0cik7Ci0JCS8vIGxvb3AKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9JTkZJTklURSk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xPT1AsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTE9PUCwgYXR0cik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCTE9DS1FVT1RFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJMT0NLUVVPVEUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFjYjYwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJMT0NLUVVPVEUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBCTE9DS1FVT1RFLgotICovCi1maW5hbCBjbGFzcyBIZWRCTE9DS1FVT1RFIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQkxPQ0tRVU9URShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CTE9DS1FVT1RFLCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoY2l0ZSAlVVJJOyAjSU1QTElFRCkgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DSVRFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQk9EWS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCT0RZLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMjRhOWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCT0RZLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci0KLS8qKgotICogQk9EWS4KLSAqLwotZmluYWwgY2xhc3MgSGVkQk9EWSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRlJBTUVTRVQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRCT0RZKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFksIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfQk9USDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogJWJvZHljb2xvcnM7Ci0JICogKG9ubG9hZCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob251bmxvYWQgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKGJhY2tncm91bmQgJVVSSTsgI0lNUExJRUQpCi0JICogKG1hcmdpbndpZHRoICVQaXhlbHM7ICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqIChtYXJnaW5oZWlnaHQgJVBpeGVsczsgI0lNUExJRUQpIC4uIEQyMDU1MTQKLQkgKiAodG9wbWFyZ2luLCBDREFUQSwgI0lNUExJRUQpIC4uLi4uLiBEMjA1NTE0Ci0JICogKGJvdHRvbW1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqIChsZWZ0bWFyZ2luLCBDREFUQSwgI0lNUExJRUQpIC4uLi4uIEQyMDU1MTQKLQkgKiAocmlnaHRtYXJnaW4sIENEQVRBLCAjSU1QTElFRCkgLi4uLiBEMjA1NTE0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVib2R5Y29sb3JzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEJvZHljb2xvcnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkxPQUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05VTkxPQUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQkFDS0dST1VORCwKLQkJLy8gPDxEMjA1NTE0Ci0JCQkJCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUFSR0lOV0lEVEgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUFSR0lOSEVJR0hULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RPUE1BUkdJTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1RUT01NQVJHSU4sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTEVGVE1BUkdJTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9SSUdIVE1BUkdJTgotCQkvLyBEMjA1NTE0Ci0JCX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEluY2x1c2lvbi4KLQkgKiAiTGF6eSBldmFsLiI8YnI+Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudAotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0SW5jbHVzaW9uKCkgewotCQlpZiAoaW5jbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gaW5jbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gKElOU3xERUwpCi0JCWluY2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTlMsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERUx9OwotCQllbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoaW5jbHVzaW9uLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJcmV0dXJuIGluY2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBCT0RZIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWZhNmNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQlIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLQotLyoqCi0gKiBCUi4KLSAqLwotZmluYWwgY2xhc3MgSGVkQlIgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQlIoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlIsIGNvbGxlY3Rpb24pOwotCQkvLyBMQVlPVVRfQlJFQUsuCi0JCS8vIEJlY2F1c2UsIEJSIGlzIEdST1VQX0JSRUFLIGluIHRoZSBDKytET00vRFREUGFyc2VyLmNwcC4KLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CUkVBSzsKLQl9Ci0KLQkvKioKLQkgKiBCUi4KLQkgKiAlY29yZWF0dHJzOwotCSAqIChjbGVhciAobGVmdCB8IGFsbCB8IHJpZ2h0IHwgbm9uZSkgbm9uZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVjb3JlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQkJLy8gY2xlYXIKLQkJSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9uKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0xFQVIpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DTEVBUiwgYXR0cik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCVVRUT04uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQlVUVE9OLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NTQ5ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCVVRUT04uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogQlVUVE9OLgotICovCi1maW5hbCBjbGFzcyBIZWRCVVRUT04gZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRCVVRUT04oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlVUVE9OLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogJXJlc2VydmVkOyAuLi4gZW1wdHkuCi0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHZhbHVlIENEQVRBICNJTVBMSUVEKQotCSAqICh0eXBlIChidXR0b258c3VibWl0fHJlc2V0KSBzdWJtaXQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCSAqICh0YWJpbmRleCBOVU1CRVIgI0lNUExJRUQpCi0JICogKGFjY2Vzc2tleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkgKiAob25mb2N1cyAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxVRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVNBQkxFRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQUJJTkRFWCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ0NFU1NLRVksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05GT0NVUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkJMVVJ9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAodHlwZSAoYnV0dG9ufHN1Ym1pdHxyZXNldCkgc3VibWl0KSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfQlVUVE9OLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9TVUJNSVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JFU0VUfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5GT1JNPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT5GT1JNPC9jb2RlPiBpdHNlbGYuCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZmF0YWwKLQotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUk0sIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JU0lOREVYLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRklFTERTRVQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JRlJBTUV9OwotCQllbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoZXhjbHVzaW9uLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0Rm9ybWN0cmwoZXhjbHVzaW9uKTsKLQotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTn07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ0FQVElPTi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRDQVBUSU9OLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYjA3ZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRDQVBUSU9OLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0KLS8qKgotICogQ0FQVElPTi4KLSAqLwotZmluYWwgY2xhc3MgSGVkQ0FQVElPTiBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQ0FQVElPTihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DQVBUSU9OLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGFsaWduICVDQWxpZ247ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9yQ2FwdGlvbigpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRDRU5URVIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ0VOVEVSLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNTE4NGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRDRU5URVIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIENFTlRFUi4KLSAqLwotZmluYWwgY2xhc3MgSGVkQ0VOVEVSIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQ0VOVEVSKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNFTlRFUiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZENPTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRDT0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRmMzIyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZENPTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci0KLS8qKgotICogQ09MLgotICovCi1maW5hbCBjbGFzcyBIZWRDT0wgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQ09MKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNPTCwgY29sbGVjdGlvbik7Ci0JCS8vIExBWU9VVF9CTE9DSy4KLQkJLy8gQmVjYXVzZSwgQ09MIGlzIEdST1VQX0JMT0NLIGluIHRoZSBDKytET00vRFREUGFyc2VyLmNwcC4KLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiBDT0wuCi0JICogJWF0dHJzOwotCSAqIChzcGFuIE5VTUJFUiAxKQotCSAqICh3aWR0aCAlTXVsdGlMZW5ndGg7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAlY2VsbGhhbGlnbjsKLQkgKiAlY2VsbHZhbGlnbjsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvLyAoc3BhbiBOVU1CRVIgMSkKLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUEFOfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKHdpZHRoICVNdWx0aUxlbmd0aDsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk1VTFRJX0xFTkdUSCk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgYXR0cik7Ci0KLQkJLy8gJWNlbGxoYWxpZ247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q2VsbGhhbGlnbihhdHRyaWJ1dGVzKTsKLQkJLy8gJWNlbGx2YWxpZ247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q2VsbHZhbGlnbihhdHRyaWJ1dGVzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZENPTEdST1VQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZENPTEdST1VQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMmU3NGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRDT0xHUk9VUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotCi0vKioKLSAqIENPTEdST1VQLgotICovCi1maW5hbCBjbGFzcyBIZWRDT0xHUk9VUCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNPTEdST1VQLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0FQVElPTiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRIRUFELCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEJPRFksIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URk9PVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRSfTsKLQotCXB1YmxpYyBIZWRDT0xHUk9VUChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DT0xHUk9VUCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfQ09MVU1OX0dST1VQOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChzcGFuIE5VTUJFUiAxKQotCSAqICh3aWR0aCAlTXVsdGlMZW5ndGg7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAlY2VsbGhhbGlnbjsKLQkgKiAlY2VsbHZhbGlnbjsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gJWNlbGxoYWxpZ247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q2VsbGhhbGlnbihhdHRyaWJ1dGVzKTsKLQkJLy8gJWNlbGx2YWxpZ247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q2VsbHZhbGlnbihhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NQQU59OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAod2lkdGggJU11bHRpTGVuZ3RoOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTVVMVElfTEVOR1RIKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBMSSBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkREQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkREQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAwNGY4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZERELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIERELgotICovCi1maW5hbCBjbGFzcyBIZWRERCBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRER9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEREKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRELCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EX0RFRkFVTFQ7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIEREIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRESVYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRElWLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyY2QyYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRESVYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIERJVi4KLSAqLwotZmluYWwgY2xhc3MgSGVkRElWIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRElWKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJViwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVhbGlnbjsKLQkgKiAlcmVzZXJ2ZWQ7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVhbGlnbjsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvclBhcmFncmFwaCgpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JCS8vICVyZXNlcnZlZDsgLi4uIGVtcHR5Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkREwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkREwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ1ZjJmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZERMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogREwuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZERMIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkREwoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREwsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0RFRklOSVRJT05fTElTVDsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWFycmF5czsKLQkgKiAoY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09NUEFDVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZERULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZERULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Nzk3ZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWREVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBEVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkRFQgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRER9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZERUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRULCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EX0RFRkFVTFQ7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIERUIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRFTUJFRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRFTUJFRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWUzMDFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRU1CRUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLQotLyoqCi0gKiBFTUJFRC4KLSAqLwotZmluYWwgY2xhc3MgSGVkRU1CRUQgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRFTUJFRChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5FTUJFRCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRU1CRUQ7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EX0RFRkFVTFQ7Ci0JfQotCi0JLyoqCi0JICogJWNvcmVhdHRyczsKLQkgKiAlZXZlbnRzOwotCSAqIChzcmMgJVVSSTsgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoaGVpZ2h0ICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChoc3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKHZzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAobG9vcCBDREFUQSAjSU1QTElFRCkKLQkgKiAoaGlkZGVuIENEQVRBICNJTVBMSUVEKQotCSAqICh2b2x1bWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKGF1dG9zdGFydCAodHJ1ZXxmYWxzZSkgI0lNUExJRUQpCi0JICogKGF1dG9wbGF5ICh0cnVlfGZhbHNlKSAjSU1QTElFRCkKLQkgKiAoYXV0b3NpemUgKHRydWV8ZmFsc2UpICNJTVBMSUVEKQotCSAqIChjb250cm9sbGVyICh0cnVlfGZhbHNlKSB0cnVlKQotCSAqIChzY2FsZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoc2hvd2NvbnRyb2xzICh0cnVlfGZhbHNlKSAjSU1QTElFRCkKLQkgKiAocGxheWNvdW50IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAocmVwZWF0IENEQVRBICNJTVBMSUVEKQotCSAqIChwYW5lbCBDREFUQSAjSU1QTElFRCkKLQkgKiAodGV4dCBDREFUQSAjSU1QTElFRCkKLQkgKiAocGFsZXR0ZSBDREFUQSAjSU1QTElFRCkKLQkgKiAodGV4dGZvY3VzIENEQVRBICNJTVBMSUVEKQotCSAqICh0eXBlIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVjb3JlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQkJLy8gJWV2ZW50czsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRFdmVudHMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFNQQUNFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZTUEFDRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MT09QLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hJRERFTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WT0xVTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQVVUT1NUQVJULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FVVE9QTEFZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FVVE9TSVpFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTlRST0xMRVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0NBTEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0hPV0NPTlRST0xTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1BMQVlDT1VOVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9SRVBFQVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUEFORUwsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEVYVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9QQUxFVFRFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RFWFRGT0NVU307Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCS8vIChzcmMgJVVSSTsgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBhdHRyKTsKLQotCQkvLyAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvckltYWdlKCk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQotCQkvLyAodHlwZSBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRW1wdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRW1wdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyNGI4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEVtcHR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBFTVBUWSB0eXBlIGVsZW1lbnQgZGVjbGFyYXRpb25zLgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRFbXB0eSBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEVtcHR5KFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRU1QVFk7Ci0JCS8vIEVNUFRZIHR5cGUgaGFzIG5vIGVuZCB0YWcuCi0JCW9taXRUeXBlID0gT01JVF9FTkRfTVVTVDsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50Ljxicj4KLQkgKiBFTVBUWSB0eXBlIGFsd2F5cyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIDxicj4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50Ci0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50IHR5cGUuPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZJRUxEU0VULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZJRUxEU0VULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0N2ZiY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGSUVMRFNFVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogRklFTERTRVQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEZJRUxEU0VUIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRklFTERTRVQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRklFTERTRVQsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0ZJRUxEU0VUOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT04sIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGT05ULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZPTlQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFkZDQ1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZPTlQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLQotLyoqCi0gKiBGT05ULgotICovCi1maW5hbCBjbGFzcyBIZWRGT05UIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRGT05UKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPTlQsIGNvbGxlY3Rpb24pOwotCQkvLyBDT1JSRUNUX0VNUFRZIC0gR1JPVVBfQ09NUEFDVAotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JfQotCi0JLyoqCi0JICogJWNvcmVhdHRyczsKLQkgKiAlaTE4bjsKLQkgKiAoc2l6ZSBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGNvbG9yICVDb2xvcjsgI0lNUExJRUQpCi0JICogKGZhY2UgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlY29yZWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENvcmUoYXR0cmlidXRlcyk7Ci0JCS8vICVpMThuOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEkxOG4oYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0xPUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GQUNFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKHNpemUgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBhdHRyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZPUk0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRk9STS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTg2ZmFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRk9STS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGT1JNLgotICovCi1maW5hbCBjbGFzcyBIZWRGT1JNIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRk9STShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGFjdGlvbiAlVVJJOyAjUkVRVUlSRUQpCi0JICogKG1ldGhvZCAoR0VUfFBPU1QpIEdFVCkKLQkgKiAoZW5jdHlwZSAlQ29udGVudFR5cGU7ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKQotCSAqIChhY2NlcHQgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQpCi0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKG9uc3VibWl0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbnJlc2V0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqICh0YXJnZXQgJUZyYW1lVGFyZ2V0OyAjSU1QTElFRCkKLQkgKiAoYWNjZXB0LWNoYXJzZXQgJUNoYXJzZXRzOyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FDVElPTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NRVRIT0QsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRU5DVFlQRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ0NFUFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTlNVQk1JVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTlJFU0VULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBUkdFVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ0NFUFRfQ0hBUlNFVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5GT1JNPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT5GT1JNPC9jb2RlPiBpdHNlbGYuCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZmF0YWwKLQotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlDTU5vZGUgZm9ybSA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STSk7Ci0JCWlmIChmb3JtICE9IG51bGwpCi0JCQlleGNsdXNpb24uYXBwZW5kQ2hpbGQoZm9ybSk7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT04sIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRlJBTUUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRlJBTUUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4ZmUyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZSQU1FLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogRlJBTUUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEZSQU1FIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEZSQU1FKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZSQU1FLCBjb2xsZWN0aW9uKTsKLQkJLy8gTEFZT1VUX0hJRERFTi4KLQkJLy8gQmVjYXVzZSwgRlJBTUUgaXMgR1JPVVBfSElEREVOIGluIHRoZSBDKytET00vRFREUGFyc2VyLmNwcC4KLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogRlJBTUUuCi0JICogJWNvcmVhdHRyczsKLQkgKiAobG9uZ2Rlc2MgJVVSSTsgI0lNUExJRUQpCi0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHNyYyAlVVJJOyAjSU1QTElFRCkKLQkgKiAoZnJhbWVib3JkZXIgKDF8MCkgMSkKLQkgKiAobWFyZ2lud2lkdGggJVBpeGVsczsgI0lNUExJRUQpCi0JICogKG1hcmdpbmhlaWdodCAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAobm9yZXNpemUgKG5vcmVzaXplKSAjSU1QTElFRCkKLQkgKiAoc2Nyb2xsaW5nICh5ZXN8bm98YXV0bykgYXV0bykKLQkgKiAoYm9yZGVyY29sb3IgJUNvbG9yICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWNvcmVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDb3JlKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTE9OR0RFU0MsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRlJBTUVCT1JERVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUFSR0lOV0lEVEgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUFSR0lOSEVJR0hULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05PUkVTSVpFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NDUk9MTElORywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1JERVJDT0xPUiAvLyBEMjA1NTQKLQkJfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGUkFNRVNFVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGUkFNRVNFVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjAwMGRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRlJBTUVTRVQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLQotLyoqCi0gKiBGUkFNRVNFVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkRlJBTUVTRVQgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRGUkFNRVNFVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GUkFNRVNFVCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRlJBTUVTRVQ7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWNvcmVhdHRyczsKLQkgKiAocm93cyAlTXVsdGlMZW5ndGhzOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGNvbHMgJU11bHRpTGVuZ3RoczsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChvbmxvYWQgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9udW5sb2FkICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChmcmFtZWJvcmRlciAoeWVzfG5vKSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGJvcmRlciAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAoYm9yZGVyY29sb3IgJUNvbG9yICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqIChmcmFtZXNwYWNpbmcgQ0RBVEEgI0lNUExJRUQpIC4uLiBEMjE1Njg0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OTE9BRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTlVOTE9BRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1JERVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSQ09MT1IsIC8vIEQyMDU1MTQKLQkJCQkJSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GUkFNRVNQQUNJTkcgLy8gRDIxNTY4NAotCQl9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBudWxsOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBudWxsOwotCQkvLyAocm93cyAlTXVsdGlMZW5ndGhzOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5NVUxUSV9MRU5HVEgpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ST1dTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUk9XUywgYXR0cik7Ci0KLQkJLy8gKGNvbHMgJU11bHRpTGVuZ3RoczsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0xTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09MUywgYXR0cik7Ci0KLQkJLy8gKGZyYW1lYm9yZGVyICh5ZXN8bm8pICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9ZRVMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX05PfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GUkFNRUJPUkRFUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZSQU1FQk9SREVSLCBhdHRyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZsb3dDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRmxvd0NvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjIxMWIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRmxvd0NvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciAoJWZsb3c7KSogY29udGFpbmVycy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkRmxvd0NvbnRhaW5lciBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEZsb3dDb250YWluZXIoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9GTE9XX0NPTlRBSU5FUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZvbnRTdHlsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGb250U3R5bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg2YjE0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZvbnRTdHlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogJWZvbnRzdHlsZTsKLSAqLwotZmluYWwgY2xhc3MgSGVkRm9udFN0eWxlIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRGb250U3R5bGUoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJJRykgfHwgZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU01BTEwpKSB7Ci0JCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCX0KLQkJZWxzZSB7IC8vIEIsIEksIFUsIC4uLgotCQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0RVUExJQ0FURUQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCVN0cmluZyBteU5hbWUgPSBnZXRFbGVtZW50TmFtZSgpOwotCQlpZiAoIW15TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CSUcpICYmICFteU5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU01BTEwpKQotCQkJcmV0dXJuIEVNUFRZX01BUDsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QUkV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhFQUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSEVBRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTFhMDYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSEVBRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBIVE1MLgotICovCi1maW5hbCBjbGFzcyBIZWRIRUFEIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFksIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GUkFNRVNFVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUx9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEhFQUQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSEVBRDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JCW9taXRUeXBlID0gT01JVF9CT1RIOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbGwgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSBpbiB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHN1cGVyIGNsYXNzLgotCSAqIFRoZSA8Y29kZT5IRUFEPC9jb2RlPiBlbGVtZW50IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKLQkgKiA8dGFibGU+Ci0JICogPHRib2R5PgotCSAqICAgPHRyPgotCSAqICAgICA8dGg+TkFNRTwvdGg+PHRoPlRZUEU8L3RoPjx0aD5VU0FHRTwvdGg+PHRoPkRFRkFVTFQgKElOSVRJQUwpIFZBTFVFPC90aD48dGg+TUVNTzwvdGg+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+JWkxOG47PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+cHJvZmlsZTwvdGQ+PHRkPlVSSTwvdGQ+PHRkPiNJTVBMSUVEPC90ZD48dGQ+Ti9BPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqIDwvdGJvZHk+Ci0JICogPC90YWJsZT4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVpMThuOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEkxOG4oYXR0cmlidXRlcyk7Ci0JCS8vIHByb2ZpbGUKLQkJSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkZWMgPSBhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9uKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUFJPRklMRSk7Ci0JCWlmIChhZGVjICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1BST0ZJTEUsIGFkZWMpOwotCX0KLQotCS8qKgotCSAqIEhFQUQgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhSLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhSLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OGI1YzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRIUi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogSFIuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEhSIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEhSKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhSLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnMKLQkgKiAoYWxpZ24gKGxlZnR8Y2VudGVyfHJpZ2h0KSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKG5vc2hhZGUgKG5vc2hhZGUpICNJTVBMSUVEKQotCSAqIChzaXplICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAoY29sb3IgJUNvbG9yOyAjSU1QTElFRCkgLi4uIEQyMDU1MTQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvLyAoYWxpZ24gKGxlZnR8Y2VudGVyfHJpZ2h0KSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJU3RyaW5nW10gdmFsdWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0xFRlQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0NFTlRFUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUklHSFR9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0KLQkJLy8gdGhlIHJlc3QuCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTk9TSEFERSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTE9SIC8vIEQyMDU1MTQKLQkJfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YjYzMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIEhUTUwuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEhUTUwgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRIVE1MKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUwsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0hUTUw7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCQlvbWl0VHlwZSA9IE9NSVRfQk9USDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdXBlciBjbGFzcy4KLQkgKiBUaGUgPGNvZGU+SFRNTDwvY29kZT4gZWxlbWVudCBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0JICogPHRhYmxlPgotCSAqIDx0Ym9keT4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRoPk5BTUU8L3RoPjx0aD5UWVBFPC90aD48dGg+VVNBR0U8L3RoPjx0aD5ERUZBVUxUIChJTklUSUFMKSBWQUxVRTwvdGg+PHRoPk1FTU88L3RoPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPjxjb2RlPiVpMThuOzwvY29kZT48L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgICA8dGQ+e0BsaW5rIFBEQ01Eb2NJbXBsI2dldEF0dHJEZWNsYXJhdGlvbnNJMThufTwvdGQ+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+dmVyc2lvbjwvdGQ+PHRkPkNEQVRBPC90ZD48dGQ+I0ZJWEVEPC90ZD4KLQkgKiAgICAgPHRkPntAbGluayBIVE1MX1ZFUlNJT05fVFJBTlNJVElPTkFMfTwvdGQ+PHRkPmRlcGxlY2F0ZWQgaW4gSFRNTDQuMDE8L3RkPgotCSAqICAgPC90cj4KLQkgKiA8L3Rib2R5PgotCSAqIDwvdGFibGU+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlaTE4bjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRJMThuKGF0dHJpYnV0ZXMpOwotCQkvLyB2ZXJzaW9uCi0JCUhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjID0gYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbihIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZFUlNJT04pOwotCQlpZiAoYWRlYyAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WRVJTSU9OLCBhZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiBIVE1MIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRIZWFkaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhlYWRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExN2MxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhlYWRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIEhbMS02XS4KLSAqLwotZmluYWwgY2xhc3MgSGVkSGVhZGluZyBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSGVhZGluZyhTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFsbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc3VwZXIgY2xhc3MuCi0JICogVGhlIDxjb2RlPkgxPC9jb2RlPiBlbGVtZW50IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKLQkgKiA8dGFibGU+Ci0JICogPHRib2R5PgotCSAqICAgPHRyPgotCSAqICAgICA8dGg+TkFNRTwvdGg+PHRoPlRZUEU8L3RoPjx0aD5VU0FHRTwvdGg+PHRoPkRFRkFVTFQgKElOSVRJQUwpIFZBTFVFPC90aD48dGg+TUVNTzwvdGg+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+JWF0dHJzOzwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPiVhbGlnbjs8L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogPC90Ym9keT4KLQkgKiA8L3RhYmxlPgotCSAqIDxwPjxiPiVhbGlnbjs8L2I+IG1lYW5zIDxjb2RlPmFsaWduIChsZWZ0fGNlbnRlcnxyaWdodHxqdXN0aWZ5KSAjSU1QTElFRDwvY29kZT4uCi0JICogVW5mb3J0dW5hdGVseSwgdGhpcyA8Y29kZT5hbGlnbjwvY29kZT4gaXMgZGlmZmVyZW50IGZyb20gb25lIGluCi0JICogPGNvZGU+SU1HPC9jb2RlPiBvciA8Y29kZT5UQUJMRTwvY29kZT4uICBTbywgdGhlIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbgotCSAqIG9mIDxjb2RlPmFsaWduPC9jb2RlPiBzaG91bGQgYmUgbG9jYWx5IGNyZWF0ZWQgYW5kIGl0IHNob3VsZG4ndCBiZSByZWdpc3RlcmVkCi0JICogaW4gYSA8Y29kZT5IQ01Eb2NJbXBsPC9jb2RlPiBpbnN0YW5jZS48L3A+Ci0JICogPHA+SG93ZXZlciwgJWFsaWduIGlzIHVzZWQgaW4gc2V2YXJhbCB0aW1lcy4gIEkgd291bGRuJ3Qgd3JpdGUgc2FtZSBjb2RlCi0JICogaW4gbWFueSB0aW1lcy4gIFNvLCBJIGFkZCBhIG5ldyB1dGlsaXR5IG1ldGhvZCBpbnRvIDxjb2RlPkNNVXRpbDwvY29kZT4KLQkgKiB0byBjcmVhdGUgdGhlIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi48L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vIGFsaWduCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JQYXJhZ3JhcGgoKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZElGUkFNRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJRlJBTUUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkxNjE1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZElGUkFNRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIElGUkFNRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkSUZSQU1FIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSUZSQU1FKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklGUkFNRSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqICVjb3JlYXR0cnM7Ci0JICogKGxvbmdkZXNjICVVUkk7ICNJTVBMSUVEKQotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChzcmMgJVVSSTsgI0lNUExJRUQpCi0JICogKGZyYW1lYm9yZGVyICgxfDApIDEpCi0JICogKG1hcmdpbndpZHRoICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChtYXJnaW5oZWlnaHQgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKHNjcm9sbGluZyAoeWVzfG5vfGF1dG8pIGF1dG8pCi0JICogKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoaGVpZ2h0ICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVjb3JlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xPTkdERVNDLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZSQU1FQk9SREVSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01BUkdJTldJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01BUkdJTkhFSUdIVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TQ1JPTExJTkcsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRIfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gYWxpZ24KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvckltYWdlKCk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT059OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZElNRy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJTUcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUxODA1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZElNRy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogSU1HLgotICovCi1maW5hbCBjbGFzcyBIZWRJTUcgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSU1HKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklNRywgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqIElNRy4KLQkgKiAlYXR0cnM7Ci0JICogKHNyYyAlVVJJOyAjUkVRVUlSRUQpOiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChhbHQgJVRleHQ7ICNSRVFVSVJFRCkKLQkgKiAobG9uZ2Rlc2MgJVVSSTsgI0lNUExJRUQpCi0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKHVzZW1hcCAlVVJJOyAjSU1QTElFRCkKLQkgKiAoaXNtYXAgKGlzbWFwKSAjSU1QTElFRCkKLQkgKiAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpOiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChib3JkZXIgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKGhzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAodnNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChtYXBmaWxlICVVUkk7ICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCS8vIChzcmMgJVVSSTsgI1JFUVVJUkVEKTogc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbnVsbDsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbnVsbDsKLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBhdHRyKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MT05HREVTQywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9VU0VNQVAsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSVNNQVAsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hTUEFDRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WU1BBQ0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUFQRklMRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vIGFsaWduIChsb2NhbCk7IHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9ySW1hZ2UoKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUFJFfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJTlBVVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJTlBVVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGIzMDQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSU5QVVQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBJTlBVVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkSU5QVVQgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSU5QVVQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU5QVVQsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKiBJTlBVVC4KLQkgKiAlYXR0cnM7Ci0JICogKHR5cGUgJUlucHV0VHlwZTsgVEVYVCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHZhbHVlIENEQVRBICNJTVBMSUVEKQotCSAqIChjaGVja2VkIChjaGVja2VkKSAjSU1QTElFRCkKLQkgKiAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkgKiAocmVhZG9ubHkgKHJlYWRvbmx5KSAjSU1QTElFRCkKLQkgKiAoc2l6ZSBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKG1heGxlbmd0aCBOVU1CRVIgI0lNUExJRUQpCi0JICogKHNyYyAlVVJJOyAjSU1QTElFRCkKLQkgKiAoYWx0IENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAodXNlbWFwICVVUkk7ICNJTVBMSUVEKQotCSAqIChpc21hcCAoaXNtYXApICNJTVBMSUVEKQotCSAqICh0YWJpbmRleCBOVU1CRVIgI0lNUExJRUQpCi0JICogKGFjY2Vzc2tleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkgKiAob25mb2N1cyAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbnNlbGVjdCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25jaGFuZ2UgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKGFjY2VwdCAlQ29udGVudFR5cGVzOyAjSU1QTElFRCkKLQkgKiAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChpc3R5bGUgQ0RBVEEgI0lNUExJRUQpCi0JICogPDxEMjE1Njg0Ci0JICogKHdpZHRoIENEQVRBOyAjSU1QTElFRCkKLQkgKiAoaGVpZ2h0IENEQVRBOyAjSU1QTElFRCkKLQkgKiAoYm9yZGVyIENEQVRBOyAjSU1QTElFRCkKLQkgKiBEMjE1Njg0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbnVsbDsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbnVsbDsKLQkJLy8gKHR5cGUgJUlucHV0VHlwZTsgVEVYVCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCS8vIE5PVEU6ICVJbnB1dFR5cGUgaXMgRU5VTTsKLQkJLy8gKHRleHQgfCBwYXNzd29yZCB8IGNoZWNrYm94IHwgcmFkaW8gfCBzdWJtaXQgfCByZXNldCB8Ci0JCS8vICBmaWxlIHwgaGlkZGVuIHwgaW1hZ2UgfCBidXR0b24pCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfVEVYVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUEFTU1dPUkQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0NIRUNLQk9YLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9SQURJTywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfU1VCTUlULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9SRVNFVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfRklMRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfSElEREVOLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9JTUFHRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfQlVUVE9OfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1RFWFQpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0KLQkJLy8gKHNpemUgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBhdHRyKTsKLQotCQkvLyAoYWx0IENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTFQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTFQsIGF0dHIpOwotCi0JCS8vIChhbGlnbiAlSUFsaWduOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9ySW1hZ2UoKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0KLQkJLy8gdGhlIHJlc3QuCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxVRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DSEVDS0VELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RJU0FCTEVELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JFQURPTkxZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUFYTEVOR1RILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVVNFTUFQLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0lTTUFQLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBQklOREVYLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FDQ0VTU0tFWSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkZPQ1VTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OQkxVUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTlNFTEVDVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkNIQU5HRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ0NFUFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSVNUWUxFLAotCQkvLzw8RDIxNTY4NAotCQkJCQlIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1JERVIKLQkJLy88RDIxNTY4NAotCQl9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT059OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZElTSU5ERVguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSVNJTkRFWC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yzc0NGQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSVNJTkRFWC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogSVNJTkRFWC4KLSAqLwotZmluYWwgY2xhc3MgSGVkSVNJTkRFWCBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRJU0lOREVYKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklTSU5ERVgsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqIElTSU5ERVguCi0JICogJWNvcmVhdHRyczsKLQkgKiAlaTE4bjsKLQkgKiAocHJvbXB0ICVUZXh0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVjb3JlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQotCQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IGF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb24oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9QUk9NUFQpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9QUk9NUFQsIGF0dHIpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZElubGluZUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJbmxpbmVDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQwODIyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZElubGluZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciAoJWlubGluZTspKiBjb250YWluZXJzLgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRJbmxpbmVDb250YWluZXIgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqIEhlZElubGluZUNvbnRhaW5lci4KLQkgKiBAcGFyYW0gZWxlbWVudE5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEhlZElubGluZUNvbnRhaW5lcihTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0lOTElORV9DT05UQUlORVI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMQUJFTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMQUJFTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDAxMDMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTEFCRUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBMQUJFTC4KLSAqLwotZmluYWwgY2xhc3MgSGVkTEFCRUwgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZExBQkVMKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxBQkVMLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGZvciBJRFJFRiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGFjY2Vzc2tleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkgKiAob25mb2N1cyAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCS8vIChmb3IgSURSRUYgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuSURSRUYpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZPUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZPUiwgYXR0cik7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ0NFU1NLRVksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05GT0NVUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkJMVVJ9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+TEFCRUw8L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPkxBQkVMPC9jb2RlPiBpdHNlbGYuCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlDTU5vZGUgbGFiZWwgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxBQkVMKTsKLQkJaWYgKGxhYmVsICE9IG51bGwpCi0JCQlleGNsdXNpb24uYXBwZW5kQ2hpbGQobGFiZWwpOwotCi0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlVUVE9OLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEFCRUx9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExFR0VORC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMRUdFTkQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUzOTI4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExFR0VORC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIExFR0VORC4KLSAqLwotZmluYWwgY2xhc3MgSGVkTEVHRU5EIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRMRUdFTkQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEVHRU5ELCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAoYWNjZXNza2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCSAqIChhbGlnbiAlTEFsaWduOyAjSU1QTElFRCkgLi4uIHNodWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FDQ0VTU0tFWX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vIGFsaWduCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JMZWdlbmQoKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTEkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTEkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQzNzg1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIExJLgotICovCi1maW5hbCBjbGFzcyBIZWRMSSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRMSShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCW9taXRUeXBlID0gT01JVF9FTkRfREVGQVVMVDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKHR5cGUgJUxJU3R5bGU7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAodmFsdWUgTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvLyAodHlwZSAlTElTdHlsZTsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxJX1NUWUxFKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0KLQkJLy8gKHZhbHVlIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTFVFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUUsIGF0dHIpOwotCX0KLQotCS8qKgotCSAqIExJIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMSU5LLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExJTksuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlMTMyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExJTksuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotCi0vKioKLSAqIExJTksuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZExJTksgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTElOSyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSU5LLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogTElOSy4KLQkgKiAlYXR0cnM7Ci0JICogKGNoYXJzZXQgJUNoYXJzZXQ7ICNJTVBMSUVEKQotCSAqIChocmVmICVVUkk7ICNJTVBMSUVEKQotCSAqIChocmVmbGFuZyAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCkKLQkgKiAodHlwZSAlQ29udGVudFR5cGU7ICNJTVBMSUVEKTogc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAocmVsICVMaW5rVHlwZXM7ICNJTVBMSUVEKQotCSAqIChyZXYgJUxpbmtUeXBlczsgI0lNUExJRUQpCi0JICogKG1lZGlhICVNZWRpYURlc2M7ICNJTVBMSUVEKQotCSAqICh0YXJnZXQgJUZyYW1lVGFyZ2V0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NIQVJTRVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IUkVGTEFORywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9SRUwsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUkVWLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01FRElBLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBUkdFVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vICh0eXBlICVDb250ZW50VHlwZTsgI0lNUExJRUQpCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09OVEVOVF9UWVBFKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMaXN0SXRlbUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMaXN0SXRlbUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2NjZjYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTGlzdEl0ZW1Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgbGlzdCBpdGVtIGNvbnRhaW5lciBkZWNsYXJhdGlvbnMuCi0gKiAtIE9MLCBVTCwgTUVOVSwgRElSLgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRMaXN0SXRlbUNvbnRhaW5lciBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZExpc3RJdGVtQ29udGFpbmVyKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfTElfQ09OVEFJTkVSOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE1BUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNQVAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEzYzJhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE1BUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLQotCi0KLS8qKgotICogTUFQLgotICovCi1maW5hbCBjbGFzcyBIZWRNQVAgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRNQVAoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUFQLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9NQVA7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChuYW1lIENEQVRBICNSRVFVSVJFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvLyAobmFtZSBDREFUQSAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5Ci0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIGF0dHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUFSUVVFRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNQVJRVUVFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NjUzZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNQVJRVUVFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICogTUFSUVVFRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkTUFSUVVFRSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE1BUlFVRUUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUFSUVVFRSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoYmVoYXZpb3IgKHNjcm9sbHxzbGlkZXxhbHRlcm5hdGUpIHNjcm9sbCkKLQkgKiAoYmdjb2xvciAlQ29sb3I7ICNJTVBMSUVEKQotCSAqIChkaXJlY3Rpb24gKGxlZnR8cmlnaHR8dXB8ZG93bikgbGVmdCkKLQkgKiAoaGVpZ2h0IENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoaHNwYWNlIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGxvb3AgQ0RBVEEgI0lNUExJRUQpCi0JICogKHNjcm9sbGFtb3VudCBOVU1CRVIgI0lNUExJRUQpCi0JICogKHNjcm9sbGRlbGF5IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAodnNwYWNlIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKHdpZHRoIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAodHJ1ZXNwZWVkICh0cnVlc3BlZWQpICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQkVIQVZJT1IsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQkdDT0xPUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVJFQ1RJT04sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTE9PUCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TQ1JPTExBTU9VTlQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0NST0xMREVMQVksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFJVRVNQRUVEfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbnVsbDsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbnVsbDsKLQkJLy8gKGhlaWdodCBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hULCBhdHRyKTsKLQotCQkvLyAod2lkdGggQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBhdHRyKTsKLQotCQkvLyAoaHNwYWNlIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hTUEFDRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hTUEFDRSwgYXR0cik7Ci0KLQkJLy8gKHZzcGFjZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WU1BBQ0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WU1BBQ0UsIGF0dHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUVOVS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNRU5VLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNDI1NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNRU5VLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIE1FTlUvRElSLgotICovCi1maW5hbCBjbGFzcyBIZWRNRU5VIGV4dGVuZHMgSGVkTGlzdEl0ZW1Db250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE1FTlUoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBNRU5VL0RJUi4KLQkgKiAoY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT01QQUNUfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVzaW9uLgotCSAqIDxjb2RlPk1FTlUvRElSPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT4lYmxvY2s7PC9jb2RlPi4KLQkgKiAlYmxvY2s7IGlzOgotCSAqIFAgfCAlaGVhZGluZzsgfCAlbGlzdDsgfCAlcHJlZm9ybWF0dGVkOyB8IERMIHwgRElWIHwgQ0VOVEVSIHwKLQkgKiBOT1NDUklQVCB8IE5PRlJBTUVTIHwgQkxPQ0tRVU9URSB8IEZPUk0gfCBJU0lOREVYIHwgSFIgfAotCSAqIFRBQkxFIHwgRklFTERTRVQgfCBBRERSRVNTLgotCSAqICVoZWFkaW5nOyBpczogSDEgfCBIMiB8IEgzIHwgSDQgfCBINSB8IEg2LgotCSAqICVsaXN0OyBpcyA6IFVMIHwgT0wgfCBESVIgfCBNRU5VLgotCSAqICVwcmVmb3JtYXR0ZWQ7IGlzIFBSRS4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vICVibG9jazsKLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlAsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgyLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDMsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5INCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg1LCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDYsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5VTCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9MLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRMLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElWLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0VOVEVSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9TQ1JJUFQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0ZSQU1FUywgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJMT0NLUVVPVEUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSVNJTkRFWCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEFCTEUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GSUVMRFNFVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFERFJFU1N9OwotCQllbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoZXhjbHVzaW9uLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNRVRBLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE1FVEEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDViMjMyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE1FVEEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotCi0vKioKLSAqIE1FVEEuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE1FVEEgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTUVUQShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRVRBLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogTUVUQS4KLQkgKiAlaTE4bjsKLQkgKiAoaHR0cC1lcXVpdiBOQU1FICNJTVBMSUVEKQotCSAqIChuYW1lIE5BTUUgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChjb250ZW50IENEQVRBICNSRVFVSVJFRCkKLQkgKiAoc2NoZW1lIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQotCQkvLyAobmFtZSBOQU1FICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5OQU1FKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgYXR0cik7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IVFRQX0VRVUlWLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTlRFTlQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0NIRU1FfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNYXJrQ2hhbmdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNYXJrQ2hhbmdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmMzZDBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTWFya0NoYW5nZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiAoSU5TfERFTCkKLSAqLwotZmluYWwgY2xhc3MgSGVkTWFya0NoYW5nZXMgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRNYXJrQ2hhbmdlcyhTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoY2l0ZSAlVVJJOyAjSU1QTElFRCkKLQkgKiAoZGF0ZXRpbWUgJURhdGV0aW1lOyAjSU1QTElFRCkgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DSVRFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RBVEVUSU1FfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWROT0JSLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE5PQlIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJhZGJkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE5PQlIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogTk9CUiAtLSBub3Qgc3RhbmRhcmQgdGFnIGJ1dCBpdCBpcyBjb21tb25seSB1c2VkLgotICovCi1maW5hbCBjbGFzcyBIZWROT0JSIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCi0JcHVibGljIEhlZE5PQlIoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9CUiwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5DT1JSRUNUX0RVUExJQ0FURUQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQkvLyBObyBhdHRyaWJ1dGVzIGlzIGRlZmluZWQuCi0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWROT0VNQkVELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE5PRU1CRUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ3MTE2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE5PRU1CRUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLQotLyoqCi0gKiBOT0VNQkVELgotICovCi1maW5hbCBjbGFzcyBIZWROT0VNQkVEIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTk9FTUJFRChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0VNQkVELCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAlY29yZWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWNvcmVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDb3JlKGF0dHJpYnV0ZXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTk9GUkFNRVMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTk9GUkFNRVMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFkOTMxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE5PRlJBTUVTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogTk9GUkFNRVMuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE5PRlJBTUVTIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTk9GUkFNRVMoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9GUkFNRVMsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX05PRlJBTUVTX0NPTlRFTlQ7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+Tk9GUkFNRVM8L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPk5PRlJBTUVTPC9jb2RlPiBpdHNlbGYuCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlDTU5vZGUgbGFiZWwgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PRlJBTUVTKTsKLQkJaWYgKGxhYmVsICE9IG51bGwpCi0JCQlleGNsdXNpb24uYXBwZW5kQ2hpbGQobGFiZWwpOwotCi0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PRlJBTUVTfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWROT1NDUklQVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWROT1NDUklQVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzQ3YzIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTk9TQ1JJUFQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIE5PU0NSSVBULgotICovCi1maW5hbCBjbGFzcyBIZWROT1NDUklQVCBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE5PU0NSSVBUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PU0NSSVBULCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkT0JKRUNULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE9CSkVDVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDQ4ZTJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkT0JKRUNULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogT0JKRUNULgotICovCi1maW5hbCBjbGFzcyBIZWRPQkpFQ1QgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRPQkpFQ1QoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT0JKRUNULCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9QQVJBTV9DT05UQUlORVI7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVyZXNlcnZlZDsgLi4uIGVtcHR5LgotCSAqIChkZWNsYXJlIChkZWNsYXJlKSAjSU1QTElFRCkKLQkgKiAoY2xhc3NpZCAlVVJJOyAjSU1QTElFRCkKLQkgKiAoY29kZWJhc2UgJVVSSTsgI0lNUExJRUQpCi0JICogKGRhdGEgJVVSSTsgI0lNUExJRUQpCi0JICogKHR5cGUgJUNvbnRlbnRUeXBlOyAjSU1QTElFRCkKLQkgKiAoY29kZXR5cGUgJUNvbnRlbnRUeXBlOyAjSU1QTElFRCkKLQkgKiAoYXJjaGl2ZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoc3RhbmRieSAlVGV4dDsgI0lNUExJRUQpCi0JICogKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKHVzZW1hcCAlVVJJOyAjSU1QTElFRCkKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChhbGlnbiAlSUFsaWduOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGJvcmRlciAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAoaHNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqICh2c3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVyZXNlcnZlZDsgLi4uIGVtcHR5LgotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfREVDTEFSRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DTEFTU0lELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPREVCQVNFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RBVEEsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0RFVFlQRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BUkNISVZFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NUQU5EQlksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1VTRU1BUCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBQklOREVYLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IU1BBQ0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVlNQQUNFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCS8vICVhbGlnbjsgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JJbWFnZSgpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUFJFfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRPTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRPTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjY4YjkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkT0wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogT0wuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE9MIGV4dGVuZHMgSGVkTGlzdEl0ZW1Db250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE9MKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9MLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBPTC4KLQkgKiAodHlwZSAlT0xTdHlsZTsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChjb21wYWN0IChjb21wYWN0KSAjSU1QTElFRCkKLQkgKiAoc3RhcnQgTlVNQkVSICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCS8vICh0eXBlICVPTFN0eWxlOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuT0xfU1RZTEUpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHRyKTsKLQotCQkvLyB0aGUgcmVzdC4KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT01QQUNULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NUQVJUfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkT1BUR1JPVVAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkT1BUR1JPVVAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdhM2ZjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE9QVEdST1VQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBPUFRHUk9VUC4KLSAqLwotZmluYWwgY2xhc3MgSGVkT1BUR1JPVVAgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRPUFRHUk9VUChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRHUk9VUCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfT1BUSU9OX0NPTlRBSU5FUjsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKGxhYmVsICVUZXh0OyAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRElTQUJMRUR9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAobGFiZWwgJVRleHQ7ICNSRVFVSVJFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuVEVYVCk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTEFCRUwsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MQUJFTCwgYXR0cik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRPUFRJT04uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkT1BUSU9OLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMjVlZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRPUFRJT04uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogT1BUSU9OLgotICovCi1maW5hbCBjbGFzcyBIZWRPUFRJT04gZXh0ZW5kcyBIZWRQY2RhdGEgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTn07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkT1BUSU9OKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EOwotCX0KLQotCS8qKgotCSAqIE9QVElPTi4KLQkgKiAlYXR0cnM7Ci0JICogKHNlbGVjdGVkIChzZWxlY3RlZCkgI0lNUExJRUQpCi0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKGxhYmVsICVUZXh0OyAjSU1QTElFRCkKLQkgKiAodmFsdWUgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TRUxFQ1RFRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVNBQkxFRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MQUJFTCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxVRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIE9QVElPTiBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZmVlZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBQLgotICovCi1maW5hbCBjbGFzcyBIZWRQIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb24gdGVybWluYXRvcnMgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFAoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUCwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0VORDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdXBlciBjbGFzcy4KLQkgKiBUaGUgPGNvZGU+UDwvY29kZT4gZWxlbWVudCBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0JICogPHRhYmxlPgotCSAqIDx0Ym9keT4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRoPk5BTUU8L3RoPjx0aD5UWVBFPC90aD48dGg+VVNBR0U8L3RoPjx0aD5ERUZBVUxUIChJTklUSUFMKSBWQUxVRTwvdGg+PHRoPk1FTU88L3RoPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPiVhdHRyczs8L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD4lYWxpZ247PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqIDwvdGJvZHk+Ci0JICogPC90YWJsZT4KLQkgKiA8cD48Yj4lYWxpZ247PC9iPiBtZWFucyA8Y29kZT5hbGlnbiAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeSkgI0lNUExJRUQ8L2NvZGU+LgotCSAqIFVuZm9ydHVuYXRlbHksIHRoaXMgPGNvZGU+YWxpZ248L2NvZGU+IGlzIGRpZmZlcmVudCBmcm9tIG9uZSBpbgotCSAqIDxjb2RlPklNRzwvY29kZT4gb3IgPGNvZGU+VEFCTEU8L2NvZGU+LiAgU28sIHRoZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24KLQkgKiBvZiA8Y29kZT5hbGlnbjwvY29kZT4gc2hvdWxkIGJlIGxvY2FseSBjcmVhdGVkIGFuZCBpdCBzaG91bGRuJ3QgYmUgcmVnaXN0ZXJlZAotCSAqIGluIGEgPGNvZGU+SENNRG9jSW1wbDwvY29kZT4gaW5zdGFuY2UuPC9wPgotCSAqIDxwPkhvd2V2ZXIsICVhbGlnbiBpcyB1c2VkIGluIHNldmFyYWwgdGltZXMuICBJIHdvdWxkbid0IHdyaXRlIHNhbWUgY29kZQotCSAqIGluIG1hbnkgdGltZXMuICBTbywgSSBhZGQgYSBuZXcgdXRpbGl0eSBtZXRob2QgaW50byA8Y29kZT5DTVV0aWw8L2NvZGU+Ci0JICogdG8gY3JlYXRlIHRoZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vIGFsaWduCi0JCUhUTUxBdHRyRGVjbEltcGwgYWRlYyA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JQYXJhZ3JhcGgoKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYWRlYyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIG5hbWVzIG9mIHRlcm1pbmF0b3JzLgotCSAqIDxjb2RlPlA8L2NvZGU+IGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJaWYgKHRlcm1pbmF0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gdGVybWluYXRvcnMuaXRlcmF0b3IoKTsKLQkJLy88PEQyMTc5ODIKLQkJdGVybWluYXRvcnMgPSBuZXcgVmVjdG9yKCk7Ci0JCXRlcm1pbmF0b3JzLmFkZEFsbChlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lc09mQmxvY2soKSk7Ci0JCXRlcm1pbmF0b3JzLmFkZChIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEkpOwotCQl0ZXJtaW5hdG9ycy5hZGQoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRUKTsKLQkJdGVybWluYXRvcnMuYWRkKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERCk7Ci0JCS8vRDIxNzk4MgotCQlyZXR1cm4gdGVybWluYXRvcnMuaXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFBBUkFNLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFBBUkFNLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NDFhMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQQVJBTS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIFBBUkFNLgotICovCi1maW5hbCBjbGFzcyBIZWRQQVJBTSBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRQQVJBTShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QQVJBTSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCX0KLQotCS8qKgotCSAqIFBBUkFNLgotCSAqIChpZCBJRCAjSU1QTElFRCkKLQkgKiAobmFtZSBDREFUQSAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkgKiAodmFsdWV0eXBlIChEQVRBfFJFRnxPQkpFQ1QpIERBVEEpCi0JICogKHR5cGUgJUNvbnRlbnRUeXBlOyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUVUWVBFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAobmFtZSBDREFUQSAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBhdHRyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFBSRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQUkUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJhMzQ3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFBSRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFBSRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkUFJFIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqIFBSRSBlbGVtZW50IHNob3VsZCBrZWVwIHNwYWNlcyBpbiBpdHMgc291cmNlLgotCSAqLwotCXB1YmxpYyBIZWRQUkUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUFJFLCBjb2xsZWN0aW9uKTsKLQkJLy8gQ09SUkVDVF9FTVBUWSAtIEdST1VQX0NPTVBBQ1QKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCi0JCWtlZXBTcGFjZXMgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAod2lkdGggTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gKHdpZHRoIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIGF0dHIpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5QUkU8L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPiVwcmUuZXhjbHVzaW9uOzwvY29kZT4uCi0JICogJXByZS5leGNsdXNpb24gaXM6Ci0JICogSU1HIHwgT0JKRUNUIHwgQVBQTEVUIHwgQklHIHwgU01BTEwgfCBTVUIgfCBTVVAgfCBGT05UIHwgQkFTRUZPTlQKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTUcsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PQkpFQ1QsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BUFBMRVQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CSUcsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TTUFMTCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNVQiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNVUCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPTlQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFRk9OVH07Ci0JCWVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhleGNsdXNpb24sIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUGNkYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFBjZGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTYxNDk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUGNkYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBQQ0RBVEEgdHlwZSBlbGVtZW50IGRlY2xhcmF0aW9ucy48YnI+Ci0gKi8KLWFic3RyYWN0IGNsYXNzIEhlZFBjZGF0YSBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFBjZGF0YShTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1BDREFUQTsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50Ljxicj4KLQkgKiBQQ0RBVEEgdHlwZSBhbHdheXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8YnI+Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudAotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudCB0eXBlLjxicj4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUGhyYXNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFBocmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTY4MGQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUGhyYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi0vKioKLSAqICVwaHJhc2U7Ci0gKi8KLWZpbmFsIGNsYXNzIEhlZFBocmFzZSBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkUGhyYXNlKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5DT1JSRUNUX0RVUExJQ0FURUQ7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRRLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NWI3NTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRRLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogUS4KLSAqLwotZmluYWwgY2xhc3MgSGVkUSBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkUShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5RLCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0RVUExJQ0FURUQ7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChjaXRlICVVUkk7ICNJTVBMSUVEKSAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DSVRFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTQ1JJUFQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU0NSSVBULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOTEwYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTQ1JJUFQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotCi0vKioKLSAqIFNDUklQVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkU0NSSVBUIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU0NSSVBUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfQ0RBVEE7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqIFNDUklQVC4KLQkgKiAoY2hhcnNldCAlQ2hhcnNldDsgI0lNUExJRUQpCi0JICogKHR5cGUgJUNvbnRlbnRUeXBlOyAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChsYW5ndWFnZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoc3JjICVVUkk7ICNJTVBMSUVEKQotCSAqIChkZWZlciAoZGVmZXIpICNJTVBMSUVEKQotCSAqIChldmVudCBDREFUQSAjSU1QTElFRCkKLQkgKiAoZm9yICVVUkk7ICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DSEFSU0VULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xBTkdVQUdFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ERUZFUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9FVkVOVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GT1J9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAodHlwZSAlQ29udGVudFR5cGU7ICNSRVFVSVJFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09OVEVOVF9UWVBFKTsKLQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCAidGV4dC9qYXZhc2NyaXB0Iik7IC8vJE5PTi1OTFMtMSQKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+U0NSSVBUPC9jb2RlPiBpcyBDREFUQSB0eXBlLgotCSAqIFNvLCB0aGUgbWV0aG9kIGFsd2F5cyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIDxicj4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50Ci0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDREFUQSBjb250ZW50Ljxicj4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNFTEVDVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTRUxFQ1QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhjM2EwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNFTEVDVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogU0VMRUNULgotICovCi1maW5hbCBjbGFzcyBIZWRTRUxFQ1QgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTRUxFQ1QoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0VMRUNULCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9TRUxFQ1Q7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVyZXNlcnZlZDsKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoc2l6ZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChtdWx0aXBsZSAobXVsdGlwbGUpICNJTVBMSUVEKQotCSAqIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCSAqICh0YWJpbmRleCBOVU1CRVIgI0lNUExJRUQpCi0JICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uYmx1ciAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25jaGFuZ2UgJVNjcmlwdDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKHNpemUgTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0dHIpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NVUxUSVBMRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVNBQkxFRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQUJJTkRFWCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkZPQ1VTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OQkxVUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkNIQU5HRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTn07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1BBTi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTUEFOLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOTMyZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTUEFOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0KLS8qKgotICogU1BBTi4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1BBTiBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKiBTUEFOLgotCSAqLwotCXB1YmxpYyBIZWRTUEFOKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNQQU4sIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAlcmVzZXJ2ZWQ7IC4uLiBlbXB0eS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUJhc2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmM3YTgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotCi0KLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBTU0kgZGVjbGFyYXRpb25zLgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRTU0lCYXNlIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUJhc2UoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRGb3JtYXRUeXBlKCkgewotCQlyZXR1cm4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfU1NJOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wTmFtZSkgewotCQlpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfU1NJKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gc3VwZXIuc3VwcG9ydHMocHJvcE5hbWUpOwotCX0KLQotCS8qCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcE5hbWUpIHsKLQkJaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1NTSSkpCi0JCQlyZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eShwcm9wTmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lDb25maWcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NDA2YTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBTU0k6Q09ORklHLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lDb25maWcgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lDb25maWcoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0NPTkZJRywgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOkNPTkZJRy4KLQkgKiAoZXJybXNnIENEQVRBICNJTVBMSUVEKQotCSAqIChzaXplZm10IENEQVRBICNJTVBMSUVEKQotCSAqICh0aW1lZm10IENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9FUlJNU0csIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRUZNVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9USU1FRk1UfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lFY2hvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUVjaG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczODgxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUVjaG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBTU0k6RUNITy4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJRWNobyBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUVjaG8oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0VDSE8sIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpFQ0hPCi0JICogKHZhciBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFSfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lFeGVjLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUV4ZWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgyNGQ1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUV4ZWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBTU0k6RVhFQy4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJRXhlYyBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUV4ZWMoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0VYRUMsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpFWEVDCi0JICogKGNnaSAlVVJJOyAjSU1QTElFRCkKLQkgKiAoY21kIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DR0ksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ01EfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lGbGFzdG1vZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lGbGFzdG1vZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGViZGY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJRmxhc3Rtb2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBTU0k6RkxBU1RNT0QuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSUZsYXN0bW9kIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJRmxhc3Rtb2QoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0ZMQVNUTU9ELCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6RkxBU1RNT0QKLQkgKiAoZmlsZSAlVVJJOyAjSU1QTElFRCkKLQkgKiAodmlydHVhbCAlVVJJICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GSUxFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZJUlRVQUx9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUZzaXplLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUZzaXplLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYmRiZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lGc2l6ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIFNTSTpGU0laRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJRnNpemUgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lGc2l6ZShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRlNJWkUsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpGU0laRQotCSAqIChmaWxlICVVUkk7ICNJTVBMSUVEKQotCSAqICh2aXJ0dWFsICVVUkkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZJTEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVklSVFVBTH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJSW5jbHVkZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lJbmNsdWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMjI0ZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lJbmNsdWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogU1NJOklOQ0xVREUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSUluY2x1ZGUgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lJbmNsdWRlKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9JTkNMVURFLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6SU5DTFVERQotCSAqIChmaWxlICVVUkk7ICNJTVBMSUVEKQotCSAqICh2aXJ0dWFsICVVUkkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZJTEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVklSVFVBTH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJUHJpbnRlbnYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJUHJpbnRlbnYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMxMGI1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSVByaW50ZW52LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBTU0k6UFJJTlRFTlYuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSVByaW50ZW52IGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJUHJpbnRlbnYoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX1BSSU5URU5WLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCX0KLQotCS8qKgotCSAqIFNTSTpQUklOVEVOViBoYXMgbm8gYXR0cmlidXRlcy4gIFNvLCB0aGlzIG1ldGhvZCBzaG91bGQKLQkgKiBhbHdheXMgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIE5vdGU6IFNpbmNlIHNvbWVib2R5IGRvZXNuJ3QgZXhwZWN0IG51bGwgaXMgcmV0dXJuZWQsIHJldHVybiB0aGUgZW1wdHkgYXR0cmlidXRlCi0JICogbGlrZSBhIGN1c3RvbSB0YWcgd2hpY2ggZG9lc24ndCBoYXZlIGF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSVNldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyYjg1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIFNTSTpTRVQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSVNldCBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSVNldChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfU0VULCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6U0VUCi0JICogKHZhciBDREFUQSAjSU1QTElFRCkKLQkgKiAodmFsdWUgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxVRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1RZTEUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1RZTEUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1YjdmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNUWUxFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBTVFlMRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1RZTEUgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTVFlMRShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfQ0RBVEE7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCX0KLQotCS8qKgotCSAqIFNUWUxFCi0JICogJWkxOG47Ci0JICogKHR5cGUgJUNvbnRlbnRUeXBlOyAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChtZWRpYSAlTWVkaWFEZXNjOyAjSU1QTElFRCkKLQkgKiAodGl0bGUgJVRleHQ7ICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01FRElBLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RJVExFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCS8vICh0eXBlICVDb250ZW50VHlwZTsgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT05URU5UX1RZUEUpOwotCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsICJ0ZXh0L2NzcyIpOyAvLyROT04tTkxTLTEkCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQuPGJyPgotCSAqIDxjb2RlPlNUWUxFPC9jb2RlPiBpcyBDREFUQSBjb250ZW50IHR5cGUuICBTbywgaXQgYWx3YXlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudAotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ0RBVEEgY29udGVudC48YnI+Ci0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTY3JpcHRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNjcmlwdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZiZjcwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNjcmlwdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFNVQiBhbmQgU1VQLgotICovCi1maW5hbCBjbGFzcyBIZWRTY3JpcHRzIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTY3JpcHRzKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUFJFfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUQUJMRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUQUJMRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWQyNjdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVEFCTEUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFRBQkxFLgotICovCi1maW5hbCBjbGFzcyBIZWRUQUJMRSBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFRBQkxFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9UQUJMRTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFRBQkxFLgotCSAqICVhdHRyczsKLQkgKiAlcmVzZXJ2ZWQ7Ci0JICogKHN1bW1hcnkgJVRleHQ7ICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAoYm9yZGVyICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChmcmFtZSAlVEZyYW1lOyAjSU1QTElFRCkKLQkgKiAocnVsZXMgJVRSdWxlczsgI0lNUExJRUQpCi0JICogKGNlbGxzcGFjaW5nICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqIChjZWxscGFkZGluZyAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAoYWxpZ24gJVRBbGlnbjsgI0lNUExJRUQpCi0JICogKGJnY29sb3IgJUNvbG9yOyAjSU1QTElFRCkKLQkgKiAoZGF0YXBhZ2VzaXplIENEQVRBICNJTVBMSUVEKQotCSAqIChoZWlnaHQgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKGJhY2tncm91bmQgJVVSSTsgI0lNUExJRUQpCi0JICogKGJvcmRlcmNvbG9yICVDb2xvciAjSU1QTElFRCkgLi4uIEQyMDU1MTQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gJXJlc2VydmVkOwotCQkvLyAuLi4gJXJlc2VydmVkOyBpcyBlbXB0eSBpbiB0aGUgY3VycmVudCBEVEQuCi0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TVU1NQVJZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GUkFNRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9SVUxFUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DRUxMU1BBQ0lORywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DRUxMUEFERElORywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CR0NPTE9SLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RBVEFQQUdFU0laRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQkFDS0dST1VORCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1JERVJDT0xPUiAvLyBEMjA1NTE0Ci0JCX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vIGFsaWduIChsb2NhbCkKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQlTdHJpbmdbXSBhbGlnblZhbHVlcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9MRUZULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9DRU5URVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JJR0hUfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyhhbGlnblZhbHVlcyk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYWRlYyA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYWRlYyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVEVYVEFSRUEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVEVYVEFSRUEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhhNjFjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRFWFRBUkVBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogVEVYVEFSRUEuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFRFWFRBUkVBIGV4dGVuZHMgSGVkUGNkYXRhIHsKLQotCS8qKgotCSAqIFRFWFRBUkVBIHNob3VsZCBrZWVwIHNwYWNlcyBpbiBpdHMgc291cmNlLgotCSAqLwotCXB1YmxpYyBIZWRURVhUQVJFQShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URVhUQVJFQSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCi0JCWtlZXBTcGFjZXMgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFRFWFRBUkVBLgotCSAqICVhdHRyczsKLQkgKiAlcmVzZXJ2ZWQ7IC4uLiBlbXB0eQotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChyb3dzIE5VTUJFUiAjUkVRVUlSRUQpCi0JICogKGNvbHMgTlVNQkVSICNSRVFVSVJFRCkKLQkgKiAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkgKiAocmVhZG9ubHkgKHJlYWRvbmx5KSAjSU1QTElFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uYmx1ciAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25zZWxlY3QgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uY2hhbmdlICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChpc3R5bGUgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ST1dTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTFMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRElTQUJMRUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUkVBRE9OTFksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFCSU5ERVgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNDRVNTS0VZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09ORk9DVVMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05CTFVSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OU0VMRUNULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OQ0hBTkdFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0lTVFlMRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTn07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVElUTEUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVElUTEUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkxOTAwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRJVExFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLQotLyoqCi0gKiBUSVRMRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkVElUTEUgZXh0ZW5kcyBIZWRQY2RhdGEgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFRJVExFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRJVExFLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogVElUTEUuCi0JICogJWkxOG47Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlaTE4bjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRJMThuKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5USVRMRTwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+JWhlYWQubWlzYzs8L2NvZGU+LgotCSAqICVoZWFkLm1pc2M7IGlzIDxjb2RlPlNDUklQVHxTVFlMRXxNRVRBfExJTkt8T0JKRUNUPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIChTQ1JJUFR8U1RZTEV8TUVUQXxMSU5LfE9CSkVDVCkKLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRVRBLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTElOSywgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9CSkVDVH07Ci0JCWVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhleGNsdXNpb24sIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVFIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVFIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY4YTU0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRSLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIFRSLgotICovCi1maW5hbCBjbGFzcyBIZWRUUiBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRSfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRUUihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUiwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfVENFTExfQ09OVEFJTkVSOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVjZWxsaGFsaWduOwotCSAqICVjZWxsdmFsaWduOwotCSAqIChiZ2NvbG9yICVDb2xvcjsgI0lNUExJRUQpCi0JICogKGJhY2tncm91bmQgJVVSSTsgI0lNUExJRUQpCi0JICogKGJvcmRlcmNvbG9yICVDb2xvciAjSU1QTElFRCkgLi4uIEQyMDU1MTQKLQkgKiAoaGVpZ2h0ICVMZW5ndGggI0lNUExJRUQpIGJ1ZzIyNDYKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gJWNlbGxoYWxpZ247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q2VsbGhhbGlnbihhdHRyaWJ1dGVzKTsKLQkJLy8gJWNlbGx2YWxpZ247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q2VsbHZhbGlnbihhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JHQ09MT1IsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQkFDS0dST1VORCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1JERVJDT0xPUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQgLy8gRDIwNTUxNAotCQl9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBUUiBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVGFibGVCb2R5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRhYmxlQm9keS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjZlZWVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVGFibGVCb2R5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIFRIRUFEL1RGT09UL1RCT0RZCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFRhYmxlQm9keSBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNBUFRJT04sIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DT0wsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DT0xHUk9VUCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRIRUFELCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEJPRFksIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URk9PVH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkVGFibGVCb2R5KFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfVFJfQ09OVEFJTkVSOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCWlmIChlbGVtZW50TmFtZSA9PSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEJPRFkpIHsKLQkJCW9taXRUeXBlID0gT01JVF9CT1RIOwotCQl9Ci0JCWVsc2UgewotCQkJb21pdFR5cGUgPSBPTUlUX0VORDsKLQkJfQotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogVEJPRFkvVEZPT1QvVEhFQUQKLQkgKiAlYXR0cnM7Ci0JICogJWNlbGxoYWxpZ247Ci0JICogJWNlbGx2YWxpZ247Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVjZWxsaGFsaWduOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENlbGxoYWxpZ24oYXR0cmlidXRlcyk7Ci0JCS8vICVjZWxsdmFsaWduOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENlbGx2YWxpZ24oYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICogVEhFQUQsIFRGT09UIGFuZCBUQk9EWSBoYXZlIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRhYmxlQ2VsbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUYWJsZUNlbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRmY2I0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRhYmxlQ2VsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiAoVEggfCBURCkuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFRhYmxlQ2VsbCBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEgsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkVGFibGVDZWxsKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCW9taXRUeXBlID0gT01JVF9FTkQ7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChhYmJyICVUZXh0OyAjSU1QTElFRCkKLQkgKiAoYXhpcyBDREFUQSAjSU1QTElFRCkKLQkgKiAoaGVhZGVycyBJRFJFRlMgI0lNUExJRUQpCi0JICogKHNjb3BlICVTY29wZTsgI0lNUExJRUQpCi0JICogKHJvd3NwYW4gTlVNQkVSIDEpCi0JICogKGNvbHNwYW4gTlVNQkVSIDEpCi0JICogJWNlbGxoYWxpZ247Ci0JICogJWNlbGx2YWxpZ247Ci0JICogKG5vd3JhcCAobm93cmFwKSAjSU1QTElFRCkKLQkgKiAoYmdjb2xvciAlQ29sb3I7ICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAoaGVpZ2h0ICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqIChiYWNrZ3JvdW5kICVVUkk7ICNJTVBMSUVEKQotCSAqIChib3JkZXJjb2xvciAlQ29sb3IgI0lNUExJRUQpIC4uLiBEMjA1NTE0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVjZWxsaGFsaWduOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENlbGxoYWxpZ24oYXR0cmlidXRlcyk7Ci0JCS8vICVjZWxsdmFsaWduOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENlbGx2YWxpZ24oYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQkJSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FYSVMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVBREVSUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TQ09QRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ST1dTUEFOLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTFNQQU4sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTk9XUkFQLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JHQ09MT1IsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JBQ0tHUk9VTkQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSQ09MT1IgLy8gRDIwNTUxNAotCQl9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBUSCBhbmQgVEQgaGF2ZSB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRVTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRVTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDFjNWE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFVMLgotICovCi1maW5hbCBjbGFzcyBIZWRVTCBleHRlbmRzIEhlZExpc3RJdGVtQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRVTChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5VTCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVUwuCi0JICogKHR5cGUgJVVMU3R5bGU7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKHR5cGUgJVVMU3R5bGU7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJLy8gJVVMU3R5bGU7IGlzIChkaXNjfHNxdWFyZXxjaXJjbGUpLgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9ESVNDLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9TUVVBUkUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0NJUkNMRX07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0KLQkJLy8gdGhlIHJlc3QuCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09NUEFDVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFdCUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRXQlIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk1OGZlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFdCUi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotCi1maW5hbCBjbGFzcyBIZWRXQlIgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQlwdWJsaWMgSGVkV0JSKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLldCUiwgY29sbGVjdGlvbik7Ci0JCS8vIExBWU9VVF9CUkVBSy4KLQkJLy8gc2FtZSBhcyBCUi4KLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CUkVBSzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCS8vIE5vIGF0dHJpYnV0ZXMgaXMgZGVmaW5lZC4KLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pDTTIwRG9jSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KQ00yMERvY0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3YjU5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pDTTIwRG9jSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIENNRG9jdW1lbnQgZm9yIEpTUCAyLjAuCi0gKi8KLWNsYXNzIEpDTTIwRG9jSW1wbCBleHRlbmRzIEpDTURvY0ltcGwgewotCS8qKgotCSAqIEpDTTIwRG9jSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBKQ00yMERvY0ltcGwoU3RyaW5nIGRvY1R5cGVOYW1lLCBDTU5hbWVzcGFjZUltcGwgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0JCXN1cGVyKGRvY1R5cGVOYW1lLCB0YXJnZXROYW1lc3BhY2UsIG5ldyBKU1AyMEVsZW1lbnRDb2xsZWN0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSkNNRG9jSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KQ01Eb2NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZmU0ZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KQ01Eb2NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBDTURvY3VtZW50IGZvciBKU1AgMS4xIGFuZCBKU1AgMS4yLgotICovCi1jbGFzcyBKQ01Eb2NJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIEpTUENNRG9jdW1lbnQgewotCi0JLyoqIE5hbWVzcGFjZSBmb3IgYWxsIG5hbWVzIG9mIGVsZW1lbnRzLCBlbnRpdGllcyBhbmQgYXR0cmlidXRlcy4gKi8KLQlwcml2YXRlIENNTmFtZXNwYWNlSW1wbCBuYW1lc3BhY2UgPSBudWxsOwotCXByaXZhdGUgSlNQRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudHMgPSBudWxsOwotCi0JLyoqCi0JICogSENNRG9jSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBKQ01Eb2NJbXBsKFN0cmluZyBkb2NUeXBlTmFtZSwgQ01OYW1lc3BhY2VJbXBsIHRhcmdldE5hbWVzcGFjZSkgewotCQl0aGlzKGRvY1R5cGVOYW1lLCB0YXJnZXROYW1lc3BhY2UsIG5ldyBKU1BFbGVtZW50Q29sbGVjdGlvbigpKTsKLQl9Ci0KLQlKQ01Eb2NJbXBsKFN0cmluZyBkb2NUeXBlTmFtZSwgQ01OYW1lc3BhY2VJbXBsIHRhcmdldE5hbWVzcGFjZSwgSlNQRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihkb2NUeXBlTmFtZSk7Ci0JCW5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLQkJZWxlbWVudHMgPSBjb2xsZWN0aW9uOwotCX0KLQotCXB1YmxpYyBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGdldEVsZW1lbnREZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChIVE1MRWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50cy5nZXROYW1lZEl0ZW0oZWxlbWVudE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50Ci0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBIVE1MRW50aXR5RGVjbGFyYXRpb24gZ2V0RW50aXR5RGVjbGFyYXRpb24oU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuRE9DVU1FTlQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1AxMU5hbWVzcGFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1AxMU5hbWVzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDFhOWI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQMTFOYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotLyoqCi0gKiBKU1AgMS4xIE5hbWVzcGFjZS4gTm90ZSwgdGhpcyBpbnRlcmZhY2Ugd2FzIAotICogY29waWVkIGZvcm0gSlNQIGNvcmUgcGFja2FnZXMuIE9uZSBpbXBsaWNhdGlvbiAKLSAqIGlzIHRoYXQgZXh0cmEgY2FyZSBpcyBuZWVkZWQgaW4gdXNpbmcgJz09JyBpbnN0ZWFkIAotICogb2YgJy5lcXVhbHMnLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTUDExTmFtZXNwYWNlIHsKLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEVsZW1lbnROYW1lIHsKLQkJLy8gRWxlbWVudCBuYW1lcwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JJUFRMRVQgPSAianNwOnNjcmlwdGxldCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTiA9ICJqc3A6ZXhwcmVzc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDTEFSQVRJT04gPSAianNwOmRlY2xhcmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RJVkVfUEFHRSA9ICJqc3A6ZGlyZWN0aXZlLnBhZ2UiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUkVDVElWRV9JTkNMVURFID0gImpzcDpkaXJlY3RpdmUuaW5jbHVkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUSVZFX1RBR0xJQiA9ICJqc3A6ZGlyZWN0aXZlLnRhZ2xpYiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFQkVBTiA9ICJqc3A6dXNlQmVhbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUUFJPUEVSVFkgPSAianNwOnNldFByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRQUk9QRVJUWSA9ICJqc3A6Z2V0UHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREUgPSAianNwOmluY2x1ZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUldBUkQgPSAianNwOmZvcndhcmQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTiA9ICJqc3A6cGx1Z2luIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTVMgPSAianNwOnBhcmFtcyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFMTEJBQ0sgPSAianNwOmZhbGxiYWNrIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTSA9ICJqc3A6cGFyYW0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1QgPSAianNwOnJvb3QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFQgPSAianNwOnRleHQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQMTFfVVJJID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVEFHX1BSRUZJWCA9ICJqc3AiOyAvLyROT04tTkxTLTEkCi0JLy8gYXR0cmlidXRlIG5hbWVzCi0JLy8gICBkaXJlY3RpdmUucGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9MQU5HVUFHRSA9ICJsYW5ndWFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRVhURU5EUyA9ICJleHRlbmRzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT05URU5UX1RZUEUgPSAiY29udGVudFR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lNUE9SVCA9ICJpbXBvcnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NFU1NJT04gPSAic2Vzc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQlVGRkVSID0gImJ1ZmZlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQVVUT0ZMVVNIID0gImF1dG9GbHVzaCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSVNfVEhSRUFEX1NBRkUgPSAiaXNUaHJlYWRTYWZlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JTkZPID0gImluZm8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0VSUk9SX1BBR0UgPSAiZXJyb3JQYWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JU19FUlJPUl9QQUdFID0gImlzRXJyb3JQYWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QQUdFX0VOQ09ESU5HID0gInBhZ2VFbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIGRpcmVjdGl2ZS5pbmNsdWRlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0ZJTEUgPSAiZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIGRpcmVjdGl2ZS50YWdsaWIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVVJJID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUFJFRklYID0gInByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIHVzZUJlYW4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NDT1BFID0gInNjb3BlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQkVBTl9OQU1FID0gImJlYW5OYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JLy8gICBzZXRQcm9wZXJ0eQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BST1BFUlRZID0gInByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WQUxVRSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUEFSQU0gPSAicGFyYW0iOyAvLyROT04tTkxTLTEkCi0JLy8gICBpbmNsdWRlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BBR0UgPSAicGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRkxVU0ggPSAiZmx1c2giOyAvLyROT04tTkxTLTEkCi0JLy8gICBwbHVnaW4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09ERSA9ICJjb2RlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT0RFQkFTRSA9ICJjb2RlYmFzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUxJR04gPSAiYWxpZ24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FSQ0hJVkUgPSAiYXJjaGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSEVJR0hUID0gImhlaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSFNQQUNFID0gImhzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSlJFVkVSU0lPTiA9ICJqcmV2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WU1BBQ0UgPSAidnNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9XSURUSCA9ICJ3aWR0aCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTlNQTFVHSU5VUkwgPSAibnNwbHVnaW51cmwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lFUExVR0lOVVJMID0gImllcGx1Z2ludXJsIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgcm9vdAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9YTUxOU19KU1AgPSAieG1sbnM6anNwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WRVJTSU9OID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JLy8gYXR0cmlidXRlIHZhbHVlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9KQVZBID0gImphdmEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DVF9ERUZBVUxUID0gInRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIjsvL0QxOTUzNjYgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQlVGU0laX0RFRkFVTFQgPSAiOGtiIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUEFHRSA9ICJwYWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfU0VTU0lPTiA9ICJzZXNzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUkVRVUVTVCA9ICJyZXF1ZXN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQVBQTElDQVRJT04gPSAiYXBwbGljYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CRUFOID0gImJlYW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9BUFBMRVQgPSAiYXBwbGV0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVE9QID0gInRvcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX01JRERMRSA9ICJtaWRkbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CT1RUT00gPSAiYm90dG9tIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTEVGVCA9ICJsZWZ0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUklHSFQgPSAicmlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9KVkVSMTEgPSAiMS4xIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfWE1MTlNfSlNQID0gImh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUDIwRWxlbWVudENvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQMjBFbGVtZW50Q29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2ExZGFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQMjBFbGVtZW50Q29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgZWxlbWVudCBkZWNsYXJhdGlvbnMgb2YgSlNQIDEuMSBhbmQgSlNQIDEuMi4KLSAqLwotZmluYWwgY2xhc3MgSlNQMjBFbGVtZW50Q29sbGVjdGlvbiBleHRlbmRzIEpTUEVsZW1lbnRDb2xsZWN0aW9uIGltcGxlbWVudHMgSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUgewotCi0JLy8gZWxlbWVudCBJRHMKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJZHMyMCBleHRlbmRzIElkcyB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JPRFkgPSAxNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVRUUklCVVRFID0gMTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VMRU1FTlQgPSAxOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1VUUFVUID0gMjA7Ci0KLQkJcHVibGljIHN0YXRpYyBpbnQgZ2V0TnVtT2ZJZHMoKSB7Ci0JCQlpZiAobnVtb2ZpZHMgIT0gLTEpCi0JCQkJcmV0dXJuIG51bW9maWRzOwotCi0JCQkvLyBOT1RFOiBJZiB0aGUgcmVmbGVjdGlvbiBpcyB0b28gc2xvdywgdGhpcyBtZXRob2Qgc2hvdWxkCi0JCQkvLyBqdXN0IHJldHVybiB0aGUgbGl0ZXJhbCB2YWx1ZSwgbGlrZSAxMDUuCi0JCQkvLyAtLSA1LzI1LzIwMDEKLQkJCUNsYXNzIGNsYXp6ID0gSWRzMjAuY2xhc3M7Ci0JCQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldEZpZWxkcygpOwotCQkJbnVtb2ZpZHMgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGZpZWxkc1tpXS5nZXROYW1lKCk7Ci0JCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiSURfIikpLy8kTk9OLU5MUy0xJAotCQkJCQludW1vZmlkcysrOwotCQkJfQotCQkJcmV0dXJuIG51bW9maWRzOwotCQl9Ci0KLQkJLy8gY2hhY2hlIHRoZSByZXN1bHQgb2YgdGhlIHJlZmxlY3Rpb24uCi0JCXByaXZhdGUgc3RhdGljIGludCBudW1vZmlkcyA9IC0xOwotCX0KLQotCS8vIGF0dHJpYnV0ZSBjcmVhdGVyCi0JcHJpdmF0ZSBjbGFzcyBKQUNyZWF0ZXIyMCBleHRlbmRzIEpBQ3JlYXRlciB7Ci0JCXB1YmxpYyBKQUNyZWF0ZXIyMCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsIGdldERlY2xhcmF0aW9ucyhpbnQgZWlkKSB7Ci0JCQlzd2l0Y2ggKGVpZCkgewotCQkJCWNhc2UgSWRzMjAuSURfQVRUUklCVVRFIDoKLQkJCQkJY3JlYXRlRm9yQXR0cmlidXRlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzMjAuSURfRUxFTUVOVCA6Ci0JCQkJCWNyZWF0ZUZvckVsZW1lbnQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMyMC5JRF9CT0RZIDoKLQkJCQkJY3JlYXRlRm9yQm9keSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkczIwLklEX09VVFBVVCA6Ci0JCQkJCWNyZWF0ZUZvck91dHB1dCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkcy5JRF9ESVJFQ1RJVkVfVEFHTElCIDoKLQkJCQkJY3JlYXRlRm9yRGlyVGFnbGliKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX0RJUkVDVElWRV9QQUdFIDoKLQkJCQkJY3JlYXRlRm9yRGlyUGFnZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkcy5JRF9ST09UIDoKLQkJCQkJY3JlYXRlRm9yUm9vdCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkcy5JRF9QTFVHSU4gOgotCQkJCQljcmVhdGVGb3JQbHVnaW4oKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXN1cGVyLmdldERlY2xhcmF0aW9ucyhlaWQpOwotCQkJfQotCQkJcmV0dXJuIGRlY2xhcmF0aW9uczsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JCb2R5KCkgewotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvck91dHB1dCgpIHsKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX09NSVRfWE1MX0RFQ0wpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRSwgSlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9ZRVMsIEpTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfTk99OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEpTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfTk8pOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTUlUX1hNTF9ERUNMLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRE9DVFlQRV9ST09UX0VMRU1FTlQpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRE9DVFlQRV9ST09UX0VMRU1FTlQsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9ET0NUWVBFX1NZU1RFTSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9ET0NUWVBFX1NZU1RFTSwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RPQ1RZUEVfUFVCTElDKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RPQ1RZUEVfUFVCTElDLCBhZGVjKTsKLQkJfQotCi0JCS8qKgotCQkgKiBDaGFuZ2VkIGluIDIuMAotCQkgKi8KLQkJdm9pZCBjcmVhdGVGb3JEaXJUYWdsaWIoKSB7Ci0JCQkvLyAoInVyaSIgVVJJIE9QVElPTkFMKQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfVVJJKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9VUkksIGFkZWMpOwotCi0JCQkvLyAoInRhZ2RpciIgVVJJIE9QVElPTkFMKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVEFHRElSKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQUdESVIsIGFkZWMpOwotCi0JCQkvLyAoInByZWZpeCIgQ0RBVEEgUkVRVUlSRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9QUkVGSVgpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfUFJFRklYLCBhZGVjKTsKLQkJfQotCQkKLQkJdm9pZCBjcmVhdGVGb3JEaXJQYWdlKCkgewotCQkJQXR0ckRlY2wgYWRlYyA9IG51bGw7Ci0JCQkvLyAoImxhbmd1YWdlIiBDREFUQSBERUNMQVJFRCAiamF2YSIpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9MQU5HVUFHRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9KQVZBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0xBTkdVQUdFLCBhZGVjKTsKLQotCQkJLy8gKCJleHRlbmRzIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfRVhURU5EUyk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfRVhURU5EUywgYWRlYyk7Ci0KLQkJCS8vICgiaW1wb3J0IiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfSU1QT1JUKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9JTVBPUlQsIGFkZWMpOwotCi0JCQkvLyAoInNlc3Npb24iIEVOVU0gREVDTEFSRUQgKHRydWV8ZmFsc2UpICJ0cnVlIikKLQkJCWFkZWMgPSBjcmVhdGVCb29sVHlwZShBVFRSX05BTUVfU0VTU0lPTiwgQVRUUl9WQUxVRV9UUlVFKTsKLQkJCWlmIChhZGVjICE9IG51bGwpCi0JCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfU0VTU0lPTiwgYWRlYyk7Ci0KLQkJCS8vICgiYnVmZmVyIiBDREFUQSBERUNMQVJFRCAiOGtiIikKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0JVRkZFUik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9CVUZTSVpfREVGQVVMVCk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9CVUZGRVIsIGFkZWMpOwotCi0JCQkvLyAoImF1dG9GbHVzaCIgRU5VTSBERUNMQVJFRCAodHJ1ZXxmYWxzZSkgInRydWUiKQotCQkJYWRlYyA9IGNyZWF0ZUJvb2xUeXBlKEFUVFJfTkFNRV9BVVRPRkxVU0gsIEFUVFJfVkFMVUVfVFJVRSk7Ci0JCQlpZiAoYWRlYyAhPSBudWxsKQotCQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0FVVE9GTFVTSCwgYWRlYyk7Ci0KLQkJCS8vICgiaXNUaHJlYWRTYWZlIiBFTlVNIERFQ0xBUkVEICh0cnVlfGZhbHNlKSAidHJ1ZSIpCi0JCQlhZGVjID0gY3JlYXRlQm9vbFR5cGUoQVRUUl9OQU1FX0lTX1RIUkVBRF9TQUZFLCBBVFRSX1ZBTFVFX1RSVUUpOwotCQkJaWYgKGFkZWMgIT0gbnVsbCkKLQkJCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9JU19USFJFQURfU0FGRSwgYWRlYyk7Ci0KLQkJCS8vICgiaW5mbyIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0lORk8pOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0lORk8sIGFkZWMpOwotCi0JCQkvLyAoImVycm9yUGFnZSIgVVJJIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9FUlJPUl9QQUdFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfRVJST1JfUEFHRSwgYWRlYyk7Ci0KLQkJCS8vICgiaXNFcnJvclBhZ2UiIEVOVU0gREVDTEFSRUQgKHRydWV8ZmFsc2UpICJmYWxzZSIpCi0JCQlhZGVjID0gY3JlYXRlQm9vbFR5cGUoQVRUUl9OQU1FX0lTX0VSUk9SX1BBR0UsIEFUVFJfVkFMVUVfRkFMU0UpOwotCQkJaWYgKGFkZWMgIT0gbnVsbCkKLQkJCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9JU19FUlJPUl9QQUdFLCBhZGVjKTsKLQotCQkJLy8gKCJjb250ZW50VHlwZSIgQ0RBVEEgREVDTEFSRUQgInRleHQvaHRtbDsgSVNPLTg4NTktMSIpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9DT05URU5UX1RZUEUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfQ1RfREVGQVVMVCk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9DT05URU5UX1RZUEUsIGFkZWMpOwotCi0JCQkvLyAoInBhZ2VFbmNvZGluZyIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1BBR0VfRU5DT0RJTkcpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEpTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfRU5DT0RJTkdfREVGQVVMVCk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9QQUdFX0VOQ09ESU5HLCBhZGVjKTsKLQotCQkJLy8gKCJpc0VMSWdub3JlZCIgRU5VTSBERUNMQVJFRCAodHJ1ZXxmYWxzZSkgImZhbHNlIikKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0lTRUxJR05PUkVEKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbXXtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfRkFMU0UpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9JU0VMSUdOT1JFRCwgYWRlYyk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JFbGVtZW50KCkgewotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9OQU1FLCBhZGVjKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JBdHRyaWJ1dGUoKSB7Ci0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9OQU1FKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX05BTUUsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9UUklNKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfVFJVRSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1RSSU0sIGFkZWMpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yUm9vdCgpIHsKLQkJCS8vICgieG1sbnM6anNwIiBDREFUQSAiaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSIpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9YTUxOU19KU1ApOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfWE1MTlNfSlNQKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1hNTE5TX0pTUCwgYWRlYyk7Ci0JCQkvLyAoInZlcnNpb24iIENEQVRBIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfVkVSU0lPTik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgSlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9KU1BfVkVSXzIwKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVkVSU0lPTiwgYWRlYyk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JQbHVnaW4oKSB7Ci0JCQkvLyAoInR5cGUiIEVOVU0gUkVRVUlSRUQgKGJlYW58YXBwbGV0KSkKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1RZUEUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9CRUFOLCBBVFRSX1ZBTFVFX0FQUExFVH07Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVFlQRSwgYWRlYyk7Ci0KLQkJCS8vICgiY29kZSIgQ0RBVEEgUkVRVUlSRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9DT0RFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9DT0RFLCBhZGVjKTsKLQotCQkJLy8gKCJjb2RlYmFzZSIgVVJJIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQ09ERUJBU0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0NPREVCQVNFLCBhZGVjKTsKLQotCQkJLy8gKCJhbGlnbiIgRU5VTSBJTVBMSUVEICh0b3B8bWlkZGxlfGJvdHRvbXxsZWZ0fHJpZ2h0KSkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0FMSUdOKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIGFsaWducyA9IHtBVFRSX1ZBTFVFX1RPUCwgQVRUUl9WQUxVRV9NSURETEUsIEFUVFJfVkFMVUVfQk9UVE9NLCBBVFRSX1ZBTFVFX0xFRlQsIEFUVFJfVkFMVUVfUklHSFR9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXMoYWxpZ25zKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfQk9UVE9NKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0FMSUdOLCBhZGVjKTsKLQotCQkJLy8gKCJhcmNoaXZlIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQVJDSElWRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQVJDSElWRSwgYWRlYyk7Ci0KLQkJCS8vICgiaGVpZ2h0IiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfSEVJR0hUKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9IRUlHSFQsIGFkZWMpOwotCi0JCQkvLyAoImhzcGFjZSIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0hTUEFDRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSFNQQUNFLCBhZGVjKTsKLQotCQkJLy8gKCJqcmV2ZXJzaW9uIiBDREFUQSBERUNMQVJFRCAiMS4xIikKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0pSRVZFUlNJT04pOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEpTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfSlZFUjEyKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0pSRVZFUlNJT04sIGFkZWMpOwotCi0JCQkvLyAoIm5hbWUiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9OQU1FKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9OQU1FLCBhZGVjKTsKLQotCQkJLy8gKCJ2c3BhY2UiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9WU1BBQ0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1ZTUEFDRSwgYWRlYyk7Ci0KLQkJCS8vICgid2lkdGgiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9XSURUSCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfV0lEVEgsIGFkZWMpOwotCi0JCQkvLyAoIm5zcGx1Z2ludXJsIiBVUkkgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX05TUExVR0lOVVJMKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTlNQTFVHSU5VUkwsIGFkZWMpOwotCi0JCQkvLyAoImllcGx1Z2ludXJsIiBVUkkgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0lFUExVR0lOVVJMKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSUVQTFVHSU5VUkwsIGFkZWMpOwotCQkJCi0JCQkvLyAoIm1heXNjcmlwdCIgRU5VTSBJTVBMSUVEICh0cnVlIHwgZmFsc2UpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVlTQ1JJUFQpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXMobmV3IFN0cmluZ1tdIHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9KTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX01BWVNDUklQVCwgYWRlYyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBuYW1lcyA9IG51bGw7Ci0KLQlzdGF0aWMgewotCQluYW1lcyA9IG5ldyBTdHJpbmdbSWRzMjAuZ2V0TnVtT2ZJZHMoKV07Ci0JCW5hbWVzW0lkcy5JRF9TQ1JJUFRMRVRdID0gU0NSSVBUTEVUOwotCQluYW1lc1tJZHMuSURfRVhQUkVTU0lPTl0gPSBFWFBSRVNTSU9OOwotCQluYW1lc1tJZHMuSURfREVDTEFSQVRJT05dID0gREVDTEFSQVRJT047Ci0JCW5hbWVzW0lkcy5JRF9ESVJFQ1RJVkVfUEFHRV0gPSBESVJFQ1RJVkVfUEFHRTsKLQkJbmFtZXNbSWRzLklEX0RJUkVDVElWRV9JTkNMVURFXSA9IERJUkVDVElWRV9JTkNMVURFOwotCQluYW1lc1tJZHMuSURfRElSRUNUSVZFX1RBR0xJQl0gPSBESVJFQ1RJVkVfVEFHTElCOwotCQluYW1lc1tJZHMuSURfVVNFQkVBTl0gPSBVU0VCRUFOOwotCQluYW1lc1tJZHMuSURfU0VUUFJPUEVSVFldID0gU0VUUFJPUEVSVFk7Ci0JCW5hbWVzW0lkcy5JRF9HRVRQUk9QRVJUWV0gPSBHRVRQUk9QRVJUWTsKLQkJbmFtZXNbSWRzLklEX0lOQ0xVREVdID0gSU5DTFVERTsKLQkJbmFtZXNbSWRzLklEX0ZPUldBUkRdID0gRk9SV0FSRDsKLQkJbmFtZXNbSWRzLklEX1BMVUdJTl0gPSBQTFVHSU47Ci0JCW5hbWVzW0lkcy5JRF9QQVJBTVNdID0gUEFSQU1TOwotCQluYW1lc1tJZHMuSURfRkFMTEJBQ0tdID0gRkFMTEJBQ0s7Ci0JCW5hbWVzW0lkcy5JRF9QQVJBTV0gPSBQQVJBTTsKLQkJbmFtZXNbSWRzLklEX1JPT1RdID0gUk9PVDsKLQkJbmFtZXNbSWRzLklEX1RFWFRdID0gVEVYVDsKLQkJbmFtZXNbSWRzMjAuSURfQk9EWV0gPSBKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZOwotCQluYW1lc1tJZHMyMC5JRF9BVFRSSUJVVEVdID0gSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQVRUUklCVVRFOwotCQluYW1lc1tJZHMyMC5JRF9FTEVNRU5UXSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVMRU1FTlQ7Ci0JCW5hbWVzW0lkczIwLklEX09VVFBVVF0gPSBKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PVVRQVVQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEpTUDIwRWxlbWVudENvbGxlY3Rpb24oKSB7Ci0JCXN1cGVyKEpTUDIwRWxlbWVudENvbGxlY3Rpb24ubmFtZXMsIFRPTEVSQU5UX0NBU0UpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlaWQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCUNNR3JvdXBJbXBsIGNyZWF0ZUNvbnRlbnQoaW50IGVpZCkgewotCQlpZiAoZWlkID09IElEX1VOS05PV04pCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlDTUdyb3VwSW1wbCBjb250ZW50ID0gbnVsbDsKLQkJQ01Ob2RlIGNoaWxkID0gbnVsbDsKLQotCQlzd2l0Y2ggKGVpZCkgewotCQkJY2FzZSBJZHMuSURfUk9PVCA6Ci0JCQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkJCWludCB2YWxpZENoaWxkcmVuW10gPSB7Ci0JCQkJLy8gJURpcmVjdGl2ZXM7Ci0JCQkJCQkJSWRzLklEX1RFWFQsIElkcy5JRF9ESVJFQ1RJVkVfUEFHRSwgSWRzLklEX0RJUkVDVElWRV9JTkNMVURFLCBJZHMyMC5JRF9CT0RZLCBJZHMyMC5JRF9BVFRSSUJVVEUsCi0JCQkJCQkJLy8gJVNjcmlwdHM7Ci0JCQkJCQkJSWRzLklEX1NDUklQVExFVCwgSWRzLklEX0RFQ0xBUkFUSU9OLCBJZHMuSURfRVhQUkVTU0lPTiwKLQkJCQkJCQkvLyAlQWN0aW9uczsKLQkJCQkJCQlJZHMuSURfVVNFQkVBTiwgSWRzLklEX1NFVFBST1BFUlRZLCBJZHMuSURfR0VUUFJPUEVSVFksIElkcy5JRF9JTkNMVURFLCBJZHMuSURfRk9SV0FSRCwgSWRzLklEX1BMVUdJTn07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWNoaWxkID0gaXRlbSh2YWxpZENoaWxkcmVuW2ldKTsKLQkJCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJCQljb250ZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQljb250ZW50ID0gc3VwZXIuY3JlYXRlQ29udGVudChlaWQpOwotCQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVpZAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVFbGVtRGVjbChpbnQgZWlkKSB7Ci0JCWlmIChlaWQgPT0gSURfVU5LTk9XTikKLQkJCXJldHVybiBudWxsOwotCi0JCVR5cGVQYWNrZXQgcGFja2V0ID0gbmV3IFR5cGVQYWNrZXQoKTsKLQkJc3dpdGNoIChlaWQpIHsKLQkJCWNhc2UgSWRzMjAuSURfQk9EWSA6Ci0JCQkJLy8gZGVjbGFyYXRpb24KLQkJCQlwYWNrZXQubmFtZSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFk7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5pbmRlbnRDaGlsZCA9IHRydWU7Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9TQ1JJUFQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkczIwLklEX0VMRU1FTlQgOgotCQkJCS8vIGRlY2xhcmF0aW9uCi0JCQkJcGFja2V0Lm5hbWUgPSBKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5FTEVNRU5UOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVDsKLQkJCQlwYWNrZXQuaW5kZW50Q2hpbGQgPSB0cnVlOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfU0NSSVBUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMyMC5JRF9BVFRSSUJVVEUgOgotCQkJCS8vIGRlY2xhcmF0aW9uCi0JCQkJcGFja2V0Lm5hbWUgPSBKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BVFRSSUJVVEU7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5pbmRlbnRDaGlsZCA9IHRydWU7Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9TQ1JJUFQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkczIwLklEX09VVFBVVCA6Ci0JCQkJLy8gZGVjbGFyYXRpb24KLQkJCQlwYWNrZXQubmFtZSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9VVFBVVDsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX1NDUklQVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX0RJUkVDVElWRV9UQUdMSUIgOgotCQkJCS8vIGRpcmVjdGl2ZS50YWdsaWIKLQkJCQlwYWNrZXQubmFtZSA9IERJUkVDVElWRV9UQUdMSUI7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9ESVJFQ1RJVkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9ESVJFQ1RJVkVfUEFHRSA6Ci0JCQkJLy8gZGlyZWN0aXZlLnBhZ2UKLQkJCQlwYWNrZXQubmFtZSA9IERJUkVDVElWRV9QQUdFOwotCQkJCXBhY2tldC5vbWl0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfRElSRUNUSVZFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfUk9PVCA6Ci0JCQkJcGFja2V0Lm5hbWUgPSBST09UOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOyAvLyBzYW1lIGFzIEhUTUwKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1BMVUdJTiA6Ci0JCQkJLy8gcGx1Z2luCi0JCQkJcGFja2V0Lm5hbWUgPSBQTFVHSU47Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBzdXBlci5jcmVhdGVFbGVtRGVjbChlaWQpOwotCQl9Ci0JCUVsZW1EZWNsIGRlY2wgPSBuZXcgRWxlbURlY2wocGFja2V0KTsKLQotCQlDTUdyb3VwSW1wbCBjb250ZW50ID0gY3JlYXRlQ29udGVudChlaWQpOwotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJZGVjbC5zZXRDb250ZW50KGNvbnRlbnQpOwotCi0JCUpBQ3JlYXRlcjIwIGNyZWF0ZXIgPSBuZXcgSkFDcmVhdGVyMjAoKTsKLQkJZGVjbC5zZXRBdHRyaWJ1dGVzKGNyZWF0ZXIuZ2V0RGVjbGFyYXRpb25zKGVpZCkpOwotCi0JCXJldHVybiBkZWNsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQMjBOYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQMjBOYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUxMzhhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUDIwTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLS8qKgotICogTmV3IG5hbWVzIGZvciBKU1AgMi4wIHNwZWMuCi0gKiAKLSAqIEBkZXByZWNhdGVkIC0gdXNlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMjBOYW1lc3BhY2UKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEpTUDIwTmFtZXNwYWNlIGV4dGVuZHMgSlNQMTFOYW1lc3BhY2UgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUDIwX1VSSSA9ICIiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE5ldyBlbGVtZW50cyBmb3IgSlNQIDIuMCBzcGVjLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEVsZW1lbnROYW1lIGV4dGVuZHMgSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUgewotCQlTdHJpbmcgRElSRUNUSVZFX1RBRyA9ICJqc3A6ZGlyZWN0aXZlLnRhZyI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIERJUkVDVElWRV9BVFRSSUJVVEUgPSAianNwOmRpcmVjdGl2ZS5hdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBESVJFQ1RJVkVfVkFSSUFCTEUgPSAianNwOmRpcmVjdGl2ZS52YXJpYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIEJPRFkgPSAianNwOmJvZHkiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBBVFRSSUJVVEUgPSAianNwOmF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIEVMRU1FTlQgPSAianNwOmVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBET0JPRFkgPSAianNwOmRvQm9keSI7Ci0JCVN0cmluZyBJTlZPS0UgPSAianNwOmludm9rZSI7Ci0JCVN0cmluZyBPVVRQVVQgPSAianNwOm91dHB1dCI7Ci0JfQotCi0JU3RyaW5nIEFUVFJfTkFNRV9UQUdESVIgPSAidGFnZGlyIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIEFUVFJfTkFNRV9ESVNQTEFZX05BTUUgPSAiZGlzcGxheS1uYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfQk9EWV9DT05URU5UID0gImJvZHktY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX1NNQUxMX0lDT04gPSAic21hbGwtaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX0xBUkdFX0lDT04gPSAibGFyZ2UtaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfRVhBTVBMRSA9ICJleGFtcGxlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfTEFOR1VBR0UgPSAibGFuZ3VhZ2UiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9JU0VMSUdOT1JFRCA9ICJpc0VMSWdub3JlZCI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBBVFRSX05BTUVfUkVRVUlSRUQgPSAicmVxdWlyZWQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9GUkFHTUVOVCA9ICJmcmFnbWVudCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX1JURVhQUlZBTFVFID0gInJ0ZXhwcnZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIEFUVFJfTkFNRV9OQU1FX0dJVkVOID0gIm5hbWUtZ2l2ZW4iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9OQU1FX0ZST01fQVRUUklCVVRFID0gIm5hbWUtZnJvbS1hdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9BTElBUyA9ICJhbGlhcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX1ZBUklBQkxFX0NMQVNTID0gInZhcmlhYmxlLWNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfREVDTEFSRSA9ICJkZWNsYXJlIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIEFUVFJfVkFMVUVfU0NSSVBUTEVTUyA9ICJzY3JpcHRsZXNzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX1ZBTFVFX1RBR0RFUEVOREVOVCA9ICJ0YWdkZXBlbmRlbnQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfVkFMVUVfRU1QVFkgPSAiZW1wdHkiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgQVRUUl9OQU1FX1RSSU0gPSAidHJpbSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBBVFRSX05BTUVfVkFSID0gInZhciI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX1ZBUlJFQURFUiA9ICJ2YXJSZWFkZXIiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgQVRUUl9OQU1FX09NSVRfWE1MX0RFQ0wgPSAib21pdC14bWwtZGVjbGFyYXRpb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJfTkFNRV9ET0NUWVBFX1JPT1RfRUxFTUVOVCA9ICJkb2N0eXBlLXJvb3QtZWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9OQU1FX0RPQ1RZUEVfU1lTVEVNID0gImRvY3R5cGUtc3lzdGVtIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfRE9DVFlQRV9QVUJMSUMgPSAiZG9jdHlwZS1wdWJsaWMiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgQVRUUl9WQUxVRV9OTyA9ICJubyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9WQUxVRV9ZRVMgPSAieWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIEFUVFJfVkFMVUVfU0NPUEVfQVRfRU5EID0gIkFUX0VORCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9WQUxVRV9TQ09QRV9BVF9CRUdJTiA9ICJBVF9CRUdJTiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUl9WQUxVRV9TQ09QRV9ORVNURUQgPSAiTkVTVEVEIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIEFUVFJfTkFNRV9EWU5BTUlDX0FUVFJJQlVURVMgPSAiZHluYW1pYy1hdHRyaWJ1dGVzIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBBVFRSX1ZBTFVFX0VOQ09ESU5HX0RFRkFVTFQgPSAiSVNPLTg4NTktMSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgQVRUUl9WQUxVRV9WQVJJQUJMRV9DTEFTU19ERUZBVUxUID0gImphdmEubGFuZy5TdHJpbmciOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIEFUVFJfTkFNRV9NQVlTQ1JJUFQgPSAibWF5c2NyaXB0IjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBBVFRSX1ZBTFVFX0pWRVIxMiA9ICIxLjIiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIEFUVFJfVkFMVUVfSlNQX1ZFUl8yMCA9ICIyLjAiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gSlNQIDIuMSBhdHRyaWJ1dGVzCi0vLwlTdHJpbmcgQVRUUl9OQU1FX0RFRkVSUkVEX1NZTlRBWF9BTExPV0VEX0FTX0xJVEVSQUwgPSAiZGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsIjsgLy8kTk9OLU5MUy0xJAotLy8JU3RyaW5nIEFUVFJfTkFNRV9UUklNX0RJUkVDVElWRV9XSElURVNQQUNFUyA9ICJ0cmltRGlyZWN0aXZlV2hpdGVzcGFjZXMiOyAvLyROT04tTkxTLTEkCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUENNRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQQ01Eb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDJiZmIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQQ01Eb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotLyoqCi0gKiBKU1AgZXh0ZW5zaW9uIGZvciBDTURvY3VtZW50LgotICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgc29tZSBzaG9ydCBoYW5kIG1ldGhvZHMgdG8gZ2V0IGRlY2xhcmF0aW9ucwotICogYnkgYSBuYW1lLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTUENNRG9jdW1lbnQgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQgewotCi0JLyoqCi0JICogQSBzaG9ydCBoYW5kIG1ldGhvZCB0byBnZXQgYSBlbGVtZW50IGRlY2xhcmF0aW9uIGZvciBhIEpTUCBlbGVtZW50LgotCSAqIEpTUCBkZWNsYXJhdGlvbiBjbGFzcyBpbXBsZW1lbnRzIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gaW50ZXJmYWNlLgotCSAqIEBwYXJhbSBlbGVtZW50TmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnROYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQRWxlbWVudENvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQRWxlbWVudENvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUxN2Y5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUEVsZW1lbnRDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBlbGVtZW50IGRlY2xhcmF0aW9ucyBvZiB0aGUgSlNQIDEuMSBhbmQgMS4yLgotICovCi1jbGFzcyBKU1BFbGVtZW50Q29sbGVjdGlvbiBleHRlbmRzIERlY2xDb2xsZWN0aW9uIGltcGxlbWVudHMgSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUgewotCi0KLQljbGFzcyBUeXBlUGFja2V0IHsKLQkJcHVibGljIFN0cmluZyBuYW1lID0gbnVsbDsKLQkJcHVibGljIGludCBjb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFk7Ci0JCXB1YmxpYyBpbnQgb21pdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9OT05FOwotCQlwdWJsaWMgaW50IGxpbmVCcmVhayA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfTk9ORTsKLQkJcHVibGljIGludCBsYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9OT05FOwotCQlwdWJsaWMgaW50IGNvcnJlY3QgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkNPUlJFQ1RfTk9ORTsKLQkJcHVibGljIGludCBmb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9YTUw7Ci0JCXB1YmxpYyBib29sZWFuIGluZGVudENoaWxkID0gZmFsc2U7Ci0KLQkJcHVibGljIFR5cGVQYWNrZXQoKSB7Ci0JCX0KLQl9Ci0KLQkvKiogSlNQIGVsZW1lbnQgZGVjbGFyYXRpb24uICovCi0JY2xhc3MgRWxlbURlY2wgZXh0ZW5kcyBDTUNvbnRlbnRJbXBsIGltcGxlbWVudHMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiwgSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gewotCQlwcml2YXRlIFR5cGVQYWNrZXQgdHlwZSA9IG51bGw7Ci0JCXByaXZhdGUgQ01Hcm91cEltcGwgY29udGVudCA9IG51bGw7Ci0JCXByaXZhdGUgQ01OYW1lZE5vZGVNYXBJbXBsIGF0dHJpYnV0ZXMgPSBudWxsOwotCi0JCXB1YmxpYyBFbGVtRGVjbChUeXBlUGFja2V0IHQpIHsKLQkJCXN1cGVyKHQubmFtZSwgMSwgMSk7Ci0JCQl0eXBlID0gdDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldENvbnRlbnQoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJCWNvbnRlbnQgPSBncm91cDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMoQ01OYW1lZE5vZGVNYXBJbXBsIGF0dHJzKSB7Ci0JCQlhdHRyaWJ1dGVzID0gYXR0cnM7Ci0JCX0KLQotCQkvLyBpbXBsZW1lbnRzIENNTm9kZQotCQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQkJcmV0dXJuIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuQ09OVEVOVF9ISU5UKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJUHJvcGVydHlQcm92aWRlciBwcCA9IFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5LmdldFByb3ZpZGVyKHByb3BlcnR5TmFtZSk7Ci0JCQkJaWYgKHBwID09IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlyZXR1cm4gcHAuc3VwcG9ydHModGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkgewotCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOyAvL0QyMDg4MzkKLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5DT05URU5UX0hJTlQpKSB7Ci0JCQkJU3RyaW5nIG15TmFtZSA9IGdldEVsZW1lbnROYW1lKCk7Ci0JCQkJaWYgKG15TmFtZSA9PSBKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5QTFVHSU4pIHsKLQkJCQkJcmV0dXJuIGdldE5hbWVkSXRlbShKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5QQVJBTVMpOyAvLyBvdXRlciBjbGFzcyBtZXRob2QuCi0JCQkJfQotCQkJCWVsc2UgaWYgKG15TmFtZSA9PSBKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5QQVJBTVMpIHsKLQkJCQkJcmV0dXJuIGdldE5hbWVkSXRlbShKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5QQVJBTSk7IC8vIG91dGVyIGNsYXNzIG1ldGhvZC4KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCVByb3BlcnR5UHJvdmlkZXIgcHAgPSBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5nZXRQcm92aWRlcihwcm9wZXJ0eU5hbWUpOwotCQkJCWlmIChwcCA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlyZXR1cm4gcHAuZ2V0KHRoaXMpOwotCQkJfQotCQl9Ci0KLQkJLy8gaW1wbGVtZW50ZXMgQ01FbGVtZW50RGVjbGFyYXRpb24KLQkJcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCQlyZXR1cm4gYXR0cmlidXRlczsKLQkJfQotCi0JCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJCXJldHVybiBjb250ZW50OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJCXJldHVybiB0eXBlLmNvbnRlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgQ01EYXRhVHlwZSBnZXREYXRhVHlwZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJCXJldHVybiBnZXROb2RlTmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIGltcGxlbWVudGVzIEhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkJcHVibGljIEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihTdHJpbmcgYXR0ck5hbWUpIHsKLQkJCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gKEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDb3JyZWN0aW9uVHlwZSgpIHsKLQkJCXJldHVybiB0eXBlLmNvcnJlY3Q7Ci0JCX0KLQotCQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIENNQ29udGVudCBnZXRJbmNsdXNpb24oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQkJcmV0dXJuIEVNUFRZX01BUDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Rm9ybWF0VHlwZSgpIHsKLQkJCXJldHVybiB0eXBlLmZvcm1hdDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TGF5b3V0VHlwZSgpIHsKLQkJCXJldHVybiB0eXBlLmxheW91dDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TGluZUJyZWFrSGludCgpIHsKLQkJCXJldHVybiB0eXBlLmxpbmVCcmVhazsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0T21pdFR5cGUoKSB7Ci0JCQlyZXR1cm4gdHlwZS5vbWl0OwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc2hvdWxkVGVybWluYXRlQXQoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBkZWMpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHNob3VsZEtlZXBTcGFjZXMoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRJbmRlbnRDaGlsZFNvdXJjZSgpIHsKLQkJCXJldHVybiB0eXBlLmluZGVudENoaWxkOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNKU1AoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCS8vIGVsZW1lbnQgSURzCi0Jc3RhdGljIGNsYXNzIElkcyB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NDUklQVExFVCA9IDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VYUFJFU1NJT04gPSAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ERUNMQVJBVElPTiA9IDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJUkVDVElWRV9QQUdFID0gMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElSRUNUSVZFX0lOQ0xVREUgPSA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESVJFQ1RJVkVfVEFHTElCID0gNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVVNFQkVBTiA9IDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NFVFBST1BFUlRZID0gNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfR0VUUFJPUEVSVFkgPSA4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JTkNMVURFID0gOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRk9SV0FSRCA9IDEwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QTFVHSU4gPSAxMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUEFSQU1TID0gMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZBTExCQUNLID0gMTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BBUkFNID0gMTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JPT1QgPSAxNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEVYVCA9IDE2OwotCi0JCXB1YmxpYyBzdGF0aWMgaW50IGdldE51bU9mSWRzKCkgewotCQkJaWYgKG51bW9maWRzICE9IC0xKQotCQkJCXJldHVybiBudW1vZmlkczsKLQotCQkJLy8gTk9URTogSWYgdGhlIHJlZmxlY3Rpb24gaXMgdG9vIHNsb3csIHRoaXMgbWV0aG9kIHNob3VsZAotCQkJLy8ganVzdCByZXR1cm4gdGhlIGxpdGVyYWwgdmFsdWUsIGxpa2UgMTA1LgotCQkJLy8gLS0gNS8yNS8yMDAxCi0JCQlDbGFzcyBjbGF6eiA9IElkcy5jbGFzczsKLQkJCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RmllbGRzKCk7Ci0JCQludW1vZmlkcyA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gZmllbGRzW2ldLmdldE5hbWUoKTsKLQkJCQlpZiAobmFtZS5zdGFydHNXaXRoKCJJRF8iKSkvLyROT04tTkxTLTEkCi0JCQkJCW51bW9maWRzKys7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVtb2ZpZHM7Ci0JCX0KLQotCQkvLyBjaGFjaGUgdGhlIHJlc3VsdCBvZiB0aGUgcmVmbGVjdGlvbi4KLQkJcHJpdmF0ZSBzdGF0aWMgaW50IG51bW9maWRzID0gLTE7Ci0JfQotCi0JLy8gYXR0cmlidXRlIGNyZWF0ZXIKLQljbGFzcyBKQUNyZWF0ZXIgaW1wbGVtZW50cyBKU1AxMU5hbWVzcGFjZSB7Ci0JCS8vIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbgotCQljbGFzcyBBdHRyRGVjbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gewotCQkJSFRNTENNRGF0YVR5cGVJbXBsIHR5cGUgPSBudWxsOwotCQkJaW50IHVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQotCQkJLy8gbWV0aG9kcwotCQkJcHVibGljIEF0dHJEZWNsKFN0cmluZyBhdHRyTmFtZSkgewotCQkJCXN1cGVyKGF0dHJOYW1lKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRBdHRyTmFtZSgpIHsKLQkJCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQkJCX0KLQotCQkJcHVibGljIENNRGF0YVR5cGUgZ2V0QXR0clR5cGUoKSB7Ci0JCQkJcmV0dXJuIHR5cGU7Ci0JCQl9Ci0KLQkJCS8qKiBAZGVwcmVjYXRlZCBieSBzdXBlcmNsYXNzICovCi0JCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlpZiAodHlwZS5nZXRJbXBsaWVkVmFsdWVLaW5kKCkgIT0gQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCXJldHVybiB0eXBlLmdldEltcGxpZWRWYWx1ZSgpOwotCQkJfQotCi0JCQkvKiogQGRlcHJlY2F0ZWQgIGJ5IHN1cGVyY2xhc3MgKi8KLQkJCXB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbnVtQXR0cigpIHsKLQkJCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoQXJyYXlzLmFzTGlzdCh0eXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKSkpOwotCQkJCXJldHVybiB2LmVsZW1lbnRzKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQkJcmV0dXJuIENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT047Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0VXNhZ2UoKSB7Ci0JCQkJcmV0dXJuIHVzYWdlOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRJZ25vcmVDYXNlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCUNNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMgPSBudWxsOwotCi0JCXB1YmxpYyBKQUNyZWF0ZXIoKSB7Ci0JCQlkZWNsYXJhdGlvbnMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsIGdldERlY2xhcmF0aW9ucyhpbnQgZWlkKSB7Ci0JCQlzd2l0Y2ggKGVpZCkgewotCQkJCWNhc2UgSWRzLklEX0RJUkVDVElWRV9QQUdFIDoKLQkJCQkJY3JlYXRlRm9yRGlyUGFnZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkcy5JRF9ESVJFQ1RJVkVfSU5DTFVERSA6Ci0JCQkJCWNyZWF0ZUZvckRpckluY2x1ZGUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfRElSRUNUSVZFX1RBR0xJQiA6Ci0JCQkJCWNyZWF0ZUZvckRpclRhZ2xpYigpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkcy5JRF9VU0VCRUFOIDoKLQkJCQkJY3JlYXRlRm9yVXNlQmVhbigpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkcy5JRF9TRVRQUk9QRVJUWSA6Ci0JCQkJCWNyZWF0ZUZvclNldFByb3BlcnR5KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX0dFVFBST1BFUlRZIDoKLQkJCQkJY3JlYXRlRm9yR2V0UHJvcGVydHkoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfSU5DTFVERSA6Ci0JCQkJCWNyZWF0ZUZvckluY2x1ZGUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfRk9SV0FSRCA6Ci0JCQkJCWNyZWF0ZUZvckZvcndhcmQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfUExVR0lOIDoKLQkJCQkJY3JlYXRlRm9yUGx1Z2luKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX1BBUkFNIDoKLQkJCQkJY3JlYXRlRm9yUGFyYW0oKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfUk9PVCA6Ci0JCQkJCWNyZWF0ZUZvclJvb3QoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCS8vIHNob3VsZCB3YXJuLgotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiBkZWNsYXJhdGlvbnM7Ci0JCX0KLQotCQlBdHRyRGVjbCBjcmVhdGVCb29sVHlwZShTdHJpbmcgbmFtZSwgU3RyaW5nIGRlZlZhbHVlKSB7Ci0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKG5hbWUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgZGVmVmFsdWUpOwotCQkJcmV0dXJuIGFkZWM7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yRGlyUGFnZSgpIHsKLQkJCUF0dHJEZWNsIGFkZWMgPSBudWxsOwotCQkJLy8gKCJsYW5ndWFnZSIgQ0RBVEEgREVDTEFSRUQgImphdmEiKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTEFOR1VBR0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfSkFWQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9MQU5HVUFHRSwgYWRlYyk7Ci0KLQkJCS8vICgiZXh0ZW5kcyIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0VYVEVORFMpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0VYVEVORFMsIGFkZWMpOwotCi0JCQkvLyAoImNvbnRlbnRUeXBlIiBDREFUQSBERUNMQVJFRCAidGV4dC9odG1sOyBJU08tODg1OS0xIikKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0NPTlRFTlRfVFlQRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9DVF9ERUZBVUxUKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0NPTlRFTlRfVFlQRSwgYWRlYyk7Ci0KLQkJCS8vICgiaW1wb3J0IiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfSU1QT1JUKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9JTVBPUlQsIGFkZWMpOwotCi0JCQkvLyAoInNlc3Npb24iIEVOVU0gREVDTEFSRUQgKHRydWV8ZmFsc2UpICJ0cnVlIikKLQkJCWFkZWMgPSBjcmVhdGVCb29sVHlwZShBVFRSX05BTUVfU0VTU0lPTiwgQVRUUl9WQUxVRV9UUlVFKTsKLQkJCWlmIChhZGVjICE9IG51bGwpCi0JCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfU0VTU0lPTiwgYWRlYyk7Ci0KLQkJCS8vICgiYnVmZmVyIiBDREFUQSBERUNMQVJFRCAiOGtiIikKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0JVRkZFUik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9CVUZTSVpfREVGQVVMVCk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9CVUZGRVIsIGFkZWMpOwotCi0JCQkvLyAoImF1dG9GbHVzaCIgRU5VTSBERUNMQVJFRCAodHJ1ZXxmYWxzZSkgInRydWUiKQotCQkJYWRlYyA9IGNyZWF0ZUJvb2xUeXBlKEFUVFJfTkFNRV9BVVRPRkxVU0gsIEFUVFJfVkFMVUVfVFJVRSk7Ci0JCQlpZiAoYWRlYyAhPSBudWxsKQotCQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0FVVE9GTFVTSCwgYWRlYyk7Ci0KLQkJCS8vICgiaXNUaHJlYWRTYWZlIiBFTlVNIERFQ0xBUkVEICh0cnVlfGZhbHNlKSAidHJ1ZSIpCi0JCQlhZGVjID0gY3JlYXRlQm9vbFR5cGUoQVRUUl9OQU1FX0lTX1RIUkVBRF9TQUZFLCBBVFRSX1ZBTFVFX1RSVUUpOwotCQkJaWYgKGFkZWMgIT0gbnVsbCkKLQkJCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9JU19USFJFQURfU0FGRSwgYWRlYyk7Ci0KLQkJCS8vICgiaW5mbyIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0lORk8pOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0lORk8sIGFkZWMpOwotCi0JCQkvLyAoImVycm9yUGFnZSIgVVJJIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9FUlJPUl9QQUdFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfRVJST1JfUEFHRSwgYWRlYyk7Ci0KLQkJCS8vICgiaXNFcnJvclBhZ2UiIEVOVU0gREVDTEFSRUQgKHRydWV8ZmFsc2UpICJmYWxzZSIpCi0JCQlhZGVjID0gY3JlYXRlQm9vbFR5cGUoQVRUUl9OQU1FX0lTX0VSUk9SX1BBR0UsIEFUVFJfVkFMVUVfRkFMU0UpOwotCQkJaWYgKGFkZWMgIT0gbnVsbCkKLQkJCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9JU19FUlJPUl9QQUdFLCBhZGVjKTsKLQotCQkJLy8gKCJwYWdlRW5jb2RpbmciIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9QQUdFX0VOQ09ESU5HKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9QQUdFX0VOQ09ESU5HLCBhZGVjKTsKLQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckRpckluY2x1ZGUoKSB7Ci0JCQkvLyAoImZpbGUiIFVSSSBSRVFVSVJFRCk7IERlZmVjdCBUT1JPOjE4NTI0MQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfRklMRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfRklMRSwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yRGlyVGFnbGliKCkgewotCQkJLy8gKCJ1cmkiIFVSSSBSRVFVSVJFRCkKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1VSSSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVVJJLCBhZGVjKTsKLQotCQkJLy8gKCJwcmVmaXgiIENEQVRBIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfUFJFRklYKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1BSRUZJWCwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yVXNlQmVhbigpIHsKLQkJCS8vICgiaWQiIElEIFJFUVVJUkVEKQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfSUQpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLklEKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSUQsIGFkZWMpOwotCi0JCQkvLyAoInNjb3BlIiBFTlVNIERFQ0xBUkVEIChwYWdlfHNlc3Npb258cmVxdWVzdHxhcHBsaWNhdGlvbikgInBhZ2UiKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfU0NPUEUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfUEFHRSwgQVRUUl9WQUxVRV9TRVNTSU9OLCBBVFRSX1ZBTFVFX1JFUVVFU1QsIEFUVFJfVkFMVUVfQVBQTElDQVRJT059OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfUEFHRSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9TQ09QRSwgYWRlYyk7Ci0KLQkJCS8vICgiY2xhc3MiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9DTEFTUyk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQ0xBU1MsIGFkZWMpOwotCi0JCQkvLyAoImJlYW5OYW1lIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQkVBTl9OQU1FKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9CRUFOX05BTUUsIGFkZWMpOwotCi0JCQkvLyAoInR5cGUiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9UWVBFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9UWVBFLCBhZGVjKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JTZXRQcm9wZXJ0eSgpIHsKLQkJCS8vICgibmFtZSIgSURSRUYgUkVRVUlSRUQpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9OQU1FKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5JRFJFRik7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX05BTUUsIGFkZWMpOwotCi0JCQkvLyAoInByb3BlcnR5IiBDREFUQSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1BST1BFUlRZKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1BST1BFUlRZLCBhZGVjKTsKLQotCQkJLy8gKCJ2YWx1ZSIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1ZBTFVFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9WQUxVRSwgYWRlYyk7Ci0KLQkJCS8vICgicGFyYW0iIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9QQVJBTSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfUEFSQU0sIGFkZWMpOwotCi0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yR2V0UHJvcGVydHkoKSB7Ci0JCQkvLyAoIm5hbWUiIElEUkVGIFJFUVVJUkVEKQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuSURSRUYpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9OQU1FLCBhZGVjKTsKLQotCQkJLy8gKCJwcm9wZXJ0eSIgQ0RBVEEgUkVRVUlSRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9QUk9QRVJUWSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9QUk9QRVJUWSwgYWRlYyk7Ci0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JJbmNsdWRlKCkgewotCQkJQXR0ckRlY2wgYWRlYyA9IG51bGw7Ci0JCQkvLyAoInBhZ2UiIFVSSSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1BBR0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1BBR0UsIGFkZWMpOwotCi0JCQkvLyAoImZsdXNoIiBFTlVNIE9QVElPTkFMICh0cnVlfGZhbHNlKSk7IERlZmVjdCBUT1JPOjE4NTI0MQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfRkxVU0gpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UUlVFLCBBVFRSX1ZBTFVFX0ZBTFNFfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX0ZBTFNFKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0ZMVVNILCBhZGVjKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JGb3J3YXJkKCkgewotCQkJLy8gKCJwYWdlIiBVUkkgUkVRVUlSRUQpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9QQUdFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9QQUdFLCBhZGVjKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JQbHVnaW4oKSB7Ci0JCQkvLyAoInR5cGUiIEVOVU0gUkVRVUlSRUQgKGJlYW58YXBwbGV0KSkKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1RZUEUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9CRUFOLCBBVFRSX1ZBTFVFX0FQUExFVH07Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVFlQRSwgYWRlYyk7Ci0KLQkJCS8vICgiY29kZSIgQ0RBVEEgUkVRVUlSRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9DT0RFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9DT0RFLCBhZGVjKTsKLQotCQkJLy8gKCJjb2RlYmFzZSIgVVJJIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQ09ERUJBU0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0NPREVCQVNFLCBhZGVjKTsKLQotCQkJLy8gKCJhbGlnbiIgRU5VTSBJTVBMSUVEICh0b3B8bWlkZGxlfGJvdHRvbXxsZWZ0fHJpZ2h0KSkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0FMSUdOKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIGFsaWducyA9IHtBVFRSX1ZBTFVFX1RPUCwgQVRUUl9WQUxVRV9NSURETEUsIEFUVFJfVkFMVUVfQk9UVE9NLCBBVFRSX1ZBTFVFX0xFRlQsIEFUVFJfVkFMVUVfUklHSFR9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXMoYWxpZ25zKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0FMSUdOLCBhZGVjKTsKLQotCQkJLy8gKCJhcmNoaXZlIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQVJDSElWRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQVJDSElWRSwgYWRlYyk7Ci0KLQkJCS8vICgiaGVpZ2h0IiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfSEVJR0hUKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9IRUlHSFQsIGFkZWMpOwotCi0JCQkvLyAoImhzcGFjZSIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0hTUEFDRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSFNQQUNFLCBhZGVjKTsKLQotCQkJLy8gKCJqcmV2ZXJzaW9uIiBDREFUQSBERUNMQVJFRCAiMS4xIikKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0pSRVZFUlNJT04pOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfSlZFUjExKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0pSRVZFUlNJT04sIGFkZWMpOwotCi0JCQkvLyAoIm5hbWUiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9OQU1FKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9OQU1FLCBhZGVjKTsKLQotCQkJLy8gKCJ2c3BhY2UiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9WU1BBQ0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1ZTUEFDRSwgYWRlYyk7Ci0KLQkJCS8vICgid2lkdGgiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9XSURUSCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfV0lEVEgsIGFkZWMpOwotCi0JCQkvLyAoIm5zcGx1Z2ludXJsIiBVUkkgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX05TUExVR0lOVVJMKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTlNQTFVHSU5VUkwsIGFkZWMpOwotCi0JCQkvLyAoImllcGx1Z2ludXJsIiBVUkkgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0lFUExVR0lOVVJMKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSUVQTFVHSU5VUkwsIGFkZWMpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvclBhcmFtKCkgewotCQkJLy8gKCJuYW1lIiBDREFUQSBSRVFVSVJFRCkKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX05BTUUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTkFNRSwgYWRlYyk7Ci0KLQkJCS8vICgidmFsdWUiIENEQVRBIFJFUVVJUkVEKTsgRGVmZWN0IFRPUk86MTg1MjQxCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9WQUxVRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9WQUxVRSwgYWRlYyk7Ci0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JSb290KCkgewotCQkJLy8gKCJ4bWxuczpqc3AiIENEQVRBICJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIikKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1hNTE5TX0pTUCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9YTUxOU19KU1ApOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfWE1MTlNfSlNQLCBhZGVjKTsKLQkJCS8vICgidmVyc2lvbiIgQ0RBVEEgUkVRVUlSRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9WRVJTSU9OKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1ZFUlNJT04sIGFkZWMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQ01OYW1lZE5vZGVNYXAgRU1QVFlfTUFQID0gbmV3IENNTmFtZWROb2RlTWFwKCkgewotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCQlyZXR1cm4gbmV3IEl0ZXJhdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JfTsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBuYW1lcyA9IG51bGw7Ci0KLQlzdGF0aWMgewotCQluYW1lcyA9IG5ldyBTdHJpbmdbSWRzLmdldE51bU9mSWRzKCldOwotCQluYW1lc1tJZHMuSURfU0NSSVBUTEVUXSA9IFNDUklQVExFVDsKLQkJbmFtZXNbSWRzLklEX0VYUFJFU1NJT05dID0gRVhQUkVTU0lPTjsKLQkJbmFtZXNbSWRzLklEX0RFQ0xBUkFUSU9OXSA9IERFQ0xBUkFUSU9OOwotCQluYW1lc1tJZHMuSURfRElSRUNUSVZFX1BBR0VdID0gRElSRUNUSVZFX1BBR0U7Ci0JCW5hbWVzW0lkcy5JRF9ESVJFQ1RJVkVfSU5DTFVERV0gPSBESVJFQ1RJVkVfSU5DTFVERTsKLQkJbmFtZXNbSWRzLklEX0RJUkVDVElWRV9UQUdMSUJdID0gRElSRUNUSVZFX1RBR0xJQjsKLQkJbmFtZXNbSWRzLklEX1VTRUJFQU5dID0gVVNFQkVBTjsKLQkJbmFtZXNbSWRzLklEX1NFVFBST1BFUlRZXSA9IFNFVFBST1BFUlRZOwotCQluYW1lc1tJZHMuSURfR0VUUFJPUEVSVFldID0gR0VUUFJPUEVSVFk7Ci0JCW5hbWVzW0lkcy5JRF9JTkNMVURFXSA9IElOQ0xVREU7Ci0JCW5hbWVzW0lkcy5JRF9GT1JXQVJEXSA9IEZPUldBUkQ7Ci0JCW5hbWVzW0lkcy5JRF9QTFVHSU5dID0gUExVR0lOOwotCQluYW1lc1tJZHMuSURfUEFSQU1TXSA9IFBBUkFNUzsKLQkJbmFtZXNbSWRzLklEX0ZBTExCQUNLXSA9IEZBTExCQUNLOwotCQluYW1lc1tJZHMuSURfUEFSQU1dID0gUEFSQU07Ci0JCW5hbWVzW0lkcy5JRF9ST09UXSA9IFJPT1Q7Ci0JCW5hbWVzW0lkcy5JRF9URVhUXSA9IFRFWFQ7Ci0JfQotCi0JSlNQRWxlbWVudENvbGxlY3Rpb24oU3RyaW5nW10gbmFtZXMsIGJvb2xlYW4gdG9sZXJhbnQpIHsKLQkJc3VwZXIobmFtZXMsIHRvbGVyYW50KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSlNQRWxlbWVudENvbGxlY3Rpb24oKSB7Ci0JCXN1cGVyKG5hbWVzLCBUT0xFUkFOVF9DQVNFKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICogQHBhcmFtIGVsZW1lbnROYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Ob2RlIGNyZWF0ZShTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIGNyZWF0ZUVsZW1EZWNsKGdldElEKGVsZW1lbnROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVpZCBpbnQKLQkgKi8KLQlDTUdyb3VwSW1wbCBjcmVhdGVDb250ZW50KGludCBlaWQpIHsKLQkJaWYgKGVpZCA9PSBJRF9VTktOT1dOKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ01Hcm91cEltcGwgY29udGVudCA9IG51bGw7Ci0JCUNNTm9kZSBjaGlsZCA9IG51bGw7Ci0KLQkJc3dpdGNoIChlaWQpIHsKLQkJCWNhc2UgSWRzLklEX0lOQ0xVREUgOgotCQkJY2FzZSBJZHMuSURfRk9SV0FSRCA6Ci0JCQkJLy8gKGpzcDpwYXJhbSkqCi0JCQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCQkJY2hpbGQgPSBpdGVtKElkcy5JRF9QQVJBTSk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfUExVR0lOIDoKLQkJCQkvLyAoanNwOnBhcmFtcyB8IGpzcDpmYWxsYmFjayk/Ci0JCQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgMSk7Ci0JCQkJLy8ganNwOnBhcmFtcwotCQkJCWNoaWxkID0gaXRlbShJZHMuSURfUEFSQU1TKTsKLQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQkJY29udGVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCQkJLy8ganNwOmZhbGxiYWNrCi0JCQkJY2hpbGQgPSBpdGVtKElkcy5JRF9GQUxMQkFDSyk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfUEFSQU1TIDoKLQkJCQkvLyAoanNwOnBhcmFtKSsKLQkJCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJCQljaGlsZCA9IGl0ZW0oSWRzLklEX1BBUkFNKTsKLQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQkJY29udGVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9ST09UIDoKLQkJCQkvLyAlQm9keTsKLQkJCQkvLyAtLT4gKGpzcDp0ZXh0fCVEaXJlY3RpdmVzO3wlU2NyaXB0czt8JUFjdGlvbnM7KSoKLQkJCQkvLyAgICAgJURpcmVjdGl2ZXMgLS0+IGpzcDpkaXJlY3RpdmUucGFnZXxqc3A6ZGlyZWN0aXZlLmluY2x1ZGUKLQkJCQkvLyAgICAgJVNjcmlwdHM7IC0tPiBqc3A6c2NyaXB0bGV0fGpzcDpkZWNsYXJhdGlvbnxqc3A6ZXhwcmVzc2lvbgotCQkJCS8vICAgICAlQWN0aW9ucyAtLT4ganNwOnVzZUJlYW58anNwLnNldFByb3BlcnR5fGpzcDpnZXRQcm9wZXJ0eQotCQkJCS8vICAgICAgICAgICAgICAgICAgfGpzcDppbmNsdWRlfGpzcDpmb3J3YXJkfGpzcDpwbHVnaW4KLQkJCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCQkJaW50IHZhbGlkQ2hpbGRyZW5bXSA9IHtJZHMuSURfVEVYVCwKLQkJCQkvLyAlRGlyZWN0dmVzOwotCQkJCQkJCUlkcy5JRF9ESVJFQ1RJVkVfUEFHRSwgSWRzLklEX0RJUkVDVElWRV9JTkNMVURFLAotCQkJCQkJCS8vICVTY3JpcHRzOwotCQkJCQkJCUlkcy5JRF9TQ1JJUFRMRVQsIElkcy5JRF9ERUNMQVJBVElPTiwgSWRzLklEX0VYUFJFU1NJT04sCi0JCQkJCQkJLy8gJUFjdGlvbnM7Ci0JCQkJCQkJSWRzLklEX1VTRUJFQU4sIElkcy5JRF9TRVRQUk9QRVJUWSwgSWRzLklEX0dFVFBST1BFUlRZLCBJZHMuSURfSU5DTFVERSwgSWRzLklEX0ZPUldBUkQsIElkcy5JRF9QTFVHSU59OwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQljaGlsZCA9IGl0ZW0odmFsaWRDaGlsZHJlbltpXSk7Ci0JCQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCQkJY29udGVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVpZCBpbnQKLQkgKi8KLQlIVE1MRWxlbWVudERlY2xhcmF0aW9uIGNyZWF0ZUVsZW1EZWNsKGludCBlaWQpIHsKLQkJaWYgKGVpZCA9PSBJRF9VTktOT1dOKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJVHlwZVBhY2tldCBwYWNrZXQgPSBuZXcgVHlwZVBhY2tldCgpOwotCQlzd2l0Y2ggKGVpZCkgewotCQkJY2FzZSBJZHMuSURfU0NSSVBUTEVUIDoKLQkJCQkvLyBjb250ZW50LCBvbWl0LCBsaW5lQnJlYWssIGxheW91dCwgY29ycmVjdCwgZm9ybWF0Ci0JCQkJLy8gc2NyaXB0bGV0Ci0JCQkJcGFja2V0Lm5hbWUgPSBTQ1JJUFRMRVQ7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfU0NSSVBUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfRVhQUkVTU0lPTiA6Ci0JCQkJLy8gZXhwcmVzc2lvbgotCQkJCXBhY2tldC5uYW1lID0gRVhQUkVTU0lPTjsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9TQ1JJUFQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9ERUNMQVJBVElPTiA6Ci0JCQkJLy8gZGVjbGFyYXRpb24KLQkJCQlwYWNrZXQubmFtZSA9IERFQ0xBUkFUSU9OOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX1NDUklQVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX0RJUkVDVElWRV9QQUdFIDoKLQkJCQkvLyBkaXJlY3RpdmUucGFnZQotCQkJCXBhY2tldC5uYW1lID0gRElSRUNUSVZFX1BBR0U7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9ESVJFQ1RJVkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9ESVJFQ1RJVkVfSU5DTFVERSA6Ci0JCQkJLy8gZGlyZWN0aXZlLmlubGN1ZGUKLQkJCQlwYWNrZXQubmFtZSA9IERJUkVDVElWRV9JTkNMVURFOwotCQkJCXBhY2tldC5vbWl0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfRElSRUNUSVZFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfRElSRUNUSVZFX1RBR0xJQiA6Ci0JCQkJLy8gZGlyZWN0aXZlLnRhZ2xpYgotCQkJCXBhY2tldC5uYW1lID0gRElSRUNUSVZFX1RBR0xJQjsKLQkJCQlwYWNrZXQub21pdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX0RJUkVDVElWRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1VTRUJFQU4gOgotCQkJCS8vIHVzZUJlYW4KLQkJCQlwYWNrZXQubmFtZSA9IFVTRUJFQU47Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlk7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsKLQkJCQlwYWNrZXQuaW5kZW50Q2hpbGQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfU0VUUFJPUEVSVFkgOgotCQkJCS8vIHNldFByb3BlcnR5Ci0JCQkJcGFja2V0Lm5hbWUgPSBTRVRQUk9QRVJUWTsKLQkJCQlwYWNrZXQub21pdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX0dFVFBST1BFUlRZIDoKLQkJCQkvLyBnZXRQcm9wZXJ0eQotCQkJCXBhY2tldC5uYW1lID0gR0VUUFJPUEVSVFk7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9JTkNMVURFIDoKLQkJCQkvLyBpbmNsdWRlCi0JCQkJcGFja2V0Lm5hbWUgPSBJTkNMVURFOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQkJCQlwYWNrZXQub21pdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVDsKLQkJCQlwYWNrZXQuaW5kZW50Q2hpbGQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfRk9SV0FSRCA6Ci0JCQkJLy8gZm9yd2FyZAotCQkJCXBhY2tldC5uYW1lID0gRk9SV0FSRDsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1BMVUdJTiA6Ci0JCQkJLy8gcGx1Z2luCi0JCQkJcGFja2V0Lm5hbWUgPSBQTFVHSU47Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1BBUkFNUyA6Ci0JCQkJLy8gcGFyYW1zCi0JCQkJcGFja2V0Lm5hbWUgPSBQQVJBTVM7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX0ZBTExCQUNLIDoKLQkJCQkvLyBmYWxsYmFjawotCQkJCXBhY2tldC5uYW1lID0gRkFMTEJBQ0s7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfUEFSQU0gOgotCQkJCS8vIHBhcmFtCi0JCQkJcGFja2V0Lm5hbWUgPSBQQVJBTTsKLQkJCQlwYWNrZXQub21pdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1JPT1QgOgotCQkJCXBhY2tldC5uYW1lID0gUk9PVDsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsgLy8gc2FtZSBhcyBIVE1MCi0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9URVhUIDoKLQkJCQlwYWNrZXQubmFtZSA9IFRFWFQ7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEE7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQkvLyB1bmtub3duIElECi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlFbGVtRGVjbCBkZWMgPSBuZXcgRWxlbURlY2wocGFja2V0KTsKLQotCQlDTUdyb3VwSW1wbCBjb250ZW50ID0gY3JlYXRlQ29udGVudChlaWQpOwotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJZGVjLnNldENvbnRlbnQoY29udGVudCk7Ci0KLQkJSkFDcmVhdGVyIGNyZWF0ZXIgPSBuZXcgSkFDcmVhdGVyKCk7Ci0JCWRlYy5zZXRBdHRyaWJ1dGVzKGNyZWF0ZXIuZ2V0RGVjbGFyYXRpb25zKGVpZCkpOwotCi0JCXJldHVybiBkZWM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wZXJ0eVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BlcnR5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM5NzJlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BlcnR5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0vKioKLSAqIFByb3BlcnR5UHJvdmlkZXIgY2xhc3MuCi0gKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBpbnN0YW5jZXMuCi0gKi8KLWludGVyZmFjZSBQcm9wZXJ0eVByb3ZpZGVyIHsKLQotCWJvb2xlYW4gc3VwcG9ydHMoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCk7Ci0KLQlPYmplY3QgZ2V0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWIxYWJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcGVydHlQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uLkFubm90YXRpb25NYXA7Ci0KLS8qKgotICogVGhlIGZhY3Rvcnkgb2JqZWN0IG9mIFByb3BlcnR5UHJvdmlkZXIuCi0gKi8KLWZpbmFsIGNsYXNzIFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5IHsKLQotCi0JLyoqCi0JICogRGVmYXVsdFByb3ZpZGVyIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIHVua25vd24gcHJvcGVydGllcy4KLQkgKiBJdCBhbHdheXMgcmV0dXJucyBudWxsIHZhbHVlIGZvciBhbnkgcHJvcGVydGllcy4KLQkgKi8KLQljbGFzcyBEZWZhdWx0UHJvdmlkZXIgaW1wbGVtZW50cyBQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIERlZmF1bHRQcm92aWRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldChIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCWFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgaW1wbGVtZW50cyBQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCkgewotCQkJcmV0dXJuIChlZGVjbCAhPSBudWxsKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpIHsKLQkJCWlmICghKGVkZWNsIGluc3RhbmNlb2YgSFRNTFByb3BlcnR5RGVjbGFyYXRpb24pKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGdldEVsZW1lbnRQcm9wZXJ0eSgoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24pZWRlY2wpOwotCQl9Ci0KLQkJYWJzdHJhY3QgcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCk7Ci0JfQotCi0JLyoKLQkgKiAidGFnSW5mbyIKLQkgKiBnZXRzIGRvY3VtZW50YXRpb24gZm9yIHRoZSBlbGVtZW50Ci0JICovCi0JY2xhc3MgUFBUYWdJbmZvIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBodG1sQW5ub3RhdGlvbkxvYyA9ICJkYXRhL2h0bXJlZi54bWwiOyAvLyROT04tTkxTLTEkCi0JCXByb3RlY3RlZCBBbm5vdGF0aW9uTWFwIGZBbm5vdGF0aW9uTWFwID0gbnVsbDsKLQotCQlwdWJsaWMgUFBUYWdJbmZvKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBHZXRzIHRoZSBhbm5vdGF0aW9uTWFwLgotCQkgKiBAcmV0dXJuIFJldHVybnMgYSBBbm5vdGF0aW9uTWFwCi0JCSAqLwotCQlwcm90ZWN0ZWQgQW5ub3RhdGlvbk1hcCBnZXRBbm5vdGF0aW9uTWFwKCkgewotCQkJaWYgKGZBbm5vdGF0aW9uTWFwID09IG51bGwpIHsKLQkJCQlmQW5ub3RhdGlvbk1hcCA9IG5ldyBBbm5vdGF0aW9uTWFwKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJZkFubm90YXRpb25NYXAubG9hZChodG1sQW5ub3RhdGlvbkxvYywgSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIG5vIGFubm90YXRpb24gYXZhaWxhYmxlCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZBbm5vdGF0aW9uTWFwOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJaWYgKGRlY2wgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJcmV0dXJuIGdldEFubm90YXRpb25NYXAoKS5nZXRQcm9wZXJ0eSgoKEhUTUxFbGVtZW50RGVjbGFyYXRpb24pZGVjbCkuZ2V0RWxlbWVudE5hbWUoKSwgInRhZ0luZm8iKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogInNob3VsZEtlZXBTcGFjZSIKLQkgKi8KLQljbGFzcyBQUFNob3VsZEtlZXBTcGFjZSBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBTaG91bGRLZWVwU3BhY2UoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGRlY2wuc2hvdWxkS2VlcFNwYWNlcygpKTsKLQkJfQotCX0KLQotCS8qCi0JICogInNob3VsZEluZGVudENoaWxkU291cmNlIgotCSAqLwotCWNsYXNzIFBQU2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQU2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGRlY2wuc2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJ0ZXJtaW5hdG9ycyIKLQkgKi8KLQljbGFzcyBQUFRlcm1pbmF0b3JzIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUFRlcm1pbmF0b3JzKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCWlmICghIChkZWNsIGluc3RhbmNlb2YgSFRNTEVsZW1EZWNsSW1wbCkpIHJldHVybiBudWxsOwotCQkJcmV0dXJuICgoSFRNTEVsZW1EZWNsSW1wbClkZWNsKS5nZXRUZXJtaW5hdG9ycygpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAicHJvaGliaXRlZEFuY2VzdG9ycyIKLQkgKi8KLQljbGFzcyBQUFByb2hpYml0ZWRBbmNlc3RvcnMgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQUHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gZGVjbC5nZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJpc0pTUCIKLQkgKi8KLQljbGFzcyBQUElzSlNQIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUElzSlNQKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihkZWNsLmlzSlNQKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAiaXNYSFRNTCIKLQkgKiBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGl0c2VsZiBuZXZlciByZXByZXNlbnQgYW55IFhIVE1MIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0JICogU28sIHRoaXMgcHJvcGVydHkgbXVzdCBiZSBhbHdheXMgZmFsc2UuCi0JICovCi0JY2xhc3MgUFBJc1hIVE1MIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUElzWEhUTUwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qCi0JICogImlzU1NJIgotCSAqIEVhY2ggZGVjbGFyYXRpb24gY2xhc3MgZm9yIFNTSSBlbGVtZW50cyBtdXN0IHByb3ZpZGUgdGhpcyBwcm9wZXJ0eSBpdHNlbGYsCi0JICogYW5kIHRoZW4gcmV0dXJuIHRydWUuICBPdGhlciBkZWNsYXJhdGlvbiBtdXN0IGFsd2F5cyByZXR1cm4gZmFsc2UuCi0JICovCi0JY2xhc3MgUFBJc1NTSSBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBJc1NTSSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAibGluZUJyZWFrSGludCIKLQkgKi8KLQljbGFzcyBQUExpbmVCcmVha0hpbnQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQTGluZUJyZWFrSGludCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlTdHJpbmcgaGludCA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX05PTkU7Ci0JCQlzd2l0Y2ggKGRlY2wuZ2V0TGluZUJyZWFrSGludCgpKSB7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0FGVEVSX1NUQVJUIDoKLQkJCQkJaGludCA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX0FGVEVSX1NUQVJUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQgOgotCQkJCQloaW50ID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19OT05FIDoKLQkJCQkvLyBub3RoaW5nIHRvIGRvCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIGhpbnQ7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJsYXlvdXRUeXBlIgotCSAqLwotCWNsYXNzIFBQTGF5b3V0VHlwZSBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBMYXlvdXRUeXBlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCVN0cmluZyB0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX05PTkU7Ci0JCQlzd2l0Y2ggKGRlY2wuZ2V0TGF5b3V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9CTE9DSyA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5MQVlPVVRfQkxPQ0s7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfQlJFQUsgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX0JSRUFLOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTiA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5MQVlPVVRfSElEREVOOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVCA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5MQVlPVVRfT0JKRUNUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX1dSQVAgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX1dSQVA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfTk9ORSA6Ci0JCQkJLy8gbm90aGluZyB0byBkby4KLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gdHlwZTsKLQkJfQotCX0KLQotCS8qCi0JICogIm9taXRUeXBlIgotCSAqLwotCWNsYXNzIFBQT21pdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQT21pdFR5cGUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJU3RyaW5nIHR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX05PTkU7Ci0JCQlzd2l0Y2ggKGRlY2wuZ2V0T21pdFR5cGUoKSkgewotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0JPVEggOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9CT1RIOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORF9ERUZBVUxUIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX0RFRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORF9NVVNUIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX01VU1Q7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX05PTkUgOgotCQkJCS8vIG5vdGhpbmcgdG8gZG8uCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIHR5cGU7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJpbmNsdXNpb24iCi0JICovCi0JY2xhc3MgUFBJbmNsdXNpb24gZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQSW5jbHVzaW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBkZWNsLmdldEluY2x1c2lvbigpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0eVByb3ZpZGVyIGdldFByb3ZpZGVyKFN0cmluZyBwcm9wTmFtZSkgewotCQlQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSBmYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLQkJUHJvcGVydHlQcm92aWRlciBwcCA9IChQcm9wZXJ0eVByb3ZpZGVyKSBmYWN0b3J5LnJlZ2lzdHJ5LmdldChwcm9wTmFtZSk7Ci0JCWlmIChwcCAhPSBudWxsKQotCQkJcmV0dXJuIHBwOwotCi0JCXBwID0gZmFjdG9yeS5jcmVhdGUocHJvcE5hbWUpOwotCQlpZiAocHAgPT0gbnVsbCkKLQkJCXJldHVybiBmYWN0b3J5LmRlZmF1bHRQcm92aWRlcjsKLQotCQlmYWN0b3J5LnJlZ2lzdHJ5LnB1dChwcm9wTmFtZSwgcHApOwotCQlyZXR1cm4gcHA7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydHlQcm92aWRlckZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgIT0gbnVsbCkKLQkJCXJldHVybiBpbnN0YW5jZTsKLQkJaW5zdGFuY2UgPSBuZXcgUHJvcGVydHlQcm92aWRlckZhY3RvcnkoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgSGFzaHRhYmxlIHJlZ2lzdHJ5ID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgUHJvcGVydHlQcm92aWRlciBkZWZhdWx0UHJvdmlkZXIgPSBuZXcgRGVmYXVsdFByb3ZpZGVyKCk7Ci0KLQlwcml2YXRlIFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlQcm92aWRlciBjcmVhdGUoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCVByb3BlcnR5UHJvdmlkZXIgcHAgPSBudWxsOwotCQlpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfSlNQKSkKLQkJCXBwID0gbmV3IFBQSXNKU1AoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcHAgPSBuZXcgUFBJc1hIVE1MKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1NTSSkpCi0JCQlwcCA9IG5ldyBQUElzU1NJKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLkxBWU9VVF9UWVBFKSkKLQkJCXBwID0gbmV3IFBQTGF5b3V0VHlwZSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpKQotCQkJcHAgPSBuZXcgUFBMaW5lQnJlYWtIaW50KCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlBST0hJQklURURfQU5DRVNUT1JTKSkKLQkJCXBwID0gbmV3IFBQUHJvaGliaXRlZEFuY2VzdG9ycygpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfS0VFUF9TUEFDRSkpCi0JCQlwcCA9IG5ldyBQUFNob3VsZEtlZXBTcGFjZSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSU5ERU5UX0NISUxEX1NPVVJDRSkpCi0JCQlwcCA9IG5ldyBQUFNob3VsZEluZGVudENoaWxkU291cmNlKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlRFUk1JTkFUT1JTKSkKLQkJCXBwID0gbmV3IFBQVGVybWluYXRvcnMoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVEFHSU5GTykpCi0JCQlwcCA9IG5ldyBQUFRhZ0luZm8oKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuT01JVF9UWVBFKSkKLQkJCXBwID0gbmV3IFBQT21pdFR5cGUoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSU5DTFVTSU9OKSkKLQkJCXBwID0gbmV3IFBQSW5jbHVzaW9uKCk7Ci0KLQkJcmV0dXJuIHBwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvVGFnMjBFbGVtZW50Q29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9UYWcyMEVsZW1lbnRDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZTQwZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9UYWcyMEVsZW1lbnRDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBlbGVtZW50IGRlY2xhcmF0aW9ucyBvZiBKU1AgMi4wIFRhZyBmaWxlcy4KLSAqLwotZmluYWwgY2xhc3MgVGFnMjBFbGVtZW50Q29sbGVjdGlvbiBleHRlbmRzIEpTUEVsZW1lbnRDb2xsZWN0aW9uIGltcGxlbWVudHMgSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUgewotCS8vIGVsZW1lbnQgSURzCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGFnSWRzMjAgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TQ1JJUFRMRVQgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FWFBSRVNTSU9OID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREVDTEFSQVRJT04gPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESVJFQ1RJVkVfVEFHID0gMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElSRUNUSVZFX0lOQ0xVREUgPSA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESVJFQ1RJVkVfVEFHTElCID0gNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVVNFQkVBTiA9IDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NFVFBST1BFUlRZID0gNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfR0VUUFJPUEVSVFkgPSA4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JTkNMVURFID0gOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRk9SV0FSRCA9IDEwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QTFVHSU4gPSAxMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUEFSQU1TID0gMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZBTExCQUNLID0gMTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BBUkFNID0gMTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JPT1QgPSAxNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEVYVCA9IDE2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESVJFQ1RJVkVfVkFSSUFCTEUgPSAxNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElSRUNUSVZFX0FUVFJJQlVURSA9IDE4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CT0RZID0gMTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FUVFJJQlVURSA9IDIwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FTEVNRU5UID0gMjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RPQk9EWSA9IDIyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JTlZPS0UgPSAyMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1VUUFVUID0gMjQ7Ci0KLQkJLy8gY2hhY2hlIHRoZSByZXN1bHQgb2YgdGhlIHJlZmxlY3Rpb24uCi0JCXByaXZhdGUgc3RhdGljIGludCBudW1vZmlkcyA9IC0xOwotCi0JCXB1YmxpYyBzdGF0aWMgaW50IGdldE51bU9mSWRzKCkgewotCQkJaWYgKG51bW9maWRzICE9IC0xKQotCQkJCXJldHVybiBudW1vZmlkczsKLQotCQkJLy8gTk9URTogSWYgdGhlIHJlZmxlY3Rpb24gaXMgdG9vIHNsb3csIHRoaXMgbWV0aG9kIHNob3VsZAotCQkJLy8ganVzdCByZXR1cm4gdGhlIGxpdGVyYWwgdmFsdWUsIGxpa2UgMTA1LgotCQkJLy8gLS0gNS8yNS8yMDAxCi0JCQlDbGFzcyBjbGF6eiA9IFRhZ0lkczIwLmNsYXNzOwotCQkJRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXRGaWVsZHMoKTsKLQkJCW51bW9maWRzID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBmaWVsZHNbaV0uZ2V0TmFtZSgpOwotCQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIklEXyIpKS8vJE5PTi1OTFMtMSQKLQkJCQkJbnVtb2ZpZHMrKzsKLQkJCX0KLQkJCXJldHVybiBudW1vZmlkczsKLQkJfQotCX0KLQotCS8vIGF0dHJpYnV0ZSBjcmVhdGVyCi0JcHJpdmF0ZSBjbGFzcyBUQUNyZWF0ZXIyMCBleHRlbmRzIEpBQ3JlYXRlciB7Ci0KLQkJcHVibGljIFRBQ3JlYXRlcjIwKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JBdHRyaWJ1dGUoKSB7Ci0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9OQU1FKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX05BTUUsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9UUklNKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfVFJVRSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1RSSU0sIGFkZWMpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckJvZHkoKSB7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yRGlyQXR0cmlidXRlKCkgewotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9OQU1FLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfUkVRVUlSRUQpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1tde0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9GQUxTRSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1JFUVVJUkVELCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRlJBR01FTlQpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJdmFsdWVzID0gbmV3IFN0cmluZ1tde0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9GQUxTRSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZSQUdNRU5ULCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfUlRFWFBSVkFMVUUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJdmFsdWVzID0gbmV3IFN0cmluZ1tde0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9UUlVFKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfUlRFWFBSVkFMVUUsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9ERVNDUklQVElPTik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9ERVNDUklQVElPTiwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yRGlyVGFnKCkgewotCQkJLy8gKCJpbXBvcnQiIFVSSSBvcHRpb25hbCkKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0lNUE9SVCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSU1QT1JULCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRElTUExBWV9OQU1FKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5JRCk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RJU1BMQVlfTkFNRSwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPRFlfQ09OVEVOVCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7SlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9FTVBUWSwgSlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9UQUdERVBFTkRFTlQsIEpTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfU0NSSVBUTEVTU307Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBKU1AyME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NDUklQVExFU1MpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfQk9EWV9DT05URU5ULCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRFlOQU1JQ19BVFRSSUJVVEVTKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RZTkFNSUNfQVRUUklCVVRFUywgYWRlYyk7Ci0JCQkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1NNQUxMX0lDT04pOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1NNQUxMX0lDT04sIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9MQVJHRV9JQ09OKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9MQVJHRV9JQ09OLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfREVTQ1JJUFRJT04pOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfREVTQ1JJUFRJT04sIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9FWEFNUExFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0VYQU1QTEUsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9MQU5HVUFHRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9KQVZBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfTEFOR1VBR0UsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9JTVBPUlQpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfSU1QT1JULCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfUEFHRV9FTkNPRElORyk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgSlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9FTkNPRElOR19ERUZBVUxUKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfUEFHRV9FTkNPRElORywgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0lTRUxJR05PUkVEKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCXZhbHVlcyA9IG5ldyBTdHJpbmdbXXtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfRkFMU0UpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9JU0VMSUdOT1JFRCwgYWRlYyk7Ci0JCX0KLQotCQkvKioKLQkJICogQ2hhbmdlZCBpbiAyLjAgKHRhZ2RpciBhZGRlZCkKLQkJICovCi0JCXZvaWQgY3JlYXRlRm9yRGlyVGFnbGliKCkgewotCQkJLy8gKCJ1cmkiIFVSSSBPUFRJT05BTCkKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1VSSSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVVJJLCBhZGVjKTsKLQotCQkJLy8gKCJ0YWdkaXIiIFVSSSBPUFRJT05BTCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBR0RJUik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVEFHRElSLCBhZGVjKTsKLQotCQkJLy8gKCJwcmVmaXgiIENEQVRBIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfUFJFRklYKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1BSRUZJWCwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yRGlyVmFyaWFibGUoKSB7Ci0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FX0dJVkVOKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUVfR0lWRU4sIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FX0ZST01fQVRUUklCVVRFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUVfRlJPTV9BVFRSSUJVVEUsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElBUyk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElBUywgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBUklBQkxFX0NMQVNTKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBKU1AyME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1ZBUklBQkxFX0NMQVNTX0RFRkFVTFQpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQVJJQUJMRV9DTEFTUywgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RFQ0xBUkUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1tde0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9UUlVFKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfREVDTEFSRSwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RFU0NSSVBUSU9OKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RFU0NSSVBUSU9OLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfU0NPUEUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJdmFsdWVzID0gbmV3IFN0cmluZ1tde0pTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfU0NPUEVfTkVTVEVELCBKU1AyME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NDT1BFX0FUX0JFR0lOLCBKU1AyME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NDT1BFX0FUX0VORH07Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgSlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9TQ09QRV9ORVNURUQpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfU0NPUEUsIGFkZWMpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckRvQm9keSgpIHsKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBUik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQVIsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQVJSRUFERVIpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVkFSUkVBREVSLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfU0NPUEUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfUEFHRSwgQVRUUl9WQUxVRV9SRVFVRVNULCBBVFRSX1ZBTFVFX1NFU1NJT04sIEFUVFJfVkFMVUVfQVBQTElDQVRJT059OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfUEFHRSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1NDT1BFLCBhZGVjKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JFbGVtZW50KCkgewotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9OQU1FLCBhZGVjKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JJbnZva2UoKSB7Ci0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9GUkFHTUVOVCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRlJBR01FTlQsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQVIpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVkFSLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfVkFSUkVBREVSKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBUlJFQURFUiwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1NDT1BFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1BBR0UsIEFUVFJfVkFMVUVfUkVRVUVTVCwgQVRUUl9WQUxVRV9TRVNTSU9OLCBBVFRSX1ZBTFVFX0FQUExJQ0FUSU9OfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1BBR0UpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9TQ09QRSwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yT3V0cHV0KCkgewotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfT01JVF9YTUxfREVDTCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UUlVFLCBBVFRSX1ZBTFVFX0ZBTFNFLCBKU1AyME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1lFUywgSlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9OT307Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgSlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9OTyk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX09NSVRfWE1MX0RFQ0wsIGFkZWMpOwotCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9ET0NUWVBFX1JPT1RfRUxFTUVOVCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUw7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9ET0NUWVBFX1JPT1RfRUxFTUVOVCwgYWRlYyk7Ci0KLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RPQ1RZUEVfU1lTVEVNKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX0RPQ1RZUEVfU1lTVEVNLCBhZGVjKTsKLQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRE9DVFlQRV9QVUJMSUMpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShKU1AyME5hbWVzcGFjZS5BVFRSX05BTUVfRE9DVFlQRV9QVUJMSUMsIGFkZWMpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yUm9vdCgpIHsKLQkJCS8vICgieG1sbnM6anNwIiBDREFUQSAiaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSIpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9YTUxOU19KU1ApOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfWE1MTlNfSlNQKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1hNTE5TX0pTUCwgYWRlYyk7Ci0JCQkvLyAoInZlcnNpb24iIENEQVRBIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfVkVSU0lPTik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgSlNQMjBOYW1lc3BhY2UuQVRUUl9WQUxVRV9KU1BfVkVSXzIwKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVkVSU0lPTiwgYWRlYyk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JQbHVnaW4oKSB7Ci0JCQkvLyAoInR5cGUiIEVOVU0gUkVRVUlSRUQgKGJlYW58YXBwbGV0KSkKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1RZUEUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9CRUFOLCBBVFRSX1ZBTFVFX0FQUExFVH07Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVFlQRSwgYWRlYyk7Ci0KLQkJCS8vICgiY29kZSIgQ0RBVEEgUkVRVUlSRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9DT0RFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9DT0RFLCBhZGVjKTsKLQotCQkJLy8gKCJjb2RlYmFzZSIgVVJJIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQ09ERUJBU0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0NPREVCQVNFLCBhZGVjKTsKLQotCQkJLy8gKCJhbGlnbiIgRU5VTSBJTVBMSUVEICh0b3B8bWlkZGxlfGJvdHRvbXxsZWZ0fHJpZ2h0KSkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0FMSUdOKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIGFsaWducyA9IHtBVFRSX1ZBTFVFX1RPUCwgQVRUUl9WQUxVRV9NSURETEUsIEFUVFJfVkFMVUVfQk9UVE9NLCBBVFRSX1ZBTFVFX0xFRlQsIEFUVFJfVkFMVUVfUklHSFR9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXMoYWxpZ25zKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfQk9UVE9NKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0FMSUdOLCBhZGVjKTsKLQotCQkJLy8gKCJhcmNoaXZlIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQVJDSElWRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQVJDSElWRSwgYWRlYyk7Ci0KLQkJCS8vICgiaGVpZ2h0IiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfSEVJR0hUKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9IRUlHSFQsIGFkZWMpOwotCi0JCQkvLyAoImhzcGFjZSIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0hTUEFDRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSFNQQUNFLCBhZGVjKTsKLQotCQkJLy8gKCJqcmV2ZXJzaW9uIiBDREFUQSBERUNMQVJFRCAiMS4xIikKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0pSRVZFUlNJT04pOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEpTUDIwTmFtZXNwYWNlLkFUVFJfVkFMVUVfSlZFUjEyKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0pSRVZFUlNJT04sIGFkZWMpOwotCi0JCQkvLyAoIm5hbWUiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9OQU1FKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9OQU1FLCBhZGVjKTsKLQotCQkJLy8gKCJ2c3BhY2UiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9WU1BBQ0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1ZTUEFDRSwgYWRlYyk7Ci0KLQkJCS8vICgid2lkdGgiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9XSURUSCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfV0lEVEgsIGFkZWMpOwotCi0JCQkvLyAoIm5zcGx1Z2ludXJsIiBVUkkgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX05TUExVR0lOVVJMKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTlNQTFVHSU5VUkwsIGFkZWMpOwotCi0JCQkvLyAoImllcGx1Z2ludXJsIiBVUkkgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0lFUExVR0lOVVJMKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSUVQTFVHSU5VUkwsIGFkZWMpOwotCQkJCi0JCQkvLyAoIm1heXNjcmlwdCIgRU5VTSBJTVBMSUVEICh0cnVlIHwgZmFsc2UpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEpTUDIwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVlTQ1JJUFQpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXMobmV3IFN0cmluZ1tdIHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9KTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSlNQMjBOYW1lc3BhY2UuQVRUUl9OQU1FX01BWVNDUklQVCwgYWRlYyk7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsIGdldERlY2xhcmF0aW9ucyhpbnQgZWlkKSB7Ci0JCQlzd2l0Y2ggKGVpZCkgewotCQkJCWNhc2UgVGFnSWRzMjAuSURfRElSRUNUSVZFX1RBRyA6Ci0JCQkJCWNyZWF0ZUZvckRpclRhZygpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRhZ0lkczIwLklEX0RJUkVDVElWRV9WQVJJQUJMRSA6Ci0JCQkJCWNyZWF0ZUZvckRpclZhcmlhYmxlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVGFnSWRzMjAuSURfRElSRUNUSVZFX0FUVFJJQlVURSA6Ci0JCQkJCWNyZWF0ZUZvckRpckF0dHJpYnV0ZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRhZ0lkczIwLklEX0RJUkVDVElWRV9UQUdMSUIgOgotCQkJCQljcmVhdGVGb3JEaXJUYWdsaWIoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUYWdJZHMyMC5JRF9BVFRSSUJVVEUgOgotCQkJCQljcmVhdGVGb3JBdHRyaWJ1dGUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUYWdJZHMyMC5JRF9FTEVNRU5UIDoKLQkJCQkJY3JlYXRlRm9yRWxlbWVudCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRhZ0lkczIwLklEX0JPRFkgOgotCQkJCQljcmVhdGVGb3JCb2R5KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVGFnSWRzMjAuSURfRE9CT0RZIDoKLQkJCQkJY3JlYXRlRm9yRG9Cb2R5KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVGFnSWRzMjAuSURfSU5WT0tFIDoKLQkJCQkJY3JlYXRlRm9ySW52b2tlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVGFnSWRzMjAuSURfT1VUUFVUIDoKLQkJCQkJY3JlYXRlRm9yT3V0cHV0KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVGFnSWRzMjAuSURfUk9PVCA6Ci0JCQkJCWNyZWF0ZUZvclJvb3QoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUYWdJZHMyMC5JRF9QTFVHSU4gOgotCQkJCQljcmVhdGVGb3JQbHVnaW4oKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXN1cGVyLmdldERlY2xhcmF0aW9ucyhlaWQpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiBkZWNsYXJhdGlvbnM7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBuYW1lcyA9IG51bGw7Ci0KLQlzdGF0aWMgewotCQluYW1lcyA9IG5ldyBTdHJpbmdbVGFnSWRzMjAuZ2V0TnVtT2ZJZHMoKV07Ci0JCW5hbWVzW0lkcy5JRF9TQ1JJUFRMRVRdID0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBUTEVUOwotCQluYW1lc1tJZHMuSURfRVhQUkVTU0lPTl0gPSBKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5FWFBSRVNTSU9OOwotCQluYW1lc1tJZHMuSURfREVDTEFSQVRJT05dID0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuREVDTEFSQVRJT047Ci0JCW5hbWVzW1RhZ0lkczIwLklEX0RJUkVDVElWRV9UQUddID0gSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBRzsKLQkJbmFtZXNbSWRzLklEX0RJUkVDVElWRV9JTkNMVURFXSA9IEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9JTkNMVURFOwotCQluYW1lc1tJZHMuSURfRElSRUNUSVZFX1RBR0xJQl0gPSBKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVEFHTElCOwotCQluYW1lc1tJZHMuSURfVVNFQkVBTl0gPSBKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOOwotCQluYW1lc1tJZHMuSURfU0VUUFJPUEVSVFldID0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0VUUFJPUEVSVFk7Ci0JCW5hbWVzW0lkcy5JRF9HRVRQUk9QRVJUWV0gPSBKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5HRVRQUk9QRVJUWTsKLQkJbmFtZXNbSWRzLklEX0lOQ0xVREVdID0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU5DTFVERTsKLQkJbmFtZXNbSWRzLklEX0ZPUldBUkRdID0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9SV0FSRDsKLQkJbmFtZXNbSWRzLklEX1BMVUdJTl0gPSBKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5QTFVHSU47Ci0JCW5hbWVzW0lkcy5JRF9QQVJBTVNdID0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuUEFSQU1TOwotCQluYW1lc1tJZHMuSURfRkFMTEJBQ0tdID0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuRkFMTEJBQ0s7Ci0JCW5hbWVzW0lkcy5JRF9QQVJBTV0gPSBKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5QQVJBTTsKLQkJbmFtZXNbSWRzLklEX1JPT1RdID0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuUk9PVDsKLQkJbmFtZXNbSWRzLklEX1RFWFRdID0gSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEVYVDsKLQkJbmFtZXNbVGFnSWRzMjAuSURfRElSRUNUSVZFX1ZBUklBQkxFXSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9WQVJJQUJMRTsKLQkJbmFtZXNbVGFnSWRzMjAuSURfRElSRUNUSVZFX0FUVFJJQlVURV0gPSBKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfQVRUUklCVVRFOwotCQluYW1lc1tUYWdJZHMyMC5JRF9CT0RZXSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFk7Ci0JCW5hbWVzW1RhZ0lkczIwLklEX0FUVFJJQlVURV0gPSBKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BVFRSSUJVVEU7Ci0JCW5hbWVzW1RhZ0lkczIwLklEX0VMRU1FTlRdID0gSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRUxFTUVOVDsKLQkJbmFtZXNbVGFnSWRzMjAuSURfRE9CT0RZXSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRPQk9EWTsKLQkJbmFtZXNbVGFnSWRzMjAuSURfSU5WT0tFXSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklOVk9LRTsKLQkJbmFtZXNbVGFnSWRzMjAuSURfT1VUUFVUXSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9VVFBVVDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgVGFnMjBFbGVtZW50Q29sbGVjdGlvbigpIHsKLQkJc3VwZXIoVGFnMjBFbGVtZW50Q29sbGVjdGlvbi5uYW1lcywgVE9MRVJBTlRfQ0FTRSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBlbGVtZW50TmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBDTU5vZGUgY3JlYXRlKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gY3JlYXRlRWxlbURlY2woZ2V0SUQoZWxlbWVudE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWlkCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlDTUdyb3VwSW1wbCBjcmVhdGVDb250ZW50KGludCBlaWQpIHsKLQkJaWYgKGVpZCA9PSBJRF9VTktOT1dOKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ01Hcm91cEltcGwgY29udGVudCA9IG51bGw7Ci0JCUNNTm9kZSBjaGlsZCA9IG51bGw7Ci0KLQkJc3dpdGNoIChlaWQpIHsKLQkJCWNhc2UgSWRzLklEX1JPT1QgOgotCQkJCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJCQlpbnQgdmFsaWRDaGlsZHJlbltdID0gewotCQkJCS8vICVEaXJlY3RpdmVzOwotCQkJCQkJCUlkcy5JRF9URVhULCBJZHMuSURfRElSRUNUSVZFX1BBR0UsIElkcy5JRF9ESVJFQ1RJVkVfSU5DTFVERSwgVGFnSWRzMjAuSURfRElSRUNUSVZFX1RBRywgVGFnSWRzMjAuSURfRElSRUNUSVZFX1ZBUklBQkxFLCBUYWdJZHMyMC5JRF9ESVJFQ1RJVkVfQVRUUklCVVRFLCBUYWdJZHMyMC5JRF9CT0RZLCBUYWdJZHMyMC5JRF9BVFRSSUJVVEUsCi0JCQkJCQkJLy8gJVNjcmlwdHM7Ci0JCQkJCQkJSWRzLklEX1NDUklQVExFVCwgSWRzLklEX0RFQ0xBUkFUSU9OLCBJZHMuSURfRVhQUkVTU0lPTiwKLQkJCQkJCQkvLyAlQWN0aW9uczsKLQkJCQkJCQlJZHMuSURfVVNFQkVBTiwgSWRzLklEX1NFVFBST1BFUlRZLCBJZHMuSURfR0VUUFJPUEVSVFksIElkcy5JRF9JTkNMVURFLCBJZHMuSURfRk9SV0FSRCwgSWRzLklEX1BMVUdJTn07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWNoaWxkID0gaXRlbSh2YWxpZENoaWxkcmVuW2ldKTsKLQkJCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJCQljb250ZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQljb250ZW50ID0gc3VwZXIuY3JlYXRlQ29udGVudChlaWQpOwotCQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVpZAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVFbGVtRGVjbChpbnQgZWlkKSB7Ci0JCWlmIChlaWQgPT0gSURfVU5LTk9XTikKLQkJCXJldHVybiBudWxsOwotCi0JCVR5cGVQYWNrZXQgcGFja2V0ID0gbmV3IFR5cGVQYWNrZXQoKTsKLQkJc3dpdGNoIChlaWQpIHsKLQkJCWNhc2UgVGFnSWRzMjAuSURfRElSRUNUSVZFX1RBRyA6Ci0JCQkJLy8gZGlyZWN0aXZlLnRhZ2xpYgotCQkJCXBhY2tldC5uYW1lID0gRElSRUNUSVZFX1RBRzsKLQkJCQlwYWNrZXQub21pdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX0RJUkVDVElWRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVGFnSWRzMjAuSURfRElSRUNUSVZFX1ZBUklBQkxFIDoKLQkJCQkvLyBkaXJlY3RpdmUudGFnbGliCi0JCQkJcGFja2V0Lm5hbWUgPSBESVJFQ1RJVkVfVkFSSUFCTEU7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9ESVJFQ1RJVkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRhZ0lkczIwLklEX0RJUkVDVElWRV9BVFRSSUJVVEUgOgotCQkJCS8vIGRpcmVjdGl2ZS50YWdsaWIKLQkJCQlwYWNrZXQubmFtZSA9IERJUkVDVElWRV9BVFRSSUJVVEU7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9ESVJFQ1RJVkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRhZ0lkczIwLklEX0RJUkVDVElWRV9UQUdMSUIgOgotCQkJCS8vIGRpcmVjdGl2ZS50YWdsaWIKLQkJCQlwYWNrZXQubmFtZSA9IERJUkVDVElWRV9UQUdMSUI7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9ESVJFQ1RJVkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRhZ0lkczIwLklEX0JPRFkgOgotCQkJCS8vIGRlY2xhcmF0aW9uCi0JCQkJcGFja2V0Lm5hbWUgPSBCT0RZOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVDsKLQkJCQlwYWNrZXQuaW5kZW50Q2hpbGQgPSB0cnVlOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfU0NSSVBUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBUYWdJZHMyMC5JRF9FTEVNRU5UIDoKLQkJCQkvLyBkZWNsYXJhdGlvbgotCQkJCXBhY2tldC5uYW1lID0gSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRUxFTUVOVDsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX1NDUklQVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgVGFnSWRzMjAuSURfQVRUUklCVVRFIDoKLQkJCQkvLyBkZWNsYXJhdGlvbgotCQkJCXBhY2tldC5uYW1lID0gSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQVRUUklCVVRFOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVDsKLQkJCQlwYWNrZXQuaW5kZW50Q2hpbGQgPSB0cnVlOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfU0NSSVBUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBUYWdJZHMyMC5JRF9ET0JPRFkgOgotCQkJCS8vIGRlY2xhcmF0aW9uCi0JCQkJcGFja2V0Lm5hbWUgPSBKU1AyME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ET0JPRFk7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5pbmRlbnRDaGlsZCA9IHRydWU7Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9TQ1JJUFQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRhZ0lkczIwLklEX0lOVk9LRSA6Ci0JCQkJLy8gZGVjbGFyYXRpb24KLQkJCQlwYWNrZXQubmFtZSA9IEpTUDIwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklOVk9LRTsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX1NDUklQVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgVGFnSWRzMjAuSURfT1VUUFVUIDoKLQkJCQkvLyBkZWNsYXJhdGlvbgotCQkJCXBhY2tldC5uYW1lID0gSlNQMjBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1VUUFVUOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVDsKLQkJCQlwYWNrZXQuaW5kZW50Q2hpbGQgPSB0cnVlOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfU0NSSVBUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBUYWdJZHMyMC5JRF9ST09UIDoKLQkJCQlwYWNrZXQubmFtZSA9IFJPT1Q7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47IC8vIHNhbWUgYXMgSFRNTAotCQkJCWJyZWFrOwotCQkJY2FzZSBUYWdJZHMyMC5JRF9QTFVHSU4gOgotCQkJCS8vIHBsdWdpbgotCQkJCXBhY2tldC5uYW1lID0gUExVR0lOOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5pbmRlbnRDaGlsZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gc3VwZXIuY3JlYXRlRWxlbURlY2woZWlkKTsKLQkJfQotCQlFbGVtRGVjbCBkZWNsID0gbmV3IEVsZW1EZWNsKHBhY2tldCk7Ci0KLQkJQ01Hcm91cEltcGwgY29udGVudCA9IGNyZWF0ZUNvbnRlbnQoZWlkKTsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCWRlY2wuc2V0Q29udGVudChjb250ZW50KTsKLQotCQlUQUNyZWF0ZXIyMCBjcmVhdGVyID0gbmV3IFRBQ3JlYXRlcjIwKCk7Ci0JCWRlY2wuc2V0QXR0cmlidXRlcyhjcmVhdGVyLmdldERlY2xhcmF0aW9ucyhlaWQpKTsKLQotCQlyZXR1cm4gZGVjbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1RhZ0NNRG9jSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9UYWdDTURvY0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIyOThmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1RhZ0NNRG9jSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIENNRG9jdW1lbnQgZm9yIHRoZSBKU1AgMi4wIHRhZyBmaWxlcy4KLSAqLwotY2xhc3MgVGFnQ01Eb2NJbXBsIGV4dGVuZHMgSkNNRG9jSW1wbCB7Ci0JLyoqCi0JICogSENNRG9jSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBUYWdDTURvY0ltcGwoU3RyaW5nIGRvY1R5cGVOYW1lLCBDTU5hbWVzcGFjZUltcGwgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0JCXN1cGVyKGRvY1R5cGVOYW1lLCB0YXJnZXROYW1lc3BhY2UsIG5ldyBUYWcyMEVsZW1lbnRDb2xsZWN0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQXR0cmlidXRlQ29sbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9BdHRyaWJ1dGVDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NjMyMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9BdHRyaWJ1dGVDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0gKi8KLWZpbmFsIGNsYXNzIEF0dHJpYnV0ZUNvbGxlY3Rpb24gZXh0ZW5kcyBDTU5hbWVkTm9kZU1hcEltcGwgaW1wbGVtZW50cyBDSFRNTE5hbWVzcGFjZSB7Ci0JLyoqCi0JICogY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZUNvbGxlY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4KLQkgKiBAcGFyYW0gYXR0ck5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByaXZhdGUgSFRNTEF0dHJEZWNsSW1wbCBjcmVhdGUoU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0KLQkJaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0FDVElPTikpIHsKLQkJCS8vIChhY3Rpb24gJVVSSSAjUkVRVUlSRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BQ1RJT04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0FMVCkpIHsKLQkJCS8vIChhbHQgJVRleHQ7ICNSRVFVSVJFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5URVhUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9CT1JERVIpKSB7Ci0JCQkvLyAoYm9yZGVyICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0JPUkRFUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0hFQ0tFRCkpIHsKLQkJCS8vIChjaGVja2VkIChjaGVja2VkKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9DSEVDS0VEfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0hFQ0tFRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0xFQVIpKSB7Ci0JCQkvLyAoY2xlYXIgKGxlZnQgfCBhbGwgfCByaWdodCB8IG5vbmUpIG5vbmUpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0xFRlQsIEFUVFJfVkFMVUVfQUxMLCBBVFRSX1ZBTFVFX1JJR0hULCBBVFRSX1ZBTFVFX05PTkV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX05PTkUpOwotCi0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NMRUFSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT0xTKSkgewotCQkJLy8gKGNvbHMgTlVNQkVSICNSRVFVSVJFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPTFMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0VOQ1RZUEUpKSB7Ci0JCQkvLyAoZW5jdHlwZSAlQ29udGVudFR5cGU7ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTlRFTlRfVFlQRSk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfV1dXX0ZPUk1fVVJMRU5DT0RFRCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0VOQ1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hFSUdIVCkpIHsKLQkJCS8vIChoZWlnaHQgJUxlbmd0aDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEVOR1RIKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSEVJR0hULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9IUkVGKSkgewotCQkJLy8gKGhyZWYgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9IUkVGLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9IU1BBQ0UpKSB7Ci0JCQkvLyAoaHNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hTUEFDRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSFRUUF9FUVVJVikpIHsKLQkJCS8vIChodHRwLWVxdWl2IE5BTUUgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTkFNRSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hUVFBfRVFVSVYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX01BWExFTkdUSCkpIHsKLQkJCS8vIChtYXhsZW5ndGggTlVNQkVSICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTUFYTEVOR1RILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NRVRIT0QpKSB7Ci0JCQkvLyAobWV0aG9kIChHRVR8UE9TVCkgR0VUKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9HRVQsIEFUVFJfVkFMVUVfUE9TVH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfR0VUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTUVUSE9ELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NVUxUSVBMRSkpIHsKLQkJCS8vIChtdWx0aXBsZSAobXVsdGlwbGUpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX01VTFRJUExFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTVVMVElQTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX05BTUUpKSB7Ci0JCQkvLyAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTkFNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTk9TSEFERSkpIHsKLQkJCS8vIChub3NoYWRlIChub3NoYWRlKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9OT1NIQURFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTk9TSEFERSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUk9XUykpIHsKLQkJCS8vIChyb3dzIE5VTUJFUiAjUkVRVUlSRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ST1dTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TRUxFQ1RFRCkpIHsKLQkJCS8vIChzZWxlY3RlZCAoc2VsZWN0ZWQpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX1NFTEVDVEVEfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0VMRUNURUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NJWkUpKSB7Ci0JCQkvLyAoc2l6ZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TSVpFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TUkMpKSB7Ci0JCQkvLyAoc3JjICVVUkk7ICNJTVBMSUVEKQotCQkJLy8gTk9URTogInNyYyIgYXR0cmlidXRlcyBhcmUgZGVmaW5lZCBpbiBzZXZlcmFsIGVsZW1lbnRzLgotCQkJLy8JCSBUaGUgZGVmaW5pdGlvbiBvZiBJTUcgaXMgZGlmZmVyZW50IGZyb20gb3RoZXJzLgotCQkJLy8JCSBTbywgaXQgc2hvdWxkIGJlIGxvY2FsbHkgZGVmaW5lZC4KLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NSQywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVFlQRSkpIHsKLQkJCS8vICh0eXBlICVDb3RlbnRUeXBlOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT05URU5UX1RZUEUpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WQUxVRSkpIHsKLQkJCS8vICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVkFMVUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZFUlNJT04pKSB7Ci0JCQkvLyAodmVyc2lvbiBDREFUQSAjRklYRUQgJyVIVE1MLlZlcnNpb247KQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9GSVhFRCwgQVRUUl9WQUxVRV9WRVJTSU9OX1RSQU5TSVRJT05BTCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZFUlNJT04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLkZJWEVEKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1dJRFRIKSkgewotCQkJLy8gKHdpZHRoICVMZW5ndGg7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxFTkdUSCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1dJRFRILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WU1BBQ0UpKSB7Ci0JCQkvLyAodnNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZTUEFDRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCQkvLyA8PEQyMDU1MTQKLQkJfQotCQllbHNlIHsKLQkJCS8vIHVua25vd24gYXR0cmlidXRlOyBtYXliZSBlcnJvci4KLQkJCS8vIHNob3VsZCB3YXJuLgotCQkJYXR0ciA9IG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgJWJvZHljb2xvcnM7IGRlY2xhcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRCb2R5Y29sb3JzKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWxpZ24gYXR0cmlidXRlIHdoaWNoIGhhcyAlSUFsaWduOyBhcyB2YWx1ZXMuLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRNTEF0dHJEZWNsSW1wbCBjcmVhdGVBbGlnbkZvckltYWdlKCkgewotCQkvLyBhbGlnbiAobG9jYWwpCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJLy8gc2V0IGVudW0gdmFsdWVzCi0JCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RPUCwgQVRUUl9WQUxVRV9NSURETEUsIEFUVFJfVkFMVUVfQk9UVE9NLCBBVFRSX1ZBTFVFX0xFRlQsIEFUVFJfVkFMVUVfUklHSFR9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb24gZm9yIDxjb2RlPmFsaWduPC9jb2RlPgotCSAqIGluIHNldmVyYWwgZWxlbWVudHMsIGxpa2UgPGNvZGU+UDwvY29kZT4sIDxjb2RlPkRJVjwvY29kZT4uCi0JICogVGhlIHZhbHVlcyBhcmUgZGlmZmVyZW50IGZyb20gYXR0cmlidXRlcyB0aG9zZSBoYXZlIHRoZSBzYW1lIG5hbWUKLQkgKiBpbiBvdGhlciBlbGVtZW50cyAoPGNvZGU+SU1HPC9jb2RlPiBhbmQgPGNvZGU+VEFCTEU8L2NvZGU+KS4KLQkgKiBTbywgaXQgY2FuJ3QgdHJlYXQgYXMgZ2xvYmFsIGF0dHJpYnV0ZXMuCi0JICogPHN0cm9uZz5OT1RFOiBUaGVzZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24gaGFzCi0JICogbm8gb3duZXIgQ01Eb2N1bWVudCBpbnN0YW5jZS48L3N0cm9uZz4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEhUTUxBdHRyRGVjbEltcGwgY3JlYXRlQWxpZ25Gb3JQYXJhZ3JhcGgoKSB7Ci0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJLy8gc2V0IGVudW0gdmFsdWVzOiBsZWZ0fGNlbnRlcnxyaWdodHxqdXN0aWZ5Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0xFRlQsIEFUVFJfVkFMVUVfQ0VOVEVSLCBBVFRSX1ZBTFVFX1JJR0hULH07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogR2V0ICVhdHRyczsgZGVjbGFyYXRpb25zLgotCSAqICVhdHRyczsgY29uc2lzdHMgb2YgJWNvcmVhdHRyczssICVpMThuLCBhbmQgJWV2ZW50czsuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0QXR0cnMoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCX0KLQotCS8qKgotCSAqIEdldCAlY29yZWF0dHJzOyBkZWNsYXJhdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0Q29yZShDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zKSB7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgZ2xvYmFsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4KLQkgKiBAcGFyYW0gYXR0ck5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCUNNTm9kZSBjbW5vZGUgPSBnZXROYW1lZEl0ZW0oYXR0ck5hbWUpOwotCQlpZiAoY21ub2RlICE9IG51bGwpCi0JCQlyZXR1cm4gKEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbikgY21ub2RlOyAvLyBhbHJlYWR5IGV4aXN0cy4KLQotCQlIVE1MQXR0ckRlY2xJbXBsIGRlYyA9IGNyZWF0ZShhdHRyTmFtZSk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCXB1dE5hbWVkSXRlbShhdHRyTmFtZSwgZGVjKTsKLQotCQlyZXR1cm4gZGVjOwotCX0KLQotCS8qKgotCSAqIEdldCBkZWNsYXJhdGlvbnMgd2hpY2ggYXJlIHNwZWNpZmllZCBieSBuYW1lcy4KLQkgKiBAcGFyYW0gbmFtZXMgamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHVibGljIHZvaWQgZ2V0RGVjbGFyYXRpb25zKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMsIEl0ZXJhdG9yIG5hbWVzKSB7Ci0JCXdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBhdHRyTmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHQoKTsKLQkJCUhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBkZWMgPSBnZXREZWNsYXJhdGlvbihhdHRyTmFtZSk7Ci0JCQlpZiAoZGVjICE9IG51bGwpCi0JCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShhdHRyTmFtZSwgZGVjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCAlZXZlbnRzOyBkZWNsYXJhdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0RXZlbnRzKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgJWkxOG47IGRlY2xhcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRJMThuKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NIQ01Eb2NJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NIQ01Eb2NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYjM1MjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DSENNRG9jSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEVudGl0eURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBDTURvY3VtZW50IGltcGxlbWVudGF0aW9uIGZvciB0aGUgSFRNTC4KLSAqLwotcHVibGljIGNsYXNzIENIQ01Eb2NJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIEhUTUxDTURvY3VtZW50IHsKLQotCS8qKiBOYW1lc3BhY2UgZm9yIGFsbCBuYW1lcyBvZiBlbGVtZW50cywgZW50aXRpZXMgYW5kIGF0dHJpYnV0ZXMuICovCi0JcHJpdmF0ZSBDTU5hbWVzcGFjZSBuYW1lc3BhY2UgPSBudWxsOwotCXByaXZhdGUgRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudHMgPSBudWxsOwotCXByaXZhdGUgRW50aXR5Q29sbGVjdGlvbiBlbnRpdGllcyA9IG51bGw7Ci0JcHJpdmF0ZSBBdHRyaWJ1dGVDb2xsZWN0aW9uIGF0dHJpYnV0ZXMgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIENIQ01Eb2NJbXBsKFN0cmluZyBkb2NUeXBlTmFtZSwgQ01OYW1lc3BhY2UgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0JCXN1cGVyKGRvY1R5cGVOYW1lKTsKLQkJbmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotCQlhdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZUNvbGxlY3Rpb24oKTsKLQkJZWxlbWVudHMgPSBuZXcgRWxlbWVudENvbGxlY3Rpb24oYXR0cmlidXRlcyk7Ci0JCWVudGl0aWVzID0gbmV3IEVudGl0eUNvbGxlY3Rpb24oKTsKLQl9Ci0KLQlBdHRyaWJ1dGVDb2xsZWN0aW9uIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCXB1YmxpYyBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGdldEVsZW1lbnREZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChIVE1MRWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50cy5nZXROYW1lZEl0ZW0oZWxlbWVudE5hbWUpOwotCX0KLQotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpIHsKLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpIHsKLQkJcmV0dXJuIGVudGl0aWVzOwotCX0KLQotCXB1YmxpYyBIVE1MRW50aXR5RGVjbGFyYXRpb24gZ2V0RW50aXR5RGVjbGFyYXRpb24oU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJaWYgKGVudGl0aWVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChIVE1MRW50aXR5RGVjbGFyYXRpb24pIGVudGl0aWVzLmdldE5hbWVkSXRlbShlbnRpdHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5ET0NVTUVOVDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NIVE1MTmFtZXNwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NIVE1MTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NjUwM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DSFRNTE5hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLQotLyoqCi0gKiBQcm92aWRlIGFsbCBuYW1lcyBkZWZpbmVkIGluIHRoZSBIVE1MIDQuMD8gc3BlY2lmaWNhdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBDSFRNTE5hbWVzcGFjZSB7Ci0KLQkvLyBFbGVtZW50IG5hbWVzCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRWxlbWVudE5hbWUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERFJFU1MgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQUREUkVTUzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTE9DS1FVT1RFID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJMT0NLUVVPVEU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPRFkgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlIgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENFTlRFUiA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DRU5URVI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEREID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkREOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVIgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVYgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElWOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBETCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ETDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFQgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk0gPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSDEgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEgyID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIMyA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSDQgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEg1ID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBINiA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5INjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBRCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFEOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIUiA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IUjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUcgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU1HOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTlBVVDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEkgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTlUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRVRBOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PTDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUFJFOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1QgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0VMRUNUOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUQVJFQSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URVhUQVJFQTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVElUTEU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVMID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVMOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfQ09ORklHID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9DT05GSUc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9FQ0hPID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9FQ0hPOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfRVhFQyA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRVhFQzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0ZTSVpFID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GU0laRTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0ZMQVNUTU9EID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GTEFTVE1PRDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0lOQ0xVREUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0lOQ0xVREU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9QUklOVEVOViA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfUFJJTlRFTlY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9TRVQgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX1NFVDsKLQl9Ci0KLQkvLyBDaGFyYWN0ZXIgRW50aXRpZXMKLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBFbnRpdHlOYW1lIHsKLQl9Ci0KLQkvLyBnbG9iYWwgYXR0cmlidXRlIG5hbWVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZFUlNJT04gPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZFUlNJT047Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NSQyA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BTFQgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSEVJR0hUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1dJRFRIID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUxJR04gPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9CT1JERVIgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSFNQQUNFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IU1BBQ0U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZTUEFDRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVlNQQUNFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9OQU1FID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DTEVBUiA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0xFQVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX05PU0hBREUgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05PU0hBREU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NIRUNLRUQgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NIRUNLRUQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX01BWExFTkdUSCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUFYTEVOR1RIOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JU1RZTEUgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0lTVFlMRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSFRUUF9FUVVJViA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFRUUF9FUVVJVjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09OVEVOVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09OVEVOVDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9IUkVGID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IUkVGOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NVUxUSVBMRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTVVMVElQTEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NFTEVDVEVEID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TRUxFQ1RFRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUk9XUyA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUk9XUzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09MUyA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09MUzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUNUSU9OID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ1RJT047Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX01FVEhPRCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUVUSE9EOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9FTkNUWVBFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9FTkNUWVBFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TSVpFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9UWVBFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WQUxVRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUU7Ci0KLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0VSUk1TRyA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRVJSTVNHOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TSVpFRk1UID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFRk1UOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9USU1FRk1UID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9USU1FRk1UOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WQVIgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0dJID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DR0k7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NNRCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ01EOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9GSUxFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GSUxFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WSVJUVUFMID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WSVJUVUFMOwotCi0JLy8gZ2xvYmFsIGF0dHJpYnV0ZSB2YWx1ZXM7IG1haW5seSB1c2VkIGluIGVudW1lcmF0aW9uLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVkVSU0lPTl9UUkFOU0lUSU9OQUwgPSAiLS8vVzNDLy9EVEQgQ29tcGFjdCBIVE1MIDEuMCBEcmFmdC8vRU4iOyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgYWxpZ24gKHRvcHxtaWRkbGV8Ym90dG9tfGxlZnR8cmlnaHQpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9UT1AgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9UT1A7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9NSURETEUgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9NSURETEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CT1RUT00gPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9CT1RUT007Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9MRUZUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfTEVGVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NFTlRFUiA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0NFTlRFUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JJR0hUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUklHSFQ7Ci0JLy8gICBmb3IgY2xlYXIgKGxlZnR8YWxsfHJpZ2h0fG5vbmUpOiBsZWZ0IGFuZCByaWdodCBhcmUgYWxyZWFkeSBkZWZpbmVkIGFib3ZlLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQUxMID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfQUxMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTk9ORSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX05PTkU7Ci0JLy8gICBmb3IgdHlwZSBvZiBJTlBVVAotCS8vICAgICAgICh0ZXh0IHwgcGFzc3dvcmQgfCBjaGVja2JveCB8IHJhZGlvIHwgc3VibWl0IHwgcmVzZXQgfAotCS8vICAgICAgICBmaWxlIHwgaGlkZGVuIHwgaW1hZ2UgfCBidXR0b24pCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9URVhUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfVEVYVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1BBU1NXT1JEID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUEFTU1dPUkQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DSEVDS0JPWCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0NIRUNLQk9YOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUkFESU8gPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9SQURJTzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1NVQk1JVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NVQk1JVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JFU0VUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUkVTRVQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9ISURERU4gPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9ISURERU47Ci0JLy8gICBmb3Igc3BhbiwgY29sc3Bhbiwgcm93c3BhbgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfMSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFXzE7Ci0JLy8gICBmb3IgZnJhbWVib3JkZXIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFXzAgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV8wOwotCS8vICAgZm9yIG1ldGhvZCBvZiBGT1JNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9HRVQgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9HRVQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9QT1NUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUE9TVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1dXV19GT1JNX1VSTEVOQ09ERUQgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9XV1dfRk9STV9VUkxFTkNPREVEOwotCS8vICAgZm9yIGJlaGF2aXJvIG9mIE1BUlFVRUUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1NDUk9MTCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NDUk9MTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1NMSURFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfU0xJREU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9BTFRFUk5BVEUgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9BTFRFUk5BVEU7Ci0JLy8gICBmb3IgZGlyZWN0aW9uIG9mIE1BUlFVRUUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1VQID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfVVA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9ET1dOID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfRE9XTjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01Db250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DTUNvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MzNjZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DTUNvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIENNQ29udGVudCBmb3IgSFRNTCBDTS4KLSAqLwotYWJzdHJhY3QgY2xhc3MgQ01Db250ZW50SW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkJPVU5ERUQgPSAtMTsKLQkvKiogIC0xOiBpdCdzIFVOQk9VTkRFRC4gKi8KLQlwcml2YXRlIGludCBtYXhPY2N1ciA9IFVOQk9VTkRFRDsKLQkvKiogIDA6IGl0J3MgT1BUSU9OQUwsIDEsIGl0J3MgUkVRVUlSRUQuICovCi0JcHJpdmF0ZSBpbnQgbWluT2NjdXIgPSAwOwotCi0JLyoqCi0JICogVGhlIHByaW1hcnkgY29uc3R1cmN0b3IuCi0JICogVXNlIHRoaXMgb25lIGZvciB1c3VhbCBjYXNlcy48YnI+Ci0JICovCi0JcHVibGljIENNQ29udGVudEltcGwoU3RyaW5nIG5hbWUsIGludCBtaW4sIGludCBtYXgpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCW1pbk9jY3VyID0gbWluOwotCQltYXhPY2N1ciA9IG1heDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRNYXhPY2N1ciBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogSWYgLTEsIGl0J3MgVU5CT1VOREVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKSB7Ci0JCXJldHVybiBtYXhPY2N1cjsKLQl9Ci0KLQkvKioKLQkgKiBnZXRNaW5PY2N1ciBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogSWYgMCwgaXQncyBPUFRJT05BTC4KLQkgKiBJZiAxLCBpdCdzIFJFUVVJUkVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKSB7Ci0JCXJldHVybiBtaW5PY2N1cjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNR3JvdXBJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNR3JvdXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNTQ2ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DTUdyb3VwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci0KLS8qKgotICovCi1jbGFzcyBDTUdyb3VwSW1wbCBleHRlbmRzIENNQ29udGVudEltcGwgaW1wbGVtZW50cyBDTUdyb3VwIHsKLQotCXByaXZhdGUgaW50IG9wZXJhdG9yID0gQ01Hcm91cC5TRVFVRU5DRTsKLQlwcml2YXRlIENNTm9kZUxpc3RJbXBsIGNoaWxkcmVuID0gbnVsbDsKLQotCS8qKgotCSAqIENNR3JvdXBJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNR3JvdXBJbXBsKGludCBvcCwgaW50IG1pbk9jY3VyLCBpbnQgbWF4T2NjdXIpIHsKLQkJc3VwZXIobnVsbCwgbWluT2NjdXIsIG1heE9jY3VyKTsKLQkJc3dpdGNoIChvcCkgewotCQkJY2FzZSBDTUdyb3VwLkFMTCA6Ci0JCQljYXNlIENNR3JvdXAuQ0hPSUNFIDoKLQkJCWNhc2UgQ01Hcm91cC5TRVFVRU5DRSA6Ci0JCQkJb3BlcmF0b3IgPSBvcDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCS8vIHNob3VsZCB3YXJuLgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXByb3RlY3RlZCBDTU5vZGUgYXBwZW5kQ2hpbGQoQ01Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKQotCQkJY2hpbGRyZW4gPSBuZXcgQ01Ob2RlTGlzdEltcGwoKTsKLQkJcmV0dXJuIGNoaWxkcmVuLmFwcGVuZE5vZGUoY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0Ci0JICovCi0JcHVibGljIENNTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogRUxFTUVOVF9ERUNMQVJBVElPTiwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBHUk9VUCwgRU5USVRZX0RFQ0xBUkFUSU9OLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuR1JPVVA7Ci0JfQotCi0JLyoqCi0JICogZ2V0T3BlcmF0aW9uIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogQUxPTkUgKGEpLCBTRVFVRU5DRSAoYSxiKSwgQ0hPSUNFIChhfGIpLCBBTEwgKGEmYikuCi0JICovCi0JcHVibGljIGludCBnZXRPcGVyYXRvcigpIHsKLQkJcmV0dXJuIG9wZXJhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNTmFtZWROb2RlTWFwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWJhZTFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIENNTmFtZWROb2RlTWFwIGludGVyZmFjZS4gVGhpcyBjbGFzcyBpcyBpbnRlbnRlZAotICogdG8gYmUgdXNlZCBhcyBhIGNvbnRhaW5lciBvZiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLiBJZiBzb21lb25lIHdhbnRzIHRvCi0gKiB1c2UgdGhpcyBjbGFzcyBmb3Igb3RoZXIgcHVycG9zZSwgaGUgbXVzdCBwYXkgYXR0ZW50aW9uIHRvIHRoZSBmYWN0IHRoYXQKLSAqIHRoaXMgY2xhc3MgaXMgdG9sZXJhbnQgb2YgdGhlIGtleSBuYW1lIGNhc2UuIFRoYXQgaXMsIHRoaXMgY2xhc3MgZG9lcyBub3QKLSAqIGRpc3Rpbmd1aXNoICJuYW1lIiwgIk5BTUUiLCBhbmQgIk5hbWUiIGFzIGEga2V5IG5hbWUuCi0gKi8KLWNsYXNzIENNTmFtZWROb2RlTWFwSW1wbCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXAgewotCi0JcHJpdmF0ZSBqYXZhLnV0aWwuSGFzaHRhYmxlIGl0ZW1zID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWl0ZW1zID0gbmV3IGphdmEudXRpbC5IYXNodGFibGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMZW5ndGggbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGl0ZW1zLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lZEl0ZW0gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBDTU5vZGUgPGNvZGU+bnVsbDwvY29kZT4gZm9yIHVua25vd24ga2V5cy4KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBjb29rZWROYW1lID0gbWFrZUNhbm9uaWNhbEZvcm0obmFtZSk7Ci0JCWlmICghaXRlbXMuY29udGFpbnNLZXkoY29va2VkTmFtZSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChDTU5vZGUpIGl0ZW1zLmdldChjb29rZWROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBpdGVtIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUNNTm9kZSBub2RlID0gKENNTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoLS1pbmRleCA8IDApCi0JCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBpdGVtcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSByYXdGb3JtCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbWFrZUNhbm9uaWNhbEZvcm0oU3RyaW5nIHJhdykgewotCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDE1MgotCQkvLyB3ZSBhcmUgYWJsZSB0byAiY2hlYXQiIGhlcmUgYSBsaXR0bGUgYW5kIHVzZSBVUyBMb2NhbGUKLQkJLy8gdG8gZ2V0IGEgZ29vZCBjb25vbmljYWwgZm9ybSwgc2luY2Ugd2UgYXJlIHVzaW5nIHRoaXMgb25seQotCQkvLyBmb3IgSFRNTCBhbmQgSlNQIHN0YW5kYXJkIHRhZ3MuCi0JCS8vIExvbmcgdGVybSwgZm9yIHNpbWlsYXIgbmVlZHMgd2l0aCBYTUwgMS4xIChmb3IgZXhhbXBsZSkKLQkJLy8gd2Ugc2hvdWxkIHVzZSBhIGNsYXNzIHN1Y2ggYXMgY29tLmlibS5pY3UudGV4dC5Ob3JtYWxpemVyCi0JCXJldHVybiByYXcudG9VcHBlckNhc2UoTG9jYWxlLlVTKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGl0ZW0KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQl2b2lkIHB1dE5hbWVkSXRlbShTdHJpbmcgbmFtZSwgQ01Ob2RlIGl0ZW0pIHsKLQkJU3RyaW5nIGNvb2tlZE5hbWUgPSBtYWtlQ2Fub25pY2FsRm9ybShuYW1lKTsKLQkJaWYgKGl0ZW1zLmNvbnRhaW5zS2V5KGNvb2tlZE5hbWUpKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JCWl0ZW1zLnB1dChjb29rZWROYW1lLCBpdGVtKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNTm9kZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01Ob2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmY3YTAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01Ob2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotCi0KLQotLyoqCi0gKi8KLWFic3RyYWN0IGNsYXNzIENNTm9kZUltcGwgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZSB7Ci0KLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgbmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTU5vZGVJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNTm9kZUltcGwoU3RyaW5nIG5tKSB7Ci0JCXN1cGVyKCk7Ci0JCW5hbWUgPSBubTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcm9wZXJ0eSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5PYmplY3QKLQkgKgotCSAqIFJldHVybnMgdGhlIG9iamVjdCBwcm9wZXJ0eSBkZXNjaXBlZCBieSB0aGUgcHJvcGVydHlOYW1lCi0JICoKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19YSFRNTCkpCi0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBzdXBwb3J0cyBtZXRob2QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNTm9kZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNTm9kZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYjFjZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DTU5vZGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEFuYWxvZyBvZiBkb20uTm9kZUxpc3QgZm9yIENNLgotICovCi1jbGFzcyBDTU5vZGVMaXN0SW1wbCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdCB7Ci0KLQlwcml2YXRlIGphdmEudXRpbC5WZWN0b3Igbm9kZXMgPSBudWxsOwotCi0JLyoqCi0JICogQ01Ob2RlTGlzdEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Ob2RlTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCW5vZGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICogQHBhcmFtIG5vZGUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Ob2RlIGFwcGVuZE5vZGUoQ01Ob2RlIG5vZGUpIHsKLQkJbm9kZXMuYWRkRWxlbWVudChub2RlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGVuZ3RoIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBub2Rlcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogaXRlbSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZQotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbm9kZXMuc2l6ZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01Ob2RlKSBub2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ29tcGxleFR5cGVEZWZpbml0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NvbXBsZXhUeXBlRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDQ3YzdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ29tcGxleFR5cGVEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byByZXByZXNlbnQgYSBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbgotICogaW4gWE1MIFNjaGVtYS48YnI+Ci0gKi8KLWFic3RyYWN0IGNsYXNzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgQ01Hcm91cEltcGwgY29udGVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBudWxsOwotCi0JLyoqCi0JICogQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvbXBsZXhUeXBlRGVmaW5pdGlvbihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcigpOwotCQljb2xsZWN0aW9uID0gZWxlbWVudENvbGxlY3Rpb247Ci0JCWNyZWF0ZUNvbnRlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gYWN0dWFsIGNvbnRlbnQgbW9kZWwuCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIGFuZCBvbmx5IG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yLjxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjcmVhdGVDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cAotCSAqLwotCXB1YmxpYyBDTUdyb3VwIGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCS8qIE5PVEU6IERvIHdlIG5lZWQgTE9HSUNBTCB0eXBlPwotCSAqIC0tIDMvNy8yMDAxCi0JICovCi0JcHVibGljIGFic3RyYWN0IGludCBnZXRDb250ZW50VHlwZSgpOwotCi0JLyoqCi0JICogR2V0IGNvbnRlbnQgaGludC4KLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBnZXRQcmltYXJ5Q2FuZGlkYXRlKCkgewotCQlpZiAocHJpbWFyeUNhbmRpZGF0ZU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKHByaW1hcnlDYW5kaWRhdGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VHlwZU5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNjgyZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotLyoqCi0gKiBGYWN0b3J5IG9mIENvbXBsZXhUeXBlRGVmaW5pdGlvbi4KLSAqLwotZmluYWwgY2xhc3MgQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQlwcml2YXRlIGphdmEudXRpbC5IYXNodGFibGUgZGVmaW5pdGlvbnMgPSBudWxsOwotCS8vIGNvbnN0YW50cyBmb3IgY29tcGxleCB0eXBlIG5hbWUKLQkvKiogZm9yIEFERFJFU1MuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfQUREUkVTUyA9ICJDVFlQRV9BRERSRVNTIjsvLyROT04tTkxTLTEkCi0JLyoqIENEQVRBIGNvbnRlbnQuIE5vIENvbXBsZXhUeXBlRGVmaW5pdGlvbiBpbnN0YW5jZSBzaHVsZCBiZSBjcmVhdGVkLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0NEQVRBID0gIkNUWVBFX0NEQVRBIjsvLyROT04tTkxTLTEkCi0JLyoqIGNvbCBncm91cCBjb250ZW50LiBDT0wqICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfQ09MVU1OX0dST1VQID0gIkNUWVBFX0NPTFVNTl9HUk9VUCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgREwuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfREVGSU5JVElPTl9MSVNUID0gIkNUWVBFX0RFRklOSVRJT05fTElTVCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgRU1CRUQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfRU1CRUQgPSAiQ1RZUEVfRU1CRUQiOy8vJE5PTi1OTFMtMSQKLQkvKiogZW1wdHkgY29udGVudC4gTm8gQ29tcGxleFR5cGVEZWZpbml0aW9uIGluc3RhbmNlIHNob3VsZCBiZSBjcmVhdGVkLiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0VNUFRZID0gIkNUWVBFX0VNUFRZIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBGSUVMRFNFVC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9GSUVMRFNFVCA9ICJDVFlQRV9GSUVMRFNFVCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgRlJBTUVTRVQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfRlJBTUVTRVQgPSAiQ1RZUEVfRlJBTUVTRVQiOy8vJE5PTi1OTFMtMSQKLQkvKiogZmxvdyBjb250ZW50LiAoJWZsb3c7KSogKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9GTE9XX0NPTlRBSU5FUiA9ICJDVFlQRV9GTE9XX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiBodG1sIGNvbnRlbnQuIEhFQUQsIChGUkFNRVNFVHxCT0RZKSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0hUTUwgPSAiQ1RZUEVfSFRNTCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBoZWFkIGNvbnRlbnQuIFRJVExFICYgSVNJTkRFWD8gJiBCQVNFPyAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0hFQUQgPSAiQ1RZUEVfSEVBRCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBpbmxpbmUgY29udGVudC4gKCVpbmxpbmU7KSogKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9JTkxJTkVfQ09OVEFJTkVSID0gIkNUWVBFX0lOTElORV9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogbGlzdCBpdGVtIGNvbnRhaW5lci4gKExJKSsgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9MSV9DT05UQUlORVIgPSAiQ1RZUEVfTElfQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBNQVAuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfTUFQID0gIkNUWVBFX01BUCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBub2ZyYW1lcyBjb250ZW50LiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX05PRlJBTUVTX0NPTlRFTlQgPSAiQ1RZUEVfTk9GUkFNRVNfQ09OVEVOVCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgT1BUR1JPVVAuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfT1BUSU9OX0NPTlRBSU5FUiA9ICJDVFlQRV9PUFRJT05fQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIHBhcmFtIGNvbnRhaW5lci4gRm9yIE9CSkVDVC9BUFBMRVQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfUEFSQU1fQ09OVEFJTkVSID0gIkNUWVBFX1BBUkFNX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiBQQ0RBVEEgY29udGVudC4gTm8gQ29tcGxleFR5cGVEZWZpbml0aW9uIGluc3RhbmNlIHNodWxkIGJlIGNyZWF0ZWQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfUENEQVRBID0gIkNUWVBFX1BDREFUQSI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmb3IgU0VMRUNULiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1NFTEVDVCA9ICJDVFlQRV9TRUxFQ1QiOy8vJE5PTi1OTFMtMSQKLQkvKiogdGFibGUgY29udGVudC4gQ0FQVElPTj8sIChDT0wqfENPTEdST1VQKiksIFRIRUFEPywgVEZPT1Q/LCBUQk9EWSsgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9UQUJMRSA9ICJDVFlQRV9UQUJMRSI7Ly8kTk9OLU5MUy0xJAotCS8qKiB0YWJsZSBjZWxsIGNvbnRhaWVyLiAoVEh8VEQpKyAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1RDRUxMX0NPTlRBSU5FUiA9ICJDVFlQRV9UQ0VMTF9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogdGFibGUgcmVjb3JkIGNvbnRhaW5lci4gKFRSKSsgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9UUl9DT05UQUlORVIgPSAiQ1RZUEVfVFJfQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCQlkZWZpbml0aW9ucyA9IG5ldyBqYXZhLnV0aWwuSGFzaHRhYmxlKCk7Ci0JfQotCi0JLyoqCi0JICogRmFjdG9yeSBtZXRob2QgZm9yIENvbXBsZXhUeXBlRGVmaW5pdGlvbi4KLQkgKiBFYWNoIGluc3RhbmNlIGNyZWF0ZWQgaW4gdGhpcyBtZXRob2QgbXVzdCBiZSByZWdpc3RlcmVkIGludG8KLQkgKiB0aGUgbWFwIHdpdGggaXRzIG5hbWUuCi0JICogQHBhcmFtIGRlZmluaXRpb25OYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ29tcGxleFR5cGVEZWZpbml0aW9uIGNyZWF0ZVR5cGVEZWZpbml0aW9uKFN0cmluZyBkZWZpbml0aW9uTmFtZSwgRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJaWYgKGRlZmluaXRpb25zLmNvbnRhaW5zS2V5KGRlZmluaXRpb25OYW1lKSkgewotCQkJcmV0dXJuIChDb21wbGV4VHlwZURlZmluaXRpb24pIGRlZmluaXRpb25zLmdldChkZWZpbml0aW9uTmFtZSk7Ci0JCX0KLQotCQlDb21wbGV4VHlwZURlZmluaXRpb24gZGVmID0gbnVsbDsKLQkJaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0FERFJFU1MpIHsKLQkJCWRlZiA9IG5ldyBDdGRBZGRyZXNzKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0RFRklOSVRJT05fTElTVCkgewotCQkJZGVmID0gbmV3IEN0ZERsKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0ZMT1dfQ09OVEFJTkVSKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkRmxvd0NvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9IRUFEKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkSGVhZChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9IVE1MKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkSHRtbChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9JTkxJTkVfQ09OVEFJTkVSKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkSW5saW5lQ29udGFpbmVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0xJX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZExpQ29udGFpbmVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfT1BUSU9OX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZE9wdGlvbkNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9TRUxFQ1QpIHsKLQkJCWRlZiA9IG5ldyBDdGRTZWxlY3QoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSB7Ci0JCQlkZWYgPSBudWxsOwotCQl9Ci0JCWlmIChkZWYgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBmYWlsIHRvIGNyZWF0ZS4KLQkJZGVmaW5pdGlvbnMucHV0KGRlZmluaXRpb25OYW1lLCBkZWYpOwotCQlyZXR1cm4gZGVmOwotCX0KLQotCS8qKgotCSAqIEZvciBzaW5nbGV0b24uPGJyPgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSAhPSBudWxsKQotCQkJcmV0dXJuIGluc3RhbmNlOwotCQlpbnN0YW5jZSA9IG5ldyBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZEFkZHJlc3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkQWRkcmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWQxM2MwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkQWRkcmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBBRERSRVNTLgotICovCi1maW5hbCBjbGFzcyBDdGRBZGRyZXNzIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRBZGRyZXNzKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAoKCVpbmxpbmUpIHwgUCkqLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoIHwgKSoKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyAoJWlubGluZSkKLQkJQ01Hcm91cEltcGwgaW5saW5lcyA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCWlmIChpbmxpbmVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbGxlY3Rpb24uZ2V0SW5saW5lKGlubGluZXMpOwotCQljb250ZW50LmFwcGVuZENoaWxkKGlubGluZXMpOwotCQkvLyBQCi0JCUNNTm9kZSBwID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuUCk7Ci0JCWlmIChwICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKHApOwotCX0KLQotCS8qKgotCSAqICgoJWlubGluZSkgfCBQKSouCi0JICogQmVjYXVzZSAlaW5saW5lOyBjb250YWlucyAjUENEQVRBLCB0aGUgdHlwZSBpcyBNSVhFRC4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfQUREUkVTUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZERsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZERsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYWJmOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGREbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBETC4KLSAqLwotZmluYWwgY2xhc3MgQ3RkRGwgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZERsKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5EVDsKLQl9Ci0KLQkvKioKLQkgKiAoRFQgfCBERCkrCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggfCApKwotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vIERUCi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5EVCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJLy8gREQKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuREQpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGRlYyk7Ci0JfQotCi0JLyoqCi0JICogKERUIHwgREQpKy4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9ERUZJTklUSU9OX0xJU1Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRGbG93Q29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZEZsb3dDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5OGQ3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZEZsb3dDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBmb3IgY29udGFpbmVycyBvZiA8Y29kZT4lZmxvdzs8L2NvZGU+LgotICovCi1maW5hbCBjbGFzcyBDdGRGbG93Q29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDdGRGbG93Q29udGFpbmVyKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAoJWZsb3c7KSoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQljb2xsZWN0aW9uLmdldEZsb3coY29udGVudCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0ZMT1dfQ09OVEFJTkVSOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkSGVhZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRIZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZjc4YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRIZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBmb3IgdGhlIGhlYWQgY29udGVudC4KLSAqIENvbnRlbnQgTW9kZWw6IChUSVRMRSAmIElTSU5ERVg/ICYgQkFTRT8pCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZEhlYWQgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICovCi0JcHVibGljIEN0ZEhlYWQoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRJVExFOwotCX0KLQotCS8qKgotCSAqIGZvciBIRUFELgotCSAqIFRvIGF2b2lkIHVzaW5nIGluY2x1c2lvbiwgdGhlIGNvbnRlbnQgbW9kZWwgY29tZXMgZnJvbSB0aGUgWEhUTUwgMS4wLgotCSAqCi0JICogKCVoZWFkLm1pc2M7LCAoKHRpdGxlLCAlaGVhZC5taXNjOywgKGJhc2UsICVoZWFkLm1pc2M7KT8pIHwgKGJhc2UsICVoZWFkLm1pc2M7LCAodGl0bGUsICVoZWFkLm1pc2M7KSkpKQotCSAqIEFuZCAlaGVhZC5taXNjOyBpczoKLQkgKiAoc2NyaXB0fHN0eWxlfG1ldGF8bGlua3xvYmplY3R8aXNpbmRleCkqCi0JICoKLQkgKiAwOiAoJWhlYWQubWlzYywgQSkKLQkgKiBBOiAoQiB8IEMpCi0JICogQjogKHRpdGxlLCAlaGVhZC5taXNjOywgRCkKLQkgKiBDOiAoYmFzZSwgJWhlYWQubWlzYzssIEUpCi0JICogRDogKGJhc2UsICVoZWFkLm1pc2M7KT8KLQkgKiBFOiAodGl0bGUsICVoZWFkLm1pc2M7KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBBdCAxc3QsIGNyZWF0ZSAlaGVhZC5taXNjOyBjb250ZW50LgotCQkvLyAlaGVhZC5taXNjOwotCQkvLyAgICggfCApKgotCQlDTUdyb3VwSW1wbCBtaXNjID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWlmIChtaXNjID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FVEEsfTsKLQkJY29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobWlzYywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCS8vIDJuZCwgZ2V0IGEgdGl0bGUKLQkJQ01Ob2RlIHRpdGxlID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuVElUTEUpOwotCQkvLyAzcmQsIGdldCBhIGJhc2UKLQkJQ01Ob2RlIGJhc2UgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFKTsKLQkJaWYgKHRpdGxlID09IG51bGwgfHwgYmFzZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIFRvcCBsZXZlbCBjb250ZW50IGlzIGEgc2VxdWVuY2Ugb2YgJWhlYWQubWlzYzsgYW5kIEEuCi0JCS8vIDA6ICglaGVhZC5taXNjOywgQSkKLQkJLy8gICBjcmVhdGUgYSBzZXF1ZW5jZQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyAgIGFwcGVuZCAlaGVhZC5taXNjOwotCQljb250ZW50LmFwcGVuZENoaWxkKG1pc2MpOwotCQkvLyAgIGNyZWF0ZSBBIGFuZCBhcHBlbmQgaXQgdG8gdGhlIHRvcCBsZXZlbC4KLQkJewotCQkJLy8gQSBpcyBhIGNob2ljZSBvZiBCIGFuZCBDLgotCQkJLy8gQTogKEIgfCBDKQotCQkJLy8gICBjcmVhdGUgYSBjaG9pY2UKLQkJCUNNR3JvdXBJbXBsIGdBID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJCWlmIChnQSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCS8vICAgYXBwZW5kIEEgdG8gdGhlIHRvcCBsZXZlbC4KLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZ0EpOwotCi0JCQkvLyBjcmVhdGUgQiBhbmQgYXBwZW5kIGl0IHRvIEEKLQkJCXsKLQkJCQkvLyBCIGlzIGEgc2VxdWVuY2Ugb2YgdGl0bGUsICVoZWFkLm1pc2M7LCBhbmQgRC4KLQkJCQkvLyBCOiAodGl0bGUsICVoZWFkLm1pc2M7LCBEKQotCQkJCS8vICAgY3JlYXRlIGEgc2VxdWVuY2UKLQkJCQlDTUdyb3VwSW1wbCBnQiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJCQlpZiAoZ0IgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCS8vICAgYXBwZW5kIEIgdG8gQS4KLQkJCQlnQS5hcHBlbmRDaGlsZChnQik7Ci0KLQkJCQkvLyAgIGFwcGVuZCB0aXRsZSB0byBCCi0JCQkJZ0IuYXBwZW5kQ2hpbGQodGl0bGUpOwotCQkJCS8vICAgYXBwZW5kICVoZWFkLm1pc2M7IHRvIEIKLQkJCQlnQi5hcHBlbmRDaGlsZChtaXNjKTsKLQkJCQkvLyAgIGNyZWF0ZSBEIGFuZCBhcHBlbmQgaXQgdG8gQi4KLQkJCQl7Ci0JCQkJCS8vIEQgaXMgYSBzZXF1ZW5jZSBvZiBiYXNlLCAlaGVhZC5taXNjOy4KLQkJCQkJLy8gRDogKGJhc2UsICVoZWFkLm1pc2M7KT8KLQkJCQkJLy8gICBjcmVhdGUgYSBzZXF1ZW5jZQotCQkJCQlDTUdyb3VwSW1wbCBnRCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAwLCAxKTsKLQkJCQkJaWYgKGdEID09IG51bGwpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCS8vICAgYXBwZW5kIEQgdG8gQi4KLQkJCQkJZ0IuYXBwZW5kQ2hpbGQoZ0QpOwotCi0JCQkJCS8vICAgYXBwZW5kIGJhc2UgdG8gRAotCQkJCQlnRC5hcHBlbmRDaGlsZChiYXNlKTsKLQkJCQkJLy8gICBhcHBlbmQgJWhlYWQubWlzYzsgdG8gRC4KLQkJCQkJZ0QuYXBwZW5kQ2hpbGQobWlzYyk7Ci0JCQkJfQotCQkJfQotCQkJLy8gY3JlYXRlIEMgYW5kIGFwcGVuZCBpdCB0byBBCi0JCQl7Ci0JCQkJLy8gQyBpcyBhIHNlcXVlbmNlIG9mIGJhc2UsICVoZWFkLm1pc2M7LCBhbmQgRQotCQkJCS8vIEM6IChiYXNlLCAlaGVhZC5taXNjOywgRSkKLQkJCQkvLyAgIGNyZWF0ZSBhIHNlcXVlbmNlCi0JCQkJQ01Hcm91cEltcGwgZ0MgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCQkJaWYgKGdDID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQkvLyAgIGFwcGVuZCBDIHRvIEEuCi0JCQkJZ0EuYXBwZW5kQ2hpbGQoZ0MpOwotCi0JCQkJLy8gICBhcHBlbmQgYmFzZSB0byBDCi0JCQkJZ0MuYXBwZW5kQ2hpbGQoYmFzZSk7Ci0JCQkJLy8gICBhcHBlbmQgJWhlYWQubWlzYzsgdG8gQwotCQkJCWdDLmFwcGVuZENoaWxkKG1pc2MpOwotCi0JCQkJLy8gICBjcmVhdGUgRSBhbmQgYXBwZW5kIGl0IHRvIEMuCi0JCQkJewotCQkJCQkvLyBFIGlzIGEgc2VxdWVuY2Ugb2YgdGl0bGUgYW5kICVoZWFkLm1pc2M7LgotCQkJCQkvLyBFOiAodGl0bGUsICVoZWFkLm1pc2M7KQotCQkJCQkvLyAgIGNyZWF0ZSBhIHNlcXVlbmNlCi0JCQkJCUNNR3JvdXBJbXBsIGdFID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQkJCQlpZiAoZ0UgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQkJCQkJLy8gICBhcHBlbmQgRSB0byBDLgotCQkJCQlnQy5hcHBlbmRDaGlsZChnRSk7Ci0KLQkJCQkJLy8gICBhcHBlbmQgdGl0bGUgdG8gRQotCQkJCQlnRS5hcHBlbmRDaGlsZCh0aXRsZSk7Ci0JCQkJCS8vICAgYXBwZW5kICVoZWFkLm1pc2M7IHRvIEUuCi0JCQkJCWdFLmFwcGVuZENoaWxkKG1pc2MpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEVsZW1lbnQgY29udGVudC48YnI+Ci0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogTmFtZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiBFYWNoIHNpbmdsZXRvbiBtdXN0IGtub3cgaXRzIG93biBuYW1lLgotCSAqIEFsbCBuYW1lcyBzaG91bGQgYmUgZGVmaW5lZCBpbgotCSAqIHtAbGluayA8Y29kZT5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5PC9jb2RlPn0gYXMgY29uc3RhbnRzLjxicj4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9IRUFEOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkSHRtbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRIdG1sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNGZlNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRIdG1sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIENvbXBsZXggdHlwZSBkZWZpbml0aW9uIGZvciA8Y29kZT5IVE1MPC9jb2RlPi48YnI+Ci0gKiBDb250ZW50IE1vZGVsOgotICogSEVBRCwgKEZSQU1FU0VUfEJPRFkpPGJyPgotICovCi1maW5hbCBjbGFzcyBDdGRIdG1sIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDdGRIdG1sKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFEOwotCX0KLQotCS8qKgotCSAqICglaHRtbC5jb250ZW50OykuCi0JICogJWh0bWwuY29udGVudDsgaXMgSEVBRCwgKEZSQU1FU0VUIHwgQk9EWSkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggKQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIEhFQUQKLQkJQ01Ob2RlIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFEKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkJLy8gKCB8ICkKLQkJQ01Hcm91cEltcGwgZ3JvdXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQljb250ZW50LmFwcGVuZENoaWxkKGdyb3VwKTsKLQotCQkvLyBGUkFNRVNFVCwgQk9EWQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZfTsKLQkJY29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEVsZW1lbnQgY29udGVudC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9IVE1MOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkSW5saW5lQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZElubGluZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDIzNGFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkSW5saW5lQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci0KLS8qKgotICogQ29tcGxleCB0eXBlIGRlZmluaXRpb24gZm9yICglaW5saW5lOykqLgotICovCi1maW5hbCBjbGFzcyBDdGRJbmxpbmVDb250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZElubGluZUNvbnRhaW5lcihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogKCVpbmxpbmUpKi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQljb2xsZWN0aW9uLmdldElubGluZShjb250ZW50KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZExpQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZExpQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyODk1NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRMaUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIExpc3QgaXRlbSBjb250YWluZXIuCi0gKiAoTEkpKwotICovCi1maW5hbCBjbGFzcyBDdGRMaUNvbnRhaW5lciBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVuQ29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRMaUNvbnRhaW5lcihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEk7Ci0JfQotCi0JLyoqCi0JICogKExJKSsuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIChMSSkrCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQlDTU5vZGUgbGkgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSSk7Ci0JCWlmIChsaSAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChsaSk7Ci0JfQotCi0JLyoqCi0JICogRUxFTUVOVCBjb250ZW50Ljxicj4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0xJX0NPTlRBSU5FUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZE9wdGlvbkNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRPcHRpb25Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJlYzZjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZE9wdGlvbkNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIE9QVElPTiBjb250YWluZXIuCi0gKiAoT1BUSU9OKSsKLSAqLwotZmluYWwgY2xhc3MgQ3RkT3B0aW9uQ29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRPcHRpb25Db250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTjsKLQl9Ci0KLQkvKioKLQkgKiAoT1BUSU9OKSsuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vIE9QVElPTgotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqIChPUFRJT04pKwotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfT1BUSU9OX0NPTlRBSU5FUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZFNlbGVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRTZWxlY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YwYzk2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZFNlbGVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBTRUxFQ1QuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZFNlbGVjdCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkU2VsZWN0KEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT047Ci0JfQotCi0JLyoqCi0JICogKE9QVEdST1VQIHwgT1BUSU9OKSsuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggfCApKwotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vIE9QVElPTgotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqIChPUFRHUk9VUCB8IE9QVElPTikrLgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1NFTEVDVDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0RlY2xDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0RlY2xDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmOTBiNzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9EZWNsQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICovCi1hYnN0cmFjdCBjbGFzcyBEZWNsQ29sbGVjdGlvbiBpbXBsZW1lbnRzIENNTmFtZWROb2RlTWFwIHsKLQotCi0JcHJvdGVjdGVkIGNsYXNzIER1YWxNYXAgewotCQlwdWJsaWMgRHVhbE1hcCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgRHVhbE1hcChPYmplY3RbXSBvYmplY3RzKSB7Ci0JCQlzdXBlcigpOwotCQkJaW5pdGlhbGl6ZShvYmplY3RzKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJCXJldHVybiB0YWJsZS5sZW5ndGg7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKGludCBrZXkpIHsKLQkJCWlmICghaXNWYWxpZEluZGV4KGtleSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gdGFibGVba2V5XTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0S2V5KE9iamVjdCB2YWx1ZSkgewotCQkJSW50ZWdlciBrZXlPYmogPSAoSW50ZWdlcikgbWFwLmdldCh2YWx1ZSk7Ci0JCQlpZiAoa2V5T2JqID09IG51bGwpCi0JCQkJcmV0dXJuIElEX1VOS05PV047Ci0JCQlyZXR1cm4ga2V5T2JqLmludFZhbHVlKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJCWlmIChvYmplY3RzID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJdGFibGUgPSBvYmplY3RzOwotCQkJbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoaW50IGtleSA9IDA7IGtleSA8IG9iamVjdHMubGVuZ3RoOyBrZXkrKykgewotCQkJCU9iamVjdCB2YWx1ZSA9IHRhYmxlW2tleV07Ci0JCQkJbWFwLnB1dCh2YWx1ZSwgbmV3IEludGVnZXIoa2V5KSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIE9iamVjdFtdIHRhYmxlID0gbnVsbDsKLQkJcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRJbmRleChpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBpbmRleCA+PSAwICYmIGluZGV4IDwgdGFibGUubGVuZ3RoOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFRvbGVyYW50U3RyaW5nRHVhbE1hcCBleHRlbmRzIER1YWxNYXAgewotCQlwdWJsaWMgVG9sZXJhbnRTdHJpbmdEdWFsTWFwKFN0cmluZ1tdIG5hbWVzKSB7Ci0JCQlzdXBlcigpOwotCQkJT2JqZWN0W10gb2JqZWN0cyA9IG5ldyBPYmplY3RbbmFtZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlvYmplY3RzW2ldID0gbWFrZUNhbm9uaWNhbEZvcm0obmFtZXNbaV0pOwotCQkJfQotCQkJaW5pdGlhbGl6ZShvYmplY3RzKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0S2V5KE9iamVjdCB2YWx1ZSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIHZhbHVlOwotCQkJCXJldHVybiBzdXBlci5nZXRLZXkobWFrZUNhbm9uaWNhbEZvcm0obmFtZSkpOwotCQkJfQotCQkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIElEX1VOS05PV047Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBtYWtlQ2Fub25pY2FsRm9ybShTdHJpbmcgcmF3KSB7Ci0JCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDE1MgotCQkJLy8gd2UgYXJlIGFibGUgdG8gImNoZWF0IiBoZXJlIGEgbGl0dGxlIGFuZCB1c2UgVVMgTG9jYWxlCi0JCQkvLyB0byBnZXQgYSBnb29kIGNvbm9uaWNhbCBmb3JtLCBzaW5jZSB3ZSBhcmUgdXNpbmcgdGhpcyBvbmx5Ci0JCQkvLyBmb3IgSFRNTCBhbmQgSlNQIHN0YW5kYXJkIHRhZ3MuCi0JCQkvLyBMb25nIHRlcm0sIGZvciBzaW1pbGFyIG5lZWRzIHdpdGggWE1MIDEuMSAoZm9yIGV4YW1wbGUpCi0JCQkvLyB3ZSBzaG91bGQgdXNlIGEgY2xhc3Mgc3VjaCBhcyBjb20uaWJtLmljdS50ZXh0Lk5vcm1hbGl6ZXIKLQkJCXJldHVybiByYXcudG9VcHBlckNhc2UoTG9jYWxlLlVTKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgRGVjbEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCQlwdWJsaWMgRGVjbEl0ZXJhdG9yKCkgewotCQkJbWF4aWQgPSBmRGVjbHMubGVuZ3RoIC0gMTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gaWQgPCBtYXhpZDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCWlmICghaGFzTmV4dCgpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGl0ZW0oKytpZCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7IC8qIG5vdGhpbmcgc2hvdWxkIGJlIGRvbmUuICovCi0JCX0KLQotCQlwcml2YXRlIGludCBpZCA9IC0xOwotCQlwcml2YXRlIGludCBtYXhpZCA9IC0xOwotCX0KLQotCUNNTm9kZVtdIGZEZWNscyA9IG51bGw7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBib29sZWFuIFNUUklDVF9DQVNFID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBib29sZWFuIFRPTEVSQU5UX0NBU0UgPSB0cnVlOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IElEX1VOS05PV04gPSAtMTsKLQlwcml2YXRlIER1YWxNYXAgZk1hcCA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRGVjbENvbGxlY3Rpb24oU3RyaW5nW10gbmFtZXMsIGJvb2xlYW4gdG9sZXJhbnQpIHsKLQkJc3VwZXIoKTsKLQkJZkRlY2xzID0gbmV3IENNTm9kZVtuYW1lcy5sZW5ndGhdOwotCQlpZiAodG9sZXJhbnQpIHsKLQkJCWZNYXAgPSBuZXcgVG9sZXJhbnRTdHJpbmdEdWFsTWFwKG5hbWVzKTsKLQkJfQotCQllbHNlIHsKLQkJCWZNYXAgPSBuZXcgRHVhbE1hcChuYW1lcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ01Ob2RlIGNyZWF0ZShTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RGVjbGFyYXRpb25zKFN0cmluZ1tdIG5hbWVzKSB7Ci0JCUNNTmFtZWROb2RlTWFwSW1wbCBtYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gbmFtZXNbaV07Ci0JCQlDTU5vZGUgbm9kZSA9IGdldE5hbWVkSXRlbShuYW1lKTsKLQkJCWlmIChub2RlID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQltYXAucHV0TmFtZWRJdGVtKG5hbWUsIG5vZGUpOwotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCi0JcHVibGljIHZvaWQgZ2V0RGVjbGFyYXRpb25zKENNR3JvdXBJbXBsIGdyb3VwLCBJdGVyYXRvciBuYW1lcykgewotCQl3aGlsZSAobmFtZXMuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgZW50aXR5TmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHQoKTsKLQkJCUNNTm9kZSBkZWMgPSBnZXROYW1lZEl0ZW0oZW50aXR5TmFtZSk7Ci0JCQlpZiAoZGVjICE9IG51bGwpCi0JCQkJZ3JvdXAuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1hcCBuYW1lIHRvIGlkLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldElEKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmTWFwLmdldEtleShuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMZW5ndGggbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZEZWNscy5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWUoaW50IGlkKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBmTWFwLmdldFZhbHVlKGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lZEl0ZW0gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCWludCBpZCA9IGdldElEKG5hbWUpOwotCQlpZiAoIWlzVmFsaWRJRChpZCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGl0ZW0oaWQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRJRChpbnQgaWQpIHsKLQkJcmV0dXJuIGlkID49IDAgJiYgaWQgPCBmRGVjbHMubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIGl0ZW0gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1ZhbGlkSUQoaW5kZXgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNNTm9kZSBkZWNsID0gZkRlY2xzW2luZGV4XTsKLQkJaWYgKGRlY2wgIT0gbnVsbCkKLQkJCXJldHVybiBkZWNsOyAvLyBhbHJlYWR5IGV4aXN0LgotCi0JCWRlY2wgPSBjcmVhdGUoZ2V0TmFtZShpbmRleCkpOwotCQlmRGVjbHNbaW5kZXhdID0gZGVjbDsKLQkJcmV0dXJuIGRlY2w7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IERlY2xJdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvRWxlbWVudENvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvRWxlbWVudENvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE4MDEzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0VsZW1lbnRDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGVsZW1lbnQgZGVjbGFyYXRpb25zLgotICovCi1maW5hbCBjbGFzcyBFbGVtZW50Q29sbGVjdGlvbiBleHRlbmRzIERlY2xDb2xsZWN0aW9uIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUgewotCi0KLQkvLyBFbGVtZW50IElEcwotCXByaXZhdGUgc3RhdGljIGNsYXNzIElkcyB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0EgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BRERSRVNTID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkFTRSA9IDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JMT0NLUVVPVEUgPSAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CT0RZID0gNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQlIgPSA1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DRU5URVIgPSA2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ERCA9IDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJUiA9IDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJViA9IDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RMID0gMTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RUID0gMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZPUk0gPSAxMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDEgPSAxMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDIgPSAxNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDMgPSAxNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDQgPSAxNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDUgPSAxNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSDYgPSAxODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSEVBRCA9IDE5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IUiA9IDIwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IVE1MID0gMjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lNRyA9IDIyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JTlBVVCA9IDIzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MSSA9IDI0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NRU5VID0gMjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01FVEEgPSAyNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0wgPSAyNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1BUSU9OID0gMjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1AgPSAyOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFJFID0gMzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NFTEVDVCA9IDMxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9URVhUQVJFQSA9IDMyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USVRMRSA9IDMzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VTCA9IDM0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfQ09ORklHID0gMzU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9FQ0hPID0gMzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9FWEVDID0gMzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9GU0laRSA9IDM4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfRkxBU1RNT0QgPSAzOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0lOQ0xVREUgPSA0MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX1BSSU5URU5WID0gNDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9TRVQgPSA0MjsKLQotCQlwdWJsaWMgc3RhdGljIGludCBnZXROdW1PZklkcygpIHsKLQkJCWlmIChudW1vZmlkcyAhPSAtMSkKLQkJCQlyZXR1cm4gbnVtb2ZpZHM7Ci0KLQkJCS8vIE5PVEU6IElmIHRoZSByZWZsZWN0aW9uIGlzIHRvbyBzbG93LCB0aGlzIG1ldGhvZCBzaG91bGQKLQkJCS8vIGp1c3QgcmV0dXJuIHRoZSBsaXRlcmFsIHZhbHVlLCBsaWtlIDEwNS4KLQkJCS8vIC0tIDUvMjUvMjAwMQotCQkJQ2xhc3MgY2xhenogPSBJZHMuY2xhc3M7Ci0JCQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldEZpZWxkcygpOwotCQkJbnVtb2ZpZHMgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGZpZWxkc1tpXS5nZXROYW1lKCk7Ci0JCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiSURfIikpLy8kTk9OLU5MUy0xJAotCQkJCQludW1vZmlkcysrOwotCQkJfQotCQkJcmV0dXJuIG51bW9maWRzOwotCQl9Ci0KLQkJLy8gY2hhY2hlIHRoZSByZXN1bHQgb2YgdGhlIHJlZmxlY3Rpb24uCi0JCXByaXZhdGUgc3RhdGljIGludCBudW1vZmlkcyA9IC0xOwotCX0KLQotCS8qKiAlZm9ybWN0bDsuIElOUFVUIHwgU0VMRUNUIHwgVEVYVEFSRUEgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGT1JNQ1RMID0ge0lOUFVULCBTRUxFQ1QsIFRFWFRBUkVBfTsKLQkvKiogJXBocmFzZTsuCi0JICogREZOCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUEhSQVNFID0ge0RGTn07Ci0JLyoqICVzcGVjaWFsOy4KLQkgKiBBIHwgSU1HIHwgQlIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTUEVDSUFMID0ge0EsIElNRywgQlJ9OwotCS8qKiAlaGVhZGluZzsuIEhbMS02XSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhFQURJTkcgPSB7SDEsIEgyLCBIMywgSDQsIEg1LCBINn07Ci0JLyoqICVsaXN0Oy4gVUwgfCBPTCB8IERJUiB8IE1FTlUgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMSVNUID0ge1VMLCBPTCwgRElSLCBNRU5VfTsKLQkvKiogJXByZWZvcm1hdHRlZDsuIFBSRSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBSRUZPUk1BVFRFRCA9IHtQUkV9OwotCXByaXZhdGUgQXR0cmlidXRlQ29sbGVjdGlvbiBhdHRyaWJ1dGVDb2xsZWN0aW9uID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBuYW1lcyA9IG51bGw7Ci0KLQlzdGF0aWMgewotCQluYW1lcyA9IG5ldyBTdHJpbmdbSWRzLmdldE51bU9mSWRzKCldOwotCQluYW1lc1tJZHMuSURfQV0gPSBBOwotCQluYW1lc1tJZHMuSURfQUREUkVTU10gPSBBRERSRVNTOwotCQluYW1lc1tJZHMuSURfQkFTRV0gPSBCQVNFOwotCQluYW1lc1tJZHMuSURfQkxPQ0tRVU9URV0gPSBCTE9DS1FVT1RFOwotCQluYW1lc1tJZHMuSURfQk9EWV0gPSBCT0RZOwotCQluYW1lc1tJZHMuSURfQlJdID0gQlI7Ci0JCW5hbWVzW0lkcy5JRF9DRU5URVJdID0gQ0VOVEVSOwotCQluYW1lc1tJZHMuSURfRERdID0gREQ7Ci0JCW5hbWVzW0lkcy5JRF9ESVJdID0gRElSOwotCQluYW1lc1tJZHMuSURfRElWXSA9IERJVjsKLQkJbmFtZXNbSWRzLklEX0RMXSA9IERMOwotCQluYW1lc1tJZHMuSURfRFRdID0gRFQ7Ci0JCW5hbWVzW0lkcy5JRF9GT1JNXSA9IEZPUk07Ci0JCW5hbWVzW0lkcy5JRF9IMV0gPSBIMTsKLQkJbmFtZXNbSWRzLklEX0gyXSA9IEgyOwotCQluYW1lc1tJZHMuSURfSDNdID0gSDM7Ci0JCW5hbWVzW0lkcy5JRF9INF0gPSBINDsKLQkJbmFtZXNbSWRzLklEX0g1XSA9IEg1OwotCQluYW1lc1tJZHMuSURfSDZdID0gSDY7Ci0JCW5hbWVzW0lkcy5JRF9IRUFEXSA9IEhFQUQ7Ci0JCW5hbWVzW0lkcy5JRF9IUl0gPSBIUjsKLQkJbmFtZXNbSWRzLklEX0hUTUxdID0gSFRNTDsKLQkJbmFtZXNbSWRzLklEX0lNR10gPSBJTUc7Ci0JCW5hbWVzW0lkcy5JRF9JTlBVVF0gPSBJTlBVVDsKLQkJbmFtZXNbSWRzLklEX0xJXSA9IExJOwotCQluYW1lc1tJZHMuSURfTUVOVV0gPSBNRU5VOwotCQluYW1lc1tJZHMuSURfTUVUQV0gPSBNRVRBOwotCQluYW1lc1tJZHMuSURfT0xdID0gT0w7Ci0JCW5hbWVzW0lkcy5JRF9PUFRJT05dID0gT1BUSU9OOwotCQluYW1lc1tJZHMuSURfUF0gPSBQOwotCQluYW1lc1tJZHMuSURfUFJFXSA9IFBSRTsKLQkJbmFtZXNbSWRzLklEX1NFTEVDVF0gPSBTRUxFQ1Q7Ci0JCW5hbWVzW0lkcy5JRF9URVhUQVJFQV0gPSBURVhUQVJFQTsKLQkJbmFtZXNbSWRzLklEX1RJVExFXSA9IFRJVExFOwotCQluYW1lc1tJZHMuSURfVUxdID0gVUw7Ci0JCW5hbWVzW0lkcy5JRF9TU0lfQ09ORklHXSA9IFNTSV9DT05GSUc7Ci0JCW5hbWVzW0lkcy5JRF9TU0lfRUNIT10gPSBTU0lfRUNITzsKLQkJbmFtZXNbSWRzLklEX1NTSV9FWEVDXSA9IFNTSV9FWEVDOwotCQluYW1lc1tJZHMuSURfU1NJX0ZTSVpFXSA9IFNTSV9GU0laRTsKLQkJbmFtZXNbSWRzLklEX1NTSV9GTEFTVE1PRF0gPSBTU0lfRkxBU1RNT0Q7Ci0JCW5hbWVzW0lkcy5JRF9TU0lfSU5DTFVERV0gPSBTU0lfSU5DTFVERTsKLQkJbmFtZXNbSWRzLklEX1NTSV9QUklOVEVOVl0gPSBTU0lfUFJJTlRFTlY7Ci0JCW5hbWVzW0lkcy5JRF9TU0lfU0VUXSA9IFNTSV9TRVQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEVsZW1lbnRDb2xsZWN0aW9uKEF0dHJpYnV0ZUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihuYW1lcywgVE9MRVJBTlRfQ0FTRSk7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEFjdHVhbGx5IGNyZWF0ZXMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBpbnN0YW5jZS4KLQkgKiBAcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgQ01Ob2RlIGNyZWF0ZShTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJSFRNTEVsZW1EZWNsSW1wbCBlZGVjID0gbnVsbDsKLQotCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShBKSkgewotCQkJZWRlYyA9IG5ldyBIZWRBKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShBRERSRVNTKSkgewotCQkJZWRlYyA9IG5ldyBIZWRBRERSRVNTKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCQVNFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCQVNFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCTE9DS1FVT1RFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCTE9DS1FVT1RFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCT0RZKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCT0RZKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQlIodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKENFTlRFUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQ0VOVEVSKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShERCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkREQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKERJUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTUVOVShESVIsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShESVYpKSB7Ci0JCQllZGVjID0gbmV3IEhlZERJVih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoREwpKSB7Ci0JCQllZGVjID0gbmV3IEhlZERMKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShEVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRFQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEZPUk0pKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZPUk0odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEgxKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEgxLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDIsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIMykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhIMywgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEg0KSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEg0LCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDUsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShINikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhINiwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhFQUQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhFQUQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIUih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSFRNTCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSU1HKSkgewotCQkJZWRlYyA9IG5ldyBIZWRJTUcodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKElOUFVUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRJTlBVVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTEkpKSB7Ci0JCQllZGVjID0gbmV3IEhlZExJKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShNRU5VKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNRU5VKE1FTlUsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShNRVRBKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNRVRBKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShPTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkT0wodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE9QVElPTikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkT1BUSU9OKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShQKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShQUkUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBSRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU0VMRUNUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTRUxFQ1QodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRFWFRBUkVBKSkgewotCQkJZWRlYyA9IG5ldyBIZWRURVhUQVJFQSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVElUTEUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRJVExFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShVTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVUwodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9DT05GSUcpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUNvbmZpZyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0VDSE8pKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUVjaG8odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9FWEVDKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lFeGVjKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfRlNJWkUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUZzaXplKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfRkxBU1RNT0QpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUZsYXN0bW9kKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfSU5DTFVERSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJSW5jbHVkZSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX1BSSU5URU5WKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lQcmludGVudih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX1NFVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJU2V0KHRoaXMpOwotCi0JCX0gLy8gdW5rbm93bgotCQllbHNlIHsKLQkJCS8vIE5PVEU6IFdlIGRvbid0IGRlZmluZSB0aGUgVU5LTk9XTiBlbGVtZW50IGRlY2xhcmF0aW9uLgotCQkJLy8gPGNvZGU+bnVsbDwvY29kZT4gZm9yIGEgZGVjbGFyYXRpb24gaXMgYSBzaWduIG9mCi0JCQkvLyB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgdW5rbm93bi4KLQkJCS8vIC0tIDMvOS8yMDAxCi0JCQllZGVjID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZWRlYzsKLQl9Ci0KLQlwdWJsaWMgQXR0cmlidXRlQ29sbGVjdGlvbiBnZXRBdHRyaWJ1dGVDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gYXR0cmlidXRlQ29sbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgQ29sbGVjdGlvbiBnZXROYW1lc09mQmxvY2soKSB7Ci0JCS8vIFAgfCAlbGlzdCB8ICVwcmVmb3JtYXR0ZWQgfCBETCB8IERJViB8IENFTlRFUiB8IEJMT0NLUVVPVEUgfCBGT1JNIHwgSFIKLQkJU3RyaW5nW10gYmxvY2tNaXNjID0ge1AsIERMLCBESVYsIENFTlRFUiwgQkxPQ0tRVU9URSwgRk9STSwgSFIsfTsKLQkJVmVjdG9yIGJsb2NrTmFtZXMgPSBuZXcgVmVjdG9yKEFycmF5cy5hc0xpc3QoYmxvY2tNaXNjKSk7Ci0JCS8vICVoZWFkaW5nOwotCQlibG9ja05hbWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KEhFQURJTkcpKTsKLQkJLy8gJWxpc3Q7Ci0JCWJsb2NrTmFtZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoTElTVCkpOwotCQkvLyAlcHJlZm9ybWF0dGVkOwotCQlibG9ja05hbWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KFBSRUZPUk1BVFRFRCkpOwotCi0JCXJldHVybiBibG9ja05hbWVzOwotCX0KLQotCS8qKgotCSAqICVibG9jazsuCi0JICogJWJsb2NrOyBpczoKLQkgKiBQIHwgJWhlYWRpbmc7IHwgJWxpc3Q7IHwgJXByZWZvcm1hdHRlZDsgfCBETCB8IERJViB8IENFTlRFUiB8Ci0JICogTk9TQ1JJUFQgfCBOT0ZSQU1FUyB8IEJMT0NLUVVPVEUgfCBGT1JNIHwgSVNJTkRFWCB8IEhSIHwKLQkgKiBUQUJMRSB8IEZJRUxEU0VUIHwgQUREUkVTUy48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0QmxvY2soQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgZ2V0TmFtZXNPZkJsb2NrKCkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtCi0JICogaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPiBpbnN0YW5jZS4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRGbG93KENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXRCbG9jayhncm91cCk7Ci0JCWdldElubGluZShncm91cCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4KLQkgKiBpbnN0YW5jZS48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0Rm9udHN0eWxlKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0gaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPgotCSAqIGluc3RhbmNlLjxicj4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRGb3JtY3RybChDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KEZPUk1DVEwpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqICVoZWFkaW5nOy4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRIZWFkaW5nKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChIRUFESU5HKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0KLQkgKiBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+IGluc3RhbmNlLgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldElubGluZShDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0Rm9udHN0eWxlKGdyb3VwKTsKLQkJZ2V0UGhyYXNlKGdyb3VwKTsKLQkJZ2V0U3BlY2lhbChncm91cCk7Ci0JCWdldEZvcm1jdHJsKGdyb3VwKTsKLQl9Ci0KLQkvKioKLQkgKiAlbGlzdDsuCi0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0TGlzdChDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoTElTVCkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4KLQkgKiBpbnN0YW5jZS48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0UGhyYXNlKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoUEhSQVNFKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiAlcHJlZm9ybWF0dGVkOwotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldFByZWZvcm1hdHRlZChDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoUFJFRk9STUFUVEVEKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0gaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPgotCSAqIGluc3RhbmNlLjxicj4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRTcGVjaWFsKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoU1BFQ0lBTCkuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9FbnRpdHlDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0VudGl0eUNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzNzFmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0VudGl0eUNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBlbnRpdHkgZGVjbGFyYXRpb25zLgotICovCi1maW5hbCBjbGFzcyBFbnRpdHlDb2xsZWN0aW9uIGV4dGVuZHMgRGVjbENvbGxlY3Rpb24gaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZS5FbnRpdHlOYW1lIHsKLQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSWRzIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUFDVVRFX0wgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQUNVVEVfVSA9IDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FDSVJDX0wgPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQ0lSQ19VID0gMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUNVVEUgPSA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BRUxJR19MID0gNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUVMSUdfVSA9IDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FHUkFWRV9MID0gNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUdSQVZFX1UgPSA4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTEVGU1lNID0gOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUxQSEFfTCA9IDEwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTFBIQV9VID0gMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FNUCA9IDEyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTkQgPSAxMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQU5HID0gMTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FSSU5HX0wgPSAxNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVJJTkdfVSA9IDE2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BU1lNUCA9IDE3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVElMREVfTCA9IDE4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVElMREVfVSA9IDE5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVU1MX0wgPSAyMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVVNTF9VID0gMjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JEUVVPID0gMjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JFVEFfTCA9IDIzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CRVRBX1UgPSAyNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQlJWQkFSID0gMjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JVTEwgPSAyNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0FQID0gMjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NDRURJTF9MID0gMjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NDRURJTF9VID0gMjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NFRElMID0gMzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NFTlQgPSAzMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0hJX0wgPSAzMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0hJX1UgPSAzMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0lSQyA9IDM0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DTFVCUyA9IDM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DT05HID0gMzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NPUFkgPSAzNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ1JBUlIgPSAzODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ1VQID0gMzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NVUlJFTiA9IDQwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EQUdHRVJfTCA9IDQxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EQUdHRVJfVSA9IDQyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EQVJSX0wgPSA0MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREFSUl9VID0gNDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RFRyA9IDQ1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ERUxUQV9MID0gNDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RFTFRBX1UgPSA0NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElBTVMgPSA0ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElWSURFID0gNDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VBQ1VURV9MID0gNTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VBQ1VURV9VID0gNTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VDSVJDX0wgPSA1MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUNJUkNfVSA9IDUzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FR1JBVkVfTCA9IDU0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FR1JBVkVfVSA9IDU1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FTVBUWSA9IDU2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FTVNQID0gNTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VOU1AgPSA1ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVBTSUxPTl9MID0gNTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VQU0lMT05fVSA9IDYwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FUVVJViA9IDYxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEFfTCA9IDYyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEFfVSA9IDYzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEhfTCA9IDY0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEhfVSA9IDY1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVU1MX0wgPSA2NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVVNTF9VID0gNjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VVUk8gPSA2ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVhJU1QgPSA2OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRk5PRiA9IDcwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GT1JBTEwgPSA3MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRlJBQzEyID0gNzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZSQUMxNCA9IDczOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GUkFDMzQgPSA3NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRlJBU0wgPSA3NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfR0FNTUFfTCA9IDc2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9HQU1NQV9VID0gNzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dFID0gNzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dUID0gNzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hBUlJfTCA9IDgwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IQVJSX1UgPSA4MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSEVBUlRTID0gODI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hFTExJUCA9IDgzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JQUNVVEVfTCA9IDg0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JQUNVVEVfVSA9IDg1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JQ0lSQ19MID0gODY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lDSVJDX1UgPSA4NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUVYQ0wgPSA4ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUdSQVZFX0wgPSA4OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUdSQVZFX1UgPSA5MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU1BR0UgPSA5MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5GSU4gPSA5MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5UID0gOTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lPVEFfTCA9IDk0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JT1RBX1UgPSA5NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSVFVRVNUID0gOTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lTSU4gPSA5NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSVVNTF9MID0gOTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lVTUxfVSA9IDk5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9LQVBQQV9MID0gMTAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9LQVBQQV9VID0gMTAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQU1CREFfTCA9IDEwMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFNQkRBX1UgPSAxMDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBTkcgPSAxMDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBUVVPID0gMTA1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQVJSX0wgPSAxMDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBUlJfVSA9IDEwNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTENFSUwgPSAxMDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xEUVVPID0gMTA5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MRSA9IDExMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEZMT09SID0gMTExOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MT1dBU1QgPSAxMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xPWiA9IDExMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTFJNID0gMTE0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MU0FRVU8gPSAxMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xTUVVPID0gMTE2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MVCA9IDExNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUFDUiA9IDExODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTURBU0ggPSAxMTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01JQ1JPID0gMTIwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NSURET1QgPSAxMjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01JTlVTID0gMTIyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NVV9MID0gMTIzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NVV9VID0gMTI0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OQUJMQSA9IDEyNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTkJTUCA9IDEyNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTkRBU0ggPSAxMjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05FID0gMTI4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OSSA9IDEyOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTk9UID0gMTMwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OT1RJTiA9IDEzMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTlNVQiA9IDEzMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTlRJTERFX0wgPSAxMzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05USUxERV9VID0gMTM0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OVV9MID0gMTM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OVV9VID0gMTM2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PQUNVVEVfTCA9IDEzNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0FDVVRFX1UgPSAxMzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09DSVJDX0wgPSAxMzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09DSVJDX1UgPSAxNDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09FTElHX0wgPSAxNDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09FTElHX1UgPSAxNDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09HUkFWRV9MID0gMTQzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PR1JBVkVfVSA9IDE0NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0xJTkUgPSAxNDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09NRUdBX0wgPSAxNDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09NRUdBX1UgPSAxNDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09NSUNST05fTCA9IDE0ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT01JQ1JPTl9VID0gMTQ5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PUExVUyA9IDE1MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1IgPSAxNTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09SREYgPSAxNTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09SRE0gPSAxNTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09TTEFTSF9MID0gMTU0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PU0xBU0hfVSA9IDE1NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1RJTERFX0wgPSAxNTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09USUxERV9VID0gMTU3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PVElNRVMgPSAxNTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09VTUxfTCA9IDE1OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1VNTF9VID0gMTYwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QQVJBID0gMTYxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QQVJUID0gMTYyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QRVJNSUwgPSAxNjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BFUlAgPSAxNjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BISV9MID0gMTY1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSElfVSA9IDE2NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUElWID0gMTY3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSV9MID0gMTY4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSV9VID0gMTY5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QTFVTTU4gPSAxNzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BPVU5EID0gMTcxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUklNRV9MID0gMTcyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUklNRV9VID0gMTczOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUk9EID0gMTc0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUk9QID0gMTc1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QU0lfTCA9IDE3NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFNJX1UgPSAxNzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1FVT1QgPSAxNzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JBRElDID0gMTc5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQU5HID0gMTgwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQVFVTyA9IDE4MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkFSUl9MID0gMTgyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQVJSX1UgPSAxODM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JDRUlMID0gMTg0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SRFFVTyA9IDE4NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkVBTCA9IDE4NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkVHID0gMTg3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SRkxPT1IgPSAxODg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JIT19MID0gMTg5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SSE9fVSA9IDE5MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkxNID0gMTkxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SU0FRVU8gPSAxOTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JTUVVPID0gMTkzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TQlFVTyA9IDE5NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0NBUk9OX0wgPSAxOTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NDQVJPTl9VID0gMTk2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TRE9UID0gMTk3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TRUNUID0gMTk4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TSFkgPSAxOTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NJR01BRiA9IDIwMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0lHTUFfTCA9IDIwMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0lHTUFfVSA9IDIwMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0lNID0gMjAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TUEFERVMgPSAyMDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVQiA9IDIwNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VCRSA9IDIwNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VNID0gMjA3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVVAgPSAyMDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUDEgPSAyMDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUDIgPSAyMTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUDMgPSAyMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUEUgPSAyMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NaTElHID0gMjEzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UQVVfTCA9IDIxNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEFVX1UgPSAyMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRVJFNCA9IDIxNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhFVEFTWU0gPSAyMTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRVRBX0wgPSAyMTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRVRBX1UgPSAyMTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RISU5TUCA9IDIyMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhPUk5fTCA9IDIyMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhPUk5fVSA9IDIyMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVElMREUgPSAyMjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RJTUVTID0gMjI0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UUkFERSA9IDIyNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUFDVVRFX0wgPSAyMjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VBQ1VURV9VID0gMjI3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VQVJSX0wgPSAyMjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VBUlJfVSA9IDIyOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUNJUkNfTCA9IDIzMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUNJUkNfVSA9IDIzMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUdSQVZFX0wgPSAyMzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VHUkFWRV9VID0gMjMzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VTUwgPSAyMzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VQU0lIID0gMjM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VUFNJTE9OX0wgPSAyMzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VQU0lMT05fVSA9IDIzNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVVVNTF9MID0gMjM4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VVU1MX1UgPSAyMzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1dFSUVSUCA9IDI0MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWElfTCA9IDI0MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWElfVSA9IDI0MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWUFDVVRFX0wgPSAyNDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1lBQ1VURV9VID0gMjQ0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ZRU4gPSAyNDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1lVTUxfTCA9IDI0NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWVVNTF9VID0gMjQ3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9aRVRBX0wgPSAyNDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1pFVEFfVSA9IDI0OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWldKID0gMjUwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9aV05KID0gMjUxOwotCi0JCXB1YmxpYyBzdGF0aWMgaW50IGdldE51bU9mSWRzKCkgewotCQkJaWYgKG51bW9maWRzICE9IC0xKQotCQkJCXJldHVybiBudW1vZmlkczsKLQotCQkJLy8gTk9URTogSWYgdGhlIHJlZmxlY3Rpb24gaXMgdG9vIHNsb3csIHRoaXMgbWV0aG9kIHNob3VsZAotCQkJLy8ganVzdCByZXR1cm4gdGhlIGxpdGVyYWwgdmFsdWUsIGxpa2UgMjUyLgotCQkJLy8gLS0gNS8yNC8yMDAxCi0JCQlDbGFzcyBjbGF6eiA9IElkcy5jbGFzczsKLQkJCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RmllbGRzKCk7Ci0JCQludW1vZmlkcyA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gZmllbGRzW2ldLmdldE5hbWUoKTsKLQkJCQlpZiAobmFtZS5zdGFydHNXaXRoKCJJRF8iKSkvLyROT04tTkxTLTEkCi0JCQkJCW51bW9maWRzKys7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVtb2ZpZHM7Ci0JCX0KLQotCQkvLyBjaGFjaGUgdGhlIHJlc3VsdCBvZiB0aGUgcmVmbGVjdGlvbi4KLQkJcHJpdmF0ZSBzdGF0aWMgaW50IG51bW9maWRzID0gLTE7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbmFtZXMgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJbmFtZXMgPSBuZXcgU3RyaW5nW0lkcy5nZXROdW1PZklkcygpXTsKLQkJbmFtZXNbSWRzLklEX0FBQ1VURV9MXSA9IEFBQ1VURV9MOwotCQluYW1lc1tJZHMuSURfQUFDVVRFX1VdID0gQUFDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9BQ0lSQ19MXSA9IEFDSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9BQ0lSQ19VXSA9IEFDSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9BQ1VURV0gPSBBQ1VURTsKLQkJbmFtZXNbSWRzLklEX0FFTElHX0xdID0gQUVMSUdfTDsKLQkJbmFtZXNbSWRzLklEX0FFTElHX1VdID0gQUVMSUdfVTsKLQkJbmFtZXNbSWRzLklEX0FHUkFWRV9MXSA9IEFHUkFWRV9MOwotCQluYW1lc1tJZHMuSURfQUdSQVZFX1VdID0gQUdSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9BTEVGU1lNXSA9IEFMRUZTWU07Ci0JCW5hbWVzW0lkcy5JRF9BTFBIQV9MXSA9IEFMUEhBX0w7Ci0JCW5hbWVzW0lkcy5JRF9BTFBIQV9VXSA9IEFMUEhBX1U7Ci0JCW5hbWVzW0lkcy5JRF9BTVBdID0gQU1QOwotCQluYW1lc1tJZHMuSURfQU5EXSA9IEFORDsKLQkJbmFtZXNbSWRzLklEX0FOR10gPSBBTkc7Ci0JCW5hbWVzW0lkcy5JRF9BUklOR19MXSA9IEFSSU5HX0w7Ci0JCW5hbWVzW0lkcy5JRF9BUklOR19VXSA9IEFSSU5HX1U7Ci0JCW5hbWVzW0lkcy5JRF9BU1lNUF0gPSBBU1lNUDsKLQkJbmFtZXNbSWRzLklEX0FUSUxERV9MXSA9IEFUSUxERV9MOwotCQluYW1lc1tJZHMuSURfQVRJTERFX1VdID0gQVRJTERFX1U7Ci0JCW5hbWVzW0lkcy5JRF9BVU1MX0xdID0gQVVNTF9MOwotCQluYW1lc1tJZHMuSURfQVVNTF9VXSA9IEFVTUxfVTsKLQkJbmFtZXNbSWRzLklEX0JEUVVPXSA9IEJEUVVPOwotCQluYW1lc1tJZHMuSURfQkVUQV9MXSA9IEJFVEFfTDsKLQkJbmFtZXNbSWRzLklEX0JFVEFfVV0gPSBCRVRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9CUlZCQVJdID0gQlJWQkFSOwotCQluYW1lc1tJZHMuSURfQlVMTF0gPSBCVUxMOwotCQluYW1lc1tJZHMuSURfQ0FQXSA9IENBUDsKLQkJbmFtZXNbSWRzLklEX0NDRURJTF9MXSA9IENDRURJTF9MOwotCQluYW1lc1tJZHMuSURfQ0NFRElMX1VdID0gQ0NFRElMX1U7Ci0JCW5hbWVzW0lkcy5JRF9DRURJTF0gPSBDRURJTDsKLQkJbmFtZXNbSWRzLklEX0NFTlRdID0gQ0VOVDsKLQkJbmFtZXNbSWRzLklEX0NISV9MXSA9IENISV9MOwotCQluYW1lc1tJZHMuSURfQ0hJX1VdID0gQ0hJX1U7Ci0JCW5hbWVzW0lkcy5JRF9DSVJDXSA9IENJUkM7Ci0JCW5hbWVzW0lkcy5JRF9DTFVCU10gPSBDTFVCUzsKLQkJbmFtZXNbSWRzLklEX0NPTkddID0gQ09ORzsKLQkJbmFtZXNbSWRzLklEX0NPUFldID0gQ09QWTsKLQkJbmFtZXNbSWRzLklEX0NSQVJSXSA9IENSQVJSOwotCQluYW1lc1tJZHMuSURfQ1VQXSA9IENVUDsKLQkJbmFtZXNbSWRzLklEX0NVUlJFTl0gPSBDVVJSRU47Ci0JCW5hbWVzW0lkcy5JRF9EQUdHRVJfTF0gPSBEQUdHRVJfTDsKLQkJbmFtZXNbSWRzLklEX0RBR0dFUl9VXSA9IERBR0dFUl9VOwotCQluYW1lc1tJZHMuSURfREFSUl9MXSA9IERBUlJfTDsKLQkJbmFtZXNbSWRzLklEX0RBUlJfVV0gPSBEQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9ERUddID0gREVHOwotCQluYW1lc1tJZHMuSURfREVMVEFfTF0gPSBERUxUQV9MOwotCQluYW1lc1tJZHMuSURfREVMVEFfVV0gPSBERUxUQV9VOwotCQluYW1lc1tJZHMuSURfRElBTVNdID0gRElBTVM7Ci0JCW5hbWVzW0lkcy5JRF9ESVZJREVdID0gRElWSURFOwotCQluYW1lc1tJZHMuSURfRUFDVVRFX0xdID0gRUFDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9FQUNVVEVfVV0gPSBFQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX0VDSVJDX0xdID0gRUNJUkNfTDsKLQkJbmFtZXNbSWRzLklEX0VDSVJDX1VdID0gRUNJUkNfVTsKLQkJbmFtZXNbSWRzLklEX0VHUkFWRV9MXSA9IEVHUkFWRV9MOwotCQluYW1lc1tJZHMuSURfRUdSQVZFX1VdID0gRUdSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9FTVBUWV0gPSBFTVBUWTsKLQkJbmFtZXNbSWRzLklEX0VNU1BdID0gRU1TUDsKLQkJbmFtZXNbSWRzLklEX0VOU1BdID0gRU5TUDsKLQkJbmFtZXNbSWRzLklEX0VQU0lMT05fTF0gPSBFUFNJTE9OX0w7Ci0JCW5hbWVzW0lkcy5JRF9FUFNJTE9OX1VdID0gRVBTSUxPTl9VOwotCQluYW1lc1tJZHMuSURfRVFVSVZdID0gRVFVSVY7Ci0JCW5hbWVzW0lkcy5JRF9FVEFfTF0gPSBFVEFfTDsKLQkJbmFtZXNbSWRzLklEX0VUQV9VXSA9IEVUQV9VOwotCQluYW1lc1tJZHMuSURfRVRIX0xdID0gRVRIX0w7Ci0JCW5hbWVzW0lkcy5JRF9FVEhfVV0gPSBFVEhfVTsKLQkJbmFtZXNbSWRzLklEX0VVTUxfTF0gPSBFVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9FVU1MX1VdID0gRVVNTF9VOwotCQluYW1lc1tJZHMuSURfRVVST10gPSBFVVJPOwotCQluYW1lc1tJZHMuSURfRVhJU1RdID0gRVhJU1Q7Ci0JCW5hbWVzW0lkcy5JRF9GTk9GXSA9IEZOT0Y7Ci0JCW5hbWVzW0lkcy5JRF9GT1JBTExdID0gRk9SQUxMOwotCQluYW1lc1tJZHMuSURfRlJBQzEyXSA9IEZSQUMxMjsKLQkJbmFtZXNbSWRzLklEX0ZSQUMxNF0gPSBGUkFDMTQ7Ci0JCW5hbWVzW0lkcy5JRF9GUkFDMzRdID0gRlJBQzM0OwotCQluYW1lc1tJZHMuSURfRlJBU0xdID0gRlJBU0w7Ci0JCW5hbWVzW0lkcy5JRF9HQU1NQV9MXSA9IEdBTU1BX0w7Ci0JCW5hbWVzW0lkcy5JRF9HQU1NQV9VXSA9IEdBTU1BX1U7Ci0JCW5hbWVzW0lkcy5JRF9HRV0gPSBHRTsKLQkJbmFtZXNbSWRzLklEX0dUXSA9IEdUOwotCQluYW1lc1tJZHMuSURfSEFSUl9MXSA9IEhBUlJfTDsKLQkJbmFtZXNbSWRzLklEX0hBUlJfVV0gPSBIQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9IRUFSVFNdID0gSEVBUlRTOwotCQluYW1lc1tJZHMuSURfSEVMTElQXSA9IEhFTExJUDsKLQkJbmFtZXNbSWRzLklEX0lBQ1VURV9MXSA9IElBQ1VURV9MOwotCQluYW1lc1tJZHMuSURfSUFDVVRFX1VdID0gSUFDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9JQ0lSQ19MXSA9IElDSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9JQ0lSQ19VXSA9IElDSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9JRVhDTF0gPSBJRVhDTDsKLQkJbmFtZXNbSWRzLklEX0lHUkFWRV9MXSA9IElHUkFWRV9MOwotCQluYW1lc1tJZHMuSURfSUdSQVZFX1VdID0gSUdSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9JTUFHRV0gPSBJTUFHRTsKLQkJbmFtZXNbSWRzLklEX0lORklOXSA9IElORklOOwotCQluYW1lc1tJZHMuSURfSU5UXSA9IElOVDsKLQkJbmFtZXNbSWRzLklEX0lPVEFfTF0gPSBJT1RBX0w7Ci0JCW5hbWVzW0lkcy5JRF9JT1RBX1VdID0gSU9UQV9VOwotCQluYW1lc1tJZHMuSURfSVFVRVNUXSA9IElRVUVTVDsKLQkJbmFtZXNbSWRzLklEX0lTSU5dID0gSVNJTjsKLQkJbmFtZXNbSWRzLklEX0lVTUxfTF0gPSBJVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9JVU1MX1VdID0gSVVNTF9VOwotCQluYW1lc1tJZHMuSURfS0FQUEFfTF0gPSBLQVBQQV9MOwotCQluYW1lc1tJZHMuSURfS0FQUEFfVV0gPSBLQVBQQV9VOwotCQluYW1lc1tJZHMuSURfTEFNQkRBX0xdID0gTEFNQkRBX0w7Ci0JCW5hbWVzW0lkcy5JRF9MQU1CREFfVV0gPSBMQU1CREFfVTsKLQkJbmFtZXNbSWRzLklEX0xBTkddID0gTEFORzsKLQkJbmFtZXNbSWRzLklEX0xBUVVPXSA9IExBUVVPOwotCQluYW1lc1tJZHMuSURfTEFSUl9MXSA9IExBUlJfTDsKLQkJbmFtZXNbSWRzLklEX0xBUlJfVV0gPSBMQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9MQ0VJTF0gPSBMQ0VJTDsKLQkJbmFtZXNbSWRzLklEX0xEUVVPXSA9IExEUVVPOwotCQluYW1lc1tJZHMuSURfTEVdID0gTEU7Ci0JCW5hbWVzW0lkcy5JRF9MRkxPT1JdID0gTEZMT09SOwotCQluYW1lc1tJZHMuSURfTE9XQVNUXSA9IExPV0FTVDsKLQkJbmFtZXNbSWRzLklEX0xPWl0gPSBMT1o7Ci0JCW5hbWVzW0lkcy5JRF9MUk1dID0gTFJNOwotCQluYW1lc1tJZHMuSURfTFNBUVVPXSA9IExTQVFVTzsKLQkJbmFtZXNbSWRzLklEX0xTUVVPXSA9IExTUVVPOwotCQluYW1lc1tJZHMuSURfTFRdID0gTFQ7Ci0JCW5hbWVzW0lkcy5JRF9NQUNSXSA9IE1BQ1I7Ci0JCW5hbWVzW0lkcy5JRF9NREFTSF0gPSBNREFTSDsKLQkJbmFtZXNbSWRzLklEX01JQ1JPXSA9IE1JQ1JPOwotCQluYW1lc1tJZHMuSURfTUlERE9UXSA9IE1JRERPVDsKLQkJbmFtZXNbSWRzLklEX01JTlVTXSA9IE1JTlVTOwotCQluYW1lc1tJZHMuSURfTVVfTF0gPSBNVV9MOwotCQluYW1lc1tJZHMuSURfTVVfVV0gPSBNVV9VOwotCQluYW1lc1tJZHMuSURfTkFCTEFdID0gTkFCTEE7Ci0JCW5hbWVzW0lkcy5JRF9OQlNQXSA9IE5CU1A7Ci0JCW5hbWVzW0lkcy5JRF9OREFTSF0gPSBOREFTSDsKLQkJbmFtZXNbSWRzLklEX05FXSA9IE5FOwotCQluYW1lc1tJZHMuSURfTkldID0gTkk7Ci0JCW5hbWVzW0lkcy5JRF9OT1RdID0gTk9UOwotCQluYW1lc1tJZHMuSURfTk9USU5dID0gTk9USU47Ci0JCW5hbWVzW0lkcy5JRF9OU1VCXSA9IE5TVUI7Ci0JCW5hbWVzW0lkcy5JRF9OVElMREVfTF0gPSBOVElMREVfTDsKLQkJbmFtZXNbSWRzLklEX05USUxERV9VXSA9IE5USUxERV9VOwotCQluYW1lc1tJZHMuSURfTlVfTF0gPSBOVV9MOwotCQluYW1lc1tJZHMuSURfTlVfVV0gPSBOVV9VOwotCQluYW1lc1tJZHMuSURfT0FDVVRFX0xdID0gT0FDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9PQUNVVEVfVV0gPSBPQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX09DSVJDX0xdID0gT0NJUkNfTDsKLQkJbmFtZXNbSWRzLklEX09DSVJDX1VdID0gT0NJUkNfVTsKLQkJbmFtZXNbSWRzLklEX09FTElHX0xdID0gT0VMSUdfTDsKLQkJbmFtZXNbSWRzLklEX09FTElHX1VdID0gT0VMSUdfVTsKLQkJbmFtZXNbSWRzLklEX09HUkFWRV9MXSA9IE9HUkFWRV9MOwotCQluYW1lc1tJZHMuSURfT0dSQVZFX1VdID0gT0dSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9PTElORV0gPSBPTElORTsKLQkJbmFtZXNbSWRzLklEX09NRUdBX0xdID0gT01FR0FfTDsKLQkJbmFtZXNbSWRzLklEX09NRUdBX1VdID0gT01FR0FfVTsKLQkJbmFtZXNbSWRzLklEX09NSUNST05fTF0gPSBPTUlDUk9OX0w7Ci0JCW5hbWVzW0lkcy5JRF9PTUlDUk9OX1VdID0gT01JQ1JPTl9VOwotCQluYW1lc1tJZHMuSURfT1BMVVNdID0gT1BMVVM7Ci0JCW5hbWVzW0lkcy5JRF9PUl0gPSBPUjsKLQkJbmFtZXNbSWRzLklEX09SREZdID0gT1JERjsKLQkJbmFtZXNbSWRzLklEX09SRE1dID0gT1JETTsKLQkJbmFtZXNbSWRzLklEX09TTEFTSF9MXSA9IE9TTEFTSF9MOwotCQluYW1lc1tJZHMuSURfT1NMQVNIX1VdID0gT1NMQVNIX1U7Ci0JCW5hbWVzW0lkcy5JRF9PVElMREVfTF0gPSBPVElMREVfTDsKLQkJbmFtZXNbSWRzLklEX09USUxERV9VXSA9IE9USUxERV9VOwotCQluYW1lc1tJZHMuSURfT1RJTUVTXSA9IE9USU1FUzsKLQkJbmFtZXNbSWRzLklEX09VTUxfTF0gPSBPVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9PVU1MX1VdID0gT1VNTF9VOwotCQluYW1lc1tJZHMuSURfUEFSQV0gPSBQQVJBOwotCQluYW1lc1tJZHMuSURfUEFSVF0gPSBQQVJUOwotCQluYW1lc1tJZHMuSURfUEVSTUlMXSA9IFBFUk1JTDsKLQkJbmFtZXNbSWRzLklEX1BFUlBdID0gUEVSUDsKLQkJbmFtZXNbSWRzLklEX1BISV9MXSA9IFBISV9MOwotCQluYW1lc1tJZHMuSURfUEhJX1VdID0gUEhJX1U7Ci0JCW5hbWVzW0lkcy5JRF9QSVZdID0gUElWOwotCQluYW1lc1tJZHMuSURfUElfTF0gPSBQSV9MOwotCQluYW1lc1tJZHMuSURfUElfVV0gPSBQSV9VOwotCQluYW1lc1tJZHMuSURfUExVU01OXSA9IFBMVVNNTjsKLQkJbmFtZXNbSWRzLklEX1BPVU5EXSA9IFBPVU5EOwotCQluYW1lc1tJZHMuSURfUFJJTUVfTF0gPSBQUklNRV9MOwotCQluYW1lc1tJZHMuSURfUFJJTUVfVV0gPSBQUklNRV9VOwotCQluYW1lc1tJZHMuSURfUFJPRF0gPSBQUk9EOwotCQluYW1lc1tJZHMuSURfUFJPUF0gPSBQUk9QOwotCQluYW1lc1tJZHMuSURfUFNJX0xdID0gUFNJX0w7Ci0JCW5hbWVzW0lkcy5JRF9QU0lfVV0gPSBQU0lfVTsKLQkJbmFtZXNbSWRzLklEX1FVT1RdID0gUVVPVDsKLQkJbmFtZXNbSWRzLklEX1JBRElDXSA9IFJBRElDOwotCQluYW1lc1tJZHMuSURfUkFOR10gPSBSQU5HOwotCQluYW1lc1tJZHMuSURfUkFRVU9dID0gUkFRVU87Ci0JCW5hbWVzW0lkcy5JRF9SQVJSX0xdID0gUkFSUl9MOwotCQluYW1lc1tJZHMuSURfUkFSUl9VXSA9IFJBUlJfVTsKLQkJbmFtZXNbSWRzLklEX1JDRUlMXSA9IFJDRUlMOwotCQluYW1lc1tJZHMuSURfUkRRVU9dID0gUkRRVU87Ci0JCW5hbWVzW0lkcy5JRF9SRUFMXSA9IFJFQUw7Ci0JCW5hbWVzW0lkcy5JRF9SRUddID0gUkVHOwotCQluYW1lc1tJZHMuSURfUkZMT09SXSA9IFJGTE9PUjsKLQkJbmFtZXNbSWRzLklEX1JIT19MXSA9IFJIT19MOwotCQluYW1lc1tJZHMuSURfUkhPX1VdID0gUkhPX1U7Ci0JCW5hbWVzW0lkcy5JRF9STE1dID0gUkxNOwotCQluYW1lc1tJZHMuSURfUlNBUVVPXSA9IFJTQVFVTzsKLQkJbmFtZXNbSWRzLklEX1JTUVVPXSA9IFJTUVVPOwotCQluYW1lc1tJZHMuSURfU0JRVU9dID0gU0JRVU87Ci0JCW5hbWVzW0lkcy5JRF9TQ0FST05fTF0gPSBTQ0FST05fTDsKLQkJbmFtZXNbSWRzLklEX1NDQVJPTl9VXSA9IFNDQVJPTl9VOwotCQluYW1lc1tJZHMuSURfU0RPVF0gPSBTRE9UOwotCQluYW1lc1tJZHMuSURfU0VDVF0gPSBTRUNUOwotCQluYW1lc1tJZHMuSURfU0hZXSA9IFNIWTsKLQkJbmFtZXNbSWRzLklEX1NJR01BRl0gPSBTSUdNQUY7Ci0JCW5hbWVzW0lkcy5JRF9TSUdNQV9MXSA9IFNJR01BX0w7Ci0JCW5hbWVzW0lkcy5JRF9TSUdNQV9VXSA9IFNJR01BX1U7Ci0JCW5hbWVzW0lkcy5JRF9TSU1dID0gU0lNOwotCQluYW1lc1tJZHMuSURfU1BBREVTXSA9IFNQQURFUzsKLQkJbmFtZXNbSWRzLklEX1NVQl0gPSBTVUI7Ci0JCW5hbWVzW0lkcy5JRF9TVUJFXSA9IFNVQkU7Ci0JCW5hbWVzW0lkcy5JRF9TVU1dID0gU1VNOwotCQluYW1lc1tJZHMuSURfU1VQXSA9IFNVUDsKLQkJbmFtZXNbSWRzLklEX1NVUDFdID0gU1VQMTsKLQkJbmFtZXNbSWRzLklEX1NVUDJdID0gU1VQMjsKLQkJbmFtZXNbSWRzLklEX1NVUDNdID0gU1VQMzsKLQkJbmFtZXNbSWRzLklEX1NVUEVdID0gU1VQRTsKLQkJbmFtZXNbSWRzLklEX1NaTElHXSA9IFNaTElHOwotCQluYW1lc1tJZHMuSURfVEFVX0xdID0gVEFVX0w7Ci0JCW5hbWVzW0lkcy5JRF9UQVVfVV0gPSBUQVVfVTsKLQkJbmFtZXNbSWRzLklEX1RIRVJFNF0gPSBUSEVSRTQ7Ci0JCW5hbWVzW0lkcy5JRF9USEVUQVNZTV0gPSBUSEVUQVNZTTsKLQkJbmFtZXNbSWRzLklEX1RIRVRBX0xdID0gVEhFVEFfTDsKLQkJbmFtZXNbSWRzLklEX1RIRVRBX1VdID0gVEhFVEFfVTsKLQkJbmFtZXNbSWRzLklEX1RISU5TUF0gPSBUSElOU1A7Ci0JCW5hbWVzW0lkcy5JRF9USE9STl9MXSA9IFRIT1JOX0w7Ci0JCW5hbWVzW0lkcy5JRF9USE9STl9VXSA9IFRIT1JOX1U7Ci0JCW5hbWVzW0lkcy5JRF9USUxERV0gPSBUSUxERTsKLQkJbmFtZXNbSWRzLklEX1RJTUVTXSA9IFRJTUVTOwotCQluYW1lc1tJZHMuSURfVFJBREVdID0gVFJBREU7Ci0JCW5hbWVzW0lkcy5JRF9VQUNVVEVfTF0gPSBVQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX1VBQ1VURV9VXSA9IFVBQ1VURV9VOwotCQluYW1lc1tJZHMuSURfVUFSUl9MXSA9IFVBUlJfTDsKLQkJbmFtZXNbSWRzLklEX1VBUlJfVV0gPSBVQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9VQ0lSQ19MXSA9IFVDSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9VQ0lSQ19VXSA9IFVDSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9VR1JBVkVfTF0gPSBVR1JBVkVfTDsKLQkJbmFtZXNbSWRzLklEX1VHUkFWRV9VXSA9IFVHUkFWRV9VOwotCQluYW1lc1tJZHMuSURfVU1MXSA9IFVNTDsKLQkJbmFtZXNbSWRzLklEX1VQU0lIXSA9IFVQU0lIOwotCQluYW1lc1tJZHMuSURfVVBTSUxPTl9MXSA9IFVQU0lMT05fTDsKLQkJbmFtZXNbSWRzLklEX1VQU0lMT05fVV0gPSBVUFNJTE9OX1U7Ci0JCW5hbWVzW0lkcy5JRF9VVU1MX0xdID0gVVVNTF9MOwotCQluYW1lc1tJZHMuSURfVVVNTF9VXSA9IFVVTUxfVTsKLQkJbmFtZXNbSWRzLklEX1dFSUVSUF0gPSBXRUlFUlA7Ci0JCW5hbWVzW0lkcy5JRF9YSV9MXSA9IFhJX0w7Ci0JCW5hbWVzW0lkcy5JRF9YSV9VXSA9IFhJX1U7Ci0JCW5hbWVzW0lkcy5JRF9ZQUNVVEVfTF0gPSBZQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX1lBQ1VURV9VXSA9IFlBQ1VURV9VOwotCQluYW1lc1tJZHMuSURfWUVOXSA9IFlFTjsKLQkJbmFtZXNbSWRzLklEX1lVTUxfTF0gPSBZVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9ZVU1MX1VdID0gWVVNTF9VOwotCQluYW1lc1tJZHMuSURfWkVUQV9MXSA9IFpFVEFfTDsKLQkJbmFtZXNbSWRzLklEX1pFVEFfVV0gPSBaRVRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9aV0pdID0gWldKOwotCQluYW1lc1tJZHMuSURfWldOSl0gPSBaV05KOwotCX0KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gdmFsdWVzID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCXZhbHVlcyA9IG5ldyBjaGFyW0lkcy5nZXROdW1PZklkcygpXTsKLQkJdmFsdWVzW0lkcy5JRF9BQUNVVEVfTF0gPSAyMjU7Ci0JCXZhbHVlc1tJZHMuSURfQUFDVVRFX1VdID0gMTkzOwotCQl2YWx1ZXNbSWRzLklEX0FDSVJDX0xdID0gMjI2OwotCQl2YWx1ZXNbSWRzLklEX0FDSVJDX1VdID0gMTk0OwotCQl2YWx1ZXNbSWRzLklEX0FDVVRFXSA9IDE4MDsKLQkJdmFsdWVzW0lkcy5JRF9BRUxJR19MXSA9IDIzMDsKLQkJdmFsdWVzW0lkcy5JRF9BRUxJR19VXSA9IDE5ODsKLQkJdmFsdWVzW0lkcy5JRF9BR1JBVkVfTF0gPSAyMjQ7Ci0JCXZhbHVlc1tJZHMuSURfQUdSQVZFX1VdID0gMTkyOwotCQl2YWx1ZXNbSWRzLklEX0FMRUZTWU1dID0gODUwMTsKLQkJdmFsdWVzW0lkcy5JRF9BTFBIQV9MXSA9IDk0NTsKLQkJdmFsdWVzW0lkcy5JRF9BTFBIQV9VXSA9IDkxMzsKLQkJdmFsdWVzW0lkcy5JRF9BTVBdID0gMzg7Ci0JCXZhbHVlc1tJZHMuSURfQU5EXSA9IDg3NDM7Ci0JCXZhbHVlc1tJZHMuSURfQU5HXSA9IDg3MzY7Ci0JCXZhbHVlc1tJZHMuSURfQVJJTkdfTF0gPSAyMjk7Ci0JCXZhbHVlc1tJZHMuSURfQVJJTkdfVV0gPSAxOTc7Ci0JCXZhbHVlc1tJZHMuSURfQVNZTVBdID0gODc3NjsKLQkJdmFsdWVzW0lkcy5JRF9BVElMREVfTF0gPSAyMjc7Ci0JCXZhbHVlc1tJZHMuSURfQVRJTERFX1VdID0gMTk1OwotCQl2YWx1ZXNbSWRzLklEX0FVTUxfTF0gPSAyMjg7Ci0JCXZhbHVlc1tJZHMuSURfQVVNTF9VXSA9IDE5NjsKLQkJdmFsdWVzW0lkcy5JRF9CRFFVT10gPSA4MjIyOwotCQl2YWx1ZXNbSWRzLklEX0JFVEFfTF0gPSA5NDY7Ci0JCXZhbHVlc1tJZHMuSURfQkVUQV9VXSA9IDkxNDsKLQkJdmFsdWVzW0lkcy5JRF9CUlZCQVJdID0gMTY2OwotCQl2YWx1ZXNbSWRzLklEX0JVTExdID0gODIyNjsKLQkJdmFsdWVzW0lkcy5JRF9DQVBdID0gODc0NTsKLQkJdmFsdWVzW0lkcy5JRF9DQ0VESUxfTF0gPSAyMzE7Ci0JCXZhbHVlc1tJZHMuSURfQ0NFRElMX1VdID0gMTk5OwotCQl2YWx1ZXNbSWRzLklEX0NFRElMXSA9IDE4NDsKLQkJdmFsdWVzW0lkcy5JRF9DRU5UXSA9IDE2MjsKLQkJdmFsdWVzW0lkcy5JRF9DSElfTF0gPSA5Njc7Ci0JCXZhbHVlc1tJZHMuSURfQ0hJX1VdID0gOTM1OwotCQl2YWx1ZXNbSWRzLklEX0NJUkNdID0gNzEwOwotCQl2YWx1ZXNbSWRzLklEX0NMVUJTXSA9IDk4Mjc7Ci0JCXZhbHVlc1tJZHMuSURfQ09OR10gPSA4NzczOwotCQl2YWx1ZXNbSWRzLklEX0NPUFldID0gMTY5OwotCQl2YWx1ZXNbSWRzLklEX0NSQVJSXSA9IDg2Mjk7Ci0JCXZhbHVlc1tJZHMuSURfQ1VQXSA9IDg3NDY7Ci0JCXZhbHVlc1tJZHMuSURfQ1VSUkVOXSA9IDE2NDsKLQkJdmFsdWVzW0lkcy5JRF9EQUdHRVJfTF0gPSA4MjI0OwotCQl2YWx1ZXNbSWRzLklEX0RBR0dFUl9VXSA9IDgyMjU7Ci0JCXZhbHVlc1tJZHMuSURfREFSUl9MXSA9IDg1OTU7Ci0JCXZhbHVlc1tJZHMuSURfREFSUl9VXSA9IDg2NTk7Ci0JCXZhbHVlc1tJZHMuSURfREVHXSA9IDE3NjsKLQkJdmFsdWVzW0lkcy5JRF9ERUxUQV9MXSA9IDk0ODsKLQkJdmFsdWVzW0lkcy5JRF9ERUxUQV9VXSA9IDkxNjsKLQkJdmFsdWVzW0lkcy5JRF9ESUFNU10gPSA5ODMwOwotCQl2YWx1ZXNbSWRzLklEX0RJVklERV0gPSAyNDc7Ci0JCXZhbHVlc1tJZHMuSURfRUFDVVRFX0xdID0gMjMzOwotCQl2YWx1ZXNbSWRzLklEX0VBQ1VURV9VXSA9IDIwMTsKLQkJdmFsdWVzW0lkcy5JRF9FQ0lSQ19MXSA9IDIzNDsKLQkJdmFsdWVzW0lkcy5JRF9FQ0lSQ19VXSA9IDIwMjsKLQkJdmFsdWVzW0lkcy5JRF9FR1JBVkVfTF0gPSAyMzI7Ci0JCXZhbHVlc1tJZHMuSURfRUdSQVZFX1VdID0gMjAwOwotCQl2YWx1ZXNbSWRzLklEX0VNUFRZXSA9IDg3MDk7Ci0JCXZhbHVlc1tJZHMuSURfRU1TUF0gPSA4MTk1OwotCQl2YWx1ZXNbSWRzLklEX0VOU1BdID0gODE5NDsKLQkJdmFsdWVzW0lkcy5JRF9FUFNJTE9OX0xdID0gOTQ5OwotCQl2YWx1ZXNbSWRzLklEX0VQU0lMT05fVV0gPSA5MTc7Ci0JCXZhbHVlc1tJZHMuSURfRVFVSVZdID0gODgwMTsKLQkJdmFsdWVzW0lkcy5JRF9FVEFfTF0gPSA5NTE7Ci0JCXZhbHVlc1tJZHMuSURfRVRBX1VdID0gOTE5OwotCQl2YWx1ZXNbSWRzLklEX0VUSF9MXSA9IDI0MDsKLQkJdmFsdWVzW0lkcy5JRF9FVEhfVV0gPSAyMDg7Ci0JCXZhbHVlc1tJZHMuSURfRVVNTF9MXSA9IDIzNTsKLQkJdmFsdWVzW0lkcy5JRF9FVU1MX1VdID0gMjAzOwotCQl2YWx1ZXNbSWRzLklEX0VVUk9dID0gODM2NDsKLQkJdmFsdWVzW0lkcy5JRF9FWElTVF0gPSA4NzA3OwotCQl2YWx1ZXNbSWRzLklEX0ZOT0ZdID0gNDAyOwotCQl2YWx1ZXNbSWRzLklEX0ZPUkFMTF0gPSA4NzA0OwotCQl2YWx1ZXNbSWRzLklEX0ZSQUMxMl0gPSAxODk7Ci0JCXZhbHVlc1tJZHMuSURfRlJBQzE0XSA9IDE4ODsKLQkJdmFsdWVzW0lkcy5JRF9GUkFDMzRdID0gMTkwOwotCQl2YWx1ZXNbSWRzLklEX0ZSQVNMXSA9IDgyNjA7Ci0JCXZhbHVlc1tJZHMuSURfR0FNTUFfTF0gPSA5NDc7Ci0JCXZhbHVlc1tJZHMuSURfR0FNTUFfVV0gPSA5MTU7Ci0JCXZhbHVlc1tJZHMuSURfR0VdID0gODgwNTsKLQkJdmFsdWVzW0lkcy5JRF9HVF0gPSA2MjsKLQkJdmFsdWVzW0lkcy5JRF9IQVJSX0xdID0gODU5NjsKLQkJdmFsdWVzW0lkcy5JRF9IQVJSX1VdID0gODY2MDsKLQkJdmFsdWVzW0lkcy5JRF9IRUFSVFNdID0gOTgyOTsKLQkJdmFsdWVzW0lkcy5JRF9IRUxMSVBdID0gODIzMDsKLQkJdmFsdWVzW0lkcy5JRF9JQUNVVEVfTF0gPSAyMzc7Ci0JCXZhbHVlc1tJZHMuSURfSUFDVVRFX1VdID0gMjA1OwotCQl2YWx1ZXNbSWRzLklEX0lDSVJDX0xdID0gMjM4OwotCQl2YWx1ZXNbSWRzLklEX0lDSVJDX1VdID0gMjA2OwotCQl2YWx1ZXNbSWRzLklEX0lFWENMXSA9IDE2MTsKLQkJdmFsdWVzW0lkcy5JRF9JR1JBVkVfTF0gPSAyMzY7Ci0JCXZhbHVlc1tJZHMuSURfSUdSQVZFX1VdID0gMjA0OwotCQl2YWx1ZXNbSWRzLklEX0lNQUdFXSA9IDg0NjU7Ci0JCXZhbHVlc1tJZHMuSURfSU5GSU5dID0gODczNDsKLQkJdmFsdWVzW0lkcy5JRF9JTlRdID0gODc0NzsKLQkJdmFsdWVzW0lkcy5JRF9JT1RBX0xdID0gOTUzOwotCQl2YWx1ZXNbSWRzLklEX0lPVEFfVV0gPSA5MjE7Ci0JCXZhbHVlc1tJZHMuSURfSVFVRVNUXSA9IDE5MTsKLQkJdmFsdWVzW0lkcy5JRF9JU0lOXSA9IDg3MTI7Ci0JCXZhbHVlc1tJZHMuSURfSVVNTF9MXSA9IDIzOTsKLQkJdmFsdWVzW0lkcy5JRF9JVU1MX1VdID0gMjA3OwotCQl2YWx1ZXNbSWRzLklEX0tBUFBBX0xdID0gOTU0OwotCQl2YWx1ZXNbSWRzLklEX0tBUFBBX1VdID0gOTIyOwotCQl2YWx1ZXNbSWRzLklEX0xBTUJEQV9MXSA9IDk1NTsKLQkJdmFsdWVzW0lkcy5JRF9MQU1CREFfVV0gPSA5MjM7Ci0JCXZhbHVlc1tJZHMuSURfTEFOR10gPSA5MDAxOwotCQl2YWx1ZXNbSWRzLklEX0xBUVVPXSA9IDE3MTsKLQkJdmFsdWVzW0lkcy5JRF9MQVJSX0xdID0gODU5MjsKLQkJdmFsdWVzW0lkcy5JRF9MQVJSX1VdID0gODY1NjsKLQkJdmFsdWVzW0lkcy5JRF9MQ0VJTF0gPSA4OTY4OwotCQl2YWx1ZXNbSWRzLklEX0xEUVVPXSA9IDgyMjA7Ci0JCXZhbHVlc1tJZHMuSURfTEVdID0gODgwNDsKLQkJdmFsdWVzW0lkcy5JRF9MRkxPT1JdID0gODk3MDsKLQkJdmFsdWVzW0lkcy5JRF9MT1dBU1RdID0gODcyNzsKLQkJdmFsdWVzW0lkcy5JRF9MT1pdID0gOTY3NDsKLQkJdmFsdWVzW0lkcy5JRF9MUk1dID0gODIwNjsKLQkJdmFsdWVzW0lkcy5JRF9MU0FRVU9dID0gODI0OTsKLQkJdmFsdWVzW0lkcy5JRF9MU1FVT10gPSA4MjE2OwotCQl2YWx1ZXNbSWRzLklEX0xUXSA9IDYwOwotCQl2YWx1ZXNbSWRzLklEX01BQ1JdID0gMTc1OwotCQl2YWx1ZXNbSWRzLklEX01EQVNIXSA9IDgyMTI7Ci0JCXZhbHVlc1tJZHMuSURfTUlDUk9dID0gMTgxOwotCQl2YWx1ZXNbSWRzLklEX01JRERPVF0gPSAxODM7Ci0JCXZhbHVlc1tJZHMuSURfTUlOVVNdID0gODcyMjsKLQkJdmFsdWVzW0lkcy5JRF9NVV9MXSA9IDk1NjsKLQkJdmFsdWVzW0lkcy5JRF9NVV9VXSA9IDkyNDsKLQkJdmFsdWVzW0lkcy5JRF9OQUJMQV0gPSA4NzExOwotCQl2YWx1ZXNbSWRzLklEX05CU1BdID0gMTYwOwotCQl2YWx1ZXNbSWRzLklEX05EQVNIXSA9IDgyMTE7Ci0JCXZhbHVlc1tJZHMuSURfTkVdID0gODgwMDsKLQkJdmFsdWVzW0lkcy5JRF9OSV0gPSA4NzE1OwotCQl2YWx1ZXNbSWRzLklEX05PVF0gPSAxNzI7Ci0JCXZhbHVlc1tJZHMuSURfTk9USU5dID0gODcxMzsKLQkJdmFsdWVzW0lkcy5JRF9OU1VCXSA9IDg4MzY7Ci0JCXZhbHVlc1tJZHMuSURfTlRJTERFX0xdID0gMjQxOwotCQl2YWx1ZXNbSWRzLklEX05USUxERV9VXSA9IDIwOTsKLQkJdmFsdWVzW0lkcy5JRF9OVV9MXSA9IDk1NzsKLQkJdmFsdWVzW0lkcy5JRF9OVV9VXSA9IDkyNTsKLQkJdmFsdWVzW0lkcy5JRF9PQUNVVEVfTF0gPSAyNDM7Ci0JCXZhbHVlc1tJZHMuSURfT0FDVVRFX1VdID0gMjExOwotCQl2YWx1ZXNbSWRzLklEX09DSVJDX0xdID0gMjQ0OwotCQl2YWx1ZXNbSWRzLklEX09DSVJDX1VdID0gMjEyOwotCQl2YWx1ZXNbSWRzLklEX09FTElHX0xdID0gMzM5OwotCQl2YWx1ZXNbSWRzLklEX09FTElHX1VdID0gMzM4OwotCQl2YWx1ZXNbSWRzLklEX09HUkFWRV9MXSA9IDI0MjsKLQkJdmFsdWVzW0lkcy5JRF9PR1JBVkVfVV0gPSAyMTA7Ci0JCXZhbHVlc1tJZHMuSURfT0xJTkVdID0gODI1NDsKLQkJdmFsdWVzW0lkcy5JRF9PTUVHQV9MXSA9IDk2OTsKLQkJdmFsdWVzW0lkcy5JRF9PTUVHQV9VXSA9IDkzNzsKLQkJdmFsdWVzW0lkcy5JRF9PTUlDUk9OX0xdID0gOTU5OwotCQl2YWx1ZXNbSWRzLklEX09NSUNST05fVV0gPSA5Mjc7Ci0JCXZhbHVlc1tJZHMuSURfT1BMVVNdID0gODg1MzsKLQkJdmFsdWVzW0lkcy5JRF9PUl0gPSA4NzQ0OwotCQl2YWx1ZXNbSWRzLklEX09SREZdID0gMTcwOwotCQl2YWx1ZXNbSWRzLklEX09SRE1dID0gMTg2OwotCQl2YWx1ZXNbSWRzLklEX09TTEFTSF9MXSA9IDI0ODsKLQkJdmFsdWVzW0lkcy5JRF9PU0xBU0hfVV0gPSAyMTY7Ci0JCXZhbHVlc1tJZHMuSURfT1RJTERFX0xdID0gMjQ1OwotCQl2YWx1ZXNbSWRzLklEX09USUxERV9VXSA9IDIxMzsKLQkJdmFsdWVzW0lkcy5JRF9PVElNRVNdID0gODg1NTsKLQkJdmFsdWVzW0lkcy5JRF9PVU1MX0xdID0gMjQ2OwotCQl2YWx1ZXNbSWRzLklEX09VTUxfVV0gPSAyMTQ7Ci0JCXZhbHVlc1tJZHMuSURfUEFSQV0gPSAxODI7Ci0JCXZhbHVlc1tJZHMuSURfUEFSVF0gPSA4NzA2OwotCQl2YWx1ZXNbSWRzLklEX1BFUk1JTF0gPSA4MjQwOwotCQl2YWx1ZXNbSWRzLklEX1BFUlBdID0gODg2OTsKLQkJdmFsdWVzW0lkcy5JRF9QSElfTF0gPSA5NjY7Ci0JCXZhbHVlc1tJZHMuSURfUEhJX1VdID0gOTM0OwotCQl2YWx1ZXNbSWRzLklEX1BJVl0gPSA5ODI7Ci0JCXZhbHVlc1tJZHMuSURfUElfTF0gPSA5NjA7Ci0JCXZhbHVlc1tJZHMuSURfUElfVV0gPSA5Mjg7Ci0JCXZhbHVlc1tJZHMuSURfUExVU01OXSA9IDE3NzsKLQkJdmFsdWVzW0lkcy5JRF9QT1VORF0gPSAxNjM7Ci0JCXZhbHVlc1tJZHMuSURfUFJJTUVfTF0gPSA4MjQyOwotCQl2YWx1ZXNbSWRzLklEX1BSSU1FX1VdID0gODI0MzsKLQkJdmFsdWVzW0lkcy5JRF9QUk9EXSA9IDg3MTk7Ci0JCXZhbHVlc1tJZHMuSURfUFJPUF0gPSA4NzMzOwotCQl2YWx1ZXNbSWRzLklEX1BTSV9MXSA9IDk2ODsKLQkJdmFsdWVzW0lkcy5JRF9QU0lfVV0gPSA5MzY7Ci0JCXZhbHVlc1tJZHMuSURfUVVPVF0gPSAzNDsKLQkJdmFsdWVzW0lkcy5JRF9SQURJQ10gPSA4NzMwOwotCQl2YWx1ZXNbSWRzLklEX1JBTkddID0gOTAwMjsKLQkJdmFsdWVzW0lkcy5JRF9SQVFVT10gPSAxODc7Ci0JCXZhbHVlc1tJZHMuSURfUkFSUl9MXSA9IDg1OTQ7Ci0JCXZhbHVlc1tJZHMuSURfUkFSUl9VXSA9IDg2NTg7Ci0JCXZhbHVlc1tJZHMuSURfUkNFSUxdID0gODk2OTsKLQkJdmFsdWVzW0lkcy5JRF9SRFFVT10gPSA4MjIxOwotCQl2YWx1ZXNbSWRzLklEX1JFQUxdID0gODQ3NjsKLQkJdmFsdWVzW0lkcy5JRF9SRUddID0gMTc0OwotCQl2YWx1ZXNbSWRzLklEX1JGTE9PUl0gPSA4OTcxOwotCQl2YWx1ZXNbSWRzLklEX1JIT19MXSA9IDk2MTsKLQkJdmFsdWVzW0lkcy5JRF9SSE9fVV0gPSA5Mjk7Ci0JCXZhbHVlc1tJZHMuSURfUkxNXSA9IDgyMDc7Ci0JCXZhbHVlc1tJZHMuSURfUlNBUVVPXSA9IDgyNTA7Ci0JCXZhbHVlc1tJZHMuSURfUlNRVU9dID0gODIxNzsKLQkJdmFsdWVzW0lkcy5JRF9TQlFVT10gPSA4MjE4OwotCQl2YWx1ZXNbSWRzLklEX1NDQVJPTl9MXSA9IDM1MzsKLQkJdmFsdWVzW0lkcy5JRF9TQ0FST05fVV0gPSAzNTI7Ci0JCXZhbHVlc1tJZHMuSURfU0RPVF0gPSA4OTAxOwotCQl2YWx1ZXNbSWRzLklEX1NFQ1RdID0gMTY3OwotCQl2YWx1ZXNbSWRzLklEX1NIWV0gPSAxNzM7Ci0JCXZhbHVlc1tJZHMuSURfU0lHTUFGXSA9IDk2MjsKLQkJdmFsdWVzW0lkcy5JRF9TSUdNQV9MXSA9IDk2MzsKLQkJdmFsdWVzW0lkcy5JRF9TSUdNQV9VXSA9IDkzMTsKLQkJdmFsdWVzW0lkcy5JRF9TSU1dID0gODc2NDsKLQkJdmFsdWVzW0lkcy5JRF9TUEFERVNdID0gOTgyNDsKLQkJdmFsdWVzW0lkcy5JRF9TVUJdID0gODgzNDsKLQkJdmFsdWVzW0lkcy5JRF9TVUJFXSA9IDg4Mzg7Ci0JCXZhbHVlc1tJZHMuSURfU1VNXSA9IDg3MjE7Ci0JCXZhbHVlc1tJZHMuSURfU1VQXSA9IDg4MzU7Ci0JCXZhbHVlc1tJZHMuSURfU1VQMV0gPSAxODU7Ci0JCXZhbHVlc1tJZHMuSURfU1VQMl0gPSAxNzg7Ci0JCXZhbHVlc1tJZHMuSURfU1VQM10gPSAxNzk7Ci0JCXZhbHVlc1tJZHMuSURfU1VQRV0gPSA4ODM5OwotCQl2YWx1ZXNbSWRzLklEX1NaTElHXSA9IDIyMzsKLQkJdmFsdWVzW0lkcy5JRF9UQVVfTF0gPSA5NjQ7Ci0JCXZhbHVlc1tJZHMuSURfVEFVX1VdID0gOTMyOwotCQl2YWx1ZXNbSWRzLklEX1RIRVJFNF0gPSA4NzU2OwotCQl2YWx1ZXNbSWRzLklEX1RIRVRBU1lNXSA9IDk3NzsKLQkJdmFsdWVzW0lkcy5JRF9USEVUQV9MXSA9IDk1MjsKLQkJdmFsdWVzW0lkcy5JRF9USEVUQV9VXSA9IDkyMDsKLQkJdmFsdWVzW0lkcy5JRF9USElOU1BdID0gODIwMTsKLQkJdmFsdWVzW0lkcy5JRF9USE9STl9MXSA9IDI1NDsKLQkJdmFsdWVzW0lkcy5JRF9USE9STl9VXSA9IDIyMjsKLQkJdmFsdWVzW0lkcy5JRF9USUxERV0gPSA3MzI7Ci0JCXZhbHVlc1tJZHMuSURfVElNRVNdID0gMjE1OwotCQl2YWx1ZXNbSWRzLklEX1RSQURFXSA9IDg0ODI7Ci0JCXZhbHVlc1tJZHMuSURfVUFDVVRFX0xdID0gMjUwOwotCQl2YWx1ZXNbSWRzLklEX1VBQ1VURV9VXSA9IDIxODsKLQkJdmFsdWVzW0lkcy5JRF9VQVJSX0xdID0gODU5MzsKLQkJdmFsdWVzW0lkcy5JRF9VQVJSX1VdID0gODY1NzsKLQkJdmFsdWVzW0lkcy5JRF9VQ0lSQ19MXSA9IDI1MTsKLQkJdmFsdWVzW0lkcy5JRF9VQ0lSQ19VXSA9IDIxOTsKLQkJdmFsdWVzW0lkcy5JRF9VR1JBVkVfTF0gPSAyNDk7Ci0JCXZhbHVlc1tJZHMuSURfVUdSQVZFX1VdID0gMjE3OwotCQl2YWx1ZXNbSWRzLklEX1VNTF0gPSAxNjg7Ci0JCXZhbHVlc1tJZHMuSURfVVBTSUhdID0gOTc4OwotCQl2YWx1ZXNbSWRzLklEX1VQU0lMT05fTF0gPSA5NjU7Ci0JCXZhbHVlc1tJZHMuSURfVVBTSUxPTl9VXSA9IDkzMzsKLQkJdmFsdWVzW0lkcy5JRF9VVU1MX0xdID0gMjUyOwotCQl2YWx1ZXNbSWRzLklEX1VVTUxfVV0gPSAyMjA7Ci0JCXZhbHVlc1tJZHMuSURfV0VJRVJQXSA9IDg0NzI7Ci0JCXZhbHVlc1tJZHMuSURfWElfTF0gPSA5NTg7Ci0JCXZhbHVlc1tJZHMuSURfWElfVV0gPSA5MjY7Ci0JCXZhbHVlc1tJZHMuSURfWUFDVVRFX0xdID0gMjUzOwotCQl2YWx1ZXNbSWRzLklEX1lBQ1VURV9VXSA9IDIyMTsKLQkJdmFsdWVzW0lkcy5JRF9ZRU5dID0gMTY1OwotCQl2YWx1ZXNbSWRzLklEX1lVTUxfTF0gPSAyNTU7Ci0JCXZhbHVlc1tJZHMuSURfWVVNTF9VXSA9IDM3NjsKLQkJdmFsdWVzW0lkcy5JRF9aRVRBX0xdID0gOTUwOwotCQl2YWx1ZXNbSWRzLklEX1pFVEFfVV0gPSA5MTg7Ci0JCXZhbHVlc1tJZHMuSURfWldKXSA9IDgyMDU7Ci0JCXZhbHVlc1tJZHMuSURfWldOSl0gPSA4MjA0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbnRpdHlDb2xsZWN0aW9uKCkgewotCQlzdXBlcihuYW1lcywgU1RSSUNUX0NBU0UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBlbnRpdHkgZGVjbGFyYXRpb24uCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBhdHRyTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIENNTm9kZSBjcmVhdGUoU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJaW50IGlkID0gZ2V0SUQoZW50aXR5TmFtZSk7Ci0JCWlmIChpZCA9PSBJRF9VTktOT1dOKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHZhbHVlID0gU3RyaW5nLnZhbHVlT2YodmFsdWVzW2lkXSk7Ci0JCUhUTUxFbnRpdHlEZWNsSW1wbCBkZWMgPSBuZXcgSFRNTEVudGl0eURlY2xJbXBsKGVudGl0eU5hbWUsIHZhbHVlKTsKLQotCQlyZXR1cm4gZGVjOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSFRNTEF0dHJEZWNsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MQXR0ckRlY2xJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YWIyZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MQXR0ckRlY2xJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBjbGFzcyBvZiB7QGxpbmsgPGNvZGU+SFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uPC9jb2RlPn0gaW50ZXJmYWNlLjxicj4KLSAqLwotY2xhc3MgSFRNTEF0dHJEZWNsSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gewotCi0JcHJpdmF0ZSBIVE1MQ01EYXRhVHlwZUltcGwgdHlwZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgdXNhZ2UgPSAwOwotCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxBdHRyRGVjbEltcGwoU3RyaW5nIGF0dHJOYW1lLCBIVE1MQ01EYXRhVHlwZUltcGwgdmFsdWVUeXBlLCBpbnQgdmFsdWVVc2FnZSkgewotCQlzdXBlcihhdHRyTmFtZSk7Ci0JCXRoaXMudHlwZSA9IHZhbHVlVHlwZTsKLQotCQlzd2l0Y2ggKHZhbHVlVXNhZ2UpIHsKLQkJCWNhc2UgT1BUSU9OQUwgOgotCQkJY2FzZSBSRVFVSVJFRCA6Ci0JCQljYXNlIEZJWEVEIDoKLQkJCWNhc2UgUFJPSElCSVRFRCA6Ci0JCQkJdGhpcy51c2FnZSA9IHZhbHVlVXNhZ2U7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQkvLyBzaG91bGQgd2Fybi4uLgotCQkJCXRoaXMudXNhZ2UgPSBPUFRJT05BTDsgLy8gZmFsbCBiYWNrCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJOYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIENNRGF0YVR5cGUKLQkgKi8KLQlwdWJsaWMgQ01EYXRhVHlwZSBnZXRBdHRyVHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgaW4gc3VwZXJjbGFzcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlpZiAodHlwZS5nZXRJbXBsaWVkVmFsdWVLaW5kKCkgIT0gQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHR5cGUuZ2V0SW1wbGllZFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgaW4gc3VwZXJjbGFzcwotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbnVtQXR0cigpIHsKLQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKEFycmF5cy5hc0xpc3QodHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCkpKTsKLQkJcmV0dXJuIHYuZWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgR1JPVVAsIEVOVElUWV9ERUNMQVJBVElPTi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VXNhZ2UoKSB7Ci0JCXJldHVybiB1c2FnZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gc3VwZXIuc3VwcG9ydHMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKQotCQkJcmV0dXJuIG5ldyBCb29sZWFuKHRydWUpOwotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxDTURhdGFUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MQ01EYXRhVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzNjZmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxDTURhdGFUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0KLQotLyoqCi0gKi8KLWNsYXNzIEhUTUxDTURhdGFUeXBlSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBIVE1MQ01EYXRhVHlwZSB7Ci0KLQlwcml2YXRlIGludCBpbXBsaWVkVmFsdWVLaW5kID0gSU1QTElFRF9WQUxVRV9OT05FOwotCXByaXZhdGUgU3RyaW5nIGltcGxpZWRWYWx1ZSA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10gZW1wdHlBcnJheSA9IG5ldyBTdHJpbmdbMF07Ci0JcHJpdmF0ZSBTdHJpbmdbXSBlbnVtVmFsdWVzID0gZW1wdHlBcnJheTsKLQlwcml2YXRlIFN0cmluZyBpbnN0YW5jZVZhbHVlID0gbnVsbDsKLQotCS8qKgotCSAqIEhUTUxDTURhdGFUeXBlSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBubSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEhUTUxDTURhdGFUeXBlSW1wbChTdHJpbmcgdHlwZU5hbWUpIHsKLQkJc3VwZXIodHlwZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEhUTUxDTURhdGFUeXBlSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBubSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEhUTUxDTURhdGFUeXBlSW1wbChTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN1cGVyKHR5cGVOYW1lKTsKLQkJdGhpcy5pbnN0YW5jZVZhbHVlID0gaW5zdGFuY2VWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUeXBlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBzdWl0YWJsZSBkZWZhdWx0IHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBhbiBpbnN0YW5jZSBvZiB0aGUgZGF0YSB0eXBlIGlzIGNyZWF0ZWQuCi0JICogVGhpcyByZXR1cm5zIG51bGwgb2YgYSBzdWl0YWJsZSBkZWZhdWx0IGlzIG5vdCBhdmFpbGFibGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUluc3RhbmNlVmFsdWUoKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIGdldFR5cGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0JICoKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RW51bWVyYXRlZFZhbHVlcygpIHsKLQkJcmV0dXJuIGVudW1WYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nICAKLQkgKgotCSAqIFJldHVybnMgdGhlIGltcGxpZWQgdmFsdWUgb3IgbnVsbCBpZiBub25lIGV4aXN0cy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEltcGxpZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIGltcGxpZWRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRJbXBsaWVkVmFsdWVLaW5kIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogSU1QTElFRF9WQUxVRV9OT05FLCBJTVBMSUVEX1ZBTFVFX0ZJWEVELCBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQuCi0JICovCi0JcHVibGljIGludCBnZXRJbXBsaWVkVmFsdWVLaW5kKCkgewotCQlyZXR1cm4gaW1wbGllZFZhbHVlS2luZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5EQVRBX1RZUEU7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRFbnVtVmFsdWVzKFN0cmluZ1tdIHZhbHVlcykgewotCQllbnVtVmFsdWVzID0gbmV3IFN0cmluZ1t2YWx1ZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWVudW1WYWx1ZXNbaV0gPSB2YWx1ZXNbaV07Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwYWNrYWdlIHNjb3BlLgotCSAqLwotCXZvaWQgc2V0SW1wbGllZFZhbHVlKGludCBraW5kLCBTdHJpbmcgdmFsdWUpIHsKLQkJc3dpdGNoIChraW5kKSB7Ci0JCQljYXNlIElNUExJRURfVkFMVUVfRklYRUQgOgotCQkJY2FzZSBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQgOgotCQkJCWltcGxpZWRWYWx1ZUtpbmQgPSBraW5kOwotCQkJCWltcGxpZWRWYWx1ZSA9IHZhbHVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJTVBMSUVEX1ZBTFVFX05PTkUgOgotCQkJZGVmYXVsdCA6Ci0JCQkJaW1wbGllZFZhbHVlS2luZCA9IElNUExJRURfVkFMVUVfTk9ORTsKLQkJCQlpbXBsaWVkVmFsdWUgPSBudWxsOyAvLyBtYXliZSBhIG51bGwgc3RyaW5nPwotCQkJCWJyZWFrOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MQ01Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxDTU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI5NGIyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxDTU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0vKioKLSAqIEluIEhUTUwgRG9jdW1lbnRzLCBuYW1lIGFuZCB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUvZWxlbWVudC9lbnRpdHkKLSAqIHNob3VsZCBiZSB0cmVhdGVkIGlnbm9yaW5nIHRoZWlycyBjYXNlLiAgSG93ZXZlciwgaW4gWE1MIGRvY3VtZW50cywKLSAqIHRoZXkgc2hvdWxkIGJlIGRpc3Rpbmd1aXNoZWQgd2l0aCBzZW5zaXRpdmVuZXNzIG9mIHRoZWlyIGNhc2UuCi0gKiBDTU5vZGUgaXMgYmFzaWNhbGx5IGRlc2lnbmVkIHRvIHJlcHJlc2VudCBEVERzIG9yIFNjaGVtYXMgZm9yIFhNTAotICogZG9jdW1lbnRzLiAgU28sIGl0IGRvZXNuJ3QgaGF2ZSBpbnRlcmZhY2VzIHRvIHJldHJpZXZlIHN1Y2ggaW5mb3JtYXRpb24uCi0gKiBIb3dldmVyLCBkZWNsYXJhdGlvbnMgaW4gdGhlIEhUTUwgQ00gc2hvdWxkIHByb3ZpZGUgc3VjaCBpbmZvcm1hdGlvbi4KLSAqIFRoaXMgaW50ZXJtZWRpYXRlIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0byBwcm92aWRlIHdoZXRoZXIgaWdub3JlIGNhc2VzCi0gKiBvciBub3QuPGJyPgotICovCi1pbnRlcmZhY2UgSFRNTENNTm9kZSBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlIHsKLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4sIGlmIGRlY2xhcmF0aW9uIGlzIGZvciBIVE1MIGF0dHJpYnV0ZS9lbGVtZW50L2VudGl0eS4KLQkgKiBPdGhlcndpc2UsIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gc2hvdWxkSWdub3JlQ2FzZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MRWxlbURlY2xJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxFbGVtRGVjbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAwMzUyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxFbGVtRGVjbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTFByb3BlcnR5RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgYWxsIEhlZD8/Pz8gY2xhc3Nlcy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSFRNTEVsZW1EZWNsSW1wbCBleHRlbmRzIENNQ29udGVudEltcGwgaW1wbGVtZW50cyBIVE1MRWxlbWVudERlY2xhcmF0aW9uLCBIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiB7Ci0KLQkvLyBEVEQKLQlwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIGF0dHJpYnV0ZXMgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9FTVBUWTsKLQkvKiogTmV2ZXIgYWNjZXNzIHRoaXMgZmllbGQgZGlyZWN0bHkuICBJbnN0ZWFkLCB1c2UgZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uIG1ldGhvZC4gKi8KLQlwcml2YXRlIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIENNR3JvdXBJbXBsIGluY2x1c2lvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIENNR3JvdXBJbXBsIGV4Y2x1c2lvbiA9IG51bGw7Ci0JLy8gYWR2YW5jZWQgaW5mb3JtYXRpb24KLQlwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXAgcHJvaGliaXRlZEFuY2VzdG9ycyA9IG51bGw7Ci0JcHJvdGVjdGVkIGludCBjb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfTk9ORTsKLQlwcm90ZWN0ZWQgaW50IGZvcm1hdFR5cGUgPSBGT1JNQVRfSFRNTDsKLQlwcm90ZWN0ZWQgaW50IGxheW91dFR5cGUgPSBMQVlPVVRfTk9ORTsKLQlwcm90ZWN0ZWQgaW50IG9taXRUeXBlID0gT01JVF9OT05FOwotCXByb3RlY3RlZCBib29sZWFuIGtlZXBTcGFjZXMgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbmRlbnRDaGlsZCA9IGZhbHNlOwotCXByb3RlY3RlZCBFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIEF0dHJpYnV0ZUNvbGxlY3Rpb24gYXR0cmlidXRlQ29sbGVjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBDTU5hbWVkTm9kZU1hcCBFTVBUWV9NQVAgPSBuZXcgQ01OYW1lZE5vZGVNYXAoKSB7Ci0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJCXJldHVybiBuZXcgSXRlcmF0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJCX0KLQkJCX07Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogSFRNTEVsZW1EZWNsSW1wbCBjb25zdHJ1Y3Rvci4KLQkgKiBJbiB0aGUgSFRNTCBEVEQsIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24gaGFzIG5vIHNwZWNpZmljYXRpb24KLQkgKiBmb3IgaXRzIG9jY3VycmVuY2UuICBPY2N1cnJlbmNlIGlzIHNwZWNpZmVkIGluIGNvbnRlbnQgbW9kZWwsIGxpa2UKLQkgKiA8Y29kZT4oTEkpKzwvY29kZT4uICBUbyBhdm9pZCBjb25mdXNpb24gKGFuZCBjb21wbGV4aXR5KSwKLQkgKiBvY2N1cnJlbmNlIG9mIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24gaXMgYWx3YXlzIDEgKGl0IG1lYW5zLCBtaW4gPSAxIGFuZAotCSAqIG1heCA9IDEpLiAgSW5zdGVhZCwgb2NjdXJyZW5jZSBvZiBDTUdyb3VwIHJlcHJlc2VudHMgYWN0dWFsIG9jY3VycmVuY2UKLQkgKiBvZiB0aGUgY29udGVudC4KLQkgKiA8YnI+Ci0JICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBIVE1MRWxlbURlY2xJbXBsKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgMSwgMSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbiA9IGNvbGxlY3Rpb24uZ2V0QXR0cmlidXRlQ29sbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpOwotCi0JcHJpdmF0ZSBDb21wbGV4VHlwZURlZmluaXRpb24gY3JlYXRlQ29tcGxleFR5cGVEZWZpbml0aW9uKCkgewotCQlpZiAodHlwZURlZmluaXRpb25OYW1lLmVxdWFscyhDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0NEQVRBKSB8fCB0eXBlRGVmaW5pdGlvbk5hbWUuZXF1YWxzKENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRU1QVFkpIHx8IHR5cGVEZWZpbml0aW9uTmFtZS5lcXVhbHMoQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9QQ0RBVEEpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSBmYWN0b3J5ID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQlpZiAoZmFjdG9yeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGZhdGFsIGVycm9yLgotCi0JCUNvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWYgPSBmYWN0b3J5LmNyZWF0ZVR5cGVEZWZpbml0aW9uKHR5cGVEZWZpbml0aW9uTmFtZSwgZWxlbWVudENvbGxlY3Rpb24pOwotCQlyZXR1cm4gZGVmOwotCX0KLQotCS8qKgotCSAqIEdldCBhbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCk7Ci0JCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOyAvLyBmYWlsIHRvIGNyZWF0ZQotCQl9Ci0KLQkJQ01Ob2RlIGNtbm9kZSA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJaWYgKGNtbm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAoSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbW5vZGU7IC8vIGFscmVhZHkgZXhpc3RzLgotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQljcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKTsgLy8gbGF6eSBldmFsLgotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYW4gaW5zdGFuY2Ugb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICovCi0JcHJpdmF0ZSBDb21wbGV4VHlwZURlZmluaXRpb24gZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uKCkgewotCQlpZiAodHlwZURlZmluaXRpb24gPT0gbnVsbCkKLQkJCXR5cGVEZWZpbml0aW9uID0gY3JlYXRlQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0JCXJldHVybiB0eXBlRGVmaW5pdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50Ljxicj4KLQkgKiBFbGVtZW50IGRlY2xhcmF0aW9ucyB3aGljaCB0eXBlIGlzIEVNUFRZIG9yIENEQVRBIChtYXliZSBQQ0RBVEEpCi0JICogPHN0cm9uZz5NVVNUPC9zdHJvbmc+IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCBhbHdheXMgcmV0dXJuIG51bGwuCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFsd2F5cyB0cmllcyB0byBjcmVhdGUgYSBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbgotCSAqIGluc3RhbmNlIGFuZCBhY2Nlc3MgdG8gaXQuCi0JICogPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOyAvLyBsYXp5IGV2YWwuCi0JCXJldHVybiAoZGVmICE9IG51bGwpID8gZGVmLmdldENvbnRlbnQoKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudCB0eXBlLjxicj4KLQkgKiBFbGVtZW50IGRlY2xhcmF0aW9ucyB3aGljaCB0eXBlIGlzIEVNUFRZIG9yIENEQVRBIChtYXliZSBQQ0RBVEEpCi0JICogPHN0cm9uZz5NVVNUPC9zdHJvbmc+IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgdHlwZS4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHRyaWVzIHRvIGNyZWF0ZSBhIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uCi0JICogaW5zdGFuY2UgYW5kIGFjY2VzcyB0byBpdC4KLQkgKiA8YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOyAvLyBsYXp5IGV2YWwuCi0JCXJldHVybiAoZGVmICE9IG51bGwpID8gZGVmLmdldENvbnRlbnRUeXBlKCkgOiBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24jZ2V0Q29ycmVjdGlvblR5cGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldENvcnJlY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gY29ycmVjdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogSFRNTCBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbnkgZGF0YSB0eXBlLiAgU28sIHRoaXMgbWV0aG9kIGFsd2F5cwotCSAqIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTURhdGFUeXBlIGdldERhdGFUeXBlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogQWxtb3N0IGVsZW1lbnRzIGRvbid0IGhhdmUgYSBleGNsdXNpb24uCi0JICogT25seSBjbGFzc2VzIHRob3NlIGhhdmUgZXhjbHVzaW9uIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBmb3JtYXQgdHlwZSBpcyA8Y29kZT5GT1JNQVRfSFRNTDwvY29kZT4uPGJyPgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Rm9ybWF0VHlwZSgpIHsKLQkJcmV0dXJuIGZvcm1hdFR5cGU7Ci0JfQotCi0JLyoqCi0JICogSW5jbHVzaW9uLgotCSAqIEFsbW9zdCBlbGVtZW50cyBkb24ndCBoYXZlIGEgaW5jbHVzaW9uLgotCSAqIE9ubHkgY2xhc3NlcyB0aG9zZSBoYXZlIGluY2x1c2lvbiBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRJbmNsdXNpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGF5b3V0VHlwZSgpIHsKLQkJcmV0dXJuIGxheW91dFR5cGU7Ci0JfQotCi0JLyoqCi0JICogTGluZSBicmVhayBoaW50IGlzIHN0cm9uZ2x5IHJlbGF0ZWQgdG8gbGF5b3V0IHR5cGUuCi0JICogSW5kZWVkLCBpbiB0aGUgQysrRE9NLCBpdCBpcyBkZXRlcm1pbmVkIGZyb20gbGF5b3V0IHR5cGUgb25seS4KLQkgKiBTbywgdGhpcyBpbXBsZW1lbnRhdGlvbiwgYXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIGFsbCBkZWNsYXJhdGlvbnMsCi0JICogYWxzbyBkZXRlcm1pbmVzIGZyb20gbGF5b3V0IHR5cGUgb25seS48YnI+Ci0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVCcmVha0hpbnQoKSB7Ci0JCXN3aXRjaCAoZ2V0TGF5b3V0VHlwZSgpKSB7Ci0JCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0JMT0NLIDoKLQkJCQlyZXR1cm4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19CRUZPUkVfU1RBUlRfQU5EX0FGVEVSX0VORDsKLQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfQlJFQUsgOgotCQkJCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0FGVEVSX1NUQVJUOwotCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU4gOgotCQkJCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfTk9ORTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vIEhUTUwgZWxlbWVudCBoYXMgbG9jYWwgZWxlbWVudHMuICBTbywgdGhpcyBtZXRob2QgYWx3YXlzCi0JICogcmV0dXJucyBhbiBlbXB0eSBtYXAuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKSB7Ci0JCXJldHVybiBFTVBUWV9NQVA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9taXRUeXBlKCkgewotCQlyZXR1cm4gb21pdFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCXJldHVybiBFTVBUWV9NQVA7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5DT05URU5UX0hJTlQpKSB7Ci0JCQlDb21wbGV4VHlwZURlZmluaXRpb24gZGVmID0gZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0JCQlyZXR1cm4gKGRlZiAhPSBudWxsKTsKLQkJfQotCQllbHNlIHsKLQkJCVByb3BlcnR5UHJvdmlkZXIgcHAgPSBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5nZXRQcm92aWRlcihwcm9wZXJ0eU5hbWUpOwotCQkJaWYgKHBwID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIHBwLnN1cHBvcnRzKHRoaXMpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLkNPTlRFTlRfSElOVCkpIHsKLQkJCUNvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWYgPSBnZXRDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLQkJCXJldHVybiAoZGVmICE9IG51bGwpID8gZGVmLmdldFByaW1hcnlDYW5kaWRhdGUoKSA6IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQcm9wZXJ0eVByb3ZpZGVyIHBwID0gUHJvcGVydHlQcm92aWRlckZhY3RvcnkuZ2V0UHJvdmlkZXIocHJvcGVydHlOYW1lKTsKLQkJCWlmIChwcCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIHBwLmdldCh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBlbGVtZW50IG5hbWVzIHdoaWNoIHRlcm1pbmF0ZXMgdGhpcyBlbGVtZW50Ljxicj4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRydWUgd2hlbiB0aGUgZWxlbWVudCBpcyBhIEpTUCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSlNQKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSW4gc29tZSBlbGVtZW50cywgc3VjaCBhcyBBUFBMRVQsIGEgc291cmNlIGdlbmVyYXRvciBzaG91bGQgaW5kZW50IGNoaWxkCi0JICogZWxlbWVudHMgdGhhdCB0aGVpciBwYXJlbnRzLiAgVGhhdCBpcywgYSBzb3VyY2UgZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZQotCSAqIHNvdXJjZSAgb2YgQVBQTEVUIGFuZCBQQVJBTVMgbGlrZSB0aGlzOgotCSAqIDxQUkU+Ci0JICogICAmbHQ7QVBQTEVUIC4uLiZndDsKLQkgKiAgICAgJmx0O1BBUkFNIC4uLiAmZ3Q7Ci0JICogICAgICZsdDtQQVJBTSAuLi4gJmd0OwotCSAqICAgJmx0Oy9BUFBMRVQmZ3Q7Ci0JICogPFBSRT4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRJbmRlbnRDaGlsZFNvdXJjZSgpIHsKLQkJcmV0dXJuIGluZGVudENoaWxkOwotCX0KLQotCS8qKgotCSAqIE1vc3Qgb2YgZWxlbWVudHMgY2FuIGNvbXBhY3Qgc3BhY2VzIGluIHRoZWlyIGNoaWxkIHRleHQgbm9kZXMuCi0JICogU29tZSBzcGVjaWFsIGVsZW1lbnRzIHNob3VsZCBrZWVwIHRoZW0gaW4gdGhlaXIgc291cmNlLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZEtlZXBTcGFjZXMoKSB7Ci0JCXJldHVybiBrZWVwU3BhY2VzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFRlcm1pbmF0ZUF0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gbmV4dEVsZW1lbnQpIHsKLQkJSXRlcmF0b3IgaSA9IGdldFRlcm1pbmF0b3JzKCk7Ci0JCWlmIChpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBuZXh0TmFtZSA9IG5leHRFbGVtZW50LmdldEVsZW1lbnROYW1lKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJaWYgKG5leHROYW1lLmVxdWFscyhpLm5leHQoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSFRNTEVudGl0eURlY2xJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxFbnRpdHlEZWNsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTQ3YjAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSFRNTEVudGl0eURlY2xJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MRW50aXR5RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0KLQotLyoqCi0gKi8KLWNsYXNzIEhUTUxFbnRpdHlEZWNsSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBIVE1MRW50aXR5RGVjbGFyYXRpb24gewotCi0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlID0gbnVsbDsKLQotCS8qKgotCSAqIENNRW50aXR5RGVjbEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gZW50aXR5TmFtZSBqYXZhLmxhbmcuU3RyaW5nOyBFbnRpdHkgbmFtZS4KLQkgKiBAcGFyYW0gZW50aXR5VmFsdWUgamF2YS5sYW5nLlN0cmluZzsgVmFsdWUgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBIVE1MRW50aXR5RGVjbEltcGwoU3RyaW5nIGVudGl0eU5hbWUsIFN0cmluZyBlbnRpdHlWYWx1ZSkgewotCQlzdXBlcihlbnRpdHlOYW1lKTsKLQkJdmFsdWUgPSBlbnRpdHlWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IENNTm9kZSB0eXBlLjxicj4KLQkgKiBAcmV0dXJuIGludDsgQWx3YXlzIHJldHVybiBFTlRJVFlfREVDTEFSQVRJT04uCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5FTlRJVFlfREVDTEFSQVRJT047Ci0JfQotCi0JLyoqCi0JICogZ2V0VmFsdWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBzdXBlci5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEVudGl0aWVzIGluIEhUTUwgZG9jdW1lbnRzIGFyZSBhbHdheXMgdHJlYXRlZCB3aXRoIGlnbm9yaW5nIGNhc2VzLgotCSAqIEJlY2F1c2Ugbm8gc3BlY2lhbCBlbnRpdGllcyBhcmUgZGVmaW5lZCBpbiBKU1AgMS4wLCB0aGlzIG1ldGhvZAotCSAqIGNhbiBhbHdheXMgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ljxicj4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKQotCQkJcmV0dXJuIG5ldyBCb29sZWFuKHRydWUpOwotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjAzYzM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBBLgotICovCi1maW5hbCBjbGFzcyBIZWRBIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRBKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQSwgY29sbGVjdGlvbik7Ci0JCS8vIENPUlJFQ1RfRU1QVFkgLSBHUk9VUF9DT01QQUNUCi0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKGNoYXJzZXQgJUNoYXJzZXQ7ICNJTVBMSUVEKQotCSAqICh0eXBlICVDb250ZW50VHlwZTsgI0lNUExJRUQpCi0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKGhyZWYgJVVSSTsgI0lNUExJRUQpCi0JICogKGhyZWZsYW5nICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEKQotCSAqICh0YXJnZXQgJUZyYW1lVGFyZ2V0OyAjSU1QTElFRCkKLQkgKiAocmVsICVMaW5rVHlwZXM7ICNJTVBMSUVEKQotCSAqIChyZXYgJUxpbmtUeXBlczsgI0lNUExJRUQpCi0JICogKGFjY2Vzc2tleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkgKiAoZGlyZWN0a2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCSAqIChzaGFwZSAlU2hhcGU7IHJlY3QpCi0JICogKGNvb3JkcyAlQ29vcmRzOyAjSU1QTElFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRix9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+QTwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+QTwvY29kZT4gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJQ01Ob2RlIGEgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQSk7Ci0JCWlmIChhICE9IG51bGwpCi0JCQlleGNsdXNpb24uYXBwZW5kQ2hpbGQoYSk7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkEsfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRBRERSRVNTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEFERFJFU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhNzJmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEFERFJFU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIEFERFJFU1MuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEFERFJFU1MgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRBRERSRVNTKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQUREUkVTUywgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfQUREUkVTUzsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQkFTRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCQVNFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzM2FiZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCQVNFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBCQVNFLgotICovCi1maW5hbCBjbGFzcyBIZWRCQVNFIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEJBU0UoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFLCBjb2xsZWN0aW9uKTsKLQkJLy8gTEFZT1VUX0hJRERFTi4KLQkJLy8gQmVjYXVzZSwgQkFTRSBpcyBHUk9VUF9ISURERU4gaW4gdGhlIEMrK0RPTS9EVERQYXJzZXIuY3BwLgotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBCQVNFLgotCSAqIChocmVmICVVUkk7ICNJTVBMSUVEKQotCSAqICh0YXJnZXQgJUZyYW1lVGFyZ2V0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9IUkVGLH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQkxPQ0tRVU9URS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCTE9DS1FVT1RFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZWY5N2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCTE9DS1FVT1RFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBCTE9DS1FVT1RFLgotICovCi1maW5hbCBjbGFzcyBIZWRCTE9DS1FVT1RFIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQkxPQ0tRVU9URShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJMT0NLUVVPVEUsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChjaXRlICVVUkk7ICNJTVBMSUVEKSAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQk9EWS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCT0RZLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ODNjNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCT0RZLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogQk9EWS4KLSAqLwotZmluYWwgY2xhc3MgSGVkQk9EWSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRCwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWSwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQk9EWShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFksIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfQk9USDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogJWJvZHljb2xvcnM7Ci0JICogKG9ubG9hZCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob251bmxvYWQgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKGJhY2tncm91bmQgJVVSSTsgI0lNUExJRUQpCi0JICogKG1hcmdpbndpZHRoICVQaXhlbHM7ICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqIChtYXJnaW5oZWlnaHQgJVBpeGVsczsgI0lNUExJRUQpIC4uIEQyMDU1MTQKLQkgKiAodG9wbWFyZ2luLCBDREFUQSwgI0lNUExJRUQpIC4uLi4uLiBEMjA1NTE0Ci0JICogKGJvdHRvbW1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqIChsZWZ0bWFyZ2luLCBDREFUQSwgI0lNUExJRUQpIC4uLi4uIEQyMDU1MTQKLQkgKiAocmlnaHRtYXJnaW4sIENEQVRBLCAjSU1QTElFRCkgLi4uLiBEMjA1NTE0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVib2R5Y29sb3JzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEJvZHljb2xvcnMoYXR0cmlidXRlcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBCT0RZIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWMxNmY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQlIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLQotCi0KLS8qKgotICogQlIuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEJSIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEJSKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlIsIGNvbGxlY3Rpb24pOwotCQkvLyBMQVlPVVRfQlJFQUsuCi0JCS8vIEJlY2F1c2UsIEJSIGlzIEdST1VQX0JSRUFLIGluIHRoZSBDKytET00vRFREUGFyc2VyLmNwcC4KLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CUkVBSzsKLQl9Ci0KLQkvKioKLQkgKiBCUi4KLQkgKiAlY29yZWF0dHJzOwotCSAqIChjbGVhciAobGVmdCB8IGFsbCB8IHJpZ2h0IHwgbm9uZSkgbm9uZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVjb3JlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQkJLy8gY2xlYXIKLQkJSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9uKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DTEVBUik7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQ0xFQVIsIGF0dHIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQ0VOVEVSLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZENFTlRFUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjkzOTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQ0VOVEVSLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBDRU5URVIuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZENFTlRFUiBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZENFTlRFUihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNFTlRFUiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRERC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRERC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDcwZTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkREQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBERC4KLSAqLwotZmluYWwgY2xhc3MgSGVkREQgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRULCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkREQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERCwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0VORF9ERUZBVUxUOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBERCBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRElWLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZERJVi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTJkNzk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRElWLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBESVYuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZERJViBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZERJVihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJViwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVhbGlnbjsKLQkgKiAlcmVzZXJ2ZWQ7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVhbGlnbjsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvclBhcmFncmFwaCgpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQkJLy8gJXJlc2VydmVkOyAuLi4gZW1wdHkKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkREwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkREwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc0NmJiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZERMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBETC4KLSAqLwotZmluYWwgY2xhc3MgSGVkREwgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRETChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRMLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9ERUZJTklUSU9OX0xJU1Q7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhcnJheXM7Ci0JICogKGNvbXBhY3QgKGNvbXBhY3QpICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWREVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWREVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzNkODc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRFQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBEVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkRFQgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkREfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWREVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRULCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EX0RFRkFVTFQ7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIERUIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRFbXB0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRFbXB0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmRlNmUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRW1wdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIEVNUFRZIHR5cGUgZWxlbWVudCBkZWNsYXJhdGlvbnMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEhlZEVtcHR5IGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRW1wdHkoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9FTVBUWTsKLQkJLy8gRU1QVFkgdHlwZSBoYXMgbm8gZW5kIHRhZy4KLQkJb21pdFR5cGUgPSBPTUlUX0VORF9NVVNUOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQuPGJyPgotCSAqIEVNUFRZIHR5cGUgYWx3YXlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPGJyPgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQgdHlwZS48YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRk9STS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRGT1JNLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MGQ2MWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRGT1JNLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEZPUk0uCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEZPUk0gZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRGT1JNKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChhY3Rpb24gJVVSSTsgI1JFUVVJUkVEKQotCSAqIChtZXRob2QgKEdFVHxQT1NUKSBHRVQpCi0JICogKGVuY3R5cGUgJUNvbnRlbnRUeXBlOyAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKLQkgKiAoYWNjZXB0ICVDb250ZW50VHlwZXM7ICNJTVBMSUVEKQotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChvbnN1Ym1pdCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25yZXNldCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JICogKGFjY2VwdC1jaGFyc2V0ICVDaGFyc2V0czsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FDVElPTiwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX01FVEhPRCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0VOQ1RZUEUsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5GT1JNPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT5GT1JNPC9jb2RlPiBpdHNlbGYuCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZmF0YWwKLQotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlDTU5vZGUgZm9ybSA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNKTsKLQkJaWYgKGZvcm0gIT0gbnVsbCkKLQkJCWV4Y2x1c2lvbi5hcHBlbmRDaGlsZChmb3JtKTsKLQotCQlyZXR1cm4gZXhjbHVzaW9uOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT1JNLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRGbG93Q29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEZsb3dDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0ODQxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEZsb3dDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgKCVmbG93OykqIGNvbnRhaW5lcnMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEhlZEZsb3dDb250YWluZXIgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRGbG93Q29udGFpbmVyKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRkxPV19DT05UQUlORVI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRIRUFELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhFQUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThlZjZmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhFQUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBIVE1MLgotICovCi1maW5hbCBjbGFzcyBIZWRIRUFEIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFELCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRIRUFEKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSEVBRDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JCW9taXRUeXBlID0gT01JVF9CT1RIOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbGwgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSBpbiB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHN1cGVyIGNsYXNzLgotCSAqIFRoZSA8Y29kZT5IRUFEPC9jb2RlPiBlbGVtZW50IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKLQkgKiA8dGFibGU+Ci0JICogPHRib2R5PgotCSAqICAgPHRyPgotCSAqICAgICA8dGg+TkFNRTwvdGg+PHRoPlRZUEU8L3RoPjx0aD5VU0FHRTwvdGg+PHRoPkRFRkFVTFQgKElOSVRJQUwpIFZBTFVFPC90aD48dGg+TUVNTzwvdGg+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+JWkxOG47PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+cHJvZmlsZTwvdGQ+PHRkPlVSSTwvdGQ+PHRkPiNJTVBMSUVEPC90ZD48dGQ+Ti9BPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqIDwvdGJvZHk+Ci0JICogPC90YWJsZT4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVpMThuOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEkxOG4oYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICogSEVBRCBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSFIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSFIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMyZDA5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhSLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBIUi4KLSAqLwotZmluYWwgY2xhc3MgSGVkSFIgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSFIoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IUiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzCi0JICogKGFsaWduIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChub3NoYWRlIChub3NoYWRlKSAjSU1QTElFRCkKLQkgKiAoc2l6ZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKGNvbG9yICVDb2xvcjsgI0lNUExJRUQpIC4uLiBEMjA1NTE0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKGFsaWduIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX1ZBTFVFX0xFRlQsIENIVE1MTmFtZXNwYWNlLkFUVFJfVkFMVUVfQ0VOVEVSLCBDSFRNTE5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JJR0hUfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQotCQkvLyB0aGUgcmVzdC4KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX05PU0hBREUsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmMyZTRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uOwotCi0KLS8qKgotICogSFRNTC4KLSAqLwotZmluYWwgY2xhc3MgSGVkSFRNTCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSFRNTChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUwsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0hUTUw7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCQlvbWl0VHlwZSA9IE9NSVRfQk9USDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdXBlciBjbGFzcy4KLQkgKiBUaGUgPGNvZGU+SFRNTDwvY29kZT4gZWxlbWVudCBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0JICogPHRhYmxlPgotCSAqIDx0Ym9keT4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRoPk5BTUU8L3RoPjx0aD5UWVBFPC90aD48dGg+VVNBR0U8L3RoPjx0aD5ERUZBVUxUIChJTklUSUFMKSBWQUxVRTwvdGg+PHRoPk1FTU88L3RoPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPjxjb2RlPiVpMThuOzwvY29kZT48L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgICA8dGQ+e0BsaW5rIFBEQ01Eb2NJbXBsI2dldEF0dHJEZWNsYXJhdGlvbnNJMThufTwvdGQ+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+dmVyc2lvbjwvdGQ+PHRkPkNEQVRBPC90ZD48dGQ+I0ZJWEVEPC90ZD4KLQkgKiAgICAgPHRkPntAbGluayBIVE1MX1ZFUlNJT05fVFJBTlNJVElPTkFMfTwvdGQ+PHRkPmRlcGxlY2F0ZWQgaW4gSFRNTDQuMDE8L3RkPgotCSAqICAgPC90cj4KLQkgKiA8L3Rib2R5PgotCSAqIDwvdGFibGU+PGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQkJLy8gdmVyc2lvbgotCQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gYWRlYyA9IGF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb24oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZFUlNJT04pOwotCQlpZiAoYWRlYyAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZFUlNJT04sIGFkZWMpOwotCX0KLQotCS8qKgotCSAqIEhUTUwgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhlYWRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSGVhZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjNiZTM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSGVhZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogSFsxLTZdLgotICovCi1maW5hbCBjbGFzcyBIZWRIZWFkaW5nIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRIZWFkaW5nKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdXBlciBjbGFzcy4KLQkgKiBUaGUgPGNvZGU+SDE8L2NvZGU+IGVsZW1lbnQgbWF5IGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgotCSAqIDx0YWJsZT4KLQkgKiA8dGJvZHk+Ci0JICogICA8dHI+Ci0JICogICAgIDx0aD5OQU1FPC90aD48dGg+VFlQRTwvdGg+PHRoPlVTQUdFPC90aD48dGg+REVGQVVMVCAoSU5JVElBTCkgVkFMVUU8L3RoPjx0aD5NRU1PPC90aD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD4lYXR0cnM7PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+JWFsaWduOzwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgPC90cj4KLQkgKiA8L3Rib2R5PgotCSAqIDwvdGFibGU+Ci0JICogPHA+PGI+JWFsaWduOzwvYj4gbWVhbnMgPGNvZGU+YWxpZ24gKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnkpICNJTVBMSUVEPC9jb2RlPi4KLQkgKiBVbmZvcnR1bmF0ZWx5LCB0aGlzIDxjb2RlPmFsaWduPC9jb2RlPiBpcyBkaWZmZXJlbnQgZnJvbSBvbmUgaW4KLQkgKiA8Y29kZT5JTUc8L2NvZGU+IG9yIDxjb2RlPlRBQkxFPC9jb2RlPi4gIFNvLCB0aGUgYXR0cmlidXRlIGRlY2xhcmF0aW9uCi0JICogb2YgPGNvZGU+YWxpZ248L2NvZGU+IHNob3VsZCBiZSBsb2NhbHkgY3JlYXRlZCBhbmQgaXQgc2hvdWxkbid0IGJlIHJlZ2lzdGVyZWQKLQkgKiBpbiBhIDxjb2RlPkhDTURvY0ltcGw8L2NvZGU+IGluc3RhbmNlLjwvcD4KLQkgKiA8cD5Ib3dldmVyLCAlYWxpZ24gaXMgdXNlZCBpbiBzZXZhcmFsIHRpbWVzLiAgSSB3b3VsZG4ndCB3cml0ZSBzYW1lIGNvZGUKLQkgKiBpbiBtYW55IHRpbWVzLiAgU28sIEkgYWRkIGEgbmV3IHV0aWxpdHkgbWV0aG9kIGludG8gPGNvZGU+Q01VdGlsPC9jb2RlPgotCSAqIHRvIGNyZWF0ZSB0aGUgYXR0cmlidXRlIGRlY2xhcmF0aW9uLjwvcD4KLQkgKiA8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vIGFsaWduCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JQYXJhZ3JhcGgoKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZElNRy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRJTUcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg0NTRlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZElNRy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogSU1HLgotICovCi1maW5hbCBjbGFzcyBIZWRJTUcgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSU1HKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU1HLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICogSU1HLgotCSAqICVhdHRyczsKLQkgKiAoc3JjICVVUkk7ICNSRVFVSVJFRCk6IHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGFsdCAlVGV4dDsgI1JFUVVJUkVEKQotCSAqIChsb25nZGVzYyAlVVJJOyAjSU1QTElFRCkKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoaGVpZ2h0ICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAodXNlbWFwICVVUkk7ICNJTVBMSUVEKQotCSAqIChpc21hcCAoaXNtYXApICNJTVBMSUVEKQotCSAqIChhbGlnbiAlSUFsaWduOyAjSU1QTElFRCk6IHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGJvcmRlciAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAoaHNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqICh2c3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKG1hcGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKHNyYyAlVVJJOyAjUkVRVUlSRUQpOiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBudWxsOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBudWxsOwotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBhdHRyKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxULCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfSFNQQUNFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVlNQQUNFLH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vIGFsaWduIChsb2NhbCk7IHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9ySW1hZ2UoKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSU5QVVQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSU5QVVQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlhY2IzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZElOUFVULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIElOUFVULgotICovCi1maW5hbCBjbGFzcyBIZWRJTlBVVCBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRJTlBVVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLklOUFVULCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICogSU5QVVQuCi0JICogJWF0dHJzOwotCSAqICh0eXBlICVJbnB1dFR5cGU7IFRFWFQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoY2hlY2tlZCAoY2hlY2tlZCkgI0lNUExJRUQpCi0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKHJlYWRvbmx5IChyZWFkb25seSkgI0lNUExJRUQpCi0JICogKHNpemUgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChtYXhsZW5ndGggTlVNQkVSICNJTVBMSUVEKQotCSAqIChzcmMgJVVSSTsgI0lNUExJRUQpCi0JICogKGFsdCBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKHVzZW1hcCAlVVJJOyAjSU1QTElFRCkKLQkgKiAoaXNtYXAgKGlzbWFwKSAjSU1QTElFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uYmx1ciAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25zZWxlY3QgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uY2hhbmdlICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChhY2NlcHQgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQpCi0JICogKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoaXN0eWxlIENEQVRBICNJTVBMSUVEKQotCSAqIDw8RDIxNTY4NAotCSAqICh3aWR0aCBDREFUQTsgI0lNUExJRUQpCi0JICogKGhlaWdodCBDREFUQTsgI0lNUExJRUQpCi0JICogKGJvcmRlciBDREFUQTsgI0lNUExJRUQpCi0JICogRDIxNTY4NAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCS8vICh0eXBlICVJbnB1dFR5cGU7IFRFWFQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkvLyBOT1RFOiAlSW5wdXRUeXBlIGlzIEVOVU07Ci0JCS8vICh0ZXh0IHwgcGFzc3dvcmQgfCBjaGVja2JveCB8IHJhZGlvIHwgc3VibWl0IHwgcmVzZXQgfAotCQkvLyAgZmlsZSB8IGhpZGRlbiB8IGltYWdlIHwgYnV0dG9uKQotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJU3RyaW5nW10gdmFsdWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfVkFMVUVfVEVYVCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9QQVNTV09SRCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9DSEVDS0JPWCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9SQURJTywgQ0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9TVUJNSVQsIENIVE1MTmFtZXNwYWNlLkFUVFJfVkFMVUVfUkVTRVQsIENIVE1MTmFtZXNwYWNlLkFUVFJfVkFMVUVfSElEREVOLH07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBDSFRNTE5hbWVzcGFjZS5BVFRSX1ZBTFVFX1RFWFQpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCi0JCS8vIChzaXplIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0dHIpOwotCi0JCS8vIChhbHQgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTFQsIGF0dHIpOwotCi0JCS8vIChhbGlnbiAlSUFsaWduOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9ySW1hZ2UoKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQotCQkvLyB0aGUgcmVzdC4KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxVRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0NIRUNLRUQsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTUFYTEVOR1RILCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxULCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9JU1RZTEUsCi0JCS8vPDxEMjE1Njg0Ci0JCQkJCUNIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUgotCQkvLzxEMjE1Njg0Ci0JCX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSW5saW5lQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZElubGluZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmQ0YmM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSW5saW5lQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yICglaW5saW5lOykqIGNvbnRhaW5lcnMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEhlZElubGluZUNvbnRhaW5lciBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICogSGVkSW5saW5lQ29udGFpbmVyLgotCSAqIEBwYXJhbSBlbGVtZW50TmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgSGVkSW5saW5lQ29udGFpbmVyKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZExJLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZExJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMWY0YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRMSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIExJLgotICovCi1maW5hbCBjbGFzcyBIZWRMSSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEl9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZExJKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEksIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EX0RFRkFVTFQ7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICh0eXBlICVMSVN0eWxlOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKHZhbHVlIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBMSSBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkTGlzdEl0ZW1Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkTGlzdEl0ZW1Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYzNWU5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZExpc3RJdGVtQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGxpc3QgaXRlbSBjb250YWluZXIgZGVjbGFyYXRpb25zLgotICogLSBPTCwgVUwsIE1FTlUsIERJUi4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkTGlzdEl0ZW1Db250YWluZXIgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRMaXN0SXRlbUNvbnRhaW5lcihTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0xJX0NPTlRBSU5FUjsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRNRU5VLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZE1FTlUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmMGU4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZE1FTlUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogTUVOVS9ESVIuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE1FTlUgZXh0ZW5kcyBIZWRMaXN0SXRlbUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTUVOVShTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIE1FTlUvRElSLgotCSAqIChjb21wYWN0IChjb21wYWN0KSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5NRU5VL0RJUjwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+JWJsb2NrOzwvY29kZT4uCi0JICogJWJsb2NrOyBpczoKLQkgKiBQIHwgJWhlYWRpbmc7IHwgJWxpc3Q7IHwgJXByZWZvcm1hdHRlZDsgfCBETCB8IERJViB8IENFTlRFUiB8Ci0JICogTk9TQ1JJUFQgfCBOT0ZSQU1FUyB8IEJMT0NLUVVPVEUgfCBGT1JNIHwgSVNJTkRFWCB8IEhSIHwKLQkgKiBUQUJMRSB8IEZJRUxEU0VUIHwgQUREUkVTUy4KLQkgKiAlaGVhZGluZzsgaXM6IEgxIHwgSDIgfCBIMyB8IEg0IHwgSDUgfCBINi4KLQkgKiAlbGlzdDsgaXMgOiBVTCB8IE9MIHwgRElSIHwgTUVOVS4KLQkgKiAlcHJlZm9ybWF0dGVkOyBpcyBQUkUuCi0JICogPGJyPgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gJWJsb2NrOwotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5QLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMSwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgzLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5INCwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDUsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg2LCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5VTCwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuT0wsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVSwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuUFJFLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ETCwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElWLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5DRU5URVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJMT0NLUVVPVEUsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUk0sIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5BRERSRVNTfTsKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGV4Y2x1c2lvbiwgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZE1FVEEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkTUVUQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzJhNmZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkTUVUQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIE1FVEEuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE1FVEEgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTUVUQShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FVEEsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBNRVRBLgotCSAqICVpMThuOwotCSAqIChodHRwLWVxdWl2IE5BTUUgI0lNUExJRUQpCi0JICogKG5hbWUgTkFNRSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGNvbnRlbnQgQ0RBVEEgI1JFUVVJUkVEKQotCSAqIChzY2hlbWUgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlaTE4bjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRJMThuKGF0dHJpYnV0ZXMpOwotCi0JCS8vIChuYW1lIE5BTUUgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk5BTUUpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgYXR0cik7Ci0KLQkJLy8gMjQ5NDkzCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DT05URU5ULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DT05URU5ULCBhdHRyKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfSFRUUF9FUVVJViwKLQkJLy8JCUNIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DT05URU5UCi0JCX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkT0wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkT0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U4MDFkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZE9MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBPTC4KLSAqLwotZmluYWwgY2xhc3MgSGVkT0wgZXh0ZW5kcyBIZWRMaXN0SXRlbUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkT0woRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5PTCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogT0wuCi0JICogKHR5cGUgJU9MU3R5bGU7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQpCi0JICogKHN0YXJ0IE5VTUJFUiAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRPUFRJT04uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkT1BUSU9OLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZjIwMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRPUFRJT04uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBPUFRJT04uCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE9QVElPTiBleHRlbmRzIEhlZFBjZGF0YSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT059OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE9QVElPTihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EOwotCX0KLQotCS8qKgotCSAqIE9QVElPTi4KLQkgKiAlYXR0cnM7Ci0JICogKHNlbGVjdGVkIChzZWxlY3RlZCkgI0lNUExJRUQpCi0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKGxhYmVsICVUZXh0OyAjSU1QTElFRCkKLQkgKiAodmFsdWUgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NFTEVDVEVELCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBPUFRJT04gaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTJlMDkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogUC4KLSAqLwotZmluYWwgY2xhc3MgSGVkUCBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIHRlcm1pbmF0b3JzID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRQKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuUCwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0VORDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdXBlciBjbGFzcy4KLQkgKiBUaGUgPGNvZGU+UDwvY29kZT4gZWxlbWVudCBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0JICogPHRhYmxlPgotCSAqIDx0Ym9keT4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRoPk5BTUU8L3RoPjx0aD5UWVBFPC90aD48dGg+VVNBR0U8L3RoPjx0aD5ERUZBVUxUIChJTklUSUFMKSBWQUxVRTwvdGg+PHRoPk1FTU88L3RoPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPiVhdHRyczs8L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD4lYWxpZ247PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqIDwvdGJvZHk+Ci0JICogPC90YWJsZT4KLQkgKiA8cD48Yj4lYWxpZ247PC9iPiBtZWFucyA8Y29kZT5hbGlnbiAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeSkgI0lNUExJRUQ8L2NvZGU+LgotCSAqIFVuZm9ydHVuYXRlbHksIHRoaXMgPGNvZGU+YWxpZ248L2NvZGU+IGlzIGRpZmZlcmVudCBmcm9tIG9uZSBpbgotCSAqIDxjb2RlPklNRzwvY29kZT4gb3IgPGNvZGU+VEFCTEU8L2NvZGU+LiAgU28sIHRoZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24KLQkgKiBvZiA8Y29kZT5hbGlnbjwvY29kZT4gc2hvdWxkIGJlIGxvY2FseSBjcmVhdGVkIGFuZCBpdCBzaG91bGRuJ3QgYmUgcmVnaXN0ZXJlZAotCSAqIGluIGEgPGNvZGU+SENNRG9jSW1wbDwvY29kZT4gaW5zdGFuY2UuPC9wPgotCSAqIDxwPkhvd2V2ZXIsICVhbGlnbiBpcyB1c2VkIGluIHNldmFyYWwgdGltZXMuICBJIHdvdWxkbid0IHdyaXRlIHNhbWUgY29kZQotCSAqIGluIG1hbnkgdGltZXMuICBTbywgSSBhZGQgYSBuZXcgdXRpbGl0eSBtZXRob2QgaW50byA8Y29kZT5DTVV0aWw8L2NvZGU+Ci0JICogdG8gY3JlYXRlIHRoZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uPC9wPgotCSAqIDxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyBhbGlnbgotCQlIVE1MQXR0ckRlY2xJbXBsIGFkZWMgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9yUGFyYWdyYXBoKCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYWRlYyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBuYW1lcyBvZiB0ZXJtaW5hdG9ycy4KLQkgKiA8Y29kZT5QPC9jb2RlPiBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCWlmICh0ZXJtaW5hdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHRlcm1pbmF0b3JzLml0ZXJhdG9yKCk7Ci0JCS8vPDxEMjE3OTgyCi0JCXRlcm1pbmF0b3JzID0gbmV3IFZlY3RvcigpOwotCQl0ZXJtaW5hdG9ycy5hZGRBbGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZXNPZkJsb2NrKCkpOwotCQl0ZXJtaW5hdG9ycy5hZGQoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEkpOwotCQl0ZXJtaW5hdG9ycy5hZGQoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQpOwotCQl0ZXJtaW5hdG9ycy5hZGQoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuREQpOwotCQkvL0QyMTc5ODIKLQkJcmV0dXJuIHRlcm1pbmF0b3JzLml0ZXJhdG9yKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRQUkUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkUFJFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZjUzNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRQUkUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBQUkUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFBSRSBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKiBQUkUgZWxlbWVudCBzaG91bGQga2VlcCBzcGFjZXMgaW4gaXRzIHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgSGVkUFJFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuUFJFLCBjb2xsZWN0aW9uKTsKLQkJLy8gQ09SUkVDVF9FTVBUWSAtIEdST1VQX0NPTVBBQ1QKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCi0JCWtlZXBTcGFjZXMgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAod2lkdGggTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gKHdpZHRoIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+UFJFPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT4lcHJlLmV4Y2x1c2lvbjs8L2NvZGU+LgotCSAqICVwcmUuZXhjbHVzaW9uIGlzOgotCSAqIElNRyB8IE9CSkVDVCB8IEFQUExFVCB8IEJJRyB8IFNNQUxMIHwgU1VCIHwgU1VQIHwgRk9OVCB8IEJBU0VGT05UCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTUcsfTsKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGV4Y2x1c2lvbiwgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkUGNkYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFBjZGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDkwZGYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkUGNkYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBQQ0RBVEEgdHlwZSBlbGVtZW50IGRlY2xhcmF0aW9ucy48YnI+Ci0gKi8KLWFic3RyYWN0IGNsYXNzIEhlZFBjZGF0YSBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFBjZGF0YShTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1BDREFUQTsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50Ljxicj4KLQkgKiBQQ0RBVEEgdHlwZSBhbHdheXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8YnI+Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudAotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudCB0eXBlLjxicj4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU0VMRUNULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNFTEVDVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjAzNmY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU0VMRUNULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICogU0VMRUNULgotICovCi1maW5hbCBjbGFzcyBIZWRTRUxFQ1QgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTRUxFQ1QoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5TRUxFQ1QsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1NFTEVDVDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogJXJlc2VydmVkOwotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChzaXplIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKG11bHRpcGxlIChtdWx0aXBsZSkgI0lNUExJRUQpCi0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAob25mb2N1cyAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmNoYW5nZSAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvLyAoc2l6ZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0dHIpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTVVMVElQTEUsfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lCYXNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRkYjA0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotCi0KLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIFNTSSBkZWNsYXJhdGlvbnMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEhlZFNTSUJhc2UgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJQmFzZShTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEZvcm1hdFR5cGUoKSB7Ci0JCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9TU0k7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCWlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19TU0kpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBzdXBlci5zdXBwb3J0cyhwcm9wTmFtZSk7Ci0JfQotCi0JLyoKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wTmFtZSkgewotCQlpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfU1NJKSkKLQkJCXJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5KHByb3BOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUNvbmZpZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I1MmIwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogU1NJOkNPTkZJRy4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJQ29uZmlnIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJQ29uZmlnKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0NPTkZJRywgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOkNPTkZJRy4KLQkgKiAoZXJybXNnIENEQVRBICNJTVBMSUVEKQotCSAqIChzaXplZm10IENEQVRBICNJTVBMSUVEKQotCSAqICh0aW1lZm10IENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0VSUk1TRywgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkVGTVQsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9USU1FRk1UfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lFY2hvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUVjaG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQxYjIyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUVjaG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFNTSTpFQ0hPLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lFY2hvIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJRWNobyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9FQ0hPLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6RUNITwotCSAqICh2YXIgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVkFSfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lFeGVjLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUV4ZWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZhZDU4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUV4ZWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFNTSTpFWEVDLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lFeGVjIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJRXhlYyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9FWEVDLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6RVhFQwotCSAqIChjZ2kgJVVSSTsgI0lNUExJRUQpCi0JICogKGNtZCBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DR0ksIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DTUR9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUZsYXN0bW9kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUZsYXN0bW9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMGNiNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lGbGFzdG1vZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogU1NJOkZMQVNUTU9ELgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lGbGFzdG1vZCBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUZsYXN0bW9kKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0ZMQVNUTU9ELCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6RkxBU1RNT0QKLQkgKiAoZmlsZSAlVVJJOyAjSU1QTElFRCkKLQkgKiAodmlydHVhbCAlVVJJICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0ZJTEUsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9WSVJUVUFMfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lGc2l6ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lGc2l6ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTZmMjgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJRnNpemUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFNTSTpGU0laRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJRnNpemUgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lGc2l6ZShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GU0laRSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOkZTSVpFCi0JICogKGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JICogKHZpcnR1YWwgJVVSSSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9GSUxFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVklSVFVBTH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJSW5jbHVkZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lJbmNsdWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMGY3MjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lJbmNsdWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBTU0k6SU5DTFVERS4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJSW5jbHVkZSBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUluY2x1ZGUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfSU5DTFVERSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOklOQ0xVREUKLQkgKiAoZmlsZSAlVVJJOyAjSU1QTElFRCkKLQkgKiAodmlydHVhbCAlVVJJICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0ZJTEUsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9WSVJUVUFMfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lQcmludGVudi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lQcmludGVudi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODYwOTk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJUHJpbnRlbnYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFNTSTpQUklOVEVOVi4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJUHJpbnRlbnYgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lQcmludGVudihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9QUklOVEVOViwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6UFJJTlRFTlYgaGFzIG5vIGF0dHJpYnV0ZXMuICBTbywgdGhpcyBtZXRob2Qgc2hvdWxkCi0JICogYWx3YXlzIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBOb3RlOiBTaW5jZSBzb21lYm9keSBkb2Vzbid0IGV4cGVjdCBudWxsIGlzIHJldHVybmVkLCByZXR1cm4gdGhlIGVtcHR5IGF0dHJpYnV0ZQotCSAqIGxpa2UgYSBjdXN0b20gdGFnIHdoaWNoIGRvZXNuJ3QgaGF2ZSBhdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGVzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lTZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NDc0ODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFNTSTpTRVQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSVNldCBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSVNldChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9TRVQsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpTRVQKLQkgKiAodmFyIENEQVRBICNJTVBMSUVEKQotCSAqICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9WQVIsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxVRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkVEVYVEFSRUEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkVEVYVEFSRUEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgxOThlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFRFWFRBUkVBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBURVhUQVJFQS4KLSAqLwotZmluYWwgY2xhc3MgSGVkVEVYVEFSRUEgZXh0ZW5kcyBIZWRQY2RhdGEgewotCi0JLyoqCi0JICogVEVYVEFSRUEgc2hvdWxkIGtlZXAgc3BhY2VzIGluIGl0cyBzb3VyY2UuCi0JICovCi0JcHVibGljIEhlZFRFWFRBUkVBKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEVYVEFSRUEsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQotCQlrZWVwU3BhY2VzID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBURVhUQVJFQS4KLQkgKiAlYXR0cnM7Ci0JICogJXJlc2VydmVkOyAuLi4gZW1wdHkKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAocm93cyBOVU1CRVIgI1JFUVVJUkVEKQotCSAqIChjb2xzIE5VTUJFUiAjUkVRVUlSRUQpCi0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKHJlYWRvbmx5IChyZWFkb25seSkgI0lNUExJRUQpCi0JICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAoYWNjZXNza2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uc2VsZWN0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmNoYW5nZSAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAoaXN0eWxlIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1JPV1MsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0xTLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfSVNUWUxFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRUSVRMRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRUSVRMRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTJlMGFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkVElUTEUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotCi0vKioKLSAqIFRJVExFLgotICovCi1maW5hbCBjbGFzcyBIZWRUSVRMRSBleHRlbmRzIEhlZFBjZGF0YSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkVElUTEUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5USVRMRSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCX0KLQotCS8qKgotCSAqIFRJVExFLgotCSAqICVpMThuOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+VElUTEU8L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPiVoZWFkLm1pc2M7PC9jb2RlPi4KLQkgKiAlaGVhZC5taXNjOyBpcyA8Y29kZT5TQ1JJUFR8U1RZTEV8TUVUQXxMSU5LfE9CSkVDVDwvY29kZT4uCi0JICogPGJyPgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gKFNDUklQVHxTVFlMRXxNRVRBfExJTkt8T0JKRUNUKQotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FVEEsfTsKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGV4Y2x1c2lvbiwgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCXJldHVybiBleGNsdXNpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRVTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRVTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjI0OWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkVUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFVMLgotICovCi1maW5hbCBjbGFzcyBIZWRVTCBleHRlbmRzIEhlZExpc3RJdGVtQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRVTChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVMLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBVTC4KLQkgKiAodHlwZSAlVUxTdHlsZTsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChjb21wYWN0IChjb21wYWN0KSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9Qcm9wZXJ0eVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL1Byb3BlcnR5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0MGEzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL1Byb3BlcnR5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci0KLQotCi0vKioKLSAqIFByb3BlcnR5UHJvdmlkZXIgY2xhc3MuCi0gKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBpbnN0YW5jZXMuCi0gKi8KLWludGVyZmFjZSBQcm9wZXJ0eVByb3ZpZGVyIHsKLQotCWJvb2xlYW4gc3VwcG9ydHMoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCk7Ci0KLQlPYmplY3QgZ2V0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9Qcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9Qcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTRhMmNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvUHJvcGVydHlQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmFubm90YXRpb24uQW5ub3RhdGlvbk1hcDsKLQotLyoqCi0gKiBUaGUgZmFjdG9yeSBvYmplY3Qgb2YgUHJvcGVydHlQcm92aWRlci4KLSAqLwotZmluYWwgY2xhc3MgUHJvcGVydHlQcm92aWRlckZhY3RvcnkgewotCi0KLQkvKioKLQkgKiBEZWZhdWx0UHJvdmlkZXIgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgdW5rbm93biBwcm9wZXJ0aWVzLgotCSAqIEl0IGFsd2F5cyByZXR1cm5zIG51bGwgdmFsdWUgZm9yIGFueSBwcm9wZXJ0aWVzLgotCSAqLwotCWNsYXNzIERlZmF1bHRQcm92aWRlciBpbXBsZW1lbnRzIFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgRGVmYXVsdFByb3ZpZGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciBpbXBsZW1lbnRzIFByb3BlcnR5UHJvdmlkZXIgewotCQlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKSB7Ci0JCQlyZXR1cm4gKGVkZWNsICE9IG51bGwpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXQoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCkgewotCQkJaWYgKCEoZWRlY2wgaW5zdGFuY2VvZiBIVE1MUHJvcGVydHlEZWNsYXJhdGlvbikpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gZ2V0RWxlbWVudFByb3BlcnR5KChIVE1MUHJvcGVydHlEZWNsYXJhdGlvbillZGVjbCk7Ci0JCX0KLQotCQlhYnN0cmFjdCBwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKTsKLQl9Ci0KLQkvKgotCSAqICJ0YWdJbmZvIgotCSAqIGdldHMgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGVsZW1lbnQKLQkgKi8KLQljbGFzcyBQUFRhZ0luZm8gZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGh0bWxBbm5vdGF0aW9uTG9jID0gImRhdGEvaHRtcmVmLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHJvdGVjdGVkIEFubm90YXRpb25NYXAgZkFubm90YXRpb25NYXAgPSBudWxsOwotCi0JCXB1YmxpYyBQUFRhZ0luZm8oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldHMgdGhlIGFubm90YXRpb25NYXAuCi0JCSAqIEByZXR1cm4gUmV0dXJucyBhIEFubm90YXRpb25NYXAKLQkJICovCi0JCXByb3RlY3RlZCBBbm5vdGF0aW9uTWFwIGdldEFubm90YXRpb25NYXAoKSB7Ci0JCQlpZiAoZkFubm90YXRpb25NYXAgPT0gbnVsbCkgewotCQkJCWZBbm5vdGF0aW9uTWFwID0gbmV3IEFubm90YXRpb25NYXAoKTsKLQkJCQl0cnkgewotCQkJCQlmQW5ub3RhdGlvbk1hcC5sb2FkKGh0bWxBbm5vdGF0aW9uTG9jLCBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gbm8gYW5ub3RhdGlvbiBhdmFpbGFibGUKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZkFubm90YXRpb25NYXA7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlpZiAoZGVjbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbk1hcCgpLmdldFByb3BlcnR5KCgoSFRNTEVsZW1lbnREZWNsYXJhdGlvbilkZWNsKS5nZXRFbGVtZW50TmFtZSgpLCAidGFnSW5mbyIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAic2hvdWxkS2VlcFNwYWNlIgotCSAqLwotCWNsYXNzIFBQU2hvdWxkS2VlcFNwYWNlIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUFNob3VsZEtlZXBTcGFjZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZGVjbC5zaG91bGRLZWVwU3BhY2VzKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAic2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UiCi0JICovCi0JY2xhc3MgUFBTaG91bGRJbmRlbnRDaGlsZFNvdXJjZSBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBTaG91bGRJbmRlbnRDaGlsZFNvdXJjZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZGVjbC5zaG91bGRJbmRlbnRDaGlsZFNvdXJjZSgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogInRlcm1pbmF0b3JzIgotCSAqLwotCWNsYXNzIFBQVGVybWluYXRvcnMgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQVGVybWluYXRvcnMoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmICghIChkZWNsIGluc3RhbmNlb2YgSFRNTEVsZW1EZWNsSW1wbCkpIHJldHVybiBudWxsOwotCQkJcmV0dXJuICgoSFRNTEVsZW1EZWNsSW1wbClkZWNsKS5nZXRUZXJtaW5hdG9ycygpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAicHJvaGliaXRlZEFuY2VzdG9ycyIKLQkgKi8KLQljbGFzcyBQUFByb2hpYml0ZWRBbmNlc3RvcnMgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQUHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gZGVjbC5nZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJpc0pTUCIKLQkgKi8KLQljbGFzcyBQUElzSlNQIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUElzSlNQKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihkZWNsLmlzSlNQKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAiaXNYSFRNTCIKLQkgKiBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGl0c2VsZiBuZXZlciByZXByZXNlbnQgYW55IFhIVE1MIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0JICogU28sIHRoaXMgcHJvcGVydHkgbXVzdCBiZSBhbHdheXMgZmFsc2UuCi0JICovCi0JY2xhc3MgUFBJc1hIVE1MIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUElzWEhUTUwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qCi0JICogImlzU1NJIgotCSAqIEVhY2ggZGVjbGFyYXRpb24gY2xhc3MgZm9yIFNTSSBlbGVtZW50cyBtdXN0IHByb3ZpZGUgdGhpcyBwcm9wZXJ0eSBpdHNlbGYsCi0JICogYW5kIHRoZW4gcmV0dXJuIHRydWUuICBPdGhlciBkZWNsYXJhdGlvbiBtdXN0IGFsd2F5cyByZXR1cm4gZmFsc2UuCi0JICovCi0JY2xhc3MgUFBJc1NTSSBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBJc1NTSSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAibGluZUJyZWFrSGludCIKLQkgKi8KLQljbGFzcyBQUExpbmVCcmVha0hpbnQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQTGluZUJyZWFrSGludCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlTdHJpbmcgaGludCA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX05PTkU7Ci0JCQlzd2l0Y2ggKGRlY2wuZ2V0TGluZUJyZWFrSGludCgpKSB7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0FGVEVSX1NUQVJUIDoKLQkJCQkJaGludCA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX0FGVEVSX1NUQVJUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQgOgotCQkJCQloaW50ID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19OT05FIDoKLQkJCQkvLyBub3RoaW5nIHRvIGRvCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIGhpbnQ7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJsYXlvdXRUeXBlIgotCSAqLwotCWNsYXNzIFBQTGF5b3V0VHlwZSBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBMYXlvdXRUeXBlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCVN0cmluZyB0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX05PTkU7Ci0JCQlzd2l0Y2ggKGRlY2wuZ2V0TGF5b3V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9CTE9DSyA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5MQVlPVVRfQkxPQ0s7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfQlJFQUsgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX0JSRUFLOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTiA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5MQVlPVVRfSElEREVOOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVCA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5MQVlPVVRfT0JKRUNUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX1dSQVAgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX1dSQVA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfTk9ORSA6Ci0JCQkJLy8gbm90aGluZyB0byBkby4KLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gdHlwZTsKLQkJfQotCX0KLQotCS8qCi0JICogIm9taXRUeXBlIgotCSAqLwotCWNsYXNzIFBQT21pdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQT21pdFR5cGUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJU3RyaW5nIHR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX05PTkU7Ci0JCQlzd2l0Y2ggKGRlY2wuZ2V0T21pdFR5cGUoKSkgewotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0JPVEggOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9CT1RIOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORF9ERUZBVUxUIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX0RFRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORF9NVVNUIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX01VU1Q7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX05PTkUgOgotCQkJCS8vIG5vdGhpbmcgdG8gZG8uCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIHR5cGU7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJpbmNsdXNpb24iCi0JICovCi0JY2xhc3MgUFBJbmNsdXNpb24gZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQSW5jbHVzaW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBkZWNsLmdldEluY2x1c2lvbigpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0eVByb3ZpZGVyIGdldFByb3ZpZGVyKFN0cmluZyBwcm9wTmFtZSkgewotCQlQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSBmYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLQkJUHJvcGVydHlQcm92aWRlciBwcCA9IChQcm9wZXJ0eVByb3ZpZGVyKSBmYWN0b3J5LnJlZ2lzdHJ5LmdldChwcm9wTmFtZSk7Ci0JCWlmIChwcCAhPSBudWxsKQotCQkJcmV0dXJuIHBwOwotCi0JCXBwID0gZmFjdG9yeS5jcmVhdGUocHJvcE5hbWUpOwotCQlpZiAocHAgPT0gbnVsbCkKLQkJCXJldHVybiBmYWN0b3J5LmRlZmF1bHRQcm92aWRlcjsKLQotCQlmYWN0b3J5LnJlZ2lzdHJ5LnB1dChwcm9wTmFtZSwgcHApOwotCQlyZXR1cm4gcHA7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydHlQcm92aWRlckZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgIT0gbnVsbCkKLQkJCXJldHVybiBpbnN0YW5jZTsKLQkJaW5zdGFuY2UgPSBuZXcgUHJvcGVydHlQcm92aWRlckZhY3RvcnkoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgSGFzaHRhYmxlIHJlZ2lzdHJ5ID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgUHJvcGVydHlQcm92aWRlciBkZWZhdWx0UHJvdmlkZXIgPSBuZXcgRGVmYXVsdFByb3ZpZGVyKCk7Ci0KLQlwcml2YXRlIFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlQcm92aWRlciBjcmVhdGUoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCVByb3BlcnR5UHJvdmlkZXIgcHAgPSBudWxsOwotCQlpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfSlNQKSkKLQkJCXBwID0gbmV3IFBQSXNKU1AoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcHAgPSBuZXcgUFBJc1hIVE1MKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1NTSSkpCi0JCQlwcCA9IG5ldyBQUElzU1NJKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLkxBWU9VVF9UWVBFKSkKLQkJCXBwID0gbmV3IFBQTGF5b3V0VHlwZSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpKQotCQkJcHAgPSBuZXcgUFBMaW5lQnJlYWtIaW50KCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlBST0hJQklURURfQU5DRVNUT1JTKSkKLQkJCXBwID0gbmV3IFBQUHJvaGliaXRlZEFuY2VzdG9ycygpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfS0VFUF9TUEFDRSkpCi0JCQlwcCA9IG5ldyBQUFNob3VsZEtlZXBTcGFjZSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSU5ERU5UX0NISUxEX1NPVVJDRSkpCi0JCQlwcCA9IG5ldyBQUFNob3VsZEluZGVudENoaWxkU291cmNlKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlRFUk1JTkFUT1JTKSkKLQkJCXBwID0gbmV3IFBQVGVybWluYXRvcnMoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVEFHSU5GTykpCi0JCQlwcCA9IG5ldyBQUFRhZ0luZm8oKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuT01JVF9UWVBFKSkKLQkJCXBwID0gbmV3IFBQT21pdFR5cGUoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSU5DTFVTSU9OKSkKLQkJCXBwID0gbmV3IFBQSW5jbHVzaW9uKCk7Ci0KLQkJcmV0dXJuIHBwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvc3NpL1NTSUNNRG9jdW1lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3NzaS9TU0lDTURvY3VtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTRkZmQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvc3NpL1NTSUNNRG9jdW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnNzaTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTENNRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNRG9jVHlwZTsKLQotLyoqCi0gKiBDTURvY3VtZW50IGZhY3RvcnkgZm9yIFNTSSBkb2N1bWVudHMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTU0lDTURvY3VtZW50RmFjdG9yeSB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJFRklYID0gIlNTSSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBET0NfVFlQRV9OQU1FID0gIlNTSSI7Ly8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGNsYXNzIENNTmFtZXNwYWNlSW1wbCBpbXBsZW1lbnRzIENNTmFtZXNwYWNlIHsKLQkJcHVibGljIENNTmFtZXNwYWNlSW1wbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJCXJldHVybiBQUkVGSVg7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJCXJldHVybiBET0NfVFlQRV9OQU1FOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBDTU5vZGUuTkFNRV9TUEFDRTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLQotCXN0YXRpYyBjbGFzcyBDTURvY0ltcGwgaW1wbGVtZW50cyBDTURvY3VtZW50IHsKLQkJcHJpdmF0ZSBzdGF0aWMgQ01Eb2N1bWVudCBoY20gPSBIVE1MQ01Eb2N1bWVudEZhY3RvcnkuZ2V0Q01Eb2N1bWVudChDTURvY1R5cGUuSFRNTF9ET0NfVFlQRSk7Ci0KLQkJc3RhdGljIGNsYXNzIEVsZW1lbnRzIGltcGxlbWVudHMgQ01OYW1lZE5vZGVNYXAgewotCQkJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9DT05GSUcsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRUNITywgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9FWEVDLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0ZTSVpFLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0ZMQVNUTU9ELCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0lOQ0xVREUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfUFJJTlRFTlYsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfU0VUfTsKLQkJCXByaXZhdGUgSGFzaHRhYmxlIG1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQotCQkJcHVibGljIEVsZW1lbnRzKCkgewotCQkJCUNNTmFtZWROb2RlTWFwIGVsZW1zID0gaGNtLmdldEVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQlTdHJpbmcgbmFtZSA9IG5hbWVzW2ldOwotCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWMgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGVsZW1zLmdldE5hbWVkSXRlbShuYW1lKTsKLQkJCQkJaWYgKGRlYyAhPSBudWxsKQotCQkJCQkJbWFwLnB1dChuYW1lLCBkZWMpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQkJcmV0dXJuIG1hcC5zaXplKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQkJU3RyaW5nIGNvb2tlZCA9IGdldENhbm9uaWNhbE5hbWUobmFtZSk7Ci0JCQkJaWYgKCFtYXAuY29udGFpbnNLZXkoY29va2VkKSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJcmV0dXJuIChDTU5vZGUpIG1hcC5nZXQoY29va2VkKTsKLQkJCX0KLQotCQkJcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlPYmplY3Qgbm9kZSA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoLS1pbmRleCA8IDApCi0JCQkJCQlyZXR1cm4gKENNTm9kZSkgbm9kZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJCQlyZXR1cm4gbWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgU3RyaW5nIGdldENhbm9uaWNhbE5hbWUoU3RyaW5nIHJhd05hbWUpIHsKLQkJCQlyZXR1cm4gcmF3TmFtZS50b1VwcGVyQ2FzZSgpOwotCQkJfQotCQl9Ci0KLQkJc3RhdGljIHByaXZhdGUgRWxlbWVudHMgZWxlbWVudHMgPSBuZXcgRWxlbWVudHMoKTsKLQotCi0JCXB1YmxpYyBDTURvY0ltcGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBDTU5vZGUuRE9DVU1FTlQ7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gZWxlbWVudHM7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0JCQlyZXR1cm4gc3NpbnM7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ01OYW1lc3BhY2Ugc3NpbnMgPSBuZXcgQ01OYW1lc3BhY2VJbXBsKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgQ01Eb2N1bWVudCBteWNtID0gbmV3IENNRG9jSW1wbCgpOwotCi0JcHJpdmF0ZSBTU0lDTURvY3VtZW50RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpIHsKLQkJcmV0dXJuIG15Y207Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSFRNTENvbnRlbnRQcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSFRNTENvbnRlbnRQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjN2E0MWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0hUTUxDb250ZW50UHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5QcmVmZXJlbmNlczsKLQotLyoqCi0gKiBQcm9wZXJ0aWVzIGNvbnN0YW50cyB1c2VkIGJ5IEhUTUwuIENsaWVudHMgc2hvdWxkIG9ubHkgcmVhZCBhbmQgbW9kaWZ5IHRoZQotICogSFRNTCBwcm9wZXJ0aWVzIHByb2dyYW1tYXRpY2FsbHkgdXNpbmcgdGhpcyBjbGFzcy4KLSAqIAotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgSFRNTENvbnRlbnRQcm9wZXJ0aWVzIHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxDT1JFX0lEID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0tFWSA9ICI8cHJvamVjdD4iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBkb2N1bWVudCB0eXBlIHRvIHVzZSB3aGVuIG5vbmUgaXMgc3BlY2lmaWVkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfVFlQRSA9ICJkb2N1bWVudC10eXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogR2VuZXJhdGVzIGEgcHJlZmVyZW5jZSBrZXkgYmFzZWQgb24gcmVzb3VyY2VQYXRoCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlUGF0aAotCSAqICAgICAgICAgICAgdGhlIHBhdGggdGhlIGtleSB3aWxsIGJlIGJhc2VkIG9mZiBvZgotCSAqIEByZXR1cm4gcHJlZmVyZW5jZSBrZXkgYmFzZWQgb24gcmVzb3VyY2VQYXRoIChiYXNpY2FsbHkgdGhlCi0JICogICAgICAgICByZXNvdXJjZVBhdGggd2l0aG91dCB0aGUgZmlsZW5hbWUpOyBQUk9KRUNUX0tFWSBpZiByZXNvdXJjZVBhdGgKLQkgKiAgICAgICAgIGlzIG51bGwKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldEtleUZvcihJUGF0aCByZXNvdXJjZVBhdGgpIHsKLQkJU3RyaW5nIGtleSA9IFBST0pFQ1RfS0VZOwotCQlpZiAocmVzb3VyY2VQYXRoICE9IG51bGwgJiYgcmVzb3VyY2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJa2V5ID0gcmVzb3VyY2VQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4ga2V5OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJlZmVyZW5jZXMgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb2plY3Qgc2NvcGUgYW5kCi0JICogcHJlZmVyZW5jZSBrZXkgKHN1Yk5vZGUpIElmIGNyZWF0ZSBpcyB0cnVlLCB0aGUgcHJlZmVyZW5jZSBub2RlIHdpbGwgYmUKLQkgKiBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0Ci0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0IHRoZSBwcmVmZXJlbmNlIG5vZGUgaXMgdW5kZXIKLQkgKiBAcGFyYW0gcHJlZmVyZW5jZUtleQotCSAqICAgICAgICAgICAgdGhlIHN1Ym5vZGUvY2F0ZWdvcnkgdGhlIHByZWZlcmVuY2Ugbm9kZSBpcyBsb2NhdGVkIGluCi0JICogQHBhcmFtIGNyZWF0ZQotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgYSBwcmVmZXJlbmNlIG5vZGUgd2lsbCBiZSBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdAotCSAqICAgICAgICAgICAgYWxyZWFkeSBleGlzdAotCSAqIEByZXR1cm4gUHJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm9qZWN0IHNjb3BlIGFuZAotCSAqICAgICAgICAgcHJlZmVyZW5jZSBrZXkuIG51bGwgaWYgb25lIGNvdWxkIG5vdCBiZSBmb3VuZCBhbmQgY3JlYXRlIGlzCi0JICogICAgICAgICBmYWxzZQotCSAqLwotCXN0YXRpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcyhJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgcHJlZmVyZW5jZUtleSwgYm9vbGVhbiBjcmVhdGUpIHsKLQkJaWYgKGNyZWF0ZSkKLQkJCS8vIGNyZWF0ZSBhbGwgbm9kZXMgZG93biB0byB0aGUgb25lIHdlIGFyZSBpbnRlcmVzdGVkIGluCi0JCQlyZXR1cm4gbmV3IFByb2plY3RTY29wZShwcm9qZWN0KS5nZXROb2RlKEhUTUxDT1JFX0lEKS5ub2RlKHByZWZlcmVuY2VLZXkpOwotCQkvLyBiZSBjYXJlZnVsIGxvb2tpbmcgdXAgZm9yIG91ciBub2RlIHNvIG5vdCB0byBjcmVhdGUgYW55IG5vZGVzIGFzCi0JCS8vIHNpZGUgZWZmZWN0Ci0JCVByZWZlcmVuY2VzIG5vZGUgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRSb290Tm9kZSgpLm5vZGUoUHJvamVjdFNjb3BlLlNDT1BFKTsKLQkJdHJ5IHsKLQkJCS8vIFRPRE8gb25jZSBidWcgOTA1MDAgaXMgZml4ZWQsIHNob3VsZCBiZSBhcyBzaW1wbGUgYXMgdGhpczoKLQkJCS8vIFN0cmluZyBwYXRoID0gcHJvamVjdC5nZXROYW1lKCkgKyBJUGF0aC5TRVBBUkFUT1IgKwotCQkJLy8gUmVzb3VyY2VzUGx1Z2luLlBJX1JFU09VUkNFUyArIElQYXRoLlNFUEFSQVRPUiArCi0JCQkvLyBFTkNPRElOR19QUkVGX05PREU7Ci0JCQkvLyByZXR1cm4gbm9kZS5ub2RlRXhpc3RzKHBhdGgpID8gbm9kZS5ub2RlKHBhdGgpIDogbnVsbDsKLQkJCS8vIGZvciBub3csIHRha2UgdGhlIGxvbmcgd2F5Ci0JCQlpZiAoIW5vZGUubm9kZUV4aXN0cyhwcm9qZWN0LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlub2RlID0gbm9kZS5ub2RlKHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCWlmICghbm9kZS5ub2RlRXhpc3RzKEhUTUxDT1JFX0lEKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCW5vZGUgPSBub2RlLm5vZGUoSFRNTENPUkVfSUQpOwotCQkJaWYgKCFub2RlLm5vZGVFeGlzdHMocHJlZmVyZW5jZUtleSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gbm9kZS5ub2RlKHByZWZlcmVuY2VLZXkpOwotCQl9Ci0JCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gbm9kZUV4aXN0cyBmYWlsZWQKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJDb3VsZCBub3QgcmV0cmlldmUgcHJlZmVyZW5jZSBub2RlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSBpbiB0aGUgZ2l2ZW4gY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgcHJvcGVydHkga2V5Ci0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBjb250ZXh0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGNvbnRleHQgaXMKLQkgKiAgICAgICAgICAgIGF2YWlsYWJsZSBhbmQgdGhlIHdvcmtzcGFjZSBzZXR0aW5nIHNob3VsZCBiZSB0YWtlbi4gTm90ZQotCSAqICAgICAgICAgICAgdGhhdCBwYXNzaW5nIDxjb2RlPm51bGw8L2NvZGU+IHNob3VsZCBiZSBhdm9pZGVkLgotCSAqIEBwYXJhbSByZWN1cnNlCi0JICogICAgICAgICAgICB3aGV0aGVyIHRoZSBwYXJlbnQgc2hvdWxkIGJlIHF1ZXJpZWQgdGlsbCBwcm9wZXJ0eSBpcyBmb3VuZAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBmb3IgdGhlIGtleS4KLQkgKiBAc2luY2UgMS4xCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSwgSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIHJlY3Vyc2UpIHsKLQkJU3RyaW5nIHZhbCA9IG51bGw7Ci0JCS8vIGJvb2xlYW4gcHJlZmVyZW5jZUZvdW5kID0gZmFsc2U7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0UHJlZmVyZW5jZXMocHJvamVjdCwga2V5LCBmYWxzZSk7Ci0JCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQkJdmFsID0gaW50ZXJuYWxHZXRQcm9wZXJ0eShyZXNvdXJjZSwgcmVjdXJzZSwgcHJlZmVyZW5jZXMpOwotCQkJCQkvLyBwcmVmZXJlbmNlRm91bmQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBXb3JrYmVuY2ggcHJlZmVyZW5jZSBtYXkgbm90IGJlIG5lZWRlZCBzbyBsZWF2ZSBvdXQgZm9yIG5vdwotCQkvLyAvLyBubyBwcmVmZXJlbmNlcyBmb3VuZCAtIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLAotCQkvLyAvLyBzaG9ydC1jaXJjdWl0Ci0JCS8vIC8vIGxvb2t1cCBieSBmYWxsaW5nIGJhY2sgdG8gd29ya3NwYWNlJ3MgZGVmYXVsdAotCQkvLyAvLyBzZXR0aW5nCi0JCS8vIGlmICghcHJlZmVyZW5jZUZvdW5kKQotCQkvLyB2YWwgPSBnZXRXb3JrYmVuY2hQcmVmZXJlbmNlKGtleSk7Ci0JCXJldHVybiB2YWw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGludGVybmFsR2V0UHJvcGVydHkoSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIHJlY3Vyc2UsIFByZWZlcmVuY2VzIHByZWZlcmVuY2VzKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IHByZWZlcmVuY2VzLmdldChnZXRLZXlGb3IocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSksIG51bGwpOwotCQlpZiAodmFsdWUgPT0gbnVsbCAmJiByZXNvdXJjZSAhPSByZXNvdXJjZS5nZXRQcm9qZWN0KCkgJiYgcmVjdXJzZSkgewotCQkJdmFsdWUgPSBwcmVmZXJlbmNlcy5nZXQoZ2V0S2V5Rm9yKG51bGwpLCBudWxsKTsKLQkJfQotCi0JCS8vIFdvcmtiZW5jaCBwcmVmZXJlbmNlIG1heSBub3QgYmUgbmVlZGVkIHNvIGxlYXZlIG91dCBmb3Igbm93Ci0JCS8vIC8vIGVuc3VyZSB3ZSBkZWZhdWx0IHRvIHRoZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZSBpZiBub25lIGlzIGZvdW5kCi0JCS8vIHJldHVybiB2YWx1ZSA9PSBudWxsID8gZ2V0V29ya2JlbmNoUHJlZmVyZW5jZShrZXkpIDogdmFsdWU7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSBpbiB0aGUgZ2l2ZW4gY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgcHJvcGVydHkga2V5Ci0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBjb250ZXh0LiBOb3RlIGNvbnRleHQgY2Fubm90IGJlCi0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSB2YWx1ZSB0byBzZXQgZm9yIHRoZSBrZXkuIElmIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICAgICB0aGUga2V5IGlzIHJlbW92ZWQgZnJvbSBwcm9wZXJ0aWVzLgotCSAqIEBzaW5jZSAxLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgdmFsdWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRQcmVmZXJlbmNlcyhwcm9qZWN0LCBrZXksIHRydWUpOwotCQkJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkJCQlwcmVmZXJlbmNlcy5yZW1vdmUoZ2V0S2V5Rm9yKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpKTsKLQkJCQllbHNlCi0JCQkJCXByZWZlcmVuY2VzLnB1dChnZXRLZXlGb3IocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSksIHZhbHVlKTsKLQkJCQl0cnkgewotCQkJCQkvLyBzYXZlIGNoYW5nZXMKLQkJCQkJcHJlZmVyZW5jZXMuZmx1c2goKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSFRNTENPUkVfSUQsIElTdGF0dXMuRVJST1IsICJVbmFibGUgdG8gc2V0IHByb3BlcnR5IiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIFdvcmtiZW5jaCBwcmVmZXJlbmNlIG1heSBub3QgYmUgbmVlZGVkIHNvIGxlYXZlIG91dCBmb3Igbm93Ci0JCS8vIGp1c3Qgc2V0IGEgcHJlZmVyZW5jZSBpbiB0aGUgaW5zdGFuY2Ugc2NvcGUKLQkJLy8gaWYgKCFwcmVmZXJlbmNlRm91bmQpIHsKLQkJLy8gc2V0V29ya2JlbmNoUHJlZmVyZW5jZShrZXkpOwotCQkvLyB9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0hUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9IVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZjAzYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0hUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5QcmVmZXJlbmNlczsKLQotcHVibGljIGNsYXNzIEhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXIgewotCXB1YmxpYyBIVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCQlmUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCWZKb2IgPSBuZXcgQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlciBfaW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgZlJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0JQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iIGZKb2I7Ci0KLQkvKioKLQkgKiBUaGlzIGpvYiBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIHRvIGFsbG93IHRoZSByZXNvdXJjZSBjaGFuZ2UgbGlzdGVuZXIKLQkgKiB0byBzY2hlZHVsZSBvcGVyYXRpb25zIHRoYXQgbmVlZCB0byBtb2RpZnkgdGhlIHdvcmtzcGFjZS4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlckpvYiBleHRlbmRzIEpvYiB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUSUVTX1VQREFURV9ERUxBWSA9IDUwMDsKLQkJcHJpdmF0ZSBMaXN0IGFzeW5jQ2hhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iKCkgewotCQkJc3VwZXIoSFRNTENvcmVNZXNzYWdlcy5IVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nKTsKLQkJCXNldFN5c3RlbSh0cnVlKTsKLQkJCXNldFByaW9yaXR5KEpvYi5JTlRFUkFDVElWRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VzKFNldCBuZXdDaGFuZ2VzKSB7Ci0JCQlpZiAobmV3Q2hhbmdlcy5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuOwotCQkJc3luY2hyb25pemVkIChhc3luY0NoYW5nZXMpIHsKLQkJCQlhc3luY0NoYW5nZXMuYWRkQWxsKG5ld0NoYW5nZXMpOwotCQkJCWFzeW5jQ2hhbmdlcy5ub3RpZnkoKTsKLQkJCX0KLQkJCXNjaGVkdWxlKFBST1BFUlRJRVNfVVBEQVRFX0RFTEFZKTsKLQkJfQotCi0JCXB1YmxpYyBJUHJvamVjdCBnZXROZXh0Q2hhbmdlKCkgewotCQkJc3luY2hyb25pemVkIChhc3luY0NoYW5nZXMpIHsKLQkJCQlyZXR1cm4gYXN5bmNDaGFuZ2VzLmlzRW1wdHkoKSA/IG51bGwgOiAoSVByb2plY3QpIGFzeW5jQ2hhbmdlcy5yZW1vdmUoYXN5bmNDaGFuZ2VzLnNpemUoKSAtIDEpOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJTXVsdGlTdGF0dXMgcmVzdWx0ID0gbmV3IE11bHRpU3RhdHVzKEhUTUxDb250ZW50UHJvcGVydGllcy5IVE1MQ09SRV9JRCwgSVJlc291cmNlU3RhdHVzLkZBSUxFRF9TRVRUSU5HX0NIQVJTRVQsIEhUTUxDb3JlTWVzc2FnZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZywgbnVsbCk7Ci0JCQltb25pdG9yID0gbW9uaXRvciA9PSBudWxsID8gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSA6IG1vbml0b3I7Ci0JCQl0cnkgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKEhUTUxDb3JlTWVzc2FnZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZywgYXN5bmNDaGFuZ2VzLnNpemUoKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJSVByb2plY3QgbmV4dDsKLQkJCQkJd2hpbGUgKChuZXh0ID0gZ2V0TmV4dENoYW5nZSgpKSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBqdXN0IGV4aXQgaWYgdGhlIHN5c3RlbSBpcyBzaHV0dGluZyBkb3duIG9yIGhhcwotCQkJCQkJLy8gYmVlbiBzaHV0IGRvd24KLQkJCQkJCS8vIGl0IGlzIHRvbyBsYXRlIHRvIGNoYW5nZSB0aGUgd29ya3NwYWNlIGF0IHRoaXMKLQkJCQkJCS8vIHBvaW50IGFueXdheQotCQkJCQkJaWYgKFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uub3NnaSIpLmdldFN0YXRlKCkgIT0gQnVuZGxlLkFDVElWRSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQkvLyBzYXZlIHRoZSBwcmVmZXJlbmNlcyBub2RlcwotCQkJCQkJCWlmIChuZXh0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQkJCS8vIHNhdmUgZG9jdW1lbnQgdHlwZSBwcmVmZXJlbmNlcwotCQkJCQkJCQlQcmVmZXJlbmNlcyBwcm9qZWN0UHJlZnMgPSBIVE1MQ29udGVudFByb3BlcnRpZXMuZ2V0UHJlZmVyZW5jZXMobmV4dCwgSFRNTENvbnRlbnRQcm9wZXJ0aWVzLkRPQ1VNRU5UX1RZUEUsIGZhbHNlKTsKLQkJCQkJCQkJaWYgKHByb2plY3RQcmVmcyAhPSBudWxsKQotCQkJCQkJCQkJcHJvamVjdFByZWZzLmZsdXNoKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gd2UgZ290IGFuIGVycm9yIHNhdmluZwotCQkJCQkJCVN0cmluZyBkZXRhaWxNZXNzYWdlID0gTkxTLmJpbmQoSFRNTENvcmVNZXNzYWdlcy5IVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1Byb2JsZW1zX1VwZGF0aW5nLCBuZXh0LmdldEZ1bGxQYXRoKCkpOwotCQkJCQkJCXJlc3VsdC5hZGQobmV3IFN0YXR1cygxIDw8IChJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX1NFVFRJTkdfQ0hBUlNFVCAlIDEwMCAvIDMzKSwgUmVzb3VyY2VzUGx1Z2luLlBJX1JFU09VUkNFUywgSVJlc291cmNlU3RhdHVzLkZBSUxFRF9TRVRUSU5HX0NIQVJTRVQsIGRldGFpbE1lc3NhZ2UsIGUpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNzaG91bGRSdW4oKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gc2hvdWxkUnVuKCkgewotCQkJc3luY2hyb25pemVkIChhc3luY0NoYW5nZXMpIHsKLQkJCQlyZXR1cm4gIWFzeW5jQ2hhbmdlcy5pc0VtcHR5KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc0VudHJ5Q2hhbmdlcyhJUmVzb3VyY2VEZWx0YSBwcm9qZWN0RGVsdGEsIFNldCBwcm9qZWN0c1RvU2F2ZSkgewotCQkJLy8gY2hlY2sgZWFjaCByZXNvdXJjZSB3aXRoIHdlYiBjb250ZW50IHNldHRpbmcgdG8gc2VlIGlmIGl0IGhhcwotCQkJLy8gYmVlbiBtb3ZlZC9kZWxldGVkCi0JCQlib29sZWFuIHJlc291cmNlQ2hhbmdlcyA9IGZhbHNlOwotCi0JCQkvLyBwcm9qZWN0IGFmZmVjdGVkCi0JCQlJUHJvamVjdCBjdXJyZW50UHJvamVjdCA9IChJUHJvamVjdCkgcHJvamVjdERlbHRhLmdldFJlc291cmNlKCk7Ci0KLQkJCXJlc291cmNlQ2hhbmdlcyA9IHByb2Nlc3NQcmVmZXJlbmNlcyhjdXJyZW50UHJvamVjdCwgSFRNTENvbnRlbnRQcm9wZXJ0aWVzLkRPQ1VNRU5UX1RZUEUsIHByb2plY3REZWx0YSwgcHJvamVjdHNUb1NhdmUpOwotCi0JCQkvLyBpZiB0aGVyZSB3YXMgYSBwcmVmZXJlbmNlIGtleSBjaGFuZ2UsIG5lZWQgdG8gc2F2ZSBwcmVmZXJlbmNlcwotCQkJaWYgKHJlc291cmNlQ2hhbmdlcykKLQkJCQlwcm9qZWN0c1RvU2F2ZS5hZGQoY3VycmVudFByb2plY3QpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdvZXMgdGhyb3VnaCBhbGwgdGhlIHJlc291cmNlLWRlcGVuZGVudCBwcmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGgKLQkJICogY3VycmVudFByb2plY3QgJiBrZXkgYW5kIHVwZGF0ZXMgdGhlIHByZWZlcmVuY2Uga2V5cyBpZiBuZWVkZWQKLQkJICogYmFzZWQgb24gcHJvamVjdERlbHRhCi0JCSAqIAotCQkgKiBAcGFyYW0gY3VycmVudFByb2plY3QKLQkJICogICAgICAgICAgICBjdXJyZW50IHByb2plY3Qgb2YgdGhlIHByZWZlcmVuY2VzIHRvIGJlIGxvb2tlZCBhdAotCQkgKiBAcGFyYW0ga2V5Ci0JCSAqICAgICAgICAgICAgY3VycmVudCBrZXkvc3ViY2F0ZWdvcnkgb2YgdGhlIHByZWZlcmVuY2VzIHRvIGJlIGxvb2tlZAotCQkgKiAgICAgICAgICAgIGF0Ci0JCSAqIEBwYXJhbSBwcm9qZWN0RGVsdGEKLQkJICogICAgICAgICAgICB0aGUgY2hhbmdlcyB0byBwcm9jZXNzIHRoZSBwcmVmZXJlbmNlIGtleXMgYWdhaW5zdAotCQkgKiBAcGFyYW0gcHJvamVjdHNUb1NhdmUKLQkJICogICAgICAgICAgICB0aGUgcHJvamVjdHMgdGhhdCBuZWVkIHRvIGJlIHVwZGF0ZWQvc2F2ZWQKLQkJICogQHJldHVybiB0cnVlIGlmIGN1cnJlbnRQcm9qZWN0J3MgcHJlZmVyZW5jZXMgd2VyZSBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NQcmVmZXJlbmNlcyhJUHJvamVjdCBjdXJyZW50UHJvamVjdCwgU3RyaW5nIGtleSwgSVJlc291cmNlRGVsdGEgcHJvamVjdERlbHRhLCBTZXQgcHJvamVjdHNUb1NhdmUpIHsKLQkJCWJvb2xlYW4gcmVzb3VyY2VDaGFuZ2VzID0gZmFsc2U7Ci0KLQkJCS8vIGdldCB0aGUgcHJvamVjdC1rZXkgcHJlZmVyZW5jZSBub2RlCi0JCQlQcmVmZXJlbmNlcyBwcm9qZWN0UHJlZnMgPSBIVE1MQ29udGVudFByb3BlcnRpZXMuZ2V0UHJlZmVyZW5jZXMoY3VycmVudFByb2plY3QsIGtleSwgZmFsc2UpOwotCQkJaWYgKHByb2plY3RQcmVmcyA9PSBudWxsKQotCQkJCS8vIG5vIHByZWZlcmVuY2VzIGZvciB0aGlzIHByb2plY3Qta2V5LCBqdXN0IGJhaWwKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlTdHJpbmdbXSBhZmZlY3RlZFJlc291cmNlczsKLQkJCXRyeSB7Ci0JCQkJYWZmZWN0ZWRSZXNvdXJjZXMgPSBwcm9qZWN0UHJlZnMua2V5cygpOwotCQkJfQotCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gcHJvYmxlbXMgd2l0aCB0aGUgcHJvamVjdCBzY29wZS4uLiB3ZSBnb25uYSBtaXNzIHRoZQotCQkJCS8vIGNoYW5nZXMgKGJ1dCB3aWxsIGxvZykKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiUHJvYmxlbSByZXRyZWl2aW5nIEpTUCBGcmFnbWVudCBwcmVmZXJlbmNlcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQkvLyBnbyB0aHJvdWdoIGVhY2ggcHJlZmVyZW5jZSBrZXkgKHdoaWNoIGlzIHJlYWxseSBhIGZpbGUgbmFtZSkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWZmZWN0ZWRSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBzZWUgaWYgcHJlZmVyZW5jZSBrZXkvZmlsZSBuYW1lIHdhcyBmaWxlIHRoYXQgd2FzIGNoYW5nZWQKLQkJCQlJUmVzb3VyY2VEZWx0YSBtZW1iZXJEZWx0YSA9IHByb2plY3REZWx0YS5maW5kTWVtYmVyKG5ldyBQYXRoKGFmZmVjdGVkUmVzb3VyY2VzW2ldKSk7Ci0JCQkJLy8gbm8gY2hhbmdlcyBmb3IgdGhlIGdpdmVuIHJlc291cmNlCi0JCQkJaWYgKG1lbWJlckRlbHRhID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChtZW1iZXJEZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQlyZXNvdXJjZUNoYW5nZXMgPSB0cnVlOwotCQkJCQkvLyByZW1vdmUgdGhlIHNldHRpbmcgZm9yIHRoZSBvcmlnaW5hbCBsb2NhdGlvbgotCQkJCQlTdHJpbmcgY3VycmVudFZhbHVlID0gcHJvamVjdFByZWZzLmdldChhZmZlY3RlZFJlc291cmNlc1tpXSwgbnVsbCk7Ci0JCQkJCXByb2plY3RQcmVmcy5yZW1vdmUoYWZmZWN0ZWRSZXNvdXJjZXNbaV0pOwotCQkJCQlpZiAoKG1lbWJlckRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9UTykgIT0gMCkgewotCQkJCQkJLy8gaWYgbW92aW5nLCBjb3B5IHRoZSBzZXR0aW5nIGZvciB0aGUgbmV3IGxvY2F0aW9uCi0JCQkJCQlJUHJvamVjdCB0YXJnZXRQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KG1lbWJlckRlbHRhLmdldE1vdmVkVG9QYXRoKCkuc2VnbWVudCgwKSk7Ci0JCQkJCQlQcmVmZXJlbmNlcyB0YXJnZXRQcmVmcyA9IEhUTUxDb250ZW50UHJvcGVydGllcy5nZXRQcmVmZXJlbmNlcyh0YXJnZXRQcm9qZWN0LCBrZXksIHRydWUpOwotCQkJCQkJdGFyZ2V0UHJlZnMucHV0KEhUTUxDb250ZW50UHJvcGVydGllcy5nZXRLZXlGb3IobWVtYmVyRGVsdGEuZ2V0TW92ZWRUb1BhdGgoKSksIGN1cnJlbnRWYWx1ZSk7Ci0JCQkJCQlpZiAodGFyZ2V0UHJvamVjdCAhPSBjdXJyZW50UHJvamVjdCkKLQkJCQkJCQlwcm9qZWN0c1RvU2F2ZS5hZGQodGFyZ2V0UHJvamVjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzb3VyY2VDaGFuZ2VzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEZvciBhbnkgY2hhbmdlIHRvIHRoZSBlbmNvZGluZyBmaWxlIG9yIGFueSByZXNvdXJjZSB3aXRoIGVuY29kaW5nCi0JCSAqIHNldCwganVzdCBkaXNjYXJkIHRoZSBjYWNoZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcHJvamVjdC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJSVJlc291cmNlRGVsdGFbXSBwcm9qZWN0RGVsdGFzID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJLy8gcHJvY2VzcyBlYWNoIHByb2plY3QgaW4gdGhlIGRlbHRhCi0JCQlTZXQgcHJvamVjdHNUb1NhdmUgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0RGVsdGFzLmxlbmd0aDsgaSsrKQotCQkJCS8vIG5vdGhpbmcgdG8gZG8gaWYgYSBwcm9qZWN0IGhhcyBiZWVuIGFkZGVkL3JlbW92ZWQvbW92ZWQKLQkJCQlpZiAocHJvamVjdERlbHRhc1tpXS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiAocHJvamVjdERlbHRhc1tpXS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuT1BFTikgPT0gMCkKLQkJCQkJcHJvY2Vzc0VudHJ5Q2hhbmdlcyhwcm9qZWN0RGVsdGFzW2ldLCBwcm9qZWN0c1RvU2F2ZSk7Ci0JCQlmSm9iLmFkZENoYW5nZXMocHJvamVjdHNUb1NhdmUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBzdGFydHVwKCkgewotCQlfaW5zdGFuY2UgPSBuZXcgSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcigpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihfaW5zdGFuY2UuZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHNodXRkb3duKCkgewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihfaW5zdGFuY2UuZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCQlfaW5zdGFuY2UgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMzU5ZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciB7Ci0KLQlwcm90ZWN0ZWQgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudG87Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSGVhZGVyUGFyc2VkOwotCi0JcHJvdGVjdGVkIFJlYWRlciBmUmVhZGVyOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vdGU6IG9uY2UgdGhpcyBpbnN0YW5jZSBpcyBjcmVhdGVkLCB0cmFjZSBpbmZvIHN0aWxsIG5lZWRzIHRvIGJlCi0JICogYXBwZW5kZWQgYnkgY2FsbGVyLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaXRzIGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGRldGVjdGVkQ2hhcnNldE5hbWUpKTsKLQkJZkVuY29kaW5nTWVtZW50by5zZXREZXRlY3RlZENoYXJzZXROYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyBUT0RPOiBpZiBkZXRlY3RlZENoYXJzZXQgYW5kIHNwZWMgZGVmYXVsdCBpcwotCQkvLyBudWxsLCBuZWVkIHRvIHVzZSAid29yawotCQkvLyBiZW5jaCBiYXNlZCIgZGVmYXVsdHMuCi0JCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHBhcmFtIHJlYXNvbgotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgU3RyaW5nIHJlYXNvbikgewotCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGVuc3VyZUlucHV0U2V0KCkgewotCQlpZiAoZlJlYWRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnB1dCBtdXN0IGJlIHNldCBiZWZvcmUgdXNlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4gbnVsbCwgaWYgaW52YWxpZCBjaGFyc2V0IG5hbWUgKGluIHdoaWNoIGNhc2UKLQkgKiAiYXBwcm9wcmlhdGVEZWZhdWx0IiBzaG91bGQgYmUgdXNlZCwgaWYgYSBuYW1lIGlzIHJlYWxseSBuZWVkIGZvciBzb21lCi0JICogInNhdmUgYW55d2F5IiBjYXNlcykuCi0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gMS4gQ2hlY2sgZXhwbGljaXQgbWFwcGluZyBvdmVycmlkZXMgZnJvbQotCQkvLyBwcm9wZXJ0eSBmaWxlIC0tIGl0cyBoZXJlIHdlIHBpY2sgdXAgInJ1bGVzIiBmb3IgY2FzZXMKLQkJLy8gdGhhdCBhcmUgbm90IGV2ZW4gaW4gSmF2YQotCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gMi4gVXNlIHRoZSAiY2Fub25pY2FsIiBuYW1lIGZyb20gSlJFIG1hcHBpbmdzCi0JCS8vIE5vdGU6IHNlZSBDaGFyc2V0IEphdmFEb2MsIHRoZSBuYW1lIHlvdSBnZXQgb25lCi0JCS8vIHdpdGggY2FuIGJlIGFsaWFzLAotCQkvLyB0aGUgbmFtZSB5b3UgZ2V0IGJhY2sgaXMgInN0YW5kYXJkIiBuYW1lLgotCQlDaGFyc2V0IGphdmFDaGFyc2V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWphdmFDaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotCQkJLy8gb25seSBzZXQgaW52YWxpZCwgaWYgcmVzdWx0IGlzIHNhbWUgYXMgZGV0ZWN0ZWQgLS0gdGhleSB3b24ndAotCQkJLy8gYmUgZXF1YWwgaWYKLQkJCS8vIG92ZXJyaWRkZW4KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldE5hbWUpKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50by5zZXRJbnZhbGlkRW5jb2RpbmcoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfQotCQkvLyBnaXZlIHByaW9yaXR5IHRvIGphdmEgY29ub25pY2FsIG5hbWUsIGlmIHByZXNlbnQKLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGphdmFDaGFyc2V0Lm5hbWUoKTsKLQkJCS8vIGJ1dCBzdGlsbCBhbGxvdyBvdmVycmlkZXMKLQkJCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldEVuY29kaW5nTWVtZW50bygpLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQl9Ci0KLQkvLyB0byBlbnN1cmUgY29uc2lzdCBvdmVyYWxsIHJ1bGVzIHVzZWQsIHdlJ2xsIG1hcmsgYXMKLQkvLyBmaW5hbCwKLQkvLyBhbmQgcmVxdWlyZSBzdWJjbGFzc2VzIHRvIHByb3ZpZGUgY2VydGFpbiBwaWVjZXMgb2YKLQkvLyB0aGUKLQkvLyBpbXBsZW1lbnRhdGlvbgotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCQkvLyB3ZSBrZWVwIHRyYWNrIG9mIGlmIGhlYWRlcidzIGFscmVhZHkgYmVlbgotCQkJLy8gcGFyc2UsIHNvIGNhbiBtYWtlCi0JCQkvLyBtdWx0aXBsZSAnZ2V0JyBjYWxscywgd2l0aG91dCBjYXVzaW5nCi0JCQkvLyByZXBhcnNpbmcuCi0JCQlmSGVhZGVyUGFyc2VkID0gdHJ1ZTsKLQkJCS8vIE5vdGU6IHRoZXJlIGlzIGEgImhpZGRlbiBhc3N1bXB0aW9uIiBoZXJlCi0JCQkvLyB0aGF0IGFuIGVtcHR5Ci0JCQkvLyBzdHJpbmcgaW4gY29udGVudCBzaG91bGQgYmUgdHJlYXRlZCBzYW1lIGFzCi0JCQkvLyBub3QgcHJlc2VudC4KLQkJfQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQloYW5kbGVTcGVjRGVmYXVsdCgpOwotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCS8vIHNhZnR5IG5ldAotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBOdWxsTWVtZW50bygpOwotCQl9Ci0JCXJldHVybiBmRW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdG8gcmV0dXJuIGEgZGVmYXVsdCBlbmNvZGluZyAtLSBhcyBzcGVjaWZpZWQgYnkgYW4gaW5kdXN0cnkKLQkgKiBjb250ZW50IHR5cGUgc3BlYyAtLSB3aGVuIG5vdCBwcmVzZW50IGluIHRoZSBzdHJlYW0sIGZvciBleGFtcGxlLCBYTUwKLQkgKiBzcGVjaWZpZXMgVVRGLTgsIEpTUCBzcGVjaWZpZXMgSVNPLTg4NTktMS4gVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybgotCSAqIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCAic3BlYyBkZWZhdWx0Ii4KLQkgKi8KLQlhYnN0cmFjdCBwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgZW5jID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERUZBVUxUU19BU1NVTUVEX0ZPUl9FTVBUWV9JTlBVVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmMpOwotCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTcGVjRGVmYXVsdCgpIHsKLQkJU3RyaW5nIGVuY29kaW5nTmFtZTsKLQkJZW5jb2RpbmdOYW1lID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jb2RpbmdOYW1lICE9IG51bGwpIHsKLQkJCS8vIGNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmNvZGluZ05hbWUsCi0JCQkvLyBFbmNvZGluZ01lbWVudG8uVVNFRF9DT05URU5UX1RZUEVfREVGQVVMVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRKYXZhQ2hhcnNldE5hbWUoZW5jb2RpbmdOYW1lKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGVuY29kaW5nTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFdmVyeSBzdWJjbGFzcyBtdXN0IHByb3ZpZGUgYSB3YXkgdG8gcGFyc2UgdGhlIGlucHV0LiBUaGlzIG1ldGhvZCBoYXMKLQkgKiBzZXZlcmFsIGNyaXRpY2FsIHJlc3BvbnNpYmlsaXRpZXM6Ci0JICogPGxpPnNldCB0aGUgZkVuY29kaW5nTWVtZW50byBmaWVsZCBhcHByb3ByaWF0ZWx5LCBhY2NvcmRpbmcgdG8gdGhlCi0JICogcmVzdWx0cyBvZiB0aGUgcGFyc2Ugb2YgZlJlYWRlci48L2xpPgotCSAqIDxsaT5zZXQgZkhhcmRlclBhcnNlZCB0byB0cnVlLCB0byBhdm9pZCB3YXN0ZWQgcmUtcGFyc2luZy48L2xpPgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXRBbGwoKSB7Ci0JCWZSZWFkZXIgPSBudWxsOwotCQlmSGVhZGVyUGFyc2VkID0gZmFsc2U7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gbmV3IEJ5dGVSZWFkZXIoaW5wdXRTdHJlYW0pOwotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlIGtub3cgQnl0ZVJlYWRlcgotCQkJLy8gc3VwcG9ydHMgbWFya2luZwotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElTdG9yYWdlIGlTdG9yYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaVN0b3JhZ2UuZ2V0Q29udGVudHMoKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJlc2V0dGFibGVTdHJlYW0ubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlzZXQocmVzZXR0YWJsZVN0cmVhbSk7Ci0JCS8vIFRPRE8gd2UnbGwgbmVlZCB0byAicmVtZW1iZXIiIElGaWxlLCBvcgotCQkvLyBnZXQgaXRzIChvciBpdHMgcHJvamVjdCdzKSBzZXR0aW5ncywgaW4gY2FzZQotCQkvLyB0aG9zZSBhcmUgbmVlZGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVuIHRoZQotCQkvLyBlbmNvZGluZyBpcyBub3QgaW4gdGhlIGZpbGUgc3RyZWFtLgotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODE5OWIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLQotLyoqCi0gKiBUaGlzIGlzIGFuICJhZGFwdGVyIiBjbGFzcywgc2ltcGx5IHRvIGdldCBpbiBpbnB1dCBzdHJlYW0gdG8gYWN0IGxpa2UgYQotICogcmVhZGVyLiBXZSBjb3VsZCBub3QgdXNlIElucHV0U3RyZWFtUmVhZGVyIGRpcmVjdGx5IGJlY2F1c2UgaXRzIGludGVybmFsCi0gKiBidWZmZXJzIGFyZSBub3QgY29udHJvbGxhYmxlLCBhbmQgaXQgc29tZXRpbWVzIHB1bGxzIHRvbyBtdWNoIG91dCBvZiBpbnB1dAotICogc3RyZWFtIChldmVuIHdoZW4gaXQgd2Fzbid0IG5lZWRlZCBmb3Igb3VyIHB1cnBvc2VzKS4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIGhpZ2hseSBzcGVjaWFsaXplZCBhbmQgYnkgbm90IG1lYW5zIG1lYW50IHRvIGJlCi0gKiBnZW5lcmFsIHB1cnBvc2UuIEl0cyB1c2UgaXMgcmVzdHJpY3RlZCB0byB0aG9zZSBjYXNlcyB3aGVyZSB0aGUgaW5wdXQKLSAqIHN0cmVhbSBjYW4gYmUgcmVnYXJkZWQgYXMgYXNjaWkganVzdCBsb25nIGVub3VnaCB0byBkZXRlcm1pbmUgd2hhdCB0aGUgcmVhbAotICogZW5jb2Rpbmcgc2hvdWxkIGJlLgotICovCi0KLXB1YmxpYyBjbGFzcyBCeXRlUmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKLQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSBDb2RlZElPLk1BWF9CVUZfU0laRTsKLQotCXByb3RlY3RlZCBieXRlW10gZkJ1ZmZlcjsKLQotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBmSW5wdXRTdHJlYW07Ci0KLQlwcm90ZWN0ZWQgQnl0ZVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQnl0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQl0aGlzKGlucHV0U3RyZWFtLCBERUZBVUxUX0JVRkZFUl9TSVpFKTsKLQkJaWYgKCFpbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVSZWFkZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlc2V0dGFibGUgc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBpbnQgc2l6ZSkgewotCQl0aGlzLmZJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotCQlpZiAoIWlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVJlYWRlciBpcyByZXF1aXJlZCB0byBoYXZlIGEgcmVzZXR0YWJsZSBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuZkJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOwotCi0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLmZJbnB1dFN0cmVhbS5jbG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRBaGVhZExpbWl0KSB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLm1hcmsocmVhZEFoZWFkTGltaXQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBiMCA9IHRoaXMuZklucHV0U3RyZWFtLnJlYWQoKTsKLQkJcmV0dXJuIChiMCAmIDB4MDBGRik7Ci0JfQotCi0JcHVibGljIGludCByZWFkKGNoYXIgY2hbXSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGxlbmd0aCA+IHRoaXMuZkJ1ZmZlci5sZW5ndGgpIHsKLQkJCWxlbmd0aCA9IHRoaXMuZkJ1ZmZlci5sZW5ndGg7Ci0JCX0KLQotCQlpbnQgY291bnQgPSB0aGlzLmZJbnB1dFN0cmVhbS5yZWFkKHRoaXMuZkJ1ZmZlciwgMCwgbGVuZ3RoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCWludCBiMCA9IHRoaXMuZkJ1ZmZlcltpXTsKLQkJCS8vIHRoZSAweDAwRkYgaXMgdG8gImxvc2UiIHRoZSBuZWdhdGl2ZSBiaXRzIGZpbGxlZCBpbiB0aGUgYnl0ZSB0bwotCQkJLy8gaW50IGNvbnZlcnNpb24KLQkJCS8vIChhbmQgd2hpY2ggd291bGQgYmUgdGhlcmUgaWYgY2FzdCBkaXJlY3RseSBmcm9tIGJ5dGUgdG8gY2hhcikuCi0JCQljaGFyIGMwID0gKGNoYXIpIChiMCAmIDB4MDBGRik7Ci0JCQljaFtvZmZzZXQgKyBpXSA9IGMwOwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmZJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSA+IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLmZJbnB1dFN0cmVhbS5yZXNldCgpOwotCX0KLQotCXB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5mSW5wdXRTdHJlYW0uc2tpcChuKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNzA5ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklUZXh0Q29udGVudERlc2NyaWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotLyoqCi0gKiAKLSAqIENvbnRlbnREZXNjcmliZXJGb3JIVE1MCi0gKiAKLSAqIEEgZmV3IGRlc2lnbiBwcmluY2lwbGVzIHRvIHJlbWVtYmVyIHdpdGggY29udGVudCBkZXNjcmliZXJzOgotICogPHVsPiAKLSAqIDxsaT5SZW1lbWJlciBub3QgdG8gc3RvcmUgdmFsdWVzL2RhdGEgaW4gdGhlIGRlc2NyaXB0aW9ucyBhcnJheSBvZiBwcm9wZXJ0aWVzLCAKLSAqIGVzcGVjaWFsbHkgbm90IGxhcmdlIG9iamVjdHMhIGFuZCBldmVuIG5vIHZhbHVlIHRoYXQgaXMgYWxyZWFkeSB0aGUgZGVmYXVsdCB2YWx1ZSwgCi0gKiBzaW5jZSB0aG9zZSBkZXNjcmlwdGlvbiBwcm9wZXJ0aWVzIGFyZSBjYWNoZWQgcGVyIHNlc3Npb24sIHNvIGNhbiBhZGQgdXAgaW4gbWVtb3J5LiAKLSAqIDxsaT5SZW1lbWJlciB0aGF0IGEgQ29udGVudERlc2NyaWJlciBpbnN0YW5jZSBiZWNvbWVzIGEgInJvb3Qgb2JqZWN0IiBpbiB0aGUgCi0gKiBDb250ZW50RGVzY3JpYmVyTWFuYWdlciAodGhhdCBpcywgYWx3YXlzIGluIG1lbW9yeSwgbmV2ZXIgR0MnZCksIHNvIGl0IHNob3VsZCAKLSAqIG5vdCBoYXZlIGFueSBpbnN0YW5jZSBvciBzdGF0ZSBkYXRhIHNpbmNlIGl0IHdvdWxkIGFsd2F5cyBiZWNvbWUgc3RhbGUgYW5kIAotICogImhvbGQgb24iIHRvIG9iamVjdHMgdW5uZWNjZXNzYXJpbHkuIAotICogPC91bD4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudERlc2NyaWJlckZvckhUTUwgaW1wbGVtZW50cyBJVGV4dENvbnRlbnREZXNjcmliZXIgewotCi0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgUXVhbGlmaWVkTmFtZVtdIFNVUFBPUlRFRF9PUFRJT05TID0ge0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFR9OwotCi0JcHVibGljIGludCBkZXNjcmliZShJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCQkvLyBhc3N1bW1taW5nIHdlIHNob3VsZCByZXR1cm4gc2FtZSAndmFsaWRpdHknIHZhbHVlIHdlIGRpZAotCQkJLy8gd2hlbiBjYWxsZWQgYmVmb3JlLiAodGVjaG5pY2FsbHksIGNvdWxkIGJlIGEgcGVyZm9ybWFuY2UgaXNzdWUKLQkJCS8vIGluIGZ1dHVyZSwgc28gbWlnaHQgd2FudCB0byBjaGVjayBpZiBhbnkgJ29sIHZhbHVlIHdvdWxkCi0JCQkvLyBiZSBvayBoZXJlLgotCQkJcmVzdWx0ID0gY29tcHV0ZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBkZXNjcmliZShSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCi0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCWVsc2UgewotCQkJY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhjb250ZW50cywgZGVzY3JpcHRpb24pOwotCQkJLy8gYXNzdW1tbWluZyB3ZSBzaG91bGQgcmV0dXJuIHNhbWUgJ3ZhbGlkaXR5JyB2YWx1ZSB3ZSBkaWQKLQkJCS8vIHdoZW4gY2FsbGVkIGJlZm9yZS4gKHRlY2huaWNhbGx5LCBjb3VsZCBiZSBhIHBlcmZvcm1hbmNlIGlzc3VlCi0JCQkvLyBpbiBmdXR1cmUsIHNvIG1pZ2h0IHdhbnQgdG8gY2hlY2sgaWYgaGFyZCBjb2RlZCAndmFsaWQnIHdvdWxkCi0JCQkvLyBiZSBvayBoZXJlLgotCQkJcmVzdWx0ID0gY29tcHV0ZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFF1YWxpZmllZE5hbWVbXSBnZXRTdXBwb3J0ZWRPcHRpb25zKCkgewotCi0JCXJldHVybiBTVVBQT1JURURfT1BUSU9OUzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCWhhbmRsZUNhbGN1bGF0aW9ucyhkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRzCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCWhhbmRsZUNhbGN1bGF0aW9ucyhkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZVZhbGlkaXR5KElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCS8vIGN1cnJlbnRseSBubyBjb250ZW50cyBzcGVjaWZpYyBjaGVjayBmb3IgdmFsaWQgSFRNTCBjb250ZW50cwotCQkvLyAodGhpcyBtYXkgY2hhbmdlIG9uY2Ugd2UgYWRkIFhIVE1MIGNvbnRlbnQgdHlwZSkKLQkJcmV0dXJuIElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZVZhbGlkaXR5KFJlYWRlciByZWFkZXIpIHsKLQkJLy8gY3VycmVudGx5IG5vIGNvbnRlbnRzIHNwZWNpZmljIGNoZWNrIGZvciB2YWxpZCBIVE1MIGNvbnRlbnRzCi0JCS8vICh0aGlzIG1heSBjaGFuZ2Ugb25jZSB3ZSBhZGQgWEhUTUwgY29udGVudCB0eXBlKQotCQlyZXR1cm4gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQl9Ci0KLQlwcml2YXRlIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBnZXREZXRlY3RvcigpIHsKLQotCQlyZXR1cm4gbmV3IEhUTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKTsKLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZXRlY3RvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2FsY3VsYXRpb25zKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gKChIVE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcikuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCS8vIFRPRE86IEkgbmVlZCB0byB2ZXJpZnkgdG8gc2VlIGlmIHRoaXMgQk9NIHdvcmsgaXMgYWx3YXlzIGRvbmUKLQkJLy8gYnkgdGV4dCB0eXBlLgotCQlPYmplY3QgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrID0gZW5jb2RpbmdNZW1lbnRvLmdldFVuaWNvZGVCT00oKTsKLQkJaWYgKGRldGVjdGVkQnl0ZU9yZGVyTWFyayAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdCeXRlT3JkZXJNYXJrID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspOwotCQkJLy8gbm90IHN1cmUgd2h5IHdvdWxkIGV2ZXIgYmUgZGlmZmVyZW50LCBzbyBpZiBpcyBkaWZmZXJlbnQsIG1heQotCQkJLy8gbmVlZCB0byAicHVzaCIgdXAgaW50byBiYXNlLgotCQkJaWYgKCFkZXRlY3RlZEJ5dGVPcmRlck1hcmsuZXF1YWxzKGV4aXN0aW5nQnl0ZU9yZGVyTWFyaykpCi0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIGRldGVjdGVkQnl0ZU9yZGVyTWFyayk7Ci0JCX0KLQotCi0JCWlmICghZW5jb2RpbmdNZW1lbnRvLmlzVmFsaWQoKSkgewotCQkJLyoKLQkJCSAqIG5vdGU6IGFmdGVyIHNldHRpbmcgaGVyZSwgaXRzIHRoZSBtZXJlIHByZXNlbmNlIG9mCi0JCQkgKiBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCBpbiB0aGUKLQkJCSAqIHJlc291cmNlJ3MgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgaW52YWxpZAotCQkJICogaW4gdGhvc2UgY2FzZXMsIHRoZSAiZGV0ZWN0ZWQiIHByb3BlcnR5IGNvbnRhaW5zIGFuCi0JCQkgKiAiYXBwcm9wcmlhdGUgZGVmYXVsdCIgdG8gdXNlLgotCQkJICovCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgZW5jb2RpbmdNZW1lbnRvLmdldEludmFsaWRFbmNvZGluZygpKTsKLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxULCBlbmNvZGluZ01lbWVudG8uZ2V0QXBwcm9wcmlhdGVEZWZhdWx0KCkpOwotCQl9Ci0KLQkJT2JqZWN0IGRldGVjdGVkQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JCU9iamVjdCBqYXZhQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQotCQkvLyB3ZSBhbHdheXMgaW5jbHVkZSBkZXRlY3RlZCwgaWYgaXRzIGRpZmZlcmVudCB0aGFuIGphdmEKLQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0KLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCU9iamVjdCBleGlzdGluZ0NoYXJzZXQgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpOwotCQkJaWYgKGphdmFDaGFyc2V0LmVxdWFscyhleGlzdGluZ0NoYXJzZXQpKSB7Ci0JCQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3ZSBtYXkgbmVlZCB0byBhZGQgd2hhdCB3ZSBmb3VuZCwgYnV0IG9ubHkgbmVlZCB0byBhZGQKLQkJCQkvLyBpZiBkaWZmZXJlbnQgZnJvbSBkZWZhdWx0LnRoZQotCQkJCU9iamVjdCBkZWZhdWx0Q2hhcnNldCA9IGRldGVjdG9yLmdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJCQlpZiAoZGVmYXVsdENoYXJzZXQgIT0gbnVsbCkgewotCQkJCQlpZiAoIWRlZmF1bHRDaGFyc2V0LmVxdWFscyhqYXZhQ2hhcnNldCkpIHsKLQkJCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBhc3N1bWluZyBpZiB0aGVyZSBpcyBubyBzcGVjIGRlZmF1bHQsIHdlIGFsd2F5cyBuZWVkIHRvCi0JCQkJCS8vIGFkZCwgSSdtIGFzc3VtaW5nCi0JCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgT2JqZWN0IGRldGVjdGVkQ2hhcnNldCwgT2JqZWN0IGphdmFDaGFyc2V0KSB7Ci0JCS8vIHNpbmNlIGVxdWFsLCB3ZSBkb24ndCBuZWVkIHRvIGFkZCwgYnV0IGlmIG91ciBkZXRlY3RlZCB2ZXJzaW9uIGlzCi0JCS8vIGRpZmZlcmVudCB0aGFuCi0JCS8vIGphdmFDaGFyc2V0LCB0aGVuIHdlIHNob3VsZCBhZGQgaXQuIFRoaXMgd2lsbCBoYXBwZW4sIGZvciBleGFtcGxlLAotCQkvLyBpZiB0aGVyZSdzCi0JCS8vIGRpZmZlcmVuY2VzIGluIGNhc2UsIG9yIGRpZmZlcmVuY2VzIGR1ZSB0byBvdmVycmlkZSBwcm9wZXJ0aWVzCi0JCWlmIChkZXRlY3RlZENoYXJzZXQgIT0gbnVsbCkgewotCQkJLy8gaWYgKCFkZXRlY3RlZENoYXJzZXQuZXF1YWxzKGphdmFDaGFyc2V0KSkgewotCQkJLy8gZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsCi0JCQkvLyBkZXRlY3RlZENoYXJzZXQpOwotCQkJLy8gfQotCi0JCQkvLyBPbmNlIHdlIGRldGVjdGVkIGEgY2hhcnNldCwgd2Ugc2hvdWxkIHNldCB0aGUgcHJvcGVydHkgZXZlbgotCQkJLy8gdGhvdWdoIGl0J3MgdGhlIHNhbWUgYXMgamF2YUNoYXJzZXQKLQkJCS8vIGJlY2F1c2UgdGhlcmUgYXJlIGNsaWVudHMgdGhhdCByZWx5IG9uIHRoaXMgcHJvcGVydHkgdG8KLQkJCS8vIGRldGVybWluZSBpZiB0aGUgY2hhcnNldCBpcyBhY3R1YWxseSBkZXRlY3RlZCBpbiBmaWxlIG9yIG5vdC4KLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBkZXRlY3RlZENoYXJzZXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1JlbGV2ZW50KElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCS8vIGVsc2UgaWYKLQkJLy8gKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5FTkNPRElOR19NRU1FTlRPKSkKLQkJLy8gcmVzdWx0ID0gdHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9FbmNvZGluZ0d1ZXNzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9FbmNvZGluZ0d1ZXNzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI0NjQzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRW5jb2RpbmdHdWVzc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLS8qKgotICogCi0gKiBUaGlzIGlzIHBvcnRlZCBmcm9tIFBhZ2VEZXNpZ25lcidzIGhwYmNvbS9LYW5qaS5jcHAncwotICogS2Fuamk6Omd1ZXNzX2thbmppX2NvZGUoKSwKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEVuY29kaW5nR3Vlc3NlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFTQ0lJID0gMDsgLy8gQVNDSUkKLQkvLyBJU08tMjAyMi1KUAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBU0NJSV9JTiA9IDg7IC8vIFRoaXMgaXMgYWZ0ZXIgSVNPMjAyMidzIGNoYW5nZQotCS8vIFNoaWZ0LUpJUwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVUNfSEFMRktBTkEgPSA2OyAvLyBUaGlzIGlzIEhhbGYgS2FuYSBpbiBFVUMtSlAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVVDX0pQID0gMzsgLy8gVGhpcyBpcyBFVUMtSlAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVNPMjAyMl9KUCA9IDQ7IC8vIFRoaXMgaXMgSVNPLTIwMjItSlAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSklTX0hBTEZLQU5BID0gNzsgLy8gVEhpcyBpcyBIYWxmIEthbmEgaW4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0VVQzEgPSAweDQwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfRVVDMiA9IChieXRlKSAweDgwOwotCS8vIEFTQ0lJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9KSU4gPSAweDAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfSk9VVCA9IDB4MDI7Ci0JLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9FU0MgPSAweDA0OwotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfSklTID0gMHgwODsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX1NGVDEgPSAweDEwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfU0ZUMiA9IDB4MjA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBrdHlwZVtdID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDAwICovCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMTAgKi8KLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDA4LCAweDA5LCAweDA4LCAweDA4LCAweDA4LCAvKiAhIiMkJSYnICovLyogIiAqLwotCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIC8qICgpKissLS4vICovCi0JMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgLyogMDEyMzQ1NjcgKi8KLQkweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAvKiA4OTo7IDw9Pj8gKi8KLQkweDI5LCAweDI4LCAweDJiLCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBAQUJDREVGRyAqLwotCTB4MmEsIDB4MjgsIDB4MmEsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIEhJSktMTU5PICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogUFFSU1RVVlcgKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBYWVpbXF1eXyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIGFiY2RlZmcgKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBoaWprbG1ubyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIHBxcnN0dXZ3ICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgwMCwgLyogeHl6e3x9fiAqLwotCTB4MjAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIC8qIDgwICovCi0JMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgLyogOTAgKi8KLQkweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDIwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgLyogQTAgKi8KLQkoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgLyogQjAgKi8KLQkoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgLyogQzAgKi8KLQkoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgLyogRDAgKi8KLQkoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgLyogRTAgKi8KLQkoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgLyogRjAgKi8KLQkoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGMwLCAoYnl0ZSkgMHhjMCwgMHgwMCx9OwotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJU084ODU5XzEgPSAxOyAvLyBJU08tMQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSElGVF9KSVMgPSAyOyAvLyBUaGlzIGlzIFNoaWZ0LUpJUwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSklTX0hBTEZLQU5BID0gNTsgLy8gVGhpcyBpcyBIYWxmIEthbmEgaW4KLQotCS8qKgotCSAqIEN1cnJlbnRseSwgb25seSBKYXBhbmVzZSBlbmNvZGluZ3MgYXJlIHN1cHBvcnRlZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTiA9IC0xOyAvLyBVbmtub3duCi0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29kZQotCSAqICAgICAgICAgICAgaW50Ci0JICogCi0JICogQ29udmVydCBwcml2YXRlIGludCB0byBJQU5BIEVuY29kaW5nIG5hbWUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0lBTkFFbmNvZGluZ05hbWUoaW50IGNvZGUpIHsKLQkJU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKLQotCQlzd2l0Y2ggKGNvZGUpIHsKLQkJCWNhc2UgU0hJRlRfSklTIDoKLQkJCWNhc2UgU0pJU19IQUxGS0FOQSA6Ci0JCQkJZW5jb2RpbmcgPSAiU2hpZnRfSklTIjsvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIEVVQ19KUCA6Ci0JCQljYXNlIEVVQ19IQUxGS0FOQSA6Ci0JCQkJZW5jb2RpbmcgPSAiRVVDLUpQIjsvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIElTTzIwMjJfSlAgOgotCQkJY2FzZSBKSVNfSEFMRktBTkEgOgotCQkJCWVuY29kaW5nID0gIklTTy0yMDIyLUpQIjsvLyROT04tTkxTLTEkCi0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBlbmNvZGluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gZ3Vlc3NlZCBKYXZhIEVuY29kaW5nIG5hbWUgdGFyZ2V0OiBieXRlcyB0byBiZSBpbnNwZWN0ZWQgbGVuZ3RoOgotCSAqIGxlbmd0aCBvZiB0YXJnZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWVzc0VuY29kaW5nKGJ5dGVbXSB0YXJnZXQsIGludCBsZW5ndGgpIHsKLQkJaW50IGNvZGUgPSBVTktOT1dOOwotCi0JCS8vIEN1cnJlbnRseSwgb25seSBKYXBhbmVzZSBpcyBzdXBwb3J0ZWQuCi0JCVN0cmluZyBzeXN0ZW1fY3R5cGUgPSBqYXZhLnV0aWwuTG9jYWxlLmdldERlZmF1bHQoKS5nZXRMYW5ndWFnZSgpOwotCQlTdHJpbmcganBfY3R5cGUgPSBqYXZhLnV0aWwuTG9jYWxlLkpBUEFORVNFLmdldExhbmd1YWdlKCk7Ci0JCWlmIChzeXN0ZW1fY3R5cGUuY29tcGFyZVRvKGpwX2N0eXBlKSA9PSAwKSB7Ci0JCQkvLyBPaywgSSdtIHVuZGVyIGphX0pQLgotCQkJY29kZSA9IEFTQ0lJOwotCQkJaW50IHBvcyA9IDA7Ci0JCQl3aGlsZSAoKGNvZGUgPT0gQVNDSUkpICYmIChsZW5ndGggPiAwKSkgewotCQkJCWludCBjaDEgPSB0YXJnZXRbcG9zXTsKLQkJCQljaDEgPSBjaDEgJiAweDAwMDAwMEZGOwotCQkJCWludCBjaDIgPSAobGVuZ3RoID49IDIpID8gdGFyZ2V0W3BvcyArIDFdIDogMDsKLQkJCQljaDIgPSBjaDIgJiAweDAwMDAwMEZGOwotCQkJCWludCBjaDMgPSAobGVuZ3RoID49IDMpID8gdGFyZ2V0W3BvcyArIDJdIDogMDsKLQkJCQljaDMgPSBjaDMgJiAweDAwMDAwMEZGOwotCQkJCWNvZGUgPSBndWVzc0phcGFuZXNlS2FuamlDb2RlKGNoMSwgY2gyLCBjaDMsIDApOwotCQkJCXBvcysrOwotCQkJCWxlbmd0aC0tOwotCQkJfQotCQkJc3dpdGNoIChjb2RlKSB7Ci0JCQkJY2FzZSBJU08yMDIyX0pQIDoKLQkJCQljYXNlIEpJU19IQUxGS0FOQSA6Ci0JCQkJCWNvZGUgPSBJU08yMDIyX0pQOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEVVQ19KUCA6Ci0JCQkJCWNvZGUgPSBFVUNfSlA7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQljb2RlID0gU0hJRlRfSklTOwotCQkJfQotCQl9Ci0JCXJldHVybiAoY29udmVydFRvSUFOQUVuY29kaW5nTmFtZShjb2RlKSk7Ci0JfQotCi0JLyoqCi0JICogR3Vlc3MgdGhlIGVuY29kaW5nLiBoYWxma2FuYV9mbGFnID0gMHgwMSAoIGRldGVjdCBTSklTIGhhbGYga2FuYSApCi0JICogaGFsZmthbmFfZmxhZyA9IDB4MDIgKCBkZXRlY3QgRVVDIGhhbGYga2FuYSApCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGd1ZXNzSmFwYW5lc2VLYW5qaUNvZGUoaW50IGNoMSwgaW50IGNoMiwgaW50IGNoMywgaW50IGhhbGZrYW5hX2ZsYWcpIHsKLQkJYm9vbGVhbiBzamlzX2hhbmtha3VfZmxhZyA9ICgoaGFsZmthbmFfZmxhZyAmIDB4MDEpICE9IDApID8gdHJ1ZSA6IGZhbHNlOwotCQlib29sZWFuIGV1Y19oYW5rYWt1X2ZsYWcgPSAoKGhhbGZrYW5hX2ZsYWcgJiAweDAyKSAhPSAwKSA/IHRydWUgOiBmYWxzZTsKLQotCQlpZiAoY2gxID09IDApCi0JCQlyZXR1cm4gVU5LTk9XTjsKLQkJaWYgKHNqaXNfaGFua2FrdV9mbGFnICYmIGNoMSA+PSAweGExICYmIGNoMSA8PSAweGRmKQotCQkJcmV0dXJuIFNKSVNfSEFMRktBTkE7Ci0JCWVsc2UgaWYgKGV1Y19oYW5rYWt1X2ZsYWcgJiYgY2gxID09IDB4OGUgJiYgY2gyID49IDB4YTEgJiYgY2gyIDw9IDB4ZGYpCi0JCQlyZXR1cm4gRVVDX0hBTEZLQU5BOwotCQllbHNlIGlmICgoKGt0eXBlW2NoMV0gJiBLVF9TRlQxKSAhPSAwKSAmJiAoKGt0eXBlW2NoMl0gJiBLVF9TRlQyKSAhPSAwKSkKLQkJCXJldHVybiBTSElGVF9KSVM7Ci0JCWVsc2UgaWYgKCgoa3R5cGVbY2gxXSAmIEtUX0VVQzEpICE9IDApICYmICgoa3R5cGVbY2gyXSAmIEtUX0VVQzIpICE9IDApKQotCQkJcmV0dXJuIEVVQ19KUDsKLQkJZWxzZSBpZiAoY2gxID09IDB4MWIgJiYgKChrdHlwZVtjaDJdICYgS1RfSklOKSAhPSAwKSkKLQkJCXJldHVybiBJU08yMDIyX0pQOwotCQllbHNlIGlmIChjaDEgPj0gMHhhMSAmJiBjaDEgPD0gMHhkZikKLQkJCXJldHVybiBTSklTX0hBTEZLQU5BOwotCQllbHNlIGlmIChjaDEgPT0gMHgxYiAmJiBjaDIgPT0gMHgyOC8qICcoJyAqLyYmIGNoMyA9PSAweDQ5LyogJ0knICovKQotCQkJcmV0dXJuIEpJU19IQUxGS0FOQTsKLQkJZWxzZSBpZiAoY2gxID09IDB4MWIgJiYgY2gyID09IDB4MjgvKiAnKCcgKi8mJiAoKGt0eXBlW2NoM10gJiBLVF9KT1VUKSAhPSAwKSkKLQkJCXJldHVybiBBU0NJSV9JTjsKLQotCQlyZXR1cm4gQVNDSUk7Ci0JfQotCi0JcHVibGljIEVuY29kaW5nR3Vlc3NlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTEhlYWRUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IVE1MSGVhZFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2U0OGYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IVE1MSGVhZFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDEvMjcvMDQgNjo0MSBQTSAqLwotCi0vKm5sc1hYWCovICAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5mb3JtYXRpay50dS1tdWVuY2hlbi5kZS9+a2xlaW5nL2pmbGV4LyI+SkZsZXg8L2E+IDEuMi4yCi0gKiBvbiAxLzI3LzA0IDY6NDEgUE0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovRDovRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvSFRNTEhlYWRUb2tlbml6ZXIuamZsZXg8L3R0PgotICovCi1wdWJsaWMgY2xhc3MgSFRNTEhlYWRUb2tlbml6ZXIgewotCi0JLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotCS8qKiBsZXhpY2FsIHN0YXRlcyAqLwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX01FVEFfVEFHID0gNDsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUlOSVRJQUwgPSAwOwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFVuRGVsaW1pdGVkU3RyaW5nID0gMTI7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRFFfU1RSSU5HID0gODsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTUV9TVFJJTkcgPSAxMDsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxEZWNsID0gMjsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBRdW90ZWRBdHRyaWJ1dGVWYWx1ZSA9IDY7Ci0KLQkvKioKLQkgKiBZWV9MRVhTVEFURVtsXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotCSAqIFlZX0xFWFNUQVRFW2wrMV0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLQkgKiAgICAgICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0JICogbCBpcyBvZiB0aGUgZm9ybSBsID0gMiprLCBrIGEgbm9uIG5lZ2F0aXZlIGludGVnZXIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgWVlfTEVYU1RBVEVbXSA9IHswLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3fTsKLQotCS8qKiAKLQkgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLQkgKi8KLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXljbWFwX3BhY2tlZCA9ICJcMTFcMFwxXDZcMVw3XDJcMFwxXDExXDIyXDBcMVwyMlwxXDBcMVw0MFwyXDAiICsgIlwxXDQ0XDFcMFwxXDQzXDVcMFwxXDM0XDFcMFwxXDQyXDEzXDBcMVw0NVwxXDEyIiArICJcMVwxMFwxXDMxXDFcMTNcMVwwXDFcMjFcMVwwXDFcMjRcMVwyNlwxXDE3XDFcMCIgKyAiXDFcMzBcMVwzMlwxXDI3XDJcMFwxXDE2XDFcMTVcMVwyM1wxXDI1XDFcMzNcMVwzNSIgKyAiXDJcMFwxXDIwXDFcMzZcMVwzN1wxXDBcMVwxNFwxXDQxXDdcMFwxXDIxXDFcMCIgKyAiXDFcMjRcMVwyNlwxXDE3XDFcMFwxXDMwXDFcMzJcMVwyN1wyXDBcMVwxNlwxXDE1IiArICJcMVwyM1wxXDI1XDFcMzNcMVwzNVwyXDBcMVwyMFwxXDM2XDFcMzdcMVwwXDFcMTQiICsgIlwxXDQxXDEwMVwwXDFcNFwzXDBcMVw1XDE3XDBcMVwzXDE2XDBcMVwxXDIwXDAiICsgIlwxXDNcMTZcMFwxXDFcMVwyXDE3MFwwXDFcMlx1ZmU4N1wwIjsKLQotCS8qKiAKLQkgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLQkgKi8KLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBjaGFyW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLQotCS8qIGVycm9yIGNvZGVzICovCi0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOwotCWZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotCWZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsKLQotCS8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7IlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLCAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UifTsKLQotCS8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLQkvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotCXByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0JLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLQlwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0JLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLQkgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0JcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOwotCi0JLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0JcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0JLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0JcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLQkvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotCS8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLQlwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLQkvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0JIGZyb20gaW5wdXQgKi8KLQlwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0KLQkvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0KLQkvKiogCi0JICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOwotCi0JLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQlwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLQkvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0JcHJpdmF0ZSBib29sZWFuIHl5X2VvZl9kb25lOwotCi0JLyogdXNlciBjb2RlOiAqLwotCi0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTW9yZSA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsKLQlTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsKLQlib29sZWFuIGZvdW5kQ29udGVudFR5cGVWYWx1ZSA9IGZhbHNlOwotCi0KLQotCXB1YmxpYyBIVE1MSGVhZFRva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChSZWFkZXIgaW4pIHsKLQkJLyogdGhlIGlucHV0IGRldmljZSAqLwotCQl5eV9yZWFkZXIgPSBpbjsKLQotCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JCXl5X3N0YXRlID0gMDsKLQotCQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0JCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLQkJLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotCQkgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0JCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKSAwKTsKLQotCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCQl5eV9tYXJrZWRQb3MgPSAwOwotCi0JCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0JCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotCQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLQkJeXlfY3VycmVudFBvcyA9IDA7Ci0KLQkJLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0JCXl5X3N0YXJ0UmVhZCA9IDA7Ci0KLQkJLyoqIAotCQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLQkJICogZnJvbSBpbnB1dCAKLQkJICovCi0JCXl5X2VuZFJlYWQgPSAwOwotCi0KLQkJLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCXl5Y2hhciA9IDA7Ci0KLQotCQkvKiogCi0JCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIAotCQkgKiBvZiBhIGxpbmUKLQkJICovCi0JCXl5X2F0Qk9MID0gZmFsc2U7Ci0KLQkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotCQl5eV9hdEVPRiA9IGZhbHNlOwotCi0JCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOwotCi0KLQkJZlN0YXRlU3RhY2suY2xlYXIoKTsKLQotCQloYXNNb3JlID0gdHJ1ZTsKLQotCQkvLyBpdHMgYSBsaXR0bGUgd2FzdGVmdWwgdG8gInRocm93IGF3YXkiIGZpcnN0IGNoYXIgYXJyYXkgZ2VuZXJhdGVkCi0JCS8vIGJ5IGNsYXNzIGluaXQgKHZpYSBhdXRvIGdlbmVyYXRlZCBjb2RlKSwgYnV0IHdlIHJlYWxseSBkbyB3YW50Ci0JCS8vIGEgc21hbGwgYnVmZmVyIGZvciBvdXIgaGVhZCBwYXJzZXJzLgotCQlpZiAoeXlfYnVmZmVyLmxlbmd0aCAhPSBNQVhfVE9fU0NBTikgewotCQkJeXlfYnVmZmVyID0gbmV3IGNoYXJbTUFYX1RPX1NDQU5dOwotCQl9Ci0KLQotCX0KLQotCi0JcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCUhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOwotCQlpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsKLQkJCXZhbHVlVGV4dCA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHl5dGV4dCgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7Ci0JCXJldHVybiBoYXNNb3JlICYmIHl5Y2hhciA8IE1BWF9UT19TQ0FOOwotCX0KLQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQotCXByaXZhdGUgSGVhZFBhcnNlclRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBuZXcgSGVhZFBhcnNlclRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0KTsKLQl9Ci0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0JICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotCSAqCi0JICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0JICovCi0JcHVibGljIEhUTUxIZWFkVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0JCXRoaXMueXlfcmVhZGVyID0gaW47Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotCSAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotCSAqCi0JICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLQkgKi8KLQlwdWJsaWMgSFRNTEhlYWRUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotCQl0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0JfQotCi0JLyoqIAotCSAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotCSAqCi0JICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0JICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotCQljaGFyW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0JCWludCBpID0gMDsgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLQkJaW50IGogPSAwOyAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotCQl3aGlsZSAoaSA8IDE3NCkgewotCQkJaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotCQkJY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLQkJCWRvCi0JCQkJbWFwW2orK10gPSB2YWx1ZTsKLQkJCXdoaWxlICgtLWNvdW50ID4gMCk7Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0KLQotCS8qKgotCSAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLgotCSAqCi0JICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlCi0JICogICAgICAgICAgICAgIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCi0JICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotCSAqLwotCXByaXZhdGUgaW50IHl5X2FkdmFuY2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLQkJLyogc3RhbmRhcmQgY2FzZSAqLwotCQlpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpCi0JCQlyZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0KLQkJLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLwotCQlpZiAoeXlfYXRFT0YpCi0JCQlyZXR1cm4gWVlFT0Y7Ci0KLQkJLyogb3RoZXJ3aXNlOiBuZWVkIHRvIHJlZmlsbCB0aGUgYnVmZmVyICovCi0KLQkJLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLQkJaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X2J1ZmZlciwgMCwgeXlfZW5kUmVhZCAtIHl5X3N0YXJ0UmVhZCk7Ci0KLQkJCS8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0JCQl5eV9lbmRSZWFkIC09IHl5X3N0YXJ0UmVhZDsKLQkJCXl5X2N1cnJlbnRQb3MgLT0geXlfc3RhcnRSZWFkOwotCQkJeXlfbWFya2VkUG9zIC09IHl5X3N0YXJ0UmVhZDsKLQkJCXl5X3B1c2hiYWNrUG9zIC09IHl5X3N0YXJ0UmVhZDsKLQkJCXl5X3N0YXJ0UmVhZCA9IDA7Ci0JCX0KLQotCQkvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0JCWlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLQkJCS8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotCQkJY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MgKiAyXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotCQkJeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotCQl9Ci0KLQkJLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0JCWludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCB5eV9idWZmZXIubGVuZ3RoIC0geXlfZW5kUmVhZCk7Ci0KLQkJaWYgKG51bVJlYWQgPT0gLTEpCi0JCQlyZXR1cm4gWVlFT0Y7Ci0KLQkJeXlfZW5kUmVhZCArPSBudW1SZWFkOwotCi0JCXJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQl9Ci0KLQotCS8qKgotCSAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotCSAqLwotCWZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXl5X2F0RU9GID0gdHJ1ZTsgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLQkJeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLQkJeXlfcmVhZGVyLmNsb3NlKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0JICovCi0JZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotCQlyZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotCSAqCi0JICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotCSAqLwotCWZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0JCXl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0JICovCi0JZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MgLSB5eV9zdGFydFJlYWQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotCQlyZXR1cm4geXlfbWFya2VkUG9zIC0geXlfc3RhcnRSZWFkOwotCX0KLQotCi0JLyoqCi0JICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0JICoKLQkgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotCSAqLwotCXByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotCQl0cnkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsKLQkJfQotCQljYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotCQl9Ci0KLQkJU3lzdGVtLmV4aXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLQkgKgotCSAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLQkgKgotCSAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotCSAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotCSAqLwotCXByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLQkJaWYgKG51bWJlciA+IHl5bGVuZ3RoKCkpCi0JCQl5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLQkJeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLQl9Ci0KLQotCS8qKgotCSAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLAotCSAqIHdoZW4gdGhlIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgeXlfZG9fZW9mKCkgewotCQlpZiAoIXl5X2VvZl9kb25lKSB7Ci0JCQl5eV9lb2ZfZG9uZSA9IHRydWU7Ci0JCQloYXNNb3JlID0gZmFsc2U7Ci0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLQkgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0JICoKLQkgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLQkgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0JICovCi0JcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlpbnQgeXlfaW5wdXQ7Ci0JCWludCB5eV9hY3Rpb247Ci0KLQotCQl3aGlsZSAodHJ1ZSkgewotCi0JCQl5eWNoYXIgKz0geXlsZW5ndGgoKTsKLQotCQkJeXlfYXRCT0wgPSB5eV9tYXJrZWRQb3MgPD0gMCB8fCB5eV9idWZmZXJbeXlfbWFya2VkUG9zIC0gMV0gPT0gJ1xuJzsKLQkJCWlmICgheXlfYXRCT0wgJiYgeXlfYnVmZmVyW3l5X21hcmtlZFBvcyAtIDFdID09ICdccicpIHsKLQkJCQl5eV9hdEJPTCA9IHl5X2FkdmFuY2UoKSAhPSAnXG4nOwotCQkJCWlmICgheXlfYXRFT0YpCi0JCQkJCXl5X2N1cnJlbnRQb3MtLTsKLQkJCX0KLQotCQkJeXlfYWN0aW9uID0gLTE7Ci0KLQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLQkJCWlmICh5eV9hdEJPTCkKLQkJCQl5eV9zdGF0ZSA9IFlZX0xFWFNUQVRFW3l5X2xleGljYWxfc3RhdGUgKyAxXTsKLQkJCWVsc2UKLQkJCQl5eV9zdGF0ZSA9IFlZX0xFWFNUQVRFW3l5X2xleGljYWxfc3RhdGVdOwotCi0KLQkJCXl5X2ZvckFjdGlvbiA6IHsKLQkJCQl3aGlsZSAodHJ1ZSkgewotCi0JCQkJCXl5X2lucHV0ID0geXlfYWR2YW5jZSgpOwotCi0JCQkJCWlmICh5eV9pbnB1dCA9PSBZWUVPRikKLQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQotCQkJCQl5eV9pbnB1dCA9IHl5Y21hcFt5eV9pbnB1dF07Ci0KLQkJCQkJYm9vbGVhbiB5eV9pc0ZpbmFsID0gZmFsc2U7Ci0JCQkJCWJvb2xlYW4geXlfbm9Mb29rQWhlYWQgPSBmYWxzZTsKLQotCQkJCQl5eV9mb3JOZXh0IDogewotCQkJCQkJc3dpdGNoICh5eV9zdGF0ZSkgewotCQkJCQkJCWNhc2UgMCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDIgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMyA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxMTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAxMCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxMjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDEgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDEgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gOTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAyIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDEwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTAgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxMSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxNTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAxNSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxNjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDMgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDI1IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxNzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAyNiA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzNCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxOTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzMiA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDUgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTAgOgotCQkJCQkJCQkJY2FzZSAyNSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTEgOgotCQkJCQkJCQkJY2FzZSAzNCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzMiA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxMCA6Ci0JCQkJCQkJCQljYXNlIDI1IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzNCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzNSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzYgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTAgOgotCQkJCQkJCQkJY2FzZSAyNSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTEgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDMwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMyIDoKLQkJCQkJCQkJCWNhc2UgMzUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDMxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDM3IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDMyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDMzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTAgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDEgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTEgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDQgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxMiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTMgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxMyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTAgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxNCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTMgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTEgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxNSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTYgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE2IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTkgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDI1IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0MzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDIxIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMjIgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0NDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAyNyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQ1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMjkgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDI1IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0NjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDMyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzMjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDM1IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA1IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0NzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDM2IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0ODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDM3IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzNzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAxMCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDM4IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxMSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzOTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDM5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxMiA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0OTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQxIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyMCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1MDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNiA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1MTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDQ0IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNDggOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE2IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDUyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNDkgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDEzIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDUzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNTAgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIxIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDU0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNTEgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDI3IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDU1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNTIgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE3IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDU2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNTMgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE0IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDU3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNTQgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIyIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDU4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNTUgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDI4IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDU5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNTYgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2MDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDU3IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2MTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDU4IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyMyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2MjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDU5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2MzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDYxIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2MTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDYyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxOSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2NDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDYzIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyOSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2NTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDY0IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyNCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2NjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDY1IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAzMCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2NzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDY2IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2NjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDY4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNjcgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIzIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDY5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNjggOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDY4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNjkgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDMxIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDcwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNzAgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDcwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNzE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA3MSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNzE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMjAgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNzI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzIgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNzM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA3MiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjEgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNzQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA3MyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjAgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNzI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA3NCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTkgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNzU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA3NSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTYgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNzY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA3NiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTUgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNzc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA3NyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTkgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNzg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA3OCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTYgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNzk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA3OSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjggOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gODA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA4MCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTYgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gODE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA4MSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMzMgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gODI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA4MiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjcgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gODM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA4MyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTUgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gODQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA4NCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gODU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzIgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gODY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA4NSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gODU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMjAgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gODc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA4NiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gODU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA4NyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjEgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gODg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA4OCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTkgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gODk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA4OSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTYgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gOTA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA5MCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTUgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gOTE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA5MSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTkgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gOTI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA5MiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTYgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gOTM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA5MyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gOTM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA5NDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDk0IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA5NDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJeXlfU2NhbkVycm9yKFlZX0lMTEVHQUxfU1RBVEUpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWlmICh5eV9pc0ZpbmFsKSB7Ci0JCQkJCQl5eV9hY3Rpb24gPSB5eV9zdGF0ZTsKLQkJCQkJCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7Ci0JCQkJCQlpZiAoeXlfbm9Mb29rQWhlYWQpCi0JCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0KLQotCQkJc3dpdGNoICh5eV9hY3Rpb24pIHsKLQotCQkJCWNhc2UgMjYgOgotCQkJCQl7Ci0JCQkJCQl5eXB1c2hiYWNrKDEpOwotCQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJCXZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOwotCQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7Ci0JCQkJCX0KLQkJCQljYXNlIDk2IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyMCA6Ci0JCQkJY2FzZSAyMSA6Ci0JCQkJCXsKLQkJCQkJCXl5cHVzaGJhY2soMSk7Ci0JCQkJCQl5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsKLQkJCQkJCXN0cmluZy5zZXRMZW5ndGgoMCk7Ci0JCQkJCX0KLQkJCQljYXNlIDk3IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxNyA6Ci0JCQkJCXsKLQkJCQkJCXl5YmVnaW4oWVlJTklUSUFMKTsKLQkJCQkJCWlmIChmb3VuZENvbnRlbnRUeXBlVmFsdWUpCi0JCQkJCQkJaGFzTW9yZSA9IGZhbHNlOwotCQkJCQkJcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdFbmQ7Ci0JCQkJCX0KLQkJCQljYXNlIDk4IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzMSA6Ci0JCQkJCXsKLQkJCQkJCXl5cHVzaGJhY2soMSk7Ci0JCQkJCQlwb3BTdGF0ZSgpOwotCQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsKLQkJCQkJfQotCQkJCWNhc2UgOTkgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDQzIDoKLQkJCQkJewotCQkJCQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQkJCQkJaWYgKGZvdW5kQ29udGVudFR5cGVWYWx1ZSkKLQkJCQkJCQloYXNNb3JlID0gZmFsc2U7Ci0JCQkJCQlyZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ0VuZDsKLQkJCQkJfQotCQkJCWNhc2UgMTAwIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0NSA6Ci0JCQkJCXsKLQkJCQkJCXl5cHVzaGJhY2soMik7Ci0JCQkJCQlwb3BTdGF0ZSgpOwotCQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsKLQkJCQkJfQotCQkJCWNhc2UgMTAxIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0NiA6Ci0JCQkJCXsKLQkJCQkJCXl5cHVzaGJhY2soMik7Ci0JCQkJCQlwb3BTdGF0ZSgpOwotCQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsKLQkJCQkJfQotCQkJCWNhc2UgMTAyIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA2MSA6Ci0JCQkJCXsKLQkJCQkJCWlmICh5eWNoYXIgPT0gMCkgewotCQkJCQkJCXl5YmVnaW4oU1RfWE1MRGVjbCk7Ci0JCQkJCQkJcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJY2FzZSAxMDMgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDggOgotCQkJCWNhc2UgOSA6Ci0JCQkJY2FzZSAxMCA6Ci0JCQkJY2FzZSAxMSA6Ci0JCQkJY2FzZSAxMiA6Ci0JCQkJY2FzZSAxMyA6Ci0JCQkJY2FzZSAxNCA6Ci0JCQkJY2FzZSAxNSA6Ci0JCQkJY2FzZSAxNiA6Ci0JCQkJY2FzZSAxOCA6Ci0JCQkJY2FzZSAxOSA6Ci0JCQkJY2FzZSAyMiA6Ci0JCQkJCXsKLQkJCQkJCWlmICh5eWNoYXIgPiBNQVhfVE9fU0NBTikgewotCQkJCQkJCWhhc01vcmUgPSBmYWxzZTsKLQkJCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuTUFYX0NIQVJTX1JFQUNIRUQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQljYXNlIDEwNCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNjAgOgotCQkJCQl7Ci0JCQkJCQl5eWJlZ2luKFNUX01FVEFfVEFHKTsKLQkJCQkJCXJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnU3RhcnQ7Ci0JCQkJCX0KLQkJCQljYXNlIDEwNSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDAgOgotCQkJCQl7Ci0JCQkJCQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JCQkJCQlyZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kOwotCQkJCQl9Ci0JCQkJY2FzZSAxMDYgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDk0IDoKLQkJCQkJewotCQkJCQkJcHVzaEN1cnJlbnRTdGF0ZSgpOwotCQkJCQkJeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7Ci0JCQkJCQlmb3VuZENvbnRlbnRUeXBlVmFsdWUgPSB0cnVlOwotCQkJCQkJcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdDb250ZW50VHlwZTsKLQkJCQkJfQotCQkJCWNhc2UgMTA3IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA2OCA6Ci0JCQkJCXsKLQkJCQkJCXB1c2hDdXJyZW50U3RhdGUoKTsKLQkJCQkJCXl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOwotCQkJCQkJcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7Ci0JCQkJCX0KLQkJCQljYXNlIDEwOCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzMgOgotCQkJCQl7Ci0JCQkJCQloYXNNb3JlID0gZmFsc2U7Ci0JCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTsKLQkJCQkJfQotCQkJCWNhc2UgMTA5IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzNCA6Ci0JCQkJCXsKLQkJCQkJCWhhc01vcmUgPSBmYWxzZTsKLQkJCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFOwotCQkJCQl9Ci0JCQkJY2FzZSAxMTAgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDQ3IDoKLQkJCQkJewotCQkJCQkJaGFzTW9yZSA9IGZhbHNlOwotCQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTsKLQkJCQkJfQotCQkJCWNhc2UgMTExIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOCA6Ci0JCQkJCXsKLQkJCQkJCXBvcFN0YXRlKCk7Ci0JCQkJCQl2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsKLQkJCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsKLQkJCQkJfQotCQkJCWNhc2UgMTEyIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyNSA6Ci0JCQkJY2FzZSAyNyA6Ci0JCQkJY2FzZSAyOSA6Ci0JCQkJY2FzZSAzMiA6Ci0JCQkJCXsKLQkJCQkJCXN0cmluZy5hcHBlbmQoeXl0ZXh0KCkpOwotCQkJCQl9Ci0JCQkJY2FzZSAxMTMgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDI0IDoKLQkJCQkJewotCQkJCQkJeXliZWdpbihTUV9TVFJJTkcpOwotCQkJCQkJc3RyaW5nLnNldExlbmd0aCgwKTsKLQkJCQkJfQotCQkJCWNhc2UgMTE0IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyMyA6Ci0JCQkJCXsKLQkJCQkJCXl5YmVnaW4oRFFfU1RSSU5HKTsKLQkJCQkJCXN0cmluZy5zZXRMZW5ndGgoMCk7Ci0JCQkJCX0KLQkJCQljYXNlIDExNSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzAgOgotCQkJCQl7Ci0JCQkJCQl5eXB1c2hiYWNrKDEpOwotCQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJCXZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOwotCQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7Ci0JCQkJCX0KLQkJCQljYXNlIDExNiA6Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLQkJCQkJCXl5X2F0RU9GID0gdHJ1ZTsKLQkJCQkJCXl5X2RvX2VvZigpOwotCQkJCQkJewotCQkJCQkJCWhhc01vcmUgPSBmYWxzZTsKLQkJCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLQkJCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUnVucyB0aGUgc2Nhbm5lciBvbiBpbnB1dCBmaWxlcy4KLQkgKgotCSAqIFRoaXMgbWFpbiBtZXRob2QgaXMgdGhlIGRlYnVnZ2luZyByb3V0aW5lIGZvciB0aGUgc2Nhbm5lci4KLQkgKiBJdCBwcmludHMgZWFjaCByZXR1cm5lZCB0b2tlbiB0byBTeXN0ZW0ub3V0IHVudGlsIHRoZSBlbmQgb2YKLQkgKiBmaWxlIGlzIHJlYWNoZWQsIG9yIGFuIGVycm9yIG9jY3VyZWQuCi0JICoKLQkgKiBAcGFyYW0gYXJndiAgIHRoZSBjb21tYW5kIGxpbmUsIGNvbnRhaW5zIHRoZSBmaWxlbmFtZXMgdG8gcnVuCi0JICogICAgICAgICAgICAgICB0aGUgc2Nhbm5lciBvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykgewotCQkJSFRNTEhlYWRUb2tlbml6ZXIgc2Nhbm5lciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNjYW5uZXIgPSBuZXcgSFRNTEhlYWRUb2tlbml6ZXIobmV3IGphdmEuaW8uRmlsZVJlYWRlcihhcmd2W2ldKSk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBub3QgZm91bmQgOiBcIiIgKyBhcmd2W2ldICsgIlwiIik7Ci0JCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCQl9Ci0JCQljYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlIDogamF2YSBIVE1MSGVhZFRva2VuaXplciA8aW5wdXRmaWxlPiIpOwotCQkJCVN5c3RlbS5leGl0KDEpOwotCQkJfQotCi0JCQl0cnkgewotCQkJCWRvIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHNjYW5uZXIucHJpbUdldE5leHRUb2tlbigpKTsKLQkJCQl9Ci0JCQkJd2hpbGUgKCFzY2FubmVyLnl5X2F0RU9GKTsKLQotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQW4gSS9PIGVycm9yIG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgOiIpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKLQkJCQlTeXN0ZW0uZXhpdCgxKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4YmNkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzIHsKLQotCVN0cmluZyBNZXRhVGFnRW5kID0gIk1ldGFUYWdFbmQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1ldGFUYWdTdGFydCA9ICJNZXRhVGFnU3RhcnQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1ldGFUYWdDb250ZW50VHlwZSA9ICJNZXRhVGFnQ29udGVudFR5cGUiOyAvLyROT04tTkxTLTEkCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hUTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQwMWQ5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCi0JcHJpdmF0ZSBIVE1MSGVhZFRva2VuaXplciBmVG9rZW5pemVyOwotCi0JLyoqCi0JICogVGhlcmUgaXMgbm8gc3BlYyBkZWZpbmVkIGVuY29kaW5nIGZvciBIVE1MIChoaXN0b3JpY2FsbHkpLCBzbyBudWxsIGlzCi0JICogcmV0dXJuZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtKFN0cmluZyB0b2tlblR5cGUpIHsKLQkJYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSBmYWxzZTsKLQkJaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT00pIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRVVEY4M0J5dGVCT01Vc2VkKHRydWUpOwotCQl9Ci0JCWVsc2UgaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSB0cnVlOwotCQkJU3RyaW5nIGVuYyA9ICJVVEYtMTZCRSI7IC8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTKTsKLQkJfQotCQllbHNlIGlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmMgPSAiVVRGLTE2IjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQl9Ci0JCXJldHVybiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW07Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB0b2tlbml6ZXIuCi0JICovCi0JcHJpdmF0ZSBIVE1MSGVhZFRva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCS8vIFRPRE86IG5lZWQgdG8gd29yayBvbiAncmVzZXQnIGluIHRva2VuaXplciwgc28gbmV3IGluc3RhbmNlIGlzbid0Ci0JCS8vIGFsd2F5cyBuZWVkZWQKLQkJLy9pZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCWZUb2tlbml6ZXIgPSBuZXcgSFRNTEhlYWRUb2tlbml6ZXIoKTsKLQkJLy8JCX0KLQkJcmV0dXJuIGZUb2tlbml6ZXI7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTGVnYWxTdHJpbmcoU3RyaW5nIHZhbHVlVG9rZW5UeXBlKSB7Ci0JCWlmICh2YWx1ZVRva2VuVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbHNlCi0JCQlyZXR1cm4gdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZUlucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJY2hlY2tJbkNvbnRlbnQoKTsKLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJY2hlY2tIZXVyaXN0aWNzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrSGV1cmlzdGljcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gbm9IZXVyaXN0aWMgPSBmYWxzZTsKLQkJU3RyaW5nIGhldXJpc3RpY0VuY29kaW5nID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZSZWFkZXIucmVzZXQoKTsKLQkJCWZSZWFkZXIubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQkJYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbQ29kZWRJTy5NQVhfTUFSS19TSVpFXTsKLQkJCWludCBuUmVhZCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZSZWFkZXIucmVhZHkoKSkgewotCQkJCQlpbnQgb25lQnl0ZSA9IGZSZWFkZXIucmVhZCgpOwotCQkJCQluUmVhZCsrOwotCQkJCQlpZiAob25lQnl0ZSA8PSAweEZGKSB7Ci0JCQkJCQlieXRlc1tpXSA9IChieXRlKSBvbmVCeXRlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbm9IZXVyaXN0aWMgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghbm9IZXVyaXN0aWMpIHsKLQkJCQloZXVyaXN0aWNFbmNvZGluZyA9IEVuY29kaW5nR3Vlc3Nlci5ndWVzc0VuY29kaW5nKGJ5dGVzLCBuUmVhZCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlmIGFueSBJTyBleGNlcHRpb24sIHRoZW4gbm90IGEgaGV1cmlzdGljIGNhc2UKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWZSZWFkZXIucmVzZXQoKTsKLQkJfQotCQlpZiAoaGV1cmlzdGljRW5jb2RpbmcgIT0gbnVsbCkgewotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGhldXJpc3RpY0VuY29kaW5nLCBFbmNvZGluZ01lbWVudG8uR1VFU1NFRF9FTkNPRElOR19GUk9NX1NUUkVBTSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0luQ29udGVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUhUTUxIZWFkVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2VuaXplcigpOwotCQl0b2tlbml6ZXIucmVzZXQoZlJlYWRlcik7Ci0JCUhlYWRQYXJzZXJUb2tlbiB0b2tlbiA9IG51bGw7Ci0JCVN0cmluZyB0b2tlblR5cGUgPSBudWxsOwotCQlTdHJpbmcgY29udGVudFR5cGVWYWx1ZSA9IG51bGw7Ci0JCWRvIHsKLQkJCXRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJdG9rZW5UeXBlID0gdG9rZW4uZ2V0VHlwZSgpOwotCQkJaWYgKGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSh0b2tlblR5cGUpKSB7Ci0JCQkJLy8gc2lkZSBlZmZlY3Qgb2YgY2FuSGFuZGxlIGlzIHRvIGNyZWF0ZSBhcHByb3ByaWF0ZQotCQkJCS8vIG1lbWVudG8KLQkJCX0KLQkJCWVsc2UgaWYgKHRva2VuVHlwZSA9PSBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnQ29udGVudFR5cGUpIHsKLQkJCQlpZiAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQlIZWFkUGFyc2VyVG9rZW4gdmFsdWVUb2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCQkJU3RyaW5nIHZhbHVlVG9rZW5UeXBlID0gdmFsdWVUb2tlbi5nZXRUeXBlKCk7Ci0JCQkJCWlmIChpc0xlZ2FsU3RyaW5nKHZhbHVlVG9rZW5UeXBlKSkgewotCQkJCQkJY29udGVudFR5cGVWYWx1ZSA9IHZhbHVlVG9rZW4uZ2V0VGV4dCgpOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSk7Ci0JCWlmIChjb250ZW50VHlwZVZhbHVlICE9IG51bGwpIHsKLQkJCXBhcnNlQ29udGVudFR5cGVWYWx1ZShjb250ZW50VHlwZVZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZUNvbnRlbnRUeXBlVmFsdWUoU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCVN0cmluZyBjaGFyc2V0ID0gbnVsbDsKLQkJUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCI7XFxzKmNoYXJzZXRcXHMqPVxccyoiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdbXSBwYXJ0cyA9IHBhdHRlcm4uc3BsaXQoY29udGVudFR5cGUpOwotCQlpZiAocGFydHMubGVuZ3RoID4gMCkgewotCQkJLy8gaWYgb25seSBvbmUgaXRlbSwgaXQgY2FuIHN0aWxsIGJlIGNoYXJzZXQgaW5zdGVhZCBvZgotCQkJLy8gY29udGVudFR5cGUKLQkJCWlmIChwYXJ0cy5sZW5ndGggPT0gMSkgewotCQkJCWlmIChwYXJ0c1swXS5sZW5ndGgoKSA+IDYpIHsKLQkJCQkJU3RyaW5nIGNoZWNrRm9yQ2hhcnNldCA9IHBhcnRzWzBdLnN1YnN0cmluZygwLCA3KTsKLQkJCQkJaWYgKGNoZWNrRm9yQ2hhcnNldC5lcXVhbHNJZ25vcmVDYXNlKCJjaGFyc2V0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaW50IGVxcG9zID0gcGFydHNbMF0uaW5kZXhPZignPScpOwotCQkJCQkJZXFwb3MgPSBlcXBvcyArIDE7Ci0JCQkJCQlpZiAoZXFwb3MgPCBwYXJ0c1swXS5sZW5ndGgoKSkgewotCQkJCQkJCWNoYXJzZXQgPSBwYXJ0c1swXS5zdWJzdHJpbmcoZXFwb3MpOwotCQkJCQkJCWNoYXJzZXQgPSBjaGFyc2V0LnRyaW0oKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vZkNvbnRlbnRUeXBlID0gcGFydHNbMF07Ci0JCQl9Ci0JCX0KLQkJaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHsKLQkJCWNoYXJzZXQgPSBwYXJ0c1sxXTsKLQkJfQotCQkKLQkJaWYgKGNoYXJzZXQgIT0gbnVsbCAmJiBjaGFyc2V0Lmxlbmd0aCgpID4gMCkgewotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGNoYXJzZXQsIEVuY29kaW5nTWVtZW50by5GT1VORF9FTkNPRElOR19JTl9DT05URU5UKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjE5MGJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IZWFkUGFyc2VyVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1wdWJsaWMgY2xhc3MgSGVhZFBhcnNlclRva2VuIHsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQlwcml2YXRlIFN0cmluZyBmVGV4dDsKLQlwcml2YXRlIFN0cmluZyBmVHlwZTsKLQotCXByb3RlY3RlZCBIZWFkUGFyc2VyVG9rZW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEhlYWRQYXJzZXJUb2tlbihTdHJpbmcgdHlwZSwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQl0aGlzKCk7Ci0JCWZUeXBlID0gdHlwZTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZUZXh0ID0gdGV4dDsKLQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIGZUZXh0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAoInRleHQ6ICIgKyBmVGV4dCArICIgb2Zmc2V0OiAiICsgZlN0YXJ0ICsgIiB0eXBlOiAiICsgZlR5cGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JbnRTdGFjay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YjhiYTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotLyoKLSAqIAotICogQSBub24tcmVzaXphYmxlIGNsYXNzIGltcGxlbWVudGluZyB0aGUgYmVoYXZpb3Igb2YgamF2YS51dGlsLlN0YWNrLCBidXQKLSAqIGRpcmVjdGx5IGZvciB0aGUgPGNvZGU+IGludGVnZXIgPC9jb2RlPiBwcmltaXRpdmUuCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEludFN0YWNrIHsKLQlwcml2YXRlIGludFtdIGxpc3QgPSBudWxsOwotCi0JcHJpdmF0ZSBpbnQgc2l6ZSA9IDA7Ci0KLQlwdWJsaWMgSW50U3RhY2soKSB7Ci0JCXRoaXMoMTAwKTsKLQl9Ci0KLQlwdWJsaWMgSW50U3RhY2soaW50IG1heGRlcHRoKSB7Ci0JCXN1cGVyKCk7Ci0JCWxpc3QgPSBuZXcgaW50W21heGRlcHRoXTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZW1wdHkoKSB7Ci0JCXJldHVybiBzaXplID09IDA7Ci0JfQotCi0JcHVibGljIGludCBnZXQoaW50IHNsb3QpIHsKLQkJcmV0dXJuIGxpc3Rbc2xvdF07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKLQkJCWxpc3RbaV0gPSAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgd2l0aG91dCByZW1vdmluZyBpdAotCSAqIAotCSAqIEByZXR1cm4gaW50IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5LgotCSAqLwotCXB1YmxpYyBpbnQgcGVlaygpIHsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCXJldHVybiBsaXN0W3NpemUgLSAxXTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFuZCByZXR1cm5zIHRoZSBpbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogQGV4Y2VwdGlvbiBFbXB0eVN0YWNrRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgd2hlbiBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgaW50IHBvcCgpIHsKLQkJaW50IHZhbHVlID0gcGVlaygpOwotCQlsaXN0W3NpemUgLSAxXSA9IC0xOwotCQlzaXplLS07Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQdXNoZXMgYW4gaXRlbSBvbnRvIHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VmFsdWUgLQotCSAqICAgICAgICAgICAgdGhlIGludCB0byBiZSBwdXNoZWQgb250byB0aGlzIHN0YWNrLgotCSAqIEByZXR1cm4gdGhlIDxjb2RlPm5ld1ZhbHVlPC9jb2RlPiBhcmd1bWVudC4KLQkgKi8KLQlwdWJsaWMgaW50IHB1c2goaW50IG5ld1ZhbHVlKSB7Ci0JCWlmIChzaXplID09IGxpc3QubGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgU3RhY2tPdmVyZmxvd0Vycm9yKCk7Ci0JCX0KLQkJbGlzdFtzaXplKytdID0gbmV3VmFsdWU7Ci0JCXJldHVybiBuZXdWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBsaXN0Lmxlbmd0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvTnVsbE1lbWVudG8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9OdWxsTWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTI0YzMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9OdWxsTWVtZW50by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Ob25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzOwotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIGFuIEVuY29kaW5nTWVtZW50byAoaXRzIHN1cGVyIGNsYXNzKSwKLSAqIHdoZW4gdGhlcmUgaXMgbm90IGluIGZhY3QgQU5ZIGVuY29kaW5nIGluZm9ybWF0aW9uLiBGb3IgZXhhbXBsZSwgd2hlbiBhCi0gKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgY3JlYXRlZCBkaXJlY3RseSBmcm9tIGEgU3RyaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsTWVtZW50byBleHRlbmRzIEVuY29kaW5nTWVtZW50byB7Ci0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBOdWxsTWVtZW50bygpIHsKLQkJc3VwZXIoKTsKLQkJU3RyaW5nIGRlZmF1bHRDaGFyc2V0ID0gTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcy51c2VEZWZhdWx0TmFtZVJ1bGVzKG51bGwpOwotCQlzZXRKYXZhQ2hhcnNldE5hbWUoZGVmYXVsdENoYXJzZXQpOwotCQlzZXRBcHByb3ByaWF0ZURlZmF1bHQoZGVmYXVsdENoYXJzZXQpOwotCQlzZXREZXRlY3RlZENoYXJzZXROYW1lKG51bGwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RPTVN0eWxlTW9kZWxJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NU3R5bGVNb2RlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMyZGUzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NU3R5bGVNb2RlbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDIsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRPTU1vZGVsSW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBAYXV0aG9yIGRhdmlkdwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBET01TdHlsZU1vZGVsSW1wbCBleHRlbmRzIERPTU1vZGVsSW1wbCB7Ci0JcHVibGljIERPTVN0eWxlTW9kZWxJbXBsKCkgewotCQkvLyByZW1lbWJlciwgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQgaW4gc3VwZXIgY29uc3RydWN0b3IsIAotCQkvLyB2aWEgaW50ZXJuYWxDcmVhdGVEb2N1bWVudAotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tRWRpdCgpIHsKLQkJcmVsZWFzZVN0eWxlU2hlZXRzKCk7Ci0JCXN1cGVyLnJlbGVhc2VGcm9tRWRpdCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tUmVhZCgpIHsKLQkJcmVsZWFzZVN0eWxlU2hlZXRzKCk7Ci0JCXN1cGVyLnJlbGVhc2VGcm9tUmVhZCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWxlYXNlU3R5bGVTaGVldHMoKSB7Ci0JCWlmICghaXNTaGFyZWQoKSkgewotCQkJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkb2MgaW5zdGFuY2VvZiBEb2N1bWVudFN0eWxlSW1wbCkgewotCQkJCSgoRG9jdW1lbnRTdHlsZUltcGwpIGRvYykucmVsZWFzZVN0eWxlU2hlZXRzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVEb2N1bWVudCBtZXRob2QKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkRvY3VtZW50Ci0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50IGludGVybmFsQ3JlYXRlRG9jdW1lbnQoKSB7Ci0JCURvY3VtZW50U3R5bGVJbXBsIGRvY3VtZW50ID0gbmV3IERvY3VtZW50U3R5bGVJbXBsKCk7Ci0JCWRvY3VtZW50LnNldE1vZGVsKHRoaXMpOwotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFN0eWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50U3R5bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYTkzOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50U3R5bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldExpc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuRG9jdW1lbnRDU1M7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3Q7Ci0KLS8qKgotICogQGF1dGhvciBkYXZpZHcKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRTdHlsZUltcGwgZXh0ZW5kcyBEb2N1bWVudEltcGwgaW1wbGVtZW50cyBJRE9NRG9jdW1lbnQsIERvY3VtZW50Q1NTIHsKLQlwdWJsaWMgRG9jdW1lbnRTdHlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIERvY3VtZW50U3R5bGVJbXBsKERvY3VtZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCXB1YmxpYyBDU1NTdHlsZURlY2xhcmF0aW9uIGdldE92ZXJyaWRlU3R5bGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSkgewotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuICgoSVN0eWxlU2hlZXRMaXN0QWRhcHRlcikgYWRhcHRlcikuZ2V0T3ZlcnJpZGVTdHlsZShlbGVtZW50LCBwc2V1ZG9OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3R5bGVTaGVldExpc3QgZ2V0U3R5bGVTaGVldHMoKSB7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldExpc3RBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKChJU3R5bGVTaGVldExpc3RBZGFwdGVyKSBhZGFwdGVyKS5nZXRTdHlsZVNoZWV0cygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VTdHlsZVNoZWV0cygpIHsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRFeGlzdGluZ0FkYXB0ZXIoSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCSgoSVN0eWxlU2hlZXRMaXN0QWRhcHRlcikgYWRhcHRlcikucmVsZWFzZVN0eWxlU2hlZXRzKCk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlRWxlbWVudCBtZXRob2QKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKiBAcGFyYW0gdGFnTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChTdHJpbmcgdGFnTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWNoZWNrVGFnTmFtZVZhbGlkaXR5KHRhZ05hbWUpOwotCi0JCUVsZW1lbnRTdHlsZUltcGwgZWxlbWVudCA9IG5ldyBFbGVtZW50U3R5bGVJbXBsKCk7Ci0JCWVsZW1lbnQuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJZWxlbWVudC5zZXRUYWdOYW1lKHRhZ05hbWUpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJRG9jdW1lbnRTdHlsZUltcGwgY2xvbmVkID0gbmV3IERvY3VtZW50U3R5bGVJbXBsKHRoaXMpOwotCQlpZiAoZGVlcCkKLQkJCWNsb25lZC5pbXBvcnRDaGlsZE5vZGVzKHRoaXMsIHRydWUpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE1vZGVsKElET01Nb2RlbCBtb2RlbCkgewotCQlzdXBlci5zZXRNb2RlbChtb2RlbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VsZW1lbnRTdHlsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbGVtZW50U3R5bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZTAzYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VsZW1lbnRTdHlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDIsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZURlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5FbGVtZW50Q1NTSW5saW5lU3R5bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTGlua1N0eWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQ7Ci0KLXB1YmxpYyBjbGFzcyBFbGVtZW50U3R5bGVJbXBsIGV4dGVuZHMgRWxlbWVudEltcGwgaW1wbGVtZW50cyBJRE9NRWxlbWVudCwgRWxlbWVudENTU0lubGluZVN0eWxlLCBMaW5rU3R5bGUgewotCXB1YmxpYyBFbGVtZW50U3R5bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBFbGVtZW50U3R5bGVJbXBsKEVsZW1lbnRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JcHVibGljIFN0eWxlU2hlZXQgZ2V0U2hlZXQoKSB7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3R5bGVTaGVldEFkYXB0ZXIpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKElTdHlsZVNoZWV0QWRhcHRlcikgYWRhcHRlcikuZ2V0U2hlZXQoKTsKLQl9Ci0KLQlwdWJsaWMgQ1NTU3R5bGVEZWNsYXJhdGlvbiBnZXRTdHlsZSgpIHsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyRm9yKElTdHlsZURlY2xhcmF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCEoYWRhcHRlciBpbnN0YW5jZW9mIElTdHlsZURlY2xhcmF0aW9uQWRhcHRlcikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuICgoSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyKSBhZGFwdGVyKS5nZXRTdHlsZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE93bmVyRG9jdW1lbnQoRG9jdW1lbnQgb3duZXJEb2N1bWVudCkgewotCQlzdXBlci5zZXRPd25lckRvY3VtZW50KG93bmVyRG9jdW1lbnQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRhZ05hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJc3VwZXIuc2V0VGFnTmFtZSh0YWdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUVsZW1lbnRJbXBsIGNsb25lZCA9IG5ldyBFbGVtZW50U3R5bGVJbXBsKHRoaXMpOwotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxDb252ZXJ0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxY2ZjYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5IVE1MQ2xlYW51cFByb2Nlc3NvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgSFRNTENvbnZlcnRlciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTENvbnZlcnRlcigpIHsKLQkJc3VwZXIoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBNb2RlbChJRE9NTW9kZWwgbW9kZWwpIHsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSFRNTENsZWFudXBQcm9jZXNzb3JJbXBsIHByb2Nlc3NvciA9IG5ldyBIVE1MQ2xlYW51cFByb2Nlc3NvckltcGwoKTsKLQkJSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgcHJlZiA9IHByb2Nlc3Nvci5nZXRDbGVhbnVwUHJlZmVyZW5jZXMoKTsKLQotCQkvLyBiYWNrdXAgb3B0aW9ucwotCQlib29sZWFuIGNvbXByZXNzRW1wdHlFbGVtZW50VGFncyA9IHByZWYuZ2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKCk7Ci0JCWJvb2xlYW4gaW5zZXJ0UmVxdWlyZWRBdHRycyA9IHByZWYuZ2V0SW5zZXJ0UmVxdWlyZWRBdHRycygpOwotCQlib29sZWFuIGluc2VydE1pc3NpbmdUYWdzID0gcHJlZi5nZXRJbnNlcnRNaXNzaW5nVGFncygpOwotCQlib29sZWFuIHF1b3RlQXR0clZhbHVlcyA9IHByZWYuZ2V0UXVvdGVBdHRyVmFsdWVzKCk7Ci0JCWJvb2xlYW4gZm9ybWF0U291cmNlID0gcHJlZi5nZXRGb3JtYXRTb3VyY2UoKTsKLQkJaW50IHRhZ05hbWVDYXNlID0gcHJlZi5nZXRUYWdOYW1lQ2FzZSgpOwotCQlpbnQgYXR0ck5hbWVDYXNlID0gcHJlZi5nZXRBdHRyTmFtZUNhc2UoKTsKLQotCQkvLyBzZXR1cCBvcHRpb25zCi0JCXByZWYuc2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKHRydWUpOwotCQlwcmVmLnNldEluc2VydFJlcXVpcmVkQXR0cnModHJ1ZSk7Ci0JCXByZWYuc2V0SW5zZXJ0TWlzc2luZ1RhZ3ModHJ1ZSk7Ci0JCXByZWYuc2V0UXVvdGVBdHRyVmFsdWVzKHRydWUpOwotCQlwcmVmLnNldEZvcm1hdFNvdXJjZShmYWxzZSk7Ci0JCWlmIChtb2RlbC5nZXREb2N1bWVudCgpLmlzWE1MVHlwZSgpKSB7IC8vIFhIVE1MCi0JCQlwcmVmLnNldFRhZ05hbWVDYXNlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJCXByZWYuc2V0QXR0ck5hbWVDYXNlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJfQotCQllbHNlIHsKLQkJCXByZWYuc2V0VGFnTmFtZUNhc2UoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVNJUyk7Ci0JCQlwcmVmLnNldEF0dHJOYW1lQ2FzZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJfQotCi0JCXByb2Nlc3Nvci5jbGVhbnVwTW9kZWwobW9kZWwpOwotCi0JCS8vIHNldCBiYWNrIG9wdGlvbnMKLQkJcHJlZi5zZXRDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MoY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKTsKLQkJcHJlZi5zZXRJbnNlcnRSZXF1aXJlZEF0dHJzKGluc2VydFJlcXVpcmVkQXR0cnMpOwotCQlwcmVmLnNldEluc2VydE1pc3NpbmdUYWdzKGluc2VydE1pc3NpbmdUYWdzKTsKLQkJcHJlZi5zZXRRdW90ZUF0dHJWYWx1ZXMocXVvdGVBdHRyVmFsdWVzKTsKLQkJcHJlZi5zZXRGb3JtYXRTb3VyY2UoZm9ybWF0U291cmNlKTsKLQkJcHJlZi5zZXRUYWdOYW1lQ2FzZSh0YWdOYW1lQ2FzZSk7Ci0JCXByZWYuc2V0QXR0ck5hbWVDYXNlKGF0dHJOYW1lQ2FzZSk7Ci0JfQotCi0JLyoqCi0JICogZGVjbGFyYXRvaW46ICJkYXRhIiBmb3IgWE1MIGRlY2xhcmF0aW9uLCBzdWNoIGFzICJ2ZXJzaW9uPVwiMS4wXCIiCi0JICogcHVibGljSWQ6IHB1YmxpY0lkIGZvciBET0NUWVBFIGRlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY29udmVydChJRE9NTW9kZWwgbW9kZWwsIFN0cmluZyBkZWNsYXJhdGlvbiwgU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlzZXREZWNsYXJhdGlvbihtb2RlbCwgZGVjbGFyYXRpb24sIHB1YmxpY0lkKTsKLQkJY2xlYW51cE1vZGVsKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBkZWNsYXJhdG9pbjogImRhdGEiIGZvciBYTUwgZGVjbGFyYXRpb24sIHN1Y2ggYXMgInZlcnNpb249XCIxLjBcIiIKLQkgKiBwdWJsaWNJZDogcHVibGljSWQgZm9yIERPQ1RZUEUgZGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb252ZXJ0KElucHV0U3RyZWFtIGlucHV0LCBPdXRwdXRTdHJlYW0gb3V0cHV0LCBTdHJpbmcgZGVjbGFyYXRpb24sIFN0cmluZyBwdWJsaWNJZCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSURPTU1vZGVsIG1vZGVsID0gcmVhZE1vZGVsKGlucHV0KTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQljb252ZXJ0KG1vZGVsLCBkZWNsYXJhdGlvbiwgcHVibGljSWQpOwotCQkJd3JpdGVNb2RlbChtb2RlbCwgb3V0cHV0KTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZGVjbGFyYXRvaW46ICJkYXRhIiBmb3IgWE1MIGRlY2xhcmF0aW9uLCBzdWNoIGFzICJ2ZXJzaW9uPVwiMS4wXCIiCi0JICogcHVibGljSWQ6IHB1YmxpY0lkIGZvciBET0NUWVBFIGRlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY29udmVydChJRmlsZSBmaWxlLCBTdHJpbmcgZGVjbGFyYXRpb24sIFN0cmluZyBwdWJsaWNJZCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSURPTU1vZGVsIG1vZGVsID0gcmVhZE1vZGVsKGZpbGUpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCWNvbnZlcnQobW9kZWwsIGRlY2xhcmF0aW9uLCBwdWJsaWNJZCk7Ci0JCQl3cml0ZU1vZGVsKG1vZGVsLCBmaWxlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbnNlcnRCcmVhayhJRE9NTW9kZWwgbW9kZWwsIE5vZGUgbm9kZSkgewotCQlpZiAobW9kZWwgPT0gbnVsbCB8fCBub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZ2V0IGRlbGltaXRlciBzdHJpbmcKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgZGVsaW0gPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcigpOwotCQlpZiAoZGVsaW0gPT0gbnVsbCB8fCBkZWxpbS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuOwotCi0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVRleHQgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRlbGltKTsKLQkJcGFyZW50Lmluc2VydEJlZm9yZSh0ZXh0LCBub2RlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElET01Nb2RlbCByZWFkTW9kZWwoSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCWlmIChpbnB1dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIGNyZWF0ZSB0ZW1wb3JhcnkgbW9kZWwKLQkJU3RyaW5nIGlkID0gaW5wdXQudG9TdHJpbmcoKSArICIuaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JFZGl0KGlkLCBpbnB1dCwgbnVsbCk7Ci0JCWlmICghKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKElET01Nb2RlbCkgbW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJRE9NTW9kZWwgcmVhZE1vZGVsKElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JFZGl0KGZpbGUpOwotCQlpZiAoIShtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkpIHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChJRE9NTW9kZWwpIG1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlY2xhcmF0aW9uKElET01Nb2RlbCBtb2RlbCwgU3RyaW5nIGRlY2xhcmF0aW9uLCBTdHJpbmcgcHVibGljSWQpIHsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRyeSB7Ci0JCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpID0gbnVsbDsKLQkJCU5vZGUgY2hpbGQgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSB7Ci0JCQkJU3RyaW5nIHRhcmdldCA9IGNoaWxkLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKHRhcmdldCAhPSBudWxsICYmIHRhcmdldC5lcXVhbHMoInhtbCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcGkgPSAoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBjaGlsZDsKLQkJCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCX0KLQkJCX0KLQkJCUlET01Eb2N1bWVudFR5cGUgZG9jVHlwZSA9IChJRE9NRG9jdW1lbnRUeXBlKSBkb2N1bWVudC5nZXREb2N0eXBlKCk7Ci0KLQkJCWlmIChkZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKHBpICE9IG51bGwpIHsKLQkJCQkJcGkuc2V0RGF0YShkZWNsYXJhdGlvbik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlwaSA9IGRvY3VtZW50LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbigieG1sIiwgZGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJCWRvY3VtZW50Lmluc2VydEJlZm9yZShwaSwgY2hpbGQpOwotCQkJCQlpbnNlcnRCcmVhayhtb2RlbCwgY2hpbGQpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHB1YmxpY0lkICE9IG51bGwpIHsKLQkJCQlIVE1MRG9jdW1lbnRUeXBlRW50cnkgZW50cnkgPSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRFbnRyeShwdWJsaWNJZCk7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoZW50cnkgIT0gbnVsbCA/IGVudHJ5LmdldE5hbWUoKSA6IG51bGwpOwotCQkJCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJCQluYW1lID0gIkhUTUwiOyAvLyBkZWZhdWx0IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoZG9jVHlwZSAhPSBudWxsKSB7Ci0JCQkJCWlmICghbmFtZS5lcXVhbHMoZG9jVHlwZS5nZXROYW1lKCkpKSB7IC8vIHJlcGxhY2UKLQkJCQkJCU5vZGUgcGFyZW50ID0gZG9jVHlwZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQljaGlsZCA9IGRvY1R5cGU7Ci0JCQkJCQlkb2NUeXBlID0gKElET01Eb2N1bWVudFR5cGUpIGRvY3VtZW50LmNyZWF0ZURvY3R5cGUobmFtZSk7Ci0JCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKGRvY1R5cGUsIGNoaWxkKTsKLQkJCQkJCXBhcmVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRvY1R5cGUgPSAoSURPTURvY3VtZW50VHlwZSkgZG9jdW1lbnQuY3JlYXRlRG9jdHlwZShuYW1lKTsKLQkJCQkJZG9jdW1lbnQuaW5zZXJ0QmVmb3JlKGRvY1R5cGUsIGNoaWxkKTsKLQkJCQkJaW5zZXJ0QnJlYWsobW9kZWwsIGNoaWxkKTsKLQkJCQl9Ci0JCQkJZG9jVHlwZS5zZXRQdWJsaWNJZChwdWJsaWNJZCk7Ci0JCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHN5c3RlbUlkID0gZW50cnkuZ2V0U3lzdGVtSWQoKTsKLQkJCQkJaWYgKHN5c3RlbUlkICE9IG51bGwpCi0JCQkJCQlkb2NUeXBlLnNldFN5c3RlbUlkKHN5c3RlbUlkKTsKLQkJCQkJU3RyaW5nIG5hbWVzcGFjZVVSSSA9IGVudHJ5LmdldE5hbWVzcGFjZVVSSSgpOwotCQkJCQlpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLQkJCQkJCUVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxucyIsIG5hbWVzcGFjZVVSSSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdyaXRlTW9kZWwoSURPTU1vZGVsIG1vZGVsLCBPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9kZWwgPT0gbnVsbCB8fCBvdXRwdXQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwuc2F2ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCB3cml0ZU1vZGVsKElET01Nb2RlbCBtb2RlbCwgSUZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vZGVsID09IG51bGwgfHwgZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dCA9IG51bGw7Ci0JCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vb3V0cHV0ID0gbmV3Ci0JCQkvLyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oc3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKTsKLQkJCW1vZGVsLnNhdmUoKTsKLQkJCS8vaW5wdXQgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0cHV0LnRvQnl0ZUFycmF5KCkpOwotCQkJLy9maWxlLnNldENvbnRlbnRzKGlucHV0LCB0cnVlLCB0cnVlLCBudWxsKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vCQkJaWYgKG91dHB1dCAhPSBudWxsKQotCQkJLy8JCQkJb3V0cHV0LmNsb3NlKCk7Ci0JCQlpZiAoaW5wdXQgIT0gbnVsbCkKLQkJCQlpbnB1dC5jbG9zZSgpOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjgwNmU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5IVE1MQ29udGVudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50VHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50VHlwZUFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlciBleHRlbmRzIERvY3VtZW50VHlwZUFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSFRNTERvY3VtZW50VHlwZUNvbnN0YW50cyB7Ci0KLQlwcml2YXRlIEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeSBmRmFjdG9yeSA9IG51bGw7Ci0JcHJpdmF0ZSBIVE1MRG9jdW1lbnRUeXBlRW50cnkgZW50cnkgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBpc1hNTFR5cGUgPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MID0gInhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgWEhUTUwgPSAieGh0bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFdNTCA9ICJ3bWwiOyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXIoSURPTURvY3VtZW50IGRvY3VtZW50LCBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlcihkb2N1bWVudCk7Ci0KLQkJdGhpcy5mRmFjdG9yeSA9IGZhY3Rvcnk7Ci0KLQkJLy8gaW5pdGlhbGl6ZQotCQlkb2N1bWVudFR5cGVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvY3VtZW50VHlwZUNoYW5nZWQoKSB7Ci0JCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlJRE9NTW9kZWwgbW9kZWwgPSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShtb2RlbCk7Ci0KLQkJLy8gZmluZCBET0NUWVBFIGRlbGNhcmF0aW9uIGFuZCBQdWJsaWMgSUQKLQkJU3RyaW5nIHB1YmxpY0lkID0gbnVsbDsKLQkJRG9jdW1lbnRUeXBlIG5ld0RvY3VtZW50VHlwZSA9IGZpbmREb2N1bWVudFR5cGUoZG9jdW1lbnQpOwotCQlpZiAobmV3RG9jdW1lbnRUeXBlICE9IG51bGwpIHsKLQkJCXB1YmxpY0lkID0gbmV3RG9jdW1lbnRUeXBlLmdldFB1YmxpY0lkKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBsb29rdXAgZGVmYXVsdCBzZXQgYnkgY29udGVudHNldHRpbmdzCi0JCQlwdWJsaWNJZCA9IEhUTUxDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShIVE1MQ29udGVudFByb3BlcnRpZXMuRE9DVU1FTlRfVFlQRSwgZmlsZSwgdHJ1ZSk7Ci0JCX0KLQotCQkvLyBsb29rdXAgRE9DVFlQRSByZWdpc3RyeQotCQlIVE1MRG9jdW1lbnRUeXBlRW50cnkgbmV3RW50cnkgPSBudWxsOwotCQlpZiAocHVibGljSWQgIT0gbnVsbCkgewotCQkJbmV3RW50cnkgPSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRFbnRyeShwdWJsaWNJZCk7Ci0JCX0KLQotCQlib29sZWFuIG5ld1hNTFR5cGUgPSAobmV3RW50cnkgIT0gbnVsbCA/IG5ld0VudHJ5LmlzWE1MVHlwZSgpIDogZmFsc2UpOwotCQlib29sZWFuIG5ld1dNTFR5cGUgPSAobmV3RW50cnkgIT0gbnVsbCA/IG5ld0VudHJ5LmlzV01MVHlwZSgpIDogZmFsc2UpOwotCi0JCWlmICghbmV3WE1MVHlwZSkgewotCQkJLy8gZmluZCBYTUwgZGVjbGFyYXRpb24KLQkJCWlmIChmaW5kWE1MTm9kZShkb2N1bWVudCkgIT0gbnVsbCkgewotCQkJCW5ld1hNTFR5cGUgPSB0cnVlOwotCQkJfQotCi0JCQkvLyBjaGVjayBmaWxlIGV4dGVuc2lvbgotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBleHQgPSBmaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCQlpZiAoZXh0ICE9IG51bGwgJiYgZXh0LmVxdWFsc0lnbm9yZUNhc2UoWEhUTUwpKSB7Ci0JCQkJCW5ld1hNTFR5cGUgPSB0cnVlOwotCQkJCX0KLQotCQkJCWlmIChleHQgIT0gbnVsbCAmJiBleHQuZXF1YWxzSWdub3JlQ2FzZShXTUwpKSB7Ci0JCQkJCW5ld1hNTFR5cGUgPSB0cnVlOwotCQkJCQluZXdXTUxUeXBlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCWlmIChuZXdFbnRyeSA9PSBudWxsKSB7Ci0JCQkvLyBsb29rdXAgc3lzdGVtIGRlZmF1bHQKLQkJCWlmIChuZXdYTUxUeXBlICYmIG5ld0RvY3VtZW50VHlwZSA9PSBudWxsKSB7Ci0JCQkJLy8gdXNlIGRlZmF1bHQgWEhUTUwsIGlmIGl0J3MgWE1MIGFuZCBubyBkb2N1bWVudCB0eXBlCi0JCQkJLy8gZGVjbGFyZWQKLQkJCQlpZiAobmV3V01MVHlwZSkKLQkJCQkJbmV3RW50cnkgPSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0RW50cnkoSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LkRFRkFVTFRfV01MKTsKLQkJCQllbHNlCi0JCQkJCW5ld0VudHJ5ID0gSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RGVmYXVsdEVudHJ5KEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5ERUZBVUxUX1hIVE1MKTsKLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmV3RW50cnkgPSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0RW50cnkoSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LkRFRkFVTFRfSFRNTCk7Ci0JCQl9Ci0JCQlpZiAobmV3RW50cnkgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIGVycm9yCi0JCX0KLQotCQlpZiAobmV3RG9jdW1lbnRUeXBlID09IG51bGwpIHsKLQkJCURvY3VtZW50VHlwZSBvbGREb2N1bWVudFR5cGUgPSBnZXREb2N1bWVudFR5cGUoKTsKLQkJCWlmIChvbGREb2N1bWVudFR5cGUgPT0gbnVsbCB8fCBvbGREb2N1bWVudFR5cGUuZ2V0TmFtZSgpICE9IG5ld0VudHJ5LmdldE5hbWUoKSkgewotCQkJCS8vIGNyZWF0ZSBpbXBsaWNpdCBEb2N1bWVudFR5cGUKLQkJCQlET01JbXBsZW1lbnRhdGlvbiBpbXBsID0gZG9jdW1lbnQuZ2V0SW1wbGVtZW50YXRpb24oKTsKLQkJCQlpZiAoaW1wbCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gbmV3RW50cnkuZ2V0TmFtZSgpOwotCQkJCQlwdWJsaWNJZCA9IG5ld0VudHJ5LmdldFB1YmxpY0lkKCk7Ci0JCQkJCVN0cmluZyBzeXN0ZW1JZCA9IG5ld0VudHJ5LmdldFN5c3RlbUlkKCk7Ci0JCQkJCW5ld0RvY3VtZW50VHlwZSA9IGltcGwuY3JlYXRlRG9jdW1lbnRUeXBlKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJYm9vbGVhbiBub3RpZnkgPSBmYWxzZTsKLQkJaWYgKHRoaXMuZW50cnkgIT0gbnVsbCkgeyAvLyBkbyBub3Qgbm90aWZ5IG9uIGluaXRpYWxpemF0aW9uCi0JCQlub3RpZnkgPSAobmV3RW50cnkgIT0gdGhpcy5lbnRyeSB8fCBuZXdYTUxUeXBlICE9IHRoaXMuaXNYTUxUeXBlKTsKLQkJfQotCi0JCWlmIChuZXdEb2N1bWVudFR5cGUgIT0gbnVsbCkKLQkJCXNldERvY3VtZW50VHlwZShuZXdEb2N1bWVudFR5cGUpOwotCQl0aGlzLmVudHJ5ID0gbmV3RW50cnk7Ci0JCXRoaXMuaXNYTUxUeXBlID0gbmV3WE1MVHlwZTsKLQotCQlpZiAobm90aWZ5KQotCQkJbm90aWZ5RG9jdW1lbnRUeXBlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSURPTURvY3VtZW50VHlwZSBmaW5kRG9jdW1lbnRUeXBlKElET01Eb2N1bWVudCBkb2N1bWVudCkgewotCQlJRE9NRG9jdW1lbnRUeXBlIGRvY3VtZW50VHlwZSA9IChJRE9NRG9jdW1lbnRUeXBlKSBkb2N1bWVudC5nZXREb2N0eXBlKCk7Ci0JCWlmIChkb2N1bWVudFR5cGUgIT0gbnVsbCAmJiBkb2N1bWVudFR5cGUuZ2V0RXhpc3RpbmdBZGFwdGVyKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpID09IG51bGwpIHsKLQkJCS8vIHdhdGNoIGZ1dHVyZSBjaGFuZ2VzCi0JCQlkb2N1bWVudFR5cGUuYWRkQWRhcHRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnRUeXBlOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgTm9kZSBmaW5kWE1MTm9kZShEb2N1bWVudCBkb2N1bWVudCkgewotCQlmb3IgKE5vZGUgY2hpbGQgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgdGFyZ2V0ID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCWlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQuZXF1YWxzKFhNTCkpIHsKLQkJCQlyZXR1cm4gY2hpbGQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRBdHRyTmFtZUNhc2UoKSB7Ci0JCWlmIChpc1hNTFR5cGUoKSkKLQkJCXJldHVybiBMT1dFUl9DQVNFOyAvLyBYSFRNTAotCQlyZXR1cm4gdGhpcy5mRmFjdG9yeS5nZXRBdHRyTmFtZUNhc2UoKTsKLQl9Ci0KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlJRmlsZSByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgbG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChsb2NhdGlvbik7Ci0JCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQlyZXN1bHQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRhZ05hbWVDYXNlKCkgewotCQlpZiAoaXNYTUxUeXBlKCkpCi0JCQlyZXR1cm4gTE9XRVJfQ0FTRTsgLy8gWEhUTUwKLQkJcmV0dXJuIHRoaXMuZkZhY3RvcnkuZ2V0VGFnTmFtZUNhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNGZWF0dXJlKFN0cmluZyBmZWF0dXJlKSB7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChmZWF0dXJlLmVxdWFscyhIVE1MKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZmVhdHVyZS5lcXVhbHMoU1NJKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZmVhdHVyZS5lcXVhbHMoRlJBTUVTRVQpKSB7Ci0JCQlpZiAodGhpcy5lbnRyeSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiB0aGlzLmVudHJ5Lmhhc0ZyYW1lc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzWE1MVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNYTUxUeXBlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgSURPTURvY3VtZW50KSB7Ci0JCQlpZiAoZXZlbnRUeXBlICE9IElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGV2ZW50VHlwZSAhPSBJTm9kZU5vdGlmaWVyLkNIQU5HRSkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZG9jdW1lbnRUeXBlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMTVlMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSU5vZGVBZGFwdGVyRmFjdG9yeSwgUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBpbnQgdGFnTmFtZUNhc2UgPSBEb2N1bWVudFR5cGVBZGFwdGVyLkxPV0VSX0NBU0U7Ci0JcHJpdmF0ZSBpbnQgYXR0ck5hbWVDYXNlID0gRG9jdW1lbnRUeXBlQWRhcHRlci5MT1dFUl9DQVNFOwotCXByaXZhdGUgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBudWxsOwotCi0JLy8gZm9yIHJlbW92YWwgbGF0ZXIgb24gcmVsZWFzZSgpCi0JcHJpdmF0ZSBIYXNoTWFwIGZEb2MyQWRhcHRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wcmVmZXJlbmNlcyA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCWlmICh0aGlzLnByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCXVwZGF0ZUNhc2VzKCk7IC8vIGluaXRpYWxpemUKLQkJCXRoaXMucHJlZmVyZW5jZXMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0aGF0IHJldHVybnMgdGhlIGFkYXB0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBvYmplY3QuIEl0Ci0JICogbWF5IGJlIGEgc2luZ2xldG9uIG9yIG5vdCAuLi4gZGVwZW5kaW5nIG9uIHRoZSBuZWVkcyBvZiB0aGUKLQkgKiBJTm9kZUFkYXB0ZXIgLi4uIGJ1dCBpbiBnZW5lcmFsIGl0IGlzIHJlY29tbWVuZGVkIGZvciBhbiBhZGFwdGVyIHRvIGJlCi0JICogc3RhdGVsZXNzLCBzbyB0aGUgZWZmaWNpZW5jaWVzIG9mIGEgc2luZ2xldG9uIGNhbiBiZSBnYWluZWQuCi0JICogCi0JICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBjYWxsIGFkZEFkYXB0ZXIgb24gdGhlIGFkYXB0ZWQKLQkgKiBvYmplY3Qgd2l0aCB0aGUgY29ycmVjdCBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyIGFkYXB0KElOb2RlTm90aWZpZXIgbm90aWZpZXIpIHsKLQkJSU5vZGVBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0JCS8vIG9ubHkgYWRhcHQgSURPTURvY3VtZW50Ci0JCWlmIChub3RpZmllciBpbnN0YW5jZW9mIElET01Eb2N1bWVudCkgewotCi0JCQkvLyBpZiBhbHJlYWR5IGhhcyBhbiBhZGFwdGVyLCBubyBuZWVkIHRvIHJlY3JlYXRlL2luaXRpYWxpemUuCi0JCQkvLyBOb3RlOiB0aGlzIG1lYW5zIGlmICJkb2N0eXBlIiBmb3IgRE9NIGNoYW5nZXMsCi0JCQkvLyB0aGVEb2N1bWVudFR5cGVBZGF0cGVyIGZvciB0aGF0IERPTQotCQkJLy8gc2hvdWxkIGJlIHJlbW92ZWQgKGFuZCByZWxlYXNlZCkgYW5kIGl0IHdpbGwgYmUgcmUtY3JlYXRlZCBuZXh0Ci0JCQkvLyB0aW1lIHJlcXVpcmVkLgotCQkJRG9jdW1lbnRUeXBlQWRhcHRlciBvbGRBZGFwdGVyID0gKERvY3VtZW50VHlwZUFkYXB0ZXIpIG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChvbGRBZGFwdGVyICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBvbGRBZGFwdGVyOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJCi0JCQkJLy8gaWYgdGhlcmUgYWxyZWFkeSB3YXMgYW4gYWRhcHRlcgotCQkJCS8vaWYoZkFkYXB0ZXIgIT0gbnVsbCkgCi0JCQkJLy8JZkFkYXB0ZXIucmVsZWFzZSgpOwotCQkJCQotCQkJCS8vIG5vdGUsIHRoZSBmYWN0b3J5IGlzIGluY2x1ZGVkIGluIHRoaXMgY2FzZSB0byBoYXZlIGEgY2VudHJhbCBwbGFjZQotCQkJCS8vIHRvIGNvbWUgYmFjayB0byBmb3IgY2FzZSBwcmVmZXJlbmNlcy4KLQkJCQlyZXN1bHQgPSBuZXcgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXIoKElET01Eb2N1bWVudCkgbm90aWZpZXIsIHRoaXMpOwotCQkJCW5vdGlmaWVyLmFkZEFkYXB0ZXIocmVzdWx0KTsKLQkJCQkKLQkJCQlmRG9jMkFkYXB0ZXJNYXAucHV0KG5vdGlmaWVyLCByZXN1bHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRBdHRyTmFtZUNhc2UoKSB7Ci0JCXJldHVybiB0aGlzLmF0dHJOYW1lQ2FzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRhZ05hbWVDYXNlKCkgewotCQlyZXR1cm4gdGhpcy50YWdOYW1lQ2FzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcmVmZXJlbmNlcy5Qcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgcHJvcGVydHkgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQlpZiAocHJvcGVydHkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAocHJvcGVydHkuZXF1YWxzKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBR19OQU1FX0NBU0UpIHx8IHByb3BlcnR5LmVxdWFscyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSkpIHsKLQkJCXVwZGF0ZUNhc2VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2FzZXMoKSB7Ci0JCXRoaXMudGFnTmFtZUNhc2UgPSBEb2N1bWVudFR5cGVBZGFwdGVyLkxPV0VSX0NBU0U7Ci0JCXRoaXMuYXR0ck5hbWVDYXNlID0gRG9jdW1lbnRUeXBlQWRhcHRlci5MT1dFUl9DQVNFOwotCi0JCWlmICh0aGlzLnByZWZlcmVuY2VzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaW50IHRhZ0Nhc2UgPSB0aGlzLnByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUdfTkFNRV9DQVNFKTsKLQkJaWYgKHRhZ0Nhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpCi0JCQl0aGlzLnRhZ05hbWVDYXNlID0gRG9jdW1lbnRUeXBlQWRhcHRlci5MT1dFUl9DQVNFOwotCQllbHNlIGlmICh0YWdDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJdGhpcy50YWdOYW1lQ2FzZSA9IERvY3VtZW50VHlwZUFkYXB0ZXIuVVBQRVJfQ0FTRTsKLQkJCi0JCWludCBhdHRDYXNlID0gdGhpcy5wcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UpOwotCQlpZiAoYXR0Q2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUikKLQkJCXRoaXMuYXR0ck5hbWVDYXNlID0gRG9jdW1lbnRUeXBlQWRhcHRlci5MT1dFUl9DQVNFOwotCQllbHNlIGlmIChhdHRDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJdGhpcy50YWdOYW1lQ2FzZSA9IERvY3VtZW50VHlwZUFkYXB0ZXIuVVBQRVJfQ0FTRTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkKLQkJaWYoIWZEb2MyQWRhcHRlck1hcC5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIGRvY3MgPSBmRG9jMkFkYXB0ZXJNYXAua2V5U2V0KCkudG9BcnJheSgpOwotCQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZG9jcy5sZW5ndGg7IGkrKykgewotCQkJCWFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcilmRG9jMkFkYXB0ZXJNYXAuZ2V0KGRvY3NbaV0pOwotCQkJCWFkYXB0ZXIucmVsZWFzZSgpOwotCQkJCSgoSURPTURvY3VtZW50KWRvY3NbaV0pLnJlbW92ZUFkYXB0ZXIoYWRhcHRlcik7Ci0JCQl9Ci0JCQlmRG9jMkFkYXB0ZXJNYXAuY2xlYXIoKTsKLQkJfQotCQkKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTk1OTYwCi0JCWlmICh0aGlzLnByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCXRoaXMucHJlZmVyZW5jZXMucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRpbmcgY29weSBtZXRob2QKLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gbmV3IEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjI2YzEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotcHVibGljIGludGVyZmFjZSBIVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEhUTUwgPSAiSFRNTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGUkFNRVNFVCA9ICJGUkFNRVNFVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTU0kgPSAiU1NJIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUVudHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMTU4ZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRG9jdW1lbnRUeXBlRW50cnkgewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIFN0cmluZyBwdWJsaWNJZDsKLQlwcml2YXRlIFN0cmluZyBzeXN0ZW1JZDsKLQlwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VVUkk7Ci0JcHJpdmF0ZSBib29sZWFuIGlzWE1MVHlwZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNYSFRNTFR5cGU7Ci0JcHJpdmF0ZSBib29sZWFuIGlzV01MVHlwZTsKLQlwcml2YXRlIGJvb2xlYW4gaGFzRnJhbWVzZXQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZGlzcGxheU5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdFhIVE1MOwotCXByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHRXTUw7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFhIVE1MX05BTUUgPSAiaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSFRNTF9OQU1FID0gIkhUTUwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBib29sZWFuIHVzZUludGVybmFsTW9kZWwgPSBmYWxzZTsKLQotCS8qKgotCSAqLwotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZUVudHJ5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBIVE1MRG9jdW1lbnRUeXBlRW50cnkoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBib29sZWFuIGlzWEhUTUxUeXBlLCBib29sZWFuIGhhc0ZyYW1lc2V0LCBTdHJpbmcgZGlzcGxheU5hbWUsIGJvb2xlYW4gaXNEZWZhdWx0WEhUTUwsIGJvb2xlYW4gaXNEZWZhdWx0V01MLCBib29sZWFuIGlzV01MVHlwZSkgewotCQl0aGlzKCk7Ci0KLQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmxlbmd0aCgpID4gMCkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChpc1hNTFR5cGUpCi0JCQkJdGhpcy5uYW1lID0gWEhUTUxfTkFNRTsvLyBuZWVkIGNvZGUgZm9yIHdtbD8KLQkJCWVsc2UKLQkJCQl0aGlzLm5hbWUgPSBIVE1MX05BTUU7Ci0JCX0KLQkJdGhpcy5wdWJsaWNJZCA9IHB1YmxpY0lkOwotCQl0aGlzLnN5c3RlbUlkID0gc3lzdGVtSWQ7Ci0JCXRoaXMubmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotCQl0aGlzLmlzWE1MVHlwZSA9IGlzWEhUTUxUeXBlIHwgaXNXTUxUeXBlOwotCQl0aGlzLmhhc0ZyYW1lc2V0ID0gaGFzRnJhbWVzZXQ7Ci0JCXRoaXMuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKLQkJdGhpcy5pc0RlZmF1bHRYSFRNTCA9IGlzRGVmYXVsdFhIVE1MOwotCQl0aGlzLmlzRGVmYXVsdFdNTCA9IGlzRGVmYXVsdFdNTDsKLQkJdGhpcy5pc1hIVE1MVHlwZSA9IGlzWEhUTUxUeXBlOwotCQl0aGlzLmlzV01MVHlwZSA9IGlzV01MVHlwZTsKLQl9Ci0JCi0JSFRNTERvY3VtZW50VHlwZUVudHJ5KFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgYm9vbGVhbiBpc1hIVE1MVHlwZSwgYm9vbGVhbiBoYXNGcmFtZXNldCwgU3RyaW5nIGRpc3BsYXlOYW1lLCBib29sZWFuIGlzRGVmYXVsdFhIVE1MLCBib29sZWFuIGlzRGVmYXVsdFdNTCwgYm9vbGVhbiBpc1dNTFR5cGUsIGJvb2xlYW4gdXNlSW50ZXJuYWxNb2RlbCkgewotCQl0aGlzKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCwgbmFtZXNwYWNlVVJJLCBpc1hIVE1MVHlwZSwgaGFzRnJhbWVzZXQsIGRpc3BsYXlOYW1lLCBpc0RlZmF1bHRYSFRNTCwgaXNEZWZhdWx0V01MLCBpc1dNTFR5cGUpOwotCQl0aGlzLnVzZUludGVybmFsTW9kZWwgPSB1c2VJbnRlcm5hbE1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlVVJJOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0JCXJldHVybiB0aGlzLnB1YmxpY0lkOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0JCXJldHVybiB0aGlzLnN5c3RlbUlkOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzWE1MVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNYTUxUeXBlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0ZyYW1lc2V0KCkgewotCQlyZXR1cm4gdGhpcy5oYXNGcmFtZXNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kaXNwbGF5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RlZmF1bHRYSFRNTCgpIHsKLQkJcmV0dXJuIHRoaXMuaXNEZWZhdWx0WEhUTUw7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEZWZhdWx0V01MKCkgewotCQlyZXR1cm4gdGhpcy5pc0RlZmF1bHRXTUw7Ci0JfQotCi0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1hIVE1MVHlwZSgpIHsKLQkJcmV0dXJuIGlzWEhUTUxUeXBlOwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzV01MVHlwZSgpIHsKLQkJcmV0dXJuIGlzV01MVHlwZTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gdXNlSW50ZXJuYWxNb2RlbCgpIHsKLQkJcmV0dXJuIHVzZUludGVybmFsTW9kZWw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZDcxZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5IGluc3RhbmNlID0gbnVsbDsKLQlwcml2YXRlIEhhc2h0YWJsZSBlbnRyaWVzID0gbnVsbDsKLQlwcml2YXRlIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBkZWZhdWx0RW50cnkgPSBudWxsOwotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZUVudHJ5IGRlZmF1bHRYSFRNTEVudHJ5ID0gbnVsbDsKLQlwcml2YXRlIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBkZWZhdWx0V01MRW50cnkgPSBudWxsOwotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZUVudHJ5IGRlZmF1bHRDSFRNTEVudHJ5ID0gbnVsbDsKLQotCWZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9IVE1MID0gMDsKLQlmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfWEhUTUwgPSAxOwotCWZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9XTUwgPSAyOwotCWZpbmFsIHN0YXRpYyBpbnQgREVGQVVMVF9DSFRNTCA9IDM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSFRNTF9QVUJMSUNfSUQgPSAiLS8vVzNDLy9EVEQgQ29tcGFjdCBIVE1MIDEuMCBEcmFmdC8vRU4iOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqLwotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCi0JCXRoaXMuZW50cmllcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJLy8gSFRNTCA0LjAxCi0JCVN0cmluZyBuYW1lID0gIkhUTUwiOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHB1YmxpY0lkID0gIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIjsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBzeXN0ZW1JZCA9ICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gIkhUTUwgNC4wMSBUcmFuc2l0aW9uYWwiOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZGVmYXVsdEVudHJ5ID0gbmV3IEhUTUxEb2N1bWVudFR5cGVFbnRyeShuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQsIG51bGwsIGZhbHNlLCBmYWxzZSwgZGlzcGxheU5hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQl0aGlzLmVudHJpZXMucHV0KHB1YmxpY0lkLCB0aGlzLmRlZmF1bHRFbnRyeSk7Ci0JCXB1YmxpY0lkID0gIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iOy8vJE5PTi1OTFMtMSQKLQkJc3lzdGVtSWQgPSAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI7Ly8kTk9OLU5MUy0xJAotCQlkaXNwbGF5TmFtZSA9ICJIVE1MIDQuMDEgU3RyaWN0IjsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmVudHJpZXMucHV0KHB1YmxpY0lkLCBuZXcgSFRNTERvY3VtZW50VHlwZUVudHJ5KG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBkaXNwbGF5TmFtZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotCQlwdWJsaWNJZCA9ICItLy9XM0MvL0RURCBIVE1MIDQuMDEgRnJhbWVzZXQvL0VOIjsvLyROT04tTkxTLTEkCi0JCXN5c3RlbUlkID0gImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2ZyYW1lc2V0LmR0ZCI7Ly8kTk9OLU5MUy0xJAotCQlkaXNwbGF5TmFtZSA9ICJIVE1MIDQuMDEgRnJhbWVzZXQiOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZW50cmllcy5wdXQocHVibGljSWQsIG5ldyBIVE1MRG9jdW1lbnRUeXBlRW50cnkobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkLCBudWxsLCBmYWxzZSwgdHJ1ZSwgZGlzcGxheU5hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLQkJLy8gQ0hUTUwKLQkJbmFtZSA9ICJIVE1MIjsvLyROT04tTkxTLTEkCi0JCXB1YmxpY0lkID0gQ0hUTUxfUFVCTElDX0lEOwotCQlkaXNwbGF5TmFtZSA9ICJDb21wYWN0IEhUTUwgMS4wIERyYWZ0IjsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmRlZmF1bHRDSFRNTEVudHJ5ID0gbmV3IEhUTUxEb2N1bWVudFR5cGVFbnRyeShuYW1lLCBwdWJsaWNJZCwgbnVsbCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBkaXNwbGF5TmFtZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCXRoaXMuZW50cmllcy5wdXQocHVibGljSWQsIHRoaXMuZGVmYXVsdENIVE1MRW50cnkpOwotCi0JCUhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeVJlYWRlciByZWFkZXIgPSBuZXcgSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5UmVhZGVyKCk7Ci0JCWlmIChyZWFkZXIgIT0gbnVsbCkKLQkJCXJlYWRlci5yZWFkUmVnaXN0cnkodGhpcyk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZWdpc3QoU3RyaW5nIHBpZCwgSFRNTERvY3VtZW50VHlwZUVudHJ5IGRvY3R5cGUpIHsKLQkJaWYgKHBpZCA9PSBudWxsIHx8IGRvY3R5cGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdGhpcy5lbnRyaWVzLnB1dChwaWQsIGRvY3R5cGUpOwotCQlpZiAodGhpcy5kZWZhdWx0WEhUTUxFbnRyeSA9PSBudWxsKSB7Ci0JCQlpZiAoZG9jdHlwZS5pc0RlZmF1bHRYSFRNTCgpKQotCQkJCXRoaXMuZGVmYXVsdFhIVE1MRW50cnkgPSBkb2N0eXBlOwotCQl9Ci0JCWlmICh0aGlzLmRlZmF1bHRXTUxFbnRyeSA9PSBudWxsKSB7Ci0JCQlpZiAoZG9jdHlwZS5pc0RlZmF1bHRXTUwoKSkKLQkJCQl0aGlzLmRlZmF1bHRXTUxFbnRyeSA9IGRvY3R5cGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSFRNTERvY3VtZW50VHlwZUVudHJ5IGdldERlZmF1bHRFbnRyeShpbnQgdHlwZSkgewotCQlIVE1MRG9jdW1lbnRUeXBlRW50cnkgZW50cnkgPSBudWxsOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgREVGQVVMVF9YSFRNTCA6Ci0JCQkJZW50cnkgPSB0aGlzLmRlZmF1bHRYSFRNTEVudHJ5OwotCQkJCWJyZWFrOwotCQkJY2FzZSBERUZBVUxUX1dNTCA6Ci0JCQkJZW50cnkgPSB0aGlzLmRlZmF1bHRXTUxFbnRyeTsKLQkJCQlicmVhazsKLQkJCWNhc2UgREVGQVVMVF9DSFRNTCA6Ci0JCQkJZW50cnkgPSB0aGlzLmRlZmF1bHRDSFRNTEVudHJ5OwotCQkJCWJyZWFrOwotCQkJY2FzZSBERUZBVUxUX0hUTUwgOgotCQkJZGVmYXVsdCA6Ci0JCQkJZW50cnkgPSB0aGlzLmRlZmF1bHRFbnRyeTsKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBnZXREZWZhdWx0RW50cnkoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRFbnRyeTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTERvY3VtZW50VHlwZUVudHJ5IGdldFhIVE1MRGVmYXVsdEVudHJ5KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0WEhUTUxFbnRyeTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gZ2V0RW50cmllcygpIHsKLQkJcmV0dXJuIHRoaXMuZW50cmllcy5lbGVtZW50cygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBIVE1MRG9jdW1lbnRUeXBlRW50cnkgZ2V0RW50cnkoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmIChwdWJsaWNJZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSFRNTERvY3VtZW50VHlwZUVudHJ5KSB0aGlzLmVudHJpZXMuZ2V0KHB1YmxpY0lkKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVSZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDE5OTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotLyoqCi0gKi8KLWNsYXNzIEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeVJlYWRlciB7Ci0KLQkvLwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiZG9jdW1lbnRUeXBlcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHX05BTUUgPSAiZG9jdW1lbnRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfUElEID0gInB1YmxpY0lEIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfU0lEID0gInN5c3RlbUlEIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfSVNfWEhUTUwgPSAiaXNYSFRNTCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX0lTX1dNTCA9ICJpc1dNTCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX0hBU19GUkFNRVNFVCA9ICJoYXNGcmFtZXNldCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX05TVVJJID0gIm5hbWVzcGFjZVVSSSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX0VOQU1FID0gImVsZW1lbnROYW1lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfRE5BTUUgPSAiZGlzcGxheU5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9JU19ERUZBVUxUX1hIVE1MID0gImRlZmF1bHRYSFRNTCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX0lTX0RFRkFVTFRfV01MID0gImRlZmF1bHRXTUwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVl9UUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVl9OVUxMX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKi8KLQlIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnlSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZWFkUmVnaXN0cnkoSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5IHJlZykgewotCQlpZiAocmVnID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSFRNTERvY3VtZW50VHlwZUVudHJ5IGRvY3R5cGUgPSByZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0JCQkJLy8gbnVsbCBjYW4gYmUgcmV0dXJuZWQgaWYgdGhlcmUncyBhbiBlcnJvciByZWFkaW5nIHRoZSBlbGVtZW50Ci0JCQkJaWYgKGRvY3R5cGUgIT0gbnVsbCkgewotCQkJCQlyZWcucmVnaXN0KGRvY3R5cGUuZ2V0UHVibGljSWQoKSwgZG9jdHlwZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBIVE1MRG9jdW1lbnRUeXBlRW50cnkgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJSFRNTERvY3VtZW50VHlwZUVudHJ5IGRvY3R5cGUgPSBudWxsOwotCQlTdHJpbmcgcGlkID0gbnVsbDsKLQkJU3RyaW5nIHNpZCA9IG51bGw7Ci0JCVN0cmluZyBuc3VyaSA9IG51bGw7Ci0JCVN0cmluZyByb290ID0gbnVsbDsKLQkJYm9vbGVhbiB4aHRtbCA9IHRydWU7Ci0JCWJvb2xlYW4gZnJhbWVzZXQgPSBmYWxzZTsKLQkJU3RyaW5nIGRuYW1lID0gbnVsbDsKLQkJYm9vbGVhbiBkZWZhdWx0WGh0bWwgPSBmYWxzZTsKLQkJYm9vbGVhbiBkZWZhdWx0V01MID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXNXTUwgPSBmYWxzZTsKLQotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19OQU1FKSkgewotCQkJcGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1BJRCk7Ci0JCQkvLyBwdWJsaWNJRCBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5LgotCQkJaWYgKHBpZCA9PSBudWxsIHx8IHBpZC5lcXVhbHMoQVRWX05VTExfU1RSSU5HKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJc2lkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1NJRCk7Ci0JCQluc3VyaSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OU1VSSSk7Ci0JCQlyb290ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0VOQU1FKTsKLQkJCXhodG1sID0gZ2V0Qm9vbGVhbihlbGVtZW50LCBBVFRfSVNfWEhUTUwpOwotCQkJZnJhbWVzZXQgPSBnZXRCb29sZWFuKGVsZW1lbnQsIEFUVF9IQVNfRlJBTUVTRVQpOwotCQkJZG5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfRE5BTUUpOwotCQkJZGVmYXVsdFhodG1sID0gZ2V0Qm9vbGVhbihlbGVtZW50LCBBVFRfSVNfREVGQVVMVF9YSFRNTCk7Ci0JCQlkZWZhdWx0V01MID0gZ2V0Qm9vbGVhbihlbGVtZW50LCBBVFRfSVNfREVGQVVMVF9XTUwpOwotCQkJaXNXTUwgPSBnZXRCb29sZWFuKGVsZW1lbnQsIEFUVF9JU19XTUwpOwotCQkJZG9jdHlwZSA9IG5ldyBIVE1MRG9jdW1lbnRUeXBlRW50cnkocm9vdCwgcGlkLCBzaWQsIG5zdXJpLCB4aHRtbCwgZnJhbWVzZXQsIGRuYW1lLCBkZWZhdWx0WGh0bWwsIGRlZmF1bHRXTUwsIGlzV01MKTsKLQkJfQotCQlyZXR1cm4gZG9jdHlwZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZ2V0Qm9vbGVhbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dCkgewotCQlTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHQpOwotCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHMoQVRWX1RSVUUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTE1vZGVsUGFyc2VyQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxNb2RlbFBhcnNlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUzMDU1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTE1vZGVsUGFyc2VyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ01Ob2RlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuTW9kZWxQYXJzZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5UYWdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTVRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEhUTUxEb2N1bWVudEltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIEhUTUxNb2RlbFBhcnNlckFkYXB0ZXIgaW1wbGVtZW50cyBNb2RlbFBhcnNlckFkYXB0ZXIgewotCS8qKgotCSAqIG5vdGU6IEkgbWFkZSBwdWJsaWMsIHRlbXBhcmlseSwgc28gY291bGQgYmUgdXNlZCBieSBKU1BMb2FkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgSFRNTE1vZGVsUGFyc2VyQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkVGVybWluYXRlQXQoQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBjaGlsZCkgewotCQlpZiAoIXBhcmVudC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlRFUk1JTkFUT1JTKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJamF2YS51dGlsLkl0ZXJhdG9yIGkgPSAoamF2YS51dGlsLkl0ZXJhdG9yKSBwYXJlbnQuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5URVJNSU5BVE9SUyk7Ci0JCWlmIChpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBuZXh0TmFtZSA9IGNoaWxkLmdldEVsZW1lbnROYW1lKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJLy8gTk9URTogQ01FbGVtZW50RGVjbGFyYXRpb24gb2YgY2hpbGQgaXMgbm90IGFsd2F5cyBIVE1MQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JCQkvLyBJdCBtaWdodCBiZSBvbmUgb2YgYmFzZWQgb24gRFREIChmb3IgWEhUTUwgZWxlbWVudCkuICBTbywgY29tcGFyaXNvbiBtdXN0Ci0JCQkvLyBiZSBwZXJmb3JtZWQgaWdub3JpbmcgY2FzZS4KLQkJCS8vIC0tIDMvMjAvMjAwMgotCQkJU3RyaW5nIHRlcm1pbmF0b3IgPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCWlmICh0ZXJtaW5hdG9yID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAobmV4dE5hbWUuZXF1YWxzSWdub3JlQ2FzZSh0ZXJtaW5hdG9yKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQ29udGFpbihFbGVtZW50IGVsZW1lbnQsIE5vZGUgY2hpbGQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCBjaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJRE9NRWxlbWVudCBpbXBsID0gKElET01FbGVtZW50KSBlbGVtZW50OwotCi0JCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlpZiAoIWltcGwuaXNHbG9iYWxUYWcoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsgLy8gbm9uIEhUTUwgdGFnCi0JCQlJRE9NRWxlbWVudCBjaGlsZEVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIGNoaWxkOwotCi0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBteURlYyA9IENNTm9kZVV0aWwuZ2V0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJaWYgKG15RGVjID09IG51bGwpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkvL2lmICghKG15RGVjIGluc3RhbmNlb2YgSFRNTEVsZW1lbnREZWNsYXJhdGlvbikpIHJldHVybiB0cnVlOwotCQkJaWYgKG15RGVjLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlpZiAoIWNoaWxkRWxlbWVudC5pc0dsb2JhbFRhZygpKQotCQkJCXJldHVybiB0cnVlOyAvLyBub24gSFRNTCB0YWcKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGNoaWxkRGVjID0gQ01Ob2RlVXRpbC5nZXRFbGVtZW50RGVjbGFyYXRpb24oY2hpbGRFbGVtZW50KTsKLQkJCWlmIChjaGlsZERlYyA9PSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCQkJLy9pZiAoIShjaGlsZERlYyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50RGVjbGFyYXRpb24pKSByZXR1cm4gdHJ1ZTsKLQotCQkJaWYgKG15RGVjIGluc3RhbmNlb2YgSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCWlmICgoKEJvb2xlYW4pICgoSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgbXlEZWMpLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuSVNfSlNQKSkuYm9vbGVhblZhbHVlKCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKHNob3VsZFRlcm1pbmF0ZUF0KG15RGVjLCBjaGlsZERlYykgJiYgIWlzVmFsaWRDaGlsZChteURlYywgY2hpbGREZWMpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlTdHJpbmcgdGFnTmFtZSA9IGltcGwuZ2V0VGFnTmFtZSgpOwotCQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCVN0cmluZyBjaGlsZE5hbWUgPSBjaGlsZEVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJaWYgKGNoaWxkTmFtZSA9PSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKCFpbXBsLmhhc1N0YXJ0VGFnKCkgJiYgIWltcGwuaGFzRW5kVGFnKCkpIHsKLQkJCQkvLyBpbXBsaWNpdCBlbGVtZW50Ci0JCQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShjaGlsZEVsZW1lbnQuZ2V0VGFnTmFtZSgpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQpKSB7Ci0JCQkJCWlmICghY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FVEEpICYmICFjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVElUTEUpICYmICFjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTElOSykgJiYgIWNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSkgJiYgIWNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFKSAmJiAhY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklTSU5ERVgpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlOb2RlIHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlJRE9NRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gKElET01FbGVtZW50KSBwYXJlbnQ7Ci0JCQkJCWlmICghcGFyZW50RWxlbWVudC5oYXNTdGFydFRhZygpICYmICFwYXJlbnRFbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJCQlpZiAoIWNhbkNvbnRhaW4ocGFyZW50RWxlbWVudCwgY2hpbGQpKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLy8gY29udGV4dWFsIHRlcm1pbmF0aW9uIGZvciBUQUJMRSBjb250ZW50IHRhZ3MKLQkJCWJvb2xlYW4gaXNUYWJsZUNvbnRlbnQgPSBmYWxzZTsKLQkJCWlmIChjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEJPRFkpIHx8IGNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USEVBRCkgfHwgY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRGT09UKSkgewotCQkJCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaXNUYWJsZUNvbnRlbnQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAoY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRSKSkgewotCQkJCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRCT0RZKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRIRUFEKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRGT09UKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaXNUYWJsZUNvbnRlbnQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAoY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlREKSB8fCBjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEgpKSB7Ci0JCQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVFIpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEJPRFkpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEhFQUQpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEZPT1QpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEFCTEUpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlpc1RhYmxlQ29udGVudCA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAoaXNUYWJsZUNvbnRlbnQpIHsKLQkJCQkvLyBUQUJMRSBjb250ZW50IHRhZ3Mgc2hvdWxkIHRlcm1pbmF0ZSBub24gVEFCTEUgY29udGVudCB0YWdzLAotCQkJCS8vIGlmIGluIFRBQkxFCi0JCQkJZm9yIChOb2RlIHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKSkgewotCQkJCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCQlicmVhazsKLQkJCQkJSURPTUVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChJRE9NRWxlbWVudCkgcGFyZW50OwotCQkJCQlTdHJpbmcgcGFyZW50TmFtZSA9IHBhcmVudEVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJCQlpZiAocGFyZW50TmFtZSA9PSBudWxsKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWlmIChwYXJlbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5FTUJFRCkpIHsKLQkJCQlpZiAoIWNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0VNQkVEKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCVN0cmluZyB0YWdOYW1lID0gaW1wbC5nZXRUYWdOYW1lKCk7Ci0JCQlpZiAodGFnTmFtZSAhPSBudWxsICYmIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRU1CRUQpKSB7Ci0JCQkJSURPTVRleHQgdGV4dCA9IChJRE9NVGV4dCkgY2hpbGQ7Ci0JCQkJaWYgKCF0ZXh0LmlzRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQlpZiAoaW1wbC5pc0ltcGxpY2l0VGFnKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQmVJbXBsaWNpdFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkJlSW1wbGljaXRUYWcoRWxlbWVudCBlbGVtZW50LCBOb2RlIGNoaWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVDb21tZW50RWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGRhdGEsIGJvb2xlYW4gaXNKU1BUYWcpIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwgfHwgZGF0YSA9PSBudWxsIHx8IGRhdGEubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiBjcmVhdGVNZXRhRWxlbWVudChkb2N1bWVudCwgZGF0YSwgaXNKU1BUYWcpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcm91dGluZSBjcmVhdGUgYW4gaW1wbGljaXQgRWxlbWVudCBmb3IgZ2l2ZW4gcGFyZW50IGFuZCBjaGlsZCwKLQkgKiBzdWNoIGFzIEhUTUwsIEJPRFksIEhFQUQsIGFuZCBUQk9EWSBmb3IgSFRNTCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVJbXBsaWNpdEVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIE5vZGUgcGFyZW50LCBOb2RlIGNoaWxkKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgRWxlbWVudCBjcmVhdGVNZXRhRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGRhdGEsIGJvb2xlYW4gaXNKU1BUYWcpIHsKLQkJaWYgKGRhdGEgPT0gbnVsbCB8fCBkYXRhLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlUYWdTY2FubmVyIHNjYW5uZXIgPSBuZXcgVGFnU2Nhbm5lcihkYXRhLCAwLCB0cnVlKTsgLy8gb25lIGxpbmUKLQkJU3RyaW5nIG5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgIW5hbWUuZXF1YWxzSWdub3JlQ2FzZShNZXRhRGF0YS5NRVRBREFUQSkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0JCWJvb2xlYW4gaXNTdGFydFNwYW4gPSBmYWxzZTsKLQkJYm9vbGVhbiBpc0VuZFNwYW4gPSBmYWxzZTsKLQkJbmFtZSA9IHNjYW5uZXIubmV4dE5hbWUoKTsKLQkJd2hpbGUgKG5hbWUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHZhbHVlID0gc2Nhbm5lci5uZXh0VmFsdWUoKTsKLQkJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoTWV0YURhdGEuVFlQRSkpIHsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoTWV0YURhdGEuREVTSUdORVJfQ09OVFJPTCkpIHsKLQkJCQkJdHlwZSA9IE1ldGFEYXRhLkRFU0lHTkVSX0NPTlRST0w7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoTWV0YURhdGEuRFlOQU1JQ19EQVRBKSkgewotCQkJCQl0eXBlID0gTWV0YURhdGEuRFlOQU1JQ19EQVRBOwotCQkJCX0KLQkJCQllbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKE1ldGFEYXRhLkFVVEhPUl9USU1FX1ZJU1VBTCkpIHsKLQkJCQkJdHlwZSA9IE1ldGFEYXRhLkFVVEhPUl9USU1FX1ZJU1VBTDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZShNZXRhRGF0YS5BTk5PVEFUSU9OKSkgewotCQkJCQl0eXBlID0gTWV0YURhdGEuQU5OT1RBVElPTjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShNZXRhRGF0YS5TVEFSVFNQQU4pKSB7Ci0JCQkJaXNTdGFydFNwYW4gPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKE1ldGFEYXRhLkVORFNQQU4pKSB7Ci0JCQkJaWYgKCFpc1N0YXJ0U3BhbikKLQkJCQkJaXNFbmRTcGFuID0gdHJ1ZTsKLQkJCX0KLQkJCW5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCX0KLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIWlzU3RhcnRTcGFuICYmICFpc0VuZFNwYW4pCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIG1ldGFEYXRhID0gbnVsbDsKLQkJaW50IG9mZnNldCA9IHNjYW5uZXIuZ2V0TmV4dE9mZnNldCgpOyAvLyBza2lwIG5ldyBsaW5lCi0JCWlmIChvZmZzZXQgPCBkYXRhLmxlbmd0aCgpKQotCQkJbWV0YURhdGEgPSBkYXRhLnN1YnN0cmluZyhvZmZzZXQpOwotCQlpZiAobWV0YURhdGEgPT0gbnVsbCkKLQkJCW1ldGFEYXRhID0gbmV3IFN0cmluZygpOwotCi0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoTWV0YURhdGEuUFJFRklYICsgdHlwZSk7Ci0KLQkJTWV0YURhdGFBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgTWV0YURhdGFBZGFwdGVyKHR5cGUpOwotCQlpZiAoaXNTdGFydFNwYW4pIHsKLQkJCWlmIChtZXRhRGF0YSAhPSBudWxsKQotCQkJCWFkYXB0ZXIuc2V0RGF0YShtZXRhRGF0YSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAobWV0YURhdGEgIT0gbnVsbCkKLQkJCQlhZGFwdGVyLnNldEVuZERhdGEobWV0YURhdGEpOwotCQl9Ci0JCWVsZW1lbnQuYWRkQWRhcHRlcihhZGFwdGVyKTsKLQkJYWRhcHRlci5zZXRFbGVtZW50KGVsZW1lbnQpOwotCQllbGVtZW50LnNldEpTUFRhZyhpc0pTUFRhZyk7Ci0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaW5kUm9vdE5hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyB0YWcgbWF0Y2hpbmcgc2hvdWxkIG5vdCBiZXlvbmQgVEFCTEUgdGFnIGV4Y2VwdCBCT0RZIHRhZwotCQlpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IE1vZGVsUGFyc2VyQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmRUYWcoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlUYWdBZGFwdGVyIGFkYXB0ZXIgPSAoVGFnQWRhcHRlcikgZWxlbWVudC5nZXRFeGlzdGluZ0FkYXB0ZXIoVGFnQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlci5pc0VuZFRhZygpOwotCQlyZXR1cm4gZWxlbWVudC5pc0VuZFRhZygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkvLyBkbyBub3RoaW5nIG9uIG5vdGlmaXkgY2hhbmdlCi0JCS8vIFRPRE86IHRoaXMgbWVhbnMgZ29vZCBjYW5kaWRhdGUgZm9yIHJlZ3VsYXIgcGxhdGZvcm0gYWRhcHRlcgotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZENoaWxkKENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gY2hpbGQpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNNQ29udGVudCBjb250ZW50ID0gcGFyZW50LmdldENvbnRlbnQoKTsKLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGlzQ2hpbGQoY29udGVudCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDaGlsZChDTUNvbnRlbnQgY29udGVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gdGFyZ2V0KSB7Ci0JCXN3aXRjaCAoY29udGVudC5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLQkJCQlyZXR1cm4gaXNTYW1lRGVjbGFyYXRpb24oKENNRWxlbWVudERlY2xhcmF0aW9uKSBjb250ZW50LCB0YXJnZXQpOwotCQkJY2FzZSBDTU5vZGUuR1JPVVAgOgotCQkJCUNNTm9kZUxpc3QgY2hpbGRyZW4gPSAoKENNR3JvdXApIGNvbnRlbnQpLmdldENoaWxkTm9kZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJQ01Ob2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCQkJc3dpdGNoIChjaGlsZC5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJCQljYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLQkJCQkJCQlpZiAoaXNTYW1lRGVjbGFyYXRpb24oKENNRWxlbWVudERlY2xhcmF0aW9uKSBjaGlsZCwgdGFyZ2V0KSkKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJY29udGludWU7IC8vIEdvIG5leHQgY2hpbGQuCi0JCQkJCQljYXNlIENNTm9kZS5HUk9VUCA6Ci0JCQkJCQkJaWYgKGlzQ2hpbGQoKENNQ29udGVudCkgY2hpbGQsIHRhcmdldCkpCi0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCWNvbnRpbnVlOyAvLyBHbyBuZXh0IGNoaWxkLgotCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJY29udGludWU7IC8vIEdvIG5leHQgY2hpbGQuCi0JCQkJCX0KLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTYW1lRGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gYURlYywgQ01FbGVtZW50RGVjbGFyYXRpb24gb3RoZXJEZWMpIHsKLQkJcmV0dXJuIGFEZWMuZ2V0RWxlbWVudE5hbWUoKSA9PSBvdGhlckRlYy5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg3NjVlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50Lk1vZGVsUGFyc2VyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBIVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIEhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0aGF0IHJldHVybnMgdGhlIGFkYXB0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBvYmplY3QuIEl0Ci0JICogbWF5IGJlIGEgc2luZ2xldG9uIG9yIG5vdCAuLi4gZGVwZW5kaW5nIG9uIHRoZSBuZWVkcyBvZiB0aGUKLQkgKiBJTm9kZUFkYXB0ZXIgLi4uIGJ1dCBpbiBnZW5lcmFsIGl0IGlzIHJlY29tbWVuZGVkIGZvciBhbiBhZGFwdGVyIHRvIGJlCi0JICogc3RhdGVsZXNzLCBzbyB0aGUgZWZmaWNpZW5jaWVzIG9mIGEgc2luZ2xldG9uIGNhbiBiZSBnYWluZWQuCi0JICogCi0JICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBjYWxsIGFkZEFkYXB0ZXIgb24gdGhlIGFkYXB0ZWQKLQkgKiBvYmplY3Qgd2l0aCB0aGUgY29ycmVjdCBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyIGFkYXB0KElOb2RlTm90aWZpZXIgbm90aWZpZXIpIHsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOwotCQlpZiAobm90aWZpZXIgIT0gbnVsbCkgewotCQkJaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgSURPTURvY3VtZW50KSB7Ci0JCQkJYWRhcHRlciA9IG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihNb2RlbFBhcnNlckFkYXB0ZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyID09IG51bGwpIHsKLQkJCQkJYWRhcHRlciA9IG5ldyBIVE1MTW9kZWxQYXJzZXJBZGFwdGVyKCk7Ci0JCQkJCW5vdGlmaWVyLmFkZEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3RvcnkoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IE1vZGVsUGFyc2VyQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gbm8gc3RhdGUgdG8gY2xlYW51cAotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRpbmcgY29weSBtZXRob2QKLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTWV0YURhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9NZXRhRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDU3NThjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9NZXRhRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRhRGF0YSB7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBID0gIk1FVEFEQVRBIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gInR5cGUiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUU1BBTiA9ICJzdGFydHNwYW4iOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVORFNQQU4gPSAiZW5kc3BhbiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVTSUdORVJfQ09OVFJPTCA9ICJEZXNpZ25lckNvbnRyb2wiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIERZTkFNSUNfREFUQSA9ICJEeW5hbWljRGF0YSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SX1RJTUVfVklTVUFMID0gIkF1dGhvclRpbWVWaXN1YWwiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT04gPSAiQW5ub3RhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gIk1FVEFEQVRBOiI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L01ldGFEYXRhQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L01ldGFEYXRhQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjg1OTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9NZXRhRGF0YUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5UYWdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgTWV0YURhdGFBZGFwdGVyIGltcGxlbWVudHMgVGFnQWRhcHRlciwgTWV0YURhdGEgewotCi0JcHJpdmF0ZSBJRE9NRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyB0eXBlID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBkYXRhID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBlbmREYXRhID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBNZXRhRGF0YUFkYXB0ZXIoU3RyaW5nIHR5cGUpIHsKLQkJc3VwZXIoKTsKLQotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlpZiAodHlwZS5lcXVhbHMoQU5OT1RBVElPTikpIHsKLQkJCQl0aGlzLnR5cGUgPSBBTk5PVEFUSU9OOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZS5lcXVhbHMoQVVUSE9SX1RJTUVfVklTVUFMKSkgewotCQkJCXRoaXMudHlwZSA9IEFVVEhPUl9USU1FX1ZJU1VBTDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREYXRhKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgZGF0YSA9IG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChpc0NvbW1lbnRUZXh0KHJlZ2lvblR5cGUpKSB7Ci0JCQkJZGF0YSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBsZW5ndGggPSBkYXRhLmxlbmd0aCgpOwotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJZm9yICg7IG9mZnNldCA8IGxlbmd0aDsgb2Zmc2V0KyspIHsKLQkJCWNoYXIgYyA9IGRhdGEuY2hhckF0KG9mZnNldCk7Ci0JCQlpZiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykgewotCQkJCW9mZnNldCsrOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWZvciAoOyBvZmZzZXQgPCBsZW5ndGg7IG9mZnNldCsrKSB7Ci0JCQljaGFyIGMgPSBkYXRhLmNoYXJBdChvZmZzZXQpOwotCQkJaWYgKGMgIT0gJ1xyJyAmJiBjICE9ICdcbicpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGF0YS5zdWJzdHJpbmcob2Zmc2V0KTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNDb21tZW50VGV4dChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXN1bHQgPSBpc0RPTUNvbW1lbnQocmVnaW9uVHlwZSkgfHwgaXNOZXN0ZWRDb250ZW50Q29tbWVudChyZWdpb25UeXBlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0JICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24KLQkgKiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXN0ZWRDb250ZW50Q29tbWVudChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfVEVYVCA9ICJKU1BfQ09NTUVOVF9URVhUIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVnaW9uVHlwZS5lcXVhbHMoSlNQX0NPTU1FTlRfVEVYVCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRE9NQ29tbWVudChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlyZXR1cm4gcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhKCkgewotCQlpZiAodGhpcy5lbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHRoaXMuZWxlbWVudC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5kYXRhICE9IG51bGwpCi0JCQlyZXR1cm4gdGhpcy5kYXRhOwotCQlyZXR1cm4gZ2V0RGF0YShmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVsaW1pdGVyKElET01Nb2RlbCBtb2RlbCkgewotCQlTdHJpbmcgZGVsaW0gPSBudWxsOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkKLQkJCQlkZWxpbSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCX0KLQkJaWYgKGRlbGltID09IG51bGwpCi0JCQlkZWxpbSA9ICJcclxuIjsvLyROT04tTkxTLTEkCi0JCXJldHVybiBkZWxpbTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVuZERhdGEoKSB7Ci0JCWlmICh0aGlzLmVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gdGhpcy5lbGVtZW50LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5lbmREYXRhICE9IG51bGwpCi0JCQlyZXR1cm4gdGhpcy5lbmREYXRhOwotCQlyZXR1cm4gZ2V0RGF0YShmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmRUYWcoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAoZWxlbWVudC5pc0pTUFRhZygpKQotCQkJYnVmZmVyLmFwcGVuZCgiPCUtLSIpOy8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJYnVmZmVyLmFwcGVuZCgiPCEtLSIpOy8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChNRVRBREFUQSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJYnVmZmVyLmFwcGVuZChUWVBFKTsKLQkJYnVmZmVyLmFwcGVuZCgiPVwiIik7Ly8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKHRoaXMudHlwZSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlwiICIpOy8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChNZXRhRGF0YS5FTkRTUEFOKTsKLQkJU3RyaW5nIGRhdGEgPSBnZXRFbmREYXRhKCk7Ci0JCWlmIChkYXRhICE9IG51bGwgJiYgZGF0YS5sZW5ndGgoKSA+IDApIHsKLQkJCVN0cmluZyBkZWxpbSA9IGdldERlbGltaXRlcihlbGVtZW50LmdldE1vZGVsKCkpOwotCQkJYnVmZmVyLmFwcGVuZChkZWxpbSk7Ci0JCQlidWZmZXIuYXBwZW5kKGRhdGEpOwotCQkJYnVmZmVyLmFwcGVuZChkZWxpbSk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQuaXNKU1BUYWcoKSkKLQkJCWJ1ZmZlci5hcHBlbmQoIi0tJT4iKTsvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCWJ1ZmZlci5hcHBlbmQoIi0tPiIpOy8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdGFydFRhZyhJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChlbGVtZW50LmlzSlNQVGFnKCkpCi0JCQlidWZmZXIuYXBwZW5kKCI8JS0tIik7Ly8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlidWZmZXIuYXBwZW5kKCI8IS0tIik7Ly8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKE1FVEFEQVRBKTsKLQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQlidWZmZXIuYXBwZW5kKFRZUEUpOwotCQlidWZmZXIuYXBwZW5kKCI9XCIiKTsvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQodGhpcy50eXBlKTsKLQkJYnVmZmVyLmFwcGVuZCgiXCIgIik7Ly8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKE1ldGFEYXRhLlNUQVJUU1BBTik7Ci0JCVN0cmluZyBkYXRhID0gZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgZGVsaW0gPSBnZXREZWxpbWl0ZXIoZWxlbWVudC5nZXRNb2RlbCgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZGVsaW0pOwotCQkJYnVmZmVyLmFwcGVuZChkYXRhKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZGVsaW0pOwotCQl9Ci0JCWlmIChlbGVtZW50LmlzSlNQVGFnKCkpCi0JCQlidWZmZXIuYXBwZW5kKCItLSU+Iik7Ly8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlidWZmZXIuYXBwZW5kKCItLT4iKTsvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBUYWdBZGFwdGVyLmNsYXNzIHx8IHR5cGUgPT0gTWV0YURhdGFBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuZFRhZygpIHsKLQkJaWYgKHRoaXMuZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodGhpcy5lbGVtZW50Lmhhc1N0YXJ0VGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh0aGlzLmVsZW1lbnQuaGFzRW5kVGFnKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHRoaXMuZGF0YSAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKHRoaXMuZW5kRGF0YSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1J1bnRpbWVDb250YWluZXIoKSB7Ci0JCXJldHVybiAodGhpcy50eXBlID09IEFOTk9UQVRJT04gfHwgdGhpcy50eXBlID09IEFVVEhPUl9USU1FX1ZJU1VBTCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcgZGF0YSkgewotCQl0aGlzLmRhdGEgPSBkYXRhOwotCi0JCWlmICh0aGlzLmVsZW1lbnQgIT0gbnVsbCkKLQkJCXRoaXMuZWxlbWVudC5ub3RpZnlTdGFydFRhZ0NoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmREYXRhKFN0cmluZyBkYXRhKSB7Ci0JCXRoaXMuZW5kRGF0YSA9IGRhdGE7Ci0KLQkJaWYgKHRoaXMuZWxlbWVudCAhPSBudWxsKQotCQkJdGhpcy5lbGVtZW50Lm5vdGlmeUVuZFRhZ0NoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQotCQlpZiAodGhpcy5lbGVtZW50ICE9IG51bGwpIHsKLQkJCXRoaXMuZWxlbWVudC5zZXRDb21tZW50VGFnKHRydWUpOwotCQkJaWYgKHRoaXMudHlwZSAhPSBNZXRhRGF0YS5BTk5PVEFUSU9OKSB7Ci0JCQkJdGhpcy5lbGVtZW50LnNldEpTUFRhZyh0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJ1bnRpbWVTb3VyY2UoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLmVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGlzUnVudGltZUNvbnRhaW5lcigpKQotCQkJcmV0dXJuOwotCi0JCUlET01Nb2RlbCBtb2RlbCA9IHRoaXMuZWxlbWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgb2Zmc2V0ID0gdGhpcy5lbGVtZW50LmdldFN0YXJ0RW5kT2Zmc2V0KCk7Ci0JCWludCBlbmQgPSB0aGlzLmVsZW1lbnQuZ2V0RW5kU3RhcnRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aCA9IGVuZCAtIG9mZnNldDsKLQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KG1vZGVsLCBvZmZzZXQsIGxlbmd0aCwgc291cmNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGFnU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RhZ1NjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNiZDUwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGFnU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKi8KLWNsYXNzIFRhZ1NjYW5uZXIgewotCi0JcHJpdmF0ZSBTdHJpbmcgdGFnID0gbnVsbDsKLQlwcml2YXRlIGludCBvZmZzZXQgPSAwOwotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBib29sZWFuIG9uZUxpbmUgPSBmYWxzZTsKLQotCS8qKgotCSAqLwotCVRhZ1NjYW5uZXIoU3RyaW5nIHRhZywgaW50IG9mZnNldCkgewotCQlzdXBlcigpOwotCi0JCXRoaXMudGFnID0gdGFnOwotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQkJaWYgKHRhZyAhPSBudWxsKQotCQkJdGhpcy5sZW5ndGggPSB0YWcubGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JVGFnU2Nhbm5lcihTdHJpbmcgdGFnLCBpbnQgb2Zmc2V0LCBib29sZWFuIG9uZUxpbmUpIHsKLQkJdGhpcyh0YWcsIG9mZnNldCk7Ci0KLQkJdGhpcy5vbmVMaW5lID0gb25lTGluZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlpbnQgZ2V0TmV4dE9mZnNldCgpIHsKLQkJZm9yICg7IHRoaXMub2Zmc2V0IDwgdGhpcy5sZW5ndGg7IHRoaXMub2Zmc2V0KyspIHsKLQkJCWNoYXIgYyA9IHRoaXMudGFnLmNoYXJBdCh0aGlzLm9mZnNldCk7Ci0JCQlpZiAoIWlzRW5kKGMpKQotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiB0aGlzLm9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gdGhpcy5vZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzRW5kKGNoYXIgYykgewotCQlyZXR1cm4gKHRoaXMub25lTGluZSAmJiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFcXVhbChjaGFyIGMpIHsKLQkJcmV0dXJuIChjID09ICc9Jyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1F1b3RlKGNoYXIgYykgewotCQlyZXR1cm4gKGMgPT0gJyInIHx8IGMgPT0gJ1wnJyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NwYWNlKGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGNoYXIgbmV4dENoYXIoKSB7Ci0JCWZvciAoOyB0aGlzLm9mZnNldCA8IHRoaXMubGVuZ3RoOyB0aGlzLm9mZnNldCsrKSB7Ci0JCQljaGFyIGMgPSB0aGlzLnRhZy5jaGFyQXQodGhpcy5vZmZzZXQpOwotCQkJaWYgKGlzRW5kKGMpKQotCQkJCWJyZWFrOwotCQkJaWYgKCFpc1NwYWNlKGMpKQotCQkJCXJldHVybiBjOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqLwotCVN0cmluZyBuZXh0TmFtZSgpIHsKLQkJaWYgKHRoaXMudGFnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMub2Zmc2V0ID49IHRoaXMubGVuZ3RoKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKG5leHRDaGFyKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBuYW1lT2Zmc2V0ID0gdGhpcy5vZmZzZXQ7Ci0JCWZvciAoOyB0aGlzLm9mZnNldCA8IHRoaXMubGVuZ3RoOyB0aGlzLm9mZnNldCsrKSB7Ci0JCQljaGFyIGMgPSB0aGlzLnRhZy5jaGFyQXQodGhpcy5vZmZzZXQpOwotCQkJaWYgKGlzRW5kKGMpIHx8IGlzU3BhY2UoYykpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoaXNFcXVhbChjKSAmJiB0aGlzLm9mZnNldCA+IG5hbWVPZmZzZXQpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHRoaXMub2Zmc2V0ID09IG5hbWVPZmZzZXQpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gdGhpcy50YWcuc3Vic3RyaW5nKG5hbWVPZmZzZXQsIHRoaXMub2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlTdHJpbmcgbmV4dFZhbHVlKCkgewotCQlpZiAodGhpcy50YWcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5vZmZzZXQgPj0gdGhpcy5sZW5ndGgpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQljaGFyIHNlcGVyYXRvciA9IG5leHRDaGFyKCk7Ci0JCWlmICghaXNFcXVhbChzZXBlcmF0b3IpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRoaXMub2Zmc2V0Kys7IC8vIHNraXAgJz0nCi0JCWNoYXIgcXVvdGUgPSBuZXh0Q2hhcigpOwotCQlpZiAocXVvdGUgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoaXNRdW90ZShxdW90ZSkpCi0JCQl0aGlzLm9mZnNldCsrOwotCQllbHNlCi0JCQlxdW90ZSA9IDA7Ci0KLQkJaW50IHZhbHVlT2Zmc2V0ID0gdGhpcy5vZmZzZXQ7Ci0JCWZvciAoOyB0aGlzLm9mZnNldCA8IHRoaXMubGVuZ3RoOyB0aGlzLm9mZnNldCsrKSB7Ci0JCQljaGFyIGMgPSB0aGlzLnRhZy5jaGFyQXQodGhpcy5vZmZzZXQpOwotCQkJaWYgKGlzRW5kKGMpKSB7Ci0JCQkJcXVvdGUgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHF1b3RlID09IDApIHsKLQkJCQlpZiAoaXNTcGFjZShjKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoYyA9PSBxdW90ZSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaW50IHZhbHVlRW5kID0gdGhpcy5vZmZzZXQ7Ci0JCWlmIChxdW90ZSAhPSAwICYmIHRoaXMub2Zmc2V0IDwgdGhpcy5sZW5ndGgpCi0JCQl0aGlzLm9mZnNldCsrOwotCQlpZiAodmFsdWVFbmQgPT0gdmFsdWVPZmZzZXQpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gdGhpcy50YWcuc3Vic3RyaW5nKHZhbHVlT2Zmc2V0LCB2YWx1ZUVuZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1Vua25vd25UYWdBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVW5rbm93blRhZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM2MDUzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVW5rbm93blRhZ0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5UYWdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmtub3duVGFnQWRhcHRlciBpbXBsZW1lbnRzIFRhZ0FkYXB0ZXIgewotCi0JcHJpdmF0ZSBTdHJpbmcgc3RhcnRUYWcgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGVuZFRhZyA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgVW5rbm93blRhZ0FkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmRUYWcoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdGFnID0gbnVsbDsKLQkJaWYgKHRoaXMuZW5kVGFnICE9IG51bGwpIHsKLQkJCXRhZyA9IHRoaXMuZW5kVGFnOwotCQkJdGhpcy5lbmRUYWcgPSBudWxsOwotCQl9Ci0JCXJldHVybiB0YWc7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdGFydFRhZyhJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB0YWcgPSBudWxsOwotCQlpZiAodGhpcy5zdGFydFRhZyAhPSBudWxsKSB7Ci0JCQl0YWcgPSB0aGlzLnN0YXJ0VGFnOwotCQkJdGhpcy5zdGFydFRhZyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRhZzsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBUYWdBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuZFRhZygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZFRhZyhTdHJpbmcgZW5kVGFnKSB7Ci0JCXRoaXMuZW5kVGFnID0gZW5kVGFnOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0VGFnKFN0cmluZyBzdGFydFRhZykgewotCQl0aGlzLnN0YXJ0VGFnID0gc3RhcnRUYWc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0hUTUxEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0hUTUxEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGQzNjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9IVE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5IVE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcGFyc2VzIGJlZ2lubmluZyBwb3J0aW9uIG9mIEhUTUwgZmlsZSB0byBnZXQgdGhlIGVuY29kaW5nIHZhbHVlCi0gKiBpbiBhIE1FVEEgdGFnLiBFeGFtcGxlOgotICogPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci0gKiAKLSAqIE5vdGU6IGV2ZW4gdGhvdWdoLCB0ZWNobmljYWxseSwgYSBNRVRBIHRhZyBtdXN0IGNvbWUgaW4gYSA8SEVBRD50YWcsIHdlCi0gKiBkb24ndCBjaGVjayBmb3IgdGhhdCwgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB3aGF0ZXZlciwgb3Igd2hlcmVldmVyLCB0aGUKLSAqIHRoZSBmaXJzdCA8TUVUQT50YWcgaXMsIGl0IGlzIHRoZSBvbmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSB0aGUgdXNlciwgYW5kCi0gKiB0aGV5IG1heSBqdXN0IGJlIHRyeWluZyB0byByZXBhaXIgdGhlIGVycm9yLiBUaGUgSFRNTCB2YWxpZGF0b3Igd2lsbCB0ZWxsCi0gKiB0aGVtIGlmIGl0cyBpbiB0aGUgd3JvbmcgbG9jYXRpb24uCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZXh0ZW5kcyBIVE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIHsKLQotCi0JcHVibGljIEhUTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXNldChuZXcgRG9jdW1lbnRSZWFkZXIoZG9jdW1lbnQsIDApKTsKLQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0hUTUxEb2N1bWVudExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0hUTUxEb2N1bWVudExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDI3ZTNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9IVE1MRG9jdW1lbnRMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdHdWVzc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzLkhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzLlN0eWxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlByb3BhZ2F0aW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQWJzdHJhY3REb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LlN0cnVjdHVyZWREb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm9wYWdhdGUuUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi1wdWJsaWMgY2xhc3MgSFRNTERvY3VtZW50TG9hZGVyIGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudExvYWRlciB7Ci0KLQlwdWJsaWMgSFRNTERvY3VtZW50TG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBhZGQgdGFnIG5hbWVzIHVzaW5nIEJsb2NrTWFya2VyIG9iamVjdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEhUTUxpc2hUYWcoWE1MU291cmNlUGFyc2VyIHBhcnNlciwgU3RyaW5nIHRhZ25hbWUpIHsKLQkJQmxvY2tNYXJrZXIgYm0gPSBuZXcgQmxvY2tNYXJrZXIodGFnbmFtZSwgbnVsbCwgRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhULCBmYWxzZSk7Ci0JCXBhcnNlci5hZGRCbG9ja01hcmtlcihibSk7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBlbmNvZGluZy4gRm9yIEhUTUwsIHRoZXJlIGlzIG5vIHNwZWMuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogICAgICAgICAgICBieXRlW10KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICBpbnQKLQkgKiAKLQkgKiBEbyBhdXRvbWF0aWMgZW5jb2RpbmcgZGV0ZWN0aW9uIGJ5IGd1ZXNzCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFbmNvZGluZ05hbWVCeUd1ZXNzKGJ5dGVbXSBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJZmluYWwgU3RyaW5nIGlhbmFFbmMgPSBFbmNvZGluZ0d1ZXNzZXIuZ3Vlc3NFbmNvZGluZyhzdHJpbmcsIGxlbmd0aCk7Ci0JCXJldHVybiBpYW5hRW5jOwotCX0KLQotCS8qCi0JICogQHNlZSBBYnN0cmFjdExvYWRlciNjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBJRW5jb2RlZERvY3VtZW50IG5ld0VuY29kZWREb2N1bWVudCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKGdldFBhcnNlcigpKTsKLQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KS5zZXRSZVBhcnNlcihuZXcgWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKSk7Ci0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1vZGVsTG9hZGVyI2dldFBhcnNlcigpCi0JICovCi0JcHVibGljIFJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCVhNTFNvdXJjZVBhcnNlciBwYXJzZXIgPSBuZXcgWE1MU291cmNlUGFyc2VyKCk7Ci0JCS8vIGZvciB0aGUgInN0YXRpYyBIVE1MIiBjYXNlLCB3ZSBuZWVkIHRvIGluaXRpYWxpemUKLQkJLy8gQmxvY2t0YWdzIGhlcmUuCi0JCWFkZEhUTUxpc2hUYWcocGFyc2VyLCAic2NyaXB0Iik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkSFRNTGlzaFRhZyhwYXJzZXIsICJzdHlsZSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdGhvc2UgZmFjdG9yaWVzIHdoaWNoIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlCi0JICogc3RydWN0dXJlZE1vZGVsIGJlZm9yZSBjb250ZW50IGlzIGFwcGxpZWQuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWRhcHRlckZhY3RvcmllcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCWZhY3RvcnkgPSBTdHlsZUFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCWZhY3RvcnkgPSBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCWZhY3RvcnkgPSBuZXcgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCWZhY3RvcnkgPSBIVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQkvLwotCQlmYWN0b3J5ID0gbmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUwoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQotCQlmYWN0b3J5ID0gbmV3IFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihJRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBkZWxpbWl0ZXIgPSBDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihDb250ZW50VHlwZUlkRm9ySFRNTC5Db250ZW50VHlwZUlEX0hUTUwpOwotCQlpZiAoZGVsaW1pdGVyID09IG51bGwpCi0JCQlkZWxpbWl0ZXIgPSBzdXBlci5nZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKGZpbGUpOwotCQlyZXR1cm4gZGVsaW1pdGVyOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlpZiAoZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9PSBudWxsKSB7Ci0JCQlmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID0gbmV3IEhUTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCQl9Ci0JCXJldHVybiBmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZUxvYWRBZGFwdChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyBETVc6IGp1c3QgYWRkZWQgdGhpcyBwcmVsb2FkIG9uIDgvMTYvMjAwMgotCQkvLyBJIG5vdGljZWQgdGhlIFByb2FnYXRpbmdBZGFwdGVyRmFjdG9yeSB3YXMgYmVpbmcgYWRkZWQsCi0JCS8vIHRoYXQgdGhhdCB0aGUgUHJvYWdhdGluZ0FkYXB0ZXJBZGFwdGVyIHdhcyBub3QgYmVpbmcKLQkJLy8gcHJlbG9hZCBhZGFwdGVkIC0tIEknbSBhc3N1aW5nIGl0IEFMV0FZUyBoYXMgdG8gYmUuCi0JCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIHN0cnVjdHVyZWRNb2RlbDsKLQkJLy8gaWYgdGhlcmUgaXMgYSBtb2RlbCBpbiB0aGUgYWRhcHRlciwgdGhpcyB3aWxsIGFkYXB0IGl0IHRvCi0JCS8vIGZpcnN0IG5vZGUuIEFmdGVyIHRoYXQgdGhlIFByb3BhZ2F0aW5nQWRhdGVyIHNwcmVhZHMgb3ZlciB0aGUKLQkJLy8gY2hpbGRyZW4gYmVpbmcKLQkJLy8gY3JlYXRlZC4gRWFjaCB0aW1lIHRoYXQgaGFwcGVuZHMsIGEgc2lkZSBlZmZlY3QgaXMgdG8KLQkJLy8gYWxzbyAic3ByZWFkIiBzcHJlY2lmaWMgcmVnaXN0ZXJlZCBhZGFwdGVycywKLQkJLy8gdGhleSB0d28gY2FuIHByb3BpZ2F0ZSBpcyBuZWVkZWQuCi0JCSgoSU5vZGVOb3RpZmllcikgZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBnZXREZWZhdWx0RG9jdW1lbnRQYXJ0aXRpb25lcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTCgpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgSFRNTERvY3VtZW50TG9hZGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0hUTUxNb2RlbExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0hUTUxNb2RlbExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOThiMTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9IVE1MTW9kZWxMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRPTVN0eWxlTW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzLkhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzLlN0eWxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlByb3BhZ2F0aW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkRlYnVnQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5YTUxTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZS5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MTW9kZWxMb2FkZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsTG9hZGVyIHsKLQotCi0JcHVibGljIEhUTUxNb2RlbExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gYWRkIHRhZyBuYW1lcyB1c2luZyBCbG9ja01hcmtlciBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIVE1MaXNoVGFnKFhNTFNvdXJjZVBhcnNlciBwYXJzZXIsIFN0cmluZyB0YWduYW1lKSB7Ci0JCUJsb2NrTWFya2VyIGJtID0gbmV3IEJsb2NrTWFya2VyKHRhZ25hbWUsIG51bGwsIERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCwgZmFsc2UpOwotCQlwYXJzZXIuYWRkQmxvY2tNYXJrZXIoYm0pOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKCkgewotCQlET01TdHlsZU1vZGVsSW1wbCBtb2RlbCA9IG5ldyBET01TdHlsZU1vZGVsSW1wbCgpOwotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdGhvc2UgZmFjdG9yaWVzIHdoaWNoIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlCi0JICogc3RydWN0dXJlZE1vZGVsIGJlZm9yZSBjb250ZW50IGlzIGFwcGxpZWQuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWRhcHRlckZhY3RvcmllcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCWZhY3RvcnkgPSBTdHlsZUFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCWZhY3RvcnkgPSBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCWZhY3RvcnkgPSBuZXcgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCWZhY3RvcnkgPSBIVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQkvLwotCQlmYWN0b3J5ID0gbmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUwoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQotCQlmYWN0b3J5ID0gbmV3IFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlTG9hZEFkYXB0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCXN1cGVyLnByZUxvYWRBZGFwdChzdHJ1Y3R1cmVkTW9kZWwpOwotCQkvLyBETVc6IGp1c3QgYWRkZWQgdGhpcyBwcmVsb2FkIG9uIDgvMTYvMjAwMgotCQkvLyBJIG5vdGljZWQgdGhlIFByb2FnYXRpbmdBZGFwdGVyRmFjdG9yeSB3YXMgYmVpbmcgYWRkZWQsCi0JCS8vIHRoYXQgdGhhdCB0aGUgUHJvYWdhdGluZ0FkYXB0ZXJBZGFwdGVyIHdhcyBub3QgYmVpbmcKLQkJLy8gcHJlbG9hZCBhZGFwdGVkIC0tIEknbSBhc3N1aW5nIGl0IEFMV0FZUyBoYXMgdG8gYmUuCi0JCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIHN0cnVjdHVyZWRNb2RlbDsKLQkJLy8gaWYgdGhlcmUgaXMgYSBtb2RlbCBpbiB0aGUgYWRhcHRlciwgdGhpcyB3aWxsIGFkYXB0IGl0IHRvCi0JCS8vIGZpcnN0IG5vZGUuIEFmdGVyIHRoYXQgdGhlIFByb3BhZ2F0aW5nQWRhdGVyIHNwcmVhZHMgb3ZlciB0aGUKLQkJLy8gY2hpbGRyZW4gYmVpbmcKLQkJLy8gY3JlYXRlZC4gRWFjaCB0aW1lIHRoYXQgaGFwcGVuZHMsIGEgc2lkZSBlZmZlY3QgaXMgdG8KLQkJLy8gYWxzbyAic3ByZWFkIiBzcHJlY2lmaWMgcmVnaXN0ZXJlZCBhZGFwdGVycywKLQkJLy8gdGhleSB0d28gY2FuIHByb3BpZ2F0ZSBpcyBuZWVkZWQuCi0JCSgoSU5vZGVOb3RpZmllcikgZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQlpZiAoRGVidWcuZGVidWdOb3RpZmljYXRpb25BbmRFdmVudHMpIHsKLQkJCVByb3BhZ2F0aW5nQWRhcHRlciBwcm9wYWdhdGluZ0FkYXB0ZXIgPSAoUHJvcGFnYXRpbmdBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvbU1vZGVsLmdldERvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJCXByb3BhZ2F0aW5nQWRhcHRlci5hZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeShuZXcgRGVidWdBZGFwdGVyRmFjdG9yeSgpKTsKLQkJfQl9Ci0KLQlwdWJsaWMgSU1vZGVsTG9hZGVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IEhUTUxNb2RlbExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCWlmIChkb2N1bWVudExvYWRlckluc3RhbmNlID09IG51bGwpIHsKLQkJCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBuZXcgSFRNTERvY3VtZW50TG9hZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50TG9hZGVySW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9FbWJlZGRlZENTU0Zvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9FbWJlZGRlZENTU0Zvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGVjNjc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvRW1iZWRkZWRDU1NGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTVRleHQ7Ci0KLS8vIG5ha2Ftb3JpX1RPRE86IGNoZWNrIGFuZCByZW1vdmUKLQotcHVibGljIGNsYXNzIEVtYmVkZGVkQ1NTRm9ybWF0dGVyIGV4dGVuZHMgSFRNTEZvcm1hdHRlciB7Ci0KLQkvLyBwcml2YXRlIElBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbmV3Ci0JLy8gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeShDU1NTb3VyY2VGb3JtYXR0ZXIuY2xhc3MsIHRydWUpOwotCS8qKgotCSAqLwotCXByb3RlY3RlZCBFbWJlZGRlZENTU0Zvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXROb2RlKElET01Ob2RlIG5vZGUsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSURPTVRleHQgdGV4dCA9IChJRE9NVGV4dCkgbm9kZTsKLQotCQlTdHJpbmcgc291cmNlID0gZ2V0Q1NTQ29udGVudChub2RlKTsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKSB7IC8vIGZhbGxiYWNrCi0JCQlzb3VyY2UgPSB0ZXh0LmdldFNvdXJjZSgpOwotCQl9Ci0KLQkJaW50IG9mZnNldCA9IHRleHQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aCA9IHRleHQuZ2V0RW5kT2Zmc2V0KCkgLSBvZmZzZXQ7Ci0JCXJlcGxhY2VTb3VyY2UodGV4dC5nZXRNb2RlbCgpLCBvZmZzZXQsIGxlbmd0aCwgc291cmNlKTsKLQkJc2V0V2lkdGgoY29udHJhaW50cywgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRDU1NDb250ZW50KElET01Ob2RlIHRleHQpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0Q1NTTW9kZWwodGV4dCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlDU1NOb2RlIGRvY3VtZW50ID0gbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudDsKLQkJQ1NTU291cmNlRm9ybWF0dGVyIGZvcm1hdHRlciA9IChDU1NTb3VyY2VGb3JtYXR0ZXIpIG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoQ1NTU291cmNlRm9ybWF0dGVyLmNsYXNzKTsKLQkJLy8gdHJ5IGFub3RoZXIgd2F5IHRvIGdldCBmb3JtYXR0ZXIKLQkJaWYgKGZvcm1hdHRlciA9PSBudWxsKQotCQkJZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcihub3RpZmllcik7Ci0JCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gZm9ybWF0dGVyLmZvcm1hdChkb2N1bWVudCk7Ci0JCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJQ1NTTW9kZWwgZ2V0Q1NTTW9kZWwoSURPTU5vZGUgdGV4dCkgewotCQlpZiAodGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgdGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3R5bGVTaGVldEFkYXB0ZXIpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHlsZVNoZWV0QWRhcHRlciBzdHlsZUFkYXB0ZXIgPSAoSVN0eWxlU2hlZXRBZGFwdGVyKSBhZGFwdGVyOwotCQlyZXR1cm4gc3R5bGVBZGFwdGVyLmdldE1vZGVsKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEVsZW1lbnRGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEVsZW1lbnRGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxNGRmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxFbGVtZW50Rm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLy8gbmFrYW1vcmlfVE9ETzogY2hlY2sgYW5kIHJlbW92ZSBDU1MgZm9ybWF0dGluZwotCi1wdWJsaWMgY2xhc3MgSFRNTEVsZW1lbnRGb3JtYXR0ZXIgZXh0ZW5kcyBIVE1MRm9ybWF0dGVyIHsKLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBIVE1MRWxlbWVudEZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29tcHJlc3NUYWlsaW5nU3BhY2VzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpbnQgb2Zmc2V0ID0gcmVnaW9uLmdldFRleHRFbmQoKTsKLQkJaW50IGNvdW50ID0gcmVnaW9uLmdldEVuZCgpIC0gb2Zmc2V0OwotCQlpZiAoY291bnQgPT0gMSkgewotCQkJU3RyaW5nIHNvdXJjZSA9IGZsYXROb2RlLmdldEZ1bGxUZXh0KHJlZ2lvbik7Ci0JCQlpbnQgc3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UuY2hhckF0KG9mZnNldCAtIHN0YXJ0KSA9PSAnICcpIHsKLQkJCQkvLyBub3RoaW5nIHRvIGRvCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXJlcGxhY2VTb3VyY2UoZmxhdE5vZGUsIG9mZnNldCwgY291bnQsICIgIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBmb3JtYXRFbmRUYWcoSURPTUVsZW1lbnQgZWxlbWVudCwgSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlOb2RlIGxhc3RDaGlsZCA9IGVsZW1lbnQuZ2V0TGFzdENoaWxkKCk7Ci0KLQkJaWYgKGxhc3RDaGlsZCAhPSBudWxsICYmIGxhc3RDaGlsZCBpbnN0YW5jZW9mIElET01FbGVtZW50ICYmIGxhc3RDaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscygianNwOnNjcmlwdGxldCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWluc2VydEJyZWFrQWZ0ZXIoKElET01FbGVtZW50KSBsYXN0Q2hpbGQsIGNvbnRyYWludHMpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGVsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoZWxlbWVudC5pc0pTUFRhZygpIHx8IGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCVN0cmluZyBlbmRUYWcgPSBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dCgpOwotCQkJaWYgKGVuZFRhZyAhPSBudWxsICYmIGVuZFRhZy5sZW5ndGgoKSA+IDApIHsKLQkJCQlzZXRXaWR0aChjb250cmFpbnRzLCBlbmRUYWcpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVRleHRSZWdpb24gcHJldlJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgaXNOZXN0ZWRUYWcocmVnaW9uVHlwZSkpIHsKLQkJCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJCQlyZW1vdmVUYWlsaW5nU3BhY2VzKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcHJldlJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIChwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCBpc05lc3RlZFJvb3RUYWcocHJldlJlZ2lvbi5nZXRUeXBlKCkpKSkgewotCQkJCQlyZW1vdmVUYWlsaW5nU3BhY2VzKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcHJldlJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJcHJldlJlZ2lvbiA9IHJlZ2lvbjsKLQkJfQotCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIChwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCBpc05lc3RlZFJvb3RUYWcocHJldlJlZ2lvbi5nZXRUeXBlKCkpKSkgewotCQkJcmVtb3ZlVGFpbGluZ1NwYWNlcyhlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHByZXZSZWdpb24pOwotCQl9Ci0KLQkJLy8gQlVHMTIzODkwIChlbmQgdGFnIGxlbmd0aCB3YXMgYWxyZWFkeSBwcmVmYWN0b3JlZCBpbnRvCi0JCS8vIGZvcm1hdFN0YXJ0VGFnIHNvIG5vIG5lZWQgdG8gZG8gaXQgaGVyZSkKLQkJLy8gU3RyaW5nIG5ld0VuZFRhZyA9IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KCk7Ci0JCS8vIGlmIChuZXdFbmRUYWcgIT0gbnVsbCAmJiBuZXdFbmRUYWcubGVuZ3RoKCkgPiAwKSB7Ci0JCS8vIHNldFdpZHRoKGNvbnRyYWludHMsIG5ld0VuZFRhZyk7Ci0JCS8vIH0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXROb2RlKElET01Ob2RlIG5vZGUsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQotCQlmb3JtYXRTdGFydFRhZyhlbGVtZW50LCBjb250cmFpbnRzKTsKLQotCQlmb3JtYXRDaGlsZE5vZGVzKGVsZW1lbnQsIGNvbnRyYWludHMpOwotCi0JCWZvcm1hdEVuZFRhZyhlbGVtZW50LCBjb250cmFpbnRzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgZm9ybWF0U3RhcnRUYWcoSURPTUVsZW1lbnQgZWxlbWVudCwgSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCi0JCWlmIChlbGVtZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzKCJqc3A6c2NyaXB0bGV0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaW5zZXJ0QnJlYWtCZWZvcmUoZWxlbWVudCwgY29udHJhaW50cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZWxlbWVudC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBXZSBzaG91bGQgZm9ybWF0IGF0dHJpYnV0ZXMgaW4gSlNQVGFnPwotCQkvLyBpZiAoZWxlbWVudC5pc0pTUFRhZygpIHx8IGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCVN0cmluZyBzdGFydFRhZyA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQoKTsKLQkJCWlmIChzdGFydFRhZyAhPSBudWxsICYmIHN0YXJ0VGFnLmxlbmd0aCgpID4gMCkgewotCQkJCXNldFdpZHRoKGNvbnRyYWludHMsIHN0YXJ0VGFnKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGZpcnN0IHByb2Nlc3Mgc3R5bGUgYXR0cmlidXRlCi0JCWlmIChlbGVtZW50LmlzR2xvYmFsVGFnKCkpIHsKLQkJCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZSgic3R5bGUiKTsvLyROT04tTkxTLTEkCi0JCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJCWZvcm1hdFN0eWxlQXR0cihhdHRyKTsKLQkJfQotCQlib29sZWFuIGluc2VydEJyZWFrID0gZmFsc2U7Ci0JCWluc2VydEJyZWFrID0gKChTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwpIGdldEZvcm1hdFByZWZlcmVuY2VzKCkpLmdldFNwbGl0TXVsdGlBdHRycygpOwotCQlib29sZWFuIGFsaWduRW5kQnJhY2tldCA9ICgoU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKSBnZXRGb3JtYXRQcmVmZXJlbmNlcygpKS5pc0FsaWduRW5kQnJhY2tldCgpOwotCQlib29sZWFuIGF0dHJpYnV0ZXNTcGxpdHRlZCA9IGZhbHNlOwotCi0JCWlmIChpbnNlcnRCcmVhaykgewotCQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJCWlmIChhdHRyaWJ1dGVzID09IG51bGwgfHwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKSA8IDIpCi0JCQkJaW5zZXJ0QnJlYWsgPSBmYWxzZTsKLQkJfQotCQlTdHJpbmcgYnJlYWtTcGFjZXMgPSBnZXRCcmVha1NwYWNlcyhlbGVtZW50KTsKLQkJU3RyaW5nIG9yaWdpbmFsQnJlYWtTcGFjZXMgPSBicmVha1NwYWNlczsKLQkJU3RyaW5nIGluZGVudCA9IGdldEluZGVudCgpOwotCQlpZiAoaW5kZW50ICE9IG51bGwgJiYgaW5kZW50Lmxlbmd0aCgpID4gMCkgewotCQkJYnJlYWtTcGFjZXMgKz0gaW5kZW50OwotCQl9Ci0JCUlUZXh0UmVnaW9uIGxhc3RCcmVha1JlZ2lvbiA9IG51bGw7Ci0KLQkJSVRleHRSZWdpb24gcHJldlJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQkJY29udGludWU7Ci0KLQkJCUlUZXh0UmVnaW9uIGJyZWFrUmVnaW9uID0gbnVsbDsKLQotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgaXNOZXN0ZWRUYWcocmVnaW9uVHlwZSkpIHsKLQkJCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQkJCXJlbW92ZVRhaWxpbmdTcGFjZXMoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHByZXZSZWdpb24pOwotCQkJCX0KLQkJCQlicmVha1JlZ2lvbiA9IHJlZ2lvbjsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiAocHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FIHx8IHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSkgewotCQkJCQkvLyBhdHRyaWJ1dGUgbmFtZSB3aXRob3V0IHZhbHVlCi0JCQkJCWJyZWFrUmVnaW9uID0gcHJldlJlZ2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiBwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQkJcmVtb3ZlVGFpbGluZ1NwYWNlcyhzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcHJldlJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiBwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCQlyZW1vdmVUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBwcmV2UmVnaW9uKTsKLQkJCQl9Ci0JCQkJYnJlYWtSZWdpb24gPSByZWdpb247Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCQkJCWlmIChwcmV2UmVnaW9uICE9IG51bGwgJiYgKHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSB8fCBwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykpIHsKLQkJCQkJLy8gYXR0cmlidXRlIG5hbWUgd2l0aG91dCB2YWx1ZQotCQkJCQlicmVha1JlZ2lvbiA9IHByZXZSZWdpb247Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoYnJlYWtSZWdpb24gIT0gbnVsbCkgewotCQkJCWludCBlbmQgPSBicmVha1JlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCQkJaWYgKGxhc3RCcmVha1JlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWludCBvZmZzZXQgPSBsYXN0QnJlYWtSZWdpb24uZ2V0RW5kKCk7Ci0JCQkJCWludCBjb3VudCA9IGVuZCAtIG9mZnNldDsKLQkJCQkJaWYgKGluc2VydEJyZWFrIHx8ICFpc1dpZHRoQXZhaWxhYmxlKGNvbnRyYWludHMsIGNvdW50ICsgMSkpIHsKLQkJCQkJCXJlcGxhY2VUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBsYXN0QnJlYWtSZWdpb24sIGJyZWFrU3BhY2VzKTsKLQkJCQkJCXNldFdpZHRoKGNvbnRyYWludHMsIGJyZWFrU3BhY2VzKTsKLQkJCQkJCWF0dHJpYnV0ZXNTcGxpdHRlZCA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQljb21wcmVzc1RhaWxpbmdTcGFjZXMoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGxhc3RCcmVha1JlZ2lvbik7Ci0JCQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCAxKTsKLQkJCQkJfQotCQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCBjb3VudCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCBlbmQpOwotCQkJCX0KLQkJCQlsYXN0QnJlYWtSZWdpb24gPSBicmVha1JlZ2lvbjsKLQkJCX0KLQotCQkJcHJldlJlZ2lvbiA9IHJlZ2lvbjsKLQkJfQotCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIChwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUgfHwgcHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpKSB7Ci0JCQkvLyBhdHRyaWJ1dGUgbmFtZSB3aXRob3V0IHZhbHVlCi0JCQlpbnQgZW5kID0gcHJldlJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCQlpZiAobGFzdEJyZWFrUmVnaW9uICE9IG51bGwpIHsKLQkJCQlpbnQgb2Zmc2V0ID0gbGFzdEJyZWFrUmVnaW9uLmdldEVuZCgpOwotCQkJCWludCBjb3VudCA9IGVuZCAtIG9mZnNldDsKLQkJCQlpZiAoaW5zZXJ0QnJlYWsgfHwgIWlzV2lkdGhBdmFpbGFibGUoY29udHJhaW50cywgY291bnQgKyAxKSkgewotCQkJCQlyZXBsYWNlVGFpbGluZ1NwYWNlcyhzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgbGFzdEJyZWFrUmVnaW9uLCBicmVha1NwYWNlcyk7Ci0JCQkJCXNldFdpZHRoKGNvbnRyYWludHMsIGJyZWFrU3BhY2VzKTsKLQkJCQkJYXR0cmlidXRlc1NwbGl0dGVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNvbXByZXNzVGFpbGluZ1NwYWNlcyhzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgbGFzdEJyZWFrUmVnaW9uKTsKLQkJCQkJYWRkV2lkdGgoY29udHJhaW50cywgMSk7Ci0JCQkJfQotCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIGNvdW50KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIGVuZCk7Ci0JCQl9Ci0JCQlsYXN0QnJlYWtSZWdpb24gPSBwcmV2UmVnaW9uOwotCQl9Ci0KLQkJaWYgKGxhc3RCcmVha1JlZ2lvbiAhPSBudWxsKSB7Ci0JCQlpbnQgb2Zmc2V0ID0gbGFzdEJyZWFrUmVnaW9uLmdldFRleHRFbmQoKTsKLQkJCWludCBjb3VudCA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpIC0gb2Zmc2V0OwotCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiBwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQljb21wcmVzc1RhaWxpbmdTcGFjZXMoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGxhc3RCcmVha1JlZ2lvbik7Ci0JCQkJY291bnQrKzsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlbW92ZVRhaWxpbmdTcGFjZXMoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGxhc3RCcmVha1JlZ2lvbik7Ci0JCQkJLy8gQlVHMTIzODkwIChwcmUtZmFjdG9yIGluIGVuZCB0YWcpCi0JCQkJY291bnQgKz0gZWxlbWVudC5nZXRUYWdOYW1lKCkubGVuZ3RoKCkgKyAzOwotCQkJfQotCQkJYWRkV2lkdGgoY29udHJhaW50cywgY291bnQpOwotCQl9Ci0JCWVsc2UgewotCQkJYWRkV2lkdGgoY29udHJhaW50cywgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQl9Ci0JCS8vIEJVRzExMzU4NCAtIGFsaWduIGxhc3QgYnJhY2tldAotCQlpZiAoYWxpZ25FbmRCcmFja2V0ICYmIGF0dHJpYnV0ZXNTcGxpdHRlZCkgewotCQkJcmVtb3ZlVGFpbGluZ1NwYWNlcyhzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgbGFzdEJyZWFrUmVnaW9uKTsKLQkJCXJlcGxhY2VUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBsYXN0QnJlYWtSZWdpb24sIG9yaWdpbmFsQnJlYWtTcGFjZXMpOwotCQkJY29udHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoZ2V0TGluZVdpZHRoKCkgLSBvcmlnaW5hbEJyZWFrU3BhY2VzLmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0JICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24KLQkgKiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTmVzdGVkVGFnKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWZpbmFsIFN0cmluZyBKU1BfUk9PVF9UQUdfTkFNRSA9ICJKU1BfUk9PVF9UQUdfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIEpTUF9ESVJFQ1RJVkVfTkFNRSA9ICJKU1BfRElSRUNUSVZFX05BTUUiOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZS5lcXVhbHMoSlNQX1JPT1RfVEFHX05BTUUpIHx8IHJlZ2lvblR5cGUuZXF1YWxzKEpTUF9ESVJFQ1RJVkVfTkFNRSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotCSAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uCi0JICogIm5lc3RlZENvbnRleHQiLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc05lc3RlZFJvb3RUYWcoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJZmluYWwgU3RyaW5nIEpTUF9ST09UX1RBR19OQU1FID0gIkpTUF9ST09UX1RBR19OQU1FIjsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUuZXF1YWxzKEpTUF9ST09UX1RBR19OQU1FKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBmb3JtYXRTdHlsZUF0dHIoQXR0ciBhdHRyKSB7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vIGlmIHNvbWVvbmUncyBtYWRlIGl0IGEgY29udGFpbmVyIHNvbWVob3csIENTUyBjYW4ndCBmb3JtYXQgaXQKLQkJaWYgKCgoSURPTU5vZGUpIGF0dHIpLmdldFZhbHVlUmVnaW9uKCkgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikKLQkJCXJldHVybjsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0Q1NTVmFsdWUoYXR0cik7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgb2xkVmFsdWUgPSAoKElET01Ob2RlKSBhdHRyKS5nZXRWYWx1ZVNvdXJjZSgpOwotCQlpZiAob2xkVmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHMob2xkVmFsdWUpKQotCQkJcmV0dXJuOwotCQlhdHRyLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElDU1NNb2RlbCBnZXRDU1NNb2RlbChBdHRyIGF0dHIpIHsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0QWRhcHRlckZvcihJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHlsZURlY2xhcmF0aW9uQWRhcHRlciBzdHlsZUFkYXB0ZXIgPSAoSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyKSBhZGFwdGVyOwotCQlyZXR1cm4gc3R5bGVBZGFwdGVyLmdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q1NTVmFsdWUoQXR0ciBhdHRyKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldENTU01vZGVsKGF0dHIpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJQ1NTTm9kZSBkb2N1bWVudCA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQ7Ci0JCUNTU1NvdXJjZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSAoQ1NTU291cmNlRm9ybWF0dGVyKSBub3RpZmllci5nZXRBZGFwdGVyRm9yKENTU1NvdXJjZUZvcm1hdHRlci5jbGFzcyk7Ci0JCS8vIHRyeSBhbm90aGVyIHdheSB0byBnZXQgZm9ybWF0dGVyCi0JCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkKLQkJCWZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIobm90aWZpZXIpOwotCQlpZiAoZm9ybWF0dGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IGZvcm1hdHRlci5mb3JtYXQoZG9jdW1lbnQpOwotCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVUYWlsaW5nU3BhY2VzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpbnQgb2Zmc2V0ID0gcmVnaW9uLmdldFRleHRFbmQoKTsKLQkJaW50IGNvdW50ID0gcmVnaW9uLmdldEVuZCgpIC0gb2Zmc2V0OwotCQlpZiAoY291bnQgPD0gMCkKLQkJCXJldHVybjsKLQkJcmVwbGFjZVNvdXJjZShmbGF0Tm9kZSwgb2Zmc2V0LCBjb3VudCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlcGxhY2VUYWlsaW5nU3BhY2VzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHNwYWNlcykgewotCQlpbnQgb2Zmc2V0ID0gcmVnaW9uLmdldFRleHRFbmQoKTsKLQkJaW50IGNvdW50ID0gcmVnaW9uLmdldEVuZCgpIC0gb2Zmc2V0OwotCQlpZiAoY291bnQgPT0gc3BhY2VzLmxlbmd0aCgpKSB7Ci0JCQlTdHJpbmcgc291cmNlID0gZmxhdE5vZGUuZ2V0RnVsbFRleHQocmVnaW9uKTsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UuZW5kc1dpdGgoc3BhY2VzKSkgewotCQkJCS8vIG5vdGhpbmcgdG8gZG8KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJcmVwbGFjZVNvdXJjZShmbGF0Tm9kZSwgb2Zmc2V0LCBjb3VudCwgc3BhY2VzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRm9ybWF0Q29udHJhaW50c0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEZvcm1hdENvbnRyYWludHNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmODE1MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRm9ybWF0Q29udHJhaW50c0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5TdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50czsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICogUGxlYXNlIHVuLWRlcHJlY2F0ZSB0aGlzIGlmIFBhZ2UgRGVzaWduZXIgdGhpbmtzIHRoZXkgYXJlIG5lZWRlZC4KLSAqLwotcHVibGljIGNsYXNzIEhUTUxGb3JtYXRDb250cmFpbnRzSW1wbCBleHRlbmRzIFN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGltcGxlbWVudHMgSFRNTEZvcm1hdENvbnRyYWludHMgewotCXByb3RlY3RlZCBpbnQgZkF2YWlsYWJsZUxpbmVXaWR0aDsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICogCUl0J3MgdmVyeSBoYXJkIHRvIGtlZXAgdGhlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIGFjY3VyYXRlLgotCSAqIAlTb21ldGltZXMgYSBub2RlIHdhbnRzIHRvIHN0YXJ0IG9uIGEgbmV3IGxpbmUsIHNvbWV0aW1lcyBpdCBkb2Vzbid0LgotCSAqIAlJdCdzIGJlc3QgZm9yIHRoZSBub2RlIHRvIGZpZ3VyZSBvdXQgdGhlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIG9uIHRoZSBmbHkuCi0JICovCi0JcHVibGljIGludCBnZXRBdmFpbGFibGVMaW5lV2lkdGgoKSB7Ci0JCXJldHVybiBmQXZhaWxhYmxlTGluZVdpZHRoOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICogCUl0J3MgdmVyeSBoYXJkIHRvIGtlZXAgdGhlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIGFjY3VyYXRlLgotCSAqIAlTb21ldGltZXMgYSBub2RlIHdhbnRzIHRvIHN0YXJ0IG9uIGEgbmV3IGxpbmUsIHNvbWV0aW1lcyBpdCBkb2Vzbid0LgotCSAqIAlJdCdzIGJlc3QgZm9yIHRoZSBub2RlIHRvIGZpZ3VyZSBvdXQgdGhlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIG9uIHRoZSBmbHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlTGluZVdpZHRoKGludCBhdmFpbGFibGVMaW5lV2lkdGgpIHsKLQkJZkF2YWlsYWJsZUxpbmVXaWR0aCA9IGF2YWlsYWJsZUxpbmVXaWR0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxGb3JtYXRQcm9jZXNzb3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxGb3JtYXRQcm9jZXNzb3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTJiYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRm9ybWF0UHJvY2Vzc29ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEhUTUxGb3JtYXRQcm9jZXNzb3JJbXBsIGV4dGVuZHMgRm9ybWF0UHJvY2Vzc29yWE1MIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAiaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZ2V0Rm9ybWF0dGVyKE5vZGUgbm9kZSkgewotCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBIVE1MRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUZvcm1hdHRlcihub2RlLCBnZXRGb3JtYXRQcmVmZXJlbmNlcygpKTsKLQotCQlyZXR1cm4gZm9ybWF0dGVyOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGdldEZvcm1hdFByZWZlcmVuY2VzKCkgewotCQlpZiAoZkZvcm1hdFByZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWZGb3JtYXRQcmVmZXJlbmNlcyA9IG5ldyBTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwoKTsKLQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldExpbmVXaWR0aChwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpOwotCQkJCSgoU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKSBmRm9ybWF0UHJlZmVyZW5jZXMpLnNldFNwbGl0TXVsdGlBdHRycyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTKSk7Ci0JCQkJKChTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwpIGZGb3JtYXRQcmVmZXJlbmNlcykuc2V0QWxpZ25FbmRCcmFja2V0KHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQUxJR05fRU5EX0JSQUNLRVQpKTsKLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0Q2xlYXJBbGxCbGFua0xpbmVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTKSk7Ci0KLQkJCQljaGFyIGluZGVudENoYXIgPSAnICc7Ci0JCQkJU3RyaW5nIGluZGVudENoYXJQcmVmID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQkJCWlmIChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIuZXF1YWxzKGluZGVudENoYXJQcmVmKSkgewotCQkJCQlpbmRlbnRDaGFyID0gJ1x0JzsKLQkJCQl9Ci0JCQkJaW50IGluZGVudGF0aW9uV2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQkJCWluZGVudC5hcHBlbmQoaW5kZW50Q2hhcik7Ci0JCQkJfQotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRJbmRlbnQoaW5kZW50LnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZGb3JtYXRQcmVmZXJlbmNlczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY0Mjg4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LlN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGNsYXNzIEhUTUxGb3JtYXR0ZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZEZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9OQU1FID0gImh0bWwiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9EWV9OQU1FID0gIkJPRFkiOy8vJE5PTi1OTFMtMSQKLQkvLyBoaWRkZW4ganNwIGxvZ2ljIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiBqc3AgZm9ybWF0dGVyIGlzIGNyZWF0ZWQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQID0gImpzcCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV2lkdGgoSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cywgaW50IHdpZHRoKSB7Ci0JCWlmIChjb250cmFpbnRzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghc3BsaXRMaW5lcygpIHx8IGdldExpbmVXaWR0aCgpIDwgMCkKLQkJCXJldHVybjsKLQotCQlpbnQgYXZhaWxhYmxlV2lkdGggPSBjb250cmFpbnRzLmdldEF2YWlsYWJsZUxpbmVXaWR0aCgpIC0gd2lkdGg7Ci0JCWlmIChhdmFpbGFibGVXaWR0aCA8IDApCi0JCQlhdmFpbGFibGVXaWR0aCA9IDA7Ci0JCWNvbnRyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGF2YWlsYWJsZVdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5Gb3JtYXRDaGlsZChOb2RlIG5vZGUpIHsKLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXRFbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIG5vZGUpOwotCQkJaWYgKGRlY2wgIT0gbnVsbCkgewotCQkJCWlmIChkZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEEpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAoZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9LRUVQX1NQQUNFKSkgewotCQkJCQlib29sZWFuIHNob3VsZEtlZXBTcGFjZSA9ICgoQm9vbGVhbikgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9LRUVQX1NQQUNFKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChzaG91bGRLZWVwU3BhY2UpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5JbnNlcnRCcmVha0FmdGVyKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuTElORV9CUkVBS19ISU5UKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIGhpbnQgPSAoU3RyaW5nKSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuTElORV9CUkVBS19ISU5UKTsKLQkJaWYgKGhpbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIChoaW50LmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5CUkVBS19CRUZPUkVfU1RBUlRfQU5EX0FGVEVSX0VORCkgfHwgaGludC5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuQlJFQUtfQUZURVJfU1RBUlQpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5JbnNlcnRCcmVha0FmdGVyKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCU5vZGUgbmV4dCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkvLyBzcGVjaWFsIGV4Y2VwdGlvbiBpZiB0aGlzIG5vZGUgaXMgYSBub24tSFRNTCB0YWcgKGxpa2UgSlNQCi0JCS8vIGVsZW1lbnRzKQotCQkvLyBCVUcxODgwOTMgLSBvbmx5IHByZXNlcnZlIHdoaXRlc3BhY2UgZm9yIGpzcCAobm90IGN1c3RvbSkgdGFncwotCQlTdHJpbmcgcHJlZml4ID0gbm9kZS5nZXRQcmVmaXgoKTsKLQkJaWYgKHByZWZpeCAhPSBudWxsICYmIEpTUC5lcXVhbHMocHJlZml4KSkgewotCQkJYm9vbGVhbiBjYW5JbnNlcnRCcmVha0FmdGVyID0gZmFsc2U7Ci0JCQkvLyBpZiBhIHdoaXRlc3BhY2UgZG9lcyBub3QgZXhpc3QgYWZ0ZXIgaXQsIGRvIG5vdCBhZGQgb25lCi0JCQlpZiAobmV4dCAhPSBudWxsICYmIG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCVN0cmluZyB0aGVUZXh0ID0gKChUZXh0KSBuZXh0KS5nZXREYXRhKCk7Ci0JCQkJaWYgKHRoZVRleHQgIT0gbnVsbCAmJiB0aGVUZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQljaGFyIHRoZUNoYXIgPSB0aGVUZXh0LmNoYXJBdCgwKTsKLQkJCQkJY2FuSW5zZXJ0QnJlYWtBZnRlciA9IENoYXJhY3Rlci5pc1doaXRlc3BhY2UodGhlQ2hhcik7Ci0JCQkJfQotCQkJfQotCQkJLy8gaWYgY2Fubm90IGluc2VydCBicmVhaywgZ28gYWhlYWQgYW5kIHJldHVybiBmYWxzZSAob3RoZXJ3aXNlLAotCQkJLy8gY29udGludWUgcHJvY2Vzc2luZykKLQkJCWlmICghY2FuSW5zZXJ0QnJlYWtBZnRlcikKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBzcGVjaWFsIGV4Y2VwdGlvbiBpZiBuZXh0IG5vZGUgaXMgYSBub24tSFRNTCB0YWcgKGxpa2UgSlNQCi0JCS8vIGVsZW1lbnRzKQotCQkvLyBCVUcxODgwOTMgLSBvbmx5IHByZXNlcnZlIHdoaXRlc3BhY2UgZm9yIGpzcCAobm90IGN1c3RvbSkgdGFncwotCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQlwcmVmaXggPSBuZXh0LmdldFByZWZpeCgpOwotCQkJaWYgKHByZWZpeCAhPSBudWxsICYmIEpTUC5lcXVhbHMocHJlZml4KSkgewotCQkJCWJvb2xlYW4gY2FuSW5zZXJ0QnJlYWtBZnRlclByZXZpb3VzID0gZmFsc2U7Ci0JCQkJLy8gaWYgYSB3aGl0ZXNwYWNlIGRvZXMgbm90IGV4aXN0IGJlZm9yZSBpdCwgZG8gbm90IGFkZCBvbmUKLQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCVN0cmluZyB0aGVUZXh0ID0gKChUZXh0KSBub2RlKS5nZXREYXRhKCk7Ci0JCQkJCWlmICh0aGVUZXh0ICE9IG51bGwgJiYgdGhlVGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCWNoYXIgdGhlQ2hhciA9IHRoZVRleHQuY2hhckF0KHRoZVRleHQubGVuZ3RoKCkgLSAxKTsKLQkJCQkJCWNhbkluc2VydEJyZWFrQWZ0ZXJQcmV2aW91cyA9IENoYXJhY3Rlci5pc1doaXRlc3BhY2UodGhlQ2hhcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gaWYgY2Fubm90IGluc2VydCBicmVhaywgZ28gYWhlYWQgYW5kIHJldHVybiBmYWxzZQotCQkJCS8vIChvdGhlcndpc2UsCi0JCQkJLy8gY29udGludWUgcHJvY2Vzc2luZykKLQkJCQlpZiAoIWNhbkluc2VydEJyZWFrQWZ0ZXJQcmV2aW91cykKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkvLyBkbyBub3QgaW5zZXJ0IGJyZWFrIGFmdGVyIHVuY2xvc2VkIHRhZwotCQkJCWlmICghKChJRE9NRWxlbWVudCkgbm9kZSkuaXNDbG9zZWQoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIHBhcmVudDsKLQkJCS8vIGRvIG5vdCBpbnNlcnQgYnJlYWsgYmVmb3JlIG1pc3NpbmcgZW5kIHRhZwotCQkJaWYgKG5leHQgPT0gbnVsbCAmJiBlbGVtZW50LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkvLyBpbnNlcnQgbGluZSBicmVhayB1bmRlciBub24tSFRNTCBlbGVtZW50cyBpbmNsdWRpbmcgSlNQCi0JCQkvLyBlbGVtZW50cwotCQkJaWYgKGVsZW1lbnQuZ2V0UHJlZml4KCkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJCWlmIChkZWNsICE9IG51bGwpIHsKLQkJCQlpZiAoZGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCQkJLy8gc3BlY2lhbCBmb3IgZGlyZWN0IGNoaWxkcmVuIHVuZGVyIEJPRFkKLQkJCQlpZiAodGFnTmFtZSAhPSBudWxsICYmIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShCT0RZX05BTUUpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJaWYgKGNhbkluc2VydEJyZWFrQWZ0ZXIoZGVjbCkpIHsKLQkJCQkvLyBzcGNpYWwgZm9yIEJSCi0JCQkJcmV0dXJuIGNhbkZvcm1hdENoaWxkKHBhcmVudCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5leHQgIT0gbnVsbCAmJiBuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXRFbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIG5leHQpOwotCQkJaWYgKGNhbkluc2VydEJyZWFrQmVmb3JlKGRlY2wpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5JbnNlcnRCcmVha0JlZm9yZShDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLkxJTkVfQlJFQUtfSElOVCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBoaW50ID0gKFN0cmluZykgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLkxJTkVfQlJFQUtfSElOVCk7Ci0JCWlmIChoaW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBoaW50LmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5CUkVBS19CRUZPUkVfU1RBUlRfQU5EX0FGVEVSX0VORCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuSW5zZXJ0QnJlYWtCZWZvcmUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJTm9kZSBwcmV2ID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQotCQkvLyBzcGVjaWFsIGV4Y2VwdGlvbiBpZiB0aGlzIG5vZGUgaXMgYSBub24tSFRNTCB0YWcgKGxpa2UgSlNQCi0JCS8vIGVsZW1lbnRzKQotCQkvLyBCVUcxODgwOTMgLSBvbmx5IHByZXNlcnZlIHdoaXRlc3BhY2UgZm9yIGpzcCAobm90IGN1c3RvbSkgdGFncwotCQlTdHJpbmcgcHJlZml4ID0gbm9kZS5nZXRQcmVmaXgoKTsKLQkJaWYgKHByZWZpeCAhPSBudWxsICYmIEpTUC5lcXVhbHMocHJlZml4KSkgewotCQkJYm9vbGVhbiBjYW5JbnNlcnRCcmVha0JlZm9yZSA9IGZhbHNlOwotCQkJLy8gaWYgYSB3aGl0ZXNwYWNlIGRvZXMgbm90IGV4aXN0IGJlZm9yZSBpdCwgZG8gbm90IGFkZCBvbmUKLQkJCWlmIChwcmV2ICE9IG51bGwgJiYgcHJldi5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJU3RyaW5nIHRoZVRleHQgPSAoKFRleHQpIHByZXYpLmdldERhdGEoKTsKLQkJCQlpZiAodGhlVGV4dCAhPSBudWxsICYmIHRoZVRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWNoYXIgdGhlQ2hhciA9IHRoZVRleHQuY2hhckF0KHRoZVRleHQubGVuZ3RoKCkgLSAxKTsKLQkJCQkJY2FuSW5zZXJ0QnJlYWtCZWZvcmUgPSBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHRoZUNoYXIpOwotCQkJCX0KLQkJCX0KLQkJCS8vIGlmIGNhbm5vdCBpbnNlcnQgYnJlYWssIGdvIGFoZWFkIGFuZCByZXR1cm4gZmFsc2UgKG90aGVyd2lzZSwKLQkJCS8vIGNvbnRpbnVlIHByb2Nlc3NpbmcpCi0JCQlpZiAoIWNhbkluc2VydEJyZWFrQmVmb3JlKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIHNwZWNpYWwgZXhjZXB0aW9uIGlmIHByZXZpb3VzIG5vZGUgaXMgYSBub24tSFRNTCB0YWcgKGxpa2UgSlNQCi0JCS8vIGVsZW1lbnRzKQotCQkvLyBCVUcxODgwOTMgLSBvbmx5IHByZXNlcnZlIHdoaXRlc3BhY2UgZm9yIGpzcCAobm90IGN1c3RvbSkgdGFncwotCQlpZiAocHJldiAhPSBudWxsKSB7Ci0JCQlwcmVmaXggPSBwcmV2LmdldFByZWZpeCgpOwotCQkJaWYgKHByZWZpeCAhPSBudWxsICYmIEpTUC5lcXVhbHMocHJlZml4KSkgewotCQkJCWJvb2xlYW4gY2FuSW5zZXJ0QnJlYWtCZWZvcmVOZXh0ID0gZmFsc2U7Ci0JCQkJLy8gaWYgYSB3aGl0ZXNwYWNlIGRvZXMgbm90IGV4aXN0IGFmdGVyIGl0LCBkbyBub3QgYWRkIG9uZQotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJU3RyaW5nIHRoZVRleHQgPSAoKFRleHQpIG5vZGUpLmdldERhdGEoKTsKLQkJCQkJaWYgKHRoZVRleHQgIT0gbnVsbCAmJiB0aGVUZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQkJY2hhciB0aGVDaGFyID0gdGhlVGV4dC5jaGFyQXQoMCk7Ci0JCQkJCQljYW5JbnNlcnRCcmVha0JlZm9yZU5leHQgPSBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHRoZUNoYXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIGlmIGNhbm5vdCBpbnNlcnQgYnJlYWssIGdvIGFoZWFkIGFuZCByZXR1cm4gZmFsc2UKLQkJCQkvLyAob3RoZXJ3aXNlLAotCQkJCS8vIGNvbnRpbnVlIHByb2Nlc3NpbmcpCi0JCQkJaWYgKCFjYW5JbnNlcnRCcmVha0JlZm9yZU5leHQpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCWlmIChwcmV2ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIHBhcmVudDsKLQkJCS8vIGRvIG5vdCBpbnNlcnQgYnJlYWsgYWZ0ZXIgbWlzc2luZyBzdGFydCB0YWcKLQkJCWlmIChwcmV2ID09IG51bGwgJiYgZWxlbWVudC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkvLyBpbnNlcnQgbGluZSBicmVhayB1bmRlciBub24tSFRNTCBlbGVtZW50cyBpbmNsdWRpbmcgSlNQCi0JCQkvLyBlbGVtZW50cwotCQkJaWYgKGVsZW1lbnQuZ2V0UHJlZml4KCkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJCWlmIChkZWNsICE9IG51bGwpIHsKLQkJCQlpZiAoZGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCQkJLy8gc3BlY2lhbCBmb3IgZGlyZWN0IGNoaWxkcmVuIHVuZGVyIEJPRFkKLQkJCQlpZiAodGFnTmFtZSAhPSBudWxsICYmIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShCT0RZX05BTUUpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXRFbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIG5vZGUpOwotCQkJaWYgKGNhbkluc2VydEJyZWFrQmVmb3JlKGRlY2wpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChwcmV2ICE9IG51bGwgJiYgcHJldi5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBwcmV2KTsKLQkJCWlmIChjYW5JbnNlcnRCcmVha0FmdGVyKGRlY2wpKSB7Ci0JCQkJLy8gc3BjaWFsIGZvciBCUgotCQkJCXJldHVybiBjYW5Gb3JtYXRDaGlsZChwYXJlbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXQoTm9kZSBub2RlKSB7Ci0JCWZvcm1hdChub2RlLCBnZXRGb3JtYXRDb250cmFpbnRzKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGZvcm1hdChOb2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUgJiYgY29udHJhaW50cyBpbnN0YW5jZW9mIEhUTUxGb3JtYXRDb250cmFpbnRzKQotCQkJZm9ybWF0KChJRE9NTm9kZSkgbm9kZSwgKEhUTUxGb3JtYXRDb250cmFpbnRzKSBjb250cmFpbnRzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXQoSURPTU5vZGUgbm9kZSwgSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobm9kZS5nZXRQYXJlbnROb2RlKCkgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZG8gbm90IGZvcm1hdCByZW1vdmVkIG5vZGUKLQotCQlzZXRXaWR0aChjb250cmFpbnRzLCBub2RlKTsKLQotCQlpZiAoY2FuSW5zZXJ0QnJlYWtCZWZvcmUobm9kZSkpCi0JCQlpbnNlcnRCcmVha0JlZm9yZShub2RlLCBjb250cmFpbnRzKTsKLQotCQlmb3JtYXROb2RlKG5vZGUsIGNvbnRyYWludHMpOwotCi0JCWlmIChjYW5JbnNlcnRCcmVha0FmdGVyKG5vZGUpKQotCQkJaW5zZXJ0QnJlYWtBZnRlcihub2RlLCBjb250cmFpbnRzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRDaGlsZE5vZGVzKElET01Ob2RlIG5vZGUsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKCFub2RlLmhhc0NoaWxkTm9kZXMoKSkKLQkJCXJldHVybjsKLQotCQkvLyBjb25jYXQgYWRqYWNlbnQgdGV4dHMKLQkJbm9kZS5ub3JtYWxpemUoKTsKLQotCQkvLyBkaXNhYmxlIHNpYmxpbmcgaW5kZW50IGR1cmluZyBmb3JtYXR0aW5nIGFsbCB0aGUgY2hpbGRyZW4KLQkJYm9vbGVhbiBpbmRlbnQgPSBmYWxzZTsKLQkJaWYgKGNvbnRyYWludHMgIT0gbnVsbCkgewotCQkJaW5kZW50ID0gY29udHJhaW50cy5nZXRGb3JtYXRXaXRoU2libGluZ0luZGVudCgpOwotCQkJY29udHJhaW50cy5zZXRGb3JtYXRXaXRoU2libGluZ0luZGVudChmYWxzZSk7Ci0JCX0KLQotCQlib29sZWFuIGluc2VydEJyZWFrID0gdHJ1ZTsKLQkJSURPTU5vZGUgY2hpbGQgPSAoSURPTU5vZGUpIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldFBhcmVudE5vZGUoKSAhPSBub2RlKQotCQkJCWJyZWFrOwotCQkJSURPTU5vZGUgbmV4dCA9IChJRE9NTm9kZSkgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkJaWYgKGluc2VydEJyZWFrICYmIGNhbkluc2VydEJyZWFrQmVmb3JlKGNoaWxkKSkgewotCQkJCWluc2VydEJyZWFrQmVmb3JlKGNoaWxkLCBjb250cmFpbnRzKTsKLQkJCX0KLQotCQkJSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gSFRNTEZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVGb3JtYXR0ZXIoY2hpbGQsIGdldEZvcm1hdFByZWZlcmVuY2VzKCkpOwotCQkJaWYgKGZvcm1hdHRlciAhPSBudWxsKSB7Ci0JCQkJaWYgKGZvcm1hdHRlciBpbnN0YW5jZW9mIEhUTUxGb3JtYXR0ZXIpIHsKLQkJCQkJSFRNTEZvcm1hdHRlciBodG1sRm9ybWF0dGVyID0gKEhUTUxGb3JtYXR0ZXIpIGZvcm1hdHRlcjsKLQkJCQkJaHRtbEZvcm1hdHRlci5mb3JtYXROb2RlKGNoaWxkLCBjb250cmFpbnRzKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZvcm1hdHRlci5mb3JtYXQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGNhbkluc2VydEJyZWFrQWZ0ZXIoY2hpbGQpKSB7Ci0JCQkJaW5zZXJ0QnJlYWtBZnRlcihjaGlsZCwgY29udHJhaW50cyk7Ci0JCQkJaW5zZXJ0QnJlYWsgPSBmYWxzZTsgLy8gbm90IHRvIGluc2VydCB0d2ljZQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW5zZXJ0QnJlYWsgPSB0cnVlOwotCQkJfQotCi0JCQljaGlsZCA9IG5leHQ7Ci0JCX0KLQotCQlpZiAoY29udHJhaW50cyAhPSBudWxsKQotCQkJY29udHJhaW50cy5zZXRGb3JtYXRXaXRoU2libGluZ0luZGVudChpbmRlbnQpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdE5vZGUoSURPTU5vZGUgbm9kZSwgSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChub2RlLmhhc0NoaWxkTm9kZXMoKSkgeyAvLyBjb250YWluZXIKLQkJCWZvcm1hdENoaWxkTm9kZXMobm9kZSwgY29udHJhaW50cyk7Ci0JCX0KLQkJZWxzZSB7IC8vIGxlYWYKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBzb3VyY2UgPSBmbGF0Tm9kZS5nZXRUZXh0KCk7Ci0JCQkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJc2V0V2lkdGgoY29udHJhaW50cywgc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEJyZWFrU3BhY2VzKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJU3RyaW5nIGRlbGltID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCWlmIChkZWxpbSAhPSBudWxsICYmIGRlbGltLmxlbmd0aCgpID4gMCkKLQkJCWJ1ZmZlci5hcHBlbmQoZGVsaW0pOwotCi0JCVN0cmluZyBpbmRlbnQgPSBnZXRJbmRlbnQoKTsKLQkJaWYgKGluZGVudCAhPSBudWxsICYmIGluZGVudC5sZW5ndGgoKSA+IDApIHsKLQkJCWZvciAoTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCWJyZWFrOwotCQkJCS8vIGlnbm9yZSBvbWl0dGVkIHRhZwotCQkJCWlmICgoKElET01Ob2RlKSBwYXJlbnQpLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBwYXJlbnQ7Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0UHJlZml4KCkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgbG9jYWxOYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQkJCQkJLy8gc3BlY2lhbCBmb3IgaHRtbDpodG1sCi0JCQkJCWlmIChsb2NhbE5hbWUgIT0gbnVsbCAmJiAhbG9jYWxOYW1lLmVxdWFscyhIVE1MX05BTUUpKSB7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKGluZGVudCk7Ci0JCQkJCX0KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJCQlpZiAoZGVjbCAhPSBudWxsICYmIGRlY2wuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSU5ERU5UX0NISUxEX1NPVVJDRSkpIHsKLQkJCQkJYm9vbGVhbiBzaG91bGRJbmRlbnQgPSAoKEJvb2xlYW4pIGRlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSU5ERU5UX0NISUxEX1NPVVJDRSkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQlpZiAoc2hvdWxkSW5kZW50KQotCQkJCQkJYnVmZmVyLmFwcGVuZChpbmRlbnQpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5kZW50KCkgewotCQlyZXR1cm4gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRJbmRlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldExpbmVXaWR0aCgpIHsKLQkJcmV0dXJuIGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0TGluZVdpZHRoKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldEVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlEb2N1bWVudCBkb2N1bWVudCA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsUXVlcnkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRCcmVha0FmdGVyKElET01Ob2RlIG5vZGUsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCXJldHVybjsKLQkJLy8gZG9uJ3QgaW5zZXJ0IGJyZWFrIGlmIG5vZGUgaXMgb24gdGhlIGxhc3QgbGluZQotCQlpbnQgZG9jdW1lbnRMZW5ndGggPSBub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpOwotCQlpZiAoZG9jdW1lbnRMZW5ndGggPCAxIHx8IChub2RlLmdldEVuZE9mZnNldCgpID49IChkb2N1bWVudExlbmd0aCAtIDEpKSkKLQkJCXJldHVybjsKLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIG5leHQgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJU3RyaW5nIHNwYWNlcyA9IG51bGw7Ci0JCWlmIChuZXh0ID09IG51bGwpIHsgLy8gbGFzdCBzcGFjZXMKLQkJCS8vIHVzZSBwYXJlbnQgaW5kZW50IGZvciB0aGUgZW5kIHRhZwotCQkJc3BhY2VzID0gZ2V0QnJlYWtTcGFjZXMocGFyZW50KTsKLQkJfQotCQllbHNlIGlmIChuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCWlmIChjb250cmFpbnRzICE9IG51bGwgJiYgY29udHJhaW50cy5nZXRGb3JtYXRXaXRoU2libGluZ0luZGVudCgpKSB7Ci0JCQkJSURPTU5vZGUgdGV4dCA9IChJRE9NTm9kZSkgbmV4dDsKLQkJCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBIVE1MRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUZvcm1hdHRlcih0ZXh0LCBnZXRGb3JtYXRQcmVmZXJlbmNlcygpKTsKLQkJCQlpZiAoZm9ybWF0dGVyIGluc3RhbmNlb2YgSFRNTFRleHRGb3JtYXR0ZXIpIHsKLQkJCQkJSFRNTFRleHRGb3JtYXR0ZXIgdGV4dEZvcm1hdHRlciA9IChIVE1MVGV4dEZvcm1hdHRlcikgZm9ybWF0dGVyOwotCQkJCQl0ZXh0Rm9ybWF0dGVyLmZvcm1hdFRleHQodGV4dCwgY29udHJhaW50cywgSFRNTFRleHRGb3JtYXR0ZXIuRk9STUFUX0hFQUQpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQllbHNlIHsKLQkJCXNwYWNlcyA9IGdldEJyZWFrU3BhY2VzKG5vZGUpOwotCQl9Ci0JCWlmIChzcGFjZXMgPT0gbnVsbCB8fCBzcGFjZXMubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybjsKLQotCQlyZXBsYWNlU291cmNlKG5vZGUuZ2V0TW9kZWwoKSwgbm9kZS5nZXRFbmRPZmZzZXQoKSwgMCwgc3BhY2VzKTsKLQkJc2V0V2lkdGgoY29udHJhaW50cywgc3BhY2VzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRCcmVha0JlZm9yZShJRE9NTm9kZSBub2RlLCBIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQlyZXR1cm47Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBwcmV2ID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQotCQlTdHJpbmcgc3BhY2VzID0gbnVsbDsKLQkJaWYgKHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCWlmIChjb250cmFpbnRzICE9IG51bGwgJiYgY29udHJhaW50cy5nZXRGb3JtYXRXaXRoU2libGluZ0luZGVudCgpKSB7Ci0JCQkJSURPTU5vZGUgdGV4dCA9IChJRE9NTm9kZSkgcHJldjsKLQkJCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBIVE1MRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUZvcm1hdHRlcih0ZXh0LCBnZXRGb3JtYXRQcmVmZXJlbmNlcygpKTsKLQkJCQlpZiAoZm9ybWF0dGVyIGluc3RhbmNlb2YgSFRNTFRleHRGb3JtYXR0ZXIpIHsKLQkJCQkJSFRNTFRleHRGb3JtYXR0ZXIgdGV4dEZvcm1hdHRlciA9IChIVE1MVGV4dEZvcm1hdHRlcikgZm9ybWF0dGVyOwotCQkJCQl0ZXh0Rm9ybWF0dGVyLmZvcm1hdFRleHQodGV4dCwgY29udHJhaW50cywgSFRNTFRleHRGb3JtYXR0ZXIuRk9STUFUX1RBSUwpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQllbHNlIHsKLQkJCXNwYWNlcyA9IGdldEJyZWFrU3BhY2VzKG5vZGUpOwotCQl9Ci0JCWlmIChzcGFjZXMgPT0gbnVsbCB8fCBzcGFjZXMubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybjsKLQotCQlyZXBsYWNlU291cmNlKG5vZGUuZ2V0TW9kZWwoKSwgbm9kZS5nZXRTdGFydE9mZnNldCgpLCAwLCBzcGFjZXMpOwotCQlzZXRXaWR0aChjb250cmFpbnRzLCBzcGFjZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzV2lkdGhBdmFpbGFibGUoSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cywgaW50IHdpZHRoKSB7Ci0JCWlmIChjb250cmFpbnRzID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKCFzcGxpdExpbmVzKCkgfHwgZ2V0TGluZVdpZHRoKCkgPCAwKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiAoY29udHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKSA+PSB3aWR0aCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4ga2VlcEJsYW5rTGluZXMoSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlpZiAoY29udHJhaW50cyA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiAoIWNvbnRyYWludHMuZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2VTb3VyY2UoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBmbGF0Tm9kZS5nZXRQYXJlbnREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXNvdXJjZSA9IG5ldyBTdHJpbmcoKTsKLQkJaW50IHN0YXJ0T2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudC5jb250YWluc1JlYWRPbmx5KHN0YXJ0T2Zmc2V0ICsgb2Zmc2V0LCBsZW5ndGgpKQotCQkJcmV0dXJuOwotCQkvLyBXZSB1c2UgJ3N0cnVjdHVyZWREb2N1bWVudCcgYXMgdGhlIHJlcXVlc3RlciBvYmplY3QganVzdCBzbyB0aGlzCi0JCS8vIGFuZCB0aGUgb3RoZXIKLQkJLy8gZm9ybWF0LXJlbGF0ZWQgJ3JlcGFsY2VUZXh0JyAoaW4gcmVwbGFjZVNvdXJjZSkgY2FuIHVzZSB0aGUgc2FtZQotCQkvLyByZXF1ZXN0ZXIuCi0JCS8vIE90aGVyd2lzZSwgaWYgcmVxdWVzdGVyIGlzIG5vdCBpZGVudGljYWwsCi0JCS8vIHRoZSB1bmRvIGdyb3VwIGdldHMgImJyb2tlbiIgaW50byBtdWx0aXBsZSBwaWVjZXMgYmFzZWQKLQkJLy8gb24gdGhlIHJlcXVlc3RlcnMgYmVpbmcgZGlmZmVyZW50LiBUZWNobmljYWxseSwgYW55IHVuaXF1ZSwgY29tbW9uCi0JCS8vIHJlcXVlc3RlciBvYmplY3Qgd291bGQgd29yay4KLQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnRPZmZzZXQgKyBvZmZzZXQsIGxlbmd0aCwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlU291cmNlKElET01Nb2RlbCBtb2RlbCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHNvdXJjZSkgewotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlzb3VyY2UgPSBuZXcgU3RyaW5nKCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQuY29udGFpbnNSZWFkT25seShvZmZzZXQsIGxlbmd0aCkpCi0JCQlyZXR1cm47Ci0JCS8vIFdlIHVzZSAnc3RydWN0dXJlZERvY3VtZW50JyBhcyB0aGUgcmVxdWVzdGVyIG9iamVjdCBqdXN0IHNvIHRoaXMKLQkJLy8gYW5kIHRoZSBvdGhlcgotCQkvLyBmb3JtYXQtcmVsYXRlZCAncmVwYWxjZVRleHQnIChpbiByZXBsYWNlU291cmNlKSBjYW4gdXNlIHRoZSBzYW1lCi0JCS8vIHJlcXVlc3Rlci4KLQkJLy8gT3RoZXJ3aXNlLCBpZiByZXF1ZXN0ZXIgaXMgbm90IGlkZW50aWNhbCwKLQkJLy8gdGhlIHVuZG8gZ3JvdXAgZ2V0cyAiYnJva2VuIiBpbnRvIG11bHRpcGxlIHBpZWNlcyBiYXNlZAotCQkvLyBvbiB0aGUgcmVxdWVzdGVycyBiZWluZyBkaWZmZXJlbnQuIFRlY2huaWNhbGx5LCBhbnkgdW5pcXVlLCBjb21tb24KLQkJLy8gcmVxdWVzdGVyIG9iamVjdCB3b3VsZCB3b3JrLgotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXaWR0aChIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzLCBTdHJpbmcgc291cmNlKSB7Ci0JCWlmIChjb250cmFpbnRzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCi0JCWlmICghc3BsaXRMaW5lcygpKQotCQkJcmV0dXJuOwotCQlpbnQgbGluZVdpZHRoID0gZ2V0TGluZVdpZHRoKCk7Ci0JCWlmIChsaW5lV2lkdGggPCAwKQotCQkJcmV0dXJuOwotCi0JCWludCBvZmZzZXQgPSBzb3VyY2UubGFzdEluZGV4T2YoJ1xuJyk7Ci0JCWludCBvZmZzZXQyID0gc291cmNlLmxhc3RJbmRleE9mKCdccicpOwotCQlpZiAob2Zmc2V0MiA+IG9mZnNldCkKLQkJCW9mZnNldCA9IG9mZnNldDI7Ci0JCWlmIChvZmZzZXQgPj0gMCkKLQkJCW9mZnNldCsrOwotCi0JCWludCBhdmFpbGFibGVXaWR0aCA9IDA7Ci0JCWlmIChvZmZzZXQgPj0gMCkgewotCQkJYXZhaWxhYmxlV2lkdGggPSBsaW5lV2lkdGggLSAobGVuZ3RoIC0gb2Zmc2V0KTsKLQkJfQotCQllbHNlIHsKLQkJCWF2YWlsYWJsZVdpZHRoID0gY29udHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKSAtIGxlbmd0aDsKLQkJfQotCQlpZiAoYXZhaWxhYmxlV2lkdGggPCAwKQotCQkJYXZhaWxhYmxlV2lkdGggPSAwOwotCQljb250cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChhdmFpbGFibGVXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2lkdGgoSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cywgTm9kZSBub2RlKSB7Ci0JCWlmIChjb250cmFpbnRzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlpZiAoIXNwbGl0TGluZXMoKSkKLQkJCXJldHVybjsKLQkJaW50IGxpbmVXaWR0aCA9IGdldExpbmVXaWR0aCgpOwotCQlpZiAobGluZVdpZHRoIDwgMCkKLQkJCXJldHVybjsKLQotCQlpbnQgb2Zmc2V0ID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGxpbmUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KG9mZnNldCk7Ci0JCWludCBsaW5lT2Zmc2V0ID0gMDsKLQkJdHJ5IHsKLQkJCWxpbmVPZmZzZXQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJfQotCQlpZiAobGluZU9mZnNldCA+IG9mZnNldCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlpbnQgYXZhaWxhYmxlV2lkdGggPSBsaW5lV2lkdGggLSAob2Zmc2V0IC0gbGluZU9mZnNldCk7Ci0JCWlmIChhdmFpbGFibGVXaWR0aCA8IDApCi0JCQlhdmFpbGFibGVXaWR0aCA9IDA7Ci0KLQkJY29udHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoYXZhaWxhYmxlV2lkdGgpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNwbGl0TGluZXMoKSB7Ci0JCXJldHVybiB0cnVlOy8vIGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0U3BsaXRMaW5lcygpOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGZGb3JtYXRQcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJvdGVjdGVkIEhUTUxGb3JtYXRDb250cmFpbnRzIGZGb3JtYXRDb250cmFpbnRzID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBmUHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQotCS8vIHB1YmxpYyB2b2lkIGZvcm1hdChYTUxOb2RlIG5vZGUsIEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCS8vIGlmIChmb3JtYXRDb250cmFpbnRzLmdldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KCkpCi0JLy8gZm9ybWF0Q29udHJhaW50cy5zZXRDdXJyZW50SW5kZW50KGdldFNpYmxpbmdJbmRlbnQobm9kZSkpOwotCS8vCi0JLy8gZm9ybWF0Tm9kZShub2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQkvLyB9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb3JtYXRQcmVmZXJlbmNlcyhJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGZvcm1hdFByZWZlcmVuY2VzKSB7Ci0JCWZGb3JtYXRQcmVmZXJlbmNlcyA9IGZvcm1hdFByZWZlcmVuY2VzOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGdldEZvcm1hdFByZWZlcmVuY2VzKCkgewotCQlpZiAoZkZvcm1hdFByZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWZGb3JtYXRQcmVmZXJlbmNlcyA9IG5ldyBTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwoKTsKLQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldExpbmVXaWR0aChwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpOwotCQkJCSgoU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKSBmRm9ybWF0UHJlZmVyZW5jZXMpLnNldFNwbGl0TXVsdGlBdHRycyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTKSk7Ci0JCQkJKChTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwpIGZGb3JtYXRQcmVmZXJlbmNlcykuc2V0QWxpZ25FbmRCcmFja2V0KHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQUxJR05fRU5EX0JSQUNLRVQpKTsKLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0Q2xlYXJBbGxCbGFua0xpbmVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTKSk7Ci0KLQkJCQljaGFyIGluZGVudENoYXIgPSAnICc7Ci0JCQkJU3RyaW5nIGluZGVudENoYXJQcmVmID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQkJCWlmIChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIuZXF1YWxzKGluZGVudENoYXJQcmVmKSkgewotCQkJCQlpbmRlbnRDaGFyID0gJ1x0JzsKLQkJCQl9Ci0JCQkJaW50IGluZGVudGF0aW9uV2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQkJCWluZGVudC5hcHBlbmQoaW5kZW50Q2hhcik7Ci0JCQkJfQotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRJbmRlbnQoaW5kZW50LnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZGb3JtYXRQcmVmZXJlbmNlczsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGdldEZvcm1hdENvbnRyYWludHMoKSB7Ci0JCWlmIChmRm9ybWF0Q29udHJhaW50cyA9PSBudWxsKSB7Ci0JCQlmRm9ybWF0Q29udHJhaW50cyA9IG5ldyBIVE1MRm9ybWF0Q29udHJhaW50c0ltcGwoKTsKLQotCQkJZkZvcm1hdENvbnRyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0TGluZVdpZHRoKCkpOwotCQkJZkZvcm1hdENvbnRyYWludHMuc2V0Q2xlYXJBbGxCbGFua0xpbmVzKGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCkpOwotCQl9Ci0KLQkJcmV0dXJuIGZGb3JtYXRDb250cmFpbnRzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlmUHJvZ3Jlc3NNb25pdG9yID0gcHJvZ3Jlc3NNb25pdG9yOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxGb3JtYXR0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxGb3JtYXR0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNDcwMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRm9ybWF0dGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8vIG5ha2Ftb3JpX1RPRE86IGNoZWNrIGFuZCByZW1vdmUgQ1NTIGZvcm1hdHRpbmcKLQotY2xhc3MgSFRNTEZvcm1hdHRlckZhY3RvcnkgewotCXByaXZhdGUgc3RhdGljIEhUTUxGb3JtYXR0ZXJGYWN0b3J5IGZJbnN0YW5jZSA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCBmRm9ybWF0UHJlZmVyZW5jZXMgPSBudWxsOwotCi0Jc3RhdGljIHN5bmNocm9uaXplZCBIVE1MRm9ybWF0dGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgSFRNTEZvcm1hdHRlckZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdHRlciBjcmVhdGVGb3JtYXR0ZXIoTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGZvcm1hdFByZWZlcmVuY2VzKSB7Ci0JCUlTdHJ1Y3R1cmVkRm9ybWF0dGVyIGZvcm1hdHRlciA9IG51bGw7Ci0KLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCWZvcm1hdHRlciA9IG5ldyBIVE1MRWxlbWVudEZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0JCQkJaWYgKGlzRW1iZWRkZWRDU1Mobm9kZSkpIHsKLQkJCQkJZm9ybWF0dGVyID0gbmV3IEVtYmVkZGVkQ1NTRm9ybWF0dGVyKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmb3JtYXR0ZXIgPSBuZXcgSFRNTFRleHRGb3JtYXR0ZXIoKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgSFRNTEZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQl9Ci0KLQkJLy8gaW5pdCBGb3JtYXRQcmVmZXJlbmNlcwotCQlmb3JtYXR0ZXIuc2V0Rm9ybWF0UHJlZmVyZW5jZXMoZm9ybWF0UHJlZmVyZW5jZXMpOwotCi0JCXJldHVybiBmb3JtYXR0ZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRW1iZWRkZWRDU1MoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgbmFtZSA9IHBhcmVudC5nZXROb2RlTmFtZSgpOwotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJTVFlMRSIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCXByaXZhdGUgSFRNTEZvcm1hdHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCBnZXRGb3JtYXRQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGZGb3JtYXRQcmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlmRm9ybWF0UHJlZmVyZW5jZXMgPSBuZXcgU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKCk7Ci0KLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRMaW5lV2lkdGgocHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKTsKLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0U3BsaXRNdWx0aUF0dHJzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BMSVRfTVVMVElfQVRUUlMpKTsKLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0QWxpZ25FbmRCcmFja2V0KHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQUxJR05fRU5EX0JSQUNLRVQpKTsKLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0Q2xlYXJBbGxCbGFua0xpbmVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTKSk7Ci0KLQkJCQljaGFyIGluZGVudENoYXIgPSAnICc7Ci0JCQkJU3RyaW5nIGluZGVudENoYXJQcmVmID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQkJCWlmIChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIuZXF1YWxzKGluZGVudENoYXJQcmVmKSkgewotCQkJCQlpbmRlbnRDaGFyID0gJ1x0JzsKLQkJCQl9Ci0JCQkJaW50IGluZGVudGF0aW9uV2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQkJCWluZGVudC5hcHBlbmQoaW5kZW50Q2hhcik7Ci0JCQkJfQotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRJbmRlbnQoaW5kZW50LnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZGb3JtYXRQcmVmZXJlbmNlczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MVGV4dEZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MVGV4dEZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWFlZmQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTFRleHRGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgSFRNTFRleHRGb3JtYXR0ZXIgZXh0ZW5kcyBIVE1MRm9ybWF0dGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgaW50IEZPUk1BVF9BTEwgPSAwOwotCXB1YmxpYyBzdGF0aWMgaW50IEZPUk1BVF9IRUFEID0gMTsKLQlwdWJsaWMgc3RhdGljIGludCBGT1JNQVRfVEFJTCA9IDI7Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSFRNTFRleHRGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNhbkZvcm1hdFRleHQoSURPTVRleHQgdGV4dCkgewotCQlpZiAodGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSB0ZXh0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IGZsYXROb2RlLmdldFR5cGUoKTsKLQkJCWlmIChpc1VucGFyc2VkUmVnaW9uKHR5cGUpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCU5vZGUgcGFyZW50ID0gdGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgcGFyZW50OwotCQkJaWYgKCFlbGVtZW50LmlzR2xvYmFsVGFnKCkgJiYgIXRleHQuaXNFbGVtZW50Q29udGVudFdoaXRlc3BhY2UoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gY2FuRm9ybWF0Q2hpbGQocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNVbnBhcnNlZFJlZ2lvbihTdHJpbmcgdHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGlzTmVzdGVkU2Nhbm5lZFJlZ2lvbih0eXBlKSB8fCBpc0Jsb2NrU2Nhbm5lZFJlZ2lvbih0eXBlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNCbG9ja1NjYW5uZWRSZWdpb24oU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUOwotCX0KLQotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXN0ZWRTY2FubmVkUmVnaW9uKFN0cmluZyB0eXBlKSB7Ci0JCWZpbmFsIFN0cmluZyBKU1BfQ09OVEVOVCA9ICJKU1BfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHR5cGUuZXF1YWxzKEpTUF9DT05URU5UKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2FuUmVtb3ZlSGVhZGluZ1NwYWNlcyhJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChub2RlLmdldFByZXZpb3VzU2libGluZygpICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBwYXJlbnQpOwotCQlpZiAoZGVjbCA9PSBudWxsIHx8ICghZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLkxJTkVfQlJFQUtfSElOVCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgaGludCA9IChTdHJpbmcpIGRlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpOwotCQlyZXR1cm4gaGludC5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjYW5SZW1vdmVUYWlsaW5nU3BhY2VzKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwgfHwgcGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldEVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgcGFyZW50KTsKLQkJaWYgKGRlY2wgPT0gbnVsbCB8fCAoIWRlY2wuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIGhpbnQgPSAoU3RyaW5nKSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuTElORV9CUkVBS19ISU5UKTsKLQkJcmV0dXJuIGhpbnQuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXROb2RlKElET01Ob2RlIG5vZGUsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJZm9ybWF0VGV4dChub2RlLCBjb250cmFpbnRzLCBGT1JNQVRfQUxMKTsgLy8gZnVsbCBmb3JtYXQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRUZXh0KElET01Ob2RlIG5vZGUsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMsIGludCBtb2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJRE9NVGV4dCB0ZXh0ID0gKElET01UZXh0KSBub2RlOwotCQlTdHJpbmcgc291cmNlID0gdGV4dC5nZXRTb3VyY2UoKTsKLQotCQlpZiAoIWNhbkZvcm1hdFRleHQodGV4dCkpIHsKLQkJCXNldFdpZHRoKGNvbnRyYWludHMsIHNvdXJjZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgb2Zmc2V0ID0gdGV4dC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gdGV4dC5nZXRFbmRPZmZzZXQoKSAtIG9mZnNldDsKLQotCQkvLyBmb3JtYXQgYWRqYWNlbnQgdGV4dCBhdCBvbmNlCi0JCWlmIChtb2RlID09IEZPUk1BVF9IRUFEKSB7Ci0JCQlOb2RlIG5leHQgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl3aGlsZSAobmV4dCAhPSBudWxsICYmIG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCUlET01UZXh0IG5leHRUZXh0ID0gKElET01UZXh0KSBuZXh0OwotCQkJCWxlbmd0aCArPSAobmV4dFRleHQuZ2V0RW5kT2Zmc2V0KCkgLSBuZXh0VGV4dC5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlTdHJpbmcgbmV4dFNvdXJjZSA9IG5leHRUZXh0LmdldFNvdXJjZSgpOwotCQkJCWlmIChuZXh0U291cmNlICE9IG51bGwgJiYgbmV4dFNvdXJjZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJCQkJc291cmNlID0gbmV4dFNvdXJjZTsKLQkJCQkJZWxzZQotCQkJCQkJc291cmNlICs9IG5leHRTb3VyY2U7Ci0JCQkJfQotCQkJCW5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobW9kZSA9PSBGT1JNQVRfVEFJTCkgewotCQkJTm9kZSBwcmV2ID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCXdoaWxlIChwcmV2ICE9IG51bGwgJiYgcHJldi5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJSURPTVRleHQgcHJldlRleHQgPSAoSURPTVRleHQpIHByZXY7Ci0JCQkJb2Zmc2V0ID0gcHJldlRleHQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlsZW5ndGggKz0gKHByZXZUZXh0LmdldEVuZE9mZnNldCgpIC0gb2Zmc2V0KTsKLQkJCQlTdHJpbmcgcHJldlNvdXJjZSA9IHByZXZUZXh0LmdldFNvdXJjZSgpOwotCQkJCWlmIChwcmV2U291cmNlICE9IG51bGwgJiYgcHJldlNvdXJjZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJCQkJc291cmNlID0gcHJldlNvdXJjZTsKLQkJCQkJZWxzZQotCQkJCQkJc291cmNlID0gcHJldlNvdXJjZSArIHNvdXJjZTsKLQkJCQl9Ci0JCQkJcHJldiA9IHByZXYuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlTcGFjZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgU3BhY2VDb252ZXJ0ZXIoc291cmNlLCBrZWVwQmxhbmtMaW5lcyhjb250cmFpbnRzKSk7Ci0KLQkJaW50IHdvcmRMZW5ndGggPSBjb252ZXJ0ZXIubmV4dFdvcmQoKTsKLQkJaWYgKHdvcmRMZW5ndGggPT0gMCkgeyAvLyBvbmx5IHNwYWNlcwotCQkJaWYgKCFjb252ZXJ0ZXIuaGFzU3BhY2VzKCkpCi0JCQkJcmV0dXJuOyAvLyBlbXB0eQotCQkJYm9vbGVhbiByZW1vdmVTcGFjZXMgPSBmYWxzZTsKLQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCS8vIGNoZWNrIGlmIHRhZ3MgYXJlIG9taXR0ZWQKLQkJCQlJRE9NTm9kZSBlbGVtZW50ID0gKElET01Ob2RlKSBwYXJlbnQ7Ci0JCQkJaWYgKG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkgPT0gbnVsbCAmJiBlbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkgewotCQkJCQlyZW1vdmVTcGFjZXMgPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlLmdldE5leHRTaWJsaW5nKCkgPT0gbnVsbCAmJiBlbGVtZW50LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpIHsKLQkJCQkJcmVtb3ZlU3BhY2VzID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocmVtb3ZlU3BhY2VzKSB7Ci0JCQkJY29udmVydGVyLnJlcGxhY2VTcGFjZXMobnVsbCk7Ci0JCQl9Ci0JCQllbHNlIGlmICghaXNXaWR0aEF2YWlsYWJsZShjb250cmFpbnRzLCAyKSB8fCBjYW5JbnNlcnRCcmVha0FmdGVyKG5vZGUpIHx8IGNhbkluc2VydEJyZWFrQmVmb3JlKG5vZGUpKSB7Ci0JCQkJU3RyaW5nIHNwYWNlcyA9IG51bGw7Ci0JCQkJaWYgKG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsKSB7IC8vIGxhc3Qgc3BhY2VzCi0JCQkJCS8vIHVzZSBwYXJlbnQgaW5kZW50IGZvciB0aGUgZW5kIHRhZwotCQkJCQlzcGFjZXMgPSBnZXRCcmVha1NwYWNlcyhwYXJlbnQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3BhY2VzID0gZ2V0QnJlYWtTcGFjZXMobm9kZSk7Ci0JCQkJfQotCQkJCWNvbnZlcnRlci5yZXBsYWNlU3BhY2VzKHNwYWNlcyk7Ci0JCQkJc2V0V2lkdGgoY29udHJhaW50cywgc3BhY2VzKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNhblJlbW92ZUhlYWRpbmdTcGFjZXMobm9kZSkgfHwgY2FuUmVtb3ZlVGFpbGluZ1NwYWNlcyhub2RlKSkgewotCQkJCWNvbnZlcnRlci5yZXBsYWNlU3BhY2VzKG51bGwpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY29udmVydGVyLmNvbXByZXNzU3BhY2VzKCk7Ci0JCQkJYWRkV2lkdGgoY29udHJhaW50cywgMSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgYnJlYWtTcGFjZXMgPSBudWxsOwotCi0JCQkvLyBmb3JtYXQgaGVhZGluZyBzcGFjZXMKLQkJCWJvb2xlYW4gaGFzU3BhY2VzID0gY29udmVydGVyLmhhc1NwYWNlcygpOwotCQkJaWYgKG1vZGUgPT0gRk9STUFUX1RBSUwpIHsKLQkJCQkvLyBrZWVwIHNwYWNlcyBhcyBpcwotCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIGNvbnZlcnRlci5nZXRTcGFjZUNvdW50KCkpOwotCQkJfQotCQkJZWxzZSBpZiAoKGhhc1NwYWNlcyAmJiAhaXNXaWR0aEF2YWlsYWJsZShjb250cmFpbnRzLCB3b3JkTGVuZ3RoICsgMSkpIHx8IGNhbkluc2VydEJyZWFrQmVmb3JlKG5vZGUpKSB7Ci0JCQkJYnJlYWtTcGFjZXMgPSBnZXRCcmVha1NwYWNlcyhub2RlKTsKLQkJCQljb252ZXJ0ZXIucmVwbGFjZVNwYWNlcyhicmVha1NwYWNlcyk7Ci0JCQkJc2V0V2lkdGgoY29udHJhaW50cywgYnJlYWtTcGFjZXMpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGhhc1NwYWNlcykgewotCQkJCQlpZiAoY2FuUmVtb3ZlSGVhZGluZ1NwYWNlcyhub2RlKSkgewotCQkJCQkJY29udmVydGVyLnJlcGxhY2VTcGFjZXMobnVsbCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQljb252ZXJ0ZXIuY29tcHJlc3NTcGFjZXMoKTsKLQkJCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIDEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJYWRkV2lkdGgoY29udHJhaW50cywgd29yZExlbmd0aCk7Ci0KLQkJCS8vIGZvcm1hdCBtaWRkbGUKLQkJCXdvcmRMZW5ndGggPSBjb252ZXJ0ZXIubmV4dFdvcmQoKTsKLQkJCXdoaWxlICh3b3JkTGVuZ3RoID4gMCkgewotCQkJCWlmIChtb2RlICE9IEZPUk1BVF9BTEwpIHsKLQkJCQkJLy8ga2VlcCBzcGFjZXMgYXMgaXMKLQkJCQkJYWRkV2lkdGgoY29udHJhaW50cywgY29udmVydGVyLmdldFNwYWNlQ291bnQoKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCFpc1dpZHRoQXZhaWxhYmxlKGNvbnRyYWludHMsIHdvcmRMZW5ndGggKyAxKSkgewotCQkJCQlpZiAoYnJlYWtTcGFjZXMgPT0gbnVsbCkKLQkJCQkJCWJyZWFrU3BhY2VzID0gZ2V0QnJlYWtTcGFjZXMobm9kZSk7Ci0JCQkJCWNvbnZlcnRlci5yZXBsYWNlU3BhY2VzKGJyZWFrU3BhY2VzKTsKLQkJCQkJc2V0V2lkdGgoY29udHJhaW50cywgYnJlYWtTcGFjZXMpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY29udmVydGVyLmNvbXByZXNzU3BhY2VzKCk7Ci0JCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIDEpOwotCQkJCX0KLQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCB3b3JkTGVuZ3RoKTsKLQkJCQl3b3JkTGVuZ3RoID0gY29udmVydGVyLm5leHRXb3JkKCk7Ci0JCQl9Ci0KLQkJCS8vIGZvcm1hdCB0YWlsaW5nIHNwYWNlcwotCQkJaGFzU3BhY2VzID0gY29udmVydGVyLmhhc1NwYWNlcygpOwotCQkJaWYgKG1vZGUgPT0gRk9STUFUX0hFQUQpIHsKLQkJCQkvLyBrZWVwIHNwYWNlcyBhcyBpcwotCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIGNvbnZlcnRlci5nZXRTcGFjZUNvdW50KCkpOwotCQkJfQotCQkJZWxzZSBpZiAoKGhhc1NwYWNlcyAmJiAhaXNXaWR0aEF2YWlsYWJsZShjb250cmFpbnRzLCAyKSkgfHwgY2FuSW5zZXJ0QnJlYWtBZnRlcihub2RlKSkgewotCQkJCWlmIChub2RlLmdldE5leHRTaWJsaW5nKCkgPT0gbnVsbCkgeyAvLyBsYXN0IHRlc3QKLQkJCQkJLy8gdXNlIHBhcmVudCBpbmRlbnQgZm9yIHRoZSBlbmQgdGFnCi0JCQkJCWJyZWFrU3BhY2VzID0gZ2V0QnJlYWtTcGFjZXMocGFyZW50KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChicmVha1NwYWNlcyA9PSBudWxsKQotCQkJCQkJYnJlYWtTcGFjZXMgPSBnZXRCcmVha1NwYWNlcyhub2RlKTsKLQkJCQl9Ci0JCQkJY29udmVydGVyLnJlcGxhY2VTcGFjZXMoYnJlYWtTcGFjZXMpOwotCQkJCXNldFdpZHRoKGNvbnRyYWludHMsIGJyZWFrU3BhY2VzKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChoYXNTcGFjZXMpIHsKLQkJCQkJaWYgKGNhblJlbW92ZVRhaWxpbmdTcGFjZXMobm9kZSkpIHsKLQkJCQkJCWNvbnZlcnRlci5yZXBsYWNlU3BhY2VzKG51bGwpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJY29udmVydGVyLmNvbXByZXNzU3BhY2VzKCk7Ci0JCQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCAxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChjb252ZXJ0ZXIuaXNNb2RpZmllZCgpKSB7Ci0JCQlzb3VyY2UgPSBjb252ZXJ0ZXIuZ2V0U291cmNlKCk7Ci0JCQlyZXBsYWNlU291cmNlKHRleHQuZ2V0TW9kZWwoKSwgb2Zmc2V0LCBsZW5ndGgsIHNvdXJjZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L1NwYWNlQ29udmVydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L1NwYWNlQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZjkyMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9TcGFjZUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLQotCi1maW5hbCBjbGFzcyBTcGFjZUNvbnZlcnRlciB7Ci0KLQlwcml2YXRlIFN0cmluZyBzb3VyY2UgPSBudWxsOwotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBpbnQgc3RhcnRPZmZzZXQgPSAwOwotCXByaXZhdGUgaW50IGVuZE9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBpbnQgc3BhY2VDb3VudCA9IDA7Ci0JcHJpdmF0ZSBpbnQgd29yZENvdW50ID0gMDsKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCXByaXZhdGUgaW50IGxhc3RPZmZzZXQgPSAwOwotCXByaXZhdGUgYm9vbGVhbiBrZWVwQmxhbmtMaW5lcyA9IGZhbHNlOwotCi0JLyoqCi0JICovCi0JcHVibGljIFNwYWNlQ29udmVydGVyKFN0cmluZyBzb3VyY2UpIHsKLQkJc3VwZXIoKTsKLQotCQlpZiAoc291cmNlID09IG51bGwpIHsKLQkJCXRoaXMuc291cmNlID0gbmV3IFN0cmluZygpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCQl0aGlzLmxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTcGFjZUNvbnZlcnRlcihTdHJpbmcgc291cmNlLCBib29sZWFuIGtlZXBCbGFua0xpbmVzKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNvdXJjZSA9IG5ldyBTdHJpbmcoKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy5sZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCX0KLQkJdGhpcy5rZWVwQmxhbmtMaW5lcyA9IGtlZXBCbGFua0xpbmVzOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbXByZXNzU3BhY2VzKCkgewotCQlpZiAodGhpcy5zcGFjZUNvdW50ID09IDApCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLnNwYWNlQ291bnQgPT0gMSAmJiB0aGlzLnNvdXJjZS5jaGFyQXQodGhpcy5zdGFydE9mZnNldCkgPT0gJyAnKQotCQkJcmV0dXJuOwotCi0JCWlmICh0aGlzLmJ1ZmZlciA9PSBudWxsKQotCQkJdGhpcy5idWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmICh0aGlzLnN0YXJ0T2Zmc2V0ID4gdGhpcy5sYXN0T2Zmc2V0KSB7Ci0JCQl0aGlzLmJ1ZmZlci5hcHBlbmQodGhpcy5zb3VyY2Uuc3Vic3RyaW5nKHRoaXMubGFzdE9mZnNldCwgdGhpcy5zdGFydE9mZnNldCkpOwotCQl9Ci0KLQkJdGhpcy5idWZmZXIuYXBwZW5kKCcgJyk7Ci0KLQkJdGhpcy5sYXN0T2Zmc2V0ID0gdGhpcy5zdGFydE9mZnNldCArIHRoaXMuc3BhY2VDb3VudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKLQkJaWYgKHRoaXMuYnVmZmVyID09IG51bGwpCi0JCQl0aGlzLmJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKHRoaXMubGVuZ3RoID4gdGhpcy5sYXN0T2Zmc2V0KSB7Ci0JCQl0aGlzLmJ1ZmZlci5hcHBlbmQodGhpcy5zb3VyY2Uuc3Vic3RyaW5nKHRoaXMubGFzdE9mZnNldCwgdGhpcy5sZW5ndGgpKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5idWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNwYWNlQ291bnQoKSB7Ci0JCXJldHVybiB0aGlzLnNwYWNlQ291bnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzU3BhY2VzKCkgewotCQlyZXR1cm4gKHRoaXMuc3BhY2VDb3VudCA+IDApOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpZWQoKSB7Ci0JCXJldHVybiAodGhpcy5idWZmZXIgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIG51bWJlciBvZiB0aGUgb2xkIGJsYW5rIGxpbmVzIHRvIG5ldyBzcGFjZSBzdHJpbmcKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbWVyZ2VCbGFua0xpbmVzKFN0cmluZyBuZXdTcGFjZXMsIFN0cmluZyBvbGRTcGFjZXMpIHsKLQkJaWYgKG5ld1NwYWNlcyA9PSBudWxsIHx8IG5ld1NwYWNlcy5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG5ld1NwYWNlczsKLQkJaWYgKG9sZFNwYWNlcyA9PSBudWxsKQotCQkJcmV0dXJuIG5ld1NwYWNlczsKLQotCQkvLyBjb3VudCBvbGQgbmV3IGxpbmVzCi0JCWludCBuZXdMaW5lQ291bnQgPSAwOwotCQlpbnQgb2xkTGVuZ3RoID0gb2xkU3BhY2VzLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZExlbmd0aDsgaSsrKSB7Ci0JCQljaGFyIGMgPSBvbGRTcGFjZXMuY2hhckF0KGkpOwotCQkJaWYgKGMgPT0gJ1xyJykgewotCQkJCW5ld0xpbmVDb3VudCsrOwotCQkJCWlmIChpICsgMSA8IG9sZExlbmd0aCkgewotCQkJCQljID0gb2xkU3BhY2VzLmNoYXJBdChpICsgMSk7Ci0JCQkJCWlmIChjID09ICdcbicpCi0JCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGMgPT0gJ1xuJykKLQkJCQkJbmV3TGluZUNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5ld0xpbmVDb3VudCA8IDIpCi0JCQlyZXR1cm4gbmV3U3BhY2VzOyAvLyBubyBibGFuayBsaW5lCi0KLQkJLy8gaGVyZSBhc3N1bWluZyBuZXdTcGFjZXMgc3RhcnRzIHdpdGggYSBuZXcgbGluZSBpZiBhbnkKLQkJU3RyaW5nIGRlbGltID0gbnVsbDsKLQkJY2hhciBkID0gbmV3U3BhY2VzLmNoYXJBdCgwKTsKLQkJaWYgKGQgPT0gJ1xyJykgewotCQkJaWYgKG5ld1NwYWNlcy5sZW5ndGgoKSA+IDEgJiYgbmV3U3BhY2VzLmNoYXJBdCgxKSA9PSAnXG4nKQotCQkJCWRlbGltID0gIlxyXG4iOy8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlkZWxpbSA9ICJcciI7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGQgPT0gJ1xuJykKLQkJCQlkZWxpbSA9ICJcbiI7Ly8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCXJldHVybiBuZXdTcGFjZXM7IC8vIG5vIG5ldyBsaW5lCi0JCX0KLQotCQluZXdMaW5lQ291bnQtLTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobmV3U3BhY2VzLmxlbmd0aCgpICsgbmV3TGluZUNvdW50ICogMik7Ci0JCXdoaWxlIChuZXdMaW5lQ291bnQgPiAwKSB7Ci0JCQlidWZmZXIuYXBwZW5kKGRlbGltKTsKLQkJCW5ld0xpbmVDb3VudC0tOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQobmV3U3BhY2VzKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgbmV4dFdvcmQoKSB7Ci0JCWlmICh0aGlzLmVuZE9mZnNldCA9PSB0aGlzLmxlbmd0aCkgewotCQkJdGhpcy5zdGFydE9mZnNldCA9IHRoaXMuZW5kT2Zmc2V0OwotCQkJdGhpcy5zcGFjZUNvdW50ID0gMDsKLQkJCXRoaXMud29yZENvdW50ID0gMDsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJdGhpcy5zdGFydE9mZnNldCA9IHRoaXMuZW5kT2Zmc2V0OwotCQlpbnQgaSA9IHRoaXMuc3RhcnRPZmZzZXQ7Ci0JCWZvciAoOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHRoaXMuc291cmNlLmNoYXJBdChpKSkpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJdGhpcy5zcGFjZUNvdW50ID0gaSAtIHRoaXMuc3RhcnRPZmZzZXQ7Ci0KLQkJaW50IHdvcmRPZmZzZXQgPSBpOwotCQlmb3IgKDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHRoaXMuc291cmNlLmNoYXJBdChpKSkpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJdGhpcy53b3JkQ291bnQgPSBpIC0gd29yZE9mZnNldDsKLQkJdGhpcy5lbmRPZmZzZXQgPSBpOwotCi0JCXJldHVybiB0aGlzLndvcmRDb3VudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBsYWNlU3BhY2VzKFN0cmluZyBzcGFjZXMpIHsKLQkJaW50IHNwYWNlTGVuZ3RoID0gKHNwYWNlcyAhPSBudWxsID8gc3BhY2VzLmxlbmd0aCgpIDogMCk7Ci0JCVN0cmluZyBvbGRTcGFjZXMgPSBudWxsOwotCQlpZiAoc3BhY2VMZW5ndGggPT0gdGhpcy5zcGFjZUNvdW50KSB7Ci0JCQlpZiAoc3BhY2VMZW5ndGggPT0gMCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAodGhpcy5zdGFydE9mZnNldCA9PSAwKSB7Ci0JCQkJaWYgKHRoaXMuc291cmNlLnN0YXJ0c1dpdGgoc3BhY2VzKSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJZWxzZSBpZiAodGhpcy5lbmRPZmZzZXQgPT0gdGhpcy5sZW5ndGgpIHsKLQkJCQlpZiAodGhpcy5zb3VyY2UuZW5kc1dpdGgoc3BhY2VzKSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IHRleHRPZmZzZXQgPSB0aGlzLnN0YXJ0T2Zmc2V0ICsgdGhpcy5zcGFjZUNvdW50OwotCQkJCW9sZFNwYWNlcyA9IHRoaXMuc291cmNlLnN1YnN0cmluZyh0aGlzLnN0YXJ0T2Zmc2V0LCB0ZXh0T2Zmc2V0KTsKLQkJCQlpZiAob2xkU3BhY2VzLmVxdWFscyhzcGFjZXMpKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJaWYgKHRoaXMua2VlcEJsYW5rTGluZXMgJiYgdGhpcy5zcGFjZUNvdW50ID4gMCkgewotCQkJaWYgKG9sZFNwYWNlcyA9PSBudWxsKSB7Ci0JCQkJaW50IHRleHRPZmZzZXQgPSB0aGlzLnN0YXJ0T2Zmc2V0ICsgdGhpcy5zcGFjZUNvdW50OwotCQkJCW9sZFNwYWNlcyA9IHRoaXMuc291cmNlLnN1YnN0cmluZyh0aGlzLnN0YXJ0T2Zmc2V0LCB0ZXh0T2Zmc2V0KTsKLQkJCX0KLQkJCWlmIChvbGRTcGFjZXMgIT0gbnVsbCkgewotCQkJCXNwYWNlcyA9IG1lcmdlQmxhbmtMaW5lcyhzcGFjZXMsIG9sZFNwYWNlcyk7Ci0JCQkJaWYgKG9sZFNwYWNlcy5lcXVhbHMoc3BhY2VzKSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJaWYgKHRoaXMuYnVmZmVyID09IG51bGwpCi0JCQl0aGlzLmJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKHRoaXMuc3RhcnRPZmZzZXQgPiB0aGlzLmxhc3RPZmZzZXQpIHsKLQkJCXRoaXMuYnVmZmVyLmFwcGVuZCh0aGlzLnNvdXJjZS5zdWJzdHJpbmcodGhpcy5sYXN0T2Zmc2V0LCB0aGlzLnN0YXJ0T2Zmc2V0KSk7Ci0JCX0KLQotCQlpZiAoc3BhY2VMZW5ndGggPiAwKQotCQkJdGhpcy5idWZmZXIuYXBwZW5kKHNwYWNlcyk7Ci0KLQkJdGhpcy5sYXN0T2Zmc2V0ID0gdGhpcy5zdGFydE9mZnNldCArIHRoaXMuc3BhY2VDb3VudDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQWJzdHJhY3RDU1NNb2RlbEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0Fic3RyYWN0Q1NTTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MTg2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQWJzdHJhY3RDU1NNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkNTU01vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSUNTU01vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDU1NNb2RlbEFkYXB0ZXIgaW1wbGVtZW50cyBJQ1NTTW9kZWxBZGFwdGVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1NTX0lEID0gQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUzsKLQotCXByaXZhdGUgRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQlwcml2YXRlIElDU1NNb2RlbCBtb2RlbCA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlBYnN0cmFjdENTU01vZGVsQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSUNTU01vZGVsIGNyZWF0ZU1vZGVsKCkgewotCQkvLyBjcmVhdGUgZW1iZWRkZWQgQ1NTIG1vZGVsIChub3QgZm9yIGV4dGVybmFsIENTUykKLQkJaWYgKGdldEVsZW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsID0gKChJRE9NTm9kZSkgZ2V0RWxlbWVudCgpKS5nZXRNb2RlbCgpOwotCQlJQ1NTTW9kZWwgbmV3TW9kZWwgPSAoSUNTU01vZGVsKSBiYXNlTW9kZWwuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKENTU19JRCk7Ci0JCSgoQ1NTTW9kZWxJbXBsKSBuZXdNb2RlbCkuc2V0T3duZXJET01Ob2RlKGdldEVsZW1lbnQoKSk7Ci0JCXJldHVybiBuZXdNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBJQ1NTTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMubW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5U3R5bGVDaGFuZ2VkKEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgdGFyZ2V0OwotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ29sbGVjdGlvbiBhZGFwdGVycyA9IG5vdGlmaWVyLmdldEFkYXB0ZXJzKCk7Ci0JCWlmIChhZGFwdGVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvciBpdCA9IGFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCWlmIChpdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IChJTm9kZUFkYXB0ZXIpIGl0Lm5leHQoKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgU3R5bGVMaXN0ZW5lcikgewotCQkJCVN0eWxlTGlzdGVuZXIgbGlzdGVuZXIgPSAoU3R5bGVMaXN0ZW5lcikgYWRhcHRlcjsKLQkJCQlsaXN0ZW5lci5zdHlsZUNoYW5nZWQoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayAKLQkgKiAxLiBJZiBhdHRyaWJ1dGVzIG9mIGVsZW1lbnQgaXMgdmFsaWQgKHR5cGUscmVsIC4uLikKLQkgKiAyLiBJZiBjb250ZW50IG1vZGVsIHN1cHBvcnRzIHRoaXMgZWxlbWVudCAvIGF0dHJpYnV0ZSAoZnV0dXJlID8pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIChnZXRFbGVtZW50KCkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kZWwoSUNTU01vZGVsIG1vZGVsKSB7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9BYnN0cmFjdFN0eWxlU2hlZXRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9BYnN0cmFjdFN0eWxlU2hlZXRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNTE0ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQWJzdHJhY3RTdHlsZVNoZWV0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqIAkJTWFzYWtpIFNhaXRvaCAoTVNBSVRPSEBqcC5pYm0uY29tKQotICoJCVNlZSBCdWcgMTUzMDAwICBTdHlsZSBBZGFwdGVycyBzaG91bGQgYmUgbGF6aWVyCi0gKgkJaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MzAwMAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50LklDU1NTdHlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JTW9kZWxQcm92aWRlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuSW1wb3J0ZWRDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuWE1MTW9kZWxOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuRG9jdW1lbnRTdHlsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0OwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXRMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Eb2N1bWVudFRyYXZlcnNhbDsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOwotCi0vKioKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3R5bGVTaGVldEFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdENTU01vZGVsQWRhcHRlciBpbXBsZW1lbnRzIElDU1NTdHlsZUxpc3RlbmVyLCBJU3R5bGVTaGVldEFkYXB0ZXIgewotCi0JLy8gdGhpcyB2YXJpYWJsZSB0byBob2xkIHRoZSBjbGFzcyBpcyBqdXN0IGEgVkFKYXZhIHRyaWNrLgotCS8vIGl0IGltcHJvdmVzIHBlcmZvcm1hbmNlIGluIFZBSmF2YSBieSBtaW5pbWl6aW5nIGNsYXNzIGxvYWRpbmcuCi0JcHJpdmF0ZSBmaW5hbCBDbGFzcyBTdHlsZVNoZWV0QWRhcHRlckNsYXNzID0gSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzOwotCXByaXZhdGUgQ29sbGVjdGlvbiBzdHlsZUNoYW5nZWROb2RlczsKLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFN0eWxlU2hlZXRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBJQ1NTTW9kZWwgY3JlYXRlTW9kZWwoKSB7Ci0JCXJldHVybiBjcmVhdGVNb2RlbCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSUNTU01vZGVsIGNyZWF0ZU1vZGVsKGJvb2xlYW4gbm90aWZ5KSB7Ci0JCUlDU1NNb2RlbCBuZXdNb2RlbCA9IHN1cGVyLmNyZWF0ZU1vZGVsKCk7Ci0JCWlmIChub3RpZnkgJiYgbmV3TW9kZWwgIT0gbnVsbCkgewotCQkJLy8gZ2V0IE1vZGVsUHJvdmlkZUFkYXB0ZXIKLQkJCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZ2V0RWxlbWVudCgpKS5nZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCS8vIG5vdGlmeSBhZGFwdGVyCi0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCWFkYXB0ZXIubW9kZWxQcm92aWRlZChuZXdNb2RlbCk7Ci0JCX0KLQkJcmV0dXJuIG5ld01vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHlsZVNoZWV0IGdldFNoZWV0KCkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKFN0eWxlU2hlZXQpIG1vZGVsLmdldERvY3VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlCi0JICogYWxsb3dzIGl0IHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBTdHlsZVNoZWV0QWRhcHRlckNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlZCgpIHsKLQkJSUNTU01vZGVsIGN1cnJlbnRNb2RlbCA9IGdldE1vZGVsKCk7Ci0KLQkJLy8gZ2V0IE1vZGVsUHJvdmlkZUFkYXB0ZXIKLQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgYWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBnZXRFbGVtZW50KCkpLmdldEFkYXB0ZXJGb3IoSU1vZGVsUHJvdmlkZUFkYXB0ZXIuY2xhc3MpOwotCi0JCXNldEVsZW1lbnQobnVsbCk7Ci0JCXNldE1vZGVsKG51bGwpOwotCi0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlhZGFwdGVyLm1vZGVsUmVsZWFzZWQoY3VycmVudE1vZGVsKTsKLQotCQlpZiAoY3VycmVudE1vZGVsICE9IG51bGwpCi0JCQljdXJyZW50TW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlZCgpIHsKLQkJSUNTU01vZGVsIGN1cnJlbnRNb2RlbCA9IGdldE1vZGVsKCk7Ci0KLQkJc2V0TW9kZWwobnVsbCk7Ci0KLQkJLy8gZ2V0IE1vZGVsUHJvdmlkZUFkYXB0ZXIKLQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgYWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBnZXRFbGVtZW50KCkpLmdldEFkYXB0ZXJGb3IoSU1vZGVsUHJvdmlkZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJYWRhcHRlci5tb2RlbFJlbW92ZWQoY3VycmVudE1vZGVsKTsKLQotCQlpZiAoY3VycmVudE1vZGVsICE9IG51bGwpCi0JCQljdXJyZW50TW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNyY01vZGVsIGNvbS5pYm0uc2VkLmNzcy5tb2RlbC5pbnRlcmZhY2VzLklDU1NNb2RlbAotCSAqIEBwYXJhbSByZW1vdmVkIGNvbS5pYm0uc2VkLmNzcy5tb2RlbC5pbnRlcmZhY2VzLklDU1NTZWxlY3RvcltdCi0JICogQHBhcmFtIGFkZGVkIGNvbS5pYm0uc2VkLmNzcy5tb2RlbC5pbnRlcmZhY2VzLklDU1NTZWxlY3RvcltdCi0JICogQHBhcmFtIG1lZGlhIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdHlsZUNoYW5nZWQoSUNTU01vZGVsIHNyY01vZGVsLCBJQ1NTU2VsZWN0b3JbXSByZW1vdmVkLCBJQ1NTU2VsZWN0b3JbXSBhZGRlZCwgU3RyaW5nIG1lZGlhKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gbWlnaHQgcmVsZWFzZWQKLQkJRG9jdW1lbnQgZG9jID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQkvLyB0byBub3RpZnkgR0VGIHRyZWUgCi0JCWlmIChkb2MgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQlDb2xsZWN0aW9uIGFkYXB0ZXJzID0gKChJTm9kZU5vdGlmaWVyKSBkb2MpLmdldEFkYXB0ZXJzKCk7Ci0JCQlpZiAoYWRhcHRlcnMgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlJdGVyYXRvciBpdCA9IGFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCQlpZiAoaXQgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU5vZGVBZGFwdGVyKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ1NTU3R5bGVMaXN0ZW5lcikgewotCQkJCQkoKElDU1NTdHlsZUxpc3RlbmVyKSBhZGFwdGVyKS5zdHlsZUNoYW5nZWQoc3JjTW9kZWwsIHJlbW92ZWQsIGFkZGVkLCBtZWRpYSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vCi0KLQkJaWYgKHN0eWxlQ2hhbmdlZE5vZGVzID09IG51bGwpIHsKLQkJCXN0eWxlQ2hhbmdlZE5vZGVzID0gbmV3IEhhc2hTZXQoKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlpbnQgcmVtb3ZlZFNlbE51bSA9IHJlbW92ZWQgIT0gbnVsbCA/IHJlbW92ZWQubGVuZ3RoIDogMDsKLQkJCWludCBhZGRlZFNlbE51bSA9IGFkZGVkICE9IG51bGwgPyBhZGRlZC5sZW5ndGggOiAwOwotCi0JCQlOb2RlSXRlcmF0b3IgaXRlciA9ICgoRG9jdW1lbnRUcmF2ZXJzYWwpIGRvYykuY3JlYXRlTm9kZUl0ZXJhdG9yKGRvYywgTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQsIG51bGwsIHRydWUpOwotCQkJTm9kZSBub2RlOwotCQkJd2hpbGUgKChub2RlID0gaXRlci5uZXh0Tm9kZSgpKSAhPSBudWxsKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlFbGVtZW50IGVsbSA9IChFbGVtZW50KSBub2RlOwotCQkJCQlib29sZWFuIG1hdGNoID0gZmFsc2U7Ci0JCQkJCWludCBpOwotCQkJCQlmb3IgKGkgPSAwOyBpIDwgcmVtb3ZlZFNlbE51bSAmJiAhbWF0Y2g7IGkrKykgewotCQkJCQkJbWF0Y2ggPSByZW1vdmVkW2ldLm1hdGNoKGVsbSwgbnVsbCk7Ci0JCQkJCX0KLQkJCQkJZm9yIChpID0gMDsgaSA8IGFkZGVkU2VsTnVtICYmICFtYXRjaDsgaSsrKSB7Ci0JCQkJCQltYXRjaCA9IGFkZGVkW2ldLm1hdGNoKGVsbSwgbnVsbCk7Ci0JCQkJCX0KLQkJCQkJaWYgKG1hdGNoKSB7Ci0JCQkJCQlpZiAoIXN0eWxlQ2hhbmdlZE5vZGVzLmNvbnRhaW5zKGVsbSkpCi0JCQkJCQkJc3R5bGVDaGFuZ2VkTm9kZXMuYWRkKGVsbSk7Ci0JCQkJCQkvLyBub3RpZnlTdHlsZUNoYW5nZWQoZWxtKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBEb2N1bWVudCBkb2Vzbid0IGltcGxlbWVudCBEb2N1bWVudFRyYXZlcnNhbC4uLgotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3JjTW9kZWwgY29tLmlibS5zZWQuY3NzLm1vZGVsLmludGVyZmFjZXMuSUNTU01vZGVsCi0JICovCi0JcHVibGljIHZvaWQgc3R5bGVVcGRhdGUoSUNTU01vZGVsIHNyY01vZGVsKSB7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGdldEVsZW1lbnQoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSURPTU1vZGVsIG1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJWE1MTW9kZWxOb3RpZmllciBub3RpZmllciA9IG1vZGVsLmdldE1vZGVsTm90aWZpZXIoKTsKLQkJaWYgKG5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gYmVmb3JlIHVwZGF0aW5nLCBhbGwgc3ViLW1vZGVscyBzaG91bGQgYmUgbG9hZGVkIQotCQlEb2N1bWVudFN0eWxlIGRvY3VtZW50ID0gKERvY3VtZW50U3R5bGUpIG1vZGVsLmdldERvY3VtZW50KCk7Ci0JCVN0eWxlU2hlZXRMaXN0IHN0eWxlcyA9IGRvY3VtZW50LmdldFN0eWxlU2hlZXRzKCk7Ci0JCWlmIChzdHlsZXMgIT0gbnVsbCkgewotCQkJaW50IG4gPSBzdHlsZXMuZ2V0TGVuZ3RoKCk7Ci0JCQlJbXBvcnRlZENvbGxlY3RvciB0cmF2ID0gbmV3IEltcG9ydGVkQ29sbGVjdG9yKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJCW9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQgc2hlZXQgPSBzdHlsZXMuaXRlbShpKTsKLQkJCQlpZiAoc2hlZXQgaW5zdGFuY2VvZiBJQ1NTTm9kZSkKLQkJCQkJdHJhdi5hcHBseSgoSUNTU05vZGUpIHNoZWV0KTsKLQkJCX0KLQkJfQotCi0JCS8vIGZsYXNoIHN0eWxlIGNoYW5nZWQgZXZlbnRzCi0JCWlmIChzdHlsZUNoYW5nZWROb2RlcyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9IHN0eWxlQ2hhbmdlZE5vZGVzLnRvQXJyYXkoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBlbGVtZW50cyAhPSBudWxsICYmIGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLQkJCQlub3RpZnlTdHlsZUNoYW5nZWQoKEVsZW1lbnQpIGVsZW1lbnRzW2ldKTsKLQkJCXN0eWxlQ2hhbmdlZE5vZGVzLmNsZWFyKCk7Ci0JCX0KLQotCQkvLyB0byBub3RpZnkgR0VGIHRyZWUgCi0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUNvbGxlY3Rpb24gYWRhcHRlcnMgPSAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVycygpOwotCQkJaWYgKGFkYXB0ZXJzID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJSXRlcmF0b3IgaXQgPSBhZGFwdGVycy5pdGVyYXRvcigpOwotCQkJaWYgKGl0ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gKElOb2RlQWRhcHRlcikgaXQubmV4dCgpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUNTU1N0eWxlTGlzdGVuZXIpIHsKLQkJCQkJKChJQ1NTU3R5bGVMaXN0ZW5lcikgYWRhcHRlcikuc3R5bGVVcGRhdGUoc3JjTW9kZWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCW5vdGlmaWVyLnByb3BlcnR5Q2hhbmdlZChub2RlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQ1NTUXVlcnlDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9DU1NRdWVyeUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU5OGYyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9DU1NRdWVyeUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU0xpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb24uQ1NTUHJvcGVydHlDb250ZXh0OwotCi0vKioKLSAqLwotY2xhc3MgQ1NTUXVlcnlDb250ZXh0IGV4dGVuZHMgQ1NTUHJvcGVydHlDb250ZXh0IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDU1NRdWVyeUNvbnRleHQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENTU1F1ZXJ5Q29udGV4dChJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCXN1cGVyKGRlY2wpOwotCX0KLQotCS8qKgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHlGdWxsKElDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRW51bWVyYXRpb24ga2V5cyA9IGZQcm9wZXJ0aWVzLmtleXMoKTsKLQkJd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCU9iamVjdCBrZXkgPSBrZXlzLm5leHRFbGVtZW50KCk7Ci0JCQlPYmplY3QgdmFsID0gZlByb3BlcnRpZXMuZ2V0KGtleSk7Ci0KLQkJCWlmICh2YWwgaW5zdGFuY2VvZiBDU1NRdWVyeURlY2xhcmF0aW9uRGF0YSkgewotCQkJCUlDU1NTdHlsZURlY2xJdGVtIGRlY2xJdGVtID0gKChDU1NRdWVyeURlY2xhcmF0aW9uRGF0YSkgdmFsKS5nZXREZWNsSXRlbSgpOwotCQkJCWlmIChkZWNsSXRlbS5nZXRMZW5ndGgoKSA8PSAwKSB7Ci0JCQkJCUlDU1NTdHlsZURlY2xJdGVtIGl0ZW1Ub1JlbW92ZSA9IGRlY2wuZ2V0RGVjbEl0ZW1Ob2RlKGtleS50b1N0cmluZygpKTsKLQkJCQkJaWYgKGl0ZW1Ub1JlbW92ZSAhPSBudWxsKSB7Ci0JCQkJCQlkZWNsLnJlbW92ZURlY2xJdGVtTm9kZShpdGVtVG9SZW1vdmUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlkZWNsLnNldERlY2xJdGVtTm9kZShkZWNsSXRlbSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIHZhbHVlID0gKHZhbCBpbnN0YW5jZW9mIElDU1NWYWx1ZSkgPyAoKElDU1NWYWx1ZSkgdmFsKS5nZXRDU1NWYWx1ZVRleHQoKSA6IHZhbC50b1N0cmluZygpOwotCi0JCQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPD0gMCkgewotCQkJCQlJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtVG9SZW1vdmUgPSBkZWNsLmdldERlY2xJdGVtTm9kZShrZXkudG9TdHJpbmcoKSk7Ci0JCQkJCWlmIChpdGVtVG9SZW1vdmUgIT0gbnVsbCkgewotCQkJCQkJZGVjbC5yZW1vdmVEZWNsSXRlbU5vZGUoaXRlbVRvUmVtb3ZlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZGVjbC5zZXRQcm9wZXJ0eShrZXkudG9TdHJpbmcoKSwgdmFsdWUsIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVjayhTdHJpbmcgcHJvcE5hbWUsIGJvb2xlYW4gaW1wb3J0YW50LCBpbnQgc3BlY2lmaWNpdHkpIHsKLQkJT2JqZWN0IGN1cnJlbnQgPSBmUHJvcGVydGllcy5nZXQocHJvcE5hbWUpOwotCQlpZiAoY3VycmVudCAhPSBudWxsICYmIGN1cnJlbnQgaW5zdGFuY2VvZiBDU1NRdWVyeVZhbHVlRGF0YSkgewotCQkJQ1NTUXVlcnlWYWx1ZURhdGEgY3VycmVudFZhbHVlID0gKENTU1F1ZXJ5VmFsdWVEYXRhKSBjdXJyZW50OwotCQkJaWYgKCghaW1wb3J0YW50ICYmIGN1cnJlbnRWYWx1ZS5pbXBvcnRhbnQpIHx8IChjdXJyZW50VmFsdWUuZ2V0U3BlY2lmaWNpdHkoKSA+IHNwZWNpZmljaXR5KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBvdmVycmlkZVdpdGhFeHBhbmQoSUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbCwgaW50IHNwZWNpZmljaXR5KSB7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQ1NTTGlua0NvbnZlcnRlciBjb252ID0gbmV3IENTU0xpbmtDb252ZXJ0ZXIoZGVjbC5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKSk7Ci0KLQkJaW50IG5Qcm9wZXJ0aWVzID0gZGVjbC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuUHJvcGVydGllczsgaSsrKSB7Ci0JCQlTdHJpbmcgcHJvcE5hbWUgPSBkZWNsLml0ZW0oaSk7Ci0JCQlpZiAocHJvcE5hbWUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBwcm9wTiA9IHByb3BOYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwotCQkJCWlmIChwcm9wTi5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJCVByb3BDTVByb3BlcnR5IHByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKHByb3BOKTsKLQkJCQkJU3RyaW5nIHByaW9yaXR5ID0gZGVjbC5nZXRQcm9wZXJ0eVByaW9yaXR5KHByb3BOYW1lKTsKLQkJCQkJYm9vbGVhbiBpbXBvcnRhbnQgPSBwcmlvcml0eSAhPSBudWxsICYmIHByaW9yaXR5Lmxlbmd0aCgpID4gMDsKLQkJCQkJaWYgKHByb3AgIT0gbnVsbCAmJiBwcm9wLmlzU2hvcnRoYW5kKCkpIHsKLQkJCQkJCS8vIGV4cGFuZCBzaG9ydGhhbmQgcHJvcGVydHkKLQkJCQkJCUNTU1F1ZXJ5Q29udGV4dCBjb250ZXh0ID0gbmV3IENTU1F1ZXJ5Q29udGV4dCgpOwotCQkJCQkJZXhwYW5kVG9MZWFmKHByb3AsIGRlY2wuZ2V0UHJvcGVydHlWYWx1ZShwcm9wTmFtZSksIGNvbnRleHQpOwotCi0JCQkJCQlFbnVtZXJhdGlvbiBwcm9wZXJ0aWVzID0gY29udGV4dC5wcm9wZXJ0aWVzKCk7Ci0JCQkJCQl3aGlsZSAocHJvcGVydGllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCQkJCXByb3BOID0gcHJvcGVydGllcy5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCk7Ci0JCQkJCQkJaWYgKGNoZWNrKHByb3BOLCBpbXBvcnRhbnQsIHNwZWNpZmljaXR5KSkgewotCQkJCQkJCQlmUHJvcGVydGllcy5wdXQocHJvcE4sIG5ldyBDU1NRdWVyeVZhbHVlRGF0YShjb252LnRvQWJzb2x1dGUoY29udGV4dC5nZXQocHJvcE4pKSwgaW1wb3J0YW50LCBzcGVjaWZpY2l0eSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChjaGVjayhwcm9wTiwgaW1wb3J0YW50LCBzcGVjaWZpY2l0eSkpIHsKLQkJCQkJCQlJQ1NTU3R5bGVEZWNsSXRlbSBkZWNsSXRlbSA9IChJQ1NTU3R5bGVEZWNsSXRlbSkgZGVjbC5nZXREZWNsSXRlbU5vZGUocHJvcE5hbWUpLmNsb25lTm9kZSh0cnVlKTsKLQkJCQkJCQlpbnQgblZhbHVlcyA9IGRlY2xJdGVtLmdldExlbmd0aCgpOwotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgblZhbHVlczsgaisrKSB7Ci0JCQkJCQkJCWNvbnYudG9BYnNvbHV0ZShkZWNsSXRlbS5pdGVtKGopKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZGVjbEl0ZW0uc2V0UHJpb3JpdHkobnVsbCk7Ci0JCQkJCQkJZlByb3BlcnRpZXMucHV0KHByb3BOLCBuZXcgQ1NTUXVlcnlEZWNsYXJhdGlvbkRhdGEoZGVjbEl0ZW0sIGltcG9ydGFudCwgc3BlY2lmaWNpdHkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0NTU1F1ZXJ5RGVjbGFyYXRpb25EYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9DU1NRdWVyeURlY2xhcmF0aW9uRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjYxMjVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0NTU1F1ZXJ5RGVjbGFyYXRpb25EYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotCi0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NRdWVyeURlY2xhcmF0aW9uRGF0YSBleHRlbmRzIENTU1F1ZXJ5VmFsdWVEYXRhIHsKLQotCi0JSUNTU1N0eWxlRGVjbEl0ZW0gZGVjbEl0ZW07Ci0KLQlwdWJsaWMgQ1NTUXVlcnlEZWNsYXJhdGlvbkRhdGEoSUNTU1N0eWxlRGVjbEl0ZW0gZGVjbEl0ZW0sIGJvb2xlYW4gaW1wLCBpbnQgc3BlY2lmaWNpdHkpIHsKLQkJc3VwZXIobnVsbCwgaW1wLCBzcGVjaWZpY2l0eSk7Ci0JCXRoaXMuZGVjbEl0ZW0gPSBkZWNsSXRlbTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlJQ1NTU3R5bGVEZWNsSXRlbSBnZXREZWNsSXRlbSgpIHsKLQkJcmV0dXJuIGRlY2xJdGVtOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsICYmIGRlY2xJdGVtICE9IG51bGwpIHsKLQkJCXZhbHVlID0gZGVjbEl0ZW0uZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQ1NTUXVlcnlUcmF2ZXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0NTU1F1ZXJ5VHJhdmVyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MDYxMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQ1NTUXVlcnlUcmF2ZXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5BYnN0cmFjdENzc1RyYXZlcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5FbGVtZW50Q1NTSW5saW5lU3R5bGU7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ1NTUXVlcnlUcmF2ZXJzZXIgZXh0ZW5kcyBBYnN0cmFjdENzc1RyYXZlcnNlciB7Ci0KLQlwcml2YXRlIEVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIFN0cmluZyBwc2V1ZG9OYW1lOwotCXByaXZhdGUgQ1NTUXVlcnlDb250ZXh0IGNvbnRleHQgPSBudWxsOwotCUlDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIElDU1NTdHlsZURlY2xhcmF0aW9uIGdldERlY2xhcmF0aW9uKCkgewotCQl0cnkgewotCQkJSUNTU1N0eWxlRGVjbGFyYXRpb24gaW5saW5lU3R5bGUgPSAoSUNTU1N0eWxlRGVjbGFyYXRpb24pICgoRWxlbWVudENTU0lubGluZVN0eWxlKSBlbGVtZW50KS5nZXRTdHlsZSgpOwotCQkJaWYgKGlubGluZVN0eWxlICE9IG51bGwpIHsKLQkJCQlpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0JCQkJCWNvbnRleHQgPSBuZXcgQ1NTUXVlcnlDb250ZXh0KCk7Ci0JCQkJfQotCQkJCWNvbnRleHQub3ZlcnJpZGVXaXRoRXhwYW5kKGlubGluZVN0eWxlLCAxMDAwMCk7Ci0JCQkJLy8gc3R5bGUgYXR0cmlidXRlJ3Mgc3BlY2lmaWNpdHkgaXMgMTAwIChpbiBDU1MyIHNwZWMuKSBhbmQKLQkJCQkvLyBvdXIgaW1wbGVtZW50IHVzZSAxMDAgYXMgYmFzZSBudW1iZXIgKHNlZSBDU1NTZWxlY3Rvci5qYXZhKQotCQkJfQotCQl9Ci0JCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGVsZW1lbnQgaXMgbm90IEVsZW1lbnRDU1NJbmxpbmVTdHlsZSA/Pz8KLQkJfQotCQlpZiAoY29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCWRlY2wgPSBDU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVN0eWxlRGVjbGFyYXRpb24oKTsKLQkJY29udGV4dC5hcHBseUZ1bGwoZGVjbCk7Ci0JCXJldHVybiBkZWNsOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBvdmVyd3JpdGVEZWNsYXJhdGlvbihJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkLCBpbnQgc3BlY2lmaWNpdHkpIHsKLQkJaWYgKGQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGNvbnRleHQgPT0gbnVsbCkKLQkJCWNvbnRleHQgPSBuZXcgQ1NTUXVlcnlDb250ZXh0KCk7Ci0JCWNvbnRleHQub3ZlcnJpZGVXaXRoRXhwYW5kKGQsIHNwZWNpZmljaXR5KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcG9zdE5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlyZXR1cm4gVFJBVl9DT05UOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKSB7Ci0JCQkvLyBzdHlsZSBydWxlCi0JCQlJQ1NTU3R5bGVSdWxlIHN0eWxlID0gKElDU1NTdHlsZVJ1bGUpIG5vZGU7Ci0JCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSBzdHlsZS5nZXRTZWxlY3RvcnMoKTsKLQkJCWludCBuU2VsZWN0b3JzID0gbGlzdC5nZXRMZW5ndGgoKTsKLQkJCWludCBtYXhTcGVjaWZpY2l0eSA9IC0xOwotCQkJZm9yIChpbnQgaVNlbGVjdG9yID0gMDsgaVNlbGVjdG9yIDwgblNlbGVjdG9yczsgaVNlbGVjdG9yKyspIHsKLQkJCQkvLyBDaGVjayBlYWNoIFNlbGVjdG9yIExpc3RzCi0JCQkJSUNTU1NlbGVjdG9yIHNlbGVjdG9yID0gbGlzdC5nZXRTZWxlY3RvcihpU2VsZWN0b3IpOwotCQkJCWludCBzcGVjaWZpY2l0eSA9IHNlbGVjdG9yLmdldFNwZWNpZmljaXR5KCk7Ci0JCQkJaWYgKG1heFNwZWNpZmljaXR5IDwgc3BlY2lmaWNpdHkgJiYgc2VsZWN0b3IubWF0Y2goZWxlbWVudCwgcHNldWRvTmFtZSkpIHsKLQkJCQkJbWF4U3BlY2lmaWNpdHkgPSBzcGVjaWZpY2l0eTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobWF4U3BlY2lmaWNpdHkgPj0gMCkgewotCQkJCS8vIGFwcGx5IHRoaXMgc3R5bGUgdG8gdGhlIGVsZW1lbnQKLQkJCQlvdmVyd3JpdGVEZWNsYXJhdGlvbigoSUNTU1N0eWxlRGVjbGFyYXRpb24pIHN0eWxlLmdldFN0eWxlKCksIG1heFNwZWNpZmljaXR5KTsKLQkJCX0KLQkJCXJldHVybiBUUkFWX1BSVU5FOwotCQl9Ci0JCXJldHVybiBUUkFWX0NPTlQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0Q29udGV4dCgpIHsKLQkJY29udGV4dCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwc2V1ZG9OYW1lKSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMucHNldWRvTmFtZSA9IHBzZXVkb05hbWU7Ci0JCXJlc2V0Q29udGV4dCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0NTU1F1ZXJ5VmFsdWVEYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9DU1NRdWVyeVZhbHVlRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTk4MTU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0NTU1F1ZXJ5VmFsdWVEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb24uVmFsdWVEYXRhOwotCi0KLQotLyoqCi0gKi8KLWNsYXNzIENTU1F1ZXJ5VmFsdWVEYXRhIGV4dGVuZHMgVmFsdWVEYXRhIHsKLQotCXByaXZhdGUgaW50IHNwZWNpZmljaXR5OwotCi0JLyoqCi0JICovCi0JcHVibGljIENTU1F1ZXJ5VmFsdWVEYXRhKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDU1NRdWVyeVZhbHVlRGF0YShTdHJpbmcgdmFsLCBib29sZWFuIGltcCkgewotCQlzdXBlcih2YWwsIGltcCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENTU1F1ZXJ5VmFsdWVEYXRhKFN0cmluZyB2YWwsIGJvb2xlYW4gaW1wLCBpbnQgc3BlY2lmaWNpdHkpIHsKLQkJc3VwZXIodmFsLCBpbXApOwotCQl0aGlzLnNwZWNpZmljaXR5ID0gc3BlY2lmaWNpdHk7Ci0JfQotCi0JLyoqCi0JICovCi0JaW50IGdldFNwZWNpZmljaXR5KCkgewotCQlyZXR1cm4gc3BlY2lmaWNpdHk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvSFRNTERvY3VtZW50QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvSFRNTERvY3VtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzg4MzA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0hUTUxEb2N1bWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRMaXN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTQ2xhc3NUcmF2ZXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuSW1wb3J0UnVsZUNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldDsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0TGlzdDsKLQotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgSFRNTERvY3VtZW50QWRhcHRlciBpbXBsZW1lbnRzIElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIsIFN0eWxlU2hlZXRMaXN0IHsKLQotCXByaXZhdGUgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgVmVjdG9yIHN0eWxlQWRhcHRlcnMgPSBudWxsOwotCXByaXZhdGUgVmVjdG9yIG9sZFN0eWxlQWRhcHRlcnMgPSBudWxsOwotCi0JLyoqCi0JICovCi0JSFRNTERvY3VtZW50QWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkU3R5bGVTaGVldChFbGVtZW50IG5vZGUpIHsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJYm9vbGVhbiBpc0NvbnRhaW5lciA9IGZhbHNlOwotCQlpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9TQ1JJUFQpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRSkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlJPT1QpIHx8ICghZWxlbWVudC5pc0dsb2JhbFRhZygpICYmIGVsZW1lbnQuaXNDb250YWluZXIoKSkpIHsKLQkJCWlzQ29udGFpbmVyID0gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCQlOb2RlIHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKHBhcmVudCA9PSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSkgewotCQkJCS8vIFRoaXMgY29uZGl0aW9uIGlzIHRvbyBzZXZlcmUsIGFjdHVhbGx5IGRvIG5vdCB3b3JrIGZvciBKU0YgdGVtcGxhdGUuCi0JCQkJLy8gQnV0IGFib3ZlICghIGdsb2JhbFRhZygpICYmIGlzQ29udGFpbmVyKCkpIGNvdmVyIEpTRiB0ZW1wbGF0ZSArIHRwbCB0ZW1wbGF0ZQotCQkJCWlzQ29udGFpbmVyID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJdGFnTmFtZSA9ICgoRWxlbWVudCkgcGFyZW50KS5nZXRUYWdOYW1lKCk7Ci0JCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCAmJiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQpKSB7Ci0JCQkJCWlzQ29udGFpbmVyID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQllbHNlIHsKLQkJCVN0cmluZyBsb2NhbE5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotCQkJaWYgKGxvY2FsTmFtZSAhPSBudWxsICYmIGxvY2FsTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MKSkgewotCQkJCS8vIHRhZ2xpYiBodG1sIHRhZwotCQkJCWlzQ29udGFpbmVyID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSBlbGVtZW50OwotCQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlciBpbnN0YW5jZW9mIElTdHlsZVNoZWV0QWRhcHRlcikgewotCQkJCQl0aGlzLnN0eWxlQWRhcHRlcnMuYWRkRWxlbWVudChhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGlzQ29udGFpbmVyKSB7Ci0JCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gZWxlbWVudDsKLQkJCWlmIChub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5jbGFzcykgPT0gbnVsbCkgewotCQkJCW5vdGlmaWVyLmFkZEFkYXB0ZXIodGhpcyk7Ci0JCQl9Ci0JCQlmb3IgKE5vZGUgY2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWFkZFN0eWxlU2hlZXQoKEVsZW1lbnQpIGNoaWxkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgY2hpbGRSZXBsYWNlZCgpIHsKLQkJaWYgKHRoaXMuc3R5bGVBZGFwdGVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGJhY2t1cCBvbGQgYWRhcHRlcnMgdG8gYmUgcmVsZWFzZWQgb24gdXBkYXRpbmcgaW4gZ2V0U3R5bGVTaGVldHMoKQotCQl0aGlzLm9sZFN0eWxlQWRhcHRlcnMgPSB0aGlzLnN0eWxlQWRhcHRlcnM7Ci0JCS8vIGludmFsaWRhdGUgdGhlIGxpc3QKLQkJdGhpcy5zdHlsZUFkYXB0ZXJzID0gbnVsbDsKLQotCQlub3RpZnlTdHlsZVNoZWV0c0NoYW5nZWQodGhpcy5kb2N1bWVudCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIGdldENsYXNzZXMoKSB7Ci0JCVN0eWxlU2hlZXRMaXN0IHNoZWV0TGlzdCA9IGdldFN0eWxlU2hlZXRzKCk7Ci0JCWludCBuU2hlZXRzID0gc2hlZXRMaXN0LmdldExlbmd0aCgpOwotCi0JCWZpbmFsIEFycmF5TGlzdCBjbGFzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUNTU0NsYXNzVHJhdmVyc2VyIHRyYXZlcnNlciA9IG5ldyBDU1NDbGFzc1RyYXZlcnNlcigpOwotCQl0cmF2ZXJzZXIuc2V0VHJhdmVyc2VJbXBvcnRlZCh0cnVlKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5TaGVldHM7IGkrKykgewotCQkJb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldCBzaGVldCA9IHNoZWV0TGlzdC5pdGVtKGkpOwotCQkJaWYgKHNoZWV0IGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCQl0cmF2ZXJzZXIuYXBwbHkoKElDU1NOb2RlKSBzaGVldCk7Ci0JCQl9Ci0JCX0KLQkJY2xhc3Nlcy5hZGRBbGwodHJhdmVyc2VyLmdldENsYXNzTmFtZXMoKSk7Ci0KLQkJcmV0dXJuIG5ldyBFbnVtZXJhdGlvbigpIHsKLQkJCWludCBpID0gMDsKLQotCQkJcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotCQkJCXJldHVybiBpIDwgY2xhc3Nlcy5zaXplKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7Ci0JCQkJcmV0dXJuIGNsYXNzZXMuZ2V0KGkrKyk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFZhbGlkQWRhcHRlcnMoKSB7Ci0JCVZlY3RvciB2YWxpZEFkYXB0ZXJzID0gbmV3IFZlY3RvcigpOwotCQlpZiAodGhpcy5zdHlsZUFkYXB0ZXJzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGkgPSB0aGlzLnN0eWxlQWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWJzdHJhY3RTdHlsZVNoZWV0QWRhcHRlciAmJiAoKEFic3RyYWN0U3R5bGVTaGVldEFkYXB0ZXIpIG9iaikuaXNWYWxpZEF0dHJpYnV0ZSgpKSB7Ci0JCQkJCXZhbGlkQWRhcHRlcnMuYWRkKG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB2YWxpZEFkYXB0ZXJzOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0VmFsaWRBZGFwdGVycygpLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVEZWNsYXJhdGlvbiBnZXRPdmVycmlkZVN0eWxlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHBzZXVkb05hbWUpIHsKLQkJU3R5bGVTaGVldExpc3Qgc3NsID0gZ2V0U3R5bGVTaGVldHMoKTsKLQkJaW50IG51bVN0eWxlcyA9IHNzbC5nZXRMZW5ndGgoKTsKLQotCQlDU1NRdWVyeVRyYXZlcnNlciBxdWVyeSA9IG5ldyBDU1NRdWVyeVRyYXZlcnNlcigpOwotCQlxdWVyeS5zZXRUcmF2ZXJzZUltcG9ydGVkKHRydWUpOwotCQlxdWVyeS5zZXRUcmF2ZXJzZUltcG9ydEZpcnN0KHRydWUpOwotCQlxdWVyeS5zZXRFbGVtZW50KGVsZW1lbnQsIHBzZXVkb05hbWUpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtU3R5bGVzOyBpKyspIHsKLQkJCS8vIGxvb3AgZm9yIHN0eWxlcyAoPHN0eWxlPiBhbmQgPGxpbms+KQotCQkJb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldCBzcyA9IHNzbC5pdGVtKGkpOwotCi0JCQl0cnkgewotCQkJCXF1ZXJ5LmFwcGx5KChJQ1NTTm9kZSkgc3MpOwotCQkJfQotCQkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIEkgY2FuIGhhbmRsZSBvbmx5IENTUyBzdHlsZQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHF1ZXJ5LmdldERlY2xhcmF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0eWxlU2hlZXRMaXN0IGdldFN0eWxlU2hlZXRzKCkgewotCQlpZiAodGhpcy5zdHlsZUFkYXB0ZXJzID09IG51bGwpIHsKLQkJCWlmICh0aGlzLmRvY3VtZW50ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCXRoaXMuc3R5bGVBZGFwdGVycyA9IG5ldyBWZWN0b3IoKTsKLQkJCWZvciAoTm9kZSBjaGlsZCA9IHRoaXMuZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJY29udGludWU7Ci0JCQkJYWRkU3R5bGVTaGVldCgoRWxlbWVudCkgY2hpbGQpOwotCQkJfQotCi0JCQlyZW1vdmVPbGRTdHlsZVNoZWV0cygpOwotCQl9Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZQotCSAqIGFsbG93cyBpdCB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0eWxlU2hlZXQgaXRlbShpbnQgaW5kZXgpIHsKLQkJaWYgKHRoaXMuc3R5bGVBZGFwdGVycyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTGlzdCB2YWxpZEFkYXB0ZXJzID0gZ2V0VmFsaWRBZGFwdGVycygpOwotCi0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdmFsaWRBZGFwdGVycy5zaXplKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3R5bGVTaGVldCBzaGVldCA9ICgoSVN0eWxlU2hlZXRBZGFwdGVyKSB2YWxpZEFkYXB0ZXJzLmdldChpbmRleCkpLmdldFNoZWV0KCk7Ci0JCWlmIChzaGVldCA9PSBudWxsKSB7Ly8gZm9yIExJTksgZWxlbWVudCB3aG9zZSBsaW5rIGlzIGJyb2tlbgotCQkJSUNTU01vZGVsIG1vZGVsID0gKChBYnN0cmFjdFN0eWxlU2hlZXRBZGFwdGVyKSB2YWxpZEFkYXB0ZXJzLmdldChpbmRleCkpLmNyZWF0ZU1vZGVsKCk7Ci0JCQlzaGVldCA9ICgobW9kZWwgIT0gbnVsbCkgPyAoU3R5bGVTaGVldCkgbW9kZWwuZ2V0RG9jdW1lbnQoKSA6IG51bGwpOwotCQl9Ci0JCXJldHVybiBzaGVldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJTm9kZSBub2RlID0gbnVsbDsKLQkJc3dpdGNoIChldmVudFR5cGUpIHsKLQkJCWNhc2UgSU5vZGVOb3RpZmllci5BREQgOgotCQkJCW5vZGUgPSAoTm9kZSkgbmV3VmFsdWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElOb2RlTm90aWZpZXIuUkVNT1ZFIDoKLQkJCQlub2RlID0gKE5vZGUpIG9sZFZhbHVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJTm9kZU5vdGlmaWVyLkNIQU5HRSA6Ci0JCQkJbm9kZSA9IChOb2RlKSBub3RpZmllcjsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChub2RlID09IG51bGwgfHwgbm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuOwotCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5DSEFOR0UpIHsKLQkJCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJBU0UpKSB7Ci0JCQkJcmVmcmVzaEFkYXB0ZXJzKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTElOSykgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT1NDUklQVCkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlJPT1QpIHx8IGVsZW1lbnQuaXNDb21tZW50VGFnKCkgfHwgKCFlbGVtZW50LmlzR2xvYmFsVGFnKCkgJiYgZWxlbWVudC5pc0NvbnRhaW5lcigpKSkgewotCQkJCWNoaWxkUmVwbGFjZWQoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRSkpIHsKLQkJCQlyZWZyZXNoQWRhcHRlcnMoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVN0cmluZyBsb2NhbE5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotCQkJCWlmIChsb2NhbE5hbWUgIT0gbnVsbCAmJiBsb2NhbE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTCkpIHsKLQkJCQkJLy8gdGFnbGliIGh0bWwgdGFnCi0JCQkJCWNoaWxkUmVwbGFjZWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZWxvYWQgTElOSyAvIEBpbXBvcnQgaWYgQkFTRSBjaGFuZ2VkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hBZGFwdGVycygpIHsKLQkJSXRlcmF0b3IgaUFkYXB0ZXIgPSB0aGlzLnN0eWxlQWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGlBZGFwdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSBpQWRhcHRlci5uZXh0KCk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIExpbmtFbGVtZW50QWRhcHRlcikgewotCQkJCSgoTGlua0VsZW1lbnRBZGFwdGVyKSBhZGFwdGVyKS5yZWZyZXNoU2hlZXQoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBTdHlsZUVsZW1lbnRBZGFwdGVyKSB7Ci0JCQkJSUNTU01vZGVsIG1vZGVsID0gKChTdHlsZUVsZW1lbnRBZGFwdGVyKSBhZGFwdGVyKS5nZXRNb2RlbCgpOwotCQkJCUltcG9ydFJ1bGVDb2xsZWN0b3IgdHJhdiA9IG5ldyBJbXBvcnRSdWxlQ29sbGVjdG9yKCk7Ci0JCQkJdHJhdi5hcHBseShtb2RlbCk7Ci0JCQkJSXRlcmF0b3IgaVJ1bGUgPSB0cmF2LmdldFJ1bGVzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaVJ1bGUuaGFzTmV4dCgpKSB7Ci0JCQkJCUlDU1NJbXBvcnRSdWxlIHJ1bGUgPSAoSUNTU0ltcG9ydFJ1bGUpIGlSdWxlLm5leHQoKTsKLQkJCQkJcnVsZS5yZWZyZXNoU3R5bGVTaGVldCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBub3RpZnlTdHlsZVNoZWV0c0NoYW5nZWQoRG9jdW1lbnQgdGFyZ2V0KSB7Ci0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgdGFyZ2V0OwotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ29sbGVjdGlvbiBhZGFwdGVycyA9IG5vdGlmaWVyLmdldEFkYXB0ZXJzKCk7Ci0JCWlmIChhZGFwdGVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvciBpdCA9IGFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCWlmIChpdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IChJTm9kZUFkYXB0ZXIpIGl0Lm5leHQoKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgU3R5bGVMaXN0ZW5lcikgewotCQkJCVN0eWxlTGlzdGVuZXIgbGlzdGVuZXIgPSAoU3R5bGVMaXN0ZW5lcikgYWRhcHRlcjsKLQkJCQlsaXN0ZW5lci5zdHlsZUNoYW5nZWQoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCByZWxlYXNlT2xkU3R5bGVTaGVldHMoKSB7Ci0JCWlmICh0aGlzLm9sZFN0eWxlQWRhcHRlcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSXRlcmF0b3IgaXQgPSB0aGlzLm9sZFN0eWxlQWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSVN0eWxlU2hlZXRBZGFwdGVyIGFkYXB0ZXIgPSAoSVN0eWxlU2hlZXRBZGFwdGVyKSBpdC5uZXh0KCk7Ci0JCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJLy8gaWYgdGhlIHNhbWUgYWRhcHRlciBpcyBpbiB0aGUgY3VycmVudCBsaXN0LAotCQkJLy8gZG8gbm90IHJlbGVhc2UKLQkJCWlmICh0aGlzLnN0eWxlQWRhcHRlcnMgIT0gbnVsbCAmJiB0aGlzLnN0eWxlQWRhcHRlcnMuY29udGFpbnMoYWRhcHRlcikpCi0JCQkJY29udGludWU7Ci0JCQlhZGFwdGVyLnJlbGVhc2VkKCk7Ci0JCX0KLQkJdGhpcy5vbGRTdHlsZUFkYXB0ZXJzID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlU3R5bGVTaGVldHMoKSB7Ci0JCXJlbGVhc2VPbGRTdHlsZVNoZWV0cygpOwotCi0JCWlmICh0aGlzLnN0eWxlQWRhcHRlcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSXRlcmF0b3IgaXQgPSB0aGlzLnN0eWxlQWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSVN0eWxlU2hlZXRBZGFwdGVyIGFkYXB0ZXIgPSAoSVN0eWxlU2hlZXRBZGFwdGVyKSBpdC5uZXh0KCk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCWFkYXB0ZXIucmVsZWFzZWQoKTsKLQkJfQotCQl0aGlzLnN0eWxlQWRhcHRlcnMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVPbGRTdHlsZVNoZWV0cygpIHsKLQkJaWYgKHRoaXMub2xkU3R5bGVBZGFwdGVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvciBpdCA9IHRoaXMub2xkU3R5bGVBZGFwdGVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJU3R5bGVTaGVldEFkYXB0ZXIgYWRhcHRlciA9IChJU3R5bGVTaGVldEFkYXB0ZXIpIGl0Lm5leHQoKTsKLQkJCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQkvLyBpZiB0aGUgc2FtZSBhZGFwdGVyIGlzIGluIHRoZSBjdXJyZW50IGxpc3QsCi0JCQkvLyBkbyBub3QgcmVsZWFzZQotCQkJaWYgKHRoaXMuc3R5bGVBZGFwdGVycyAhPSBudWxsICYmIHRoaXMuc3R5bGVBZGFwdGVycy5jb250YWlucyhhZGFwdGVyKSkKLQkJCQljb250aW51ZTsKLQkJCWFkYXB0ZXIucmVtb3ZlZCgpOwotCQl9Ci0JCXRoaXMub2xkU3R5bGVBZGFwdGVycyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXREb2N1bWVudChEb2N1bWVudCBkb2N1bWVudCkgewotCQl0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9IVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y1OGFhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9IVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi0KLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNlbGVjdG9yQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NpbXBsZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqLwotcHVibGljIGNsYXNzIEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlciBpbXBsZW1lbnRzIElTdHlsZVNlbGVjdG9yQWRhcHRlciB7Ci0KLQlzdGF0aWMgcHJpdmF0ZSBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXIgaW5zdGFuY2U7Ci0JcHJpdmF0ZSBPYmplY3QgdG9NYXRjaCA9IElTdHlsZVNlbGVjdG9yQWRhcHRlci5jbGFzczsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlID09IHRvTWF0Y2g7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWF0Y2goSUNTU1NpbXBsZVNlbGVjdG9yIHNlbGVjdG9yLCBFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwc2V1ZG9OYW1lKSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBpOwotCQlTdHJpbmcga2V5OwotCi0JCS8vIFBzZXVkb05hbWUKLQkJaSA9IHNlbGVjdG9yLmdldE51bU9mUHNldWRvTmFtZXMoKTsKLQkJaWYgKGkgPiAwKSB7Ci0JCQlpZiAocHNldWRvTmFtZSA9PSBudWxsIHx8IHBzZXVkb05hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlmb3IgKGkgPSBpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQlpZiAocHNldWRvTmFtZS5lcXVhbHNJZ25vcmVDYXNlKHNlbGVjdG9yLmdldFBzZXVkb05hbWUoaSkpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChpIDwgMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBjaGVjayB0YWcgbmFtZQotCQlpZiAoIXNlbGVjdG9yLmlzVW5pdmVyc2FsKCkgJiYgIWVsZW1lbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHNlbGVjdG9yLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gY2hlY2sgaWQKLQkJaSA9IHNlbGVjdG9yLmdldE51bU9mSURzKCk7Ci0JCWlmIChpID4gMCkgewotCQkJaWYgKGkgPiAxKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOy8vJE5PTi1OTFMtMSQKLQkJCWlmIChrZXkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoIXNlbGVjdG9yLmdldElEKDApLmVxdWFscyhrZXkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGNoZWNrIGNsYXNzCi0JCWkgPSBzZWxlY3Rvci5nZXROdW1PZkNsYXNzZXMoKTsKLQkJaWYgKGkgPiAwKSB7Ci0JCQlrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsvLyROT04tTkxTLTEkCi0JCQlpZiAoa2V5ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoa2V5KTsKLQkJCWZvciAoaSA9IGkgLSAxOyBpID49IDA7IGktLSkgewotCQkJCWJvb2xlYW4gb2sgPSBmYWxzZTsKLQkJCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQlpZiAoc2VsZWN0b3IuZ2V0Q2xhc3MoaSkuZXF1YWxzKHRva2VuaXplci5uZXh0VG9rZW4oKSkpIHsKLQkJCQkJCW9rID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghb2spCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIGF0dHJpYnV0ZXMKLQkJZm9yIChpID0gc2VsZWN0b3IuZ2V0TnVtT2ZBdHRyaWJ1dGVzKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc2VsZWN0b3IuZ2V0QXR0cmlidXRlKGkpLCAiPX58IFx0XHJcblxmIik7Ly8kTk9OLU5MUy0xJAotCQkJaW50IGNvdW50VG9rZW5zID0gdG9rZW5pemVyLmNvdW50VG9rZW5zKCk7Ci0JCQlpZiAoY291bnRUb2tlbnMgPiAwKSB7Ci0JCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQkJaWYgKGF0dHJWYWx1ZSA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKGNvdW50VG9rZW5zID4gMSkgewotCQkJCQlTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCI9IFx0XHJcblxmIik7Ly8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmdUb2tlbml6ZXIgYXR0clZhbHVlVG9rZW5pemVyID0gbnVsbDsKLQkJCQkJaWYgKHRva2VuLmVxdWFscygifiIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQkJYXR0clZhbHVlVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyVmFsdWUpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHRva2VuLmVxdWFscygifCIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQkJYXR0clZhbHVlVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyVmFsdWUsICItIik7Ly8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWlmIChhdHRyVmFsdWVUb2tlbml6ZXIgIT0gbnVsbCkgewotCQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCQl0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQkJCQlib29sZWFuIG9rID0gZmFsc2U7Ci0JCQkJCQkJd2hpbGUgKGF0dHJWYWx1ZVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCQkJaWYgKHRva2VuLmVxdWFscyhhdHRyVmFsdWVUb2tlbml6ZXIubmV4dFRva2VuKCkpKSB7Ci0JCQkJCQkJCQlvayA9IHRydWU7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIW9rKQotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoIWF0dHJWYWx1ZS5lcXVhbHModG9rZW4pKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0hUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0hUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdjZDY4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9IVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTZWxlY3RvckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICovCi1wdWJsaWMgY2xhc3MgSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElOb2RlQWRhcHRlckZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeSBpbnN0YW5jZTsKLQlwcml2YXRlIE9iamVjdCB0b01hdGNoID0gSVN0eWxlU2VsZWN0b3JBZGFwdGVyLmNsYXNzOwotCi0JLyoqCi0JICogQ1NTTW9kZWxQcm92aWRlQWRhcHRlckZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdGhhdCByZXR1cm5zIHRoZSBhZGFwdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gb2JqZWN0LgotCSAqIEl0IG1heSBiZSBhIHNpbmdsZXRvbiBvciBub3QgLi4uIGRlcGVuZGluZyBvbiB0aGUgbmVlZHMgb2YgdGhlIElOb2RlQWRhcHRlciAgLi4uCi0JICogYnV0IGluIGdlbmVyYWwgaXQgaXMgcmVjb21tZW5kZWQgZm9yIGFuIGFkYXB0ZXIgdG8gYmUgc3RhdGVsZXNzLCAKLQkgKiBzbyB0aGUgZWZmaWNpZW5jaWVzIG9mIGEgc2luZ2xldG9uIGNhbiBiZSBnYWluZWQuCi0JICoKLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGNhbGwgYWRkQWRhcHRlciBvbiB0aGUgYWRhcHRlZAotCSAqIG9iamVjdCB3aXRoIHRoZSBjb3JyZWN0IGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyLgotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciBub3RpZmllcikgewotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihJU3R5bGVTZWxlY3RvckFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCWFkYXB0ZXIgPSBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJbm90aWZpZXIuYWRkQWRhcHRlcihhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBpc0ZhY3RvcnlGb3JUeXBlIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUgPT0gdG9NYXRjaDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkaW5nIGNvcHkgbWV0aG9kCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIGdldEluc3RhbmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9MaW5rRWxlbWVudEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0xpbmtFbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzczYWMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0xpbmtFbGVtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklNb2RlbFByb3ZpZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldExpc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIExpbmtFbGVtZW50QWRhcHRlciBleHRlbmRzIEFic3RyYWN0U3R5bGVTaGVldEFkYXB0ZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENTU19JRCA9IENvbnRlbnRUeXBlSWRGb3JDU1MuQ29udGVudFR5cGVJRF9DU1M7Ci0JcHJpdmF0ZSBib29sZWFuIHJlcGxhY2VNb2RlbCA9IHRydWU7Ci0JLy8gdGhpcyB2YXJpYWJsZSB0byBob2xkIHRoZSBjbGFzcyBpcyBqdXN0IGEgVkFKYXZhIHRyaWNrLgotCS8vIGl0IGltcHJvdmVzIHBlcmZvcm1hbmNlIGluIFZBSmF2YSBieSBtaW5pbWl6aW5nIGNsYXNzIGxvYWRpbmcuCi0JcHJpdmF0ZSBmaW5hbCBDbGFzcyBNb2RlbFByb3ZpZGVBZGFwdGVyQ2xhc3MgPSBJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzczsKLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBMaW5rRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGF0dHJSZXBsYWNlZCgpIHsKLQkJdGhpcy5yZXBsYWNlTW9kZWwgPSB0cnVlOwotCi0JCUVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQ7Ci0JCUhUTUxEb2N1bWVudEFkYXB0ZXIgYWRhcHRlciA9IChIVE1MRG9jdW1lbnRBZGFwdGVyKSBub3RpZmllci5nZXRBZGFwdGVyRm9yKElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlhZGFwdGVyLmNoaWxkUmVwbGFjZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNTU01vZGVsIGNyZWF0ZU1vZGVsKCkgewotCQkvLyBjcmVhdGUgcGhhbnRvbShicm9rZW4gbGluaykgZXh0ZXJuYWwgQ1NTIG1vZGVsCi0JCWlmIChnZXRFbGVtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCA9ICgoSURPTU5vZGUpIGdldEVsZW1lbnQoKSkuZ2V0TW9kZWwoKTsKLQkJSUNTU01vZGVsIG5ld01vZGVsID0gKElDU1NNb2RlbCkgYmFzZU1vZGVsLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihDU1NfSUQpOwotCi0JCS8vIGNhbGN1bGF0ZSBiYXNlIGxvY2F0aW9uIGFuZCBzZXQKLQkJLy8gZ2V0IHJlc29sdmVyIGluIE1vZGVsCi0JCVVSSVJlc29sdmVyIHJlc29sdmVyID0gYmFzZU1vZGVsLmdldFJlc29sdmVyKCk7Ci0KLQkJLy8gcmVzb2x2ZSB0byBhYnNvbHV0ZSB1cmwgOiB0aGlzIG5lZWQgbm90IGV4YWN0IGxvY2F0aW9uIG9mIGNzcyBmaWxlLiBJdCBpcyBpbXBvcnRhbnQgdGhhdCBhYnN1cmwgaXMgbm90IG51bGwuIAotCQlTdHJpbmcgcmVmID0gZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRik7Ci0JCVN0cmluZyBhYnN1cmwgPSAocmVzb2x2ZXIgIT0gbnVsbCAmJiByZWYgIT0gbnVsbCkgPyByZXNvbHZlci5nZXRMb2NhdGlvbkJ5VVJJKHJlZiwgdHJ1ZSkgOiBudWxsOwotCQlpZiAoKGFic3VybCA9PSBudWxsKSB8fCAoYWJzdXJsLmxlbmd0aCgpID09IDApKSB7Ci0JCQlJUGF0aCBiYXNlUGF0aCA9IG5ldyBQYXRoKGJhc2VNb2RlbC5nZXRCYXNlTG9jYXRpb24oKSk7Ci0JCQlVUkxIZWxwZXIgaGVscGVyID0gbmV3IFVSTEhlbHBlcihiYXNlUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkudG9TdHJpbmcoKSk7Ci0JCQlhYnN1cmwgPSBoZWxwZXIudG9BYnNvbHV0ZShyZWYgPT0gbnVsbCA/ICIiIDogcmVmKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKChhYnN1cmwgPT0gbnVsbCkgfHwgKGFic3VybC5sZW5ndGgoKSA9PSAwKSkgewotCQkJYWJzdXJsID0gcmVmOwotCQl9Ci0JCWlmIChhYnN1cmwgPT0gbnVsbCkgewotCQkJYWJzdXJsID0gIiI7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCW5ld01vZGVsLnNldEJhc2VMb2NhdGlvbihhYnN1cmwpOwotCi0JCS8vIHNldCBzdHlsZSBsaXN0ZW5lcgotCQluZXdNb2RlbC5hZGRTdHlsZUxpc3RlbmVyKHRoaXMpOwotCi0JCXJldHVybiBuZXdNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSUNTU01vZGVsIGdldE1vZGVsKCkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmICh0aGlzLnJlcGxhY2VNb2RlbCkgewotCQkJSUNTU01vZGVsIG9sZE1vZGVsID0gbW9kZWw7Ci0JCQl0cnkgewotCQkJCW1vZGVsID0gcmV0cmlldmVNb2RlbCgpOwotCQkJCXNldE1vZGVsKG1vZGVsKTsKLQotCQkJCS8vIHJlbGVhc2Ugb2xkIG1vZGVsCi0JCQkJaWYgKG9sZE1vZGVsICE9IG51bGwpIHsKLQkJCQkJLy8gZ2V0IE1vZGVsUHJvdmlkZUFkYXB0ZXIKLQkJCQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgYWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBnZXRFbGVtZW50KCkpLmdldEFkYXB0ZXJGb3IoSU1vZGVsUHJvdmlkZUFkYXB0ZXIuY2xhc3MpOwotCQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCQkJYWRhcHRlci5tb2RlbFJlbW92ZWQob2xkTW9kZWwpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChvbGRNb2RlbCAhPSBudWxsKQotCQkJCQlvbGRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJCXRoaXMucmVwbGFjZU1vZGVsID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlpZiAoZXZlbnRUeXBlICE9IElOb2RlTm90aWZpZXIuQ0hBTkdFKQotCQkJcmV0dXJuOwotCQlBdHRyIGF0dHIgPSAoQXR0cikgY2hhbmdlZEZlYXR1cmU7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBuYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0JCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInJlbCIpIHx8IC8vJE5PTi1OTFMtMSQKLQkJCQkJbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJ0eXBlIikgfHwgLy8kTk9OLU5MUy0xJAkKLQkJCQkJbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJocmVmIikpIHsvLyROT04tTkxTLTEkCi0JCQlhdHRyUmVwbGFjZWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hTaGVldCgpIHsKLQkJaWYgKCFyZXBsYWNlTW9kZWwpIHsKLQkJCXJlbW92ZWQoKTsKLQkJCXJlcGxhY2VNb2RlbCA9IHRydWU7Ci0KLQkJCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGdldEVsZW1lbnQoKTsKLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlub2RlLm5vdGlmeShJTm9kZU5vdGlmaWVyLkNIQU5HRSwgZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZU5vZGUob3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hSRUYpLCBudWxsLCBudWxsLCBub2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZWQoKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJLy8gZ2V0IE1vZGVsUHJvdmlkZUFkYXB0ZXIKLQkJCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGdldEVsZW1lbnQoKSkuZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0KLQkJCQkvLyBzZXQgZWxlbWVudCB0byBudWxsIGZpcnN0LCBzbyB0aGF0IG5vIGRvY3VtZW50IHdpZGUgdXBkYXRlcwotCQkJCXNldEVsZW1lbnQobnVsbCk7Ci0JCQkJc2V0TW9kZWwobnVsbCk7Ci0KLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCQlhZGFwdGVyLm1vZGVsUmVsZWFzZWQobW9kZWwpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5yZXBsYWNlTW9kZWwgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVkKCkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXNldE1vZGVsKG51bGwpOwotCi0JCQkJLy8gZ2V0IE1vZGVsUHJvdmlkZUFkYXB0ZXIKLQkJCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGdldEVsZW1lbnQoKSkuZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQkJYWRhcHRlci5tb2RlbFJlbW92ZWQobW9kZWwpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5yZXBsYWNlTW9kZWwgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkQXR0cmlidXRlKCkgewotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyByZWwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgicmVsIik7Ly8kTk9OLU5MUy0xJAotCQlpZiAocmVsID09IG51bGwgfHwgIXJlbC5lcXVhbHNJZ25vcmVDYXNlKCJzdHlsZXNoZWV0IikpLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgdHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIik7Ly8kTk9OLU5MUy0xJAotCQlpZiAodHlwZSAhPSBudWxsICYmICF0eXBlLmVxdWFsc0lnbm9yZUNhc2UoInRleHQvY3NzIikpLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgaHJlZiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJocmVmIik7Ly8kTk9OLU5MUy0xJAotCQlpZiAoaHJlZiA9PSBudWxsIHx8IGhyZWYubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJQ1NTTW9kZWwgcmV0cmlldmVNb2RlbCgpIHsKLQkJaWYgKCFpc1ZhbGlkQXR0cmlidXRlKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gbnVsbCxhdHRyIGNoZWNrIGlzIGRvbmUgaW4gaXNWYWxpZEF0dHJpYnV0ZSgpCi0JCUVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJU3RyaW5nIGhyZWYgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaHJlZiIpOy8vJE5PTi1OTFMtMSQKLQotCQlJRE9NTW9kZWwgYmFzZU1vZGVsID0gKChJRE9NTm9kZSkgZWxlbWVudCkuZ2V0TW9kZWwoKTsKLQkJaWYgKGJhc2VNb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU9iamVjdCBpZCA9IGJhc2VNb2RlbC5nZXRJZCgpOwotCQlpZiAoIShpZCBpbnN0YW5jZW9mIFN0cmluZykpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy9TdHJpbmcgYmFzZSA9IChTdHJpbmcpaWQ7Ci0KLQkJLy8gZ2V0IE1vZGVsUHJvdmlkZUFkYXB0ZXIKLQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgYWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBnZXRFbGVtZW50KCkpLmdldEFkYXB0ZXJGb3IoTW9kZWxQcm92aWRlQWRhcHRlckNsYXNzKTsKLQotCQlVUkxNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IFVSTE1vZGVsUHJvdmlkZXIoKTsKLQkJdHJ5IHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwgPSBwcm92aWRlci5nZXRNb2RlbEZvclJlYWQoYmFzZU1vZGVsLCBocmVmKTsKLQkJCWlmIChuZXdNb2RlbCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKCEobmV3TW9kZWwgaW5zdGFuY2VvZiBJQ1NTTW9kZWwpKSB7Ci0JCQkJbmV3TW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCS8vIG5vdGlmeSBhZGFwdGVyCi0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCWFkYXB0ZXIubW9kZWxQcm92aWRlZChuZXdNb2RlbCk7Ci0KLQkJCXJldHVybiAoSUNTU01vZGVsKSBuZXdNb2RlbDsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1vZGVsKElDU1NNb2RlbCBtb2RlbCkgewotCQlJQ1NTTW9kZWwgb2xkTW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBvbGRNb2RlbCkKLQkJCXJldHVybjsKLQkJc3VwZXIuc2V0TW9kZWwobW9kZWwpOwotCQlpZiAodGhpcy5yZXBsYWNlTW9kZWwpCi0JCQl0aGlzLnJlcGxhY2VNb2RlbCA9IGZhbHNlOwotCQlpZiAob2xkTW9kZWwgIT0gbnVsbCkKLQkJCW9sZE1vZGVsLnJlbW92ZVN0eWxlTGlzdGVuZXIodGhpcyk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKQotCQkJbW9kZWwuYWRkU3R5bGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9TdHlsZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9TdHlsZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMmVlNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvU3R5bGVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZURlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldExpc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFN0eWxlQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXJGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIFN0eWxlQWRhcHRlckZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0JLy8JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENTU19DT05URU5UX1RZUEUgPSAidGV4dC9jc3MiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0eWxlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyKSB7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTm9kZSBub2RlID0gKE5vZGUpIG5vdGlmaWVyOwotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJSFRNTERvY3VtZW50QWRhcHRlciBuZXdBZGFwdGVyID0gbmV3IEhUTUxEb2N1bWVudEFkYXB0ZXIoKTsKLQkJCW5ld0FkYXB0ZXIuc2V0RG9jdW1lbnQoKERvY3VtZW50KSBub2RlKTsKLQkJCW5vdGlmaWVyLmFkZEFkYXB0ZXIobmV3QWRhcHRlcik7Ci0JCQlyZXR1cm4gbmV3QWRhcHRlcjsKLQkJfQotCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUpKSB7Ci0JCQlpZiAoIWlzVGFnQXZhaWxhYmxlKGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkvLwkJU3RyaW5nIHR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUpOwotCQkJLy8JCWlmICh0eXBlICE9IG51bGwgJiYgISB0eXBlLmVxdWFsc0lnbm9yZUNhc2UoQ1NTX0NPTlRFTlRfVFlQRSkpIHsKLQkJCS8vCQkJcmV0dXJuIG51bGw7Ci0JCQkvLwkJfQotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQlTdHlsZUVsZW1lbnRBZGFwdGVyIG5ld0FkYXB0ZXIgPSBuZXcgU3R5bGVFbGVtZW50QWRhcHRlcigpOwotCQkJbmV3QWRhcHRlci5zZXRFbGVtZW50KGVsZW1lbnQpOwotCQkJbm90aWZpZXIuYWRkQWRhcHRlcihuZXdBZGFwdGVyKTsKLQkJCXJldHVybiBuZXdBZGFwdGVyOwotCQl9Ci0JCWVsc2UgaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTElOSykpIHsKLQkJCWlmICghaXNUYWdBdmFpbGFibGUoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCksIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSU5LKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQlMaW5rRWxlbWVudEFkYXB0ZXIgbmV3QWRhcHRlciA9IG5ldyBMaW5rRWxlbWVudEFkYXB0ZXIoKTsKLQkJCW5ld0FkYXB0ZXIuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJCW5vdGlmaWVyLmFkZEFkYXB0ZXIobmV3QWRhcHRlcik7Ci0JCQlyZXR1cm4gbmV3QWRhcHRlcjsKLQkJfQotCi0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKElTdHlsZURlY2xhcmF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlcjsKLQotCQlpZiAoIWlzQXR0cmlidXRlQXZhaWxhYmxlKGVsZW1lbnQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1RZTEUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHlsZUF0dHJBZGFwdGVyIG5ld0FkYXB0ZXIgPSBuZXcgU3R5bGVBdHRyQWRhcHRlcigpOwotCQluZXdBZGFwdGVyLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0JCW5vdGlmaWVyLmFkZEFkYXB0ZXIobmV3QWRhcHRlcik7Ci0JCXJldHVybiBuZXdBZGFwdGVyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFN0eWxlQWRhcHRlckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgU3R5bGVBZGFwdGVyRmFjdG9yeSgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzIHx8IHR5cGUgPT0gSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzIHx8IHR5cGUgPT0gSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RhZ0F2YWlsYWJsZShEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9jdW1lbnQpOwotCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQlDTURvY3VtZW50IGNtZG9jID0gbW9kZWxRdWVyeS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChkb2N1bWVudCk7Ci0JCQlDTU5hbWVkTm9kZU1hcCBtYXAgPSBjbWRvYy5nZXRFbGVtZW50cygpOwotCQkJaWYgKChDTUVsZW1lbnREZWNsYXJhdGlvbikgbWFwLmdldE5hbWVkSXRlbShlbGVtZW50TmFtZSkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVBdmFpbGFibGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJaWYgKGRlY2wgIT0gbnVsbCkgewotCQkJCUNNTmFtZWROb2RlTWFwIG1hcCA9IGRlY2wuZ2V0QXR0cmlidXRlcygpOwotCQkJCWlmICgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgbWFwLmdldE5hbWVkSXRlbShhdHRyTmFtZSkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGluZyBPYmplY3QncyBjbG9uZSgpIG1ldGhvZAotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvU3R5bGVBdHRyQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvU3R5bGVBdHRyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGQ4YzczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1N0eWxlQXR0ckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5OZXdEb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVBdHRyQWRhcHRlciBleHRlbmRzIEFic3RyYWN0Q1NTTW9kZWxBZGFwdGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLCBJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIgewotCi0JcHJpdmF0ZSBib29sZWFuIGlnbm9yZU5vdGlmaWNhdGlvbiA9IGZhbHNlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTVFlMRSA9ICJzdHlsZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICovCi0JU3R5bGVBdHRyQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSUNTU01vZGVsIGdldE1vZGVsKCkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsICYmIGlzTW9kZWxOZWNlc3NhcnkoKSkgewotCQkJbW9kZWwgPSBjcmVhdGVNb2RlbCgpOwotCQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCVJlZ2lvblBhcnNlciBwYXJzZXIgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCk7Ci0JCQlpZiAocGFyc2VyIGluc3RhbmNlb2YgQ1NTU291cmNlUGFyc2VyKSB7Ci0JCQkJKChDU1NTb3VyY2VQYXJzZXIpcGFyc2VyKS5zZXRQYXJzZXJNb2RlKENTU1NvdXJjZVBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCQkJc2V0TW9kZWwobW9kZWwpOyAvLyBuZWVkIHRvIHNldCBiZWZvcmUgdmFsdWVDaGFuZ2VkKCkKLQkJCXZhbHVlQ2hhbmdlZCgpOwotCQl9Ci0JCWlmIChtb2RlbCAhPSBudWxsICYmICFpc01vZGVsTmVjZXNzYXJ5KCkpIHsKLQkJCW1vZGVsID0gbnVsbDsKLQkJCXZhbHVlQ2hhbmdlZCgpOwotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVEZWNsYXJhdGlvbiBnZXRTdHlsZSgpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChDU1NTdHlsZURlY2xhcmF0aW9uKSBtb2RlbC5nZXREb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZQotCSAqIGFsbG93cyBpdCB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSA9PSB0aGlzKQotCQkJcmV0dXJuOwotCi0JCXNldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChldmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpID09IHRoaXMpCi0JCQlyZXR1cm47Ci0KLQkJc2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJaWYgKHRoaXMuaWdub3JlTm90aWZpY2F0aW9uKQotCQkJcmV0dXJuOwotCi0JCWlmIChldmVudFR5cGUgIT0gSU5vZGVOb3RpZmllci5DSEFOR0UpCi0JCQlyZXR1cm47Ci0JCUF0dHIgYXR0ciA9IChBdHRyKSBjaGFuZ2VkRmVhdHVyZTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIG5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShTVFlMRSkpIHsKLQkJCXZhbHVlQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChldmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpID09IHRoaXMpCi0JCQlyZXR1cm47Ci0KLQkJc2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChldmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpID09IHRoaXMpCi0JCQlyZXR1cm47Ci0KLQkJc2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWUoKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25MaXN0KCk7Ci0JCWlmIChmbGF0Tm9kZXMgIT0gbnVsbCkgewotCQkJaW50IGNvdW50ID0gZmxhdE5vZGVzLmdldExlbmd0aCgpOwotCQkJaWYgKGNvdW50ID4gMCkgewotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBmbGF0Tm9kZXMuaXRlbShpKTsKLQkJCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJYnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KCkpOwotCQkJCX0KLQkJCQl2YWx1ZSA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5pZ25vcmVOb3RpZmljYXRpb24gPSB0cnVlOwotCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShTVFlMRSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoU1RZTEUpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCSgoSURPTU5vZGUpIGF0dHIpLnNldFZhbHVlU291cmNlKHZhbHVlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCURvY3VtZW50IGRvY3VtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJYXR0ciA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShTVFlMRSk7Ci0JCQkJKChJRE9NTm9kZSkgYXR0cikuc2V0VmFsdWVTb3VyY2UodmFsdWUpOwotCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShhdHRyKTsKLQkJCX0KLQkJfQotCQl0aGlzLmlnbm9yZU5vdGlmaWNhdGlvbiA9IGZhbHNlOwotCi0JCW5vdGlmeVN0eWxlQ2hhbmdlZChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsdWVDaGFuZ2VkKCkgewotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghaXNNb2RlbE5lY2Vzc2FyeSgpKSB7IC8vIHJlbW92ZWQKLQkJCXNldE1vZGVsKG51bGwpOwotCi0JCQlub3RpZnlTdHlsZUNoYW5nZWQoZWxlbWVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBkZWZlcgotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TVFlMRSk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQl2YWx1ZSA9ICgoSURPTU5vZGUpIGF0dHIpLmdldFZhbHVlU291cmNlKCk7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5zZXRUZXh0KHRoaXMsIHZhbHVlKTsKLQotCQlub3RpZnlTdHlsZUNoYW5nZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTW9kZWxOZWNlc3NhcnkoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50KCkgIT0gbnVsbCAmJiBnZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlTm9kZShvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1RZTEUpICE9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvU3R5bGVFbGVtZW50QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvU3R5bGVFbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWY5N2I5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1N0eWxlRWxlbWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAJICAgIE1hc2FraSBTYWl0b2ggKE1TQUlUT0hAanAuaWJtLmNvbSkKLSAqCQlTZWUgQnVnIDE1MzAwMCAgU3R5bGUgQWRhcHRlcnMgc2hvdWxkIGJlIGxhemllcgotICoJCWh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTMwMDAKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSU1vZGVsUHJvdmlkZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0TGlzdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVFbGVtZW50QWRhcHRlciBleHRlbmRzIEFic3RyYWN0U3R5bGVTaGVldEFkYXB0ZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgewotCi0JcHJpdmF0ZSBib29sZWFuIHJlcGxhY2VNb2RlbCA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGlnbm9yZU5vdGlmaWNhdGlvbiA9IGZhbHNlOwotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFN0eWxlRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUHJlcGFyYXRpb24gb2YgYXBwbHlpbmcgY2hhbmdlcyBmcm9tIENTUyBzdWItbW9kZWwgdG8gSFRNTCBtb2RlbAotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZ2V0IG9sZCBjb250ZW50IGxlbmd0aAotCQlOb2RlIGNoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChjaGlsZCA9PSBudWxsIHx8IGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUpCi0JCQlyZXR1cm47Ci0JCUlET01Ob2RlIGNvbnRlbnQgPSAoSURPTU5vZGUpIGNoaWxkOwotCQlpbnQgb2xkTGVuZ3RoID0gY29udGVudC5nZXRFbmRPZmZzZXQoKSAtIGNvbnRlbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQkvLyBnZXQgbmV3IGNvbnRlbnQgbGVuZ3RoCi0JCWludCBuZXdMZW5ndGggPSAwOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBmbGF0Tm9kZXMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uTGlzdCgpOwotCQlpZiAoZmxhdE5vZGVzICE9IG51bGwpIHsKLQkJCWludCBjb3VudCA9IGZsYXROb2Rlcy5nZXRMZW5ndGgoKTsKLQkJCWlmIChjb3VudCA+IDApIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3QgPSBmbGF0Tm9kZXMuaXRlbShjb3VudCAtIDEpOwotCQkJCWlmIChsYXN0ICE9IG51bGwpCi0JCQkJCW5ld0xlbmd0aCA9IGxhc3QuZ2V0RW5kKCk7Ci0JCQl9Ci0JCX0KLQotCQlpbnQgb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJaW50IGVuZCA9IGZsYXROb2RlLmdldEVuZCgpOwotCQlpbnQgZGlmZiA9IG9sZExlbmd0aCAtIG5ld0xlbmd0aDsKLQkJaW50IGxlbmd0aCA9IGVuZCAtIG9mZnNldCArIGRpZmY7Ci0JCVN0cmluZyBkYXRhID0gZmxhdE5vZGUuZ2V0VGV4dCgpOwotCi0JCXJlcGxhY2VEYXRhKG9mZnNldCwgbGVuZ3RoLCBkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBseSBjaGFuZ2VzIGZyb20gSFRNTCBtb2RlbCB0byBDU1Mgc3ViLW1vZGVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbnRlbnRDaGFuZ2VkKCkgewotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgZGF0YSA9IG51bGw7Ci0JCU5vZGUgY2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGNoaWxkICE9IG51bGwgJiYgY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5nZXROZXh0U2libGluZygpID09IG51bGwpIHsKLQkJCWRhdGEgPSBjaGlsZC5nZXROb2RlVmFsdWUoKTsKLQkJfQotCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJZGF0YSA9ICIiOy8vJE5PTi1OTFMtMSQKLQotCQkvLyBtaW5pbWl6ZSByZXBsYWNlIHJhbmdlCi0JCWludCBzdGFydCA9IDAsIGVuZCA9IDA7Ci0JCVN0cmluZyBvbGREYXRhID0gc3RydWN0dXJlZERvY3VtZW50LmdldCgpOwotCQlpZiAob2xkRGF0YSA9PSBudWxsKQotCQkJb2xkRGF0YSA9ICIiOy8vJE5PTi1OTFMtMSQKLQotCQkvLyBzZWFyY2ggZGlmZmVyZW5jdCBjaGFyYWN0ZXIgcG9zaXRpb24gZnJvbSBmaXJzdAotCQlmb3IgKDsgc3RhcnQgPCBvbGREYXRhLmxlbmd0aCgpICYmIHN0YXJ0IDwgZGF0YS5sZW5ndGgoKTsgc3RhcnQrKykKLQkJCWlmIChvbGREYXRhLmNoYXJBdChzdGFydCkgIT0gZGF0YS5jaGFyQXQoc3RhcnQpKQotCQkJCWJyZWFrOwotCi0JCWlmIChzdGFydCA9PSBvbGREYXRhLmxlbmd0aCgpICYmIHN0YXJ0ID09IGRhdGEubGVuZ3RoKCkpCi0JCQlyZXR1cm47IC8vIG5vIGNoYW5nZQotCQllbHNlIGlmIChzdGFydCA9PSBvbGREYXRhLmxlbmd0aCgpKSB7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoZ2V0UmVxdWVzdGVySDJDKCksIHN0YXJ0LCAwLCBkYXRhLnN1YnN0cmluZyhzdGFydCkpOyAvLyBhcHBlbmQgdGV4dCB0byBsYXN0Ci0JCX0KLQkJZWxzZSBpZiAoc3RhcnQgPT0gZGF0YS5sZW5ndGgoKSkgewotCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KGdldFJlcXVlc3RlckgyQygpLCBzdGFydCwgb2xkRGF0YS5sZW5ndGgoKSAtIHN0YXJ0LCAiIik7IC8vIHJlbW92ZSB0ZXh0IG9mIGxhc3QgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJLy8gc2VhcmNoIGRpZmZlcmVuY3QgY2hhcmFjdGVyIHBvc2l0aW9uIGZyb20gbGFzdAotCQkJZm9yICg7IHN0YXJ0IDwgb2xkRGF0YS5sZW5ndGgoKSAtIGVuZCAmJiBzdGFydCA8IGRhdGEubGVuZ3RoKCkgLSBlbmQ7IGVuZCsrKSB7Ci0JCQkJaWYgKG9sZERhdGEuY2hhckF0KG9sZERhdGEubGVuZ3RoKCkgLSBlbmQgLSAxKSAhPSBkYXRhLmNoYXJBdChkYXRhLmxlbmd0aCgpIC0gZW5kIC0gMSkpCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KGdldFJlcXVlc3RlckgyQygpLCBzdGFydCwgb2xkRGF0YS5sZW5ndGgoKSAtIGVuZCAtIHN0YXJ0LCBkYXRhLnN1YnN0cmluZyhzdGFydCwgZGF0YS5sZW5ndGgoKSAtIGVuZCkpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSUNTU01vZGVsIGdldE1vZGVsKCkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmICh0aGlzLnJlcGxhY2VNb2RlbCkgewotCQkJSUNTU01vZGVsIG9sZE1vZGVsID0gbW9kZWw7Ci0JCQltb2RlbCA9IGNyZWF0ZU1vZGVsKGZhbHNlKTsKLQotCQkJc2V0TW9kZWwobW9kZWwsIGZhbHNlKTsgLy8gbmVlZCB0byBzZXQgYmVmb3JlIGNvbnRlbnRDaGFuZ2VkKCkKLQkJCWNvbnRlbnRDaGFuZ2VkKCk7Ci0KLQkJCS8vIGZyb20gc3VwZXIuY3JlYXRlTW9kZWwoKQotCQkJLy8gZ2V0IE1vZGVsUHJvdmlkZUFkYXB0ZXIKLQkJCUlNb2RlbFByb3ZpZGVBZGFwdGVyIG1vZGVsUHJvdmlkZUFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZ2V0RWxlbWVudCgpKS5nZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCS8vIG5vdGlmeSBhZGFwdGVyCi0JCQlpZiAobW9kZWxQcm92aWRlQWRhcHRlciAhPSBudWxsKQotCQkJCW1vZGVsUHJvdmlkZUFkYXB0ZXIubW9kZWxQcm92aWRlZChtb2RlbCk7Ci0KLQkJCS8vIGZyb20gY3JlYXRlTW9kZWwoKQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCQkJLy8gZnJvbSBzZXRNb2RlbCgpCi0JCQlpZiAob2xkTW9kZWwgIT0gbnVsbCkKLQkJCQlvbGRNb2RlbC5yZW1vdmVTdHlsZUxpc3RlbmVyKHRoaXMpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwuYWRkU3R5bGVMaXN0ZW5lcih0aGlzKTsKLQotCQkJaWYgKG9sZE1vZGVsICE9IG51bGwpIHsKLQkJCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZ2V0RWxlbWVudCgpKS5nZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXIubW9kZWxSZW1vdmVkKG9sZE1vZGVsKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXRoaXMucmVwbGFjZU1vZGVsID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRBdHRyaWJ1dGUoKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFKTsKLQkJaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlLmxlbmd0aCgpID4gMCAmJiAhdHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJ0ZXh0L2NzcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSUNTU01vZGVsIGNyZWF0ZU1vZGVsKCkgewotCQlyZXR1cm4gY3JlYXRlTW9kZWwodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIElDU1NNb2RlbCBjcmVhdGVNb2RlbChib29sZWFuIGFkZExpc3RlbmVyKSB7Ci0JCWlmICghaXNWYWxpZEF0dHJpYnV0ZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmICghYWRkTGlzdGVuZXIpCi0JCQlyZXR1cm4gc3VwZXIuY3JlYXRlTW9kZWwoZmFsc2UpOwotCi0JCUlDU1NNb2RlbCBtb2RlbCA9IHN1cGVyLmNyZWF0ZU1vZGVsKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCS8vICBwdWJsaWMgSUNTU01vZGVsIGdldE1vZGVsKCkgewotCS8vICAJSUNTU01vZGVsIG1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbCgpOwotCS8vICAJaWYgKG1vZGVsID09IG51bGwpIHsKLQkvLyAgCQltb2RlbCA9IGNyZWF0ZU1vZGVsKCk7Ci0JLy8gIAkJaWYgKG1vZGVsID09IG51bGwpIHJldHVybiBudWxsOwotCS8vICAJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JLy8gIAkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkvLyAgCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkTW9kZWxDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JLy8gIAkJc2V0TW9kZWwobW9kZWwpOyAvLyBuZWVkIHRvIHNldCBiZWZvcmUgY29udGVudENoYW5nZWQoKQotCS8vICAJCWNvbnRlbnRDaGFuZ2VkKCk7Ci0JLy8gIAl9Ci0JLy8gIAlyZXR1cm4gbW9kZWw7Ci0JLy8gIH0KLQkvKioKLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRSZXF1ZXN0ZXJIMkMoKSB7Ci0JCXJldHVybiAoZ2V0RWxlbWVudCgpICE9IG51bGwgJiYgKChJRE9NTm9kZSkgZ2V0RWxlbWVudCgpKS5nZXRNb2RlbCgpICE9IG51bGwpID8gKE9iamVjdCkgKChJRE9NTm9kZSkgZ2V0RWxlbWVudCgpKS5nZXRNb2RlbCgpIDogdGhpczsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRSZXF1ZXN0ZXJDMkgoKSB7Ci0JCXJldHVybiAoZ2V0TW9kZWwoKSAhPSBudWxsKSA/IChPYmplY3QpIGdldE1vZGVsKCkgOiB0aGlzOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudGluZyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIncyBtZXRob2QKLQkgKiBFdmVudCBmcm9tIENTUyBGbGF0IE1vZGVsCi0JICovCi0JcHVibGljIHZvaWQgbmV3TW9kZWwoTmV3RG9jdW1lbnRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGV2ZW50LmdldE9yaWdpbmFsUmVxdWVzdGVyKCkgPT0gZ2V0UmVxdWVzdGVySDJDKCkpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZmxhdE5vZGVzID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkxpc3QoKTsKLQkJaWYgKGZsYXROb2RlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKGZsYXROb2RlcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50aW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcidzIG1ldGhvZAotCSAqIEV2ZW50IGZyb20gQ1NTIEZsYXQgTW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBub0NoYW5nZShOb0NoYW5nZUV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50aW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcidzIG1ldGhvZAotCSAqIEV2ZW50IGZyb20gQ1NTIEZsYXQgTW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSA9PSBnZXRSZXF1ZXN0ZXJIMkMoKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGV2ZW50LmdldE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGV2ZW50LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPT0gbnVsbCAmJiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJcmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGluZyBJTm9kZUFkYXB0ZXIncyBtZXRob2QKLQkgKiBFdmVudCBmcm9tIDxTVFlMRT4gZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlpZiAodGhpcy5pZ25vcmVOb3RpZmljYXRpb24pCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkFERCB8fCBldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUgfHwgZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VEKSB7Ci0JCQljb250ZW50Q2hhbmdlZCgpOwotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNIQU5HRSkgewotCQkJQXR0ciBhdHRyID0gKEF0dHIpIGNoYW5nZWRGZWF0dXJlOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgidHlwZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLnJlcGxhY2VNb2RlbCA9IHRydWU7Ci0KLQkJCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCURvY3VtZW50IGRvY3VtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlIVE1MRG9jdW1lbnRBZGFwdGVyIGFkYXB0ZXIgPSAoSFRNTERvY3VtZW50QWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldExpc3RBZGFwdGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXIuY2hpbGRSZXBsYWNlZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudGluZyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIncyBtZXRob2QKLQkgKiBFdmVudCBmcm9tIENTUyBGbGF0IE1vZGVsCi0JICovCi0JcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChldmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpID09IGdldFJlcXVlc3RlckgyQygpKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50aW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcidzIG1ldGhvZAotCSAqIEV2ZW50IGZyb20gQ1NTIEZsYXQgTW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChldmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpID09IGdldFJlcXVlc3RlckgyQygpKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogQXBwbHkgY2hhbmdlcyBmcm9tIENTUyBzdWItbW9kZWwgdG8gSFRNTCBtb2RlbAotCSAqLwotCXByaXZhdGUgdm9pZCByZXBsYWNlRGF0YShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgZGF0YSkgewotCQlJRE9NTm9kZSBlbGVtZW50ID0gKElET01Ob2RlKSBnZXRFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01Nb2RlbCBvd25lck1vZGVsID0gZWxlbWVudC5nZXRNb2RlbCgpOwotCQlpZiAob3duZXJNb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG93bmVyTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaW50IGNvbnRlbnRPZmZzZXQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCWRhdGEgPSAiIjsvLyROT04tTkxTLTEkCi0KLQkJdGhpcy5pZ25vcmVOb3RpZmljYXRpb24gPSB0cnVlOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoZ2V0UmVxdWVzdGVyQzJIKCksIGNvbnRlbnRPZmZzZXQgKyBvZmZzZXQsIGxlbmd0aCwgZGF0YSk7Ci0JCXRoaXMuaWdub3JlTm90aWZpY2F0aW9uID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUHJlcGFyYXRpb24gb2YgYXBwbHlpbmcgY2hhbmdlcyBmcm9tIENTUyBzdWItbW9kZWwgdG8gSFRNTCBtb2RlbAotCSAqLwotCXByaXZhdGUgdm9pZCByZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKSB7Ci0JCWludCBvZmZzZXQgPSAwOwotCQlpbnQgbGVuZ3RoID0gMDsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgIT0gbnVsbCkgewotCQkJaW50IGNvdW50ID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKTsKLQkJCWlmIChjb3VudCA+IDApIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0ID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKDApOwotCQkJCWlmIChmaXJzdCAhPSBudWxsKQotCQkJCQlvZmZzZXQgPSBmaXJzdC5nZXRTdGFydCgpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbShjb3VudCAtIDEpOwotCQkJCWlmIChsYXN0ICE9IG51bGwpCi0JCQkJCWxlbmd0aCA9IGxhc3QuZ2V0RW5kKCkgLSBvZmZzZXQ7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGRhdGEgPSBudWxsOwotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlpbnQgY291bnQgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpOwotCQkJaWYgKGNvdW50ID4gMCkgewotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0oaSk7Ci0JCQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoZmxhdE5vZGUuZ2V0VGV4dCgpKTsKLQkJCQkJaWYgKGkgPT0gMCkKLQkJCQkJCW9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCQkJfQotCQkJCWRhdGEgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCXJlcGxhY2VEYXRhKG9mZnNldCwgbGVuZ3RoLCBkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RlbChJQ1NTTW9kZWwgbW9kZWwpIHsKLQkJc2V0TW9kZWwobW9kZWwsIHRydWUpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1vZGVsKElDU1NNb2RlbCBtb2RlbCwgYm9vbGVhbiBzZXR1cExpc3RlbmVyKSB7Ci0JCUlDU1NNb2RlbCBvbGRNb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG9sZE1vZGVsKQotCQkJcmV0dXJuOwotCQlzdXBlci5zZXRNb2RlbChtb2RlbCk7Ci0JCWlmICghc2V0dXBMaXN0ZW5lcikKLQkJCXJldHVybjsKLQkJaWYgKG9sZE1vZGVsICE9IG51bGwpCi0JCQlvbGRNb2RlbC5yZW1vdmVTdHlsZUxpc3RlbmVyKHRoaXMpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCW1vZGVsLmFkZFN0eWxlTGlzdGVuZXIodGhpcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1N0eWxlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1N0eWxlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRjNmQ1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9TdHlsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi0KLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3R5bGVMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHN0eWxlQ2hhbmdlZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvVVJMSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9VUkxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg1NTllMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9VUkxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgCi0gKi8KLXB1YmxpYyBjbGFzcyBVUkxIZWxwZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5VUkxIZWxwZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGJhc2VVcmwKLQkgKi8KLQlwdWJsaWMgVVJMSGVscGVyKFN0cmluZyBiYXNlVXJsKSB7Ci0JCXN1cGVyKGJhc2VVcmwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlVXJsCi0JICogQHBhcmFtIGRvY1Jvb3QKLQkgKi8KLQlwdWJsaWMgVVJMSGVscGVyKFN0cmluZyBiYXNlVXJsLCBTdHJpbmcgZG9jUm9vdCkgewotCQlzdXBlcihiYXNlVXJsLCBkb2NSb290KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1VSTE1vZGVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1VSTE1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxYjExOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9VUkxNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUFscmVhZHlFeGlzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VJblVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5QYXRoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlByb2plY3RSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8vIFRPRE8gd2hlbiB0aGlzIGNsYXNzIGlzIHJlbW92ZWQgZnJvbSAuY29yZSwgUGF0aEhlbHBlciBhbmQgVVJMSGVscGVyIGNsYXNzCi0vLyBhbHNvIGNhbiBiZSByZW1vdmVkLgotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFVSTE1vZGVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFVF9NT0RFTF9GT1JfUkVBRCA9IDE7Ci0JLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFVF9ORVdfTU9ERUxfRk9SX1JFQUQgPSAyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfTU9ERUxfRk9SX0VESVQgPSAzOwotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfTkVXX01PREVMX0ZPUl9FRElUID0gNDsKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVBRF9CVUZGRVJfU0laRSA9IDQwOTY7Ci0JLy8gSU1vZGVsTWFuYWdlcgotCXByaXZhdGUgSU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIFVSTE1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy8gb2J0YWluIG1vZGVsIG1hbmFnZXIKLQkJbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGUgSUQgZnJvbSBhIGZpbGVuYW1lLiBUaGlzIG11c3QgYmUgc2FtZSBhcwotCSAqIEZpbGVNb2RlbFByb3ZpZGVyLmNhbGN1bGF0ZUlkKElGaWxlKQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjYWxjdWxhdGVJZChJUGF0aCBmdWxsSVBhdGgpIHsKLQkJcmV0dXJuIGZ1bGxJUGF0aC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmJhc2VNb2RlbDwvY29kZT46IHRoZSBtb2RlbCBjb250YWluaW5nIHRoZSBsaW5rCi0JICogPGNvZGU+cmVmPC9jb2RlPjogdGhlIGxpbmsgVVJMIHN0cmluZwotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRDb21tb25Nb2RlbEZvcihmaW5hbCBJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCwgZmluYWwgU3RyaW5nIHJlZiwgZmluYWwgaW50IHdoaWNoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBmaXJzdCwgY3JlYXRlIGFic29sdXRlIHVybAotCQlTdHJpbmcgYWJzVVJMID0gcmVzb2x2ZVVSSShiYXNlTW9kZWwsIHJlZiwgdHJ1ZSk7Ci0JCWlmICgoYWJzVVJMID09IG51bGwpIHx8IChhYnNVUkwubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gbmVlZCB0byByZW1vdmUgZmlsZTovLyBzY2hlbWUgaWYgbmVjZXNzYXJ5Ci0JCXRyeSB7Ci0JCQlmaW5hbCBqYXZhLm5ldC5VUkwgYVVSTCA9IG5ldyBqYXZhLm5ldC5VUkwoYWJzVVJMKTsKLQkJCS8vIEFuIGFjdHVhbCBVUkwgd2FzIGdpdmVuLCBvbmx5IGZpbGU6Ly8vIGlzIHN1cHBvcnRlZAotCQkJLy8gcmVzb2x2ZSBpdCBieSBmaW5kaW5nIHRoZSBmaWxlIGl0IHBvaW50cyB0bwotCQkJaWYgKCFhVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJwbGF0Zm9ybSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYVVSTC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpICYmIChhVVJMLmdldEhvc3QoKS5lcXVhbHMoImxvY2FsaG9zdCIpIHx8IGFVUkwuZ2V0SG9zdCgpLmxlbmd0aCgpID09IDApKSB7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJYWJzVVJMID0gYVVSTC5nZXRGaWxlKCk7Ci0JCQkJCWZpbmFsIElQYXRoIGlwYXRoID0gbmV3IFBhdGgoYWJzVVJMKTsKLQkJCQkJLy8gIGlmIHBhdGggaGFzIGEgZGV2aWNlLCBhbmQgaWYgaXQgYmVnaW5zIHdpdGgKLQkJCQkJLy8gSVBhdGguU0VQQVJBVE9SLCByZW1vdmUgaXQKLQkJCQkJZmluYWwgU3RyaW5nIGRldmljZSA9IGlwYXRoLmdldERldmljZSgpOwotCQkJCQlpZiAoKGRldmljZSAhPSBudWxsKSAmJiAoZGV2aWNlLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCWlmIChkZXZpY2UuY2hhckF0KDApID09IElQYXRoLlNFUEFSQVRPUikgewotCQkJCQkJCWZpbmFsIFN0cmluZyBuZXdEZXZpY2UgPSBkZXZpY2Uuc3Vic3RyaW5nKDEpOwotCQkJCQkJCWFic1VSTCA9IGlwYXRoLnNldERldmljZShuZXdEZXZpY2UpLnRvU3RyaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1mdUV4YykgewotCQl9Ci0KLQotCQkvLyBuZXh0LCBkZWNpZGUgcHJvamVjdAotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJZmluYWwgSVBhdGggZnVsbElQYXRoID0gbmV3IFBhdGgoYWJzVVJMKTsKLQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSUNvbnRhaW5lciBjb250YWluZXIgPSB3b3Jrc3BhY2UuZ2V0Q29udGFpbmVyRm9yTG9jYXRpb24oZnVsbElQYXRoKTsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkvLyBmdWxsSVBhdGggZG9lc24ndCBleGlzdCBpbiB3b3Jrc3BhY2UKLQkJCXByb2plY3QgPSBjb250YWluZXIuZ2V0UHJvamVjdCgpOwotCQl9Ci0KLQkJLy8gSWYgSFRNTCBkb2N1bWVudCBoYXMgYSBsaW5rIHRvIGFuIGV4dGVybiBDU1Mgd2hpY2ggaXMgbm90IGluCi0JCS8vIElQcm9qZWN0Ci0JCS8vIHdvcmtzcGFjZS5nZXRDb250YWluZXJGb3JMb2F0aW9uKCkgbWF5IHJldHVybiBudWxsLiBXZSBuZWVkIHRvIHRha2UKLQkJLy8gY2FyZQotCQkvLyBvZiB0aGlzIGNhc2UKLQotCQkvLyBub3csIGdldCBhYnNVUkwncyBJRmlsZQotCQlpZiAoKHByb2plY3QgIT0gbnVsbCkgJiYgKHByb2plY3QuZ2V0TG9jYXRpb24oKS5pc1ByZWZpeE9mKGZ1bGxJUGF0aCkgPT0gZmFsc2UpKSB7Ci0JCQkvLyBpdCdzIGF0IG91dHNpZGUgb2YgUHJvamVjdAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJSVBhdGggZmlsZVBhdGggPSBmdWxsSVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhwcm9qZWN0LmdldExvY2F0aW9uKCkuc2VnbWVudENvdW50KCkpOwotCQkJSUZpbGUgZmlsZSA9IChmaWxlUGF0aCAhPSBudWxsICYmICFmaWxlUGF0aC5pc0VtcHR5KCkpID8gcHJvamVjdC5nZXRGaWxlKGZpbGVQYXRoKSA6IG51bGw7Ci0JCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCS8vIG9idGFpbiBtb2RlbAotCQkJaWYgKHdoaWNoID09IEdFVF9NT0RFTF9GT1JfRURJVCkgewotCQkJCW1vZGVsID0gZ2V0TW9kZWxGb3JFZGl0KGZpbGUpOwotCQkJfQotCQkJZWxzZSBpZiAod2hpY2ggPT0gR0VUX01PREVMX0ZPUl9SRUFEKSB7Ci0JCQkJbW9kZWwgPSBnZXRNb2RlbEZvclJlYWQoZmlsZSk7Ci0JCQl9Ci0KLQkJCS8vIHNldHRpbmcgc3luY2hyb25pemF0aW9uIHN0YW1wIGlzIElNb2RlbE1hbmFnZXIncyBjbGllbnQncwotCQkJLy8gcmVzcG9uc2liaWxpdHkKLQkJCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmdldFN5bmNocm9uaXphdGlvblN0YW1wKCkgPT0gSVJlc291cmNlLk5VTExfU1RBTVApCi0JCQkJbW9kZWwucmVzZXRTeW5jaHJvbml6YXRpb25TdGFtcChmaWxlKTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBpZCA9IG51bGw7Ci0JCQlJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG51bGw7Ci0JCQkvLyBvYnRhaW4gcmVzb2x2ZXIKLQkJCVVSSVJlc29sdmVyIHJlc29sdmVyID0gKHByb2plY3QgIT0gbnVsbCkgPyAoVVJJUmVzb2x2ZXIpIHByb2plY3QuZ2V0QWRhcHRlcihVUklSZXNvbHZlci5jbGFzcykgOiBudWxsOwotCQkJaWYgKHJlc29sdmVyID09IG51bGwpIHsKLQkJCQkvLyBQcm9qZWN0UmVzb2x2ZXIgY2FuIHRha2UgY2FyZSBvZiB0aGUgY2FzZSBpZiBwcm9qZWN0IGlzCi0JCQkJLy8gbnVsbC4KLQkJCQlyZXNvbHZlciA9IG5ldyBQcm9qZWN0UmVzb2x2ZXIocHJvamVjdCk7Ci0JCQl9Ci0JCQlpZiAocmVzb2x2ZXIgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvLyB0aGVyZSBpcyBubyBwcm9qZWN0LiB3ZSBjYW4ndCBleHBlY3QgSVByb2plY3QgaGVscCB0byBjcmVhdGUKLQkJCS8vIGlkL2lucHV0U3RyZWFtCi0JCQlqYXZhLmlvLkZpbGUgZmlsZSA9IGZ1bGxJUGF0aC50b0ZpbGUoKTsKLQotCQkJLy8gb2JhdGluIGlkCi0JCQlpZCA9IGNhbGN1bGF0ZUlkKGZ1bGxJUGF0aCk7Ci0KLQkJCS8vIG9idGFpbiBJbnB1dFN0cmVhbQotCQkJdHJ5IHsKLQkJCQlpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQl9Ci0JCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKLQkJCQkvLyB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgb3Igd2UgZG9uJ3QgaGF2ZSByZWFkIHBlcm1pc3Npb24KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gb2J0YWluIG1vZGVsCi0JCQl0cnkgewotCQkJCWlmICh3aGljaCA9PSBHRVRfTU9ERUxfRk9SX0VESVQpIHsKLQkJCQkJbW9kZWwgPSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoaWQsIGluU3RyZWFtLCByZXNvbHZlcik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHdoaWNoID09IEdFVF9NT0RFTF9GT1JfUkVBRCkgewotCQkJCQltb2RlbCA9IGdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChpZCwgaW5TdHJlYW0sIHJlc29sdmVyKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZSkgewotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJLy8gY2xvc2Ugbm93ICEKLQkJCQlpZiAoaW5TdHJlYW0gIT0gbnVsbCkgewotCQkJCQlpblN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0KLQkJLy8gc2V0IGxvY2F0aW9uaWQKLQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkgPT0gbnVsbCkgewotCQkJbW9kZWwuc2V0QmFzZUxvY2F0aW9uKGZ1bGxJUGF0aC50b1N0cmluZygpKTsKLQkJfQotCi0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5iYXNlTW9kZWw8L2NvZGU+OiB0aGUgbW9kZWwgY29udGFpbmluZyB0aGUgbGluawotCSAqIDxjb2RlPnJlZjwvY29kZT46IHRoZSBsaW5rIFVSTCBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwsIFN0cmluZyByZWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRDb21tb25Nb2RlbEZvcihiYXNlTW9kZWwsIHJlZiwgR0VUX01PREVMX0ZPUl9FRElUKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0KLQkJLy8gY3JlYXRlIGEgZmFrZSBJbnB1dFN0cmVhbQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvckVkaXQoZmlsZSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBleCkgewotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JFZGl0KGZpbGUsIEVuY29kaW5nUnVsZS5GT1JDRV9ERUZBVUxUKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+YmFzZU1vZGVsPC9jb2RlPjogdGhlIG1vZGVsIGNvbnRhaW5pbmcgdGhlIGxpbmsKLQkgKiA8Y29kZT5yZWY8L2NvZGU+OiB0aGUgbGluayBVUkwgc3RyaW5nCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsLCBTdHJpbmcgcmVmKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0Q29tbW9uTW9kZWxGb3IoYmFzZU1vZGVsLCByZWYsIEdFVF9NT0RFTF9GT1JfUkVBRCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChJRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbWFuYWdlciA9IGdldE1vZGVsTWFuYWdlcigpOwotCi0JCS8vIGNyZWF0ZSBhIGZha2UgSW5wdXRTdHJlYW0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZXgpIHsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChmaWxlLCBFbmNvZGluZ1J1bGUuRk9SQ0VfREVGQVVMVCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSU1vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKSB7Ci0JCXJldHVybiBtb2RlbE1hbmFnZXI7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TmV3TW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlKSB7Ci0JCWlmIChpRmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbWFuYWdlciA9IGdldE1vZGVsTWFuYWdlcigpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IG1hbmFnZXIuZ2V0TmV3TW9kZWxGb3JFZGl0KGlGaWxlLCBmYWxzZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJY2F0Y2ggKFJlc291cmNlSW5Vc2Ugcml1KSB7Ci0JCX0KLQkJY2F0Y2ggKFJlc291cmNlQWxyZWFkeUV4aXN0cyByYWUpIHsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXROZXdNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUpIHsKLQkJaWYgKGlGaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gbWFuYWdlci5nZXROZXdNb2RlbEZvckVkaXQoaUZpbGUsIGZhbHNlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VJblVzZSByaXUpIHsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VBbHJlYWR5RXhpc3RzIHJhZSkgewotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY2hlY2sgdGhlIG1vZGVsIGlzIEhUTUwgZmFtaWx5IG9yIG5vdAotCSAqLwotCXN0YXRpYyBwcml2YXRlIGJvb2xlYW4gaXNIVE1MRmFtaWx5KElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJcmV0dXJuIGFkYXB0ZXIuaGFzRmVhdHVyZShIVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzLkhUTUwpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5iYXNlTW9kZWw8L2NvZGU+OiB0aGUgbW9kZWwgY29udGFpbmluZyB0aGUgbGluawotCSAqIDxjb2RlPnJlZjwvY29kZT46IHRoZSBsaW5rIFVSTCBzdHJpbmcKLQkgKiA8Y29kZT5yZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3M8L2NvZGU+OiBJZiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MKLQkgKiBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHByb3Blcmx5IHJlc29sdmUgdGhlIFVSSSBpZiBpdCBpcwotCSAqIGEgdmFsaWQgVVJJIHBvaW50aW5nIHRvIGFub3RoZXIgKGFwcHJvcHJpYXRlKSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVVUkkoSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwsIFN0cmluZyByZWYsIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7Ci0JCWlmIChiYXNlTW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBmb3IgSFRNTCwgJ2hyZWYnIGF0dHJpYnV0ZSB2YWx1ZSBvZiBCQVNFIGVsZW1lbnQKLQkJLy8gc2hvdWxkIGJlIHVzZWQsIGlmIGV4aXN0cyBhbnkKLQkJU3RyaW5nIGJhc2VIcmVmID0gbnVsbDsKLQkJLy8gZG13X1RPRE8gbmVlZHMgdG8gYmUgY2hhbmdlZCB0byBoYW5kbGUgYSBjb250ZW50IG1vZGVsCi0JCS8vIG9mIEhUTUwgb3IgWEhUTUwKLQkJaWYgKGlzSFRNTEZhbWlseShiYXNlTW9kZWwpKSB7Ci0JCQlmaW5hbCBJRE9NTW9kZWwgeG1sbW9kZWwgPSAoSURPTU1vZGVsKSBiYXNlTW9kZWw7Ci0JCQlmaW5hbCBJRE9NRG9jdW1lbnQgZG9jID0geG1sbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCS8vIGxvb2sgZm9yIDxCQVNFPiB3LyBocmVmCi0JCQlmaW5hbCBOb2RlTGlzdCBubCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQkFTRSIpOy8vJE5PTi1OTFMtMSQKLQkJCWlmICgobmwgIT0gbnVsbCkgJiYgKG5sLmdldExlbmd0aCgpID4gMCkpIHsKLQkJCQkvLyBwZXIgZWFjaCA8QkFTRT4KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5sLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJZmluYWwgTm9kZSBiYXNlTm9kZSA9IG5sLml0ZW0oaSk7Ci0JCQkJCWlmIChiYXNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBnZXQgYWxsIGF0dHJzCi0JCQkJCQlmaW5hbCBOYW1lZE5vZGVNYXAgYXR0ck5vZGVzID0gYmFzZU5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJaWYgKGF0dHJOb2RlcyAhPSBudWxsKSB7Ci0JCQkJCQkJZmluYWwgTm9kZSBhdHRyTm9kZSA9IGF0dHJOb2Rlcy5nZXROYW1lZEl0ZW0oIkhSRUYiKTsvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKGF0dHJOb2RlICE9IG51bGwpIHsKLQkJCQkJCQkJLy8gZm91bmQgaHJlZj0iIgotCQkJCQkJCQlmaW5hbCBTdHJpbmcgYXR0clZhbHVlID0gYXR0ck5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCQkJYmFzZUhyZWYgPSBhdHRyVmFsdWUudHJpbSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIHdoYXQgaWYgdGhlcmUgYXJlIG11bHRpcGxlIDxCQVNFPiB0YWdzID8/Ci0JCQkJCWlmIChiYXNlSHJlZiAhPSBudWxsKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGdldCByZXNvbHZlciBpbiBNb2RlbAotCQlmaW5hbCBVUklSZXNvbHZlciByZXNvbHZlciA9IGJhc2VNb2RlbC5nZXRSZXNvbHZlcigpOwotCi0JCS8vIHJlc29sdmUgdG8gYWJzb2x1dGUgdXJsCi0JCWZpbmFsIFN0cmluZyBhYnN1cmwgPSAocmVzb2x2ZXIgIT0gbnVsbCkgPyAoKGJhc2VIcmVmICE9IG51bGwpID8gcmVzb2x2ZXIuZ2V0TG9jYXRpb25CeVVSSShyZWYsIGJhc2VIcmVmLCByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIDogcmVzb2x2ZXIuZ2V0TG9jYXRpb25CeVVSSShyZWYsIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcykpIDogbnVsbDsKLQkJaWYgKChyZXNvbHZlciAhPSBudWxsKSAmJiAoYWJzdXJsID09IG51bGwpICYmIChyZWYgIT0gbnVsbCkgJiYgKHJlZi50cmltKCkubGVuZ3RoKCkgPiAwKSAmJiAocmVmLnRyaW0oKS5jaGFyQXQoMCkgPT0gJy8nKSkgewotCQkJLy8gdG8gcmVhY2ggaGVyZSBtZWFucyA6Ci0JCQkvLyAgICByZWYgaXMgYSBEb2Nyb290IHJlbGF0aXZlCi0JCQkvLyAgICByZXNvbHZlciBjYW4ndCByZXNvbHZlIHJlZgotCQkJLy8gc28gdGhhdCBocmVmIGlzIGEgYnJva2VuIGFuZCBzaG91bGQgbm90IGNyZWF0ZSBtb2RlbAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKChhYnN1cmwgIT0gbnVsbCkgJiYgKGFic3VybC5sZW5ndGgoKSA+IDApKSB7Ci0JCQlyZXR1cm4gYWJzdXJsOwotCQl9Ci0KLQkJLy8gbWF5YmUgcmVmIGlzIGF0IG91dHNpZGUgb2YgdGhlIFByb2plY3QKLQkJLy8gb2J0YWluIGRvY3Jvb3Q7Ci0JCWZpbmFsIElDb250YWluZXIgY29udGFpbmVyID0gKHJlc29sdmVyICE9IG51bGwpID8gcmVzb2x2ZXIuZ2V0Um9vdExvY2F0aW9uKCkgOiBudWxsOwotCQlTdHJpbmcgZG9jcm9vdCA9IG51bGw7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJSVBhdGggY29udGFpbmVyTG9jYXRpb24gPSBjb250YWluZXIuZ2V0TG9jYXRpb24oKTsKLQkJCWlmIChjb250YWluZXJMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJZG9jcm9vdCA9IGNvbnRhaW5lckxvY2F0aW9uLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjb250YWluZXIuZ2V0TG9jYXRpb25VUkkoKSAhPSBudWxsKSB7Ci0JCQkJZG9jcm9vdCA9IGNvbnRhaW5lci5nZXRMb2NhdGlvblVSSSgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGRvY3Jvb3QgPT0gbnVsbCkgewotCQkJZG9jcm9vdCA9IGJhc2VNb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJfQotCQlpZiAoZG9jcm9vdCA9PSBudWxsKSB7Ci0JCQkvLyBzaG91bGQgbm90IGJlCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIG9idGFpbiBkb2N1bWVudCB1cmwKLQkJU3RyaW5nIG1vZGVsQmFzZUxvY2F0aW9uID0gYmFzZU1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQlpZiAoKG1vZGVsQmFzZUxvY2F0aW9uID09IG51bGwpIHx8IChtb2RlbEJhc2VMb2NhdGlvbi5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gZmFsbGJhY2suLi4KLQkJCW1vZGVsQmFzZUxvY2F0aW9uID0gYmFzZU1vZGVsLmdldElkKCk7Ci0JCX0KLQkJaWYgKChtb2RlbEJhc2VMb2NhdGlvbiA9PSBudWxsKSB8fCAobW9kZWxCYXNlTG9jYXRpb24ubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGkgY2FuJ3QgcmVzb2x2ZSB1cmkgIQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyByZXNvbHZlIHVybAotCQlVUkxIZWxwZXIgaGVscGVyID0gbmV3IFVSTEhlbHBlcihQYXRoSGVscGVyLmdldENvbnRhaW5pbmdGb2xkZXJQYXRoKG1vZGVsQmFzZUxvY2F0aW9uKSwgUGF0aEhlbHBlci5nZXRDb250YWluaW5nRm9sZGVyUGF0aChQYXRoSGVscGVyLmFwcGVuZFRyYWlsaW5nVVJMU2xhc2goZG9jcm9vdCkpKTsKLQkJcmV0dXJuIGhlbHBlci50b0Fic29sdXRlKHJlZik7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkSFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGNkZDBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTZWxlY3RvckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzcy5IVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzcy5TdHlsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZEhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja1RhZ1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5KU1BDYXBhYmxlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Nb2RlbFBhcnNlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEVtYmVkZGVkSFRNTCBpbXBsZW1lbnRzIEVtYmVkZGVkVHlwZUhhbmRsZXIgewotCi0JcHVibGljIFN0cmluZyBDb250ZW50VHlwZUlEX0VtYmVkZGVkSFRNTCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVtYmVkZGVkSFRNTCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIExpc3Qgc3VwcG9ydGVkTWltZVR5cGVzOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEVtYmVkZGVkSFRNTC4KLQkgKi8KLQlwdWJsaWMgRW1iZWRkZWRIVE1MKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBhZGQgdGFnIG5hbWVzIHVzaW5nIEJsb2NrTWFya2VyIG9iamVjdAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRIVE1MaXNoVGFnKEJsb2NrVGFnUGFyc2VyIHBhcnNlciwgU3RyaW5nIHRhZ25hbWUpIHsKLQkJQmxvY2tNYXJrZXIgYm0gPSBuZXcgQmxvY2tNYXJrZXIodGFnbmFtZSwgbnVsbCwgRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhULCBmYWxzZSk7Ci0JCXBhcnNlci5hZGRCbG9ja01hcmtlcihibSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBFbWJlZGRlZENvbnRlbnRUeXBlI2dldEZhbWlseUlkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZhbWlseUlkKCkgewotCQlyZXR1cm4gTW9kZWxIYW5kbGVyRm9ySFRNTC5Bc3NvY2lhdGVkQ29udGVudFR5cGVJRDsKLQl9Ci0KLQkvKgotCSAqIE9ubHkgIm1vZGVsIHNpZGUiIGVtYmVkZGVkIGZhY3RvcmllcyBjYW4gYmUgYWRkZWQgaGVyZS4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkgewotCQlMaXN0IGZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRIVE1MKCkpOwotCQkvLyBmYWN0b3JpZXMuYWRkQWxsKFBsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldEZhY3Rvcmllcyh0aGlzKSk7Ci0JCXJldHVybiBmYWN0b3JpZXM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVtYmVkZGVkQ29udGVudFR5cGUjaW5pdGlhbGl6ZVBhcnNlcihSZWdpb25QYXJzZXIpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhcnNlcihKU1BDYXBhYmxlUGFyc2VyIHBhcnNlcikgewotCQlhZGRIVE1MaXNoVGFnKHBhcnNlciwgInNjcmlwdCIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEhUTUxpc2hUYWcocGFyc2VyLCAic3R5bGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBMaXN0IGdldFN1cHBvcnRlZE1pbWVUeXBlcygpIHsKLQkJaWYgKHN1cHBvcnRlZE1pbWVUeXBlcyA9PSBudWxsKSB7Ci0JCQlzdXBwb3J0ZWRNaW1lVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzdXBwb3J0ZWRNaW1lVHlwZXMuYWRkKCJ0ZXh0L2h0bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3VwcG9ydGVkTWltZVR5cGVzLmFkZCgidGV4dC94aHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCQlzdXBwb3J0ZWRNaW1lVHlwZXMuYWRkKCJhcHBsaWNhdGlvbi94aHRtbCt4bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3VwcG9ydGVkTWltZVR5cGVzLmFkZCgidGV4dC92bmQud2FwLndtbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHN1cHBvcnRlZE1pbWVUeXBlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KEZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKHJlZ2lzdHJ5KTsKLQotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlpZiAoIXJlZ2lzdHJ5LmNvbnRhaW5zKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpKSB7Ci0JCQlmYWN0b3J5ID0gbmV3IEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeSgpOwotCQkJcmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCQlpZiAoIXJlZ2lzdHJ5LmNvbnRhaW5zKE1vZGVsUGFyc2VyQWRhcHRlci5jbGFzcykpIHsKLQkJCWZhY3RvcnkgPSBIVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQkJcmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCQlpZiAoIXJlZ2lzdHJ5LmNvbnRhaW5zKElTdHlsZVNlbGVjdG9yQWRhcHRlci5jbGFzcykpIHsKLQotCQkJZmFjdG9yeSA9IEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJCXJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQkJaWYgKCFyZWdpc3RyeS5jb250YWlucyhJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpKSB7Ci0KLQkJCWZhY3RvcnkgPSBTdHlsZUFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCQlyZWdpc3RyeS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkoRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCUFzc2VydC5pc05vdE51bGwocmVnaXN0cnkpOwotCi0JCS8vIElTU1VFOiBzaG91bGQgdGhlc2UgZmFjdG9yaWVzIGJlIHJlbGVhc2VkPyBPciBqdXN0IAotCQkvLyByZW1vdmVkIGZyb20gdGhpcyByZWdpc3RyeSwgYmVjYXVzZSB3ZSBhcmUgZ2V0dGluZyByZWFkeSB0bwotCQkvLyByZS1hZGQgdGhlbT8KLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJaWYgKCFyZWdpc3RyeS5jb250YWlucyhEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKSkgewotCQkJZmFjdG9yeSA9IHJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCQlmYWN0b3J5LnJlbGVhc2UoKTsKLQkJCXJlZ2lzdHJ5LnJlbW92ZUZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQkJaWYgKCFyZWdpc3RyeS5jb250YWlucyhNb2RlbFBhcnNlckFkYXB0ZXIuY2xhc3MpKSB7Ci0JCQlmYWN0b3J5ID0gcmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihNb2RlbFBhcnNlckFkYXB0ZXIuY2xhc3MpOwotCQkJZmFjdG9yeS5yZWxlYXNlKCk7Ci0JCQlyZWdpc3RyeS5yZW1vdmVGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0JCWlmICghcmVnaXN0cnkuY29udGFpbnMoSVN0eWxlU2VsZWN0b3JBZGFwdGVyLmNsYXNzKSkgewotCQkJZmFjdG9yeSA9IHJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoSVN0eWxlU2VsZWN0b3JBZGFwdGVyLmNsYXNzKTsKLQkJCWZhY3RvcnkucmVsZWFzZSgpOwotCQkJcmVnaXN0cnkucmVtb3ZlRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCQlpZiAoIXJlZ2lzdHJ5LmNvbnRhaW5zKElTdHlsZVNoZWV0QWRhcHRlci5jbGFzcykpIHsKLQkJCWZhY3RvcnkgPSByZWdpc3RyeS5nZXRGYWN0b3J5Rm9yKElTdHlsZVNoZWV0QWRhcHRlci5jbGFzcyk7Ci0JCQlmYWN0b3J5LnJlbGVhc2UoKTsKLQkJCXJlZ2lzdHJ5LnJlbW92ZUZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHVuaW5pdGlhbGl6ZVBhcnNlcihKU1BDYXBhYmxlUGFyc2VyIHBhcnNlcikgewotCQkvLyBJJ20gYXNzdW1pbmcgYmxvY2sgbWFya2VycyBhcmUgdW5pcXVlIGJhc2VkIG9uIG5hbWUgb25seQotCQkvLyB3ZSBhZGQgdGhlc2UgYXMgZnVsbCBCbG9ja01hcmtlcnMsIGJ1dCByZW1vdmUgYmFzZWQgb24gbmFtZSBhbG9uZS4KLQkJcGFyc2VyLnJlbW92ZUJsb2NrTWFya2VyKCJzY3JpcHQiKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIucmVtb3ZlQmxvY2tNYXJrZXIoInNjcmlwdCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgRW1iZWRkZWRIVE1MKCk7Ci0JfQotCi0JLyoqCi0JICogd2lsbCBzb21lZGF5IGJlIGNvbnRyb2xsZWQgdmlhIGV4dGVuc2lvbiBwb2ludAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7Ci0JCXJldHVybiBnZXRTdXBwb3J0ZWRNaW1lVHlwZXMoKS5jb250YWlucyhtaW1lVHlwZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY5YmFkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSFRNTERvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSFRNTERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSFRNTE1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5BYnN0cmFjdE1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci0KLXB1YmxpYyBjbGFzcyBNb2RlbEhhbmRsZXJGb3JIVE1MIGV4dGVuZHMgQWJzdHJhY3RNb2RlbEhhbmRsZXIgaW1wbGVtZW50cyBJTW9kZWxIYW5kbGVyIHsKLQkvKiogCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gCi0JICogSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuIGF0IHJ1biB0aW1lIHdpdGggCi0JICogd2hhdCdzIGluIHJlZ2lzdHJ5ISAoc28gc2hvdWxkIG5ldmVyIGJlICdmaW5hbCcpCi0JICovCi0Jc3RhdGljIFN0cmluZyBBc3NvY2lhdGVkQ29udGVudFR5cGVJRCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gCi0JICogSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuIGF0IHJ1biB0aW1lIHdpdGggCi0JICogd2hhdCdzIGluIHJlZ2lzdHJ5ISAoc28gc2hvdWxkIG5ldmVyIGJlICdmaW5hbCcpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1vZGVsSGFuZGxlcklEX0hUTUwgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5tb2RlbGhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0KLQotCXB1YmxpYyBNb2RlbEhhbmRsZXJGb3JIVE1MKCkgewotCQlzdXBlcigpOwotCQlzZXRJZChNb2RlbEhhbmRsZXJJRF9IVE1MKTsKLQkJc2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQpOwotCX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgZ2V0TW9kZWxMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgSFRNTE1vZGVsTG9hZGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlyZXR1cm4gbmV3IEhUTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgSFRNTERvY3VtZW50TG9hZGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uQnVkZHlTeXN0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNQXR0cmlidXRlRGVjbGFyYXRpb25CdWRkeVN5c3RlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGI2MDBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNQXR0cmlidXRlRGVjbGFyYXRpb25CdWRkeVN5c3RlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICovCi1jbGFzcyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uQnVkZHlTeXN0ZW0gZXh0ZW5kcyBDTU5vZGVCdWRkeVN5c3RlbSBpbXBsZW1lbnRzIENNQXR0cmlidXRlRGVjbGFyYXRpb24gewotCi0KLQlwdWJsaWMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtKENNQXR0cmlidXRlRGVjbGFyYXRpb24gc2VsZiwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBidWRkeSwgYm9vbGVhbiBpc1hIVE1MKSB7Ci0JCXN1cGVyKHNlbGYsIGJ1ZGR5LCBpc1hIVE1MKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiNnZXRBdHRyTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyTmFtZSgpIHsKLQkJcmV0dXJuIGdldFNlbGYoKS5nZXRBdHRyTmFtZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uI2dldEF0dHJUeXBlKCkKLQkgKi8KLQlwdWJsaWMgQ01EYXRhVHlwZSBnZXRBdHRyVHlwZSgpIHsKLQkJcmV0dXJuIGdldFNlbGYoKS5nZXRBdHRyVHlwZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uI2dldERlZmF1bHRWYWx1ZSgpCi0JICogQGRlcHJlY2F0ZWQgaW4gc3VwZXJjbGFzcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gZ2V0U2VsZigpLmdldERlZmF1bHRWYWx1ZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uI2dldEVudW1BdHRyKCkKLQkgKiBAZGVwcmVjYXRlZCBpbiBzdXBlcmNsYXNzCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIGdldEVudW1BdHRyKCkgewotCQlyZXR1cm4gZ2V0U2VsZigpLmdldEVudW1BdHRyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNQXR0cmlidXRlRGVjbGFyYXRpb24jZ2V0VXNhZ2UoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VXNhZ2UoKSB7Ci0JCXJldHVybiBnZXRTZWxmKCkuZ2V0VXNhZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0U2VsZigpIHsKLQkJcmV0dXJuIChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBzZWxmOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRGb3JCdWRkeVN5c3RlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01Eb2N1bWVudEZvckJ1ZGR5U3lzdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MTBlYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01Eb2N1bWVudEZvckJ1ZGR5U3lzdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5zc2kuU1NJQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Eb2NUeXBlOwotCi0vKioKLSAqLwotY2xhc3MgQ01Eb2N1bWVudEZvckJ1ZGR5U3lzdGVtIGV4dGVuZHMgQ01Ob2RlQnVkZHlTeXN0ZW0gaW1wbGVtZW50cyBDTURvY3VtZW50IHsKLQotCi0JcHJpdmF0ZSBzdGF0aWMgQ01Eb2N1bWVudCBnZXRIVE1MQ01Eb2N1bWVudCgpIHsKLQkJcmV0dXJuIEhUTUxDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KENNRG9jVHlwZS5IVE1MX0RPQ19UWVBFKTsKLQl9Ci0KLQljbGFzcyBFbGVtZW50cyBleHRlbmRzIENNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0gewotCQlwdWJsaWMgRWxlbWVudHMoQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMsIGJvb2xlYW4gaXNYSFRNTCkgewotCQkJc3VwZXIoaXNYSFRNTCk7Ci0JCQltYWtlQnVkZHlTeXN0ZW0oZWxlbWVudHMpOwotCQkJYWRkU1NJRGVjbHMoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5TmFtZShDTU5vZGUgb3JpZ2luYWwpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsID0gZ2V0RGVjbChvcmlnaW5hbCk7Ci0JCQlpZiAoZWRlY2wgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBlZGVjbC5nZXRFbGVtZW50TmFtZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIENNTm9kZSBjcmVhdGVCdWRkeVN5c3RlbShDTU5vZGUgb3JpZ2luYWwpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsID0gZ2V0RGVjbChvcmlnaW5hbCk7Ci0JCQlyZXR1cm4gbmV3IENNRWxlbWVudERlY2xhcmF0aW9uQnVkZHlTeXN0ZW0oZWRlY2wsIGlzWEhUTUwoKSk7Ci0JCX0KLQotCQlwcml2YXRlIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlY2woQ01Ob2RlIGNtbm9kZSkgewotCQkJaWYgKGNtbm9kZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpICE9IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIChDTUVsZW1lbnREZWNsYXJhdGlvbikgY21ub2RlOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGFkZFNTSURlY2xzKCkgewotCQkJQ01Eb2N1bWVudCBzc2kgPSBTU0lDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KCk7Ci0JCQlpZiAoc3NpID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMgPSBzc2kuZ2V0RWxlbWVudHMoKTsKLQkJCUl0ZXJhdG9yIGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgaS5uZXh0KCk7Ci0JCQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJcHV0KGRlY2wuZ2V0RWxlbWVudE5hbWUoKSwgZGVjbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEVsZW1lbnRzIGVsZW1lbnRzID0gbnVsbDsKLQotCXB1YmxpYyBDTURvY3VtZW50Rm9yQnVkZHlTeXN0ZW0oQ01Eb2N1bWVudCBzZWxmLCBib29sZWFuIGlzWEhUTUwpIHsKLQkJc3VwZXIoc2VsZiwgZ2V0SFRNTENNRG9jdW1lbnQoKSwgaXNYSFRNTCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNRG9jdW1lbnQjZ2V0RWxlbWVudHMoKQotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpIHsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwpCi0JCQlyZXR1cm4gZWxlbWVudHM7Ci0JCUNNRG9jdW1lbnQgY21kb2MgPSBnZXRTZWxmKCk7Ci0JCWlmIChjbWRvYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsZW1lbnRzID0gbmV3IEVsZW1lbnRzKGNtZG9jLmdldEVsZW1lbnRzKCksIGlzWEhUTUwpOwotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNRG9jdW1lbnQjZ2V0RW50aXRpZXMoKQotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpIHsKLQkJQ01Eb2N1bWVudCBjbWRvYyA9IGdldFNlbGYoKTsKLQkJaWYgKGNtZG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGNtZG9jLmdldEVudGl0aWVzKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNRG9jdW1lbnQjZ2V0TmFtZXNwYWNlKCkKLQkgKi8KLQlwdWJsaWMgQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkgewotCQlDTURvY3VtZW50IGNtZG9jID0gZ2V0U2VsZigpOwotCQlpZiAoY21kb2MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gY21kb2MuZ2V0TmFtZXNwYWNlKCk7Ci0JfQotCi0JcHJpdmF0ZSBDTURvY3VtZW50IGdldFNlbGYoKSB7Ci0JCWlmIChzZWxmLmdldE5vZGVUeXBlKCkgIT0gQ01Ob2RlLkRPQ1VNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01Eb2N1bWVudCkgc2VsZjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTUVsZW1lbnREZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTUVsZW1lbnREZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MzRkYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01FbGVtZW50RGVjbGFyYXRpb25CdWRkeVN5c3RlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Eb2NUeXBlOwotCi0vKioKLSAqLwotY2xhc3MgQ01FbGVtZW50RGVjbGFyYXRpb25CdWRkeVN5c3RlbSBleHRlbmRzIENNTm9kZUJ1ZGR5U3lzdGVtIGltcGxlbWVudHMgQ01FbGVtZW50RGVjbGFyYXRpb24gewotCi0KLQlwcml2YXRlIHN0YXRpYyBDTURvY3VtZW50IGh0bWxjbSA9IEhUTUxDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KENNRG9jVHlwZS5IVE1MX0RPQ19UWVBFKTsKLQotCXByaXZhdGUgc3RhdGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldEhUTUxDTUVsZW1EZWNsKENNRWxlbWVudERlY2xhcmF0aW9uIG9yaWdpbmFsKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGJ1ZGR5ID0gbnVsbDsKLQkJaWYgKGh0bWxjbSAhPSBudWxsKSB7Ci0JCQlDTU5hbWVkTm9kZU1hcCBlbGVtcyA9IGh0bWxjbS5nZXRFbGVtZW50cygpOwotCQkJaWYgKGVsZW1zICE9IG51bGwpIHsKLQkJCQlidWRkeSA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgZWxlbXMuZ2V0TmFtZWRJdGVtKG9yaWdpbmFsLmdldEVsZW1lbnROYW1lKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWRkeTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEF0dHJzIGV4dGVuZHMgQ01OYW1lZE5vZGVNYXBGb3JCdWRkeVN5c3RlbSB7Ci0JCXByaXZhdGUgQ01OYW1lZE5vZGVNYXAgYnVkZHlBdHRycyA9IG51bGw7Ci0KLQkJcHVibGljIEF0dHJzKENNTmFtZWROb2RlTWFwIGF0dHJzLCBDTU5hbWVkTm9kZU1hcCBidWRkeUF0dHJzLCBib29sZWFuIGlzWEhUTUwpIHsKLQkJCXN1cGVyKGlzWEhUTUwpOwotCQkJdGhpcy5idWRkeUF0dHJzID0gYnVkZHlBdHRyczsKLQkJCW1ha2VCdWRkeVN5c3RlbShhdHRycyk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEtleU5hbWUoQ01Ob2RlIG9yaWdpbmFsKSB7Ci0JCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkZWNsID0gZ2V0RGVjbChvcmlnaW5hbCk7Ci0JCQlpZiAoYWRlY2wgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBhZGVjbC5nZXRBdHRyTmFtZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIENNTm9kZSBjcmVhdGVCdWRkeVN5c3RlbShDTU5vZGUgb3JpZ2luYWwpIHsKLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYWRlY2wgPSBnZXREZWNsKG9yaWdpbmFsKTsKLQkJCWlmIChhZGVjbCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBidWRkeSA9IG51bGw7Ci0JCQlpZiAoYnVkZHlBdHRycyAhPSBudWxsKSB7Ci0JCQkJYnVkZHkgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYnVkZHlBdHRycy5nZXROYW1lZEl0ZW0oYWRlY2wuZ2V0QXR0ck5hbWUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IENNQXR0cmlidXRlRGVjbGFyYXRpb25CdWRkeVN5c3RlbShhZGVjbCwgYnVkZHksIGlzWEhUTUwoKSk7Ci0JCX0KLQotCQlwcml2YXRlIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0RGVjbChDTU5vZGUgY21ub2RlKSB7Ci0JCQlpZiAoY21ub2RlID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgIT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgY21ub2RlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBBdHRycyBhdHRyaWJ1dGVzID0gbnVsbDsKLQotCXB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtKENNRWxlbWVudERlY2xhcmF0aW9uIHNlbGYsIGJvb2xlYW4gaXNYSFRNTCkgewotCQlzdXBlcihzZWxmLCBnZXRIVE1MQ01FbGVtRGVjbChzZWxmKSwgaXNYSFRNTCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNRWxlbWVudERlY2xhcmF0aW9uI2dldEF0dHJpYnV0ZXMoKQotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsID0gZ2V0U2VsZigpOwotCQlpZiAoZWRlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBodG1sRGVjbCA9IGdldEJ1ZGR5KCk7Ci0JCUNNTmFtZWROb2RlTWFwIGh0bWxBdHRycyA9IChodG1sRGVjbCA9PSBudWxsKSA/IG51bGwgOiBodG1sRGVjbC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWF0dHJpYnV0ZXMgPSBuZXcgQXR0cnMoZWRlY2wuZ2V0QXR0cmlidXRlcygpLCBodG1sQXR0cnMsIGlzWEhUTUwpOwotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01FbGVtZW50RGVjbGFyYXRpb24jZ2V0Q29udGVudCgpCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCA9IGdldFNlbGYoKTsKLQkJaWYgKGVkZWNsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGVkZWNsLmdldENvbnRlbnQoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01FbGVtZW50RGVjbGFyYXRpb24jZ2V0Q29udGVudFR5cGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsID0gZ2V0U2VsZigpOwotCQlpZiAoZWRlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlk7Ci0JCXJldHVybiBlZGVjbC5nZXRDb250ZW50VHlwZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUVsZW1lbnREZWNsYXJhdGlvbiNnZXRFbGVtZW50TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBlZGVjbC5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUVsZW1lbnREZWNsYXJhdGlvbiNnZXREYXRhVHlwZSgpCi0JICovCi0JcHVibGljIENNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsID0gZ2V0U2VsZigpOwotCQlpZiAoZWRlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZWRlY2wuZ2V0RGF0YVR5cGUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01FbGVtZW50RGVjbGFyYXRpb24jZ2V0TG9jYWxFbGVtZW50cygpCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsID0gZ2V0U2VsZigpOwotCQlpZiAoZWRlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZWRlY2wuZ2V0TG9jYWxFbGVtZW50cygpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUNvbnRlbnQjZ2V0TWF4T2NjdXIoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsID0gZ2V0U2VsZigpOwotCQlpZiAoZWRlY2wgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJcmV0dXJuIGVkZWNsLmdldE1heE9jY3VyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNQ29udGVudCNnZXRNaW5PY2N1cigpCi0JICovCi0JcHVibGljIGludCBnZXRNaW5PY2N1cigpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlyZXR1cm4gZWRlY2wuZ2V0TWluT2NjdXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01Ob2RlI3N1cHBvcnRzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChpc1hIVE1MICYmIHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBzdXBlci5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTU5vZGUjZ2V0UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoaXNYSFRNTCAmJiBwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuT01JVF9UWVBFKSkKLQkJCXJldHVybiBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX05PTkU7Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXByaXZhdGUgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0U2VsZigpIHsKLQkJaWYgKHNlbGYuZ2V0Tm9kZVR5cGUoKSAhPSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKENNRWxlbWVudERlY2xhcmF0aW9uKSBzZWxmOwotCX0KLQotCXByaXZhdGUgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0QnVkZHkoKSB7Ci0JCWlmIChidWRkeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChidWRkeS5nZXROb2RlVHlwZSgpICE9IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGJ1ZGR5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI1ODRiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTU5hbWVkTm9kZU1hcEZvckJ1ZGR5U3lzdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICovCi1hYnN0cmFjdCBjbGFzcyBDTU5hbWVkTm9kZU1hcEZvckJ1ZGR5U3lzdGVtIGltcGxlbWVudHMgQ01OYW1lZE5vZGVNYXAgewotCi0KLQlwcml2YXRlIGJvb2xlYW4gaXNYSFRNTCA9IGZhbHNlOwotCXByaXZhdGUgSGFzaHRhYmxlIG1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIG9mIENNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0uCi0JICogQ0FVVElPTjogRWFjaCBkZXJpdmVkIGNsYXNzIG11c3QgY2FsbCAnbWFrZUJ1ZGR5U3lzdGVtJyBtZXRob2QgaW4gaXRzCi0JICogY29uc3RydWN0b3IgdG8gYnVpbGQgdXAgaXRzIGNvbnRlbnRzLgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcEZvckJ1ZGR5U3lzdGVtKGJvb2xlYW4gaXNYSFRNTCkgewotCQlzdXBlcigpOwotCQl0aGlzLmlzWEhUTUwgPSBpc1hIVE1MOwotCX0KLQotCS8qCi0JICogQHNlZSBDTU5hbWVkTm9kZU1hcCNnZXRMZW5ndGgoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gbWFwLnNpemUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01OYW1lZE5vZGVNYXAjZ2V0TmFtZWRJdGVtKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcga2V5ID0gY2Fub25pY2FsTmFtZShuYW1lKTsKLQkJaWYgKCFtYXAuY29udGFpbnNLZXkoa2V5KSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKENNTm9kZSkgbWFwLmdldChrZXkpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTU5hbWVkTm9kZU1hcCNpdGVtKGludCkKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBub2RlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoLS1pbmRleCA8IDApCi0JCQkJcmV0dXJuIChDTU5vZGUpIG5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTmFtZWROb2RlTWFwI2l0ZXJhdG9yKCkKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBtYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKiBwYWNrYWdlIHNjb3BlLiAqLwotCXZvaWQgcHV0KFN0cmluZyBuYW1lLCBDTU5vZGUgY21ub2RlKSB7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgY21ub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1hcC5wdXQoY2Fub25pY2FsTmFtZShuYW1lKSwgY21ub2RlKTsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nIGdldEtleU5hbWUoQ01Ob2RlIG9yaWdpbmFsKTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBDTU5vZGUgY3JlYXRlQnVkZHlTeXN0ZW0oQ01Ob2RlIG9yaWdpbmFsKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzWEhUTUwoKSB7Ci0JCXJldHVybiBpc1hIVE1MOwotCX0KLQotCS8qKgotCSAqIEVhY2ggZGVyaXZlZCBjbGFzcyBtdXN0IGNhbGwgdGhpcyBtZXRob2QgaW4gaXRzIGNvbnN0cnVjdG9yCi0JICogdG8gYnVpbGQgdXAgaXRzIGNvbnRlbnRzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1ha2VCdWRkeVN5c3RlbShDTU5hbWVkTm9kZU1hcCBvcmlnaW5hbCkgewotCQlJdGVyYXRvciBpID0gb3JpZ2luYWwuaXRlcmF0b3IoKTsKLQkJaWYgKGkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDTU5vZGUgb3JnID0gKENNTm9kZSkgaS5uZXh0KCk7Ci0JCQlTdHJpbmcga2V5ID0gZ2V0S2V5TmFtZShvcmcpOwotCQkJQ01Ob2RlIG5ld05vZGUgPSBjcmVhdGVCdWRkeVN5c3RlbShvcmcpOwotCQkJcHV0KGtleSwgbmV3Tm9kZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBjYW5vbmljYWxOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcxOTE4Ci0JCS8vIHdlIGFyZSBhYmxlIHRvICJjaGVhdCIgaGVyZSBhIGxpdHRsZSBhbmQgdXNlIFVTIExvY2FsZQotCQkvLyB0byBnZXQgYSBnb29kIGNhbm9uaWNhbCBmb3JtLCBzaW5jZSB3ZSBhcmUgdXNpbmcgdGhpcyBvbmx5Ci0JCS8vIGZvciBIVE1MIGFuZCBKU1Agc3RhbmRhcmQgdGFncy4KLQkJLy8gTG9uZyB0ZXJtLCBmb3Igc2ltaWxhciBuZWVkcyB3aXRoIFhNTCAxLjEgKGZvciBleGFtcGxlKQotCQkvLyB3ZSBzaG91bGQgdXNlIGEgY2xhc3Mgc3VjaCBhcyBjb20uaWJtLmljdS50ZXh0Lk5vcm1hbGl6ZXIKLQkJcmV0dXJuIG5hbWUudG9VcHBlckNhc2UoTG9jYWxlLlVTKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTU5vZGVCdWRkeVN5c3RlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01Ob2RlQnVkZHlTeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4MmY5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTU5vZGVCdWRkeVN5c3RlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKi8KLWNsYXNzIENNTm9kZUJ1ZGR5U3lzdGVtIGltcGxlbWVudHMgQ01Ob2RlIHsKLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNYSFRNTCA9IGZhbHNlOwotCXByb3RlY3RlZCBDTU5vZGUgc2VsZiA9IG51bGw7Ci0JcHJvdGVjdGVkIENNTm9kZSBidWRkeSA9IG51bGw7Ci0KLQlwdWJsaWMgQ01Ob2RlQnVkZHlTeXN0ZW0oQ01Ob2RlIHNlbGYsIENNTm9kZSBidWRkeSwgYm9vbGVhbiBpc1hIVE1MKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc2VsZiA9IHNlbGY7Ci0JCXRoaXMuYnVkZHkgPSBidWRkeTsKLQkJdGhpcy5pc1hIVE1MID0gaXNYSFRNTDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01Ob2RlI2dldE5vZGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gc2VsZi5nZXROb2RlTmFtZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTU5vZGUjZ2V0Tm9kZVR5cGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBzZWxmLmdldE5vZGVUeXBlKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTm9kZSNzdXBwb3J0cyhTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19YSFRNTCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGJ1ZGR5ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBidWRkeS5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTU5vZGUjZ2V0UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbighaXNYSFRNTCk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19YSFRNTCkpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihpc1hIVE1MKTsKLQkJfQotCi0JCWlmIChidWRkeSA9PSBudWxsIHx8ICghYnVkZHkuc3VwcG9ydHMocHJvcGVydHlOYW1lKSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGJ1ZGR5LmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvRG9jdW1lbnRRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvRG9jdW1lbnRRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDgwMmQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0RvY3VtZW50UXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5yYW5nZXMuUmFuZ2U7Ci0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50UXVlcnkgewotCi0JLyoqCi0JICogaXNSZW5kZXJSb290KCkgcmV0dXJucyB0cnVlIGlmIC0gbm9kZSBpcyBCT0RZIGVsZW1lbnQgKGJvdGggZXhwbGljaXQKLQkgKiBhbmQgaW1wbGljaXQpIC0gbm9kZSBpcyBwb3J0YWxodG1sOmJvZHkgZWxlbWVudCAtIG5vZGUgaXMgRG9jdW1lbnQgbm9kZQotCSAqIGFuZCB0aGUgZG9jdW1lbnQgaXMgdHJlYXRlZCBhcyBmcmFnbWVudCAod2l0aCBCT0RZIGNvbnRleHQpIE5vdGUgdGhhdAotCSAqIGluIGVkaXRpbmcgYSBmcmFnbWVudCBmaWxlLCBEb2N1bWVudCBub2RlIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEKLQkgKiBzdWJzdGl0dXRlIG9mIEJPRFkgZWxlbWVudC4KLQkgKi8KLQlib29sZWFuIGlzUmVuZGVyUm9vdChOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogaXNIZWFkQ29ycmVzcG9uZGVudCgpIHJldHVybnMgdHJ1ZSBpZiAtIG5vZGUgaXMgSEVBRCBlbGVtZW50IChib3RoCi0JICogZXhwbGljaXQgYW5kIGltcGxpY2l0KSAtIG5vZGUgaXMgcG9ydGFsaHRtbDpoZWFkIGVsZW1lbnQgLSBub2RlIGlzCi0JICogRG9jdW1lbnQgbm9kZSBhbmQgdGhlIGRvY3VtZW50IGlzIHRyZWF0ZWQgYXMgZnJhZ21lbnQgKHdpdGggSEVBRAotCSAqIGNvbnRleHQpIE5vdGUgdGhhdCBpbiBlZGl0aW5nIGEgZnJhZ21lbnQgZmlsZSAod2l0aCBIRUFEIGNvbnRleHQpLAotCSAqIERvY3VtZW50IG5vZGUgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBzdWJzdGl0dXRlIG9mIEhFQUQgZWxlbWVudC4KLQkgKi8KLQlib29sZWFuIGlzSGVhZENvcnJlc3BvbmRlbnQoTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIEltcGxpY2l0IEJPRFkgZWxlbWVudCB3aWxsIGJlIGdvbmUgaW4gVjYgU0VEIG1vZGVsLiBTbyBwYWdlIGRlc2lnbmVyCi0JICogcHJvdmlkZXMgYW4gQVBJIHRvIGdldCBhIHJhbmdlIHdob3NlIGNvbnRlbnQgbm9kZXMgYXJlIHJlbmRlcmVkIGluCi0JICogZGVzaWduIHZpZXcuIGdldFJlbmRlclJvb3RSYW5nZSgpIHJldHVybnMgLSBhIHJhbmdlIGZyb20gQk9EWSdzIGZpcnN0Ci0JICogdG8gaXRzIGxhc3QgKGlmIHRoZSBkb2N1bWVudCBoYXMgQk9EWSBlbGVtZW50KSAtIGEgcmFuZ2UgZm9ybQotCSAqIERvY3VtZW50J3MgZmlyc3QgdG8gaXRzIGxhc3QgKGlmIHRoZSBkb2N1bWVudCBpcyBmcmFnbWVudCB3aXRoIEJPRFkKLQkgKiBjb250ZXh0KSAtIG51bGwgKGlmIHRoZSBkb2N1bWVudCBpcyBmcmFnbWVudCB3aXRoIEhFQUQgY29udGV4dCkgW1RoZQotCSAqIGZvbGxvd2luZyBjYXNlcyB3aWxsIGJlIHN1cHBvcnRlZCBzaW5jZSBWNl0gLSBhIHJhbmdlIGZyb20gYSBjdXN0b20KLQkgKiB0YWcncyBmaXJzdCB0byBpdHMgbGFzdCAoaWYgdGhlIGRvY3VtZW50IGhhcyBhIGN1c3RvbSB0YWcgd2hpY2gKLQkgKiBnZW5lcmF0ZXMgQk9EWSBlbGVtZW50IGF0IHJ1bnRpbWUpIC0gYSByYW5nZSBmcm9tIERvY3VtZW50J3MKLQkgKiBhcHByb3BpcmF0ZSBvZmZzZXQgdG8gaXRzIGxhc3QgKGlmIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBoYXZlIGV4cGxpY2l0Ci0JICogQk9EWS9IVE1MKSAtIGEgcmFuZ2UgZnJvbSBIVE1MIGVsZW1lbnQncyBhcHByb3ByaWF0ZSBvZmZzZXQgdG8gaXRzIGxhc3QKLQkgKiAoaWYgdGhlIGRvY3VtZW50IGRvZXMgbm90IGhhdmUgZXhwbGljaXQgQk9EWSBidXQgaGF2ZSBleHBsaWNpdCBIVE1MKQotCSAqIAotCSAqIEBwYXJhbSBkb2MKLQkgKiBAcmV0dXJuCi0JICovCi0JUmFuZ2UgZ2V0UmVuZGVyUm9vdFJhbmdlKERvY3VtZW50IGRvYyk7Ci0KLQkvKioKLQkgKiBJbXBsaWNpdCBIRUFEIGVsZW1lbnQgd2lsbCBiZSBnb25lIGluIFY2IFNFRCBtb2RlbC4gU28gcGFnZSBkZXNpZ25lcgotCSAqIHByb3ZpZGVzIGFuIEFQSSB0byBnZXQgYSByYW5nZSB3aG9zZSBjb250ZW50IG5vZGVzIGFyZSB0cmVhdGVkIGFzIEhFQUQKLQkgKiBlbGVtZW50J3MgY2hpbGQuIGdldEhlYWRDb3JyZXNwb25kZW50UmFuZ2UoKSByZXR1cm5zIC0gYSByYW5nZSBmcm9tCi0JICogSEVBRCdzIGZpcnN0IHRvIGl0cyBsYXN0IChpZiB0aGUgZG9jdW1lbnQgaGFzIEhFQUQgZWxlbWVudCkgLSBhIHJhbmdlCi0JICogZm9ybSBEb2N1bWVudCdzIGZpcnN0IHRvIGl0cyBsYXN0IChpZiB0aGUgZG9jdW1lbnQgaXMgZnJhZ21lbnQgd2l0aAotCSAqIEhFQUQgY29udGV4dCkgLSBudWxsIChpZiB0aGUgZG9jdW1lbnQgaXMgZnJhZ21lbnQgd2l0aCBCT0RZIGNvbnRleHQpCi0JICogW1RoZSBmb2xsb3dpbmcgY2FzZXMgd2lsbCBiZSBzdXBwb3J0ZWQgc2luY2UgVjZdIC0gYSByYW5nZSBmcm9tIGEKLQkgKiBjdXN0b20gdGFnJ3MgZmlyc3QgdG8gaXRzIGxhc3QgKGlmIHRoZSBkb2N1bWVudCBoYXMgYSBjdXN0b20gdGFnIHdoaWNoCi0JICogZ2VuZXJhdGVzIEhFQUQgZWxlbWVudCBhdCBydW50aW1lKSAtIGEgcmFuZ2UgZnJvbSBEb2N1bWVudCdzIGZpcnN0IHRvCi0JICogYXBwcm9waXJhdGUgb2Zmc2V0IChpZiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgaGF2ZSBleHBsaWNpdCBIRUFEL0hUTUwpIC0KLQkgKiBhIHJhbmdlIGZyb20gSFRNTCBlbGVtZW50J3MgZmlyc3QgdG8gYXBwcm9wcmlhdGUgb2Zmc2V0IChpZiB0aGUKLQkgKiBkb2N1bWVudCBkb2VzIG5vdCBoYXZlIGV4cGxpY2l0IEhFQUQgYnV0IGhhdmUgZXhwbGljaXQgSFRNTCkKLQkgKiAKLQkgKiBAcGFyYW0gZG9jCi0JICogQHJldHVybgotCSAqLwotCVJhbmdlIGdldEhlYWRDb3JyZXNwb25kZW50UmFuZ2UoRG9jdW1lbnQgZG9jKTsKLQotCS8qKgotCSAqIGdldFJlbmRlclJvb3ROb2RlKCkgd2l0aCBbY3JlYXRlPWZhbHNlXSByZXR1cm5zIC0gQk9EWSBlbGVtZW50IGlmIHRoaXMKLQkgKiBkb2N1bWVudCBpcyBub3QgZnJhZ21lbnQgYW5kIGhhcyBCT0RZIGVsZW1lbnQgLSBudWxsIGlmIHRoaXMgZG9jdW1lbnQKLQkgKiBpcyBub3QgZnJhZ21lbnQgYW5kIGRvZXMgbm90IGhhdmUgQk9EWSBlbGVtZW50IC0gRG9jdW1lbnQgbm9kZSBpZiB0aGlzCi0JICogZG9jdW1lbnQgaXMgZnJhZ21lbnQgd2l0aCBCT0RZIGNvbnRleHQgLSBudWxsIGlmIHRoaXMgZG9jdW1lbnQgaXMKLQkgKiBmcmFnbWVudCB3aXRoIEhFQUQgY29udGV4dCBbVGhlIGZvbGxvd2luZyBjYXNlcyB3aWxsIGJlIHN1cHBvcnRlZCBzaW5jZQotCSAqIFY2XSAtIGEgY3VzdG9tIHRhZyB3aGljaCBnZW5lcmF0ZXMgQk9EWSB0YWcgYXQgcnVudGltZSAtIERvY3VtZW50IG5vZGUKLQkgKiBvciBIVE1MIGVsZW1lbnQgaWYgdGhpcyBkb2N1bWVudCBpcyBub3QgZnJhZ21lbnQgYnV0IGRvZXMgbm90IGhhdmUKLQkgKiBleHBsaWNpdCBCT0RZIGVsZW1lbnQgZ2V0UmVuZGVyUm9vdE5vZGUoKSB3aXRoIFtjcmVhdGU9dHJ1ZV0gcmV0dXJucyAtCi0JICogQk9EWSBlbGVtZW50IGlmIHRoaXMgZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGFuZCBoYXMgQk9EWSBlbGVtZW50IChubwotCSAqIG1vZGlmaWN0YXRpb24pIC0gbmV3bHkgY3JlYXRlZCBCT0RZIGVsZW1lbnQgaWYgdGhpcyBkb2N1bWVudCBpcyBub3QKLQkgKiBmcmFnbWVudCBidXQgZG9lcyBub3QgaGF2ZSBCT0RZIGVsZW1lbnQgLSBEb2N1bWVudCBub2RlIGlmIHRoaXMKLQkgKiBkb2N1bWVudCBpcyBmcmFnbWVudCB3aXRoIEJPRFkgY29udGV4dCAobm8gbW9kaWZpY3RhdGlvbikgW1RoZQotCSAqIGZvbGxvd2luZyBjYXNlcyB3aWxsIGJlIHN1cHBvcnRlZCBzaW5jZSBWNl0gLSBhIGN1c3RvbSB0YWcgd2hpY2gKLQkgKiBnZW5lcmF0ZXMgQk9EWSB0YWcgYXQgcnVudGltZSAobm8gbW9kaWZpY3RhdGlvbikgLSBuZXdseSBjcmVhdGVkIEJPRFkKLQkgKiBlbGVtZW50IGlmIHRoaXMgZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGJ1dCBkb2VzIG5vdCBoYXZlIGV4cGxpY2l0Ci0JICogQk9EWSBlbGVtZW50IGdldFJlbmRlclJvb3ROb2RlKCkgdGhyb3dzIEhUTUxDb21tYW5kRXhjZXB0aW9uIChzaW5jZSBWNikKLQkgKiBpZiAtIHRoaXMgZG9jdW1lbnQgaXMgZnJhZ21lbnQgd2l0aCBIRUFEIGNvbnRleHQgYW5kIC0gImNyZWF0ZSIKLQkgKiBwYXJhbWV0ZXIgaXMgdHJ1ZSBOb3RlIHRoYXQgaW4gZWRpdGluZyBhIGZyYWdtZW50IGZpbGUsIERvY3VtZW50IG5vZGUKLQkgKiBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIHN1YnN0aXR1dGUgb2YgQk9EWSBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBjaGlsZE9yRG9jdW1lbnQKLQkgKiBAcGFyYW0gY3JlYXRlCi0JICogQHJldHVybgotCSAqLwotCU5vZGUgZ2V0UmVuZGVyUm9vdE5vZGUoTm9kZSBjaGlsZE9yRG9jdW1lbnQsIGJvb2xlYW4gY3JlYXRlKTsKLQotCS8qKgotCSAqIGdldEhlYWRDb3JyZXNwb25kZW50Tm9kZSgpIHdpdGggW2NyZWF0ZT1mYWxzZV0gcmV0dXJucyAtIEhFQUQgZWxlbWVudAotCSAqIGlmIHRoaXMgZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGFuZCBoYXMgSEVBRCBlbGVtZW50IC0gbnVsbCBpZiB0aGlzCi0JICogZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGFuZCBkb2VzIG5vdCBoYXZlIEhFQUQgZWxlbWVudCAtIERvY3VtZW50IG5vZGUKLQkgKiBpZiB0aGlzIGRvY3VtZW50IGlzIGZyYWdtZW50IHdpdGggSEVBRCBjb250ZXh0IC0gbnVsbCBpZiB0aGlzIGRvY3VtZW50Ci0JICogaXMgZnJhZ21lbnQgd2l0aCBCT0RZIGNvbnRleHQgW1RoZSBmb2xsb3dpbmcgY2FzZXMgd2lsbCBiZSBzdXBwb3J0ZWQKLQkgKiBzaW5jZSBWNl0gLSBhIGN1c3RvbSB0YWcgd2hpY2ggZ2VuZXJhdGVzIEhFQUQgdGFnIGF0IHJ1bnRpbWUgLSBEb2N1bWVudAotCSAqIG5vZGUgb3IgSFRNTCBlbGVtZW50IGlmIHRoaXMgZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGJ1dCBkb2VzIG5vdCBoYXZlCi0JICogZXhwbGljaXQgSEVBRCBlbGVtZW50IGdldEhlYWRDb3JyZXNwb25kZW50Tm9kZSgpIHdpdGggW2NyZWF0ZT10cnVlXQotCSAqIHJldHVybnMgLSBIRUFEIGVsZW1lbnQgaWYgdGhpcyBkb2N1bWVudCBpcyBub3QgZnJhZ21lbnQgYW5kIGhhcyBIRUFECi0JICogZWxlbWVudCAobm8gbW9kaWZpY3RhdGlvbikgLSBuZXdseSBjcmVhdGVkIEhFQUQgZWxlbWVudCBpZiB0aGlzCi0JICogZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGJ1dCBkb2VzIG5vdCBoYXZlIEhFQUQgZWxlbWVudCAtIERvY3VtZW50IG5vZGUKLQkgKiBpZiB0aGlzIGRvY3VtZW50IGlzIGZyYWdtZW50IHdpdGggSEVBRCBjb250ZXh0IChubyBtb2RpZmljdGF0aW9uKSBbVGhlCi0JICogZm9sbG93aW5nIGNhc2VzIHdpbGwgYmUgc3VwcG9ydGVkIHNpbmNlIFY2XSAtIGEgY3VzdG9tIHRhZyB3aGljaAotCSAqIGdlbmVyYXRlcyBIRUFEIHRhZyBhdCBydW50aW1lIChubyBtb2RpZmljdGF0aW9uKSAtIG5ld2x5IGNyZWF0ZWQgSEVBRAotCSAqIGVsZW1lbnQgaWYgdGhpcyBkb2N1bWVudCBpcyBub3QgZnJhZ21lbnQgYnV0IGRvZXMgbm90IGhhdmUgZXhwbGljaXQKLQkgKiBIRUFEIGVsZW1lbnQgZ2V0SGVhZENvcnJlc3BvbmRlbnROb2RlKCkgdGhyb3dzIEhUTUxDb21tYW5kRXhjZXB0aW9uCi0JICogKHNpbmNlIFY2KSBpZiAtIHRoaXMgZG9jdW1lbnQgaXMgZnJhZ21lbnQgd2l0aCBCT0RZIGNvbnRleHQgYW5kIC0KLQkgKiAiY3JlYXRlIiBwYXJhbWV0ZXIgaXMgdHJ1ZSBOb3RlIHRoYXQgaW4gZWRpdGluZyBhIGZyYWdtZW50IGZpbGUsCi0JICogRG9jdW1lbnQgbm9kZSBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIHN1YnN0aXR1dGUgb2YgSEVBRCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBjaGlsZE9yRG9jdW1lbnQKLQkgKiBAcGFyYW0gY3JlYXRlCi0JICogQHJldHVybgotCSAqLwotCU5vZGUgZ2V0SGVhZENvcnJlc3BvbmRlbnROb2RlKE5vZGUgY2hpbGRPckRvY3VtZW50LCBib29sZWFuIGNyZWF0ZSk7Ci0KLQkvKioKLQkgKiBnZXRIdG1sQ29ycmVzcG9uZGVudE5vZGUoKSB0aHJvd3MgSFRNTENvbW1hbmRFeGNlcHRpb24gKHNpbmNlIFY2KSBpZiAtCi0JICogdGhpcyBkb2N1bWVudCBpcyBmcmFnbWVudCBhbmQgImNyZWF0ZSIgcGFyYW1ldGVyIGlzIHRydWUKLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGRPckRvY3VtZW50Ci0JICogQHBhcmFtIGNyZWF0ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlOb2RlIGdldEh0bWxDb3JyZXNwb25kZW50Tm9kZShOb2RlIGNoaWxkT3JEb2N1bWVudCwgYm9vbGVhbiBjcmVhdGUpOwotCi0JLyoqCi0JICogVGhpcyBpbm5lciBjbGFzcyBpcyBpbnRlbmRlZCBmb3IgaW5zZXJ0aW9uIHRhcmdldC4gcGxlYXNlIHVzZSB0aGlzIGxpa2UKLQkgKiB0aGUgZm9sbG93aW5nIDogRG9jdW1lbnRRdWVyeS5JbnNlcnRpb25UYXJnZXQgaW5zOwotCSAqIGlucy5nZXRQYXJlbnQoKS5pbnNlcnRCZWZvcmUoeW91SW5zZXJ0aW9uTm9kZSwgaW5zLmdldFJlZigpKTsKLQkgKi8KLQlwdWJsaWMgY2xhc3MgSW5zZXJ0aW9uVGFyZ2V0IHsKLQkJcHJpdmF0ZSBmaW5hbCBOb2RlIHBhcmVudDsKLQkJcHJpdmF0ZSBmaW5hbCBOb2RlIHJlZjsKLQotCQlwdWJsaWMgSW5zZXJ0aW9uVGFyZ2V0KE5vZGUgcGFyZW50LCBOb2RlIHJlZikgewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQl0aGlzLnJlZiA9IHJlZjsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldFBhcmVudCgpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBnZXRSZWYoKSB7Ci0JCQlyZXR1cm4gcmVmOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0SGVhZEluc2VydGlvblRhcmdldCgpIHJldHVybnMgYXBwcm9wcmlhdGUgaW5zZXRpb24gdGFyZ2V0IGxvY2F0aW9uCi0JICogZm9yIEhFQUQgY2hpbGQgdGFncyBzdWNoIGFzIDxzY3JpcHQ+LCA8c3R5bGU+LCA8bWV0YT5ldGMuIEJhc2ljYWxseQotCSAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucyA8SEVBRD50YWcncyB0aGUgbGFzdCBwb3NpdGlvbi4gTm90ZSB0aGF0IHRoaXMKLQkgKiB3b3VsZCBub3QgY3JlYXRlIGFjdHVhbCA8SEVBRD50YWcgd2hlbiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgaGF2ZSBpdC4KLQkgKiA8SEVBRD5pcyBvbWl0dGFibGUgdGFnIHNvIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhcHByb3ByaWF0ZSBwb3NpdGlvbgotCSAqIHRvIHdoaWNoIGltcGxpY2l0IDxIRUFEPmNhbiBiZSBpbnNlcnRlZCwgaWYgdGhlIGRvY3VtZW50IGhhcyBubwotCSAqIDxIRUFEPi4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jCi0JICogQHJldHVybgotCSAqLwotCUluc2VydGlvblRhcmdldCBnZXRIZWFkSW5zZXJ0aW9uVGFyZ2V0KERvY3VtZW50IGRvYyk7Ci0KLQkvKioKLQkgKiBnZXRQYWdlSW5zZXJ0aW9uVGFyZ2V0KCkgcmV0dXJucyBhcHByb3ByaWF0ZSBpbnNldGlvbiB0YXJnZXQgbG9jYXRpb24KLQkgKiBmb3IgcGFnZS1sZXZlbCBtYXJrdXBzLCBzdWNoIGFzIEpTUCBkaXJlY3RpdmVzLCB1c2ViZWFuIHRhZ3Mgb3IgPGh0bWw+Ci0JICogdGFnLiBCYXNpY2FsbHkgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGp1c3QgYmVmb3JlIDxIVE1MPnRhZy4gTm90ZSB0aGF0Ci0JICogdGhpcyB3b3VsZCBub3QgY3JlYXRlIGFjdHVhbCA8SFRNTD50YWcgd2hlbiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgaGF2ZQotCSAqIGl0LiBJbiBzdWNoIGNhc2UsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvc2l0aW9uIGp1c3QgYmVmb3JlIHRoZQotCSAqIG1lYW5pbmdmdWwgdGFncyBzdWNoIGFzIEhUTUwvSlNQIGVsZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBkb2MKLQkgKiBAcmV0dXJuCi0JICovCi0JSW5zZXJ0aW9uVGFyZ2V0IGdldFBhZ2VJbnNlcnRpb25UYXJnZXQoRG9jdW1lbnQgZG9jKTsKLQotCS8qKgotCSAqIGlzRnJhZ21lbnQoKSByZXR1cm5zIHdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIGZyYWdtZW50IG9yIGNvbXBsZXRlCi0JICogZG9jdW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZG9jCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gaXNGcmFnbWVudChEb2N1bWVudCBkb2MpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9FbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9FbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZWUyOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JLyoqCi0JICovCi0JQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oKTsKLQotCS8qKgotCSAqLwotCXZvaWQgc2V0RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbGFyYXRpb24pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0VsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NThmYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElOb2RlQWRhcHRlckZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlckZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyIGFkYXB0KElOb2RlTm90aWZpZXIgbm90aWZpZXIpIHsKLQkJaWYgKG5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlcjsKLQkJYWRhcHRlciA9IG5ldyBIVE1MRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcigpOwotCQlub3RpZmllci5hZGRBZGFwdGVyKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyRmFjdG9yeSgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGluZyBjb3B5IG1ldGhvZAotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hNUVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hNUVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc3YWQwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9ITVFVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGZpbmFsIGNsYXNzIEhNUVV0aWwgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVmVjdG9yIG51bGxWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0KLQkvKiBITVFVdGlsIGNsYXNzIG11c3Qgbm90IGluc3RhbnRpYXRlLiAqLwotCXByaXZhdGUgSE1RVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiBnYXRoZXIgYWxsIGVsZW1lbnQgZGVjbGFyYXRpb25zIGluIGluY2x1c2lvbiBvZiBlYWNoIHBhcmVudCBvZiB0aGUgdGFyZ2V0LiAKLQkgKiB0aGUgaW5jbHVzaW9uIG9mIHRoZSB0YXJnZXQgaXMgYWxzbyBnYXRoZXJlZC4gKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0SW5jbHVzaW9ucyhFbGVtZW50IHRhcmdldCkgewotCQlpZiAodGFyZ2V0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbFZlY3RvcjsKLQkJQ29sbGVjdGlvbiBpbmNsdXNpb25zID0gZ2F0aGVySW5jbHVzaW9ucyhnZXRBbmNlc3RvckRlY2xhcmF0aW9ucyh0YXJnZXQpKTsKLQotCQlIYXNodGFibGUgYXZhaWxhYmxlcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGluY2x1c2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlDTUNvbnRlbnQgaW5jbHVzaW9uID0gKENNQ29udGVudCkgaXRlci5uZXh0KCk7Ci0JCQlzd2l0Y2ggKGluY2x1c2lvbi5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJY2FzZSBDTU5vZGUuR1JPVVAgOgotCQkJCQlleHRyYWN0RGVjbGFyYXRpb25zKGF2YWlsYWJsZXMsIChDTUdyb3VwKSBpbmNsdXNpb24pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLQkJCQkJYWRkSW5jbHVzaW9uKGF2YWlsYWJsZXMsIChDTUVsZW1lbnREZWNsYXJhdGlvbikgaW5jbHVzaW9uKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYXZhaWxhYmxlcy52YWx1ZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGdldEFuY2VzdG9yRGVjbGFyYXRpb25zKEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCVZlY3RvciBhbmNlc3RvcnMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJRG9jdW1lbnQgZG9jID0gdGFyZ2V0LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJTW9kZWxRdWVyeSBxdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9jKTsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IHF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKHRhcmdldCk7Ci0JCWFuY2VzdG9ycy5hZGQoZGVjbCk7Ci0KLQkJRWxlbWVudCBwYXJlbnQgPSBnZXRQYXJlbnQodGFyZ2V0KTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlkZWNsID0gcXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50KTsKLQkJCWlmIChkZWNsICE9IG51bGwpCi0JCQkJYW5jZXN0b3JzLmFkZChkZWNsKTsKLQkJCXBhcmVudCA9IGdldFBhcmVudChwYXJlbnQpOwotCQl9Ci0JCXJldHVybiBhbmNlc3RvcnM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRJbmNsdXNpb24oSGFzaHRhYmxlIGF2YWlsYWJsZXMsIENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJU3RyaW5nIG5hbWUgPSBkZWNsLmdldEVsZW1lbnROYW1lKCk7Ci0JCWlmIChhdmFpbGFibGVzLmNvbnRhaW5zS2V5KG5hbWUpKQotCQkJcmV0dXJuOwotCQlhdmFpbGFibGVzLnB1dChuYW1lLCBkZWNsKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGdhdGhlckluY2x1c2lvbnMoQ29sbGVjdGlvbiBhbmNlc3RvcnMpIHsKLQkJVmVjdG9yIGluY2x1c2lvbnMgPSBuZXcgVmVjdG9yKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBhbmNlc3RvcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBpdGVyLm5leHQoKTsKLQkJCWlmIChkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuSU5DTFVTSU9OKSkgewotCQkJCUNNQ29udGVudCBpbmNsdXNpb24gPSAoQ01Db250ZW50KSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuSU5DTFVTSU9OKTsKLQkJCQlpZiAoaW5jbHVzaW9uICE9IG51bGwpCi0JCQkJCWluY2x1c2lvbnMuYWRkKGluY2x1c2lvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluY2x1c2lvbnM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRWxlbWVudCBnZXRQYXJlbnQoTm9kZSB0YXJnZXQpIHsKLQkJTm9kZSBwYXJlbnQgPSB0YXJnZXQuZ2V0UGFyZW50Tm9kZSgpOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlyZXR1cm4gKEVsZW1lbnQpIHBhcmVudDsKLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBleHRyYWN0RGVjbGFyYXRpb25zKEhhc2h0YWJsZSBhdmFpbGFibGVzLCBDTUdyb3VwIGdyb3VwKSB7Ci0JCUNNTm9kZUxpc3QgY29udGVudCA9IGdyb3VwLmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUNNTm9kZSBjbW4gPSBjb250ZW50Lml0ZW0oaSk7Ci0JCQlpZiAoY21uID09IG51bGwgfHwgY21uLmdldE5vZGVUeXBlKCkgIT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pCi0JCQkJY29udGludWU7Ci0JCQlhZGRJbmNsdXNpb24oYXZhaWxhYmxlcywgKENNRWxlbWVudERlY2xhcmF0aW9uKSBjbW4pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hUTUxFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZjAyODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciBpbXBsZW1lbnRzIEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgewotCi0JcHJpdmF0ZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUKLQkgKiBhbGxvd3MgaXQgdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMuZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9IVE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hUTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDdmYmJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hUTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEhUTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciBleHRlbmRzIFNpbXBsZUFzc29jaWF0aW9uUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsUXVlcnlDTVByb3ZpZGVyIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5Q01Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBIVE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIoQ01Eb2N1bWVudENhY2hlIGNhY2hlLCBVUklSZXNvbHZlciBpZFJlc29sdmVyKSB7Ci0JCXN1cGVyKG5ldyBIVE1MTW9kZWxRdWVyeUNNUHJvdmlkZXIoY2FjaGUsIGlkUmVzb2x2ZXIpKTsKLQl9Ci0KLQkvLyBNSVdBOiBXZSBjYW5ub3QgY2FjaGUgYSBDTUVsZW1lbnREZWNsYXJhdGlvbiBhbnkgbW9yZS4gIEJlY2F1c2UsIHdoZW4gdGhlIERPQ1RZUEUKLQkvLyB3YXMgY2hhbmdlZCwgQ01Eb2N1bWVudCB3b3VsZCBiZSBjaGFuZ2VkLiAgVGhlbiwgYSBjYWNoZWQgQ01FbGVtZW50RGVjbGFyYXRpb24KLQkvLyB3b3VsZCBiZSBpbnZhbGlkLiAgSWYgc29tZSBwZXJmb3JtYW5jZSBwcm9ibGVtcyBvY2N1cnMsIHdlIGNvbnNpZGVyIGEgc21hcnRlcgotCS8vIGNhY2hlIG1lY2hhbmlzbS4KLQkvLwotCS8vCXB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkvLwkJLy8gY2hlY2sgaWYgZWxlbWVudCBkZWNsYXJhdGlvbiBpcyBjYWNoZWQKLQkvLwkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBlbGVtZW50OwotCS8vCQlFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcikgbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuY2xhc3MpOwotCS8vCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCS8vCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0RGVjbGFyYXRpb24oKTsKLQkvLwotCS8vCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gc3VwZXIuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JLy8KLQkvLwkJLy8gY2FjaGUgSFRNTCBlbGVtZW50IGRlY2xhcmF0aW9uIG9ubHkKLQkvLwkJaWYgKGRlY2wgIT0gbnVsbCAmJiBkZWNsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgewotCS8vCQkJSUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCS8vCQkJYWRhcHRlciA9IChFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKSBmYWN0b3J5LmFkYXB0KG5vdGlmaWVyKTsKLQkvLwkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JLy8JCQkJYWRhcHRlci5zZXREZWNsYXJhdGlvbihkZWNsKTsKLQkvLwkJfQotCS8vCi0JLy8JCXJldHVybiBkZWNsOwotCS8vCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hUTUxNb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTE1vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZTZkM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTE1vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlDTVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDTURvY3VtZW50IHByb3ZpZGVyIGZvciBIVE1MIGFuZCBYSFRNTCBkb2N1bWVudHMuCi0gKiAKLSAqIFRoaXMgYWRkZWQgYW5kL29yIG1hZGUgcHVibGljIHNwZWNpZmljYWxseSBmb3IgZXhwZXJpbWVudGF0aW9uLiBJdCB3aWxsCi0gKiBjaGFuZ2UgYXMgdGhpcyBmdW5jdGlvbmFsaXR5IGJlY29tZXMgQVBJLiBTZWUKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTkwODQKLSAqLwotCi0KLXB1YmxpYyBjbGFzcyBIVE1MTW9kZWxRdWVyeUNNUHJvdmlkZXIgaW1wbGVtZW50cyBNb2RlbFF1ZXJ5Q01Qcm92aWRlciB7Ci0KLQotCXByaXZhdGUgc3RhdGljIENNRG9jdW1lbnQgc3RhdGljSFRNTCA9IEhUTUxDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KENNRG9jVHlwZS5IVE1MX0RPQ19UWVBFKTsKLQlwcml2YXRlIHN0YXRpYyBDTURvY3VtZW50IHN0YXRpY0NIVE1MID0gSFRNTENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoQ01Eb2NUeXBlLkNIVE1MX0RPQ19UWVBFKTsKLQlwcml2YXRlIHN0YXRpYyBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgZG9jdHlwZVJlZ2lzdHJ5ID0gSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIGJ1ZGR5Q2FjaGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlwcml2YXRlIFhIVE1MQXNzb2NpYXRpb25Qcm92aWRlciB4aHRtbGFzc29jID0gbnVsbDsKLQotCXB1YmxpYyBIVE1MTW9kZWxRdWVyeUNNUHJvdmlkZXIoQ01Eb2N1bWVudENhY2hlIGNhY2hlLCBVUklSZXNvbHZlciBpZFJlc29sdmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXhodG1sYXNzb2MgPSBuZXcgWEhUTUxBc3NvY2lhdGlvblByb3ZpZGVyKGNhY2hlLCBpZFJlc29sdmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDTURvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIERPTSBOb2RlLiBvciBudWxsIGlmIG5vCi0JICogQ01Eb2N1bWVudCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIERPTSBOb2RlLgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KE5vZGUgbm9kZSkgewotCQlJRE9NRG9jdW1lbnQgb3duZXIgPSBnZXRPd25lclhNTERvY3VtZW50KG5vZGUpOwotCQlpZiAob3duZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBwaWQgPSBnZXRQdWJsaWNJZChvd25lcik7Ci0JCWlmIChwaWQgPT0gbnVsbCkKLQkJCXJldHVybiBzdGF0aWNIVE1MOwotCi0JCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeSA9IGRvY3R5cGVSZWdpc3RyeS5nZXRFbnRyeShwaWQpOwotCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCXJldHVybiBzdGF0aWNIVE1MOwotCQkKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MTAwMCAtIHVzZSBpbnRlcm5hbCBjb250ZW50IG1vZGVsCi0JCWlmIChlbnRyeS51c2VJbnRlcm5hbE1vZGVsKCkpIHsKLQkJCWlmIChwaWQgIT0gbnVsbCAmJiBwaWQuZXF1YWxzKEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5DSFRNTF9QVUJMSUNfSUQpKSB7Ci0JCQkJcmV0dXJuIHN0YXRpY0NIVE1MOwotCQkJfQotCQkJcmV0dXJuIHN0YXRpY0hUTUw7Ci0JCX0KLQotCQlwaWQgPSBlbnRyeS5nZXRQdWJsaWNJZCgpOwotCQlTdHJpbmcgc2lkID0gZW50cnkuZ2V0U3lzdGVtSWQoKTsKLQotCQlDTURvY3VtZW50IGR0ZGNtID0geGh0bWxhc3NvYy5nZXRYSFRNTENNRG9jdW1lbnQocGlkLCBzaWQpOwotCQlpZiAoZHRkY20gPT0gbnVsbCkgewotCQkJaWYgKHBpZCAhPSBudWxsICYmIHBpZC5lcXVhbHMoSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LkNIVE1MX1BVQkxJQ19JRCkpIHsKLQkJCQlyZXR1cm4gc3RhdGljQ0hUTUw7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RhdGljSFRNTDsKLQkJfQotCi0JCVN0cmluZyBncmFtbWFyVVJJID0geGh0bWxhc3NvYy5nZXRDYWNoZWRHcmFtbWVyVVJJKCk7Ci0JCUNNRG9jdW1lbnQgYnVkZHljbSA9IChDTURvY3VtZW50KSBidWRkeUNhY2hlLmdldChncmFtbWFyVVJJKTsKLQkJaWYgKGJ1ZGR5Y20gIT0gbnVsbCkKLQkJCXJldHVybiBidWRkeWNtOwotCi0JCWJ1ZGR5Y20gPSBuZXcgQ01Eb2N1bWVudEZvckJ1ZGR5U3lzdGVtKGR0ZGNtLCBlbnRyeS5pc1hNTFR5cGUoKSk7Ci0JCWJ1ZGR5Q2FjaGUucHV0KGdyYW1tYXJVUkksIGJ1ZGR5Y20pOwotCQlyZXR1cm4gYnVkZHljbTsKLQl9Ci0KLQkvLyBwcml2YXRlIG1ldGhvZHMKLQlwcml2YXRlIElET01Eb2N1bWVudCBnZXRPd25lclhNTERvY3VtZW50KE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCURvY3VtZW50IG93bmVyID0gKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpID8gKERvY3VtZW50KSBub2RlIDogbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChvd25lciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKG93bmVyIGluc3RhbmNlb2YgSURPTURvY3VtZW50KSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElET01Eb2N1bWVudCkgb3duZXI7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHVibGljSWQoSURPTURvY3VtZW50IGRvYykgewotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRG9jdW1lbnRUeXBlIGRvY3R5cGUgPSBkb2MuZ2V0RG9jdHlwZSgpOwotCQlyZXR1cm4gKGRvY3R5cGUgIT0gbnVsbCkgPyBkb2N0eXBlLmdldFB1YmxpY0lkKCkgOiBkb2MuZ2V0RG9jdW1lbnRUeXBlSWQoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTE1vZGVsUXVlcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9IVE1MTW9kZWxRdWVyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVlMTQzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9IVE1MTW9kZWxRdWVyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuTW9kZWxRdWVyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5YTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW92YWJsZU1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoaXMgYWRkZWQgYW5kL29yIG1hZGUgcHVibGljIHNwZWNpZmljYWxseSBmb3IgZXhwZXJpbWVudGF0aW9uLiBJdAotICogd2lsbCBjaGFuZ2UgYXMgdGhpcyBmdW5jdGlvbmFsaXR5IGJlY29tZXMgQVBJLiBTZWUKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTkwODQKLSAqLwotIAotcHVibGljIGNsYXNzIEhUTUxNb2RlbFF1ZXJ5SW1wbCBleHRlbmRzIE1vZGVsUXVlcnlJbXBsIGltcGxlbWVudHMgTW92YWJsZU1vZGVsUXVlcnkgewotCi0JcHJvdGVjdGVkIENNRG9jdW1lbnRDYWNoZSBmQ2FjaGUgPSBudWxsOwotCXByb3RlY3RlZCBYTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciB4bWxBc3NvY1Byb3YgPSBudWxsOwotCi0JcHVibGljIEhUTUxNb2RlbFF1ZXJ5SW1wbChDTURvY3VtZW50Q2FjaGUgY2FjaGUsIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXIpIHsKLQkJc3VwZXIobmV3IEhUTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcihjYWNoZSwgaWRSZXNvbHZlcikpOwotCQlmQ2FjaGUgPSBjYWNoZTsKLQkJeG1sQXNzb2NQcm92ID0gbmV3IFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKGNhY2hlLCBpZFJlc29sdmVyKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVDb250ZW50KEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmNsdWRlT3B0aW9ucykgewotCQlMaXN0IG9yaWdpbmFsQ2FuZGlkYXRlcyA9IHN1cGVyLmdldEF2YWlsYWJsZUNvbnRlbnQoZWxlbWVudCwgZWQsIGluY2x1ZGVPcHRpb25zKTsKLQkJaWYgKChpbmNsdWRlT3B0aW9ucyAmIElOQ0xVREVfQ0hJTERfTk9ERVMpID09IDApCi0JCQlyZXR1cm4gb3JpZ2luYWxDYW5kaWRhdGVzOwotCQkvLyBXaGVuIHRoZSB0YXJnZXQgZG9jdW1lbnQgaXMgWEhUTUwsIGl0IGlzIHdhc3RlIHRvIGZpbmQgaW5jbHVzaW9ucywKLQkJLy8gc2luY2UgaW5jbHVzaW9uIGlzIGF2YWlsYWJsZSBpbiBIVE1MIG9ubHkuCi0JCWlmICghZWQuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5JU19YSFRNTCkpCi0JCQlyZXR1cm4gb3JpZ2luYWxDYW5kaWRhdGVzOwotCQkKLQkJQm9vbGVhbiBpc1hodG1sID0gQm9vbGVhbi5GQUxTRTsKLQkJaXNYaHRtbCA9IChCb29sZWFuKSBlZC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKTsKLQkJaWYgKGlzWGh0bWwgIT0gbnVsbCAmJiBpc1hodG1sLmJvb2xlYW5WYWx1ZSgpKQotCQkJcmV0dXJuIG9yaWdpbmFsQ2FuZGlkYXRlczsKLQotCQkvLyBPSywgdGhlIHRhcmdldCBpcyBzdXJlbHkgYSBIVE1MIGVsZW1lbnQsIHNvIGl0IG1heSBoYXZlIGluY2x1c2lvbi4KLQkJLy8gVHJ5IHRvIGZpbmQgaXQuCi0JCVZlY3RvciBjYW5kaWRhdGVzID0gbmV3IFZlY3RvcihvcmlnaW5hbENhbmRpZGF0ZXMpOwotCi0JCXN3aXRjaCAoZWQuZ2V0Q29udGVudFR5cGUoKSkgewotCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlkgOgotCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UIDoKLQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQgOgotCQkJCS8vIGRvIGVudW1lcmF0ZSBpbmNsdXNpb25zLgotCQkJCWNhbmRpZGF0ZXMuYWRkQWxsKEhNUVV0aWwuZ2V0SW5jbHVzaW9ucyhlbGVtZW50KSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZIDoKLQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBIDoKLQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEEgOgotCQkJZGVmYXVsdCA6Ci0JCQkJLy8gc2hvdWxkIG5vdCBhZGQgYW55IGluY2x1c2lvbnMuCi0JCQkJLy8gc28sIG5vdGhpbmcgdG8gZG8gaGVyZS4KLQkJCQlicmVhazsKLQkJfQotCQkvLyBJZiB0aGUgY3VycmVudCBlbGVtZW50IGRvZXMgbm90IGF2YWlsYWJsZSwgaXQgaXMgaW1wb3NzaWJsZQotCQkvLyB0byBmaWx0ZXIgb3V0IGV4Y2x1c2lvbi4KLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBjYW5kaWRhdGVzOwotCi0JCS8vIE5vdywgdGhlIHRpbWUgdG8gY2hlY2sgZXhjbHVzaW9uLgotCQlWZWN0b3IgY29udGVudCA9IG5ldyBWZWN0b3IoY2FuZGlkYXRlcy5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhbmRpZGF0ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGNhbmRpZGF0ZSA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgY2FuZGlkYXRlcy5lbGVtZW50QXQoaSk7Ci0JCQlpZiAoY2FuZGlkYXRlID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoaXNFeGNsdWRlZChjYW5kaWRhdGUsIGVsZW1lbnQpKQotCQkJCWNvbnRpbnVlOwotCQkJY29udGVudC5hZGQoY2FuZGlkYXRlKTsKLQkJfQotCi0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgTW92YWJsZU1vZGVsUXVlcnkjc2V0SWRSZXNvbHZlcihJZFJlc29sdmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkUmVzb2x2ZXIoVVJJUmVzb2x2ZXIgbmV3SWRSZXNvbHZlcikgewotCQltb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciA9IG5ldyBIVE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIoZkNhY2hlLCBuZXdJZFJlc29sdmVyKTsKLQl9Ci0KLQkvLyB1dGlsaXRpZXMKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRXhjbHVkZWQoQ01FbGVtZW50RGVjbGFyYXRpb24gY2FuZGlkYXRlLCBFbGVtZW50IHRhcmdldCkgewotCQlDTU5hbWVkTm9kZU1hcCBwcm9oaWJpdGVkID0gZ2V0UHJvaGliaXRlZEFuY2VzdG9ycyhjYW5kaWRhdGUpOwotCQlpZiAocHJvaGliaXRlZCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlFbGVtZW50IHBhcmVudCA9IHRhcmdldDsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlDTU5vZGUgcGRlYyA9IHByb2hpYml0ZWQuZ2V0TmFtZWRJdGVtKHBhcmVudC5nZXROb2RlTmFtZSgpKTsKLQkJCWlmIChwZGVjICE9IG51bGwpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlwYXJlbnQgPSBnZXRFeHBsaWNpdFBhcmVudEVsZW1lbnQocGFyZW50KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycyhDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWMpIHsKLQkJaWYgKCFkZWMuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5QUk9ISUJJVEVEX0FOQ0VTVE9SUykpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChDTU5hbWVkTm9kZU1hcCkgZGVjLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuUFJPSElCSVRFRF9BTkNFU1RPUlMpOwotCX0KLQotCS8qIGdldCBhbiBhbmNlc3RvciBlbGVtZW50IGlnbm9yaW5nIGltcGxpY2l0IG9uZXMuICovCi0JcHJpdmF0ZSBzdGF0aWMgRWxlbWVudCBnZXRFeHBsaWNpdFBhcmVudEVsZW1lbnQoTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCU5vZGUgcCA9IGNoaWxkLmdldFBhcmVudE5vZGUoKTsKLQkJd2hpbGUgKHAgIT0gbnVsbCkgewotCQkJaWYgKHAuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCWlmIChwIGluc3RhbmNlb2YgSURPTUVsZW1lbnQpIHsKLQkJCQkJaWYgKCgoSURPTUVsZW1lbnQpIHApLmlzSW1wbGljaXRUYWcoKSkgewotCQkJCQkJcCA9IHAuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIChFbGVtZW50KSBwOwotCQkJfQotCQkJcCA9IHAuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gcmVzdWx0ID0gc3VwZXIuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCWlmIChudWxsICE9IHJlc3VsdCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCQotCQlyZXR1cm4geG1sQXNzb2NQcm92LmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZEhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY3YzI2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZEhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZEhUTUwgZXh0ZW5kcyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MIHsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkSFRNTC4KLQkgKi8KLQlwdWJsaWMgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRIVE1MKCkgewotCQlzdXBlcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcywgZmFsc2UpOwotCX0KLQotCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQotCQlyZXR1cm4gbmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkSFRNTCgpOwotCX0KLQotCS8qKgotCSAqIElTU1VFOiB0aGlzICJmb3JjZXMiIGEgbmV3IG9uZSB0byBhbHdheXMgYmUgY3JlYXRlZC9yZXR1cm5lZCwgbm90Ci0JICogImNhY2hlZCIgb24gdGhlIG5vZGUuIFRoYXQgc2VlbXMgaW5jb3JyZWN0LiBTaW1wbHkgdXNpbmcKLQkgKiBzaG91bGRSZWdpc3RlckZhbHNlIHNob3VsZCB3b3JrLCBleGNlcHQsIHRoZXJlIG1pZ2h0IGhhdmUgYmVlbiBvbmUKLQkgKiB0aGVyZSB0aGF0IHNvbWVvbmUgZWxzZSBhbHJlYWR5IGV4cGxpY2l0bHkgcHV0IHRoZXJlLCBzbyB0aGlzIGlzIG9ubHkKLQkgKiB3YXkgSSBrbm93IHRvIG92ZXJyaWRlIHRoYXQuIEVzcGVjaWFsbHkgY29tcGxpY2F0ZWQgaGVyZSBzaW5jZSBhIG51bWJlcgotCSAqIG9mIGFkYXB0ZXJzIGFyZSBmb3IgTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MuCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG9iamVjdCkgewotCQlyZXR1cm4gYWRhcHROZXcob2JqZWN0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2MyZjJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5YTUxDYXRhbG9nSWRSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXJJbXBsOwotCi0vKioKLSAqIENyZWF0ZXMgYSBNb2RlbFF1ZXJ5QWRhcHRlciBmb3IgSFRNTCBtb2RlbHMKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUwgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IHsKLQotCU1vZGVsUXVlcnlBZGFwdGVySW1wbCBtb2RlbFF1ZXJ5QWRhcHRlcjsKLQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsU3RhdGVOb3RpZmllcjsKLQlwcml2YXRlIEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyOwotCi0JY2xhc3MgSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgaW1wbGVtZW50cyBJTW9kZWxTdGF0ZUxpc3RlbmVyIHsKLQotCQkvKioKLQkJICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJCS8vIElTU1VFOiBzaG91bGQgd2UgImZyZWV6ZSIgc3RhdGUsIG9yIGFueXRoaW5nPwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCQkvLyBJU1NVRTogc2hvdWxkIHdlICJmcmVlemUiIHN0YXRlLCBvciBhbnl0aGluZz8KLQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbENoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCQkvLyBub3RoaW5nIHRvIGRvPwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwsCi0JCSAqICAgICAgYm9vbGVhbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsRGlydHlTdGF0ZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgYm9vbGVhbiBpc0RpcnR5KSB7Ci0JCQkvLyBub3RoaW5nIHRvIGRvCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RlbFJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCXVwZGF0ZVJlc29sdmVyKHN0cnVjdHVyZWRNb2RlbCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsUmVzb3VyY2VEZWxldGVkKElTdHJ1Y3R1cmVkTW9kZWwpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCQkvLyBub3RoaW5nIHRvIGRvPwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbFJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCwKLQkJICogICAgICBJU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQkJCW1vZGVsU3RhdGVOb3RpZmllci5yZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIodGhpcyk7Ci0JCQltb2RlbFN0YXRlTm90aWZpZXIgPSBuZXdNb2RlbDsKLQkJCXVwZGF0ZVJlc29sdmVyKG1vZGVsU3RhdGVOb3RpZmllcik7Ci0JCQltb2RlbFN0YXRlTm90aWZpZXIuYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHVwZGF0ZVJlc29sdmVyKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJCVN0cmluZyBiYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCUlGaWxlIGJhc2VGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKG1vZGVsLmdldEJhc2VMb2NhdGlvbigpKSk7Ci0JCQlpZiAoYmFzZUZpbGUgIT0gbnVsbCkgewotCQkJCWlmIChiYXNlRmlsZS5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCQkJYmFzZUxvY2F0aW9uID0gYmFzZUZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJCX0KLQkJCQlpZiAoYmFzZUxvY2F0aW9uID09IG51bGwgJiYgYmFzZUZpbGUuZ2V0TG9jYXRpb25VUkkoKSAhPSBudWxsKSB7Ci0JCQkJCWJhc2VMb2NhdGlvbiA9IGJhc2VGaWxlLmdldExvY2F0aW9uVVJJKCkudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQkJaWYgKGJhc2VMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCWJhc2VMb2NhdGlvbiA9IGJhc2VGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQliYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCX0KLQkJCW1vZGVsUXVlcnlBZGFwdGVyLnNldElkUmVzb2x2ZXIobmV3IFhNTENhdGFsb2dJZFJlc29sdmVyKGJhc2VMb2NhdGlvbiwgbW9kZWwuZ2V0UmVzb2x2ZXIoKSkpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUwgY29uc3RydWN0b3IgY29tbWVudC4gTm90ZTogdGhpcyBpcyBhCi0JICogY2FzZSB0aGVyZSB0aGUga2V5IGlzIG5vdCBleGFjdGx5IHNhbWUgYXMgdGhlIGNsYXNzIHdlIGFyZSBhZnRlci4KLQkgKi8KLQlwdWJsaWMgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTCgpIHsKLQkJc3VwZXIoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFdlIG5lZWQgdGhpcyBwcm90ZWN0ZWQgdmVyc2lvbiB0byBhbGxvdyBzdWJjbGFzc2VzIHRvIHBhc3MgdXAgc3RhbmRhcmQKLQkgKiBiZWhhdmlvdXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJLZXkKLQkgKiBAcGFyYW0gcmVnaXN0ZXJBZGFwdGVycwotCSAqLwotCi0JcHJvdGVjdGVkIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUwoT2JqZWN0IGFkYXB0ZXJLZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQotCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQotCQlyZXR1cm4gbmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlzdXBlci5yZWxlYXNlKCk7Ci0JCWlmIChtb2RlbFN0YXRlTm90aWZpZXIgIT0gbnVsbCkgewotCQkJbW9kZWxTdGF0ZU5vdGlmaWVyLnJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcihpbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcik7Ci0JCX0KLQotCQltb2RlbFN0YXRlTm90aWZpZXIgPSBudWxsOwotCi0JCWlmIChtb2RlbFF1ZXJ5QWRhcHRlciAhPSBudWxsKSB7Ci0JCQltb2RlbFF1ZXJ5QWRhcHRlci5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVBZGFwdGVyIG1ldGhvZCBjb21tZW50LgotCSAqIAotCSAqIFhYWDogd2UgbXVzdCBtYWtlIHRoaXMgbWV0aG9kIG1vcmUgaW5kZXBlbmRlbnQgb2YgJ2xvY2F0aW9uJyAoYXQgbGVhc3QKLQkgKiBwcm92aWRlIHNvbWUgZmFsbC1iYWNrIG1ldGhvZCkuCi0JICovCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0KLQkJaWYgKERlYnVnLmRpc3BsYXlJbmZvKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MLmNyZWF0ZUFkYXB0ZXIiICsgdGFyZ2V0KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChtb2RlbFF1ZXJ5QWRhcHRlciA9PSBudWxsKSB7Ci0JCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQlJRE9NTm9kZSB4bWxOb2RlID0gKElET01Ob2RlKSB0YXJnZXQ7Ci0JCQkJbW9kZWxTdGF0ZU5vdGlmaWVyID0geG1sTm9kZS5nZXRNb2RlbCgpOwotCQkJCW1vZGVsU3RhdGVOb3RpZmllci5hZGRNb2RlbFN0YXRlTGlzdGVuZXIoZ2V0SW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKSk7Ci0KLQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0geG1sTm9kZS5nZXRNb2RlbCgpOwotCQkJCW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlVSSVJlc29sdmVyIHJlc29sdmVyID0gbW9kZWwuZ2V0UmVzb2x2ZXIoKTsKLQkJCQlpZiAoRGVidWcuZGlzcGxheUluZm8pCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLU1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUwuLi4gYmFzZUxvY2F0aW9uIDogIiArIHJlc29sdmVyLmdldEZpbGVCYXNlTG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCS8qKgotCQkJCSAqIFhNTENhdGFsb2dJZFJlc29sdmVyIGN1cnJlbnRseSByZXF1aXJlcyBhIGZpbGVzeXN0ZW0KLQkJCQkgKiBsb2NhdGlvbiBzdHJpbmcuIEN1c3RvbWFyaWx5IHRoaXMgd2lsbCBiZSB3aGF0IGlzIGluIHRoZQotCQkJCSAqIGRlcHJlY2F0ZWQgU1NFIFVSSVJlc29sdmVyIGFuZCByZXF1aXJlZCBieSB0aGUgQ29tbW9uIFVSSQotCQkJCSAqIFJlc29sdmVyLgotCQkJCSAqLwotCQkJCVVSSVJlc29sdmVyIGlkUmVzb2x2ZXIgPSBudWxsOwotCQkJCWlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0JCQkJCWlkUmVzb2x2ZXIgPSBuZXcgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIocmVzb2x2ZXIuZ2V0RmlsZUJhc2VMb2NhdGlvbigpLCByZXNvbHZlcik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvKgotCQkJCQkgKiAyMDM2NDkgLSB0aGlzIGJsb2NrIG1heSBiZSBuZWNlc3NhcnkgZHVlIHRvIG9yZGVyaW5nIG9mCi0JCQkJCSAqIHNldHRpbmcgdGhlIHJlc29sdmVyIGludG8gdGhlIG1vZGVsCi0JCQkJCSAqLwotCQkJCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbnVsbDsKLQkJCQkJU3RyaW5nIG1vZGVsc0Jhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJCQlpZiAobW9kZWxzQmFzZUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJCUZpbGUgZmlsZSA9IG5ldyBQYXRoKG1vZGVsc0Jhc2VMb2NhdGlvbikudG9GaWxlKCk7Ci0JCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJCWJhc2VMb2NhdGlvbiA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlJUGF0aCBiYXNlUGF0aCA9IG5ldyBQYXRoKG1vZGVsLmdldEJhc2VMb2NhdGlvbigpKTsKLQkJCQkJCQlJUmVzb3VyY2UgZGVyaXZlZFJlc291cmNlID0gbnVsbDsKLQkJCQkJCQlpZiAoYmFzZVBhdGguc2VnbWVudENvdW50KCkgPiAxKQotCQkJCQkJCQlkZXJpdmVkUmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoYmFzZVBhdGgpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJZGVyaXZlZFJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGJhc2VQYXRoLnNlZ21lbnQoMCkpOwotCQkJCQkJCUlQYXRoIGRlcml2ZWRQYXRoID0gZGVyaXZlZFJlc291cmNlLmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJaWYgKGRlcml2ZWRQYXRoICE9IG51bGwpIHsKLQkJCQkJCQkJYmFzZUxvY2F0aW9uID0gZGVyaXZlZFBhdGgudG9TdHJpbmcoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCVVSSSB1cmkgPSBkZXJpdmVkUmVzb3VyY2UuZ2V0TG9jYXRpb25VUkkoKTsKLQkJCQkJCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJCQkJCQliYXNlTG9jYXRpb24gPSB1cmkudG9TdHJpbmcoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmKGJhc2VMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCQkJYmFzZUxvY2F0aW9uID0gbW9kZWxzQmFzZUxvY2F0aW9uOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlkUmVzb2x2ZXIgPSBuZXcgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoYmFzZUxvY2F0aW9uLCBudWxsKTsKLQkJCQl9Ci0JCQkJQ01Eb2N1bWVudENhY2hlIGRvY3VtZW50Q2FjaGUgPSBuZXcgQ01Eb2N1bWVudENhY2hlKCk7Ci0JCQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gbmV3IEhUTUxNb2RlbFF1ZXJ5SW1wbChkb2N1bWVudENhY2hlLCBpZFJlc29sdmVyKTsKLQkJCQltb2RlbFF1ZXJ5LnNldEVkaXRNb2RlKE1vZGVsUXVlcnkuRURJVF9NT0RFX1VOQ09OU1RSQUlORUQpOwotCQkJCW1vZGVsUXVlcnlBZGFwdGVyID0gbmV3IE1vZGVsUXVlcnlBZGFwdGVySW1wbChkb2N1bWVudENhY2hlLCBtb2RlbFF1ZXJ5LCBpZFJlc29sdmVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kZWxRdWVyeUFkYXB0ZXI7Ci0JfQotCi0KLQotCXByaXZhdGUgZmluYWwgSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgZ2V0SW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKSB7Ci0JCWlmIChpbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlpbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcigpOwotCQl9Ci0JCXJldHVybiBpbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9YSFRNTEFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hIVE1MQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmRlMmNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hIVE1MQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLlhNTEFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBBIENsYXNzIHRvIHByb3ZpZGUgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBYSFRNTCBkb2N1bWVudHMgYW5kIERURHMgZm9yCi0gKiBYSFRNTC4gVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9ubHkgaW4gSFRNTE1vZGVsUXVlcnlDTVByb3ZpZGVyLgotICovCi0vKgotICogVGhpcyBjbGFzcyBjbG9zZWx5IHJlc2VtYmxlIFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLgotICovCi1jbGFzcyBYSFRNTEFzc29jaWF0aW9uUHJvdmlkZXIgZXh0ZW5kcyBYTUxBc3NvY2lhdGlvblByb3ZpZGVyIHsKLQotCS8qKgotCSAqIHNldCBVU0VfUVVJQ0tfQ0FDSEUgdG8gZmFsc2UgdG8gdGVzdCBlZmZlY3RzIG9mIG5vdCBjYWNoaW5nIGF0IGFsbC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9RVUlDS19DQUNIRSA9IHRydWU7Ci0JcHJvdGVjdGVkIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNhY2hlZEdyYW1tZXJVUkk7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNhY2hlZFB1YmxpY0lEOwotCXByaXZhdGUgU3RyaW5nIGZDYWNoZWRTeXN0ZW1JRDsKLQlwcml2YXRlIGJvb2xlYW4gY2FjaGVkOwotCi0JcHVibGljIFhIVE1MQXNzb2NpYXRpb25Qcm92aWRlcihDTURvY3VtZW50Q2FjaGUgY2FjaGUsIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXIpIHsKLQkJc3VwZXIoY2FjaGUpOwotCQl0aGlzLmlkUmVzb2x2ZXIgPSBpZFJlc29sdmVyOwotCQkgICAKLQkJLy8gU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzYzOTkuIElmIHRoZSBDTSBkb2N1bWVudCBVUkkKLQkJLy8gaXMgcmVzb2x2ZWQgYW5kIGNhY2hlZCBhdCB0aGlzIGxldmVsIGluc3RydWN0IHRoZSBDTSBtb2RlbCBtYW5hZ2VyIHRvIGF2b2lkIAotCQkvLyByZS1yZXNvbHZpbmcgdGhlIFVSSS4KLQotCQlpZiAoVVNFX1FVSUNLX0NBQ0hFKSB7Ci0JCSAgZG9jdW1lbnRNYW5hZ2VyLnNldFByb3BlcnR5RW5hYmxlZChDTURvY3VtZW50TWFuYWdlci5QUk9QRVJUWV9QRVJGT1JNX1VSSV9SRVNPTFVUSU9OLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSWQKLQkgKiBAcGFyYW0gc3lzdGVtSWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgZ2V0WEhUTUxDTURvY3VtZW50KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCWlmIChpZFJlc29sdmVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIGdyYW1tZXJVUkkgPSBudWxsOwotCQlpZiAoVVNFX1FVSUNLX0NBQ0hFKSB7Ci0JCQkvKgotCQkJICogSW4gcGFyc2luZyBhIGRvY3VtZW50LCB3ZSBnZXQgbWFueSBpZGVudGljYWwgcmVxdWVzdHMgdG8gdGhpcwotCQkJICogbWV0aG9kLCBzbyBpbnN0ZWFkIG9mIGxvb2tpbmcgdXAgKHJlc29sdmluZykgZ3JhbW1lclVSSSBlYWNoCi0JCQkgKiB0aW1lLCB3ZSdsbCBqdXN0IHJldHVybiBwcmV2aW91c2x5IGNhY2hlZCBvbmUuIFByb2JhYmx5IG5vdAotCQkJICogd29ydGggaGF2ZSBhIG1vcmUgY29tcGxleCBjYWNoZSB0aGFuIHRoYXQuCi0JCQkgKi8KLQkJCWlmIChjYWNoZWQgJiYgc2FtZUFzKGZDYWNoZWRQdWJsaWNJRCwgcHVibGljSWQpICYmIHNhbWVBcyhmQ2FjaGVkU3lzdGVtSUQsIHN5c3RlbUlkKSkgewotCQkJCWdyYW1tZXJVUkkgPSBmQ2FjaGVkR3JhbW1lclVSSTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWdyYW1tZXJVUkkgPSBpZFJlc29sdmVyLnJlc29sdmUobnVsbCwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJCQlmQ2FjaGVkR3JhbW1lclVSSSA9IGdyYW1tZXJVUkk7Ci0JCQkJZkNhY2hlZFB1YmxpY0lEID0gcHVibGljSWQ7Ci0JCQkJZkNhY2hlZFN5c3RlbUlEID0gc3lzdGVtSWQ7Ci0JCQkJY2FjaGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWdyYW1tZXJVUkkgPSBpZFJlc29sdmVyLnJlc29sdmUobnVsbCwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJfQotCi0JCWlmIChncmFtbWVyVVJJID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvKgotCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODg4OTYKLQkJICogCi0JCSAqIFdlIG9uY2UgY2FsbGVkIHRoZSBkZXByZWNhdGVkIDIgYXJndW1lbnQgZm9ybSBvZiBnZXRDTURvY3VtZW50LgotCQkgKiAKLQkJICogQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gZG9jdW1lbnRNYW5hZ2VyLmdldENNRG9jdW1lbnQocHVibGljSWQsCi0JCSAqIGdyYW1tZXJVUkkpOwotCQkgKiAKLQkJICogd2hpY2ggZXZlbnR1YWxseSByZXN1bHRlZCBpbiBlbXB0eSBzdHJpbmcgZm9yIHR5cGUsIHdoaWNoIEkgZG9uJ3QKLQkJICogdGhpbmsgdGhlIGluZnJhc3RydWN0dXJlIGhhbmRsZXMgYW55IGxvbmdlci4gU28sIEkgZGVsZXRlZAotCQkgKiBkZXByZWNhdGVkIG1ldGhvZHMsIGFuZCBzd2l0Y2hlZCB0byBudWxsIGZvciB0eXBlIGFyZ3VtZW50LgotCQkgKiAKLQkJICogJ251bGwnIG1lYW5zIHRvICJjcmVhdGUgYmFzZWQgb24gdXJpIi4KLQkJICogCi0JCSAqIEZZSSwgJ2R0ZCcgd291bGQgbWVhbiBsb2FkIG9ubHkgdGhvc2UgcmVnaXN0ZXJlZCBhcyBkdGQncwotCQkgKiAKLQkJICogQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gZG9jdW1lbnRNYW5hZ2VyLmdldENNRG9jdW1lbnQocHVibGljSWQsCi0JCSAqIGdyYW1tZXJVUkkpOyBDTURvY3VtZW50IGNtRG9jdW1lbnQgPQotCQkgKiBkb2N1bWVudE1hbmFnZXIuZ2V0Q01Eb2N1bWVudChwdWJsaWNJZCwgZ3JhbW1lclVSSSwgImR0ZCIpOwotCQkgKi8KLQkJQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gZG9jdW1lbnRNYW5hZ2VyLmdldENNRG9jdW1lbnQocHVibGljSWQsIGdyYW1tZXJVUkksIG51bGwpOwotCQlyZXR1cm4gY21Eb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVHcmFtbWFyVVJJKERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQlyZXR1cm4gaWRSZXNvbHZlci5yZXNvbHZlKG51bGwsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNhbWVBcyhTdHJpbmcgYSwgU3RyaW5nIGIpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGEgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gYiA9PSBudWxsOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gYS5lcXVhbHMoYik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZGVkIGFuZC9vciBtYWRlIHB1YmxpYyBzcGVjaWZpY2FsbHkgZm9yIGV4cGVyaW1lbnRhdGlvbi4gSXQKLQkgKiB3aWxsIGNoYW5nZSBhcyB0aGlzIGZ1bmN0aW9uYWxpdHkgYmVjb21lcyBBUEkuIFNlZQotCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTkwODQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhY2hlZEdyYW1tZXJVUkkoKSB7Ci0JCXJldHVybiBmQ2FjaGVkR3JhbW1lclVSSTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSFRNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGUyMTQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkNoYXJzZXROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25NZXNzYWdlOwotCi0vKioKLSAqIFNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIEhUTUwgQ29yZSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgSFRNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkpOwotCi0JCS8vIGZvcm1hdHRpbmcgcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCwgNzIpOwotCQlub2RlLnB1dEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTLCBmYWxzZSk7Ci0JCW5vZGUucHV0KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQik7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUsIDEpOwotCQlub2RlLnB1dEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BMSVRfTVVMVElfQVRUUlMsIGZhbHNlKTsKLQkJbm9kZS5wdXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFMSUdOX0VORF9CUkFDS0VULCBmYWxzZSk7Ci0KLQkJLy8gY2xlYW51cCBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX1RBR19OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0FUVFJfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJLy8gbm9kZS5wdXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTVBSRVNTX0VNUFRZX0VMRU1FTlRfVEFHUywKLQkJLy8gdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX01JU1NJTkdfVEFHUywgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUywgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFLCB0cnVlKTsKLQkJbm9kZS5wdXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTlZFUlRfRU9MX0NPREVTLCBmYWxzZSk7Ci0KLQkJLy8gY29kZSBnZW5lcmF0aW9uIHByZWZlcmVuY2VzCi0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLklOUFVUX0NPREVTRVQsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZGVmYXVsdEVuYyA9ICJVVEYtOCI7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3lzdGVtRW5jID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHN5c3RlbUVuYyAhPSBudWxsKSB7Ci0JCQlkZWZhdWx0RW5jID0gQ29tbW9uQ2hhcnNldE5hbWVzLmdldFByZWZlcnJlZERlZmF1bHRJYW5hTmFtZShzeXN0ZW1FbmMsICJVVEYtOCIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlub2RlLnB1dChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCwgZGVmYXVsdEVuYyk7Ci0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkVORF9PRl9MSU5FX0NPREUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBR19OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQotCQkvLyB0aGlzIGNvdWxkIGJlIG1hZGUgc21hcnRlciBieSBhY3R1YWxseSBsb29raW5nIHVwIHRoZSBjb250ZW50Ci0JCS8vIHR5cGUncyB2YWxpZCBleHRlbnNpb25zCi0JCW5vZGUucHV0KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OLCAiaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlpbml0aWFsaXplVmFsaWRhdGlvblByZWZlcmVuY2VzKG5vZGUpOwotCX0KLQkKLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgZGVmYXVsdCB2YWxpZGF0aW9uIHByZWZlcmVuY2VzCi0JICogQHBhcmFtIG5vZGUgdGhlIEVjbGlwc2UgcHJlZmVyZW5jZSBub2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uUHJlZmVyZW5jZXMoSUVjbGlwc2VQcmVmZXJlbmNlcyBub2RlKSB7Ci0JCS8vIEF0dHJpYnV0ZXMKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX1VOREVGSU5FRF9OQU1FLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX1VOREVGSU5FRF9WQUxVRSwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9OQU1FX01JU01BVENILCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX0lOVkFMSURfTkFNRSwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9JTlZBTElEX1ZBTFVFLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX0RVUExJQ0FURSwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9WQUxVRV9NSVNNQVRDSCwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfVkFMVUVfVU5DTE9TRUQsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQkKLQkJLy8gRWxlbWVudHMKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9VTktOT1dOX05BTUUsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0lOVkFMSURfTkFNRSwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX1NUQVJUX0lOVkFMSURfQ0FTRSwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fRU5EX0lOVkFMSURfQ0FTRSwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX01JU1NJTkdfU1RBUlQsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9NSVNTSU5HX0VORCwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fVU5ORUNFU1NBUllfRU5ELCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9JTlZBTElEX0RJUkVDVElWRSwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0lOVkFMSURfQ09OVEVOVCwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fRFVQTElDQVRFLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9DT0VYSVNURU5DRSwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fVU5DTE9TRURfU1RBUlRfVEFHLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fVU5DTE9TRURfRU5EX1RBRywgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0lOVkFMSURfRU1QVFlfVEFHLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJCi0JCS8vIERPQ1RZUEUKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRE9DX0RVUExJQ0FURSwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5ET0NfSU5WQUxJRF9DT05URU5ULCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRE9DX0RPQ1RZUEVfVU5DTE9TRUQsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJCi0JCS8vIFRleHQKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEVYVF9JTlZBTElEX0NPTlRFTlQsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5URVhUX0lOVkFMSURfQ0hBUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCQotCQkvLyBDb21tZW50Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTU1FTlRfSU5WQUxJRF9DT05URU5ULCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NTUVOVF9VTkNMT1NFRCwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQkKLQkJLy8gQ0RBVEEKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0RBVEFfSU5WQUxJRF9DT05URU5ULCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0RBVEFfVU5DTE9TRUQsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJCi0JCS8vIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb25zCi0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlBJX0lOVkFMSURfQ09OVEVOVCwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlBJX1VOQ0xPU0VELCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCQotCQkvLyBFbnRpdHkgUmVmZXJlbmNlCi0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlJFRl9VTkRFRklORUQsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5SRUZfSU5WQUxJRF9DT05URU5ULCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGQzNjQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBDb21tb24gcHJlZmVyZW5jZSBrZXlzIHVzZWQgYnkgSFRNTCBjb3JlCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMgewotCXByaXZhdGUgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMoKSB7Ci0JCS8vIGVtcHR5IHByaXZhdGUgY29uc3RydWN0b3Igc28gdXNlcnMgY2Fubm90IGluc3RhbnRpYXRlIGNsYXNzCi0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZXh0ZW5zaW9uIHRvIHVzZSB3aGVuIG5vbmUgaXMgc3BlY2lmaWVkIGluIHRoZSBOZXcgSFRNTAotCSAqIEZpbGUgV2l6YXJkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWFRFTlNJT04gPSAiZGVmYXVsdEV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBtYXhpbXVtIHdpZHRoIG9mIGEgbGluZSBiZWZvcmUgYSBsaW5lIHNwbGl0IGlzIG5lZWRlZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkludGVnZXI8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1dJRFRIID0gImxpbmVXaWR0aCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIGFsbCBibGFua3MgbGluZXMgc2hvdWxkIGJlIGNsZWFyZWQgZHVyaW5nIGZvcm1hdHRpbmcuCi0JICogQmxhbmsgbGluZXMgd2lsbCBiZSBrZXB0IHdoZW4gZmFsc2UuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVJfQUxMX0JMQU5LX0xJTkVTID0gImNsZWFyQWxsQmxhbmtMaW5lcyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiAjSU5ERU5UQVRJT05fQ0hBUiBmb3IgMSBpbmRlbnRhdGlvbi4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkludGVnZXI8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFTlRBVElPTl9TSVpFID0gImluZGVudGF0aW9uU2l6ZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNoYXJhY3RlciB1c2VkIGZvciBpbmRlbnRhdGlvbi4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7VEFCLCBTUEFDRX0KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERU5UQVRJT05fQ0hBUiA9ICJpbmRlbnRhdGlvbkNoYXIiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZSAjSU5ERU5UQVRJT05fQ0hBUi4gSW5kaWNhdGVzIHRvIHVzZQotCSAqIHRhYiBjaGFyYWN0ZXIgd2hlbiBmb3JtYXR0aW5nLgotCSAqIAotCSAqIEBzZWUgI1NQQUNFCi0JICogQHNlZSAjSU5ERU5UQVRJT05fQ0hBUgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQiA9ICJ0YWIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UgI0lOREVOVEFUSU9OX0NIQVIuIEluZGljYXRlcyB0byB1c2UKLQkgKiBzcGFjZSBjaGFyYWN0ZXIgd2hlbiBmb3JtYXR0aW5nLgotCSAqIAotCSAqIEBzZWUgI1RBQgotCSAqIEBzZWUgI0lOREVOVEFUSU9OX0NIQVIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRSA9ICJzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiB0YWdzIHdpdGggbXVsdGlwbGUgYXR0cmlidXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkCi0JICogKHNwbGl0dGluZyBlYWNoIGF0dHIgb24gYSBuZXcgbGluZSkuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BMSVRfTVVMVElfQVRUUlMgPSAic3BsaXRNdWx0aUF0dHJzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgZW5kIGJyYWNrZXRzIG9mIHN0YXJ0IHRhZ3Mgc2hvdWxkIGJlIHBsYWNlZCBvbiBhIG5ldyBsaW5lCi0JICogaWYgdGhlIHN0YXJ0IHRhZyBzcGFucyBtb3JlIHRoYW4gb25lIGxpbmUuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fRU5EX0JSQUNLRVQgPSAiYWxpZ25FbmRCcmFja2V0IjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgY2xlYW51cCBwcm9jZXNzb3Igc2hvdWxkIGZvcm1hdCBzb3VyY2UuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX1NPVVJDRSA9ICJmb3JtYXRTb3VyY2UiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBlbXB0eSBlbGVtZW50cyBzaG91bGQgYmUgY29tcHJlc3NlZCBkdXJpbmcKLQkgKiBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBSRVNTX0VNUFRZX0VMRU1FTlRfVEFHUyA9ICJjb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBpbnNlcnQgcmVxdWlyZWQgYXR0cmlidXRlcyBkdXJpbmcgY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNFUlRfUkVRVUlSRURfQVRUUlMgPSAiaW5zZXJ0UmVxdWlyZWRBdHRycyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIGluc2VydCBtaXNzaW5nIHRhZ3MgZHVyaW5nIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TRVJUX01JU1NJTkdfVEFHUyA9ICJpbnNlcnRNaXNzaW5nVGFncyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIHF1b3RlIGFsbCBhdHRyaWJ1dGUgdmFsdWVzIGR1cmluZyBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVT1RFX0FUVFJfVkFMVUVTID0gInF1b3RlQXR0clZhbHVlcyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIGNvbnZlcnQgYWxsIGxpbmUgZGVsaW1pdGVycyBkdXJpbmcgY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJUX0VPTF9DT0RFUyA9ICJjb252ZXJ0RU9MQ29kZXMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB0aGUgbGluZSBkZWxpbWl0ZXIgdG8gdXNlIGR1cmluZyBjbGVhbnVwIGlmIGNvbnZlcnRpbmcgbGluZQotCSAqIGRlbGltaXRlcnMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge0NSLCBDUkxGLCBMRiwgTk9fVFJBTlNMQVRJT059Ci0JICogPC9wPgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFOVVBfRU9MX0NPREUgPSAiY2xlYW51cEVPTENvZGUiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBjYXNlIHRvIHVzZSBvbiBhbGwgdGFnIG5hbWVzIGR1cmluZyBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+SW50ZWdlcjwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7TE9XRVIsIFVQUEVSLCBBU0lTfQotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTlVQX1RBR19OQU1FX0NBU0UgPSAiY2xlYW51cFRhZ05hbWVDYXNlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgY2FzZSB0byB1c2Ugb24gYWxsIGF0dHJpYnV0ZSBuYW1lcyBkdXJpbmcgY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkludGVnZXI8L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge0xPV0VSLCBVUFBFUiwgQVNJU30KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9BVFRSX05BTUVfQ0FTRSA9ICJjbGVhbnVwQXR0ck5hbWVDYXNlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcmVmZXJyZWQgbWFya3VwIGNhc2UgZm9yIHRhZyBuYW1lcyBpbiBjb2RlIGdlbmVyYXRpb24KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkludGVnZXI8L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge0xPV0VSLCBVUFBFUn0KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUVfQ0FTRSA9ICJ0YWdOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJlZmVycmVkIG1hcmt1cCBjYXNlIGZvciBhdHRyaWJ1dGUgbmFtZXMgaW4gY29kZSBnZW5lcmF0aW9uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHtMT1dFUiwgVVBQRVJ9Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DQVNFID0gImF0dHJOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlICNUQUdfTkFNRV9DQVNFIG9yICNBVFRSX05BTUVfQ0FTRS4KLQkgKiBJbmRpY2F0ZXMgdG8gbGVhdmUgY2FzZSBhcyBpcy4KLQkgKiAKLQkgKiBAc2VlICNMT1dFUgotCSAqIEBzZWUgI1VQUEVSCi0JICogQHNlZSAjVEFHX05BTUVfQ0FTRQotCSAqIEBzZWUgI0FUVFJfTkFNRV9DQVNFCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNJUyA9IDA7Ci0KLQkvKioKLQkgKiBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UgI1RBR19OQU1FX0NBU0Ugb3IgI0FUVFJfTkFNRV9DQVNFLgotCSAqIEluZGljYXRlcyB0byBtYWtlIG5hbWUgbG93ZXJjYXNlLgotCSAqIAotCSAqIEBzZWUgI0FTSVMKLQkgKiBAc2VlICNVUFBFUgotCSAqIEBzZWUgI1RBR19OQU1FX0NBU0UKLQkgKiBAc2VlICNBVFRSX05BTUVfQ0FTRQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPV0VSID0gMTsKLQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZSAjVEFHX05BTUVfQ0FTRSBvciAjQVRUUl9OQU1FX0NBU0UuCi0JICogSW5kaWNhdGVzIHRvIG1ha2UgbmFtZSB1cHBlcmNhc2UuCi0JICogCi0JICogQHNlZSAjTE9XRVIKLQkgKiBAc2VlICNBU0lTCi0JICogQHNlZSAjVEFHX05BTUVfQ0FTRQotCSAqIEBzZWUgI0FUVFJfTkFNRV9DQVNFCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVBQRVIgPSAyOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9QUk9KRUNUX1NFVFRJTkdTID0gInVzZS1wcm9qZWN0LXNldHRpbmdzIjsvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1VOREVGSU5FRF9OQU1FID0gImF0dHJVbmRlZk5hbWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVU5ERUZJTkVEX1ZBTFVFID0gImF0dHJVbmRlZlZhbHVlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX05BTUVfTUlTTUFUQ0ggPSAiYXR0ck5hbWVNaXNtYXRjaCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9JTlZBTElEX05BTUUgPSAiYXR0ckludmFsaWROYW1lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0lOVkFMSURfVkFMVUUgPSAiYXR0ckludmFsaWRWYWx1ZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9EVVBMSUNBVEUgPSAiYXR0ckR1cGxpY2F0ZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9WQUxVRV9NSVNNQVRDSCA9ICJhdHRyVmFsdWVNaXNtYXRjaCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9WQUxVRV9VTkNMT1NFRCA9ICJhdHRyVmFsdWVVbmNsb3NlZCI7Ly8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fVU5LTk9XTl9OQU1FID0gImVsZW1Vbmtub3duTmFtZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fSU5WQUxJRF9OQU1FID0gImVsZW1JbnZhbGlkTmFtZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fU1RBUlRfSU5WQUxJRF9DQVNFID0gImVsZW1TdGFydEludmFsaWRDYXNlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9FTkRfSU5WQUxJRF9DQVNFID0gImVsZW1FbmRJbnZhbGlkQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTUlTU0lOR19TVEFSVCA9ICJlbGVtTWlzc2luZ1N0YXJ0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9NSVNTSU5HX0VORCA9ICJlbGVtTWlzc2luZ0VuZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fVU5ORUNFU1NBUllfRU5EID0gImVsZW1Vbm5lY2Vzc2FyeUVuZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fSU5WQUxJRF9ESVJFQ1RJVkUgPSAiZWxlbUludmFsaWREaXJlY3RpdmUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0lOVkFMSURfQ09OVEVOVCA9ICJlbGVtSW52YWxpZENvbnRlbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0RVUExJQ0FURSA9ICJlbGVtRHVwbGljYXRlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9DT0VYSVNURU5DRSA9ICJlbGVtQ29leGlzdGVuY2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1VOQ0xPU0VEX1NUQVJUX1RBRyA9ICJlbGVtVW5jbG9zZWRTdGFydFRhZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fVU5DTE9TRURfRU5EX1RBRyA9ICJlbGVtVW5jbG9zZWRFbmRUYWciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0lOVkFMSURfRU1QVFlfVEFHID0gImVsZW1JbnZhbGlkRW1wdHlUYWciOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NfRFVQTElDQVRFID0gImRvY0R1cGxpY2F0ZVRhZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ19JTlZBTElEX0NPTlRFTlQgPSAiZG9jSW52YWxpZENvbnRlbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NfRE9DVFlQRV9VTkNMT1NFRCA9ICJkb2NEb2N0eXBlVW5jbG9zZWQiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0lOVkFMSURfQ09OVEVOVCA9ICJkb2NJbnZhbGlkQ29udGVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfSU5WQUxJRF9DSEFSID0gImRvY0ludmFsaWRDaGFyIjsvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9JTlZBTElEX0NPTlRFTlQgPSAiY29tbWVudEludmFsaWRDb250ZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9VTkNMT1NFRCA9ICJjb21tZW50VW5jbG9zZWQiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQV9JTlZBTElEX0NPTlRFTlQgPSAiY2RhdGFJbnZhbGlkQ29udGVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX1VOQ0xPU0VEID0gImNkYXRhVW5jbG9zZWQiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9JTlZBTElEX0NPTlRFTlQgPSAicGlJbnZhbGlkQ29udGVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX1VOQ0xPU0VEID0gInBpVW5jbG9zZWQiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZfSU5WQUxJRF9DT05URU5UID0gInJlZkludmFsaWRDb250ZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGX1VOREVGSU5FRCA9ICJwaVVuZGVmaW5lZCI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUw0ME5hbWVzcGFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUw0ME5hbWVzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDFhNTNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9IVE1MNDBOYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9IVE1MQ01Qcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSFRNTENNUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDdhNzUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9IVE1MQ01Qcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLQotLyoqCi0gKiBIVE1MQ01Qcm9wZXJ0aWVzIGRlZmluZXMgYWxsIHByb3BlcnR5IG5hbWVzIGFuZCBwcmUtZGVmaW5lZCB2YWx1ZXMgaW4gSFRNTCBDTS4KLSAqIEFsbCBvZiB0aG9zZSBwcm9wZXJ0aWVzIGNhbiBiZSByZXRyZWl2ZWQgZnJvbSBlbGVtZW50IGRlY2xhcmF0aW9ucyBvZiBIVE1MIENNCi0gKiB2aWEgQ01Ob2RlI2dldFByb3BlcnR5KFN0cmluZyBwcm9wTmFtZSkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTENNUHJvcGVydGllcyB7Ci0KLQkvKioKLQkgKiAic2hvdWxkSWdub3JlQ2FzZSIgcmV0dXJucyBqYXZhLmxhbmcuQm9vbGVhbiBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPVUxEX0lHTk9SRV9DQVNFID0gInNob3VsZElnbm9yZUNhc2UiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAic2hvdWxkS2VlcFNwYWNlIiByZXR1cm5zIGphdmEubGFuZy5Cb29sZWFuIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9VTERfS0VFUF9TUEFDRSA9ICJzaG91bGRLZWVwU3BhY2UiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAiaW5kZW50Q2hpbGRTb3VyY2UiIHJldHVybnMgamF2YS5sYW5nLkJvb2xlYW4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1VMRF9JTkRFTlRfQ0hJTERfU09VUkNFID0gInNob3VsZEluZGVudENoaWxkU291cmNlIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogInRlcm1pbmF0b3JzIiByZXR1cm5zIGphdmEudXRpbC5JdGVyYXRvciAoYW4gYXJyYXkgb2YgU3RyaW5nIG9iamVjdHMpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1JTkFUT1JTID0gInRlcm1pbmF0b3JzIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogImNvbnRlbnRIaW50IiByZXR1cm5zIENNRWxlbWVudERlY2xhcmF0aW9uIGluc3RuYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfSElOVCA9ICJjb250ZW50SGludCI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJwcm9oaWJpdGVkQW5jZXN0b3JzIiByZXR1cm5zIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXAuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSElCSVRFRF9BTkNFU1RPUlMgPSAicHJvaGliaXRlZEFuY2VzdG9ycyI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJpc0pTUCIgcmV0dXJucyBqYXZhLmxhbmcuQm9vbGVhbiBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfSlNQID0gImlzSlNQIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogImlzWEhUTUwiIHJldHVybnMgamF2YS5sYW5nLkJvb2xlYW4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX1hIVE1MID0gImlzWEhUTUwiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAiaXNTU0kiIHJldHVybnMgamF2YS5sYW5nLkJvb2xlYW4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX1NTSSA9ICJpc1NTSSI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJsaW5lQnJlYWtIaW50IiByZXR1cm5zIFN0cmluZyAob25lIG9mIHByZS1kZWZpbmVkIHZhbHVlcyBpbiBWYWx1ZXMpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfQlJFQUtfSElOVCA9ICJsaW5lQnJlYWtIaW50IjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogImxheW91dFR5cGUiIHJldHVybnMgU3RyaW5nIChvbmUgb2YgcHJlLWRlZmluZWQgdmFsdWVzIGluIFZhbHVlcykuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX1RZUEUgPSAibGF5b3V0VHlwZSI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJ0YWdJbmZvIiByZXR1cm5zIFN0cmluZyAoZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBlbGVtZW50KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdJTkZPID0gInRhZ0luZm8iOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAib21pdFR5cGUiIHJldHVybnMgU3RyaW5nIChvbmUgb2YgcHJlLWRlZmluZWQgdmFsdWVzIGluIFZhbHVlcykuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT01JVF9UWVBFID0gIm9taXRUeXBlIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogImluY2x1c2lvbiIgcmV0dXJucyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVVNJT04gPSAiaW5jbHVzaW9uIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogImlzU2NyaXB0YWJsZSIgcmV0dXJucyBqYXZhLmxhbmcuQm9vbGVhbiBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfU0NSSVBUQUJMRSA9ICJpc1NjcmlwdGFibGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWx1ZXMgewotCQkvKgotCQkgKiBmb3IgTElORV9CUkVBS19ISU5UID0gImxpbmVCcmVha0hpbnQiLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJFQUtfTk9ORSA9ICJicmVha05vbmUiOy8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJFQUtfQUZURVJfU1RBUlQgPSAiYnJlYWtBZnRlclN0YXJ0IjsvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EID0gImJyZWFrQmVmb3JlU3RhcnRBbmRBZnRlckVuZCI7Ly8kTk9OLU5MUy0xJAotCQkvKgotCQkgKiBmb3IgTEFZT1VUX1RZUEUgPSAibGF5b3V0VHlwZSIKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9CTE9DSyA9ICJsYXlvdXRCbG9jayI7Ly8kTk9OLU5MUy0xJAotCQkvKiogQlIgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX0JSRUFLID0gImxheW91dEJyZWFrIjsvLyROT04tTkxTLTEkCi0JCS8qKiBIaWRkZW4gb2JqZWN0OyBsaWtlIEhUTUwgb3IgSEVBRCAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfSElEREVOID0gImxheW91dEhpZGRlbiI7Ly8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfTk9ORSA9ICJsYXlvdXROb25lIjsvLyROT04tTkxTLTEkCi0JCS8qKiBObyB3cmFwIG9iamVjdDsgbGlrZSBJTUcsIEFQUExFVCwuLi4gKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX09CSkVDVCA9ICJsYXlvdXRPYmplY3QiOy8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX1dSQVAgPSAibGF5b3V0V3JhcCI7Ly8kTk9OLU5MUy0xJAotCQkvKgotCQkgKiBmb3IgT01JVF9UWVBFID0gIm9taXRUeXBlIgotCQkgKi8KLQkJLyoqIE5vdCBvbW1pc2libGUuICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NSVRfTk9ORSA9ICJvbWl0Tm9uZSI7Ly8kTk9OLU5MUy0xJAotCQkvKiogQm90aCB0YWdzIGFyZSBvbW1pc2libGUuICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NSVRfQk9USCA9ICJvbWl0Qm90aCI7Ly8kTk9OLU5MUy0xJAotCQkvKiogVGhlIGVuZCB0YWcgaXMgb21taXNpYmxlLiAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTUlUX0VORCA9ICJvbWl0RW5kIjsvLyROT04tTkxTLTEkCi0JCS8qKiBUaGUgZW5kIHRhZyBpcyBvbW1pdHRlZCB3aGVuIGNyZWF0ZWQuICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NSVRfRU5EX0RFRkFVTFQgPSAib21pdEVuZERlZmF1bHQiOy8vJE5PTi1OTFMtMSQKLQkJLyoqIFRoZSBlbmQgdGFnIG11c3QgYmUgb21pdHRlZC4gKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT01JVF9FTkRfTVVTVCA9ICJvbWl0RW5kTXVzdCI7Ly8kTk9OLU5MUy0xJAotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUxGaWxlc1ByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUxGaWxlc1ByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGJiMmVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9IVE1MRmlsZXNQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBub3QgdXNlZCBpbiBXVFAKLSAqLwotcHVibGljIGludGVyZmFjZSBIVE1MRmlsZXNQcmVmZXJlbmNlTmFtZXMgewotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NVRkZJWCA9ICJkZWZhdWx0U3VmZml4IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1NVRkZJWCA9ICJodG1sIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURV9ET0NVTUVOVF9UWVBFID0gImdlbmVyYXRlRG9jdW1lbnRUeXBlIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURV9HRU5FUkFUT1IgPSAiZ2VuZXJhdGVHZW5lcmF0b3IiOy8vJE5PTi1OTFMtMSQKLQkvLyBhZGRlZCB0aGlzIGFzIGEgcG90ZW50aWFsIHdheSB0byBoYW5kbGUgY2hhbmdpbmcKLQkvLyBwcm9kdWN0IG5hbWVzICJ1cCIgdGhlIHN0YWNrLiBOb3RlLCBub3QgZGVjbGFyZWQgZmluYWwgCi0JLy8gdG8gYXZvaWQgZ2V0dGluZyAnaW5saW5lZCcgYnkgY29tcGlsZXIuCi0Jc3RhdGljIElQcm9kdWN0IHByb2R1Y3QgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCk7Ci0JLy8gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpIGlzIHNwZWMnZCBzbyBpdCBtaWdodCByZXR1cm4gbnVsbC4KLQkvLyBJdHMgZXhwZWN0ZWQgZm9yIGFueSBmaW5hbCBwcm9kdWN0IGl0IHdvdWxkIG5vdCBiZSwgc28gd2UnbGwgcmV0dXJuIAotCS8vICJXVFAiIGZvciBkZXZlbG9wbWVudC9pbnRlcmltIGJ1aWxkcy4gTm8gbmVlZCB0byB0cmFuc2xhdGUuIAotCXN0YXRpYyBTdHJpbmcgR0VORVJBVE9SID0gKHByb2R1Y3QgPT0gbnVsbCkgPyAiV1RQIjogcHJvZHVjdC5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9IVE1MRm9ybWF0Q29udHJhaW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUxGb3JtYXRDb250cmFpbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMzIxN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUxGb3JtYXRDb250cmFpbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKiBQbGVhc2UgdW4tZGVwcmVjYXRlIHRoaXMgaWYgUGFnZSBEZXNpZ25lciB0aGlua3MgdGhleSBhcmUgbmVlZGVkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUxGb3JtYXRDb250cmFpbnRzIGV4dGVuZHMgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIHsKLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqIAlJdCdzIHZlcnkgaGFyZCB0byBrZWVwIHRoZSBhdmFpbGFibGUgbGluZSB3aWR0aCBhY2N1cmF0ZS4KLQkgKiAJU29tZXRpbWVzIGEgbm9kZSB3YW50cyB0byBzdGFydCBvbiBhIG5ldyBsaW5lLCBzb21ldGltZXMgaXQgZG9lc24ndC4KLQkgKiAJSXQncyBiZXN0IGZvciB0aGUgbm9kZSB0byBmaWd1cmUgb3V0IHRoZSBhdmFpbGFibGUgbGluZSB3aWR0aCBvbiB0aGUgZmx5LgotCSAqLwotCWludCBnZXRBdmFpbGFibGVMaW5lV2lkdGgoKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICogCUl0J3MgdmVyeSBoYXJkIHRvIGtlZXAgdGhlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIGFjY3VyYXRlLgotCSAqIAlTb21ldGltZXMgYSBub2RlIHdhbnRzIHRvIHN0YXJ0IG9uIGEgbmV3IGxpbmUsIHNvbWV0aW1lcyBpdCBkb2Vzbid0LgotCSAqIAlJdCdzIGJlc3QgZm9yIHRoZSBub2RlIHRvIGZpZ3VyZSBvdXQgdGhlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIG9uIHRoZSBmbHkuCi0JICovCi0Jdm9pZCBzZXRBdmFpbGFibGVMaW5lV2lkdGgoaW50IGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMTAxOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1ByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLQotcHVibGljIGludGVyZmFjZSBQcmVmZXJlbmNlTmFtZXMgewotCi0JU3RyaW5nIFRSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFlFUyA9ICJ5ZXMiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE5PID0gIm5vIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlTdHJpbmcgU0VUVElOR1MgPSAic2V0dGluZ3MiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVFJFRVZJRVcgPSAidHJlZXZpZXciOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFRkFVTFRfREVQVEggPSAiZGVmYXVsdGRlcHRoIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIEFTSVMgPSAiYXMtaXMiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIExPV0VSID0gImxvd2VyIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBVUFBFUiA9ICJ1cHBlciI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBQUkVGRVJSRURfQ0FTRSA9ICJwcmVmZXJyZWQtY2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVEFHTkFNRSA9ICJ0YWduYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSSUJVVEVOQU1FID0gImF0dHJpYnV0ZW5hbWUiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUZhbWlseUZvckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUZhbWlseUZvckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVmMTdmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVGYW1pbHlGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTsKLQotLyoqCi0gKiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkIGZpZWxkIG11c3QgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgaW4KLSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBzZXQgd2l0aCBkZWZhdWx0IHByb3RlY3RlZAotICogbWV0aG9kIHNvIGl0IHdpbGwgbm90IGJlIGlubGluZWQuCi0gKi8KLQotcHVibGljIGNsYXNzIENvbnRlbnRUeXBlRmFtaWx5Rm9ySFRNTCB7Ci0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZCBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluCi0JICogcGx1Z2luLnhtbCBmaWxlLiBOb3RlOiB0aGlzIHZhbHVlIGlzIGludGVudGlhbGx5IG5vdCBkZWNsYXJlZCBhcyBmaW5hbCwKLQkgKiBzbyBpdCB3aWxsIG5vdCBiZSBpbmxpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEhUTUxfRkFNSUxZID0gZ2V0Q29uc3RhbnRTdHJpbmcoKTsKLQotCS8qKgotCSAqIERvbid0IGFsbG93IGluc3RhbnRpYXRpb24uCi0JICovCi0JcHJpdmF0ZSBDb250ZW50VHlwZUZhbWlseUZvckhUTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0Jc3RhdGljIFN0cmluZyBnZXRDb25zdGFudFN0cmluZygpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRmYW1pbHkuaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NDkxMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlOwotCi0vKioKLSAqIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQgZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbgotICogcGx1Z2luLnhtbCBmaWxlLiBOb3RlOiB0aGlzIHZhbHVlIGlzIGludGVudGlhbGx5IHNldCB3aXRoIGRlZmF1bHQgcHJvdGVjdGVkCi0gKiBtZXRob2Qgc28gaXQgd2lsbCBub3QgYmUgaW5saW5lZC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQ29udGVudFR5cGVJZEZvckhUTUwgewotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQgZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbgotCSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBub3QgZGVjbGFyZWQgYXMgZmluYWwsCi0JICogc28gaXQgd2lsbCBub3QgYmUgaW5saW5lZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDb250ZW50VHlwZUlEX0hUTUwgPSBnZXRDb25zdGFudFN0cmluZygpOwotCi0JLyoqCi0JICogRG9uJ3QgYWxsb3cgaW5zdGFudGlhdGlvbi4KLQkgKi8KLQlwcml2YXRlIENvbnRlbnRUeXBlSWRGb3JIVE1MKCkgewotCQlzdXBlcigpOwotCX0KLQotCXN0YXRpYyBTdHJpbmcgZ2V0Q29uc3RhbnRTdHJpbmcoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSUhUTUxQYXJ0aXRpb25UeXBlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSUhUTUxQYXJ0aXRpb25UeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGY2MWRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lIVE1MUGFydGl0aW9uVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQuIEl0IGRlZmluZXMgdGhlIHBhcnRpdGlvbgotICogdHlwZXMgZm9yIEhUTUwuIENsaWVudHMgc2hvdWxkIHJlZmVyZW5jZSB0aGUgcGFydGl0aW9uIHR5cGUgU3RyaW5ncyBkZWZpbmVkCi0gKiBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAZGVwcmVjYXRlZCB1c2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9ucwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIVE1MUGFydGl0aW9uVHlwZXMgewotCi0JU3RyaW5nIEhUTUxfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFRkFVTFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEhUTUxfREVDTEFSQVRJT04gPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9ERUNMQVJBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSFRNTF9DT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfQ09NTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBTQ1JJUFQgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBUIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTVFlMRSA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5TVFlMRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIElTU1VFOiBJIHRoaW5rIG1ldGEgdGFnIGFyZWFzIGFyZSBoZXJlIHRvbz8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGRlNWM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50ZXh0LklDU1NQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Gb3JlaWduUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LklSZWdpb25Db21wYXJpYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLklTdHJ1Y3R1cmVkVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuU2NyaXB0TGFuZ3VhZ2VLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUw7Ci0KLS8qKgotICogRG9jdW1lbnQgcGFydGl0aW9uZXIgZm9yIEhUTUwuIENsaWVudC1zaWRlIHNjcmlwdHMgb2YgdHlwZSBKYXZhU2NyaXB0IGFyZQotICogcmVwb3J0ZWQgYXMgU1RfU0NSSVBULCBhbGwgb3RoZXJzIGZvciA8c2NyaXB0IGxhbmd1YWdlPSJmb28iIHR5cGU9ImZvbzIiPgotICogYXMgU0NSSVBULmxhbmd1YWdlOkZPTyBhbmQgU0NSSVBULnR5cGU6Rk9PMi4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MIGV4dGVuZHMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIGNvbmZpZ3VyZWRDb250ZW50VHlwZXMgPSBuZXcgU3RyaW5nW117SUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCwgSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVDTEFSQVRJT04sIElIVE1MUGFydGl0aW9ucy5IVE1MX0NPTU1FTlQsIElIVE1MUGFydGl0aW9ucy5TQ1JJUFQsIElDU1NQYXJ0aXRpb25zLlNUWUxFLElIVE1MUGFydGl0aW9ucy5TQ1JJUFRfRVZFTlRIQU5ETEVSfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFTQ1JJUFQgPSAiamF2YXNjcmlwdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBU0NSSVBUX0FQUExJQ0FUSU9OID0gImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFVkVOVF9BVFRSSUJVVEVfTkFNRVMgPSAKLQkJe0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05DTElDSywgCi0JCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05EQkxDTElDSywKLQkJSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTk1PVVNFRE9XTiwKLQkJSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTk1PVVNFVVAsCi0JCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05NT1VTRU9WRVIsCi0JCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05NT1VTRU1PVkUsCi0JCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05NT1VTRU9VVCwKLQkJSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTktFWVBSRVNTLAotCQlIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OS0VZRE9XTiwKLQkJSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTktFWVVQLAotCQlIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OSEVMUH07Ci0JCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZFR5cGVkUmVnaW9uIGNyZWF0ZVBhcnRpdGlvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdHlwZSkgewotCQlpZiAodHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHN0eXBlID0gZ2V0U2NyaXB0aW5nUGFydGl0aW9uVHlwZShub2RlKTsKLQkJCQlyZXR1cm4gc3VwZXIuY3JlYXRlUGFydGl0aW9uKG9mZnNldCwgbGVuZ3RoLCBzdHlwZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVBhcnRpdGlvbihvZmZzZXQsIGxlbmd0aCwgdHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW50ZXJuYWxQYXJ0aXRpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHR5cGUpIHsKLQkJU3RyaW5nIGxvY2FsVHlwZSA9IHR5cGU7Ci0JCWlmICh0eXBlID09IElIVE1MUGFydGl0aW9ucy5TQ1JJUFQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlsb2NhbFR5cGUgPSBnZXRTY3JpcHRpbmdQYXJ0aXRpb25UeXBlKG5vZGUpOwotCQkJfQotCQl9Ci0JCXN1cGVyLnNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgbGVuZ3RoLCBsb2NhbFR5cGUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFNjcmlwdGluZ1BhcnRpdGlvblR5cGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb3JlTm9kZSkgewotCQlTdHJpbmcgbGFuZ3VhZ2UgPSBudWxsOwotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0JCVN0cmluZyByZXN1bHQgPSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBjb3JlTm9kZTsKLQkJSVRleHRSZWdpb24gYXR0ck5hbWVSZWdpb24gPSBudWxsOwotCQl3aGlsZSAobm9kZSAhPSBudWxsICYmIGlzVmFsaWRTY3JpcHRpbmdSZWdpb25UeXBlKG5vZGUuZ2V0VHlwZSgpKSkgewotCQkJbm9kZSA9IG5vZGUuZ2V0UHJldmlvdXMoKTsKLQkJfQotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gbm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zLnNpemUoKSA+IDQgJiYgcmVnaW9ucy5nZXQoMSkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQlJVGV4dFJlZ2lvbiBwb3RlbnRpYWxMYW5ndWFnZVJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDEpOwotCQkJU3RyaW5nIHBvdGVudGlhbExhbmd1YWdlU3RyaW5nID0gbm9kZS5nZXRUZXh0KHBvdGVudGlhbExhbmd1YWdlUmVnaW9uKTsKLQkJCWlmIChwb3RlbnRpYWxMYW5ndWFnZVN0cmluZy5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkKLQkJCQkJCWF0dHJOYW1lUmVnaW9uID0gcmVnaW9uOwotCQkJCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCVN0cmluZyBhdHRyTmFtZSA9IG5vZGUuZ2V0VGV4dChhdHRyTmFtZVJlZ2lvbik7Ci0JCQkJCQlpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xBTkdVQUdFKSkKLQkJCQkJCQlsYW5ndWFnZSA9IFN0cmluZ1V0aWxzLnN0cmlwKG5vZGUuZ2V0VGV4dChyZWdpb24pKTsKLQkJCQkJCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFKSkgewotCQkJCQkJCXR5cGUgPSBTdHJpbmdVdGlscy5zdHJpcChub2RlLmdldFRleHQocmVnaW9uKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlhdHRyTmFtZVJlZ2lvbiA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHR5cGUgIT0gbnVsbCkKLQkJCXJlc3VsdCA9IGxvb2t1cFNjcmlwdFR5cGUodHlwZSk7Ci0JCWVsc2UgaWYgKGxhbmd1YWdlICE9IG51bGwpCi0JCQlyZXN1bHQgPSBsb29rdXBTY3JpcHRMYW5ndWFnZShsYW5ndWFnZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRTY3JpcHRpbmdSZWdpb25UeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCB8fCB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4gfHwgdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUIHx8IHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdExlZ2FsQ29udGVudFR5cGVzKCkgewotCQlmU3VwcG9ydGVkVHlwZXMgPSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgbG9va3VwU2NyaXB0VHlwZShTdHJpbmcgdHlwZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBU0NSSVBUX01JTUVfVFlQRV9LRVlTLmxlbmd0aDsgaSsrKQotCQkJaWYgKFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBU0NSSVBUX01JTUVfVFlQRV9LRVlTW2ldLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpCi0JCQkJcmV0dXJuIElIVE1MUGFydGl0aW9ucy5TQ1JJUFQ7Ci0JCXJldHVybiBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUICsgIi50eXBlLiIgKyB0eXBlLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgU3RyaW5nIGxvb2t1cFNjcmlwdExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBU0NSSVBUX0xBTkdVQUdFX0tFWVMubGVuZ3RoOyBpKyspCi0JCQlpZiAoU2NyaXB0TGFuZ3VhZ2VLZXlzLkpBVkFTQ1JJUFRfTEFOR1VBR0VfS0VZU1tpXS5lcXVhbHNJZ25vcmVDYXNlKGxhbmd1YWdlKSkKLQkJCQlyZXR1cm4gSUhUTUxQYXJ0aXRpb25zLlNDUklQVDsKLQkJcmV0dXJuIElIVE1MUGFydGl0aW9ucy5TQ1JJUFQgKyAiLmxhbmd1YWdlLiIgKyBsYW5ndWFnZS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4pCi0JCQlyZXN1bHQgPSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9DT01NRU5UOwotCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04gfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9PUEVOKQotCQkJcmVzdWx0ID0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVDTEFSQVRJT047Ci0JCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSAmJiBpc1NjcmlwdEF0dHJpYnV0ZVZhbHVlKHJlZ2lvbiwgb2Zmc2V0KSkKLQkJCXJlc3VsdCA9IElIVE1MUGFydGl0aW9ucy5TQ1JJUFRfRVZFTlRIQU5ETEVSOwotCQllbHNlCi0JCQlyZXN1bHQgPSBzdXBlci5nZXRQYXJ0aXRpb25UeXBlKHJlZ2lvbiwgb2Zmc2V0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNOb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHROb2RlKSB7Ci0JCQotCQlJVGV4dFJlZ2lvbiBwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIG5leHRFbmRUYWdOYW1lUmVnaW9uID0gbnVsbDsKLQkJCi0JCUlUZXh0UmVnaW9uW10gcmVnaW9ucyA9IHByZXZpb3VzTm9kZS5nZXRSZWdpb25zKCkudG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJcHJldmlvdXNTdGFydFRhZ05hbWVSZWdpb24gPSByZWdpb25zW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJlZ2lvbnMgPSBuZXh0Tm9kZS5nZXRSZWdpb25zKCkudG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJbmV4dEVuZFRhZ05hbWVSZWdpb24gPSByZWdpb25zW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlpZihwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbiA9PSBudWxsIHx8IG5leHRFbmRUYWdOYW1lUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVDsKLQkJCi0JCVN0cmluZyBuYW1lMSA9IHByZXZpb3VzTm9kZS5nZXRUZXh0KHByZXZpb3VzU3RhcnRUYWdOYW1lUmVnaW9uKTsKLQkJU3RyaW5nIG5hbWUyID0gbmV4dE5vZGUuZ2V0VGV4dChuZXh0RW5kVGFnTmFtZVJlZ2lvbik7Ci0JCWlmIChuYW1lMS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQpICYmIG5hbWUyLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVCkpCi0JCQkvLwkJCXJldHVybiBTVF9TQ1JJUFQ7Ci0JCQlyZXR1cm4gZ2V0U2NyaXB0aW5nUGFydGl0aW9uVHlwZShmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHByZXZpb3VzTm9kZS5nZXRTdGFydE9mZnNldChwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbikpKTsKLQkJZWxzZSBpZiAobmFtZTEuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUpICYmIG5hbWUyLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFKSkKLQkJCXJldHVybiBJQ1NTUGFydGl0aW9ucy5TVFlMRTsKLQkJcmV0dXJuIHN1cGVyLmdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKHByZXZpb3VzTm9kZSwgbmV4dE5vZGUpOwotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKEZvcmVpZ25SZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyB0YWduYW1lID0gcmVnaW9uLmdldFN1cnJvdW5kaW5nVGFnKCk7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyB0YWduYW1lIHNob3VsZCBub3QgYmUgbnVsbCwKLQkJLy8gYnV0IHNlZSBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDkxMQotCQlpZiAodGFnbmFtZSA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRVbmtub3duKCk7Ci0JCX0KLQkJZWxzZSBpZiAodGFnbmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQpKQotCQkJcmVzdWx0ID0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVDsKLQkJZWxzZSBpZiAodGFnbmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSkpCi0JCQlyZXN1bHQgPSBJQ1NTUGFydGl0aW9ucy5TVFlMRTsKLQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFICYmIGlzU2NyaXB0QXR0cmlidXRlVmFsdWUocmVnaW9uLCBvZmZzZXQpKQotCQkJcmVzdWx0ID0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVF9FVkVOVEhBTkRMRVI7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IHN1cGVyLmdldFBhcnRpdGlvblR5cGUocmVnaW9uLCBvZmZzZXQpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQ7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcygpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1NjcmlwdEF0dHJpYnV0ZVZhbHVlKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlpZiAocmVnaW9uLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBpc0F0dHJpYnV0ZU5hbWVGb3JWYWx1ZUFuRXZlbnRTY3JpcHQocmVnaW9uLCBvZmZzZXQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0F0dHJpYnV0ZU5hbWVGb3JWYWx1ZUFuRXZlbnRTY3JpcHQoSVRleHRSZWdpb24gYXR0clZhbHVlUmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbkxpc3QgPSBub2RlLmdldFJlZ2lvbnMoKTsKLQkJaW50IGN1cnJlbnRJbmRleCA9IHJlZ2lvbkxpc3QuaW5kZXhPZihhdHRyVmFsdWVSZWdpb24pOwotCi0JCS8qCi0JCSAqIDQgaXMgdGhlIG1pbmltdW0gaW5kZXggYWxsb3dpbmcgZm9yIHRoZSB0YWcncyBvcGVuLCBuYW1lLCBhdHRyaWJ1dGUKLQkJICogbmFtZSBhbmQgZXF1YWxzIGNoYXJhY3RlciB0byBhcHBlYXIgZmlyc3QKLQkJICovCi0JCWlmIChjdXJyZW50SW5kZXggPCA0KQotCQkJcmV0dXJuIGZhbHNlOwotCQlJVGV4dFJlZ2lvbiB0YWdBdHRyTmFtZVJlZ2lvbiA9IHJlZ2lvbkxpc3QuZ2V0KGN1cnJlbnRJbmRleCAtIDIpOwotCQkKLQkJYm9vbGVhbiBpc0V2ZW50ID0gZmFsc2U7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50IGluc3RhbmNlb2YgSVJlZ2lvbkNvbXBhcmlibGUpIHsKLQkJCWludCBzdGFydCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQodGFnQXR0ck5hbWVSZWdpb24pOwotCQkJZm9yIChpbnQgaSA9IDA7ICFpc0V2ZW50ICYmIGkgPCBFVkVOVF9BVFRSSUJVVEVfTkFNRVMubGVuZ3RoOyBpKyspIHsKLQkJCQlpc0V2ZW50ID0gKChJUmVnaW9uQ29tcGFyaWJsZSkgZlN0cnVjdHVyZWREb2N1bWVudCkucmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2Uoc3RhcnQsIHRhZ0F0dHJOYW1lUmVnaW9uLmdldFRleHRMZW5ndGgoKSwgRVZFTlRfQVRUUklCVVRFX05BTUVTW2ldKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyB0YWdBdHRyTmFtZSA9IG5vZGUuZ2V0VGV4dCh0YWdBdHRyTmFtZVJlZ2lvbik7Ci0JCQlpc0V2ZW50ID0gU3RyaW5nVXRpbHMuY29udGFpbnMoRVZFTlRfQVRUUklCVVRFX05BTUVTLCB0YWdBdHRyTmFtZSwgZmFsc2UpOwotCQl9Ci0JCXJldHVybiBpc0V2ZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9BYnN0cmFjdEVycm9ySW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Fic3RyYWN0RXJyb3JJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOWQ4NWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Fic3RyYWN0RXJyb3JJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5FcnJvckluZm87Ci0KLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0RXJyb3JJbmZvIGltcGxlbWVudHMgRXJyb3JJbmZvLCBFcnJvclN0YXRlIHsKLQotCi0JcHJpdmF0ZSBpbnQgc3RhdGUgPSBOT05FX0VSUk9SOwotCXByaXZhdGUgU2VnbWVudCBzZWcgPSBudWxsOwotCi0JcHVibGljIEFic3RyYWN0RXJyb3JJbmZvKGludCBzdGF0ZSwgU2VnbWVudCBzZWcpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zdGF0ZSA9IHN0YXRlOwotCQl0aGlzLnNlZyA9IHNlZzsKLQl9Ci0KLQlhYnN0cmFjdCBwdWJsaWMgU3RyaW5nIGdldEhpbnQoKTsKLQotCWFic3RyYWN0IHB1YmxpYyBzaG9ydCBnZXRUYXJnZXRUeXBlKCk7Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIChzZWcgPT0gbnVsbCkgPyAwIDogc2VnLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gKHNlZyA9PSBudWxsKSA/IDAgOiBzZWcuZ2V0T2Zmc2V0KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGF0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3RhdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0NNVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0NNVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODA5YWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9DTVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5LkhNUVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1maW5hbCBjbGFzcyBDTVV0aWwgewotCi0JLyoqCi0JICogTmV2ZXIgaW5zdGFudGlhdGUhCi0JICovCi0JcHJpdmF0ZSBDTVV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogWW91IGNhbm5vdCBhbHdheXMgcmV0cmlldmUgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiB2aWEgYW4gRWxlbWVudCBpbnN0YW5jZS4KLQkgKiBCZWNhdXNlLCBpdCBvY2Nhc2lvbmFsbHkgYSBKU1AgY3VzdG9tIHRhZy4gLS0gOS83LzIwMDEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlY2xhcmF0aW9uKEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCURvY3VtZW50IGRvYyA9IHRhcmdldC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCU1vZGVsUXVlcnkgcXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvYyk7Ci0JCXJldHVybiBxdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbih0YXJnZXQpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUoQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCkgewotCQlpZiAoZGVjbCA9PSBudWxsIHx8ICghZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gISgoQm9vbGVhbikgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDaGlsZChDTUNvbnRlbnQgY29udGVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gdGFyZ2V0KSB7Ci0JCXN3aXRjaCAoY29udGVudC5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLQkJCQlpZiAoaXNXaG9sZVRhZ09taXNzaWJsZSgoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNvbnRlbnQpKQotCQkJCQlpZiAoaXNDaGlsZCgoKENNRWxlbWVudERlY2xhcmF0aW9uKSBjb250ZW50KS5nZXRDb250ZW50KCksIHRhcmdldCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gaXNTYW1lRGVjbGFyYXRpb24oKENNRWxlbWVudERlY2xhcmF0aW9uKSBjb250ZW50LCB0YXJnZXQpOwotCQkJY2FzZSBDTU5vZGUuR1JPVVAgOgotCQkJCUNNTm9kZUxpc3QgY2hpbGRyZW4gPSAoKENNR3JvdXApIGNvbnRlbnQpLmdldENoaWxkTm9kZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJQ01Ob2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCQkJc3dpdGNoIChjaGlsZC5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJCQljYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLQkJCQkJCQlpZiAoaXNXaG9sZVRhZ09taXNzaWJsZSgoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNoaWxkKSkKLQkJCQkJCQkJaWYgKGlzQ2hpbGQoKChDTUVsZW1lbnREZWNsYXJhdGlvbikgY2hpbGQpLmdldENvbnRlbnQoKSwgdGFyZ2V0KSkKLQkJCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCWlmIChpc1NhbWVEZWNsYXJhdGlvbigoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNoaWxkLCB0YXJnZXQpKQotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQljb250aW51ZTsgLy8gR28gbmV4dCBjaGlsZC4KLQkJCQkJCWNhc2UgQ01Ob2RlLkdST1VQIDoKLQkJCQkJCQlpZiAoaXNDaGlsZCgoQ01Db250ZW50KSBjaGlsZCwgdGFyZ2V0KSkKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJY29udGludWU7IC8vIEdvIG5leHQgY2hpbGQuCi0JCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQljb250aW51ZTsgLy8gR28gbmV4dCBjaGlsZC4KLQkJCQkJfQotCQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW5kVGFnT21pc3NpYmxlKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKCEoZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgb21pdFR5cGUgPSAoU3RyaW5nKSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuT01JVF9UWVBFKTsKLQkJcmV0dXJuICFvbWl0VHlwZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9OT05FKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXaG9sZVRhZ09taXNzaWJsZShDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCWlmICghKGRlY2wuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIG9taXRUeXBlID0gKFN0cmluZykgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSk7Ci0JCXJldHVybiBvbWl0VHlwZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9CT1RIKTsKLQl9Ci0JCi0JLyoqCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSlNQKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKCFkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuSVNfSlNQKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICgoQm9vbGVhbikgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX0pTUCkpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1hIVE1MKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKCFkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKChCb29sZWFuKSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbWV0aG9kIHRvIGRpc3Rpbmd1aXNoIEhUTUwgYW5kIFhIVE1MIGZyb20gb3RoZXIgbWFyayB1cC4KLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHRhcmdldCBpcywKLQkgKiAoMSkgbm90IEpTUCwKLQkgKiAoMikgbm90IFNTSS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIVE1MKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJcmV0dXJuICghaXNKU1AoZGVjbCkpICYmICghaXNTU0koZGVjbCkpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTYW1lRGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gYURlYywgQ01FbGVtZW50RGVjbGFyYXRpb24gb3RoZXJEZWMpIHsKLQkJcmV0dXJuIGFEZWMuZ2V0RWxlbWVudE5hbWUoKSA9PSBvdGhlckRlYy5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NTSShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZGVjKSB7Ci0JCWlmIChlZGVjID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghZWRlYy5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1NTSSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoKEJvb2xlYW4pIGVkZWMuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5JU19TU0kpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsIHRoaXMgbWV0aG9kIG9ubHkgd2hlbiB0aGUgcGFyZW50IGNvbnRlbnQgdHlwZSBpcyBvbmUgb2YKLQkgKiB0aGUgZm9sbG93aW5nOiBBTlksIEVMRU1FTlQsIG9yIE1JWEVELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQ2hpbGQoQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBjaGlsZCkgewotCQlpZiAocGFyZW50ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlzSFRNTChwYXJlbnQpICYmICghaXNIVE1MKGNoaWxkKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJQ01Db250ZW50IGNvbnRlbnQgPSBwYXJlbnQuZ2V0Q29udGVudCgpOwotCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaXNDaGlsZChjb250ZW50LCBjaGlsZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRm9yZWlnbihFbGVtZW50IHRhcmdldCkgewotCQlpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgdGFyZ2V0OwotCQlyZXR1cm4gIWVsZW1lbnQuaXNHbG9iYWxUYWcoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgYWxsIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCSAqICgxKSB2YWx1ZSB0eXBlIGlzIEVOVU0sCi0JICogKDIpIG9ubHkgb25lIHZhbHVlIGlzIGRlZmluZWQgaW4gdGhlIGVudW1lcmF0aW9uLAotCSAqICgzKSB0aGUgdmFsdWUgaGFzIHNhbWUgbmFtZSB0byB0aGUgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQm9vbGVhbkF0dHIoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjKSB7Ci0JCUNNRGF0YVR5cGUgYXR0cnR5cGUgPSBhZGVjLmdldEF0dHJUeXBlKCk7Ci0JCWlmIChhdHRydHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoYXR0cnR5cGUuZ2V0RGF0YVR5cGVOYW1lKCkgIT0gQ01EYXRhVHlwZS5FTlVNKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSBhdHRydHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0JCWlmICh2YWx1ZXMubGVuZ3RoICE9IDEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB2YWx1ZXNbMF0uZXF1YWxzKGFkZWMuZ2V0QXR0ck5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRJbmNsdXNpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCwgRWxlbWVudCBwYXJlbnQpIHsKLQkJSXRlcmF0b3IgaXRlciA9IEhNUVV0aWwuZ2V0SW5jbHVzaW9ucyhwYXJlbnQpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gaW5jbHVzaW9uID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBpdGVyLm5leHQoKTsKLQkJCWlmIChpc1NhbWVEZWNsYXJhdGlvbihkZWNsLCBpbmNsdXNpb24pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvQ29tcG9zaXRlVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvQ29tcG9zaXRlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZTc1MjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0NvbXBvc2l0ZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvblJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQ29tcG9uZW50OwotCi1hYnN0cmFjdCBjbGFzcyBDb21wb3NpdGVWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0aW9uQ29tcG9uZW50IHsKLQotCXByb3RlY3RlZCBWZWN0b3IgY29tcG9uZW50cyA9IG5ldyBWZWN0b3IoKTsKLQotCS8qKgotCSAqIENvbXBvc2l0ZVZhbGlkYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwb3J0ZXIoVmFsaWRhdGlvblJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnNldFJlcG9ydGVyKHJlcG9ydGVyKTsKLQotCQlJdGVyYXRvciBpID0gY29tcG9uZW50cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCVZhbGlkYXRpb25BZGFwdGVyIGNvbXBvbmVudCA9IChWYWxpZGF0aW9uQWRhcHRlcikgaS5uZXh0KCk7Ci0JCQlpZiAoY29tcG9uZW50ID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQljb21wb25lbnQuc2V0UmVwb3J0ZXIocmVwb3J0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSW5kZXhlZFJlZ2lvbiBub2RlKSB7Ci0JCUl0ZXJhdG9yIGkgPSBjb21wb25lbnRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJVmFsaWRhdGlvbkNvbXBvbmVudCBjb21wb25lbnQgPSAoVmFsaWRhdGlvbkNvbXBvbmVudCkgaS5uZXh0KCk7Ci0JCQlpZiAoY29tcG9uZW50ID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQljb21wb25lbnQudmFsaWRhdGUobm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIGFkZChWYWxpZGF0aW9uQ29tcG9uZW50IHZhbGlkYXRvcikgewotCQljb21wb25lbnRzLmFkZCh2YWxpZGF0b3IpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJlZ2lzdGVycyBhbGwgY29tcG9uZW50cyBpbiAndmFsaWRhdG9ycycuCi0JICogRWFjaCBkZXJpdmF0aXZlIG11c3QgY2FsbCB0aGlzIG1ldGhpZCBpbiBpdHMgY29uc3RydWN0b3IuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXIoVmFsaWRhdGlvbkNvbXBvbmVudFtdIHZhbGlkYXRvcnMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZGF0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodmFsaWRhdG9yc1tpXSAhPSBudWxsKQotCQkJCWFkZCh2YWxpZGF0b3JzW2ldKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9Eb2N1bWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvRG9jdW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjI5MTViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9Eb2N1bWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLkFic3RyYWN0UHJvcGFnYXRpbmdWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25Db21wb25lbnQ7Ci0KLWNsYXNzIERvY3VtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yIHsKLQotCi0JcHJpdmF0ZSBWYWxpZGF0aW9uQ29tcG9uZW50IHZhbGlkYXRvciA9IG5ldyBIVE1MU2ltcGxlRG9jdW1lbnRWYWxpZGF0b3IoKTsKLQlwcml2YXRlIEVsZW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvciBwcm9wYWdhdGVlID0gbmV3IEVsZW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvcigpOwotCi0JcHVibGljIERvY3VtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSW5kZXhlZFJlZ2lvbiBub2RlKSB7Ci0JCWdldFByb3BhZ2F0ZWUoKS5zZXRSZXBvcnRlcih0aGlzLnJlcG9ydGVyKTsKLQkJc3VwZXIudmFsaWRhdGUobm9kZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gRG9jdW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvci5jbGFzcyB8fCBzdXBlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXBvcnRlcihWYWxpZGF0aW9uUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIuc2V0UmVwb3J0ZXIocmVwb3J0ZXIpOwotCQl2YWxpZGF0b3Iuc2V0UmVwb3J0ZXIocmVwb3J0ZXIpOwotCQlwcm9wYWdhdGVlLnNldFJlcG9ydGVyKHJlcG9ydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVmFsaWRhdGlvbkNvbXBvbmVudCBnZXRQcm9wYWdhdGVlKCkgewotCQlyZXR1cm4gcHJvcGFnYXRlZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVmFsaWRhdGlvbkFkYXB0ZXIgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9FbGVtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9FbGVtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI5MGI2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvRWxlbWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLkFic3RyYWN0UHJvcGFnYXRpbmdWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25Db21wb25lbnQ7Ci0KLWNsYXNzIEVsZW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0UHJvcGFnYXRpbmdWYWxpZGF0b3IgewotCi0KLQlwcml2YXRlIFZhbGlkYXRpb25Db21wb25lbnQgdmFsaWRhdG9yID0gbmV3IEhUTUxTaW1wbGVWYWxpZGF0b3IoKTsKLQotCXB1YmxpYyBFbGVtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gRWxlbWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yLmNsYXNzIHx8IHN1cGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlcG9ydGVyKFZhbGlkYXRpb25SZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci5zZXRSZXBvcnRlcihyZXBvcnRlcik7Ci0JCXZhbGlkYXRvci5zZXRSZXBvcnRlcihyZXBvcnRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIFZhbGlkYXRpb25Db21wb25lbnQgZ2V0UHJvcGFnYXRlZSgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHJvdGVjdGVkIFZhbGlkYXRpb25BZGFwdGVyIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvRXJyb3JJbmZvSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Vycm9ySW5mb0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA5N2RhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvRXJyb3JJbmZvSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLWZpbmFsIGNsYXNzIEVycm9ySW5mb0ltcGwgZXh0ZW5kcyBBYnN0cmFjdEVycm9ySW5mbyB7Ci0KLQlwcml2YXRlIE5vZGUgdGFyZ2V0ID0gbnVsbDsKLQotCS8vCXByaXZhdGUgU2VnbWVudCBzZWcgPSBudWxsOwotCS8qKgotCSAqLwotCXB1YmxpYyBFcnJvckluZm9JbXBsKGludCBzdGF0ZSwgU2VnbWVudCBlcnJvclNlZywgTm9kZSB0YXJnZXQpIHsKLQkJc3VwZXIoc3RhdGUsIGVycm9yU2VnKTsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIaW50KCkgewotCQlzd2l0Y2ggKHRhcmdldC5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOgotCQkJCXN3aXRjaCAoZ2V0U3RhdGUoKSkgewotCQkJCQljYXNlIFVOREVGSU5FRF9WQUxVRV9FUlJPUiA6Ci0JCQkJCWNhc2UgTUlTTUFUQ0hFRF9WQUxVRV9FUlJPUiA6Ci0JCQkJCWNhc2UgVU5DTE9TRURfQVRUUl9WQUxVRSA6Ci0JCQkJCQkvL0QyMTA0MjIKLQkJCQkJCXJldHVybiAoKEF0dHIpIHRhcmdldCkuZ2V0VmFsdWUoKTsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQlyZXR1cm4gdGFyZ2V0LmdldE5vZGVOYW1lKCk7Ci0JCQkJfQotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0JCQkJcmV0dXJuICgoVGV4dCkgdGFyZ2V0KS5nZXREYXRhKCk7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiB0YXJnZXQuZ2V0Tm9kZU5hbWUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzaG9ydCBnZXRUYXJnZXRUeXBlKCkgewotCQlyZXR1cm4gdGFyZ2V0LmdldE5vZGVUeXBlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Vycm9yU3RhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9FcnJvclN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YWY0MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Vycm9yU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLQotaW50ZXJmYWNlIEVycm9yU3RhdGUgewotCXN0YXRpYyBmaW5hbCBpbnQgTk9ORV9FUlJPUiA9IDA7Ci0JLy8gZ2VuZXJpYyBlcnJvcgotCXN0YXRpYyBmaW5hbCBpbnQgVU5ERUZJTkVEX05BTUVfRVJST1IgPSAxMTsKLQlzdGF0aWMgZmluYWwgaW50IFVOREVGSU5FRF9WQUxVRV9FUlJPUiA9IDEyOwotCXN0YXRpYyBmaW5hbCBpbnQgTUlTTUFUQ0hFRF9WQUxVRV9FUlJPUiA9IDEzOwotCS8vIGZvcm1hdCBlcnJvcgotCXN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0VSUk9SX0xFVkVMID0gMTAwOwotCXN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9OQU1FX0VSUk9SID0gMTAxOwotCXN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9DSEFSX0VSUk9SID0gMTAyOwotCXN0YXRpYyBmaW5hbCBpbnQgTUlTTUFUQ0hFRF9FUlJPUiA9IDEwMzsKLQlzdGF0aWMgZmluYWwgaW50IE1JU01BVENIRURfRU5EX1RBR19FUlJPUiA9IDEwNDsKLQlzdGF0aWMgZmluYWwgaW50IE1JU1NJTkdfU1RBUlRfVEFHX0VSUk9SID0gMTA1OwotCXN0YXRpYyBmaW5hbCBpbnQgTUlTU0lOR19FTkRfVEFHX0VSUk9SID0gMTA2OwotCXN0YXRpYyBmaW5hbCBpbnQgVU5ORUNFU1NBUllfRU5EX1RBR19FUlJPUiA9IDEwNzsKLQlzdGF0aWMgZmluYWwgaW50IElOVkFMSURfQVRUUl9FUlJPUiA9IDEwODsKLQlzdGF0aWMgZmluYWwgaW50IElOVkFMSURfRElSRUNUSVZFX0VSUk9SID0gMTA5OwotCXN0YXRpYyBmaW5hbCBpbnQgVU5DTE9TRURfVEFHX0VSUk9SID0gMTEwOwotCXN0YXRpYyBmaW5hbCBpbnQgVU5DTE9TRURfRU5EX1RBR19FUlJPUiA9IDExMTsKLQlzdGF0aWMgZmluYWwgaW50IElOVkFMSURfRU1QVFlfRUxFTUVOVF9UQUcgPSAxMTI7Ci0Jc3RhdGljIGZpbmFsIGludCBVTkNMT1NFRF9BVFRSX1ZBTFVFID0gMTEzOyAvL0QyMTA0MjIKLQkvLyBsYXlvdXQgZXJyb3IKLQlzdGF0aWMgZmluYWwgaW50IExBWU9VVF9FUlJPUl9MRVZFTCA9IDEwMDA7Ci0Jc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0NPTlRFTlRfRVJST1IgPSAxMDAxOwotCXN0YXRpYyBmaW5hbCBpbnQgRFVQTElDQVRFX0VSUk9SID0gMTAwMjsKLQlzdGF0aWMgZmluYWwgaW50IENPRVhJU1RFTkNFX0VSUk9SID0gMTAwMzsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9GTVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9GTVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU0OGRlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvRk1VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotZmluYWwgY2xhc3MgRk1VdGlsIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNFR19OT05FID0gMDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTRUdfV0hPTEVfVEFHID0gMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTRUdfU1RBUlRfVEFHID0gMjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTRUdfRU5EX1RBRyA9IDM7Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIEZNVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFNlZ21lbnQgZ2V0U2VnbWVudChJRE9NTm9kZSB0YXJnZXQsIGludCBzZWdUeXBlKSB7Ci0JCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU2VnbWVudCgwLCAwKTsKLQkJU2VnbWVudCBzZWcgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWcgPSBudWxsOwotCQlzd2l0Y2ggKHNlZ1R5cGUpIHsKLQkJCWNhc2UgU0VHX1dIT0xFX1RBRyA6Ci0JCQkJc3RhcnRUYWcgPSB0YXJnZXQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoc3RhcnRUYWcgIT0gbnVsbCkgewotCQkJCQllbmRUYWcgPSB0YXJnZXQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlzZWcgPSBuZXcgU2VnbWVudChzdGFydFRhZywgZW5kVGFnKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWludCBzdGFydE9mZnNldCA9IHRhcmdldC5nZXRTdGFydE9mZnNldCgpOwotCQkJCQlpbnQgZW5kT2Zmc2V0ID0gdGFyZ2V0LmdldEVuZE9mZnNldCgpOwotCQkJCQlzZWcgPSBuZXcgU2VnbWVudChzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgU0VHX1NUQVJUX1RBRyA6Ci0JCQkJc3RhcnRUYWcgPSB0YXJnZXQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoc3RhcnRUYWcgIT0gbnVsbCkgewotCQkJCQlzZWcgPSBuZXcgU2VnbWVudChzdGFydFRhZyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzZWcgPSBuZXcgU2VnbWVudCh0YXJnZXQuZ2V0U3RhcnRPZmZzZXQoKSwgMCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBTRUdfRU5EX1RBRyA6Ci0JCQkJZW5kVGFnID0gdGFyZ2V0LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChlbmRUYWcgIT0gbnVsbCkgewotCQkJCQlzZWcgPSBuZXcgU2VnbWVudChlbmRUYWcpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc2VnID0gbmV3IFNlZ21lbnQodGFyZ2V0LmdldEVuZE9mZnNldCgpLCAwKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNFR19OT05FIDoKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBuZXcgU2VnbWVudCgwLCAwKTsKLQkJfQotCQlyZXR1cm4gc2VnOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTEF0dHJpYnV0ZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxBdHRyaWJ1dGVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRhMDI3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTEF0dHJpYnV0ZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNTmFtZWROb2RlTWFwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotCi1wdWJsaWMgY2xhc3MgSFRNTEF0dHJpYnV0ZVZhbGlkYXRvciBleHRlbmRzIFByaW1lVmFsaWRhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUdJT05fTkFNRSA9IDE7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFR0lPTl9WQUxVRSA9IDI7Ci0JLy8gPDxEMjEwNDIyCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBTSU5HTEVfUVVPVEUgPSAnXCcnOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRE9VQkxFX1FVT1RFID0gJ1wiJzsKLQotCS8vIEQyMTA0MjIKLQkvKioKLQkgKiBIVE1MQXR0cmlidXRlVmFsaWRhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEhUTUxBdHRyaWJ1dGVWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTZWdtZW50IGdldEVycm9yU2VnbWVudChJRE9NTm9kZSBlcnJvck5vZGUsIGludCByZWdpb25UeXBlKSB7Ci0JCUlUZXh0UmVnaW9uIHJnbiA9IG51bGw7Ci0JCXN3aXRjaCAocmVnaW9uVHlwZSkgewotCQkJY2FzZSBSRUdJT05fTkFNRSA6Ci0JCQkJcmduID0gZXJyb3JOb2RlLmdldE5hbWVSZWdpb24oKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVHSU9OX1ZBTFVFIDoKLQkJCQlyZ24gPSBlcnJvck5vZGUuZ2V0VmFsdWVSZWdpb24oKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCS8vIG5vdGhpbmcgdG8gZG8uCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHJnbiAhPSBudWxsKSB7Ci0JCQlpZiAoZXJyb3JOb2RlIGluc3RhbmNlb2YgSURPTUF0dHIpIHsKLQkJCQlJRE9NRWxlbWVudCBvd25lckVsZW1lbnQgPSAoSURPTUVsZW1lbnQpICgoSURPTUF0dHIpIGVycm9yTm9kZSkuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQkJaWYgKG93bmVyRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCWludCByZWdpb25TdGFydE9mZnNldCA9IG93bmVyRWxlbWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJnbik7Ci0JCQkJCWludCByZWdpb25MZW5ndGggPSByZ24uZ2V0TGVuZ3RoKCk7Ci0JCQkJCXJldHVybiBuZXcgU2VnbWVudChyZWdpb25TdGFydE9mZnNldCwgcmVnaW9uTGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBTZWdtZW50KGVycm9yTm9kZS5nZXRTdGFydE9mZnNldCgpLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICgodHlwZSA9PSBIVE1MQXR0cmlidXRlVmFsaWRhdG9yLmNsYXNzKSB8fCBzdXBlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIG5vZGUpIHsKLQkJRWxlbWVudCB0YXJnZXQgPSAoRWxlbWVudCkgbm9kZTsKLQkJaWYgKENNVXRpbC5pc0ZvcmVpZ24odGFyZ2V0KSkKLQkJCXJldHVybjsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlYyA9IENNVXRpbC5nZXREZWNsYXJhdGlvbih0YXJnZXQpOwotCQlpZiAoZWRlYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDTU5hbWVkTm9kZU1hcCBkZWNsYXJhdGlvbnMgPSBlZGVjLmdldEF0dHJpYnV0ZXMoKTsKLQotCQlDTU5hbWVkTm9kZU1hcEltcGwgYWxsQXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoZGVjbGFyYXRpb25zKSB7Ci0JCQlwcml2YXRlIE1hcCBjYXNlSW5zZW5zaXRpdmU7Ci0JCQkKLQkJCXByaXZhdGUgTWFwIGdldENhc2VJbnNlbnNpdGl2ZU1hcCgpIHsKLQkJCQlpZihjYXNlSW5zZW5zaXRpdmUgPT0gbnVsbCkKLQkJCQkJY2FzZUluc2Vuc2l0aXZlID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlyZXR1cm4gY2FzZUluc2Vuc2l0aXZlOwotCQkJfQotCi0JCQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQkJCUNNTm9kZSBub2RlID0gc3VwZXIuZ2V0TmFtZWRJdGVtKG5hbWUpOwotCQkJCWlmIChub2RlID09IG51bGwpIHsKLQkJCQkJbm9kZSA9IChDTU5vZGUpIGdldENhc2VJbnNlbnNpdGl2ZU1hcCgpLmdldChuYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpOwotCQkJCX0KLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcHV0KENNTm9kZSBjbU5vZGUpIHsKLQkJCQlzdXBlci5wdXQoY21Ob2RlKTsKLQkJCQlnZXRDYXNlSW5zZW5zaXRpdmVNYXAoKS5wdXQoY21Ob2RlLmdldE5vZGVOYW1lKCkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKSwgY21Ob2RlKTsKLQkJCX0KLQkJfTsKLQotCQlMaXN0IG5vZGVzID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSh0YXJnZXQuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBdmFpbGFibGVDb250ZW50KChFbGVtZW50KSBub2RlLCBlZGVjLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCWZvciAoaW50IGsgPSAwOyBrIDwgbm9kZXMuc2l6ZSgpOyBrKyspIHsKLQkJCUNNTm9kZSBjbW5vZGUgPSAoQ01Ob2RlKSBub2Rlcy5nZXQoayk7Ci0JCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCWFsbEF0dHJpYnV0ZXMucHV0KGNtbm9kZSk7Ci0JCQl9Ci0JCX0KLQkJZGVjbGFyYXRpb25zID0gYWxsQXR0cmlidXRlczsKLQotCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSB0YXJnZXQuZ2V0QXR0cmlidXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWludCByZ25UeXBlID0gUkVHSU9OX05BTUU7Ci0JCQlpbnQgc3RhdGUgPSBFcnJvclN0YXRlLk5PTkVfRVJST1I7Ci0JCQlBdHRyIGEgPSAoQXR0cikgYXR0cnMuaXRlbShpKTsKLQkJCS8vIEQyMDM2Mzc7IElmIHRoZSB0YXJnZXQgYXR0ciBoYXMgcHJlZml4LCB0aGUgdmFsaWRhdG9yIHNob3VsZAotCQkJLy8gbm90Ci0JCQkvLyB3YXJuIGFib3V0IGl0LiBUaGF0IGlzLCBqdXN0IGlnbm9yZS4gSXQgaXMgYWJsZSB0byBjaGVjawotCQkJLy8gd2hldGhlcgotCQkJLy8gYW4gYXR0ciBoYXMgcHJlZml4IG9yIG5vdCBieSBjYWxsaW5nIFhNTEF0dHIjaXNHbG9iYWxBdHRyKCkuCi0JCQkvLyBXaGVuIGEgYXR0ciBoYXMgcHJlZml4IChub3QgZ2xvYmFsKSwgaXQgcmV0dXJucyBmYWxzZS4KLQkJCWJvb2xlYW4gaXNYTUxBdHRyID0gYSBpbnN0YW5jZW9mIElET01BdHRyOwotCQkJaWYgKGlzWE1MQXR0cikgewotCQkJCUlET01BdHRyIHhtbGF0dHIgPSAoSURPTUF0dHIpIGE7Ci0JCQkJaWYgKCF4bWxhdHRyLmlzR2xvYmFsQXR0cigpKQotCQkJCQljb250aW51ZTsgLy8gc2tpcCBmdXRoZXIgdmFsaWRhdGlvbiBhbmQgYmVnaW4gbmV4dCBsb29wLgotCQkJfQotCi0JCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkZWMgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgZGVjbGFyYXRpb25zLmdldE5hbWVkSXRlbShhLmdldE5hbWUoKSk7Ci0JCQlpZiAoYWRlYyA9PSBudWxsKSB7Ci0JCQkJLy8gTm8gYXR0ciBkZWNsYXJhdGlvbiB3YXMgZm91bmQuIFRoYXQgaXMsIHRoZSBhdHRyIG5hbWUgaXMKLQkJCQkvLyB1bmRlZmluZWQuCi0JCQkJLy8gYnV0IG5vdCByZWdhcmQgaXQgYXMgdW5kZWZpbmVkIG5hbWUgaWYgaXQgaW5jbHVkZXMgbmVzdGVkCi0JCQkJLy8gcmVnaW9uCi0JCQkJaWYgKCFoYXNOZXN0ZWRSZWdpb24oKChJRE9NTm9kZSkgYSkuZ2V0TmFtZVJlZ2lvbigpKSkgewotCQkJCQlyZ25UeXBlID0gUkVHSU9OX05BTUU7Ci0JCQkJCXN0YXRlID0gRXJyb3JTdGF0ZS5VTkRFRklORURfTkFNRV9FUlJPUjsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIFRoZSBhdHRyIGRlY2xhcmF0aW9uIHdhcyBmb3VuZC4KLQkJCQkvLyBBdCAxc3QsIHRoZSBuYW1lIHNob3VsZCBiZSBjaGVja2VkLgotCQkJCWlmIChDTVV0aWwuaXNIVE1MKGVkZWMpICYmICghQ01VdGlsLmlzWEhUTUwoZWRlYykpKSB7Ci0JCQkJCS8vIElmIHRoZSB0YXJnZXQgZWxlbWVudCBpcyBwdXJlIEhUTUwgKG5vdCBYSFRNTCksIHNvbWUKLQkJCQkJLy8gYXR0cmlidXRlcwotCQkJCQkvLyBtaWdodCBiZSB3cml0dGVuIGluIGJvb2xlYW4gZm9ybWF0LiBJdCBzaG91bGQgYmUgY2hlY2sKLQkJCQkJLy8gc3BlY2lmaWNhbGx5LgotCQkJCQlpZiAoQ01VdGlsLmlzQm9vbGVhbkF0dHIoYWRlYykgJiYgKChJRE9NQXR0cikgYSkuaGFzTmFtZU9ubHkoKSkKLQkJCQkJCWNvbnRpbnVlOyAvLyBPSywga2VlcCBnb2luZy4gTm8gbW9yZSBjaGVjayBpcyBuZWVkZWQKLQkJCQkJLy8gYWdhaW5zdCB0aGlzIGF0dHIuCi0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gSWYgdGhlIHRhcmdldCBpcyBvdGhlciB0aGFuIHB1cmUgSFRNTCAoSlNQIG9yIFhIVE1MKSwKLQkJCQkJLy8gdGhlIG5hbWUKLQkJCQkJLy8gbXVzdCBiZSBjaGVja2VkIGV4YWN0bHkgKGllIGluIGNhc2Ugc2Vuc2l0aXZlIHdheSkuCi0JCQkJCVN0cmluZyBhY3R1YWwgPSBhLmdldE5hbWUoKTsKLQkJCQkJU3RyaW5nIGRlc2lyZWQgPSBhZGVjLmdldEF0dHJOYW1lKCk7Ci0JCQkJCWlmICghYWN0dWFsLmVxdWFscyhkZXNpcmVkKSkgeyAvLyBjYXNlIG1pc21hdGNoCi0JCQkJCQlyZ25UeXBlID0gUkVHSU9OX05BTUU7Ci0JCQkJCQlzdGF0ZSA9IEVycm9yU3RhdGUuTUlTTUFUQ0hFRF9FUlJPUjsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBUaGVuLCB0aGUgdmFsdWUgbXVzdCBiZSBjaGVja2VkLgotCQkJCWlmIChzdGF0ZSA9PSBFcnJvclN0YXRlLk5PTkVfRVJST1IpIHsgLy8gTmVlZCBtb3JlIGNoZWNrLgotCQkJCQkvLyBOb3csIHRoZSB2YWx1ZSBzaG91bGQgYmUgY2hlY2tlZCwgaWYgdGhlIHR5cGUgaXMgRU5VTS4KLQkJCQkJQ01EYXRhVHlwZSBhdHRyVHlwZSA9IGFkZWMuZ2V0QXR0clR5cGUoKTsKLQkJCQkJU3RyaW5nIGFjdHVhbFZhbHVlID0gYS5nZXRWYWx1ZSgpOwotCQkJCQlpZiAoYXR0clR5cGUuZ2V0SW1wbGllZFZhbHVlS2luZCgpID09IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9GSVhFRCkgewotCQkJCQkJLy8gQ2hlY2sgRklYRUQgdmFsdWUuCi0JCQkJCQlTdHJpbmcgdmFsaWRWYWx1ZSA9IGF0dHJUeXBlLmdldEltcGxpZWRWYWx1ZSgpOwotCQkJCQkJaWYgKCFhY3R1YWxWYWx1ZS5lcXVhbHModmFsaWRWYWx1ZSkpIHsKLQkJCQkJCQlyZ25UeXBlID0gUkVHSU9OX1ZBTFVFOwotCQkJCQkJCXN0YXRlID0gRXJyb3JTdGF0ZS5VTkRFRklORURfVkFMVUVfRVJST1I7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmdbXSBjYW5kaWRhdGVzID0gYXR0clR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCQkJCQkJaWYgKGNhbmRpZGF0ZXMgIT0gbnVsbCAmJiBjYW5kaWRhdGVzLmxlbmd0aCA+IDApIHsKLQkJCQkJCQkvLyBzZXZlcmFsIGNhbmRpZGF0ZXMgYXJlIGZvdW5kLgotCQkJCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY2FuZGlkYXRlcy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCQkJCQkJU3RyaW5nIGNhbmRpZGF0ZSA9IGNhbmRpZGF0ZXNbaW5kZXhdOwotCQkJCQkJCQkvLyBBdCAxc3QsIGNvbXBhcmUgaWdub3JpbmcgY2FzZS4KLQkJCQkJCQkJaWYgKGFjdHVhbFZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoY2FuZGlkYXRlKSkgewotCQkJCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCQkJaWYgKENNVXRpbC5pc0Nhc2VTZW5zaXRpdmUoZWRlYykgJiYgKCFhY3R1YWxWYWx1ZS5lcXVhbHMoY2FuZGlkYXRlKSkpIHsKLQkJCQkJCQkJCQlyZ25UeXBlID0gUkVHSU9OX1ZBTFVFOwotCQkJCQkJCQkJCXN0YXRlID0gRXJyb3JTdGF0ZS5NSVNNQVRDSEVEX1ZBTFVFX0VSUk9SOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJYnJlYWs7IC8vIGV4aXQgdGhlIGxvb3AuCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKCFmb3VuZCkgewotCQkJCQkJCQkvLyBObyBjYW5kaWRhdGUgd2FzIGZvdW5kLiBUaGF0IGlzLAotCQkJCQkJCQkvLyBhY3R1YWxWYWx1ZSBpcyBpbnZhbGlkLgotCQkJCQkJCQkvLyBidXQgbm90IHJlZ2FyZCBpdCBhcyB1bmRlZmluZWQgdmFsdWUgaWYgaXQKLQkJCQkJCQkJLy8gaW5jbHVkZXMgbmVzdGVkIHJlZ2lvbi4KLQkJCQkJCQkJaWYgKCFoYXNOZXN0ZWRSZWdpb24oKChJRE9NTm9kZSkgYSkuZ2V0VmFsdWVSZWdpb24oKSkpIHsKLQkJCQkJCQkJCXJnblR5cGUgPSBSRUdJT05fVkFMVUU7Ci0JCQkJCQkJCQlzdGF0ZSA9IEVycm9yU3RhdGUuVU5ERUZJTkVEX1ZBTFVFX0VSUk9SOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIDw8RDIxMDQyMgotCQkJCWlmIChzdGF0ZSA9PSBFcnJvclN0YXRlLk5PTkVfRVJST1IpIHsgLy8gTmVlZCBtb3JlIGNoZWNrLgotCQkJCQlpZiAoaXNYTUxBdHRyKSB7Ci0JCQkJCQlTdHJpbmcgc291cmNlID0gKChJRE9NQXR0cikgYSkuZ2V0VmFsdWVSZWdpb25UZXh0KCk7Ci0JCQkJCQlpZiAoc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQljaGFyIGZpcnN0Q2hhciA9IHNvdXJjZS5jaGFyQXQoMCk7Ci0JCQkJCQkJY2hhciBsYXN0Q2hhciA9IHNvdXJjZS5jaGFyQXQoc291cmNlLmxlbmd0aCgpIC0gMSk7Ci0JCQkJCQkJaWYgKGlzUXVvdGUoZmlyc3RDaGFyKSB8fCBpc1F1b3RlKGxhc3RDaGFyKSkgewotCQkJCQkJCQlpZiAobGFzdENoYXIgIT0gZmlyc3RDaGFyKSB7Ci0JCQkJCQkJCQlyZ25UeXBlID0gUkVHSU9OX1ZBTFVFOwotCQkJCQkJCQkJc3RhdGUgPSBFcnJvclN0YXRlLlVOQ0xPU0VEX0FUVFJfVkFMVUU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gRDIxMDQyMgotCQkJfQotCQkJaWYgKHN0YXRlICE9IEVycm9yU3RhdGUuTk9ORV9FUlJPUikgewotCQkJCVNlZ21lbnQgc2VnID0gZ2V0RXJyb3JTZWdtZW50KChJRE9NTm9kZSkgYSwgcmduVHlwZSk7Ci0JCQkJaWYgKHNlZyAhPSBudWxsKQotCQkJCQlyZXBvcnRlci5yZXBvcnQobmV3IEVycm9ySW5mb0ltcGwoc3RhdGUsIHNlZywgYSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVHJ1ZSBpZiBjb250YWluZXIgaGFzIG5lc3RlZCByZWdpb25zLCBtZWFuaW5nIGNvbnRhaW5lciBpcyBwcm9iYWJseSB0b28KLQkgKiBjb21wbGljYXRlZCAobGlrZSBKU1AgcmVnaW9ucykgdG8gdmFsaWRhdGUgd2l0aCB0aGlzIHZhbGlkYXRvci4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzTmVzdGVkUmVnaW9uKElUZXh0UmVnaW9uIGNvbnRhaW5lcikgewotCQlpZiAoIShjb250YWluZXIgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgY29udGFpbmVyKS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIEJVRzIwNzE5NDogcmV0dXJuIHRydWUgYnkgZGVmYXVsdCBhcyBsb25nIGFzIGNvbnRhaW5lciBpcyBhbgotCQkvLyBJVGV4dFJlZ2lvbkNvbnRhaW5lciB3aXRoIGF0IGxlYXN0IDEgcmVnaW9uCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vIDw8RDIxNDAyMgotCXByaXZhdGUgYm9vbGVhbiBpc1F1b3RlKGNoYXIgYykgewotCQlyZXR1cm4gKGMgPT0gU0lOR0xFX1FVT1RFKSB8fCAoYyA9PSBET1VCTEVfUVVPVEUpOwotCX0KLQkvLyBEMjEwNDIyCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTERvY3VtZW50Q29udGVudFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxEb2N1bWVudENvbnRlbnRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I2Y2FiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTERvY3VtZW50Q29udGVudFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50VHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MRG9jdW1lbnRDb250ZW50VmFsaWRhdG9yIGV4dGVuZHMgUHJpbWVWYWxpZGF0b3IgewotCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBjbGFzcyBEaXZpc2lvbiB7Ci0JCXByaXZhdGUgVmVjdG9yIGV4cGxpY2l0SHRtbHMgPSBuZXcgVmVjdG9yKCk7Ci0JCXByaXZhdGUgVmVjdG9yIHJlc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJcHVibGljIERpdmlzaW9uKERvY3VtZW50IGRvY3VtZW50LCBOb2RlTGlzdCBjaGlsZHJlbikgewotCQkJU3RyaW5nIHJvb3RUYWdOYW1lID0gZ2V0Um9vdFRhZ05hbWUoZG9jdW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJaWYgKGlzSHRtbFRhZyhjaGlsZCwgcm9vdFRhZ05hbWUpKSB7Ci0JCQkJCWV4cGxpY2l0SHRtbHMuYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3QuYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNFeHBsaWNpdEh0bWxzKCkgewotCQkJcmV0dXJuIGV4cGxpY2l0SHRtbHMuc2l6ZSgpID4gMDsKLQkJfQotCi0JCXB1YmxpYyBMaXN0IGdldEV4cGxpY2l0SHRtbHMoKSB7Ci0JCQlyZXR1cm4gZXhwbGljaXRIdG1sczsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvciBnZXRSZXN0Tm9kZXMoKSB7Ci0JCQlyZXR1cm4gcmVzdC5pdGVyYXRvcigpOwotCQl9Ci0KLQkJLyogdXRpbGl0aWVzICovCi0JCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNIdG1sVGFnKE5vZGUgbm9kZSwgU3RyaW5nIHRhZ05hbWUpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuICgoRWxlbWVudCkgbm9kZSkuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSk7Ci0JCX0KLQotCQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Um9vdFRhZ05hbWUoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSAoKElET01Eb2N1bWVudCkgZG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSBhZGFwdGVyLmdldERvY3VtZW50VHlwZSgpOwotCQkJCWlmIChkb2NUeXBlICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGRvY1R5cGUuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSFRNTERvY3VtZW50Q29udGVudFZhbGlkYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBIVE1MRG9jdW1lbnRDb250ZW50VmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZSBhbGxvd3MgaXQKLQkgKiB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKCh0eXBlID09IEhUTUxEb2N1bWVudENvbnRlbnRWYWxpZGF0b3IuY2xhc3MpIHx8IHN1cGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKEluZGV4ZWRSZWdpb24gbm9kZSkgewotCQkvLyBpc0ZyYWdtZW50IGNoZWNrIHNob3VsZCBiZSBtb3JlIGludGVsbGlnZW50LgotCQlib29sZWFuIGlzRnJhZ21lbnQgPSB0cnVlOwotCi0JCURvY3VtZW50IHRhcmdldCA9IChEb2N1bWVudCkgbm9kZTsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSB0YXJnZXQuZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlEaXZpc2lvbiBkaXZpc2lvbiA9IG5ldyBEaXZpc2lvbih0YXJnZXQsIGNoaWxkcmVuKTsKLQkJaWYgKGRpdmlzaW9uLmhhc0V4cGxpY2l0SHRtbHMoKSkgewotCQkJaXNGcmFnbWVudCA9IGZhbHNlOwotCi0JCQlMaXN0IGV4cGxpY2l0cyA9IGRpdmlzaW9uLmdldEV4cGxpY2l0SHRtbHMoKTsKLQkJCWlmIChleHBsaWNpdHMuc2l6ZSgpID4gMSkgewotCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgZXhwbGljaXRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUVsZW1lbnQgaHRtbCA9IChFbGVtZW50KSBleHBsaWNpdHMuZ2V0KGkpOwotCQkJCQkvLyByZXBvcnQgZXJyb3IgKGR1cGxpY2F0ZSkKLQkJCQkJU2VnbWVudCBlcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KChJRE9NTm9kZSkgaHRtbCwgRk1VdGlsLlNFR19TVEFSVF9UQUcpOwotCQkJCQlpZiAoZXJyb3JTZWcgIT0gbnVsbCkKLQkJCQkJCXJlcG9ydGVyLnJlcG9ydChuZXcgRXJyb3JJbmZvSW1wbChFcnJvclN0YXRlLkRVUExJQ0FURV9FUlJPUiwgZXJyb3JTZWcsIGh0bWwpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdmFsaWRhdGVDb250ZW50KGRpdmlzaW9uLmdldFJlc3ROb2RlcygpLCBpc0ZyYWdtZW50KTsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgbWV0aG9kcyB2YWxpZGF0ZSBub2RlcyBvdGhlciB0aGFuIEhUTUwgZWxlbWVudHMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ29udGVudChJdGVyYXRvciBjaGlsZHJlbiwgYm9vbGVhbiBpc0ZyYWdtZW50KSB7Ci0JCWJvb2xlYW4gZm91bmREb2N0eXBlID0gZmFsc2U7Ci0JCXdoaWxlIChjaGlsZHJlbi5oYXNOZXh0KCkpIHsKLQkJCUlET01Ob2RlIGNoaWxkID0gKElET01Ob2RlKSBjaGlsZHJlbi5uZXh0KCk7Ci0KLQkJCWludCBlcnJvciA9IEVycm9yU3RhdGUuTk9ORV9FUlJPUjsKLQkJCWludCBzZWdUeXBlID0gRk1VdGlsLlNFR19XSE9MRV9UQUc7Ci0KLQkJCXN3aXRjaCAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSkgewotCQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCQlpZiAoIWlzRnJhZ21lbnQpIHsKLQkJCQkJCUVsZW1lbnQgY2hpbGRFbGVtID0gKEVsZW1lbnQpIGNoaWxkOwotCQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gY2VkID0gQ01VdGlsLmdldERlY2xhcmF0aW9uKGNoaWxkRWxlbSk7Ci0JCQkJCQkvLyBVbmRlZmluZWQgZWxlbWVudCBpcyB2YWxpZC4KLQkJCQkJCWlmIChjZWQgPT0gbnVsbCkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCS8vIEpTUCAoaW5jbHVkZXMgY3VzdG9tIHRhZ3MpIGFuZCBTU0kgYXJlIHZhbGlkLgotCQkJCQkJaWYgKENNVXRpbC5pc0ZvcmVpZ24oY2hpbGRFbGVtKSB8fCBDTVV0aWwuaXNTU0koY2VkKSkKLQkJCQkJCQljb250aW51ZTsgLy8gRGVmZWN0IDE4Njc3NAotCi0JCQkJCQkvLyByZXBvcnQgZXJyb3IgKGludmFsaWQgY29udGVudCkKLQkJCQkJCWVycm9yID0gRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1I7Ci0JCQkJCQkvLyBtYXJrIHRoZSB3aG9sZSBzdGFydCB0YWcgYXMgZXJyb3IuCi0JCQkJCQlzZWdUeXBlID0gRk1VdGlsLlNFR19TVEFSVF9UQUc7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0JCQkJCWlmICghaXNGcmFnbWVudCkgewotCQkJCQkJLy8gVEVYVCBub2RlIGlzIHZhbGlkIHdoZW4gaXQgY29udGFpbnMgd2hpdGUgc3BhY2UKLQkJCQkJCS8vIGNoYXJhY3RlcnMgb25seS4KLQkJCQkJCS8vIE90aGVyd2lzZSwgaXQgaXMgaW52YWxpZCBjb250ZW50LgotCQkJCQkJaWYgKCgoSURPTVRleHQpIGNoaWxkKS5pc0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJZXJyb3IgPSBFcnJvclN0YXRlLklOVkFMSURfQ09OVEVOVF9FUlJPUjsKLQkJCQkJCXNlZ1R5cGUgPSBGTVV0aWwuU0VHX1dIT0xFX1RBRzsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFIDoKLQkJCQkJLy8gRE9DVFlQRSBpcyBhbHNvIHZhbGlkIHdoZW4gaXQgYXBwZWFycyBvbmNlIGFuZCBvbmx5Ci0JCQkJCS8vIG9uY2UuCi0JCQkJCWlmICghZm91bmREb2N0eXBlKSB7Ci0JCQkJCQlmb3VuZERvY3R5cGUgPSB0cnVlOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJZXJyb3IgPSBFcnJvclN0YXRlLkRVUExJQ0FURV9FUlJPUjsKLQkJCQkJc2VnVHlwZSA9IEZNVXRpbC5TRUdfV0hPTEVfVEFHOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLQkJCQkvLyBhbHdheXMgdmFsaWQuCi0JCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6Ci0JCQkJCWNvbnRpbnVlOwotCQkJCWRlZmF1bHQgOgotCQkJCQlpZiAoIWlzRnJhZ21lbnQpIHsKLQkJCQkJCWVycm9yID0gRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1I7Ci0JCQkJCQlzZWdUeXBlID0gRk1VdGlsLlNFR19XSE9MRV9UQUc7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoZXJyb3IgIT0gRXJyb3JTdGF0ZS5OT05FX0VSUk9SKSB7Ci0JCQkJU2VnbWVudCBlcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KGNoaWxkLCBzZWdUeXBlKTsKLQkJCQlpZiAoZXJyb3JTZWcgIT0gbnVsbCkKLQkJCQkJcmVwb3J0ZXIucmVwb3J0KG5ldyBFcnJvckluZm9JbXBsKGVycm9yLCBlcnJvclNlZywgY2hpbGQpKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxFbGVtZW50QW5jZXN0b3JWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MRWxlbWVudEFuY2VzdG9yVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNjFlZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxFbGVtZW50QW5jZXN0b3JWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MRWxlbWVudEFuY2VzdG9yVmFsaWRhdG9yIGV4dGVuZHMgUHJpbWVWYWxpZGF0b3IgewotCi0JLyoqCi0JICogSFRNTEVsZW1lbnRBbmNlc3RvclZhbGlkYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBIVE1MRWxlbWVudEFuY2VzdG9yVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZQotCSAqIGFsbG93cyBpdCB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKCh0eXBlID09IEhUTUxFbGVtZW50QW5jZXN0b3JWYWxpZGF0b3IuY2xhc3MpIHx8IHN1cGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGV4Y2x1c2lvbiB3aGljaCBpcyBkZWZpbmVkIGluIG9ubHkgSFRNTCBEVEQgKFNHTUwpLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKEluZGV4ZWRSZWdpb24gbm9kZSkgewotCQlFbGVtZW50IHRhcmdldCA9IChFbGVtZW50KSBub2RlOwotCQlpZiAoQ01VdGlsLmlzRm9yZWlnbih0YXJnZXQpKQotCQkJcmV0dXJuOwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWMgPSBDTVV0aWwuZ2V0RGVjbGFyYXRpb24odGFyZ2V0KTsKLQkJaWYgKGRlYyA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBjYW5ub3QgdmFsaWRhdGUuCi0JCWlmICghQ01VdGlsLmlzSFRNTChkZWMpKQotCQkJcmV0dXJuOyAvLyBubyBuZWVkIHRvIHZhbGlkYXRlCi0JCWlmICghZGVjLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuUFJPSElCSVRFRF9BTkNFU1RPUlMpKQotCQkJcmV0dXJuOyAvLyBjYW5ub3QgdmFsaWRhdGUuCi0JCUNNTmFtZWROb2RlTWFwIHByb2hpYml0ZWQgPSAoQ01OYW1lZE5vZGVNYXApIGRlYy5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLlBST0hJQklURURfQU5DRVNUT1JTKTsKLQkJaWYgKHByb2hpYml0ZWQuZ2V0TGVuZ3RoKCkgPD0gMCkKLQkJCXJldHVybjsgLy8gbm8gcHJvaGliaXRlZCBhbmNlc3RvcnMuCi0KLQkJRWxlbWVudCBwYXJlbnQgPSBTTVV0aWwuZ2V0UGFyZW50RWxlbWVudCh0YXJnZXQpOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCUNNTm9kZSBwZGVjID0gcHJvaGliaXRlZC5nZXROYW1lZEl0ZW0ocGFyZW50LmdldE5vZGVOYW1lKCkpOwotCQkJaWYgKHBkZWMgIT0gbnVsbCkgeyAvLyBwcm9oaWJpdGVkIGVsZW1lbnQgaXMgZm91bmQgaW4gYW5jZXN0b3JzLgotCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBGTVV0aWwuZ2V0U2VnbWVudCgoSURPTU5vZGUpIG5vZGUsIEZNVXRpbC5TRUdfU1RBUlRfVEFHKTsKLQkJCQlpZiAoZXJyb3JTZWcgIT0gbnVsbCkKLQkJCQkJcmVwb3J0ZXIucmVwb3J0KG5ldyBFcnJvckluZm9JbXBsKEVycm9yU3RhdGUuSU5WQUxJRF9DT05URU5UX0VSUk9SLCBlcnJvclNlZywgdGFyZ2V0KSk7Ci0JCQkJYnJlYWs7IC8vIElmIG9uZSBwcm9oaWJpdGVkIGFuY2VzdG9yIGlzIGZvdW5kLCBpdCdzIGVub3VnaC4KLQkJCX0KLQkJCXBhcmVudCA9IFNNVXRpbC5nZXRQYXJlbnRFbGVtZW50KHBhcmVudCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTEVsZW1lbnRDb250ZW50VmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTEVsZW1lbnRDb250ZW50VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNmMwN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxFbGVtZW50Q29udGVudFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIEhUTUxFbGVtZW50Q29udGVudFZhbGlkYXRvciBleHRlbmRzIFByaW1lVmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIEhUTUxFbGVtZW50Q29udGVudFZhbGlkYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBIVE1MRWxlbWVudENvbnRlbnRWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlIGFsbG93cyBpdAotCSAqIHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gSFRNTEVsZW1lbnRDb250ZW50VmFsaWRhdG9yLmNsYXNzKSB8fCBzdXBlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIG5vZGUpIHsKLQkJRWxlbWVudCB0YXJnZXQgPSAoRWxlbWVudCkgbm9kZTsKLQkJaWYgKENNVXRpbC5pc0ZvcmVpZ24odGFyZ2V0KSkKLQkJCXJldHVybjsKLQotCQl2YWxpZGF0ZUNvbnRlbnQodGFyZ2V0LCB0YXJnZXQuZ2V0Q2hpbGROb2RlcygpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVDb250ZW50KEVsZW1lbnQgcGFyZW50LCBOb2RlTGlzdCBjaGlsZHJlbikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJaWYgKGNoaWxkID09IG51bGwpCi0JCQkJY29udGludWU7Ci0KLQkJCS8vIHBlcmZvcm0gYWN0dWFsIHZhbGlkYXRpb24KLQkJCXZhbGlkYXRlTm9kZShwYXJlbnQsIGNoaWxkKTsKLQkJfQotCX0KLQotCS8vIHByaXZhdGUgaW50IGNvdW50RXhwbGljaXRTaWJsaW5ncyhFbGVtZW50IHBhcmVudCwgU3RyaW5nIHRhZ05hbWUpIHsKLQkvLyBOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JLy8gaW50IGNvdW50ID0gMDsKLQkvLyBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkvLyBOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkvLyBpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkvLyBjb250aW51ZTsKLQkvLyBpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCgoRWxlbWVudCkgY2hpbGQpLmdldFRhZ05hbWUoKSkpIHsKLQkvLyBjb3VudCsrOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGNvdW50OwotCS8vIH0KLQotCS8qCi0JICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgbWV0aG9kIGlzIHByYWN0aWNhbCBidXQgYWNjdXJhdGUuCi0JICogVGhlIGFjY3VyYXRlIG1heGltdW0gb2NjdXJlbmNlIHNob3VsZCBiZSByZXRyZWl2ZSBmcm9tIHRoZSBjb250ZW50Ci0JICogbW9kZWwuIEhvd2V2ZXIsIGl0IGlzIHVzZWZ1bCBlbm91Z2gsIHNpbmNlIGFsbW9zdCBpbXBsaWNpdCBlbGVtZW50cyBhcmUKLQkgKiBIVE1MLCBIRUFELCBvciBCT0RZLgotCSAqLwotCS8vIHByaXZhdGUgaW50IGdldE1heE9jY3VyKEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgY2hpbGRUYWcpIHsKLQkvLyByZXR1cm4gMTsKLQkvLyB9Ci0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTm9kZShFbGVtZW50IHRhcmdldCwgTm9kZSBjaGlsZCkgewotCQkvLyBOT1RFOiBJZiB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgJ1VOS05PV04nLCB0aGF0IGlzLCBpdCBoYXMgbm8KLQkJLy8gZWxlbWVudCBkZWNsYXJhdGlvbiwgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgZWxlbWVudCBzaG91bGQgYmUKLQkJLy8gcmVnYXJkZWQgYXMgJ0FOWScuIC0tIDkvMTAvMjAwMQotCQlpbnQgY29udGVudFR5cGUgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlk7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWMgPSBDTVV0aWwuZ2V0RGVjbGFyYXRpb24odGFyZ2V0KTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnRUeXBlID0gZWRlYy5nZXRDb250ZW50VHlwZSgpOwotCi0JCWludCBlcnJvciA9IEVycm9yU3RhdGUuTk9ORV9FUlJPUjsKLQkJaW50IHNlZ1R5cGUgPSBGTVV0aWwuU0VHX1dIT0xFX1RBRzsKLQotCQlzd2l0Y2ggKGNoaWxkLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCUVsZW1lbnQgY2hpbGRFbGVtID0gKEVsZW1lbnQpIGNoaWxkOwotCQkJCS8vIERlZmVjdCAyMDAzMjE6Ci0JCQkJLy8gVGhpcyB2YWxpZGF0b3IgY2FyZXMgb25seSBIVE1ML1hIVE1MIGVsZW1lbnRzLiBJZiBhIGNoaWxkCi0JCQkJLy8gaXMKLQkJCQkvLyBhbiBlbGVtZW50IG9mIGZvcmVpZ24gbWFya3VwIGxhbmd1YWdlcywganVzdCBpZ25vcmUgaXQuCi0JCQkJaWYgKENNVXRpbC5pc0ZvcmVpZ24oY2hpbGRFbGVtKSkKLQkJCQkJcmV0dXJuOwotCi0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gY2VkID0gQ01VdGlsLmdldERlY2xhcmF0aW9uKChFbGVtZW50KSBjaGlsZCk7Ci0JCQkJLy8gRGVmZWN0IDE4Njc3NDogSWYgYSBjaGlsZCBpcyBub3Qgb25lIG9mIEhUTUwgZWxlbWVudHMsCi0JCQkJLy8gaXQgc2hvdWxkIGJlIHJlZ2FyZGVkIGFzIGEgdmFsaWQgY2hpbGQgcmVnYXJkbGVzcyB0aGUKLQkJCQkvLyB0eXBlIG9mIHRoZSBwYXJlbnQgY29udGVudCBtb2RlbC4gLS0gMTAvMTIvMjAwMQotCQkJCWlmIChjZWQgPT0gbnVsbCB8fCBDTVV0aWwuaXNTU0koY2VkKSB8fCAoIUNNVXRpbC5pc0hUTUwoY2VkKSkpCi0JCQkJCXJldHVybjsKLQotCQkJCXN3aXRjaCAoY29udGVudFR5cGUpIHsKLQkJCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlkgOgotCQkJCQkJLy8gS2VlcCBnb2luZy4KLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UIDoKLQkJCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCA6Ci0JCQkJCQlpZiAoY2VkID09IG51bGwpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJaWYgKENNVXRpbC5pc1ZhbGlkQ2hpbGQoZWRlYywgY2VkKSkKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkvLyBOb3csIGl0IGlzIHRoZSB0aW1lIHRvIGNoZWNrIGluY2x1c2lvbiwgdW5sZXNzIHRoZQotCQkJCQkJLy8gdGFyZ2V0Ci0JCQkJCQkvLyBkb2N1bWVudCBpcyBub3QgYSBYSFRNTC4KLQkJCQkJCWlmICghQ01VdGlsLmlzWEhUTUwoZWRlYykpIHsKLQkJCQkJCQkvLyBwdXJlIEhUTUwKLQkJCQkJCQlpZiAoQ01VdGlsLmlzVmFsaWRJbmNsdXNpb24oY2VkLCB0YXJnZXQpKQotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQllcnJvciA9IEVycm9yU3RhdGUuSU5WQUxJRF9DT05URU5UX0VSUk9SOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJZXJyb3IgPSBFcnJvclN0YXRlLklOVkFMSURfQ09OVEVOVF9FUlJPUjsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvLyBNYXJrIHRoZSB3aG9sZSBTVEFSVCB0YWcgYXMgYW4gZXJyb3Igc2VnbWVudC4KLQkJCQlzZWdUeXBlID0gRk1VdGlsLlNFR19TVEFSVF9UQUc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCQlzd2l0Y2ggKGNvbnRlbnRUeXBlKSB7Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZIDoKLQkJCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCA6Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBIDoKLQkJCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQSA6Ci0JCQkJCQkvLyBEMTg0MzM5Ci0JCQkJCQkvLyBLZWVwIGdvaW5nLgotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQgOgotCQkJCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZIDoKLQkJCQkJCWlmICgoKElET01UZXh0KSBjaGlsZCkuaXNFbGVtZW50Q29udGVudFdoaXRlc3BhY2UoKSkKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQllcnJvciA9IEVycm9yU3RhdGUuSU5WQUxJRF9DT05URU5UX0VSUk9SOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJZXJyb3IgPSBFcnJvclN0YXRlLklOVkFMSURfQ09OVEVOVF9FUlJPUjsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvLyBNYXJrIHRoZSB3aG9sZSBub2RlIGFzIGFuIGVycm9yIHNlZ21lbnQuCi0JCQkJc2VnVHlwZSA9IEZNVXRpbC5TRUdfV0hPTEVfVEFHOwotCQkJCWJyZWFrOwotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6Ci0JCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLQkJCQlpZiAoY29udGVudFR5cGUgIT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpCi0JCQkJCXJldHVybjsKLQkJCQllcnJvciA9IEVycm9yU3RhdGUuSU5WQUxJRF9DT05URU5UX0VSUk9SOwotCQkJCS8vIE1hcmsgdGhlIHdob2xlIG5vZGUgYXMgYW4gZXJyb3Igc2VnbWVudC4KLQkJCQlzZWdUeXBlID0gRk1VdGlsLlNFR19XSE9MRV9UQUc7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQllcnJvciA9IEVycm9yU3RhdGUuSU5WQUxJRF9DT05URU5UX0VSUk9SOwotCQkJCS8vIE1hcmsgdGhlIHdob2xlIG5vZGUgYXMgYW4gZXJyb3Igc2VnbWVudC4KLQkJCQlzZWdUeXBlID0gRk1VdGlsLlNFR19XSE9MRV9UQUc7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGVycm9yICE9IEVycm9yU3RhdGUuTk9ORV9FUlJPUikgewotCQkJU2VnbWVudCBlcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KChJRE9NTm9kZSkgY2hpbGQsIHNlZ1R5cGUpOwotCQkJaWYgKGVycm9yU2VnICE9IG51bGwpCi0JCQkJcmVwb3J0ZXIucmVwb3J0KG5ldyBFcnJvckluZm9JbXBsKGVycm9yLCBlcnJvclNlZywgY2hpbGQpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MU2ltcGxlRG9jdW1lbnRWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MU2ltcGxlRG9jdW1lbnRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU3OTViMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTFNpbXBsZURvY3VtZW50VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25Db21wb25lbnQ7Ci0KLWNsYXNzIEhUTUxTaW1wbGVEb2N1bWVudFZhbGlkYXRvciBleHRlbmRzIENvbXBvc2l0ZVZhbGlkYXRvciB7Ci0KLQkvKioKLQkgKiBIVE1MU2ltcGxlRG9jdW1lbnRWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSFRNTFNpbXBsZURvY3VtZW50VmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCi0JCVZhbGlkYXRpb25Db21wb25lbnRbXSB2YWxpZGF0b3JzID0gbmV3IFZhbGlkYXRpb25Db21wb25lbnRbMl07Ci0KLQkJdmFsaWRhdG9yc1swXSA9IG5ldyBIVE1MRG9jdW1lbnRDb250ZW50VmFsaWRhdG9yKCk7Ci0JCXZhbGlkYXRvcnNbMV0gPSBuZXcgU3ludGF4VmFsaWRhdG9yKCk7Ci0KLQkJcmVnaXN0ZXIodmFsaWRhdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlCi0JICogYWxsb3dzIGl0IHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gSFRNTFNpbXBsZURvY3VtZW50VmFsaWRhdG9yLmNsYXNzKSB8fCBzdXBlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTFNpbXBsZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxTaW1wbGVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI3NmZkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTFNpbXBsZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQ29tcG9uZW50OwotCi1jbGFzcyBIVE1MU2ltcGxlVmFsaWRhdG9yIGV4dGVuZHMgQ29tcG9zaXRlVmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIEhUTUxTaW1wbGVWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSFRNTFNpbXBsZVZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQotCQlWYWxpZGF0aW9uQ29tcG9uZW50W10gdmFsaWRhdG9ycyA9IG5ldyBWYWxpZGF0aW9uQ29tcG9uZW50WzVdOwotCi0JCXZhbGlkYXRvcnNbMF0gPSBuZXcgSFRNTEF0dHJpYnV0ZVZhbGlkYXRvcigpOwotCQl2YWxpZGF0b3JzWzFdID0gbmV3IEhUTUxFbGVtZW50Q29udGVudFZhbGlkYXRvcigpOwotCQl2YWxpZGF0b3JzWzJdID0gbmV3IFN5bnRheFZhbGlkYXRvcigpOwotCQl2YWxpZGF0b3JzWzNdID0gbmV3IEhUTUxFbGVtZW50QW5jZXN0b3JWYWxpZGF0b3IoKTsKLQkJdmFsaWRhdG9yc1s0XSA9IG5ldyBOYW1lc3BhY2VWYWxpZGF0b3IoKTsKLQotCQlyZWdpc3Rlcih2YWxpZGF0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUKLQkgKiBhbGxvd3MgaXQgdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICgodHlwZSA9PSBIVE1MU2ltcGxlVmFsaWRhdG9yLmNsYXNzKSB8fCBzdXBlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAxMGUwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBIVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcihWYWxpZGF0aW9uQWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBhZGFwdGVyS2V5IGphdmEubGFuZy5PYmplY3QKLQkgKiBAcGFyYW0gcmVnaXN0ZXJBZGFwdGVycyBib29sZWFuCi0JICovCi0JcHVibGljIEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkoT2JqZWN0IGFkYXB0ZXJLZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJTm9kZSBub2RlID0gKE5vZGUpIHRhcmdldDsKLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFIDoKLQkJCQlyZXR1cm4gbmV3IERvY3VtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IoKTsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCXJldHVybiBuZXcgRWxlbWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yKCk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbmV3IE51bGxWYWxpZGF0b3IoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSAhPSBudWxsKQotCQkJcmV0dXJuIGluc3RhbmNlOwotCQlpbnN0YW5jZSA9IG5ldyBIVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkaW5nIE9iamVjdCdzIGNsb25lKCkgbWV0aG9kCi0JICogVGhpcyBpcyB1c2VkIGluIElNb2RlbE1hbmFnZXIncyBJU3RydWN0dXJlZE1vZGVsIGNvcHlpbmcuCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIGdldEluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL01lc3NhZ2VGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTWVzc2FnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJmYjBkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5FcnJvckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRmFjdG9yeSBpbXBsZW1lbnRzIEVycm9yU3RhdGUgewotCi0KLQlwcml2YXRlIHN0YXRpYyBNYXAgZlByZWZlcmVuY2VzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIHN0YXRpYyBJUHJvamVjdCBmUHJvamVjdDsKLQkKLQlwdWJsaWMgTWVzc2FnZUZhY3RvcnkoKSB7Ci0JCWluaXQoKTsKLQl9Ci0JCi0JcHVibGljIE1lc3NhZ2VGYWN0b3J5KElQcm9qZWN0IHByb2plY3QpIHsKLQkJZlByb2plY3QgPSBwcm9qZWN0OwotCQlpbml0KCk7Ci0JfQotCQotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBwYWNrZXQgZm9yIHRoZSBlcnJvciB0YWJsZSBiYXNlZCBvbiB0aGUgc3RhdGUsIG1lc3NhZ2UsIGFuZCB0aGUKLQkgKiBzZXZlcml0eSBkZWZpbmVkIGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlLiBUaGlzIHBhY2tldCwgaW4gYWRkaXRpb24gdG8KLQkgKiBiZWluZyBhZGRlZCB0byB0aGUgZXJyb3IgdGFibGUsIGlzIGFsc28gcGxhY2VkIGluIGEgbWFwIGJhc2VkIG9uIHRoZQotCSAqIHN1cHBsaWVkIHByZWZlcmVuY2Uga2V5Ci0JICogCi0JICogQHBhcmFtIGtleSB0aGUgcHJlZmVyZW5jZSBrZXkgZm9yIHRoZSBlcnJvciBzZXZlcml0eQotCSAqIEBwYXJhbSBlcnJvclRhYmxlIHRoZSBlcnJvciB0YWJsZSB0byBzdG9yZSB0aGUgcGFja2V0IGluZm9ybWF0aW9uIGluCi0JICogQHBhcmFtIHN0YXRlIHRoZSBlcnJvciBzdGF0ZQotCSAqIEBwYXJhbSBtc2cgdGhlIG1lc3NhZ2UgZm9yIHRoZSBlcnJvcgotCSAqLwotCXByaXZhdGUgdm9pZCBtYXBUb0tleShTdHJpbmcga2V5LCBFcnJvclRhYmxlIGVycm9yVGFibGUsIGludCBzdGF0ZSwgU3RyaW5nIG1zZykgewotCQlib29sZWFuIHVzZVByb2plY3QgPSBmYWxzZTsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmcyA9IG51bGw7Ci0JCQotCQlpZiAoZlByb2plY3QgIT0gbnVsbCkgewotCQkJcHJlZnMgPSBuZXcgUHJvamVjdFNjb3BlKGZQcm9qZWN0KS5nZXROb2RlKEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCQl1c2VQcm9qZWN0ID0gcHJlZnMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VU0VfUFJPSkVDVF9TRVRUSU5HUywgZmFsc2UpOwotCQl9Ci0JCQotCQlpbnQgc2V2ZXJpdHkgPSBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HOwotCQlpZih1c2VQcm9qZWN0KQotCQkJc2V2ZXJpdHkgPSBwcmVmcy5nZXRJbnQoa2V5LCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJZWxzZQotCQkJc2V2ZXJpdHkgPSBuZXcgSW5zdGFuY2VTY29wZSgpLmdldE5vZGUoSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpKS5nZXRJbnQoa2V5LCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJCQotCQlFcnJvclRhYmxlLlBhY2tldCBwYWNrZXQgPSBlcnJvclRhYmxlLnB1dChzdGF0ZSwgbXNnLCBzZXZlcml0eSk7Ci0JCWZQcmVmZXJlbmNlcy5wdXQoa2V5LCBwYWNrZXQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBOb2RlVHlwZS5NQVhfVFlQRTsgaSsrKSB7Ci0JCQllcnJUYWJsZXNbaV0gPSBuZXcgRXJyb3JUYWJsZSgpOwotCQl9Ci0JCS8vIE5PVEU6IFRoZSBzZXZlcml0aWVzIGFyZSBqdXN0IHN0dWIuICBUaGV5IG11c3QgYmUgcmV2aWV3ZWQuCi0JCS8vIC0tIDgvMzAvMjAwMQotCi0JCS8vIGF0dHJpYnV0ZSBlcnJvciBtYXAKLQkJRXJyb3JUYWJsZSBhdHRyVGFibGUgPSBlcnJUYWJsZXNbTm9kZVR5cGUuQVRUUklCVVRFXTsvLyBzaG9ydCBoYW5kCi0JCWF0dHJUYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX1VOREVGSU5FRF9OQU1FLCBhdHRyVGFibGUsIFVOREVGSU5FRF9OQU1FX0VSUk9SLCBNU0dfVU5ERUZJTkVEX0FUVFJfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfVU5ERUZJTkVEX1ZBTFVFLCBhdHRyVGFibGUsIFVOREVGSU5FRF9WQUxVRV9FUlJPUiwgTVNHX1VOREVGSU5FRF9WQUxVRV9FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9OQU1FX01JU01BVENILCBhdHRyVGFibGUsIE1JU01BVENIRURfRVJST1IsIE1TR19NSVNNQVRDSEVEX0FUVFJfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfSU5WQUxJRF9OQU1FLCBhdHRyVGFibGUsIElOVkFMSURfTkFNRV9FUlJPUiwgTVNHX0lOVkFMSURfQVRUUl9FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9JTlZBTElEX1ZBTFVFLCBhdHRyVGFibGUsIElOVkFMSURfQVRUUl9FUlJPUiwgTVNHX0FUVFJfTk9fVkFMVUVfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfRFVQTElDQVRFLCBhdHRyVGFibGUsIERVUExJQ0FURV9FUlJPUiwgTVNHX0RVUExJQ0FURV9BVFRSX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX1ZBTFVFX01JU01BVENILCBhdHRyVGFibGUsIE1JU01BVENIRURfVkFMVUVfRVJST1IsIE1TR19NSVNNQVRDSEVEX0FUVFJfVkFMVUVfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfVkFMVUVfVU5DTE9TRUQsIGF0dHJUYWJsZSwgVU5DTE9TRURfQVRUUl9WQUxVRSwgTVNHX1VOQ0xPU0VEX0FUVFJfVkFMVUVfRVJST1IpOwotCi0JCS8vIGVsZW1lbnQgZXJyb3IgbWFwCi0JCUVycm9yVGFibGUgZWxlbVRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLkVMRU1FTlRdOy8vIHNob3J0IGhhbmQKLQkJZWxlbVRhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX1VOS05PV05fTkFNRSwgZWxlbVRhYmxlLCBVTkRFRklORURfTkFNRV9FUlJPUiwgTVNHX1VOREVGSU5FRF9UQUdfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0lOVkFMSURfTkFNRSwgZWxlbVRhYmxlLCBJTlZBTElEX05BTUVfRVJST1IsIE1TR19JTlZBTElEX1RBR19FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fU1RBUlRfSU5WQUxJRF9DQVNFLCBlbGVtVGFibGUsIE1JU01BVENIRURfRVJST1IsIE1TR19NSVNNQVRDSEVEX1RBR19FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fRU5EX0lOVkFMSURfQ0FTRSwgZWxlbVRhYmxlLCBNSVNNQVRDSEVEX0VORF9UQUdfRVJST1IsIE1TR19NSVNNQVRDSEVEX1RBR19FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fTUlTU0lOR19TVEFSVCwgZWxlbVRhYmxlLCBNSVNTSU5HX1NUQVJUX1RBR19FUlJPUiwgTVNHX01JU1NJTkdfU1RBUlRfVEFHX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9NSVNTSU5HX0VORCwgZWxlbVRhYmxlLCBNSVNTSU5HX0VORF9UQUdfRVJST1IsIE1TR19NSVNTSU5HX0VORF9UQUdfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX1VOTkVDRVNTQVJZX0VORCwgZWxlbVRhYmxlLCBVTk5FQ0VTU0FSWV9FTkRfVEFHX0VSUk9SLCBNU0dfVU5ORUNFU1NBUllfRU5EX1RBR19FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fSU5WQUxJRF9ESVJFQ1RJVkUsIGVsZW1UYWJsZSwgSU5WQUxJRF9ESVJFQ1RJVkVfRVJST1IsIE1TR19JTlZBTElEX0RJUkVDVElWRV9FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fSU5WQUxJRF9DT05URU5ULCBlbGVtVGFibGUsIElOVkFMSURfQ09OVEVOVF9FUlJPUiwgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fRFVQTElDQVRFLCBlbGVtVGFibGUsIERVUExJQ0FURV9FUlJPUiwgTVNHX0RVUExJQ0FURV9UQUdfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0NPRVhJU1RFTkNFLCBlbGVtVGFibGUsIENPRVhJU1RFTkNFX0VSUk9SLCBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9VTkNMT1NFRF9TVEFSVF9UQUcsIGVsZW1UYWJsZSwgVU5DTE9TRURfVEFHX0VSUk9SLCBNU0dfVU5DTE9TRURfU1RBUlRfVEFHX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9VTkNMT1NFRF9FTkRfVEFHLCBlbGVtVGFibGUsIFVOQ0xPU0VEX0VORF9UQUdfRVJST1IsIE1TR19VTkNMT1NFRF9FTkRfVEFHX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9JTlZBTElEX0VNUFRZX1RBRywgZWxlbVRhYmxlLCBJTlZBTElEX0VNUFRZX0VMRU1FTlRfVEFHLCBNU0dfSU5WQUxJRF9FTVBUWV9FTEVNRU5UX1RBRyk7Ci0KLQkJLy8gZG9jdW1lbnQgdHlwZSBlcnJvciBtYXAKLQkJRXJyb3JUYWJsZSBkb2NUYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5ET0NVTUVOVF9UWVBFXTsvLyBzaG9ydCBoYW5kCi0JCWRvY1RhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5ET0NfRFVQTElDQVRFLCBkb2NUYWJsZSwgRFVQTElDQVRFX0VSUk9SLCBNU0dfRFVQTElDQVRFX1RBR19FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRPQ19JTlZBTElEX0NPTlRFTlQsIGRvY1RhYmxlLCBJTlZBTElEX0NPTlRFTlRfRVJST1IsIE1TR19JTlZBTElEX0NPTlRFTlRfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5ET0NfRE9DVFlQRV9VTkNMT1NFRCwgZG9jVGFibGUsIFVOQ0xPU0VEX1RBR19FUlJPUiwgTVNHX1VOQ0xPU0VEX0RPQ1RZUEVfRVJST1IpOwotCi0JCS8vIHRleHQgZXJyb3IgbWFwCi0JCUVycm9yVGFibGUgdGV4dFRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLlRFWFRdOwotCQl0ZXh0VGFibGUucHV0KE5PTkVfRVJST1IsIE1TR19OT19FUlJPUiwgMCk7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRFWFRfSU5WQUxJRF9DT05URU5ULCB0ZXh0VGFibGUsIElOVkFMSURfQ09OVEVOVF9FUlJPUiwgTVNHX0lOVkFMSURfVEVYVF9FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRFWFRfSU5WQUxJRF9DSEFSLCB0ZXh0VGFibGUsIElOVkFMSURfQ0hBUl9FUlJPUiwgTVNHX0lOVkFMSURfQ0hBUl9FUlJPUik7Ci0KLQkJLy8gY29tbWVudCBlcnJvciBtYXAKLQkJRXJyb3JUYWJsZSBjb21tVGFibGUgPSBlcnJUYWJsZXNbTm9kZVR5cGUuQ09NTUVOVF07Ci0JCWNvbW1UYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NTUVOVF9JTlZBTElEX0NPTlRFTlQsIGNvbW1UYWJsZSwgSU5WQUxJRF9DT05URU5UX0VSUk9SLCBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NTUVOVF9VTkNMT1NFRCwgY29tbVRhYmxlLCBVTkNMT1NFRF9UQUdfRVJST1IsIE1TR19VTkNMT1NFRF9DT01NRU5UX0VSUk9SKTsKLQotCQkvLyBjZGF0YSBzZWN0aW9uIGVycm9yIG1hcAotCQlFcnJvclRhYmxlIGNkYXRUYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5DREFUQV9TRUNUSU9OXTsKLQkJY2RhdFRhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DREFUQV9JTlZBTElEX0NPTlRFTlQsIGNkYXRUYWJsZSwgSU5WQUxJRF9DT05URU5UX0VSUk9SLCBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SKTsKLQkJbWFwVG9LZXkoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0RBVEFfVU5DTE9TRUQsIGNkYXRUYWJsZSwgVU5DTE9TRURfVEFHX0VSUk9SLCBNU0dfVU5DTE9TRURfQ0RBVEFfU0VDVElPTl9FUlJPUik7Ci0KLQkJLy8gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlcnJvciBtYXAKLQkJRXJyb3JUYWJsZSBwaVRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05dOwotCQlwaVRhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5QSV9JTlZBTElEX0NPTlRFTlQsIHBpVGFibGUsIElOVkFMSURfQ09OVEVOVF9FUlJPUiwgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUik7Ci0JCW1hcFRvS2V5KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlBJX1VOQ0xPU0VELCBwaVRhYmxlLCBVTkNMT1NFRF9UQUdfRVJST1IsIE1TR19VTkNMT1NFRF9QSV9FUlJPUik7Ci0KLQkJLy8gZW50aXR5IHJlZmVyZW5jZSBlcnJvciBtYXAKLQkJRXJyb3JUYWJsZSBlclRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLkVOVElUWV9SRUZFUkVOQ0VdOwotCQllclRhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5SRUZfVU5ERUZJTkVELCBlclRhYmxlLCBVTkRFRklORURfTkFNRV9FUlJPUiwgTVNHX1VOREVGSU5FRF9UQUdfRVJST1IpOwotCQltYXBUb0tleShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5SRUZfSU5WQUxJRF9DT05URU5ULCBlclRhYmxlLCBJTlZBTElEX0NPTlRFTlRfRVJST1IsIE1TR19JTlZBTElEX0NPTlRFTlRfRVJST1IpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFcnJvclRhYmxlIHsKLQkJcHJpdmF0ZSBjbGFzcyBQYWNrZXQgewotCQkJcHVibGljIFBhY2tldChTdHJpbmcgbXNnLCBpbnQgc2V2ZXJpdHkpIHsKLQkJCQl0aGlzLm1zZyA9IG1zZzsKLQkJCQl0aGlzLnNldmVyaXR5ID0gc2V2ZXJpdHk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJCQlyZXR1cm4gbXNnOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldFNldmVyaXR5KCkgewotCQkJCXJldHVybiBzZXZlcml0eTsKLQkJCX0KLQotCQkJcHJpdmF0ZSBTdHJpbmcgbXNnID0gbnVsbDsKLQkJCXByaXZhdGUgaW50IHNldmVyaXR5ID0gLTE7Ci0JCX0KLQotCQlwdWJsaWMgRXJyb3JUYWJsZSgpIHsKLQkJfQotCi0JCXB1YmxpYyBQYWNrZXQgcHV0KGludCBzdGF0ZSwgU3RyaW5nIG1zZywgaW50IHNldmVyaXR5KSB7Ci0JCQlQYWNrZXQgcGFja2V0ID0gbmV3IFBhY2tldChtc2csIHNldmVyaXR5KTsKLQkJCW1hcC5wdXQobmV3IEludGVnZXIoc3RhdGUpLCBwYWNrZXQpOwotCQkJcmV0dXJuIHBhY2tldDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShpbnQgc3RhdGUpIHsKLQkJCXJldHVybiBnZXRQYWNrZXQoc3RhdGUpLmdldE1lc3NhZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoaW50IHN0YXRlKSB7Ci0JCQlyZXR1cm4gZ2V0UGFja2V0KHN0YXRlKS5nZXRTZXZlcml0eSgpOwotCQl9Ci0KLQkJcHJpdmF0ZSBQYWNrZXQgZ2V0UGFja2V0KGludCBzdGF0ZSkgewotCQkJcmV0dXJuIChQYWNrZXQpIG1hcC5nZXQobmV3IEludGVnZXIoc3RhdGUpKTsKLQkJfQotCi0JCXByaXZhdGUgSGFzaHRhYmxlIG1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnRlcmZhY2UgTm9kZVR5cGUgewotCQlzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURSA9IDA7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVCA9IDE7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgRE9DVU1FTlRfVFlQRSA9IDI7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgVEVYVCA9IDM7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVCA9IDQ7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgQ0RBVEFfU0VDVElPTiA9IDU7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgUFJPQ0VTU0lOR19JTlNUUlVDVElPTiA9IDY7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX1JFRkVSRU5DRSA9IDc7Ci0KLQkJc3RhdGljIGZpbmFsIGludCBNQVhfVFlQRSA9IDg7Ci0JfQotCi0JLy8gZXJyb3IgbWVzc2FnZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX05PX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5Ob19lcnJvcl9fVUlfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5ERUZJTkVEX0FUVFJfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLlVuZGVmaW5lZF9hdHRyaWJ1dGVfbmFtZV9fX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1VOREVGSU5FRF9WQUxVRV9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuVW5kZWZpbmVkX2F0dHJpYnV0ZV92YWx1ZV9fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfRFVQTElDQVRFX0FUVFJfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLk11bHRpcGxlX3ZhbHVlc19zcGVjaWZpZWRfX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX01JU01BVENIRURfQVRUUl9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuQXR0cmlidXRlX25hbWVfX18wX19fdXNlc19fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfSU5WQUxJRF9BVFRSX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5JbnZhbGlkX2F0dHJpYnV0ZV9uYW1lX19fMF9FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19BVFRSX05PX1ZBTFVFX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5JbnZhbGlkX2F0dHJpYnV0ZV9fXzBfX19fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5JbnZhbGlkX2xvY2F0aW9uX29mX3RhZ19fX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19EVVBMSUNBVEVfVEFHX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5EdXBsaWNhdGVfdGFnX19fMF9fX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19NSVNTSU5HX1NUQVJUX1RBR19FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuTm9fc3RhcnRfdGFnX19fXzBfX19fX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX01JU1NJTkdfRU5EX1RBR19FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuTm9fZW5kX3RhZ19fX19fMF9fX19fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5ORUNFU1NBUllfRU5EX1RBR19FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuRW5kX3RhZ19fX19fMF9fX19ub3RfbmVlZGVfRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5ERUZJTkVEX1RBR19FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuVW5rbm93bl90YWdfX18wX19fX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX01JU01BVENIRURfVEFHX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5UYWdfbmFtZV9fXzBfX191c2VzX3dyb25nX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19JTlZBTElEX1RBR19FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuSW52YWxpZF90YWdfbmFtZV9fXzBfX19fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfSU5WQUxJRF9ESVJFQ1RJVkVfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkludmFsaWRfSlNQX2RpcmVjdGl2ZV9fXzBfX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX0lOVkFMSURfVEVYVF9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuSW52YWxpZF90ZXh0X3N0cmluZ19fXzBfX19fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfSU5WQUxJRF9DSEFSX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5JbnZhbGlkX2NoYXJhY3Rlcl91c2VkX2luX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTktOT1dOX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5Vbmtub3duX2Vycm9yX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTkNMT1NFRF9TVEFSVF9UQUdfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLlN0YXJ0X3RhZ19fX18wX19fX25vdF9jbG9zX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1VOQ0xPU0VEX0VORF9UQUdfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkVuZF90YWdfX19fXzBfX19fbm90X2Nsb3NlX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX01JU01BVENIRURfQVRUUl9WQUxVRV9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuQXR0cmlidXRlX3ZhbHVlX19fMF9fX3VzZXNfRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5DTE9TRURfQ09NTUVOVF9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuQ29tbWVudF9ub3RfY2xvc2VkX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTkNMT1NFRF9ET0NUWVBFX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5ET0NUWVBFX2RlY2xhcmF0aW9uX25vdF9jbF9FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTkNMT1NFRF9QSV9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuUHJvY2Vzc2luZ19pbnN0cnVjdGlvbl9ub3RfRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5DTE9TRURfQ0RBVEFfU0VDVElPTl9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuQ0RBVEFfc2VjdGlvbl9ub3RfY2xvc2VkX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19JTlZBTElEX0VNUFRZX0VMRU1FTlRfVEFHID0gSFRNTENvcmVNZXNzYWdlcy5fRVJST1JfVGFnX19fMF9fX3Nob3VsZF9iZV9hbl9lbXB0eV9lbGVtZW50X3RhZ18xOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5DTE9TRURfQVRUUl9WQUxVRV9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuX0VSUk9SX0F0dHJpYnV0ZV92YWx1ZV9fXzBfX19ub3RfY2xvc2VkX18xOwotCXByaXZhdGUgRXJyb3JUYWJsZVtdIGVyclRhYmxlcyA9IG5ldyBFcnJvclRhYmxlW05vZGVUeXBlLk1BWF9UWVBFXTsKLQotLy8Jc3RhdGljIHsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IE5vZGVUeXBlLk1BWF9UWVBFOyBpKyspIHsKLS8vCQkJZXJyVGFibGVzW2ldID0gbmV3IEVycm9yVGFibGUoKTsKLS8vCQl9Ci0vLwkJLy8gTk9URTogVGhlIHNldmVyaXRpZXMgYXJlIGp1c3Qgc3R1Yi4gIFRoZXkgbXVzdCBiZSByZXZpZXdlZC4KLS8vCQkvLyAtLSA4LzMwLzIwMDEKLS8vCi0vLwkJLy8gYXR0cmlidXRlIGVycm9yIG1hcAotLy8JCUVycm9yVGFibGUgYXR0clRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLkFUVFJJQlVURV07Ly8gc2hvcnQgaGFuZAotLy8JCWF0dHJUYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLS8vCQlhdHRyVGFibGUucHV0KFVOREVGSU5FRF9OQU1FX0VSUk9SLCBNU0dfVU5ERUZJTkVEX0FUVFJfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JCWF0dHJUYWJsZS5wdXQoVU5ERUZJTkVEX1ZBTFVFX0VSUk9SLCBNU0dfVU5ERUZJTkVEX1ZBTFVFX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLS8vCQlhdHRyVGFibGUucHV0KE1JU01BVENIRURfRVJST1IsIE1TR19NSVNNQVRDSEVEX0FUVFJfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JCWF0dHJUYWJsZS5wdXQoSU5WQUxJRF9OQU1FX0VSUk9SLCBNU0dfSU5WQUxJRF9BVFRSX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLS8vCQlhdHRyVGFibGUucHV0KElOVkFMSURfQVRUUl9FUlJPUiwgTVNHX0FUVFJfTk9fVkFMVUVfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JCWF0dHJUYWJsZS5wdXQoRFVQTElDQVRFX0VSUk9SLCBNU0dfRFVQTElDQVRFX0FUVFJfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JCWF0dHJUYWJsZS5wdXQoTUlTTUFUQ0hFRF9WQUxVRV9FUlJPUiwgTVNHX01JU01BVENIRURfQVRUUl9WQUxVRV9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotLy8JCS8vPDxEMjEwNDIyCi0vLwkJYXR0clRhYmxlLnB1dChVTkNMT1NFRF9BVFRSX1ZBTFVFLCBNU0dfVU5DTE9TRURfQVRUUl9WQUxVRV9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwkJLy9EMjEwNDIyCi0vLwkJLy8gZWxlbWVudCBlcnJvciBtYXAKLS8vCQlFcnJvclRhYmxlIGVsZW1UYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5FTEVNRU5UXTsvLyBzaG9ydCBoYW5kCi0vLwkJZWxlbVRhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotLy8JCWVsZW1UYWJsZS5wdXQoVU5ERUZJTkVEX05BTUVfRVJST1IsIE1TR19VTkRFRklORURfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLS8vCQllbGVtVGFibGUucHV0KElOVkFMSURfTkFNRV9FUlJPUiwgTVNHX0lOVkFMSURfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0vLwkJZWxlbVRhYmxlLnB1dChNSVNNQVRDSEVEX0VSUk9SLCBNU0dfTUlTTUFUQ0hFRF9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JCWVsZW1UYWJsZS5wdXQoTUlTTUFUQ0hFRF9FTkRfVEFHX0VSUk9SLCBNU0dfTUlTTUFUQ0hFRF9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLS8vCQllbGVtVGFibGUucHV0KE1JU1NJTkdfU1RBUlRfVEFHX0VSUk9SLCBNU0dfTUlTU0lOR19TVEFSVF9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLS8vCQllbGVtVGFibGUucHV0KE1JU1NJTkdfRU5EX1RBR19FUlJPUiwgTVNHX01JU1NJTkdfRU5EX1RBR19FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwkJZWxlbVRhYmxlLnB1dChVTk5FQ0VTU0FSWV9FTkRfVEFHX0VSUk9SLCBNU0dfVU5ORUNFU1NBUllfRU5EX1RBR19FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwkJZWxlbVRhYmxlLnB1dChJTlZBTElEX0RJUkVDVElWRV9FUlJPUiwgTVNHX0lOVkFMSURfRElSRUNUSVZFX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0vLwkJZWxlbVRhYmxlLnB1dChJTlZBTElEX0NPTlRFTlRfRVJST1IsIE1TR19JTlZBTElEX0NPTlRFTlRfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JCWVsZW1UYWJsZS5wdXQoRFVQTElDQVRFX0VSUk9SLCBNU0dfRFVQTElDQVRFX1RBR19FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwkJZWxlbVRhYmxlLnB1dChDT0VYSVNURU5DRV9FUlJPUiwgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwkJZWxlbVRhYmxlLnB1dChVTkNMT1NFRF9UQUdfRVJST1IsIE1TR19VTkNMT1NFRF9TVEFSVF9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLS8vCQllbGVtVGFibGUucHV0KFVOQ0xPU0VEX0VORF9UQUdfRVJST1IsIE1TR19VTkNMT1NFRF9FTkRfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0vLwkJZWxlbVRhYmxlLnB1dChJTlZBTElEX0VNUFRZX0VMRU1FTlRfVEFHLCBNU0dfSU5WQUxJRF9FTVBUWV9FTEVNRU5UX1RBRywgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwotLy8JCS8vIGRvY3VtZW50IHR5cGUgZXJyb3IgbWFwCi0vLwkJRXJyb3JUYWJsZSBkb2NUYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5ET0NVTUVOVF9UWVBFXTsvLyBzaG9ydCBoYW5kCi0vLwkJZG9jVGFibGUucHV0KE5PTkVfRVJST1IsIE1TR19OT19FUlJPUiwgMCk7Ci0vLwkJZG9jVGFibGUucHV0KERVUExJQ0FURV9FUlJPUiwgTVNHX0RVUExJQ0FURV9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLS8vCQlkb2NUYWJsZS5wdXQoSU5WQUxJRF9DT05URU5UX0VSUk9SLCBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLS8vCQlkb2NUYWJsZS5wdXQoVU5DTE9TRURfVEFHX0VSUk9SLCBNU0dfVU5DTE9TRURfRE9DVFlQRV9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotLy8KLS8vCQkvLyB0ZXh0IGVycm9yIG1hcAotLy8JCUVycm9yVGFibGUgdGV4dFRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLlRFWFRdOwotLy8JCXRleHRUYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLS8vCQl0ZXh0VGFibGUucHV0KElOVkFMSURfQ09OVEVOVF9FUlJPUiwgTVNHX0lOVkFMSURfVEVYVF9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwkJdGV4dFRhYmxlLnB1dChJTlZBTElEX0NIQVJfRVJST1IsIE1TR19JTlZBTElEX0NIQVJfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8KLS8vCQkvLyBjb21tZW50IGVycm9yIG1hcAotLy8JCUVycm9yVGFibGUgY29tbVRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLkNPTU1FTlRdOwotLy8JCWNvbW1UYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLS8vCQljb21tVGFibGUucHV0KElOVkFMSURfQ09OVEVOVF9FUlJPUiwgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0vLwkJY29tbVRhYmxlLnB1dChVTkNMT1NFRF9UQUdfRVJST1IsIE1TR19VTkNMT1NFRF9DT01NRU5UX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0vLwotLy8JCS8vIGNkYXRhIHNlY3Rpb24gZXJyb3IgbWFwCi0vLwkJRXJyb3JUYWJsZSBjZGF0VGFibGUgPSBlcnJUYWJsZXNbTm9kZVR5cGUuQ0RBVEFfU0VDVElPTl07Ci0vLwkJY2RhdFRhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotLy8JCWNkYXRUYWJsZS5wdXQoSU5WQUxJRF9DT05URU5UX0VSUk9SLCBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLS8vCQljZGF0VGFibGUucHV0KFVOQ0xPU0VEX1RBR19FUlJPUiwgTVNHX1VOQ0xPU0VEX0NEQVRBX1NFQ1RJT05fRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLS8vCi0vLwkJLy8gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlcnJvciBtYXAKLS8vCQlFcnJvclRhYmxlIHBpVGFibGUgPSBlcnJUYWJsZXNbTm9kZVR5cGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl07Ci0vLwkJcGlUYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLS8vCQlwaVRhYmxlLnB1dChJTlZBTElEX0NPTlRFTlRfRVJST1IsIE1TR19JTlZBTElEX0NPTlRFTlRfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JCXBpVGFibGUucHV0KFVOQ0xPU0VEX1RBR19FUlJPUiwgTVNHX1VOQ0xPU0VEX1BJX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0vLwotLy8JCS8vIGVudGl0eSByZWZlcmVuY2UgZXJyb3IgbWFwCi0vLwkJRXJyb3JUYWJsZSBlclRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLkVOVElUWV9SRUZFUkVOQ0VdOwotLy8JCWVyVGFibGUucHV0KE5PTkVfRVJST1IsIE1TR19OT19FUlJPUiwgMCk7Ci0vLwkJZXJUYWJsZS5wdXQoVU5ERUZJTkVEX05BTUVfRVJST1IsIE1TR19VTkRFRklORURfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLS8vCQllclRhYmxlLnB1dChJTlZBTElEX0NPTlRFTlRfRVJST1IsIE1TR19JTlZBTElEX0NPTlRFTlRfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotLy8JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25NZXNzYWdlIGNyZWF0ZU1lc3NhZ2UoRXJyb3JJbmZvIGluZm8pIHsKLQkJU3RyaW5nIGVycm9yTXNnID0gZ2V0RXJyb3JNZXNzYWdlKGluZm8pOwotCQlpbnQgZXJyb3JTZXZlcml0eSA9IGdldEVycm9yU2V2ZXJpdHkoaW5mbyk7Ci0JCXJldHVybiBuZXcgVmFsaWRhdGlvbk1lc3NhZ2UoZXJyb3JNc2csIGluZm8uZ2V0T2Zmc2V0KCksIGluZm8uZ2V0TGVuZ3RoKCksIGVycm9yU2V2ZXJpdHkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEVycm9yTWVzc2FnZShFcnJvckluZm8gaW5mbykgewotCQlFcnJvclRhYmxlIHRhYiA9IGdldEVycm9yVGFibGUoaW5mby5nZXRUYXJnZXRUeXBlKCkpOwotCQlpZiAodGFiID09IG51bGwpCi0JCQlyZXR1cm4gTVNHX1VOS05PV05fRVJST1I7Ci0KLQkJU3RyaW5nIHRlbXBsYXRlID0gdGFiLmdldE1lc3NhZ2UoaW5mby5nZXRTdGF0ZSgpKTsKLQkJT2JqZWN0W10gYXJndW1lbnRzID0ge2luZm8uZ2V0SGludCgpfTsKLQkJU3RyaW5nIHMgPSBudWxsOwotCQl0cnkgewotCQkJcyA9IE5MUy5iaW5kKHRlbXBsYXRlLCBhcmd1bWVudHMpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXMgPSB0ZW1wbGF0ZSArICI6IiArIGFyZ3VtZW50cy50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0RXJyb3JTZXZlcml0eShFcnJvckluZm8gaW5mbykgewotCQlFcnJvclRhYmxlIHRhYiA9IGdldEVycm9yVGFibGUoaW5mby5nZXRUYXJnZXRUeXBlKCkpOwotCQlpZiAodGFiID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIHRhYi5nZXRTZXZlcml0eShpbmZvLmdldFN0YXRlKCkpOwotCX0KLQotCXByaXZhdGUgRXJyb3JUYWJsZSBnZXRFcnJvclRhYmxlKHNob3J0IG5vZGV0eXBlKSB7Ci0JCUVycm9yVGFibGUgdGFiID0gbnVsbDsKLQkJc3dpdGNoIChub2RldHlwZSkgewotCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDoKLQkJCQl0YWIgPSBlcnJUYWJsZXNbTm9kZVR5cGUuQVRUUklCVVRFXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5FTEVNRU5UXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5ET0NVTUVOVF9UWVBFXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5URVhUXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5DT01NRU5UXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5DREFUQV9TRUNUSU9OXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5FTlRJVFlfUkVGRVJFTkNFXTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0YWI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL05hbWVzcGFjZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL05hbWVzcGFjZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWUzMWFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9OYW1lc3BhY2VWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VWYWxpZGF0b3IgZXh0ZW5kcyBQcmltZVZhbGlkYXRvciBpbXBsZW1lbnRzIEVycm9yU3RhdGUgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTE5TX1BSRUZJWCA9ICJ4bWxucyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBOU19TRVBBUkFUT1IgPSAiOiI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIE5hbWVzcGFjZVZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gTmFtZXNwYWNlVmFsaWRhdG9yLmNsYXNzKSB8fCBzdXBlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIG5vZGUpIHsKLQkJRWxlbWVudCB0YXJnZXQgPSAoRWxlbWVudCkgbm9kZTsKLQkJaWYgKGlzWE1MRWxlbWVudCh0YXJnZXQpICYmIGhhc1Vua25vd25QcmVmaXgodGFyZ2V0KSkgewotCQkJSURPTUVsZW1lbnQgZSA9IChJRE9NRWxlbWVudCkgdGFyZ2V0OwotCQkJaWYgKCFpc1ZhbGlkUHJlZml4KGUuZ2V0UHJlZml4KCksIHRhcmdldCkgJiYgIWUuaXNDb21tZW50VGFnKCkpIHsKLQkJCQkvLyByZXBvcnQgdW5rbm93biB0YWcgZXJyb3IuCi0JCQkJU2VnbWVudCBlcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KGUsIEZNVXRpbC5TRUdfU1RBUlRfVEFHKTsKLQkJCQlpZiAoZXJyb3JTZWcgIT0gbnVsbCkKLQkJCQkJcmVwb3J0ZXIucmVwb3J0KG5ldyBFcnJvckluZm9JbXBsKFVOREVGSU5FRF9OQU1FX0VSUk9SLCBlcnJvclNlZywgZSkpOwotCQkJfQotCQl9Ci0JCS8vICgyKSBjaGVjayBwcmVmaXggb2YgZWFjaCBhdHRyIAotCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSB0YXJnZXQuZ2V0QXR0cmlidXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbiA9IGF0dHJzLml0ZW0oaSk7Ci0JCQlpZiAoIShuIGluc3RhbmNlb2YgSURPTUF0dHIpKQotCQkJCWNvbnRpbnVlOwotCQkJSURPTUF0dHIgYSA9IChJRE9NQXR0cikgbjsKLQkJCVN0cmluZyBwcmVmaXggPSBhLmdldFByZWZpeCgpOwotCQkJaWYgKChwcmVmaXggIT0gbnVsbCkgJiYgaXNVbmtub3duQXR0cihhLCB0YXJnZXQpKSB7Ci0JCQkJLy8gVGhlIGF0dHIgaGFzIHVua25vd24gcHJlZml4LiAgU28sIGNoZWNrIGl0LgotCQkJCWlmICghaXNWYWxpZFByZWZpeChwcmVmaXgsIHRhcmdldCkpIHsKLQkJCQkJLy8gcmVwb3J0IHVua25vd24gYXR0ciBlcnJvci4KLQkJCQkJSVRleHRSZWdpb24gciA9IGEuZ2V0TmFtZVJlZ2lvbigpOwotCQkJCQlpZiAociA9PSBudWxsKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWludCBhX29mZnNldCA9IGEuZ2V0TmFtZVJlZ2lvblN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWludCBhX2xlbmd0aCA9IGEuZ2V0TmFtZVJlZ2lvbigpLmdldExlbmd0aCgpOwotCQkJCQlyZXBvcnRlci5yZXBvcnQobmV3IEVycm9ySW5mb0ltcGwoVU5ERUZJTkVEX05BTUVfRVJST1IsIG5ldyBTZWdtZW50KGFfb2Zmc2V0LCBhX2xlbmd0aCksIGEpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBwcml2YXRlIG1ldGhvZHMJCi0JcHJpdmF0ZSBib29sZWFuIGlzWE1MRWxlbWVudChFbGVtZW50IHRhcmdldCkgewotCQlyZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgSURPTUVsZW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc1Vua25vd25QcmVmaXgoRWxlbWVudCB0YXJnZXQpIHsKLQkJcmV0dXJuIGlzVW5rbm93bkVsZW1lbnQodGFyZ2V0KSAmJiBDTVV0aWwuaXNGb3JlaWduKHRhcmdldCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVW5rbm93bkVsZW1lbnQoRWxlbWVudCB0YXJnZXQpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjID0gQ01VdGlsLmdldERlY2xhcmF0aW9uKHRhcmdldCk7Ci0JCXJldHVybiBkZWMgPT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNVbmtub3duQXR0cihJRE9NQXR0ciBhdHRyLCBFbGVtZW50IHRhcmdldCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWMgPSBDTVV0aWwuZ2V0RGVjbGFyYXRpb24odGFyZ2V0KTsKLQkJaWYgKGRlYyA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7IC8vIHVua25vd24uCi0JCUNNTmFtZWROb2RlTWFwIGFkZWNscyA9IGRlYy5nZXRBdHRyaWJ1dGVzKCk7Ci0JCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYWRlYyA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhZGVjbHMuZ2V0TmFtZWRJdGVtKGF0dHIuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGFkZWMgPT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFByZWZpeChTdHJpbmcgcHJlZml4LCBFbGVtZW50IGUpIHsKLQkJaWYgKHByZWZpeC5lcXVhbHMoWE1MTlNfUFJFRklYKSkKLQkJCXJldHVybiB0cnVlOyAvLyAieG1sbnM6Zm9vIiBhdHRyIGlzIGFsd2F5cyB2YWxpZC4KLQotCQkvLyAoMSkgY2hlY2sgdGhlIGVsZW1lbnQgaGFzIHRoZSBuYW1lc3BhY2UgZGVmaW5pdGlvbiBvciBub3QuCi0JCWlmIChpc1ZhbGlkUHJlZml4V2l0aGluRWxlbWVudChwcmVmaXgsIGUpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJLy8gKDIpIGNoZWNrIGFuY2VzdG9ycyBvZiB0aGUgZWxlbWVudCBoYXZlIHRoZSBuYW1lc3BhY2UgZGVmaW5pdGlvbiBvciBub3QuCi0JCUVsZW1lbnQgcGFyZW50ID0gU01VdGlsLmdldFBhcmVudEVsZW1lbnQoZSk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJaWYgKGlzVmFsaWRQcmVmaXhXaXRoaW5FbGVtZW50KHByZWZpeCwgcGFyZW50KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXBhcmVudCA9IFNNVXRpbC5nZXRQYXJlbnRFbGVtZW50KHBhcmVudCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUHJlZml4V2l0aGluRWxlbWVudChTdHJpbmcgcHJlZml4LCBFbGVtZW50IGUpIHsKLQkJU3RyaW5nIG5zID0gWE1MTlNfUFJFRklYICsgTlNfU0VQQVJBVE9SICsgcHJlZml4OwotCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBlLmdldEF0dHJpYnV0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIG4gPSBhdHRycy5pdGVtKGkpOwotCQkJaWYgKG4gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChuLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChucy5lcXVhbHMoKChBdHRyKSBuKS5nZXROYW1lKCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTnVsbFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL051bGxWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY1YzRhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTnVsbFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvblJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQ29tcG9uZW50OwotCi0vKioKLSAqIE51bGxWYWxpZGF0b3IgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgYSByZXBsYWNlbWVudCBvZiBudWxsCi0gKiBmb3IgVmFsaWRhdGlvbkNvbXBvbmVudCB0eXBlLgotICovCi1maW5hbCBjbGFzcyBOdWxsVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdGlvbkNvbXBvbmVudCB7Ci0KLQlwdWJsaWMgTnVsbFZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIG5vZGUpIHsKLQkJcmV0dXJuOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlcG9ydGVyKFZhbGlkYXRpb25SZXBvcnRlciByZXBvcnRlcikgewotCQlyZXR1cm47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1ByaW1lVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvUHJpbWVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhYTBlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvUHJpbWVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQ29tcG9uZW50OwotCi1hYnN0cmFjdCBjbGFzcyBQcmltZVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRpb25Db21wb25lbnQgewotCi0JLyoqCi0JICogUHJpbWVWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUHJpbWVWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1NNVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1NNVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDNiOWMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9TTVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1maW5hbCBjbGFzcyBTTVV0aWwgewotCi0JcHJpdmF0ZSBTTVV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogZ2V0IGFuIGFuY2VzdG9yIGVsZW1lbnQgaWdub3JpbmcgaW1wbGljaXQgb25lcy4gKi8KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgZ2V0UGFyZW50RWxlbWVudChOb2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTm9kZSBwID0gY2hpbGQuZ2V0UGFyZW50Tm9kZSgpOwotCQl3aGlsZSAocCAhPSBudWxsKSB7Ci0JCQlpZiAocC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJcmV0dXJuIChFbGVtZW50KSBwOwotCQkJfQotCQkJcCA9IHAuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9TZWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvU2VnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGJhZjRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9TZWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi1wdWJsaWMgY2xhc3MgU2VnbWVudCB7Ci0KLQlwcml2YXRlIGludCBvZmZzZXQgPSAwOwotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU2VnbWVudChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU2VnbWVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlzdXBlcigpOwotCQl0aGlzLm9mZnNldCA9IHJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQl0aGlzLmxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBOT1RFOiAnc3RhcnQnIGFuZCAnZW5kJyBtdXN0IGJlIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBjb250aWd1b3VzIHJlZ2lvbnMuCi0JICogT3RoZXJ3aXNlLCB0aGlzIGNsYXNzIGNhbm5vdCB3b3JrIGNvcnJlY3RseS4KLQkgKi8KLQlwdWJsaWMgU2VnbWVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZCkgewotCQlzdXBlcigpOwotCQl0aGlzLm9mZnNldCA9IHN0YXJ0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmRPZmZzZXQgPSAoZW5kID09IG51bGwpID8gc3RhcnQuZ2V0RW5kT2Zmc2V0KCkgOiBlbmQuZ2V0RW5kT2Zmc2V0KCk7Ci0JCXRoaXMubGVuZ3RoID0gZW5kT2Zmc2V0IC0gdGhpcy5vZmZzZXQ7Ci0JfQotCi0JLy9wdWJsaWMgU2VnbWVudChJVGV4dFJlZ2lvbiBzdGFydCwgSVRleHRSZWdpb24gZW5kKSB7Ci0JLy8Jc3VwZXIoKTsKLQkvLwl0aGlzLm9mZnNldCA9IHN0YXJ0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JLy8JaW50IGVuZE9mZnNldCA9IChlbmQgPT0gbnVsbCkgPyBzdGFydC5nZXRFbmRPZmZzZXQoKSA6IGVuZC5nZXRFbmRPZmZzZXQoKTsKLQkvLwl0aGlzLmxlbmd0aCA9IGVuZE9mZnNldCAtIHRoaXMub2Zmc2V0OwotCS8vfQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB0aGlzLm9mZnNldDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvU3ludGF4VmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvU3ludGF4VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1Y2MwMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1N5bnRheFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLkVycm9ySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Tb3VyY2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1jbGFzcyBTeW50YXhWYWxpZGF0b3IgZXh0ZW5kcyBQcmltZVZhbGlkYXRvciBpbXBsZW1lbnRzIEVycm9yU3RhdGUgewotCi0KLQlzdGF0aWMgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRSZWdpb24oSVRleHRSZWdpb24gcmduKSB7Ci0JCVN0cmluZyB0eXBlID0gcmduLmdldFR5cGUoKTsKLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsgLy8gbm8gdHlwZSBpcyBpbnZhbGlkLgotCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4gfHwgdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXN0YXRpYyBwcml2YXRlIFN0cmluZyBnZXRUYWdOYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdGFnKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gdGFnLmdldFJlZ2lvbnMoKTsKLQkJSXRlcmF0b3IgaXRlciA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZ24gPSAoSVRleHRSZWdpb24pIGl0ZXIubmV4dCgpOwotCQkJaWYgKHJnbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpCi0JCQkJcmV0dXJuIHRhZy5nZXRUZXh0KHJnbik7Ci0JCX0KLQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBib29sZWFuIGlzRW1wdHlDb250ZW50KENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJcmV0dXJuIChkZWNsICE9IG51bGwpICYmIChkZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpOwotCX0KLQotCXB1YmxpYyBTeW50YXhWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKCh0eXBlID09IFN5bnRheFZhbGlkYXRvci5jbGFzcykgfHwgc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSk7Ci0JfQotCi0JY2xhc3MgRWxlbWVudEluZm8gewotCQlwdWJsaWMgRWxlbWVudEluZm8oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIElET01FbGVtZW50IHRhcmdldCA9IG51bGw7Ci0JCXB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gbnVsbDsKLQkJcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWcgPSBudWxsOwotCQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWcgPSBudWxsOwotCQlwdWJsaWMgYm9vbGVhbiBoYXNTdGFydFRhZyA9IGZhbHNlOwotCQlwdWJsaWMgYm9vbGVhbiBoYXNFbmRUYWcgPSBmYWxzZTsKLQkJcHVibGljIGJvb2xlYW4gaXNYSFRNTCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKEluZGV4ZWRSZWdpb24gaW5kZXhlZE5vZGUpIHsKLQkJTm9kZSBub2RlID0gKE5vZGUpIGluZGV4ZWROb2RlOwotCQl2YWxpZGF0ZUNoaWxkcmVuKG5vZGUpOwotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlyZXR1cm47Ci0JCWlmICghKG5vZGUgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCkpCi0JCQlyZXR1cm47Ci0KLQkJRWxlbWVudEluZm8gaW5mbyA9IG5ldyBFbGVtZW50SW5mbygpOwotCQlpbmZvLnRhcmdldCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQotCQkvLyBnYXRoZXIgaW5mb3JtYXRpb24gdG8gdmFsaWRhdGUgZnJvbSB0YXJnZXQgYXQgb25jZS4KLQkJZ2V0SW5mbyhpbmZvKTsKLQotCQlpZiAoaW5mby50YXJnZXQuaXNHbG9iYWxUYWcoKSkgewotCQkJdmFsaWRhdGVUYWdzKGluZm8pOwotCQkJdmFsaWRhdGVOYW1lcyhpbmZvKTsKLQkJCWlmIChpbmZvLmRlY2wgIT0gbnVsbCAmJiBpbmZvLmlzWEhUTUwpIHsKLQkJCQl2YWxpZGF0ZVRhZ0Nhc2UoaW5mbyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0SW5mbyhFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCWluZm8uZGVjbCA9IENNVXRpbC5nZXREZWNsYXJhdGlvbihpbmZvLnRhcmdldCk7Ci0JCWluZm8uc3RhcnRUYWcgPSBpbmZvLnRhcmdldC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpbmZvLmVuZFRhZyA9IGluZm8udGFyZ2V0LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCWluZm8uaGFzU3RhcnRUYWcgPSAoaW5mby5zdGFydFRhZyAhPSBudWxsKTsKLQkJaW5mby5oYXNFbmRUYWcgPSAoaW5mby5lbmRUYWcgIT0gbnVsbCk7Ci0KLQkJRG9jdW1lbnQgZG9jID0gaW5mby50YXJnZXQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoIShkb2MgaW5zdGFuY2VvZiBJRE9NRG9jdW1lbnQpKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgdHlwZWlkID0gKChJRE9NRG9jdW1lbnQpIGRvYykuZ2V0RG9jdW1lbnRUeXBlSWQoKTsKLQkJaWYgKHR5cGVpZCAhPSBudWxsKSB7Ci0JCQlIVE1MRG9jdW1lbnRUeXBlRW50cnkgZW50cnkgPSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRFbnRyeSh0eXBlaWQpOwotCQkJaW5mby5pc1hIVE1MID0gKGVudHJ5ICE9IG51bGwgJiYgZW50cnkuaXNYTUxUeXBlKCkpOwotCQl9Ci0JfQotCi0JY2xhc3MgVGFnRXJyb3JJbmZvSW1wbCBleHRlbmRzIEFic3RyYWN0RXJyb3JJbmZvIHsKLQkJcHJpdmF0ZSBTdHJpbmcgaGludCA9IG51bGw7Ci0KLQkJcHVibGljIFRhZ0Vycm9ySW5mb0ltcGwoaW50IHN0YXRlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRhZywgU3RyaW5nIGhpbnQpIHsKLQkJCXN1cGVyKHN0YXRlLCBuZXcgU2VnbWVudCh0YWcpKTsKLQkJCXRoaXMuaGludCA9IGhpbnQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEhpbnQoKSB7Ci0JCQlyZXR1cm4gaGludDsKLQkJfQotCi0JCXB1YmxpYyBzaG9ydCBnZXRUYXJnZXRUeXBlKCkgewotCQkJcmV0dXJuIE5vZGUuRUxFTUVOVF9OT0RFOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5kVGFnQ29ycnVwdGVkKEVsZW1lbnRJbmZvIGluZm8pIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBpbmZvLmVuZFRhZy5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwgfHwgcmVnaW9ucy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmduID0gKElUZXh0UmVnaW9uKSBpdGVyLm5leHQoKTsKLQkJCWlmICghaXNWYWxpZFJlZ2lvbihyZ24pKQotCQkJCXJldHVybiB0cnVlOyAvLyBmb3VuZCBpbnZhbGlkIHJlZ2lvbiB0eXBlLgotCQl9Ci0JCXJldHVybiBmYWxzZTsgLy8gYWxsIHJlZ2lvbnMgYXJlIHZhbGlkLgotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEVuZFRhZ0Z1bGxUZXh0KEVsZW1lbnRJbmZvIGluZm8pIHsKLQkJU3RyaW5nIGhpbnQgPSAiIjsvLyROT04tTkxTLTEkCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gaW5mby5lbmRUYWcuZ2V0UmVnaW9ucygpOwotCQlJdGVyYXRvciBpdGVyID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJnbiA9IChJVGV4dFJlZ2lvbikgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgdHlwZSA9IHJnbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOIHx8IHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKQotCQkJCWNvbnRpbnVlOwotCQkJaGludCArPSBpbmZvLmVuZFRhZy5nZXRGdWxsVGV4dChyZ24pOwotCQl9Ci0JCXJldHVybiBoaW50OwotCX0KLQotCXByaXZhdGUgdm9pZCByZXBvcnRDb3JydXB0ZWRFbmRUYWdFcnJvcihFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCVN0cmluZyBoaW50ID0gZ2V0RW5kVGFnRnVsbFRleHQoaW5mbyk7Ci0JCVRhZ0Vycm9ySW5mb0ltcGwgZXJyb3IgPSBuZXcgVGFnRXJyb3JJbmZvSW1wbChVTkRFRklORURfTkFNRV9FUlJPUiwgaW5mby5lbmRUYWcsIGhpbnQpOwotCQl0aGlzLnJlcG9ydGVyLnJlcG9ydChlcnJvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVGFncyhFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCWlmIChpbmZvLmhhc1N0YXJ0VGFnKSB7Ci0JCQlpZiAoIWluZm8udGFyZ2V0LmlzU3RhcnRUYWdDbG9zZWQoKSkgewotCQkJCS8vIE1hcmsgdGhlIHdob2xlIFNUQVJUIHRhZyBhcyBhbiBlcnJvciBzZWdtZW50LgotCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBuZXcgU2VnbWVudChpbmZvLnN0YXJ0VGFnKTsKLQkJCQlyZXBvcnQoVU5DTE9TRURfVEFHX0VSUk9SLCBlcnJvclNlZywgaW5mby50YXJnZXQpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGluZm8uaGFzRW5kVGFnKSB7Ci0JCQkJaWYgKGluZm8uZGVjbCAhPSBudWxsKSB7Ci0JCQkJCWlmIChDTVV0aWwuaXNIVE1MKGluZm8uZGVjbCkgJiYgIWluZm8udGFyZ2V0Lmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQkJaWYgKGluZm8udGFyZ2V0LmlzQ29udGFpbmVyKCkpIHsKLQkJCQkJCQkvLyBTZXQgdGhlIGVycm9yIG1hcmsgdG8gdGhlIHN0YXJ0IG9mIHRoZSBlbGVtZW50LgotCQkJCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBuZXcgU2VnbWVudChpbmZvLnRhcmdldC5nZXRTdGFydE9mZnNldCgpLCAwKTsKLQkJCQkJCQlyZXBvcnQoTUlTU0lOR19TVEFSVF9UQUdfRVJST1IsIGVycm9yU2VnLCBpbmZvLnRhcmdldCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBNYXJrIHRoZSB3aG9sZSBFTkQgdGFnIGFzIGFuIGVycm9yIHNlZ21lbnQuCi0JCQkJCQkJU2VnbWVudCBlcnJvclNlZyA9IG5ldyBTZWdtZW50KGluZm8uZW5kVGFnKTsKLQkJCQkJCQlyZXBvcnQoVU5ORUNFU1NBUllfRU5EX1RBR19FUlJPUiwgZXJyb3JTZWcsIGluZm8udGFyZ2V0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChpbmZvLmlzWEhUTUwpIHsKLQkJCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBuZXcgU2VnbWVudChpbmZvLnRhcmdldC5nZXRTdGFydE9mZnNldCgpLCAwKTsKLQkJCQkJCXJlcG9ydChNSVNTSU5HX1NUQVJUX1RBR19FUlJPUiwgZXJyb3JTZWcsIGluZm8udGFyZ2V0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChpbmZvLmhhc0VuZFRhZykgewotCQkJaWYgKCFpbmZvLnRhcmdldC5pc0Nsb3NlZCgpKSB7Ci0JCQkJLy8gU2V0IHRoZSB3aG9sZSBFTkQgdGFnIGFzIGVycm9yIHNlZ21lbnQuCi0JCQkJU2VnbWVudCBlcnJvclNlZyA9IG5ldyBTZWdtZW50KGluZm8uZW5kVGFnKTsKLQkJCQlyZXBvcnQoVU5DTE9TRURfRU5EX1RBR19FUlJPUiwgZXJyb3JTZWcsIGluZm8udGFyZ2V0KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChpbmZvLmlzWEhUTUwpIHsgLy8gWEhUTUwKLQkJCQlpZiAoIWluZm8udGFyZ2V0LmlzRW1wdHlUYWcoKSkgewotCQkJCQlpZiAoaXNFbXB0eUNvbnRlbnQoaW5mby5kZWNsKSkgewotCQkJCQkJLy8gRU1QVFkgZWxlbWVudCBzaG91bGQgYmUgd3JpdHRlbiBpbiA8Li4uLz4gZm9ybS4KLQkJCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBGTVV0aWwuZ2V0U2VnbWVudChpbmZvLnRhcmdldCwgRk1VdGlsLlNFR19TVEFSVF9UQUcpOwotCQkJCQkJcmVwb3J0KElOVkFMSURfRU1QVFlfRUxFTUVOVF9UQUcsIGVycm9yU2VnLCBpbmZvLnRhcmdldCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBlbmQgdGFnIGlzIHJlcXVpcmVkLgotCQkJCQkJU2VnbWVudCBlcnJvclNlZyA9IG5ldyBTZWdtZW50KGluZm8udGFyZ2V0LmdldEVuZE9mZnNldCgpLCAwKTsKLQkJCQkJCXJlcG9ydChNSVNTSU5HX0VORF9UQUdfRVJST1IsIGVycm9yU2VnLCBpbmZvLnRhcmdldCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsgLy8gSFRNTAotCQkJCWlmIChpbmZvLmhhc1N0YXJ0VGFnKSB7Ci0JCQkJCWlmIChpbmZvLmRlY2wgIT0gbnVsbCAmJiBDTVV0aWwuaXNIVE1MKGluZm8uZGVjbCkgJiYgIWluZm8udGFyZ2V0LmlzRW1wdHlUYWcoKSAmJiAhQ01VdGlsLmlzRW5kVGFnT21pc3NpYmxlKGluZm8uZGVjbCkpIHsKLQkJCQkJCS8vIFNldCB0aGUgZXJyb3IgbWFyayB0byB0aGUgZW5kIG9mIHRoZSBlbGVtZW50LgotCQkJCQkJU2VnbWVudCBlcnJvclNlZyA9IG5ldyBTZWdtZW50KGluZm8udGFyZ2V0LmdldEVuZE9mZnNldCgpLCAwKTsKLQkJCQkJCXJlcG9ydChNSVNTSU5HX0VORF9UQUdfRVJST1IsIGVycm9yU2VnLCBpbmZvLnRhcmdldCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBwZXJmb3JtIHZhbGlkYXRpb24gYWJvdXQgdGFnIG5hbWUgZGVmaW5pdGlvbi4gKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVOYW1lcyhFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCWJvb2xlYW4gY29ycnVwdGVkID0gaW5mby5oYXNFbmRUYWcgJiYgaXNFbmRUYWdDb3JydXB0ZWQoaW5mbyk7Ci0JCWlmIChpbmZvLmRlY2wgPT0gbnVsbCkgewotCQkJLy8gSWYgbm8gZGVjbGFyYXRpb24gaXMgcmV0cmlldmVkLCB0aGUgdGFyZ2V0IGlzIHJlYWxseQotCQkJLy8gdW5rbm93biBlbGVtZW50LgotCQkJaWYgKCFpbmZvLmhhc1N0YXJ0VGFnICYmIGNvcnJ1cHRlZCkgewotCQkJCXJlcG9ydENvcnJ1cHRlZEVuZFRhZ0Vycm9yKGluZm8pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJU2VnbWVudCBlcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KGluZm8udGFyZ2V0LCBGTVV0aWwuU0VHX1NUQVJUX1RBRyk7Ci0JCQkJcmVwb3J0KFVOREVGSU5FRF9OQU1FX0VSUk9SLCBlcnJvclNlZywgaW5mby50YXJnZXQpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gRXZlbiBpZiBhIGRlY2xhcmF0aW9uIGNvdWxkIGJlIHJldHJpZXZlZCwgaWYgdGhlIGVuZAotCQkJLy8gdGFnIGlzIGNvcnJ1cHRlZCwgaXQgc2hvdWxkIGJlIHJlcG9ydGVkIGFzIHVuZGVmaW5lZAotCQkJLy8gbmFtZS4gKEQyMDI0OTMpCi0JCQlpZiAoY29ycnVwdGVkKSB7Ci0JCQkJcmVwb3J0Q29ycnVwdGVkRW5kVGFnRXJyb3IoaW5mbyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBwZXJmb3JtIHZhbGlkYXRpb24gdGFnIGNhc2Ugb25seSBmb3IgWEhUTUwgZG9jdW1lbnQgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVUYWdDYXNlKEVsZW1lbnRJbmZvIGluZm8pIHsKLQkJU3RyaW5nIGRlY2xhcmVkID0gaW5mby5kZWNsLmdldEVsZW1lbnROYW1lKCk7Ci0JCVN0cmluZyBzdGFydFRhZ05hbWUgPSAiIjsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBlbmRUYWdOYW1lID0gIiI7Ly8kTk9OLU5MUy0xJAotCQlpZiAoZGVjbGFyZWQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBzdGFydCB0YWcKLQkJaWYgKGluZm8uaGFzU3RhcnRUYWcpIHsKLQkJCXN0YXJ0VGFnTmFtZSA9IGdldFRhZ05hbWUoaW5mby5zdGFydFRhZyk7Ci0JCQlpZiAoIWRlY2xhcmVkLmVxdWFscyhzdGFydFRhZ05hbWUpKSB7Ci0JCQkJVGFnRXJyb3JJbmZvSW1wbCBlcnJvciA9IG5ldyBUYWdFcnJvckluZm9JbXBsKE1JU01BVENIRURfRVJST1IsIGluZm8uc3RhcnRUYWcsIHN0YXJ0VGFnTmFtZSk7Ci0JCQkJdGhpcy5yZXBvcnRlci5yZXBvcnQoZXJyb3IpOwotCQkJfQotCQl9Ci0JCS8vIGVuZCB0YWcKLQkJaWYgKGluZm8uaGFzRW5kVGFnKSB7Ci0JCQllbmRUYWdOYW1lID0gZ2V0VGFnTmFtZShpbmZvLmVuZFRhZyk7Ci0JCQlpZiAoIWluZm8uaGFzU3RhcnRUYWcgfHwgKCFlbmRUYWdOYW1lLmVxdWFscyhzdGFydFRhZ05hbWUpKSkgewotCQkJCWlmICghZGVjbGFyZWQuZXF1YWxzKGVuZFRhZ05hbWUpKSB7Ci0JCQkJCVRhZ0Vycm9ySW5mb0ltcGwgZXJyb3IgPSBuZXcgVGFnRXJyb3JJbmZvSW1wbChNSVNNQVRDSEVEX0VSUk9SLCBpbmZvLmVuZFRhZywgZW5kVGFnTmFtZSk7Ci0JCQkJCXRoaXMucmVwb3J0ZXIucmVwb3J0KGVycm9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVDaGlsZHJlbihOb2RlIHRhcmdldCkgewotCQlpZiAoKHRhcmdldC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSAmJiBDTVV0aWwuaXNGb3JlaWduKChFbGVtZW50KSB0YXJnZXQpKQotCQkJcmV0dXJuOwotCi0JCWZvciAoTm9kZSBjaGlsZCA9IHRhcmdldC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJc3dpdGNoIChjaGlsZC5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0JCQkJCXsKLQkJCQkJCUlET01Ob2RlIHRleHQgPSAoSURPTU5vZGUpIGNoaWxkOwotCQkJCQkJaW50IGNoYXJPZmZzZXQgPSB2YWxpZGF0ZVRleHRTb3VyY2UodGV4dCk7Ci0JCQkJCQlpZiAoY2hhck9mZnNldCA+PSAwKSB7Ci0JCQkJCQkJY2hhck9mZnNldCArPSB0ZXh0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQkJU2VnbWVudCBlcnJvclNlZyA9IG5ldyBTZWdtZW50KGNoYXJPZmZzZXQsIDEpOwotCQkJCQkJCWlmIChlcnJvclNlZyAhPSBudWxsKQotCQkJCQkJCQlyZXBvcnQoSU5WQUxJRF9DSEFSX0VSUk9SLCBlcnJvclNlZywgdGV4dCk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotCQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOgotCQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotCQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJCQl7Ci0JCQkJCQlJRE9NTm9kZSB0YWcgPSAoSURPTU5vZGUpIGNoaWxkOwotCQkJCQkJaWYgKCF0YWcuaXNDbG9zZWQoKSkgewotCQkJCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBGTVV0aWwuZ2V0U2VnbWVudCh0YWcsIEZNVXRpbC5TRUdfV0hPTEVfVEFHKTsKLQkJCQkJCQlpZiAoZXJyb3JTZWcgIT0gbnVsbCkKLQkJCQkJCQkJcmVwb3J0KFVOQ0xPU0VEX1RBR19FUlJPUiwgZXJyb3JTZWcsIHRhZyk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgaW50IHZhbGlkYXRlVGV4dFNvdXJjZShJRE9NTm9kZSB0ZXh0KSB7Ci0JCXRyeSB7Ci0JCQlTb3VyY2VWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IFNvdXJjZVZhbGlkYXRvcih0ZXh0KTsKLQkJCXZhbGlkYXRvci52YWxpZGF0ZVNvdXJjZSh0ZXh0LmdldFNvdXJjZSgpKTsKLQkJfQotCQljYXRjaCAoSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIGV4LmdldE9mZnNldCgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVwb3J0KGludCBzdGF0ZSwgU2VnbWVudCBlcnJvclNlZywgTm9kZSBub2RlKSB7Ci0JCUVycm9ySW5mbyBpbmZvID0gbmV3IEVycm9ySW5mb0ltcGwoc3RhdGUsIGVycm9yU2VnLCBub2RlKTsKLQkJcmVwb3J0ZXIucmVwb3J0KGluZm8pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS90ZXh0L0lIVE1MUGFydGl0aW9ucy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL3RleHQvSUhUTUxQYXJ0aXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZGQ1YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL3RleHQvSUhUTUxQYXJ0aXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0OwotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLiBJdCBkZWZpbmVzIHRoZSBwYXJ0aXRpb24KLSAqIHR5cGVzIGZvciBIVE1MLiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZAotICogaGVyZSBkaXJlY3RseS4KLSAqIAotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIVE1MUGFydGl0aW9ucyB7Ci0KLQlTdHJpbmcgSFRNTF9ERUZBVUxUID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfREVGQVVMVCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSFRNTF9ERUNMQVJBVElPTiA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFQ0xBUkFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBIVE1MX0NPTU1FTlQgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9DT01NRU5UIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIFNDUklQVCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNDUklQVF9FVkVOVEhBTkRMRVIgPSBTQ1JJUFQgKyAiLkVWRU5USEFORExFUiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU1RZTEUgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU1RZTEUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBJU1NVRTogSSB0aGluayBtZXRhIHRhZyBhcmVhcyBhcmUgaGVyZSB0b28/Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNTU4NzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWh0bWwtdmFsaWRhdGlvbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MjM5ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLWh0bWxlZGl0b3IuamFyCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQwMTVmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvcHJvamVjdGlvbnBlcmY9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGJlZTczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuaHRtbC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYzEwZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jV2VkIE1hciAyOCAwMzoyNjo0MCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MjJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jTW9uIEFwciAxNyAwMjowMTozMyBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWU5NzhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4zMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5odG1sLmludGVybmFsLnZhbGlkYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmF1dG9lZGl0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb3JyZWN0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZGVyaXZlZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXQudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oYW5kbGVyczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucmVnaXN0cnk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zZWFyY2g7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zdHlsZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRhZ2luZm87eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwud2l6YXJkO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudmlld3MuY29udGVudG91dGxpbmUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5mb3JtcztidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsMy40LjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC40MDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjguMSw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmN2ViYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgdGVtcGxhdGVzLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgc3JjLWh0bWwtdmFsaWRhdGlvbi8KLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2h0bWxfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2h0bWxfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3NWFhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdodG1sX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdodG1sX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdodG1sX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NmUxOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3aHRtbF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlYmRiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWJsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTliNDVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWFuY2hvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWFuY2hvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ODk5MmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1hbmNob3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1ib2R5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctYm9keS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNWZhOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1ib2R5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctYnV0dG9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctYnV0dG9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE0M2ZjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWJ1dHRvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWZvbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1mb250LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJiNDBjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWZvbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1mb3JtLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZm9ybS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMTM5NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1mb3JtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWY1MTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWh0bWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1odG1sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzOWJhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWh0bWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1pbWFnZS1tYXAuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1pbWFnZS1tYXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjMyMzVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctaW1hZ2UtbWFwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctaW1hZ2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1pbWFnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ODhjMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1pbWFnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWpzcC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWpzcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwODQ2MDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1qc3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLXRlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxZjgxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLXRlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctdGl0bGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy10aXRsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMjkwOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy10aXRsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTdmYjMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdoZmlsZV93aXoucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdoZmlsZV93aXoucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGZhNDQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3aGZpbGVfd2l6LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDk3ZmJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPUhUTUwgVUkgU291cmNlIEVkaXRvcgotSFRNTF9Tb3VyY2VfUGFnZV9FZGl0b3IubmFtZT1IVE1MIEVkaXRvcgotV0VCLm5hbWU9V2ViCi1IVE1MX0ZpbGVzLm5hbWU9SFRNTCBGaWxlcwotSFRNTF9Tb3VyY2UubmFtZT1FZGl0b3IKLUhUTUxfVGVtcGxhdGVzLm5hbWU9VGVtcGxhdGVzCi1IVE1MX1N0eWxlcy5uYW1lPVN0eWxlcwotSFRNTF9TeW50YXhfQ29sb3Jpbmc9U3ludGF4IENvbG9yaW5nCi1IVE1MX1R5cGluZz1UeXBpbmcKLUhUTUxfVmFsaWRhdGlvbj1WYWxpZGF0aW9uCi1IVE1MX1Byb3BlcnR5X3ZhbGlkYXRpb249SFRNTCBTeW50YXgKLVdlYkNvbnRlbnRTZXR0aW5ncy5uYW1lPVdlYiBDb250ZW50IFNldHRpbmdzCi1EZXZpY2VfUHJvZmlsZV9FbnRyeV9Qcm92aWRlcl9FeHRlbnNpb24ubmFtZT1EZXZpY2UgUHJvZmlsZSBFbnRyeSBQcm92aWRlciBFeHRlbnNpb24KLUFsbF9IVE1MX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUFsbCBIVE1MCi1IVE1MX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1OZXcgSFRNTAotSFRNTF9UYWdfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SFRNTCBUYWcKLUhUTUxfQXR0cmlidXRlX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUhUTUwgQXR0cmlidXRlCi1IVE1MX0F0dHJpYnV0ZV92YWx1ZV9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1IVE1MIEF0dHJpYnV0ZSB2YWx1ZQotSFRNTF9TeW50YXhfVmFsaWRhdG9yLm5hbWU9SFRNTCBTeW50YXggVmFsaWRhdG9yCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jb3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyBleHRlbnNpb24gcG9pbnQKLV9VSV9XSVpBUkRfTkFNRSA9IEhUTUwKLV9VSV9XSVpBUkRfQ1JFQVRFX05FV19GSUxFID0gQ3JlYXRlIGEgbmV3IEhUTUwgcGFnZQotIyMKLUFkZFRhc2subGFiZWw9QWRkICZUYXNrLi4uCi1BZGRUYXNrLnRvb2x0aXA9QWRkIFRhc2suLi4KLUFkZEJvb2ttYXJrLmxhYmVsPUFkZCBCb28ma21hcmsuLi4KLUFkZEJvb2ttYXJrLnRvb2x0aXA9QWRkIEJvb2ttYXJrLi4uCi1TZWxlY3RSdWxlci5sYWJlbD1TZWxlY3QgUnVsZXIKLSMjCi1DbGVhbnVwRG9jdW1lbnRfbGFiZWw9Q2xlYW51cCBEb2N1bWVudC4uLgotQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA9Q2xlYW51cCBEb2N1bWVudAotVG9nZ2xlQ29tbWVudF9sYWJlbD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF90b29sdGlwPVRvZ2dsZSBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfbGFiZWw9QWRkIEJsb2NrIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF90b29sdGlwPUFkZCBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwPVJlbW92ZSBCbG9jayBDb21tZW50Ci1GaW5kT2NjdXJyZW5jZXNfbGFiZWw9T2NjdXJyZW5jZXMgaW4gRmlsZQotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsPUVuY2xvc2luZyBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgZW5jbG9zaW5nIGVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWw9TmV4dCBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIG5leHQgc2libGluZwotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWw9UHJldmlvdXMgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgcHJldmlvdXMgc2libGluZwotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbD1SZXN0b3JlIExhc3QgU2VsZWN0aW9uCi1TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXA9UmVzdG9yZSBsYXN0IHNlbGVjdGlvbgotIyMKLXByZWZlcmVuY2VLZXl3b3Jkcy5maWxlcz1lZGl0b3IgaHRtbCBjcmVhdGluZyBzYXZpbmcgZmlsZXMgc3VmZml4IHNwZWNpZmllZCBlbmNvZGluZyBpYW5hIGxvYWRpbmcKLXByZWZlcmVuY2VLZXl3b3Jkcy5zb3VyY2U9ZWRpdG9yIGh0bWwgc291cmNlIGZvcm1hdHRpbmcgbGluZSB3aWR0aCBzcGxpdCBtdWx0aXBsZSBhdHRyaWJ1dGVzIG5ldyBjbGVhciBibGFuayBpbmRlbnQgdGFicyBzcGFjZXMgc2l6ZSBjb250ZW50IGFzc2lzdCBhdXRvbWF0aWNhbGx5IHN1Z2dlc3Rpb25zIHByb21wdCBjaGFyYWN0ZXJzIGluc2VydGVkIHN0cmF0ZWd5IGxheCBzdHJpY3QgbWFya3VwIGNhc2UgY29kZSBnZW5lcmF0aW9uIHRhZyBuYW1lcyBjYXBpdGFsaXphdGlvbiB1cHBlcmNhc2UgbG93ZXJjYXNlCi1wcmVmZXJlbmNlS2V5d29yZHMudGVtcGxhdGVzPWVkaXRvciBodG1sIHRlbXBsYXRlcyBzbmlwcGV0IG1hY3JvcwotcHJlZmVyZW5jZUtleXdvcmRzLnN0eWxlcz1lZGl0b3IgaHRtbCBzdHlsZSBjdXN0b21pemUgc3ludGF4IGhpZ2hsaWdodGluZyB0eXBlIHRleHQgY29udGVudCBmb3JlZ3JvdW5kIGJhY2tncm91bmQgYm9sZCBjb2xvcgotcHJlZmVyZW5jZUtleXdvcmRzLndlYmNvbnRlbnQ9ZWRpdG9yIGh0bWwgd2ViIGNvbnRlbnQgc2V0dGluZ3MgcHJvZmlsZSBzdHlsZSBkb2N1bWVudCB0eXBlIGRvY3R5cGUgcHVibGljIHN5c3RlbSBjc3MKLXByZWZlcmVuY2VLZXl3b3Jkcy5zZXZlcml0aWVzPWh0bWwgZXJyb3JzIHdhcm5pbmdzIGlnbm9yZSBvcHRpb25zIHNldmVyaXR5IHNldmVyaXRpZXMgc3VwcHJlc3MgcHJvamVjdCBzcGVjaWZpYyBwcm9qZWN0c3BlY2lmaWMKLSMjCi1IVE1MX1NvdXJjZV90YXJnZXRfbmFtZT1IVE1MIFNvdXJjZQotCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmh0bWwubmFtZT1FZGl0aW5nIEhUTUwgU291cmNlCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmh0bWwuZGVzY3JpcHRpb249RWRpdGluZyBIVE1MIFNvdXJjZQotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5odG1sLm9jY3VycmVuY2VzLm5hbWU9SFRNTCBTb3VyY2UgT2NjdXJyZW5jZXMKLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IuaHRtbC5vY2N1cnJlbmNlcy5kZXNjcmlwdGlvbj1IVE1MIFNvdXJjZSBPY2N1cnJlbmNlcwotCi1Db2xvcnMuc2NyaXB0QXJlYUJvcmRlcj1TY3JpcHQgQXJlYSBCb3JkZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjM2E3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkZXZpY2VQcm9maWxlRW50cnlQcm92aWRlciIgbmFtZT0iJURldmljZV9Qcm9maWxlX0VudHJ5X1Byb3ZpZGVyX0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9kZXZpY2VQcm9maWxlRW50cnlQcm92aWRlci5leHNkIi8+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLQkJPGVkaXRvcgotCQkJbmFtZT0iJUhUTUxfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWUiCi0JCQlpY29uPSIkbmwkL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZiIKLQkJCWNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXQudWkuQWN0aW9uQ29udHJpYnV0b3JIVE1MIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IiCi0JCQlzeW1ib2xpY0ZvbnROYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5zb3VyY2UiPgotCQkJPGNvbnRlbnRUeXBlQmluZGluZwotCQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLQkJPC9lZGl0b3I+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLQkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiIC8+Ci0JCTxjb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS52aWV3cy5jb250ZW50b3V0bGluZS5IVE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiIC8+Ci0JCTxwcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MucHJvcGVydGllcy5YTUxQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotICAJCTxkb2N1bWVudGF0aW9uVGV4dEhvdmVyCi0gICAgICAgIAljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGFnaW5mby5IVE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yIgotICAgICAgICAJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFRkFVTFQiPgotICAJCTwvZG9jdW1lbnRhdGlvblRleHRIb3Zlcj4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0ic291cmNlZWRpdGluZ3RleHR0b29scyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLlhNTFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0iY2hhcmFjdGVycGFpcm1hdGNoZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGV4dC5IVE1MRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJzdHJ1Y3R1cmVkdGV4dGZvbGRpbmdwcm92aWRlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySFRNTCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb24uWE1MUXVpY2tBc3Npc3RQcm9jZXNzb3IiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfREVGQVVMVCIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0iYXV0b2VkaXRzdHJhdGVneSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5hdXRvZWRpdC5TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUhUTUwiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfREVGQVVMVCwgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9ERUNMQVJBVElPTiIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0icHJlZmVyZW5jZXBhZ2VzIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLmh0bWwsIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLnNvdXJjZSwgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMudGVtcGxhdGVzLCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy5zdHlsZXMsb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMudmFsaWRhdGlvbiIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxEZWZpbml0aW9uCi0JCQl0eXBlPSJzcGVsbGluZ3JlZ2lvbnMiCi0JCQl2YWx1ZT0iWE1MX0NPTU1FTlRfVEVYVCwgWE1MX0NPTlRFTlQiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0iYWN0aXZlY29udGV4dHMiCi0JCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlLCBvcmcuZWNsaXBzZS53c3QuaHRtbC5vY2N1cnJlbmNlcywgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5uYXZpZ2F0aW9uLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvbW1lbnRzLCBvcmcuZWNsaXBzZS53c3QueG1sLnNlbGVjdGlvbiIKLSAgICAgICAgCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuYW5ub3RhdGlvbk1vZGVsQ3JlYXRpb24iPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeSIgLz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24iPgotCQk8YWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JIVE1MIj4KLQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCQk8L2FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVXRUIubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy53ZWIiPgotCQk8L3BhZ2U+Ci0JCTwhLS0gSFRNTCBQUkVGRVJFTkNFIFBBR0VTLS0+Ci0JCTxwYWdlCi0JCQluYW1lPSIlSFRNTF9GaWxlcy5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLndlYiIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy5odG1sIj4KLQkJCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5maWxlcyIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlSFRNTF9Tb3VyY2UubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy5odG1sIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkhUTUxTb3VyY2VQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy5zb3VyY2UiPgotCQkJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnNvdXJjZSIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlSFRNTF9UZW1wbGF0ZXMubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy5zb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSFRNTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMudGVtcGxhdGVzIj4KLQkJCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMiLz4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJUhUTUxfU3ludGF4X0NvbG9yaW5nIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLnNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5IVE1MU3ludGF4Q29sb3JpbmdQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLnN0eWxlcyI+Ci0JCQk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuc3R5bGVzIi8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVIVE1MX1ZhbGlkYXRpb24iCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMuaHRtbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLnZhbGlkYXRpb24iPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlSFRNTF9UeXBpbmciCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMuc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkhUTUxUeXBpbmdQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy50eXBpbmciPgotCQk8L3BhZ2U+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLSBXZWIgY29udGVudCBzZXR0aW5ncyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLQkJPCEtLSBmb3IgajJlZSB3ZWIgcHJvamVjdCAtLT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVXZWJDb250ZW50U2V0dGluZ3MubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5Qcm9qZWN0V2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmR5bmFtaWNwcm9qZWN0cHJvcGVydHlwYWdlIj4KLSAgICAgICAgIAk8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgICAJPGFuZD4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCTxvcj4gCi0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJdmFsdWU9ImpzdC53ZWIiIC8+Ci0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJdmFsdWU9IndzdC53ZWIiIC8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FkYXB0PgotCQkJCTwvYW5kPiAKLQkJCTwvZW5hYmxlZFdoZW4+Ci0gICAgICAgICAJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLndlYmNvbnRlbnQiLz4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJVdlYkNvbnRlbnRTZXR0aW5ncy5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpLldlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5XZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UiPgotICAgICAgICAgCTxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgIAk8YW5kPgotCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotCQkJCQkJPG9yPiAKLQkJCQkJCQk8dGVzdCAKLQkJCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuY29udGVudFR5cGVJZCIKLQkJCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLQkJCQkJCQk8dGVzdCAKLQkJCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuY29udGVudFR5cGVJZCIKLQkJCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0JCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZnJhZ21lbnRzb3VyY2UiIC8+Ci0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0JCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwZnJhZ21lbnRzb3VyY2UiIC8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FkYXB0PgotCQkJCTwvYW5kPiAKLQkJCTwvZW5hYmxlZFdoZW4+Ci0gICAgICAgICAJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLndlYmNvbnRlbnQiLz4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJUhUTUxfUHJvcGVydHlfdmFsaWRhdGlvbiIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByb3BlcnR5UGFnZS5wcm9qZWN0LnZhbGlkYXRpb24iCi0JCQljYXRlZ29yeT0iVmFsaWRhdGlvblByb3BlcnRpZXNQYWdlIj4KLQkJCTxlbmFibGVkV2hlbj4KLQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkKLQkJCQk8L2FkYXB0PgotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9wYWdlPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gS2V5d29yZHMgZm9yIHByZWZlcmVuY2UgYW5kIHByb3BlcnRpZXMgcGFnZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkua2V5d29yZHMiPgotCQk8a2V5d29yZAotCQkJbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMuZmlsZXMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuZmlsZXMiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLnNvdXJjZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5zb3VyY2UiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLnRlbXBsYXRlcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLnN0eWxlcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5zdHlsZXMiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLndlYmNvbnRlbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkud2ViY29udGVudCIvPgotCQk8a2V5d29yZAotCQkJbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMuc2V2ZXJpdGllcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5zZXZlcml0aWVzIi8+Ci0gICAgPC9leHRlbnNpb24+Ci0JCi0JPCEtLSBFZGl0b3IgYWN0aW9uc2V0cyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb25zIj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5hY3Rpb25TZXQuYW5ub3RhdGlvbk5hdmlnYXRpb24iPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5zb3VyY2UiPgotCQkJPC9wYXJ0PgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLk5hdmlnYXRlQWN0aW9uU2V0Ij4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2Uuc291cmNlIj4KLQkJCTwvcGFydD4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIFRlbXBsYXRlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRlbXBsYXRlcyI+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJUFsbF9IVE1MX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSFRNTCIKLQkJCWlkPSJodG1sX2FsbCI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJUhUTUxfTmV3X2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSFRNTCIKLQkJCWlkPSJodG1sX25ldyI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJUhUTUxfVGFnX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSFRNTCIKLQkJCWlkPSJodG1sX3RhZyI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJUhUTUxfQXR0cmlidXRlX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSFRNTCIKLQkJCWlkPSJodG1sX2F0dHJpYnV0ZSI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJUhUTUxfQXR0cmlidXRlX3ZhbHVlX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSFRNTCIKLQkJCWlkPSJodG1sX2F0dHJpYnV0ZV92YWx1ZSI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxpbmNsdWRlCi0JCQlmaWxlPSJ0ZW1wbGF0ZXMvaHRtbGRlZmF1bHQtdGVtcGxhdGVzLnhtbCIKLQkJCXRyYW5zbGF0aW9ucz0iJG5sJC90ZW1wbGF0ZXMvaHRtbGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMiPgotCQk8L2luY2x1ZGU+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSBEZWZpbmUgdGhlIEhUTUwgQ29udGV4dHMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMiPgotCQk8Y29udGV4dAotCQkJbmFtZT0iJXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IuaHRtbC5uYW1lIgotCQkJcGFyZW50SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWRlc2NyaXB0aW9uPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5odG1sLmRlc2NyaXB0aW9uIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSI+Ci0JCTwvY29udGV4dD4KLQkJPGNvbnRleHQKLQkJCW5hbWU9IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmh0bWwub2NjdXJyZW5jZXMubmFtZSIKLQkJCXBhcmVudElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQlkZXNjcmlwdGlvbj0iJXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IuaHRtbC5vY2N1cnJlbmNlcy5kZXNjcmlwdGlvbiIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5vY2N1cnJlbmNlcyI+Ci0JCTwvY29udGV4dD4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIGluaXRpYWxpemUgaHRtbCB1aSBwcmVmZXJlbmNlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIERvY3VtZW50IHByb3ZpZGVyIGZvciBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLmRvY3VtZW50UHJvdmlkZXJzIj4KLQkJPHByb3ZpZGVyCi0JCQlpbnB1dFR5cGVzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsuRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRGaWxlRG9jdW1lbnRQcm92aWRlciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5FeHRlcm5hbEZpbGVEb2N1bWVudFByb3ZpZGVyIj4KLQkJPC9wcm92aWRlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gV29ya2JlbmNoIHZhbGlkYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPGV4dGVuc2lvbiBpZD0iSFRNTFZhbGlkYXRvciIgbmFtZT0iJUhUTUxfU3ludGF4X1ZhbGlkYXRvci5uYW1lIiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yVjIiPgotICAgICAgPHZhbGlkYXRvcgotICAgICAgICAgICAgYnVpbGQ9InRydWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuaW50ZXJuYWwudmFsaWRhdGlvbi5IVE1MVmFsaWRhdG9yIgotICAgICAgICAgICAgbWFudWFsPSJ0cnVlIgotICAgICAgICAgICAgc291cmNlaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uaHRtbHN5bnRheHZhbGlkYXRvciIKLSAgICAgICAgICAgIHZlcnNpb249IjEiCi0gICAgICAgICAgICBtYXJrZXJJZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS52YWxpZGF0aW9uTWFya2VyIj4KLSAgICAgICAgIDxpbmNsdWRlPgotICAgICAgICAgICAgPHJ1bGVzPgotICAgICAgICAgICAgICAgPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiPjwvY29udGVudFR5cGU+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dCBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIgZXh0PSJodG1sIi8+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dCBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIgZXh0PSJ4aHRtbCIvPgotICAgICAgICAgICAgICAgPGZpbGVleHQgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiIGV4dD0iaHRtIi8+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dCBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIgZXh0PSJodHBsIi8+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dCBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIgZXh0PSJ3bWwiLz4KLSAgICAgICAgICAgIDwvcnVsZXM+Ci0gICAgICAgICA8L2luY2x1ZGU+Ci0gICAgICAgICA8Z3JvdXAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5zdHJ1Y3R1cmVkTW9kZWxHcm91cCIvPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gQXMgeW91IHR5cGUgdmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbiI+Ci0JCTx2YWxpZGF0b3IKLQkJCXNjb3BlPSJwYXJ0aWFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLmludGVybmFsLnZhbGlkYXRpb24uSFRNTFZhbGlkYXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLmh0bWxzeW50YXh2YWxpZGF0b3IiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllcgotCQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFRkFVTFQiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLlNUX0RFRkFVTFQiLz4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQk8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0icGFydGlhbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uTWFya3VwVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24ubWFya3VwdmFsaWRhdG9yIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLlNUX0RFRkFVTFQiLz4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQk8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQotCi0JPCEtLSBOZXcgSFRNTCB3aXphcmQgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0JCTx3aXphcmQKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC53aXphcmQuTmV3SFRNTFdpemFyZCIKLQkJCW5hbWU9IiVfVUlfV0laQVJEX05BTUUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwud2l6YXJkLk5ld0hUTUxXaXphcmQiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLQkJCWljb249IiRubCQvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2h0bWxfd2l6LmdpZiI+Ci0JCQk8ZGVzY3JpcHRpb24+JV9VSV9XSVpBUkRfQ1JFQVRFX05FV19GSUxFPC9kZXNjcmlwdGlvbj4KLQkJCTxzZWxlY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIgLz4KLQkJPC93aXphcmQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIEFkZCBuZXcgSFRNTCB3aXphcmQgdG8gSjJFRSBQcm9qZWN0IE5hdmlnYXRvciAtLT4KLQk8ZXh0ZW5zaW9uCi0JCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb21tb25XaXphcmQubmV3SFRNTCIKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50Ij4KLQkJPGNvbW1vbldpemFyZAotICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLSAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwud2l6YXJkLk5ld0hUTUxXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLQkJCQkJCTxvcj4KLQkJCQkJCQk8dGVzdAotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQl2YWx1ZT0id3N0LndlYiIvPgotCQkJCQkJCTx0ZXN0Ci0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCXZhbHVlPSJqc3Qud2ViIi8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FkYXB0PgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0JCTx2aWV3ZXJDb250cmlidXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2Uuc291cmNlLlJ1bGVyQ29udGV4dCIKLQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnJ1bGVyLmNvbnRleHQuYWN0aW9ucyI+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRUYXNrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLkFkZFRhc2tfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRUYXNrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRCb29rbWFyay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiI+Ci0JCQk8L2FjdGlvbj4KLQkJPC92aWV3ZXJDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9yQWN0aW9ucyI+Ci0JPCEtLQk8ZWRpdG9yQ29udHJpYnV0aW9uCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlLnNvdXJjZS5lZGl0b3JBY3Rpb25zIgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5zb3VyY2UiPgotCQkJPGFjdGlvbgotCQkJCWlkPSJDbGVhbnVwRG9jdW1lbnQiCi0JCQkJbGFiZWw9IiVDbGVhbnVwRG9jdW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNsZWFudXAuZG9jdW1lbnQiCi0JCQkJdG9vbHRpcD0iJUNsZWFudXBEb2N1bWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0LnVpLkNsZWFudXBBY3Rpb25IVE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkNsZWFudXBEb2N1bWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iVG9nZ2xlQ29tbWVudCIKLQkJCQlsYWJlbD0iJVRvZ2dsZUNvbW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRvZ2dsZS5jb21tZW50IgotCQkJCXRvb2x0aXA9IiVUb2dnbGVDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5Ub2dnbGVDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlRvZ2dsZUNvbW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkFkZEJsb2NrQ29tbWVudCIKLQkJCQlsYWJlbD0iJUFkZEJsb2NrQ29tbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRkLmJsb2NrLmNvbW1lbnQiCi0JCQkJdG9vbHRpcD0iJUFkZEJsb2NrQ29tbWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuQWRkQmxvY2tDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkFkZEJsb2NrQ29tbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iUmVtb3ZlQmxvY2tDb21tZW50IgotCQkJCWxhYmVsPSIlUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5yZW1vdmUuYmxvY2suY29tbWVudCIKLQkJCQl0b29sdGlwPSIlUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5SZW1vdmVCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iUmVtb3ZlQmxvY2tDb21tZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJGaW5kT2NjdXJyZW5jZXMiCi0JCQkJbGFiZWw9IiVGaW5kT2NjdXJyZW5jZXNfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zZWFyY2guSFRNTEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJGaW5kT2NjdXJyZW5jZXMiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5lbmNsb3NpbmciCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nWE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0TmV4dCIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubmV4dCIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3ROZXh0Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91cyIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LnByZXZpb3VzIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lmxhc3QiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEhpc3RvcnlBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0SGlzdG9yeSI+Ci0JCQk8L2FjdGlvbj4KLQkJPC9lZGl0b3JDb250cmlidXRpb24+LS0+Ci0gICAgICAgIDxlZGl0b3JDb250cmlidXRpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2Uuc291cmNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5ydWxlci5hY3Rpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJEb3VibGVDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iLz4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlU2VsZWN0UnVsZXIubGFiZWwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iLz4KLSAgICAgICAgPC9lZGl0b3JDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdC51aS5DbGVhbnVwRG9jdW1lbnRIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jbGVhbnVwLmRvY3VtZW50Ij4KLSAgICAgICAgICAgICA8YWN0aXZlV2hlbj4KLSAgICAgICAgICAgICAJPHJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmh0bWxTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iPgotICAgICAgICAgICAgIAk8L3JlZmVyZW5jZT4KLSAgICAgICAgICAgICA8L2FjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgIAk8cmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaHRtbFNvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiI+Ci0gICAgICAgICAgICAgCTwvcmVmZXJlbmNlPgotICAgICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmhhbmRsZXJzLkhUTUxGaW5kT2NjdXJyZW5jZXNIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zZWFyY2guZmluZC5vY2N1cnJlbmNlcyI+Ci0gICAgICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgCTxyZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5vY2N1cnJlbmNlcyI+Ci0gICAgICAgICAgICAgCTwvcmVmZXJlbmNlPgotICAgICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgCTxyZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5vY2N1cnJlbmNlcyI+Ci0gICAgICAgICAgICAgCTwvcmVmZXJlbmNlPgotICAgICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotICAgICAgIAotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmh5cGVybGlua0RldGVjdG9yVGFyZ2V0cyI+Ci0JCTx0YXJnZXQKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiCi0JCQluYW1lPSIlSFRNTF9Tb3VyY2VfdGFyZ2V0X25hbWUiPgotCQk8L3RhcmdldD4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmh0bWxTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iPgotICAgICAgICAgICAgPHdpdGggdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLQkgICAgICAgICAgIDxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JICAgICAgICAgICAgICA8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiLz4KLQkgICAgICAgICAgIDwvaXRlcmF0ZT4KLSAgICAgICAgICAgIDwvd2l0aD4KLQkJPC9kZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotCQk8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkub2NjdXJyZW5jZXMiPgotICAgICAgICAgICAgPHdpdGggdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLQkgICAgICAgICAgIDxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JICAgICAgICAgICAgICA8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5vY2N1cnJlbmNlcyIvPgotCSAgICAgICAgICAgPC9pdGVyYXRlPgotICAgICAgICAgICAgPC93aXRoPgotCQk8L2RlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSBEZWZpbmUgdGhlbWUgLSBNYW55IG9mIHRoZSBjb2xvciBvdmVycmlkZXMgYW5kIGRlZmluaXRpb25zIGNvbWUgZnJvbSAKLQkgICAgIHRoZSBYTUwgcGx1Z2luIC0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnRoZW1lcyI+Ci0JCTx0aGVtZQotCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5zeXN0ZW1EZWZhdWx0Ij4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9IlNDUklQVF9BUkVBX0JPUkRFUiIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJPC90aGVtZT4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9IlNDUklQVF9BUkVBX0JPUkRFUiIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuc2NyaXB0QXJlYUJvcmRlciIKLQkJCXZhbHVlPSIxOTEsIDk1LCA2MyI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gRW5hYmxlIHRoZSBGb3JtYXRIYW5kbGVyIGZvciBIVE1MIENvbnRlbnQgVHlwZSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+Ci0JCTxoYW5kbGVyIAotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuaGFuZGxlcnMuRm9ybWF0SGFuZGxlciIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5mb3JtYXQiPgotCQkJPGFjdGl2ZVdoZW4+Ci0JCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmh0bWxDb250ZW50VHlwZS5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCTwvYWN0aXZlV2hlbj4KLQkJCTxlbmFibGVkV2hlbj4KLQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaHRtbENvbnRlbnRUeXBlLmRlZmluaXRpb24iPjwvcmVmZXJlbmNlPgotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9oYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gU2V0IHVwIGEgZGVmaW5pdGlvbiBmb3IgSFRNTCBDb250ZW50IFR5cGVzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotCQk8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaHRtbENvbnRlbnRUeXBlLmRlZmluaXRpb24iPgotCQkJPGl0ZXJhdGUgaWZFbXB0eT0iZmFsc2UiPgotCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0JCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIi8+Ci0JCQkJPC9hZGFwdD4KLQkJCTwvaXRlcmF0ZT4KLQkJPC9kZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NjaGVtYS9kZXZpY2VQcm9maWxlRW50cnlQcm92aWRlci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zY2hlbWEvZGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQyZjgyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NjaGVtYS9kZXZpY2VQcm9maWxlRW50cnlQcm92aWRlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aSIgaWQ9ImRldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyIiBuYW1lPSJEZXZpY2UgUHJvZmlsZSBFbnRyeSBQcm92aWRlciBFeHRlbnNpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vSFRNTFZhbGlkYXRpb25SZXBvcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vSFRNTFZhbGlkYXRpb25SZXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDEwNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0aW9uUmVwb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLkVycm9ySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25SZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotcHVibGljIGNsYXNzIEhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIgaW1wbGVtZW50cyBWYWxpZGF0aW9uUmVwb3J0ZXIgewotCi0JcHJpdmF0ZSBJVmFsaWRhdG9yIG93bmVyID0gbnVsbDsKLQlwcml2YXRlIElSZXBvcnRlciByZXBvcnRlciA9IG51bGw7Ci0JcHJpdmF0ZSBJRmlsZSBmaWxlID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCXByaXZhdGUgSFRNTFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0ID0gbnVsbDsKLQlwcml2YXRlIE1lc3NhZ2VGYWN0b3J5IGZGYWN0b3J5ID0gbnVsbDsKLQkKLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTFZhbGlkYXRpb25SZXBvcnRlcihJVmFsaWRhdG9yIG93bmVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLnJlcG9ydGVyID0gcmVwb3J0ZXI7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJZkZhY3RvcnkgPSBuZXcgTWVzc2FnZUZhY3RvcnkoZmlsZSAhPSBudWxsID8gZmlsZS5nZXRQcm9qZWN0KCkgOiBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKHRoaXMuZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRoaXMucmVzdWx0ID0gbnVsbDsKLQotCQlpZiAodGhpcy5yZXBvcnRlciAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHRoaXMub3duZXIsIHRoaXMuZmlsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyByZW1vdmUgYnkgbXlzZWxmPwotCQkJU3RyaW5nIGlkID0gSFRNTFZhbGlkYXRvci5jbGFzcy5nZXROYW1lKCk7Ci0JCQl0cnkgewotCQkJCS8vIFRhc2tMaXN0SGVscGVyIEFQSSBjaGFuZ2VkCi0JCQkJLy8gVGFza0xpc3RIZWxwZXIuZ2V0VGFza0xpc3QoKS5yZW1vdmVBbGxUYXNrcyhpZCwgdGhpcy5maWxlLAotCQkJCS8vIG51bGwpOwotCQkJCVRhc2tMaXN0SGVscGVyLmdldFRhc2tMaXN0KCkucmVtb3ZlQWxsVGFza3ModGhpcy5maWxlLCBpZCwgbnVsbCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTFZhbGlkYXRpb25SZXN1bHQgZ2V0UmVzdWx0KCkgewotCQlpZiAodGhpcy5yZXN1bHQgPT0gbnVsbCkKLQkJCXRoaXMucmVzdWx0ID0gbmV3IEhUTUxWYWxpZGF0aW9uUmVzdWx0KCk7Ci0JCXJldHVybiB0aGlzLnJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSkgewotCQlpZiAobWVzc2FnZSA9PSBudWxsIHx8IG1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSA9PSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpCi0JCQlyZXR1cm47Ci0JCUlNZXNzYWdlIG1lcyA9IHRyYW5zbGF0ZU1lc3NhZ2UobWVzc2FnZSk7Ci0KLQkJaWYgKHRoaXMucmVwb3J0ZXIgIT0gbnVsbCkgewotCQkJdGhpcy5yZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMub3duZXIsIG1lcyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAodGhpcy5maWxlID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQkvLyBhZGQgYnkgbXlzZWxmPwotCQkJU3RyaW5nIGlkID0gSFRNTFZhbGlkYXRvci5jbGFzcy5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgbG9jYXRpb24gPSBJbnRlZ2VyLnRvU3RyaW5nKG1lcy5nZXRMaW5lTnVtYmVyKCkpOwotCQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJSVBhdGggZmlsZVBhdGggPSB0aGlzLmZpbGUuZ2V0RnVsbFBhdGgoKTsKLQkJCWlmIChmaWxlUGF0aCAhPSBudWxsKSB7Ci0JCQkJbmFtZSA9IGZpbGVQYXRoLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCVRhc2tMaXN0SGVscGVyLmdldFRhc2tMaXN0KCkuYWRkVGFzayhpZCwgdGhpcy5maWxlLCBsb2NhdGlvbiwgbWVzLmdldElkKCksIG1lcy5nZXRUZXh0KCksIG1lcy5nZXRTZXZlcml0eSgpLCBuYW1lLCBtZXMuZ2V0R3JvdXBOYW1lKCksIG1lcy5nZXRPZmZzZXQoKSwgbWVzLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2xhdGUgVmFsaWRhdGlvbk1lc3NhZ2UgdG8gSU1lc3NhZ2UgYW5kIGdlbmVyYXRlIHJlc3VsdCBsb2cKLQkgKi8KLQlwcml2YXRlIElNZXNzYWdlIHRyYW5zbGF0ZU1lc3NhZ2UoVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSkgewotCQlpbnQgc2V2ZXJpdHkgPSBJTWVzc2FnZS5MT1dfU0VWRVJJVFk7Ci0JCUhUTUxWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA9IGdldFJlc3VsdCgpOwotCQlzd2l0Y2ggKG1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSkgewotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotCQkJCXJlc3VsdC5hZGRFcnJvcigpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLQkJCQlyZXN1bHQuYWRkV2FybmluZygpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBWYWxpZGF0aW9uTWVzc2FnZS5JTkZPUk1BVElPTiA6Ci0JCQkJcmVzdWx0LmFkZEluZm9ybWF0aW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLS8vCQkJCXJlc3VsdC5hZGRJbmZvcm1hdGlvbigpOwotCQkJCWJyZWFrOwotCQl9Ci0KLQkJSU1lc3NhZ2UgbWVzID0gbmV3IExvY2FsaXplZE1lc3NhZ2Uoc2V2ZXJpdHksIG1lc3NhZ2UuZ2V0TWVzc2FnZSgpLCB0aGlzLmZpbGUpOwotCQltZXMuc2V0T2Zmc2V0KG1lc3NhZ2UuZ2V0T2Zmc2V0KCkpOwotCQltZXMuc2V0TGVuZ3RoKG1lc3NhZ2UuZ2V0TGVuZ3RoKCkpOwotCQlpZiAodGhpcy5tb2RlbCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGZsYXRNb2RlbCA9IHRoaXMubW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlpZiAoZmxhdE1vZGVsICE9IG51bGwpIHsKLQkJCQlpbnQgbGluZSA9IGZsYXRNb2RlbC5nZXRMaW5lT2ZPZmZzZXQobWVzc2FnZS5nZXRPZmZzZXQoKSk7Ci0JCQkJbWVzLnNldExpbmVObyhsaW5lICsgMSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlcG9ydChFcnJvckluZm8gaW5mbykgewotCQlyZXBvcnQoZkZhY3RvcnkuY3JlYXRlTWVzc2FnZShpbmZvKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0aW9uUmVzdWx0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvblJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmM1ZjA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0aW9uUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSFRNTFZhbGlkYXRpb25SZXN1bHQgewotCXByaXZhdGUgaW50IGVycm9ycyA9IDA7Ci0JcHJpdmF0ZSBpbnQgd2FybmluZ3MgPSAwOwotCXByaXZhdGUgaW50IGluZm9ybWF0aW9ucyA9IDA7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTFZhbGlkYXRpb25SZXN1bHQoKSB7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXJyb3IoKSB7Ci0JCXRoaXMuZXJyb3JzKys7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgYWRkSW5mb3JtYXRpb24oKSB7Ci0JCXRoaXMuaW5mb3JtYXRpb25zKys7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgYWRkV2FybmluZygpIHsKLQkJdGhpcy53YXJuaW5ncysrOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXJyb3JzKCkgewotCQlyZXR1cm4gdGhpcy5lcnJvcnM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRJbmZvcm1hdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLmluZm9ybWF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFdhcm5pbmdzKCkgewotCQlyZXR1cm4gdGhpcy53YXJuaW5nczsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gKHRoaXMuZXJyb3JzID09IDAgJiYgdGhpcy53YXJuaW5ncyA9PSAwICYmIHRoaXMuaW5mb3JtYXRpb25zID09IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0aW9uV29ya2JlbmNoSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvbldvcmtiZW5jaEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGJmZGU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0aW9uV29ya2JlbmNoSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEhUTUxWYWxpZGF0aW9uV29ya2JlbmNoSGVscGVyIGV4dGVuZHMgV29ya2JlbmNoQ29udGV4dCB7Ci0JLyoqCi0JICovCi0JcHVibGljIEhUTUxWYWxpZGF0aW9uV29ya2JlbmNoSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFdoZW4gYW4gSVZhbGlkYXRvciBhc3NvY2lhdGVzIGEgdGFyZ2V0IG9iamVjdCB3aXRoIGFuIElNZXNzYWdlLCB0aGUKLQkgKiBXb3JrYmVuY2hSZXBvcnRlciBldmVudHVhbGx5IHJlc29sdmVzIHRoYXQgdGFyZ2V0IG9iamVjdCB3aXRoIGFuCi0JICogSVJlc291cmNlLiBTb21ldGltZXMgbW9yZSB0aGFuIG9uZSB0YXJnZXQgb2JqZWN0IHJlc29sdmVzIHRvIHRoZSBzYW1lCi0JICogSVJlc291cmNlICh1c3VhbGx5IHRoZSBJUHJvamVjdCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQgSVJlc291cmNlIHdoZW4gYW4KLQkgKiBJRmlsZSBjYW5ub3QgYmUgZm91bmQpLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQsIGJ5IHRoZQotCSAqIFdvcmtiZW5jaFJlcG9ydGVyLCBzbyB0aGF0IHRoZSBXb3JrYmVuY2hSZXBvcnRlciBjYW4gZGlzdGluZ3Vpc2gKLQkgKiBiZXR3ZWVuIHRoZSBJTWVzc2FnZXMgd2hpY2ggYXJlIG9uIHRoZSBzYW1lIElSZXNvdXJjZSwgYnV0IHJlZmVyIHRvCi0JICogZGlmZmVyZW50IHRhcmdldCBvYmplY3RzLiBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlCi0JICogcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciwgT2JqZWN0KSBtZXRob2QsIHNvIHRoYXQgd2hlbiBvbmUgdGFyZ2V0Ci0JICogb2JqZWN0IHJlbW92ZXMgYWxsIG9mIGl0cyBtZXNzYWdlcywgdGhhdCBpdCBkb2Vzbid0IHJlbW92ZSBhbm90aGVyCi0JICogdGFyZ2V0IG9iamVjdCdzIG1lc3NhZ2VzLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbCBvbmx5IGlmIG9iamVjdCBpcyBudWxsLiBPdGhlcndpc2UsIGFuIGlkCi0JICogd2hpY2ggY2FuIHVuaXF1ZWx5IGlkZW50aWZ5IGEgcGFydGljdWxhciBvYmplY3QgbXVzdCBiZSByZXR1cm5lZC4gVGhlCi0JICogaWQgbmVlZHMgdG8gYmUgdW5pcXVlIG9ubHkgd2l0aGluIG9uZSBwYXJ0aWN1bGFyIElWYWxpZGF0b3IuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRPYmplY3ROYW1lKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJRmlsZSkKLQkJCXJldHVybiBnZXRQb3J0YWJsZU5hbWUoKElGaWxlKSBvYmplY3QpOwotCQlyZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3YzZlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTERvY3VtZW50VHlwZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLkhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5GaWxlQnVmZmVyTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvci5JU291cmNlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaFJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1wdWJsaWMgY2xhc3MgSFRNTFZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvckpvYiwgSVNvdXJjZVZhbGlkYXRvciwgSUV4ZWN1dGFibGVFeHRlbnNpb24gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfRUNMSVBTRV9XU1RfSFRNTF9DT1JFX0hUTUxTT1VSQ0UgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGUoSUZpbGUgZmlsZSkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBmaWxlOwotCQlkbyB7Ci0JCQlpZiAocmVzb3VyY2UuaXNEZXJpdmVkKCkgfHwgcmVzb3VyY2UuaXNUZWFtUHJpdmF0ZU1lbWJlcigpIHx8ICFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSB8fCAocmVzb3VyY2UuZ2V0TmFtZSgpLmNoYXJBdCgwKSA9PSAnLicgJiYgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmVzb3VyY2UgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJfQotCQl3aGlsZSAoKHJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5QUk9KRUNUKSA9PSAwKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgSUNvbnRlbnRUeXBlTWFuYWdlciBmQ29udGVudFR5cGVNYW5hZ2VyOwotCXByaXZhdGUgSUNvbnRlbnRUeXBlW10gZk90aGVyU3VwcG9ydGVkQ29udGVudFR5cGVzID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ1tdIGZBZGRpdGlvbmFsQ29udGVudFR5cGVzSURzID0gbnVsbDsKLQlwcml2YXRlIElDb250ZW50VHlwZSBmSFRNTENvbnRlbnRUeXBlOwotCi0JcHVibGljIEhUTUxWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZDb250ZW50VHlwZU1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLQkJZkhUTUxDb250ZW50VHlwZSA9IGZDb250ZW50VHlwZU1hbmFnZXIuZ2V0Q29udGVudFR5cGUoT1JHX0VDTElQU0VfV1NUX0hUTUxfQ09SRV9IVE1MU09VUkNFKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JLyoqCi0JICogR2V0cyBsaXN0IG9mIGNvbnRlbnQgdHlwZXMgdGhpcyB2YWxpZGF0b3IgaXMgaW50ZXJlc3RlZCBpbgotCSAqIAotCSAqIEByZXR1cm4gQWxsIEhUTUwtcmVsYXRlZCBjb250ZW50IHR5cGVzCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFR5cGVbXSBnZXRPdGhlclN1cHBvcnRlZENvbnRlbnRUeXBlcygpIHsKLQkJaWYgKGZPdGhlclN1cHBvcnRlZENvbnRlbnRUeXBlcyA9PSBudWxsKSB7Ci0JCQlMaXN0IGNvbnRlbnRUeXBlcyA9IG5ldyBBcnJheUxpc3QoMyk7Ci0JCQlpZiAoZkFkZGl0aW9uYWxDb250ZW50VHlwZXNJRHMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZkFkZGl0aW9uYWxDb250ZW50VHlwZXNJRHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShmQWRkaXRpb25hbENvbnRlbnRUeXBlc0lEc1tpXSk7Ci0JCQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQkJCWNvbnRlbnRUeXBlcy5hZGQodHlwZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmT3RoZXJTdXBwb3J0ZWRDb250ZW50VHlwZXMgPSAoSUNvbnRlbnRUeXBlW10pIGNvbnRlbnRUeXBlcy50b0FycmF5KG5ldyBJQ29udGVudFR5cGVbY29udGVudFR5cGVzLnNpemUoKV0pOwotCQl9Ci0JCXJldHVybiBmT3RoZXJTdXBwb3J0ZWRDb250ZW50VHlwZXM7Ci0JfQotCi0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSURPTU1vZGVsIGdldE1vZGVsKElQcm9qZWN0IHByb2plY3QsIElGaWxlIGZpbGUpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCB8fCBmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghY2FuSGFuZGxlKGZpbGUpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCXRyeSB7Ci0JCQlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCQkJfQotCQkJY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyByZXRyeSBpZ25vcmluZyBNRVRBIGNoYXJzZXQgZm9yIGludmFsaWQgTUVUQSBjaGFyc2V0Ci0JCQkJLy8gc3BlY2lmaWNhdGlvbgotCQkJCS8vIHJlY3JlYXRlIGlucHV0IHN0cmVhbSwgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHBhcnRpYWxseSByZWFkCi0JCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChmaWxlLCBuZXcgU3RyaW5nKCksIG51bGwpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCi0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSkgewotCQkJcmVsZWFzZU1vZGVsKG1vZGVsKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoSURPTU1vZGVsKSBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSFRNTFZhbGlkYXRpb25SZXBvcnRlciBnZXRSZXBvcnRlcihJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUsIElET01Nb2RlbCBtb2RlbCkgewotCQlyZXR1cm4gbmV3IEhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIodGhpcywgcmVwb3J0ZXIsIGZpbGUsIG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBmaWxlIGV4dGVuc2lvbiB0byB2YWxpZGF0ZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjYW5IYW5kbGUoSUZpbGUgZmlsZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJSUNvbnRlbnRUeXBlIGZpbGVDb250ZW50VHlwZSA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpOwotCQkJCQlpZiAoZmlsZUNvbnRlbnRUeXBlLmlzS2luZE9mKGZIVE1MQ29udGVudFR5cGUpKSB7Ci0JCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJSUNvbnRlbnRUeXBlW10gb3RoZXJUeXBlcyA9IGdldE90aGVyU3VwcG9ydGVkQ29udGVudFR5cGVzKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG90aGVyVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlyZXN1bHQgPSByZXN1bHQgfHwgZmlsZUNvbnRlbnRUeXBlLmlzS2luZE9mKG90aGVyVHlwZXNbaV0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGZIVE1MQ29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBmSFRNTENvbnRlbnRUeXBlLmlzQXNzb2NpYXRlZFdpdGgoZmlsZS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBzaG91bGQgYmUgcmFyZSwgYnV0IHdpbGwgaWdub3JlIHRvIGF2b2lkIGxvZ2dpbmcgImVuY29kaW5nCi0JCQkJLy8gZXhjZXB0aW9ucyIgYW5kIHRoZSBsaWtlIGhlcmUuCi0JCQkJLy8gTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNIVE1MRmVhdHVyZShJRE9NRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gKERvY3VtZW50VHlwZUFkYXB0ZXIpIGRvY3VtZW50LmdldEFkYXB0ZXJGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBhZGFwdGVyLmhhc0ZlYXR1cmUoSFRNTERvY3VtZW50VHlwZUNvbnN0YW50cy5IVE1MKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlTW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoaGVscGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICgocmVwb3J0ZXIgIT0gbnVsbCkgJiYgKHJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkgPT0gdHJ1ZSkpIHsKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCVN0cmluZ1tdIGRlbHRhQXJyYXkgPSBoZWxwZXIuZ2V0VVJJcygpOwotCQlpZiAoZGVsdGFBcnJheSAhPSBudWxsICYmIGRlbHRhQXJyYXkubGVuZ3RoID4gMCkgewotCQkJdmFsaWRhdGVEZWx0YShoZWxwZXIsIHJlcG9ydGVyKTsKLQkJfQotCQllbHNlIHsKLQkJCXZhbGlkYXRlRnVsbChoZWxwZXIsIHJlcG9ydGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgdmFsaWRhdGUgY2FsbCBpcyBmb3IgdGhlIElTb3VyY2VWYWxpZGF0b3IgcGFydGlhbCBkb2N1bWVudAotCSAqIHZhbGlkYXRpb24gYXBwcm9hY2gKLQkgKiAKLQkgKiBAcGFyYW0gZGlydHlSZWdpb24KLQkgKiBAcGFyYW0gaGVscGVyCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3IuSVNvdXJjZVZhbGlkYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElSZWdpb24gZGlydHlSZWdpb24sIElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgewotCi0JCWlmIChoZWxwZXIgPT0gbnVsbCB8fCBmRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoKHJlcG9ydGVyICE9IG51bGwpICYmIChyZXBvcnRlci5pc0NhbmNlbGxlZCgpID09IHRydWUpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCXRyeSB7Ci0KLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQlkb2N1bWVudCA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCX0KLQotCQkJaWYgKGRvY3VtZW50ID09IG51bGwgfHwgIWhhc0hUTUxGZWF0dXJlKGRvY3VtZW50KSkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCXJldHVybjsgLy9pZ25vcmUKLQkJCX0KLQkJCQotCQkJSVBhdGggZmlsZVBhdGggPSBudWxsOwotCQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0KLQkJCUlUZXh0RmlsZUJ1ZmZlciBmYiA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRCdWZmZXIoZkRvY3VtZW50KTsKLQkJCWlmIChmYiAhPSBudWxsKSB7Ci0JCQkJZmlsZVBhdGggPSBmYi5nZXRMb2NhdGlvbigpOwotCi0JCQkJaWYgKGZpbGVQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCQlmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGZpbGVQYXRoKTsKLQkJCQkJaWYgKCFmaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQlmaWxlID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWZpbGVQYXRoID0gbmV3IFBhdGgobW9kZWwuZ2V0SWQoKSk7Ci0JCQl9Ci0KLQkJCS8vIHRoaXMgd2lsbCBiZSB0aGUgd3JvbmcgcmVnaW9uIGlmIGl0J3MgVGV4dCAoaW5zdGVhZCBvZiBFbGVtZW50KQotCQkJLy8gd2UgZG9uJ3Qga25vdyBob3cgdG8gdmFsaWRhdGUgVGV4dAotCQkJSW5kZXhlZFJlZ2lvbiBpciA9IGdldENvdmVyaW5nTm9kZShkaXJ0eVJlZ2lvbik7IC8vICBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGRpcnR5UmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCWlmIChpciBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQl3aGlsZSAoaXIgIT0gbnVsbCAmJiBpciBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQkJLy8gaXQncyBhc3N1bWVkIHRoYXQgdGhpcyBnZXRzIHRoZSBJbmRleGVkUmVnaW9uIHRvCi0JCQkJCS8vIHRoZSByaWdodCBvZiB0aGUgZW5kIG9mZnNldAotCQkJCQlpciA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24oaXIuZ2V0RW5kT2Zmc2V0KCkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKGlyIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCi0JCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQkJCVZhbGlkYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoVmFsaWRhdGlvbkFkYXB0ZXIpIGZhY3RvcnkuYWRhcHQoKElOb2RlTm90aWZpZXIpIGlyKTsKLQkJCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJCQlpZiAocmVwb3J0ZXIgIT0gbnVsbCkgewotCQkJCQlIVE1MVmFsaWRhdGlvblJlcG9ydGVyIHJlcCA9IG51bGw7Ci0JCQkJCXJlcCA9IGdldFJlcG9ydGVyKHJlcG9ydGVyLCBmaWxlLCAoSURPTU1vZGVsKSBtb2RlbCk7Ci0JCQkJCXJlcC5jbGVhcigpOwotCQkJCQlhZGFwdGVyLnNldFJlcG9ydGVyKHJlcCk7Ci0KLQkJCQkJTWVzc2FnZSBtZXNzID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCBmaWxlUGF0aC50b1N0cmluZygpLnN1YnN0cmluZygxKSk7Ci0JCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKHRoaXMsIG1lc3MpOwotCQkJCX0KLQkJCQlhZGFwdGVyLnZhbGlkYXRlKGlyKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJbmRleGVkUmVnaW9uIGdldENvdmVyaW5nTm9kZShJUmVnaW9uIGRpcnR5UmVnaW9uKSB7Ci0JCQotCQlJbmRleGVkUmVnaW9uIGxhcmdlc3RSZWdpb24gPSBudWxsOwotCQlpZihmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gcmVnaW9ucyA9ICgoSVN0cnVjdHVyZWREb2N1bWVudCkgZkRvY3VtZW50KS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKGRpcnR5UmVnaW9uLmdldE9mZnNldCgpLCBkaXJ0eVJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQlsYXJnZXN0UmVnaW9uID0gZ2V0TGFyZ2VzdChyZWdpb25zKTsKLQkJfQotCQlyZXR1cm4gbGFyZ2VzdFJlZ2lvbjsKLQl9Ci0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0TGFyZ2VzdChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gc2RSZWdpb25zKSB7Ci0JCQotCQlpZihzZFJlZ2lvbnMgPT0gbnVsbCB8fCBzZFJlZ2lvbnMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJIAotCQlJbmRleGVkUmVnaW9uIGN1cnJlbnRMYXJnZXN0ID0gZ2V0Q29ycmVzcG9uZGluZ05vZGUoc2RSZWdpb25zWzBdKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZFJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJICAgIGlmKCFzZFJlZ2lvbnNbaV0uaXNEZWxldGVkKCkpIHsKLSAgICAJCQlJbmRleGVkUmVnaW9uIGNvcnJlc3BvbmRpbmcgPSBnZXRDb3JyZXNwb25kaW5nTm9kZShzZFJlZ2lvbnNbaV0pOwotICAgIAkJCQotICAgIAkJCWlmKGN1cnJlbnRMYXJnZXN0IGluc3RhbmNlb2YgVGV4dCkKLSAgICAJCQkJY3VycmVudExhcmdlc3QgPSBjb3JyZXNwb25kaW5nOwotICAgIAkJCQotICAgICAgICAgICAgICAgIGlmKGNvcnJlc3BvbmRpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIAlpZighKGNvcnJlc3BvbmRpbmcgaW5zdGFuY2VvZiBUZXh0KSkgewotCSAgICAgICAgCQkJaWYgKGNvcnJlc3BvbmRpbmcuZ2V0U3RhcnRPZmZzZXQoKSA8PSBjdXJyZW50TGFyZ2VzdC5nZXRTdGFydE9mZnNldCgpICAKLQkgICAgICAgIAkJCQkJCSYmICBjb3JyZXNwb25kaW5nLmdldEVuZE9mZnNldCgpID49IGN1cnJlbnRMYXJnZXN0LmdldEVuZE9mZnNldCgpICkKLQkgICAgICAgIAkJCQljdXJyZW50TGFyZ2VzdCA9IGNvcnJlc3BvbmRpbmc7Ci0gICAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0JCX0KLQkJcmV0dXJuIGN1cnJlbnRMYXJnZXN0OwotCX0KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRDb3JyZXNwb25kaW5nTm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotICAgICAgICBJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHNNb2RlbCAhPSBudWxsKSAKLSAgICAgICAgICAgICAgICBpbmRleGVkUmVnaW9uID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24oc2RSZWdpb24uZ2V0U3RhcnQoKSk7ICAgIAotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNNb2RlbCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5kZXhlZFJlZ2lvbjsKLSAgICB9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvci5JU291cmNlVmFsaWRhdG9yCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3IuSVNvdXJjZVZhbGlkYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZEb2N1bWVudCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIEhUTUxWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKElET01Nb2RlbCBtb2RlbCwgSUZpbGUgZmlsZSkgewotCQlJUHJvamVjdCBwcmogPSBudWxsOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlwcmogPSBmaWxlLmdldFByb2plY3QoKTsKLQkJfQotCQlpZiAoKHByaiA9PSBudWxsKSAmJiAobW9kZWwgIT0gbnVsbCkpIHsKLQkJCVVSSVJlc29sdmVyIHJlcyA9IG1vZGVsLmdldFJlc29sdmVyKCk7Ci0JCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQlwcmogPSByZXMuZ2V0UHJvamVjdCgpOwotCQkJfQotCQl9Ci0JCWZpbmFsIFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyID0gbmV3IFdvcmtiZW5jaFJlcG9ydGVyKHByaiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCXJldHVybiB2YWxpZGF0ZShyZXBvcnRlciwgZmlsZSwgbW9kZWwpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSFRNTFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGUoSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlLCBJRE9NTW9kZWwgbW9kZWwpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCB8fCBtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCWlmICghaGFzSFRNTEZlYXR1cmUoZG9jdW1lbnQpKQotCQkJcmV0dXJuIG51bGw7IC8vIGlnbm9yZQotCi0JCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJVmFsaWRhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChWYWxpZGF0aW9uQWRhcHRlcikgZmFjdG9yeS5hZGFwdChkb2N1bWVudCk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQotCQlIVE1MVmFsaWRhdGlvblJlcG9ydGVyIHJlcCA9IGdldFJlcG9ydGVyKHJlcG9ydGVyLCBmaWxlLCBtb2RlbCk7Ci0JCXJlcC5jbGVhcigpOwotCQlhZGFwdGVyLnNldFJlcG9ydGVyKHJlcCk7Ci0JCWFkYXB0ZXIudmFsaWRhdGUoZG9jdW1lbnQpOwotCQlyZXR1cm4gcmVwLmdldFJlc3VsdCgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUNvbnRhaW5lcihJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElDb250YWluZXIgY29udGFpbmVyKSB7Ci0JCXRyeSB7Ci0JCQlJUmVzb3VyY2VbXSByZXNvdXJjZUFycmF5ID0gY29udGFpbmVyLm1lbWJlcnMoZmFsc2UpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZUFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VBcnJheVtpXTsKLQkJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCB8fCByZXBvcnRlci5pc0NhbmNlbGxlZCgpKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5MT1dfU0VWRVJJVFksIHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMSkpOwotCQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayh0aGlzLCBtZXNzYWdlKTsKLQkJCQkJdmFsaWRhdGVGaWxlKGhlbHBlciwgcmVwb3J0ZXIsIChJRmlsZSkgcmVzb3VyY2UpOwotCQkJCX0KLQkJCQllbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQkJdmFsaWRhdGVDb250YWluZXIoaGVscGVyLCByZXBvcnRlciwgKElDb250YWluZXIpIHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZURlbHRhKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlTdHJpbmdbXSBkZWx0YUFycmF5ID0gaGVscGVyLmdldFVSSXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YUFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgZGVsdGEgPSBkZWx0YUFycmF5W2ldOwotCQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQkJY29udGludWU7Ci0KLQkJCWlmIChyZXBvcnRlciAhPSBudWxsKSB7Ci0JCQkJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCBkZWx0YS5zdWJzdHJpbmcoMSkpOwotCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKHRoaXMsIG1lc3NhZ2UpOwotCQkJfQotCi0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShkZWx0YSk7Ci0JCQlpZiAocmVzb3VyY2UgPT0gbnVsbCB8fCAhKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpKQotCQkJCWNvbnRpbnVlOwotCQkJdmFsaWRhdGVGaWxlKGhlbHBlciwgcmVwb3J0ZXIsIChJRmlsZSkgcmVzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRmlsZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUpIHsKLQkJaWYgKChyZXBvcnRlciAhPSBudWxsKSAmJiAocmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSA9PSB0cnVlKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJaWYgKCFzaG91bGRWYWxpZGF0ZShmaWxlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlET01Nb2RlbCBtb2RlbCA9IGdldE1vZGVsKGZpbGUuZ2V0UHJvamVjdCgpLCBmaWxlKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdHJ5IHsKLQkJCXZhbGlkYXRlKHJlcG9ydGVyLCBmaWxlLCBtb2RlbCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlyZWxlYXNlTW9kZWwobW9kZWwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRnVsbChJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCVN0cmluZ1tdIGZpbGVEZWx0YSA9IGhlbHBlci5nZXRVUklzKCk7Ci0JCWlmIChoZWxwZXIgaW5zdGFuY2VvZiBJV29ya2JlbmNoQ29udGV4dCkgewotCQkJSVdvcmtiZW5jaENvbnRleHQgd2JIZWxwZXIgPSAoSVdvcmtiZW5jaENvbnRleHQpIGhlbHBlcjsKLQkJCXByb2plY3QgPSB3YkhlbHBlci5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJZWxzZSBpZihmaWxlRGVsdGEubGVuZ3RoID4gMCl7Ci0JCQkvLyB3b24ndCB3b3JrIGZvciBwcm9qZWN0IHZhbGlkYXRpb24gKGIvYyBub3RoaW5nIGluIGZpbGUgZGVsdGEpCi0JCQlwcm9qZWN0ID0gZ2V0UmVzb3VyY2UoZmlsZURlbHRhWzBdKS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdmFsaWRhdGVDb250YWluZXIoaGVscGVyLCByZXBvcnRlciwgcHJvamVjdCk7Ci0JfQotCi0JLyoKLQkgKiBhZGRlZCB0byBnZXQgcmlkIG9yIGRlcGVuZGVuY3kgb24gSVdvcmtiZW5jaEhlbHBlcgotCSAqIAotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoU3RyaW5nIGRlbHRhKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoZGVsdGEpKTsKLQl9Ci0KLQlwdWJsaWMgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVJbkpvYihJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gRXhjZXB0aW9uIGNhdGNoaW5nIHdhcyByZW1vdmVkLCBzZWUKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMzYwMAotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCXZhbGlkYXRlKGhlbHBlciwgcmVwb3J0ZXIpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbiNzZXRJbml0aWFsaXphdGlvbkRhdGEob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZBZGRpdGlvbmFsQ29udGVudFR5cGVzSURzID0gbmV3IFN0cmluZ1swXTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBTdHJpbmcgJiYgZGF0YS50b1N0cmluZygpLmxlbmd0aCgpID4gMCkgewotCQkJCWZBZGRpdGlvbmFsQ29udGVudFR5cGVzSURzID0gU3RyaW5nVXRpbHMudW5wYWNrKGRhdGEudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJcmV0dXJuIG51bGw7Ci0JCVZhbGlkYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25SZXN1bHQoKTsKLQkJSVJlcG9ydGVyIHJlcG9ydGVyID0gcmVzdWx0LmdldFJlcG9ydGVyKG1vbml0b3IpOwotCQl2YWxpZGF0ZUZpbGUobnVsbCwgcmVwb3J0ZXIsIChJRmlsZSkgcmVzb3VyY2UpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9Mb2NhbGl6ZWRNZXNzYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9Mb2NhbGl6ZWRNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMzg3MjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vTG9jYWxpemVkTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotCi0vKioKLSAqIGNvcGllZCBmcm9tIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuTG9jYWxpemVkTWVzc2FnZQotICogCi0gKiBUaGlzIGNsYXNzIGlzIHByb3ZpZGVkIGZvciB2YWxpZGF0b3JzIHdoaWNoIHJ1biBvbmx5IGluIEVjbGlwc2UgYW5kIHdob3NlIG1lc3NhZ2VzLCBiZWNhdXNlIHRoZXkKLSAqIGNvbWUgZnJvbSBhbm90aGVyIHRvb2wsIGFyZSBhbHJlYWR5IGxvY2FsaXplZC4gTG9jYWxpemVkTWVzc2FnZSBjYW5ub3QgYmUgdXNlZCBieSBhbnkgdmFsaWRhdG9yCi0gKiB3aGljaCBuZWVkcyB0byBydW4gaW4gYm90aCBXZWJTcGhlcmUgYW5kIEVjbGlwc2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbGl6ZWRNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgX21lc3NhZ2UgPSBudWxsOwotCi0JcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQpIHsKLQkJdGhpcyhzZXZlcml0eSwgbWVzc2FnZVRleHQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0LCBJUmVzb3VyY2UgdGFyZ2V0T2JqZWN0KSB7Ci0JCXRoaXMoc2V2ZXJpdHksIG1lc3NhZ2VUZXh0LCAoT2JqZWN0KSB0YXJnZXRPYmplY3QpOwotCX0KLQotCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0LCBPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCXN1cGVyKG51bGwsIHNldmVyaXR5LCBudWxsKTsKLQkJc2V0TG9jYWxpemVkTWVzc2FnZShtZXNzYWdlVGV4dCk7Ci0JCXNldFRhcmdldE9iamVjdCh0YXJnZXRPYmplY3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2FsaXplZE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX21lc3NhZ2UgPSBtZXNzYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxpemVkTWVzc2FnZSgpIHsKLQkJcmV0dXJuIF9tZXNzYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoQ2xhc3NMb2FkZXIgY2wpIHsKLQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoTG9jYWxlIGwpIHsKLQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoTG9jYWxlIGwsIENsYXNzTG9hZGVyIGNsKSB7Ci0JCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vVGFza0xpc3RIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL1Rhc2tMaXN0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZWRlMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vVGFza0xpc3RIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIAotICogQ2xhc3MgdG8gaGVscCB0aGlzIFByb2JsZW0ncyBsaXN0LgotICogCi0gKi8KLWNsYXNzIFRhc2tMaXN0SGVscGVyIHsKLQlwcml2YXRlIHN0YXRpYyBUYXNrTGlzdEhlbHBlciBfdGFza0xpc3RIZWxwZXIgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBUYXNrTGlzdEhlbHBlciBnZXRUYXNrTGlzdCgpIHsKLQkJaWYgKF90YXNrTGlzdEhlbHBlciA9PSBudWxsKSB7Ci0JCQlfdGFza0xpc3RIZWxwZXIgPSBuZXcgVGFza0xpc3RIZWxwZXIoKTsKLQkJfQotCQlyZXR1cm4gX3Rhc2tMaXN0SGVscGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFkZHMgYSBtZXNzYWdlIHRvIGEgcmVzb3VyY2UgaW4gdGhlIHRhc2sgbGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUYXNrKFN0cmluZyBwbHVnaW5JZCwgSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgbG9jYXRpb24sIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZyBtZXNzYWdlLCBpbnQgbWFya2VyVHlwZSwgU3RyaW5nIHRhcmdldE9iamVjdE5hbWUsIFN0cmluZyBncm91cE5hbWUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFza0xpc3RVdGlsaXR5LmFkZFRhc2socGx1Z2luSWQsIHJlc291cmNlLCBsb2NhdGlvbiwgbWVzc2FnZUlkLCBtZXNzYWdlLCBtYXJrZXJUeXBlLCB0YXJnZXRPYmplY3ROYW1lLCBncm91cE5hbWUsIG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZW1vdmVzIGFsbCBtZXNzYWdlcyBmcm9tIGEgcmVzb3VyY2UgaW4gdGhlIHRhc2sgbGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxUYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBvd25lciwgU3RyaW5nIG9iamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKHJlc291cmNlLCBvd25lciwgb2JqZWN0TmFtZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL1Rhc2tMaXN0VXRpbGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vVGFza0xpc3RVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZTBhOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vVGFza0xpc3RVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIG11c3QgYmUgY2FsbGVkIG9ubHkgYnkgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICogCi0gKiBUaGlzIHNpbmdsZXRvbiBpbnRlcmFjdHMgd2l0aCB0aGUgZWNsaXBzZSB3b3JrYmVuY2gncyBUYXNrIGxpc3QuCi0gKiBUYXNrTGlzdFV0aWxpdHkgYWRkcyBhbmQgcmVtb3ZlcyB0YXNrcyBmcm9tIHRoZSBsaXN0LgotICogCi0gKiBUaGlzIGNsYXNzIG11c3Qgbm90IGJlIGNhbGxlZCBvdXRzaWRlIG9mIGFuIElXb3Jrc3BhY2VSdW5uYWJsZSBvcgotICogSVJ1bm5hYmxlV2l0aFByb2dyZXNzLiBNYW55IHJlc291cmNlIGRlbHRhcyBjYW4gYmUgZ2VuZXJhdGVkIGJ5IHRoZSBtZXRob2RzCi0gKiBpbiB0aGlzIGNsYXNzLgotICogCi0gKiBUaGlzIGNhbWUgZnJvbSBUYXNrTGlzdFV0aWxpdHkKLSAqLwotcHVibGljIGNsYXNzIFRhc2tMaXN0VXRpbGl0eSB7Ci0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lEOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBIVE1MVUlQbHVnaW4uSUQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fTUFSS0VSID0gUExVR0lOX0lEICsgIi5wcm9ibGVtbWFya2VyIjsgLy8kTk9OLU5MUy0xJCAvLyBUaGUgZXh0ZW5zaW9uIHdoaWNoIGlzIHVzZWQgdG8gYWRkIHZhbGlkYXRpb24gbWFya2VycyB0byB0aGUgdGFzayBsaXN0Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fTUFSS0VSX09XTkVSID0gIm93bmVyIjsgLy8kTk9OLU5MUy0xJCAvLyBUaGUgSVZhbGlkYXRvciB3aG8gb3ducyB0aGUgSU1hcmtlciBvbiB0aGUgdGFzayBsaXN0Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fTUFSS0VSX1NFVkVSSVRZID0gInZhbGlkYXRpb25TZXZlcml0eSI7IC8vJE5PTi1OTFMtMSQgLy8gb25lIG9mIHRoZSBJTWVzc2FnZSB2YWx1ZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfVEFSR0VUT0JKRUNUID0gInRhcmdldE9iamVjdCI7IC8vJE5PTi1OTFMtMSQgLy8gV2hlbiBtb3JlIHRoYW4gb25lIHRhcmdldCBvYmplY3QgcmVzb2x2ZXMgdG8gdGhlIHNhbWUgSVJlc291cmNlLCB0aGlzIGZpZWxkIGlkZW50aWZpZXMgd2hpY2ggdGFyZ2V0T2JqZWN0IG93bnMgYSBwYXJ0aWN1bGFyIG1lc3NhZ2UuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fTUFSS0VSX0dST1VQID0gImdyb3VwTmFtZSI7IC8vJE5PTi1OTFMtMSQgLy8gRm9yIGluY3JlbWVudGFsIHZhbGlkYXRpb24sIHRoaXMgZmllbGQgYXNzb2NpYXRlcyBhIG1lc3NhZ2Ugd2l0aCBhIGdyb3VwLCBzbyB0aGF0IGEgc3Vic2V0IG9mIG1lc3NhZ2VzIG1heSBiZSByZW1vdmVkIGZyb20gYSBmaWxlLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUl9NRVNTQUdFSUQgPSAibWVzc2FnZUlkIjsgLy8kTk9OLU5MUy0xJCAvLyBQZXJzaXN0IHRoZSBtZXNzYWdlIGlkIG9mIHRoZSBtZXNzYWdlLCBub3QganVzdCB0aGUgdHJhbnNsYXRlZCB0ZXh0LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVBUSF9JTkZJTklURSA9IElSZXNvdXJjZS5ERVBUSF9JTkZJTklURTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVQVEhfWkVSTyA9IElSZXNvdXJjZS5ERVBUSF9aRVJPOwotCXByaXZhdGUgZmluYWwgc3RhdGljIElNYXJrZXJbXSBOT19NQVJLRVJTID0gbmV3IElNYXJrZXJbMF07Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhZGRzIGEgbWVzc2FnZSB0byBhIHJlc291cmNlIGluIHRoZSB0YXNrIGxpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJTWFya2VyIGFkZFRhc2soU3RyaW5nIHBsdWdpbklkLCBJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBsb2NhdGlvbiwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nIG1lc3NhZ2UsIGludCBtYXJrZXJUeXBlLCBTdHJpbmcgdGFyZ2V0T2JqZWN0TmFtZSwgU3RyaW5nIGdyb3VwTmFtZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoKG1lc3NhZ2UgPT0gbnVsbCkgfHwgKHJlc291cmNlID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWludCBzZXZlcml0eSA9IGdldFNldmVyaXR5KG1hcmtlclR5cGUpOwotCi0JCS8vIEFsbG93IGR1cGxpY2F0ZSBlbnRyaWVzIGluIHRoZSB0YXNrIGxpc3QuCi0JCS8vIFByaW9yIHRvIGEgZnVsbCB2YWxpZGF0aW9uLCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgd2lsbCByZW1vdmUKLQkJLy8gYWxsIG1lc3NhZ2VzIG93bmVkCi0JCS8vIGJ5IGEgdmFsaWRhdG9yIGJlZm9yZSBpdCBpcyBleGVjdXRlZC4KLQkJLy8gUHJpb3IgdG8gYW4gaW5jcmVtZW50YWwgdmFsaWRhdGlvbiwgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIHdpbGwKLQkJLy8gcmVtb3ZlIGFsbCBtZXNzYWdlcywKLQkJLy8gb24gZWFjaCBvZiB0aGUgY2hhbmdlZCByZXNvdXJjZXMsIG93bmVkIGJ5IGEgdmFsaWRhdG9yIGJlZm9yZSBpdCBpcwotCQkvLyBpbnZva2VkLgotCQkvLyAKLQkJLy8gSXQgaXMgdXAgdG8gdGhlIHZhbGlkYXRvciB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBub3QgYWRkaW5nIHRoZQotCQkvLyBzYW1lIG1lc3NhZ2UKLQkJLy8gaW4gbW9yZSB0aGFuIG9uZSBwbGFjZSwgYW5kIGFsc28gdG8gY2xlYXIgb3V0IGFueSBvbGQgbWVzc2FnZXMKLQkJLy8gd2hpY2ggYXJlIG5vdCBjbGVhcmVkCi0JCS8vIGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLQkJSU1hcmtlciBpdGVtID0gcmVzb3VyY2UuY3JlYXRlTWFya2VyKFZBTElEQVRJT05fTUFSS0VSKTsgLy8gYWRkIGEKLQkJCQkJCQkJCQkJCQkJCQkJLy8gdmFsaWRhdGlvbgotCQkJCQkJCQkJCQkJCQkJCQkvLyBtYXJrZXIKLQotCQkvLyBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgcmVwbGFjZSB0aGUgbXVsdGlwbGUgc2V0QXR0cmlidXRlCi0JCS8vIGNhbGxzIGFib3ZlIHdpdGggYSBzaW5nbGUgc2V0QXR0cmlidXRlcyBjYWxsLgotCQlib29sZWFuIG9mZnNldFNldCA9ICgob2Zmc2V0ICE9IElNZXNzYWdlLk9GRlNFVF9VTlNFVCkgJiYgKGxlbmd0aCAhPSBJTWVzc2FnZS5PRkZTRVRfVU5TRVQpKTsKLQkJaW50IHNpemUgPSAob2Zmc2V0U2V0KSA/IDEwIDogODsgLy8gYWRkIENIQVJfU1RBUlQsIENIQVJfRU5EIG9ubHkKLQkJCQkJCQkJCQkJLy8gaWYgdGhlIG9mZnNldCBpcyBzZXQuIElmIHRoZQotCQkJCQkJCQkJCQkvLyBvZmZzZXQgaXMgc2V0LCBpdCB0YWtlcwotCQkJCQkJCQkJCQkvLyBwcmVjZW5kZW5jZSBvdmVyIHRoZSBsaW5lCi0JCQkJCQkJCQkJCS8vIG51bWJlci4gKGVjbGlwc2UncyBydWxlLCBub3QKLQkJCQkJCQkJCQkJLy8gbWluZS4pCi0JCVN0cmluZ1tdIGF0dHJpYk5hbWVzID0gbmV3IFN0cmluZ1tzaXplXTsKLQkJT2JqZWN0W10gYXR0cmliVmFsdWVzID0gbmV3IE9iamVjdFtzaXplXTsKLQotCQkvLyBWZXJ5IGZpcnN0IHRoaW5nLCBhZGQgdGhlIG93bmVyLiBUaGF0IHdheSwgaWYgdGhlIGNvZGUgZGllcwotCQkvLyBiZWZvcmUgdGhpbmdzIGFyZSBwZXJzaXN0ZWQsIGhvcGVmdWxseSB0aGlzIG1hcmtlciB3aWxsIGJlCi0JCS8vIHBlcnNpc3RlZC4KLQkJLy8gSG9wZWZ1bGx5LCBlY2xpcHNlIFdJTEwgcGVyc2lzdCB0aGlzIGZpZWxkLCBhcyByZXF1ZXN0ZWQuCi0JCWF0dHJpYk5hbWVzWzBdID0gVkFMSURBVElPTl9NQVJLRVJfT1dORVI7Ci0JCWF0dHJpYlZhbHVlc1swXSA9IHBsdWdpbklkOwotCQlhdHRyaWJOYW1lc1sxXSA9IFZBTElEQVRJT05fTUFSS0VSX1NFVkVSSVRZOyAvLyB0aGlzIHZhbGlkYXRpb24KLQkJCQkJCQkJCQkJCQkJLy8gc2V2ZXJpdHkgaXMgc3RvcmVkLAotCQkJCQkJCQkJCQkJCQkvLyBpbiBhZGRpdGlvbiB0byB0aGUKLQkJCQkJCQkJCQkJCQkJLy8gbWFya2VyIHNldmVyaXR5LCB0bwotCQkJCQkJCQkJCQkJCQkvLyBlbmFibGUgbW9yZSB0aGFuCi0JCQkJCQkJCQkJCQkJCS8vIG9uZSBzZXZlcml0eSBvZgotCQkJCQkJCQkJCQkJCQkvLyBtZXNzYWdlIHRvIGJlCi0JCQkJCQkJCQkJCQkJCS8vIGRpc3BsYXllZC4gZS5nLgotCQkJCQkJCQkJCQkJCQkvLyBFUlJPUiB8IFdBUk5JTkcKLQkJCQkJCQkJCQkJCQkJLy8gKHVzaW5nIGJpbmFyeSBPUikuCi0JCQkJCQkJCQkJCQkJCS8vIFRoZSBJTWFya2VyCi0JCQkJCQkJCQkJCQkJCS8vIGNvbnN0YW50cyBhcmUKLQkJCQkJCQkJCQkJCQkJLy8gcmVndWxhciBkZWNpbWFsCi0JCQkJCQkJCQkJCQkJCS8vIGNvbnN0YW50cy4KLQkJYXR0cmliVmFsdWVzWzFdID0gbmV3IEludGVnZXIobWFya2VyVHlwZSk7Ci0JCWF0dHJpYk5hbWVzWzJdID0gVkFMSURBVElPTl9NQVJLRVJfVEFSR0VUT0JKRUNUOyAvLyB0byBkaXN0aW5ndWlzaAotCQkJCQkJCQkJCQkJCQkJLy8gYmV0d2VlbgotCQkJCQkJCQkJCQkJCQkJLy8gbWVzc2FnZXMgd2hpY2gKLQkJCQkJCQkJCQkJCQkJCS8vIGFyZSByZWdpc3RlcmVkCi0JCQkJCQkJCQkJCQkJCQkvLyBvbiBhbgotCQkJCQkJCQkJCQkJCQkJLy8gSVJlc291cmNlLCBidXQKLQkJCQkJCQkJCQkJCQkJCS8vIGFnYWluc3QKLQkJCQkJCQkJCQkJCQkJCS8vIGRpZmZlcmVudAotCQkJCQkJCQkJCQkJCQkJLy8gdGFyZ2V0IG9iamVjdHMKLQkJYXR0cmliVmFsdWVzWzJdID0gKCh0YXJnZXRPYmplY3ROYW1lID09IG51bGwpID8gIiIgOiB0YXJnZXRPYmplY3ROYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlhdHRyaWJOYW1lc1szXSA9IFZBTElEQVRJT05fTUFSS0VSX0dST1VQOwotCQlhdHRyaWJWYWx1ZXNbM10gPSAoKGdyb3VwTmFtZSA9PSBudWxsKSA/ICIiIDogZ3JvdXBOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlhdHRyaWJOYW1lc1s0XSA9IElNYXJrZXIuTUVTU0FHRTsKLQkJYXR0cmliVmFsdWVzWzRdID0gbWVzc2FnZTsKLQkJYXR0cmliTmFtZXNbNV0gPSBWQUxJREFUSU9OX01BUktFUl9NRVNTQUdFSUQ7Ci0JCWF0dHJpYlZhbHVlc1s1XSA9IG1lc3NhZ2VJZDsKLQotCQlhdHRyaWJOYW1lc1s2XSA9IElNYXJrZXIuU0VWRVJJVFk7IC8vIElNYXJrZXIuU0VWRVJJVFlfRVJST1IsCi0JCQkJCQkJCQkJCS8vIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywKLQkJCQkJCQkJCQkJLy8gSU1hcmtlci5TRVZFUklUWV9JTkZPCi0JCWF0dHJpYlZhbHVlc1s2XSA9IG5ldyBJbnRlZ2VyKHNldmVyaXR5KTsKLQkJdHJ5IHsKLQkJCS8vIElmIHRoZSBsb2NhdGlvbiBpcyBhIGxpbmUgbnVtYmVyLCBzdG9yZSBpdCBhcyBhIGxpbmUgbnVtYmVyCi0JCQlJbnRlZ2VyIGxpbmVOdW1iZXIgPSBJbnRlZ2VyLnZhbHVlT2YobG9jYXRpb24pOwotCQkJYXR0cmliTmFtZXNbN10gPSBJTWFya2VyLkxJTkVfTlVNQkVSOwotCQkJYXR0cmliVmFsdWVzWzddID0gbGluZU51bWJlcjsKLQkJfQotCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4YykgewotCQkJLy8gT3RoZXJ3aXNlLCBzdG9yZSBpdCBhcyBhIHRleHQgbG9jYXRpb24KLQkJCWF0dHJpYk5hbWVzWzddID0gSU1hcmtlci5MT0NBVElPTjsKLQkJCWF0dHJpYlZhbHVlc1s3XSA9IGxvY2F0aW9uOwotCQl9Ci0KLQkJaWYgKG9mZnNldFNldCkgewotCQkJYXR0cmliTmFtZXNbOF0gPSBJTWFya2VyLkNIQVJfU1RBUlQ7Ci0JCQlhdHRyaWJWYWx1ZXNbOF0gPSBuZXcgSW50ZWdlcihvZmZzZXQpOwotCQkJYXR0cmliTmFtZXNbOV0gPSBJTWFya2VyLkNIQVJfRU5EOwotCQkJYXR0cmliVmFsdWVzWzldID0gbmV3IEludGVnZXIob2Zmc2V0ICsgbGVuZ3RoKTsKLQkJfQotCi0JCWl0ZW0uc2V0QXR0cmlidXRlcyhhdHRyaWJOYW1lcywgYXR0cmliVmFsdWVzKTsKLQotCQlyZXR1cm4gaXRlbTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBvbmUgb2YgdGhlIFNldmVyaXR5RW51bSBzZXZlcml0aWVzLCByZXR1cm4gdGhlIElNYXJrZXIgc2V2ZXJpdHkKLQkgKiBpbnQgdGhhdCBpcyBpdHMgZXF1aXZhbGVudC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0U2V2ZXJpdHkoaW50IHNldmVyaXR5RW51bVZhbHVlKSB7Ci0JCXN3aXRjaCAoc2V2ZXJpdHlFbnVtVmFsdWUpIHsKLQkJCWNhc2UgKElNZXNzYWdlLkhJR0hfU0VWRVJJVFkpIDogewotCQkJCXJldHVybiBJTWFya2VyLlNFVkVSSVRZX0VSUk9SOwotCQkJfQotCi0JCQljYXNlIChJTWVzc2FnZS5MT1dfU0VWRVJJVFkpIDogewotCQkJCXJldHVybiBJTWFya2VyLlNFVkVSSVRZX0lORk87Ci0JCQl9Ci0KLQkJCWNhc2UgKElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSkgOiB7Ci0JCQkJcmV0dXJuIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORzsKLQkJCX0KLQotCQkJY2FzZSAoSU1lc3NhZ2UuQUxMX01FU1NBR0VTKSA6Ci0JCQljYXNlIChJTWVzc2FnZS5FUlJPUl9BTkRfV0FSTklORykgOgotCQkJZGVmYXVsdCA6IHsKLQkJCQkvLyBhc3N1bWUgaXQncyBhIHdhcm5pbmcuCi0JCQkJcmV0dXJuIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORzsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBnZXREZXB0aChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCXJldHVybiBERVBUSF9JTkZJTklURTsgLy8gREVQVEhfSU5GSU5JVEUgbWVhbnMgZ2V0IHRoaXMgcHJvamVjdCdzCi0JCQkJCQkJCQkvLyBtYXJrZXJzLCBhbmQgdGhlIG1hcmtlcnMgYmVsb25naW5nIHRvCi0JCQkJCQkJCQkvLyB0aGUgcHJvamVjdCdzIGNoaWxkcmVuLgotCQl9Ci0JCWVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSVdvcmtzcGFjZVJvb3QpIHsKLQkJCS8vIE5lZWRlZCBmb3IgdGhlIFZhbGlkYXRpb25NaWdyYXRvciB3aGVuIGl0IGNoZWNrcyBmb3Igb3JwaGFuCi0JCQkvLyB0YXNrcy4KLQkJCXJldHVybiBERVBUSF9JTkZJTklURTsgLy8gREVQVEhfSU5GSU5JVEUgbWVhbnMgZ2V0IGFsbCBvZiB0aGUKLQkJCQkJCQkJCS8vIG1hcmtlcnMgaW4gdGhlIHdvcmtzcGFjZQotCQl9Ci0KLQkJcmV0dXJuIERFUFRIX1pFUk87IC8vIERFUFRIX1pFUk8gbWVhbnMganVzdCB0aGlzIHJlc291cmNlLCBub3QgaXRzCi0JCQkJCQkJLy8gY2hpbGRyZW4KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHNldmVyaXR5LCBpbnQgZGVwdGgpIHsKLQkJSU1hcmtlcltdIHRlbXBNYXJrZXJzID0gbnVsbDsKLQkJaW50IHZhbGlkQ291bnQgPSAwOwotCQl0cnkgewotCQkJSU1hcmtlcltdIGFsbE1hcmtlcnMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlhbGxNYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoVkFMSURBVElPTl9NQVJLRVIsIGZhbHNlLCBkZXB0aCk7IC8vIGZhbHNlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBtZWFucwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gb25seQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY29uc2lkZXIKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIFBST0JMRU1fTUFSS0VSLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbm90Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB2YXJpYW50cwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gb2YKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIFBST0JMRU1fTUFSS0VSLgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gU2luY2UKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGFkZFRhc2sKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG9ubHkKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGFkZHMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIFBST0JMRU1fTUFSS0VSLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gd2UKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGRvbid0Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBuZWVkCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0bwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY29uc2lkZXIKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGl0cwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gc3VidHlwZXMuCi0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQkvLyBMb2dnZXIgbG9nZ2VyID0KLQkJCQkvLyBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCS8vIGlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCS8vIExvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCS8vIGVudHJ5LnNldFNvdXJjZUlEKCJUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSwKLQkJCQkvLyBpbnQpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBlbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkvLyBsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJLy8gfQotCQkJCXJldHVybiBOT19NQVJLRVJTOwotCQkJfQotCi0JCQkvLyBOb3cgZmlsdGVyIGluIHRoZSBtYXJrZXJzLCBiYXNlZCBvbiBzZXZlcml0eSB0eXBlLgotCQkJaWYgKGFsbE1hcmtlcnMubGVuZ3RoICE9IDApIHsKLQkJCQl0ZW1wTWFya2VycyA9IG5ldyBJTWFya2VyW2FsbE1hcmtlcnMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbE1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSU1hcmtlciBtYXJrZXIgPSBhbGxNYXJrZXJzW2ldOwotCQkJCQlJbnRlZ2VyIGZpbHRlclNldmVyaXR5ID0gKEludGVnZXIpIG1hcmtlci5nZXRBdHRyaWJ1dGUoVkFMSURBVElPTl9NQVJLRVJfU0VWRVJJVFkpOwotCQkJCQlpZiAoZmlsdGVyU2V2ZXJpdHkgPT0gbnVsbCkgewotCQkJCQkJLy8gb2RkLi4ubWFya2VyIHdhc24ndCBjcmVhdGVkIGNvcnJlY3RseS4gSG93IGNvdWxkCi0JCQkJCQkvLyB0aGlzIGhhcHBlbj8KLQkJCQkJCS8vIERlZmF1bHQgdG8gdGhlIGN1cnJlbnQgc2V2ZXJpdHkgYW5kIGFkZCBpdCB0byB0aGUKLQkJCQkJCS8vIGxpc3QuCi0JCQkJCQl0cnkgewotCQkJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgZ2V0U2V2ZXJpdHkoc2V2ZXJpdHkpKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCQkJCS8vIExvZ2dlciBsb2dnZXIgPQotCQkJCQkJCS8vIFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCQkJLy8gaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQkJLy8gTG9nRW50cnkgZW50cnkgPQotCQkJCQkJCS8vIFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJCQkvLyBlbnRyeS5zZXRTb3VyY2VJRCgiVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhpbnQsCi0JCQkJCQkJLy8gSVJlc291cmNlLCBpbnQpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkvLyBlbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJCQkvLyBsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJCQkJLy8gfQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJCQkvLyBMb2dnZXIgbG9nZ2VyID0KLQkJCQkJCQkvLyBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQkJCS8vIGlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJCS8vIExvZ0VudHJ5IGVudHJ5ID0KLQkJCQkJCQkvLyBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCQkJLy8gZW50cnkuc2V0U291cmNlSUQoIlRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MoaW50LAotCQkJCQkJCS8vIElSZXNvdXJjZSwgaW50KSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJLy8gZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCQkJLy8gbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCQkJCS8vIH0KLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmICgoc2V2ZXJpdHkgJiBmaWx0ZXJTZXZlcml0eS5pbnRWYWx1ZSgpKSA9PSAwKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQl0ZW1wTWFya2Vyc1t2YWxpZENvdW50KytdID0gbWFya2VyOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIExvZ2dlciBsb2dnZXIgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJLy8gaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkvLyBMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCS8vIGVudHJ5LnNldFNvdXJjZUlEKCJUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKGludCwKLQkJCS8vIElSZXNvdXJjZSwgaW50KSIpOyAvLyROT04tTkxTLTEkCi0JCQkvLyBlbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCS8vIGxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCS8vIH0KLQkJfQotCi0JCWlmICh2YWxpZENvdW50ID09IDApIHsKLQkJCXJldHVybiBOT19NQVJLRVJTOwotCQl9Ci0KLQkJSU1hcmtlcltdIHZhbGlkTWFya2VycyA9IG5ldyBJTWFya2VyW3ZhbGlkQ291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXBNYXJrZXJzLCAwLCB2YWxpZE1hcmtlcnMsIDAsIHZhbGlkQ291bnQpOwotCQlyZXR1cm4gdmFsaWRNYXJrZXJzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElNYXJrZXJbXSBnZXRWYWxpZGF0aW9uVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSBtZXNzYWdlT3duZXJzLCBpbnQgZGVwdGgpIHsKLQkJSU1hcmtlcltdIG1hcmtlcnMgPSBnZXRWYWxpZGF0aW9uVGFza3MocmVzb3VyY2UsIElNZXNzYWdlLkFMTF9NRVNTQUdFUywgZGVwdGgpOwotCQlpZiAobWFya2Vycy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIE5PX01BUktFUlM7Ci0JCX0KLQotCQlJTWFya2VyW10gdGVtcCA9IG5ldyBJTWFya2VyW21hcmtlcnMubGVuZ3RoXTsKLQkJaW50IHZhbGlkQ291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQotCQkJdHJ5IHsKLQkJCQlPYmplY3Qgb3duZXIgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKFZBTElEQVRJT05fTUFSS0VSX09XTkVSKTsKLQkJCQlpZiAoKG93bmVyID09IG51bGwpIHx8ICEob3duZXIgaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0JCQkJCS8vIFRoZSBWYWxpZGF0aW9uTWlncmF0b3Igd2lsbCByZW1vdmUgYW55ICJ1bm93bmVkIgotCQkJCQkvLyB2YWxpZGF0aW9uIG1hcmtlcnMuCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbWVzc2FnZU93bmVycy5sZW5ndGg7IGorKykgewotCQkJCQlTdHJpbmcgbWVzc2FnZU93bmVyID0gbWVzc2FnZU93bmVyc1tqXTsKLQkJCQkJaWYgKCgoU3RyaW5nKSBvd25lcikuZXF1YWxzKG1lc3NhZ2VPd25lcikpIHsKLQkJCQkJCXRlbXBbdmFsaWRDb3VudCsrXSA9IG1hcmtlcjsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJLy8gTG9nZ2VyIGxvZ2dlciA9Ci0JCQkJLy8gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkvLyBpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkvLyBMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkvLyBlbnRyeS5zZXRTb3VyY2VJRCgiVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhwcm9qZWN0LAotCQkJCS8vIFN0cmluZ1tdKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJLy8gZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJLy8gbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCS8vIH0KLQkJCQlyZXR1cm4gTk9fTUFSS0VSUzsKLQkJCX0KLQkJfQotCi0JCUlNYXJrZXJbXSByZXN1bHQgPSBuZXcgSU1hcmtlclt2YWxpZENvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIHZhbGlkQ291bnQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHJpZXZlcyBhbGwgdmFsaWRhdGlvbiB0YXNrcyBmcm9tIHRoZSByZXNvdXJjZS4gSWYgZGVwdGgKLQkgKiBpcyBJTkZJTklURSwgY2hpbGQgdGFza3MgYXJlIHJldHVybmVkIGFzIHdlbGwuIE9ubHkgdGhlIHRhc2tzIHdoaWNoIGFyZQotCSAqIG93bmVkIGJ5IHRoZSBzcGVjaWZpZWQgbWVzc2FnZU93bmVyLCBhbmQgYXBwbHkgdG8gdGhlIG5hbWVkIElNZXNzYWdlJ3MKLQkgKiB0YXJnZXQgb2JqZWN0IChvYmplY3ROYW1lKSB3aWxsIGJlIHJldHVybmVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIElNYXJrZXJbXSBnZXRWYWxpZGF0aW9uVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSBtZXNzYWdlT3duZXIsIFN0cmluZyBvYmplY3ROYW1lLCBTdHJpbmcgZ3JvdXBOYW1lLCBpbnQgZGVwdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKChtZXNzYWdlT3duZXIgPT0gbnVsbCkgfHwgKHJlc291cmNlID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gTk9fTUFSS0VSUzsKLQkJfQotCi0JCWludCB2YWxpZENvdW50ID0gMDsKLQkJSU1hcmtlcltdIHZhbGlkTGlzdCA9IG51bGw7Ci0JCUlNYXJrZXJbXSBtYXJrZXJzID0gZ2V0VmFsaWRhdGlvblRhc2tzKHJlc291cmNlLCBtZXNzYWdlT3duZXIsIGRlcHRoKTsKLQkJaWYgKG1hcmtlcnMgIT0gbnVsbCkgewotCQkJdmFsaWRMaXN0ID0gbmV3IElNYXJrZXJbbWFya2Vycy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotCi0JCQkJLy8gSWYgbW9yZSB0aGFuIG9uZSB0YXJnZXQgb2JqZWN0IHJlc29sdmVzIHRvIHRoZSBzYW1lCi0JCQkJLy8gcmVzb3VyY2UsIHJlbW92aW5nIG9uZSB0YXJnZXQncwotCQkJCS8vIG1lc3NhZ2VzIHNob3VsZCBub3QgcmVtb3ZlIHRoZSBvdGhlciB0YXJnZXQgb2JqZWN0J3MKLQkJCQkvLyBtZXNzYWdlcy4KLQkJCQlpZiAob2JqZWN0TmFtZSAhPSBudWxsKSB7Ci0JCQkJCU9iamVjdCB0YXJnZXRPYmplY3QgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKFZBTElEQVRJT05fTUFSS0VSX1RBUkdFVE9CSkVDVCk7Ci0JCQkJCWlmICgodGFyZ2V0T2JqZWN0ID09IG51bGwpIHx8ICEodGFyZ2V0T2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB8fCAhKCgoU3RyaW5nKSB0YXJnZXRPYmplY3QpLmVxdWFscyhvYmplY3ROYW1lKSkpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGdyb3VwTmFtZSAhPSBudWxsKSB7Ci0JCQkJCU9iamVjdCBncm91cCA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoVkFMSURBVElPTl9NQVJLRVJfR1JPVVApOwotCQkJCQlpZiAoKGdyb3VwID09IG51bGwpIHx8ICEoZ3JvdXAgaW5zdGFuY2VvZiBTdHJpbmcpIHx8ICEoKChTdHJpbmcpIGdyb3VwKS5lcXVhbHMoZ3JvdXBOYW1lKSkpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJdmFsaWRMaXN0W3ZhbGlkQ291bnQrK10gPSBtYXJrZXI7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodmFsaWRDb3VudCA9PSAwKSB7Ci0JCQlyZXR1cm4gTk9fTUFSS0VSUzsKLQkJfQotCi0JCUlNYXJrZXJbXSByZXN1bHQgPSBuZXcgSU1hcmtlclt2YWxpZENvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weSh2YWxpZExpc3QsIDAsIHJlc3VsdCwgMCwgdmFsaWRDb3VudCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmVtb3ZlcyBhbGwgbWVzc2FnZXMgZnJvbSBhIHJlc291cmNlIGluIHRoZSB0YXNrIGxpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIG93bmVyLCBTdHJpbmcgb2JqZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZW1vdmVBbGxUYXNrcyhyZXNvdXJjZSwgbmV3IFN0cmluZ1tde293bmVyfSwgb2JqZWN0TmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gb3duZXJzLCBTdHJpbmcgb2JqZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZW1vdmVBbGxUYXNrcyhyZXNvdXJjZSwgb3duZXJzLCBvYmplY3ROYW1lLCBnZXREZXB0aChyZXNvdXJjZSkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCByZW1vdmVBbGxUYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZ1tdIG93bmVycywgU3RyaW5nIG9iamVjdE5hbWUsIGludCBkZXB0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZW1vdmVUYXNrU3Vic2V0KHJlc291cmNlLCBvd25lcnMsIG9iamVjdE5hbWUsIG51bGwsIGRlcHRoKTsgLy8gbnVsbAotCQkJCQkJCQkJCQkJCQkJCQkJLy8gbWVhbnMKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIG5vCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBncm91cAotCQkJCQkJCQkJCQkJCQkJCQkJLy8gbmFtZQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgYSBzdWJzZXQgb2YgdGFza3MgZnJvbSB0aGUgcHJvamVjdCwgaW5jbHVkaW5nIGNoaWxkCi0JICogdGFza3MuIEV2ZXJ5IHRhc2sgd2hpY2ggYmVsb25ncyB0byB0aGUgZ3JvdXAsIGlkZW50aWZpZWQgYnkgZ3JvdXBOYW1lLAotCSAqIHdpbGwgYmUgcmVtb3ZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVtb3ZlVGFza1N1YnNldChJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZ1tdIG93bmVycywgU3RyaW5nIG9iamVjdE5hbWUsIFN0cmluZyBncm91cE5hbWUsIGludCBkZXB0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoKG93bmVycyA9PSBudWxsKSB8fCAocmVzb3VyY2UgPT0gbnVsbCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlNYXJrZXJbXSBhbGxUYXNrcyA9IGdldFZhbGlkYXRpb25UYXNrcyhyZXNvdXJjZSwgb3duZXJzLCBvYmplY3ROYW1lLCBncm91cE5hbWUsIGRlcHRoKTsKLQkJaWYgKGFsbFRhc2tzLmxlbmd0aCA+IDApIHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5kZWxldGVNYXJrZXJzKGFsbFRhc2tzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRhNTVlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHREb3VibGVDbGlja1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JQ29udGVudEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5NdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudGV4dC5JQ1NTUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ1NTQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyRm9yRW1iZWRkZWRDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdC5IVE1MRm9ybWF0UHJvY2Vzc29ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuYXV0b2VkaXQuQXV0b0VkaXRTdHJhdGVneUZvclRhYnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5IVE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Lk5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmZvcm1hdC5TdHJ1Y3R1cmVkRm9ybWF0dGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBhIHNvdXJjZSB2aWV3ZXIgd2hpY2ggc2hvd3MgSFRNTCBjb250ZW50LgotICogPHA+Ci0gKiBDbGllbnRzIGNhbiBzdWJjbGFzcyBhbmQgb3ZlcnJpZGUganVzdCB0aG9zZSBtZXRob2RzIHdoaWNoIG11c3QgYmUgc3BlY2lmaWMKLSAqIHRvIHRoZWlyIG5lZWRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MIGV4dGVuZHMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIHsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbiBiZWNhdXNlIG5vdCBzb3VyY2V2aWV3ZXItc3BlY2lmaWMgYW5kCi0JICogaXQncyBhIFN0cmluZyBhcnJheQotCSAqLwotCXByaXZhdGUgU3RyaW5nW10gZkNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGZMaW5lU3R5bGVQcm92aWRlckZvckVtYmVkZGVkQ1NTOwotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBmTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MOwotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gZlhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBmU3RhdHVzTGluZUxhYmVsUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCgpIHsKLQkJLy8gTXVzdCBoYXZlIGVtcHR5IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24KLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSUF1dG9FZGl0U3RyYXRlZ3lbXSBnZXRBdXRvRWRpdFN0cmF0ZWdpZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlMaXN0IGFsbFN0cmF0ZWdpZXMgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCUlBdXRvRWRpdFN0cmF0ZWd5W10gc3VwZXJTdHJhdGVnaWVzID0gc3VwZXIuZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVyU3RyYXRlZ2llcy5sZW5ndGg7IGkrKykgewotCQkJYWxsU3RyYXRlZ2llcy5hZGQoc3VwZXJTdHJhdGVnaWVzW2ldKTsKLQkJfQotCi0JCS8vIGJlIHN1cmUgdGhpcyBpcyBhZGRlZCBsYXN0IGluIGxpc3QsIHNvIGl0IGhhcyBhIGNoYW5nZSB0byBtb2RpZnkKLQkJLy8gcHJldmlvdXMgcmVzdWx0cy4KLQkJLy8gYWRkIGF1dG8gZWRpdCBzdHJhdGVneSB0aGF0IGhhbmRsZXMgd2hlbiB0YWIga2V5IGlzIHByZXNzZWQKLQkJYWxsU3RyYXRlZ2llcy5hZGQobmV3IEF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzKCkpOwotCi0JCXJldHVybiAoSUF1dG9FZGl0U3RyYXRlZ3lbXSkgYWxsU3RyYXRlZ2llcy50b0FycmF5KG5ldyBJQXV0b0VkaXRTdHJhdGVneVthbGxTdHJhdGVnaWVzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWlmIChmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9PSBudWxsKSB7Ci0JCQlTdHJpbmdbXSB4bWxUeXBlcyA9IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwuZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcygpOwotCQkJU3RyaW5nW10gaHRtbFR5cGVzID0gU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUwuZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcygpOwotCQkJZkNvbmZpZ3VyZWRDb250ZW50VHlwZXMgPSBuZXcgU3RyaW5nWzIgKyB4bWxUeXBlcy5sZW5ndGggKyBodG1sVHlwZXMubGVuZ3RoXTsKLQotCQkJZkNvbmZpZ3VyZWRDb250ZW50VHlwZXNbMF0gPSBJU3RydWN0dXJlZFBhcnRpdGlvbnMuREVGQVVMVF9QQVJUSVRJT047Ci0JCQlmQ29uZmlndXJlZENvbnRlbnRUeXBlc1sxXSA9IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTjsKLQotCQkJaW50IGluZGV4ID0gMDsKLQkJCVN5c3RlbS5hcnJheWNvcHkoeG1sVHlwZXMsIDAsIGZDb25maWd1cmVkQ29udGVudFR5cGVzLCBpbmRleCArPSAyLCB4bWxUeXBlcy5sZW5ndGgpOwotCQkJU3lzdGVtLmFycmF5Y29weShodG1sVHlwZXMsIDAsIGZDb25maWd1cmVkQ29udGVudFR5cGVzLCBpbmRleCArPSB4bWxUeXBlcy5sZW5ndGgsIGh0bWxUeXBlcy5sZW5ndGgpOwotCQl9Ci0KLQkJcmV0dXJuIGZDb25maWd1cmVkQ29udGVudFR5cGVzOwotCX0KLQotCXByb3RlY3RlZCBJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIGdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIHByb2Nlc3NvcnMgPSBudWxsOwotCi0JCWlmICgocGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUKSB8fCAocGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9DT01NRU5UKSkgewotCQkJcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde25ldyBIVE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcigpfTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElDU1NQYXJ0aXRpb25zLlNUWUxFKSB7Ci0JCQlwcm9jZXNzb3JzID0gbmV3IElDb250ZW50QXNzaXN0UHJvY2Vzc29yW117bmV3IENTU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKX07Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT04pIHsKLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXXtuZXcgTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySFRNTCgpfTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzb3JzOwotCX0KLQotCXB1YmxpYyBJQ29udGVudEZvcm1hdHRlciBnZXRDb250ZW50Rm9ybWF0dGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCUlDb250ZW50Rm9ybWF0dGVyIGZvcm1hdHRlciA9IHN1cGVyLmdldENvbnRlbnRGb3JtYXR0ZXIoc291cmNlVmlld2VyKTsKLQkJLy8gc3VwZXIgd2FzIHVuYWJsZSB0byBjcmVhdGUgYSBmb3JtYXR0ZXIsIHByb2JhYmx5IGJlY2F1c2UKLQkJLy8gc291cmNlVmlld2VyIGRvZXMgbm90IGhhdmUgZG9jdW1lbnQgc2V0IHlldCwgc28ganVzdCBjcmVhdGUgYQotCQkvLyBnZW5lcmljIG9uZQotCQlpZiAoIShmb3JtYXR0ZXIgaW5zdGFuY2VvZiBNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyKSkKLQkJCWZvcm1hdHRlciA9IG5ldyBNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyKGdldENvbmZpZ3VyZWREb2N1bWVudFBhcnRpdGlvbmluZyhzb3VyY2VWaWV3ZXIpLCBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUKTsKLQkJKChNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyKSBmb3JtYXR0ZXIpLnNldE1hc3RlclN0cmF0ZWd5KG5ldyBTdHJ1Y3R1cmVkRm9ybWF0dGluZ1N0cmF0ZWd5KG5ldyBIVE1MRm9ybWF0UHJvY2Vzc29ySW1wbCgpKSk7Ci0KLQkJcmV0dXJuIGZvcm1hdHRlcjsKLQl9Ci0KLQlwdWJsaWMgSVRleHREb3VibGVDbGlja1N0cmF0ZWd5IGdldERvdWJsZUNsaWNrU3RyYXRlZ3koSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlpZiAoY29udGVudFR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCkgewotCQkJLy8gdXNlIHhtbCdzIGRvdWJsZWNsaWNrIHN0cmF0ZWd5Ci0JCQlyZXR1cm4gZ2V0WE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldERvdWJsZUNsaWNrU3RyYXRlZ3koc291cmNlVmlld2VyLCBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldERvdWJsZUNsaWNrU3RyYXRlZ3koc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0SW5kZW50UHJlZml4ZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlWZWN0b3IgdmVjdG9yID0gbmV3IFZlY3RvcigpOwotCi0JCS8vIHByZWZpeFswXSBpcyBlaXRoZXIgJ1x0JyBvciAnICcgeCB0YWJXaWR0aCwgZGVwZW5kaW5nIG9uIHByZWZlcmVuY2UKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaW50IGluZGVudGF0aW9uV2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0JCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJYm9vbGVhbiB1c2VTcGFjZXMgPSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUEFDRS5lcXVhbHMoaW5kZW50Q2hhclByZWYpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDw9IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJU3RyaW5nQnVmZmVyIHByZWZpeCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJvb2xlYW4gYXBwZW5kVGFiID0gZmFsc2U7Ci0KLQkJCWlmICh1c2VTcGFjZXMpIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiArIGkgPCBpbmRlbnRhdGlvbldpZHRoOyBqKyspCi0JCQkJCXByZWZpeC5hcHBlbmQoJyAnKTsKLQotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFRhYiA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykKLQkJCQkJcHJlZml4LmFwcGVuZCgnICcpOwotCi0JCQkJaWYgKGkgIT0gaW5kZW50YXRpb25XaWR0aCkKLQkJCQkJYXBwZW5kVGFiID0gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKGFwcGVuZFRhYikgewotCQkJCXByZWZpeC5hcHBlbmQoJ1x0Jyk7Ci0JCQkJdmVjdG9yLmFkZChwcmVmaXgudG9TdHJpbmcoKSk7Ci0JCQkJLy8gcmVtb3ZlIHRoZSB0YWIgc28gdGhhdCBpbmRlbnRhdGlvbiAtIHRhYiBpcyBhbHNvIGFuIGluZGVudAotCQkJCS8vIHByZWZpeAotCQkJCXByZWZpeC5kZWxldGVDaGFyQXQocHJlZml4Lmxlbmd0aCgpIC0gMSk7Ci0JCQl9Ci0JCQl2ZWN0b3IuYWRkKHByZWZpeC50b1N0cmluZygpKTsKLQkJfQotCi0JCXZlY3Rvci5hZGQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIChTdHJpbmdbXSkgdmVjdG9yLnRvQXJyYXkobmV3IFN0cmluZ1t2ZWN0b3Iuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlMaW5lU3R5bGVQcm92aWRlcltdIHByb3ZpZGVycyA9IG51bGw7Ci0KLQkJaWYgKHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCB8fCBwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0NPTU1FTlQgfHwgcGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUNMQVJBVElPTikgewotCQkJcHJvdmlkZXJzID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyW117Z2V0TGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MKCl9OwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvblR5cGUgPT0gSUNTU1BhcnRpdGlvbnMuU1RZTEUpIHsKLQkJCXByb3ZpZGVycyA9IG5ldyBMaW5lU3R5bGVQcm92aWRlcltde2dldExpbmVTdHlsZVByb3ZpZGVyRm9yRW1iZWRkZWRDU1MoKX07Ci0JCX0KLQotCQlyZXR1cm4gcHJvdmlkZXJzOwotCX0KLQotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZ2V0TGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUygpIHsKLQkJaWYgKGZMaW5lU3R5bGVQcm92aWRlckZvckVtYmVkZGVkQ1NTID09IG51bGwpIHsKLQkJCWZMaW5lU3R5bGVQcm92aWRlckZvckVtYmVkZGVkQ1NTID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyRm9yRW1iZWRkZWRDU1MoKTsKLQkJfQotCQlyZXR1cm4gZkxpbmVTdHlsZVByb3ZpZGVyRm9yRW1iZWRkZWRDU1M7Ci0JfQotCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBnZXRMaW5lU3R5bGVQcm92aWRlckZvckhUTUwoKSB7Ci0JCWlmIChmTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MID09IG51bGwpIHsKLQkJCWZMaW5lU3R5bGVQcm92aWRlckZvckhUTUwgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MKCk7Ci0JCX0KLQkJcmV0dXJuIGZMaW5lU3R5bGVQcm92aWRlckZvckhUTUw7Ci0JfQotCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGdldFN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWlmIChmU3RhdHVzTGluZUxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyID0gbmV3IEpGYWNlTm9kZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0KLQkJCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCQkJCXJldHVybiBudWxsOwotCi0JCQkJCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgZWxlbWVudDsKLQkJCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQkJCQlzLmluc2VydCgwLCBzdXBlci5nZXRUZXh0KG5vZGUpKTsKLQkJCQkJCX0KLQkJCQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWlmIChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCQkJCXMuaW5zZXJ0KDAsIElQYXRoLlNFUEFSQVRPUik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHMudG9TdHJpbmcoKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGZTdGF0dXNMaW5lTGFiZWxQcm92aWRlcjsKLQl9Ci0KLQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBnZXRYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQlpZiAoZlhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgewotCQkJZlhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MKCk7Ci0JCX0KLQkJcmV0dXJuIGZYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotCX0KLQotCXByb3RlY3RlZCBNYXAgZ2V0SHlwZXJsaW5rRGV0ZWN0b3JUYXJnZXRzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCU1hcCB0YXJnZXRzID0gc3VwZXIuZ2V0SHlwZXJsaW5rRGV0ZWN0b3JUYXJnZXRzKHNvdXJjZVZpZXdlcik7Ci0JCXRhcmdldHMucHV0KENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTCwgbnVsbCk7Ci0KLQkJLy8gYWxzbyBhZGQgeG1sIHNpbmNlIHRoZXJlIGNvdWxkIGJlIHhtbCBjb250ZW50IGluIGh0bWwKLQkJLy8gKGp1c3QgaG9wZSB0aGUgaHlwZXJsaW5rIGRldGVjdG9ycyB3aWxsIGRvIGFkZGl0aW9uYWwgY2hlY2tpbmcpCi0JCXRhcmdldHMucHV0KENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwsIG51bGwpOwotCQlyZXR1cm4gdGFyZ2V0czsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvSFRNTFVJTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL0hUTUxVSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMzdjOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvSFRNTFVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgSFRNTCBVSQotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEhUTUxVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZlJlc291cmNlQnVuZGxlOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEhUTUxVSU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBIVE1MVUlNZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKGZSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCWZSZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlmUmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiBmUmVzb3VyY2VCdW5kbGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhbXBsZV9IVE1MX2RvYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MRmlsZXNQcmVmZXJlbmNlUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfTkVXX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfTkVXX0hFQURJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfREVTQ1JJUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0hUTUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1dBUk5JTkdfRk9MREVSX01VU1RfQkVfSU5TSURFX1dFQl9DT05URU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlR3JvdXBfbmFtZUV4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0aW5nX2ZpbGVzX2VuY29kaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF9kZXNjcmlwdGlvbjsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X2Rlc2NyaXB0aW9uOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXA7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbjsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmluZE9jY3VycmVuY2VzX2xhYmVsOwkvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGluZ19maWxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmNvZGluZ19kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0Rlc2NyaXB0aW9uX29mX3JvbGVfb2ZfZm9sbG93aW5nX0RPQ1RZUEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfRGVmYXVsdF9IVE1MX0RPQ1RZUEVfSURfX18xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1B1YmxpY19JRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9TeXN0ZW1fSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfbm9uZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9DU1NfcHJvZmlsZV9fXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRfYXNzaXN0X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNhbGx5X21ha2Vfc3VnZ2VzdF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvbXB0X3doZW5fdGhlc2VfY2hhcmFjdGVfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdHRpbmdfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExpbmVfd2lkdGhfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTcGxpdF9tdWx0aXBsZV9hdHRyaWJ1dGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFsaWduX2ZpbmFsX2JyYWNrZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kZW50X3VzaW5nX3RhYnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kZW50X3VzaW5nX3NwYWNlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmRlbnRhdGlvbl9zaXplOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluZGVudGF0aW9uX3NpemVfdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFyX2FsbF9ibGFua19saW5lc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZmVycmVkX21hcmt1cF9jYXNlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdfbmFtZXNfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdfbmFtZXNfVXBwZXJfY2FzZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnX25hbWVzX0xvd2VyX2Nhc2VfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZV9uYW1lc19fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZV9uYW1lc19VcHBlcl9jYXNlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfbmFtZXNfTG93ZXJfY2FzZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnX25hbWVfY2FzZV9mb3JfSFRNTF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnX25hbWVfY2FzZV9Bc19pc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnX25hbWVfY2FzZV9Mb3dlcl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnX25hbWVfY2FzZV9VcHBlcl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX25hbWVfY2FzZV9mb3JfSFRNTF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX25hbWVfY2FzZV9Bc19pc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX25hbWVfY2FzZV9Mb3dlcl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX25hbWVfY2FzZV9VcHBlcl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zZXJ0X3JlcXVpcmVkX2F0dHJpYnV0ZXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc2VydF9taXNzaW5nX3RhZ3NfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1b3RlX2F0dHJpYnV0ZV92YWx1ZXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdF9zb3VyY2VfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnZlcnRfRU9MX2NvZGVzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFT0xfV2luZG93c19VSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFT0xfVW5peF9VSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFT0xfTWFjX1VJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV82OwotCQotCS8vIGJlbG93IGFyZSBwb3NzaWJseSB1bnVzZWQgc3RyaW5ncyB0aGF0IG1heSBiZSBkZWxldGVkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MRmlsZXNQcmVmZXJlbmNlUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxGaWxlc1ByZWZlcmVuY2VQYWdlXzM7Ci0JLy8gYWJvdmUgYXJlIHBvc3NpYmx5IHVudXNlZCBzdHJpbmdzIHRoYXQgbWF5IGJlIGRlbGV0ZWQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbXB0eUZpbGVQcmVmZXJlbmNlUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TVFJVQ1RVUkVEX1RFWFRfRURJVE9SX1BSRUZTX0xJTks7Ci0JCi0JLy8gSFRNTCBUeXBpbmcgUHJlZmVyZW5jZXMKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVHlwaW5nX0F1dG9fQ29tcGxldGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFR5cGluZ19BdXRvX1JlbW92ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVHlwaW5nX0NvbXBsZXRlX0NvbW1lbnRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxUeXBpbmdfQ29tcGxldGVfRW5kX1RhZ3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFR5cGluZ19SZW1vdmVfRW5kX1RhZ3M7Ci0JCi0JLy8gYmVsb3cgYXJlIHRoZSBzdHJpbmdzIGZvciB0aGUgdmFsaWRhdGlvbiBwYWdlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRhdGlvbl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uX1dhcm5pbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRhdGlvbl9FcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uX0lnbm9yZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBhbmRhYmxlX2xhYmVsX2F0dHJpYnV0ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwYW5kYWJsZV9sYWJlbF9lbGVtZW50czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBhbmRhYmxlX2xhYmVsX2RvY3VtZW50X3R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwYW5kYWJsZV9sYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cGFuZGFibGVfbGFiZWxfY29tbWVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBhbmRhYmxlX2xhYmVsX2NkYXRhOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cGFuZGFibGVfbGFiZWxfcGk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwYW5kYWJsZV9sYWJlbF9lbnRpdHlfcmVmOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzExOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzE0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzE3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzIxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8zMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzMxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8zMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzM0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV85OwotCQotCS8vIFZhbGlkYXRpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25fV29ya3NwYWNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25fUHJvamVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uX2pvYk5hbWU7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9IVE1MVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL0hUTUxVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDA0OTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL0hUTUxVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQudGVtcGxhdGVzLkNvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGw7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC51aSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgSFRNTFVJUGx1Z2luIGluc3RhbmNlID0gbnVsbDsJCi0KLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBodG1sIGVkaXRvci4KLQkgKi8KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlRlbXBsYXRlU3RvcmU7Ci0KLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUgaHRtbCBlZGl0b3IuCi0JICovCi0JcHJpdmF0ZSBDb250ZXh0VHlwZVJlZ2lzdHJ5IGZDb250ZXh0VHlwZVJlZ2lzdHJ5OwotCi0JcHVibGljIEhUTUxVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSFRNTFVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBIVE1MVUlQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSBnZXRBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGwuZ2V0SW5zdGFuY2UoKTsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgaHRtbCBlZGl0b3IgdGVtcGxhdGVzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgaHRtbCBlZGl0b3IgdGVtcGxhdGVzCi0JICovCi0JcHVibGljIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpIHsKLQkJaWYgKGZUZW1wbGF0ZVN0b3JlID09IG51bGwpIHsKLQkJCWZUZW1wbGF0ZVN0b3JlID0gbmV3IENvbnRyaWJ1dGlvblRlbXBsYXRlU3RvcmUoZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSwgZ2V0UHJlZmVyZW5jZVN0b3JlKCksIEhUTUxVSVByZWZlcmVuY2VOYW1lcy5URU1QTEFURVNfS0VZKTsKLQotCQkJdHJ5IHsKLQkJCQlmVGVtcGxhdGVTdG9yZS5sb2FkKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlRlbXBsYXRlU3RvcmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUgaHRtbCBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUgaHRtbCBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgQ29udGV4dFR5cGVSZWdpc3RyeSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpIHsKLQkJaWYgKGZDb250ZXh0VHlwZVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCUNvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeSgpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuQUxMKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MLk5FVyk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5UQUcpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuQVRUUklCVVRFKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MLkFUVFJJQlVURV9WQUxVRSk7Ci0KLQkJCWZDb250ZXh0VHlwZVJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCX0KLQotCQlyZXR1cm4gZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvSFRNTFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9IVE1MVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA2OWZkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9IVE1MVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBCZW5qYW1pbiBNdXNrYWxsYSwgYi5tdXNrYWxsYUBnbXgubmV0IC0gWzE1ODY2MF0gY2hhcmFjdGVyIGVudGl0aWVzIHNob3VsZCBoYXZlIHRoZWlyIG93biBzeW50YXggaGlnaGxpZ2h0aW5nIHByZWZlcmVuY2UgICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBhIHNhbXBsZSBIVE1MIGRvY3VtZW50LiAgUGxlYXNlIHRyYW5zbGF0ZSBvbmx5IHRoZSBmb2xsb3dpbmcgcGFydHM6Ci0jIyBIVE1MIEhpZ2hsaWdodGluZyBQcmVmZXJlbmNlcwotIyMgd2UgbmVlZCBhIGZsYW1pbmcgbG9nbwotU2FtcGxlX0hUTUxfZG9jPTwhRE9DVFlQRSBodG1sXG5cdFBVQkxJQyBcIi0vL1czQy9EVEQvIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOXCJcblx0XCJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGRcIj5cbjxodG1sPlxuXHQ8aGVhZD5cblx0XHQ8bWV0YSBjb250ZW50PVwidGV4dC9odG1sXCI+XG5cdFx0PHRpdGxlPkhUTUwgSGlnaGxpZ2h0aW5nIFByZWZlcmVuY2VzPC90aXRsZT5cblx0PC9oZWFkPlxuPGJvZHk+XG5cdDwhLS1cblx0XHR3ZSBuZWVkIGEgZmxhbWluZyBsb2dvIVxuXHQtLT5cblx0PHA+dGhyZWUmbmJzcDsmbmJzcDsmbmJzcDtzcGFjZXM8L3A+XG48L2JvZHk+XG48L2h0bWw+Ci0KLUhUTUxGaWxlc1ByZWZlcmVuY2VQYWdlXzA9TG9hZGluZyBmaWxlcwotIwotX1VJX1dJWkFSRF9ORVdfVElUTEUgPSBOZXcgSFRNTCBQYWdlCi1fVUlfV0laQVJEX05FV19IRUFESU5HID0gSFRNTCBQYWdlCi1fVUlfV0laQVJEX05FV19ERVNDUklQVElPTiA9IENyZWF0ZSBhIG5ldyBIVE1MIFBhZ2UuCi1fRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfSFRNTCA9IFRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9ucyB7MH0uCi1fV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQgPSBGaWxlcyBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIFdlYiBDb250ZW50IGZvbGRlciB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB5b3VyIGRlcGxveWVkIFdlYiBhcHBsaWNhdGlvbi4gCi1SZXNvdXJjZUdyb3VwX25hbWVFeGlzdHMgPSBUaGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLgotTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMD1TZWxlY3QgSFRNTCBUZW1wbGF0ZQotTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMT1TZWxlY3QgYSB0ZW1wbGF0ZSBhcyBpbml0aWFsIGNvbnRlbnQgaW4gdGhlIEhUTUwgcGFnZS4KLU5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzI9TmFtZQotTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMz1EZXNjcmlwdGlvbgotTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfND1Vc2UgSFRNTCBUZW1wbGF0ZQotTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNT1QcmV2aWV3Ci1OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV82PVRlbXBsYXRlcyBhcmUgJ05ldyBIVE1MJyB0ZW1wbGF0ZXMgZm91bmQgaW4gdGhlIDxhPkhUTUwgVGVtcGxhdGVzPC9hPiBwcmVmZXJlbmNlIHBhZ2UuCi0jCi1DcmVhdGluZ19maWxlc19lbmNvZGluZz1DcmVhdGluZyBmaWxlcyBlbmNvZGluZyBwcmVmZXJlbmNlCi0jIENvcGllZCBmcm9tIHNzZS51aQotQ2xlYW51cERvY3VtZW50X2xhYmVsPUNsZWFudXAgRG9jdW1lbnQuLi4KLUNsZWFudXBEb2N1bWVudF90b29sdGlwPUNsZWFudXAgRG9jdW1lbnQKLUNsZWFudXBEb2N1bWVudF9kZXNjcmlwdGlvbj1DbGVhbnVwIERvY3VtZW50Ci1Ub2dnbGVDb21tZW50X2xhYmVsPVRvZ2dsZSBDb21tZW50Ci1Ub2dnbGVDb21tZW50X3Rvb2x0aXA9VG9nZ2xlIENvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfZGVzY3JpcHRpb249VG9nZ2xlIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF9sYWJlbD1BZGQgQmxvY2sgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X3Rvb2x0aXA9QWRkIEJsb2NrIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbj1BZGQgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsPVJlbW92ZSBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcD1SZW1vdmUgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uPVJlbW92ZSBCbG9jayBDb21tZW50Ci1GaW5kT2NjdXJyZW5jZXNfbGFiZWw9T2NjdXJyZW5jZXMgaW4gRmlsZQotQ3JlYXRpbmdfZmlsZXM9Q3JlYXRpbmcgZmlsZXMKLUVuY29kaW5nX2Rlc2M9VGhlIGZvbGxvd2luZyBlbmNvZGluZyB3aWxsIGFwcGx5OgotIyMgSFRNTCBTb3VyY2UgcHJlZmVyZW5jZSBwYWdlCi1Db250ZW50X2Fzc2lzdF9VSV89Q29udGVudCBhc3Npc3QKLUF1dG9tYXRpY2FsbHlfbWFrZV9zdWdnZXN0X1VJXz1BdXRvbWF0aWNhbGx5IG1hJmtlIHN1Z2dlc3Rpb25zCi1Qcm9tcHRfd2hlbl90aGVzZV9jaGFyYWN0ZV9VSV89UCZyb21wdCB3aGVuIHRoZXNlIGNoYXJhY3RlcnMgYXJlIGluc2VydGVkOgotRm9ybWF0dGluZ19VSV89Rm9ybWF0dGluZwotTGluZV93aWR0aF9fVUlfPUxpbmUgJndpZHRoOgotU3BsaXRfbXVsdGlwbGVfYXR0cmlidXRlcz1TcGxpdCAmbXVsdGlwbGUgYXR0cmlidXRlcyBlYWNoIG9uIGEgbmV3IGxpbmUKLUFsaWduX2ZpbmFsX2JyYWNrZXQ9JkFsaWduIGZpbmFsIGJyYWNrZXQgaW4gbXVsdGktbGluZSBlbGVtZW50IHRhZ3MKLUluZGVudF91c2luZ190YWJzPSZJbmRlbnQgdXNpbmcgdGFicwotSW5kZW50X3VzaW5nX3NwYWNlcz1JJm5kZW50IHVzaW5nIHNwYWNlcwotSW5kZW50YXRpb25fc2l6ZT1JbiZkZW50YXRpb24gc2l6ZToKLUluZGVudGF0aW9uX3NpemVfdGlwPUluZGVudGF0aW9uIHNpemUKLUNsZWFyX2FsbF9ibGFua19saW5lc19VSV89Q2xlYXIgYWxsICZibGFuayBsaW5lcwotUHJlZmVycmVkX21hcmt1cF9jYXNlX1VJXz1QcmVmZXJyZWQgbWFya3VwIGNhc2UgZm9yIGNvbnRlbnQgYXNzaXN0LCBhbmQgY29kZSBnZW5lcmF0aW9uCi1UYWdfbmFtZXNfX1VJXz1UYWcgbmFtZXM6Ci1UYWdfbmFtZXNfVXBwZXJfY2FzZV9VSV89JlVwcGVyY2FzZQotVGFnX25hbWVzX0xvd2VyX2Nhc2VfVUlfPSZMb3dlcmNhc2UKLUF0dHJpYnV0ZV9uYW1lc19fVUlfPUF0dHJpYnV0ZSBuYW1lczoKLUF0dHJpYnV0ZV9uYW1lc19VcHBlcl9jYXNlX1VJXz1VJnBwZXJjYXNlCi1BdHRyaWJ1dGVfbmFtZXNfTG93ZXJfY2FzZV9VSV89TCZvd2VyY2FzZQotQ2xlYW51cF9VSV89Q2xlYW51cAotVGFnX25hbWVfY2FzZV9mb3JfSFRNTF9VSV89VGFnIG5hbWUgY2FzZSBmb3IgSFRNTDoKLVRhZ19uYW1lX2Nhc2VfQXNfaXNfVUlfPSZBcy1pcwotVGFnX25hbWVfY2FzZV9Mb3dlcl9VSV89Jkxvd2VyCi1UYWdfbmFtZV9jYXNlX1VwcGVyX1VJXz0mVXBwZXIKLUF0dHJpYnV0ZV9uYW1lX2Nhc2VfZm9yX0hUTUxfVUlfPUF0dHJpYnV0ZSBuYW1lIGNhc2UgZm9yIEhUTUw6Ci1BdHRyaWJ1dGVfbmFtZV9jYXNlX0FzX2lzX1VJXz1BJnMtaXMKLUF0dHJpYnV0ZV9uYW1lX2Nhc2VfTG93ZXJfVUlfPUwmb3dlcgotQXR0cmlidXRlX25hbWVfY2FzZV9VcHBlcl9VSV89VSZwcGVyCi1JbnNlcnRfcmVxdWlyZWRfYXR0cmlidXRlc19VSV89SW5zZXJ0ICZyZXF1aXJlZCBhdHRyaWJ1dGVzCi1JbnNlcnRfbWlzc2luZ190YWdzX1VJXz0mSW5zZXJ0IG1pc3NpbmcgdGFncwotUXVvdGVfYXR0cmlidXRlX3ZhbHVlc19VSV89JlF1b3RlIGF0dHJpYnV0ZSB2YWx1ZXMKLUZvcm1hdF9zb3VyY2VfVUlfPSZGb3JtYXQgc291cmNlCi1Db252ZXJ0X0VPTF9jb2Rlc19VSV89Q29udmVydCBsaW5lICZkZWxpbWl0ZXJzIHRvCi1FT0xfV2luZG93c19VST0mV2luZG93cwotRU9MX1VuaXhfVUk9VSZOSVgKLUVPTF9NYWNfVUk9Jk1hYwotCi0jIHdlYiBjb250ZW50IHNldHRpbmdzCi1VSV9EZXNjcmlwdGlvbl9vZl9yb2xlX29mX2ZvbGxvd2luZ19ET0NUWVBFPVVzZSB0aGUgZm9sbG93aW5nIGRlZmF1bHQgZG9jdW1lbnQgdHlwZSB3aGVuIG5vIERPQ1RZUEUgaXMgZGVjbGFyZWQgaW4gYSBmaWxlOgotVUlfRGVmYXVsdF9IVE1MX0RPQ1RZUEVfSURfX18xPURvY3VtZW50IHR5cGU6Ci1VSV9QdWJsaWNfSUQ9UHVibGljIElEOgotVUlfU3lzdGVtX0lEPVN5c3RlbSBJRDoKLVVJX25vbmU9bm9uZQotVUlfQ1NTX3Byb2ZpbGVfX18yPUNTUyBwcm9maWxlOgotV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzA9VGhlIHByb3BlcnRpZXMgdXNlZCB0aGF0IGNhbm5vdCBvciBhcmUgbm90IHNwZWNpZmllZCBpbiB3ZWIgZmlsZXMuICBUaGUgcHJvamVjdCBzZXR0aW5nIGlzIHVzZWQgaWYgeW91IHNwZWNpZnkgIm5vbmUuIgotUHJvamVjdFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wPVRoZSBwcm9wZXJ0aWVzIGZvciBKMkVFIFdlYiBwcm9qZWN0cyBhY3QgYXMgInByb2plY3QiIGRlZmF1bHQgdG8gYmUgbG9va2VkIHVwIHdoZW4gbm8gcHJvcGVydGllcyBhcmUgc3BlY2lmaWVkIGZvciBhIHBhcnRpY3VsYXIgd2ViIGZpbGUuCi1TeW50YXhDb2xvcmluZ1BhZ2VfMD1TeW50YXggRWxlbWVudDoKLVN5bnRheENvbG9yaW5nUGFnZV8yPUVuYWJsZQotU3ludGF4Q29sb3JpbmdQYWdlXzM9QiZvbGQKLVN5bnRheENvbG9yaW5nUGFnZV80PSZJdGFsaWMKLVN5bnRheENvbG9yaW5nUGFnZV81PSZTdHJpa2V0aHJvdWdoCi1TeW50YXhDb2xvcmluZ1BhZ2VfNj0mVW5kZXJsaW5lCi0jIGJlbG93IGFyZSBwb3NzaWJseSB1bnVzZWQgc3RyaW5ncyB0aGF0IG1heSBiZSBkZWxldGVkCi1IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZV8xPUFkZCB0aGlzIHN1ZmZpeCAoaWYgbm90IHNwZWNpZmllZCk6Ci1IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZV8yPUluc2VydCBET0NUWVBFIGRlY2xhcmF0aW9uCi1IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZV8zPUluc2VydCBHRU5FUkFUT1Igd2l0aCBNRVRBIHRhZwotRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2VfMD1FeHBhbmQgdGhlIHRyZWUgdG8gZWRpdCBwcmVmZXJlbmNlcyBmb3IgYSBzcGVjaWZpYyBmZWF0dXJlLgotX1VJX1NUUlVDVFVSRURfVEVYVF9FRElUT1JfUFJFRlNfTElOSz1IVE1MIGVkaXRpbmcgcHJlZmVyZW5jZXMuICBOb3RlIHRoYXQgc29tZSBwcmVmZXJlbmNlcyBtYXkgYmUgc2V0IG9uIHRoZSA8YT57MH08L2E+IHByZWZlcmVuY2UgcGFnZS4KLSMgYWJvdmUgYXJlIHBvc3NpYmx5IHVudXNlZCBzdHJpbmdzIHRoYXQgbWF5IGJlIGRlbGV0ZWQKLQotIyBIVE1MIFR5cGluZyBQcmVmZXJlbmNlIFBhZ2UKLUhUTUxUeXBpbmdfQXV0b19Db21wbGV0ZT1BdXRvbWF0aWNhbGx5IGNsb3NlCi1IVE1MVHlwaW5nX0F1dG9fUmVtb3ZlPUF1dG9tYXRpY2FsbHkgcmVtb3ZlCi1IVE1MVHlwaW5nX0NvbXBsZXRlX0NvbW1lbnRzPSZDb21tZW50cwotSFRNTFR5cGluZ19Db21wbGV0ZV9FbmRfVGFncz0mRW5kIHRhZ3MKLUhUTUxUeXBpbmdfUmVtb3ZlX0VuZF9UYWdzPUUmbmQgdGFncyB3aGVuIGNyZWF0aW5nIGVtcHR5IHNlbGYtY2xvc2luZyB0YWdzCi0KLQotIyBWYWxpZGF0aW9uIHN0cmluZ3MKLVZhbGlkYXRpb25fZGVzY3JpcHRpb249U2VsZWN0IHRoZSBzZXZlcml0eSBsZXZlbCBmb3IgdGhlIGZvbGxvd2luZyB2YWxpZGF0aW9uIHByb2JsZW1zOgotVmFsaWRhdGlvbl9XYXJuaW5nPVdhcm5pbmcKLVZhbGlkYXRpb25fRXJyb3I9RXJyb3IKLVZhbGlkYXRpb25fSWdub3JlPUlnbm9yZQotRXhwYW5kYWJsZV9sYWJlbF9hdHRyaWJ1dGVzPUF0dHJpYnV0ZXMKLUV4cGFuZGFibGVfbGFiZWxfZWxlbWVudHM9RWxlbWVudHMKLUV4cGFuZGFibGVfbGFiZWxfZG9jdW1lbnRfdHlwZT1Eb2N1bWVudCBUeXBlCi1FeHBhbmRhYmxlX2xhYmVsX3RleHQ9VGV4dCBSZWdpb25zCi1FeHBhbmRhYmxlX2xhYmVsX2NvbW1lbnQ9Q29tbWVudHMKLUV4cGFuZGFibGVfbGFiZWxfY2RhdGE9Q0RBVEEgU2VjdGlvbnMKLUV4cGFuZGFibGVfbGFiZWxfcGk9UHJvY2Vzc2luZyBJbnN0cnVjdGlvbnMKLUV4cGFuZGFibGVfbGFiZWxfZW50aXR5X3JlZj1FbnRpdHkgUmVmZXJlbmNlcwotCi1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzA9VW5kZWZpbmVkIGF0dHJpYnV0ZSBuYW1lOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xPVVuZGVmaW5lZCBhdHRyaWJ1dGUgdmFsdWU6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzEwPVN0YXJ0LXRhZyB1c2VzIGludmFsaWQgY2FzZToKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTE9RW5kIHRhZyB1c2VzIGludmFsaWQgY2FzZToKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTI9TWlzc2luZyBzdGFydCB0YWc6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzEzPU1pc3NpbmcgZW5kIHRhZzoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTQ9VW5uZWNlc3NhcnkgZW5kIHRhZzoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTU9SW52YWxpZCBkaXJlY3RpdmU6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzE2PUludmFsaWQgdGFnIGxvY2F0aW9uOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xNz1EdXBsaWNhdGUgdGFnOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xOD1Db2V4aXN0ZW5jZToKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTk9VW5jbG9zZWQgc3RhcnQgdGFnOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yPUF0dHJpYnV0ZSBuYW1lIHVzaW5nIHdyb25nIGNhc2UgY2hhcmFjdGVyOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yMD1VbmNsb3NlZCBlbmQgdGFnOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yMT1JbnZhbGlkIGVtcHR5IGVsZW1lbnQgdGFnOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yMj1EdXBsaWNhdGUgRE9DVFlQRSBkZWNsYXJhdGlvbjoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjM9SW52YWxpZCBsb2NhdGlvbjoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjQ9RE9DVFlQRSBkZWNsYXJhdGlvbiB1bmNsb3NlZDoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjU9SW52YWxpZCB0ZXh0IHN0cmluZzoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjY9SW52YWxpZCBjaGFyYWN0ZXJzIHVzZWQgaW4gdGV4dCBzdHJpbmc6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI3PUludmFsaWQgbG9jYXRpb246Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI4PVVuY2xvc2VkIGNvbW1lbnQ6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI5PUludmFsaWQgbG9jYXRpb246Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzM9SW52YWxpZCBhdHRyaWJ1dGUgbmFtZToKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMzA9VW5jbG9zZWQgQ0RBVEEgc2VjdGlvbjoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMzE9SW52YWxpZCBsb2NhdGlvbjoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMzI9VW5jbG9zZWQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbjoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMzM9SW52YWxpZCBsb2NhdGlvbjoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMzQ9VW5rbm93biBlbnRpdHk6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzQ9SW52YWxpZCBhdHRyaWJ1dGU6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzU9TXVsdGlwbGUgdmFsdWVzIHNwZWNpZmllZCBmb3IgYW4gYXR0cmlidXRlOgotSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV82PUF0dHJpYnV0ZSB2YWx1ZSB1c2luZyB3cm9uZyBjYXNlIGNoYXJhY3RlcjoKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfNz1VbmNsb3NlZCBhdHRyaWJ1dGUgdmFsdWU6Ci1IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzg9VW5rbm93biB0YWcgbmFtZToKLUhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfOT1JbnZhbGlkIHRhZyBuYW1lOgotCi1WYWxpZGF0aW9uX1RpdGxlPVZhbGlkYXRpb24gU2V0dGluZ3MgQ2hhbmdlZAotVmFsaWRhdGlvbl9Xb3Jrc3BhY2U9VGhlIHZhbGlkYXRpb24gc2V0dGluZ3MgaGF2ZSBjaGFuZ2VkLiBBIGZ1bGwgdmFsaWRhdGlvbiBpcyByZXF1aXJlZCBmb3IgY2hhbmdlcyB0byB0YWtlIGVmZmVjdC4gVmFsaWRhdGUgbm93PwotVmFsaWRhdGlvbl9Qcm9qZWN0PVRoZSB2YWxpZGF0aW9uIHNldHRpbmdzIGhhdmUgY2hhbmdlZC4gQSB2YWxpZGF0aW9uIG9mIHRoZSBwcm9qZWN0IGlzIHJlcXVpcmVkIGZvciBjaGFuZ2VzIHRvIHRha2UgZWZmZWN0LiBWYWxpZGF0ZSB0aGUgcHJvamVjdCBub3c/Ci1WYWxpZGF0aW9uX2pvYk5hbWU9VmFsaWRhdGluZy4uLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgwZjNmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC51aSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogICAgICAgICAgICBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoCi0JICogICAgICAgICAgICAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGlzVHJhY2luZyhjYXRlZ29yeSkpIHsKLQkJCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9hdXRvZWRpdC9BdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzg5ZWU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmF1dG9lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Db25maWd1cmFibGVMaW5lVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBBdXRvRWRpdFN0cmF0ZWd5IHRvIGhhbmRsZSBjaGFyYWN0ZXJzIGluc2VydGVkIHdoZW4gVGFiIGtleSBpcyBwcmVzc2VkCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicyBpbXBsZW1lbnRzIElBdXRvRWRpdFN0cmF0ZWd5IHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBUQUJfQ0hBUkFDVEVSID0gIlx0IjsJLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyB2b2lkIGN1c3RvbWl6ZURvY3VtZW50Q29tbWFuZChJRG9jdW1lbnQgZG9jdW1lbnQsIERvY3VtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0JCS8vIGlmIG5vdCBpbiBzbWFydCBpbnNlcnQgbW9kZSBqdXN0IGlnbm9yZQotCQlpZiAoIWlzU21hcnRJbnNlcnRNb2RlKCkpCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBzcGFjZXMgZm9yIHRhYiBjaGFyYWN0ZXIKLQkJaWYgKGNvbW1hbmQubGVuZ3RoID09IDAgJiYgY29tbWFuZC50ZXh0ICE9IG51bGwgJiYgY29tbWFuZC50ZXh0Lmxlbmd0aCgpID4gMCAmJiBjb21tYW5kLnRleHQuaW5kZXhPZihUQUJfQ0hBUkFDVEVSKSAhPSAtMSkKLQkJCXNtYXJ0SW5zZXJ0Rm9yVGFiKGNvbW1hbmQsIGRvY3VtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgc3BhY2VzIGZvciB0YWJzCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc21hcnRJbnNlcnRGb3JUYWIoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyB0YWIga2V5IHdhcyBwcmVzc2VkLiBub3cgY2hlY2sgcHJlZmVyZW5jZXMgdG8gc2VlIGlmIG5lZWQgdG8gaW5zZXJ0Ci0JCS8vIHNwYWNlcyBpbnN0ZWFkIG9mIHRhYgotCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IGdldEluZGVudGF0aW9uV2lkdGgoKTsKLQkJaWYgKGluZGVudGF0aW9uV2lkdGggPiAtMSkgewotCQkJU3RyaW5nIG9yaWdpbmFsVGV4dCA9IGNvbW1hbmQudGV4dDsKLQkJCVN0cmluZ0J1ZmZlciBuZXdUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcihvcmlnaW5hbFRleHQpOwotCi0JCQkvLyBkZXRlcm1pbmUgd2hlcmUgaW4gbGluZSB0aGlzIGNvbW1hbmQgYmVnaW5zCi0JCQlpbnQgbGluZU9mZnNldCA9IC0xOwotCQkJdHJ5IHsKLQkJCQlJUmVnaW9uIGxpbmVJbmZvID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoY29tbWFuZC5vZmZzZXQpOwotCQkJCWxpbmVPZmZzZXQgPSBjb21tYW5kLm9mZnNldCAtIGxpbmVJbmZvLmdldE9mZnNldCgpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQotCQkJSUxpbmVUcmFja2VyIGxpbmVUcmFja2VyID0gZ2V0TGluZVRyYWNrZXIoZG9jdW1lbnQsIG9yaWdpbmFsVGV4dCk7Ci0KLQkJCWludCBzdGFydEluZGV4ID0gMDsKLQkJCWludCBpbmRleCA9IG5ld1RleHQuaW5kZXhPZihUQUJfQ0hBUkFDVEVSKTsKLQkJCXdoaWxlIChpbmRleCAhPSAtMSkgewotCQkJCVN0cmluZyBpbmRlbnQgPSBnZXRJbmRlbnRTdHJpbmcoaW5kZW50YXRpb25XaWR0aCwgbGluZU9mZnNldCwgbGluZVRyYWNrZXIsIGluZGV4KTsKLQotCQkJCS8vIHJlcGxhY2UgXHQgY2hhcmFjdGVyIHdpdGggc3BhY2VzCi0JCQkJbmV3VGV4dC5yZXBsYWNlKGluZGV4LCBpbmRleCArIDEsIGluZGVudCk7Ci0JCQkJaWYgKGxpbmVUcmFja2VyICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWxpbmVUcmFja2VyLnJlcGxhY2UoaW5kZXgsIDEsIGluZGVudCk7Ci0JCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGggcmVwbGFjaW5nIHRleHQsIGp1c3QKLQkJCQkJCS8vIHJlc2V0IHRvIGN1cnJlbnQgc3RyaW5nCi0JCQkJCQlsaW5lVHJhY2tlci5zZXQobmV3VGV4dC50b1N0cmluZygpKTsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXN0YXJ0SW5kZXggPSBpbmRleCArIGluZGVudC5sZW5ndGgoKTsKLQkJCQlpbmRleCA9IG5ld1RleHQuaW5kZXhPZihUQUJfQ0hBUkFDVEVSLCBzdGFydEluZGV4KTsKLQkJCX0KLQkJCWNvbW1hbmQudGV4dCA9IG5ld1RleHQudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZSBudW1iZXIgb2Ygc3BhY2VzIGZvciBuZXh0IHRhYiBzdG9wCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKGludCBpbmRlbnRhdGlvbldpZHRoLCBpbnQgbGluZU9mZnNldCwgSUxpbmVUcmFja2VyIGxpbmVUcmFja2VyLCBpbnQgaW5kZXgpIHsKLQkJaW50IGluZGVudFNpemUgPSBpbmRlbnRhdGlvbldpZHRoOwotCQlpbnQgb2Zmc2V0SW5MaW5lID0gLTE7Ci0JCWlmIChsaW5lVHJhY2tlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlSZWdpb24gbGluZUluZm8gPSBsaW5lVHJhY2tlci5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChpbmRleCk7Ci0JCQkJaWYgKGxpbmVJbmZvLmdldE9mZnNldCgpID09IDAgJiYgbGluZU9mZnNldCA+IC0xKQotCQkJCQlvZmZzZXRJbkxpbmUgPSBsaW5lT2Zmc2V0ICsgaW5kZXg7Ci0JCQkJZWxzZQotCQkJCQlvZmZzZXRJbkxpbmUgPSBpbmRleCAtIGxpbmVJbmZvLmdldE9mZnNldCgpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChsaW5lT2Zmc2V0ID4gLTEpIHsKLQkJCQlvZmZzZXRJbkxpbmUgPSBsaW5lT2Zmc2V0ICsgaW5kZXg7Ci0JCQl9Ci0JCX0KLQkJaWYgKG9mZnNldEluTGluZSA+IC0xICYmIGluZGVudGF0aW9uV2lkdGggPiAwKSB7Ci0JCQlpbnQgcmVtYWluZGVyID0gb2Zmc2V0SW5MaW5lICUgaW5kZW50YXRpb25XaWR0aDsKLQkJCWluZGVudFNpemUgPSBpbmRlbnRhdGlvbldpZHRoIC0gcmVtYWluZGVyOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRTaXplOyBpKyspCi0JCQlpbmRlbnQuYXBwZW5kKCcgJyk7Ci0JCXJldHVybiBpbmRlbnQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdXAgYSBsaW5lIHRyYWNrZXIgZm9yIHRleHQgd2l0aGluIGNvbW1hbmQgaWYgdGV4dCBpcyBtdWx0aS1saW5lCi0JICovCi0JcHJpdmF0ZSBJTGluZVRyYWNrZXIgZ2V0TGluZVRyYWNrZXIoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgb3JpZ2luYWxUZXh0KSB7Ci0JCUNvbmZpZ3VyYWJsZUxpbmVUcmFja2VyIGxpbmVUcmFja2VyID0gbnVsbDsKLQkJaW50W10gZGVsaW1zID0gVGV4dFV0aWxpdGllcy5pbmRleE9mKGRvY3VtZW50LmdldExlZ2FsTGluZURlbGltaXRlcnMoKSwgb3JpZ2luYWxUZXh0LCAwKTsKLQkJaWYgKGRlbGltc1swXSAhPSAtMSB8fCBkZWxpbXNbMV0gIT0gLTEpIHsKLQkJCWxpbmVUcmFja2VyID0gbmV3IENvbmZpZ3VyYWJsZUxpbmVUcmFja2VyKGRvY3VtZW50LmdldExlZ2FsTGluZURlbGltaXRlcnMoKSk7Ci0JCQlsaW5lVHJhY2tlci5zZXQob3JpZ2luYWxUZXh0KTsKLQkJfQotCQlyZXR1cm4gbGluZVRyYWNrZXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGFjdGl2ZSBlZGl0b3IgaXMgaW4gc21hcnQgaW5zZXJ0IG1vZGUsIGZhbHNlIG90aGVyd2lzZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNTbWFydEluc2VydE1vZGUoKSB7Ci0JCWJvb2xlYW4gaXNTbWFydEluc2VydE1vZGUgPSBmYWxzZTsKLQkJCi0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcillZGl0b3I7Ci0JCQkJCWVsc2UKLQkJCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gY2hlY2sgaWYgc21hcnQgaW5zZXJ0IG1vZGUKLQkJaWYgKHRleHRFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvckV4dGVuc2lvbjMgJiYgKChJVGV4dEVkaXRvckV4dGVuc2lvbjMpIHRleHRFZGl0b3IpLmdldEluc2VydE1vZGUoKSA9PSBJVGV4dEVkaXRvckV4dGVuc2lvbjMuU01BUlRfSU5TRVJUKQotCQkJaXNTbWFydEluc2VydE1vZGUgPSB0cnVlOwotCQlyZXR1cm4gaXNTbWFydEluc2VydE1vZGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgaW5kZW50YXRpb24gd2lkdGggaWYgdXNpbmcgc3BhY2VzIGZvciBpbmRlbnRhdGlvbiwgLTEgb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGdldEluZGVudGF0aW9uV2lkdGgoKSB7Ci0JCWludCB3aWR0aCA9IC0xOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUEFDRS5lcXVhbHMocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpKSkKLQkJCXdpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCXJldHVybiB3aWR0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9hdXRvZWRpdC9TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L1N0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5SFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjA5MTFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L1N0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5SFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5hdXRvZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEF1dG9tYXRpY2FsbHkgaW5zZXJ0cyBjbG9zaW5nIGNvbW1lbnQgdGFnIG9yIGVuZCB0YWcgd2hlbiBhcHByb3ByaWF0ZS4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5SFRNTCBpbXBsZW1lbnRzIElBdXRvRWRpdFN0cmF0ZWd5IHsKLQkvKgotCSAqIE5PVEU6IGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0cyBpbgotCSAqIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYXV0b2VkaXQKLQkgKiBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5hdXRvZWRpdAotCSAqLwotCXB1YmxpYyB2b2lkIGN1c3RvbWl6ZURvY3VtZW50Q29tbWFuZChJRG9jdW1lbnQgZG9jdW1lbnQsIERvY3VtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0JCU9iamVjdCB0ZXh0RWRpdG9yID0gZ2V0QWN0aXZlVGV4dEVkaXRvcigpOwotCQlpZiAoISh0ZXh0RWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3JFeHRlbnNpb24zICYmICgoSVRleHRFZGl0b3JFeHRlbnNpb24zKSB0ZXh0RWRpdG9yKS5nZXRJbnNlcnRNb2RlKCkgPT0gSVRleHRFZGl0b3JFeHRlbnNpb24zLlNNQVJUX0lOU0VSVCkpCi0JCQlyZXR1cm47Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlpZiAoY29tbWFuZC50ZXh0ICE9IG51bGwpIHsKLQkJCQkJc21hcnRJbnNlcnRGb3JDb21tZW50KGNvbW1hbmQsIGRvY3VtZW50LCBtb2RlbCk7Ci0JCQkJCXNtYXJ0SW5zZXJ0Rm9yRW5kVGFnKGNvbW1hbmQsIGRvY3VtZW50LCBtb2RlbCk7Ci0JCQkJCXNtYXJ0UmVtb3ZlRW5kVGFnKGNvbW1hbmQsIGRvY3VtZW50LCBtb2RlbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNQcmVmZXJlbmNlRW5hYmxlZChTdHJpbmcga2V5KSB7Ci0JCXJldHVybiAoa2V5ICE9IG51bGwgJiYgSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKGtleSkpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNDb21tZW50Tm9kZShJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiAobm9kZSAhPSBudWxsICYmIG5vZGUgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCAmJiAoKElET01FbGVtZW50KSBub2RlKS5pc0NvbW1lbnRUYWcoKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRG9jdW1lbnROb2RlKElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSk7Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHRzIHRvIGNsZWFuIHVwIGFuIGVuZC10YWcgaWYgYSBzdGFydC10YWcgaXMgY29udmVydGVkIGludG8gYW4gZW1wdHktZWxlbWVudAotCSAqIHRhZyAoZS5nLiwgPG5vZGUgLz4pIGFuZCB0aGUgb3JpZ2luYWwgZWxlbWVudCB3YXMgZW1wdHkuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQgdGhlIGRvY3VtZW50IGNvbW1hbmQgZGVzY3JpYmluZyB0aGUgY2hhbmdlCi0JICogQHBhcmFtIGRvY3VtZW50IHRoZSBkb2N1bWVudCB0aGF0IHdpbGwgYmUgY2hhbmdlZAotCSAqIEBwYXJhbSBtb2RlbCB0aGUgbW9kZWwgYmFzZWQgb24gdGhlIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNtYXJ0UmVtb3ZlRW5kVGFnKERvY3VtZW50Q29tbWFuZCBjb21tYW5kLCBJRG9jdW1lbnQgZG9jdW1lbnQsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJdHJ5IHsKLQkJCS8vIEFuIG9wZW5pbmcgdGFnIGlzIG5vdyBhIHNlbGYtdGVybWluYXRlZCBlbmQtdGFnCi0JCQlpZiAoIi8iLmVxdWFscyhjb21tYW5kLnRleHQpICYmICI+Ii5lcXVhbHMoZG9jdW1lbnQuZ2V0KGNvbW1hbmQub2Zmc2V0LCAxKSkgJiYgaXNQcmVmZXJlbmNlRW5hYmxlZChIVE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX1JFTU9WRV9FTkRfVEFHUykpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihjb21tYW5kLm9mZnNldCk7Ci0JCQkJaWYgKG5vZGUgIT0gbnVsbCAmJiAhbm9kZS5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCQkJCWlmIChyZWdpb24gIT0gbnVsbCAmJiByZWdpb24uaXNFbmRlZCgpKQotCQkJCQkJZG9jdW1lbnQucmVwbGFjZShyZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc21hcnRJbnNlcnRGb3JDb21tZW50KERvY3VtZW50Q29tbWFuZCBjb21tYW5kLCBJRG9jdW1lbnQgZG9jdW1lbnQsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJdHJ5IHsKLQkJCWlmIChjb21tYW5kLnRleHQuZXF1YWxzKCItIikgJiYgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPj0gMyAmJiBkb2N1bWVudC5nZXQoY29tbWFuZC5vZmZzZXQgLSAzLCAzKS5lcXVhbHMoIjwhLSIpICYmIGlzUHJlZmVyZW5jZUVuYWJsZWQoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9DT01NRU5UUykpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJY29tbWFuZC50ZXh0ICs9ICIgIC0tPiI7IC8vJE5PTi1OTFMtMSQKLQkJCQljb21tYW5kLnNoaWZ0c0NhcmV0ID0gZmFsc2U7Ci0JCQkJY29tbWFuZC5jYXJldE9mZnNldCA9IGNvbW1hbmQub2Zmc2V0ICsgMjsKLQkJCQljb21tYW5kLmRvaXQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNtYXJ0SW5zZXJ0Rm9yRW5kVGFnKERvY3VtZW50Q29tbWFuZCBjb21tYW5kLCBJRG9jdW1lbnQgZG9jdW1lbnQsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJdHJ5IHsKLQkJCWlmIChjb21tYW5kLnRleHQuZXF1YWxzKCIvIikgJiYgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPj0gMSAmJiBkb2N1bWVudC5nZXQoY29tbWFuZC5vZmZzZXQgLSAxLCAxKS5lcXVhbHMoIjwiKSAmJiBpc1ByZWZlcmVuY2VFbmFibGVkKEhUTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfRU5EX1RBR1MpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUlET01Ob2RlIHBhcmVudE5vZGUgPSAoSURPTU5vZGUpICgoSURPTU5vZGUpIG1vZGVsLmdldEluZGV4ZWRSZWdpb24oY29tbWFuZC5vZmZzZXQgLSAxKSkuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChpc0NvbW1lbnROb2RlKHBhcmVudE5vZGUpKSB7Ci0JCQkJCS8vIGxvb3AgYW5kIGZpbmQgbm9uIGNvbW1lbnQgbm9kZSBwYXJlbnQKLQkJCQkJd2hpbGUgKHBhcmVudE5vZGUgIT0gbnVsbCAmJiBpc0NvbW1lbnROb2RlKHBhcmVudE5vZGUpKSB7Ci0JCQkJCQlwYXJlbnROb2RlID0gKElET01Ob2RlKSBwYXJlbnROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICghaXNEb2N1bWVudE5vZGUocGFyZW50Tm9kZSkpIHsKLQkJCQkJLy8gb25seSBhZGQgZW5kIHRhZyBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBvciBpZgotCQkJCQkvLyBhZGQgJy8nIGRvZXMgbm90IGNyZWF0ZSBvbmUgYWxyZWFkeQotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHBhcmVudE5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCWlmIChlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCQkJU3RyaW5nQnVmZmVyIHRvQWRkID0gbmV3IFN0cmluZ0J1ZmZlcihwYXJlbnROb2RlLmdldE5vZGVOYW1lKCkpOwotCQkJCQkJaWYgKHRvQWRkLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCXRvQWRkLmFwcGVuZCgiPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIHN1ZmZpeCA9IHRvQWRkLnRvU3RyaW5nKCk7Ci0JCQkJCQkJaWYgKChkb2N1bWVudC5nZXRMZW5ndGgoKSA8IGNvbW1hbmQub2Zmc2V0ICsgc3VmZml4Lmxlbmd0aCgpKSB8fCAoIXN1ZmZpeC5lcXVhbHMoZG9jdW1lbnQuZ2V0KGNvbW1hbmQub2Zmc2V0LCBzdWZmaXgubGVuZ3RoKCkpKSkpIHsKLQkJCQkJCQkJY29tbWFuZC50ZXh0ICs9IHN1ZmZpeDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFjdGl2ZSB0ZXh0IGVkaXRvciBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlIHRoZSBhY3RpdmUgZWRpdG9yCi0JICogcGFydC4KLQkgKiAKLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldEFjdGl2ZVRleHRFZGl0b3IoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpCi0JCQkJCQlyZXR1cm4gZWRpdG9yOwotCQkJCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQkJCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gdGV4dEVkaXRvcjsKLQkJCQkJcmV0dXJuIGVkaXRvcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DdXN0b21UZW1wbGF0ZVByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbVRlbXBsYXRlUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiMGYyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbVRlbXBsYXRlUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZVByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LklSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWw7Ci0KLS8qKgotICogUHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIG1ha2UgdGhlIGFkZGl0aW9uYWwgcHJvcG9zYWwgaW5mbyBpbnRvIGNvbnRlbnQKLSAqIGZpdCBmb3IgYW4gSFRNTCB2aWV3ZXIgKGJ5IGVzY2FwaW5nIGNoYXJhY3RlcnMpCi0gKi8KLWNsYXNzIEN1c3RvbVRlbXBsYXRlUHJvcG9zYWwgZXh0ZW5kcyBUZW1wbGF0ZVByb3Bvc2FsIGltcGxlbWVudHMgSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Ci0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdAotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdAotCi0JcHVibGljIEN1c3RvbVRlbXBsYXRlUHJvcG9zYWwoVGVtcGxhdGUgdGVtcGxhdGUsIFRlbXBsYXRlQ29udGV4dCBjb250ZXh0LCBJUmVnaW9uIHJlZ2lvbiwgSW1hZ2UgaW1hZ2UsIGludCByZWxldmFuY2UpIHsKLQkJc3VwZXIodGVtcGxhdGUsIGNvbnRleHQsIHJlZ2lvbiwgaW1hZ2UsIHJlbGV2YW5jZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkgewotCQlTdHJpbmcgYWRkaXRpb25hbEluZm8gPSBzdXBlci5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0JCXJldHVybiBTdHJpbmdVdGlscy5jb252ZXJ0VG9IVE1MQ29udGVudChhZGRpdGlvbmFsSW5mbyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDUxN2Y2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSFRNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ1NTQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5IVE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklSZWxlYXNhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxSZWxldmFuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEhUTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCXByaXZhdGUgSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5Rm9yQ1NTID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBmUHJlZmVyZW5jZVN0b3JlID0gbnVsbDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1hIVE1MID0gZmFsc2U7Ci0JcHJpdmF0ZSBIVE1MVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yIGZUZW1wbGF0ZVByb2Nlc3NvciA9IG51bGw7Ci0JcHJpdmF0ZSBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBmSlNDb250ZW50QXNzaXN0UHJvY2Vzc29yID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZlRlbXBsYXRlQ29udGV4dHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgSFRNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0KLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuQVRUUklCVVRFKTsKLQkJc3VwZXIuYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5BVFRSSUJVVEVfVkFMVUUpOwotCQlzdXBlci5hZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBwcm9wb3NhbHMgZm9yIGEgY29tcGxldGVseSBlbXB0eSBkb2N1bWVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVtcHR5RG9jdW1lbnRQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5ORVcpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFBDREFUQVByb3Bvc2FsKFN0cmluZyBub2RlTmFtZSwgQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJaWYgKGlzWEhUTUwpCi0JCQlzdXBlci5hZGRQQ0RBVEFQcm9wb3NhbChub2RlTmFtZSwgY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJaWYgKGlzWEhUTUwpCi0JCQlhZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuVEFHKTsKLQkJc3VwZXIuYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjaGlsZFBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRlbXBsYXRlcyB0byB0aGUgbGlzdCBvZiBwcm9wb3NhbHMKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRUZW1wbGF0ZXMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIFN0cmluZyBjb250ZXh0KSB7Ci0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgY29udGV4dCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkpOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRlbXBsYXRlcyB0byB0aGUgbGlzdCBvZiBwcm9wb3NhbHMKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqIEBwYXJhbSBzdGFydE9mZnNldAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRUZW1wbGF0ZXMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnRPZmZzZXQpIHsKLQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBpZiBhbHJlYWR5IGFkZGluZyB0ZW1wbGF0ZSBwcm9wb3NhbHMgZm9yIGEgY2VydGFpbiBjb250ZXh0IHR5cGUsIGRvCi0JCS8vIG5vdCBhZGQgYWdhaW4KLQkJaWYgKCFmVGVtcGxhdGVDb250ZXh0cy5jb250YWlucyhjb250ZXh0KSkgewotCQkJZlRlbXBsYXRlQ29udGV4dHMuYWRkKGNvbnRleHQpOwotCQkJYm9vbGVhbiB1c2VQcm9wb3NhbExpc3QgPSAhY29udGVudEFzc2lzdFJlcXVlc3Quc2hvdWxkU2VwYXJhdGUoKTsKLQotCQkJaWYgKGdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpICE9IG51bGwpIHsKLQkJCQlnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5zZXRDb250ZXh0VHlwZShjb250ZXh0KTsKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoZlRleHRWaWV3ZXIsIHN0YXJ0T2Zmc2V0KTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3Bvc2Fscy5sZW5ndGg7ICsraSkgewotCQkJCQlpZiAodXNlUHJvcG9zYWxMaXN0KQotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWxzW2ldKTsKLQkJCQkJZWxzZQotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkTWFjcm8ocHJvcG9zYWxzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiZWdpbnNXaXRoKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgcHJlZml4KSB7Ci0JCWlmIChhU3RyaW5nID09IG51bGwgfHwgcHJlZml4ID09IG51bGwgfHwgcHJlZml4Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaW50IG1pbmltdW1MZW5ndGggPSBNYXRoLm1pbihwcmVmaXgubGVuZ3RoKCksIGFTdHJpbmcubGVuZ3RoKCkpOwotCQlTdHJpbmcgYmVnaW5uaW5nID0gYVN0cmluZy5zdWJzdHJpbmcoMCwgbWluaW11bUxlbmd0aCk7Ci0JCXJldHVybiBiZWdpbm5pbmcuZXF1YWxzSWdub3JlQ2FzZShwcmVmaXgpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSB0cmVlTm9kZSwgSURPTU5vZGUgeG1sbm9kZSkgewotCQlDb250ZW50QXNzaXN0UmVxdWVzdCByZXF1ZXN0ID0gc3VwZXIuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJLy8gYnVnMTE1OTI3IHVzZSBvcmlnaW5hbCBkb2N1bWVudCBwb3NpdGlvbiBmb3IgYWxsL2FueSByZWdpb24gdGVtcGxhdGVzCi0JCWFkZFRlbXBsYXRlcyhyZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5BTEwsIGRvY3VtZW50UG9zaXRpb24pOwotCQlyZXR1cm4gcmVxdWVzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIHByb3Bvc2VkIGNvZGUgY29tcGxldGlvbnMgYmFzZWQgb24gdGhlIHNwZWNpZmllZAotCSAqIGxvY2F0aW9uIHdpdGhpbiB0aGUgZG9jdW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBjdXJzb3IKLQkgKiBwb3NpdGlvbiB3aXRoaW4gdGhlIHRleHQtZWRpdG9yIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24KLQkgKiAgICAgICAgICAgIGEgbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY29kZS1hc3Npc3QgaXRlbXMKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCWZUZW1wbGF0ZUNvbnRleHRzLmNsZWFyKCk7Ci0KLQkJSW5kZXhlZFJlZ2lvbiB0cmVlTm9kZSA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodGV4dFZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIHRyZWVOb2RlOwotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0KLQkJLy8gY2hlY2sgaWYgaXQncyBpbiBhIGNvbW1lbnQgbm9kZQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm4gPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWlmIChmbiAhPSBudWxsICYmIGZuLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQgJiYgZG9jdW1lbnRQb3NpdGlvbiAhPSBmbi5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCX0KLQotCQkvLyBDTVZDIDI0MjY5NQotCQkvLyBpZiBpdCdzIGEgPC9zY3JpcHQ+IHRhZywgYm91bmNlIGJhY2sgdG8gSlMgY2EgcHJvY2Vzc29yLi4uCi0JCWlmIChmbiAhPSBudWxsICYmIGZuLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSAmJiBkb2N1bWVudFBvc2l0aW9uID09IGZuLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCB2ID0gZm4uZ2V0UmVnaW9ucygpOwotCQkJaWYgKHYuc2l6ZSgpID4gMSkgewotCQkJCS8vIGRldGVybWluZSB0aGF0IGl0J3MgYSBjbG9zZSB0YWcKLQkJCQlpZiAoKHYuZ2V0KDApKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQkJCUl0ZXJhdG9yIGl0ID0gdi5pdGVyYXRvcigpOwotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQkJCQkvLyBzZWFyY2ggZm9yIHNjcmlwdCB0YWcgbmFtZQotCQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCQlyZWdpb24gPSAoSVRleHRSZWdpb24pIGl0Lm5leHQoKTsKLQkJCQkJCWlmIChmbi5nZXRUZXh0KHJlZ2lvbikuZXF1YWxzSWdub3JlQ2FzZSgic2NyaXB0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGpzUHJvY2Vzc29yID0gZ2V0SlNDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0JCQkJCQkJaWYgKGpzUHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCQkJCQkJcmV0dXJuIGpzUHJvY2Vzc29yLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHRleHRWaWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpc1hIVE1MID0gZ2V0WEhUTUwobm9kZSk7Ci0KLQkJZkdlbmVyYXRvciA9IG51bGw7IC8vIGZvcmNlIHJlbG9hZCBvZiBjb250ZW50IGdlbmVyYXRvcgotCi0JCS8vIGhhbmRsZSBibGFuayBIVE1MIGRvY3VtZW50IGNhc2UKLQkJaWYgKHRyZWVOb2RlID09IG51bGwgfHwgaXNWaWV3ZXJFbXB0eSh0ZXh0Vmlld2VyKSkgewotCQkJLy8gY3Vyc29yIGlzIGF0IHRoZSBFT0YKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWwgaHRtbFRhZ1Byb3Bvc2FsID0gZ2V0SFRNTFRhZ1Byb3Bvc2FsKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdGV4dFZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQlJQ29tcGxldGlvblByb3Bvc2FsW10gc3VwZXJSZXN1bHRzID0gc3VwZXIuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModGV4dFZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQlpZiAoc3VwZXJSZXN1bHRzICE9IG51bGwgJiYgc3VwZXJSZXN1bHRzLmxlbmd0aCA+IDAgJiYgaHRtbFRhZ1Byb3Bvc2FsICE9IG51bGwpIHsKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gYmxhbmtIVE1MRG9jUmVzdWx0cyA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3N1cGVyUmVzdWx0cy5sZW5ndGggKyAxXTsKLQkJCQlibGFua0hUTUxEb2NSZXN1bHRzWzBdID0gaHRtbFRhZ1Byb3Bvc2FsOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoc3VwZXJSZXN1bHRzLCAwLCBibGFua0hUTUxEb2NSZXN1bHRzLCAxLCBzdXBlclJlc3VsdHMubGVuZ3RoKTsKLQkJCQlyZXR1cm4gYmxhbmtIVE1MRG9jUmVzdWx0czsKLQkJCX0KLQkJfQotCi0JCWlmIChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0KLQkJCS8vIGNoZWNrIGVtYmVkZGVkIENTUyBwcm9wb3NhbHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgU1RZTEUgZW5kCi0JCQkvLyB0YWcKLQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCWlmICh0YWdOYW1lICE9IG51bGwgJiYgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1RZTEUpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgPT0gZG9jdW1lbnRQb3NpdGlvbikgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJaW50IG9mZnNldCA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQkJCQkJaW50IHBvcyA9IGRvY3VtZW50UG9zaXRpb24gLSBvZmZzZXQ7Ci0JCQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gZ2V0Q1NTUHJvcG9zYWxzKHRleHRWaWV3ZXIsIHBvcywgbm9kZSwgb2Zmc2V0LCAoY2hhcikgMCk7Ci0JCQkJCQlpZiAocHJvcG9zYWxzICE9IG51bGwpCi0JCQkJCQkJcmV0dXJuIHByb3Bvc2FsczsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gY2hlY2sgaW5saW5lIENTUyBwcm9wb3NhbHMKLQkJCS8vIG5lZWQgdG8gZmluZCBhdHRyIHJlZ2lvbiBmcm9tIHNkIHJlZ2lvbgotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odGV4dFZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQlJdGVyYXRvciByZWdpb25zID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQlJVGV4dFJlZ2lvbiBzdHlsZU5hbWVSZWdpb24gPSBudWxsOwotCQkJSVRleHRSZWdpb24gc3R5bGVWYWx1ZVJlZ2lvbiA9IG51bGw7Ci0JCQl3aGlsZSAocmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCQlzdHlsZU5hbWVSZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJCWlmIChzdHlsZU5hbWVSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpICYmIHNkUmVnaW9uLmdldFRleHQoc3R5bGVOYW1lUmVnaW9uKS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1RZTEUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gdGhlIG5leHQgcmVnaW9uIHNob3VsZCBiZSAiPSIKLQkJCQkJaWYgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQkJCQlyZWdpb25zLm5leHQoKTsgLy8gc2tpcCB0aGUgIj0iCi0JCQkJCQkvLyBuZXh0IHJlZ2lvbiBzaG91bGQgYmUgYXR0ciB2YWx1ZSByZWdpb24KLQkJCQkJCWlmIChyZWdpb25zLmhhc05leHQoKSkgewotCQkJCQkJCXN0eWxlVmFsdWVSZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoc3R5bGVWYWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaW50IG9mZnNldCA9IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHN0eWxlVmFsdWVSZWdpb24pOwotCQkJCWludCBlbmQgPSBzZFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KHN0eWxlVmFsdWVSZWdpb24pOwotCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID49IG9mZnNldCAmJiBkb2N1bWVudFBvc2l0aW9uIDw9IGVuZCkgewotCQkJCQlib29sZWFuIGFza0NTUyA9IHRydWU7Ci0JCQkJCWNoYXIgcXVvdGUgPSAoY2hhcikgMDsKLQkJCQkJU3RyaW5nIHRleHQgPSBzZFJlZ2lvbi5nZXRUZXh0KHN0eWxlVmFsdWVSZWdpb24pOwotCQkJCQlpbnQgbGVuZ3RoID0gKHRleHQgIT0gbnVsbCA/IHRleHQubGVuZ3RoKCkgOiAwKTsKLQkJCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJCWNoYXIgZmlyc3RDaGFyID0gdGV4dC5jaGFyQXQoMCk7Ci0JCQkJCQlpZiAoZmlyc3RDaGFyID09ICciJyB8fCBmaXJzdENoYXIgPT0gJ1wnJykgewotCQkJCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID09IG9mZnNldCkgewotCQkJCQkJCQkvLyBiZWZvcmUgcXVvdGUKLQkJCQkJCQkJYXNrQ1NTID0gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlvZmZzZXQrKzsKLQkJCQkJCQkJcXVvdGUgPSBmaXJzdENoYXI7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPT0gZW5kKSB7Ci0JCQkJCQkJaWYgKGxlbmd0aCA+IDEgJiYgdGV4dC5jaGFyQXQobGVuZ3RoIC0gMSkgPT0gcXVvdGUpIHsKLQkJCQkJCQkJLy8gYWZ0ZXIgcXVvdGUKLQkJCQkJCQkJYXNrQ1NTID0gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChhc2tDU1MpIHsKLQkJCQkJCWludCBwb3MgPSBkb2N1bWVudFBvc2l0aW9uIC0gb2Zmc2V0OwotCQkJCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IGdldENTU1Byb3Bvc2Fscyh0ZXh0Vmlld2VyLCBwb3MsIG5vZGUsIG9mZnNldCwgcXVvdGUpOwotCQkJCQkJaWYgKHByb3Bvc2FscyAhPSBudWxsKQotCQkJCQkJCXJldHVybiBwcm9wb3NhbHM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModGV4dFZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIG5vIHRleHQgb3IgaXQncyBhbGwgd2hpdGUgc3BhY2UsIG90aGVyd2lzZQotCSAqIHJldHVybnMgZmFsc2UKLQkgKiAKLQkgKiBAcGFyYW0gdHJlZU5vZGUKLQkgKiBAcGFyYW0gdGV4dFZpZXdlcgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZpZXdlckVtcHR5KElUZXh0Vmlld2VyIHRleHRWaWV3ZXIpIHsKLQkJYm9vbGVhbiBpc0VtcHR5ID0gZmFsc2U7Ci0JCVN0cmluZyB0ZXh0ID0gdGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuZ2V0VGV4dCgpOwotCQlpZiAodGV4dCA9PSBudWxsIHx8ICh0ZXh0ICE9IG51bGwgJiYgdGV4dC50cmltKCkuZXF1YWxzKCIiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCWlzRW1wdHkgPSB0cnVlOwotCQlyZXR1cm4gaXNFbXB0eTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIElDb21wbGV0aW9uUHJvcG9zYWwKLQkgKi8KLQlwcml2YXRlIElDb21wbGV0aW9uUHJvcG9zYWwgZ2V0SFRNTFRhZ1Byb3Bvc2FsKFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJSU1vZGVsTWFuYWdlciBtbSA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJQ29tcGxldGlvblByb3Bvc2FsIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAobW0gIT0gbnVsbCkgewotCQkJCW1vZGVsID0gbW0uZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQodmlld2VyLmdldERvY3VtZW50KCkpOwotCi0JCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJSURPTURvY3VtZW50IGRvYyA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQotCQkJCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb2MpOwotCQkJCQlpZiAobXEgIT0gbnVsbCkgewotCi0JCQkJCQkvLyBYSFRNTCByZXF1aXJlcyBsb3dlcmNhc2UgdGFnbmFtZSBmb3IgbG9va3VwCi0JCQkJCQlDTURvY3VtZW50IGNvcnJlc3BvbmRpbmdDTURvY3VtZW50ID0gbXEuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoZG9jKTsKLQkJCQkJCWlmIChjb3JyZXNwb25kaW5nQ01Eb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gaHRtbERlY2wgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNvcnJlc3BvbmRpbmdDTURvY3VtZW50LmdldEVsZW1lbnRzKCkuZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MLnRvTG93ZXJDYXNlKCkpOwotCQkJCQkJCWlmIChodG1sRGVjbCAhPSBudWxsKSB7Ci0JCQkJCQkJCVN0cmluZ0J1ZmZlciBwcm9wb3NlZFRleHRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCQkJCWdldENvbnRlbnRHZW5lcmF0b3IoKS5nZW5lcmF0ZVRhZyhkb2MsIGh0bWxEZWNsLCBwcm9wb3NlZFRleHRCdWZmZXIpOwotCi0JCQkJCQkJCVN0cmluZyBwcm9wb3NlZFRleHQgPSBwcm9wb3NlZFRleHRCdWZmZXIudG9TdHJpbmcoKTsKLQkJCQkJCQkJU3RyaW5nIHJlcXVpcmVkTmFtZSA9IGdldENvbnRlbnRHZW5lcmF0b3IoKS5nZXRSZXF1aXJlZE5hbWUoZG9jLCBodG1sRGVjbCk7Ci0KLQkJCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQsIGRvY3VtZW50UG9zaXRpb24sCi0JCQkJCQkJCS8qIHN0YXJ0IHBvcyAqLwotCQkJCQkJCQkwLCAvKiByZXBsYWNlIGxlbmd0aCAqLwotCQkJCQkJCQlyZXF1aXJlZE5hbWUubGVuZ3RoKCkgKyAyLCAvKgotCQkJCQkJCQkJCQkJCQkJICogY3Vyc29yIHBvc2l0aW9uCi0JCQkJCQkJCQkJCQkJCQkgKiBhZnRlcgotCQkJCQkJCQkJCQkJCQkJICogKHJlbGF2dGl2ZSB0bwotCQkJCQkJCQkJCQkJCQkJICogc3RhcnQpCi0JCQkJCQkJCQkJCQkJCQkgKi8KLQkJCQkJCQkJSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoSFRNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDKSwgcmVxdWlyZWROYW1lLCBudWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9UQUdfTkFNRSk7Ci0JCQkJCQkJCXJlc3VsdCA9IHByb3Bvc2FsOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29udGVudEdlbmVyYXRvcigpCi0JICovCi0JcHVibGljIFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvciBnZXRDb250ZW50R2VuZXJhdG9yKCkgewotCQlpZiAoZkdlbmVyYXRvciA9PSBudWxsKSB7Ci0JCQlpZiAoaXNYSFRNTCkKLQkJCQlmR2VuZXJhdG9yID0gWEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yLmdldEluc3RhbmNlKCk7Ci0JCQllbHNlCi0JCQkJZkdlbmVyYXRvciA9IEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yLmdldEluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGZHZW5lcmF0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRDU1NQcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgcG9zLCBJRE9NTm9kZSBlbGVtZW50LCBpbnQgb2Zmc2V0LCBjaGFyIHF1b3RlKSB7Ci0KLQkJQ1NTQ29udGVudEFzc2lzdFByb2Nlc3NvciBjc3NQcm9jZXNzb3IgPSBuZXcgQ1NTQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQljc3NQcm9jZXNzb3Iuc2V0RG9jdW1lbnRPZmZzZXQob2Zmc2V0KTsKLQkJY3NzUHJvY2Vzc29yLnNldFF1b3RlQ2hhck9mU3R5bGVBdHRyaWJ1dGUocXVvdGUpOwotCi0JCXJldHVybiBjc3NQcm9jZXNzb3IuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBwb3MpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RW1wdHlUYWdDbG9zZVN0cmluZygpIHsKLQkJaWYgKGlzWEhUTUwpCi0JCQlyZXR1cm4gIiAvPiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuICI+IjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldEpTQ29udGVudEFzc2lzdFByb2Nlc3NvcigpIHsKLQkJaWYgKGZKU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJZkpTQ29udGVudEFzc2lzdFByb2Nlc3NvciA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MKCkuZ2V0Q29udGVudEFzc2lzdGFudChudWxsKS5nZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKElIVE1MUGFydGl0aW9ucy5TQ1JJUFQpOwotCQl9Ci0JCXJldHVybiBmSlNDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotCX0KLQotCXByaXZhdGUgSFRNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChmVGVtcGxhdGVQcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJZlRlbXBsYXRlUHJvY2Vzc29yID0gbmV3IEhUTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQkJfQotCQlyZXR1cm4gZlRlbXBsYXRlUHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBpZiB0aGlzIERvY3VtZW50IGlzIGFuIFhIVE1MIERvY3VtZW50LiBPcHJhdGVzIHNvbGVseSBvZmYgb2YKLQkgKiB0aGUgRG9jdW1lbnQgVHlwZSBkZWNsYXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldFhIVE1MKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCURvY3VtZW50IGRvYyA9IG51bGw7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKQotCQkJZG9jID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWVsc2UKLQkJCWRvYyA9ICgoRG9jdW1lbnQpIG5vZGUpOwotCi0JCWlmIChkb2MgaW5zdGFuY2VvZiBJRE9NRG9jdW1lbnQpCi0JCQlyZXR1cm4gKChJRE9NRG9jdW1lbnQpIGRvYykuaXNYTUxUeXBlKCk7Ci0KLQotCQlpZiAoZG9jIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJTW9kZWxRdWVyeUFkYXB0ZXIgYWRhcHRlciA9IChNb2RlbFF1ZXJ5QWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBkb2MpLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQkJQ01Eb2N1bWVudCBjbWRvYyA9IG51bGw7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuZ2V0TW9kZWxRdWVyeSgpICE9IG51bGwpCi0JCQkJY21kb2MgPSBhZGFwdGVyLmdldE1vZGVsUXVlcnkoKS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChkb2MpOwotCQkJaWYgKGNtZG9jICE9IG51bGwpIHsKLQkJCQkvLyB0cmVhdCBhcyBYSFRNTCB1bmxlc3Mgd2UndmUgZ290IHRoZSBpbi1jb2RlIEhUTUwgY29udGVudAotCQkJCS8vIG1vZGVsCi0JCQkJaWYgKGNtZG9jIGluc3RhbmNlb2YgSFRNTENNRG9jdW1lbnQpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAoY21kb2Muc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5JU19YSFRNTCkpCi0JCQkJCXJldHVybiBCb29sZWFuLlRSVUUuZXF1YWxzKGNtZG9jLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKTsKLQkJCX0KLQkJfQotCQkvLyB0aGlzIHNob3VsZCBuZXZlciBiZSByZWFjaGVkCi0JCURvY3VtZW50VHlwZSBkb2NUeXBlID0gZG9jLmdldERvY3R5cGUoKTsKLQkJcmV0dXJuIGRvY1R5cGUgIT0gbnVsbCAmJiBkb2NUeXBlLmdldFB1YmxpY0lkKCkgIT0gbnVsbCAmJiBkb2NUeXBlLmdldFB1YmxpY0lkKCkuaW5kZXhPZigiLS8vVzNDLy9EVEQgWEhUTUwgIikgPT0gMDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXJlaW5pdCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlaW5pdCgpIHsKLQkJU3RyaW5nIGtleSA9IEhUTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0U7Ci0JCWJvb2xlYW4gZG9BdXRvID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihrZXkpOwotCQlpZiAoZG9BdXRvKSB7Ci0JCQlrZXkgPSBIVE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFX0NPREU7Ci0JCQljb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoa2V5KS50b0NoYXJBcnJheSgpOwotCQl9Ci0JCWVsc2UgewotCQkJY29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChmYWN0b3J5Rm9yQ1NTICE9IG51bGwpIHsKLQkJCWZhY3RvcnlGb3JDU1MucmVsZWFzZSgpOwotCQl9Ci0JCWlmIChmSlNDb250ZW50QXNzaXN0UHJvY2Vzc29yIGluc3RhbmNlb2YgSVJlbGVhc2FibGUpIHsKLQkJCSgoSVJlbGVhc2FibGUpZkpTQ29udGVudEFzc2lzdFByb2Nlc3NvcikucmVsZWFzZSgpOwotCQl9Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdHJpbmdzRXF1YWwoU3RyaW5nIGEsIFN0cmluZyBiKSB7Ci0JCXJldHVybiBhLmVxdWFsc0lnbm9yZUNhc2UoYik7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgcHJvcGVydHkgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCi0JCWlmIChwcm9wZXJ0eS5jb21wYXJlVG8oSFRNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRSkgPT0gMCB8fCBwcm9wZXJ0eS5jb21wYXJlVG8oSFRNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFKSA9PSAwKSB7Ci0JCQlyZWluaXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJaWYgKGZQcmVmZXJlbmNlU3RvcmUgPT0gbnVsbCkKLQkJCWZQcmVmZXJlbmNlU3RvcmUgPSBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JCXJldHVybiBmUHJlZmVyZW5jZVN0b3JlOwotCX0KLQotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbiwgSW5kZXhlZFJlZ2lvbiBpbmRleGVkTm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXJldHVybiBjb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMDM1ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxDb250ZW50TW9kZWxHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yIGV4dGVuZHMgWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yIGluc3RhbmNlID0gbnVsbDsKLQlwcm90ZWN0ZWQgaW50IGZUYWdDYXNlOwotCXByb3RlY3RlZCBpbnQgZkF0dHJDYXNlOwotCi0JLyoqCi0JICogSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQkvL0lQcmVmZXJlbmNlU3RvcmUgcHJlZnMgPSBDb21tb25QcmVmZXJlbmNlc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKENvbnRlbnRUeXBlLkNvbnRlbnRUeXBlSURfSFRNTCk7Ci0JCVByZWZlcmVuY2VzIHByZWZzID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWZUYWdDYXNlID0gcHJlZnMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBR19OQU1FX0NBU0UpOwotCQlmQXR0ckNhc2UgPSBwcmVmcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlRW5kVGFnKFN0cmluZyB0YWdOYW1lLCBOb2RlIHBhcmVudE5vZGUsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCWlmIChlbGVtZW50RGVjbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZWxlbWVudERlY2wgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQlpZiAoKChCb29sZWFuKSBlbGVtZW50RGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX0pTUCkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJaWYgKGVsZW1lbnREZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVN0cmluZyBvbW1pc3Npb24gPSAoU3RyaW5nKSBlbGVtZW50RGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSk7Ci0JCQkJaWYgKG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkQpIHx8IG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkRfREVGQVVMVCkgfHwgb21taXNzaW9uLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9NVVNUKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGVsZW1lbnREZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpCi0JCQlyZXR1cm47Ci0JCWJ1ZmZlci5hcHBlbmQoIjwvIiArIHRhZ05hbWUgKyAiPiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlyZXR1cm47Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZElnbm9yZUNhc2UoQ01Ob2RlIGNtbm9kZSkgewotCQlpZiAoIWNtbm9kZS5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoKEJvb2xlYW4pIGNtbm9kZS5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVxdWlyZWROYW1lKE5vZGUgb3duZXJOb2RlLCBDTU5vZGUgY21ub2RlKSB7Ci0JCVN0cmluZyBuYW1lID0gc3VwZXIuZ2V0UmVxdWlyZWROYW1lKG93bmVyTm9kZSwgY21ub2RlKTsKLQkJLy8gZG9uJ3QgY2hhbmdlIHRoZSBjYXNlIHVubGVzcyB3ZSdyZSBjZXJ0YWluIGl0IGlzIG1lYW5pbmdsZXNzCi0JCWlmIChzaG91bGRJZ25vcmVDYXNlKGNtbm9kZSkpIHsKLQkJCWludCBjYXNlVmFsID0gLTE7Ci0JCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pCi0JCQkJY2FzZVZhbCA9IGZUYWdDYXNlOwotCQkJZWxzZSBpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikKLQkJCQljYXNlVmFsID0gZkF0dHJDYXNlOwotCQkJc3dpdGNoIChjYXNlVmFsKSB7Ci0JCQkJY2FzZSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUiA6Ci0JCQkJCXsKLQkJCQkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUiA6Ci0JCQkJCXsKLQkJCQkJCW5hbWUgPSBuYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdGFydFRhZ0Nsb3NlKE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wpIHsKLQkJU3RyaW5nIG90aGVyID0gZ2V0T3RoZXJDbG9zZShwYXJlbnROb2RlKTsKLQkJaWYgKG90aGVyICE9IG51bGwpCi0JCQlyZXR1cm4gb3RoZXI7Ci0JCWlmIChlbGVtZW50RGVjbCA9PSBudWxsKQotCQkJcmV0dXJuICI+IjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZWxlbWVudERlY2wgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQlpZiAoKChCb29sZWFuKSBlbGVtZW50RGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX0pTUCkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJaWYgKGVsZW1lbnREZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpCi0JCQkJCXJldHVybiAiLz4iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgb21taXNzaW9uID0gKFN0cmluZykgZWxlbWVudERlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpOwotCQkJCWlmIChvbW1pc3Npb24uZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EKSB8fCBvbW1pc3Npb24uZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX0RFRkFVTFQpIHx8IG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkRfTVVTVCkpIHsKLQkJCQkJcmV0dXJuICI+IjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiAiPiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbnN0YW5jZS4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvcgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yKCk7Ci0JCWluc3RhbmNlLmluaXQoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSFRNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDlkNmZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSFRNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZVByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5IVE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotCi0KLS8qKgotICogQ29tcGxldGlvbiBwcm9jZXNzb3IgZm9yIEhUTUwgVGVtcGxhdGVzLiBNb3N0IG9mIHRoZSB3b3JrIGlzIGFscmVhZHkgZG9uZQotICogYnkgdGhlIEhUTUwgQ29udGVudCBBc3Npc3QgcHJvY2Vzc29yLCBzbyBieSB0aGUgdGltZSB0aGUKLSAqIEhUTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgaXMgYXNrZWQgZm9yIGNvbnRlbnQgYXNzaXN0IHByb3Bvc2FscywgdGhlCi0gKiBIVE1MIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvciBoYXMgYWxyZWFkeSBzZXQgdGhlIGNvbnRleHQgdHlwZSBmb3IKLSAqIHRlbXBsYXRlcy4KLSAqLwotY2xhc3MgSFRNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBleHRlbmRzIFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUHJvcG9zYWxDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJcmV0dXJuICgoVGVtcGxhdGVQcm9wb3NhbCkgbzIpLmdldFJlbGV2YW5jZSgpIC0gKChUZW1wbGF0ZVByb3Bvc2FsKSBvMSkuZ2V0UmVsZXZhbmNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIGZnUHJvcG9zYWxDb21wYXJhdG9yID0gbmV3IFByb3Bvc2FsQ29tcGFyYXRvcigpOwotCXByaXZhdGUgU3RyaW5nIGZDb250ZXh0VHlwZUlkID0gbnVsbDsKLQotCS8qCi0JICogQ29waWVkIGZyb20gc3VwZXIgY2xhc3MgZXhjZXB0IGluc3RlYWQgb2YgY2FsbGluZyBjcmVhdGVDb250ZXh0KHZpZXdlciwKLQkgKiByZWdpb24pIGNhbGwgY3JlYXRlQ29udGV4dCh2aWV3ZXIsIHJlZ2lvbiwgb2Zmc2V0KSBpbnN0ZWFkCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQotCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCi0JCS8vIGFkanVzdCBvZmZzZXQgdG8gZW5kIG9mIG5vcm1hbGl6ZWQgc2VsZWN0aW9uCi0JCWlmIChzZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgPT0gb2Zmc2V0KQotCQkJb2Zmc2V0ID0gc2VsZWN0aW9uLmdldE9mZnNldCgpICsgc2VsZWN0aW9uLmdldExlbmd0aCgpOwotCi0JCVN0cmluZyBwcmVmaXggPSBleHRyYWN0UHJlZml4KHZpZXdlciwgb2Zmc2V0KTsKLQkJUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24ob2Zmc2V0IC0gcHJlZml4Lmxlbmd0aCgpLCBwcmVmaXgubGVuZ3RoKCkpOwotCQlUZW1wbGF0ZUNvbnRleHQgY29udGV4dCA9IGNyZWF0ZUNvbnRleHQodmlld2VyLCByZWdpb24sIG9mZnNldCk7Ci0JCWlmIChjb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCS8vIG5hbWUgb2YgdGhlIHNlbGVjdGlvbiB2YXJpYWJsZXMge2xpbmUsIHdvcmR9X3NlbGVjdGlvbgotCQljb250ZXh0LnNldFZhcmlhYmxlKCJzZWxlY3Rpb24iLCBzZWxlY3Rpb24uZ2V0VGV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVRlbXBsYXRlW10gdGVtcGxhdGVzID0gZ2V0VGVtcGxhdGVzKGNvbnRleHQuZ2V0Q29udGV4dFR5cGUoKS5nZXRJZCgpKTsKLQotCQlMaXN0IG1hdGNoZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGVtcGxhdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IHRlbXBsYXRlc1tpXTsKLQkJCXRyeSB7Ci0JCQkJY29udGV4dC5nZXRDb250ZXh0VHlwZSgpLnZhbGlkYXRlKHRlbXBsYXRlLmdldFBhdHRlcm4oKSk7Ci0JCQl9Ci0JCQljYXRjaCAoVGVtcGxhdGVFeGNlcHRpb24gZSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHRlbXBsYXRlLm1hdGNoZXMocHJlZml4LCBjb250ZXh0LmdldENvbnRleHRUeXBlKCkuZ2V0SWQoKSkpCi0JCQkJbWF0Y2hlcy5hZGQoY3JlYXRlUHJvcG9zYWwodGVtcGxhdGUsIGNvbnRleHQsIChJUmVnaW9uKSByZWdpb24sIGdldFJlbGV2YW5jZSh0ZW1wbGF0ZSwgcHJlZml4KSkpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbnMuc29ydChtYXRjaGVzLCBmZ1Byb3Bvc2FsQ29tcGFyYXRvcik7Ci0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIG1hdGNoZXMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFttYXRjaGVzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb25jcmV0ZSB0ZW1wbGF0ZSBjb250ZXh0IGZvciB0aGUgZ2l2ZW4gcmVnaW9uIGluIHRoZQotCSAqIGRvY3VtZW50LiBUaGlzIGludm9sdmVzIGZpbmRpbmcgb3V0IHdoaWNoIGNvbnRleHQgdHlwZSBpcyB2YWxpZCBhdCB0aGUKLQkgKiBnaXZlbiBsb2NhdGlvbiwgYW5kIHRoZW4gY3JlYXRpbmcgYSBjb250ZXh0IG9mIHRoaXMgdHlwZS4gVGhlIGRlZmF1bHQKLQkgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGEgPGNvZGU+U21hcnRSZXBsYWNlVGVtcGxhdGVDb250ZXh0PC9jb2RlPiBmb3IKLQkgKiB0aGUgY29udGV4dCB0eXBlIGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4gVGhpcyB0YWtlcyB0aGUgb2Zmc2V0IGF0IHdoaWNoCi0JICogY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQgaW50byBjb25zaWRlcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgZm9yIHdoaWNoIHRoZSBjb250ZXh0IGlzIGNyZWF0ZWQKLQkgKiBAcGFyYW0gcmVnaW9uCi0JICogICAgICAgICAgICB0aGUgcmVnaW9uIGludG8gPGNvZGU+ZG9jdW1lbnQ8L2NvZGU+IGZvciB3aGljaCB0aGUKLQkgKiAgICAgICAgICAgIGNvbnRleHQgaXMgY3JlYXRlZAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBvZmZzZXQgd2hlcmUgY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQKLQkgKiBAcmV0dXJuIGEgdGVtcGxhdGUgY29udGV4dCB0aGF0IGNhbiBoYW5kbGUgdGVtcGxhdGUgaW5zZXJ0aW9uIGF0IHRoZQotCSAqICAgICAgICAgZ2l2ZW4gbG9jYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZUNvbnRleHQgY3JlYXRlQ29udGV4dChJVGV4dFZpZXdlciB2aWV3ZXIsIElSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIHByZXR0eSBtdWNoIHNhbWUgY29kZSBhcyBzdXBlci5jcmVhdGVDb250ZXh0IGV4Y2VwdCBjcmVhdGUKLQkJLy8gU21hcnRSZXBsYWNlVGVtcGxhdGVDb250ZXh0Ci0JCVRlbXBsYXRlQ29udGV4dFR5cGUgY29udGV4dFR5cGUgPSBnZXRDb250ZXh0VHlwZSh2aWV3ZXIsIHJlZ2lvbik7Ci0JCWlmIChjb250ZXh0VHlwZSAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCXJldHVybiBuZXcgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCByZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSwgb2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVQcm9wb3NhbChUZW1wbGF0ZSB0ZW1wbGF0ZSwgVGVtcGxhdGVDb250ZXh0IGNvbnRleHQsIElSZWdpb24gcmVnaW9uLCBpbnQgcmVsZXZhbmNlKSB7Ci0JCXJldHVybiBuZXcgQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbCh0ZW1wbGF0ZSwgY29udGV4dCwgcmVnaW9uLCBnZXRJbWFnZSh0ZW1wbGF0ZSksIHJlbGV2YW5jZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRlbXBsYXRlQ29udGV4dFR5cGUgZ2V0Q29udGV4dFR5cGUoSVRleHRWaWV3ZXIgdmlld2VyLCBJUmVnaW9uIHJlZ2lvbikgewotCQlUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUgPSBudWxsOwotCi0JCUNvbnRleHRUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpOwotCQlpZiAocmVnaXN0cnkgIT0gbnVsbCkKLQkJCXR5cGUgPSByZWdpc3RyeS5nZXRDb250ZXh0VHlwZShmQ29udGV4dFR5cGVJZCk7Ci0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKFRlbXBsYXRlIHRlbXBsYXRlKSB7Ci0JCS8vIGp1c3QgcmV0dXJuIHRoZSBzYW1lIGltYWdlIGZvciBub3cKLQkJcmV0dXJuIEhUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfVEVNUExBVEUpOwotCX0KLQotCXByaXZhdGUgQ29udGV4dFR5cGVSZWdpc3RyeSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGVtcGxhdGVbXSBnZXRUZW1wbGF0ZXMoU3RyaW5nIGNvbnRleHRUeXBlSWQpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGVzW10gPSBudWxsOwotCi0JCVRlbXBsYXRlU3RvcmUgc3RvcmUgPSBnZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWlmIChzdG9yZSAhPSBudWxsKQotCQkJdGVtcGxhdGVzID0gc3RvcmUuZ2V0VGVtcGxhdGVzKGNvbnRleHRUeXBlSWQpOwotCi0JCXJldHVybiB0ZW1wbGF0ZXM7Ci0JfQotCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCXJldHVybiBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlU3RvcmUoKTsKLQl9Ci0KLQl2b2lkIHNldENvbnRleHRUeXBlKFN0cmluZyBjb250ZXh0VHlwZUlkKSB7Ci0JCWZDb250ZXh0VHlwZUlkID0gY29udGV4dFR5cGVJZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDhhNTRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnRleHQuSUNTU1BhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNTU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Ob1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySFRNTCBleHRlbmRzIE5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvciB7Ci0JcHJvdGVjdGVkIHZvaWQgaW5pdFBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCkgewotCQkKLQkJc3VwZXIuaW5pdFBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCk7Ci0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGh0bWxQcm9jZXNzb3IgPSBuZXcgSFRNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKTsKLQkJYWRkUGFydGl0aW9uUHJvY2Vzc29yKElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQsIGh0bWxQcm9jZXNzb3IpOwotCQlhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoSUhUTUxQYXJ0aXRpb25zLkhUTUxfQ09NTUVOVCwgaHRtbFByb2Nlc3Nvcik7Ci0KLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IganNDb250ZW50QXNzaXN0UHJvY2Vzc29yID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwoKS5nZXRDb250ZW50QXNzaXN0YW50KG51bGwpLmdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoSUhUTUxQYXJ0aXRpb25zLlNDUklQVCk7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJSFRNTFBhcnRpdGlvbnMuU0NSSVBULCBqc0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IpOwotCi0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGNzc0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPSBuZXcgQ1NTQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQlhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoSUNTU1BhcnRpdGlvbnMuU1RZTEUsIGNzc0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmODk2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1JlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkRvY3VtZW50VGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVFeGNlcHRpb247Ci0KLS8qKgotICogSnVzdCBsaWtlIERvY3VtZW50VGVtcGxhdGVDb250ZXh0IGV4Y2VwdCBpZiBhbiBpbnNlcnQgb2Zmc2V0IGlzIHBhc3NlZCBpbiwKLSAqIGR1cmluZyBldmFsdWF0aW9uLCB0aGUgInByZWZpeCIgYmVmb3JlIHRoZSB0ZW1wbGF0ZSB3aWxsIGJlIGNoZWNrZWQgdG8gc2VlCi0gKiBpZiBpdCBtYXRjaGVzIHRoZSB0ZW1wbGF0ZSBuYW1lLiBJZiBzbywgb3ZlcndyaXRlIHRoZSB0ZW1wbGF0ZSBuYW1lLgotICogT3RoZXJ3aXNlLCBqdXN0IGluc2VydCB0aGUgdGVtcGxhdGUgYXQgdGhlIGluc2VydCBvZmZzZXQgbG9jYXRpb24gKGJ5IG5vdAotICogb3ZlcndyaXRpbmcgdGhlIHByZWZpeCB0ZXh0KQotICovCi1wdWJsaWMgY2xhc3MgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQgZXh0ZW5kcyBEb2N1bWVudFRlbXBsYXRlQ29udGV4dCB7Ci0JcHJpdmF0ZSBpbnQgZkluc2VydE9mZnNldCA9IC0xOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRvY3VtZW50IHRlbXBsYXRlIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IHR5cGUKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCB0aGlzIGNvbnRleHQgYXBwbGllcyB0bwotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGRvY3VtZW50IHJlZ2lvbgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRvY3VtZW50IHJlZ2lvbgotCSAqLwotCXB1YmxpYyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dChUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUsIElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQl0aGlzKHR5cGUsIGRvY3VtZW50LCBuZXcgUG9zaXRpb24ob2Zmc2V0LCBsZW5ndGgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZG9jdW1lbnQgdGVtcGxhdGUgY29udGV4dC4gVGhlIHN1cHBsaWVkIDxjb2RlPlBvc2l0aW9uPC9jb2RlPgotCSAqIHdpbGwgYmUgcXVlcmllZCB0byBjb21wdXRlIHRoZSA8Y29kZT5nZXRTdGFydDwvY29kZT4gYW5kCi0JICogPGNvZGU+Z2V0RW5kPC9jb2RlPiBtZXRob2RzLCB3aGljaCB3aWxsIHRoZXJlZm9yZSBhbnN3ZXIgdXBkYXRlZAotCSAqIHBvc2l0aW9uIGRhdGEgaWYgaXQgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgdHlwZQotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHRoaXMgY29udGV4dCBhcHBsaWVzIHRvCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgcG9zaXRpb24gZGVzY3JpYmluZyB0aGUgYXJlYSBvZiB0aGUgZG9jdW1lbnQgd2hpY2ggZm9ybXMKLQkgKiAgICAgICAgICAgIHRoZSB0ZW1wbGF0ZSBjb250ZXh0Ci0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dChUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUsIElEb2N1bWVudCBkb2N1bWVudCwgUG9zaXRpb24gcG9zaXRpb24pIHsKLQkJc3VwZXIodHlwZSwgZG9jdW1lbnQsIHBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZG9jdW1lbnQgdGVtcGxhdGUgY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgdHlwZQotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHRoaXMgY29udGV4dCBhcHBsaWVzIHRvCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uCi0JICogQHBhcmFtIGluc2VydE9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uIHdoZXJlIGluc2VydCB3YXMKLQkgKiAgICAgICAgICAgIG9yaWdpbmFsbHkgcmVxdWVzdGVkCi0JICovCi0JcHVibGljIFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0KFRlbXBsYXRlQ29udGV4dFR5cGUgdHlwZSwgSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgaW5zZXJ0T2Zmc2V0KSB7Ci0JCXRoaXModHlwZSwgZG9jdW1lbnQsIG5ldyBQb3NpdGlvbihvZmZzZXQsIGxlbmd0aCkpOwotCQlmSW5zZXJ0T2Zmc2V0ID0gaW5zZXJ0T2Zmc2V0OwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQjZXZhbHVhdGUob3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGUpCi0JICovCi0JcHVibGljIFRlbXBsYXRlQnVmZmVyIGV2YWx1YXRlKFRlbXBsYXRlIHRlbXBsYXRlKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIFRlbXBsYXRlRXhjZXB0aW9uIHsKLQkJVGVtcGxhdGVCdWZmZXIgYnVmZmVyID0gc3VwZXIuZXZhbHVhdGUodGVtcGxhdGUpOwotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCWlmIChmSW5zZXJ0T2Zmc2V0ID4gLTEgJiYgZkluc2VydE9mZnNldCA+IGdldFN0YXJ0KCkpIHsKLQkJCQlTdHJpbmcgcHJlZml4ID0gZ2V0RG9jdW1lbnQoKS5nZXQoZ2V0U3RhcnQoKSwgZkluc2VydE9mZnNldCAtIGdldFN0YXJ0KCkpOwotCQkJCWlmICghdGVtcGxhdGUuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgocHJlZml4KSkgewotCQkJCQkvLyBnZW5lcmF0ZSBhIG5ldyBidWZmZXIgdGhhdCBhY3R1YWxseSBjb250YWlucyB0aGUKLQkJCQkJLy8gdGV4dCB0aGF0IHdhcyBnb2luZyB0byBiZSBvdmVyd3JpdHRlbgotCQkJCQlidWZmZXIgPSBuZXcgVGVtcGxhdGVCdWZmZXIocHJlZml4ICsgYnVmZmVyLmdldFN0cmluZygpLCBidWZmZXIuZ2V0VmFyaWFibGVzKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVmZmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTk2MDdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxDb250ZW50TW9kZWxHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFhIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvciBleHRlbmRzIFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBYSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IgaW5zdGFuY2UgPSBudWxsOwotCi0JcHJpdmF0ZSBYSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVFbmRUYWcoU3RyaW5nIHRhZ05hbWUsIE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJaWYgKGVsZW1lbnREZWNsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChlbGVtZW50RGVjbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCWlmICgoKEJvb2xlYW4pIGVsZW1lbnREZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuSVNfSlNQKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQlpZiAoZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIG9tbWlzc2lvbiA9IChTdHJpbmcpIGVsZW1lbnREZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuT01JVF9UWVBFKTsKLQkJCQlpZiAob21taXNzaW9uLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORCkgfHwgb21taXNzaW9uLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9ERUZBVUxUKSB8fCBvbW1pc3Npb24uZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX01VU1QpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkKLQkJCXJldHVybjsKLQkJYnVmZmVyLmFwcGVuZCgiPC8iICsgdGFnTmFtZSArICI+Iik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCXJldHVybjsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRUYWdDbG9zZShOb2RlIHBhcmVudE5vZGUsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsKSB7Ci0JCVN0cmluZyBvdGhlciA9IGdldE90aGVyQ2xvc2UocGFyZW50Tm9kZSk7Ci0JCWlmIChvdGhlciAhPSBudWxsKQotCQkJcmV0dXJuIG90aGVyOwotCQlpZiAoZWxlbWVudERlY2wgPT0gbnVsbCkKLQkJCXJldHVybiAiPiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRU1QVFkgdGFnLCBkbyBhIHNlbGYtY2xvc2UKLQkJaWYgKGVsZW1lbnREZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpIHsKLQkJCS8vIGlmIGl0J3MgYSBKU1AgZWxlbWVudCwgZG9uJ3QgYWRkIHRoZSBzcGFjZSBzaW5jZSB0aGUgSlNQIGNvbnRhaW5lciBkb2Vzbid0L3Nob3VsZG4ndCBjYXJlCi0JCQlpZiAoZWxlbWVudERlY2wgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uICYmICgoKEJvb2xlYW4pIGVsZW1lbnREZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuSVNfSlNQKSkuYm9vbGVhblZhbHVlKCkpKQotCQkJCS8vIGlmIGl0J3Mgbm90IEpTUCwgY29uZm9ybSB0byBYSFRNTCBndWlkZWxpbmVzIGFuZCBhZGQgdGhlIHNwYWNlCi0JCQkJcmV0dXJuICIvPiI7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlyZXR1cm4gIiAvPiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBub3QgZGVmaW5lZCBhcyBFTVBUWSwgYnV0IHNob3VsZCBiZSB0cmVhdGVkIGFzIHN1Y2ggYW55d2F5Ci0JCWVsc2UgaWYgKGVsZW1lbnREZWNsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJU3RyaW5nIG9tbWlzc2lvbiA9IChTdHJpbmcpIGVsZW1lbnREZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuT01JVF9UWVBFKTsKLQkJCWlmIChvbW1pc3Npb24uZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EKSB8fCBvbW1pc3Npb24uZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX0RFRkFVTFQpIHx8IG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkRfTVVTVCkpIHsKLQkJCQlyZXR1cm4gIiAvPiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXJldHVybiAiPiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBYSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgWEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9IVE1MTm9kZUFjdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0hUTUxOb2RlQWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTljOTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0hUTUxOb2RlQWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb250ZW50QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0LkhUTUxGb3JtYXRQcm9jZXNzb3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NQ29udGVudEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5YTUxOb2RlQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSFRNTE5vZGVBY3Rpb25NYW5hZ2VyIGV4dGVuZHMgWE1MTm9kZUFjdGlvbk1hbmFnZXIgewotCXByb3RlY3RlZCBpbnQgZlRhZ0Nhc2U7Ci0JcHJvdGVjdGVkIGludCBmQXR0ckNhc2U7Ci0KLQlwdWJsaWMgSFRNTE5vZGVBY3Rpb25NYW5hZ2VyKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIobW9kZWwsIHZpZXdlcik7Ci0JCXVwZGF0ZUNhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiBuZWNjZXNzYXJ5LCBlbXBsb3kgYSBET01Db250ZW50QnVpbGRlciB0aGF0IHVuZGVyc3RhbmRzIGhvdyB0bwotCSAqIGNoYW5nZSB0aGUgY2FzZSBvZiBIVE1MIHRhZ3MgKGJ1dCBOT1QgdGFnbGliIGRlcml2ZWQgdGFncykuCi0JICovCi0JcHVibGljIERPTUNvbnRlbnRCdWlsZGVyIGNyZWF0ZURPTUNvbnRlbnRCdWlsZGVyKERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCURPTUNvbnRlbnRCdWlsZGVyIGJ1aWxkZXIgPSBudWxsOwotCQlTdHJpbmcgb25lID0gZk1vZGVsLmdldE1vZGVsSGFuZGxlcigpLmdldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKCk7Ci0JCVN0cmluZyBtb2RlbENvbnRlbnRUeXBlSWQgPSBmTW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCk7Ci0JCWlmIChvbmUgIT0gbW9kZWxDb250ZW50VHlwZUlkKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vdCBlcXVhbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKG1vZGVsQ29udGVudFR5cGVJZC5lcXVhbHMoQ29udGVudFR5cGVJZEZvckhUTUwuQ29udGVudFR5cGVJRF9IVE1MKSkKLQkJCWJ1aWxkZXIgPSBuZXcgSFRNTENvbnRlbnRCdWlsZGVyKGRvY3VtZW50KTsKLQkJZWxzZQotCQkJYnVpbGRlciA9IHN1cGVyLmNyZWF0ZURPTUNvbnRlbnRCdWlsZGVyKGRvY3VtZW50KTsKLQotCQlyZXR1cm4gYnVpbGRlcjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkSWdub3JlQ2FzZShDTU5vZGUgY21ub2RlKSB7Ci0JCWlmICghY21ub2RlLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICgoQm9vbGVhbikgY21ub2RlLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5IHRoZSBkaXNwbGF5ZWQgbWVudWl0ZW0gbGFiZWwgdG8gY2hhbmdlIHRoZSBjYXNlIG9mIEhUTUwgY2hpbGRyZW4KLQkgKiBidXQgbmVpdGhlciBYTUwgbm9yIHRhZ2xpYi1kZXJpdmVkIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoTm9kZSBwYXJlbnQsIENNTm9kZSBjbW5vZGUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIENNTm9kZSBjbW5vZGUgPSBhY3Rpb24uZ2V0Q01Ob2RlKCk7Ci0JCS8vIGRvbid0IGNoYW5nZSB0aGUgY2FzZSB1bmxlc3Mgd2UncmUgY2VydGFpbiBpdCBpcyBtZWFuaW5nbGVzcwotCQlpZiAoc2hvdWxkSWdub3JlQ2FzZShjbW5vZGUpKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGNtbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJaWYgKGZUYWdDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKQotCQkJCQluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQkJCWVsc2UgaWYgKGZUYWdDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCQluYW1lID0gbmFtZS50b1VwcGVyQ2FzZSgpOwotCQkJCS8vIGVsc2UgZG8gbm90aGluZwotCQkJfQotCQkJZWxzZSBpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCWlmIChmQXR0ckNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpCi0JCQkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJZWxzZSBpZiAoZkF0dHJDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCQluYW1lID0gbmFtZS50b1VwcGVyQ2FzZSgpOwotCQkJCS8vIGVsc2UgZG8gbm90aGluZwotCQkJfQotCQkJcmVzdWx0ID0gbmFtZTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IHN1cGVyLmdldExhYmVsKHBhcmVudCwgY21ub2RlKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQW5vdGhlciBIVE1MIHNwZWNpZmljIGRldGFpbC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYXNlKCkgewotCQlpZiAoZk1vZGVsICE9IG51bGwpIHsKLQkJCVN0cmluZyBtb2RlbENvbnRlbnRUeXBlSWQgPSBmTW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCk7Ci0JCQlpZiAobW9kZWxDb250ZW50VHlwZUlkICE9IG51bGwpIHsKLQkJCQlpZiAobW9kZWxDb250ZW50VHlwZUlkLmVxdWFscyhDb250ZW50VHlwZUlkRm9ySFRNTC5Db250ZW50VHlwZUlEX0hUTUwpKSB7Ci0JCQkJCVByZWZlcmVuY2VzIHByZWZzID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZlRhZ0Nhc2UgPSBwcmVmcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSk7Ci0JCQkJCWZBdHRyQ2FzZSA9IHByZWZzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmb3JtYXQoTm9kZSBuZXdFbGVtZW50LCBib29sZWFuIGRlZXApIHsKLQkJdHJ5IHsKLQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcgbW9kZWwgY2hhbmdlCi0JCQlmTW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCS8vIGZvcm1hdCBzZWxlY3RlZCBub2RlCi0JCQlJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBuZXcgSFRNTEZvcm1hdFByb2Nlc3NvckltcGwoKTsKLQkJCWZvcm1hdFByb2Nlc3Nvci5mb3JtYXROb2RlKG5ld0VsZW1lbnQpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBiaWcgbW9kZWwgY2hhbmdlCi0JCQlmTW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUZvckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTFkZGRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgZmFjdG9yeSB0byBjcmVhdGUgSkZhY2VOb2RlQWRhcHRlcnMuICBVc2UgdGhpcwotICogYWRhcHRlciBmYWN0b3J5IHdpdGggYSBKRmFjZUFkYXB0ZXJDb250ZW50UHJvdmlkZXIgdG8gZGlzcGxheQotICogRE9NIG5vZGVzIGluIGEgdHJlZS4KLSAqLwotcHVibGljIGNsYXNzIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTCBleHRlbmRzIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IHsKLQotCi0JcHVibGljIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTCgpIHsKLQkJdGhpcyhJSkZhY2VOb2RlQWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTChPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIG5vZGUpIHsKLQkJaWYgKHNpbmdsZXRvbkFkYXB0ZXIgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIHRoZSBKRmFjZU5vZGVBZGFwdGVyCi0JCQlzaW5nbGV0b25BZGFwdGVyID0gbmV3IEpGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MKHRoaXMpOwotCQkJaW5pdEFkYXB0ZXIoc2luZ2xldG9uQWRhcHRlciwgbm9kZSk7Ci0JCX0KLQkJcmV0dXJuIHNpbmdsZXRvbkFkYXB0ZXI7Ci0JfQotCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIG5ldyBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUZvckhUTUwoZ2V0QWRhcHRlcktleSgpLCBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRm9ySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzhiY2Y0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5IVE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQWRhcHRzIGEgRE9NIG5vZGUgdG8gYSBKRmFjZSB2aWV3ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBKRmFjZU5vZGVBZGFwdGVyRm9ySFRNTCBleHRlbmRzIEpGYWNlTm9kZUFkYXB0ZXIgewotCi0JcHJpdmF0ZSBJbWFnZSBjcmVhdGVIVE1MSW1hZ2UoU3RyaW5nIGltYWdlUmVzb3VyY2VOYW1lKSB7Ci0JCXJldHVybiBIVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShpbWFnZVJlc291cmNlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEpGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBKRmFjZU5vZGVBZGFwdGVyRm9ySFRNTChKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGNyZWF0ZUltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCi0JCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgidGFibGUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlID0gY3JlYXRlSFRNTEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUJMRSk7Ci0JCQllbHNlIGlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiYSIpKSAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2UgPSBjcmVhdGVIVE1MSW1hZ2UoSFRNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19BTkNIT1IpOwotCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImJvZHkiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlID0gY3JlYXRlSFRNTEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfQk9EWSk7Ci0JCQllbHNlIGlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiYnV0dG9uIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZSA9IGNyZWF0ZUhUTUxJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0JVVFRPTik7Ci0JCQllbHNlIGlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiZm9udCIpKSAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2UgPSBjcmVhdGVIVE1MSW1hZ2UoSFRNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19GT05UKTsKLQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJmb3JtIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZSA9IGNyZWF0ZUhUTUxJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0ZPUk0pOwotCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImh0bWwiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlID0gY3JlYXRlSFRNTEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfSFRNTCk7Ci0JCQllbHNlIGlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiaW1nIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZSA9IGNyZWF0ZUhUTUxJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0lNQUdFKTsKLQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJtYXAiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlID0gY3JlYXRlSFRNTEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfSU1BR0VfTUFQKTsKLQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJ0aXRsZSIpKSAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2UgPSBjcmVhdGVIVE1MSW1hZ2UoSFRNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19USVRMRSk7Ci0JCQllbHNlCi0JCQkJaW1hZ2UgPSBjcmVhdGVIVE1MSW1hZ2UoSFRNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBRyk7Ci0JCX0KLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWltYWdlID0gc3VwZXIuY3JlYXRlSW1hZ2Uobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9BYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQWJzdHJhY3REZXZpY2VQcm9maWxlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEyM2RmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9BYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIE5vdCBuZWVkZWQuIFNlZSBCVUcxMTgzNTkKLSAqLwotcHVibGljIGNsYXNzIEFic3RyYWN0RGV2aWNlUHJvZmlsZUVudHJ5IGltcGxlbWVudHMgRGV2aWNlUHJvZmlsZUVudHJ5IHsKLQotCXB1YmxpYyBBYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVudHJ5SWQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW50cnlOYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQWJzdHJhY3REZXZpY2VQcm9maWxlRW50cnlQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQWJzdHJhY3REZXZpY2VQcm9maWxlRW50cnlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjQwODRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0Fic3RyYWN0RGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBOb3QgbmVlZGVkLiAgU2VlIEJVRzExODM1OQotICovCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3REZXZpY2VQcm9maWxlRW50cnlQcm92aWRlciBpbXBsZW1lbnRzCi0JCURldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyIHsKLQotCXB1YmxpYyBBYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXREZXZpY2VQcm9maWxlRW50cmllcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Db250ZW50U2V0dGluZ3NSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWIyNzJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uQ2hhcnNldE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuQ29tYm9MaXN0OwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFRoaXMgY2xhc3Mgb25seSBjb250YWlucyBoZWxwZXIgbWV0aG9kcyB0aGF0IHlvdSBzaG91bGQKLSAqICAgICAgICAgICAgIGFjdHVhbGx5IGltcGxlbWVudCB5b3Vyc2VsZi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FID0gSFRNTFVJTWVzc2FnZXMuVUlfbm9uZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYXhMZW5ndGhTdHJpbmdJbkNoYXJhY3RlckNvZGVSZWdpc3RyeSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5KCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnlJbnRvKENvbWJvTGlzdCBjb21ibykgewotCQljb21iby5hZGQoTk9ORSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSByZWcgPSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJRW51bWVyYXRpb24gZSA9IHJlZy5nZXRFbnRyaWVzKCk7Ci0JCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlIVE1MRG9jdW1lbnRUeXBlRW50cnkgZW50cnkgPSAoSFRNTERvY3VtZW50VHlwZUVudHJ5KSBlLm5leHRFbGVtZW50KCk7Ci0JCQlTdHJpbmcgcHVibGljSWQgPSBlbnRyeS5nZXRQdWJsaWNJZCgpOwotCQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gZW50cnkuZ2V0RGlzcGxheU5hbWUoKTsKLQkJCWlmIChkaXNwbGF5TmFtZSAhPSBudWxsKSB7Ci0JCQkJY29tYm8uYWRkKGRpc3BsYXlOYW1lLCBwdWJsaWNJZCk7Ci0JCQkJaWYgKGRpc3BsYXlOYW1lLmxlbmd0aCgpID4gbWF4TGVuZ3RoU3RyaW5nSW5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkubGVuZ3RoKCkpCi0JCQkJCW1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5ID0gZGlzcGxheU5hbWU7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJY29tYm8uYWRkKHB1YmxpY0lkLCBwdWJsaWNJZCk7Ci0JCQlpZiAocHVibGljSWQubGVuZ3RoKCkgPiBtYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5sZW5ndGgoKSkKLQkJCQltYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSA9IHB1YmxpY0lkOwotCQkJaWYgKGVudHJ5LmdldFN5c3RlbUlkKCkgPT0gbnVsbCkKLQkJCQljb250aW51ZTsgLy8gaWYgSFRNTCBlbnRyeQotCQkJaWYgKGVudHJ5LmdldFN5c3RlbUlkKCkubGVuZ3RoKCkgPiBtYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5sZW5ndGgoKSkKLQkJCQltYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSA9IGVudHJ5LmdldFN5c3RlbUlkKCk7Ci0JCX0KLQotCQljb21iby5zb3J0QnlLZXkoMSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENTU01ldGFNb2RlbFJlZ2lzdHJ5SW50byhDb21ib0xpc3QgY29tYm8pIHsKLQkJY29tYm8uYWRkKE5PTkUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlDU1NQcm9maWxlUmVnaXN0cnkgcmVnID0gQ1NTUHJvZmlsZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCUl0ZXJhdG9yIGkgPSByZWcuZ2V0UHJvZmlsZXMoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDU1NQcm9maWxlIHByb2ZpbGUgPSAoQ1NTUHJvZmlsZSkgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgaWQgPSBwcm9maWxlLmdldFByb2ZpbGVJRCgpOwotCQkJU3RyaW5nIG5hbWUgPSBwcm9maWxlLmdldFByb2ZpbGVOYW1lKCk7Ci0JCQljb21iby5hZGQobmFtZSwgaWQpOwotCQl9Ci0JCWNvbWJvLnNvcnRCeUtleSgxKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGV2aWNlUHJvZmlsZVJlZ2lzdHJ5SW50byhDb21ib0xpc3QgY29tYm8pIHsKLQkJY29tYm8uYWRkKE5PTkUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlEZXZpY2VQcm9maWxlRW50cnlQcm92aWRlciByZWcgPSBEZXZpY2VQcm9maWxlRW50cnlQcm92aWRlckJ1aWxkZXIuZ2V0RW50cnlQcm92aWRlcigpOwotCQlpZiAocmVnID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJdGVyYXRvciBwcm9maWxlcyA9IHJlZy5nZXREZXZpY2VQcm9maWxlRW50cmllcygpOwotCQlpZiAocHJvZmlsZXMgPT0gbnVsbCkgewotCQkJcmVnLnJlbGVhc2UoKTsKLQkJCXJldHVybjsKLQkJfQotCQlEZXZpY2VQcm9maWxlRW50cnkgZW50cnk7Ci0JCXdoaWxlIChwcm9maWxlcy5oYXNOZXh0KCkpIHsKLQkJCWVudHJ5ID0gKERldmljZVByb2ZpbGVFbnRyeSkgcHJvZmlsZXMubmV4dCgpOwotCQkJY29tYm8uYWRkKGVudHJ5LmdldEVudHJ5TmFtZSgpLCBlbnRyeS5nZXRFbnRyeUlkKCkpOwotCQkJZW50cnkucmVsZWFzZSgpOwotCQl9Ci0JCXJlZy5yZWxlYXNlKCk7Ci0JCWNvbWJvLnNvcnRCeUtleSgxKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTeXN0ZW1JZEZyb20oU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmIChwdWJsaWNJZCA9PSBudWxsIHx8IHB1YmxpY0lkLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5IHJlZyA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlFbnVtZXJhdGlvbiBlID0gcmVnLmdldEVudHJpZXMoKTsKLQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeSA9IChIVE1MRG9jdW1lbnRUeXBlRW50cnkpIGUubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChlbnRyeS5nZXRQdWJsaWNJZCgpLmVxdWFscyhwdWJsaWNJZCkpCi0JCQkJcmV0dXJuIGVudHJ5LmdldFN5c3RlbUlkKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENvbnRlbnRUeXBlSW50byhDb21ib0xpc3QgY29tYm8pIHsKLQkJU3RyaW5nW10gdHlwZSA9IHsiIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkiYXBwbGljYXRpb24veGh0bWwreG1sIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkiYXBwbGljYXRpb24veG1sIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkidGV4dC9odG1sIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkidGV4dC94bWwiLH07IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nW10gZGlzcGxheU5hbWUgPSB7Tk9ORSwgImFwcGxpY2F0aW9uL3hodG1sK3htbCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCQkiYXBwbGljYXRpb24veG1sIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkidGV4dC9odG1sIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkidGV4dC94bWwiLH07IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZGlzcGxheU5hbWVbaV0gIT0gbnVsbCAmJiBkaXNwbGF5TmFtZVtpXS5sZW5ndGgoKSAhPSAwKQotCQkJCWNvbWJvLmFkZChkaXNwbGF5TmFtZVtpXSwgdHlwZVtpXSk7Ci0JCQllbHNlCi0JCQkJY29tYm8uYWRkKHR5cGVbaV0sIHR5cGVbaV0pOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2hhcmFjdGVyQ29kZUludG8oQ29tYm9MaXN0IGNvbWJvKSB7Ci0JCWNvbWJvLmFkZChOT05FLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG1heCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vIENvbW1vbkNoYXJzZXROYW1lcyBlbmNvZGluZyA9IG5ldyBDb21tb25DaGFyc2V0TmFtZXMoKTsKLQkJU3RyaW5nW10gY2hhckNvZGUgPSBDb21tb25DaGFyc2V0TmFtZXMuZ2V0Q29tbW9uQ2hhcnNldE5hbWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhckNvZGUubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBkaXNwbGF5TmFtZSA9IENvbW1vbkNoYXJzZXROYW1lcy5nZXREaXNwbGF5U3RyaW5nKGNoYXJDb2RlW2ldKTsKLQkJCWlmIChkaXNwbGF5TmFtZSAhPSBudWxsICYmIGRpc3BsYXlOYW1lLmxlbmd0aCgpICE9IDApIHsKLQkJCQljb21iby5hZGQoZGlzcGxheU5hbWUsIGNoYXJDb2RlW2ldKTsKLQkJCQlpbnQgbl9ieXRlID0gZGlzcGxheU5hbWUuZ2V0Qnl0ZXMoKS5sZW5ndGg7Ci0JCQkJaWYgKG1heC5nZXRCeXRlcygpLmxlbmd0aCA8IG5fYnl0ZSkKLQkJCQkJbWF4ID0gZGlzcGxheU5hbWU7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJY29tYm8uYWRkKGNoYXJDb2RlW2ldLCBjaGFyQ29kZVtpXSk7Ci0JCX0KLQkJLyoKLQkJICogY2hhckNvZGUgPSBlbmNvZGluZy5nZXRTdXBwb3J0ZWRKYXZhRW5jb2RpbmdzKCk7IGZvcihpbnQgaT0wO2k8Y2hhckNvZGUubGVuZ3RoO2krKyl7Ci0JCSAqIFN0cmluZyBkaXNwbGF5TmFtZSA9IGVuY29kaW5nLmdldERpc3BsYXlTdHJpbmcoY2hhckNvZGVbaV0pOyBpZgotCQkgKiAoZGlzcGxheU5hbWUhPW51bGwgJiYgZGlzcGxheU5hbWUubGVuZ3RoKCkhPTApCi0JCSAqIGNvbWJvLmFkZChkaXNwbGF5TmFtZSxjaGFyQ29kZVtpXSk7IGVsc2UKLQkJICogY29tYm8uYWRkKGNoYXJDb2RlW2ldLGNoYXJDb2RlW2ldKTsgfQotCQkgKi8KLQkJLy8gY29tYm8uc29ydEJ5S2V5KDEpOwotCQltYXhMZW5ndGhTdHJpbmdJbkNoYXJhY3RlckNvZGVSZWdpc3RyeSA9IG1heDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TGFuZ3VhZ2VJbnRvKENvbWJvTGlzdCBjb21ibykgewotCQlTdHJpbmdbXSBsYW5nID0geyIiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJqYXZhIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkiamF2YXNjcmlwdCIsfTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdbXSBkaXNwbGF5TmFtZSA9IHtOT05FLCAiamF2YSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCQkiamF2YXNjcmlwdCIsfTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGxhbmcubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkaXNwbGF5TmFtZVtpXSAhPSBudWxsICYmIGRpc3BsYXlOYW1lW2ldLmxlbmd0aCgpICE9IDApCi0JCQkJY29tYm8uYWRkKGRpc3BsYXlOYW1lW2ldLCBsYW5nW2ldKTsKLQkJCWVsc2UKLQkJCQljb21iby5hZGQobGFuZ1tpXSwgbGFuZ1tpXSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0RldmljZVByb2ZpbGVFbnRyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvRGV2aWNlUHJvZmlsZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MmNiMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvRGV2aWNlUHJvZmlsZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cyBkaXJlY3RseS4KLSAqIEluc3RlYWQsIHBsZWFzZSB1c2UgYWJzdHJhY3QgY2xhc3MoQWJzdHJhY3REZXZpY2VQcm9maWxlRW50cnkpIGluc3RlYWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBkZXByZWNhdGVkIE5vdCBuZWVkZWQuIFNlZSBCVUcxMTgzNTkKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXZpY2VQcm9maWxlRW50cnkgewotCXB1YmxpYyBTdHJpbmcgZ2V0RW50cnlJZCgpOwotCi0JcHVibGljIFN0cmluZyBnZXRFbnRyeU5hbWUoKTsKLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0RldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9EZXZpY2VQcm9maWxlRW50cnlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTYwNzc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0RldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cyBkaXJlY3RseS4KLSAqIEluc3RlYWQsIHBsZWFzZSB1c2UgYWJzdHJhY3QgY2xhc3MoQWJzdHJhY3REZXZpY2VQcm9maWxlRW50cnlQcm92aWRlcikKLSAqIGluc3RlYWQuCi0gKiA8L3A+Ci0gKiAKLSAqIEBkZXByZWNhdGVkIE5vdCBuZWVkZWQuIFNlZSBCVUcxMTgzNTkKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXZpY2VQcm9maWxlRW50cnlQcm92aWRlciB7Ci0JcHVibGljIEl0ZXJhdG9yIGdldERldmljZVByb2ZpbGVFbnRyaWVzKCk7Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9EZXZpY2VQcm9maWxlRW50cnlQcm92aWRlckJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0RldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjYzZWFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0RldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBOb3QgbmVlZGVkLiAgU2VlIEJVRzExODM1OQotICovCi1wdWJsaWMgY2xhc3MgRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXJCdWlsZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX1BMVUdJTklEID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLnVpIjsgIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUUgPSAiZGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXJCdWlsZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQlzdGF0aWMgcHVibGljIERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyIGdldEVudHJ5UHJvdmlkZXIoKSB7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoRVhURU5TSU9OX1BPSU5UX1BMVUdJTklELCBFWFRFTlNJT05fUE9JTlRfTkFNRSk7Ci0JCWlmIChwb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbnNbXSA9IHBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWlmICgoZXh0ZW5zaW9ucyAhPSBudWxsKSAmJiAoZXh0ZW5zaW9ucy5sZW5ndGggPiAwKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudHNbXSA9IGV4dGVuc2lvbnNbaV0uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJCWlmICgoZWxlbWVudHMgIT0gbnVsbCkgJiYgKGVsZW1lbnRzLmxlbmd0aCA+IDApKSB7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGVsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyA9IGVsZW1lbnRzW2pdOwotCQkJCQkJCWlmICgoY29uZmlnICE9IG51bGwpICYmIChjb25maWcuZ2V0TmFtZSgpLmVxdWFscyhFWFRFTlNJT05fUE9JTlRfTkFNRSkgPT0gdHJ1ZSkpIHsKLQkJCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoQVRUUl9DTEFTUyk7Ci0JCQkJCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlEZXZpY2VQcm9maWxlRW50cnlQcm92aWRlciBwcm92aWRlciA9IChEZXZpY2VQcm9maWxlRW50cnlQcm92aWRlciljb25maWcuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRSX0NMQVNTKTsKLQkJCQkJCQkJCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQkJCQkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvSFRNTENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvSFRNTENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTVmZGVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0hUTUxDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSUNvbnRlbnRTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpLkNvbWJvTGlzdE9uUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFVzZSBXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgaW5zdGVhZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSFRNTENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBleHRlbmRzIENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIgewotCi0KLQlwcml2YXRlIGZpbmFsIGludCBOX0RPQ1VNRU5UX1RZUEUgPSAwOwotCXByaXZhdGUgZmluYWwgaW50IE5fQ1NTX1BST0ZJTEUgPSAxOwotCXByaXZhdGUgZmluYWwgaW50IE5fVEFSR0VUX0RFVklDRSA9IDI7Ci0KLQlwcml2YXRlIFRleHQgcHVibGljSWRUZXh0OwotCXByaXZhdGUgVGV4dCBzeXN0ZW1JZFRleHQ7Ci0KLQlwdWJsaWMgSFRNTENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJbnVtYmVyT2ZDb21ibyA9IDM7Ci0JCW51bUNvbHMgPSAyOwotCQludW1Sb3dzID0gODsKLQkJY29tYm8gPSBuZXcgQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2Vbc3VwZXIubnVtYmVyT2ZDb21ib107Ci0KLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRG9jdW1lbnRUeXBlQ29tYm9Cb3goKSB7Ci0KLQkJLy8gY3JlYXRlIGRlc2NyaXB0aW9uIG9mIGltcGxlY2l0IERPQ1RZUEUJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHByb3BlcnR5UGFnZSwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlVJX0Rlc2NyaXB0aW9uX29mX3JvbGVfb2ZfZm9sbG93aW5nX0RPQ1RZUEUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSBudW1Db2xzOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIGNyZWF0ZSBjb21ib2JveAotCQlzdXBlci5jb21ib1tOX0RPQ1VNRU5UX1RZUEVdID0gc3VwZXIuY3JlYXRlQ29tYm9Cb3hPZihET0NVTUVOVF9MQUJFTCk7Ci0JCXN1cGVyLmNvbWJvW3RoaXMuTl9ET0NVTUVOVF9UWVBFXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJLy8gc2V0IGVudHJ5IGxpc3QgaW50byBDb21ibwotCQlDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5zZXRIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnlJbnRvKGNvbWJvW05fRE9DVU1FTlRfVFlQRV0pOwotCQkvLwljcmVhdGUgVGV4dEZpZWxkCi0JCWNyZWF0ZUlEVGV4dEZpZWxkKCk7Ci0JCWlmIChjb21ib1tOX0RPQ1VNRU5UX1RZUEVdLmdldEl0ZW1Db3VudCgpIDw9IDApCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIGluaXRWYWx1ZSA9IGNvbnRlbnRTZXR0aW5ncy5nZXRQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuSFRNTF9ET0NVTUVOVF9UWVBFKTsKLQkJLy8gd2hlbiBlaXRoZXIgLmNvbnRlbnRzZXR0aW5ncyBvciBlbGVtZW50IGRvZXNuJ3QgZXhpc3QKLQkJLy8gd2hlbiBhdHRyaWJ1dGUgZG9lc24ndCBleGlzdHMsZ2V0UHJvcGVydHkgcmV0dXJucyBlbXB0eSBzdHJpbmcuCi0JCWlmIChpbml0VmFsdWUgPT0gbnVsbCkKLQkJCWluaXRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vIHNldCBpbml0IHNlbGVjdGlvbkl0ZW0gaW4gQ29tYm8KLQkJc3VwZXIuc2V0U2VsZWN0aW9uSXRlbShjb21ib1tOX0RPQ1VNRU5UX1RZUEVdLCBpbml0VmFsdWUpOwotCQl0aGlzLnB1YmxpY0lkVGV4dC5zZXRUZXh0KGluaXRWYWx1ZSk7Ci0JCWlmICghaW5pdFZhbHVlLmVxdWFscygiIikpIHsvLyROT04tTkxTLTEkCi0JCQkvLyB0b3JvIEQyMTAyNjAKLQkJCWlmIChDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5nZXRTeXN0ZW1JZEZyb20oaW5pdFZhbHVlKSAhPSBudWxsKQotCQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoQ29udGVudFNldHRpbmdzUmVnaXN0cnkuZ2V0U3lzdGVtSWRGcm9tKGluaXRWYWx1ZSkpOwotCQkJZWxzZQotCQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlCi0JCQl0aGlzLnN5c3RlbUlkVGV4dC5zZXRUZXh0KCIiKTsvLyROT04tTkxTLTEkCi0KLQkJLy8gY3JlYXRlIHNlcGFyYXRvcgotCQlsYWJlbCA9IG5ldyBMYWJlbChwcm9wZXJ0eVBhZ2UsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IG51bUNvbHM7Ci0JCWRhdGEudmVydGljYWxTcGFuID0gODsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDU1NDb21ib0JveCgpIHsKLQkJc3VwZXIuY29tYm9bTl9DU1NfUFJPRklMRV0gPSBzdXBlci5jcmVhdGVDb21ib0JveE9mKENTU19MQUJFTCk7Ci0KLQkJQ29udGVudFNldHRpbmdzUmVnaXN0cnkuc2V0Q1NTTWV0YU1vZGVsUmVnaXN0cnlJbnRvKGNvbWJvW05fQ1NTX1BST0ZJTEVdKTsKLQkJaWYgKGNvbWJvW05fQ1NTX1BST0ZJTEVdLmdldEl0ZW1Db3VudCgpIDw9IDApCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBpbml0VmFsdWUgPSBjb250ZW50U2V0dGluZ3MuZ2V0UHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkNTU19QUk9GSUxFKTsKLQkJLy8gd2hlbiBlaXRoZXIgLmNvbnRlbnRzZXR0aW5ncyBvciBlbGVtZW50IGRvZXNuJ3QgZXhpc3QKLQkJLy8gd2hlbiBhdHRyaWJ1dGUgZG9lc24ndCBleGlzdHMsZ2V0UHJvcGVydHkgcmV0dXJucyBlbXB0eSBzdHJpbmcuCi0JCWlmIChpbml0VmFsdWUgPT0gbnVsbCkKLQkJCWluaXRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vIHNldCBpbml0IHNlbGVjdGlvbkl0ZW0gaW4gQ29tYm8KLQkJc3VwZXIuc2V0U2VsZWN0aW9uSXRlbShjb21ib1tOX0NTU19QUk9GSUxFXSwgaW5pdFZhbHVlKTsKLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGV2aWNlQ29tYm9Cb3goKSB7Ci0JCXN1cGVyLmNvbWJvW05fVEFSR0VUX0RFVklDRV0gPSBzdXBlci5jcmVhdGVDb21ib0JveE9mKERFVklDRV9MQUJFTCk7Ci0KLQkJQ29udGVudFNldHRpbmdzUmVnaXN0cnkuc2V0RGV2aWNlUHJvZmlsZVJlZ2lzdHJ5SW50byhjb21ib1tOX1RBUkdFVF9ERVZJQ0VdKTsKLQkJaWYgKGNvbWJvW05fVEFSR0VUX0RFVklDRV0uZ2V0SXRlbUNvdW50KCkgPD0gMCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIGluaXRWYWx1ZSA9IGNvbnRlbnRTZXR0aW5ncy5nZXRQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuREVWSUNFX1BST0ZJTEUpOwotCQkvLyB3aGVuIGVpdGhlciAuY29udGVudHNldHRpbmdzIG9yIGVsZW1lbnQgZG9lc24ndCBleGlzdAotCQkvLyB3aGVuIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0cyxnZXRQcm9wZXJ0eSByZXR1cm5zIGVtcHR5IHN0cmluZy4KLQkJaWYgKGluaXRWYWx1ZSA9PSBudWxsKQotCQkJaW5pdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc2V0IGluaXQgc2VsZWN0aW9uSXRlbSBpbiBDb21ibwotCQlzdXBlci5zZXRTZWxlY3Rpb25JdGVtKGNvbWJvW05fVEFSR0VUX0RFVklDRV0sIGluaXRWYWx1ZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTZXR0aW5nc1BhZ2VHVUkoKSB7Ci0JCWludCB0eXBlID0gKChJUmVzb3VyY2UpIGdldEVsZW1lbnQoKSkuZ2V0VHlwZSgpOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJCS8vCWNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZShwcm9wZXJ0eVBhZ2UsbnVtQ29scyxudW1Sb3dzKTsKLQkJCQljcmVhdGVEb2N1bWVudFR5cGVDb21ib0JveCgpOwotCQkJCWNyZWF0ZUNTU0NvbWJvQm94KCk7Ci0JCQkJY3JlYXRlRGV2aWNlQ29tYm9Cb3goKTsKLQkJCQljb21wdXRlTWF4V2lkdGhIaW50KCk7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcm9wZXJ0eVBhZ2UsIElIZWxwQ29udGV4dElkcy5XRUJfQ09OVEVOVF9TRVRUSU5HU19IRUxQSUQpOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0IDoKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiSFRNTENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBpcyBpbnN0YW50aWF0ZWQgYnkgcmVzb3VyY2UgZXhjZXB0IEZJTEUiKTsvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCX0KLQotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBwdXRTZWxlY3RlZFByb3BlcnR5SW50byhNYXAgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlSW5Db21ibywgaW50IGluZGV4KSB7Ci0KLQkJc3dpdGNoIChpbmRleCkgewotCQkJY2FzZSBOX0RPQ1VNRU5UX1RZUEUgOgotCQkJCS8vIGRvYyB0eXBlCi0JCQkJcHJvcGVydGllcy5wdXQoSUNvbnRlbnRTZXR0aW5ncy5IVE1MX0RPQ1VNRU5UX1RZUEUsIHZhbHVlSW5Db21ibyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5fQ1NTX1BST0ZJTEUgOgotCQkJCS8vIGNzcwotCQkJCXByb3BlcnRpZXMucHV0KElDb250ZW50U2V0dGluZ3MuQ1NTX1BST0ZJTEUsIHZhbHVlSW5Db21ibyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5fVEFSR0VUX0RFVklDRSA6Ci0JCQkJLy8gZGV2aWNlCi0JCQkJcHJvcGVydGllcy5wdXQoSUNvbnRlbnRTZXR0aW5ncy5ERVZJQ0VfUFJPRklMRSwgdmFsdWVJbkNvbWJvKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiSW5kZXggaXMgb3V0IG9mIHJhbmdlIGluIHB1dFNlbGVjdGVkUHJvcGVydHlJbnRvKCkgaW4gY2xhc3MgSFRNTENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSIpOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlTm9uZVByb3BlcnR5KGludCBpbmRleCkgewotCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQljYXNlIE5fRE9DVU1FTlRfVFlQRSA6Ci0JCQkJLy8gZG9jIHR5cGUKLQkJCQljb250ZW50U2V0dGluZ3MuZGVsZXRlUHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkhUTUxfRE9DVU1FTlRfVFlQRSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5fQ1NTX1BST0ZJTEUgOgotCQkJCS8vIGNzcwotCQkJCWNvbnRlbnRTZXR0aW5ncy5kZWxldGVQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuQ1NTX1BST0ZJTEUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBOX1RBUkdFVF9ERVZJQ0UgOgotCQkJCS8vIGRldmljZQotCQkJCWNvbnRlbnRTZXR0aW5ncy5kZWxldGVQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuREVWSUNFX1BST0ZJTEUpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbmRleCBpcyBvdXQgb2YgcmFuZ2UgaW4gZGVsZXRlTm9uZVByb3BlcnR5KCkgaW4gY2xhc3MgSFRNTENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSIpOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVJRFRleHRGaWVsZCgpIHsKLQkJLy8gcHVibGljIElEICYgU3lzdGVtIElECi0JCUxhYmVsIHB1YmxpY0xhYmVsID0gbmV3IExhYmVsKHN1cGVyLnByb3BlcnR5UGFnZSwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQlwdWJsaWNMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlwdWJsaWNMYWJlbC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlVJX1B1YmxpY19JRCk7Ci0JCXB1YmxpY0lkVGV4dCA9IG5ldyBUZXh0KHN1cGVyLnByb3BlcnR5UGFnZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0KLQkJcHVibGljSWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJTGFiZWwgc3lzdGVtTGFiZWwgPSBuZXcgTGFiZWwoc3VwZXIucHJvcGVydHlQYWdlLCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCXN5c3RlbUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN5c3RlbUxhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfU3lzdGVtX0lEKTsKLQkJc3lzdGVtSWRUZXh0ID0gbmV3IFRleHQoc3VwZXIucHJvcGVydHlQYWdlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQotCQlzeXN0ZW1JZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQotCi0JcHJpdmF0ZSB2b2lkIGNvbXB1dGVNYXhXaWR0aEhpbnQoKSB7Ci0JCS8vIG1heExlbmd0aFN0cmluZyB3YXMgc2V0IHdoZW4gSFRNTERvY3VtZW50VHlwZUVudHJ5IHdhcyBzZXQgaW4gY2xhc3MgQ29udGVudFNldHRpbmdzUmVnaXN0cnkuCi0JCVN0cmluZyBtYXhMZW5ndGhTdHJpbmcgPSBDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5tYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeTsKLQkJU3RyaW5nIGJhY2t1cCA9IHRoaXMuc3lzdGVtSWRUZXh0LmdldFRleHQoKTsKLQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dChtYXhMZW5ndGhTdHJpbmcpOwotCQlpbnQgbWF4V2lkdGhIaW50ID0gdGhpcy5zeXN0ZW1JZFRleHQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotCQl0aGlzLnN5c3RlbUlkVGV4dC5zZXRUZXh0KGJhY2t1cCk7Ci0KLQkJaWYgKHRoaXMuY29tYm9bdGhpcy5OX0RPQ1VNRU5UX1RZUEVdLmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgdGhpcy5jb21ib1t0aGlzLk5fRE9DVU1FTlRfVFlQRV0uZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBtYXhXaWR0aEhpbnQ7Ci0JCWlmICh0aGlzLnB1YmxpY0lkVGV4dC5nZXRMYXlvdXREYXRhKCkgIT0gbnVsbCkKLQkJCSgoR3JpZERhdGEpIHRoaXMucHVibGljSWRUZXh0LmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCQlpZiAodGhpcy5zeXN0ZW1JZFRleHQuZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSB0aGlzLnN5c3RlbUlkVGV4dC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQkJaWYgKHRoaXMuY29tYm9bdGhpcy5OX0NTU19QUk9GSUxFXS5nZXRMYXlvdXREYXRhKCkgIT0gbnVsbCkKLQkJCSgoR3JpZERhdGEpIHRoaXMuY29tYm9bdGhpcy5OX0NTU19QUk9GSUxFXS5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQkJaWYgKHRoaXMuY29tYm9bdGhpcy5OX1RBUkdFVF9ERVZJQ0VdLmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgdGhpcy5jb21ib1t0aGlzLk5fVEFSR0VUX0RFVklDRV0uZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBtYXhXaWR0aEhpbnQ7Ci0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCVdpZGdldCBzb3VyY2UgPSBldmVudC53aWRnZXQ7Ci0KLQkJaWYgKHRoaXMuY29tYm9bdGhpcy5OX0RPQ1VNRU5UX1RZUEVdLmVxdWFscyhzb3VyY2UpKSB7Ci0JCQlDb21ib0xpc3RPblByb3BlcnR5UGFnZSBjb21ibyA9IHRoaXMuY29tYm9bdGhpcy5OX0RPQ1VNRU5UX1RZUEVdOwotCQkJaWYgKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPCAwKQotCQkJCXJldHVybjsKLQkJCWlmICghY29tYm8uZ2V0U2VsZWN0ZWRWYWx1ZSgpLmVxdWFscygiIikpIHsvLyROT04tTkxTLTEkCi0JCQkJdGhpcy5wdWJsaWNJZFRleHQuc2V0VGV4dChjb21iby5nZXRTZWxlY3RlZFZhbHVlKCkpOwotCQkJCWlmIChDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5nZXRTeXN0ZW1JZEZyb20oY29tYm8uZ2V0U2VsZWN0ZWRWYWx1ZSgpKSAhPSBudWxsKQotCQkJCQl0aGlzLnN5c3RlbUlkVGV4dC5zZXRUZXh0KENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LmdldFN5c3RlbUlkRnJvbShjb21iby5nZXRTZWxlY3RlZFZhbHVlKCkpKTsKLQkJCQllbHNlCi0JCQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMucHVibGljSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLnN5c3RlbUlkVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQl0aGlzLnB1YmxpY0lkVGV4dC5zZXRUZXh0KCIiKTsvLyROT04tTkxTLTEkCi0JCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Qcm9qZWN0Q29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Qcm9qZWN0Q29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzM2M2MTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvUHJvamVjdENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5JQ29udGVudFNldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5Db250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2U7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgVXNlIFByb2plY3RIVE1MQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGluc3RlYWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFByb2plY3RDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyIHsKLQotCi0JcHJpdmF0ZSBmaW5hbCBpbnQgTl9ET0NVTUVOVF9UWVBFID0gMDsKLQlwcml2YXRlIGZpbmFsIGludCBOX0NTU19QUk9GSUxFID0gMTsKLQlwcml2YXRlIGZpbmFsIGludCBOX1RBUkdFVF9ERVZJQ0UgPSAyOwotCi0JcHJpdmF0ZSBUZXh0IHB1YmxpY0lkVGV4dDsKLQlwcml2YXRlIFRleHQgc3lzdGVtSWRUZXh0OwotCi0JcHVibGljIFByb2plY3RDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCW51bWJlck9mQ29tYm8gPSAzOwotCQludW1Db2xzID0gMjsKLQkJbnVtUm93cyA9IDg7Ci0JCWNvbWJvID0gbmV3IENvbWJvTGlzdE9uUHJvcGVydHlQYWdlW3N1cGVyLm51bWJlck9mQ29tYm9dOwotCi0JfQotCi0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURvY3VtZW50VHlwZUNvbWJvQm94KCkgewotCi0JCS8vIGNyZWF0ZSBkZXNjcmlwdGlvbiBvZiBpbXBsZWNpdCBET0NUWVBFCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHByb3BlcnR5UGFnZSwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlVJX0Rlc2NyaXB0aW9uX29mX3JvbGVfb2ZfZm9sbG93aW5nX0RPQ1RZUEUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSBudW1Db2xzOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIGNyZWF0ZSBjb21ib2JveAotCQlzdXBlci5jb21ib1tOX0RPQ1VNRU5UX1RZUEVdID0gc3VwZXIuY3JlYXRlQ29tYm9Cb3hPZihET0NVTUVOVF9MQUJFTCk7Ci0JCXN1cGVyLmNvbWJvW3RoaXMuTl9ET0NVTUVOVF9UWVBFXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJLy8gc2V0IGVudHJ5IGxpc3QgaW50byBDb21ibwotCQlDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5zZXRIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnlJbnRvKGNvbWJvW05fRE9DVU1FTlRfVFlQRV0pOwotCQkvLyBjcmVhdGUgVGV4dEZpZWxkCi0JCWNyZWF0ZUlEVGV4dEZpZWxkKCk7Ci0JCWlmIChjb21ib1tOX0RPQ1VNRU5UX1RZUEVdLmdldEl0ZW1Db3VudCgpIDw9IDApCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIGluaXRWYWx1ZSA9IGNvbnRlbnRTZXR0aW5ncy5nZXRQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuSFRNTF9ET0NVTUVOVF9UWVBFKTsKLQkJLy8gd2hlbiBlaXRoZXIgLmNvbnRlbnRzZXR0aW5ncyBvciBlbGVtZW50IGRvZXNuJ3QgZXhpc3QKLQkJLy8gd2hlbiBhdHRyaWJ1dGUgZG9lc24ndCBleGlzdHMsZ2V0UHJvcGVydHkgcmV0dXJucyBlbXB0eSBzdHJpbmcuCi0JCWlmIChpbml0VmFsdWUgPT0gbnVsbCkKLQkJCWluaXRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vIHNldCBpbml0IHNlbGVjdGlvbkl0ZW0gaW4gQ29tYm8KLQkJc3VwZXIuc2V0U2VsZWN0aW9uSXRlbShjb21ib1tOX0RPQ1VNRU5UX1RZUEVdLCBpbml0VmFsdWUpOwotCQl0aGlzLnB1YmxpY0lkVGV4dC5zZXRUZXh0KGluaXRWYWx1ZSk7Ci0JCWlmICghaW5pdFZhbHVlLmVxdWFscygiIikpIHsvLyROT04tTkxTLTEkCi0JCQkvLyB0b3JvIEQyMTAyNjAKLQkJCWlmIChDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5nZXRTeXN0ZW1JZEZyb20oaW5pdFZhbHVlKSAhPSBudWxsKQotCQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoQ29udGVudFNldHRpbmdzUmVnaXN0cnkuZ2V0U3lzdGVtSWRGcm9tKGluaXRWYWx1ZSkpOwotCQkJZWxzZQotCQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlCi0JCQl0aGlzLnN5c3RlbUlkVGV4dC5zZXRUZXh0KCIiKTsvLyROT04tTkxTLTEkCi0KLQkJLy8gY3JlYXRlIHNlcGFyYXRvcgotCQlsYWJlbCA9IG5ldyBMYWJlbChwcm9wZXJ0eVBhZ2UsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IG51bUNvbHM7Ci0JCWRhdGEudmVydGljYWxTcGFuID0gODsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDU1NDb21ib0JveCgpIHsKLQkJc3VwZXIuY29tYm9bTl9DU1NfUFJPRklMRV0gPSBzdXBlci5jcmVhdGVDb21ib0JveE9mKENTU19MQUJFTCk7Ci0KLQkJQ29udGVudFNldHRpbmdzUmVnaXN0cnkuc2V0Q1NTTWV0YU1vZGVsUmVnaXN0cnlJbnRvKGNvbWJvW05fQ1NTX1BST0ZJTEVdKTsKLQkJaWYgKGNvbWJvW05fQ1NTX1BST0ZJTEVdLmdldEl0ZW1Db3VudCgpIDw9IDApCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBpbml0VmFsdWUgPSBjb250ZW50U2V0dGluZ3MuZ2V0UHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkNTU19QUk9GSUxFKTsKLQkJLy8gd2hlbiBlaXRoZXIgLmNvbnRlbnRzZXR0aW5ncyBvciBlbGVtZW50IGRvZXNuJ3QgZXhpc3QKLQkJLy8gd2hlbiBhdHRyaWJ1dGUgZG9lc24ndCBleGlzdHMsZ2V0UHJvcGVydHkgcmV0dXJucyBlbXB0eSBzdHJpbmcuCi0JCWlmIChpbml0VmFsdWUgPT0gbnVsbCkKLQkJCWluaXRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vIHNldCBpbml0IHNlbGVjdGlvbkl0ZW0gaW4gQ29tYm8KLQkJc3VwZXIuc2V0U2VsZWN0aW9uSXRlbShjb21ib1tOX0NTU19QUk9GSUxFXSwgaW5pdFZhbHVlKTsKLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGV2aWNlQ29tYm9Cb3goKSB7Ci0JCXN1cGVyLmNvbWJvW05fVEFSR0VUX0RFVklDRV0gPSBzdXBlci5jcmVhdGVDb21ib0JveE9mKERFVklDRV9MQUJFTCk7Ci0KLQkJQ29udGVudFNldHRpbmdzUmVnaXN0cnkuc2V0RGV2aWNlUHJvZmlsZVJlZ2lzdHJ5SW50byhjb21ib1tOX1RBUkdFVF9ERVZJQ0VdKTsKLQkJaWYgKGNvbWJvW05fVEFSR0VUX0RFVklDRV0uZ2V0SXRlbUNvdW50KCkgPD0gMCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIGluaXRWYWx1ZSA9IGNvbnRlbnRTZXR0aW5ncy5nZXRQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuREVWSUNFX1BST0ZJTEUpOwotCQkvLyB3aGVuIGVpdGhlciAuY29udGVudHNldHRpbmdzIG9yIGVsZW1lbnQgZG9lc24ndCBleGlzdAotCQkvLyB3aGVuIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0cyxnZXRQcm9wZXJ0eSByZXR1cm5zIGVtcHR5IHN0cmluZy4KLQkJaWYgKGluaXRWYWx1ZSA9PSBudWxsKQotCQkJaW5pdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc2V0IGluaXQgc2VsZWN0aW9uSXRlbSBpbiBDb21ibwotCQlzdXBlci5zZXRTZWxlY3Rpb25JdGVtKGNvbWJvW05fVEFSR0VUX0RFVklDRV0sIGluaXRWYWx1ZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTZXR0aW5nc1BhZ2VHVUkoKSB7Ci0JCWludCB0eXBlID0gKChJUmVzb3VyY2UpIGdldEVsZW1lbnQoKSkuZ2V0VHlwZSgpOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgotCQkJCS8vIGNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZShwcm9wZXJ0eVBhZ2UsbnVtQ29scyxudW1Sb3dzKTsKLQkJCQljcmVhdGVEb2N1bWVudFR5cGVDb21ib0JveCgpOwotCQkJCWNyZWF0ZUNTU0NvbWJvQm94KCk7Ci0JCQkJY3JlYXRlRGV2aWNlQ29tYm9Cb3goKTsKLQkJCQljb21wdXRlTWF4V2lkdGhIaW50KCk7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcm9wZXJ0eVBhZ2UsIElIZWxwQ29udGV4dElkcy5XRUJfQ09OVEVOVF9TRVRUSU5HU19IRUxQSUQpOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0IDoKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiUHJvamVjdENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBpcyBpbnN0YW50aWF0ZWQgYnkgcmVzb3VyY2UgZXhjZXB0IFBST0pFQ1QiKTsvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCX0KLQotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBwdXRTZWxlY3RlZFByb3BlcnR5SW50byhNYXAgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlSW5Db21ibywgaW50IGluZGV4KSB7Ci0KLQkJc3dpdGNoIChpbmRleCkgewotCQkJY2FzZSBOX0RPQ1VNRU5UX1RZUEUgOgotCQkJCS8vIGRvYyB0eXBlCi0JCQkJcHJvcGVydGllcy5wdXQoSUNvbnRlbnRTZXR0aW5ncy5IVE1MX0RPQ1VNRU5UX1RZUEUsIHZhbHVlSW5Db21ibyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5fQ1NTX1BST0ZJTEUgOgotCQkJCS8vIGNzcwotCQkJCXByb3BlcnRpZXMucHV0KElDb250ZW50U2V0dGluZ3MuQ1NTX1BST0ZJTEUsIHZhbHVlSW5Db21ibyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5fVEFSR0VUX0RFVklDRSA6Ci0JCQkJLy8gZGV2aWNlCi0JCQkJcHJvcGVydGllcy5wdXQoSUNvbnRlbnRTZXR0aW5ncy5ERVZJQ0VfUFJPRklMRSwgdmFsdWVJbkNvbWJvKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiSW5kZXggaXMgb3V0IG9mIHJhbmdlIGluIHB1dFNlbGVjdGVkUHJvcGVydHlJbnRvKCkgaW4gY2xhc3MgUHJvamVjdENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSIpOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlTm9uZVByb3BlcnR5KGludCBpbmRleCkgewotCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQljYXNlIE5fRE9DVU1FTlRfVFlQRSA6Ci0JCQkJLy8gZG9jIHR5cGUKLQkJCQljb250ZW50U2V0dGluZ3MuZGVsZXRlUHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkhUTUxfRE9DVU1FTlRfVFlQRSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgTl9DU1NfUFJPRklMRSA6Ci0JCQkJLy8gY3NzCi0JCQkJY29udGVudFNldHRpbmdzLmRlbGV0ZVByb3BlcnR5KChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgSUNvbnRlbnRTZXR0aW5ncy5DU1NfUFJPRklMRSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgTl9UQVJHRVRfREVWSUNFIDoKLQkJCQkvLyBkZXZpY2UKLQkJCQljb250ZW50U2V0dGluZ3MuZGVsZXRlUHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkRFVklDRV9QUk9GSUxFKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdCA6Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbmRleCBpcyBvdXQgb2YgcmFuZ2UgaW4gZGVsZXRlTm9uZVByb3BlcnR5KCkgaW4gY2xhc3MgUHJvamVjdENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSIpOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVJRFRleHRGaWVsZCgpIHsKLQkJLy8gcHVibGljIElEICYgU3lzdGVtIElECi0JCUxhYmVsIHB1YmxpY0xhYmVsID0gbmV3IExhYmVsKHN1cGVyLnByb3BlcnR5UGFnZSwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQlwdWJsaWNMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlwdWJsaWNMYWJlbC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlVJX1B1YmxpY19JRCk7Ci0JCXB1YmxpY0lkVGV4dCA9IG5ldyBUZXh0KHN1cGVyLnByb3BlcnR5UGFnZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0KLQkJcHVibGljSWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJTGFiZWwgc3lzdGVtTGFiZWwgPSBuZXcgTGFiZWwoc3VwZXIucHJvcGVydHlQYWdlLCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCXN5c3RlbUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN5c3RlbUxhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfU3lzdGVtX0lEKTsKLQkJc3lzdGVtSWRUZXh0ID0gbmV3IFRleHQoc3VwZXIucHJvcGVydHlQYWdlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQotCQlzeXN0ZW1JZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQotCi0JcHJpdmF0ZSB2b2lkIGNvbXB1dGVNYXhXaWR0aEhpbnQoKSB7Ci0JCS8vIG1heExlbmd0aFN0cmluZyB3YXMgc2V0IHdoZW4gSFRNTERvY3VtZW50VHlwZUVudHJ5IHdhcyBzZXQgaW4gY2xhc3MKLQkJLy8gQ29udGVudFNldHRpbmdzUmVnaXN0cnkuCi0JCVN0cmluZyBtYXhMZW5ndGhTdHJpbmcgPSBDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5tYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeTsKLQkJU3RyaW5nIGJhY2t1cCA9IHRoaXMuc3lzdGVtSWRUZXh0LmdldFRleHQoKTsKLQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dChtYXhMZW5ndGhTdHJpbmcpOwotCQlpbnQgbWF4V2lkdGhIaW50ID0gdGhpcy5zeXN0ZW1JZFRleHQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS54OwotCQl0aGlzLnN5c3RlbUlkVGV4dC5zZXRUZXh0KGJhY2t1cCk7Ci0KLQkJaWYgKHRoaXMuY29tYm9bdGhpcy5OX0RPQ1VNRU5UX1RZUEVdLmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgdGhpcy5jb21ib1t0aGlzLk5fRE9DVU1FTlRfVFlQRV0uZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBtYXhXaWR0aEhpbnQ7Ci0JCWlmICh0aGlzLnB1YmxpY0lkVGV4dC5nZXRMYXlvdXREYXRhKCkgIT0gbnVsbCkKLQkJCSgoR3JpZERhdGEpIHRoaXMucHVibGljSWRUZXh0LmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCQlpZiAodGhpcy5zeXN0ZW1JZFRleHQuZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSB0aGlzLnN5c3RlbUlkVGV4dC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQkJaWYgKHRoaXMuY29tYm9bdGhpcy5OX0NTU19QUk9GSUxFXS5nZXRMYXlvdXREYXRhKCkgIT0gbnVsbCkKLQkJCSgoR3JpZERhdGEpIHRoaXMuY29tYm9bdGhpcy5OX0NTU19QUk9GSUxFXS5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQkJaWYgKHRoaXMuY29tYm9bdGhpcy5OX1RBUkdFVF9ERVZJQ0VdLmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgdGhpcy5jb21ib1t0aGlzLk5fVEFSR0VUX0RFVklDRV0uZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBtYXhXaWR0aEhpbnQ7Ci0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCVdpZGdldCBzb3VyY2UgPSBldmVudC53aWRnZXQ7Ci0KLQkJaWYgKHRoaXMuY29tYm9bdGhpcy5OX0RPQ1VNRU5UX1RZUEVdLmVxdWFscyhzb3VyY2UpKSB7Ci0JCQlDb21ib0xpc3RPblByb3BlcnR5UGFnZSBjb21ibyA9IHRoaXMuY29tYm9bdGhpcy5OX0RPQ1VNRU5UX1RZUEVdOwotCQkJaWYgKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPCAwKQotCQkJCXJldHVybjsKLQkJCWlmICghY29tYm8uZ2V0U2VsZWN0ZWRWYWx1ZSgpLmVxdWFscygiIikpIHsvLyROT04tTkxTLTEkCi0JCQkJdGhpcy5wdWJsaWNJZFRleHQuc2V0VGV4dChjb21iby5nZXRTZWxlY3RlZFZhbHVlKCkpOwotCQkJCWlmIChDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5nZXRTeXN0ZW1JZEZyb20oY29tYm8uZ2V0U2VsZWN0ZWRWYWx1ZSgpKSAhPSBudWxsKQotCQkJCQl0aGlzLnN5c3RlbUlkVGV4dC5zZXRUZXh0KENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LmdldFN5c3RlbUlkRnJvbShjb21iby5nZXRTZWxlY3RlZFZhbHVlKCkpKTsKLQkJCQllbHNlCi0JCQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMucHVibGljSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLnN5c3RlbUlkVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQl0aGlzLnB1YmxpY0lkVGV4dC5zZXRUZXh0KCIiKTsvLyROT04tTkxTLTEkCi0JCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1Byb2plY3RXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1Byb2plY3RXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNjYmU0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Qcm9qZWN0V2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0V2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGV4dGVuZHMgV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIHsKLQlwdWJsaWMgUHJvamVjdFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSgpIHsKLQkJc2V0RGVzY3JpcHRpb24oSFRNTFVJTWVzc2FnZXMuUHJvamVjdFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9XZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1dlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWY4OGYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1dlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgU2NobmVpZGVyLCBkYXZpZC5zY2huZWlkZXJAdW5pc3lzLmNvbSAtIFsxNDI1MDBdIFdUUCBwcm9wZXJ0aWVzIHBhZ2VzIGZvbnRzIGRvbid0IGZvbGxvdyBFY2xpcHNlIHByZWZlcmVuY2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5DU1NDb250ZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5IVE1MQ29udGVudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfTk9ORSA9IEhUTUxVSU1lc3NhZ2VzLlVJX25vbmU7Ci0JcHJpdmF0ZSBTdHJpbmcgbWF4TGVuZ3RoU3RyaW5nSW5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBjbGFzcyBDb21ib1NlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaW50IGluZGV4ID0gZkRvY3VtZW50VHlwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQlTdHJpbmcgZG9jdHlwZSA9IChTdHJpbmcpIGZEb2N1bWVudFR5cGVJZHMuZ2V0KGluZGV4KTsKLQkJCXVwZGF0ZURvY3R5cGVUZXh0KGluZGV4LCBkb2N0eXBlKTsKLQkJfQotCX0KLQotCUNvbWJvIGZEb2N1bWVudFR5cGVDb21ibzsKLQlMaXN0IGZEb2N1bWVudFR5cGVJZHM7Ci0JcHJpdmF0ZSBUZXh0IGZQdWJsaWNJZFRleHQ7Ci0JcHJpdmF0ZSBUZXh0IGZTeXN0ZW1JZFRleHQ7Ci0JcHJpdmF0ZSBDb21ibyBmUHJvZmlsZUNvbWJvOwotCXByaXZhdGUgTGlzdCBmUHJvZmlsZUlkczsKLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGZMaXN0ZW5lcjsKLQotCXB1YmxpYyBXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldERlc2NyaXB0aW9uKEhUTUxVSU1lc3NhZ2VzLldlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHByb3BlcnR5UGFnZSA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDIpOwotCi0JCWNyZWF0ZURvY3R5cGVDb250ZW50cyhwcm9wZXJ0eVBhZ2UpOwotCQljcmVhdGVDU1NQcm9maWxlQ29udGVudHMocHJvcGVydHlQYWdlKTsKLQotCQlwb3B1bGF0ZVZhbHVlcygpOwotCQlpbml0aWFsaXplVmFsdWVzKCk7Ci0JCWNvbXB1dGVNYXhXaWR0aEhpbnQoKTsKLQotCQlmTGlzdGVuZXIgPSBuZXcgQ29tYm9TZWxlY3Rpb25MaXN0ZW5lcigpOwotCQlmRG9jdW1lbnRUeXBlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoZkxpc3RlbmVyKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHByb3BlcnR5UGFnZSwgSUhlbHBDb250ZXh0SWRzLldFQl9DT05URU5UX1NFVFRJTkdTX0hFTFBJRCk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJcmV0dXJuIHByb3BlcnR5UGFnZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ1NTUHJvZmlsZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ1NTIFByb2ZpbGUKLQkJVGV4dCBsYW5ndWFnZUxhYmVsID0gbmV3IFRleHQocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLQkJbGFuZ3VhZ2VMYWJlbC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlVJX0NTU19wcm9maWxlX19fMik7Ci0JCWZQcm9maWxlQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWZQcm9maWxlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRG9jdHlwZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIGRlc2NyaXB0aW9uIG9mIGltcGxpY2l0IERPQ1RZUEUKLQkJVGV4dCBkb2N0eXBlTGFiZWwgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQlkb2N0eXBlTGFiZWwuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5VSV9EZXNjcmlwdGlvbl9vZl9yb2xlX29mX2ZvbGxvd2luZ19ET0NUWVBFKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkb2N0eXBlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBkb2N1bWVudCB0eXBlCi0JCVRleHQgbGFuZ3VhZ2VMYWJlbCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCWxhbmd1YWdlTGFiZWwuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5VSV9EZWZhdWx0X0hUTUxfRE9DVFlQRV9JRF9fXzEpOwotCQlmRG9jdW1lbnRUeXBlQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWZEb2N1bWVudFR5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIHB1YmxpYyBJRAotCQlUZXh0IHB1YmxpY0lkTGFiZWwgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQlwdWJsaWNJZExhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfUHVibGljX0lEKTsKLQkJZlB1YmxpY0lkVGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlJFQURfT05MWSB8IFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZlB1YmxpY0lkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIHN5c3RlbSBJRAotCQlUZXh0IHN5c3RlbUlkTGFiZWwgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQlzeXN0ZW1JZExhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfU3lzdGVtX0lEKTsKLQkJZlN5c3RlbUlkVGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlJFQURfT05MWSB8IFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZlN5c3RlbUlkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIGNyZWF0ZSBzZXBhcmF0b3IKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLnZlcnRpY2FsU3BhbiA9IDg7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSByZXNvdXJjZSB0aGlzIHByb3BlcnRpZXMgcGFnZSBpcyBmb3IKLQkgKiAKLQkgKiBAcmV0dXJuIElSZXNvdXJjZSBmb3IgdGhpcyBwcm9wZXJ0aWVzIHBhZ2Ugb3IgbnVsbCBpZiB0aGVyZSBpcyBubwotCSAqICAgICAgICAgSVJlc291cmNlCi0JICovCi0JcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCUlBZGFwdGFibGUgYWRhcHRhYmxlID0gZ2V0RWxlbWVudCgpOwotCQlpZiAoYWRhcHRhYmxlIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIGFkYXB0YWJsZTsKLQkJfSBlbHNlIGlmIChhZGFwdGFibGUgIT0gbnVsbCkgewotCQkJT2JqZWN0IG8gPSBhZGFwdGFibGUuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpbzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3lzdGVtSWRGcm9tKFN0cmluZyBwdWJsaWNJZCkgewotCQlpZiAocHVibGljSWQgPT0gbnVsbCB8fCBwdWJsaWNJZC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCUhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSByZWcgPSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJRW51bWVyYXRpb24gZSA9IHJlZy5nZXRFbnRyaWVzKCk7Ci0JCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlIVE1MRG9jdW1lbnRUeXBlRW50cnkgZW50cnkgPSAoSFRNTERvY3VtZW50VHlwZUVudHJ5KSBlLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoZW50cnkuZ2V0UHVibGljSWQoKS5lcXVhbHMocHVibGljSWQpKQotCQkJCXJldHVybiBlbnRyeS5nZXRTeXN0ZW1JZCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQlpbml0aWFsaXplRG9jdHlwZVZhbHVlcygpOwotCQlpbml0aWFsaXplQ1NTUHJvZmlsZVZhbHVlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQ1NTUHJvZmlsZVZhbHVlcygpIHsKLQkJaW50IGluZGV4ID0gMDsKLQkJU3RyaW5nIHByb2ZpbGUgPSBDU1NDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShDU1NDb250ZW50UHJvcGVydGllcy5DU1NfUFJPRklMRSwgZ2V0UmVzb3VyY2UoKSwgZmFsc2UpOwotCQlpZiAocHJvZmlsZSAhPSBudWxsICYmIHByb2ZpbGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkvKgotCQkJICogSWYgaXRlbSBpcyBhbHJlYWR5IHBhcnQgb2YgY29tYm8sIHNlbGVjdCBpdC4gT3RoZXJ3aXNlLCBzZWxlY3QKLQkJCSAqIG5vbmUuCi0JCQkgKi8KLQkJCWluZGV4ID0gZlByb2ZpbGVJZHMuaW5kZXhPZihwcm9maWxlKTsKLQkJfQotCQlpbmRleCA9IGluZGV4ID49IDAgPyBpbmRleCA6IDA7Ci0JCWZQcm9maWxlQ29tYm8uc2VsZWN0KGluZGV4KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURvY3R5cGVWYWx1ZXMoKSB7Ci0JCWludCBpbmRleCA9IDA7Ci0JCVN0cmluZyBkb2N0eXBlID0gSFRNTENvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KEhUTUxDb250ZW50UHJvcGVydGllcy5ET0NVTUVOVF9UWVBFLCBnZXRSZXNvdXJjZSgpLCBmYWxzZSk7Ci0JCWlmIChkb2N0eXBlICE9IG51bGwgJiYgZG9jdHlwZS5sZW5ndGgoKSA+IDApIHsKLQkJCS8qCi0JCQkgKiBJZiBpdGVtIGlzIGFscmVhZHkgcGFydCBvZiBjb21ibywgc2VsZWN0IGl0LiBPdGhlcndpc2UsIHNlbGVjdAotCQkJICogbm9uZS4KLQkJCSAqLwotCQkJaW5kZXggPSBmRG9jdW1lbnRUeXBlSWRzLmluZGV4T2YoZG9jdHlwZSk7Ci0JCX0KLQotCQkvLyBzZXQgY29tYm9ib3gKLQkJaW5kZXggPSBpbmRleCA+PSAwID8gaW5kZXggOiAwOwotCQlmRG9jdW1lbnRUeXBlQ29tYm8uc2VsZWN0KGluZGV4KTsKLQotCQl1cGRhdGVEb2N0eXBlVGV4dChpbmRleCwgZG9jdHlwZSk7Ci0JfQotCi0Jdm9pZCB1cGRhdGVEb2N0eXBlVGV4dChpbnQgaW5kZXgsIFN0cmluZyBkb2N0eXBlKSB7Ci0JCWlmIChpbmRleCA+IDApIHsKLQkJCS8vIHNldCBwdWJsaWMvc3lzdGVtIGlkIHRleHQKLQkJCWZQdWJsaWNJZFRleHQuc2V0VGV4dChkb2N0eXBlKTsKLQkJCVN0cmluZyBzeXN0ZW1JZCA9IGdldFN5c3RlbUlkRnJvbShkb2N0eXBlKTsKLQkJCWlmIChzeXN0ZW1JZCAhPSBudWxsKQotCQkJCWZTeXN0ZW1JZFRleHQuc2V0VGV4dChzeXN0ZW1JZCk7Ci0JCQllbHNlCi0JCQkJZlN5c3RlbUlkVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJLy8gc2V0IHB1YmxpYy9zeXN0ZW0gaWQgdGV4dAotCQkJZlB1YmxpY0lkVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJZlN5c3RlbUlkVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVmFsdWVzKCkgewotCQlwb3B1bGF0ZURvY3R5cGVWYWx1ZXMoKTsKLQkJcG9wdWxhdGVDU1NQcm9maWxlVmFsdWVzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ1NTUHJvZmlsZVZhbHVlcygpIHsKLQkJZlByb2ZpbGVJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIGFkZCBub25lIGZpcnN0Ci0JCWZQcm9maWxlQ29tYm8uYWRkKFNFTEVDVF9OT05FKTsKLQkJZlByb2ZpbGVJZHMuYWRkKG51bGwpOwotCi0JCUNTU1Byb2ZpbGVSZWdpc3RyeSByZWcgPSBDU1NQcm9maWxlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJSXRlcmF0b3IgaSA9IHJlZy5nZXRQcm9maWxlcygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU1Byb2ZpbGUgcHJvZmlsZSA9IChDU1NQcm9maWxlKSBpLm5leHQoKTsKLQkJCVN0cmluZyBpZCA9IHByb2ZpbGUuZ2V0UHJvZmlsZUlEKCk7Ci0JCQlTdHJpbmcgbmFtZSA9IHByb2ZpbGUuZ2V0UHJvZmlsZU5hbWUoKTsKLQkJCWZQcm9maWxlQ29tYm8uYWRkKG5hbWUpOwotCQkJZlByb2ZpbGVJZHMuYWRkKGlkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZURvY3R5cGVWYWx1ZXMoKSB7Ci0JCWZEb2N1bWVudFR5cGVJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIGFkZCBub25lIGZpcnN0Ci0JCWZEb2N1bWVudFR5cGVDb21iby5hZGQoU0VMRUNUX05PTkUpOwotCQlmRG9jdW1lbnRUeXBlSWRzLmFkZChudWxsKTsKLQotCQlIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgcmVnID0gSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCUVudW1lcmF0aW9uIGUgPSByZWcuZ2V0RW50cmllcygpOwotCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJSFRNTERvY3VtZW50VHlwZUVudHJ5IGVudHJ5ID0gKEhUTUxEb2N1bWVudFR5cGVFbnRyeSkgZS5uZXh0RWxlbWVudCgpOwotCQkJU3RyaW5nIHB1YmxpY0lkID0gZW50cnkuZ2V0UHVibGljSWQoKTsKLQkJCVN0cmluZyBkaXNwbGF5TmFtZSA9IGVudHJ5LmdldERpc3BsYXlOYW1lKCk7Ci0JCQlkaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lICE9IG51bGwgPyBkaXNwbGF5TmFtZSA6IHB1YmxpY0lkOwotCi0JCQlmRG9jdW1lbnRUeXBlQ29tYm8uYWRkKGRpc3BsYXlOYW1lKTsKLQkJCWZEb2N1bWVudFR5cGVJZHMuYWRkKHB1YmxpY0lkKTsKLQotCQkJaWYgKGRpc3BsYXlOYW1lLmxlbmd0aCgpID4gbWF4TGVuZ3RoU3RyaW5nSW5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkubGVuZ3RoKCkpIHsKLQkJCQltYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSA9IGRpc3BsYXlOYW1lOwotCQkJfQotCi0JCQlpZiAoZW50cnkuZ2V0U3lzdGVtSWQoKSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOyAvLyBpZiBIVE1MIGVudHJ5Ci0KLQotCQkJaWYgKGVudHJ5LmdldFN5c3RlbUlkKCkubGVuZ3RoKCkgPiBtYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5sZW5ndGgoKSkKLQkJCQltYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSA9IGVudHJ5LmdldFN5c3RlbUlkKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcHV0ZU1heFdpZHRoSGludCgpIHsKLQkJLy8gbWF4TGVuZ3RoU3RyaW5nIHdhcyBzZXQgcG9wdWxhdGVEb2N0eXBlVmFsdWVzIHdhcyBjYWxsZWQKLQkJU3RyaW5nIG1heExlbmd0aFN0cmluZyA9IG1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5OwotCQlTdHJpbmcgYmFja3VwID0gZlN5c3RlbUlkVGV4dC5nZXRUZXh0KCk7Ci0JCWZTeXN0ZW1JZFRleHQuc2V0VGV4dChtYXhMZW5ndGhTdHJpbmcpOwotCQlpbnQgbWF4V2lkdGhIaW50ID0gZlN5c3RlbUlkVGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLng7Ci0JCWZTeXN0ZW1JZFRleHQuc2V0VGV4dChiYWNrdXApOwotCi0JCWlmIChmRG9jdW1lbnRUeXBlQ29tYm8uZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSBmRG9jdW1lbnRUeXBlQ29tYm8uZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBtYXhXaWR0aEhpbnQ7Ci0JCWlmIChmUHVibGljSWRUZXh0LmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgZlB1YmxpY0lkVGV4dC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQkJaWYgKGZTeXN0ZW1JZFRleHQuZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSBmU3lzdGVtSWRUZXh0LmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCQlpZiAoZlByb2ZpbGVDb21iby5nZXRMYXlvdXREYXRhKCkgIT0gbnVsbCkKLQkJCSgoR3JpZERhdGEpIGZQcm9maWxlQ29tYm8uZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBtYXhXaWR0aEhpbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1DU1NQcm9maWxlRGVmYXVsdHMoKSB7Ci0JCWludCBpbmRleCA9IGZQcm9maWxlQ29tYm8uaW5kZXhPZihTRUxFQ1RfTk9ORSk7Ci0JCWlmIChpbmRleCA+IC0xKQotCQkJZlByb2ZpbGVDb21iby5zZWxlY3QoaW5kZXgpOwotCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwZXJmb3JtQ1NTUHJvZmlsZU9rKCkgewotCQlpbnQgaW5kZXggPSBmUHJvZmlsZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA+IC0xKSB7Ci0JCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBmUHJvZmlsZUlkcy5nZXQoaW5kZXgpOwotCQkJaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCB8fCBpZC5lcXVhbHNJZ25vcmVDYXNlKFNFTEVDVF9OT05FKSkgewotCQkJCS8vIGlmIG5vbmUsIHVzZSBudWxsCi0JCQkJaWQgPSBudWxsOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlDU1NDb250ZW50UHJvcGVydGllcy5zZXRQcm9wZXJ0eShDU1NDb250ZW50UHJvcGVydGllcy5DU1NfUFJPRklMRSwgZ2V0UmVzb3VyY2UoKSwgaWQpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIG1heWJlIGluIGZ1dHVyZSwgbGV0IHVzZXIga25vdyB0aGVyZSB3YXMgYSBwcm9ibGVtIHNhdmluZwotCQkJCS8vIGZpbGUKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQotCQlwZXJmb3JtRG9jdHlwZURlZmF1bHRzKCk7Ci0JCXBlcmZvcm1DU1NQcm9maWxlRGVmYXVsdHMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURvY3R5cGVEZWZhdWx0cygpIHsKLQkJZlB1YmxpY0lkVGV4dC5zZXRUZXh0KCIiKTsvLyROT04tTkxTLTEkCi0JCWZTeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcGVyZm9ybURvY3R5cGVPaygpIHsKLQkJaW50IGluZGV4ID0gZkRvY3VtZW50VHlwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA+IC0xKSB7Ci0JCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBmRG9jdW1lbnRUeXBlSWRzLmdldChpbmRleCk7Ci0JCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwIHx8IGlkLmVxdWFsc0lnbm9yZUNhc2UoU0VMRUNUX05PTkUpKSB7Ci0JCQkJLy8gaWYgbm9uZSwgdXNlIG51bGwKLQkJCQlpZCA9IG51bGw7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCUhUTUxDb250ZW50UHJvcGVydGllcy5zZXRQcm9wZXJ0eShIVE1MQ29udGVudFByb3BlcnRpZXMuRE9DVU1FTlRfVFlQRSwgZ2V0UmVzb3VyY2UoKSwgaWQpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIG1heWJlIGluIGZ1dHVyZSwgbGV0IHVzZXIga25vdyB0aGVyZSB3YXMgYSBwcm9ibGVtIHNhdmluZwotCQkJCS8vIGZpbGUKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlwZXJmb3JtRG9jdHlwZU9rKCk7Ci0JCXBlcmZvcm1DU1NQcm9maWxlT2soKTsKLQotCQlyZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXJIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0NvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RkYjAyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0NvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb3JyZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uLkNvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb24uQ29ycmVjdGlvblByb2Nlc3NvclhNTDsKLQotLyoqCi0gKiBDb3JyZWN0aW9uIGFzc2lzdGFudCBmb3IgSFRNTAotICogCi0gKiBAZGVwcmVjYXRlZCBzaW5jZSAyLjAgUkMwIFVzZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RQcm9jZXNzb3I7Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXJIVE1MIGV4dGVuZHMgQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVyIHsKLQotCXB1YmxpYyBJQ29udGVudEFzc2lzdGFudCBnZXRDb3JyZWN0aW9uQXNzaXN0YW50KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCUlDb250ZW50QXNzaXN0YW50IGNhID0gbnVsbDsKLQotCQlpZiAoc291cmNlVmlld2VyICE9IG51bGwpIHsKLQkJCUNvbnRlbnRBc3Npc3RhbnQgYXNzaXN0YW50ID0gbmV3IENvbnRlbnRBc3Npc3RhbnQoKTsKLQotCQkJaWYgKHNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgY29ycmVjdGlvblByb2Nlc3NvciA9IG5ldyBDb3JyZWN0aW9uUHJvY2Vzc29yWE1MKHNvdXJjZVZpZXdlcik7Ci0JCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY29ycmVjdGlvblByb2Nlc3NvciwgSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCk7Ci0JCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY29ycmVjdGlvblByb2Nlc3NvciwgSVhNTFBhcnRpdGlvbnMuWE1MX0NEQVRBKTsKLQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb3JyZWN0aW9uUHJvY2Vzc29yLCBJWE1MUGFydGl0aW9ucy5YTUxfQ09NTUVOVCk7Ci0JCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY29ycmVjdGlvblByb2Nlc3NvciwgSVhNTFBhcnRpdGlvbnMuWE1MX0RFQ0xBUkFUSU9OKTsKLQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb3JyZWN0aW9uUHJvY2Vzc29yLCBJWE1MUGFydGl0aW9ucy5YTUxfUEkpOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNvcnJlY3Rpb25Qcm9jZXNzb3IsIElYTUxQYXJ0aXRpb25zLkRURF9TVUJTRVQpOwotCQkJfQotCQkJY2EgPSBhc3Npc3RhbnQ7Ci0JCX0KLQotCQlyZXR1cm4gY2E7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9kZXJpdmVkL1NpbmdsZUNoYXJSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2Rlcml2ZWQvU2luZ2xlQ2hhclJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODYwYmJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2Rlcml2ZWQvU2luZ2xlQ2hhclJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmRlcml2ZWQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi0vKgotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC5qYXZhZG9jLlNpbmdsZUNoYXJSZWFkZXIuCi0gKiBNb2RpZmljYXRpb24gd2FzIG1hZGUgdG8gZml4IHN0YXRlbWVudCB1bm5lY2Vzc2FyaWx5IG5lc3RlZCB3aXRoaW4gZWxzZQotICogY2xhdXNlIHdhcm5pbmcgaW4gcmVhZCguLikuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTaW5nbGVDaGFyUmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKLQotCS8qKgotCSAqIEBzZWUgUmVhZGVyI3JlYWQoKQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBzZWUgUmVhZGVyI3JlYWQoY2hhcltdLGludCxpbnQpCi0JICovCi0JcHVibGljIGludCByZWFkKGNoYXIgY2J1ZltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgZW5kID0gb2ZmICsgbGVuOwotCQlmb3IgKGludCBpID0gb2ZmOyBpIDwgZW5kOyBpKyspIHsKLQkJCWludCBjaCA9IHJlYWQoKTsKLQkJCWlmIChjaCA9PSAtMSkgewotCQkJCWlmIChpID09IG9mZikgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCXJldHVybiBpIC0gb2ZmOwotCQkJfQotCQkJY2J1ZltpXSA9IChjaGFyKSBjaDsKLQkJfQotCQlyZXR1cm4gbGVuOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVhZGVyI3JlYWR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRlbnQgYXMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBjaDsKLQkJd2hpbGUgKChjaCA9IHJlYWQoKSkgIT0gLTEpIHsKLQkJCWJ1Zi5hcHBlbmQoKGNoYXIpIGNoKTsKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdC91aS9BY3Rpb25Db250cmlidXRvckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQWN0aW9uQ29udHJpYnV0b3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NzFkMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdC91aS9BY3Rpb25Db250cmlidXRvckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLkFjdGlvbkNvbnRyaWJ1dG9yWE1MOwotCi0vKioKLSAqCi0gKiBJbnN0ZWFkLCB1c2UgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yIGZvciBzb3VyY2UgcGFnZSBjb250cmlidXRvcgotICogb2YgbXVsdGkgcGFnZSBlZGl0b3IuCi0gKiAKLSAqIE5vdGUgdGhhdCB0aGlzIGNsYXNzIGlzIHN0aWxsIHZhbGlkIGZvciBzaW5nbGUgcGFnZSBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25Db250cmlidXRvckhUTUwgZXh0ZW5kcyBBY3Rpb25Db250cmlidXRvclhNTCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRURJVE9SX0lEUyA9IHsib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlLnNvdXJjZSIsICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RXh0ZW5zaW9uSURzKCkgewotCQlyZXR1cm4gRURJVE9SX0lEUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0L3VpL0NsZWFudXBBY3Rpb25IVE1MRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cEFjdGlvbkhUTUxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDhmZDU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cEFjdGlvbkhUTUxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXQudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5IVE1MQ2xlYW51cFByb2Nlc3NvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLS8qKgotICogQ2xlYW51cCBhY3Rpb24gZGVsZWdhdGUgZm9yIEhUTUwgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGVhbnVwQWN0aW9uSFRNTERlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUyLCBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZkNsZWFudXBQcm9jZXNzb3I7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG51bGxpbmcgb3V0IGp1c3QgaW4gY2FzZQotCQlmRWRpdG9yID0gbnVsbDsKLQkJZkNsZWFudXBQcm9jZXNzb3IgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5DbGVhbnVwRG9jdW1lbnRfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KEhUTUxVSU1lc3NhZ2VzLkNsZWFudXBEb2N1bWVudF90b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihIVE1MVUlNZXNzYWdlcy5DbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGZFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJZmluYWwgSVRleHRFZGl0b3IgZWRpdG9yID0gKElUZXh0RWRpdG9yKSBmRWRpdG9yOwotCQkJQ2xlYW51cERpYWxvZ0hUTUwgY2xlYW51cERpYWxvZyA9IG5ldyBDbGVhbnVwRGlhbG9nSFRNTChlZGl0b3IuZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJY2xlYW51cERpYWxvZy5zZXRpc1hIVE1MVHlwZShpc1hIVE1MKCkpOwotCQkJaWYgKGNsZWFudXBEaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCS8vIHNldHVwIHJ1bm5hYmxlCi0JCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBjbGVhbnVwUHJvY2Vzc29yID0gZ2V0Q2xlYW51cFByb2Nlc3NvcigpOwotCQkJCQkJaWYgKGNsZWFudXBQcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChlZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKSk7Ci0JCQkJCQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCQkJCQkJY2xlYW51cFByb2Nlc3Nvci5jbGVhbnVwTW9kZWwobW9kZWwpOwotCQkJCQkJCX0KLQkJCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJCQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCi0JCQkJLy8gVE9ETzogbWFrZSBpbmRlcGVuZGVudCBvZiAnbW9kZWwnLgotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChlZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKSk7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBiZWdpbiByZWNvcmRpbmcKLQkJCQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgZWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBTU0VVSU1lc3NhZ2VzLkNsZWFudXBfRG9jdW1lbnRfVUlfLCBTU0VVSU1lc3NhZ2VzLkNsZWFudXBfRG9jdW1lbnRfVUlfLCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkJCQkvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBhYm91dCB0byBtYWtlIGEgYmlnCi0JCQkJCQkvLyBtb2RlbCBjaGFuZ2UKLQkJCQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0JCQkJCQkvLyBydW4KLQkJCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGZFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBydW5uYWJsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZwotCQkJCQkJLy8gbW9kZWwKLQkJCQkJCS8vIGNoYW5nZQotCQkJCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0KLQkJCQkJCS8vIGVuZCByZWNvcmRpbmcKLQkJCQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgZWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQltb2RlbC5lbmRSZWNvcmRpbmcodGhpcywgc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGdldENsZWFudXBQcm9jZXNzb3IoKSB7Ci0JCWlmIChmQ2xlYW51cFByb2Nlc3NvciA9PSBudWxsKQotCQkJZkNsZWFudXBQcm9jZXNzb3IgPSBuZXcgSFRNTENsZWFudXBQcm9jZXNzb3JJbXBsKCk7Ci0KLQkJcmV0dXJuIGZDbGVhbnVwUHJvY2Vzc29yOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1hIVE1MKCkgewotCQlib29sZWFuIGlzeGh0bWwgPSBmYWxzZTsKLQkJaWYgKGZFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZkVkaXRvcjsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQkJSURPTURvY3VtZW50IGRvbURvY3VtZW50ID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCQlpZiAoZG9tRG9jdW1lbnQgIT0gbnVsbCkKLQkJCQkJCWlzeGh0bWwgPSBkb21Eb2N1bWVudC5pc1hNTFR5cGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlzeGh0bWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwRGlhbG9nSFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwRGlhbG9nSFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzJmZTE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cERpYWxvZ0hUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLQotcHVibGljIGNsYXNzIENsZWFudXBEaWFsb2dIVE1MIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUFzaXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUxvd2VyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VVcHBlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUFzaXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VMb3dlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZVVwcGVyOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRyczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDaGVja0JveEluc2VydE1pc3NpbmdUYWdzOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94UXVvdGVBdHRyVmFsdWVzOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94Rm9ybWF0U291cmNlOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94Q29udmVydEVPTENvZGVzOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3M7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWM7Ci0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGZQcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc1hIVE1MID0gZmFsc2U7Ci0JcHJpdmF0ZSBHcm91cCBmVGFnTmFtZUNhc2U7Ci0JcHJpdmF0ZSBHcm91cCBmQXR0ck5hbWVDYXNlOwotCi0JcHVibGljIENsZWFudXBEaWFsb2dIVE1MKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyKHNoZWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZ2V0U2hlbGwoKS5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkNsZWFudXBfVUlfKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJY3JlYXRlRGlhbG9nQXJlYUluQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCWluaXRpYWxpemVPcHRpb25zKCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb250cm9sIGMgPSBzdXBlci5jcmVhdGVCdXR0b25CYXIocGFyZW50KTsKLQkJb2tCdXR0b25FbmFibGVtZW50KCk7Ci0JCXJldHVybiBjOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURpYWxvZ0FyZWFJbkNvbXBvc2l0ZUZvckhUTUwoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkvLyBDb252ZXJ0IHRhZyBuYW1lIGNhc2UKLQkJLy8gZDI1NzA2NCBuZWVkIHRvIGFzc29jaWF0ZSBncm91cCB3LyByYWRpbyBidXR0b25zIHNvIHJhZGlvIGJ1dHRvbnMKLQkJLy8gaGVhZGVyIGNhbiBiZSByZWFkCi0JCWZUYWdOYW1lQ2FzZSA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZlRhZ05hbWVDYXNlLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVGFnX25hbWVfY2FzZV9mb3JfSFRNTF9VSV8pOwotCQlHcmlkTGF5b3V0IGhMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQloTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlmVGFnTmFtZUNhc2Uuc2V0TGF5b3V0KGhMYXlvdXQpOwotCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUFzaXMgPSBuZXcgQnV0dG9uKGZUYWdOYW1lQ2FzZSwgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VBc2lzLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVGFnX25hbWVfY2FzZV9Bc19pc19VSV8pOwotCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUFzaXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXIgPSBuZXcgQnV0dG9uKGZUYWdOYW1lQ2FzZSwgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VMb3dlci5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlRhZ19uYW1lX2Nhc2VfTG93ZXJfVUlfKTsKLQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VMb3dlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VVcHBlciA9IG5ldyBCdXR0b24oZlRhZ05hbWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZVVwcGVyLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVGFnX25hbWVfY2FzZV9VcHBlcl9VSV8pOwotCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZVVwcGVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIENvbnZlcnQgYXR0ciBuYW1lIGNhc2UKLQkJLy8gZDI1NzA2NCBuZWVkIHRvIGFzc29jaWF0ZSBncm91cCB3LyByYWRpbyBidXR0b25zIHNvIHJhZGlvIGJ1dHRvbnMKLQkJLy8gaGVhZGVyIGNhbiBiZSByZWFkCi0JCWZBdHRyTmFtZUNhc2UgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWZBdHRyTmFtZUNhc2Uuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfbmFtZV9jYXNlX2Zvcl9IVE1MX1VJXyk7Ci0JCWZBdHRyTmFtZUNhc2Uuc2V0TGF5b3V0KGhMYXlvdXQpOwotCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VBc2lzID0gbmV3IEJ1dHRvbihmQXR0ck5hbWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VBc2lzLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuQXR0cmlidXRlX25hbWVfY2FzZV9Bc19pc19VSV8pOwotCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VBc2lzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VMb3dlciA9IG5ldyBCdXR0b24oZkF0dHJOYW1lQ2FzZSwgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlTG93ZXIuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfbmFtZV9jYXNlX0xvd2VyX1VJXyk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VVcHBlciA9IG5ldyBCdXR0b24oZkF0dHJOYW1lQ2FzZSwgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlVXBwZXIuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfbmFtZV9jYXNlX1VwcGVyX1VJXyk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZVVwcGVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURpYWxvZ0FyZWFJbkNvbXBvc2l0ZShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWNyZWF0ZURpYWxvZ0FyZWFJbkNvbXBvc2l0ZUZvckhUTUwoY29tcG9zaXRlKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIElIZWxwQ29udGV4dElkcy5DTEVBTlVQX0hUTUxfSEVMUElEKTsgLy8gdXNlCi0JCS8vIEhUTUwKLQkJLy8gc3BlY2lmaWMKLQkJLy8gaGVscAotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEluc2VydCBtaXNzaW5nIHJlcXVpcmVkIGF0dHJzCi0JCWZDaGVja0JveEluc2VydFJlcXVpcmVkQXR0cnMgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycy5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkluc2VydF9yZXF1aXJlZF9hdHRyaWJ1dGVzX1VJXyk7Ci0JCWZDaGVja0JveEluc2VydFJlcXVpcmVkQXR0cnMuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gSW5zZXJ0IG1pc3NpbmcgYmVnaW4vZW5kIHRhZ3MKLQkJZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3MgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3Muc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5JbnNlcnRfbWlzc2luZ190YWdzX1VJXyk7Ci0JCWZDaGVja0JveEluc2VydE1pc3NpbmdUYWdzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIFF1b3RlIGF0dHJpYnV0ZSB2YWx1ZXMKLQkJZkNoZWNrQm94UXVvdGVBdHRyVmFsdWVzID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZDaGVja0JveFF1b3RlQXR0clZhbHVlcy5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlF1b3RlX2F0dHJpYnV0ZV92YWx1ZXNfVUlfKTsKLQkJZkNoZWNrQm94UXVvdGVBdHRyVmFsdWVzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIEZvcm1hdCBzb3VyY2UKLQkJZkNoZWNrQm94Rm9ybWF0U291cmNlID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZDaGVja0JveEZvcm1hdFNvdXJjZS5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkZvcm1hdF9zb3VyY2VfVUlfKTsKLQkJZkNoZWNrQm94Rm9ybWF0U291cmNlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIENvbnZlcnQgRU9MIGNvZGUKLQkJZkNoZWNrQm94Q29udmVydEVPTENvZGVzID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkNvbnZlcnRfRU9MX2NvZGVzX1VJXyk7Ci0JCWZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJQ29tcG9zaXRlIEVPTENvZGVzID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBoTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJaExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJRU9MQ29kZXMuc2V0TGF5b3V0KGhMYXlvdXQpOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cyA9IG5ldyBCdXR0b24oRU9MQ29kZXMsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuRU9MX1dpbmRvd3NfVUkpOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXggPSBuZXcgQnV0dG9uKEVPTENvZGVzLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkVPTF9Vbml4X1VJKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMgPSBuZXcgQnV0dG9uKEVPTENvZGVzLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuRU9MX01hY19VSSk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlzdG9yZU9wdGlvbnMoKTsKLQotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT3B0aW9uc0ZvckhUTUwoKSB7Ci0JCWJvb2xlYW4gY2FzZVNlbnNpdGl2ZSA9IGlzWEhUTUxUeXBlKCk7Ci0KLQkJaWYgKGNhc2VTZW5zaXRpdmUpIHsKLQkJCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9IGVsc2UgewotCQkJaW50IHRhZ05hbWVDYXNlID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX1RBR19OQU1FX0NBU0UpOwotCQkJaWYgKHRhZ05hbWVDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKSB7Ci0JCQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VVcHBlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQl9IGVsc2UgaWYgKHRhZ05hbWVDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKQotCQkJCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZQotCQkJCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlQXNpcy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQotCQlpZiAoY2FzZVNlbnNpdGl2ZSkgewotCQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlTG93ZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9IGVsc2UgewotCQkJaW50IGF0dHJOYW1lQ2FzZSA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9BVFRSX05BTUVfQ0FTRSk7Ci0JCQlpZiAoYXR0ck5hbWVDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKSB7Ci0JCQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlVXBwZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJfSBlbHNlIGlmIChhdHRyTmFtZUNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpCi0JCQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlTG93ZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZQotCQkJCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUFzaXMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0KLQkJZW5hYmxlQ2FzZUNvbnRyb2xzKCFjYXNlU2Vuc2l0aXZlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT3B0aW9ucygpIHsKLQkJaW5pdGlhbGl6ZU9wdGlvbnNGb3JIVE1MKCk7Ci0KLQkJZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycy5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX1JFUVVJUkVEX0FUVFJTKSk7Ci0JCWZDaGVja0JveEluc2VydE1pc3NpbmdUYWdzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTKSk7Ci0JCWZDaGVja0JveFF1b3RlQXR0clZhbHVlcy5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMpKTsKLQkJZkNoZWNrQm94Rm9ybWF0U291cmNlLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFKSk7Ci0JCWZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMpKTsKLQkJaWYgKGZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5nZXRTZWxlY3Rpb24oKSkgewotCQkJU3RyaW5nIEVPTENvZGUgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUpOwotCQkJaWYgKEVPTENvZGUgPT0gQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuTEYpCi0JCQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZSBpZiAoRU9MQ29kZSA9PSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUikKLQkJCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWVsc2UKLQkJCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJZW5hYmxlRU9MQ29kZVJhZGlvcyhmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlT3B0aW9uc0ZvckhUTUwoKSB7Ci0JCWlmICghaXNYSFRNTFR5cGUoKSAmJiBmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZVVwcGVyLmdldFNlbGVjdGlvbigpKQotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfVEFHX05BTUVfQ0FTRSwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQllbHNlIGlmIChmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUxvd2VyLmdldFNlbGVjdGlvbigpKQotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfVEFHX05BTUVfQ0FTRSwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQllbHNlCi0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9UQUdfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQotCQlpZiAoIWlzWEhUTUxUeXBlKCkgJiYgZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9BVFRSX05BTUVfQ0FTRSwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQllbHNlIGlmIChmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VMb3dlci5nZXRTZWxlY3Rpb24oKSkKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0FUVFJfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCWVsc2UKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0FUVFJfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQotCQkvLyBleHBsaWNpdGx5IHNhdmUgcGx1Z2luIHByZWZlcmVuY2VzIHNvIHZhbHVlcyBhcmUgc3RvcmVkCi0JCUhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZU9wdGlvbnMoKSB7Ci0JCXN0b3JlT3B0aW9uc0ZvckhUTUwoKTsKLQotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX1JFUVVJUkVEX0FUVFJTLCBmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzLmdldFNlbGVjdGlvbigpKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9NSVNTSU5HX1RBR1MsIGZDaGVja0JveEluc2VydE1pc3NpbmdUYWdzLmdldFNlbGVjdGlvbigpKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTLCBmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXMuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSwgZkNoZWNrQm94Rm9ybWF0U291cmNlLmdldFNlbGVjdGlvbigpKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTlZFUlRfRU9MX0NPREVTLCBmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuZ2V0U2VsZWN0aW9uKCkpOwotCi0JCWlmIChmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWlmIChmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peC5nZXRTZWxlY3Rpb24oKSkgewotCQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5MRik7Ci0JCQl9IGVsc2UgaWYgKGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9FT0xfQ09ERSwgQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuQ1IpOwotCQkJfSBlbHNlIHsKLQkJCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9FT0xfQ09ERSwgQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuQ1JMRik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBleHBsaWNpdGx5IHNhdmUgcGx1Z2luIHByZWZlcmVuY2VzIHNvIHZhbHVlcyBhcmUgc3RvcmVkCi0JCUhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQl3aWRnZXRTZWxlY3RlZChlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChlLndpZGdldCA9PSBmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMpCi0JCQllbmFibGVFT0xDb2RlUmFkaW9zKGZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJb2tCdXR0b25FbmFibGVtZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNYSFRNTFR5cGUoKSB7Ci0JCXJldHVybiBmSXNYSFRNTDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVFT0xDb2RlUmFkaW9zKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCWlmICgoZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3MgIT0gbnVsbCkgJiYgKGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4ICE9IG51bGwpICYmIChmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjICE9IG51bGwpKSB7Ci0JCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peC5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjLnNldEVuYWJsZWQoZW5hYmxlKTsKLQotCQkJaWYgKCFmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5nZXRTZWxlY3Rpb24oKSAmJiAhZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguZ2V0U2VsZWN0aW9uKCkgJiYgIWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3Muc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlcy9kaXNhYmxlcyB0aGUgdGFnL2F0dHIgY2FzZSByYWRpbyBidXR0b25zCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUNhc2VDb250cm9scyhib29sZWFuIGVuYWJsZSkgewotCQlmVGFnTmFtZUNhc2Uuc2V0RW5hYmxlZChlbmFibGUpOwotCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUFzaXMuc2V0RW5hYmxlZChlbmFibGUpOwotCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUxvd2VyLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VVcHBlci5zZXRFbmFibGVkKGVuYWJsZSk7Ci0KLQkJZkF0dHJOYW1lQ2FzZS5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUFzaXMuc2V0RW5hYmxlZChlbmFibGUpOwotCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VMb3dlci5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZVVwcGVyLnNldEVuYWJsZWQoZW5hYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGVzL2Rpc2FibGVzIE9LIGJ1dHRvbgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBva0J1dHRvbkVuYWJsZW1lbnQoKSB7Ci0JCWJvb2xlYW4gdGFnTmFtZUNhc2VDaGVjayA9ICgoZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VVcHBlciAhPSBudWxsICYmIGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpIHx8IGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQlib29sZWFuIGF0dHJOYW1lQ2FzZUNoZWNrID0gKChmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VVcHBlciAhPSBudWxsICYmIGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZVVwcGVyLmdldFNlbGVjdGlvbigpKSB8fCBmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VMb3dlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCWJvb2xlYW4gZW9sQ2hlY2sgPSBmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuZ2V0U2VsZWN0aW9uKCkgJiYgKGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LmdldFNlbGVjdGlvbigpIHx8IGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMuZ2V0U2VsZWN0aW9uKCkgfHwgZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3MuZ2V0U2VsZWN0aW9uKCkpOwotCQlib29sZWFuIGJ1dHRvbkVuYWJsZWQgPSB0YWdOYW1lQ2FzZUNoZWNrIHx8IGF0dHJOYW1lQ2FzZUNoZWNrIHx8IGZDaGVja0JveEluc2VydE1pc3NpbmdUYWdzLmdldFNlbGVjdGlvbigpIHx8IGZDaGVja0JveFF1b3RlQXR0clZhbHVlcy5nZXRTZWxlY3Rpb24oKSB8fCBmQ2hlY2tCb3hGb3JtYXRTb3VyY2UuZ2V0U2VsZWN0aW9uKCkgfHwgZW9sQ2hlY2s7Ci0JCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGJ1dHRvbkVuYWJsZWQpOwotCX0KLQotCXZvaWQgc2V0aXNYSFRNTFR5cGUoYm9vbGVhbiBpc1hIVE1MKSB7Ci0JCWZJc1hIVE1MID0gaXNYSFRNTDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0L3VpL0NsZWFudXBEb2N1bWVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cERvY3VtZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWM1MjY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cERvY3VtZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkhUTUxDbGVhbnVwUHJvY2Vzc29ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotcHVibGljIGNsYXNzIENsZWFudXBEb2N1bWVudEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBJSGFuZGxlciB7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZkNsZWFudXBQcm9jZXNzb3I7Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBudWxsaW5nIG91dCBqdXN0IGluIGNhc2UKLQkJZkNsZWFudXBQcm9jZXNzb3IgPSBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVFZGl0b3IoZXZlbnQpOwotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvclBhcnQ7Ci0JCWVsc2UgewotCQkJT2JqZWN0IG8gPSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0JCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCWZpbmFsIElUZXh0RWRpdG9yIGVkaXRvciA9IHRleHRFZGl0b3I7Ci0JCQlDbGVhbnVwRGlhbG9nSFRNTCBjbGVhbnVwRGlhbG9nID0gbmV3IENsZWFudXBEaWFsb2dIVE1MKGVkaXRvci5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQljbGVhbnVwRGlhbG9nLnNldGlzWEhUTUxUeXBlKGlzWEhUTUwoZWRpdG9yKSk7Ci0JCQlpZiAoY2xlYW51cERpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJLy8gc2V0dXAgcnVubmFibGUKLQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IgPSBnZXRDbGVhbnVwUHJvY2Vzc29yKCk7Ci0JCQkJCQlpZiAoY2xlYW51cFByb2Nlc3NvciAhPSBudWxsKSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCQkJCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJCQkJCQljbGVhbnVwUHJvY2Vzc29yLmNsZWFudXBNb2RlbChtb2RlbCk7Ci0JCQkJCQkJfQotCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0KLQkJCQkvLyBUT0RPOiBtYWtlIGluZGVwZW5kZW50IG9mICdtb2RlbCcuCi0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCS8vIGJlZ2luIHJlY29yZGluZwotCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFNTRVVJTWVzc2FnZXMuQ2xlYW51cF9Eb2N1bWVudF9VSV8sIFNTRVVJTWVzc2FnZXMuQ2xlYW51cF9Eb2N1bWVudF9VSV8sIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcKLQkJCQkJCS8vIG1vZGVsIGNoYW5nZQotCQkJCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQkJCS8vIHJ1bgotCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgcnVubmFibGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBiaWcKLQkJCQkJCS8vIG1vZGVsCi0JCQkJCQkvLyBjaGFuZ2UKLQkJCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCi0JCQkJCQkvLyBlbmQgcmVjb3JkaW5nCi0JCQkJCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMsIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUlTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBnZXRDbGVhbnVwUHJvY2Vzc29yKCkgewotCQlpZiAoZkNsZWFudXBQcm9jZXNzb3IgPT0gbnVsbCkKLQkJCWZDbGVhbnVwUHJvY2Vzc29yID0gbmV3IEhUTUxDbGVhbnVwUHJvY2Vzc29ySW1wbCgpOwotCi0JCXJldHVybiBmQ2xlYW51cFByb2Nlc3NvcjsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzWEhUTUwoSVRleHRFZGl0b3IgZWRpdG9yKSB7Ci0JCWJvb2xlYW4gaXN4aHRtbCA9IGZhbHNlOwotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJCUlET01Eb2N1bWVudCBkb21Eb2N1bWVudCA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJaWYgKGRvbURvY3VtZW50ICE9IG51bGwpCi0JCQkJCQlpc3hodG1sID0gZG9tRG9jdW1lbnQuaXNYTUxUeXBlKCk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpc3hodG1sOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXRvci9IVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXRvci9IVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA2NjE0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0b3IvSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBoYW5kbGUgaW1hZ2VzIHByb3ZpZGVkIGJ5IHRoaXMgcGx1Zy1pbi4KLSAqLwotcHVibGljIGNsYXNzIEhUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUExVR0lOSUQgPSBIVE1MVUlQbHVnaW4uSUQ7Ci0JcHJpdmF0ZSBzdGF0aWMgSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyIGluc3RhbmNlID0gbnVsbDsKLQotCS8vCSBzYXZlIGEgZGVzY3JpcHRvciBmb3IgZWFjaCBpbWFnZQotCXByaXZhdGUgSGFzaE1hcCBmSW1hZ2VEZXNjUmVnaXN0cnkgPSBudWxsOwotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEhUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2UgZnJvbSB0aGUgaW1hZ2UgcmVnaXN0cnkuCi0JICogSWYgdGhlIGltYWdlIGNhbm5vdCBiZSByZXRyaWV2ZWQsIGF0dGVtcHQgdG8gZmluZCBhbmQgbG9hZCB0aGUgaW1hZ2UgYXQKLQkgKiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGluIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIGltYWdlIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZSB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIG9yIG51bGwgaWYgb25lIGNvdWxkCi0JICogICAgICAgICBub3QgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChyZXNvdXJjZSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgYW4gaW1hZ2UKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlCi0JICogZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgdGhlIGltYWdlIGRlc2NyaXB0b3IgY2Fubm90IGJlIHJldHJpZXZlZCwKLQkgKiBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZAotCSAqIGluIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIGltYWdlIGRlc2NyaXB0b3IgdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvciB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2F0ZWQgd2l0aCByZXNvdXJjZSBvcgotCSAqICAgICAgICAgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IgaWYgb25lIGNvdWxkIG5vdCBiZQotCSAqICAgICAgICAgZm91bmQKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0JCU9iamVjdCBvID0gZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAobyA9PSBudWxsKSB7Ci0JCQkvL2NyZWF0ZSBhIGRlc2NyaXB0b3IKLQkJCWltYWdlRGVzY3JpcHRvciA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSAoSW1hZ2VEZXNjcmlwdG9yKSBvOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiBIYXNoTWFwIC0gaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKSB7Ci0JCWlmIChmSW1hZ2VEZXNjUmVnaXN0cnkgPT0gbnVsbCkKLQkJCWZJbWFnZURlc2NSZWdpc3RyeSA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBmSW1hZ2VEZXNjUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSW1hZ2VSZWdpc3RyeSAtIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIGFkZHMgdGhlIGltYWdlIHRvIHRoZQotCSAqIGltYWdlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gSW1hZ2UKLQkgKi8KLQlwcml2YXRlIEltYWdlIGNyZWF0ZUltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IGdldEltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJCi0JCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCWltYWdlID0gZGVzYy5jcmVhdGVJbWFnZSgpOwotCQkJLy8gZG9udCBhZGQgdGhlIG1pc3NpbmcgaW1hZ2UgZGVzY3JpcHRvciBpbWFnZSB0byB0aGUgaW1hZ2UgcmVnaXN0cnkKLQkJCWlmICghZGVzYy5lcXVhbHMoSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKSkpCi0JCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChyZXNvdXJjZSwgaW1hZ2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGRlc2NyaXB0b3IgZnJvbSB0aGUgZ2l2ZW4gaW1hZ2VGaWxlUGF0aCBhbmQgYWRkcyB0aGUKLQkgKiBpbWFnZSBkZXNjcmlwdG9yIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LiBJZiBhbiBpbWFnZQotCSAqIGRlc2NyaXB0b3IgY291bGQgbm90IGJlIGNyZWF0ZWQsIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yCi0JICogaXMgcmV0dXJuZWQgYnV0IG5vdCBhZGRlZCB0byB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2VGaWxlUGF0aAotCSAqIEByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yIGltYWdlIGRlc2NyaXB0b3IgZm9yIGltYWdlRmlsZVBhdGggb3IgZGVmYXVsdAotCSAqICAgICAgICAgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IgaWYgcmVzb3VyY2UgY291bGQgbm90IGJlIGZvdW5kCi0JICovCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpbWFnZUZpbGVQYXRoKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOSUQsIGltYWdlRmlsZVBhdGgpOwotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCWdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkucHV0KGltYWdlRmlsZVBhdGgsIGltYWdlRGVzY3JpcHRvcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0b3IvSFRNTEVkaXRvclBsdWdpbkltYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdG9yL0hUTUxFZGl0b3JQbHVnaW5JbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhMGYyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0b3IvSFRNTEVkaXRvclBsdWdpbkltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLS8qKgotICogQnVuZGxlIG9mIG1vc3QgaW1hZ2VzIHVzZWQgYnkgdGhlIEhUTUwgRWRpdG9yIHBsdWctaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzIHsgCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFCTEUgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWJsZS5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19BTkNIT1IgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctYW5jaG9yLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0JPRFkgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctYm9keS5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19CVVRUT04gPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctYnV0dG9uLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0ZPTlQgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctZm9udC5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19GT1JNID0gImljb25zL2Z1bGwvb2JqMTYvdGFnLWZvcm0uZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfR0VORVJJQyA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0hUTUwgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctaHRtbC5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19JTUFHRV9NQVAgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctaW1hZ2UtbWFwLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0lNQUdFID0gImljb25zL2Z1bGwvb2JqMTYvdGFnLWltYWdlLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0pTUCA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1qc3AuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfVEVNUExBVEUgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctdGVtcGxhdGUuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfVElUTEUgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctdGl0bGUuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUcgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWcuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dJWkJBTl9ORVdIVE1MRklMRSA9ICJpY29ucy9mdWxsL3dpemJhbi9uZXdoZmlsZV93aXoucG5nIjsJCQkvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OWI3MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLQotLyoqCi0gKiBIZWxwIGNvbnRleHQgaWRzIGZvciB0aGUgSFRNTCBTb3VyY2UgRWRpdG9yLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBjb250YWlucyBjb25zdGFudHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUhlbHBDb250ZXh0SWRzIHsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBIVE1MVUlQbHVnaW4uSUQgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIC8vIGZpZ3VyZWQgb3V0IG9uIHRoZSBmbHkKLQkvLyAvLyBIVE1MIFNvdXJjZSBwYWdlIGVkaXRvcgotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfU09VUkNFVklFV19IRUxQSUQgPQotCS8vIENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTCArIl9zb3VyY2VfSGVscElkIjsKLQkvLyAvLyROT04tTkxTLTEkCi0JCi0JLy8gSFRNTCBGaWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1BSRUZXRUJYX0ZJTEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAzMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBIVE1MIFNvdXJjZSBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1BSRUZXRUJYX1NPVVJDRV9IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMzEiOyAvLyROT04tTkxTLTEkCi0JLy8gSFRNTCBTdHlsZXMgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDMyIjsgLy8kTk9OLU5MUy0xJAotCS8vIEhUTUwgVGVtcGxhdGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfUFJFRldFQlhfVEVNUExBVEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAzMyI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JLy8gSFRNTCBDbGVhbnVwIGRpYWxvZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFOVVBfSFRNTF9IRUxQSUQgPSBQUkVGSVggKyAieG1sbTExMDAiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gSFRNTCBDb250ZW50IFNldHRpbmdzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0NPTlRFTlRfU0VUVElOR1NfSEVMUElEID0gUFJFRklYICsgIm1pc2MwMTcwIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIEhUTUwgTmV3IEZpbGUgV2l6YXJkIC0gVGVtcGxhdGUgUGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfTkVXV0laQVJEX1RFTVBMQVRFX0hFTFBJRCA9IFBSRUZJWCArICJodG1sdzAwMTAiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9oYW5kbGVycy9IVE1MRmluZE9jY3VycmVuY2VzSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvSFRNTEZpbmRPY2N1cnJlbmNlc0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ0NmFkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9oYW5kbGVycy9IVE1MRmluZE9jY3VycmVuY2VzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zZWFyY2guSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5QbGF0Zm9ybVN0YXR1c0xpbmVVdGlsOwotCi1wdWJsaWMgY2xhc3MgSFRNTEZpbmRPY2N1cnJlbmNlc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBJSGFuZGxlciB7Ci0JcHJpdmF0ZSBMaXN0IGZQcm9jZXNzb3JzOwotCi0JCi0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSUVkaXRvclBhcnQgZWRpdG9yID0gSGFuZGxlclV0aWwuZ2V0QWN0aXZlRWRpdG9yKGV2ZW50KTsKLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IG51bGw7Ci0JCWJvb2xlYW4gb2theSA9IGZhbHNlOwotCQkKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQllbHNlIHsKLQkJCU9iamVjdCBvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0JCQotCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gZ2V0VGV4dFNlbGVjdGlvbih0ZXh0RWRpdG9yKTsKLQkJCQlGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZmluZE9jY3VycmVuY2VQcm9jZXNzb3IgPSBnZXRQcm9jZXNzb3JGb3JDdXJyZW50U2VsZWN0aW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uKTsKLQkJCQlpZiAoZmluZE9jY3VycmVuY2VQcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJCQlpZiAodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJCQkJSUZpbGUgZmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgdGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0JCQkJCQlva2F5ID0gZmluZE9jY3VycmVuY2VQcm9jZXNzb3IuZmluZE9jY3VycmVuY2VzKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uLCBmaWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAob2theSkgewotCQkJLy8gY2xlYXIgc3RhdHVzIG1lc3NhZ2UKLQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gU1NFVUlNZXNzYWdlcy5GaW5kT2NjdXJyZW5jZXNBY3Rpb25Qcm92aWRlcl8wOyAvLyROT04tTkxTLTEkCi0JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuYWRkT25lVGltZUNsZWFyTGlzdGVuZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBhcHByb3ByaWF0ZSBmaW5kIG9jY3VycmVuY2VzIHByb2Nlc3NvcgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudCAtCi0JICogICAgICAgICAgICBhc3N1bWVzIG5vdCBudWxsCi0JICogQHBhcmFtIHRleHRTZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yRm9yQ3VycmVudFNlbGVjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJLy8gY2hlY2sgaWYgd2UgaGF2ZSBhbiBhY3Rpb24gdGhhdCdzIGVuYWJsZWQgb24gdGhlIGN1cnJlbnQgcGFydGl0aW9uCi0JCUlUeXBlZFJlZ2lvbiB0ciA9IGdldFBhcnRpdGlvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCVN0cmluZyBwYXJ0aXRpb24gPSB0ciAhPSBudWxsID8gdHIuZ2V0VHlwZSgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlJdGVyYXRvciBpdCA9IGdldFByb2Nlc3NvcnMoKS5pdGVyYXRvcigpOwotCQlGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgYWN0aW9uID0gbnVsbDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJYWN0aW9uID0gKEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcikgaXQubmV4dCgpOwotCQkJLy8gd2UganVzdCBjaG9vc2UgdGhlIGZpcnN0IGFjdGlvbiB0aGF0IGNhbiBoYW5kbGUgdGhlIHBhcnRpdGlvbgotCQkJaWYgKGFjdGlvbi5lbmFibGVkRm9yUGFyaXRpdGlvbihwYXJ0aXRpb24pKQotCQkJCXJldHVybiBhY3Rpb247Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgSVR5cGVkUmVnaW9uIGdldFBhcnRpdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSVR5cGVkUmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCWlmICh0ZXh0U2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmVnaW9uID0gZG9jdW1lbnQuZ2V0UGFydGl0aW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlyZWdpb24gPSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWdpb247Ci0JfQotCQotCXByaXZhdGUgSVRleHRTZWxlY3Rpb24gZ2V0VGV4dFNlbGVjdGlvbihJVGV4dEVkaXRvciB0ZXh0RWRpdG9yKSB7Ci0JCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSBudWxsOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQl0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCX0KLQkJcmV0dXJuIHRleHRTZWxlY3Rpb247Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0IGdldFByb2Nlc3NvcnMoKSB7Ci0JCWlmIChmUHJvY2Vzc29ycyA9PSBudWxsKSB7Ci0JCQlmUHJvY2Vzc29ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUhUTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgaHRtbFByb2Nlc3NvciA9IG5ldyBIVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yKCk7Ci0JCQlmUHJvY2Vzc29ycy5hZGQoaHRtbFByb2Nlc3Nvcik7Ci0JCX0KLQkJcmV0dXJuIGZQcm9jZXNzb3JzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSFRNTFVJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5MjE0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEJlbmphbWluIE11c2thbGxhLCBiLm11c2thbGxhQGdteC5uZXQgLSBbMTU4NjYwXSBjaGFyYWN0ZXIgZW50aXRpZXMgc2hvdWxkIGhhdmUgdGhlaXIgb3duIHN5bnRheCBoaWdobGlnaHRpbmcgcHJlZmVyZW5jZSAgICAgIAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0hUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5Db2xvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c1hNTDsKLQotLyoqCi0gKiBTZXRzIGRlZmF1bHQgdmFsdWVzIGZvciBIVE1MIFVJIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJQ29sb3JSZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0VGhlbWVNYW5hZ2VyKCkuZ2V0Q3VycmVudFRoZW1lKCkuZ2V0Q29sb3JSZWdpc3RyeSgpOwotCQkKLQkJc3RvcmUuc2V0RGVmYXVsdChIVE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFLCB0cnVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChIVE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFX0NPREUsICI8PSIpOy8vJE5PTi1OTFMtMSQKLQotCQkvLyBIVE1MIFN0eWxlIFByZWZlcmVuY2VzCi0JCVN0cmluZyBOT0JBQ0tHUk9VTkRCT0xEID0gIiB8IG51bGwgfCBmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIEpVU1RJVEFMSUMgPSAiIHwgbnVsbCB8IGZhbHNlIHwgdHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FLCAxMjcsIDAsIDEyNykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSwgNDIsIDAsIDI1NSkgKyBKVVNUSVRBTElDOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gIm51bGwiICsgTk9CQUNLR1JPVU5EQk9MRDsgLy8kTk9OLU5MUy0xJAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUywgc3R5bGVWYWx1ZSk7IC8vIHNwZWNpZmllZCB2YWx1ZSBpcyBibGFjazsgbGVhdmluZyBhcyB3aWRnZXQgZGVmYXVsdAotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIsIDYzLCA5NSwgMTkxKSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSLCBzdHlsZVZhbHVlKTsKLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQsIDYzLCA5NSwgMTkxKSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUiwgMCwgMTI4LCAxMjgpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FLCAwLCAwLCAxMjgpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FLCBzdHlsZVZhbHVlKTsKLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRiwgMCwgMCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQsIDEyOCwgMTI4LCAxMjgpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRiwgNjMsIDEyNywgOTUpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSAibnVsbCIgKyBOT0JBQ0tHUk9VTkRCT0xEOyAvLyROT04tTkxTLTEkCi0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5ULCBzdHlsZVZhbHVlKTsJLy8gc3BlY2lmaWVkIHZhbHVlIGlzIGJsYWNrOyBsZWF2aW5nIGFzIHdpZGdldCBkZWZhdWx0Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSLCAwLCAxMjgsIDEyOCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FLCA2MywgMTI3LCAxMjcpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSLCAwLCAxMjgsIDEyOCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSAibnVsbCIgKyBOT0JBQ0tHUk9VTkRCT0xEOyAvLyROT04tTkxTLTEkCi0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQsIHN0eWxlVmFsdWUpOwkvLyBzcGVjaWZpZWQgdmFsdWUgaXMgYmxhY2s7IGxlYXZpbmcgYXMgd2lkZ2V0IGRlZmF1bHQKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUiwgMCwgMTI4LCAxMjgpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQsIDAsIDAsIDApICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSLCAxOTEsIDk1LCA2MykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UsIDQyLCAwLCAyNTUpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuRU5USVRZX1JFRkVSRU5DRSwgc3R5bGVWYWx1ZSk7Ci0KLQkJLy8gc2V0IGRlZmF1bHQgbmV3IGh0bWwgZmlsZSB0ZW1wbGF0ZSB0byB1c2UgaW4gbmV3IGZpbGUgd2l6YXJkCi0JCS8qCi0JCSAqIE5lZWQgdG8gZmluZCB0ZW1wbGF0ZSBuYW1lIHRoYXQgZ29lcyB3aXRoIGRlZmF1bHQgdGVtcGxhdGUgaWQgKG5hbWUKLQkJICogbWF5IGNoYW5nZSBmb3IgZGlmZmVybnQgbGFuZ3VhZ2UpCi0JCSAqLwotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlU3RvcmUoKS5maW5kVGVtcGxhdGVCeUlkKCJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMuaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKQotCQkJdGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQlzdG9yZS5zZXREZWZhdWx0KEhUTUxVSVByZWZlcmVuY2VOYW1lcy5ORVdfRklMRV9URU1QTEFURV9OQU1FLCB0ZW1wbGF0ZU5hbWUpOwotCQkKLQkJLy8gRGVmYXVsdHMgZm9yIHRoZSBUeXBpbmcgcHJlZmVyZW5jZSBwYWdlCi0JCXN0b3JlLnNldERlZmF1bHQoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9DT01NRU5UUywgdHJ1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9FTkRfVEFHUywgdHJ1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19SRU1PVkVfRU5EX1RBR1MsIHRydWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSFRNTFVJUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MVUlQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJlOWM3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MVUlQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBrZXlzIGZvciBIVE1MIFVJCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MVUlQcmVmZXJlbmNlTmFtZXMgewotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGNvbnRyb2xzIGlmIGNvZGUgYXNzaXN0IGdldHMgYXV0byBhY3RpdmF0ZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19QUk9QT1NFID0gZ2V0QXV0b1Byb3Bvc2VLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBdXRvUHJvcG9zZUtleSgpIHsKLQkJcmV0dXJuICJhdXRvUHJvcG9zZSI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGhvbGRzIHRoZSBjaGFyYWN0ZXJzIHRoYXQgYXV0byBhY3RpdmF0ZSBjb2RlCi0JICogYXNzaXN0LgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4gQWxsIGNoYXJhY3RlcnMgdGhhdCB0cmlnZ2VyCi0JICogYXV0byBjb2RlIGFzc2lzdC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19QUk9QT1NFX0NPREUgPSBnZXRBdXRvUHJvcG9zZUNvZGVLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBdXRvUHJvcG9zZUNvZGVLZXkoKSB7Ci0JCXJldHVybiAiYXV0b1Byb3Bvc2VDb2RlIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSBjdXN0b21pemVkIHRlbXBsYXRlcy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFU19LRVkgPSBnZXRUZW1wbGF0ZXNLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUZW1wbGF0ZXNLZXkoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jdXN0b21fdGVtcGxhdGVzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBuZXcgSFRNTCBmaWxlIHdpemFyZC4KLQkgKiBUZW1wbGF0ZSBuYW1lIGlzIHN0b3JlZCBpbnN0ZWFkIG9mIHRlbXBsYXRlIGlkIGJlY2F1c2UgdXNlci1jcmVhdGVkCi0JICogdGVtcGxhdGVzIGRvIG5vdCBoYXZlIHRlbXBsYXRlIGlkcy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19GSUxFX1RFTVBMQVRFX05BTUUgPSAibmV3RmlsZVRlbXBsYXRlTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIHRoZSBvcHRpb24gZm9yIGF1dG8tY29tcGxldGluZyBjb21tZW50cyB3aGlsZQotCSAqIHR5cGluZy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBJTkdfQ09NUExFVEVfQ09NTUVOVFMgPSAiY29tcGxldGVDb21tZW50cyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIHRoZSBvcHRpb24gZm9yIGF1dG8tY29tcGxldGluZyBlbmQtdGFncyBhZnRlciBlbnRlcmluZwotCSAqIDxjb2RlPiZsdDsvPC9jb2RlPgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUElOR19DT01QTEVURV9FTkRfVEFHUyA9ICJjb21wbGV0ZUVuZFRhZ3MiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSB0aGUgb3B0aW9uIGZvciByZW1vdmluZyBhbiBlbmQtdGFnIGlmIHRoZSBzdGFydCB0YWcgaXMKLQkgKiBjb252ZXJ0ZWQgdG8gYW4gZW1wdHktdGFnLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUElOR19SRU1PVkVfRU5EX1RBR1MgPSAicmVtb3ZlRW5kVGFncyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0VmFsaWRhdGlvblNldHRpbmdzUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RWYWxpZGF0aW9uU2V0dGluZ3NQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlN2VjNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RWYWxpZGF0aW9uU2V0dGluZ3NQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lc3NhZ2VCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5FeHBhbnNpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5FeHBhbnNpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU2Nyb2xsZWRQYWdlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEJhc2VkIG9uIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5PcHRpb25zQ29uZmlndXJhdGlvbkJsb2NrCi0gKi8KLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsaWRhdGlvblNldHRpbmdzUGFnZSBleHRlbmRzIFByb3BlcnR5UHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBMaXN0IGZDb21ib3M7Ci0JcHJpdmF0ZSBMaXN0IGZFeHBhbmRhYmxlczsKLQkKLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGZTZWxlY3Rpb25MaXN0ZW5lcjsKLQkKLQlwcml2YXRlIElQcmVmZXJlbmNlc1NlcnZpY2UgZlByZWZlcmVuY2VzU2VydmljZSA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVFRJTkdTX0VYUEFOREVEID0gImV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgVmFsaWRhdGlvbkZyYW1ld29yayBmVmFsaWRhdGlvbjsKLQkKLQlwcml2YXRlIGNsYXNzIENvbWJvRGF0YSB7Ci0JCXByaXZhdGUgU3RyaW5nIGZLZXk7Ci0JCXByaXZhdGUgaW50W10gZlNldmVyaXRpZXM7Ci0JCXByaXZhdGUgaW50IGZJbmRleDsKLQkJaW50IG9yaWdpbmFsU2V2ZXJpdHkgPSAtMjsKLQkJCi0JCXB1YmxpYyBDb21ib0RhdGEoU3RyaW5nIGtleSwgaW50W10gc2V2ZXJpdGllcywgaW50IGluZGV4KSB7Ci0JCQlmS2V5ID0ga2V5OwotCQkJZlNldmVyaXRpZXMgPSBzZXZlcml0aWVzOwotCQkJZkluZGV4ID0gaW5kZXg7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQkJcmV0dXJuIGZLZXk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldEluZGV4KGludCBpbmRleCkgewotCQkJZkluZGV4ID0gaW5kZXg7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0JCQlyZXR1cm4gZkluZGV4OwotCQl9Ci0JCQotCQkvKioKLQkJICogU2V0cyB0aGUgc2V2ZXJpdHkgaW5kZXggYmFzZWQgb24gPGNvZGU+c2V2ZXJpdHk8L2NvZGU+LgotCQkgKiBJZiB0aGUgc2V2ZXJpdHkgZG9lc24ndCBleGlzdCwgdGhlIGluZGV4IGlzIHNldCB0byAtMS4KLQkJICogCi0JCSAqIEBwYXJhbSBzZXZlcml0eSB0aGUgc2V2ZXJpdHkgbGV2ZWwKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFNldmVyaXR5KGludCBzZXZlcml0eSkgewotCQkJZm9yKGludCBpID0gMDsgZlNldmVyaXRpZXMgIT0gbnVsbCAmJiBpIDwgZlNldmVyaXRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZihmU2V2ZXJpdGllc1tpXSA9PSBzZXZlcml0eSkgewotCQkJCQlmSW5kZXggPSBpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlmSW5kZXggPSAtMTsKLQkJfQotCQkKLQkJcHVibGljIGludCBnZXRTZXZlcml0eSgpIHsKLQkJCXJldHVybiAoZkluZGV4ID49IDAgJiYgZlNldmVyaXRpZXMgIT0gbnVsbCAmJiBmSW5kZXggPCBmU2V2ZXJpdGllcy5sZW5ndGgpID8gZlNldmVyaXRpZXNbZkluZGV4XSA6IC0xOwotCQl9Ci0JCQotCQlib29sZWFuIGlzQ2hhbmdlZCgpIHsKLQkJCXJldHVybiBmU2V2ZXJpdGllc1tmSW5kZXhdICE9IG9yaWdpbmFsU2V2ZXJpdHk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIEFic3RyYWN0VmFsaWRhdGlvblNldHRpbmdzUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJZkNvbWJvcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZkV4cGFuZGFibGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmUHJlZmVyZW5jZXNTZXJ2aWNlID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCk7Ci0JCWZWYWxpZGF0aW9uID0gVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBDb21ibyB3aWRnZXQgaW4gdGhlIGNvbXBvc2l0ZSA8Y29kZT5wYXJlbnQ8L2NvZGU+LiBUaGUgZGF0YQotCSAqIGluIHRoZSBDb21ibyBpcyBhc3NvY2lhdGVkIHdpdGggPGNvZGU+a2V5PC9jb2RlPi4gVGhlIENvbWJvIGRhdGEgaXMKLQkgKiBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlIGludGVnZXIgPGNvZGU+dmFsdWVzPC9jb2RlPiB3aGVyZSB0aGUgaW5kZXgKLQkgKiBvZiA8Y29kZT52YWx1ZXM8L2NvZGU+IGNvcnJlc3BvbmRzIHRvIHRoZSBpbmRleCBvZiA8Y29kZT52YWx1ZUxhYmVsczwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBjb21wb3NpdGUgdG8gY3JlYXRlIHRoZSBjb21ibyBib3ggaW4KLQkgKiBAcGFyYW0gbGFiZWwgdGhlIGxhYmVsIHRvIGdpdmUgdGhlIGNvbWJvIGJveAotCSAqIEBwYXJhbSBrZXkgdGhlIHVuaXF1ZSBrZXkgdG8gaWRlbnRpZnkgdGhlIGNvbWJvIGJveAotCSAqIEBwYXJhbSB2YWx1ZXMgdGhlIHZhbHVlcyByZXByZXNlbnRlZCBieSB0aGUgY29tYm8gb3B0aW9ucwotCSAqIEBwYXJhbSB2YWx1ZUxhYmVscyB0aGUgY2FsdWVzIGRpc3BsYXllZCBpbiB0aGUgY29tYm8gYm94Ci0JICogQHBhcmFtIGluZGVudCBob3cgZmFyIHRvIGluZGVudCB0aGUgY29tYm8gYm94IGxhYmVsCi0JICogCi0JICogQHJldHVybiB0aGUgZ2VuZXJhdGVkIGNvbWJvIGJveAotCSAqLwotCXByb3RlY3RlZCBDb21ibyBhZGRDb21ib0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIFN0cmluZyBrZXksIGludFtdIHZhbHVlcywgU3RyaW5nW10gdmFsdWVMYWJlbHMsIGludCBpbmRlbnQpIHsKLQkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJZ2QuaG9yaXpvbnRhbEluZGVudD0gaW5kZW50OwotCQkJCQotCQlMYWJlbCBsYWJlbENvbnRyb2w9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWxDb250cm9sLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0RGlhbG9nRm9udCgpKTsKLQkJbGFiZWxDb250cm9sLnNldFRleHQobGFiZWwpOwotCQlsYWJlbENvbnRyb2wuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQkJCi0JCUNvbWJvIGNvbWJvQm94PSBuZXdDb21ib0NvbnRyb2wocGFyZW50LCBrZXksIHZhbHVlcywgdmFsdWVMYWJlbHMpOwotCQljb21ib0JveC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQlyZXR1cm4gY29tYm9Cb3g7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21ibyBib3ggYW5kIGFzc29jaWF0ZXMgdGhlIGNvbWJvIGRhdGEgd2l0aCB0aGUKLQkgKiBjb21ibyBib3guCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZSB0aGUgY29tcG9zaXRlIHRvIGNyZWF0ZSB0aGUgY29tYm8gYm94IGluCi0JICogQHBhcmFtIGtleSB0aGUgdW5pcXVlIGtleSB0byBpZGVudGlmeSB0aGUgY29tYm8gYm94Ci0JICogQHBhcmFtIHZhbHVlcyB0aGUgdmFsdWVzIHJlcHJlc2VudGVkIGJ5IHRoZSBjb21ibyBvcHRpb25zCi0JICogQHBhcmFtIHZhbHVlTGFiZWxzIHRoZSB2YWx1ZXMgZGlzcGxheWVkIGluIHRoZSBjb21ibyBib3gKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBnZW5lcmF0ZWQgY29tYm8gYm94Ci0JICovCi0JcHJvdGVjdGVkIENvbWJvIG5ld0NvbWJvQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlLCBTdHJpbmcga2V5LCBpbnRbXSB2YWx1ZXMsIFN0cmluZ1tdIHZhbHVlTGFiZWxzKSB7Ci0JCUNvbWJvRGF0YSBkYXRhID0gbmV3IENvbWJvRGF0YShrZXksIHZhbHVlcywgLTEpOwotCQkKLQkJQ29tYm8gY29tYm9Cb3g9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotCQljb21ib0JveC5zZXRJdGVtcyh2YWx1ZUxhYmVscyk7Ci0JCWNvbWJvQm94LnNldERhdGEoZGF0YSk7Ci0JCWNvbWJvQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQljb21ib0JveC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCQkKLQkJbWFrZVNjcm9sbGFibGVDb21wb3NpdGVBd2FyZShjb21ib0JveCk7Ci0JCQotCQlpbnQgc2V2ZXJpdHkgPSAtMTsKLQkJaWYoa2V5ICE9IG51bGwpCi0JCQlzZXZlcml0eSA9IGZQcmVmZXJlbmNlc1NlcnZpY2UuZ2V0SW50KGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCksIGtleSwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORywgY3JlYXRlUHJlZmVyZW5jZVNjb3BlcygpKTsKLQotCQlpZiAoc2V2ZXJpdHkgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IgfHwgc2V2ZXJpdHkgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyB8fCBzZXZlcml0eSA9PSBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkUpIHsKLQkJCWRhdGEuc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOwotCQkJZGF0YS5vcmlnaW5hbFNldmVyaXR5ID0gc2V2ZXJpdHk7Ci0JCX0KLQkJCi0JCWlmKGRhdGEuZ2V0SW5kZXgoKSA+PSAwKQotCQkJY29tYm9Cb3guc2VsZWN0KGRhdGEuZ2V0SW5kZXgoKSk7Ci0JCQotCQlmQ29tYm9zLmFkZChjb21ib0JveCk7Ci0JCXJldHVybiBjb21ib0JveDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkxpc3RlbmVyIGdldFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlpZiAoZlNlbGVjdGlvbkxpc3RlbmVyID09IG51bGwpIHsKLQkJCWZTZWxlY3Rpb25MaXN0ZW5lcj0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJY29udHJvbENoYW5nZWQoZS53aWRnZXQpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGZTZWxlY3Rpb25MaXN0ZW5lcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY29udHJvbENoYW5nZWQoV2lkZ2V0IHdpZGdldCkgewotCQlDb21ib0RhdGEgZGF0YT0gKENvbWJvRGF0YSkgd2lkZ2V0LmdldERhdGEoKTsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIENvbWJvKSB7Ci0JCQlkYXRhLnNldEluZGV4KCgoQ29tYm8pd2lkZ2V0KS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFNldHRpbmdzUGFnZSNzdG9yZVZhbHVlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCWlmKGZDb21ib3MgPT0gbnVsbCB8fCBmQ29tYm9zLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuOwotCQkKLQkJSXRlcmF0b3IgaXQgPSBmQ29tYm9zLml0ZXJhdG9yKCk7Ci0JCQotCQlJU2NvcGVDb250ZXh0W10gY29udGV4dHMgPSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCk7Ci0KLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0JCQlDb21ib0RhdGEgZGF0YSA9IChDb21ib0RhdGEpICgoQ29tYm8paXQubmV4dCgpKS5nZXREYXRhKCk7Ci0JCQlpZihkYXRhLmdldEtleSgpICE9IG51bGwpIHsKLQkJCQljb250ZXh0c1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnB1dEludChkYXRhLmdldEtleSgpLCBkYXRhLmdldFNldmVyaXR5KCkpOwotCQkJfQotCQl9Ci0JCQotCQlmb3IoaW50IGkgPSAwOyBpIDwgY29udGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJY29udGV4dHNbaV0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5mbHVzaCgpOwotCQkJfQotCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEV4cGFuZGFibGVDb21wb3NpdGUgZ2V0UGFyZW50RXhwYW5kYWJsZUNvbXBvc2l0ZShDb250cm9sIGNvbnRyb2wpIHsKLQkJQ29udHJvbCBwYXJlbnQ9IGNvbnRyb2wuZ2V0UGFyZW50KCk7Ci0JCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIEV4cGFuZGFibGVDb21wb3NpdGUpICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQ9IHBhcmVudC5nZXRQYXJlbnQoKTsKLQkJfQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRXhwYW5kYWJsZUNvbXBvc2l0ZSkgewotCQkJcmV0dXJuIChFeHBhbmRhYmxlQ29tcG9zaXRlKSBwYXJlbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBFeHBhbmRhYmxlQ29tcG9zaXRlIGNyZWF0ZVN0eWxlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIGludCBuQ29sdW1ucykgewotCQlFeHBhbmRhYmxlQ29tcG9zaXRlIGV4Y29tcG9zaXRlPSBuZXcgRXhwYW5kYWJsZUNvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FLCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkNMSUVOVF9JTkRFTlQpOwotCQlleGNvbXBvc2l0ZS5zZXRUZXh0KGxhYmVsKTsKLQkJZXhjb21wb3NpdGUuc2V0RXhwYW5kZWQoZmFsc2UpOwotCQlleGNvbXBvc2l0ZS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldEJvbGQoSkZhY2VSZXNvdXJjZXMuRElBTE9HX0ZPTlQpKTsKLQkJZXhjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UsIG5Db2x1bW5zLCAxKSk7Ci0JCWV4Y29tcG9zaXRlLmFkZEV4cGFuc2lvbkxpc3RlbmVyKG5ldyBFeHBhbnNpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZXhwYW5zaW9uU3RhdGVDaGFuZ2VkKEV4cGFuc2lvbkV2ZW50IGUpIHsKLQkJCQlleHBhbmRlZFN0YXRlQ2hhbmdlZCgoRXhwYW5kYWJsZUNvbXBvc2l0ZSkgZS5nZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCX0pOwotCQlmRXhwYW5kYWJsZXMuYWRkKGV4Y29tcG9zaXRlKTsKLQkJbWFrZVNjcm9sbGFibGVDb21wb3NpdGVBd2FyZShleGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBleGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZXhwYW5kZWRTdGF0ZUNoYW5nZWQoRXhwYW5kYWJsZUNvbXBvc2l0ZSBleHBhbmRhYmxlKSB7Ci0JCVNjcm9sbGVkUGFnZUNvbnRlbnQgcGFyZW50U2Nyb2xsZWRDb21wb3NpdGU9IGdldFBhcmVudFNjcm9sbGVkQ29tcG9zaXRlKGV4cGFuZGFibGUpOwotCQlpZiAocGFyZW50U2Nyb2xsZWRDb21wb3NpdGUgIT0gbnVsbCkgewotCQkJcGFyZW50U2Nyb2xsZWRDb21wb3NpdGUucmVmbG93KHRydWUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBtYWtlU2Nyb2xsYWJsZUNvbXBvc2l0ZUF3YXJlKENvbnRyb2wgY29udHJvbCkgewotCQlTY3JvbGxlZFBhZ2VDb250ZW50IHBhcmVudFNjcm9sbGVkQ29tcG9zaXRlPSBnZXRQYXJlbnRTY3JvbGxlZENvbXBvc2l0ZShjb250cm9sKTsKLQkJaWYgKHBhcmVudFNjcm9sbGVkQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCXBhcmVudFNjcm9sbGVkQ29tcG9zaXRlLmFkYXB0Q2hpbGQoY29udHJvbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFNjcm9sbGVkUGFnZUNvbnRlbnQgZ2V0UGFyZW50U2Nyb2xsZWRDb21wb3NpdGUoQ29udHJvbCBjb250cm9sKSB7Ci0JCUNvbnRyb2wgcGFyZW50PSBjb250cm9sLmdldFBhcmVudCgpOwotCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBTY3JvbGxlZFBhZ2VDb250ZW50KSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50PSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNjcm9sbGVkUGFnZUNvbnRlbnQpIHsKLQkJCXJldHVybiAoU2Nyb2xsZWRQYWdlQ29udGVudCkgcGFyZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVNlY3Rpb25FeHBhbnNpb25TdGF0ZXMoSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24pIHsKLQkJZm9yKGludCBpID0gMDsgaSA8IGZFeHBhbmRhYmxlcy5zaXplKCk7IGkrKykgewotCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZSBjb21wID0gKEV4cGFuZGFibGVDb21wb3NpdGUpIGZFeHBhbmRhYmxlcy5nZXQoaSk7Ci0JCQlzZWN0aW9uLnB1dChTRVRUSU5HU19FWFBBTkRFRCArIFN0cmluZy52YWx1ZU9mKGkpLCBjb21wLmlzRXhwYW5kZWQoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZVNlY3Rpb25FeHBhbnNpb25TdGF0ZXMoSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzKSB7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBmRXhwYW5kYWJsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUV4cGFuZGFibGVDb21wb3NpdGUgZXhjb21wb3NpdGU9IChFeHBhbmRhYmxlQ29tcG9zaXRlKSBmRXhwYW5kYWJsZXMuZ2V0KGkpOwotCQkJaWYgKHNldHRpbmdzID09IG51bGwpIHsKLQkJCQlleGNvbXBvc2l0ZS5zZXRFeHBhbmRlZChpID09IDApOyAvLyBvbmx5IGV4cGFuZCB0aGUgZmlyc3Qgbm9kZSBieSBkZWZhdWx0Ci0JCQl9IGVsc2UgewotCQkJCWV4Y29tcG9zaXRlLnNldEV4cGFuZGVkKHNldHRpbmdzLmdldEJvb2xlYW4oU0VUVElOR1NfRVhQQU5ERUQgKyBTdHJpbmcudmFsdWVPZihpKSkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlc2V0U2V2ZXJpdGllcygpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBkZWZhdWx0Q29udGV4dCA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpOwotCQlmb3IoaW50IGkgPSAwOyBpIDwgZkNvbWJvcy5zaXplKCk7IGkrKykgewotCQkJQ29tYm9EYXRhIGRhdGEgPSAoQ29tYm9EYXRhKSgoQ29tYm8pZkNvbWJvcy5nZXQoaSkpLmdldERhdGEoKTsKLQkJCWludCBzZXZlcml0eSA9IGRlZmF1bHRDb250ZXh0LmdldEludChkYXRhLmdldEtleSgpLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJCWRhdGEuc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOwotCQkJKChDb21ibylmQ29tYm9zLmdldChpKSkuc2VsZWN0KGRhdGEuZ2V0SW5kZXgoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkUmV2YWxpZGF0ZU9uU2V0dGluZ3NDaGFuZ2UoKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gZkNvbWJvcy5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUNvbWJvRGF0YSBkYXRhID0gKENvbWJvRGF0YSkgKChDb21ibykgaXQubmV4dCgpKS5nZXREYXRhKCk7Ci0JCQlpZiAoZGF0YS5pc0NoYW5nZWQoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJaWYoc3VwZXIucGVyZm9ybU9rKCkgJiYgc2hvdWxkUmV2YWxpZGF0ZU9uU2V0dGluZ3NDaGFuZ2UoKSkgewotCQkJTWVzc2FnZUJveCBtYiA9IG5ldyBNZXNzYWdlQm94KHRoaXMuZ2V0U2hlbGwoKSwgU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULllFUyB8IFNXVC5OTyB8IFNXVC5DQU5DRUwgfCBTV1QuSUNPTl9JTkZPUk1BVElPTiB8IFNXVC5SSUdIVCk7Ci0JCQltYi5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlZhbGlkYXRpb25fVGl0bGUpOwotCQkJLyogQ2hvb3NlIHdoaWNoIG1lc3NhZ2UgdG8gdXNlIGJhc2VkIG9uIGlmIGl0cyBwcm9qZWN0IG9yIHdvcmtzcGFjZSBzZXR0aW5ncyAqLwotCQkJU3RyaW5nIG1zZyA9IChnZXRQcm9qZWN0KCkgPT0gbnVsbCkgPyBIVE1MVUlNZXNzYWdlcy5WYWxpZGF0aW9uX1dvcmtzcGFjZSA6IEhUTUxVSU1lc3NhZ2VzLlZhbGlkYXRpb25fUHJvamVjdDsKLQkJCW1iLnNldE1lc3NhZ2UobXNnKTsKLQkJCXN3aXRjaChtYi5vcGVuKCkpIHsKLQkJCQljYXNlIFNXVC5DQU5DRUw6Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQljYXNlIFNXVC5ZRVM6Ci0JCQkJCVZhbGlkYXRlSm9iIGpvYiA9IG5ldyBWYWxpZGF0ZUpvYihIVE1MVUlNZXNzYWdlcy5WYWxpZGF0aW9uX2pvYk5hbWUpOwotCQkJCQlqb2Iuc2NoZWR1bGUoKTsKLQkJCQljYXNlIFNXVC5OTzoKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogUGVyZm9ybXMgdmFsaWRhdGlvbiBhZnRlciB2YWxpZGF0aW9uIHByZWZlcmVuY2VzIGhhdmUgYmVlbiBtb2RpZmllZC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFZhbGlkYXRlSm9iIGV4dGVuZHMgSm9iIHsKLQkJCi0JCXB1YmxpYyBWYWxpZGF0ZUpvYihTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIobmFtZSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl0cnkgewotCQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSBudWxsOwotCQkJCS8qIENoYW5nZWQgcHJlZmVyZW5jZXMgZm9yIGEgc2luZ2xlIHByb2plY3QsIG9ubHkgdmFsaWRhdGUgaXQgKi8KLQkJCQlpZihnZXRQcm9qZWN0KCkgIT0gbnVsbCkKLQkJCQkJcHJvamVjdHMgPSBuZXcgSVByb2plY3RbXSB7Z2V0UHJvamVjdCgpfTsKLQkJCQkvKiBXb3Jrc3BhY2Utd2lkZSBwcmVmZXJlbmNlcyBjaGFuZ2VkICovCi0JCQkJZWxzZSB7Ci0JCQkJCS8qIEdldCBhbGwgb2YgdGhlIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UgKi8KLQkJCQkJcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCQkJCUlFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZnMgPSBudWxsOwotCQkJCQlMaXN0IHByb2plY3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkKLQkJCQkJLyogRmlsdGVyIG91dCBwcm9qZWN0cyB0aGF0IHVzZSBwcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzIG9yIGhhdmUgYmVlbiBjbG9zZWQgKi8KLQkJCQkJZm9yKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlwcmVmcyA9IG5ldyBQcm9qZWN0U2NvcGUocHJvamVjdHNbaV0pLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSk7Ci0JCQkJCQlpZihwcm9qZWN0c1tpXS5pc0FjY2Vzc2libGUoKSAmJiAhcHJlZnMuZ2V0Qm9vbGVhbihnZXRQcm9qZWN0U2V0dGluZ3NLZXkoKSwgZmFsc2UpKQotCQkJCQkJCXByb2plY3RMaXN0LmFkZChwcm9qZWN0c1tpXSk7Ci0JCQkJCX0KLQkJCQkJcHJvamVjdHMgPSAoSVByb2plY3RbXSkgcHJvamVjdExpc3QudG9BcnJheShuZXcgSVByb2plY3RbcHJvamVjdExpc3Quc2l6ZSgpXSk7Ci0JCQkJfQotCQkJCWZWYWxpZGF0aW9uLnZhbGlkYXRlKHByb2plY3RzLCB0cnVlLCBmYWxzZSwgbW9uaXRvcik7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCXN0YXR1cyA9IFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0VtcHR5RmlsZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzNjYTFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0VtcHR5RmlsZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvLyBHcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50KTsKLQotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBIVE1MVUlNZXNzYWdlcy5FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZV8wOyAKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKLQkJLy8gc29tZSB0aGVtZXMgb24gR1RLIGhhdmUgZGlmZmVyZW50IGJhY2tncm91bmQgY29sb3JzIGZvciBUZXh0IGFuZCBMYWJlbHMKLQkJdGV4dC5zZXRCYWNrZ3JvdW5kKGNvbXBvc2l0ZS5nZXRCYWNrZ3JvdW5kKCkpOwotCQl0ZXh0LnNldFRleHQoZGVzY3JpcHRpb24pOwotCi0JCXNldFNpemUoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVTY3JvbGxlZENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBzY3JvbGxiYXJzIGZvciB0aGlzIHBhcmVudCB3aGVuIG5lZWRlZAotCQlmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzYzEgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50LCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQlzYzEuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUoc2MxLCAxKTsKLQkJc2MxLnNldENvbnRlbnQoY29tcG9zaXRlKTsKLQotCQkvLyBub3QgY2FsbGluZyBzZXRTaXplIGZvciBjb21wb3NpdGUgd2lsbCByZXN1bHQgaW4gYSBibGFuayBjb21wb3NpdGUsCi0JCS8vIHNvIGNhbGxpbmcgaXQgaGVyZSBpbml0aWFsbHkKLQkJLy8gc2V0U2l6ZSBhY3R1YWxseSBuZWVkcyB0byBiZSBjYWxsZWQgYWZ0ZXIgYWxsIGNvbnRyb2xzIGFyZSBjcmVhdGVkLAotCQkvLyBzbyBzY3JvbGxlZENvbXBvc2l0ZQotCQkvLyBoYXMgY29ycmVjdCBtaW5TaXplCi0JCXNldFNpemUoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpZiAoY29tcG9zaXRlICE9IG51bGwpIHsKLQkJCS8vIE5vdGU6IFRoZSBmb250IGlzIHNldCBoZXJlIGluIGFudGljaXBhdGlvbiB0aGF0IHRoZSBjbGFzcyBpbmhlcml0aW5nCi0JCQkvLyAgICAgICB0aGlzIGJhc2UgY2xhc3MgbWF5IGFkZCB3aWRnZXRzIHRvIHRoZSBkaWFsb2cuICAgc2V0U2l6ZQotCQkJLy8gICAgICAgaXMgYXNzdW1lZCB0byBiZSBjYWxsZWQganVzdCBiZWZvcmUgd2UgZ28gbGl2ZS4KLQkJCWFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQkJUG9pbnQgbWluU2l6ZSA9IGNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJY29tcG9zaXRlLnNldFNpemUobWluU2l6ZSk7Ci0JCQkvLyBzZXQgc2Nyb2xsYmFyIGNvbXBvc2l0ZSdzIG1pbiBzaXplIHNvIHBhZ2UgaXMgZXhwYW5kYWJsZSBidXQKLQkJCS8vIGhhcyBzY3JvbGxiYXJzIHdoZW4gbmVlZGVkCi0JCQlpZiAoY29tcG9zaXRlLmdldFBhcmVudCgpIGluc3RhbmNlb2YgU2Nyb2xsZWRDb21wb3NpdGUpIHsKLQkJCQlTY3JvbGxlZENvbXBvc2l0ZSBzYzEgPSAoU2Nyb2xsZWRDb21wb3NpdGUpIGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLQkJCQlzYzEuc2V0TWluU2l6ZShtaW5TaXplKTsKLQkJCQlzYzEuc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLQkJCQlzYzEuc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MQ29sb3JQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MQ29sb3JQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOTlkYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTENvbG9yUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLlN0eWxlZFRleHRDb2xvclBpY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvbG9yUGFnZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSFRNTENvbG9yUGFnZSBleHRlbmRzIFhNTENvbG9yUGFnZSB7Ci0KLQkvKioKLQkgKiBTZXQgdXAgYWxsIHRoZSBzdHlsZSBwcmVmZXJlbmNlIGtleXMgaW4gdGhlIG92ZXJsYXkgc3RvcmUKLQkgKi8KLQlwcm90ZWN0ZWQgT3ZlcmxheUtleVtdIGNyZWF0ZU92ZXJsYXlTdG9yZUtleXMoKSB7Ci0JCUFycmF5TGlzdCBvdmVybGF5S2V5cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCUFycmF5TGlzdCBzdHlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWluaXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQkJSXRlcmF0b3IgaSA9IHN0eWxlTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuU1RSSU5HLCAoU3RyaW5nKWkubmV4dCgpKSk7CQotCQl9Ci0KLQkJT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10ga2V5cyA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbb3ZlcmxheUtleXMuc2l6ZSgpXTsKLQkJb3ZlcmxheUtleXMudG9BcnJheShrZXlzKTsKLQkJcmV0dXJuIGtleXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTYW1wbGVUZXh0KCkgewotCQlyZXR1cm4gSFRNTFVJTWVzc2FnZXMuU2FtcGxlX0hUTUxfZG9jOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRleHRTdHlsZU1hcChEaWN0aW9uYXJ5IGNvbnRleHRTdHlsZU1hcCkgewotCi0JCWluaXRDb21tb25Db250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQkJaW5pdERvY1R5cGVDb250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQkJLy8gRklYTUU6IHRoZXNlIHdlcmUgImJydXRlIGZvcmNlZCIgY29tbWVudGVkIG91dCB3aGVuIG1vdmluZyBYTUxKU1BSZWdpb25Db250ZXh0cwotCQkvLyBlZmZlY3QgaXMgdW5rbm93biwgYnV0IHRob3VnaHQganVzdCB0byBlZmZlY3QgcHJlZmVyZW5jZSBwYWdlCi0JCS8vY29udGV4dFN0eWxlTWFwLnB1dChYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCS8vY29udGV4dFN0eWxlTWFwLnB1dChYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQkvL2NvbnRleHRTdHlsZU1hcC5wdXQoWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfVEVYVCwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCS8vY29udGV4dFN0eWxlTWFwLnB1dChYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RGVzY3JpcHRpb25zKERpY3Rpb25hcnkgZGVzY3JpcHRpb25zKSB7Ci0KLQkJaW5pdENvbW1vbkRlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCQlpbml0RG9jVHlwZURlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRTdHlsZUxpc3QoQXJyYXlMaXN0IGxpc3QpIHsKLQkJaW5pdENvbW1vblN0eWxlTGlzdChsaXN0KTsKLQkJaW5pdERvY1R5cGVTdHlsZUxpc3QobGlzdCk7Ci0JCS8vCWxpc3QuYWRkKEhUTUxDb2xvck1hbmFnZXIuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldHVwUGlja2VyKFN0eWxlZFRleHRDb2xvclBpY2tlciBwaWNrZXIpIHsKLQkJSU1vZGVsTWFuYWdlciBtbWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCXBpY2tlci5zZXRQYXJzZXIobW1hbmFnZXIuY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTCkuZ2V0UGFyc2VyKCkpOwotCi0JCS8vIGNyZWF0ZSBkZXNjcmlwdGlvbnMgZm9yIGhpbGlnaHRpbmcgdHlwZXMKLQkJRGljdGlvbmFyeSBkZXNjcmlwdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWluaXREZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQotCQkvLyBtYXAgcmVnaW9uIHR5cGVzIHRvIGhpbGlnaHRpbmcgdHlwZXMKLQkJRGljdGlvbmFyeSBjb250ZXh0U3R5bGVNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWluaXRDb250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQotCQlBcnJheUxpc3Qgc3R5bGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbml0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0KLQkJcGlja2VyLnNldENvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCQlwaWNrZXIuc2V0RGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0JCXBpY2tlci5zZXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQotCQkvLwl1cGRhdGVQaWNrZXJGb250KHBpY2tlcik7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjLCBJSGVscENvbnRleHRJZHMuSFRNTF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQkJcmV0dXJuIGM7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjZG9HZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdENvbG9yUGFnZSNzYXZlUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVQcmVmZXJlbmNlcygpIHsKLQkJSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMjZhZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuV29ya2JlbmNoRGVmYXVsdEVuY29kaW5nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxGaWxlc1ByZWZlcmVuY2VQYWdlOwotCi1wdWJsaWMgY2xhc3MgSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBYTUxGaWxlc1ByZWZlcmVuY2VQYWdlIHsKLQlwcml2YXRlIFdvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzIGZJbnB1dEVuY29kaW5nU2V0dGluZ3MgPSBudWxsOwotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjZG9HZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCUhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gbW9kZWwKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHNjcm9sbGVkQ29tcG9zaXRlID0gY3JlYXRlU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50KTsKLQkJY3JlYXRlQ29udGVudHNGb3JDcmVhdGluZ0dyb3VwKHNjcm9sbGVkQ29tcG9zaXRlKTsKLQkJY3JlYXRlQ29udGVudHNGb3JMb2FkaW5nR3JvdXAoc2Nyb2xsZWRDb21wb3NpdGUpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2Nyb2xsZWRDb21wb3NpdGUsIElIZWxwQ29udGV4dElkcy5IVE1MX1BSRUZXRUJYX0ZJTEVTX0hFTFBJRCk7Ci0KLQkJc2V0U2l6ZShzY3JvbGxlZENvbXBvc2l0ZSk7Ci0JCWxvYWRQcmVmZXJlbmNlcygpOwotCi0JCXJldHVybiBzY3JvbGxlZENvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50c0ZvckxvYWRpbmdHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAxKTsKLQkJZ3JvdXAuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZV8wKTsKLQotCQlmSW5wdXRFbmNvZGluZ1NldHRpbmdzID0gbmV3IFdvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzKGdyb3VwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckhUTUwuQ29udGVudFR5cGVJRF9IVE1MKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQlzdXBlci5pbml0aWFsaXplVmFsdWVzKCk7Ci0JCWluaXRpYWxpemVWYWx1ZXNGb3JMb2FkaW5nR3JvdXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzRm9yTG9hZGluZ0dyb3VwKCkgewotCQlTdHJpbmcgZW5jb2RpbmcgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLklOUFVUX0NPREVTRVQpOwotCi0JCWZJbnB1dEVuY29kaW5nU2V0dGluZ3Muc2V0SUFOQVRhZyhlbmNvZGluZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJcGVyZm9ybURlZmF1bHRzRm9yTG9hZGluZ0dyb3VwKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzRm9yTG9hZGluZ0dyb3VwKCkgewotCQlTdHJpbmcgZW5jb2RpbmcgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5JTlBVVF9DT0RFU0VUKTsKLQotCQlmSW5wdXRFbmNvZGluZ1NldHRpbmdzLnNldElBTkFUYWcoZW5jb2RpbmcpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlzdXBlci5zdG9yZVZhbHVlcygpOwotCQlzdG9yZVZhbHVlc0ZvckxvYWRpbmdHcm91cCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzRm9yTG9hZGluZ0dyb3VwKCkgewotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCwgZklucHV0RW5jb2RpbmdTZXR0aW5ncy5nZXRJQU5BVGFnKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yQ3JlYXRpbmdHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRlbnRzRm9yQ3JlYXRpbmdHcm91cChwYXJlbnQpOwotCQkvLyBHcm91cCBjcmVhdGluZ0dyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAyKTsKLQkJLy8gY3JlYXRpbmdHcm91cC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkNyZWF0aW5nX2ZpbGVzKTsKLQkJLy8JCQotCQkvLyAvLyBFbmNvZGluZy4uCi0JCS8vIExhYmVsIGxhYmVsID0gY3JlYXRlTGFiZWwoY3JlYXRpbmdHcm91cCwKLQkJLy8gSFRNTFVJTWVzc2FnZXMuRW5jb2RpbmdfZGVzYyk7Ci0JCS8vICgoR3JpZERhdGEpbGFiZWwuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCS8vIGZFbmNvZGluZ1NldHRpbmdzID0gbmV3IEVuY29kaW5nU2V0dGluZ3MoY3JlYXRpbmdHcm91cCk7Ci0JCS8vICgoR3JpZERhdGEpZkVuY29kaW5nU2V0dGluZ3MuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTFNvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MU291cmNlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU3MTIwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MU291cmNlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5HcmlkRGF0YUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlTGlua0FyZWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZXMuSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MU291cmNlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VQYWdlIHsKLQlwcml2YXRlIEJ1dHRvbiBmVGFnTmFtZVVwcGVyID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBmVGFnTmFtZUxvd2VyID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBmQXR0ck5hbWVVcHBlciA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gZkF0dHJOYW1lTG93ZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBpbnQgTUlOX0lOREVOVEFUSU9OX1NJWkUgPSAwOwotCXByaXZhdGUgZmluYWwgaW50IE1BWF9JTkRFTlRBVElPTl9TSVpFID0gMTY7Ci0KLQkvLyBDb250ZW50IEFzc2lzdAotCXByaXZhdGUgQnV0dG9uIGZBdXRvUHJvcG9zZTsKLQlwcml2YXRlIExhYmVsIGZBdXRvUHJvcG9zZUxhYmVsOwotCXByaXZhdGUgVGV4dCBmQXV0b1Byb3Bvc2VUZXh0OwotCXByaXZhdGUgQnV0dG9uIGZDbGVhckFsbEJsYW5rTGluZXM7Ci0KLQkvLyBGb3JtYXR0aW5nCi0JcHJpdmF0ZSBUZXh0IGZMaW5lV2lkdGhUZXh0OwotCXByaXZhdGUgQnV0dG9uIGZTcGxpdE11bHRpQXR0cnM7Ci0JcHJpdmF0ZSBCdXR0b24gZkFsaWduRW5kQnJhY2tldDsKLQlwcml2YXRlIEJ1dHRvbiBmSW5kZW50VXNpbmdUYWJzOwotCXByaXZhdGUgQnV0dG9uIGZJbmRlbnRVc2luZ1NwYWNlczsKLQlwcml2YXRlIFNwaW5uZXIgZkluZGVudGF0aW9uU2l6ZTsKLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50c0ZvckNvbnRlbnRBc3Npc3RHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGNvbnRlbnRBc3Npc3RHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0JCWNvbnRlbnRBc3Npc3RHcm91cC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkNvbnRlbnRfYXNzaXN0X1VJXyk7Ci0KLQkJZkF1dG9Qcm9wb3NlID0gY3JlYXRlQ2hlY2tCb3goY29udGVudEFzc2lzdEdyb3VwLCBIVE1MVUlNZXNzYWdlcy5BdXRvbWF0aWNhbGx5X21ha2Vfc3VnZ2VzdF9VSV8pOwotCQkoKEdyaWREYXRhKSBmQXV0b1Byb3Bvc2UuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZBdXRvUHJvcG9zZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQlmQXV0b1Byb3Bvc2VMYWJlbCA9IGNyZWF0ZUxhYmVsKGNvbnRlbnRBc3Npc3RHcm91cCwgSFRNTFVJTWVzc2FnZXMuUHJvbXB0X3doZW5fdGhlc2VfY2hhcmFjdGVfVUlfKTsKLQkJZkF1dG9Qcm9wb3NlVGV4dCA9IGNyZWF0ZVRleHRGaWVsZChjb250ZW50QXNzaXN0R3JvdXApOwotCi0JCS8vIGFkZCBvbmUgbW9yZSBncm91cCBvZiBwcmVmZXJlbmNlcwotCQljcmVhdGVDb250ZW50c0ZvclByZWZlcnJlZENhc2VHcm91cChwYXJlbnQsIDIpOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUNvbnRlbnRzRm9yUHJlZmVycmVkQ2FzZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW5TcGFuKSB7Ci0JCUdyb3VwIGNhc2VHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgY29sdW1uU3Bhbik7Ci0JCWNhc2VHcm91cC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlByZWZlcnJlZF9tYXJrdXBfY2FzZV9VSV8pOwotCi0JCS8vIGQyNTcwNjQgbmVlZCB0byBhc3NvY2lhdGUgZ3JvdXAgdy8gcmFkaW8gYnV0dG9ucyBzbyByYWRpbyBidXR0b25zCi0JCS8vIGhlYWRlciBjYW4gYmUgcmVhZAotCQlHcm91cCB0YWdOYW1lR3JvdXAgPSBjcmVhdGVHcm91cChjYXNlR3JvdXAsIDEpOwotCQl0YWdOYW1lR3JvdXAuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5UYWdfbmFtZXNfX1VJXyk7Ci0JCWZUYWdOYW1lVXBwZXIgPSBjcmVhdGVSYWRpb0J1dHRvbih0YWdOYW1lR3JvdXAsIEhUTUxVSU1lc3NhZ2VzLlRhZ19uYW1lc19VcHBlcl9jYXNlX1VJXyk7Ci0JCWZUYWdOYW1lTG93ZXIgPSBjcmVhdGVSYWRpb0J1dHRvbih0YWdOYW1lR3JvdXAsIEhUTUxVSU1lc3NhZ2VzLlRhZ19uYW1lc19Mb3dlcl9jYXNlX1VJXyk7Ci0KLQkJLy8gZDI1NzA2NCBuZWVkIHRvIGFzc29jaWF0ZSBncm91cCB3LyByYWRpbyBidXR0b25zIHNvIHJhZGlvIGJ1dHRvbnMKLQkJLy8gaGVhZGVyIGNhbiBiZSByZWFkCi0JCUdyb3VwIGF0dHJOYW1lR3JvdXAgPSBjcmVhdGVHcm91cChjYXNlR3JvdXAsIDEpOwotCQlhdHRyTmFtZUdyb3VwLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuQXR0cmlidXRlX25hbWVzX19VSV8pOwotCQlmQXR0ck5hbWVVcHBlciA9IGNyZWF0ZVJhZGlvQnV0dG9uKGF0dHJOYW1lR3JvdXAsIEhUTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9uYW1lc19VcHBlcl9jYXNlX1VJXyk7Ci0JCWZBdHRyTmFtZUxvd2VyID0gY3JlYXRlUmFkaW9CdXR0b24oYXR0ck5hbWVHcm91cCwgSFRNTFVJTWVzc2FnZXMuQXR0cmlidXRlX25hbWVzX0xvd2VyX2Nhc2VfVUlfKTsKLQotCQlyZXR1cm4gcGFyZW50OwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yRm9ybWF0dGluZ0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgZm9ybWF0dGluZ0dyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAyKTsKLQkJZm9ybWF0dGluZ0dyb3VwLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuRm9ybWF0dGluZ19VSV8pOwotCi0JCWNyZWF0ZUxhYmVsKGZvcm1hdHRpbmdHcm91cCwgSFRNTFVJTWVzc2FnZXMuTGluZV93aWR0aF9fVUlfKTsKLQkJZkxpbmVXaWR0aFRleHQgPSBuZXcgVGV4dChmb3JtYXR0aW5nR3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlnRGF0YS53aWR0aEhpbnQgPSAyNTsKLQkJZkxpbmVXaWR0aFRleHQuc2V0TGF5b3V0RGF0YShnRGF0YSk7Ci0JCWZMaW5lV2lkdGhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCi0JCWZTcGxpdE11bHRpQXR0cnMgPSBjcmVhdGVDaGVja0JveChmb3JtYXR0aW5nR3JvdXAsIEhUTUxVSU1lc3NhZ2VzLlNwbGl0X211bHRpcGxlX2F0dHJpYnV0ZXMpOwotCQkoKEdyaWREYXRhKSBmU3BsaXRNdWx0aUF0dHJzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmQWxpZ25FbmRCcmFja2V0ID0gY3JlYXRlQ2hlY2tCb3goZm9ybWF0dGluZ0dyb3VwLCBIVE1MVUlNZXNzYWdlcy5BbGlnbl9maW5hbF9icmFja2V0KTsKLQkJKChHcmlkRGF0YSkgZkFsaWduRW5kQnJhY2tldC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkNsZWFyQWxsQmxhbmtMaW5lcyA9IGNyZWF0ZUNoZWNrQm94KGZvcm1hdHRpbmdHcm91cCwgSFRNTFVJTWVzc2FnZXMuQ2xlYXJfYWxsX2JsYW5rX2xpbmVzX1VJXyk7Ci0JCSgoR3JpZERhdGEpIGZDbGVhckFsbEJsYW5rTGluZXMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJZkluZGVudFVzaW5nVGFicyA9IGNyZWF0ZVJhZGlvQnV0dG9uKGZvcm1hdHRpbmdHcm91cCwgSFRNTFVJTWVzc2FnZXMuSW5kZW50X3VzaW5nX3RhYnMpOwotCQkoKEdyaWREYXRhKSBmSW5kZW50VXNpbmdUYWJzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCi0JCWZJbmRlbnRVc2luZ1NwYWNlcyA9IGNyZWF0ZVJhZGlvQnV0dG9uKGZvcm1hdHRpbmdHcm91cCwgSFRNTFVJTWVzc2FnZXMuSW5kZW50X3VzaW5nX3NwYWNlcyk7Ci0JCSgoR3JpZERhdGEpIGZJbmRlbnRVc2luZ1NwYWNlcy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQljcmVhdGVMYWJlbChmb3JtYXR0aW5nR3JvdXAsIEhUTUxVSU1lc3NhZ2VzLkluZGVudGF0aW9uX3NpemUpOwotCQlmSW5kZW50YXRpb25TaXplID0gbmV3IFNwaW5uZXIoZm9ybWF0dGluZ0dyb3VwLCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRUb29sVGlwVGV4dChIVE1MVUlNZXNzYWdlcy5JbmRlbnRhdGlvbl9zaXplX3RpcCk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0TWluaW11bShNSU5fSU5ERU5UQVRJT05fU0laRSk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0TWF4aW11bShNQVhfSU5ERU5UQVRJT05fU0laRSk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0SW5jcmVtZW50KDEpOwotCQlmSW5kZW50YXRpb25TaXplLnNldFBhZ2VJbmNyZW1lbnQoNCk7Ci0JCWZJbmRlbnRhdGlvblNpemUuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlmVGFnTmFtZVVwcGVyLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUdfTkFNRV9DQVNFKSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWZUYWdOYW1lTG93ZXIuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBR19OQU1FX0NBU0UpID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJZkF0dHJOYW1lVXBwZXIuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJfTkFNRV9DQVNFKSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWZBdHRyTmFtZUxvd2VyLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSkgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCi0JCXBlcmZvcm1EZWZhdWx0c0ZvckZvcm1hdHRpbmdHcm91cCgpOwotCQlwZXJmb3JtRGVmYXVsdHNGb3JDb250ZW50QXNzaXN0R3JvdXAoKTsKLQotCQl2YWxpZGF0ZVZhbHVlcygpOwotCQllbmFibGVWYWx1ZXMoKTsKLQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURlZmF1bHRzRm9yQ29udGVudEFzc2lzdEdyb3VwKCkgewotCQkvLyBDb250ZW50IEFzc2lzdAotCQlmQXV0b1Byb3Bvc2Uuc2V0U2VsZWN0aW9uKGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRCb29sZWFuKEhUTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UpKTsKLQkJZkF1dG9Qcm9wb3NlVGV4dC5zZXRUZXh0KGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRTdHJpbmcoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckZvcm1hdHRpbmdHcm91cCgpIHsKLQkJLy8gRm9ybWF0dGluZwotCQlmTGluZVdpZHRoVGV4dC5zZXRUZXh0KGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0U3RyaW5nKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKTsKLQkJZlNwbGl0TXVsdGlBdHRycy5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTKSk7Ci0JCWZBbGlnbkVuZEJyYWNrZXQuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BTElHTl9FTkRfQlJBQ0tFVCkpOwotCQlmQ2xlYXJBbGxCbGFua0xpbmVzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTKSk7Ci0KLQkJaWYgKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUikpKSB7Ci0JCQlmSW5kZW50VXNpbmdUYWJzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWZJbmRlbnRVc2luZ1NwYWNlcy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJZkluZGVudFVzaW5nU3BhY2VzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWZJbmRlbnRVc2luZ1RhYnMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQlmSW5kZW50YXRpb25TaXplLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJZlRhZ05hbWVVcHBlci5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUdfTkFNRV9DQVNFKSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWZUYWdOYW1lTG93ZXIuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSkgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlmQXR0ck5hbWVVcHBlci5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSkgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlmQXR0ck5hbWVMb3dlci5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSkgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCi0JCWluaXRpYWxpemVWYWx1ZXNGb3JGb3JtYXR0aW5nR3JvdXAoKTsKLQkJaW5pdGlhbGl6ZVZhbHVlc0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzRm9yQ29udGVudEFzc2lzdEdyb3VwKCkgewotCQkvLyBDb250ZW50IEFzc2lzdAotCQlmQXV0b1Byb3Bvc2Uuc2V0U2VsZWN0aW9uKGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oSFRNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRSkpOwotCQlmQXV0b1Byb3Bvc2VUZXh0LnNldFRleHQoZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKEhUTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0VfQ09ERSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzRm9yRm9ybWF0dGluZ0dyb3VwKCkgewotCQkvLyBGb3JtYXR0aW5nCi0JCWZMaW5lV2lkdGhUZXh0LnNldFRleHQoZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldFN0cmluZyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCWZTcGxpdE11bHRpQXR0cnMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTKSk7Ci0JCWZBbGlnbkVuZEJyYWNrZXQuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFMSUdOX0VORF9CUkFDS0VUKSk7Ci0JCWZDbGVhckFsbEJsYW5rTGluZXMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUykpOwotCi0JCWlmIChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIuZXF1YWxzKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUikpKSB7Ci0JCQlmSW5kZW50VXNpbmdUYWJzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWZJbmRlbnRVc2luZ1NwYWNlcy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJZkluZGVudFVzaW5nU3BhY2VzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWZJbmRlbnRVc2luZ1RhYnMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCi0JCWZJbmRlbnRhdGlvblNpemUuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlpZiAoZlRhZ05hbWVVcHBlci5nZXRTZWxlY3Rpb24oKSkKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUdfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWVsc2UKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUdfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCWlmIChmQXR0ck5hbWVVcHBlci5nZXRTZWxlY3Rpb24oKSkKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQllbHNlCi0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQotCQlzdG9yZVZhbHVlc0ZvckZvcm1hdHRpbmdHcm91cCgpOwotCQlzdG9yZVZhbHVlc0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9yZVZhbHVlc0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpIHsKLQkJLy8gQ29udGVudCBBc3Npc3QKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRSwgZkF1dG9Qcm9wb3NlLmdldFNlbGVjdGlvbigpKTsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFLCBmQXV0b1Byb3Bvc2VUZXh0LmdldFRleHQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzRm9yRm9ybWF0dGluZ0dyb3VwKCkgewotCQkvLyBGb3JtYXR0aW5nCi0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRILCBmTGluZVdpZHRoVGV4dC5nZXRUZXh0KCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BMSVRfTVVMVElfQVRUUlMsIGZTcGxpdE11bHRpQXR0cnMuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQUxJR05fRU5EX0JSQUNLRVQsIGZBbGlnbkVuZEJyYWNrZXQuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTLCBmQ2xlYXJBbGxCbGFua0xpbmVzLmdldFNlbGVjdGlvbigpKTsKLQotCQlpZiAoZkluZGVudFVzaW5nVGFicy5nZXRTZWxlY3Rpb24oKSkgewotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUiwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0UpOwotCQl9Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFLCBmSW5kZW50YXRpb25TaXplLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0KLQkJZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCkgewotCQlIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOyAvLyBVSQotCQlIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7IC8vIG1vZGVsCi0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuSFRNTF9QUkVGV0VCWF9TT1VSQ0VfSEVMUElEKTsKLQotCQluZXcgUHJlZmVyZW5jZUxpbmtBcmVhKGNvbXBvc2l0ZSwgU1dULldSQVAgfCBTV1QuTVVMVEksICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmVkaXRvciIsIEhUTUxVSU1lc3NhZ2VzLl9VSV9TVFJVQ1RVUkVEX1RFWFRfRURJVE9SX1BSRUZTX0xJTkssLy8kTk9OLU5MUy0xJAotCQkJCQkoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpIGdldENvbnRhaW5lcigpLCBudWxsKS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuaGludCgxNTAsIFNXVC5ERUZBVUxUKS5jcmVhdGUoKSk7Ci0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5zd3REZWZhdWx0cygpLmNyZWF0ZSgpKTsKLQotCQljcmVhdGVDb250ZW50c0ZvckZvcm1hdHRpbmdHcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVDb250ZW50c0ZvckNvbnRlbnRBc3Npc3RHcm91cChjb21wb3NpdGUpOwotCQlzZXRTaXplKGNvbXBvc2l0ZSk7Ci0JCWxvYWRQcmVmZXJlbmNlcygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlVmFsdWVzKCkgewotCQlpZiAoZkF1dG9Qcm9wb3NlICE9IG51bGwpIHsKLQkJCWlmIChmQXV0b1Byb3Bvc2UuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlmQXV0b1Byb3Bvc2VMYWJlbC5zZXRFbmFibGVkKHRydWUpOwotCQkJCWZBdXRvUHJvcG9zZVRleHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZBdXRvUHJvcG9zZUxhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWZBdXRvUHJvcG9zZVRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVZhbHVlcygpIHsKLQkJYm9vbGVhbiBpc0Vycm9yID0gZmFsc2U7Ci0JCVN0cmluZyB3aWR0aFRleHQgPSBudWxsOwotCi0JCWlmIChmTGluZVdpZHRoVGV4dCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXdpZHRoVGV4dCA9IGZMaW5lV2lkdGhUZXh0LmdldFRleHQoKTsKLQkJCQlpbnQgZm9ybWF0dGluZ0xpbmVXaWR0aCA9IEludGVnZXIucGFyc2VJbnQod2lkdGhUZXh0KTsKLQkJCQlpZiAoKGZvcm1hdHRpbmdMaW5lV2lkdGggPCBXSURUSF9WQUxJREFUSU9OX0xPV0VSX0xJTUlUKSB8fCAoZm9ybWF0dGluZ0xpbmVXaWR0aCA+IFdJRFRIX1ZBTElEQVRJT05fVVBQRVJfTElNSVQpKSB7Ci0JCQkJCXRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZXhjKSB7Ci0JCQkJc2V0SW52YWxpZElucHV0TWVzc2FnZSh3aWR0aFRleHQpOwotCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCQlpc0Vycm9yID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWludCBpbmRlbnRTaXplID0gMDsKLQkJaWYgKGZJbmRlbnRhdGlvblNpemUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpbmRlbnRTaXplID0gZkluZGVudGF0aW9uU2l6ZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoKGluZGVudFNpemUgPCBNSU5fSU5ERU5UQVRJT05fU0laRSkgfHwgKGluZGVudFNpemUgPiBNQVhfSU5ERU5UQVRJT05fU0laRSkpIHsKLQkJCQkJdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZleGMpIHsKLQkJCQlzZXRJbnZhbGlkSW5wdXRNZXNzYWdlKEludGVnZXIudG9TdHJpbmcoaW5kZW50U2l6ZSkpOwotCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCQlpc0Vycm9yID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWlmICghaXNFcnJvcikgewotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJc2V0VmFsaWQodHJ1ZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTFN5bnRheENvbG9yaW5nUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTFN5bnRheENvbG9yaW5nUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTY4MmM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxTeW50YXhDb2xvcmluZ1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuQ29sb3JTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5Db2xvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuRWRpdG9yVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c1hNTDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci0KLS8qKgotICogQSBwcmVmZXJlbmNlIHBhZ2UgdG8gY29uZmlndXJlIG91ciBYTUwgc3ludGF4IGNvbG9yLiBJdCByZXNlbWJsZXMgdGhlIEpEVAotICogYW5kIENEVCBwYWdlcyBmYXIgbW9yZSB0aGFuIG91ciBvcmlnaW5hbCBjb2xvciBwYWdlIHdoaWxlIHJldGFpbmluZyB0aGUKLSAqIGV4dHJhICJjbGljay10by1maW5kIiBmdW5jdGlvbmFsaXR5LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSFRNTFN5bnRheENvbG9yaW5nUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgQnV0dG9uIGZCb2xkOwotCXByaXZhdGUgTGFiZWwgZkZvcmVncm91bmRMYWJlbDsKLQlwcml2YXRlIExhYmVsIGZCYWNrZ3JvdW5kTGFiZWw7Ci0JcHJpdmF0ZSBCdXR0b24gZkNsZWFyU3R5bGU7Ci0JcHJpdmF0ZSBNYXAgZkNvbnRleHRUb1N0eWxlTWFwOwotCXByaXZhdGUgQ29sb3IgZkRlZmF1bHRGb3JlZ3JvdW5kID0gbnVsbDsKLQlwcml2YXRlIENvbG9yIGZEZWZhdWx0QmFja2dyb3VuZCA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIENvbG9yU2VsZWN0b3IgZkZvcmVncm91bmRDb2xvckVkaXRvcjsKLQlwcml2YXRlIENvbG9yU2VsZWN0b3IgZkJhY2tncm91bmRDb2xvckVkaXRvcjsKLQlwcml2YXRlIEJ1dHRvbiBmSXRhbGljOwotCXByaXZhdGUgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBmT3ZlcmxheVN0b3JlOwotCXByaXZhdGUgQnV0dG9uIGZTdHJpa2U7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGZTdHlsZVByZWZlcmVuY2VLZXlzOwotCXByaXZhdGUgU3RydWN0dXJlZFZpZXdlciBmU3R5bGVzVmlld2VyID0gbnVsbDsKLQlwcml2YXRlIE1hcCBmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwOwotCXByaXZhdGUgU3R5bGVkVGV4dCBmVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiBmVW5kZXJsaW5lOwotCi0JLy8gYWN0aXZhdGUgY29udHJvbHMgYmFzZWQgb24gdGhlIGdpdmVuIGxvY2FsIGNvbG9yIHR5cGUKLQlwcml2YXRlIHZvaWQgYWN0aXZhdGUoU3RyaW5nIG5hbWVkU3R5bGUpIHsKLQkJQ29sb3IgZm9yZWdyb3VuZCA9IGZEZWZhdWx0Rm9yZWdyb3VuZDsKLQkJQ29sb3IgYmFja2dyb3VuZCA9IGZEZWZhdWx0QmFja2dyb3VuZDsKLQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkgewotCQkJZkNsZWFyU3R5bGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQm9sZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZJdGFsaWMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmU3RyaWtlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZlVuZGVybGluZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZGb3JlZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQm9sZC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJZkl0YWxpYy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJZlN0cmlrZS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJZlVuZGVybGluZS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGVGb3IobmFtZWRTdHlsZSk7Ci0JCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKHRydWUpOwotCQkJZkJvbGQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZJdGFsaWMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZTdHJpa2Uuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZVbmRlcmxpbmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZGb3JlZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCYWNrZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCb2xkLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgIT0gMCk7Ci0JCQlmSXRhbGljLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBTV1QuSVRBTElDKSAhPSAwKTsKLQkJCWZTdHJpa2Uuc2V0U2VsZWN0aW9uKChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuU1RSSUtFVEhST1VHSCkgIT0gMCk7Ci0JCQlmVW5kZXJsaW5lLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlVOREVSTElORSkgIT0gMCk7Ci0JCQlpZiAoYXR0cmlidXRlLmdldEZvcmVncm91bmQoKSAhPSBudWxsKSB7Ci0JCQkJZm9yZWdyb3VuZCA9IGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCk7Ci0JCQl9Ci0JCQlpZiAoYXR0cmlidXRlLmdldEJhY2tncm91bmQoKSAhPSBudWxsKSB7Ci0JCQkJYmFja2dyb3VuZCA9IGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCk7Ci0JCQl9Ci0JCX0KLQotCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldENvbG9yVmFsdWUoZm9yZWdyb3VuZC5nZXRSR0IoKSk7Ci0JCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0Q29sb3JWYWx1ZShiYWNrZ3JvdW5kLmdldFJHQigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb2xvciB0aGUgdGV4dCBpbiB0aGUgc2FtcGxlIGFyZWEgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHByZWZlcmVuY2VzCi0JICovCi0Jdm9pZCBhcHBseVN0eWxlcygpIHsKLQkJaWYgKGZUZXh0ID09IG51bGwgfHwgZlRleHQuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gZkRvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCXdoaWxlIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkvLyBsb29rdXAgdGhlIGxvY2FsIGNvbG9yaW5nIHR5cGUgYW5kIGFwcGx5IGl0Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoU3RyaW5nKSBmQ29udGV4dFRvU3R5bGVNYXAuZ2V0KGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpKTsKLQkJCQlpZiAobmFtZWRTdHlsZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlUZXh0QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGdldEF0dHJpYnV0ZUZvcihuYW1lZFN0eWxlKTsKLQkJCQlpZiAoYXR0cmlidXRlID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCVN0eWxlUmFuZ2Ugc3R5bGUgPSBuZXcgU3R5bGVSYW5nZShkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChjdXJyZW50UmVnaW9uKSwgY3VycmVudFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCksIGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCksIGF0dHJpYnV0ZS5nZXRTdHlsZSgpKTsKLQkJCQlzdHlsZS5zdHJpa2VvdXQgPSAoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0gpICE9IDA7Ci0JCQkJc3R5bGUudW5kZXJsaW5lID0gKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkUpICE9IDA7Ci0JCQkJZlRleHQuc2V0U3R5bGVSYW5nZShzdHlsZSk7Ci0JCQl9Ci0JCQlkb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uLmdldE5leHQoKTsKLQkJfQotCX0KLQotCUJ1dHRvbiBjcmVhdGVDaGVja2JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKSk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBjb21wb3NpdGUgY29udHJvbCBhbmQgc2V0cyB0aGUgZGVmYXVsdCBsYXlvdXQgZGF0YS4KLQkgKi8KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IGZhbHNlOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0KLQkJZkRlZmF1bHRGb3JlZ3JvdW5kID0gcGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKTsKLQkJZkRlZmF1bHRCYWNrZ3JvdW5kID0gcGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKTsKLQkJQ29tcG9zaXRlIHBhZ2VDb21wb25lbnQgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50LCAyKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYWdlQ29tcG9uZW50LCBJSGVscENvbnRleHRJZHMuSFRNTF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhwYWdlQ29tcG9uZW50LCBTV1QuV1JBUCk7Ci0JCWxpbmsuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nX0xpbmspOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24ocGFyZW50LmdldFNoZWxsKCksIGUudGV4dCwgbnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyaWREYXRhIGxpbmtEYXRhPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGlua0RhdGEud2lkdGhIaW50PSAxNTA7IC8vIG9ubHkgZXhwYW5kIGZ1cnRoZXIgaWYgYW55b25lIGVsc2UgcmVxdWlyZXMgaXQKLQkJbGluay5zZXRMYXlvdXREYXRhKGxpbmtEYXRhKTsKLQotCQluZXcgTGFiZWwocGFnZUNvbXBvbmVudCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQluZXcgTGFiZWwocGFnZUNvbXBvbmVudCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCVNhc2hGb3JtIGVkaXRvciA9IG5ldyBTYXNoRm9ybShwYWdlQ29tcG9uZW50LCBTV1QuVkVSVElDQUwpOwotCQlHcmlkRGF0YSBncmlkRGF0YTIgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEyLmhvcml6b250YWxTcGFuID0gMjsKLQkJZWRpdG9yLnNldExheW91dERhdGEoZ3JpZERhdGEyKTsKLQkJU2FzaEZvcm0gdG9wID0gbmV3IFNhc2hGb3JtKGVkaXRvciwgU1dULkhPUklaT05UQUwpOwotCQlDb21wb3NpdGUgc3R5bGVFZGl0b3IgPSBjcmVhdGVDb21wb3NpdGUodG9wLCAxKTsKLQkJKChHcmlkTGF5b3V0KSBzdHlsZUVkaXRvci5nZXRMYXlvdXQoKSkubWFyZ2luUmlnaHQgPSA1OwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gMDsKLQkJY3JlYXRlTGFiZWwoc3R5bGVFZGl0b3IsIEhUTUxVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV8wKTsKLQkJZlN0eWxlc1ZpZXdlciA9IGNyZWF0ZVN0eWxlc1ZpZXdlcihzdHlsZUVkaXRvcik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZTdHlsZVRvRGVzY3JpcHRpb25NYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gTWF0aC5tYXgoZ3JpZERhdGEud2lkdGhIaW50LCBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoaXRlcmF0b3IubmV4dCgpLnRvU3RyaW5nKCkubGVuZ3RoKCkpKTsKLQkJfQotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJZlN0eWxlc1ZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJQ29tcG9zaXRlIGVkaXRpbmdDb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUodG9wLCAxKTsKLQkJKChHcmlkTGF5b3V0KSBzdHlsZUVkaXRvci5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDU7Ci0JCWNyZWF0ZUxhYmVsKGVkaXRpbmdDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlCdXR0b24gZW5hYmxlciA9IGNyZWF0ZUNoZWNrYm94KGVkaXRpbmdDb21wb3NpdGUsIEhUTUxVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV8yKTsKLQkJZW5hYmxlci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZW5hYmxlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCUNvbXBvc2l0ZSBlZGl0Q29udHJvbHMgPSBjcmVhdGVDb21wb3NpdGUoZWRpdGluZ0NvbXBvc2l0ZSwgMik7Ci0JCSgoR3JpZExheW91dCkgZWRpdENvbnRyb2xzLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gMjA7Ci0KLQkJZkZvcmVncm91bmRMYWJlbCA9IGNyZWF0ZUxhYmVsKGVkaXRDb250cm9scywgU1NFVUlNZXNzYWdlcy5Gb3JlZ3JvdW5kX1VJXyk7Ci0JCSgoR3JpZERhdGEpIGZGb3JlZ3JvdW5kTGFiZWwuZ2V0TGF5b3V0RGF0YSgpKS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5DRU5URVI7Ci0JCWZGb3JlZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvciA9IG5ldyBDb2xvclNlbGVjdG9yKGVkaXRDb250cm9scyk7Ci0JCUJ1dHRvbiBmRm9yZWdyb3VuZENvbG9yID0gZkZvcmVncm91bmRDb2xvckVkaXRvci5nZXRCdXR0b24oKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0JCWZGb3JlZ3JvdW5kQ29sb3Iuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJZkJhY2tncm91bmRMYWJlbCA9IGNyZWF0ZUxhYmVsKGVkaXRDb250cm9scywgU1NFVUlNZXNzYWdlcy5CYWNrZ3JvdW5kX1VJXyk7Ci0JCSgoR3JpZERhdGEpIGZCYWNrZ3JvdW5kTGFiZWwuZ2V0TGF5b3V0RGF0YSgpKS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5DRU5URVI7Ci0JCWZCYWNrZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJZkJhY2tncm91bmRDb2xvckVkaXRvciA9IG5ldyBDb2xvclNlbGVjdG9yKGVkaXRDb250cm9scyk7Ci0JCUJ1dHRvbiBmQmFja2dyb3VuZENvbG9yID0gZkJhY2tncm91bmRDb2xvckVkaXRvci5nZXRCdXR0b24oKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0JCWZCYWNrZ3JvdW5kQ29sb3Iuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJZkJvbGQgPSBjcmVhdGVDaGVja2JveChlZGl0Q29udHJvbHMsIEhUTUxVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV8zKTsKLQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZCb2xkLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmSXRhbGljID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBIVE1MVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfNCk7Ci0JCWZJdGFsaWMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZJdGFsaWMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZTdHJpa2UgPSBjcmVhdGVDaGVja2JveChlZGl0Q29udHJvbHMsIEhUTUxVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV81KTsKLQkJZlN0cmlrZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJKChHcmlkRGF0YSkgZlN0cmlrZS5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlVuZGVybGluZSA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywgSFRNTFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzYpOwotCQlmVW5kZXJsaW5lLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBmVW5kZXJsaW5lLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmQ2xlYXJTdHlsZSA9IG5ldyBCdXR0b24oZWRpdGluZ0NvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlmQ2xlYXJTdHlsZS5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuUmVzdG9yZV9EZWZhdWx0X1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiUmVzdG9yZSBEZWZhdWx0IgotCQlmQ2xlYXJTdHlsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HKSk7Ci0JCSgoR3JpZERhdGEpZkNsZWFyU3R5bGUuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCWZDbGVhclN0eWxlLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCUNvbXBvc2l0ZSBzYW1wbGVBcmVhID0gY3JlYXRlQ29tcG9zaXRlKGVkaXRvciwgMSk7Ci0KLQkJKChHcmlkTGF5b3V0KSBzYW1wbGVBcmVhLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gNTsKLQkJKChHcmlkTGF5b3V0KSBzYW1wbGVBcmVhLmdldExheW91dCgpKS5tYXJnaW5Ub3AgPSA1OwotCQljcmVhdGVMYWJlbChzYW1wbGVBcmVhLCBTU0VVSU1lc3NhZ2VzLlNhbXBsZV90ZXh0X19VSV8pOyAvLyROT04tTkxTLTEkID0gIiZTYW1wbGUgdGV4dDoiCi0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBuZXcgU291cmNlVmlld2VyKHNhbXBsZUFyZWEsIG51bGwsIFNXVC5CT1JERVIgfCBTV1QuTEVGVF9UT19SSUdIVCB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5SRUFEX09OTFkpOwotCQlmVGV4dCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhMyA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YTMud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDIwKTsKLQkJZ3JpZERhdGEzLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQlncmlkRGF0YTMuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhMyk7Ci0JCWZUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJZlRleHQuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRGb250KCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IikpOyAvLyROT04tTkxTLTEkCi0JCWZUZXh0LmFkZEtleUxpc3RlbmVyKGdldFRleHRLZXlMaXN0ZW5lcigpKTsKLQkJZlRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIoZ2V0VGV4dFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQlmVGV4dC5hZGRNb3VzZUxpc3RlbmVyKGdldFRleHRNb3VzZUxpc3RlbmVyKCkpOwotCQlmVGV4dC5hZGRUcmF2ZXJzZUxpc3RlbmVyKGdldFRyYXZlcnNlTGlzdGVuZXIoKSk7Ci0JCXNldEFjY2Vzc2libGUoZlRleHQsIFNTRVVJTWVzc2FnZXMuU2FtcGxlX3RleHRfX1VJXyk7Ci0JCWZEb2N1bWVudCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTCk7Ci0JCWZEb2N1bWVudC5zZXQoZ2V0RXhhbXBsZVRleHQoKSk7Ci0JCXZpZXdlci5zZXREb2N1bWVudChmRG9jdW1lbnQpOwotCi0JCXRvcC5zZXRXZWlnaHRzKG5ldyBpbnRbXXsxLCAxfSk7Ci0JCWVkaXRvci5zZXRXZWlnaHRzKG5ldyBpbnRbXXsxLCAxfSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFnZUNvbXBvbmVudCwgSUhlbHBDb250ZXh0SWRzLkhUTUxfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCk7Ci0KLQkJZlN0eWxlc1ZpZXdlci5zZXRJbnB1dChnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCkpOwotCi0JCWFwcGx5U3R5bGVzKCk7Ci0KLQkJZlN0eWxlc1ZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWlmICghZXZlbnQuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQkJYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JCQkJCWlmIChuYW1lZFN0eWxlID09IG51bGwpCi0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLmFkZExpc3RlbmVyKG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoQ29sb3JTZWxlY3Rvci5QUk9QX0NPTE9SQ0hBTkdFKSkgewotCQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzBdOwotCQkJCQkJLy8gb3BlbiBjb2xvciBkaWFsb2cgdG8gZ2V0IG5ldyBjb2xvcgotCQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gQ29sb3JIZWxwZXIudG9SR0JTdHJpbmcoZkZvcmVncm91bmRDb2xvckVkaXRvci5nZXRDb2xvclZhbHVlKCkpOwotCi0JCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCQlzdHlsZVByZWZzWzBdID0gbmV3VmFsdWU7Ci0JCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLmFkZExpc3RlbmVyKG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoQ29sb3JTZWxlY3Rvci5QUk9QX0NPTE9SQ0hBTkdFKSkgewotCQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzFdOwotCQkJCQkJLy8gb3BlbiBjb2xvciBkaWFsb2cgdG8gZ2V0IG5ldyBjb2xvcgotCQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gQ29sb3JIZWxwZXIudG9SR0JTdHJpbmcoZkJhY2tncm91bmRDb2xvckVkaXRvci5nZXRDb2xvclZhbHVlKCkpOwotCi0JCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCQlzdHlsZVByZWZzWzFdID0gbmV3VmFsdWU7Ci0JCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCQkJCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmQm9sZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkvLyBnZXQgY3VycmVudCAobmV3bHkgb2xkKSBzdHlsZQotCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzJdOwotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBTdHJpbmcudmFsdWVPZihmQm9sZC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJc3R5bGVQcmVmc1syXSA9IG5ld1ZhbHVlOwotCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmSXRhbGljLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbM107Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZJdGFsaWMuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbM10gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZlN0cmlrZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkvLyBnZXQgY3VycmVudCAobmV3bHkgb2xkKSBzdHlsZQotCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzRdOwotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBTdHJpbmcudmFsdWVPZihmU3RyaWtlLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzRdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZVbmRlcmxpbmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1s1XTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZlVuZGVybGluZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJc3R5bGVQcmVmc1s1XSA9IG5ld1ZhbHVlOwotCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCWZDbGVhclN0eWxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkudG9TdHJpbmcoKTsKLQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRUb0RlZmF1bHQobmFtZWRTdHlsZSk7Ci0JCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIHBhZ2VDb21wb25lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5XUkFQKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWxhYmVsLnNldEJhY2tncm91bmQocGFyZW50LmdldEJhY2tncm91bmQoKSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvLyBwcm90ZWN0ZWQgTGFiZWwgY3JlYXRlRGVzY3JpcHRpb25MYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JLy8gcmV0dXJuIG51bGw7Ci0JLy8gfQotCi0JLyoqCi0JICogU2V0IHVwIGFsbCB0aGUgc3R5bGUgcHJlZmVyZW5jZSBrZXlzIGluIHRoZSBvdmVybGF5IHN0b3JlCi0JICovCi0JcHJpdmF0ZSBPdmVybGF5S2V5W10gY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpIHsKLQkJTGlzdCBvdmVybGF5S2V5cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlJdGVyYXRvciBpID0gZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5TVFJJTkcsIChTdHJpbmcpIGkubmV4dCgpKSk7Ci0JCX0KLQotCQlPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbXSBrZXlzID0gbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtvdmVybGF5S2V5cy5zaXplKCldOwotCQlvdmVybGF5S2V5cy50b0FycmF5KGtleXMpOwotCQlyZXR1cm4ga2V5czsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBMaXN0IHZpZXdlciB3aGVyZSB3ZSBzZWUgdGhlIHZhcmlvdXMgc3ludGF4IGVsZW1lbnQgZGlzcGxheQotCSAqIG5hbWVzLS13b3VsZCBpdCBldmVyIGJlIGEgVHJlZSBsaWtlIEpEVCdzPwotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVmlld2VyIGNyZWF0ZVN0eWxlc1ZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVN0cnVjdHVyZWRWaWV3ZXIgc3R5bGVzVmlld2VyID0gbmV3IExpc3RWaWV3ZXIocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCXN0eWxlc1ZpZXdlci5zZXRDb21wYXJhdG9yKG5ldyBWaWV3ZXJDb21wYXJhdG9yKENvbGxhdG9yLmdldEluc3RhbmNlKCkpKTsKLQkJc3R5bGVzVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlPYmplY3QgZGVzY3JpcHRpb24gPSBmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLmdldChlbGVtZW50KTsKLQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGRlc2NyaXB0aW9uLnRvU3RyaW5nKCk7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0pOwotCQlzdHlsZXNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJVHJlZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJCXJldHVybiBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCkudG9BcnJheSgpOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBzdHlsZXNWaWV3ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGZPdmVybGF5U3RvcmUgIT0gbnVsbCkgewotCQkJZk92ZXJsYXlTdG9yZS5zdG9wKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcml2YXRlIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlRm9yKFN0cmluZyBuYW1lZFN0eWxlKSB7Ci0JCVRleHRBdHRyaWJ1dGUgdGEgPSBuZXcgVGV4dEF0dHJpYnV0ZShmRGVmYXVsdEZvcmVncm91bmQsIGZEZWZhdWx0QmFja2dyb3VuZCwgU1dULk5PUk1BTCk7Ci0KLQkJaWYgKG5hbWVkU3R5bGUgIT0gbnVsbCAmJiBmT3ZlcmxheVN0b3JlICE9IG51bGwpIHsKLQkJCS8vIG5vdGU6ICJuYW1lZFN0eWxlIiAqaXMqIHRoZSBwcmVmZXJlbmNlIGtleQotCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMF0pOwotCQkJCVJHQiBiYWNrZ3JvdW5kID0gQ29sb3JIZWxwZXIudG9SR0Ioc3R5bGVQcmVmc1sxXSk7Ci0KLQkJCQlpbnQgZm9udE1vZGlmaWVyID0gU1dULk5PUk1BTDsKLQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDIpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzJdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDMpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzNdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgU1dULklUQUxJQzsKLQkJCQl9Ci0JCQkJaWYgKHN0eWxlUHJlZnMubGVuZ3RoID4gNCkgewotCQkJCQlib29sZWFuIG9uID0gQm9vbGVhbi52YWx1ZU9mKHN0eWxlUHJlZnNbNF0pLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQlpZiAob24pCi0JCQkJCQlmb250TW9kaWZpZXIgPSBmb250TW9kaWZpZXIgfCBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJfQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDUpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzVdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkU7Ci0JCQkJfQotCi0JCQkJdGEgPSBuZXcgVGV4dEF0dHJpYnV0ZSgoZm9yZWdyb3VuZCAhPSBudWxsKSA/IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IoZm9yZWdyb3VuZCkgOiBudWxsLCAoYmFja2dyb3VuZCAhPSBudWxsKSA/IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IoYmFja2dyb3VuZCkgOiBudWxsLCBmb250TW9kaWZpZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0YTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRFeGFtcGxlVGV4dCgpIHsKLQkJcmV0dXJuIEhUTUxVSU1lc3NhZ2VzLlNhbXBsZV9IVE1MX2RvYzsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXROYW1lZFN0eWxlQXRPZmZzZXQoaW50IG9mZnNldCkgewotCQkvLyBlbnN1cmUgdGhlIG9mZnNldCBpcyBjbGVhbgotCQlpZiAob2Zmc2V0ID49IGZEb2N1bWVudC5nZXRMZW5ndGgoKSkKLQkJCXJldHVybiBnZXROYW1lZFN0eWxlQXRPZmZzZXQoZkRvY3VtZW50LmdldExlbmd0aCgpIC0gMSk7Ci0JCWVsc2UgaWYgKG9mZnNldCA8IDApCi0JCQlyZXR1cm4gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KDApOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gZkRvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCXdoaWxlIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsICYmICFkb2N1bWVudFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQlkb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uLmdldE5leHQoKTsKLQkJfQotCQlpZiAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJLy8gZmluZCB0aGUgSVRleHRSZWdpb24ncyBDb250ZXh0IGF0IHRoaXMgb2Zmc2V0Ci0JCQlJVGV4dFJlZ2lvbiBpbnRlcmVzdCA9IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlpZiAoaW50ZXJlc3QgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChvZmZzZXQgPiBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KGludGVyZXN0KSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCVN0cmluZyByZWdpb25Db250ZXh0ID0gaW50ZXJlc3QuZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvbkNvbnRleHQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCS8vIGZpbmQgdGhlIG5hbWVkIHN0eWxlIChpbnRlcm5hbC9zZWxlY3RhYmxlIG5hbWUpIGZvciB0aGF0Ci0JCQkvLyBjb250ZXh0Ci0JCQlTdHJpbmcgbmFtZWRTdHlsZSA9IChTdHJpbmcpIGZDb250ZXh0VG9TdHlsZU1hcC5nZXQocmVnaW9uQ29udGV4dCk7Ci0JCQlpZiAobmFtZWRTdHlsZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5hbWVkU3R5bGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBPdmVybGF5UHJlZmVyZW5jZVN0b3JlIGdldE92ZXJsYXlTdG9yZSgpIHsKLQkJcmV0dXJuIGZPdmVybGF5U3RvcmU7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKSB7Ci0JCWlmIChmU3R5bGVQcmVmZXJlbmNlS2V5cyA9PSBudWxsKSB7Ci0JCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYpOwotLy8JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIpOwotLy8JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUKTsKLS8vCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSKTsKLS8vCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCk7Ci0JCQlmU3R5bGVQcmVmZXJlbmNlS2V5cyA9IHN0eWxlczsKLQkJfQotCQlyZXR1cm4gZlN0eWxlUHJlZmVyZW5jZUtleXM7Ci0JfQotCi0JcHJpdmF0ZSBLZXlMaXN0ZW5lciBnZXRUZXh0S2V5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb3VzZUxpc3RlbmVyIGdldFRleHRNb3VzZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vdXNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZ2V0VGV4dFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KGUueCk7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQkoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24oZS54KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KGUueCk7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQkoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24oZS54KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmF2ZXJzZUxpc3RlbmVyIGdldFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXIja2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWlmICgoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9ORVhUKSB8fCAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUykpCi0JCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCXNldERlc2NyaXB0aW9uKFNTRVVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdfRGVzY3JpcHRpb24pOwotCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCWluaXRTdHlsZVRvRGVzY3JpcHRpb25NYXAoKTsKLQkJaW5pdFJlZ2lvbkNvbnRleHRUb1N0eWxlTWFwKCk7Ci0KLQkJZk92ZXJsYXlTdG9yZSA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlKGdldFByZWZlcmVuY2VTdG9yZSgpLCBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkpOwotCQlmT3ZlcmxheVN0b3JlLmxvYWQoKTsKLQkJZk92ZXJsYXlTdG9yZS5zdGFydCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UmVnaW9uQ29udGV4dFRvU3R5bGVNYXAoKSB7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VMRU1FTlRfREVDTEFSQVRJT04sIElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRUxFTUVOVF9ERUNMX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UsIElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFLCBJU3R5bGVDb25zdGFudHNYTUwuRU5USVRZX1JFRkVSRU5DRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfUEVfUkVGRVJFTkNFLCBJU3R5bGVDb25zdGFudHNYTUwuRU5USVRZX1JFRkVSRU5DRSk7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5ULCBJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRUxFTUVOVF9ERUNMX05BTUUsIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX05BTUUpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04sIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTl9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUMsIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRiwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1RFTSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYpOwotCi0vLwkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSKTsKLS8vCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NPTlRFTlQsIElTdHlsZUNvbnN0YW50c1hNTC5QSV9DT05URU5UKTsKLS8vCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIpOwotLy8JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCwgSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQpOwotLy8JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0U3R5bGVUb0Rlc2NyaXB0aW9uTWFwKCkgewotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIsIFhNTFVJTWVzc2FnZXMuQ29tbWVudF9EZWxpbWl0ZXJzX1VJXyk7IC8vID0KLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCwgWE1MVUlNZXNzYWdlcy5Db21tZW50X0NvbnRlbnRfVUlfKTsgLy8gPQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUiwgWE1MVUlNZXNzYWdlcy5UYWdfRGVsaW1pdGVyc19VSV8pOyAvLyA9Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSwgWE1MVUlNZXNzYWdlcy5UYWdfTmFtZXNfVUlfKTsgLy8gPQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FLCBYTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9OYW1lc19VSV8pOyAvLyA9Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLCBYTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9WYWx1ZXNfVUlfKTsgLy8gPQotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIsIFhNTFVJTWVzc2FnZXMuRGVjbGFyYXRpb25fRGVsaW1pdGVyc19VSV8pOyAvLyA9Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCwgWE1MVUlNZXNzYWdlcy5Db250ZW50X1VJXyk7IC8vID0KLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UsIFhNTFVJTWVzc2FnZXMuRW50aXR5X1JlZmVyZW5jZV9VSV8pOyAvLyROT04tTkxTLTEkID0gIkVudGl0eSBSZWZlcmVuY2VzIgotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FLCBYTUxVSU1lc3NhZ2VzLkRPQ1RZUEVfTmFtZV9VSV8pOyAvLyA9Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lELCBYTUxVSU1lc3NhZ2VzLkRPQ1RZUEVfU1lTVEVNX1BVQkxJQ19LZXl3X1VJXyk7IC8vID0KLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGLCBYTUxVSU1lc3NhZ2VzLkRPQ1RZUEVfUHVibGljX1JlZmVyZW5jZV9VSV8pOyAvLyA9Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRiwgWE1MVUlNZXNzYWdlcy5ET0NUWVBFX1N5c3RlbV9SZWZlcmVuY2VfVUlfKTsgLy8gPQotLy8JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIsIFhNTFVJTWVzc2FnZXMuUHJvY2Vzc2luZ19JbnN0cnVjdGlvbl9EZWxfVUlfKTsKLS8vCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCwgWE1MVUlNZXNzYWdlcy5Qcm9jZXNzaW5nX0luc3RydWN0aW9uX0Nvbl9VSV9fVUlfKTsKLS8vCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLkNEQVRBX0RlbGltaXRlcnNfVUlfKTsKLS8vCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCwgWE1MVUlNZXNzYWdlcy5DREFUQV9Db250ZW50X1VJXyk7Ci19Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlnZXRPdmVybGF5U3RvcmUoKS5sb2FkRGVmYXVsdHMoKTsKLQkJYXBwbHlTdHlsZXMoKTsKLQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCWFjdGl2YXRlKG51bGwpOwotCQlmVGV4dC5yZWRyYXcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWdldE92ZXJsYXlTdG9yZSgpLnByb3BhZ2F0ZSgpOwotCi0JCUhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdENvbG9yQXRPZmZzZXQoaW50IG9mZnNldCkgewotCQlTdHJpbmcgbmFtZWRTdHlsZSA9IGdldE5hbWVkU3R5bGVBdE9mZnNldChvZmZzZXQpOwotCQlpZiAobmFtZWRTdHlsZSAhPSBudWxsKSB7Ci0JCQlmU3R5bGVzVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuYW1lZFN0eWxlKSk7Ci0JCQlmU3R5bGVzVmlld2VyLnJldmVhbChuYW1lZFN0eWxlKTsKLQkJfQotCQllbHNlIHsKLQkJCWZTdHlsZXNWaWV3ZXIuc2V0U2VsZWN0aW9uKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOwotCQl9Ci0JCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCX0KLQotCS8qKgotCSAqIFNwZWNpZmljYWxseSBzZXQgdGhlIHJlcG9ydGluZyBuYW1lIG9mIGEgY29udHJvbCBmb3IgYWNjZXNzaWJpbGl0eQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRBY2Nlc3NpYmxlKENvbnRyb2wgY29udHJvbCwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGNvbnRyb2wgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZmluYWwgU3RyaW5nIG4gPSBuYW1lOwotCQljb250cm9sLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCWlmIChlLmNoaWxkSUQgPT0gQUNDLkNISUxESURfU0VMRikKLQkJCQkJZS5yZXN1bHQgPSBuOwotCQkJfQotCQl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBkMGM4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBIVE1MIHRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgSFRNTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIHsKLQkJY2xhc3MgSFRNTEVkaXRUZW1wbGF0ZURpYWxvZyBleHRlbmRzIEVkaXRUZW1wbGF0ZURpYWxvZyB7Ci0JCXB1YmxpYyBIVE1MRWRpdFRlbXBsYXRlRGlhbG9nKFNoZWxsIHBhcmVudCwgVGVtcGxhdGUgdGVtcGxhdGUsIGJvb2xlYW4gZWRpdCwgYm9vbGVhbiBpc05hbWVNb2RpZmlhYmxlLCBDb250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCQlzdXBlcihwYXJlbnQsIHRlbXBsYXRlLCBlZGl0LCBpc05hbWVNb2RpZmlhYmxlLCByZWdpc3RyeSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MKCk7Ci0KLQkJCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBJQ29udGVudEFzc2lzdGFudCBnZXRDb250ZW50QXNzaXN0YW50KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJCUNvbnRlbnRBc3Npc3RhbnQgYXNzaXN0YW50ID0gbmV3IENvbnRlbnRBc3Npc3RhbnQoKTsKLQkJCQkJYXNzaXN0YW50LmVuYWJsZUF1dG9BY3RpdmF0aW9uKHRydWUpOwotCQkJCQlhc3Npc3RhbnQuZW5hYmxlQXV0b0luc2VydCh0cnVlKTsKLQkJCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoZ2V0VGVtcGxhdGVQcm9jZXNzb3IoKSwgSURvY3VtZW50LkRFRkFVTFRfQ09OVEVOVF9UWVBFKTsKLQkJCQkJcmV0dXJuIGFzc2lzdGFudDsKLQkJCQl9Ci0JCQl9OwotCQkJcmV0dXJuIGRvQ3JlYXRlVmlld2VyKHBhcmVudCwgc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSFRNTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCUhUTUxVSVBsdWdpbiBodG1sRWRpdG9yUGx1Z2luID0gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJCi0JCXNldFByZWZlcmVuY2VTdG9yZShodG1sRWRpdG9yUGx1Z2luLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJc2V0VGVtcGxhdGVTdG9yZShodG1sRWRpdG9yUGx1Z2luLmdldFRlbXBsYXRlU3RvcmUoKSk7Ci0JCXNldENvbnRleHRUeXBlUmVnaXN0cnkoaHRtbEVkaXRvclBsdWdpbi5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0gIAkgIGJvb2xlYW4gb2sgPSBzdXBlci5wZXJmb3JtT2soKTsKLSAgCSAgSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkgIHJldHVybiBvazsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSNpc1Nob3dGb3JtYXR0ZXJTZXR0aW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Nob3dGb3JtYXR0ZXJTZXR0aW5nKCkgewotCQkvLyB0ZW1wbGF0ZSBmb3JtYXR0aW5nIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb250cm9sIGMgPSBzdXBlci5jcmVhdGVDb250ZW50cyhhbmNlc3Rvcik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYywgSUhlbHBDb250ZXh0SWRzLkhUTUxfUFJFRldFQlhfVEVNUExBVEVTX0hFTFBJRCk7Ci0JCXJldHVybiBjOwotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UjY3JlYXRlVmlld2VyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gc291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCgpOwotCi0JCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBkb0NyZWF0ZVZpZXdlcihwYXJlbnQsIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24pOwotCX0KLQotCVNvdXJjZVZpZXdlciBkb0NyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHZpZXdlckNvbmZpZ3VyYXRpb24pIHsKLQkJU291cmNlVmlld2VyIHZpZXdlciA9IG51bGw7Ci0JCVN0cmluZyBjb250ZW50VHlwZUlEID0gQ29udGVudFR5cGVJZEZvckhUTUwuQ29udGVudFR5cGVJRF9IVE1MOwotCQl2aWV3ZXIgPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXIocGFyZW50LCBudWxsLCBudWxsLCBmYWxzZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlcikuZ2V0VGV4dFdpZGdldCgpLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZE1vZGVsIHNjcmF0Y2hNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKGNvbnRlbnRUeXBlSUQpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzY3JhdGNoTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXZpZXdlci5jb25maWd1cmUodmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCXZpZXdlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZWRpdCBkaWFsb2cuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUKLQkgKiBhIGN1c3RvbSBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlCi0JICogICAgICAgICAgICB0aGUgdGVtcGxhdGUgYmVpbmcgZWRpdGVkCi0JICogQHBhcmFtIGVkaXQKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGRpYWxvZyBzaG91bGQgYmUgZWRpdGFibGUKLQkgKiBAcGFyYW0gaXNOYW1lTW9kaWZpYWJsZQotCSAqICAgICAgICAgICAgd2hldGhlciB0aGUgdGVtcGxhdGUgbmFtZSBtYXkgYmUgbW9kaWZpZWQKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIG9yIG1vZGlmaWVkIHRlbXBsYXRlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiAgICAgICAgIGVkaXRpb24gZmFpbGVkCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByb3RlY3RlZCBUZW1wbGF0ZSBlZGl0VGVtcGxhdGUoVGVtcGxhdGUgdGVtcGxhdGUsIGJvb2xlYW4gZWRpdCwgYm9vbGVhbiBpc05hbWVNb2RpZmlhYmxlKSB7Ci0JCUVkaXRUZW1wbGF0ZURpYWxvZyBkaWFsb2cgPSBuZXcgSFRNTEVkaXRUZW1wbGF0ZURpYWxvZyhnZXRTaGVsbCgpLCB0ZW1wbGF0ZSwgZWRpdCwgaXNOYW1lTW9kaWZpYWJsZSwgZ2V0Q29udGV4dFR5cGVSZWdpc3RyeSgpKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm4gZGlhbG9nLmdldFRlbXBsYXRlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTFR5cGluZ1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MVHlwaW5nUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFhMDY3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MVHlwaW5nUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MVHlwaW5nUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgQnV0dG9uIGZDbG9zZUNvbW1lbnQ7Ci0JcHJpdmF0ZSBCdXR0b24gZkNsb3NlRW5kVGFnOwotCXByaXZhdGUgQnV0dG9uIGZSZW1vdmVFbmRUYWc7Ci0JCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCQotCQljcmVhdGVBdXRvQ29tcGxldGUoY29tcG9zaXRlKTsKLQkJY3JlYXRlQXV0b1JlbW92ZShjb21wb3NpdGUpOwotCQkKLQkJc2V0U2l6ZShjb21wb3NpdGUpOwotCQlsb2FkUHJlZmVyZW5jZXMoKTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVBdXRvQ29tcGxldGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0JCQotCQlncm91cC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkhUTUxUeXBpbmdfQXV0b19Db21wbGV0ZSk7Ci0JCQotCQlmQ2xvc2VDb21tZW50ID0gY3JlYXRlQ2hlY2tCb3goZ3JvdXAsIEhUTUxVSU1lc3NhZ2VzLkhUTUxUeXBpbmdfQ29tcGxldGVfQ29tbWVudHMpOwotCQkoKEdyaWREYXRhKSBmQ2xvc2VDb21tZW50LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkKLQkJZkNsb3NlRW5kVGFnID0gY3JlYXRlQ2hlY2tCb3goZ3JvdXAsIEhUTUxVSU1lc3NhZ2VzLkhUTUxUeXBpbmdfQ29tcGxldGVfRW5kX1RhZ3MpOwotCQkoKEdyaWREYXRhKSBmQ2xvc2VFbmRUYWcuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQXV0b1JlbW92ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAyKTsKLQkJCi0JCWdyb3VwLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuSFRNTFR5cGluZ19BdXRvX1JlbW92ZSk7Ci0JCQotCQlmUmVtb3ZlRW5kVGFnID0gY3JlYXRlQ2hlY2tCb3goZ3JvdXAsIEhUTUxVSU1lc3NhZ2VzLkhUTUxUeXBpbmdfUmVtb3ZlX0VuZF9UYWdzKTsKLQkJKChHcmlkRGF0YSkgZlJlbW92ZUVuZFRhZy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIHJlc3VsdCA9IHN1cGVyLnBlcmZvcm1PaygpOwotCQkKLQkJSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWluaXRDaGVja2JveChmQ2xvc2VDb21tZW50LCBIVE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0NPTU1FTlRTKTsKLQkJaW5pdENoZWNrYm94KGZDbG9zZUVuZFRhZywgSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9FTkRfVEFHUyk7Ci0JCWluaXRDaGVja2JveChmUmVtb3ZlRW5kVGFnLCBIVE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX1JFTU9WRV9FTkRfVEFHUyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJZGVmYXVsdENoZWNrYm94KGZDbG9zZUNvbW1lbnQsIEhUTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfQ09NTUVOVFMpOwotCQlkZWZhdWx0Q2hlY2tib3goZkNsb3NlRW5kVGFnLCBIVE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0VORF9UQUdTKTsKLQkJZGVmYXVsdENoZWNrYm94KGZSZW1vdmVFbmRUYWcsIEhUTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfUkVNT1ZFX0VORF9UQUdTKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRDaGVja2JveChCdXR0b24gYm94LCBTdHJpbmcga2V5KSB7Ci0JCWlmKGJveCAhPSBudWxsICYmIGtleSAhPSBudWxsKQotCQkJYm94LnNldFNlbGVjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKGtleSkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGVmYXVsdENoZWNrYm94KEJ1dHRvbiBib3gsIFN0cmluZyBrZXkpIHsKLQkJaWYoYm94ICE9IG51bGwgJiYga2V5ICE9IG51bGwpCi0JCQlib3guc2V0U2VsZWN0aW9uKGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRCb29sZWFuKGtleSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9DT01NRU5UUywgKGZDbG9zZUNvbW1lbnQgIT0gbnVsbCkgPyBmQ2xvc2VDb21tZW50LmdldFNlbGVjdGlvbigpIDogZmFsc2UpOwotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShIVE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0VORF9UQUdTLCAoZkNsb3NlRW5kVGFnICE9IG51bGwpID8gZkNsb3NlRW5kVGFnLmdldFNlbGVjdGlvbigpIDogZmFsc2UpOwotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShIVE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX1JFTU9WRV9FTkRfVEFHUywgKGZSZW1vdmVFbmRUYWcgIT0gbnVsbCkgPyBmUmVtb3ZlRW5kVGFnLmdldFNlbGVjdGlvbigpIDogZmFsc2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NjFlMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU2Nyb2xsZWRQYWdlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGl4ZWxDb252ZXJ0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uU2V0dGluZ3NQYWdlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBTRVZFUklUSUVTID0ge1ZhbGlkYXRpb25NZXNzYWdlLkVSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HLCBWYWxpZGF0aW9uTWVzc2FnZS5JR05PUkV9OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRUSU5HU19TRUNUSU9OX05BTUUgPSAiSFRNTFZhbGlkYXRpb25TZXZlcml0aWVzIjsvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIEhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXByaXZhdGUgUGl4ZWxDb252ZXJ0ZXIgZlBpeGVsQ29udmVydGVyOwotCQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbW1vbkNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgQ29tcG9zaXRlIHBhZ2UgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQkKLQkJLy9HcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlwYWdlLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJZlBpeGVsQ29udmVydGVyID0gbmV3IFBpeGVsQ29udmVydGVyKHBhcmVudCk7Ci0JCQotCQlmaW5hbCBDb21wb3NpdGUgY29udGVudCA9IGNyZWF0ZVZhbGlkYXRpb25TZWN0aW9uKHBhZ2UpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBmUGl4ZWxDb252ZXJ0ZXIuY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygyMCk7Ci0JCWNvbnRlbnQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQlyZXR1cm4gcGFnZTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlVmFsaWRhdGlvblNlY3Rpb24oQ29tcG9zaXRlIHBhZ2UpIHsKLQkJaW50IG5Db2x1bW5zID0gMzsKLQkJCi0JCWZpbmFsIFNjcm9sbGVkUGFnZUNvbnRlbnQgc3BDb250ZW50ID0gbmV3IFNjcm9sbGVkUGFnZUNvbnRlbnQocGFnZSk7Ci0JCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3BDb250ZW50LmdldEJvZHkoKTsKLQkJCi0JCUdyaWRMYXlvdXQgbGF5b3V0PSBuZXcgR3JpZExheW91dChuQ29sdW1ucywgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0PSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGg9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCUxhYmVsIGRlc2NyaXB0aW9uID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlkZXNjcmlwdGlvbi5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlZhbGlkYXRpb25fZGVzY3JpcHRpb24pOwotCQlkZXNjcmlwdGlvbi5zZXRGb250KHBhZ2UuZ2V0Rm9udCgpKTsKLQotCQkKLQkJRXhwYW5kYWJsZUNvbXBvc2l0ZSBlYzsKLQkJQ29tcG9zaXRlIGlubmVyOwotCQlTdHJpbmcgbGFiZWw7Ci0JCQotCQlTdHJpbmdbXSBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCA9IG5ldyBTdHJpbmdbXSB7IEhUTUxVSU1lc3NhZ2VzLlZhbGlkYXRpb25fRXJyb3IsIEhUTUxVSU1lc3NhZ2VzLlZhbGlkYXRpb25fV2FybmluZywgSFRNTFVJTWVzc2FnZXMuVmFsaWRhdGlvbl9JZ25vcmUgfTsKLQkJCi0JCS8vIEVsZW1lbnQgc2VjdGlvbgotCQkKLQkJZWMgPSBjcmVhdGVTdHlsZVNlY3Rpb24oY29tcG9zaXRlLCBIVE1MVUlNZXNzYWdlcy5FeHBhbmRhYmxlX2xhYmVsX2VsZW1lbnRzLCBuQ29sdW1ucyk7Ci0JCQotCQlpbm5lciA9IG5ldyBDb21wb3NpdGUoZWMsIFNXVC5OT05FKTsKLQkJaW5uZXIuc2V0Rm9udChjb21wb3NpdGUuZ2V0Rm9udCgpKTsKLQkJaW5uZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KG5Db2x1bW5zLCBmYWxzZSkpOwotCQllYy5zZXRDbGllbnQoaW5uZXIpOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzg7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9VTktOT1dOX05BTUUsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV85OwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fSU5WQUxJRF9OQU1FLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTA7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9TVEFSVF9JTlZBTElEX0NBU0UsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xMTsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0VORF9JTlZBTElEX0NBU0UsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xMjsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX01JU1NJTkdfU1RBUlQsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xMzsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX01JU1NJTkdfRU5ELCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTQ7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9VTk5FQ0VTU0FSWV9FTkQsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xNTsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0lOVkFMSURfRElSRUNUSVZFLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMTY7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRUxFTV9JTlZBTElEX0NPTlRFTlQsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xNzsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX0RVUExJQ0FURSwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzE4OwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fQ09FWElTVEVOQ0UsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xOTsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5FTEVNX1VOQ0xPU0VEX1NUQVJUX1RBRywgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzIwOwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fVU5DTE9TRURfRU5EX1RBRywgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzIxOwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkVMRU1fSU5WQUxJRF9FTVBUWV9UQUcsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJLy8gRW5kIEVsZW1lbnQgU2VjdGlvbgotCQkKLQkJLy8gVGhlIEF0dHJpYnV0ZSB2YWxpZGF0aW9uIHNlY3Rpb24KLQkJCi0JCWVjID0gY3JlYXRlU3R5bGVTZWN0aW9uKGNvbXBvc2l0ZSwgSFRNTFVJTWVzc2FnZXMuRXhwYW5kYWJsZV9sYWJlbF9hdHRyaWJ1dGVzLCBuQ29sdW1ucyk7Ci0JCWlubmVyID0gbmV3IENvbXBvc2l0ZShlYywgU1dULk5PTkUpOwotCQlpbm5lci5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOwotCQlpbm5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQobkNvbHVtbnMsIGZhbHNlKSk7Ci0JCWVjLnNldENsaWVudChpbm5lcik7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMDsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfVU5ERUZJTkVEX05BTUUsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8xOwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9VTkRFRklORURfVkFMVUUsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yOwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJJQlVURV9OQU1FX01JU01BVENILCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMzsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfSU5WQUxJRF9OQU1FLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfNDsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfSU5WQUxJRF9WQUxVRSwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzU7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX0RVUExJQ0FURSwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzY7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUklCVVRFX1ZBTFVFX01JU01BVENILCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfNzsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVfVkFMVUVfVU5DTE9TRUQsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCS8vIEVuZCBBdHRyaWJ1dGUgc2VjdGlvbgotCQkKLQkJCi0JCS8vIERvY3VtZW50IFR5cGUKLQkJZWMgPSBjcmVhdGVTdHlsZVNlY3Rpb24oY29tcG9zaXRlLCBIVE1MVUlNZXNzYWdlcy5FeHBhbmRhYmxlX2xhYmVsX2RvY3VtZW50X3R5cGUsIG5Db2x1bW5zKTsKLQkJCi0JCWlubmVyID0gbmV3IENvbXBvc2l0ZShlYywgU1dULk5PTkUpOwotCQlpbm5lci5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOwotCQlpbm5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQobkNvbHVtbnMsIGZhbHNlKSk7Ci0JCWVjLnNldENsaWVudChpbm5lcik7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjI7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRE9DX0RVUExJQ0FURSwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzIzOwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRPQ19JTlZBTElEX0NPTlRFTlQsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yNDsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5ET0NfRE9DVFlQRV9VTkNMT1NFRCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJLy8gRW5kIERvY3VtZW50IFR5cGUKLQkJCi0JCS8vIENvbW1lbnRzCi0JCWVjID0gY3JlYXRlU3R5bGVTZWN0aW9uKGNvbXBvc2l0ZSwgSFRNTFVJTWVzc2FnZXMuRXhwYW5kYWJsZV9sYWJlbF9jb21tZW50LCBuQ29sdW1ucyk7Ci0JCQotCQlpbm5lciA9IG5ldyBDb21wb3NpdGUoZWMsIFNXVC5OT05FKTsKLQkJaW5uZXIuc2V0Rm9udChjb21wb3NpdGUuZ2V0Rm9udCgpKTsKLQkJaW5uZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KG5Db2x1bW5zLCBmYWxzZSkpOwotCQllYy5zZXRDbGllbnQoaW5uZXIpOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI3OwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTU1FTlRfSU5WQUxJRF9DT05URU5ULCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMjg7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NTUVOVF9VTkNMT1NFRCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJLy8gRW5kIENvbW1lbnRzCi0JCQotCQkKLQkJLy8gQ0RBVEEgU2VjdGlvbnMKLQkJZWMgPSBjcmVhdGVTdHlsZVNlY3Rpb24oY29tcG9zaXRlLCBIVE1MVUlNZXNzYWdlcy5FeHBhbmRhYmxlX2xhYmVsX2NkYXRhLCBuQ29sdW1ucyk7Ci0JCQotCQlpbm5lciA9IG5ldyBDb21wb3NpdGUoZWMsIFNXVC5OT05FKTsKLQkJaW5uZXIuc2V0Rm9udChjb21wb3NpdGUuZ2V0Rm9udCgpKTsKLQkJaW5uZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KG5Db2x1bW5zLCBmYWxzZSkpOwotCQllYy5zZXRDbGllbnQoaW5uZXIpOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI5OwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNEQVRBX0lOVkFMSURfQ09OVEVOVCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzMwOwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNEQVRBX1VOQ0xPU0VELCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQkvLyBFbmQgQ0RBVEEgU2VjdGlvbnMKLQkJCi0JCS8vIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb25zCi0JCWVjID0gY3JlYXRlU3R5bGVTZWN0aW9uKGNvbXBvc2l0ZSwgSFRNTFVJTWVzc2FnZXMuRXhwYW5kYWJsZV9sYWJlbF9waSwgbkNvbHVtbnMpOwotCQkKLQkJaW5uZXIgPSBuZXcgQ29tcG9zaXRlKGVjLCBTV1QuTk9ORSk7Ci0JCWlubmVyLnNldEZvbnQoY29tcG9zaXRlLmdldEZvbnQoKSk7Ci0JCWlubmVyLnNldExheW91dChuZXcgR3JpZExheW91dChuQ29sdW1ucywgZmFsc2UpKTsKLQkJZWMuc2V0Q2xpZW50KGlubmVyKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8zMTsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5QSV9JTlZBTElEX0NPTlRFTlQsIFNFVkVSSVRJRVMsIGVycm9yV2FybmluZ0lnbm9yZUxhYmVsLCAwKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8zMjsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5QSV9VTkNMT1NFRCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJLy8gRW5kIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb25zCi0JCQotCQkvLyBFbnRpdHkgUmVmZXJlbmNlcwotCQllYyA9IGNyZWF0ZVN0eWxlU2VjdGlvbihjb21wb3NpdGUsIEhUTUxVSU1lc3NhZ2VzLkV4cGFuZGFibGVfbGFiZWxfZW50aXR5X3JlZiwgbkNvbHVtbnMpOwotCQkKLQkJaW5uZXIgPSBuZXcgQ29tcG9zaXRlKGVjLCBTV1QuTk9ORSk7Ci0JCWlubmVyLnNldEZvbnQoY29tcG9zaXRlLmdldEZvbnQoKSk7Ci0JCWlubmVyLnNldExheW91dChuZXcgR3JpZExheW91dChuQ29sdW1ucywgZmFsc2UpKTsKLQkJZWMuc2V0Q2xpZW50KGlubmVyKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8zMzsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5SRUZfSU5WQUxJRF9DT05URU5ULCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQlsYWJlbCA9IEhUTUxVSU1lc3NhZ2VzLkhUTUxWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2VfMzQ7Ci0JCWFkZENvbWJvQm94KGlubmVyLCBsYWJlbCwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuUkVGX1VOREVGSU5FRCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJCi0JCS8vIEVuZCBFbnRpdHkgUmVmZXJlbmNlcwotCQkKLQkJCi0JCS8vIFRleHQgQ29udGVudAotCQllYyA9IGNyZWF0ZVN0eWxlU2VjdGlvbihjb21wb3NpdGUsIEhUTUxVSU1lc3NhZ2VzLkV4cGFuZGFibGVfbGFiZWxfdGV4dCwgbkNvbHVtbnMpOwotCQkKLQkJaW5uZXIgPSBuZXcgQ29tcG9zaXRlKGVjLCBTV1QuTk9ORSk7Ci0JCWlubmVyLnNldEZvbnQoY29tcG9zaXRlLmdldEZvbnQoKSk7Ci0JCWlubmVyLnNldExheW91dChuZXcgR3JpZExheW91dChuQ29sdW1ucywgZmFsc2UpKTsKLQkJZWMuc2V0Q2xpZW50KGlubmVyKTsKLQkJCi0JCWxhYmVsID0gSFRNTFVJTWVzc2FnZXMuSFRNTFZhbGlkYXRpb25QcmVmZXJlbmNlUGFnZV8yNTsKLQkJYWRkQ29tYm9Cb3goaW5uZXIsIGxhYmVsLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5URVhUX0lOVkFMSURfQ09OVEVOVCwgU0VWRVJJVElFUywgZXJyb3JXYXJuaW5nSWdub3JlTGFiZWwsIDApOwotCQkKLQkJbGFiZWwgPSBIVE1MVUlNZXNzYWdlcy5IVE1MVmFsaWRhdGlvblByZWZlcmVuY2VQYWdlXzI2OwotCQlhZGRDb21ib0JveChpbm5lciwgbGFiZWwsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRFWFRfSU5WQUxJRF9DSEFSLCBTRVZFUklUSUVTLCBlcnJvcldhcm5pbmdJZ25vcmVMYWJlbCwgMCk7Ci0JCQotCQkvLyBFbmQgVGV4dCBDb250ZW50Ci0JCQotCQlyZXN0b3JlU2VjdGlvbkV4cGFuc2lvblN0YXRlcyhnZXREaWFsb2dTZXR0aW5ncygpLmdldFNlY3Rpb24oU0VUVElOR1NfU0VDVElPTl9OQU1FKSk7Ci0JCQotCQlyZXR1cm4gc3BDb250ZW50OwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RTZXR0aW5nc1BhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0JCXN0b3JlVmFsdWVzKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtRGVmYXVsdHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJcmVzZXRTZXZlcml0aWVzKCk7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotCQlyZXR1cm4gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdG9yZVNlY3Rpb25FeHBhbnNpb25TdGF0ZXMoZ2V0RGlhbG9nU2V0dGluZ3MoKS5hZGROZXdTZWN0aW9uKFNFVFRJTkdTX1NFQ1RJT05fTkFNRSkpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UXVhbGlmaWVyKCkgewotCQlyZXR1cm4gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkgewotCQlyZXR1cm4gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVyZW5jZVBhZ2VJRCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy52YWxpZGF0aW9uIjsvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0U2V0dGluZ3NLZXkoKSB7Ci0JCXJldHVybiBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VU0VfUFJPSkVDVF9TRVRUSU5HUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5UGFnZUlEKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByb3BlcnR5UGFnZS5wcm9qZWN0LnZhbGlkYXRpb24iOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvUHJvcGVydHlQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvUHJvcGVydHlQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTk1Yzg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1Byb3BlcnR5UHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkNvbnRyb2xFbmFibGVTdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRlY29yYXRpbmdMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvci5SZXNvdXJjZVNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3MuVGFza1RhZ1ByZWZlcmVuY2VLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotCi0vKioKLSAqIEJhc2VkIGxvb3NlbHkgb24gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnByZWZlcmVuY2VzLlByb3BlcnR5QW5kUHJlZmVyZW5jZVBhZ2UKLSAqLwotYWJzdHJhY3QgY2xhc3MgUHJvcGVydHlQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWdQcmVmZXJlbmNlcyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL3ByZWZlcmVuY2VzLXByb3BlcnRpZXMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qCi0JICogRGlzYWJsZSBsaW5rIGRhdGEsIHByZXZlbnRzIHRoZSBkaXNwbGF5IG9mIGEgIndvcmtzcGFjZSIgb3IgInByb2plY3QiCi0JICogc2V0dGluZ3MgbGluayB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBkaWFsb2cgbGF1bmNoaW5nCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IERJU0FCTEVfTElOSyA9ICJESVNBQkxFX0xJTksiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE1hcCBmRGF0YSA9IG51bGw7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmRW5hYmxlUHJvamVjdFNldHRpbmdzOwotCi0JcHJpdmF0ZSBMaW5rIGZQcm9qZWN0U2V0dGluZ3NMaW5rOwotCQotCXByaXZhdGUgQ29udHJvbCBmQ29tbW9uOwotCQotCXByaXZhdGUgQ29udHJvbEVuYWJsZVN0YXRlIGZFbmFibGVtZW50czsKLQotCXB1YmxpYyBQcm9wZXJ0eVByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIGFwcGx5RGF0YShPYmplY3QgZGF0YSkgewotCQlzdXBlci5hcHBseURhdGEoZGF0YSk7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgTWFwKSB7Ci0JCQlmRGF0YSA9IChNYXApIGRhdGE7Ci0JCQl1cGRhdGVMaW5rRW5hYmxlbWVudCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbnRyb2wgY3JlYXRlQ29tbW9uQ29udGVudHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSk7Ci0KLQlwdWJsaWMgZmluYWwgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCUNvbXBvc2l0ZSBjaGVja0xpbmtDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljaGVja0xpbmtDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCWNoZWNrTGlua0NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQlpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCWZFbmFibGVQcm9qZWN0U2V0dGluZ3MgPSBuZXcgQnV0dG9uKGNoZWNrTGlua0NvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJCWZFbmFibGVQcm9qZWN0U2V0dGluZ3Muc2V0VGV4dChTU0VVSU1lc3NhZ2VzLkVuYWJsZVByb2plY3RTZXR0aW5ncyk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQlmRW5hYmxlUHJvamVjdFNldHRpbmdzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQkJYm9vbGVhbiBlbmFibGVkRm9yUHJvamVjdCA9IGNyZWF0ZVByZWZlcmVuY2VTY29wZXMoKVswXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLmdldEJvb2xlYW4oZ2V0UHJvamVjdFNldHRpbmdzS2V5KCksIGZhbHNlKTsKLQkJCWZFbmFibGVQcm9qZWN0U2V0dGluZ3Muc2V0U2VsZWN0aW9uKGVuYWJsZWRGb3JQcm9qZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxhYmVsIHNwYWNlciA9IG5ldyBMYWJlbChjaGVja0xpbmtDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCQlzcGFjZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCX0KLQotCQlmUHJvamVjdFNldHRpbmdzTGluayA9IG5ldyBMaW5rKGNoZWNrTGlua0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlmUHJvamVjdFNldHRpbmdzTGluay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuQkVHSU5OSU5HLCB0cnVlLCBmYWxzZSkpOwotCi0JCS8qCi0JCSAqICJlbGVtZW50IiBzaG91bGQgYmUgYSBwcm9qZWN0LCBpZiBudWxsLCBsaW5rIHRvIHBlci1wcm9qZWN0Ci0JCSAqIHByb3BlcnRpZXMKLQkJICovCi0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJZlByb2plY3RTZXR0aW5nc0xpbmsuc2V0VGV4dCgiPGE+IiArIFNTRVVJTWVzc2FnZXMuQ29uZmlndXJlV29ya3NwYWNlU2V0dGluZ3MgKyAiPC9hPiIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVsc2UgewotCQkJZlByb2plY3RTZXR0aW5nc0xpbmsuc2V0VGV4dCgiPGE+IiArIFNTRVVJTWVzc2FnZXMuQ29uZmlndXJlUHJvamVjdFNldHRpbmdzICsgIjwvYT4iKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXVwZGF0ZUxpbmtFbmFibGVtZW50KCk7Ci0KLQkJZlByb2plY3RTZXR0aW5nc0xpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChnZXRQcm9qZWN0KCkgPT0gbnVsbCkgewotCQkJCQlvcGVuUHJvamVjdFNldHRpbmdzKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlvcGVuV29ya3NwYWNlU2V0dGluZ3MoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJaWYgKGdldFByb2plY3QoKSAhPSBudWxsKSB7Ci0JCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJCWxpbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCX0KLQotLy8JCWZpbmFsIENvbnRyb2wgY29tbW9uID0gY3JlYXRlQ29tbW9uQ29udGVudHMoY29tcG9zaXRlKTsKLQkJZkNvbW1vbiA9IGNyZWF0ZUNvbW1vbkNvbnRlbnRzKGNvbXBvc2l0ZSk7Ci0JCQotCQlmQ29tbW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCWlmIChmRW5hYmxlUHJvamVjdFNldHRpbmdzICE9IG51bGwpIHsKLQkJCVNlbGVjdGlvbkFkYXB0ZXIgc2VsZWN0aW9uQWRhcHRlciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJCWVuYWJsZVByZWZlcmVuY2VDb250ZW50KGZFbmFibGVQcm9qZWN0U2V0dGluZ3MuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX07Ci0JCQlzZWxlY3Rpb25BZGFwdGVyLndpZGdldFNlbGVjdGVkKG51bGwpOwotCQkJZkVuYWJsZVByb2plY3RTZXR0aW5ncy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25BZGFwdGVyKTsKLQkJfQotCQkKLQkJYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIElTY29wZUNvbnRleHRbXSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElTY29wZUNvbnRleHRbXXtuZXcgUHJvamVjdFNjb3BlKHByb2plY3QpLCBuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OwotCQl9Ci0JCXJldHVybiBuZXcgSVNjb3BlQ29udGV4dFtde25ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlEKCk7Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJaWYgKGdldEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQlyZXR1cm4gKElQcm9qZWN0KSBnZXRFbGVtZW50KCk7Ci0JCQl9Ci0JCQlPYmplY3QgYWRhcHRlciA9IGdldEVsZW1lbnQoKS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQlyZXR1cm4gKElQcm9qZWN0KSBhZGFwdGVyOwotCQkJfQotCQkJYWRhcHRlciA9IGdldEVsZW1lbnQoKS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJcmV0dXJuIChJUHJvamVjdCkgYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFByb2plY3RTZXR0aW5nc0tleSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcm9wZXJ0eVBhZ2VJRCgpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbGVtZW50U2V0dGluZ3NFbmFibGVkKCkgewotCQlyZXR1cm4gZkVuYWJsZVByb2plY3RTZXR0aW5ncyAhPSBudWxsICYmIGZFbmFibGVQcm9qZWN0U2V0dGluZ3MuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0Jdm9pZCBvcGVuUHJvamVjdFNldHRpbmdzKCkgewotCQlMaXN0RGlhbG9nIGRpYWxvZyA9IG5ldyBMaXN0RGlhbG9nKGdldFNoZWxsKCkpIHsKLQotCQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQkJQ29udHJvbCBhcmVhID0gc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShjb250YWluZXIpOwotCQkJCWdldFRhYmxlVmlld2VyKCkuc2V0U29ydGVyKG5ldyBSZXNvdXJjZVNvcnRlcihSZXNvdXJjZVNvcnRlci5OQU1FKSk7Ci0JCQkJcmV0dXJuIGFyZWE7Ci0JCQl9Ci0JCX07Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKFNTRVVJTWVzc2FnZXMuUHJvcGVydHlQcmVmZXJlbmNlUGFnZV8wMik7Ci0JCWRpYWxvZy5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChJV29ya3NwYWNlKSBpbnB1dEVsZW1lbnQpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQkJfSk7Ci0JCWRpYWxvZy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcihuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCkpKTsKLQkJZGlhbG9nLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKSk7Ci0JCWRpYWxvZy5zZXRUaXRsZShTU0VVSU1lc3NhZ2VzLlByb3BlcnR5UHJlZmVyZW5jZVBhZ2VfMDEpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCU9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJCWlmIChyZXN1bHQubGVuZ3RoID4gMCkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJCQlNYXAgZGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJZGF0YS5wdXQoRElTQUJMRV9MSU5LLCBCb29sZWFuLlRSVUUpOwotCQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcm9wZXJ0eURpYWxvZ09uKGdldFNoZWxsKCksIHByb2plY3QsIGdldFByb3BlcnR5UGFnZUlEKCksIG5ldyBTdHJpbmdbXXtnZXRQcm9wZXJ0eVBhZ2VJRCgpfSwgZGF0YSkub3BlbigpOwotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCBvcGVuV29ya3NwYWNlU2V0dGluZ3MoKSB7Ci0JCU1hcCBkYXRhID0gbmV3IEhhc2hNYXAoKTsKLQkJZGF0YS5wdXQoRElTQUJMRV9MSU5LLCBCb29sZWFuLlRSVUUpOwotCQlQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIGdldFByZWZlcmVuY2VQYWdlSUQoKSwgbmV3IFN0cmluZ1tde2dldFByZWZlcmVuY2VQYWdlSUQoKX0sIGRhdGEpLm9wZW4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gb2sgPSBzdXBlci5wZXJmb3JtT2soKTsKLQkJSVNjb3BlQ29udGV4dFtdIHByZWZlcmVuY2VTY29wZXMgPSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCk7Ci0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJaWYgKGlzRWxlbWVudFNldHRpbmdzRW5hYmxlZCgpKSB7Ci0JCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgc2V0dGluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BFUl9QUk9KRUNUICsgIiAoIiArIHRydWUgKyAiKSBpbiBzY29wZSAiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROYW1lKCkgKyAiOiIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkICAKLQkJCQl9Ci0JCQkJcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnB1dEJvb2xlYW4oZ2V0UHJvamVjdFNldHRpbmdzS2V5KCksIGZFbmFibGVQcm9qZWN0U2V0dGluZ3MuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgcmVtb3ZpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QRVJfUFJPSkVDVCArICIgZnJvbSBzY29wZSAiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROYW1lKCkgKyAiOiIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJfQotCQkJCXByZWZlcmVuY2VTY29wZXNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5yZW1vdmUoZ2V0UHJvamVjdFNldHRpbmdzS2V5KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBvazsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlpZihnZXRQcm9qZWN0KCkgIT0gbnVsbCAmJiBmRW5hYmxlUHJvamVjdFNldHRpbmdzICE9IG51bGwpIHsKLQkJCWZFbmFibGVQcm9qZWN0U2V0dGluZ3Muc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWVuYWJsZVByZWZlcmVuY2VDb250ZW50KGZhbHNlKTsKLQkJfQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlTGlua0VuYWJsZW1lbnQoKSB7Ci0JCWlmIChmRGF0YSAhPSBudWxsICYmIGZQcm9qZWN0U2V0dGluZ3NMaW5rICE9IG51bGwpIHsKLQkJCWZQcm9qZWN0U2V0dGluZ3NMaW5rLnNldEVuYWJsZWQoIUJvb2xlYW4uVFJVRS5lcXVhbHMoZkRhdGEuZ2V0KERJU0FCTEVfTElOSykpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb250cm9scyB0aGUgZW5hYmxlbWVudCBvZiB0aGUgY29tbW9uIGNvbnRlbnQgcmVnaW9uCi0JICogb2YgYSBwcm9wZXJ0eSBvciBwcmVmZXJlbmNlIHBhZ2UKLQkgKiAKLQkgKiBAcGFyYW0gZW5hYmxlIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoZSBjb21tb24gY29udGVudAotCSAqIGFyZWEKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVQcmVmZXJlbmNlQ29udGVudChib29sZWFuIGVuYWJsZSkgewotCQlpZihlbmFibGUpIHsKLQkJCWlmKGZFbmFibGVtZW50cyAhPSBudWxsKSB7Ci0JCQkJZkVuYWJsZW1lbnRzLnJlc3RvcmUoKTsKLQkJCQlmRW5hYmxlbWVudHMgPSBudWxsOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYoZkVuYWJsZW1lbnRzID09IG51bGwpCi0JCQkJZkVuYWJsZW1lbnRzID0gQ29udHJvbEVuYWJsZVN0YXRlLmRpc2FibGUoZkNvbW1vbik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNzNiYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDb250YWlucyBhIHNldCBvZiBwcm9qZWN0aW9uIG1vZGVsIGFkZGl0aW9ucy9kZWxldGlvbnMvbW9kaWZpY2F0aW9ucwotICovCi1jbGFzcyBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgbG9jYXRlZCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JcHJpdmF0ZSBOb2RlIGZOb2RlOwotCXByaXZhdGUgQW5ub3RhdGlvbltdIGZEZWxldGlvbnM7Ci0JcHJpdmF0ZSBNYXAgZkFkZGl0aW9uczsKLQlwcml2YXRlIEFubm90YXRpb25bXSBmTW9kaWZpY2F0aW9uczsKLQotCXB1YmxpYyBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhOb2RlIG5vZGUsIEFubm90YXRpb25bXSBkZWxldGlvbnMsIE1hcCBhZGRpdGlvbnMsIEFubm90YXRpb25bXSBtb2RpZmljYXRpb25zKSB7Ci0JCWZOb2RlID0gbm9kZTsKLQkJZkRlbGV0aW9ucyA9IGRlbGV0aW9uczsKLQkJZkFkZGl0aW9ucyA9IGFkZGl0aW9uczsKLQkJZk1vZGlmaWNhdGlvbnMgPSBtb2RpZmljYXRpb25zOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0QWRkaXRpb25zKCkgewotCQlyZXR1cm4gZkFkZGl0aW9uczsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbltdIGdldERlbGV0aW9ucygpIHsKLQkJcmV0dXJuIGZEZWxldGlvbnM7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb25bXSBnZXRNb2RpZmljYXRpb25zKCkgewotCQlyZXR1cm4gZk1vZGlmaWNhdGlvbnM7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIGZOb2RlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NzUyYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIFRvbSBUdXJyZWxsLUNyb2Z0LCBsZWZ0QHVsdHJhc2lzLmNvbSAtIFsxNzQzMDddIEVuYWJsZSBmb2xkaW5nIGZvciBkaXYgdGFncyBpbiBKU1AgYW5kIEhUTUwgZmlsZXMgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBsb2NhdGVkIGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb24KLQotCS8qKgotCSAqIExpc3Qgb2YgcHJvamVjdGlvbiB2aWV3ZXJzIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9qZWN0aW9uCi0JICogbW9kZWwgbm9kZSBhZGFwdGVyIGZhY3RvcnkuCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGZQcm9qZWN0aW9uVmlld2VyczsKLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwoT2JqZWN0IGFkYXB0ZXJLZXkpIHsKLQkJc3VwZXIoYWRhcHRlcktleSk7Ci0JfQotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwoKSB7Ci0JCXRoaXMoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBBY3R1YWxseSBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSBwYXJlbnQgb2YgdGFyZ2V0IGlmIHRhcmdldCBpcyB0aGUKLQkgKiAiYWRhcHQtYWJsZSIgbm9kZQotCSAqLwotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlpZiAoKGlzQWN0aXZlKCkpICYmICh0YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSAmJiAoKE5vZGUpIHRhcmdldCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIHRhcmdldDsKLQkJCWlmIChpc05vZGVQcm9qZWN0YWJsZShub2RlKSkgewotCi0JCQkJLy8gYWN0dWFsbHkgd29yayB3aXRoIHRoZSBwYXJlbnQgbm9kZSB0byBsaXN0ZW4gZm9yIGFkZCwKLQkJCQkvLyBkZWxldGUgZXZlbnRzCi0JCQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQlJTm9kZU5vdGlmaWVyIHBhcmVudE5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIHBhcmVudDsKLQkJCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MIHBhcmVudEFkYXB0ZXIgPSAoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MKSBwYXJlbnROb3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmNsYXNzKTsKLQkJCQkJaWYgKHBhcmVudEFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCQkJLy8gY3JlYXRlIGEgbmV3IGFkYXB0ZXIgZm9yIHBhcmVudAotCQkJCQkJcGFyZW50QWRhcHRlciA9IG5ldyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwodGhpcyk7Ci0JCQkJCQlwYXJlbnROb3RpZmllci5hZGRBZGFwdGVyKHBhcmVudEFkYXB0ZXIpOwotCQkJCQl9Ci0JCQkJCS8vIGNhbGwgdXBkYXRlIG9uIHBhcmVudCBiZWNhdXNlIGEgbmV3IG5vZGUgaGFzIGp1c3QgYmVlbgotCQkJCQkvLyBhZGRlZAotCQkJCQlwYXJlbnRBZGFwdGVyLnVwZGF0ZUFkYXB0ZXIocGFyZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgbm9kZSBpcyBhIG5vZGUgdHlwZSBhYmxlIHRvIGZvbGQKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG5vZGUgaXMgcHJvamVjdGFibGUsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCWJvb2xlYW4gaXNOb2RlUHJvamVjdGFibGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCVN0cmluZyB0YWdOYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJLy8gbm9kZSBpcyBvbmx5IHByb2plY3RhYmxlIGlmIGl0IGlzIGhlYWQsIGJvZHksIHNjcmlwdCwgc3R5bGUsCi0JCQkvLyB0YWJsZSwgdWwsIG9sLCBhbmQgZGl2IHRhZ3MKLQkJCWlmIChIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRC5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZLmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSkgfHwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVC5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRS5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQUJMRS5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5VTC5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PTC5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVYuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBmYWN0b3J5IGlzIGN1cnJlbnRseSBhY3RpdmVseSBtYW5hZ2luZyBwcm9qZWN0aW9uCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCXJldHVybiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwgJiYgIWZQcm9qZWN0aW9uVmlld2Vycy5pc0VtcHR5KCkpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGlmIGRvY3VtZW50IGlzIG5vdCBpbiBmbHV4LgotCSAqIE90aGVyd2lzZSwgcXVldWVzIHVwIHRoZSBjaGFuZ2VzIHRvIGJlIGFwcGxpZWQgd2hlbiBkb2N1bWVudCBpcyByZWFkeS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBkZWxldGlvbnMKLQkgKiBAcGFyYW0gYWRkaXRpb25zCi0JICogQHBhcmFtIG1vZGlmaWNhdGlvbnMKLQkgKi8KLQl2b2lkIHF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhOb2RlIG5vZGUsIEFubm90YXRpb25bXSBkZWxldGlvbnMsIE1hcCBhZGRpdGlvbnMsIEFubm90YXRpb25bXSBtb2RpZmljYXRpb25zKSB7Ci0JCXF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhub2RlLCBkZWxldGlvbnMsIGFkZGl0aW9ucywgbW9kaWZpY2F0aW9ucywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgZm9yIGEgc3BlY2lmaWMgcHJvamVjdGlvbiB2aWV3ZXIgaWYKLQkgKiBkb2N1bWVudCBpcyBub3QgaW4gZmx1eC4gT3RoZXJ3aXNlLCBxdWV1ZXMgdXAgdGhlIGNoYW5nZXMgdG8gYmUgYXBwbGllZAotCSAqIHdoZW4gZG9jdW1lbnQgaXMgcmVhZHkuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gZGVsZXRpb25zCi0JICogQHBhcmFtIGFkZGl0aW9ucwotCSAqIEBwYXJhbSBtb2RpZmljYXRpb25zCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXZvaWQgcXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKE5vZGUgbm9kZSwgQW5ub3RhdGlvbltdIGRlbGV0aW9ucywgTWFwIGFkZGl0aW9ucywgQW5ub3RhdGlvbltdIG1vZGlmaWNhdGlvbnMsIFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIGNyZWF0ZSBhIGNoYW5nZSBvYmplY3QgZm9yIGxhdGVzdCBjaGFuZ2UgYW5kIGFkZCB0byBxdWV1ZQotCQlQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyBuZXdDaGFuZ2UgPSBuZXcgUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMobm9kZSwgZGVsZXRpb25zLCBhZGRpdGlvbnMsIG1vZGlmaWNhdGlvbnMpOwotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwpIHsKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbikgZlByb2plY3Rpb25WaWV3ZXJzLmdldCh2aWV3ZXIpOwotCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJaW5mby5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobmV3Q2hhbmdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJdGVyYXRvciBpbmZvcyA9IGZQcm9qZWN0aW9uVmlld2Vycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpbmZvcy5oYXNOZXh0KCkpIHsKLQkJCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBpbmZvcy5uZXh0KCk7Ci0JCQkJCWluZm8ucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5ld0NoYW5nZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gZ28gdGhyb3VnaCBldmVyeSBwcm9qZWN0aW9udmlld2VyIGFuZCBjYWxsCi0JCS8vIHJlbW92ZVByb2plY3Rpb25WaWV3ZXIodmlld2VyKTsKLQkJaWYgKGZQcm9qZWN0aW9uVmlld2VycyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpbmZvcyA9IGZQcm9qZWN0aW9uVmlld2Vycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGluZm9zLmhhc05leHQoKSkgewotCQkJCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbikgaW5mb3MubmV4dCgpOwotCQkJCWluZm8uZGlzcG9zZSgpOwotCQkJCWluZm9zLnJlbW92ZSgpOwotCQkJfQotCQkJZlByb2plY3Rpb25WaWV3ZXJzID0gbnVsbDsKLQkJfQotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB2aWV3ZXIgdG8gbGlzdCBvZiBwcm9qZWN0aW9uIHZpZXdlcnMgdGhpcyBmYWN0b3J5IGlzIGFzc29jaWF0ZWQKLQkgKiB3aXRoCi0JICogCi0JICogQHBhcmFtIHZpZXdlciAtCi0JICogICAgICAgICAgICBhc3N1bWVzIHZpZXdlcidzIGRvY3VtZW50IGFuZCBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwKLQkgKiAgICAgICAgICAgIGFyZSBub3QgbnVsbAotCSAqLwotCXZvaWQgYWRkUHJvamVjdGlvblZpZXdlcihQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQkvLyByZW1vdmUgb2xkIGVudHJ5IGlmIGl0IGV4aXN0cwotCQlyZW1vdmVQcm9qZWN0aW9uVmlld2VyKHZpZXdlcik7Ci0KLQkJaWYgKGZQcm9qZWN0aW9uVmlld2VycyA9PSBudWxsKSB7Ci0JCQlmUHJvamVjdGlvblZpZXdlcnMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJLy8gY3JlYXRlIG5ldyBvYmplY3QgY29udGFpbmluZyBwcm9qZWN0aW9uIHZpZXdlciBhbmQgaXRzIGluZm8KLQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSBuZXcgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKHZpZXdlcik7Ci0JCWZQcm9qZWN0aW9uVmlld2Vycy5wdXQodmlld2VyLCBpbmZvKTsKLQkJaW5mby5pbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gdmlld2VyIGZyb20gdGhlIGxpc3Qgb2YgcHJvamVjdGlvbiB2aWV3ZXJzIHRoaXMKLQkgKiBmYWN0b3IgaXMgYXNzb2NpYXRlZCB3aXRoCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXZvaWQgcmVtb3ZlUHJvamVjdGlvblZpZXdlcihQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwpIHsKLQkJCS8vIHJlbW92ZSBlbnRyeSBmcm9tIGxpc3Qgb2Ygdmlld2VycwotCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBmUHJvamVjdGlvblZpZXdlcnMucmVtb3ZlKHZpZXdlcik7Ci0JCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJaW5mby5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQkvLyBpZiByZW1vdmluZyBsYXN0IHByb2plY3Rpb24gdmlld2VyLCBjbGVhciBvdXQgZXZlcnl0aGluZwotCQkJaWYgKGZQcm9qZWN0aW9uVmlld2Vycy5pc0VtcHR5KCkpIHsKLQkJCQlmUHJvamVjdGlvblZpZXdlcnMgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxY2NkMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgd2l0aCBwcm9qZWN0aW9uIGFubm90YXRpb25zIGZvciB0aGlzCi0gKiBhZGFwdGVyIG5vZGUncyBjaGlsZHJlbgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBsb2NhdGVkIGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb24KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGRlYnVnUHJvamVjdGlvblBlcmYgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvcHJvamVjdGlvbnBlcmYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBjbGFzcyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBleHRlbmRzIFByb2plY3Rpb25Bbm5vdGF0aW9uIHsKLQkJcHJpdmF0ZSBib29sZWFuIGZJc1Zpc2libGUgPSBmYWxzZTsgLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJcHJpdmF0ZSBOb2RlIGZOb2RlOwotCi0JCXB1YmxpYyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbihOb2RlIG5vZGUsIGJvb2xlYW4gaXNDb2xsYXBzZWQpIHsKLQkJCXN1cGVyKGlzQ29sbGFwc2VkKTsKLQkJCWZOb2RlID0gbm9kZTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gZk5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXROb2RlKE5vZGUgbm9kZSkgewotCQkJZk5vZGUgPSBub2RlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIERvZXMgbm90IHBhaW50IGhpZGRlbiBhbm5vdGF0aW9ucy4gQW5ub3RhdGlvbnMgYXJlIGhpZGRlbiB3aGVuIHRoZXkKLQkJICogb25seSBzcGFuIG9uZSBsaW5lLgotCQkgKiAKLQkJICogQHNlZSBQcm9qZWN0aW9uQW5ub3RhdGlvbiNwYWludChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsCi0JCSAqICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgQ2FudmFzIGNhbnZhcywgUmVjdGFuZ2xlIHJlY3RhbmdsZSkgewotCQkJLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJCS8qCi0JCQkgKiBvbmx5IG5lZWQgdG8gY2hlY2sgYW5ub3RhdGlvbnMgdGhhdCBhcmUgZXhwYW5kZWQgYmVjYXVzZSBoaWRkZW4KLQkJCSAqIGFubm90YXRpb25zIHNob3VsZCBuZXZlciBoYXZlIGJlZW4gZ2l2ZW4gdGhlIGNoYW5jZSB0bwotCQkJICogY29sbGFwc2UuCi0JCQkgKi8KLQkJCWlmICghaXNDb2xsYXBzZWQoKSkgewotCQkJCS8vIHdvcmtpbmcgd2l0aCByZWN0YW5nbGUsIHNvIGxpbmUgaGVpZ2h0Ci0JCQkJRm9udE1ldHJpY3MgbWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCQkJaWYgKG1ldHJpY3MgIT0gbnVsbCkgewotCQkJCQkvLyBkbyBub3QgZHJhdyBhbm5vdGF0aW9ucyB0aGF0IG9ubHkgc3BhbiBvbmUgbGluZSBhbmQKLQkJCQkJLy8gbWFyayB0aGVtIGFzIG5vdCB2aXNpYmxlCi0JCQkJCWlmICgocmVjdGFuZ2xlLmhlaWdodCAvIG1ldHJpY3MuZ2V0SGVpZ2h0KCkpIDw9IDEpIHsKLQkJCQkJCWZJc1Zpc2libGUgPSBmYWxzZTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZJc1Zpc2libGUgPSB0cnVlOwotCQkJc3VwZXIucGFpbnQoZ2MsIGNhbnZhcywgcmVjdGFuZ2xlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbiNtYXJrQ29sbGFwc2VkKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1hcmtDb2xsYXBzZWQoKSB7Ci0JCQkvKiB3b3JrYXJvdW5kIGZvciBCVUc4NTg3NCAqLwotCQkJLy8gZG8gbm90IG1hcmsgY29sbGFwc2VkIGlmIGFubm90YXRpb24gaXMgbm90IHZpc2libGUKLQkJCWlmIChmSXNWaXNpYmxlKQotCQkJCXN1cGVyLm1hcmtDb2xsYXBzZWQoKTsKLQkJfQotCX0KLQotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGxvY2F0ZWQgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCi0JUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBmQWRhcHRlckZhY3Rvcnk7Ci0JcHJpdmF0ZSBNYXAgZlRhZ0Fubm90YXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBmYWN0b3J5KSB7Ci0JCWZBZGFwdGVyRmFjdG9yeSA9IGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgcHJvamVjdGlvbiBwb3NpdGlvbiBmcm9tIHRoZSBnaXZlbiBub2RlLiBBYmxlIHRvIGdldAotCSAqIHByb2plY3Rpb24gcG9zaXRpb24gaWYgbm9kZSBpc05vZGVQcm9qZWN0YWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gbnVsbCBpZiBubyBwcm9qZWN0aW9uIHBvc2l0aW9uIHBvc3NpYmxlLCBhIFBvc2l0aW9uIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgUG9zaXRpb24gY3JlYXRlUHJvamVjdGlvblBvc2l0aW9uKE5vZGUgbm9kZSkgewotCQlQb3NpdGlvbiBwb3MgPSBudWxsOwotCQlpZiAoZkFkYXB0ZXJGYWN0b3J5LmlzTm9kZVByb2plY3RhYmxlKG5vZGUpICYmIG5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkvLyBJRG9jdW1lbnQgZG9jdW1lbnQgPQotCQkJLy8gZkFkYXB0ZXJGYWN0b3J5LmdldFByb2plY3Rpb25WaWV3ZXIoKS5nZXREb2N1bWVudCgpOwotCQkJLy8gaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUluZGV4ZWRSZWdpb24gaW5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJCWludCBzdGFydCA9IGlub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpbnQgZW5kID0gaW5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlpZiAoc3RhcnQgPj0gMCAmJiBzdGFydCA8IGVuZCkgewotCQkJCS8vIHJlZ2lvbi1iYXNlZAotCQkJCS8vIGV4dHJhIGxpbmUgd2hlbiBjb2xsYXBzZWQsIGJ1dCBubyByZWdpb24KLQkJCQkvLyBpbmNyZWFzZSB3aGVuIGFkZCBuZXdsaW5lCi0JCQkJcG9zID0gbmV3IFBvc2l0aW9uKHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQkJLy8gdHJ5IHsKLQkJCQkvLyAvLyBsaW5lLWJhc2VkCi0JCQkJLy8gLy8gZXh0cmEgbGluZSB3aGVuIGNvbGxhcHNlZCwgYnV0IG5vIHJlZ2lvbgotCQkJCS8vIC8vIGluY3JlYXNlIHdoZW4gYWRkIG5ld2xpbmUKLQkJCQkvLyBJUmVnaW9uIHN0YXJ0TGluZVJlZ2lvbiA9Ci0JCQkJLy8gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoc3RhcnQpOwotCQkJCS8vIElSZWdpb24gZW5kTGluZVJlZ2lvbiA9Ci0JCQkJLy8gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoZW5kKTsKLQkJCQkvLyBpbnQgc3RhcnRPZmZzZXQgPSBzdGFydExpbmVSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQkJLy8gaW50IGVuZE9mZnNldCA9IGVuZExpbmVSZWdpb24uZ2V0T2Zmc2V0KCkgKwotCQkJCS8vIGVuZExpbmVSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJLy8gaWYgKGVuZE9mZnNldCA+IHN0YXJ0T2Zmc2V0KSB7Ci0JCQkJLy8gcG9zID0gbmV3IFBvc2l0aW9uKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLQotCQkJCS8vIHN0YXJ0T2Zmc2V0KTsKLQkJCQkvLyB9Ci0JCQkJLy8KLQkJCQkvLyAvLyBsaW5lLWJhc2VkCi0JCQkJLy8gLy8gbm8gZXh0cmEgbGluZSB3aGVuIGNvbGxhcHNlZCwgYnV0IHJlZ2lvbiBpbmNyZWFzZQotCQkJCS8vIC8vIHdoZW4gYWRkIG5ld2xpbmUKLQkJCQkvLyBpbnQgc3RhcnRMaW5lID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkvLyBpbnQgZW5kTGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChlbmQpOwotCQkJCS8vIGlmIChlbmRMaW5lICsgMSA8IGRvY3VtZW50LmdldE51bWJlck9mTGluZXMoKSkgewotCQkJCS8vIGludCBvZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KHN0YXJ0TGluZSk7Ci0JCQkJLy8gaW50IGVuZE9mZnNldCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQoZW5kTGluZSArIDEpOwotCQkJCS8vIHBvcyA9IG5ldyBQb3NpdGlvbihvZmZzZXQsIGVuZE9mZnNldCAtIG9mZnNldCk7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCS8vIExvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIG51bGwsIHgpOwotCQkJCS8vIH0KLQkJCX0KLQkJfQotCQkvLyB9Ci0JCXJldHVybiBwb3M7Ci0JfQotCi0JLyoqCi0JICogRmluZCBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBmb3Igbm9kZSBpbiB0aGUgY3VycmVudCBsaXN0IG9mIHByb2plY3Rpb24KLQkgKiBhbm5vdGF0aW9ucyBmb3IgdGhpcyBhZGFwdGVyCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uCi0JICovCi0JcHJpdmF0ZSBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBnZXRFeGlzdGluZ0Fubm90YXRpb24oTm9kZSBub2RlKSB7Ci0JCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGFubm8gPSBudWxsOwotCi0JCWlmICgobm9kZSAhPSBudWxsKSAmJiAoIWZUYWdBbm5vdGF0aW9ucy5pc0VtcHR5KCkpKSB7Ci0JCQlJdGVyYXRvciBpdCA9IGZUYWdBbm5vdGF0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSAmJiBhbm5vID09IG51bGwpIHsKLQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBhID0gKFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJTm9kZSBuID0gYS5nZXROb2RlKCk7Ci0JCQkJaWYgKG5vZGUuZXF1YWxzKG4pKSB7Ci0JCQkJCWFubm8gPSBhOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYW5ubzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlID09IFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJLy8gY2hlY2sgaWYgZm9sZGluZyBpcyBldmVuIGVuYWJsZWQsIGlmIG5vdCwganVzdCBpZ25vcmUgbm90aWZ5Q2hhbmdlZAotCQkvLyBldmVudHMKLQkJaWYgKCFmQWRhcHRlckZhY3RvcnkuaXNBY3RpdmUoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCkgJiYgKG5vdGlmaWVyIGluc3RhbmNlb2YgTm9kZSkpIHsKLQkJCXVwZGF0ZUFkYXB0ZXIoKE5vZGUpIG5vdGlmaWVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG9mIGFsbCB0aGUgbm9kZXMgdGhhdCBhcmUgY2hpbGRyZW4gb2YKLQkgKiBub2RlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQl2b2lkIHVwZGF0ZUFkYXB0ZXIoTm9kZSBub2RlKSB7Ci0JCXVwZGF0ZUFkYXB0ZXIobm9kZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBwcm9qZWN0aW9uIGFubm90YXRpb24gb2YgYWxsIHRoZSBub2RlcyB0aGF0IGFyZSBjaGlsZHJlbiBvZgotCSAqIG5vZGUgYW5kIGFkZHMgYWxsIHByb2plY3Rpb24gYW5ub3RhdGlvbnMgdG8gdmlld2VyIChmb3IgbmV3bHkgYWRkZWQKLQkgKiB2aWV3ZXJzKQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXZvaWQgdXBkYXRlQWRhcHRlcihOb2RlIG5vZGUsIFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlNYXAgYWRkaXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJTWFwIHByb2plY3Rpb25Bbm5vdGF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJLy8gZ28gdGhyb3VnaCBpbW1lZGlhdGUgY2hpbGQgbm9kZXMgYW5kIGZpZ3VyZSBvdXQgcHJvamVjdGlvbgotCQkvLyBtb2RlbCBhbm5vdGF0aW9ucwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlOb2RlIGNoaWxkTm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKGNoaWxkTm9kZSAhPSBudWxsKSB7Ci0JCQkJUG9zaXRpb24gbmV3UG9zID0gY3JlYXRlUHJvamVjdGlvblBvc2l0aW9uKGNoaWxkTm9kZSk7Ci0JCQkJaWYgKG5ld1BvcyAhPSBudWxsKSB7Ci0JCQkJCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIG5ld0Fubm90YXRpb24gPSBuZXcgVGFnUHJvamVjdGlvbkFubm90YXRpb24oY2hpbGROb2RlLCBmYWxzZSk7Ci0JCQkJCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGV4aXN0aW5nID0gZ2V0RXhpc3RpbmdBbm5vdGF0aW9uKGNoaWxkTm9kZSk7Ci0JCQkJCWlmIChleGlzdGluZyA9PSBudWxsKSB7Ci0JCQkJCQkvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYWxsIGFubm90YXRpb25zIGZvciB0aGlzCi0JCQkJCQkvLyBhZGFwdGVyCi0JCQkJCQlwcm9qZWN0aW9uQW5ub3RhdGlvbnMucHV0KG5ld0Fubm90YXRpb24sIG5ld1Bvcyk7Ci0JCQkJCQkvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgdG8gYWRkCi0JCQkJCQlhZGRpdGlvbnMucHV0KG5ld0Fubm90YXRpb24sIG5ld1Bvcyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYWxsIGFubm90YXRpb25zIGZvciB0aGlzCi0JCQkJCQkvLyBhZGFwdGVyCi0JCQkJCQlwcm9qZWN0aW9uQW5ub3RhdGlvbnMucHV0KGV4aXN0aW5nLCBuZXdQb3MpOwotCQkJCQkJLy8gcmVtb3ZlIGZyb20gbWFwIGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgdG8gZGVsZXRlCi0JCQkJCQlmVGFnQW5ub3RhdGlvbnMucmVtb3ZlKGV4aXN0aW5nKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljaGlsZE5vZGUgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQotCQkJLy8gaW4gdGhlIGVuZCwgd2FudCB0byBkZWxldGUgYW55dGhpbmcgbGVmdG92ZXIgaW4gb2xkIGxpc3QsIGFkZAotCQkJLy8gZXZlcnl0aGluZyBpbiBhZGRpdGlvbnMsIGFuZCB1cGRhdGUgZXZlcnl0aGluZyBpbgotCQkJLy8gcHJvamVjdGlvbkFubm90YXRpb25zCi0JCQlQcm9qZWN0aW9uQW5ub3RhdGlvbltdIG9sZExpc3QgPSBudWxsOwotCQkJaWYgKCFmVGFnQW5ub3RhdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJb2xkTGlzdCA9IChQcm9qZWN0aW9uQW5ub3RhdGlvbltdKSBmVGFnQW5ub3RhdGlvbnMua2V5U2V0KCkudG9BcnJheShuZXcgUHJvamVjdGlvbkFubm90YXRpb25bMF0pOwotCQkJfQotCQkJUHJvamVjdGlvbkFubm90YXRpb25bXSBtb2RpZnlMaXN0ID0gbnVsbDsKLQkJCWlmICghcHJvamVjdGlvbkFubm90YXRpb25zLmlzRW1wdHkoKSkgewotCQkJCW1vZGlmeUxpc3QgPSAoUHJvamVjdGlvbkFubm90YXRpb25bXSkgcHJvamVjdGlvbkFubm90YXRpb25zLmtleVNldCgpLnRvQXJyYXkobmV3IFByb2plY3Rpb25Bbm5vdGF0aW9uWzBdKTsKLQkJCX0KLQotCQkJLy8gc3BlY2lmaWNhbGx5IGFkZCBhbGwgYW5ub3RhdGlvbnMgdG8gdmlld2VyCi0JCQlpZiAodmlld2VyICE9IG51bGwgJiYgIXByb2plY3Rpb25Bbm5vdGF0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQlmQWRhcHRlckZhY3RvcnkucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5vZGUsIG51bGwsIHByb2plY3Rpb25Bbm5vdGF0aW9ucywgbnVsbCwgdmlld2VyKTsKLQkJCX0KLQotCQkJLy8gb25seSB1cGRhdGUgd2hlbiB0aGVyZSBpcyBzb21ldGhpbmcgdG8gdXBkYXRlCi0JCQlpZiAoKG9sZExpc3QgIT0gbnVsbCAmJiBvbGRMaXN0Lmxlbmd0aCA+IDApIHx8ICghYWRkaXRpb25zLmlzRW1wdHkoKSkgfHwgKG1vZGlmeUxpc3QgIT0gbnVsbCAmJiBtb2RpZnlMaXN0Lmxlbmd0aCA+IDApKQotCQkJCWZBZGFwdGVyRmFjdG9yeS5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobm9kZSwgb2xkTGlzdCwgYWRkaXRpb25zLCBtb2RpZnlMaXN0KTsKLQkJfQotCi0JCS8vIHNhdmUgbmV3IGxpc3Qgb2YgYW5ub3RhdGlvbnMKLQkJZlRhZ0Fubm90YXRpb25zID0gcHJvamVjdGlvbkFubm90YXRpb25zOwotCi0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3RyaW5nIG5vZGVOYW1lID0gbm9kZSAhPSBudWxsID8gbm9kZS5nZXROb2RlTmFtZSgpIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC51cGRhdGVBZGFwdGVyICgiICsgbm9kZU5hbWUgKyAiKToiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NWVmYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcm9qZWN0aW9uIHZpZXdlciBhbmQgYWxzbyBtYW5hZ2VzIHVwZGF0aW5nCi0gKiB0aGUgdmlld2VyJ3MgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsCi0gKi8KLWNsYXNzIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgbG9jYXRlZCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0KLQkvKioKLQkgKiBMaXN0ZW5zIHRvIGRvY3VtZW50IHRvIGJlIGF3YXJlIG9mIHdoZW4gdG8gdXBkYXRlIHRoZSBwcm9qZWN0aW9uCi0JICogYW5ub3RhdGlvbiBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRMaXN0ZW5lciB7Ci0JCXByaXZhdGUgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGZJbmZvOwotCi0JCXB1YmxpYyBEb2N1bWVudExpc3RlbmVyKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvKSB7Ci0JCQlmSW5mbyA9IGluZm87Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZXZlbnQuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChmSW5mby5nZXREb2N1bWVudCgpID09IGRvY3VtZW50KSB7Ci0JCQkJZkluZm8uc2V0SXNEb2N1bWVudENoYW5naW5nKHRydWUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCS8vIHJlZ2lzdGVyIGEgcG9zdCBub3RpZmljYXRpb24gcmVwbGFjZSBzbyB0aGF0IHByb2plY3Rpb24KLQkJCS8vIGFubm90YXRpb24gbW9kZWwgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGFsbCBkb2N1bWVudENoYW5nZWQKLQkJCS8vIGxpc3RlbmVycyBoYXZlIGJlZW4gbm90aWZpZWQKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGV2ZW50LmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb24gJiYgZkluZm8uZ2V0RG9jdW1lbnQoKSA9PSBkb2N1bWVudCkgewotCQkJCWlmIChmSW5mby5oYXNDaGFuZ2VzUXVldWVkKCkpCi0JCQkJCSgoSURvY3VtZW50RXh0ZW5zaW9uKSBkb2N1bWVudCkucmVnaXN0ZXJQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZSh0aGlzLCBuZXcgUG9zdERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZJbmZvKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFc3NlbnRpYWxseSBhIHBvc3QgZG9jdW1lbnQgY2hhbmdlZCBsaXN0ZW5lciBiZWNhdXNlIGl0IGlzIGNhbGxlZCBhZnRlcgotCSAqIGRvY3VtZW50Y2hhbmdlZCBoYXMgYmVlbiBmaXJlZC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFBvc3REb2N1bWVudENoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElEb2N1bWVudEV4dGVuc2lvbi5JUmVwbGFjZSB7Ci0JCXByaXZhdGUgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGZJbmZvOwotCi0JCXB1YmxpYyBQb3N0RG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8pIHsKLQkJCWZJbmZvID0gaW5mbzsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBlcmZvcm0oSURvY3VtZW50IGRvY3VtZW50LCBJRG9jdW1lbnRMaXN0ZW5lciBvd25lcikgewotCQkJZkluZm8uYXBwbHlBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKCk7Ci0JCQlmSW5mby5zZXRJc0RvY3VtZW50Q2hhbmdpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGN1cnJlbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdGlvbgotCSAqIHZpZXdlcgotCSAqLwotCXByaXZhdGUgUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCBmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbDsKLQkvKioKLQkgKiBEb2N1bWVudCBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdGlvbiB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JLyoqCi0JICogTGlzdGVuZXIgdG8gZlByb2plY3Rpb25WaWV3ZXIncyBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgSURvY3VtZW50TGlzdGVuZXIgZkRvY3VtZW50TGlzdGVuZXI7Ci0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGRvY3VtZW50IGlzIGluIHRoZSBtaWRkbGUgb2YgY2hhbmdpbmcKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZklzRG9jdW1lbnRDaGFuZ2luZyA9IGZhbHNlOwotCS8qKgotCSAqIExpc3Qgb2YgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGNoYW5nZXMgdGhhdCBuZWVkIHRvIGJlIGFwcGxpZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzOwotCi0JcHVibGljIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbihQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlmRG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwgPSB2aWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpOwotCX0KLQotCUlEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0UXVldWVkQW5ub3RhdGlvbkNoYW5nZXMoKSB7Ci0JCWlmIChmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMgPT0gbnVsbCkgewotCQkJZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXM7Ci0JfQotCi0Jdm9pZCBzZXRJc0RvY3VtZW50Q2hhbmdpbmcoYm9vbGVhbiBjaGFuZ2luZykgewotCQlmSXNEb2N1bWVudENoYW5naW5nID0gY2hhbmdpbmc7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRG9jdW1lbnRDaGFuZ2luZygpIHsKLQkJcmV0dXJuIGZJc0RvY3VtZW50Q2hhbmdpbmc7Ci0JfQotCi0JLyoqCi0JICogQXBwbGllcyB0aGUgcGVuZGluZyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgY2hhbmdlcyB0byB0aGUKLQkgKiBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwuCi0JICovCi0Jdm9pZCBhcHBseUFubm90YXRpb25Nb2RlbENoYW5nZXMoKSB7Ci0JCUxpc3QgcXVldWVkQ2hhbmdlcyA9IGdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCk7Ci0JCS8vIGdvIHRocm91Z2ggYWxsIHRoZSBwZW5kaW5nIGFubm90YXRpb24gY2hhbmdlcyBhbmQgYXBwbHkKLQkJLy8gdGhlbSB0bwotCQkvLyB0aGUgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsCi0JCXdoaWxlICghcXVldWVkQ2hhbmdlcy5pc0VtcHR5KCkpIHsKLQkJCVByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIGNoYW5nZXMgPSAoUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMpIHF1ZXVlZENoYW5nZXMucmVtb3ZlKDApOwotCQkJdHJ5IHsKLQkJCQlmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbC5tb2RpZnlBbm5vdGF0aW9ucyhjaGFuZ2VzLmdldERlbGV0aW9ucygpLCBjaGFuZ2VzLmdldEFkZGl0aW9ucygpLCBjaGFuZ2VzLmdldE1vZGlmaWNhdGlvbnMoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZiBhbnl0aGluZyBnb2VzIHdyb25nLCBsb2cgaXQgYW5kIGNvbnRpbnVlCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBhbm5vdGF0aW9uIGNoYW5nZXMgcXVldWVkIHVwLCBmYWxzZSBvdGhlcndpc2UKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGhhc0NoYW5nZXNRdWV1ZWQoKSB7Ci0JCXJldHVybiAhZ2V0UXVldWVkQW5ub3RhdGlvbkNoYW5nZXMoKS5pc0VtcHR5KCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgaWYgZG9jdW1lbnQgaXMgbm90IGluIGZsdXguCi0JICogT3RoZXJ3aXNlLCBxdWV1ZXMgdXAgdGhlIGNoYW5nZXMgdG8gYmUgYXBwbGllZCB3aGVuIGRvY3VtZW50IGlzIHJlYWR5LgotCSAqLwotCXB1YmxpYyB2b2lkIHF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyBuZXdDaGFuZ2UpIHsKLQkJLyoKLQkJICogZnV0dXJlX1RPRE86IG1heWJlIGltcHJvdmUgYnkgY2hlY2tpbmcgaWYgYW5ub3RhdGlvbiBwcm9qZWN0aW9uCi0JCSAqIG1vZGVsIGNoYW5nZSBhbHJlYWR5IGV4aXN0cyBmb3Igbm9kZS4gaWYgc28sIHRocm93IG91dCBvbGQgY2hhbmdlLgotCQkgKi8KLQkJZ2V0UXVldWVkQW5ub3RhdGlvbkNoYW5nZXMoKS5hZGQobmV3Q2hhbmdlKTsKLQotCQkvLyBpZiBkb2N1bWVudCBpc24ndCBjaGFuZ2luZywgZ28gYWhlYWQgYW5kIGFwcGx5IGl0Ci0JCWlmICghaXNEb2N1bWVudENoYW5naW5nKCkpIHsKLQkJCWFwcGx5QW5ub3RhdGlvbk1vZGVsQ2hhbmdlcygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gYWRkIGRvY3VtZW50IGxpc3RlbmVyCi0JCWlmIChmRG9jdW1lbnRMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmRG9jdW1lbnRMaXN0ZW5lciA9IG5ldyBEb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCWdldERvY3VtZW50KCkuYWRkRG9jdW1lbnRMaXN0ZW5lcihmRG9jdW1lbnRMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gcmVtb3ZlIGRvY3VtZW50IGxpc3RlbmVyCi0JCWlmIChmRG9jdW1lbnRMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlnZXREb2N1bWVudCgpLnJlbW92ZURvY3VtZW50TGlzdGVuZXIoZkRvY3VtZW50TGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gY2xlYXIgb3V0IGxpc3Qgb2YgcXVldWVkIGNoYW5nZXMgc2luY2UgaXQgbWF5IG5vIGxvbmdlcgotCQkvLyBiZSBhY2N1cmF0ZQotCQlpZiAoZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzICE9IG51bGwpIHsKLQkJCWZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcy5jbGVhcigpOwotCQkJZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1N0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDE4NTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5JUHJvamVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb24uSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBVcGRhdGVzIHRoZSBwcm9qZWN0aW9uIG1vZGVsIG9mIGEgc3RydWN0dXJlZCBtb2RlbCBmb3IgSFRNTC4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySFRNTCBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlciwgSVByb2plY3Rpb25MaXN0ZW5lciwgSVRleHRJbnB1dExpc3RlbmVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGRlYnVnUHJvamVjdGlvblBlcmYgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvcHJvamVjdGlvbnBlcmYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgUHJvamVjdGlvblZpZXdlciBmVmlld2VyOwotCXByaXZhdGUgYm9vbGVhbiBmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQkvKioKLQkgKiBNYXhpbXVtIG51bWJlciBvZiBjaGlsZCBub2RlcyB0byBhZGQgYWRhcHRlcnMgdG8gKGxpbWl0IGZvciBwZXJmb3JtYW5jZQotCSAqIHNha2UpCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX0NISUxEUkVOID0gMTA7Ci0JLyoqCi0JICogTWF4aW11bSBudW1iZXIgb2Ygc2libGluZyBub2RlcyB0byBhZGQgYWRhcHRlcnMgdG8gKGxpbWl0IGZvcgotCSAqIHBlcmZvcm1hbmNlIHNha2UpCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX1NJQkxJTkdTID0gMTAwMDsKLQotCS8qKgotCSAqIEFkZHMgYW4gYWRhcHRlciB0byBub2RlIGFuZCBpdHMgY2hpbGRyZW4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBjaGlsZExldmVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEFkYXB0ZXJUb05vZGVBbmRDaGlsZHJlbihOb2RlIG5vZGUsIGludCBjaGlsZExldmVsKSB7Ci0JCS8vIHN0b3AgYWRkaW5nIGluaXRpYWwgYWRhcHRlcnMgTUFYX0NISUxEUkVOIGxldmVscyBkZWVwIGZvcgotCQkvLyBwZXJmb3JtYW5jZSBzYWtlCi0JCWlmIChub2RlIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllciAmJiBjaGlsZExldmVsIDwgTUFYX0NISUxEUkVOKSB7Ci0JCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIG5vZGU7Ci0KLQkJCS8vIHRyeSBhbmQgZ2V0IHRoZSBhZGFwdGVyIGZvciB0aGUgY3VycmVudCBub2RlIGFuZCB1cGRhdGUgdGhlCi0JCQkvLyBhZGFwdGVyIHdpdGggcHJvamVjdGlvbiBpbmZvcm1hdGlvbgotCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MIGFkYXB0ZXIgPSAoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MKSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlhZGFwdGVyLnVwZGF0ZUFkYXB0ZXIobm9kZSwgZlZpZXdlcik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBqdXN0IGNhbGwgZ2V0YWRhcHRlciBzbyB0aGUgYWRhcHRlciBpcyBjcmVhdGVkIGFuZAotCQkJCS8vIGF1dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZWQKLQkJCQlub3RpZmllci5nZXRBZGFwdGVyRm9yKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzcyk7Ci0JCQl9Ci0JCQlpbnQgc2libGluZ0xldmVsID0gMDsKLQkJCU5vZGUgbmV4dENoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAobmV4dENoaWxkICE9IG51bGwgJiYgc2libGluZ0xldmVsIDwgTUFYX1NJQkxJTkdTKSB7Ci0JCQkJTm9kZSBjaGlsZE5vZGUgPSBuZXh0Q2hpbGQ7Ci0JCQkJbmV4dENoaWxkID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCQlhZGRBZGFwdGVyVG9Ob2RlQW5kQ2hpbGRyZW4oY2hpbGROb2RlLCBjaGlsZExldmVsICsgMSk7Ci0JCQkJKytzaWJsaW5nTGV2ZWw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHb2VzIHRocm91Z2ggZXZlcnkgbm9kZSBhbmQgYWRkcyBhbiBhZGFwdGVyIG9udG8gZWFjaCBmb3IgdHJhY2tpbmcKLQkgKiBwdXJwb3NlcwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRBbGxBZGFwdGVycygpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCQkJCUluZGV4ZWRSZWdpb24gc3RhcnROb2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRPZmZzZXQpOwotCQkJCQlpZiAoc3RhcnROb2RlIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQkJaW50IHNpYmxpbmdMZXZlbCA9IDA7Ci0JCQkJCQlOb2RlIG5leHRTaWJsaW5nID0gKE5vZGUpIHN0YXJ0Tm9kZTsKLQkJCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBudWxsICYmIHNpYmxpbmdMZXZlbCA8IE1BWF9TSUJMSU5HUykgewotCQkJCQkJCU5vZGUgY3VycmVudE5vZGUgPSBuZXh0U2libGluZzsKLQkJCQkJCQluZXh0U2libGluZyA9IGN1cnJlbnROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCQkJCQlhZGRBZGFwdGVyVG9Ob2RlQW5kQ2hpbGRyZW4oY3VycmVudE5vZGUsIDApOwotCQkJCQkJCSsrc2libGluZ0xldmVsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySFRNTC5hZGRBbGxBZGFwdGVyczogIiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgdG8gdXNlIHdpdGggdGhpcwotCSAqIHByb3ZpZGVyLgotCSAqIAotCSAqIEByZXR1cm4gUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTAotCSAqLwotCXByaXZhdGUgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBnZXRBZGFwdGVyRmFjdG9yeShib29sZWFuIGNyZWF0ZUlmTmVlZGVkKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MIGZhY3RvcnkgPSBudWxsOwotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5ID0gc01vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCi0JCQkJCS8vIGdldHRpbmcgdGhlIHByb2plY3Rpb25tb2RlbG5vZGVhZGFwdGVyIGZvciB0aGUgZmlyc3QKLQkJCQkJLy8gdGltZQotCQkJCQkvLyBzbyBkbyBzb21lIGluaXRpYWxpemluZwotCQkJCQlpZiAoIWZhY3RvcnlSZWdpc3RyeS5jb250YWlucyhQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuY2xhc3MpICYmIGNyZWF0ZUlmTmVlZGVkKSB7Ci0JCQkJCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MIG5ld0ZhY3RvcnkgPSBuZXcgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCgpOwotCi0JCQkJCQkvLyBhZGQgZmFjdG9yeSB0byBmYWN0b3J5IHJlZ2lzdHJ5Ci0JCQkJCQlmYWN0b3J5UmVnaXN0cnkuYWRkRmFjdG9yeShuZXdGYWN0b3J5KTsKLQotCQkJCQkJLy8gYWRkIGZhY3RvcnkgdG8gcHJvcG9nYXRpbmcgYWRhcHRlcgotCQkJCQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgc01vZGVsOwotCQkJCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCQkJUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJCQkJCWlmIChwcm9wYWdhdGluZ0FkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJCXByb3BhZ2F0aW5nQWRhcHRlci5hZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeShuZXdGYWN0b3J5KTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIHRyeSBhbmQgZ2V0IHRoZSBmYWN0b3J5Ci0JCQkJCWZhY3RvcnkgPSAoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCkgZmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmNsYXNzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckhUTUwuZ2V0QWRhcHRlckZhY3Rvcnk6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhpcyBwcm92aWRlciB3aXRoIHRoZSBjb3JyZWN0IGRvY3VtZW50LiBBc3N1bWVzIHByb2plY3Rpb24KLQkgKiBpcyBlbmFibGVkLiAob3RoZXJ3aXNlLCBvbmx5IGluc3RhbGwgd291bGQgaGF2ZSBiZWVuIGNhbGxlZCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiAoIWlzSW5zdGFsbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJLy8gY2xlYXIgb3V0IG9sZCBpbmZvCi0JCXByb2plY3Rpb25EaXNhYmxlZCgpOwotCi0JCWZEb2N1bWVudCA9IGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQotCQkvLyBzZXQgcHJvamVjdGlvbiB2aWV3ZXIgb24gbmV3IGRvY3VtZW50J3MgYWRhcHRlciBmYWN0b3J5Ci0JCWlmIChmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKSAhPSBudWxsKSB7Ci0JCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MIGZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSh0cnVlKTsKLQkJCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlmYWN0b3J5LmFkZFByb2plY3Rpb25WaWV3ZXIoZlZpZXdlcik7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTgzMDQKLQkJCQkvLyBkaXNhYmxlIHJlZHJhdyB3aGlsZSBhZGRpbmcgYWxsIGFkYXB0ZXJzCi0JCQkJZlZpZXdlci5zZXRSZWRyYXcoZmFsc2UpOwotCQkJCWFkZEFsbEFkYXB0ZXJzKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlmVmlld2VyLnNldFJlZHJhdyh0cnVlKTsKLQkJCX0KLQkJfQotCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJIVE1MLmluaXRpYWxpemU6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQXNzb2NpYXRlIGEgUHJvamVjdGlvblZpZXdlciB3aXRoIHRoaXMgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyCi0JICogCi0JICogQHBhcmFtIHZpZXdlciAtCi0JICogICAgICAgICAgICBhc3N1bWVzIG5vdCBudWxsCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQkvLyB1bmluc3RhbGwgYmVmb3JlIHRyeWluZyB0byBpbnN0YWxsIG5ldyB2aWV3ZXIKLQkJaWYgKGlzSW5zdGFsbGVkKCkpIHsKLQkJCXVuaW5zdGFsbCgpOwotCQl9Ci0JCWZWaWV3ZXIgPSB2aWV3ZXI7Ci0JCWZWaWV3ZXIuYWRkUHJvamVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlmVmlld2VyLmFkZFRleHRJbnB1dExpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0luc3RhbGxlZCgpIHsKLQkJcmV0dXJuIGZWaWV3ZXIgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9qZWN0aW9uRGlzYWJsZWQoKSB7Ci0JCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgZmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5KGZhbHNlKTsKLQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJZmFjdG9yeS5yZW1vdmVQcm9qZWN0aW9uVmlld2VyKGZWaWV3ZXIpOwotCQl9Ci0KLQkJLy8gY2xlYXIgb3V0IGFsbCBhbm5vdGF0aW9ucwotCQlpZiAoZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkgIT0gbnVsbCkKLQkJCWZWaWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpLnJlbW92ZUFsbEFubm90YXRpb25zKCk7Ci0KLQkJcmVtb3ZlQWxsQWRhcHRlcnMoKTsKLQotCQlmRG9jdW1lbnQgPSBudWxsOwotCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9qZWN0aW9uRW5hYmxlZCgpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYW4gYWRhcHRlciBmcm9tIG5vZGUgYW5kIGl0cyBjaGlsZHJlbgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGxldmVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUFkYXB0ZXJGcm9tTm9kZUFuZENoaWxkcmVuKE5vZGUgbm9kZSwgaW50IGxldmVsKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBub2RlOwotCi0JCQkvLyB0cnkgYW5kIGdldCB0aGUgYWRhcHRlciBmb3IgdGhlIGN1cnJlbnQgbm9kZSBhbmQgcmVtb3ZlIGl0Ci0JCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCW5vdGlmaWVyLnJlbW92ZUFkYXB0ZXIoYWRhcHRlcik7Ci0JCQl9Ci0KLQkJCU5vZGUgbmV4dENoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAobmV4dENoaWxkICE9IG51bGwpIHsKLQkJCQlOb2RlIGNoaWxkTm9kZSA9IG5leHRDaGlsZDsKLQkJCQluZXh0Q2hpbGQgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkJCXJlbW92ZUFkYXB0ZXJGcm9tTm9kZUFuZENoaWxkcmVuKGNoaWxkTm9kZSwgbGV2ZWwgKyAxKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdvZXMgdGhyb3VnaCBldmVyeSBub2RlIGFuZCByZW1vdmVzIGFkYXB0ZXIgZnJvbSBlYWNoIGZvciBjbGVhbnVwCi0JICogcHVycG9zZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQWxsQWRhcHRlcnMoKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJCQlJbmRleGVkUmVnaW9uIHN0YXJ0Tm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0T2Zmc2V0KTsKLQkJCQkJaWYgKHN0YXJ0Tm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJCU5vZGUgbmV4dFNpYmxpbmcgPSAoTm9kZSkgc3RhcnROb2RlOwotCQkJCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG51bGwpIHsKLQkJCQkJCQlOb2RlIGN1cnJlbnROb2RlID0gbmV4dFNpYmxpbmc7Ci0JCQkJCQkJbmV4dFNpYmxpbmcgPSBjdXJyZW50Tm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCQkJCQkJcmVtb3ZlQWRhcHRlckZyb21Ob2RlQW5kQ2hpbGRyZW4oY3VycmVudE5vZGUsIDApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJIVE1MLnJlbW92ZUFsbEFkYXB0ZXJzOiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCS8vIGlmIGZvbGRpbmcgaXMgZW5hYmxlZCBhbmQgbmV3IGRvY3VtZW50IGlzIGdvaW5nIHRvIGJlIGEgdG90YWxseQotCQkvLyBkaWZmZXJlbnQgZG9jdW1lbnQsIGRpc2FibGUgcHJvamVjdGlvbgotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwgJiYgZkRvY3VtZW50ICE9IG5ld0lucHV0KSB7Ci0JCQkvLyBkaXNhYmxlIHByb2plY3Rpb24gYW5kIGRpc2Nvbm5lY3QgZXZlcnl0aGluZwotCQkJcHJvamVjdGlvbkRpc2FibGVkKCk7Ci0JCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXREb2N1bWVudENoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJLy8gaWYgcHJvamVjdGlvbiB3YXMgcHJldmlvdXNseSBlbmFibGVkIGJlZm9yZSBpbnB1dCBkb2N1bWVudCBjaGFuZ2VkCi0JCS8vIGFuZCBuZXcgZG9jdW1lbnQgaXMgZGlmZmVyZW50IHRoYW4gb2xkIGRvY3VtZW50Ci0JCWlmIChmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgJiYgZkRvY3VtZW50ID09IG51bGwgJiYgbmV3SW5wdXQgIT0gbnVsbCkgewotCQkJcHJvamVjdGlvbkVuYWJsZWQoKTsKLQkJCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzY29ubmVjdCB0aGlzIElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlciBmcm9tIHByb2plY3Rpb24gdmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsKCkgewotCQlpZiAoaXNJbnN0YWxsZWQoKSkgewotCQkJcHJvamVjdGlvbkRpc2FibGVkKCk7Ci0KLQkJCWZWaWV3ZXIucmVtb3ZlUHJvamVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkJZlZpZXdlci5yZW1vdmVUZXh0SW5wdXRMaXN0ZW5lcih0aGlzKTsKLQkJCWZWaWV3ZXIgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NWFiOWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySFRNTCBpbXBsZW1lbnRzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgewotCi0KLQlwdWJsaWMgdm9pZCBhZGRBZGFwdGVyRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0KLQkJLy8gdGhlc2UgYXJlIHRoZSBub3JtYWwgZWRpdCBzaWRlIGNvbnRlbnQgYmFzZWQgZmFjdG9yaWVzCi0JCWFkZENvbnRlbnRCYXNlZEZhY3RvcmllcyhzdHJ1Y3R1cmVkTW9kZWwpOwotCQkvLyBNdXN0IHVwZGF0ZS9hZGQgdG8gcHJvcGFnYXRpbmcgYWRhcHRlciBoZXJlIHRvbwotCQlpZiAoc3RydWN0dXJlZE1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQlhZGRQcm9wYWdhdGluZ0FkYXB0ZXJzKHN0cnVjdHVyZWRNb2RlbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZW50QmFzZWRGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQotCQlGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5ID0gc3RydWN0dXJlZE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGZhY3RvcnlSZWdpc3RyeSwgIlByb2dyYW0gRXJyb3I6IGNsaWVudCBjYWxsZXIgbXVzdCBlbnN1cmUgbW9kZWwgaGFzIGZhY3RvcnkgcmVnaXN0cnkiKTsgLy8kTk9OLU5MUy0xJAotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCi0JCWZhY3RvcnkgPSBmYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCWZhY3RvcnkgPSBuZXcgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MKCk7Ci0JCQlmYWN0b3J5UmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BhZ2F0aW5nQWRhcHRlcnMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJLy8gbm8gcHJvcGFnYXRpbmcgdG8gYWRkCi0JfQotCi0JLyoKLQkgKiBAc2VlIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIjaXNGb3IoQ29udGVudFR5cGVEZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihJRG9jdW1lbnRUeXBlSGFuZGxlciBjb250ZW50VHlwZURlc2NyaXB0aW9uKSB7Ci0JCXJldHVybiAoY29udGVudFR5cGVEZXNjcmlwdGlvbiBpbnN0YW5jZW9mIE1vZGVsSGFuZGxlckZvckhUTUwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlaW5pdGlhbGl6ZUZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyBub3RoaW5nIHRvIGRvLCBzaW5jZSBubyBlbWJlZGRlZCB0eXBlCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9zZWFyY2gvSFRNTEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9zZWFyY2gvSFRNTEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYzJjNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvc2VhcmNoL0hUTUxGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5GaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBTZXRzIHVwIEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIGZvciBodG1sIGZpbmQgb2NjdXJyZW5jZXMgcHJvY2Vzc29ycwotICovCi1wdWJsaWMgY2xhc3MgSFRNTEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIGV4dGVuZHMgRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgTGlzdCBmUHJvY2Vzc29yczsKLQotCXByb3RlY3RlZCBMaXN0IGdldFByb2Nlc3NvcnMoKSB7Ci0JCWlmIChmUHJvY2Vzc29ycyA9PSBudWxsKSB7Ci0JCQlmUHJvY2Vzc29ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUhUTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgaHRtbFByb2Nlc3NvciA9IG5ldyBIVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yKCk7Ci0JCQlmUHJvY2Vzc29ycy5hZGQoaHRtbFByb2Nlc3Nvcik7Ci0JCX0KLQkJcmV0dXJuIGZQcm9jZXNzb3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3NlYXJjaC9IVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9zZWFyY2gvSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjBlZmExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3NlYXJjaC9IVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zOwotCi0vKioKLSAqIENvbmZpZ3VyZXMgYSBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3Igd2l0aCBIVE1MIHBhcnRpdGlvbnMgYW5kIHJlZ2lvbnMKLSAqLwotcHVibGljIGNsYXNzIEhUTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZXh0ZW5kcyBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgewotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFBhcnRpdGlvblR5cGVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0lIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQsIElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UmVnaW9uVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117RE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUsIERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSwgRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzSFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzSFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWY3NjVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0hUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zdHlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi0vKioKLSAqIENvbnRhaW5zIHRoZSBzeW1ib2xpYyBuYW1lIG9mIHN0eWxlcyB1c2VkIGJ5IExpbmVTdHlsZVByb3ZpZGVyLCBDb2xvck1hbmFnZXIsIGFuZAotICogYW55IG90aGVycyB3aG8gbWF5IGJlIGludGVyZXN0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3R5bGVDb25zdGFudHNIVE1MIGV4dGVuZHMgSVN0eWxlQ29uc3RhbnRzWE1MIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JJUFRfQVJFQV9CT1JERVIgPSAiU0NSSVBUX0FSRUFfQk9SREVSIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUX0FSRUEgPSAiU0NSSVBUX0FSRUEiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0M2VlYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JYTUw7Ci0KLXB1YmxpYyBjbGFzcyBMaW5lU3R5bGVQcm92aWRlckZvckhUTUwgZXh0ZW5kcyBMaW5lU3R5bGVQcm92aWRlckZvclhNTCBpbXBsZW1lbnRzIExpbmVTdHlsZVByb3ZpZGVyIHsKLQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlckZvckhUTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogYSBtZXRob2QgdG8gY2VudHJhbGl6ZSBhbGwgdGhlICJmb3JtYXQgcnVsZXMiIGZvciByZWdpb25zIAotCSAqIHNwZWNpZmljYWxseSBhc3NvY2lhdGVkIGZvciBob3cgdG8gIm9wZW4iIHRoZSByZWdpb24uCi0JICovCi0JLy8gTk9URTogdGhpcyBtZXRob2Qgd2FzIGp1c3QgY29waWVkIGRvd24gZm9ybSBMaW5lU3R5bGVQcm92aWRlckZvclhNTAotCXB1YmxpYyBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJLy8gbm90IHN1cmUgd2h5IHRoaXMgaXMgY29taW5nIHRocm91Z2ggbnVsbCwgYnV0IGp1c3QgdG8gY2F0Y2ggaXQKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQkJfQotCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSlnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQpOwotCQl9Ci0JCS8vIGZpcnN0IHRyeSAic3RhbmRhcmQiIHRhZyBhdHRyaWJ1dGVzIGZyb20gc3VwZXIgY2xhc3MKLQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZUZvcihyZWdpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRDb2xvcnMoKSB7Ci0JCXN1cGVyLmxvYWRDb2xvcnMoKTsKLQotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByZWZLZXkgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQkJLy8gY2hlY2sgaWYgcHJlZmVyZW5jZSBjaGFuZ2VkIGlzIGEgc3R5bGUgcHJlZmVyZW5jZQotCQkJaWYgKElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCi0JCQkJLy8gdGhpcyBpcyB3aGF0IEFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIucHJvcGVydHlDaGFuZ2UoKSBkb2VzCi0JCQkJZ2V0SGlnaGxpZ2h0ZXIoKS5yZWZyZXNoRGlzcGxheSgpOwotCQkJfSBlbHNlIHsKLQkJCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCX0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHlsZS5BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyI2dldENvbG9yUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RhZ2luZm8vSFRNTEluZm9ybWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RhZ2luZm8vSFRNTEluZm9ybWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4NTljNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90YWdpbmZvL0hUTUxJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLS8qKgotICogUHJvdmlkZXMgY29udGV4dCBpbmZvcm1hdGlvbiBmb3IgSFRNTCB0YWdzIChTaG93cyB0b29sdGlwIGRlc2NyaXB0aW9uKQotICogCi0gKiBAZGVwcmVjYXRlZCBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gY3JlYXRlcyB0aGUgYXBwcm9wcmlhdGUKLSAqICAgICAgICAgICAgIGluZm9ybWF0aW9uIHByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MSW5mb3JtYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIElJbmZvcm1hdGlvblByb3ZpZGVyLCBJSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbiB7Ci0KLQlwcml2YXRlIElUZXh0SG92ZXIgZlRleHRIb3ZlciA9IG51bGw7Ci0KLQlwdWJsaWMgSFRNTEluZm9ybWF0aW9uUHJvdmlkZXIoKSB7Ci0JCWZUZXh0SG92ZXIgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGV4dEhvdmVyTWFuYWdlcigpLmNyZWF0ZUJlc3RNYXRjaEhvdmVyKG5ldyBIVE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlciNnZXRTdWJqZWN0KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0U3ViamVjdChJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBmVGV4dEhvdmVyLmdldEhvdmVyUmVnaW9uKHRleHRWaWV3ZXIsIG9mZnNldCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyI2dldEluZm9ybWF0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHN1YmplY3QpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGdldEluZm9ybWF0aW9uMih0ZXh0Vmlld2VyLCBzdWJqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb24jZ2V0SW5mb3JtYXRpb24yKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbjIoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBzdWJqZWN0KSB7Ci0JCXJldHVybiBmVGV4dEhvdmVyLmdldEhvdmVySW5mbyh0ZXh0Vmlld2VyLCBzdWJqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90YWdpbmZvL0hUTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RhZ2luZm8vSFRNTFRhZ0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTkxODZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RhZ2luZm8vSFRNTFRhZ0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWdpbmZvLlhNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvcjsKLQotLyoqCi0gKiBQcm92aWRlcyBob3ZlciBoZWxwIGRvY3VtZW50YXRpb24gZm9yIEhUTUwgdGFncwotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yIGV4dGVuZHMgWE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yIHsKLQkvLwljdXJyZW50bHkgZW1wdHkgYmVjYXVzZSBYTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IgaGFuZGxlcyBhbGwgY2FzZXMgcmVsZXZhbnQgdG8gSFRNTAotCXB1YmxpYyBIVE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yKCkgewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL0VuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL0VuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2E3ZDE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9FbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuU2ltcGxlVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLQotCi1wdWJsaWMgY2xhc3MgRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJIVE1MIGV4dGVuZHMgU2ltcGxlVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkdfVFlQRSA9IGdldEVuY29kaW5nVHlwZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEVuY29kaW5nVHlwZSgpIHsKLQkJcmV0dXJuICJlbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVuY29kaW5nIHZhcmlhYmxlCi0JICovCi0JcHVibGljIEVuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySFRNTCgpIHsKLQkJc3VwZXIoRU5DT0RJTkdfVFlQRSwgSFRNTFVJTWVzc2FnZXMuQ3JlYXRpbmdfZmlsZXNfZW5jb2RpbmcpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZShUZW1wbGF0ZUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTE4MDU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkdsb2JhbFRlbXBsYXRlVmFyaWFibGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgSFRNTCB0ZW1wbGF0ZSBjb250ZXh0IHR5cGVzLiBUZW1wbGF0ZXMgb2YgdGhpcyBjb250ZXh0IHR5cGUKLSAqIGFwcGx5IHRvIGFueSBwbGFjZSB3aXRoaW4gSFRNTCBjb250ZW50IHR5cGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUNvbnRleHRUeXBlSFRNTCBleHRlbmRzIFRlbXBsYXRlQ29udGV4dFR5cGUgewotCi0JcHVibGljIFRlbXBsYXRlQ29udGV4dFR5cGVIVE1MKCkgewotCQlzdXBlcigpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuQ3Vyc29yKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuRGF0ZSgpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkRvbGxhcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkxpbmVTZWxlY3Rpb24oKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5UaW1lKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuVXNlcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLldvcmRTZWxlY3Rpb24oKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5ZZWFyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJIVE1MKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NGIxM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMID0gZ2V0QWxsKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEUgPSBnZXRBdHRyaWJ1dGUoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9WQUxVRSA9IGdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVcgPSBnZXROZXcoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IGdldFRhZygpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEFsbCgpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl9hbGwiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl9hdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX2F0dHJpYnV0ZV92YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmV3KCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX25ldyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGFnKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX3RhZyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlyZXR1cm4gImh0bWwiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9IVE1MRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9IVE1MRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTc1Y2RiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvSFRNTERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50ZXh0LkRvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEhUTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIGV4dGVuZHMgRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciB7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGNoYXJbXSBCUkFDS0VUUyA9IHsneycsICd9JywgJygnLCAnKScsICdbJywgJ10nLCciJywnIicsJ1wnJywnXCcnfTsKLQkvKioKLQkgKiBAcGFyYW0gdmFsaWRDb250ZXh0cwotCSAqIEBwYXJhbSBuZXh0TWF0Y2hlcgotCSAqLwotCXB1YmxpYyBIVE1MRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcigpIHsKLQkJc3VwZXIobmV3IFN0cmluZ1tde0RPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLCBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQsIERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQsIERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4sIERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NPTlRFTlR9LCBuZXcgSmF2YVBhaXJNYXRjaGVyKEJSQUNLRVRTKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9JSmF2YVBhcnRpdGlvbnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvSUphdmFQYXJ0aXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZDg1NjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9JSmF2YVBhcnRpdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZXh0OwotCi0vLyB0YWtlbiBmcm9tIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LnVpLnRleHQ7Ci0KLS8qKgotICogRGVmaW5pdGlvbiBvZiBKYXZhIHBhcnRpdGlvbmluZyBhbmQgaXRzIHBhcnRpdGlvbnMuCi0gKiAKLSAqIEBzZWUgRWNsaXBzZSAzLjEKLSAqLwotaW50ZXJmYWNlIElKYXZhUGFydGl0aW9ucyB7Ci0KLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgSmF2YSBwYXJ0aXRpb25pbmcuCi0JICovCi0JU3RyaW5nIEpBVkFfUEFSVElUSU9OSU5HID0gIl9fX2phdmFfcGFydGl0aW9uaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHNpbmdsZS1saW5lIChKTFMyOiBFbmRPZkxpbmVDb21tZW50KSBlbmQgY29tbWVudAotCSAqIHBhcnRpdGlvbiBjb250ZW50IHR5cGUuCi0JICovCi0JU3RyaW5nIEpBVkFfU0lOR0xFX0xJTkVfQ09NTUVOVCA9ICJfX2phdmFfc2luZ2xlbGluZV9jb21tZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGlkZW50aWZpZXIgbXVsdGktbGluZSAoSkxTMjogVHJhZGl0aW9uYWxDb21tZW50KSBjb21tZW50IHBhcnRpdGlvbgotCSAqIGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlTdHJpbmcgSkFWQV9NVUxUSV9MSU5FX0NPTU1FTlQgPSAiX19qYXZhX211bHRpbGluZV9jb21tZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIEphdmFkb2MgKEpMUzI6IERvY3VtZW50YXRpb25Db21tZW50KSBwYXJ0aXRpb24KLQkgKiBjb250ZW50IHR5cGUuCi0JICovCi0JU3RyaW5nIEpBVkFfRE9DID0gIl9famF2YV9qYXZhZG9jIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIEphdmEgc3RyaW5nIHBhcnRpdGlvbiBjb250ZW50IHR5cGUuCi0JICovCi0JU3RyaW5nIEpBVkFfU1RSSU5HID0gIl9famF2YV9zdHJpbmciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgSmF2YSBjaGFyYWN0ZXIgcGFydGl0aW9uIGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlTdHJpbmcgSkFWQV9DSEFSQUNURVIgPSAiX19qYXZhX2NoYXJhY3RlciI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvSmF2YUNvZGVSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvSmF2YUNvZGVSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjYWNlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0phdmFDb2RlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZXh0OwotCi0vLyB0YWtlbiBmcm9tIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LnVpLnRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5kZXJpdmVkLlNpbmdsZUNoYXJSZWFkZXI7Ci0KLS8qKgotICogUmVhZHMgZnJvbSBhIGRvY3VtZW50IGVpdGhlciBmb3J3YXJkcyBvciBiYWNrd2FyZHMuIE1heSBiZSBjb25maWd1cmVkIHRvCi0gKiBza2lwIGNvbW1lbnRzIGFuZCBzdHJpbmdzLgotICovCi1jbGFzcyBKYXZhQ29kZVJlYWRlciBleHRlbmRzIFNpbmdsZUNoYXJSZWFkZXIgewotCi0JLyoqIFRoZSBFT0YgY2hhcmFjdGVyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GID0gLTE7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlNraXBDb21tZW50cyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmU2tpcFN0cmluZ3MgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkZvcndhcmQgPSBmYWxzZTsKLQotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIGludCBmT2Zmc2V0OwotCi0JcHJpdmF0ZSBpbnQgZkVuZCA9IC0xOwotCXByaXZhdGUgaW50IGZDYWNoZWRMaW5lTnVtYmVyID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZkNhY2hlZExpbmVPZmZzZXQgPSAtMTsKLQotCi0JcHVibGljIEphdmFDb2RlUmVhZGVyKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgbGFzdCByZWFkIGNoYXJhY3Rlci4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkCi0JICogYWZ0ZXIgcmVhZCBoYXMgYmVlbiBjYWxsZWQuCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiBmRm9yd2FyZCA/IGZPZmZzZXQgLSAxIDogZk9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25maWd1cmVGb3J3YXJkUmVhZGVyKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgYm9vbGVhbiBza2lwQ29tbWVudHMsIGJvb2xlYW4gc2tpcFN0cmluZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQlmU2tpcENvbW1lbnRzID0gc2tpcENvbW1lbnRzOwotCQlmU2tpcFN0cmluZ3MgPSBza2lwU3RyaW5nczsKLQotCQlmRm9yd2FyZCA9IHRydWU7Ci0JCWZFbmQgPSBNYXRoLm1pbihmRG9jdW1lbnQuZ2V0TGVuZ3RoKCksIGZPZmZzZXQgKyBsZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUJhY2t3YXJkUmVhZGVyKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgYm9vbGVhbiBza2lwQ29tbWVudHMsIGJvb2xlYW4gc2tpcFN0cmluZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQlmU2tpcENvbW1lbnRzID0gc2tpcENvbW1lbnRzOwotCQlmU2tpcFN0cmluZ3MgPSBza2lwU3RyaW5nczsKLQotCQlmRm9yd2FyZCA9IGZhbHNlOwotCQl0cnkgewotCQkJZkNhY2hlZExpbmVOdW1iZXIgPSBmRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGZPZmZzZXQpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oeC5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJlYWRlciNjbG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmRG9jdW1lbnQgPSBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBTaW5nbGVDaGFyUmVhZGVyI3JlYWQoKQotCSAqLwotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZkZvcndhcmQgPyByZWFkRm9yd2FyZHMoKSA6IHJlYWRCYWNrd2FyZHMoKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKHguZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnb3RvQ29tbWVudEVuZCgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChmT2Zmc2V0IDwgZkVuZCkgewotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCsrKTsKLQkJCWlmIChjdXJyZW50ID09ICcqJykgewotCQkJCWlmIChmT2Zmc2V0IDwgZkVuZCAmJiBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KSA9PSAnLycpIHsKLQkJCQkJKytmT2Zmc2V0OwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdvdG9TdHJpbmdFbmQoY2hhciBkZWxpbWl0ZXIpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChmT2Zmc2V0IDwgZkVuZCkgewotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCsrKTsKLQkJCWlmIChjdXJyZW50ID09ICdcXCcpIHsKLQkJCQkvLyBpZ25vcmUgZXNjYXBlZCBjaGFyYWN0ZXJzCi0JCQkJKytmT2Zmc2V0OwotCQkJfQotCQkJZWxzZSBpZiAoY3VycmVudCA9PSBkZWxpbWl0ZXIpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ290b0xpbmVFbmQoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlpbnQgbGluZSA9IGZEb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZk9mZnNldCk7Ci0JCWZPZmZzZXQgPSBmRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lICsgMSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgcmVhZEZvcndhcmRzKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKGZPZmZzZXQgPCBmRW5kKSB7Ci0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KyspOwotCi0JCQlzd2l0Y2ggKGN1cnJlbnQpIHsKLQkJCQljYXNlICcvJyA6Ci0KLQkJCQkJaWYgKGZTa2lwQ29tbWVudHMgJiYgZk9mZnNldCA8IGZFbmQpIHsKLQkJCQkJCWNoYXIgbmV4dCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCQkJCQkJaWYgKG5leHQgPT0gJyonKSB7Ci0JCQkJCQkJLy8gYSBjb21tZW50IHN0YXJ0cywgYWR2YW5jZSB0byB0aGUgY29tbWVudCBlbmQKLQkJCQkJCQkrK2ZPZmZzZXQ7Ci0JCQkJCQkJZ290b0NvbW1lbnRFbmQoKTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKG5leHQgPT0gJy8nKSB7Ci0JCQkJCQkJLy8gJy8vJy1jb21tZW50IHN0YXJ0cywgYWR2YW5jZSB0byB0aGUgbGluZSBlbmQKLQkJCQkJCQlnb3RvTGluZUVuZCgpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0KLQkJCQljYXNlICciJyA6Ci0JCQkJY2FzZSAnXCcnIDoKLQotCQkJCQlpZiAoZlNraXBTdHJpbmdzKSB7Ci0JCQkJCQlnb3RvU3RyaW5nRW5kKGN1cnJlbnQpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm4gY3VycmVudDsKLQkJCX0KLQotCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCX0KLQotCQlyZXR1cm4gRU9GOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTaW5nbGVMaW5lQ29tbWVudCgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWludCBsaW5lID0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChmT2Zmc2V0KTsKLQkJaWYgKGxpbmUgPCBmQ2FjaGVkTGluZU51bWJlcikgewotCQkJZkNhY2hlZExpbmVOdW1iZXIgPSBsaW5lOwotCQkJZkNhY2hlZExpbmVPZmZzZXQgPSBmRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lKTsKLQkJCWludCBvZmZzZXQgPSBmT2Zmc2V0OwotCQkJd2hpbGUgKGZDYWNoZWRMaW5lT2Zmc2V0IDwgb2Zmc2V0KSB7Ci0JCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIob2Zmc2V0LS0pOwotCQkJCWlmIChjdXJyZW50ID09ICcvJyAmJiBmQ2FjaGVkTGluZU9mZnNldCA8PSBvZmZzZXQgJiYgZkRvY3VtZW50LmdldENoYXIob2Zmc2V0KSA9PSAnLycpIHsKLQkJCQkJZk9mZnNldCA9IG9mZnNldDsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnb3RvQ29tbWVudFN0YXJ0KCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKDAgPCBmT2Zmc2V0KSB7Ci0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0LS0pOwotCQkJaWYgKGN1cnJlbnQgPT0gJyonICYmIDAgPD0gZk9mZnNldCAmJiBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KSA9PSAnLycpCi0JCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdvdG9TdHJpbmdTdGFydChjaGFyIGRlbGltaXRlcikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKDAgPCBmT2Zmc2V0KSB7Ci0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KTsKLQkJCWlmIChjdXJyZW50ID09IGRlbGltaXRlcikgewotCQkJCWlmICghKDAgPD0gZk9mZnNldCAmJiBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0IC0gMSkgPT0gJ1xcJykpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCS0tZk9mZnNldDsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IHJlYWRCYWNrd2FyZHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCi0JCXdoaWxlICgwIDwgZk9mZnNldCkgewotCQkJLS1mT2Zmc2V0OwotCi0JCQloYW5kbGVTaW5nbGVMaW5lQ29tbWVudCgpOwotCi0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KTsKLQkJCXN3aXRjaCAoY3VycmVudCkgewotCQkJCWNhc2UgJy8nIDoKLQotCQkJCQlpZiAoZlNraXBDb21tZW50cyAmJiBmT2Zmc2V0ID4gMSkgewotCQkJCQkJY2hhciBuZXh0ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCAtIDEpOwotCQkJCQkJaWYgKG5leHQgPT0gJyonKSB7Ci0JCQkJCQkJLy8gYSBjb21tZW50IGVuZHMsIGFkdmFuY2UgdG8gdGhlIGNvbW1lbnQgc3RhcnQKLQkJCQkJCQlmT2Zmc2V0IC09IDI7Ci0JCQkJCQkJZ290b0NvbW1lbnRTdGFydCgpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0KLQkJCQljYXNlICciJyA6Ci0JCQkJY2FzZSAnXCcnIDoKLQotCQkJCQlpZiAoZlNraXBTdHJpbmdzKSB7Ci0JCQkJCQktLWZPZmZzZXQ7Ci0JCQkJCQlnb3RvU3RyaW5nU3RhcnQoY3VycmVudCk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCXJldHVybiBjdXJyZW50OwotCQkJfQotCi0JCQlyZXR1cm4gY3VycmVudDsKLQkJfQotCi0JCXJldHVybiBFT0Y7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9KYXZhSGV1cmlzdGljU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9KYXZhSGV1cmlzdGljU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTYwMmEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvSmF2YUhldXJpc3RpY1NjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGV4dDsKLQotLy8gdGFrZW4gZnJvbSBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlR5cGVkUmVnaW9uOwotCi0vKioKLSAqIFV0aWxpdHkgbWV0aG9kcyBmb3IgaGV1cmlzdGljIGJhc2VkIEphdmEgbWFuaXB1bGF0aW9ucyBpbiBhbiBpbmNvbXBsZXRlCi0gKiBKYXZhIHNvdXJjZSBmaWxlLgotICogCi0gKiA8cD4KLSAqIEFuIGluc3RhbmNlIGhvbGRzIHNvbWUgaW50ZXJuYWwgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50IGFuZCBpcyB0aGVyZWZvcmUKLSAqIG5vdCB0aHJlYWRzYWZlLgotICogPC9wPgotICogCi0gKiBAc2VlIEVjbGlwc2UgMy4wCi0gKi8KLWZpbmFsIGNsYXNzIEphdmFIZXVyaXN0aWNTY2FubmVyIGltcGxlbWVudHMgU3ltYm9scyB7Ci0JLyoqCi0JICogUmV0dXJuZWQgYnkgYWxsIG1ldGhvZHMgd2hlbiB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uIGNvdWxkIG5vdCBiZSBmb3VuZCwKLQkgKiBvciBpZiBhIHtAbGluayBCYWRMb2NhdGlvbkV4Y2VwdGlvbn0gd2FzIHRocm93biB3aGlsZSBzY2FubmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfRk9VTkQgPSAtMTsKLQotCS8qKgotCSAqIFNwZWNpYWwgYm91bmQgcGFyYW1ldGVyIHRoYXQgbWVhbnMgZWl0aGVyIC0xIChiYWNrd2FyZCBzY2FubmluZykgb3IKLQkgKiA8Y29kZT5mRG9jdW1lbnQuZ2V0TGVuZ3RoKCk8L2NvZGU+IChmb3J3YXJkIHNjYW5uaW5nKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkJPVU5EID0gLTI7Ci0KLQotCS8qIGNoYXJhY3RlciBjb25zdGFudHMgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIExCUkFDRSA9ICd7JzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFJCUkFDRSA9ICd9JzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIExQQVJFTiA9ICcoJzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFJQQVJFTiA9ICcpJzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNFTUlDT0xPTiA9ICc7JzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIENPTE9OID0gJzonOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQ09NTUEgPSAnLCc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBMQlJBQ0tFVCA9ICdbJzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFJCUkFDS0VUID0gJ10nOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUVVFU1RJT05NQVJLID0gJz8nOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRVFVQUwgPSAnPSc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBMQU5HTEUgPSAnPCc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBSQU5HTEUgPSAnPic7Ci0KLQkvKioKLQkgKiBTcGVjaWZpZXMgdGhlIHN0b3AgY29uZGl0aW9uLCB1cG9uIHdoaWNoIHRoZSA8Y29kZT5zY2FuWFhYPC9jb2RlPgotCSAqIG1ldGhvZHMgd2lsbCBkZWNpZGUgd2hldGhlciB0byBrZWVwIHNjYW5uaW5nIG9yIG5vdC4gVGhpcyBpbnRlcmZhY2UgbWF5Ci0JICogaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdG9wQ29uZGl0aW9uIHsKLQkJLyoqCi0JCSAqIEluc3RydWN0cyB0aGUgc2Nhbm5lciB0byByZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24uCi0JCSAqIAotCQkgKiBAcGFyYW0gY2gKLQkJICogICAgICAgICAgICB0aGUgY2hhciBhdCB0aGUgY3VycmVudCBwb3NpdGlvbgotCQkgKiBAcGFyYW0gcG9zaXRpb24KLQkJICogICAgICAgICAgICB0aGUgY3VycmVudCBwb3NpdGlvbgotCQkgKiBAcGFyYW0gZm9yd2FyZAotCQkgKiAgICAgICAgICAgIHRoZSBpdGVyYXRpb24gZGlyZWN0aW9uCi0JCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN0b3AgY29uZGl0aW9uIGlzIG1ldC4KLQkJICovCi0JCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN0b3AoY2hhciBjaCwgaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpOwotCi0JCS8qKgotCQkgKiBBc2tzIHRoZSBjb25kaXRpb24gdG8gcmV0dXJuIHRoZSBuZXh0IHBvc2l0aW9uIHRvIHF1ZXJ5LiBUaGUKLQkJICogZGVmYXVsdCBpcyB0byByZXR1cm4gdGhlIG5leHQvcHJldmlvdXMgcG9zaXRpb24uCi0JCSAqIAotCQkgKiBAcmV0dXJuIHRoZSBuZXh0IHBvc2l0aW9uIHRvIHNjYW4KLQkJICovCi0JCXB1YmxpYyBpbnQgbmV4dFBvc2l0aW9uKGludCBwb3NpdGlvbiwgYm9vbGVhbiBmb3J3YXJkKSB7Ci0JCQlyZXR1cm4gZm9yd2FyZCA/IHBvc2l0aW9uICsgMSA6IHBvc2l0aW9uIC0gMTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3BzIHVwb24gYSBub24td2hpdGVzcGFjZSAoYXMgZGVmaW5lZCBieQotCSAqIHtAbGluayBDaGFyYWN0ZXIjaXNXaGl0ZXNwYWNlKGNoYXIpfSkgY2hhcmFjdGVyLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIE5vbldoaXRlc3BhY2UgZXh0ZW5kcyBTdG9wQ29uZGl0aW9uIHsKLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5KYXZhSGV1cmlzdGljU2Nhbm5lci5TdG9wQ29uZGl0aW9uI3N0b3AoY2hhcikKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHN0b3AoY2hhciBjaCwgaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsKLQkJCXJldHVybiAhQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wcyB1cG9uIGEgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGluIHRoZSBkZWZhdWx0IHBhcnRpdGlvbi4KLQkgKiAKLQkgKiBAc2VlIE5vbldoaXRlc3BhY2UKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGNsYXNzIE5vbldoaXRlc3BhY2VEZWZhdWx0UGFydGl0aW9uIGV4dGVuZHMgTm9uV2hpdGVzcGFjZSB7Ci0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSmF2YUhldXJpc3RpY1NjYW5uZXIuU3RvcENvbmRpdGlvbiNzdG9wKGNoYXIpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzdG9wKGNoYXIgY2gsIGludCBwb3NpdGlvbiwgYm9vbGVhbiBmb3J3YXJkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuc3RvcChjaCwgcG9zaXRpb24sIHRydWUpICYmIGlzRGVmYXVsdFBhcnRpdGlvbihwb3NpdGlvbik7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkphdmFIZXVyaXN0aWNTY2FubmVyLlN0b3BDb25kaXRpb24jbmV4dFBvc2l0aW9uKGludCwKLQkJICogICAgICBib29sZWFuKQotCQkgKi8KLQkJcHVibGljIGludCBuZXh0UG9zaXRpb24oaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsKLQkJCUlUeXBlZFJlZ2lvbiBwYXJ0aXRpb24gPSBnZXRQYXJ0aXRpb24ocG9zaXRpb24pOwotCQkJaWYgKGZQYXJ0aXRpb24uZXF1YWxzKHBhcnRpdGlvbi5nZXRUeXBlKCkpKQotCQkJCXJldHVybiBzdXBlci5uZXh0UG9zaXRpb24ocG9zaXRpb24sIGZvcndhcmQpOwotCi0JCQlpZiAoZm9yd2FyZCkgewotCQkJCWludCBlbmQgPSBwYXJ0aXRpb24uZ2V0T2Zmc2V0KCkgKyBwYXJ0aXRpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJaWYgKHBvc2l0aW9uIDwgZW5kKQotCQkJCQlyZXR1cm4gZW5kOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IG9mZnNldCA9IHBhcnRpdGlvbi5nZXRPZmZzZXQoKTsKLQkJCQlpZiAocG9zaXRpb24gPiBvZmZzZXQpCi0JCQkJCXJldHVybiBvZmZzZXQgLSAxOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLm5leHRQb3NpdGlvbihwb3NpdGlvbiwgZm9yd2FyZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wcyB1cG9uIGEgbm9uLWphdmEgaWRlbnRpZmllciAoYXMgZGVmaW5lZCBieQotCSAqIHtAbGluayBDaGFyYWN0ZXIjaXNKYXZhSWRlbnRpZmllclBhcnQoY2hhcil9KSBjaGFyYWN0ZXIuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9uSmF2YUlkZW50aWZpZXJQYXJ0IGV4dGVuZHMgU3RvcENvbmRpdGlvbiB7Ci0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSmF2YUhldXJpc3RpY1NjYW5uZXIuU3RvcENvbmRpdGlvbiNzdG9wKGNoYXIpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzdG9wKGNoYXIgY2gsIGludCBwb3NpdGlvbiwgYm9vbGVhbiBmb3J3YXJkKSB7Ci0JCQlyZXR1cm4gIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjaCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wcyB1cG9uIGEgbm9uLWphdmEgaWRlbnRpZmllciBjaGFyYWN0ZXIgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uLgotCSAqIAotCSAqIEBzZWUgTm9uSmF2YUlkZW50aWZpZXJQYXJ0Ci0JICovCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBOb25KYXZhSWRlbnRpZmllclBhcnREZWZhdWx0UGFydGl0aW9uIGV4dGVuZHMgTm9uSmF2YUlkZW50aWZpZXJQYXJ0IHsKLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5KYXZhSGV1cmlzdGljU2Nhbm5lci5TdG9wQ29uZGl0aW9uI3N0b3AoY2hhcikKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHN0b3AoY2hhciBjaCwgaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsKLQkJCXJldHVybiBzdXBlci5zdG9wKGNoLCBwb3NpdGlvbiwgdHJ1ZSkgfHwgIWlzRGVmYXVsdFBhcnRpdGlvbihwb3NpdGlvbik7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkphdmFIZXVyaXN0aWNTY2FubmVyLlN0b3BDb25kaXRpb24jbmV4dFBvc2l0aW9uKGludCwKLQkJICogICAgICBib29sZWFuKQotCQkgKi8KLQkJcHVibGljIGludCBuZXh0UG9zaXRpb24oaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsKLQkJCUlUeXBlZFJlZ2lvbiBwYXJ0aXRpb24gPSBnZXRQYXJ0aXRpb24ocG9zaXRpb24pOwotCQkJaWYgKGZQYXJ0aXRpb24uZXF1YWxzKHBhcnRpdGlvbi5nZXRUeXBlKCkpKQotCQkJCXJldHVybiBzdXBlci5uZXh0UG9zaXRpb24ocG9zaXRpb24sIGZvcndhcmQpOwotCi0JCQlpZiAoZm9yd2FyZCkgewotCQkJCWludCBlbmQgPSBwYXJ0aXRpb24uZ2V0T2Zmc2V0KCkgKyBwYXJ0aXRpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJaWYgKHBvc2l0aW9uIDwgZW5kKQotCQkJCQlyZXR1cm4gZW5kOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IG9mZnNldCA9IHBhcnRpdGlvbi5nZXRPZmZzZXQoKTsKLQkJCQlpZiAocG9zaXRpb24gPiBvZmZzZXQpCi0JCQkJCXJldHVybiBvZmZzZXQgLSAxOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLm5leHRQb3NpdGlvbihwb3NpdGlvbiwgZm9yd2FyZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wcyB1cG9uIGEgY2hhcmFjdGVyIGluIHRoZSBkZWZhdWx0IHBhcnRpdGlvbiB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuCi0JICogY2hhcmFjdGVyIGxpc3QuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBDaGFyYWN0ZXJNYXRjaCBleHRlbmRzIFN0b3BDb25kaXRpb24gewotCQlwcml2YXRlIGZpbmFsIGNoYXJbXSBmQ2hhcnM7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JCSAqIAotCQkgKiBAcGFyYW0gY2gKLQkJICogICAgICAgICAgICB0aGUgc2luZ2xlIGNoYXJhY3RlciB0byBtYXRjaAotCQkgKi8KLQkJcHVibGljIENoYXJhY3Rlck1hdGNoKGNoYXIgY2gpIHsKLQkJCXRoaXMobmV3IGNoYXJbXXtjaH0pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JCSAqIAotCQkgKiBAcGFyYW0gY2hhcnMKLQkJICogICAgICAgICAgICB0aGUgY2hhcnMgdG8gbWF0Y2guCi0JCSAqLwotCQlwdWJsaWMgQ2hhcmFjdGVyTWF0Y2goY2hhcltdIGNoYXJzKSB7Ci0JCQlBc3NlcnQuaXNOb3ROdWxsKGNoYXJzKTsKLQkJCUFzc2VydC5pc1RydWUoY2hhcnMubGVuZ3RoID4gMCk7Ci0JCQlmQ2hhcnMgPSBjaGFyczsKLQkJCUFycmF5cy5zb3J0KGNoYXJzKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSmF2YUhldXJpc3RpY1NjYW5uZXIuU3RvcENvbmRpdGlvbiNzdG9wKGNoYXIsCi0JCSAqICAgICAgaW50KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gc3RvcChjaGFyIGNoLCBpbnQgcG9zaXRpb24sIGJvb2xlYW4gZm9yd2FyZCkgewotCQkJcmV0dXJuIEFycmF5cy5iaW5hcnlTZWFyY2goZkNoYXJzLCBjaCkgPj0gMCAmJiBpc0RlZmF1bHRQYXJ0aXRpb24ocG9zaXRpb24pOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5KYXZhSGV1cmlzdGljU2Nhbm5lci5TdG9wQ29uZGl0aW9uI25leHRQb3NpdGlvbihpbnQsCi0JCSAqICAgICAgYm9vbGVhbikKLQkJICovCi0JCXB1YmxpYyBpbnQgbmV4dFBvc2l0aW9uKGludCBwb3NpdGlvbiwgYm9vbGVhbiBmb3J3YXJkKSB7Ci0JCQlJVHlwZWRSZWdpb24gcGFydGl0aW9uID0gZ2V0UGFydGl0aW9uKHBvc2l0aW9uKTsKLQkJCWlmIChmUGFydGl0aW9uLmVxdWFscyhwYXJ0aXRpb24uZ2V0VHlwZSgpKSkKLQkJCQlyZXR1cm4gc3VwZXIubmV4dFBvc2l0aW9uKHBvc2l0aW9uLCBmb3J3YXJkKTsKLQotCQkJaWYgKGZvcndhcmQpIHsKLQkJCQlpbnQgZW5kID0gcGFydGl0aW9uLmdldE9mZnNldCgpICsgcGFydGl0aW9uLmdldExlbmd0aCgpOwotCQkJCWlmIChwb3NpdGlvbiA8IGVuZCkKLQkJCQkJcmV0dXJuIGVuZDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWludCBvZmZzZXQgPSBwYXJ0aXRpb24uZ2V0T2Zmc2V0KCk7Ci0JCQkJaWYgKHBvc2l0aW9uID4gb2Zmc2V0KQotCQkJCQlyZXR1cm4gb2Zmc2V0IC0gMTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5uZXh0UG9zaXRpb24ocG9zaXRpb24sIGZvcndhcmQpOwotCQl9Ci0JfQotCi0JLyoqIFRoZSBkb2N1bWVudCBiZWluZyBzY2FubmVkLiAqLwotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQkvKiogVGhlIHBhcnRpdGlvbmluZyBiZWluZyB1c2VkIGZvciBzY2FubmluZy4gKi8KLQlwcml2YXRlIFN0cmluZyBmUGFydGl0aW9uaW5nOwotCS8qKiBUaGUgcGFydGl0aW9uIHRvIHNjYW4gaW4uICovCi0JcHJpdmF0ZSBTdHJpbmcgZlBhcnRpdGlvbjsKLQotCS8qIGludGVybmFsIHNjYW4gc3RhdGUgKi8KLQotCS8qKiB0aGUgbW9zdCByZWNlbnRseSByZWFkIGNoYXJhY3Rlci4gKi8KLQlwcml2YXRlIGNoYXIgZkNoYXI7Ci0JLyoqIHRoZSBtb3N0IHJlY2VudGx5IHJlYWQgcG9zaXRpb24uICovCi0JcHJpdmF0ZSBpbnQgZlBvczsKLQotCS8qIHByZXNldCBzdG9wIGNvbmRpdGlvbnMgKi8KLQlwcml2YXRlIGZpbmFsIFN0b3BDb25kaXRpb24gZk5vbldTRGVmYXVsdFBhcnQgPSBuZXcgTm9uV2hpdGVzcGFjZURlZmF1bHRQYXJ0aXRpb24oKTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdG9wQ29uZGl0aW9uIGZOb25XUyA9IG5ldyBOb25XaGl0ZXNwYWNlKCk7Ci0JcHJpdmF0ZSBmaW5hbCBTdG9wQ29uZGl0aW9uIGZOb25JZGVudCA9IG5ldyBOb25KYXZhSWRlbnRpZmllclBhcnREZWZhdWx0UGFydGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHRvIHNjYW4KLQkgKiBAcGFyYW0gcGFydGl0aW9uaW5nCi0JICogICAgICAgICAgICB0aGUgcGFydGl0aW9uaW5nIHRvIHVzZSBmb3Igc2Nhbm5pbmcKLQkgKiBAcGFyYW0gcGFydGl0aW9uCi0JICogICAgICAgICAgICB0aGUgcGFydGl0aW9uIHRvIHNjYW4gaW4KLQkgKi8KLQlwdWJsaWMgSmF2YUhldXJpc3RpY1NjYW5uZXIoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcGFydGl0aW9uaW5nLCBTdHJpbmcgcGFydGl0aW9uKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoZG9jdW1lbnQpOwotCQlBc3NlcnQuaXNOb3ROdWxsKHBhcnRpdGlvbmluZyk7Ci0JCUFzc2VydC5pc05vdE51bGwocGFydGl0aW9uKTsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWZQYXJ0aXRpb25pbmcgPSBwYXJ0aXRpb25pbmc7Ci0JCWZQYXJ0aXRpb24gPSBwYXJ0aXRpb247Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMKLQkgKiA8Y29kZT50aGlzKGRvY3VtZW50LCBJSmF2YVBhcnRpdGlvbnMuSkFWQV9QQVJUSVRJT05JTkcsIElEb2N1bWVudC5ERUZBVUxUX0NPTlRFTlRfVFlQRSk8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHRvIHNjYW4uCi0JICovCi0JcHVibGljIEphdmFIZXVyaXN0aWNTY2FubmVyKElEb2N1bWVudCBkb2N1bWVudCkgewotCQl0aGlzKGRvY3VtZW50LCBJSmF2YVBhcnRpdGlvbnMuSkFWQV9QQVJUSVRJT05JTkcsIElEb2N1bWVudC5ERUZBVUxUX0NPTlRFTlRfVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9zdCByZWNlbnQgaW50ZXJuYWwgc2NhbiBwb3NpdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb3N0IHJlY2VudCBpbnRlcm5hbCBzY2FuIHBvc2l0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UG9zaXRpb24oKSB7Ci0JCXJldHVybiBmUG9zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5leHQgdG9rZW4gaW4gZm9yd2FyZCBkaXJlY3Rpb24sIHN0YXJ0aW5nIGF0Ci0JICogPGNvZGU+c3RhcnQ8L2NvZGU+LCBhbmQgbm90IGV4dGVuZGluZyBmdXJ0aGVyIHRoYW4KLQkgKiA8Y29kZT5ib3VuZDwvY29kZT4uIFRoZSByZXR1cm4gdmFsdWUgaXMgb25lIG9mIHRoZSBjb25zdGFudHMgZGVmaW5lZAotCSAqIGluIHtAbGluayBTeW1ib2xzfS4gQWZ0ZXIgYSBjYWxsLCB7QGxpbmsgI2dldFBvc2l0aW9uKCl9IHdpbGwgcmV0dXJuCi0JICogdGhlIHBvc2l0aW9uIGp1c3QgYWZ0ZXIgdGhlIHNjYW5uZWQgdG9rZW4gKGkuZS4gdGhlIG5leHQgcG9zaXRpb24gdGhhdAotCSAqIHdpbGwgYmUgc2Nhbm5lZCkuCi0JICogCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudCB0byBjb25zaWRlcgotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIG5vdCB0byBjb25zaWRlciBhbnkgbW9yZQotCSAqIEByZXR1cm4gYSBjb25zdGFudCBmcm9tIHtAbGluayBTeW1ib2xzfSBkZXNjcmliaW5nIHRoZSBuZXh0IHRva2VuCi0JICovCi0JcHVibGljIGludCBuZXh0VG9rZW4oaW50IHN0YXJ0LCBpbnQgYm91bmQpIHsKLQkJaW50IHBvcyA9IHNjYW5Gb3J3YXJkKHN0YXJ0LCBib3VuZCwgZk5vbldTRGVmYXVsdFBhcnQpOwotCQlpZiAocG9zID09IE5PVF9GT1VORCkKLQkJCXJldHVybiBUb2tlbkVPRjsKLQotCQlmUG9zKys7Ci0KLQkJc3dpdGNoIChmQ2hhcikgewotCQkJY2FzZSBMQlJBQ0UgOgotCQkJCXJldHVybiBUb2tlbkxCUkFDRTsKLQkJCWNhc2UgUkJSQUNFIDoKLQkJCQlyZXR1cm4gVG9rZW5SQlJBQ0U7Ci0JCQljYXNlIExCUkFDS0VUIDoKLQkJCQlyZXR1cm4gVG9rZW5MQlJBQ0tFVDsKLQkJCWNhc2UgUkJSQUNLRVQgOgotCQkJCXJldHVybiBUb2tlblJCUkFDS0VUOwotCQkJY2FzZSBMUEFSRU4gOgotCQkJCXJldHVybiBUb2tlbkxQQVJFTjsKLQkJCWNhc2UgUlBBUkVOIDoKLQkJCQlyZXR1cm4gVG9rZW5SUEFSRU47Ci0JCQljYXNlIFNFTUlDT0xPTiA6Ci0JCQkJcmV0dXJuIFRva2VuU0VNSUNPTE9OOwotCQkJY2FzZSBDT01NQSA6Ci0JCQkJcmV0dXJuIFRva2VuQ09NTUE7Ci0JCQljYXNlIFFVRVNUSU9OTUFSSyA6Ci0JCQkJcmV0dXJuIFRva2VuUVVFU1RJT05NQVJLOwotCQkJY2FzZSBFUVVBTCA6Ci0JCQkJcmV0dXJuIFRva2VuRVFVQUw7Ci0JCQljYXNlIExBTkdMRSA6Ci0JCQkJcmV0dXJuIFRva2VuTEVTU1RIQU47Ci0JCQljYXNlIFJBTkdMRSA6Ci0JCQkJcmV0dXJuIFRva2VuR1JFQVRFUlRIQU47Ci0JCX0KLQotCQkvLyBlbHNlCi0JCWlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoZkNoYXIpKSB7Ci0JCQkvLyBhc3N1bWUgYW4gaWRlbnQgb3Iga2V5d29yZAotCQkJaW50IGZyb20gPSBwb3MsIHRvOwotCQkJcG9zID0gc2NhbkZvcndhcmQocG9zICsgMSwgYm91bmQsIGZOb25JZGVudCk7Ci0JCQlpZiAocG9zID09IE5PVF9GT1VORCkKLQkJCQl0byA9IGJvdW5kID09IFVOQk9VTkQgPyBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgOiBib3VuZDsKLQkJCWVsc2UKLQkJCQl0byA9IHBvczsKLQotCQkJU3RyaW5nIGlkZW50T3JLZXl3b3JkOwotCQkJdHJ5IHsKLQkJCQlpZGVudE9yS2V5d29yZCA9IGZEb2N1bWVudC5nZXQoZnJvbSwgdG8gLSBmcm9tKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIFRva2VuRU9GOwotCQkJfQotCi0JCQlyZXR1cm4gZ2V0VG9rZW4oaWRlbnRPcktleXdvcmQpOwotCi0KLQkJfQotCQllbHNlIHsKLQkJCS8vIG9wZXJhdG9ycywgbnVtYmVyIGxpdGVyYWxzIGV0YwotCQkJcmV0dXJuIFRva2VuT1RIRVI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZXh0IHRva2VuIGluIGJhY2t3YXJkIGRpcmVjdGlvbiwgc3RhcnRpbmcgYXQKLQkgKiA8Y29kZT5zdGFydDwvY29kZT4sIGFuZCBub3QgZXh0ZW5kaW5nIGZ1cnRoZXIgdGhhbgotCSAqIDxjb2RlPmJvdW5kPC9jb2RlPi4gVGhlIHJldHVybiB2YWx1ZSBpcyBvbmUgb2YgdGhlIGNvbnN0YW50cyBkZWZpbmVkCi0JICogaW4ge0BsaW5rIFN5bWJvbHN9LiBBZnRlciBhIGNhbGwsIHtAbGluayAjZ2V0UG9zaXRpb24oKX0gd2lsbCByZXR1cm4KLQkgKiB0aGUgcG9zaXRpb24ganVzdCBiZWZvcmUgdGhlIHNjYW5uZWQgdG9rZW4gc3RhcnRzIChpLmUuIHRoZSBuZXh0Ci0JICogcG9zaXRpb24gdGhhdCB3aWxsIGJlIHNjYW5uZWQpLgotCSAqIAotCSAqIEBwYXJhbSBzdGFydAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQgdG8gY29uc2lkZXIKLQkgKiBAcGFyYW0gYm91bmQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBwb3NpdGlvbiBub3QgdG8gY29uc2lkZXIgYW55IG1vcmUKLQkgKiBAcmV0dXJuIGEgY29uc3RhbnQgZnJvbSB7QGxpbmsgU3ltYm9sc30gZGVzY3JpYmluZyB0aGUgcHJldmlvdXMgdG9rZW4KLQkgKi8KLQlwdWJsaWMgaW50IHByZXZpb3VzVG9rZW4oaW50IHN0YXJ0LCBpbnQgYm91bmQpIHsKLQkJaW50IHBvcyA9IHNjYW5CYWNrd2FyZChzdGFydCwgYm91bmQsIGZOb25XU0RlZmF1bHRQYXJ0KTsKLQkJaWYgKHBvcyA9PSBOT1RfRk9VTkQpCi0JCQlyZXR1cm4gVG9rZW5FT0Y7Ci0KLQkJZlBvcy0tOwotCi0JCXN3aXRjaCAoZkNoYXIpIHsKLQkJCWNhc2UgTEJSQUNFIDoKLQkJCQlyZXR1cm4gVG9rZW5MQlJBQ0U7Ci0JCQljYXNlIFJCUkFDRSA6Ci0JCQkJcmV0dXJuIFRva2VuUkJSQUNFOwotCQkJY2FzZSBMQlJBQ0tFVCA6Ci0JCQkJcmV0dXJuIFRva2VuTEJSQUNLRVQ7Ci0JCQljYXNlIFJCUkFDS0VUIDoKLQkJCQlyZXR1cm4gVG9rZW5SQlJBQ0tFVDsKLQkJCWNhc2UgTFBBUkVOIDoKLQkJCQlyZXR1cm4gVG9rZW5MUEFSRU47Ci0JCQljYXNlIFJQQVJFTiA6Ci0JCQkJcmV0dXJuIFRva2VuUlBBUkVOOwotCQkJY2FzZSBTRU1JQ09MT04gOgotCQkJCXJldHVybiBUb2tlblNFTUlDT0xPTjsKLQkJCWNhc2UgQ09MT04gOgotCQkJCXJldHVybiBUb2tlbkNPTE9OOwotCQkJY2FzZSBDT01NQSA6Ci0JCQkJcmV0dXJuIFRva2VuQ09NTUE7Ci0JCQljYXNlIFFVRVNUSU9OTUFSSyA6Ci0JCQkJcmV0dXJuIFRva2VuUVVFU1RJT05NQVJLOwotCQkJY2FzZSBFUVVBTCA6Ci0JCQkJcmV0dXJuIFRva2VuRVFVQUw7Ci0JCQljYXNlIExBTkdMRSA6Ci0JCQkJcmV0dXJuIFRva2VuTEVTU1RIQU47Ci0JCQljYXNlIFJBTkdMRSA6Ci0JCQkJcmV0dXJuIFRva2VuR1JFQVRFUlRIQU47Ci0JCX0KLQotCQkvLyBlbHNlCi0JCWlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoZkNoYXIpKSB7Ci0JCQkvLyBhc3N1bWUgYW4gaWRlbnQgb3Iga2V5d29yZAotCQkJaW50IGZyb20sIHRvID0gcG9zICsgMTsKLQkJCXBvcyA9IHNjYW5CYWNrd2FyZChwb3MgLSAxLCBib3VuZCwgZk5vbklkZW50KTsKLQkJCWlmIChwb3MgPT0gTk9UX0ZPVU5EKQotCQkJCWZyb20gPSBib3VuZCA9PSBVTkJPVU5EID8gMCA6IGJvdW5kICsgMTsKLQkJCWVsc2UKLQkJCQlmcm9tID0gcG9zICsgMTsKLQotCQkJU3RyaW5nIGlkZW50T3JLZXl3b3JkOwotCQkJdHJ5IHsKLQkJCQlpZGVudE9yS2V5d29yZCA9IGZEb2N1bWVudC5nZXQoZnJvbSwgdG8gLSBmcm9tKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIFRva2VuRU9GOwotCQkJfQotCi0JCQlyZXR1cm4gZ2V0VG9rZW4oaWRlbnRPcktleXdvcmQpOwotCi0KLQkJfQotCQllbHNlIHsKLQkJCS8vIG9wZXJhdG9ycywgbnVtYmVyIGxpdGVyYWxzIGV0YwotCQkJcmV0dXJuIFRva2VuT1RIRVI7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgb25lIG9mIHRoZSBrZXl3b3JkIGNvbnN0YW50cyBvciA8Y29kZT5Ub2tlbklERU5UPC9jb2RlPiBmb3IgYQotCSAqIHNjYW5uZWQgaWRlbnRpZmllci4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgYSBzY2FubmVkIGlkZW50aWZpZXIKLQkgKiBAcmV0dXJuIG9uZSBvZiB0aGUgY29uc3RhbnRzIGRlZmluZWQgaW4ge0BsaW5rIFN5bWJvbHN9Ci0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0VG9rZW4oU3RyaW5nIHMpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChzKTsKLQotCQlzd2l0Y2ggKHMubGVuZ3RoKCkpIHsKLQkJCWNhc2UgMiA6Ci0JCQkJaWYgKCJpZiIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbklGOwotCQkJCWlmICgiZG8iLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5ETzsKLQkJCQlicmVhazsKLQkJCWNhc2UgMyA6Ci0JCQkJaWYgKCJmb3IiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5GT1I7Ci0JCQkJaWYgKCJ0cnkiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5UUlk7Ci0JCQkJaWYgKCJuZXciLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5ORVc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDQgOgotCQkJCWlmICgiY2FzZSIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbkNBU0U7Ci0JCQkJaWYgKCJlbHNlIi5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuRUxTRTsKLQkJCQlpZiAoImVudW0iLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5FTlVNOwotCQkJCWlmICgiZ290byIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbkdPVE87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDUgOgotCQkJCWlmICgiYnJlYWsiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5CUkVBSzsKLQkJCQlpZiAoImNhdGNoIi5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuQ0FUQ0g7Ci0JCQkJaWYgKCJjbGFzcyIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbkNMQVNTOwotCQkJCWlmICgid2hpbGUiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5XSElMRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNiA6Ci0JCQkJaWYgKCJyZXR1cm4iLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5SRVRVUk47Ci0JCQkJaWYgKCJzdGF0aWMiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5TVEFUSUM7Ci0JCQkJaWYgKCJzd2l0Y2giLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5TV0lUQ0g7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDcgOgotCQkJCWlmICgiZGVmYXVsdCIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbkRFRkFVTFQ7Ci0JCQkJaWYgKCJmaW5hbGx5Ii5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuRklOQUxMWTsKLQkJCQlicmVhazsKLQkJCWNhc2UgOSA6Ci0JCQkJaWYgKCJpbnRlcmZhY2UiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5JTlRFUkZBQ0U7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDEyIDoKLQkJCQlpZiAoInN5bmNocm9uaXplZCIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlblNZTkNIUk9OSVpFRDsKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gVG9rZW5JREVOVDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2xvc2luZyBwZWVyIGNoYXJhY3RlciAoZm9yd2FyZCBzZWFyY2gpLgotCSAqIEFueSBzY29wZXMgaW50cm9kdWNlZCBieSBvcGVuaW5nIHBlZXJzIGFyZSBza2lwcGVkLiBBbGwgcGVlcnMgYWNjb3VudGVkCi0JICogZm9yIG11c3QgcmVzaWRlIGluIHRoZSBkZWZhdWx0IHBhcnRpdGlvbi4KLQkgKiAKLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgPGNvZGU+c3RhcnQ8L2NvZGU+IG11c3Qgbm90IHBvaW50IHRvIHRoZSBvcGVuaW5nIHBlZXIsIGJ1dAotCSAqIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYmVpbmcgc2VhcmNoZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBzdGFydAotCSAqICAgICAgICAgICAgdGhlIHN0YXJ0IHBvc2l0aW9uCi0JICogQHBhcmFtIG9wZW5pbmdQZWVyCi0JICogICAgICAgICAgICB0aGUgb3BlbmluZyBwZWVyIGNoYXJhY3RlciAoZS5nLiAneycpCi0JICogQHBhcmFtIGNsb3NpbmdQZWVyCi0JICogICAgICAgICAgICB0aGUgY2xvc2luZyBwZWVyIGNoYXJhY3RlciAoZS5nLiAnfScpCi0JICogQHJldHVybiB0aGUgbWF0Y2hpbmcgcGVlciBjaGFyYWN0ZXIgcG9zaXRpb24sIG9yIDxjb2RlPk5PVF9GT1VORDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgaW50IGZpbmRDbG9zaW5nUGVlcihpbnQgc3RhcnQsIGZpbmFsIGNoYXIgb3BlbmluZ1BlZXIsIGZpbmFsIGNoYXIgY2xvc2luZ1BlZXIpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChmRG9jdW1lbnQpOwotCQlBc3NlcnQuaXNUcnVlKHN0YXJ0ID49IDApOwotCi0JCXRyeSB7Ci0JCQlpbnQgZGVwdGggPSAxOwotCQkJc3RhcnQgLT0gMTsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJc3RhcnQgPSBzY2FuRm9yd2FyZChzdGFydCArIDEsIFVOQk9VTkQsIG5ldyBDaGFyYWN0ZXJNYXRjaChuZXcgY2hhcltde29wZW5pbmdQZWVyLCBjbG9zaW5nUGVlcn0pKTsKLQkJCQlpZiAoc3RhcnQgPT0gTk9UX0ZPVU5EKQotCQkJCQlyZXR1cm4gTk9UX0ZPVU5EOwotCi0JCQkJaWYgKGZEb2N1bWVudC5nZXRDaGFyKHN0YXJ0KSA9PSBvcGVuaW5nUGVlcikKLQkJCQkJZGVwdGgrKzsKLQkJCQllbHNlCi0JCQkJCWRlcHRoLS07Ci0KLQkJCQlpZiAoZGVwdGggPT0gMCkKLQkJCQkJcmV0dXJuIHN0YXJ0OwotCQkJfQotCi0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBOT1RfRk9VTkQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgb3BlbmluZyBwZWVyIGNoYXJhY3RlciAoYmFja3dhcmQgc2VhcmNoKS4KLQkgKiBBbnkgc2NvcGVzIGludHJvZHVjZWQgYnkgY2xvc2luZyBwZWVycyBhcmUgc2tpcHBlZC4gQWxsIHBlZXJzIGFjY291bnRlZAotCSAqIGZvciBtdXN0IHJlc2lkZSBpbiB0aGUgZGVmYXVsdCBwYXJ0aXRpb24uCi0JICogCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IDxjb2RlPnN0YXJ0PC9jb2RlPiBtdXN0IG5vdCBwb2ludCB0byB0aGUgY2xvc2luZyBwZWVyLCBidXQKLQkgKiB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIGJlaW5nIHNlYXJjaGVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiAgICAgICAgICAgIHRoZSBzdGFydCBwb3NpdGlvbgotCSAqIEBwYXJhbSBvcGVuaW5nUGVlcgotCSAqICAgICAgICAgICAgdGhlIG9wZW5pbmcgcGVlciBjaGFyYWN0ZXIgKGUuZy4gJ3snKQotCSAqIEBwYXJhbSBjbG9zaW5nUGVlcgotCSAqICAgICAgICAgICAgdGhlIGNsb3NpbmcgcGVlciBjaGFyYWN0ZXIgKGUuZy4gJ30nKQotCSAqIEByZXR1cm4gdGhlIG1hdGNoaW5nIHBlZXIgY2hhcmFjdGVyIHBvc2l0aW9uLCBvciA8Y29kZT5OT1RfRk9VTkQ8L2NvZGU+Ci0JICovCi0JcHVibGljIGludCBmaW5kT3BlbmluZ1BlZXIoaW50IHN0YXJ0LCBjaGFyIG9wZW5pbmdQZWVyLCBjaGFyIGNsb3NpbmdQZWVyKSB7Ci0JCUFzc2VydC5pc1RydWUoc3RhcnQgPCBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpOwotCi0JCXRyeSB7Ci0JCQlpbnQgZGVwdGggPSAxOwotCQkJc3RhcnQgKz0gMTsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJc3RhcnQgPSBzY2FuQmFja3dhcmQoc3RhcnQgLSAxLCBVTkJPVU5ELCBuZXcgQ2hhcmFjdGVyTWF0Y2gobmV3IGNoYXJbXXtvcGVuaW5nUGVlciwgY2xvc2luZ1BlZXJ9KSk7Ci0JCQkJaWYgKHN0YXJ0ID09IE5PVF9GT1VORCkKLQkJCQkJcmV0dXJuIE5PVF9GT1VORDsKLQotCQkJCWlmIChmRG9jdW1lbnQuZ2V0Q2hhcihzdGFydCkgPT0gY2xvc2luZ1BlZXIpCi0JCQkJCWRlcHRoKys7Ci0JCQkJZWxzZQotCQkJCQlkZXB0aC0tOwotCi0JCQkJaWYgKGRlcHRoID09IDApCi0JCQkJCXJldHVybiBzdGFydDsKLQkJCX0KLQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gTk9UX0ZPVU5EOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIHN1cnJvdW5kaW5nIGJsb2NrIGFyb3VuZCA8Y29kZT5vZmZzZXQ8L2NvZGU+LiBUaGUKLQkgKiBzZWFyY2ggaXMgc3RhcnRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIDxjb2RlPm9mZnNldDwvY29kZT4sIGkuZS4gYW4KLQkgKiBvcGVuaW5nIGJyYWNlIGF0IDxjb2RlPm9mZnNldDwvY29kZT4gd2lsbCBub3QgYmUgcGFydCBvZiB0aGUKLQkgKiBzdXJyb3VuZGluZyBibG9jaywgYnV0IGEgY2xvc2luZyBicmFjZSB3aWxsLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgZm9yIHdoaWNoIHRoZSBzdXJyb3VuZGluZyBibG9jayBpcyBjb21wdXRlZAotCSAqIEByZXR1cm4gYSByZWdpb24gZGVzY3JpYmluZyB0aGUgc3Vycm91bmRpbmcgYmxvY2ssIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICBpZiBub25lIGNhbiBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBJUmVnaW9uIGZpbmRTdXJyb3VuZGluZ0Jsb2NrKGludCBvZmZzZXQpIHsKLQkJaWYgKG9mZnNldCA8IDEgfHwgb2Zmc2V0ID49IGZEb2N1bWVudC5nZXRMZW5ndGgoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBiZWdpbiA9IGZpbmRPcGVuaW5nUGVlcihvZmZzZXQgLSAxLCBMQlJBQ0UsIFJCUkFDRSk7Ci0JCWludCBlbmQgPSBmaW5kQ2xvc2luZ1BlZXIob2Zmc2V0LCBMQlJBQ0UsIFJCUkFDRSk7Ci0JCWlmIChiZWdpbiA9PSBOT1RfRk9VTkQgfHwgZW5kID09IE5PVF9GT1VORCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbmV3IFJlZ2lvbihiZWdpbiwgZW5kICsgMSAtIGJlZ2luKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgc21hbGxlc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiBzdWNoIHRoYXQgdGhlCi0JICogcG9zaXRpb24gaXMgJmd0Oz0gPGNvZGU+cG9zaXRpb248L2NvZGU+IGFuZCAmbHQ7IDxjb2RlPmJvdW5kPC9jb2RlPgotCSAqIGFuZCA8Y29kZT5DaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGZEb2N1bWVudC5nZXRDaGFyKHBvcykpPC9jb2RlPgotCSAqIGV2YWx1YXRlcyB0byA8Y29kZT5mYWxzZTwvY29kZT4gYW5kIHRoZSBwb3NpdGlvbiBpcyBpbiB0aGUgZGVmYXVsdAotCSAqIHBhcnRpdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgYmUgY29uc2lkZXJlZAotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gbm90Ci0JICogICAgICAgICAgICBjb25zaWRlciBhbnkgbW9yZSwgd2l0aCA8Y29kZT5ib3VuZDwvY29kZT4gJmd0OwotCSAqICAgICAgICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+LCBvciA8Y29kZT5VTkJPVU5EPC9jb2RlPgotCSAqIEByZXR1cm4gdGhlIHNtYWxsZXN0IHBvc2l0aW9uIG9mIGEgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGluIFs8Y29kZT5wb3NpdGlvbjwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT5ib3VuZDwvY29kZT4pIHRoYXQgcmVzaWRlcyBpbiBhIEphdmEgcGFydGl0aW9uLCBvcgotCSAqICAgICAgICAgPGNvZGU+Tk9UX0ZPVU5EPC9jb2RlPiBpZiBub25lIGNhbiBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBpbnQgZmluZE5vbldoaXRlc3BhY2VGb3J3YXJkKGludCBwb3NpdGlvbiwgaW50IGJvdW5kKSB7Ci0JCXJldHVybiBzY2FuRm9yd2FyZChwb3NpdGlvbiwgYm91bmQsIGZOb25XU0RlZmF1bHRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgc21hbGxlc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiBzdWNoIHRoYXQgdGhlCi0JICogcG9zaXRpb24gaXMgJmd0Oz0gPGNvZGU+cG9zaXRpb248L2NvZGU+IGFuZCAmbHQ7IDxjb2RlPmJvdW5kPC9jb2RlPgotCSAqIGFuZCA8Y29kZT5DaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGZEb2N1bWVudC5nZXRDaGFyKHBvcykpPC9jb2RlPgotCSAqIGV2YWx1YXRlcyB0byA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIGJlIGNvbnNpZGVyZWQKLQkgKiBAcGFyYW0gYm91bmQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvIG5vdAotCSAqICAgICAgICAgICAgY29uc2lkZXIgYW55IG1vcmUsIHdpdGggPGNvZGU+Ym91bmQ8L2NvZGU+ICZndDsKLQkgKiAgICAgICAgICAgIDxjb2RlPnBvc2l0aW9uPC9jb2RlPiwgb3IgPGNvZGU+VU5CT1VORDwvY29kZT4KLQkgKiBAcmV0dXJuIHRoZSBzbWFsbGVzdCBwb3NpdGlvbiBvZiBhIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpbiBbPGNvZGU+cG9zaXRpb248L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+Ym91bmQ8L2NvZGU+KSwgb3IgPGNvZGU+Tk9UX0ZPVU5EPC9jb2RlPiBpZiBub25lIGNhbgotCSAqICAgICAgICAgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgaW50IGZpbmROb25XaGl0ZXNwYWNlRm9yd2FyZEluQW55UGFydGl0aW9uKGludCBwb3NpdGlvbiwgaW50IGJvdW5kKSB7Ci0JCXJldHVybiBzY2FuRm9yd2FyZChwb3NpdGlvbiwgYm91bmQsIGZOb25XUyk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIGhpZ2hlc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiBzdWNoIHRoYXQgdGhlCi0JICogcG9zaXRpb24gaXMgJmx0Oz0gPGNvZGU+cG9zaXRpb248L2NvZGU+IGFuZCAmZ3Q7IDxjb2RlPmJvdW5kPC9jb2RlPgotCSAqIGFuZCA8Y29kZT5DaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGZEb2N1bWVudC5nZXRDaGFyKHBvcykpPC9jb2RlPgotCSAqIGV2YWx1YXRlcyB0byA8Y29kZT5mYWxzZTwvY29kZT4gYW5kIHRoZSBwb3NpdGlvbiBpcyBpbiB0aGUgZGVmYXVsdAotCSAqIHBhcnRpdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgYmUgY29uc2lkZXJlZAotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gbm90Ci0JICogICAgICAgICAgICBjb25zaWRlciBhbnkgbW9yZSwgd2l0aCA8Y29kZT5ib3VuZDwvY29kZT4gJmx0OwotCSAqICAgICAgICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+LCBvciA8Y29kZT5VTkJPVU5EPC9jb2RlPgotCSAqIEByZXR1cm4gdGhlIGhpZ2hlc3QgcG9zaXRpb24gb2YgYSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaW4gKDxjb2RlPmJvdW5kPC9jb2RlPiwKLQkgKiAgICAgICAgIDxjb2RlPnBvc2l0aW9uPC9jb2RlPl0gdGhhdCByZXNpZGVzIGluIGEgSmF2YSBwYXJ0aXRpb24sIG9yCi0JICogICAgICAgICA8Y29kZT5OT1RfRk9VTkQ8L2NvZGU+IGlmIG5vbmUgY2FuIGJlIGZvdW5kCi0JICovCi0JcHVibGljIGludCBmaW5kTm9uV2hpdGVzcGFjZUJhY2t3YXJkKGludCBwb3NpdGlvbiwgaW50IGJvdW5kKSB7Ci0JCXJldHVybiBzY2FuQmFja3dhcmQocG9zaXRpb24sIGJvdW5kLCBmTm9uV1NEZWZhdWx0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIGxvd2VzdCBwb3NpdGlvbiA8Y29kZT5wPC9jb2RlPiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+Ci0JICogc3VjaCB0aGF0IDxjb2RlPnN0YXJ0PC9jb2RlPiAmbHQ7PSBwICZsdDsgPGNvZGU+Ym91bmQ8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmNvbmRpdGlvbi5zdG9wKGZEb2N1bWVudC5nZXRDaGFyKHApLCBwKTwvY29kZT4gZXZhbHVhdGVzIHRvCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIGJlIGNvbnNpZGVyZWQKLQkgKiBAcGFyYW0gYm91bmQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvIG5vdAotCSAqICAgICAgICAgICAgY29uc2lkZXIgYW55IG1vcmUsIHdpdGggPGNvZGU+Ym91bmQ8L2NvZGU+ICZndDsKLQkgKiAgICAgICAgICAgIDxjb2RlPnN0YXJ0PC9jb2RlPiwgb3IgPGNvZGU+VU5CT1VORDwvY29kZT4KLQkgKiBAcGFyYW0gY29uZGl0aW9uCi0JICogICAgICAgICAgICB0aGUgPGNvZGU+U3RvcENvbmRpdGlvbjwvY29kZT4gdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRoZSBsb3dlc3QgcG9zaXRpb24gaW4gWzxjb2RlPnN0YXJ0PC9jb2RlPiwKLQkgKiAgICAgICAgIDxjb2RlPmJvdW5kPC9jb2RlPikgZm9yIHdoaWNoIDxjb2RlPmNvbmRpdGlvbjwvY29kZT4KLQkgKiAgICAgICAgIGhvbGRzLCBvciA8Y29kZT5OT1RfRk9VTkQ8L2NvZGU+IGlmIG5vbmUgY2FuIGJlIGZvdW5kCi0JICovCi0JcHVibGljIGludCBzY2FuRm9yd2FyZChpbnQgc3RhcnQsIGludCBib3VuZCwgU3RvcENvbmRpdGlvbiBjb25kaXRpb24pIHsKLQkJQXNzZXJ0LmlzVHJ1ZShzdGFydCA+PSAwKTsKLQotCQlpZiAoYm91bmQgPT0gVU5CT1VORCkKLQkJCWJvdW5kID0gZkRvY3VtZW50LmdldExlbmd0aCgpOwotCi0JCUFzc2VydC5pc1RydWUoYm91bmQgPD0gZkRvY3VtZW50LmdldExlbmd0aCgpKTsKLQotCQl0cnkgewotCQkJZlBvcyA9IHN0YXJ0OwotCQkJd2hpbGUgKGZQb3MgPCBib3VuZCkgewotCi0JCQkJZkNoYXIgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmUG9zKTsKLQkJCQlpZiAoY29uZGl0aW9uLnN0b3AoZkNoYXIsIGZQb3MsIHRydWUpKQotCQkJCQlyZXR1cm4gZlBvczsKLQotCQkJCWZQb3MgPSBjb25kaXRpb24ubmV4dFBvc2l0aW9uKGZQb3MsIHRydWUpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIE5PVF9GT1VORDsKLQl9Ci0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSBsb3dlc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiBzdWNoIHRoYXQgdGhlCi0JICogcG9zaXRpb24gaXMgJmd0Oz0gPGNvZGU+cG9zaXRpb248L2NvZGU+IGFuZCAmbHQ7IDxjb2RlPmJvdW5kPC9jb2RlPgotCSAqIGFuZCA8Y29kZT5mRG9jdW1lbnQuZ2V0Q2hhcihwb3NpdGlvbikgPT0gY2g8L2NvZGU+IGV2YWx1YXRlcyB0bwotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGFuZCB0aGUgcG9zaXRpb24gaXMgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBiZSBjb25zaWRlcmVkCi0JICogQHBhcmFtIGJvdW5kCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0byBub3QKLQkgKiAgICAgICAgICAgIGNvbnNpZGVyIGFueSBtb3JlLCB3aXRoIDxjb2RlPmJvdW5kPC9jb2RlPiAmZ3Q7Ci0JICogICAgICAgICAgICA8Y29kZT5wb3NpdGlvbjwvY29kZT4sIG9yIDxjb2RlPlVOQk9VTkQ8L2NvZGU+Ci0JICogQHBhcmFtIGNoCi0JICogICAgICAgICAgICB0aGUgPGNvZGU+Y2hhcjwvY29kZT4gdG8gc2VhcmNoIGZvcgotCSAqIEByZXR1cm4gdGhlIGxvd2VzdCBwb3NpdGlvbiBvZiA8Y29kZT5jaDwvY29kZT4gaW4gKDxjb2RlPmJvdW5kPC9jb2RlPiwKLQkgKiAgICAgICAgIDxjb2RlPnBvc2l0aW9uPC9jb2RlPl0gdGhhdCByZXNpZGVzIGluIGEgSmF2YSBwYXJ0aXRpb24sIG9yCi0JICogICAgICAgICA8Y29kZT5OT1RfRk9VTkQ8L2NvZGU+IGlmIG5vbmUgY2FuIGJlIGZvdW5kCi0JICovCi0JcHVibGljIGludCBzY2FuRm9yd2FyZChpbnQgcG9zaXRpb24sIGludCBib3VuZCwgY2hhciBjaCkgewotCQlyZXR1cm4gc2NhbkZvcndhcmQocG9zaXRpb24sIGJvdW5kLCBuZXcgQ2hhcmFjdGVyTWF0Y2goY2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgbG93ZXN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gc3VjaCB0aGF0IHRoZQotCSAqIHBvc2l0aW9uIGlzICZndDs9IDxjb2RlPnBvc2l0aW9uPC9jb2RlPiBhbmQgJmx0OyA8Y29kZT5ib3VuZDwvY29kZT4KLQkgKiBhbmQgPGNvZGU+ZkRvY3VtZW50LmdldENoYXIocG9zaXRpb24pID09IGNoPC9jb2RlPiBldmFsdWF0ZXMgdG8KLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBmb3IgYXQgbGVhc3Qgb25lIGNoIGluIDxjb2RlPmNoYXJzPC9jb2RlPiBhbmQgdGhlCi0JICogcG9zaXRpb24gaXMgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBiZSBjb25zaWRlcmVkCi0JICogQHBhcmFtIGJvdW5kCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0byBub3QKLQkgKiAgICAgICAgICAgIGNvbnNpZGVyIGFueSBtb3JlLCB3aXRoIDxjb2RlPmJvdW5kPC9jb2RlPiAmZ3Q7Ci0JICogICAgICAgICAgICA8Y29kZT5wb3NpdGlvbjwvY29kZT4sIG9yIDxjb2RlPlVOQk9VTkQ8L2NvZGU+Ci0JICogQHBhcmFtIGNoYXJzCi0JICogICAgICAgICAgICBhbiBhcnJheSBvZiA8Y29kZT5jaGFyPC9jb2RlPiB0byBzZWFyY2ggZm9yCi0JICogQHJldHVybiB0aGUgbG93ZXN0IHBvc2l0aW9uIG9mIGEgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGluIFs8Y29kZT5wb3NpdGlvbjwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT5ib3VuZDwvY29kZT4pIHRoYXQgcmVzaWRlcyBpbiBhIEphdmEgcGFydGl0aW9uLCBvcgotCSAqICAgICAgICAgPGNvZGU+Tk9UX0ZPVU5EPC9jb2RlPiBpZiBub25lIGNhbiBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBpbnQgc2NhbkZvcndhcmQoaW50IHBvc2l0aW9uLCBpbnQgYm91bmQsIGNoYXJbXSBjaGFycykgewotCQlyZXR1cm4gc2NhbkZvcndhcmQocG9zaXRpb24sIGJvdW5kLCBuZXcgQ2hhcmFjdGVyTWF0Y2goY2hhcnMpKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgaGlnaGVzdCBwb3NpdGlvbiA8Y29kZT5wPC9jb2RlPiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+Ci0JICogc3VjaCB0aGF0IDxjb2RlPmJvdW5kPC9jb2RlPiAmbHQ7IDxjb2RlPnA8L2NvZGU+ICZsdDs9Ci0JICogPGNvZGU+c3RhcnQ8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmNvbmRpdGlvbi5zdG9wKGZEb2N1bWVudC5nZXRDaGFyKHApLCBwKTwvY29kZT4gZXZhbHVhdGVzIHRvCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIGJlIGNvbnNpZGVyZWQKLQkgKiBAcGFyYW0gYm91bmQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvIG5vdAotCSAqICAgICAgICAgICAgY29uc2lkZXIgYW55IG1vcmUsIHdpdGggPGNvZGU+Ym91bmQ8L2NvZGU+ICZsdDsKLQkgKiAgICAgICAgICAgIDxjb2RlPnN0YXJ0PC9jb2RlPiwgb3IgPGNvZGU+VU5CT1VORDwvY29kZT4KLQkgKiBAcGFyYW0gY29uZGl0aW9uCi0JICogICAgICAgICAgICB0aGUgPGNvZGU+U3RvcENvbmRpdGlvbjwvY29kZT4gdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRoZSBoaWdoZXN0IHBvc2l0aW9uIGluICg8Y29kZT5ib3VuZDwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT5zdGFydDwvY29kZT4gZm9yIHdoaWNoIDxjb2RlPmNvbmRpdGlvbjwvY29kZT4gaG9sZHMsCi0JICogICAgICAgICBvciA8Y29kZT5OT1RfRk9VTkQ8L2NvZGU+IGlmIG5vbmUgY2FuIGJlIGZvdW5kCi0JICovCi0JcHVibGljIGludCBzY2FuQmFja3dhcmQoaW50IHN0YXJ0LCBpbnQgYm91bmQsIFN0b3BDb25kaXRpb24gY29uZGl0aW9uKSB7Ci0JCWlmIChib3VuZCA9PSBVTkJPVU5EKQotCQkJYm91bmQgPSAtMTsKLQotCQlBc3NlcnQuaXNUcnVlKGJvdW5kID49IC0xKTsKLQkJQXNzZXJ0LmlzVHJ1ZShzdGFydCA8IGZEb2N1bWVudC5nZXRMZW5ndGgoKSk7Ci0KLQkJdHJ5IHsKLQkJCWZQb3MgPSBzdGFydDsKLQkJCXdoaWxlIChmUG9zID4gYm91bmQpIHsKLQotCQkJCWZDaGFyID0gZkRvY3VtZW50LmdldENoYXIoZlBvcyk7Ci0JCQkJaWYgKGNvbmRpdGlvbi5zdG9wKGZDaGFyLCBmUG9zLCBmYWxzZSkpCi0JCQkJCXJldHVybiBmUG9zOwotCi0JCQkJZlBvcyA9IGNvbmRpdGlvbi5uZXh0UG9zaXRpb24oZlBvcywgZmFsc2UpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIE5PVF9GT1VORDsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgaGlnaGVzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHN1Y2ggdGhhdCB0aGUKLQkgKiBwb3NpdGlvbiBpcyAmbHQ7PSA8Y29kZT5wb3NpdGlvbjwvY29kZT4gYW5kICZndDsgPGNvZGU+Ym91bmQ8L2NvZGU+Ci0JICogYW5kIDxjb2RlPmZEb2N1bWVudC5nZXRDaGFyKHBvc2l0aW9uKSA9PSBjaDwvY29kZT4gZXZhbHVhdGVzIHRvCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGF0IGxlYXN0IG9uZSBjaCBpbiA8Y29kZT5jaGFyczwvY29kZT4gYW5kIHRoZQotCSAqIHBvc2l0aW9uIGlzIGluIHRoZSBkZWZhdWx0IHBhcnRpdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgYmUgY29uc2lkZXJlZAotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gbm90Ci0JICogICAgICAgICAgICBjb25zaWRlciBhbnkgbW9yZSwgd2l0aCA8Y29kZT5ib3VuZDwvY29kZT4gJmx0OwotCSAqICAgICAgICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+LCBvciA8Y29kZT5VTkJPVU5EPC9jb2RlPgotCSAqIEBwYXJhbSBjaAotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPmNoYXI8L2NvZGU+IHRvIHNlYXJjaCBmb3IKLQkgKiBAcmV0dXJuIHRoZSBoaWdoZXN0IHBvc2l0aW9uIG9mIG9uZSBlbGVtZW50IGluIDxjb2RlPmNoYXJzPC9jb2RlPiBpbiAoPGNvZGU+Ym91bmQ8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+XSB0aGF0IHJlc2lkZXMgaW4gYSBKYXZhIHBhcnRpdGlvbiwgb3IKLQkgKiAgICAgICAgIDxjb2RlPk5PVF9GT1VORDwvY29kZT4gaWYgbm9uZSBjYW4gYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgaW50IHNjYW5CYWNrd2FyZChpbnQgcG9zaXRpb24sIGludCBib3VuZCwgY2hhciBjaCkgewotCQlyZXR1cm4gc2NhbkJhY2t3YXJkKHBvc2l0aW9uLCBib3VuZCwgbmV3IENoYXJhY3Rlck1hdGNoKGNoKSk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIGhpZ2hlc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiBzdWNoIHRoYXQgdGhlCi0JICogcG9zaXRpb24gaXMgJmx0Oz0gPGNvZGU+cG9zaXRpb248L2NvZGU+IGFuZCAmZ3Q7IDxjb2RlPmJvdW5kPC9jb2RlPgotCSAqIGFuZCA8Y29kZT5mRG9jdW1lbnQuZ2V0Q2hhcihwb3NpdGlvbikgPT0gY2g8L2NvZGU+IGV2YWx1YXRlcyB0bwotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGZvciBhdCBsZWFzdCBvbmUgY2ggaW4gPGNvZGU+Y2hhcnM8L2NvZGU+IGFuZCB0aGUKLQkgKiBwb3NpdGlvbiBpcyBpbiB0aGUgZGVmYXVsdCBwYXJ0aXRpb24uCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIGJlIGNvbnNpZGVyZWQKLQkgKiBAcGFyYW0gYm91bmQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvIG5vdAotCSAqICAgICAgICAgICAgY29uc2lkZXIgYW55IG1vcmUsIHdpdGggPGNvZGU+Ym91bmQ8L2NvZGU+ICZsdDsKLQkgKiAgICAgICAgICAgIDxjb2RlPnBvc2l0aW9uPC9jb2RlPiwgb3IgPGNvZGU+VU5CT1VORDwvY29kZT4KLQkgKiBAcGFyYW0gY2hhcnMKLQkgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIDxjb2RlPmNoYXI8L2NvZGU+IHRvIHNlYXJjaCBmb3IKLQkgKiBAcmV0dXJuIHRoZSBoaWdoZXN0IHBvc2l0aW9uIG9mIG9uZSBlbGVtZW50IGluIDxjb2RlPmNoYXJzPC9jb2RlPiBpbiAoPGNvZGU+Ym91bmQ8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+XSB0aGF0IHJlc2lkZXMgaW4gYSBKYXZhIHBhcnRpdGlvbiwgb3IKLQkgKiAgICAgICAgIDxjb2RlPk5PVF9GT1VORDwvY29kZT4gaWYgbm9uZSBjYW4gYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgaW50IHNjYW5CYWNrd2FyZChpbnQgcG9zaXRpb24sIGludCBib3VuZCwgY2hhcltdIGNoYXJzKSB7Ci0JCXJldHVybiBzY2FuQmFja3dhcmQocG9zaXRpb24sIGJvdW5kLCBuZXcgQ2hhcmFjdGVyTWF0Y2goY2hhcnMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciA8Y29kZT5wb3NpdGlvbjwvY29kZT4gcmVzaWRlcyBpbiBhIGRlZmF1bHQgKEphdmEpCi0JICogcGFydGl0aW9uIG9mIDxjb2RlPmZEb2N1bWVudDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgcG9zaXRpb24gdG8gYmUgY2hlY2tlZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+cG9zaXRpb248L2NvZGU+IGlzIGluIHRoZQotCSAqICAgICAgICAgZGVmYXVsdCBwYXJ0aXRpb24gb2YgPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiwKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRQYXJ0aXRpb24oaW50IHBvc2l0aW9uKSB7Ci0JCUFzc2VydC5pc1RydWUocG9zaXRpb24gPj0gMCk7Ci0JCUFzc2VydC5pc1RydWUocG9zaXRpb24gPD0gZkRvY3VtZW50LmdldExlbmd0aCgpKTsKLQotCQl0cnkgewotCQkJcmV0dXJuIGZQYXJ0aXRpb24uZXF1YWxzKFRleHRVdGlsaXRpZXMuZ2V0Q29udGVudFR5cGUoZkRvY3VtZW50LCBmUGFydGl0aW9uaW5nLCBwb3NpdGlvbiwgZmFsc2UpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFydGl0aW9uIGF0IDxjb2RlPnBvc2l0aW9uPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiB0byBnZXQgdGhlIHBhcnRpdGlvbiBmb3IKLQkgKiBAcmV0dXJuIHRoZSBwYXJ0aXRpb24gYXQgPGNvZGU+cG9zaXRpb248L2NvZGU+IG9yIGEgZHVtbXkgemVyby1sZW5ndGgKLQkgKiAgICAgICAgIHBhcnRpdGlvbiBpZiBhY2Nlc3NpbmcgdGhlIGRvY3VtZW50IGZhaWxzCi0JICovCi0JcHJpdmF0ZSBJVHlwZWRSZWdpb24gZ2V0UGFydGl0aW9uKGludCBwb3NpdGlvbikgewotCQlBc3NlcnQuaXNUcnVlKHBvc2l0aW9uID49IDApOwotCQlBc3NlcnQuaXNUcnVlKHBvc2l0aW9uIDw9IGZEb2N1bWVudC5nZXRMZW5ndGgoKSk7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBUZXh0VXRpbGl0aWVzLmdldFBhcnRpdGlvbihmRG9jdW1lbnQsIGZQYXJ0aXRpb25pbmcsIHBvc2l0aW9uLCBmYWxzZSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBuZXcgVHlwZWRSZWdpb24ocG9zaXRpb24sIDAsICJfX25vX3BhcnRpdGlvbl9hdF9hbGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGxpbmUgc2VlbXMgdG8gYmUgYW4gb3BlbiBjb25kaXRpb24gbm90IGZvbGxvd2VkIGJ5IGEKLQkgKiBibG9jayAoaS5lLiBhbiBpZiwgd2hpbGUsIG9yIGZvciBzdGF0ZW1lbnQgd2l0aCBqdXN0IG9uZSBmb2xsb3dpbmcKLQkgKiBzdGF0ZW1lbnQsIHNlZSBleGFtcGxlIGJlbG93KS4KLQkgKiAKLQkgKiA8cHJlPgotCSAqIGlmIChjb25kaXRpb24pCi0JICogCWRvU3R1ZmYoKTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiA8cD4KLQkgKiBBbGdvcml0aG06IGlmIHRoZSBsYXN0IG5vbi1XUywgbm9uLUNvbW1lbnQgY29kZSBvbiB0aGUgbGluZSBpcyBhbiBpZgotCSAqIChjb25kaXRpb24pLCB3aGlsZSAoY29uZGl0aW9uKSwgZm9yKCBleHByZXNzaW9uKSwgZG8sIGVsc2UsIGFuZCB0aGVyZQotCSAqIGlzIG5vIHN0YXRlbWVudCBhZnRlciB0aGF0Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIGluc2VydCBwb3NpdGlvbiBvZiB0aGUgbmV3IGNoYXJhY3RlcgotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGxvd2VzdCBwb3NpdGlvbiB0byBjb25zaWRlcgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvZGUgaXMgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgb3IKLQkgKiAgICAgICAgIGxvb3Agd2l0aG91dCBhIGJsb2NrLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCcmFjZWxlc3NCbG9ja1N0YXJ0KGludCBwb3NpdGlvbiwgaW50IGJvdW5kKSB7Ci0JCWlmIChwb3NpdGlvbiA8IDEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJc3dpdGNoIChwcmV2aW91c1Rva2VuKHBvc2l0aW9uLCBib3VuZCkpIHsKLQkJCWNhc2UgVG9rZW5ETyA6Ci0JCQljYXNlIFRva2VuRUxTRSA6Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQljYXNlIFRva2VuUlBBUkVOIDoKLQkJCQlwb3NpdGlvbiA9IGZpbmRPcGVuaW5nUGVlcihmUG9zLCBMUEFSRU4sIFJQQVJFTik7Ci0JCQkJaWYgKHBvc2l0aW9uID4gMCkgewotCQkJCQlzd2l0Y2ggKHByZXZpb3VzVG9rZW4ocG9zaXRpb24gLSAxLCBib3VuZCkpIHsKLQkJCQkJCWNhc2UgVG9rZW5JRiA6Ci0JCQkJCQljYXNlIFRva2VuRk9SIDoKLQkJCQkJCWNhc2UgVG9rZW5XSElMRSA6Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9KYXZhUGFpck1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvSmF2YVBhaXJNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMDc2OWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9KYXZhUGFpck1hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRleHQ7Ci0KLS8vIHRha2VuIGZyb20gcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQudWkudGV4dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXI7Ci0KLWNsYXNzIEphdmFQYWlyTWF0Y2hlciBpbXBsZW1lbnRzIElDaGFyYWN0ZXJQYWlyTWF0Y2hlciB7Ci0KLQlwcm90ZWN0ZWQgY2hhcltdIGZQYWlyczsKLQlwcm90ZWN0ZWQgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcm90ZWN0ZWQgaW50IGZPZmZzZXQ7Ci0KLQlwcm90ZWN0ZWQgaW50IGZTdGFydFBvczsKLQlwcm90ZWN0ZWQgaW50IGZFbmRQb3M7Ci0JcHJvdGVjdGVkIGludCBmQW5jaG9yOwotCi0JcHJvdGVjdGVkIEphdmFDb2RlUmVhZGVyIGZSZWFkZXIgPSBuZXcgSmF2YUNvZGVSZWFkZXIoKTsKLQkvKioKLQkgKiBTdG9yZXMgdGhlIHNvdXJjZSB2ZXJzaW9uIHN0YXRlLgotCSAqIAotCSAqIEBzZWUgRWNsaXBzZSAgMy4xCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZIaWdobGlnaHRBbmd1bGFyQnJhY2tldHMgPSBmYWxzZTsKLQotCi0JcHVibGljIEphdmFQYWlyTWF0Y2hlcihjaGFyW10gcGFpcnMpIHsKLQkJZlBhaXJzID0gcGFpcnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjbWF0Y2gob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gbWF0Y2goSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCWZPZmZzZXQgPSBvZmZzZXQ7Ci0KLQkJaWYob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwgJiYgbWF0Y2hQYWlyc0F0KCkgJiYgZlN0YXJ0UG9zICE9IGZFbmRQb3MpCi0JCQlyZXR1cm4gbmV3IFJlZ2lvbihmU3RhcnRQb3MsIGZFbmRQb3MgLSBmU3RhcnRQb3MgKyAxKTsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNnZXRBbmNob3IoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QW5jaG9yKCkgewotCQlyZXR1cm4gZkFuY2hvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQljbGVhcigpOwotCQlmRG9jdW1lbnQgPSBudWxsOwotCQlmUmVhZGVyID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2NsZWFyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKGZSZWFkZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlmUmVhZGVyLmNsb3NlKCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hQYWlyc0F0KCkgewotCi0JCWludCBpOwotCQlpbnQgcGFpckluZGV4MSA9IGZQYWlycy5sZW5ndGg7Ci0JCWludCBwYWlySW5kZXgyID0gZlBhaXJzLmxlbmd0aDsKLQotCQlmU3RhcnRQb3MgPSAtMTsKLQkJZkVuZFBvcyA9IC0xOwotCi0JCS8vIGdldCB0aGUgY2hhcnMgcHJlY2VkaW5nIGFuZCBmb2xsb3dpbmcgdGhlIHN0YXJ0IHBvc2l0aW9uCi0JCXRyeSB7Ci0KLQkJCWNoYXIgcHJldkNoYXIgPSBmRG9jdW1lbnQuZ2V0Q2hhcihNYXRoLm1heChmT2Zmc2V0IC0gMSwgMCkpOwotCQkJLy8gbW9kaWZpZWQgYmVoYXZpb3IgZm9yCi0JCQkvLyBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2ODc5Ci0JCQkvLyBjaGFyIG5leHRDaGFyPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KTsKLQotCQkJLy8gc2VhcmNoIGZvciBvcGVuaW5nIHBlZXIgY2hhcmFjdGVyIG5leHQgdG8gdGhlIGFjdGl2YXRpb24gcG9pbnQKLQkJCWZvciAoaSA9IDA7IGkgPCBmUGFpcnMubGVuZ3RoOyBpID0gaSArIDIpIHsKLQkJCQkvLyBpZiAobmV4dENoYXIgPT0gZlBhaXJzW2ldKSB7Ci0JCQkJLy8gZlN0YXJ0UG9zPSBmT2Zmc2V0OwotCQkJCS8vIHBhaXJJbmRleDE9IGk7Ci0JCQkJLy8gfSBlbHNlCi0JCQkJaWYgKHByZXZDaGFyID09IGZQYWlyc1tpXSkgewotCQkJCQlmU3RhcnRQb3MgPSBmT2Zmc2V0IC0gMTsKLQkJCQkJcGFpckluZGV4MSA9IGk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBzZWFyY2ggZm9yIGNsb3NpbmcgcGVlciBjaGFyYWN0ZXIgbmV4dCB0byB0aGUgYWN0aXZhdGlvbiBwb2ludAotCQkJZm9yIChpID0gMTsgaSA8IGZQYWlycy5sZW5ndGg7IGkgPSBpICsgMikgewotCQkJCWlmIChwcmV2Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkJZkVuZFBvcyA9IGZPZmZzZXQgLSAxOwotCQkJCQlwYWlySW5kZXgyID0gaTsKLQkJCQl9Ci0JCQkJLy8gZWxzZSBpZiAobmV4dENoYXIgPT0gZlBhaXJzW2ldKSB7Ci0JCQkJLy8gZkVuZFBvcz0gZk9mZnNldDsKLQkJCQkvLyBwYWlySW5kZXgyPSBpOwotCQkJCS8vIH0KLQkJCX0KLQotCQkJaWYgKGZFbmRQb3MgPiAtMSkgewotCQkJCWZBbmNob3IgPSBSSUdIVDsKLQkJCQlmU3RhcnRQb3MgPSBzZWFyY2hGb3JPcGVuaW5nUGVlcihmRW5kUG9zLCBmUGFpcnNbcGFpckluZGV4MiAtIDFdLCBmUGFpcnNbcGFpckluZGV4Ml0sIGZEb2N1bWVudCk7Ci0JCQkJaWYgKGZTdGFydFBvcyA+IC0xKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlCi0JCQkJCWZFbmRQb3MgPSAtMTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZTdGFydFBvcyA+IC0xKSB7Ci0JCQkJZkFuY2hvciA9IExFRlQ7Ci0JCQkJZkVuZFBvcyA9IHNlYXJjaEZvckNsb3NpbmdQZWVyKGZTdGFydFBvcywgZlBhaXJzW3BhaXJJbmRleDFdLCBmUGFpcnNbcGFpckluZGV4MSArIDFdLCBmRG9jdW1lbnQpOwotCQkJCWlmIChmRW5kUG9zID4gLTEpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UKLQkJCQkJZlN0YXJ0UG9zID0gLTE7Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBzZWFyY2hGb3JDbG9zaW5nUGVlcihpbnQgb2Zmc2V0LCBpbnQgb3BlbmluZ1BlZXIsIGludCBjbG9zaW5nUGVlciwgSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAob3BlbmluZ1BlZXIgPT0gJzwnICYmICEoZkhpZ2hsaWdodEFuZ3VsYXJCcmFja2V0cyAmJiBpc1R5cGVQYXJhbWV0ZXJCcmFja2V0KG9mZnNldCwgZG9jdW1lbnQpKSkKLQkJCXJldHVybiAtMTsKLQotCQlmUmVhZGVyLmNvbmZpZ3VyZUZvcndhcmRSZWFkZXIoZG9jdW1lbnQsIG9mZnNldCArIDEsIGRvY3VtZW50LmdldExlbmd0aCgpLCB0cnVlLCB0cnVlKTsKLQotCQlpbnQgc3RhY2sgPSAxOwotCQlpbnQgYyA9IGZSZWFkZXIucmVhZCgpOwotCQl3aGlsZSAoYyAhPSBKYXZhQ29kZVJlYWRlci5FT0YpIHsKLQkJCWlmIChjID09IG9wZW5pbmdQZWVyICYmIGMgIT0gY2xvc2luZ1BlZXIpCi0JCQkJc3RhY2srKzsKLQkJCWVsc2UgaWYgKGMgPT0gY2xvc2luZ1BlZXIpCi0JCQkJc3RhY2stLTsKLQotCQkJaWYgKHN0YWNrID09IDApCi0JCQkJcmV0dXJuIGZSZWFkZXIuZ2V0T2Zmc2V0KCk7Ci0KLQkJCWMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQotCXByb3RlY3RlZCBpbnQgc2VhcmNoRm9yT3BlbmluZ1BlZXIoaW50IG9mZnNldCwgaW50IG9wZW5pbmdQZWVyLCBpbnQgY2xvc2luZ1BlZXIsIElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKG9wZW5pbmdQZWVyID09ICc8JyAmJiAhZkhpZ2hsaWdodEFuZ3VsYXJCcmFja2V0cykKLQkJCXJldHVybiAtMTsKLQotCQlmUmVhZGVyLmNvbmZpZ3VyZUJhY2t3YXJkUmVhZGVyKGRvY3VtZW50LCBvZmZzZXQsIHRydWUsIHRydWUpOwotCi0JCWludCBzdGFjayA9IDE7Ci0JCWludCBjID0gZlJlYWRlci5yZWFkKCk7Ci0JCXdoaWxlIChjICE9IEphdmFDb2RlUmVhZGVyLkVPRikgewotCQkJaWYgKGMgPT0gY2xvc2luZ1BlZXIgJiYgYyAhPSBvcGVuaW5nUGVlcikKLQkJCQlzdGFjaysrOwotCQkJZWxzZSBpZiAoYyA9PSBvcGVuaW5nUGVlcikKLQkJCQlzdGFjay0tOwotCi0JCQlpZiAoc3RhY2sgPT0gMCkgewotCQkJCWlmIChjbG9zaW5nUGVlciA9PSAnPicgJiYgIWlzVHlwZVBhcmFtZXRlckJyYWNrZXQoZlJlYWRlci5nZXRPZmZzZXQoKSwgZG9jdW1lbnQpKQotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJcmV0dXJuIGZSZWFkZXIuZ2V0T2Zmc2V0KCk7Ci0JCQl9Ci0KLQkJCWMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGFuZ3VsYXIgYnJhY2tldCBhdCA8Y29kZT5vZmZzZXQ8L2NvZGU+IGlzIGEgdHlwZQotCSAqIHBhcmFtZXRlciBicmFja2V0LgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIG9wZW5pbmcgYnJhY2tldAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYnJhY2tldCBpcyBwYXJ0IG9mIGEgdHlwZSBwYXJhbWV0ZXIsCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHNlZSBFY2xpcHNlICAzLjEKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNUeXBlUGFyYW1ldGVyQnJhY2tldChpbnQgb2Zmc2V0LCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLyoKLQkJICogdHlwZSBwYXJhbWV0ZXIgY29tZSBhZnRlciBicmFjZXMgKGNsb3Npbmcgb3Igb3BlbmluZyksIHNlbWljb2xvbnMsCi0JCSAqIG9yIGFmdGVyIGEgVHlwZSBuYW1lIChoZXVyaXN0aWM6IHN0YXJ0cyB3aXRoIGNhcGl0YWwgY2hhcmFjdGVyLCBvcgotCQkgKiBhZnRlciBhIG1vZGlmaWVyIGtleXdvcmQgaW4gYSBtZXRob2QgZGVjbGFyYXRpb24gKHZpc2liaWxpdHksCi0JCSAqIHN0YXRpYywgc3luY2hyb25pemVkLCBmaW5hbCkKLQkJICovCi0KLQkJdHJ5IHsKLQkJCUlSZWdpb24gbGluZSA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KG9mZnNldCk7Ci0KLQkJCUphdmFIZXVyaXN0aWNTY2FubmVyIHNjYW5uZXIgPSBuZXcgSmF2YUhldXJpc3RpY1NjYW5uZXIoZG9jdW1lbnQpOwotCQkJaW50IHByZXZUb2tlbiA9IHNjYW5uZXIucHJldmlvdXNUb2tlbihvZmZzZXQgLSAxLCBsaW5lLmdldE9mZnNldCgpKTsKLQkJCWludCBwcmV2VG9rZW5PZmZzZXQgPSBzY2FubmVyLmdldFBvc2l0aW9uKCkgKyAxOwotCQkJU3RyaW5nIHByZXZpb3VzID0gcHJldlRva2VuID09IFN5bWJvbHMuVG9rZW5FT0YgPyBudWxsIDogZG9jdW1lbnQuZ2V0KHByZXZUb2tlbk9mZnNldCwgb2Zmc2V0IC0gcHJldlRva2VuT2Zmc2V0KS50cmltKCk7Ci0KLQkJCWlmIChwcmV2VG9rZW4gPT0gU3ltYm9scy5Ub2tlbkxCUkFDRSB8fCBwcmV2VG9rZW4gPT0gU3ltYm9scy5Ub2tlblJCUkFDRSB8fCBwcmV2VG9rZW4gPT0gU3ltYm9scy5Ub2tlblNFTUlDT0xPTiB8fCBwcmV2VG9rZW4gPT0gU3ltYm9scy5Ub2tlblNZTkNIUk9OSVpFRCB8fCBwcmV2VG9rZW4gPT0gU3ltYm9scy5Ub2tlblNUQVRJQyB8fCAocHJldlRva2VuID09IFN5bWJvbHMuVG9rZW5JREVOVCAmJiBpc1R5cGVQYXJhbWV0ZXJJbnRyb2R1Y2VyKHByZXZpb3VzKSkgfHwgcHJldlRva2VuID09IFN5bWJvbHMuVG9rZW5FT0YpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPmlkZW50aWZpZXI8L2NvZGU+IGlzIGFuCi0JICogaWRlbnRpZmllciB0aGF0IGNvdWxkIGNvbWUgcmlnaHQgYmVmb3JlIGEgdHlwZSBwYXJhbWV0ZXIgbGlzdC4gSXQgdXNlcwotCSAqIGEgaGV1cmlzdGljOiBpZiB0aGUgaWRlbnRpZmllciBzdGFydHMgd2l0aCBhbiB1cHBlciBjYXNlLCBpdCBpcyBhc3N1bWVkCi0JICogYSB0eXBlIG5hbWUuIEFsc28sIGlmIDxjb2RlPmlkZW50aWZpZXI8L2NvZGU+IGlzIGEgbWV0aG9kIG1vZGlmaWVyLAotCSAqIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgYW5ndWxhciBicmFja2V0IGlzIHBhcnQgb2YgdGhlIGdlbmVyaWMgdHlwZQotCSAqIHBhcmFtZXRlciBvZiBhIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWRlbnRpZmllcgotCSAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBpZGVudGlmaWVyIGNvdWxkIGludHJvZHVjZSBhIHR5cGUKLQkgKiAgICAgICAgIHBhcmFtZXRlciBsaXN0Ci0JICogQHNlZSBFY2xpcHNlICAzLjEKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNUeXBlUGFyYW1ldGVySW50cm9kdWNlcihTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gaWRlbnRpZmllci5sZW5ndGgoKSA+IDAgJiYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShpZGVudGlmaWVyLmNoYXJBdCgwKSkgfHwgaWRlbnRpZmllci5zdGFydHNXaXRoKCJmaW5hbCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgaWRlbnRpZmllci5zdGFydHNXaXRoKCJwdWJsaWMiKSAvLyROT04tTkxTLTEkCi0JCQkJCXx8IGlkZW50aWZpZXIuc3RhcnRzV2l0aCgicHVibGljIikgLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBpZGVudGlmaWVyLnN0YXJ0c1dpdGgoInByb3RlY3RlZCIpIC8vJE5PTi1OTFMtMSQKLQkJfHwgaWRlbnRpZmllci5zdGFydHNXaXRoKCJwcml2YXRlIikpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9TeW1ib2xzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L1N5bWJvbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIyMDNlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L1N5bWJvbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZXh0OwotCi0vLyB0YWtlbiBmcm9tIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LnVpLnRleHQ7Ci0KLS8qKgotICogU3ltYm9scyBmb3IgdGhlIGhldXJpc3RpYyBqYXZhIHNjYW5uZXIuCi0gKiAKLSAqIEBzZWUgRWNsaXBzZSAzLjAKLSAqLwotaW50ZXJmYWNlIFN5bWJvbHMgewotCWludCBUb2tlbkVPRiA9IC0xOwotCWludCBUb2tlbkxCUkFDRSA9IDE7Ci0JaW50IFRva2VuUkJSQUNFID0gMjsKLQlpbnQgVG9rZW5MQlJBQ0tFVCA9IDM7Ci0JaW50IFRva2VuUkJSQUNLRVQgPSA0OwotCWludCBUb2tlbkxQQVJFTiA9IDU7Ci0JaW50IFRva2VuUlBBUkVOID0gNjsKLQlpbnQgVG9rZW5TRU1JQ09MT04gPSA3OwotCWludCBUb2tlbk9USEVSID0gODsKLQlpbnQgVG9rZW5DT0xPTiA9IDk7Ci0JaW50IFRva2VuUVVFU1RJT05NQVJLID0gMTA7Ci0JaW50IFRva2VuQ09NTUEgPSAxMTsKLQlpbnQgVG9rZW5FUVVBTCA9IDEyOwotCWludCBUb2tlbkxFU1NUSEFOID0gMTM7Ci0JaW50IFRva2VuR1JFQVRFUlRIQU4gPSAxNDsKLQlpbnQgVG9rZW5JRiA9IDEwOTsKLQlpbnQgVG9rZW5ETyA9IDEwMTA7Ci0JaW50IFRva2VuRk9SID0gMTAxMTsKLQlpbnQgVG9rZW5UUlkgPSAxMDEyOwotCWludCBUb2tlbkNBU0UgPSAxMDEzOwotCWludCBUb2tlbkVMU0UgPSAxMDE0OwotCWludCBUb2tlbkJSRUFLID0gMTAxNTsKLQlpbnQgVG9rZW5DQVRDSCA9IDEwMTY7Ci0JaW50IFRva2VuV0hJTEUgPSAxMDE3OwotCWludCBUb2tlblJFVFVSTiA9IDEwMTg7Ci0JaW50IFRva2VuU1RBVElDID0gMTAxOTsKLQlpbnQgVG9rZW5TV0lUQ0ggPSAxMDIwOwotCWludCBUb2tlbkZJTkFMTFkgPSAxMDIxOwotCWludCBUb2tlblNZTkNIUk9OSVpFRCA9IDEwMjI7Ci0JaW50IFRva2VuR09UTyA9IDEwMjM7Ci0JaW50IFRva2VuREVGQVVMVCA9IDEwMjQ7Ci0JaW50IFRva2VuTkVXID0gMTAyNTsKLQlpbnQgVG9rZW5DTEFTUyA9IDEwMjY7Ci0JaW50IFRva2VuSU5URVJGQUNFID0gMTAyNzsKLQlpbnQgVG9rZW5FTlVNID0gMTAyODsKLQlpbnQgVG9rZW5JREVOVCA9IDIwMDA7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvd2l6YXJkL0ZhY2V0TW9kdWxlQ29yZVN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmExYWI5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgYW55IHVzZWQgTW9kdWxlIENvcmUgYW5kIEZhY2V0cyBBUElzIGFsb25nIHdpdGgKLSAqIGZhbGxiYWNrcyBmb3IgdXNlIG9uIG5vbi1jb21wbGlhbnQgcHJvamVjdHMgYW5kIHdoZW4gdGhvc2Ugc2VydmljZXMgYXJlIG5vdAotICogYXZhaWxhYmxlIGF0IHJ1bnRpbWUuCi0gKiAKLSAqIEJlY2F1c2UgTW9kdWxlQ29yZSBBUEkgY2FsbHMgY2FuIHJlc3VsdCBpbiBsb2NrcyBuZWVkaW5nIHRvIGJlIGFjcXVpcmVkLAotICogbm9uZSBvZiB0aGVzZSBtZXRob2RzIHNob3VsZCBiZSBjYWxsZWQgd2hpbGUgb3RoZXIgdGhyZWFkIGxvY2tzIGhhdmUKLSAqIGFscmVhZHkgYmVlbiBhY3F1aXJlZC4KLSAqLwotZmluYWwgY2xhc3MgRmFjZXRNb2R1bGVDb3JlU3VwcG9ydCB7Ci0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gX2R1bXBfTkNERkUgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybiB0aGUgSVBhdGggdG8gdGhlICJyb290IiBvZiB0aGUgd2ViIGNvbnRlbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRXZWJDb250ZW50Um9vdFBhdGgoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlQYXRoIHBhdGggPSBudWxsOwotCQl0cnkgewotCQkJcGF0aCA9IEZhY2V0TW9kdWxlQ29yZVN1cHBvcnREZWxlZ2F0ZS5nZXRXZWJDb250ZW50Um9vdFBhdGgocHJvamVjdCk7Ci0JCX0KLQkJY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLQkJCWlmIChfZHVtcF9OQ0RGRSkKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXZWJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJdHJ5IHsKLQkJCXJldHVybiBGYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuaXNXZWJQcm9qZWN0KHByb2plY3QpOwotCQl9Ci0JCWNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0JCQlpZiAoX2R1bXBfTkNERkUpCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvd2l6YXJkL0ZhY2V0TW9kdWxlQ29yZVN1cHBvcnREZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvd2l6YXJkL0ZhY2V0TW9kdWxlQ29yZVN1cHBvcnREZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjU0ODRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3dpemFyZC9GYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotICogV3JhcHBlciBjbGFzcyBmb3IgYWxsIEZhY2V0LXJlbGF0ZWQgY2FsbHMuIElmIHRoZSBGYWNldCBvciBNb2R1bGVDb3JlCi0gKiBidW5kbGVzIGFyZSBub3QgYXZhaWxhYmxlLCB0aGlzIGNsYXNzIHdpbGwgbm90IGxvYWQsIG9yIGlmIGl0IGRvZXMsIGl0cwotICogbWV0aG9kcyB3aWxsIGNhdXNlIE5vQ2xhc3NEZWZGb3VuZEVycm9ycy4gVGhpcyBhbGxvd3MgdXMgdG8KLSAqIGNvbXBhcnRtZW50YWxpemUgdGhlIGRlcGVuZGVuY2llcy4KLSAqIAotICovCi1maW5hbCBjbGFzcyBGYWNldE1vZHVsZUNvcmVTdXBwb3J0RGVsZWdhdGUgewotCS8qKgotCSAqIENvcGllZCB0byBhdm9pZCB1bm5lZWRlZCBleHRyYSBkZXBlbmRlbmN5IChwbHVzIGl0J3MgdW5jbGVhciB3aHkgdGhlCi0JICogdmFsdWUgaXMgaW4gdGhhdCBwbHVnLWluKS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHMuSlNUX1dFQl9NT0RVTEUKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSlNUX1dFQl9NT0RVTEUgPSAianN0LndlYiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBXU1RfV0VCX01PRFVMRSA9ICJ3c3Qud2ViIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIHRoZSBJUGF0aCB0byB0aGUgInJvb3QiIG9mIHRoZSB3ZWIgY29udGVudHMKLQkgKi8KLQlzdGF0aWMgSVBhdGggZ2V0V2ViQ29udGVudFJvb3RQYXRoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKCFNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KHByb2plY3QpKQotCQkJcmV0dXJuIHByb2plY3QuZ2V0RnVsbFBhdGgoKTsKLQotCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCWlmIChjb21wb25lbnQgIT0gbnVsbCAmJiBjb21wb25lbnQuZXhpc3RzKCkpIHsKLQkJCXBhdGggPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKTsKLQkJfQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBpc1dlYlByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlib29sZWFuIGlzID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWlmIChQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQoSlNUX1dFQl9NT0RVTEUpKSB7Ci0JCQkJSVByb2plY3RGYWNldCBmYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChKU1RfV0VCX01PRFVMRSk7Ci0JCQkJaXMgPSBpcyB8fCAoZmFjZXRlZCAhPSBudWxsICYmIGZhY2V0ZWQuaGFzUHJvamVjdEZhY2V0KGZhY2V0KSk7Ci0JCQl9Ci0JCQlpZiAoUHJvamVjdEZhY2V0c01hbmFnZXIuaXNQcm9qZWN0RmFjZXREZWZpbmVkKFdTVF9XRUJfTU9EVUxFKSkgewotCQkJCUlQcm9qZWN0RmFjZXQgZmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoV1NUX1dFQl9NT0RVTEUpOwotCQkJCWlzID0gaXMgfHwgKGZhY2V0ZWQgIT0gbnVsbCAmJiBmYWNldGVkLmhhc1Byb2plY3RGYWNldChmYWNldCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIGlzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3dpemFyZC9OZXdIVE1MRmlsZVdpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3dpemFyZC9OZXdIVE1MRmlsZVdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEwZDgwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvTmV3SFRNTEZpbGVXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci0KLWNsYXNzIE5ld0hUTUxGaWxlV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UgewotCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkNvbnRlbnRUeXBlOwotCXByaXZhdGUgTGlzdCBmVmFsaWRFeHRlbnNpb25zID0gbnVsbDsKLQkKLQlwdWJsaWMgTmV3SFRNTEZpbGVXaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIHN1cGVyKHBhZ2VOYW1lLCBzZWxlY3Rpb24pOwotICAgIH0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZW4gdG8gc2V0IHRoZSBzZWxlY3RlZCBmb2xkZXIgdG8gd2ViIGNvbnRlbnRzIAotCSAqIGZvbGRlciBpZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gaXMgb3V0c2lkZSB0aGUgd2ViIGNvbnRlbnRzIGZvbGRlci4gCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbFBvcHVsYXRlQ29udGFpbmVyTmFtZUZpZWxkKCkgewotCQlzdXBlci5pbml0aWFsUG9wdWxhdGVDb250YWluZXJOYW1lRmllbGQoKTsKLQkJCi0JCUlQYXRoIGZ1bGxQYXRoID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3RGcm9tUGF0aChmdWxsUGF0aCk7Ci0JCUlQYXRoIHdlYkNvbnRlbnRQYXRoID0gZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCk7Ci0JCQotCQlpZiAod2ViQ29udGVudFBhdGggIT0gbnVsbCAmJiAhd2ViQ29udGVudFBhdGguaXNQcmVmaXhPZihmdWxsUGF0aCkpIHsKLQkJCXNldENvbnRhaW5lckZ1bGxQYXRoKHdlYkNvbnRlbnRQYXRoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZW4gdG8gc2V0IGFkZGl0aW9uYWwgdmFsaWRhdGlvbiBzcGVjaWZpYyB0byAKLQkgKiBodG1sIGZpbGVzLiAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCXNldE1lc3NhZ2UobnVsbCk7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCi0JCWlmICghc3VwZXIudmFsaWRhdGVQYWdlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJU3RyaW5nIGZpbGVOYW1lID0gZ2V0RmlsZU5hbWUoKTsKLQkJSVBhdGggZnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQlpZiAoKGZ1bGxQYXRoICE9IG51bGwpICYmIChmdWxsUGF0aC5pc0VtcHR5KCkgPT0gZmFsc2UpICYmIChmaWxlTmFtZSAhPSBudWxsKSkgewotCQkJLy8gY2hlY2sgdGhhdCBmaWxlbmFtZSBkb2VzIG5vdCBjb250YWluIGludmFsaWQgZXh0ZW5zaW9uCi0JCQlpZiAoIWV4dGVuc2lvblZhbGlkRm9yQ29udGVudFR5cGUoZmlsZU5hbWUpKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKEhUTUxVSU1lc3NhZ2VzLl9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9IVE1MLCBnZXRWYWxpZEV4dGVuc2lvbnMoKS50b1N0cmluZygpKSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGNoZWNrIGFkZGluZyBkZWZhdWx0Ci0JCQkvLyBleHRlbnNpb24gZG9lc24ndCBlcXVhbCBhIGZpbGUgdGhhdCBhbHJlYWR5IGV4aXN0cwotCQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCQlTdHJpbmcgbmV3RmlsZU5hbWUgPSBhZGREZWZhdWx0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkJCQlJUGF0aCByZXNvdXJjZVBhdGggPSBmdWxsUGF0aC5hcHBlbmQobmV3RmlsZU5hbWUpOwotCi0JCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQkJSVN0YXR1cyByZXN1bHQgPSB3b3Jrc3BhY2UudmFsaWRhdGVQYXRoKHJlc291cmNlUGF0aC50b1N0cmluZygpLCBJUmVzb3VyY2UuRk9MREVSKTsKLQkJCQlpZiAoIXJlc3VsdC5pc09LKCkpIHsKLQkJCQkJLy8gcGF0aCBpbnZhbGlkCi0JCQkJCXNldEVycm9yTWVzc2FnZShyZXN1bHQuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCWlmICgod29ya3NwYWNlLmdldFJvb3QoKS5nZXRGb2xkZXIocmVzb3VyY2VQYXRoKS5leGlzdHMoKSB8fCB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGUocmVzb3VyY2VQYXRoKS5leGlzdHMoKSkpIHsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKEhUTUxVSU1lc3NhZ2VzLlJlc291cmNlR3JvdXBfbmFtZUV4aXN0cyk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGdldCB0aGUgSVByb2plY3QgZm9yIHRoZSBzZWxlY3Rpb24gcGF0aAotCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3RGcm9tUGF0aChmdWxsUGF0aCk7Ci0JCQkvLyBpZiBpbnNpZGUgd2ViIHByb2plY3QsIGNoZWNrIGlmIGluc2lkZSB3ZWJDb250ZW50IGZvbGRlcgotCQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBpc1dlYlByb2plY3QocHJvamVjdCkpIHsKLQkJCQkvLyBjaGVjayB0aGF0IHRoZSBwYXRoIGlzIGluc2lkZSB0aGUgd2ViQ29udGVudCBmb2xkZXIKLQkJCQlJUGF0aCB3ZWJDb250ZW50UGF0aCA9IGdldFdlYkNvbnRlbnRQYXRoKHByb2plY3QpOwotCQkJCWlmICghd2ViQ29udGVudFBhdGguaXNQcmVmaXhPZihmdWxsUGF0aCkpIHsKLQkJCQkJc2V0TWVzc2FnZShIVE1MVUlNZXNzYWdlcy5fV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQsIFdBUk5JTkcpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgY29udGVudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5ldyBmaWxlIHdpemFyZAotCSAqIAotCSAqIEByZXR1cm4gSUNvbnRlbnRUeXBlCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCWlmIChmQ29udGVudFR5cGUgPT0gbnVsbCkKLQkJCWZDb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTCk7Ci0JCXJldHVybiBmQ29udGVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogR2V0IGxpc3Qgb2YgdmFsaWQgZXh0ZW5zaW9ucyBmb3IgSFRNTCBDb250ZW50IHR5cGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFZhbGlkRXh0ZW5zaW9ucygpIHsKLQkJaWYgKGZWYWxpZEV4dGVuc2lvbnMgPT0gbnVsbCkgewotCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkJZlZhbGlkRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdCh0eXBlLmdldEZpbGVTcGVjcyhJQ29udGVudFR5cGUuRklMRV9FWFRFTlNJT05fU1BFQykpKTsKLQkJfQotCQlyZXR1cm4gZlZhbGlkRXh0ZW5zaW9uczsKLQl9Ci0JCi0JLyoqCi0JICogVmVyaWZpZXMgaWYgZmlsZU5hbWUgaXMgdmFsaWQgbmFtZSBmb3IgY29udGVudCB0eXBlLiBUYWtlcyBiYXNlIGNvbnRlbnQKLQkgKiB0eXBlIGludG8gY29uc2lkZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcmV0dXJuIHRydWUgaWYgZXh0ZW5zaW9uIGlzIHZhbGlkIGZvciB0aGlzIGNvbnRlbnQgdHlwZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKFN0cmluZyBmaWxlTmFtZSkgewotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0KLQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkvLyB0aGVyZSBpcyBjdXJyZW50bHkgYW4gZXh0ZW5zaW9uCi0JCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICE9IC0xKSB7Ci0JCQkvLyBjaGVjayB3aGF0IGNvbnRlbnQgdHlwZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBjdXJyZW50IGV4dGVuc2lvbgotCQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVzRm9yKGZpbGVOYW1lKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdHlwZXMubGVuZ3RoICYmICF2YWxpZCkgewotCQkJCXZhbGlkID0gdHlwZXNbaV0uaXNLaW5kT2YodHlwZSk7Ci0JCQkJKytpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXZhbGlkID0gdHJ1ZTsgLy8gbm8gZXh0ZW5zaW9uIHNvIHZhbGlkCi0JCXJldHVybiB2YWxpZDsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGRlZmF1bHQgZXh0ZW5zaW9uIHRvIHRoZSBmaWxlbmFtZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlbmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgYWRkRGVmYXVsdEV4dGVuc2lvbihTdHJpbmcgZmlsZW5hbWUpIHsKLQkJU3RyaW5nQnVmZmVyIG5ld0ZpbGVOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcihmaWxlbmFtZSk7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTdHJpbmcgZXh0ID0gcHJlZmVyZW5jZS5nZXRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04pOwotCi0JCW5ld0ZpbGVOYW1lLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCi0JCW5ld0ZpbGVOYW1lLmFwcGVuZChleHQpOwotCi0JCXJldHVybiBuZXdGaWxlTmFtZS50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBwYXRoCi0JICogCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggd2hpY2ggcHJvamVjdCBpcyBuZWVkZWQKLQkgKiBAcmV0dXJuIElQcm9qZWN0IG9iamVjdC4gSWYgcGF0aCBpcyA8Y29kZT5udWxsPC9jb2RlPiB0aGUgcmV0dXJuIHZhbHVlIAotCSAqIAkJICAgaXMgYWxzbyA8Y29kZT5udWxsPC9jb2RlPi4gCi0JICovCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0RnJvbVBhdGgoSVBhdGggcGF0aCkgewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCQotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlpZiAod29ya3NwYWNlLnZhbGlkYXRlUGF0aChwYXRoLnRvU3RyaW5nKCksIElSZXNvdXJjZS5QUk9KRUNUKS5pc09LKCkpIHsKLQkJCQlwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KHBhdGgudG9TdHJpbmcoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCkuZ2V0UHJvamVjdCgpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgcHJvamVjdCBpcyBhIHdlYiBwcm9qZWN0LiAKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCBwcm9qZWN0IHRvIGJlIGNoZWNrZWQKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHByb2plY3QgaXMgd2ViIHByb2plY3QsIG90aGVyd2lzZSBmYWxzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1dlYlByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5pc1dlYlByb2plY3QocHJvamVjdCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdlYiBjb250ZW50cyBmb2xkZXIgb2YgdGhlIHNwZWNpZmllZCBwcm9qZWN0Ci0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3Qgd2hpY2ggd2ViIGNvbnRlbnRzIHBhdGggaXMgbmVlZGVkCi0JICogQHJldHVybiBJUGF0aCBvZiB0aGUgd2ViIGNvbnRlbnRzIGZvbGRlcgotCSAqLwotCXByaXZhdGUgSVBhdGggZ2V0V2ViQ29udGVudFBhdGgoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gRmFjZXRNb2R1bGVDb3JlU3VwcG9ydC5nZXRXZWJDb250ZW50Um9vdFBhdGgocHJvamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU1YWFhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Eb2N1bWVudFRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi0vKioKLSAqIFRlbXBsYXRlcyBwYWdlIGluIG5ldyBmaWxlIHdpemFyZC4gQWxsb3dzIHVzZXJzIHRvIHNlbGVjdCBhIG5ldyBmaWxlCi0gKiB0ZW1wbGF0ZSB0byBiZSBhcHBsaWVkIGluIG5ldyBmaWxlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogQ29udGVudCBwcm92aWRlciBmb3IgdGVtcGxhdGVzCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUZW1wbGF0ZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQkJLyoqIFRoZSB0ZW1wbGF0ZSBzdG9yZS4gKi8KLQkJcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZTdG9yZTsKLQotCQkvKgotCQkgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJZlN0b3JlID0gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dCkgewotCQkJcmV0dXJuIGZTdG9yZS5nZXRUZW1wbGF0ZXMoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuTkVXKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJZlN0b3JlID0gKFRlbXBsYXRlU3RvcmUpIG5ld0lucHV0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGFiZWwgcHJvdmlkZXIgZm9yIHRlbXBsYXRlcy4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRlbXBsYXRlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGludCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBpbnQpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSAoVGVtcGxhdGUpIGVsZW1lbnQ7Ci0KLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQljYXNlIDAgOgotCQkJCQlyZXR1cm4gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJCWNhc2UgMSA6Ci0JCQkJCXJldHVybiB0ZW1wbGF0ZS5nZXREZXNjcmlwdGlvbigpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKiBMYXN0IHNlbGVjdGVkIHRlbXBsYXRlIG5hbWUgKi8KLQlwcml2YXRlIFN0cmluZyBmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lOwotCS8qKiBUaGUgdmlld2VyIGRpc3BsYXlzIHRoZSBwYXR0ZXJuIG9mIHNlbGVjdGVkIHRlbXBsYXRlLiAqLwotCXByaXZhdGUgU291cmNlVmlld2VyIGZQYXR0ZXJuVmlld2VyOwotCS8qKiBUaGUgdGFibGUgcHJlc2VudGluZyB0aGUgdGVtcGxhdGVzLiAqLwotCXByaXZhdGUgVGFibGVWaWV3ZXIgZlRhYmxlVmlld2VyOwotCS8qKiBUZW1wbGF0ZSBzdG9yZSB1c2VkIGJ5IHRoaXMgd2l6YXJkIHBhZ2UgKi8KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlRlbXBsYXRlU3RvcmU7Ci0JLyoqIENoZWNrYm94IGZvciB1c2luZyB0ZW1wbGF0ZXMuICovCi0JcHJpdmF0ZSBCdXR0b24gZlVzZVRlbXBsYXRlQnV0dG9uOwotCi0JcHVibGljIE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlKCkgewotCQlzdXBlcigiTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2UiLCBIVE1MVUlNZXNzYWdlcy5OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8wLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihIVE1MVUlNZXNzYWdlcy5OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8xKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3JyZWN0bHkgcmVzaXplcyB0aGUgdGFibGUgc28gbm8gcGhhbnRvbSBjb2x1bW5zIGFwcGVhcgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBidXR0b25zCi0JICogICAgICAgICAgICB0aGUgYnV0dG9ucwotCSAqIEBwYXJhbSB0YWJsZQotCSAqICAgICAgICAgICAgdGhlIHRhYmxlCi0JICogQHBhcmFtIGNvbHVtbjEKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMgotCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMwotCSAqICAgICAgICAgICAgdGhlIHRoaXJkIGNvbHVtbgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmVUYWJsZVJlc2l6aW5nKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFRhYmxlIHRhYmxlLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yKSB7Ci0JCXBhcmVudC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlSZWN0YW5nbGUgYXJlYSA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJUG9pbnQgcHJlZmVycmVkU2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJaW50IHdpZHRoID0gYXJlYS53aWR0aCAtIDIgKiB0YWJsZS5nZXRCb3JkZXJXaWR0aCgpOwotCQkJCWlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCkgewotCQkJCQkvLyBTdWJ0cmFjdCB0aGUgc2Nyb2xsYmFyIHdpZHRoIGZyb20gdGhlIHRvdGFsIGNvbHVtbgotCQkJCQkvLyB3aWR0aAotCQkJCQkvLyBpZiBhIHZlcnRpY2FsIHNjcm9sbGJhciB3aWxsIGJlIHJlcXVpcmVkCi0JCQkJCVBvaW50IHZCYXJTaXplID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCk7Ci0JCQkJCXdpZHRoIC09IHZCYXJTaXplLng7Ci0JCQkJfQotCi0JCQkJUG9pbnQgb2xkU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCQlpZiAob2xkU2l6ZS54ID4gd2lkdGgpIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBzbWFsbGVyIHNvIG1ha2UgdGhlIGNvbHVtbnMKLQkJCQkJLy8gc21hbGxlciBmaXJzdCBhbmQgdGhlbiByZXNpemUgdGhlIHRhYmxlIHRvCi0JCQkJCS8vIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJdGFibGUuc2V0U2l6ZSh3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBiaWdnZXIgc28gbWFrZSB0aGUgdGFibGUKLQkJCQkJLy8gYmlnZ2VyIGZpcnN0IGFuZCB0aGVuIG1ha2UgdGhlIGNvbHVtbnMgd2lkZXIKLQkJCQkJLy8gdG8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCXRhYmxlLnNldFNpemUod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShhbmNlc3RvciwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIGNyZWF0ZSBjaGVja2JveCBmb3IgdXNlciB0byB1c2UgSFRNTCBUZW1wbGF0ZQotCQlmVXNlVGVtcGxhdGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZW5hYmxlVGVtcGxhdGVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSBjb21wb3NpdGUgZm9yIFRlbXBsYXRlcyB0YWJsZQotCQlDb21wb3NpdGUgaW5uZXJQYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGlubmVyTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJaW5uZXJMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWlubmVyTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWlubmVyTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJaW5uZXJQYXJlbnQuc2V0TGF5b3V0KGlubmVyTGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKTsKLQkJaW5uZXJQYXJlbnQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJLy8gQ3JlYXRlIGxpbmtlZCB0ZXh0IHRvIGp1c3QgdG8gdGVtcGxhdGVzIHByZWZlcmVuY2UgcGFnZQotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhpbm5lclBhcmVudCwgU1dULk5PTkUpOwotCQlsaW5rLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWxpbmsuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlsaW5rQ2xpY2tlZCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgdGFibGUgdGhhdCBkaXNwbGF5cyB0ZW1wbGF0ZXMKLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoaW5uZXJQYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoMik7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoMTApOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQl0YWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uMS5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLk5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzIpOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjIgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uMi5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLk5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzMpOwotCi0JCWZUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUZW1wbGF0ZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRlbXBsYXRlQ29udGVudFByb3ZpZGVyKCkpOwotCi0JCWZUYWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIpIHsKLQkJCQlpZiAoKG9iamVjdDEgaW5zdGFuY2VvZiBUZW1wbGF0ZSkgJiYgKG9iamVjdDIgaW5zdGFuY2VvZiBUZW1wbGF0ZSkpIHsKLQkJCQkJVGVtcGxhdGUgbGVmdCA9IChUZW1wbGF0ZSkgb2JqZWN0MTsKLQkJCQkJVGVtcGxhdGUgcmlnaHQgPSAoVGVtcGxhdGUpIG9iamVjdDI7Ci0JCQkJCWludCByZXN1bHQgPSBsZWZ0LmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJpZ2h0LmdldE5hbWUoKSk7Ci0JCQkJCWlmIChyZXN1bHQgIT0gMCkKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCXJldHVybiBsZWZ0LmdldERlc2NyaXB0aW9uKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBvYmplY3QxLCBvYmplY3QyKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNTb3J0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0pOwotCi0JCWZUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJdXBkYXRlVmlld2VySW5wdXQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIHZpZXdlciB0aGF0IGRpc3BsYXlzIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZSdzIGNvbnRlbnRzCi0JCWZQYXR0ZXJuVmlld2VyID0gZG9DcmVhdGVWaWV3ZXIocGFyZW50KTsKLQotCQlmVGVtcGxhdGVTdG9yZSA9IEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVTdG9yZSgpOwotCQlmVGFibGVWaWV3ZXIuc2V0SW5wdXQoZlRlbXBsYXRlU3RvcmUpOwotCi0JCWNvbmZpZ3VyZVRhYmxlUmVzaXppbmcoaW5uZXJQYXJlbnQsIHRhYmxlLCBjb2x1bW4xLCBjb2x1bW4yKTsKLQkJbG9hZExhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElIZWxwQ29udGV4dElkcy5IVE1MX05FV1dJWkFSRF9URU1QTEFURV9IRUxQSUQpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXNldENvbnRyb2wocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCBjb25maWd1cmVzIGFuZCByZXR1cm5zIGEgc291cmNlIHZpZXdlciB0byBwcmVzZW50IHRoZSB0ZW1wbGF0ZQotCSAqIHBhdHRlcm4gb24gdGhlIHByZWZlcmVuY2UgcGFnZS4gQ2xpZW50cyBtYXkgb3ZlcnJpZGUgdG8gcHJvdmlkZSBhCi0JICogY3VzdG9tIHNvdXJjZSB2aWV3ZXIgZmVhdHVyaW5nIGUuZy4gc3ludGF4IGNvbG9yaW5nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEByZXR1cm4gYSBjb25maWd1cmVkIHNvdXJjZSB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGJhc2VDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwoKTsKLQotCQkJcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQkJfQotCQl9OwotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIpLmdldFRleHRXaWRnZXQoKS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnQoIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWRNb2RlbCBzY3JhdGNoTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihDb250ZW50VHlwZUlkRm9ySFRNTC5Db250ZW50VHlwZUlEX0hUTUwpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzY3JhdGNoTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXZpZXdlci5jb25maWd1cmUoc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCXZpZXdlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgZG9DcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV81KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gY3JlYXRlVmlld2VyKHBhcmVudCk7Ci0JCXZpZXdlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJQ29udHJvbCBjb250cm9sID0gdmlld2VyLmdldENvbnRyb2woKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlL2Rpc2FibGUgY29udHJvbHMgaW4gcGFnZSBiYXNlZCBvbiBmVXNlVGVtcGxhdGVCdXR0b24ncyBjdXJyZW50Ci0JICogc3RhdGUuCi0JICovCi0Jdm9pZCBlbmFibGVUZW1wbGF0ZXMoKSB7Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IGZVc2VUZW1wbGF0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoIWVuYWJsZWQpIHsKLQkJCS8vIHNhdmUgbGFzdCBzZWxlY3RlZCB0ZW1wbGF0ZQotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkKLQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJZWxzZQotCQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQlmVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG51bGwpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0U2VsZWN0ZWRUZW1wbGF0ZShmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lKTsKLQkJfQotCi0JCWZUYWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZlBhdHRlcm5WaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZW1wbGF0ZSBwcmVmZXJlbmNlIHBhZ2UgaWQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZmVyZW5jZVBhZ2VJZCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy50ZW1wbGF0ZXMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGVtcGxhdGUuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGUgZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBudWxsOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQl0ZW1wbGF0ZSA9IChUZW1wbGF0ZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiB0ZW1wbGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRlbXBsYXRlIHN0cmluZyB0byBpbnNlcnQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgdG8gaW5zZXJ0IG9yIG51bGwgaWYgbm9uZSBpcyB0byBiZSBpbnNlcnRlZAotCSAqLwotCVN0cmluZyBnZXRUZW1wbGF0ZVN0cmluZygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlU3RyaW5nID0gbnVsbDsKLQotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCVRlbXBsYXRlQ29udGV4dFR5cGUgY29udGV4dFR5cGUgPSBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkuZ2V0Q29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuTkVXKTsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpOwotCQkJVGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBuZXcgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCAwLCAwKTsKLQkJCXRyeSB7Ci0JCQkJVGVtcGxhdGVCdWZmZXIgYnVmZmVyID0gY29udGV4dC5ldmFsdWF0ZSh0ZW1wbGF0ZSk7Ci0JCQkJdGVtcGxhdGVTdHJpbmcgPSBidWZmZXIuZ2V0U3RyaW5nKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wbGF0ZSBmb3IgbmV3IGh0bWwiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRlbXBsYXRlU3RyaW5nOwotCX0KLQotCXZvaWQgbGlua0NsaWNrZWQoKSB7Ci0JCVN0cmluZyBwYWdlSWQgPSBnZXRQcmVmZXJlbmNlUGFnZUlkKCk7Ci0JCVByZWZlcmVuY2VEaWFsb2cgZGlhbG9nID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLCBwYWdlSWQsIG5ldyBTdHJpbmdbXXtwYWdlSWR9LCBudWxsKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJZlRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBOZXcgSFRNTCBGaWxlIHdpemFyZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZExhc3RTYXZlZFByZWZlcmVuY2VzKCkgewotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUpOwotCQlpZiAodGVtcGxhdGVOYW1lID09IG51bGwgfHwgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lOwotCQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQllbmFibGVUZW1wbGF0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRlbXBsYXRlIG5hbWUgdXNlZCBmb3IgbmV4dCBjYWxsIHRvIE5ldyBIVE1MIEZpbGUgd2l6YXJkLgotCSAqLwotCXZvaWQgc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCkgewotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCXRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJfQotCi0JCUhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUsIHRlbXBsYXRlTmFtZSk7Ci0JCUhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IGEgdGVtcGxhdGUgaW4gdGhlIHRhYmxlIHZpZXdlciBnaXZlbiB0aGUgdGVtcGxhdGUgbmFtZS4gSWYKLQkgKiB0ZW1wbGF0ZSBuYW1lIGNhbm5vdCBiZSBmb3VuZCBvciB0ZW1wbGF0ZU5hbWUgaXMgbnVsbCwganVzdCBzZWxlY3QKLQkgKiBmaXJzdCBpdGVtIGluIHRhYmxlLiBJZiBubyBpdGVtcyBpbiB0YWJsZSBzZWxlY3Qgbm90aGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gdGVtcGxhdGVOYW1lCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkVGVtcGxhdGUoU3RyaW5nIHRlbXBsYXRlTmFtZSkgewotCQlPYmplY3QgdGVtcGxhdGUgPSBudWxsOwotCi0JCWlmICh0ZW1wbGF0ZU5hbWUgIT0gbnVsbCAmJiB0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLyBwaWNrIHRoZSBsYXN0IHVzZWQgdGVtcGxhdGUKLQkJCXRlbXBsYXRlID0gZlRlbXBsYXRlU3RvcmUuZmluZFRlbXBsYXRlKHRlbXBsYXRlTmFtZSwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuTkVXKTsKLQkJfQotCi0JCS8vIG5vIHJlY29yZCBvZiBsYXN0IHVzZWQgdGVtcGxhdGUgc28ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJaWYgKHRlbXBsYXRlID09IG51bGwpIHsKLQkJCS8vIGp1c3QgcGljayBmaXJzdCBlbGVtZW50Ci0JCQl0ZW1wbGF0ZSA9IGZUYWJsZVZpZXdlci5nZXRFbGVtZW50QXQoMCk7Ci0JCX0KLQotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGVtcGxhdGUpOwotCQkJZlRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgcGF0dGVybiB2aWV3ZXIuCi0JICovCi0Jdm9pZCB1cGRhdGVWaWV3ZXJJbnB1dCgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvTmV3SFRNTFdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0hUTUxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdjNTJmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvTmV3SFRNTFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLkhUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSFRNTEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi1wdWJsaWMgY2xhc3MgTmV3SFRNTFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCQotCXByaXZhdGUgTmV3SFRNTEZpbGVXaXphcmRQYWdlIGZOZXdGaWxlUGFnZTsKLQlwcml2YXRlIE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlIGZOZXdGaWxlVGVtcGxhdGVzUGFnZTsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZTZWxlY3Rpb247Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJZk5ld0ZpbGVQYWdlID0gbmV3IE5ld0hUTUxGaWxlV2l6YXJkUGFnZSgiSFRNTFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UiLCBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihJREUuY29tcHV0ZVNlbGVjdGVkUmVzb3VyY2VzKGZTZWxlY3Rpb24pKSk7IC8vJE5PTi1OTFMtMSQKLQkJZk5ld0ZpbGVQYWdlLnNldFRpdGxlKEhUTUxVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfTkVXX0hFQURJTkcpOwotCQlmTmV3RmlsZVBhZ2Uuc2V0RGVzY3JpcHRpb24oSFRNTFVJTWVzc2FnZXMuX1VJX1dJWkFSRF9ORVdfREVTQ1JJUFRJT04pOwotCQlhZGRQYWdlKGZOZXdGaWxlUGFnZSk7Ci0KLQkJZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlID0gbmV3IE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlKCk7Ci0JCWFkZFBhZ2UoZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYXBwbHlMaW5lRGVsaW1pdGVyKElGaWxlIGZpbGUsIFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0U3RyaW5nKFBsYXRmb3JtLlBJX1JVTlRJTUUsIFBsYXRmb3JtLlBSRUZfTElORV9TRVBBUkFUT1IsIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSwgbmV3IElTY29wZUNvbnRleHRbXSB7bmV3IFByb2plY3RTY29wZShmaWxlLmdldFByb2plY3QoKSksIG5ldyBJbnN0YW5jZVNjb3BlKCkgfSk7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY29udmVydGVkVGV4dCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UodGV4dCwgIlxyXG4iLCAiXG4iKTsKLQkJY29udmVydGVkVGV4dCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UoY29udmVydGVkVGV4dCwgIlxyIiwgIlxuIik7Ci0JCWNvbnZlcnRlZFRleHQgPSBTdHJpbmdVdGlscy5yZXBsYWNlKGNvbnZlcnRlZFRleHQsICJcbiIsIGxpbmVEZWxpbWl0ZXIpOwotCQlyZXR1cm4gY29udmVydGVkVGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggYVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gYVNlbGVjdGlvbikgewotCQlmU2VsZWN0aW9uID0gYVNlbGVjdGlvbjsKLQkJc2V0V2luZG93VGl0bGUoSFRNTFVJTWVzc2FnZXMuX1VJX1dJWkFSRF9ORVdfVElUTEUpOwotCi0JCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX1dJWkJBTl9ORVdIVE1MRklMRSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuRWRpdG9yKGZpbmFsIElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlLCB0cnVlKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlib29sZWFuIHBlcmZvcm1lZE9LID0gZmFsc2U7Ci0JCS8vIHNhdmUgdXNlciBvcHRpb25zIGZvciBuZXh0IHVzZQotCQlmTmV3RmlsZVRlbXBsYXRlc1BhZ2Uuc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGFkZCBkZWZhdWx0IGV4dGVuc2lvbgotCQlTdHJpbmcgZmlsZU5hbWUgPSBmTmV3RmlsZVBhZ2UuZ2V0RmlsZU5hbWUoKTsKLQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGZOZXdGaWxlUGFnZS5hZGREZWZhdWx0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkJCWZOZXdGaWxlUGFnZS5zZXRGaWxlTmFtZShuZXdGaWxlTmFtZSk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgYSBuZXcgZW1wdHkgZmlsZQotCQlJRmlsZSBmaWxlID0gZk5ld0ZpbGVQYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQkvLyBpZiB0aGVyZSB3YXMgcHJvYmxlbSB3aXRoIGNyZWF0aW5nIGZpbGUsIGl0IHdpbGwgYmUgbnVsbCwgc28gbWFrZQotCQkvLyBzdXJlIHRvIGNoZWNrCi0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCS8vIHB1dCB0ZW1wbGF0ZSBjb250ZW50cyBpbnRvIGZpbGUKLQkJCVN0cmluZyB0ZW1wbGF0ZVN0cmluZyA9IGZOZXdGaWxlVGVtcGxhdGVzUGFnZS5nZXRUZW1wbGF0ZVN0cmluZygpOwotCQkJaWYgKHRlbXBsYXRlU3RyaW5nICE9IG51bGwpIHsKLQkJCQl0ZW1wbGF0ZVN0cmluZyA9IGFwcGx5TGluZURlbGltaXRlcihmaWxlLCB0ZW1wbGF0ZVN0cmluZyk7Ci0JCQkJLy8gZGV0ZXJtaW5lIHRoZSBlbmNvZGluZyBmb3IgdGhlIG5ldyBmaWxlCi0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJCVN0cmluZyBjaGFyU2V0ID0gcHJlZmVyZW5jZS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCi0JCQkJdHJ5IHsKLQkJCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dHB1dFN0cmVhbVdyaXRlciA9IG51bGw7Ci0JCQkJCWlmIChjaGFyU2V0ID09IG51bGwgfHwgY2hhclNldC50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBqdXN0IHVzZSBkZWZhdWx0IGVuY29kaW5nCi0JCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSwgY2hhclNldCk7Ci0JCQkJCX0KLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLndyaXRlKHRlbXBsYXRlU3RyaW5nKTsKLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmZsdXNoKCk7Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci5jbG9zZSgpOwotCQkJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKSk7Ci0JCQkJCWZpbGUuc2V0Q29udGVudHMoaW5wdXRTdHJlYW0sIHRydWUsIGZhbHNlLCBudWxsKTsKLQkJCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJDb3VsZCBub3QgY3JlYXRlIGNvbnRlbnRzIGZvciBuZXcgSFRNTCBmaWxlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG9wZW4gdGhlIGZpbGUgaW4gZWRpdG9yCi0JCQlvcGVuRWRpdG9yKGZpbGUpOwotCi0JCQkvLyBldmVyeXRoaW5nJ3MgZmluZQotCQkJcGVyZm9ybWVkT0sgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBwZXJmb3JtZWRPSzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvdmlld3MvY29udGVudG91dGxpbmUvSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvdmlld3MvY29udGVudG91dGxpbmUvSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjE0MjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0hUTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5IVE1MTm9kZUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5YTUxOb2RlQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLlhNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBvdXRsaW5lIHZpZXcgcGFnZSB3aGljaCBzaG93cyBIVE1MIGNvbnRlbnQuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEhUTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBYTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gewotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBIVE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIEhUTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhNTE5vZGVBY3Rpb25NYW5hZ2VyIGNyZWF0ZU5vZGVBY3Rpb25NYW5hZ2VyKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQlyZXR1cm4gbmV3IEhUTUxOb2RlQWN0aW9uTWFuYWdlcigoSVN0cnVjdHVyZWRNb2RlbCkgdHJlZVZpZXdlci5nZXRJbnB1dCgpLCB0cmVlVmlld2VyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3RlbXBsYXRlcy9odG1sZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvdGVtcGxhdGVzL2h0bWxkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWI3OTJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvdGVtcGxhdGVzL2h0bWxkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEJlbmphbWluIE11c2thbGxhLCBiLm11c2thbGxhQGdteC5uZXQgLSBbMTU2MDQwXSBubyBuZXcgaHRtbCB0ZW1wbGF0ZSBmb3IgeGh0bWwgMS4wIHN0cmljdAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotVGVtcGxhdGVzLmNvbW1lbnQubmFtZT1jb21tZW50Ci1UZW1wbGF0ZXMuY29tbWVudC5kZXNjPWNvbW1lbnQKLVRlbXBsYXRlcy51bC5uYW1lPXVsCi1UZW1wbGF0ZXMudWwuZGVzYz11bm9yZGVyZWQgbGlzdAotVGVtcGxhdGVzLnVsLmNvbnRlbnQ9PHVsPlxuICA8bGk+IEl0ZW0gb25lIDwvbGk+XG4gIDxsaT4gSXRlbSB0d28gPC9saT5cbjwvdWw+XG4KLVRlbXBsYXRlcy5kbC5uYW1lPWRsCi1UZW1wbGF0ZXMuZGwuZGVzYz1kZWZpbml0aW9uIGxpc3QKLVRlbXBsYXRlcy5kbC5jb250ZW50PTxkbD5cbiAgPGR0PiBGaXJzdCBkZWZpbml0aW9uPC9kdD4gIDxkZD4gIEZpcnN0IGV4cGxhbmF0aW9uPC9kZD5cbiAgPGR0PiBTZWNvbmQgZGVmaW5pdGlvbjwvZHQ+IDxkZD4gU2Vjb25kIGV4cGxhbmF0aW9uPC9kZD5cbjwvZGw+XG4KLVRlbXBsYXRlcy50YWJsZS5uYW1lPXRhYmxlCi1UZW1wbGF0ZXMudGFibGUuZGVzYz10YWJsZQotVGVtcGxhdGVzLnRhYmxlLmNvbnRlbnQ9PHRhYmxlPlxuICA8dHI+XG4gICAgPHRoPkNvbHVtbiAxIEhlYWRpbmc8L3RoPlxuICAgIDx0aD5Db2x1bW4gMiBIZWFkaW5nPC90aD5cbiAgPC90cj5cbiAgPHRyPlxuICAgIDx0ZD5Sb3cgMTogQ29sIDE8L3RkPlxuICAgIDx0ZD5Sb3cgMTogQ29sIDI8L3RkPlxuICA8L3RyPlxuPC90YWJsZT5cbgotVGVtcGxhdGVzLm9sLm5hbWU9b2wKLVRlbXBsYXRlcy5vbC5kZXNjPW9yZGVyZWQgbGlzdAotVGVtcGxhdGVzLm9sLmNvbnRlbnQ9PG9sPlxuICA8bGk+IEl0ZW0gb25lIDwvbGk+XG4gIDxsaT4gSXRlbSB0d28gPC9saT5cbjwvb2w+XG4KLVRlbXBsYXRlcy5odG1sLm5hbWU9TmV3IEhUTUwgRmlsZSAoNC4wMSB0cmFuc2l0aW9uYWwpCi1UZW1wbGF0ZXMuaHRtbC5kZXNjPWh0bWwgNC4wMSB0cmFuc2l0aW9uYWwKLVRlbXBsYXRlcy5odG1sLmNvbnRlbnQ9PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+XG48aHRtbD5cbjxoZWFkPlxuPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iPlxuPHRpdGxlPkluc2VydCB0aXRsZSBoZXJlPC90aXRsZT5cbjwvaGVhZD5cbjxib2R5PlxuJHtjdXJzb3J9XG48L2JvZHk+XG48L2h0bWw+Ci1UZW1wbGF0ZXMuaHRtbGZyYW1lc2V0Lm5hbWU9TmV3IEhUTUwgRmlsZSAoNC4wMSBmcmFtZXNldCkKLVRlbXBsYXRlcy5odG1sZnJhbWVzZXQuZGVzYz1odG1sIDQuMDEgZnJhbWVzZXQKLVRlbXBsYXRlcy5odG1sZnJhbWVzZXQuY29udGVudD08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBGcmFtZXNldC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9mcmFtZXNldC5kdGQiPlxuPGh0bWw+XG48aGVhZD5cbjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSR7ZW5jb2Rpbmd9Ij5cbjx0aXRsZT5JbnNlcnQgdGl0bGUgaGVyZTwvdGl0bGU+XG48L2hlYWQ+XG48ZnJhbWVzZXQ+XG4gICAgPGZyYW1lPlxuICAgIDxmcmFtZT5cbiAgICA8bm9mcmFtZXM+XG4gICAgPGJvZHk+XG4gICAgPHA+VGhpcyBwYWdlIHVzZXMgZnJhbWVzLiBUaGUgY3VycmVudCBicm93c2VyIHlvdSBhcmUgdXNpbmcgZG9lcyBub3Qgc3VwcG9ydCBmcmFtZXMuPC9wPlxuICAgIDwvYm9keT5cbiAgICA8L25vZnJhbWVzPlxuPC9mcmFtZXNldD5cbjwvaHRtbD4KLVRlbXBsYXRlcy5odG1sc3RyaWN0Lm5hbWU9TmV3IEhUTUwgRmlsZSAoNC4wMSBzdHJpY3QpCi1UZW1wbGF0ZXMuaHRtbHN0cmljdC5kZXNjPWh0bWwgNC4wMSBzdHJpY3QKLVRlbXBsYXRlcy5odG1sc3RyaWN0LmNvbnRlbnQ9PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiPlxuPGh0bWw+XG48aGVhZD5cbjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSR7ZW5jb2Rpbmd9Ij5cbjx0aXRsZT5JbnNlcnQgdGl0bGUgaGVyZTwvdGl0bGU+XG48L2hlYWQ+XG48Ym9keT5cbiR7Y3Vyc29yfVxuPC9ib2R5PlxuPC9odG1sPgotVGVtcGxhdGVzLnhodG1sLm5hbWU9TmV3IFhIVE1MIEZpbGUgKDEuMCB0cmFuc2l0aW9uYWwpCi1UZW1wbGF0ZXMueGh0bWwuZGVzYz14aHRtbCAxLjAgdHJhbnNpdGlvbmFsCi1UZW1wbGF0ZXMueGh0bWwuY29udGVudD08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSIke2VuY29kaW5nfSIgPz5cbjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj5cbjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj5cbjxoZWFkPlxuPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iIC8+XG48dGl0bGU+SW5zZXJ0IHRpdGxlIGhlcmU8L3RpdGxlPlxuPC9oZWFkPlxuPGJvZHk+XG4ke2N1cnNvcn1cbjwvYm9keT5cbjwvaHRtbD4KLVRlbXBsYXRlcy54aHRtbGZyYW1lc2V0Lm5hbWU9TmV3IFhIVE1MIEZpbGUgKDEuMCBmcmFtZXNldCkKLVRlbXBsYXRlcy54aHRtbGZyYW1lc2V0LmRlc2M9eGh0bWwgMS4wIGZyYW1lc2V0Ci1UZW1wbGF0ZXMueGh0bWxmcmFtZXNldC5jb250ZW50PTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IiR7ZW5jb2Rpbmd9IiA/PlxuPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgRnJhbWVzZXQvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtZnJhbWVzZXQuZHRkIj5cbjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj5cbjxoZWFkPlxuPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iIC8+XG48dGl0bGU+SW5zZXJ0IHRpdGxlIGhlcmU8L3RpdGxlPlxuPC9oZWFkPlxuPGZyYW1lc2V0PlxuICAgIDxmcmFtZSAvPlxuICAgIDxmcmFtZSAvPlxuICAgIDxub2ZyYW1lcz5cbiAgICA8Ym9keT5cbiAgICA8cD5UaGlzIHBhZ2UgdXNlcyBmcmFtZXMuIFRoZSBjdXJyZW50IGJyb3dzZXIgeW91IGFyZSB1c2luZyBkb2VzIG5vdCBzdXBwb3J0IGZyYW1lcy48L3A+XG4gICAgPC9ib2R5PlxuICAgIDwvbm9mcmFtZXM+XG48L2ZyYW1lc2V0PlxuPC9odG1sPgotVGVtcGxhdGVzLnhodG1sc3RyaWN0Lm5hbWU9TmV3IFhIVE1MIEZpbGUgKDEuMCBzdHJpY3QpCi1UZW1wbGF0ZXMueGh0bWxzdHJpY3QuZGVzYz14aHRtbCAxLjAgc3RyaWN0Ci1UZW1wbGF0ZXMueGh0bWxzdHJpY3QuY29udGVudD08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSIke2VuY29kaW5nfSIgPz5cbjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj5cbjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj5cbjxoZWFkPlxuPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iIC8+XG48dGl0bGU+SW5zZXJ0IHRpdGxlIGhlcmU8L3RpdGxlPlxuPC9oZWFkPlxuPGJvZHk+XG4ke2N1cnNvcn1cbjwvYm9keT5cbjwvaHRtbD4KLVRlbXBsYXRlcy5zY3JpcHQubmFtZT1zY3JpcHQKLVRlbXBsYXRlcy5zY3JpcHQuZGVzYz1zY3JpcHQgICAgIChjb21tZW50ZWQpCi1UZW1wbGF0ZXMuc2NyaXB0LmNvbnRlbnQ9PHNjcmlwdCB0eXBlPVwiJHtjdXJzb3J9dGV4dC9qYXZhc2NyaXB0XCI+XG48IS0tXG5cbi8vLS0+XG48L3NjcmlwdD4KLVRlbXBsYXRlcy5zdHlsZS5uYW1lPXN0eWxlCi1UZW1wbGF0ZXMuc3R5bGUuZGVzYz1zdHlsZSAgICAgKGNvbW1lbnRlZCkKLVRlbXBsYXRlcy5zdHlsZS5jb250ZW50PTxzdHlsZT5cbjwhLS1cbiR7Y3Vyc29yfVxuLS0+XG48L3N0eWxlPgotVGVtcGxhdGVzLmltZ21hcC5uYW1lPWltZwotVGVtcGxhdGVzLmltZ21hcC5kZXNjPWltZyAgICAgKG1hcCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3RlbXBsYXRlcy9odG1sZGVmYXVsdC10ZW1wbGF0ZXMueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS90ZW1wbGF0ZXMvaHRtbGRlZmF1bHQtdGVtcGxhdGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjExZmZiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3RlbXBsYXRlcy9odG1sZGVmYXVsdC10ZW1wbGF0ZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgQmVuamFtaW4gTXVza2FsbGEsIGIubXVza2FsbGFAZ214Lm5ldCAtIFsxNTYwNDBdIG5vIG5ldyBodG1sIHRlbXBsYXRlIGZvciB4aHRtbCAxLjAgc3RyaWN0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAtLT4KLTx0ZW1wbGF0ZXM+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmNvbW1lbnQubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuY29tbWVudC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLmNvbW1lbnQiIGNvbnRleHQ9Imh0bWxfdGFnIiBlbmFibGVkPSJ0cnVlIj4mbHQ7IS0tICR7Y3Vyc29yfSAtLSZndDs8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5pbWdtYXAubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuaW1nbWFwLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMuaW1nbWFwIiBjb250ZXh0PSJodG1sX3RhZyIgZW5hYmxlZD0idHJ1ZSI+Jmx0O2ltZyBpc21hcCZndDs8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy51bC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy51bC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLnVsIiBjb250ZXh0PSJodG1sX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy51bC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuZGwubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuZGwuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlbXBsYXRlcy5kbCIgY29udGV4dD0iaHRtbF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuZGwuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLnRhYmxlLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLnRhYmxlLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMudGFibGUiIGNvbnRleHQ9Imh0bWxfdGFnIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLnRhYmxlLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5vbC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5vbC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLm9sIiBjb250ZXh0PSJodG1sX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5vbC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuaHRtbC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5odG1sLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMuaHRtbCIgY29udGV4dD0iaHRtbF9uZXciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuaHRtbC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuaHRtbGZyYW1lc2V0Lm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmh0bWxmcmFtZXNldC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLmh0bWxmcmFtZXNldCIgY29udGV4dD0iaHRtbF9uZXciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuaHRtbGZyYW1lc2V0LmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5odG1sc3RyaWN0Lm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmh0bWxzdHJpY3QuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlbXBsYXRlcy5odG1sc3RyaWN0IiBjb250ZXh0PSJodG1sX25ldyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5odG1sc3RyaWN0LmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy54aHRtbC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy54aHRtbC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLnhodG1sIiBjb250ZXh0PSJodG1sX25ldyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy54aHRtbC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMueGh0bWxmcmFtZXNldC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy54aHRtbGZyYW1lc2V0LmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMueGh0bWxmcmFtZXNldCIgY29udGV4dD0iaHRtbF9uZXciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMueGh0bWxmcmFtZXNldC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMueGh0bWxzdHJpY3QubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMueGh0bWxzdHJpY3QuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlbXBsYXRlcy54aHRtbHN0cmljdCIgY29udGV4dD0iaHRtbF9uZXciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMueGh0bWxzdHJpY3QuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLnNjcmlwdC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5zY3JpcHQuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlbXBsYXRlcy5zY3JpcHQiIGNvbnRleHQ9Imh0bWxfdGFnIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLnNjcmlwdC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuc3R5bGUubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuc3R5bGUuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlbXBsYXRlcy5zdHlsZSIgY29udGV4dD0iaHRtbF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuc3R5bGUuY29udGVudDwvdGVtcGxhdGU+Ci0KLTwvdGVtcGxhdGVzPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjE2NWVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYzUwNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnPXRydWUKLW9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL3RyYWNlZmlsdGVyPQotb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanNpbmRleG1hbmFnZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzdHJhbnNsYXRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzdHJhbnNsYXRpb25zdG9kaXNrPWZhbHNlCi1vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9kZWJ1Zy9qc3NlYXJjaD1mYWxzZQotCi1vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS90YWdsaWIvcmVzb2x2ZT1mYWxzZQotCi1vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9kZWJ1Zy9qc2phdmFtYXBwaW5nPWZhbHNlCi0KLW9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzdmFsaWRhdG9yPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyY2I4NzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUwNzIxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLSNXZWQgT2N0IDI0IDE5OjQ5OjQ1IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTFkMDlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSNXZWQgT2N0IDI0IDE5OjQxOjMxIEVEVCAyMDA3Ci1jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKLWNsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz1mYWxzZQotY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLWNsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLWNsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCi1jbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1jbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKLWNsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPWZhbHNlCi1jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9dHJ1ZQotY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKLWNsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCi1jbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPWZhbHNlCi1jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLWNsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKLWNsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1jbGVhbnVwLnVzZV9ibG9ja3M9dHJ1ZQotY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLWNsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLWNsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLWNsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1jbGVhbnVwX3Byb2ZpbGU9X1NTRSBUZWFtIFN0eWxlcwotY2xlYW51cF9zZXR0aW5nc192ZXJzaW9uPTIKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLmV4Y2VwdGlvbi5uYW1lPWUKLW9yZy5lY2xpcHNlLmpkdC51aS5nZXR0ZXJzZXR0ZXIudXNlLmlzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5rZXl3b3JkdGhpcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LnVpLm92ZXJyaWRlYW5ub3RhdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzUyMmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNNb24gQXByIDE3IDAyOjAxOjMzIEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYWU4YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkpzQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3Q7Ci0gIHVzZXM6PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSwKLSAgIG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUsCi0gICBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLAotICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwudGFza3MsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbiwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLnRleHQKLVJlcXVpcmUtQnVuZGxlOiBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuOC4xLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTQyNjllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLWJpbi5pbmNsdWRlcyA9IC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgY29tcG9uZW50LnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sCi0gICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvY29tcG9uZW50LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ2NmFjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIiPgotCTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS50YWdsaWIiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJJSmFyUmVjb3JkIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotCQk8IS0tIDx0eXBlIG5hbWU9IklUYWdEaXJSZWNvcmQiIGltcGxlbWVudD0iZmFsc2UiIC8+IC0tPgotCQk8IS0tIDx0eXBlIG5hbWU9IklUYWdsaWJJbmRleExpc3RlbmVyIiBpbXBsZW1lbnQ9InRydWUiIC8+IC0tPgotCQk8dHlwZSBuYW1lPSJJVGFnbGliRGVzY3JpcHRvciIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLQkJPHR5cGUgbmFtZT0iSVRhZ2xpYlJlY29yZCIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLQkJPCEtLSA8dHlwZSBuYW1lPSJJVGFnbGliUmVjb3JkRXZlbnQiIGltcGxlbWVudD0iZmFsc2UiIC8+IC0tPgotCQk8dHlwZSBuYW1lPSJJVExEUmVjb3JkIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotCQk8dHlwZSBuYW1lPSJJVVJMUmVjb3JkIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotCQk8dHlwZSBuYW1lPSJUYWdsaWJJbmRleCIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiIC8+Ci0JPC9wYWNrYWdlPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aSIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUCIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmUiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJKU1BDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmluZm9wb3AiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vZWNsaXBzZS5vcmcvd2VidG9vbHMvanN0L2NvbXBvbmVudHMvanNwL292ZXJ2aWV3Lmh0bWwiIC8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY3NTI5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPSBKYXZhU2NyaXB0IFN1cHBvcnQKLXByb3ZpZGVyTmFtZT0gRWNsaXBzZS5vcmcKLUJ1bmRsZS1OYW1lLjAgPSBKU0RUIFdlYiBTdXBwb3J0IENvcmUgCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwotZXh0ZW5zaW9uLm5hbWUuMCA9IEphdmFTY3JpcHQgRW1iZWRlZAotZXh0ZW5zaW9uLm5hbWUuMSA9IEVtYmVkZWQgSmF2YVNjcmlwdCBCdWlsZGVyCi1leHRlbnNpb24tcG9pbnQubmFtZS4wID0gSmF2YVNjcmlwdCBQcmUgUHJvY2Vzc2luZwotamF2YXNjcmlwdC52YWxpZGF0b3I9IEphdmFTY3JpcHQgU3ludGF4IFZhbGlkYXRpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ5ZmYxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJqYXZhc2NyaXB0UHJlUHJvY2Vzc29yIiBuYW1lPSIlZXh0ZW5zaW9uLXBvaW50Lm5hbWUuMCIgc2NoZW1hPSJzY2hlbWEvamF2YXNjcmlwdFByZVByb2Nlc3Nvci5leHNkIi8+Ci0gICAKLSAgIAotICAgCi0gICAKLSAgIAotICAgPCEtLSBGdWxsIGJsb3duIEpTRFQgRkFDRVQgLS0+Ci0gIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIj4KLQkgICAgPGNhdGVnb3J5IGlkPSJqc2R0LmNhdGVnb3J5Ij4KLQkgICAgPGxhYmVsPkphdmFTY3JpcHQgRGV2ZWxvcG1lbnQgVG9vbGtpdDwvbGFiZWw+Ci0JICAgIDxkZXNjcmlwdGlvbj5FbmFibGVzIGFkdmFuY2VkIEphdmFTY3JpcHQgc3VwcG9ydC48L2Rlc2NyaXB0aW9uPgotCSAgPC9jYXRlZ29yeT4KLSAgIAotICAgCQk8cHJvamVjdC1mYWNldCBpZD0id3N0LmpzZHQud2ViIj4KLQkJCTxsYWJlbD5KYXZhU2NyaXB0IFRvb2xraXQ8L2xhYmVsPgotCSAgCSAJPGRlc2NyaXB0aW9uPkFkZHMgYWR2YW5jZWQgSmF2YVNjcmlwdCBlZGl0aW5nIHN1cHBvcnQuPC9kZXNjcmlwdGlvbj4KLQkgIAkgIAk8ZGVmYXVsdC12ZXJzaW9uIHZlcnNpb249IjEuMCIvPgotCQk8L3Byb2plY3QtZmFjZXQ+Ci0JCi0JCTxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9IndzdC5qc2R0LndlYiIgdmVyc2lvbj0iMS4wIj4KLQkJCi0JCTxjb25zdHJhaW50PgotCQkJICA8b3I+Ci0JCQkgICAgPHJlcXVpcmVzIGZhY2V0PSJqc3Qud2ViIi8+Ci0JCQkgICAgPHJlcXVpcmVzIGZhY2V0PSJ3c3Qud2ViIi8+Ci0JCQkgIDwvb3I+Ci0JCTwvY29uc3RyYWludD4KLQkJCi0JCTwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCQotCQk8YWN0aW9uIGZhY2V0PSJ3c3QuanNkdC53ZWIiIHR5cGU9Imluc3RhbGwiIGlkPSJ3c3QuanNkdC53ZWIuaW5zdGFsbCIgdmVyc2lvbj0iMS4wIj4KLQkgICAJCTxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdC5Kc05hdHVyZUluc3RhbGxlciIvPgotCQk8L2FjdGlvbj4KLQkKLQkJPGFjdGlvbiBmYWNldD0id3N0LmpzZHQud2ViIiB0eXBlPSJ1bmluc3RhbGwiIGlkPSJ3c3QuanNkdC53ZWIudW5pbnN0YWxsIiB2ZXJzaW9uPSIxLjAiPgotCQkJPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0LkpzTmF0dXJlVW5pbnN0YWxsZXIiLz4KLQkJPC9hY3Rpb24+Ci0JCi0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZXMiPgotCSAgPHN1cHBvcnRlZD4KLQkgICAgPGZhY2V0IGlkPSJ3c3QuanNkdC53ZWIiLz4KLQkgICAgPHJ1bnRpbWUtY29tcG9uZW50IGFueT0idHJ1ZSIvPgotCSAgPC9zdXBwb3J0ZWQ+Ci0KLQk8L2V4dGVuc2lvbj4KLSAgIAotICAgCi0gICAKLSAgIAotICAgCi0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHRQcmVQcm9jZXNzb3IiPgotICAgCQk8amF2YXNjcmlwdFByZVByb2Nlc3NvcgotICAgCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbiIKLSAgIAkJCXByaW9yaXR5PSIxIiAvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDwhLS0gSW5zdGFsbCBIYW5kbGVyIGZvciB3ZWIgSlNEVC4uIFBpZ3liYWNrcyBvbiB3c3Qud2ViIGZhY2V0LS0+Ci0gIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIj4KLSAgIAotCQk8ZXZlbnQtaGFuZGxlciBmYWNldD0id3N0LndlYiIgdHlwZT0iUE9TVF9JTlNUQUxMIiB2ZXJzaW9uPSJbMS4wIj4KLQkgICAJCTxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdC5Kc05hdHVyZUluc3RhbGxlciIvPgotCQk8L2V2ZW50LWhhbmRsZXI+Ci0JCi0JCTxldmVudC1oYW5kbGVyIGZhY2V0PSJ3c3Qud2ViIiB0eXBlPSJQT1NUX1VOSU5TVEFMTCIgdmVyc2lvbj0iWzEuMCI+Ci0JCQk8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3QuSnNOYXR1cmVVbmluc3RhbGxlciIvPgotCQk8L2V2ZW50LWhhbmRsZXI+Ci0KLQkJPGV2ZW50LWhhbmRsZXIgZmFjZXQ9ImpzdC53ZWIiIHR5cGU9IlBPU1RfSU5TVEFMTCIgIHZlcnNpb249IlsyLjAiPgotCSAgIAkJPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0LkpzTmF0dXJlSW5zdGFsbGVyIi8+Ci0JCTwvZXZlbnQtaGFuZGxlcj4KLQkKLQkJPGV2ZW50LWhhbmRsZXIgZmFjZXQ9ImpzdC53ZWIiIHR5cGU9IlBPU1RfVU5JTlNUQUxMIiB2ZXJzaW9uPSJbMi4wIj4KLQkJCTxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdC5Kc05hdHVyZVVuaW5zdGFsbGVyIi8+Ci0JCTwvZXZlbnQtaGFuZGxlcj4KLQotCQotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gcmVtb3ZlZCBkdWUgdG8gSlVuaXQgZmFpbHVyZXMgZHVyaW5nIGluaXRpYWwgV1RQIGJ1aWxkCi0JICAgPGV4dGVuc2lvbiBpZD0iZW1iZWRlZC5qc05hdHVyZSIgbmFtZT0iJWV4dGVuc2lvbi5uYW1lLjAiIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5uYXR1cmVzIj4gCi0JCSAgIDxydW50aW1lPiAgICAgICAgICAKLQkJICAgCTxydW4gY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3QuSnNXZWJOYXR1cmUiLz4gICAgICAgCi0JCSAgIDwvcnVudGltZT4gICAgICAgCi0JIAkgICA8YnVpbGRlciBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuZW1iZWRlZC5qYXZhc2NyaXB0Ii8+ICAgIAotCSAgIDwvZXh0ZW5zaW9uPiAKLQktLT4gICAKLQotCSAgIAk8IS0tIAotCSAgIAlOb3QgdXNpbmcgdGhpcyBhdCB0aGUgbW9tZW50LCBidXQgZXZlcnl0aGluZ3MgaW4gcGxhY2UgaWYgd2UgbmVlZCBpbiB0aGUgZnV0dXJlLiAKLQkgICAgLS0+ICAKLQkgICAKLQkgICA8ZXh0ZW5zaW9uIGlkPSJlbWJlZGVkLmphdmFzY3JpcHQiIG5hbWU9IiVleHRlbnNpb24ubmFtZS4xIiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuYnVpbGRlcnMiPiAgICAgICAKLQkJICAgCTxidWlsZGVyIGhhc05hdHVyZT0idHJ1ZSIgY2FsbE9uRW1wdHlEZWx0YT0idHJ1ZSI+Ci0JCSAgIAkgICAgICAKLQkJICAgCTxydW4gY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkluY3JlbWVudGFsQnVpbGRlciIvPiAgICAgIAotCQkgICA8L2J1aWxkZXI+ICAgIAotCSAgIDwvZXh0ZW5zaW9uPgotCQotCQotCQotCQotCTwhLS0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGFza3NjYW5uZXIiPgotCQk8c2Nhbm5lcgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnRhc2tzLkpzRmlsZVRhc2tTY2FubmVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnRhc2tzLkpzRmlsZVRhc2tTY2FubmVyIgotCQkJY29udGVudFR5cGVJZHM9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQktLT4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0UHJvY2Vzc29ycyI+Ci0JCTxwcm9jZXNzb3IKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdC5IVE1MRm9ybWF0UHJvY2Vzc29ySW1wbCIKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSI+Ci0JCTwvcHJvY2Vzc29yPgotCTwvZXh0ZW5zaW9uPgotCQotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBKU1AgYmF0Y2ggdmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCSAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbgotCQlpZD0iSnNCYXRjaFZhbGlkYXRvciIKLQkJbmFtZT0iJWphdmFzY3JpcHQudmFsaWRhdG9yIgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLQkJPHZhbGlkYXRvcj4KLQkJCTxwcm9qZWN0TmF0dXJlIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmpzTmF0dXJlIiAvPgotCi0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCW5hbWVGaWx0ZXI9IiouaHRtbCI+Ci0JCQk8L2ZpbHRlcj4KLQkJCTxmaWx0ZXIKLQkJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQkJbmFtZUZpbHRlcj0iKi5odG0iPgotCQkJPC9maWx0ZXI+Ci0JCQkKLQkJCTxmaWx0ZXIKLQkJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQkJbmFtZUZpbHRlcj0iKi5qc3AiPgotCQkJPC9maWx0ZXI+Ci0JCQkgCi0KLQkJCTxoZWxwZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hDb250ZXh0Ij4KLQkJCTwvaGVscGVyPgotCi0JCQk8cnVuCi0JCQkJZW5hYmxlZD0iZmFsc2UiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnNCYXRjaFZhbGlkYXRvciI+Ci0JCQk8L3J1bj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyIj4KLQkgICAgICA8SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyCi0JICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3QuV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplciIKLQkgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQubGF1bmNoaW5nLldlYlByb2plY3QiPgotCSAgICAgIDwvSnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyPgotICAJIDwvZXh0ZW5zaW9uPgotCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NjaGVtYS9qYXZhc2NyaXB0UHJlUHJvY2Vzc29yLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NjaGVtYS9qYXZhc2NyaXB0UHJlUHJvY2Vzc29yLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZjZmMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zY2hlbWEvamF2YXNjcmlwdFByZVByb2Nlc3Nvci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlIiBpZD0iamF2YXNjcmlwdFByZVByb2Nlc3NvciIgbmFtZT0iSmF2YVNjcmlwdCBQcmUgUHJvY2Vzc2luZyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJqYXZhc2NyaXB0UHJlUHJvY2Vzc29yIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImphdmFzY3JpcHRQcmVQcm9jZXNzb3IiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJpb3JpdHkiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgbG9hZGluZyBwcmlvcml0eS4gdGhlIGhpZ2hlc3QgbnVtYmVyIHdpbnMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlpbmZvIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9JbmNyZW1lbnRhbEJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL0luY3JlbWVudGFsQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDNiZGI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL0luY3JlbWVudGFsQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBJbmNyZW1lbnRhbEJ1aWxkZXIgZXh0ZW5kcyBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyIHsKLQlwdWJsaWMgSW5jcmVtZW50YWxCdWlsZGVyKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuaW1wbGVtZW50ZWQgbWV0aG9kOkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIoKSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlciNidWlsZChpbnQsCi0JICogICAgICBqYXZhLnV0aWwuTWFwLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQkKLQlwcm90ZWN0ZWQgSVByb2plY3RbXSBidWlsZChpbnQga2luZCwgTWFwIGFyZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiVW5pbXBsZW1lbnRlZCBtZXRob2Q6SW5jcmVtZW50YWxCdWlsZGVyLmJ1aWxkIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvSlNQQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvSlNQQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzkxOGM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL0pTUENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1KU1BJbmRleE1hbmFnZXJfMD1VcGRhdGluZyBKYXZhU2NyaXB0IEluZGV4Ci1KU1BJbmRleE1hbmFnZXJfMj1KYXZhU2NyaXB0IEluZGV4ZXIgaW5kZXhpbmcgezB9IGZpbGVzCi1KU1BfU2VhcmNoPUphdmFTY3JpcHQgU2VhcmNoIC0gCi1KU1BEb2N1bWVudExvYWRlcl8xPVByb2dyYW0gRXJyb3I6IHN0cnVjdHVyZWQgbW9kZWwgaGFkIG5vIHN0cnVjdHVyZWREb2N1bWVudAotSlNQRUxfU3ludGF4PUVMIFN5bnRheCBFcnJvciAKLUpTUEVMX1Rva2VuPVVuYWJsZSB0byBhbmFseXNlIEVMIGV4cHJlc3Npb24gZHVlIHRvIGxleGljYWwgYW5hbHlzaXMgZXJyb3IKLU1FU1NBR0VfSlNQX1ZBTElEQVRJTkdfTUVTU0FHRV9VSV89SmF2YVNjcmlwdCBWYWxpZGF0b3IgdmFsaWRhdGluZyB7MH0KLUpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmc9VXBkYXRpbmcgSmF2YVNjcmlwdCBGcmFnbWVudCBDb250ZW50IFNldHRpbmdzCi1KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1Byb2JsZW1zX1VwZGF0aW5nPVByb2JsZW0gc2F2aW5nIEphdmFTY3JpcHQgRnJhZ21lbnQgQ29udGVudCBTZXR0aW5ncyBmb3IgezB9Ci1KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMD17MH0gaXMgYSByZXNlcnZlZCBwcmVmaXguICBUcnkgYW5vdGhlcgotSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzE9Q2Fubm90IGZpbmQgdGhlIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IgZm9yIHswfQotSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzI9VGhlIHByZWZpeCB7MH0gaXMgdXNlZCBtb3JlIHRoYW4gb25jZQotSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzM9QSB7MH0gdmFsdWUgaXMgcmVxdWlyZWQgaW4gdGhpcyBkaXJlY3RpdmUKLUpTUEJhdGNoVmFsaWRhdG9yXzA9R2F0aGVyaW5nIGZpbGVzIGluIHswfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvSnNDb3JlTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL0pzQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4N2ZjMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvSnNDb3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotLyoqCi0qCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSnNDb3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUF9TZWFyY2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQQmF0Y2hWYWxpZGF0b3JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEaXJlY3RpdmVWYWxpZGF0b3JfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEb2N1bWVudExvYWRlcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEVMX1N5bnRheDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BFTF9Ub2tlbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1Byb2JsZW1zX1VwZGF0aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQSW5kZXhNYW5hZ2VyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQSW5kZXhNYW5hZ2VyXzI7Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfSlNQX1ZBTElEQVRJTkdfTUVTU0FHRV9VSV87Ci0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhKc0NvcmVNZXNzYWdlcy5CVU5ETEVfTkFNRSwgSnNDb3JlTWVzc2FnZXMuY2xhc3MpOwotCX0KLQkKLQlwcml2YXRlIEpzQ29yZU1lc3NhZ2VzKCkge30KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL0pzQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvSnNDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNjgwMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvSnNDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5Kc0luZGV4TWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0qCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSnNDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEpzQ29yZVBsdWdpbiBwbHVnaW47Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtIHdpbGwgYmUgcmVtb3ZlZC4gQ3VycmVudGx5IHVzZWQgdG8gZ2V0ICJtb2RlbCBwcmVmZXJlbmNlcyIsCi0JICogICAgICAgICAgICAgYnV0IHRoZXJlIGFyZSBvdGhlciwgYmV0dGVyIHdheXMuCi0JICovCi0KLQlwdWJsaWMgc3RhdGljIEpzQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gSnNDb3JlUGx1Z2luLnBsdWdpbjsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBKc0NvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCUpzQ29yZVBsdWdpbi5wbHVnaW4gPSB0aGlzOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCS8vIEpTUEluZGV4TWFuYWdlciBkZXBlbmRzIG9uIFRhZ2xpYkNvbnRyb2xsZXIsIHNvIFRhZ2xpYkNvbnRyb2xsZXIKLQkJLy8gc2hvdWxkIGJlIHN0YXJ0ZWQgZmlyc3QKLQkJLy8gbGlzdGVuIGZvciBjbGFzc3BhdGggY2hhbmdlcwotCQlKc0luZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLmluaXRpYWxpemUoKTsKLQkJLy8gbGlzdGVuIGZvciByZXNvdXJjZSBjaGFuZ2VzIHRvIHVwZGF0ZSBjb250ZW50IHByb3BlcnRpZXMga2V5cwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHN0b3AgbGlzdGVubmluZyBmb3IgcmVzb3VyY2UgY2hhbmdlcyB0byB1cGRhdGUgY29udGVudCBwcm9wZXJ0aWVzCi0JCS8vIGtleXMKLQkJLy8gc3RvcCBhbnkgaW5kZXhpbmcKLQkJSnNJbmRleE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zaHV0ZG93bigpOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWM0MTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0qCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIExvZ2dlci5FUlJPUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIExvZ2dlci5JTkZPOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgTG9nZ2VyLk9LOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIExvZ2dlci5XQVJOSU5HOwotCQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoT0ssIElORk8sIFdBUk5JTkcsIEVSUk9SLAotCSAqICAgICAgICAgICAgT0tfREVCVUcsIElORk9fREVCVUcsIFdBUk5JTkdfREVCVUcsIEVSUk9SX0RFQlVHKQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93bgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGxldmVsID09IExvZ2dlci5PS19ERUJVRyB8fCBsZXZlbCA9PSBMb2dnZXIuSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBMb2dnZXIuV0FSTklOR19ERUJVRyB8fCBsZXZlbCA9PSBMb2dnZXIuRVJST1JfREVCVUcpIHsKLQkJCWlmICghTG9nZ2VyLmlzRGVidWdnaW5nKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHOgotCQkJY2FzZSBJTkZPOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUc6Ci0JCQljYXNlIFdBUk5JTkc6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLldBUk5JTkc7Ci0JCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUc6Ci0JCQljYXNlIEVSUk9SOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5FUlJPUjsKLQkJfQotCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBMb2dnZXIuUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShMb2dnZXIuUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBQcmludHMgbWVzc2FnZSB0byBsb2cgaWYgY2F0ZWdvcnkgbWF0Y2hlcyAvZGVidWcvdHJhY2VmaWx0ZXIgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIHByaW50Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogICAgICAgICAgICBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aAotCSAqICAgICAgICAgICAgL2RlYnVnL3RyYWNlZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF90cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChMb2dnZXIuaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgTG9nZ2VyLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoTG9nZ2VyLlBMVUdJTl9JRCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCQotCS8qKgotCSAqIERldGVybWluZXMgaWYgY3VycmVudGx5IHRyYWNpbmcgYSBjYXRlZ29yeQotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFjaW5nIGNhdGVnb3J5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoIUxvZ2dlci5pc0RlYnVnZ2luZygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oTG9nZ2VyLlBMVUdJTl9JRCArIExvZ2dlci5UUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCUxvZ2dlci5fbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCUxvZ2dlci5fbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCUxvZ2dlci5fbG9nKExvZ2dlci5FUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCUxvZ2dlci5fbG9nKExvZ2dlci5FUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTG9nZ2VyLl90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCUxvZ2dlci5fdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJTG9nZ2VyLl90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvSVdlYkRvY3VtZW50Q2hhbmdlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9JV2ViRG9jdW1lbnRDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDRlZGQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9JV2ViRG9jdW1lbnRDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGludGVyZmFjZSBJV2ViRG9jdW1lbnRDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIElXZWJSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9SSU5HID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVJUWV9ET0MgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJUlRZX01PREVMID0gMjsKLQkKLQlwdWJsaWMgaW50IGdldEludHJlc3RMZXZlbEF0T2Zmc2V0KGludCBkb2N1bWVudE9mZnNldCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvSVdlYlJlc291cmNlQ2hhbmdlZExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvSVdlYlJlc291cmNlQ2hhbmdlZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwODRlOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0lXZWJSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGludGVyZmFjZSBJV2ViUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIgewotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5NDM4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9XZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9XZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRkOGU4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLk1vZGVsTGlmZWN5Y2xlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExpZmVjeWNsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIFdlYlJlc291cmNlQ2hhbmdlSGFuZGxlciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJRG9jdW1lbnRMaXN0ZW5lciwgSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgewotCS8qCi0JICogQ2hlY2sgdGhlIGxldmVsIG9mIGRpcnR5IHJlZ2lvbnMgd2hlbiBzaWduYWxpbmcgZm9yIGRvY3VtZW50IGV2ZW50cy4KLQkgKiAKLQkgKiBzb21ldGltZXMgdGhlIFNTRSBlZGl0b3IgZG9lc24ndCByZS12YWxpZGF0ZSByZWdpb25zIHdoZW4gdGV4dCBpcwotCSAqIGluc2VydGVkLCBzbyBzZXR0aW5nIHRoaXMgdG8gZmFsc2UgY2F1c2VzIGV2ZXJ5IGRvY3VtZW50IGNoYW5nZSBldmVudCB0bwotCSAqIHRyaWdnZXIgYSByZXZhbGlkYXRpb24uCi0JICogCi0JICogc2V0dGluZyB0byB0cnVlIG1heSBzcGVlZCB0aGluZ3MgdXAuCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBDSEVDS19JTlRSRVNUX0xFVkVMID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIGluc3RhbmNlcyA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFNJR05BTF9NT0RFTCA9IGZhbHNlOwotCQotCXB1YmxpYyBzdGF0aWMgV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyIGdldEluc3RhbmNlKElTdHJ1Y3R1cmVkTW9kZWwgeG1sTW9kZWwsIElXZWJSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lcikgewotCQlXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIgaGFuZGxlciA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAoV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmluc3RhbmNlcykgewotCQkJRW51bWVyYXRpb24gdmFsdWVzID0gV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmluc3RhbmNlcy5lbGVtZW50cygpOwotCQkJd2hpbGUgKHZhbHVlcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCU9iamVjdCBtb2RlbCA9IHZhbHVlcy5uZXh0RWxlbWVudCgpOwotCQkJCWlmIChtb2RlbCA9PSB4bWxNb2RlbCkgewotCQkJCQloYW5kbGVyID0gKFdlYlJlc291cmNlQ2hhbmdlSGFuZGxlcikgV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmluc3RhbmNlcy5nZXQobW9kZWwpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChoYW5kbGVyID09IG51bGwpIHsKLQkJCQloYW5kbGVyID0gbmV3IFdlYlJlc291cmNlQ2hhbmdlSGFuZGxlcigpOwotCQkJCVdlYlJlc291cmNlQ2hhbmdlSGFuZGxlci5pbnN0YW5jZXMucHV0KGhhbmRsZXIsIHhtbE1vZGVsKTsKLQkJCX0KLQkJfQotCQloYW5kbGVyLmluaXRpYWxpemUoKTsKLQkJaGFuZGxlci5mY2hhbmdlTGlzdGVuZXIuYWRkKGNoYW5nZUxpc3RlbmVyKTsKLQkJcmV0dXJuIGhhbmRsZXI7Ci0JfQotCXByaXZhdGUgY2xhc3MgTW9kZWxJcnJpdGFudFRocmVhZCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJc2lnbmFsQWxsRGlydHlNb2RlbCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzaWduYWxBbGxEaXJ0eU1vZGVsKCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmY2hhbmdlTGlzdGVuZXIuc2l6ZSgpOyBpKyspIHsKLQkJCQkoKElXZWJSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcikgZmNoYW5nZUxpc3RlbmVyLmdldChpKSkucmVzb3VyY2VDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlpZiAoIVdlYlJlc291cmNlQ2hhbmdlSGFuZGxlci5TSUdOQUxfTU9ERUwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQkJT2JqZWN0IG1vZGVsUmVmID0gZ2V0TW9kZWwoKTsKLQkJCWlmIChtb2RlbFJlZiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdHJ5IHsKLS8vIGZvcihpbnQgaSA9MDtpPGZjaGFuZ2VMaXN0ZW5lci5zaXplKCk7aSsrKSB7Ci0vLyAoKElXZWJSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcilmY2hhbmdlTGlzdGVuZXIuZ2V0KGkpKS5yZXNvdXJjZUNoYW5nZWQoKTsKLS8vIH0KLQkJCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoKChJU3RydWN0dXJlZE1vZGVsKSBtb2RlbFJlZikuZ2V0QmFzZUxvY2F0aW9uKCkpOwotCQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0geG1sTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCXhtbE1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJCQkvLyB4bWxNb2RlbC5zZXRSZWluaXRpYWxpemVOZWVkZWQodHJ1ZSk7Ci0JCQkJCS8vIChkb2MpLnJlcGxhY2UoMCwgZG9jLmdldExlbmd0aCgpLGRvYy5nZXQoKSk7Ci0JCQkJCXhtbE1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VzLmdldFN0cmluZygiV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLjAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQkJeG1sTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgQXJyYXlMaXN0IGZjaGFuZ2VMaXN0ZW5lciA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIE1vZGVsSXJyaXRhbnRUaHJlYWQgaXJyaXRhdG9yOwotCQotCXByaXZhdGUgV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyKCkge30KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIjZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkge30KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIjZG9jdW1lbnRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotLy8JCWlmIChXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuQ0hFQ0tfSU5UUkVTVF9MRVZFTCkgewotLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IGZjaGFuZ2VMaXN0ZW5lci5zaXplKCk7IGkrKykgewotLy8JCQkJT2JqZWN0IG8gPSBmY2hhbmdlTGlzdGVuZXIuZ2V0KGkpOwotLy8JCQkJaWYgKG8gaW5zdGFuY2VvZiBJV2ViRG9jdW1lbnRDaGFuZ2VMaXN0ZW5lcikgewotLy8JCQkJCWludCBpbnRyZXN0ID0gKChJV2ViRG9jdW1lbnRDaGFuZ2VMaXN0ZW5lcikgbykuZ2V0SW50cmVzdExldmVsQXRPZmZzZXQoZXZlbnQuZk9mZnNldCk7Ci0vLwkJCQkJc3dpdGNoIChpbnRyZXN0KSB7Ci0vLwkJCQkJCWNhc2UgSVdlYkRvY3VtZW50Q2hhbmdlTGlzdGVuZXIuRElSVFlfTU9ERUw6Ci0vLwkJCQkJCQlpcnJpdGF0b3Iuc2lnbmFsQWxsRGlydHlNb2RlbCgpOwotLy8JCQkJCQkJcmV0dXJuOwotLy8JCQkJCQljYXNlIElXZWJEb2N1bWVudENoYW5nZUxpc3RlbmVyLkRJUlRZX0RPQzoKLS8vCQkJCQkJCSgoSVdlYkRvY3VtZW50Q2hhbmdlTGlzdGVuZXIpIG8pLnJlc291cmNlQ2hhbmdlZCgpOwotLy8JCQkJCQlicmVhazsKLS8vCQkJCQl9Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfSBlbHNlIHsKLQkJCWlycml0YXRvci5zaWduYWxBbGxEaXJ0eU1vZGVsKCk7Ci0JCS8vfQotCX0KLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIChvIGluc3RhbmNlb2YgV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyICYmICgoV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyKSBvKS5mY2hhbmdlTGlzdGVuZXIgPT0gdGhpcy5mY2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBmaW5hbGl6ZSgpIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWlmIChXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuaW5zdGFuY2VzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlPYmplY3QgbyA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAoV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmluc3RhbmNlcykgewotCQkJbyA9IFdlYlJlc291cmNlQ2hhbmdlSGFuZGxlci5pbnN0YW5jZXMuZ2V0KHRoaXMpOwotCQkJV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmluc3RhbmNlcy5yZW1vdmUodGhpcyk7Ci0JCX0KLQkJaWYgKG8gIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBmWE1MTW9kZWwgPSAoSVN0cnVjdHVyZWRNb2RlbCkgbzsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZkpzcERvY3VtZW50ID0gZlhNTE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKGZKc3BEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJZkpzcERvY3VtZW50LnJlbW92ZURvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsKCkgewotCQlpZiAoV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmluc3RhbmNlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKElTdHJ1Y3R1cmVkTW9kZWwpIFdlYlJlc291cmNlQ2hhbmdlSGFuZGxlci5pbnN0YW5jZXMuZ2V0KHRoaXMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCB4bWxNb2RlbCA9IGdldE1vZGVsKCk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQkJeG1sTW9kZWwuYWRkTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcih0aGlzKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBmSnNwRG9jdW1lbnQgPSB4bWxNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKGZKc3BEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlmSnNwRG9jdW1lbnQuYWRkRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlpcnJpdGF0b3IgPSBuZXcgTW9kZWxJcnJpdGFudFRocmVhZCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcm9jZXNzUG9zdE1vZGVsRXZlbnQoTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCkgewotCQlpZiAoaXJyaXRhdG9yICE9IG51bGwpIHsKLQkJCWlycml0YXRvci5zaWduYWxBbGxEaXJ0eU1vZGVsKCk7Ci0JCX0KLQkJaWYgKFdlYlJlc291cmNlQ2hhbmdlSGFuZGxlci5pbnN0YW5jZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChldmVudC5nZXRUeXBlKCkgPT0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9SRUxFQVNFRCkgewotCQkJc3luY2hyb25pemVkIChXZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuaW5zdGFuY2VzKSB7Ci0JCQkJV2ViUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmluc3RhbmNlcy5yZW1vdmUodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcHJvY2Vzc1ByZU1vZGVsRXZlbnQoTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCkge30KLQkKLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKGlycml0YXRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2YmY1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1XZWJSZXNvdXJjZUNoYW5nZUhhbmRsZXIuMD1FcnJvciB3aGVuIHVwZGF0aW5nIHRoZSBtb2RlbC4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvSnNOYXR1cmVJbnN0YWxsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvSnNOYXR1cmVJbnN0YWxsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZlNWNhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L0pzTmF0dXJlSW5zdGFsbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkpzQ29yZVBsdWdpbjsKLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzTmF0dXJlSW5zdGFsbGVyIGltcGxlbWVudHMgSURlbGVnYXRlIHsKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBPYmplY3QgY29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQkJbW9uaXRvci5iZWdpblRhc2soIkluc3RhbGxpbmcgRmFjZXQgZm9yIEphdmFTY3JpcHQgRGV2ZWxvcG1lbnQgVG9vbHMiICsgIi4iLCAxMDApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdHJ5IHsKLQkJCWluc3RhbGxOYXR1cmUocHJvamVjdCwgbW9uaXRvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbnN0YWxsTmF0dXJlKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5nZXRTdHJpbmcoIkpzTmF0dXJlSW5zdGFsbGVyLjEiKSwgMTAwKTsgLy8kTk9OLU5MUy0xJAotCQltb25pdG9yLnN1YlRhc2soTWVzc2FnZXMuZ2V0U3RyaW5nKCJKc05hdHVyZUluc3RhbGxlci4yIikpOyAvLyROT04tTkxTLTEkCi0JCVN1YlByb2dyZXNzTW9uaXRvciBzdWIgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDI1KTsKLQkJdHJ5IHsKLQkJCW1vbml0b3Iud29ya2VkKDIwKTsKLQkJCUpzV2ViTmF0dXJlIGpzTmF0dXJlID0gbmV3IEpzV2ViTmF0dXJlKHByb2plY3QsIG1vbml0b3IpOwotCQkJbW9uaXRvci53b3JrZWQoMjApOwotCQkJanNOYXR1cmUuY29uZmlndXJlKCk7Ci0JCQltb25pdG9yLndvcmtlZCg0MCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpzQ29yZVBsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuT0ssIE1lc3NhZ2VzLmdldFN0cmluZygiSnNOYXR1cmVJbnN0YWxsZXIuMyIpLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvSnNOYXR1cmVVbmluc3RhbGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Kc05hdHVyZVVuaW5zdGFsbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MTExY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Kc05hdHVyZVVuaW5zdGFsbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkpzQ29yZVBsdWdpbjsKLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzTmF0dXJlVW5pbnN0YWxsZXIgaW1wbGVtZW50cyBJRGVsZWdhdGUgewotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2plY3QgcHJvamVjdCwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIE9iamVjdCBjb25maWcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9uaXRvciA9PSBudWxsKSB7Ci0JCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQltb25pdG9yLmJlZ2luVGFzaygiVW5pbnN0YWxsaW5nIEZhY2V0IGZvciBKYXZhU2NyaXB0IERldmVsb3BtZW50IFRvb2xzIiArICIuIiwgMTAwKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRyeSB7Ci0JCQl1bmluc3RhbGxOYXR1cmUocHJvamVjdCwgbW9uaXRvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB1bmluc3RhbGxOYXR1cmUoSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLmdldFN0cmluZygiSnNOYXR1cmVVbmluc3RhbGxlci4xIiksIDEwMCk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gYnkgdXNpbmcgbmF0dXJlcyB3ZSBjYW4gbGV2ZXJhZ2UgdGhlIHByZWNvbmRpdGlvbiBzdXBwb3J0Ci0JCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5nZXRTdHJpbmcoIkpzTmF0dXJlVW5pbnN0YWxsZXIuMiIpKTsgLy8kTk9OLU5MUy0xJAotCQlTdWJQcm9ncmVzc01vbml0b3Igc3ViID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAyNSk7Ci0JCWlmICghSnNXZWJOYXR1cmUuaGFzTmF0dXJlKHByb2plY3QpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCUlQcm9qZWN0TmF0dXJlIGpzTmF0dXJlID0gbmV3IEpzV2ViTmF0dXJlKHByb2plY3QsIG1vbml0b3IpOwotCQkJbW9uaXRvci53b3JrZWQoMjApOwotCQkJbW9uaXRvci53b3JrZWQoNTApOwotCQkJanNOYXR1cmUuZGVjb25maWd1cmUoKTsKLQkJCW1vbml0b3Iud29ya2VkKDIwKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpzQ29yZVBsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuT0ssIE1lc3NhZ2VzLmdldFN0cmluZygiSnNOYXR1cmVVbmluc3RhbGxlci4zIiksIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Kc1dlYk5hdHVyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9Kc1dlYk5hdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDc4Y2I2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvSnNXZWJOYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb2plY3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0TmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUFjY2Vzc1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSW5jbHVkZVBhdGhBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSW5jbHVkZVBhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkphdmFTY3JpcHRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuTGlicmFyeVN1cGVyVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUuSmF2YVByb2plY3Q7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5QcmVmZXJlbmNlQ29uc3RhbnRzOwotLyoqCi0qCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSnNXZWJOYXR1cmUgaW1wbGVtZW50cyBJUHJvamVjdE5hdHVyZSB7Ci0JLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRU5BTUVfQ0xBU1NQQVRIID0gIi5jbGFzc3BhdGgiOyAvLyROT04tTkxTLTEkCi0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVFVSRV9JRFNbXSA9Ci0JLy8geyJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5lbWJlZGVkLmpzTmF0dXJlIixKYXZhU2NyaXB0Q29yZS5OQVRVUkVfSUR9OwotCS8vIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUVVJFX0lEU1tdID0geyBKYXZhU2NyaXB0Q29yZS5OQVRVUkVfSUQgfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggVklSVFVBTF9CUk9XU0VSX0NMQVNTUEFUSCA9IG5ldyBQYXRoKCJvcmcuZWNsaXBzZS53c3QuanNkdC5sYXVuY2hpbmcuYmFzZUJyb3dzZXJMaWJyYXJ5Iik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0NPTlRBSU5FUiA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC5sYXVuY2hpbmcuV2ViUHJvamVjdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElJbmNsdWRlUGF0aEVudHJ5IFZJUlRVQUxfU0NPUEVfRU5UUlkgPSBKYXZhU2NyaXB0Q29yZS5uZXdDb250YWluZXJFbnRyeShuZXcgUGF0aChWSVJUVUFMX0NPTlRBSU5FUiksICBuZXcgSUFjY2Vzc1J1bGVbMF0sIG5ldyBJSW5jbHVkZVBhdGhBdHRyaWJ1dGVbXSB7SUluY2x1ZGVQYXRoQXR0cmlidXRlLkhJREV9LCBmYWxzZSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUEVSX1RZUEVfTkFNRSA9ICJXaW5kb3ciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUEVSX1RZUEVfTElCUkFSWSA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC5sYXVuY2hpbmcuYmFzZUJyb3dzZXJMaWJyYXJ5IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qIERlZmF1bHQgSlJFIGVudHJ5ICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfSlJFX1BBVEggPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEpzTmF0dXJlKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9uaXRvciAhPSBudWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJfQotCQlpZiAoIUpzV2ViTmF0dXJlLmhhc05hdHVyZShwcm9qZWN0KSkgewotCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCVN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCQlTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1twcmV2TmF0dXJlcy5sZW5ndGggKyBKc1dlYk5hdHVyZS5OQVRVUkVfSURTLmxlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHByZXZOYXR1cmVzLCAwLCBuZXdOYXR1cmVzLCAwLCBwcmV2TmF0dXJlcy5sZW5ndGgpOwotCQkJLy8gbmV3TmF0dXJlc1twcmV2TmF0dXJlcy5sZW5ndGhdID0gSmF2YVNjcmlwdENvcmUuTkFUVVJFX0lEOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBKc1dlYk5hdHVyZS5OQVRVUkVfSURTLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbmV3TmF0dXJlc1twcmV2TmF0dXJlcy5sZW5ndGggKyBpXSA9IEpzV2ViTmF0dXJlLk5BVFVSRV9JRFNbaV07Ci0JCQl9Ci0JCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0JCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBtb25pdG9yKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzTmF0dXJlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgSnNXZWJOYXR1cmUuTkFUVVJFX0lEUy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghcHJvamVjdC5oYXNOYXR1cmUoSnNXZWJOYXR1cmUuTkFUVVJFX0lEU1tpXSkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlSnNOYXR1cmUoSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmIChKc1dlYk5hdHVyZS5oYXNOYXR1cmUocHJvamVjdCkpIHsKLQkJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCQlTdHJpbmdbXSBwcmV2TmF0dXJlcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQkJU3RyaW5nW10gbmV3TmF0dXJlcyA9IG5ldyBTdHJpbmdbcHJldk5hdHVyZXMubGVuZ3RoIC0gSnNXZWJOYXR1cmUuTkFUVVJFX0lEUy5sZW5ndGhdOwotCQkJaW50IGsgPSAwOwotCQkJaGVhZDogZm9yIChpbnQgaSA9IDA7IGkgPCBwcmV2TmF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgSnNXZWJOYXR1cmUuTkFUVVJFX0lEUy5sZW5ndGg7IGorKykgewotCQkJCQlpZiAocHJldk5hdHVyZXNbaV0gPT0gSnNXZWJOYXR1cmUuTkFUVVJFX0lEU1tqXSkgewotCQkJCQkJY29udGludWUgaGVhZDsKLQkJCQkJfQotCQkJCX0KLQkJCQluZXdOYXR1cmVzW2srK10gPSBwcmV2TmF0dXJlc1tpXTsKLQkJCX0KLQkJCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG1vbml0b3IpOwotCQl9IGVsc2UgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgVmVjdG9yIGNsYXNzUGF0aEVudHJpZXMgPSBuZXcgVmVjdG9yKCk7Ci0JcHJpdmF0ZSBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHJpdmF0ZSBJUHJvamVjdCBmQ3VyclByb2plY3Q7Ci0JcHJpdmF0ZSBKYXZhUHJvamVjdCBmSmF2YVByb2plY3Q7Ci0JcHJpdmF0ZSBJUGF0aCBmT3V0cHV0TG9jYXRpb247Ci0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0JCi0JcHVibGljIEpzV2ViTmF0dXJlKCkgewotCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQl9Ci0JCi0JcHVibGljIEpzV2ViTmF0dXJlKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmQ3VyclByb2plY3QgPSBwcm9qZWN0OwotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwotCQl9IGVsc2UgewotCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgY29uZmlndXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWluaXRPdXRwdXRQYXRoKCk7Ci0JCWNyZWF0ZVNvdXJjZUNsYXNzUGF0aCgpOwotCQlpbml0SlJFRW50cnkoKTsKLQkJaW5pdExvY2FsQ2xhc3NQYXRoKCk7Ci0JCQotCQlpZiAoaGFzUHJvamVjdENsYXNzUGF0aEZpbGUoKSkgewotCQkJSUluY2x1ZGVQYXRoRW50cnlbXSBlbnRyaWVzID0gZ2V0UmF3Q2xhc3NQYXRoKCk7Ci0JCQlpZiAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoID4gMCkgewotCQkJCWNsYXNzUGF0aEVudHJpZXMucmVtb3ZlQWxsKEFycmF5cy5hc0xpc3QoZW50cmllcykpOwotCQkJCWNsYXNzUGF0aEVudHJpZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZW50cmllcykpOwotCQkJfQotCQl9Ci0JCQotCQlKc1dlYk5hdHVyZS5hZGRKc05hdHVyZShmQ3VyclByb2plY3QsIG1vbml0b3IpOwotCQlmSmF2YVByb2plY3QgPSAoSmF2YVByb2plY3QpIEphdmFTY3JpcHRDb3JlLmNyZWF0ZShmQ3VyclByb2plY3QpOwotCQlmSmF2YVByb2plY3Quc2V0UHJvamVjdChmQ3VyclByb2plY3QpOwotCQl0cnkgewotCQkJLy8gLCBmT3V0cHV0TG9jYXRpb24KLQkJCWlmICghaGFzUHJvamVjdENsYXNzUGF0aEZpbGUoKSkgewotCQkJCWZKYXZhUHJvamVjdC5zZXRSYXdJbmNsdWRlcGF0aCgoSUluY2x1ZGVQYXRoRW50cnlbXSkgY2xhc3NQYXRoRW50cmllcy50b0FycmF5KG5ldyBJSW5jbHVkZVBhdGhFbnRyeVtdIHt9KSwgZk91dHB1dExvY2F0aW9uLCBtb25pdG9yKTsKLQkJCX1lbHNlewotCQkJCWZKYXZhUHJvamVjdC5zZXRSYXdJbmNsdWRlcGF0aCgoSUluY2x1ZGVQYXRoRW50cnlbXSkgY2xhc3NQYXRoRW50cmllcy50b0FycmF5KG5ldyBJSW5jbHVkZVBhdGhFbnRyeVtdIHt9KSwgbW9uaXRvcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCX0KLQkJTGlicmFyeVN1cGVyVHlwZSBzdXBlclR5cGUgPSBuZXcgTGlicmFyeVN1cGVyVHlwZShuZXcgUGF0aCggU1VQRVJfVFlQRV9MSUJSQVJZKSwgIGdldEphdmFQcm9qZWN0KCksIFNVUEVSX1RZUEVfTkFNRSk7Ci0JCWdldEphdmFQcm9qZWN0KCkuc2V0Q29tbW9uU3VwZXJUeXBlKHN1cGVyVHlwZSk7Ci0JCS8vIGdldEphdmFQcm9qZWN0KCkuYWRkVG9CdWlsZFNwZWMoQlVJTERFUl9JRCk7Ci0JCWZDdXJyUHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBtb25pdG9yKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNvdXJjZUNsYXNzUGF0aCgpIHsKLQkJaWYgKGhhc0FWYWxpZFNvdXJjZVBhdGgoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIElQYXRoIHByb2plY3RQYXRoID0gZkN1cnJQcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JCS8vIGNsYXNzUGF0aEVudHJpZXMuYWRkKEphdmFTY3JpcHRDb3JlLm5ld1NvdXJjZUVudHJ5KHByb2plY3RQYXRoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRlY29uZmlndXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlWZWN0b3IgYmFkRW50cmllcyA9IG5ldyBWZWN0b3IoKTsKLQkJSUluY2x1ZGVQYXRoRW50cnkgZGVmYXVsdEpSRUxpYnJhcnkgPSAgZ2V0SnJlRW50cnkoKTsKLQkJSUluY2x1ZGVQYXRoRW50cnlbXSBsb2NhbEVudHJpZXMgPSBpbml0TG9jYWxDbGFzc1BhdGgoKTsKLQkJYmFkRW50cmllcy5hZGQoZGVmYXVsdEpSRUxpYnJhcnkpOwotCQliYWRFbnRyaWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGxvY2FsRW50cmllcykpOwotCQlJSW5jbHVkZVBhdGhFbnRyeVtdIGVudHJpZXMgPSBnZXRSYXdDbGFzc1BhdGgoKTsKLQkJVmVjdG9yIGdvb2RFbnRyaWVzID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghYmFkRW50cmllcy5jb250YWlucyhlbnRyaWVzW2ldKSkgewotCQkJCWdvb2RFbnRyaWVzLmFkZChlbnRyaWVzW2ldKTsKLQkJCX0KLQkJfQotCQkvLyBnZXRKYXZhUHJvamVjdCgpLnJlbW92ZUZyb21CdWlsZFNwZWMoQlVJTERFUl9JRCk7Ci0JCUlQYXRoIG91dHB1dExvY2F0aW9uID0gZ2V0SmF2YVByb2plY3QoKS5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQlnZXRKYXZhUHJvamVjdCgpLnNldFJhd0luY2x1ZGVwYXRoKChJSW5jbHVkZVBhdGhFbnRyeVtdKSBnb29kRW50cmllcy50b0FycmF5KG5ldyBJSW5jbHVkZVBhdGhFbnRyeVtdIHt9KSwgb3V0cHV0TG9jYXRpb24sIG1vbml0b3IpOwotCQlnZXRKYXZhUHJvamVjdCgpLmRlY29uZmlndXJlKCk7Ci0JCUpzV2ViTmF0dXJlLnJlbW92ZUpzTmF0dXJlKGZDdXJyUHJvamVjdCwgbW9uaXRvcik7Ci0JCWZDdXJyUHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBtb25pdG9yKTsKLQl9Ci0JCi0JcHVibGljIEphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlpZiAoZkphdmFQcm9qZWN0ID09IG51bGwpIHsKLQkJCWZKYXZhUHJvamVjdCA9IChKYXZhUHJvamVjdCkgSmF2YVNjcmlwdENvcmUuY3JlYXRlKGZDdXJyUHJvamVjdCk7Ci0JCQlmSmF2YVByb2plY3Quc2V0UHJvamVjdChmQ3VyclByb2plY3QpOwotCQl9Ci0JCXJldHVybiBmSmF2YVByb2plY3Q7Ci0JfQotCQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5mQ3VyclByb2plY3Q7Ci0JfQotCQotCXByaXZhdGUgSUluY2x1ZGVQYXRoRW50cnlbXSBnZXRSYXdDbGFzc1BhdGgoKSB7Ci0JCUphdmFQcm9qZWN0IHByb2ogPSBuZXcgSmF2YVByb2plY3QoKTsKLQkJcHJvai5zZXRQcm9qZWN0KGZDdXJyUHJvamVjdCk7Ci0JCXJldHVybiBwcm9qLnJlYWRSYXdJbmNsdWRlcGF0aCgpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaGFzQVZhbGlkU291cmNlUGF0aCgpIHsKLQkJaWYgKGhhc1Byb2plY3RDbGFzc1BhdGhGaWxlKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSUluY2x1ZGVQYXRoRW50cnlbXSBlbnRyaWVzID0gZ2V0UmF3Q2xhc3NQYXRoKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChlbnRyaWVzW2ldLmdldEVudHJ5S2luZCgpID09IElJbmNsdWRlUGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VzLmdldFN0cmluZygiSnNXZWJOYXR1cmUuNSIpICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaGFzUHJvamVjdENsYXNzUGF0aEZpbGUoKSB7Ci0JCWlmIChmQ3VyclByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBmQ3VyclByb2plY3QuZ2V0Rm9sZGVyKEphdmFQcm9qZWN0LkRFRkFVTFRfUFJFRkVSRU5DRVNfRElSTkFNRSkuZ2V0RmlsZShKYXZhUHJvamVjdC5DTEFTU1BBVEhfRklMRU5BTUUpLmV4aXN0cygpOwotCX0KLQkKLQlwcml2YXRlIElJbmNsdWRlUGF0aEVudHJ5IGdldEpyZUVudHJ5KCkgewotCQlyZXR1cm4gSmF2YVNjcmlwdENvcmUubmV3Q29udGFpbmVyRW50cnkobmV3IFBhdGgoREVGQVVMVF9KUkVfUEFUSCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdEpSRUVudHJ5KCkgewotCQlJSW5jbHVkZVBhdGhFbnRyeSBkZWZhdWx0SlJFTGlicmFyeSA9ICBnZXRKcmVFbnRyeSgpOwotCQl0cnkgewotCQkJSUluY2x1ZGVQYXRoRW50cnlbXSBlbnRyaWVzID0gZ2V0UmF3Q2xhc3NQYXRoKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZW50cmllc1tpXSA9PSBkZWZhdWx0SlJFTGlicmFyeSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJY2xhc3NQYXRoRW50cmllcy5hZGQoZGVmYXVsdEpSRUxpYnJhcnkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VzLmdldFN0cmluZygiSnNXZWJOYXR1cmUuNiIpICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIElJbmNsdWRlUGF0aEVudHJ5W10gaW5pdExvY2FsQ2xhc3NQYXRoKCkgewotCQkKLQkJY2xhc3NQYXRoRW50cmllcy5hZGQoSnNXZWJOYXR1cmUuVklSVFVBTF9TQ09QRV9FTlRSWSk7Ci0JCUlJbmNsdWRlUGF0aEVudHJ5IGJyb3dzZXJMaWJyYXJ5ID0gSmF2YVNjcmlwdENvcmUubmV3Q29udGFpbmVyRW50cnkoIFZJUlRVQUxfQlJPV1NFUl9DTEFTU1BBVEgpOwotCQljbGFzc1BhdGhFbnRyaWVzLmFkZChicm93c2VyTGlicmFyeSk7Ci0JCS8vSVBhdGggd2ViUm9vdCA9IFdlYlJvb3RGaW5kZXIuZ2V0V2ViQ29udGVudEZvbGRlcihmQ3VyclByb2plY3QpOwotCS8vCUlJbmNsdWRlUGF0aEVudHJ5IHNvdXJjZSA9IEphdmFTY3JpcHRDb3JlLm5ld1NvdXJjZUVudHJ5KGZDdXJyUHJvamVjdC5nZXRGdWxsUGF0aCgpLmFwcGVuZCh3ZWJSb290KS5hcHBlbmQoIi8iKSk7Ci0JLy8JY2xhc3NQYXRoRW50cmllcy5hZGQoc291cmNlKTsKLQkJcmV0dXJuIG5ldyBJSW5jbHVkZVBhdGhFbnRyeVtdIHsgSnNXZWJOYXR1cmUuVklSVFVBTF9TQ09QRV9FTlRSWSAsIGJyb3dzZXJMaWJyYXJ5Lyosc291cmNlKi99OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdE91dHB1dFBhdGgoKSB7Ci0JCWlmIChmT3V0cHV0TG9jYXRpb24gPT0gbnVsbCkgewotCQkJZk91dHB1dExvY2F0aW9uID0gZkN1cnJQcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMuZkN1cnJQcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMjY5N2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0OwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdC5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9XZWJQcm9qZWN0SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YzQ5NjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvamVjdC9XZWJQcm9qZWN0SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0OwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUluY2x1ZGVQYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSnNHbG9iYWxTY29wZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmNvbXBpbGVyLmxpYnJhcmllcy5MaWJyYXJ5TG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc05hbWVNYW5nbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LldlYlJvb3RGaW5kZXI7Ci0KLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIFdlYlByb2plY3RKc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIgZXh0ZW5kcyBKc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIgIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEFJTkVSX0RFU0NSSVBUSU9OID0gTWVzc2FnZXMuZ2V0U3RyaW5nKCJXZWJQcm9qZWN0SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyLjAiKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIExJQl9OQU1FID0geydiJywncicsJ28nLCd3JywncycsJ2UnLCdyJywnVycsJ2knLCduJywnZCcsJ28nLCd3JywnLicsJ2onLCdzJ307Ci0JLyogU29tZSB0b2tlbnMgZm9yIHVzIHRvIGlkZW50aWZ5IG1hbmdsZWQgcGF0aHMgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOR0xFRF9CVVRUMSA9ICJodG0iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTkdMRURfQlVUVDIgPSAiLmpzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vcHJpdmF0ZSBJSmF2YVNjcmlwdFByb2plY3QgamF2YVByb2plY3Q7Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFVubWFuZ2VkSHRtbFBhdGgoU3RyaW5nIGNvbnRhaW5lclBhdGhTdHJpbmcpIHsKLQkJaWYgKGNvbnRhaW5lclBhdGhTdHJpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKGNvbnRhaW5lclBhdGhTdHJpbmcudG9Mb3dlckNhc2UoKS5pbmRleE9mKFdlYlByb2plY3RKc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIuTUFOR0xFRF9CVVRUMSkgIT0gLTEgJiYgY29udGFpbmVyUGF0aFN0cmluZy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplci5NQU5HTEVEX0JVVFQyKSAhPSAtMSkgewotCQkJcmV0dXJuIEpzTmFtZU1hbmdsZXJVdGlsLnVubWFuZ2xlKGNvbnRhaW5lclBhdGhTdHJpbmcpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgTGlicmFyeUxvY2F0aW9uIGdldExpYnJhcnlMb2NhdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5Kc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIjY2FuVXBkYXRlSnNHbG9iYWxTY29wZUNvbnRhaW5lcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0UHJvamVjdCkKLQkgKi8KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5VcGRhdGVKc0dsb2JhbFNjb3BlQ29udGFpbmVyKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhU2NyaXB0UHJvamVjdCBwcm9qZWN0KSB7Ci0JCS8qIGRvbnQgcmVtb3ZlIGZyb20gdGhpcyBwcm9qZWN0ICovCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIElKc0dsb2JhbFNjb3BlQ29udGFpbmVyIGdldENvbnRhaW5lcihJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVNjcmlwdFByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIFdlYlByb2plY3RKc0dsb2JhbFNjb3BlQ29udGFpbmVySW5pdGlhbGl6ZXIuQ09OVEFJTkVSX0RFU0NSSVBUSU9OOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyI2dldERlc2NyaXB0aW9uKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRQcm9qZWN0KQotCSAqLwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFTY3JpcHRQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCWlmIChjb250YWluZXJQYXRoLmVxdWFscyhuZXcgUGF0aChKc1dlYk5hdHVyZS5WSVJUVUFMX0NPTlRBSU5FUikpKSB7Ci0JCQlyZXR1cm4gV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplci5DT05UQUlORVJfREVTQ1JJUFRJT047Ci0JCX0KLQkJCi0JCVN0cmluZyBjb250YWluZXJQYXRoU3RyaW5nID0gY29udGFpbmVyUGF0aC50b1N0cmluZygpOwotCQlJUGF0aCB3ZWJDb250ZXh0ID0gZ2V0V2ViQ29udGV4dFJvb3QoamF2YVByb2plY3QpOwotCQlTdHJpbmcgZmlsZUV4dGVuc2lvbiA9IGNvbnRhaW5lclBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOwotCQlpZihjb250YWluZXJQYXRoLmVxdWFscyhnZXRXZWJDb250ZXh0Um9vdChqYXZhUHJvamVjdCkpIHx8IChmaWxlRXh0ZW5zaW9uIT1udWxsICYmIGZpbGVFeHRlbnNpb24uZXF1YWxzKCJqcyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gd2ViQ29udGV4dC50b1N0cmluZygpOwotCQl9Ci0JCVN0cmluZyB1bm1hbmdsZWQgPSBXZWJQcm9qZWN0SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyLmdldFVubWFuZ2VkSHRtbFBhdGgoY29udGFpbmVyUGF0aFN0cmluZyk7Ci0JCWlmICh1bm1hbmdsZWQgIT0gbnVsbCkgewotCQkJSVBhdGggcHJvamVjdFBhdGggPSBqYXZhUHJvamVjdC5nZXRQYXRoKCk7Ci0JCQkvKiBSZXBsYWNlIHRoZSBwcm9qZWN0IHBhdGggd2l0aCB0aGUgcHJvamVjdCBuYW1lICovCi0JCQlpZiAodW5tYW5nbGVkLmluZGV4T2YocHJvamVjdFBhdGgudG9TdHJpbmcoKSkgPj0gMCkgewotCQkJCXVubWFuZ2xlZCA9IGphdmFQcm9qZWN0LmdldERpc3BsYXlOYW1lKCkgKyAiOiIgKyB1bm1hbmdsZWQuc3Vic3RyaW5nKHByb2plY3RQYXRoLnRvU3RyaW5nKCkubGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gdW5tYW5nbGVkOwotCQl9Ci0JCXJldHVybiBjb250YWluZXJQYXRoU3RyaW5nOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyI2dldEhvc3RQYXRoKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKLQkgKi8KLQkKLQlwdWJsaWMgVVJJIGdldEhvc3RQYXRoKElQYXRoIHBhdGgsIElKYXZhU2NyaXB0UHJvamVjdCBwcm9qZWN0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3RyaW5nIGh0bWxQYXRoID0gV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplci5nZXRVbm1hbmdlZEh0bWxQYXRoKHBhdGgudG9TdHJpbmcoKSk7Ci0JCWlmIChodG1sUGF0aCAhPSBudWxsKSB7Ci0JCQlVUkkgZmlsZVVyaSA9ICBuZXcgUGF0aChodG1sUGF0aCkudG9GaWxlKCkudG9VUkkoKTsKLQkJCXJldHVybiBmaWxlVXJpOwotCQkJLy8JCQl0cnkgewotLy8JCQkJcmV0dXJuIG5ldyBVUkkoaHRtbFBhdGgpOwotLy8JCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZXgpIHsKLS8vCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotLy8JCQl9Ci0JCX0KLS8vCQllbHNlIHsKLS8vCQkJdHJ5IHsKLS8vCQkJCXJldHVybiBuZXcgVVJJKHBhdGgudG9TdHJpbmcoKSk7Ci0vLwkJCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBleCkgewotLy8JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotLy8JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJCX0KLS8vCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQlwdWJsaWMgaW50IGdldEtpbmQoKSB7Ci0JCXJldHVybiBJSnNHbG9iYWxTY29wZUNvbnRhaW5lci5LX1NZU1RFTTsKLQl9Ci0JCi0JCi0JcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0JCXJldHVybiBuZXcgUGF0aChKc1dlYk5hdHVyZS5WSVJUVUFMX0NPTlRBSU5FUik7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0SW5jbHVkZXBhdGhFbnRyaWVzKCl9IGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgSUluY2x1ZGVQYXRoRW50cnlbXSBnZXRDbGFzc3BhdGhFbnRyaWVzKCkgewotCQlyZXR1cm4gZ2V0SW5jbHVkZXBhdGhFbnRyaWVzKCk7Ci0JfQotCXB1YmxpYyBJSW5jbHVkZVBhdGhFbnRyeVtdIGdldEluY2x1ZGVwYXRoRW50cmllcygpIHsKLQkJCi0JCS8vSUluY2x1ZGVQYXRoRW50cnkgZW50cnk9bnVsbDsKLQkJCi0JcmV0dXJuIG5ldyBJSW5jbHVkZVBhdGhFbnRyeVswXTsKLS8vCQl0cnkgewotLy8JCQotLy8JCQkKLS8vCQkJCi0vLwkJCUlQYXRoIGNvbnRleHRQYXRoID0gZ2V0V2ViQ29udGV4dFJvb3QoamF2YVByb2plY3QpOwotLy8JCQkvL2VudHJ5ID1KYXZhU2NyaXB0Q29yZS5uZXdMaWJyYXJ5RW50cnkoY29udGV4dFBhdGgubWFrZUFic29sdXRlKCksIG51bGwsbnVsbCwgbmV3IElBY2Nlc3NSdWxlWzBdLCBuZXcgSUluY2x1ZGVQYXRoQXR0cmlidXRlWzBdLCB0cnVlKTsKLS8vCQkJLy9lbnRyeSA9SmF2YVNjcmlwdENvcmUubmV3TGlicmFyeUVudHJ5KGNvbnRleHRQYXRoLm1ha2VBYnNvbHV0ZSgpLCBudWxsLCBudWxsLCBuZXcgSUFjY2Vzc1J1bGVbMF0sIG5ldyBJSW5jbHVkZVBhdGhBdHRyaWJ1dGVbMF0sIHRydWUpOwotLy8JCQkvL2VudHJ5ID1KYXZhU2NyaXB0Q29yZS5uZXdTb3VyY2VFbnRyeShjb250ZXh0UGF0aC5tYWtlQWJzb2x1dGUoKSk7Ci0vLwkJCWVudHJ5ID0gbmV3IENsYXNzcGF0aEVudHJ5KAotLy8JCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFLAotLy8JCQkJCUlJbmNsdWRlUGF0aEVudHJ5LkNQRV9TT1VSQ0UsCi0vLwkJCQkJY29udGV4dFBhdGgubWFrZUFic29sdXRlKCksCi0vLwkJCQkJQ2xhc3NwYXRoRW50cnkuSU5DTFVERV9BTEwsIENsYXNzcGF0aEVudHJ5LkVYQ0xVREVfTk9ORSwKLS8vCQkJCQludWxsLCAvLyBzb3VyY2UgYXR0YWNobWVudAotLy8JCQkJCW51bGwsIC8vIHNvdXJjZSBhdHRhY2htZW50IHJvb3QKLS8vCQkJCQludWxsLCAvLyBjdXN0b20gb3V0cHV0IGxvY2F0aW9uCi0vLwkJCQkJZmFsc2UsCi0vLwkJCQkJbnVsbCwKLS8vCQkJCQlmYWxzZSwgLy8gbm8gYWNjZXNzIHJ1bGVzIHRvIGNvbWJpbmUKLS8vCQkJCQluZXcgSUluY2x1ZGVQYXRoQXR0cmlidXRlW10ge0NsYXNzcGF0aEVudHJ5LkVYQ0xVREVfVkFMSURBVEV9KTsgCi0vLwkJCQotLy8JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLS8vCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotLy8JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQl9Ci0vLwkJCi0vLwkJaWYoZW50cnkhPW51bGwpIHJldHVybiBuZXcgSUluY2x1ZGVQYXRoRW50cnlbXSB7ZW50cnl9OwotLy8JCXJldHVybiBuZXcgSUluY2x1ZGVQYXRoRW50cnlbMF07Ci0JfQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFTY3JpcHRQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy90aGlzLmphdmFQcm9qZWN0ID0gcHJvamVjdDsKLQkJc3VwZXIuaW5pdGlhbGl6ZShjb250YWluZXJQYXRoLCBwcm9qZWN0KTsKLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0V2ViQ29udGV4dFJvb3QoSUphdmFTY3JpcHRQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCVN0cmluZyB3ZWJSb290ID0gV2ViUm9vdEZpbmRlci5nZXRXZWJDb250ZW50Rm9sZGVyKGphdmFQcm9qZWN0LmdldFByb2plY3QoKSkudG9TdHJpbmcoKTsJCi0JCUlQYXRoIHdlYlJvb3RQYXRoID0gamF2YVByb2plY3QuZ2V0UGF0aCgpLmFwcGVuZCh3ZWJSb290KTsKLQkJcmV0dXJuIHdlYlJvb3RQYXRoOwotCX0KLQkKLS8vCXB1YmxpYyBJUGF0aFtdIGdldEFsbEh0bWxJblByb2plY3QoKSB7Ci0vLwkJZmluYWwgQXJyYXlMaXN0IGZvdW5kID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCVN0cmluZyB3ZWJSb290ID0gZ2V0V2ViQ29udGV4dFJvb3QoamF2YVByb2plY3QpLnRvU3RyaW5nKCk7CQotLy8JCQlJUmVzb3VyY2VQcm94eVZpc2l0b3IgdmlzaXRvciA9IG5ldyBJUmVzb3VyY2VQcm94eVZpc2l0b3IoKQotLy8JCQl7Ci0vLwkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdCggSVJlc291cmNlUHJveHkgcHJveHkgKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotLy8JCQkJewotLy8JCQkJCWlmICggcHJveHkuZ2V0TmFtZSgpLmVuZHNXaXRoKCAiLmh0bSIgKSApCi0vLwkJCQkJewotLy8JCQkJCQlJUGF0aCBwYXRoID0gcHJveHkucmVxdWVzdFJlc291cmNlKCkuZ2V0TG9jYXRpb24oKTsKLS8vCQkJCQkJZm91bmQuYWRkKHBhdGgpOwotLy8JCQkJCQkvL0lJbmNsdWRlUGF0aEVudHJ5IG5ld0xpYnJhcnlFbnRyeSA9IEphdmFTY3JpcHRDb3JlLm5ld0xpYnJhcnlFbnRyeSggcGF0aCxudWxsLCBudWxsLCBuZXcgSUFjY2Vzc1J1bGVbIDAgXSwgbmV3IElJbmNsdWRlUGF0aEF0dHJpYnV0ZVsgMCBdLCB0cnVlICk7Ci0vLwkJCQkJCS8vZW50cmllcy5hZGQoIG5ld0xpYnJhcnlFbnRyeSApOwotLy8JCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQkJfQotLy8JCQkJCQotLy8JCQkJCXJldHVybiB0cnVlOwotLy8JCQkJfQotLy8JCQl9OwotLy8JCQl0cnkKLS8vCQkJewotLy8JCQkJamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmZpbmRNZW1iZXIoIG5ldyBQYXRoKHdlYlJvb3QpICkuYWNjZXB0KCB2aXNpdG9yLCAwICk7Ci0vLwkJCX0KLS8vCQkJY2F0Y2ggKCBDb3JlRXhjZXB0aW9uIGUgKQotLy8JCQl7Ci0vLwkJCX0KLS8vCQkKLS8vCQkKLS8vCQlyZXR1cm4gKElQYXRoW10pZm91bmQudG9BcnJheShuZXcgSVBhdGhbZm91bmQuc2l6ZSgpXSk7Ci0vLwkKLS8vCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb2plY3QvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJiYzQwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm9qZWN0L21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotSnNOYXR1cmVVbmluc3RhbGxlci4xPVVuaW5zdGFsbGluZyBKYXZhU2NyaXB0IERldmVsb3BtZW50IFRvb2xzLi4uCi1Kc05hdHVyZVVuaW5zdGFsbGVyLjI9UmVtb3ZpbmcgSmF2YVNjcmlwdCBEZXZlbG9wbWVudCBUb29sa2luZyBOYXR1cmUuLi4KLUpzTmF0dXJlVW5pbnN0YWxsZXIuMz1FcnJvciBpbnN0YWxsaW5nIHJ1bnRpbWVcISBKYXZhU2NyaXB0IERldmVsb3BtZW50IFRvb2xzIGNvdWxkIG5vdCBiZSByZW1vdmVkLCBvciBpcyBub3QgcHJlc2VudCBpbiB0YXJnZXQgcHJvamVjdC4uCi1Kc05hdHVyZUluc3RhbGxlci4xPUluc3RhbGxpbmcgSmF2YVNjcmlwdCBEZXZlbG9wbWVudCBUb29scy4uLgotSnNOYXR1cmVJbnN0YWxsZXIuMj1BZGRpbmcgSmF2YVNjcmlwdCBEZXZlbG9wbWVudCBUb29sa2l0IE5hdHVyZS4uLgotSnNOYXR1cmVJbnN0YWxsZXIuMz1FcnJvciBpbnN0YWxsaW5nIHJ1bnRpbWVcISBKYXZhU2NyaXB0IERldmVsb3BtZW50IFRvb2xzIGNvdWxkIG5vdCBiZSBhZGRlZC4uCi1Kc1dlYk5hdHVyZS41PUVycm9yIGNoZWNraW5nIHNvdXJjZXBhdGg6Ci1Kc1dlYk5hdHVyZS42PUVycm9yIGNoZWNraW5nIHNvdXJjZXBhdGg6Ci1XZWJQcm9qZWN0SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyLjA9V2ViIFByb2plY3Qgc3VwcG9ydCBmb3IgSlNEVApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckVtYmVkZWRKcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckVtYmVkZWRKcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGY4NzM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JFbWJlZGVkSnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGU7Ci0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50VHlwZUlkRm9yRW1iZWRlZEpzIHsKLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkIGZpZWxkIG11c3QgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgaW4KLQkgKiBwbHVnaW4ueG1sIGZpbGUuIE5vdGU6IHRoaXMgdmFsdWUgaXMgaW50ZW50aWFsbHkgc2V0IHdpdGggZGVmYXVsdAotCSAqIHByb3RlY3RlZCBtZXRob2Qgc28gaXQgd2lsbCBub3QgYmUgaW5saW5lZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZ1tdIENvbnRlbnRUeXBlSWRzID0gQ29udGVudFR5cGVJZEZvckVtYmVkZWRKcy4gZ2V0SnNDb25zdGFudFN0cmluZygpOwotCi0Jc3RhdGljIFN0cmluZ1tdIGdldEpzQ29uc3RhbnRTdHJpbmcoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiLCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQkKLQlwcml2YXRlIENvbnRlbnRUeXBlSWRGb3JFbWJlZGVkSnMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjQ4Zjg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0lDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSUNvZGVkUmVzb3VyY2VQbHVnaW47Ci0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUCB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lIENPTlRFTlRfRkFNSUxZX0FUVFJJQlVURSA9IG5ldyBRdWFsaWZpZWROYW1lKElDb2RlZFJlc291cmNlUGx1Z2luLklELCAiY29udGVudEZhbWlseUF0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkOwotCS8qKgotCSAqIEV4dHJhIHByb3BlcnRpZXMgYXMgcGFydCBvZiBDb250ZW50RGVzY3JpcHRpb24sIGlmIHRoZSBjb250ZW50IGlzIEpTUC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWUgQ09OVEVOVF9UWVBFX0FUVFJJQlVURSA9IG5ldyBRdWFsaWZpZWROYW1lKElDb2RlZFJlc291cmNlUGx1Z2luLklELCAiY29udGVudFR5cGVBdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZSBMQU5HVUFHRV9BVFRSSUJVVEUgPSBuZXcgUXVhbGlmaWVkTmFtZShJQ29kZWRSZXNvdXJjZVBsdWdpbi5JRCwgImxhbmd1YWdlQXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSUpTUFBhcnRpdGlvblR5cGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lKU1BQYXJ0aXRpb25UeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmQ5ZjljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSUpTUFBhcnRpdGlvblR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGludGVyZmFjZSBJSlNQUGFydGl0aW9uVHlwZXMgewotCVN0cmluZyBKU1BfQ09NTUVOVCA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuSlNQX0NPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9DT05URU5UX0RFTElNSVRFUiA9IElKU1BQYXJ0aXRpb25UeXBlcy5KU1BfU0NSSVBUX1BSRUZJWCArICJERUxJTUlURVIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9DT05URU5UX0pBVkEgPSBJSlNQUGFydGl0aW9uVHlwZXMuSlNQX1NDUklQVF9QUkVGSVggKyAiSkFWQSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0NPTlRFTlRfSkFWQVNDUklQVCA9IElKU1BQYXJ0aXRpb25UeXBlcy5KU1BfU0NSSVBUX1BSRUZJWCArICJKQVZBU0NSSVBUIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuREVGQVVMVF9KU1AiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9ERUZBVUxUX0VMID0gSUpTUFBhcnRpdGlvblR5cGVzLkpTUF9TQ1JJUFRfUFJFRklYICsgIkpTUF9FTCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0RFRkFVTFRfRUwyID0gSUpTUFBhcnRpdGlvblR5cGVzLkpTUF9TQ1JJUFRfUFJFRklYICsgIkpTUF9FTDIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9ESVJFQ1RJVkUgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLkpTUF9ESVJFQ1RJVkUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9TQ1JJUFRfUFJFRklYID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5TQ1JJUFQuIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvdGFza3MvSnNGaWxlVGFza1NjYW5uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3Rhc2tzL0pzRmlsZVRhc2tTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZWFhMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvdGFza3MvSnNGaWxlVGFza1NjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwudGFza3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50YXNrcy5YTUxGaWxlVGFza1NjYW5uZXI7Ci0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc0ZpbGVUYXNrU2Nhbm5lciBleHRlbmRzIFhNTEZpbGVUYXNrU2Nhbm5lciB7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21tZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uKSB7Ci0JCXJldHVybiBzdXBlci5pc0NvbW1lbnRSZWdpb24ocmVnaW9uLCB0ZXh0UmVnaW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pzQmF0Y2hWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSnNCYXRjaFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTA2ZTQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSnNCYXRjaFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklJbmNsdWRlUGF0aEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklJbmNsdWRlUGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0TW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuSnNDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlByb2plY3RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVdvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLQotLyoqCi0gKiBQZXJmb3JtcyBKU1AgdmFsaWRhdGlvbiB0YXNrcyBmb3IgYmF0Y2ggdmFsaWRhdGlvbi4gVGhlIGluZGl2aWR1YWwgdmFsaWRhdG9yCi0gKiBjbGFzc2VzIHdpbGwgc3RpbGwgYmUgdXNlZCBmb3Igc291cmNlIHZhbGlkYXRpb24uCi0KLSAqCi0gKiA8YnI+PGJyPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSnNCYXRjaFZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3JKb2IsIElFeGVjdXRhYmxlRXh0ZW5zaW9uIHsKLQkvLyBmb3IgZGVidWdnaW5nCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBCb29sZWFuLnZhbHVlT2YoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzdmFsaWRhdG9yIikpLmJvb2xlYW5WYWx1ZSgpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRF9KU1BfQ09SRSA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElQYXRoW10gZXhjbHVkZUxpYlBhdGhzOwotCQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBbXSByaGlub1ZhbGlkYXRvciA9IHsib3JnLmVjbGlwc2UuYXRmLmphdmFzY3JpcHQuaW50ZXJuYWwudmFsaWRhdGlvbi5KU1N5bnRheFZhbGlkYXRvciJ9OyAvLyROT04tTkxTLTEkCi0gICAgICBzdGF0aWMgeyAKLSAgICAgICAgICAgICAgLy8gVGVtcCBjb2RlIHRvIGNsZWFyIFJoaW5vIFN5bnRheCB2YWxpZGF0aW9uIG1hcmtlcnMuCi0gICAgICAgICAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICAgICAgICBJUHJvamVjdFtdIHByb2plY3RzID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHByb2plY3RzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2pdOwotICAgICAgICAgICAgICAgICAgICAgIC8vdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0LmlzT3BlbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2plY3QuaGFzTmF0dXJlKEphdmFTY3JpcHRDb3JlLk5BVFVSRV9JRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JrYmVuY2hSZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyhwcm9qZWN0LCByaGlub1ZhbGlkYXRvciwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgIH0gCi0gICAgICAKLQkvKioKLQkgKiBHZXRzIGN1cnJlbnQgdmFsaWRhdGlvbiBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gY3VycmVudCBwcm9qZWN0Ci0JICogKHdoaWNoIGlzIGJhc2VkIG9uIGN1cnJlbnQgZG9jdW1lbnQpCi0JICogCi0JICogQHJldHVybiBQcm9qZWN0Q29uZmlndXJhdGlvbgotCSAqLwotCXN0YXRpYyBwcml2YXRlIFByb2plY3RDb25maWd1cmF0aW9uIGdldFByb2plY3RDb25maWd1cmF0aW9uKElGaWxlIGZpbGUpIHsKLQkJUHJvamVjdENvbmZpZ3VyYXRpb24gcHJvamVjdENvbmZpZ3VyYXRpb24gPSBudWxsOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJvamVjdENvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24ocHJvamVjdCk7Ci0JCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2plY3RDb25maWd1cmF0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdmFsaWRhdG9yIGlzIGVuYWJsZWQgYWNjb3JkaW5nIGluIFZhbGlkYXRpb24gcHJlZmVyZW5jZXMKLQkgKiAKLQkgKiBAcGFyYW0gdm1kCi0JICogQHJldHVybgotCSAqLwotCXN0YXRpYyBib29sZWFuIGlzQmF0Y2hWYWxpZGF0b3JQcmVmZXJlbmNlRW5hYmxlZChJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0JCVByb2plY3RDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBKc0JhdGNoVmFsaWRhdG9yLmdldFByb2plY3RDb25maWd1cmF0aW9uKGZpbGUpOwotCQlpZiAoY29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YSBtZXRhZGF0YSA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YShKc0JhdGNoVmFsaWRhdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0JCQlpZiAoY29uZmlndXJhdGlvbiAhPSBudWxsICYmIG1ldGFkYXRhICE9IG51bGwpIHsKLQkJCQlpZiAoIWNvbmZpZ3VyYXRpb24uaXNCdWlsZEVuYWJsZWQobWV0YWRhdGEpICYmICFjb25maWd1cmF0aW9uLmlzTWFudWFsRW5hYmxlZChtZXRhZGF0YSkpIHsKLQkJCQkJZW5hYmxlZCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZW5hYmxlZDsKLQl9Ci0JY2xhc3MgSlNQRmlsZVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VQcm94eVZpc2l0b3IgewotCQlwcml2YXRlIExpc3QgZkZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlwcml2YXRlIElSZXBvcnRlciBmUmVwb3J0ZXIgPSBudWxsOwotCQkKLQkJcHVibGljIEpTUEZpbGVWaXNpdG9yKElSZXBvcnRlciByZXBvcnRlcikgewotCQkJZlJlcG9ydGVyID0gcmVwb3J0ZXI7Ci0JCX0KLQkJCi0JCWZpbmFsIElGaWxlW10gZ2V0RmlsZXMoKSB7Ci0JCQlyZXR1cm4gKElGaWxlW10pIGZGaWxlcy50b0FycmF5KG5ldyBJRmlsZVtmRmlsZXMuc2l6ZSgpXSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkvLyBjaGVjayB2YWxpZGF0aW9uCi0JCQlpZiAoZlJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJaWYgKFV0aWwuaXNKc1R5cGUocHJveHkuZ2V0TmFtZSgpKSAmJiBwcm94eS5pc0FjY2Vzc2libGUoKSkgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKLQkJCQkJaWYgKEpzQmF0Y2hWYWxpZGF0b3IuREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKCspIEpTUFZhbGlkYXRvciBhZGRpbmcgZmlsZTogIiArIGZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWZGaWxlcy5hZGQoZmlsZSk7Ci0JCQkJCS8vIGRvbid0IHNlYXJjaCBkZWVwZXIgZm9yIGZpbGVzCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQljbGFzcyBMb2NhbGl6ZWRNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7Ci0JCXByaXZhdGUgU3RyaW5nIF9tZXNzYWdlID0gbnVsbDsKLQkJCi0JCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0KSB7Ci0JCQl0aGlzKHNldmVyaXR5LCBtZXNzYWdlVGV4dCwgbnVsbCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0LCBJUmVzb3VyY2UgdGFyZ2V0T2JqZWN0KSB7Ci0JCQl0aGlzKHNldmVyaXR5LCBtZXNzYWdlVGV4dCwgKE9iamVjdCkgdGFyZ2V0T2JqZWN0KTsKLQkJfQotCQkKLQkJcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQsIE9iamVjdCB0YXJnZXRPYmplY3QpIHsKLQkJCXN1cGVyKG51bGwsIHNldmVyaXR5LCBudWxsKTsKLQkJCXNldExvY2FsaXplZE1lc3NhZ2UobWVzc2FnZVRleHQpOwotCQkJc2V0VGFyZ2V0T2JqZWN0KHRhcmdldE9iamVjdCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgU3RyaW5nIGdldExvY2FsaXplZFRleHQoKSB7Ci0JCQlyZXR1cm4gX21lc3NhZ2U7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYWxpemVkVGV4dCgpOwotCQl9Ci0JCQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KENsYXNzTG9hZGVyIGNsKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYWxpemVkVGV4dCgpOwotCQl9Ci0JCQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KExvY2FsZSBsKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYWxpemVkVGV4dCgpOwotCQl9Ci0JCQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KExvY2FsZSBsLCBDbGFzc0xvYWRlciBjbCkgewotCQkJcmV0dXJuIGdldExvY2FsaXplZFRleHQoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0TG9jYWxpemVkTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQkJX21lc3NhZ2UgPSBtZXNzYWdlOwotCQl9Ci0JfQotCS8vU3RyaW5nIGZBZGRpdGlvbmFsQ29udGVudFR5cGVzSURzW10gPSBudWxsOwotCXByaXZhdGUgSUNvbnRlbnRUeXBlW10gZkNvbnRlbnRUeXBlcyA9IG51bGw7Ci0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkpTUEZDb250ZW50VHlwZSA9IG51bGw7Ci0JcHJpdmF0ZSBKc1ZhbGlkYXRvciBmSlNQSmF2YVZhbGlkYXRvciA9IG5ldyBKc1ZhbGlkYXRvcih0aGlzKTsKLQkKLQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCQlmSlNQSmF2YVZhbGlkYXRvci5jbGVhbnVwKHJlcG9ydGVyKTsKLQl9Ci0JcHJpdmF0ZSBJUGF0aFtdIGdldExpYnJhcnlQYXRocyhJRmlsZSBmaWxlKSB7Ci0JCQotCQlpZihleGNsdWRlTGliUGF0aHMhPW51bGwpIHJldHVybiBleGNsdWRlTGliUGF0aHM7Ci0JCQotCQlJUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCUlKYXZhU2NyaXB0UHJvamVjdCBqYXZhUHJvamVjdD0gSmF2YVNjcmlwdENvcmUuY3JlYXRlKHByb2plY3QpOwotCQkKLQkJaWYoamF2YVByb2plY3Q9PW51bGwpIHJldHVybiBuZXcgSVBhdGhbMF07Ci0JCQotCQlJSW5jbHVkZVBhdGhFbnRyeVtdIGVudHJpZXMgPSBuZXcgSUluY2x1ZGVQYXRoRW50cnlbMF07Ci0JCXRyeSB7Ci0JCQllbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmVzb2x2ZWRJbmNsdWRlcGF0aCh0cnVlKTsKLQkJfSBjYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBNYXkgcnVuIGludG8gYW4gZXhjZXB0aW9uIGlmIHRoZSBwcm9qZWN0IGlzbid0IGpzZHQuCi0JCX0KLQkJQXJyYXlMaXN0IGlnbm9yZVBhdGhzID0gbmV3IEFycmF5TGlzdCgpOwotCQluZXh0RW50cnk6IGZvcihpbnQgaSA9IDA7aTxlbnRyaWVzLmxlbmd0aDtpKyspIHsKLQkJCWlmKGVudHJpZXNbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUluY2x1ZGVQYXRoRW50cnkuQ1BFX0xJQlJBUlkpIHsKLQkJCQlJSW5jbHVkZVBhdGhBdHRyaWJ1dGVbXSBhdHRyaWJzID0gZW50cmllc1tpXS5nZXRFeHRyYUF0dHJpYnV0ZXMoKTsKLQkJCQlmb3IoaW50IGs9MDsgYXR0cmlicyE9bnVsbCAmJiBrPGF0dHJpYnMubGVuZ3RoO2srKykgewotCQkJCQlpZihhdHRyaWJzW2tdLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJ2YWxpZGF0ZSIpICYmIGF0dHJpYnNba10uZ2V0VmFsdWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJmYWxzZSIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJaWdub3JlUGF0aHMuYWRkKGVudHJpZXNbaV0uZ2V0UGF0aCgpKTsKLQkJCQkJCWNvbnRpbnVlIG5leHRFbnRyeTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJZXhjbHVkZUxpYlBhdGhzID0gIChQYXRoW10paWdub3JlUGF0aHMudG9BcnJheShuZXcgUGF0aFtpZ25vcmVQYXRocy5zaXplKCldKTsKLQkJcmV0dXJuIGV4Y2x1ZGVMaWJQYXRoczsKLQl9Ci0JCi0JCi0Jdm9pZCBkb1ZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkKLQkJU3RyaW5nW10gdXJpcyA9IGhlbHBlci5nZXRVUklzKCk7Ci0JCWlmICh1cmlzLmxlbmd0aCA+IDApIHsKLQkJCUlXb3Jrc3BhY2VSb290IHdzUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQlJRmlsZSBjdXJyZW50RmlsZSA9IG51bGw7Ci0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJpcy5sZW5ndGggJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCk7IGkrKykgewotCQkJCWN1cnJlbnRGaWxlID0gd3NSb290LmdldEZpbGUobmV3IFBhdGgodXJpc1tpXSkpOwotCQkJCWlmIChjdXJyZW50RmlsZSAhPSBudWxsICYmIGN1cnJlbnRGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWlmIChzaG91bGRWYWxpZGF0ZShjdXJyZW50RmlsZSkgKSB7Ci0JCQkJCQlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5MT1dfU0VWRVJJVFksICIiICsgKGkgKyAxKSArICIvIiArIHVyaXMubGVuZ3RoICsgIiAtICIgKyBjdXJyZW50RmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKHRoaXMsIG1lc3NhZ2UpOwotCQkJCQkJcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcywgY3VycmVudEZpbGUpOwotCQkJCQkJdmFsaWRhdGVGaWxlKGN1cnJlbnRGaWxlLCByZXBvcnRlcik7Ci0JCQkJCX0KLQkJCQkJaWYgKEpzQmF0Y2hWYWxpZGF0b3IuREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidmFsaWRhdGluZzogWyIgKyB1cmlzW2ldICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBpZiB1cmlzW10gbGVuZ3RoIDAgLT4gdmFsaWRhdGUoKSBnZXRzIGNhbGxlZCBmb3IgZWFjaCBwcm9qZWN0Ci0JCQlpZiAoaGVscGVyIGluc3RhbmNlb2YgSVdvcmtiZW5jaENvbnRleHQpIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKChJV29ya2JlbmNoQ29udGV4dCkgaGVscGVyKS5nZXRQcm9qZWN0KCk7Ci0JCQkJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCBOTFMuYmluZChKc0NvcmVNZXNzYWdlcy5KU1BCYXRjaFZhbGlkYXRvcl8wLCBwcm9qZWN0LmdldEZ1bGxQYXRoKCkpKTsKLQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayh0aGlzLCBtZXNzYWdlKTsKLQkJCQlKU1BGaWxlVmlzaXRvciB2aXNpdG9yID0gbmV3IEpTUEZpbGVWaXNpdG9yKHJlcG9ydGVyKTsKLQkJCQl0cnkgewotCQkJCQkvLyBjb2xsZWN0IGFsbCBqc3AgZmlsZXMgZm9yIHRoZSBwcm9qZWN0Ci0JCQkJCXByb2plY3QuYWNjZXB0KHZpc2l0b3IsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChKc0JhdGNoVmFsaWRhdG9yLkRFQlVHKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCUlGaWxlW10gZmlsZXMgPSB2aXNpdG9yLmdldEZpbGVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGggJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCk7IGkrKykgewotCQkJCQlpZiAoc2hvdWxkVmFsaWRhdGUoZmlsZXNbaV0pICkgewotCQkJCQkJbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkxPV19TRVZFUklUWSwgIiIgKyAoaSArIDEpICsgIi8iICsgZmlsZXMubGVuZ3RoICsgIiAtICIgKyBmaWxlc1tpXS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKHRoaXMsIG1lc3NhZ2UpOwotCQkJCQkJdmFsaWRhdGVGaWxlKGZpbGVzW2ldLCByZXBvcnRlcik7Ci0JCQkJCX0KLQkJCQkJaWYgKEpzQmF0Y2hWYWxpZGF0b3IuREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidmFsaWRhdGluZzogWyIgKyBmaWxlc1tpXSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotLy8JLyoqCi0vLwkgKiBDaGVja3MgaWYgZmlsZSBpcyBhIGpzcCBmcmFnbWVudCBvciBub3QuIElmIHNvLCBjaGVjayBpZiB0aGUgZnJhZ21lbnQKLS8vCSAqIHNob3VsZCBiZSB2YWxpZGF0ZWQgb3Igbm90LgotLy8JICogCi0vLwkgKiBAcGFyYW0gZmlsZQotLy8JICogICAgICAgICAgICBBc3N1bWVzIHNob3VsZFZhbGlkYXRlIHdhcyBhbHJlYWR5IGNhbGxlZCBvbiBmaWxlIHNvIGl0IHNob3VsZAotLy8JICogICAgICAgICAgICBub3QgYmUgbnVsbCBhbmQgZG9lcyBleGlzdAotLy8JICogQHJldHVybiBmYWxzZSBpZiBmaWxlIGlzIGEgZnJhZ21lbnQgYW5kIGl0IHNob3VsZCBub3QgYmUgdmFsaWRhdGVkLCB0cnVlCi0vLwkgKiAgICAgICAgIG90aGVyd2lzZQotLy8JICovCi0vLwlwcml2YXRlIGJvb2xlYW4gZnJhZ21lbnRDaGVjayhJRmlsZSBmaWxlKSB7Ci0vLwkJcmV0dXJuIGlzRnJhZ21lbnQoZmlsZSk7Ci0vLwl9Ci0JCi0JcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyKSB7Ci0JCWlmIChoZWxwZXIgaW5zdGFuY2VvZiBJV29ya2JlbmNoQ29udGV4dCkgewotCQkJLyoKLQkJCSAqIFVzZSBhIHNpbmdsZSBidWlsZCBydWxlIHdoZW4gcnVubmluZyBiYXRjaCB2YWxpZGF0aW9uLgotCQkJICovCi0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkuYnVpbGRSdWxlKCk7Ci0JCX0KLQkJLyoKLQkJICogRm9yIG90aGVyIGtpbmRzIG9mIHZhbGlkYXRpb24sIHVzZSBubyBzcGVjaWZpYyBydWxlCi0JCSAqLwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0KLQotCi0JCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1WYWxpZGF0aW9uKElGaWxlIGYsIElSZXBvcnRlciByZXBvcnRlciwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAoIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCWZKU1BKYXZhVmFsaWRhdG9yLnBlcmZvcm1WYWxpZGF0aW9uKGYsIHJlcG9ydGVyLCBtb2RlbCx0cnVlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbiNzZXRJbml0aWFsaXphdGlvbkRhdGEob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGUoSUZpbGUgZmlsZSkgewotCQkvL2lmKHRydWUpIHJldHVybiB0cnVlOwotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBmaWxlOwotCQlJUGF0aFtdIGxpYlBhdGhzID0gZ2V0TGlicmFyeVBhdGhzKGZpbGUpOwotCQlJUGF0aCBmaWxlUGF0aCA9IGZpbGUuZ2V0RnVsbFBhdGgoKS5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCWZvcihpbnQgaSA9IDA7aTxsaWJQYXRocy5sZW5ndGg7aSsrKSB7Ci0JCQlpZihsaWJQYXRoc1tpXS5pc1ByZWZpeE9mKGZpbGVQYXRoKSl7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCQotCQlkbyB7Ci0JCQlpZiAocmVzb3VyY2UuaXNEZXJpdmVkKCkgfHwgcmVzb3VyY2UuaXNUZWFtUHJpdmF0ZU1lbWJlcigpIHx8ICFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSB8fCByZXNvdXJjZS5nZXROYW1lKCkuY2hhckF0KDApID09ICcuJykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJlc291cmNlID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCX0gd2hpbGUgKChyZXNvdXJjZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuUFJPSkVDVCkgPT0gMCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJZG9WYWxpZGF0ZShoZWxwZXIsIHJlcG9ydGVyKTsKLQl9Ci0JCi0JLyoqCi0JICogVmFsaWRhdGUgb25lIGZpbGUuIEl0J3MgYXNzdW1lZCB0aGF0IHRoZSBmaWxlIGhhcyBKU1AgY29udGVudCB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBmCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICovCi0Jdm9pZCB2YWxpZGF0ZUZpbGUoSUZpbGUgZiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJLy8gZ2V0IEpTUCBtb2RlbCBvbiBiZWhhbGYgb2YgYWxsIEpTUCB2YWxpZGF0b3JzCi0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZik7Ci0JCQlpZihtb2RlbD09bnVsbCkgewotCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoZik7Ci0JCQl9Ci0JCQlpZiAoIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkgJiYgbW9kZWwgIT0gbnVsbCkgewotCQkJCXJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHRoaXMsIGYpOwotCQkJCXBlcmZvcm1WYWxpZGF0aW9uKGYsIHJlcG9ydGVyLCBtb2RlbCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVJbkpvYihmaW5hbCBJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBmaW5hbCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJSm9iIGN1cnJlbnRKb2IgPSBQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuY3VycmVudEpvYigpOwotCQlJU2NoZWR1bGluZ1J1bGUgcnVsZSA9IG51bGw7Ci0JCWlmIChjdXJyZW50Sm9iICE9IG51bGwpIHsKLQkJCXJ1bGUgPSBjdXJyZW50Sm9iLmdldFJ1bGUoKTsKLQkJfQotCQlJV29ya3NwYWNlUnVubmFibGUgdmFsaWRhdGlvblJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQlkb1ZhbGlkYXRlKGhlbHBlciwgcmVwb3J0ZXIpOwotCQkJCX0gY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpzQmF0Y2hWYWxpZGF0b3IuUExVR0lOX0lEX0pTUF9DT1JFLCAwLCBKc0JhdGNoVmFsaWRhdG9yLlBMVUdJTl9JRF9KU1BfQ09SRSwgZSkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCUphdmFTY3JpcHRDb3JlLnJ1bih2YWxpZGF0aW9uUnVubmFibGUsIHJ1bGUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXhjZXB0aW9uKSB7Ci0JCQkJdGhyb3cgKFZhbGlkYXRpb25FeGNlcHRpb24pIGUuZ2V0Q2F1c2UoKTsKLQkJCX0KLQkJCXRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkVSUk9SX0FORF9XQVJOSU5HLCBlLmdldE1lc3NhZ2UoKSksIGUpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSnNWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSnNWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJhMjlkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pzVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLS8qKgotICoKLQotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgSnNWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBCb29sZWFuLnZhbHVlT2YoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzdmFsaWRhdG9yIikpLmJvb2xlYW5WYWx1ZSgpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJVmFsaWRhdG9yIGZNZXNzYWdlT3JpZ2luYXRvcjsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgW10ganNkdFZhbGlkYXRvciA9IHsib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5Kc0JhdGNoVmFsaWRhdG9yIn07IC8vJE5PTi1OTFMtMSQKLQotCQotCXByb3RlY3RlZCBjbGFzcyBMb2NhbGl6ZWRNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7Ci0JCXByaXZhdGUgU3RyaW5nIF9tZXNzYWdlID0gbnVsbDsKLQkJCi0JCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0KSB7Ci0JCQl0aGlzKHNldmVyaXR5LCBtZXNzYWdlVGV4dCwgbnVsbCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0LCBJUmVzb3VyY2UgdGFyZ2V0T2JqZWN0KSB7Ci0JCQl0aGlzKHNldmVyaXR5LCBtZXNzYWdlVGV4dCwgKE9iamVjdCkgdGFyZ2V0T2JqZWN0KTsKLQkJfQotCQkKLQkJcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQsIE9iamVjdCB0YXJnZXRPYmplY3QpIHsKLQkJCXN1cGVyKG51bGwsIHNldmVyaXR5LCBudWxsKTsKLQkJCXNldExvY2FsaXplZE1lc3NhZ2UobWVzc2FnZVRleHQpOwotCQkJc2V0VGFyZ2V0T2JqZWN0KHRhcmdldE9iamVjdCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxpemVkTWVzc2FnZSgpIHsKLQkJCXJldHVybiBfbWVzc2FnZTsKLQkJfQotCQkKLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoQ2xhc3NMb2FkZXIgY2wpIHsKLQkJCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoTG9jYWxlIGwpIHsKLQkJCXJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoTG9jYWxlIGwsIENsYXNzTG9hZGVyIGNsKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRMb2NhbGl6ZWRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCQlfbWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCX0KLQl9Ci0JcHVibGljIEpzVmFsaWRhdG9yKCkgewotCQl0aGlzLmZNZXNzYWdlT3JpZ2luYXRvciA9IHRoaXM7Ci0JfQotCQotCXB1YmxpYyBKc1ZhbGlkYXRvcihJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQl0aGlzLmZNZXNzYWdlT3JpZ2luYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBJTWVzc2FnZSBmcm9tIGFuIElQcm9ibGVtCi0JICogCi0JICogQHBhcmFtIHByb2JsZW0KLQkgKiBAcGFyYW0gZgotCSAqIEBwYXJhbSB0cmFuc2xhdGlvbgotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jCi0JICogQHJldHVybiBtZXNzYWdlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm9ibGVtLCBvciBudWxsIGlmIGl0IGNvdWxkIG5vdAotCSAqICAgICAgICAgY3JlYXRlIG9uZQotCSAqLwotCXByaXZhdGUgSU1lc3NhZ2UgY3JlYXRlTWVzc2FnZUZyb21Qcm9ibGVtKElQcm9ibGVtIHByb2JsZW0sIElGaWxlIGYsIElKc1RyYW5zbGF0aW9uIHRyYW5zbGF0aW9uLCBJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2MpIHsKLQkJaW50IHNvdXJjZVN0YXJ0ID0gcHJvYmxlbS5nZXRTb3VyY2VTdGFydCgpOwotCQlpbnQgc291cmNlRW5kID0gcHJvYmxlbS5nZXRTb3VyY2VFbmQoKTsKLQkJaWYgKHNvdXJjZVN0YXJ0ID09IC0xKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkvLyBsaW5lIG51bWJlciBmb3IgbWFya2VyIHN0YXJ0cyBAIDEKLQkJLy8gbGluZSBudW1iZXIgZnJvbSBkb2N1bWVudCBzdGFydHMgQCAwCi0JCWludCBsaW5lTm8gPSBzdHJ1Y3R1cmVkRG9jLmdldExpbmVPZk9mZnNldChzb3VyY2VTdGFydCkgKyAxOwotCQlpbnQgc2V2ID0gcHJvYmxlbS5pc0Vycm9yKCkgPyBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZIDogSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotCQlJTWVzc2FnZSBtID0gbmV3IExvY2FsaXplZE1lc3NhZ2Uoc2V2LCBwcm9ibGVtLmdldE1lc3NhZ2UoKSwgZik7Ci0JCW0uc2V0TGluZU5vKGxpbmVObyk7Ci0JCW0uc2V0T2Zmc2V0KHNvdXJjZVN0YXJ0KTsKLQkJbS5zZXRMZW5ndGgoc291cmNlRW5kIC0gc291cmNlU3RhcnQgKyAxKTsKLQkJcmV0dXJuIG07Ci0JfQotCQotCXZvaWQgcGVyZm9ybVZhbGlkYXRpb24oSUZpbGUgZiwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBib29sZWFuIGluQmF0Y2gpIHsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBtb2RlbDsKLQkJCXNldHVwQWRhcHRlckZhY3RvcnkoZG9tTW9kZWwpOwotCQkJSURPTURvY3VtZW50IHhtbERvYyA9IGRvbU1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQlKc1RyYW5zbGF0aW9uQWRhcHRlciB0cmFuc2xhdGlvbkFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCS8vdHJhbnNsYXRpb25BZGFwdGVyLnJlc291cmNlQ2hhbmdlZCgpOwotCQkJSUpzVHJhbnNsYXRpb24gdHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbkFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24oZmFsc2UpOwotCQkJaWYgKCFyZXBvcnRlci5pc0NhbmNlbGxlZCgpKSB7Ci0JCQkJdHJhbnNsYXRpb24uc2V0UHJvYmxlbUNvbGxlY3RpbmdBY3RpdmUodHJ1ZSk7Ci0JCQkJdHJhbnNsYXRpb24ucmVjb25jaWxlQ29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJTGlzdCBwcm9ibGVtcyA9IHRyYW5zbGF0aW9uLmdldFByb2JsZW1zKCk7Ci0JCQkJLy8gYWRkIG5ldyBtZXNzYWdlcwotCQkJCWlmKCFpbkJhdGNoKSByZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh0aGlzLCBmKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2JsZW1zLnNpemUoKSAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKTsgaSsrKSB7Ci0JCQkJCUlNZXNzYWdlIG0gPSBjcmVhdGVNZXNzYWdlRnJvbVByb2JsZW0oKElQcm9ibGVtKSBwcm9ibGVtcy5nZXQoaSksIGYsIHRyYW5zbGF0aW9uLCBkb21Nb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQkJCWlmIChtICE9IG51bGwpIHsKLQkJCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UoZk1lc3NhZ2VPcmlnaW5hdG9yLCBtKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBXaGVuIGxvYWRpbmcgbW9kZWwgZnJvbSBhIGZpbGUsIHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgYWRkIGFkYXB0ZXIKLQkgKiBmYWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBzbQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXR1cEFkYXB0ZXJGYWN0b3J5KElTdHJ1Y3R1cmVkTW9kZWwgc20pIHsKLQkJaWYgKHNtLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoSUpzVHJhbnNsYXRpb24uY2xhc3MpID09IG51bGwpIHsKLQkJCUpzVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEpzVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSgpOwotCQkJc20uZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCX0KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGUoSUZpbGUgZmlsZSkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBmaWxlOwotCQlkbyB7Ci0JCQlpZiAocmVzb3VyY2UuaXNEZXJpdmVkKCkgfHwgcmVzb3VyY2UuaXNUZWFtUHJpdmF0ZU1lbWJlcigpIHx8ICFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSB8fCByZXNvdXJjZS5nZXROYW1lKCkuY2hhckF0KDApID09ICcuJykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJlc291cmNlID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JCX0gd2hpbGUgKChyZXNvdXJjZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuUFJPSkVDVCkgPT0gMCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLyogQWRkZWQgYnkgQkMgLS0tLSAqLwotCQkvLyBpZih0cnVlKSByZXR1cm47Ci0JCS8qIGVuZCBBZGRlZCBieSBCQyAtLS0tICovCi0JCQotCQlTdHJpbmdbXSB1cmlzID0gaGVscGVyLmdldFVSSXMoKTsKLQkJSVdvcmtzcGFjZVJvb3Qgd3NSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJaWYgKHVyaXMubGVuZ3RoID4gMCkgewotCQkJSUZpbGUgY3VycmVudEZpbGUgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlzLmxlbmd0aCAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKTsgaSsrKSB7Ci0JCQkJY3VycmVudEZpbGUgPSB3c1Jvb3QuZ2V0RmlsZShuZXcgUGF0aCh1cmlzW2ldKSk7Ci0JCQkJcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcywgY3VycmVudEZpbGUpOwotCQkJCWlmIChjdXJyZW50RmlsZSAhPSBudWxsICYmIGN1cnJlbnRGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWlmIChzaG91bGRWYWxpZGF0ZShjdXJyZW50RmlsZSkgKXsgLy8mJiBmcmFnbWVudENoZWNrKGN1cnJlbnRGaWxlKSkgewotCQkJCQkJaW50IHBlcmNlbnQgPSAoaSAqIDEwMCkgLyB1cmlzLmxlbmd0aCArIDE7Ci0JCQkJCQlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5MT1dfU0VWRVJJVFksIHBlcmNlbnQgKyAiJSAiICsgdXJpc1tpXSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKHRoaXMsIG1lc3NhZ2UpOwotCQkJCQkJdmFsaWRhdGVGaWxlKGN1cnJlbnRGaWxlLCByZXBvcnRlcik7Ci0JCQkJCX0KLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInZhbGlkYXRpbmc6IFsiICsgdXJpc1tpXSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gaWYgdXJpc1tdIGxlbmd0aCAwIC0+IHZhbGlkYXRlKCkgZ2V0cyBjYWxsZWQgZm9yIGVhY2ggcHJvamVjdAotCQkJaWYgKGhlbHBlciBpbnN0YW5jZW9mIElXb3JrYmVuY2hDb250ZXh0KSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9ICgoSVdvcmtiZW5jaENvbnRleHQpIGhlbHBlcikuZ2V0UHJvamVjdCgpOwotCQkJCUpTUEZpbGVWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSlNQRmlsZVZpc2l0b3IocmVwb3J0ZXIpOwotCQkJCXRyeSB7Ci0JCQkJCS8vIGNvbGxlY3QgYWxsIGpzcCBmaWxlcyBmb3IgdGhlIHByb2plY3QKLQkJCQkJcHJvamVjdC5hY2NlcHQodmlzaXRvciwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCUlGaWxlW10gZmlsZXMgPSB2aXNpdG9yLmdldEZpbGVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGggJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCk7IGkrKykgewotCQkJCQlpZiAoc2hvdWxkVmFsaWRhdGUoZmlsZXNbaV0pKSB7Ci0JCQkJCQlpbnQgcGVyY2VudCA9IChpICogMTAwKSAvIGZpbGVzLmxlbmd0aCArIDE7Ci0JCQkJCQlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5MT1dfU0VWRVJJVFksIHBlcmNlbnQgKyAiJSAiICsgZmlsZXNbaV0uZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sodGhpcywgbWVzc2FnZSk7Ci0JCQkJCQl2YWxpZGF0ZUZpbGUoZmlsZXNbaV0sIHJlcG9ydGVyKTsKLQkJCQkJfQotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidmFsaWRhdGluZzogWyIgKyBmaWxlc1tpXSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEpTUEZpbGVWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlUHJveHlWaXNpdG9yIHsKLQkJcHJpdmF0ZSBJQ29udGVudFR5cGVbXSBmQ29udGVudFR5cGVzID0gbnVsbDsKLQkJcHJpdmF0ZSBMaXN0IGZGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcHJpdmF0ZSBJUmVwb3J0ZXIgZlJlcG9ydGVyID0gbnVsbDsKLQkJCi0JCXB1YmxpYyBKU1BGaWxlVmlzaXRvcihJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJCWZSZXBvcnRlciA9IHJlcG9ydGVyOwotCQl9Ci0JCQotCQlwdWJsaWMgZmluYWwgSUZpbGVbXSBnZXRGaWxlcygpIHsKLQkJCXJldHVybiAoSUZpbGVbXSkgZkZpbGVzLnRvQXJyYXkobmV3IElGaWxlW2ZGaWxlcy5zaXplKCldKTsKLQkJfQotCQkKLQkJCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkvLyBjaGVjayB2YWxpZGF0aW9uCi0JCQlpZiAoZlJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJaWYgKFV0aWwuaXNKc1R5cGUocHJveHkuZ2V0TmFtZSgpKSkgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKLQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKCspIEpTUFZhbGlkYXRvciBhZGRpbmcgZmlsZTogIiArIGZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJZkZpbGVzLmFkZChmaWxlKTsKLQkJCQkJCS8vIGRvbid0IHNlYXJjaCBkZWVwZXIgZm9yIGZpbGVzCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCS8qKgotCSAqIFZhbGlkYXRlIG9uZSBmaWxlLiBJdCdzIGFzc3VtZWQgdGhhdCB0aGUgZmlsZSBoYXMgSlNQIGNvbnRlbnQgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gZgotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqLwotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRmlsZShJRmlsZSBmLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKEpzVmFsaWRhdG9yLkRFQlVHKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgdmFsaWRhdGluZzogIiArIGYpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBnZXQganNwIG1vZGVsLCBnZXQgdHJhbmxzYXRpb24KLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmKTsKLQkJCWlmKG1vZGVsPT1udWxsKSB7Ci0JCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmKTsKLQkJCX0KLQkJCWlmICghcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSAmJiBtb2RlbCAhPSBudWxsKSB7Ci0JCQkJLy8gZ2V0IGpzcCBtb2RlbCwgZ2V0IHRyYW5zbGF0aW9uCi0JCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJCS8vV29ya2JlbmNoUmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXMoZi5nZXRQcm9qZWN0KCksIGpzZHRWYWxpZGF0b3IsIGYudG9TdHJpbmcoKSk7Ci0JCQkJCS8vcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXMoZk1lc3NhZ2VPcmlnaW5hdG9yLCBmKTsKLQkJCQkJcGVyZm9ybVZhbGlkYXRpb24oZiwgcmVwb3J0ZXIsIG1vZGVsLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU4NGE3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JFbWJlZGVkSnM7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIFV0aWwgewotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0pzVHlwZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaWYoZmlsZU5hbWU9PW51bGwpIHJldHVybiBmYWxzZTsKLQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCQlJQ29udGVudFR5cGVbXSB0eXBlcyA9Z2V0SmF2YXNjcmlwdENvbnRlbnRUeXBlcygpOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlICh0eXBlcyE9bnVsbCAmJiBpIDwgdHlwZXMubGVuZ3RoICYmICF2YWxpZCkgewotCQkJdmFsaWQgPSB0eXBlc1tpXSE9bnVsbCAmJiB0eXBlc1tpXS5pc0Fzc29jaWF0ZWRXaXRoKGZpbGVOYW1lKTsKLQkJCSsraTsKLQkJfQotCQlyZXR1cm4gdmFsaWQ7Ci0JCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElDb250ZW50VHlwZVtdIGdldEphdmFzY3JpcHRDb250ZW50VHlwZXMoKSB7Ci0KLQkJU3RyaW5nW10gY29udGVudFR5cGVJZHMgPSBDb250ZW50VHlwZUlkRm9yRW1iZWRlZEpzLkNvbnRlbnRUeXBlSWRzOwotCQlBcnJheUxpc3QgZkNvbnRlbnRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCQotCQlmb3IoaW50IGkgPSAwO2k8Y29udGVudFR5cGVJZHMubGVuZ3RoO2krKykgewotCQkJSUNvbnRlbnRUeXBlIGN0ID0gIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWRzW2ldKTsKLQkJCWlmKGN0IT1udWxsKSBmQ29udGVudFR5cGVzLmFkZChjdCk7Ci0JCX0KLQkJCi0JCXJldHVybiAoSUNvbnRlbnRUeXBlW10pZkNvbnRlbnRUeXBlcy50b0FycmF5KG5ldyBJQ29udGVudFR5cGVbZkNvbnRlbnRUeXBlcy5zaXplKCldKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0NvbXBpbGF0aW9uVW5pdEhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Db21waWxhdGlvblVuaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVkMDAxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0NvbXBpbGF0aW9uVW5pdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5Xb3JraW5nQ29weU93bmVyOwotCi0vKioKLQotCi0KLQotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiA8YnI+PGJyPiB0aGlzIGNvZGUgd2FzIHRha2VuIGZyb20gdGhlIEpTUCBwbHVnaW4uICBUaGlzIGNsYXNzIGlzIHRvIGVuc3VyZSBvbmx5IG9uZSBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0IGV4aXRzLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25Vbml0SGVscGVyIHsKLQlwcml2YXRlIHN0YXRpYyBDb21waWxhdGlvblVuaXRIZWxwZXIgaW5zdGFuY2U7Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgZmluYWwgQ29tcGlsYXRpb25Vbml0SGVscGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoQ29tcGlsYXRpb25Vbml0SGVscGVyLmluc3RhbmNlID09IG51bGwpIHsKLQkJCUNvbXBpbGF0aW9uVW5pdEhlbHBlci5pbnN0YW5jZSA9IG5ldyBDb21waWxhdGlvblVuaXRIZWxwZXIoKTsKLQkJfQotCQlyZXR1cm4gQ29tcGlsYXRpb25Vbml0SGVscGVyLmluc3RhbmNlOwotCX0KLQlwcml2YXRlIEpzUHJvYmxlbVJlcXVlc3RvciBmUHJvYmxlbVJlcXVlc3RvciA9IG51bGw7Ci0JcHJpdmF0ZSBXb3JraW5nQ29weU93bmVyIGZXb3JraW5nQ29weU93bmVyID0gbnVsbDsKLQkKLQlwcml2YXRlIENvbXBpbGF0aW9uVW5pdEhlbHBlcigpIHsKLQkvLyBmb3JjZSB1c2Ugb2YgaW5zdGFuY2UKLQl9Ci0JCi0JcHVibGljIEpzUHJvYmxlbVJlcXVlc3RvciBnZXRQcm9ibGVtUmVxdWVzdG9yKCkgewotCQlpZiAoZlByb2JsZW1SZXF1ZXN0b3IgPT0gbnVsbCkgewotCQkJZlByb2JsZW1SZXF1ZXN0b3IgPSBuZXcgSnNQcm9ibGVtUmVxdWVzdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGZQcm9ibGVtUmVxdWVzdG9yOwotCX0KLQkKLQlwdWJsaWMgV29ya2luZ0NvcHlPd25lciBnZXRXb3JraW5nQ29weU93bmVyKCkgewotCQlpZiAoZldvcmtpbmdDb3B5T3duZXIgPT0gbnVsbCkgewotCQkJZldvcmtpbmdDb3B5T3duZXIgPSBuZXcgV29ya2luZ0NvcHlPd25lcigpIHsKLQkJCQkKLQkJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCQlyZXR1cm4gIkpTUCBXb3JraW5nIGNvcHkgb3duZXIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gZldvcmtpbmdDb3B5T3duZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Eb2N1bWVudENoYW5nZUxpc3RlbmVyVG9UZXh0RWRpdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Eb2N1bWVudENoYW5nZUxpc3RlbmVyVG9UZXh0RWRpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzIwYmE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvRG9jdW1lbnRDaGFuZ2VMaXN0ZW5lclRvVGV4dEVkaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuRGVsZXRlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkluc2VydEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSogPGJyPjxicj4KLSogCi0qIHRoaXMgY2xhc3MgYXR0YWNoZXMgdG8gYSAiY2xvbmVkIiBkb2N1bWVudCwgbGlzdGVucyBmb3IgY2hhbmdlcyB0byB0aGF0IGRvY3VtZW50IHRoZW4gdHJhbnNsYXRlcwotKiB0aGUgY2hhbmdlcyB0byB0ZXh0IGVkaXRzLiAgdGhlc2UgY2hhbmdlcyBjYW4gdGhlbiBiZSBhcHBsaWVkIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGRvY3VtZW50LgotKiAKLSoKLSovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRDaGFuZ2VMaXN0ZW5lclRvVGV4dEVkaXQgaW1wbGVtZW50cyBJRG9jdW1lbnRMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBNdWx0aVRleHRFZGl0IHRleHRFZGl0OwotCQotCXB1YmxpYyBEb2N1bWVudENoYW5nZUxpc3RlbmVyVG9UZXh0RWRpdCgpIHsKLQkJdGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiVW5pbXBsZW1lbnRlZAotCS8vIG1ldGhvZDpEb2N1bWVudENoYW5nZUxpc3RlbmVyVG9UZXh0RWRpdC5kb2N1bWVudEFib3V0VG9CZUNoYW5nZWQiKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJaW50IGxlbmd0aCA9IGV2ZW50LmdldExlbmd0aCgpOwotCQlpbnQgb2Zmc2V0ID0gZXZlbnQuZ2V0T2Zmc2V0KCk7Ci0JCVN0cmluZyB0ZXh0ID0gZXZlbnQuZ2V0VGV4dCgpOwotCQlpZiAobGVuZ3RoIDwgMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChsZW5ndGggPT0gMCkgewotCQkJLyogaW5zZXJ0aW5nIHRleHQgb3BlcmF0aW9uICovCi0JCQlJbnNlcnRFZGl0IGVkaXQgPSBuZXcgSW5zZXJ0RWRpdChvZmZzZXQsIHRleHQpOwotCQkJdGV4dEVkaXQuYWRkQ2hpbGQoZWRpdCk7Ci0JCQkKLQkJfSBlbHNlIGlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8qIGRlbGV0ZSBvcGVyYXRpb24gKi8KLQkJCURlbGV0ZUVkaXQgZWRpdCA9IG5ldyBEZWxldGVFZGl0KG9mZnNldCwgbGVuZ3RoKTsKLQkJCXRleHRFZGl0LmFkZENoaWxkKGVkaXQpOwotCQkJCi0JCX0gZWxzZSBpZiAobGVuZ3RoID4gMCkgewotCQkJLyogcmVwbGFjZSB0ZXh0IG9wZXJhdGlvbiAqLwotCQkJUmVwbGFjZUVkaXQgZWRpdCA9IG5ldyBSZXBsYWNlRWRpdChvZmZzZXQsIGxlbmd0aCwgdGV4dCk7Ci0JCQl0ZXh0RWRpdC5hZGRDaGlsZChlZGl0KTsKLQkJCi0JCX0KLQl9Ci0JCi0JcHVibGljIE11bHRpVGV4dEVkaXQgZ2V0VGV4dEVkaXRzKCkgewotCQlyZXR1cm4gdGV4dEVkaXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9IVE1MNDBOYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSFRNTDQwTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNGQyMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9IVE1MNDBOYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSUpzVHJhbnNsYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSUpzVHJhbnNsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE2ZGQyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0lKc1RyYW5zbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqICAgICAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0VW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLjxicj4KLSogCi0qLwotcHVibGljIGludGVyZmFjZSBJSnNUcmFuc2xhdGlvbiB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIElKYXZhU2NyaXB0UHJvamVjdCB0aGF0IHRoaXMgdHJhbnNsYXRpb24gYmVsb25ncyB0bwotCSAqLwotCXB1YmxpYyBJSmF2YVNjcmlwdFByb2plY3QgZ2V0SmF2YVByb2plY3QoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gT3JpZ2luYWwgSFRNTCBkb2N1bWVudCBmcm9tIHRoZSB0cmFuc2xhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50IGdldEh0bWxEb2N1bWVudCgpOwotCi0JLyoqCi0JICogQHJldHVybiBpbnRlZ2VyIHBvc2l0aW9uIG9mIGEgbWlzc2luZyA8L3NjcmlwdD4gdGFnICh0aGUgZG9jdW1lbnQgaXNuJ3Qgd2VsbCBmb3JtZWQgYW5kIHJlc3VsdGVkIGluIHRyYW5zbGF0aW9uIGVycm9yLikuCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRNaXNzaW5nVGFnU3RhcnQoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBqYXZhUG9zaXRpb25TdGFydAotCSAqIEBwYXJhbSBqYXZhUG9zaXRpb25FbmQKLQkgKiBAcmV0dXJuIGFsbCBqYXZhc2NyaXB0IGVsZW1lbnRzIHdpdGhpbiB0aGUgZ2l2ZW4gcmFuZ2UKLQkgKi8KLQlwdWJsaWMgSUphdmFTY3JpcHRFbGVtZW50W10gZ2V0QWxsRWxlbWVudHNJbkpzUmFuZ2UoaW50IGphdmFQb3NpdGlvblN0YXJ0LCBpbnQgamF2YVBvc2l0aW9uRW5kKTsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGphdmFzY3JpcHQgdW5pdCBmcm9tIHRoZSBqc2R0LmNvcmUKLQkgKi8KLQlwdWJsaWMgSUphdmFTY3JpcHRVbml0IGdldENvbXBpbGF0aW9uVW5pdCgpOwotCi0JLyoqCi0JICogQHBhcmFtIGphdmFQb3NpdGlvblN0YXJ0Ci0JICogQHBhcmFtIGphdmFQb3NpdGlvbkVuZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUphdmFTY3JpcHRFbGVtZW50W10gZ2V0RWxlbWVudHNGcm9tSnNSYW5nZShpbnQgamF2YVBvc2l0aW9uU3RhcnQsIGludCBqYXZhUG9zaXRpb25FbmQpOwotCi0JLyoqCi0JICogQHJldHVybiBzdHJpbmcgb2YgdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHRtbFRleHQoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBqc09mZnNldAotCSAqIEByZXR1cm4gYSBzaW5nbGUgamF2YXNjcmlwdCBlbGVtZW50IGF0IHRoZSBnaXZlbiBvZmZzZXQuCi0JICovCi0JcHVibGljIElKYXZhU2NyaXB0RWxlbWVudCBnZXRKc0VsZW1lbnRBdE9mZnNldChpbnQganNPZmZzZXQpOwotCi0JLyoqCi0JICogQHJldHVybiBvbmx5IHRoZSB0cmFuc2xhdGVkIGphdmFzY3JpcHQgdGV4dAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SnNUZXh0KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0aGUgc2NyaXB0IHJlZ2lvbnMgd2l0aGluIHRoZSB0cmFuc2xhdGlvbi4KLQkgKi8KLQlwdWJsaWMgUG9zaXRpb25bXSBnZXRTY3JpcHRQb3NpdGlvbnMoKTsKLQotCS8qKgotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0SW5GaXJzdFNjcmlwdFJlZ2lvbihTdHJpbmcgdGV4dCk7Ci0KLQkvKioKLQkgKiBpbnNlcnQgamF2YXNjcmlwdCBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LiAgbWV0aG9kIHNob3VsZCBlbnN1cmUgdGhlIGRvY3VtZW50cyB3ZWxsLWZvcm1lZG5lc3MgYW5kIHByb3BlciBzY3JpcHQgcmVnaW9uLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydFNjcmlwdChpbnQgb2Zmc2V0LCBTdHJpbmcgdGV4dCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBqYXZhc2NyaXB0IGVycm9ycwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb2JsZW1zKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiBpZiB0aGUgb2Zmc2V0IGlzIHdpdGhpbiBhIHNjcmlwdCBpbXBvcnQgbm9kZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpZk9mZnNldEluSW1wb3J0Tm9kZShpbnQgb2Zmc2V0KTsKLQotCS8qKgotCSAqIGNoZWNrcyB0aGUgQ1UgZm9yIGVycm9ycy9jb25zaXN0YW5jeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWNvbmNpbGVDb21waWxhdGlvblVuaXQoKTsKLQotCS8qKgotCSAqIHJlbGVhc2UgdGhlIHRyYW5zbGF0aW9uLiAgYWx3YXlzIGEgZ29vZCBpZGVhIHRvIGRvIHdoZW4geW91J3JlIGRvbmUuICB5b3UgbWF5IG5vdGljZSBkb2N1bWVudCBhbmQgbW9kZWwgbG9ja3MgaWYgbm90LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKTsKLQkKLQkvKioKLQkgKiBmaXhlcyBhIG1hbmdsZWQgaHRtbC0tPiBwdXJlIGpzIG5hbWUuCi0JICogQHBhcmFtIGRpc3BsYXlTdHJpbmcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBmaXh1cE1hbmdsZWROYW1lKFN0cmluZyBkaXNwbGF5U3RyaW5nKTsgCi0JCi0JLyoqCi0JICogc3RhcnQvc3RvcCBjb2xsZWN0aW5nIHByb2JsZW1zIHdpdGhpbiB0aGUgamF2YXNjcmlwdCB1bml0LgotCSAqIEBwYXJhbSBjb2xsZWN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvYmxlbUNvbGxlY3RpbmdBY3RpdmUoYm9vbGVhbiBjb2xsZWN0KTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKYXZhUGF0aCgpOwotCQotCS8qKgotCSAqIAotCSAqIAotCSAqIEBwYXJhbSBodG1sRG9jdW1lbnQKLQkgKiBAcGFyYW0gamF2YVByb2oKLQkgKiBAcGFyYW0gbGlzdGVuRm9yQ2hhbmdlcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUpzVHJhbnNsYXRpb24gZ2V0SW5zdGFuY2UoSVN0cnVjdHVyZWREb2N1bWVudCBodG1sRG9jdW1lbnQsIElKYXZhU2NyaXB0UHJvamVjdCBqYXZhUHJvaiwgYm9vbGVhbiBsaXN0ZW5Gb3JDaGFuZ2VzKSA7Ci0KLQkvKioKLQkgKiBub3RpZnkgdGhlIHRyYW5zbGF0aW9uIHRvIHVwZGF0ZSBhbnkgZXh0ZXJuYWwgZGVwZW5kYW5jaWVzIHRoYXQgYXJlIGNyZWF0ZWQgZHVyaW5nIHRyYW5zbGF0aW9uCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgY2xhc3NwYXRoQ2hhbmdlKCkgOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSUpzVHJhbnNsYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9JSnNUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MjZjYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9JSnNUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqICAgICAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIElKc1RyYW5zbGF0b3IgZXh0ZW5kcyBJRG9jdW1lbnRMaXN0ZW5lcnsKLQotCS8qKgotCSAqIEByZXR1cm4gc3RyaW5nIG9mIGphdmFzY3JpcHQgZnJvbSB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpzVGV4dCgpOwotCi0JLyoqCi0JICogc2V0cyB0aGUgamF2YXNjcmlwdCB1bml0IGJ1ZmZlcgotCSAqIEBwYXJhbSBidWZmZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCdWZmZXIoSUJ1ZmZlciBidWZmZXIpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgaHRtbCBsb2NhdGlvbnMgd2l0aGluIHRoZSBkb2N1ZW1udC4KLQkgKi8KLQlwdWJsaWMgUG9zaXRpb25bXSBnZXRIdG1sTG9jYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSByZWdpb24gb2YgYSBtaXNzaW5nIDwvc2NyaXB0PiB0YWcKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pc3NpbmdFbmRUYWdSZWdpb25TdGFydCgpOwotCi0JLyoqCi0JICogQHJldHVybiBwb3NpdGlvbiBhcnJheSBvZiA8c2NyaXB0IHNyYz0iLi4iPiB3aXRoaW4gdGhlIGRvYy4KLQkgKi8KLQlwdWJsaWMgUG9zaXRpb25bXSBnZXRJbXBvcnRIdG1sUmFuZ2VzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHJhdy91bnJlc29sdmVkIDxzY3JpcHQgaW1wb3J0cz4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UmF3SW1wb3J0cygpOwotCi0JLyoqCi0JICogIGJlZ2luIHRyYW5zbGF0aW5nIHRoZSBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmFuc2xhdGUoKTsKLQotCS8qKgotCSAqIHRyYW5zbGF0ZXMgYW4gaW5saW5lIChldmVudD0iLi4iKSBqcyBjb250YWluZXIgcmVnaW9uIGFuZCBhZGRzIGl0IHRvIHRoZSBkb2N1bWVudCB0ZXh0LiAgbXVzdCBiZSBjYWxsZWQgaW4gb3JkZXIKLQkgKiBAcGFyYW0gY29udGFpbmVyCi0JICovCi0JcHVibGljIHZvaWQgdHJhbnNsYXRlSW5saW5lSlNOb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGFpbmVyKTsKLQotCS8qKgotCSAqIHRyYW5zbGF0ZXMgYSBzY3JpcHQgYmxvY2suICBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgb3JkZXIgaXQgYXBwZWFycyB3aXRoaW4gdGhlIGRvY3VtZW50LgotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0cmFuc2xhdGVKU05vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250YWluZXIpOwotCi0JLyoqCi0JICogdHJhbnNsYXRlcyBhIDxzY3JpcHQgc3JjPSIuLiI+IGVsZW1lbnQsIHBhcnNpbmcgb3V0IGFuIGltcG9ydC4KLQkgKiBAcGFyYW0gcmVnaW9uCi0JICovCi0JcHVibGljIHZvaWQgdHJhbnNsYXRlU2NyaXB0SW1wb3J0Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbik7Ci0KLQkvKioKLQkgKiByZWxlYXNlIGFueSByZXNvdXJjZXMgdGhlIHRyYW5zbGF0aW9uIGlzIGhvbGRpbmcgb250by4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzRGF0YVR5cGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzRGF0YVR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZDJhZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc0RhdGFUeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnNEYXRhVHlwZXMgZXh0ZW5kcyBIVE1MNDBOYW1lc3BhY2UgewotCS8qCi0JICogcmVtb3ZlIHdoZW4gd2hlbiB3ZSByZWZhY3RvciAobmVlZCB0byBhZGQgdGhpcyBjb250ZW50IHR5cGUgdG8gbWFueQotCSAqIHByb2plY3QgdHlwZXMgaW4gd3N0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfRklMRV9FWFRFTlNJT04gPSAiLmpzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gQ09OU1RBTlRTID0geyAiZmFsc2UiLCAibnVsbCIsICJ0cnVlIiB9OyAvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVWRU5UUyA9IHsgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkNMSUNLLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OREJMQ0xJQ0ssIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05NT1VTRURPV04sCi0JCQlIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OTU9VU0VVUCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTk1PVVNFT1ZFUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTk1PVVNFTU9WRSwKLQkJCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05NT1VTRU9VVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTktFWVBSRVNTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OS0VZRE9XTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTktFWVVQLAotCQkJSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkhFTFAgfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhUTUxBVFJFVkVOVFMgPSB7ICJvbmxvYWQgIiwgIm9udW5sb2FkIiwgIm9uY2xpY2siLCAib25tb3VzZWRvd24iLCAib25tb3VzZXVwIiwgIm9ubW91c2VvdmVyIiwgIm9ubW91c2Vtb3ZlIiwgIm9ubW91c2VvdXQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSJvbmZvY3VzIiwgIm9uYmx1ciIsICJvbmtleXByZXNzIiwgIm9ua2V5ZG93biIsICJvbmtleXVwIiwgIm9uc3VibWl0IiwgIm9ucmVzZXQiLCAib25zZWxlY3QiLCAib25jaGFuZ2UiLCB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQgLy8kTk9OLU5MUy05JAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSlNWQUxJRERBVEFUWVBFUyA9IHsgIkpBVkFTQ1JJUFQiLCAiVEVYVC9KQVZBU0NSSVBUIiB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIEtFWVdPUkRTID0geyAiYWJzdHJhY3QiLCAiYnJlYWsiLCAiY2FzZSIsICJjYXRjaCIsICJjbGFzcyIsICJjb25zdCIsICJjb250aW51ZSIsICJkZWJ1Z2dlciIsICJkZWZhdWx0IiwgImRlbGV0ZSIsICJkbyIsICJlbHNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkIC8vJE5PTi1OTFMtOSQgLy8kTk9OLU5MUy0xMCQgLy8kTk9OLU5MUy0xMSQgLy8kTk9OLU5MUy0xMiQKLQkJCSJlbnVtIiwgImV4cG9ydCIsICJleHRlbmRzIiwgImZpbmFsIiwgImZpbmFsbHkiLCAiZm9yIiwgImZ1bmN0aW9uIiwgImdvdG8iLCAiaWYiLCAiaW1wbGVtZW50cyIsICJpbXBvcnQiLCAiaW4iLCAiaW5zdGFuY2VvZiIsICJpbnRlcmZhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQgLy8kTk9OLU5MUy05JCAvLyROT04tTkxTLTEwJCAvLyROT04tTkxTLTExJCAvLyROT04tTkxTLTEyJCAvLyROT04tTkxTLTEzJCAvLyROT04tTkxTLTE0JAotCQkJIm5hdGl2ZSIsICJuZXciLCAicGFja2FnZSIsICJwcml2YXRlIiwgInByb3RlY3RlZCIsICJwdWJsaWMiLCAicmV0dXJuIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JAotCQkJInN0YXRpYyIsICJzdXBlciIsICJzd2l0Y2giLCAic3luY2hyb25pemVkIiwgInRoaXMiLCAidGhyb3ciLCAidGhyb3dzIiwgInRyYW5zaWVudCIsICJ0cnkiLCAidHlwZW9mIiwgInZvbGF0aWxlIiwgIndoaWxlIiwgIndpdGgiIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JCAvLyROT04tTkxTLTkkIC8vJE5PTi1OTFMtMTAkIC8vJE5PTi1OTFMtMTEkIC8vJE5PTi1OTFMtMTIkIC8vJE5PTi1OTFMtMTMkCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcKLQkvLyBORVdfUEFSVElUSU9OX1RZUEU9Im9yZy5lY2xpcHNlLndzdC5qc2R0LlN0cnVjdHVyZWRKcyI7Ci0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1BBUlRJVElPTl9UWVBFPUlIVE1MUGFydGl0aW9ucy5TQ1JJUFQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1BBUlRJVElPTl9UWVBFID0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRBS0VPVkVSX1BBUlRJVElPTl9UWVBFUyA9IHsgIm5vbmUiIH07IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIFRZUEVTID0geyAiYm9vbGVhbiIsICJieXRlIiwgImNoYXIiLCAiZG91YmxlIiwgImludCIsICJsb25nIiwgInNob3J0IiwgImZsb2F0IiwgInZhciIsICJ2b2lkIiB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQgLy8kTk9OLU5MUy05JCAvLyROT04tTkxTLTEwJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc05hbWVNYW5nbGVyVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc05hbWVNYW5nbGVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGNlZThmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNOYW1lTWFuZ2xlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSnNOYW1lTWFuZ2xlclV0aWwgewotCS8qKgotCSAqIERldGVybWluZSBpZiBnaXZlbiBzdHJpbmcgaXMgYSB2YWxpZCBIZXggcmVwcmVzZW50YXRpb24gb2YgYW4gQVNDSUkKLQkgKiBjaGFyYWN0ZXIgKGVnLiAyRiAtPiAvKQotCSAqIAotCSAqIEBwYXJhbSBwb3NzaWJsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHBvc3NpYmxlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChwb3NzaWJsZS5sZW5ndGgoKSA9PSAyKSB7Ci0JCQljaGFyIGMxID0gcG9zc2libGUuY2hhckF0KDApOwotCQkJY2hhciBjMiA9IHBvc3NpYmxlLmNoYXJBdCgxKTsKLQkJCS8vIDFzdCBjaGFyYWN0ZXIgbXVzdCBiZSBhIGRpZ2l0Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoYzEpKSB7Ci0JCQkJLy8gMm5kIGNoYXJhY3RlciBtdXN0IGJlIGRpZ2l0IG9yIHVwcGVyIGNhc2UgbGV0dGVyIEEtRgotCQkJCWlmIChDaGFyYWN0ZXIuaXNEaWdpdChjMikpIHsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShjMikgJiYgKGMyID09ICdBJyB8fCBjMiA9PSAnQicgfHwgYzIgPT0gJ0MnIHx8IGMyID09ICdEJyB8fCBjMiA9PSAnRScgfHwgYzIgPT0gJ0YnKSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBNYW5nbGUgc3RyaW5nIHRvIFdBUy1saWtlIHNwZWNpZmljYXRpb25zCi0JICogCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgbWFuZ2xlKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciBtb2RpZmllZE5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCS8vIGV4dGVuc2lvbiAoLmpzcCwgLmpzcGYsIC5qc3B4LCBldGMuLi4pIHNob3VsZCBhbHJlYWR5IGJlIGVuY29kZWQgaW4KLQkJLy8gbmFtZQotCQlpbnQgbGVuZ3RoID0gbmFtZS5sZW5ndGgoKTsKLQkJLy8gaW4gY2FzZSBuYW1lIGlzIGZvcmJpZGRlbiAoYSBudW1iZXIsIGNsYXNzLCBmb3IsIGV0Yy4uLikKLQkJbW9kaWZpZWROYW1lLmFwcGVuZCgnXycpOwotCQkvLyBlbnN1cmUgcmVzdCBvZiBjaGFyYWN0ZXJzIGFyZSB2YWxpZAotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQljaGFyIGN1cnJlbnRDaGFyID0gbmFtZS5jaGFyQXQoaSk7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGN1cnJlbnRDaGFyKSA9PSB0cnVlKSB7Ci0JCQkJbW9kaWZpZWROYW1lLmFwcGVuZChjdXJyZW50Q2hhcik7Ci0JCQl9IGVsc2UgewotCQkJCW1vZGlmaWVkTmFtZS5hcHBlbmQoSnNOYW1lTWFuZ2xlclV0aWwubWFuZ2xlQ2hhcihjdXJyZW50Q2hhcikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZE5hbWUudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogdGFrZSBhIGNoYXJhY3RlciBhbmQgcmV0dXJuIGl0cyBoZXggZXF1aXZhbGVudAotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBtYW5nbGVDaGFyKGNoYXIgY2gpIHsKLQkJaWYgKGNoID09IEZpbGUuc2VwYXJhdG9yQ2hhcikgewotCQkJY2ggPSAnLyc7Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoY2gpID09IHRydWUpIHsKLQkJCXJldHVybiAiIiArIGNoOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuICJfIiArIEludGVnZXIudG9IZXhTdHJpbmcoY2gpLnRvVXBwZXJDYXNlKCkgKyAiXyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQkKLQkvKioKLQkgKiBXQVMgbWFuZ2xlcyBUb20mSmVycnkgYXM6IF9Ub21fMjZfSmVycnk7IHRoaXMgdGFrZXMgaW4gdGhlIG1hbmdsZWQgbmFtZQotCSAqIGFuZCByZXR1cm5zIHRoZSBvcmlnaW5hbCBuYW1lLgotCSAqIAotCSAqIFVubWFuZ2xlcyB0aGUgcXVhbGlmaWVkIHR5cGUgbmFtZS4gSWYgYW4gdW5kZXJzY29yZSBpcyBmb3VuZCBpdCBpcwotCSAqIGFzc3VtZWQgdG8gYmUgYSBtYW5nbGVkIHJlcHJlc2VudGF0aW9uIG9mIGEgbm9uLWFscGhhLCBub24tZGlnaXQKLQkgKiBjaGFyYWN0ZXIgb2YgdGhlIGZvcm0gX05OXywgd2hlcmUgTk4gYXJlIGhleCBkaWdpdHMgcmVwcmVzZW50aW5nIHRoZQotCSAqIGVuY29kZWQgY2hhcmFjdGVyLiBUaGlzIHJvdXRpbmUgY29udmVydHMgaXQgYmFjayB0byB0aGUgb3JpZ2luYWwKLQkgKiBjaGFyYWN0ZXIuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgdW5tYW5nbGUoU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lKSB7Ci0JCWlmIChxdWFsaWZpZWRUeXBlTmFtZS5jaGFyQXQoMCkgIT0gJ18nKSB7Ci0JCQlyZXR1cm4gcXVhbGlmaWVkVHlwZU5hbWU7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIHBvc3NpYmxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcmVtb3ZlIHRoZSAuamF2YSBleHRlbnNpb24gaWYgdGhlcmUgaXMgb25lCi0JCWlmIChxdWFsaWZpZWRUeXBlTmFtZS5lbmRzV2l0aCgiLmpzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcXVhbGlmaWVkVHlwZU5hbWUgPSBxdWFsaWZpZWRUeXBlTmFtZS5zdWJzdHJpbmcoMCwgcXVhbGlmaWVkVHlwZU5hbWUubGVuZ3RoKCkgLSAzKTsKLQkJfQotCQlmb3IgKGludCBpID0gMTsgaSA8IHF1YWxpZmllZFR5cGVOYW1lLmxlbmd0aCgpOyBpKyspIHsgLy8gc3RhcnQgYXQKLQkJCS8vIGluZGV4IDEgYi9jCi0JCQkvLyAxc3QgY2hhciBpcwotCQkJLy8gYWx3YXlzICdfJwotCQkJY2hhciBjID0gcXVhbGlmaWVkVHlwZU5hbWUuY2hhckF0KGkpOwotCQkJaWYgKGMgPT0gJ18nKSB7Ci0JCQkJaW50IGVuZEluZGV4ID0gcXVhbGlmaWVkVHlwZU5hbWUuaW5kZXhPZignXycsIGkgKyAxKTsKLQkJCQlpZiAoZW5kSW5kZXggPT0gLTEpIHsKLQkJCQkJYnVmLmFwcGVuZChjKTsKLQkJCQl9IGVsc2UgewotCQkJCQljaGFyIHVubWFuZ2xlZDsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBvc3NpYmxlID0gcXVhbGlmaWVkVHlwZU5hbWUuc3Vic3RyaW5nKGkgKyAxLCBlbmRJbmRleCk7Ci0JCQkJCQlpZiAoSnNOYW1lTWFuZ2xlclV0aWwuaXNWYWxpZChwb3NzaWJsZSkpIHsKLQkJCQkJCQl1bm1hbmdsZWQgPSAoY2hhcikgSW50ZWdlci5kZWNvZGUoIjB4IiArIHBvc3NpYmxlKS5pbnRWYWx1ZSgpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpID0gZW5kSW5kZXg7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXVubWFuZ2xlZCA9IGM7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl1bm1hbmdsZWQgPSBjOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodW5tYW5nbGVkKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWJ1Zi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNQcm9ibGVtUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzUHJvYmxlbVJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzUwOTgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNQcm9ibGVtUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQ7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVByb2JsZW1SZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5jb21waWxlci5JUHJvYmxlbTsKLQotY2xhc3MgSnNQcm9ibGVtUmVxdWVzdG9yIGltcGxlbWVudHMgSVByb2JsZW1SZXF1ZXN0b3IgewotCXByaXZhdGUgTGlzdCBmQ29sbGVjdGVkUHJvYmxlbXM7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc0FjdGl2ZSA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSXNSdW5uaW5nID0gZmFsc2U7Ci0JCi0JcHVibGljIHZvaWQgYWNjZXB0UHJvYmxlbShJUHJvYmxlbSBwcm9ibGVtKSB7Ci0JCWlmIChpc0FjdGl2ZSgpKSB7Ci0JCQlmQ29sbGVjdGVkUHJvYmxlbXMuYWRkKHByb2JsZW0pOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGJlZ2luUmVwb3J0aW5nKCkgewotCQlmSXNSdW5uaW5nID0gdHJ1ZTsKLQkJZkNvbGxlY3RlZFByb2JsZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBlbmRSZXBvcnRpbmcoKSB7Ci0JCWZJc1J1bm5pbmcgPSBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiBjb2xsZWN0ZWQgcHJvYmxlbXMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDb2xsZWN0ZWRQcm9ibGVtcygpIHsKLQkJcmV0dXJuIGZDb2xsZWN0ZWRQcm9ibGVtczsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCXJldHVybiBmSXNBY3RpdmUgJiYgZkNvbGxlY3RlZFByb2JsZW1zICE9IG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKLQkJcmV0dXJuIGZJc1J1bm5pbmc7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGlzIHByb2JsZW0gcmVxdWVzdG9yLgotCSAqIAotCSAqIEBwYXJhbSBpc0FjdGl2ZQotCSAqICAgICAgICAgICAgdGhlIHN0YXRlIG9mIHRoaXMgcHJvYmxlbSByZXF1ZXN0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0FjdGl2ZShib29sZWFuIGlzQWN0aXZlKSB7Ci0JCWlmIChmSXNBY3RpdmUgIT0gaXNBY3RpdmUpIHsKLQkJCWZJc0FjdGl2ZSA9IGlzQWN0aXZlOwotCQkJaWYgKGZJc0FjdGl2ZSkgewotCQkJCXN0YXJ0Q29sbGVjdGluZ1Byb2JsZW1zKCk7Ci0JCQl9IGVsc2UgewotCQkJCXN0b3BDb2xsZWN0aW5nUHJvYmxlbXMoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUZWxscyB0aGlzIGFubm90YXRpb24gbW9kZWwgdG8gY29sbGVjdCB0ZW1wb3JhcnkgcHJvYmxlbXMgZnJvbSBub3cgb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0Q29sbGVjdGluZ1Byb2JsZW1zKCkgewotCQlmQ29sbGVjdGVkUHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCQotCS8qKgotCSAqIFRlbGxzIHRoaXMgYW5ub3RhdGlvbiBtb2RlbCB0byBubyBsb25nZXIgY29sbGVjdCB0ZW1wb3JhcnkgcHJvYmxlbXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3BDb2xsZWN0aW5nUHJvYmxlbXMoKSB7Ci0JLy8gZG8gbm90aGluZwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNUcmFuc2xhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc1RyYW5zbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkODJiNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc1RyYW5zbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqICAgICAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7IC8vIGltcG9ydAotCQkJCQkJCQkJCQkJCS8vIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7IC8vIGltcG9ydAotCQkJCQkJCQkJCQkvLyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLS8vIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JU291cmNlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0TW9kZWxFeGNlcHRpb247IC8vIGltcG9ydAotCQkJCQkJCQkJCQkJCQkvLyBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkxpYnJhcnlTdXBlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5Xb3JraW5nQ29weU93bmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUuRG9jdW1lbnRDb250ZXh0RnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUuU291cmNlUmVmRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwucHJvamVjdC5Kc1dlYk5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSnNUcmFuc2xhdGlvbiBpbXBsZW1lbnRzIElKc1RyYW5zbGF0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzdHJhbnNsYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotIAkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgSUphdmFTY3JpcHRVbml0IGZDb21waWxhdGlvblVuaXQgPSBudWxsOwotCXByaXZhdGUgRG9jdW1lbnRDb250ZXh0RnJhZ21lbnRSb290IGZEb2N1bWVudFNjb3BlOwotCXByaXZhdGUgSUphdmFTY3JpcHRQcm9qZWN0IGZKYXZhUHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBieXRlW10gZkxvY2sgPSBudWxsOwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBmUHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudCBmSHRtbERvY3VtZW50OwotCXByb3RlY3RlZCBTdHJpbmcgZk1vZGVsQmFzZUxvY2F0aW9uOwotCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQRVJfVFlQRV9OQU1FID0gIldpbmRvdyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQRVJfVFlQRV9MSUJSQVJZID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LmxhdW5jaGluZy5iYXNlQnJvd3NlckxpYnJhcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgSUpzVHJhbnNsYXRvciBmVHJhbnNsYXRvcjsKLQotCXByaXZhdGUgU3RyaW5nIG1hbmdsZWROYW1lOwotCXByb3RlY3RlZCBib29sZWFuIGxpc3RlbkZvckNoYW5nZXM7Ci0KLQlwdWJsaWMgSnNUcmFuc2xhdGlvbigpIHsKLQkJLyogZG8gbm90aGluZyAqLwotCX0KLQkKLQlwdWJsaWMgSUpzVHJhbnNsYXRvciBnZXRUcmFuc2xhdG9yKCkgewotCQlpZihmVHJhbnNsYXRvciE9bnVsbCkgewotCQkJcmV0dXJuIGZUcmFuc2xhdG9yOwotCQl9Ci0JCQotCQlmVHJhbnNsYXRvciA9IG5ldyBKc1RyYW5zbGF0b3IoZkh0bWxEb2N1bWVudCwgZk1vZGVsQmFzZUxvY2F0aW9uLCBsaXN0ZW5Gb3JDaGFuZ2VzKTsKLQkJcmV0dXJuIHRoaXMuZlRyYW5zbGF0b3I7Ci0JfQotCQotCi0JCi0JcHJvdGVjdGVkIEpzVHJhbnNsYXRpb24oSVN0cnVjdHVyZWREb2N1bWVudCBodG1sRG9jdW1lbnQsIElKYXZhU2NyaXB0UHJvamVjdCBqYXZhUHJvaiwgYm9vbGVhbiBsaXN0ZW5Gb3JDaGFuZ2VzKSB7Ci0JCWZMb2NrID0gbmV3IGJ5dGVbMF07Ci0JCWZKYXZhUHJvamVjdCA9IGphdmFQcm9qOwotCQlmSHRtbERvY3VtZW50ID0gaHRtbERvY3VtZW50OwotCQlzZXRCYXNlTG9jYXRpb24oKTsKLQkJbWFuZ2xlZE5hbWUgPSBjcmVhdGVNYW5nbGVkTmFtZSgpOwotCQl0aGlzLmxpc3RlbkZvckNoYW5nZXM9bGlzdGVuRm9yQ2hhbmdlczsKLQl9Ci0KLQlwdWJsaWMgSUpzVHJhbnNsYXRpb24gZ2V0SW5zdGFuY2UoSVN0cnVjdHVyZWREb2N1bWVudCBodG1sRG9jdW1lbnQsIElKYXZhU2NyaXB0UHJvamVjdCBqYXZhUHJvaiwgYm9vbGVhbiBsaXN0ZW5Gb3JDaGFuZ2VzKSB7Ci0JCXJldHVybiBuZXcgSnNUcmFuc2xhdGlvbihodG1sRG9jdW1lbnQsamF2YVByb2osIGxpc3RlbkZvckNoYW5nZXMpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLklKc1RyYW5zbGF0aW9uI2dldEphdmFQcm9qZWN0KCkKLQkgKi8KLQlwdWJsaWMgSUphdmFTY3JpcHRQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlyZXR1cm4gZkphdmFQcm9qZWN0OwotCX0KLQotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0RG9jU2NvcGUoYm9vbGVhbiByZXNldCkgewotCQlpZiAoZkRvY3VtZW50U2NvcGUgPT0gbnVsbCkgewotCQkJLy8gSVByb2plY3QgcHJvamVjdCA9IGdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQkJLy8gSVJlc291cmNlIGFic29sdXRlUm9vdCA9Ci0JCQkvLyAoKElDb250YWluZXIpZ2V0SmF2YVByb2plY3QoKS5nZXRSZXNvdXJjZSgpKS5maW5kTWVtYmVyKAotCQkJLy8gV2ViUm9vdEZpbmRlci5nZXRXZWJDb250ZW50Rm9sZGVyKGZKYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpKTsKLQkJCWZEb2N1bWVudFNjb3BlID0gbmV3IERvY3VtZW50Q29udGV4dEZyYWdtZW50Um9vdChmSmF2YVByb2plY3QsIGdldEZpbGUoKSwgV2ViUm9vdEZpbmRlci5nZXRXZWJDb250ZW50Rm9sZGVyKGZKYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpLCBXZWJSb290RmluZGVyLmdldFNlcnZlckNvbnRleHRSb290KGZKYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpLCBKc1dlYk5hdHVyZS5WSVJUVUFMX1NDT1BFX0VOVFJZKTsKLQkJCWZEb2N1bWVudFNjb3BlLnNldEluY2x1ZGVkRmlsZXMoZ2V0VHJhbnNsYXRvcigpLmdldFJhd0ltcG9ydHMoKSk7Ci0JCQlyZXR1cm4gZkRvY3VtZW50U2NvcGU7Ci0JCX0KLQotCQlpZiAocmVzZXQpCi0JCQlmRG9jdW1lbnRTY29wZS5zZXRJbmNsdWRlZEZpbGVzKGdldFRyYW5zbGF0b3IoKS5nZXRSYXdJbXBvcnRzKCkpOwotCQlyZXR1cm4gZkRvY3VtZW50U2NvcGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEJhc2VMb2NhdGlvbigpIHsKLQkJSURPTU1vZGVsIHhtbE1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmSHRtbERvY3VtZW50KTsKLQkJCWlmICh4bWxNb2RlbCA9PSBudWxsKSB7Ci0JCQkJeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmSHRtbERvY3VtZW50KTsKLQkJCX0KLQkJCWZNb2RlbEJhc2VMb2NhdGlvbiA9IHhtbE1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpCi0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJLy8gcmV0dXJuIHhtbE1vZGVsOwotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gRmlsZUJ1ZmZlcnMuZ2V0V29ya3NwYWNlRmlsZUF0TG9jYXRpb24obmV3IFBhdGgoZk1vZGVsQmFzZUxvY2F0aW9uKSk7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLklKc1RyYW5zbGF0aW9uI2dldEh0bWxEb2N1bWVudCgpCi0JICovCi0JcHVibGljIElEb2N1bWVudCBnZXRIdG1sRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmSHRtbERvY3VtZW50OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSUpzVHJhbnNsYXRpb24jZ2V0TWlzc2luZ1RhZ1N0YXJ0KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pc3NpbmdUYWdTdGFydCgpIHsKLQkJcmV0dXJuIGdldFRyYW5zbGF0b3IoKS5nZXRNaXNzaW5nRW5kVGFnUmVnaW9uU3RhcnQoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRXZWJSb290KCkgewotCQlyZXR1cm4gV2ViUm9vdEZpbmRlci5nZXRXZWJDb250ZW50Rm9sZGVyKGZKYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpLnRvU3RyaW5nKCk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldERpcmVjdG9yeVVuZGVyUm9vdCgpIHsKLQkJU3RyaW5nIHdlYlJvb3QgPSBnZXRXZWJSb290KCk7Ci0JCUlQYXRoIHByb2plY3RXZWJSb290UGF0aCA9IGdldEphdmFQcm9qZWN0KCkuZ2V0UGF0aCgpLmFwcGVuZCh3ZWJSb290KTsKLQkJSVBhdGggZmlsZVBhdGggPSBuZXcgUGF0aChmTW9kZWxCYXNlTG9jYXRpb24pLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJcmV0dXJuIGZpbGVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMocHJvamVjdFdlYlJvb3RQYXRoLm1hdGNoaW5nRmlyc3RTZWdtZW50cyhmaWxlUGF0aCkpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogT3JpZ2luYWxseSBmcm9tIFJlY29uY2lsZVN0ZXBGb3JKYXZhLiBDcmVhdGVzIGFuIElKYXZhU2NyaXB0VW5pdCBmcm9tCi0JICogdGhlIGNvbnRlbnRzIG9mIHRoZSBKU1AgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiBhbiBJSmF2YVNjcmlwdFVuaXQgZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIEpTUCBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgSUphdmFTY3JpcHRVbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgpIHRocm93cyBKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gewotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gZ2V0RG9jU2NvcGUodHJ1ZSk7Ci0JCUlKYXZhU2NyaXB0VW5pdCBjdSA9IHJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KCIiKS5nZXRKYXZhU2NyaXB0VW5pdChnZXRNYW5nbGVkTmFtZSgpICsgSnNEYXRhVHlwZXMuQkFTRV9GSUxFX0VYVEVOU0lPTikuZ2V0V29ya2luZ0NvcHkoZ2V0V29ya2luZ0NvcHlPd25lcigpLCBnZXRQcm9ibGVtUmVxdWVzdG9yKCksIGdldFByb2dyZXNzTW9uaXRvcigpKTsgLy8kTk9OLU5MUy0xJAotCQlJQnVmZmVyIGJ1ZmZlcjsKLQkJdHJ5IHsKLQkJCWJ1ZmZlciA9IGN1LmdldEJ1ZmZlcigpOwotCQl9Ci0JCWNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCWJ1ZmZlciA9IG51bGw7Ci0JCX0KLQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQlnZXRUcmFuc2xhdG9yKCkuc2V0QnVmZmVyKGJ1ZmZlcik7Ci0JCX0KLQkJcmV0dXJuIGN1OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZml4dXBNYW5nbGVkTmFtZShTdHJpbmcgZGlzcGxheVN0cmluZykgewotCQlpZiAoZGlzcGxheVN0cmluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZGlzcGxheVN0cmluZy5yZXBsYWNlQWxsKGdldE1hbmdsZWROYW1lKCkgKyAiLmpzIiwgZ2V0SHRtbFBhZ2VOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNnZXRBbGxFbGVtZW50c0luSnNSYW5nZShpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgSUphdmFTY3JpcHRFbGVtZW50W10gZ2V0QWxsRWxlbWVudHNJbkpzUmFuZ2UoaW50IGphdmFQb3NpdGlvblN0YXJ0LCBpbnQgamF2YVBvc2l0aW9uRW5kKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudFtdIEVNVFBZX1JFU1VMVF9TRVQgPSBuZXcgSUphdmFTY3JpcHRFbGVtZW50WzBdOwotCQlJSmF2YVNjcmlwdEVsZW1lbnRbXSByZXN1bHQgPSBFTVRQWV9SRVNVTFRfU0VUOwotCQlJSmF2YVNjcmlwdEVsZW1lbnRbXSBhbGxDaGlsZHJlbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhbGxDaGlsZHJlbiA9IGdldENvbXBpbGF0aW9uVW5pdCgpLmdldENoaWxkcmVuKCk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJVmVjdG9yIHZhbGlkQ2hpbGRyZW4gPSBuZXcgVmVjdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChhbGxDaGlsZHJlbltpXS5nZXRFbGVtZW50VHlwZSgpICE9IElKYXZhU2NyaXB0RWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJSVNvdXJjZVJhbmdlIHJhbmdlID0gZ2V0SlNTb3VyY2VSYW5nZU9mKGFsbENoaWxkcmVuW2ldKTsKLQkJCQlpZiAoamF2YVBvc2l0aW9uU3RhcnQgPD0gcmFuZ2UuZ2V0T2Zmc2V0KCkgJiYgcmFuZ2UuZ2V0TGVuZ3RoKCkgKyByYW5nZS5nZXRPZmZzZXQoKSA8PSAoamF2YVBvc2l0aW9uRW5kKSkgewotCQkJCQl2YWxpZENoaWxkcmVuLmFkZChhbGxDaGlsZHJlbltpXSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGFsbENoaWxkcmVuW2ldLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LlRZUEUpIHsKLQkJCQkJdmFsaWRDaGlsZHJlbi5hZGQoYWxsQ2hpbGRyZW5baV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAodmFsaWRDaGlsZHJlbi5zaXplKCkgPiAwKSB7Ci0JCQlyZXN1bHQgPSAoSUphdmFTY3JpcHRFbGVtZW50W10pIHZhbGlkQ2hpbGRyZW4udG9BcnJheShuZXcgSUphdmFTY3JpcHRFbGVtZW50W117fSk7Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIEVNVFBZX1JFU1VMVF9TRVQ7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLklKc1RyYW5zbGF0aW9uI2dldENvbXBpbGF0aW9uVW5pdCgpCi0JICovCi0JcHVibGljIElKYXZhU2NyaXB0VW5pdCBnZXRDb21waWxhdGlvblVuaXQoKSB7Ci0JCXN5bmNocm9uaXplZCAoZkxvY2spIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZDb21waWxhdGlvblVuaXQgPT0gbnVsbCkgewotCQkJCQlmQ29tcGlsYXRpb25Vbml0ID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJCXJldHVybiBmQ29tcGlsYXRpb25Vbml0OwotCQkJCX0KLQotCQkJfQotCQkJY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCQlpZiAoSnNUcmFuc2xhdGlvbi5ERUJVRykgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJlcnJvciBjcmVhdGluZyBKU1Agd29ya2luZyBjb3B5Li4uICIsIGptZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQlnZXREb2NTY29wZSh0cnVlKTsKLQkJdHJ5IHsKLQkJCWZDb21waWxhdGlvblVuaXQgPSBmQ29tcGlsYXRpb25Vbml0LmdldFdvcmtpbmdDb3B5KGdldFdvcmtpbmdDb3B5T3duZXIoKSwgZ2V0UHJvYmxlbVJlcXVlc3RvcigpLCBnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkvLyBmQ29tcGlsYXRpb25Vbml0Lm1ha2VDb25zaXN0ZW50KGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCQljYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gZkNvbXBpbGF0aW9uVW5pdDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLklKc1RyYW5zbGF0aW9uI2dldEVsZW1lbnRzRnJvbUpzUmFuZ2UoaW50LCBpbnQpCi0JICovCi0JcHVibGljIElKYXZhU2NyaXB0RWxlbWVudFtdIGdldEVsZW1lbnRzRnJvbUpzUmFuZ2UoaW50IGphdmFQb3NpdGlvblN0YXJ0LCBpbnQgamF2YVBvc2l0aW9uRW5kKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudFtdIEVNVFBZX1JFU1VMVF9TRVQgPSBuZXcgSUphdmFTY3JpcHRFbGVtZW50WzBdOwotCQlJSmF2YVNjcmlwdEVsZW1lbnRbXSByZXN1bHQgPSBFTVRQWV9SRVNVTFRfU0VUOwotCQl0cnkgewotCQkJSUphdmFTY3JpcHRVbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCQlpZiAoY3UgIT0gbnVsbCkgewotCQkJCXN5bmNocm9uaXplZCAoZkxvY2spIHsKLQkJCQkJaW50IGN1RG9jTGVuZ3RoID0gY3UuZ2V0QnVmZmVyKCkuZ2V0TGVuZ3RoKCk7Ci0JCQkJCWludCBqYXZhTGVuZ3RoID0gamF2YVBvc2l0aW9uRW5kIC0gamF2YVBvc2l0aW9uU3RhcnQ7Ci0JCQkJCWlmIChjdURvY0xlbmd0aCA+IDAgJiYgamF2YVBvc2l0aW9uU3RhcnQgPj0gMCAmJiBqYXZhTGVuZ3RoID49IDAgJiYgamF2YVBvc2l0aW9uRW5kIDw9IGN1RG9jTGVuZ3RoKSB7Ci0JCQkJCQlyZXN1bHQgPSBjdS5jb2RlU2VsZWN0KGphdmFQb3NpdGlvblN0YXJ0LCBqYXZhTGVuZ3RoLCBnZXRXb3JraW5nQ29weU93bmVyKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5sZW5ndGggPT0gMCkgewotCQkJCXJldHVybiBFTVRQWV9SRVNVTFRfU0VUOwotCQkJfQotCQl9Ci0JCWNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24geCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbih4KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEh0bWxQYWdlTmFtZSgpIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGZNb2RlbEJhc2VMb2NhdGlvbik7Ci0JCXJldHVybiBwYXRoLmxhc3RTZWdtZW50KCk7Ci0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5qYXZhLklKc1RyYW5zbGF0aW9uI2dldEh0bWxUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh0bWxUZXh0KCkgewotCQlyZXR1cm4gZkh0bWxEb2N1bWVudC5nZXQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFQYXRoKCkgewotCQlJUGF0aCByb290UGF0aCA9IG5ldyBQYXRoKGZNb2RlbEJhc2VMb2NhdGlvbikucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQlTdHJpbmcgY3VQYXRoID0gcm9vdFBhdGguYXBwZW5kKCIvIiArIGdldE1hbmdsZWROYW1lKCkgKyBKc0RhdGFUeXBlcy5CQVNFX0ZJTEVfRVhURU5TSU9OKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBjdVBhdGg7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNnZXRKc0VsZW1lbnRBdE9mZnNldChpbnQpCi0JICovCi0JcHVibGljIElKYXZhU2NyaXB0RWxlbWVudCBnZXRKc0VsZW1lbnRBdE9mZnNldChpbnQganNPZmZzZXQpIHsKLQkJSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnRzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnRzID0gZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0RWxlbWVudEF0KGpzT2Zmc2V0KTsKLQkJfQotCQljYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWlmIChKc1RyYW5zbGF0aW9uLkRFQlVHKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXJyb3IgcmV0cmlldmluZyBqYXZhIGVsZW10bnQgZnJvbSBjb21waWxhdGlvbiB1bml0Li4uICIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkvLyB9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCXByaXZhdGUgSVNvdXJjZVJhbmdlIGdldEpTU291cmNlUmFuZ2VPZihJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCkgewotCQkvLyByZXR1cm5zIHRoZSBvZmZzZXQgaW4gaHRtbCBvZiBnaXZlbiBlbGVtZW50Ci0JCUlTb3VyY2VSYW5nZSByYW5nZSA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWVtYmVyKSB7Ci0JCQl0cnkgewotCQkJCXJhbmdlID0gKChNZW1iZXIpIGVsZW1lbnQpLmdldE5hbWVSYW5nZSgpOwotCQkJfSBjYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTb3VyY2VSZWZFbGVtZW50KSB7Ci0JCQl0cnkgewotCQkJCXJhbmdlID0gKChTb3VyY2VSZWZFbGVtZW50KSBlbGVtZW50KS5nZXRTb3VyY2VSYW5nZSgpOwotCQkJfQotCQkJY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmFuZ2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNnZXRKc1RleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SnNUZXh0KCkgewotCQlyZXR1cm4gZ2V0VHJhbnNsYXRvcigpLmdldEpzVGV4dCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSUpzVHJhbnNsYXRpb24jZ2V0U2NyaXB0UG9zaXRpb25zKCkKLQkgKi8KLQlwdWJsaWMgUG9zaXRpb25bXSBnZXRTY3JpcHRQb3NpdGlvbnMoKSB7Ci0JCXJldHVybiBnZXRUcmFuc2xhdG9yKCkuZ2V0SHRtbExvY2F0aW9ucygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSUpzVHJhbnNsYXRpb24jaW5zZXJ0SW5GaXJzdFNjcmlwdFJlZ2lvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydEluRmlyc3RTY3JpcHRSZWdpb24oU3RyaW5nIHRleHQpIHsKLQkJUG9zaXRpb24gcG9zW10gPSBnZXRTY3JpcHRQb3NpdGlvbnMoKTsKLQkJaW50IHNjcmlwdFN0YXJ0T2Zmc2V0ID0gMDsKLQkJaWYocG9zIT1udWxsICYmIHBvcy5sZW5ndGg+MCkgewotCQkJc2NyaXB0U3RhcnRPZmZzZXQgPSBwb3NbMF0uZ2V0T2Zmc2V0KCk7Ci0JCQkKLQkJfQotCQlTdHJpbmcgaW5zZXJ0VGV4dCA9IChzY3JpcHRTdGFydE9mZnNldD09MD8iIjoiXG4iKSArIHRleHQ7Ci0JCWluc2VydFNjcmlwdChzY3JpcHRTdGFydE9mZnNldCxpbnNlcnRUZXh0KTsKLQkJCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSUpzVHJhbnNsYXRpb24jaW5zZXJ0U2NyaXB0KGludCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnNlcnRTY3JpcHQoaW50IG9mZnNldCwgU3RyaW5nIHRleHQpIHsKLQotCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQlQb3NpdGlvbltdIGluSHRtbCA9IGdldFNjcmlwdFBvc2l0aW9ucygpOwotCQlib29sZWFuIGlzSW5zaWRlRXhpc3RpbmdTY3JpcHRSZWdpb24gPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbkh0bWwubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpbkh0bWxbaV0ub3ZlcmxhcHNXaXRoKG9mZnNldCwgMSkpIHsKLQkJCQkvLyAqIGluc2VydGluZyBpbnRvIGEgc2NyaXB0IHJlZ2lvbgotCQkJCWlzSW5zaWRlRXhpc3RpbmdTY3JpcHRSZWdpb24gPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGluc2VydFRleHQgPSBudWxsOwotCi0JCWlmIChpc0luc2lkZUV4aXN0aW5nU2NyaXB0UmVnaW9uKSB7Ci0JCQlpbnNlcnRUZXh0ID0gdGV4dDsKLQkJfQotCQllbHNlIHsKLQkJCWluc2VydFRleHQgPSBvZmZzZXQgIT0gMCA/ICJcbiIgOiAiIiArICI8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj5cbiIgKyB0ZXh0ICsgIlxuPC9zY3JpcHQ+XG4iOwotCQl9Ci0JLy8JdHJhbnNsYXRvci5kb2N1bWVudEFib3V0VG9CZUNoYW5nZWQobnVsbCk7Ci0KLQkJc3luY2hyb25pemVkIChmTG9jaykgewotCQkJdHJ5IHsKLQkJCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZkh0bWxEb2N1bWVudCk7Ci0JCQkJaWYgKHhtbE1vZGVsID09IG51bGwpIHsKLQkJCQkJeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChmSHRtbERvY3VtZW50KTsKLQkJCQl9Ci0JCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQotCi0JCQkJCXhtbE1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJCQl4bWxNb2RlbC5nZXREb2N1bWVudCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsIG9mZnNldCwgMCwgaW5zZXJ0VGV4dCk7Ci0JCQkJCXhtbE1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCQl0cnkgewotCQkJCQkJeG1sTW9kZWwuc2F2ZSgpOwotCQkJCQl9Ci0KLQkJCQkJY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkge30KLQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHt9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpCi0JCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0KLQkvLwl0cmFuc2xhdG9yLmRvY3VtZW50Q2hhbmdlZChudWxsKTsKLQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFuZ2xlZE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm1hbmdsZWROYW1lOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGNyZWF0ZU1hbmdsZWROYW1lKCkgewotCQlyZXR1cm4gSnNOYW1lTWFuZ2xlclV0aWwubWFuZ2xlKGZNb2RlbEJhc2VMb2NhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgcHJvYmxlbSByZXF1ZXN0b3IgZm9yIHRoZSBKYXZhU2NyaXB0VW5pdCBpbiB0aGlzCi0JICogICAgICAgICBKU1BUcmFuc2xhdGlvbgotCSAqLwotCXByaXZhdGUgSnNQcm9ibGVtUmVxdWVzdG9yIGdldFByb2JsZW1SZXF1ZXN0b3IoKSB7Ci0JCXJldHVybiBDb21waWxhdGlvblVuaXRIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRQcm9ibGVtUmVxdWVzdG9yKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNnZXRQcm9ibGVtcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvYmxlbXMoKSB7Ci0JCUxpc3QgcHJvYmxlbXMgPSBnZXRQcm9ibGVtUmVxdWVzdG9yKCkuZ2V0Q29sbGVjdGVkUHJvYmxlbXMoKTsKLQkJZ2V0UHJvYmxlbVJlcXVlc3RvcigpLmVuZFJlcG9ydGluZygpOwotCQlyZXR1cm4gcHJvYmxlbXMgIT0gbnVsbCA/IHByb2JsZW1zIDogbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCWlmIChmUHJvZ3Jlc3NNb25pdG9yID09IG51bGwpIHsKLQkJCWZQcm9ncmVzc01vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCXJldHVybiBmUHJvZ3Jlc3NNb25pdG9yOwotCX0KLQotCXB1YmxpYyBXb3JraW5nQ29weU93bmVyIGdldFdvcmtpbmdDb3B5T3duZXIoKSB7Ci0JCXJldHVybiBDb21waWxhdGlvblVuaXRIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRXb3JraW5nQ29weU93bmVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNpZk9mZnNldEluSW1wb3J0Tm9kZShpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaWZPZmZzZXRJbkltcG9ydE5vZGUoaW50IG9mZnNldCkgewotCQlQb3NpdGlvbltdIGltcG9ydFJhbmdlcyA9IGdldFRyYW5zbGF0b3IoKS5nZXRJbXBvcnRIdG1sUmFuZ2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0UmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaW1wb3J0UmFuZ2VzW2ldLmluY2x1ZGVzKG9mZnNldCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5JSnNUcmFuc2xhdGlvbiNyZWNvbmNpbGVDb21waWxhdGlvblVuaXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlY29uY2lsZUNvbXBpbGF0aW9uVW5pdCgpIHsKLQkJLy8gaWYodHJ1ZSkgcmV0dXJuOwotCQlJSmF2YVNjcmlwdFVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKLQkJaWYgKGZDb21waWxhdGlvblVuaXQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChjdSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXN5bmNocm9uaXplZCAoZkxvY2spIHsKLQkJCQkJLy8gaWYoZmFsc2UpCi0JCQkJCS8vIGN1Lm1ha2VDb25zaXN0ZW50KGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJY3UucmVjb25jaWxlKElKYXZhU2NyaXB0VW5pdC5OT19BU1QsIHRydWUsIGdldFdvcmtpbmdDb3B5T3duZXIoKSwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSUpzVHJhbnNsYXRpb24jcmVsZWFzZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYgKGdldFRyYW5zbGF0b3IoKSAhPSBudWxsKQotCQkJZ2V0VHJhbnNsYXRvcigpLnJlbGVhc2UoKTsKLQkJc3luY2hyb25pemVkIChmTG9jaykgewotCQkJaWYgKGZDb21waWxhdGlvblVuaXQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChKc1RyYW5zbGF0aW9uLkRFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigtKSBKU1BUcmFuc2xhdGlvbiBbIiArIHRoaXMgKyAiXSBkaXNjYXJkaW5nIEphdmFTY3JpcHRVbml0OiAiICsgZkNvbXBpbGF0aW9uVW5pdCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWZDb21waWxhdGlvblVuaXQuZGlzY2FyZFdvcmtpbmdDb3B5KCk7Ci0JCQkJfQotCQkJCWNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkvLyB3ZSdyZSBkb25lIHcvIGl0IGFueXdheQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSUpzVHJhbnNsYXRpb24jc2V0UHJvYmxlbUNvbGxlY3RpbmdBY3RpdmUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ibGVtQ29sbGVjdGluZ0FjdGl2ZShib29sZWFuIGNvbGxlY3QpIHsKLQkJSUphdmFTY3JpcHRVbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCWlmIChjdSAhPSBudWxsKSB7Ci0JCQlnZXRQcm9ibGVtUmVxdWVzdG9yKCkuc2V0SXNBY3RpdmUoY29sbGVjdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGFzc3BhdGhDaGFuZ2UoKSB7Ci0KLQkJaWYgKGZEb2N1bWVudFNjb3BlICE9IG51bGwpIHsKLQkJCWZEb2N1bWVudFNjb3BlLmNsYXNzcGF0aENoYW5nZSgpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNUcmFuc2xhdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNUcmFuc2xhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThlM2FkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzVHJhbnNsYXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqICAgICAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkphdmFTY3JpcHRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0KLSAqIDxicj48YnI+IHRoaXMgYWRhcHRlciBsb2FkcyB0cmFuc2xhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIGV4dGVuc2lvbiBwb2ludHMuICB0aGlzIGlzIHRvIGFsbG93IG1vcmUgY29tcGxpY2F0ZWQgaHRtbC9qcyB0cmFuc2xhdGlvbnMgdGhyb3VnaCBleHRlbnNpb25zLgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpzVHJhbnNsYXRpb25BZGFwdGVyIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyLCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzdHJhbnNsYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZkh0bWxEb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBJSnNUcmFuc2xhdGlvbiBmSlNQVHJhbnNsYXRpb24gPSBudWxsOwotCXByaXZhdGUgTnVsbFByb2dyZXNzTW9uaXRvciBmVHJhbnNsYXRpb25Nb25pdG9yID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBiYXNlTG9jYXRpb247Ci0JcHJpdmF0ZSBib29sZWFuIGxpc3RlbkZvckNoYW5nZXM9ZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU9SSVRZX0FUVFJJQiA9ICJwcmlvcml0eSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0FUVFJJQiA9ICJjbGFzcyI7Ci0JcHJpdmF0ZSBJSnNUcmFuc2xhdGlvbiBmVHJhbnNsYXRpb25FbGVtZW50OwotCQotCXB1YmxpYyBKc1RyYW5zbGF0aW9uQWRhcHRlcihJRE9NTW9kZWwgeG1sTW9kZWwpIHsKLQkJZkh0bWxEb2N1bWVudCA9IHhtbE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQliYXNlTG9jYXRpb24gPSB4bWxNb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJaW5pdGlhbGl6ZUphdmFQbHVnaW5zKCk7Ci0JCQotCQkKLQl9Ci0JcHVibGljIHZvaWQgc2hvdWxkTGlzdGVuRm9yQ2hhbmdlcyhib29sZWFuIGxpc3RlbkZvclByb2plY3RDaGFuZ2VzKSB7Ci0JCWlmKGxpc3RlbkZvclByb2plY3RDaGFuZ2VzKSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUphdmFTY3JpcHRQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlJSmF2YVNjcmlwdFByb2plY3QgamF2YVByb2plY3QgPSBudWxsOwotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSVBhdGggZmlsZVBhdGggPSBuZXcgUGF0aChiYXNlTG9jYXRpb24pOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJaWYgKGZpbGVQYXRoLnNlZ21lbnRDb3VudCgpID4gMCkgewotCQkJcHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChmaWxlUGF0aC5zZWdtZW50KDApKTsKLQkJfQotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlqYXZhUHJvamVjdCA9IEphdmFTY3JpcHRDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJfQotCQkKLQkJcmV0dXJuIGphdmFQcm9qZWN0OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKU1BUcmFuc2xhdGlvbiBmb3IgdGhpcyBhZGFwdGVyLgotCSAqIAotCSAqIEByZXR1cm4gYSBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbgotCSAqLwotCXB1YmxpYyBJSnNUcmFuc2xhdGlvbiBnZXRKU1BUcmFuc2xhdGlvbihib29sZWFuIGxpc3RlbkZvckNoYW5nZXMpIHsKLQkJaWYgKGZKU1BUcmFuc2xhdGlvbiA9PSBudWxsIHx8ICghdGhpcy5saXN0ZW5Gb3JDaGFuZ2VzICYmIGxpc3RlbkZvckNoYW5nZXMpKSB7Ci0JCQlpZihmSlNQVHJhbnNsYXRpb24hPW51bGwpIGZKU1BUcmFuc2xhdGlvbi5yZWxlYXNlKCk7Ci0JCQlpZihmVHJhbnNsYXRpb25FbGVtZW50PT1udWxsKSB7Ci0JCQkJLyogbG9hZCB0aGUgdHJhbnNsYXRpb24gZmFjdG9yeSBmcm9tIHRoZSBleHRlbnNpb24gcG9pbnQgKi8KLQkJCQl0cnkgewotCQkJCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJCSAgICBJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSAgcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHRQcmVQcm9jZXNzb3IiKTsKLQkJCQkgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IHBvaW50c1tdID0gZXh0ZW5zaW9uUG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJIC8vICAgaW50W10gcHJpb3JpdGllcyA9IG5ldyBpbnRbcG9pbnRzLmxlbmd0aF07Ci0JCQkJICAgCi0JCQkJICAgIGludCBoaWdoZXN0UHJpb3JpdHlWYWx1ZSA9IC0xOwotCQkJCSAgICBpbnQgaGlnaGVzdFByaW9yaXR5SW5kZXggPSAtMTsKLQkJCQkgICAgCi0JCQkJICAgIGZvcihpbnQgaSA9IDA7aSA8IHBvaW50cy5sZW5ndGg7aSsrKXsKLQkJCQkgICAgCVN0cmluZyBwcmlvcml0eSA9IHBvaW50c1tpXS5nZXRBdHRyaWJ1dGUoUFJJT1JJVFlfQVRUUklCKTsKLQkJCQkgICAgCWludCB2YWx1ZSA9IEludGVnZXIucGFyc2VJbnQocHJpb3JpdHkpOwotCQkJCSAgICAJaWYodmFsdWU+aGlnaGVzdFByaW9yaXR5VmFsdWUpIHsKLQkJCQkgICAgCQloaWdoZXN0UHJpb3JpdHlJbmRleCA9IGk7Ci0JCQkJICAgIAkJaGlnaGVzdFByaW9yaXR5VmFsdWUgPSB2YWx1ZTsKLQkJCQkgICAgCX0KLQkJCQkgICAgICAgCi0JCQkJICAgIH0KLQkJCQkgICAgZlRyYW5zbGF0aW9uRWxlbWVudCA9IChJSnNUcmFuc2xhdGlvbilwb2ludHNbaGlnaGVzdFByaW9yaXR5SW5kZXhdLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvL2ZKU1BUcmFuc2xhdGlvbiA9IG5ldyBKc1RyYW5zbGF0aW9uKGZIdG1sRG9jdW1lbnQsIGdldEphdmFQcm9qZWN0KCksbGlzdGVuRm9yQ2hhbmdlcyk7Ci0JCQlmSlNQVHJhbnNsYXRpb24gPSBmVHJhbnNsYXRpb25FbGVtZW50LmdldEluc3RhbmNlKGZIdG1sRG9jdW1lbnQsIGdldEphdmFQcm9qZWN0KCksIGxpc3RlbkZvckNoYW5nZXMpOwotCQkJdGhpcy5saXN0ZW5Gb3JDaGFuZ2VzPWxpc3RlbkZvckNoYW5nZXM7Ci0JCX0KLQkJc2hvdWxkTGlzdGVuRm9yQ2hhbmdlcyhsaXN0ZW5Gb3JDaGFuZ2VzKTsKLQkJcmV0dXJuIGZKU1BUcmFuc2xhdGlvbjsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVKYXZhUGx1Z2lucygpIHsKLQkJSmF2YVNjcmlwdENvcmUuZ2V0UGx1Z2luKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUuZXF1YWxzKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7fQotCQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChmVHJhbnNsYXRpb25Nb25pdG9yICE9IG51bGwpIHsKLQkJCWZUcmFuc2xhdGlvbk1vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0JCX0KLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWlmIChmSlNQVHJhbnNsYXRpb24gIT0gbnVsbCkgewotCQkJaWYgKEpzVHJhbnNsYXRpb25BZGFwdGVyLkRFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgcmVsZWFzaW5nOiIgKyBmSlNQVHJhbnNsYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlmSlNQVHJhbnNsYXRpb24ucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlJUHJvamVjdCBjaGFuZ2VkUHJvamVjdCA9IChldmVudD09bnVsbCB8fCBldmVudC5nZXRSZXNvdXJjZSgpPT1udWxsKT9udWxsOmV2ZW50LmdldFJlc291cmNlKCkuZ2V0UHJvamVjdCgpOwotCQlpZihjaGFuZ2VkUHJvamVjdCE9bnVsbCAmJiBnZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5lcXVhbHMoY2hhbmdlZFByb2plY3QpICYmIGZKU1BUcmFuc2xhdGlvbiE9bnVsbCl7Ci0JCQlmSlNQVHJhbnNsYXRpb24uY2xhc3NwYXRoQ2hhbmdlKCk7Ci0JCX0JCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGY4MDhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQ7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAgICAgCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0KLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEpzVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgewotCS8vIGZvciBkZWJ1Z2dpbmcKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXByaXZhdGUgYm9vbGVhbiBsaXN0ZW5Gb3JQcm9qZWN0Q2hhbmdlczsKLQkKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanN0cmFuc2xhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0gCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCXByaXZhdGUgSnNUcmFuc2xhdGlvbkFkYXB0ZXIgZkFkYXB0ZXIgPSBudWxsOwotCQotCXB1YmxpYyBKc1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKElKc1RyYW5zbGF0aW9uLmNsYXNzLCB0cnVlKTsKLQkJbGlzdGVuRm9yUHJvamVjdENoYW5nZXMgPSB0cnVlOwotCX0KLQkKLQkKLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gbmV3IEpzVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSgpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElET01Ob2RlICYmIGZBZGFwdGVyID09IG51bGwpIHsKLQkJCWZBZGFwdGVyID0gbmV3IEpzVHJhbnNsYXRpb25BZGFwdGVyKCgoSURPTU5vZGUpIHRhcmdldCkuZ2V0TW9kZWwoKSk7Ci0JCQlpZiAoSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5LkRFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIoKykgSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSBbIiArIHRoaXMgKyAiXSBjcmVhdGVkIGFkYXB0ZXI6ICIgKyBmQWRhcHRlcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JCXJldHVybiBmQWRhcHRlcjsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYgKGZBZGFwdGVyICE9IG51bGwpIHsKLQkJCWlmIChKc1RyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkuREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigtKSBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IFsiICsgdGhpcyArICJdIHJlbGVhc2luZyBhZGFwdGVyOiAiICsgZkFkYXB0ZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWZBZGFwdGVyLnJlbGVhc2UoKTsKLQkJfQotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cEFkYXB0ZXJGYWN0b3J5KElTdHJ1Y3R1cmVkTW9kZWwgc20pIHsKLQkJaWYgKHNtLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoSUpzVHJhbnNsYXRpb24uY2xhc3MpID09IG51bGwpIHsKLQkJCUpzVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEpzVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSgpOwotCQkJc20uZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzVHJhbnNsYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Kc1RyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYwOWEwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L0pzVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAgICAgCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQotICogVHJhbnNsYXRlcyBhIEpTUC9IVE1MIGRvY3VtZW50IGludG8gaXRzIEphdmFTY3JpcHQgcGllY2VzLiAKLSAqIAotICogQGF1dGhvciBjaGlsZHNiCi0gKi8KLXB1YmxpYyBjbGFzcyBKc1RyYW5zbGF0b3IgZXh0ZW5kcyBKb2IgaW1wbGVtZW50cyBJSnNUcmFuc2xhdG9yewotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1NBVkVfT1VUUFVUID0gZmFsc2U7ICAvLyJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9kZWJ1Zy9qc3RyYW5zbGF0aW9uc3RvZGlzayIpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRMID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVNT1ZFX1hNTF9DT01NRU5UID0gdHJ1ZTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NPTU1FTlRfU1RBUlQgPSAiPCEtLSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NPTU1FTlRfRU5EID0gIi0tPiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanNqYXZhbWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0gCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZDdXJyZW50Tm9kZTsKLQlwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIGZTY3JpcHRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50IGZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBudWxsOwotCXByb3RlY3RlZCBBcnJheUxpc3QgaW1wb3J0TG9jYXRpb25zSW5IdG1sID0gbmV3IEFycmF5TGlzdCgpOwotCS8qIHVzZSBqYXZhIHNjcmlwdCBieSBkZWZhdWx0ICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZklzR2xvYmFsSnMgPSB0cnVlOwotCXByb3RlY3RlZCBBcnJheUxpc3QgcmF3SW1wb3J0cyA9IG5ldyBBcnJheUxpc3QoKTsgLy8gdHJhc2xhdGVkCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBzY3JpcHRMb2NhdGlvbkluSHRtbCA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgaW50IHNjcmlwdE9mZnNldCA9IDA7Ci0JCi0JcHJvdGVjdGVkIGJ5dGVbXSBmTG9jayA9IG5ldyBieXRlWzBdOwotCXByb3RlY3RlZCBieXRlW10gZmluaXNoZWQgPSBuZXcgYnl0ZVswXTsKLQkKLQlwcm90ZWN0ZWQgSUJ1ZmZlciBmQ29tcFVuaXRCdWZmOwotCXByb3RlY3RlZCBib29sZWFuIGNhbmNlbFBhcnNlID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGludCBtaXNzaW5nRW5kVGFnUmVnaW9uU3RhcnQgPSAtMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQUREX1NFTUlDT0xPTl9BVF9JTkxJTkU9dHJ1ZTsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0dsb2JhbEpzKCkgewotCQlyZXR1cm4gZklzR2xvYmFsSnM7Ci0JfQotCQotCXByb3RlY3RlZCBJQnVmZmVyIGdldENvbXBVbml0QnVmZmVyKCkgewotCQlyZXR1cm4gZkNvbXBVbml0QnVmZjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBnZXRTY3JpcHRUZXh0QnVmZmVyKCkgewotCQlyZXR1cm4gZlNjcmlwdFRleHQ7Ci0JfQotCQotCQotCXByb3RlY3RlZCB2b2lkIHNldElzR2xvYmFsSnMoYm9vbGVhbiB2YWx1ZSkgewotCQl0aGlzLmZJc0dsb2JhbEpzID0gdmFsdWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkdmFuY2VOZXh0Tm9kZSgpIHsKLQkJc2V0Q3VycmVudE5vZGUoZ2V0Q3VycmVudE5vZGUoKS5nZXROZXh0KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjbGVhbnVwWG1sUXVvdGVzKCkgewotCQlpZihSRU1PVkVfWE1MX0NPTU1FTlQpIHsKLQkJCWludCBpbmRleCA9IC0xOwotCQkJaW50IHJlcGxhY2VMZW5ndGggID0gWE1MX0NPTU1FTlRfU1RBUlQubGVuZ3RoKCk7Ci0JCQl3aGlsZSgoaW5kZXggPSBmU2NyaXB0VGV4dC5pbmRleE9mKFhNTF9DT01NRU5UX1NUQVJULCBpbmRleCkpID4gLTEpIHsKLQkJCQlmU2NyaXB0VGV4dC5yZXBsYWNlKGluZGV4LCBpbmRleCArIHJlcGxhY2VMZW5ndGgsIG5ldyBTdHJpbmcoVXRpbC5nZXRQYWQocmVwbGFjZUxlbmd0aCkpKTsKLQkJCX0KLQkJCQotCQkJaW5kZXggPSAtMTsKLQkJCXJlcGxhY2VMZW5ndGggID0gWE1MX0NPTU1FTlRfRU5ELmxlbmd0aCgpOwotCQkJd2hpbGUoKGluZGV4ID0gZlNjcmlwdFRleHQuaW5kZXhPZihYTUxfQ09NTUVOVF9FTkQsIGluZGV4KSkgPiAtMSkgewotCQkJCWZTY3JpcHRUZXh0LnJlcGxhY2UoaW5kZXgsIGluZGV4ICsgcmVwbGFjZUxlbmd0aCwgbmV3IFN0cmluZyhVdGlsLmdldFBhZChyZXBsYWNlTGVuZ3RoKSkpOwotCQkJfQotCQl9Ci0JfQotCQotCQotCQotCQotCXB1YmxpYyBKc1RyYW5zbGF0b3IoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgCVN0cmluZyBmaWxlTmFtZSkgewotCQlzdXBlcigiSmF2YVNjcmlwdCB0cmFuc2xhdGlvbiBmb3IgOiAiICArIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlmU3RydWN0dXJlZERvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCQotCQlmU3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JCXNldFByaW9yaXR5KEpvYi5MT05HKTsKLQkJc2V0U3lzdGVtKHRydWUpOwotCQlzY2hlZHVsZSgpOwotCQlyZXNldCgpOwotCX0KLQkKLQlwdWJsaWMgSnNUcmFuc2xhdG9yKCkgewotCQlzdXBlcigiSmF2YVNjcmlwdCBUcmFuc2xhdGlvbiIpOwotCX0KLQkKLQlwdWJsaWMgSnNUcmFuc2xhdG9yKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIAlTdHJpbmcgZmlsZU5hbWUsIGJvb2xlYW4gbGlzdGVuRm9yQ2hhbmdlcykgewotCQlzdXBlcigiSmF2YVNjcmlwdCB0cmFuc2xhdGlvbiBmb3IgOiAiICArIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlmU3RydWN0dXJlZERvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWlmKGxpc3RlbkZvckNoYW5nZXMpIHsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQkJCXNldFByaW9yaXR5KEpvYi5MT05HKTsKLQkJCXNldFN5c3RlbSh0cnVlKTsKLQkJCXNjaGVkdWxlKCk7Ci0JCX0KLQkJcmVzZXQoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdG9yI2dldEpzVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKc1RleHQoKSB7Ci0JCXN5bmNocm9uaXplZChmaW5pc2hlZCkgewotCQkJcmV0dXJuIGZTY3JpcHRUZXh0LnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdG9yI2dldEN1cnJlbnROb2RlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRDdXJyZW50Tm9kZSgpIHsKLQkJCi0JCXJldHVybiBmQ3VycmVudE5vZGU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciNzZXRCdWZmZXIob3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JQnVmZmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJ1ZmZlcihJQnVmZmVyIGJ1ZmZlcikgewotCQlmQ29tcFVuaXRCdWZmID0gYnVmZmVyOwotCQlzeW5jaHJvbml6ZWQoZmluaXNoZWQpIHsKLQkJCWZDb21wVW5pdEJ1ZmYuc2V0Q29udGVudHMoZlNjcmlwdFRleHQudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0b3IjZ2V0SHRtbExvY2F0aW9ucygpCi0JICovCi0JcHVibGljIFBvc2l0aW9uW10gZ2V0SHRtbExvY2F0aW9ucygpIHsKLQkJc3luY2hyb25pemVkKGZpbmlzaGVkKSB7Ci0JCQlyZXR1cm4gKFBvc2l0aW9uW10pIHNjcmlwdExvY2F0aW9uSW5IdG1sLnRvQXJyYXkobmV3IFBvc2l0aW9uW3NjcmlwdExvY2F0aW9uSW5IdG1sLnNpemUoKV0pOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdG9yI2dldE1pc3NpbmdFbmRUYWdSZWdpb25TdGFydCgpCi0JICovCi0JcHVibGljIGludCBnZXRNaXNzaW5nRW5kVGFnUmVnaW9uU3RhcnQoKSB7Ci0JCXJldHVybiBtaXNzaW5nRW5kVGFnUmVnaW9uU3RhcnQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciNnZXRJbXBvcnRIdG1sUmFuZ2VzKCkKLQkgKi8KLQlwdWJsaWMgUG9zaXRpb25bXSBnZXRJbXBvcnRIdG1sUmFuZ2VzKCkgewotCQlzeW5jaHJvbml6ZWQoZmluaXNoZWQpIHsKLQkJCXJldHVybiAoUG9zaXRpb25bXSkgaW1wb3J0TG9jYXRpb25zSW5IdG1sLnRvQXJyYXkobmV3IFBvc2l0aW9uW2ltcG9ydExvY2F0aW9uc0luSHRtbC5zaXplKCldKTsKLQkJfQotCX0KLQkKLQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciNnZXRSYXdJbXBvcnRzKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UmF3SW1wb3J0cygpIHsKLQkJc3luY2hyb25pemVkKGZpbmlzaGVkKSB7Ci0JCQlyZXR1cm4gKFN0cmluZ1tdKSB0aGlzLnJhd0ltcG9ydHMudG9BcnJheShuZXcgU3RyaW5nW3Jhd0ltcG9ydHMuc2l6ZSgpXSk7Ci0JCX0KLQl9Ci0KLQkJCi0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSB0cmFuc2xhdG9yJ3MgcHJvZ3JzcyBtb25pdG9yLCBmYWxzZSBpZiB0aGUKLQkgKiAgICAgICAgIG1vbml0b3IgaXMgbnVsbAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0JCXJldHVybiBjYW5jZWxQYXJzZTsKLQl9Ci0JCi0JLyoqCi0JICogUmVpbml0aWFsaXplIHNvbWUgZmllbGRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7Ci0JCXN5bmNocm9uaXplZChmTG9jaykgewotCQkJc2NyaXB0T2Zmc2V0ID0gMDsKLQkJCS8vIHJlc2V0IHByb2dyZXNzIG1vbml0b3IKLQkJCWNhbmNlbFBhcnNlID0gZmFsc2U7Ci0JCQlmU2NyaXB0VGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZDdXJyZW50Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCXJhd0ltcG9ydHMuY2xlYXIoKTsKLQkJCWltcG9ydExvY2F0aW9uc0luSHRtbC5jbGVhcigpOwotCQkJc2NyaXB0TG9jYXRpb25Jbkh0bWwuY2xlYXIoKTsKLQkJCW1pc3NpbmdFbmRUYWdSZWdpb25TdGFydCA9IC0xOwotCQl9Ci0JCXRyYW5zbGF0ZSgpOwotCX0KLQotCi0JCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2V0Q3VycmVudE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSkgewotCQlzeW5jaHJvbml6ZWQoZkxvY2spIHsKLQkJCXJldHVybiB0aGlzLmZDdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciN0cmFuc2xhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHRyYW5zbGF0ZSgpIHsKLQkJLy9zZXRDdXJyZW50Tm9kZShmU3RydWN0dXJlZERvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkKLQkJc3luY2hyb25pemVkKGZpbmlzaGVkKSB7Ci0JCQl3aGlsZSAoZ2V0Q3VycmVudE5vZGUoKSAhPSBudWxsICYmICFpc0NhbmNlbGVkKCkpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlRyYW5zbGF0b3IgTG9va2luZyBhdCBOb2RlCi0JCQkJLy8gdHlwZToiK2dldEN1cnJlbnROb2RlKCkuZ2V0VHlwZSgpKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS06Iik7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKG5ldyBOb2RlSGVscGVyKGdldEN1cnJlbnROb2RlKCkpKTsKLQkJCQkvLyBpLnByaW50bG4oIi8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLQkJCQlpZiAoZ2V0Q3VycmVudE5vZGUoKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQkJTm9kZUhlbHBlciBuaCA9IG5ldyBOb2RlSGVscGVyKGdldEN1cnJlbnROb2RlKCkpOwotCQkJCQlpZiAoKCFuaC5pc0VuZFRhZygpIHx8IG5oLmlzU2VsZkNsb3NpbmdUYWcoKSkgJiYgbmgubmFtZUVxdWFscygic2NyaXB0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLyoKLQkJCQkJCSAqIEhhbmRsZXMgdGhlIGZvbGxvd2luZyBjYXNlczogPHNjcmlwdAotCQkJCQkJICogdHlwZT0iamF2YXNjcmlwdHlwZSI+IDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHR5cGU+Ci0JCQkJCQkgKiA8c2NyaXB0IHNyYz0nJyB0eXBlPWphdmFzY3JpcHR5cGU+IDxzY3JpcHQgc3JjPScnCi0JCQkJCQkgKiBsYW5ndWFnZT1qYXZhc2NyaXB0dHlwZSA8c2NyaXB0IHNyYz0nJz4gZ2xvYmFsIGpzIHR5cGUuCi0JCQkJCQkgKiA8c2NyaXB0PiAoZ2xvYmFsIGpzIHR5cGUpCi0JCQkJCQkgKi8KLQkJCQkJCWlmIChOb2RlSGVscGVyLmlzSW5BcnJheShKc0RhdGFUeXBlcy5KU1ZBTElEREFUQVRZUEVTLCBuaC5nZXRBdHRyaWJ1dGVWYWx1ZSgidHlwZSIpKSB8fCBOb2RlSGVscGVyLmlzSW5BcnJheShKc0RhdGFUeXBlcy5KU1ZBTElEREFUQVRZUEVTLCBuaC5nZXRBdHRyaWJ1dGVWYWx1ZSgibGFuZ3VhZ2UiKSkgfHwgaXNHbG9iYWxKcygpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCWlmIChuaC5jb250YWluc0F0dHJpYnV0ZShuZXcgU3RyaW5nW10geyAic3JjIiB9KSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCS8vIEhhbmRsZSBpbXBvcnQKLQkJCQkJCQkJdHJhbnNsYXRlU2NyaXB0SW1wb3J0Tm9kZShnZXRDdXJyZW50Tm9kZSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gfSBlbHNlIHsKLQkJCQkJCQkvLyBoYW5kbGUgc2NyaXB0IHNlY3Rpb24KLQkJCQkJCQkKLQkJCQkJCQlpZiAoZ2V0Q3VycmVudE5vZGUoKS5nZXROZXh0KCkgIT0gbnVsbCAvKiYmIGdldEN1cnJlbnROb2RlKCkuZ2V0TmV4dCgpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQqLykgewotCQkJCQkJCQl0cmFuc2xhdGVKU05vZGUoZ2V0Q3VycmVudE5vZGUoKS5nZXROZXh0KCkpOwotCQkJCQkJCX0KLQkJCQkJCX0gLy8gRW5kIHNlYXJjaCBmb3IgPHNjcmlwdD4gc2VjdGlvbnMKLQkJCQkJfSBlbHNlIGlmIChuaC5jb250YWluc0F0dHJpYnV0ZShKc0RhdGFUeXBlcy5IVE1MQVRSRVZFTlRTKSkgewotCQkJCQkJLyogQ2hlY2sgZm9yIGVtYmVkZWQgSlMgZXZlbnRzIGluIGFueSB0YWdzICovCi0JCQkJCQl0cmFuc2xhdGVJbmxpbmVKU05vZGUoZ2V0Q3VycmVudE5vZGUoKSk7Ci0JCQkJCX0gZWxzZSBpZiAobmgubmFtZUVxdWFscygiTUVUQSIpICYmIG5oLmF0dHJFcXVhbHMoImh0dHAtZXF1aXYiLCAiQ29udGVudC1TY3JpcHQtVHlwZSIpICYmIG5oLmNvbnRhaW5zQXR0cmlidXRlKG5ldyBTdHJpbmdbXSB7ICJjb250ZW50IiB9KSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJCQkvLyA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0eXBlIj4KLQkJCQkJCXNldElzR2xvYmFsSnMoIE5vZGVIZWxwZXIuaXNJbkFycmF5KEpzRGF0YVR5cGVzLkpTVkFMSUREQVRBVFlQRVMsIG5oLmdldEF0dHJpYnV0ZVZhbHVlKCJjb250ZW50IikpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IC8vIEVuZCBiaWcgaWYgb2YgSlMgdHlwZXMKLQkJCQl9Ci0JCQkJaWYgKGdldEN1cnJlbnROb2RlKCkgIT0gbnVsbCkgewotCQkJCQlhZHZhbmNlTmV4dE5vZGUoKTsKLQkJCQl9Ci0JCQl9IC8vIGVuZCB3aGlsZSBsb29wCi0JCQlpZihnZXRDb21wVW5pdEJ1ZmZlcigpIT1udWxsKSBnZXRDb21wVW5pdEJ1ZmZlcigpLnNldENvbnRlbnRzKGZTY3JpcHRUZXh0LnRvU3RyaW5nKCkpOwotCQl9Ci0JCWZpbmlzaGVkVHJhbnNsYXRpb24oKTsKLQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZmluaXNoZWRUcmFuc2xhdGlvbigpIHsKLQkJaWYoREVCVUdfU0FWRV9PVVRQVVQpewotCQkJSURPTU1vZGVsIHhtbE1vZGVsID0gbnVsbDsKLQkJCVN0cmluZyBiYXNlTG9jYXRpb24gPSBudWxsOwotCQkJRmlsZU91dHB1dFN0cmVhbSBmb3V0ID0gbnVsbDsKLQkJCVByaW50U3RyZWFtIG91dCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJCQlpZiAoeG1sTW9kZWwgPT0gbnVsbCkgewotCQkJCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkJCX0KLQkJCQliYXNlTG9jYXRpb24gPSB4bWxNb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKQotCQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJCQotCQkJaWYoYmFzZUxvY2F0aW9uIT1udWxsKXsKLQkJCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCQlJV29ya3NwYWNlUm9vdCByb290ID0gd29ya3NwYWNlLmdldFJvb3QoKTsKLQkJCQlJRmlsZSB0RmlsZSA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChiYXNlTG9jYXRpb24gKyAiLmpzIikpOwotCQkJCUZpbGUgdGVtcEZpbGUgPSB0RmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpOwotCQkJCQotCQkJCSAgaWYodGVtcEZpbGUuZXhpc3RzKCkpewotCQkJCQkgIHRlbXBGaWxlLmRlbGV0ZSgpOwotCQkJCSAgfQotCQkJCSAKLQkJCQkgIHRyeSB7Ci0JCQkJCSAgdGVtcEZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCQkJCQkgIGZvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wRmlsZSk7Ci0JCQkJCSAgb3V0ID0gbmV3IFByaW50U3RyZWFtKGZvdXQpOwotCQkJCQkgIG91dC5wcmludGxuKGZTY3JpcHRUZXh0KTsKLQkJCQkJICBvdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCi0JCQkJfWZpbmFsbHl7Ci0JCQkJCWlmKG91dCE9bnVsbCkgb3V0LmNsb3NlKCk7Ci0JCQkJCi0JCQkJCQotCQkJCX0KLQkJCQkgdHJ5IHsKLQkJCQkJcm9vdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCi0JCQkJfQotCQkJfQotCQkJCi0JCX0KLQkJCi0JCWNsZWFudXBYbWxRdW90ZXMoKTsKLQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdG9yI3RyYW5zbGF0ZUlubGluZUpTTm9kZShvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHRyYW5zbGF0ZUlubGluZUpTTm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRhaW5lcikgewotCQkvLyBTeXN0ZW0ub3V0Ci0JCS8vIC5wcmludGxuKCJKU1BUcmFuc2xhdG9yLnRyYW5zbGF0ZUlubGluZUpTTm9kZSBFbnRlcmVkCi0JCS8vIHcvU2NyaXB0T2Zmc2V0OiIKLQkJLy8gKyBzY3JpcHRPZmZzZXQpOwotCQkKLQkJCU5vZGVIZWxwZXIgbmggPSBuZXcgTm9kZUhlbHBlcihjb250YWluZXIpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpbmxpbmUganMgbm9kZSBsb29raW5nIGF0OlxuIiArIG5oKTsKLQkJCS8qIHN0YXJ0IGEgZnVuY3Rpb24gaGVhZGVyLi4gd2lsbCBhbWVuZCBsYXRlciAqLwotCQkJSVRleHRSZWdpb25MaXN0IHQgPSBjb250YWluZXIuZ2V0UmVnaW9ucygpOwotCQkJSVRleHRSZWdpb24gcjsKLQkJCUl0ZXJhdG9yIHJlZ2lvbkl0ZXJhdG9yID0gdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHJlZ2lvbkl0ZXJhdG9yLmhhc05leHQoKSAmJiAhaXNDYW5jZWxlZCgpICkgewotCQkJCXIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbkl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCWludCBzdGFydCA9IHIuZ2V0U3RhcnQoKTsKLQkJCQkJaW50IG9mZnNldCA9IHIuZ2V0VGV4dEVuZCgpOwotCQkJCQlTdHJpbmcgdGFnQXR0cm5hbWUgPSBjb250YWluZXIuZ2V0VGV4dCgpLnN1YnN0cmluZyhzdGFydCwgb2Zmc2V0KS50cmltKCk7Ci0JCQkJCS8qCi0JCQkJCSAqIEF0dHJpYnV0ZSB2YWx1ZXMgYXJlbid0IGNhc2Ugc2Vuc2F0aXZlLCBhbHNvIG1ha2Ugc3VyZSBuZXh0Ci0JCQkJCSAqIHJlZ2lvbiBpcyBhdHRyaWIgdmFsdWUKLQkJCQkJICovCi0JCQkJCWlmIChOb2RlSGVscGVyLmlzSW5BcnJheShKc0RhdGFUeXBlcy5IVE1MQVRSRVZFTlRTLCB0YWdBdHRybmFtZSkpIHsKLQkJCQkJCWlmIChyZWdpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCQlyZWdpb25JdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJciA9ICgoSVRleHRSZWdpb24pIHJlZ2lvbkl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJCWludCB2YWxTdGFydE9mZnNldCA9IGNvbnRhaW5lci5nZXRTdGFydE9mZnNldChyKTsKLQkJCQkJCQkvLyBpbnQgdmFsRW5kT2Zmc2V0ID0gci5nZXRUZXh0RW5kKCk7Ci0JCQkJCQkJU3RyaW5nIHJhd1RleHQgPSBjb250YWluZXIuZ2V0VGV4dCgpLnN1YnN0cmluZyhyLmdldFN0YXJ0KCksIHIuZ2V0VGV4dEVuZCgpKTsKLQkJCQkJCQlpZiAocmF3VGV4dCA9PSBudWxsIHx8IHJhd1RleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJCS8qIFN0cmlwIHF1b3RlcyAqLwotCQkJCQkJCXN3aXRjaCAocmF3VGV4dC5jaGFyQXQoMCkpIHsKLQkJCQkJCQkJY2FzZSAnXCcnOgotCQkJCQkJCQljYXNlICciJzoKLQkJCQkJCQkJCXJhd1RleHQgPSByYXdUZXh0LnN1YnN0cmluZygxKTsKLQkJCQkJCQkJCXZhbFN0YXJ0T2Zmc2V0Kys7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChyYXdUZXh0ID09IG51bGwgfHwgcmF3VGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQkJc3dpdGNoIChyYXdUZXh0LmNoYXJBdChyYXdUZXh0Lmxlbmd0aCgpIC0gMSkpIHsKLQkJCQkJCQkJY2FzZSAnXCcnOgotCQkJCQkJCQljYXNlICciJzoKLQkJCQkJCQkJCXJhd1RleHQgPSByYXdUZXh0LnN1YnN0cmluZygwLCByYXdUZXh0Lmxlbmd0aCgpIC0gMSk7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIFBvc2l0aW9uIGluU2NyaXB0ID0gbmV3IFBvc2l0aW9uKHNjcmlwdE9mZnNldCwKLQkJCQkJCQkvLyByYXdUZXh0Lmxlbmd0aCgpKTsKLQkJCQkJCQkvKiBRdW90ZWQgdGV4dCBzdGFydHMgKzEgYW5kIGVuZHMgLTEgY2hhciAqLwotCQkJCQkJCWlmKEFERF9TRU1JQ09MT05fQVRfSU5MSU5FKSByYXdUZXh0ID0gcmF3VGV4dCArICI7IjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVBvc2l0aW9uIGluSHRtbCA9IG5ldyBQb3NpdGlvbih2YWxTdGFydE9mZnNldCwgcmF3VGV4dC5sZW5ndGgoKSk7Ci0JCQkJCQkJc2NyaXB0TG9jYXRpb25Jbkh0bWwuYWRkKGluSHRtbCk7Ci0JCQkJCQkJLyogbmVlZCB0byBwYWQgdGhlIHNjcmlwdCB0ZXh0IHdpdGggc3BhY2VzICovCi0JCQkJCQkJY2hhcltdIHNwYWNlcyA9IFV0aWwuZ2V0UGFkKHZhbFN0YXJ0T2Zmc2V0IC0gc2NyaXB0T2Zmc2V0KTsKLQkJCQkJCQlmU2NyaXB0VGV4dC5hcHBlbmQoc3BhY2VzKTsKLQkJCQkJCQlmU2NyaXB0VGV4dC5hcHBlbmQocmF3VGV4dCk7Ci0JCQkJCQkJc2NyaXB0T2Zmc2V0ID0gZlNjcmlwdFRleHQubGVuZ3RoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0b3IjdHJhbnNsYXRlSlNOb2RlKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JICovCi0JcHVibGljIHZvaWQgdHJhbnNsYXRlSlNOb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGFpbmVyKSB7Ci0JCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXJSZWdpb24gPSBjb250YWluZXI7Ci0JCUl0ZXJhdG9yIHJlZ2lvbnMgPSBjb250YWluZXJSZWdpb24uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCQotCQlpZihjb250YWluZXI9PW51bGwpIHJldHVybjsKLQkJCi0JCWNoYXJbXSBzcGFjZXMgPSBVdGlsLmdldFBhZChjb250YWluZXIuZ2V0U3RhcnRPZmZzZXQoKSAtIHNjcmlwdE9mZnNldCk7Ci0JCWZTY3JpcHRUZXh0LmFwcGVuZChzcGFjZXMpOwotCQlzY3JpcHRPZmZzZXQgPSBjb250YWluZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkKLQkJaWYoY29udGFpbmVyLmdldFR5cGUoKSE9RE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUICYmIGNvbnRhaW5lci5nZXRUeXBlKCkhPSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSAmJiAhaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJLy8gY29udGVudCBhc3Npc3Qgd2FzIG5vdCBzaG93aW5nIHVwIGluIEpTUCBpbnNpZGUgYSBqYXZhc2NyaXB0Ci0JCQkvLyByZWdpb24KLQkJCQotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJlZ2lvbiB0ZXh0OiAiICsgY29udGFpbmVyLmdldFRleHQoKS5zdWJzdHJpbmcocmVnaW9uLmdldFN0YXJ0KCksIHJlZ2lvbi5nZXRFbmQoKSkpOwotCQkJYm9vbGVhbiBpc0Jsb2NrUmVnaW9uID0gcmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXI7Ci0JCQkvKiBtYWtlIHN1cmUgaXRzIG5vdCBhIHN1YiBjb250YWluZXIgcmVnaW9uLCBwcm9iYWJseSBKU1AgKi8KLQkJCWlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCApIHsKLQkJCQlpbnQgc2NyaXB0U3RhcnQgPSBjb250YWluZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgc2NyaXB0VGV4dEVuZCA9IGNvbnRhaW5lci5nZXRFbmRPZmZzZXQoKSAtIGNvbnRhaW5lci5nZXRTdGFydE9mZnNldCgpOwotCQkJCVN0cmluZyByZWdpb25UZXh0ID0gY29udGFpbmVyLmdldFRleHQoKS5zdWJzdHJpbmcocmVnaW9uLmdldFN0YXJ0KCksIHJlZ2lvbi5nZXRFbmQoKSk7Ci0JCQkJaW50IHJlZ2lvbkxlbmd0aCA9IHJlZ2lvblRleHQubGVuZ3RoKCk7Ci0JCQkJLy8gL1Bvc2l0aW9uIGluU2NyaXB0ID0gbmV3IFBvc2l0aW9uKHNjcmlwdE9mZnNldCwKLQkJCQkvLyByZWdpb25MZW5ndGgpOwotCQkJCVBvc2l0aW9uIGluSHRtbCA9IG5ldyBQb3NpdGlvbihzY3JpcHRTdGFydCwgc2NyaXB0VGV4dEVuZCk7Ci0JCQkJc2NyaXB0TG9jYXRpb25Jbkh0bWwuYWRkKGluSHRtbCk7Ci0JCQkJc3BhY2VzID0gVXRpbC5nZXRQYWQoc2NyaXB0U3RhcnQgLSBzY3JpcHRPZmZzZXQpOwotCQkJCWZTY3JpcHRUZXh0LmFwcGVuZChzcGFjZXMpOyAJCi0JCQkJLy8gZkpzVG9IVE1MUmFuZ2VzLnB1dChpblNjcmlwdCwgaW5IdG1sKTsKLQkJCQlpZihpc0Jsb2NrUmVnaW9uKSB7Ci0JCQkJCXNwYWNlcyA9IFV0aWwuZ2V0UGFkKHJlZ2lvbkxlbmd0aCk7Ci0JCQkJCWZTY3JpcHRUZXh0LmFwcGVuZChzcGFjZXMpOyAJCi0JCQkJfWVsc2UgewotCQkJCQlmU2NyaXB0VGV4dC5hcHBlbmQocmVnaW9uVGV4dCk7Ci0JCQkJfQotCQkJCQotCQkJCQotCQkJCXNjcmlwdE9mZnNldCA9IGZTY3JpcHRUZXh0Lmxlbmd0aCgpOwotCQkJfQotCQl9Ci0JCQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZyA9IGNvbnRhaW5lci5nZXROZXh0KCk7Ci0JCQotCQlpZihlbmRUYWc9PW51bGwpIHsKLQkJCW1pc3NpbmdFbmRUYWdSZWdpb25TdGFydCA9IGNvbnRhaW5lci5nZXRTdGFydE9mZnNldCgpOwotCQl9ZWxzZSBpZihlbmRUYWchPW51bGwpIHsKLQkJCU5vZGVIZWxwZXIgbmggPSBuZXcgTm9kZUhlbHBlcihlbmRUYWcpOwotCQkJU3RyaW5nIG5hbWUgPSBuaC5nZXRUYWdOYW1lKCk7Ci0JCQkKLQkJCWlmKG5hbWU9PW51bGwgfHwgIW5hbWUudHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoInNjcmlwdCIpIHx8ICFuaC5pc0VuZFRhZygpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQltaXNzaW5nRW5kVGFnUmVnaW9uU3RhcnQgPSBjb250YWluZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0b3IjdHJhbnNsYXRlU2NyaXB0SW1wb3J0Tm9kZShvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHRyYW5zbGF0ZVNjcmlwdEltcG9ydE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJTm9kZUhlbHBlciBuaCA9IG5ldyBOb2RlSGVscGVyKHJlZ2lvbik7Ci0JCVN0cmluZyBpbXBvcnROYW1lID0gbmguZ2V0QXR0cmlidXRlVmFsdWUoInNyYyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbXBvcnROYW1lICE9IG51bGwgJiYgIWltcG9ydE5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyYXdJbXBvcnRzLmFkZChpbXBvcnROYW1lKTsKLQkJCVBvc2l0aW9uIGluSHRtbCA9IG5ldyBQb3NpdGlvbihyZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgcmVnaW9uLmdldEVuZE9mZnNldCgpKTsKLQkJCWltcG9ydExvY2F0aW9uc0luSHRtbC5hZGQoaW5IdG1sKTsKLQkJfQotCX0KLQotCQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciNkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWNhbmNlbFBhcnNlID0gdHJ1ZTsKLQkJCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRvciNkb2N1bWVudENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCXJlc2V0KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0b3IjcmVsZWFzZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJZlN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYjVkMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0OwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgY2hpbGRzYgotICoKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvTm9kZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Ob2RlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZTMwMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9Ob2RlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byAKLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIAotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqICAgICAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIE5vZGVIZWxwZXIgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBET1VCTEVfUVVPVEVfQ0hBUiA9ICdcIic7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFX1FVT1RFX0VOVElUWSA9ICImcXVvdDsiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIFNJTkdMRV9RVU9URV9DSEFSID0gJ1wnJzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVfUVVPVEVfRU5USVRZID0gIiYjMDM5OyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbkFycmF5KFN0cmluZyBTdHJpbmdBcnJheVtdLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoU3RyaW5nQXJyYXkgPT0gbnVsbCB8fCB0ZXh0ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IFN0cmluZ0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoU3RyaW5nQXJyYXlbaV0uZXF1YWxzSWdub3JlQ2FzZSh0ZXh0LnRyaW0oKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1F1b3RlZChTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmICgoc3RyaW5nID09IG51bGwpIHx8IChzdHJpbmcubGVuZ3RoKCkgPCAyKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBsYXN0SW5kZXggPSBzdHJpbmcubGVuZ3RoKCkgLSAxOwotCQljaGFyIGZpcnN0Q2hhciA9IHN0cmluZy5jaGFyQXQoMCk7Ci0JCWNoYXIgbGFzdENoYXIgPSBzdHJpbmcuY2hhckF0KGxhc3RJbmRleCk7Ci0JCXJldHVybiAoKChmaXJzdENoYXIgPT0gTm9kZUhlbHBlci5TSU5HTEVfUVVPVEVfQ0hBUikgJiYgKGxhc3RDaGFyID09IE5vZGVIZWxwZXIuU0lOR0xFX1FVT1RFX0NIQVIpKSB8fCAoKGZpcnN0Q2hhciA9PSBOb2RlSGVscGVyLkRPVUJMRV9RVU9URV9DSEFSKSAmJiAobGFzdENoYXIgPT0gTm9kZUhlbHBlci5ET1VCTEVfUVVPVEVfQ0hBUikpKTsKLQl9Ci0JcHJvdGVjdGVkIGZpbmFsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uOwotCQotCXB1YmxpYyBOb2RlSGVscGVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCXRoaXMucmVnaW9uID0gcmVnaW9uOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBhdHRyRXF1YWxzKFN0cmluZyBhdHRyaWJ1dGUsIFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgYXR0VmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGUpOwotCQlpZihhdHRWYWx1ZT09bnVsbCkgcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYXR0VmFsdWUuZXF1YWxzSWdub3JlQ2FzZSh2YWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgQXR0clRvU3RyaW5nKCkgewotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCS8vIEZvciBkZWJ1Z2luZwotCQlJVGV4dFJlZ2lvbkxpc3QgdCA9IHJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHI7Ci0JCUl0ZXJhdG9yIHJlZ2lvbkl0ZXJhdG9yID0gdC5pdGVyYXRvcigpOwotCQlTdHJpbmcgU3RydWN0dXJlZFZhbHVlID0gTWVzc2FnZXMuZ2V0U3RyaW5nKCJOb2RlSGVscGVyLjAiKSArIGdldFRhZ05hbWUoKSArIE1lc3NhZ2VzLmdldFN0cmluZygiTm9kZUhlbHBlci4xIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl3aGlsZSAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyID0gKElUZXh0UmVnaW9uKSByZWdpb25JdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJaW50IHN0YXJ0ID0gci5nZXRTdGFydCgpOwotCQkJCWludCBvZmZzZXQgPSByLmdldFRleHRFbmQoKTsKLQkJCQlTdHJ1Y3R1cmVkVmFsdWUgKz0gIlx0XHQiICsgcmVnaW9uLmdldFRleHQoKS5zdWJzdHJpbmcoc3RhcnQsIG9mZnNldCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkvKgotCQkJCSAqIFRoZXJlcyBhIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUyBhZnRlciB0aGUKLQkJCQkgKiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FIHdlIGhhdmUgdG8gZ2V0IHJpZCBvZgotCQkJCSAqLwotCQkJCWlmIChyZWdpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJcmVnaW9uSXRlcmF0b3IubmV4dCgpOwotCQkJCX0KLQkJCQlpZiAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCXIgPSAoKElUZXh0UmVnaW9uKSByZWdpb25JdGVyYXRvci5uZXh0KCkpOwotCQkJCX0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZXMuZ2V0U3RyaW5nKCJOb2RlSGVscGVyLjMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQlpbnQgdmFsU3RhcnQgPSByLmdldFN0YXJ0KCk7Ci0JCQkJCWludCB2YWxPZmZzZXQgPSByLmdldFRleHRFbmQoKTsKLQkJCQkJU3RydWN0dXJlZFZhbHVlICs9ICJcdFx0IiArIHN0cmlwRW5kUXVvdGVzKHJlZ2lvbi5nZXRUZXh0KCkuc3Vic3RyaW5nKHZhbFN0YXJ0LCB2YWxPZmZzZXQpKSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gU3RydWN0dXJlZFZhbHVlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0F0dHJpYnV0ZShTdHJpbmcgbmFtZVtdKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlJVGV4dFJlZ2lvbkxpc3QgdCA9IHJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHI7Ci0JCUl0ZXJhdG9yIHJlZ2lvbkl0ZXJhdG9yID0gdC5pdGVyYXRvcigpOwotCQl3aGlsZSAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyID0gKElUZXh0UmVnaW9uKSByZWdpb25JdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJaW50IHN0YXJ0ID0gci5nZXRTdGFydCgpOwotCQkJCWludCBvZmZzZXQgPSByLmdldFRleHRFbmQoKTsKLQkJCQlTdHJpbmcgdGFnbmFtZSA9IHJlZ2lvbi5nZXRUZXh0KCkuc3Vic3RyaW5nKHN0YXJ0LCBvZmZzZXQpLnRyaW0oKTsKLQkJCQkvKiBBdHRyaWJ1dGUgdmFsdWVzIGFyZW4ndCBjYXNlIHNlbnNhdGl2ZSAqLwotCQkJCWlmIChOb2RlSGVscGVyLmlzSW5BcnJheShuYW1lLCB0YWduYW1lKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVRleHRSZWdpb25MaXN0IHQgPSByZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiByOwotCQlJdGVyYXRvciByZWdpb25JdGVyYXRvciA9IHQuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHJlZ2lvbkl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJciA9IChJVGV4dFJlZ2lvbikgcmVnaW9uSXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCWludCBzdGFydCA9IHIuZ2V0U3RhcnQoKTsKLQkJCQlpbnQgb2Zmc2V0ID0gci5nZXRUZXh0RW5kKCk7Ci0JCQkJU3RyaW5nIHRhZ25hbWUgPSByZWdpb24uZ2V0VGV4dCgpLnN1YnN0cmluZyhzdGFydCwgb2Zmc2V0KS50cmltKCk7Ci0JCQkJLyoKLQkJCQkgKiBBdHRyaWJ1dGUgdmFsdWVzIGFyZW4ndCBjYXNlIHNlbnNhdGl2ZSwgYWxzbyBtYWtlIHN1cmUgbmV4dAotCQkJCSAqIHJlZ2lvbiBpcyBhdHRyaWIgdmFsdWUKLQkJCQkgKi8KLQkJCQlpZiAodGFnbmFtZS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKSB7Ci0JCQkJCWlmIChyZWdpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCXJlZ2lvbkl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJfQotCQkJCQlpZiAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQlyID0gKChJVGV4dFJlZ2lvbikgcmVnaW9uSXRlcmF0b3IubmV4dCgpKTsKLQkJCQkJfQotCQkJCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJaW50IHZhbFN0YXJ0ID0gci5nZXRTdGFydCgpOwotCQkJCQkJaW50IHZhbE9mZnNldCA9IHIuZ2V0VGV4dEVuZCgpOwotCQkJCQkJcmV0dXJuIHN0cmlwRW5kUXVvdGVzKHJlZ2lvbi5nZXRUZXh0KCkuc3Vic3RyaW5nKHZhbFN0YXJ0LCB2YWxPZmZzZXQpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50QXNGbGF0U3RyaW5nKCkgewotCQkvKgotCQkgKiBSZXR1cm5zIGEgZnVsbCBzdHJpbmcgb2YgdGhpcyBlbGVtZW50IG1pbnVzIGFuZCAnaWxsZWdhbCcgY2hhcmFjdGVycwotCQkgKiAodXNlZnVsbCBmb3IgaWRlbnRpZnlpbmcgdGhlIEhUTUwgZWxlbWVudCBpbiBhIGdlbmVyaWMgSlMgZnVuY3Rpb24pCi0JCSAqLwotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBmdWxsUmVnaW9uVGV4dCA9IHJlZ2lvbi5nZXRGdWxsVGV4dCgpOwotCQlpZiAoZnVsbFJlZ2lvblRleHQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZ1bGxSZWdpb25UZXh0LnJlcGxhY2VBbGwoIlteYS16QS1aMC05XSIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnTmFtZSgpIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJVGV4dFJlZ2lvbkxpc3QgdCA9IHJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHI7Ci0JCUl0ZXJhdG9yIHJlZ2lvbkl0ZXJhdG9yID0gdC5pdGVyYXRvcigpOwotCQl3aGlsZSAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyID0gKElUZXh0UmVnaW9uKSByZWdpb25JdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQlpbnQgc3RhcnQgPSByLmdldFN0YXJ0KCk7Ci0JCQkJaW50IG9mZnNldCA9IHIuZ2V0VGV4dEVuZCgpOwotCQkJCXJldHVybiByZWdpb24uZ2V0VGV4dCgpLnN1YnN0cmluZyhzdGFydCwgb2Zmc2V0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNFbmRUYWcoKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUlUZXh0UmVnaW9uTGlzdCB0ID0gcmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gcjsKLQkJSXRlcmF0b3IgcmVnaW9uSXRlcmF0b3IgPSB0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChyZWdpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbkl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzU2VsZkNsb3NpbmdUYWcoKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gcmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCXJldHVybiByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0U7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG5hbWVFcXVhbHMoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHRhZ05hbWU7Ci0JCXJldHVybiAoKHRhZ05hbWUgPSBnZXRUYWdOYW1lKCkpICE9IG51bGwgJiYgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBzdHJpcEVuZFF1b3RlcyhTdHJpbmcgdGV4dCkgewotCQlpZiAodGV4dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoTm9kZUhlbHBlci5pc1F1b3RlZCh0ZXh0KSkgewotCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkgLSAxKTsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJSVRleHRSZWdpb25MaXN0IHQgPSByZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJdGVyYXRvciByZWdpb25JdGVyYXRvciA9IHQuaXRlcmF0b3IoKTsKLQkJU3RyaW5nIG5vZGVUZXh0ID0gbmV3IFN0cmluZygpOwotCQl3aGlsZSAocmVnaW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByID0gKElUZXh0UmVnaW9uKSByZWdpb25JdGVyYXRvci5uZXh0KCk7Ci0JCQlTdHJpbmcgbm9kZVR5cGUgPSByLmdldFR5cGUoKTsKLQkJCW5vZGVUZXh0ICs9IChNZXNzYWdlcy5nZXRTdHJpbmcoIk5vZGVIZWxwZXIuMTEiKSArIG5vZGVUeXBlICsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJOb2RlSGVscGVyLjEyIikgKyByZWdpb24uZ2V0VGV4dCgpLnN1YnN0cmluZyhyLmdldFN0YXJ0KCksIHIuZ2V0VGV4dEVuZCgpKSArICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCXJldHVybiBub2RlVGV4dDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyYWVhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAKLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAgICAgCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBVdGlsIHsKLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBnZXRQYWQoaW50IG51bWJlck9mQ2hhcnMpIHsKLQkJaWYobnVtYmVyT2ZDaGFycyA8IDApIHJldHVybiBuZXcgY2hhclswXTsKLQkJZmluYWwgY2hhcltdIHNwYWNlQXJyYXkgPSBuZXcgY2hhcltudW1iZXJPZkNoYXJzXTsKLQkJQXJyYXlzLmZpbGwoc3BhY2VBcnJheSwgJyAnKTsKLQkJcmV0dXJuIHNwYWNlQXJyYXk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUFsbChTdHJpbmcgc291cmNlLCBjaGFyIHJlbW92ZSkgewotCQkKLQkJU3RyaW5nIG5ld1N0cmluZyA9ICIiOwotCQkKLQkJY2hhcltdIG9sZFN0cmluZ0FycmF5ID0gc291cmNlLnRvQ2hhckFycmF5KCk7Ci0JCQotCQlmb3IoaW50IGkgPSAwO2k8b2xkU3RyaW5nQXJyYXkubGVuZ3RoO2krKykgewotCQkJaWYob2xkU3RyaW5nQXJyYXlbaV0hPXJlbW92ZSkgbmV3U3RyaW5nKz1vbGRTdHJpbmdBcnJheVtpXTsKLQkJfQotCQlyZXR1cm4gbmV3U3RyaW5nOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvV2ViUm9vdEZpbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9XZWJSb290RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYTc2YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9XZWJSb290RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIAotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIAotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogICAgIAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgV2ViUm9vdEZpbmRlciB7Ci0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRTZXJ2ZXJDb250ZXh0Um9vdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN0cmluZyBjb250ZXh0Um9vdCA9IENvbXBvbmVudFV0aWxpdGllcy5nZXRTZXJ2ZXJDb250ZXh0Um9vdChwcm9qZWN0KTsKLQkJaWYoY29udGV4dFJvb3Q9PW51bGwpIHsKLQkJCWNvbnRleHRSb290ID0gcHJvamVjdC5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQYXRoKGNvbnRleHRSb290KTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFByb2plY3RSb290KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIHByb2plY3QuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFdlYkNvbnRlbnRGb2xkZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCWlmIChjb21wICE9IG51bGwpIHsKLQkJCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSBjb21wLmdldFJvb3RGb2xkZXIoKTsKLQkJCXJldHVybiByb290Rm9sZGVyLmdldFVuZGVybHlpbmdGb2xkZXIoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQYXRoKCIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXZWJDb250ZXh0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmNjZGRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1Ob2RlSGVscGVyLjA9VGFnIG5hbWU6Ci1Ob2RlSGVscGVyLjE9XHRBdHRyaWJ1dGVcdFZhbHVlXG4KLU5vZGVIZWxwZXIuMz1hdHRyaWIgdHlwZQotTm9kZUhlbHBlci4xMT1cdE5vZGUgVHlwZToKLU5vZGVIZWxwZXIuMTI9XCBcdFx0VmFsdWU6CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9JbmRleFdvcmtzcGFjZUpvYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSW5kZXhXb3Jrc3BhY2VKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI1OTI4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9JbmRleFdvcmtzcGFjZUpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuSnNDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5VdGlsOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qIChjb3BpZWQgZnJvbSBKU1ApCi0gKiBSZS1pbmRleGVzIHRoZSBlbnRpcmUgd29ya3NwYWNlLgotICogRW5zdXJlcyB0aGUgSlNQIEluZGV4IGlzIGluIGEgc3RhYmxlIHN0YXRlIGJlZm9yZSBwZXJmb3JtaW5nIGEgc2VhcmNoLgotICogKGxpa2UgYWZ0ZXIgYSBjcmFzaCBvciBpZiBwcmV2aW91cyBpbmRleGluZyB3YXMgY2FuY2VsZWQpCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBJbmRleFdvcmtzcGFjZUpvYiBleHRlbmRzIEpvYiB7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzaW5kZXhtYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLSAJCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogVmlzaXRvciB0aGF0IHJldHJpZXZlcyBqc3AgcHJvamVjdCBwYXRocyBmb3IgYWxsIGpzcCBmaWxlcyBpbiB0aGUgd29ya3NwYWNlLAotCSAqIGFuZCBhZGRzIHRoZSBmaWxlcyB0byBiZSBpbmRleGVkIGFzIHRoZXkgYXJlIGVuY291bnRlcmVkCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBKU1BGaWxlVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZVByb3h5VmlzaXRvciB7Ci0JICAgIHByaXZhdGUgTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsgCi0JCQotCQkvLyBtb25pdG9yIGZyb20gdGhlIEpvYgotCQlJUHJvZ3Jlc3NNb25pdG9yIGZJbm5lck1vbml0b3IgPSBudWxsOwotCQlwdWJsaWMgSlNQRmlsZVZpc2l0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQl0aGlzLmZJbm5lck1vbml0b3IgPSBtb25pdG9yOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCi0JCQkvLyBjaGVjayBqb2IgY2FuY2VsZWQKLQkJCWlmICgodGhpcy5mSW5uZXJNb25pdG9yICE9IG51bGwpICYmIHRoaXMuZklubmVyTW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlzZXRDYW5jZWxlZFN0YXRlKCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQkvLyBjaGVjayBzZWFyY2ggc3VwcG9ydCBjYW5jZWxlZAotCQkJaWYoSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJc2V0Q2FuY2VsZWRTdGF0ZSgpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJaWYgKHByb3h5LmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCQotCQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zNTUzCi0JCQkJLy8gY2hlY2sgdGhpcyBiZWZvcmUgZGVzY3JpcHRpb24KLQkJCQkvLyBjaGVjayBuYW1lIGJlZm9yZSBhY3R1YWxseSBnZXR0aW5nIHRoZSBmaWxlIChsZXNzIHdvcmspCi0JCQkJaWYoVXRpbC5pc0pzVHlwZShwcm94eS5nZXROYW1lKCkpKSB7Ci0JCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpOwotCQkJCQlpZihmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkKLQkJCQkJCWlmKERFQlVHKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIoKykgSW5kZXhXb3Jrc3BhY2VKb2IgYWRkaW5nIGZpbGU6ICIgKyBmaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCS8vIHRoaXMgY2FsbCB3aWxsIGNoZWNrIHRoZSBDb250ZW50VHlwZURlc2NyaXB0aW9uLCBzbyBkb24ndCBuZWVkIHRvIGRvIGl0IGhlcmUuCi0JCQkJCQkvL0pTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5hZGRKc3BGaWxlKGZpbGUpOwotCQkJCQkJdGhpcy5maWxlcy5hZGQoZmlsZSk7Ci0JCQkJCQl0aGlzLmZJbm5lck1vbml0b3Iuc3ViVGFzayhwcm94eS5nZXROYW1lKCkpOwotCQkJCQkJCi0JCQkJCQkvLyBkb24ndCBzZWFyY2ggZGVlcGVyIGZvciBmaWxlcwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBmaW5hbCBJRmlsZVtdIGdldEZpbGVzKCkgewotCQkgICAgcmV0dXJuIChJRmlsZVtdKXRoaXMuZmlsZXMudG9BcnJheShuZXcgSUZpbGVbdGhpcy5maWxlcy5zaXplKCldKTsKLQkJfQotCX0KLQkKLQkvL3ByaXZhdGUgSUNvbnRlbnRUeXBlIGZDb250ZW50VHlwZUpTUCA9IG51bGw7Ci0JCi0JcHVibGljIEluZGV4V29ya3NwYWNlSm9iKCkgewotCQkvLyBwYV9UT0RPIG1heSB3YW50IHRvIHNheSBzb21ldGhpbmcgbGlrZSAiUmVidWlsZGluZyBKU1AgSW5kZXgiIHRvIGJlIG1vcmUKLQkJLy8gZGVzY3JpcHRpdmUgaW5zdGVhZCBvZiAiVXBkYXRpbmcgSlNQIEluZGV4IiBzaW5jZSB0aGV5IGFyZSAyIGRpZmZlcmVudCB0aGluZ3MKLQkJc3VwZXIoSnNDb3JlTWVzc2FnZXMuSlNQSW5kZXhNYW5hZ2VyXzApOwotCQlzZXRQcmlvcml0eShKb2IuTE9ORyk7Ci0JCXNldFN5c3RlbSh0cnVlKTsKLQl9Ci0KLS8vCUlDb250ZW50VHlwZSBnZXRKc3BDb250ZW50VHlwZSgpIHsKLS8vCQlpZih0aGlzLmZDb250ZW50VHlwZUpTUCA9PSBudWxsKQotLy8JCQl0aGlzLmZDb250ZW50VHlwZUpTUCA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotLy8JCXJldHVybiB0aGlzLmZDb250ZW50VHlwZUpTUDsKLS8vCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZyBlY2xpcHNlLmNvcmUuaW50ZXJuYWwuam9icy5JbnRlcm5hbEpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpIAotCSAqIGZvciBzaW1pbGFyIG1ldGhvZAotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCi0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCi0JCWlmKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlzZXRDYW5jZWxlZFN0YXRlKCk7Ci0JCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCX0KLQkJCi0JCWlmKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiBeIEluZGV4V29ya3NwYWNlSm9iIHN0YXJ0ZWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCi0JCXRyeSB7Ci0JCSAgICBKU1BGaWxlVmlzaXRvciB2aXNpdG9yID0gbmV3IEpTUEZpbGVWaXNpdG9yKG1vbml0b3IpOwotCQkgICAgLy8gY29sbGVjdCBhbGwganNwIGZpbGVzCi0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmFjY2VwdCh2aXNpdG9yLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJLy8gcmVxdWVzdCBpbmRleGluZwotCQkJLy8gdGhpcyBpcyBwcmV0dHkgbXVjaCBsaWtlIGZha2luZyBhbiBlbnRpcmUgd29ya3NwYWNlIHJlc291cmNlIGRlbHRhCi0JCQlKc0luZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLmluZGV4RmlsZXModmlzaXRvci5nZXRGaWxlcygpKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZihERUJVRykgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCQlsb25nIGZpbmlzaCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlpZihERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgXiBJbmRleFdvcmtzcGFjZUpvYiBmaW5pc2hlZFxuICAgdG90YWwgdGltZSBydW5uaW5nOiAiICsgKGZpbmlzaCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0Jdm9pZCBzZXRDYW5jZWxlZFN0YXRlKCkgewotCQlKc0luZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLnNldEluZGV4U3RhdGUoSnNJbmRleE1hbmFnZXIuU19DQU5DRUxFRCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YzA4NzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUuc2VhcmNoLkphdmFTZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qKGNvcGllZCBmcm9tIEpTUCkKLSAqIFdyYXBwZXIgbWV0aG9kIHRvIHNldCBnZXRQYXRoKCkgcGF0aCB0byBiZSB0aGUgcGF0aCBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCAKLSAqIGZvciB0aGUganNwIGZpbGUuIChzaW5jZSBpdCdzIGEgZmluYWwgbWV0aG9kLCBpdCBuZWVkcyB0byBiZSBzZXQgdmlhIGNvbnN0cnVjdG9yKQotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUgZXh0ZW5kcyBKYXZhU2VhcmNoRG9jdW1lbnQgewotCQotCXByaXZhdGUgSnNTZWFyY2hEb2N1bWVudCBmSlNQU2VhcmNoRG9jID0gbnVsbDsKLQkKLQlwdWJsaWMgSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUoSnNTZWFyY2hEb2N1bWVudCBqc3BTZWFyY2hEb2MpIHsKLQkJCi0JCXN1cGVyKGpzcFNlYXJjaERvYy5nZXRQYXRoKCksIGpzcFNlYXJjaERvYy5nZXRQYXJ0aWNpcGFudCgpKTsKLQkJdGhpcy5mSlNQU2VhcmNoRG9jID0ganNwU2VhcmNoRG9jOwotCX0KLQotCXB1YmxpYyBieXRlW10gZ2V0Qnl0ZUNvbnRlbnRzKCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZkpTUFNlYXJjaERvYy5nZXRCeXRlQ29udGVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgY2hhcltdIGdldENoYXJDb250ZW50cygpIHsKLQkJCi0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0Q2hhckNvbnRlbnRzKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVRleHQoKSB7Ci0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0SmF2YVRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZkpTUFNlYXJjaERvYy5nZXRFbmNvZGluZygpOwotCX0KLQkKLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJCi0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0RmlsZSgpOwotCX0KLQkKLQlwdWJsaWMgSUpzVHJhbnNsYXRpb24gZ2V0SnNwVHJhbnNsYXRpb24oKSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldEpTUFRyYW5zbGF0aW9uKCk7Ci0JfQotCQotLy8JcHVibGljIGludCBnZXRKc3BPZmZzZXQoaW50IGphdmFPZmZzZXQpIHsKLS8vCQkKLS8vCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldEpzcE9mZnNldChqYXZhT2Zmc2V0KTsKLS8vCX0KLQkKLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQl0aGlzLmZKU1BTZWFyY2hEb2MucmVsZWFzZSgpOwotCX0KLQlwdWJsaWMgSUphdmFTY3JpcHRFbGVtZW50IGdldEphdmFFbGVtZW50KCkgewotCQlyZXR1cm4gZ2V0SnNwVHJhbnNsYXRpb24oKS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc0luZGV4TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSnNJbmRleE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiMTE0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc0luZGV4TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2JDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZS5pbmRleC5JbmRleDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5JbmRleE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuSnNDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuSnNDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0LkpzV2ViTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uVXRpbDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qKGNvcGllZCBmcm9tIEpTUCkKLSAqIFJlc3BvbnNpYmxlIGZvciBrZWVwaW5nIHRoZSBKU1AgaW5kZXggdXAgdG8gZGF0ZS4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpzSW5kZXhNYW5hZ2VyIHsKLQotCS8vIGZvciBkZWJ1Z2dpbmcKLQkvLyBUT0RPIG1vdmUgdGhpcyB0byBMb2dnZXIsIGFzIHdlIGhhdmUgaW4gU1NFCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzaW5kZXhtYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLSAJCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtFWV9JTkRFWF9TVEFURSA9ICJqc3BJbmRleFN0YXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbmRleFdvcmtzcGFjZUpvYiBpbmRleGluZ0pvYiA9IG5ldyBJbmRleFdvcmtzcGFjZUpvYigpOwotCi0KLQotCS8vIFRPRE86IGNvbnNpZGVyIGVudW1lcmF0aW9uIGZvciB0aGVzZSBpbnQgY29uc3RhbnRzCi0JLy8gc2V0IHRvIFNfVVBEQVRJTkcgb25jZSBhIHJlc291cmNlIGNoYW5nZSBjb21lcyBpbgotCS8vIHNldCB0byBTX1NUQUJMRSBpZjoKLQkvLyAtIHdlIGtub3cgd2UgYXJlbid0IGludGVyZXN0ZWQgaW4gdGhlIHJlc291cmNlIGNoYW5nZQotCS8vIC0gb3IgdGhlIFByb2Nlc3NGaWxlc0pvYiBjb21wbGV0ZXMKLQkvLyBzZXQgdG8gU19DQU5DRUxFRCBpZiBhbiBpbmRleGluZyBqb2IgaXMgY2FuY2VsZWQKLQkvLyBzZXQgdG8gU19SRUJVSUxESU5HIGlmIHJlLWluZGV4aW5nIHRoZSBlbnRpcmUgd29ya3NwYWNlCi0KLQkvLyB0aGUgaW50ICcwJyBpcyByZXNlcnZlZCBmb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYgYSBwcmVmZXJlbmNlIGlzIG5vdAotCS8vIHRoZXJlCi0JLyoqIGluZGV4IGlzIHJlbGlhYmxlIHRvIHVzZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfU1RBQkxFID0gMTsKLQkvKiogaW5kZXggaXMgYmVpbmcgdXBkYXRlZCAoZnJvbSBhIHJlc291cmNlIGRlbHRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfVVBEQVRJTkcgPSAyOwotCS8qKiBlbnRpcmUgaW5kZXggaXMgYmVpbmcgcmVidWlsdCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfUkVCVUlMRElORyA9IDM7Ci0JLyoqCi0JICogaW5kZXhpbmcgam9iIHdhcyBjYW5jZWxlZCBpbiB0aGUgbWlkZGxlIG9mIGl0LCBpbmRleCBuZWVkcyB0byBiZQotCSAqIHJlYnVpbHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX0NBTkNFTEVEID0gNDsKLQotCS8qKiBzeW1ib2xpYyBuYW1lIGZvciBPU0dJIGZyYW1ld29yayAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9TR0lfRlJBTUVXT1JLX0lEID0gIm9yZy5lY2xpcHNlLm9zZ2kiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb2xsZWN0cyBKU1AgZmlsZXMgZnJvbSBhIHJlc291cmNlIGRlbHRhLgotCSAqLwotCXByaXZhdGUgY2xhc3MgSlNQUmVzb3VyY2VWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJLy8gdXNpbmcgaGFzaCBtYXAgZW5zdXJlcyBvbmx5IG9uZSBvZiBlYWNoIGZpbGUKLQkJLy8gbXVzdCBiZSByZXNldCBiZWZvcmUgZXZlcnkgdXNlCi0JCXByaXZhdGUgSGFzaE1hcCBqc3BGaWxlcyA9IG51bGw7Ci0KLQkJcHVibGljIEpTUFJlc291cmNlVmlzaXRvcigpIHsKLQkJCXRoaXMuanNwRmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkJLy8gaW4gY2FzZSBKU1Agc2VhcmNoIHdhcyBjYW5jZWxlZCAoZWcuIHdoZW4gY2xvc2luZyB0aGUgZWRpdG9yKQotCQkJaWYgKEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSB8fCBmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpKSB7Ci0JCQkJc2V0Q2FuY2VsZWRTdGF0ZSgpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlpZiAoIWlzSGlkZGVuUmVzb3VyY2UoZGVsdGEuZ2V0RnVsbFBhdGgoKSkpIHsKLQotCQkJCQlpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJCQkJYm9vbGVhbiBhZGRlZCA9IChraW5kICYgSVJlc291cmNlRGVsdGEuQURERUQpID09IElSZXNvdXJjZURlbHRhLkFEREVEOwotCQkJCQlib29sZWFuIGlzSW50ZXJlc3RpbmdDaGFuZ2UgPSBmYWxzZTsKLQkJCQkJaWYgKChraW5kICYgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgewotCQkJCQkJaW50IGZsYWdzID0gZGVsdGEuZ2V0RmxhZ3MoKTsKLQkJCQkJCS8vIGlnbm9yZSB0aGluZ3MgbGlrZSBtYXJrZXIgY2hhbmdlcwotCQkJCQkJaXNJbnRlcmVzdGluZ0NoYW5nZSA9ICgoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSA9PSBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSB8fCAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpID09IElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKTsKLQkJCQkJfQotCQkJCQlib29sZWFuIHJlbW92ZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLlJFTU9WRUQpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQ7Ci0JCQkJCWlmIChhZGRlZCB8fCBpc0ludGVyZXN0aW5nQ2hhbmdlKSB7Ci0KLQkJCQkJCXZpc2l0QWRkZWQoZGVsdGEpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHJlbW92ZWQpIHsKLQkJCQkJCXZpc2l0UmVtb3ZlZChkZWx0YSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBuZWVkIHRvIHNldCBzdGF0ZSBoZXJlIHNvbWVob3csIGFuZCByZWluZGV4Ci0JCQkJLy8gb3RoZXJ3aXNlIGluZGV4IHdpbGwgYmUgdW5yZWxpYWJsZQotCQkJCWlmIChERUJVRykgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJEZWx0YSBhbmFseXNpcyBtYXkgbm90IGJlIGNvbXBsZXRlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBpZiB0aGUgZGVsdGEgaGFzIGNoaWxkcmVuLCBjb250aW51ZSB0byBhZGQvcmVtb3ZlIGZpbGVzCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB2aXNpdFJlbW92ZWQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCS8vIGhhbmRsZSBjbGVhbnVwCi0JCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIHIgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCWlmICgoci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgJiYgci5leGlzdHMoKSkgewotCQkJCQlkZWxldGVJbmRleCgoSUZpbGUpIHIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCB2aXNpdEFkZGVkKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzU1MwotCQkJLy8gcXVpY2sgY2hlY2sgaWYgaXQncyBldmVuIEpTUCByZWxhdGVkIHRvIGltcHJvdmUKLQkJCS8vIHBlcmZvcm1hbmNlCi0JCQkvLyBjaGVja2luZyBuYW1lIGZyb20gdGhlIGRlbHRhIGJlZm9yZSBnZXR0aW5nCi0JCQkvLyByZXNvdXJjZSBiZWNhdXNlIGl0J3MgbGlnaHRlcgotCQkJU3RyaW5nIGZpbGVuYW1lID0gZGVsdGEuZ2V0RnVsbFBhdGgoKS5sYXN0U2VnbWVudCgpOwotCQkJaWYgKChmaWxlbmFtZSAhPSBudWxsKSAmJiBVdGlsLmlzSnNUeXBlKGZpbGVuYW1lKSkgewotCQkJCUlSZXNvdXJjZSByID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCQlpZiAoKHIgIT0gbnVsbCkgJiYgci5leGlzdHMoKSAmJiAoci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpKSB7Ci0JCQkJCXRoaXMuanNwRmlsZXMucHV0KHIuZ2V0RnVsbFBhdGgoKSwgcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkzNDYzCi0JCXByaXZhdGUgYm9vbGVhbiBpc0hpZGRlblJlc291cmNlKElQYXRoIHApIHsKLQkJCVN0cmluZ1tdIHNlZ21lbnRzID0gcC5zZWdtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChzZWdtZW50c1tpXS5zdGFydHNXaXRoKCIuIikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGRlbGV0ZUluZGV4KElGaWxlIGZvbGRlcikgewotCQkJLy8gY2xlYW51cCBpbmRleAotCQkJSW5kZXhNYW5hZ2VyIGltID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCk7Ci0JCQlJUGF0aCBmb2xkZXJQYXRoID0gZm9sZGVyLmdldEZ1bGxQYXRoKCk7Ci0JCQlJUGF0aCBpbmRleExvY2F0aW9uID0gSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuY29tcHV0ZUluZGV4TG9jYXRpb24oZm9sZGVyUGF0aCk7Ci0JCQlpbS5yZW1vdmVJbmRleChpbmRleExvY2F0aW9uKTsKLQkJCS8vIGltLmluZGV4TG9jYXRpb25zLnJlbW92ZUtleShmb2xkZXJQYXRoKTsKLQkJCS8vIGltLmluZGV4TG9jYXRpb25zLnJlbW92ZVZhbHVlKGluZGV4TG9jYXRpb24pOwotCQkJRmlsZSBmID0gaW5kZXhMb2NhdGlvbi50b0ZpbGUoKTsKLQkJCWYuZGVsZXRlKCk7Ci0JCX0KLQotCQlwdWJsaWMgSUZpbGVbXSBnZXRGaWxlcygpIHsKLQkJCXJldHVybiAoSUZpbGVbXSkgdGhpcy5qc3BGaWxlcy52YWx1ZXMoKS50b0FycmF5KG5ldyBJRmlsZVt0aGlzLmpzcEZpbGVzLnNpemUoKV0pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCQl0aGlzLmpzcEZpbGVzLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvLyBlbmQgY2xhc3MgSlNQUmVzb3VyY2VWaXNpdG9yCi0KLQkvKioKLQkgKiBzY2hlZHVsZXMgSlNQIGZpbGVzIGZvciBpbmRleGluZyBieSBKYXZhIGNvcmUKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFByb2Nlc3NGaWxlc0pvYiBleHRlbmRzIEpvYiB7Ci0JCUxpc3QgZmlsZUxpc3QgPSBudWxsOwotCQkvLyBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IGZpbGVzIHdlJ3ZlIGluZGV4ZWQKLQkJaW50IGxhc3RGaWxlQ3Vyc29yID0gMDsKLQotCQlQcm9jZXNzRmlsZXNKb2IoU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCQlzdXBlcih0YXNrTmFtZSk7Ci0JCQlmaWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCi0JCXN5bmNocm9uaXplZCB2b2lkIHByb2Nlc3MoSUZpbGVbXSBmaWxlcykgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWZpbGVMaXN0LmFkZChmaWxlc1tpXSk7Ci0JCQl9Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUEluZGV4TWFuYWdlciBxdWV1aW5nICIgKyBmaWxlcy5sZW5ndGggKyAiIGZpbGVzIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJc3luY2hyb25pemVkIElGaWxlW10gZ2V0RmlsZXMoKSB7Ci0JCQlyZXR1cm4gKElGaWxlW10pIGZpbGVMaXN0LnRvQXJyYXkobmV3IElGaWxlW2ZpbGVMaXN0LnNpemUoKV0pOwotCQl9Ci0KLQkJc3luY2hyb25pemVkIHZvaWQgY2xlYXJGaWxlcygpIHsKLQkJCWZpbGVMaXN0LmNsZWFyKCk7Ci0JCQlsYXN0RmlsZUN1cnNvciA9IDA7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiY2xlYXJlZCBmaWxlcyIpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJpbmRleGVyIG1vbml0b3IiICsgbW9uaXRvcik7Ci0JCQlpZiAoaXNDYW5jZWxlZChtb25pdG9yKSB8fCBmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpKSB7Ci0JCQkJc2V0Q2FuY2VsZWRTdGF0ZSgpOwotCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCX0KLQotCQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCQl0cnkgewotCQkJCUlGaWxlW10gZmlsZXNUb0JlUHJvY2Vzc2VkID0gZ2V0RmlsZXMoKTsKLQotCQkJCWlmIChERUJVRykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUEluZGV4TWFuYWdlciBpbmRleGluZyAiICsgZmlsZXNUb0JlUHJvY2Vzc2VkLmxlbmd0aCArICIgZmlsZXMiKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCS8vIEFQSSBpbmRpY2F0ZXMgdGhhdCBtb25pdG9yIGlzIG5ldmVyIG51bGwKLQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgZmlsZXNUb0JlUHJvY2Vzc2VkLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlKc1NlYXJjaFN1cHBvcnQgc3MgPSBKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJCQlTdHJpbmcgcHJvY2Vzc2luZ05GaWxlcyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQotCQkJCWZvciAoO2xhc3RGaWxlQ3Vyc29yIDwgZmlsZXNUb0JlUHJvY2Vzc2VkLmxlbmd0aDsgbGFzdEZpbGVDdXJzb3IrKykgewotCi0JCQkJCWlmIChpc0NhbmNlbGVkKG1vbml0b3IpIHx8IGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpIHsKLQkJCQkJCXNldENhbmNlbGVkU3RhdGUoKTsKLQkJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJfQotCQkJCQlJRmlsZSBmaWxlID0gZmlsZXNUb0JlUHJvY2Vzc2VkW2xhc3RGaWxlQ3Vyc29yXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlKYXZhU2NyaXB0UHJvamVjdCBwcm9qZWN0ID0gSmF2YVNjcmlwdENvcmUuY3JlYXRlKGZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJCQkJCWlmIChwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCQkJc3MuYWRkSnNwRmlsZShmaWxlKTsKLQkJCQkJCQkvLyBKU1AgSW5kZXhlciBwcm9jZXNzaW5nIG4gZmlsZXMKLQkJCQkJCQlwcm9jZXNzaW5nTkZpbGVzID0gTkxTLmJpbmQoSnNDb3JlTWVzc2FnZXMuSlNQSW5kZXhNYW5hZ2VyXzIsIG5ldyBTdHJpbmdbXXtJbnRlZ2VyLnRvU3RyaW5nKChmaWxlc1RvQmVQcm9jZXNzZWQubGVuZ3RoIC0gbGFzdEZpbGVDdXJzb3IpKX0pOwotCQkJCQkJCW1vbml0b3Iuc3ViVGFzayhwcm9jZXNzaW5nTkZpbGVzICsgIiAtICIgKyBmaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQotCQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUEluZGV4TWFuYWdlciBKb2IgYWRkZWQgZmlsZTogIiArIGZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFJBVExDMDAyODQ3NzYKLQkJCQkJCS8vIElTU1VFOiB3ZSBwcm9iYWJseSBzaG91bGRuJ3QgYmUgY2F0Y2hpbmcgRVZFUlkKLQkJCQkJCS8vIGV4Y2VwdGlvbiwgYnV0Ci0JCQkJCQkvLyB0aGUgZnJhbWV3b3JrIG9ubHkgYWxsb3dzIHRvIHJldHVybiBJU3RhdHVzIGluCi0JCQkJCQkvLyBvcmRlciB0byBjb21tdW5pY2F0ZQotCQkJCQkJLy8gdGhhdCBzb21ldGhpbmcgd2VudCB3cm9uZywgd2hpY2ggbWVhbnMgdGhlIGxvb3AKLQkJCQkJCS8vIHdvbid0IGNvbXBsZXRlLCBhbmQgd2Ugd291bGQgaGl0IHRoZSBzYW1lIHByb2JsZW0KLQkJCQkJCS8vIHRoZSBuZXh0IHRpbWUuCi0JCQkJCQkvLyAKLQkJCQkJCS8vIGEgcG9zc2libGUgc29sdXRpb24gaXMgdG8ga2VlcCB0cmFjayBvZiB0aGUKLQkJCQkJCS8vIGV4Y2VwdGlvbnMgbG9nZ2VkCi0JCQkJCQkvLyBhbmQgb25seSBsb2cgYSBjZXJ0YWluIGFtdCBvZiB0aGUgc2FtZSBvbmUsCi0JCQkJCQkvLyBvdGhlcndpc2Ugc2tpcCBpdC4KLQkJCQkJCWlmICghZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkgewotCQkJCQkJCVN0cmluZyBmaWxlbmFtZSA9IGZpbGUgIT0gbnVsbCA/IGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJKU1BJbmRleGVyIHByb2JsZW0gaW5kZXhpbmc6IiArIGZpbGVuYW1lLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSAvLyBlbmQgZm9yCi0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkvLyBqdXN0IGluIGNhc2Ugc29tZXRoaW5nIGRpZG4ndCBmb2xsb3cgQVBJIChtb25pdG9yIGlzIG51bGwpCi0JCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCwgY2xlYXIgZmlsZXMgbGlzdAotCQkJY2xlYXJGaWxlcygpOwotCQkJCi0JCQlsb25nIGZpbmlzaCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJbG9uZyBkaWZmID0gZmluaXNoIC0gc3RhcnQ7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlmVG90YWxUaW1lICs9IGRpZmY7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInRoaXMgdGltZTogIiArIGRpZmYgKyAiIGN1bXVsYXRpdmUgdGltZSBmb3IgcmVzb3VyY2UgY2hhbmdlZDogIiArIGZUb3RhbFRpbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gaXNDYW5jZWxlZChJUHJvZ3Jlc3NNb25pdG9yIHJ1bk1vbml0b3IpIHsKLQotCQkJYm9vbGVhbiBjYW5jZWxlZCA9IGZhbHNlOwotCQkJLy8gY2hlY2sgc3BlY2lmaWMgbW9uaXRvciBwYXNzZWQgaW50byBydW4gbWV0aG9kICh0aGUgcHJvZ3Jlc3MKLQkJCS8vIGdyb3VwIGluIHRoaXMgY2FzZSkKLQkJCS8vIGNoZWNrIG1haW4gc2VhcmNoIHN1cHBvcnQgY2FuY2VsZWQKLQkJCWlmICgocnVuTW9uaXRvciAhPSBudWxsKSAmJiBydW5Nb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCWNhbmNlbGVkID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJY2FuY2VsZWQgPSB0cnVlOwotCQkJCWlmIChydW5Nb25pdG9yICE9IG51bGwpIHsKLQkJCQkJcnVuTW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY2FuY2VsZWQ7Ci0JCX0KLQkJCi0JfQotCi0JLy8gZW5kIGNsYXNzIFByb2Nlc3NGaWxlc0pvYgotCi0JcHJpdmF0ZSBzdGF0aWMgSnNJbmRleE1hbmFnZXIgZlNpbmdsZXRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkOwotCXByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXppbmcgPSB0cnVlOwotCi0JcHJpdmF0ZSBJbmRleEpvYkNvb3JkaW5hdG9yIGluZGV4Sm9iQ29vcmRpbmF0b3I7Ci0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBqc3BSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBKU1BSZXNvdXJjZVZpc2l0b3IgZlZpc2l0b3IgPSBudWxsOwotCXN0YXRpYyBsb25nIGZUb3RhbFRpbWUgPSAwOwotCi0JLy8gSm9iIGZvciBwcm9jZXNzaW5nIHJlc291cmNlIGRlbHRhCi0JcHJpdmF0ZSBQcm9jZXNzRmlsZXNKb2IgcHJvY2Vzc0ZpbGVzSm9iID0gbnVsbDsKLQotCXByaXZhdGUgSnNJbmRleE1hbmFnZXIoKSB7Ci0JCXByb2Nlc3NGaWxlc0pvYiA9IG5ldyBQcm9jZXNzRmlsZXNKb2IoSnNDb3JlTWVzc2FnZXMuSlNQSW5kZXhNYW5hZ2VyXzApOwotCQkvLyBvbmx5IHNob3cgaW4gdmVyYm9zZSBtb2RlCi0JCXByb2Nlc3NGaWxlc0pvYi5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCXByb2Nlc3NGaWxlc0pvYi5zZXRQcmlvcml0eShKb2IuTE9ORyk7Ci0JCXByb2Nlc3NGaWxlc0pvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJc3VwZXIuZG9uZShldmVudCk7Ci0JCQkJc2V0U3RhYmxlU3RhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSnNJbmRleE1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0KLQkJaWYgKGZTaW5nbGV0b24gPT0gbnVsbCkgewotCQkJZlNpbmdsZXRvbiA9IG5ldyBKc0luZGV4TWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBmU2luZ2xldG9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0KLQkJSnNJbmRleE1hbmFnZXIgc2luZ2xlSW5zdGFuY2UgPSBnZXRJbnN0YW5jZSgpOwotCi0KLQkJaWYgKCFzaW5nbGVJbnN0YW5jZS5pbml0aWFsaXplZCkgewotCQkJc2luZ2xlSW5zdGFuY2UuaW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCQlzaW5nbGVJbnN0YW5jZS5pbmRleEpvYkNvb3JkaW5hdG9yID0gbmV3IEluZGV4Sm9iQ29vcmRpbmF0b3IoKTsKLQkJCXNpbmdsZUluc3RhbmNlLmpzcFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSlNQUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpOwotCi0JCQkvLyBhZGRlZCBhcyBKb2JDaGFuZ2UgbGlzdGVuZXIgc28gSlNQSW5kZXhNYW5hZ2VyIGNhbiBiZSBzbWFydGVyCi0JCQkvLyBhYm91dCB3aGVuIGl0IHJ1bnMKLQkJCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihzaW5nbGVJbnN0YW5jZS5pbmRleEpvYkNvb3JkaW5hdG9yKTsKLQotCQkJLy8gYWRkIEpTUEluZGV4TWFuYWdlciB0byBrZWVwIEpTUCBJbmRleCB1cCB0byBkYXRlCi0JCQkvLyBsaXN0ZW5pbmcgZm9yIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUgYW5kCi0JCQkvLyBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRQotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoanNwUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCi0JCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NTA5MQotCQkJLy8gbWFrZXMgc3VyZSBJbmRleE1hbmFnZXIgaXMgYXdhcmUgb2Ygb3VyIGluZGV4ZXMKLQkJCXNhdmVJbmRleGVzKCk7Ci0JCQkvL3JlYnVpbGRJbmRleElmTmVlZGVkKCk7Ci0JCQlzaW5nbGVJbnN0YW5jZS5pbml0aWFsaXppbmcgPSBmYWxzZTsKLQotCQl9Ci0KLQl9Ci0JCi0Jc3luY2hyb25pemVkIHZvaWQgc2V0SW5kZXhTdGF0ZShpbnQgc3RhdGUpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUEluZGV4TWFuYWdlciBzZXR0aW5nIGluZGV4IHN0YXRlIHRvOiAiICsgc3RhdGUyU3RyaW5nKHN0YXRlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlQbHVnaW4ganNwTW9kZWxQbHVnaW4gPSBKc0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlqc3BNb2RlbFBsdWdpbi5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKFBLRVlfSU5ERVhfU1RBVEUsIHN0YXRlKTsKLQkJanNwTW9kZWxQbHVnaW4uc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBzdGF0ZTJTdHJpbmcoaW50IHN0YXRlKSB7Ci0JCVN0cmluZyBzID0gIlVOS05PV04iOyAvLyROT04tTkxTLTEkCi0JCXN3aXRjaCAoc3RhdGUpIHsKLQkJCWNhc2UgKFNfU1RBQkxFKSA6Ci0JCQkJcyA9ICJTX1NUQUJMRSI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgKFNfVVBEQVRJTkcpIDoKLQkJCQlzID0gIlNfVVBEQVRJTkciOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIChTX0NBTkNFTEVEKSA6Ci0JCQkJcyA9ICJTX0NBTkNFTEVEIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAoU19SRUJVSUxESU5HKSA6Ci0JCQkJcyA9ICJTX1JFQlVJTERJTkciOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIHM7Ci0JfQotCi0JaW50IGdldEluZGV4U3RhdGUoKSB7Ci0JCXJldHVybiBKc0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KFBLRVlfSU5ERVhfU1RBVEUpOwotCX0KLQotCXZvaWQgc2V0VXBkYXRpbmdTdGF0ZSgpIHsKLQkJLy9pZiAoZ2V0SW5kZXhTdGF0ZSgpICE9IFNfQ0FOQ0VMRUQpCi0JCXNldEluZGV4U3RhdGUoU19VUERBVElORyk7Ci0JfQotCi0Jdm9pZCBzZXRDYW5jZWxlZFN0YXRlKCkgewotCQlzZXRJbmRleFN0YXRlKEpzSW5kZXhNYW5hZ2VyLlNfQ0FOQ0VMRUQpOwotCX0KLQotCXZvaWQgc2V0U3RhYmxlU3RhdGUoKSB7Ci0JCS8vaWYgKGdldEluZGV4U3RhdGUoKSAhPSBTX0NBTkNFTEVEKQotCQlzZXRJbmRleFN0YXRlKFNfU1RBQkxFKTsKLQl9Ci0KLQl2b2lkIHNldFJlYnVpbGRpbmdTdGF0ZSgpIHsKLQkJc2V0SW5kZXhTdGF0ZShTX1JFQlVJTERJTkcpOwotCX0KLQotCXN5bmNocm9uaXplZCB2b2lkIHJlYnVpbGRJbmRleElmTmVlZGVkKCkgewotCQlpZiAoZ2V0SW5kZXhTdGF0ZSgpICE9IFNfU1RBQkxFKSB7Ci0JCQlyZWJ1aWxkSW5kZXgoKTsKLQkJfQotCX0KLQotCXZvaWQgcmVidWlsZEluZGV4KCkgewotCi0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiogSlNQIEluZGV4IHVuc3RhYmxlLCByZXF1ZXN0aW5nIHJlLWluZGV4aW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWdldEluZGV4aW5nSm9iKCkuYWRkSm9iQ2hhbmdlTGlzdGVuZXIobmV3IEpvYkNoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhYm91dFRvUnVuKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCXN1cGVyLmFib3V0VG9SdW4oZXZlbnQpOwotCQkJCXNldFJlYnVpbGRpbmdTdGF0ZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCXN1cGVyLmRvbmUoZXZlbnQpOwotCQkJCXNldFN0YWJsZVN0YXRlKCk7Ci0JCQkJZ2V0SW5kZXhpbmdKb2IoKS5yZW1vdmVKb2JDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJfSk7Ci0JCS8vIHdlJ3JlIGFib3V0IHRvIHJlaW5kZXggZXZlcnl0aGluZyBhbnl3YXkKLQkJZ2V0UHJvY2Vzc0ZpbGVzSm9iKCkuY2xlYXJGaWxlcygpOwotCQlnZXRJbmRleGluZ0pvYigpLnNjaGVkdWxlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBzY2hlZHVsZXMgYSBKb2IgdG8gcHJvY2VzcyBjb2xsZWN0ZWQgZmlsZXMuIEFsbCBKU1AKLQkgKiBpbmRleGluZyBzaG91bGQgYmUgZG9uZSB0aHJvdWdoIHRoaXMgbWV0aG9kIG9yIHByb2Nlc3NGaWxlcyhJRmlsZSBmaWxlKQotCSAqIAotCSAqIEBwYXJhbSBmaWxlcwotCSAqLwotCWZpbmFsIHZvaWQgaW5kZXhGaWxlcyhJRmlsZVtdIGZpbGVzKSB7Ci0JCS8vIGRvbid0IHVzZSB0aGlzIHJ1bGUKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQ5MzEKLQkJLy8gcHJvY2Vzc0ZpbGVzLnNldFJ1bGUobmV3IEluZGV4RmlsZVJ1bGUoKSk7Ci0JCXByb2Nlc3NGaWxlc0pvYi5wcm9jZXNzKGZpbGVzKTsKLQl9Ci0KLQotCS8qKgotCSAqIFBhY2thZ2UgcHJvdGVjdGVkIGZvciBhY2Nlc3MgYnkgaW5uZXIgSm9iIGNsYXNzIGluIHJlc291cmNlQ2hhbmdlZCguLi4pCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUpTUFJlc291cmNlVmlzaXRvciBnZXRWaXNpdG9yKCkgewotCi0JCWlmICh0aGlzLmZWaXNpdG9yID09IG51bGwpIHsKLQkJCXRoaXMuZlZpc2l0b3IgPSBuZXcgSlNQUmVzb3VyY2VWaXNpdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZlZpc2l0b3I7Ci0JfQotCXZvaWQgc2F2ZUluZGV4ZXMoKSB7Ci0JCUluZGV4TWFuYWdlciBpbmRleE1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRJbmRleE1hbmFnZXIoKTsKLQkJSVByb2plY3RbXSBhbGxQcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBhbGxQcm9qZWN0cy5sZW5ndGg7IGorKykgewotCQkJaWYgKCFKc1dlYk5hdHVyZS5oYXNOYXR1cmUoYWxsUHJvamVjdHNbal0pIHx8ICFhbGxQcm9qZWN0c1tqXS5pc09wZW4oKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJSVBhdGgganNwTW9kZWxXb3JraW5nTG9jYXRpb24gPSBKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbEpzcFBsdWdpbldvcmtpbmdMb2NhdGlvbihhbGxQcm9qZWN0c1tqXSk7Ci0JCQlGaWxlIGZvbGRlciA9IG5ldyBGaWxlKGpzcE1vZGVsV29ya2luZ0xvY2F0aW9uLnRvT1NTdHJpbmcoKSk7Ci0JCQlTdHJpbmdbXSBmaWxlcyA9IGZvbGRlci5saXN0KCk7Ci0JCQlTdHJpbmcgbG9jYXkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChmaWxlc1tpXS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuaW5kZXgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlsb2NheSA9IGpzcE1vZGVsV29ya2luZ0xvY2F0aW9uLnRvU3RyaW5nKCkgKyAiLyIgKyBmaWxlc1tpXTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8gcmV1c2UgaW5kZXggZmlsZQotLy8gaW5kZXggPSBuZXcgSW5kZXgobG9jYXksIGFsbFByb2plY3RzW2pdLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpLCB0cnVlKTsKLS8vIC8vJE5PTi1OTFMtMSQKLS8vIGluZGV4LnNhdmUoKTsKLQkJCQkJCWluZGV4TWFuYWdlci5nZXRJbmRleChhbGxQcm9qZWN0c1tqXS5nZXRGdWxsUGF0aCgpLCBuZXcgUGF0aChsb2NheSksIHRydWUsIGZhbHNlKTsKLQkJCQkJCS8vIGluZGV4TWFuYWdlci5zYXZlSW5kZXgoaW5kZXgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB3ZSBzaG91bGQgYmUgc2h1dHRpbmcgZG93biwgd2FudCB0byBzaHV0IGRvd24gcXVpZXRseQotCQkJCWlmIChKc0luZGV4TWFuYWdlci5ERUJVRykgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NTA5MQotCS8vIG1ha2VzIHN1cmUgSW5kZXhNYW5hZ2VyIGlzIGF3YXJlIG9mIG91ciBpbmRleGVzCi0Jdm9pZCBzYXZlSW5kZXhlc09SSUdJTkFMKCkgewotCQlJbmRleE1hbmFnZXIgaW5kZXhNYW5hZ2VyID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCk7Ci0JCUlQYXRoIGpzcE1vZGVsV29ya2luZ0xvY2F0aW9uID0gSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuZ2V0TW9kZWxKc3BQbHVnaW5Xb3JraW5nTG9jYXRpb24oKTsKLQotCQlGaWxlIGZvbGRlciA9IG5ldyBGaWxlKGpzcE1vZGVsV29ya2luZ0xvY2F0aW9uLnRvT1NTdHJpbmcoKSk7Ci0JCVN0cmluZ1tdIGZpbGVzID0gZm9sZGVyLmxpc3QoKTsKLQkJU3RyaW5nIGxvY2F5ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJSW5kZXggaW5kZXggPSBudWxsOwotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmaWxlc1tpXS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuaW5kZXgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWxvY2F5ID0ganNwTW9kZWxXb3JraW5nTG9jYXRpb24udG9TdHJpbmcoKSArICIvIiArIGZpbGVzW2ldOyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIHJldXNlIGluZGV4IGZpbGUKLQkJCQkJaW5kZXggPSBuZXcgSW5kZXgobG9jYXksICJJbmRleCBmb3IgIiArIGxvY2F5LCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpbmRleE1hbmFnZXIuc2F2ZUluZGV4KGluZGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB3ZSBzaG91bGQgYmUgc2h1dHRpbmcgZG93biwgd2FudCB0byBzaHV0IGRvd24gcXVpZXRseQotCQkJaWYgKERFQlVHKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotLy8JSUNvbnRlbnRUeXBlIGdldEpzcENvbnRlbnRUeXBlKCkgewotLy8JCWlmICh0aGlzLmZDb250ZW50VHlwZUpTUCA9PSBudWxsKQotLy8JCQl0aGlzLmZDb250ZW50VHlwZUpTUCA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotLy8JCXJldHVybiB0aGlzLmZDb250ZW50VHlwZUpTUDsKLS8vCX0KLQotCS8qKgotCSAqIEEgY2hlY2sgdG8gc2VlIGlmIHRoZSBPU0dJIGZyYW1ld29yayBpcyBzaHV0dGluZyBkb3duLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgU3lzdGVtIEJ1bmRsZSBpcyBzdG9wcGVkIChpZS4gdGhlIGZyYW1ld29yayBpcwotCSAqICAgICAgICAgc2h1dHRpbmcgZG93bikKLQkgKi8KLQlib29sZWFuIGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkgewotCQkvLyBpbiB0aGUgRnJhbWV3b3JrIGNsYXNzIHRoZXJlJ3MgYSBub3RlOgotCQkvLyBzZXQgdGhlIHN0YXRlIG9mIHRoZSBTeXN0ZW0gQnVuZGxlIHRvIFNUT1BQSU5HLgotCQkvLyB0aGlzIG11c3QgYmUgZG9uZSBmaXJzdCBhY2NvcmRpbmcgdG8gc2VjdGlvbiA0LjE5LjIgZnJvbSB0aGUgT1NHaQotCQkvLyBSMyBzcGVjLgotCQlib29sZWFuIHNodXR0aW5nRG93biA9IFBsYXRmb3JtLmdldEJ1bmRsZShPU0dJX0ZSQU1FV09SS19JRCkuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuU1RPUFBJTkc7Ci0JCWlmIChERUJVRyAmJiBzaHV0dGluZ0Rvd24pIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQSW5kZXhNYW5hZ2VyOiBzeXN0ZW0gaXMgc2h1dHRpbmcgZG93biEiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzaHV0dGluZ0Rvd247Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKLQotCQkvLyBzdG9wIGxpc3RlbmluZwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihqc3BSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQotCi0JCS8vIHN0b3AgYW55IHNlYXJjaGluZwotCQlKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5zZXRDYW5jZWxlZCh0cnVlKTsKLQotCQkvLyBzdG9wIGxpc3RlbmluZyB0byBqb2JzCi0JCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5yZW1vdmVKb2JDaGFuZ2VMaXN0ZW5lcihpbmRleEpvYkNvb3JkaW5hdG9yKTsKLQotCi0JCWludCBtYXh3YWl0ID0gNTAwMDsKLQkJaWYgKHByb2Nlc3NGaWxlc0pvYiAhPSBudWxsKSB7Ci0JCQlwcm9jZXNzRmlsZXNKb2IuY2FuY2VsKCk7Ci0JCX0KLQkJLy8gYXR0ZW1wdCB0byBtYWtlIHN1cmUgdGhpcyBpbmRleGluZyBqb2IgaXMgbGl0dGVyYWxseQotCQkvLyBkb25lIGJlZm9yZSBjb250aW51aW5nLCBzaW5jZSB3ZSBhcmUgc2h1dHRpbmcgZG93bgotCQl3YWl0VGlsbE5vdFJ1bm5pbmcobWF4d2FpdCwgcHJvY2Vzc0ZpbGVzSm9iKTsKLQotCQlpZiAoaW5kZXhpbmdKb2IgIT0gbnVsbCkgewotCQkJaW5kZXhpbmdKb2IuY2FuY2VsKCk7Ci0JCX0KLQkJd2FpdFRpbGxOb3RSdW5uaW5nKG1heHdhaXQsIHByb2Nlc3NGaWxlc0pvYik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdhaXRUaWxsTm90UnVubmluZyhpbnQgbWF4U2Vjb25kcywgSm9iIGpvYikgewotCQlpbnQgcGF1c2VUaW1lID0gMTA7Ci0JCWludCBtYXh0cmllcyA9IG1heFNlY29uZHMgLyBwYXVzZVRpbWU7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXdoaWxlICgoY291bnQrKyA8IG1heHRyaWVzKSAmJiAoam9iLmdldFN0YXRlKCkgPT0gSm9iLlJVTk5JTkcpKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcChwYXVzZVRpbWUpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY291bnQ6ICIgKyBjb3VudCArICIgbWF4OiAiICsKLQkJCQkvLyBtYXh0cmllcyk7Ci0JCQl9Ci0JCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEluZGV4Sm9iQ29vcmRpbmF0b3IgZXh0ZW5kcyBKb2JDaGFuZ2VBZGFwdGVyIHsKLQkJCi0JCXB1YmxpYyB2b2lkIGFib3V0VG9SdW4oSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlKb2Igam9iVG9Db29yZGluYXRlID0gZXZlbnQuZ2V0Sm9iKCk7Ci0JCQlpZiAoaXNKb2JUb0F2b2lkKGpvYlRvQ29vcmRpbmF0ZSkpIHsKLQkJCQkvLyBqb2Igd2lsbCBiZSByZXNjaGVkdWxlZCB3aGVuIHRoZSBqb2Igd2UKLQkJCQkvLyBhcmUgYXZvaWRpbmcgKGVnLiBidWlsZCkgaXMgZG9uZQotCQkJCWdldFByb2Nlc3NGaWxlc0pvYigpLmNhbmNlbCgpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJjYW5jZWw6IiArIGpvYlRvQ29vcmRpbmF0ZS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQotCQkJSm9iIGpvYlRvQ29vcmRpbmF0ZSA9IGV2ZW50LmdldEpvYigpOwotCQkJaWYgKGlzSm9iVG9Bdm9pZChqb2JUb0Nvb3JkaW5hdGUpKSB7Ci0JCQkJaWYgKGdldFByb2Nlc3NGaWxlc0pvYigpLmdldEZpbGVzKCkubGVuZ3RoID4gMCkgewotCQkJCQlnZXRQcm9jZXNzRmlsZXNKb2IoKS5zY2hlZHVsZSg1MDApOwotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigic2NoZWR1bGU6IiArIGpvYlRvQ29vcmRpbmF0ZS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCQkJCi0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBpc0pvYlRvQXZvaWQoSm9iIGpvYlRvQ29vcmRpbmF0ZSkgewotCQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCWlmIChqb2JUb0Nvb3JkaW5hdGUuYmVsb25nc1RvKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCkgfHwgam9iVG9Db29yZGluYXRlLmJlbG9uZ3NUbyhSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX01BTlVBTF9CVUlMRCkgfHwgam9iVG9Db29yZGluYXRlLmJlbG9uZ3NUbyhSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fUkVGUkVTSCkpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEpTUFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQotCQkJaWYgKGlzSW5pdGlhbGl6aW5nKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIGlnbm9yZSByZXNvdXJjZSBjaGFuZ2VzIGlmIGFscmVhZHkgcmVidWlsZGluZwotCQkJaWYgKGdldEluZGV4U3RhdGUoKSA9PSBTX1JFQlVJTERJTkcpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvLyBwcmV2aW91c2x5IGNhbmNlbGVkLCBuZWVkcyBlbnRpcmUgaW5kZXggcmVidWlsZAotCQkJaWYgKGdldEluZGV4U3RhdGUoKSA9PSBTX0NBTkNFTEVEKSB7Ci0JCQkJLy8gcmVidWlsZEluZGV4KCk7Ci0JCQkJLy8ganVzdCByZXN1bWUgaW5kZXhpbmcKLQkJCQlnZXRQcm9jZXNzRmlsZXNKb2IoKS5zY2hlZHVsZSg1MDApOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJzY2hlZHVsZTogcmVzb3VyY2UgY2hhbmdlZCwgcHJldmlvdXNseSBjYW5jZWxlZCIpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhICE9IG51bGwpIHsKLQkJCQkvLyBvbmx5IGNhcmUgYWJvdXQgYWRkcyBvciBjaGFuZ2VzIHJpZ2h0IG5vdy4uLgotCQkJCWludCBraW5kID0gZGVsdGEuZ2V0S2luZCgpOwotCQkJCWJvb2xlYW4gYWRkZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLkFEREVEKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRDsKLQkJCQlib29sZWFuIGNoYW5nZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLkNIQU5HRUQpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQ7Ci0JCQkJaWYgKGFkZGVkIHx8IGNoYW5nZWQpIHsKLQotCQkJCQkvLyBvbmx5IGFuYWx5emUgdGhlIGZ1bGwgKHN0YXJ0aW5nIGF0IHJvb3QpIGRlbHRhCi0JCQkJCS8vIGhpZXJhcmNoeQotCQkJCQlpZiAoZGVsdGEuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLmVxdWFscygiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJSlNQUmVzb3VyY2VWaXNpdG9yIHYgPSBnZXRWaXNpdG9yKCk7Ci0JCQkJCQkJLy8gY2xlYXIgZnJvbSBsYXN0IHJ1bgotCQkJCQkJCXYucmVzZXQoKTsKLQkJCQkJCQkvLyBjb3VudCBmaWxlcywgcG9zc2libHkgZG8gdGhpcyBpbiBhIGpvYiB0b28uLi4KLQkJCQkJCQkvLyBkb24ndCBpbmNsdWRlIFBIQU5UT00gcmVzb3VyY2VzCi0JCQkJCQkJZGVsdGEuYWNjZXB0KHYsIGZhbHNlKTsKLQotCQkJCQkJCS8vIHByb2Nlc3MgZmlsZXMgZnJvbSB0aGlzIGRlbHRhCi0JCQkJCQkJSUZpbGVbXSBmaWxlcyA9IHYuZ2V0RmlsZXMoKTsKLQkJCQkJCQlpZiAoZmlsZXMubGVuZ3RoID4gMCkgewotCQkJCQkJCQkvKgotCQkJCQkJCQkgKiBKb2IgY2hhbmdlIGxpc3RlbmVyIHNob3VsZCBzZXQgYmFjayB0bwotCQkJCQkJCQkgKiBzdGFibGUgd2hlbiBmaW5pc2hlZAotCQkJCQkJCQkgKi8KLQkJCQkJCQkJc2V0VXBkYXRpbmdTdGF0ZSgpOwotCQkJCQkJCQkvLyBwcm9jZXNzRmlsZXMoZmlsZXMpOwotCQkJCQkJCQlpbmRleEZpbGVzKGZpbGVzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gbmVlZCB0byBzZXQgc3RhdGUgaGVyZSBzb21laG93LCBhbmQgcmVpbmRleAotCQkJCQkJCS8vIG90aGVyd2lzZSBpbmRleCB3aWxsIGJlIHVucmVsaWFibGUKLQkJCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBuZWVkIHRvIHNldCBzdGF0ZSBoZXJlIHNvbWVob3csIGFuZCByZWluZGV4Ci0JCQkJCQkJLy8gb3RoZXJ3aXNlIGluZGV4IHdpbGwgYmUgdW5yZWxpYWJsZQotCQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlJbmRleFdvcmtzcGFjZUpvYiBnZXRJbmRleGluZ0pvYigpIHsKLQkJcmV0dXJuIGluZGV4aW5nSm9iOwotCX0KLQotCVByb2Nlc3NGaWxlc0pvYiBnZXRQcm9jZXNzRmlsZXNKb2IoKSB7Ci0JCXJldHVybiBwcm9jZXNzRmlsZXNKb2I7Ci0JfQotCi0JYm9vbGVhbiBpc0luaXRpYWxpemluZygpIHsKLQkJcmV0dXJuIGluaXRpYWxpemluZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzUGF0aEluZGV4ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzUGF0aEluZGV4ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUyZjI0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc1BhdGhJbmRleGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLklKYXZhU2NyaXB0U2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlV0aWw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSooY29waWVkIGZyb20gSlNQKQotICogcGFfVE9ETyBTdGlsbCBuZWVkIHRvIHRha2UgaW50byBjb25zaWRlcmF0aW9uOgotICogCS0gZm9jdXMgaW4gd29ya3NwYWNlCi0gKiAgLSBzZWFyY2ggcGF0dGVybgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSnNQYXRoSW5kZXhlciB7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJCi0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9kZWJ1Zy9qc3NlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0gCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0JCi0JLy8gdmlzaXRvciB0aGF0IHJldHJpZXZlcyBqc3AgcHJvamVjdCBwYXRocyBmb3IgYWxsIGpzcCBmaWxlcyBpbiB0aGUgd29ya3NwYWNlCi0JY2xhc3MgSlNQRmlsZVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VQcm94eVZpc2l0b3IgewotCQkvLyBoYXNoIG1hcCBmb3JjZXMgb25seSBvbmUgb2YgZWFjaCBmaWxlCi0JCXByaXZhdGUgSGFzaE1hcCBmUGF0aHMgPSBuZXcgSGFzaE1hcCgpOwotCQlJSmF2YVNjcmlwdFNlYXJjaFNjb3BlIGZTY29wZSA9IG51bGw7Ci0JCVNlYXJjaFBhdHRlcm4gZlBhdHRlcm4gPSBudWxsOwotCi0JCXB1YmxpYyBKU1BGaWxlVmlzaXRvcihTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElKYXZhU2NyaXB0U2VhcmNoU2NvcGUgc2NvcGUpIHsKLQkJCXRoaXMuZlBhdHRlcm4gPSBwYXR0ZXJuOwotCQkJdGhpcy5mU2NvcGUgPSBzY29wZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkKLQkJCWlmKEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJaWYgKHByb3h5LmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCi0JCQkJLy9JQ29udGVudFR5cGUgY29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzU1MwotCQkJCS8vIGNoZWNrIHRoaXMgYmVmb3JlIGRlc2NyaXB0aW9uCi0JCQkJLy8gY2hlY2sgbmFtZSBiZWZvcmUgYWN0dWFsbHkgZ2V0dGluZyB0aGUgZmlsZSAobGVzcyB3b3JrKQotCQkJCS8vaWYoY29udGVudFR5cGVKU1AuaXNBc3NvY2lhdGVkV2l0aChwcm94eS5nZXROYW1lKCkpKSB7Ci0JCQkJaWYoVXRpbC5pc0pzVHlwZShwcm94eS5nZXROYW1lKCkpKXsJCi0JCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpcHJveHkucmVxdWVzdFJlc291cmNlKCk7Ci0JCQkJCS8vSUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJCQlTdHJpbmcgY3RJZCA9IG51bGw7Ci0vLwkJCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0vLwkJCQkJCWN0SWQgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKS5nZXRJZCgpOwotLy8JCQkJCX0KLQkJCQkJLy9pZiAoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUC5lcXVhbHMoY3RJZCkpIHsKLQkJCQkJLy9pZihVdGlsLmlzSnNUeXBlKGZpbGUuZ2V0TmFtZSgpKSl7Ci0JCQkJCQlpZiAodGhpcy5mU2NvcGUuZW5jbG9zZXMocHJveHkucmVxdWVzdEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpIHsKLQkKLQkJCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJhZGRpbmcgc2VsZWN0ZWQgaW5kZXggcGF0aDoiICsgZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQotCQkJCQkJCWZQYXRocy5wdXQoZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpLCBKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5jb21wdXRlSW5kZXhMb2NhdGlvbihmaWxlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkpKTsKLQkJCQkJCX0KLQkJCQkJLy99Ci0JCQkJfQotCQkJCS8vIGRvbid0IHNlYXJjaCBkZWVwZXIgZm9yIGZpbGVzCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgSVBhdGhbXSBnZXRQYXRocygpIHsKLQkJCXJldHVybiAoSVBhdGhbXSkgZlBhdGhzLnZhbHVlcygpLnRvQXJyYXkobmV3IElQYXRoW2ZQYXRocy5zaXplKCldKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJUGF0aFtdIGdldFZpc2libGVKc3BQYXRocyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElKYXZhU2NyaXB0U2VhcmNoU2NvcGUgc2NvcGUpIHsKLQotCQlKU1BGaWxlVmlzaXRvciBqc3BGaWxlVmlzaXRvciA9IG5ldyBKU1BGaWxlVmlzaXRvcihwYXR0ZXJuLCBzY29wZSk7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmFjY2VwdChqc3BGaWxlVmlzaXRvciwgMCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4ganNwRmlsZVZpc2l0b3IuZ2V0UGF0aHMoKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzU2VhcmNoRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzU2VhcmNoRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFhOTg5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc1NlYXJjaERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnMuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSooY29waWVkIGZyb20gSlNQKQotICogQ3JlYXRlZCB3aXRoIGEgLmpzcCBmaWxlLCBidXQgc2hvdWxkIGFwcGVhciB0byBiZSBhIC5qYXZhIGZpbGUgZm9yIGluZGV4aW5nCi0gKiBhbmQgc2VhcmNoaW5nIHB1cnBvc2VzLiBUaGVyZSBhcmUgcHVycG9zZWx5IGZldyBmaWVsZHMgaW4gdGhpcyBjbGFzcywgYW5kCi0gKiB0aG9zZSBmaWVsZHMgYXJlIGxpZ2h0d2VpZ2h0IHNpbmNlIGl0J3MgcG9zc2libGUgZm9yIG1hbnkgSlNQIHNlYXJjaAotICogZG9jdW1lbnRzIHRvIGV4aXN0IGluIG1lbW9yeSBhdCBvbmUgdGltZSAoZWcuIGFmdGVyIGltcG9ydGluZyBhIHByb2plY3QKLSAqIHdpdGggYSBsYXJnZSBudW1iZXIgb2YgSlNQIGZpbGVzKQotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSnNTZWFyY2hEb2N1bWVudCB7Ci0KLQlwcml2YXRlIFN0cmluZyBVTktOT1dOX1BBVEggPSAiKipwYXRoIHVua25vd24qKiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBmSlNQUGF0aFN0cmluZyA9IFVOS05PV05fUEFUSDsKLQlwcml2YXRlIFN0cmluZyBmQ1VQYXRoID0gVU5LTk9XTl9QQVRIOwotCXByaXZhdGUgU2VhcmNoUGFydGljaXBhbnQgZlBhcnRpY2lwYW50ID0gbnVsbDsKLQlwcml2YXRlIGxvbmcgZkxhc3RNb2RpZmllZFN0YW1wOwotCXByaXZhdGUgY2hhcltdIGZDYWNoZWRDaGFyQ29udGVudHM7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcGFyYW0gcGFydGljaXBhbnQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSnNTZWFyY2hEb2N1bWVudChTdHJpbmcgZmlsZVBhdGgsIFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50KSB7Ci0KLQkJdGhpcy5mSlNQUGF0aFN0cmluZyA9IGZpbGVQYXRoOwotCQl0aGlzLmZQYXJ0aWNpcGFudCA9IHBhcnRpY2lwYW50OwotCX0KLQotCXB1YmxpYyBTZWFyY2hQYXJ0aWNpcGFudCBnZXRQYXJ0aWNpcGFudCgpIHsKLQkJcmV0dXJuIHRoaXMuZlBhcnRpY2lwYW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50I2dldENoYXJDb250ZW50cygpCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDaGFyQ29udGVudHMoKSB7Ci0JCQotCQlpZigoZkNhY2hlZENoYXJDb250ZW50cyA9PSBudWxsKSB8fCBpc0RpcnR5KCkpIHsKLQkJICAgIElKc1RyYW5zbGF0aW9uIHRyYW5zID0gZ2V0SlNQVHJhbnNsYXRpb24oKTsgICAgCi0JCSAgICBmQ2FjaGVkQ2hhckNvbnRlbnRzID0gdHJhbnMgIT0gbnVsbCA/IHRyYW5zLmdldEpzVGV4dCgpLnRvQ2hhckFycmF5KCkgOiBuZXcgY2hhclswXTsKLQkJICAgIGZDVVBhdGggPSB0cmFucy5nZXRKYXZhUGF0aCgpOwotCQl9Ci0JCXJldHVybiBmQ2FjaGVkQ2hhckNvbnRlbnRzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVRleHQoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKGdldENoYXJDb250ZW50cygpKTsKLQl9Ci0KLQlwcml2YXRlIElNb2RlbE1hbmFnZXIgZ2V0TW9kZWxNYW5hZ2VyKCkgewotCQlyZXR1cm4gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdCdzIG5vdCByZWNvbW1lbmRlZCBmb3IgY2xpZW50cyB0byBob2xkIG9uIHRvIHRoaXMgSlNQVHJhbnNsYXRpb24KLQkgKiBzaW5jZSBpdCdzIGtpbmQgb2YgbGFyZ2UuIElmIHBvc3NpYmxlLCBob2xkIG9uIHRvIHRoZQotCSAqIEpTUFNlYXJjaERvY3VtZW50LCB3aGljaCBpcyBtb3JlIG9mIGEgbGlnaHR3ZWlnaHQgcHJveHkuCi0JICogCi0JICogQHJldHVybiB0aGUgSlNQVHJhbnNsYXRpb24gZm9yIHRoZSBqc3AgZmlsZSwgb3IgbnVsbCBpZiBpdCdzIGFuCi0JICogICAgICAgICB1bnN1cHBvcnRlZCBmaWxlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBJSnNUcmFuc2xhdGlvbiBnZXRKU1BUcmFuc2xhdGlvbigpIHsKLQkJSUpzVHJhbnNsYXRpb24gdHJhbnNsYXRpb24gPSBudWxsOwotCQlJRmlsZSBqc3BGaWxlID0gZ2V0RmlsZSgpOwotCQlpZiAoIUpzU2VhcmNoU3VwcG9ydC5pc0pzcChqc3BGaWxlKSkgewotCQkJcmV0dXJuIHRyYW5zbGF0aW9uOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBnZXQgZXhpc3RpbmcgbW9kZWwgZm9yIHJlYWQsIHRoZW4gZ2V0IGRvY3VtZW50IGZyb20gaXQKLQkJCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCQlpZiAobW9kZWxNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlqc3BGaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJbW9kZWwgPSBtb2RlbE1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGpzcEZpbGUpOwotCQkJfQotCQkJLy8gaGFuZGxlIHVuc3VwcG9ydGVkCi0JCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSAoSURPTU1vZGVsKW1vZGVsOwotCQkJCXNldHVwQWRhcHRlckZhY3RvcnkoeG1sTW9kZWwpOwotCQkJCUlET01Eb2N1bWVudCBkb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCUpzVHJhbnNsYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIGRvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQl0cmFuc2xhdGlvbiA9IGFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24oZmFsc2UpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWwgZSkgewotCQkJLy8gbm8gbmVlZCB0byBsb2cgdGhpcy4gSnVzdCBjb25zaWRlciBpdCBhbiBpbnZhbGlkIGZpbGUgZm9yIG91cgotCQkJLy8gcHVycG9zZXMuCi0JCQkvLyBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJhbnNsYXRpb247Ci0JfQotCi0JLyoqCi0JICogYWRkIHRoZSBmYWN0b3J5IGZvciBKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgaGVyZQotCSAqIAotCSAqIEBwYXJhbSBzbQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXR1cEFkYXB0ZXJGYWN0b3J5KElTdHJ1Y3R1cmVkTW9kZWwgc20pIHsKLQkJSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5LnNldHVwQWRhcHRlckZhY3Rvcnkoc20pOwotCX0KLQotCS8qKgotCSAqIHRoZSBwYXRoIHRvIHRoZSBKYXZhIGNvbXBpbGF0aW9uIHVuaXQKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudCNnZXRQYXRoKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JICAgIC8vIGNhY2hpbmcgdGhlIHBhdGggc2luY2UgaXQncyBleHBlbnNpdmUgdG8gZ2V0IHRyYW5zbGF0aW9uCi0JCS8vIGltcG9ydGFudCB0aGF0IGlzRGlydHkoKSBjaGVjayBpcyBzZWNvbmQgdG8gY2FjaGUgbW9kaWZpY2F0aW9uIHN0YW1wCi0JICAgIGlmKCh0aGlzLmZDVVBhdGggPT0gbnVsbCkgfHwgaXNEaXJ0eSgpIHx8ICh0aGlzLmZDVVBhdGggPT0gVU5LTk9XTl9QQVRIKSkgewotCSAgICAgICAgSUpzVHJhbnNsYXRpb24gdHJhbnMgPSBnZXRKU1BUcmFuc2xhdGlvbigpOwotCSAgICAgICAgaWYodHJhbnMgIT0gbnVsbCkgewotCSAgICAgICAgICAgIHRoaXMuZkNVUGF0aCA9IHRyYW5zLmdldEphdmFQYXRoKCk7Ci0JICAgICAgICAgICAgLy8gc2F2ZSBzaW5jZSBpdCdzIGV4cGVuc2l2ZSB0byBjYWxjdWxhdGUgYWdhaW4gbGF0ZXIKLQkgICAgICAgICAgICBmQ2FjaGVkQ2hhckNvbnRlbnRzID0gdHJhbnMuZ2V0SnNUZXh0KCkudG9DaGFyQXJyYXkoKTsKLQkgICAgICAgIH0KLQkgICAgfQotCQlyZXR1cm4gZkNVUGF0aCAhPSBudWxsID8gZkNVUGF0aCA6IFVOS05PV05fUEFUSDsKLQl9Ci0KLS8vCXB1YmxpYyBpbnQgZ2V0SnNwT2Zmc2V0KGludCBqYXZhT2Zmc2V0KSB7Ci0vLwkJLy8gY29waWVkIGZyb20gSlNQVHJhbnNsYXRpb24KLS8vCQlpbnQgcmVzdWx0ID0gLTE7Ci0vLwkJaW50IG9mZnNldEluUmFuZ2UgPSAwOwotLy8JCVBvc2l0aW9uIGpzcFBvcywgamF2YVBvcyA9IG51bGw7Ci0vLwkJSUpzVHJhbnNsYXRpb24gdHJhbnMgPSBnZXRKU1BUcmFuc2xhdGlvbigpOwotLy8JCWlmICh0cmFucyAhPSBudWxsKSB7Ci0vLwkJCUhhc2hNYXAgamF2YTJqc3BNYXAgPSB0cmFucy5nZXRKYXZhMkpzcE1hcCgpOwotLy8KLS8vCQkJLy8gaXRlcmF0ZSBhbGwgbWFwcGVkIGphdmEgcmFuZ2VzCi0vLwkJCUl0ZXJhdG9yIGl0ID0gamF2YTJqc3BNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLS8vCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotLy8JCQkJamF2YVBvcyA9IChQb3NpdGlvbikgaXQubmV4dCgpOwotLy8JCQkJLy8gbmVlZCB0byBjb3VudCB0aGUgbGFzdCBwb3NpdGlvbiBhcyBpbmNsdWRlZAotLy8JCQkJaWYgKCFqYXZhUG9zLmluY2x1ZGVzKGphdmFPZmZzZXQpICYmICEoamF2YVBvcy5vZmZzZXQgKyBqYXZhUG9zLmxlbmd0aCA9PSBqYXZhT2Zmc2V0KSkKLS8vCQkJCQljb250aW51ZTsKLS8vCi0vLwkJCQlvZmZzZXRJblJhbmdlID0gamF2YU9mZnNldCAtIGphdmFQb3Mub2Zmc2V0OwotLy8JCQkJanNwUG9zID0gKFBvc2l0aW9uKSBqYXZhMmpzcE1hcC5nZXQoamF2YVBvcyk7Ci0vLwotLy8JCQkJaWYgKGpzcFBvcyAhPSBudWxsKQotLy8JCQkJCXJlc3VsdCA9IGpzcFBvcy5vZmZzZXQgKyBvZmZzZXRJblJhbmdlOwotLy8JCQkJZWxzZSB7Ci0vLwkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJqc3BQb3NpdGlvbiB3YXMgbnVsbCEiICsgamF2YU9mZnNldCk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCX0KLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiByZXN1bHQ7Ci0vLwl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlQYXRoIGpzcFBhdGggPSBuZXcgUGF0aCh0aGlzLmZKU1BQYXRoU3RyaW5nKTsKLQkJSUZpbGUganNwRmlsZSA9IHJvb3QuZ2V0RmlsZShqc3BQYXRoKTsKLQkJaWYgKCFqc3BGaWxlLmV4aXN0cygpKSB7Ci0JCQkvLyBwb3NzaWJseSBvdXRzaWRlIHdvcmtzcGFjZQotCQkJanNwRmlsZSA9IHJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKGpzcFBhdGgpOwotCQl9Ci0JCXJldHVybiBqc3BGaWxlOwotCX0KLQotCQotCXByaXZhdGUgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCUlGaWxlIGYgPSBnZXRGaWxlKCk7Ci0JCWlmKGYgIT0gbnVsbCkgewotCQkJbG9uZyBjdXJyZW50U3RhbXAgPSBmLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCQlpZihjdXJyZW50U3RhbXAgIT0gZkxhc3RNb2RpZmllZFN0YW1wKSB7Ci0JCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJZkxhc3RNb2RpZmllZFN0YW1wID0gY3VycmVudFN0YW1wOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gbm90aGluZyB0byBkbyBub3cgc2luY2UgSlNQVHJhbnNsYXRpb24gaXMgY3JlYXRlZCBvbiB0aGUgZmx5Ci0JfQotCi0JLyoqCi0JICogZm9yIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiW0pTUFNlYXJjaERvY3VtZW50OiIgKyB0aGlzLmZKU1BQYXRoU3RyaW5nICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQjZ2V0RW5jb2RpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQjZ2V0Qnl0ZUNvbnRlbnRzKCkKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVDb250ZW50cygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc1NlYXJjaFBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc1NlYXJjaFBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YWMzYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSnNTZWFyY2hQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLklKYXZhU2NyaXB0U2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qKGNvcGllZCBmcm9tIEpTUCkKLSAqIEludGVncmF0aW9uIG9mIEpTUCB3LyBqYXZhIHNlYXJjaC4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpzU2VhcmNoUGFydGljaXBhbnQgZXh0ZW5kcyBTZWFyY2hQYXJ0aWNpcGFudCB7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGNhbGN1bGF0ZVZhbHVlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNhbGN1bGF0ZVZhbHVlKCkgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHNlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gZGVidWcgPSAodmFsdWUgIT0gbnVsbCkgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBkZWJ1ZzsKLQl9Ci0KLQkvKioKLQkgKiBJbXBvcnRhbnQgdG8gbmV2ZXIgcmV0dXJuIG51bGwgaGVyZSBvciBlbHNlIEphdmEgc2VhcmNoIHBhcnRpY2lwYXRpb24KLQkgKiB3aWxsIGJyZWFrLgotCSAqLwotCXB1YmxpYyBTZWFyY2hEb2N1bWVudCBnZXREb2N1bWVudChTdHJpbmcgZG9jdW1lbnRQYXRoKSB7Ci0JCVNlYXJjaERvY3VtZW50IHNEb2MgPSBKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5nZXRTZWFyY2hEb2N1bWVudChkb2N1bWVudFBhdGgpOwotCi0JCWlmIChzRG9jID09IG51bGwpIHsKLQkJCS8vIHJldHVybiBhIGR1bW15IGRvYyBoZXJlIHNvIHNlYXJjaCBwYXJ0aWNpcGF0aW9uIGRvZXNuJ3QgYnJlYWsKLQkJCXJldHVybiBuZXcgTnVsbFNlYXJjaERvY3VtZW50KGRvY3VtZW50UGF0aCk7Ci0JCX0KLQkJcmV0dXJuIHNEb2M7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJFbWJlZGVkIEphdmFTY3JpcHQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElQYXRoW10gc2VsZWN0SW5kZXhlcyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElKYXZhU2NyaXB0U2VhcmNoU2NvcGUgc2NvcGUpIHsKLQkJSnNQYXRoSW5kZXhlciBpbmRleGVyID0gbmV3IEpzUGF0aEluZGV4ZXIoKTsKLQkJcmV0dXJuIGluZGV4ZXIuZ2V0VmlzaWJsZUpzcFBhdGhzKHBhdHRlcm4sIHNjb3BlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbmRleERvY3VtZW50KFNlYXJjaERvY3VtZW50IGRvY3VtZW50LCBJUGF0aCBpbmRleFBhdGgpIHsKLQkJaWYgKCEoZG9jdW1lbnQgaW5zdGFuY2VvZiBKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIHVzZSBKYXZhIHNlYXJjaCBpbmRleGluZwotCQlTZWFyY2hFbmdpbmUuZ2V0RGVmYXVsdFNlYXJjaFBhcnRpY2lwYW50KCkuaW5kZXhEb2N1bWVudChkb2N1bWVudCwgaW5kZXhQYXRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2NhdGVNYXRjaGVzKFNlYXJjaERvY3VtZW50W10gaW5kZXhNYXRjaGVzLCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElKYXZhU2NyaXB0U2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmICgobW9uaXRvciAhPSBudWxsKSAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZmlsdGVyIG91dCBudWxsIG1hdGNoZXMKLQkJTGlzdCBmaWx0ZXJlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU2VhcmNoRG9jdW1lbnQgbWF0Y2ggPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4TWF0Y2hlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJmb3VuZCBwb3NzaWJsZSBtYXRjaGluZyBKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZTogIiArIGluZGV4TWF0Y2hlc1tpXSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCW1hdGNoID0gaW5kZXhNYXRjaGVzW2ldOwotCQkJaWYgKG1hdGNoICE9IG51bGwpIHsKLQkJCQkvLyBzb21lIG1hdGNoZXMgbWF5IGJlIG51bGwsIG9yIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgZGF0ZSwKLQkJCQkvLyB0aGUgZmlsZSBtYXkgbm90IGV2ZW4gZXhpc3QKLQkJCQlpZiAoKG1hdGNoIGluc3RhbmNlb2YgSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUpICYmICgoSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUpIG1hdGNoKS5nZXRGaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQkJZmlsdGVyZWQuYWRkKG1hdGNoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpbmRleE1hdGNoZXMgPSAoU2VhcmNoRG9jdW1lbnRbXSkgZmlsdGVyZWQudG9BcnJheShuZXcgU2VhcmNoRG9jdW1lbnRbZmlsdGVyZWQuc2l6ZSgpXSk7Ci0JCVNlYXJjaEVuZ2luZS5nZXREZWZhdWx0U2VhcmNoUGFydGljaXBhbnQoKS5sb2NhdGVNYXRjaGVzKGluZGV4TWF0Y2hlcywgcGF0dGVybiwgc2NvcGUsIHJlcXVlc3RvciwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQjZ2V0RG9jdW1lbnQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUpCi0JICovCi0JcHVibGljIFNlYXJjaERvY3VtZW50IGdldERvY3VtZW50KElGaWxlIGZpbGUpIHsKLQkJLy8gbmV2ZXIgZ2V0cyBjYWxsZWQ/Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzU2VhcmNoU2NvcGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL2phdmFzY3JpcHQvc2VhcmNoL0pzU2VhcmNoU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE1ZTdmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc1NlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLklKYXZhU2NyaXB0U2VhcmNoU2NvcGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qKGNvcGllZCBmcm9tIEpTUCkKLSAqIFVzZWQgdG8gY29uc3RyYWluIEpTUC9qYXZhIHNlYXJjaCB0byBjZXJ0YWluIHBhdGhzIGFuZCBlbGVtZW50cy4KLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKc1NlYXJjaFNjb3BlIGltcGxlbWVudHMgSUphdmFTY3JpcHRTZWFyY2hTY29wZSB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkVuY2xvc2VzQWxsID0gZmFsc2U7Ci0JcHJpdmF0ZSBMaXN0IGZSZXNvdXJjZVBhdGhzID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZkphdmFFbGVtZW50cyA9IG51bGw7Ci0KLQlwdWJsaWMgSnNTZWFyY2hTY29wZSgpIHsKLQkJLy8gZW1wdHkgY29uc3RydWN0b3IganVzdCByZXR1cm5zIHRydWUgZm9yIGV2ZXJ5dGhpbmcKLQkJLy8gZXZlcnl0aGluZyBpcyBpbiBzY29wZQotCQl0aGlzLmZFbmNsb3Nlc0FsbCA9IHRydWU7Ci0JCWluaXQoKTsKLQl9Ci0KLQlwdWJsaWMgSnNTZWFyY2hTY29wZShTdHJpbmdbXSByZXNvdXJjZVN0cmluZ1BhdGgpIHsKLQkJaW5pdCgpOwotCQlmUmVzb3VyY2VQYXRocy5hZGRBbGwoQXJyYXlzLmFzTGlzdChyZXNvdXJjZVN0cmluZ1BhdGgpKTsKLQl9Ci0KLQlwdWJsaWMgSnNTZWFyY2hTY29wZShJSmF2YVNjcmlwdEVsZW1lbnRbXSBqYXZhRWxlbWVudCkgewotCQlpbml0KCk7Ci0JCWZKYXZhRWxlbWVudHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoamF2YUVsZW1lbnQpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJdGhpcy5mUmVzb3VyY2VQYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdGhpcy5mSmF2YUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVuY2xvc2VzKFN0cmluZyByZXNvdXJjZVBhdGhTdHJpbmcpIHsKLQotCQlpZiAodGhpcy5mRW5jbG9zZXNBbGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGVuY2xvc2VzUGF0aChyZXNvdXJjZVBhdGhTdHJpbmcpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbmNsb3NlcyhJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCkgewotCi0JCS8vIHBhX1RPRCBpbXBsZW1lbnQKLQkJaWYgKHRoaXMuZkVuY2xvc2VzQWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVuY2xvc2VzKElSZXNvdXJjZVByb3h5IGVsZW1lbnQpIHsKLQotCQlpZiAodGhpcy5mRW5jbG9zZXNBbGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGVuY2xvc2VzUGF0aChlbGVtZW50LnJlcXVlc3RGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGF0aChTdHJpbmcgcGF0aCkgewotCQl0aGlzLmZSZXNvdXJjZVBhdGhzLmFkZChwYXRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFbGVtZW50KElKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZkphdmFFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGVuY2xvc2VzUGF0aChTdHJpbmcgcG9zc2libGUpIHsKLQotCQlTdHJpbmdbXSBwYXRocyA9IChTdHJpbmdbXSkgZlJlc291cmNlUGF0aHMudG9BcnJheShuZXcgU3RyaW5nW2ZSZXNvdXJjZVBhdGhzLnNpemUoKV0pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocG9zc2libGUuZXF1YWxzKHBhdGhzW2ldKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCi0JCXJldHVybiAiSmF2YVNjcmlwdCBTZWFyY2ggU2NvcGUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElQYXRoW10gZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzKCkgewotCQlyZXR1cm4gKElQYXRoW10pIGZSZXNvdXJjZVBhdGhzLnRvQXJyYXkobmV3IElQYXRoW2ZSZXNvdXJjZVBhdGhzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZEV4Y2x1ZGUoU3RyaW5nIGNvbnRhaW5lciwgU3RyaW5nIHJlc291cmNlTmFtZSkgewotCQkvKiBhdXRvIGdlbiAqLwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvSnNTZWFyY2hTdXBwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc1NlYXJjaFN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ1MTIxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9Kc1NlYXJjaFN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5DUkMzMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5JSmF2YVNjcmlwdFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5JSmF2YVNjcmlwdFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JlLkphdmFNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuSnNDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuSnNDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc05hbWVNYW5nbGVyVXRpbDsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSooY29waWVkIGZyb20gSlNQKQotICogQ2VudHJhbCBhY2Nlc3MgdG8gamF2YSBpbmRleGluZyBhbmQgc2VhcmNoLiBBbGwgY29udGFjdCBiZXR3ZWVuIEpEVCBpbmRleGluZwotICogYW5kIFNlYXJjaGluZyBzaG91bGQgYmUgZG9uZSB0aHJvdWdoIGhlcmUuCi0gKiAKLSAqIENsaWVudHMgc2hvdWxkIGFjY2VzcyB0aGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIHZpYSB0aGUgc2luZ2xlIGluc3RhbmNlIHZpYQotICogPGNvZGU+Z2V0SW5zdGFuY2UoKTwvY29kZT4uCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKc1NlYXJjaFN1cHBvcnQgewotCi0gICAgLy8gZm9yIGRlYnVnZ2luZwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotICAgIHN0YXRpYyB7Ci0gICAgCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9kZWJ1Zy9qc3NlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0gCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSnNTZWFyY2hTdXBwb3J0IHNpbmdsZXRvbiA9IG51bGw7Ci0KLSAgICBwcml2YXRlIEpzU2VhcmNoUGFydGljaXBhbnQgZlBhcnRpY2lwYW50ID0gbnVsbDsKLQotICAgIHByaXZhdGUgSVBhdGggZkpzcFBsdWdpbkxvY2F0aW9uID0gbnVsbDsKLQotICAgIC8vIHBhX1RPRE8gbWF5IGJlIHNsb3cgKGVzcCBmb3IgaW5kZXhpbmcgZW50aXJlIHdvcmtzcGFjZSkKLSAgICBwcml2YXRlIGZpbmFsIENSQzMyIGZDaGVja3N1bUNhbGN1bGF0b3IgPSBuZXcgQ1JDMzIoKTsKLQotICAgIC8qKiBtYWluIGNhbmNlbCBtb250aW9yIGZvciBhbGwgc2VhcmNoIHN1cHBvcnQgKi8KLSAgICBwcml2YXRlIGZpbmFsIElQcm9ncmVzc01vbml0b3IgZk1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCi0gICAgcHJpdmF0ZSBKc1NlYXJjaFN1cHBvcnQoKSB7Ci0gICAgICAgIC8vIGZvcmNlIHVzZSBvZiBzaW5nbGUgaW5zdGFuY2UKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG9wZXJhdGlvbiBlbnN1cmVzIHRoYXQgdGhlIGxpdmUgcmVzb3VyY2UncyBzZWFyY2ggbWFya2VycyBzaG93IHVwIGluCi0gICAgICogdGhlIG9wZW4gZWRpdG9yLiBJdCBhbHNvIGFsbG93cyB0aGUgYWJpbGl0eSB0byBwYXNzIGluIGEgUHJvZ3Jlc3NNb25pdG9yCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBTZWFyY2hKb2IgZXh0ZW5kcyBKb2IgaW1wbGVtZW50cyBJSmF2YVNjcmlwdFNlYXJjaENvbnN0YW50cyB7Ci0KLSAgICAgICAgU3RyaW5nIGZTZWFyY2hUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBJSmF2YVNjcmlwdFNlYXJjaFNjb3BlIGZTY29wZSA9IG51bGw7Ci0KLSAgICAgICAgaW50IGZTZWFyY2hGb3IgPSBGSUVMRDsKLQotICAgICAgICBpbnQgZkxpbWl0VG8gPSBBTExfT0NDVVJSRU5DRVM7Ci0KLSAgICAgICAgaW50IGZNYXRjaE1vZGUgPSBTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSDsKLQotICAgICAgICBib29sZWFuIGZJc0Nhc2VTZW5zaXRpdmUgPSBmYWxzZTsKLQotICAgICAgICBTZWFyY2hSZXF1ZXN0b3IgZlJlcXVlc3RvciA9IG51bGw7Ci0KLSAgICAgICAgSUphdmFTY3JpcHRFbGVtZW50IGZFbGVtZW50ID0gbnVsbDsKLQotICAgICAgICAvLyBjb25zdHJ1Y3RvciB3LyBqYXZhIGVsZW1lbnQKLSAgICAgICAgcHVibGljIFNlYXJjaEpvYihJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCwgSUphdmFTY3JpcHRTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgICAgICBzdXBlcihKc0NvcmVNZXNzYWdlcy5KU1BfU2VhcmNoICsgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgIHRoaXMuZkVsZW1lbnQgPSBlbGVtZW50OwotICAgICAgICAgICAgdGhpcy5mU2NvcGUgPSBzY29wZTsKLSAgICAgICAgICAgIHRoaXMuZlJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvbnN0cnVjdG9yIHcvIHNlYXJjaCB0ZXh0Ci0gICAgICAgIHB1YmxpYyBTZWFyY2hKb2IoU3RyaW5nIHNlYXJjaFRleHQsIElKYXZhU2NyaXB0U2VhcmNoU2NvcGUgc2NvcGUsIGludCBzZWFyY2hGb3IsIGludCBsaW1pdFRvLCBpbnQgbWF0Y2hNb2RlLCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgICAgICBzdXBlcihKc0NvcmVNZXNzYWdlcy5KU1BfU2VhcmNoICsgc2VhcmNoVGV4dCk7Ci0gICAgICAgICAgICB0aGlzLmZTZWFyY2hUZXh0ID0gc2VhcmNoVGV4dDsKLSAgICAgICAgICAgIHRoaXMuZlNjb3BlID0gc2NvcGU7Ci0gICAgICAgICAgICB0aGlzLmZTZWFyY2hGb3IgPSBzZWFyY2hGb3I7Ci0gICAgICAgICAgICB0aGlzLmZMaW1pdFRvID0gbGltaXRUbzsKLSAgICAgICAgICAgIHRoaXMuZk1hdGNoTW9kZSA9IG1hdGNoTW9kZTsKLSAgICAgICAgICAgIHRoaXMuZklzQ2FzZVNlbnNpdGl2ZSA9IGlzQ2FzZVNlbnNpdGl2ZTsKLSAgICAgICAgICAgIHRoaXMuZlJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGpvYk1vbml0b3IpIHsKLQotICAgICAgICAgICAgaWYgKChqb2JNb25pdG9yICE9IG51bGwpICYmIGpvYk1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJfQotICAgICAgICAgICAgaWYgKEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCX0KLQotICAgICAgICAgICAgU2VhcmNoUGF0dGVybiBqYXZhU2VhcmNoUGF0dGVybiA9IG51bGw7Ci0gICAgICAgICAgICAvLyBpZiBhbiBlbGVtZW50IGlzIGF2YWlsYWJsZSwgdXNlIHRoYXQgdG8gY3JlYXRlIHNlYXJjaCBwYXR0ZXJuCi0gICAgICAgICAgICAvLyAoZWcuIExvY2FsVmFyaWFibGUpCi0gICAgICAgICAgICAvLyBvdGhlcndpc2UgdXNlIHRoZSB0ZXh0IGFuZCBvdGhlciBwYXJhbXRlcnMKLSAgICAgICAgICAgIGlmICh0aGlzLmZFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlqYXZhU2VhcmNoUGF0dGVybiA9IFNlYXJjaFBhdHRlcm4uY3JlYXRlUGF0dGVybih0aGlzLmZFbGVtZW50LCB0aGlzLmZMaW1pdFRvKTsKLQkJCX0gZWxzZSB7Ci0JCQkJamF2YVNlYXJjaFBhdHRlcm4gPSBTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4odGhpcy5mU2VhcmNoVGV4dCwgdGhpcy5mU2VhcmNoRm9yLCB0aGlzLmZMaW1pdFRvLCB0aGlzLmZNYXRjaE1vZGUpOwotCQkJfQotCi0gICAgICAgICAgICBpZiAoamF2YVNlYXJjaFBhdHRlcm4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEpzU2VhcmNoUGFydGljaXBhbnRbXSBwYXJ0aWNpcGFudHMgPSB7IGdldFNlYXJjaFBhcnRpY2lwYW50KCkgfTsKLSAgICAgICAgICAgICAgICBTZWFyY2hFbmdpbmUgZW5naW5lID0gbmV3IFNlYXJjaEVuZ2luZSgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChqb2JNb25pdG9yICE9IG51bGwpIHsKLQkJCQkJCWpvYk1vbml0b3IuYmVnaW5UYXNrKCIiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgZW5naW5lLnNlYXJjaChqYXZhU2VhcmNoUGF0dGVybiwgcGFydGljaXBhbnRzLCB0aGlzLmZTY29wZSwgdGhpcy5mUmVxdWVzdG9yLCBqb2JNb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIG5vbi1Db3JlRXhjZXB0aW9ucyB3aWxsIHBlcm1hbmVudGx5IHN0YWxsIHRoZSBXb3JrZXIgdGhyZWFkCi0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChqb2JNb25pdG9yICE9IG51bGwpIHsKLQkJCQkJCWpvYk1vbml0b3IuZG9uZSgpOwotCQkJCQl9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBlbmQgU2VhcmNoSm9iCi0gICAgLyoqCi0gICAgICogUnVubmFibGUgZm9yY2VzIGNhbGxlciB0byB3YWl0IHVudGlsIGZpbmlzaGVkIChhcyBvcHBvc2VkIHRvIHVzaW5nIGEgSm9iKQotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgU2VhcmNoUnVubmFibGUgaW1wbGVtZW50cyBJV29ya3NwYWNlUnVubmFibGUsIElKYXZhU2NyaXB0U2VhcmNoQ29uc3RhbnRzIHsKLQotICAgICAgICBTdHJpbmcgZlNlYXJjaFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIElKYXZhU2NyaXB0U2VhcmNoU2NvcGUgZlNjb3BlID0gbnVsbDsKLQotICAgICAgICBpbnQgZlNlYXJjaEZvciA9IEZJRUxEOwotCi0gICAgICAgIGludCBmTGltaXRUbyA9IEFMTF9PQ0NVUlJFTkNFUzsKLQotICAgICAgICBpbnQgZk1hdGNoTW9kZSA9IFNlYXJjaFBhdHRlcm4uUl9QQVRURVJOX01BVENIOwotCi0gICAgICAgIGJvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZSA9IGZhbHNlOwotCi0gICAgICAgIFNlYXJjaFJlcXVlc3RvciBmUmVxdWVzdG9yID0gbnVsbDsKLQotICAgICAgICBJSmF2YVNjcmlwdEVsZW1lbnQgZkVsZW1lbnQgPSBudWxsOwotCi0gICAgICAgIC8vIGNvbnN0cnVjdG9yIHcvIGphdmEgZWxlbWVudAotICAgICAgICBwdWJsaWMgU2VhcmNoUnVubmFibGUoSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnQsIElKYXZhU2NyaXB0U2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICAgICAgdGhpcy5mRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgICAgICAgICB0aGlzLmZTY29wZSA9IHNjb3BlOwotICAgICAgICAgICAgdGhpcy5mUmVxdWVzdG9yID0gcmVxdWVzdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29uc3RydWN0b3Igdy8gc2VhcmNoIHRleHQKLSAgICAgICAgcHVibGljIFNlYXJjaFJ1bm5hYmxlKFN0cmluZyBzZWFyY2hUZXh0LCBJSmF2YVNjcmlwdFNlYXJjaFNjb3BlIHNjb3BlLCBpbnQgc2VhcmNoRm9yLCBpbnQgbGltaXRUbywgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICAgICAgdGhpcy5mU2VhcmNoVGV4dCA9IHNlYXJjaFRleHQ7Ci0gICAgICAgICAgICB0aGlzLmZTY29wZSA9IHNjb3BlOwotICAgICAgICAgICAgdGhpcy5mU2VhcmNoRm9yID0gc2VhcmNoRm9yOwotICAgICAgICAgICAgdGhpcy5mTGltaXRUbyA9IGxpbWl0VG87Ci0gICAgICAgICAgICB0aGlzLmZNYXRjaE1vZGUgPSBtYXRjaE1vZGU7Ci0gICAgICAgICAgICB0aGlzLmZJc0Nhc2VTZW5zaXRpdmUgPSBpc0Nhc2VTZW5zaXRpdmU7Ci0gICAgICAgICAgICB0aGlzLmZSZXF1ZXN0b3IgPSByZXF1ZXN0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmICgobW9uaXRvciAhPSBudWxsKSAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLSAgICAgICAgICAgIGlmIChKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLSAgICAgICAgICAgIFNlYXJjaFBhdHRlcm4gamF2YVNlYXJjaFBhdHRlcm4gPSBudWxsOwotICAgICAgICAgICAgLy8gaWYgYW4gZWxlbWVudCBpcyBhdmFpbGFibGUsIHVzZSB0aGF0IHRvIGNyZWF0ZSBzZWFyY2ggcGF0dGVybgotICAgICAgICAgICAgLy8gKGVnLiBMb2NhbFZhcmlhYmxlKQotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHVzZSB0aGUgdGV4dCBhbmQgb3RoZXIgcGFyYW10ZXJzCi0gICAgICAgICAgICBpZiAodGhpcy5mRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJamF2YVNlYXJjaFBhdHRlcm4gPSBTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4odGhpcy5mRWxlbWVudCwgZkxpbWl0VG8pOwotCQkJfSBlbHNlIHsKLQkJCQlqYXZhU2VhcmNoUGF0dGVybiA9IFNlYXJjaFBhdHRlcm4uY3JlYXRlUGF0dGVybihmU2VhcmNoVGV4dCwgZlNlYXJjaEZvciwgZkxpbWl0VG8sIGZNYXRjaE1vZGUpOwotCQkJfQotCi0gICAgICAgICAgICBpZiAoamF2YVNlYXJjaFBhdHRlcm4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEpzU2VhcmNoUGFydGljaXBhbnRbXSBwYXJ0aWNpcGFudHMgPSB7IGdldFNlYXJjaFBhcnRpY2lwYW50KCkgfTsKLSAgICAgICAgICAgICAgICBTZWFyY2hFbmdpbmUgZW5naW5lID0gbmV3IFNlYXJjaEVuZ2luZSgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAwKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgIGVuZ2luZS5zZWFyY2goamF2YVNlYXJjaFBhdHRlcm4sIHBhcnRpY2lwYW50cywgZlNjb3BlLCBmUmVxdWVzdG9yLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBub24tQ29yZUV4Y2VwdGlvbnMgd2lsbCBwZXJtYW5lbnRseSBzdGFsbCB0aGUgV29ya2VyIHRocmVhZAotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQl9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gZW5kIFNlYXJjaFJ1bm5hYmxlCi0KLSAgICAvKioKLSAgICAgKiBDbGllbnRzIHNob3VsZCBhY2Nlc3MgdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyB2aWEgdGhlIHNpbmdsZSBpbnN0YW5jZQotICAgICAqIHZpYSBnZXRJbnN0YW5jZSgpCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEpzU2VhcmNoU3VwcG9ydCBnZXRJbnN0YW5jZSgpIHsKLQotICAgICAgICBpZiAoc2luZ2xldG9uID09IG51bGwpIHsKLQkJCXNpbmdsZXRvbiA9IG5ldyBKc1NlYXJjaFN1cHBvcnQoKTsKLQkJfQotICAgICAgICByZXR1cm4gc2luZ2xldG9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGNoZWNrIGlmIGEgZmlsZSBpcyBhIGpzcCBmaWxlIChzaW5jZSB0aGlzIGlzIGRvbmUKLSAgICAgKiBmcmVxdWVudGx5KQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0pzcChJRmlsZSBmaWxlKSB7Ci0gICAgCXJldHVybiBVdGlsLmlzSnNUeXBlKGZpbGUuZ2V0TmFtZSgpKTsKLSAgICAJLy8gKHBhKSAyMDA1MTAyNSByZW1vdmluZyBkZWVwIGNvbnRlbnQgdHlwZSBjaGVjawotICAgIAkvLyBiZWNhdXNlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcmVxdWVudGx5Ci0gICAgCS8vIGFuZCBJTyBpcyBleHBlbnNpdmUKLS8vICAgICAgICBib29sZWFuIGlzSnNwID0gZmFsc2U7Ci0vLwotLy8gICAgICAgIGlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgewotLy8gICAgICAgIAkKLS8vICAgICAgICAgICAgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlSlNQID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0vLyAgICAgICAgICAgIC8vIGNoZWNrIHRoaXMgYmVmb3JlIGRlc2NyaXB0aW9uLCBpdCdzIGxlc3MgZXhwZW5zaXZlCi0vLyAgICAgICAgICAgIGlmIChjb250ZW50VHlwZUpTUC5pc0Fzc29jaWF0ZWRXaXRoKGZpbGUuZ2V0TmFtZSgpKSkgewotLy8gICAgICAgICAgICAJaXNKc3AgPSB0cnVlOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8KLS8vICAgICAgICByZXR1cm4gaXNKc3A7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2NoZWR1bGVzIGEgc2VhcmNoIGRvY3VtZW50IHJlcHJlc2VudGluZyB0aGlzIEpTUCBmaWxlIGZvciBpbmRleGluZyAoYnkKLSAgICAgKiB0aGUgamF2YSBpbmRleGVyKQotICAgICAqIAotICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICogICAgICAgICAgICB0aGUgSlNQIGZpbGUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgaW5kZXhpbmcgd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTZWFyY2hEb2N1bWVudCBhZGRKc3BGaWxlKElGaWxlIGZpbGUpIHsKLSAgICAgICAgaWYgKEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSB8fCAhZmlsZS5pc0FjY2Vzc2libGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWRkaW5nIEpTUCBmaWxlOiIgKyBmaWxlLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotICAgICAgICAvLyBjcmVhdGUKLSAgICAgICAgU2VhcmNoRG9jdW1lbnQgZGVsZWdhdGUgPSBjcmVhdGVTZWFyY2hEb2N1bWVudChmaWxlKTsKLSAgICAgICAgLy8gbnVsbCBpZiBub3QgYSBqc3AgZmlsZQotICAgICAgICBpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBnZXRTZWFyY2hQYXJ0aWNpcGFudCgpLnNjaGVkdWxlRG9jdW1lbnRJbmRleGluZyhkZWxlZ2F0ZSwgY29tcHV0ZUluZGV4TG9jYXRpb24oZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IGZhaWx1cmUgaGVyZSBkb2Vzbid0IGtlZXAgb3RoZXIgZG9jdW1lbnRzIGZyb20KLSAgICAgICAgICAgICAgICAvLyBiZWluZyBpbmRleGVkCi0gICAgICAgICAgICAgICAgLy8gaWYgcGVmb3JtZWQgaW4gYSBiYXRjaCBjYWxsIChsaWtlIEpTUEluZGV4TWFuYWdlcikKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2NoZWR1bGVkIiArIGRlbGVnYXRlICsgImZvciBpbmRleGluZyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUGVyZm9ybSBhIGphdmEgc2VhcmNoIHcvIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiBSdW5zIGluIGEgYmFja2dyb3VuZCBKb2IKLSAgICAgKiAocmVzdWx0cyBtYXkgc3RpbGwgY29tZSBpbiBhZnRlciB0aGlzIG1ldGhvZCBjYWxsKQotICAgICAqIAotICAgICAqIEBwYXJhbSBzZWFyY2hUZXh0Ci0gICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIG9mIHRleHQgdG8gc2VhcmNoIG9uCi0gICAgICogQHBhcmFtIHNlYXJjaEZvcgotICAgICAqICAgICAgICAgICAgSUphdmFTY3JpcHRTZWFyY2hDb25zdGFudHMuVFlQRSwgTUVUSE9ELCBGSUVMRCwgUEFDS0FHRSwgZXRjLi4uCi0gICAgICogQHBhcmFtIGxpbWl0VG8KLSAgICAgKiAgICAgICAgICAgIElKYXZhU2NyaXB0U2VhcmNoQ29uc3RhbnRzLkRFQ0xBUkFUSU9OUywKLSAgICAgKiAgICAgICAgICAgIElKYXZhU2NyaXB0U2VhcmNoQ29uc3RhbnRzLlJFRkVSRU5DRVMsCi0gICAgICogICAgICAgICAgICBJSmF2YVNjcmlwdFNlYXJjaENvbnN0YW50cy5JTVBMRU1FTlRPUlMsIG9yCi0gICAgICogICAgICAgICAgICBJSmF2YVNjcmlwdFNlYXJjaENvbnN0YW50cy5BTExfT0NDVVJSRU5DRVMKLSAgICAgKiBAcGFyYW0gbWF0Y2hNb2RlCi0gICAgICogICAgICAgICAgICBhbGxvdyAqIHdpbGRjYXJkcyBvciBub3QKLSAgICAgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlCi0gICAgICogQHBhcmFtIHJlcXVlc3RvcgotICAgICAqICAgICAgICAgICAgcGFzc2VkIGluIHRvIGFjY2VwdCBzZWFyY2ggbWF0Y2hlcyAoYW5kIGRvICJzb21ldGhpbmciIHdpdGgKLSAgICAgKiAgICAgICAgICAgIHRoZW0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VhcmNoKFN0cmluZyBzZWFyY2hUZXh0LCBJSmF2YVNjcmlwdFNlYXJjaFNjb3BlIHNjb3BlLCBpbnQgc2VhcmNoRm9yLCBpbnQgbGltaXRUbywgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICBKc0luZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlYnVpbGRJbmRleElmTmVlZGVkKCk7Ci0KLSAgICAgICAgU2VhcmNoSm9iIGpvYiA9IG5ldyBTZWFyY2hKb2Ioc2VhcmNoVGV4dCwgc2NvcGUsIHNlYXJjaEZvciwgbGltaXRUbywgbWF0Y2hNb2RlLCBpc0Nhc2VTZW5zaXRpdmUsIHJlcXVlc3Rvcik7Ci0gICAgICAgIHNldENhbmNlbGVkKGZhbHNlKTsKLSAgICAgICAgam9iLnNldFVzZXIodHJ1ZSk7Ci0gICAgICAgIC8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD01MDMyCi0gICAgICAgIC8vIHBvcHMgdXAgdXNlciBvcGVyYXRpb24gYmxvY2tlZCBkaWFsb2cgaWYgeW91IHBlcmZvcm0gYSBsb25nIHNlYXJjaCwKLSAgICAgICAgLy8gdGhlbiBvcGVuIGEgZmlsZSBiZWNhdXNlIGl0IGxvY2tzIHRoZSB3b3Jrc3BhY2UKLSAgICAgICAgLy9qb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLSAgICAgICAgam9iLnNjaGVkdWxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoIGZvciBhbiBJSmF2YVNjcmlwdEVsZW1lbnQsIGNvbnN0cmFpbmVkIGJ5IHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiBSdW5zIGluCi0gICAgICogYSBiYWNrZ3JvdW5kIEpvYiAocmVzdWx0cyBtYXkgc3RpbGwgY29tZSBpbiBhZnRlciB0aGlzIG1ldGhvZCBjYWxsKQotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50Ci0gICAgICogQHBhcmFtIHNjb3BlCi0gICAgICogQHBhcmFtIHJlcXVlc3RvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlYXJjaChJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCwgSUphdmFTY3JpcHRTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgIEpzSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVidWlsZEluZGV4SWZOZWVkZWQoKTsKLQotICAgICAgICBTZWFyY2hKb2Igam9iID0gbmV3IFNlYXJjaEpvYihlbGVtZW50LCBzY29wZSwgcmVxdWVzdG9yKTsKLSAgICAgICAgc2V0Q2FuY2VsZWQoZmFsc2UpOwotICAgICAgICBqb2Iuc2V0VXNlcih0cnVlKTsKLSAgICAgICAgLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUwMzIKLSAgICAgICAgLy9qb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLSAgICAgICAgam9iLnNjaGVkdWxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoIGZvciBhbiBJSmF2YVNjcmlwdEVsZW1lbnQsIGNvbnN0cmFpbmVkIGJ5IHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiBSdW5zIGluCi0gICAgICogYW4gSVdvcmtzcGFjZSBydW5uYWJsZSAocmVzdWx0cyB3aWxsIGJlIHJlcG9ydGVkIGJ5IHRoZSBlbmQgb2YgdGhpcwotICAgICAqIG1ldGhvZCkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqIEBwYXJhbSBzY29wZQotICAgICAqIEBwYXJhbSByZXF1ZXN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWFyY2hSdW5uYWJsZShJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCwgSUphdmFTY3JpcHRTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgIEpzSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVidWlsZEluZGV4SWZOZWVkZWQoKTsKLQotICAgICAgICBTZWFyY2hSdW5uYWJsZSBzZWFyY2hSdW5uYWJsZSA9IG5ldyBTZWFyY2hSdW5uYWJsZShlbGVtZW50LCBzY29wZSwgcmVxdWVzdG9yKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldENhbmNlbGVkKGZhbHNlKTsKLSAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4oc2VhcmNoUnVubmFibGUsIEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGpzcEZpbGUKLSAgICAgKiBAcmV0dXJuIFNlYXJjaERvY3VtZW50IGlmIHRoZSBmaWxlIGlzIG5vdCBudWxsLCBleGlzdHMsIGFuZCBpcyBhIEpTUAotICAgICAqICAgICAgICAgZmlsZSwgb3RoZXJ3aXNlIG51bGwuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTZWFyY2hEb2N1bWVudCBjcmVhdGVTZWFyY2hEb2N1bWVudChJRmlsZSBqc3BGaWxlKSB7Ci0KLSAgICAgICAgSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUgZGVsZWdhdGUgPSBudWxsOwotICAgICAgICBpZiAoKGpzcEZpbGUgIT0gbnVsbCkgJiYganNwRmlsZS5leGlzdHMoKSAmJiBpc0pzcChqc3BGaWxlKSkgewotCi0gICAgICAgICAgICBkZWxlZ2F0ZSA9IG5ldyBKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZShuZXcgSnNTZWFyY2hEb2N1bWVudChqc3BGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgZ2V0U2VhcmNoUGFydGljaXBhbnQoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENlbnRyYWxpemVkIHBsYWNlIHRvIGFjY2VzcyBKU1BTZWFyY2hEb2N1bWVudHMgKHVzZWQgYnkKLSAgICAgKiBKU1BTZWFyY2hQYXJ0aWNpcGFudCBhbmQgSlNQU2VhcmNoUmVxdWVzdG9yKQotICAgICAqIAotICAgICAqIEBwYXJhbSBzZWFyY2hEb2NQYXRoCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEByZXR1cm4gdGhlIEpTUFNlYXJjaERvY3VtZW50IG9yIG51bGwgaWYgb25lIGlzIG5vdCBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBTZWFyY2hEb2N1bWVudCBnZXRTZWFyY2hEb2N1bWVudChTdHJpbmcgc2VhcmNoRG9jUGF0aCkgewotICAgICAgICAgCi0gICAgICAgIFNlYXJjaERvY3VtZW50IGRlbGVnYXRlID0gbnVsbDsKLSAgICAgICAgSUZpbGUgZiA9IGZpbGVGb3JDVVBhdGgoc2VhcmNoRG9jUGF0aCk7Ci0gICAgICAgIGlmIChmICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRlbGVnYXRlID0gY3JlYXRlU2VhcmNoRG9jdW1lbnQoZik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBoYW5kbGUgZmFpbHVyZSBjYXNlLi4uIChmaWxlIGRlbGV0ZWQgbWF5YmU/KQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbm1hbmdsZXMgdGhlIHNlYXJjaERvY1BhdGggYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgSlNQIGZpbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlYXJjaERvY1BhdGgKLSAgICAgKi8KLSAgICBwcml2YXRlIElGaWxlIGZpbGVGb3JDVVBhdGgoU3RyaW5nIHNlYXJjaERvY1BhdGgpIHsKLSAgICAKLSAgICAgICAgU3RyaW5nW10gc3BsaXQgPSBzZWFyY2hEb2NQYXRoLnNwbGl0KCIvIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IHNwbGl0W3NwbGl0Lmxlbmd0aCAtIDFdOwotCi0gICAgICAgIC8vIGlnbm9yZSBhbnl0aGluZyBidXQgLmphdmEgbWF0Y2hlcyAobGlrZSAuY2xhc3MgYmluYXJ5IG1hdGNoZXMpCi0gICAgICAgIGlmKCFzZWFyY2hEb2NQYXRoLmVuZHNXaXRoKCIuanMiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IEpzTmFtZU1hbmdsZXJVdGlsLnVubWFuZ2xlKGNsYXNzbmFtZSk7Ci0gICAgICAgCi0gICAgICAgIC8vIHRyeSBhYnNvbHV0ZSBwYXRoCi0gICAgICAgIElGaWxlIGYgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlUGF0aCkpOwotICAgICAgICAvLyB3b3Jrc3BhY2UgcmVsYXRpdmUgdGhlbgotICAgICAgICBpZihmID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NjAwOQotICAgICAgICAgICAgLy8gbXVzdCBoYXZlIGEgcHJvamVjdCBuYW1lIGFzIHdlbGwKLSAgICAgICAgICAgIC8vIHdoaWNoIHdvdWxkIG1lYW4gPj0gMiBwYXRoIHNlZ21lbnRzCi0gICAgICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoZmlsZVBhdGgpOwotICAgICAgICAgICAgaWYocGF0aC5zZWdtZW50Q291bnQoKSA+PSAyKSB7Ci0gICAgICAgICAgICAgICAgZiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZjsKLSAgICB9Ci0KLSAgICBKc1NlYXJjaFBhcnRpY2lwYW50IGdldFNlYXJjaFBhcnRpY2lwYW50KCkgewotCi0gICAgICAgIGlmICh0aGlzLmZQYXJ0aWNpcGFudCA9PSBudWxsKSB7Ci0JCQl0aGlzLmZQYXJ0aWNpcGFudCA9IG5ldyBKc1NlYXJjaFBhcnRpY2lwYW50KCk7Ci0JCX0KLSAgICAgICAgcmV0dXJuIHRoaXMuZlBhcnRpY2lwYW50OwotICAgIH0KLQotICAgIC8vIFRoaXMgaXMgY2FsbGVkIGZyb20gSlNQUGF0aEluZGV4ZXIKLSAgICAvLyBwYV9UT0RPCi0gICAgLy9ob3cgY2FuIHdlIG1ha2Ugc3VyZSBwYXJ0aWNpcGFudCBpbmRleExvY2F0aW9ucyBhcmUgdXBkYXRlZCBhdCBzdGFydHVwPwotICAgIHB1YmxpYyBmaW5hbCBJUGF0aCBjb21wdXRlSW5kZXhMb2NhdGlvbihJUGF0aCBjb250YWluZXJQYXRoKSB7Ci0KLSAgICAgICAgSVBhdGggaW5kZXhMb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gaW5hZHZlcnRlbnRseSB1c2UgYSBKRFQgSW5kZXgKLSAgICAgICAgLy8gd2Ugd2FudCB0byBiZSBzdXJlIHRvIHVzZSB0aGUgSW5kZXggZnJvbSB0aGUgSlNQIGxvY2F0aW9uCi0gICAgICAgIC8vT2JqZWN0IG9iaiA9IGluZGV4TG9jYXRpb25zLmdldChjb250YWluZXJQYXRoKTsKLSAgICAgICAgLy9pZiAob2JqICE9IG51bGwpIHsKLSAgICAgICAgLy8gICAgaW5kZXhMb2NhdGlvbiA9IChTdHJpbmcpIG9iajsKLSAgICAgICAgLy99IGVsc2UgewotICAgICAgICAgICAgLy8gY3JlYXRlIGluZGV4IGVudHJ5Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aFN0cmluZyA9IGNvbnRhaW5lclBhdGgudG9PU1N0cmluZygpOwotICAgICAgICAgICAgdGhpcy5mQ2hlY2tzdW1DYWxjdWxhdG9yLnJlc2V0KCk7Ci0gICAgICAgICAgICB0aGlzLmZDaGVja3N1bUNhbGN1bGF0b3IudXBkYXRlKHBhdGhTdHJpbmcuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBMb25nLnRvU3RyaW5nKHRoaXMuZkNoZWNrc3VtQ2FsY3VsYXRvci5nZXRWYWx1ZSgpKSArICIuaW5kZXgiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBvbmx5IGRpZmZlcmVuY2UgZnJvbQotICAgICAgICAgICAgLy8gSW5kZXhNYW5hZ2VyI2NvbXB1dGVJbmRleExvY2F0aW9uKC4uLikKLSAgICAgICAgICAgIGluZGV4TG9jYXRpb24gPSBnZXRNb2RlbEpzcFBsdWdpbldvcmtpbmdMb2NhdGlvbigpLmFwcGVuZChmaWxlTmFtZSk7Ci0KLSAgICAgICAgICAgIC8vIHBhX1RPRE8gbmVlZCB0byBhZGQgdG8gamF2YSBwYXRoIHRvbywgc28gSkRUIHNlYXJjaCBzdXBwb3J0IGtub3dzCi0gICAgICAgICAgICAvLyB0aGVyZSBzaG91bGQgYmUgYSBub24gaW50ZXJuYWwgd2F5IHRvIGRvIHRoaXMuCi0gICAgICAgICAgICAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Nzc1NjQKLSAgICAgICAgICAgIEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldEluZGV4TWFuYWdlcigpLmluZGV4TG9jYXRpb25zLnB1dChjb250YWluZXJQYXRoLCBpbmRleExvY2F0aW9uKTsKLSAgICAgICAgLy99Ci0gICAgICAgIHJldHVybiBpbmRleExvY2F0aW9uOwotICAgIH0KLQlwdWJsaWMgSVBhdGggZ2V0TW9kZWxKc3BQbHVnaW5Xb3JraW5nTG9jYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk51bGwgcHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSVBhdGggd29ya2luZ0xvY2F0aW9uRmlsZSA9IHByb2plY3QuZ2V0V29ya2luZ0xvY2F0aW9uKEpzQ29yZVBsdWdpbi5QTFVHSU5fSUQpLmFwcGVuZCgianNzZWFyY2giKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBlbnN1cmUgdGhhdCBpdCBleGlzdHMgb24gZGlzawotCQlGaWxlIGZvbGRlciA9IG5ldyBGaWxlKHdvcmtpbmdMb2NhdGlvbkZpbGUudG9PU1N0cmluZygpKTsKLQkJaWYgKCFmb2xkZXIuaXNEaXJlY3RvcnkoKSkgewotCQkJdHJ5IHsKLQkJCQlmb2xkZXIubWtkaXIoKTsKLQkJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gd29ya2luZ0xvY2F0aW9uRmlsZTsKLQl9Ci0gICAgLy8gY29waWVkIGZyb20gSkRUIEluZGV4TWFuYWdlcgotICAgIHB1YmxpYyBJUGF0aCBnZXRNb2RlbEpzcFBsdWdpbldvcmtpbmdMb2NhdGlvbigpIHsKLQotICAgICAgICBpZiAodGhpcy5mSnNwUGx1Z2luTG9jYXRpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMuZkpzcFBsdWdpbkxvY2F0aW9uOwotCQl9Ci0KLSAgICAgICAgLy8gQXBwZW5kIHRoZSBmb2xkZXIgbmFtZSAianNwc2VhcmNoIiB0byBrZWVwIHRoZSBzdGF0ZSBsb2NhdGlvbiBhcmVhIGNsZWFuZXIKLSAgICAgICAgSVBhdGggc3RhdGVMb2NhdGlvbiA9IEpzQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZCgianNwc2VhcmNoIik7Ci0KLSAgICAgICAgLy8gcGFfVE9ETyB3b3JrYXJvdW5kIGZvcgotICAgICAgICAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjIyNjcKLSAgICAgICAgLy8gY29waWVkIGZyb20gSW5kZXhNYW5hZ2VyCi0gICAgICAgIFN0cmluZyBkZXZpY2UgPSBzdGF0ZUxvY2F0aW9uLmdldERldmljZSgpOwotICAgICAgICBpZiAoKGRldmljZSAhPSBudWxsKSAmJiAoZGV2aWNlLmNoYXJBdCgwKSA9PSAnLycpKSB7Ci0JCQlzdGF0ZUxvY2F0aW9uID0gc3RhdGVMb2NhdGlvbi5zZXREZXZpY2UoZGV2aWNlLnN1YnN0cmluZygxKSk7Ci0JCX0KLQotICAgICAgICAvLyBlbnN1cmUgdGhhdCBpdCBleGlzdHMgb24gZGlzawotICAgICAgICBGaWxlIGZvbGRlciA9IG5ldyBGaWxlKHN0YXRlTG9jYXRpb24udG9PU1N0cmluZygpKTsKLQkJaWYgKCFmb2xkZXIuaXNEaXJlY3RvcnkoKSkgewotCQkJdHJ5IHsKLQkJCQlmb2xkZXIubWtkaXIoKTsKLQkJCX0KLQkJCWNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQotICAgICAgICByZXR1cm4gdGhpcy5mSnNwUGx1Z2luTG9jYXRpb24gPSBzdGF0ZUxvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEpTUCBJbmRleGluZyBhbmQgU2VhcmNoIGpvYnMgY2hlY2sgdGhpcwotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGZpbmFsIHZvaWQgc2V0Q2FuY2VsZWQoYm9vbGVhbiBjYW5jZWwpIHsKLSAgICAJLy9TeXN0ZW0ub3V0LnByaW50bG4oInNlYXJjaCBzdXBwb3J0IG1vbml0b3IiICsgZk1vbml0b3IpOwotICAgICAgICBmTW9uaXRvci5zZXRDYW5jZWxlZChjYW5jZWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEpTUCBJbmRleGluZyBhbmQgU2VhcmNoIGpvYnMgY2hlY2sgdGhpcwotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGZpbmFsIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLQotICAgICAgICByZXR1cm4gZk1vbml0b3IuaXNDYW5jZWxlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEpTUCBJbmRleGluZyBhbmQgU2VhcmNoIGpvYnMgY2hlY2sgdGhpcwotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMuZk1vbml0b3I7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL2NvcmUvamF2YXNjcmlwdC9zZWFyY2gvTnVsbFNlYXJjaERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9OdWxsU2VhcmNoRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YxY2U3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS9qYXZhc2NyaXB0L3NlYXJjaC9OdWxsU2VhcmNoRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudDsKLQotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBBbiBlbXB0eSBzZXJ2bGV0LCBzYWZlIGZvciBKYXZhIHNlYXJjaCBwYXJ0aWNpcGF0aW9uCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsU2VhcmNoRG9jdW1lbnQgZXh0ZW5kcyBTZWFyY2hEb2N1bWVudCB7Ci0JCi0JU3RyaW5nQnVmZmVyIGZFbXB0eVNlcnZsZXRCdWZmZXIgPSBudWxsOwotCQotCXB1YmxpYyBOdWxsU2VhcmNoRG9jdW1lbnQoU3RyaW5nIGRvY3VtZW50UGF0aCkgewotCQlzdXBlcihkb2N1bWVudFBhdGgsIG5ldyBKc1NlYXJjaFBhcnRpY2lwYW50KCkpOyAKLQkJdGhpcy5mRW1wdHlTZXJ2bGV0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCX0KLQkKLQlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVDb250ZW50cygpIHsKLQkJcmV0dXJuIHRoaXMuZkVtcHR5U2VydmxldEJ1ZmZlci50b1N0cmluZygpLmdldEJ5dGVzKCk7Ci0JfQotCQotCXB1YmxpYyBjaGFyW10gZ2V0Q2hhckNvbnRlbnRzKCkgewotCQlyZXR1cm4gdGhpcy5mRW1wdHlTZXJ2bGV0QnVmZmVyLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvY29yZS90ZXh0L0lKc1BhcnRpdGlvbnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL3RleHQvSUpzUGFydGl0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGFiMTRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9jb3JlL3RleHQvSUpzUGFydGl0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9uczsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUpzUGFydGl0aW9ucyB7Ci0JU3RyaW5nIEh0bWxKc1BhcnRpdGlvbiA9IElIVE1MUGFydGl0aW9ucy5TQ1JJUFQ7Ci0JLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzM5MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdlOGJhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1AZG90Ci1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKLW9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcF8xLjAuMC4yMDA4MDYwMzEzMDQuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWUwNzk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTUzNzM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTYXQgTWFyIDI0IDExOjIzOjU0IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWM3YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzUyMmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jTW9uIEFwciAxNyAwMjowMTozMyBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZGZmYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLkFjdGl2YXRvcgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4zMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMi4xMDAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjM2IwZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0NjVkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1Byb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwDQotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcNCi1CdW5kbGUtTmFtZS4wID0gSlNEVCBzdXBwb3J0IGZvciBKU1AgUGx1Zy1pbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjFkZDIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTxzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLkpTRFRTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1AiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2Uuc291cmNlIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uIj4KLQkJPGFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AuSlNEVEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JKU1AiPgotCQkJPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCQk8L2FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uIj4KLQkJPHZhbGlkYXRvcgotCQkJc2NvcGU9InRvdGFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnNWYWxpZGF0b3IiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwLmpzc291cmNldmFsaWRhdG9yIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQiPjwvcGFydGl0aW9uVHlwZT4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBULkVWRU5UIj48L3BhcnRpdGlvblR5cGU+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvc3VwcG9ydC9qc3AvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3N1cHBvcnQvanNwL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDE3OWMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvc3VwcG9ydC9qc3AvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICoqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi0KLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3AiOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFjdGl2YXRvcigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW5zI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3N1cHBvcnQvanNwL0pTRFRBZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3N1cHBvcnQvanNwL0pTRFRBZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYjkwYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3Avc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi9zdXBwb3J0L2pzcC9KU0RUQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc3VwcG9ydC5qc3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckpTRFQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSURvY3VtZW50VHlwZUhhbmRsZXI7Ci0vKioKLSoKLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKU0RUQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckpTUCBleHRlbmRzCi0JCUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JKU0RUIHsKLQotCXB1YmxpYyBib29sZWFuIGlzRm9yKElEb2N1bWVudFR5cGVIYW5kbGVyIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24pIHsKLQkJcmV0dXJuIChjb250ZW50VHlwZURlc2NyaXB0aW9uIGluc3RhbmNlb2YgTW9kZWxIYW5kbGVyRm9ySlNQKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zdXBwb3J0LmpzcC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3N1cHBvcnQvanNwL0pTRFRTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvc3VwcG9ydC9qc3AvSlNEVFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjUxNjcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvc3VwcG9ydC9qc3AvSlNEVFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUNvbnRlbnRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByZXNlbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRleHQuSUpTUFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNEVDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuZm9ybWF0LkZvcm1hdHRpbmdTdHJhdGVneUpTRFQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLS8qKgotKgotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpTRFRTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1AgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1B7Ci0KLQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBmSFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci0KLQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBnZXRKU0RUSFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmIChmSFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgewotCQkJZkhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTRFQoKTsKLQkJfQotCQlyZXR1cm4gZkhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBwcm9jZXNzb3JzID0gbnVsbDsKLQotCQlpZiAoSUhUTUxQYXJ0aXRpb25zLlNDUklQVC5lcXVhbHMocGFydGl0aW9uVHlwZSkgfHwgSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVC5lcXVhbHMocGFydGl0aW9uVHlwZSkgfHwgSUhUTUxQYXJ0aXRpb25zLlNDUklQVF9FVkVOVEhBTkRMRVIuZXF1YWxzKHBhcnRpdGlvblR5cGUpKSB7Ci0JCQkvLyBIVE1MIEphdmFTY3JpcHQKLQkJCUlDb250ZW50QXNzaXN0YW50IGh0bWxDb250ZW50QXNzaXN0YW50ID0gZ2V0SlNEVEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0Q29udGVudEFzc2lzdGFudChzb3VyY2VWaWV3ZXIpOwotCQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gaHRtbENvbnRlbnRBc3Npc3RhbnQuZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKTsKLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXXtwcm9jZXNzb3J9OwotCQl9Ci0JCWVsc2V7Ci0JCQlwcm9jZXNzb3JzID0gc3VwZXIuZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzb3JzOwotCX0KLQkKLQlwdWJsaWMgSUNvbnRlbnRGb3JtYXR0ZXIgZ2V0Q29udGVudEZvcm1hdHRlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlmaW5hbCBJQ29udGVudEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBzdXBlci5nZXRDb250ZW50Rm9ybWF0dGVyKHNvdXJjZVZpZXdlcik7Ci0JCWlmKGZvcm1hdHRlciBpbnN0YW5jZW9mIE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIpIHsKLQkJLyoKLQkJICogQ2hlY2sgZm9yIGFueSBleHRlcm5hbGx5IHN1cHBvcnRlZCBhdXRvIGVkaXQgc3RyYXRlZ2llcyBmcm9tIEVQLgotCQkgKiBbQnJhZGxleSBDaGlsZHMgLSBjaGlsZHNiQHVzLmlibS5jb21dCi0JCSAqLwotCQlTdHJpbmdbXSBjb250ZW50VHlwZXMgPSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKElIVE1MUGFydGl0aW9ucy5TQ1JJUFQuZXF1YWxzKGNvbnRlbnRUeXBlc1tpXSkgfHwgSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVC5lcXVhbHMoY29udGVudFR5cGVzW2ldKSB8fCBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUX0VWRU5USEFORExFUi5lcXVhbHMoY29udGVudFR5cGVzW2ldKSkgewotCQkJCQkoKE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIpIGZvcm1hdHRlcikuc2V0U2xhdmVTdHJhdGVneShuZXcgRm9ybWF0dGluZ1N0cmF0ZWd5SlNEVCgpLCBjb250ZW50VHlwZXNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZm9ybWF0dGVyOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0SW5kZW50UHJlZml4ZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlTdHJpbmdbXSBpbmRlbnRhdGlvbnMgPSBudWxsOwotCQlpZiAoSUhUTUxQYXJ0aXRpb25zLlNDUklQVC5lcXVhbHMoY29udGVudFR5cGUpIHx8IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkFTQ1JJUFQuZXF1YWxzKGNvbnRlbnRUeXBlKSB8fCBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUX0VWRU5USEFORExFUi5lcXVhbHMoY29udGVudFR5cGUpKQotCQkJaW5kZW50YXRpb25zID0gZ2V0SlNEVEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0SW5kZW50UHJlZml4ZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCWVsc2UKLQkJCWluZGVudGF0aW9ucyA9IHN1cGVyLmdldEluZGVudFByZWZpeGVzKHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUpOwotCQlyZXR1cm4gaW5kZW50YXRpb25zOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUluZm9ybWF0aW9uUHJvdmlkZXIgZ2V0SW5mb3JtYXRpb25Qcm92aWRlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJSUluZm9ybWF0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBudWxsOwotCQlpZiAoSUhUTUxQYXJ0aXRpb25zLlNDUklQVC5lcXVhbHMocGFydGl0aW9uVHlwZSkgfHwgSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVC5lcXVhbHMocGFydGl0aW9uVHlwZSkgfHwgSUhUTUxQYXJ0aXRpb25zLlNDUklQVF9FVkVOVEhBTkRMRVIuZXF1YWxzKHBhcnRpdGlvblR5cGUpKSB7Ci0JCQkvLyBKYXZhU2NyaXB0Ci0JCQlJSW5mb3JtYXRpb25QcmVzZW50ZXIgaHRtbFByZXNlbnRlciA9IGdldEpTRFRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldEluZm9ybWF0aW9uUHJlc2VudGVyKHNvdXJjZVZpZXdlcik7Ci0JCQlwcm92aWRlciA9IGh0bWxQcmVzZW50ZXIuZ2V0SW5mb3JtYXRpb25Qcm92aWRlcihJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKTsKLQkJfQotCQlpZihwcm92aWRlciA9PSBudWxsKXsKLQkJCXByb3ZpZGVyID0gc3VwZXIuZ2V0SW5mb3JtYXRpb25Qcm92aWRlcihzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQl9Ci0JCXJldHVybiBwcm92aWRlcjsKLQl9Ci0JCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlMaW5lU3R5bGVQcm92aWRlcltdIHByb3ZpZGVycyA9IG51bGw7Ci0JCWlmIChJSFRNTFBhcnRpdGlvbnMuU0NSSVBULmVxdWFscyhwYXJ0aXRpb25UeXBlKSB8fCBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBULmVxdWFscyhwYXJ0aXRpb25UeXBlKSB8fCBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUX0VWRU5USEFORExFUi5lcXVhbHMocGFydGl0aW9uVHlwZSkpIHsKLQkJCXByb3ZpZGVycyA9IGdldEpTRFRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIElIVE1MUGFydGl0aW9ucy5TQ1JJUFQpOwotCQl9Ci0JCWVsc2V7Ci0JCQlwcm92aWRlcnMgPSBzdXBlci5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJfQotCi0JCXJldHVybiBwcm92aWRlcnM7Ci0JfQotCQotCXB1YmxpYyBJVGV4dEhvdmVyIGdldFRleHRIb3ZlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlLCBpbnQgc3RhdGVNYXNrKSB7Ci0JCUlUZXh0SG92ZXIgaG92ZXIgPSBudWxsOwotCi0JCWlmIChJSFRNTFBhcnRpdGlvbnMuU0NSSVBULmVxdWFscyhjb250ZW50VHlwZSkgfHwgSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVC5lcXVhbHMoY29udGVudFR5cGUpIHx8IElIVE1MUGFydGl0aW9ucy5TQ1JJUFRfRVZFTlRIQU5ETEVSLmVxdWFscyhjb250ZW50VHlwZSkpIHsKLQkJCS8vIGh0bWwgYW5kIGphdmFzY3JpcHQgcmVnaW9ucwotCQkJaG92ZXIgPSBnZXRKU0RUSFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRUZXh0SG92ZXIoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSwgc3RhdGVNYXNrKTsKLQkJfQotCQllbHNlIHsKLQkJCWhvdmVyID0gc3VwZXIuZ2V0VGV4dEhvdmVyKHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUpOwotCQl9Ci0JCi0JCXJldHVybiBob3ZlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxNjVlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTE3ODU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTA3MjE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLSNXZWQgT2N0IDI0IDE5OjQ5OjQ1IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MWQwOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSNXZWQgT2N0IDI0IDE5OjQxOjMxIEVEVCAyMDA3Ci1jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKLWNsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz1mYWxzZQotY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLWNsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLWNsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCi1jbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1jbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKLWNsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPWZhbHNlCi1jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9dHJ1ZQotY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKLWNsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCi1jbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPWZhbHNlCi1jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLWNsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKLWNsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1jbGVhbnVwLnVzZV9ibG9ja3M9dHJ1ZQotY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLWNsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLWNsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLWNsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1jbGVhbnVwX3Byb2ZpbGU9X1NTRSBUZWFtIFN0eWxlcwotY2xlYW51cF9zZXR0aW5nc192ZXJzaW9uPTIKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLmV4Y2VwdGlvbi5uYW1lPWUKLW9yZy5lY2xpcHNlLmpkdC51aS5nZXR0ZXJzZXR0ZXIudXNlLmlzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5rZXl3b3JkdGhpcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LnVpLm92ZXJyaWRlYW5ub3RhdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTIyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNNb24gQXByIDE3IDAyOjAxOjMzIEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk1ZTJmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aSwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuYXV0b2VkaXQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5kZXJpdmVkO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmVkaXRvcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5mb3JtYXQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuaHlwZXJsaW5rO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5zZWFyY2gudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwucmVnaXN0cnk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuc3R5bGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuc3R5bGUuamF2YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC50YWdpbmZvO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC40MDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5zZWFyY2g7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIGNvbS5pYm0uaWN1O2J1bmRsZS12ZXJzaW9uPSJbMy44LjEsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMzAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuanNkdC5tYW5pcHVsYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40Ci1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTY3NWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL2ljb25zL2V5ZV9pY29uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL2ljb25zL2V5ZV9pY29uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc4Mzk4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9pY29ucy9leWVfaWNvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTBkYmI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwotQnVuZGxlLU5hbWUuMCA9IEpTRFQgV2ViIFN1cHBvcnQgVUkKLXRhcmdldC5uYW1lLjAgPSBKYXZhU2NpcnB0IFNvdXJjZQotdGFyZ2V0Lm5hbWUuMSA9IEphdmFTY2lycHQgRXZlbnQgU291cmNlCi1oeXBlcmxpbmtEZXRlY3Rvci5uYW1lLjAgPSBKYXZhIEVsZW1lbnQgSHlwZXJMaW5rIERldGVjdG9yCi1oeXBlcmxpbmtEZXRlY3Rvci5uYW1lLjEgPSBKYXZhIEVsZW1lbnQgSHlwZXJMaW5rIERldGVjdG9yCi1tZW51LmxhYmVsLjAgPSBEZWNsZXJhdGlvbnMKLWFjdGlvbi50b29sdGlwLjAgPSBXb3JraW5nIFNldAotYWN0aW9uLmxhYmVsLjAgPSBXb3JraW5nIFNldAotYWN0aW9uLmxhYmVsLjEgPSBIaWVyYXJjaHkKLWFjdGlvbi50b29sdGlwLjEgPSBIaWVyYXJjaHkKLWFjdGlvbi5sYWJlbC4yID0gUHJvamVjdAotYWN0aW9uLnRvb2x0aXAuMiA9IFByb2plY3QKLWFjdGlvbi5sYWJlbC4zID0gV29ya3NwYWNlCi1hY3Rpb24udG9vbHRpcC4zID0gCi1tZW51LmxhYmVsLjEgPSBSZWZlcmVuY2VzCi1hY3Rpb24ubGFiZWwuNCA9IFdvcmtpbmcgU2V0Ci1hY3Rpb24udG9vbHRpcC40ID0gV29ya2luZyBTZXQKLWFjdGlvbi5sYWJlbC41ID0gSGllcmFyY2h5Ci1hY3Rpb24udG9vbHRpcC41ID0gSGllcmFyY2h5Ci1hY3Rpb24ubGFiZWwuNiA9IFByb2plY3QKLWFjdGlvbi50b29sdGlwLjYgPSBQcm9qZWN0Ci1hY3Rpb24ubGFiZWwuNyA9IFdvcmtzcGFjZQotYWN0aW9uLnRvb2x0aXAuNyA9IAotbWVudS5sYWJlbC4yID0gUmVmYWN0b3IKLW1lbnUubGFiZWwuMyA9IFNvdXJjZQotYWN0aW9uLmxhYmVsLjggPSBHZW5lcmF0ZSBFbGVtZW50IENvbW1lbnQKLWFjdGlvbi50b29sdGlwLjggPSBHZW5lcmF0ZSBFbGVtZW50IENvbW1lbnQKLWFjdGlvbi5sYWJlbC45ID0gQ2hhbmdlIEZ1bmN0aW9uIFNpZ25hdHVyZQotYWN0aW9uLnRvb2x0aXAuOSA9IENoYW5nZSBGdW5jdGlvbiBTaWduYXR1cmUKLWFjdGlvbi5sYWJlbC4xMCA9IE1vdmUKLWFjdGlvbi50b29sdGlwLjEwID0gTW92ZQotYWN0aW9uLmxhYmVsLjExID0gUmVuYW1lCi1hY3Rpb24udG9vbHRpcC4xMSA9IFJlbmFtZQotYWN0aW9uLmxhYmVsLjEyID0gRGVsZXRlCi1hY3Rpb24udG9vbHRpcC4xMiA9IERlbGV0ZQotYWN0aW9uLmxhYmVsLjEzID0gUGFzdGUgQWZ0ZXIKLWFjdGlvbi50b29sdGlwLjEzID0gUGFzdGUKLWFjdGlvbi5sYWJlbC4xNCA9IFBhc3RlIEJlZm9yZQotYWN0aW9uLnRvb2x0aXAuMTQgPSBQYXN0ZQotYWN0aW9uLmxhYmVsLjE1ID0gQ29weQotYWN0aW9uLnRvb2x0aXAuMTUgPSBDb3B5Ci1hY3Rpb24ubGFiZWwuMTYgPSBDdXQKLWFjdGlvbi50b29sdGlwLjE2ID0gQ3V0Ci1tZW51LmxhYmVsLjQgPSBTaG93IEluCi1hY3Rpb24ubGFiZWwuMTcgPSBOYXZpZ2F0b3IKLWFjdGlvbi50b29sdGlwLjE3ID0gU2hvdyBJbiBOYXZpZ2F0b3IKLWFjdGlvbi5sYWJlbC4xOCA9IFNjcmlwdCBFeHBsb3JlcgotYWN0aW9uLnRvb2x0aXAuMTggPSBTaG93IEluIFNjcmlwdCBFeHBsb3JlcgotYWN0aW9uLmxhYmVsLjE5ID0gT3BlbiBDYWxsIEhpZXJhcmNoeQotYWN0aW9uLnRvb2x0aXAuMTkgPSBPcGVuIENhbGwgSGllcmFyY2h5Ci1hY3Rpb24ubGFiZWwuMjAgPSBPcGVuIFR5cGUgSGllcmFyY2h5Ci1hY3Rpb24udG9vbHRpcC4yMCA9IE9wZW4gVHlwZSBIaWVyYXJjaHkKLXJlbmFtZVBhcnRpY2lwYW50Lm5hbWUuMCA9IEpTRFQgV2ViIFJlbmFtZSBQYXJ0aWNpcGFudAotcmVuYW1lUGFydGljaXBhbnQubmFtZS4xID0gSlNEVCBXZWIgUmVuYW1lIFBhcnRpY2lwYW50Ci1yZW5hbWVQYXJ0aWNpcGFudC5uYW1lLjIgPSBKU0RUIFdlYiBSZW5hbWUgUGFydGljaXBhbnQKLXJlbmFtZVBhcnRpY2lwYW50Lm5hbWUuMyA9IEpTRFQgV2ViIFJlbmFtZSBQYXJ0aWNpcGFudAotbWVudS5sYWJlbC41ID0gV2ViIERldmVsb3BtZW50IFRvb2xzCi1hY3Rpb24ubGFiZWwuMjEgPSBBZGQgSmF2YVNjcmlwdCBTdXBwb3J0Ci1xdWVyeVBhcnRpY2lwYW50Lm5hbWUuMCA9IEphdmFTY3JpcHQgUXVlcnkgUGFydGljaXBhbnQKLWh5cGVybGlua0RldGVjdG9yLm5hbWUuMiA9IEpTRFQgSHlwZXJMaW5rIERldGVjdG9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI2NjlkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbiI+Ci0gCQotIAkJPCEtLQotIAkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNEVCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlLnNvdXJjZSIgLz4KLQkJCQotCQktLT4KLQkJCi0gCQk8Y29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLnByb3Zpc2lvbmFsLmNvbnRlbnRvdXRsaW5lLkpzQ29udGVudE91dGxpbmVDb25maWciCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5zb3VyY2UiIC8+CQkKLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0iY29udGVudGFzc2lzdHByb2Nlc3NvciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5KU0RUQ29udGVudEFzc2lzdGFudCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBULG9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVC5FVkVOVEhBTkRMRVIiIC8+Ci0JCi0JCQotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJsaW5lc3R5bGVwcm92aWRlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuc3R5bGUuamF2YS5MaW5lU3R5bGVQcm92aWRlckZvckpTRFQiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVCxvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQuRVZFTlRIQU5ETEVSIiAvPgotCQk8ZG9jdW1lbnRhdGlvblRleHRIb3ZlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC50YWdpbmZvLkpTRFRIb3ZlclByb2Nlc3NvciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBULG9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVC5FVkVOVEhBTkRMRVIiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImNoYXJhY3RlcnBhaXJtYXRjaGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC50ZXh0LkpzRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBULG9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVC5FVkVOVEhBTkRMRVIiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImF1dG9lZGl0c3RyYXRlZ3kiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmF1dG9lZGl0LkF1dG9FZGl0U3RyYXRlZ3lGb3JKcyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBULG9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVC5FVkVOVEhBTkRMRVIiIC8+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IuaHlwZXJsaW5rRGV0ZWN0b3JzIj4KLQkJPGh5cGVybGlua0RldGVjdG9yCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluay5KU0RUSHlwZXJsaW5rRGV0ZWN0b3IiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluay5KU0RUSHlwZXJsaW5rRGV0ZWN0b3IiCi0JCQluYW1lPSIlaHlwZXJsaW5rRGV0ZWN0b3IubmFtZS4yIgotCQkJdGFyZ2V0SWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSI+Ci0JCTwvaHlwZXJsaW5rRGV0ZWN0b3I+Ci0JCQotICAgPC9leHRlbnNpb24+Ci0JCi0JCi0JCi0JPGV4dGVuc2lvbiBwb2ludCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuZGVkRWRpdG9yQWN0aW9ucyI+Ci0JCTxlZGl0b3JDb250cmlidXRpb24gCi0gICAgICAgICAgICB0YXJnZXRJRD0iY29tLmlibS5zc2UuZWRpdG9yLlN0cnVjdHVyZWRUZXh0RWRpdG9yIiAKLSAgICAgICAgICAgIGlkPSJjb20uaWJtLnNzZS5lZGl0b3IuZXh0ZW5kZWRBY3Rpb25zMiI+IAotICAgICAgICAgPGFjdGlvbiAKLSAgICAgICAgICAgICAgIHBvcHVwbWVudVBhdGg9Imdyb3VwLmFkZCIgCi0gICAgICAgICAgICAgICBsYWJlbD0iUHJlZmVyZW5jZXMyIiAKLSAgICAgICAgICAgICAgIGNsYXNzPSJjb20uaWJtLnNzZS5lZGl0b3IucHJlZmVyZW5jZXMudWkuRWRpdFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZXNBY3Rpb24iIAotICAgICAgICAgICAgICAgaWQ9ImNvbS5pYm0uc3NlLmVkaXRvci5wcmVmZXJlbmNlcy51aS5FZGl0U3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlc0FjdGlvbjIiPiAKLSAgICAgICAgIDwvYWN0aW9uPiAKLSAgICAgIDwvZWRpdG9yQ29udHJpYnV0aW9uPiAKLQkJCi0JCi0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IuaHlwZXJsaW5rRGV0ZWN0b3JUYXJnZXRzIj4KLQkJPHRhcmdldAotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVCIKLQkJCW5hbWU9IiV0YXJnZXQubmFtZS4wIj4KLQkJPC90YXJnZXQ+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IuaHlwZXJsaW5rRGV0ZWN0b3JUYXJnZXRzIj4KLQkJPHRhcmdldAotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVC5FVkVOVEhBTkRMRVIiCi0JCQluYW1lPSIldGFyZ2V0Lm5hbWUuMSI+Ci0JCTwvdGFyZ2V0PgotCTwvZXh0ZW5zaW9uPgotCQotCSA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IuaHlwZXJsaW5rRGV0ZWN0b3JzIj4KLSAgICAgIDxoeXBlcmxpbmtEZXRlY3RvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbmsuSlNEVEh5cGVybGlua0RldGVjdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbmsuc2NyaXB0LkpTUEphdmFIeXBlcmxpbmtEZXRlY3RvciIKLSAgICAgICAgICAgIG5hbWU9IiVoeXBlcmxpbmtEZXRlY3Rvci5uYW1lLjAiCi0gICAgICAgICAgICB0YXJnZXRJZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBUIj4KLSAgICAgIDwvaHlwZXJsaW5rRGV0ZWN0b3I+Ci0gICAgICA8aHlwZXJsaW5rRGV0ZWN0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuaHlwZXJsaW5rLkpTRFRIeXBlcmxpbmtEZXRlY3RvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuaHlwZXJsaW5rLnNjcmlwdC5ldmVudC5KU1BKYXZhSHlwZXJsaW5rRGV0ZWN0b3IiCi0gICAgICAgICAgICBuYW1lPSIlaHlwZXJsaW5rRGV0ZWN0b3IubmFtZS4xIgotICAgICAgICAgICAgdGFyZ2V0SWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLlNDUklQVC5FVkVOVEhBTkRMRVIiPgotICAgICAgPC9oeXBlcmxpbmtEZXRlY3Rvcj4gIAotICAgPC9leHRlbnNpb24+Ci0gIAotICAKLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0JPCEtLSBjb250ZW50IG91dGxpbmUgY29udHJpYnV0aW9ucyBmb3IgT3BlbiBUeXBlIGFuZCBPcGVuIEhpZXJhcmNoeSBtZW51LiAgTWVudXMgc2hvdyB1cCBpbiByZXZlcnNlIG9yZGVyIG9mIGRlY2xpcmF0aW9uIChnb29nbGUgaXQpLiAtLT4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmUuSUphdmFXZWJOb2RlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5KYXZhQWN0aW9ucyI+Ci0gICAgICAgICAgICA8IS0tIERlY2xlcmF0aW9ucyBTZWFyY2ggTWVudSAtLT4KLSAgICAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5kZWNsZXJhdGlvbnMiCi0gICAgICAgICAJCWxhYmVsPSIlbWVudS5sYWJlbC4wIgotICAgICAgICAgCQlwYXRoPSJncm91cC5zZWFyY2giPgotICAgICAJCSAJPHNlcGFyYXRvciBuYW1lPSJkZWNsZXJhdGlvbnMiLz4KLSAgICAgICAgIDwvbWVudT4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjAiICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjAiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmRlY2xlcmF0aW9ucy9kZWNsZXJhdGlvbnMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLmFjdGlvbnMuRmluZERlY2xhcmF0aW9uc0luV29ya2luZ1NldEFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4gIAotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuMSIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuMSIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuZGVjbGVyYXRpb25zL2RlY2xlcmF0aW9ucyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5GaW5kUmVmZXJlbmNlc0FjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuYWN0aW9ucy5GaW5kRGVjbGFyYXRpb25zSW5IaWVyYXJjaHlBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+IAotICAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjIiICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjIiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmRlY2xlcmF0aW9ucy9kZWNsZXJhdGlvbnMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuRmluZFJlZmVyZW5jZXNBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLmFjdGlvbnMuRmluZERlY2xhcmF0aW9uc0luUHJvamVjdEFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIAotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuMyIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4zIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5kZWNsZXJhdGlvbnMvZGVjbGVyYXRpb25zIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLkZpbmRSZWZlcmVuY2VzQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC51aS5hY3Rpb25zLkZpbmREZWNsYXJhdGlvbnNBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+ICAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIDwhLS0gUmVmcmVuY2VzIFNlYXJjaCBtZW51IC0tPgotICAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5yZWZlcmVuY2VzIgotICAgICAgICAgCQlsYWJlbD0iJW1lbnUubGFiZWwuMSIKLSAgICAgICAgIAkJcGF0aD0iZ3JvdXAuc2VhcmNoIj4KLSAgICAgCQkgCTxzZXBhcmF0b3IgbmFtZT0icmVmZXJlbmNlcyIvPgotICAgICAgICAgPC9tZW51PgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuNCIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuNCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIucmVmZXJlbmNlcy9yZWZlcmVuY2VzIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLkZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC51aS5hY3Rpb25zLkZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPiAgCi0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC41IiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC41IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5yZWZlcmVuY2VzL3JlZmVyZW5jZXMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuRmluZFJlZmVyZW5jZXNBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLmFjdGlvbnMuRmluZFJlZmVyZW5jZXNJbkhpZXJhcmNoeUFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4gCi0gICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuNiIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuNiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIucmVmZXJlbmNlcy9yZWZlcmVuY2VzIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLkZpbmRSZWZlcmVuY2VzQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC51aS5hY3Rpb25zLkZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgCi0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC43IgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjciCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnJlZmVyZW5jZXMvcmVmZXJlbmNlcyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5GaW5kUmVmZXJlbmNlc0FjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuYWN0aW9ucy5GaW5kUmVmZXJlbmNlc0FjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4gICAKLSAgICAgICAgIDwhLS0gU291cmNlIGFuZCBSZWZhY3RvcmluZyBNZW51J3MgLS0+Ci0gICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnJlZmFjdG9yIgotICAgICAgICAgCQlsYWJlbD0iJW1lbnUubGFiZWwuMiIKLSAgICAgICAgIAkJcGF0aD0iZ3JvdXAuZ2VuZXJhdGUiPgotICAgICAJCSAJPHNlcGFyYXRvciBuYW1lPSJyZWZhY3RvciIvPgotICAgICAgICAgPC9tZW51PgotCi0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc291cmNlIgotICAgICAgICAgCQlsYWJlbD0iJW1lbnUubGFiZWwuMyIKLSAgICAgICAgIAkJcGF0aD0iZ3JvdXAuZ2VuZXJhdGUiPgotICAgICAJCSAJPHNlcGFyYXRvciBuYW1lPSJzb3VyY2UiLz4KLSAgICAgICAgIDwvbWVudT4KLSAgICAgICAgIDwhLS0gU291cmNlIEFjdGlvbnMgLS0+Ci0JCSA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC44IiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC44IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zb3VyY2Uvc291cmNlIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuQWRkSmF2YURvY1N0dWJBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIqIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5nZW5lcmF0ZS5lbGVtZW50LmNvbW1lbnQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8IS0tIFJlZmFjdG9yIEFjdGlvbnMgLS0+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC45IiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC45IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5yZWZhY3Rvci9yZWZhY3RvciIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLlNvdXJjZUFjdGlvbnNBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIqIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5jaGFuZ2UuZnVuY3Rpb24uc2lnbmF0dXJlIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuMTAiICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjEwIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5yZWZhY3Rvci9yZWZhY3RvciIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLlNvdXJjZUFjdGlvbnNBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIqIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5Nb3ZlIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuMTEiICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjExIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5yZWZhY3Rvci9yZWZhY3RvciIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLlNvdXJjZUFjdGlvbnNBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIqIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5yZW5hbWUiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICAKLSAgICAgICAgIAotICAgICAgICAgPCEtLSBFZGl0ICAoY3V0IGNvcHkgcGFzdGUgZXRjLi4gLS0+Ci0gICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuMTIiICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjEyIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Imdyb3VwLmVkaXQiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5TdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIqIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5kZWxldGUiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgIAotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuMTMiICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjEzIgotICAgICAgICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Imdyb3VwLmVkaXQiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5TdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5wYXN0ZS5hZnRlciI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC4xNCIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuMTQiCi0gICAgICAgICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iZ3JvdXAuZWRpdCIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLlN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnBhc3RlLmJlZm9yZSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjE1IiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4xNSIKLSAgICAgICAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJncm91cC5lZGl0IgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuY29weSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLQotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuMTYiICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjE2IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Imdyb3VwLmVkaXQiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5TdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIqIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5jdXQiPgotICAgICAgICAgPC9hY3Rpb24+ICAgICAgICAgCi0gICAgICAgICAKLSAgICAgICAgIDwhLS0gU2hvdyBpbiBTY3JpcHQgRXhwbG9yZXIsIEhpc3RvcnkgYW5kIE5hdmlnYXRvciAtLT4gICAgICAgCi0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuc2hvd2luIgotICAgICAgICAgCQlsYWJlbD0iJW1lbnUubGFiZWwuNCIKLSAgICAgICAgIAkJcGF0aD0iZ3JvdXAuc2hvdyI+Ci0gICAgIAkJIAk8c2VwYXJhdG9yIG5hbWU9InNob3dpbiIvPgotICAgICAgICAgPC9tZW51PiAgCi0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJWFjdGlvbi5sYWJlbC4xNyIgICAgICAgICAgCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlYWN0aW9uLnRvb2x0aXAuMTciCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnNob3dpbi9zaG93aW4iCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5TaG93SW5OYXZpZ2F0b3JBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLmFjdGlvbnMuU2hvd0luTmF2aWdhdG9yVmlld0FjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDwhLS0gSGlzdG9yeSBub3Qgd29ya2luZyB3ZWxsIC0tPgotICAgICAgICAgPCEtLQotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9Ikhpc3RvcnkiICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iU2hvdyBJbiBIaXN0b3J5IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zaG93aW4vc2hvd2luIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuU2hvd0hpc3RvcnlBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLmNhbGxoaWVyYXJjaHkuT3BlbkNhbGxIaWVyYXJjaHlBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+IAotICAgICAgICAgLS0+Ci0gICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVhY3Rpb24ubGFiZWwuMTgiICAgICAgICAgIAotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjE4IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5zaG93aW4vc2hvd2luIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuU2hvd0luU2NyaXB0RXhwbG9yZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLmFjdGlvbnMuU2hvd0luU2NyaXB0RXhwbG9yZXIiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICAKLSAgICAgICAgIDwhLS0gT3BlbiBDYWxsIGFuZCBUeXBlIEhpZXJhcmNoaWVzIC0tPgotICAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjE5IiAgICAgICAgICAKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVhY3Rpb24udG9vbHRpcC4xOSIKLSAgICAgICAgICAgICBtZW51YmFyUGF0aD0iZ3JvdXAuc2hvdyIKLSAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5PcGVuQ2FsbEhpZXJhcmNoeUFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkuY2FsbGhpZXJhcmNoeS5PcGVuQ2FsbEhpZXJhcmNoeUFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjIwIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWFjdGlvbi50b29sdGlwLjIwIgotICAgCQkJbWVudWJhclBhdGg9Imdyb3VwLnNob3ciCi0gICAJCQlzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5PcGVuVHlwZUhpZXJhcmNoeSIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuYWN0aW9ucy5PcGVuVHlwZUhpZXJhcmNoeUFjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gCi0JCQotCTwvZXh0ZW5zaW9uPgotCQotICAKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gc291cmNlIHZhbGlkYXRpb24gZm9yIEpTUAkJCQkJCQkJCQkJCQkJCSAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uIj4KLQkJPHZhbGlkYXRvcgotCQkJc2NvcGU9InRvdGFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnNWYWxpZGF0b3IiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmpzcHNvdXJjZXZhbGlkYXRvciI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQiPjwvcGFydGl0aW9uVHlwZT4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuU0NSSVBULkVWRU5USEFORExFUiI+PC9wYXJ0aXRpb25UeXBlPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCTwvdmFsaWRhdG9yPgotCi0JCQotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gSlNQIFVJIEFkYXB0ZXIgZmFjdG9yaWVzCQkJCQkgICAJCQkJCQkgIAkJCQkgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbiI+Ci0JCTxhZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JKU0RUIj4KLQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCQk8L2FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQkKLQotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBmb3IgYnJlYWtwb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSByZW1vdmVkIGZvciBub3cgLS0+Ci0JPCEtLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYnJlYWtwb2ludCI+Ci0JCTxicmVha3BvaW50Q29udHJpYnV0aW9uIGlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkucHJvdmlkZXJzIj4KLQkJCTxwcm92aWRlcgotCQkJCWNvbnRlbnRUeXBlcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuYnJlYWtwb2ludHByb3ZpZGVycy5KYXZhU3RyYXR1bUJyZWFrcG9pbnRQcm92aWRlcjoqaHRtbCxqcyxodG0qIgotCQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuYnJlYWtwb2ludHByb3ZpZGVycy5KYXZhU3RyYXR1bUJyZWFrcG9pbnRQcm92aWRlciIgLz4KLQkJPC9icmVha3BvaW50Q29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCS0tPgotCQotCQotCTwhLS0gRWRpdG9yIGFjdGlvbnNldHMgLS0+Ci0JPCEtLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldFBhcnRBc3NvY2lhdGlvbnMiPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0LmFjdGlvblNldC5hbm5vdGF0aW9uTmF2aWdhdGlvbiI+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuanNwc291cmNlLnNvdXJjZSIgLz4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JCTxhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5OYXZpZ2F0ZUFjdGlvblNldCI+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuanNwc291cmNlLnNvdXJjZSIgLz4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JLS0+Ci0KLQkKLQkKLQkKLQk8IS0tIEtleWJpbmRpbmdzIGZvciBqc3Agc291cmNlIGVkaXRvciAtLT4KLQk8IS0tCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYmluZGluZ3MiPiAtLT4KLQkgICAgPCEtLSAgd2luMzI6ICBNMT1DVFJMLCBNMj1TSElGVCwgTTM9QUxUIC0tPgotCQk8IS0tIHJlbmFtZSByZWZhY3RvciAtLT4KLQkJPCEtLQotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTIrTTMrUiIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IuanNwLnNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QuanNkdC51aS5lZGl0LnRleHQuamF2YS5yZW5hbWUuZWxlbWVudCIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLQkJPC9rZXk+Ci0JCS0tPgotCQk8IS0tIG1vdmUgcmVmYWN0b3IgLS0+Ci0JCTwhLS0KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0yK00zK1YiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmpzcC5zY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnJlZmFjdG9yLm1vdmUiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCTwvZXh0ZW5zaW9uPgotCS0tPgotCQotCQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gcXVlcnlQYXJ0aWNpcGFudCB0byBwYXJ0aWNpcGF0ZSBpbiBqYXZhIHNlcmFjaGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnF1ZXJ5UGFydGljaXBhbnRzIj4KLQkJPHF1ZXJ5UGFydGljaXBhbnQKLQkJCW5hbWU9IiVxdWVyeVBhcnRpY2lwYW50Lm5hbWUuMCIKLQkJCW5hdHVyZT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5qc05hdHVyZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5zZWFyY2gudWkuSnNRdWVyeVBhcnRpY2lwYW50IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5qYXZhLnNlYXJjaC51aS5Kc1F1ZXJ5UGFydGljaXBhbnQiIC8+Ci0KLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIERvY3VtZW50IHByb3ZpZGVyIGZvciBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5kb2N1bWVudFByb3ZpZGVycyI+Ci0JCTxwcm92aWRlcgotCQkJaW5wdXRUeXBlcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluay5FeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dEZpbGVEb2N1bWVudFByb3ZpZGVyIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5FeHRlcm5hbEZpbGVEb2N1bWVudFByb3ZpZGVyIiAvPgotCi0JPC9leHRlbnNpb24+Ci0JLS0+Ci0JPCEtLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCQk8dmlld2VyQ29udHJpYnV0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuanNwc291cmNlLnNvdXJjZS5SdWxlckNvbnRleHQiCi0JCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5ydWxlci5jb250ZXh0LmFjdGlvbnMiPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkVGFzay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5BZGRUYXNrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkVGFzay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIiAvPgotCi0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRCb29rbWFyay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIgLz4KLQotCQk8L3ZpZXdlckNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLS0tPgotCi0KLTwhLS0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JBY3Rpb25zIj4KLQkJPGVkaXRvckNvbnRyaWJ1dGlvbgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmpzcHNvdXJjZS5zb3VyY2UuZWRpdG9yQWN0aW9ucyIKLQkJCWNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLmphdmFlZGl0b3IuQ29tcGlsYXRpb25Vbml0RWRpdG9yQWN0aW9uQ29udHJpYnV0b3IiCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iQ2xlYW51cERvY3VtZW50IgotCQkJCWxhYmVsPSIlQ2xlYW51cERvY3VtZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jbGVhbnVwLmRvY3VtZW50IgotCQkJCXRvb2x0aXA9IiVDbGVhbnVwRG9jdW1lbnRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdC51aS5DbGVhbnVwQWN0aW9uSFRNTERlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJDbGVhbnVwRG9jdW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlRvZ2dsZUNvbW1lbnQiCi0JCQkJbGFiZWw9IiVUb2dnbGVDb21tZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50b2dnbGUuY29tbWVudCIKLQkJCQl0b29sdGlwPSIlVG9nZ2xlQ29tbWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuVG9nZ2xlQ29tbWVudEFjdGlvblhNTERlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJUb2dnbGVDb21tZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJBZGRCbG9ja0NvbW1lbnQiCi0JCQkJbGFiZWw9IiVBZGRCbG9ja0NvbW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkZC5ibG9jay5jb21tZW50IgotCQkJCXRvb2x0aXA9IiVBZGRCbG9ja0NvbW1lbnRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLkFkZEJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJBZGRCbG9ja0NvbW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlJlbW92ZUJsb2NrQ29tbWVudCIKLQkJCQlsYWJlbD0iJVJlbW92ZUJsb2NrQ29tbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucmVtb3ZlLmJsb2NrLmNvbW1lbnQiCi0JCQkJdG9vbHRpcD0iJVJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuUmVtb3ZlQmxvY2tDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlJlbW92ZUJsb2NrQ29tbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iUmVuYW1lRWxlbWVudCIKLQkJCQlsYWJlbD0iJVJlbmFtZUVsZW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkucmVmYWN0b3IucmVuYW1lIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BSZW5hbWVFbGVtZW50QWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlJlbmFtZUVsZW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9Ik1vdmVFbGVtZW50IgotCQkJCWxhYmVsPSIlTW92ZUVsZW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkucmVmYWN0b3IubW92ZSIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQTW92ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iTW92ZUVsZW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkZpbmRPY2N1cnJlbmNlcyIKLQkJCQlsYWJlbD0iJUZpbmRPY2N1cnJlbmNlc19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5Kc0ZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJGaW5kT2NjdXJyZW5jZXMiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5lbmNsb3NpbmciCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nWE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0TmV4dCIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubmV4dCIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3ROZXh0Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91cyIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LnByZXZpb3VzIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lmxhc3QiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEhpc3RvcnlBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0SGlzdG9yeSI+Ci0JCQk8L2FjdGlvbj4KLQkJPC9lZGl0b3JDb250cmlidXRpb24+Ci0gICAgICAgIDxlZGl0b3JDb250cmlidXRpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuanNwc291cmNlLnJ1bGVyLmFjdGlvbnMiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmJvb2ttYXJrX2FjdGlvbl9jb250ZXh0IgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckRvdWJsZUNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIvPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVTZWxlY3RSdWxlci5sYWJlbCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIgotICAgICAgICAgICAgICAgYWN0aW9uSUQ9IlJ1bGVyQ2xpY2siCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIvPgotICAgICAgICA8L2VkaXRvckNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQktLT4KLQkJPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBGT1IgSlNQL0pBVkEgUkVOQU1FIFBBUlRJQ0lQQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucmVuYW1lUGFydGljaXBhbnRzIj4KLQkJPHJlbmFtZVBhcnRpY2lwYW50Ci0JCQluYW1lPSIlcmVuYW1lUGFydGljaXBhbnQubmFtZS4wIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BUeXBlUmVuYW1lUGFydGljaXBhbnQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImFmZmVjdGVkTmF0dXJlcyI+Ci0JCQkJCTxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmpzTmF0dXJlIiAvPgotCQkJCQk8L2l0ZXJhdGU+Ci0JCQkJPC93aXRoPgotCQkJCTx3aXRoIHZhcmlhYmxlPSJlbGVtZW50Ij4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVR5cGUiIC8+Ci0KLQkJCQk8L3dpdGg+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvcmVuYW1lUGFydGljaXBhbnQ+Ci0JCTxyZW5hbWVQYXJ0aWNpcGFudAotCQkJbmFtZT0iJXJlbmFtZVBhcnRpY2lwYW50Lm5hbWUuMSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BUeXBlUmVuYW1lUGFydGljaXBhbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50Ij4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJhZmZlY3RlZE5hdHVyZXMiPgotCQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5qc05hdHVyZSIgLz4KLQkJCQkJPC9pdGVyYXRlPgotCQkJCTwvd2l0aD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iZWxlbWVudCI+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmUuSUphdmFXZWJOb2RlIiAvPgotCi0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3JlbmFtZVBhcnRpY2lwYW50PgotCQk8cmVuYW1lUGFydGljaXBhbnQKLQkJCW5hbWU9IiVyZW5hbWVQYXJ0aWNpcGFudC5uYW1lLjIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImFmZmVjdGVkTmF0dXJlcyI+Ci0JCQkJCTxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmpzTmF0dXJlIiAvPgotCi0JCQkJCTwvaXRlcmF0ZT4KLQkJCQk8L3dpdGg+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImVsZW1lbnQiPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JRnVuY3Rpb24iIC8+Ci0KLQkJCQk8L3dpdGg+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvcmVuYW1lUGFydGljaXBhbnQ+Ci0JCTxyZW5hbWVQYXJ0aWNpcGFudAotCQkJbmFtZT0iJXJlbmFtZVBhcnRpY2lwYW50Lm5hbWUuMyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BNZXRob2RSZW5hbWVQYXJ0aWNpcGFudCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BNZXRob2RSZW5hbWVQYXJ0aWNpcGFudCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iYWZmZWN0ZWROYXR1cmVzIj4KLQkJCQkJPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkJCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuanNOYXR1cmUiIC8+Ci0KLQkJCQkJPC9pdGVyYXRlPgotCQkJCTwvd2l0aD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iZWxlbWVudCI+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmUuSUphdmFXZWJOb2RlIiAvPgotCi0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3JlbmFtZVBhcnRpY2lwYW50PgotCi0JICA8L2V4dGVuc2lvbj4KLQkgIDwhLS0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuSnNHbG9iYWxTY29wZVVJSW5pdGlhbGl6ZXIiPgotICAgICA8SnNHbG9iYWxTY29wZVVJSW5pdGlhbGl6ZXIKLSAgICAgCWlkPSJvcmcuZWNsaXBzZS53c3QuanNkdC5sYXVuY2hpbmcuV2ViUHJvamVjdCIKLSAgICAgCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVVSUluaXRpYWxpemVyIj4KLSAgICAgPC9Kc0dsb2JhbFNjb3BlVUlJbml0aWFsaXplcj4KLSAgIDwvZXh0ZW5zaW9uPgotLS0+Ci0KLQotICAJIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgCQk8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmpzZHRTZXR1cCI+Ci0gICAgICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgbGFiZWw9IiVtZW51LmxhYmVsLjUiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnByb2plY3QudG9vbHMiPgotICAgICAgICAgICAgPHNlcGFyYXRvcgotICAgICAgICAgICAgICAgbmFtZT0iZ3JvdXAwIj4KLSAgICAgICAgICAgIDwvc2VwYXJhdG9yPgotICAgICAgICAgPC9tZW51PgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5TZXR1cFByb2plY3RzV2l6emFyZCIKLSAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uLmxhYmVsLjIxIgotICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5wcm9qZWN0LnRvb2xzL2dyb3VwMCIKLSAgICAgICAgICAgIGVuYWJsZXNGb3I9IisiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwud2ViLnVpLmNvbnZlcnRQcm9qZWN0cyI+Ci0gICAgICAJPC9hY3Rpb24+Ci0gICAJCTwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+IAotICAJIDwhLS0gVW5jb21tZW50IGZvciBTdGFuZGFsb25lICsgSFRNTCBhcyBzZXBlcmF0ZSBvcHRpb25zIC0tPgotICAJIDwhLS0KLSAgCSA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gCQk8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmpzZHRTZXR1cCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICBsYWJlbD0iQWRkIFN1cHBvcnQgZm9yIEphdmFTY3JpcHQgaW4gSFRNTCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuU2V0dXBQcm9qZWN0c1dpenphcmQiCi0gICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQudWkucHJvamVjdC50b29scy9ncm91cDAiCi0gICAgICAgICAgICBlbmFibGVzRm9yPSIrIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5pbnRlcm5hbC51aS5jb252ZXJ0UHJvamVjdHMiPgotICAgICAgCTwvYWN0aW9uPgotICAgCQk8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPiAgCi0gICAtLT4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzc2NTVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgY2hpbGRzYgotICoKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9TZXR1cFByb2plY3RzV2l6emFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9TZXR1cFByb2plY3RzV2l6emFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjkwM2JlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvU2V0dXBQcm9qZWN0c1dpenphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklJbmNsdWRlUGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0TW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZS5KYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5pbnRlcm5hbC5wcm9qZWN0LkpzV2ViTmF0dXJlOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXR1cFByb2plY3RzV2l6emFyZCBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSwgSUFjdGlvbkRlbGVnYXRlIHsKLQkKLQlPYmplY3RbXSBmVGFyZ2V0OwotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQkvL3Rocm93IG5ldyBVbmltcGxlbWVudGVkRXhjZXB0aW9uKCJzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZihmVGFyZ2V0PT1udWxsKSByZXR1cm47Ci0JCQotCQlmb3IoaW50IGk9MDtpPGZUYXJnZXQubGVuZ3RoO2krKykgewotCQkJaWYoZlRhcmdldFtpXSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdClmVGFyZ2V0W2ldOwotCQkJCQotCQkJCQlpZighSnNXZWJOYXR1cmUuaGFzTmF0dXJlKHByb2plY3QpKSB7Ci0JCQkJCQlKc1dlYk5hdHVyZSBuYXR1cmUgPSBuZXcgSnNXZWJOYXR1cmUocHJvamVjdCxudWxsKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbmF0dXJlLmNvbmZpZ3VyZSgpOwotCQkJCQkJCQotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfWVsc2UgewotCQkJCQkJSmF2YVByb2plY3QganAgPSAoSmF2YVByb2plY3QpSmF2YVNjcmlwdENvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJCQkJSUluY2x1ZGVQYXRoRW50cnlbXSByYXdDbGFzc3BhdGggPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlyYXdDbGFzc3BhdGggPSBqcC5nZXRSYXdJbmNsdWRlcGF0aCgpOwotCQkJCQkJfSBjYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGV4MSkgewotCQkJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJCQlleDEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCQotCQkJCQkJLyogc2VlIGlmIHByb2plY3QgaGFzIHdlYiBjcCBlbnRyeSBhbmQgaWYgaXQgZG9lcyBsZWF2ZSAqLwotCQkJCQkJZm9yKGludCBrID0gMDtyYXdDbGFzc3BhdGghPW51bGwgJiYgazxyYXdDbGFzc3BhdGgubGVuZ3RoO2srKykgewotCQkJCQkJCWlmKHJhd0NsYXNzcGF0aFtrXS5nZXRQYXRoKCkuZXF1YWxzKEpzV2ViTmF0dXJlLlZJUlRVQUxfQlJPV1NFUl9DTEFTU1BBVEgpKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlKc1dlYk5hdHVyZSBuYXR1cmUgPSBuZXcgSnNXZWJOYXR1cmUocHJvamVjdCxudWxsKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbmF0dXJlLmNvbmZpZ3VyZSgpOwotCQkJCQkJCQotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkKLQkJCX0KLQkJfQotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkKLQkJaWYoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJZlRhcmdldCA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLnRvQXJyYXkoKTsKLQkJfWVsc2UgewotCQkJZlRhcmdldCA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTRFQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNEVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDEzZGE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNEVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUNvbnRlbnRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkpTRFRDb250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5mb3JtYXQuRm9ybWF0dGluZ1N0cmF0ZWd5SlNEVDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwudGFnaW5mby5KU0RUSW5mb3JtYXRpb25Qcm92aWRlcjsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKiAKLSAqIENvbmZpZ3VyYXRpb24gZm9yIGEgc291cmNlIHZpZXdlciB3aGljaCBzaG93cyBIdG1sIGFuZCBzdXBwb3J0cyBKU0RULgotICogPHA+Ci0gKiBDbGllbnRzIGNhbiBzdWJjbGFzcyBhbmQgb3ZlcnJpZGUganVzdCB0aG9zZSBtZXRob2RzIHdoaWNoIG11c3QgYmUgc3BlY2lmaWMKLSAqIHRvIHRoZWlyIG5lZWRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU0RUIGV4dGVuZHMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCB7Ci0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTRFQoKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCQotCS8qIENvbnRlbnQgYXNzaXN0IHByb2Nlc3NvcnMgYXJlIGNvbnRyaWJ1dGVkIGJ5IGV4dGVuc2lvbiBmb3IgU1NFIG5vdyAqLwotCQotCXByb3RlY3RlZCBJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIGdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBwcm9jZXNzb3JzID0gbnVsbDsKLQotCQlpZiAoSUhUTUxQYXJ0aXRpb25zLlNDUklQVC5lcXVhbHMocGFydGl0aW9uVHlwZSkgfHwgSUhUTUxQYXJ0aXRpb25zLlNDUklQVF9FVkVOVEhBTkRMRVIuZXF1YWxzKHBhcnRpdGlvblR5cGUpKSB7Ci0JCQlwcm9jZXNzb3JzID0gbmV3IElDb250ZW50QXNzaXN0UHJvY2Vzc29yW117bmV3IEpTRFRDb250ZW50QXNzaXN0YW50KCl9OwotCQl9Ci0JCWVsc2V7Ci0JCQlwcm9jZXNzb3JzID0gc3VwZXIuZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJfQotCQkKLQkJcmV0dXJuIHByb2Nlc3NvcnM7Ci0JfQotCQotCXB1YmxpYyBJQ29udGVudEZvcm1hdHRlciBnZXRDb250ZW50Rm9ybWF0dGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWZpbmFsIElDb250ZW50Rm9ybWF0dGVyIGZvcm1hdHRlciA9IHN1cGVyLmdldENvbnRlbnRGb3JtYXR0ZXIoc291cmNlVmlld2VyKTsKLQkJaWYoZm9ybWF0dGVyIGluc3RhbmNlb2YgTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcikgewotCQkvKgotCQkgKiBDaGVjayBmb3IgYW55IGV4dGVybmFsbHkgc3VwcG9ydGVkIGF1dG8gZWRpdCBzdHJhdGVnaWVzIGZyb20gRVAuCi0JCSAqIFtCcmFkbGV5IENoaWxkcyAtIGNoaWxkc2JAdXMuaWJtLmNvbV0KLQkJICovCi0JCVN0cmluZ1tdIGNvbnRlbnRUeXBlcyA9IGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoSUhUTUxQYXJ0aXRpb25zLlNDUklQVC5lcXVhbHMoY29udGVudFR5cGVzW2ldKSB8fCBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUX0VWRU5USEFORExFUi5lcXVhbHMoY29udGVudFR5cGVzW2ldKSkgewotCQkJCQkoKE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIpIGZvcm1hdHRlcikuc2V0U2xhdmVTdHJhdGVneShuZXcgRm9ybWF0dGluZ1N0cmF0ZWd5SlNEVCgpLCBjb250ZW50VHlwZXNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZm9ybWF0dGVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUluZm9ybWF0aW9uUHJvdmlkZXIgZ2V0SW5mb3JtYXRpb25Qcm92aWRlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJaWYgKElIVE1MUGFydGl0aW9ucy5TQ1JJUFQuZXF1YWxzKHBhcnRpdGlvblR5cGUpIHx8IElIVE1MUGFydGl0aW9ucy5TQ1JJUFRfRVZFTlRIQU5ETEVSLmVxdWFscyhwYXJ0aXRpb25UeXBlKSkgewotCQkJcmV0dXJuIG5ldyBKU0RUSW5mb3JtYXRpb25Qcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRJbmZvcm1hdGlvblByb3ZpZGVyKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9XZWJQcm9qZWN0SnNHbG9iYWxTY29wZVVJSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVVSUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYWVjY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9XZWJQcm9qZWN0SnNHbG9iYWxTY29wZVVJSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS5JSnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyRXh0ZW5zaW9uOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKgotICovCi1wdWJsaWMgY2xhc3MgV2ViUHJvamVjdEpzR2xvYmFsU2NvcGVVSUluaXRpYWxpemVyIGltcGxlbWVudHMgSUpzR2xvYmFsU2NvcGVDb250YWluZXJJbml0aWFsaXplckV4dGVuc2lvbnsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS5JSnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWx6ZXJFeHRlbnNpb24jZ2V0SW1hZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0UHJvamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlKElQYXRoIGNvbnRhaW5lclBhdGgsIFN0cmluZyBlbGVtZW50LCBJSmF2YVNjcmlwdFByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKHRoaXMuZ2V0Q2xhc3MoKSwid2ViMS5KUEciKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9BZGRKYXZhRG9jU3R1YkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL0FkZEphdmFEb2NTdHViQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MDQ0NGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL0FkZEphdmFEb2NTdHViQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLmFjdGlvbnMuV29ya2JlbmNoUnVubmFibGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLnV0aWwuRXhjZXB0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmUuSnNKZmFjZU5vZGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQWRkSmF2YURvY1N0dWJBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JcHJpdmF0ZSBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0OwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlhbG9nVGl0bGUoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIkFkZEphdmFEb2NTdHViQWN0aW9uLjAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCXJldHVybiBnZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQl9Ci0JCi0JcHVibGljIElXb3JrYmVuY2hQYXJ0U2l0ZSBnZXRTaXRlKCkgewotCQlyZXR1cm4gdGFyZ2V0UGFydC5nZXRTaXRlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlJSmF2YVNjcmlwdEVsZW1lbnRbXSBlbGVtZW50cyA9IEpzRWxlbWVudEFjdGlvblByb3h5LmdldEpzRWxlbWVudHNGcm9tU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmxlbmd0aCA8IDEpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJSmF2YVNjcmlwdEVsZW1lbnQgcGFyZW50ID0gZWxlbWVudHNbMF0uZ2V0UGFyZW50KCk7Ci0JCS8qIGZpbmQgdGhlIGN1ICovCi0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElKYXZhU2NyaXB0VW5pdCkpIHsKLQkJCQotCQl9Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJQXJyYXlMaXN0IG1lbWJlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGVsZW1lbnRzW2ldIGluc3RhbmNlb2YgSU1lbWJlcikgewotCQkJCQltZW1iZXJzLmFkZChlbGVtZW50c1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJSnNKZmFjZU5vZGUgbm9kZVtdID0gU2ltcGxlSlNEVEFjdGlvblByb3h5LmdldEpzSmZhY2VOb2Rlc0Zyb21TZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCS8qIG9ubHkgc2hvdWxkIGJlIG9uZSBub2RlICovCi0JCQlydW4oKElKYXZhU2NyaXB0VW5pdCkgcGFyZW50LCAoSU1lbWJlcltdKSBtZW1iZXJzLnRvQXJyYXkobmV3IElNZW1iZXJbbWVtYmVycy5zaXplKCldKSwgbm9kZVswXSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKElKYXZhU2NyaXB0VW5pdCBjdSwgSU1lbWJlcltdIG1lbWJlcnMsIEpzSmZhY2VOb2RlIG5vZGUpIHsKLQkJdHJ5IHsKLQkJCUFkZEphdmFEb2NTdHViT3BlcmF0aW9uIG9wID0gbmV3IEFkZEphdmFEb2NTdHViT3BlcmF0aW9uKG1lbWJlcnMsIG5vZGUpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW5JblVJKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCksIG5ldyBXb3JrYmVuY2hSdW5uYWJsZUFkYXB0ZXIob3AsIG9wLmdldFNjaGVkdWxlUnVsZSgpKSwgb3AuZ2V0U2NoZWR1bGVSdWxlKCkpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCUV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlKGUsIGdldFNoZWxsKCksIGdldERpYWxvZ1RpdGxlKCksIE1lc3NhZ2VzLmdldFN0cmluZygiQWRkSmF2YURvY1N0dWJBY3Rpb24uMSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvcGVyYXRpb24gY2FuY2VsZWQKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQl0aGlzLnRhcmdldFBhcnQgPSB0YXJnZXRQYXJ0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9BZGRKYXZhRG9jU3R1Yk9wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL0FkZEphdmFEb2NTdHViT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZGU2MDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL0FkZEphdmFEb2NTdHViT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0VW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Eb2N1bWVudENoYW5nZUxpc3RlbmVyVG9UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkpzSmZhY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQWRkSmF2YURvY1N0dWJPcGVyYXRpb24gZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JleHQuY29kZW1hbmlwdWxhdGlvbi5BZGRKYXZhRG9jU3R1Yk9wZXJhdGlvbiB7Ci0JcHJpdmF0ZSBJRG9jdW1lbnQgY29weTsKLQkvKioKLQkgKiBAcGFyYW0gbWVtYmVycwotCSAqLwotCXByaXZhdGUgSnNKZmFjZU5vZGUgbm9kZTsKLQlwcml2YXRlIERvY3VtZW50Q2hhbmdlTGlzdGVuZXJUb1RleHRFZGl0IHRleHRFZGl0TGlzdGVuZXI7Ci0JCi0JcHVibGljIEFkZEphdmFEb2NTdHViT3BlcmF0aW9uKElNZW1iZXJbXSBtZW1iZXJzLCBKc0pmYWNlTm9kZSBub2RlKSB7Ci0JCXN1cGVyKG1lbWJlcnMpOwotCQl0aGlzLm5vZGUgPSBub2RlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhcHBseUNoYW5nZXMoKSB7Ci0JCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJdHJ5IHsKLQkJCU11bHRpVGV4dEVkaXQgZWRpdHMgPSB0ZXh0RWRpdExpc3RlbmVyLmdldFRleHRFZGl0cygpOwotCQkJbW9kZWwgPSBtb2RlbE1hbmFnZXIuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jKTsKLQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJbW9kZWwuYmVnaW5SZWNvcmRpbmcodGhpcywgTWVzc2FnZXMuZ2V0U3RyaW5nKCJBZGRKYXZhRG9jU3R1Yk9wZXJhdGlvbi4wIiksIE1lc3NhZ2VzLmdldFN0cmluZygiQWRkSmF2YURvY1N0dWJPcGVyYXRpb24uMSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQllZGl0cy5hcHBseShkb2MpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JleHQuY29kZW1hbmlwdWxhdGlvbi5BZGRKYXZhRG9jU3R1Yk9wZXJhdGlvbiNnZXREb2N1bWVudChvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0VW5pdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCQotCXByb3RlY3RlZCBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoSUphdmFTY3JpcHRVbml0IGN1LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldEphdmFEb2N1bWVudEZyb21Ob2RlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJRG9jdW1lbnQgZ2V0SmF2YURvY3VtZW50RnJvbU5vZGUoKSB7Ci0JCWlmIChjb3B5ID09IG51bGwpIHsKLQkJCUlKc1RyYW5zbGF0aW9uIHRyYW4gPSBub2RlLmdldFRyYW5zbGF0aW9uKCk7Ci0JCQljb3B5ID0gbmV3IERvY3VtZW50KHRyYW4uZ2V0SnNUZXh0KCkpOwotCQkJdGV4dEVkaXRMaXN0ZW5lciA9IG5ldyBEb2N1bWVudENoYW5nZUxpc3RlbmVyVG9UZXh0RWRpdCgpOwotCQkJY29weS5hZGREb2N1bWVudExpc3RlbmVyKHRleHRFZGl0TGlzdGVuZXIpOwotCQl9Ci0JCXJldHVybiBjb3B5OwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlzdXBlci5ydW4obW9uaXRvcik7Ci0JCWFwcGx5Q2hhbmdlcygpOwotCQkvKiBuZWVkIHRvIGFwcGx5IHRoZSB0ZXh0IGVkaXRzIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGRvYyAqLwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9GaW5kUmVmZXJlbmNlc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL0ZpbmRSZWZlcmVuY2VzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YTRjNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL0ZpbmRSZWZlcmVuY2VzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRmluZFJlZmVyZW5jZXNBY3Rpb24gZXh0ZW5kcyBKc0VsZW1lbnRBY3Rpb25Qcm94eSB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5Kc0VsZW1lbnRBY3Rpb25Qcm94eSNnZXRSdW5BcmdzKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRSdW5BcmdzKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50c1tdID0gSnNFbGVtZW50QWN0aW9uUHJveHkuZ2V0SnNFbGVtZW50c0Zyb21TZWxlY3Rpb24oZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkgewotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IGVsZW1lbnRzWzBdIH07Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnMuSnNFbGVtZW50QWN0aW9uUHJveHkjZ2V0UnVuQXJnVHlwZXMoKQotCSAqLwotCQotCXB1YmxpYyBDbGFzc1tdIGdldFJ1bkFyZ1R5cGVzKCkgewotCQlyZXR1cm4gbmV3IENsYXNzW10geyBJSmF2YVNjcmlwdEVsZW1lbnQuY2xhc3MgfTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL0ZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM4ZjQyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24gZXh0ZW5kcyBGaW5kUmVmZXJlbmNlc0FjdGlvbiB7Ci0JCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlPYmplY3QgaGFuZGxlciA9IGdldEFjdGlvbkhhbmRsZXIoYWN0aW9uKTsKLQkJCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50c1tdID0gSnNFbGVtZW50QWN0aW9uUHJveHkuZ2V0SnNFbGVtZW50c0Zyb21TZWxlY3Rpb24oZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKLQkJCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU2ltcGxlSlNEVEFjdGlvblByb3h5LmV4ZWN1dGVNZXRob2QoaGFuZGxlciwgInJ1biIsIG5ldyBDbGFzc1tdIHsgSUphdmFTY3JpcHRFbGVtZW50LmNsYXNzIH0sIG5ldyBPYmplY3RbXSB7IGVsZW1lbnRzWzBdIH0pOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBJZiB1c2VyIGRvZXNuJ3Qgc2VsZWN0IGEgd29ya2luZyBzZXQgYW4gZXhjZXB0aW9uIGlzIHRocm93biBzbyB3ZQotCQkJLy8gd29udCBwcmludCBzdGFjayB0cmFjZSBoZXJlCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvSnNFbGVtZW50QWN0aW9uUHJveHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9Kc0VsZW1lbnRBY3Rpb25Qcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDc3MWZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9Kc0VsZW1lbnRBY3Rpb25Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklKYXZhV2ViTm9kZTsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEpzRWxlbWVudEFjdGlvblByb3h5IGV4dGVuZHMgU2ltcGxlSlNEVEFjdGlvblByb3h5IHsKLQkvKiBVdGlsIG1ldGhvZCB0byBnZXQgYWxsIHRoZSBqYXZhIGVsZW1lbnRzIGluIGEgc2VsZWN0aW9uICovCi0JcHVibGljIHN0YXRpYyBJSmF2YVNjcmlwdEVsZW1lbnRbXSBnZXRKc0VsZW1lbnRzRnJvbVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgSUphdmFTY3JpcHRFbGVtZW50WzBdOwotCQl9Ci0JCUFycmF5TGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJdGVyYXRvciBpdHQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXR0Lmhhc05leHQoKSkgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXR0Lm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFXZWJOb2RlKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZCgoKElKYXZhV2ViTm9kZSkgZWxlbWVudCkuZ2V0SmF2YUVsZW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIChJSmF2YVNjcmlwdEVsZW1lbnRbXSkgZWxlbWVudHMudG9BcnJheShuZXcgSUphdmFTY3JpcHRFbGVtZW50W2VsZW1lbnRzLnNpemUoKV0pOwotCQl9Ci0JCXJldHVybiBuZXcgSUphdmFTY3JpcHRFbGVtZW50WzBdOwotCX0KLQkKLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0UnVuQXJncyhJQWN0aW9uIGFjdGlvbikgewotCQkvKgotCQkgKiBOZWVkcyB0byByZXR1cm4gYW4gYXJyYXkgb2YgSUphdmFFbGVtZW50cy4gU2luY2UgaXRzIG9uZSBhcmcgb2YgdHlwZQotCQkgKiBJSmF2YVNjcmlwdEVsZW1lbnRbXSBuZWVkIHRvIHB1dCBpbnRvIGFuIG9iamVjdCBhcnJheQotCQkgKi8KLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IEpzRWxlbWVudEFjdGlvblByb3h5LmdldEpzRWxlbWVudHNGcm9tU2VsZWN0aW9uKGdldEN1cnJlbnRTZWxlY3Rpb24oKSkgfTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5TaW1wbGVKU0RUQWN0aW9uUHJveHkjZ2V0UnVuQXJnVHlwZXMoKQotCSAqLwotCQotCXB1YmxpYyBDbGFzc1tdIGdldFJ1bkFyZ1R5cGVzKCkgewotCQlyZXR1cm4gbmV3IENsYXNzW10geyAobmV3IElKYXZhU2NyaXB0RWxlbWVudFswXSkuZ2V0Q2xhc3MoKSB9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZmExN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL09wZW5DYWxsSGllcmFyY2h5QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvT3BlbkNhbGxIaWVyYXJjaHlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYwODNhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvT3BlbkNhbGxIaWVyYXJjaHlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgY2hpbGRzYgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuQ2FsbEhpZXJhcmNoeUFjdGlvbiBleHRlbmRzIEpzRWxlbWVudEFjdGlvblByb3h5IHsKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLlNpbXBsZUpTRFRBY3Rpb25Qcm94eSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudFtdIGVsZW1lbnRzID0gSnNFbGVtZW50QWN0aW9uUHJveHkuZ2V0SnNFbGVtZW50c0Zyb21TZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJLyogT3BlbiBjYWxsIGhpZXJhcmNoeSBuZWVkcyB0byBiZSBkaXNhYmxlZCBmb3IgVFlQRXMgKi8KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGVsZW1lbnRzW2ldLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LlRZUEUpIHsKLQkJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLnNlbGVjdGlvbkNoYW5nZWQoYWN0aW9uLCBzZWxlY3Rpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9PcGVuVHlwZUhpZXJhcmNoeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL09wZW5UeXBlSGllcmFyY2h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNWE0YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL09wZW5UeXBlSGllcmFyY2h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5UeXBlSGllcmFyY2h5IGV4dGVuZHMgSnNFbGVtZW50QWN0aW9uUHJveHkgewotCQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudFtdIGVsZW1lbnRzID0gSnNFbGVtZW50QWN0aW9uUHJveHkuZ2V0SnNFbGVtZW50c0Zyb21TZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJLyogT3BlbiBjYWxsIGhpZXJhcmNoeSBuZWVkcyB0byBiZSBkaXNhYmxlZCBmb3IgVFlQRXMgKi8KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGVsZW1lbnRzW2ldLmdldEVsZW1lbnRUeXBlKCkgIT0gSUphdmFTY3JpcHRFbGVtZW50LlRZUEUpIHsKLQkJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLnNlbGVjdGlvbkNoYW5nZWQoYWN0aW9uLCBzZWxlY3Rpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvYWN0aW9ucy9TaG93SGlzdG9yeUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1Nob3dIaXN0b3J5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3OGMwMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1Nob3dIaXN0b3J5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTZXRTZWxlY3Rpb25UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkudXRpbC5FeGNlcHRpb25IYW5kbGVyOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBjaGlsZHNiCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNob3dIaXN0b3J5QWN0aW9uIGV4dGVuZHMgSnNFbGVtZW50QWN0aW9uUHJveHkgewotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwcml2YXRlIElSZXNvdXJjZSBnZXRIb3N0UmVzb3VyY2UoSUphdmFTY3JpcHRFbGVtZW50IHZpcnR1YWxFbGVtZW50KSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSB2aXJ0dWFsRWxlbWVudC5nZXRKYXZhU2NyaXB0UHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHZpcnR1YWxFbGVtZW50LmdldEhvc3RQYXRoKCkuZ2V0UGF0aCgpKTsKLQkJSVJlc291cmNlIGhvc3QgPSBwcm9qZWN0LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHBhdGgpOwotCQlyZXR1cm4gaG9zdDsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50c1tdID0gSnNFbGVtZW50QWN0aW9uUHJveHkuZ2V0SnNFbGVtZW50c0Zyb21TZWxlY3Rpb24oZ2V0Q3VycmVudFNlbGVjdGlvbigpKTsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwgfHwgZWxlbWVudHMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlpZiAoZWxlbWVudHNbMF0uaXNWaXJ0dWFsKCkpIHsKLQkJCXJlc291cmNlID0gZ2V0SG9zdFJlc291cmNlKGVsZW1lbnRzWzBdKTsKLQkJfSBlbHNlIHsKLQkJCXJlc291cmNlID0gZWxlbWVudHNbMF0uZ2V0UmVzb3VyY2UoKTsKLQkJfQotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gdGFyZ2V0V29ya2JlbmNoUGFydC5nZXRTaXRlKCkuZ2V0UGFnZSgpOwotCQkJSVZpZXdQYXJ0IHZpZXcgPSBwYWdlLnNob3dWaWV3KElQYWdlTGF5b3V0LklEX1JFU19OQVYpOwotCQkJaWYgKHZpZXcgaW5zdGFuY2VvZiBJU2V0U2VsZWN0aW9uVGFyZ2V0KSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihyZXNvdXJjZSk7Ci0JCQkJKChJU2V0U2VsZWN0aW9uVGFyZ2V0KSB2aWV3KS5zZWxlY3RSZXZlYWwoc2VsZWN0aW9uKTsKLQkJCX0KLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJRXhjZXB0aW9uSGFuZGxlci5oYW5kbGUoZSwgdGFyZ2V0V29ya2JlbmNoUGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJTaG93SGlzdG9yeUFjdGlvbi4wIiksIE1lc3NhZ2VzLmdldFN0cmluZygiU2hvd0hpc3RvcnlBY3Rpb24uMSIpICsgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQlJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudHNbXSA9IEpzRWxlbWVudEFjdGlvblByb3h5LmdldEpzRWxlbWVudHNGcm9tU2VsZWN0aW9uKGdldEN1cnJlbnRTZWxlY3Rpb24oKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChlbGVtZW50c1tpXS5pc1ZpcnR1YWwoKSkgewotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldEhvc3RSZXNvdXJjZShlbGVtZW50c1tpXSk7Ci0JCQkJaWYgKHJlc291cmNlID09IG51bGwgfHwgIXJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvU2hvd0luTmF2aWdhdG9yQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvU2hvd0luTmF2aWdhdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyOGI5NDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1Nob3dJbk5hdmlnYXRvckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLnV0aWwuRXhjZXB0aW9uSGFuZGxlcjsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgY2hpbGRzYgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG93SW5OYXZpZ2F0b3JBY3Rpb24gZXh0ZW5kcyBKc0VsZW1lbnRBY3Rpb25Qcm94eSB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXByaXZhdGUgSVJlc291cmNlIGdldEhvc3RSZXNvdXJjZShJSmF2YVNjcmlwdEVsZW1lbnQgdmlydHVhbEVsZW1lbnQpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IHZpcnR1YWxFbGVtZW50LmdldEphdmFTY3JpcHRQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgodmlydHVhbEVsZW1lbnQuZ2V0SG9zdFBhdGgoKS5nZXRQYXRoKCkpOwotCQlJUmVzb3VyY2UgaG9zdCA9IHByb2plY3QuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIocGF0aCk7Ci0JCXJldHVybiBob3N0OwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnRzW10gPSBKc0VsZW1lbnRBY3Rpb25Qcm94eS5nZXRKc0VsZW1lbnRzRnJvbVNlbGVjdGlvbihnZXRDdXJyZW50U2VsZWN0aW9uKCkpOwotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCB8fCBlbGVtZW50cy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCWlmIChlbGVtZW50c1swXS5pc1ZpcnR1YWwoKSkgewotCQkJcmVzb3VyY2UgPSBnZXRIb3N0UmVzb3VyY2UoZWxlbWVudHNbMF0pOwotCQl9IGVsc2UgewotCQkJcmVzb3VyY2UgPSBlbGVtZW50c1swXS5nZXRSZXNvdXJjZSgpOwotCQl9Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB0YXJnZXRXb3JrYmVuY2hQYXJ0LmdldFNpdGUoKS5nZXRQYWdlKCk7Ci0JCQlJVmlld1BhcnQgdmlldyA9IHBhZ2Uuc2hvd1ZpZXcoSVBhZ2VMYXlvdXQuSURfUkVTX05BVik7Ci0JCQlpZiAodmlldyBpbnN0YW5jZW9mIElTZXRTZWxlY3Rpb25UYXJnZXQpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHJlc291cmNlKTsKLQkJCQkoKElTZXRTZWxlY3Rpb25UYXJnZXQpIHZpZXcpLnNlbGVjdFJldmVhbChzZWxlY3Rpb24pOwotCQkJfQotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlFeGNlcHRpb25IYW5kbGVyLmhhbmRsZShlLCB0YXJnZXRXb3JrYmVuY2hQYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpLCBNZXNzYWdlcy5nZXRTdHJpbmcoIlNob3dJbk5hdmlnYXRvckFjdGlvbi4wIiksIE1lc3NhZ2VzLmdldFN0cmluZygiU2hvd0luTmF2aWdhdG9yQWN0aW9uLjEiKSArIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnRzW10gPSBKc0VsZW1lbnRBY3Rpb25Qcm94eS5nZXRKc0VsZW1lbnRzRnJvbVNlbGVjdGlvbihnZXRDdXJyZW50U2VsZWN0aW9uKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZWxlbWVudHNbaV0uaXNWaXJ0dWFsKCkpIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRIb3N0UmVzb3VyY2UoZWxlbWVudHNbaV0pOwotCQkJCWlmIChyZXNvdXJjZSA9PSBudWxsIHx8ICFyZXNvdXJjZS5leGlzdHMoKSkgewotCQkJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1Nob3dJblNjcmlwdEV4cGxvcmVyQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvU2hvd0luU2NyaXB0RXhwbG9yZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk5ZWExZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvU2hvd0luU2NyaXB0RXhwbG9yZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNldFNlbGVjdGlvblRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS5wYWNrYWdldmlldy5QYWNrYWdlRXhwbG9yZXJQYXJ0OwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU2hvd0luU2NyaXB0RXhwbG9yZXJBY3Rpb24gZXh0ZW5kcyBKc0VsZW1lbnRBY3Rpb25Qcm94eSB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXByaXZhdGUgSVJlc291cmNlIGdldEhvc3RSZXNvdXJjZShJSmF2YVNjcmlwdEVsZW1lbnQgdmlydHVhbEVsZW1lbnQpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IHZpcnR1YWxFbGVtZW50LmdldEphdmFTY3JpcHRQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgodmlydHVhbEVsZW1lbnQuZ2V0SG9zdFBhdGgoKS5nZXRQYXRoKCkpOwotCQlJUmVzb3VyY2UgaG9zdCA9IHByb2plY3QuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIocGF0aCk7Ci0JCXJldHVybiBob3N0OwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5hY3Rpb25zLkpzRWxlbWVudEFjdGlvblByb3h5I2dldFJ1bkFyZ3Mob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JCi0JcHVibGljIE9iamVjdFtdIGdldFJ1bkFyZ3MoSUFjdGlvbiBhY3Rpb24pIHsKLQkJSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnRzW10gPSBKc0VsZW1lbnRBY3Rpb25Qcm94eS5nZXRKc0VsZW1lbnRzRnJvbVNlbGVjdGlvbihnZXRDdXJyZW50U2VsZWN0aW9uKCkpOwotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgZWxlbWVudHNbMF0gfTsKLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9ucy5Kc0VsZW1lbnRBY3Rpb25Qcm94eSNnZXRSdW5BcmdUeXBlcygpCi0JICovCi0JCi0JcHVibGljIENsYXNzW10gZ2V0UnVuQXJnVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXSB7IElKYXZhU2NyaXB0RWxlbWVudC5jbGFzcyB9OwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnRzW10gPSBKc0VsZW1lbnRBY3Rpb25Qcm94eS5nZXRKc0VsZW1lbnRzRnJvbVNlbGVjdGlvbihnZXRDdXJyZW50U2VsZWN0aW9uKCkpOwotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCB8fCBlbGVtZW50cy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCWlmIChlbGVtZW50c1swXS5pc1ZpcnR1YWwoKSkgewotCQkJcmVzb3VyY2UgPSBnZXRIb3N0UmVzb3VyY2UoZWxlbWVudHNbMF0pOwotCQl9IGVsc2UgewotCQkJcmVzb3VyY2UgPSBlbGVtZW50c1swXS5nZXRSZXNvdXJjZSgpOwotCQl9Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCVBhY2thZ2VFeHBsb3JlclBhcnQgdmlldyA9IFBhY2thZ2VFeHBsb3JlclBhcnQub3BlbkluQWN0aXZlUGVyc3BlY3RpdmUoKTsKLQkJCXZpZXcudHJ5VG9SZXZlYWwocmVzb3VyY2UpOwotLy8gSVdvcmtiZW5jaFBhZ2UgcGFnZT0gdGFyZ2V0V29ya2JlbmNoUGFydC5nZXRTaXRlKCkuZ2V0UGFnZSgpOwotLy8gSVZpZXdQYXJ0IHZpZXc9IHBhZ2Uuc2hvd1ZpZXcoSVBhZ2VMYXlvdXQuSURfUkVTX05BVik7Ci0JCQlpZiAodmlldyBpbnN0YW5jZW9mIElTZXRTZWxlY3Rpb25UYXJnZXQpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHJlc291cmNlKTsKLQkJCQkoKElTZXRTZWxlY3Rpb25UYXJnZXQpIHZpZXcpLnNlbGVjdFJldmVhbChzZWxlY3Rpb24pOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gRXhjZXB0aW9uSGFuZGxlci5oYW5kbGUoZSwKLQkJCS8vIHRhcmdldFdvcmtiZW5jaFBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCksICJFcnJvciBPcGVuaW5nIGluCi0JCQkvLyBTY3JpcHQgVmlldyIsICJFcnJvciB3aGlsZSBkaXNwbGF5aW5nIGVsZW1lbnQgaW4gU2NyaXB0IFZpZXc6XG4iCi0JCQkvLyArIGUpOwotCQl9Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQlJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudHNbXSA9IEpzRWxlbWVudEFjdGlvblByb3h5LmdldEpzRWxlbWVudHNGcm9tU2VsZWN0aW9uKGdldEN1cnJlbnRTZWxlY3Rpb24oKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChlbGVtZW50c1tpXS5pc1ZpcnR1YWwoKSkgewotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldEhvc3RSZXNvdXJjZShlbGVtZW50c1tpXSk7Ci0JCQkJaWYgKHJlc291cmNlID09IG51bGwgfHwgIXJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvU2ltcGxlSlNEVEFjdGlvblByb3h5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvU2ltcGxlSlNEVEFjdGlvblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMjRiNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1NpbXBsZUpTRFRBY3Rpb25Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmUuSnNKZmFjZU5vZGU7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgY2hpbGRzYgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVKU0RUQWN0aW9uUHJveHkgaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2QoT2JqZWN0IGhhbmRsZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzc1tdIHBhcmFtYXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWF0ZXJWYWx1ZXMpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwKLQkJCU5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJQ2xhc3MgdGFyZ2V0ID0gaGFuZGxlci5nZXRDbGFzcygpOwotCQlNZXRob2QgbSA9IHRhcmdldC5nZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1hdGVyVHlwZXMpOwotCQlyZXR1cm4gbS5pbnZva2UoaGFuZGxlciwgcGFyYW1hdGVyVmFsdWVzKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBKc0pmYWNlTm9kZVtdIGdldEpzSmZhY2VOb2Rlc0Zyb21TZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IEpzSmZhY2VOb2RlWzBdOwotCQl9Ci0JCUFycmF5TGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJdGVyYXRvciBpdHQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXR0Lmhhc05leHQoKSkgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXR0Lm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEpzSmZhY2VOb2RlKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gKEpzSmZhY2VOb2RlW10pIGVsZW1lbnRzLnRvQXJyYXkobmV3IEpzSmZhY2VOb2RlW2VsZW1lbnRzLnNpemUoKV0pOwotCQl9Ci0JCXJldHVybiBuZXcgSnNKZmFjZU5vZGVbMF07Ci0JfQotCXByb3RlY3RlZCBPYmplY3QgYWN0aW9uSGFuZGxlclRhcmdldDsKLQlwcml2YXRlIElTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgSUFjdGlvbiBoYW5kbGVyVGFyZ2V0QWN0aW9uOwotCXByb3RlY3RlZCBJV29ya2JlbmNoUGFydCB0YXJnZXRXb3JrYmVuY2hQYXJ0OwotCQotCXB1YmxpYyBTaW1wbGVKU0RUQWN0aW9uUHJveHkoKSB7fQotCQotCS8qCi0JICogTW9zdCBoYW5kbGVycyBsb29rIGZvciBXb3JrQmVuY2hTaXRlLCBzbyB3ZSBjb252ZXJ0IHRoZSBXb3JrQmVuY2hQYXJ0IHRvCi0JICogV29ya0JlbmNoU2l0ZSBmb3IgaW5pdAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0QWN0aW9uSGFuZGxlcihJQWN0aW9uIGFjdGlvbikgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLAotCQkJSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCS8qIFRhcmdldCBjbGFzcyBpcyBjYWNoZWQgKi8KLQkJaWYgKGhhbmRsZXJUYXJnZXRBY3Rpb24gPT0gYWN0aW9uICYmIGFjdGlvbkhhbmRsZXJUYXJnZXQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFjdGlvbkhhbmRsZXJUYXJnZXQ7Ci0JCX0KLQkJQ2xhc3MgdGFyZ2V0ID0gbnVsbDsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldEFjdGlvbkhhbmRsZXJDbGFzc05hbWUoYWN0aW9uKTsKLQkJdHJ5IHsKLQkJCXRhcmdldCA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvci4uIENsYXNzIHRhcmdldCBvZiBhY3Rpb24gaGFuZGxlciBub3QgZm91bmQ6ICIgKyBhY3Rpb24pOwotCQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VzLmdldFN0cmluZygiU2ltcGxlSlNEVEFjdGlvblByb3h5LjAiKSArIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIHVzZSB0aGUgbG9hZGVkIGNsYXNzCi0JCUNsYXNzW10gdHlwZXMgPSBuZXcgQ2xhc3NbXSB7IElXb3JrYmVuY2hTaXRlLmNsYXNzIH07Ci0JCUNvbnN0cnVjdG9yIGNvbnMgPSB0YXJnZXQuZ2V0Q29uc3RydWN0b3IodHlwZXMpOwotCQlPYmplY3RbXSBhcmdzID0gbmV3IE9iamVjdFtdIHsgdGFyZ2V0V29ya2JlbmNoUGFydC5nZXRTaXRlKCkgfTsKLQkJCi0JCWFjdGlvbkhhbmRsZXJUYXJnZXQgPSBjb25zLm5ld0luc3RhbmNlKGFyZ3MpOwotCQloYW5kbGVyVGFyZ2V0QWN0aW9uID0gYWN0aW9uOwotCQlyZXR1cm4gYWN0aW9uSGFuZGxlclRhcmdldDsKLQl9Ci0JCi0JLyoKLQkgKiBEZWZhdWx0IHdheSBvZiBkZXRlcm1pbmluZyB0aGUgYWN0aW9uIGhhbmRsZXJzIGNsYXNzIG5hbWUuLiBtYXkgYmUKLQkgKiBzdWJjbGFzc2VkL292ZXJyaWRkZW4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFjdGlvbkhhbmRsZXJDbGFzc05hbWUoSUFjdGlvbiBhY3Rpb24pIHsKLQkJcmV0dXJuIGFjdGlvbi5nZXRJZCgpOwotCX0KLQkKLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRDdXJyZW50U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudFNlbGVjdGlvbjsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldFJ1bkFyZ3MoSUFjdGlvbiBhY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IGdldEN1cnJlbnRTZWxlY3Rpb24oKSB9OwotCX0KLQkKLQlwdWJsaWMgQ2xhc3NbXSBnZXRSdW5BcmdUeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tdIHsgSVN0cnVjdHVyZWRTZWxlY3Rpb24uY2xhc3MgfTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldFNlbGVjdGlvbkNoYW5nZUFyZ3MoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0W10geyBnZXRDdXJyZW50U2VsZWN0aW9uKCkgfTsKLQl9Ci0JCi0JcHVibGljIENsYXNzW10gZ2V0U2VsZWN0aW9uQ2hhbmdlQXJnVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXSB7IElTdHJ1Y3R1cmVkU2VsZWN0aW9uLmNsYXNzIH07Ci0JfQotCQotCS8qCi0JICogR2VuZXJpYyByZWZsZWN0aW9uIHV0aWwgbWV0aG9kIHRvIGV4ZWN1dGUgYSBuYW1lZCBtZXRob2Qgd2l0aCB1bmtub3duCi0JICogcGFyYW1hdGVycyBvbiBhbiBvYmplY3QKLQkgKi8KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlPYmplY3QgaGFuZGxlciA9IGdldEFjdGlvbkhhbmRsZXIoYWN0aW9uKTsKLQkJCVNpbXBsZUpTRFRBY3Rpb25Qcm94eS5leGVjdXRlTWV0aG9kKGhhbmRsZXIsICJydW4iLCBnZXRSdW5BcmdUeXBlcygpLCBnZXRSdW5BcmdzKGFjdGlvbikpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQljdXJyZW50U2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlpZih0YXJnZXRXb3JrYmVuY2hQYXJ0PT1udWxsKSByZXR1cm47Ci0JCQotCQl0cnkgewotCQkJT2JqZWN0IGhhbmRsZXIgPSBnZXRBY3Rpb25IYW5kbGVyKGFjdGlvbik7Ci0JCQlTaW1wbGVKU0RUQWN0aW9uUHJveHkuZXhlY3V0ZU1ldGhvZChoYW5kbGVyLCAic2VsZWN0aW9uQ2hhbmdlZCIsIGdldFNlbGVjdGlvbkNoYW5nZUFyZ1R5cGVzKCksIGdldFNlbGVjdGlvbkNoYW5nZUFyZ3MoYWN0aW9uLCBzZWxlY3Rpb24pKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJdGhpcy50YXJnZXRXb3JrYmVuY2hQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMuY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvU291cmNlQWN0aW9uc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1NvdXJjZUFjdGlvbnNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU4MTVlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvU291cmNlQWN0aW9uc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgY2hpbGRzYgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTb3VyY2VBY3Rpb25zQWN0aW9uIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCi0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMWQ5YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL1N0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmUuSUphdmFXZWJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZS5Kc0pmYWNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEFQUEVORF9ORVdfTElORVNfVE9fQ09QWSA9IHRydWU7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWSA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuY29weSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDVVQgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmN1dCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEUgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmRlbGV0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIE5FV19MSU5FID0gJ1xuJzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNURV9BRlRFUiA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkucGFzdGUuYWZ0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTVEVfQkVGT1JFID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5wYXN0ZS5iZWZvcmUiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvcHkoSUFjdGlvbiBhY3Rpb24pIHsKLQkJSnNKZmFjZU5vZGVbXSBub2RlcyA9IHBhcnNlU2VsZWN0aW9uKCk7Ci0JCWlmIChub2RlcyA9PSBudWxsIHx8IG5vZGVzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG51bGw7Ci0JCVN0cmluZ0J1ZmZlciB0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAoU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLkFQUEVORF9ORVdfTElORVNfVE9fQ09QWSkgewotCQkJdGV4dC5hcHBlbmQoU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLk5FV19MSU5FKTsKLQkJfQotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewotCQkJCUpzSmZhY2VOb2RlIGN1cnJlbnROb2RlID0gbm9kZXNbaV07Ci0JCQkJaW50IHN0YXJ0ID0gY3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgbGVuZ3RoID0gY3VycmVudE5vZGUuZ2V0TGVuZ3RoKCk7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBjdXJyZW50Tm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgZWxlbWVudFRleHQgPSBkb2MuZ2V0KHN0YXJ0LCBsZW5ndGgpOwotCQkJCQl0ZXh0LmFwcGVuZChlbGVtZW50VGV4dCk7Ci0JCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJaWYgKFN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi5BUFBFTkRfTkVXX0xJTkVTX1RPX0NPUFkpIHsKLQkJCQkJdGV4dC5hcHBlbmQoU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLk5FV19MSU5FKTsKLQkJCQl9Ci0JCQkJY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZChEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCQkJY2xpcGJvYXJkLnNldENvbnRlbnRzKG5ldyBPYmplY3RbXSB7IHRleHQudG9TdHJpbmcoKSB9LCBuZXcgVHJhbnNmZXJbXSB7IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0pOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGNsaXBib2FyZCAhPSBudWxsKSB7Ci0JCQkJY2xpcGJvYXJkLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGVsZXRlKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUpzSmZhY2VOb2RlW10gbm9kZXMgPSBwYXJzZVNlbGVjdGlvbigpOwotCQlpZiAobm9kZXMgPT0gbnVsbCB8fCBub2Rlcy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgbGFzdERvYyA9IG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnQgc3RhcnQ7Ci0JCQlpbnQgbGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewotCQkJCUpzSmZhY2VOb2RlIGN1cnJlbnROb2RlID0gbm9kZXNbaV07Ci0JCQkJc3RhcnQgPSBjdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJCWxlbmd0aCA9IGN1cnJlbnROb2RlLmdldExlbmd0aCgpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gY3VycmVudE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJaWYgKGRvYyAhPSBsYXN0RG9jKSB7Ci0JCQkJCWxhc3REb2MgPSBkb2M7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQltb2RlbC5lbmRSZWNvcmRpbmcoYWN0aW9uKTsKLQkJCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJCX0KLQkJCQkJaWYgKG1vZGVsTWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCQltb2RlbCA9IG1vZGVsTWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2MpOwotCQkJCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQkJCQltb2RlbC5iZWdpblJlY29yZGluZyhhY3Rpb24sICJEZWxldGUgSmF2YVNjcmlwdCBFbGVtZW50IiwgIkRlbGV0ZSBKYXZhU2NyaXB0IEVsZW1lbnQiKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlkb2MucmVwbGFjZVRleHQoYWN0aW9uLCBzdGFydCwgbGVuZ3RoLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCW1vZGVsLmVuZFJlY29yZGluZyhhY3Rpb24pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VzLmdldFN0cmluZygiU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjgiKSArIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgSnNKZmFjZU5vZGVbXSBwYXJzZVNlbGVjdGlvbigpIHsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IEpzSmZhY2VOb2RlWzBdOwotCQl9Ci0JCUFycmF5TGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJdGVyYXRvciBpdHQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXR0Lmhhc05leHQoKSkgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXR0Lm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFXZWJOb2RlKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gKEpzSmZhY2VOb2RlW10pIGVsZW1lbnRzLnRvQXJyYXkobmV3IEpzSmZhY2VOb2RlW2VsZW1lbnRzLnNpemUoKV0pOwotCQl9Ci0JCXJldHVybiBuZXcgSnNKZmFjZU5vZGVbMF07Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwYXN0ZShJQWN0aW9uIGFjdGlvbiwgYm9vbGVhbiBhdEVuZCkgewotCQlKc0pmYWNlTm9kZVtdIG5vZGVzID0gcGFyc2VTZWxlY3Rpb24oKTsKLQkJaWYgKG5vZGVzID09IG51bGwgfHwgbm9kZXMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmdCdWZmZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IHN0YXJ0T2ZQYXN0ZSA9IC0xOwotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IG51bGw7Ci0JCS8qIEZpZ3VyZSBvdXQgd2hlcmUgdG8gcGFzdGUgdGhlIGNvbnRlbnQgKi8KLQkJaWYgKGF0RW5kKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKChub2Rlc1tpXS5nZXRTdGFydE9mZnNldCgpICsgbm9kZXNbaV0uZ2V0TGVuZ3RoKCkpID4gc3RhcnRPZlBhc3RlKSB7Ci0JCQkJCXN0YXJ0T2ZQYXN0ZSA9IChub2Rlc1tpXS5nZXRTdGFydE9mZnNldCgpICsgbm9kZXNbaV0uZ2V0TGVuZ3RoKCkpOwotCQkJCQlkb2MgPSBub2Rlc1tpXS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKChub2Rlc1tpXS5nZXRTdGFydE9mZnNldCgpIDwgc3RhcnRPZlBhc3RlIHx8IHN0YXJ0T2ZQYXN0ZSA8IDApKSB7Ci0JCQkJCXN0YXJ0T2ZQYXN0ZSA9IG5vZGVzW2ldLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWRvYyA9IG5vZGVzW2ldLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlDbGlwYm9hcmQgY2xpcGJvYXJkID0gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQkJU3RyaW5nIHBhc3RlU3RyaW5nID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpKTsKLQkJCW1vZGVsID0gbW9kZWxNYW5hZ2VyLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvYyk7Ci0JCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKGFjdGlvbiwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJTdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uOSIpICsgKGF0RW5kID8gTWVzc2FnZXMuZ2V0U3RyaW5nKCJTdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uMTAiKSA6IE1lc3NhZ2VzLmdldFN0cmluZygiU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjExIikpICsgTWVzc2FnZXMuZ2V0U3RyaW5nKCJTdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uMTIiKSwgTWVzc2FnZXMuZ2V0U3RyaW5nKCJTdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uMTMiKSArIChhdEVuZCA/IE1lc3NhZ2VzLmdldFN0cmluZygiU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjE0IikgOiBNZXNzYWdlcy5nZXRTdHJpbmcoIlN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi4xNSIpKSArIE1lc3NhZ2VzLmdldFN0cmluZygiU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjE2IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCWRvYy5yZXBsYWNlVGV4dChhY3Rpb24sIHN0YXJ0T2ZQYXN0ZSwgMCwgcGFzdGVTdHJpbmcpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGNsaXBib2FyZCAhPSBudWxsKSB7Ci0JCQkJY2xpcGJvYXJkLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwuZW5kUmVjb3JkaW5nKGFjdGlvbik7Ci0JCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uLmdldElkKCkuZXF1YWxzKFN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi5DVVQpKSB7Ci0JCQljb3B5KGFjdGlvbik7Ci0JCQlkZWxldGUoYWN0aW9uKTsKLQkJfSBlbHNlIGlmIChhY3Rpb24uZ2V0SWQoKS5lcXVhbHMoU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLkNPUFkpKSB7Ci0JCQljb3B5KGFjdGlvbik7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uLmdldElkKCkuZXF1YWxzKFN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi5QQVNURV9CRUZPUkUpKSB7Ci0JCQlwYXN0ZShhY3Rpb24sIGZhbHNlKTsKLQkJfSBlbHNlIGlmIChhY3Rpb24uZ2V0SWQoKS5lcXVhbHMoU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLlBBU1RFX0FGVEVSKSkgewotCQkJcGFzdGUoYWN0aW9uLCB0cnVlKTsKLQkJfSBlbHNlIGlmIChhY3Rpb24uZ2V0SWQoKS5lcXVhbHMoU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLkRFTEVURSkpIHsKLQkJCWRlbGV0ZShhY3Rpb24pOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7fQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9hY3Rpb25zL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg5Yjc2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2FjdGlvbnMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1TdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uOD1FcnJvciBpbiBTdGFuZGFyZCBFZGl0b3IgQWN0aW9uIDogCi1TdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uOT1JbnNlcnQgVGV4dCAKLVN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi4xMD1iZWZvcmUKLVN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi4xMT1hZnRlcgotU3RhbmRhcmRFZGl0b3JBY3Rpb25zQWN0aW9uLjEyPVwgYSBKYXZhU2NyaXB0IEVsZW1lbnQuCi1TdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uMTM9SW5zZXJ0IFRleHQgCi1TdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uMTQ9YmVmb3JlCi1TdGFuZGFyZEVkaXRvckFjdGlvbnNBY3Rpb24uMTU9YWZ0ZXIKLVN0YW5kYXJkRWRpdG9yQWN0aW9uc0FjdGlvbi4xNj1cIGEgSmF2YVNjcmlwdCBFbGVtZW50LgotU2ltcGxlSlNEVEFjdGlvblByb3h5LjA9RXhjZXB0aW9uIDogCi1TaG93SGlzdG9yeUFjdGlvbi4wPUVycm9yIE9wZW5pbmcgaW4gU2NyaXB0IFZpZXcKLVNob3dIaXN0b3J5QWN0aW9uLjE9RXJyb3Igd2hpbGUgZGlzcGxheWluZyBlbGVtZW50IGluIFNjcmlwdCBWaWV3OlxuCi1TaG93SW5OYXZpZ2F0b3JBY3Rpb24uMD1FcnJvciBPcGVuaW5nIGluIFNjcmlwdCBWaWV3Ci1TaG93SW5OYXZpZ2F0b3JBY3Rpb24uMT1FcnJvciB3aGlsZSBkaXNwbGF5aW5nIGVsZW1lbnQgaW4gU2NyaXB0IFZpZXc6XG4KLUFkZEphdmFEb2NTdHViQWN0aW9uLjA9SmF2YVNjcmlwdCBEb2MKLUFkZEphdmFEb2NTdHViQWN0aW9uLjE9RXJyb3Igd2hpbGUgYWRkaW5nIGNvbW1lbnQKLUFkZEphdmFEb2NTdHViT3BlcmF0aW9uLjA9R2VuZXJhdGUgSnNEb2MKLUFkZEphdmFEb2NTdHViT3BlcmF0aW9uLjE9R2VuZXJhdGUgSnNEb2MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvSUFjdGlvbkNvbnN0YW50c0pzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0lBY3Rpb25Db25zdGFudHNKcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDFhZjUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvSUFjdGlvbkNvbnN0YW50c0pzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbDsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFjdGlvbkNvbnN0YW50c0pzIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9NT1ZFX0VMRU1FTlQgPSAiTW92ZUVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfUkVOQU1FX0VMRU1FTlQgPSAiUmVuYW1lRWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvSUFjdGlvbkRlZmluaXRpb25JZHNKcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9JQWN0aW9uRGVmaW5pdGlvbklkc0pzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNjE2ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9JQWN0aW9uRGVmaW5pdGlvbklkc0pzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLmFjdGlvbnMuSUphdmFFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBY3Rpb25EZWZpbml0aW9uSWRzSnMgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1PVkVfRUxFTUVOVCA9IElKYXZhRWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5NT1ZFX0VMRU1FTlQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVOQU1FX0VMRU1FTlQgPSBJSmF2YUVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuUkVOQU1FX0VMRU1FTlQ7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0pTUFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0pTUFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYjVkMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9KU1BVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMgVGhlIGZvbGxvd2luZyBsaW5lIGlzIGEgc2FtcGxlIEpTUCBkb2N1bWVudC4gIFBsZWFzZSB0cmFuc2xhdGUgb25seSB0aGUgZm9sbG93aW5nIHBhcnRzOgotIyMgVXNlIGJlbG93IHRhZ3MgT05MWSBmb3IgSlNQIDEuMQotIyMgV2VsY29tZSEKLSMjIFVzZSBiZWxvdyB0YWdzIE9OTFkgZm9yIEpTUCAxLjIKLSMjIFdlbGNvbWUhCi1TYW1wbGVfSlNQX2RvYz08JUAgcGFnZSBcblx0bGFuZ3VhZ2U9XCJqYXZhXCIgXG5cdGNvbnRlbnRUeXBlPVwidGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTFcIlxuJT5cbjxqc3A6aW5jbHVkZSBmbHVzaD1cInRydWVcIiBwYWdlPVwidGl0bGVCYXIuanNwXCIvPlxuXG48JS0tIFVzZSBiZWxvdyB0YWdzIE9OTFkgZm9yIEpTUCAxLjEgLS0lPlxuPCVcblx0U3lzdGVtLm91dC5wcmludGxuKFwiV2VsY29tZSFcIik7XG4lPlxuPCUtLSBVc2UgYmVsb3cgdGFncyBPTkxZIGZvciBKU1AgMS4yIC0tJT5cbjxqc3A6c2NyaXB0bGV0PlxuXHRTeXN0ZW0ub3V0LnByaW50bG4oXCJXZWxjb21lIVwiKTtcbjwvanNwOnNjcmlwdGxldD4KLUpTUF9EZWxpbWl0ZXJzX1VJXz1KU1AgRGVsaW1pdGVycwotUmVmYWN0b3JfbGFiZWw9UmVmYWN0b3IKLVJlbmFtZUVsZW1lbnRfbGFiZWw9UmVuYW1lCi1Nb3ZlRWxlbWVudF9sYWJlbD1Nb3ZlCi1Nb3ZlRWxlbWVudFdpemFyZD1Nb3ZlIHRoZSBzZWxlY3RlZCBlbGVtZW50cwotIwotT0s9T0sKLUpTUF9jaGFuZ2VzPUpTUCBjaGFuZ2VzCi1BY3Rpb25Db250cmlidXRvckpTUF8wPVJlZmEmY3RvcgotSlNQUmVuYW1lRWxlbWVudEFjdGlvbl8wPUVkaXRvciBzZWxlY3Rpb24gZG9lcyBub3QgcmVzb2x2ZSB0byBhIHJlbmFtYWJsZSBKYXZhIGVsZW1lbnQKLUpTUE1vdmVFbGVtZW50QWN0aW9uXzA9RWRpdG9yIHNlbGVjdGlvbiBkb2VzIG5vdCByZXNvbHZlIHRvIG1vdmFibGUgSmF2YSBlbGVtZW50cwotQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8wPUpTUCBSZW5hbWUKLUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMT1pbiBmaWxlOiB7MH0gbGluZTogezF9Ci1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzI9TW92ZSBUeXBlICcnezB9JycgdG8gcGFja2FnZSAnJ3sxfScnCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzM9UmVuYW1lIE1ldGhvZCAnJ3swfScnIHRvICcnezF9JycKLUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfND1SZW5hbWUgVHlwZSAnJ3swfScnIHRvICcnezF9JycKLUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNT1SZW5hbWUgUGFja2FnZSAnJ3swfScnIHRvICcnezF9JycKLUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNj1KU1AgUmVuYW1lIENoYW5nZQotIwotX1VJX1dJWkFSRF9ORVdfVElUTEUgPSBOZXcgSmF2YVNlcnZlciBQYWdlCi1fVUlfV0laQVJEX05FV19IRUFESU5HID0gSmF2YVNlcnZlciBQYWdlCi1fVUlfV0laQVJEX05FV19ERVNDUklQVElPTiA9IENyZWF0ZSBhIG5ldyBKYXZhU2VydmVyIFBhZ2UuCi1fRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfSlNQID0gVGhlIGZpbGUgbmFtZSBtdXN0IGVuZCBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBleHRlbnNpb25zIHswfS4gCi1fV0FSTklOR19GSUxFX01VU1RfQkVfSU5TSURFX0pBVkFfUFJPSkVDVCA9IEphdmFTZXJ2ZXIgUGFnZXMgY3JlYXRlZCBpbiBwcm9qZWN0cyB0aGF0IGRvIG5vdCBzdXBwb3J0IEphdmEgbWlnaHQgbm90IHdvcmsgYXMgZXhwZWN0ZWQuIAotX1dBUk5JTkdfRk9MREVSX01VU1RfQkVfSU5TSURFX1dFQl9DT05URU5UID0gRmlsZXMgY3JlYXRlZCBvdXRzaWRlIG9mIHRoZSBXZWIgQ29udGVudCBmb2xkZXIgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4geW91ciBkZXBsb3llZCBXZWIgYXBwbGljYXRpb24uIAotUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzID0gVGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLU5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMD1TZWxlY3QgSlNQIFRlbXBsYXRlCi1OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzE9U2VsZWN0IGEgdGVtcGxhdGUgYXMgaW5pdGlhbCBjb250ZW50IGluIHRoZSBKU1AgcGFnZS4KLU5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMj1OYW1lCi1OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzM9RGVzY3JpcHRpb24KLU5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfND1Vc2UgSlNQIFRlbXBsYXRlCi1OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzU9UHJldmlldwotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV82PVRlbXBsYXRlcyBhcmUgJ05ldyBKU1AnIHRlbXBsYXRlcyBmb3VuZCBpbiB0aGUgPGE+SlNQIFRlbXBsYXRlczwvYT4gcHJlZmVyZW5jZSBwYWdlLgotIyBDb3BpZWQgZnJvbSBzc2UudWkKLUNsZWFudXBEb2N1bWVudF9sYWJlbD1DbGVhbnVwIERvY3VtZW50Li4uCi1DbGVhbnVwRG9jdW1lbnRfdG9vbHRpcD1DbGVhbnVwIERvY3VtZW50Ci1DbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb249Q2xlYW51cCBEb2N1bWVudAotVG9nZ2xlQ29tbWVudF9sYWJlbD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF90b29sdGlwPVRvZ2dsZSBDb21tZW50Ci1Ub2dnbGVDb21tZW50X2Rlc2NyaXB0aW9uPVRvZ2dsZSBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfbGFiZWw9QWRkIEJsb2NrIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF90b29sdGlwPUFkZCBCbG9jayBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb249QWRkIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF9sYWJlbD1SZW1vdmUgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXA9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbj1SZW1vdmUgQmxvY2sgQ29tbWVudAotRmluZE9jY3VycmVuY2VzX2xhYmVsPU9jY3VycmVuY2VzIGluIEZpbGUKLU9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMD17MH0gLSB7MX0gT2NjdXJyZW5jZXMgaW4gezJ9Ci1PY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzI9ZmlsZQotQ29udGVudF9Bc3Npc3Rfbm90X2F2YWlsYWJfVUlfPUNvbnRlbnQgQXNzaXN0IG5vdCBhdmFpbGFibGUgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24KLUphdmFfQ29udGVudF9Bc3Npc3RfaXNfbm90X1VJXz1KYXZhIENvbnRlbnQgQXNzaXN0IGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoZSBjdXJyZW50IGN1cnNvciBsb2NhdGlvbgotIwotT3ZlcnJpZGVfbWV0aG9kX2luPU92ZXJyaWRlIG1ldGhvZCBpbiAnCi1DcmVhdGluZ19maWxlc19lbmNvZGluZz1DcmVhdGluZyBmaWxlcyBlbmNvZGluZyBwcmVmZXJlbmNlCi0jCi1KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8wPUpTUCBTb3VyY2UgcHJlZmVyZW5jZXMgYXJlIGJhc2VkIG9uIHRoZSBjb250ZW50IHdpdGhpbiB0aGUgSlNQLgotSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMT1TZWUgPGE+Jyd7MH0nJzwvYT4gZm9yIEpTUCB3aXRoIEhUTUwgY29udGVudC4KLUpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzI9U2VlIDxhPicnezB9Jyc8L2E+IGZvciBKU1Agd2l0aCBYTUwgY29udGVudC4KLUpTUENvbG9yUGFnZV9qc3BfY29udGVudD1KU1AgQ29udGVudAotSlNQRmlsZXNQcmVmZXJlbmNlUGFnZV8wPVZhbGlkYXRpbmcgZmlsZXMKLUpTUEZpbGVzUHJlZmVyZW5jZVBhZ2VfMT1WYWxpZGF0ZSBKU1AgZnJhZ21lbnRzCi0jIEpTUCBGcmFnbWVudHMKLUpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMD1ub25lCi1KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzE9VGhlIHByb3BlcnRpZXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBwYWdlIGRpcmVjdGl2ZSB0aGF0IGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gSlNQIGZyYWdtZW50IGZpbGVzLiAgVGhlIHByb2plY3Qgc2V0dGluZyBpcyB1c2VkIGlmIHlvdSBzcGVjaWZ5ICJub25lLiIKLUpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMj1MYW5ndWFnZToKLUpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMz1Db250ZW50IFR5cGU6Ci1KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzQ9RW5hYmxlIHNwZWNpZmljIHNldHRpbmc6Ci1Qcm9qZWN0SlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wPVRoZSBwcm9wZXJ0aWVzIGZvciBKMkVFIFdlYiBwcm9qZWN0cyBhY3QgYXMgInByb2plY3QiIGRlZmF1bHQgdG8gYmUgbG9va2VkIHVwIHdoZW4gbm8gcHJvcGVydGllcyBhcmUgc3BlY2lmaWVkIGZvciBhIHBhcnRpY3VsYXIgSlNQIGZyYWdtZW50IGZpbGUuCi0jIENTUyBKU1AKLVRpdGxlX0ludmFsaWRWYWx1ZT1JbnZhbGlkIFZhbHVlCi1NZXNzYWdlX0ludmFsaWRWYWx1ZT1JbnZhbGlkIHByb3BlcnR5IHZhbHVlLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9Kc1VJTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvSnNVSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZDljZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9Kc1VJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAKLSAqLwotcHVibGljIGNsYXNzIEpzVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0pTUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19ERVNDUklQVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19IRUFESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfTkVXX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9XQVJOSU5HX0ZJTEVfTVVTVF9CRV9JTlNJREVfSkFWQV9QUk9KRUNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9XQVJOSU5HX0ZPTERFUl9NVVNUX0JFX0lOU0lERV9XRUJfQ09OVEVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpb25Db250cmlidXRvckpTUF8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbjsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfdG9vbHRpcDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl82OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRfQXNzaXN0X25vdF9hdmFpbGFiX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGluZ19maWxlc19lbmNvZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaW5kT2NjdXJyZW5jZXNfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZSZXNvdXJjZUJ1bmRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXZhX0NvbnRlbnRfQXNzaXN0X2lzX25vdF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQX2NoYW5nZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQX0RlbGltaXRlcnNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUENvbG9yUGFnZV9qc3BfY29udGVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZpbGVzUHJlZmVyZW5jZVBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGaWxlc1ByZWZlcmVuY2VQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQTW92ZUVsZW1lbnRBY3Rpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BSZW5hbWVFbGVtZW50QWN0aW9uXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWVzc2FnZV9JbnZhbGlkVmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW92ZUVsZW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVFbGVtZW50V2l6YXJkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9LOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE92ZXJyaWRlX21ldGhvZF9pbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0SlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlZmFjdG9yX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbjsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lRWxlbWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhbXBsZV9KU1BfZG9jOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRpdGxlX0ludmFsaWRWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X2Rlc2NyaXB0aW9uOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X3Rvb2x0aXA7IC8vIHJlc291cmNlIGJ1bmRsZQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEpzVUlNZXNzYWdlcy5CVU5ETEVfTkFNRSwgSnNVSU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChKc1VJTWVzc2FnZXMuZlJlc291cmNlQnVuZGxlID09IG51bGwpIHsKLQkJCQlKc1VJTWVzc2FnZXMuZlJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEpzVUlNZXNzYWdlcy5CVU5ETEVfTkFNRSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlKc1VJTWVzc2FnZXMuZlJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gSnNVSU1lc3NhZ2VzLmZSZXNvdXJjZUJ1bmRsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0pzVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvSnNVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzc2YzkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvSnNVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLkphdmFTY3JpcHRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSnNVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIEpzVUlQbHVnaW4gaW5zdGFuY2UgPSBudWxsOwotCQotCXB1YmxpYyBzdGF0aWMgSnNVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gSnNVSVBsdWdpbi5pbnN0YW5jZTsKLQl9Ci0JCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSnNVSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIEpzVUlQbHVnaW4uaW5zdGFuY2U7Ci0JfQotCS8qKgotCSAqIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBqc3AgZWRpdG9yLgotCSAqLwotCXByaXZhdGUgQ29udGV4dFR5cGVSZWdpc3RyeSBmQ29udGV4dFR5cGVSZWdpc3RyeTsKLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBqc3AgZWRpdG9yLgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQkKLQlwdWJsaWMgSnNVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJSnNVSVBsdWdpbi5pbnN0YW5jZSA9IHRoaXM7Ci0JfQotCQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5IGdldEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBqc3AgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGpzcCBwbHVnaW4KLQkgKi8KLQlwdWJsaWMgQ29udGV4dFR5cGVSZWdpc3RyeSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpIHsKLQkJaWYgKGZDb250ZXh0VHlwZVJlZ2lzdHJ5ID09IG51bGwpIHsKLS8vIENvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcKLS8vIENvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkoKTsKLS8vIHJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuQUxMKTsKLS8vIHJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuTkVXKTsKLS8vIHJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuVEFHKTsKLS8vIHJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuQVRUUklCVVRFKTsKLS8vIHJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuQVRUUklCVVRFX1ZBTFVFKTsKLQkJCWZDb250ZXh0VHlwZVJlZ2lzdHJ5ID0gSmF2YVNjcmlwdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29kZVRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGZDb250ZXh0VHlwZVJlZ2lzdHJ5OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIGpzcCBlZGl0b3IgdGVtcGxhdGVzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUganNwIGVkaXRvciB0ZW1wbGF0ZXMKLQkgKi8KLQlwdWJsaWMgVGVtcGxhdGVTdG9yZSBnZXRUZW1wbGF0ZVN0b3JlKCkgewotCQlpZiAoZlRlbXBsYXRlU3RvcmUgPT0gbnVsbCkgewotLy8gZlRlbXBsYXRlU3RvcmUgPSBuZXcgQ29udHJpYnV0aW9uVGVtcGxhdGVTdG9yZSgKLS8vIGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCksIGdldFByZWZlcmVuY2VTdG9yZSgpLAotLy8gSlNQVUlQcmVmZXJlbmNlTmFtZXMuVEVNUExBVEVTX0tFWSk7Ci0JCQlKYXZhU2NyaXB0UGx1Z2luIGpwID0gSmF2YVNjcmlwdFBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCQlmVGVtcGxhdGVTdG9yZSA9IGpwLmdldFRlbXBsYXRlU3RvcmUoKTsKLQkJCXRyeSB7Ci0JCQkJZlRlbXBsYXRlU3RvcmUubG9hZCgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZUZW1wbGF0ZVN0b3JlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzljNzUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIExvZ2dlci5FUlJPUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIExvZ2dlci5JTkZPOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgTG9nZ2VyLk9LOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBMb2dnZXIuV0FSTklORzsKLQkKLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBMb2dnZXIuT0tfREVCVUcgfHwgbGV2ZWwgPT0gTG9nZ2VyLklORk9fREVCVUcgfHwgbGV2ZWwgPT0gTG9nZ2VyLldBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gTG9nZ2VyLkVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIUxvZ2dlci5pc0RlYnVnZ2luZygpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWludCBzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JCXN3aXRjaCAobGV2ZWwpIHsKLQkJCWNhc2UgSU5GT19ERUJVRzoKLQkJCWNhc2UgSU5GTzoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCWJyZWFrOwotCQkJY2FzZSBXQVJOSU5HX0RFQlVHOgotCQkJY2FzZSBXQVJOSU5HOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJYnJlYWs7Ci0JCQljYXNlIEVSUk9SX0RFQlVHOgotCQkJY2FzZSBFUlJPUjoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgTG9nZ2VyLlBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoTG9nZ2VyLlBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoTG9nZ2VyLmlzVHJhY2luZyhjYXRlZ29yeSkpIHsKLQkJCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIExvZ2dlci5QTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKExvZ2dlci5QTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBpcyBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQkKLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGN1cnJlbnRseSB0cmFjaW5nIGEgY2F0ZWdvcnkKLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdHJhY2luZyBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2luZyhTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKCFMb2dnZXIuaXNEZWJ1Z2dpbmcoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKExvZ2dlci5QTFVHSU5fSUQgKyBMb2dnZXIuVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlMb2dnZXIuX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlMb2dnZXIuX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlMb2dnZXIuX2xvZyhMb2dnZXIuRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlMb2dnZXIuX2xvZyhMb2dnZXIuRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCUxvZ2dlci5fdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlMb2dnZXIuX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCUxvZ2dlci5fdHJhY2UoY2F0ZWdvcnksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9hdXRvZWRpdC9BdXRvRWRpdFN0cmF0ZWd5Rm9ySnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvckpzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YzE5ZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9hdXRvZWRpdC9BdXRvRWRpdFN0cmF0ZWd5Rm9ySnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmF1dG9lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS50ZXh0LmphdmEuSmF2YUF1dG9JbmRlbnRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC51aS50ZXh0LmphdmEuU21hcnRTZW1pY29sb25BdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLnRleHQuamF2YWRvYy5KYXZhRG9jQXV0b0luZGVudFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEF1dG9FZGl0U3RyYXRlZ3lGb3JKcyBpbXBsZW1lbnRzIElBdXRvRWRpdFN0cmF0ZWd5IHsKLQlwcml2YXRlIElBdXRvRWRpdFN0cmF0ZWd5W10gZlN0cmF0ZWdpZXM7Ci0JCi0JcHVibGljIEF1dG9FZGl0U3RyYXRlZ3lGb3JKcygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY3VzdG9taXplRG9jdW1lbnRDb21tYW5kKElEb2N1bWVudCBkb2N1bWVudCwgRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJSUF1dG9FZGl0U3RyYXRlZ3lbXSBzdHJhdHMgPSBnZXRBdXRvRWRpdFN0cmF0ZWdpZXMoZG9jdW1lbnQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0cmF0cy5sZW5ndGg7IGkrKykgewotCQkJc3RyYXRzW2ldLmN1c3RvbWl6ZURvY3VtZW50Q29tbWFuZChkb2N1bWVudCwgY29tbWFuZCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElBdXRvRWRpdFN0cmF0ZWd5W10gZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZlN0cmF0ZWdpZXMgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZTdHJhdGVnaWVzOwotCQl9Ci0JCVN0cmluZyBwYXJ0aXRpb25pbmcgPSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUOwotCQlmU3RyYXRlZ2llcyA9IG5ldyBJQXV0b0VkaXRTdHJhdGVneVtdIHsgbmV3IEphdmFEb2NBdXRvSW5kZW50U3RyYXRlZ3kocGFydGl0aW9uaW5nKSwgbmV3IFNtYXJ0U2VtaWNvbG9uQXV0b0VkaXRTdHJhdGVneShwYXJ0aXRpb25pbmcpLAotCQkJCW5ldyBKYXZhQXV0b0luZGVudFN0cmF0ZWd5KHBhcnRpdGlvbmluZywgZ2V0SmF2YVByb2plY3QoZG9jdW1lbnQpKSB9OwotCQkvKiBuZXcgQXV0b0VkaXRTdHJhdGVneUZvclRhYnMoKSAqLwotCQlyZXR1cm4gZlN0cmF0ZWdpZXM7Ci0JfQotCQotCXByaXZhdGUgSUphdmFTY3JpcHRQcm9qZWN0IGdldEphdmFQcm9qZWN0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlJRE9NTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJSmF2YVNjcmlwdFByb2plY3QgamF2YVByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCVN0cmluZyBiYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJSVBhdGggZmlsZVBhdGggPSBuZXcgUGF0aChiYXNlTG9jYXRpb24pOwotCQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCQlpZiAoZmlsZVBhdGguc2VnbWVudENvdW50KCkgPiAwKSB7Ci0JCQkJcHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChmaWxlUGF0aC5zZWdtZW50KDApKTsKLQkJCX0KLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlqYXZhUHJvamVjdCA9IEphdmFTY3JpcHRDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGphdmFQcm9qZWN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvclRhYnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvclRhYnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhYjQ0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuYXV0b2VkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkNvbmZpZ3VyYWJsZUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JTGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBBdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicyBpbXBsZW1lbnRzIElBdXRvRWRpdFN0cmF0ZWd5IHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBUQUJfQ0hBUkFDVEVSID0gIlx0IjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyB2b2lkIGN1c3RvbWl6ZURvY3VtZW50Q29tbWFuZChJRG9jdW1lbnQgZG9jdW1lbnQsIERvY3VtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0JCS8vIGlmIG5vdCBpbiBzbWFydCBpbnNlcnQgbW9kZSBqdXN0IGlnbm9yZQotCQlpZiAoIWlzU21hcnRJbnNlcnRNb2RlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBzcGFjZXMgZm9yIHRhYiBjaGFyYWN0ZXIKLQkJaWYgKGNvbW1hbmQubGVuZ3RoID09IDAgJiYgY29tbWFuZC50ZXh0ICE9IG51bGwgJiYgY29tbWFuZC50ZXh0Lmxlbmd0aCgpID4gMCAmJiBjb21tYW5kLnRleHQuaW5kZXhPZihUQUJfQ0hBUkFDVEVSKSAhPSAtMSkgewotCQkJc21hcnRJbnNlcnRGb3JUYWIoY29tbWFuZCwgZG9jdW1lbnQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgaW5kZW50YXRpb24gd2lkdGggaWYgdXNpbmcgc3BhY2VzIGZvciBpbmRlbnRhdGlvbiwgLTEgb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGdldEluZGVudGF0aW9uV2lkdGgoKSB7Ci0JCWludCB3aWR0aCA9IC0xOwotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpZiAoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0UuZXF1YWxzKHByZWZlcmVuY2VzLmdldFN0cmluZyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKSkpIHsKLQkJCXdpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCQl9Ci0JCXJldHVybiB3aWR0aDsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsY3VsYXRlIG51bWJlciBvZiBzcGFjZXMgZm9yIG5leHQgdGFiIHN0b3AKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRJbmRlbnRTdHJpbmcoaW50IGluZGVudGF0aW9uV2lkdGgsIGludCBsaW5lT2Zmc2V0LCBJTGluZVRyYWNrZXIgbGluZVRyYWNrZXIsIGludCBpbmRleCkgewotCQlpbnQgaW5kZW50U2l6ZSA9IGluZGVudGF0aW9uV2lkdGg7Ci0JCWludCBvZmZzZXRJbkxpbmUgPSAtMTsKLQkJaWYgKGxpbmVUcmFja2VyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSVJlZ2lvbiBsaW5lSW5mbyA9IGxpbmVUcmFja2VyLmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGluZGV4KTsKLQkJCQlpZiAobGluZUluZm8uZ2V0T2Zmc2V0KCkgPT0gMCAmJiBsaW5lT2Zmc2V0ID4gLTEpIHsKLQkJCQkJb2Zmc2V0SW5MaW5lID0gbGluZU9mZnNldCArIGluZGV4OwotCQkJCX0gZWxzZSB7Ci0JCQkJCW9mZnNldEluTGluZSA9IGluZGV4IC0gbGluZUluZm8uZ2V0T2Zmc2V0KCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChsaW5lT2Zmc2V0ID4gLTEpIHsKLQkJCQlvZmZzZXRJbkxpbmUgPSBsaW5lT2Zmc2V0ICsgaW5kZXg7Ci0JCQl9Ci0JCX0KLQkJaWYgKG9mZnNldEluTGluZSA+IC0xICYmIGluZGVudGF0aW9uV2lkdGggPiAwKSB7Ci0JCQlpbnQgcmVtYWluZGVyID0gb2Zmc2V0SW5MaW5lICUgaW5kZW50YXRpb25XaWR0aDsKLQkJCWluZGVudFNpemUgPSBpbmRlbnRhdGlvbldpZHRoIC0gcmVtYWluZGVyOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50U2l6ZTsgaSsrKSB7Ci0JCQlpbmRlbnQuYXBwZW5kKCcgJyk7Ci0JCX0KLQkJcmV0dXJuIGluZGVudC50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdXAgYSBsaW5lIHRyYWNrZXIgZm9yIHRleHQgd2l0aGluIGNvbW1hbmQgaWYgdGV4dCBpcyBtdWx0aS1saW5lCi0JICovCi0JcHJpdmF0ZSBJTGluZVRyYWNrZXIgZ2V0TGluZVRyYWNrZXIoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgb3JpZ2luYWxUZXh0KSB7Ci0JCUNvbmZpZ3VyYWJsZUxpbmVUcmFja2VyIGxpbmVUcmFja2VyID0gbnVsbDsKLQkJaW50W10gZGVsaW1zID0gVGV4dFV0aWxpdGllcy5pbmRleE9mKGRvY3VtZW50LmdldExlZ2FsTGluZURlbGltaXRlcnMoKSwgb3JpZ2luYWxUZXh0LCAwKTsKLQkJaWYgKGRlbGltc1swXSAhPSAtMSB8fCBkZWxpbXNbMV0gIT0gLTEpIHsKLQkJCWxpbmVUcmFja2VyID0gbmV3IENvbmZpZ3VyYWJsZUxpbmVUcmFja2VyKGRvY3VtZW50LmdldExlZ2FsTGluZURlbGltaXRlcnMoKSk7Ci0JCQlsaW5lVHJhY2tlci5zZXQob3JpZ2luYWxUZXh0KTsKLQkJfQotCQlyZXR1cm4gbGluZVRyYWNrZXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGFjdGl2ZSBlZGl0b3IgaXMgaW4gc21hcnQgaW5zZXJ0IG1vZGUsIGZhbHNlIG90aGVyd2lzZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNTbWFydEluc2VydE1vZGUoKSB7Ci0JCWJvb2xlYW4gaXNTbWFydEluc2VydE1vZGUgPSBmYWxzZTsKLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IG51bGw7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvcjsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvci5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBjaGVjayBpZiBzbWFydCBpbnNlcnQgbW9kZQotCQlpZiAodGV4dEVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yRXh0ZW5zaW9uMyAmJiAoKElUZXh0RWRpdG9yRXh0ZW5zaW9uMykgdGV4dEVkaXRvcikuZ2V0SW5zZXJ0TW9kZSgpID09IElUZXh0RWRpdG9yRXh0ZW5zaW9uMy5TTUFSVF9JTlNFUlQpIHsKLQkJCWlzU21hcnRJbnNlcnRNb2RlID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gaXNTbWFydEluc2VydE1vZGU7Ci0JfQotCQotCS8qKgotCSAqIEluc2VydCBzcGFjZXMgZm9yIHRhYnMKLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqLwotCXByaXZhdGUgdm9pZCBzbWFydEluc2VydEZvclRhYihEb2N1bWVudENvbW1hbmQgY29tbWFuZCwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIHRhYiBrZXkgd2FzIHByZXNzZWQuIG5vdyBjaGVjayBwcmVmZXJlbmNlcyB0byBzZWUgaWYgbmVlZCB0byBpbnNlcnQKLQkJLy8gc3BhY2VzIGluc3RlYWQgb2YgdGFiCi0JCWludCBpbmRlbnRhdGlvbldpZHRoID0gZ2V0SW5kZW50YXRpb25XaWR0aCgpOwotCQlpZiAoaW5kZW50YXRpb25XaWR0aCA+IC0xKSB7Ci0JCQlTdHJpbmcgb3JpZ2luYWxUZXh0ID0gY29tbWFuZC50ZXh0OwotCQkJU3RyaW5nQnVmZmVyIG5ld1RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKG9yaWdpbmFsVGV4dCk7Ci0JCQkvLyBkZXRlcm1pbmUgd2hlcmUgaW4gbGluZSB0aGlzIGNvbW1hbmQgYmVnaW5zCi0JCQlpbnQgbGluZU9mZnNldCA9IC0xOwotCQkJdHJ5IHsKLQkJCQlJUmVnaW9uIGxpbmVJbmZvID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoY29tbWFuZC5vZmZzZXQpOwotCQkJCWxpbmVPZmZzZXQgPSBjb21tYW5kLm9mZnNldCAtIGxpbmVJbmZvLmdldE9mZnNldCgpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJCUlMaW5lVHJhY2tlciBsaW5lVHJhY2tlciA9IGdldExpbmVUcmFja2VyKGRvY3VtZW50LCBvcmlnaW5hbFRleHQpOwotCQkJaW50IHN0YXJ0SW5kZXggPSAwOwotCQkJaW50IGluZGV4ID0gbmV3VGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIpOwotCQkJd2hpbGUgKGluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGluZGVudCA9IGdldEluZGVudFN0cmluZyhpbmRlbnRhdGlvbldpZHRoLCBsaW5lT2Zmc2V0LCBsaW5lVHJhY2tlciwgaW5kZXgpOwotCQkJCS8vIHJlcGxhY2UgXHQgY2hhcmFjdGVyIHdpdGggc3BhY2VzCi0JCQkJbmV3VGV4dC5yZXBsYWNlKGluZGV4LCBpbmRleCArIDEsIGluZGVudCk7Ci0JCQkJaWYgKGxpbmVUcmFja2VyICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWxpbmVUcmFja2VyLnJlcGxhY2UoaW5kZXgsIDEsIGluZGVudCk7Ci0JCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGggcmVwbGFjaW5nIHRleHQsIGp1c3QKLQkJCQkJCS8vIHJlc2V0IHRvIGN1cnJlbnQgc3RyaW5nCi0JCQkJCQlsaW5lVHJhY2tlci5zZXQobmV3VGV4dC50b1N0cmluZygpKTsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlzdGFydEluZGV4ID0gaW5kZXggKyBpbmRlbnQubGVuZ3RoKCk7Ci0JCQkJaW5kZXggPSBuZXdUZXh0LmluZGV4T2YoVEFCX0NIQVJBQ1RFUiwgc3RhcnRJbmRleCk7Ci0JCQl9Ci0JCQljb21tYW5kLnRleHQgPSBuZXdUZXh0LnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVENvbXBsZXRpb25Qcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRDb21wbGV0aW9uUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk2MzBiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVENvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLnRleHQuamF2YS5KYXZhQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLnRleHQuamF2YS5MYXp5SmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS50ZXh0LmphdmEuSUphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNEVENvbXBsZXRpb25Qcm9wb3NhbCBleHRlbmRzIEphdmFDb21wbGV0aW9uUHJvcG9zYWwgaW1wbGVtZW50cyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCB7Ci0JLyoKLQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0NDgzCi0JICogCi0JICogVGhpcyBpcyBhIHdyYXBwZWQgcHJvcG9zYWwgc28gd2UgZG9uJ3QgbmVlZCB0byBtYWtlICJzbG93IiBjYWxscyB0byB0aGUKLQkgKiBqYXZhIHByb3Bvc2FsIHVwIGZyb250LCBvbmx5IHdoZW4gbmVlZGVkIGZvciBleGFtcGxlLCBnZXRBZGRpdGlvbmFsSW5mbygpCi0JICogcmVhZHMgZXh0ZXJuYWwgamF2YWRvYywgYW5kIGl0IG1ha2VzIG5vIHNlbnNlCi0JICovCi0JSUNvbXBsZXRpb25Qcm9wb3NhbCBmSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCA9IG51bGw7Ci0JCi0JcHVibGljIEpTRFRDb21wbGV0aW9uUHJvcG9zYWwoU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nLCBpbnQgcmVwbGFjZW1lbnRPZmZzZXQsIGludCByZXBsYWNlbWVudExlbmd0aCwgaW50IGN1cnNvclBvc2l0aW9uLCBJbWFnZSBpbWFnZSwKLQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nLCBJQ29udGV4dEluZm9ybWF0aW9uIGNvbnRleHRJbmZvcm1hdGlvbiwgU3RyaW5nIGFkZGl0aW9uYWxQcm9wb3NhbEluZm8sIGludCByZWxldmFuY2UsCi0JCQlib29sZWFuIHVwZGF0ZVJlcGxhY2VtZW50TGVuZ3RoT25WYWxpZGF0ZSkgewotCQlzdXBlcihyZXBsYWNlbWVudFN0cmluZywgcmVwbGFjZW1lbnRPZmZzZXQsIHJlcGxhY2VtZW50TGVuZ3RoLCBpbWFnZSwgZGlzcGxheVN0cmluZywgcmVsZXZhbmNlKTsKLQkJc3VwZXIuc2V0Q3Vyc29yUG9zaXRpb24oY3Vyc29yUG9zaXRpb24pOwotCQlzdXBlci5zZXRDb250ZXh0SW5mb3JtYXRpb24oY29udGV4dEluZm9ybWF0aW9uKTsKLS8vIHN1cGVyKHJlcGxhY2VtZW50U3RyaW5nLCByZXBsYWNlbWVudE9mZnNldCwgcmVwbGFjZW1lbnRMZW5ndGgsCi0vLyBjdXJzb3JQb3NpdGlvbiwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIGNvbnRleHRJbmZvcm1hdGlvbiwKLS8vIGFkZGl0aW9uYWxQcm9wb3NhbEluZm8sIHJlbGV2YW5jZSwKLS8vIHVwZGF0ZVJlcGxhY2VtZW50TGVuZ3RoT25WYWxpZGF0ZSk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgY3Vyc29yIHBvc2l0aW9uIGFmdGVyIGFwcGx5aW5nLgotCSAqLwotCQotCXB1YmxpYyB2b2lkIGFwcGx5KElUZXh0Vmlld2VyIHZpZXdlciwgY2hhciB0cmlnZ2VyLCBpbnQgc3RhdGVNYXNrLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmICh0aGlzLmZKYXZhQ29tcGxldGlvblByb3Bvc2FsIGluc3RhbmNlb2YgTGF6eUphdmFDb21wbGV0aW9uUHJvcG9zYWwpCi0JCXsKLQkJCSgoTGF6eUphdmFDb21wbGV0aW9uUHJvcG9zYWwpdGhpcy5mSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCkuYXBwbHkodmlld2VyLmdldERvY3VtZW50KCksIHRyaWdnZXIsIG9mZnNldCk7Ci0JCX0KLQkJc3VwZXIuYXBwbHkodmlld2VyLCB0cmlnZ2VyLCBzdGF0ZU1hc2ssIG9mZnNldCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpIHsKLQkJU3RyaW5nIGFkZGl0aW9uYWxJbmZvID0gc3VwZXIuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpOwotCQlJQ29tcGxldGlvblByb3Bvc2FsIGphdmFQcm9wb3NhbCA9IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWwoKTsKLQkJaWYgKGphdmFQcm9wb3NhbCAhPSBudWxsKSB7Ci0JCQlhZGRpdGlvbmFsSW5mbyA9IGphdmFQcm9wb3NhbC5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0JCX0KLQkJcmV0dXJuIGFkZGl0aW9uYWxJbmZvOwotCX0KLQkKLQlmaW5hbCBwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbCBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FsKCkgewotCQlyZXR1cm4gZkphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci0JfQotCQotCWZpbmFsIHB1YmxpYyB2b2lkIHNldEphdmFDb21wbGV0aW9uUHJvcG9zYWwoSUNvbXBsZXRpb25Qcm9wb3NhbCBqYXZhQ29tcGxldGlvblByb3Bvc2FsKSB7Ci0JCWZKYXZhQ29tcGxldGlvblByb3Bvc2FsID0gamF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVENvbnRlbnRBc3Npc3RhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU0RUQ29udGVudEFzc2lzdGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzMzNThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU0RUQ29udGVudEFzc2lzdGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKU0RUQ29udGVudEFzc2lzdGFudCBleHRlbmRzIEFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBKU0RUQ29udGVudEFzc2lzdGFudFByb2Nlc3NvciBmQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQlwcml2YXRlIEpTRFRUZW1wbGF0ZUFzc2lzdFByb2Nlc3NvciBmVGVtcGxhdGVBc3Npc3RQcm9jZXNzb3I7Ci0JcHJpdmF0ZSBKc1RyYW5zbGF0aW9uQWRhcHRlciBmVHJhbnNsYXRpb25BZGFwdGVyOwotCXByaXZhdGUgSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yIGZIaHRtbGNvbXA7Ci0JCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCVZlY3RvciBwcm9wb3NhbHMgPSBuZXcgVmVjdG9yKCk7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wbGV0aW9uUHJvcG9zYWxzOwotCQlJQ29tcGxldGlvblByb3Bvc2FsIGVuZFNjcmlwdCA9IGdldEh0bWxDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkuZ2V0RW5kU2NyaXB0UHJvcG9zYWwodmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJaWYoZW5kU2NyaXB0IT1udWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbXSB7ZW5kU2NyaXB0fTsKLQkJCS8vcHJvcG9zYWxzLmFkZChlbmRTY3JpcHQpOwotCQl9Ci0JCUpTRFRQcm9wb3NhbENvbGxlY3RvciB0aGVDb2xsZWN0b3IgPSBnZXRQcm9wb3NhbENvbGxlY3Rvcih2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkvKiBhZGQgZW5kIHNjcmlwdCB0YWcgaWYgbmVlZGVkICovCi0KLQkJLyogLS0tLS0tLS0tIENvbnRlbnQgQXNzaXN0YW50IC0tLS0tLS0tLSAqLwotCQlnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkuc2V0UHJvcG9zYWxDb2xsZWN0b3IodGhlQ29sbGVjdG9yKTsKLQkJY29tcGxldGlvblByb3Bvc2FscyA9IGdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKS5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQlwcm9wb3NhbHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoY29tcGxldGlvblByb3Bvc2FscykpOwotCQkvKiBIVE1MIFByb3Bvc2FscyAqLwotCQljb21wbGV0aW9uUHJvcG9zYWxzID0gZ2V0SHRtbENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKS5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQlwcm9wb3NhbHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoY29tcGxldGlvblByb3Bvc2FscykpOwotCQkvKiAtLS0tLS0tLS0gdGVtcGxhdGUgY29tcGxldGlvbnMgLS0tLS0tLS0tICovCi0JCWdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpLnNldFByb3Bvc2FsQ29sbGVjdG9yKHRoZUNvbGxlY3Rvcik7Ci0JCWNvbXBsZXRpb25Qcm9wb3NhbHMgPSBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQlwcm9wb3NhbHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoY29tcGxldGlvblByb3Bvc2FscykpOwotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgcHJvcG9zYWxzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF0pOwotCX0KLQkKLQlwcml2YXRlIEpTRFRIdG1sQ29tcGxldGlvblByb2Nlc3NvciBnZXRIdG1sQ29udGVudEFzc2lzdFByb2Nlc3NvcigpIHsKLQkJaWYgKGZIaHRtbGNvbXAgPT0gbnVsbCkgewotCQkJZkhodG1sY29tcCA9IG5ldyBKU0RUSHRtbENvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQkJfQotCQlyZXR1cm4gZkhodG1sY29tcDsKLQl9Ci0JCi0JcHJpdmF0ZSBKU0RUQ29udGVudEFzc2lzdGFudFByb2Nlc3NvciBnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkgewotCQlpZiAoZkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJZkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPSBuZXcgSlNEVENvbnRlbnRBc3Npc3RhbnRQcm9jZXNzb3IoKTsKLQkJfQotCQlyZXR1cm4gZkNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci0JfQotCXByaXZhdGUgSUpzVHJhbnNsYXRpb24gZ2V0SlNQVHJhbnNsYXRpb24oSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCUlET01Nb2RlbCB4bWxNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQodmlld2VyLmdldERvY3VtZW50KCkpOwotCQkJSURPTURvY3VtZW50IHhtbERvYyA9IHhtbE1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZlRyYW5zbGF0aW9uQWRhcHRlciA9PSBudWxsKSB7Ci0JCQkJZlRyYW5zbGF0aW9uQWRhcHRlciA9IChKc1RyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpzVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJfQotCQkJaWYgKGZUcmFuc2xhdGlvbkFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCXJldHVybiBmVHJhbnNsYXRpb25BZGFwdGVyLmdldEpTUFRyYW5zbGF0aW9uKHRydWUpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBKU0RUUHJvcG9zYWxDb2xsZWN0b3IgZ2V0UHJvcG9zYWxDb2xsZWN0b3IoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCUlKc1RyYW5zbGF0aW9uIHRyYW4gPSBnZXRKU1BUcmFuc2xhdGlvbih2aWV3ZXIsIG9mZnNldCk7Ci0JCXJldHVybiBuZXcgSlNEVFByb3Bvc2FsQ29sbGVjdG9yKHRyYW4pOwotCX0KLQkKLQlwcml2YXRlIEpTRFRUZW1wbGF0ZUFzc2lzdFByb2Nlc3NvciBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChmVGVtcGxhdGVBc3Npc3RQcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJZlRlbXBsYXRlQXNzaXN0UHJvY2Vzc29yID0gbmV3IEpTRFRUZW1wbGF0ZUFzc2lzdFByb2Nlc3NvcigpOwotCQl9Ci0JCXJldHVybiBmVGVtcGxhdGVBc3Npc3RQcm9jZXNzb3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRDb250ZW50QXNzaXN0YW50UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVENvbnRlbnRBc3Npc3RhbnRQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhNzJkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVENvbnRlbnRBc3Npc3RhbnRQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFVuaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpTRFRDb250ZW50QXNzaXN0YW50UHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU0RUX0NPUkVfUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlL2RlYnVnL2pzcHRyYW5zbGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZFcnJvck1lc3NhZ2UgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgZkpzcFNvdXJjZVBvc2l0aW9uLCBmSmF2YVBvc2l0aW9uOwotCXByaXZhdGUgSlNEVFByb3Bvc2FsQ29sbGVjdG9yIGZQcm9wb3NhbENvbGxlY3RvcjsKLQlwcml2YXRlIEpzVHJhbnNsYXRpb25BZGFwdGVyIGZUcmFuc2xhdGlvbkFkYXB0ZXIgPSBudWxsOwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBmVmlld2VyID0gbnVsbDsKLQkKLQlwdWJsaWMgSlNEVENvbnRlbnRBc3Npc3RhbnRQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24KLQkgKiB3aXRoaW4gdGhlIGRvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uCi0JICogd2l0aGluIHRoZSB0ZXh0IHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdmlld2VyIHdob3NlIGRvY3VtZW50IGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgcHJvcG9zYWxzCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24KLQkgKiAgICAgICAgICAgIGFuIG9mZnNldCB3aXRoaW4gdGhlIGRvY3VtZW50IGZvciB3aGljaCBjb21wbGV0aW9ucyBzaG91bGQgYmUKLQkgKiAgICAgICAgICAgIGNvbXB1dGVkCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb21wbGV0aW9uIHByb3Bvc2FscyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwotCSAqICAgICAgICAgcHJvcG9zYWxzIGFyZSBwb3NzaWJsZQotCSAqLwotCQotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgcG9zKSB7Ci0JCWluaXRpYWxpemUocG9zKTsKLQkJSlNEVFByb3Bvc2FsQ29sbGVjdG9yIGNvbGxlY3RvciA9IG51bGw7Ci0JCUlET01Nb2RlbCB4bWxNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAodmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRWaWV3ZXIpIHsKLQkJCQlmVmlld2VyID0gKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXI7Ci0JCQl9Ci0JCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZlZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJaWYgKGZUcmFuc2xhdGlvbkFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCWZUcmFuc2xhdGlvbkFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCX0KLQkJCWlmIChmVHJhbnNsYXRpb25BZGFwdGVyICE9IG51bGwpIHsKLQkJCQlJSnNUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IGZUcmFuc2xhdGlvbkFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24odHJ1ZSk7Ci0JCQkJZkphdmFQb3NpdGlvbiA9IGdldERvY3VtZW50UG9zaXRpb24oKTsKLQkJCQl0cnkgewotCQkJCQlJSmF2YVNjcmlwdFVuaXQgY3UgPSB0cmFuc2xhdGlvbi5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCQkJLy8gY2FuJ3QgZ2V0IGphdmEgcHJvcG9zYWxzIHcvb3V0IGEgY29tcGlsYXRpb24gdW5pdAotCQkJCQkvLyBvciB3aXRob3V0IGEgdmFsaWQgcG9zaXRpb24KLQkJCQkJaWYgKGN1ID09IG51bGwgfHwgLTEgPT0gZkphdmFQb3NpdGlvbikgewotCQkJCQkJcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCQkJCQl9Ci0JCQkJCWNvbGxlY3RvciA9IGdldFByb3Bvc2FsQ29sbGVjdG9yKCk7Ci0JCQkJCXN5bmNocm9uaXplZCAoY3UpIHsKLQkJCQkJCWN1LmNvZGVDb21wbGV0ZShmSmF2YVBvc2l0aW9uLCBjb2xsZWN0b3IsIG51bGwpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjb3JlRXgpIHsKLQkJCQkJLy8gYSBwb3NzaWJsZSBKYXZhIE1vZGVsIEV4Y2VwdGlvbiBkdWUgdG8gbm90IGJlaW5nIGEgV2ViCi0JCQkJCS8vIChKYXZhKSBQcm9qZWN0Ci0JCQkJCWNvcmVFeC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCS8vIHRocm93IG91dCBleGNlcHRpb25zIG9uIGNvZGUgYXNzaXN0LgotCQl9IGZpbmFsbHkgewotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcmVzdWx0cyA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCQlpZiAoY29sbGVjdG9yICE9IG51bGwpIHsKLQkJCXJlc3VsdHMgPSBjb2xsZWN0b3IuZ2V0SlNQQ29tcGxldGlvblByb3Bvc2FscygpOwotCQkJaWYgKHJlc3VsdHMgPT0gbnVsbCB8fCByZXN1bHRzLmxlbmd0aCA8IDEpIHsKLQkJCQlmRXJyb3JNZXNzYWdlID0gSnNVSU1lc3NhZ2VzLkphdmFfQ29udGVudF9Bc3Npc3RfaXNfbm90X1VJXzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBwb3NzaWJsZSBjb250ZXh0cyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCi0JICogbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGN1cnNvcgotCSAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dCB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHZpZXdlciB3aG9zZSBkb2N1bWVudCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIHBvc3NpYmxlCi0JICogICAgICAgICAgICBjb250ZXh0cwotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICogICAgICAgICAgICBhbiBvZmZzZXQgd2l0aGluIHRoZSBkb2N1bWVudCBmb3Igd2hpY2ggY29udGV4dCBpbmZvcm1hdGlvbgotCSAqICAgICAgICAgICAgc2hvdWxkIGJlIGNvbXB1dGVkCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb250ZXh0IGluZm9ybWF0aW9uIG9iamVjdHMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgICAgICAgIG5vIGNvbnRleHQgY291bGQgYmUgZm91bmQKLQkgKi8KLQkKLQlwdWJsaWMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycyB3aGljaCB3aGVuIHByZXNzZWQgc2hvdWxkIGF1dG9tYXRpY2FsbHkKLQkgKiBkaXNwbGF5IGNvbnRlbnQtYXNzaXN0IHByb3Bvc2Fscy4KLQkgKiAKLQkgKiBAcmV0dXJuIHN0cmluZyBvZiBjaGFyYWN0ZXJzCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXV0b1Byb3Bvc2FsSW52b2NhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBwcmVzc2VkIHNob3VsZCBhdXRvbWF0aWNhbGx5Ci0JICogZGlzcGxheSBhIGNvbnRlbnQtYXNzaXN0IHRpcC4KLQkgKiAKLQkgKiBAcmV0dXJuIHN0cmluZyBvZiBjaGFyYWN0ZXJzCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXV0b1RpcEludm9jYXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hhcmFjdGVycyB3aGljaCB3aGVuIGVudGVyZWQgYnkgdGhlIHVzZXIgc2hvdWxkCi0JICogYXV0b21hdGljYWxseSB0cmlnZ2VyIHRoZSBwcmVzZW50YXRpb24gb2YgcG9zc2libGUgY29tcGxldGlvbnMuCi0JICogCi0JICogQHJldHVybiB0aGUgYXV0byBhY3RpdmF0aW9uIGNoYXJhY3RlcnMgZm9yIGNvbXBsZXRpb24gcHJvcG9zYWwgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGF1dG8gYWN0aXZhdGlvbiBpcyBkZXNpcmVkCi0JICovCi0JCi0JcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIHdoZW4gZW50ZXJlZCBieSB0aGUgdXNlciBzaG91bGQKLQkgKiBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgdGhlIHByZXNlbnRhdGlvbiBvZiBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBwcmVzZW50aW5nIGNvbnRleHQgaW5mb3JtYXRpb24KLQkgKiAgICAgICAgIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGF1dG8gYWN0aXZhdGlvbiBpcyBkZXNpcmVkCi0JICovCi0JCi0JcHVibGljIGNoYXJbXSBnZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgdmFsaWRhdG9yIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gZGlzcGxheWVkIGNvbnRleHQgaW5mb3JtYXRpb24KLQkgKiBzaG91bGQgYmUgZGlzbWlzc2VkLiBNYXkgb25seSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHByb2Nlc3NvcgotCSAqIGlzIGluY2FwYWJsZSBvZiBjb21wdXRpbmcgY29udGV4dCBpbmZvcm1hdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29udGV4dCBpbmZvcm1hdGlvbiB2YWxpZGF0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotCSAqICAgICAgICAgcHJvY2Vzc29yIGlzIGluY2FwYWJsZSBvZiBjb21wdXRpbmcgY29udGV4dCBpbmZvcm1hdGlvbgotCSAqLwotCQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgaW50IGdldERvY3VtZW50UG9zaXRpb24oKSB7Ci0JCXJldHVybiBmSnNwU291cmNlUG9zaXRpb247Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQkvLyBUT0RPOiBnZXQgYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZQotCQkvLyBpZiAoZkNvbGxlY3Rvci5nZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsICYmCi0JCS8vIGZDb2xsZWN0b3IuZ2V0RXJyb3JNZXNzYWdlKCkubGVuZ3RoKCkgPiAwKQotCQkvLyByZXR1cm4gZkNvbGxlY3Rvci5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJcmV0dXJuIGZFcnJvck1lc3NhZ2U7Ci0JfQotCQotCXByb3RlY3RlZCBKU0RUUHJvcG9zYWxDb2xsZWN0b3IgZ2V0UHJvcG9zYWxDb2xsZWN0b3IoKSB7Ci0JCXJldHVybiBmUHJvcG9zYWxDb2xsZWN0b3I7Ci0JCS8vIHJldHVybiBuZXcgSlNQUHJvcG9zYWxDb2xsZWN0b3IodHJhbnNsYXRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBjb2RlIGFzc2lzdCBwcm9jZXNzb3IuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShpbnQgcG9zKSB7Ci0JCWluaXRpYWxpemVKYXZhUGx1Z2lucygpOwotCQlmSnNwU291cmNlUG9zaXRpb24gPSBwb3M7Ci0JCWZFcnJvck1lc3NhZ2UgPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBKYXZhIFBsdWdpbnMgdGhhdCB0aGUgSlNQIHByb2Nlc3NvciByZXF1aXJlcy4gU2VlCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0Mzc2NSBXZSBzaG91bGQgbm90IGNhbGwKLQkgKiAic3RhcnQiLCBiZWNhdXNlIHRoYXQgd2lsbCBjYXVzZSB0aGF0IHN0YXRlIHRvIGJlIHJlbWVtYmVyZWQsIGFuZAotCSAqIHJlLXN0YXJ0ZWQgYXV0b21hdGljYWxseSBkdXJpbmcgdGhlIG5leHQgYm9vdCB1cCBzZXF1ZW5jZS4KLQkgKiAKLQkgKiBJU1NVRTogd2UgbWF5IGJlIGFibGUgdG8gZ2V0IHJpZCBvZiB0aGlzIGFsbCB0b2dldGhlciwgaW4gZnV0dXJlLCBzaW5jZQotCSAqIDk5JSB3ZSBwcm9iYWJseSBoYXZlIGFscmVhZHkgdXNlZCBzb21lIEpEVCBjbGFzcyBieSB0aGUgdGltZSB3ZSBuZWVkIEpEVAotCSAqIHRvIGJlIGFjdGl2ZSAuLi4gYnV0IC4uLiB0aGlzIGlzIHRoZSBzYWZlc3QgZml4IGZvciB0aGlzIHBvaW50IGluIDEuNQotCSAqIHN0cmVhbS4gTmV4dCByZWxlYXNlLCBsZXQncyBqdXN0IHJlbW92ZSB0aGlzLCByZS1kaXNjb3ZlciB3aGF0IGV2ZXIgYnVnCi0JICogdGhpcyB3YXMgZml4aW5nIChpZiBhbnkpIGFuZCBpZiB0aGVyZSBpcyBvbmUsIHRoZW4gd2UnbGwgZWl0aGVyIHB1dCBiYWNrCi0JICogaW4sIGFzIGlzLCBvciBjb21lIHVwIHdpdGggYSBtb3JlIGFwcHJvcHJpYXRlIGZpeC4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSmF2YVBsdWdpbnMoKSB7Ci0JCXRyeSB7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKEpTRFRDb250ZW50QXNzaXN0YW50UHJvY2Vzc29yLkpTRFRfQ09SRV9QTFVHSU5fSUQpOwotCQkJYnVuZGxlLmxvYWRDbGFzcygiZHVtbXlDbGFzc05hbWVUaGF0U2hvdWxkTmV2ZXJFeGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gdGhpcyBpcyB0aGUgZXhwZWN0ZWQgcmVzdWx0LCB3ZSBqdXN0IHdhbnQgdG8KLQkJCS8vIG51ZGdlIHRoZSBidW5kbGUgdG8gYmUgc3VyZSBpdHMgYWN0aXZhdGVkLgotCQl9Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWZUcmFuc2xhdGlvbkFkYXB0ZXIgPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9wb3NhbENvbGxlY3RvcihKU0RUUHJvcG9zYWxDb2xsZWN0b3IgdHJhbnNsYXRpb24pIHsKLQkJdGhpcy5mUHJvcG9zYWxDb2xsZWN0b3IgPSB0cmFuc2xhdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVENvbnRldEFzc2lzdEludm9jYXRpb25Db250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVENvbnRldEFzc2lzdEludm9jYXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NTQxMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRDb250ZXRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkudGV4dC5qYXZhLkphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKU0RUQ29udGV0QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgZXh0ZW5kcyBKYXZhQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0IHsKLQlwdWJsaWMgc3RhdGljIEpTRFRDb250ZXRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBnZXRJbnN0YW5jZShJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQsIEpTRFRQcm9wb3NhbENvbGxlY3RvciB0aGVDb2xsZWN0b3IpIHsKLQkJSUpzVHJhbnNsYXRpb24gdHJhbiA9IEpTRFRDb250ZXRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dC5nZXRKU1BUcmFuc2xhdGlvbih2aWV3ZXIpOwotCQlyZXR1cm4gbmV3IEpTRFRDb250ZXRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCh2aWV3ZXIsIG9mZnNldCwgdGhlQ29sbGVjdG9yKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSUpzVHJhbnNsYXRpb24gZ2V0SlNQVHJhbnNsYXRpb24oSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JCUlKc1RyYW5zbGF0aW9uIGZUcmFuc2xhdGlvbiA9IG51bGw7Ci0JCQotCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJSnNUcmFuc2xhdGlvbkFkYXB0ZXIgZlRyYW5zbGF0aW9uQWRhcHRlciA9IChKc1RyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpzVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJaWYgKGZUcmFuc2xhdGlvbkFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWZUcmFuc2xhdGlvbiA9IGZUcmFuc2xhdGlvbkFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24odHJ1ZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlRyYW5zbGF0aW9uOwotCX0KLQlJVGV4dFZpZXdlciB2aWV3ZXI7Ci0JCi0JcHJpdmF0ZSBKU0RUQ29udGV0QXNzaXN0SW52b2NhdGlvbkNvbnRleHQoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0LCBKU0RUUHJvcG9zYWxDb2xsZWN0b3IgdGhlQ29sbGVjdG9yKSB7Ci0JCXN1cGVyKHZpZXdlciwgb2Zmc2V0LCBudWxsKTsKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JCS8vIHRoaXMub2Zmc2V0PWdldEpTUFRyYW5zbGF0aW9uKCkuZ2V0SmF2YU9mZnNldChvZmZzZXQpOwotCQkvLyBDb21wbGV0aW9uUHJvcG9zYWxDb2xsZWN0b3IgdGhlQ29sbGVjdG9yID0gZ2V0UHJvcG9zYWxDb2xsZWN0b3IoKTsKLQkJc3VwZXIuc2V0Q29sbGVjdG9yKHRoZUNvbGxlY3Rvcik7Ci0JfQotCQotLy8gcHVibGljIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLS8vIHJldHVybgotLy8gKChKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbilnZXRKU1BUcmFuc2xhdGlvbih2aWV3ZXIpKS5nZXRKYXZhRG9jdW1lbnQoKTsKLS8vICAgICAgCi0vLyB9Ci0vLyBwcm90ZWN0ZWQgQ29tcGxldGlvblByb3Bvc2FsQ29sbGVjdG9yIGdldFByb3Bvc2FsQ29sbGVjdG9yKCkgewotLy8gICAgICAgCi0vLyByZXR1cm4gKChDb21wbGV0aW9uUHJvcG9zYWxDb2xsZWN0b3IpICggbmV3IEpTUFByb3Bvc2FsQ29sbGVjdG9yKAotLy8gZ2V0SlNQVHJhbnNsYXRpb24oKSkgKSk7Ci0vLyB9Ci0JCi0JcHVibGljIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIHZpZXdlci5nZXREb2N1bWVudCgpOwotCX0KLS8vIHB1YmxpYyBJSmF2YVNjcmlwdFVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCkgewotLy8gcmV0dXJuIGdldEpTUFRyYW5zbGF0aW9uKHZpZXdlcikuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0vLyB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NzQyZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRIdG1sQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yIHsKLQkKLQlwdWJsaWMgSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yKCkge30KLQkKLQkKLQkKLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQkvKiBhZGQgPC9zY3JpcHQgaWYgbmVjaXNhcnkgKi8KLQkJQXJyYXlMaXN0IGFsbFByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUpzVHJhbnNsYXRpb24gdHJhbiA9IGdldEpTUFRyYW5zbGF0aW9uKHZpZXdlcik7Ci0JCWludCBtaXNzaW5nQXRPZmZzZXQgPSB0cmFuLmdldE1pc3NpbmdUYWdTdGFydCgpOwotCQkKLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pYWxsUHJvcG9zYWxzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbYWxsUHJvcG9zYWxzLnNpemUoKV0pOwotCX0KLQkKLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbCBnZXRFbmRTY3JpcHRQcm9wb3NhbChJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJLyogYWRkIDwvc2NyaXB0IGlmIG5lY2lzYXJ5ICovCi0JCi0JCUlKc1RyYW5zbGF0aW9uIHRyYW4gPSBnZXRKU1BUcmFuc2xhdGlvbih2aWV3ZXIpOwotCQlpbnQgbWlzc2luZ0F0T2Zmc2V0ID0gdHJhbi5nZXRNaXNzaW5nVGFnU3RhcnQoKTsKLQkJCi0JCWlmKG9mZnNldD49bWlzc2luZ0F0T2Zmc2V0JiYgbWlzc2luZ0F0T2Zmc2V0Pi0xKSB7Ci0JCQkKLQkJCVN0cmluZyBhbGxUZXh0ID0gdmlld2VyLmdldERvY3VtZW50KCkuZ2V0KCk7Ci0JCQlTdHJpbmcgdGV4dCA9ICI8L3NjcmlwdD4iOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCWludCBzdGFydEluVGFnID0gLTE7Ci0JCQlpbnQgcmVwbGFjZUxlbmd0aCA9MDsKLQkJCQotCQkJZm9yKGludCBpPTA7aTx0ZXh0Lmxlbmd0aCgpICYmIGFsbFRleHQubGVuZ3RoKCk+b2Zmc2V0LTE7aSsrKSB7Ci0JCQkJaWYoYWxsVGV4dC5jaGFyQXQob2Zmc2V0LTEpPT10ZXh0LmNoYXJBdChpKSkgewotCQkJCQlzdGFydEluVGFnID0gaTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZihzdGFydEluVGFnPT0tMSApIHsKLQkJCQlTdHJpbmcgZGlzcGxheVRleHQgPSBNZXNzYWdlcy5nZXRTdHJpbmcoIkpTRFRIdG1sQ29tcGxldGlvblByb2Nlc3Nvci4xIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiXG4iICsgdGV4dCArICJcbiIgLG9mZnNldCwwLG9mZnNldCxudWxsLGRpc3BsYXlUZXh0LG51bGwsTWVzc2FnZXMuZ2V0U3RyaW5nKCJKU0RUSHRtbENvbXBsZXRpb25Qcm9jZXNzb3IuNCIpLDEwMCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQkKLQkJCVN0cmluZyB0ZXh0MSA9IGFsbFRleHQuc3Vic3RyaW5nKG9mZnNldCAtIHN0YXJ0SW5UYWcgLSAxLCBvZmZzZXQpLnRvTG93ZXJDYXNlKCk7Ci0JCQlTdHJpbmcgdGV4dDIgPSB0ZXh0LnN1YnN0cmluZygwLCBzdGFydEluVGFnKzEpLnRvTG93ZXJDYXNlKCk7Ci0JCQlpZihzdGFydEluVGFnPi0xICAmJiB0ZXh0Mi5jb21wYXJlVG8odGV4dDEpPT0wICkgewotCQkJCVN0cmluZyBkaXNwbGF5VGV4dCA9IE1lc3NhZ2VzLmdldFN0cmluZygiSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yLjUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHRleHQgICxvZmZzZXQtc3RhcnRJblRhZy0xLDAsdGV4dC5sZW5ndGgoKSxudWxsLGRpc3BsYXlUZXh0LG51bGwsTWVzc2FnZXMuZ2V0U3RyaW5nKCJKU0RUSHRtbENvbXBsZXRpb25Qcm9jZXNzb3IuNiIpLDEwMCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHJpdmF0ZSBJSnNUcmFuc2xhdGlvbiBnZXRKU1BUcmFuc2xhdGlvbihJVGV4dFZpZXdlciB2aWV3ZXIpIHsKLQkJSURPTU1vZGVsIHhtbE1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZCh2aWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQotCQkJSnNUcmFuc2xhdGlvbkFkYXB0ZXIgZlRyYW5zbGF0aW9uQWRhcHRlciA9IChKc1RyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpzVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJCi0JCQlpZiAoZlRyYW5zbGF0aW9uQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZUcmFuc2xhdGlvbkFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24odHJ1ZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVFByb3Bvc2FsQ29sbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNEVFByb3Bvc2FsQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYWE1MzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRQcm9wb3NhbENvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS50ZXh0LmphdmEuQ29tcGxldGlvblByb3Bvc2FsQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnRleHQuamF2YS5Db21wbGV0aW9uUHJvcG9zYWxDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotCi0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNEVFByb3Bvc2FsQ29sbGVjdG9yIGV4dGVuZHMgQ29tcGxldGlvblByb3Bvc2FsQ29sbGVjdG9yIHsKLQlzdGF0aWMgY2hhcltdIGdldFR5cGVUcmlnZ2VycygpIHsKLQkJcmV0dXJuIENvbXBsZXRpb25Qcm9wb3NhbENvbGxlY3Rvci5UWVBFX1RSSUdHRVJTOwotCX0KLQlwcml2YXRlIENvbXBhcmF0b3IgZkNvbXBhcmF0b3I7Ci0JcHJpdmF0ZSBJSnNUcmFuc2xhdGlvbiBmVHJhbnNsYXRpb247Ci0JCi0vLyBwdWJsaWMgTGlzdCBnZXRHZW5lcmF0ZWRGdW5jdGlvbk5hbWVzKCl7Ci0vLyBpZihmR2VuZXJhdGVkRnVuY3Rpb25OYW1lcz09bnVsbCl7Ci0vLyBmR2VuZXJhdGVkRnVuY3Rpb25OYW1lcyA9IGZUcmFuc2xhdGlvbi5nZXRHZW5lcmF0ZWRGdW5jdGlvbk5hbWVzKCk7Ci0vLyB9Ci0vLyByZXR1cm4gZkdlbmVyYXRlZEZ1bmN0aW9uTmFtZXM7Ci0vLyB9Ci0JcHVibGljIEpTRFRQcm9wb3NhbENvbGxlY3RvcihJSnNUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbikgewotCQlzdXBlcih0cmFuc2xhdGlvbi5nZXRDb21waWxhdGlvblVuaXQoKSk7Ci0JCWlmICh0cmFuc2xhdGlvbiA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJKU1BUcmFuc2xhdGlvbiBjYW5ub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZlRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb247Ci0JfQotCQotCS8qKgotCSAqIENhY2x1YXRlcyB0aGUgd2hlcmUgdGhlIGN1cnNvciBzaG91bGQgYmUgYWZ0ZXIgYXBwbHlpbmcgdGhpcyBwcm9wb3NhbC4KLQkgKiBlZy4gbWV0aG9kKHwpIGlmIHRoZSBtZXRob2QgcHJvcG9zYWwgY2hvc2VuIGhhZCBwYXJhbXMuCi0JICogCi0JICogQHBhcmFtIHByb3Bvc2FsCi0JICogQHBhcmFtIGNvbXBsZXRpb24KLQkgKiBAcGFyYW0gY3VycmVudEN1cnNvck9mZnNldAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGludCBjYWxjdWxhdGVQb3NpdGlvbkFmdGVyKENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCwgU3RyaW5nIGNvbXBsZXRpb24sIGludCBjdXJyZW50Q3Vyc29yT2Zmc2V0KSB7Ci0JCS8vIGNhbGN1bGF0ZSBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExODM5OAotCQkvLyBpbnQgcG9zaXRpb25BZnRlciA9IGN1cnJlbnRDdXJzb3JPZmZzZXQrY29tcGxldGlvbi5sZW5ndGgoKTsKLQkJaW50IHBvc2l0aW9uQWZ0ZXIgPSBjb21wbGV0aW9uLmxlbmd0aCgpOwotCQlpbnQga2luZCA9IHByb3Bvc2FsLmdldEtpbmQoKTsKLQkJLy8gbWF5IG5lZWQgYmV0dGVyIGxvZ2ljIGhlcmUuLi4KLQkJLy8gcHV0IGN1cnNvciBpbnNpZGUgcGFyZW50aGVzaXMgaWYgdGhlcmUncyBwYXJhbXMKLQkJLy8gb25seSBjaGVja2luZyBmb3IgYW55IGtpbmQgb2YgZGVjbGFyYXRpb24KLQkJaWYgKGtpbmQgPT0gQ29tcGxldGlvblByb3Bvc2FsLkFOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTiB8fCBraW5kID09IENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfREVDTEFSQVRJT04gfHwga2luZCA9PSBDb21wbGV0aW9uUHJvcG9zYWwuUE9URU5USUFMX01FVEhPRF9ERUNMQVJBVElPTiB8fCBraW5kID09IENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGKSB7Ci0JCQlTdHJpbmdbXSBwYXJhbXMgPSBTaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMoU3RyaW5nLnZhbHVlT2YocHJvcG9zYWwuZ2V0U2lnbmF0dXJlKCkpKTsKLQkJCWlmIChjb21wbGV0aW9uLmxlbmd0aCgpID4gMCAmJiBwYXJhbXMubGVuZ3RoID4gMCkgewotCQkJCXBvc2l0aW9uQWZ0ZXItLTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcG9zaXRpb25BZnRlcjsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGRlbiB0bzogLSB0cmFuc2xhdGUgSmF2YSAtPiBKU1Agb2Zmc2V0cyAtIGZpeAotCSAqIGN1cnNvci1wb3NpdGlvbi1hZnRlciAtIGZpeCBtYW5nbGVkIHNlcnZsZXQgbmFtZSBpbiBkaXNwbGF5IHN0cmluZyAtCi0JICogcmVtb3ZlIHVud2FudGVkIHByb3Bvc2FscyAoc2VydmxldCBjb25zdHJ1Y3RvcikKLQkgKi8KLQkKLQlwcm90ZWN0ZWQgSUphdmFDb21wbGV0aW9uUHJvcG9zYWwgY3JlYXRlSmF2YUNvbXBsZXRpb25Qcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwpIHsKLQkJSlNEVENvbXBsZXRpb25Qcm9wb3NhbCBqc3BQcm9wb3NhbCA9IG51bGw7Ci0JCS8vIGlnbm9yZSBjb25zdHJ1Y3RvciBwcm9wb3NhbHMgKHRoZXkncmUgbm90IHJlbGV2YW50IGZvciBvdXIgSlNQCi0JCS8vIHByb3Bvc2FsIGxpc3QpCi0JCWlmICghcHJvcG9zYWwuaXNDb25zdHJ1Y3RvcigpKSB7Ci0vLyBpZiAocHJvcG9zYWwuZ2V0S2luZCgpID09IENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikgewotLy8gU3RyaW5nIHNpZ25hdHVyZSA9IFN0cmluZy52YWx1ZU9mKHByb3Bvc2FsCi0vLyAuZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKSk7Ci0vLyBTdHJpbmcgY29tcGxldGlvbiA9IFN0cmluZy52YWx1ZU9mKHByb3Bvc2FsLmdldENvbXBsZXRpb24oKSk7Ci0vLyBpZiAoY29tcGxldGlvbi5pbmRleE9mKHNpZ25hdHVyZSkgIT0gLTEpIHsKLS8vIGpzcFByb3Bvc2FsID0gY3JlYXRlQXV0b0ltcG9ydFByb3Bvc2FsKHByb3Bvc2FsKTsKLS8vIH0KLS8vIH0KLQkJCS8vIGRlZmF1bHQgYmVoYXZpb3IKLS8vIGlmIChqc3BQcm9wb3NhbCA9PSBudWxsKSB7Ci0vLyBmb3IoaW50IGkgPSAwO2k8Z2V0R2VuZXJhdGVkRnVuY3Rpb25OYW1lcygpLnNpemUoKTtpKyspewotLy8gaWYoKG5ldwotLy8gU3RyaW5nKHByb3Bvc2FsLmdldE5hbWUoKSkpLmVxdWFsc0lnbm9yZUNhc2UoKFN0cmluZylnZXRHZW5lcmF0ZWRGdW5jdGlvbk5hbWVzKCkuZ2V0KGkpKSkKLS8vIHJldHVybiBqc3BQcm9wb3NhbDsKLS8vIH0KLQkJCWpzcFByb3Bvc2FsID0gY3JlYXRlSnNwUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJLy8gfQotCQl9Ci0JCXJldHVybiBqc3BQcm9wb3NhbDsKLQl9Ci0JCi0vLyBwcml2YXRlIEpTUENvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVBdXRvSW1wb3J0UHJvcG9zYWwoCi0vLyBDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwpIHsKLS8vCi0vLyBKU1BDb21wbGV0aW9uUHJvcG9zYWwganNwUHJvcG9zYWwgPSBudWxsOwotLy8KLS8vIFN0cmluZyBzaWduYXR1cmUgPSBuZXcgU3RyaW5nKHByb3Bvc2FsLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCkpOwotLy8gU3RyaW5nIGNvbXBsZXRpb24gPSBuZXcgU3RyaW5nKHByb3Bvc2FsLmdldENvbXBsZXRpb24oKSk7Ci0vLwotLy8gLy8gaXQncyBmdWxseSBxdWFsaWZpZWQgc28gd2Ugc2hvdWxkCi0vLyAvLyBhZGQgYW4gaW1wb3J0IHN0YXRlbWVudAotLy8gLy8gY3JlYXRlIGFuIGF1dG9pbXBvcnQgcHJvcG9zYWwKLS8vIFN0cmluZyBuZXdDb21wbGV0aW9uID0gY29tcGxldGlvbi5yZXBsYWNlQWxsKHNpZ25hdHVyZSArICIuIiwgIiIpOwotLy8gLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0vLwotLy8gLy8gamF2YSBvZmZzZXQKLS8vIGludCBvZmZzZXQgPSBwcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKTsKLS8vIC8vIHJlcGxhY2VtZW50IGxlbmd0aAotLy8gaW50IGxlbmd0aCA9IHByb3Bvc2FsLmdldFJlcGxhY2VFbmQoKSAtIG9mZnNldDsKLS8vIC8vIHRyYW5zbGF0ZSBvZmZzZXQgZnJvbSBKYXZhID4gSlNQCi0vLyBvZmZzZXQgPSBmVHJhbnNsYXRpb24uZ2V0SnNwT2Zmc2V0KG9mZnNldCk7Ci0vLyAvLyBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgbXVzdCBiZSBjYWxjdWxhdGVkCi0vLyBpbnQgcG9zaXRpb25BZnRlciA9IGNhbGN1bGF0ZVBvc2l0aW9uQWZ0ZXIocHJvcG9zYWwsIG5ld0NvbXBsZXRpb24sCi0vLyBvZmZzZXQpOwotLy8KLS8vIC8vIGZyb20gamF2YSBwcm9wb3NhbAotLy8gSUphdmFDb21wbGV0aW9uUHJvcG9zYWwgamF2YVByb3Bvc2FsID0gc3VwZXIKLS8vIC5jcmVhdGVKYXZhQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2FsKTsKLS8vIHByb3Bvc2FsLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCk7Ci0vLyBJbWFnZSBpbWFnZSA9IGphdmFQcm9wb3NhbC5nZXRJbWFnZSgpOwotLy8gU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBqYXZhUHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpOwotLy8gZGlzcGxheVN0cmluZyA9IGdldFRyYW5zbGF0aW9uKCkuZml4dXBNYW5nbGVkTmFtZShkaXNwbGF5U3RyaW5nKTsKLS8vIElDb250ZXh0SW5mb3JtYXRpb24gY29udGV4dEluZm9ybWF0aW9uID0gamF2YVByb3Bvc2FsCi0vLyAuZ2V0Q29udGV4dEluZm9ybWF0aW9uKCk7Ci0vLyAvLyBkb24ndCBkbyB0aGlzLCBpdCdzIHNsb3cKLS8vIC8vIFN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IGphdmFQcm9wb3NhbC5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0vLyBpbnQgcmVsZXZhbmNlID0gamF2YVByb3Bvc2FsLmdldFJlbGV2YW5jZSgpOwotLy8KLS8vIGJvb2xlYW4gdXBkYXRlTGVuZ3RoT25WYWxpZGF0ZSA9IHRydWU7Ci0vLwotLy8ganNwUHJvcG9zYWwgPSBuZXcgQXV0b0ltcG9ydFByb3Bvc2FsKGNvbXBsZXRpb24sIG5ld0NvbXBsZXRpb24sIG9mZnNldCwKLS8vIGxlbmd0aCwgcG9zaXRpb25BZnRlciwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsCi0vLyBjb250ZXh0SW5mb3JtYXRpb24sIG51bGwsIHJlbGV2YW5jZSwgdXBkYXRlTGVuZ3RoT25WYWxpZGF0ZSk7Ci0vLwotLy8gLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNDQ4MwotLy8gLy8gc2V0IHdyYXBwZWQgamF2YSBwcm9wb3NhbCBzbyBhZGRpdGlvbmFsIGluZm8gY2FuIGJlIGNhbGN1bGF0ZWQgb24KLS8vIC8vIGRlbWFuZAotLy8ganNwUHJvcG9zYWwuc2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbChqYXZhUHJvcG9zYWwpOwotLy8KLS8vIHJldHVybiBqc3BQcm9wb3NhbDsKLS8vIH0KLQlwcml2YXRlIEpTRFRDb21wbGV0aW9uUHJvcG9zYWwgY3JlYXRlSnNwUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsKSB7Ci0JCUpTRFRDb21wbGV0aW9uUHJvcG9zYWwganNwUHJvcG9zYWw7Ci0JCVN0cmluZyBjb21wbGV0aW9uID0gU3RyaW5nLnZhbHVlT2YocHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpKTsKLQkJLy8gamF2YSBvZmZzZXQKLQkJaW50IG9mZnNldCA9IHByb3Bvc2FsLmdldFJlcGxhY2VTdGFydCgpOwotCQkvLyByZXBsYWNlbWVudCBsZW5ndGgKLQkJaW50IGxlbmd0aCA9IHByb3Bvc2FsLmdldFJlcGxhY2VFbmQoKSAtIG9mZnNldDsKLQkJLy8gdHJhbnNsYXRlIG9mZnNldCBmcm9tIEphdmEgPiBKU1AKLQkJLy8gY3Vyc29yIHBvc2l0aW9uIGFmdGVyIG11c3QgYmUgY2FsY3VsYXRlZAotCQlpbnQgcG9zaXRpb25BZnRlciA9IGNhbGN1bGF0ZVBvc2l0aW9uQWZ0ZXIocHJvcG9zYWwsIGNvbXBsZXRpb24sIG9mZnNldCk7Ci0JCS8vIGZyb20gamF2YSBwcm9wb3NhbAotCQlJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCBqYXZhUHJvcG9zYWwgPSBzdXBlci5jcmVhdGVKYXZhQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJcHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKTsKLQkJSW1hZ2UgaW1hZ2UgPSBqYXZhUHJvcG9zYWwuZ2V0SW1hZ2UoKTsKLQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBqYXZhUHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpOwotCQlkaXNwbGF5U3RyaW5nID0gZ2V0VHJhbnNsYXRpb24oKS5maXh1cE1hbmdsZWROYW1lKGRpc3BsYXlTdHJpbmcpOwotLy8gZm9yKGludCBpID0gMDtpPGdldEdlbmVyYXRlZEZ1bmN0aW9uTmFtZXMoKS5zaXplKCk7aSsrKXsKLS8vIGRpc3BsYXlTdHJpbmcucmVwbGFjZSgoU3RyaW5nKWdldEdlbmVyYXRlZEZ1bmN0aW9uTmFtZXMoKS5nZXQoaSksICIiKTsKLS8vIH0KLQkJSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24gPSBqYXZhUHJvcG9zYWwuZ2V0Q29udGV4dEluZm9ybWF0aW9uKCk7Ci0JCS8vIFN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IGphdmFQcm9wb3NhbC5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0JCWludCByZWxldmFuY2UgPSBqYXZhUHJvcG9zYWwuZ2V0UmVsZXZhbmNlKCk7Ci0JCWJvb2xlYW4gdXBkYXRlTGVuZ3RoT25WYWxpZGF0ZSA9IHRydWU7Ci0JCWpzcFByb3Bvc2FsID0gbmV3IEpTRFRDb21wbGV0aW9uUHJvcG9zYWwoY29tcGxldGlvbiwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uQWZ0ZXIsIGltYWdlLCBkaXNwbGF5U3RyaW5nLCBjb250ZXh0SW5mb3JtYXRpb24sIG51bGwsIHJlbGV2YW5jZSwgdXBkYXRlTGVuZ3RoT25WYWxpZGF0ZSk7Ci0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQ0ODMKLQkJLy8gc2V0IHdyYXBwZWQgamF2YSBwcm9wb3NhbCBzbyBhZGRpdGlvbmFsIGluZm8gY2FuIGJlIGNhbGN1bGF0ZWQgb24KLQkJLy8gZGVtYW5kCi0JCWpzcFByb3Bvc2FsLnNldEphdmFDb21wbGV0aW9uUHJvcG9zYWwoamF2YVByb3Bvc2FsKTsKLQkJcmV0dXJuIGpzcFByb3Bvc2FsOwotCX0KLQkKLQlwcml2YXRlIENvbXBhcmF0b3IgZ2V0Q29tcGFyYXRvcigpIHsKLQkJaWYgKGZDb21wYXJhdG9yID09IG51bGwpIHsKLQkJCWZDb21wYXJhdG9yID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbENvbXBhcmF0b3IoKTsKLQkJfQotCQlyZXR1cm4gZkNvbXBhcmF0b3I7Ci0JfQotCQotCS8qKgotCSAqIEVuc3VyZXMgdGhhdCB3ZSBvbmx5IHJldHVybiBKU1BDb21wbGV0aW9uUHJvcG9zYWxzLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgSlNQQ29tcGxldGlvblByb3Bvc2FscwotCSAqLwotCXB1YmxpYyBKU0RUQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0SlNQQ29tcGxldGlvblByb3Bvc2FscygpIHsKLQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtdIGphdmFQcm9wb3NhbHMgPSBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscygpOwotCQkvLyBuZWVkIHRvIGZpbHRlciBvdXQgbm9uIEpTUENvbXBsZXRpb25Qcm9wb3NhbHMKLQkJLy8gYmVjYXVzZSB0aGVpciBvZmZzZXRzIGhhdmVuJ3QgYmVlbiB0cmFuc2xhdGVkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgamF2YVByb3Bvc2Fscy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGphdmFQcm9wb3NhbHNbaV0gaW5zdGFuY2VvZiBKU0RUQ29tcGxldGlvblByb3Bvc2FsKSB7Ci0JCQkJcmVzdWx0cy5hZGQoamF2YVByb3Bvc2Fsc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJQ29sbGVjdGlvbnMuc29ydChyZXN1bHRzLCBnZXRDb21wYXJhdG9yKCkpOwotCQlyZXR1cm4gKEpTRFRDb21wbGV0aW9uUHJvcG9zYWxbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBKU0RUQ29tcGxldGlvblByb3Bvc2FsW3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JfQotCQotCXB1YmxpYyBJSnNUcmFuc2xhdGlvbiBnZXRUcmFuc2xhdGlvbigpIHsKLQkJcmV0dXJuIGZUcmFuc2xhdGlvbjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRUZW1wbGF0ZUFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTRFRUZW1wbGF0ZUFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjk4MTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU0RUVGVtcGxhdGVBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkudGV4dC5qYXZhLlRlbXBsYXRlQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkudGV4dC5qYXZhLkphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uQWRhcHRlcjsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNEVFRlbXBsYXRlQXNzaXN0UHJvY2Vzc29yIHsKLQlUZW1wbGF0ZUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIGZKYXZhVGVtcGxhdGVDb21wbGV0aW9uOwotCUpTRFRQcm9wb3NhbENvbGxlY3RvciBmUHJvcG9zYWxDb2xsZWN0b3I7Ci0JSnNUcmFuc2xhdGlvbkFkYXB0ZXIgZlRyYW5zbGF0aW9uQWRhcHRlcjsKLQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0JCi0JcHVibGljIEpTRFRUZW1wbGF0ZUFzc2lzdFByb2Nlc3NvcigpIHsKLQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JfQotCQotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCUphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgY29udGV4dCA9IGdldEludm9jYXRpb25Db250ZXh0KHZpZXdlciwgb2Zmc2V0KTsKLQkJTGlzdCBwcm9wcyA9IGdldFRlbXBsYXRlQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIoKS5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyhjb250ZXh0LCBtb25pdG9yKTsKLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIHByb3BzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbXSB7fSk7Ci0JfQotCQotCXByaXZhdGUgSmF2YUNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBnZXRJbnZvY2F0aW9uQ29udGV4dChJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIEpTRFRDb250ZXRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dC5nZXRJbnN0YW5jZSh2aWV3ZXIsIG9mZnNldCwgZ2V0UHJvcG9zYWxDb2xsZWN0b3IoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBKU0RUUHJvcG9zYWxDb2xsZWN0b3IgZ2V0UHJvcG9zYWxDb2xsZWN0b3IoKSB7Ci0JCXJldHVybiBmUHJvcG9zYWxDb2xsZWN0b3I7Ci0JCS8vIHJldHVybiBuZXcgSlNQUHJvcG9zYWxDb2xsZWN0b3IodHJhbnNsYXRpb24pOwotCX0KLQkKLQlwcml2YXRlIFRlbXBsYXRlQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcigpIHsKLQkJaWYgKGZKYXZhVGVtcGxhdGVDb21wbGV0aW9uID09IG51bGwpIHsKLQkJCWZKYXZhVGVtcGxhdGVDb21wbGV0aW9uID0gbmV3IFRlbXBsYXRlQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIoKTsKLQkJfQotCQlyZXR1cm4gZkphdmFUZW1wbGF0ZUNvbXBsZXRpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb3Bvc2FsQ29sbGVjdG9yKEpTRFRQcm9wb3NhbENvbGxlY3RvciB0cmFuc2xhdGlvbikgewotCQl0aGlzLmZQcm9wb3NhbENvbGxlY3RvciA9IHRyYW5zbGF0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OWUyMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfQotCQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmRmODA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUpTRFRIdG1sQ29tcGxldGlvblByb2Nlc3Nvci4xPTw+IGVuZCB3aXRoIDwvc2NyaXB0PgotSlNEVEh0bWxDb21wbGV0aW9uUHJvY2Vzc29yLjQ9Q2xvc2UgdGhlIHNjcmlwdCB0YWcuCi1KU0RUSHRtbENvbXBsZXRpb25Qcm9jZXNzb3IuNT08PiBlbmQgd2l0aCA8L3NjcmlwdD4KLUpTRFRIdG1sQ29tcGxldGlvblByb2Nlc3Nvci42PUNsb3NlIHRoZSBzY3JpcHQgdGFnLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9kZXJpdmVkL1NpbmdsZUNoYXJSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvZGVyaXZlZC9TaW5nbGVDaGFyUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OTNkNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9kZXJpdmVkL1NpbmdsZUNoYXJSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmRlcml2ZWQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNpbmdsZUNoYXJSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRlbnQgYXMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBjaDsKLQkJd2hpbGUgKChjaCA9IHJlYWQoKSkgIT0gLTEpIHsKLQkJCWJ1Zi5hcHBlbmQoKGNoYXIpIGNoKTsKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgUmVhZGVyI3JlYWQoKQotCSAqLwotCQotCXB1YmxpYyBhYnN0cmFjdCBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkKGNoYXJbXSxpbnQsaW50KQotCSAqLwotCQotCXB1YmxpYyBpbnQgcmVhZChjaGFyIGNidWZbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGVuZCA9IG9mZiArIGxlbjsKLQkJZm9yIChpbnQgaSA9IG9mZjsgaSA8IGVuZDsgaSsrKSB7Ci0JCQlpbnQgY2ggPSByZWFkKCk7Ci0JCQlpZiAoY2ggPT0gLTEpIHsKLQkJCQlpZiAoaSA9PSBvZmYpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlyZXR1cm4gaSAtIG9mZjsKLQkJCX0KLQkJCWNidWZbaV0gPSAoY2hhcikgY2g7Ci0JCX0KLQkJcmV0dXJuIGxlbjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjcmVhZHkoKQotCSAqLwotCQotCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9lZGl0b3IvQWN0aW9uQ29udHJpYnV0b3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvZWRpdG9yL0FjdGlvbkNvbnRyaWJ1dG9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhOWY1ZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9lZGl0b3IvQWN0aW9uQ29udHJpYnV0b3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0LnVpLkFjdGlvbkNvbnRyaWJ1dG9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5hY3Rpb25zLlJlZmFjdG9yQWN0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLklBY3Rpb25Db25zdGFudHNKczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSUFjdGlvbkRlZmluaXRpb25JZHNKczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5TdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25Db250cmlidXRvckpTUCBleHRlbmRzIEFjdGlvbkNvbnRyaWJ1dG9ySFRNTCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRURJVE9SX0lEUyA9IHsgIm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5zb3VyY2UiLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciIgfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcHJpdmF0ZSBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gbW92ZUVsZW1lbnRBY3Rpb24gPSBudWxsOwotCXByaXZhdGUgSU1lbnVNYW5hZ2VyIHJlZmFjdG9yTWVudSA9IG51bGw7Ci0JcHJpdmF0ZSBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gcmVuYW1lRWxlbWVudEFjdGlvbiA9IG51bGw7Ci0JCi0JcHVibGljIEFjdGlvbkNvbnRyaWJ1dG9ySlNQKCkgewotCQlzdXBlcigpOwotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBKc1VJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdGhpcy5yZW5hbWVFbGVtZW50QWN0aW9uID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihidW5kbGUsIElBY3Rpb25Db25zdGFudHNKcy5BQ1RJT05fTkFNRV9SRU5BTUVfRUxFTUVOVCArIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVOREVSU0NPUkUpOwotCQl0aGlzLnJlbmFtZUVsZW1lbnRBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKElBY3Rpb25EZWZpbml0aW9uSWRzSnMuUkVOQU1FX0VMRU1FTlQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMucmVuYW1lRWxlbWVudEFjdGlvbiwgSUhlbHBDb250ZXh0SWRzLkpTUF9SRUZBQ1RPUlJFTkFNRV9IRUxQSUQpOwotCQl0aGlzLm1vdmVFbGVtZW50QWN0aW9uID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihidW5kbGUsIElBY3Rpb25Db25zdGFudHNKcy5BQ1RJT05fTkFNRV9NT1ZFX0VMRU1FTlQgKyBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRFUlNDT1JFKTsKLQkJdGhpcy5tb3ZlRWxlbWVudEFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSUFjdGlvbkRlZmluaXRpb25JZHNKcy5NT1ZFX0VMRU1FTlQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMubW92ZUVsZW1lbnRBY3Rpb24sIElIZWxwQ29udGV4dElkcy5KU1BfUkVGQUNUT1JNT1ZFX0hFTFBJRCk7Ci0JCS8vIHRoZSByZWZhY3RvciBtZW51LCBhZGQgdGhlIG1lbnUgaXRzZWxmIHRvIGFkZCBhbGwgcmVmYWN0b3IgYWN0aW9ucwotCQl0aGlzLnJlZmFjdG9yTWVudSA9IG5ldyBNZW51TWFuYWdlcihKc1VJTWVzc2FnZXMuQWN0aW9uQ29udHJpYnV0b3JKU1BfMCwgUmVmYWN0b3JBY3Rpb25Hcm91cC5NRU5VX0lEKTsKLQkJcmVmYWN0b3JNZW51LmFkZCh0aGlzLnJlbmFtZUVsZW1lbnRBY3Rpb24pOwotCQlyZWZhY3Rvck1lbnUuYWRkKHRoaXMubW92ZUVsZW1lbnRBY3Rpb24pOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuYWRkVG9NZW51KG1lbnUpOwotCQltZW51Lmluc2VydEFmdGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElULCB0aGlzLnJlZmFjdG9yTWVudSk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRFeHRlbnNpb25JRHMoKSB7Ci0JCXJldHVybiBBY3Rpb25Db250cmlidXRvckpTUC5FRElUT1JfSURTOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKSB7Ci0JCXN1cGVyLnNldEFjdGl2ZUVkaXRvcihhY3RpdmVFZGl0b3IpOwotCQl0aGlzLnJlbmFtZUVsZW1lbnRBY3Rpb24uc2V0QWN0aW9uKGdldEFjdGlvbihnZXRUZXh0RWRpdG9yKGdldEFjdGl2ZUVkaXRvclBhcnQoKSksIElBY3Rpb25Db25zdGFudHNKcy5BQ1RJT05fTkFNRV9SRU5BTUVfRUxFTUVOVCkpOwotCQl0aGlzLm1vdmVFbGVtZW50QWN0aW9uLnNldEFjdGlvbihnZXRBY3Rpb24oZ2V0VGV4dEVkaXRvcihnZXRBY3RpdmVFZGl0b3JQYXJ0KCkpLCBJQWN0aW9uQ29uc3RhbnRzSnMuQUNUSU9OX05BTUVfTU9WRV9FTEVNRU5UKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoZW5hYmxlZCk7Ci0JCXRoaXMucmVuYW1lRWxlbWVudEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl0aGlzLm1vdmVFbGVtZW50QWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ0MThmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJUGx1Z2luOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGludGVyZmFjZSBJSGVscENvbnRleHRJZHMgewotCS8vIEpTUCBGcmFnbWVudCBQcm9wZXJ0eSBQYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0ZSQUdNRU5UX0hFTFBJRCA9IElIZWxwQ29udGV4dElkcy5QUkVGSVggKyAianNwZjEwMDAiOyAvLyROT04tTkxTLTEkCi0JLy8gLy8gZmlndXJlZCBvdXQgb24gdGhlIGZseQotCS8vIC8vIEpTUCBTb3VyY2UgcGFnZSBlZGl0b3IKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfU09VUkNFVklFV19IRUxQSUQgPQotCS8vIENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1AgKyJfc291cmNlX0hlbHBJZCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBKU1AgTmV3IEZpbGUgV2l6YXJkIC0gVGVtcGxhdGUgUGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEID0gSUhlbHBDb250ZXh0SWRzLlBSRUZJWCArICJqc3B3MDAxMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBKU1AgRmlsZXMgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1BSRUZXRUJYX0ZJTEVTX0hFTFBJRCA9IElIZWxwQ29udGV4dElkcy5QUkVGSVggKyAid2VieDAwNTAiOyAvLyROT04tTkxTLTEkCi0JLy8gSlNQIFN0eWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCA9IElIZWxwQ29udGV4dElkcy5QUkVGSVggKyAid2VieDAwNTEiOyAvLyROT04tTkxTLTEkCi0JLy8gSlNQIFRlbXBsYXRlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUFJFRldFQlhfVEVNUExBVEVTX0hFTFBJRCA9IElIZWxwQ29udGV4dElkcy5QUkVGSVggKyAid2VieDAwNTIiOyAvLyROT04tTkxTLTEkCi0JLy8gUmVmYWN0b3IgTW92ZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9SRUZBQ1RPUk1PVkVfSEVMUElEID0gSUhlbHBDb250ZXh0SWRzLlBSRUZJWCArICJqc3ByMDAyMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBKU1AgU291cmNlIEVkaXRvciBDb250ZXh0IE1lbnUKLQkvLyBSZWZhY3RvciBSZW5hbWUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUkVGQUNUT1JSRU5BTUVfSEVMUElEID0gSUhlbHBDb250ZXh0SWRzLlBSRUZJWCArICJqc3ByMDAxMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gSnNVSVBsdWdpbi5JRCArICIuIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9mb3JtYXQvRm9ybWF0dGluZ1N0cmF0ZWd5SlNEVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9mb3JtYXQvRm9ybWF0dGluZ1N0cmF0ZWd5SlNEVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTBlNjUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvZm9ybWF0L0Zvcm1hdHRpbmdTdHJhdGVneUpTRFQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UeXBlZFBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Gb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUZvcm1hdHRpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmZvcm1hdHRlci5Db2RlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmV4dC51dGlsLkNvZGVGb3JtYXR0ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmZvcm1hdHRlci5EZWZhdWx0Q29kZUZvcm1hdHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgRm9ybWF0dGluZ1N0cmF0ZWd5SlNEVCBleHRlbmRzIENvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHJlZ2lvblN0YXJ0SW5kZW50TGV2ZWwgPSAxOwotCS8qKiBEb2N1bWVudHMgdG8gYmUgZm9ybWF0dGVkIGJ5IHRoaXMgc3RyYXRlZ3kgKi8KLQlwcml2YXRlIGZpbmFsIExpbmtlZExpc3QgZkRvY3VtZW50cyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JLyoqIFBhcnRpdGlvbnMgdG8gYmUgZm9ybWF0dGVkIGJ5IHRoaXMgc3RyYXRlZ3kgKi8KLQlwcml2YXRlIGZpbmFsIExpbmtlZExpc3QgZlBhcnRpdGlvbnMgPSBuZXcgTGlua2VkTGlzdCgpOwotCXByaXZhdGUgaW50IHN0YXJ0SW5kZW50TGV2ZWw7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBqYXZhIGZvcm1hdHRpbmcgc3RyYXRlZ3kuCi0JICovCi0JcHVibGljIEZvcm1hdHRpbmdTdHJhdGVneUpTRFQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCWNsYXNzIE1vZGVsSXJyaXRhbnQgaW1wbGVtZW50cyBJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lciB7Ci0JCXB1YmxpYyBNb2RlbElycml0YW50KElEb2N1bWVudCBhdHRhY2hlZERvYykge30KLQkJCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJCWRvY3VtZW50LnJlbW92ZURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIodGhpcyk7Ci0JCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCXRyeSB7Ci0JCQkJCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KS5yZXBsYWNlKDAsIGRvY3VtZW50LmdldExlbmd0aCgpLCBkb2N1bWVudC5nZXQoKSk7Ci0JCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXQoKQotCSAqLwotCQotCXB1YmxpYyB2b2lkIGZvcm1hdCgpIHsKLQkJc3VwZXIuZm9ybWF0KCk7Ci0JCWZpbmFsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZkRvY3VtZW50cy5yZW1vdmVGaXJzdCgpOwotCQlmaW5hbCBUeXBlZFBvc2l0aW9uIHBhcnRpdGlvbiA9IChUeXBlZFBvc2l0aW9uKSBmUGFydGl0aW9ucy5yZW1vdmVGaXJzdCgpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQkvLyBKU1BUcmFuc2xhdGlvblV0aWwgdHJhbnNsYXRpb25VdGlsID0gbmV3Ci0JCQkJLy8gSlNQVHJhbnNsYXRpb25VdGlsKGRvY3VtZW50KTsKLQkJCQlJSnNUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IGdldFRyYW5zbGF0aW9uKGRvY3VtZW50KTsKLQkJCQlJSmF2YVNjcmlwdFVuaXQgY3UgPSB0cmFuc2xhdGlvbi5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCQlpZiAoY3UgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgY3VTb3VyY2UgPSBjdS5nZXRTb3VyY2UoKTsKLQkJCQkJaW50IGphdmFTdGFydCA9IHBhcnRpdGlvbi5nZXRPZmZzZXQoKTsKLQkJCQkJaW50IGphdmFMZW5ndGggPSBwYXJ0aXRpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJCVRleHRFZGl0IGVkaXQgPSBDb2RlRm9ybWF0dGVyVXRpbC5mb3JtYXQyKENvZGVGb3JtYXR0ZXIuS19KQVZBU0NSSVBUX1VOSVQsIGN1U291cmNlLCBqYXZhU3RhcnQsIGphdmFMZW5ndGgsIHN0YXJ0SW5kZW50TGV2ZWwsIFRleHRVdGlsaXRpZXMuZ2V0RGVmYXVsdExpbmVEZWxpbWl0ZXIoZG9jdW1lbnQpLCBnZXRQcmVmZXJlbmNlcygpKTsKLQkJCQkJSURvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCh0cmFuc2xhdGlvbi5nZXRKc1RleHQoKSk7Ci0JCQkJCS8qIGVycm9yIGZvcm1hdGluZyB0aGUgY29kZSBzbyBhYm9ydCAqLwotCQkJCQlpZihlZGl0PT1udWxsKSByZXR1cm47Ci0JCQkJCWVkaXQuYXBwbHkoZG9jKTsKLQkJCQkJU3RyaW5nIHJlcGxhY2VUZXh0ID0gVGV4dFV0aWxpdGllcy5nZXREZWZhdWx0TGluZURlbGltaXRlcihkb2N1bWVudCkgKyBnZXRJbmRlbnRhdGlvblN0cmluZyhnZXRQcmVmZXJlbmNlcygpLCBzdGFydEluZGVudExldmVsKSArIChkb2MuZ2V0KGVkaXQuZ2V0T2Zmc2V0KCksIGVkaXQuZ2V0TGVuZ3RoKCkpKS50cmltKCkgKyBUZXh0VXRpbGl0aWVzLmdldERlZmF1bHRMaW5lRGVsaW1pdGVyKGRvY3VtZW50KTsKLQkJCQkJLyoKLQkJCQkJICogdGhpcyBpcyBuZWNpc2FyeSBzaW5jZSBTU0UgZGlzY29ubmVjdHMgZG9jdW1lbnQKLQkJCQkJICogcGFydGl0aW9uZXJzLi4gQmVjYXVzZSBvZiB0aGF0LCB0aGUgcmVwbGFjZWQgcmVnaW9ucyBhcmUKLQkJCQkJICogY29uc2lkZXJlZCAncGFydGl0aW9ubGVzcycgd2hlbiB0aGUgbGluZXN0eWxlIHByb3ZpZGVyCi0JCQkJCSAqIHRyeXMgdG8gY29sb3IgdGhlbS4KLQkJCQkJICogCi0JCQkJCSAqLwotCQkJCQlkb2N1bWVudC5yZXBsYWNlVGV4dChkb2N1bWVudCwgcGFydGl0aW9uLmdldE9mZnNldCgpLCBwYXJ0aXRpb24uZ2V0TGVuZ3RoKCksIHJlcGxhY2VUZXh0KTsKLQkJCQkvLwlkb2N1bWVudC5hZGREb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyKG5ldyBNb2RlbElycml0YW50KGRvY3VtZW50KSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJfSBjYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5I2Zvcm1hdHRlclN0YXJ0cyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JRm9ybWF0dGluZ0NvbnRleHQpCi0JICovCi0JCi0JcHVibGljIHZvaWQgZm9ybWF0dGVyU3RhcnRzKGZpbmFsIElGb3JtYXR0aW5nQ29udGV4dCBjb250ZXh0KSB7Ci0JCWZQYXJ0aXRpb25zLmFkZExhc3QoY29udGV4dC5nZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9QQVJUSVRJT04pKTsKLQkJZkRvY3VtZW50cy5hZGRMYXN0KGNvbnRleHQuZ2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfTUVESVVNKSk7Ci0JCXN0YXJ0SW5kZW50TGV2ZWwgPSBGb3JtYXR0aW5nU3RyYXRlZ3lKU0RULnJlZ2lvblN0YXJ0SW5kZW50TGV2ZWwgKyAwOwotCQlNYXAgcHJvamVjdE9wdGlvbnMgPSAoTWFwKSBjb250ZXh0LmdldFByb3BlcnR5KEZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllcy5DT05URVhUX1BSRUZFUkVOQ0VTKTsKLQkJaWYgKHByb2plY3RPcHRpb25zID09IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2MgPSAoSURvY3VtZW50KSBjb250ZXh0LmdldFByb3BlcnR5KEZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllcy5DT05URVhUX01FRElVTSk7Ci0JCQljb250ZXh0LnNldFByb3BlcnR5KEZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllcy5DT05URVhUX1BSRUZFUkVOQ0VTLCBnZXRQcm9qZWN0T3B0aW9ucyhkb2MpKTsKLQkJfQotCQlzdXBlci5mb3JtYXR0ZXJTdGFydHMoY29udGV4dCk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kjZm9ybWF0dGVyU3RvcHMoKQotCSAqLwotCQotCXB1YmxpYyB2b2lkIGZvcm1hdHRlclN0b3BzKCkgewotCQlzdXBlci5mb3JtYXR0ZXJTdG9wcygpOwotCQlmUGFydGl0aW9ucy5jbGVhcigpOwotCQlmRG9jdW1lbnRzLmNsZWFyKCk7Ci0JCXN0YXJ0SW5kZW50TGV2ZWwgPSAwOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEluZGVudGF0aW9uU3RyaW5nKE1hcCBvcHRpb25zLCBpbnQgaW5kZW50YXRpb25MZXZlbCkgewotCQlEZWZhdWx0Q29kZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSBuZXcgRGVmYXVsdENvZGVGb3JtYXR0ZXIob3B0aW9ucyk7Ci0JCXJldHVybiBmb3JtYXR0ZXIuY3JlYXRlSW5kZW50YXRpb25TdHJpbmcoaW5kZW50YXRpb25MZXZlbCk7Ci0JfQotCQotCXByaXZhdGUgTWFwIGdldFByb2plY3RPcHRpb25zKElEb2N1bWVudCBiYXNlRG9jdW1lbnQpIHsKLQkJSUphdmFTY3JpcHRQcm9qZWN0IGphdmFQcm9qZWN0ID0gbnVsbDsKLQkJSURPTU1vZGVsIHhtbE1vZGVsID0gbnVsbDsKLQkJTWFwIG9wdGlvbnMgPSBudWxsOwotCQl0cnkgewotCQkJeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGJhc2VEb2N1bWVudCk7Ci0JCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0geG1sTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoYmFzZUxvY2F0aW9uKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQkJaWYgKGZpbGVQYXRoLnNlZ21lbnRDb3VudCgpID4gMCkgewotCQkJCXByb2plY3QgPSByb290LmdldFByb2plY3QoZmlsZVBhdGguc2VnbWVudCgwKSk7Ci0JCQl9Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJamF2YVByb2plY3QgPSBKYXZhU2NyaXB0Q29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQlvcHRpb25zID0gamF2YVByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKTsKLQkJfQotCQlyZXR1cm4gb3B0aW9uczsKLQl9Ci0JCi0JcHVibGljIElKc1RyYW5zbGF0aW9uIGdldFRyYW5zbGF0aW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJSUpzVHJhbnNsYXRpb24gdHJhbiA9IG51bGw7Ci0JCUlET01Nb2RlbCB4bWxNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJSURPTURvY3VtZW50IHhtbERvYyA9IHhtbE1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQlKc1RyYW5zbGF0aW9uQWRhcHRlciB0cmFuc2xhdGlvbkFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCWlmICh0cmFuc2xhdGlvbkFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCXRyYW4gPSB0cmFuc2xhdGlvbkFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24odHJ1ZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cmFuOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUVkaXRvcklucHV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMThjNDI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXRoRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUxvY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1jbGFzcyBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElFZGl0b3JJbnB1dCwgSUxvY2F0aW9uUHJvdmlkZXIgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0IGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluawotCS8qKgotCSAqIFRoZSB3b3JrYmVuY2ggYWRhcHRlciB3aGljaCBzaW1wbHkgcHJvdmlkZXMgdGhlIGxhYmVsLgotCSAqIAotCSAqIEBzZWUgRWNsaXBzZSAzLjEKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFdvcmtiZW5jaEFkYXB0ZXIgaW1wbGVtZW50cyBJV29ya2JlbmNoQWRhcHRlciB7Ci0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0SW1hZ2VEZXNjcmlwdG9yKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRMYWJlbChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3QgbykgewotCQkJcmV0dXJuICgoRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIG8pLmdldE5hbWUoKTsKLQkJfQotCQkKLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQlwcml2YXRlIEZpbGUgZkZpbGU7Ci0JcHJpdmF0ZSBXb3JrYmVuY2hBZGFwdGVyIGZXb3JrYmVuY2hBZGFwdGVyID0gbmV3IFdvcmtiZW5jaEFkYXB0ZXIoKTsKLQkKLQlwdWJsaWMgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQoRmlsZSBmaWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZGaWxlID0gZmlsZTsKLQkJZldvcmtiZW5jaEFkYXB0ZXIgPSBuZXcgV29ya2JlbmNoQWRhcHRlcigpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG8gaW5zdGFuY2VvZiBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgewotCQkJRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgaW5wdXQgPSAoRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIG87Ci0JCQlyZXR1cm4gZkZpbGUuZXF1YWxzKGlucHV0LmZGaWxlKTsKLQkJfQotCQlpZiAobyBpbnN0YW5jZW9mIElQYXRoRWRpdG9ySW5wdXQpIHsKLQkJCUlQYXRoRWRpdG9ySW5wdXQgaW5wdXQgPSAoSVBhdGhFZGl0b3JJbnB1dCkgbzsKLQkJCXJldHVybiBnZXRQYXRoKCkuZXF1YWxzKGlucHV0LmdldFBhdGgoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2V4aXN0cygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQlyZXR1cm4gZkZpbGUuZXhpc3RzKCk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoSUxvY2F0aW9uUHJvdmlkZXIuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCQlpZiAoSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQlyZXR1cm4gZldvcmtiZW5jaEFkYXB0ZXI7Ci0JCX0KLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRJbWFnZURlc2NyaXB0b3IoKQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBmRmlsZS5nZXROYW1lKCk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGF0aEVkaXRvcklucHV0I2dldFBhdGgoKQotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIFBhdGguZnJvbU9TU3RyaW5nKGZGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5JTG9jYXRpb25Qcm92aWRlciNnZXRQYXRoKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElQYXRoIGdldFBhdGgoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgewotCQkJRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgaW5wdXQgPSAoRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gUGF0aC5mcm9tT1NTdHJpbmcoaW5wdXQuZkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFBlcnNpc3RhYmxlKCkKLQkgKi8KLQlwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0VG9vbFRpcFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCXJldHVybiBmRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBmRmlsZS5oYXNoQ29kZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlSHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYmJkNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1jbGFzcyBFeHRlcm5hbEZpbGVIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQlwcml2YXRlIEZpbGUgZkh5cGVybGlua0ZpbGU7Ci0JcHJpdmF0ZSBJUmVnaW9uIGZIeXBlcmxpbmtSZWdpb247Ci0JCi0JcHVibGljIEV4dGVybmFsRmlsZUh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgRmlsZSBmaWxlKSB7Ci0JCWZIeXBlcmxpbmtGaWxlID0gZmlsZTsKLQkJZkh5cGVybGlua1JlZ2lvbiA9IHJlZ2lvbjsKLQl9Ci0JCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlyZXR1cm4gZkh5cGVybGlua1JlZ2lvbjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQlpZiAoZkh5cGVybGlua0ZpbGUgIT0gbnVsbCkgewotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IEV4dGVybmFsRmlsZUVkaXRvcklucHV0KGZIeXBlcmxpbmtGaWxlKTsKLQkJCUlFZGl0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0JCQl0cnkgewotCQkJCWRlc2NyaXB0b3IgPSBJREUuZ2V0RWRpdG9yRGVzY3JpcHRvcihpbnB1dC5nZXROYW1lKCksIHRydWUpOwotCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBpbnB1dCwgZGVzY3JpcHRvci5nZXRJZCgpLCB0cnVlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvSlNEVEh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvSlNEVEh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDljODQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0pTRFRIeXBlcmxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLkphdmFTY3JpcHRVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuTG9nZ2VyOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLWNsYXNzIEpTRFRIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQlwcml2YXRlIElKYXZhU2NyaXB0RWxlbWVudCBmRWxlbWVudDsKLQlwcml2YXRlIElSZWdpb24gZlJlZ2lvbjsKLQkKLQlwdWJsaWMgSlNEVEh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnQpIHsKLQkJZlJlZ2lvbiA9IHJlZ2lvbjsKLQkJZkVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rUmVnaW9uKCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKSB7Ci0JCXJldHVybiBmUmVnaW9uOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI29wZW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JCXRyeSB7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBKYXZhU2NyaXB0VUkub3BlbkluRWRpdG9yKGZFbGVtZW50KTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCUphdmFTY3JpcHRVSS5yZXZlYWxJbkVkaXRvcihlZGl0b3IsIGZFbGVtZW50KTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0pTRFRIeXBlcmxpbmtEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvSlNEVEh5cGVybGlua0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiODFhZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvSlNEVEh5cGVybGlua0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5BYnN0cmFjdEh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JQ2xhc3NGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUxvY2FsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JRnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JU291cmNlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JU291cmNlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLmNvcmUuSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNEVEh5cGVybGlua0RldGVjdG9yIGV4dGVuZHMgQWJzdHJhY3RIeXBlcmxpbmtEZXRlY3RvciB7Ci0JcHJpdmF0ZSBJSHlwZXJsaW5rIGNyZWF0ZUh5cGVybGluayhJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCwgSVJlZ2lvbiByZWdpb24sIElEb2N1bWVudCBkb2N1bWVudCkgewotCQlJSHlwZXJsaW5rIGxpbmsgPSBudWxsOwotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIG9wZW4gbG9jYWwgdmFyaWFibGUgaW4gdGhlIEpTUCBmaWxlLi4uCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTb3VyY2VSZWZlcmVuY2UpIHsKLQkJCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJCQlJUGF0aCBvdXRzaWRlUGF0aCA9IG51bGw7Ci0JCQkJaW50IGpzcE9mZnNldCA9IDA7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQkJCS8vIHRyeSB0byBsb2NhdGUgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZQotCQkJCXRyeSB7Ci0JCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJCS8vVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBzTW9kZWwuZ2V0UmVzb2x2ZXIoKTsKLQkJCQkJCS8vaWYgKHJlc29sdmVyICE9IG51bGwpIHsKLQkJCQkJCS8vCVN0cmluZyB1cmlTdHJpbmcgPSByZXNvbHZlci5nZXRGaWxlQmFzZUxvY2F0aW9uKCk7Ci0JCQkJCQlTdHJpbmcgdXJpU3RyaW5nID0gc01vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJCQkJCWZpbGUgPSBnZXRGaWxlKHVyaVN0cmluZyk7Ci0JCQkJCS8vCX0KLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIGdldCBKYXZhIHJhbmdlLCB0cmFuc2xhdGUgY29vcmRpbmF0ZSB0byBKU1AKLQkJCQl0cnkgewotCQkJCQlJU291cmNlUmFuZ2UgcmFuZ2UgPSBudWxsOwotCQkJCQlJSnNUcmFuc2xhdGlvbiBqc3BUcmFuc2xhdGlvbiA9IGdldEpTUFRyYW5zbGF0aW9uKGRvY3VtZW50KTsKLQkJCQkJaWYgKGpzcFRyYW5zbGF0aW9uICE9IG51bGwpIHsKLQkJCQkJCS8vIGxpbmsgdG8gbG9jYWwgdmFyaWFibGUgZGVmaW5pdGlvbnMKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUxvY2FsVmFyaWFibGUpIHsKLQkJCQkJCQlyYW5nZSA9ICgoSUxvY2FsVmFyaWFibGUpIGVsZW1lbnQpLmdldE5hbWVSYW5nZSgpOwotCQkJCQkJCUlKYXZhU2NyaXB0RWxlbWVudCB1bml0PSgoSUxvY2FsVmFyaWFibGUpIGVsZW1lbnQpLmdldFBhcmVudCgpOwotCQkJCQkJCUlKYXZhU2NyaXB0VW5pdCBteVVuaXQgPSBqc3BUcmFuc2xhdGlvbi5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCQkJCQkKLQkJCQkJCQl3aGlsZSghKHVuaXQgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdFVuaXQgfHwgdW5pdCBpbnN0YW5jZW9mIElDbGFzc0ZpbGUgfHwgdW5pdD09bnVsbCkpIHsKLQkJCQkJCQkJdW5pdCA9ICgoSmF2YUVsZW1lbnQpIHVuaXQpLmdldFBhcmVudCgpOwotCQkJCQkJCX0KLQkJCQkJCQlpZih1bml0IGluc3RhbmNlb2YgSUphdmFTY3JpcHRVbml0KSB7Ci0JCQkJCQkJCUlKYXZhU2NyaXB0VW5pdCBjdSA9IChJSmF2YVNjcmlwdFVuaXQpdW5pdDsKLQkJCQkJCQkJaWYoY3UhPW15VW5pdCkgewotCQkJCQkJCQkJZmlsZSA9IGdldEZpbGUoY3UuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJCQkJCQkJaWYoZmlsZT09bnVsbCkgewotCQkJCQkJCQkJCW91dHNpZGVQYXRoID0gY3UuZ2V0UGF0aCgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfWVsc2UgaWYodW5pdCBpbnN0YW5jZW9mIElDbGFzc0ZpbGUpIHsKLQkJCQkJCQkJSUNsYXNzRmlsZSBjdSA9IChJQ2xhc3NGaWxlKXVuaXQ7Ci0JCQkJCQkJCWlmKGN1IT1teVVuaXQpIHsKLQkJCQkJCQkJCWZpbGUgPSBnZXRGaWxlKGN1LmdldFBhdGgoKS50b1N0cmluZygpKTsKLQkJCQkJCQkJCWlmKGZpbGU9PW51bGwpIHsKLQkJCQkJCQkJCQlvdXRzaWRlUGF0aCA9IGN1LmdldFBhdGgoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJCS8vIGxpbmtpbmcgdG8gZmllbGRzIG9mIHRoZSBzYW1lIGNvbXBpbGF0aW9uIHVuaXQKLQkJCQkJCWVsc2UgaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YVNjcmlwdEVsZW1lbnQuRklFTEQpIHsKLQkJCQkJCQlPYmplY3QgY3UgPSAoKElGaWVsZCkgZWxlbWVudCkuZ2V0SmF2YVNjcmlwdFVuaXQoKTsKLQkJCQkJCQlpZiAoY3UgIT0gbnVsbCAmJiBjdS5lcXVhbHMoanNwVHJhbnNsYXRpb24uZ2V0Q29tcGlsYXRpb25Vbml0KCkpKSB7Ci0JCQkJCQkJCXJhbmdlID0gKChJU291cmNlUmVmZXJlbmNlKSBlbGVtZW50KS5nZXRTb3VyY2VSYW5nZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIGxpbmtpbmcgdG8gbWV0aG9kcyBvZiB0aGUgc2FtZSBjb21waWxhdGlvbiB1bml0Ci0JCQkJCQllbHNlIGlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50Lk1FVEhPRCkgewotCQkJCQkJCU9iamVjdCBjdSA9ICgoSUZ1bmN0aW9uKSBlbGVtZW50KS5nZXRKYXZhU2NyaXB0VW5pdCgpOwotCQkJCQkJCWlmIChjdSAhPSBudWxsICYmIGN1LmVxdWFscyhqc3BUcmFuc2xhdGlvbi5nZXRDb21waWxhdGlvblVuaXQoKSkpIHsKLQkJCQkJCQkJcmFuZ2UgPSAoKElTb3VyY2VSZWZlcmVuY2UpIGVsZW1lbnQpLmdldFNvdXJjZVJhbmdlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChyYW5nZSAhPSBudWxsICYmIGZpbGUgIT0gbnVsbCkgewotCQkJCQkJanNwT2Zmc2V0ID0gcmFuZ2UuZ2V0T2Zmc2V0KCk7Ci0JCQkJCQlpZiAoanNwT2Zmc2V0ID49IDApIHsKLQkJCQkJCQlsaW5rID0gbmV3IFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsocmVnaW9uLCBmaWxlLCBuZXcgUmVnaW9uKGpzcE9mZnNldCwgcmFuZ2UuZ2V0TGVuZ3RoKCkpKTsKLQkJCQkJCX0KLQkJCQkJfWVsc2UgaWYgKHJhbmdlIT1udWxsICYmIG91dHNpZGVQYXRoIT1udWxsKSB7Ci0JCQkJCQlqc3BPZmZzZXQgPSByYW5nZS5nZXRPZmZzZXQoKTsKLQkJCQkJCWlmIChqc3BPZmZzZXQgPj0gMCkgewotCQkJCQkJCWxpbmsgPSBuZXcgRXh0ZXJuYWxGaWxlSHlwZXJsaW5rKHJlZ2lvbixvdXRzaWRlUGF0aC50b0ZpbGUoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGptZS5nZXRNZXNzYWdlKCksIGptZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGxpbmsgPT0gbnVsbCkgewotCQkJCWxpbmsgPSBuZXcgSlNEVEh5cGVybGluayhyZWdpb24sIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaW5rOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtEZXRlY3RvciNkZXRlY3RIeXBlcmxpbmtzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIElIeXBlcmxpbmtbXSBkZXRlY3RIeXBlcmxpbmtzKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gcmVnaW9uLCBib29sZWFuIGNhblNob3dNdWx0aXBsZUh5cGVybGlua3MpIHsKLQkJTGlzdCBoeXBlcmxpbmtzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIHRleHRWaWV3ZXIgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpOwotCQkJLy8gY2hlY2sgYW5kIG1ha2Ugc3VyZSB0aGlzIGlzIGEgdmFsaWQgSmF2YSB0eXBlCi0JCQlJSnNUcmFuc2xhdGlvbiBqc3BUcmFuc2xhdGlvbiA9IGdldEpTUFRyYW5zbGF0aW9uKGRvY3VtZW50KTsKLQkJCWlmIChqc3BUcmFuc2xhdGlvbiAhPSBudWxsKSB7Ci0JCQkJLy8gY2hlY2sgaWYgd2UgYXJlIGluIEpTUCBKYXZhIGNvbnRlbnQKLQkJCQkvLyBjaGVjayB0aGF0IHdlIGFyZSBub3QgaW4gaW5kaXJlY3QgSmF2YSBjb250ZW50IChsaWtlCi0JCQkJLy8gaW5jbHVkZWQgZmlsZXMpCi0JCQkJLy8gZ2V0IEphdmEgZWxlbWVudHMKLQkJCQlJSmF2YVNjcmlwdEVsZW1lbnRbXSBlbGVtZW50cyA9IGpzcFRyYW5zbGF0aW9uLmdldEVsZW1lbnRzRnJvbUpzUmFuZ2UocmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWlmIChlbGVtZW50cyAhPSBudWxsICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHsKLQkJCQkJLy8gY3JlYXRlIGEgSlNQSmF2YUh5cGVybGluayBmb3IgZWFjaCBKYXZhIGVsZW1lbnQKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7ICsraSkgewotCQkJCQkJSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCQkJCS8vIGZpbmQgaHlwZXJsaW5rIHJhbmdlIGZvciBKYXZhIGVsZW1lbnQKLQkJCQkJCUlSZWdpb24gaHlwZXJsaW5rUmVnaW9uID0gc2VsZWN0V29yZChkb2N1bWVudCwgcmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCQkJCUlIeXBlcmxpbmsgbGluayA9IGNyZWF0ZUh5cGVybGluayhlbGVtZW50LCBoeXBlcmxpbmtSZWdpb24sIGRvY3VtZW50KTsKLQkJCQkJCWlmIChsaW5rICE9IG51bGwpIHsKLQkJCQkJCQloeXBlcmxpbmtzLmFkZChsaW5rKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoaHlwZXJsaW5rcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChJSHlwZXJsaW5rW10pIGh5cGVybGlua3MudG9BcnJheShuZXcgSUh5cGVybGlua1swXSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYW4gSUZpbGUgZnJvbSB0aGUgZ2l2ZW4gdXJpIGlmIHBvc3NpYmxlLCBudWxsIGlmIGNhbm5vdCBmaW5kIGZpbGUKLQkgKiBmcm9tIHVyaS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVN0cmluZwotCSAqICAgICAgICAgICAgZmlsZSBzeXN0ZW0gcGF0aAotCSAqIEByZXR1cm4gcmV0dXJucyBJRmlsZSBpZiBmaWxlU3RyaW5nIGV4aXN0cyBpbiB0aGUgd29ya3NwYWNlCi0JICovCi0JcHJpdmF0ZSBJRmlsZSBnZXRGaWxlKFN0cmluZyBmaWxlU3RyaW5nKSB7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlpZiAoZmlsZVN0cmluZyAhPSBudWxsKSB7Ci0JCQlJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlU3RyaW5nKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aCAmJiBmaWxlID09IG51bGw7IGkrKykgewotCQkJCWlmIChmaWxlc1tpXS5leGlzdHMoKSkgewotCQkJCQlmaWxlID0gZmlsZXNbaV07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgSlNQIHRyYW5zbGF0aW9uIG9iamVjdAotCSAqIAotCSAqIEByZXR1cm4gSlNQVHJhbnNsYXRpb24gaWYgb25lIGV4aXN0cywgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIElKc1RyYW5zbGF0aW9uIGdldEpTUFRyYW5zbGF0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlJSnNUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IG51bGw7Ci0JCUlET01Nb2RlbCB4bWxNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQlKc1RyYW5zbGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKEpzVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSnNUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQl0cmFuc2xhdGlvbiA9IGFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24odHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJhbnNsYXRpb247Ci0JfQotCQotCS8qKgotCSAqIEphdmEgYWx3YXlzIHNlbGVjdHMgd29yZCB3aGVuIGRlZmluaW5nIHJlZ2lvbgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqIEBwYXJhbSBhbmNob3IKLQkgKiBAcmV0dXJuIElSZWdpb24KLQkgKi8KLQlwcml2YXRlIElSZWdpb24gc2VsZWN0V29yZChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBhbmNob3IpIHsKLQkJdHJ5IHsKLQkJCWludCBvZmZzZXQgPSBhbmNob3I7Ci0JCQljaGFyIGM7Ci0JCQl3aGlsZSAob2Zmc2V0ID49IDApIHsKLQkJCQljID0gZG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXQpOwotCQkJCWlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQktLW9mZnNldDsKLQkJCX0KLQkJCWludCBzdGFydCA9IG9mZnNldDsKLQkJCW9mZnNldCA9IGFuY2hvcjsKLQkJCWludCBsZW5ndGggPSBkb2N1bWVudC5nZXRMZW5ndGgoKTsKLQkJCXdoaWxlIChvZmZzZXQgPCBsZW5ndGgpIHsKLQkJCQljID0gZG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXQpOwotCQkJCWlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkrK29mZnNldDsKLQkJCX0KLQkJCWludCBlbmQgPSBvZmZzZXQ7Ci0JCQlpZiAoc3RhcnQgPT0gZW5kKSB7Ci0JCQkJcmV0dXJuIG5ldyBSZWdpb24oc3RhcnQsIDApOwotCQkJfQotCQkJcmV0dXJuIG5ldyBSZWdpb24oc3RhcnQgKyAxLCBlbmQgLSBzdGFydCAtIDEpOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1VSTEZpbGVIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1VSTEZpbGVIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ3NTFjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9VUkxGaWxlSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0b3JhZ2VFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLWNsYXNzIFVSTEZpbGVIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQlzdGF0aWMgY2xhc3MgU3RvcmFnZUVkaXRvcklucHV0IGltcGxlbWVudHMgSVN0b3JhZ2VFZGl0b3JJbnB1dCB7Ci0JCUlTdG9yYWdlIGZTdG9yYWdlID0gbnVsbDsKLQkJCi0JCVN0b3JhZ2VFZGl0b3JJbnB1dChJU3RvcmFnZSBzdG9yYWdlKSB7Ci0JCQlmU3RvcmFnZSA9IHN0b3JhZ2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJCXJldHVybiBmU3RvcmFnZSAhPSBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBmU3RvcmFnZS5nZXROYW1lKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJU3RvcmFnZSBnZXRTdG9yYWdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJcmV0dXJuIGZTdG9yYWdlOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQkJcmV0dXJuIGZTdG9yYWdlLmdldEZ1bGxQYXRoKCkgIT0gbnVsbCA/IGZTdG9yYWdlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSA6IGZTdG9yYWdlLmdldE5hbWUoKTsKLQkJfQotCX0KLQlzdGF0aWMgY2xhc3MgVVJMU3RvcmFnZSBpbXBsZW1lbnRzIElTdG9yYWdlIHsKLQkJVVJMIGZVUkwgPSBudWxsOwotCQkKLQkJVVJMU3RvcmFnZShVUkwgdXJsKSB7Ci0JCQlmVVJMID0gdXJsOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXN0cmVhbSA9IGZVUkwub3BlblN0cmVhbSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpzVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLkVSUk9SLCBmVVJMLnRvU3RyaW5nKCksIGUpKTsKLQkJCX0KLQkJCXJldHVybiBzdHJlYW07Ci0JCX0KLQkJCi0JCXB1YmxpYyBJUGF0aCBnZXRGdWxsUGF0aCgpIHsKLQkJCXJldHVybiBuZXcgUGF0aChmVVJMLnRvU3RyaW5nKCkpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmV3IFBhdGgoZlVSTC5nZXRGaWxlKCkpLmxhc3RTZWdtZW50KCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQlwcml2YXRlIElSZWdpb24gZlJlZ2lvbjsKLQlwcml2YXRlIFVSTCBmVVJMOwotCQotCXB1YmxpYyBVUkxGaWxlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBVUkwgdXJsKSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZVUkwgPSB1cmw7Ci0JfQotCQotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsKLQkJcmV0dXJuIGZSZWdpb247Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRIeXBlcmxpbmtUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRUeXBlTGFiZWwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjb3BlbigpCi0JICovCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJaWYgKGZVUkwgIT0gbnVsbCkgewotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IFN0b3JhZ2VFZGl0b3JJbnB1dChuZXcgVVJMU3RvcmFnZShmVVJMKSk7Ci0JCQlJRWRpdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCQkJdHJ5IHsKLQkJCQlkZXNjcmlwdG9yID0gSURFLmdldEVkaXRvckRlc2NyaXB0b3IoaW5wdXQuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgaW5wdXQsIGRlc2NyaXB0b3IuZ2V0SWQoKSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1dvcmtzcGFjZUZpbGVIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1dvcmtzcGFjZUZpbGVIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFmMjllYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9Xb3Jrc3BhY2VGaWxlSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuTG9nZ2VyOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLWNsYXNzIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQlwcml2YXRlIElGaWxlIGZGaWxlOwotCXByaXZhdGUgSVJlZ2lvbiBmSGlnaGxpZ2h0UmFuZ2U7Ci0JcHJpdmF0ZSBJUmVnaW9uIGZSZWdpb247Ci0JCi0JcHVibGljIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIElGaWxlIGZpbGUpIHsKLQkJZlJlZ2lvbiA9IHJlZ2lvbjsKLQkJZkZpbGUgPSBmaWxlOwotCX0KLQkKLQlwdWJsaWMgV29ya3NwYWNlRmlsZUh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgSUZpbGUgZmlsZSwgSVJlZ2lvbiByYW5nZSkgewotCQlmUmVnaW9uID0gcmVnaW9uOwotCQlmRmlsZSA9IGZpbGU7Ci0JCWZIaWdobGlnaHRSYW5nZSA9IHJhbmdlOwotCX0KLQkKLQlwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKSB7Ci0JCXJldHVybiBmUmVnaW9uOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJaWYgKGZGaWxlICE9IG51bGwgJiYgZkZpbGUuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IElERS5vcGVuRWRpdG9yKHBhZ2UsIGZGaWxlLCB0cnVlKTsKLQkJCQkvLyBoaWdobGlnaHQgcmFuZ2UgaW4gZWRpdG9yIGlmIHBvc3NpYmxlCi0JCQkJaWYgKGZIaWdobGlnaHRSYW5nZSAhPSBudWxsICYmIGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQkJCSgoSVRleHRFZGl0b3IpIGVkaXRvcikuc2V0SGlnaGxpZ2h0UmFuZ2UoZkhpZ2hsaWdodFJhbmdlLmdldE9mZnNldCgpLCBmSGlnaGxpZ2h0UmFuZ2UuZ2V0TGVuZ3RoKCksIHRydWUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIHBpZS5nZXRNZXNzYWdlKCksIHBpZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9YTUxIeXBlcmxpbmtEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9oeXBlcmxpbmsvWE1MSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY2MDNkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2h5cGVybGluay9YTUxIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuVVJMSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIFhNTEh5cGVybGlua0RldGVjdG9yIGltcGxlbWVudHMgSUh5cGVybGlua0RldGVjdG9yIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBIVFRQX1BST1RPQ09MID0gImh0dHA6Ly8iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBOT19OQU1FU1BBQ0VfU0NIRU1BX0xPQ0FUSU9OID0gIm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU0NIRU1BX0xPQ0FUSU9OID0gInNjaGVtYUxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFhTSV9OQU1FU1BBQ0VfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgaHlwZXJsaW5rCi0JICogCi0JICogQHBhcmFtIHVyaVN0cmluZwotCSAqIEBwYXJhbSBoeXBlcmxpbmtSZWdpb24KLQkgKiBAcmV0dXJuIElIeXBlcmxpbmsKLQkgKi8KLQlwcml2YXRlIElIeXBlcmxpbmsgY3JlYXRlSHlwZXJsaW5rKFN0cmluZyB1cmlTdHJpbmcsIElSZWdpb24gaHlwZXJsaW5rUmVnaW9uLCBJRG9jdW1lbnQgZG9jdW1lbnQsIE5vZGUgbm9kZSkgewotCQlJSHlwZXJsaW5rIGxpbmsgPSBudWxsOwotCQlpZiAoaXNIdHRwKHVyaVN0cmluZykpIHsKLQkJCWxpbmsgPSBuZXcgVVJMSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgdXJpU3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCS8vIHRyeSB0byBsb2NhdGUgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZQotCQkJRmlsZSBzeXN0ZW1GaWxlID0gZ2V0RmlsZUZyb21VcmlTdHJpbmcodXJpU3RyaW5nKTsKLQkJCWlmIChzeXN0ZW1GaWxlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgc3lzdGVtUGF0aCA9IHN5c3RlbUZpbGUuZ2V0UGF0aCgpOwotCQkJCUlGaWxlIGZpbGUgPSBnZXRGaWxlKHN5c3RlbVBhdGgpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJLy8gdGhpcyBpcyBhIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsgc2luY2UgZmlsZSBleGlzdHMgaW4KLQkJCQkJLy8gd29ya3NwYWNlCi0JCQkJCWxpbmsgPSBuZXcgV29ya3NwYWNlRmlsZUh5cGVybGluayhoeXBlcmxpbmtSZWdpb24sIGZpbGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHRoaXMgaXMgYW4gRXh0ZXJuYWxGaWxlSHlwZXJsaW5rIHNpbmNlIGZpbGUgZG9lcyBub3QKLQkJCQkJLy8gZXhpc3QgaW4gd29ya3NwYWNlCi0JCQkJCWxpbmsgPSBuZXcgRXh0ZXJuYWxGaWxlSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgc3lzdGVtRmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBsaW5rOwotCX0KLQkKLQlwdWJsaWMgSUh5cGVybGlua1tdIGRldGVjdEh5cGVybGlua3MoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiByZWdpb24sIGJvb2xlYW4gY2FuU2hvd011bHRpcGxlSHlwZXJsaW5rcykgewotCQkvLyBmb3Igbm93LCBvbmx5IGNhcGFibGUgb2YgY3JlYXRpbmcgMSBoeXBlcmxpbmsKLQkJTGlzdCBoeXBlcmxpbmtzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIHRleHRWaWV3ZXIgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpOwotCQkJTm9kZSBjdXJyZW50Tm9kZSA9IGdldEN1cnJlbnROb2RlKGRvY3VtZW50LCByZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdXJpU3RyaW5nID0gbnVsbDsKLQkJCQlpZiAoY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJCQkvLyBkb2N0eXBlIG5vZGVzCi0JCQkJCXVyaVN0cmluZyA9IGdldFVSSVN0cmluZyhjdXJyZW50Tm9kZSwgZG9jdW1lbnQpOwotCQkJCX0gZWxzZSBpZiAoY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkvLyBlbGVtZW50IG5vZGVzCi0JCQkJCUF0dHIgY3VycmVudEF0dHIgPSBnZXRDdXJyZW50QXR0ck5vZGUoY3VycmVudE5vZGUsIHJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJCWlmIChjdXJyZW50QXR0ciAhPSBudWxsKSB7Ci0JCQkJCQkvLyB0cnkgdG8gZmluZCBsaW5rIGZvciBjdXJyZW50IGF0dHJpYnV0ZQotCQkJCQkJLy8gcmVzb2x2ZSBhdHRyaWJ1dGUgdmFsdWUKLQkJCQkJCXVyaVN0cmluZyA9IGdldFVSSVN0cmluZyhjdXJyZW50QXR0ciwgZG9jdW1lbnQpOwotCQkJCQkJLy8gdmVyaWZ5IHZhbGlkaXR5IG9mIHVyaSBzdHJpbmcKLQkJCQkJCWlmICh1cmlTdHJpbmcgPT0gbnVsbCB8fCAhaXNWYWxpZFVSSSh1cmlTdHJpbmcpKSB7Ci0JCQkJCQkJLy8gcmVzZXQgY3VycmVudCBhdHRyaWJ1dGUKLQkJCQkJCQljdXJyZW50QXR0ciA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGN1cnJlbnRBdHRyID09IG51bGwpIHsKLQkJCQkJCS8vIHRyeSB0byBmaW5kIGEgbGlua2FibGUgYXR0cmlidXRlIHdpdGhpbiBlbGVtZW50Ci0JCQkJCQljdXJyZW50QXR0ciA9IGdldExpbmthYmxlQXR0cigoRWxlbWVudCkgY3VycmVudE5vZGUpOwotCQkJCQkJaWYgKGN1cnJlbnRBdHRyICE9IG51bGwpIHsKLQkJCQkJCQl1cmlTdHJpbmcgPSBnZXRVUklTdHJpbmcoY3VycmVudEF0dHIsIGRvY3VtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljdXJyZW50Tm9kZSA9IGN1cnJlbnRBdHRyOwotCQkJCX0KLQkJCQkvLyB0cnkgdG8gY3JlYXRlIGh5cGVybGluayBmcm9tIGluZm9ybWF0aW9uIGdhdGhlcmVkCi0JCQkJaWYgKHVyaVN0cmluZyAhPSBudWxsICYmIGN1cnJlbnROb2RlICE9IG51bGwgJiYgaXNWYWxpZFVSSSh1cmlTdHJpbmcpKSB7Ci0JCQkJCUlSZWdpb24gaHlwZXJsaW5rUmVnaW9uID0gZ2V0SHlwZXJsaW5rUmVnaW9uKGN1cnJlbnROb2RlKTsKLQkJCQkJSUh5cGVybGluayBoeXBlcmxpbmsgPSBjcmVhdGVIeXBlcmxpbmsodXJpU3RyaW5nLCBoeXBlcmxpbmtSZWdpb24sIGRvY3VtZW50LCBjdXJyZW50Tm9kZSk7Ci0JCQkJCWlmIChoeXBlcmxpbmsgIT0gbnVsbCkgewotCQkJCQkJaHlwZXJsaW5rcy5hZGQoaHlwZXJsaW5rKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoaHlwZXJsaW5rcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChJSHlwZXJsaW5rW10pIGh5cGVybGlua3MudG9BcnJheShuZXcgSUh5cGVybGlua1swXSk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgYmFzZSBsb2NhdGlvbiBmcm9tIHRoZSBjdXJyZW50IG1vZGVsIChsb2NhbCBmaWxlIHN5c3RlbSkKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRCYXNlTG9jYXRpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCVN0cmluZyBiYXNlTG9jID0gbnVsbDsKLQkJLy8gZ2V0IHRoZSBiYXNlIGxvY2F0aW9uIGZyb20gdGhlIGN1cnJlbnQgbW9kZWwKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlJUGF0aCBsb2NhdGlvbiA9IG5ldyBQYXRoKHNNb2RlbC5nZXRCYXNlTG9jYXRpb24oKSk7Ci0JCQkJaWYgKGxvY2F0aW9uLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJCWJhc2VMb2MgPSBsb2NhdGlvbi50b1N0cmluZygpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChsb2NhdGlvbi5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQkJCWJhc2VMb2MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobG9jYXRpb24pLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWJhc2VMb2MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkuYXBwZW5kKGxvY2F0aW9uKS50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBiYXNlTG9jOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdGhlIENNRWxlbWVudERlY2xhcmF0aW9uIGZvciBhbiBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHJpdmF0ZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBudWxsOwotCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCWlmIChtcSAhPSBudWxsKSB7Ci0JCQllZCA9IG1xLmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBlZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXR0cmlidXRlIG5vZGUgd2l0aGluIG5vZGUgYXQgb2Zmc2V0Ci0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiBBdHRyCi0JICovCi0JcHJpdmF0ZSBBdHRyIGdldEN1cnJlbnRBdHRyTm9kZShOb2RlIG5vZGUsIGludCBvZmZzZXQpIHsKLQkJaWYgKChub2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlKS5jb250YWlucyhvZmZzZXQpICYmIChub2RlLmhhc0F0dHJpYnV0ZXMoKSkpIHsKLQkJCU5hbWVkTm9kZU1hcCBhdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJLy8gZ28gdGhyb3VnaCBlYWNoIGF0dHJpYnV0ZSBpbiBub2RlIGFuZCBpZiBhdHRyaWJ1dGUgY29udGFpbnMKLQkJCS8vIG9mZnNldCwgcmV0dXJuIHRoYXQgYXR0cmlidXRlCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyArK2kpIHsKLQkJCQkvLyBhc3N1bXB0aW9uIHRoYXQgaWYgcGFyZW50IG5vZGUgaXMgb2YgdHlwZSBJbmRleGVkUmVnaW9uLAotCQkJCS8vIHRoZW4gaXRzIGF0dHJpYnV0ZXMgd2lsbCBhbHNvIGJlIG9mIHR5cGUgSW5kZXhlZFJlZ2lvbgotCQkJCUluZGV4ZWRSZWdpb24gYXR0UmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIGF0dHJzLml0ZW0oaSk7Ci0JCQkJaWYgKGF0dFJlZ2lvbi5jb250YWlucyhvZmZzZXQpKSB7Ci0JCQkJCXJldHVybiAoQXR0cikgYXR0cnMuaXRlbShpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5vZGUgdGhlIGN1cnNvciBpcyBjdXJyZW50bHkgb24gaW4gdGhlIGRvY3VtZW50LiBudWxsIGlmIG5vCi0JICogbm9kZSBpcyBzZWxlY3RlZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIE5vZGUgZWl0aGVyIGVsZW1lbnQsIGRvY3R5cGUsIHRleHQsIG9yIG51bGwKLQkgKi8KLQlwcml2YXRlIE5vZGUgZ2V0Q3VycmVudE5vZGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIGdldCB0aGUgY3VycmVudCBub2RlIGF0IHRoZSBvZmZzZXQgKHJldHVybnMgZWl0aGVyOiBlbGVtZW50LAotCQkvLyBkb2N0eXBlLCB0ZXh0KQotCQlJbmRleGVkUmVnaW9uIGlub2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpbm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCk7Ci0JCQlpZiAoaW5vZGUgPT0gbnVsbCkgewotCQkJCWlub2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0IC0gMSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGlub2RlIGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuIChOb2RlKSBpbm9kZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBJRmlsZSBmcm9tIHRoZSBnaXZlbiB1cmkgaWYgcG9zc2libGUsIG51bGwgaWYgY2Fubm90IGZpbmQgZmlsZQotCSAqIGZyb20gdXJpLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlU3RyaW5nCi0JICogICAgICAgICAgICBmaWxlIHN5c3RlbSBwYXRoCi0JICogQHJldHVybiByZXR1cm5zIElGaWxlIGlmIGZpbGVTdHJpbmcgZXhpc3RzIGluIHRoZSB3b3Jrc3BhY2UKLQkgKi8KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoU3RyaW5nIGZpbGVTdHJpbmcpIHsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWlmIChmaWxlU3RyaW5nICE9IG51bGwpIHsKLQkJCUlGaWxlW10gZmlsZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uKG5ldyBQYXRoKGZpbGVTdHJpbmcpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoICYmIGZpbGUgPT0gbnVsbDsgaSsrKSB7Ci0JCQkJaWYgKGZpbGVzW2ldLmV4aXN0cygpKSB7Ci0JCQkJCWZpbGUgPSBmaWxlc1tpXTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhIGZpbGUgZnJvbSB0aGUgZ2l2ZW4gdXJpIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSB1cmlTdHJpbmcgLQotCSAqICAgICAgICAgICAgYXNzdW1lcyB1cmlTdHJpbmcgaXMgbm90IGh0dHA6Ly8KLQkgKiBAcmV0dXJuIEZpbGUgY3JlYXRlZCBmcm9tIHVyaVN0cmluZyBpZiBwb3NzaWJsZSwgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIEZpbGUgZ2V0RmlsZUZyb21VcmlTdHJpbmcoU3RyaW5nIHVyaVN0cmluZykgewotCQlGaWxlIGZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJLy8gZmlyc3QganVzdCB0cnkgdG8gY3JlYXRlIGEgZmlsZSBkaXJlY3RseSBmcm9tIHVyaVN0cmluZyBhcwotCQkJLy8gZGVmYXVsdCBpbiBjYXNlIGNyZWF0ZSBmaWxlIGZyb20gdXJpIGRvZXMgbm90IHdvcmsKLQkJCWZpbGUgPSBuZXcgRmlsZSh1cmlTdHJpbmcpOwotCQkJLy8gdHJ5IHRvIGNyZWF0ZSBmaWxlIGZyb20gdXJpCi0JCQlVUkkgdXJpID0gbmV3IFVSSSh1cmlTdHJpbmcpOwotCQkJZmlsZSA9IG5ldyBGaWxlKHVyaSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZiBleGNlcHRpb24gaXMgdGhyb3duIHdoaWxlIHRyeWluZyB0byBjcmVhdGUgRmlsZSBqdXN0IGlnbm9yZQotCQkJLy8gYW5kIGZpbGUgd2lsbCBiZSBudWxsCi0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCQotCXByaXZhdGUgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oTm9kZSBub2RlKSB7Ci0JCUlSZWdpb24gaHlwZXJSZWdpb24gPSBudWxsOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmIChub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJCS8vIGhhbmRsZSBkb2MgdHlwZSBub2RlCi0JCQkJSURPTU5vZGUgZG9jTm9kZSA9IChJRE9NTm9kZSkgbm9kZTsKLQkJCQloeXBlclJlZ2lvbiA9IG5ldyBSZWdpb24oZG9jTm9kZS5nZXRTdGFydE9mZnNldCgpLCBkb2NOb2RlLmdldEVuZE9mZnNldCgpIC0gZG9jTm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCX0gZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCS8vIGhhbmRsZSBhdHRyaWJ1dGUgbm9kZXMKLQkJCQlJRE9NQXR0ciBhdHQgPSAoSURPTUF0dHIpIG5vZGU7Ci0JCQkJLy8gZG8gbm90IGluY2x1ZGUgcXVvdGVzIGluIGF0dHJpYnV0ZSB2YWx1ZSByZWdpb24KLQkJCQlpbnQgcmVnT2Zmc2V0ID0gYXR0LmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQkJCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IGF0dC5nZXRWYWx1ZVJlZ2lvbigpOwotCQkJCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWludCByZWdMZW5ndGggPSB2YWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCVN0cmluZyBhdHRWYWx1ZSA9IGF0dC5nZXRWYWx1ZVJlZ2lvblRleHQoKTsKLQkJCQkJaWYgKFN0cmluZ1V0aWxzLmlzUXVvdGVkKGF0dFZhbHVlKSkgewotCQkJCQkJKytyZWdPZmZzZXQ7Ci0JCQkJCQlyZWdMZW5ndGggPSByZWdMZW5ndGggLSAyOwotCQkJCQl9Ci0JCQkJCWh5cGVyUmVnaW9uID0gbmV3IFJlZ2lvbihyZWdPZmZzZXQsIHJlZ0xlbmd0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBoeXBlclJlZ2lvbjsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gZmluZCBhbiBhdHRyaWJ1dGUgd2l0aGluIGVsZW1lbnQgdGhhdCBpcyBvcGVuYWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCAtCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbAotCSAqIEByZXR1cm4gQXR0ciBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgdXNlZCBmb3Igb3BlbiBvbiwgbnVsbCBpZiBubyBhdHRyaWJ1dGUKLQkgKiAgICAgICAgIGNvdWxkIGJlIGZvdW5kCi0JICovCi0JcHJpdmF0ZSBBdHRyIGdldExpbmthYmxlQXR0cihFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJLy8gZ2V0IHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgZm9yIHRoaXMgbm9kZQotCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgKytpKSB7Ci0JCQkvLyBjaGVjayBpZiB0aGlzIGF0dHJpYnV0ZSBpcyAib3Blbk9uLWFibGUiCi0JCQlBdHRyIGF0dCA9IChBdHRyKSBhdHRycy5pdGVtKGkpOwotCQkJaWYgKGlzTGlua2FibGVBdHRyKGF0dCwgZWQpKSB7Ci0JCQkJcmV0dXJuIGF0dDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogRmluZCB0aGUgbG9jYXRpb24gaGludCBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZVVSSSBpZiBpdCBleGlzdHMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudE5vZGUgLQotCSAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwKLQkgKiBAcGFyYW0gbmFtZXNwYWNlVVJJIC0KLQkgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsCi0JICogQHJldHVybiBsb2NhdGlvbiBoaW50IChzeXN0ZW1JZCkgaWYgaXQgd2FzIGZvdW5kLCBudWxsIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldExvY2F0aW9uSGludChFbGVtZW50IGVsZW1lbnROb2RlLCBTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCUF0dHIgc2NoZW1hTG9jTm9kZSA9IGVsZW1lbnROb2RlLmdldEF0dHJpYnV0ZU5vZGVOUyhYU0lfTkFNRVNQQUNFX1VSSSwgU0NIRU1BX0xPQ0FUSU9OKTsKLQkJaWYgKHNjaGVtYUxvY05vZGUgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzY2hlbWFMb2NOb2RlLmdldFZhbHVlKCkpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBwdWJsaWNJZCA9IHN0Lmhhc01vcmVUb2tlbnMoKSA/IHN0Lm5leHRUb2tlbigpIDogbnVsbDsKLQkJCQlTdHJpbmcgc3lzdGVtSWQgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7Ci0JCQkJLy8gZm91bmQgbG9jYXRpb24gaGludAotCQkJCWlmIChuYW1lc3BhY2VVUkkuZXF1YWxzSWdub3JlQ2FzZShwdWJsaWNJZCkpIHsKLQkJCQkJcmV0dXJuIHN5c3RlbUlkOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJJIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSBub2RlIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgbm90IG51bGwKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRVUklTdHJpbmcoTm9kZSBub2RlLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJU3RyaW5nIHJlc29sdmVkVVJJID0gbnVsbDsKLQkJLy8gbmVlZCB0aGUgYmFzZSBsb2NhdGlvbiwgcHVibGljSWQsIGFuZCBzeXN0ZW1JZCBmb3IgVVJJUmVzb2x2ZXIKLQkJU3RyaW5nIGJhc2VMb2MgPSBudWxsOwotCQlTdHJpbmcgcHVibGljSWQgPSBudWxsOwotCQlTdHJpbmcgc3lzdGVtSWQgPSBudWxsOwotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJLy8gaGFuZGxlIGRvYyB0eXBlIG5vZGUKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQliYXNlTG9jID0gZ2V0QmFzZUxvY2F0aW9uKGRvY3VtZW50KTsKLQkJCXB1YmxpY0lkID0gKChEb2N1bWVudFR5cGUpIG5vZGUpLmdldFB1YmxpY0lkKCk7Ci0JCQlzeXN0ZW1JZCA9ICgoRG9jdW1lbnRUeXBlKSBub2RlKS5nZXRTeXN0ZW1JZCgpOwotCQl9IGVsc2UgaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCS8vIGhhbmRsZSBhdHRyaWJ1dGUgbm9kZQotCQkJQXR0ciBhdHRyTm9kZSA9IChBdHRyKSBub2RlOwotCQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ck5vZGUuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IGF0dHJOb2RlLmdldFZhbHVlKCk7Ci0JCQlhdHRyVmFsdWUgPSBTdHJpbmdVdGlscy5zdHJpcChhdHRyVmFsdWUpOwotCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsICYmIGF0dHJWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQliYXNlTG9jID0gZ2V0QmFzZUxvY2F0aW9uKGRvY3VtZW50KTsKLQkJCQkvLyBoYW5kbGUgc2NoZW1hTG9jYXRpb24gYXR0cmlidXRlCi0JCQkJU3RyaW5nIHByZWZpeCA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRQcmVmaXgoYXR0ck5hbWUpOwotCQkJCVN0cmluZyB1bnByZWZpeGVkTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZShhdHRyTmFtZSk7Ci0JCQkJaWYgKChYTUxOUy5lcXVhbHMocHJlZml4KSkgfHwgKFhNTE5TLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpKSB7Ci0JCQkJCXB1YmxpY0lkID0gYXR0clZhbHVlOwotCQkJCQlzeXN0ZW1JZCA9IGdldExvY2F0aW9uSGludChhdHRyTm9kZS5nZXRPd25lckVsZW1lbnQoKSwgcHVibGljSWQpOwotCQkJCQlpZiAoc3lzdGVtSWQgPT0gbnVsbCkgewotCQkJCQkJc3lzdGVtSWQgPSBhdHRyVmFsdWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKChYU0lfTkFNRVNQQUNFX1VSSS5lcXVhbHMoRE9NTmFtZXNwYWNlSGVscGVyLmdldE5hbWVzcGFjZVVSSShhdHRyTm9kZSkpKSAmJiAoU0NIRU1BX0xPQ0FUSU9OLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpKSB7Ci0JCQkJCS8vIGZvciBub3cganVzdCB1c2UgdGhlIGZpcnN0IHBhaXIKLQkJCQkJLy8gbmVlZCB0byBsb29rIGludG8gYmVpbmcgbW9yZSBwcmVjaXNlCi0JCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0clZhbHVlKTsKLQkJCQkJcHVibGljSWQgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7Ci0JCQkJCXN5c3RlbUlkID0gc3QuaGFzTW9yZVRva2VucygpID8gc3QubmV4dFRva2VuKCkgOiBudWxsOwotCQkJCQkvLyBlbHNlIGNoZWNrIGlmIHhtbG5zIHB1YmxpY0lkID0gdmFsdWUKLQkJCQl9IGVsc2UgewotCQkJCQlzeXN0ZW1JZCA9IGF0dHJWYWx1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmVzb2x2ZWRVUkkgPSByZXNvbHZlVVJJKGJhc2VMb2MsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCXJldHVybiByZXNvbHZlZFVSSTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdXJpU3RyaW5nIGlzIGFuIGh0dHAgc3RyaW5nCi0JICogCi0JICogQHBhcmFtIHVyaVN0cmluZwotCSAqIEByZXR1cm4gdHJ1ZSBpZiB1cmlTdHJpbmcgaXMgaHR0cCBzdHJpbmcsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0h0dHAoU3RyaW5nIHVyaVN0cmluZykgewotCQlib29sZWFuIGlzSHR0cCA9IGZhbHNlOwotCQlpZiAodXJpU3RyaW5nICE9IG51bGwpIHsKLQkJCVN0cmluZyB0ZW1wU3RyaW5nID0gdXJpU3RyaW5nLnRvTG93ZXJDYXNlKCk7Ci0JCQlpZiAodGVtcFN0cmluZy5zdGFydHNXaXRoKEhUVFBfUFJPVE9DT0wpKSB7Ci0JCQkJaXNIdHRwID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNIdHRwOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgaXMgb3BlbmFibGUuIEF0dHJpYnV0ZSBpcyBvcGVuYWJsZQotCSAqIGlmIGl0IGlzIGEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGF0dHJpYnV0ZSBvciBpZiB0aGUgYXR0cmlidXRlIHZhbHVlIGlzCi0JICogb2YgdHlwZSBVUkkuCi0JICogCi0JICogQHBhcmFtIGF0dHIKLQkgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsCi0JICogQHBhcmFtIGNtRWxlbWVudAotCSAqICAgICAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBhdHRyaWJ1dGUgKGNhbiBiZQotCSAqICAgICAgICAgICAgbnVsbCkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgIm9wZW5Pbi1hYmxlIiBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNMaW5rYWJsZUF0dHIoQXR0ciBhdHRyLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBjbUVsZW1lbnQpIHsKLQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0JCVN0cmluZyBwcmVmaXggPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0UHJlZml4KGF0dHJOYW1lKTsKLQkJU3RyaW5nIHVucHJlZml4ZWROYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKGF0dHJOYW1lKTsKLQkJLy8gZGV0ZXJtaW5lIGlmIGF0dHJpYnV0ZSBpcyBuYW1lc3BhY2UgZGVjbGFyYXRpb24KLQkJaWYgKChYTUxOUy5lcXVhbHMocHJlZml4KSkgfHwgKFhNTE5TLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBkZXRlcm1pbmUgaWYgYXR0cmlidXRlIGNvbnRhaW5zIHNjaGVtYSBsb2NhdGlvbgotCQlpZiAoKFhTSV9OQU1FU1BBQ0VfVVJJLmVxdWFscyhET01OYW1lc3BhY2VIZWxwZXIuZ2V0TmFtZXNwYWNlVVJJKGF0dHIpKSkgJiYgKChTQ0hFTUFfTE9DQVRJT04uZXF1YWxzKHVucHJlZml4ZWROYW1lKSkgfHwgKE5PX05BTUVTUEFDRV9TQ0hFTUFfTE9DQVRJT04uZXF1YWxzKHVucHJlZml4ZWROYW1lKSkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBkZXRlcm1pbmUgaWYgYXR0cmlidXRlIHZhbHVlIGlzIG9mIHR5cGUgVVJJCi0JCWlmIChjbUVsZW1lbnQgIT0gbnVsbCkgewotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbUVsZW1lbnQuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCQlpZiAoKGF0dHJEZWNsICE9IG51bGwpICYmIChhdHRyRGVjbC5nZXRBdHRyVHlwZSgpICE9IG51bGwpICYmIChDTURhdGFUeXBlLlVSSS5lcXVhbHMoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKS5nZXREYXRhVHlwZU5hbWUoKSkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdXJpU3RyaW5nIGlzIHJlYWxseSBwb2ludGluZyB0byBhIGZpbGUKLQkgKiAKLQkgKiBAcGFyYW0gdXJpU3RyaW5nCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRVUkkoU3RyaW5nIHVyaVN0cmluZykgewotCQlib29sZWFuIGlzVmFsaWQgPSBmYWxzZTsKLQkJaWYgKGlzSHR0cCh1cmlTdHJpbmcpKSB7Ci0JCQlpc1ZhbGlkID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCUZpbGUgZmlsZSA9IGdldEZpbGVGcm9tVXJpU3RyaW5nKHVyaVN0cmluZyk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJaXNWYWxpZCA9IGZpbGUuaXNGaWxlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlzVmFsaWQ7Ci0JfQotCQotCS8qKgotCSAqIFJlc29sdmVzIHRoZSBnaXZlbiBVUkkgaW5mb3JtYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZUxvY2F0aW9uCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogQHBhcmFtIHN5c3RlbUlkCi0JICogQHJldHVybiBTdHJpbmcgcmVzb2x2ZWQgdXJpLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJLy8gZG9udCByZXNvbHZlIGlmIHRoZXJlJ3Mgbm90aGluZyB0byByZXNvbHZlCi0JCWlmICgoYmFzZUxvY2F0aW9uID09IG51bGwpICYmIChwdWJsaWNJZCA9PSBudWxsKSAmJiAoc3lzdGVtSWQgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTY1ZjdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkRvY3VtZW50Q2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSnNTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkU3RyZWFtQ3JlYXRvcjsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgZXh0ZW5kcyBTZWFyY2hSZXF1ZXN0b3IgewotCS8qKgotCSAqIENoYW5nZSBjbGFzcyB0aGF0IHdyYXBzIGEgdGV4dCBlZGl0IG9uIHRoZSBqc3AgZG9jdW1lbnQKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFJlbmFtZUNoYW5nZSBleHRlbmRzIERvY3VtZW50Q2hhbmdlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgZkRlc2NyaXB0aW9uID0gSnNVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMDsKLQkJcHJpdmF0ZSBUZXh0RWRpdCBmRWRpdCA9IG51bGw7Ci0JCXByaXZhdGUgSURvY3VtZW50IGZKU1BEb2MgPSBudWxsOwotCQlwcml2YXRlIElGaWxlIGZKU1BGaWxlID0gbnVsbDsKLQkJCi0JCXB1YmxpYyBSZW5hbWVDaGFuZ2UoSUZpbGUganNwRmlsZSwgSURvY3VtZW50IGpzcERvYywgVGV4dEVkaXQgZWRpdCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQlzdXBlcihKc1VJTWVzc2FnZXMuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl82LCBqc3BEb2MpOwotCQkJdGhpcy5mRWRpdCA9IGVkaXQ7Ci0JCQl0aGlzLmZKU1BGaWxlID0ganNwRmlsZTsKLQkJCXRoaXMuZkpTUERvYyA9IGpzcERvYzsKLQkJCXRoaXMuZkRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKLQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mRGVzY3JpcHRpb247Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgSURvY3VtZW50IGdldFByZXZpZXdEb2N1bWVudChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJRG9jdW1lbnQgY29weURvYyA9IG5ldyBEb2N1bWVudChmSlNQRG9jLmdldCgpKTsKLQkJCXRyeSB7Ci0JCQkJZkVkaXQuYXBwbHkoY29weURvYyk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJCXJldHVybiBjb3B5RG9jOwotCQl9Ci0JCQotCQkvKioKLQkJICogQ2hlY2tzIGlmIGEgZG9jdW1lbnQgaXMgb3BlbiBpbiBhbiBlZGl0b3IKLQkJICogCi0JCSAqIEBwYXJhbSBqc3BEb2MKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIGlzT3BlbkluRWRpdG9yKElEb2N1bWVudCBqc3BEb2MpIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3dbXSB3aW5kb3dzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRXb3JrYmVuY2hXaW5kb3dzKCk7Ci0JCQlJV29ya2JlbmNoV2luZG93IHcgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3aW5kb3dzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdyA9IHdpbmRvd3NbaV07Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHcuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQkJSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBwYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gbnVsbDsKLQkJCQkJT2JqZWN0IG8gPSBudWxsOwotCQkJCQlJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZlcmVuY2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQllZGl0b3IgPSByZWZlcmVuY2VzW2pdLmdldEVkaXRvcih0cnVlKTsKLQkJCQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zNzY0Ci0JCQkJCQkvLyB1c2UgYWRhcHRlciB0byBnZXQgSVRleHRFZGl0b3IgKGZvciB0aGluZ3MgbGlrZQotCQkJCQkJLy8gcGFnZSBkZXNpZ25lcikKLQkJCQkJCW8gPSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQkJCQlpZiAobyAhPSBudWxsICYmIG8gaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJCQkJCWRvYyA9ICgoSVRleHRFZGl0b3IpIG8pLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCQkJaWYgKGRvYyAhPSBudWxsICYmIGRvYy5lcXVhbHMoanNwRG9jKSkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgaXNWYWxpZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJUmVuYW1lQ2hhbmdlIHVuZG9DaGFuZ2UgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpZiAoIWlzT3BlbkluRWRpdG9yKHRoaXMuZkpTUERvYykpIHsKLQkJCQkJLy8gYXBwbHkgZWRpdCB0byBKU1AgZG9jIEFORCBzYXZlIG1vZGVsCi0JCQkJCXVuZG9DaGFuZ2UgPSBuZXcgUmVuYW1lQ2hhbmdlKHRoaXMuZkpTUEZpbGUsIHRoaXMuZkpTUERvYywgdGhpcy5mRWRpdC5hcHBseShmSlNQRG9jKSwgdGhpcy5mRGVzY3JpcHRpb24pOwotCQkJCQlzYXZlRmlsZSh0aGlzLmZKU1BGaWxlLCB0aGlzLmZKU1BEb2MpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGp1c3QgYXBwbHkgZWRpdCB0byBKU1AgZG9jdW1lbnQKLQkJCQkJdW5kb0NoYW5nZSA9IG5ldyBSZW5hbWVDaGFuZ2UodGhpcy5mSlNQRmlsZSwgdGhpcy5mSlNQRG9jLCB0aGlzLmZFZGl0LmFwcGx5KGZKU1BEb2MpLCB0aGlzLmZEZXNjcmlwdGlvbik7Ci0JCQkJfQotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJcmV0dXJuIHVuZG9DaGFuZ2U7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBQZXJmb3JtZWQgaW4gYW4gb3BlcmF0aW9uIHNpbmNlIGl0IG1vZGlmaWVzIHJlc291cmNlcyBpbiB0aGUKLQkJICogd29ya3NwYWNlCi0JCSAqIAotCQkgKiBAcGFyYW0ganNwRG9jCi0JCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNhdmVGaWxlKElGaWxlIGpzcEZpbGUsIElEb2N1bWVudCBqc3BEb2MpIHsKLQkJCVNhdmVKc3BGaWxlT3Agb3AgPSBuZXcgU2F2ZUpzcEZpbGVPcChqc3BGaWxlLCBqc3BEb2MpOwotCQkJdHJ5IHsKLQkJCQlvcC5ydW4oSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCS8vIGVuZCBpbm5lciBjbGFzcyBTYXZlSnNwRmlsZU9wCi0JLyoqCi0JICogV29ya3NwYWNlIG9wZXJhdGlvbiB0byBwZXJmb3JtIHNhdmUgb24gbW9kZWwgZm9yIHVwZGF0ZWQgZG9jdW1lbnRzLgotCSAqIFNob3VsZCBvbmx5IGJlIGRvbmUgb24gbW9kZWxzIG5vdCBvcGVuIGluIGFuIGVkaXRvci4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFNhdmVKc3BGaWxlT3AgZXh0ZW5kcyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gewotCQlwcml2YXRlIElEb2N1bWVudCBmSlNQRG9jID0gbnVsbDsKLQkJcHJpdmF0ZSBJRmlsZSBmSlNQRmlsZSA9IG51bGw7Ci0JCQotCQlwdWJsaWMgU2F2ZUpzcEZpbGVPcChJRmlsZSBqc3BGaWxlLCBJRG9jdW1lbnQganNwRG9jKSB7Ci0JCQl0aGlzLmZKU1BEb2MgPSBqc3BEb2M7Ci0JCQl0aGlzLmZKU1BGaWxlID0ganNwRmlsZTsKLQkJfQotCQkKLQkJCi0JCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM3NjUKLQkJCS8vIHNhdmUgZmlsZSB3LyBubyBpbnRlcm1lZGlhdGUgbW9kZWwgY3JlYXRpb24KLQkJCUNvZGVkU3RyZWFtQ3JlYXRvciBjb2RlZFN0cmVhbUNyZWF0b3IgPSBuZXcgQ29kZWRTdHJlYW1DcmVhdG9yKCk7Ci0JCQlSZWFkZXIgcmVhZGVyID0gbmV3IERvY3VtZW50UmVhZGVyKHRoaXMuZkpTUERvYyk7Ci0JCQljb2RlZFN0cmVhbUNyZWF0b3Iuc2V0KHRoaXMuZkpTUEZpbGUsIHJlYWRlcik7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gY29kZWRCeXRlU3RyZWFtID0gbnVsbDsKLQkJCUlucHV0U3RyZWFtIGNvZGVkU3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJY29kZWRCeXRlU3RyZWFtID0gY29kZWRTdHJlYW1DcmVhdG9yLmdldENvZGVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJY29kZWRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29kZWRCeXRlU3RyZWFtLnRvQnl0ZUFycmF5KCkpOwotCQkJCWlmICh0aGlzLmZKU1BGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCXRoaXMuZkpTUEZpbGUuc2V0Q29udGVudHMoY29kZWRTdHJlYW0sIHRydWUsIHRydWUsIG51bGwpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRoaXMuZkpTUEZpbGUuY3JlYXRlKGNvZGVkU3RyZWFtLCBmYWxzZSwgbnVsbCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlpZiAoY29kZWRCeXRlU3RyZWFtICE9IG51bGwpIHsKLQkJCQkJCWNvZGVkQnl0ZVN0cmVhbS5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJCWlmIChjb2RlZFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJCQljb2RlZFN0cmVhbS5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyB1bmxpa2VseQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkvLyBlbmQgaW5uZXIgY2xhc3MgUmVuYW1lQ2hhbmdlCi0JLyoqIFRoZSB0eXBlIGJlaW5nIHJlbmFtZWQgKHRoZSBvbGQgdHlwZSkgKi8KLQlJSmF2YVNjcmlwdEVsZW1lbnQgZkVsZW1lbnQgPSBudWxsOwotCS8qKiBUaGUgbmV3IG5hbWUgb2YgdGhlIHR5cGUgYmVpbmcgcmVuYW1lZCAqLwotCXByaXZhdGUgU3RyaW5nIGZOZXdOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkvKiogbWFwcyBhIEpTUFNlYXJjaERvY3VtZW50IHBhdGggLT4gTXVsdGlUZXh0RWRpdCBmb3IgdGhlIGphdmEgZmlsZSAqLwotCXByaXZhdGUgSGFzaE1hcCBmU2VhcmNoRG9jUGF0aDJKYXZhRWRpdE1hcCA9IG51bGw7Ci0JCi0JcHVibGljIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IoSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMuZk5ld05hbWUgPSBuZXdOYW1lOwotCQl0aGlzLmZFbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5mU2VhcmNoRG9jUGF0aDJKYXZhRWRpdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yI2FjY2VwdFNlYXJjaE1hdGNoKG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoKQotCSAqLwotCQotCXB1YmxpYyB2b2lkIGFjY2VwdFNlYXJjaE1hdGNoKFNlYXJjaE1hdGNoIGphdmFNYXRjaCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgbWF0Y2hEb2N1bWVudFBhdGggPSBqYXZhTWF0Y2guZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCVNlYXJjaERvY3VtZW50IHNlYXJjaERvYyA9IEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFNlYXJjaERvY3VtZW50KG1hdGNoRG9jdW1lbnRQYXRoKTsKLQkJaWYgKHNlYXJjaERvYyAhPSBudWxsICYmIHNlYXJjaERvYyBpbnN0YW5jZW9mIEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlKSB7Ci0JCQlTdHJpbmcgcmVuYW1lVGV4dCA9IGdldFJlbmFtZVRleHQoKEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlKSBzZWFyY2hEb2MsIGphdmFNYXRjaCk7Ci0JCQkvLyBhZGQgaXQgZm9yIHRoZSBjb3JyZWN0IGRvY3VtZW50Ci0JCQlhZGRKYXZhRWRpdChzZWFyY2hEb2MuZ2V0UGF0aCgpLCBuZXcgUmVwbGFjZUVkaXQoamF2YU1hdGNoLmdldE9mZnNldCgpLCBqYXZhTWF0Y2guZ2V0TGVuZ3RoKCksIHJlbmFtZVRleHQpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRvIHRoZSBtdWx0aSBlZGl0IGZvciBhIGdpdmUgamF2YSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gamF2YURvY3VtZW50Ci0JICogQHBhcmFtIGphdmFFZGl0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEphdmFFZGl0KFN0cmluZyBzZWFyY2hEb2NQYXRoLCBSZXBsYWNlRWRpdCBqYXZhRWRpdCkgewotCQlPYmplY3QgbyA9IHRoaXMuZlNlYXJjaERvY1BhdGgySmF2YUVkaXRNYXAuZ2V0KHNlYXJjaERvY1BhdGgpOwotCQlpZiAobyAhPSBudWxsKSB7Ci0JCQlNdWx0aVRleHRFZGl0IG11bHRpID0gKE11bHRpVGV4dEVkaXQpIG87Ci0JCQltdWx0aS5hZGRDaGlsZChqYXZhRWRpdCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyB1c2UgYSBtdWx0aSBlZGl0IHNvIGRvYyBwb3NpdGlvbiBvZmZzZXRzIGdldCB1cGRhdGVkCi0JCQkvLyBhdXRvbWF0aWNhbGx5Ci0JCQkvLyB3aGVuIGFkZGluZyBtdWx0aXBsZSBjaGlsZCBlZGl0cwotCQkJTXVsdGlUZXh0RWRpdCBtdWx0aSA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQltdWx0aS5hZGRDaGlsZChqYXZhRWRpdCk7Ci0JCQl0aGlzLmZTZWFyY2hEb2NQYXRoMkphdmFFZGl0TWFwLnB1dChzZWFyY2hEb2NQYXRoLCBtdWx0aSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBDaGFuZ2UgY3JlYXRlQ2hhbmdlKEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlIHNlYXJjaERvYywgVGV4dEVkaXQgZWRpdCkgewotCQlJRG9jdW1lbnQgZG9jID0gc2VhcmNoRG9jLmdldEpzcFRyYW5zbGF0aW9uKCkuZ2V0SHRtbERvY3VtZW50KCk7Ci0JCVN0cmluZyBmaWxlID0gc2VhcmNoRG9jLmdldEZpbGUoKS5nZXROYW1lKCk7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IGdldERlc2NyaXB0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBkb2N1bWVudCBsaW5lcyBhcmUgMCBiYXNlZAotCQkJU3RyaW5nIGxpbmVOdW1iZXIgPSBJbnRlZ2VyLnRvU3RyaW5nKGRvYy5nZXRMaW5lT2ZPZmZzZXQoZWRpdC5nZXRPZmZzZXQoKSkgKyAxKTsKLQkJCWRlc2NyaXB0aW9uICs9ICIgIiArIE5MUy5iaW5kKEpzVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzEsIG5ldyBTdHJpbmdbXSB7IGZpbGUsIGxpbmVOdW1iZXIgfSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gbmV3IFJlbmFtZUNoYW5nZShzZWFyY2hEb2MuZ2V0RmlsZSgpLCBkb2MsIGVkaXQsIGRlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiBhbGwgSlNQIGNoYW5nZXMgZm9yIHRoZSBzZWFyY2ggbWF0Y2hlcyBmb3IgdGhlIGdpdmVuIFR5cGUKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlW10gZ2V0Q2hhbmdlcygpIHsKLQkJSnNTZWFyY2hTdXBwb3J0IHN1cHBvcnQgPSBKc1NlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJTGlzdCBjaGFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBrZXlzID0gZlNlYXJjaERvY1BhdGgySmF2YUVkaXRNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nIHNlYXJjaERvY1BhdGggPSBudWxsOwotCQlTZWFyY2hEb2N1bWVudCBkZWxlZ2F0ZSA9IG51bGw7Ci0JCXdoaWxlIChrZXlzLmhhc05leHQoKSkgewotCQkJLy8gY3JlYXRlIG9uIHRoZSBmbHkKLQkJCXNlYXJjaERvY1BhdGggPSAoU3RyaW5nKSBrZXlzLm5leHQoKTsKLQkJCU11bHRpVGV4dEVkaXQgamF2YUVkaXQgPSAoTXVsdGlUZXh0RWRpdCkgZlNlYXJjaERvY1BhdGgySmF2YUVkaXRNYXAuZ2V0KHNlYXJjaERvY1BhdGgpOwotCQkJZGVsZWdhdGUgPSBzdXBwb3J0LmdldFNlYXJjaERvY3VtZW50KHNlYXJjaERvY1BhdGgpOwotCQkJaWYgKGRlbGVnYXRlICE9IG51bGwgJiYgZGVsZWdhdGUgaW5zdGFuY2VvZiBKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSkgewotCQkJCUpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlIGphdmFEZWxlZ2F0ZSA9IChKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSkgZGVsZWdhdGU7Ci0JCQkJY2hhbmdlcy5hZGQoY3JlYXRlQ2hhbmdlKGphdmFEZWxlZ2F0ZSwgamF2YUVkaXQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKENoYW5nZVtdKSBjaGFuZ2VzLnRvQXJyYXkobmV3IENoYW5nZVtjaGFuZ2VzLnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byBiZXR0ZXIgZGVzY3JpYmUgdGhlIGNoYW5nZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBJSmF2YVNjcmlwdEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZkVsZW1lbnQ7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIG5ldyBuYW1lIGZvciB0aGUgVHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmV3TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZk5ld05hbWU7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzZWFyY2hEb2MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZW5hbWVUZXh0KEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlIHNlYXJjaERvYywgU2VhcmNoTWF0Y2ggamF2YU1hdGNoKSB7Ci0JCXJldHVybiBnZXROZXdOYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUEphdmFTZWxlY3Rpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUEphdmFTZWxlY3Rpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTk1MzBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BKYXZhU2VsZWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1jbGFzcyBKU1BKYXZhU2VsZWN0aW9uUHJvdmlkZXIgewotCXN0YXRpYyBJSmF2YVNjcmlwdEVsZW1lbnRbXSBnZXRTZWxlY3Rpb24oSVRleHRFZGl0b3IgdGV4dEVkaXRvcikgewotCQlJSmF2YVNjcmlwdEVsZW1lbnRbXSBlbGVtZW50cyA9IG51bGw7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCS8vIGdldCB0aGUgSlNQIHRyYW5zbGF0aW9uIG9iamVjdCBmb3IgdGhpcyBlZGl0b3IncyBkb2N1bWVudAotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJCUlET01Nb2RlbCB4bWxNb2RlbCA9IChJRE9NTW9kZWwpIG1vZGVsOwotCQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJSnNUcmFuc2xhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChKc1RyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpzVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlJSnNUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IGFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24odHJ1ZSk7Ci0JCQkJCQllbGVtZW50cyA9IHRyYW5zbGF0aW9uLmdldEVsZW1lbnRzRnJvbUpzUmFuZ2UodGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCWVsZW1lbnRzID0gbmV3IElKYXZhU2NyaXB0RWxlbWVudFswXTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZUNoYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZUNoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDdhZmNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JRnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSnNTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5Kc1NlYXJjaFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BNZXRob2RSZW5hbWVDaGFuZ2UgZXh0ZW5kcyBDaGFuZ2UgewotCXB1YmxpYyBzdGF0aWMgQ2hhbmdlW10gY3JlYXRlQ2hhbmdlc0ZvcihJRnVuY3Rpb24gbWV0aG9kLCBTdHJpbmcgbmV3TmFtZSkgewotCQlKc1NlYXJjaFN1cHBvcnQgc3VwcG9ydCA9IEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCQkvLyBzaG91bGQgYmUgaGFuZGxlZCBieSBKU1BJbmRleE1hbmFnZXIKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTMwMzYKLQkJLy8gc3VwcG9ydC5pbmRleFdvcmtzcGFjZUFuZFdhaXQoKTsKLQkJQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgSlNQTWV0aG9kUmVuYW1lUmVxdWVzdG9yKG1ldGhvZCwgbmV3TmFtZSk7Ci0JCXN1cHBvcnQuc2VhcmNoUnVubmFibGUobWV0aG9kLCBuZXcgSnNTZWFyY2hTY29wZSgpLCByZXF1ZXN0b3IpOwotCQlyZXR1cm4gcmVxdWVzdG9yLmdldENoYW5nZXMoKTsKLQl9Ci0JCi0JCi0JcHVibGljIE9iamVjdCBnZXRNb2RpZmllZEVsZW1lbnQoKSB7Ci0JCS8vIHBhX1RPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpzVUlNZXNzYWdlcy5KU1BfY2hhbmdlczsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkvLyBwYV9UT0RPIGltcGxlbWVudAotCS8vIG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gZGVjaWRlIGNvcnJlY3QgdmFsdWUgb2YgaXNWYWxpZAotCX0KLQkKLQkKLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgaXNWYWxpZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JCS8vIFRoaXMgbWV0aG9kIG11c3QgZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBvYmplY3QgaXMgc3RpbGwgdmFsaWQuCi0JCS8vIFRoaXMgaXMgaW4gcGFydGljdWxhciBpbnRlcmVzdGluZyB3aGVuIHBlcmZvcm1pbmcgYW4gdW5kbyBjaGFuZ2UKLQkJLy8gc2luY2UgdGhlIHdvcmtzcGFjZSBjb3VsZCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIHVuZG8gY2hhbmdlIGhhcwotCQkvLyBiZWVuIGNyZWF0ZWQuCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0JCi0JCi0JcHVibGljIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gcGFfVE9ETyByZXR1cm4gdGhlICJ1bmRvIiBjaGFuZ2UgaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2Y3ZGRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSA2LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Db21wb3NpdGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUZ1bmN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmUuSUphdmFXZWJOb2RlOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQTWV0aG9kUmVuYW1lUGFydGljaXBhbnQgZXh0ZW5kcyBSZW5hbWVQYXJ0aWNpcGFudCB7Ci0JcHJpdmF0ZSBJRnVuY3Rpb24gZk1ldGhvZCA9IG51bGw7Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjaGVja0NvbmRpdGlvbnMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsCi0JICogICAgICBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dCkKLQkgKi8KLQkKLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NyZWF0ZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQkKLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUNoYW5nZVtdIGNoYW5nZXMgPSBKU1BNZXRob2RSZW5hbWVDaGFuZ2UuY3JlYXRlQ2hhbmdlc0Zvcih0aGlzLmZNZXRob2QsIGdldEFyZ3VtZW50cygpLmdldE5ld05hbWUoKSk7Ci0JCUNvbXBvc2l0ZUNoYW5nZSBtdWx0aUNoYW5nZSA9IG51bGw7Ci0JCWlmIChjaGFuZ2VzLmxlbmd0aCA+IDApIHsKLQkJCW11bHRpQ2hhbmdlID0gbmV3IENvbXBvc2l0ZUNoYW5nZShKc1VJTWVzc2FnZXMuSlNQX2NoYW5nZXMsIGNoYW5nZXMpOwotCQl9Ci0JCXJldHVybiBtdWx0aUNoYW5nZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNnZXROYW1lKCkKLQkgKi8KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRoaXMuZk1ldGhvZCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW5hbWUgPSB0aGlzLmZNZXRob2QuZ2V0U291cmNlKCk7Ci0JCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCQotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRnVuY3Rpb24pIHsKLQkJCXRoaXMuZk1ldGhvZCA9IChJRnVuY3Rpb24pIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVdlYk5vZGUpIHsKLQkJCWlmKCgoSUphdmFXZWJOb2RlKWVsZW1lbnQpLmdldEphdmFFbGVtZW50KCkgaW5zdGFuY2VvZiBJRnVuY3Rpb24pIHsKLQkJCQl0aGlzLmZNZXRob2QgPSAoSUZ1bmN0aW9uKSAoKElKYXZhV2ViTm9kZSllbGVtZW50KS5nZXRKYXZhRWxlbWVudCgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZTY4MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZVJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BNZXRob2RSZW5hbWVSZXF1ZXN0b3IgZXh0ZW5kcyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yIHsKLQlwdWJsaWMgSlNQTWV0aG9kUmVuYW1lUmVxdWVzdG9yKElKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmV3TmFtZSkgewotCQlzdXBlcihlbGVtZW50LCBuZXdOYW1lKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlTdHJpbmcgbWV0aG9kTmFtZSA9IGdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQlTdHJpbmcgbmV3TmFtZSA9IGdldE5ld05hbWUoKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSnNVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMywgbmV3IFN0cmluZ1tdIHsgbWV0aG9kTmFtZSwgbmV3TmFtZSB9KTsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbmFtZVRleHQoSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUgc2VhcmNoRG9jLCBTZWFyY2hNYXRjaCBqYXZhTWF0Y2gpIHsKLQkJU3RyaW5nIGphdmFUZXh0ID0gc2VhcmNoRG9jLmdldEpzcFRyYW5zbGF0aW9uKCkuZ2V0SnNUZXh0KCk7Ci0JCVN0cmluZyBtZXRob2RUZXh0ID0gamF2YVRleHQuc3Vic3RyaW5nKGphdmFNYXRjaC5nZXRPZmZzZXQoKSwgamF2YU1hdGNoLmdldE9mZnNldCgpICsgamF2YU1hdGNoLmdldExlbmd0aCgpKTsKLQkJU3RyaW5nIG1ldGhvZFN1ZmZpeCA9IG1ldGhvZFRleHQuc3Vic3RyaW5nKG1ldGhvZFRleHQuaW5kZXhPZigiKCIpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZ2V0TmV3TmFtZSgpICsgbWV0aG9kU3VmZml4OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNb3ZlRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTW92ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjc5YTEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNb3ZlRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5QbGF0Zm9ybVN0YXR1c0xpbmVVdGlsOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBBbiBhY3Rpb24gZGVsZWdhdGUgdGhhdCBsYXVuY2hlcyBKRFQgbW92ZSBlbGVtZW50IHdpemFyZAotICogCi0gKiBTdGlsbCByZWxpZXMgaGVhdmlseSBvbiBpbnRlcm5hbCBBUEkgd2lsbCBjaGFuZ2UgcG9zdCAzLjAgd2l0aCBwdWJsaWMgbW92ZQotICogc3VwcG9ydCBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NjE4MTcKLSAqLwotcHVibGljIGNsYXNzIEpTUE1vdmVFbGVtZW50QWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJRWRpdG9yQWN0aW9uRGVsZWdhdGUsIElBY3Rpb25EZWxlZ2F0ZTIsIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCS8vIHByaXZhdGUgSUVkaXRvclBhcnQgZkVkaXRvcjsKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCS8vIG51bGxpbmcgb3V0IGp1c3QgaW4gY2FzZQotCS8vIGZFZGl0b3IgPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoSnNVSU1lc3NhZ2VzLk1vdmVFbGVtZW50X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChKc1VJTWVzc2FnZXMuTW92ZUVsZW1lbnRfbGFiZWwpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkvLyBkbyBub3RoaW5nCi0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCS8vIG5vLW9wIHVudGlsIHdlIGtub3cgaG93IHdlJ3JlIHN1cHBvc2VkIHRvIHVzZSB0aGlzCi0JLy8gZWNsaXBzZSAzLjJNNQotCS8vIHB1YmxpYyBtb3ZlIHN1cHBvcnQ6Ci0JLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxODE3Ci0JLy8gSUphdmFTY3JpcHRFbGVtZW50W10gZWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKCk7Ci0JLy8gaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHsKLQkvLwotCS8vIC8vIG5lZWQgdG8gY2hlY2sgaWYgaXQncyBtb3ZhYmxlCi0JLy8gdHJ5IHsKLQkvLyBKYXZhTW92ZVByb2Nlc3NvciBwcm9jZXNzb3IgPQotCS8vIEphdmFNb3ZlUHJvY2Vzc29yLmNyZWF0ZShnZXRSZXNvdXJjZXMoZWxlbWVudHMpLCBlbGVtZW50cyk7Ci0JLy8JCQkJCi0JLy8gU2hlbGwgcGFyZW50ID0KLQkvLyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JLy8gTW92ZVJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nID0gbmV3IE1vdmVSZWZhY3RvcmluZyhwcm9jZXNzb3IpOwotCS8vCi0JLy8gUmVmYWN0b3JpbmdXaXphcmQgd2l6YXJkID0gY3JlYXRlV2l6YXJkKHJlZmFjdG9yaW5nKTsKLQkvLwotCS8vIC8qCi0JLy8gKiBXZSB3YW50IHRvIGdldCB0aGUgc2hlbGwgZnJvbSB0aGUgcmVmYWN0b3JpbmcgZGlhbG9nIGJ1dAotCS8vICogaXQncyBub3Qga25vd24gYXQgdGhpcyBwb2ludCwgc28gd2UgcGFzcyB0aGUgd2l6YXJkIGFuZAotCS8vICogdGhlbiwgb25jZSB0aGUgZGlhbG9nIGlzIG9wZW4sIHdlIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gaXRzCi0JLy8gKiBzaGVsbC4KLQkvLyAqLwotCS8vCi0JLy8gcHJvY2Vzc29yLnNldENyZWF0ZVRhcmdldFF1ZXJpZXMobmV3IENyZWF0ZVRhcmdldFF1ZXJpZXMod2l6YXJkKSk7Ci0JLy8gcHJvY2Vzc29yLnNldFJlb3JnUXVlcmllcyhuZXcgUmVvcmdRdWVyaWVzKHdpemFyZCkpOwotCS8vIC8vIFN0cmluZyBvcGVuUmVmYWN0b3JpbmdXaXpNc2cgPQotCS8vIC8vCi0JLy8gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIk9wZW5SZWZhY3RvcmluZ1dpemFyZEFjdGlvbi5yZWZhY3RvcmluZyIpOwotCS8vIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyBTdHJpbmcgb3BlblJlZmFjdG9yaW5nV2l6TXNnID0gSlNQVUlNZXNzYWdlcy5Nb3ZlRWxlbWVudFdpemFyZDsgLy8KLQkvLyAiTW92ZQotCS8vIC8vIHRoZQotCS8vIC8vIHNlbGVjdGVkCi0JLy8gLy8gZWxlbWVudHMiOwotCS8vIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyBuZXcgUmVmYWN0b3JpbmdTdGFydGVyKCkuYWN0aXZhdGUocmVmYWN0b3JpbmcsIHdpemFyZCwgcGFyZW50LAotCS8vIG9wZW5SZWZhY3RvcmluZ1dpek1zZywgdHJ1ZSk7Ci0JLy8KLQkvLyBQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmNsZWFyU3RhdHVzTGluZSgpOwotCS8vCi0JLy8gfQotCS8vIGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotCS8vIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JLy8gfQotCS8vIH0KLQkvLyBlbHNlIHsKLQkvLyBQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlFcnJvck1lc3NhZ2UoSlNQVUlNZXNzYWdlcy5KU1BNb3ZlRWxlbWVudEFjdGlvbl8wKTsKLQkvLyAvLyROT04tTkxTLTEkCi0JLy8gfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bihhY3Rpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmNsZWFyU3RhdHVzTGluZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCS8vIGZFZGl0b3IgPSB0YXJnZXRFZGl0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVDaGFuZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BQYWNrYWdlUmVuYW1lQ2hhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOGEzNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpzU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSnNTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQUGFja2FnZVJlbmFtZUNoYW5nZSBleHRlbmRzIENoYW5nZSB7Ci0JcHVibGljIHN0YXRpYyBDaGFuZ2VbXSBjcmVhdGVDaGFuZ2VzRm9yKElQYWNrYWdlRnJhZ21lbnQgcGtnLCBTdHJpbmcgbmV3TmFtZSkgewotCQlKc1NlYXJjaFN1cHBvcnQgc3VwcG9ydCA9IEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCQkvLyBzaG91bGQgYmUgaGFuZGxlZCBieSBKU1BJbmRleE1hbmFnZXIKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTMwMzYKLQkJLy8gc3VwcG9ydC5pbmRleFdvcmtzcGFjZUFuZFdhaXQoKTsKLQkJQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgSlNQUGFja2FnZVJlbmFtZVJlcXVlc3Rvcihwa2csIG5ld05hbWUpOwotCQlzdXBwb3J0LnNlYXJjaFJ1bm5hYmxlKHBrZywgbmV3IEpzU2VhcmNoU2NvcGUoKSwgcmVxdWVzdG9yKTsKLQkJcmV0dXJuIHJlcXVlc3Rvci5nZXRDaGFuZ2VzKCk7Ci0JfQotCQotCQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQkvLyByZXR1cm4gdGhpcy5wa2c7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKc1VJTWVzc2FnZXMuSlNQX2NoYW5nZXM7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkvLyBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGRlY2lkZSBjb3JyZWN0IHZhbHVlIG9mIGlzVmFsaWQKLQl9Ci0JCi0JCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBwYV9UT0RPIGltcGxlbWVudAotCQkvLyBUaGlzIG1ldGhvZCBtdXN0IGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2Ugb2JqZWN0IGlzIHN0aWxsIHZhbGlkLgotCQkvLyBUaGlzIGlzIGluIHBhcnRpY3VsYXIgaW50ZXJlc3Rpbmcgd2hlbiBwZXJmb3JtaW5nIGFuIHVuZG8gY2hhbmdlCi0JCS8vIHNpbmNlIHRoZSB3b3Jrc3BhY2UgY291bGQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSB1bmRvIGNoYW5nZSBoYXMKLQkJLy8gYmVlbiBjcmVhdGVkLgotCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JfQotCQotCQotCXB1YmxpYyBDaGFuZ2UgcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gcmV0dXJuIHRoZSAidW5kbyIgY2hhbmdlIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjFmNzNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BQYWNrYWdlUmVuYW1lUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogUmVtZW1iZXIgdG8gY2hhbmdlIHRoZSBwbHVnaW4ueG1sIGZpbGUgaWYgdGhlIG5hbWUgb2YgdGhpcyBjbGFzcyBjaGFuZ2VzLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQUGFja2FnZVJlbmFtZVBhcnRpY2lwYW50IGV4dGVuZHMgUmVuYW1lUGFydGljaXBhbnQgewotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudCBmUGtnID0gbnVsbDsKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NoZWNrQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0KQotCSAqLwotCQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0NvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSwgQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY3JlYXRlQ2hhbmdlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCQotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQ2hhbmdlW10gY2hhbmdlcyA9IEpTUFBhY2thZ2VSZW5hbWVDaGFuZ2UuY3JlYXRlQ2hhbmdlc0Zvcih0aGlzLmZQa2csIGdldEFyZ3VtZW50cygpLmdldE5ld05hbWUoKSk7Ci0JCUNvbXBvc2l0ZUNoYW5nZSBtdWx0aUNoYW5nZSA9IG51bGw7Ci0JCWlmIChjaGFuZ2VzLmxlbmd0aCA+IDApIHsKLQkJCW11bHRpQ2hhbmdlID0gbmV3IENvbXBvc2l0ZUNoYW5nZShKc1VJTWVzc2FnZXMuSlNQX2NoYW5nZXMsIGNoYW5nZXMpOwotCQl9Ci0JCXJldHVybiBtdWx0aUNoYW5nZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNnZXROYW1lKCkKLQkgKi8KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRoaXMuZlBrZyAhPSBudWxsKSB7Ci0JCQluYW1lID0gdGhpcy5mUGtnLmdldEVsZW1lbnROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCQotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7Ci0JCQl0aGlzLmZQa2cgPSAoSVBhY2thZ2VGcmFnbWVudCkgZWxlbWVudDsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZVJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZhNDU5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZVJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQYWNrYWdlUmVuYW1lUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciB7Ci0JLyoqCi0JICogRWxlbWVudCBpcyB0aGUgb2xkIHBhY2thZ2UuIG5ld05hbWUgaXMgdGhlIG5ldyBwYWNrYWdlIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gbmV3TmFtZQotCSAqLwotCXB1YmxpYyBKU1BQYWNrYWdlUmVuYW1lUmVxdWVzdG9yKElKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmV3TmFtZSkgewotCQlzdXBlcihlbGVtZW50LCBuZXdOYW1lKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IjZ2V0RGVzY3JpcHRpb24oKQotCSAqLwotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IGdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQlTdHJpbmcgbmV3TmFtZSA9IGdldE5ld05hbWUoKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gTkxTLmJpbmQoSnNVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNSwgKG5ldyBTdHJpbmdbXSB7IHBhY2thZ2VOYW1lLCBuZXdOYW1lIH0pKTsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BSZW5hbWVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BSZW5hbWVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZkMmZiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUmVuYW1lRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JRnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkucmVmYWN0b3JpbmcuUmVuYW1lU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLlBsYXRmb3JtU3RhdHVzTGluZVV0aWw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNQUmVuYW1lRWxlbWVudEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUyLCBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbnVsbGluZyBvdXQganVzdCBpbiBjYXNlCi0JCWZFZGl0b3IgPSBudWxsOwotCX0KLQkKLQlwcml2YXRlIElKYXZhU2NyaXB0RWxlbWVudCBnZXRTZWxlY3RlZEVsZW1lbnQoKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJaWYgKGZFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJSUphdmFTY3JpcHRFbGVtZW50W10gZWxlbWVudHMgPSBKU1BKYXZhU2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKChJVGV4dEVkaXRvcikgZkVkaXRvcik7Ci0JCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDEpIHsKLQkJCQllbGVtZW50ID0gZWxlbWVudHNbMF07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChKc1VJTWVzc2FnZXMuUmVuYW1lRWxlbWVudF9sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoSnNVSU1lc3NhZ2VzLlJlbmFtZUVsZW1lbnRfbGFiZWwpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkvLyBkbyBub3RoaW5nCi0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCA9IGdldFNlbGVjdGVkRWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlSZW5hbWVTdXBwb3J0IHJlbmFtZVN1cHBvcnQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzd2l0Y2ggKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJCQljYXNlIElKYXZhU2NyaXB0RWxlbWVudC5UWVBFOgotCQkJCQkJcmVuYW1lU3VwcG9ydCA9IFJlbmFtZVN1cHBvcnQuY3JlYXRlKChJVHlwZSkgZWxlbWVudCwgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLCBSZW5hbWVTdXBwb3J0LlVQREFURV9SRUZFUkVOQ0VTKTsKLQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSUphdmFTY3JpcHRFbGVtZW50Lk1FVEhPRDoKLQkJCQkJCXJlbmFtZVN1cHBvcnQgPSBSZW5hbWVTdXBwb3J0LmNyZWF0ZSgoSUZ1bmN0aW9uKSBlbGVtZW50LCBlbGVtZW50LmdldEVsZW1lbnROYW1lKCksIFJlbmFtZVN1cHBvcnQuVVBEQVRFX1JFRkVSRU5DRVMpOwotCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJSmF2YVNjcmlwdEVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVDoKLQkJCQkJCXJlbmFtZVN1cHBvcnQgPSBSZW5hbWVTdXBwb3J0LmNyZWF0ZSgoSVBhY2thZ2VGcmFnbWVudCkgZWxlbWVudCwgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLCBSZW5hbWVTdXBwb3J0LlVQREFURV9SRUZFUkVOQ0VTKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChyZW5hbWVTdXBwb3J0ICE9IG51bGwpIHsKLQkJCQkJcmVuYW1lU3VwcG9ydC5vcGVuRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSk7Ci0JCQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuZGlzcGxheUVycm9yTWVzc2FnZShKc1VJTWVzc2FnZXMuSlNQUmVuYW1lRWxlbWVudEFjdGlvbl8wKTsKLQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuYWRkT25lVGltZUNsZWFyTGlzdGVuZXIoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bihhY3Rpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmNsZWFyU3RhdHVzTGluZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZUNoYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlQ2hhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYWEzOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlQ2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSnNTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5Kc1NlYXJjaFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlTW92ZUNoYW5nZSBleHRlbmRzIENoYW5nZSB7Ci0JcHVibGljIHN0YXRpYyBDaGFuZ2VbXSBjcmVhdGVDaGFuZ2VzRm9yKElUeXBlIHR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCUpzU2VhcmNoU3VwcG9ydCBzdXBwb3J0ID0gSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCS8vIHNob3VsZCBiZSBoYW5kbGVkIGJ5IEpTUEluZGV4TWFuYWdlcgotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzAzNgotCQkvLyBzdXBwb3J0LmluZGV4V29ya3NwYWNlQW5kV2FpdCgpOwotCQlKU1BUeXBlTW92ZVJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgSlNQVHlwZU1vdmVSZXF1ZXN0b3IodHlwZSwgbmV3TmFtZSk7Ci0JCXN1cHBvcnQuc2VhcmNoUnVubmFibGUodHlwZSwgbmV3IEpzU2VhcmNoU2NvcGUoKSwgcmVxdWVzdG9yKTsKLQkJcmV0dXJuIHJlcXVlc3Rvci5nZXRDaGFuZ2VzKCk7Ci0JfQotCQotCQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSnNVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEoSVByb2dyZXNzTW9uaXRvciBwbSkgewotCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JLy8gbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBkZWNpZGUgY29ycmVjdCB2YWx1ZSBvZiBpc1ZhbGlkCi0JfQotCQotCQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBpc1ZhbGlkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkJLy8gVGhpcyBtZXRob2QgbXVzdCBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIG9iamVjdCBpcyBzdGlsbCB2YWxpZC4KLQkJLy8gVGhpcyBpcyBpbiBwYXJ0aWN1bGFyIGludGVyZXN0aW5nIHdoZW4gcGVyZm9ybWluZyBhbiB1bmRvIGNoYW5nZQotCQkvLyBzaW5jZSB0aGUgd29ya3NwYWNlIGNvdWxkIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgdW5kbyBjaGFuZ2UgaGFzCi0JCS8vIGJlZW4gY3JlYXRlZC4KLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQkKLQkKLQlwdWJsaWMgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIHJldHVybiB0aGUgInVuZG8iIGNoYW5nZSBoZXJlCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDg4ZTQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNvbXBvc2l0ZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuTW92ZVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpTUFR5cGVNb3ZlUGFydGljaXBhbnQgZXh0ZW5kcyBNb3ZlUGFydGljaXBhbnQgewotCUlUeXBlIGZUeXBlID0gbnVsbDsKLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NoZWNrQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0KQotCSAqLwotCQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0NvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSwgQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY3JlYXRlQ2hhbmdlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCQotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHBtICE9IG51bGwgJiYgcG0uaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlDb21wb3NpdGVDaGFuZ2UgbXVsdGlDaGFuZ2UgPSBudWxsOwotCQlPYmplY3QgZGVzdCA9IGdldEFyZ3VtZW50cygpLmdldERlc3RpbmF0aW9uKCk7Ci0JCWlmIChkZXN0IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgewotCQkJQ2hhbmdlW10gY2hhbmdlcyA9IEpTUFR5cGVNb3ZlQ2hhbmdlLmNyZWF0ZUNoYW5nZXNGb3IoZlR5cGUsICgoSVBhY2thZ2VGcmFnbWVudCkgZGVzdCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQlpZiAoY2hhbmdlcy5sZW5ndGggPiAwKSB7Ci0JCQkJbXVsdGlDaGFuZ2UgPSBuZXcgQ29tcG9zaXRlQ2hhbmdlKEpzVUlNZXNzYWdlcy5KU1BfY2hhbmdlcywgY2hhbmdlcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG11bHRpQ2hhbmdlOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2dldE5hbWUoKQotCSAqLwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGhpcy5mVHlwZSAhPSBudWxsKSB7Ci0JCQluYW1lID0gdGhpcy5mVHlwZS5nZXRFbGVtZW50TmFtZSgpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2luaXRpYWxpemUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpIHsKLQkJCXRoaXMuZlR5cGUgPSAoSVR5cGUpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc2MDgwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuamF2YS5Kc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlTW92ZVJlcXVlc3RvciBleHRlbmRzIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgewotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIG5ld05hbWUKLQkgKi8KLQlwdWJsaWMgSlNQVHlwZU1vdmVSZXF1ZXN0b3IoSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuZXdQYWNrYWdlKSB7Ci0JCXN1cGVyKGVsZW1lbnQsIG5ld1BhY2thZ2UpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IjZ2V0RGVzY3JpcHRpb24oKQotCSAqLwotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IGdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQlTdHJpbmcgbmV3TmFtZSA9IGdldE5ld05hbWUoKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSnNVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMiwgbmV3IFN0cmluZ1tdIHsgdHlwZU5hbWUsIG5ld05hbWUgfSk7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZW5hbWVUZXh0KEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlIHNlYXJjaERvYywgU2VhcmNoTWF0Y2ggamF2YU1hdGNoKSB7Ci0JCVN0cmluZyByZW5hbWVUZXh0ID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JLy8JSnNUcmFuc2xhdGlvbiB0cmFucyA9IHNlYXJjaERvYy5nZXRKc3BUcmFuc2xhdGlvbigpOwotCQkvL1N0cmluZyBtYXRjaFRleHQgPSB0cmFucy5nZXRKc1RleHQoKS5zdWJzdHJpbmcoamF2YU1hdGNoLmdldE9mZnNldCgpLCBqYXZhTWF0Y2guZ2V0T2Zmc2V0KCkgKyBqYXZhTWF0Y2guZ2V0TGVuZ3RoKCkpOwotCQkvLyBpZiBpdCdzIGFuIGltcG9ydCBvciBqc3A6dXNlQmVhbiwgd2UgbmVlZCB0byBhZGQgdGhlIHBhY2thZ2UgbmFtZSBhcwotCQkvLyB3ZWxsCi0vLyBpZiAodHJhbnMuaXNJbXBvcnQoamF2YU1hdGNoLmdldE9mZnNldCgpKQotLy8JCQkKLS8vIHx8IGlzRnVsbHlRdWFsaWZpZWQobWF0Y2hUZXh0KSkgewotLy8gaWYgKCFnZXROZXdOYW1lKCkuZXF1YWxzKCIiKSkgewotLy8gLy8gZ2V0TmV3TmFtZSgpIGlzIHRoZSBwa2cgbmFtZQotLy8gcmVuYW1lVGV4dCA9IGdldE5ld05hbWUoKSArICIuIiArIHJlbmFtZVRleHQ7IC8vJE5PTi1OTFMtMSQKLS8vIH0KLS8vIH0KLQkJcmV0dXJuIHJlbmFtZVRleHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVDaGFuZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlUmVuYW1lQ2hhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYWQ4OGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5Kc1NlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpzU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSU1lc3NhZ2VzOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFR5cGVSZW5hbWVDaGFuZ2UgZXh0ZW5kcyBDaGFuZ2UgewotCXB1YmxpYyBzdGF0aWMgQ2hhbmdlW10gY3JlYXRlQ2hhbmdlc0ZvcihJVHlwZSB0eXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlKc1NlYXJjaFN1cHBvcnQgc3VwcG9ydCA9IEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCQkvLyBzaG91bGQgYmUgaGFuZGxlZCBieSBKU1BJbmRleE1hbmFnZXIKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTMwMzYKLQkJLy8gc3VwcG9ydC5pbmRleFdvcmtzcGFjZUFuZFdhaXQoKTsKLQkJSlNQVHlwZVJlbmFtZVJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgSlNQVHlwZVJlbmFtZVJlcXVlc3Rvcih0eXBlLCBuZXdOYW1lKTsKLQkJc3VwcG9ydC5zZWFyY2hSdW5uYWJsZSh0eXBlLCBuZXcgSnNTZWFyY2hTY29wZSgpLCByZXF1ZXN0b3IpOwotCQlyZXR1cm4gcmVxdWVzdG9yLmdldENoYW5nZXMoKTsKLQl9Ci0JCi0JCi0JcHVibGljIE9iamVjdCBnZXRNb2RpZmllZEVsZW1lbnQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpzVUlNZXNzYWdlcy5KU1BfY2hhbmdlczsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkvLyBwYV9UT0RPIGltcGxlbWVudAotCS8vIG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gZGVjaWRlIGNvcnJlY3QgdmFsdWUgb2YgaXNWYWxpZAotCX0KLQkKLQkKLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgaXNWYWxpZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JCS8vIFRoaXMgbWV0aG9kIG11c3QgZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBvYmplY3QgaXMgc3RpbGwgdmFsaWQuCi0JCS8vIFRoaXMgaXMgaW4gcGFydGljdWxhciBpbnRlcmVzdGluZyB3aGVuIHBlcmZvcm1pbmcgYW4gdW5kbyBjaGFuZ2UKLQkJLy8gc2luY2UgdGhlIHdvcmtzcGFjZSBjb3VsZCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIHVuZG8gY2hhbmdlIGhhcwotCQkvLyBiZWVuIGNyZWF0ZWQuCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0JCi0JCi0JcHVibGljIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyByZXR1cm4gdGhlICJ1bmRvIiBjaGFuZ2UgaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YTQ2ZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Db21wb3NpdGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0TW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLkpzVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZS5JSmF2YVdlYk5vZGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBSZW1lbWJlciB0byBjaGFuZ2UgdGhlIHBsdWdpbi54bWwgZmlsZSBpZiB0aGUgbmFtZSBvZiB0aGlzIGNsYXNzIGNoYW5nZXMuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlUmVuYW1lUGFydGljaXBhbnQgZXh0ZW5kcyBSZW5hbWVQYXJ0aWNpcGFudCB7Ci0JcHJpdmF0ZSBJVHlwZSBmVHlwZSA9IG51bGw7Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjaGVja0NvbmRpdGlvbnMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsCi0JICogICAgICBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dCkKLQkgKi8KLQkKLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NyZWF0ZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQkKLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUNoYW5nZVtdIGNoYW5nZXMgPSBKU1BUeXBlUmVuYW1lQ2hhbmdlLmNyZWF0ZUNoYW5nZXNGb3IoZlR5cGUsIGdldEFyZ3VtZW50cygpLmdldE5ld05hbWUoKSk7Ci0JCUNvbXBvc2l0ZUNoYW5nZSBtdWx0aUNoYW5nZSA9IG51bGw7Ci0JCWlmIChjaGFuZ2VzLmxlbmd0aCA+IDApIHsKLQkJCW11bHRpQ2hhbmdlID0gbmV3IENvbXBvc2l0ZUNoYW5nZShKc1VJTWVzc2FnZXMuSlNQX2NoYW5nZXMsIGNoYW5nZXMpOwotCQl9Ci0JCXJldHVybiBtdWx0aUNoYW5nZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNnZXROYW1lKCkKLQkgKi8KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRoaXMuZlR5cGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQluYW1lID0gdGhpcy5mVHlwZS5nZXRTb3VyY2UoKTsKLQkJCX0gY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNpbml0aWFsaXplKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKSB7Ci0JCQl0aGlzLmZUeXBlID0gKElUeXBlKSBlbGVtZW50OwotCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFXZWJOb2RlKSB7Ci0JCQlpZigoKElKYXZhV2ViTm9kZSllbGVtZW50KS5nZXRKYXZhRWxlbWVudCgpIGluc3RhbmNlb2YgSVR5cGUpIHsKLQkJCQl0aGlzLmZUeXBlID0gKElUeXBlKSAoKElKYXZhV2ViTm9kZSllbGVtZW50KS5nZXRKYXZhRWxlbWVudCgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNTE4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLmphdmEuSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5KU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSU1lc3NhZ2VzOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBDcmVhdGVzIGRvY3VtZW50IGNoYW5nZShzKSBmb3IgYSB0eXBlIHJlbmFtZS4gQ2hhbmdlcyBhcmUgY3JlYXRlZCBmb3IgZXZlcnkKLSAqIHR5cGUgIm1hdGNoIiBpbiB0aGUgd29ya3NwYWNlCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlUmVuYW1lUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciB7Ci0JcHVibGljIEpTUFR5cGVSZW5hbWVSZXF1ZXN0b3IoSVR5cGUgdHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJc3VwZXIodHlwZSwgbmV3TmFtZSk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJU3RyaW5nIHR5cGVOYW1lID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCVN0cmluZyBuZXdOYW1lID0gZ2V0TmV3TmFtZSgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChKc1VJTWVzc2FnZXMuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl80LCBuZXcgU3RyaW5nW10geyB0eXBlTmFtZSwgbmV3TmFtZSB9KTsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbmFtZVRleHQoSlNEVFNlYXJjaERvY3VtZW50RGVsZWdhdGUgc2VhcmNoRG9jLCBTZWFyY2hNYXRjaCBqYXZhTWF0Y2gpIHsKLQkJU3RyaW5nIHJlbmFtZVRleHQgPSBnZXROZXdOYW1lKCk7Ci0JLy8JU3RyaW5nIHBrZyA9IGdldFR5cGUoKS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCS8vCUpzVHJhbnNsYXRpb24gdHJhbnMgPSBzZWFyY2hEb2MuZ2V0SnNwVHJhbnNsYXRpb24oKTsKLQkvLwlTdHJpbmcgbWF0Y2hUZXh0ID0gdHJhbnMuZ2V0SnNUZXh0KCkuc3Vic3RyaW5nKGphdmFNYXRjaC5nZXRPZmZzZXQoKSwgamF2YU1hdGNoLmdldE9mZnNldCgpICsgamF2YU1hdGNoLmdldExlbmd0aCgpKTsKLQkJLy8gaWYgaXQncyBhbiBpbXBvcnQgb3IganNwOnVzZUJlYW4gb3IgZnVsbHkgcXVhbGlmaWVkIHR5cGUsIHdlIG5lZWQgdG8KLQkJLy8gYWRkIHRoZSBwYWNrYWdlIG5hbWUgYXMgd2VsbAotLy8gaWYgKHRyYW5zLmlzSW1wb3J0KGphdmFNYXRjaC5nZXRPZmZzZXQoKSkKLS8vIHx8IC8qIHRyYW5zLmlzVXNlQmVhbihqYXZhTWF0Y2guZ2V0T2Zmc2V0KCkpIHx8Ci0vLyAqL2lzRnVsbHlRdWFsaWZpZWQobWF0Y2hUZXh0KSkgewotLy8gaWYgKCFwa2cuZXF1YWxzKCIiKSkgewotLy8gcmVuYW1lVGV4dCA9IHBrZyArICIuIiArIHJlbmFtZVRleHQ7IC8vJE5PTi1OTFMtMSQKLS8vIH0KLS8vIH0KLQkJcmV0dXJuIHJlbmFtZVRleHQ7Ci0JfQotCQotCXByaXZhdGUgSVR5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIChJVHlwZSkgZ2V0RWxlbWVudCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvQmFzaWNKc1NlYXJjaFJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9CYXNpY0pzU2VhcmNoUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZDEwYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9CYXNpY0pzU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpzU2VhcmNoU3VwcG9ydDsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljSnNTZWFyY2hSZXF1ZXN0b3IgZXh0ZW5kcyBTZWFyY2hSZXF1ZXN0b3IgewotCS8vIGZvciBkZWJ1Z2dpbmcKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS9kZWJ1Zy9qc3BzZWFyY2giKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIE1hcHMgamF2YSBzZWFyY2ggY29vcmRpbmF0ZXMgdG8gY29ycmVzcG9uZGluZyBKU1AgY29vcmRpbmF0ZXMuIEFkZHMgdGhlCi0JICogbWF0Y2hlcyB0byB0aGUgU2VhcmNoIFJlc3VsdHMgdmlldy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvciNhY2NlcHRTZWFyY2hNYXRjaChvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaCkKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBhY2NlcHRTZWFyY2hNYXRjaChTZWFyY2hNYXRjaCBtYXRjaCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG1hdGNoRG9jdW1lbnRQYXRoID0gbWF0Y2guZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCVNlYXJjaERvY3VtZW50IHNlYXJjaERvYyA9IEpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFNlYXJjaERvY3VtZW50KG1hdGNoRG9jdW1lbnRQYXRoKTsKLQkJaWYgKHNlYXJjaERvYyAhPSBudWxsICYmIHNlYXJjaERvYyBpbnN0YW5jZW9mIEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlKSB7Ci0JCQlKU0RUU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBqYXZhU2VhcmNoRG9jID0gKEpTRFRTZWFyY2hEb2N1bWVudERlbGVnYXRlKSBzZWFyY2hEb2M7Ci0JCQlpbnQganNwU3RhcnQgPSBtYXRjaC5nZXRPZmZzZXQoKTsKLQkJCWludCBqc3BFbmQgPSBtYXRjaC5nZXRPZmZzZXQoKSArIG1hdGNoLmdldExlbmd0aCgpOwotCQkJSUpzVHJhbnNsYXRpb24gdHJhbnMgPSBqYXZhU2VhcmNoRG9jLmdldEpzcFRyYW5zbGF0aW9uKCk7Ci0JCQlTdHJpbmcganNwVGV4dCA9IHRyYW5zLmdldEh0bWxUZXh0KCk7Ci0JCQlTdHJpbmcgamF2YVRleHQgPSBqYXZhU2VhcmNoRG9jLmdldEphdmFUZXh0KCk7Ci0JCQlpZiAoQmFzaWNKc1NlYXJjaFJlcXVlc3Rvci5ERUJVRykgewotCQkJCWRpc3BsYXlEZWJ1Z0luZm8obWF0Y2gsIGpzcFN0YXJ0LCBqc3BFbmQsIGpzcFRleHQsIGphdmFUZXh0KTsKLQkJCX0KLQkJCWlmIChqc3BTdGFydCA+IC0xICYmIGpzcEVuZCA+IC0xKSB7Ci0JCQkJYWRkU2VhcmNoTWF0Y2gobmV3IERvY3VtZW50KHRyYW5zLmdldEh0bWxUZXh0KCkpLCBqYXZhU2VhcmNoRG9jLmdldEZpbGUoKSwganNwU3RhcnQsIGpzcEVuZCwganNwVGV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHNlYXJjaERvYwotCSAqIEBwYXJhbSBqc3BTdGFydAotCSAqIEBwYXJhbSBqc3BFbmQKLQkgKiBAcGFyYW0ganNwVHJhbnNsYXRpb24KLQkgKiBAcGFyYW0ganNwVGV4dAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlYXJjaE1hdGNoKElEb2N1bWVudCBqc3BEb2N1bWVudCwgSUZpbGUganNwRmlsZSwgaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kLCBTdHJpbmcganNwVGV4dCkgewotCS8vIGltcGxlbWVudCBpbiBzdWJjbGFzcwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvciNiZWdpblJlcG9ydGluZygpCi0JICovCi0JCi0JcHVibGljIHZvaWQgYmVnaW5SZXBvcnRpbmcoKSB7Ci0JCWlmIChCYXNpY0pzU2VhcmNoUmVxdWVzdG9yLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUCBTZWFyY2ggcmVxdWVzdG9yOiBiZWdpblJlcG9ydGluZygpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBGb3IgZGVidWcuCi0JICogCi0JICogQHBhcmFtIG9yaWdNYXRjaAotCSAqIEBwYXJhbSBqc3BTdGFydAotCSAqIEBwYXJhbSBqc3BFbmQKLQkgKiBAcGFyYW0ganNwVGV4dAotCSAqIEBwYXJhbSBqYXZhVGV4dAotCSAqLwotCXByaXZhdGUgdm9pZCBkaXNwbGF5RGVidWdJbmZvKFNlYXJjaE1hdGNoIG9yaWdNYXRjaCwgaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kLCBTdHJpbmcganNwVGV4dCwgU3RyaW5nIGphdmFUZXh0KSB7Ci0JCWlmIChvcmlnTWF0Y2ggPT0gbnVsbCB8fCBqc3BTdGFydCA9PSAtMSB8fCBqc3BFbmQgPT0gLTEgfHwganNwRW5kIDwganNwU3RhcnQgfHwganNwVGV4dCA9PSBudWxsIHx8IGphdmFUZXh0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oImFjY2VwdCBwb3NzaWJsZSBtYXRjaCBbanNwRG9jOiAiICsgb3JpZ01hdGNoLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkgKyAiICIgKyBvcmlnTWF0Y2guZ2V0T2Zmc2V0KCkgKyAiOiIgKyBvcmlnTWF0Y2guZ2V0T2Zmc2V0KCkgKyBvcmlnTWF0Y2guZ2V0TGVuZ3RoKCkgKyAiXT8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm1hdGNoIGluZm86Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJ0aGUgamF2YSB0ZXh0IGlzOiIgKyBqYXZhVGV4dC5zdWJzdHJpbmcob3JpZ01hdGNoLmdldE9mZnNldCgpLCBvcmlnTWF0Y2guZ2V0T2Zmc2V0KCkgKyBvcmlnTWF0Y2guZ2V0TGVuZ3RoKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oImphdmEgc2VhcmNoIG1hdGNoIHRyYW5zbGF0ZXMgdG8ganNwIGNvb3JkcyBbc3RhcnQ6ICIgKyBqc3BTdGFydCArICIgZW5kOiIgKyBqc3BFbmQgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiB0aGUganNwIHRleHQgaXM6IiArIGpzcFRleHQuc3Vic3RyaW5nKGpzcFN0YXJ0LCBqc3BFbmQpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvciNlbmRSZXBvcnRpbmcoKQotCSAqLwotCQotCXB1YmxpYyB2b2lkIGVuZFJlcG9ydGluZygpIHsKLQkJaWYgKEJhc2ljSnNTZWFyY2hSZXF1ZXN0b3IuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQIFNlYXJjaCByZXF1ZXN0b3I6IGVuZFJlcG9ydGluZygpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvciNlbnRlclBhcnRpY2lwYW50KG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50KQotCSAqLwotCQotCXB1YmxpYyB2b2lkIGVudGVyUGFydGljaXBhbnQoU2VhcmNoUGFydGljaXBhbnQgcGFydGljaXBhbnQpIHsKLQkJaWYgKEJhc2ljSnNTZWFyY2hSZXF1ZXN0b3IuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQIFNlYXJjaCByZXF1ZXN0b3I6IGVudGVyUGFydGljaXBhbnQoKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3IjZXhpdFBhcnRpY2lwYW50KG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50KQotCSAqLwotCQotCXB1YmxpYyB2b2lkIGV4aXRQYXJ0aWNpcGFudChTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCkgewotCQlpZiAoQmFzaWNKc1NlYXJjaFJlcXVlc3Rvci5ERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1AgU2VhcmNoIHJlcXVlc3RvcjogZXhpdFBhcnRpY2lwYW50KCkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9Kc0ZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJmYzYzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnNlYXJjaC5IVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBMaXN0IGZQcm9jZXNzb3JzOwotCQotCQotCXByb3RlY3RlZCBMaXN0IGdldFByb2Nlc3NvcnMoKSB7Ci0JCWlmIChmUHJvY2Vzc29ycyA9PSBudWxsKSB7Ci0JCQlmUHJvY2Vzc29ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUhUTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgaHRtbFByb2Nlc3NvciA9IG5ldyBIVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yKCk7Ci0JCQlmUHJvY2Vzc29ycy5hZGQoaHRtbFByb2Nlc3Nvcik7Ci0JCQkvLyB0ZW1wb3JhcnksIHdvcmthcm91bmQgdG8gZGlzYWJsZSBmdW5jdGlvbiwgc2luY2UgdXNpbmcgdGhlCi0JCQkvLyBmdW5jdGlvbgotCQkJLy8gY2FuIGVhc2lseSBjYXVzZSBkZWFkbG9jayB0byBvY2N1ci4KLQkJCS8vIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAzNjYyCi0vLyBKU1BGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IganNwUHJvY2Vzc29yID0gbmV3Ci0vLyBKU1BGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IoKTsKLS8vIGZQcm9jZXNzb3JzLmFkZChqc3BQcm9jZXNzb3IpOwotCQl9Ci0JCXJldHVybiBmUHJvY2Vzc29yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMDRmYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9Kc0ZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LklKc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUudGV4dC5JSnNQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKc0ZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciBleHRlbmRzIEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciB7Ci0JcHJpdmF0ZSBJSmF2YVNjcmlwdEVsZW1lbnQgZ2V0SmF2YUVsZW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudFtdIGVsZW1lbnRzID0gZ2V0SmF2YUVsZW1lbnRzRm9yQ3VycmVudFNlbGVjdGlvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCXJldHVybiBlbGVtZW50cy5sZW5ndGggPiAwID8gZWxlbWVudHNbMF0gOiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiB1c2VzIEpTUFRyYW5zbGF0aW9uIHRvIGdldCBjdXJyZW50bHkgc2VsZWN0ZWQgSmF2YSBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIGN1cnJlbnRseSBzZWxlY3RlZCBJSmF2YUVsZW1lbnRzCi0JICovCi0JcHJpdmF0ZSBJSmF2YVNjcmlwdEVsZW1lbnRbXSBnZXRKYXZhRWxlbWVudHNGb3JDdXJyZW50U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IElKYXZhU2NyaXB0RWxlbWVudFswXTsKLQkJLy8gZ2V0IEpTUCB0cmFuc2xhdGlvbiBvYmplY3QgZm9yIHRoaXMgdmlld2VyJ3MgZG9jdW1lbnQKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCUpzVHJhbnNsYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCUlKc1RyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbih0cnVlKTsKLQkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjIxMQotCQkJCQllbGVtZW50cyA9IHRyYW5zbGF0aW9uLmdldEVsZW1lbnRzRnJvbUpzUmFuZ2Uoc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UGFydGl0aW9uVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyBJSnNQYXJ0aXRpb25zLkh0bWxKc1BhcnRpdGlvbiB9OwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UmVnaW9uVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQgfTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIElTZWFyY2hRdWVyeSBnZXRTZWFyY2hRdWVyeShJRmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcmVnaW9uVGV4dCwgU3RyaW5nIHJlZ2lvblR5cGUsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBKc1NlYXJjaFF1ZXJ5KGZpbGUsIGdldEphdmFFbGVtZW50KGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9Kc09jY3VycmVuY2VzU2VhcmNoUmVzdWx0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYxZWYxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5PY2N1cnJlbmNlc1NlYXJjaFJlc3VsdDsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSoKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKc09jY3VycmVuY2VzU2VhcmNoUmVzdWx0IGV4dGVuZHMgT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQgewotCXB1YmxpYyBKc09jY3VycmVuY2VzU2VhcmNoUmVzdWx0KElTZWFyY2hRdWVyeSBxdWVyeSkgewotCQlzdXBlcihxdWVyeSk7Ci0JfQotCQotCQotCXB1YmxpYyBNYXRjaFtdIGdldE1hdGNoZXMoKSB7Ci0JCXJldHVybiAoKEpzU2VhcmNoUXVlcnkpIGdldFF1ZXJ5KCkpLmdldE1hdGNoZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzU2VhcmNoUXVlcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNTZWFyY2hRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODJjMGQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNTZWFyY2hRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuc2VhcmNoLkpzU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSnNTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5Kc1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guQmFzaWNTZWFyY2hRdWVyeTsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpzU2VhcmNoUXVlcnkgZXh0ZW5kcyBCYXNpY1NlYXJjaFF1ZXJ5IHsKLQkvKiogdGhlIElKYXZhU2NyaXB0RWxlbWVudCB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZmlsZSAqICovCi0JcHJpdmF0ZSBJSmF2YVNjcmlwdEVsZW1lbnQgZkVsZW1lbnQgPSBudWxsOwotCQotCXB1YmxpYyBKc1NlYXJjaFF1ZXJ5KElGaWxlIGZpbGUsIElKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKGZpbGUpOwotCQl0aGlzLmZFbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0JCi0JCi0JcHVibGljIGJvb2xlYW4gY2FuUmVydW4oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2NhblJ1bkluQmFja2dyb3VuZCgpCi0JICovCi0JCi0JcHVibGljIGJvb2xlYW4gY2FuUnVuSW5CYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9RdWVyeSgpIHsKLQkJY2xlYXJNYXRjaGVzKCk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJdHJ5IHsKLQkJCUpzU2VhcmNoU3VwcG9ydCBzdXBwb3J0ID0gSnNTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCQkvLyBpbmRleCB0aGUgZmlsZQotCQkJU2VhcmNoRG9jdW1lbnQgZGVsZWdhdGUgPSBzdXBwb3J0LmFkZEpzcEZpbGUoZ2V0RmlsZSgpKTsKLQkJCVN0cmluZyBzY29wZVBhdGggPSBkZWxlZ2F0ZS5nZXRQYXRoKCk7Ci0JCQlKc1NlYXJjaFNjb3BlIHNpbmdsZUZpbGVTY29wZSA9IG5ldyBKc1NlYXJjaFNjb3BlKG5ldyBTdHJpbmdbXSB7IGdldEZpbGUoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHNjb3BlUGF0aCB9KTsKLQkJCS8vIHBlcmZvcm0gYSBzZWFyY2hzCi0JCQkvLyBieSBwYXNzaW5nIGluIHRoaXMganNwIHNlYXJjaCBxdWVyeSwgcmVxdXN0b3IgY2FuIGFkZCBtYXRjaGVzCi0JCQkvLyBzdXBwb3J0LnNlYXJjaFJ1bm5hYmxlKGdldEphdmFFbGVtZW50KCksIHNpbmdsZUZpbGVTY29wZSwgbmV3Ci0JCQkvLyBKU1BTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yKGdldEluc3RhbmNlKCkpKTsKLQkJCXN1cHBvcnQuc2VhcmNoUnVubmFibGUoZ2V0SmF2YUVsZW1lbnQoKSwgc2luZ2xlRmlsZVNjb3BlLCBuZXcgSnNTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yKGdldEluc3RhbmNlKCkpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgIm9yZy5lY2xpcHNlLndzdC5zc2UudWkiLCBJU3RhdHVzLk9LLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEZpbGVuYW1lKCkgewotCQlTdHJpbmcgZmlsZW5hbWUgPSBKc1VJTWVzc2FnZXMuT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8yOwotCQlpZiAoZ2V0RmlsZSgpICE9IG51bGwpIHsKLQkJCWZpbGVuYW1lID0gZ2V0RmlsZSgpLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gZmlsZW5hbWU7Ci0JfQotCQotCS8vIGZvciBhY2Nlc3MgYnkgaW5uZXIgY2xhc3MKLQlwdWJsaWMgSnNTZWFyY2hRdWVyeSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCXB1YmxpYyBJSmF2YVNjcmlwdEVsZW1lbnQgZ2V0SmF2YUVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmZFbGVtZW50OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjZ2V0TGFiZWwoKQotCSAqLwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCVN0cmluZ1tdIGFyZ3MgPSB7IGdldFNlYXJjaFRleHQoKSwgZ2V0T2NjdXJyZW5jZXNDb3VudFRleHQoKSwgZ2V0RmlsZW5hbWUoKSB9OwotCQlyZXR1cm4gTkxTLmJpbmQoSnNVSU1lc3NhZ2VzLk9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMCwgYXJncyk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldE9jY3VycmVuY2VzQ291bnRUZXh0KCkgewotCQlTdHJpbmcgY291bnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBwYV9UT0RPIG1ha2UgZHluYW1pYwotCQlyZXR1cm4gY291bnQ7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeSNnZXRTZWFyY2hSZXN1bHQoKQotCSAqLwotCQotCXB1YmxpYyBJU2VhcmNoUmVzdWx0IGdldFNlYXJjaFJlc3VsdCgpIHsKLQkJcmV0dXJuIG5ldyBKc09jY3VycmVuY2VzU2VhcmNoUmVzdWx0KHRoaXMpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlYXJjaFRleHQoKSB7Ci0JCXJldHVybiBmRWxlbWVudC5nZXRFbGVtZW50TmFtZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNTZWFyY2hSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNmZWI1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5OZXdTZWFyY2hVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5zZWFyY2guSVNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuTG9nZ2VyOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpzU2VhcmNoUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNKc1NlYXJjaFJlcXVlc3RvciB7Ci0JcHJpdmF0ZSBJU2VhcmNoUmVxdWVzdG9yIGZKYXZhUmVxdWVzdG9yID0gbnVsbDsKLQkKLQlwdWJsaWMgSnNTZWFyY2hSZXF1ZXN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBKc1NlYXJjaFJlcXVlc3RvcihJU2VhcmNoUmVxdWVzdG9yIGphdmFSZXF1ZXN0b3IpIHsKLQkJLy8gbmVlZCB0byByZXBvcnQgbWF0Y2hlcyB0byBqYXZhUmVxdWVzdG9yCi0JCXRoaXMuZkphdmFSZXF1ZXN0b3IgPSBqYXZhUmVxdWVzdG9yOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZWFyY2hNYXRjaChJRG9jdW1lbnQganNwRG9jdW1lbnQsIElGaWxlIGpzcEZpbGUsIGludCBqc3BTdGFydCwgaW50IGpzcEVuZCwgU3RyaW5nIGpzcFRleHQpIHsKLQkJaWYgKCFqc3BGaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IGxpbmVOdW1iZXIgPSAtMTsKLQkJdHJ5IHsKLQkJCWxpbmVOdW1iZXIgPSBqc3BEb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoanNwU3RhcnQpOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJvZmZzZXQ6ICIgKyBJbnRlZ2VyLnRvU3RyaW5nKGpzcFN0YXJ0KSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljcmVhdGVTZWFyY2hNYXJrZXIoanNwRmlsZSwganNwU3RhcnQsIGpzcEVuZCwgbGluZU51bWJlcik7Ci0JCWlmICh0aGlzLmZKYXZhUmVxdWVzdG9yICE9IG51bGwpIHsKLQkJCU1hdGNoIG1hdGNoID0gbmV3IE1hdGNoKGpzcEZpbGUsIGpzcFN0YXJ0LCBqc3BFbmQgLSBqc3BTdGFydCk7Ci0JCQl0aGlzLmZKYXZhUmVxdWVzdG9yLnJlcG9ydE1hdGNoKG1hdGNoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0ganNwRmlsZQotCSAqIEBwYXJhbSBqc3BTdGFydAotCSAqIEBwYXJhbSBqc3BFbmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2VhcmNoTWFya2VyKElGaWxlIGpzcEZpbGUsIGludCBqc3BTdGFydCwgaW50IGpzcEVuZCwgaW50IGxpbmVOdW1iZXIpIHsKLQkJdHJ5IHsKLQkJCUlNYXJrZXIgbWFya2VyID0ganNwRmlsZS5jcmVhdGVNYXJrZXIoTmV3U2VhcmNoVUkuU0VBUkNIX01BUktFUik7Ci0JCQlIYXNoTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCg0KTsKLQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgbmV3IEludGVnZXIoanNwU3RhcnQpKTsKLQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9FTkQsIG5ldyBJbnRlZ2VyKGpzcEVuZCkpOwotCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5MSU5FX05VTUJFUiwgbmV3IEludGVnZXIobGluZU51bWJlcikpOwotCQkJbWFya2VyLnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pzU2luZ2xlRmlsZVNlYXJjaFJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTU2NTI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSnNTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSnNTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNKc1NlYXJjaFJlcXVlc3RvciB7Ci0JcHJpdmF0ZSBKc1NlYXJjaFF1ZXJ5IGZRdWVyeSA9IG51bGw7Ci0JCi0JcHVibGljIEpzU2luZ2xlRmlsZVNlYXJjaFJlcXVlc3RvcihKc1NlYXJjaFF1ZXJ5IHF1ZXJ5KSB7Ci0JCXRoaXMuZlF1ZXJ5ID0gcXVlcnk7Ci0JfQotCQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFNlYXJjaE1hdGNoKElEb2N1bWVudCBqc3BEb2N1bWVudCwgSUZpbGUganNwRmlsZSwgaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kLCBTdHJpbmcganNwVGV4dCkgewotCQkvLyBhZGQgbWF0Y2ggdG8gSlNQIHF1ZXJ5Li4uCi0JCXRoaXMuZlF1ZXJ5LmFkZE1hdGNoKGpzcERvY3VtZW50LCBqc3BTdGFydCwganNwRW5kKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL3VpL0pzTWF0Y2hQcmVzZW50YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvdWkvSnNNYXRjaFByZXNlbnRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWE4ODgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvdWkvSnNNYXRjaFByZXNlbnRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuamF2YS5zZWFyY2gudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5JTWF0Y2hQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guQmFzaWNTZWFyY2hMYWJlbFByb3ZpZGVyOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpzTWF0Y2hQcmVzZW50YXRpb24gaW1wbGVtZW50cyBJTWF0Y2hQcmVzZW50YXRpb24gewotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuc2VhcmNoLklNYXRjaFByZXNlbnRhdGlvbiNjcmVhdGVMYWJlbFByb3ZpZGVyKCkKLQkgKi8KLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgY3JlYXRlTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBCYXNpY1NlYXJjaExhYmVsUHJvdmlkZXIoKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5zZWFyY2guSU1hdGNoUHJlc2VudGF0aW9uI3Nob3dNYXRjaChvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaCwKLQkgKiAgICAgIGludCwgaW50LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dNYXRjaChNYXRjaCBtYXRjaCwgaW50IGN1cnJlbnRPZmZzZXQsIGludCBjdXJyZW50TGVuZ3RoLCBib29sZWFuIGFjdGl2YXRlKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQkvLyBwYV9UT0RPIGltcGxlbWVudAotCQkvLyBPYmplY3Qgb2JqID0gbWF0Y2guZ2V0RWxlbWVudCgpOwotCQkvLyBzaG93IG1hdGNoIGluIEpTUCBlZGl0b3IKLQkJaWYgKGFjdGl2YXRlKSB7Ci0JCQkvLyB1c2Ugc2hvdyBpbiB0YXJnZXQ/Ci0JCX0gZWxzZSB7Ci0JCQkvLyBqdXN0IHNlbGVjdAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC91aS9Kc1F1ZXJ5UGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvdWkvSnNRdWVyeVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZjUyOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC91aS9Kc1F1ZXJ5UGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuc2VhcmNoLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5FbGVtZW50UXVlcnlTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5JTWF0Y2hQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuc2VhcmNoLklRdWVyeVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5JU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5QYXR0ZXJuUXVlcnlTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5RdWVyeVNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5zZWFyY2guSnNTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LnNlYXJjaC5Kc1NlYXJjaFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLmphdmEuc2VhcmNoLkpzU2VhcmNoUmVxdWVzdG9yOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpzUXVlcnlQYXJ0aWNpcGFudCBpbXBsZW1lbnRzIElRdWVyeVBhcnRpY2lwYW50IHsKLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUvZGVidWcvanNwc2VhcmNoIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5JUXVlcnlQYXJ0aWNpcGFudCNlc3RpbWF0ZVRpY2tzKG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5RdWVyeVNwZWNpZmljYXRpb24pCi0JICovCi0JcHVibGljIGludCBlc3RpbWF0ZVRpY2tzKFF1ZXJ5U3BlY2lmaWNhdGlvbiBkYXRhKSB7Ci0JCS8vIHBhX1RPRE8gdXNlIHByb2plY3QgZmlsZSBjb3VudGVyIGZyb20gSlNQU2VhcmNoU3VwcG9ydC4uLgotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5zZWFyY2guSVF1ZXJ5UGFydGljaXBhbnQjZ2V0VUlQYXJ0aWNpcGFudCgpCi0JICovCi0JcHVibGljIElNYXRjaFByZXNlbnRhdGlvbiBnZXRVSVBhcnRpY2lwYW50KCkgewotCQlyZXR1cm4gbmV3IEpzTWF0Y2hQcmVzZW50YXRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5zZWFyY2guSVF1ZXJ5UGFydGljaXBhbnQjc2VhcmNoKG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLnNlYXJjaC5JU2VhcmNoUmVxdWVzdG9yLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuc2VhcmNoLlF1ZXJ5U3BlY2lmaWNhdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlYXJjaChJU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgUXVlcnlTcGVjaWZpY2F0aW9uIHF1ZXJ5U3BlY2lmaWNhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGluZGV4SWZOZWVkZWQoKTsKLQkJLy8gZG8gc2VhcmNoIGJhc2VkIG9uIHRoZSBwYXJ0aWN1bGFyIEphdmEgcXVlcnkKLQkJaWYgKHF1ZXJ5U3BlY2lmaWNhdGlvbiBpbnN0YW5jZW9mIEVsZW1lbnRRdWVyeVNwZWNpZmljYXRpb24pIHsKLQkJCS8vIGVsZW1lbnQgc2VhcmNoIChlZy4gZnJvbSBnbG9iYWwgZmluZCByZWZlcmVuY2VzIGluIEphdmEgZmlsZSkKLQkJCUVsZW1lbnRRdWVyeVNwZWNpZmljYXRpb24gZWxlbWVudFF1ZXJ5ID0gKEVsZW1lbnRRdWVyeVNwZWNpZmljYXRpb24pIHF1ZXJ5U3BlY2lmaWNhdGlvbjsKLQkJCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50ID0gZWxlbWVudFF1ZXJ5LmdldEVsZW1lbnQoKTsKLQkJCWlmIChKc1F1ZXJ5UGFydGljaXBhbnQuREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUCBRdWVyeSBQYXJ0aWNpcGFudCBzZWFyY2hpbmcgb24gRUxFTUVOVDogIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlTZWFyY2hSZXF1ZXN0b3IganNwUmVxdWVzdG9yID0gbmV3IEpzU2VhcmNoUmVxdWVzdG9yKHJlcXVlc3Rvcik7Ci0JCQkvLyBwYV9UT0RPIG5lZWQgdG8gYWRhcHQgSmF2YVNlYXJjaFNjb3BlIHRvIGEgSlNQU2VhcmNoU2NvcGUKLQkJCUpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLnNlYXJjaChlbGVtZW50LCBuZXcgSnNTZWFyY2hTY29wZSgpLCBqc3BSZXF1ZXN0b3IpOwotCQl9IGVsc2UgaWYgKHF1ZXJ5U3BlY2lmaWNhdGlvbiBpbnN0YW5jZW9mIFBhdHRlcm5RdWVyeVNwZWNpZmljYXRpb24pIHsKLQkJCS8vIHBhdHRlcm4gc2VhcmNoIChlZy4gZnJvbSBKYXZhIHNlYXJjaCBwYWdlKQotCQkJUGF0dGVyblF1ZXJ5U3BlY2lmaWNhdGlvbiBwYXR0ZXJuUXVlcnkgPSAoUGF0dGVyblF1ZXJ5U3BlY2lmaWNhdGlvbikgcXVlcnlTcGVjaWZpY2F0aW9uOwotCQkJU3RyaW5nIHBhdHRlcm4gPSBwYXR0ZXJuUXVlcnkuZ2V0UGF0dGVybigpOwotCQkJaWYgKEpzUXVlcnlQYXJ0aWNpcGFudC5ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQIFF1ZXJ5IFBhcnRpY2lwYW50IHNlYXJjaGluZyBvbiBQQVRURVJOOiAiICsgcGF0dGVybik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCVNlYXJjaFJlcXVlc3RvciBqc3BSZXF1ZXN0b3IgPSBuZXcgSnNTZWFyY2hSZXF1ZXN0b3IocmVxdWVzdG9yKTsKLQkJCUpzU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLnNlYXJjaChwYXR0ZXJuLCBuZXcgSnNTZWFyY2hTY29wZSgpLCBwYXR0ZXJuUXVlcnkuZ2V0U2VhcmNoRm9yKCksIHBhdHRlcm5RdWVyeS5nZXRMaW1pdFRvKCksIFNlYXJjaFBhdHRlcm4uUl9QQVRURVJOX01BVENILCBmYWxzZSwganNwUmVxdWVzdG9yKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckpTRFQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckpTRFQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNmM2M5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JKU0RULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JKU0RUOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckpTRFQgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLQkvKgotCSAqIEBzZWUgQWRhcHRlckZhY3RvcnlQcm92aWRlciNhZGRBZGFwdGVyRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWRhcHRlckZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyB0aGVzZSBhcmUgdGhlIG1haW4gZmFjdG9yaWVzLCBvbiBtb2RlbCdzIGZhY3RvcnkgcmVnaXN0cnkKLQkJYWRkQ29udGVudEJhc2VkRmFjdG9yaWVzKHN0cnVjdHVyZWRNb2RlbCk7Ci0JCS8vIC0tLS0tLS0KLQkJLy8gTXVzdCB1cGRhdGUvYWRkIHRvIHByb3BhZ2F0aW5nIGFkYXB0ZXJzIGhlcmUgdG9vCi0JCWFkZFByb3BhZ2F0aW5nQWRhcHRlcnMoc3RydWN0dXJlZE1vZGVsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29udGVudEJhc2VkRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCUZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5UmVnaXN0cnkgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZmFjdG9yeVJlZ2lzdHJ5LCAiUHJvZ3JhbSBFcnJvcjogY2xpZW50IGNhbGxlciBtdXN0IGVuc3VyZSBtb2RlbCBoYXMgZmFjdG9yeSByZWdpc3RyeSIpOyAvLyROT04tTkxTLTEkCi0JCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCWZhY3RvcnkgPSBmYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCWlmICghKGZhY3RvcnkgaW5zdGFuY2VvZiBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUZvckpTRFQpKSB7Ci0JCQlmYWN0b3J5UmVnaXN0cnkucmVtb3ZlRmFjdG9yaWVzRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJCWZhY3RvcnkgPSBuZXcgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JKU0RUKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQkJCWZhY3RvcnlSZWdpc3RyeS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0JCWZhY3RvcnkgPSBmYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihJSnNUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCWZhY3RvcnkgPSBuZXcgSnNUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlmYWN0b3J5UmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wYWdhdGluZ0FkYXB0ZXJzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7fQotCQotCS8qCi0JICogQHNlZSBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyI2lzRm9yKENvbnRlbnRUeXBlRGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSURvY3VtZW50VHlwZUhhbmRsZXIgY29udGVudFR5cGVEZXNjcmlwdGlvbikgewotCQkvLyByZXR1cm4gKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gaW5zdGFuY2VvZiBNb2RlbEhhbmRsZXJGb3JKU1ApOwotCQlyZXR1cm4gKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gaW5zdGFuY2VvZiBNb2RlbEhhbmRsZXJGb3JIVE1MKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVpbml0aWFsaXplRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWFkZEFkYXB0ZXJGYWN0b3JpZXMoc3RydWN0dXJlZE1vZGVsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0pzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0pzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMjM3ZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNKcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuc3R5bGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGludGVyZmFjZSBJU3R5bGVDb25zdGFudHNKcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NPTlRFTlQgPSAianNwX2NvbnRlbnQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSVN0eWxlQ29uc3RhbnRzSlNEVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0lTdHlsZUNvbnN0YW50c0pTRFQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI1ZmVjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSVN0eWxlQ29uc3RhbnRzSlNEVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuc3R5bGUuamF2YTsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZUNvbnN0YW50c0pTRFQgewotCVN0cmluZyBKQVZBX0RFRkFVTFQgPSAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSkFWQV9LRVlXT1JEID0gImtleXdvcmQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpBVkFfU0lOR0xFX0xJTkVfQ09NTUVOVCA9ICJzaW5nbGVfbGluZV9jb21tZW50IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKQVZBX1NUUklORyA9ICJzdHJpbmciOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSlNEVENvZGVTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSlNEVENvZGVTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NGYxYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0pTRFRDb2RlU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuc3R5bGUuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLkVuZE9mTGluZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLk11bHRpTGluZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5TaW5nbGVMaW5lUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuV29yZFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc0RhdGFUeXBlczsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLWNsYXNzIEpTRFRDb2RlU2Nhbm5lciBleHRlbmRzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuUnVsZUJhc2VkU2Nhbm5lciB7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZmdDb25zdGFudHMgPSBKc0RhdGFUeXBlcy5DT05TVEFOVFM7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZmdLZXl3b3JkcyA9IEpzRGF0YVR5cGVzLktFWVdPUkRTOwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGZnVHlwZXMgPSBKc0RhdGFUeXBlcy5UWVBFUzsKLQlwcml2YXRlIElUb2tlbiBmRGVmYXVsdFRva2VuOwotCXByaXZhdGUgSVRva2VuIGZLZXl3b3JkVG9rZW47Ci0JcHJpdmF0ZSBJVG9rZW4gZlNpbmdsZUxpbmVDb21tZW50VG9rZW47Ci0JcHJpdmF0ZSBJVG9rZW4gZlN0cmluZ1Rva2VuOwotCXByaXZhdGUgSVRva2VuIGZUeXBlVG9rZW47Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIEphdmEgY29kZSBzY2FubmVyCi0JICovCi0JcHVibGljIEpTRFRDb2RlU2Nhbm5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVJ1bGVzKCkgewotCQlMaXN0IHJ1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBBZGQgcnVsZSBmb3IgbXVsdGlwbGUgbGluZSBjb21tZW50cy4KLQkJcnVsZXMuYWRkKG5ldyBNdWx0aUxpbmVSdWxlKCIvKiIsICIqLyIsIGZTaW5nbGVMaW5lQ29tbWVudFRva2VuKSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCS8vIEFkZCBydWxlIGZvciBzaW5nbGUgbGluZSBjb21tZW50cy4KLQkJcnVsZXMuYWRkKG5ldyBFbmRPZkxpbmVSdWxlKCIvLyIsIGZTaW5nbGVMaW5lQ29tbWVudFRva2VuKSk7Ly8kTk9OLU5MUy0xJAotCQkvLyBBZGQgcnVsZSBmb3Igc3RyaW5ncyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4KLQkJcnVsZXMuYWRkKG5ldyBTaW5nbGVMaW5lUnVsZSgiXCIiLCAiXCIiLCBmU3RyaW5nVG9rZW4sICdcXCcpKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlydWxlcy5hZGQobmV3IFNpbmdsZUxpbmVSdWxlKCInIiwgIiciLCBmU3RyaW5nVG9rZW4sICdcXCcpKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkvLyBBZGQgZ2VuZXJpYyB3aGl0ZXNwYWNlIHJ1bGUuCi0JCS8vIHJ1bGVzLmFkZChuZXcgV2hpdGVzcGFjZVJ1bGUobmV3IEphdmFXaGl0ZXNwYWNlRGV0ZWN0b3IoKSkpOwotCQkvLyBBZGQgd29yZCBydWxlIGZvciBrZXl3b3JkcywgdHlwZXMsIGFuZCBjb25zdGFudHMuCi0JCVdvcmRSdWxlIHdvcmRSdWxlID0gbmV3IFdvcmRSdWxlKG5ldyBKYXZhV29yZERldGVjdG9yKCksIGZEZWZhdWx0VG9rZW4pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IEpTRFRDb2RlU2Nhbm5lci5mZ0tleXdvcmRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl3b3JkUnVsZS5hZGRXb3JkKEpTRFRDb2RlU2Nhbm5lci5mZ0tleXdvcmRzW2ldLCBmS2V5d29yZFRva2VuKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IEpTRFRDb2RlU2Nhbm5lci5mZ1R5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl3b3JkUnVsZS5hZGRXb3JkKEpTRFRDb2RlU2Nhbm5lci5mZ1R5cGVzW2ldLCBmVHlwZVRva2VuKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IEpTRFRDb2RlU2Nhbm5lci5mZ0NvbnN0YW50cy5sZW5ndGg7IGkrKykgewotCQkJd29yZFJ1bGUuYWRkV29yZChKU0RUQ29kZVNjYW5uZXIuZmdDb25zdGFudHNbaV0sIGZUeXBlVG9rZW4pOwotCQl9Ci0JCXJ1bGVzLmFkZCh3b3JkUnVsZSk7Ci0JCUlSdWxlW10gcmVzdWx0ID0gbmV3IElSdWxlW3J1bGVzLnNpemUoKV07Ci0JCXJ1bGVzLnRvQXJyYXkocmVzdWx0KTsKLQkJc2V0UnVsZXMocmVzdWx0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VG9rZW5EYXRhKFN0cmluZyB0b2tlbktleSwgT2JqZWN0IGRhdGEpIHsKLQkJaWYgKHRva2VuS2V5ID09IElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9LRVlXT1JEKSB7Ci0JCQlmS2V5d29yZFRva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQkJZlR5cGVUb2tlbiA9IG5ldyBUb2tlbihkYXRhKTsKLQkJfSBlbHNlIGlmICh0b2tlbktleSA9PSBJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfU1RSSU5HKSB7Ci0JCQlmU3RyaW5nVG9rZW4gPSBuZXcgVG9rZW4oZGF0YSk7Ci0JCX0gZWxzZSBpZiAodG9rZW5LZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNEVC5KQVZBX1NJTkdMRV9MSU5FX0NPTU1FTlQpIHsKLQkJCWZTaW5nbGVMaW5lQ29tbWVudFRva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQl9IGVsc2UgaWYgKHRva2VuS2V5ID09IElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9ERUZBVUxUKSB7Ci0JCQlmRGVmYXVsdFRva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFXb3JkRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KYXZhV29yZERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNjI2OGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFXb3JkRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnN0eWxlLmphdmE7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSmF2YVdvcmREZXRlY3RvciBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVdvcmREZXRlY3RvciB7Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXb3JkRGV0ZWN0b3IjaXNXb3JkSWRlbnRpZmllclBhcnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmRQYXJ0KGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVdvcmREZXRlY3RvciNpc1dvcmRJZGVudGlmaWVyU3RhcnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmRTdGFydChjaGFyIGMpIHsKLQkJcmV0dXJuIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoYyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0xpbmVTdHlsZVByb3ZpZGVyRm9ySlNEVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0xpbmVTdHlsZVByb3ZpZGVyRm9ySlNEVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTZhZDZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9MaW5lU3R5bGVQcm92aWRlckZvckpTRFQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC5zdHlsZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0hUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuSnNVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNYTUw7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIExpbmVTdHlsZVByb3ZpZGVyRm9ySlNEVCBleHRlbmRzIEFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIgaW1wbGVtZW50cyBMaW5lU3R5bGVQcm92aWRlciB7Ci0JLyoqIFRoZSBzY2FubmVyIGl0IHVzZXMgKi8KLQlwcml2YXRlIEpTRFRDb2RlU2Nhbm5lciBmU2Nhbm5lcjsKLQkKLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZQcmVmZXJlbmNlTGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBoYXZlIHRvIGRvIGl0IHRoaXMgd2F5IHNvIG90aGVycyBjYW4gb3ZlcnJpZGUgdGhlIG1ldGhvZAotCQkJaGFuZGxlUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQl9Ci0JfTsKLQkKLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJGb3JKU0RUKCkgewotCQlzdXBlcigpOwotCQlmU2Nhbm5lciA9IG5ldyBKU0RUQ29kZVNjYW5uZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9va3MgdXAgdGhlIGNvbG9yS2V5IGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlIGFuZCBhZGRzIHRoZSBzdHlsZQotCSAqIGluZm9ybWF0aW9uIHRvIGxpc3Qgb2YgVGV4dEF0dHJpYnV0ZXMKLQkgKiAKLQkgKiBAcGFyYW0gY29sb3JLZXkKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkSmF2YVRleHRBdHRyaWJ1dGUoU3RyaW5nIGNvbG9yS2V5KSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRKYXZhQ29sb3JQcmVmZXJlbmNlcygpOwotCQlpZiAoc3RvcmUgIT0gbnVsbCAmJiBjb2xvcktleSAhPSBudWxsKSB7Ci0JCQlUZXh0QXR0cmlidXRlIHRhID0gbnVsbDsKLQkJCWlmIChjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfS0VZV09SRCkgewotCQkJCS8vIGtleXdvcmQKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9DT0xPUik7Ci0JCQkJYm9vbGVhbiBib2xkID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQk9MRCk7Ci0JCQkJYm9vbGVhbiBpdGFsaWNzID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfSVRBTElDKTsKLQkJCQlib29sZWFuIHN0cmlrZXRocm91Z2ggPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9TVFJJS0VUSFJPVUdIKTsKLQkJCQlib29sZWFuIHVuZGVybGluZSA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX1VOREVSTElORSk7Ci0JCQkJaW50IHN0eWxlID0gU1dULk5PUk1BTDsKLQkJCQlpZiAoYm9sZCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChpdGFsaWNzKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuSVRBTElDOwotCQkJCX0KLQkJCQlpZiAoc3RyaWtldGhyb3VnaCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAodW5kZXJsaW5lKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlVOREVSTElORTsKLQkJCQl9Ci0JCQkJdGEgPSBjcmVhdGVUZXh0QXR0cmlidXRlKGZvcmVncm91bmQsIG51bGwsIHN0eWxlKTsKLQkJCX0gZWxzZSBpZiAoY29sb3JLZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNEVC5KQVZBX1NUUklORykgewotCQkJCS8vIHN0cmluZwotCQkJCVJHQiBmb3JlZ3JvdW5kID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX0NPTE9SKTsKLQkJCQlib29sZWFuIGJvbGQgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19CT0xEKTsKLQkJCQlib29sZWFuIGl0YWxpY3MgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19JVEFMSUMpOwotCQkJCWJvb2xlYW4gc3RyaWtldGhyb3VnaCA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX1NUUklLRVRIUk9VR0gpOwotCQkJCWJvb2xlYW4gdW5kZXJsaW5lID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfVU5ERVJMSU5FKTsKLQkJCQlpbnQgc3R5bGUgPSBTV1QuTk9STUFMOwotCQkJCWlmIChib2xkKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuQk9MRDsKLQkJCQl9Ci0JCQkJaWYgKGl0YWxpY3MpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHJpa2V0aHJvdWdoKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJfQotCQkJCWlmICh1bmRlcmxpbmUpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQkJCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgbnVsbCwgc3R5bGUpOwotCQkJfSBlbHNlIGlmIChjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfU0lOR0xFX0xJTkVfQ09NTUVOVCkgewotCQkJCS8vIHNpbmdsZSBsaW5lIGNvbW1lbnQKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfQ09MT1IpOwotCQkJCWJvb2xlYW4gYm9sZCA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9CT0xEKTsKLQkJCQlib29sZWFuIGl0YWxpY3MgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfSVRBTElDKTsKLQkJCQlib29sZWFuIHN0cmlrZXRocm91Z2ggPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfU1RSSUtFVEhST1VHSCk7Ci0JCQkJYm9vbGVhbiB1bmRlcmxpbmUgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfVU5ERVJMSU5FKTsKLQkJCQlpbnQgc3R5bGUgPSBTV1QuTk9STUFMOwotCQkJCWlmIChib2xkKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuQk9MRDsKLQkJCQl9Ci0JCQkJaWYgKGl0YWxpY3MpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHJpa2V0aHJvdWdoKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0g7Ci0JCQkJfQotCQkJCWlmICh1bmRlcmxpbmUpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQkJCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgbnVsbCwgc3R5bGUpOwotCQkJfSBlbHNlIGlmIChjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfREVGQVVMVCkgewotCQkJCS8vIGRlZmF1bHQKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9DT0xPUik7Ci0JCQkJYm9vbGVhbiBib2xkID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQk9MRCk7Ci0JCQkJYm9vbGVhbiBpdGFsaWNzID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfSVRBTElDKTsKLQkJCQlib29sZWFuIHN0cmlrZXRocm91Z2ggPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9TVFJJS0VUSFJPVUdIKTsKLQkJCQlib29sZWFuIHVuZGVybGluZSA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX1VOREVSTElORSk7Ci0JCQkJaW50IHN0eWxlID0gU1dULk5PUk1BTDsKLQkJCQlpZiAoYm9sZCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULkJPTEQ7Ci0JCQkJfQotCQkJCWlmIChpdGFsaWNzKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuSVRBTElDOwotCQkJCX0KLQkJCQlpZiAoc3RyaWtldGhyb3VnaCkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAodW5kZXJsaW5lKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBUZXh0QXR0cmlidXRlLlVOREVSTElORTsKLQkJCQl9Ci0JCQkJdGEgPSBjcmVhdGVUZXh0QXR0cmlidXRlKGZvcmVncm91bmQsIG51bGwsIHN0eWxlKTsKLQkJCX0KLQkJCWlmICh0YSAhPSBudWxsKSB7Ci0JCQkJZ2V0VGV4dEF0dHJpYnV0ZXMoKS5wdXQoY29sb3JLZXksIHRhKTsKLQkJCQlmU2Nhbm5lci5zZXRUb2tlbkRhdGEoY29sb3JLZXksIHRhKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHN0eWxlIGluZm9ybWF0aW9uIHRvIHRoZSBnaXZlbiB0ZXh0IHByZXNlbnRhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJlc2VudGF0aW9uCi0JICogICAgICAgICAgICB0aGUgdGV4dCBwcmVzZW50YXRpb24gdG8gYmUgZXh0ZW5kZWQKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSByYW5nZSB0byBiZSBzdHlsZWQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByYW5nZSB0byBiZSBzdHlsZWQKLQkgKiBAcGFyYW0gYXR0cgotCSAqICAgICAgICAgICAgdGhlIGF0dHJpYnV0ZSBkZXNjcmliaW5nIHRoZSBzdHlsZSBvZiB0aGUgcmFuZ2UgdG8gYmUgc3R5bGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFJhbmdlKENvbGxlY3Rpb24gcHJlc2VudGF0aW9uLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBUZXh0QXR0cmlidXRlIGF0dHIpIHsKLQkJLy8gc3VwcG9ydCBmb3IgdXNlciBkZWZpbmVkIGJhY2tncm91ZCBmb3IgSlNQIHNjcmlwdGxldCByZWdpb25zCi0JCVRleHRBdHRyaWJ1dGUgdGEgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzSnMuSlNQX0NPTlRFTlQpOwotCQlDb2xvciBiZ0NvbG9yID0gdGEuZ2V0QmFja2dyb3VuZCgpOwotCQlpZiAoYmdDb2xvciA9PSBudWxsKSB7Ci0JCQliZ0NvbG9yID0gYXR0ci5nZXRCYWNrZ3JvdW5kKCk7Ci0JCX0KLQkJU3R5bGVSYW5nZSByZXN1bHQgPSBuZXcgU3R5bGVSYW5nZShvZmZzZXQsIGxlbmd0aCwgYXR0ci5nZXRGb3JlZ3JvdW5kKCksIGJnQ29sb3IsIGF0dHIuZ2V0U3R5bGUoKSk7Ci0JCWlmICgoYXR0ci5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIKSAhPSAwKSB7Ci0JCQlyZXN1bHQuc3RyaWtlb3V0ID0gdHJ1ZTsKLQkJfQotCQlpZiAoKGF0dHIuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FKSAhPSAwKSB7Ci0JCQlyZXN1bHQudW5kZXJsaW5lID0gdHJ1ZTsKLQkJfQotCQlwcmVzZW50YXRpb24uYWRkKHJlc3VsdCk7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBKc1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGdldEphdmFDb2xvclByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHRleHQgYXR0cmlidXRlIGVuY29kZWQgaW4gdGhlIGdpdmVuIHRva2VuLiBJZiB0aGUgdG9rZW4ncyBkYXRhCi0JICogaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+IGFuZCBhIHRleHQgYXR0cmlidXRlIGl0IGlzIGFzc3VtZWQgdGhhdCBpdCBpcwotCSAqIHRoZSBlbmNvZGVkIHRleHQgYXR0cmlidXRlLiBJdCByZXR1cm5zIHRoZSBkZWZhdWx0IHRleHQgYXR0cmlidXRlIGlmCi0JICogdGhlcmUgaXMgbm8gZW5jb2RlZCB0ZXh0IGF0dHJpYnV0ZSBmb3VuZC4KLQkgKiAKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiAgICAgICAgICAgIHRoZSB0b2tlbiB3aG9zZSB0ZXh0IGF0dHJpYnV0ZSBpcyB0byBiZSBkZXRlcm1pbmVkCi0JICogQHJldHVybiB0aGUgdG9rZW4ncyB0ZXh0IGF0dHJpYnV0ZQotCSAqLwotCXByaXZhdGUgVGV4dEF0dHJpYnV0ZSBnZXRUb2tlblRleHRBdHRyaWJ1dGUoSVRva2VuIHRva2VuKSB7Ci0JCVRleHRBdHRyaWJ1dGUgdGEgPSBudWxsOwotCQlPYmplY3QgZGF0YSA9IHRva2VuLmdldERhdGEoKTsKLQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBUZXh0QXR0cmlidXRlKSB7Ci0JCQl0YSA9IChUZXh0QXR0cmlidXRlKSBkYXRhOwotCQl9IGVsc2UgewotCQkJdGEgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzSlNEVC5KQVZBX0RFRkFVTFQpOwotCQl9Ci0JCXJldHVybiB0YTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3R5bGVLZXkgPSBudWxsOwotCQlTdHJpbmcgamF2YVN0eWxlS2V5ID0gbnVsbDsKLQkJaWYgKGV2ZW50ICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmVmS2V5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCS8vIGNoZWNrIGlmIHByZWZlcmVuY2UgY2hhbmdlZCBpcyBhIHN0eWxlIHByZWZlcmVuY2UKLQkJCWlmIChJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRTsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzSnMuSlNQX0NPTlRFTlQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNKcy5KU1BfQ09OVEVOVDsKLQkJCX0gZWxzZSBpZiAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0NPTE9SLmVxdWFscyhwcmVmS2V5KSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0JPTEQuZXF1YWxzKHByZWZLZXkpKSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0lUQUxJQy5lcXVhbHMocHJlZktleSkpKSB7Ci0JCQkJamF2YVN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzSlNEVC5KQVZBX0tFWVdPUkQ7Ci0JCQl9IGVsc2UgaWYgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19DT0xPUi5lcXVhbHMocHJlZktleSkgfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19CT0xELmVxdWFscyhwcmVmS2V5KSkgfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19JVEFMSUMuZXF1YWxzKHByZWZLZXkpKSkgewotCQkJCWphdmFTdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9TVFJJTkc7Ci0JCQl9IGVsc2UgaWYgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfQ09MT1IuZXF1YWxzKHByZWZLZXkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0JPTEQuZXF1YWxzKHByZWZLZXkpKSB8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9JVEFMSUMuZXF1YWxzKHByZWZLZXkpKSkgewotCQkJCWphdmFTdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9TSU5HTEVfTElORV9DT01NRU5UOwotCQkJfSBlbHNlIGlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQ09MT1IuZXF1YWxzKHByZWZLZXkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQk9MRC5lcXVhbHMocHJlZktleSkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfSVRBTElDLmVxdWFscyhwcmVmS2V5KSkpIHsKLQkJCQlqYXZhU3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfREVGQVVMVDsKLQkJCX0KLQkJfQotCQlpZiAoc3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gb3ZlcndyaXRlIHN0eWxlIHByZWZlcmVuY2Ugd2l0aCBuZXcgdmFsdWUKLQkJCWFkZFRleHRBdHRyaWJ1dGUoc3R5bGVLZXkpOwotCQl9Ci0JCWlmIChqYXZhU3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gb3ZlcndyaXRlIHN0eWxlIHByZWZlcmVuY2Ugd2l0aCBuZXcgdmFsdWUKLQkJCWFkZEphdmFUZXh0QXR0cmlidXRlKGphdmFTdHlsZUtleSk7Ci0JCQlmU2Nhbm5lci5pbml0aWFsaXplUnVsZXMoKTsKLQkJfQotCQlpZiAoc3R5bGVLZXkgIT0gbnVsbCB8fCBqYXZhU3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gZm9yY2UgYSBmdWxsIHVwZGF0ZSBvZiB0aGUgdGV4dCB2aWV3ZXIKLQkJCXN1cGVyLmdldEhpZ2hsaWdodGVyKCkucmVmcmVzaERpc3BsYXkoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2FkQ29sb3JzKCkgewotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSnMuSlNQX0NPTlRFTlQpOwotCQlhZGRKYXZhVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfS0VZV09SRCk7Ci0JCWFkZEphdmFUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9TVFJJTkcpOwotCQlhZGRKYXZhVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNKU0RULkpBVkFfU0lOR0xFX0xJTkVfQ09NTUVOVCk7Ci0JCWFkZEphdmFUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0pTRFQuSkFWQV9ERUZBVUxUKTsKLQkJZlNjYW5uZXIuaW5pdGlhbGl6ZVJ1bGVzKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHByZXBhcmVSZWdpb25zKElUeXBlZFJlZ2lvbiB0eXBlZFJlZ2lvbiwgaW50IHNzc3NyZXF1ZXN0ZWRTdGFydCwgaW50IHNzc3NyZXF1ZXN0ZWRMZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQkvKiBJbml0aWFsaXplIHRoZSB0ZXh0IGF0dHJpYnV0ZXMuIEFsc28gbG9hZCB0aGUgY29sb3JzIGFuZCBpbml0aWFsaXplIHRoZSBydWxlcyBvZiB0aGUgc2Nhbm5lciAqLwotCQlnZXRUZXh0QXR0cmlidXRlcygpOwotCQl0cnkgewotCQkJLy8gaWRlYWxseSwgZXZlbnR1YWxseSwgd2UnbGwgaGF2ZSBhICJ2aXJ0dWFsRG9jdW1lbnQiIHdlIGNhbgotCQkJLy8gcmVmZXIgdG8sIGJ1dCBmb3Igbm93IC4uLiB3ZSdsbCBzaW1wbGUgcmVzY2FuIHRoZSBvbmUgcmVnaW9uLgotCQkJLy8gdXNlIHNpbXBsZSBhZGp1c3RtZW50IChzaW5jZSAic3ViLWNvbnRlbnQiIHN0YXJ0cyBhdCAwCi0JCQlpbnQgbGFzdFN0YXJ0ID0gdHlwZWRSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQgbGVuZ3RoID0gMDsKLQkJCUlUb2tlbiBsYXN0VG9rZW4gPSBUb2tlbi5VTkRFRklORUQ7Ci0JCQlmU2Nhbm5lci5zZXRSYW5nZShnZXREb2N1bWVudCgpLCBsYXN0U3RhcnQsIHR5cGVkUmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJSVRva2VuIHRva2VuID0gZlNjYW5uZXIubmV4dFRva2VuKCk7Ci0JCQkJaWYgKHRva2VuLmlzRU9GKCkpIHsKLQkJCQkJaWYgKCFsYXN0VG9rZW4uaXNVbmRlZmluZWQoKSAmJiBsZW5ndGggIT0gMCkgewotCQkJCQkJYWRkUmFuZ2UoaG9sZFJlc3VsdHMsIGxhc3RTdGFydCwgbGVuZ3RoLCBnZXRUb2tlblRleHRBdHRyaWJ1dGUobGFzdFRva2VuKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICh0b2tlbi5pc1doaXRlc3BhY2UoKSkgewotCQkJCQlsZW5ndGggKz0gZlNjYW5uZXIuZ2V0VG9rZW5MZW5ndGgoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChsYXN0VG9rZW4uaXNVbmRlZmluZWQoKSkgewotCQkJCQlsYXN0VG9rZW4gPSB0b2tlbjsKLQkJCQkJbGVuZ3RoICs9IGZTY2FubmVyLmdldFRva2VuTGVuZ3RoKCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAodG9rZW4gIT0gbGFzdFRva2VuKSB7Ci0JCQkJCWFkZFJhbmdlKGhvbGRSZXN1bHRzLCBsYXN0U3RhcnQsIGxlbmd0aCwgZ2V0VG9rZW5UZXh0QXR0cmlidXRlKGxhc3RUb2tlbikpOwotCQkJCQlsYXN0VG9rZW4gPSB0b2tlbjsKLQkJCQkJbGFzdFN0YXJ0ID0gZlNjYW5uZXIuZ2V0VG9rZW5PZmZzZXQoKTsKLQkJCQkJbGVuZ3RoID0gZlNjYW5uZXIuZ2V0VG9rZW5MZW5ndGgoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWxlbmd0aCArPSBmU2Nhbm5lci5nZXRUb2tlbkxlbmd0aCgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkbid0IGhhcHBlbiwgYnV0IHdlIGRvbid0IHdhbnQgaXQgdG8gc3RvcCBvdGhlcgotCQkJLy8gaGlnaGxpZ2h0aW5nLCBpZiBpdCBkb2VzLgotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCkgewotCQlnZXRDb2xvclByZWZlcmVuY2VzKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQkJZ2V0SmF2YUNvbG9yUHJlZmVyZW5jZXMoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlTGlzdGVuZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlzdXBlci5yZWxlYXNlKCk7Ci0JCWZTY2FubmVyID0gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdW5SZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCkgewotCQlnZXRDb2xvclByZWZlcmVuY2VzKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQkJZ2V0SmF2YUNvbG9yUHJlZmVyZW5jZXMoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlTGlzdGVuZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RhZ2luZm8vSFRNTFByaW50ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGFnaW5mby9IVE1MUHJpbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDAwZTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGFnaW5mby9IVE1MUHJpbnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotY2xhc3MgSFRNTFByaW50ZXIgewotCXN0YXRpYyBSR0IgQkdfQ09MT1JfUkdCID0gbnVsbDsKLQlzdGF0aWMgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJaWYgKGRpc3BsYXkgIT0gbnVsbCAmJiAhZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkvKgotCQkJCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkJCQkgKi8KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSFRNTFByaW50ZXIuQkdfQ09MT1JfUkdCID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EKS5nZXRSR0IoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfSBjYXRjaCAoU1dURXJyb3IgZXJyKSB7Ci0JCQkJLy8gc2VlOiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NDUyOTQKLQkJCQlpZiAoZXJyLmNvZGUgIT0gU1dULkVSUk9SX0RFVklDRV9ESVNQT1NFRCkgewotCQkJCQl0aHJvdyBlcnI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRCdWxsZXQoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGJ1bGxldCkgewotCQlpZiAoYnVsbGV0ICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIjxsaT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChidWxsZXQpOwotCQkJYnVmZmVyLmFwcGVuZCgiPC9saT4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRQYWdlRXBpbG9nKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJYnVmZmVyLmFwcGVuZCgiPC9mb250PjwvYm9keT48L2h0bWw+Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFBhZ2VQcm9sb2coU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlIVE1MUHJpbnRlci5pbnNlcnRQYWdlUHJvbG9nKGJ1ZmZlciwgYnVmZmVyLmxlbmd0aCgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFBhcmFncmFwaChTdHJpbmdCdWZmZXIgYnVmZmVyLCBSZWFkZXIgcGFyYWdyYXBoUmVhZGVyKSB7Ci0JCWlmIChwYXJhZ3JhcGhSZWFkZXIgIT0gbnVsbCkgewotCQkJSFRNTFByaW50ZXIuYWRkUGFyYWdyYXBoKGJ1ZmZlciwgSFRNTFByaW50ZXIucmVhZChwYXJhZ3JhcGhSZWFkZXIpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkUGFyYWdyYXBoKFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBwYXJhZ3JhcGgpIHsKLQkJaWYgKHBhcmFncmFwaCAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCI8cD4iKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChwYXJhZ3JhcGgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRTbWFsbEhlYWRlcihTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgaGVhZGVyKSB7Ci0JCWlmIChoZWFkZXIgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgiPGg1PiIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKGhlYWRlcik7Ci0JCQlidWZmZXIuYXBwZW5kKCI8L2g1PiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRDb2xvcihTdHJpbmdCdWZmZXIgYnVmZmVyLCBSR0IgcmdiKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoJyMnKTsKLQkJYnVmZmVyLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKHJnYi5yZWQpKTsKLQkJYnVmZmVyLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKHJnYi5ncmVlbikpOwotCQlidWZmZXIuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcocmdiLmJsdWUpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRTdHlsZVNoZWV0TGluayhTdHJpbmdCdWZmZXIgYnVmZmVyLCBVUkwgc3R5bGVTaGVldFVSTCkgewotCQlpZiAoc3R5bGVTaGVldFVSTCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiPGhlYWQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiPExJTksgUkVMPVwic3R5bGVzaGVldFwiIEhSRUY9IFwiIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChzdHlsZVNoZWV0VVJMKTsKLQkJYnVmZmVyLmFwcGVuZCgiXCIgQ0hBUlNFVD1cIklTTy04ODU5LTFcIiBUWVBFPVwidGV4dC9jc3NcIj4iKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCI8L2hlYWQ+Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSFRNTENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHsKLQkJY29udGVudCA9IEhUTUxQcmludGVyLnJlcGxhY2UoY29udGVudCwgJyYnLCAiJmFtcDsiKTsgLy8kTk9OLU5MUy0xJAotCQljb250ZW50ID0gSFRNTFByaW50ZXIucmVwbGFjZShjb250ZW50LCAnIicsICImcXVvdDsiKTsgLy8kTk9OLU5MUy0xJAotCQljb250ZW50ID0gSFRNTFByaW50ZXIucmVwbGFjZShjb250ZW50LCAnPCcsICImbHQ7Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIEhUTUxQcmludGVyLnJlcGxhY2UoY29udGVudCwgJz4nLCAiJmd0OyIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlbmRCdWxsZXRMaXN0KFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJYnVmZmVyLmFwcGVuZCgiPC91bD4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBSR0IgZ2V0QmdDb2xvcigpIHsKLQkJaWYgKEhUTUxQcmludGVyLkJHX0NPTE9SX1JHQiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gSFRNTFByaW50ZXIuQkdfQ09MT1JfUkdCOwotCQl9Ci0JCS8vIFJHQiB2YWx1ZSBvZiBpbmZvIGJnIGNvbG9yIG9uIFdpbmRvd3NYUAotCQlyZXR1cm4gbmV3IFJHQigyNTUsIDI1NSwgMjI1KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGluc2VydFBhZ2VQcm9sb2coU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IHBvc2l0aW9uKSB7Ci0JCUhUTUxQcmludGVyLmluc2VydFBhZ2VQcm9sb2coYnVmZmVyLCBwb3NpdGlvbiwgSFRNTFByaW50ZXIuZ2V0QmdDb2xvcigpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGluc2VydFBhZ2VQcm9sb2coU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IHBvc2l0aW9uLCBSR0IgYmdSR0IpIHsKLQkJaWYgKGJnUkdCID09IG51bGwpIHsKLQkJCUhUTUxQcmludGVyLmluc2VydFBhZ2VQcm9sb2coYnVmZmVyLCBwb3NpdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgcGFnZVByb2xvZyA9IG5ldyBTdHJpbmdCdWZmZXIoNjApOwotCQkJcGFnZVByb2xvZy5hcHBlbmQoIjxodG1sPjxib2R5IHRleHQ9XCIjMDAwMDAwXCIgYmdjb2xvcj1cIiIpOyAvLyROT04tTkxTLTEkCi0JCQlIVE1MUHJpbnRlci5hcHBlbmRDb2xvcihwYWdlUHJvbG9nLCBiZ1JHQik7Ci0JCQlwYWdlUHJvbG9nLmFwcGVuZCgiXCI+PGZvbnQgc2l6ZT0tMT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmluc2VydChwb3NpdGlvbiwgcGFnZVByb2xvZy50b1N0cmluZygpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0UGFnZVByb2xvZyhTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgcG9zaXRpb24sIFJHQiBiZ1JHQiwgVVJMIHN0eWxlU2hlZXRVUkwpIHsKLQkJaWYgKGJnUkdCID09IG51bGwpIHsKLQkJCUhUTUxQcmludGVyLmluc2VydFBhZ2VQcm9sb2coYnVmZmVyLCBwb3NpdGlvbiwgc3R5bGVTaGVldFVSTCk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgcGFnZVByb2xvZyA9IG5ldyBTdHJpbmdCdWZmZXIoMzAwKTsKLQkJCXBhZ2VQcm9sb2cuYXBwZW5kKCI8aHRtbD4iKTsgLy8kTk9OLU5MUy0xJAotCQkJSFRNTFByaW50ZXIuYXBwZW5kU3R5bGVTaGVldExpbmsocGFnZVByb2xvZywgc3R5bGVTaGVldFVSTCk7Ci0JCQlwYWdlUHJvbG9nLmFwcGVuZCgiPGJvZHkgdGV4dD1cIiMwMDAwMDBcIiBiZ2NvbG9yPVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCUhUTUxQcmludGVyLmFwcGVuZENvbG9yKHBhZ2VQcm9sb2csIGJnUkdCKTsKLQkJCXBhZ2VQcm9sb2cuYXBwZW5kKCJcIj48Zm9udCBzaXplPS0xPiIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuaW5zZXJ0KHBvc2l0aW9uLCBwYWdlUHJvbG9nLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRQYWdlUHJvbG9nKFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCBwb3NpdGlvbiwgVVJMIHN0eWxlU2hlZXRVUkwpIHsKLQkJSFRNTFByaW50ZXIuaW5zZXJ0UGFnZVByb2xvZyhidWZmZXIsIHBvc2l0aW9uLCBIVE1MUHJpbnRlci5nZXRCZ0NvbG9yKCksIHN0eWxlU2hlZXRVUkwpOwotCX0KLQkKLQlzdGF0aWMgU3RyaW5nIHJlYWQoUmVhZGVyIHJkKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWNoYXJbXSByZWFkQnVmZmVyID0gbmV3IGNoYXJbMjA0OF07Ci0JCXRyeSB7Ci0JCQlpbnQgbiA9IHJkLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQl3aGlsZSAobiA+IDApIHsKLQkJCQlidWZmZXIuYXBwZW5kKHJlYWRCdWZmZXIsIDAsIG4pOwotCQkJCW4gPSByZC5yZWFkKHJlYWRCdWZmZXIpOwotCQkJfQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCQkvLyBuZXZlciBleHBlY3RlZAotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgeC5nZXRNZXNzYWdlKCksIHgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVwbGFjZShTdHJpbmcgdGV4dCwgY2hhciBjLCBTdHJpbmcgcykgewotCQlpbnQgcHJldmlvdXMgPSAwOwotCQlpbnQgY3VycmVudCA9IHRleHQuaW5kZXhPZihjLCBwcmV2aW91cyk7Ci0JCWlmIChjdXJyZW50ID09IC0xKSB7Ci0JCQlyZXR1cm4gdGV4dDsKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl3aGlsZSAoY3VycmVudCA+IC0xKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHRleHQuc3Vic3RyaW5nKHByZXZpb3VzLCBjdXJyZW50KSk7Ci0JCQlidWZmZXIuYXBwZW5kKHMpOwotCQkJcHJldmlvdXMgPSBjdXJyZW50ICsgMTsKLQkJCWN1cnJlbnQgPSB0ZXh0LmluZGV4T2YoYywgcHJldmlvdXMpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQodGV4dC5zdWJzdHJpbmcocHJldmlvdXMpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnRCdWxsZXRMaXN0KFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJYnVmZmVyLmFwcGVuZCgiPHVsPiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgSFRNTFByaW50ZXIoKSB7Ci0JLy8gbm90aGluZwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGFnaW5mby9KU0RUSG92ZXJQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGFnaW5mby9KU0RUSG92ZXJQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThkNWU2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RhZ2luZm8vSlNEVEhvdmVyUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLkphdmFTY3JpcHRFbGVtZW50TGFiZWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLkpTZG9jQ29udGVudEFjY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm8uQWJzdHJhY3RIb3ZlclByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNEVEhvdmVyUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RIb3ZlclByb2Nlc3NvciB7Ci0JLyoKLQkgKiBCdWxrIG9mIHRoZSB3b3JrIHdhcyBjb3BpZWQgZnJvbQotCSAqIG9yZy5lY2xpcHNlLndzdC5qc2R0LmludGVybmFsLnVpLnRleHQuamF2YS5ob3Zlci5KYXZhZG9jSG92ZXIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGxvbmcgTEFCRUxfRkxBR1MgPSBKYXZhU2NyaXB0RWxlbWVudExhYmVscy5BTExfRlVMTFlfUVVBTElGSUVEIHwgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbHMuTV9QUkVfUkVUVVJOVFlQRSB8IEphdmFTY3JpcHRFbGVtZW50TGFiZWxzLk1fUEFSQU1FVEVSX1RZUEVTIHwgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbHMuTV9QQVJBTUVURVJfTkFNRVMgfCBKYXZhU2NyaXB0RWxlbWVudExhYmVscy5NX0VYQ0VQVElPTlMgfCBKYXZhU2NyaXB0RWxlbWVudExhYmVscy5GX1BSRV9UWVBFX1NJR05BVFVSRSB8IEphdmFTY3JpcHRFbGVtZW50TGFiZWxzLk1fUFJFX1RZUEVfUEFSQU1FVEVSUyB8IEphdmFTY3JpcHRFbGVtZW50TGFiZWxzLlRfVFlQRV9QQVJBTUVURVJTIHwgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbHMuVVNFX1JFU09MVkVEOwotCXByaXZhdGUgZmluYWwgbG9uZyBMT0NBTF9WQVJJQUJMRV9GTEFHUyA9IExBQkVMX0ZMQUdTICYgfkphdmFTY3JpcHRFbGVtZW50TGFiZWxzLkZfRlVMTFlfUVVBTElGSUVEIHwgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbHMuRl9QT1NUX1FVQUxJRklFRDsKLQkKLQlwcml2YXRlIFN0cmluZyBnZXRIb3ZlckluZm8oSUphdmFTY3JpcHRFbGVtZW50W10gcmVzdWx0KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBuUmVzdWx0cyA9IHJlc3VsdC5sZW5ndGg7Ci0JCWlmIChuUmVzdWx0cyA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoblJlc3VsdHMgPiAxKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJCUhUTUxQcmludGVyLnN0YXJ0QnVsbGV0TGlzdChidWZmZXIpOwotCQkJCUlKYXZhU2NyaXB0RWxlbWVudCBjdXJyID0gcmVzdWx0W2ldOwotCQkJCWlmIChjdXJyIGluc3RhbmNlb2YgSU1lbWJlciB8fCBjdXJyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LkxPQ0FMX1ZBUklBQkxFKSB7Ci0JCQkJCUhUTUxQcmludGVyLmFkZEJ1bGxldChidWZmZXIsIGdldEluZm9UZXh0KGN1cnIpKTsKLQkJCQl9Ci0JCQkJSFRNTFByaW50ZXIuZW5kQnVsbGV0TGlzdChidWZmZXIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJSUphdmFTY3JpcHRFbGVtZW50IGN1cnIgPSByZXN1bHRbMF07Ci0JCQlpZiAoY3VyciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlpZiAoY3VyciBpbnN0YW5jZW9mIElNZW1iZXIpIHsKLQkJCQlJTWVtYmVyIG1lbWJlciA9IChJTWVtYmVyKSBjdXJyOwotCQkJCUhUTUxQcmludGVyLmFkZFNtYWxsSGVhZGVyKGJ1ZmZlciwgZ2V0SW5mb1RleHQobWVtYmVyKSk7Ci0JCQkJUmVhZGVyIHJlYWRlcjsKLQkJCQl0cnkgewotCQkJCQlyZWFkZXIgPSBKU2RvY0NvbnRlbnRBY2Nlc3MuZ2V0SFRNTENvbnRlbnRSZWFkZXIobWVtYmVyLCB0cnVlLCB0cnVlKTsKLQkJCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgewotCQkJCQlIVE1MUHJpbnRlci5hZGRQYXJhZ3JhcGgoYnVmZmVyLCByZWFkZXIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoY3Vyci5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhU2NyaXB0RWxlbWVudC5MT0NBTF9WQVJJQUJMRSB8fCBjdXJyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LlRZUEVfUEFSQU1FVEVSKSB7Ci0JCQkJSFRNTFByaW50ZXIuYWRkU21hbGxIZWFkZXIoYnVmZmVyLCBnZXRJbmZvVGV4dChjdXJyKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKLQkJCUhUTUxQcmludGVyLmluc2VydFBhZ2VQcm9sb2coYnVmZmVyLCAwKTsKLQkJCUhUTUxQcmludGVyLmFkZFBhZ2VFcGlsb2coYnVmZmVyKTsKLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIjZ2V0SG92ZXJJbmZvKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIb3ZlckluZm8oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBob3ZlclJlZ2lvbikgewotCQkvLyBnZXQgSlNQIHRyYW5zbGF0aW9uIG9iamVjdCBmb3IgdGhpcyB2aWV3ZXIncyBkb2N1bWVudAotCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSB4bWxNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCUpzVHJhbnNsYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCUlKc1RyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbih0cnVlKTsKLQkJCQkJSUphdmFTY3JpcHRFbGVtZW50W10gcmVzdWx0ID0gdHJhbnNsYXRpb24uZ2V0RWxlbWVudHNGcm9tSnNSYW5nZShob3ZlclJlZ2lvbi5nZXRPZmZzZXQoKSwgaG92ZXJSZWdpb24uZ2V0T2Zmc2V0KCkgKyBob3ZlclJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0vLyBWZWN0b3IgZmlsdGVyZWRSZXN1bHRzID0gbmV3IFZlY3RvcigpOwotLy8gTGlzdCBiYWRGdW5jdGlvbnMgPSB0cmFuc2xhdGlvbi5nZXRHZW5lcmF0ZWRGdW5jdGlvbk5hbWVzKCk7Ci0vLyBib29sZWFuIGJhZCA9IGZhbHNlOwotLy8gZm9yKGludCBpID0gMDtpPHJlc3VsdC5sZW5ndGg7aSsrKXsKLS8vIGJhZD1mYWxzZTsKLS8vIGlmKHJlc3VsdFtpXSBpbnN0YW5jZW9mIElGdW5jdGlvbil7Ci0vLyBmb3IoaW50IGo9MDtqPGJhZEZ1bmN0aW9ucy5zaXplKCkgJiYgISBiYWQ7aisrKXsKLS8vIGlmKCgoSUZ1bmN0aW9uKXJlc3VsdFtpXSkuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpYmFkRnVuY3Rpb25zLmdldChqKSkpewotLy8gYmFkPXRydWU7Ci0vLyBjb250aW51ZTsKLS8vIH0KLS8vIH0KLS8vIGlmKCFiYWQpZmlsdGVyZWRSZXN1bHRzLmFkZChyZXN1bHRbaV0pOwotLy8gfQotLy8gfQotLy8gaWYoZmlsdGVyZWRSZXN1bHRzLnNpemUoKTwxKSByZXR1cm4gbmV3IFN0cmluZygpOwotLy8JCQkJCQotLy8gU3RyaW5nIGZpbHRlcmVkUmVzdWx0ID0KLS8vIHRyYW5zbGF0aW9uLmZpeHVwTWFuZ2xlZE5hbWUoZ2V0SG92ZXJJbmZvKChJSmF2YVNjcmlwdEVsZW1lbnRbXSlmaWx0ZXJlZFJlc3VsdHMudG9BcnJheShuZXcKLS8vIElKYXZhU2NyaXB0RWxlbWVudFtde30pKSk7Ci0vLyBmb3IoaW50IGkgPSAwO2k8YmFkRnVuY3Rpb25zLnNpemUoKTtpKyspewotLy8gZmlsdGVyZWRSZXN1bHQucmVwbGFjZSgoU3RyaW5nKWJhZEZ1bmN0aW9ucy5nZXQoaSksICIiKTsKLS8vIH0KLS8vIHJldHVybiBmaWx0ZXJlZFJlc3VsdDsKLQkJCQkJcmV0dXJuIHRyYW5zbGF0aW9uLmZpeHVwTWFuZ2xlZE5hbWUoZ2V0SG92ZXJJbmZvKHJlc3VsdCkpOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVyUmVnaW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gSnNXb3JkRmluZGVyLmZpbmRXb3JkKHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSwgb2Zmc2V0KTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5mb1RleHQoSUphdmFTY3JpcHRFbGVtZW50IG1lbWJlcikgewotCQlsb25nIGZsYWdzID0gbWVtYmVyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LkxPQ0FMX1ZBUklBQkxFID8gTE9DQUxfVkFSSUFCTEVfRkxBR1MgOiBMQUJFTF9GTEFHUzsKLQkJU3RyaW5nIGxhYmVsID0gSmF2YVNjcmlwdEVsZW1lbnRMYWJlbHMuZ2V0RWxlbWVudExhYmVsKG1lbWJlciwgZmxhZ3MpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxhYmVsLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBsYWJlbC5jaGFyQXQoaSk7Ci0JCQlpZiAoY2ggPT0gJzwnKSB7Ci0JCQkJYnVmLmFwcGVuZCgiJmx0OyIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGNoID09ICc+JykgewotCQkJCWJ1Zi5hcHBlbmQoIiZndDsiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlidWYuYXBwZW5kKGNoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90YWdpbmZvL0pTRFRJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RhZ2luZm8vSlNEVEluZm9ybWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM4YTRmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RhZ2luZm8vSlNEVEluZm9ybWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSlNEVEluZm9ybWF0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJSW5mb3JtYXRpb25Qcm92aWRlciwgSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb24gewotCXByaXZhdGUgSVRleHRIb3ZlciBmVGV4dEhvdmVyID0gbnVsbDsKLQkKLQlwdWJsaWMgSlNEVEluZm9ybWF0aW9uUHJvdmlkZXIoKSB7Ci0JCWZUZXh0SG92ZXIgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGV4dEhvdmVyTWFuYWdlcigpLmNyZWF0ZUJlc3RNYXRjaEhvdmVyKG5ldyBKU0RUSG92ZXJQcm9jZXNzb3IoKSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBzdWJqZWN0KSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXRJbmZvcm1hdGlvbjIodGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24yKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gc3ViamVjdCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlckluZm8odGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotCQotCXB1YmxpYyBJUmVnaW9uIGdldFN1YmplY3QoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlclJlZ2lvbih0ZXh0Vmlld2VyLCBvZmZzZXQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGFnaW5mby9Kc1dvcmRGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGFnaW5mby9Kc1dvcmRGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkzMTFhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RhZ2luZm8vSnNXb3JkRmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC50YWdpbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1jbGFzcyBKc1dvcmRGaW5kZXIgewotCXB1YmxpYyBzdGF0aWMgSVJlZ2lvbiBmaW5kV29yZChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQkJaW50IHN0YXJ0ID0gLTE7Ci0JCWludCBlbmQgPSAtMTsKLQkJdHJ5IHsKLQkJCWludCBwb3MgPSBvZmZzZXQ7Ci0JCQljaGFyIGM7Ci0JCQl3aGlsZSAocG9zID49IDApIHsKLQkJCQljID0gZG9jdW1lbnQuZ2V0Q2hhcihwb3MpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiSmF2YVdvcmRGaW5kZXIuZmluZFdvcmQoKSBUZXN0IGphdmEgY2hhcgotCQkJCS8vICgtLSk6IiArIGMpOwotCQkJCWlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQktLXBvczsKLQkJCX0KLQkJCXN0YXJ0ID0gcG9zOwotCQkJcG9zID0gb2Zmc2V0OwotCQkJaW50IGxlbmd0aCA9IGRvY3VtZW50LmdldExlbmd0aCgpOwotCQkJd2hpbGUgKHBvcyA8IGxlbmd0aCkgewotCQkJCWMgPSBkb2N1bWVudC5nZXRDaGFyKHBvcyk7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJKYXZhV29yZEZpbmRlci5maW5kV29yZCgpIFRlc3QgamF2YSBjaGFyCi0JCQkJLy8gKCsrKToiICsgYyk7Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYykpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCSsrcG9zOwotCQkJfQotCQkJZW5kID0gcG9zOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdGFydDoiICsgc3RhcnQgKyAiRW5kOiIrZW5kKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiSmF2YVdvcmRGaW5kZXIuZmluZFdvcmQoKSBSZXRyaWV2ZWQgamF2YQotCQkJLy8gdG9rZW4gb2Y6IiArIGRvY3VtZW50LmdldChzdGFydCwgZW5kLXN0YXJ0KSApOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCX0KLQkJaWYgKHN0YXJ0ID4gLTEgJiYgZW5kID4gLTEpIHsKLQkJCWlmIChzdGFydCA9PSBvZmZzZXQgJiYgZW5kID09IG9mZnNldCkgewotCQkJCXJldHVybiBuZXcgUmVnaW9uKG9mZnNldCwgMCk7Ci0JCQl9IGVsc2UgaWYgKHN0YXJ0ID09IG9mZnNldCkgewotCQkJCXJldHVybiBuZXcgUmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBuZXcgUmVnaW9uKHN0YXJ0ICsgMSwgZW5kIC0gc3RhcnQgLSAxKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RleHQvSnNDb2RlUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RleHQvSnNDb2RlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5OTM3ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90ZXh0L0pzQ29kZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwuZGVyaXZlZC5TaW5nbGVDaGFyUmVhZGVyOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotY2xhc3MgSnNDb2RlUmVhZGVyIGV4dGVuZHMgU2luZ2xlQ2hhclJlYWRlciB7Ci0JLyoqIFRoZSBFT0YgY2hhcmFjdGVyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZkNhY2hlZExpbmVOdW1iZXIgPSAtMTsKLQlwcml2YXRlIGludCBmQ2FjaGVkTGluZU9mZnNldCA9IC0xOwotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIGludCBmRW5kID0gLTE7Ci0JcHJpdmF0ZSBib29sZWFuIGZGb3J3YXJkID0gZmFsc2U7Ci0JcHJpdmF0ZSBpbnQgZk9mZnNldDsKLQlwcml2YXRlIGJvb2xlYW4gZlNraXBDb21tZW50cyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmU2tpcFN0cmluZ3MgPSBmYWxzZTsKLQkKLQlwdWJsaWMgSnNDb2RlUmVhZGVyKCkge30KLQkKLQkvKgotCSAqIEBzZWUgUmVhZGVyI2Nsb3NlKCkKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZEb2N1bWVudCA9IG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUJhY2t3YXJkUmVhZGVyKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgYm9vbGVhbiBza2lwQ29tbWVudHMsIGJvb2xlYW4gc2tpcFN0cmluZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQlmU2tpcENvbW1lbnRzID0gc2tpcENvbW1lbnRzOwotCQlmU2tpcFN0cmluZ3MgPSBza2lwU3RyaW5nczsKLQkJZkZvcndhcmQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWZDYWNoZWRMaW5lTnVtYmVyID0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChmT2Zmc2V0KTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKHguZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBjb25maWd1cmVGb3J3YXJkUmVhZGVyKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgYm9vbGVhbiBza2lwQ29tbWVudHMsIGJvb2xlYW4gc2tpcFN0cmluZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQlmU2tpcENvbW1lbnRzID0gc2tpcENvbW1lbnRzOwotCQlmU2tpcFN0cmluZ3MgPSBza2lwU3RyaW5nczsKLQkJZkZvcndhcmQgPSB0cnVlOwotCQlmRW5kID0gTWF0aC5taW4oZkRvY3VtZW50LmdldExlbmd0aCgpLCBmT2Zmc2V0ICsgbGVuZ3RoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBsYXN0IHJlYWQgY2hhcmFjdGVyLiBTaG91bGQgb25seSBiZSBjYWxsZWQKLQkgKiBhZnRlciByZWFkIGhhcyBiZWVuIGNhbGxlZC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIGZGb3J3YXJkID8gZk9mZnNldCAtIDEgOiBmT2Zmc2V0OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ290b0NvbW1lbnRFbmQoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoZk9mZnNldCA8IGZFbmQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQrKyk7Ci0JCQlpZiAoY3VycmVudCA9PSAnKicpIHsKLQkJCQlpZiAoZk9mZnNldCA8IGZFbmQgJiYgZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCkgPT0gJy8nKSB7Ci0JCQkJCSsrZk9mZnNldDsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ290b0NvbW1lbnRTdGFydCgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlICgwIDwgZk9mZnNldCkgewotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldC0tKTsKLQkJCWlmIChjdXJyZW50ID09ICcqJyAmJiAwIDw9IGZPZmZzZXQgJiYgZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCkgPT0gJy8nKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBnb3RvTGluZUVuZCgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWludCBsaW5lID0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChmT2Zmc2V0KTsKLQkJZk9mZnNldCA9IGZEb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmUgKyAxKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGdvdG9TdHJpbmdFbmQoY2hhciBkZWxpbWl0ZXIpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChmT2Zmc2V0IDwgZkVuZCkgewotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCsrKTsKLQkJCWlmIChjdXJyZW50ID09ICdcXCcpIHsKLQkJCQkvLyBpZ25vcmUgZXNjYXBlZCBjaGFyYWN0ZXJzCi0JCQkJKytmT2Zmc2V0OwotCQkJfSBlbHNlIGlmIChjdXJyZW50ID09IGRlbGltaXRlcikgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ290b1N0cmluZ1N0YXJ0KGNoYXIgZGVsaW1pdGVyKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoMCA8IGZPZmZzZXQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCQkJaWYgKGN1cnJlbnQgPT0gZGVsaW1pdGVyKSB7Ci0JCQkJaWYgKCEoMCA8PSBmT2Zmc2V0ICYmIGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQgLSAxKSA9PSAnXFwnKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJLS1mT2Zmc2V0OwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVTaW5nbGVMaW5lQ29tbWVudCgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWludCBsaW5lID0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChmT2Zmc2V0KTsKLQkJaWYgKGxpbmUgPCBmQ2FjaGVkTGluZU51bWJlcikgewotCQkJZkNhY2hlZExpbmVOdW1iZXIgPSBsaW5lOwotCQkJZkNhY2hlZExpbmVPZmZzZXQgPSBmRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lKTsKLQkJCWludCBvZmZzZXQgPSBmT2Zmc2V0OwotCQkJd2hpbGUgKGZDYWNoZWRMaW5lT2Zmc2V0IDwgb2Zmc2V0KSB7Ci0JCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIob2Zmc2V0LS0pOwotCQkJCWlmIChjdXJyZW50ID09ICcvJyAmJiBmQ2FjaGVkTGluZU9mZnNldCA8PSBvZmZzZXQgJiYgZkRvY3VtZW50LmdldENoYXIob2Zmc2V0KSA9PSAnLycpIHsKLQkJCQkJZk9mZnNldCA9IG9mZnNldDsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIEBzZWUgU2luZ2xlQ2hhclJlYWRlciNyZWFkKCkKLQkgKi8KLQkKLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGZGb3J3YXJkID8gcmVhZEZvcndhcmRzKCkgOiByZWFkQmFja3dhcmRzKCk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbih4LmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgcmVhZEJhY2t3YXJkcygpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlICgwIDwgZk9mZnNldCkgewotCQkJLS1mT2Zmc2V0OwotCQkJaGFuZGxlU2luZ2xlTGluZUNvbW1lbnQoKTsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCQkJc3dpdGNoIChjdXJyZW50KSB7Ci0JCQkJY2FzZSAnLyc6Ci0JCQkJCWlmIChmU2tpcENvbW1lbnRzICYmIGZPZmZzZXQgPiAxKSB7Ci0JCQkJCQljaGFyIG5leHQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0IC0gMSk7Ci0JCQkJCQlpZiAobmV4dCA9PSAnKicpIHsKLQkJCQkJCQkvLyBhIGNvbW1lbnQgZW5kcywgYWR2YW5jZSB0byB0aGUgY29tbWVudCBzdGFydAotCQkJCQkJCWZPZmZzZXQgLT0gMjsKLQkJCQkJCQlnb3RvQ29tbWVudFN0YXJ0KCk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCQkJY2FzZSAnIic6Ci0JCQkJY2FzZSAnXCcnOgotCQkJCQlpZiAoZlNraXBTdHJpbmdzKSB7Ci0JCQkJCQktLWZPZmZzZXQ7Ci0JCQkJCQlnb3RvU3RyaW5nU3RhcnQoY3VycmVudCk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gY3VycmVudDsKLQkJCX0KLQkJCXJldHVybiBjdXJyZW50OwotCQl9Ci0JCXJldHVybiBKc0NvZGVSZWFkZXIuRU9GOwotCX0KLQkKLQlwcml2YXRlIGludCByZWFkRm9yd2FyZHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoZk9mZnNldCA8IGZFbmQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQrKyk7Ci0JCQlzd2l0Y2ggKGN1cnJlbnQpIHsKLQkJCQljYXNlICcvJzoKLQkJCQkJaWYgKGZTa2lwQ29tbWVudHMgJiYgZk9mZnNldCA8IGZFbmQpIHsKLQkJCQkJCWNoYXIgbmV4dCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCQkJCQkJaWYgKG5leHQgPT0gJyonKSB7Ci0JCQkJCQkJLy8gYSBjb21tZW50IHN0YXJ0cywgYWR2YW5jZSB0byB0aGUgY29tbWVudCBlbmQKLQkJCQkJCQkrK2ZPZmZzZXQ7Ci0JCQkJCQkJZ290b0NvbW1lbnRFbmQoKTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0gZWxzZSBpZiAobmV4dCA9PSAnLycpIHsKLQkJCQkJCQkvLyAnLy8nLWNvbW1lbnQgc3RhcnRzLCBhZHZhbmNlIHRvIHRoZSBsaW5lIGVuZAotCQkJCQkJCWdvdG9MaW5lRW5kKCk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCQkJY2FzZSAnIic6Ci0JCQkJY2FzZSAnXCcnOgotCQkJCQlpZiAoZlNraXBTdHJpbmdzKSB7Ci0JCQkJCQlnb3RvU3RyaW5nRW5kKGN1cnJlbnQpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCQl9Ci0JCQlyZXR1cm4gY3VycmVudDsKLQkJfQotCQlyZXR1cm4gSnNDb2RlUmVhZGVyLkVPRjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RleHQvSnNEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL2ludGVybmFsL3RleHQvSnNEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YzEwZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90ZXh0L0pzRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGV4dC5Eb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciBleHRlbmRzIERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIgewotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgY2hhcltdIEJSQUNLRVRTID0geyAneycsICd9JywgJygnLCAnKScsICdbJywgJ10nIH07Ci0JCi0JLyoqCi0JICogQHBhcmFtIHZhbGlkQ29udGV4dHMKLQkgKiBAcGFyYW0gbmV4dE1hdGNoZXIKLQkgKi8KLQlwdWJsaWMgSnNEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyKCkgewotCQlzdXBlcihuZXcgU3RyaW5nW10geyBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSwgRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhULCBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhULCBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOLAotCQkJCURPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NPTlRFTlQgfSwgbmV3IEpzUGFpck1hdGNoZXIoSnNEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLkJSQUNLRVRTKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90ZXh0L0pzUGFpck1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvaW50ZXJuYWwvdGV4dC9Kc1BhaXJNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTY1YTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9pbnRlcm5hbC90ZXh0L0pzUGFpck1hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlcjsKLQotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLWNsYXNzIEpzUGFpck1hdGNoZXIgaW1wbGVtZW50cyBJQ2hhcmFjdGVyUGFpck1hdGNoZXIgewotCXByb3RlY3RlZCBpbnQgZkFuY2hvcjsKLQlwcm90ZWN0ZWQgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcm90ZWN0ZWQgaW50IGZFbmRQb3M7Ci0JcHJvdGVjdGVkIGludCBmT2Zmc2V0OwotCXByb3RlY3RlZCBjaGFyW10gZlBhaXJzOwotCXByb3RlY3RlZCBKc0NvZGVSZWFkZXIgZlJlYWRlciA9IG5ldyBKc0NvZGVSZWFkZXIoKTsKLQlwcm90ZWN0ZWQgaW50IGZTdGFydFBvczsKLQkKLQlwdWJsaWMgSnNQYWlyTWF0Y2hlcihjaGFyW10gcGFpcnMpIHsKLQkJZlBhaXJzID0gcGFpcnM7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjY2xlYXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpZiAoZlJlYWRlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZSZWFkZXIuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQljbGVhcigpOwotCQlmRG9jdW1lbnQgPSBudWxsOwotCQlmUmVhZGVyID0gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjZ2V0QW5jaG9yKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFuY2hvcigpIHsKLQkJcmV0dXJuIGZBbmNob3I7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI21hdGNoKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJUmVnaW9uIG1hdGNoKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgewotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQlpZiAoZk9mZnNldCA8IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwgJiYgbWF0Y2hQYWlyc0F0KCkgJiYgZlN0YXJ0UG9zICE9IGZFbmRQb3MpIHsKLQkJCXJldHVybiBuZXcgUmVnaW9uKGZTdGFydFBvcywgZkVuZFBvcyAtIGZTdGFydFBvcyArIDEpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaFBhaXJzQXQoKSB7Ci0JCWludCBpOwotCQlpbnQgcGFpckluZGV4MSA9IGZQYWlycy5sZW5ndGg7Ci0JCWludCBwYWlySW5kZXgyID0gZlBhaXJzLmxlbmd0aDsKLQkJZlN0YXJ0UG9zID0gLTE7Ci0JCWZFbmRQb3MgPSAtMTsKLQkJLy8gZ2V0IHRoZSBjaGFycyBwcmVjZWRpbmcgYW5kIGZvbGxvd2luZyB0aGUgc3RhcnQgcG9zaXRpb24KLQkJdHJ5IHsKLQkJCWNoYXIgcHJldkNoYXIgPSBmRG9jdW1lbnQuZ2V0Q2hhcihNYXRoLm1heChmT2Zmc2V0IC0gMSwgMCkpOwotCQkJLy8gbW9kaWZpZWQgYmVoYXZpb3IgZm9yCi0JCQkvLyBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2ODc5Ci0JCQkvLyBjaGFyIG5leHRDaGFyPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KTsKLQkJCS8vIHNlYXJjaCBmb3Igb3BlbmluZyBwZWVyIGNoYXJhY3RlciBuZXh0IHRvIHRoZSBhY3RpdmF0aW9uIHBvaW50Ci0JCQlmb3IgKGkgPSAwOyBpIDwgZlBhaXJzLmxlbmd0aDsgaSA9IGkgKyAyKSB7Ci0JCQkJLy8gaWYgKG5leHRDaGFyID09IGZQYWlyc1tpXSkgewotCQkJCS8vIGZTdGFydFBvcz0gZk9mZnNldDsKLQkJCQkvLyBwYWlySW5kZXgxPSBpOwotCQkJCS8vIH0gZWxzZQotCQkJCWlmIChwcmV2Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkJZlN0YXJ0UG9zID0gZk9mZnNldCAtIDE7Ci0JCQkJCXBhaXJJbmRleDEgPSBpOwotCQkJCX0KLQkJCX0KLQkJCS8vIHNlYXJjaCBmb3IgY2xvc2luZyBwZWVyIGNoYXJhY3RlciBuZXh0IHRvIHRoZSBhY3RpdmF0aW9uIHBvaW50Ci0JCQlmb3IgKGkgPSAxOyBpIDwgZlBhaXJzLmxlbmd0aDsgaSA9IGkgKyAyKSB7Ci0JCQkJaWYgKHByZXZDaGFyID09IGZQYWlyc1tpXSkgewotCQkJCQlmRW5kUG9zID0gZk9mZnNldCAtIDE7Ci0JCQkJCXBhaXJJbmRleDIgPSBpOwotCQkJCX0KLQkJCQkvLyBlbHNlIGlmIChuZXh0Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkvLyBmRW5kUG9zPSBmT2Zmc2V0OwotCQkJCS8vIHBhaXJJbmRleDI9IGk7Ci0JCQkJLy8gfQotCQkJfQotCQkJaWYgKGZFbmRQb3MgPiAtMSkgewotCQkJCWZBbmNob3IgPSBJQ2hhcmFjdGVyUGFpck1hdGNoZXIuUklHSFQ7Ci0JCQkJZlN0YXJ0UG9zID0gc2VhcmNoRm9yT3BlbmluZ1BlZXIoZkVuZFBvcywgZlBhaXJzW3BhaXJJbmRleDIgLSAxXSwgZlBhaXJzW3BhaXJJbmRleDJdLCBmRG9jdW1lbnQpOwotCQkJCWlmIChmU3RhcnRQb3MgPiAtMSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlmRW5kUG9zID0gLTE7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChmU3RhcnRQb3MgPiAtMSkgewotCQkJCWZBbmNob3IgPSBJQ2hhcmFjdGVyUGFpck1hdGNoZXIuTEVGVDsKLQkJCQlmRW5kUG9zID0gc2VhcmNoRm9yQ2xvc2luZ1BlZXIoZlN0YXJ0UG9zLCBmUGFpcnNbcGFpckluZGV4MV0sIGZQYWlyc1twYWlySW5kZXgxICsgMV0sIGZEb2N1bWVudCk7Ci0JCQkJaWYgKGZFbmRQb3MgPiAtMSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlmU3RhcnRQb3MgPSAtMTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBzZWFyY2hGb3JDbG9zaW5nUGVlcihpbnQgb2Zmc2V0LCBpbnQgb3BlbmluZ1BlZXIsIGludCBjbG9zaW5nUGVlciwgSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmUmVhZGVyLmNvbmZpZ3VyZUZvcndhcmRSZWFkZXIoZG9jdW1lbnQsIG9mZnNldCArIDEsIGRvY3VtZW50LmdldExlbmd0aCgpLCB0cnVlLCB0cnVlKTsKLQkJaW50IHN0YWNrID0gMTsKLQkJaW50IGMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJd2hpbGUgKGMgIT0gSnNDb2RlUmVhZGVyLkVPRikgewotCQkJaWYgKGMgPT0gb3BlbmluZ1BlZXIgJiYgYyAhPSBjbG9zaW5nUGVlcikgewotCQkJCXN0YWNrKys7Ci0JCQl9IGVsc2UgaWYgKGMgPT0gY2xvc2luZ1BlZXIpIHsKLQkJCQlzdGFjay0tOwotCQkJfQotCQkJaWYgKHN0YWNrID09IDApIHsKLQkJCQlyZXR1cm4gZlJlYWRlci5nZXRPZmZzZXQoKTsKLQkJCX0KLQkJCWMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgc2VhcmNoRm9yT3BlbmluZ1BlZXIoaW50IG9mZnNldCwgaW50IG9wZW5pbmdQZWVyLCBpbnQgY2xvc2luZ1BlZXIsIElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZlJlYWRlci5jb25maWd1cmVCYWNrd2FyZFJlYWRlcihkb2N1bWVudCwgb2Zmc2V0LCB0cnVlLCB0cnVlKTsKLQkJaW50IHN0YWNrID0gMTsKLQkJaW50IGMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJd2hpbGUgKGMgIT0gSnNDb2RlUmVhZGVyLkVPRikgewotCQkJaWYgKGMgPT0gY2xvc2luZ1BlZXIgJiYgYyAhPSBvcGVuaW5nUGVlcikgewotCQkJCXN0YWNrKys7Ci0JCQl9IGVsc2UgaWYgKGMgPT0gb3BlbmluZ1BlZXIpIHsKLQkJCQlzdGFjay0tOwotCQkJfQotCQkJaWYgKHN0YWNrID09IDApIHsKLQkJCQlyZXR1cm4gZlJlYWRlci5nZXRPZmZzZXQoKTsKLQkJCX0KLQkJCWMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjA2MWM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1XZWJQcm9qZWN0SnNHbG9iYWxTY29wZUNvbnRhaW5lckluaXRpYWxpemVyLjA9V2ViIFByb2plY3Qgc3VwcG9ydCBmb3IgSlNEVApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9yaW5vLmpwZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvcmluby5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YTZhZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS9yaW5vLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvY29udGVudG91dGxpbmUvSUphdmFXZWJOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0lKYXZhV2ViTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjk5MThmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvY29udGVudG91dGxpbmUvSUphdmFXZWJOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGludGVyZmFjZSBJSmF2YVdlYk5vZGUgewotCXB1YmxpYyBJSmF2YVNjcmlwdEVsZW1lbnQgZ2V0SmF2YUVsZW1lbnQoKTsKLQkKLQlwdWJsaWMgTm9kZSBnZXRQYXJlbnROb2RlKCk7Ci0JCQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCk7Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySlNEVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUZvckpTRFQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFmYTk1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySlNEVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MucHJvdmlzaW9uYWwuY29udGVudG91dGxpbmUuSnNDb250ZW50T3V0bGluZUNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeTsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JKU0RUIGV4dGVuZHMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgewotCXB1YmxpYyBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUZvckpTRFQoKSB7Ci0JCXRoaXMoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JKU0RUKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCQotCQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JKU0RUKGdldEFkYXB0ZXJLZXkoKSwgaXNTaG91bGRSZWdpc3RlckFkYXB0ZXIoKSk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIG5vZGUpIHsKLQkJaWYgKHNpbmdsZXRvbkFkYXB0ZXIgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIHRoZSBKRmFjZU5vZGVBZGFwdGVyCi0JCQkvLyBzaW5nbGV0b25BZGFwdGVyID0gbmV3IEpGYWNlTm9kZUFkYXB0ZXJGb3JKU0RUKHRoaXMpOwotCQkJaWYgKEpzQ29udGVudE91dGxpbmVDb25maWcuVVNFX0FEVkFOQ0VEKSB7Ci0JCQkJc2luZ2xldG9uQWRhcHRlciA9IG5ldyBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MucHJvdmlzaW9uYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZvckpzKHRoaXMpOwotCQkJfSBlbHNlIHsKLQkJCQlzaW5nbGV0b25BZGFwdGVyID0gbmV3IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVBZGFwdGVyRm9ySnModGhpcyk7Ci0JCQl9Ci0JCQlpbml0QWRhcHRlcihzaW5nbGV0b25BZGFwdGVyLCBub2RlKTsKLQkJfQotCQlyZXR1cm4gc2luZ2xldG9uQWRhcHRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGb3JKcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRm9ySnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjZjVlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGb3JKcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVNvdXJjZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0TW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZS5KYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JlLk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5pbnRlcm5hbC5jb3JlLlNvdXJjZVJlZkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQudWkuSmF2YVNjcmlwdEVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLlN0YW5kYXJkSmF2YVNjcmlwdEVsZW1lbnRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSnNUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50Lk5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpGYWNlTm9kZUFkYXB0ZXJGb3JKcyBleHRlbmRzIEpGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MIHsKLQkKLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZvckpzKEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJSmF2YVNjcmlwdFVuaXQgbGF6eUN1OwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCXByaXZhdGUgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbFByb3ZpZGVyIGphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUphdmFTY3JpcHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0SmF2YUVsZW1lbnRQcm92aWRlcigpLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElKYXZhV2ViTm9kZSkgewotCQkJSmF2YUVsZW1lbnQgZW5jbG9zZWRFbGVtZW50ID0gKEphdmFFbGVtZW50KSAoKElKYXZhV2ViTm9kZSkgb2JqZWN0KS5nZXRKYXZhRWxlbWVudCgpOwotCQkJaWYgKGVuY2xvc2VkRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSUphdmFTY3JpcHRFbGVtZW50W10gY2hpbGRyZW4gPSBlbmNsb3NlZEVsZW1lbnQuZ2V0Q2hpbGRyZW4oKTsKLQkJCQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCQkJCXJldHVybiBuZXcgSUphdmFTY3JpcHRFbGVtZW50WzBdOwotCQkJCQl9Ci0JCQkJCU9iamVjdFtdIG5vZGVzID0gbmV3IE9iamVjdFtjaGlsZHJlbi5sZW5ndGhdOwotCQkJCQlOb2RlIHBhcmVudCA9ICgoSUphdmFXZWJOb2RlKSBvYmplY3QpLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJLy8JaW50IGh0bWxsZW5ndGggPSAoKFNvdXJjZVJlZkVsZW1lbnQpIChjaGlsZHJlbltpXSkpLmdldFNvdXJjZVJhbmdlKCkuZ2V0TGVuZ3RoKCk7Ci0JCQkJCS8vCWludCBodG1sb2Zmc2V0ID0gKChTb3VyY2VSZWZFbGVtZW50KSAoY2hpbGRyZW5baV0pKS5nZXRTb3VyY2VSYW5nZSgpLmdldE9mZnNldCgpOwotCQkJCQkJSUphdmFTY3JpcHRFbGVtZW50IGphdmFFbGVtZW50ID0gY2hpbGRyZW5baV07Ci0JCQkJCQlJU291cmNlUmFuZ2UgcmFuZ2UgPSBudWxsOwotCQkJCQkJaWYgKGphdmFFbGVtZW50IGluc3RhbmNlb2YgTWVtYmVyKSB7Ci0JCQkJCQkJCXJhbmdlID0gKChNZW1iZXIpIGphdmFFbGVtZW50KS5nZXROYW1lUmFuZ2UoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXJhbmdlID0gKChTb3VyY2VSZWZFbGVtZW50KSBqYXZhRWxlbWVudCkuZ2V0U291cmNlUmFuZ2UoKTsKLQkJCQkJCX0KLQkJCQkJCWludCBodG1sbGVuZ3RoID0gcmFuZ2UuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQlpbnQgaHRtbG9mZnNldCA9IHJhbmdlLmdldE9mZnNldCgpOwotCi0JCQkJCQkKLQkJCQkJCVBvc2l0aW9uIHBvc2l0aW9uID0gbmV3IFBvc2l0aW9uKGh0bWxvZmZzZXQsIGh0bWxsZW5ndGgpOwotCQkJCQkJbm9kZXNbaV0gPSBnZXRKc05vZGUocGFyZW50LCBqYXZhRWxlbWVudCwgcG9zaXRpb24pOwotCQkJCQl9Ci0JCQkJCXJldHVybiBub2RlczsKLQkJCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJaWYgKGlzSlNFbGVtZW50UGFyZW50KG5vZGUpKSB7Ci0JCQlPYmplY3RbXSByZXN1bHRzID0gZ2V0SlNFbGVtZW50c0Zyb21Ob2RlKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpLCB0cnVlKTsKLQkJCQotCQkJCi0JCQlyZXR1cm4gZmlsdGVyKCByZXN1bHRzICk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCQotCS8qCi0JICogQEdJTk86IEFub255bW91cyAtLSBtYXRjaGVzIGFub255bW91cyB0eXBlcyBvbiB0aGUgdG9wIGxldmVsCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlcyhPYmplY3QgZWxlbWVudE9iaikgewotCQkKLQkJaWYoIGVsZW1lbnRPYmogaW5zdGFuY2VvZiBJSmF2YVdlYk5vZGUgKXsKLQkJCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50ID0gKChJSmF2YVdlYk5vZGUpZWxlbWVudE9iaikuZ2V0SmF2YUVsZW1lbnQoKTsKLQkJCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LlRZUEUgJiYgZWxlbWVudC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhU2NyaXB0RWxlbWVudC5KQVZBU0NSSVBUX1VOSVQgKSB7Ci0JCQkJCi0JCQkJSVR5cGUgdHlwZSA9IChJVHlwZSllbGVtZW50OwotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiB0eXBlLmlzQW5vbnltb3VzKCk7Ci0JCQkJfSBjYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQEdJTk86IEFub255bW91cyBGaWx0ZXIgZnJvbSB0b3AgbGV2ZWwKLQkgKgotCSAqLwotCXByb3RlY3RlZCBPYmplY3RbXSBmaWx0ZXIoT2JqZWN0W10gY2hpbGRyZW4pIHsKLQkJYm9vbGVhbiBpbml0aWFsaXplcnM9IGZhbHNlOwotCQlmb3IgKGludCBpPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChtYXRjaGVzKGNoaWxkcmVuW2ldKSkgewotCQkJCWluaXRpYWxpemVycz0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmICghaW5pdGlhbGl6ZXJzKQotCQkJcmV0dXJuIGNoaWxkcmVuOwotCi0JCVZlY3RvciB2PSBuZXcgVmVjdG9yKCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJaWYgKG1hdGNoZXMoY2hpbGRyZW5baV0pKQotCQkJCWNvbnRpbnVlOwotCQkJdi5hZGRFbGVtZW50KGNoaWxkcmVuW2ldKTsKLQkJfQotCi0JCU9iamVjdFtdIHJlc3VsdD0gbmV3IE9iamVjdFt2LnNpemUoKV07Ci0JCXYuY29weUludG8ocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJcmV0dXJuIGdldEphdmFFbGVtZW50UHJvdmlkZXIoKS5nZXRFbGVtZW50cyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRFbGVtZW50cyhvYmplY3QpOwotCX0KLQkKLQlwcml2YXRlIEphdmFTY3JpcHRFbGVtZW50TGFiZWxQcm92aWRlciBnZXRKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoKSB7Ci0JCWlmKGphdmFFbGVtZW50TGFiZWxQcm92aWRlcj09bnVsbCkgewotCQkJamF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyID0gbmV3IEphdmFTY3JpcHRFbGVtZW50TGFiZWxQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBqYXZhRWxlbWVudExhYmVsUHJvdmlkZXI7Ci0JfQotCQotCXByaXZhdGUgU3RhbmRhcmRKYXZhU2NyaXB0RWxlbWVudENvbnRlbnRQcm92aWRlciBnZXRKYXZhRWxlbWVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFN0YW5kYXJkSmF2YVNjcmlwdEVsZW1lbnRDb250ZW50UHJvdmlkZXIodHJ1ZSk7Ci0JfQotCQotCXByaXZhdGUgT2JqZWN0W10gZmlsdGVyQ2hpbGRyZW5Gb3JSYW5nZShJSmF2YVNjcmlwdEVsZW1lbnRbXSBhbGxDaGlsZHJlbiwgTm9kZSBub2RlKSB7Ci0JLy8JaW50IGphdmFQb3NpdGlvblN0YXJ0ID0gKChOb2RlSW1wbCkgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkvLwlpbnQgamF2YVBvc2l0aW9uRW5kICAgPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJCi0JLy8JT2JqZWN0W10gcmVzdWx0ID1uZXcgT2JqZWN0WzBdOwotCQkKLQkJaW50IGphdmFQb3NpdGlvbkVuZCA9ICgoTm9kZUltcGwpIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpbnQgamF2YVBvc2l0aW9uU3RhcnQgPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCi0JCVZlY3RvciB2YWxpZENoaWxkcmVuID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYWxsQ2hpbGRyZW5baV0gaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQgJiYgYWxsQ2hpbGRyZW5baV0uZ2V0RWxlbWVudFR5cGUoKSAhPSBJSmF2YVNjcmlwdEVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTikgewotCQkJCUlTb3VyY2VSYW5nZSByYW5nZSA9IG51bGw7Ci0JCQkJaWYgKGFsbENoaWxkcmVuW2ldIGluc3RhbmNlb2YgTWVtYmVyKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyYW5nZSA9ICgoTWVtYmVyKSBhbGxDaGlsZHJlbltpXSkuZ2V0TmFtZVJhbmdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGFsbENoaWxkcmVuW2ldICBpbnN0YW5jZW9mIFNvdXJjZVJlZkVsZW1lbnQpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJhbmdlID0gKChTb3VyY2VSZWZFbGVtZW50KWFsbENoaWxkcmVuW2ldICkuZ2V0U291cmNlUmFuZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGFsbENoaWxkcmVuW2ldLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LlRZUEUgfHwgKGphdmFQb3NpdGlvblN0YXJ0IDw9IHJhbmdlLmdldE9mZnNldCgpICYmIHJhbmdlLmdldExlbmd0aCgpICsgcmFuZ2UuZ2V0T2Zmc2V0KCkgPD0gKGphdmFQb3NpdGlvbkVuZCkpKSB7Ci0JCQkJCQotCQkJCQkKLQkJCQkJCQlpbnQgaHRtbGxlbmd0aCA9IHJhbmdlID09IG51bGwgPyAwIDogcmFuZ2UuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQkJaW50IGh0bWxvZmZzZXQgPSByYW5nZSA9PSBudWxsID8gMCA6IHJhbmdlLmdldE9mZnNldCgpOwotCQkJCQkJCWlmIChodG1sbGVuZ3RoIDwgMCB8fCBodG1sb2Zmc2V0IDwgMCkgewotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJUG9zaXRpb24gcG9zaXRpb24gPSBuZXcgUG9zaXRpb24oaHRtbG9mZnNldCwgaHRtbGxlbmd0aCk7Ci0JCQkJCQkJdmFsaWRDaGlsZHJlbi5hZGQoZ2V0SnNOb2RlKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBhbGxDaGlsZHJlbltpXSwgcG9zaXRpb24pKTsKLQkJCQkJCi0JCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JCU9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbMF07Ci0KLQotCQlpZiAodmFsaWRDaGlsZHJlbi5zaXplKCkgPiAwKSB7Ci0JCQlyZXN1bHQgPSB2YWxpZENoaWxkcmVuLnRvQXJyYXkoKTsKLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0Lmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gbmV3IElKYXZhU2NyaXB0RWxlbWVudFswXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIHN5bmNocm9uaXplZCBPYmplY3RbXSBnZXRKU0VsZW1lbnRzRnJvbU5vZGUoTm9kZSBub2RlLCBib29sZWFuIGVuc3VyZUNvbnNpc3RhbnQpIHsKLQkJCQkKLQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJaW50IGVuZE9mZnNldCA9IDA7Ci0JCWludCB0eXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlPYmplY3RbXSByZXN1bHQgPSBudWxsOwotCQlKc1RyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gbnVsbDsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiAobm9kZSBpbnN0YW5jZW9mIE5vZGVJbXBsKSkgewotCQkJc3RhcnRPZmZzZXQgPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQkJZW5kT2Zmc2V0ID0gKChOb2RlSW1wbCkgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlJSmF2YVNjcmlwdFVuaXQgdW5pdCA9IGdldExhenlDdShub2RlKTsKLQkJCXRyeSB7Ci0JCQkJaWYoZW5zdXJlQ29uc2lzdGFudCkgdW5pdC5tYWtlQ29uc2lzdGVudChnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZXgxKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWV4MS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJcmVzdWx0ID0gZmlsdGVyQ2hpbGRyZW5Gb3JSYW5nZSh1bml0LmdldENoaWxkcmVuKCksbm9kZSk7Ci0JCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmVzdWx0ID0gbmV3IE9iamVjdFswXTsKLQkJCQlsYXp5Q3U9bnVsbDsKLQkJCX0KLQkJCQotCQkJLy90cmFuc2xhdGlvbiA9IGdldFRyYW5zbGF0aW9uKG5vZGUpOwotCQkJLy9yZXN1bHQgPSB0cmFuc2xhdGlvbi5nZXRBbGxFbGVtZW50c0luSnNSYW5nZShzdGFydE9mZnNldCwgZW5kT2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlpZihtb25pdG9yPT1udWxsKSB7Ci0JCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQkKLQkJcmV0dXJuIG1vbml0b3I7Ci0JCQotCX0KLQkKLQlwcml2YXRlIE9iamVjdCBnZXRKc05vZGUoTm9kZSBwYXJlbnQsIElKYXZhU2NyaXB0RWxlbWVudCByb290LCBQb3NpdGlvbiBwb3NpdGlvbikgewotCQlKc0pmYWNlTm9kZSBpbnN0YW5jZSA9IG51bGw7Ci0JCWlmIChyb290LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFTY3JpcHRFbGVtZW50LlRZUEUpIHsKLQkJCWluc3RhbmNlID0gbmV3IEpzSmZhY2VOb2RlKHBhcmVudCwgcm9vdCwgcG9zaXRpb24sICgoU291cmNlUmVmRWxlbWVudCkgcm9vdCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCX0gZWxzZSBpZiAocm9vdC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhU2NyaXB0RWxlbWVudC5GSUVMRCkgewotCQkJLyogRmllbGQgcmVmcmVuY2UsIHBvc3NpYmx5IHRvIGEgdHlwZSBtYXkgbmVlZCB0byBpbXBsZW1lbnQgbGF0ZXIgKi8KLQkJCWluc3RhbmNlID0gbmV3IEpzSmZhY2VOb2RlKHBhcmVudCwgcm9vdCwgIHBvc2l0aW9uKTsKLQkJfSBlbHNlIHsKLQkJCWluc3RhbmNlID0gbmV3IEpzSmZhY2VOb2RlKHBhcmVudCwgcm9vdCwgcG9zaXRpb24pOwotCQl9Ci0JCVN0cmluZyBuYW1lID0gZ2V0SmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCkuZ2V0VGV4dChyb290KTsKLQkJaW5zdGFuY2Uuc2V0TmFtZShuYW1lKTsKLQkJLy8gKChKc0pmYWNlTm9kZSlpbnN0YW5jZSkuc2V0QWRhcHRlclJlZ2lzdHJ5KHJlZ2lzdHJ5KTsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoaW5zdGFuY2UpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoIShhZGFwdGVyIGluc3RhbmNlb2YgSkZhY2VOb2RlQWRhcHRlckZvckpzKSkgewotCQkJKGluc3RhbmNlKS5yZW1vdmVBZGFwdGVyKGFkYXB0ZXIpOwotCQkJKGluc3RhbmNlKS5hZGRBZGFwdGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0JCi0JCi0JcHVibGljIEltYWdlIGdldExhYmVsSW1hZ2UoT2JqZWN0IG5vZGUpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBKc0pmYWNlTm9kZSkgewotCQkJcmV0dXJuICgoSnNKZmFjZU5vZGUpIG5vZGUpLmdldEltYWdlKCk7Ci0JCX0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoKS5nZXRJbWFnZShub2RlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TGFiZWxJbWFnZShub2RlKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoT2JqZWN0IG5vZGUpIHsKLS8vCQlpZiAobm9kZSBpbnN0YW5jZW9mIEpzSmZhY2VOb2RlKSB7Ci0vLwkJCXJldHVybiAoKEpzSmZhY2VOb2RlKSBub2RlKS5nZXROYW1lKCk7Ci0vLwkJfQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJcmV0dXJuIGdldEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLmdldFRleHQobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldExhYmVsVGV4dChub2RlKTsKLQl9Ci0JCi0JCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRKYXZhRWxlbWVudFByb3ZpZGVyKCkuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JfQotCQotCXByaXZhdGUgSUphdmFTY3JpcHRVbml0IGdldExhenlDdShOb2RlIG5vZGUpIHsKLQkJaWYobGF6eUN1PT1udWxsKSB7Ci0JCQlsYXp5Q3UgPSBnZXRUcmFuc2xhdGlvbihub2RlKS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCXRyeSB7Ci0JCQkJbGF6eUN1Lm1ha2VDb25zaXN0ZW50KCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpICk7Ci0JCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsYXp5Q3U7Ci0JfQotCQotCXByaXZhdGUgSUpzVHJhbnNsYXRpb24gZ2V0VHJhbnNsYXRpb24oTm9kZSBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCUlET01Eb2N1bWVudCB4bWxEb2MgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKG1vZGVsTWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQltb2RlbCA9IG1vZGVsTWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2MpOwotCQkJCS8vIG1vZGVsID0gbW9kZWxNYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChkb2MpOwotCQkJfQotCQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgbW9kZWw7Ci0JCQl4bWxEb2MgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJLy8gbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHhtbERvYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlKc1RyYW5zbGF0aW9uQWRhcHRlciB0cmFuc2xhdGlvbkFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJcmV0dXJuIHRyYW5zbGF0aW9uQWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbih0cnVlKTsKLQl9Ci0JCi0JCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUphdmFTY3JpcHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0SmF2YUVsZW1lbnRQcm92aWRlcigpLmhhc0NoaWxkcmVuKG9iamVjdCk7Ci0JCX0KLQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJSmF2YVdlYk5vZGUpIHsKLQkJCXJldHVybiAoKElKYXZhV2ViTm9kZSkgb2JqZWN0KS5oYXNDaGlsZHJlbigpOwotCQkJCi0JCX0KLQkJaWYgKGlzSlNFbGVtZW50UGFyZW50KG5vZGUpKSB7Ci0JCQlPYmplY3RbXSBub2RlcyA9IGdldEpTRWxlbWVudHNGcm9tTm9kZShub2RlLmdldEZpcnN0Q2hpbGQoKSxmYWxzZSk7Ci0JCQlib29sZWFuIGhhc0VsZW1lbnRzID0gKG5vZGVzICE9IG51bGwgJiYgbm9kZXMubGVuZ3RoID4gMCk7Ci0JCQlyZXR1cm4gaGFzRWxlbWVudHM7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmhhc0NoaWxkcmVuKG9iamVjdCk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc0pTRWxlbWVudFBhcmVudChOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIChub2RlLmhhc0NoaWxkTm9kZXMoKSAmJiBub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgic2NyaXB0IikpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9Kc0pmYWNlTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9jb250ZW50b3V0bGluZS9Kc0pmYWNlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGRjNTE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvY29udGVudG91dGxpbmUvSnNKZmFjZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0TW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwuY29yZS5KYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5KYXZhU2NyaXB0RWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5JSnNUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIuY29yZS5qYXZhc2NyaXB0LkpzVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0Tm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgSnNKZmFjZU5vZGUgZXh0ZW5kcyBFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEluZGV4ZWRSZWdpb24sIElOb2RlTm90aWZpZXIsIE5vZGUsIElKYXZhV2ViTm9kZSB7Ci0JcHJpdmF0ZSBjbGFzcyBKc0FkYXB0YWJsZU5vZGUgZXh0ZW5kcyBBYnN0cmFjdE5vdGlmaWVyIHsKLQkJCi0JCXB1YmxpYyBGYWN0b3J5UmVnaXN0cnkgZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkgewotCQkJcmV0dXJuIGFkYXB0ZXJSZWdpc3RyeTsKLQkJfQotCX0KLQlwcml2YXRlIEpzQWRhcHRhYmxlTm9kZSBhZGFwdGFibGVEb21Ob2RlID0gbmV3IEpzQWRhcHRhYmxlTm9kZSgpOwotCXByaXZhdGUgRmFjdG9yeVJlZ2lzdHJ5IGFkYXB0ZXJSZWdpc3RyeTsKLQlwcml2YXRlIFBvc2l0aW9uIGZEb2NQb3NpdGlvbjsKLS8vCXByaXZhdGUgTm9kZSBwYXJlbnQ7Ci0JcHJpdmF0ZSBTdHJpbmcgdHlwZU5hbWU7Ci0JLy9wcml2YXRlIElKYXZhU2NyaXB0RWxlbWVudCBkaXJ0eUVsZW1lbnQ7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc0NoaWxkcmVuOwotCS8vcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIEltYWdlIG1lOwotCQotCXB1YmxpYyBKc0pmYWNlTm9kZShOb2RlIHBhcmVudCwgSUphdmFTY3JpcHRFbGVtZW50IG9yaWdpbmFsRWxlbWVudCwgUG9zaXRpb24gc3RydWN0dXJlRG9jTG9jYXRpb24pIHsKLQkJdGhpcyhwYXJlbnQsIG9yaWdpbmFsRWxlbWVudCwgc3RydWN0dXJlRG9jTG9jYXRpb24sIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgSnNKZmFjZU5vZGUoTm9kZSBwYXJlbnQsIElKYXZhU2NyaXB0RWxlbWVudCBvcmlnaW5hbEVsZW1lbnQsIFBvc2l0aW9uIHN0cnVjdHVyZURvY0xvY2F0aW9uLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJLy9zdXBlcigpOwotCQlzdXBlcigoKEVsZW1lbnRJbXBsKXBhcmVudCkpOwotCQkvLyBzdXBlcihwYXJlbnRPYmplY3QsIHBhcmVudE9iamVjdC5nZXRFbGVtZW50TmFtZSgpKTsKLQkJZkRvY1Bvc2l0aW9uID0gc3RydWN0dXJlRG9jTG9jYXRpb247Ci0JCS8vdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKLQkJdHJ5IHsKLQkJCWhhc0NoaWxkcmVuPSgoSmF2YUVsZW1lbnQpb3JpZ2luYWxFbGVtZW50KS5oYXNDaGlsZHJlbigpOwotCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCWhhc0NoaWxkcmVuPWZhbHNlOwotCQl9Ci0JCXJlbW92ZUF0dHJpYnV0ZXMoKTsKLQkJbWUgPSAobmV3IEphdmFTY3JpcHRFbGVtZW50TGFiZWxQcm92aWRlcigpKS5nZXRJbWFnZShvcmlnaW5hbEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBtZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLS8vCQl0cnkgewotLy8JCQlyZXR1cm4gKChKYXZhRWxlbWVudCl0aGlzLmRpcnR5RWxlbWVudCkuaGFzQ2hpbGRyZW4oKTsKLS8vCQl9IGNhdGNoIChKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gZXgpIHsKLS8vCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotLy8JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQl9Ci0JCXJldHVybiBoYXNDaGlsZHJlbjsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyLnNldFRhZ05hbWUobmFtZSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCBhZGRBZGFwdGVyKElOb2RlQWRhcHRlciBhZGFwdGVyKSB7Ci0JCWFkYXB0YWJsZURvbU5vZGUuYWRkQWRhcHRlcihhZGFwdGVyKTsKLQl9Ci0JCi0JCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHRlc3RQb3NpdGlvbikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlyZXR1cm4gKG8gIT0gbnVsbCAmJiBvIGluc3RhbmNlb2YgSnNKZmFjZU5vZGUgJiYgKChKc0pmYWNlTm9kZSkgbykuZkRvY1Bvc2l0aW9uID09IHRoaXMuZkRvY1Bvc2l0aW9uKTsKLQl9Ci0JCi0vLyBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRJbnN0YW5jZShPYmplY3QgcGFyZW50LCBQb3NpdGlvbiBzdHJ1Y3R1cmVEb2NMb2NhdGlvbgotLy8gKXsKLS8vIC8vcmV0dXJuIG5ldyBKc0pmYWNlTm9kZSgoSmF2YUVsZW1lbnQpcGFyZW50LmdldFBhcmVudCgpLAotLy8gcGFyZW50LmdldEVsZW1lbnROYW1lKCksc3RydWN0dXJlRG9jTG9jYXRpb24pOwotLy8gVmVjdG9yIGludGVyZmFjZXMgPSBuZXcgVmVjdG9yKCk7Ci0vLyBpbnRlcmZhY2VzLmFkZEFsbChBcnJheXMuYXNMaXN0KHBhcmVudC5nZXRDbGFzcygpLmdldEludGVyZmFjZXMoKSkpOwotLy8gSnNKZmFjZU5vZGUgbWUgPSBuZXcgSnNKZmFjZU5vZGUocGFyZW50LHN0cnVjdHVyZURvY0xvY2F0aW9uKTsKLS8vIGludGVyZmFjZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QobWUuZ2V0Q2xhc3MoKS5nZXRJbnRlcmZhY2VzKCkpKTsKLS8vIE9iamVjdCBwcm94eSA9IG51bGw7Ci0vLyB0cnkgewotLy8gcHJveHk9IFByb3h5Lm5ld1Byb3h5SW5zdGFuY2UoCi0vLyBwYXJlbnQuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLAotLy8gKENsYXNzW10paW50ZXJmYWNlcy50b0FycmF5KG5ldyBDbGFzc1tde30pLG1lKTsKLS8vIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLyAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0vLyBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0vLyB9Ci0vLyByZXR1cm4gcHJveHk7Ci0vLyB9Ci0vLyAgIAotCQotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgZ2V0QWRhcHRlckZvcihPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gYWRhcHRhYmxlRG9tTm9kZS5nZXRBZGFwdGVyRm9yKHR5cGUpOwotCX0KLQkKLQkKLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZGFwdGVycygpIHsKLQkJcmV0dXJuIGFkYXB0YWJsZURvbU5vZGUuZ2V0QWRhcHRlcnMoKTsKLQl9Ci0JCi0JCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBmRG9jUG9zaXRpb24uZ2V0T2Zmc2V0KCkgKyBmRG9jUG9zaXRpb24uZ2V0TGVuZ3RoKCk7Ci0JfQotCQotCQotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgZ2V0RXhpc3RpbmdBZGFwdGVyKE9iamVjdCB0eXBlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGFkYXB0YWJsZURvbU5vZGUuZ2V0RXhpc3RpbmdBZGFwdGVyKHR5cGUpOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIElKYXZhU2NyaXB0RWxlbWVudCBnZXRKYXZhRWxlbWVudCgpIHsKLQkJLyoKLQkJICogc2luY2UgdGhpcyBtYXkgYmVjb21lICdzdGFsZScgd2UgbmVlZCB0byByZWRpc2NvdmVyIG91ciBlbGVtZW50IGV2ZXJ5Ci0JCSAqIHRpbWUgd2UncmUgYXNrZWQKLQkJICovCi0JCUlKc1RyYW5zbGF0aW9uIHRyYW4gPSBnZXRUcmFuc2xhdGlvbigpOwotCQlpbnQgc3RhcnRPZmZzZXQgPSBnZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kT2Zmc2V0ID0gZ2V0TGVuZ3RoKCk7Ci0JCWlmICh0eXBlTmFtZSAhPSBudWxsKSB7Ci0JCQlJSmF2YVNjcmlwdEVsZW1lbnQgbXlUeXBlID0gdHJhbi5nZXRDb21waWxhdGlvblVuaXQoKS5nZXRUeXBlKHR5cGVOYW1lKTsKLQkJCXJldHVybiBteVR5cGU7Ci0JCX0KLQkJSUphdmFTY3JpcHRFbGVtZW50IGVsZW1lbnRzW10gPSB0cmFuLmdldEFsbEVsZW1lbnRzSW5Kc1JhbmdlKHN0YXJ0T2Zmc2V0LCBzdGFydE9mZnNldCArIGVuZE9mZnNldCk7Ci0JCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZWxlbWVudHNbMF07Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZXMuZ2V0U3RyaW5nKCJKc0pmYWNlTm9kZS4xIikpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZEb2NQb3NpdGlvbi5nZXRMZW5ndGgoKTsKLQl9Ci0JCi0JCi0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuTm9kZUltcGwjZ2V0T3duZXJEb2N1bWVudCgpCi0JICovCi0JCi0KLQkKLQkKLQotCQotCQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBmRG9jUG9zaXRpb24uZ2V0T2Zmc2V0KCk7Ci0JfQotCQotLy8gcHJpdmF0ZSBNZXRob2RbXSBnZXRNZXRob2RzKCl7Ci0vLyAvLyByZXR1cm5zIHRoZSBtZXRob2RzIHRoaXMgY2xhc3Mgc3VwcG9ydHMgKGFzIGRlY2xhcmVkIGluIGludGVyZmFjZXMpCi0vLyBDbGFzc1tdIGludGVyZmFjZXMgPSBnZXRDbGFzcygpLmdldEludGVyZmFjZXMoKTsKLS8vIFZlY3RvciB2TWV0aG9kcyA9IG5ldyBWZWN0b3IoKTsKLS8vIGZvcihpbnQgaSA9IDA7aTxpbnRlcmZhY2VzLmxlbmd0aDtpKyspewotLy8gTWV0aG9kIG1ldGhvZHNbXSA9IGludGVyZmFjZXNbaV0uZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0vLyB2TWV0aG9kcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChtZXRob2RzKSk7Ci0vLyB9Ci0vLyAgICAgICAgCi0vLyByZXR1cm4gKE1ldGhvZFtdKXZNZXRob2RzLnRvQXJyYXkoKTsKLS8vIH0KLS8vIHB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCBwcm94eSwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykgdGhyb3dzCi0vLyBUaHJvd2FibGUgewotLy8gT2JqZWN0IHJlc3VsdDsKLS8vIE1ldGhvZFtdIG15TWV0aG9kcyA9IGdldE1ldGhvZHMoKTsKLS8vICAgICAgICAKLS8vIHRyeSB7Ci0vLyBmb3IoaW50IGkgPSAwO2k8bXlNZXRob2RzLmxlbmd0aDtpKyspewotLy8gaWYobXlNZXRob2RzW2ldPT1tZXRob2QpewotLy8gcmV0dXJuIG1ldGhvZC5pbnZva2UodGhpcywgYXJncyk7Ci0vLyB9Ci0vLyB9Ci0vLyByZXN1bHQgPSBtZXRob2QuaW52b2tlKHBhcmVudFR5cGUsIGFyZ3MpOwotLy8gfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0vLyB0aHJvdyBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotLy8gfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIGludm9jYXRpb24gZXhjZXB0aW9uOiAiICsKLS8vIGUuZ2V0TWVzc2FnZSgpKTsKLS8vIH0KLS8vCi0vLyByZXR1cm4gcmVzdWx0OwotLy8gfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50Lk5vZGVJbXBsI2dldFN0cnVjdHVyZWREb2N1bWVudCgpCi0JICovCi0JCi0KLQkKLQlwdWJsaWMgSUpzVHJhbnNsYXRpb24gZ2V0VHJhbnNsYXRpb24oKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCUlET01Eb2N1bWVudCB4bWxEb2MgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKG1vZGVsTWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQltb2RlbCA9IG1vZGVsTWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2MpOwotCQkJCS8vIG1vZGVsID0gbW9kZWxNYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChkb2MpOwotCQkJfQotCQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgbW9kZWw7Ci0JCQl4bWxEb2MgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJLy8gbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHhtbERvYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlKc1RyYW5zbGF0aW9uQWRhcHRlciB0cmFuc2xhdGlvbkFkYXB0ZXIgPSAoSnNUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKc1RyYW5zbGF0aW9uLmNsYXNzKTsKLQkJcmV0dXJuIHRyYW5zbGF0aW9uQWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbih0cnVlKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgbm90aWZ5KGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJYWRhcHRhYmxlRG9tTm9kZS5ub3RpZnkoZXZlbnRUeXBlLCBjaGFuZ2VkRmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBwb3MpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVBZGFwdGVyKElOb2RlQWRhcHRlciBhZGFwdGVyKSB7Ci0JCWFkYXB0YWJsZURvbU5vZGUucmVtb3ZlQWRhcHRlcihhZGFwdGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QWRhcHRlclJlZ2lzdHJ5KEZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQl0aGlzLmFkYXB0ZXJSZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvY29udGVudG91dGxpbmUvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvY29udGVudG91dGxpbmUvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE0NDgxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qCi0gKiBAYXV0aG9yIGNoaWxkc2IKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5jb250ZW50b3V0bGluZS5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvY29udGVudG91dGxpbmUvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvY29udGVudG91dGxpbmUvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM2ZTViZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotSnNKZmFjZU5vZGUuMT1lcnJvciBpbiBKc0pmYWNlTm9kZS4uLiBJIGNvdWxkbid0IHJldHJpZXZlIG15IGphdmEgZWxlbWVudCBmcm9tIHRoZSBvcmlnaW5hbCBwYWdlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGb3JKcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9wcm92aXNpb25hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRm9ySnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAxNTdlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGb3JKcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLnByb3Zpc2lvbmFsLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLkphdmFTY3JpcHRFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5TdGFuZGFyZEphdmFTY3JpcHRFbGVtZW50Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi5jb3JlLmphdmFzY3JpcHQuSUpzVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLmNvcmUuamF2YXNjcmlwdC5Kc1RyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotLyoqCi0qCi0KLSogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0qIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotKi8KLXB1YmxpYyBjbGFzcyBKRmFjZU5vZGVBZGFwdGVyRm9ySnMgZXh0ZW5kcyBKRmFjZU5vZGVBZGFwdGVyRm9ySFRNTCB7Ci0JcHVibGljIEpGYWNlTm9kZUFkYXB0ZXJGb3JKcyhKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRKYXZhRWxlbWVudFByb3ZpZGVyKCkuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJfQotCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQlpZiAoaXNKU0VsZW1lbnRQYXJlbnQobm9kZSkpIHsKLS8vIE9iamVjdFtdIHJlc3VsdHMgPSBnZXRKU0VsZW1lbnRzRnJvbU5vZGUobm9kZS5nZXRGaXJzdENoaWxkKCkpOwotLy8gSU1lbWJlcltdIGFsbFJlc3VsdHMgPSBuZXcgSU1lbWJlcltyZXN1bHRzLmxlbmd0aF07Ci0vLyBmb3IoaW50IGkgPSAwO2k8cmVzdWx0cy5sZW5ndGg7aSsrKSB7Ci0vLyBpZihyZXN1bHRzW2ldPT1udWxsKSBjb250aW51ZTsKLS8vIElNZW1iZXIgbWVtYmVyID0gKChJTWVtYmVyKXJlc3VsdHNbaV0pOwotLy8gYWxsUmVzdWx0c1tpXSA9IG1lbWJlcjsKLQkJCS8vIH0KLQkJCXJldHVybiBnZXRKU0VsZW1lbnRzRnJvbU5vZGUobm9kZS5nZXRGaXJzdENoaWxkKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQkKLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUphdmFTY3JpcHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0SmF2YUVsZW1lbnRQcm92aWRlcigpLmdldEVsZW1lbnRzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRzKG9iamVjdCk7Ci0JfQotCQotCXByaXZhdGUgSmF2YVNjcmlwdEVsZW1lbnRMYWJlbFByb3ZpZGVyIGdldEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKYXZhU2NyaXB0RWxlbWVudExhYmVsUHJvdmlkZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdGFuZGFyZEphdmFTY3JpcHRFbGVtZW50Q29udGVudFByb3ZpZGVyIGdldEphdmFFbGVtZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RhbmRhcmRKYXZhU2NyaXB0RWxlbWVudENvbnRlbnRQcm92aWRlcih0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgT2JqZWN0W10gZ2V0SlNFbGVtZW50c0Zyb21Ob2RlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJfQotCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQlpbnQgZW5kT2Zmc2V0ID0gMDsKLQkJaW50IHR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudFtdIHJlc3VsdCA9IG51bGw7Ci0JCUlKc1RyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gbnVsbDsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiAobm9kZSBpbnN0YW5jZW9mIE5vZGVJbXBsKSkgewotCQkJc3RhcnRPZmZzZXQgPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQkJZW5kT2Zmc2V0ID0gKChOb2RlSW1wbCkgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl0cmFuc2xhdGlvbiA9IGdldFRyYW5zbGF0aW9uKG5vZGUpOwotCQkJcmVzdWx0ID0gdHJhbnNsYXRpb24uZ2V0QWxsRWxlbWVudHNJbkpzUmFuZ2Uoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLS8vCQkJCi0vLyBpZiAocmVzdWx0ID09IG51bGwpIHJldHVybiBudWxsOwotLy8gT2JqZWN0W10gbmV3UmVzdWx0cyA9IG5ldyBPYmplY3RbcmVzdWx0Lmxlbmd0aF07Ci0vLyBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotLy8gaW50IGh0bWxsZW5ndGggPSAwOwotLy8gaW50IGh0bWxvZmZzZXQgPSAwOwotLy8gUG9zaXRpb24gcG9zaXRpb24gPSBudWxsOwotLy8gdHJ5IHsKLS8vIGh0bWxsZW5ndGggPSAoKFNvdXJjZVJlZkVsZW1lbnQpIChyZXN1bHRbaV0pKS5nZXRTb3VyY2VSYW5nZSgpLmdldExlbmd0aCgpOwotLy8gaHRtbG9mZnNldCA9IHRyYW5zbGF0aW9uLmdldEpzcE9mZnNldCgoKFNvdXJjZVJlZkVsZW1lbnQpCi0vLyAocmVzdWx0W2ldKSkuZ2V0U291cmNlUmFuZ2UoKS5nZXRPZmZzZXQoKSk7Ci0vLyBwb3NpdGlvbiA9IG5ldyBQb3NpdGlvbihodG1sb2Zmc2V0LCBodG1sbGVuZ3RoKTsKLS8vIH0gY2F0Y2ggKEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0vLyBlLnByaW50U3RhY2tUcmFjZSgpOwotLy8gfQotLy8gbmV3UmVzdWx0c1tpXSA9IGdldEpzTm9kZShub2RlLmdldFBhcmVudE5vZGUoKSwgKElKYXZhU2NyaXB0RWxlbWVudCkgcmVzdWx0W2ldLAotLy8gcG9zaXRpb24pOwotLy8gfQotLy8gcmV0dXJuIG5ld1Jlc3VsdHM7Ci0JfQotCQotCQotCXB1YmxpYyBJbWFnZSBnZXRMYWJlbEltYWdlKE9iamVjdCBub2RlKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSUphdmFTY3JpcHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0SmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCkuZ2V0SW1hZ2Uobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldExhYmVsSW1hZ2Uobm9kZSk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWxUZXh0KE9iamVjdCBub2RlKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSUphdmFTY3JpcHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0SmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCkuZ2V0VGV4dChub2RlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TGFiZWxUZXh0KG5vZGUpOwotCX0KLQkKLQkKLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJcmV0dXJuIGdldEphdmFFbGVtZW50UHJvdmlkZXIoKS5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChlbGVtZW50KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJSnNUcmFuc2xhdGlvbiBnZXRUcmFuc2xhdGlvbihOb2RlIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSURPTURvY3VtZW50IHhtbERvYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAobW9kZWxNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9ICgoTm9kZUltcGwpIG5vZGUpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCW1vZGVsID0gbW9kZWxNYW5hZ2VyLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvYyk7Ci0JCQkJLy8gbW9kZWwgPSBtb2RlbE1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGRvYyk7Ci0JCQl9Ci0JCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBtb2RlbDsKLQkJCXhtbERvYyA9IGRvbU1vZGVsLmdldERvY3VtZW50KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkvLyBtb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlpZiAoeG1sRG9jID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUpzVHJhbnNsYXRpb25BZGFwdGVyIHRyYW5zbGF0aW9uQWRhcHRlciA9IChKc1RyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpzVHJhbnNsYXRpb24uY2xhc3MpOwotCQlyZXR1cm4gdHJhbnNsYXRpb25BZGFwdGVyLmdldEpTUFRyYW5zbGF0aW9uKHRydWUpOwotCX0KLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJSmF2YVNjcmlwdEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRKYXZhRWxlbWVudFByb3ZpZGVyKCkuaGFzQ2hpbGRyZW4ob2JqZWN0KTsKLQkJfQotCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQlpZiAoaXNKU0VsZW1lbnRQYXJlbnQobm9kZSkpIHsKLQkJCU9iamVjdFtdIHJlc3VsdHMgPSBnZXRKU0VsZW1lbnRzRnJvbU5vZGUobm9kZS5nZXRGaXJzdENoaWxkKCkpOwotCQkJcmV0dXJuIChyZXN1bHRzICE9IG51bGwgJiYgcmVzdWx0cy5sZW5ndGggPiAwKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaGFzQ2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzSlNFbGVtZW50UGFyZW50KE5vZGUgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJzY3JpcHQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pzQ29udGVudE91dGxpbmVDb25maWcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvSnNDb250ZW50T3V0bGluZUNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODg5NjMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvSnNDb250ZW50T3V0bGluZUNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkudmlld3MucHJvdmlzaW9uYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS52aWV3cy5jb250ZW50b3V0bGluZS5IVE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uOwotCi0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzQ29udGVudE91dGxpbmVDb25maWcgZXh0ZW5kcyBIVE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gVVNFX0FEVkFOQ0VEID0gZmFsc2U7Ci0JSUxhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXIgPSBudWxsOwotCQotCXB1YmxpYyBKc0NvbnRlbnRPdXRsaW5lQ29uZmlnKCkge30KLQkKLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGdldEphdmFMYWJlbFByb3ZpZGVyKCkgewotCQlpZiAoZkxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZkxhYmVsUHJvdmlkZXIgPSBuZXcgSnNMYWJlbFByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZMYWJlbFByb3ZpZGVyOwotCX0KLQkKLQkKLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQlpZiAoIUpzQ29udGVudE91dGxpbmVDb25maWcuVVNFX0FEVkFOQ0VEKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0TGFiZWxQcm92aWRlcih2aWV3ZXIpOwotCQl9Ci0JCXJldHVybiBnZXRKYXZhTGFiZWxQcm92aWRlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSU1lbnVMaXN0ZW5lciBnZXRNZW51TGlzdGVuZXIoVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCS8vIGlmKCFVU0VfQURWQU5DRUQpCi0JCS8vIHJldHVybiBzdXBlci5nZXRNZW51TGlzdGVuZXIodHJlZVZpZXdlcik7Ci0JCXJldHVybiBuZXcgSnNNZW51TGlzdGVuZXIodHJlZVZpZXdlcik7Ci0JfQotCQotCQotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRTdGF0dXNMaW5lTGFiZWxQcm92aWRlcihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJaWYgKCFKc0NvbnRlbnRPdXRsaW5lQ29uZmlnLlVTRV9BRFZBTkNFRCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyKHRyZWVWaWV3ZXIpOwotCQl9Ci0JCXJldHVybiBnZXRKYXZhTGFiZWxQcm92aWRlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvSnNMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pzTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzMwZjE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvSnNMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5wcm92aXNpb25hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5KYXZhU2NyaXB0RWxlbWVudExhYmVsUHJvdmlkZXI7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzTGFiZWxQcm92aWRlciBleHRlbmRzIFhNTExhYmVsUHJvdmlkZXIgewotCUphdmFTY3JpcHRFbGVtZW50TGFiZWxQcm92aWRlciBmTGFiZWxQcm92aWRlciA9IG51bGw7Ci0JCi0JCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgSUphdmFTY3JpcHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0SmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCkuZ2V0SW1hZ2Uobyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG8pOwotCX0KLQkKLQlwcml2YXRlIEphdmFTY3JpcHRFbGVtZW50TGFiZWxQcm92aWRlciBnZXRKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoKSB7Ci0JCWlmIChmTGFiZWxQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmTGFiZWxQcm92aWRlciA9IG5ldyBKYXZhU2NyaXB0RWxlbWVudExhYmVsUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gZkxhYmVsUHJvdmlkZXI7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIElKYXZhU2NyaXB0RWxlbWVudCkgewotCQkJcmV0dXJuIGdldEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLmdldFRleHQobyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFRleHQobyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9wcm92aXNpb25hbC9jb250ZW50b3V0bGluZS9Kc01lbnVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9wcm92aXNpb25hbC9jb250ZW50b3V0bGluZS9Kc01lbnVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTMyMjg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvSnNNZW51TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5wcm92aXNpb25hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Hcm91cE1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLkludGVybmFsSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuaW50ZXJuYWwudWkuamF2YWVkaXRvci5Db21waWxhdGlvblVuaXRFZGl0b3JBY3Rpb25Db250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC51aS5JQ29udGV4dE1lbnVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklKYXZhV2ViTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklSZWxlYXNhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuWE1MTm9kZUFjdGlvbk1hbmFnZXI7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzTWVudUxpc3RlbmVyIGV4dGVuZHMgWE1MTm9kZUFjdGlvbk1hbmFnZXIgaW1wbGVtZW50cyBJTWVudUxpc3RlbmVyLCBJUmVsZWFzYWJsZSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9HUk9VUF9JRCA9ICJncm91cC5lZGl0IjsgLy8kTk9OLU5MUy0xJAotCUNvbXBpbGF0aW9uVW5pdEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yIGNvbnRyaWI7Ci0JcHJpdmF0ZSBYTUxOb2RlQWN0aW9uTWFuYWdlciBmQWN0aW9uTWFuYWdlcjsKLQlwcml2YXRlIFRyZWVWaWV3ZXIgZlRyZWVWaWV3ZXI7Ci0JSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOwotCQotCXB1YmxpYyBKc01lbnVMaXN0ZW5lcihUcmVlVmlld2VyIHZpZXdlcikgewotCQlzdXBlcigoSVN0cnVjdHVyZWRNb2RlbCkgdmlld2VyLmdldElucHV0KCksIHZpZXdlcik7Ci0JCWNvbnRyaWIgPSBuZXcgQ29tcGlsYXRpb25Vbml0RWRpdG9yQWN0aW9uQ29udHJpYnV0b3IoKTsKLQkJZlRyZWVWaWV3ZXIgPSB2aWV3ZXI7Ci0vLwkJCQotLy8gZkFjdGlvbkdyb3Vwcz0gbmV3IENvbXBvc2l0ZUFjdGlvbkdyb3VwKG5ldyBBY3Rpb25Hcm91cFtdIHsKLS8vIG5ldyBPcGVuVmlld0FjdGlvbkdyb3VwKGdldFdvcmtiZW5jaFNpdGUoKSwgZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSksCi0vLyBuZXcgQ0NQQWN0aW9uR3JvdXAoZ2V0V29ya2JlbmNoU2l0ZSgpKSwKLS8vIG5ldyBHZW5lcmF0ZUFjdGlvbkdyb3VwKGdldFdvcmtiZW5jaFNpdGUoKSksCi0vLyBuZXcgUmVmYWN0b3JBY3Rpb25Hcm91cChnZXRXb3JrYmVuY2hTaXRlKCkpLAotLy8gbmV3IEphdmFTZWFyY2hBY3Rpb25Hcm91cChnZXRXb3JrYmVuY2hTaXRlKCkpfSk7Ci0JfQotCQotCXB1YmxpYyBJQWN0aW9uW10gZ2V0QWxsSnNBY3Rpb25zKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBJV29ya2JlbmNoU2l0ZSBnZXRXb3JrYmVuY2hTaXRlKCkgewotCQlyZXR1cm4gSW50ZXJuYWxIYW5kbGVyVXRpbC5nZXRBY3RpdmVTaXRlKGZUcmVlVmlld2VyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZlRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBUcmVlU2VsZWN0aW9uKSB7Ci0JCQlUcmVlU2VsZWN0aW9uIHRzZWxlY3QgPSAoVHJlZVNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJT2JqZWN0W10gZWxlbWVudHMgPSB0c2VsZWN0LnRvQXJyYXkoKTsKLQkJCWludCBqYXZhQ291bnQgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChlbGVtZW50c1tpXSBpbnN0YW5jZW9mIElKYXZhV2ViTm9kZSkgewotCQkJCQlqYXZhQ291bnQrKzsKLQkJCQl9Ci0JCQl9Ci0JCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWFuYWdlci5nZXRJdGVtcygpOwotLy8gbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfTkVXKSk7Ci0vLyBtZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX0dPVE8pKTsKLS8vIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX09QRU4pKTsKLS8vIG1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfU0hPVykpOwotLy8gbWVudS5hZGQobmV3IFNlcGFyYXRvcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9FRElUKSk7Ci0vLyBtZW51LmFkZChuZXcgU2VwYXJhdG9yKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9SRU9SR0FOSVpFKSk7Ci0vLyBtZW51LmFkZChuZXcgU2VwYXJhdG9yKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9HRU5FUkFURSkpOwotLy8gbWVudS5hZGQobmV3IFNlcGFyYXRvcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfU0VBUkNIKSk7Ci0vLyBtZW51LmFkZChuZXcgU2VwYXJhdG9yKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9CVUlMRCkpOwotLy8gbWVudS5hZGQobmV3IFNlcGFyYXRvcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfQURESVRJT05TKSk7Ci0vLyBtZW51LmFkZChuZXcgU2VwYXJhdG9yKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9WSUVXRVJfU0VUVVApKTsKLS8vIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX1BST1BFUlRJRVMpKTsKLQkJCWlmIChqYXZhQ291bnQgPT0gZWxlbWVudHMubGVuZ3RoICYmIGphdmFDb3VudCAhPSAwKSB7Ci0JCQkJLy8gc2VlIHBsdWdpbi54bWwgZm9yIG9iamVjdCBjb250cmlidXRpb25zIHRoYXQgcG9wdWxhdGUgdGhlc2UKLQkJCQkvLyBtZW51cwotCQkJCS8qCi0JCQkJICogTWVudSBmb3I6Ci0JCQkJICogCi0JCQkJICogT3BlbiBUeXBlIEhpZXJhcmNoeSBPcGVuIENhbGwgSGllcmFyY2h5IFNob3cgSW4tLT4gU2NyaXB0Ci0JCQkJICogRXhwbG9yZXIgTmF2aWdhdG9yCi0JCQkJICovCi0JCQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfU0hPVykpOwotCQkJCW1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfU0hPVykpOwotCQkJCS8qCi0JCQkJICogTWVudSBmb3I6IEN1dCBDb3B5IFBhc3RlIERlbGV0ZQotCQkJCSAqLwotCQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSnNNZW51TGlzdGVuZXIuRURJVF9HUk9VUF9JRCkpOwotCQkJCW1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcihKc01lbnVMaXN0ZW5lci5FRElUX0dST1VQX0lEKSk7Ci0JCQkJLyoKLQkJCQkgKiBNZW51IGZvcjoKLQkJCQkgKiAKLQkJCQkgKiBTb3VyY2UtLT4gR2VuZXJhdGUgRWxlbWVudCBDb21tZW50Ci0JCQkJICogCi0JCQkJICogCi0JCQkJICogUmVmYWN0b3ItLT4gUmVuYW1lIE1vdmUgQ2hhbmdlIEZ1bmN0aW9uIFNpZ25hdHVyZSBJbmxpbmUKLQkJCQkgKiBJbnRyb2R1Y2UgSW5kaXJlY3Rpb24gSW5mZXIgR2VuZXJpYyBUeXBlIEFyZ3VtZW50cwotCQkJCSAqLwotCQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX1NPVVJDRSkpOwotCQkJCW1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfU09VUkNFKSk7Ci0JCQkJLyoKLQkJCQkgKiBNZW51IGZvcjoKLQkJCQkgKiAKLQkJCQkgKiBSZWZyZW5jZXMtLT4gV29ya3NwYWNlIFByb2plY3QgSGllcmFyY2h5IFdvcmtpbmcgU2V0Ci0JCQkJICogCi0JCQkJICogRGVjbGVyYXRpb25zLS0+IFdvcmtzcGFjZSBQcm9qZWN0IEhpZXJhcmNoeSBXb3JraW5nIFNldAotCQkJCSAqIAotCQkJCSAqLwotCQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX1NFQVJDSCkpOwotCQkJCW1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfU0VBUkNIKSk7Ci0JCQkJLyogYWxsIEphdmEgRWxlbWVudHMgKi8KLS8vCQkJCQkKLS8vCQkJCQkKLS8vCQkJCQkKLS8vIEphdmFTY3JpcHRQbHVnaW4uY3JlYXRlU3RhbmRhcmRHcm91cHMobWFuYWdlcik7Ci0vLyBTdHJpbmdbXSBhY3Rpb25TZXRzID0gSlNEVEFjdGlvblNldFV0aWwuZ2V0QWxsQWN0aW9uU2V0cygpOwotLy8KLS8vIElBY3Rpb25bXSBhY3Rpb25zID0gSlNEVEFjdGlvblNldFV0aWwuZ2V0QWN0aW9uc0Zyb21TZXQoYWN0aW9uU2V0cyk7Ci0vLyBmb3IoaW50IGkgPSAwO2k8YWN0aW9ucy5sZW5ndGg7aSsrKSB7Ci0vLyBtYW5hZ2VyLmFkZChhY3Rpb25zW2ldKTsKLS8vIH0KLS8vIGZBY3Rpb25Hcm91cHMuc2V0Q29udGV4dChuZXcgQWN0aW9uQ29udGV4dChzZWxlY3Rpb24pKTsKLS8vIGZBY3Rpb25Hcm91cHMuZmlsbENvbnRleHRNZW51KG1hbmFnZXIpOwotLy8JCQkJCQotCQkJfSBlbHNlIGlmIChqYXZhQ291bnQgPT0gMCkgewotCQkJCWZpbGxDb250ZXh0TWVudShtYW5hZ2VyLCBzZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZSNyZWxlYXNlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlmVHJlZVZpZXdlciA9IG51bGw7Ci0JCWlmIChmQWN0aW9uTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmQWN0aW9uTWFuYWdlci5zZXRNb2RlbChudWxsKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvSnNXZWJFbGVtZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvdmlld3MvcHJvdmlzaW9uYWwvY29udGVudG91dGxpbmUvSnNXZWJFbGVtZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMwZGI1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL0pzV2ViRWxlbWVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5wcm92aXNpb25hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LnVpLlN0YW5kYXJkSmF2YVNjcmlwdEVsZW1lbnRDb250ZW50UHJvdmlkZXI7Ci0vKioKLSoKLQotKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0qIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0qIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0qLwotcHVibGljIGNsYXNzIEpzV2ViRWxlbWVudFByb3ZpZGVyIGV4dGVuZHMgU3RhbmRhcmRKYXZhU2NyaXB0RWxlbWVudENvbnRlbnRQcm92aWRlciB7fQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS92aWV3cy9wcm92aXNpb25hbC9jb250ZW50b3V0bGluZS9YTUxMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL1hNTExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y1YzYyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3ZpZXdzL3Byb3Zpc2lvbmFsL2NvbnRlbnRvdXRsaW5lL1hNTExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS52aWV3cy5wcm92aXNpb25hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotKgotCi0qIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSovCi1wdWJsaWMgY2xhc3MgWE1MTGFiZWxQcm92aWRlciBleHRlbmRzIEpGYWNlTm9kZUxhYmVsUHJvdmlkZXIgewotCWJvb2xlYW4gZlNob3dBdHRyaWJ1dGVzID0gZmFsc2U7Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvKSB7Ci0JCVN0cmluZ0J1ZmZlciB0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci5nZXRUZXh0KG8pKTsKLQkJaWYgKG8gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgbzsKLQkJCWlmICgobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSAmJiBmU2hvd0F0dHJpYnV0ZXMpIHsKLQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODg0NDQKLQkJCQlpZiAobm9kZS5oYXNBdHRyaWJ1dGVzKCkpIHsKLQkJCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCU5vZGUgaWRUeXBlZEF0dHJpYnV0ZSA9IG51bGw7Ci0JCQkJCU5vZGUgcmVxdWlyZWRBdHRyaWJ1dGUgPSBudWxsOwotCQkJCQlib29sZWFuIGhhc0lkID0gZmFsc2U7Ci0JCQkJCWJvb2xlYW4gaGFzTmFtZSA9IGZhbHNlOwotCQkJCQlOb2RlIHNob3duQXR0cmlidXRlID0gbnVsbDsKLQkJCQkJLy8gdHJ5IHRvIGdldCBjb250ZW50IG1vZGVsIGVsZW1lbnQKLQkJCQkJLy8gZGVjbGFyYXRpb24KLQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBudWxsOwotCQkJCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQkJCWlmIChtcSAhPSBudWxsKSB7Ci0JCQkJCQllbGVtZW50RGVjbCA9IG1xLmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJCS8vIGZpbmQgYW4gYXR0cmlidXRlIG9mIHR5cGUgKG9yIGp1c3QgbmFtZWQpCi0JCQkJCS8vIElECi0JCQkJCWlmIChlbGVtZW50RGVjbCAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgaSA9IDA7Ci0JCQkJCQl3aGlsZSAoKGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpKSAmJiAoaWRUeXBlZEF0dHJpYnV0ZSA9PSBudWxsKSkgewotCQkJCQkJCU5vZGUgYXR0ciA9IGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRyLmdldE5vZGVOYW1lKCk7Ci0JCQkJCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBlbGVtZW50RGVjbC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJCQkJCQlpZiAoYXR0ckRlY2wgIT0gbnVsbCkgewotCQkJCQkJCQlpZiAoKGF0dHJEZWNsLmdldEF0dHJUeXBlKCkgIT0gbnVsbCkgJiYgKENNRGF0YVR5cGUuSUQuZXF1YWxzKGF0dHJEZWNsLmdldEF0dHJUeXBlKCkuZ2V0RGF0YVR5cGVOYW1lKCkpKSkgewotCQkJCQkJCQkJaWRUeXBlZEF0dHJpYnV0ZSA9IGF0dHI7Ci0JCQkJCQkJCX0gZWxzZSBpZiAoKGF0dHJEZWNsLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgJiYgKHJlcXVpcmVkQXR0cmlidXRlID09IG51bGwpKSB7Ci0JCQkJCQkJCQkvLyBhcyBhIGJhY2t1cCwga2VlcCB0YWJzIG9uCi0JCQkJCQkJCQkvLyBhbnkgcmVxdWlyZWQKLQkJCQkJCQkJCS8vIGF0dHJpYnV0ZXMKLQkJCQkJCQkJCXJlcXVpcmVkQXR0cmlidXRlID0gYXR0cjsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWhhc0lkID0gaGFzSWQgfHwgYXR0ck5hbWUuZXF1YWxzKCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQloYXNOYW1lID0gaGFzTmFtZSB8fCBhdHRyTmFtZS5lcXVhbHMoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCSsraTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvKgotCQkJCQkgKiBJZiBubyBzdWl0YWJsZSBhdHRyaWJ1dGUgd2FzIGZvdW5kLCB0cnkgdXNpbmcgYQotCQkJCQkgKiByZXF1aXJlZCBhdHRyaWJ1dGUsIGlmIG5vbmUsIHRoZW4gcHJlZmVyICJpZCIgb3IKLQkJCQkJICogIm5hbWUiLCBvdGhlcndpc2UganVzdCB1c2UgZmlyc3QgYXR0cmlidXRlCi0JCQkJCSAqLwotCQkJCQlpZiAoaWRUeXBlZEF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJCQlzaG93bkF0dHJpYnV0ZSA9IGlkVHlwZWRBdHRyaWJ1dGU7Ci0JCQkJCX0gZWxzZSBpZiAocmVxdWlyZWRBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCQkJc2hvd25BdHRyaWJ1dGUgPSByZXF1aXJlZEF0dHJpYnV0ZTsKLQkJCQkJfSBlbHNlIGlmIChoYXNJZCkgewotCQkJCQkJc2hvd25BdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgaWYgKGhhc05hbWUpIHsKLQkJCQkJCXNob3duQXR0cmlidXRlID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWlmIChzaG93bkF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQkJCQlzaG93bkF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuaXRlbSgwKTsKLQkJCQkJfQotCQkJCQkvLyBkaXNwbGF5IHRoZSBhdHRyaWJ1dGUgYW5kIHZhbHVlICh3aXRob3V0IHF1b3RlcykKLQkJCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBzaG93bkF0dHJpYnV0ZS5nZXROb2RlTmFtZSgpOwotCQkJCQlpZiAoKGF0dHJpYnV0ZU5hbWUgIT0gbnVsbCkgJiYgKGF0dHJpYnV0ZU5hbWUubGVuZ3RoKCkgPiAwKSkgewotCQkJCQkJdGV4dC5hcHBlbmQoIiAiICsgYXR0cmlidXRlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IHNob3duQXR0cmlidXRlLmdldE5vZGVWYWx1ZSgpOwotCQkJCQkJaWYgKChhdHRyaWJ1dGVWYWx1ZSAhPSBudWxsKSAmJiAoYXR0cmlidXRlVmFsdWUubGVuZ3RoKCkgPiAwKSkgewotCQkJCQkJCXRleHQuYXBwZW5kKCI9IiArIFN0cmluZ1V0aWxzLnN0cmlwKGF0dHJpYnV0ZVZhbHVlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdGV4dC50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvd2ViMS5HSUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3dlYjEuR0lGCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWEyMjBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC93ZWIvdWkvd2ViMS5HSUYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3dlYjEuSlBHIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuanNkdC53ZWIudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L3dlYi91aS93ZWIxLkpQRwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhiZjljNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5qc2R0LndlYi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvd2ViL3VpL3dlYjEuSlBHCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E3NzE1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1leHRlbnNpb25zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWVuY29kaW5nIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLXRhc2t0YWdzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2YmM0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi1lZGl0b3IuamFyCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpXzEuMC4wLmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWNiMzZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvZGVidWc9dHJ1ZQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy90cmFjZWZpbHRlcj0KLQotI29yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51dGlsLkFjdGlvbkNvbnRyaWJ1dGVyLl9zaG93RGVidWdTdGF0dXMKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvYWN0aW9uY29udHJpYnV0b3IvZGVidWdzdGF0dXNmaWVsZHM9dHJ1ZQotCi0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbi5UcmFuc2ZlckJ1aWxkZXIuZGVidWdUaW1lCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3RyYW5zZmVyYnVpbGRlci90aW1lPWZhbHNlCi0KLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvZXh0ZW5kZWRjb25maWd1cmF0aW9uYnVpbGRlcj1mYWxzZQotI29yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9uLkV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZGVidWdUaW1lCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2V4dGVuZGVkY29uZmlndXJhdGlvbmJ1aWxkZXIvdGltZT1mYWxzZQotCi0KLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvZXh0ZW5kZWRlZGl0b3JhY3Rpb25idWlsZGVyPWZhbHNlCi0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbi5FeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIuZGVidWdSZWFkVGltZQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9leHRlbmRlZGVkaXRvcmFjdGlvbmJ1aWxkZXIvcmVhZHRpbWU9ZmFsc2UKLQotI29yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9uLkV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlci5kZWJ1Z0NvbnRyaWJ1dGVUaW1lCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2V4dGVuZGVkZWRpdG9yYWN0aW9uYnVpbGRlci9jb250cmlidXRldGltZT1mYWxzZQotCi0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbi5FeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIuZGVidWdNZW51Ci1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2V4dGVuZGVkZWRpdG9yYWN0aW9uYnVpbGRlci9kZWJ1Z21lbnU9ZmFsc2UKLQotI29yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9uLkV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlci5kZWJ1Z1BvcHVwCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2V4dGVuZGVkZWRpdG9yYWN0aW9uYnVpbGRlci9kZWJ1Z3BvcHVwPWZhbHNlCi0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbi5FeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIuZGVidWdUb29sYmFyCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2V4dGVuZGVkZWRpdG9yYWN0aW9uYnVpbGRlci9kZWJ1Z3Rvb2xiYXI9ZmFsc2UKLQotCi0jb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5GaWxlTW9kZWxQcm92aWRlci5kZWJ1Z09wZXJhdGlvbnMKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvZmlsZW1vZGVscHJvdmlkZXIvb3BlcmF0aW9ucz1mYWxzZQotCi0jb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5GaWxlTW9kZWxQcm92aWRlci5kZWJ1Z0xpZmVjeWNsZWxpc3RlbmVyCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ZpbGVtb2RlbHByb3ZpZGVyL2xpZmVjeWNsZWxpc3RlbmVyPWZhbHNlCi0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLkZpbGVNb2RlbFByb3ZpZGVyLmRlYnVnTW9kZWxTdGF0ZWxpc3RlbmVyCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ZpbGVtb2RlbHByb3ZpZGVyL21vZGVsc3RhdGVsaXN0ZW5lcj1mYWxzZQotCi0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0b3JhZ2VNb2RlbFByb3ZpZGVyLmRlYnVnT3BlcmF0aW9ucwotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zdG9yYWdlbW9kZWxwcm92aWRlci9vcGVyYXRpb25zPWZhbHNlCi0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0b3JhZ2VNb2RlbFByb3ZpZGVyLmRlYnVnRWxlbWVudFN0YXRlbGlzdGVuZXIKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvc3RvcmFnZW1vZGVscHJvdmlkZXIvZWxlbWVudHN0YXRlbGlzdGVuZXI9ZmFsc2UKLQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9jb250ZW50T3V0bGluZT1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wcm9wZXJ0eVNoZWV0PWZhbHNlCi0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLlByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbS5kZWJ1Zwotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW09ZmFsc2UKLQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWNvbmNpbGVyam9iPWZhbHNlCi0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkdvdG9Bbm5vdGF0aW9uQWN0aW9uLl9kZWJ1Zwotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9nb3RvTmV4dEFubm90YXRpb249ZmFsc2UKLQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wcmVmZXJlbmNlcy1wcm9wZXJ0aWVzPWZhbHNlCi0KLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvZGVidWcvcmVjb25jaWxlclNwZWxsaW5nPWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2RlYnVnL3JlY29uY2lsZXJTcGVsbGluZy9zaG93UHJvYmxlbXM9ZmFsc2UKLQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWNvbmNpbGVyVmFsaWRhdG9ycz1mYWxzZQotCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3N0cnVjdHVyZWRQcmVzZW50YXRpb25SZWNvbmNpbGVyPWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3N0cnVjdHVyZWRQcmVzZW50YXRpb25SZWNvbmNpbGVyL3RpbWU9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiZDk0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc3NlLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+PC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YjBjZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLSNXZWQgQXByIDMwIDAyOjAzOjE4IEVEVCAyMDA4DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFN1cGVyaW50ZXJmYWNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkV4ZW1wdEV4Y2VwdGlvbkFuZFRocm93YWJsZT1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFdhcm5pbmdUb2tlbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3INCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWQwZGQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGh1IE5vdiAxNiAwMDo1MToyNyBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjFjZDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYNCi1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTANCi1jb21waWxlcnMucC5idWlsZD0wDQotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xDQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MA0KLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wDQotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MA0KLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTANCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTANCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MA0KLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MA0KLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTANCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wDQotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTANCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTVmYjZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Quc3NlLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5zc2UudWksCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZWJ1Zzt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZXJpdmVkO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXQudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3I7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZW5jb2RpbmcudWk7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmZvcm1hdDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oYW5kbGVyczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oeXBlcmxpbms7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwub3Blbm9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvcGVydGllczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5wcmVmZXJlbmNlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2g7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNwZWxsaW5nO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm87eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51aTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnZpZXcuZXZlbnRzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLnNlYXJjaDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5mb3JtcztidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsMy40LjApIiwKLSBvcmcuZWNsaXBzZS51aS52aWV3cztidW5kbGUtdmVyc2lvbj0iWzMuMy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuOC4xLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucztidW5kbGUtdmVyc2lvbj0iWzMuMy4wLDQuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvUkVBRE1FLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmU0NTIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1UaGUgYmFzZSBlZGl0b3Igb2YgdGhlIHNzZSBmcmFtZXdvcmsuIEl0IHByb3ZpZGVzIHRoZSBob29rcyBmb3IgY29udGVudCBhc3Npc3QsCi1icmVha3BvaW50cywgZGVidWdnaW5nLCBvcGVuLW9uLCBxdWlja2ZpeCwgc3BlbGwgY2hlY2tpbmcgYW5kIGEgY29udGVudCBvdXRsaW5lLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NGU1OTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IHRvYy54bWwsXAotICAgICAgICAgICAgICAgdGVzdFRvYy54bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBodG1sLwotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgc3JjLWV4dGVuc2lvbnMvLFwKLSAgICAgICAgICAgc3JjLWVuY29kaW5nLFwKLSAgICAgICAgICAgc3JjLXRhc2t0YWdzLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2h0bWwvbWFpbnRvcGljLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaHRtbC9tYWludG9waWMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ3NjA3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaHRtbC9tYWludG9waWMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPk1haW4gVG9waWM8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMT5NYWluIFRvcGljPC9oMT4KLVBsZWFzZSBlbnRlciB5b3VyIHRleHQgaGVyZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaHRtbC9zdWJ0b3BpYy5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2h0bWwvc3VidG9waWMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE2MWM1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaHRtbC9zdWJ0b3BpYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+U3ViIFRvcGljPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDE+U3ViIFRvcGljPC9oMT4KLVBsZWFzZSBlbnRlciB5b3VyIHRleHQgaGVyZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaHRtbC90b2MuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9odG1sL3RvYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjZmMGE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9odG1sL3RvYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+VGFibGUgb2YgQ29udGVudHM8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMT5UYWJsZSBvZiBDb250ZW50czwvaDE+Ci1QbGVhc2UgZW50ZXIgeW91ciB0ZXh0IGhlcmUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9zcGVsbGNoZWNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2N0b29sMTYvc3BlbGxjaGVjay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MWRlMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9zcGVsbGNoZWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9jb2xsYXBzZWFsbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvY29sbGFwc2VhbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGMwZGU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9jb2xsYXBzZWFsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvZGVsZXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9kZWxldGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTE5N2MyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9kZWxldGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L3N5bmNlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvc3luY2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI5ZTU2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvc3luY2VkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2R0b29sMTYvc3BlbGxjaGVjay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3NwZWxsY2hlY2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGNmNTVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2R0b29sMTYvc3BlbGxjaGVjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvY29sbGFwc2VhbGwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2NvbGxhcHNlYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkODBhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvY29sbGFwc2VhbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L2RlbGV0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvZGVsZXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFlNmRlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvZGVsZXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9zeW5jZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3N5bmNlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1Y2VmZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3N5bmNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3NwZWxsY2hlY2suZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zcGVsbGNoZWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcxZGUzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3NwZWxsY2hlY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvb2JqMTYvb2NjX21hdGNoLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL29iajE2L29jY19tYXRjaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMDMzZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvb2JqMTYvb2NjX21hdGNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL29iajE2L3ByZWZlcmVuY2VzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL29iajE2L3ByZWZlcmVuY2VzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwN2ZlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9wcmVmZXJlbmNlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm9wX3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL29iajE2L3Byb3BfcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWVjNjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL29iajE2L3Byb3BfcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL3NvdXJjZUVkaXRvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvc291cmNlRWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlYmRiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvc291cmNlRWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBmMWE2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICBEYXZpZCBDYXJ2ZXIgLSBidWcgMjEyMzMwIC0gbWlncmF0ZSB0byBvcmcuZWNsaXBzZS51aS5tZW51cyBleHRlbnNpb24gcG9pbnQgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVN0cnVjdHVyZWQgU291cmNlIEVkaXRvcgotU3RhbmRhbG9uZV9TdHJ1Y3R1cmVkX1NvdXJjZV9FZGl0b3IubmFtZT1TdGFuZGFsb25lIFN0cnVjdHVyZWQgU291cmNlIEVkaXRvcgotIyBOYW1lcyBvbiBwcmVmZXJlbmNlcyBwYWdlcwotU3RydWN0dXJlZF9UZXh0X0VkaXRvci5uYW1lPVN0cnVjdHVyZWQgVGV4dCBFZGl0b3JzCi1UYXNrX1RhZ3NfUHJlZmVyZW5jZXMubmFtZT1UYXNrIFRhZ3MKLQotIwotc291cmNlRWRpdG9yRm9udERlZmluaXRvbi5sYWJlbD1TdHJ1Y3R1cmVkIFRleHQgRWRpdG9yIFRleHQgRm9udAotc291cmNlRWRpdG9yRm9udERlZmludGlvbi5kZXNjcmlwdGlvbj1UaGUgU3RydWN0dXJlZCB0ZXh0IGVkaXRvciB0ZXh0IGZvbnQgaXMgdXNlZCBieSBTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycy4KLQotQWRhcHRlcl9GYWN0b3J5X0Rlc2NyaXB0aW9uX0V4dGVuc2lvbi5uYW1lPUFkYXB0ZXIgRmFjdG9yeSBEZXNjcmlwdGlvbiBFeHRlbnNpb24KLUV4dGVuZGVkX0VkaXRvcl9BY3Rpb25zX0V4dGVuc2lvbi5uYW1lPUV4dGVuZGVkIEVkaXRvciBBY3Rpb25zIEV4dGVuc2lvbgotRHJvcF9UYXJnZXRfVHJhbnNmZXJzX0V4dGVuc2lvbi5uYW1lPURyb3AgVGFyZ2V0IFRyYW5zZmVycyBFeHRlbnNpb24KLUV4dGVuZGVkX0VkaXRvcl9Db25maWd1cmF0aW9uX0V4dGVuc2lvbi5uYW1lPUV4dGVuZGVkIEVkaXRvciBDb25maWd1cmF0aW9uIEV4dGVuc2lvbgotcXVpY2tGaXhQcm9jZXNzb3I9UXVpY2sgRml4IFByb2Nlc3NvciBFeHRlbnNpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRoZXNlIHN0cmluZ3MgYXJlIHVzZWQgaW4gV29ya2JlbmNoIEtleXMgUHJlZmVyZW5jZXMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zY29wZS5zdHJ1Y3R1cmVkVGV4dEVkaXRvci5uYW1lPUVkaXRpbmcgaW4gU3RydWN0dXJlZCBUZXh0IEVkaXRvcnMKLXNjb3BlLnN0cnVjdHVyZWRUZXh0RWRpdG9yLmRlc2NyaXB0aW9uPUVkaXRpbmcgaW4gU3RydWN0dXJlZCBUZXh0IEVkaXRvcnMKLWNvbW1hbmQudG9nZ2xlLmNvbW1lbnQubmFtZT1Ub2dnbGUgQ29tbWVudAotY29tbWFuZC50b2dnbGUuY29tbWVudC5kZXNjcmlwdGlvbj1Ub2dnbGUgQ29tbWVudAotY29tbWFuZC50b2dnbGUuY29tbWVudC5tbmVtb25pYz1UCi1jb21tYW5kLmFkZC5ibG9jay5jb21tZW50Lm5hbWU9QWRkIEJsb2NrIENvbW1lbnQKLWNvbW1hbmQuYWRkLmJsb2NrLmNvbW1lbnQuZGVzY3JpcHRpb249QWRkIEJsb2NrIENvbW1lbnQKLWNvbW1hbmQuYWRkLmJsb2NrLmNvbW1lbnQubW5lbW9uaWM9QQotY29tbWFuZC5yZW1vdmUuYmxvY2suY29tbWVudC5uYW1lPVJlbW92ZSBCbG9jayBDb21tZW50Ci1jb21tYW5kLnJlbW92ZS5ibG9jay5jb21tZW50LmRlc2NyaXB0aW9uPVJlbW92ZSBCbG9jayBDb21tZW50Ci1jb21tYW5kLnJlbW92ZS5ibG9jay5jb21tZW50Lm1uZW1vbmljPVIKLWNvbW1hbmQuY2xlYW51cC5kb2N1bWVudC5uYW1lPUNsZWFudXAgRG9jdW1lbnQuLi4KLWNvbW1hbmQuY2xlYW51cC5kb2N1bWVudC5kZXNjcmlwdGlvbj1DbGVhbnVwIGRvY3VtZW50Ci1jb21tYW5kLmNsZWFudXAuZG9jdW1lbnQubW5lbW9uaWM9QwotY29tbWFuZC5mb3JtYXQuZG9jdW1lbnQubmFtZT1Gb3JtYXQKLWNvbW1hbmQuZm9ybWF0LmRvY3VtZW50LmRlc2NyaXB0aW9uPUZvcm1hdCBzZWxlY3Rpb24KLWNvbW1hbmQuZm9ybWF0LmRvY3VtZW50Lm1uZW1vbmljPUYKLWNvbW1hbmQuZm9ybWF0LmFjdGl2ZS5lbGVtZW50cy5uYW1lPUZvcm1hdCBBY3RpdmUgRWxlbWVudHMKLWNvbW1hbmQuZm9ybWF0LmFjdGl2ZS5lbGVtZW50cy5kZXNjcmlwdGlvbj1Gb3JtYXQgYWN0aXZlIGVsZW1lbnRzCi1jb21tYW5kLmZvcm1hdC5hY3RpdmUuZWxlbWVudHMubW5lbW9uaWM9aQotY29tbWFuZC5vcGVuLmZpbGUuZnJvbS5zb3VyY2UubmFtZT1PcGVuIFNlbGVjdGlvbgotY29tbWFuZC5vcGVuLmZpbGUuZnJvbS5zb3VyY2UuZGVzY3JpcHRpb249T3BlbiBhbiBlZGl0b3Igb24gdGhlIHNlbGVjdGVkIGxpbmsKLWNvbW1hbmQub3Blbi5maWxlLmZyb20uc291cmNlLm1uZW1vbmljPU8KLWNvbW1hbmQuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMubmFtZT1PY2N1cnJlbmNlcyBpbiBGaWxlCi1jb21tYW5kLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzLmRlc2NyaXB0aW9uPUZpbmQgb2NjdXJyZW5jZXMgb2YgdGhlIHNlbGVjdGlvbiBpbiB0aGUgZmlsZQotY29tbWFuZC5zZWFyY2guZmluZC5vY2N1cnJlbmNlcy5tbmVtb25pYz1PCi1BY3Rpb25EZWZpbml0aW9uLnNlbGVjdEVuY2xvc2luZy5uYW1lPVNlbGVjdCBFbmNsb3NpbmcgRWxlbWVudAotQWN0aW9uRGVmaW5pdGlvbi5zZWxlY3RFbmNsb3NpbmcuZGVzY3JpcHRpb249RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIGVuY2xvc2luZyBlbGVtZW50Ci1BY3Rpb25EZWZpbml0aW9uLnNlbGVjdE5leHQubmFtZT1TZWxlY3QgTmV4dCBFbGVtZW50Ci1BY3Rpb25EZWZpbml0aW9uLnNlbGVjdE5leHQuZGVzY3JpcHRpb249RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIG5leHQgc2libGluZwotQWN0aW9uRGVmaW5pdGlvbi5zZWxlY3RQcmV2aW91cy5uYW1lPVNlbGVjdCBQcmV2aW91cyBFbGVtZW50Ci1BY3Rpb25EZWZpbml0aW9uLnNlbGVjdFByZXZpb3VzLmRlc2NyaXB0aW9uPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBwcmV2aW91cyBzaWJsaW5nCi1BY3Rpb25EZWZpbml0aW9uLnNlbGVjdExhc3QubmFtZT1SZXN0b3JlIExhc3QgU2VsZWN0aW9uCi1BY3Rpb25EZWZpbml0aW9uLnNlbGVjdExhc3QuZGVzY3JpcHRpb249UmVzdG9yZSBsYXN0IHNlbGVjdGlvbgotQWN0aW9uRGVmaW5pdGlvbi5xdWlja0ZpeC5uYW1lPVF1aWNrIEZpeAotQWN0aW9uRGVmaW5pdGlvbi5xdWlja0ZpeC5kZXNjcmlwdGlvbj1RdWljayBGaXgKLUFjdGlvbkRlZmluaXRpb24uZ290b01hdGNoaW5nQnJhY2tldC5uYW1lPU1hdGNoaW5nIEJyYWNrZXQKLUFjdGlvbkRlZmluaXRpb24uZ290b01hdGNoaW5nQnJhY2tldC5kZXNjcmlwdGlvbj1HbyB0byBNYXRjaGluZyBCcmFja2V0Ci0KLQotIwotQWRkQm9va21hcmsubGFiZWw9QWRkIEJvbyZrbWFyay4uLgotU2VsZWN0UnVsZXIubGFiZWw9U2VsZWN0IFJ1bGVyCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUaGVzZSBzdHJpbmdzIGFyZSB1c2VkIGluIGZpbGUgYW5kIGNvbnRhaW5lciByZXNvdXJjZSBwb3B1cCBtZW51Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotU291cmNlPSZTb3VyY2UKLUZvcm1hdERvY3VtZW50PSZGb3JtYXQKLVJlZmFjdG9yPVJlZmFjJnRvcgotIyMKLUJyZWFrcG9pbnRfRXh0ZW5zaW9uX1BvaW50Lm5hbWU9QnJlYWtwb2ludCBFeHRlbnNpb24gUG9pbnQKLVNvdXJjZV9WYWxpZGF0aW9uX0V4dGVuc2lvbl9Qb2ludC5uYW1lPVJlY29uY2lsZSBWYWxpZGF0b3IgRXh0ZW5zaW9uIFBvaW50Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRoZSBmb2xsb3dpbmcgcHJvcGVydHkga2V5cyBtYXliZSB1bnVzZWQuIENvbW1lbnRlZCBvdXQgb24gNC8xMi8yMDA1LiBVbmNvbW1lbnQgaWYgbmVlZGVkLgotI0JlYW5fSW5mb19Qcm92aWRlcl9FeHRlbnNpb24ubmFtZT1CZWFuIEluZm8gUHJvdmlkZXIgRXh0ZW5zaW9uCi0jU3BlbGxDaGVja19FeHRlbnNpb25fUG9pbnQubmFtZT1TcGVsbENoZWNrIEV4dGVuc2lvbiBQb2ludAotI09wZW5fT25fRXh0ZW5zaW9uX1BvaW50Lm5hbWU9T3BlbiBPbiBFeHRlbnNpb24gUG9pbnQKLSNTcGVsbF9DaGVja19sYWJlbD1TcGVsbCBDaGVjawotI1NwZWxsX0NoZWNrX3Rvb2x0aXA9U3BlbGwgQ2hlY2sKLXByZWZlcmVuY2VLZXl3b3Jkcy50b2RvPWNhc2Ugc2Vuc2l0aXZlIHRhc2sgdGFnIHRvZG8geHh4IGZpeCBmaXhtZSBwcm9qZWN0IHNwZWNpZmljIHByb2plY3RzcGVjaWZpYyBjb21tZW50cwotcHJlZmVyZW5jZUtleXdvcmRzLnNzZWVkaXRvcj1zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIHNvdXJjZSB4bWwgaHRtbCBqc3AgYXBwZWFyYW5jZSBoaWdobGlnaHQgbWF0Y2hpbmcgYnJhY2tldHMgcmVwb3J0IHByb2JsZW1zIHR5cGUgdmFsaWRhdGlvbiBpbmZvcm0gdW5zdXBwb3J0ZWQgY29udGVudCBmb2xkaW5nIGNvbG9yIGhvdmVycyBtb2RpZmllcgotRXhwYW5kU2VsZWN0aW9uVG89RXhwYW5kIFNlbGVjdGlvbiBUbwotU21hcnRJbnNlcnRfbGFiZWw9U21hJnJ0IEluc2VydCBNb2RlCi1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWw9RW5jbG9zaW5nIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBlbmNsb3NpbmcgZWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbD1OZXh0IEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgbmV4dCBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbD1QcmV2aW91cyBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBwcmV2aW91cyBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsPVJlc3RvcmUgTGFzdCBTZWxlY3Rpb24KLVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcD1SZXN0b3JlIGxhc3Qgc2VsZWN0aW9uCi0KLUNvbG9ycy5jb250ZW50X2Fzc2lzdF9wcm9wb3NhbHNfYmFja2dyb3VuZD1Db250ZW50IEFzc2lzdCBQcm9wb3NhbHMgQmFja2dyb3VuZAotQ29sb3JzLmNvbnRlbnRfYXNzaXN0X3Byb3Bvc2Fsc19mb3JlZ3JvdW5kPUNvbnRlbnQgQXNzaXN0IFByb3Bvc2FscyBGb3JlZ3JvdW5kCi1Db2xvcnMuY29udGVudF9hc3Npc3RfcGFyYW1ldGVyc19iYWNrZ3JvdW5kPUNvbnRlbnQgQXNzaXN0IFBhcmFtZXRlcnMgQmFja2dyb3VuZAotQ29sb3JzLmNvbnRlbnRfYXNzaXN0X3BhcmFtZXRlcnNfZm9yZWdyb3VuZD1Db250ZW50IEFzc2lzdCBQYXJhbWV0ZXJzIEZvcmVncm91bmQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlY2UyMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjMiPz4KLTxwbHVnaW4+Ci0KLQk8ZXh0ZW5zaW9uLXBvaW50Ci0JCWlkPSJhZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uIgotCQluYW1lPSIlQWRhcHRlcl9GYWN0b3J5X0Rlc2NyaXB0aW9uX0V4dGVuc2lvbi5uYW1lIiA+PC9leHRlbnNpb24tcG9pbnQ+Ci0JPGV4dGVuc2lvbi1wb2ludAotCQlpZD0iZXh0ZW5kZWRFZGl0b3JBY3Rpb25zIgotCQluYW1lPSIlRXh0ZW5kZWRfRWRpdG9yX0FjdGlvbnNfRXh0ZW5zaW9uLm5hbWUiID48L2V4dGVuc2lvbi1wb2ludD4KLQk8ZXh0ZW5zaW9uLXBvaW50Ci0JCWlkPSJkcm9wVGFyZ2V0VHJhbnNmZXJzIgotCQluYW1lPSIlRHJvcF9UYXJnZXRfVHJhbnNmZXJzX0V4dGVuc2lvbi5uYW1lIiA+PC9leHRlbnNpb24tcG9pbnQ+Ci0JPGV4dGVuc2lvbi1wb2ludAotCQlpZD0iZWRpdG9yQ29uZmlndXJhdGlvbiIKLQkJbmFtZT0iJUV4dGVuZGVkX0VkaXRvcl9Db25maWd1cmF0aW9uX0V4dGVuc2lvbi5uYW1lIgotCQlzY2hlbWE9InNjaGVtYS9lZGl0b3Jjb25maWd1cmF0aW9uLmV4c2QiID48L2V4dGVuc2lvbi1wb2ludD4KLQotCi0JPCEtLSBNYWtlIHN1cmUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcyBhcmUgc2V0IGF0IHJ1bnRpbWUgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5QcmVmZXJlbmNlSW5pdGlhbGl6ZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQotCTwhLS0gcmV1c2FibGUgZXh0ZW5zaW9ucyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXRvckNvbmZpZ3VyYXRpb24iPgotCQk8c291cmNlVmlld2VyQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIiAvPgotCQk8cHJvdmlzaW9uYWxEZWZpbml0aW9uCi0JCQl0eXBlPSJwcmVmZXJlbmNlcGFnZXMiCi0JCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5lZGl0b3IiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLSBhc3NvY2lhdGUgdGhlIE5hdmlnYXRlQWN0aW9uU2V0IHdpdGggdmFyaW91cyBwYXJ0cyBvZiB0aGUgWE1MIHBlcnNwZWN0aXZlLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0UGFydEFzc29jaWF0aW9ucyI+Ci0JCTxhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5lZGl0LnRleHQuYWN0aW9uU2V0LmFubm90YXRpb25OYXZpZ2F0aW9uIj4KLQkJCTxwYXJ0Ci0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IiPgotCQkJPC9wYXJ0PgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLk5hdmlnYXRlQWN0aW9uU2V0Ij4KLQkJCTxwYXJ0Ci0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IiPgotCQkJPC9wYXJ0PgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmxhdW5jaEFjdGlvblNldCI+Ci0gICAgICAgICAgICA8cGFydCBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciIvPgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIEtleXdvcmRzIGZvciBwcmVmZXJlbmNlIGFuZCBwcm9wZXJ0aWVzIHBhZ2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmtleXdvcmRzIj4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLnRvZG8iCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50b2RvIi8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy5zc2VlZGl0b3IiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zc2VlZGl0b3IiLz4KLSAgICA8L2V4dGVuc2lvbj4KLSAgICAKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotCQk8IS0tIFNvdXJjZSBFZGl0b3IgUHJlZmVyZW5jZSBwYWdlIHVuZGVyIFdvcmtiZW5jaC0+RWRpdG9ycyAtLT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVTdHJ1Y3R1cmVkX1RleHRfRWRpdG9yLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLkVkaXRvcnMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuZWRpdG9yIj4KLQkJCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNzZWVkaXRvciIvPgotCQk8L3BhZ2U+Ci0KLQkJPCEtLSBTU0UgdGFzayB0YWdzIHByZWZlcmVuY2UgcGFnZSB1bmRlciB0aGF0LS0+Ci0JCTxwYWdlCi0JCQluYW1lPSIlVGFza19UYWdzX1ByZWZlcmVuY2VzLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5lZGl0b3IiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5UYXNrVGFnUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy50YXNrdGFncyI+Ci0JCQk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50b2RvIi8+Ci0JCTwvcGFnZT4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIGNvbW1vbiB0YXNrIHRhZ3MgcHJvcGVydHkgcGFnZSAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLQkJPHBhZ2UKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByb2plY3QucHJvcGVydGllcy50YXNrdGFncyIKLQkJCW5hbWU9IiVUYXNrX1RhZ3NfUHJlZmVyZW5jZXMubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLlRhc2tUYWdQcmVmZXJlbmNlUGFnZSI+Ci0gICAgICAgICAJPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgICAgCTxhbmQ+Ci0JCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCTwvYWRhcHQ+Ci0JCQkJPC9hbmQ+IAotCQkJPC9lbmFibGVkV2hlbj4KLQkJCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRvZG8iLz4KLQkJPC9wYWdlPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLQotCQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkcmFnU291cmNlVHJhbnNmZXJzIiBuYW1lPSJEcmFnIFNvdXJjZSBUcmFuc2ZlcnMiLz4KLQktLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+Ci0JCTwhLS0gRWRpdCBjb21tYW5kcyAtLT4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVBY3Rpb25EZWZpbml0aW9uLnNlbGVjdEVuY2xvc2luZy5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVBY3Rpb25EZWZpbml0aW9uLnNlbGVjdEVuY2xvc2luZy5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LmVuY2xvc2luZyI+Ci0JCTwvY29tbWFuZD4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVBY3Rpb25EZWZpbml0aW9uLnNlbGVjdE5leHQubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlQWN0aW9uRGVmaW5pdGlvbi5zZWxlY3ROZXh0LmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubmV4dCI+Ci0JCTwvY29tbWFuZD4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVBY3Rpb25EZWZpbml0aW9uLnNlbGVjdFByZXZpb3VzLm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJUFjdGlvbkRlZmluaXRpb24uc2VsZWN0UHJldmlvdXMuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5wcmV2aW91cyI+Ci0JCTwvY29tbWFuZD4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVBY3Rpb25EZWZpbml0aW9uLnNlbGVjdExhc3QubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlQWN0aW9uRGVmaW5pdGlvbi5zZWxlY3RMYXN0LmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubGFzdCI+Ci0JCTwvY29tbWFuZD4KLQkJPCEtLSBTb3VyY2UgY29tbWFuZHMgLS0+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlY29tbWFuZC50b2dnbGUuY29tbWVudC5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLnRvZ2dsZS5jb21tZW50LmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRvZ2dsZS5jb21tZW50Ij4KLQkJPC9jb21tYW5kPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJWNvbW1hbmQuYWRkLmJsb2NrLmNvbW1lbnQubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlY29tbWFuZC5hZGQuYmxvY2suY29tbWVudC5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGQuYmxvY2suY29tbWVudCI+Ci0JCTwvY29tbWFuZD4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLnJlbW92ZS5ibG9jay5jb21tZW50Lm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbW1hbmQucmVtb3ZlLmJsb2NrLmNvbW1lbnQuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucmVtb3ZlLmJsb2NrLmNvbW1lbnQiPgotCQk8L2NvbW1hbmQ+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlY29tbWFuZC5jbGVhbnVwLmRvY3VtZW50Lm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbW1hbmQuY2xlYW51cC5kb2N1bWVudC5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jbGVhbnVwLmRvY3VtZW50Ij4KLQkJPC9jb21tYW5kPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJWNvbW1hbmQuZm9ybWF0LmRvY3VtZW50Lm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbW1hbmQuZm9ybWF0LmRvY3VtZW50LmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmZvcm1hdC5kb2N1bWVudCI+Ci0JCTwvY29tbWFuZD4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLmZvcm1hdC5hY3RpdmUuZWxlbWVudHMubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlY29tbWFuZC5mb3JtYXQuYWN0aXZlLmVsZW1lbnRzLmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmZvcm1hdC5hY3RpdmUuZWxlbWVudHMiPgotCQk8L2NvbW1hbmQ+Ci0JCTwhLS0gTmF2aWdhdGUgY29tbWFuZHMgLS0+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlY29tbWFuZC5vcGVuLmZpbGUuZnJvbS5zb3VyY2UubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlY29tbWFuZC5vcGVuLmZpbGUuZnJvbS5zb3VyY2UuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkub3Blbi5maWxlLmZyb20uc291cmNlIj4KLQkJPC9jb21tYW5kPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9IiVBY3Rpb25EZWZpbml0aW9uLmdvdG9NYXRjaGluZ0JyYWNrZXQubmFtZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlQWN0aW9uRGVmaW5pdGlvbi5nb3RvTWF0Y2hpbmdCcmFja2V0LmRlc2NyaXB0aW9uIgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkubmF2aWdhdGUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5nb3RvLm1hdGNoaW5nLmJyYWNrZXQiPgotICAgICAgPC9jb21tYW5kPgotCQk8IS0tIEZpbmQgT2NjdXJyZW5jZXMgLS0+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlY29tbWFuZC5zZWFyY2guZmluZC5vY2N1cnJlbmNlcy5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzLmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzIj4KLQkJPC9jb21tYW5kPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gS2V5YmluZGluZyBzY29wZSBmb3Igc291cmNlIGVkaXRvciAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cyI+Ci0JCTxjb250ZXh0Ci0JCQluYW1lPSIlc2NvcGUuc3RydWN0dXJlZFRleHRFZGl0b3IubmFtZSIKLQkJCXBhcmVudElkPSJvcmcuZWNsaXBzZS51aS50ZXh0RWRpdG9yU2NvcGUiCi0JCQlkZXNjcmlwdGlvbj0iJXNjb3BlLnN0cnVjdHVyZWRUZXh0RWRpdG9yLmRlc2NyaXB0aW9uIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSI+Ci0JCTwvY29udGV4dD4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tIEtleWJpbmRpbmdzIGZvciBzb3VyY2UgZWRpdG9yIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmJpbmRpbmdzIj4KLQkgICAgPCEtLSAgd2luMzI6ICBNMT1DVFJMLCBNMj1TSElGVCwgTTM9QUxUIC0tPgotCQk8IS0tIEVkaXQgY29tbWFuZHMgLS0+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMitNMytBUlJPV19VUCIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QuZW5jbG9zaW5nIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0yK00zK0FSUk9XX1JJR0hUIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5uZXh0IgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0yK00zK0FSUk9XX0xFRlQiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LnByZXZpb3VzIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0yK00zK0FSUk9XX0RPV04iCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lmxhc3QiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCQk8IS0tIFNvdXJjZSBjb21tYW5kcyAtLT4KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0xK00yK0MiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50b2dnbGUuY29tbWVudCIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLQkJPC9rZXk+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMStNMisvIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRkLmJsb2NrLmNvbW1lbnQiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTErLyIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkZC5ibG9jay5jb21tZW50IgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iCi0JCQlwbGF0Zm9ybT0iY2FyYm9uIj4KLQkJPC9rZXk+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMStNMitcIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucmVtb3ZlLmJsb2NrLmNvbW1lbnQiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTErXCIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnJlbW92ZS5ibG9jay5jb21tZW50IgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iCi0JCQlwbGF0Zm9ybT0iY2FyYm9uIj4KLQkJPC9rZXk+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMStNMitGIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZm9ybWF0LmRvY3VtZW50IgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0xK0kiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5mb3JtYXQuYWN0aXZlLmVsZW1lbnRzIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQkJPCEtLSBOYXZpZ2F0ZSBjb21tYW5kcyAtLT4KLQkJPGtleQotCQkJc2VxdWVuY2U9IkYzIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkub3Blbi5maWxlLmZyb20uc291cmNlIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQkJPGtleQotICAgICAgICAgICAgc2VxdWVuY2U9Ik0xK00yK1AiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5nb3RvLm1hdGNoaW5nLmJyYWNrZXQiCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIvPgotCQk8IS0tIEZpbmQgT2NjdXJyZW5jZXMgLS0+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMStNMitBIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gRm9udCBhbmQgY29sb3JzIGNvbnRyaWJ1dGlvbnMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkudGhlbWVzIj4KLQkJPHRoZW1lRWxlbWVudENhdGVnb3J5Ci0JCQlsYWJlbD0iJVN0cnVjdHVyZWRfVGV4dF9FZGl0b3IubmFtZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIj4KLQkJPC90aGVtZUVsZW1lbnRDYXRlZ29yeT4KLQkJPGZvbnREZWZpbml0aW9uCi0JCQlsYWJlbD0iJXNvdXJjZUVkaXRvckZvbnREZWZpbml0b24ubGFiZWwiCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIgotCQkJZGVmYXVsdHNUbz0ib3JnLmVjbGlwc2UuamZhY2UudGV4dGZvbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCI+Ci0JCQk8ZGVzY3JpcHRpb24+Ci0JCQkJJXNvdXJjZUVkaXRvckZvbnREZWZpbnRpb24uZGVzY3JpcHRpb24KLQkJCTwvZGVzY3JpcHRpb24+Ci0JCTwvZm9udERlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5kcm9wVGFyZ2V0VHJhbnNmZXJzIj4KLQkJPGRyb3BUYXJnZXRDb250cmlidXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9uLkV4dGVuZGVkVHJhbnNmZXJzIj4KLQkJCTx0cmFuc2ZlcgotCQkJCXByaW9yaXR5PSJtaWQiCi0JCQkJc2luZ2xldG9uPSJ0cnVlIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlciIKLQkJCQltZXRob2Q9ImdldEluc3RhbmNlIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlciI+Ci0JCQk8L3RyYW5zZmVyPgotCQkJPGRyb3BBY3Rpb24KLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5GaWxlRHJvcEFjdGlvbiIKLQkJCQl0cmFuc2ZlcklEPSJvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlciIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5GaWxlRHJvcEFjdGlvbiI+Ci0JCQk8L2Ryb3BBY3Rpb24+Ci0JCQk8dHJhbnNmZXIKLQkJCQlwcmlvcml0eT0ibG93IgotCQkJCXNpbmdsZXRvbj0idHJ1ZSIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXIiCi0JCQkJbWV0aG9kPSJnZXRJbnN0YW5jZSIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXIiPgotCQkJPC90cmFuc2Zlcj4KLQkJCTxkcm9wQWN0aW9uCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuVGV4dERyb3BBY3Rpb24iCi0JCQkJdHJhbnNmZXJJRD0ib3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXIiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuVGV4dERyb3BBY3Rpb24iPgotCQkJPC9kcm9wQWN0aW9uPgotCQk8L2Ryb3BUYXJnZXRDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLmFubm90YXRpb25UeXBlcyI+Ci0JCTx0eXBlCi0JCQlzdXBlcj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IuZXJyb3IiCi0JCQltYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnByb2JsZW0iCi0JCQluYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlbXAuZXJyb3IiCi0JCQltYXJrZXJTZXZlcml0eT0iMiI+Ci0JCTwvdHlwZT4KLQkJPHR5cGUKLQkJCXN1cGVyPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci53YXJuaW5nIgotCQkJbWFya2VyVHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5wcm9ibGVtIgotCQkJbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZW1wLndhcm5pbmciCi0JCQltYXJrZXJTZXZlcml0eT0iMSI+Ci0JCTwvdHlwZT4KLQotCQk8dHlwZQotCQkJc3VwZXI9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmluZm8iCi0JCQltYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnByb2JsZW0iCi0JCQluYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlbXAuaW5mbyIKLQkJCW1hcmtlclNldmVyaXR5PSIwIj4KLQkJPC90eXBlPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMubWFya2VyQW5ub3RhdGlvblNwZWNpZmljYXRpb24iPgotCi0JCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQkJPCEtLSBzYW1lIGFzIGVjbGlwc2UgdGV4dCB1aSAoaW5jbHVkaW5nIHByZWZlcmVuY2Uga2V5cyksIGV4Y2VwdCBmb3IgdmVydGljYWwgcnVsZXIgJiBwcmVmZXJlbmNlIHBhZ2UgLS0+Ci0JCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQkJPHNwZWNpZmljYXRpb24KLQkJCWFubm90YXRpb25UeXBlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlbXAuZXJyb3IiCi0JCQlhbm5vdGF0aW9uSW1hZ2VQcm92aWRlcj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51aS5TdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25JbWFnZVByb3ZpZGVyIgotCQkJdmVydGljYWxSdWxlclByZWZlcmVuY2VWYWx1ZT0idHJ1ZSIKLQkJCXZlcnRpY2FsUnVsZXJQcmVmZXJlbmNlS2V5PSJzc2VFcnJvckluZGljYXRpb25JblZlcnRpY2FsUnVsZXIiCi0JCQlpbmNsdWRlT25QcmVmZXJlbmNlUGFnZT0iZmFsc2UiPgotCQk8L3NwZWNpZmljYXRpb24+Ci0JCTxzcGVjaWZpY2F0aW9uCi0JCQlhbm5vdGF0aW9uVHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZW1wLndhcm5pbmciCi0JCQlhbm5vdGF0aW9uSW1hZ2VQcm92aWRlcj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51aS5TdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25JbWFnZVByb3ZpZGVyIgotCQkJdmVydGljYWxSdWxlclByZWZlcmVuY2VWYWx1ZT0iZmFsc2UiCi0JCQl2ZXJ0aWNhbFJ1bGVyUHJlZmVyZW5jZUtleT0ic3NlV2FybmluZ0luZGljYXRpb25JblZlcnRpY2FsUnVsZXIiCi0JCQlpbmNsdWRlT25QcmVmZXJlbmNlUGFnZT0iZmFsc2UiPgotCQk8L3NwZWNpZmljYXRpb24+Ci0JCTxzcGVjaWZpY2F0aW9uCi0JCQlhbm5vdGF0aW9uSW1hZ2VQcm92aWRlcj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51aS5TdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25JbWFnZVByb3ZpZGVyIgotCQkJYW5ub3RhdGlvblR5cGU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudGVtcC5pbmZvIj4KLQkJPC9zcGVjaWZpY2F0aW9uPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gZHluYW1pYyBjb250ZW50IHR5cGUgc3VwcG9ydGluZyBlZGl0b3IsIG5vIHN1cHBvcnRlZCBmaWxlIGV4dGVuc2lvbnMgYnkgZGVmYXVsdCAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLQkJPGVkaXRvcgotCQkJbmFtZT0iJVN0YW5kYWxvbmVfU3RydWN0dXJlZF9Tb3VyY2VfRWRpdG9yLm5hbWUiCi0JCQlpY29uPSIkbmwkL2ljb25zL3NvdXJjZUVkaXRvci5naWYiCi0JCQljb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnMuQWN0aW9uQ29udHJpYnV0b3IiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciIKLQkJCXN5bWJvbGljRm9udE5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciI+Ci0JCTwvZWRpdG9yPgotCTwvZXh0ZW5zaW9uPgotCQotPCEtLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQkJPG9iamVjdENvbnRyaWJ1dGlvbgotCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXIiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hY3Rpb25zLkNvbnRhaW5lclNvdXJjZUFjdGlvbnMiPgotCQkJPG1lbnUKLQkJCQlsYWJlbD0iJVNvdXJjZSIKLQkJCQlwYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9InNvdXJjZSI+Ci0JCQkJPGdyb3VwTWFya2VyIG5hbWU9InNvdXJjZUdyb3VwIj48L2dyb3VwTWFya2VyPgotCQkJPC9tZW51PgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlRm9ybWF0RG9jdW1lbnQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZSIKLQkJCQltZW51YmFyUGF0aD0ic291cmNlL3NvdXJjZUdyb3VwIgotCQkJCWVuYWJsZXNGb3I9IisiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWN0aW9ucy5Db250YWluZXJTb3VyY2VBY3Rpb25zLkZvcm1hdCI+Ci0JCQk8L2FjdGlvbj4KLQkJPC9vYmplY3RDb250cmlidXRpb24+Ci0JCTxvYmplY3RDb250cmlidXRpb24KLQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFjdGlvbnMuRmlsZVNvdXJjZUFjdGlvbnMiPgotCQkJPG1lbnUKLQkJCQlsYWJlbD0iJVNvdXJjZSIKLQkJCQlwYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9InNvdXJjZSI+Ci0JCQkJPGdyb3VwTWFya2VyIG5hbWU9InNvdXJjZUdyb3VwIj48L2dyb3VwTWFya2VyPgotCQkJPC9tZW51PgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlRm9ybWF0RG9jdW1lbnQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZSIKLQkJCQltZW51YmFyUGF0aD0ic291cmNlL3NvdXJjZUdyb3VwIgotCQkJCWVuYWJsZXNGb3I9IisiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWN0aW9ucy5GaWxlU291cmNlQWN0aW9ucy5Gb3JtYXQiPgotCQkJPC9hY3Rpb24+Ci0JCTwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgCTwvZXh0ZW5zaW9uPgotICAgCS0tPgotICAgPCEtLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMiPgotICAgICAgPGVkaXRvckNvbnRyaWJ1dGlvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvci5ydWxlci5hY3Rpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJEb3VibGVDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVNlbGVjdFJ1bGVyLmxhYmVsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9lZGl0b3JDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIC0tPgotICAgCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gY29udHJpYnV0ZSBhIFNlYXJjaFJlc3VsdFZpZXdQYWdlIGZvciBPY2N1cnJlbmNlcyBpbiBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbgotCQlpZD0iT2NjdXJyZW5jZXMgc2VhcmNoIHBhZ2UiCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5zZWFyY2guc2VhcmNoUmVzdWx0Vmlld1BhZ2VzIj4KLQkJPHZpZXdQYWdlCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zZWFyY2guT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHRQYWdlIgotCQkJc2VhcmNoUmVzdWx0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLk9jY3VycmVuY2VzU2VhcmNoUmVzdWx0IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLk9jY3VycmVuY2VzU2VhcmNoVmlld1BhZ2UiPgotCQk8L3ZpZXdQYWdlPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBleHRlbnNpb24gcG9pbnQgZm9yIGJyZWFrcG9pbnQgZXh0ZW5zaW9uIC0tPgotCTxleHRlbnNpb24tcG9pbnQKLQkJaWQ9ImJyZWFrcG9pbnQiCi0JCW5hbWU9IiVCcmVha3BvaW50X0V4dGVuc2lvbl9Qb2ludC5uYW1lIiAvPgotCTwhLS0gZXh0ZW5zaW9uIHBvaW50IGZvciBzb3VyY2UgdmFsaWRhdGlvbiAtLT4KLQk8IS0tIGludGVyZmFjZXMgZm9yIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGNhbiBiZSBmb3VuZCBpbiBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiAtLT4KLQk8ZXh0ZW5zaW9uLXBvaW50Ci0JCWlkPSJzb3VyY2V2YWxpZGF0aW9uIgotCQluYW1lPSIlU291cmNlX1ZhbGlkYXRpb25fRXh0ZW5zaW9uX1BvaW50Lm5hbWUiCi0JCXNjaGVtYT0ic2NoZW1hL29yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbi5leHNkIiAvPgotCTxleHRlbnNpb24tcG9pbnQgCi0JCWlkPSJxdWlja0ZpeFByb2Nlc3NvciIgCi0JCW5hbWU9IiVxdWlja0ZpeFByb2Nlc3NvciIgCi0JCXNjaGVtYT0ic2NoZW1hL3F1aWNrRml4UHJvY2Vzc29yLmV4c2QiLz4KLSAKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+Ci0JCTxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJtZW51Om9yZy5lY2xpcHNlLnVpLm1haW4ubWVudT9hZnRlcj1lZGl0Ij4KLQkJCTxtZW51IGlkPSJzb3VyY2VNZW51SWQiIGxhYmVsPSIlU291cmNlIj48L21lbnU+Ci0JCTwvbWVudUNvbnRyaWJ1dGlvbj4KLQkJPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9Im1lbnU6b3JnLmVjbGlwc2UudWkubWFpbi5tZW51P2FmdGVyPXNvdXJjZU1lbnVJZCI+Ci0JCQk8bWVudSBpZD0icmVmYWN0b3JNZW51SWQiIGxhYmVsPSIlUmVmYWN0b3IiPjwvbWVudT4KLQkJPC9tZW51Q29udHJpYnV0aW9uPgotCSAgICA8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0ibWVudTplZGl0P2FmdGVyPWFkZGl0aW9ucyI+Ci0JICAgICAgIDxtZW51IGlkPSJleHBhbmRTZWxlY3Rpb25Ub01lbnVJZCIgbGFiZWw9IiVFeHBhbmRTZWxlY3Rpb25UbyI+PC9tZW51PgotCQk8L21lbnVDb250cmlidXRpb24+Ci0JCTxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJtZW51OnNvdXJjZU1lbnVJZCI+Ci0JCQk8c2VwYXJhdG9yIG5hbWU9InNvdXJjZUJlZ2luIiB2aXNpYmxlPSJmYWxzZSI+PC9zZXBhcmF0b3I+Ci0JCQk8c2VwYXJhdG9yIG5hbWU9InNoaWZ0QmVnaW4iIHZpc2libGU9InRydWUiPjwvc2VwYXJhdG9yPgotCQkJPHNlcGFyYXRvciBuYW1lPSJzaGlmdEVuZCIgdmlzaWJsZT0idHJ1ZSI+PC9zZXBhcmF0b3I+Ci0JCQk8c2VwYXJhdG9yIG5hbWU9ImFkZGl0aW9ucyIgdmlzaWJsZT0idHJ1ZSI+PC9zZXBhcmF0b3I+Ci0JCQk8c2VwYXJhdG9yIG5hbWU9InNvdXJjZUVuZCIgdmlzaWJsZT0iZmFsc2UiPjwvc2VwYXJhdG9yPgkKLQkJPC9tZW51Q29udHJpYnV0aW9uPgotCQk8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0icG9wdXA6b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvci5FZGl0b3JDb250ZXh0P2JlZm9yZT1hZGRpdGlvbnMiPgotCQkgICAgPG1lbnUgaWQ9InNvdXJjZVBvcHVwTWVudUlkIiBsYWJlbD0iJVNvdXJjZSI+Ci0JCQkJPHNlcGFyYXRvciBuYW1lPSJzb3VyY2VCZWdpbiIgdmlzaWJsZT0iZmFsc2UiPjwvc2VwYXJhdG9yPgotCQkJCTxzZXBhcmF0b3IgbmFtZT0iYWRkaXRpb25zIiB2aXNpYmxlPSJ0cnVlIj48L3NlcGFyYXRvcj4KLQkJCQk8c2VwYXJhdG9yIG5hbWU9InNvdXJjZUVuZCIgdmlzaWJsZT0iZmFsc2UiPjwvc2VwYXJhdG9yPgkKLQkJICAgIDwvbWVudT4KLQkJICAgIDxtZW51IGlkPSJyZWZhY3RvclBvcHVwTWVudUlkIiBsYWJlbD0iJVJlZmFjdG9yIj4KLQkJICAgIDwvbWVudT4KLQkJPC9tZW51Q29udHJpYnV0aW9uPgotCSAgICA8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0ibWVudTpnb1RvP2FmdGVyPWFkZGl0aW9ucyI+Ci0JCSAgICA8c2VwYXJhdG9yIG5hbWU9Im1hdGNoaW5nQmVnaW4iIHZpc2libGU9ImZhbHNlIj48L3NlcGFyYXRvcj4KLQkJICAgIDxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5nb3RvLm1hdGNoaW5nLmJyYWNrZXQiIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmdvdG8ubWF0Y2hpbmcuYnJhY2tldCIgbGFiZWw9IiVBY3Rpb25EZWZpbml0aW9uLmdvdG9NYXRjaGluZ0JyYWNrZXQubmFtZSIgc3R5bGU9InB1c2giPgotCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3NlQWN0aXZlQ29udGV4dC5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCQk8L3Zpc2libGVXaGVuPgotCQkgICAgPC9jb21tYW5kPgotCQkJPHNlcGFyYXRvciBuYW1lPSJtYXRjaGluZ0VuZCIgdmlzaWJsZT0iZmFsc2UiPjwvc2VwYXJhdG9yPgotCQk8L21lbnVDb250cmlidXRpb24+Ci0JCTwhLS0gQ29udHJpYnV0ZSBhIFNvdXJjZSBtZW51IGZvciBjb250YWluZXJzIC0tPgotICAgICA8bWVudUNvbnRyaWJ1dGlvbgotICAgICAgICAgICBsb2NhdGlvblVSST0icG9wdXA6b3JnLmVjbGlwc2UudWkucG9wdXAuYW55P2FmdGVyPWFkZGl0aW9ucyI+Ci0gICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgIGlkPSJzb3VyY2VNZW51SWQiCi0gICAgICAgICAgICAgIGxhYmVsPSIlU291cmNlIj4KLQkgICAgICAgIDxjb21tYW5kCi0JICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZm9ybWF0IgotCSAgICAgICAgICAgICAgaWQ9InNvdXJjZUZvcm1hdCIKLQkgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIj4KLQkgICAgICAgICAgIDwhLS0gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaXMgZW5hYmxlZCBiZWZvcmUgbWFraW5nIHZpc2libGUgLS0+Ci0JCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0idHJ1ZSIgLz4KLQkgICAgICAgIDwvY29tbWFuZD4KLSAgICAgICAgPC9tZW51PgotICAgICA8L21lbnVDb250cmlidXRpb24+Ci0JCTxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJtZW51OnNvdXJjZU1lbnVJZD9hZnRlcj1hZGRpdGlvbnMiPgotCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzIiBpZD0iT2NjdXJlbmNlc0ZpbGUiIHN0eWxlPSJwdXNoIj4KLQkJCSAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3NlQWN0aXZlQ29udGV4dC5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCQk8L3Zpc2libGVXaGVuPgotCQkJPC9jb21tYW5kPgotCQk8L21lbnVDb250cmlidXRpb24+Ci0JICAgIDxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJtZW51OmVkaXQ/YWZ0ZXI9YWRkaXRpb25zIj4KLQkgICAgICAgPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS51aS5lZGl0LnRleHQudG9nZ2xlSW5zZXJ0TW9kZSIgaWQ9IlRvZ2dsZUluc2VydE1vZGUiIGxhYmVsPSIlU21hcnRJbnNlcnRfbGFiZWwiIHN0eWxlPSJ0b2dnbGUiPgotCQkJICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCSAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNzZUFjdGl2ZUNvbnRleHQuZGVmaW5pdGlvbiI+PC9yZWZlcmVuY2U+Ci0JCQkgICA8L3Zpc2libGVXaGVuPgotCSAgICAgICA8L2NvbW1hbmQ+CSAgICAgICAKLQkJPC9tZW51Q29udHJpYnV0aW9uPgotCSAgICA8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0ibWVudTpleHBhbmRTZWxlY3Rpb25Ub01lbnVJZCI+Ci0JICAgICAgIDxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LmVuY2xvc2luZyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5lbmNsb3NpbmciIGxhYmVsPSIlU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsIiBzdHlsZT0icHVzaCI+Ci0JCQkgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNzZUFjdGl2ZUNvbnRleHQuZGVmaW5pdGlvbiI+PC9yZWZlcmVuY2U+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkgICAgICAgPC9jb21tYW5kPgkgICAgICAgCi0JICAgICAgIDxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lm5leHQiIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubmV4dCIgbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsIiBzdHlsZT0icHVzaCI+Ci0JCQkgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNzZUFjdGl2ZUNvbnRleHQuZGVmaW5pdGlvbiI+PC9yZWZlcmVuY2U+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkgICAgICAgPC9jb21tYW5kPgotCSAgICAgICA8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5wcmV2aW91cyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5wcmV2aW91cyIgbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbCIgc3R5bGU9InB1c2giPgotCQkJICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zc2VBY3RpdmVDb250ZXh0LmRlZmluaXRpb24iPjwvcmVmZXJlbmNlPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JICAgICAgIDwvY29tbWFuZD4KLQkgICAgICAgPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubGFzdCIgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5sYXN0IiBsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWwiIHN0eWxlPSJwdXNoIj4KLQkJCSAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3NlQWN0aXZlQ29udGV4dC5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCQk8L3Zpc2libGVXaGVuPgotCSAgICAgICA8L2NvbW1hbmQ+Ci0JCTwvbWVudUNvbnRyaWJ1dGlvbj4KLQkJPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9Im1lbnU6c291cmNlTWVudUlkP2FmdGVyPXNvdXJjZUJlZ2luIj4KLQkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50b2dnbGUuY29tbWVudCIKLQkJCSAgICAgICAgIGlkPSJUb2dnbGVDb21tZW50IgotCQkJICAgICAgICAgbW5lbW9uaWM9IiVjb21tYW5kLnRvZ2dsZS5jb21tZW50Lm1uZW1vbmljIgotCQkJICAgICAgICAgc3R5bGU9InB1c2giPgotCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3NlQWN0aXZlQ29udGV4dC5kZWZpbml0aW9uIi8+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCTwvY29tbWFuZD4KLQkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGQuYmxvY2suY29tbWVudCIKLQkJCSAgICAgICAgIGlkPSJBZGRCbG9ja0NvbW1lbnQiCi0JCQkgICAgICAgICBtbmVtb25pYz0iJWNvbW1hbmQuYWRkLmJsb2NrLmNvbW1lbnQubW5lbW9uaWMiCi0JCQkgICAgICAgICBzdHlsZT0icHVzaCI+Ci0JCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zc2VBY3RpdmVDb250ZXh0LmRlZmluaXRpb24iLz4KLQkJCQk8L3Zpc2libGVXaGVuPgotCQkJPC9jb21tYW5kPgotCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnJlbW92ZS5ibG9jay5jb21tZW50IgotCQkJICAgICAgICAgaWQ9IlJlbW92ZUJsb2NrQ29tbWVudCIKLQkJCSAgICAgICAgIG1uZW1vbmljPSIlY29tbWFuZC5yZW1vdmUuYmxvY2suY29tbWVudC5tbmVtb25pYyIKLQkJCSAgICAgICAgIHN0eWxlPSJwdXNoIj4KLQkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNzZUFjdGl2ZUNvbnRleHQuZGVmaW5pdGlvbiIvPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQk8L2NvbW1hbmQ+Ci0JCTwvbWVudUNvbnRyaWJ1dGlvbj4KLQotCQk8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0ibWVudTpzb3VyY2VNZW51SWQ/YWZ0ZXI9c2hpZnRCZWdpbiI+Ci0JCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5zaGlmdExlZnQiCi0JCQkgICAgICAgICBpZD0iU2hpZnRMZWZ0IgotCQkJICAgICAgICAgc3R5bGU9InB1c2giPgotCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3NlQWN0aXZlQ29udGV4dC5kZWZpbml0aW9uIi8+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCTwvY29tbWFuZD4KLQkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0LnNoaWZ0UmlnaHQiCi0gICAgICAgICAgICAgICAgICAgICBpZD0iU2hpZnRSaWdodCIKLSAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIj4KLQkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNzZUFjdGl2ZUNvbnRleHQuZGVmaW5pdGlvbiIvPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQk8L2NvbW1hbmQ+Ci0JCTwvbWVudUNvbnRyaWJ1dGlvbj4KLQotCQk8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0ibWVudTpzb3VyY2VNZW51SWQ/YWZ0ZXI9c2hpZnRFbmQiPgotCSAgICAgICAgPGNvbW1hbmQKLQkJICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2xlYW51cC5kb2N1bWVudCIKLQkJICAgICAgICAgICBpZD0iQ2xlYW51cERvY3VtZW50IgotCQkJICAgICAgIG1uZW1vbmljPSIlY29tbWFuZC5jbGVhbnVwLmRvY3VtZW50Lm1uZW1vbmljIgotCQkgICAgICAgICAgIHN0eWxlPSJwdXNoIj4KLQkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNzZUFjdGl2ZUNvbnRleHQuZGVmaW5pdGlvbiIvPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCSAgICA8L2NvbW1hbmQ+Ci0JCQk8Y29tbWFuZCAKLQkJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZm9ybWF0LmRvY3VtZW50IiAKLQkJCQlpZD0iRm9ybWF0RG9jdW1lbnQiIAotCQkJICAgIG1uZW1vbmljPSIlY29tbWFuZC5mb3JtYXQuZG9jdW1lbnQubW5lbW9uaWMiCi0JCQkJc3R5bGU9InB1c2giPgotCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3NlQWN0aXZlQ29udGV4dC5kZWZpbml0aW9uIi8+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCTwvY29tbWFuZD4KLQkJCTxjb21tYW5kIAotCQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5mb3JtYXQuYWN0aXZlLmVsZW1lbnRzIiAKLQkJCQlpZD0iRm9ybWF0RWxlbWVudHMiIAotCQkJCW1uZW1vbmljPSIlY29tbWFuZC5mb3JtYXQuYWN0aXZlLmVsZW1lbnRzLm1uZW1vbmljIgotCQkJCXN0eWxlPSJwdXNoIj4KLQkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNzZUFjdGl2ZUNvbnRleHQuZGVmaW5pdGlvbiI+PC9yZWZlcmVuY2U+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCTwvY29tbWFuZD4KLQkJPC9tZW51Q29udHJpYnV0aW9uPgotCi0JICAgICA8bWVudUNvbnRyaWJ1dGlvbgotCSAgICAgICAgICAgbG9jYXRpb25VUkk9InBvcHVwOnNvdXJjZVBvcHVwTWVudUlkP2FmdGVyPXNvdXJjZUJlZ2luIj4KLQkJCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudG9nZ2xlLmNvbW1lbnQiIGlkPSJUb2dnbGVDb21tZW50IiBzdHlsZT0icHVzaCI+Ci0JCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNzZUFjdGl2ZUNvbnRleHQuZGVmaW5pdGlvbiI+PC9yZWZlcmVuY2U+Ci0JCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQkJPC9jb21tYW5kPgotCQkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGQuYmxvY2suY29tbWVudCIgaWQ9IkFkZEJsb2NrQ29tbWVudCIgc3R5bGU9InB1c2giPgotCQkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zc2VBY3RpdmVDb250ZXh0LmRlZmluaXRpb24iPjwvcmVmZXJlbmNlPgotCQkJCQk8L3Zpc2libGVXaGVuPgotCQkJCTwvY29tbWFuZD4KLQkJCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucmVtb3ZlLmJsb2NrLmNvbW1lbnQiIGlkPSJSZW1vdmVCbG9ja0NvbW1lbnQiIHN0eWxlPSJwdXNoIj4KLQkJCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3NlQWN0aXZlQ29udGV4dC5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCQkJPC92aXNpYmxlV2hlbj4KLQkJCQk8L2NvbW1hbmQ+Ci0JCQkJPHNlcGFyYXRvciBuYW1lPSJmb3JtYXQiIHZpc2libGU9InRydWUiPjwvc2VwYXJhdG9yPgotCQkJCTxjb21tYW5kCi0JCQkgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jbGVhbnVwLmRvY3VtZW50IgotCQkJICAgICAgICAgICBpZD0iQ2xlYW51cERvY3VtZW50IgotCQkJICAgICAgICAgICBzdHlsZT0icHVzaCI+Ci0JCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNzZUFjdGl2ZUNvbnRleHQuZGVmaW5pdGlvbiI+PC9yZWZlcmVuY2U+Ci0JCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQkgICAgPC9jb21tYW5kPgotCQkJCTxjb21tYW5kIAotCQkJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZm9ybWF0LmRvY3VtZW50IiAKLQkJCQkJaWQ9IkZvcm1hdERvY3VtZW50IiAKLQkJCQkJbW5lbW9uaWM9IiVjb21tYW5kLmZvcm1hdC5kb2N1bWVudC5tbmVtb25pYyIgCi0JCQkJCXN0eWxlPSJwdXNoIj4KLQkJCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zc2VBY3RpdmVDb250ZXh0LmRlZmluaXRpb24iPjwvcmVmZXJlbmNlPgotCQkJCQkJPC92aXNpYmxlV2hlbj4KLQkJCQk8L2NvbW1hbmQ+Ci0JCQkJPGNvbW1hbmQgCi0JCQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5mb3JtYXQuYWN0aXZlLmVsZW1lbnRzIiAKLQkJCQkJaWQ9IkZvcm1hdEVsZW1lbnRzIiAKLQkJCQkJbW5lbW9uaWM9IiVjb21tYW5kLmZvcm1hdC5hY3RpdmUuZWxlbWVudHMubW5lbW9uaWMiIAotCQkJCQlzdHlsZT0icHVzaCI+Ci0JCQkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JCQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3NlQWN0aXZlQ29udGV4dC5kZWZpbml0aW9uIj48L3JlZmVyZW5jZT4KLQkJCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQkJPC9jb21tYW5kPgotCQkJCQotCSAgICAgPC9tZW51Q29udHJpYnV0aW9uPgkJCi0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+Ci0JICAgIDxjb21tYW5kCi0JICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmZvcm1hdCIKLQkgICAgICAgICAgbmFtZT0iJWNvbW1hbmQuZm9ybWF0LmRvY3VtZW50Lm5hbWUiPgotCSAgICA8L2NvbW1hbmQ+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSBFbmFibGUgdGhlIEZvcm1hdEhhbmRsZXIgZm9yIENvbnRhaW5lcnMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgotCQk8aGFuZGxlciAKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmhhbmRsZXJzLkZvcm1hdEhhbmRsZXIiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZm9ybWF0Ij4KLQkJCTxhY3RpdmVXaGVuPgotCQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQkJPGFkYXB0Ci0JCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyIj4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L2l0ZXJhdGU+Ci0JCQk8L2FjdGl2ZVdoZW4+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGl0ZXJhdGUgaWZFbXB0eT0iZmFsc2UiPgotCQkJCQk8YWRhcHQKLQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXIiPgotCQkJCQk8L2FkYXB0PgotCQkJCTwvaXRlcmF0ZT4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvaGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3NlQWN0aXZlQ29udGV4dC5kZWZpbml0aW9uIj4KLSAgICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJhY3RpdmVDb250ZXh0cyI+Ci0JICAgICAgICAgICA8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCSAgICAgICAgICAgICAgPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIi8+Ci0JICAgICAgICAgICA8L2l0ZXJhdGU+Ci0gICAgICAgICAgICA8L3dpdGg+Ci0JCTwvZGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIERlZmluZSB0aGVtZSAtLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS50aGVtZXMiPgotCQk8dGhlbWUKLQkJCWlkPSJvcmcuZWNsaXBzZS51aS5pZGUuc3lzdGVtRGVmYXVsdCI+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJjb250ZW50X2Fzc2lzdF9wcm9wb3NhbHNfYmFja2dyb3VuZCIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9CQUNLR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9ImNvbnRlbnRfYXNzaXN0X3Byb3Bvc2Fsc19mb3JlZ3JvdW5kIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iY29udGVudF9hc3Npc3RfcGFyYW1ldGVyc19iYWNrZ3JvdW5kIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0JBQ0tHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iY29udGVudF9hc3Npc3RfcGFyYW1ldGVyc19mb3JlZ3JvdW5kIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQk8L3RoZW1lPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iY29udGVudF9hc3Npc3RfcHJvcG9zYWxzX2JhY2tncm91bmQiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmNvbnRlbnRfYXNzaXN0X3Byb3Bvc2Fsc19iYWNrZ3JvdW5kIgotCQkJdmFsdWU9IjI1NSwyNTUsMjU1Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJjb250ZW50X2Fzc2lzdF9wcm9wb3NhbHNfZm9yZWdyb3VuZCIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuY29udGVudF9hc3Npc3RfcHJvcG9zYWxzX2ZvcmVncm91bmQiCi0JCQl2YWx1ZT0iMCwwLDAiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImNvbnRlbnRfYXNzaXN0X3BhcmFtZXRlcnNfYmFja2dyb3VuZCIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuY29udGVudF9hc3Npc3RfcGFyYW1ldGVyc19iYWNrZ3JvdW5kIgotCQkJdmFsdWU9IjI1NSwyNTUsMjU1Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJjb250ZW50X2Fzc2lzdF9wYXJhbWV0ZXJzX2ZvcmVncm91bmQiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmNvbnRlbnRfYXNzaXN0X3BhcmFtZXRlcnNfZm9yZWdyb3VuZCIKLQkJCXZhbHVlPSIwLDAsMCI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotPC9wbHVnaW4+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9yZWV4cG9ydC1pbmZvLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9yZWV4cG9ydC1pbmZvLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM4YzdjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvcmVleHBvcnQtaW5mby50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXdlIHJlZXhwb3J0IGVjbGlwc2UudWkuZWRpdG9ycyAKLXNpbmNlIG9uZSBvZiBvdXIgQVBJcywgU3RydWN0dXJlZFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gCi1yZXF1aXJlcyBpdC4gCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zY2hlbWEvZWRpdG9yY29uZmlndXJhdGlvbi5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NjaGVtYS9lZGl0b3Jjb25maWd1cmF0aW9uLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MGZlYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NjaGVtYS9lZGl0b3Jjb25maWd1cmF0aW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aSIgaWQ9ImVkaXRvckNvbmZpZ3VyYXRpb24iIG5hbWU9IkVkaXRvciBDb25maWd1cmF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBTU0UgU3RydWN0dXJlZFRleHRFZGl0b3IgaXMgaW50ZW5kZWQgdG8gYmUgYXMgZmxleGlibGUgYXMgcG9zc2libGUuICBNdWNoIG9mIGl0cyBkZXNpZ24gY2VudGVycyBhcm91bmQgdGhlIG5vdGlvbiBvZiBkZWZpbmluZyBhbmQgcmVkZWZpbmluZyBpdHMgYmVoYXZpb3IgYW5kIGFwcGVhcmFuY2UgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZSBvZiBpdHMgaW5wdXQuICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgY2xpZW50cyB0byBwcm92aWRlIGFuIGVkaXRvciBjb25maWd1cmF0aW9uIHRvIHRoZSBTdHJ1Y3R1cmVkVGV4dEVkaXRvciB3aXRob3V0IGhhdmluZyB0byBzdWJjbGFzcyB0aGUgZWRpdG9yLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkb2N1bWVudGF0aW9uVGV4dEhvdmVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRvdWJsZUNsaWNrU3RyYXRlZ3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvdmlzaW9uYWxDb25maWd1cmF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb3Zpc2lvbmFsRGVmaW5pdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIHNvdXJjZSB2aWV3ZXIgY29uZmlndXJhdGlvbiwgYWZmZWN0aW5nIHN5bnRheCBoaWdobGlnaHRpbmcsIGNvbnRlbnQgYXNzaXN0LCBob3ZlciBoZWxwLCBhbmQgbW9yZSBpbiB0aGUgY3VycmVudCBlZGl0b3IuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHN0cmluZyBkZWZpbmluZyB3aGVuIHRvIHVzZSB0aGlzIGV4dGVuc2lvbiwgZWl0aGVyIGFuIGVkaXRvciBvciBjb250ZW50IHR5cGUgaWQuICBNdWx0aXBsZSB0YXJnZXRzIG1heSBiZSBnaXZlbiBhcyBhIGNvbW1hIGRlbGltaXRlZCB2YWx1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBNdXN0IHN1YmNsYXNzIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjoiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWZpbmVzIGhvdyB0aGUgY3VycmVudCBlZGl0b3ImYXBvcztzIGlucHV0IG1hcHMgdG8gZWxlbWVudHMgd2l0aCBpbiBhIFRyZWUgY29udHJvbCwgYXMgd2VsbCBhcyBzZWxlY3Rpb24gZmlsdGVyaW5nLCB0b29sYmFyIGFuZCBtZW51IGNvbnRyaWJ1dGlvbnMsIGV0YyBpbiB0aGUgT3V0bGluZSB2aWV3LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBzdHJpbmcgZGVmaW5pbmcgd2hlbiB0byB1c2UgdGhpcyBleHRlbnNpb24sIGVpdGhlciBhbiBlZGl0b3Igb3IgY29udGVudCB0eXBlIGlkLiAgTXVsdGlwbGUgdGFyZ2V0cyBtYXkgYmUgZ2l2ZW4gYXMgYSBjb21tYSBkZWxpbWl0ZWQgdmFsdWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgTXVzdCBzdWJjbGFzcyBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb246Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWZpbmVzIGhvdyB0aGUgY3VycmVudCBlZGl0b3ImYXBvcztzIGlucHV0IG1hcHMgdG8gcHJvcGVydGllcyBpbiBhIFRhYmxlIGNvbnRyb2wsIGFzIHdlbGwgYXMgdG9vbGJhciBjb250cmlidXRpb25zLCBldGMgaW4gdGhlIFByb3BlcnRpZXMgdmlldy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgc3RyaW5nIGRlZmluaW5nIHdoZW4gdG8gdXNlIHRoaXMgZXh0ZW5zaW9uLCBlaXRoZXIgYW4gZWRpdG9yIG9yIGNvbnRlbnQgdHlwZSBpZC4gIE11bHRpcGxlIHRhcmdldHMgbWF5IGJlIGdpdmVuIGFzIGEgY29tbWEgZGVsaW1pdGVkIHZhbHVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIE11c3Qgc3ViY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb246Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImRvY3VtZW50YXRpb25UZXh0SG92ZXIiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlZmluZXMgdGhlIHRleHQgaG92ZXIgcHJvY2Vzc29yIHRvIHVzZSB0byBkaXNwbGF5IGRvY3VtZW50YXRpb24gaW5mb3JtYXRpb24gaW4gYSB0ZXh0IGhvdmVyLiBOb3RlLCBpbiB0aGUgZXZlbnQgbW9yZSB0aGFuIG9uZSBkb2N1bWVudGF0aW9uIHRleHQgaG92ZXIgaXMgY29udHJpYnV0ZWQgZm9yIHRoZSBzYW1lIHRhcmdldCBwYXJ0aXRpb24gdHlwZSwgdGhlIGZpcnN0IG9uZSBsb2FkZWQgd2lsbCBiZSB0aGUgb25lIHVzZWQgYW5kIGFsbCBvdGhlciBjb250cmlidXRpb25zIHdpbGwgYmUgaWdub3JlZC4KLSZsdDticiAvJmd0OwotJmx0O2kmZ3Q7U2luY2UgMy4wJmx0Oy9pJmd0OwotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBzdHJpbmcgZGVmaW5pbmcgd2hlbiB0byB1c2UgdGhpcyBleHRlbnNpb24uICBNdXN0IGJlIGEgcGFydGl0aW9uIHR5cGUgaWQuICBNdWx0aXBsZSB0YXJnZXRzIG1heSBiZSBnaXZlbiBhcyBhIGNvbW1hIGRlbGltaXRlZCB2YWx1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBNdXN0IGltcGxlbWVudCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZG91YmxlQ2xpY2tTdHJhdGVneSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVmaW5lcyB0aGUgZG91YmxlY2xpY2sgc3RyYXRlZ3kgdG8gdXNlIHdoZW4gdGhlIHVzZXIgcGVyZm9ybXMgYSBtb3VzZSBkb3VibGVjbGljay4gIE5vdGUsIGluIHRoZSBldmVudCBtb3JlIHRoYW4gb25lIGRvdWJsZWNsaWNrIHN0cmF0ZWd5IGlzIGNvbnRyaWJ1dGVkIGZvciB0aGUgc2FtZSB0YXJnZXQgcGFydGl0aW9uIHR5cGUsIHRoZSBmaXJzdCBvbmUgbG9hZGVkIHdpbGwgYmUgdGhlIG9uZSB1c2VkIGFuZCBhbGwgb3RoZXIgY29udHJpYnV0aW9ucyB3aWxsIGJlIGlnbm9yZWQuCi0mbHQ7YnIgLyZndDsKLSZsdDtpJmd0O1NpbmNlIDMuMCZsdDsvaSZndDsKLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgc3RyaW5nIGRlZmluaW5nIHdoZW4gdG8gdXNlIHRoaXMgZXh0ZW5zaW9uLiAgTXVzdCBiZSBhIHBhcnRpdGlvbiB0eXBlIGlkLiAgTXVsdGlwbGUgdGFyZ2V0cyBtYXkgYmUgZ2l2ZW4gYXMgYSBjb21tYSBkZWxpbWl0ZWQgdmFsdWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgTXVzdCBpbXBsZW1lbnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dERvdWJsZUNsaWNrU3RyYXRlZ3kKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0RG91YmxlQ2xpY2tTdHJhdGVneSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwcm92aXNpb25hbENvbmZpZ3VyYXRpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlY2xhcmVzIGEgY2xhc3MgZnVsZmlsbGluZyB0aGUgcmVxdWlyZW1lbnRzIG9mIGEgdHlwZSB0byBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4gdGFyZ2V0KHMpLgotTm90ZTogdGhpcyBpcyBub3QgQVBJIGFuZCBpcyBvbmx5IHVzZWQgZm9yIHByb3Zpc2lvbmFsIGNvbmZpZ3VyYXRpb24gdHlwZXMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHN0cmluZyBkZWZpbmluZyB3aGVuIHRvIHVzZSB0aGlzIGV4dGVuc2lvbiwgZWl0aGVyIGFuIGVkaXRvciBvciBjb250ZW50IHR5cGUgaWQuICBNdWx0aXBsZSB0YXJnZXRzIG1heSBiZSBnaXZlbiBhcyBhIGNvbW1hIGRlbGltaXRlZCB2YWx1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB0eXBlIG9mIGNvbmZpZ3VyYXRpb24gdG8gZmluZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgdGhpcyB0eXBlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwcm92aXNpb25hbERlZmluaXRpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlZmluZXMgYSB2YWx1ZSBmb3IgYSB0eXBlIHRvIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiB0YXJnZXQocykuCi1Ob3RlOiB0aGlzIGlzIG5vdCBBUEkgYW5kIGlzIG9ubHkgdXNlZCBmb3IgcHJvdmlzaW9uYWwgY29uZmlndXJhdGlvbiB0eXBlcy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiBkZWZpbml0aW9uIHRvIGZpbmQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoaXMgZGVmaW5pdGlvbi4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBzdHJpbmcgZGVmaW5pbmcgd2hlbiB0byB1c2UgdGhpcyBleHRlbnNpb24sIGVpdGhlciBhbiBlZGl0b3Igb3IgY29udGVudCB0eXBlIGlkLiAgTXVsdGlwbGUgdGFyZ2V0cyBtYXkgYmUgZ2l2ZW4gYXMgYSBjb21tYSBkZWxpbWl0ZWQgdmFsdWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiAKLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbiZxdW90OyZndDsKLSAgICAgICZsdDshLS0gYXNzb2NpYXRpbmcgYSBzb3VyY2Ugdmlld2VyIGNvbmZpZ3VyYXRpb24gdG8gYW4gaW5wdXQmYXBvcztzIGNvbnRlbnQgdHlwZS0tJmd0OwotICAgICAgJmx0O3NvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC5odG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwmcXVvdDsKLSAgICAgICAgICAgIHRhcmdldD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UmcXVvdDsvJmd0OwotICAgICAgJmx0OyEtLSBhc3NvY2lhdGluZyBhbiBvdXRsaW5lIGNvbmZpZ3VyYXRpb24gdG8gYW4gaW5wdXQmYXBvcztzIGNvbnRlbnQgdHlwZSAtLSZndDsKLSAgICAgICZsdDtjb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNzZS54bWwudWkudmlld3MuY29udGVudG91dGxpbmUuWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uJnF1b3Q7Ci0gICAgICAgICAgICB0YXJnZXQ9JnF1b3Q7b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7IS0tIGFzc29jaWF0aW5nIGEgcHJvcGVydHkgc2hlZXQgY29uZmlndXJhdGlvbiB0byBtdWx0aXBsZSBjb250ZW50IHR5cGVzIC0tJmd0OwotICAgICAgJmx0O3Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLnByb3BlcnRpZXMuWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24mcXVvdDsKLSAgICAgICAgICAgIHRhcmdldD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc3NlLmNvbnRlbnR0eXBlLnhtbCwgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlLCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlJnF1b3Q7LyZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgc2VlICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uJmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24mbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXMuU3RydWN0dXJlZFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uJmx0Oy9jb2RlJmd0Oy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc2NoZW1hL29yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbi5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NjaGVtYS9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI1MGQzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc2NoZW1hL29yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbi5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiIGlkPSJzb3VyY2V2YWxpZGF0aW9uIiBuYW1lPSJTb3VyY2UgVmFsaWRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwcm92aWRlZCB0byBhbGxvdyBjbGllbnRzIHRvIGNvbnRyaWJ1dGUgYSB2YWxpZGF0b3IgKCZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciZsdDsvY29kZSZndDspCi1mb3IgYXMteW91LXR5cGUgKHNvdXJjZSkgdmFsaWRhdGlvbi4mbHQ7YnImZ3Q7Ci0KLUlmIHlvdXIgdmFsaWRhdG9yIGNhbiBoYW5kbGUgJnF1b3Q7cGFydGlhbCBkb2N1bWVudCZxdW90OyB2YWxpZGF0aW9uLCBpdCBzaG91bGQgYWxzbyBpbXBsZW1lbnQgSVNvdXJjZVZhbGlkYXRvci4gIFRoZSB2YWxpZGF0ZSBjYWxsIG9uIElTb3VyY2VWYWxpZGF0b3IgZ2V0cyBwYXNzZWQgYW4gSVJlZ2lvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGFydCBvZiB0aGUgZG9jdW1lbnQgdGhhdCZhcG9zO3MgZGlydHkuJmx0O2JyJmd0OwotCi1UaGlzIHNob3VsZCBiZSBtdWNoIG1vcmUgZWZmaWNpZW50IHRoYW4gdmFsaWRhdGluZyB0aGUgZW50aXJlIGZpbGUgZWFjaCB0aW1lIHNvbWVvbmUgdHlwZXMuJmx0O2JyJmd0OwotCi1UaGUgdmFsaWRhdG9yIGlzIGVuYWJsZWQgZm9yIHNwZWNpZmljIGNvbnRlbnQgdHlwZS9wYXJ0aXRpb24gY29tYmluYXRpb25zLiZsdDticiZndDsKLQotUmVxdWlyZWQgcGx1Z2lucyBhcmU6Jmx0O2JyJmd0OwotICAgb3JnLmVjbGlwc2Uud3N0LnNzZS51aSZsdDticiZndDsKLSAgIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InZhbGlkYXRvciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InZhbGlkYXRvciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbnRlbnRUeXBlSWRlbnRpZmllciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2NvcGUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InBhcnRpdGlvblR5cGUiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY29udGVudFR5cGVJZGVudGlmaWVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icGFydGl0aW9uVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFeGFtcGxlIGRlbW9uc3RyYXRpbmcgaG93IEhUTUxWYWxpZGF0b3IgY29udHJpYnV0ZXMgdG8gYXMteW91LXR5cGUgdmFsaWRhdGlvbiBpbiB0aGUgc291cmNlIGVkaXRvci4KLQotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9ucy5zb3VyY2V2YWxpZGF0aW9uJnF1b3Q7Jmd0OwotICAgICAgJmx0O3ZhbGlkYXRvcgotICAgICAgICAgICAgc2NvcGU9JnF1b3Q7dG90YWwmcXVvdDsKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmh0bWwuSFRNTFZhbGlkYXRvciZxdW90OwotICAgICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaHRtbHNvdXJjZXZhbGlkYXRvciZxdW90OyZndDsKLSAgICAgICAgICZsdDtjb250ZW50VHlwZUlkZW50aWZpZXIKLSAgICAgICAgICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSZxdW90OyZndDsKLSAgICAgICAgICAgICZsdDtwYXJ0aXRpb25UeXBlCi0gICAgICAgICAgICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFRkFVTFQmcXVvdDsvJmd0OwotICAgICAgICAgJmx0Oy9jb250ZW50VHlwZUlkZW50aWZpZXImZ3Q7Ci0gICAgICAgICAmbHQ7Y29udGVudFR5cGVJZGVudGlmaWVyCi0gICAgICAgICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlJnF1b3Q7Jmd0OwotICAgICAgICAgICAgJmx0O3BhcnRpdGlvblR5cGUKLSAgICAgICAgICAgICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfREVGQVVMVCZxdW90Oy8mZ3Q7Ci0gICAgICAgICAmbHQ7L2NvbnRlbnRUeXBlSWRlbnRpZmllciZndDsKLSAgICAgICZsdDsvdmFsaWRhdG9yJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDtwJmd0OwotVXNpbmcgSVNvdXJjZVZhbGlkYXRvcgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1JZiB5b3VyIHZhbGlkYXRvciBjYW4gaGFuZGxlICZxdW90O3BhcnRpYWwgZG9jdW1lbnQmcXVvdDsgdmFsaWRhdGlvbiwgaXQgc2hvdWxkICBpbXBsZW1lbnQgSVNvdXJjZVZhbGlkYXRvci4gIAotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1UaGUgdmFsaWRhdGUgY2FsbCBvbiBJU291cmNlVmFsaWRhdG9yIGdldHMgcGFzc2VkIGFuIElSZWdpb24gb2YgdGhlIGRvY3VtZW50IHdoaWNoIHJlcHJlc2VudHMganVzdCB0aGUgcGFydCB0aGF0JmFwb3M7cyBkaXJ0eS4gIFRoaXMgc2hvdWxkIGJlIG11Y2ggbW9yZSBlZmZpY2llbnQgdGhhbiB2YWxpZGF0aW5nIHRoZSBlbnRpcmUgZmlsZSBlYWNoIHRpbWUgc29tZW9uZSB0eXBlcy4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotSVNvdXJjZVZhbGlkYXRvciBoYXMgaXRzICZxdW90O2Nvbm5lY3QoSURvY3VtZW50IGRvYykmcXVvdDsgbWV0aG9kIGNhbGxlZCB3aGVuIGl0JmFwb3M7cyBob29rZWQgdXAgdG8gdGhlIGRvY3VtZW50ICh3aGVuIHRoZSBlZGl0b3IgaXMgb3BlbmVkKSwgYW5kICZxdW90O2Rpc2Nvbm5lY3QoSURvY3VtZW50IGRvYykmcXVvdDsgY2FsbGVkIHdoZW4gdGhlIGVkaXRvciBpcyBjbG9zZWQsIHdoZXJlIGFueSAmcXVvdDt1bmhvb2tpbmcmcXVvdDsgc2hvdWxkIHRha2UgcGxhY2UuCi0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEN1cnJlbnRseSB0aGVyZSBpcyBubyBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBmb3IgSVZhbGlkYXRvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NjaGVtYS9xdWlja0ZpeFByb2Nlc3Nvci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NjaGVtYS9xdWlja0ZpeFByb2Nlc3Nvci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODg3MTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zY2hlbWEvcXVpY2tGaXhQcm9jZXNzb3IuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiIGlkPSJxdWlja0ZpeFByb2Nlc3NvciIgbmFtZT0iUXVpY2sgRml4IFByb2Nlc3NvciIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBhIHF1aWNrIGFzc2lzdCBwcm9jZXNzb3IgaW4gU3RydWN0dXJlZCBUZXh0IEVkaXRvcnMgd2l0aCBhIHNwZWNpZmljICZxdW90O2tpbmQmcXVvdDsgb2YgcHJvYmxlbSAoYSBtYXJrZXIgb3IgYW5ub3RhdGlvbiBvZiBhIGNlcnRhaW4gdHlwZSBvciBoYXZpbmcgY2VydGFpbiBhdHRyaWJ1dGUgdmFsdWVzKS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icXVpY2tGaXhQcm9jZXNzb3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InF1aWNrRml4UHJvY2Vzc29yIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYXR0cmlidXRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9ibGVtVHlwZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgcHJvYmxlbSB0eXBlIGZvciB3aGljaCB0aGlzIHF1aWNrIGZpeCBwcm9jZXNzb3IgYXBwbGllcyB0by4gIFRvIHNldCB0aGUgcHJvYmxlbSB0eXBlIGZvciBhbiBhbm5vdGF0aW9uIG9yIG1hcmtlciwgY3JlYXRlIGEgJnF1b3Q7cHJvYmxlbVR5cGUmcXVvdDsgYXR0cmlidXRlIGZvciB0aGUgYW5ub3RhdGlvbi9tYXJrZXIgYW5kIHNldCBhIHZhbHVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpbXBsZW1lbnRpbmcgSVF1aWNrQXNzaXN0UHJvY2Vzc29yCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RQcm9jZXNzb3IiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHdob3NlIHZhbHVlIGlzIGJlaW5nIHNwZWNpZmllZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDMuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YnIgLyZndDsKLSZhbXA7bHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zc2UudWkucXVpY2tGaXhQcm9jZXNzb3ImcXVvdDsmYW1wO2d0OyZsdDticiAvJmd0OwotJmFtcDtuYnNwOyZhbXA7bmJzcDsmYW1wO25ic3A7JmFtcDtsdDtxdWlja0ZpeFByb2Nlc3NvciZsdDticiAvJmd0OwotJmFtcDtuYnNwOyZhbXA7bmJzcDsmYW1wO25ic3A7JmFtcDtuYnNwOyZhbXA7bmJzcDsmYW1wO25ic3A7Y2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leGFtcGxlcy5xdWlja2ZpeGVzLkV4YW1wbGVRdWlja0Fzc2lzdFByb2Nlc3NvciZxdW90OyZsdDticiAvJmd0OwotJmFtcDtuYnNwOyZhbXA7bmJzcDsmYW1wO25ic3A7JmFtcDtuYnNwOyZhbXA7bmJzcDsmYW1wO25ic3A7cHJvYmxlbVR5cGU9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leGFtcGxlcy5xdWlja2ZpeGVzLnByb2JsZW0mcXVvdDsmYW1wO2d0OyZsdDticiAvJmd0OwotJmFtcDtuYnNwOyZhbXA7bmJzcDsmYW1wO25ic3A7JmFtcDtuYnNwOyZhbXA7bmJzcDsmYW1wO25ic3A7JmFtcDtsdDthdHRyaWJ1dGUgbmFtZT0mcXVvdDthbkF0dHJpYnV0ZUtleSZxdW90OyB2YWx1ZT0mcXVvdDthdHRyaWJ1dGUgdmFsdWUmcXVvdDsvJmFtcDtndDsmbHQ7YnIgLyZndDsKLSZhbXA7bmJzcDsmYW1wO25ic3A7JmFtcDtuYnNwOyZhbXA7bHQ7L3F1aWNrRml4UHJvY2Vzc29yJmFtcDtndDsmbHQ7YnIgLyZndDsKLSAmYW1wO2x0Oy9leHRlbnNpb24mYW1wO2d0OyZsdDticiAvJmd0OwotCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayAgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZW5jb2RpbmcvdWkvRW5jb2RpbmdQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VuY29kaW5nL3VpL0VuY29kaW5nUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhlNDE2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZW5jb2RpbmcvdWkvRW5jb2RpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVuY29kaW5nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuQ29kZWRSZXNvdXJjZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgLSB0aGlzIHNob3VsZCBub3QgYmUgaGFuZGxlZCBieSB0aGUgcGxhdGZvcm0gYW5kIG5vdCBXVFAKLSAqLwotCi1wdWJsaWMgY2xhc3MgRW5jb2RpbmdQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQlCdXR0b24gZlVzZTNCeXRlQk9NV2l0aFVURjhDaGVja0JveCA9IG51bGw7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0sgfCBTV1QuTEVGVCB8IFNXVC5XUkFQKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCi0JCWJvb2xlYW4gc2VsZWN0aW9uID0gQ29kZWRSZXNvdXJjZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlVTRV8zQllURV9CT01fV0lUSF9VVEY4KTsKLQkJYnV0dG9uLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCi0JCXJldHVybiBidXR0b247Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJLy9HcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvL0dyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotCi0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IFNTRVVJTWVzc2FnZXMuRW5jb2RpbmdQcmVmZXJlbmNlUGFnZV8wOyAvLyROT04tTkxTLTEkCi0JCQotCQkvLyBJU1NVRTogdGhlIGZvbGxvd2luZyB0byBsaW5lcyBsb29rIHJlZHVuZGFudCwgCi0JCS8vIG5vdCBzdXJlIHdoYXQgd2FzIHRyeWluZyB0byBiZSBhY2NvbXBsaXNoZWQuIAotCQkvLyBNYXkgYmUgZGVhZCBjb2RlLiAKLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBkZXNjcmlwdGlvbik7Ci0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIGNoZWNrQm94TGFiZWwgPSBTU0VVSU1lc3NhZ2VzLkVuY29kaW5nUHJlZmVyZW5jZVBhZ2VfMTsgLy8kTk9OLU5MUy0xJAotCQlmVXNlM0J5dGVCT01XaXRoVVRGOENoZWNrQm94ID0gY3JlYXRlQ2hlY2tCb3goY29tcG9zaXRlLCBjaGVja0JveExhYmVsKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWJvb2xlYW4gZGVmYXVsdFNlbGVjdGlvbiA9IENvZGVkUmVzb3VyY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEJvb2xlYW4oQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuVVNFXzNCWVRFX0JPTV9XSVRIX1VURjgpOwotCQlmVXNlM0J5dGVCT01XaXRoVVRGOENoZWNrQm94LnNldFNlbGVjdGlvbihkZWZhdWx0U2VsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCUNvZGVkUmVzb3VyY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuVVNFXzNCWVRFX0JPTV9XSVRIX1VURjgsIGZVc2UzQnl0ZUJPTVdpdGhVVEY4Q2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOwotCQlDb2RlZFJlc291cmNlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL0NvbmZpZ3VyYXRpb25Qb2ludENhbGN1bGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvQ29uZmlndXJhdGlvblBvaW50Q2FsY3VsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTc0MjBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvQ29uZmlndXJhdGlvblBvaW50Q2FsY3VsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yU2l0ZTsKLQotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25Qb2ludENhbGN1bGF0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0lHTiA9ICIuZGVzaWduIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRSA9ICIuc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKElFZGl0b3JQYXJ0IHBhcnQsIFN0cmluZyBjb250ZW50VHlwZSwgU3RyaW5nIHN1YkNvbnRleHQsIENsYXNzIHJvb3RDbGFzcykgewotCQlDb25maWd1cmF0aW9uUG9pbnRDYWxjdWxhdG9yIGNhbGN1bGF0b3IgPSBuZXcgQ29uZmlndXJhdGlvblBvaW50Q2FsY3VsYXRvcigpOwotCQljYWxjdWxhdG9yLnNldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTsKLQkJY2FsY3VsYXRvci5zZXRQYXJ0KHBhcnQpOwotCQljYWxjdWxhdG9yLnNldFJvb3RDbGFzcyhyb290Q2xhc3MpOwotCQljYWxjdWxhdG9yLnNldFN1YkNvbnRleHQoc3ViQ29udGV4dCk7Ci0JCXJldHVybiBjYWxjdWxhdG9yLmdldENvbmZpZ3VyYXRpb25Qb2ludHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZDb250ZW50VHlwZSA9IG51bGw7Ci0JcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGZQYXJ0ID0gbnVsbDsKLQotCXByb3RlY3RlZCBDbGFzcyBmUm9vdENsYXNzID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZTdWJDb250ZXh0ID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uUG9pbnRDYWxjdWxhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCkgewotCQlMaXN0IHBvaW50cyA9IG5ldyBBcnJheUxpc3QoMik7Ci0KLQkJSUVkaXRvclNpdGUgc2l0ZSA9IGZQYXJ0LmdldEVkaXRvclNpdGUoKTsKLQkJU3RyaW5nIGlkID0gc2l0ZS5nZXRJZCgpOwotCQlpZiAoaWQgIT0gbnVsbCAmJiBpZC5sZW5ndGgoKSA+IDAgJiYgIWlkLmVxdWFscyhmUm9vdENsYXNzLmdldE5hbWUoKSkpCi0JCQlwb2ludHMuYWRkKGlkKTsKLQotCQlpZiAoc2l0ZSBpbnN0YW5jZW9mIE11bHRpUGFnZUVkaXRvclNpdGUpIHsKLQkJCVN0cmluZyBtdWx0aXBhZ2VJRCA9ICgoTXVsdGlQYWdlRWRpdG9yU2l0ZSkgc2l0ZSkuZ2V0TXVsdGlQYWdlRWRpdG9yKCkuZ2V0U2l0ZSgpLmdldElkKCk7Ci0JCQlpZiAoIXBvaW50cy5jb250YWlucyhtdWx0aXBhZ2VJRCkpCi0JCQkJcG9pbnRzLmFkZChtdWx0aXBhZ2VJRCk7Ci0JCQlTdHJpbmcgc291cmNlUGFnZUlEID0gKChNdWx0aVBhZ2VFZGl0b3JTaXRlKSBzaXRlKS5nZXRNdWx0aVBhZ2VFZGl0b3IoKS5nZXRTaXRlKCkuZ2V0SWQoKSArICIuc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCFwb2ludHMuY29udGFpbnMoc291cmNlUGFnZUlEKSkKLQkJCQlwb2ludHMuYWRkKHNvdXJjZVBhZ2VJRCk7Ci0JCX0KLQkJaWYgKHNpdGUgaW5zdGFuY2VvZiBNdWx0aVBhZ2VFZGl0b3JTaXRlKSB7Ci0JCQlTdHJpbmcgbXVsdGlwYWdlQ2xhc3NOYW1lID0gKChNdWx0aVBhZ2VFZGl0b3JTaXRlKSBzaXRlKS5nZXRNdWx0aVBhZ2VFZGl0b3IoKS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCWlmICghcG9pbnRzLmNvbnRhaW5zKG11bHRpcGFnZUNsYXNzTmFtZSkpCi0JCQkJcG9pbnRzLmFkZChtdWx0aXBhZ2VDbGFzc05hbWUpOwotCQl9Ci0JCUNsYXNzIGVkaXRvckNsYXNzID0gZlBhcnQuZ2V0Q2xhc3MoKTsKLQkJd2hpbGUgKGVkaXRvckNsYXNzICE9IG51bGwgJiYgZlJvb3RDbGFzcyAhPSBudWxsICYmICFlZGl0b3JDbGFzcy5lcXVhbHMoZlJvb3RDbGFzcykpIHsKLQkJCWlmICghcG9pbnRzLmNvbnRhaW5zKGVkaXRvckNsYXNzLmdldE5hbWUoKSkpCi0JCQkJcG9pbnRzLmFkZChlZGl0b3JDbGFzcy5nZXROYW1lKCkpOwotCQkJZWRpdG9yQ2xhc3MgPSBlZGl0b3JDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0JCX0KLQotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShmQ29udGVudFR5cGUpOwotCQl3aGlsZSAoY29udGVudFR5cGUgIT0gbnVsbCAmJiAhY29udGVudFR5cGUuZ2V0SWQoKS5lcXVhbHMoSUNvbnRlbnRUeXBlTWFuYWdlci5DVF9URVhUKSkgewotCQkJaWYgKCFwb2ludHMuY29udGFpbnMoY29udGVudFR5cGUuZ2V0SWQoKSkpCi0JCQkJcG9pbnRzLmFkZChjb250ZW50VHlwZS5nZXRJZCgpKTsKLQkJCWNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuZ2V0QmFzZVR5cGUoKTsKLQkJfQotCi0JCWlmICghcG9pbnRzLmNvbnRhaW5zKGZSb290Q2xhc3MuZ2V0TmFtZSgpKSkKLQkJCXBvaW50cy5hZGQoZlJvb3RDbGFzcy5nZXROYW1lKCkpOwotCQlyZXR1cm4gKFN0cmluZ1tdKSBwb2ludHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbnRlbnRUeXBlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBmQ29udGVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXJ0LgotCSAqLwotCXB1YmxpYyBJRWRpdG9yUGFydCBnZXRQYXJ0KCkgewotCQlyZXR1cm4gZlBhcnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSByb290Q2xhc3MuCi0JICovCi0JcHVibGljIENsYXNzIGdldFJvb3RDbGFzcygpIHsKLQkJcmV0dXJuIGZSb290Q2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBzdWJDb250ZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3ViQ29udGV4dCgpIHsKLQkJcmV0dXJuIGZTdWJDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50VHlwZQotCSAqICAgICAgICAgICAgVGhlIGNvbnRlbnRUeXBlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJZkNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJ0IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0KElFZGl0b3JQYXJ0IHBhcnQpIHsKLQkJZlBhcnQgPSBwYXJ0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByb290Q2xhc3MKLQkgKiAgICAgICAgICAgIFRoZSByb290Q2xhc3MgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvb3RDbGFzcyhDbGFzcyByb290Q2xhc3MpIHsKLQkJZlJvb3RDbGFzcyA9IHJvb3RDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3ViQ29udGV4dAotCSAqICAgICAgICAgICAgVGhlIHN1YkNvbnRleHQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1YkNvbnRleHQoU3RyaW5nIHN1YkNvbnRleHQpIHsKLQkJZlN1YkNvbnRleHQgPSBzdWJDb250ZXh0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9JU2VsZlZhbGlkYXRlRWRpdEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9JU2VsZlZhbGlkYXRlRWRpdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2RhYzAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvSVNlbGZWYWxpZGF0ZUVkaXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnM7Ci0KLQotCi0vKioKLSAqIFRoaXMgaXMgYSBtYXJrZXIgaW50ZXJmYWNlIHRvIGNvbnRyb2wgVmFsaWRhdGVFZGl0IGNhbGwgVXN1YWxseSBmcmFtZXdvcmsKLSAqIGNhbGxzIElFeHRlbmRlZFNpbXBsZUVkaXRvciN2YWxpZGF0ZUVkaXQoKSBiZWZvcmUgY2FsbGluZwotICogSUV4dGVuZGVkRWRpdG9yQWN0aW9uJ3MgcnVuKCkgbWV0aG9kLiBIb3dldmVyLCBpZiB0aGUgYWN0aW9uIGltcGxlbWVudHMKLSAqIHRoaXMgaW50ZXJmYWNlLCBmcmFtZXdvcmsgd29uJ3QgY2FsbCB2YWxpZGF0ZUVkaXQoKSBtZXRob2QuCi0gKiAKLSAqIFRoZSBhY3Rpb24gc2hvdWxkIGNhbGwgdmFsaWRhdGVFZGl0KCkgYXQgdGhlaXIgb3duIGFwcHJvcHJpYXRlIHRpbWluZy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VsZlZhbGlkYXRlRWRpdEFjdGlvbiB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYwYTk2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL0lTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIHByb3ZpZGUgY29udmVuaWVudCBmdW5jdGlvbnMgZm9yIGVkaXRvcnMgdGhhdCBtYXkgbm90IGJlCi0gKiBJVGV4dEVkaXRvcnMsIGJ1dCBuZWVkIHRvIGV4cG9zZSBwcm9wZXJ0aWVzIHVzdWFsbHkgZm91bmQgaW4gdGV4dCBlZGl0b3JzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgewotCi0JLyoqCi0JICogQHJldHVybiB0aGUgZG9jdW1lbnQgb2Zmc2V0IGF0IHdoaWNoIHRoZSBDYXJldCBpcyBsb2NhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRDYXJldE9mZnNldCgpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgSURvY3VtZW50IGJlaW5nIGVkaXRlZC4gSWYgdGhpcyBlZGl0b3Igc3VwcG9ydHMgbXVsdGlwbGUKLQkgKiAgICAgICAgIGRvY3VtZW50cywgdGhlIGRvY3VtZW50IGN1cnJlbnRseSBwb3NzZXNzaW5nIHRoZSBjYXJldCB3aWxsIGJlCi0JICogICAgICAgICByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBJRWRpdG9yUGFydCBpbnN0YW5jZSBmb3IgdGhpcyBlZGl0b3IgdGhhdCBpcyBrbm93biB0byB0aGUKLQkgKiAgICAgICAgIHdvcmtiZW5jaC4KLQkgKi8KLQlwdWJsaWMgSUVkaXRvclBhcnQgZ2V0RWRpdG9yUGFydCgpOwotCi0JLyoqCi0JICogQHJldHVybiBUaGUgY3VycmVudCBzZWxlY3Rpb24gd2l0aGluIHRoZSBlZGl0b3IuIEltcGxlbWVudG9ycyBtYXkKLQkgKiAgICAgICAgIHN1cHBvcnQgb3RoZXIgdHlwZXMgb2Ygc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBJVGV4dFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvYnJlYWtwb2ludC9JQnJlYWtwb2ludENvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9icmVha3BvaW50L0lCcmVha3BvaW50Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNmM5YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9icmVha3BvaW50L0lCcmVha3BvaW50Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQ7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGludGVyZmFjZSBJQnJlYWtwb2ludENvbnN0YW50cyB7Ci0JU3RyaW5nIEFUVFJfSElEREVOID0gImhpZGRlbiI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBTZXR0ZXJzIG9mIHRoaXMgYXR0cmlidXRlIHNob3VsZCB1c2UgJy8nZm9yIHNlZ21lbnQgc2VwYXJhdG9ycyB3aGVuCi0JICogcmVwcmVzZW50aW5nIHBhdGhzLgotCSAqLwotCVN0cmluZyBSRVNPVVJDRV9QQVRIID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9ucy5icmVha3BvaW50LnBhdGgiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvSUJyZWFrcG9pbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9icmVha3BvaW50L0lCcmVha3BvaW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRmYWQxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvSUJyZWFrcG9pbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIHByb3ZpZGUgYnJlYWtwb2ludCBjcmVhdGlvbgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCcmVha3BvaW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogQWRkcyBicmVha3BvaW50IHRvIHNwZWNpZmllZCBwb3NpdGlvbgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgSURvY3VtZW50IG9iamVjdAotCSAqIEBwYXJhbSBpbnB1dAotCSAqICAgICAgICAgICAgY3VycmVudCBlZGl0b3IgaW5wdXQsIG5vdCBuZWNlc3NhcmlseSBhbiBJRmlsZUVkaXRvcklucHV0IG9yCi0JICogICAgICAgICAgICBsaW5rZWQgdG8gYSByZXNvdXJjZSBpbiBhbnkgd2F5Ci0JICogQHBhcmFtIGxpbmVOdW1iZXIKLQkgKiAgICAgICAgICAgIGN1cnJlbnQgbGluZSBudW1iZXIKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBjdXJyZW50IGNhcmV0IG9mZnNldAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEByZXR1cm4gSVN0YXR1cyB0aGUgc3RhdHVzIGFmdGVyIGJlaW5nIGFza2VkIHRvIGFkZCBhIGJyZWFrcG9pbnQuIFRoZQotCSAqICAgICAgICAgU2V2ZXJpdHkgb2YgRVJST1Igc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB0aGUgbG9jYXRpb24KLQkgKiAgICAgICAgIGluZm9ybWF0aW9uIGlzIGJvdGggdmFsaWQgZm9yIGEgYnJlYWtwb2ludCBhbmQgb25lIGNvdWxkIG5vdCBiZQotCSAqICAgICAgICAgYWRkZWQuCi0JICovCi0JSVN0YXR1cyBhZGRCcmVha3BvaW50KElEb2N1bWVudCBkb2N1bWVudCwgSUVkaXRvcklucHV0IGlucHV0LCBpbnQgbGluZU51bWJlciwgaW50IG9mZnNldCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgZnJvbSBlZGl0b3IgaW5wdXQKLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcmV0dXJuIElSZXNvdXJjZQotCSAqLwotCUlSZXNvdXJjZSBnZXRSZXNvdXJjZShJRWRpdG9ySW5wdXQgaW5wdXQpOwotCi0JLyoqCi0JICogU2V0IElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSB0b29sCi0JICogICAgICAgICAgICBJU291cmNlRWRpdGluZ1RleHRUb29scyBvYmplY3QKLQkgKi8KLQl2b2lkIHNldFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgdG9vbCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvSUV4dGVuZGVkU3RvcmFnZUVkaXRvcklucHV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvSUV4dGVuZGVkU3RvcmFnZUVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNWQ3ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9icmVha3BvaW50L0lFeHRlbmRlZFN0b3JhZ2VFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0b3JhZ2VFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklFbGVtZW50U3RhdGVMaXN0ZW5lcjsKLQotcHVibGljIGludGVyZmFjZSBJRXh0ZW5kZWRTdG9yYWdlRWRpdG9ySW5wdXQgZXh0ZW5kcyBJU3RvcmFnZUVkaXRvcklucHV0IHsKLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBlbGVtZW50IHN0YXRlIGxpc3RlbmVyIHRvIHRoaXMgaW5wdXQuIEhhcyBubyBlZmZlY3QgaWYKLQkgKiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiBUeXBpY2FsbHkgdXNlZCBieSB0aGUKLQkgKiBJRG9jdW1lbnRQcm92aWRlciB0byByZWdpc3RlciBpdHNlbGYgZm9yIGNoYW5nZSBub3RpZmljYXRpb24uCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIKLQkgKi8KLQl2b2lkIGFkZEVsZW1lbnRTdGF0ZUxpc3RlbmVyKElFbGVtZW50U3RhdGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBlbGVtZW50IHN0YXRlIGxpc3RlbmVyIGZyb20gdGhpcyBpbnB1dC4gSGFzIG5vIGFmZmVjdAotCSAqIGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lciBpcyBub3QgcmVnaXN0ZXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lcgotCSAqLwotCXZvaWQgcmVtb3ZlRWxlbWVudFN0YXRlTGlzdGVuZXIoSUVsZW1lbnRTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvYnJlYWtwb2ludC9Ob2RlTG9jYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvYnJlYWtwb2ludC9Ob2RlTG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYzNGM3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvTm9kZUxvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQ7Ci0KLQotcHVibGljIGludGVyZmFjZSBOb2RlTG9jYXRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIGRvY3VtZW50IGVuZCBvZmZzZXQgb2YgdGhlIGVuZCB0YWcsIC0xIG9mIHRoZXJlIGlzIG5vIGVuZAotCSAqIHRhZwotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlpbnQgZ2V0RW5kVGFnRW5kT2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBzdGFydCBvZmZzZXQgb2YgdGhlIGVuZCB0YWcsIC0xIG9mIHRoZXJlIGlzIG5vIGVuZAotCSAqIHRhZwotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlpbnQgZ2V0RW5kVGFnU3RhcnRPZmZzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRvY3VtZW50IGVuZCBvZmZzZXQgb2YgdGhlIHN0YXJ0IHRhZywgLTEgb2YgdGhlcmUgaXMgbm8KLQkgKiBzdGFydCB0YWcKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JaW50IGdldFN0YXJ0VGFnRW5kT2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBzdGFydCBvZmZzZXQgb2YgdGhlIHN0YXJ0IHRhZywgLTEgb2YgdGhlcmUgaXMgbm8KLQkgKiBzdGFydCB0YWcKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JaW50IGdldFN0YXJ0VGFnU3RhcnRPZmZzZXQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvYnJlYWtwb2ludC9OdWxsU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9icmVha3BvaW50L051bGxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MjZmYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9icmVha3BvaW50L051bGxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBOdWxsU291cmNlRWRpdGluZ1RleHRUb29scyBpbXBsZW1lbnRzIElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJzb3VyY2VlZGl0aW5ndGV4dHRvb2xzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSVRleHRFZGl0b3IgZlRleHRFZGl0b3I7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgTnVsbFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMoKTsKLQl9Ci0KLQlwcml2YXRlIE51bGxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q2FyZXRPZmZzZXQoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsID0gZlRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbCBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQlyZXR1cm4gKChJVGV4dFNlbGVjdGlvbikgc2VsKS5nZXRPZmZzZXQoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZUZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQl9Ci0KLQlwdWJsaWMgSUVkaXRvclBhcnQgZ2V0RWRpdG9yUGFydCgpIHsKLQkJcmV0dXJuIGZUZXh0RWRpdG9yOwotCX0KLQotCXB1YmxpYyBJVGV4dFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCWlmIChmVGV4dEVkaXRvciAhPSBudWxsKQotCQkJcmV0dXJuIChJVGV4dFNlbGVjdGlvbikgZlRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJcmV0dXJuIFRleHRTZWxlY3Rpb24uZW1wdHlTZWxlY3Rpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0RWRpdG9yKElUZXh0RWRpdG9yIGVkaXRvcikgewotCQlmVGV4dEVkaXRvciA9IGVkaXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvRXhjbHVzaW9uc1RhYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0V4Y2x1c2lvbnNUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkNGE1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvRXhjbHVzaW9uc1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3MuRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLlRhc2tUYWdQcmVmZXJlbmNlS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5Tb3J0ZXI7Ci0KLWNsYXNzIEV4Y2x1c2lvbnNUYWIgaW1wbGVtZW50cyBJUHJlZmVyZW5jZVRhYiB7Ci0JcHJpdmF0ZSBjbGFzcyBBcnJheVRyZWVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0JCXB1YmxpYyBBcnJheVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBPYmplY3RbXSkKLQkJCQlyZXR1cm4gZkNvbnRlbnRUeXBlU29ydGVyLnNvcnQoKE9iamVjdFtdKSBwYXJlbnRFbGVtZW50KTsKLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIENvbnRlbnRUeXBlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQlPYmplY3QgbyA9IGVsZW1lbnQ7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJbyA9IGZDb250ZW50VHlwZU1hbmFnZXIuZ2V0Q29udGVudFR5cGUoby50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBJQ29udGVudFR5cGUpIHsKLQkJCQkJcmV0dXJuICgoSUNvbnRlbnRUeXBlKSBvKS5nZXROYW1lKCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIFF1aWNrU29ydGVyIHRoYXQgc29ydHMgYW5kIHJldHVybnMgYSBJQ29udGVudFR5cGUtdHlwZWQgYXJyYXkKLQkgKi8KLQlwcml2YXRlIGNsYXNzIENvbnRlbnRUeXBlU29ydGVyIGV4dGVuZHMgU29ydGVyIHsKLQkJcHJpdmF0ZSBDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKExvY2FsZS5FTkdMSVNIKTsKLQotCQlwdWJsaWMgYm9vbGVhbiBjb21wYXJlKE9iamVjdCBlbGVtZW50T25lLCBPYmplY3QgZWxlbWVudFR3bykgewotCQkJcmV0dXJuIChjb2xsYXRvci5jb21wYXJlKCgoSUNvbnRlbnRUeXBlKSBlbGVtZW50T25lKS5nZXROYW1lKCksICgoSUNvbnRlbnRUeXBlKSBlbGVtZW50VHdvKS5nZXROYW1lKCkpKSA8IDA7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gc29ydChPYmplY3RbXSB1blNvcnRlZENvbGxlY3Rpb24pIHsKLQkJCU9iamVjdFtdIHR5cGVzID0gc3VwZXIuc29ydCh1blNvcnRlZENvbGxlY3Rpb24pOwotCQkJSUNvbnRlbnRUeXBlW10gc29ydGVkVHlwZXMgPSBuZXcgSUNvbnRlbnRUeXBlW3R5cGVzLmxlbmd0aF07Ci0JCQlpZiAodHlwZXMubGVuZ3RoID4gMCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkodHlwZXMsIDAsIHNvcnRlZFR5cGVzLCAwLCBzb3J0ZWRUeXBlcy5sZW5ndGgpOwotCQkJfQotCQkJcmV0dXJuIHNvcnRlZFR5cGVzOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDb250ZW50VHlwZVRyZWVQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQkJcHVibGljIENvbnRlbnRUeXBlVHJlZVByb3ZpZGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCX0KLQotCQlib29sZWFuIGVxdWFscyhPYmplY3QgbGVmdCwgT2JqZWN0IHJpZ2h0KSB7Ci0JCQlyZXR1cm4gbGVmdCA9PSBudWxsID8gcmlnaHQgPT0gbnVsbCA6ICgocmlnaHQgIT0gbnVsbCkgJiYgbGVmdC5lcXVhbHMocmlnaHQpKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBPYmplY3RbXSkgewotCQkJCXJldHVybiAoT2JqZWN0W10pIHBhcmVudEVsZW1lbnQ7Ci0JCQl9Ci0JCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElDb250ZW50VHlwZSkgewotCQkJCUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KDApOwotCQkJCUlDb250ZW50VHlwZVtdIGFsbFR5cGVzID0gZkNvbnRlbnRUeXBlTWFuYWdlci5nZXRBbGxDb250ZW50VHlwZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICghZlN1cHBvcnRlZENvbnRlbnRUeXBlcy5jb250YWlucyhhbGxUeXBlc1tpXSkgJiYgZXF1YWxzKGFsbFR5cGVzW2ldLmdldEJhc2VUeXBlKCksIHBhcmVudEVsZW1lbnQpKSB7Ci0JCQkJCQllbGVtZW50cy5hZGQoYWxsVHlwZXNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmQ29udGVudFR5cGVTb3J0ZXIuc29ydChlbGVtZW50cy50b0FycmF5KCkpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJT2JqZWN0IHBhcmVudCA9IG51bGw7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb250ZW50VHlwZSkgewotCQkJCXBhcmVudCA9ICgoSUNvbnRlbnRUeXBlKSBlbGVtZW50KS5nZXRCYXNlVHlwZSgpOwotCQkJfQotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBRdWlja1NvcnRlciB0aGF0IHNvcnRzIGFuZCByZXR1cm5zIGEgU3RyaW5nLXR5cGVkIGFycmF5Ci0JICovCi0JcHJpdmF0ZSBjbGFzcyBTdHJpbmdTb3J0ZXIgZXh0ZW5kcyBTb3J0ZXIgewotCQlDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKExvY2FsZS5FTkdMSVNIKTsKLQotCQlwdWJsaWMgYm9vbGVhbiBjb21wYXJlKE9iamVjdCBlbGVtZW50T25lLCBPYmplY3QgZWxlbWVudFR3bykgewotCQkJcmV0dXJuIChjb2xsYXRvci5jb21wYXJlKGVsZW1lbnRPbmUudG9TdHJpbmcoKSwgZWxlbWVudFR3by50b1N0cmluZygpKSA8IDApOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIHNvcnQoT2JqZWN0W10gdW5Tb3J0ZWRDb2xsZWN0aW9uKSB7Ci0JCQlPYmplY3RbXSBzb3J0ZWRDb2xsZWN0aW9uID0gc3VwZXIuc29ydCh1blNvcnRlZENvbGxlY3Rpb24pOwotCQkJU3RyaW5nW10gc3RyaW5ncyA9IG5ldyBTdHJpbmdbc29ydGVkQ29sbGVjdGlvbi5sZW5ndGhdOwotCQkJLy8gY29weSB0aGUgYXJyYXkgc28gY2FuIHJldHVybiBhIG5ldyBzb3J0ZWQgY29sbGVjdGlvbgotCQkJaWYgKHN0cmluZ3MubGVuZ3RoID4gMCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoc29ydGVkQ29sbGVjdGlvbiwgMCwgc3RyaW5ncywgMCwgc3RyaW5ncy5sZW5ndGgpOwotCQkJfQotCQkJcmV0dXJuIHN0cmluZ3M7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1Z1ByZWZlcmVuY2VzID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy9wcmVmZXJlbmNlcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIENoZWNrYm94VHJlZVZpZXdlciBmQ29udGVudFR5cGVMaXN0OwotCi0JcHJpdmF0ZSBJQ29udGVudFR5cGVNYW5hZ2VyIGZDb250ZW50VHlwZU1hbmFnZXIgPSBudWxsOwotCi0JQ29udGVudFR5cGVTb3J0ZXIgZkNvbnRlbnRUeXBlU29ydGVyID0gbmV3IENvbnRlbnRUeXBlU29ydGVyKCk7Ci0KLQlwcml2YXRlIElDb250ZW50VHlwZVtdIGZJZ25vcmVDb250ZW50VHlwZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBJQ29udGVudFR5cGVbXSBmT3JpZ2luYWxJZ25vcmVDb250ZW50VHlwZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBUYXNrVGFnUHJlZmVyZW5jZVBhZ2UgZk93bmVyID0gbnVsbDsKLQotCXByaXZhdGUgSVNjb3BlQ29udGV4dFtdIGZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyID0gbnVsbDsKLQotCXByaXZhdGUgSVByZWZlcmVuY2VzU2VydmljZSBmUHJlZmVyZW5jZXNTZXJ2aWNlID0gbnVsbDsKLQotCXByaXZhdGUgTGlzdCBmU3VwcG9ydGVkQ29udGVudFR5cGVzID0gbnVsbDsKLQotCXB1YmxpYyBFeGNsdXNpb25zVGFiKFRhc2tUYWdQcmVmZXJlbmNlUGFnZSBwYXJlbnQsIElQcmVmZXJlbmNlc1NlcnZpY2UgcHJlZmVyZW5jZXNTZXJ2aWNlLCBJU2NvcGVDb250ZXh0W10gbG9va3VwT3JkZXIpIHsKLQkJc3VwZXIoKTsKLQkJZk93bmVyID0gcGFyZW50OwotCQlmUHJlZmVyZW5jZXNMb29rdXBPcmRlciA9IGxvb2t1cE9yZGVyOwotCQlmUHJlZmVyZW5jZXNTZXJ2aWNlID0gcHJlZmVyZW5jZXNTZXJ2aWNlOwotCQlmQ29udGVudFR5cGVNYW5hZ2VyID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0KLQkJU3RyaW5nW10gc3VwcG9ydGVkQ29udGVudFR5cGVJRHMgPSBGaWxlVGFza1NjYW5uZXJSZWdpc3RyeVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldFN1cHBvcnRlZENvbnRlbnRUeXBlSWRzKCk7Ci0JCWZTdXBwb3J0ZWRDb250ZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0KHN1cHBvcnRlZENvbnRlbnRUeXBlSURzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwcG9ydGVkQ29udGVudFR5cGVJRHMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb250ZW50VHlwZSB0eXBlID0gZkNvbnRlbnRUeXBlTWFuYWdlci5nZXRDb250ZW50VHlwZShzdXBwb3J0ZWRDb250ZW50VHlwZUlEc1tpXSk7Ci0JCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJZlN1cHBvcnRlZENvbnRlbnRUeXBlcy5hZGQodHlwZSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nW10gaWdub3JlQ29udGVudFR5cGVzID0gU3RyaW5nVXRpbHMudW5wYWNrKGZQcmVmZXJlbmNlc1NlcnZpY2UuZ2V0U3RyaW5nKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFLCBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfQ09OVEVOVFRZUEVTX0lHTk9SRUQsIFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdFN0cmluZyhUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfQ09OVEVOVFRZUEVTX0lHTk9SRUQpLCBmUHJlZmVyZW5jZXNMb29rdXBPcmRlcikpOwotCQlMaXN0IGNvbnRlbnRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZ25vcmVDb250ZW50VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb250ZW50VHlwZSB0eXBlID0gZkNvbnRlbnRUeXBlTWFuYWdlci5nZXRDb250ZW50VHlwZShpZ25vcmVDb250ZW50VHlwZXNbaV0pOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCWNvbnRlbnRUeXBlcy5hZGQodHlwZSk7Ci0JCQl9Ci0JCX0KLQkJZk9yaWdpbmFsSWdub3JlQ29udGVudFR5cGVzID0gZklnbm9yZUNvbnRlbnRUeXBlcyA9IChJQ29udGVudFR5cGVbXSkgY29udGVudFR5cGVzLnRvQXJyYXkobmV3IElDb250ZW50VHlwZVtjb250ZW50VHlwZXMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHRhYkZvbGRlcikgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7Ci0JCVRleHQgZGVzY3JpcHRpb24gPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotCQlkZXNjcmlwdGlvbi5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGFza1RhZ0V4Y2x1c2lvblRhYl8wMik7Ci0JCWRlc2NyaXB0aW9uLnNldEJhY2tncm91bmQoY29tcG9zaXRlLmdldEJhY2tncm91bmQoKSk7Ci0KLQkJZkNvbnRlbnRUeXBlTGlzdCA9IG5ldyBDaGVja2JveFRyZWVWaWV3ZXIoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJZkNvbnRlbnRUeXBlTGlzdC5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb250ZW50VHlwZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWZDb250ZW50VHlwZUxpc3Quc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheVRyZWVDb250ZW50UHJvdmlkZXIoKSk7Ci0KLQkJZkNvbnRlbnRUeXBlTGlzdC5zZXRJbnB1dChmU3VwcG9ydGVkQ29udGVudFR5cGVzLnRvQXJyYXkoKSk7Ci0JCWZDb250ZW50VHlwZUxpc3Quc2V0Q2hlY2tlZEVsZW1lbnRzKGZTdXBwb3J0ZWRDb250ZW50VHlwZXMudG9BcnJheSgpKTsKLQkJZkNvbnRlbnRUeXBlTGlzdC5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZklnbm9yZUNvbnRlbnRUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJZkNvbnRlbnRUeXBlTGlzdC5zZXRDaGVja2VkKGZJZ25vcmVDb250ZW50VHlwZXNbaV0sIGZhbHNlKTsKLQkJfQotCi0JCUJ1dHRvbiBzZWxlY3RBbGwgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlzZWxlY3RBbGwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzE3KTsKLQkJc2VsZWN0QWxsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlLCAxLCAxKSk7Ci0JCXNlbGVjdEFsbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlmQ29udGVudFR5cGVMaXN0LnNldENoZWNrZWRFbGVtZW50cyhmU3VwcG9ydGVkQ29udGVudFR5cGVzLnRvQXJyYXkoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCUJ1dHRvbiBzZWxlY3ROb25lID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJc2VsZWN0Tm9uZS5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTgpOwotCQlzZWxlY3ROb25lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlLCAxLCAxKSk7Ci0JCXNlbGVjdE5vbmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZkNvbnRlbnRUeXBlTGlzdC5zZXRDaGVja2VkRWxlbWVudHMobmV3IE9iamVjdFswXSk7Ci0JCQl9Ci0JCX0pOwotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKSk7Ci0KLQkJVGV4dCBhZmZlY3RlZFR5cGVzTGFiZWwgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotCQlhZmZlY3RlZFR5cGVzTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSkpOwotCQlhZmZlY3RlZFR5cGVzTGFiZWwuc2V0QmFja2dyb3VuZChjb21wb3NpdGUuZ2V0QmFja2dyb3VuZCgpKTsKLQkJYWZmZWN0ZWRUeXBlc0xhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnRXhjbHVzaW9uVGFiXzAzKTsKLQotCQlmaW5hbCBUcmVlVmlld2VyIGNvbnRlbnRUeXBlVHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCWNvbnRlbnRUeXBlVHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb250ZW50VHlwZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWNvbnRlbnRUeXBlVHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IENvbnRlbnRUeXBlVHJlZVByb3ZpZGVyKCkpOwotCQljb250ZW50VHlwZVRyZWVWaWV3ZXIuc2V0SW5wdXQobmV3IE9iamVjdFswXSk7Ci0JCWNvbnRlbnRUeXBlVHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKSk7Ci0KLQkJZkNvbnRlbnRUeXBlTGlzdC5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJCU9iamVjdFtdIG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkudG9BcnJheSgpOwotCQkJCQljb250ZW50VHlwZVRyZWVWaWV3ZXIuc2V0SW5wdXQobyk7Ci0JCQkJCWNvbnRlbnRUeXBlVHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQkJCQkJaWYgKG8ubGVuZ3RoID4gMCkgewotCQkJCQkJY29udGVudFR5cGVUcmVlVmlld2VyLnJldmVhbChvWzBdKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5UYXNrVGFnRXhjbHVzaW9uVGFiXzAxOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseSgpIHsKLQkJc2F2ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvYWRpbmcgZGVmYXVsdHMgaW4gIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXNbXSBkZWZhdWx0UHJlZmVyZW5jZXMgPSBuZXcgSUVjbGlwc2VQcmVmZXJlbmNlc1tmUHJlZmVyZW5jZXNMb29rdXBPcmRlci5sZW5ndGggLSAxXTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBkZWZhdWx0UHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCWRlZmF1bHRQcmVmZXJlbmNlc1tpIC0gMV0gPSBmUHJlZmVyZW5jZXNMb29rdXBPcmRlcltpXS5nZXROb2RlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFKTsKLQkJfQotCQlTdHJpbmdbXSBkZWZhdWx0SWdub3JlVHlwZXMgPSBTdHJpbmdVdGlscy51bnBhY2soZlByZWZlcmVuY2VzU2VydmljZS5nZXQoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0NPTlRFTlRUWVBFU19JR05PUkVELCBudWxsLCBkZWZhdWx0UHJlZmVyZW5jZXMpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUxpc3QgY29udGVudFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlZmF1bHRJZ25vcmVUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBmQ29udGVudFR5cGVNYW5hZ2VyLmdldENvbnRlbnRUeXBlKGRlZmF1bHRJZ25vcmVUeXBlc1tpXSk7Ci0JCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJY29udGVudFR5cGVzLmFkZCh0eXBlKTsKLQkJCX0KLQkJfQotCQlmSWdub3JlQ29udGVudFR5cGVzID0gKElDb250ZW50VHlwZVtdKSBjb250ZW50VHlwZXMudG9BcnJheShuZXcgSUNvbnRlbnRUeXBlW2NvbnRlbnRUeXBlcy5zaXplKCldKTsKLQkJZkNvbnRlbnRUeXBlTGlzdC5zZXRDaGVja2VkRWxlbWVudHMoZkNvbnRlbnRUeXBlTWFuYWdlci5nZXRBbGxDb250ZW50VHlwZXMoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZklnbm9yZUNvbnRlbnRUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJZkNvbnRlbnRUeXBlTGlzdC5zZXRDaGVja2VkKGZJZ25vcmVDb250ZW50VHlwZXNbaV0sIGZhbHNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1PaygpIHsKLQkJTGlzdCBpZ25vcmVkSWRzID0gc2F2ZSgpOwotCQlTdHJpbmdbXSBpZ25vcmVJRHMgPSAoU3RyaW5nW10pIG5ldyBTdHJpbmdTb3J0ZXIoKS5zb3J0KGlnbm9yZWRJZHMudG9BcnJheSgpKTsKLQkJZklnbm9yZUNvbnRlbnRUeXBlcyA9IG5ldyBJQ29udGVudFR5cGVbaWdub3JlSURzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaWdub3JlSURzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmSWdub3JlQ29udGVudFR5cGVzW2ldID0gZkNvbnRlbnRUeXBlTWFuYWdlci5nZXRDb250ZW50VHlwZShpZ25vcmVJRHNbaV0pOwotCQl9Ci0KLQkJaWYgKCFBcnJheXMuZXF1YWxzKGZPcmlnaW5hbElnbm9yZUNvbnRlbnRUeXBlcywgZklnbm9yZUNvbnRlbnRUeXBlcykpIHsKLQkJCWZPd25lci5yZXF1ZXN0UmVkZXRlY3Rpb24oKTsKLQkJfQotCQlmT3JpZ2luYWxJZ25vcmVDb250ZW50VHlwZXMgPSBmSWdub3JlQ29udGVudFR5cGVzOwotCX0KLQotCXByaXZhdGUgTGlzdCBzYXZlKCkgewotCQlMaXN0IGlnbm9yZWRJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgY2hlY2tlZCA9IEFycmF5cy5hc0xpc3QoZkNvbnRlbnRUeXBlTGlzdC5nZXRDaGVja2VkRWxlbWVudHMoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlN1cHBvcnRlZENvbnRlbnRUeXBlcy5zaXplKCk7IGkrKykgewotCQkJaWYgKCFjaGVja2VkLmNvbnRhaW5zKGZTdXBwb3J0ZWRDb250ZW50VHlwZXMuZ2V0KGkpKSkgewotCQkJCWlnbm9yZWRJZHMuYWRkKCgoSUNvbnRlbnRUeXBlKSBmU3VwcG9ydGVkQ29udGVudFR5cGVzLmdldChpKSkuZ2V0SWQoKSk7Ci0JCQl9Ci0JCX0KLQkJSUVjbGlwc2VQcmVmZXJlbmNlc1tdIGRlZmF1bHRQcmVmZXJlbmNlcyA9IG5ldyBJRWNsaXBzZVByZWZlcmVuY2VzW2ZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyLmxlbmd0aCAtIDFdOwotCQlmb3IgKGludCBpID0gMTsgaSA8IGRlZmF1bHRQcmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJZGVmYXVsdFByZWZlcmVuY2VzW2kgLSAxXSA9IGZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyW2ldLmdldE5vZGUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUpOwotCQl9Ci0KLQkJU3RyaW5nIGRlZmF1bHRJZ25vcmVkQ29udGVudFR5cGVJZHMgPSBTdHJpbmdVdGlscy5wYWNrKChTdHJpbmdbXSkgbmV3IFN0cmluZ1NvcnRlcigpLnNvcnQoU3RyaW5nVXRpbHMudW5wYWNrKGZQcmVmZXJlbmNlc1NlcnZpY2UuZ2V0KFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19DT05URU5UVFlQRVNfSUdOT1JFRCwgIiIsIGRlZmF1bHRQcmVmZXJlbmNlcykpKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGlnbm9yZWRDb250ZW50VHlwZUlkcyA9IFN0cmluZ1V0aWxzLnBhY2soKFN0cmluZ1tdKSBuZXcgU3RyaW5nU29ydGVyKCkuc29ydChpZ25vcmVkSWRzLnRvQXJyYXkoKSkpOwotCQlpZiAoaWdub3JlZENvbnRlbnRUeXBlSWRzLmVxdWFscyhkZWZhdWx0SWdub3JlZENvbnRlbnRUeXBlSWRzKSkgewotCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiByZW1vdmluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0NPTlRFTlRUWVBFU19JR05PUkVEICsgIiBmcm9tIHNjb3BlICIgKyBmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXROYW1lKCkgKyAiOiIgKyBmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJfQotCQkJZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0Tm9kZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSkucmVtb3ZlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19DT05URU5UVFlQRVNfSUdOT1JFRCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNldHRpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19DT05URU5UVFlQRVNfSUdOT1JFRCArICIgXCIiICsgaWdub3JlZENvbnRlbnRUeXBlSWRzICsgIlwiIGluIHNjb3BlICIgKyBmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXROYW1lKCkgKyAiOiIgKyBmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJfQotCQkJZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0Tm9kZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSkucHV0KFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19DT05URU5UVFlQRVNfSUdOT1JFRCwgaWdub3JlZENvbnRlbnRUeXBlSWRzKTsKLQkJfQotCQlyZXR1cm4gaWdub3JlZElkczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvTWFpblRhYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL01haW5UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyZWVlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvTWFpblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgkgICBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGFza3MuVGFza1RhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3MuVGFza1RhZ1ByZWZlcmVuY2VLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotY2xhc3MgTWFpblRhYiBpbXBsZW1lbnRzIElQcmVmZXJlbmNlVGFiIHsKLQlwdWJsaWMgY2xhc3MgVGFza1RhZ0RpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JCXB1YmxpYyBUYXNrVGFnIHRhc2tUYWcgPSBudWxsOwotCi0JCUNvbWJvIHByaW9yaXR5Q29tYm8gPSBudWxsOwotCQlUZXh0IHRhZ1RleHQgPSBudWxsOwotCi0JCXB1YmxpYyBUYXNrVGFnRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0JCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJCW5ld1NoZWxsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl81KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCUNvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZUJ1dHRvbkJhcihwYXJlbnQpOwotCQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQodGFza1RhZyA9PSBudWxsIHx8IHRhc2tUYWcuZ2V0VGFnKCkubGVuZ3RoKCkgPiAwKTsKLQkJCXJldHVybiBjOwotCQl9Ci0KLQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSBwYXJlbnQuZ2V0RGlzcGxheSgpLmdldENsaWVudEFyZWEoKS53aWR0aCAvIDU7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl82KTsgLy8kTk9OLU5MUy0xJAotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQl0YWdUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJCXRhZ1RleHQuc2V0VGV4dCh0YXNrVGFnICE9IG51bGwgPyB0YXNrVGFnLmdldFRhZygpIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCQl0YWdUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJdGFnVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCVN0cmluZyB0ZXN0VGFnID0gdGFnVGV4dC5nZXRUZXh0KCk7Ci0JCQkJCVN0cmluZ1tdIHRhZ3MgPSBuZXcgU3RyaW5nW2ZUYXNrVGFncy5sZW5ndGhdOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRhZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCXRhZ3NbaV0gPSBmVGFza1RhZ3NbaV0uZ2V0VGFnKCk7Ci0JCQkJCX0KLQkJCQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQodGFnVGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwICYmICFBcnJheXMuYXNMaXN0KHRhZ3MpLmNvbnRhaW5zKHRlc3RUYWcpKTsKLQkJCQkJdGFza1RhZyA9IG5ldyBUYXNrVGFnKHRhZ1RleHQuZ2V0VGV4dCgpLCBwcmlvcml0eUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJCX0KLQkJCX0pOwotCi0JCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl83KTsgLy8kTk9OLU5MUy0xJAotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQlwcmlvcml0eUNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULlJFQURfT05MWSB8IFNXVC5TSU5HTEUpOwotCQkJcHJpb3JpdHlDb21iby5zZXRJdGVtcyhuZXcgU3RyaW5nW117U1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8wLCBTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzEsIFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMn0pOwotCQkJcHJpb3JpdHlDb21iby5zZWxlY3QodGFza1RhZyAhPSBudWxsID8gdGFza1RhZy5nZXRQcmlvcml0eSgpIDogVGFza1RhZy5QUklPUklUWV9OT1JNQUwpOwotCQkJcHJpb3JpdHlDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCXByaW9yaXR5Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl0YXNrVGFnID0gbmV3IFRhc2tUYWcodGFza1RhZy5nZXRUYWcoKSwgcHJpb3JpdHlDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI29rUHJlc3NlZCgpCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCQl0YXNrVGFnID0gbmV3IFRhc2tUYWcodGFnVGV4dC5nZXRUZXh0KCksIHByaW9yaXR5Q29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQlzdXBlci5va1ByZXNzZWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBUYXNrVGFnVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgVGFza1RhZ1RhYmxlTGFiZWxQcm92aWRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJaWYgKGNvbHVtbkluZGV4IDwgMSkKLQkJCQlyZXR1cm4gKChUYXNrVGFnKSBlbGVtZW50KS5nZXRUYWcoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlRhc2tUYWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZUYXNrVGFnc1tpXS5lcXVhbHMoZWxlbWVudCkpIHsKLQkJCQkJaWYgKGZUYXNrVGFnc1tpXS5nZXRQcmlvcml0eSgpID09IElNYXJrZXIuUFJJT1JJVFlfTE9XKSB7Ci0JCQkJCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8wOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoZlRhc2tUYWdzW2ldLmdldFByaW9yaXR5KCkgPT0gSU1hcmtlci5QUklPUklUWV9ISUdIKSB7Ci0JCQkJCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8yOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8xOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8zOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1Z1ByZWZlcmVuY2VzID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy9wcmVmZXJlbmNlcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIENvbnRyb2wgZkNvbnRyb2w7Ci0KLQlwcml2YXRlIFRhc2tUYWdbXSBmT3JpZ2luYWxUYXNrVGFnczsKLQlwcml2YXRlIFRhc2tUYWdQcmVmZXJlbmNlUGFnZSBmT3duZXIgPSBudWxsOwotCXByaXZhdGUgSVNjb3BlQ29udGV4dFtdIGZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyID0gbnVsbDsKLQotCXByaXZhdGUgSVByZWZlcmVuY2VzU2VydmljZSBmUHJlZmVyZW5jZXNTZXJ2aWNlID0gbnVsbDsKLQotCXByaXZhdGUgVGFza1RhZ1tdIGZUYXNrVGFnczsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmFsdWVUYWJsZSA9IG51bGw7Ci0KLQotCXB1YmxpYyBNYWluVGFiKFRhc2tUYWdQcmVmZXJlbmNlUGFnZSBwYXJlbnQsIElQcmVmZXJlbmNlc1NlcnZpY2UgcHJlZmVyZW5jZXNTZXJ2aWNlLCBJU2NvcGVDb250ZXh0W10gbG9va3VwT3JkZXIpIHsKLQkJc3VwZXIoKTsKLQkJZk93bmVyID0gcGFyZW50OwotCQlmUHJlZmVyZW5jZXNMb29rdXBPcmRlciA9IGxvb2t1cE9yZGVyOwotCQlmUHJlZmVyZW5jZXNTZXJ2aWNlID0gcHJlZmVyZW5jZXNTZXJ2aWNlOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGFkZFRhZygpIHsKLQkJVGFza1RhZ0RpYWxvZyBkbGcgPSBuZXcgVGFza1RhZ0RpYWxvZyhmQ29udHJvbC5nZXRTaGVsbCgpKTsKLQkJaW50IHJlc3VsdCA9IGRsZy5vcGVuKCk7Ci0JCWlmIChyZXN1bHQgPT0gV2luZG93Lk9LKSB7Ci0JCQlUYXNrVGFnIG5ld1RhZyA9IGRsZy50YXNrVGFnOwotCQkJTGlzdCBuZXdUYWdzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGZUYXNrVGFncykpOwotCQkJbmV3VGFncy5hZGQobmV3VGFnKTsKLQkJCWZUYXNrVGFncyA9IChUYXNrVGFnW10pIG5ld1RhZ3MudG9BcnJheShuZXcgVGFza1RhZ1tuZXdUYWdzLnNpemUoKV0pOwotCQkJdmFsdWVUYWJsZS5zZXRJbnB1dChmVGFza1RhZ3MpOwotCQkJdmFsdWVUYWJsZS5nZXRUYWJsZSgpLnNldFNlbGVjdGlvbihmVGFza1RhZ3MubGVuZ3RoIC0gMSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgdGFiRm9sZGVyKSB7Ci0JCWxvYWRQcmVmZXJlbmNlVmFsdWVzKCk7Ci0JCWZPcmlnaW5hbFRhc2tUYWdzID0gZlRhc2tUYWdzOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWZDb250cm9sID0gY29tcG9zaXRlOwotCi0JCVRleHQgZGVzY3JpcHRpb24gPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkgfCBTV1QuU0lOR0xFKTsKLQkJZGVzY3JpcHRpb24uc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzMzKTsgLy8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbi5zZXRCYWNrZ3JvdW5kKGNvbXBvc2l0ZS5nZXRCYWNrZ3JvdW5kKCkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNDQwMwotCQlQb2ludCBzaXplSGludCA9IGRlc2NyaXB0aW9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWdkLndpZHRoSGludCA9IHNpemVIaW50Lng7Ci0JCWRlc2NyaXB0aW9uLnNldExheW91dERhdGEoZ2QpOwotCi0JCXZhbHVlVGFibGUgPSBuZXcgVGFibGVWaWV3ZXIoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJdmFsdWVUYWJsZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCVRhYmxlQ29sdW1uIHRleHRDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odmFsdWVUYWJsZS5nZXRUYWJsZSgpLCBTV1QuTk9ORSwgMCk7Ci0JCXRleHRDb2x1bW4uc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzEyKTsgLy8kTk9OLU5MUy0xJAotCQlUYWJsZUNvbHVtbiBwcmlvcml0eUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih2YWx1ZVRhYmxlLmdldFRhYmxlKCksIFNXVC5OT05FLCAxKTsKLQkJcHJpb3JpdHlDb2x1bW4uc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzEzKTsgLy8kTk9OLU5MUy0xJAotCQl2YWx1ZVRhYmxlLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXZhbHVlVGFibGUuc2V0TGFiZWxQcm92aWRlcihuZXcgVGFza1RhZ1RhYmxlTGFiZWxQcm92aWRlcigpKTsKLQkJdmFsdWVUYWJsZS5nZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJdmFsdWVUYWJsZS5nZXRUYWJsZSgpLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCVRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxLCAxNDAsIHRydWUpKTsKLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMSwgMTQwLCB0cnVlKSk7Ci0JCXZhbHVlVGFibGUuZ2V0VGFibGUoKS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlDb21wb3NpdGUgYnV0dG9ucyA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbnMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlidXR0b25zLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLQotCQlmaW5hbCBCdXR0b24gYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25zLCBTV1QuUFVTSCk7Ci0JCWFkZEJ1dHRvbi5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTQpOyAvLyROT04tTkxTLTEkCi0JCWFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJZmluYWwgQnV0dG9uIGVkaXRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIKTsKLQkJZWRpdEJ1dHRvbi5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTUpOyAvLyROT04tTkxTLTEkCi0JCWVkaXRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCWZpbmFsIEJ1dHRvbiByZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIKTsKLQkJcmVtb3ZlQnV0dG9uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8xNik7IC8vJE5PTi1OTFMtMSQKLQkJcmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0JCWVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlMYWJlbCB3YXJuaW5nID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl3YXJuaW5nLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQl3YXJuaW5nLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8xOSk7IC8vJE5PTi1OTFMtMSQKLQotCQlmaW5hbCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZhbHVlVGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuc2l6ZSgpID09IDEpOwotCQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKCFzZWxlY3Rpb24uaXNFbXB0eSgpKTsKLQkJCX0KLQkJfTsKLQkJdmFsdWVUYWJsZS5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCWFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlhZGRUYWcoKTsKLQkJCQl2YWx1ZVRhYmxlLmdldFRhYmxlKCkuc2V0U2VsZWN0aW9uKGZUYXNrVGFncy5sZW5ndGggLSAxKTsKLQkJCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChudWxsKTsKLQkJCX0KLQkJfSk7Ci0JCWVkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaW50IGkgPSB2YWx1ZVRhYmxlLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQllZGl0VGFnKGkpOwotCQkJCWlmIChpID49IDApIHsKLQkJCQkJdmFsdWVUYWJsZS5nZXRUYWJsZSgpLnNldFNlbGVjdGlvbihpKTsKLQkJCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQobnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWludCBpID0gdmFsdWVUYWJsZS5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJcmVtb3ZlVGFncyh2YWx1ZVRhYmxlLmdldFNlbGVjdGlvbigpKTsKLQkJCQlpZiAoaSA+PSAwICYmIGkgPCBmVGFza1RhZ3MubGVuZ3RoKSB7Ci0JCQkJCXZhbHVlVGFibGUuZ2V0VGFibGUoKS5zZXRTZWxlY3Rpb24oaSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJdmFsdWVUYWJsZS5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCQlpbnQgaSA9IHZhbHVlVGFibGUuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCWVkaXRUYWcoaSk7Ci0JCQkJaWYgKGkgPj0gMCkgewotCQkJCQl2YWx1ZVRhYmxlLmdldFRhYmxlKCkuc2V0U2VsZWN0aW9uKGkpOwotCQkJCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXZhbHVlVGFibGUuc2V0SW5wdXQoZlRhc2tUYWdzKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgZWRpdFRhZyhpbnQgaSkgewotCQlpZiAoaSA8IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzZWxlY3Rpb24gPSB2YWx1ZVRhYmxlLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJVGFza1RhZ0RpYWxvZyBkbGcgPSBuZXcgVGFza1RhZ0RpYWxvZyhmQ29udHJvbC5nZXRTaGVsbCgpKTsKLQkJZGxnLnRhc2tUYWcgPSBmVGFza1RhZ3Nbc2VsZWN0aW9uXTsKLQkJaW50IHJlc3VsdCA9IGRsZy5vcGVuKCk7Ci0JCWlmIChyZXN1bHQgPT0gV2luZG93Lk9LKSB7Ci0JCQlmVGFza1RhZ3Nbc2VsZWN0aW9uXSA9IGRsZy50YXNrVGFnOwotCQkJdmFsdWVUYWJsZS5yZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8yMDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZFByZWZlcmVuY2VWYWx1ZXMoKSB7Ci0JCVN0cmluZyB0YWdzID0gZlByZWZlcmVuY2VzU2VydmljZS5nZXRTdHJpbmcoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUsIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19UQUdTLCAiIiwgZlByZWZlcmVuY2VzTG9va3VwT3JkZXIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBwcmlvcml0aWVzID0gZlByZWZlcmVuY2VzU2VydmljZS5nZXRTdHJpbmcoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUsIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QUklPUklUSUVTLCAiIiwgZlByZWZlcmVuY2VzTG9va3VwT3JkZXIpOyAvLyROT04tTkxTLTEkCi0JCWxvYWRUYWdzQW5kUHJpb3JpdGllc0Zyb20odGFncywgcHJpb3JpdGllcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhZ3MKLQkgKiBAcGFyYW0gcHJpb3JpdGllcwotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkVGFnc0FuZFByaW9yaXRpZXNGcm9tKFN0cmluZyB0YWdTdHJpbmcsIFN0cmluZyBwcmlvcml0eVN0cmluZykgewotCQlTdHJpbmdbXSB0YWdzID0gU3RyaW5nVXRpbHMudW5wYWNrKHRhZ1N0cmluZyk7Ci0KLQkJU3RyaW5nVG9rZW5pemVyIHRva2VyID0gbnVsbDsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXRva2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcmlvcml0eVN0cmluZywgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAodG9rZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlJbnRlZ2VyIG51bWJlciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW51bWJlciA9IEludGVnZXIudmFsdWVPZih0b2tlci5uZXh0VG9rZW4oKSk7Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQludW1iZXIgPSBuZXcgSW50ZWdlcihJTWFya2VyLlBSSU9SSVRZX05PUk1BTCk7Ci0JCQl9Ci0JCQlsaXN0LmFkZChudW1iZXIpOwotCQl9Ci0JCUludGVnZXJbXSBwcmlvcml0aWVzID0gKEludGVnZXJbXSkgbGlzdC50b0FycmF5KG5ldyBJbnRlZ2VyWzBdKTsKLQotCQlmVGFza1RhZ3MgPSBuZXcgVGFza1RhZ1tNYXRoLm1pbih0YWdzLmxlbmd0aCwgcHJpb3JpdGllcy5sZW5ndGgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFza1RhZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWZUYXNrVGFnc1tpXSA9IG5ldyBUYXNrVGFnKHRhZ3NbaV0sIHByaW9yaXRpZXNbaV0uaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoKSB7Ci0JCXNhdmUoKTsKLQotCQlpZiAoIUFycmF5cy5lcXVhbHMoZk9yaWdpbmFsVGFza1RhZ3MsIGZUYXNrVGFncykpIHsKLQkJCWZPd25lci5yZXF1ZXN0UmVkZXRlY3Rpb24oKTsKLQkJfQotCQlmT3JpZ2luYWxUYXNrVGFncyA9IGZUYXNrVGFnczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2FkaW5nIGRlZmF1bHRzIGluICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJRWNsaXBzZVByZWZlcmVuY2VzW10gcHJlZmVyZW5jZXMgPSBuZXcgSUVjbGlwc2VQcmVmZXJlbmNlc1tmUHJlZmVyZW5jZXNMb29rdXBPcmRlci5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcmVmZXJlbmNlc1tpXSA9IGZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyW2ldLmdldE5vZGUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUpOwotCQl9Ci0JCVN0cmluZyB0YWdzID0gZlByZWZlcmVuY2VzU2VydmljZS5nZXQoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1RBR1MsIG51bGwsIHByZWZlcmVuY2VzKTsKLQkJU3RyaW5nIHByaW9yaXRpZXMgPSBmUHJlZmVyZW5jZXNTZXJ2aWNlLmdldChUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUFJJT1JJVElFUywgbnVsbCwgcHJlZmVyZW5jZXMpOwotCQlsb2FkVGFnc0FuZFByaW9yaXRpZXNGcm9tKHRhZ3MsIHByaW9yaXRpZXMpOwotCQlpbnQgc2VsZWN0aW9uID0gdmFsdWVUYWJsZS5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCXZhbHVlVGFibGUuc2V0SW5wdXQoZlRhc2tUYWdzKTsKLQkJdmFsdWVUYWJsZS5nZXRUYWJsZSgpLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1PaygpIHsKLQkJcGVyZm9ybUFwcGx5KCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVUYWdzKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJTGlzdCB0YXNrVGFncyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChmVGFza1RhZ3MpKTsKLQkJdGFza1RhZ3MucmVtb3ZlQWxsKHN0cnVjdHVyZWRTZWxlY3Rpb24udG9MaXN0KCkpOwotCQlmVGFza1RhZ3MgPSAoVGFza1RhZ1tdKSB0YXNrVGFncy50b0FycmF5KG5ldyBUYXNrVGFnW3Rhc2tUYWdzLnNpemUoKV0pOwotCQl2YWx1ZVRhYmxlLnNldElucHV0KGZUYXNrVGFncyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmUoKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgZGVmYXVsdFByZWZlcmVuY2VzID0gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUpOwotCQlTdHJpbmcgZGVmYXVsdFRhZ3MgPSBkZWZhdWx0UHJlZmVyZW5jZXMuZ2V0KFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19UQUdTLCBudWxsKTsKLQkJU3RyaW5nIGRlZmF1bHRQcmlvcml0aWVzID0gZGVmYXVsdFByZWZlcmVuY2VzLmdldChUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUFJJT1JJVElFUywgbnVsbCk7Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFza1RhZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpID4gMCkgewotCQkJCWJ1Zi5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYnVmLmFwcGVuZChmVGFza1RhZ3NbaV0uZ2V0VGFnKCkpOwotCQl9Ci0JCVN0cmluZyBjdXJyZW50VGFncyA9IGJ1Zi50b1N0cmluZygpOwotCQlpZiAoY3VycmVudFRhZ3MuZXF1YWxzKGRlZmF1bHRUYWdzKSAmJiAhZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TmFtZSgpLmVxdWFscyhEZWZhdWx0U2NvcGUuU0NPUEUpKSB7Ci0JCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHJlbW92aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfVEFHUyArICIgZnJvbSBzY29wZSAiICsgZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TmFtZSgpICsgIjoiICsgZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCX0KLQkJCWZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldE5vZGUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUpLnJlbW92ZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfVEFHUyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmT3duZXIucmVxdWVzdFJlZGV0ZWN0aW9uKCk7Ci0JCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNldHRpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19UQUdTICsgIiBcIiIgKyBjdXJyZW50VGFncyArICJcIiBpbiBzY29wZSAiICsgZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TmFtZSgpICsgIjoiICsgZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCX0KLQkJCWZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldE5vZGUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUpLnB1dChUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfVEFHUywgY3VycmVudFRhZ3MpOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZjIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlRhc2tUYWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSA+IDApIHsKLQkJCQlidWYyLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlidWYyLmFwcGVuZChTdHJpbmcudmFsdWVPZihmVGFza1RhZ3NbaV0uZ2V0UHJpb3JpdHkoKSkpOwotCQl9Ci0JCVN0cmluZyBwcmlvcml0aWVzID0gYnVmMi50b1N0cmluZygpOwotCi0JCWlmIChwcmlvcml0aWVzLmVxdWFscyhkZWZhdWx0UHJpb3JpdGllcykgJiYgIWZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldE5hbWUoKS5lcXVhbHMoRGVmYXVsdFNjb3BlLlNDT1BFKSkgewotCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiByZW1vdmluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BSSU9SSVRJRVMgKyAiIGZyb20gc2NvcGUgIiArIGZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldE5hbWUoKSArICI6IiArIGZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQl9Ci0JCQlmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXROb2RlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFKS5yZW1vdmUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BSSU9SSVRJRVMpOwotCQl9Ci0JCWVsc2UgewotCQkJZk93bmVyLnJlcXVlc3RSZWRldGVjdGlvbigpOwotCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBzZXR0aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUFJJT1JJVElFUyArICIgXCIiICsgcHJpb3JpdGllcyArICJcIiBpbiBzY29wZSAiICsgZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TmFtZSgpICsgIjoiICsgZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCX0KLQkJCWZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldE5vZGUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUpLnB1dChUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUFJJT1JJVElFUywgcHJpb3JpdGllcyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvUHJvcGVydHlQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1Byb3BlcnR5UHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiODVhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvUHJvcGVydHlQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Db250cm9sRW5hYmxlU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3REaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLlRhc2tUYWdQcmVmZXJlbmNlS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLQotLyoqCi0gKiBCYXNlZCBsb29zbGV5IG9uIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5Qcm9wZXJ0eUFuZFByZWZlcmVuY2VQYWdlCi0gKi8KLWFic3RyYWN0IGNsYXNzIFByb3BlcnR5UHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnUHJlZmVyZW5jZXMgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wcmVmZXJlbmNlcy1wcm9wZXJ0aWVzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvKgotCSAqIERpc2FibGUgbGluayBkYXRhLCBwcmV2ZW50cyB0aGUgZGlzcGxheSBvZiBhICJ3b3Jrc3BhY2UiIG9yICJwcm9qZWN0IgotCSAqIHNldHRpbmdzIGxpbmsgdG8gcHJldmVudCByZWN1cnNpdmUgZGlhbG9nIGxhdW5jaGluZwotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBESVNBQkxFX0xJTksgPSAiRElTQUJMRV9MSU5LIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNYXAgZkRhdGEgPSBudWxsOwotCi0JcHJpdmF0ZSBCdXR0b24gZkVuYWJsZVByb2plY3RTZXR0aW5nczsKLQotCXByaXZhdGUgTGluayBmUHJvamVjdFNldHRpbmdzTGluazsKLQotCXB1YmxpYyBQcm9wZXJ0eVByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIGFwcGx5RGF0YShPYmplY3QgZGF0YSkgewotCQlzdXBlci5hcHBseURhdGEoZGF0YSk7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgTWFwKSB7Ci0JCQlmRGF0YSA9IChNYXApIGRhdGE7Ci0JCQl1cGRhdGVMaW5rRW5hYmxlbWVudCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbnRyb2wgY3JlYXRlQ29tbW9uQ29udGVudHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSk7Ci0KLQlwdWJsaWMgZmluYWwgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCUNvbXBvc2l0ZSBjaGVja0xpbmtDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljaGVja0xpbmtDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCWNoZWNrTGlua0NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQlpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCWZFbmFibGVQcm9qZWN0U2V0dGluZ3MgPSBuZXcgQnV0dG9uKGNoZWNrTGlua0NvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJCWZFbmFibGVQcm9qZWN0U2V0dGluZ3Muc2V0VGV4dChTU0VVSU1lc3NhZ2VzLkVuYWJsZVByb2plY3RTZXR0aW5ncyk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQlmRW5hYmxlUHJvamVjdFNldHRpbmdzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQkJYm9vbGVhbiBlbmFibGVkRm9yUHJvamVjdCA9IGNyZWF0ZVByZWZlcmVuY2VTY29wZXMoKVswXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLmdldEJvb2xlYW4oZ2V0UHJvamVjdFNldHRpbmdzS2V5KCksIGZhbHNlKTsKLQkJCWZFbmFibGVQcm9qZWN0U2V0dGluZ3Muc2V0U2VsZWN0aW9uKGVuYWJsZWRGb3JQcm9qZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxhYmVsIHNwYWNlciA9IG5ldyBMYWJlbChjaGVja0xpbmtDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCQlzcGFjZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCX0KLQotCQlmUHJvamVjdFNldHRpbmdzTGluayA9IG5ldyBMaW5rKGNoZWNrTGlua0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlmUHJvamVjdFNldHRpbmdzTGluay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuQkVHSU5OSU5HLCB0cnVlLCBmYWxzZSkpOwotCi0JCS8qCi0JCSAqICJlbGVtZW50IiBzaG91bGQgYmUgYSBwcm9qZWN0LCBpZiBudWxsLCBsaW5rIHRvIHBlci1wcm9qZWN0Ci0JCSAqIHByb3BlcnRpZXMKLQkJICovCi0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJZlByb2plY3RTZXR0aW5nc0xpbmsuc2V0VGV4dCgiPGE+IiArIFNTRVVJTWVzc2FnZXMuQ29uZmlndXJlV29ya3NwYWNlU2V0dGluZ3MgKyAiPC9hPiIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVsc2UgewotCQkJZlByb2plY3RTZXR0aW5nc0xpbmsuc2V0VGV4dCgiPGE+IiArIFNTRVVJTWVzc2FnZXMuQ29uZmlndXJlUHJvamVjdFNldHRpbmdzICsgIjwvYT4iKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXVwZGF0ZUxpbmtFbmFibGVtZW50KCk7Ci0KLQkJZlByb2plY3RTZXR0aW5nc0xpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChnZXRQcm9qZWN0KCkgPT0gbnVsbCkgewotCQkJCQlvcGVuUHJvamVjdFNldHRpbmdzKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlvcGVuV29ya3NwYWNlU2V0dGluZ3MoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJaWYgKGdldFByb2plY3QoKSAhPSBudWxsKSB7Ci0JCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJCWxpbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCX0KLQotCQlmaW5hbCBDb250cm9sIGNvbW1vbiA9IGNyZWF0ZUNvbW1vbkNvbnRlbnRzKGNvbXBvc2l0ZSk7Ci0JCWNvbW1vbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlpZiAoZkVuYWJsZVByb2plY3RTZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQlTZWxlY3Rpb25BZGFwdGVyIHNlbGVjdGlvbkFkYXB0ZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlDb250cm9sRW5hYmxlU3RhdGUgZW5hYmxlbWVudHMgPSBudWxsOwotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkJaWYgKGZFbmFibGVQcm9qZWN0U2V0dGluZ3MuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJCWlmIChlbmFibGVtZW50cyAhPSBudWxsKSB7Ci0JCQkJCQkJZW5hYmxlbWVudHMucmVzdG9yZSgpOwotCQkJCQkJCWVuYWJsZW1lbnRzID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWVuYWJsZW1lbnRzID0gQ29udHJvbEVuYWJsZVN0YXRlLmRpc2FibGUoY29tbW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlzZWxlY3Rpb25BZGFwdGVyLndpZGdldFNlbGVjdGVkKG51bGwpOwotCQkJZkVuYWJsZVByb2plY3RTZXR0aW5ncy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25BZGFwdGVyKTsKLQkJfQotCi0JCWFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0JCX0KLQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCX0KLQotCXByb3RlY3RlZCBJU2NvcGVDb250ZXh0W10gY3JlYXRlUHJlZmVyZW5jZVNjb3BlcygpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBJU2NvcGVDb250ZXh0W117bmV3IFByb2plY3RTY29wZShwcm9qZWN0KSwgbmV3IEluc3RhbmNlU2NvcGUoKSwgbmV3IERlZmF1bHRTY29wZSgpfTsKLQkJfQotCQlyZXR1cm4gbmV3IElTY29wZUNvbnRleHRbXXtuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJlZmVyZW5jZVBhZ2VJRCgpOwotCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCWlmIChnZXRFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJcmV0dXJuIChJUHJvamVjdCkgZ2V0RWxlbWVudCgpOwotCQkJfQotCQkJT2JqZWN0IGFkYXB0ZXIgPSBnZXRFbGVtZW50KCkuZ2V0QWRhcHRlcihJUHJvamVjdC5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJcmV0dXJuIChJUHJvamVjdCkgYWRhcHRlcjsKLQkJCX0KLQkJCWFkYXB0ZXIgPSBnZXRFbGVtZW50KCkuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCXJldHVybiAoSVByb2plY3QpIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcm9qZWN0U2V0dGluZ3NLZXkoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvcGVydHlQYWdlSUQoKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzRWxlbWVudFNldHRpbmdzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGZFbmFibGVQcm9qZWN0U2V0dGluZ3MgIT0gbnVsbCAmJiBmRW5hYmxlUHJvamVjdFNldHRpbmdzLmdldFNlbGVjdGlvbigpOwotCX0KLQotCXZvaWQgb3BlblByb2plY3RTZXR0aW5ncygpIHsKLQkJTGlzdERpYWxvZyBkaWFsb2cgPSBuZXcgTGlzdERpYWxvZyhnZXRTaGVsbCgpKSB7Ci0KLQkJCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkJCUNvbnRyb2wgYXJlYSA9IHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEoY29udGFpbmVyKTsKLQkJCQlnZXRUYWJsZVZpZXdlcigpLnNldFNvcnRlcihuZXcgUmVzb3VyY2VTb3J0ZXIoUmVzb3VyY2VTb3J0ZXIuTkFNRSkpOwotCQkJCXJldHVybiBhcmVhOwotCQkJfQotCQl9OwotCQlkaWFsb2cuc2V0TWVzc2FnZShTU0VVSU1lc3NhZ2VzLlByb3BlcnR5UHJlZmVyZW5jZVBhZ2VfMDIpOwotCQlkaWFsb2cuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoSVdvcmtzcGFjZSkgaW5wdXRFbGVtZW50KS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl9Ci0JCX0pOwotCQlkaWFsb2cuc2V0TGFiZWxQcm92aWRlcihuZXcgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIobmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5nZXRMYWJlbERlY29yYXRvcigpKSk7Ci0JCWRpYWxvZy5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkpOwotCQlkaWFsb2cuc2V0VGl0bGUoU1NFVUlNZXNzYWdlcy5Qcm9wZXJ0eVByZWZlcmVuY2VQYWdlXzAxKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlPYmplY3RbXSByZXN1bHQgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JCQlpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBkaWFsb2cuZ2V0UmVzdWx0KClbMF07Ci0JCQkJTWFwIGRhdGEgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWRhdGEucHV0KERJU0FCTEVfTElOSywgQm9vbGVhbi5UUlVFKTsKLQkJCQlQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJvcGVydHlEaWFsb2dPbihnZXRTaGVsbCgpLCBwcm9qZWN0LCBnZXRQcm9wZXJ0eVBhZ2VJRCgpLCBuZXcgU3RyaW5nW117Z2V0UHJvcGVydHlQYWdlSUQoKX0sIGRhdGEpLm9wZW4oKTsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgb3BlbldvcmtzcGFjZVNldHRpbmdzKCkgewotCQlNYXAgZGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCWRhdGEucHV0KERJU0FCTEVfTElOSywgQm9vbGVhbi5UUlVFKTsKLQkJUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLCBnZXRQcmVmZXJlbmNlUGFnZUlEKCksIG5ldyBTdHJpbmdbXXtnZXRQcmVmZXJlbmNlUGFnZUlEKCl9LCBkYXRhKS5vcGVuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIG9rID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0JCUlTY29wZUNvbnRleHRbXSBwcmVmZXJlbmNlU2NvcGVzID0gY3JlYXRlUHJlZmVyZW5jZVNjb3BlcygpOwotCQlpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCWlmIChpc0VsZW1lbnRTZXR0aW5nc0VuYWJsZWQoKSkgewotCQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNldHRpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QRVJfUFJPSkVDVCArICIgKCIgKyB0cnVlICsgIikgaW4gc2NvcGUgIiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TmFtZSgpICsgIjoiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAgCi0JCQkJfQotCQkJCXByZWZlcmVuY2VTY29wZXNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5wdXRCb29sZWFuKGdldFByb2plY3RTZXR0aW5nc0tleSgpLCBmRW5hYmxlUHJvamVjdFNldHRpbmdzLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHJlbW92aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUEVSX1BST0pFQ1QgKyAiIGZyb20gc2NvcGUgIiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TmFtZSgpICsgIjoiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCX0KLQkJCQlwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucmVtb3ZlKGdldFByb2plY3RTZXR0aW5nc0tleSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb2s7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUxpbmtFbmFibGVtZW50KCkgewotCQlpZiAoZkRhdGEgIT0gbnVsbCAmJiBmUHJvamVjdFNldHRpbmdzTGluayAhPSBudWxsKSB7Ci0JCQlmUHJvamVjdFNldHRpbmdzTGluay5zZXRFbmFibGVkKCFCb29sZWFuLlRSVUUuZXF1YWxzKGZEYXRhLmdldChESVNBQkxFX0xJTkspKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvVGFza1RhZ1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvVGFza1RhZ1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMWJlMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1Rhc2tUYWdQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Db250cm9sRW5hYmxlU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrcy5UYXNrU2Nhbm5pbmdTY2hlZHVsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLlRhc2tUYWdQcmVmZXJlbmNlS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5UYWJGb2xkZXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBUYXNrVGFnUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnUHJlZmVyZW5jZXMgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL3ByZWZlcmVuY2VzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvLyBSZW1lbWJlciB0aGUgbGFzdCBkaXNwbGF5ZWQgdGFiIGZvciBjb252ZW5pZW5jZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX1RBR19MQVNUX1RBQiA9ICJ0YXNrLXRhZy1sYXN0LXRhYiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgaW50IGRldGVjdGlvblJlcXVlc3RlZCA9IDA7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmRW5hYmxlQ2hlY2tib3ggPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGZFbmFibGVUYXNrVGFncyA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZk9yaWdpbmFsRW5hYmxlVGFza1RhZ3MgPSB0cnVlOwotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZXNTZXJ2aWNlIGZQcmVmZXJlbmNlc1NlcnZpY2UgPSBudWxsOwotCi0JcHJpdmF0ZSBCdXR0b24gZlJlZGV0ZWN0QnV0dG9uOwotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBmVGFiRW5hYmxlbWVudExpc3RlbmVyOwotCi0JcHJpdmF0ZSBUYWJGb2xkZXIgZlRhYkZvbGRlcjsKLQlwcml2YXRlIElQcmVmZXJlbmNlVGFiW10gZlRhYnMgPSBudWxsOwotCi0JcHVibGljIFRhc2tUYWdQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJZlByZWZlcmVuY2VzU2VydmljZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVCdXR0b25zKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKGdldEVsZW1lbnQoKSA9PSBudWxsKSB7Ci0JCQkoKEdyaWRMYXlvdXQpIHBhcmVudC5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyArPSAyOwotCQkJZlJlZGV0ZWN0QnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQkJCWZSZWRldGVjdEJ1dHRvbi5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VQYWdlXzMyKTsgLy8kTk9OLU5MUy0xJAotCQkJZlJlZGV0ZWN0QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQkJZlJlZGV0ZWN0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmUmVkZXRlY3RCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlKb2IgcmVkZXRlY3RKb2IgPSBuZXcgSm9iKFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjcpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQotCQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQkJCVRhc2tTY2FubmluZ1NjaGVkdWxlci5yZWZyZXNoKCk7Ci0JCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCXJlZGV0ZWN0Sm9iLnNjaGVkdWxlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlMYWJlbCBzcGFjZXIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlzcGFjZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpKTsKLQkJfQotCQlzdXBlci5jb250cmlidXRlQnV0dG9ucyhwYXJlbnQpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbW1vbkNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgY29tcG9zaXRlTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29tcG9zaXRlTGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotCQljb21wb3NpdGVMYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGNvbXBvc2l0ZUxheW91dCk7Ci0KLQkJSVNjb3BlQ29udGV4dFtdIHByZWZlcmVuY2VTY29wZXMgPSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCk7Ci0JCWZPcmlnaW5hbEVuYWJsZVRhc2tUYWdzID0gZkVuYWJsZVRhc2tUYWdzID0gZlByZWZlcmVuY2VzU2VydmljZS5nZXRCb29sZWFuKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCksIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19FTkFCTEUsIGZhbHNlLCBwcmVmZXJlbmNlU2NvcGVzKTsKLQkJZkVuYWJsZUNoZWNrYm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZFbmFibGVDaGVja2JveC5zZXRTZWxlY3Rpb24oZkVuYWJsZVRhc2tUYWdzKTsKLQkJZkVuYWJsZUNoZWNrYm94LnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8zMSk7IC8vJE5PTi1OTFMtMSQKLQkJZkVuYWJsZUNoZWNrYm94LnNldFNlbGVjdGlvbihmRW5hYmxlVGFza1RhZ3MpOwotCQlmRW5hYmxlQ2hlY2tib3guc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcsIEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0VORCwgZmFsc2UsIGZhbHNlLCAxLCAxKSk7Ci0KLQkJZlRhYkZvbGRlciA9IG5ldyBUYWJGb2xkZXIoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWZUYWJGb2xkZXIuc2V0TGF5b3V0KG5ldyBUYWJGb2xkZXJMYXlvdXQoKSk7Ci0JCWZUYWJGb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKSk7Ci0KLQkJVGFiSXRlbSB0YXNrSXRlbSA9IG5ldyBUYWJJdGVtKGZUYWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJTWFpblRhYiBtYWluVGFiID0gbmV3IE1haW5UYWIodGhpcywgZlByZWZlcmVuY2VzU2VydmljZSwgcHJlZmVyZW5jZVNjb3Blcyk7Ci0JCXRhc2tJdGVtLnNldFRleHQobWFpblRhYi5nZXRUaXRsZSgpKTsKLQkJZmluYWwgQ29udHJvbCB0YXNrVGFnc0NvbnRyb2wgPSBtYWluVGFiLmNyZWF0ZUNvbnRlbnRzKGZUYWJGb2xkZXIpOwotCQl0YXNrSXRlbS5zZXRDb250cm9sKHRhc2tUYWdzQ29udHJvbCk7Ci0KLQkJVGFiSXRlbSBleGNsdXNpb25JdGVtID0gbmV3IFRhYkl0ZW0oZlRhYkZvbGRlciwgU1dULk5PTkUpOwotCQlFeGNsdXNpb25zVGFiIGV4Y2x1c2lvbnNUYWIgPSBuZXcgRXhjbHVzaW9uc1RhYih0aGlzLCBmUHJlZmVyZW5jZXNTZXJ2aWNlLCBwcmVmZXJlbmNlU2NvcGVzKTsKLQkJZXhjbHVzaW9uSXRlbS5zZXRUZXh0KGV4Y2x1c2lvbnNUYWIuZ2V0VGl0bGUoKSk7Ci0JCWZpbmFsIENvbnRyb2wgZXhjbHVzaW9uQ29udHJvbCA9IGV4Y2x1c2lvbnNUYWIuY3JlYXRlQ29udGVudHMoZlRhYkZvbGRlcik7Ci0JCWV4Y2x1c2lvbkl0ZW0uc2V0Q29udHJvbChleGNsdXNpb25Db250cm9sKTsKLQotCQlmVGFicyA9IG5ldyBJUHJlZmVyZW5jZVRhYltde21haW5UYWIsIGV4Y2x1c2lvbnNUYWJ9OwotCi0JCWZUYWJFbmFibGVtZW50TGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUNvbnRyb2xFbmFibGVTdGF0ZVtdIGxhc3RFbmFibGVTdGF0ZXMgPSBudWxsOwotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZkVuYWJsZVRhc2tUYWdzID0gZkVuYWJsZUNoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChmRW5hYmxlVGFza1RhZ3MpIHsKLQkJCQkJaWYgKGxhc3RFbmFibGVTdGF0ZXMgIT0gbnVsbCkgewotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsYXN0RW5hYmxlU3RhdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJaWYgKGxhc3RFbmFibGVTdGF0ZXNbaV0gIT0gbnVsbCkgewotCQkJCQkJCQlsYXN0RW5hYmxlU3RhdGVzW2ldLnJlc3RvcmUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlsYXN0RW5hYmxlU3RhdGVzID0gbnVsbDsKLQkJCQkJCWZUYWJGb2xkZXIucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAobGFzdEVuYWJsZVN0YXRlcyA9PSBudWxsKSB7Ci0JCQkJCWxhc3RFbmFibGVTdGF0ZXMgPSBuZXcgQ29udHJvbEVuYWJsZVN0YXRlW2ZUYWJzLmxlbmd0aCArIDFdOwotCQkJCQlsYXN0RW5hYmxlU3RhdGVzWzBdID0gQ29udHJvbEVuYWJsZVN0YXRlLmRpc2FibGUodGFza1RhZ3NDb250cm9sKTsKLQkJCQkJbGFzdEVuYWJsZVN0YXRlc1sxXSA9IENvbnRyb2xFbmFibGVTdGF0ZS5kaXNhYmxlKGV4Y2x1c2lvbkNvbnRyb2wpOwotCQkJCQlpZiAoZlJlZGV0ZWN0QnV0dG9uICE9IG51bGwpIHsKLQkJCQkJCWxhc3RFbmFibGVTdGF0ZXNbMl0gPSBDb250cm9sRW5hYmxlU3RhdGUuZGlzYWJsZShmUmVkZXRlY3RCdXR0b24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlmVGFiRW5hYmxlbWVudExpc3RlbmVyLndpZGdldFNlbGVjdGVkKG51bGwpOwotCQlmRW5hYmxlQ2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIoZlRhYkVuYWJsZW1lbnRMaXN0ZW5lcik7Ci0KLQkJLy8gcmVzdG9yZSBsYXN0IHNlbGVjdGVkIHRhYgotCQlpbnQgYWN0aXZlVGFiID0gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkuZ2V0SW50KFRBU0tfVEFHX0xBU1RfVEFCLCAwKTsKLQkJaWYgKGFjdGl2ZVRhYiA+IDApIHsKLQkJCWZUYWJGb2xkZXIuc2V0U2VsZWN0aW9uKGFjdGl2ZVRhYik7Ci0JCX0KLQotCQlTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuUFJFRldFQlhfVEFTS1RBR1NfSEVMUElEKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkgewotCQlyZXR1cm4gVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlEKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudGFza3RhZ3MiOy8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvamVjdFNldHRpbmdzS2V5KCkgewotCQlyZXR1cm4gVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BFUl9QUk9KRUNUOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvcGVydHlQYWdlSUQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcm9qZWN0LnByb3BlcnRpZXMudGFza3RhZ3MiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8yMDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoKSB7Ci0JCXN1cGVyLnBlcmZvcm1BcHBseSgpOwotCQlzYXZlKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFicy5sZW5ndGg7IGkrKykgewotCQkJZlRhYnNbaV0ucGVyZm9ybUFwcGx5KCk7Ci0JCX0KLQotCQlwcm9tcHRGb3JSZWRldGVjdElmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBkZWZhdWx0UHJlZmVyZW5jZXMgPSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKClbMV0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKTsKLQkJZkVuYWJsZVRhc2tUYWdzID0gZGVmYXVsdFByZWZlcmVuY2VzLmdldEJvb2xlYW4oVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0VOQUJMRSwgZmFsc2UpOwotCQlmRW5hYmxlQ2hlY2tib3guc2V0U2VsZWN0aW9uKGZFbmFibGVUYXNrVGFncyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCWZUYWJzW2ldLnBlcmZvcm1EZWZhdWx0cygpOwotCQl9Ci0JCWZUYWJFbmFibGVtZW50TGlzdGVuZXIud2lkZ2V0U2VsZWN0ZWQobnVsbCk7Ci0JCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2FkaW5nIGRlZmF1bHRzIGluICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiBvayA9IHN1cGVyLnBlcmZvcm1PaygpOwotCQlzYXZlKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFicy5sZW5ndGg7IGkrKykgewotCQkJZlRhYnNbaV0ucGVyZm9ybU9rKCk7Ci0JCX0KLQotCQlwcm9tcHRGb3JSZWRldGVjdElmTmVjZXNzYXJ5KCk7Ci0KLQkJLy8gc2F2ZSBsYXN0IHRhYiAodXNlIERlZmF1bHQgc2NvcGUgc2luY2UgaXQgd29uJ3QgYmUgcGVyc2lzdGVkKQotCQluZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5wdXRJbnQoVEFTS19UQUdfTEFTVF9UQUIsIGZUYWJGb2xkZXIuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0KLQkJSVNjb3BlQ29udGV4dFtdIGNvbnRleHRzID0gY3JlYXRlUHJlZmVyZW5jZVNjb3BlcygpOwotCQkvLyByZW1vdmUgcHJvamVjdC1zcGVjaWZpYyBpbmZvcm1hdGlvbiBpZiBpdCdzIG5vdCBlbmFibGVkCi0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCAmJiAhaXNFbGVtZW50U2V0dGluZ3NFbmFibGVkKCkpIHsKLQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgcmVtb3ZpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QRVJfUFJPSkVDVCArICIgKCIgKyB0cnVlICsgIikgaW4gc2NvcGUgIiArIGNvbnRleHRzWzBdLmdldE5hbWUoKSArICI6IiArIGNvbnRleHRzWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkICAKLQkJCX0KLQkJCWNvbnRleHRzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucmVtb3ZlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QRVJfUFJPSkVDVCk7Ci0JCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHJlbW92aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfQ09OVEVOVFRZUEVTX0lHTk9SRUQgKyAiICgiICsgdHJ1ZSArICIpIGluIHNjb3BlICIgKyBjb250ZXh0c1swXS5nZXROYW1lKCkgKyAiOiIgKyBjb250ZXh0c1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAgCi0JCQl9Ci0JCQljb250ZXh0c1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnJlbW92ZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfQ09OVEVOVFRZUEVTX0lHTk9SRUQpOwotCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiByZW1vdmluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BSSU9SSVRJRVMgKyAiICgiICsgdHJ1ZSArICIpIGluIHNjb3BlICIgKyBjb250ZXh0c1swXS5nZXROYW1lKCkgKyAiOiIgKyBjb250ZXh0c1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAgCi0JCQl9Ci0JCQljb250ZXh0c1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnJlbW92ZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUFJJT1JJVElFUyk7Ci0JCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHJlbW92aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfVEFHUyArICIgKCIgKyB0cnVlICsgIikgaW4gc2NvcGUgIiArIGNvbnRleHRzWzBdLmdldE5hbWUoKSArICI6IiArIGNvbnRleHRzWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkICAKLQkJCX0KLQkJCWNvbnRleHRzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucmVtb3ZlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19UQUdTKTsKLQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgcmVtb3ZpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19FTkFCTEUgKyAiICgiICsgdHJ1ZSArICIpIGluIHNjb3BlICIgKyBjb250ZXh0c1swXS5nZXROYW1lKCkgKyAiOiIgKyBjb250ZXh0c1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAgCi0JCQl9Ci0JCQljb250ZXh0c1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnJlbW92ZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfRU5BQkxFKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWNvbnRleHRzW2ldLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkuZmx1c2goKTsKLQkJCX0KLQkJCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oInByb2JsZW0gc2F2aW5nIHByZWZlcmVuY2Ugc2V0dGluZ3MgdG8gc2NvcGUgIiArIGNvbnRleHRzW2ldLmdldE5hbWUoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXJldHVybiBvazsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBwcm9tcHRGb3JSZWRldGVjdElmTmVjZXNzYXJ5KCkgewotCQlpZiAoZGV0ZWN0aW9uUmVxdWVzdGVkID4gMCkgewotCQkJTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjIsIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKS5nZXRJbWFnZSgpLCBTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzIzLCBNZXNzYWdlRGlhbG9nLlFVRVNUSU9OLCBuZXcgU3RyaW5nW117U1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8yNCwgU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8yNSwgU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8yNn0sIDIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCWludCBidXR0b24gPSBkaWFsb2cub3BlbigpOwotCQkJaWYgKGJ1dHRvbiA9PSAwKSB7Ci0JCQkJSm9iIHJlZGV0ZWN0Sm9iID0gbmV3IEpvYihTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzI3KSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQkJaWYgKGdldFByb2plY3QoKSA9PSBudWxsKSB7Ci0JCQkJCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICI6IHJlc2Nhbm5pbmcgYWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJVGFza1NjYW5uaW5nU2NoZWR1bGVyLnJlZnJlc2goKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiByZXNjYW5uaW5nICIgKyBnZXRQcm9qZWN0KCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCVRhc2tTY2FubmluZ1NjaGVkdWxlci5yZWZyZXNoKGdldFByb2plY3QoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJfQotCQkJCX07Ci0JCQkJcmVkZXRlY3RKb2Iuc2NoZWR1bGUoNTAwKTsKLQkJCX0KLQkJCWRldGVjdGlvblJlcXVlc3RlZCA9IDA7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlcXVlc3RSZWRldGVjdGlvbigpIHsKLQkJZGV0ZWN0aW9uUmVxdWVzdGVkKys7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmUoKSB7Ci0JCWlmIChmRW5hYmxlVGFza1RhZ3MgIT0gZk9yaWdpbmFsRW5hYmxlVGFza1RhZ3MpIHsKLQkJCXJlcXVlc3RSZWRldGVjdGlvbigpOwotCQl9Ci0JCWZPcmlnaW5hbEVuYWJsZVRhc2tUYWdzID0gZkVuYWJsZVRhc2tUYWdzOwotCi0JCUlTY29wZUNvbnRleHRbXSBwcmVmZXJlbmNlU2NvcGVzID0gY3JlYXRlUHJlZmVyZW5jZVNjb3BlcygpOwotCQlJRWNsaXBzZVByZWZlcmVuY2VzIGRlZmF1bHRQcmVmZXJlbmNlcyA9IHByZWZlcmVuY2VTY29wZXNbMV0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKTsKLQkJYm9vbGVhbiBkZWZhdWx0RW5hYmxlID0gZGVmYXVsdFByZWZlcmVuY2VzLmdldEJvb2xlYW4oVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0VOQUJMRSwgZmFsc2UpOwotCQlpZiAoZkVuYWJsZVRhc2tUYWdzID09IGRlZmF1bHRFbmFibGUpIHsKLQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgcmVtb3ZpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19FTkFCTEUgKyAiIGZyb20gc2NvcGUgIiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TmFtZSgpICsgIjoiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCXByZWZlcmVuY2VTY29wZXNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5yZW1vdmUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0VOQUJMRSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNldHRpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19FTkFCTEUgKyAiIFwiIiArIGZFbmFibGVUYXNrVGFncyArICJcIiBpbiBzY29wZSAiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROYW1lKCkgKyAiOiIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQl9Ci0JCQlwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucHV0Qm9vbGVhbihUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfRU5BQkxFLCBmRW5hYmxlVGFza1RhZ3MpOwotCQl9Ci0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCAmJiBpc0VsZW1lbnRTZXR0aW5nc0VuYWJsZWQoKSkgewotCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBzZXR0aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUEVSX1BST0pFQ1QgKyAiICgiICsgdHJ1ZSArICIpIGluIHNjb3BlICIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5hbWUoKSArICI6IiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgIAotCQkJfQotCQkJcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnB1dEJvb2xlYW4oVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BFUl9QUk9KRUNULCB0cnVlKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgcmVtb3ZpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QRVJfUFJPSkVDVCArICIgZnJvbSBzY29wZSAiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROYW1lKCkgKyAiOiIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQl9Ci0JCQlwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucmVtb3ZlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QRVJfUFJPSkVDVCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWZQcmVmZXJlbmNlc1NlcnZpY2UuZ2V0Um9vdE5vZGUoKS5mbHVzaCgpOwotCQl9Ci0JCWNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGl0LCB0aGVyZSBpcyBubyByZWNvdmVyeQotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9FZGl0b3JFeGVjdXRpb25Db250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvRWRpdG9yRXhlY3V0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWY2OWIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9FZGl0b3JFeGVjdXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5JRXhlY3V0aW9uRGVsZWdhdGU7Ci0KLQotCi1jbGFzcyBFZGl0b3JFeGVjdXRpb25Db250ZXh0IGltcGxlbWVudHMgSUV4ZWN1dGlvbkRlbGVnYXRlIHsKLQotCi0JU3RydWN0dXJlZFRleHRFZGl0b3IgZkVkaXRvcjsKLQotCXB1YmxpYyBFZGl0b3JFeGVjdXRpb25Db250ZXh0KFN0cnVjdHVyZWRUZXh0RWRpdG9yIGVkaXRvcikgewotCQlzdXBlcigpOwotCQlmRWRpdG9yID0gZWRpdG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklFeGVjdXRpb25EZWxlZ2F0ZSNleGVjdXRlKGphdmEubGFuZy5SdW5uYWJsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gd29ya2JlbmNoLmdldERpc3BsYXkoKTsKLQkJaWYgKGRpc3BsYXkuZ2V0VGhyZWFkKCkgPT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSkgewotCQkJLy8gaWYgYWxyZWFkeSBpbiBkaXNwbGF5IHRocmVhZCwgd2UgY2FuIHNpbXBseSBydW4sICJhcyB1c3VhbCIKLQkJCXJ1bm5hYmxlLnJ1bigpOwotCQl9IGVsc2UgewotCQkJLy8gdGhpcyBpcyB0aGUgcGFydCB0aGF0J3MgcmVhbGx5IG5ldywgdGhhdAotCQkJLy8gYWNjb21pZGF0ZSdzIGEgY2hhbmdlIGluIGEgZG9jdW1lbnQKLQkJCS8vIGZyb20gYmFja2dyb3VuZCB0aHJlYWQsIGJ5IGZvcmNpbmcgaXQgb24KLQkJCS8vIHRoZSBkaXNwbGF5IHRocmVhZC4KLQkJCWZpbmFsIFN0cnVjdHVyZWRUZXh0RWRpdG9yIGVkaXRvciA9IGZFZGl0b3I7Ci0JCQkvLyBpZiBub3QgaW4gZGlzcGxheSB0aHJlYWQsIHdlICJmb3JjZSIgdG8gcnVuIG9uIGRpc3BsYXkgdGhyZWFkLgotCQkJLy8gc2VlIGVkaXRvcnMgYmVnaW4vZW5kIGJhY2tncm91bmQgam9iIGZvciBvdGhlcgotCQkJLy8gYWN0aXZpdGllcyB0byBiZXN0IGFjY29taWRhdGUgKGZvciBleGFtcGxlLCB0aGVyZQotCQkJLy8gaXMgYSAidGltZWQgZGVsYXkiIGJlZm9yZSB0aGUgZWRpdG9yIGl0c2VsZiBsZWF2ZXMKLQkJCS8vIGJhY2tncm91bmQtdXBkYXRlIG1vZGUpLgotCQkJLy8gTk9URTogdGhpcyBleGVjdXRlIG1ldGhvZCBpdHNlbGYgaXMgYWx3YXlzIGNhbGxlZCBmcm9tCi0JCQkvLyBpbnNpZGUgb2YgYW4gSUxvY2sgYmxvY2ssIHNvIGFub3RoZXIKLQkJCS8vIGJsb2NrIGlzIG5vdCBub3QgbmVlZGVkIGhlcmUgZm9yIGFsbCB0aGVzZSBzeWNuRXhlYydzCi0JCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChkaXNwbGF5ICE9IG51bGwgJiYgIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQllZGl0b3IuYmVnaW5CYWNrZ3JvdW5kT3BlcmF0aW9uKCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIGhlcmUncyB3aGVyZSB0aGUgZG9jdW1lbnQgdXBkYXRlL21vZGlmaWNhdGlvbgotCQkJCQkJCS8vIG9jY3VycwotCQkJCQkJCXJ1bm5hYmxlLnJ1bigpOwotCi0JCQkJCQkJLy8gZm9yIGZ1dHVyZSwgcG9zc2libHkgZXhwbG9yZSBzb2x1dGlvbnMgc3VjaCBhcwotCQkJCQkJCS8vIHRoaXMKLQkJCQkJCQkvLwkJCQkJCQlJV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZSBqb2JTZXJ2aWNlID0KLQkJCQkJCQkvLyAoSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2UpCi0JCQkJCQkJLy8gZWRpdG9yLmdldEVkaXRvclBhcnQoKS5nZXRTaXRlKCkuZ2V0QWRhcHRlcihJV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZS5jbGFzcyk7Ci0JCQkJCQkJLy8JCQkJCQkJam9iU2VydmljZS5ydW5JblVJKHh4eHh4KQotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkvLyB0aGlzICdlbmQnIGlzIGp1c3QgYSBzaWduYWwgdG8gZWRpdG9yIHRoYXQgdGhpcwotCQkJCQkJCS8vIHBhcnRpY3VsYXIgdXBkYXRlIGlzIGRvbmUuIEl0cyB1cCB0byB0aGUgZWRpdG9yCi0JCQkJCQkJLy8gdG8gZGVjaWRlIGV4YWN0bHkgd2hlbiB0byBsZWF2ZSBpdHMgImJhY2tncm91bmQKLQkJCQkJCQkvLyBtb2RlIgotCQkJCQkJCWVkaXRvci5lbmRCYWNrZ3JvdW5kT3BlcmF0aW9uKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL0ZvbGRpbmdBY3Rpb25Hcm91cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL0ZvbGRpbmdBY3Rpb25Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTIxZDAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9Gb2xkaW5nQWN0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0T3BlcmF0aW9uVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5JUHJvamVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5JRm9sZGluZ0NvbW1hbmRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5SZXNvdXJjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRPcGVyYXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLklTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlcjsKLQotY2xhc3MgRm9sZGluZ0FjdGlvbkdyb3VwIGV4dGVuZHMgQWN0aW9uR3JvdXAgewotCXByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIFByZWZlcmVuY2VBY3Rpb24gZXh0ZW5kcyBSZXNvdXJjZUFjdGlvbiBpbXBsZW1lbnRzIElVcGRhdGUgewotCQlQcmVmZXJlbmNlQWN0aW9uKFJlc291cmNlQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIHByZWZpeCwgaW50IHN0eWxlKSB7Ci0JCQlzdXBlcihidW5kbGUsIHByZWZpeCwgc3R5bGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBQcm9qZWN0aW9uVmlld2VyIGZWaWV3ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIFByZWZlcmVuY2VBY3Rpb24gZlRvZ2dsZTsKLQlwcml2YXRlIGZpbmFsIFRleHRPcGVyYXRpb25BY3Rpb24gZkV4cGFuZEFsbDsKLQlwcml2YXRlIGZpbmFsIElQcm9qZWN0aW9uTGlzdGVuZXIgZlByb2plY3Rpb25MaXN0ZW5lcjsKLQlwcml2YXRlIGZpbmFsIFRleHRPcGVyYXRpb25BY3Rpb24gZkNvbGxhcHNlQWxsOwotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHByb2plY3Rpb24gYWN0aW9uIGdyb3VwIGZvciA8Y29kZT5lZGl0b3I8L2NvZGU+LiBJZgotCSAqIHRoZSBzdXBwbGllZCB2aWV3ZXIgaXMgbm90IGFuIGluc3RhbmNlIG9mIDxjb2RlPlByb2plY3Rpb25WaWV3ZXI8L2NvZGU+LAotCSAqIHRoZSBhY3Rpb24gZ3JvdXAgaXMgZGlzYWJsZWQuCi0JICogCi0JICogQHBhcmFtIGVkaXRvcgotCSAqICAgICAgICAgICAgdGhlIHRleHQgZWRpdG9yIHRvIG9wZXJhdGUgb24KLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdmlld2VyIG9mIHRoZSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgRm9sZGluZ0FjdGlvbkdyb3VwKGZpbmFsIElUZXh0RWRpdG9yIGVkaXRvciwgSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmICghKHZpZXdlciBpbnN0YW5jZW9mIFByb2plY3Rpb25WaWV3ZXIpKSB7Ci0JCQlmVG9nZ2xlID0gbnVsbDsKLQkJCWZFeHBhbmRBbGwgPSBudWxsOwotCQkJZkNvbGxhcHNlQWxsID0gbnVsbDsKLQkJCWZQcm9qZWN0aW9uTGlzdGVuZXIgPSBudWxsOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZlZpZXdlciA9IChQcm9qZWN0aW9uVmlld2VyKSB2aWV3ZXI7Ci0KLQkJZlByb2plY3Rpb25MaXN0ZW5lciA9IG5ldyBJUHJvamVjdGlvbkxpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBwcm9qZWN0aW9uRW5hYmxlZCgpIHsKLQkJCQl1cGRhdGUoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcHJvamVjdGlvbkRpc2FibGVkKCkgewotCQkJCXVwZGF0ZSgpOwotCQkJfQotCQl9OwotCi0JCWZWaWV3ZXIuYWRkUHJvamVjdGlvbkxpc3RlbmVyKGZQcm9qZWN0aW9uTGlzdGVuZXIpOwotCi0JCWZUb2dnbGUgPSBuZXcgUHJlZmVyZW5jZUFjdGlvbihTU0VVSU1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCksICJQcm9qZWN0aW9uX1RvZ2dsZV8iLCBJQWN0aW9uLkFTX0NIRUNLX0JPWCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCQlib29sZWFuIGN1cnJlbnQgPSBzdG9yZS5nZXRCb29sZWFuKElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlci5GT0xESU5HX0VOQUJMRUQpOwotCQkJCXN0b3JlLnNldFZhbHVlKElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlci5GT0xESU5HX0VOQUJMRUQsICFjdXJyZW50KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQkJCUlUZXh0T3BlcmF0aW9uVGFyZ2V0IHRhcmdldCA9IChJVGV4dE9wZXJhdGlvblRhcmdldCkgZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRPcGVyYXRpb25UYXJnZXQuY2xhc3MpOwotCi0JCQkJYm9vbGVhbiBpc0VuYWJsZWQgPSAodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0LmNhbkRvT3BlcmF0aW9uKFByb2plY3Rpb25WaWV3ZXIuVE9HR0xFKSk7Ci0JCQkJc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotCQkJfQotCQl9OwotCQkKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJYm9vbGVhbiBjaGVja2VkID0gc3RvcmUuZ2V0Qm9vbGVhbihJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIuRk9MRElOR19FTkFCTEVEKTsKLQkJZlRvZ2dsZS5zZXRDaGVja2VkKGNoZWNrZWQpOwotCQlmVG9nZ2xlLnNldEFjdGlvbkRlZmluaXRpb25JZChJRm9sZGluZ0NvbW1hbmRJZHMuRk9MRElOR19UT0dHTEUpOwotCQllZGl0b3Iuc2V0QWN0aW9uKCJGb2xkaW5nVG9nZ2xlIiwgZlRvZ2dsZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlmRXhwYW5kQWxsID0gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24oU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCAiUHJvamVjdGlvbl9FeHBhbmRBbGxfIiwgZWRpdG9yLCBQcm9qZWN0aW9uVmlld2VyLkVYUEFORF9BTEwsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWZFeHBhbmRBbGwuc2V0QWN0aW9uRGVmaW5pdGlvbklkKElGb2xkaW5nQ29tbWFuZElkcy5GT0xESU5HX0VYUEFORF9BTEwpOwotCQllZGl0b3Iuc2V0QWN0aW9uKCJGb2xkaW5nRXhwYW5kQWxsIiwgZkV4cGFuZEFsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQlmQ29sbGFwc2VBbGwgPSBuZXcgVGV4dE9wZXJhdGlvbkFjdGlvbihTU0VVSU1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCksICJQcm9qZWN0aW9uX0NvbGxhcHNlQWxsXyIsIGVkaXRvciwgUHJvamVjdGlvblZpZXdlci5DT0xMQVBTRV9BTEwsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWZDb2xsYXBzZUFsbC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSUZvbGRpbmdDb21tYW5kSWRzLkZPTERJTkdfQ09MTEFQU0VfQUxMKTsKLQkJZWRpdG9yLnNldEFjdGlvbigiRm9sZGluZ0NvbGxhcHNlQWxsIiwgZkNvbGxhcHNlQWxsKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdyb3VwIGlzIGVuYWJsZWQuCi0JICogCi0JICogPHByZT4KLQkgKiAgICAgICAgSW52YXJpYW50OiBpc0VuYWJsZWQoKSAmbHQ7PSZndDsgZlZpZXdlciBhbmQgYWxsIGFjdGlvbnMgYXJlICE9IG51bGwuCi0JICogPC9wcmU+Ci0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ3JvdXAgaXMgZW5hYmxlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGZWaWV3ZXIgIT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Hcm91cCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoaXNFbmFibGVkKCkpIHsKLQkJCWZWaWV3ZXIucmVtb3ZlUHJvamVjdGlvbkxpc3RlbmVyKGZQcm9qZWN0aW9uTGlzdGVuZXIpOwotCQkJZlZpZXdlciA9IG51bGw7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkgewotCQlpZiAoaXNFbmFibGVkKCkpIHsKLQkJCWZUb2dnbGUudXBkYXRlKCk7Ci0JCQlmVG9nZ2xlLnNldENoZWNrZWQoZlZpZXdlci5pc1Byb2plY3Rpb25Nb2RlKCkpOwotCQkJZkV4cGFuZEFsbC51cGRhdGUoKTsKLQkJCWZDb2xsYXBzZUFsbC51cGRhdGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbGxzIHRoZSBtZW51IHdpdGggYWxsIGZvbGRpbmcgYWN0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gbWFuYWdlcgotCSAqICAgICAgICAgICAgdGhlIG1lbnUgbWFuYWdlciBmb3IgdGhlIGZvbGRpbmcgc3VibWVudQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCWlmIChpc0VuYWJsZWQoKSkgewotCQkJdXBkYXRlKCk7Ci0JCQltYW5hZ2VyLmFkZChmVG9nZ2xlKTsKLQkJCW1hbmFnZXIuYWRkKGZFeHBhbmRBbGwpOwotCQkJbWFuYWdlci5hZGQoZkNvbGxhcHNlQWxsKTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkdyb3VwI3VwZGF0ZUFjdGlvbkJhcnMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUFjdGlvbkJhcnMoKSB7Ci0JCXVwZGF0ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkU291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkU291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI0ODZiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvU3RydWN0dXJlZFNvdXJjZVZpZXdlckRlY29yYXRpb25TdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uUGFpbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbkFjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JT3ZlcnZpZXdSdWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU2hhcmVkVGV4dENvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQW5ub3RhdGlvblByZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Tb3VyY2VWaWV3ZXJEZWNvcmF0aW9uU3VwcG9ydDsKLQotY2xhc3MgU3RydWN0dXJlZFNvdXJjZVZpZXdlckRlY29yYXRpb25TdXBwb3J0IGV4dGVuZHMgU291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQgewotCXB1YmxpYyBTdHJ1Y3R1cmVkU291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIElPdmVydmlld1J1bGVyIG92ZXJ2aWV3UnVsZXIsIElBbm5vdGF0aW9uQWNjZXNzIGFubm90YXRpb25BY2Nlc3MsIElTaGFyZWRUZXh0Q29sb3JzIHNoYXJlZFRleHRDb2xvcnMpIHsKLQkJc3VwZXIoc291cmNlVmlld2VyLCBvdmVydmlld1J1bGVyLCBhbm5vdGF0aW9uQWNjZXNzLCBzaGFyZWRUZXh0Q29sb3JzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvblBhaW50ZXIgY3JlYXRlQW5ub3RhdGlvblBhaW50ZXIoKSB7Ci0JCS8qCi0JCSAqIFRoZSBuZXcgc3F1aWdnbHkgZHJhd2VyIGRlcGVuZHMgb24gdGhlIHByZXNlbnRhdGlvbiByZWNvbmNpbGVyIHRvCi0JCSAqIGRyYXcgaXRzIHNxdWlnZ2xlcy4gVW5mb3J0dW5hdGVseSwgU3RydWN0dXJlZFRleHRFZGl0b3JzIGNhbm5vdCB1c2UKLQkJICogdGhlIHByZXNlbnRhdGlvbiByZWNvbmNpbGVyIGJlY2F1c2UgaXQgY29uZmxpY3RzIHdpdGggaXRzCi0JCSAqIGhpZ2hsaWdodGVyLiBPdmVycmlkaW5nIGNyZWF0ZUFubm90YXRpb25QYWludGVyIHNvIHRoYXQgaXQgaXMKLQkJICogZm9yY2VkIHRvIHVzZSB0aGUgb2xkIHNxdWlnZ2x5IHBhaW50ZXIgaW5zdGVhZCBvZiB0aGUgbmV3IG9uZS4gU2VlCi0JCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDE5MjgKLQkJICovCi0JCUFubm90YXRpb25QYWludGVyIHBhaW50ZXIgPSBzdXBlci5jcmVhdGVBbm5vdGF0aW9uUGFpbnRlcigpOwotCQkvLyBkb250IHVzZSBuZXcgc3F1aWdnbHkgcGFpbnRlcgotCQlwYWludGVyLmFkZFRleHRTdHlsZVN0cmF0ZWd5KEFubm90YXRpb25QcmVmZXJlbmNlLlNUWUxFX1NRVUlHR0xFUywgbnVsbCk7Ci0JCS8vIHVzZSBvbGQgb25lCi0JCXBhaW50ZXIuYWRkRHJhd2luZ1N0cmF0ZWd5KEFubm90YXRpb25QcmVmZXJlbmNlLlNUWUxFX1NRVUlHR0xFUywgbmV3IEFubm90YXRpb25QYWludGVyLlNxdWlnZ2xlc1N0cmF0ZWd5KCkpOwotCQkvLyBkb250IHVzZSBuZXcgcHJvYmxlbSB1bmRlcmxpbmUgcGFpbnRlcgotCQlwYWludGVyLmFkZFRleHRTdHlsZVN0cmF0ZWd5KEFubm90YXRpb25QcmVmZXJlbmNlLlNUWUxFX1BST0JMRU1fVU5ERVJMSU5FLCBudWxsKTsKLQkJLy8gdXNlIG9sZCBvbmUKLQkJcGFpbnRlci5hZGREcmF3aW5nU3RyYXRlZ3koQW5ub3RhdGlvblByZWZlcmVuY2UuU1RZTEVfUFJPQkxFTV9VTkRFUkxJTkUsIG5ldyBBbm5vdGF0aW9uUGFpbnRlci5TcXVpZ2dsZXNTdHJhdGVneSgpKTsKLQkJcmV0dXJuIHBhaW50ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL1N0cnVjdHVyZWRUZXh0RWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvU3RydWN0dXJlZFRleHRFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3ZjA2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvU3RydWN0dXJlZFRleHRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKLWltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uR3JvdXBNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVNlbGVjdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dE9wZXJhdGlvblRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyRXh0ZW5zaW9uMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyRXh0ZW5zaW9uNTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSW5mb3JtYXRpb25QcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5EZWZhdWx0Q2hhcmFjdGVyUGFpck1hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVZlcnRpY2FsUnVsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuTGluZUNoYW5nZUhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JUG9zdFNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0b3JhZ2VFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29udGV4dHMuSUNvbnRleHRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5EZWZhdWx0RW5jb2RpbmdTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5FZGl0b3JzVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklUZXh0RWRpdG9ySGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSUhhbmRsZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2hvd0luVGFyZ2V0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5VSUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkNoYWluZWRQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5EZWZhdWx0UmFuZ2VJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JQWJzdHJhY3RUZXh0RWRpdG9ySGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklTdGF0dXNGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Tb3VyY2VWaWV3ZXJEZWNvcmF0aW9uU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRPcGVyYXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuSUNvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbFN0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5JRXhlY3V0aW9uRGVsZWdhdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkRWRpdG9yRHJvcFRhcmdldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JRXh0ZW5kZWRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVBvcHVwTWVudUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuUmVhZE9ubHlBd2FyZURyb3BUYXJnZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RvcmFnZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkTGluZUNoYW5nZUhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Vbmtub3duQ29udGVudFR5cGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLkFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLlN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWcuQnJlYWtwb2ludFJ1bGVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWcuRWRpdEJyZWFrcG9pbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZWJ1Zy5NYW5hZ2VCcmVha3BvaW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWcuVG9nZ2xlQnJlYWtwb2ludEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlYnVnLlRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVyaXZlZC5IVE1MVGV4dFByZXNlbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JNb2RlbFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLlN0cnVjdHVyZWRNb2RlbERvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb24uQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmh5cGVybGluay5PcGVuSHlwZXJsaW5rQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRWRpdG9yUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5JU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkNvbmZpZ3VyYWJsZVByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvcGVydGllcy5TaG93UHJvcGVydGllc0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuQ29uZmlndXJhdGlvblBvaW50Q2FsY3VsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQuTnVsbFNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU2VsZWN0aW9uSGlzdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRleHQuRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBBIFRleHQgRWRpdG9yIGZvciBlZGl0aW5nIHN0cnVjdHVyZWQgbW9kZWxzIGFuZCBzdHJ1Y3R1cmVkIGRvY3VtZW50cy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgbWVhbnQgdG8gYmUgc3ViY2xhc3NlZC48YnIgLz4KLSAqIE5ldyBjb250ZW50IHR5cGVzIG1heSBhc3NvY2lhdGUgc291cmNlIHZpZXdlciwgY29udGVudCBvdXRsaW5lLCBhbmQKLSAqIHByb3BlcnR5IHNoZWV0IGNvbmZpZ3VyYXRpb25zIHRvIGV4dGVuZCB0aGUgZXhpc3RpbmcgZnVuY3Rpb25hbGl0eS4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLSAqIAotICogQHNpbmNlIDEuMAotICovCi0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBleHRlbmRzIFRleHRFZGl0b3IgewotCXByaXZhdGUgY2xhc3MgR290b01hdGNoaW5nQnJhY2tldEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgYXJnMCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQlnb3RvTWF0Y2hpbmdCcmFja2V0KCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvKiAKLQkgKiBUaGlzIGxpc3RlbmVyIHNlcnZlcyBhcyBhIGxhc3QgcmVzb3J0IGRvdWJsZS1jaGVjayB0byBtYWtlIHN1cmUgdG8gY2FsbCAKLQkgKiB2YWxpZGF0ZSBlZGl0IG9uIG5vbi1lZGl0b3IgZHJpdmVuIHVwZGF0ZXMgKGVkaXRzIGZyb20gb3RoZXIgcGFnZXMgaW4gYSAKLQkgKiBtdWx0aXBhZ2UgZWRpdG9yLCBwcm9wZXJ0aWVzIHZpZXcsIG91dGxpbmUgdmlldykgYW5kIGlmIHRoZSBub24tZWRpdG9yIAotCSAqIGRyaXZlbiB1cGRhdGUgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkLCB1bmRvIGl0LgotCSAqIAotCSAqIE5PVEU6IEJlc3QgcHJhY3RpY2UgdGhvdWdoIHNob3VsZCBiZSBmb3IgdGhlIG5vbi1lZGl0b3IgcGFydHMgdG8gY2FsbAotCSAqIHZhbGlkYXRlRWRpdCBmaXJzdCBiZWZvcmUgYXR0ZW1wdGluZyB0byBtb2RpZnkgdGhlIGRvY3VtZW50LgotCSAqLwotCWNsYXNzIEludGVybmFsRG9jdW1lbnRMaXN0ZW5lciBpbXBsZW1lbnRzIElEb2N1bWVudExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCWZEaXJ0eUJlZm9yZURvY3VtZW50RXZlbnQgPSBpc0RpcnR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJaWYgKGlzRWRpdG9ySW5wdXRSZWFkT25seSgpICYmICh2YWxpZGF0ZUVkaXRDb3VudCA9PSAwKSkgewotCQkJCWZpbmFsIGludCBvZmZzZXQgPSBldmVudC5nZXRPZmZzZXQoKSArIGV2ZW50LmdldExlbmd0aCgpOwotCQkJCWZpbmFsIElTdHJ1Y3R1cmVkTW9kZWwgaW50ZXJuYWxNb2RlbCA9IGdldEludGVybmFsTW9kZWwoKTsKLQkJCQlKb2IgdmFsaWRhdGVFZGl0Sm9iID0gbmV3IFVJSm9iKFNTRVVJTWVzc2FnZXMuX1VJX0ZpbGVfaXNfcmVhZF9vbmx5KSB7Ci0JCQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQkvLyBpdCdzIHBvc3NpYmxlIHRvIHRyaWdnZXIgYW5vdGhlciBkb2N1bWVudCBjaGFuZ2UKLQkJCQkJCS8vIHdoaWxlIHNhbml0eSBjaGVja2luZywgc28gbWFrZSBzdXJlIG5vdCB0byAKLQkJCQkJCS8vIHNhbml0eSBjaGVjayB3aGVuIGFscmVhZHkgc2FuaXR5IGNoZWNraW5nCi0JCQkJCQlpZiAoIWZFZGl0b3JEaXNwb3NlZCAmJiAodmFsaWRhdGVFZGl0Q291bnQgPT0gMCkpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQkrK3ZhbGlkYXRlRWRpdENvdW50OwotCQkJCQkJCQlib29sZWFuIHN0YXR1cyA9IHZhbGlkYXRlRWRpdG9ySW5wdXRTdGF0ZSgpOwotCQkJCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCQkJaWYgKGludGVybmFsTW9kZWwgIT0gbnVsbCkgewotCQkJCQkJCQkJCS8vIGNoYW5nZSBzaG91bGRudCBoYXZlIGJlZW4gbWFkZSwgc28gdW5kbyBpdAotCQkJCQkJCQkJCWludGVybmFsTW9kZWwuZ2V0VW5kb01hbmFnZXIoKS51bmRvKCk7Ci0JCQkJCQkJCQkJZ2V0U291cmNlVmlld2VyKCkuc2V0U2VsZWN0ZWRSYW5nZShvZmZzZXQsIDApOwotCQkJCQkJCQkJCWlmICghZkRpcnR5QmVmb3JlRG9jdW1lbnRFdmVudCkgewotCQkJCQkJCQkJCQkvLyByZXNldCBkaXJ0eSBzdGF0ZSBpZgotCQkJCQkJCQkJCQkvLyBtb2RlbCBub3QgZGlydHkgYmVmb3JlCi0JCQkJCQkJCQkJCS8vIGRvY3VtZW50IGV2ZW50Ci0JCQkJCQkJCQkJCWludGVybmFsTW9kZWwuc2V0RGlydHlTdGF0ZShmYWxzZSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQktLXZhbGlkYXRlRWRpdENvdW50OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCS8qCi0JCQkJICogV2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGlzIGlzIHJ1biB2aWEgJ2FzeW5jRXhlYycgc2luY2UKLQkJCQkgKiB0aGVzZSBub3RpZmljYXRpb25zIGNhbiBjb21lIGZyb20gYSBub24tdWkgdGhyZWFkLgotCQkJCSAqIAotCQkJCSAqIFRoZSBub24tdWkgdGhyZWFkIGNhbGwgd291bGQgb2NjdXIgd2hlbiBjcmVhdGluZyBhIG5ldyBmaWxlCi0JCQkJICogdW5kZXIgQ2xlYXJDYXNlIChvciBvdGhlciBsaWJyYXJ5KSBjb250cm9sLiBUaGUgY3JlYXRpb24gb2YKLQkJCQkgKiB0aGUgbmV3IGZpbGUgd291bGQgdHJpZ2dlciBhIHZhbGlkYXRlRWRpdCBjYWxsLCBvbiBhbm90aGVyCi0JCQkJICogdGhyZWFkLCB0aGF0IHdvdWxkIHByb21wdCB0aGUgdXNlciB0byBhZGQgdGhlIG5ldyBmaWxlIHRvCi0JCQkJICogdmVyc2lvbiBjb250cm9sLgotCQkJCSAqLwotCQkJCXZhbGlkYXRlRWRpdEpvYi5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCQkJdmFsaWRhdGVFZGl0Sm9iLnNjaGVkdWxlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGltcGxlbWVudHMgSU1vZGVsU3RhdGVMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCQlpZiAoZ2V0VGV4dFZpZXdlcigpICE9IG51bGwpIHsKLQkJCQkvLyBnZXRUZXh0Vmlld2VyKCkuc2V0UmVkcmF3KGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkJaWYgKGdldFRleHRWaWV3ZXIoKSAhPSBudWxsKSB7Ci0JCQkJLy8gZ2V0VGV4dFZpZXdlcigpLnNldFJlZHJhdyhmYWxzZSk7Ci0JCQkJZ2V0VGV4dFZpZXdlcigpLnVuY29uZmlndXJlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RlbENoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkJaWYgKGdldFRleHRWaWV3ZXIoKSAhPSBudWxsKSB7Ci0JCQkJLy8gZ2V0VGV4dFZpZXdlcigpLnNldFJlZHJhdyh0cnVlKTsKLQkJCQkvLyBTaW5jZSB0aGUgbW9kZWwgY2FuIGJlIGNoYW5nZWQgb24gYSBiYWNrZ3JvdW5kCi0JCQkJLy8gdGhyZWFkLCB3ZSB3aWxsIHVwZGF0ZSBtZW51cyBvbiBkaXNwbGF5IHRocmVhZCwKLQkJCQkvLyBpZiB3ZSBhcmUgbm90IGFscmVhZHkgb24gZGlzcGxheSB0aHJlYWQsCi0JCQkJLy8gYW5kIGlmIHRoZXJlIGlzIG5vdCBhbiB1cGRhdGUgYWxyZWFkeSBwZW5kaW5nLgotCQkJCS8vICh3ZSBjYW4gZ2V0IGxvdHMgb2YgJ21vZGVsQ2hhbmdlZCcgZXZlbnRzIGluIHJhcGlkCi0JCQkJLy8gc3VjY2Vzc2lvbiwgc28gb25seSBuZWVkIHRvIGRvIG9uZS4KLQkJCQlpZiAoIWZVcGRhdGVNZW51VGV4dFBlbmRpbmcpIHsKLQkJCQkJcnVuT25EaXNwbGF5VGhyZWFkSWZOZWVkZWRlZChuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJdXBkYXRlTWVudVRleHQoKTsKLQkJCQkJCQlmVXBkYXRlTWVudVRleHRQZW5kaW5nID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBib29sZWFuIGlzRGlydHkpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZ2V0U291cmNlVmlld2VyKCkgIT0gbnVsbCkgewotCQkJCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGNmZyA9IGdldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKTsKLQkJCQkJZ2V0U291cmNlVmlld2VyKCkuY29uZmlndXJlKGNmZyk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTExNjYKLQkJCQkvLyBpbnZlc3RpZ2F0ZSBlYWNoIGVycm9yIGNhc2UgcG9zdCBiZXRhCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigicHJvYmxlbSB0cnlpbmcgdG8gY29uZmlndXJlIGFmdGVyIG1vZGVsIGNoYW5nZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkvLyBzbyB3ZSBkb24ndCBmcmVlemUgd29ya2JlbmNoIChlZy4gZHVyaW5nIHBhZ2UgbGFuZ3VhZ2Ugb3IKLQkJCQkvLyBjb250ZW50IHR5cGUgY2hhbmdlKQotCQkJCSgoSVRleHRWaWV3ZXJFeHRlbnNpb24pIGdldFNvdXJjZVZpZXdlcigpKS5zZXRSZWRyYXcodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBOb3RlOiB0aGlzIG9uZSBzaG91bGQgcHJvYmFibHkgYmUgdXNlZCB0bwotCQkvLyBjb250cm9sIHZpZXdlcgotCQkvLyBpbnN0ZWFkIG9mIHZpZXdlciBoYXZpbmcgaXRzIG93biBsaXN0ZW5lcgotCQlwdWJsaWMgdm9pZCBtb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RlbFJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBvcmlnaW5hbG1vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG1vdmVkbW9kZWwpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCS8qKgotCQkgKiBUaGlzICdSdW5uYWJsZScgc2hvdWxkIGJlIHZlcnkgYnJpZWYsIGFuZCBzaG91bGQgbm90ICJjYWxsIG91dCIgdG8KLQkJICogb3RoZXIgY29kZSBlc3BlY2lhbGx5IGlmIGl0IGRlcGVuZHMgb24gdGhlIHN0YXRlIG9mIHRoZSBtb2RlbC4KLQkJICogCi0JCSAqIEBwYXJhbSByCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgcnVuT25EaXNwbGF5VGhyZWFkSWZOZWVkZWRlZChSdW5uYWJsZSByKSB7Ci0JCQkvLyBpZiB0aGVyZSBpcyBubyBEaXNwbGF5IGF0IGFsbCAodGhhdCBpcywgcnVubmluZyBoZWFkbGVzcyksCi0JCQkvLyBvciBpZiB3ZSBhcmUgYWxyZWFkeSBydW5uaW5nIG9uIHRoZSBkaXNwbGF5IHRocmVhZCwgdGhlbgotCQkJLy8gc2ltcGx5IGV4ZWN1dGUgdGhlIHJ1bm5hYmxlLgotCQkJaWYgKGdldERpc3BsYXkoKSA9PSBudWxsIHx8IChUaHJlYWQuY3VycmVudFRocmVhZCgpID09IGdldERpc3BsYXkoKS5nZXRUaHJlYWQoKSkpIHsKLQkJCQlyLnJ1bigpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gb3RoZXJ3aXNlIGZvcmNlIHRoZSBydW5uYWJsZSB0byBydW4gb24gdGhlIGRpc3BsYXkgdGhyZWFkLgotCQkJCWdldERpc3BsYXkoKS5hc3luY0V4ZWMocik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMaXN0ZW5zIHRvIGRvdWJsZS1jbGljayBhbmQgc2VsZWN0aW9uIGZyb20gdGhlIG91dGxpbmUgcGFnZQotCSAqLwotCXByaXZhdGUgY2xhc3MgT3V0bGluZVBhZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElEb3VibGVDbGlja0xpc3RlbmVyLCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm47Ci0KLQkJCWludCBzdGFydCA9IC0xOwotCQkJaW50IGxlbmd0aCA9IDA7Ci0JCQlpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCUlTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbiA9IGdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKGN1cnJlbnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQlPYmplY3QgY3VycmVudCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGN1cnJlbnRTZWxlY3Rpb24pLnRvQXJyYXkoKTsKLQkJCQkJT2JqZWN0IG5ld1NlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS50b0FycmF5KCk7Ci0JCQkJCWlmICghY3VycmVudC5lcXVhbHMobmV3U2VsZWN0aW9uKSkgewotCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCU9iamVjdCBvID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQkJc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG8pLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQkJbGVuZ3RoID0gKChJbmRleGVkUmVnaW9uKSBvKS5nZXRFbmRPZmZzZXQoKSAtIHN0YXJ0OwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAobyBpbnN0YW5jZW9mIElUZXh0UmVnaW9uKSB7Ci0JCQkJCQkJc3RhcnQgPSAoKElUZXh0UmVnaW9uKSBvKS5nZXRTdGFydCgpOwotCQkJCQkJCWxlbmd0aCA9ICgoSVRleHRSZWdpb24pIG8pLmdldEVuZCgpIC0gc3RhcnQ7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChvIGluc3RhbmNlb2YgSVJlZ2lvbikgewotCQkJCQkJCXN0YXJ0ID0gKChJVGV4dFJlZ2lvbikgbykuZ2V0U3RhcnQoKTsKLQkJCQkJCQlsZW5ndGggPSAoKElUZXh0UmVnaW9uKSBvKS5nZXRMZW5ndGgoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGV2ZW50LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCQlzdGFydCA9ICgoSVRleHRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRPZmZzZXQoKTsKLQkJCQlsZW5ndGggPSAoKElUZXh0U2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0TGVuZ3RoKCk7Ci0JCQl9Ci0JCQlpZiAoc3RhcnQgPiAtMSkgewotCQkJCWdldFNvdXJjZVZpZXdlcigpLnNldFJhbmdlSW5kaWNhdGlvbihzdGFydCwgbGVuZ3RoLCBmYWxzZSk7Ci0JCQkJc2VsZWN0QW5kUmV2ZWFsKHN0YXJ0LCBsZW5ndGgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCS8qCi0JCQkgKiBEbyBub3QgYWxsb3cgc2VsZWN0aW9uIGZyb20gb3RoZXIgcGFydHMgdG8gYWZmZWN0IHNlbGVjdGlvbiBpbgotCQkJICogdGhlIHRleHQgd2lkZ2V0IGlmIGl0IGhhcyBmb2N1cywgb3IgaWYgd2UncmUgc3RpbGwgZmlyaW5nIGEKLQkJCSAqIGNoYW5nZSBvZiBzZWxlY3Rpb24uIFNlbGVjdGlvbiBldmVudHMgImJvdW5jaW5nIiBvZmYgb2Ygb3RoZXIKLQkJCSAqIHBhcnRzIGFyZSBhbGwgdGhhdCB3ZSBjYW4gcmVjZWl2ZSBpZiB3ZSBoYXZlIGZvY3VzIChzaW5jZSB3ZQotCQkJICogZm9yd2FyZGVkIG91ciBzZWxlY3Rpb24gdG8gdGhlIHNlcnZpY2UganVzdCBhIG1vbWVudCBhZ28pLCBhbmQKLQkJCSAqIG9ubHkgdGhlIHVzZXIgc2hvdWxkIGFmZmVjdCBzZWxlY3Rpb24gaWYgd2UgaGF2ZSBmb2N1cy4KLQkJCSAqLwotCi0JCQkvKiBUaGUgaXNGaXJpbmdTZWxlY3Rpb24gY2hlY2sgb25seSB3b3JrcyBpZiBhIHNlbGVjdGlvbiBsaXN0ZW5lciAqLwotCQkJaWYgKGV2ZW50LmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSB8fCBmU3RydWN0dXJlZFNlbGVjdGlvblByb3ZpZGVyLmlzRmlyaW5nU2VsZWN0aW9uKCkpCi0JCQkJcmV0dXJuOwotCi0JCQlpZiAoZ2V0U291cmNlVmlld2VyKCkgIT0gbnVsbCAmJiBnZXRTb3VyY2VWaWV3ZXIoKS5nZXRUZXh0V2lkZ2V0KCkgIT0gbnVsbCAmJiAhZ2V0U291cmNlVmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpLmlzRGlzcG9zZWQoKSAmJiAhZ2V0U291cmNlVmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpLmlzRm9jdXNDb250cm9sKCkpIHsKLQkJCQlpbnQgc3RhcnQgPSAtMTsKLQkJCQlpbnQgbGVuZ3RoID0gMDsKLQkJCQlpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQlJU2VsZWN0aW9uIGN1cnJlbnQgPSBnZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoY3VycmVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJCQlPYmplY3RbXSBjdXJyZW50U2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgY3VycmVudCkudG9BcnJheSgpOwotCQkJCQkJT2JqZWN0W10gbmV3U2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLnRvQXJyYXkoKTsKLQkJCQkJCWlmICghQXJyYXlzLmVxdWFscyhjdXJyZW50U2VsZWN0aW9uLCBuZXdTZWxlY3Rpb24pKSB7Ci0JCQkJCQkJaWYgKG5ld1NlbGVjdGlvbi5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJCS8qCi0JCQkJCQkJCSAqIE5vIG9yZGVyaW5nIGlzIGd1YXJhbnRlZWQgZm9yIG11bHRpcGxlCi0JCQkJCQkJCSAqIHNlbGVjdGlvbgotCQkJCQkJCQkgKi8KLQkJCQkJCQkJT2JqZWN0IG8gPSBuZXdTZWxlY3Rpb25bMF07Ci0JCQkJCQkJCWlmIChvIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJCQkJc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG8pLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQkJCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBvKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCQkJCWlmIChuZXdTZWxlY3Rpb24ubGVuZ3RoID4gMSkgewotCQkJCQkJCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgbmV3U2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQkJCXN0YXJ0ID0gTWF0aC5taW4oc3RhcnQsICgoSW5kZXhlZFJlZ2lvbikgbmV3U2VsZWN0aW9uW2ldKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJCQkJCQkJZW5kID0gTWF0aC5tYXgoZW5kLCAoKEluZGV4ZWRSZWdpb24pIG5ld1NlbGVjdGlvbltpXSkuZ2V0RW5kT2Zmc2V0KCkpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlsZW5ndGggPSBlbmQgLSBzdGFydDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIGlmIChvIGluc3RhbmNlb2YgSVRleHRSZWdpb24pIHsKLQkJCQkJCQkJCXN0YXJ0ID0gKChJVGV4dFJlZ2lvbikgbykuZ2V0U3RhcnQoKTsKLQkJCQkJCQkJCWludCBlbmQgPSAoKElUZXh0UmVnaW9uKSBvKS5nZXRFbmQoKTsKLQkJCQkJCQkJCWlmIChuZXdTZWxlY3Rpb24ubGVuZ3RoID4gMSkgewotCQkJCQkJCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgbmV3U2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQkJCXN0YXJ0ID0gTWF0aC5taW4oc3RhcnQsICgoSVRleHRSZWdpb24pIG5ld1NlbGVjdGlvbltpXSkuZ2V0U3RhcnQoKSk7Ci0JCQkJCQkJCQkJCWVuZCA9IE1hdGgubWF4KGVuZCwgKChJVGV4dFJlZ2lvbikgbmV3U2VsZWN0aW9uW2ldKS5nZXRFbmQoKSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWxlbmd0aCA9IGVuZCAtIHN0YXJ0OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJUmVnaW9uKSB7Ci0JCQkJCQkJCQlzdGFydCA9ICgoSVJlZ2lvbikgbykuZ2V0T2Zmc2V0KCk7Ci0JCQkJCQkJCQlpbnQgZW5kID0gc3RhcnQgKyAoKElSZWdpb24pIG8pLmdldExlbmd0aCgpOwotCQkJCQkJCQkJaWYgKG5ld1NlbGVjdGlvbi5sZW5ndGggPiAxKSB7Ci0JCQkJCQkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBuZXdTZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCQkJc3RhcnQgPSBNYXRoLm1pbihzdGFydCwgKChJUmVnaW9uKSBuZXdTZWxlY3Rpb25baV0pLmdldE9mZnNldCgpKTsKLQkJCQkJCQkJCQkJZW5kID0gTWF0aC5tYXgoZW5kLCAoKElSZWdpb24pIG5ld1NlbGVjdGlvbltpXSkuZ2V0T2Zmc2V0KCkgKyAoKElSZWdpb24pIG5ld1NlbGVjdGlvbltpXSkuZ2V0TGVuZ3RoKCkpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlsZW5ndGggPSBlbmQgLSBzdGFydDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQkJCXN0YXJ0ID0gKChJVGV4dFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldE9mZnNldCgpOwotCQkJCX0KLQkJCQlpZiAoc3RhcnQgPiAtMSkgewotCQkJCQl1cGRhdGVSYW5nZUluZGljYXRpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlzZWxlY3RBbmRSZXZlYWwoc3RhcnQsIGxlbmd0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBTaG93SW5UYXJnZXRMaXN0QWRhcHRlciBpbXBsZW1lbnRzIElTaG93SW5UYXJnZXRMaXN0IHsKLQkJLyoqCi0JCSAqIEFycmF5IG9mIElEIFN0cmluZ3MgdGhhdCBkZWZpbmUgdGhlIGRlZmF1bHQgc2hvdyBpbiB0YXJnZXRzIGZvcgotCQkgKiB0aGlzIGVkaXRvci4KLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5JU2hvd0luVGFyZ2V0TGlzdCNnZXRTaG93SW5UYXJnZXRJZHMoKQotCQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBJRCBTdHJpbmdzIHRoYXQgZGVmaW5lIHRoZSBkZWZhdWx0IHNob3cgaW4KLQkJICogICAgICAgICB0YXJnZXRzIGZvciB0aGlzIGVkaXRvci4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmdbXSBnZXRTaG93SW5UYXJnZXRJZHMoKSB7Ci0JCQlyZXR1cm4gZlNob3dJblRhcmdldElkczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEEgcG9zdCBzZWxlY3Rpb24gcHJvdmlkZXIgdGhhdCB3cmFwcyB0aGUgcHJvdmlkZXIgaW1wbGVtZW50ZWQgaW4KLQkgKiBBYnN0cmFjdFRleHRFZGl0b3IgdG8gcHJvdmlkZSBhIFN0cnVjdHVyZWRUZXh0U2VsZWN0aW9uIHRvIHBvc3QKLQkgKiBzZWxlY3Rpb24gbGlzdGVuZXJzLiBMaXN0ZW5zIHRvIHNlbGVjdGlvbiBjaGFuZ2VzIGZyb20gdGhlIHNvdXJjZQotCSAqIHZpZXdlci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJUG9zdFNlbGVjdGlvblByb3ZpZGVyLCBJU2VsZWN0aW9uVmFsaWRhdG9yIHsKLQkJLyoqCi0JCSAqIEEgImh5YnJpZCIgdGV4dCBhbmQgc3RydWN0dXJlZCBzZWxlY3Rpb24gY2xhc3MuIENvbnZlcnRzIHRoZSBzb3VyY2UKLQkJICogdmlld2VyIHRleHQgc2VsZWN0aW9uIHRvIGEgZ2VuZXJpYyAiZ2V0SW5kZXhlZFJlZ2lvbiItZGVyaXZlZAotCQkgKiBzdHJ1Y3R1cmVkIHNlbGVjdGlvbiwgYWxsb3dpbmcgc2VsZWN0aW9uIGNoYW5nZWQgbGlzdGVuZXJzIHRvCi0JCSAqIHBvc3NpYmx5IG5vdCBuZWVkIHRvIHJlZmVyZW5jZSB0aGUgbW9kZWwgZGlyZWN0bHkuCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFNlbGVjdGlvbiBleHRlbmRzIFRleHRTZWxlY3Rpb24gaW1wbGVtZW50cyBJU3RydWN0dXJlZFNlbGVjdGlvbiwgSVRleHRTZWxlY3Rpb24gewotCQkJcHJpdmF0ZSBSZWZlcmVuY2Ugc2VsZWN0ZWRTdHJ1Y3R1cmVkOwotCQkJcHJpdmF0ZSBJbnRlcm5hbFRleHRTZWxlY3Rpb24gZkludGVybmFsVGV4dFNlbGVjdGlvbjsKLQotCQkJU3RydWN0dXJlZFRleHRTZWxlY3Rpb24oSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uLCBJRG9jdW1lbnQgZG9jdW1lbnQsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJCQkvLyBub3RlOiB3ZSBkbyBub3QgY3VycmVudGx5IHVzZSBzdXBlciBjbGFzcyBhdCBhbGwsIGJ1dCwgb25seQotCQkJCS8vIHN1YmNsYXNzIFRleHRTZWxlY3Rpb24sCi0JCQkJLy8gYmVjYXVzZSBzb21lIGluZnJhc3RydWN0dXJlIGNvZGUgdXNlcyAiaW5zdGFuY2VvZgotCQkJCS8vIFRleHRTZWxlY3Rpb24iIGluc3RlYWQgb2YgSVRleHRTZWxlY3Rpb24uCi0JCQkJc3VwZXIoc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWZJbnRlcm5hbFRleHRTZWxlY3Rpb24gPSBuZXcgSW50ZXJuYWxUZXh0U2VsZWN0aW9uKGRvY3VtZW50LCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJc2VsZWN0ZWRTdHJ1Y3R1cmVkID0gbmV3IFNvZnRSZWZlcmVuY2UoaW5pdGlhbGl6ZUluZmVycmVkU2VsZWN0ZWRPYmplY3RzKHNlbGVjdGlvbiwgbW9kZWwpKTsKLQkJCX0KLQotCQkJU3RydWN0dXJlZFRleHRTZWxlY3Rpb24oSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uLCBPYmplY3RbXSBzZWxlY3RlZE9iamVjdHMsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQkJCXN1cGVyKHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCQlmSW50ZXJuYWxUZXh0U2VsZWN0aW9uID0gbmV3IEludGVybmFsVGV4dFNlbGVjdGlvbihkb2N1bWVudCwgc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCXNlbGVjdGVkU3RydWN0dXJlZCA9IG5ldyBTb2Z0UmVmZXJlbmNlKHNlbGVjdGVkT2JqZWN0cyk7Ci0JCQl9Ci0KLQkJCVN0cnVjdHVyZWRUZXh0U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgT2JqZWN0W10gc2VsZWN0ZWRPYmplY3RzKSB7Ci0JCQkJc3VwZXIob2Zmc2V0LCBsZW5ndGgpOwotCQkJCWZJbnRlcm5hbFRleHRTZWxlY3Rpb24gPSBuZXcgSW50ZXJuYWxUZXh0U2VsZWN0aW9uKGRvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJc2VsZWN0ZWRTdHJ1Y3R1cmVkID0gbmV3IFNvZnRSZWZlcmVuY2Uoc2VsZWN0ZWRPYmplY3RzKTsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdCBnZXRGaXJzdEVsZW1lbnQoKSB7Ci0JCQkJT2JqZWN0W10gc2VsZWN0ZWRTdHJ1Y3R1cmVzID0gZ2V0U2VsZWN0ZWRTdHJ1Y3R1cmVzKCk7Ci0JCQkJcmV0dXJuIHNlbGVjdGVkU3RydWN0dXJlcy5sZW5ndGggPiAwID8gc2VsZWN0ZWRTdHJ1Y3R1cmVzWzBdIDogbnVsbDsKLQkJCX0KLQotCQkJcHJpdmF0ZSBPYmplY3RbXSBnZXRTZWxlY3RlZFN0cnVjdHVyZXMoKSB7Ci0JCQkJT2JqZWN0W10gc2VsZWN0ZWRTdHJ1Y3R1cmVzID0gKE9iamVjdFtdKSBzZWxlY3RlZFN0cnVjdHVyZWQuZ2V0KCk7Ci0JCQkJaWYgKHNlbGVjdGVkU3RydWN0dXJlcyA9PSBudWxsKSB7Ci0JCQkJCXNlbGVjdGVkU3RydWN0dXJlcyA9IG5ldyBPYmplY3RbMF07Ci0JCQkJfQotCQkJCXJldHVybiBzZWxlY3RlZFN0cnVjdHVyZXM7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgT2JqZWN0W10gaW5pdGlhbGl6ZUluZmVycmVkU2VsZWN0ZWRPYmplY3RzKElUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkJCU9iamVjdFtdIGxvY2FsU2VsZWN0ZWRTdHJ1Y3R1cmVzID0gbnVsbDsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQlJbmRleGVkUmVnaW9uIHJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24oc2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQkJCQkJaW50IGVuZCA9IHNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHNlbGVjdGlvbi5nZXRMZW5ndGgoKTsKLQkJCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoZW5kIDw9IHJlZ2lvbi5nZXRFbmRPZmZzZXQoKSkgewotCQkJCQkJCS8vIHNpbmdsZSBzZWxlY3Rpb24KLQkJCQkJCQlsb2NhbFNlbGVjdGVkU3RydWN0dXJlcyA9IG5ldyBPYmplY3RbMV07Ci0JCQkJCQkJbG9jYWxTZWxlY3RlZFN0cnVjdHVyZXNbMF0gPSByZWdpb247Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBtdWx0aXBsZSBzZWxlY3Rpb24KLQkJCQkJCQlpbnQgbWF4TGVuZ3RoID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQkJTGlzdCBzdHJ1Y3R1cmVzID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJCQkJCQl3aGlsZSAocmVnaW9uICE9IG51bGwgJiYgcmVnaW9uLmdldEVuZE9mZnNldCgpIDw9IGVuZCAmJiByZWdpb24uZ2V0RW5kT2Zmc2V0KCkgPCBtYXhMZW5ndGgpIHsKLQkJCQkJCQkJc3RydWN0dXJlcy5hZGQocmVnaW9uKTsKLQkJCQkJCQkJcmVnaW9uID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihyZWdpb24uZ2V0RW5kT2Zmc2V0KCkgKyAxKTsKLQkJCQkJCQl9Ci0JCQkJCQkJbG9jYWxTZWxlY3RlZFN0cnVjdHVyZXMgPSBzdHJ1Y3R1cmVzLnRvQXJyYXkoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAobG9jYWxTZWxlY3RlZFN0cnVjdHVyZXMgPT0gbnVsbCkgewotCQkJCQlsb2NhbFNlbGVjdGVkU3RydWN0dXJlcyA9IG5ldyBPYmplY3RbMF07Ci0JCQkJfQotCQkJCXJldHVybiBsb2NhbFNlbGVjdGVkU3RydWN0dXJlczsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkxMzI3Ci0JCQkJcmV0dXJuIGZJbnRlcm5hbFRleHRTZWxlY3Rpb24uaXNFbXB0eSgpIHx8IGdldFNlbGVjdGVkU3RydWN0dXJlcygpLmxlbmd0aCA9PSAwOwotCQkJfQotCi0JCQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCQkJcmV0dXJuIHRvTGlzdCgpLml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U2VsZWN0ZWRTdHJ1Y3R1cmVzKCkubGVuZ3RoOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJCQlyZXR1cm4gZ2V0U2VsZWN0ZWRTdHJ1Y3R1cmVzKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBMaXN0IHRvTGlzdCgpIHsKLQkJCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChnZXRTZWxlY3RlZFN0cnVjdHVyZXMoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIGZJbnRlcm5hbFRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyAiOiIgKyBmSW50ZXJuYWxUZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpICsgIkAiICsgZ2V0U2VsZWN0ZWRTdHJ1Y3R1cmVzKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0KLQkJCXByaXZhdGUgc3RhdGljIGNsYXNzIEludGVybmFsVGV4dFNlbGVjdGlvbiBpbXBsZW1lbnRzIElUZXh0U2VsZWN0aW9uIHsKLQotCi0JCQkJcHJpdmF0ZSBTb2Z0UmVmZXJlbmNlIHdlYWtEb2N1bWVudDsKLQotCQkJCS8qKiBPZmZzZXQgb2YgdGhlIHNlbGVjdGlvbiAqLwotCQkJCXByaXZhdGUgaW50IGZPZmZzZXQ7Ci0JCQkJLyoqIExlbmd0aCBvZiB0aGUgc2VsZWN0aW9uICovCi0JCQkJcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQotCQkJCS8qKgotCQkJCSAqIENyZWF0ZXMgYSB0ZXh0IHNlbGVjdGlvbiBmb3IgdGhlIGdpdmVuIHJhbmdlLiBUaGlzCi0JCQkJICogc2VsZWN0aW9uIG9iamVjdCBkZXNjcmliZXMgZ2VuZXJpY2FsbHkgYSB0ZXh0IHJhbmdlIGFuZCBpcwotCQkJCSAqIGludGVuZGVkIHRvIGJlIGFuIGFyZ3VtZW50IGZvciB0aGUKLQkJCQkgKiA8Y29kZT5zZXRTZWxlY3Rpb248L2NvZGU+IG1ldGhvZCBvZiBzZWxlY3Rpb24gcHJvdmlkZXJzLgotCQkJCSAqIAotCQkJCSAqIEBwYXJhbSBvZmZzZXQKLQkJCQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIHJhbmdlCi0JCQkJICogQHBhcmFtIGxlbmd0aAotCQkJCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcmFuZ2UKLQkJCQkgKi8KLQkJCQlJbnRlcm5hbFRleHRTZWxlY3Rpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQkJCQl0aGlzKG51bGwsIG9mZnNldCwgbGVuZ3RoKTsKLQkJCQl9Ci0KLQkJCQkvKioKLQkJCQkgKiBDcmVhdGVzIGEgdGV4dCBzZWxlY3Rpb24gZm9yIHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgZ2l2ZW4KLQkJCQkgKiBkb2N1bWVudC4gVGhpcyBzZWxlY3Rpb24gb2JqZWN0IGlzIGNyZWF0ZWQgYnkgc2VsZWN0aW9uCi0JCQkJICogcHJvdmlkZXJzIGluIHJlc3BvbmRzIDxjb2RlPmdldFNlbGVjdGlvbjwvY29kZT4uCi0JCQkJICogCi0JCQkJICogQHBhcmFtIGRvY3VtZW50Ci0JCQkJICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgd2hvc2UgdGV4dCByYW5nZSBpcyBzZWxlY3RlZCBpbiBhCi0JCQkJICogICAgICAgICAgICB2aWV3ZXIKLQkJCQkgKiBAcGFyYW0gb2Zmc2V0Ci0JCQkJICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBzZWxlY3RlZCByYW5nZQotCQkJCSAqIEBwYXJhbSBsZW5ndGgKLQkJCQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHNlbGVjdGVkIHJhbmdlCi0JCQkJICovCi0JCQkJSW50ZXJuYWxUZXh0U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQkJCQl3ZWFrRG9jdW1lbnQgPSBuZXcgU29mdFJlZmVyZW5jZShkb2N1bWVudCk7Ci0JCQkJCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCQkJCWZMZW5ndGggPSBsZW5ndGg7Ci0JCQkJfQotCi0JCQkJLyoqCi0JCQkJICogCi0JCQkJICogUmV0dXJucyB0cnVlIGlmIHRoZSBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgc21hbGxlciB0aGFuIDAuIEEKLQkJCQkgKiBzZWxlY3Rpb24gb2YgbGVuZ3RoIDAsIGlzIGEgdmFsaWQgdGV4dCBzZWxlY3Rpb24gYXMgaXQKLQkJCQkgKiBkZXNjcmliZXMsIGUuZy4sIHRoZSBjdXJzb3IgcG9zaXRpb24gaW4gYSB2aWV3ZXIuCi0JCQkJICogCi0JCQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHNlbGVjdGlvbiBpcyBlbXB0eQotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uI2lzRW1wdHkoKQotCQkJCSAqLwotCQkJCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQkJCXJldHVybiBmT2Zmc2V0IDwgMCB8fCBmTGVuZ3RoIDwgMDsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbiNnZXRPZmZzZXQoKQotCQkJCSAqLwotCQkJCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQkJCQlyZXR1cm4gZk9mZnNldDsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbiNnZXRMZW5ndGgoKQotCQkJCSAqLwotCQkJCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJCQlyZXR1cm4gZkxlbmd0aDsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbiNnZXRTdGFydExpbmUoKQotCQkJCSAqLwotCQkJCXB1YmxpYyBpbnQgZ2V0U3RhcnRMaW5lKCkgewotCi0JCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IChJRG9jdW1lbnQpIHdlYWtEb2N1bWVudC5nZXQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChkb2N1bWVudCAhPSBudWxsKQotCQkJCQkJCXJldHVybiBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZk9mZnNldCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQkJfQotCi0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbiNnZXRFbmRMaW5lKCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgaW50IGdldEVuZExpbmUoKSB7Ci0JCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IChJRG9jdW1lbnQpIHdlYWtEb2N1bWVudC5nZXQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJaW50IGVuZE9mZnNldCA9IGZPZmZzZXQgKyBmTGVuZ3RoOwotCQkJCQkJCWlmIChmTGVuZ3RoICE9IDApCi0JCQkJCQkJCWVuZE9mZnNldC0tOwotCQkJCQkJCXJldHVybiBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZW5kT2Zmc2V0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uI2dldFRleHQoKQotCQkJCSAqLwotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJCQkJSURvY3VtZW50IGRvY3VtZW50ID0gKElEb2N1bWVudCkgd2Vha0RvY3VtZW50LmdldCgpOwotCQkJCQl0cnkgewotCQkJCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpCi0JCQkJCQkJcmV0dXJuIGRvY3VtZW50LmdldChmT2Zmc2V0LCBmTGVuZ3RoKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJLyoKLQkJCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKE9iamVjdCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJCQlpZiAob2JqID09IHRoaXMpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQotCQkJCQlpZiAob2JqID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQotCQkJCQlJbnRlcm5hbFRleHRTZWxlY3Rpb24gcyA9IChJbnRlcm5hbFRleHRTZWxlY3Rpb24pIG9iajsKLQkJCQkJYm9vbGVhbiBzYW1lUmFuZ2UgPSAocy5mT2Zmc2V0ID09IGZPZmZzZXQgJiYgcy5mTGVuZ3RoID09IGZMZW5ndGgpOwotCQkJCQlpZiAoc2FtZVJhbmdlKSB7Ci0KLQkJCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IChJRG9jdW1lbnQpIHdlYWtEb2N1bWVudC5nZXQoKTsKLQkJCQkJCUlEb2N1bWVudCBzRG9jdW1lbnQgPSBzLmdldERvY3VtZW50KCk7Ci0KLQkJCQkJCS8vIElTU1VFOiB3aHkgZG9lcyBub3QgSURvY3VtZW50IC5lcXVhbHMgc3VmZmljZT8KLQkJCQkJCWlmIChzRG9jdW1lbnQgPT0gbnVsbCAmJiBkb2N1bWVudCA9PSBudWxsKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJaWYgKHNEb2N1bWVudCA9PSBudWxsIHx8IGRvY3VtZW50ID09IG51bGwpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkJCQl0cnkgewotCQkJCQkJCS8vIElTU1VFOiBwcmljZXkhIChhIGNhY2hlZCBoYXNoIG1pZ2h0IGJlIGluCi0JCQkJCQkJLy8gb3JkZXIsIGlmIHRoaXMKLQkJCQkJCQkvLyB3YXMgZXZlciByZWFsbHkgZXZlciB1c2VkIHZlcnkgb2Z0ZW4uCi0JCQkJCQkJU3RyaW5nIHNDb250ZW50ID0gc0RvY3VtZW50LmdldChmT2Zmc2V0LCBmTGVuZ3RoKTsKLQkJCQkJCQlTdHJpbmcgY29udGVudCA9IGRvY3VtZW50LmdldChmT2Zmc2V0LCBmTGVuZ3RoKTsKLQkJCQkJCQlyZXR1cm4gc0NvbnRlbnQuZXF1YWxzKGNvbnRlbnQpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQkJCQkvLyByZXR1cm4gZmFsc2UsIGNhbiBub3QgYmUgZXF1YWwKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JCQkJICovCi0JCQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCQkJSURvY3VtZW50IGRvY3VtZW50ID0gKElEb2N1bWVudCkgd2Vha0RvY3VtZW50LmdldCgpOwotCQkJCQlpbnQgbG93ID0gZG9jdW1lbnQgIT0gbnVsbCA/IGRvY3VtZW50Lmhhc2hDb2RlKCkgOiAwOwotCQkJCQlyZXR1cm4gKGZPZmZzZXQgPDwgMjQpIHwgKGZMZW5ndGggPDwgMTYpIHwgbG93OwotCQkJCX0KLQotCQkJCXByaXZhdGUgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQkJCQlpZiAod2Vha0RvY3VtZW50ID09IG51bGwpCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJcmV0dXJuIChJRG9jdW1lbnQpIHdlYWtEb2N1bWVudC5nZXQoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQkJCXJldHVybiBmSW50ZXJuYWxUZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpOwotCQkJfQotCi0KLQkJCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJCXJldHVybiBmSW50ZXJuYWxUZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldFN0YXJ0TGluZSgpIHsKLQkJCQlyZXR1cm4gZkludGVybmFsVGV4dFNlbGVjdGlvbi5nZXRTdGFydExpbmUoKTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRFbmRMaW5lKCkgewotCQkJCXJldHVybiBmSW50ZXJuYWxUZXh0U2VsZWN0aW9uLmdldEVuZExpbmUoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQkJCXJldHVybiBmSW50ZXJuYWxUZXh0U2VsZWN0aW9uLmdldFRleHQoKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgU29mdFJlZmVyZW5jZSB3ZWFrRG9jdW1lbnQ7Ci0JCXByaXZhdGUgSVNlbGVjdGlvblByb3ZpZGVyIGZQYXJlbnRQcm92aWRlciA9IG51bGw7Ci0JCXByaXZhdGUgYm9vbGVhbiBpc0ZpcmluZ1NlbGVjdGlvbiA9IGZhbHNlOwotCQlwcml2YXRlIExpc3RlbmVyTGlzdCBsaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JCXByaXZhdGUgTGlzdGVuZXJMaXN0IHBvc3RMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JCXByaXZhdGUgSVNlbGVjdGlvbiBmTGFzdFNlbGVjdGlvbiA9IG51bGw7Ci0JCXByaXZhdGUgSVNlbGVjdGlvblByb3ZpZGVyIGZMYXN0U2VsZWN0aW9uUHJvdmlkZXIgPSBudWxsOwotCQlwcml2YXRlIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBmTGFzdFVwZGF0ZWRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBudWxsOwotCQlwcml2YXRlIFNvZnRSZWZlcmVuY2Ugd2Vha0VkaXRvcjsKLQotCi0JCVN0cnVjdHVyZWRTZWxlY3Rpb25Qcm92aWRlcihJU2VsZWN0aW9uUHJvdmlkZXIgcGFyZW50UHJvdmlkZXIsIFN0cnVjdHVyZWRUZXh0RWRpdG9yIHN0cnVjdHVyZWRUZXh0RWRpdG9yKSB7Ci0JCQlmUGFyZW50UHJvdmlkZXIgPSBwYXJlbnRQcm92aWRlcjsKLQkJCXdlYWtFZGl0b3IgPSBuZXcgU29mdFJlZmVyZW5jZShzdHJ1Y3R1cmVkVGV4dEVkaXRvcik7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoc3RydWN0dXJlZFRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCXNldERvY3VtZW50KGRvY3VtZW50KTsKLQkJCX0KLQkJCWZQYXJlbnRQcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlpZiAoZlBhcmVudFByb3ZpZGVyIGluc3RhbmNlb2YgSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgewotCQkJCSgoSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgZlBhcmVudFByb3ZpZGVyKS5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJaGFuZGxlUG9zdFNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXBvc3RMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBmaXJlU2VsZWN0aW9uQ2hhbmdlZChmaW5hbCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQsIExpc3RlbmVyTGlzdCBsaXN0ZW5lckxpc3QpIHsKLQkJCU9iamVjdFtdIGxpc3RlbmVycyA9IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQkJCWlzRmlyaW5nU2VsZWN0aW9uID0gdHJ1ZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmluYWwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLQkJCQlTYWZlUnVubmVyLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlsLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCQlpc0ZpcmluZ1NlbGVjdGlvbiA9IGZhbHNlOwotCQl9Ci0KLQkJcHJpdmF0ZSBJU2VsZWN0aW9uUHJvdmlkZXIgZ2V0UGFyZW50UHJvdmlkZXIoKSB7Ci0JCQlyZXR1cm4gZlBhcmVudFByb3ZpZGVyOwotCQl9Ci0KLQkJcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQkJZkxhc3RTZWxlY3Rpb24gPSBudWxsOwotCQkJZkxhc3RTZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7Ci0JCQlmTGFzdFVwZGF0ZWRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBudWxsOwotCi0JCQkvKgotCQkJICogV2hlbiBhIGNsaWVudCBleHBsaWNpdGx5IGFza3MgZm9yIHNlbGVjdGlvbiwgcHJvdmlkZSB0aGUgaHlicmlkCi0JCQkgKiByZXN1bHQuCi0JCQkgKi8KLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0UGFyZW50UHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmICghKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCVN0cnVjdHVyZWRUZXh0RWRpdG9yIGxvY2FsRWRpdG9yID0gZ2V0U3RydWN0dXJlZFRleHRFZGl0b3IoKTsKLQkJCQlpZiAobG9jYWxFZGl0b3IgIT0gbnVsbCkgewotCQkJCQltb2RlbCA9IGxvY2FsRWRpdG9yLmdldE1vZGVsKCk7Ci0JCQkJCXNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFNlbGVjdGlvbigoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbiwgZ2V0RG9jdW1lbnQoKSwgbW9kZWwpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0U2VsZWN0aW9uKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uLCBnZXREb2N1bWVudCgpLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc2VsZWN0aW9uOwotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBnZXRTdHJ1Y3R1cmVkVGV4dEVkaXRvcigpIHsKLQkJCVN0cnVjdHVyZWRUZXh0RWRpdG9yIGVkaXRvciA9IG51bGw7Ci0JCQlpZiAod2Vha0VkaXRvciAhPSBudWxsKSB7Ci0JCQkJZWRpdG9yID0gKFN0cnVjdHVyZWRUZXh0RWRpdG9yKSB3ZWFrRWRpdG9yLmdldCgpOwotCQkJfQotCQkJcmV0dXJuIGVkaXRvcjsKLQkJfQotCi0JCXZvaWQgaGFuZGxlUG9zdFNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgdXBkYXRlZEV2ZW50ID0gbnVsbDsKLQkJCWlmIChmTGFzdFNlbGVjdGlvbiA9PSBldmVudC5nZXRTZWxlY3Rpb24oKSAmJiBmTGFzdFNlbGVjdGlvblByb3ZpZGVyID09IGV2ZW50LmdldFNlbGVjdGlvblByb3ZpZGVyKCkpIHsKLQkJCQl1cGRhdGVkRXZlbnQgPSBmTGFzdFVwZGF0ZWRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl1cGRhdGVkRXZlbnQgPSB1cGRhdGVFdmVudChldmVudCk7Ci0JCQl9Ci0JCQkvLyBvbmx5IHVwZGF0ZSB0aGUgcmFuZ2UgaW5kaWNhdG9yIG9uIHBvc3Qgc2VsZWN0aW9uCi0JCQlTdHJ1Y3R1cmVkVGV4dEVkaXRvciBsb2NhbEVkaXRvciA9IChTdHJ1Y3R1cmVkVGV4dEVkaXRvcikgd2Vha0VkaXRvci5nZXQoKTsKLQotCQkJaWYgKGxvY2FsRWRpdG9yICE9IG51bGwpIHsKLQkJCQlsb2NhbEVkaXRvci51cGRhdGVSYW5nZUluZGljYXRpb24odXBkYXRlZEV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQlmaXJlU2VsZWN0aW9uQ2hhbmdlZCh1cGRhdGVkRXZlbnQsIHBvc3RMaXN0ZW5lcnMpOwotCQkJfQotCQl9Ci0KLQkJdm9pZCBoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IHVwZGF0ZWRFdmVudCA9IGV2ZW50OwotCQkJaWYgKGZMYXN0U2VsZWN0aW9uICE9IGV2ZW50LmdldFNlbGVjdGlvbigpIHx8IGZMYXN0U2VsZWN0aW9uUHJvdmlkZXIgIT0gZXZlbnQuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSkgewotCQkJCWZMYXN0U2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJZkxhc3RTZWxlY3Rpb25Qcm92aWRlciA9IGV2ZW50LmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQkJZkxhc3RVcGRhdGVkU2VsZWN0aW9uQ2hhbmdlZEV2ZW50ID0gdXBkYXRlZEV2ZW50ID0gdXBkYXRlRXZlbnQoZXZlbnQpOwotCQkJfQotCQkJZmlyZVNlbGVjdGlvbkNoYW5nZWQodXBkYXRlZEV2ZW50LCBsaXN0ZW5lcnMpOwotCQl9Ci0KLQkJSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJCWlmICh3ZWFrRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCWRvY3VtZW50ID0gKElEb2N1bWVudCkgd2Vha0RvY3VtZW50LmdldCgpOwotCQkJfQotCQkJcmV0dXJuIGRvY3VtZW50OwotCQl9Ci0KLQotCQlib29sZWFuIGlzRmlyaW5nU2VsZWN0aW9uKCkgewotCQkJcmV0dXJuIGlzRmlyaW5nU2VsZWN0aW9uOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNWYWxpZChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJLy8gSVNTVUU6IGlzIG5vdCBjbGVhciBkZWZhdWx0IGJlaGF2aW9yIHNob3VsZCBiZSB0cnVlPwotCQkJLy8gQnV0IG5vdCBjbGVhciBpcyB0aGlzIGRlZmF1bHQgd291bGQgYXBwbHkgZm9yIG91ciBlZGl0b3IuCi0JCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCQkvLyBpZiBlZGl0b3IgaXMgImdvbmUiLCBjYW4gbm90IGJlIHZhbGlkCi0JCQlTdHJ1Y3R1cmVkVGV4dEVkaXRvciBlID0gZ2V0U3RydWN0dXJlZFRleHRFZGl0b3IoKTsKLQkJCWlmIChlID09IG51bGwgfHwgZS5mRWRpdG9yRGlzcG9zZWQpIHsKLQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCX0KLQkJCS8vIGVsc2UgZGVmZXIgdG8gcGFyZW50Ci0JCQllbHNlIGlmIChnZXRQYXJlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgSVNlbGVjdGlvblZhbGlkYXRvcikgewotCQkJCXJlc3VsdCA9ICgoSVNlbGVjdGlvblZhbGlkYXRvcikgZ2V0UGFyZW50UHJvdmlkZXIoKSkuaXNWYWxpZChzZWxlY3Rpb24pOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJcG9zdExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlpZiAoaXNGaXJpbmdTZWxlY3Rpb24oKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJZkxhc3RTZWxlY3Rpb24gPSBudWxsOwotCQkJZkxhc3RTZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7Ci0JCQlmTGFzdFVwZGF0ZWRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBudWxsOwotCi0JCQlJU2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSB1cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCWdldFBhcmVudFByb3ZpZGVyKCkuc2V0U2VsZWN0aW9uKHRleHRTZWxlY3Rpb24pOwotCQkJU3RydWN0dXJlZFRleHRFZGl0b3IgbG9jYWxFZGl0b3IgPSBnZXRTdHJ1Y3R1cmVkVGV4dEVkaXRvcigpOwotCQkJaWYgKGxvY2FsRWRpdG9yICE9IG51bGwpIHsKLQkJCQlsb2NhbEVkaXRvci51cGRhdGVSYW5nZUluZGljYXRpb24odGV4dFNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQ3JlYXRlIGEgY29ycmVzcG9uZGluZyBldmVudCB0aGF0IGNvbnRhaW5zIGEKLQkJICogU3RydWN0dXJlZFRleHRzZWxlY3Rpb24KLQkJICogCi0JCSAqIEBwYXJhbSBldmVudAotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIFNlbGVjdGlvbkNoYW5nZWRFdmVudCB1cGRhdGVFdmVudChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24gJiYgIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpIHsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCQkJU3RydWN0dXJlZFRleHRFZGl0b3IgbG9jYWxFZGl0b3IgPSBnZXRTdHJ1Y3R1cmVkVGV4dEVkaXRvcigpOwotCQkJCWlmIChsb2NhbEVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCXN0cnVjdHVyZWRNb2RlbCA9IGxvY2FsRWRpdG9yLmdldEludGVybmFsTW9kZWwoKTsKLQkJCQl9Ci0JCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0U2VsZWN0aW9uKChJVGV4dFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCksIGdldERvY3VtZW50KCksIHN0cnVjdHVyZWRNb2RlbCk7Ci0JCQl9Ci0JCQlTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgbmV3RXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KGV2ZW50LmdldFNlbGVjdGlvblByb3ZpZGVyKCksIHNlbGVjdGlvbik7Ci0JCQlyZXR1cm4gbmV3RXZlbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogQ3JlYXRlIGEgY29ycmVzcG9uZGluZyBTdHJ1Y3R1cmVkVGV4dHNlbGVjdGlvbgotCQkgKiAKLQkJICogQHBhcmFtIHNlbGVjdGlvbgotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIElTZWxlY3Rpb24gdXBkYXRlU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlJU2VsZWN0aW9uIHVwZGF0ZWQgPSBzZWxlY3Rpb247Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQlPYmplY3RbXSBzZWxlY3RlZE9iamVjdHMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvQXJyYXkoKTsKLQkJCQlpZiAoc2VsZWN0ZWRPYmplY3RzLmxlbmd0aCA+IDApIHsKLQkJCQkJaW50IHN0YXJ0ID0gLTE7Ci0JCQkJCWludCBsZW5ndGggPSAwOwotCi0JCQkJCS8vIG5vIG9yZGVyaW5nIGlzIGd1YXJhbnRlZWQgZm9yIG11bHRpcGxlIHNlbGVjdGlvbgotCQkJCQlPYmplY3QgbyA9IHNlbGVjdGVkT2JqZWN0c1swXTsKLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQlzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbykuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG8pLmdldEVuZE9mZnNldCgpOwotCQkJCQkJaWYgKHNlbGVjdGVkT2JqZWN0cy5sZW5ndGggPiAxKSB7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBzZWxlY3RlZE9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJc3RhcnQgPSBNYXRoLm1pbihzdGFydCwgKChJbmRleGVkUmVnaW9uKSBzZWxlY3RlZE9iamVjdHNbaV0pLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQkJCQllbmQgPSBNYXRoLm1heChlbmQsICgoSW5kZXhlZFJlZ2lvbikgc2VsZWN0ZWRPYmplY3RzW2ldKS5nZXRFbmRPZmZzZXQoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWxlbmd0aCA9IGVuZCAtIHN0YXJ0OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbikgewotCQkJCQkJc3RhcnQgPSAoKElUZXh0UmVnaW9uKSBvKS5nZXRTdGFydCgpOwotCQkJCQkJaW50IGVuZCA9ICgoSVRleHRSZWdpb24pIG8pLmdldEVuZCgpOwotCQkJCQkJaWYgKHNlbGVjdGVkT2JqZWN0cy5sZW5ndGggPiAxKSB7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBzZWxlY3RlZE9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJc3RhcnQgPSBNYXRoLm1pbihzdGFydCwgKChJVGV4dFJlZ2lvbikgc2VsZWN0ZWRPYmplY3RzW2ldKS5nZXRTdGFydCgpKTsKLQkJCQkJCQkJZW5kID0gTWF0aC5tYXgoZW5kLCAoKElUZXh0UmVnaW9uKSBzZWxlY3RlZE9iamVjdHNbaV0pLmdldEVuZCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJbGVuZ3RoID0gZW5kIC0gc3RhcnQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAoc3RhcnQgPiAtMSkgewotCQkJCQkJdXBkYXRlZCA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFNlbGVjdGlvbihnZXREb2N1bWVudCgpLCBzdGFydCwgbGVuZ3RoLCBzZWxlY3RlZE9iamVjdHMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHVwZGF0ZWQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJCXdlYWtEb2N1bWVudCA9IG5ldyBTb2Z0UmVmZXJlbmNlKGRvY3VtZW50KTsKLQkJfQotCX0KLQotCWNsYXNzIFRpbWVPdXRFeHBpcmVkIGV4dGVuZHMgVGltZXJUYXNrIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXREaXNwbGF5KCkgIT0gbnVsbCAmJiAhZ2V0RGlzcGxheSgpLmlzRGlzcG9zZWQoKSkKLQkJCQkJCWVuZEJ1c3lTdGF0ZUludGVybmFsKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgY2xhc3MgQ29uZmlndXJhdGlvbkFuZFRhcmdldCB7Ci0JCXByaXZhdGUgU3RyaW5nIGZUYXJnZXRJZDsKLQkJcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gZkNvbmZpZ3VyYXRpb247Ci0KLQkJcHVibGljIENvbmZpZ3VyYXRpb25BbmRUYXJnZXQoU3RyaW5nIHRhcmdldElkLCBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCQlmVGFyZ2V0SWQgPSB0YXJnZXRJZDsKLQkJCWZDb25maWd1cmF0aW9uID0gY29uZmlnOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUYXJnZXRJZCgpIHsKLQkJCXJldHVybiBmVGFyZ2V0SWQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCQlyZXR1cm4gZkNvbmZpZ3VyYXRpb247Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgY2hhcltdIEJSQUNLRVRTID0geyd7JywgJ30nLCAnKCcsICcpJywgJ1snLCAnXSd9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBCVVNZX1NUQVRFX0RFTEFZID0gMTAwMDsKLQkvKioKLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPVCA9ICIuIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfQ09OVEVYVF9NRU5VX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IuRWRpdG9yQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0NPTlRFWFRfTUVOVV9TVUZGSVggPSAiLnNvdXJjZS5FZGl0b3JDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCS8qKiBOb24tTkxTIHN0cmluZ3MgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0tFWUJJTkRJTkdfU0NPUEVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE5vdCBBUEkuIE1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfTkFNRV9BRERJVElPTlMgPSAiYWRkaXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRE9fQUNUSU9OX0RFU0MgPSBTU0VVSU1lc3NhZ2VzLlJlZG9fX18wX19fVUlfOyAvLyROT04tTkxTLTEkID0gIlJlZG86IHswfS4iCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRE9fQUNUSU9OX0RFU0NfREVGQVVMVCA9IFNTRVVJTWVzc2FnZXMuUmVkb19UZXh0X0NoYW5nZV9fVUlfOyAvLyROT04tTkxTLTEkID0gIlJlZG8gVGV4dCBDaGFuZ2UuIgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRURPX0FDVElPTl9URVhUID0gU1NFVUlNZXNzYWdlcy5fUmVkb19fMF9fX0N0cmxfWV9VSV87IC8vJE5PTi1OTFMtMSQgPSAiJlJlZG8gezB9IEBDdHJsK1kiCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRE9fQUNUSU9OX1RFWFRfREVGQVVMVCA9IFNTRVVJTWVzc2FnZXMuX1JlZG9fVGV4dF9DaGFuZ2VfX0N0cmxfWV9VSV87IC8vJE5PTi1OTFMtMSQgPSAiJlJlZG8gVGV4dCBDaGFuZ2UgQEN0cmwrWSIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVMRVJfQ09OVEVYVF9NRU5VX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IuUnVsZXJDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSVUxFUl9DT05URVhUX01FTlVfU1VGRklYID0gIi5zb3VyY2UuUnVsZXJDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFVOREVSU0NPUkUgPSAiXyI7IC8vJE5PTi1OTFMtMSQKLQkvKiogVHJhbnNsYXRhYmxlIHN0cmluZ3MgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ET19BQ1RJT05fREVTQyA9IFNTRVVJTWVzc2FnZXMuVW5kb19fXzBfX19VSV87IC8vJE5PTi1OTFMtMSQgPSAiVW5kbzogezB9LiIKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRPX0FDVElPTl9ERVNDX0RFRkFVTFQgPSBTU0VVSU1lc3NhZ2VzLlVuZG9fVGV4dF9DaGFuZ2VfX1VJXzsgLy8kTk9OLU5MUy0xJCA9ICJVbmRvIFRleHQgQ2hhbmdlLiIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ET19BQ1RJT05fVEVYVCA9IFNTRVVJTWVzc2FnZXMuX1VuZG9fXzBfX19DdHJsX1pfVUlfOyAvLyROT04tTkxTLTEkID0gIiZVbmRvIHswfSBAQ3RybCtaIgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRPX0FDVElPTl9URVhUX0RFRkFVTFQgPSBTU0VVSU1lc3NhZ2VzLl9VbmRvX1RleHRfQ2hhbmdlX19DdHJsX1pfVUlfOyAvLyROT04tTkxTLTEkID0gIiZVbmRvIFRleHQgQ2hhbmdlIEBDdHJsK1oiCi0JLy8gZGV2ZWxvcG1lbnQgdGltZS9kZWJ1ZyB2YXJpYWJsZXMgb25seQotCXByaXZhdGUgaW50IGFkYXB0ZXJSZXF1ZXN0czsKLQotCXByaXZhdGUgbG9uZyBhZGFwdGVyVGltZTsKLQlwcml2YXRlIGJvb2xlYW4gZkJhY2tncm91bmRKb2JFbmRlZDsKLQlwcml2YXRlIGJvb2xlYW4gZkJ1c3lTdGF0ZTsKLQlwcml2YXRlIFRpbWVyIGZCdXN5VGltZXI7Ci0JYm9vbGVhbiBmRGlydHlCZWZvcmVEb2N1bWVudEV2ZW50ID0gZmFsc2U7Ci0JaW50IHZhbGlkYXRlRWRpdENvdW50ID0gMDsKLQlwcml2YXRlIEV4dGVuZGVkRWRpdG9yRHJvcFRhcmdldEFkYXB0ZXIgZkRyb3BBZGFwdGVyOwotCXByaXZhdGUgRHJvcFRhcmdldCBmRHJvcFRhcmdldDsKLQlib29sZWFuIGZFZGl0b3JEaXNwb3NlZCA9IGZhbHNlOwotCXByaXZhdGUgSUVkaXRvclBhcnQgZkVkaXRvclBhcnQ7Ci0JcHJpdmF0ZSBJRG9jdW1lbnRMaXN0ZW5lciBmSW50ZXJuYWxEb2N1bWVudExpc3RlbmVyOwotCXByaXZhdGUgSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgZkludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyOwotCXByaXZhdGUgSUNvbnRlbnRPdXRsaW5lUGFnZSBmT3V0bGluZVBhZ2U7Ci0KLQlwcml2YXRlIE91dGxpbmVQYWdlTGlzdGVuZXIgZk91dGxpbmVQYWdlTGlzdGVuZXIgPSBudWxsOwotCS8qKiBUaGlzIGVkaXRvcidzIHByb2plY3Rpb24gbW9kZWwgdXBkYXRlciAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyIGZQcm9qZWN0aW9uTW9kZWxVcGRhdGVyOwotCS8qKiBUaGlzIGVkaXRvcidzIHByb2plY3Rpb24gc3VwcG9ydCAqLwotCXByaXZhdGUgUHJvamVjdGlvblN1cHBvcnQgZlByb2plY3Rpb25TdXBwb3J0OwotCXByaXZhdGUgSVByb3BlcnR5U2hlZXRQYWdlIGZQcm9wZXJ0eVNoZWV0UGFnZTsKLQlwcml2YXRlIFN0cmluZyBmUmVtZW1iZXJUaXRsZTsKLQkvKiogVGhlIHJ1bGVyIGNvbnRleHQgbWVudSB0byBiZSBkaXNwb3NlZC4gKi8KLQlwcml2YXRlIE1lbnUgZlJ1bGVyQ29udGV4dE1lbnU7Ci0JLyoqIFRoZSBydWxlciBjb250ZXh0IG1lbnUgbWFuYWdlciB0byBiZSBkaXNwb3NlZC4gKi8KLQlwcml2YXRlIE1lbnVNYW5hZ2VyIGZSdWxlckNvbnRleHRNZW51TWFuYWdlcjsKLQotCVN0cmluZ1tdIGZTaG93SW5UYXJnZXRJZHMgPSBuZXcgU3RyaW5nW117SVBhZ2VMYXlvdXQuSURfUkVTX05BVn07Ci0KLQlwcml2YXRlIElBY3Rpb24gZlNob3dQcm9wZXJ0aWVzQWN0aW9uID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZlN0cnVjdHVyZWRNb2RlbDsKLQlTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXIgZlN0cnVjdHVyZWRTZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7Ci0JLyoqIFRoZSB0ZXh0IGNvbnRleHQgbWVudSB0byBiZSBkaXNwb3NlZC4gKi8KLQlwcml2YXRlIE1lbnUgZlRleHRDb250ZXh0TWVudTsKLQkvKiogVGhlIHRleHQgY29udGV4dCBtZW51IG1hbmFnZXIgdG8gYmUgZGlzcG9zZWQuICovCi0JcHJpdmF0ZSBNZW51TWFuYWdlciBmVGV4dENvbnRleHRNZW51TWFuYWdlcjsKLQlwcml2YXRlIFN0cmluZyBmVmlld2VyQ29uZmlndXJhdGlvblRhcmdldElkOwotCS8qKiBUaGUgc2VsZWN0aW9uIGhpc3Rvcnkgb2YgdGhlIGVkaXRvciAqLwotCXByaXZhdGUgU2VsZWN0aW9uSGlzdG9yeSBmU2VsZWN0aW9uSGlzdG9yeTsKLQkvKiogVGhlIGluZm9ybWF0aW9uIHByZXNlbnRlci4gKi8KLQlwcml2YXRlIEluZm9ybWF0aW9uUHJlc2VudGVyIGZJbmZvcm1hdGlvblByZXNlbnRlcjsKLQlwcml2YXRlIGJvb2xlYW4gZlVwZGF0ZU1lbnVUZXh0UGVuZGluZzsKLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRDbG9zZSA9IGZhbHNlOwotCXByaXZhdGUgbG9uZyBzdGFydFBlcmZUaW1lOwotCXByaXZhdGUgYm9vbGVhbiBmaXNSZWxlYXNlZDsKLQkvKioKLQkgKiBUaGUgYWN0aW9uIGdyb3VwIGZvciBmb2xkaW5nLgotCSAqLwotCXByaXZhdGUgRm9sZGluZ0FjdGlvbkdyb3VwIGZGb2xkaW5nR3JvdXA7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGZTdGF0dXNMaW5lTGFiZWxQcm92aWRlcjsKLQotCXByaXZhdGUgYm9vbGVhbiBmU2VsZWN0aW9uQ2hhbmdlZEZyb21Hb3RvID0gZmFsc2U7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBTdHJ1Y3R1cmVkIFRleHQgRWRpdG9yLgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dEVkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZURvY3VtZW50UHJvdmlkZXIobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFib3V0VG9TYXZlTW9kZWwoKSB7Ci0JCWlmIChnZXRJbnRlcm5hbE1vZGVsKCkgIT0gbnVsbCkgewotCQkJZ2V0SW50ZXJuYWxNb2RlbCgpLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFic3RyYWN0VGV4dEVkaXRvckNvbnRleHRNZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9VTkRPKSk7Ci0JCW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9TQVZFKSk7Ci0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfQ09QWSkpOwotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX1BSSU5UKSk7Ci0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfRURJVCkpOwotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX0ZJTkQpKTsKLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkdST1VQX0FERCkpOwotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX1JFU1QpKTsKLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCi0JCWlmIChpc0VkaXRhYmxlKCkpIHsKLQkJCWFkZEFjdGlvbihtZW51LCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9VTkRPLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRPKTsKLQkJCWFkZEFjdGlvbihtZW51LCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9VTkRPLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5SRVZFUlRfVE9fU0FWRUQpOwotCQkJYWRkQWN0aW9uKG1lbnUsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX1NBVkUsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlNBVkUpOwotCQkJYWRkQWN0aW9uKG1lbnUsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX0NPUFksIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkNVVCk7Ci0JCQlhZGRBY3Rpb24obWVudSwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfQ09QWSwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQ09QWSk7Ci0JCQlhZGRBY3Rpb24obWVudSwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfQ09QWSwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUEFTVEUpOwotCQl9Ci0JCWVsc2UgewotCQkJYWRkQWN0aW9uKG1lbnUsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX0NPUFksIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkNPUFkpOwotCQl9Ci0KLQkJLy8gZnJvbSBBYnN0cmFjdERlY29yYXRlZFRleHRFZGl0b3IKLQkJSUFjdGlvbiBwcmVmZXJlbmNlc0FjdGlvbiA9IGdldEFjdGlvbihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5DT05URVhUX1BSRUZFUkVOQ0VTKTsKLQkJbWVudS5hcHBlbmRUb0dyb3VwKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBuZXcgU2VwYXJhdG9yKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX1NFVFRJTkdTKSk7Ci0JCW1lbnUuYXBwZW5kVG9Hcm91cChJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9TRVRUSU5HUywgcHJlZmVyZW5jZXNBY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRleHRNZW51QWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSkgewotCQkvLyBPbmx5IG9mZmVyIGFjdGlvbnMgdGhhdCBhZmZlY3QgdGhlIHRleHQgaWYgdGhlIHZpZXdlciBhbGxvd3MKLQkJLy8gbW9kaWZpY2F0aW9uIGFuZCBzdXBwb3J0cyBhbnkgb2YgdGhlc2Ugb3BlcmF0aW9ucwotLy8JCUlBY3Rpb24gZm9ybWF0QWxsID0gZ2V0QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9ET0NVTUVOVCk7Ci0vLwkJSUFjdGlvbiBmb3JtYXRTZWxlY3Rpb24gPSBnZXRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfRk9STUFUX0FDVElWRV9FTEVNRU5UUyk7Ci0vLwkJSUFjdGlvbiBjbGVhbnVwQWxsID0gZ2V0QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0NMRUFOVVBfRE9DVU1FTlQpOwotLy8JCWJvb2xlYW4gZW5hYmxlRm9ybWF0TWVudSA9IChmb3JtYXRBbGwgIT0gbnVsbCAmJiBmb3JtYXRBbGwuaXNFbmFibGVkKCkpIHx8IChmb3JtYXRTZWxlY3Rpb24gIT0gbnVsbCAmJiBmb3JtYXRTZWxlY3Rpb24uaXNFbmFibGVkKCkpIHx8IChjbGVhbnVwQWxsICE9IG51bGwgJiYgY2xlYW51cEFsbC5pc0VuYWJsZWQoKSk7Ci0vLwotLy8JCWlmIChnZXRTb3VyY2VWaWV3ZXIoKS5pc0VkaXRhYmxlKCkgJiYgZW5hYmxlRm9ybWF0TWVudSkgewotLy8JCQlhZGRBY3Rpb24obWVudSwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfRURJVCwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfRk9STUFUX0RPQ1VNRU5UKTsKLS8vCQkJYWRkQWN0aW9uKG1lbnUsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX0VESVQsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9BQ1RJVkVfRUxFTUVOVFMpOwotLy8JCQlhZGRBY3Rpb24obWVudSwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfRURJVCwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfQ0xFQU5VUF9ET0NVTUVOVCk7Ci0vLwkJfQotCi0JCS8vIFNvbWUgRGVzaWduIGVkaXRvcnMgKERURCkgcmVseSBvbiB0aGlzIHZpZXcgZm9yIHRoZWlyIG93biB1c2VzCi0JCW1lbnUuYXBwZW5kVG9Hcm91cChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkdST1VQX0FERCwgZlNob3dQcm9wZXJ0aWVzQWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRXh0ZW5kZWRDb250ZXh0TWVudUFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGMgPSBnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLQkJaWYgKGMgaW5zdGFuY2VvZiBJUG9wdXBNZW51Q29udHJpYnV0b3IpIHsKLQkJCSgoSVBvcHVwTWVudUNvbnRyaWJ1dG9yKSBjKS5jb250cmlidXRlVG9Qb3B1cE1lbnUobWVudSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlFeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBFeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIoKTsKLQkJCUlFeHRlbmRlZENvbnRyaWJ1dG9yIHBtYyA9IGJ1aWxkZXIucmVhZEFjdGlvbkV4dGVuc2lvbnMoZ2V0Q29uZmlndXJhdGlvblBvaW50cygpKTsKLQkJCWlmIChwbWMgIT0gbnVsbCkgewotCQkJCXBtYy5zZXRBY3RpdmVFZGl0b3IodGhpcyk7Ci0JCQkJcG1jLmNvbnRyaWJ1dGVUb1BvcHVwTWVudShtZW51KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEV4dGVuZGVkUnVsZXJDb250ZXh0TWVudUFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJLy8gbm9uZSBhdCB0aGlzIGxldmVsCi0JfQotCi0KLQotCS8qKgotCSAqIFN0YXJ0cyBiYWNrZ3JvdW5kIG1vZGUuCi0JICogPHA+Ci0JICogTm90IEFQSS4gTWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKiA8L3A+Ci0JICovCi0Jdm9pZCBiZWdpbkJhY2tncm91bmRPcGVyYXRpb24oKSB7Ci0JCWZCYWNrZ3JvdW5kSm9iRW5kZWQgPSBmYWxzZTsKLQkJLy8gaWYgYWxyZWFkeSBpbiBidXN5IHN0YXRlLCBubyBuZWVkIHRvIGRvIGFueXRoaW5nCi0JCS8vIGFuZCwgd2Ugb25seSBzdGFydCwgb3IgcmVzZXQsIHRoZSB0aW1lZCBidXN5Ci0JCS8vIHN0YXRlIHdoZW4gd2UgZ2V0IHRoZSAiZW5kQmFja2dyb3VuZE9wZXJhdGlvbiIgY2FsbC4KLQkJaWYgKCFpbkJ1c3lTdGF0ZSgpKSB7Ci0JCQliZWdpbkJ1c3lTdGF0ZUludGVybmFsKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYmVnaW5CdXN5U3RhdGVJbnRlcm5hbCgpIHsKLQotCQlmQnVzeVN0YXRlID0gdHJ1ZTsKLQkJc3RhcnRCdXN5VGltZXIoKTsKLQotCQlJU291cmNlVmlld2VyIHZpZXdlciA9IGdldFNvdXJjZVZpZXdlcigpOwotCQlpZiAodmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRWaWV3ZXIpIHsKLQkJCSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlcikuYmVnaW5CYWNrZ3JvdW5kVXBkYXRlKCk7Ci0KLQkJfQotCQlzaG93QnVzeSh0cnVlKTsKLQl9Ci0KLQkvLyBwcml2YXRlIHZvaWQgYWRkRmluZE9jY3VycmVuY2VzQWN0aW9uKFN0cmluZyBtYXRjaFR5cGUsIFN0cmluZwotCS8vIG1hdGNoVGV4dCwgSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkvLwotCS8vIEFic3RyYWN0RmluZE9jY3VycmVuY2VzQWN0aW9uIGFjdGlvbiA9IG5ldwotCS8vIEFic3RyYWN0RmluZE9jY3VycmVuY2VzQWN0aW9uKGdldEZpbGVJbkVkaXRvcigpLCBuZXcKLQkvLyBTZWFyY2hVSUNvbmZpZ3VyYXRpb24oKSwgKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGdldERvY3VtZW50KCksCi0JLy8gbWF0Y2hUeXBlLCBtYXRjaFRleHQsIGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkvLyBhY3Rpb24uc2V0VGV4dCgiT2NjdXJyZW5jZXMgb2YgXCIiICsgbWF0Y2hUZXh0ICsgIlwiIGluIEZpbGUiKTsKLQkvLyBtZW51LmFwcGVuZFRvR3JvdXAoSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfRURJVCwgYWN0aW9uKTsKLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3IjY2xvc2UoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZShmaW5hbCBib29sZWFuIHNhdmUpIHsKLQkJLyoKLQkJICogSW5zdGVhZCBvZiB1cyBjbG9zaW5nIGRpcmVjdGx5LCB3ZSBoYXZlIHRvIGNsb3NlIHdpdGggb3VyCi0JCSAqIGNvbnRhaW5pbmcgKG11bHRpcGFnZSkgZWRpdG9yLCBpZiBpdCBleGlzdHMuCi0JCSAqLwotCQlpZiAoZ2V0U2l0ZSgpID09IG51bGwpIHsKLQkJCS8vIGlmIHNpdGUgaGFzbid0IGJlZW4gc2V0IHlldCwgdGhlbiB3ZSdyZSBub3QKLQkJCS8vIGNvbXBsZXRlbHkgb3BlbgotCQkJLy8gc28gc2V0IGEgZmxhZyBub3QgdG8gb3BlbgotCQkJc2hvdWxkQ2xvc2UgPSB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGdldEVkaXRvclBhcnQoKSAhPSBudWxsKSB7Ci0JCQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpOwotCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKGdldEVkaXRvclBhcnQoKSwgc2F2ZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN1cGVyLmNsb3NlKHNhdmUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhY3RpdmF0ZUNvbnRleHRzKElDb250ZXh0U2VydmljZSBzZXJ2aWNlKSB7Ci0JCWlmKHNlcnZpY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCVN0cmluZ1tdIGRlZmluaXRpb25zID0gZ2V0RGVmaW5pdGlvbnMoZ2V0Q29uZmlndXJhdGlvblBvaW50cygpKTsKLQkJCi0JCWlmKGRlZmluaXRpb25zICE9IG51bGwpIHsKLQkJCVN0cmluZ1tdIGNvbnRleHRzID0gbnVsbDsKLQkJCWZvcihpbnQgaSA9IDA7IGkgPCBkZWZpbml0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWNvbnRleHRzID0gU3RyaW5nVXRpbHMudW5wYWNrKGRlZmluaXRpb25zW2ldKTsKLQkJCQlmb3IoaW50IGogPSAwOyBqIDwgY29udGV4dHMubGVuZ3RoOyBqKyspCi0JCQkJCXNlcnZpY2UuYWN0aXZhdGVDb250ZXh0KGNvbnRleHRzW2pdLnRyaW0oKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgU3RyaW5nW10gZ2V0RGVmaW5pdGlvbnMoU3RyaW5nW10gaWRzKSB7Ci0JCUV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIgYnVpbGRlciA9IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKTsKLQkJU3RyaW5nW10gZGVmaW5pdGlvbnMgPSBudWxsOwotCQkKLQkJLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBjb25maWd1cmF0aW9uIGlkcyB1bnRpbCBvbmUgaXMgZm91bmQgdGhhdCBoYXMKLQkJICogYW4gYWN0aXZlY29udGV4dHMgZGVmaW5pdGlvbgotCQkgKi8KLQkJZm9yKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotCQkJZGVmaW5pdGlvbnMgPSBidWlsZGVyLmdldERlZmluaXRpb25zKCJhY3RpdmVjb250ZXh0cyIsIGlkc1tpXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKGRlZmluaXRpb25zICE9IG51bGwgJiYgZGVmaW5pdGlvbnMubGVuZ3RoID4gMCkKLQkJCQlyZXR1cm4gZGVmaW5pdGlvbnM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvciNjb2xsZWN0Q29udGV4dE1lbnVQcmVmZXJlbmNlUGFnZXMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBjb2xsZWN0Q29udGV4dE1lbnVQcmVmZXJlbmNlUGFnZXMoKSB7Ci0JCUxpc3QgYWxsSWRzID0gbmV3IEFycmF5TGlzdCgwKTsKLQotCQkvLyBnZXQgY29udHJpYnV0ZWQgcHJlZmVyZW5jZSBwYWdlcwotCQlFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyIGJ1aWxkZXIgPSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCk7Ci0JCVN0cmluZ1tdIGNvbmZpZ3VyYXRpb25JZHMgPSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbklkcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gZGVmaW5pdGlvbnMgPSBidWlsZGVyLmdldERlZmluaXRpb25zKCJwcmVmZXJlbmNlcGFnZXMiLCBjb25maWd1cmF0aW9uSWRzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZWZpbml0aW9ucy5sZW5ndGg7IGorKykgewotCQkJCVN0cmluZyBzb21lSWRzID0gZGVmaW5pdGlvbnNbal07Ci0JCQkJaWYgKHNvbWVJZHMgIT0gbnVsbCAmJiBzb21lSWRzLmxlbmd0aCgpID4gMCkgewotCQkJCQkvLyBzdXBwb3J0cyBtdWx0aXBsZSBjb21tYS1kZWxpbWl0ZWQgcGFnZSBJRHMgaW4gb25lCi0JCQkJCS8vIGVsZW1lbnQKLQkJCQkJU3RyaW5nW10gaWRzID0gU3RyaW5nVXRpbHMudW5wYWNrKHNvbWVJZHMpOwotCQkJCQlmb3IgKGludCBrID0gMDsgayA8IGlkcy5sZW5ndGg7IGsrKykgewotCQkJCQkJLy8gdHJpbSwganVzdCB0byBrZWVwIHRoaW5ncyBjbGVhbgotCQkJCQkJU3RyaW5nIGlkID0gaWRzW2tdLnRyaW0oKTsKLQkJCQkJCWlmICghYWxsSWRzLmNvbnRhaW5zKGlkKSkgewotCQkJCQkJCWFsbElkcy5hZGQoaWQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIHBhZ2VzIGNvbnRyaWJ1dGVkIGJ5IHN1cGVyCi0JCVN0cmluZ1tdIHN1cGVyUGFnZXMgPSBzdXBlci5jb2xsZWN0Q29udGV4dE1lbnVQcmVmZXJlbmNlUGFnZXMoKTsKLQkJZm9yIChpbnQgbSA9IDA7IG0gPCBzdXBlclBhZ2VzLmxlbmd0aDsgbSsrKSB7Ci0JCQkvLyB0cmltLCBqdXN0IHRvIGtlZXAgdGhpbmdzIGNsZWFuCi0JCQlTdHJpbmcgaWQgPSBzdXBlclBhZ2VzW21dLnRyaW0oKTsKLQkJCWlmICghYWxsSWRzLmNvbnRhaW5zKGlkKSkgewotCQkJCWFsbElkcy5hZGQoaWQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChTdHJpbmdbXSkgYWxsSWRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZSBhbmQgc2V0IGRvdWJsZS1jbGljayBhY3Rpb24gZm9yIHRoZSB2ZXJ0aWNhbCBydWxlcgotCSAqLwotCXByaXZhdGUgdm9pZCBjb21wdXRlQW5kU2V0RG91YmxlQ2xpY2tBY3Rpb24oKSB7Ci0JCS8qCi0JCSAqIE1ha2UgZG91YmxlLWNsaWNraW5nIG9uIHRoZSBydWxlciB0b2dnbGUgYSBicmVha3BvaW50IGluc3RlYWQgb2YKLQkJICogdG9nZ2xpbmcgYSBib29rbWFyay4gRm9yIGxpbmVzIHdoZXJlIGEgYnJlYWtwb2ludCB3b24ndCBiZSBjcmVhdGVkLAotCQkgKiBjcmVhdGUgYSBib29rbWFyayB0aHJvdWdoIHRoZSBjb250cmlidXRlZCBSdWxlckRvdWJsZUNsaWNrIGFjdGlvbi4KLQkJICovCi0JCXNldEFjdGlvbihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5SVUxFUl9ET1VCTEVfQ0xJQ0ssIG5ldyBUb2dnbGVCcmVha3BvaW50QWN0aW9uKHRoaXMsIGdldFZlcnRpY2FsUnVsZXIoKSwgZ2V0QWN0aW9uKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJVTEVSX0RPVUJMRV9DTElDSykpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuRXh0ZW5kZWRUZXh0RWRpdG9yI2NvbmZpZ3VyZVNvdXJjZVZpZXdlckRlY29yYXRpb25TdXBwb3J0KG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQoU291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQgc3VwcG9ydCkgewotCQlzdXBwb3J0LnNldENoYXJhY3RlclBhaXJNYXRjaGVyKGNyZWF0ZUNoYXJhY3RlclBhaXJNYXRjaGVyKCkpOwotCQlzdXBwb3J0LnNldE1hdGNoaW5nQ2hhcmFjdGVyUGFpbnRlclByZWZlcmVuY2VLZXlzKEVkaXRvclByZWZlcmVuY2VOYW1lcy5NQVRDSElOR19CUkFDS0VUUywgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLk1BVENISU5HX0JSQUNLRVRTX0NPTE9SKTsKLQotCQlzdXBlci5jb25maWd1cmVTb3VyY2VWaWV3ZXJEZWNvcmF0aW9uU3VwcG9ydChzdXBwb3J0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQlzdXBlci5jcmVhdGVBY3Rpb25zKCk7Ci0JCVJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0gU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQlJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJLy8gVGV4dFZpZXcgQWN0aW9uIC0gbW92aW5nIHRoZSBzZWxlY3RlZCB0ZXh0IHRvCi0JCS8vIHRoZSBjbGlwYm9hcmQKLQkJLy8gb3ZlcnJpZGUgdGhlIGN1dC9wYXN0ZS9kZWxldGUgYWN0aW9uIHRvIG1ha2UKLQkJLy8gdGhlbSBydW4gb24gcmVhZC1vbmx5Ci0JCS8vIGZpbGVzCi0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgVGV4dE9wZXJhdGlvbkFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgIkVkaXRvcl9DdXRfIiwgdGhpcywgSVRleHRPcGVyYXRpb25UYXJnZXQuQ1VULCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlhY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKElXb3JrYmVuY2hBY3Rpb25EZWZpbml0aW9uSWRzLkNVVCk7Ci0JCXNldEFjdGlvbihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5DVVQsIGFjdGlvbik7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChhY3Rpb24sIElBYnN0cmFjdFRleHRFZGl0b3JIZWxwQ29udGV4dElkcy5DVVRfQUNUSU9OKTsKLQkJLy8gVGV4dFZpZXcgQWN0aW9uIC0gaW5zZXJ0aW5nIHRoZSBjbGlwYm9hcmQKLQkJLy8gY29udGVudCBhdCB0aGUgY3VycmVudAotCQkvLyBwb3NpdGlvbgotCQkvLyBvdmVycmlkZSB0aGUgY3V0L3Bhc3RlL2RlbGV0ZSBhY3Rpb24gdG8gbWFrZQotCQkvLyB0aGVtIHJ1biBvbiByZWFkLW9ubHkKLQkJLy8gZmlsZXMKLQkJYWN0aW9uID0gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24ocmVzb3VyY2VCdW5kbGUsICJFZGl0b3JfUGFzdGVfIiwgdGhpcywgSVRleHRPcGVyYXRpb25UYXJnZXQuUEFTVEUsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHMuUEFTVEUpOwotCQlzZXRBY3Rpb24oSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUEFTVEUsIGFjdGlvbik7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChhY3Rpb24sIElBYnN0cmFjdFRleHRFZGl0b3JIZWxwQ29udGV4dElkcy5QQVNURV9BQ1RJT04pOwotCQkvLyBUZXh0VmlldyBBY3Rpb24gLSBkZWxldGluZyB0aGUgc2VsZWN0ZWQgdGV4dCBvcgotCQkvLyBpZiBzZWxlY3Rpb24gaXMKLQkJLy8gZW1wdHkgdGhlIGNoYXJhY3RlciBhdCB0aGUgcmlnaHQgb2YgdGhlIGN1cnJlbnQKLQkJLy8gcG9zaXRpb24KLQkJLy8gb3ZlcnJpZGUgdGhlIGN1dC9wYXN0ZS9kZWxldGUgYWN0aW9uIHRvIG1ha2UKLQkJLy8gdGhlbSBydW4gb24gcmVhZC1vbmx5Ci0JCS8vIGZpbGVzCi0JCWFjdGlvbiA9IG5ldyBUZXh0T3BlcmF0aW9uQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiRWRpdG9yX0RlbGV0ZV8iLCB0aGlzLCBJVGV4dE9wZXJhdGlvblRhcmdldC5ERUxFVEUsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHMuREVMRVRFKTsKLQkJc2V0QWN0aW9uKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkRFTEVURSwgYWN0aW9uKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKGFjdGlvbiwgSUFic3RyYWN0VGV4dEVkaXRvckhlbHBDb250ZXh0SWRzLkRFTEVURV9BQ1RJT04pOwotCQkvLyBTb3VyY2VWaWV3IEFjdGlvbiAtIHJlcXVlc3RpbmcgY29udGVudCBhc3Npc3QgdG8KLQkJLy8gc2hvdyBjb21wbGV0ZXRpb24KLQkJLy8gcHJvcG9zYWxzIGZvciB0aGUgY3VycmVudCBpbnNlcnQgcG9zaXRpb24KLQkJYWN0aW9uID0gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24ocmVzb3VyY2VCdW5kbGUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0NPTlRFTlRBU1NJU1RfUFJPUE9TQUxTICsgVU5ERVJTQ09SRSwgdGhpcywgSVNvdXJjZVZpZXdlci5DT05URU5UQVNTSVNUX1BST1BPU0FMUywgdHJ1ZSk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChhY3Rpb24sIElIZWxwQ29udGV4dElkcy5DT05UTU5VX0NPTlRFTlRBU1NJU1RfSEVMUElEKTsKLQkJYWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChJVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuQ09OVEVOVF9BU1NJU1RfUFJPUE9TQUxTKTsKLQkJc2V0QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0NPTlRFTlRBU1NJU1RfUFJPUE9TQUxTLCBhY3Rpb24pOwotCQltYXJrQXNTdGF0ZURlcGVuZGVudEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9DT05URU5UQVNTSVNUX1BST1BPU0FMUywgdHJ1ZSk7Ci0JCS8vIFNvdXJjZVZpZXcgQWN0aW9uIC0gcmVxdWVzdGluZyBjb250ZW50IGFzc2lzdCB0bwotCQkvLyBzaG93IHRoZSBjb250ZW50Ci0JCS8vIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCBpbnNlcnQgcG9zaXRpb24KLQkJYWN0aW9uID0gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24oU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9DT05URU5UQVNTSVNUX0NPTlRFWFRfSU5GT1JNQVRJT04gKyBVTkRFUlNDT1JFLCB0aGlzLCBJU291cmNlVmlld2VyLkNPTlRFTlRBU1NJU1RfQ09OVEVYVF9JTkZPUk1BVElPTik7Ci0JCWFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLkNPTlRFTlRfQVNTSVNUX0NPTlRFWFRfSU5GT1JNQVRJT04pOwotCQlzZXRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfQ09OVEVOVEFTU0lTVF9DT05URVhUX0lORk9STUFUSU9OLCBhY3Rpb24pOwotCQltYXJrQXNTdGF0ZURlcGVuZGVudEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9DT05URU5UQVNTSVNUX0NPTlRFWFRfSU5GT1JNQVRJT04sIHRydWUpOwotCQkvLyBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBBY3Rpb24gLSByZXF1ZXN0aW5nIGZvcm1hdAotCQkvLyBvZiB0aGUgd2hvbGUKLQkJLy8gZG9jdW1lbnQKLQkJYWN0aW9uID0gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24ocmVzb3VyY2VCdW5kbGUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9ET0NVTUVOVCArIFVOREVSU0NPUkUsIHRoaXMsIFN0cnVjdHVyZWRUZXh0Vmlld2VyLkZPUk1BVF9ET0NVTUVOVCk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChhY3Rpb24sIElIZWxwQ29udGV4dElkcy5DT05UTU5VX0ZPUk1BVF9ET0NfSEVMUElEKTsKLQkJYWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLkZPUk1BVF9ET0NVTUVOVCk7Ci0JCXNldEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9GT1JNQVRfRE9DVU1FTlQsIGFjdGlvbik7Ci0JCW1hcmtBc1N0YXRlRGVwZW5kZW50QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9ET0NVTUVOVCwgdHJ1ZSk7Ci0JCW1hcmtBc1NlbGVjdGlvbkRlcGVuZGVudEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9GT1JNQVRfRE9DVU1FTlQsIHRydWUpOwotCQkvLyBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBBY3Rpb24gLSByZXF1ZXN0aW5nIGZvcm1hdAotCQkvLyBvZiB0aGUgYWN0aXZlCi0JCS8vIGVsZW1lbnRzCi0JCWFjdGlvbiA9IG5ldyBUZXh0T3BlcmF0aW9uQWN0aW9uKHJlc291cmNlQnVuZGxlLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9GT1JNQVRfQUNUSVZFX0VMRU1FTlRTICsgVU5ERVJTQ09SRSwgdGhpcywgU3RydWN0dXJlZFRleHRWaWV3ZXIuRk9STUFUX0FDVElWRV9FTEVNRU5UUyk7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChhY3Rpb24sIElIZWxwQ29udGV4dElkcy5DT05UTU5VX0ZPUk1BVF9FTEVNRU5UU19IRUxQSUQpOwotCQlhY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKEFjdGlvbkRlZmluaXRpb25JZHMuRk9STUFUX0FDVElWRV9FTEVNRU5UUyk7Ci0JCXNldEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9GT1JNQVRfQUNUSVZFX0VMRU1FTlRTLCBhY3Rpb24pOwotCQltYXJrQXNTdGF0ZURlcGVuZGVudEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9GT1JNQVRfQUNUSVZFX0VMRU1FTlRTLCB0cnVlKTsKLQkJbWFya0FzU2VsZWN0aW9uRGVwZW5kZW50QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9BQ1RJVkVfRUxFTUVOVFMsIHRydWUpOwotCi0JCS8vIFN0cnVjdHVyZWRUZXh0RWRpdG9yIEFjdGlvbiAtIGFkZCBicmVha3BvaW50cyAoZmFsbGluZyBiYWNrIHRvIHRoZQotCQkvLyBjdXJyZW50IGRvdWJsZS1jbGljayBpZiB0aGV5IGNhbid0IGJlIGFkZGVkKQotCQlhY3Rpb24gPSBuZXcgVG9nZ2xlQnJlYWtwb2ludEFjdGlvbih0aGlzLCBnZXRWZXJ0aWNhbFJ1bGVyKCkpOwotCQlzZXRBY3Rpb24oQWN0aW9uRGVmaW5pdGlvbklkcy5UT0dHTEVfQlJFQUtQT0lOVFMsIGFjdGlvbik7Ci0JCS8vIFN0cnVjdHVyZWRUZXh0RWRpdG9yIEFjdGlvbiAtIG1hbmFnZSBicmVha3BvaW50cwotCQlhY3Rpb24gPSBuZXcgTWFuYWdlQnJlYWtwb2ludEFjdGlvbih0aGlzLCBnZXRWZXJ0aWNhbFJ1bGVyKCkpOwotCQlzZXRBY3Rpb24oQWN0aW9uRGVmaW5pdGlvbklkcy5NQU5BR0VfQlJFQUtQT0lOVFMsIGFjdGlvbik7Ci0JCS8vIFN0cnVjdHVyZWRUZXh0RWRpdG9yIEFjdGlvbiAtIGVkaXQgYnJlYWtwb2ludHMKLQkJYWN0aW9uID0gbmV3IEVkaXRCcmVha3BvaW50QWN0aW9uKHRoaXMsIGdldFZlcnRpY2FsUnVsZXIoKSk7Ci0JCXNldEFjdGlvbihBY3Rpb25EZWZpbml0aW9uSWRzLkVESVRfQlJFQUtQT0lOVFMsIGFjdGlvbik7Ci0JCS8vIFN0cnVjdHVyZWRUZXh0Vmlld2VyIEFjdGlvbiAtIG9wZW4gZmlsZSBvbiBzZWxlY3Rpb24KLQkJYWN0aW9uID0gbmV3IE9wZW5IeXBlcmxpbmtBY3Rpb24ocmVzb3VyY2VCdW5kbGUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX09QRU5fRklMRSArIFVOREVSU0NPUkUsIHRoaXMsIGdldFNvdXJjZVZpZXdlcigpKTsKLQkJYWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLk9QRU5fRklMRSk7Ci0JCXNldEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9PUEVOX0ZJTEUsIGFjdGlvbik7Ci0KLQkJY29tcHV0ZUFuZFNldERvdWJsZUNsaWNrQWN0aW9uKCk7Ci0JCQotCQlJSGFuZGxlciBoYW5kbGVyID0gbmV3IEdvdG9NYXRjaGluZ0JyYWNrZXRIYW5kbGVyKCk7Ci0gICAgSUhhbmRsZXJTZXJ2aWNlIGhhbmRsZXJTZXJ2aWNlID0gKElIYW5kbGVyU2VydmljZSkgZ2V0U2l0ZSgpLmdldFNlcnZpY2UoSUhhbmRsZXJTZXJ2aWNlLmNsYXNzKTsKLSAgICBpZiAoaGFuZGxlclNlcnZpY2UgIT0gbnVsbCkKLSAgICAgIGhhbmRsZXJTZXJ2aWNlLmFjdGl2YXRlSGFuZGxlcihBY3Rpb25EZWZpbml0aW9uSWRzLkdPVE9fTUFUQ0hJTkdfQlJBQ0tFVCwgaGFuZGxlcik7Ci0KLQkJZlNob3dQcm9wZXJ0aWVzQWN0aW9uID0gbmV3IFNob3dQcm9wZXJ0aWVzQWN0aW9uKCk7Ci0JCWZGb2xkaW5nR3JvdXAgPSBuZXcgRm9sZGluZ0FjdGlvbkdyb3VwKHRoaXMsIGdldFNvdXJjZVZpZXdlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGluZUNoYW5nZUhvdmVyIGNyZWF0ZUNoYW5nZUhvdmVyKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRMaW5lQ2hhbmdlSG92ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNoYXJhY3RlclBhaXJNYXRjaGVyIGNyZWF0ZUNoYXJhY3RlclBhaXJNYXRjaGVyKCkgewotCQlJQ2hhcmFjdGVyUGFpck1hdGNoZXIgbWF0Y2hlciA9IG51bGw7Ci0JCUV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIgYnVpbGRlciA9IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKTsKLQkJU3RyaW5nW10gaWRzID0gZ2V0Q29uZmlndXJhdGlvblBvaW50cygpOwotCQlmb3IgKGludCBpID0gMDsgbWF0Y2hlciA9PSBudWxsICYmIGkgPCBpZHMubGVuZ3RoOyBpKyspIHsKLQkJCW1hdGNoZXIgPSAoSUNoYXJhY3RlclBhaXJNYXRjaGVyKSBidWlsZGVyLmdldENvbmZpZ3VyYXRpb24oRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5JRCwgaWRzW2ldKTsKLQkJfQotCQlpZiAobWF0Y2hlciA9PSBudWxsKSB7Ci0JCQltYXRjaGVyID0gbmV3IERlZmF1bHRDaGFyYWN0ZXJQYWlyTWF0Y2hlcihuZXcgY2hhcltdeycoJywgJyknLCAneycsICd9JywgJ1snLCAnXScsICc8JywgJz4nfSk7Ci0JCX0KLQkJcmV0dXJuIG1hdGNoZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgcHJlZmVyZW5jZSBzdG9yZSB0aGF0IGNvbWJpbmVzIHRoZSBzb3VyY2UgZWRpdG9yIHByZWZlcmVuY2VzCi0JICogd2l0aCB0aGUgYmFzZSBlZGl0b3IncyBwcmVmZXJlbmNlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIElQcmVmZXJlbmNlU3RvcmUKLQkgKi8KLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgY3JlYXRlQ29tYmluZWRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3NlRWRpdG9yUHJlZnMgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgYmFzZUVkaXRvclByZWZzID0gRWRpdG9yc1VJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlyZXR1cm4gbmV3IENoYWluZWRQcmVmZXJlbmNlU3RvcmUobmV3IElQcmVmZXJlbmNlU3RvcmVbXXtzc2VFZGl0b3JQcmVmcywgYmFzZUVkaXRvclByZWZzfSk7Ci0JfQotCi0JcHJpdmF0ZSBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gY3JlYXRlQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKCkgewotCQlDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gY2ZnID0gbnVsbDsKLQkJRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlciBidWlsZGVyID0gRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBpZHMgPSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBjZmcgPT0gbnVsbCAmJiBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQljZmcgPSAoQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKSBidWlsZGVyLmdldENvbmZpZ3VyYXRpb24oRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5DT05URU5UT1VUTElORUNPTkZJR1VSQVRJT04sIGlkc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGNmZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNb2RlbERlcGVuZGVudEZpZWxkcygpIHsKLQkJLy8gbm9uZSBhdCB0aGlzIGxldmVsCi0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIDxwPgotCSAqIFVzZSBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gaWYgYSB2aWV3ZXJjb25maWd1cmF0aW9uIGhhcyBub3QKLQkgKiBhbHJlYWR5IGJlZW4gc2V0LiBBbHNvIGluaXRpYWxpemUgU3RydWN0dXJlZFRleHRWaWV3ZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdERlY29yYXRlZFRleHRFZGl0b3IjY3JlYXRlUGFydENvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJSUNvbnRleHRTZXJ2aWNlIGNvbnRleHRTZXJ2aWNlID0gKElDb250ZXh0U2VydmljZSkgZ2V0U2l0ZSgpLmdldFNlcnZpY2UoSUNvbnRleHRTZXJ2aWNlLmNsYXNzKTsKLQkJaWYgKGNvbnRleHRTZXJ2aWNlICE9IG51bGwpCi0JCSAgY29udGV4dFNlcnZpY2UuYWN0aXZhdGVDb250ZXh0KEVESVRPUl9LRVlCSU5ESU5HX1NDT1BFX0lEKTsKLQkJCi0JCWlmIChnZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkgPT0gbnVsbCkgewotCQkJQ29uZmlndXJhdGlvbkFuZFRhcmdldCBjYXQgPSBjcmVhdGVTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCk7Ci0JCQlmVmlld2VyQ29uZmlndXJhdGlvblRhcmdldElkID0gY2F0LmdldFRhcmdldElkKCk7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gbmV3Vmlld2VyQ29uZmlndXJhdGlvbiA9IGNhdC5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQlzZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKG5ld1ZpZXdlckNvbmZpZ3VyYXRpb24pOwotCQl9Ci0KLQkJc3VwZXIuY3JlYXRlUGFydENvbnRyb2wocGFyZW50KTsKLQotCQkvLyBpbnN0ZWFkIG9mIGNhbGxpbmcgc2V0SW5wdXQgdHdpY2UsIHVzZSBpbml0aWFsaXplU291cmNlVmlld2VyKCkgdG8KLQkJLy8gaGFuZGxlIHNvdXJjZSB2aWV3ZXIgaW5pdGlhbGl6YXRpb24gcHJldmlvdXNseSBoYW5kbGVkIGJ5IHNldElucHV0Ci0JCWluaXRpYWxpemVTb3VyY2VWaWV3ZXIoKTsKLQotCQkvLyB1cGRhdGUgZWRpdG9yIGNvbnRleHQgbWVudSwgdmVydGljYWwgcnVsZXIgY29udGV4dCBtZW51LCBpbmZvcG9wCi0JCWlmIChnZXRJbnRlcm5hbE1vZGVsKCkgIT0gbnVsbCkgewotCQkJdXBkYXRlRWRpdG9yQ29udHJvbHNGb3JDb250ZW50VHlwZShnZXRJbnRlcm5hbE1vZGVsKCkuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdXBkYXRlRWRpdG9yQ29udHJvbHNGb3JDb250ZW50VHlwZShudWxsKTsKLQkJfQotCi0JCS8vIHVzZWQgZm9yIFNob3cgVG9vbHRpcCBEZXNjcmlwdGlvbgotCQlJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvciBpbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yID0gbmV3IElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKCkgewotCQkJcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2wgY3JlYXRlSW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHNoZWxsKSB7Ci0JCQkJYm9vbGVhbiBjdXREb3duID0gZmFsc2U7Ci0JCQkJaW50IHN0eWxlID0gY3V0RG93biA/IFNXVC5OT05FIDogKFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCQkJcmV0dXJuIG5ldyBEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sKHNoZWxsLCBTV1QuUkVTSVpFIHwgU1dULlRPT0wsIHN0eWxlLCBuZXcgSFRNTFRleHRQcmVzZW50ZXIoY3V0RG93bikpOwotCQkJfQotCQl9OwotCi0JCWZJbmZvcm1hdGlvblByZXNlbnRlciA9IG5ldyBJbmZvcm1hdGlvblByZXNlbnRlcihpbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKTsKLQkJZkluZm9ybWF0aW9uUHJlc2VudGVyLnNldFNpemVDb25zdHJhaW50cyg2MCwgMTAsIHRydWUsIHRydWUpOwotCQlmSW5mb3JtYXRpb25QcmVzZW50ZXIuaW5zdGFsbChnZXRTb3VyY2VWaWV3ZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIGNyZWF0ZVByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uKCkgewotCQlQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiBjZmcgPSBudWxsOwotCQlFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyIGJ1aWxkZXIgPSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCk7Ci0JCVN0cmluZ1tdIGlkcyA9IGdldENvbmZpZ3VyYXRpb25Qb2ludHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGNmZyA9PSBudWxsICYmIGkgPCBpZHMubGVuZ3RoOyBpKyspIHsKLQkJCWNmZyA9IChQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbikgYnVpbGRlci5nZXRDb25maWd1cmF0aW9uKEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuUFJPUEVSVFlTSEVFVENPTkZJR1VSQVRJT04sIGlkc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGNmZzsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgU2hvdyBJbiBUYXJnZXQgSURzIGZyb20gdGhlIEV4dGVuZGVkIENvbmZpZ3VyYXRpb24gZXh0ZW5zaW9uCi0JICogcG9pbnQuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nW10gY3JlYXRlU2hvd0luVGFyZ2V0SWRzKCkgewotCQlMaXN0IGFsbElkcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCUV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIgYnVpbGRlciA9IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKTsKLQkJU3RyaW5nW10gY29uZmlndXJhdGlvbklkcyA9IGdldENvbmZpZ3VyYXRpb25Qb2ludHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmF0aW9uSWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmdbXSBkZWZpbml0aW9ucyA9IGJ1aWxkZXIuZ2V0RGVmaW5pdGlvbnMoInNob3dpbnRhcmdldCIsIGNvbmZpZ3VyYXRpb25JZHNbaV0pOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IGRlZmluaXRpb25zLmxlbmd0aDsgaisrKSB7Ci0JCQkJU3RyaW5nIHNvbWVJZHMgPSBkZWZpbml0aW9uc1tqXTsKLQkJCQlpZiAoc29tZUlkcyAhPSBudWxsICYmIHNvbWVJZHMubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCVN0cmluZ1tdIGlkcyA9IFN0cmluZ1V0aWxzLnVucGFjayhzb21lSWRzKTsKLQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBpZHMubGVuZ3RoOyBrKyspIHsKLQkJCQkJCS8vIHRyaW0sIGp1c3QgdG8ga2VlcCB0aGluZ3MgY2xlYW4KLQkJCQkJCVN0cmluZyBpZCA9IGlkc1trXS50cmltKCk7Ci0JCQkJCQlpZiAoIWFsbElkcy5jb250YWlucyhpZCkpIHsKLQkJCQkJCQlhbGxJZHMuYWRkKGlkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghYWxsSWRzLmNvbnRhaW5zKElQYWdlTGF5b3V0LklEX1JFU19OQVYpKSB7Ci0JCQlhbGxJZHMuYWRkKElQYWdlTGF5b3V0LklEX1JFU19OQVYpOwotCQl9Ci0JCWlmICghYWxsSWRzLmNvbnRhaW5zKElQYWdlTGF5b3V0LklEX09VVExJTkUpKSB7Ci0JCQlhbGxJZHMuYWRkKElQYWdlTGF5b3V0LklEX09VVExJTkUpOwotCQl9Ci0JCS8vIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuUHJvamVjdEV4cGxvcmVyLlZJRVdfSUQKLQkJU3RyaW5nIFBFX1ZJRVdfSUQgPSAib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLlByb2plY3RFeHBsb3JlciI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFhbGxJZHMuY29udGFpbnMoUEVfVklFV19JRCkpIHsKLQkJCWFsbElkcy5hZGQoUEVfVklFV19JRCk7Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmdbXSkgYWxsSWRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgY3JlYXRlU291cmNlRWRpdGluZ1RleHRUb29scygpIHsKLQkJSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgdG9vbHMgPSBudWxsOwotCQlFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyIGJ1aWxkZXIgPSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCk7Ci0JCVN0cmluZ1tdIGlkcyA9IGdldENvbmZpZ3VyYXRpb25Qb2ludHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IHRvb2xzID09IG51bGwgJiYgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotCQkJdG9vbHMgPSAoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMpIGJ1aWxkZXIuZ2V0Q29uZmlndXJhdGlvbihOdWxsU291cmNlRWRpdGluZ1RleHRUb29scy5JRCwgaWRzW2ldKTsKLQkJfQotCQlpZiAodG9vbHMgPT0gbnVsbCkgewotCQkJdG9vbHMgPSBOdWxsU291cmNlRWRpdGluZ1RleHRUb29scy5nZXRJbnN0YW5jZSgpOwotCQkJKChOdWxsU291cmNlRWRpdGluZ1RleHRUb29scykgdG9vbHMpLnNldFRleHRFZGl0b3IodGhpcyk7Ci0JCX0KLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCW1ldGhvZCA9IHRvb2xzLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJzZXRUZXh0RWRpdG9yIiwgbmV3IENsYXNzW117U3RydWN0dXJlZFRleHRFZGl0b3IuY2xhc3N9KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQl9Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQltZXRob2QgPSB0b29scy5nZXRDbGFzcygpLmdldE1ldGhvZCgic2V0VGV4dEVkaXRvciIsIG5ldyBDbGFzc1tde0lUZXh0RWRpdG9yLmNsYXNzfSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQltZXRob2QgPSB0b29scy5nZXRDbGFzcygpLmdldE1ldGhvZCgic2V0VGV4dEVkaXRvciIsIG5ldyBDbGFzc1tde0lFZGl0b3JQYXJ0LmNsYXNzfSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJaWYgKCFtZXRob2QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJbWV0aG9kLmludm9rZSh0b29scywgbmV3IE9iamVjdFtde3RoaXN9KTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIlByb2JsZW0gY3JlYXRpbmcgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgaW1wbGVtZW50YXRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRvb2xzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHNvdXJjZSB2aWV3ZXIgdG8gYmUgdXNlZCBieSB0aGlzIGVkaXRvcgotCSAqLwotCXByb3RlY3RlZCBJU291cmNlVmlld2VyIGNyZWF0ZVNvdXJjZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBJVmVydGljYWxSdWxlciB2ZXJ0aWNhbFJ1bGVyLCBpbnQgc3R5bGVzKSB7Ci0JCWZBbm5vdGF0aW9uQWNjZXNzID0gY3JlYXRlQW5ub3RhdGlvbkFjY2VzcygpOwotCQlmT3ZlcnZpZXdSdWxlciA9IGNyZWF0ZU92ZXJ2aWV3UnVsZXIoZ2V0U2hhcmVkQ29sb3JzKCkpOwotCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlciBzb3VyY2VWaWV3ZXIgPSBjcmVhdGVTdHJ1Y3RlZFRleHRWaWV3ZXIocGFyZW50LCB2ZXJ0aWNhbFJ1bGVyLCBzdHlsZXMpOwotCQlpbml0U291cmNlVmlld2VyKHNvdXJjZVZpZXdlcik7Ci0JCXJldHVybiBzb3VyY2VWaWV3ZXI7Ci0JfQotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uQW5kVGFyZ2V0IGNyZWF0ZVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCUNvbmZpZ3VyYXRpb25BbmRUYXJnZXQgY2F0ID0gbnVsbDsKLQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGNmZyA9IG51bGw7Ci0JCUV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIgYnVpbGRlciA9IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKTsKLQkJU3RyaW5nW10gaWRzID0gZ2V0Q29uZmlndXJhdGlvblBvaW50cygpOwotCQlmb3IgKGludCBpID0gMDsgY2ZnID09IG51bGwgJiYgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotCQkJY2ZnID0gKFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbikgYnVpbGRlci5nZXRDb25maWd1cmF0aW9uKEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuU09VUkNFVklFV0VSQ09ORklHVVJBVElPTiwgaWRzW2ldKTsKLQkJCWNhdCA9IG5ldyBDb25maWd1cmF0aW9uQW5kVGFyZ2V0KGlkc1tpXSwgY2ZnKTsKLQkJfQotCQlpZiAoY2ZnID09IG51bGwpIHsKLQkJCWNmZyA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24oKTsKLQkJCVN0cmluZyB0YXJnZXRpZCA9IGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQkJY2F0ID0gbmV3IENvbmZpZ3VyYXRpb25BbmRUYXJnZXQodGFyZ2V0aWQsIGNmZyk7Ci0JCX0KLQkJcmV0dXJuIGNhdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZFRleHRWaWV3ZXIgY3JlYXRlU3RydWN0ZWRUZXh0Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIElWZXJ0aWNhbFJ1bGVyIHZlcnRpY2FsUnVsZXIsIGludCBzdHlsZXMpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlcihwYXJlbnQsIHZlcnRpY2FsUnVsZXIsIGdldE92ZXJ2aWV3UnVsZXIoKSwgaXNPdmVydmlld1J1bGVyVmlzaWJsZSgpLCBzdHlsZXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVVuZG9SZWRvQWN0aW9ucygpIHsKLQkJLy8gb3ZlcnJpZGRlbiB0byBhZGQgaWNvbnMgdG8gYWN0aW9ucwotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExODc3Ci0JCXN1cGVyLmNyZWF0ZVVuZG9SZWRvQWN0aW9ucygpOwotCQlJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvbihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRPKTsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfVU5ETykpOwotCQl9Ci0KLQkJYWN0aW9uID0gZ2V0QWN0aW9uKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJFRE8pOwotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9SRURPKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUxvZ2dlci50cmFjZSgiU291cmNlIEVkaXRvciIsICJTdHJ1Y3R1cmVkVGV4dEVkaXRvcjo6ZGlzcG9zZSBlbnRyeSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnLnBlcmZUZXN0QWRhcHRlckNsYXNzTG9hZGluZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJUb3RhbCBjYWxscyB0byBnZXRBZGFwdGVyOiAiICsgYWRhcHRlclJlcXVlc3RzKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJUb3RhbCB0aW1lIGluIGdldEFkYXB0ZXI6ICIgKyBhZGFwdGVyVGltZSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQXZlcmFnZSB0aW1lIHBlciBjYWxsOiAiICsgKGFkYXB0ZXJUaW1lIC8gYWRhcHRlclJlcXVlc3RzKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIGRpc3Bvc2Ugb2YgaW5mb3JtYXRpb24gcHJlc2VudGVyCi0JCWlmIChmSW5mb3JtYXRpb25QcmVzZW50ZXIgIT0gbnVsbCkgewotCQkJZkluZm9ybWF0aW9uUHJlc2VudGVyLmRpc3Bvc2UoKTsKLQkJCWZJbmZvcm1hdGlvblByZXNlbnRlciA9IG51bGw7Ci0JCX0KLQotCQkvLyBkaXNwb3NlIG9mIHNlbGVjdGlvbiBoaXN0b3J5Ci0JCWlmIChmU2VsZWN0aW9uSGlzdG9yeSAhPSBudWxsKSB7Ci0JCQlmU2VsZWN0aW9uSGlzdG9yeS5kaXNwb3NlKCk7Ci0JCQlmU2VsZWN0aW9uSGlzdG9yeSA9IG51bGw7Ci0JCX0KLQotCQkvLyBkaXNwb3NlIG9mIGRvY3VtZW50IGZvbGRpbmcgc3VwcG9ydAotCQlpZiAoZlByb2plY3Rpb25Nb2RlbFVwZGF0ZXIgIT0gbnVsbCkgewotCQkJZlByb2plY3Rpb25Nb2RlbFVwZGF0ZXIudW5pbnN0YWxsKCk7Ci0JCQlmUHJvamVjdGlvbk1vZGVsVXBkYXRlciA9IG51bGw7Ci0JCX0KLQotCQlpZiAoZlByb2plY3Rpb25TdXBwb3J0ICE9IG51bGwpIHsKLQkJCWZQcm9qZWN0aW9uU3VwcG9ydC5kaXNwb3NlKCk7Ci0JCQlmUHJvamVjdGlvblN1cHBvcnQgPSBudWxsOwotCQl9Ci0KLQkJaWYgKGZGb2xkaW5nR3JvdXAgIT0gbnVsbCkgewotCQkJZkZvbGRpbmdHcm91cC5kaXNwb3NlKCk7Ci0JCQlmRm9sZGluZ0dyb3VwID0gbnVsbDsKLQkJfQotCi0JCS8vIGRpc3Bvc2Ugb2YgbWVudXMgdGhhdCB3ZXJlIGJlaW5nIHRyYWNrZWQKLQkJaWYgKGZUZXh0Q29udGV4dE1lbnUgIT0gbnVsbCkgewotCQkJZlRleHRDb250ZXh0TWVudS5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGZSdWxlckNvbnRleHRNZW51ICE9IG51bGwpIHsKLQkJCWZSdWxlckNvbnRleHRNZW51LmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoZlRleHRDb250ZXh0TWVudU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlRleHRDb250ZXh0TWVudU1hbmFnZXIucmVtb3ZlTWVudUxpc3RlbmVyKGdldENvbnRleHRNZW51TGlzdGVuZXIoKSk7Ci0JCQlmVGV4dENvbnRleHRNZW51TWFuYWdlci5yZW1vdmVBbGwoKTsKLQkJCWZUZXh0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZSdWxlckNvbnRleHRNZW51TWFuYWdlci5yZW1vdmVNZW51TGlzdGVuZXIoZ2V0Q29udGV4dE1lbnVMaXN0ZW5lcigpKTsKLQkJCWZSdWxlckNvbnRleHRNZW51TWFuYWdlci5yZW1vdmVBbGwoKTsKLQkJCWZSdWxlckNvbnRleHRNZW51TWFuYWdlci5kaXNwb3NlKCk7Ci0JCX0KLQotCQkvLyBhZGRlZCB0aGlzIDIvMjAvMjAwNCBiYXNlZCBvbiBwcm9iZSByZXN1bHRzIC0tCi0JCS8vIHNlZW1zIHNob3VsZCBiZSBoYW5kbGVkIGJ5IHNldE1vZGVsKG51bGwpLCBidXQKLQkJLy8gdGhhdCdzIGEgbW9yZSByYWRpY2FsIGNoYW5nZS4KLQkJLy8gYW5kLCB0ZWNobmljYWxseSBzcGVha2luZywgc2hvdWxkIG5vdCBiZSBuZWVkZWQsCi0JCS8vIGJ1dCBtYWtlcyBhIG1lbW9yeSBsZWFrCi0JCS8vIGxlc3Mgc2V2ZXJlLgotCQlpZiAoZlN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlpZiAoZlN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSAhPSBudWxsICYmIGZJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCWZTdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcihmSW50ZXJuYWxEb2N1bWVudExpc3RlbmVyKTsKLQkJCX0KLQkJCWZTdHJ1Y3R1cmVkTW9kZWwucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKGdldEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCkpOwotCQl9Ci0KLQkJLy8gQlVHMTU1MzM1IC0gaWYgdGhlcmUgd2FzIG5vIGRvY3VtZW50IHByb3ZpZGVyLCB0aGVyZSB3YXMgbm90aGluZwotCQkvLyBhZGRlZAotCQkvLyB0byBkb2N1bWVudCwgc28gbm90aGluZyB0byByZW1vdmUKLQkJaWYgKGdldERvY3VtZW50UHJvdmlkZXIoKSAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGdldEVkaXRvcklucHV0KCkpOwotCQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQkJaWYgKGZJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIgIT0gbnVsbCkKLQkJCQkJZG9jLnJlbW92ZURvY3VtZW50TGlzdGVuZXIoZkludGVybmFsRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCQkJaWYgKGRvYyBpbnN0YW5jZW9mIElFeGVjdXRpb25EZWxlZ2F0YWJsZSkgewotCQkJCQkoKElFeGVjdXRpb25EZWxlZ2F0YWJsZSkgZG9jKS5zZXRFeGVjdXRpb25EZWxlZ2F0ZShudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBzb21lIHRoaW5ncyBpbiB0aGUgY29uZmlndXJhdGlvbiBuZWVkIHRvIGNsZWFuCi0JCS8vIHVwIGFmdGVyIHRoZW1zZWx2ZXMKLQkJaWYgKGZPdXRsaW5lUGFnZSAhPSBudWxsKSB7Ci0JCQlpZiAoZk91dGxpbmVQYWdlIGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlICYmIGZPdXRsaW5lUGFnZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkoKENvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZSkgZk91dGxpbmVQYWdlKS5yZW1vdmVEb3VibGVDbGlja0xpc3RlbmVyKGZPdXRsaW5lUGFnZUxpc3RlbmVyKTsKLQkJCX0KLQkJCWlmIChmT3V0bGluZVBhZ2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJZk91dGxpbmVQYWdlLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmT3V0bGluZVBhZ2VMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQotCQlmRWRpdG9yRGlzcG9zZWQgPSB0cnVlOwotCQlkaXNwb3NlTW9kZWxEZXBlbmRlbnRGaWVsZHMoKTsKLQotCQlpZiAoZkRyb3BUYXJnZXQgIT0gbnVsbCkKLQkJCWZEcm9wVGFyZ2V0LmRpc3Bvc2UoKTsKLQotCQlzZXRQcmVmZXJlbmNlU3RvcmUobnVsbCk7Ci0KLQkJLy8gc3RyaWN0bHkgc3BlYWtpbmcsIGJ1dCBmb2xsb3dpbmcgbnVsbCBvdXRzCi0JCS8vIHNob3VsZCBub3QgYmUgbmVlZGVkLAotCQkvLyBidXQgaW4gdGhlIGV2ZW50IG9mIGEgbWVtb3J5IGxlYWssIHRoZXkgbWFrZSB0aGUKLQkJLy8gbWVtb3J5IGxlYWsgbGVzcwotCQkvLyBzZXZlcmUKLQkJZkRyb3BBZGFwdGVyID0gbnVsbDsKLQkJZkRyb3BUYXJnZXQgPSBudWxsOwotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQlMb2dnZXIudHJhY2UoIlNvdXJjZSBFZGl0b3IiLCAiU3RydWN0dXJlZFRleHRFZGl0b3I6OmRpc3Bvc2UgZXhpdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yI2Rpc3Bvc2VEb2N1bWVudFByb3ZpZGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlRG9jdW1lbnRQcm92aWRlcigpIHsKLQkJaWYgKGZTdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCAmJiAhZmlzUmVsZWFzZWQgJiYgIShnZXREb2N1bWVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBJTW9kZWxQcm92aWRlcikpIHsKLQkJCWZTdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQlmaXNSZWxlYXNlZCA9IHRydWU7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZURvY3VtZW50UHJvdmlkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBtb2RlbCBzcGVjaWZpYyBlZGl0b3IgaGVscGVycyBzdWNoIGFzIHN0YXR1c0xpbmVIZWxwZXIuCi0JICogQmFzaWNhbGx5IGFueSBjb2RlIHJlcGVhdGVkIGluIHVwZGF0ZSgpICYgZGlzcG9zZSgpIHNob3VsZCBiZSBwbGFjZWQKLQkgKiBoZXJlLgotCSAqLwotCXByaXZhdGUgdm9pZCBkaXNwb3NlTW9kZWxEZXBlbmRlbnRGaWVsZHMoKSB7Ci0JCS8vIG5vbmUgYXQgdGhpcyBsZXZlbAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvciNkb1JldmVydFRvU2F2ZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvUmV2ZXJ0VG9TYXZlZCgpIHsKLQkJc3VwZXIuZG9SZXZlcnRUb1NhdmVkKCk7Ci0JCWlmIChmT3V0bGluZVBhZ2UgIT0gbnVsbCAmJiBmT3V0bGluZVBhZ2UgaW5zdGFuY2VvZiBJVXBkYXRlKSB7Ci0JCQkoKElVcGRhdGUpIGZPdXRsaW5lUGFnZSkudXBkYXRlKCk7Ci0JCX0KLQkJLy8gcmVzZXQgdW5kbwotCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGdldEVkaXRvcklucHV0KCkpOwotCQlpZiAoZG9jIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJKChJU3RydWN0dXJlZERvY3VtZW50KSBkb2MpLmdldFVuZG9NYW5hZ2VyKCkuZ2V0Q29tbWFuZFN0YWNrKCkuZmx1c2goKTsKLQkJfQotCi0JCS8vIHVwZGF0ZSBtZW51IHRleHQKLQkJdXBkYXRlTWVudVRleHQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQl0cnkgewotCQkJYWJvdXRUb1NhdmVNb2RlbCgpOwotCQkJdXBkYXRlRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlzdXBlci5kb1NhdmUocHJvZ3Jlc3NNb25pdG9yKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXNhdmVkTW9kZWwoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3IjZG9TZXRJbnB1dChvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TZXRJbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETzogaWYgb3BlbmVkIGluIG1vcmUgdGhhbiBvbmUgZWRpdG9yLCB0aGlzIHdpbGwgY2F1c2UKLQkJLy8gcHJvYmxlbXMuCi0JCUlFZGl0b3JJbnB1dCBvbGRJbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChvbGRJbnB1dCAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgb2xkZG9jID0gZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KG9sZElucHV0KTsKLQkJCWlmIChvbGRkb2MgIT0gbnVsbCAmJiBvbGRkb2MgaW5zdGFuY2VvZiBJRXhlY3V0aW9uRGVsZWdhdGFibGUpIHsKLQkJCQkoKElFeGVjdXRpb25EZWxlZ2F0YWJsZSkgb2xkZG9jKS5zZXRFeGVjdXRpb25EZWxlZ2F0ZShudWxsKTsKLQkJCX0KLQkJfQotCi0JCWlmIChmU3RydWN0dXJlZE1vZGVsICE9IG51bGwgJiYgIShnZXREb2N1bWVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBJTW9kZWxQcm92aWRlcikpIHsKLQkJCWZTdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCX0KLQotCQlzdXBlci5kb1NldElucHV0KGlucHV0KTsKLQotCQlJRG9jdW1lbnQgbmV3RG9jdW1lbnQgPSBnZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoaW5wdXQpOwotCQlpZiAobmV3RG9jdW1lbnQgaW5zdGFuY2VvZiBJRXhlY3V0aW9uRGVsZWdhdGFibGUpIHsKLQkJCSgoSUV4ZWN1dGlvbkRlbGVnYXRhYmxlKSBuZXdEb2N1bWVudCkuc2V0RXhlY3V0aW9uRGVsZWdhdGUobmV3IEVkaXRvckV4ZWN1dGlvbkNvbnRleHQodGhpcykpOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCS8vIGlmIHdlIGhhdmUgYSBNb2RlbCBwcm92aWRlciwgZ2V0IHRoZSBtb2RlbCBmcm9tIGl0Ci0JCWlmIChnZXREb2N1bWVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBJTW9kZWxQcm92aWRlcikgewotCQkJbW9kZWwgPSAoKElNb2RlbFByb3ZpZGVyKSBnZXREb2N1bWVudFByb3ZpZGVyKCkpLmdldE1vZGVsKGdldEVkaXRvcklucHV0KCkpOwotCQkJaWYgKCFtb2RlbC5pc1NoYXJlZCgpKSB7Ci0JCQkJRWRpdG9yTW9kZWxVdGlsLmFkZEZhY3Rvcmllc1RvKG1vZGVsKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChuZXdEb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkvLyBjb3JyZXNwb25kaW5nIHJlbGVhc2VGcm9tRWRpdCBvY2N1cnMgaW4KLQkJCQkvLyBkaXNwb3NlKCkKLQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KChJU3RydWN0dXJlZERvY3VtZW50KSBuZXdEb2N1bWVudCk7Ci0JCQkJRWRpdG9yTW9kZWxVdGlsLmFkZEZhY3Rvcmllc1RvKG1vZGVsKTsKLQkJCX0KLQotCQkJZWxzZSB7Ci0JCQkJbG9nVW5leHBlY3RlZERvY3VtZW50S2luZChpbnB1dCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZlN0cnVjdHVyZWRNb2RlbCAhPSBudWxsIHx8IG1vZGVsICE9IG51bGwpIHsKLQkJCXNldE1vZGVsKG1vZGVsKTsKLQkJfQotCi0JCWlmIChnZXRJbnRlcm5hbE1vZGVsKCkgIT0gbnVsbCkgewotCQkJdXBkYXRlRWRpdG9yQ29udHJvbHNGb3JDb250ZW50VHlwZShnZXRJbnRlcm5hbE1vZGVsKCkuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdXBkYXRlRWRpdG9yQ29udHJvbHNGb3JDb250ZW50VHlwZShudWxsKTsKLQkJfQotCi0JCWlmIChmUHJvamVjdGlvbk1vZGVsVXBkYXRlciAhPSBudWxsKQotCQkJdXBkYXRlUHJvamVjdGlvblN1cHBvcnQoKTsKLQotCQkvLyBzdGFydCBlZGl0b3Igd2l0aCBzbWFydCBpbnNlcnQgbW9kZQotCQlzZXRJbnNlcnRNb2RlKFNNQVJUX0lOU0VSVCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB1cCB0aGlzIGVkaXRvcidzIGNvbnRleHQgbWVudSBiZWZvcmUgaXQgaXMgbWFkZSB2aXNpYmxlLgotCSAqIDxwPgotCSAqIE5vdCBBUEkuIE1heSBiZSByZWR1Y2VkIHRvIHByb3RlY3RlZCBtZXRob2QgaW4gdGhlIGZ1dHVyZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1lbnUKLQkgKiAgICAgICAgICAgIHRoZSBtZW51Ci0JICovCi0JcHVibGljIHZvaWQgZWRpdG9yQ29udGV4dE1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudSkgewotCQkvLyBUbyBiZSBjb25zaXN0YW50IHdpdGggdGhlIEphdmEgRWRpdG9yLCB3ZSB3YW50Ci0JCS8vIHRvIHJlbW92ZQotCQkvLyBTaGlmdFJpZ2h0IGFuZCBTaGlmdExlZnQgZnJvbSB0aGUgY29udGV4dCBtZW51LgotCQkvLwotCQkvLyBTaGlmdFJpZ2h0IGFuZCBTaGlmdExlZnQgd2VyZSBhZGRlZCBpbiB0aGUgc3VwZXIKLQkJLy8gaW1wbGVtZW5hdGlvbiBvZgotCQkvLyB0aGlzIG1ldGhvZC4gV2Ugd2FudCB0byBza2lwIGl0IGFuZCBjYWxsCi0JCS8vIEFic3RyYWN0VGV4dEVkaXRvcidzCi0JCS8vIGltcGxlbWVudGF0aW9uIGRpcmVjdGx5LiBUaGUgZWFzaWVzdCB3YXkgaXMgdG8KLQkJLy8gY29weSB0aGUgbWV0aG9kIGhlcmUuCi0KLQkJLy8gc3VwZXIuZWRpdG9yQ29udGV4dE1lbnVBYm91dFRvU2hvdyhtZW51KTsKLQkJYWJzdHJhY3RUZXh0RWRpdG9yQ29udGV4dE1lbnVBYm91dFRvU2hvdyhtZW51KTsKLQotCQlhZGRDb250ZXh0TWVudUFjdGlvbnMobWVudSk7Ci0JCWFkZEV4dGVuZGVkQ29udGV4dE1lbnVBY3Rpb25zKG1lbnUpOwotCX0KLQotCS8qKgotCSAqIEVuZCBiYWNrZ3JvdW5kIG1vZGUuCi0JICogPHA+Ci0JICogTm90IEFQSS4gTWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKiA8L3A+Ci0JICovCi0Jdm9pZCBlbmRCYWNrZ3JvdW5kT3BlcmF0aW9uKCkgewotCQlmQmFja2dyb3VuZEpvYkVuZGVkID0gdHJ1ZTsKLQkJLy8gbm90ZSwgd2UgZG9uJ3QgaW1tZWRpYXRlbHkgZW5kIG91ciAnaW50ZXJuYWwgYnVzeScgc3RhdGUsCi0JCS8vIHNpbmNlIHdlIG1heSBnZXQgbWFueSBjYWxscyBpbiBhIHNob3J0IHBlcmlvZCBvZgotCQkvLyB0aW1lLiBXZSBhbHdheXMgd2FpdCBmb3IgdGhlIHRpbWUgb3V0LgotCQlyZXNldEJ1c3lTdGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIE5vdGUgdGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBpbmRpcmVjdGx5IGZyb20gYmFja2dyb3VuZCBqb2Igb3BlcmF0aW9uCi0JICogLi4uIGJ1dCBleHBlY3RlZCB0byBiZSBnYXVyZGVkIHRoZXJlIHdpdGggSUxvY2ssIHBsdXMsIGNhbiBiZSBjYWxsZWQKLQkgKiBkaXJlY3RseSBmcm9tIHRpbWVyIHRocmVhZCwgc28gdGhlIHRpbWVyJ3MgcnVuIG1ldGhvZCBndWFyZHMgd2l0aCBJTG9jawotCSAqIHRvby4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5kQnVzeVN0YXRlSW50ZXJuYWwoKSB7Ci0JCWlmIChmQmFja2dyb3VuZEpvYkVuZGVkKSB7Ci0JCQlmQnVzeVRpbWVyLmNhbmNlbCgpOwotCQkJc2hvd0J1c3koZmFsc2UpOwotCi0JCQlJU291cmNlVmlld2VyIHZpZXdlciA9IGdldFNvdXJjZVZpZXdlcigpOwotCQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB7Ci0JCQkJKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyKS5lbmRCYWNrZ3JvdW5kVXBkYXRlKCk7Ci0JCQl9Ci0JCQlmQnVzeVN0YXRlID0gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB3ZSB3aWxsIG9ubHkgYmUgaW4gdGhpcyBicmFuY2ggZm9yIGEgYmFjayBncm91bmQgam9iIHRoYXQgaXMKLQkJCS8vIHRha2luZwotCQkJLy8gbG9uZ2VyIHRoYW4gb3VyIG5vcm1hbCB0aW1lLW91dCBwZXJpb2QgKG1lYW5pbmcgd2UgZ290IG5vdGlmaWVkCi0JCQkvLyBvZgotCQkJLy8gdGhlIHRpbWVvdXQgImluYmV0d2VlbiIgY2FsbHMgdG8gJ2JlZ2luJyBhbmQKLQkJCS8vICdlbmRCYWNrZ3JvdW5kT3BlcmF0aW9uJy4KLQkJCS8vICh3aGljaCwgcmVtZW1iZXIsIGNhbiBvbmx5IGhhcHBlbiBzaW5jZSB0aGVyZSBhcmUgbWFueSBjYWxscyB0bwotCQkJLy8gYmVnaW4vZW5kIGluIGEgc2hvcnQgcGVyaW9kIG9mIHRpbWUsIGFuZCB3ZSBvbmx5ICJyZXNldCIgb24gdGhlCi0JCQkvLyAnZW5kcycpLgotCQkJLy8gSW4gdGhpcyBldmVudCwgdGhlcmUncyByZWFsbHkgbm90aGluZyB0byBkbywgd2UncmUgc3RpbGwgaW4KLQkJCS8vICJidXN5IHN0YXRlIgotCQkJLy8gYW5kIHNob3VsZCBzdGFydCBhIG5ldyByZXNldCBjeWNsZSBvbmNlIGVuZEJhY2tncm91bmRqb2IgaXMKLQkJCS8vIGNhbGxlZC4KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIHJlcXVpcmVkKSB7Ci0JCWlmIChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1Zy5wZXJmVGVzdEFkYXB0ZXJDbGFzc0xvYWRpbmcpIHsKLQkJCXN0YXJ0UGVyZlRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJLy8gdGV4dCBlZGl0b3IKLQkJSVN0cnVjdHVyZWRNb2RlbCBpbnRlcm5hbE1vZGVsID0gZ2V0SW50ZXJuYWxNb2RlbCgpOwotCQlpZiAoSVRleHRFZGl0b3IuY2xhc3MuZXF1YWxzKHJlcXVpcmVkKSkgewotCQkJcmVzdWx0ID0gdGhpczsKLQkJfQotCQllbHNlIGlmIChJV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZS5jbGFzcy5lcXVhbHMocmVxdWlyZWQpKSB7Ci0JCQlyZXR1cm4gZ2V0RWRpdG9yUGFydCgpLmdldFNpdGUoKS5nZXRBZGFwdGVyKElXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlLmNsYXNzKTsKLQkJfQotCQkvLyBjb250ZW50IG91dGxpbmUgcGFnZQotCQllbHNlIGlmIChJQ29udGVudE91dGxpbmVQYWdlLmNsYXNzLmVxdWFscyhyZXF1aXJlZCkpIHsKLQkJCWlmIChmT3V0bGluZVBhZ2UgPT0gbnVsbCB8fCBmT3V0bGluZVBhZ2UuZ2V0Q29udHJvbCgpID09IG51bGwgfHwgZk91dGxpbmVQYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gY2ZnID0gY3JlYXRlQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKCk7Ci0JCQkJaWYgKGNmZyAhPSBudWxsKSB7Ci0JCQkJCUNvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZSBvdXRsaW5lUGFnZSA9IG5ldyBDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UoKTsKLQkJCQkJb3V0bGluZVBhZ2Uuc2V0Q29uZmlndXJhdGlvbihjZmcpOwotCQkJCQlpZiAoaW50ZXJuYWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQlvdXRsaW5lUGFnZS5zZXRJbnB1dENvbnRlbnRUeXBlSWRlbnRpZmllcihpbnRlcm5hbE1vZGVsLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpKTsKLQkJCQkJCW91dGxpbmVQYWdlLnNldElucHV0KGludGVybmFsTW9kZWwpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGZPdXRsaW5lUGFnZUxpc3RlbmVyID09IG51bGwpIHsKLQkJCQkJCWZPdXRsaW5lUGFnZUxpc3RlbmVyID0gbmV3IE91dGxpbmVQYWdlTGlzdGVuZXIoKTsKLQkJCQkJfQotCi0JCQkJCW91dGxpbmVQYWdlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmT3V0bGluZVBhZ2VMaXN0ZW5lcik7Ci0JCQkJCW91dGxpbmVQYWdlLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIoZk91dGxpbmVQYWdlTGlzdGVuZXIpOwotCi0JCQkJCWZPdXRsaW5lUGFnZSA9IG91dGxpbmVQYWdlOwotCQkJCX0KLQkJCX0KLQkJCXJlc3VsdCA9IGZPdXRsaW5lUGFnZTsKLQkJfQotCQkvLyBwcm9wZXJ0eSBzaGVldCBwYWdlLCBidXQgb25seSBpZiB0aGUgaW5wdXQncyBlZGl0YWJsZQotCQllbHNlIGlmIChJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MuZXF1YWxzKHJlcXVpcmVkKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCWlmIChmUHJvcGVydHlTaGVldFBhZ2UgPT0gbnVsbCB8fCBmUHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpID09IG51bGwgfHwgZlByb3BlcnR5U2hlZXRQYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiBjZmcgPSBjcmVhdGVQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbigpOwotCQkJCWlmIChjZmcgIT0gbnVsbCkgewotCQkJCQlDb25maWd1cmFibGVQcm9wZXJ0eVNoZWV0UGFnZSBwcm9wZXJ0eVNoZWV0UGFnZSA9IG5ldyBDb25maWd1cmFibGVQcm9wZXJ0eVNoZWV0UGFnZSgpOwotCQkJCQlwcm9wZXJ0eVNoZWV0UGFnZS5zZXRDb25maWd1cmF0aW9uKGNmZyk7Ci0JCQkJCWZQcm9wZXJ0eVNoZWV0UGFnZSA9IHByb3BlcnR5U2hlZXRQYWdlOwotCQkJCX0KLQkJCX0KLQkJCXJlc3VsdCA9IGZQcm9wZXJ0eVNoZWV0UGFnZTsKLQkJfQotCQllbHNlIGlmIChJRG9jdW1lbnQuY2xhc3MuZXF1YWxzKHJlcXVpcmVkKSkgewotCQkJcmVzdWx0ID0gZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGdldEVkaXRvcklucHV0KCkpOwotCQl9Ci0JCWVsc2UgaWYgKElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmNsYXNzLmVxdWFscyhyZXF1aXJlZCkpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMoKTsKLQkJfQotCQllbHNlIGlmIChJVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQuY2xhc3MuZXF1YWxzKHJlcXVpcmVkKSkgewotCQkJcmVzdWx0ID0gVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQuZ2V0SW5zdGFuY2UoKTsKLQkJfQotCQllbHNlIGlmIChJU2hvd0luVGFyZ2V0TGlzdC5jbGFzcy5lcXVhbHMocmVxdWlyZWQpKSB7Ci0JCQlyZXR1cm4gbmV3IFNob3dJblRhcmdldExpc3RBZGFwdGVyKCk7Ci0JCX0KLQkJZWxzZSBpZiAoU2VsZWN0aW9uSGlzdG9yeS5jbGFzcy5lcXVhbHMocmVxdWlyZWQpKSB7Ci0JCQlpZiAoZlNlbGVjdGlvbkhpc3RvcnkgPT0gbnVsbCkKLQkJCQlmU2VsZWN0aW9uSGlzdG9yeSA9IG5ldyBTZWxlY3Rpb25IaXN0b3J5KHRoaXMpOwotCQkJcmV0dXJuIGZTZWxlY3Rpb25IaXN0b3J5OwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHJlc3VsdCA9PSBudWxsICYmIGludGVybmFsTW9kZWwgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IGludGVybmFsTW9kZWwuZ2V0QWRhcHRlcihyZXF1aXJlZCk7Ci0JCQl9Ci0JCQkvLyBvdGhlcnMKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBzdXBlci5nZXRBZGFwdGVyKHJlcXVpcmVkKTsKLQkJfQotCQlpZiAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWcucGVyZlRlc3RBZGFwdGVyQ2xhc3NMb2FkaW5nKSB7Ci0JCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWFkYXB0ZXJSZXF1ZXN0cysrOwotCQkJYWRhcHRlclRpbWUgKz0gKHN0b3AgLSBzdGFydFBlcmZUaW1lKTsKLQkJfQotCQlpZiAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWcucGVyZlRlc3RBZGFwdGVyQ2xhc3NMb2FkaW5nKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsIGNhbGxzIHRvIGdldEFkYXB0ZXI6ICIgKyBhZGFwdGVyUmVxdWVzdHMpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsIHRpbWUgaW4gZ2V0QWRhcHRlcjogIiArIGFkYXB0ZXJUaW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJBdmVyYWdlIHRpbWUgcGVyIGNhbGw6ICIgKyAoYWRhcHRlclRpbWUgLyBhZGFwdGVyUmVxdWVzdHMpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCkgewotCQlTdHJpbmcgY29udGVudFR5cGVJZGVudGlmaWVySUQgPSBudWxsOwotCQlpZiAoZ2V0SW50ZXJuYWxNb2RlbCgpICE9IG51bGwpIHsKLQkJCWNvbnRlbnRUeXBlSWRlbnRpZmllcklEID0gZ2V0SW50ZXJuYWxNb2RlbCgpLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpOwotCQl9Ci0JCXJldHVybiBDb25maWd1cmF0aW9uUG9pbnRDYWxjdWxhdG9yLmdldENvbmZpZ3VyYXRpb25Qb2ludHModGhpcywgY29udGVudFR5cGVJZGVudGlmaWVySUQsIENvbmZpZ3VyYXRpb25Qb2ludENhbGN1bGF0b3IuU09VUkNFLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogYWRkZWQgY2hlY2tzIHRvIG92ZXJjb21lIGJ1ZyBzdWNoIHRoYXQgaWYgd2UgYXJlIHNodXR0aW5nIGRvd24gaW4gYW4KLQkgKiBlcnJvciBjb25kaXRpb24sIHRoZW4gdmlld2VyIHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4gZGlzcG9zZWQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDdXJzb3JQb3NpdGlvbigpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIHRoaXMgbWF5IGJlIHRvbyBleHBlbnNpdmUgaW4gdGVybXMgb2YKLQkJLy8gcGVyZm9ybWFuY2UsIHRvIGRvIHRoaXMgY2hlY2sKLQkJLy8gZXZlcnkgdGltZSwganVzdCB0byBnYXVyZCBhZ2FpbnN0IGVycm9yCi0JCS8vIGNvbmRpdGlvbi4KLQkJLy8gcGVyaGFwcyB0aGVyZSdzIGEgYmV0dGVyIHdheT8KLQkJaWYgKGdldFNvdXJjZVZpZXdlcigpICE9IG51bGwgJiYgZ2V0U291cmNlVmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpICE9IG51bGwgJiYgIWdldFNvdXJjZVZpZXdlcigpLmdldFRleHRXaWRnZXQoKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJlc3VsdCA9IHN1cGVyLmdldEN1cnNvclBvc2l0aW9uKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSAiMDowIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgZWRpdG9yIHBhcnQuCi0JICogPHA+Ci0JICogTm90IEFQSS4gTWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGlzIGVkaXRvciBwYXJ0Ci0JICovCi0JcHVibGljIElFZGl0b3JQYXJ0IGdldEVkaXRvclBhcnQoKSB7Ci0JCWlmIChmRWRpdG9yUGFydCA9PSBudWxsKQotCQkJcmV0dXJuIHRoaXM7Ci0JCXJldHVybiBmRWRpdG9yUGFydDsKLQl9Ci0JCi0JcHJpdmF0ZSBJRG9jdW1lbnRMaXN0ZW5lciBnZXRJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIoKSB7Ci0JCWlmIChmSW50ZXJuYWxEb2N1bWVudExpc3RlbmVyID09IG51bGwpIHsKLQkJCWZJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxEb2N1bWVudExpc3RlbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnRlcm5hbERvY3VtZW50TGlzdGVuZXI7Ci0JfQotCi0JSVN0cnVjdHVyZWRNb2RlbCBnZXRJbnRlcm5hbE1vZGVsKCkgewotCQlyZXR1cm4gZlN0cnVjdHVyZWRNb2RlbDsKLQl9Ci0KLQlwcml2YXRlIEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGdldEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCkgewotCQlpZiAoZkludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyID09IG51bGwpIHsKLQkJCWZJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcigpOwotCQl9Ci0JCXJldHVybiBmSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIGVkaXRvcidzIFN0cnVjdHVyZWRNb2RlbC4KLQkgKiA8cD4KLQkgKiBOb3QgQVBJLiBXaWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiByZXR1cm5zIHRoaXMgZWRpdG9yJ3MgSVN0cnVjdHVyZWRNb2RlbAotCSAqIEBkZXByZWNhdGVkIC0gVGhpcyBtZXRob2QgYWxsb3dlZCBmb3IgdW5jb250cm9sbGVkIGFjY2VzcyB0byB0aGUgbW9kZWwKLQkgKiAgICAgICAgICAgICBpbnN0YW5jZSBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuIEl0IGlzCi0JICogICAgICAgICAgICAgcmVjb21tZW5kZWQgdGhhdCB0aGUgY3VycmVudCBkb2N1bWVudCBwcm92aWRlciBiZSBhc2tlZCBmb3IKLQkgKiAgICAgICAgICAgICB0aGUgY3VycmVudCBkb2N1bWVudCBhbmQgdGhlIElNb2RlbE1hbmFnZXIgdGhlbiBhc2tlZCBmb3IKLQkgKiAgICAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyBtb2RlbCB3aXRoCi0JICogICAgICAgICAgICAgZ2V0RXhpc3RpbmdNb2RlbEZvciooSURvY3VtZW50KS4gU3VwcG9ydGVkIGRvY3VtZW50Ci0JICogICAgICAgICAgICAgcHJvdmlkZXJzIGVuc3VyZSB0aGF0IHRoZSBkb2N1bWVudCBtYXBzIHRvIGEgc2hhcmVkCi0JICogICAgICAgICAgICAgc3RydWN0dXJlZCBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbCgpIHsKLQkJSURvY3VtZW50UHJvdmlkZXIgZG9jdW1lbnRQcm92aWRlciA9IGdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJCi0JCWlmIChkb2N1bWVudFByb3ZpZGVyID09IG51bGwpIHsKLQkJCS8vIHRoaXMgaW5kaWNhdGVkIGFuIGVycm9yIGluIHN0YXJ0dXAgc2VxdWVuY2UKLQkJCUxvZ2dlci50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSwgIlByb2dyYW0gSW5mbyBPbmx5OiBkb2N1bWVudCBwcm92aWRlciB3YXMgbnVsbCB3aGVuIG1vZGVsIHJlcXVlc3RlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQkKLQkJLy8gUmVtZW1iZXIgaWYgd2UgZW50ZXJlZCB0aGlzIG1ldGhvZCB3aXRob3V0IGEgbW9kZWwgZXhpc3RpbmcKLQkJYm9vbGVhbiBpbml0aWFsTW9kZWxOdWxsID0gKGZTdHJ1Y3R1cmVkTW9kZWwgPT0gbnVsbCk7Ci0JCQotCQlpZiAoZlN0cnVjdHVyZWRNb2RlbCA9PSBudWxsICYmIGRvY3VtZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJLy8gbGF6aWx5IHNldCB0aGUgbW9kZWwgaW5zdGFuY2UsIGFsdGhvdWdoIHRoaXMgaXMgYW4gQUJOT1JNQUwKLQkJCS8vIENPREUgUEFUSAotCQkJaWYgKGRvY3VtZW50UHJvdmlkZXIgaW5zdGFuY2VvZiBJTW9kZWxQcm92aWRlcikgewotCQkJCWZTdHJ1Y3R1cmVkTW9kZWwgPSAoKElNb2RlbFByb3ZpZGVyKSBkb2N1bWVudFByb3ZpZGVyKS5nZXRNb2RlbChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQlmaXNSZWxlYXNlZCA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSURvY3VtZW50IGRvYyA9IGRvY3VtZW50UHJvdmlkZXIuZ2V0RG9jdW1lbnQoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJaWYgKGRvYyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJLyoKLQkJCQkJICogQ2FsbGVkIGluIHRoaXMgbWFubmVyIGJlY2F1c2UgZ2V0RXhpc3RpbmdNb2RlbCBjYW4gc2tpcAotCQkJCQkgKiBzb21lIGNhbGN1bGF0aW9ucyBhbHdheXMgcGVyZm9ybWVkIGluIGdldE1vZGVsRm9yRWRpdAotCQkJCQkgKi8KLQkJCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jKTsKLQkJCQkJaWYgKG1vZGVsID09IG51bGwpIHsKLQkJCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvYyk7Ci0JCQkJCX0KLQkJCQkJZlN0cnVjdHVyZWRNb2RlbCA9IG1vZGVsOwotCQkJCQlmaXNSZWxlYXNlZCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJRWRpdG9yTW9kZWxVdGlsLmFkZEZhY3Rvcmllc1RvKGZTdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCQlpZiAoaW5pdGlhbE1vZGVsTnVsbCAmJiBmU3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCQkvKgotCQkJCSAqIERNVzogOS8xLzIwMDIgLS0gd2h5IGlzIHVwZGF0ZSBjYWxsZWQgaGVyZT8gTm8gY2hhbmdlIGhhcwotCQkJCSAqIGJlZW4gaW5kaWNhdGVkPyBJJ2QgbGlrZSB0byByZW1vdmUsIGJ1dCB3aWxsIGxlYXZlIGZvciBub3cKLQkJCQkgKiB0byBhdm9pZCBicmVha2luZyB0aGlzIGhhY2suIFNob3VsZCBtZWFzdXJlL2JyZWFrcG9pbnQgdG8KLQkJCQkgKiBzZWUgaG93IGxhcmdlIHRoZSBwcm9ibGVtIGlzLiBNYXkgY2F1c2UgcGVyZm9ybWFuY2UKLQkJCQkgKiBwcm9ibGVtcy4KLQkJCQkgKiAKLQkJCQkgKiBETVc6IDkvOC8yMDAyIC0tIG5vdCBzdXJlIHdoeSB0aGlzIHdhcyBoZXJlIGluaXRpYWxseSwgYnV0Ci0JCQkJICogdGhlIGludGVudC9oYWNrIG11c3QgaGF2ZSBiZWVuIHRvIGNhbGwgdXBkYXRlIGlmIHRoaXMgd2FzCi0JCQkJICogdGhlIGZpcnN0IHRpbWUgZlN0cnVjdHVyZWRNb2RlbCB3YXMgc2V0LiBTbywgSSBhZGRlZCB0aGUKLQkJCQkgKiBsb2dpYyB0byBjaGVjayBmb3IgdGhhdCAiZmlyc3QgdGltZSIgY2FzZS4gSXQgd291bGQgYXBwZWFyCi0JCQkJICogd2UgZG9uJ3QgcmVhbGx5IG5lZWQuIG1heSByZW1vdmUgaW4gZnV0dXJlIHdoZW4gY2FuIHRlc3QKLQkJCQkgKiBtb3JlLgotCQkJCSAqLwotCQkJCXVwZGF0ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmU3RydWN0dXJlZE1vZGVsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5JV29ya2JlbmNoUGFydE9yaWVudGF0aW9uI2dldE9yaWVudGF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9yaWVudGF0aW9uKCkgewotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODg3MTQKLQkJcmV0dXJuIFNXVC5MRUZUX1RPX1JJR0hUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvciNnZXRTZWxlY3Rpb25Qcm92aWRlcigpCi0JICovCi0JcHVibGljIElTZWxlY3Rpb25Qcm92aWRlciBnZXRTZWxlY3Rpb25Qcm92aWRlcigpIHsKLQkJaWYgKGZTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHBhcmVudFByb3ZpZGVyID0gc3VwZXIuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCWlmIChwYXJlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJZlN0cnVjdHVyZWRTZWxlY3Rpb25Qcm92aWRlciA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXIocGFyZW50UHJvdmlkZXIsIHRoaXMpOwotCQkJCWZTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXIuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCXVwZGF0ZVN0YXR1c0xpbmUoZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdG9yJ3Mgc291cmNlIHZpZXdlci4gVGhpcyBtZXRob2Qgd2FzIGNyZWF0ZWQgdG8gZXhwb3NlCi0JICogdGhlIHByb3RlY3RlZCBmaW5hbCBnZXRTb3VyY2VWaWV3ZXIoKSBtZXRob2QuCi0JICogPHA+Ci0JICogTm90IEFQSS4gTWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgZWRpdG9yJ3Mgc291cmNlIHZpZXdlcgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBnZXRUZXh0Vmlld2VyKCkgewotCQlyZXR1cm4gKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSBnZXRTb3VyY2VWaWV3ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBKdW1wcyB0byB0aGUgbWF0Y2hpbmcgYnJhY2tldC4KLQkgKi8KLQl2b2lkIGdvdG9NYXRjaGluZ0JyYWNrZXQoKSB7Ci0JCUlDaGFyYWN0ZXJQYWlyTWF0Y2hlciBtYXRjaGVyID0gY3JlYXRlQ2hhcmFjdGVyUGFpck1hdGNoZXIoKTsKLQkJaWYgKG1hdGNoZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciA9IGdldFNvdXJjZVZpZXdlcigpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzb3VyY2VWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVJlZ2lvbiBzZWxlY3Rpb24gPSBnZXRTaWduZWRTZWxlY3Rpb24oc291cmNlVmlld2VyKTsKLQotCQlpbnQgc2VsZWN0aW9uTGVuZ3RoID0gTWF0aC5hYnMoc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJaWYgKHNlbGVjdGlvbkxlbmd0aCA+IDEpIHsKLQkJCXNldFN0YXR1c0xpbmVFcnJvck1lc3NhZ2UoU1NFVUlNZXNzYWdlcy5Hb3RvTWF0Y2hpbmdCcmFja2V0X2Vycm9yX2ludmFsaWRTZWxlY3Rpb24pOwotCQkJc291cmNlVmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXREaXNwbGF5KCkuYmVlcCgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNvdXJjZUNhcmV0T2Zmc2V0ID0gc2VsZWN0aW9uLmdldE9mZnNldCgpICsgc2VsZWN0aW9uLmdldExlbmd0aCgpOwotCQlJUmVnaW9uIHJlZ2lvbiA9IG1hdGNoZXIubWF0Y2goZG9jdW1lbnQsIHNvdXJjZUNhcmV0T2Zmc2V0KTsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlzZXRTdGF0dXNMaW5lRXJyb3JNZXNzYWdlKFNTRVVJTWVzc2FnZXMuR290b01hdGNoaW5nQnJhY2tldF9lcnJvcl9ub01hdGNoaW5nQnJhY2tldCk7Ci0JCQlzb3VyY2VWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldERpc3BsYXkoKS5iZWVwKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgb2Zmc2V0ID0gcmVnaW9uLmdldE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCi0JCWlmIChsZW5ndGggPCAxKQotCQkJcmV0dXJuOwotCi0JCWludCBhbmNob3IgPSBtYXRjaGVyLmdldEFuY2hvcigpOwotCi0JCS8vIGdvIHRvIGFmdGVyIHRoZSBtYXRjaCBpZiBtYXRjaGluZyB0byB0aGUgcmlnaHQKLQkJaW50IHRhcmdldE9mZnNldCA9IChJQ2hhcmFjdGVyUGFpck1hdGNoZXIuUklHSFQgPT0gYW5jaG9yKSA/IG9mZnNldCA6IG9mZnNldCArIGxlbmd0aDsKLQotCQlib29sZWFuIHZpc2libGUgPSBmYWxzZTsKLQkJaWYgKHNvdXJjZVZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotCQkJSVRleHRWaWV3ZXJFeHRlbnNpb241IGV4dGVuc2lvbiA9IChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHNvdXJjZVZpZXdlcjsKLQkJCXZpc2libGUgPSAoZXh0ZW5zaW9uLm1vZGVsT2Zmc2V0MldpZGdldE9mZnNldCh0YXJnZXRPZmZzZXQpID4gLTEpOwotCQl9Ci0JCWVsc2UgewotCQkJSVJlZ2lvbiB2aXNpYmxlUmVnaW9uID0gc291cmNlVmlld2VyLmdldFZpc2libGVSZWdpb24oKTsKLQkJCS8vIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzQxOTUKLQkJCXZpc2libGUgPSAodGFyZ2V0T2Zmc2V0ID49IHZpc2libGVSZWdpb24uZ2V0T2Zmc2V0KCkgJiYgdGFyZ2V0T2Zmc2V0IDw9IHZpc2libGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyB2aXNpYmxlUmVnaW9uLmdldExlbmd0aCgpKTsKLQkJfQotCi0JCWlmICghdmlzaWJsZSkgewotCQkJc2V0U3RhdHVzTGluZUVycm9yTWVzc2FnZShTU0VVSU1lc3NhZ2VzLkdvdG9NYXRjaGluZ0JyYWNrZXRfZXJyb3JfYnJhY2tldE91dHNpZGVTZWxlY3RlZEVsZW1lbnQpOwotCQkJc291cmNlVmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXREaXNwbGF5KCkuYmVlcCgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHNlbGVjdGlvbi5nZXRMZW5ndGgoKSA8IDApCi0JCQl0YXJnZXRPZmZzZXQgLT0gc2VsZWN0aW9uLmdldExlbmd0aCgpOwotCi0JCXNvdXJjZVZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKHRhcmdldE9mZnNldCwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJc291cmNlVmlld2VyLnJldmVhbFJhbmdlKHRhcmdldE9mZnNldCwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0VGV4dEVkaXRvciNoYW5kbGVDdXJzb3JQb3NpdGlvbkNoYW5nZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUN1cnNvclBvc2l0aW9uQ2hhbmdlZCgpIHsKLQkJc3VwZXIuaGFuZGxlQ3Vyc29yUG9zaXRpb25DaGFuZ2VkKCk7Ci0JCXVwZGF0ZVN0YXR1c0ZpZWxkKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlNUQVRVU19DQVRFR09SWV9PRkZTRVQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3IjaGFuZGxlUHJlZmVyZW5jZVN0b3JlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJlZmVyZW5jZVN0b3JlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0KLQkJaWYgKEVkaXRvclByZWZlcmVuY2VOYW1lcy5FRElUT1JfVEVYVF9IT1ZFUl9NT0RJRklFUlMuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJdXBkYXRlSG92ZXJCZWhhdmlvcigpOwotCQl9Ci0KLQkJaWYgKElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlci5GT0xESU5HX0VOQUJMRUQuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJaWYgKGdldFNvdXJjZVZpZXdlcigpIGluc3RhbmNlb2YgUHJvamVjdGlvblZpZXdlcikgewotCQkJCS8vIGluc3RhbGwgcHJvamVjdGlvbiBzdXBwb3J0IGlmIGl0IGhhcyBub3QgZXZlbiBiZWVuCi0JCQkJLy8gaW5zdGFsbGVkIHlldAotCQkJCWlmIChpc0ZvbGRpbmdFbmFibGVkKCkgJiYgKGZQcm9qZWN0aW9uU3VwcG9ydCA9PSBudWxsKSAmJiAoZlByb2plY3Rpb25Nb2RlbFVwZGF0ZXIgPT0gbnVsbCkpIHsKLQkJCQkJaW5zdGFsbFByb2plY3Rpb25TdXBwb3J0KCk7Ci0JCQkJfQotCQkJCVByb2plY3Rpb25WaWV3ZXIgcHYgPSAoUHJvamVjdGlvblZpZXdlcikgZ2V0U291cmNlVmlld2VyKCk7Ci0JCQkJaWYgKHB2LmlzUHJvamVjdGlvbk1vZGUoKSAhPSBpc0ZvbGRpbmdFbmFibGVkKCkpIHsKLQkJCQkJaWYgKHB2LmNhbkRvT3BlcmF0aW9uKFByb2plY3Rpb25WaWV3ZXIuVE9HR0xFKSkKLQkJCQkJCXB2LmRvT3BlcmF0aW9uKFByb2plY3Rpb25WaWV3ZXIuVE9HR0xFKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyB1cGRhdGUgY29udGVudCBhc3Npc3QgcHJlZmVyZW5jZXMKLQkJaWYgKEVkaXRvclByZWZlcmVuY2VOYW1lcy5DT0RFQVNTSVNUX1BST1BPU0FMU19CQUNLR1JPVU5ELmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCUlTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyID0gZ2V0U291cmNlVmlld2VyKCk7Ci0JCQlpZiAoc291cmNlVmlld2VyICE9IG51bGwpIHsKLQkJCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBnZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCk7Ci0JCQkJaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJCQlJQ29udGVudEFzc2lzdGFudCBjb250ZW50QXNzaXN0YW50ID0gY29uZmlndXJhdGlvbi5nZXRDb250ZW50QXNzaXN0YW50KHNvdXJjZVZpZXdlcik7Ci0JCQkJCWlmIChjb250ZW50QXNzaXN0YW50IGluc3RhbmNlb2YgQ29udGVudEFzc2lzdGFudCkgewotCQkJCQkJQ29udGVudEFzc2lzdGFudCBhc3Npc3RhbnQgPSAoQ29udGVudEFzc2lzdGFudCkgY29udGVudEFzc2lzdGFudDsKLQkJCQkJCVJHQiByZ2IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGdldFByZWZlcmVuY2VTdG9yZSgpLCBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9QUk9QT1NBTFNfQkFDS0dST1VORCk7Ci0JCQkJCQlDb2xvciBjb2xvciA9IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IocmdiKTsKLQkJCQkJCWFzc2lzdGFudC5zZXRQcm9wb3NhbFNlbGVjdG9yQmFja2dyb3VuZChjb2xvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyB1cGRhdGUgY29udGVudCBhc3Npc3QgcHJlZmVyZW5jZXMKLQkJaWYgKEVkaXRvclByZWZlcmVuY2VOYW1lcy5DT0RFQVNTSVNUX1BST1BPU0FMU19GT1JFR1JPVU5ELmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCUlTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyID0gZ2V0U291cmNlVmlld2VyKCk7Ci0JCQlpZiAoc291cmNlVmlld2VyICE9IG51bGwpIHsKLQkJCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBnZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCk7Ci0JCQkJaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJCQlJQ29udGVudEFzc2lzdGFudCBjb250ZW50QXNzaXN0YW50ID0gY29uZmlndXJhdGlvbi5nZXRDb250ZW50QXNzaXN0YW50KHNvdXJjZVZpZXdlcik7Ci0JCQkJCWlmIChjb250ZW50QXNzaXN0YW50IGluc3RhbmNlb2YgQ29udGVudEFzc2lzdGFudCkgewotCQkJCQkJQ29udGVudEFzc2lzdGFudCBhc3Npc3RhbnQgPSAoQ29udGVudEFzc2lzdGFudCkgY29udGVudEFzc2lzdGFudDsKLQkJCQkJCVJHQiByZ2IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGdldFByZWZlcmVuY2VTdG9yZSgpLCBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9QUk9QT1NBTFNfRk9SRUdST1VORCk7Ci0JCQkJCQlDb2xvciBjb2xvciA9IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IocmdiKTsKLQkJCQkJCWFzc2lzdGFudC5zZXRQcm9wb3NhbFNlbGVjdG9yRm9yZWdyb3VuZChjb2xvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyB1cGRhdGUgY29udGVudCBhc3Npc3QgcHJlZmVyZW5jZXMKLQkJaWYgKEVkaXRvclByZWZlcmVuY2VOYW1lcy5DT0RFQVNTSVNUX1BBUkFNRVRFUlNfQkFDS0dST1VORC5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciA9IGdldFNvdXJjZVZpZXdlcigpOwotCQkJaWYgKHNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gZ2V0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpOwotCQkJCWlmIChjb25maWd1cmF0aW9uICE9IG51bGwpIHsKLQkJCQkJSUNvbnRlbnRBc3Npc3RhbnQgY29udGVudEFzc2lzdGFudCA9IGNvbmZpZ3VyYXRpb24uZ2V0Q29udGVudEFzc2lzdGFudChzb3VyY2VWaWV3ZXIpOwotCQkJCQlpZiAoY29udGVudEFzc2lzdGFudCBpbnN0YW5jZW9mIENvbnRlbnRBc3Npc3RhbnQpIHsKLQkJCQkJCUNvbnRlbnRBc3Npc3RhbnQgYXNzaXN0YW50ID0gKENvbnRlbnRBc3Npc3RhbnQpIGNvbnRlbnRBc3Npc3RhbnQ7Ci0JCQkJCQlSR0IgcmdiID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihnZXRQcmVmZXJlbmNlU3RvcmUoKSwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkNPREVBU1NJU1RfUEFSQU1FVEVSU19CQUNLR1JPVU5EKTsKLQkJCQkJCUNvbG9yIGNvbG9yID0gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihyZ2IpOwotCQkJCQkJYXNzaXN0YW50LnNldENvbnRleHRJbmZvcm1hdGlvblBvcHVwQmFja2dyb3VuZChjb2xvcik7Ci0JCQkJCQlhc3Npc3RhbnQuc2V0Q29udGV4dFNlbGVjdG9yQmFja2dyb3VuZChjb2xvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyB1cGRhdGUgY29udGVudCBhc3Npc3QgcHJlZmVyZW5jZXMKLQkJaWYgKEVkaXRvclByZWZlcmVuY2VOYW1lcy5DT0RFQVNTSVNUX1BBUkFNRVRFUlNfRk9SRUdST1VORC5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciA9IGdldFNvdXJjZVZpZXdlcigpOwotCQkJaWYgKHNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gZ2V0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpOwotCQkJCWlmIChjb25maWd1cmF0aW9uICE9IG51bGwpIHsKLQkJCQkJSUNvbnRlbnRBc3Npc3RhbnQgY29udGVudEFzc2lzdGFudCA9IGNvbmZpZ3VyYXRpb24uZ2V0Q29udGVudEFzc2lzdGFudChzb3VyY2VWaWV3ZXIpOwotCQkJCQlpZiAoY29udGVudEFzc2lzdGFudCBpbnN0YW5jZW9mIENvbnRlbnRBc3Npc3RhbnQpIHsKLQkJCQkJCUNvbnRlbnRBc3Npc3RhbnQgYXNzaXN0YW50ID0gKENvbnRlbnRBc3Npc3RhbnQpIGNvbnRlbnRBc3Npc3RhbnQ7Ci0JCQkJCQlSR0IgcmdiID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihnZXRQcmVmZXJlbmNlU3RvcmUoKSwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkNPREVBU1NJU1RfUEFSQU1FVEVSU19GT1JFR1JPVU5EKTsKLQkJCQkJCUNvbG9yIGNvbG9yID0gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihyZ2IpOwotCQkJCQkJYXNzaXN0YW50LnNldENvbnRleHRJbmZvcm1hdGlvblBvcHVwRm9yZWdyb3VuZChjb2xvcik7Ci0JCQkJCQlhc3Npc3RhbnQuc2V0Q29udGV4dFNlbGVjdG9yRm9yZWdyb3VuZChjb2xvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5oYW5kbGVQcmVmZXJlbmNlU3RvcmVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5CdXN5U3RhdGUoKSB7Ci0JCXJldHVybiBmQnVzeVN0YXRlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJLy8gaWYgd2UndmUgZ290dGVuIGFuIGVycm9yIGVsc2V3aGVyZSwgYmVmb3JlCi0JCS8vIHdlJ3ZlIGFjdHVhbGx5IG9wZW5lZCwgdGhlbiBkb24ndCBvcGVuLgotCQlpZiAoc2hvdWxkQ2xvc2UpIHsKLQkJCXNldFNpdGUoc2l0ZSk7Ci0JCQljbG9zZShmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZG9jdW1lbnQgcHJvdmlkZXIgZm9yIHRoaXMgZWRpdG9yLgotCSAqIDxwPgotCSAqIE5vdCBBUEkuIE1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudFByb3ZpZGVyCi0JICogICAgICAgICAgICBkb2N1bWVudFByb3ZpZGVyIHRvIGluaXRpYWxpemUKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRG9jdW1lbnRQcm92aWRlcihJRG9jdW1lbnRQcm92aWRlciBkb2N1bWVudFByb3ZpZGVyKSB7Ci0JCWlmIChkb2N1bWVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXNldERvY3VtZW50UHJvdmlkZXIoZG9jdW1lbnRQcm92aWRlcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yI2luaXRpYWxpemVEcmFnQW5kRHJvcChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEcmFnQW5kRHJvcChJU291cmNlVmlld2VyIHZpZXdlcikgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWlmIChzdG9yZSAhPSBudWxsICYmIHN0b3JlLmdldEJvb2xlYW4oUFJFRkVSRU5DRV9URVhUX0RSQUdfQU5EX0RST1BfRU5BQkxFRCkpCi0JCQlpbml0aWFsaXplRHJvcCh2aWV3ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEcm9wKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIpIHsKLQkJaW50IG9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRTsKLQkJZkRyb3BUYXJnZXQgPSBuZXcgRHJvcFRhcmdldCh0ZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKSwgb3BlcmF0aW9ucyk7Ci0JCWZEcm9wQWRhcHRlciA9IG5ldyBSZWFkT25seUF3YXJlRHJvcFRhcmdldEFkYXB0ZXIodHJ1ZSk7Ci0JCWZEcm9wQWRhcHRlci5zZXRUYXJnZXRFZGl0b3IodGhpcyk7Ci0JCWZEcm9wQWRhcHRlci5zZXRUYXJnZXRJRHMoZ2V0Q29uZmlndXJhdGlvblBvaW50cygpKTsKLQkJZkRyb3BBZGFwdGVyLnNldFRleHRWaWV3ZXIodGV4dFZpZXdlcik7Ci0JCWZEcm9wVGFyZ2V0LnNldFRyYW5zZmVyKGZEcm9wQWRhcHRlci5nZXRUcmFuc2ZlcnMoKSk7Ci0JCWZEcm9wVGFyZ2V0LmFkZERyb3BMaXN0ZW5lcihmRHJvcEFkYXB0ZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdERlY29yYXRlZFRleHRFZGl0b3IjaW5pdGlhbGl6ZUVkaXRvcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVkaXRvcigpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUVkaXRvcigpOwotCQkvLyBGSVhNRTogaGVyZSdzIHdoZXJlIHRvIGFkZCBiYWNrIGluIG91ciBjdXN0b20gZW5jb2Rpbmcgc3VwcG9ydAotCQlmRW5jb2RpbmdTdXBwb3J0ID0gbnVsbDsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKGNyZWF0ZUNvbWJpbmVkUHJlZmVyZW5jZVN0b3JlKCkpOwotCi0JCXNldFJhbmdlSW5kaWNhdG9yKG5ldyBEZWZhdWx0UmFuZ2VJbmRpY2F0b3IoKSk7Ci0JCXNldEVkaXRvckNvbnRleHRNZW51SWQoRURJVE9SX0NPTlRFWFRfTUVOVV9JRCk7Ci0JCWluaXRpYWxpemVEb2N1bWVudFByb3ZpZGVyKG51bGwpOwotCQkvLyBzZXQgdGhlIGluZm9wb3AgZm9yIHNvdXJjZSB2aWV3ZXIKLQkJU3RyaW5nIGhlbHBJZCA9IGdldEhlbHBDb250ZXh0SWQoKTsKLQkJLy8gbm8gaW5mb3BvcCBzZXQgb3IgdXNpbmcgZGVmYXVsdCB0ZXh0IGVkaXRvciBoZWxwLCB1c2UgZGVmYXVsdAotCQlpZiAoaGVscElkID09IG51bGwgfHwgSVRleHRFZGl0b3JIZWxwQ29udGV4dElkcy5URVhUX0VESVRPUi5lcXVhbHMoaGVscElkKSkKLQkJCWhlbHBJZCA9IElIZWxwQ29udGV4dElkcy5YTUxfU09VUkNFX1ZJRVdfSEVMUElEOwotCQlzZXRIZWxwQ29udGV4dElkKGhlbHBJZCk7Ci0JCS8vIGRlZmVjdCAyMDMxNTggLSBkaXNhYmxlIHJ1bGVyIGNvbnRleHQgbWVudSBmb3IKLQkJLy8gYmV0YQotCQkvLyBzZXRSdWxlckNvbnRleHRNZW51SWQoUlVMRVJfQ09OVEVYVF9NRU5VX0lEKTsKLQkJY29uZmlndXJlSW5zZXJ0TW9kZShTTUFSVF9JTlNFUlQsIHRydWUpOwotCi0JCS8vIGVuYWJsZSB0aGUgYmFzZSBzb3VyY2UgZWRpdG9yIGFjdGl2aXR5IHdoZW4gZWRpdG9yIG9wZW5zCi0JCXRyeSB7Ci0JCQkvLyBGSVhNRTogLSBjb21tZW50ZWQgb3V0IHRvIGF2b2lkIG1pbm9yIGRlcGVuZGFuY3kgZHVyaW5nCi0JCQkvLyB0cmFuc2l0aW9uIHRvIG9yZy5lY2xpcHNlCi0JCQkvLyBXVFBBY3Rpdml0eUJyaWRnZS5nZXRJbnN0YW5jZSgpLmVuYWJsZUFjdGl2aXR5KENPUkVfU1NFX0FDVElWSVRZX0lELAotCQkJLy8gdHJ1ZSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiB0KSB7Ci0JCQkvLyBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aXRoIGVuYWJsaW5nIGFjdGl2aXR5LCBqdXN0IGxvZyB0aGUKLQkJCS8vIGVycm9yIGJ1dCBkb250Ci0JCQkvLyBoYXZlIGl0IGJyZWFrIHRoZSBlZGl0b3IKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIHQuZ2V0TWVzc2FnZSgpLCB0KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRFZGl0b3IjaW5pdGlhbGl6ZUtleUJpbmRpbmdTY29wZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVLZXlCaW5kaW5nU2NvcGVzKCkgewotCQlzZXRLZXlCaW5kaW5nU2NvcGVzKG5ldyBTdHJpbmdbXXtFRElUT1JfS0VZQklORElOR19TQ09QRV9JRH0pOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBlZGl0b3IncyBzb3VyY2Ugdmlld2VyIGFuZCBvdGhlciBpdGVtcyB0aGF0IHdlcmUgc291cmNlCi0JICogdmlld2VyLWRlcGVuZGVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVNvdXJjZVZpZXdlcigpIHsKLQkJSUFjdGlvbiBjb250ZW50QXNzaXN0QWN0aW9uID0gZ2V0QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0NPTlRFTlRBU1NJU1RfUFJPUE9TQUxTKTsKLQkJaWYgKGNvbnRlbnRBc3Npc3RBY3Rpb24gaW5zdGFuY2VvZiBJVXBkYXRlKSB7Ci0JCQkoKElVcGRhdGUpIGNvbnRlbnRBc3Npc3RBY3Rpb24pLnVwZGF0ZSgpOwotCQl9Ci0JCUlBY3Rpb24gb3Blbkh5cGVybGlua0FjdGlvbiA9IGdldEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9PUEVOX0ZJTEUpOwotCQlpZiAob3Blbkh5cGVybGlua0FjdGlvbiBpbnN0YW5jZW9mIE9wZW5IeXBlcmxpbmtBY3Rpb24pIHsKLQkJCSgoT3Blbkh5cGVybGlua0FjdGlvbikgb3Blbkh5cGVybGlua0FjdGlvbikuc2V0SHlwZXJsaW5rRGV0ZWN0b3JzKGdldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRIeXBlcmxpbmtEZXRlY3RvcnMoZ2V0U291cmNlVmlld2VyKCkpKTsKLQkJfQotCi0JCS8vIGRvIG5vdCBldmVuIGluc3RhbGwgcHJvamVjdGlvbiBzdXBwb3J0IHVudGlsIGZvbGRpbmcgaXMgYWN0dWFsbHkKLQkJLy8gZW5hYmxlZAotCQlpZiAoaXNGb2xkaW5nRW5hYmxlZCgpKSB7Ci0JCQlpbnN0YWxsUHJvamVjdGlvblN1cHBvcnQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRTb3VyY2VWaWV3ZXIoU3RydWN0dXJlZFRleHRWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCS8vIGVuc3VyZSBkZWNvcmF0aW9uIHN1cHBvcnQgaXMgY29uZmlndXJlZAotCQlnZXRTb3VyY2VWaWV3ZXJEZWNvcmF0aW9uU3VwcG9ydChzb3VyY2VWaWV3ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluc3RhbGxUZXh0RHJhZ0FuZERyb3AoSVNvdXJjZVZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRFZGl0b3IjaW5zdGFsbEVuY29kaW5nU3VwcG9ydCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5zdGFsbEVuY29kaW5nU3VwcG9ydCgpIHsKLQkJZkVuY29kaW5nU3VwcG9ydCA9IG5ldyBEZWZhdWx0RW5jb2RpbmdTdXBwb3J0KCkgewotCQkJcHJvdGVjdGVkIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nLCBib29sZWFuIG92ZXJ3cml0ZSkgewotCQkJCXN1cGVyLnNldEVuY29kaW5nKGVuY29kaW5nLCBvdmVyd3JpdGUpOwotCQkJfQotCQl9OwotCQlmRW5jb2RpbmdTdXBwb3J0LmluaXRpYWxpemUodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogSW5zdGFsbCBldmVyeXRoaW5nIG5lY2Vzc2FyeSB0byBnZXQgZG9jdW1lbnQgZm9sZGluZyB3b3JraW5nIGFuZCBlbmFibGUKLQkgKiBkb2N1bWVudCBmb2xkaW5nCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxQcm9qZWN0aW9uU3VwcG9ydCgpIHsKLQkJUHJvamVjdGlvblZpZXdlciBwcm9qZWN0aW9uVmlld2VyID0gKFByb2plY3Rpb25WaWV3ZXIpIGdldFNvdXJjZVZpZXdlcigpOwotCi0JCWZQcm9qZWN0aW9uU3VwcG9ydCA9IG5ldyBQcm9qZWN0aW9uU3VwcG9ydChwcm9qZWN0aW9uVmlld2VyLCBnZXRBbm5vdGF0aW9uQWNjZXNzKCksIGdldFNoYXJlZENvbG9ycygpKTsKLQkJZlByb2plY3Rpb25TdXBwb3J0LmFkZFN1bW1hcml6YWJsZUFubm90YXRpb25UeXBlKCJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci5lcnJvciIpOyAvLyROT04tTkxTLTEkCi0JCWZQcm9qZWN0aW9uU3VwcG9ydC5hZGRTdW1tYXJpemFibGVBbm5vdGF0aW9uVHlwZSgib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3Iud2FybmluZyIpOyAvLyROT04tTkxTLTEkCi0JCWZQcm9qZWN0aW9uU3VwcG9ydC5zZXRIb3ZlckNvbnRyb2xDcmVhdG9yKG5ldyBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcigpIHsKLQkJCXB1YmxpYyBJSW5mb3JtYXRpb25Db250cm9sIGNyZWF0ZUluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnQpIHsKLQkJCQlyZXR1cm4gbmV3IERlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2wocGFyZW50KTsKLQkJCX0KLQkJfSk7Ci0JCWZQcm9qZWN0aW9uU3VwcG9ydC5pbnN0YWxsKCk7Ci0KLQkJSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyIHVwZGF0ZXIgPSBudWxsOwotCQlFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyIGJ1aWxkZXIgPSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCk7Ci0JCVN0cmluZ1tdIGlkcyA9IGdldENvbmZpZ3VyYXRpb25Qb2ludHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IHVwZGF0ZXIgPT0gbnVsbCAmJiBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl1cGRhdGVyID0gKElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlcikgYnVpbGRlci5nZXRDb25maWd1cmF0aW9uKElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlci5JRCwgaWRzW2ldKTsKLQkJfQotCi0JCWZQcm9qZWN0aW9uTW9kZWxVcGRhdGVyID0gdXBkYXRlcjsKLQkJaWYgKGZQcm9qZWN0aW9uTW9kZWxVcGRhdGVyICE9IG51bGwpCi0JCQlmUHJvamVjdGlvbk1vZGVsVXBkYXRlci5pbnN0YWxsKHByb2plY3Rpb25WaWV3ZXIpOwotCi0JCWlmIChpc0ZvbGRpbmdFbmFibGVkKCkpCi0JCQlwcm9qZWN0aW9uVmlld2VyLmRvT3BlcmF0aW9uKFByb2plY3Rpb25WaWV3ZXIuVE9HR0xFKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnN0YWxsIGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIGdldCBkb2N1bWVudCBmb2xkaW5nIHdvcmtpbmcgYW5kIGVuYWJsZQotCSAqIGRvY3VtZW50IGZvbGRpbmcKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlUHJvamVjdGlvblN1cHBvcnQoKSB7Ci0JCS8vIGRpc3Bvc2Ugb2YgcHJldmlvdXMgZG9jdW1lbnQgZm9sZGluZyBzdXBwb3J0Ci0JCWlmIChmUHJvamVjdGlvbk1vZGVsVXBkYXRlciAhPSBudWxsKSB7Ci0JCQlmUHJvamVjdGlvbk1vZGVsVXBkYXRlci51bmluc3RhbGwoKTsKLQkJCWZQcm9qZWN0aW9uTW9kZWxVcGRhdGVyID0gbnVsbDsKLQkJfQotCi0JCVByb2plY3Rpb25WaWV3ZXIgcHJvamVjdGlvblZpZXdlciA9IChQcm9qZWN0aW9uVmlld2VyKSBnZXRTb3VyY2VWaWV3ZXIoKTsKLQkJSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyIHVwZGF0ZXIgPSBudWxsOwotCQlFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyIGJ1aWxkZXIgPSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCk7Ci0JCVN0cmluZ1tdIGlkcyA9IGdldENvbmZpZ3VyYXRpb25Qb2ludHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IHVwZGF0ZXIgPT0gbnVsbCAmJiBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl1cGRhdGVyID0gKElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlcikgYnVpbGRlci5nZXRDb25maWd1cmF0aW9uKElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlci5JRCwgaWRzW2ldKTsKLQkJfQotCi0JCWZQcm9qZWN0aW9uTW9kZWxVcGRhdGVyID0gdXBkYXRlcjsKLQkJaWYgKGZQcm9qZWN0aW9uTW9kZWxVcGRhdGVyICE9IG51bGwpCi0JCQlmUHJvamVjdGlvbk1vZGVsVXBkYXRlci5pbnN0YWxsKHByb2plY3Rpb25WaWV3ZXIpOwotCi0JCWlmIChmUHJvamVjdGlvbk1vZGVsVXBkYXRlciAhPSBudWxsKQotCQkJZlByb2plY3Rpb25Nb2RlbFVwZGF0ZXIuaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGRvY3VtZW50IGZvbGRpbmcgc2hvdWxkIGJlIGVuYWJsZWQgYWNjb3JkaW5nIHRvIHRoZQotCSAqIHByZWZlcmVuY2Ugc3RvcmUgc2V0dGluZ3MuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBkb2N1bWVudCBmb2xkaW5nIHNob3VsZCBiZSBlbmFibGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRm9sZGluZ0VuYWJsZWQoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJLy8gY2hlY2sgYm90aCBwcmVmZXJlbmNlIHN0b3JlIGFuZCB2bSBhcmd1bWVudAotCQlyZXR1cm4gKHN0b3JlLmdldEJvb2xlYW4oSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyLkZPTERJTkdfRU5BQkxFRCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2dVbmV4cGVjdGVkRG9jdW1lbnRLaW5kKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQkvLyBkaXNwbGF5IGEgZGlhbG9nIGluZm9ybWluZyB1c2VyIG9mIHVrbm93biBjb250ZW50IHR5cGUKLQkJaWYgKFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKEVkaXRvclByZWZlcmVuY2VOYW1lcy5TSE9XX1VOS05PV05fQ09OVEVOVF9UWVBFX01TRykpIHsKLQkJCUpvYiBqb2IgPSBuZXcgVUlKb2IoU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvcl8wKSB7Ci0JCQkJcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJVW5rbm93bkNvbnRlbnRUeXBlRGlhbG9nIGRpYWxvZyA9IG5ldyBVbmtub3duQ29udGVudFR5cGVEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCksIFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLlNIT1dfVU5LTk9XTl9DT05URU5UX1RZUEVfTVNHKTsKLQkJCQkJZGlhbG9nLm9wZW4oKTsKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfQotCQkJfTsKLQkJCWpvYi5zY2hlZHVsZSgpOwotCQl9Ci0KLQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIlN0cnVjdHVyZWRUZXh0RWRpdG9yIGJlaW5nIHVzZWQgd2l0aG91dCBTdHJ1Y3R1cmVkRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQluYW1lID0gaW5wdXQuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJbmFtZSA9ICJpbnB1dCB3YXMgbnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiICAgICAgICAgSW5wdXQgTmFtZTogIiArIG5hbWUpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBpbXBsQ2xhc3MgPSBudWxsOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoaW5wdXQpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJaW1wbENsYXNzID0gZG9jdW1lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbXBsQ2xhc3MgPSAiZG9jdW1lbnQgd2FzIG51bGwiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIiAgICAgICAgVW5leHBlY3RlZCBJRG9jdW1lbnRQcm92aWRlciBpbXBsZW1lbnRhdGlvbjogIiArIGdldERvY3VtZW50UHJvdmlkZXIoKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIiAgICAgICAgVW5leHBlY3RlZCBJRG9jdW1lbnQgaW1wbGVtZW50YXRpb246ICIgKyBpbXBsQ2xhc3MpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yI3BlcmZvcm1SZXZlcnQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1SZXZlcnQoKSB7Ci0JCVByb2plY3Rpb25WaWV3ZXIgcHJvamVjdGlvblZpZXdlciA9IChQcm9qZWN0aW9uVmlld2VyKSBnZXRTb3VyY2VWaWV3ZXIoKTsKLQkJcHJvamVjdGlvblZpZXdlci5zZXRSZWRyYXcoZmFsc2UpOwotCQl0cnkgewotCi0JCQlib29sZWFuIHByb2plY3Rpb25Nb2RlID0gcHJvamVjdGlvblZpZXdlci5pc1Byb2plY3Rpb25Nb2RlKCk7Ci0JCQlpZiAocHJvamVjdGlvbk1vZGUpIHsKLQkJCQlwcm9qZWN0aW9uVmlld2VyLmRpc2FibGVQcm9qZWN0aW9uKCk7Ci0JCQkJaWYgKGZQcm9qZWN0aW9uTW9kZWxVcGRhdGVyICE9IG51bGwpCi0JCQkJCWZQcm9qZWN0aW9uTW9kZWxVcGRhdGVyLnVuaW5zdGFsbCgpOwotCQkJfQotCi0JCQlzdXBlci5wZXJmb3JtUmV2ZXJ0KCk7Ci0KLQkJCWlmIChwcm9qZWN0aW9uTW9kZSkgewotCQkJCWlmIChmUHJvamVjdGlvbk1vZGVsVXBkYXRlciAhPSBudWxsKQotCQkJCQlmUHJvamVjdGlvbk1vZGVsVXBkYXRlci5pbnN0YWxsKHByb2plY3Rpb25WaWV3ZXIpOwotCQkJCXByb2plY3Rpb25WaWV3ZXIuZW5hYmxlUHJvamVjdGlvbigpOwotCQkJfQotCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlwcm9qZWN0aW9uVmlld2VyLnNldFJlZHJhdyh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiA8cD4KLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVkdWNlZCB0byBwcm90ZWN0ZWQgbWV0aG9kIGluIHRoZSBmdXR1cmUuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbWVtYmVyU2VsZWN0aW9uKCkgewotCQkvKgotCQkgKiBUaGlzIG1ldGhvZCB3YXMgbWFkZSBwdWJsaWMgZm9yIHVzZSBieSBlZGl0b3JzIHRoYXQgdXNlCi0JCSAqIFN0cnVjdHVyZWRUZXh0RWRpdG9yIChsaWtlIHNvbWUgY2xpZW50cykKLQkJICovCi0JCXN1cGVyLnJlbWVtYmVyU2VsZWN0aW9uKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBib3RoIHN0YXJ0cyBhbmQgcmVzZXRzIHRoZSBidXN5IHN0YXRlIHRpbWVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QnVzeVN0YXRlKCkgewotCQkvLyByZXNldCB0aGUgImJ1c3kiIHRpbWVvdXQKLQkJaWYgKGZCdXN5VGltZXIgIT0gbnVsbCkgewotCQkJZkJ1c3lUaW1lci5jYW5jZWwoKTsKLQkJfQotCQlzdGFydEJ1c3lUaW1lcigpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiA8cD4KLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVkdWNlZCB0byBwcm90ZWN0ZWQgbWV0aG9kIGluIHRoZSBmdXR1cmUuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3RvcmVTZWxlY3Rpb24oKSB7Ci0JCS8qCi0JCSAqIFRoaXMgbWV0aG9kIHdhcyBtYWRlIHB1YmxpYyBmb3IgdXNlIGJ5IGVkaXRvcnMgdGhhdCB1c2UKLQkJICogU3RydWN0dXJlZFRleHRFZGl0b3IgKGxpa2Ugc29tZSBjbGllbnRzKQotCQkgKi8KLQkJLy8gY2F0Y2ggb2RkIGNhc2Ugd2hlcmUgc291cmNlIHZpZXdlciBoYXMgbm8gdGV4dAotCQkvLyB3aWRnZXQgKGRlZmVjdAotCQkvLyAyMjc2NzApCi0JCWlmICgoZ2V0U291cmNlVmlld2VyKCkgIT0gbnVsbCkgJiYgKGdldFNvdXJjZVZpZXdlcigpLmdldFRleHRXaWRnZXQoKSAhPSBudWxsKSkKLQkJCXN1cGVyLnJlc3RvcmVTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yI3J1bGVyQ29udGV4dE1lbnVBYm91dFRvU2hvdyhvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJ1bGVyQ29udGV4dE1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5ydWxlckNvbnRleHRNZW51QWJvdXRUb1Nob3cobWVudSk7Ci0KLQkJSU1lbnVNYW5hZ2VyIGZvbGRpbmdNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKFNTRVVJTWVzc2FnZXMuRm9sZGluZywgInByb2plY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCQltZW51LmFwcGVuZFRvR3JvdXAoSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfUlVMRVJTLCBmb2xkaW5nTWVudSk7Ci0KLQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb24oIkZvbGRpbmdUb2dnbGUiKTsgLy8kTk9OLU5MUy0xJAotCQlmb2xkaW5nTWVudS5hZGQoYWN0aW9uKTsKLQkJYWN0aW9uID0gZ2V0QWN0aW9uKCJGb2xkaW5nRXhwYW5kQWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9sZGluZ01lbnUuYWRkKGFjdGlvbik7Ci0JCWFjdGlvbiA9IGdldEFjdGlvbigiRm9sZGluZ0NvbGxhcHNlQWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9sZGluZ01lbnUuYWRkKGFjdGlvbik7Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBpbnRlcm5hbE1vZGVsID0gZ2V0SW50ZXJuYWxNb2RlbCgpOwotCQlpZiAoaW50ZXJuYWxNb2RlbCAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGRlYnVnZ2luZ0F2YWlsYWJsZSA9IEJyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXIuZ2V0SW5zdGFuY2UoKS5pc0F2YWlsYWJsZShpbnRlcm5hbE1vZGVsLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpLCBCcmVha3BvaW50UnVsZXJBY3Rpb24uZ2V0RmlsZUV4dGVuc2lvbihnZXRFZGl0b3JJbnB1dCgpKSk7Ci0JCQlpZiAoZGVidWdnaW5nQXZhaWxhYmxlKSB7Ci0JCQkJLy8gYXBwZW5kIGFjdGlvbnMgdG8gImRlYnVnIiBncm91cCAoY3JlYXRlZCBpbgotCQkJCS8vIEFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvci5ydWxlckNvbnRleHRNZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyKQotCQkJCW1lbnUuYXBwZW5kVG9Hcm91cCgiZGVidWciLCBnZXRBY3Rpb24oQWN0aW9uRGVmaW5pdGlvbklkcy5UT0dHTEVfQlJFQUtQT0lOVFMpKTsgLy8kTk9OLU5MUy0xJAotCQkJCW1lbnUuYXBwZW5kVG9Hcm91cCgiZGVidWciLCBnZXRBY3Rpb24oQWN0aW9uRGVmaW5pdGlvbklkcy5NQU5BR0VfQlJFQUtQT0lOVFMpKTsgLy8kTk9OLU5MUy0xJAotCQkJCW1lbnUuYXBwZW5kVG9Hcm91cCgiZGVidWciLCBnZXRBY3Rpb24oQWN0aW9uRGVmaW5pdGlvbklkcy5FRElUX0JSRUFLUE9JTlRTKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWFkZEV4dGVuZGVkUnVsZXJDb250ZXh0TWVudUFjdGlvbnMobWVudSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogPHA+Ci0JICogT3ZlcnJpZGRlbiB0byBleHBvc2UgcGFydCBhY3RpdmF0aW9uIGhhbmRsaW5nIGZvciBtdWx0aS1wYWdlIGVkaXRvcnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIE5vdCBBUEkuIE1heSBiZSByZWR1Y2VkIHRvIHByb3RlY3RlZCBtZXRob2QgaW4gdGhlIGZ1dHVyZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0VGV4dEVkaXRvciNzYWZlbHlTYW5pdHlDaGVja1N0YXRlKG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYWZlbHlTYW5pdHlDaGVja1N0YXRlKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5zYWZlbHlTYW5pdHlDaGVja1N0YXRlKGlucHV0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2FuaXR5Q2hlY2tTdGF0ZShJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJdHJ5IHsKLQkJCSsrdmFsaWRhdGVFZGl0Q291bnQ7Ci0JCQlzdXBlci5zYW5pdHlDaGVja1N0YXRlKGlucHV0KTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS0tdmFsaWRhdGVFZGl0Q291bnQ7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZWRNb2RlbCgpIHsKLQkJaWYgKGdldEludGVybmFsTW9kZWwoKSAhPSBudWxsKSB7Ci0JCQlnZXRJbnRlcm5hbE1vZGVsKCkuY2hhbmdlZE1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgdGhhdCB0aGUgY29ycmVjdCBJRG9jdW1lbnRQcm92aWRlciBpcyB1c2VkLiBGb3IgZGlyZWN0IG1vZGVscywgYQotCSAqIHNwZWNpYWwgcHJvdmlkZXIgaXMgdXNlZC4gRm9yIFN0b3JhZ2VFZGl0b3JJbnB1dHMsIHVzZSBhIGN1c3RvbQotCSAqIHByb3ZpZGVyIHRoYXQgY3JlYXRlcyBhIHVzYWJsZSBSZXNvdXJjZUFubm90YXRpb25Nb2RlbC4gRm9yIGV2ZXJ5dGhpbmcKLQkgKiBlbHNlLCB1c2UgdGhlIGJhc2Ugc3VwcG9ydC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yI3NldERvY3VtZW50UHJvdmlkZXIob3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50UHJvdmlkZXIoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCS8vIGxhcmdlbHkgdW50ZXN0ZWQKLQkJCXNldERvY3VtZW50UHJvdmlkZXIoU3RydWN0dXJlZE1vZGVsRG9jdW1lbnRQcm92aWRlci5nZXRJbnN0YW5jZSgpKTsKLQkJfQotCQllbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQgJiYgIShpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpKSB7Ci0JCQlzZXREb2N1bWVudFByb3ZpZGVyKFN0b3JhZ2VNb2RlbFByb3ZpZGVyLmdldEluc3RhbmNlKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJc3VwZXIuc2V0RG9jdW1lbnRQcm92aWRlcihpbnB1dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgZWRpdG9yIHBhcnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWRpdG9yLgotCSAqIDxwPgotCSAqIE5vdCBBUEkuIE1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBlZGl0b3JQYXJ0Ci0JICogICAgICAgICAgICBlZGl0b3IgcGFydCBhc3NvY2lhdGVkIHdpdGggdGhpcyBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0b3JQYXJ0KElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpIHsKLQkJZkVkaXRvclBhcnQgPSBlZGl0b3JQYXJ0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGVsIGZpZWxkIHdpdGhpbiB0aGlzIGVkaXRvci4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtIGNhbiBldmVudHVhbGx5IGJlIGVsaW1pbmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0TW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGdldERvY3VtZW50UHJvdmlkZXIoKSwgImRvY3VtZW50IHByb3ZpZGVyIGNhbiBub3QgYmUgbnVsbCB3aGVuIHNldHRpbmcgbW9kZWwiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZlN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlpZiAoZlN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSAhPSBudWxsICYmIGZJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCWZTdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcihmSW50ZXJuYWxEb2N1bWVudExpc3RlbmVyKTsKLQkJCX0KLQkJCWZTdHJ1Y3R1cmVkTW9kZWwucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKGdldEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCkpOwotCQl9Ci0JCWZTdHJ1Y3R1cmVkTW9kZWwgPSBuZXdNb2RlbDsKLQkJaWYgKGZTdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJaWYgKGZTdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJCWZTdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuYWRkRG9jdW1lbnRMaXN0ZW5lcihnZXRJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIoKSk7Ci0JCQl9Ci0JCQlmU3RydWN0dXJlZE1vZGVsLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcihnZXRJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcigpKTsKLQkJfQotCQkvLyB1cGRhdGUoKSBzaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBtb2RlbCBpcwotCQkvLyBzZXQgb3IgY2hhbmdlZAotCQl1cGRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBlZGl0b3IncyBzb3VyY2Ugdmlld2VyIGNvbmZpZ3VyYXRpb24gd2hpY2ggaXQgdXNlcyB0bwotCSAqIGNvbmZpZ3VyZSBpdCdzIGludGVybmFsIHNvdXJjZSB2aWV3ZXIuIFRoaXMgbWV0aG9kIHdhcyBvdmVyd3JpdHRlbiBzbwotCSAqIHRoYXQgdmlld2VyIGNvbmZpZ3VyYXRpb24gY291bGQgYmUgc2V0IGFmdGVyIGVkaXRvciBwYXJ0IHdhcyBjcmVhdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJc3VwZXIuc2V0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbihjb25maWcpOwotCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlciBzdHYgPSBnZXRUZXh0Vmlld2VyKCk7Ci0JCWlmIChzdHYgIT0gbnVsbCkgewotCQkJLy8gdGhlcmUgc2hvdWxkIGJlIG5vIG5lZWQgdG8gdW5jb25maWd1cmUKLQkJCS8vIGJlZm9yZSBjb25maWd1cmUgYmVjYXVzZQotCQkJLy8gY29uZmlndXJlIHdpbGwKLQkJCS8vIGFsc28gdW5jb25maWd1cmUgYmVmb3JlIGNvbmZpZ3VyaW5nCi0JCQlzdHYudW5jb25maWd1cmUoKTsKLQkJCXN0di5jb25maWd1cmUoY29uZmlnKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I3Nob3dCdXN5KGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2hvd0J1c3koYm9vbGVhbiBidXN5KSB7Ci0JCWlmIChidXN5KSB7Ci0JCQlmUmVtZW1iZXJUaXRsZSA9IGdldFBhcnROYW1lKCk7Ci0JCQkvLyB1cGRhdGUgdGl0bGUgYW5kL29yIGZvbnRzIGFuZC9vciBiYWNrZ3JvdW5kCi0JCQkvLwotCQkJLy8gdGVtcCBzb2x1dGlvbiwgZm9yIHRlc3RpbmcsIHVzZXMgImJ1c3kiCi0JCQlzZXRQYXJ0TmFtZShTU0VVSU1lc3NhZ2VzLmJ1c3kpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQkvLyByZXNldCB0byB3aGF0IGl0IHdhcwotCQkJc2V0UGFydE5hbWUoZlJlbWVtYmVyVGl0bGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0QnVzeVRpbWVyKCkgewotCQkvLyBUT0RPOiB3ZSBuZWVkIGEgcmVzZXR0YWJsZSB0aW1lciwgc28gbm90IHNvCi0JCS8vIG1hbnkgYXJlIGNyZWF0ZWQKLQkJZkJ1c3lUaW1lciA9IG5ldyBUaW1lcih0cnVlKTsKLQkJZkJ1c3lUaW1lci5zY2hlZHVsZShuZXcgVGltZU91dEV4cGlyZWQoKSwgQlVTWV9TVEFURV9ERUxBWSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdW5pbnN0YWxsVGV4dERyYWdBbmREcm9wKElTb3VyY2VWaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgc2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciB0aGUgbW9kZWwgaXMgc2V0IG9yIGNoYW5nZWQgKGFzIGluCi0JICogc3dhcHBlZCkKLQkgKiA8cD4KLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCWlmIChmT3V0bGluZVBhZ2UgIT0gbnVsbCAmJiBmT3V0bGluZVBhZ2UgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UpIHsKLQkJCUNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiBjZmcgPSBjcmVhdGVDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24oKTsKLQkJCSgoQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlKSBmT3V0bGluZVBhZ2UpLnNldENvbmZpZ3VyYXRpb24oY2ZnKTsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgaW50ZXJuYWxNb2RlbCA9IGdldEludGVybmFsTW9kZWwoKTsKLQkJCSgoQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlKSBmT3V0bGluZVBhZ2UpLnNldElucHV0Q29udGVudFR5cGVJZGVudGlmaWVyKGludGVybmFsTW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkpOwotCQkJKChDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UpIGZPdXRsaW5lUGFnZSkuc2V0SW5wdXQoaW50ZXJuYWxNb2RlbCk7Ci0JCX0KLQkJaWYgKGZQcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsICYmIGZQcm9wZXJ0eVNoZWV0UGFnZSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZVByb3BlcnR5U2hlZXRQYWdlKSB7Ci0JCQlQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiBjZmcgPSBjcmVhdGVQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbigpOwotCQkJKChDb25maWd1cmFibGVQcm9wZXJ0eVNoZWV0UGFnZSkgZlByb3BlcnR5U2hlZXRQYWdlKS5zZXRDb25maWd1cmF0aW9uKGNmZyk7Ci0JCX0KLQkJZGlzcG9zZU1vZGVsRGVwZW5kZW50RmllbGRzKCk7Ci0KLQkJZlNob3dJblRhcmdldElkcyA9IGNyZWF0ZVNob3dJblRhcmdldElkcygpOwotCi0JCWlmIChnZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gJiYgZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWZTdGF0dXNMaW5lTGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQotCQl1cGRhdGVTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCk7Ci0KLQkJaWYgKGdldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKSBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbikgewotCQkJZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyID0gKChTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24pIGdldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKSkuZ2V0U3RhdHVzTGluZUxhYmVsUHJvdmlkZXIoZ2V0U291cmNlVmlld2VyKCkpOwotCQkJdXBkYXRlU3RhdHVzTGluZShudWxsKTsKLQkJfQotCi0JCWlmIChmU3RydWN0dXJlZFNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWZTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXIuc2V0RG9jdW1lbnQoZ2V0SW50ZXJuYWxNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJfQotCi0JCWNyZWF0ZU1vZGVsRGVwZW5kZW50RmllbGRzKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBhbGwgY29udGVudCBkZXBlbmRlbnQgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250ZW50RGVwZW5kZW50QWN0aW9ucygpIHsKLQkJc3VwZXIudXBkYXRlQ29udGVudERlcGVuZGVudEFjdGlvbnMoKTsKLQkJLy8gc3VwZXIudXBkYXRlQ29udGVudERlcGVuZGVudEFjdGlvbnMgb25seSB1cGRhdGVzCi0JCS8vIHRoZSBlbmFibGUvZGlzYWJsZQotCQkvLyBzdGF0ZSBvZiBhbGwKLQkJLy8gdGhlIGNvbnRlbnQgZGVwZW5kZW50IGFjdGlvbnMuCi0JCS8vIFN0cnVjdHVyZWRUZXh0RWRpdG9yJ3MgdW5kbyBhbmQgcmVkbyBhY3Rpb25zCi0JCS8vIGhhdmUgYSBkZXRhaWwgbGFiZWwgYW5kCi0JCS8vIGRlc2NyaXB0aW9uLgotCQkvLyBUaGV5IG5lZWRlZCB0byBiZSB1cGRhdGVkLgotCQlpZiAoIWZFZGl0b3JEaXNwb3NlZCkKLQkJCXVwZGF0ZU1lbnVUZXh0KCk7Ci0JfQotCi0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBlZGl0b3IgY29udGV4dCBtZW51IGJ5IGNyZWF0aW5nIGEgbmV3IGNvbnRleHQgbWVudSB3aXRoIHRoZQotCSAqIGdpdmVuIG1lbnUgaWQKLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dE1lbnVJZAotCSAqICAgICAgICAgICAgQ2Fubm90IGJlIG51bGwKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlRWRpdG9yQ29udGV4dE1lbnVJZChTdHJpbmcgY29udGV4dE1lbnVJZCkgewotCQkvLyB1cGRhdGUgZWRpdG9yIGNvbnRleHQgbWVudSBpZCBpZiB1cGRhdGluZyB0byBhIG5ldyBpZCBvciBpZiBjb250ZXh0Ci0JCS8vIG1lbnUgaXMgbm90IGFscmVhZHkgc2V0IHVwCi0JCWlmICghY29udGV4dE1lbnVJZC5lcXVhbHMoZ2V0RWRpdG9yQ29udGV4dE1lbnVJZCgpKSB8fCAoZlRleHRDb250ZXh0TWVudSA9PSBudWxsKSkgewotCQkJc2V0RWRpdG9yQ29udGV4dE1lbnVJZChjb250ZXh0TWVudUlkKTsKLQotCQkJaWYgKGdldFNvdXJjZVZpZXdlcigpICE9IG51bGwpIHsKLQkJCQlTdHlsZWRUZXh0IHN0eWxlZFRleHQgPSBnZXRTb3VyY2VWaWV3ZXIoKS5nZXRUZXh0V2lkZ2V0KCk7Ci0JCQkJaWYgKHN0eWxlZFRleHQgIT0gbnVsbCkgewotCQkJCQkvLyBkaXNwb3NlIG9mIHByZXZpb3VzIGNvbnRleHQgbWVudQotCQkJCQlpZiAoZlRleHRDb250ZXh0TWVudSAhPSBudWxsKSB7Ci0JCQkJCQlmVGV4dENvbnRleHRNZW51LmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCQlpZiAoZlRleHRDb250ZXh0TWVudU1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQkJZlRleHRDb250ZXh0TWVudU1hbmFnZXIucmVtb3ZlTWVudUxpc3RlbmVyKGdldENvbnRleHRNZW51TGlzdGVuZXIoKSk7Ci0JCQkJCQlmVGV4dENvbnRleHRNZW51TWFuYWdlci5yZW1vdmVBbGwoKTsKLQkJCQkJCWZUZXh0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJCQkJfQotCi0JCQkJCWZUZXh0Q29udGV4dE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKGdldEVkaXRvckNvbnRleHRNZW51SWQoKSwgZ2V0RWRpdG9yQ29udGV4dE1lbnVJZCgpKTsKLQkJCQkJZlRleHRDb250ZXh0TWVudU1hbmFnZXIuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotCQkJCQlmVGV4dENvbnRleHRNZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIoZ2V0Q29udGV4dE1lbnVMaXN0ZW5lcigpKTsKLQotCQkJCQlmVGV4dENvbnRleHRNZW51ID0gZlRleHRDb250ZXh0TWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUoc3R5bGVkVGV4dCk7Ci0JCQkJCXN0eWxlZFRleHQuc2V0TWVudShmVGV4dENvbnRleHRNZW51KTsKLQotCQkJCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShnZXRFZGl0b3JDb250ZXh0TWVudUlkKCksIGZUZXh0Q29udGV4dE1lbnVNYW5hZ2VyLCBnZXRTZWxlY3Rpb25Qcm92aWRlcigpKTsKLQotCQkJCQkvLyBhbHNvIHJlZ2lzdGVyIHRoaXMgbWVudSBmb3Igc291cmNlIHBhZ2UgcGFydCBhbmQKLQkJCQkJLy8gc3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpZHMKLQkJCQkJU3RyaW5nIHBhcnRJZCA9IGdldFNpdGUoKS5nZXRJZCgpOwotCQkJCQlpZiAocGFydElkICE9IG51bGwpIHsKLQkJCQkJCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KHBhcnRJZCArIEVESVRPUl9DT05URVhUX01FTlVfU1VGRklYLCBmVGV4dENvbnRleHRNZW51TWFuYWdlciwgZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSk7Ci0JCQkJCX0KLQkJCQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoRURJVE9SX0NPTlRFWFRfTUVOVV9JRCwgZlRleHRDb250ZXh0TWVudU1hbmFnZXIsIGdldFNlbGVjdGlvblByb3ZpZGVyKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgZWRpdG9yIGNvbnRleHQgbWVudSwgdmVydGljYWwgcnVsZXIgbWVudSwgaGVscCBjb250ZXh0IGlkIGZvcgotCSAqIG5ldyBjb250ZW50IHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlRWRpdG9yQ29udHJvbHNGb3JDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCXVwZGF0ZUVkaXRvckNvbnRleHRNZW51SWQoRURJVE9SX0NPTlRFWFRfTUVOVV9JRCk7Ci0JCQl1cGRhdGVSdWxlckNvbnRleHRNZW51SWQoUlVMRVJfQ09OVEVYVF9NRU5VX0lEKTsKLQkJCXVwZGF0ZUhlbHBDb250ZXh0SWQoSVRleHRFZGl0b3JIZWxwQ29udGV4dElkcy5URVhUX0VESVRPUik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl1cGRhdGVFZGl0b3JDb250ZXh0TWVudUlkKGNvbnRlbnRUeXBlICsgRURJVE9SX0NPTlRFWFRfTUVOVV9TVUZGSVgpOwotCQkJdXBkYXRlUnVsZXJDb250ZXh0TWVudUlkKGNvbnRlbnRUeXBlICsgUlVMRVJfQ09OVEVYVF9NRU5VX1NVRkZJWCk7Ci0JCQl1cGRhdGVIZWxwQ29udGV4dElkKGNvbnRlbnRUeXBlICsgIl9zb3VyY2VfSGVscElkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJLyogQWN0aXZhdGUgdGhlIGNvbnRleHRzIGRlZmluZWQgZm9yIHRoaXMgZWRpdG9yICovCi0JCQlhY3RpdmF0ZUNvbnRleHRzKChJQ29udGV4dFNlcnZpY2UpIGdldFNpdGUoKS5nZXRTZXJ2aWNlKElDb250ZXh0U2VydmljZS5jbGFzcykpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVFbmNvZGluZ01lbWVudG8oKSB7Ci0JCWJvb2xlYW4gZmFpbGVkID0gZmFsc2U7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgaW50ZXJuYWxNb2RlbCA9IGdldEludGVybmFsTW9kZWwoKTsKLQkJaWYgKGludGVybmFsTW9kZWwgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBpbnRlcm5hbE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJRW5jb2RpbmdNZW1lbnRvIG1lbWVudG8gPSBkb2MuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBpbnRlcm5hbE1vZGVsLmdldE1vZGVsSGFuZGxlcigpLmdldEVuY29kaW5nRGV0ZWN0b3IoKTsKLQkJCWlmIChtZW1lbnRvICE9IG51bGwgJiYgZGV0ZWN0b3IgIT0gbnVsbCkKLQkJCQlkZXRlY3Rvci5zZXQoZG9jKTsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIG5ld0VuY29kaW5nID0gZGV0ZWN0b3IuZ2V0RW5jb2RpbmcoKTsKLQkJCQlpZiAobmV3RW5jb2RpbmcgIT0gbnVsbCkgewotCQkJCQltZW1lbnRvLnNldERldGVjdGVkQ2hhcnNldE5hbWUobmV3RW5jb2RpbmcpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbGVkID0gdHJ1ZTsKLQkJCX0KLQkJCS8qKgotCQkJICogQmUgc3VyZSB0byB1c2UgdGhlIG5ldyB2YWx1ZSBidXQgb25seSBpZiBubyBleGNlcHRpb24KLQkJCSAqIG9jY3VycmVkLiAod2UgbWF5IGZpbmQgY2FzZXMgd2UgbmVlZCB0byBkbyBtb3JlIGVycm9yIHJlY292ZXJ5Ci0JCQkgKiB0aGVyZSkgc2hvdWxkIGJlIG5lYXIgaW1wb3NzaWJsZSB0byBnZXQgSU9FeGNlcHRpb24gZnJvbQotCQkJICogcHJvY2Vzc2luZyB0aGUgX2RvY3VtZW50XwotCQkJICovCi0JCQlpZiAoIWZhaWxlZCkgewotCQkJCWRvYy5zZXRFbmNvZGluZ01lbWVudG8obWVtZW50byk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBoZWxwIGNvbnRleHQgb2YgdGhlIGVkaXRvciB3aXRoIHRoZSBnaXZlbiBoZWxwIGNvbnRleHQgaWQKLQkgKiAKLQkgKiBAcGFyYW0gaGVscENvbnRleHRJZAotCSAqICAgICAgICAgICAgQ2Fubm90IGJlIG51bGwKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlSGVscENvbnRleHRJZChTdHJpbmcgaGVscENvbnRleHRJZCkgewotCQlpZiAoIWhlbHBDb250ZXh0SWQuZXF1YWxzKGdldEhlbHBDb250ZXh0SWQoKSkpIHsKLQkJCXNldEhlbHBDb250ZXh0SWQoaGVscENvbnRleHRJZCk7Ci0KLQkJCWlmIChnZXRTb3VyY2VWaWV3ZXIoKSAhPSBudWxsKSB7Ci0JCQkJU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gZ2V0U291cmNlVmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpOwotCQkJCWlmIChzdHlsZWRUZXh0ICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCQkJCQloZWxwU3lzdGVtLnNldEhlbHAoc3R5bGVkVGV4dCwgZ2V0SGVscENvbnRleHRJZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFVwZGF0ZSB0aGUgaG92ZXJpbmcgYmVoYXZpb3IgZGVwZW5kaW5nIG9uIHRoZSBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlSG92ZXJCZWhhdmlvcigpIHsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gZ2V0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpOwotCQlTdHJpbmdbXSB0eXBlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhnZXRTb3VyY2VWaWV3ZXIoKSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCi0JCQlTdHJpbmcgdCA9IHR5cGVzW2ldOwotCi0JCQlJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciA9IGdldFNvdXJjZVZpZXdlcigpOwotCQkJaWYgKHNvdXJjZVZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uMikgewotCQkJCS8vIFJlbW92ZSBleGlzdGluZyBob3ZlcnMKLQkJCQkoKElUZXh0Vmlld2VyRXh0ZW5zaW9uMikgc291cmNlVmlld2VyKS5yZW1vdmVUZXh0SG92ZXJzKHQpOwotCi0JCQkJaW50W10gc3RhdGVNYXNrcyA9IGNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZFRleHRIb3ZlclN0YXRlTWFza3MoZ2V0U291cmNlVmlld2VyKCksIHQpOwotCi0JCQkJaWYgKHN0YXRlTWFza3MgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHN0YXRlTWFza3MubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWludCBzdGF0ZU1hc2sgPSBzdGF0ZU1hc2tzW2pdOwotCQkJCQkJSVRleHRIb3ZlciB0ZXh0SG92ZXIgPSBjb25maWd1cmF0aW9uLmdldFRleHRIb3Zlcihzb3VyY2VWaWV3ZXIsIHQsIHN0YXRlTWFzayk7Ci0JCQkJCQkoKElUZXh0Vmlld2VyRXh0ZW5zaW9uMikgc291cmNlVmlld2VyKS5zZXRUZXh0SG92ZXIodGV4dEhvdmVyLCB0LCBzdGF0ZU1hc2spOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlJVGV4dEhvdmVyIHRleHRIb3ZlciA9IGNvbmZpZ3VyYXRpb24uZ2V0VGV4dEhvdmVyKHNvdXJjZVZpZXdlciwgdCk7Ci0JCQkJCSgoSVRleHRWaWV3ZXJFeHRlbnNpb24yKSBzb3VyY2VWaWV3ZXIpLnNldFRleHRIb3Zlcih0ZXh0SG92ZXIsIHQsIElUZXh0Vmlld2VyRXh0ZW5zaW9uMi5ERUZBVUxUX0hPVkVSX1NUQVRFX01BU0spOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCQlzb3VyY2VWaWV3ZXIuc2V0VGV4dEhvdmVyKGNvbmZpZ3VyYXRpb24uZ2V0VGV4dEhvdmVyKHNvdXJjZVZpZXdlciwgdCksIHQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZU1lbnVUZXh0KCkgewotCQlpZiAoZlN0cnVjdHVyZWRNb2RlbCAhPSBudWxsICYmICFmU3RydWN0dXJlZE1vZGVsLmlzTW9kZWxTdGF0ZUNoYW5naW5nKCkgJiYgZ2V0VGV4dFZpZXdlcigpLmdldFRleHRXaWRnZXQoKSAhPSBudWxsKSB7Ci0JCQkvLyBwZXJmb3JtYW5jZTogZG9uJ3QgZm9yY2UgYW4gdXBkYXRlIG9mIHRoZSBhY3Rpb24gYmFycyB1bmxlc3MKLQkJCS8vIHJlcXVpcmVkIGFzIGl0IGlzIGV4cGVuc2l2ZQotCQkJU3RyaW5nIHByZXZpb3VzVW5kb1RleHQgPSBudWxsOwotCQkJU3RyaW5nIHByZXZpb3VzVW5kb0Rlc2MgPSBudWxsOwotCQkJU3RyaW5nIHByZXZpb3VzUmVkb1RleHQgPSBudWxsOwotCQkJU3RyaW5nIHByZXZpb3VzUmVkb0Rlc2MgPSBudWxsOwotCQkJYm9vbGVhbiB1cGRhdGVBY3Rpb25zID0gZmFsc2U7Ci0JCQlJQWN0aW9uIHVuZG9BY3Rpb24gPSBnZXRBY3Rpb24oSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ETyk7Ci0JCQlJQWN0aW9uIHJlZG9BY3Rpb24gPSBnZXRBY3Rpb24oSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUkVETyk7Ci0JCQlpZiAodW5kb0FjdGlvbiAhPSBudWxsKSB7Ci0JCQkJcHJldmlvdXNVbmRvVGV4dCA9IHVuZG9BY3Rpb24uZ2V0VGV4dCgpOwotCQkJCXByZXZpb3VzVW5kb0Rlc2MgPSB1bmRvQWN0aW9uLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJdXBkYXRlQWN0aW9ucyA9IHVwZGF0ZUFjdGlvbnMgfHwgcHJldmlvdXNVbmRvVGV4dCA9PSBudWxsIHx8IHByZXZpb3VzVW5kb0Rlc2MgPT0gbnVsbDsKLQkJCQl1bmRvQWN0aW9uLnNldFRleHQoVU5ET19BQ1RJT05fVEVYVF9ERUZBVUxUKTsKLQkJCQl1bmRvQWN0aW9uLnNldERlc2NyaXB0aW9uKFVORE9fQUNUSU9OX0RFU0NfREVGQVVMVCk7Ci0JCQl9Ci0JCQlpZiAocmVkb0FjdGlvbiAhPSBudWxsKSB7Ci0JCQkJcHJldmlvdXNSZWRvVGV4dCA9IHJlZG9BY3Rpb24uZ2V0VGV4dCgpOwotCQkJCXByZXZpb3VzUmVkb0Rlc2MgPSByZWRvQWN0aW9uLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJdXBkYXRlQWN0aW9ucyA9IHVwZGF0ZUFjdGlvbnMgfHwgcHJldmlvdXNSZWRvVGV4dCA9PSBudWxsIHx8IHByZXZpb3VzUmVkb0Rlc2MgPT0gbnVsbDsKLQkJCQlyZWRvQWN0aW9uLnNldFRleHQoUkVET19BQ1RJT05fVEVYVF9ERUZBVUxUKTsKLQkJCQlyZWRvQWN0aW9uLnNldERlc2NyaXB0aW9uKFJFRE9fQUNUSU9OX0RFU0NfREVGQVVMVCk7Ci0JCQl9Ci0JCQlpZiAoZlN0cnVjdHVyZWRNb2RlbC5nZXRVbmRvTWFuYWdlcigpICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bmRvTWFuYWdlciA9IGZTdHJ1Y3R1cmVkTW9kZWwuZ2V0VW5kb01hbmFnZXIoKTsKLQkJCQkvLyBnZXQgdW5kbyBjb21tYW5kCi0JCQkJQ29tbWFuZCB1bmRvQ29tbWFuZCA9IHVuZG9NYW5hZ2VyLmdldFVuZG9Db21tYW5kKCk7Ci0JCQkJLy8gc2V0IHVuZG8gbGFiZWwgYW5kIGRlc2NyaXB0aW9uCi0JCQkJdW5kb0FjdGlvbi5zZXRFbmFibGVkKHVuZG9NYW5hZ2VyLnVuZG9hYmxlKCkpOwotCQkJCWlmICh1bmRvQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBsYWJlbCA9IHVuZG9Db21tYW5kLmdldExhYmVsKCk7Ci0JCQkJCWlmIChsYWJlbCAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgY3VzdG9tVGV4dCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFVORE9fQUNUSU9OX1RFWFQsIG5ldyBTdHJpbmdbXXtsYWJlbH0pOwotCQkJCQkJdXBkYXRlQWN0aW9ucyA9IHVwZGF0ZUFjdGlvbnMgfHwgY3VzdG9tVGV4dCA9PSBudWxsIHx8IHByZXZpb3VzVW5kb1RleHQgPT0gbnVsbCB8fCAhY3VzdG9tVGV4dC5lcXVhbHMocHJldmlvdXNVbmRvVGV4dCk7Ci0JCQkJCQl1bmRvQWN0aW9uLnNldFRleHQoY3VzdG9tVGV4dCk7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIGRlc2MgPSB1bmRvQ29tbWFuZC5nZXREZXNjcmlwdGlvbigpOwotCQkJCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgY3VzdG9tRGVzYyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFVORE9fQUNUSU9OX0RFU0MsIG5ldyBTdHJpbmdbXXtkZXNjfSk7Ci0JCQkJCQl1cGRhdGVBY3Rpb25zID0gdXBkYXRlQWN0aW9ucyB8fCBjdXN0b21EZXNjID09IG51bGwgfHwgcHJldmlvdXNSZWRvRGVzYyA9PSBudWxsIHx8ICFjdXN0b21EZXNjLmVxdWFscyhwcmV2aW91c1VuZG9EZXNjKTsKLQkJCQkJCXVuZG9BY3Rpb24uc2V0RGVzY3JpcHRpb24oY3VzdG9tRGVzYyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gZ2V0IHJlZG8gY29tbWFuZAotCQkJCUNvbW1hbmQgcmVkb0NvbW1hbmQgPSB1bmRvTWFuYWdlci5nZXRSZWRvQ29tbWFuZCgpOwotCQkJCS8vIHNldCByZWRvIGxhYmVsIGFuZCBkZXNjcmlwdGlvbgotCQkJCXJlZG9BY3Rpb24uc2V0RW5hYmxlZCh1bmRvTWFuYWdlci5yZWRvYWJsZSgpKTsKLQkJCQlpZiAocmVkb0NvbW1hbmQgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgbGFiZWwgPSByZWRvQ29tbWFuZC5nZXRMYWJlbCgpOwotCQkJCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGN1c3RvbVRleHQgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChSRURPX0FDVElPTl9URVhULCBuZXcgU3RyaW5nW117bGFiZWx9KTsKLQkJCQkJCXVwZGF0ZUFjdGlvbnMgPSB1cGRhdGVBY3Rpb25zIHx8IGN1c3RvbVRleHQgPT0gbnVsbCB8fCBwcmV2aW91c1JlZG9UZXh0ID09IG51bGwgfHwgIWN1c3RvbVRleHQuZXF1YWxzKHByZXZpb3VzUmVkb1RleHQpOwotCQkJCQkJcmVkb0FjdGlvbi5zZXRUZXh0KGN1c3RvbVRleHQpOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBkZXNjID0gcmVkb0NvbW1hbmQuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGN1c3RvbURlc2MgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChSRURPX0FDVElPTl9ERVNDLCBuZXcgU3RyaW5nW117ZGVzY30pOwotCQkJCQkJdXBkYXRlQWN0aW9ucyA9IHVwZGF0ZUFjdGlvbnMgfHwgY3VzdG9tRGVzYyA9PSBudWxsIHx8IHByZXZpb3VzUmVkb0Rlc2MgPT0gbnVsbCB8fCAhY3VzdG9tRGVzYy5lcXVhbHMocHJldmlvdXNSZWRvRGVzYyk7Ci0JCQkJCQlyZWRvQWN0aW9uLnNldERlc2NyaXB0aW9uKGN1c3RvbURlc2MpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gdGVsbCB0aGUgYWN0aW9uIGJhcnMgdG8gdXBkYXRlCi0JCQlpZiAodXBkYXRlQWN0aW9ucykgewotCQkJCWlmIChnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpICE9IG51bGwpIHsKLQkJCQkJZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS51cGRhdGVBY3Rpb25CYXJzKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGdldEVkaXRvclBhcnQoKSAhPSBudWxsICYmIGdldEVkaXRvclBhcnQoKS5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpICE9IG51bGwpIHsKLQkJCQkJZ2V0RWRpdG9yUGFydCgpLmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkudXBkYXRlQWN0aW9uQmFycygpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgdXBkYXRlUmFuZ2VJbmRpY2F0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWJvb2xlYW4gcmFuZ2VVcGRhdGVkID0gZmFsc2U7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiAmJiAhKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIG9iamVjdHMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvQXJyYXkoKTsKLQkJCWlmIChvYmplY3RzLmxlbmd0aCA+IDAgJiYgb2JqZWN0c1swXSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG9iamVjdHNbMF0pLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgb2JqZWN0c1swXSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJaWYgKG9iamVjdHMubGVuZ3RoID4gMSkgewotCQkJCQlmb3IgKGludCBpID0gMTsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCXN0YXJ0ID0gTWF0aC5taW4oc3RhcnQsICgoSW5kZXhlZFJlZ2lvbikgb2JqZWN0c1tpXSkuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCQllbmQgPSBNYXRoLm1heChlbmQsICgoSW5kZXhlZFJlZ2lvbikgb2JqZWN0c1tpXSkuZ2V0RW5kT2Zmc2V0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWdldFNvdXJjZVZpZXdlcigpLnNldFJhbmdlSW5kaWNhdGlvbihzdGFydCwgZW5kIC0gc3RhcnQsIGZhbHNlKTsKLQkJCQlyYW5nZVVwZGF0ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmICghcmFuZ2VVcGRhdGVkKSB7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCQlnZXRTb3VyY2VWaWV3ZXIoKS5zZXRSYW5nZUluZGljYXRpb24oKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRPZmZzZXQoKSwgKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRMZW5ndGgoKSwgZmFsc2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZ2V0U291cmNlVmlld2VyKCkucmVtb3ZlUmFuZ2VJbmRpY2F0aW9uKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGVkaXRvciB2ZXJ0aWNhbCBydWxlciBtZW51IGJ5IGNyZWF0aW5nIGEgbmV3IHZlcnRpY2FsIHJ1bGVyCi0JICogY29udGV4dCBtZW51IHdpdGggdGhlIGdpdmVuIG1lbnUgaWQKLQkgKiAKLQkgKiBAcGFyYW0gcnVsZXJNZW51SWQKLQkgKiAgICAgICAgICAgIENhbm5vdCBiZSBudWxsCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVJ1bGVyQ29udGV4dE1lbnVJZChTdHJpbmcgcnVsZXJNZW51SWQpIHsKLQkJLy8gdXBkYXRlIHJ1bGVyIGNvbnRleHQgbWVudSBpZCBpZiB1cGRhdGluZyB0byBhIG5ldyBpZCBvciBpZiBjb250ZXh0Ci0JCS8vIG1lbnUgaXMgbm90IGFscmVhZHkgc2V0IHVwCi0JCWlmICghcnVsZXJNZW51SWQuZXF1YWxzKGdldFJ1bGVyQ29udGV4dE1lbnVJZCgpKSB8fCAoZlJ1bGVyQ29udGV4dE1lbnUgPT0gbnVsbCkpIHsKLQkJCXNldFJ1bGVyQ29udGV4dE1lbnVJZChydWxlck1lbnVJZCk7Ci0KLQkJCWlmIChnZXRWZXJ0aWNhbFJ1bGVyKCkgIT0gbnVsbCkgewotCQkJCS8vIGRpc3Bvc2Ugb2YgcHJldmlvdXMgcnVsZXIgY29udGV4dCBtZW51Ci0JCQkJaWYgKGZSdWxlckNvbnRleHRNZW51ICE9IG51bGwpIHsKLQkJCQkJZlJ1bGVyQ29udGV4dE1lbnUuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQlpZiAoZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyLnJlbW92ZU1lbnVMaXN0ZW5lcihnZXRDb250ZXh0TWVudUxpc3RlbmVyKCkpOwotCQkJCQlmUnVsZXJDb250ZXh0TWVudU1hbmFnZXIucmVtb3ZlQWxsKCk7Ci0JCQkJCWZSdWxlckNvbnRleHRNZW51TWFuYWdlci5kaXNwb3NlKCk7Ci0JCQkJfQotCi0JCQkJZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKGdldFJ1bGVyQ29udGV4dE1lbnVJZCgpLCBnZXRSdWxlckNvbnRleHRNZW51SWQoKSk7Ci0JCQkJZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkJCQlmUnVsZXJDb250ZXh0TWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyKGdldENvbnRleHRNZW51TGlzdGVuZXIoKSk7Ci0KLQkJCQlDb250cm9sIHJ1bGVyQ29udHJvbCA9IGdldFZlcnRpY2FsUnVsZXIoKS5nZXRDb250cm9sKCk7Ci0JCQkJZlJ1bGVyQ29udGV4dE1lbnUgPSBmUnVsZXJDb250ZXh0TWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUocnVsZXJDb250cm9sKTsKLQkJCQlydWxlckNvbnRyb2wuc2V0TWVudShmUnVsZXJDb250ZXh0TWVudSk7Ci0KLQkJCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShnZXRSdWxlckNvbnRleHRNZW51SWQoKSwgZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyLCBnZXRTZWxlY3Rpb25Qcm92aWRlcigpKTsKLQotCQkJCS8vIGFsc28gcmVnaXN0ZXIgdGhpcyBtZW51IGZvciBzb3VyY2UgcGFnZSBwYXJ0IGFuZCBzdHJ1Y3R1cmVkCi0JCQkJLy8gdGV4dCBlZGl0b3IgaWRzCi0JCQkJU3RyaW5nIHBhcnRJZCA9IGdldFNpdGUoKS5nZXRJZCgpOwotCQkJCWlmIChwYXJ0SWQgIT0gbnVsbCkgewotCQkJCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShwYXJ0SWQgKyBSVUxFUl9DT05URVhUX01FTlVfU1VGRklYLCBmUnVsZXJDb250ZXh0TWVudU1hbmFnZXIsIGdldFNlbGVjdGlvblByb3ZpZGVyKCkpOwotCQkJCX0KLQkJCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShSVUxFUl9DT05URVhUX01FTlVfSUQsIGZSdWxlckNvbnRleHRNZW51TWFuYWdlciwgZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gZ2V0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpOwotCQkvLyBubyBuZWVkIHRvIHVwZGF0ZSBzb3VyY2Ugdmlld2VyIGNvbmZpZ3VyYXRpb24gaWYgb25lIGRvZXMgbm90IGV4aXN0Ci0JCS8vIHlldAotCQlpZiAoY29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gZG8gbm90IGNvbmZpZ3VyZSBzb3VyY2Ugdmlld2VyIGNvbmZpZ3VyYXRpb24gdHdpY2UKLQkJYm9vbGVhbiBjb25maWd1cmVkID0gZmFsc2U7Ci0KLQkJLy8gc3RydWN0dXJlZHRleHR2aWV3ZXIgb25seSB3b3JrcyB3aXRoCi0JCS8vIHN0cnVjdHVyZWR0ZXh0dmlld2VyY29uZmlndXJhdGlvbgotCQlpZiAoIShjb25maWd1cmF0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKSkgewotCQkJQ29uZmlndXJhdGlvbkFuZFRhcmdldCBjYXQgPSBjcmVhdGVTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCk7Ci0JCQlmVmlld2VyQ29uZmlndXJhdGlvblRhcmdldElkID0gY2F0LmdldFRhcmdldElkKCk7Ci0JCQljb25maWd1cmF0aW9uID0gY2F0LmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCXNldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbik7Ci0JCQljb25maWd1cmVkID0gdHJ1ZTsKLQkJfQotCQllbHNlIHsKLQkJCUNvbmZpZ3VyYXRpb25BbmRUYXJnZXQgY2F0ID0gY3JlYXRlU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpOwotCQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIG5ld1ZpZXdlckNvbmZpZ3VyYXRpb24gPSBjYXQuZ2V0Q29uZmlndXJhdGlvbigpOwotCQkJaWYgKCEoY2F0LmdldFRhcmdldElkKCkuZXF1YWxzKGZWaWV3ZXJDb25maWd1cmF0aW9uVGFyZ2V0SWQpKSkgewotCQkJCS8vIGQyODI4OTQgdXNlIG5ld1ZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCQlmVmlld2VyQ29uZmlndXJhdGlvblRhcmdldElkID0gY2F0LmdldFRhcmdldElkKCk7Ci0JCQkJY29uZmlndXJhdGlvbiA9IG5ld1ZpZXdlckNvbmZpZ3VyYXRpb247Ci0JCQkJc2V0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKTsKLQkJCQljb25maWd1cmVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWlmIChnZXRTb3VyY2VWaWV3ZXIoKSAhPSBudWxsKSB7Ci0JCQkvLyBub3Qgc3VyZSBpZiByZWFsbHkgbmVlZCB0byByZWNvbmZpZ3VyZSB3aGVuIGlucHV0IGNoYW5nZXMKLQkJCS8vIChtYXliZSBvbmx5IG5lZWQgdG8gcmVzZXQgdmlld2VyY29uZmlnJ3MgZG9jdW1lbnQpCi0JCQlpZiAoIWNvbmZpZ3VyZWQpCi0JCQkJZ2V0U291cmNlVmlld2VyKCkuY29uZmlndXJlKGNvbmZpZ3VyYXRpb24pOwotCQkJSUFjdGlvbiBjb250ZW50QXNzaXN0QWN0aW9uID0gZ2V0QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0NPTlRFTlRBU1NJU1RfUFJPUE9TQUxTKTsKLQkJCWlmIChjb250ZW50QXNzaXN0QWN0aW9uIGluc3RhbmNlb2YgSVVwZGF0ZSkgewotCQkJCSgoSVVwZGF0ZSkgY29udGVudEFzc2lzdEFjdGlvbikudXBkYXRlKCk7Ci0JCQl9Ci0JCQlJQWN0aW9uIG9wZW5IeXBlcmxpbmtBY3Rpb24gPSBnZXRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfT1BFTl9GSUxFKTsKLQkJCWlmIChvcGVuSHlwZXJsaW5rQWN0aW9uIGluc3RhbmNlb2YgT3Blbkh5cGVybGlua0FjdGlvbikgewotCQkJCSgoT3Blbkh5cGVybGlua0FjdGlvbikgb3Blbkh5cGVybGlua0FjdGlvbikuc2V0SHlwZXJsaW5rRGV0ZWN0b3JzKGdldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRIeXBlcmxpbmtEZXRlY3RvcnMoZ2V0U291cmNlVmlld2VyKCkpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXR1c0ZpZWxkKFN0cmluZyBjYXRlZ29yeSkgewotCQlzdXBlci51cGRhdGVTdGF0dXNGaWVsZChjYXRlZ29yeSk7Ci0KLQkJaWYgKGNhdGVnb3J5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlNUQVRVU19DQVRFR09SWV9PRkZTRVQuZXF1YWxzKGNhdGVnb3J5KSkgewotCQkJSVN0YXR1c0ZpZWxkIGZpZWxkID0gZ2V0U3RhdHVzRmllbGQoY2F0ZWdvcnkpOwotCQkJaWYgKGZpZWxkICE9IG51bGwpIHsKLQkJCQlQb2ludCBzZWxlY3Rpb24gPSBnZXRUZXh0Vmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpLmdldFNlbGVjdGlvbigpOwotCQkJCWludCBvZmZzZXQxID0gd2lkZ2V0T2Zmc2V0Mk1vZGVsT2Zmc2V0KGdldFNvdXJjZVZpZXdlcigpLCBzZWxlY3Rpb24ueCk7Ci0JCQkJaW50IG9mZnNldDIgPSB3aWRnZXRPZmZzZXQyTW9kZWxPZmZzZXQoZ2V0U291cmNlVmlld2VyKCksIHNlbGVjdGlvbi55KTsKLQkJCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCQkJaWYgKG9mZnNldDEgIT0gb2Zmc2V0MikKLQkJCQkJdGV4dCA9ICJbIiArIG9mZnNldDEgKyAiLSIgKyBvZmZzZXQyICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCWVsc2UKLQkJCQkJdGV4dCA9ICJbICIgKyBvZmZzZXQxICsgIiBdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJZmllbGQuc2V0VGV4dCh0ZXh0ID09IG51bGwgPyBmRXJyb3JMYWJlbCA6IHRleHQpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGdvdG9Bbm5vdGF0aW9uKGJvb2xlYW4gZm9yd2FyZCkgewotCQlBbm5vdGF0aW9uIHJlc3VsdCA9IHN1cGVyLmdvdG9Bbm5vdGF0aW9uKGZvcndhcmQpOwotCQlpZihyZXN1bHQgIT0gbnVsbCkKLQkJCWZTZWxlY3Rpb25DaGFuZ2VkRnJvbUdvdG8gPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXZvaWQgdXBkYXRlU3RhdHVzTGluZShJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBCdWcgMjEwNDgxIC0gRG9uJ3QgdXBkYXRlIHRoZSBzdGF0dXMgbGluZSBpZiB0aGUgc2VsZWN0aW9uCi0JCS8vIHdhcyBjYXVzZWQgYnkgZ28gdG8gbmF2aWdhdGlvbgotCQlpZihmU2VsZWN0aW9uQ2hhbmdlZEZyb21Hb3RvKSB7Ci0JCQlmU2VsZWN0aW9uQ2hhbmdlZEZyb21Hb3RvID0gZmFsc2U7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyID0gZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCQlpZiAoZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyICE9IG51bGwgJiYgc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJT2JqZWN0IGZpcnN0RWxlbWVudCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKGZpcnN0RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCXRleHQgPSBmU3RhdHVzTGluZUxhYmVsUHJvdmlkZXIuZ2V0VGV4dChmaXJzdEVsZW1lbnQpOwotCQkJCQlpbWFnZSA9IGZTdGF0dXNMaW5lTGFiZWxQcm92aWRlci5nZXRJbWFnZSgoZmlyc3RFbGVtZW50KSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKHRleHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShpbWFnZSwgdGV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaWduZWQgY3VycmVudCBzZWxlY3Rpb24uCi0JICogVGhlIGxlbmd0aCB3aWxsIGJlIG5lZ2F0aXZlIGlmIHRoZSByZXN1bHRpbmcgc2VsZWN0aW9uCi0JICogaXMgcmlnaHQtdG8tbGVmdCAoUnRvTCkuCi0JICogPHA+Ci0JICogVGhlIHNlbGVjdGlvbiBvZmZzZXQgaXMgbW9kZWwgYmFzZWQuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlciB0aGUgc291cmNlIHZpZXdlcgotCSAqIEByZXR1cm4gYSByZWdpb24gZGVub3RpbmcgdGhlIGN1cnJlbnQgc2lnbmVkIHNlbGVjdGlvbiwgZm9yIGEgcmVzdWx0aW5nIFJ0b0wgc2VsZWN0aW9ucyBsZW5ndGggaXMgPCAwCi0JICovCi0JSVJlZ2lvbiBnZXRTaWduZWRTZWxlY3Rpb24oSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJU3R5bGVkVGV4dCB0ZXh0PSBzb3VyY2VWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlQb2ludCBzZWxlY3Rpb249IHRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKLQotCQlpZiAodGV4dC5nZXRDYXJldE9mZnNldCgpID09IHNlbGVjdGlvbi54KSB7Ci0JCQlzZWxlY3Rpb24ueD0gc2VsZWN0aW9uLnggKyBzZWxlY3Rpb24ueTsKLQkJCXNlbGVjdGlvbi55PSAtc2VsZWN0aW9uLnk7Ci0JCX0KLQotCQlzZWxlY3Rpb24ueD0gd2lkZ2V0T2Zmc2V0Mk1vZGVsT2Zmc2V0KHNvdXJjZVZpZXdlciwgc2VsZWN0aW9uLngpOwotCi0JCXJldHVybiBuZXcgUmVnaW9uKHNlbGVjdGlvbi54LCBzZWxlY3Rpb24ueSk7Ci0JfQotCi0JcHJvdGVjdGVkIFNvdXJjZVZpZXdlckRlY29yYXRpb25TdXBwb3J0IGdldFNvdXJjZVZpZXdlckRlY29yYXRpb25TdXBwb3J0KElTb3VyY2VWaWV3ZXIgdmlld2VyKSB7Ci0JCS8qIFJlbW92ZWQgd29ya2Fyb3VuZCBmb3IgQnVnIFsyMDY5MTNdIHNvdXJjZSBhbm5vdGF0aW9ucyBhcmUgbm90IHBhaW50aW5nIGluIHNvdXJjZSBlZGl0b3JzLgotCQkgKiBXaXRoIHRoZSBuZXcgcHJlc2VudGF0aW9uIHJlY29uY2lsZXIsIHdlIG5vIGxvbmdlciBuZWVkIHRvIGZvcmNlIHRoZSBwYWludGluZy4gVGhpcwotCQkgKiBhY3R1YWxseSBjYXVzZWQgQnVnIFsyMTk3NzZdIFdyb25nIGFubm90YXRpb24gZGlzcGxheSBvbiBtYWNzLiBXZSBmb3JjZWQgdGhlCi0JCSAqIFNxdWlnZ2xlcyBzdHJhdGVneSwgZXZlbiB3aGVuIHRoZSBuYXRpdmUgcHJvYmxlbSB1bmRlcmxpbmUgd2FzIHNwZWNpZmllZCBmb3IgYW5ub3RhdGlvbnMgKi8KLQkJcmV0dXJuIHN1cGVyLmdldFNvdXJjZVZpZXdlckRlY29yYXRpb25TdXBwb3J0KHZpZXdlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL1N0cnVjdHVyZWRUZXh0SW52b2NhdGlvbkNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkVGV4dEludm9jYXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MTI2NWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL1N0cnVjdHVyZWRUZXh0SW52b2NhdGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlRleHRJbnZvY2F0aW9uQ29udGV4dDsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcwotICogc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZQotICogcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvCi0gKiBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueQotICogY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlCi0gKiBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCi0gKiAKLSAqIFN0cnVjdHVyZWQgVGV4dCBxdWljayBhc3Npc3QgaW52b2NhdGlvbiBjb250ZXh0LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RydWN0dXJlZFRleHRJbnZvY2F0aW9uQ29udGV4dCBleHRlbmRzIFRleHRJbnZvY2F0aW9uQ29udGV4dCB7Ci0JcHJpdmF0ZSBNYXAgZkF0dHJpYnV0ZXM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gc291cmNlVmlld2VyCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcGFyYW0gYXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dEludm9jYXRpb25Db250ZXh0KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBNYXAgYXR0cmlidXRlcykgewotCQlzdXBlcihzb3VyY2VWaWV3ZXIsIG9mZnNldCwgbGVuZ3RoKTsKLQkJZkF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUsIG9yIDx0dD5udWxsPC90dD4gd2hlbiBubyBzdWNoCi0JICogICAgICAgICBhdHRyaWJ1dGUgaXMgZGVmaW5lZCBvciB0aGF0IGF0dHJpYnV0ZSdzIHZhbHVlIGhhcyBiZWVuIHNldCB0bwotCSAqICAgICAgICAgPHR0Pm51bGw8L3R0PgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCXJldHVybiAoZkF0dHJpYnV0ZXMgIT0gbnVsbCA/IGZBdHRyaWJ1dGVzLmdldChhdHRyaWJ1dGVOYW1lKSA6IG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkVGV4dE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkVGV4dE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhkNDhlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvU3RydWN0dXJlZFRleHRNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVHlwZWRQb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Gb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUZvcm1hdHRpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklGb3JtYXR0aW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlcjsKLQotLyoqCi0gKiBFeHRlbmRzIHRoZSBNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyIHRvIGFsbG93IGNsaWVudHMgdG8gY29udHJpYnV0ZQotICogYWRkaXRpb25hbCBzbGF2ZSBmb3JtYXR0aW5nIHN0cmF0ZWdpZXMgdmlhIHRoZQotICogPGNvZGU+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uPC9jb2RlPiBleHRlbnNpb24gcG9pbnQKLSAqLwotY2xhc3MgU3RydWN0dXJlZFRleHRNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyIGV4dGVuZHMgTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlciB7Ci0JLyoqCi0JICogVGhlIHZhbHVlIG9mICJ0eXBlIiBhdHRyaWJ1dGUgaW4gdGhlIHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNMQVZFX0ZPUk1BVFRJTkdfU1RSQVRFR1lfRVhURU5ERURfSUQgPSAic2xhdmVmb3JtYXR0aW5nc3RyYXRlZ3kiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogbGlzdCBvZiBwYXJ0aXRpb24gdHlwZXMgdGhhdCBhbHJlYWR5IGhhdmUgYSBmb3JtYXR0aW5nIHN0cmF0ZWd5Ci0JICovCi0JcHJpdmF0ZSBMaXN0IGZJbnN0YWxsZWRQYXJ0aXRpb25UeXBlczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGVudCBmb3JtYXR0ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcnRpdGlvbmluZwotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHBhcnRpdGlvbmluZyBmb3IgdGhpcyBmb3JtYXR0ZXIKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgY29udGVudCB0eXBlCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0TXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcihmaW5hbCBTdHJpbmcgcGFydGl0aW9uaW5nLCBmaW5hbCBTdHJpbmcgdHlwZSkgewotCQlzdXBlcihwYXJ0aXRpb25pbmcsIHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdE1hc3RlcihJRm9ybWF0dGluZ0NvbnRleHQgY29udGV4dCwgSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCS8vIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKLQkJbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlzdXBlci5mb3JtYXRNYXN0ZXIoY29udGV4dCwgZG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoKTsKLQotCQlpZiAoTG9nZ2VyLkRFQlVHX0ZPUk1BVCkgewotCQkJbG9uZyBlbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImZvcm1hdE1vZGVsIHRpbWU6ICIgKyAoZW5kVGltZSAtIHN0YXJ0VGltZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKgotCSAqIE92ZXJ3cml0dGVuIHRvIGNoZWNrIGZvciBhZGRpdGlvbmFsIHNsYXZlIGZvcm1hdHRpbmcgc3RyYXRlZ2llcwotCSAqIGNvbnRyaWJ1dGVkIHZpYSB0aGUgZWRpdG9yQ29uZmlndXJhdGlvbiBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0U2xhdmUoSUZvcm1hdHRpbmdDb250ZXh0IGNvbnRleHQsIElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHR5cGUpIHsKLQkJTGlzdCBpbnN0YWxsZWRUeXBlcyA9IGdldEluc3RhbGxlZFBhcnRpdGlvblR5cGVzKCk7Ci0JCWlmIChpbnN0YWxsZWRUeXBlcy5jb250YWlucyh0eXBlKSkgewotCQkJLy8gd2UndmUgYWxyZWFkeSBzZXQgdGhlIHNsYXZlIGZvcm1hdHRlciBzdHJhdGVneSBzbyBqdXN0IHBlcmZvcm0KLQkJCS8vIGFzIG5vcm1hbAotCQkJc3VwZXIuZm9ybWF0U2xhdmUoY29udGV4dCwgZG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoLCB0eXBlKTsKLQkJfQotCQllbHNlIHsKLQkJCWJvb2xlYW4gZmluZEV4dGVuZGVkU2xhdmVGb3JtYXR0ZXIgPSB0cnVlOwotCi0JCQkvLyBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhlcmUncyBhbHJlYWR5IGEgc2xhdmUgZm9ybWF0dGVyIHNldCwgc28KLQkJCS8vIGp1c3QgYXR0ZW1wdCB0byBmb3JtYXQgYXMgbm9ybWFsCi0JCQlzdXBlci5mb3JtYXRTbGF2ZShjb250ZXh0LCBkb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgsIHR5cGUpOwotCi0JCQkvLyBub3csIGRldGVybWluZSBpZiBzbGF2ZSBmb3JtYXR0ZXIgd2FzIGFscmVhZHkgc2V0IGJ5IGNoZWNraW5nCi0JCQkvLyBjb250ZXh0IChpdCB3b3VsZCBiZSBzZXQgaWYgdGhlcmUncyBhbHJlYWR5IG9uZSkKLQkJCU9iamVjdCBjb250ZXh0UGFydGl0aW9uID0gY29udGV4dC5nZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9QQVJUSVRJT04pOwotCQkJaWYgKGNvbnRleHRQYXJ0aXRpb24gaW5zdGFuY2VvZiBUeXBlZFBvc2l0aW9uKSB7Ci0JCQkJU3RyaW5nIGNvbnRleHRUeXBlID0gKChUeXBlZFBvc2l0aW9uKSBjb250ZXh0UGFydGl0aW9uKS5nZXRUeXBlKCk7Ci0JCQkJaWYgKGNvbnRleHRUeXBlID09IHR5cGUpIHsKLQkJCQkJLy8gdGhlcmUncyBhbHJlYWR5IGEgc2xhdmUgZm9ybWF0dGVyIHNldCwgc28ganVzdCBhZGQgaXQKLQkJCQkJLy8gdG8gdGhlIGxpc3Qgb2YgaW5zdGFsbGVkIHBhcnRpdGlvbiB0eXBlcyBmb3IgZnV0dXJlCi0JCQkJCS8vIHJlZmVyZW5jZQotCQkJCQlpbnN0YWxsZWRUeXBlcy5hZGQodHlwZSk7Ci0JCQkJCWZpbmRFeHRlbmRlZFNsYXZlRm9ybWF0dGVyID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJLy8gbm8gc2xhdmUgZm9ybWF0dGVyIGlzIHNldCB5ZXQsIHNvIHRyeSB0byBmaW5kIG9uZSBjb250cmlidXRlZAotCQkJLy8gdmlhIHRoZSBlZGl0b3JDb25maWd1cmF0aW9uIGV4dGVuc2lvbiBwb2ludAotCQkJaWYgKGZpbmRFeHRlbmRlZFNsYXZlRm9ybWF0dGVyKSB7Ci0JCQkJT2JqZWN0IGNvbmZpZ3VyYXRpb24gPSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCkuZ2V0Q29uZmlndXJhdGlvbihTTEFWRV9GT1JNQVRUSU5HX1NUUkFURUdZX0VYVEVOREVEX0lELCB0eXBlKTsKLQkJCQlpZiAoY29uZmlndXJhdGlvbiBpbnN0YW5jZW9mIElGb3JtYXR0aW5nU3RyYXRlZ3kpIHsKLQkJCQkJLy8gZm91bmQgYSBmb3JtYXR0ZXIsIHNvIGFkZCBpdCBpbgotCQkJCQlzZXRTbGF2ZVN0cmF0ZWd5KChJRm9ybWF0dGluZ1N0cmF0ZWd5KSBjb25maWd1cmF0aW9uLCB0eXBlKTsKLQkJCQkJLy8gdHJ5IHRvIGZvcm1hdCBzbGF2ZSBhZ2FpbiBub3cgdGhhdCBvbmUgaXMgc2V0Ci0JCQkJCXN1cGVyLmZvcm1hdFNsYXZlKGNvbnRleHQsIGRvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgdHlwZSk7Ci0JCQkJfQotCQkJCS8vIG5vdGUgdGhhdCB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgdGhpcyBwYXJ0aXRpb24gdHlwZSBmb3IKLQkJCQkvLyBmdXR1cmUgcmVmZXJlbmNlCi0JCQkJaW5zdGFsbGVkVHlwZXMuYWRkKHR5cGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBsaXN0IG9mIHBhcnRpdGlvbiB0eXBlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZCBmb3IKLQkgKiBzbGF2ZSBmb3JtYXR0aW5nIHN0cmF0ZWdpZXMgZm9yIHRoaXMgZm9ybWF0dGVyLgotCSAqIAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRJbnN0YWxsZWRQYXJ0aXRpb25UeXBlcygpIHsKLQkJaWYgKGZJbnN0YWxsZWRQYXJ0aXRpb25UeXBlcyA9PSBudWxsKQotCQkJZkluc3RhbGxlZFBhcnRpdGlvblR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gZkluc3RhbGxlZFBhcnRpdGlvblR5cGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIxMjkzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0SW5mb3JtYXRpb25Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dERvdWJsZUNsaWNrU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUNvbnRlbnRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGlua1ByZXNlbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5NdWx0aXBsZUh5cGVybGlua1ByZXNlbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByZXNlbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSW5mb3JtYXRpb25QcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5wcmVzZW50YXRpb24uSVByZXNlbnRhdGlvblJlY29uY2lsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5RdWlja0Fzc2lzdEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbkhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5FZGl0b3JzVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQ2hhaW5lZFByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlN0cnVjdHVyZWRDb250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5Db21wb3VuZFF1aWNrQXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVyaXZlZC5IVE1MVGV4dFByZXNlbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkVkaXRvclByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnByZWZlcmVuY2VzLkNvbW1vbkVkaXRvclByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuUmVjb25jaWxlckhpZ2hsaWdodGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuU3RydWN0dXJlZFByZXNlbnRhdGlvblJlY29uY2lsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuU3RydWN0dXJlZFJlZ2lvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJ1bGVzLlN0cnVjdHVyZWREb2N1bWVudERhbWFnZXJSZXBhaXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm8uQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mby5CZXN0TWF0Y2hIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm8uUHJvYmxlbUFubm90YXRpb25Ib3ZlclByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm8uVGV4dEhvdmVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuRWRpdG9yVXRpbGl0eTsKLQotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBzb3VyY2Ugdmlld2VyIHVzZWQgYnkgU3RydWN0dXJlZFRleHRFZGl0b3IuPGJyIC8+Ci0gKiBOb3RlOiBXaGlsZSBJU291cmNlVmlld2VyIGlzIHBhc3NlZCBpbiBmb3IgZWFjaCBnZXQgY29uZmlndXJhdGlvbiwgY2xpZW50cwotICogc2hvdWxkIGNyZWF0ZSBhIG5ldyB2aWV3ZXIgY29uZmlndXJhdGlvbiBpbnN0YW5jZSBmb3IgZWFjaCBpbnN0YW5jZSBvZgotICogc291cmNlIHZpZXdlciBhcyBzb21lIG1ldGhvZHMgcmV0dXJuIHRoZSBzYW1lIGluc3RhbmNlIG9mIGFuIG9iamVjdCwKLSAqIHJlZ2FyZGxlc3Mgb2YgdGhlIHNvdXJjZXZpZXdlci4KLSAqIDxwPgotICogQ2xpZW50cyBzaG91bGQgc3ViY2xhc3MgYW5kIG92ZXJyaWRlIGp1c3QgdGhvc2UgbWV0aG9kcyB3aGljaCBtdXN0IGJlCi0gKiBzcGVjaWZpYyB0byB0aGVpciBuZWVkcy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBleHRlbmRzIFRleHRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbiBiZWNhdXNlIGNyZWF0aW5nIGEgc2Vjb25kIGFzc2lzdGFudCB0aGF0Ci0JICogaXMgYWRkZWQgdG8gYSB2aWV3ZXIgY2FuIGNhdXNlIG9kZCBrZXktZWF0aW5nIGJ5IHRoZSB3cm9uZyBvbmUuCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdGFudCBmQ29udGVudEFzc2lzdGFudCA9IG51bGw7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24gYmVjYXVzZSBpdCdzIGp1c3QgbGlrZSBjb250ZW50IGFzc2lzdGFudAotCSAqLwotCXByaXZhdGUgSVF1aWNrQXNzaXN0QXNzaXN0YW50IGZRdWlja0Fzc2lzdGFudCA9IG51bGw7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIElSZWNvbmNpbGVyIGZSZWNvbmNpbGVyOwotCS8qKgotCSAqIEV4dGVuZGVkIGNvbmZpZ3VyYXRpb24gcHJvdmlzaW9uYWxDb25maWd1cmF0aW9uIHR5cGUgdG8gY29udHJpYnV0ZQotCSAqIGFkZGl0aW9uYWwgYXV0byBlZGl0IHN0cmF0ZWdpZXMKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBBVVRPRURJVFNUUkFURUdZID0gImF1dG9lZGl0c3RyYXRlZ3kiOwotCQotCXByaXZhdGUgUmVjb25jaWxlckhpZ2hsaWdodGVyIGZIaWdobGlnaHRlciA9IG51bGw7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIHN0cnVjdHVyZWQgdGV4dCB2aWV3ZXIgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQlzdXBlcigpOwotCQkvLyBpbml0aWFsaXplIGZQcmVmZXJlbmNlU3RvcmUgd2l0aCBzYW1lIHByZWZlcmVuY2Ugc3RvcmUgdXNlZCBpbgotCQkvLyBTdHJ1Y3R1cmVkVGV4dEVkaXRvcgotCQlmUHJlZmVyZW5jZVN0b3JlID0gY3JlYXRlQ29tYmluZWRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBwcmVmZXJlbmNlIHN0b3JlIHRoYXQgY29tYmluZXMgdGhlIHNvdXJjZSBlZGl0b3IgcHJlZmVyZW5jZXMKLQkgKiB3aXRoIHRoZSBiYXNlIGVkaXRvcidzIHByZWZlcmVuY2VzLgotCSAqIAotCSAqIEByZXR1cm4gSVByZWZlcmVuY2VTdG9yZQotCSAqLwotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBjcmVhdGVDb21iaW5lZFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzc2VFZGl0b3JQcmVmcyA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJSVByZWZlcmVuY2VTdG9yZSBiYXNlRWRpdG9yUHJlZnMgPSBFZGl0b3JzVUkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXJldHVybiBuZXcgQ2hhaW5lZFByZWZlcmVuY2VTdG9yZShuZXcgSVByZWZlcmVuY2VTdG9yZVtde3NzZUVkaXRvclByZWZzLCBiYXNlRWRpdG9yUHJlZnN9KTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBDbGllbnRzIGNhbm5vdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBiZWNhdXNlIHRoaXMgbWV0aG9kIHJldHVybnMgYQotCSAqIHNwZWNpYWxseSBjb25maWd1cmVkIEFubm90YXRpb24gSG92ZXIgZm9yIHRoZSBTdHJ1Y3R1cmVkVGV4dFZpZXdlcgotCSAqIAotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbiNnZXRBbm5vdGF0aW9uSG92ZXIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcikKLQkgKi8KLQlmaW5hbCBwdWJsaWMgSUFubm90YXRpb25Ib3ZlciBnZXRBbm5vdGF0aW9uSG92ZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25Ib3ZlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGlzSW5jbHVkZWQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCQkJcmV0dXJuIGlzU2hvd0luVmVydGljYWxSdWxlcihhbm5vdGF0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgY29sb3IgZm9yIHRoZSBwcmVmZXJlbmNlIGtleS4gQXNzdW1lcyBmUHJlZmVyZW5jZVN0b3JlIGlzIG5vdCBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcmV0dXJuIENvbG9yIGZvciBwcmVmZXJlbmNlIGtleSBvciBudWxsIGlmIG5vbmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIENvbG9yIGdldENvbG9yKFN0cmluZyBrZXkpIHsKLQkJUkdCIHJnYiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoZlByZWZlcmVuY2VTdG9yZSwga2V5KTsKLQkJcmV0dXJuIEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IocmdiKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uI2dldEF1dG9FZGl0U3RyYXRlZ2llcyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJQXV0b0VkaXRTdHJhdGVneVtdIGdldEF1dG9FZGl0U3RyYXRlZ2llcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCUxpc3QgYWxsU3RyYXRlZ2llcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0KLQkJSUF1dG9FZGl0U3RyYXRlZ3lbXSBzdXBlclN0cmF0ZWdpZXMgPSBzdXBlci5nZXRBdXRvRWRpdFN0cmF0ZWdpZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJTdHJhdGVnaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhbGxTdHJhdGVnaWVzLmFkZChzdXBlclN0cmF0ZWdpZXNbaV0pOwotCQl9Ci0KLQkJLy8gYWRkIGF1dG8gZWRpdCBzdHJhdGVnaWVzIGNvbnRyaWJ1dGVkIGJ5IGNsaWVudHMKLQkJTGlzdCBleHRlbmRlZEF1dG9FZGl0cyA9IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKS5nZXRDb25maWd1cmF0aW9ucyhBVVRPRURJVFNUUkFURUdZLCBjb250ZW50VHlwZSk7Ci0JCWlmICghZXh0ZW5kZWRBdXRvRWRpdHMuaXNFbXB0eSgpKSB7Ci0JCQlhbGxTdHJhdGVnaWVzLmFkZEFsbChleHRlbmRlZEF1dG9FZGl0cyk7Ci0JCX0KLQotCQlyZXR1cm4gKElBdXRvRWRpdFN0cmF0ZWd5W10pIGFsbFN0cmF0ZWdpZXMudG9BcnJheShuZXcgSUF1dG9FZGl0U3RyYXRlZ3lbYWxsU3RyYXRlZ2llcy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb25maWd1cmVkIHBhcnRpdGlvbmluZyBmb3IgdGhlIGdpdmVuIHNvdXJjZSB2aWV3ZXIuIFRoZQotCSAqIHBhcnRpdGlvbmluZyBpcyB1c2VkIHdoZW4gdGhlIHF1ZXJ5aW5nIGNvbnRlbnQgdHlwZXMgZnJvbSB0aGUgc291cmNlCi0JICogdmlld2VyJ3MgaW5wdXQgZG9jdW1lbnQuPGJyIC8+Ci0JICogTm90ZTogQ2xpZW50cyBjYW5ub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXQgdGhpcyB0aW1lLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugdmlld2VyIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgY29uZmlndXJlZCBwYXJ0aXRpb25pbmcKLQkgKiBAc2VlICNnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIpCi0JICovCi0JZmluYWwgcHVibGljIFN0cmluZyBnZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJLyoKLQkJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGRlZmF1bHQgc3RydWN0dXJlZCB0ZXh0IHBhcnRpdGlvbmluZwotCQkgKi8KLQkJcmV0dXJuIElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkc7Ci0JfQotCi0JcHVibGljIGludFtdIGdldENvbmZpZ3VyZWRUZXh0SG92ZXJTdGF0ZU1hc2tzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJLyoKLQkJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGNvbmZpZ3VyZWQgdGV4dCBob3ZlciBzdGF0ZSBtYXNrcyBmb3IKLQkJICogU3RydWN0dXJlZFRleHRWaWV3ZXJzCi0JCSAqLwotCQlUZXh0SG92ZXJNYW5hZ2VyLlRleHRIb3ZlckRlc2NyaXB0b3JbXSBob3ZlckRlc2NzID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRleHRIb3Zlck1hbmFnZXIoKS5nZXRUZXh0SG92ZXJzKCk7Ci0JCWludCBzdGF0ZU1hc2tzW10gPSBuZXcgaW50W2hvdmVyRGVzY3MubGVuZ3RoXTsKLQkJaW50IHN0YXRlTWFza3NMZW5ndGggPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGhvdmVyRGVzY3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChob3ZlckRlc2NzW2ldLmlzRW5hYmxlZCgpKSB7Ci0JCQkJaW50IGogPSAwOwotCQkJCWludCBzdGF0ZU1hc2sgPSBjb21wdXRlU3RhdGVNYXNrKGhvdmVyRGVzY3NbaV0uZ2V0TW9kaWZpZXJTdHJpbmcoKSk7Ci0JCQkJd2hpbGUgKGogPCBzdGF0ZU1hc2tzTGVuZ3RoKSB7Ci0JCQkJCWlmIChzdGF0ZU1hc2tzW2pdID09IHN0YXRlTWFzaykKLQkJCQkJCWJyZWFrOwotCQkJCQlqKys7Ci0JCQkJfQotCQkJCWlmIChqID09IHN0YXRlTWFza3NMZW5ndGgpCi0JCQkJCXN0YXRlTWFza3Nbc3RhdGVNYXNrc0xlbmd0aCsrXSA9IHN0YXRlTWFzazsKLQkJCX0KLQkJfQotCQlpZiAoc3RhdGVNYXNrc0xlbmd0aCA9PSBob3ZlckRlc2NzLmxlbmd0aCkKLQkJCXJldHVybiBzdGF0ZU1hc2tzOwotCi0JCWludFtdIHNob3J0ZW5lZFN0YXRlTWFza3MgPSBuZXcgaW50W3N0YXRlTWFza3NMZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHN0YXRlTWFza3MsIDAsIHNob3J0ZW5lZFN0YXRlTWFza3MsIDAsIHN0YXRlTWFza3NMZW5ndGgpOwotCQlyZXR1cm4gc2hvcnRlbmVkU3RhdGVNYXNrczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IGFzc2lzdGFudCByZWFkeSB0byBiZSB1c2VkIHdpdGggdGhlIGdpdmVuIHNvdXJjZQotCSAqIHZpZXdlci48YnIgLz4KLQkgKiBOb3RlOiBUaGUgc2FtZSBpbnN0YW5jZSBvZiBJQ29udGVudEFzc2lzdGFudCBpcyByZXR1cm5lZCByZWdhcmRsZXNzIG9mCi0JICogdGhlIHNvdXJjZSB2aWV3ZXIgcGFzc2VkIGluLgotCSAqIDxwPgotCSAqIENsaWVudHMgc2hvdWxkIGdlbmVyYWxseSBub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuIEluc3RlYWQsIGNsaWVudHMKLQkgKiB3YW50aW5nIHRvIGFkZCB0aGVpciBvd24gcHJvY2Vzc29ycyBzaG91bGQgb3ZlcnJpZGUKLQkgKiA8Y29kZT5nZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycyhJU291cmNlVmlld2VyLCBTdHJpbmcpPC9jb2RlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgc291cmNlIHZpZXdlciB0byBiZSBjb25maWd1cmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSBjb250ZW50IGFzc2lzdGFudAotCSAqIEBzZWUgI2dldENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKElTb3VyY2VWaWV3ZXIsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RhbnQgZ2V0Q29udGVudEFzc2lzdGFudChJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkvKgotCQkgKiBOb3RlOiBUaGlzIG1ldGhvZCB3YXMgbWFkZSBmaW5hbCBzbyB0aGF0IFN0cnVjdHVyZWRDb250ZW50QXNzaXN0IGlzCi0JCSAqIGFsd2F5cyB1c2VkIGFuZCBjb250ZW50IGFzc2lzdCBleHRlbnNpb24gcG9pbnQgYWx3YXlzIHdvcmtzLgotCQkgKi8KLQkJaWYgKGZDb250ZW50QXNzaXN0YW50ID09IG51bGwpIHsKLQkJCWZDb250ZW50QXNzaXN0YW50ID0gbmV3IFN0cnVjdHVyZWRDb250ZW50QXNzaXN0YW50KCk7Ci0KLQkJCS8vIGNvbnRlbnQgYXNzaXN0YW50IGNvbmZpZ3VyYXRpb25zCi0JCQlmQ29udGVudEFzc2lzdGFudC5zZXREb2N1bWVudFBhcnRpdGlvbmluZyhnZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcoc291cmNlVmlld2VyKSk7Ci0JCQlmQ29udGVudEFzc2lzdGFudC5lbmFibGVBdXRvQWN0aXZhdGlvbih0cnVlKTsKLQkJCWZDb250ZW50QXNzaXN0YW50LnNldFByb3Bvc2FsUG9wdXBPcmllbnRhdGlvbihJQ29udGVudEFzc2lzdGFudC5QUk9QT1NBTF9PVkVSTEFZKTsKLQkJCWZDb250ZW50QXNzaXN0YW50LnNldENvbnRleHRJbmZvcm1hdGlvblBvcHVwT3JpZW50YXRpb24oSUNvbnRlbnRBc3Npc3RhbnQuQ09OVEVYVF9JTkZPX0FCT1ZFKTsKLQkJCWZDb250ZW50QXNzaXN0YW50LnNldEluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoZ2V0SW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcihzb3VyY2VWaWV3ZXIpKTsKLQotCQkJLy8gc2V0IGNvbnRlbnQgYXNzaXN0IHByZWZlcmVuY2VzCi0JCQlpZiAoZlByZWZlcmVuY2VTdG9yZSAhPSBudWxsKSB7Ci0JCQkJaW50IGRlbGF5ID0gZlByZWZlcmVuY2VTdG9yZS5nZXRJbnQoRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkNPREVBU1NJU1RfQVVUT0FDVElWQVRJT05fREVMQVkpOwotCQkJCWZDb250ZW50QXNzaXN0YW50LnNldEF1dG9BY3RpdmF0aW9uRGVsYXkoZGVsYXkpOwotCi0JCQkJQ29sb3IgY29sb3IgPSBnZXRDb2xvcihFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9QUk9QT1NBTFNfQkFDS0dST1VORCk7Ci0JCQkJZkNvbnRlbnRBc3Npc3RhbnQuc2V0UHJvcG9zYWxTZWxlY3RvckJhY2tncm91bmQoY29sb3IpOwotCi0JCQkJY29sb3IgPSBnZXRDb2xvcihFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9QUk9QT1NBTFNfRk9SRUdST1VORCk7Ci0JCQkJZkNvbnRlbnRBc3Npc3RhbnQuc2V0UHJvcG9zYWxTZWxlY3RvckZvcmVncm91bmQoY29sb3IpOwotCi0JCQkJY29sb3IgPSBnZXRDb2xvcihFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9QQVJBTUVURVJTX0JBQ0tHUk9VTkQpOwotCQkJCWZDb250ZW50QXNzaXN0YW50LnNldENvbnRleHRJbmZvcm1hdGlvblBvcHVwQmFja2dyb3VuZChjb2xvcik7Ci0JCQkJZkNvbnRlbnRBc3Npc3RhbnQuc2V0Q29udGV4dFNlbGVjdG9yQmFja2dyb3VuZChjb2xvcik7Ci0KLQkJCQljb2xvciA9IGdldENvbG9yKEVkaXRvclByZWZlcmVuY2VOYW1lcy5DT0RFQVNTSVNUX1BBUkFNRVRFUlNfRk9SRUdST1VORCk7Ci0JCQkJZkNvbnRlbnRBc3Npc3RhbnQuc2V0Q29udGV4dEluZm9ybWF0aW9uUG9wdXBGb3JlZ3JvdW5kKGNvbG9yKTsKLQkJCQlmQ29udGVudEFzc2lzdGFudC5zZXRDb250ZXh0U2VsZWN0b3JGb3JlZ3JvdW5kKGNvbG9yKTsKLQkJCX0KLQkJfQotCi0JCWlmICghZkNvbnRlbnRBc3Npc3RhbnQuaXNJbml0aWFsaXplZCgpKSB7Ci0JCQkvLyBhZGQgY29udGVudCBhc3Npc3QgcHJvY2Vzc29ycyBmb3IgZWFjaCBwYXJ0aXRpb24gdHlwZQotCQkJU3RyaW5nW10gdHlwZXMgPSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIHR5cGUgPSB0eXBlc1tpXTsKLQotCQkJCS8vIGFkZCBhbGwgY29udGVudCBhc3Npc3QgcHJvY2Vzc29ycyBmb3IgY3VycmVudCBwYXJ0aXRvbiB0eXBlCi0JCQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBwcm9jZXNzb3JzID0gZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcnMoc291cmNlVmlld2VyLCB0eXBlKTsKLQkJCQlpZiAocHJvY2Vzc29ycyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvY2Vzc29ycy5sZW5ndGg7IGorKykgewotCQkJCQkJZkNvbnRlbnRBc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihwcm9jZXNzb3JzW2pdLCB0eXBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZkNvbnRlbnRBc3Npc3RhbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCBhc3Npc3QgcHJvY2Vzc29ycyB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgY29udGVudAotCSAqIGFzc2lzdCBpbiB0aGUgZ2l2ZW4gc291cmNlIHZpZXdlciBhbmQgZm9yIHRoZSBnaXZlbiBwYXJ0aXRpb24gdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgc291cmNlIHZpZXdlciB0byBiZSBjb25maWd1cmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlCi0JICogICAgICAgICAgICB0aGUgcGFydGl0aW9uIHR5cGUgZm9yIHdoaWNoIHRoZSBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3JzCi0JICogICAgICAgICAgICBhcmUgYXBwbGljYWJsZQotCSAqIEByZXR1cm4gSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JzIG9yIG51bGwgaWYgc2hvdWxkIG5vdCBiZSBzdXBwb3J0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCBmb3JtYXR0ZXIgcmVhZHkgdG8gYmUgdXNlZCB3aXRoIHRoZSBnaXZlbiBzb3VyY2UKLQkgKiB2aWV3ZXIuCi0JICogPHA+Ci0JICogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRoYXQgY2xpZW50cyBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBpdCBtYXkKLQkgKiBiZWNvbWUgPGNvZGU+ZmluYWw8L2NvZGU+IGluIHRoZSBmdXR1cmUgYW5kIHJlcGxhY2VkIGJ5IGFuIGV4dGVuc2libGUKLQkgKiBmcmFtZXdvcmsuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugdmlld2VyIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhIGNvbnRlbnQgZm9ybWF0dGVyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGZvcm1hdHRpbmcgc2hvdWxkCi0JICogICAgICAgICBub3QgYmUgc3VwcG9ydGVkCi0JICovCi0JcHVibGljIElDb250ZW50Rm9ybWF0dGVyIGdldENvbnRlbnRGb3JtYXR0ZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJLy8gdHJ5IHRvIHVzZSB0aGUgU3RydWN0dXJlZFRleHRNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyIHNvIHRoYXQgaXQKLQkJLy8gcGlja3MgdXAgYW55IGFkZGl0aW9uYWwgZm9ybWF0dGluZyBzdHJhdGVnaWVzIGNvbnRyaWJ1dGVkIHZpYSB0aGUKLQkJLy8gZWRpdG9yQ29uZmlndXJhdGlvbiBleHRlbnNpb24gcG9pbnQKLQkJSUNvbnRlbnRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gbnVsbDsKLQkJaWYgKHNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzb3VyY2VWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjMpIHsKLQkJCQlTdHJpbmcgcGFydGl0aW9uaW5nID0gZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKHNvdXJjZVZpZXdlcik7Ci0JCQkJSURvY3VtZW50UGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSAoKElEb2N1bWVudEV4dGVuc2lvbjMpIGRvY3VtZW50KS5nZXREb2N1bWVudFBhcnRpdGlvbmVyKHBhcnRpdGlvbmluZyk7Ci0JCQkJaWYgKHBhcnRpdGlvbmVyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcikgewotCQkJCQlTdHJpbmcgZGVmYXVsdFBhcnRpdGlvblR5cGUgPSAoKFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIpIHBhcnRpdGlvbmVyKS5nZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpOwotCQkJCQlmb3JtYXR0ZXIgPSBuZXcgU3RydWN0dXJlZFRleHRNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyKHBhcnRpdGlvbmluZywgZGVmYXVsdFBhcnRpdGlvblR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmb3JtYXR0ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZG91YmxlLWNsaWNrIHN0cmF0ZWd5IHJlYWR5IHRvIGJlIHVzZWQgaW4gdGhpcyB2aWV3ZXIgd2hlbgotCSAqIGRvdWJsZSBjbGlja2luZyBvbnRvIHRleHQgb2YgdGhlIGdpdmVuIGNvbnRlbnQgdHlwZS4gTm90ZSB0aGF0IGlmCi0JICogY2xpZW50cyB3YW50IHRvIGNvbnRyaWJ1dGUgdGhlaXIgb3duIGRvdWJsZWNsaWNrIHN0cmF0ZWd5LCB0aGV5IHNob3VsZAotCSAqIHVzZSA8Y29kZT5vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXRvckNvbmZpZ3VyYXRpb248L2NvZGU+IGV4dGVuc2lvbgotCSAqIHBvaW50J3MgPGNvZGU+ZG91YmxlQ2xpY2tTdHJhdGVneTwvY29kZT4gZWxlbWVudCBpbnN0ZWFkIG9mCi0JICogb3ZlcnJpZGluZyB0aGlzIG1ldGhvZC4gSWYgY2xpZW50cyBkbyBvdmVycmlkZSB0aGlzIG1ldGhvZCwgcGxlYXNlCi0JICogcmVtZW1iZXIgdG8gY2FsbCA8Y29kZT5zdXBlci5nZXREb3VibGVDbGlja1N0cmF0ZWd5KCk8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugdmlld2VyIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgY29udGVudCB0eXBlIGZvciB3aGljaCB0aGUgc3RyYXRlZ3kgaXMgYXBwbGljYWJsZQotCSAqIEByZXR1cm4gYSBkb3VibGUtY2xpY2sgc3RyYXRlZ3kgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgZG91YmxlCi0JICogICAgICAgICBjbGlja2luZyBzaG91bGQgbm90IGJlIHN1cHBvcnRlZAotCSAqLwotCXB1YmxpYyBJVGV4dERvdWJsZUNsaWNrU3RyYXRlZ3kgZ2V0RG91YmxlQ2xpY2tTdHJhdGVneShJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCUlUZXh0RG91YmxlQ2xpY2tTdHJhdGVneSBzdHJhdGVneSA9IG51bGw7Ci0JCU9iamVjdCBleHRlbmRlZFN0cmF0ZWd5ID0gRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpLmdldENvbmZpZ3VyYXRpb24oRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5ET1VCTEVDTElDS1NUUkFURUdZLCBjb250ZW50VHlwZSk7Ci0JCWlmIChleHRlbmRlZFN0cmF0ZWd5IGluc3RhbmNlb2YgSVRleHREb3VibGVDbGlja1N0cmF0ZWd5KSB7Ci0JCQlzdHJhdGVneSA9IChJVGV4dERvdWJsZUNsaWNrU3RyYXRlZ3kpIGV4dGVuZGVkU3RyYXRlZ3k7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdHJhdGVneSA9IHN1cGVyLmdldERvdWJsZUNsaWNrU3RyYXRlZ3koc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCX0KLQkJcmV0dXJuIHN0cmF0ZWd5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGh5cGVybGluayBwcmVzZW50ZXIgZm9yIHRoZSBnaXZlbiBzb3VyY2Ugdmlld2VyLjxiciAvPgotCSAqIE5vdGU6IENsaWVudHMgY2Fubm90IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBhbmQgYWx0aG91Z2ggaXQncyBubyBsb25nZXIKLQkgKiBuZWNlc3NhcnksIGl0IG11c3QgcmVtYWluIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eS4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgc291cmNlIHZpZXdlciB0byBiZSBjb25maWd1cmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSBoeXBlcmxpbmsgcHJlc2VudGVyIHNwZWNpYWxseSBjb25maWd1cmVkIGZvcgotCSAqICAgICAgICAgU3RydWN0dXJlZFRleHRWaWV3ZXIKLQkgKi8KLQlmaW5hbCBwdWJsaWMgSUh5cGVybGlua1ByZXNlbnRlciBnZXRIeXBlcmxpbmtQcmVzZW50ZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJaWYgKGZQcmVmZXJlbmNlU3RvcmUgPT0gbnVsbCkgewotCQkJcmV0dXJuIHN1cGVyLmdldEh5cGVybGlua1ByZXNlbnRlcihzb3VyY2VWaWV3ZXIpOwotCQl9Ci0JCXJldHVybiBuZXcgTXVsdGlwbGVIeXBlcmxpbmtQcmVzZW50ZXIoZlByZWZlcmVuY2VTdG9yZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29udHJvbCBjcmVhdG9yLiBUaGUgY3JlYXRvciBpcyBhIGZhY3RvcnkKLQkgKiBjcmVhdGluZyBpbmZvcm1hdGlvbiBjb250cm9scyBmb3IgdGhlIGdpdmVuIHNvdXJjZSB2aWV3ZXIuPGJyIC8+Ci0JICogTm90ZTogQ2xpZW50cyBjYW5ub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXQgdGhpcyB0aW1lLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugdmlld2VyIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgaW5mb3JtYXRpb24gY29udHJvbCBjcmVhdG9yCi0JICovCi0JZmluYWwgcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yIGdldEluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJLy8gdXNlZCBieSBob3ZlciBoZWxwCi0JCXJldHVybiBuZXcgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoKSB7Ci0JCQlwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbCBjcmVhdGVJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50KSB7Ci0JCQkJcmV0dXJuIG5ldyBEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sKHBhcmVudCwgbmV3IEhUTUxUZXh0UHJlc2VudGVyKHRydWUpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBwcmVzZW50ZXIgcmVhZHkgdG8gYmUgdXNlZCB3aXRoIHRoZSBnaXZlbgotCSAqIHNvdXJjZSB2aWV3ZXIuCi0JICogPHA+Ci0JICogQ2xpZW50cyBjYW5ub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuIEluc3RlYWQsIGNsaWVudHMgd2FudGluZyB0byBhZGQKLQkgKiB0aGVpciBvd24gaW5mb3JtYXRpb24gcHJvdmlkZXJzIHNob3VsZCBvdmVycmlkZQotCSAqIDxjb2RlPmdldEluZm9ybWF0aW9uUHJvdmlkZXIoSVNvdXJjZVZpZXdlciwgU3RyaW5nKTwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSB2aWV3ZXIgdG8gYmUgY29uZmlndXJlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgY29udGVudCBhc3Npc3RhbnQKLQkgKiBAc2VlICNnZXRJbmZvcm1hdGlvblByb3ZpZGVyKElTb3VyY2VWaWV3ZXIsIFN0cmluZykKLQkgKi8KLQlmaW5hbCBwdWJsaWMgSUluZm9ybWF0aW9uUHJlc2VudGVyIGdldEluZm9ybWF0aW9uUHJlc2VudGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCUluZm9ybWF0aW9uUHJlc2VudGVyIHByZXNlbnRlciA9IG5ldyBJbmZvcm1hdGlvblByZXNlbnRlcihnZXRJbmZvcm1hdGlvblByZXNlbnRlckNvbnRyb2xDcmVhdG9yKHNvdXJjZVZpZXdlcikpOwotCi0JCS8vIGluZm9ybWF0aW9uIHByZXNlbnRlciBjb25maWd1cmF0aW9ucwotCQlwcmVzZW50ZXIuc2V0U2l6ZUNvbnN0cmFpbnRzKDYwLCAxMCwgdHJ1ZSwgdHJ1ZSk7Ci0JCXByZXNlbnRlci5zZXREb2N1bWVudFBhcnRpdGlvbmluZyhnZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcoc291cmNlVmlld2VyKSk7Ci0KLQkJLy8gYWRkIGluZm9ybWF0aW9uIHByb3ZpZGVycyBmb3IgZWFjaCBwYXJ0aXRpb24gdHlwZQotCQlTdHJpbmdbXSB0eXBlcyA9IGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHR5cGUgPSB0eXBlc1tpXTsKLQotCQkJSUluZm9ybWF0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRJbmZvcm1hdGlvblByb3ZpZGVyKHNvdXJjZVZpZXdlciwgdHlwZSk7Ci0JCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCXByZXNlbnRlci5zZXRJbmZvcm1hdGlvblByb3ZpZGVyKHByb3ZpZGVyLCB0eXBlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBwcmVzZW50ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZXIgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIGluZm9ybWF0aW9uCi0JICogcHJlc2VudGF0aW9uIGluIHRoZSBnaXZlbiBzb3VyY2Ugdmlld2VyIGFuZCBmb3IgdGhlIGdpdmVuIHBhcnRpdGlvbgotCSAqIHR5cGUuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSB2aWV3ZXIgdG8gYmUgY29uZmlndXJlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gcGFydGl0aW9uVHlwZQotCSAqICAgICAgICAgICAgdGhlIHBhcnRpdGlvbiB0eXBlIGZvciB3aGljaCB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZXIgaXMKLQkgKiAgICAgICAgICAgIGFwcGxpY2FibGUKLQkgKiBAcmV0dXJuIElJbmZvcm1hdGlvblByb3ZpZGVyIG9yIG51bGwgaWYgc2hvdWxkIG5vdCBiZSBzdXBwb3J0ZWQKLQkgKiBAZGVwcmVjYXRlZCBpbnN0ZWFkIG9mIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBkb2N1bWVudGF0aW9uCi0JICogICAgICAgICAgICAgaW5mb3JtYXRpb24sIGFkb3B0ZXJzIHNob3VsZCB1c2UgdGhlCi0JICogICAgICAgICAgICAgPGNvZGU+ZG9jdW1lbnRhdGlvblRleHRIb3ZlcjwvY29kZT4gZWxlbWVudCBpbiB0aGUKLQkgKiAgICAgICAgICAgICA8Y29kZT5vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXRvckNvbmZpZ3VyYXRpb248L2NvZGU+Ci0JICogICAgICAgICAgICAgZXh0ZW5zaW9uIHBvaW50Ci0JICovCi0JcHJvdGVjdGVkIElJbmZvcm1hdGlvblByb3ZpZGVyIGdldEluZm9ybWF0aW9uUHJvdmlkZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUlUZXh0SG92ZXIgYmVzdE1hdGNoSG92ZXIgPSBuZXcgQmVzdE1hdGNoSG92ZXIoY3JlYXRlRG9jdW1lbnRhdGlvbkhvdmVyKHBhcnRpdGlvblR5cGUpKTsKLQkJcmV0dXJuIG5ldyBUZXh0SG92ZXJJbmZvcm1hdGlvblByb3ZpZGVyKGJlc3RNYXRjaEhvdmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBwcmVzZW50ZXIgY29udHJvbCBjcmVhdG9yLiBUaGUgY3JlYXRvciBpcyBhCi0JICogZmFjdG9yeSBjcmVhdGluZyB0aGUgcHJlc2VudGVyIGNvbnRyb2xzIGZvciB0aGUgZ2l2ZW4gc291cmNlIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgc291cmNlIHZpZXdlciB0byBiZSBjb25maWd1cmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYW4gaW5mb3JtYXRpb24gY29udHJvbCBjcmVhdG9yCi0JICovCi0JcHJpdmF0ZSBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvciBnZXRJbmZvcm1hdGlvblByZXNlbnRlckNvbnRyb2xDcmVhdG9yKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCXJldHVybiBuZXcgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoKSB7Ci0JCQlwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbCBjcmVhdGVJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50KSB7Ci0JCQkJaW50IHNoZWxsU3R5bGUgPSBTV1QuUkVTSVpFIHwgU1dULlRPT0w7Ci0JCQkJaW50IHN0eWxlID0gU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMOwotCQkJCXJldHVybiBuZXcgRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbChwYXJlbnQsIHNoZWxsU3R5bGUsIHN0eWxlLCBuZXcgSFRNTFRleHRQcmVzZW50ZXIoZmFsc2UpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaW5lIHN0eWxlIHByb3ZpZGVycyB0aGF0IHdpbGwgYmUgdXNlZCBmb3Igc3ludGF4Ci0JICogaGlnaGxpZ2h0aW5nIGluIHRoZSBnaXZlbiBzb3VyY2Ugdmlld2VyLgotCSAqIDxwPgotCSAqIE5vdCBmdWxseSBBUEkgc2luY2UgcmV0dXJuIHR5cGUgTGluZVN0eWxlUHJvdmlkZXIgaXMgbm90IEFQSS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSB2aWV3ZXIgdG8gYmUgY29uZmlndXJlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gcGFydGl0aW9uVHlwZQotCSAqICAgICAgICAgICAgdGhlIHBhcnRpdGlvbiB0eXBlIGZvciB3aGljaCB0aGUgbGluZVN0eWxlUHJvdmlkZXJzIGFyZQotCSAqICAgICAgICAgICAgYXBwbGljYWJsZQotCSAqIEByZXR1cm4gTGluZVN0eWxlUHJvdmRlcnMgb3IgbnVsbCBpZiBzaG91bGQgbm90IGJlIHN1cHBvcnRlZAotCSAqLwotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRWaWV3ZXIgY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgcHJlc2VudGF0aW9uCi0JICogcmVjb25jaWxlciwgc28gY2xpZW50cyBjYW5ub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSB0aGVpciBvd24KLQkgKiBwcmVzZW50YXRpb24gcmVjb25jaWxlci4gPGJyIC8+Ci0JICogU2VlIDxjb2RlPmdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyLCBTdHJpbmcpPC9jb2RlPiBmb3IKLQkgKiBhbHRlcm5hdGl2ZSB3YXkgdG8gcHJvdmlkZSBoaWdobGlnaHRpbmcgaW5mb3JtYXRpb24uCi0JICogCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSB2aWV3ZXIgdG8gYmUgY29uZmlndXJlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGFsd2F5cyByZXR1cm5zIG51bGwKLQkgKiBAc2VlICNnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciwgU3RyaW5nKQotCSAqLwotCWZpbmFsIHB1YmxpYyBJUHJlc2VudGF0aW9uUmVjb25jaWxlciBnZXRQcmVzZW50YXRpb25SZWNvbmNpbGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCVN0cnVjdHVyZWRQcmVzZW50YXRpb25SZWNvbmNpbGVyIHJlY29uY2lsZXIgPSBuZXcgU3RydWN0dXJlZFByZXNlbnRhdGlvblJlY29uY2lsZXIoKTsKLQkJcmVjb25jaWxlci5zZXREb2N1bWVudFBhcnRpdGlvbmluZyhnZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcoc291cmNlVmlld2VyKSk7Ci0JCQotCQlTdHJpbmdbXSBjb250ZW50VHlwZXMgPSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQotCQlpZihjb250ZW50VHlwZXMgIT0gbnVsbCkgewotCQkJU3RydWN0dXJlZERvY3VtZW50RGFtYWdlclJlcGFpcmVyIGRyID0gbnVsbDsKLQkJCQotCQkJZm9yKGludCBpID0gMDsgaSA8IGNvbnRlbnRUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCWRyID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudERhbWFnZXJSZXBhaXJlcigpOwotCQkJCWRyLnNldERvY3VtZW50KHNvdXJjZVZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJCQkKLQkJCQlpZihmSGlnaGxpZ2h0ZXIgIT0gbnVsbCkKLQkJCQkJZHIuc2V0UHJvdmlkZXIoZkhpZ2hsaWdodGVyLmdldFByb3ZpZGVyKGNvbnRlbnRUeXBlc1tpXSkpOwotCQkJCQotCQkJCXJlY29uY2lsZXIuc2V0RGFtYWdlcihkciwgY29udGVudFR5cGVzW2ldKTsKLQkJCQlyZWNvbmNpbGVyLnNldFJlcGFpcmVyKGRyLCBjb250ZW50VHlwZXNbaV0pOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmVjb25jaWxlcjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uI2dldE92ZXJ2aWV3UnVsZXJBbm5vdGF0aW9uSG92ZXIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgSUFubm90YXRpb25Ib3ZlciBnZXRPdmVydmlld1J1bGVyQW5ub3RhdGlvbkhvdmVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSG92ZXIodHJ1ZSkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmNsdWRlZChBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJCQlyZXR1cm4gaXNTaG93SW5WZXJ0aWNhbFJ1bGVyKGFubm90YXRpb24pOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uI2dldFF1aWNrQXNzaXN0QXNzaXN0YW50KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIpCi0JICovCi0JcHVibGljIElRdWlja0Fzc2lzdEFzc2lzdGFudCBnZXRRdWlja0Fzc2lzdEFzc2lzdGFudChJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlpZiAoZlF1aWNrQXNzaXN0YW50ID09IG51bGwpIHsKLQkJCUlRdWlja0Fzc2lzdEFzc2lzdGFudCBhc3Npc3RhbnQgPSBuZXcgUXVpY2tBc3Npc3RBc3Npc3RhbnQoKTsKLQkJCWFzc2lzdGFudC5zZXRRdWlja0Fzc2lzdFByb2Nlc3NvcihuZXcgQ29tcG91bmRRdWlja0Fzc2lzdFByb2Nlc3NvcigpKTsKLQkJCWFzc2lzdGFudC5zZXRJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKGdldFF1aWNrQXNzaXN0QXNzaXN0YW50SW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcigpKTsKLQotCQkJLy8gV2FpdGluZyBmb3IgY29sb3IgcHJlZmVyZW5jZXMsIHNlZToKLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzM3MzEKLQkJCS8vIHNldCBjb250ZW50IGFzc2lzdCBwcmVmZXJlbmNlcwotCQkJaWYgKGZQcmVmZXJlbmNlU3RvcmUgIT0gbnVsbCkgewotCQkJCUNvbG9yIGNvbG9yID0gZ2V0Q29sb3IoRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkNPREVBU1NJU1RfUFJPUE9TQUxTX0JBQ0tHUk9VTkQpOwotCQkJCWFzc2lzdGFudC5zZXRQcm9wb3NhbFNlbGVjdG9yQmFja2dyb3VuZChjb2xvcik7Ci0KLQkJCQljb2xvciA9IGdldENvbG9yKEVkaXRvclByZWZlcmVuY2VOYW1lcy5DT0RFQVNTSVNUX1BST1BPU0FMU19GT1JFR1JPVU5EKTsKLQkJCQlhc3Npc3RhbnQuc2V0UHJvcG9zYWxTZWxlY3RvckZvcmVncm91bmQoY29sb3IpOwotCQkJfQotCQkJZlF1aWNrQXNzaXN0YW50ID0gYXNzaXN0YW50OwotCQl9Ci0JCXJldHVybiBmUXVpY2tBc3Npc3RhbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29udHJvbCBjcmVhdG9yIGZvciB0aGUgcXVpY2sgYXNzaXN0IGFzc2lzdGFudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbmZvcm1hdGlvbiBjb250cm9sIGNyZWF0b3IKLQkgKi8KLQlwcml2YXRlIElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yIGdldFF1aWNrQXNzaXN0QXNzaXN0YW50SW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcigpIHsKLQkJCXB1YmxpYyBJSW5mb3JtYXRpb25Db250cm9sIGNyZWF0ZUluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnQpIHsKLQkJCQlyZXR1cm4gbmV3IERlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2wocGFyZW50LCBTV1QuTk9ORSwgbmV3IEhUTUxUZXh0UHJlc2VudGVyKHRydWUpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWNvbmNpbGVyIHJlYWR5IHRvIGJlIHVzZWQgd2l0aCB0aGUgZ2l2ZW4gc291cmNlIHZpZXdlci48YnIgLz4KLQkgKiBOb3RlOiBUaGUgc2FtZSBpbnN0YW5jZSBvZiBJUmVjb25jaWxlciBpcyByZXR1cm5lZCByZWdhcmRsZXNzIG9mIHRoZQotCSAqIHNvdXJjZSB2aWV3ZXIgcGFzc2VkIGluLgotCSAqIDxwPgotCSAqIENsaWVudHMgY2Fubm90IG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBJbnN0ZWFkLCBjbGllbnRzIHdhbnRpbmcgdG8gYWRkCi0JICogdGhlaXIgb3duIHJlY29uY2lsaW5nIHN0cmF0ZWd5IHNob3VsZCB1c2UgdGhlCi0JICogPGNvZGU+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb25zLnNvdXJjZXZhbGlkYXRpb248L2NvZGU+Ci0JICogZXh0ZW5zaW9uIHBvaW50LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgc291cmNlIHZpZXdlciB0byBiZSBjb25maWd1cmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSByZWNvbmNpbGVyCi0JICovCi0JZmluYWwgcHVibGljIElSZWNvbmNpbGVyIGdldFJlY29uY2lsZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJYm9vbGVhbiByZWNvbmNpbGluZ0VuYWJsZWQgPSBmUHJlZmVyZW5jZVN0b3JlLmdldEJvb2xlYW4oQ29tbW9uRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkVWQUxVQVRFX1RFTVBPUkFSWV9QUk9CTEVNUyk7Ci0JCWlmIChzb3VyY2VWaWV3ZXIgPT0gbnVsbCB8fCAhcmVjb25jaWxpbmdFbmFibGVkKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLyoKLQkJICogT25seSBjcmVhdGUgcmVjb25jaWxlciBpZiBzb3VyY2V2aWV3ZXIgaXMgcHJlc2VudAotCQkgKi8KLQkJaWYgKGZSZWNvbmNpbGVyID09IG51bGwgJiYgc291cmNlVmlld2VyICE9IG51bGwpIHsKLQkJCVN0cnVjdHVyZWRSZWdpb25Qcm9jZXNzb3IgcmVjb25jaWxlciA9IG5ldyBTdHJ1Y3R1cmVkUmVnaW9uUHJvY2Vzc29yKCk7Ci0KLQkJCS8vIHJlY29uY2lsZXIgY29uZmlndXJhdGlvbnMKLQkJCXJlY29uY2lsZXIuc2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKHNvdXJjZVZpZXdlcikpOwotCi0JCQlmUmVjb25jaWxlciA9IHJlY29uY2lsZXI7Ci0JCX0KLQkJcmV0dXJuIGZSZWNvbmNpbGVyOwotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKiBAcGFyYW0gdHJlZVZpZXdlcgotCSAqIEByZXR1cm4gYSBsYWJlbCBwcm92aWRlciBwcm92aWRpbmcgdGhlIHN0YXR1cyBsaW5lIGNvbnRlbnRzCi0JICovCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGdldFN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGRvY3VtZW50YXRpb24gaG92ZXIgYmFzZWQgb24gaG92ZXJzIGNvbnRyaWJ1dGVkIHZpYQotCSAqIDxjb2RlPm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbjwvY29kZT4gZXh0ZW5zaW9uCi0JICogcG9pbnQKLQkgKiAKLQkgKiBAcGFyYW0gcGFydGl0aW9uVHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElUZXh0SG92ZXIgY3JlYXRlRG9jdW1lbnRhdGlvbkhvdmVyKFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUlUZXh0SG92ZXIgdGV4dEhvdmVyID0gbnVsbDsKLQkJT2JqZWN0IGV4dGVuZGVkVGV4dEhvdmVyID0gRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpLmdldENvbmZpZ3VyYXRpb24oRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5ET0NVTUVOVEFUSU9OVEVYVEhPVkVSLCBwYXJ0aXRpb25UeXBlKTsKLQkJaWYgKGV4dGVuZGVkVGV4dEhvdmVyIGluc3RhbmNlb2YgSVRleHRIb3ZlcikgewotCQkJdGV4dEhvdmVyID0gKElUZXh0SG92ZXIpIGV4dGVuZGVkVGV4dEhvdmVyOwotCQl9Ci0JCXJldHVybiB0ZXh0SG92ZXI7Ci0JfQotCi0JcHVibGljIElUZXh0SG92ZXIgZ2V0VGV4dEhvdmVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUsIGludCBzdGF0ZU1hc2spIHsKLQkJSVRleHRIb3ZlciB0ZXh0SG92ZXIgPSBudWxsOwotCi0JCS8qCi0JCSAqIFJldHVybnMgYSBkZWZhdWx0IHByb2JsZW0sIGFubm90YXRpb24sIGFuZCBiZXN0IG1hdGNoIGhvdmVyCi0JCSAqIGRlcGVuZGluZyBvbiBzdGF0ZU1hc2sKLQkJICovCi0JCVRleHRIb3Zlck1hbmFnZXIuVGV4dEhvdmVyRGVzY3JpcHRvcltdIGhvdmVyRGVzY3MgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGV4dEhvdmVyTWFuYWdlcigpLmdldFRleHRIb3ZlcnMoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IGhvdmVyRGVzY3MubGVuZ3RoICYmIHRleHRIb3ZlciA9PSBudWxsKSB7Ci0JCQlpZiAoaG92ZXJEZXNjc1tpXS5pc0VuYWJsZWQoKSAmJiBjb21wdXRlU3RhdGVNYXNrKGhvdmVyRGVzY3NbaV0uZ2V0TW9kaWZpZXJTdHJpbmcoKSkgPT0gc3RhdGVNYXNrKSB7Ci0JCQkJU3RyaW5nIGhvdmVyVHlwZSA9IGhvdmVyRGVzY3NbaV0uZ2V0SWQoKTsKLQkJCQlpZiAoVGV4dEhvdmVyTWFuYWdlci5QUk9CTEVNX0hPVkVSLmVxdWFsc0lnbm9yZUNhc2UoaG92ZXJUeXBlKSkKLQkJCQkJdGV4dEhvdmVyID0gbmV3IFByb2JsZW1Bbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IoKTsKLQkJCQllbHNlIGlmIChUZXh0SG92ZXJNYW5hZ2VyLkFOTk9UQVRJT05fSE9WRVIuZXF1YWxzSWdub3JlQ2FzZShob3ZlclR5cGUpKQotCQkJCQl0ZXh0SG92ZXIgPSBuZXcgQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yKCk7Ci0JCQkJZWxzZSBpZiAoVGV4dEhvdmVyTWFuYWdlci5DT01CSU5BVElPTl9IT1ZFUi5lcXVhbHNJZ25vcmVDYXNlKGhvdmVyVHlwZSkpCi0JCQkJCXRleHRIb3ZlciA9IG5ldyBCZXN0TWF0Y2hIb3ZlcihjcmVhdGVEb2N1bWVudGF0aW9uSG92ZXIoY29udGVudFR5cGUpKTsKLQkJCQllbHNlIGlmIChUZXh0SG92ZXJNYW5hZ2VyLkRPQ1VNRU5UQVRJT05fSE9WRVIuZXF1YWxzSWdub3JlQ2FzZShob3ZlclR5cGUpKSB7Ci0JCQkJCXRleHRIb3ZlciA9IGNyZWF0ZURvY3VtZW50YXRpb25Ib3Zlcihjb250ZW50VHlwZSk7Ci0JCQkJfQotCQkJfQotCQkJaSsrOwotCQl9Ci0JCXJldHVybiB0ZXh0SG92ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdW5kbyBtYW5hZ2VyIGZvciB0aGUgZ2l2ZW4gc291cmNlIHZpZXdlci48YnIgLz4KLQkgKiBOb3RlOiBDbGllbnRzIGNhbm5vdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBiZWNhdXNlIHRoaXMgbWV0aG9kIHJldHVybnMgYQotCSAqIHNwZWNpYWxseSBjb25maWd1cmVkIHVuZG8gbWFuYWdlciBmb3IgdGhlIFN0cnVjdHVyZWRUZXh0Vmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugdmlld2VyIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhbiB1bmRvIG1hbmFnZXIgc3BlY2lhbGx5IGNvbmZpZ3VyZWQgZm9yIFN0cnVjdHVyZWRUZXh0Vmlld2VyCi0JICovCi0JZmluYWwgcHVibGljIElVbmRvTWFuYWdlciBnZXRVbmRvTWFuYWdlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkvKgotCQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgYW4gVW5kb01hbmFnZXIgdGhhdCBpcyB1c2VkIGV4Y2x1c2l2ZWx5Ci0JCSAqIGluIFN0cnVjdHVyZWRUZXh0Vmlld2VyCi0JCSAqLwotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyVW5kb01hbmFnZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SGlnaGxpZ2h0ZXIoUmVjb25jaWxlckhpZ2hsaWdodGVyIGhpZ2hsaWdodGVyKSB7Ci0JCWZIaWdobGlnaHRlciA9IGhpZ2hsaWdodGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlclVuZG9NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJVbmRvTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTY0YmM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlclVuZG9NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLQotCi0vKioKLSAqIFVuZG8gbWFuYWdlciBleGNsdXNpdmVseSBmb3IgU3RydWN0dXJlZFRleHRWaWV3ZXJzIE9OTFkuIFRoaXMgdW5kbyBtYW5hZ2VyCi0gKiBpcyBhd2FyZSB0aGF0IHN0cnVjdHVyZWQgZG9jdW1lbnRzIGhhdmUgdGhlaXIgb3duIHVuZG8gbWFuYWdlci4gVGhpcwotICogaGFuZGxlcyBjb21tdW5pY2F0aW9uIGJldHdlZW4gSVVuZG9NYW5hZ2VyIGFuZCBJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlci4KLSAqLwotY2xhc3MgU3RydWN0dXJlZFRleHRWaWV3ZXJVbmRvTWFuYWdlciBpbXBsZW1lbnRzIElVbmRvTWFuYWdlciB7Ci0JY2xhc3MgVW5kb05vdGlmaWVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoKGZVbmRvTWFuYWdlciAhPSBudWxsKSAmJiAoZXZlbnQgIT0gbnVsbCkpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJCQlmVW5kb01hbmFnZXIuZm9yY2VFbmRPZlBlbmRpbmdDb21tYW5kKHRoaXMsICgoSVRleHRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRPZmZzZXQoKSwgKChJVGV4dFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldExlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgU3RydWN0dXJlZFRleHRWaWV3ZXIgZlRleHRWaWV3ZXIgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgZlVuZG9NYW5hZ2VyID0gbnVsbDsKLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgZlVuZG9Ob3RpZmllciA9IG5ldyBVbmRvTm90aWZpZXIoKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXIjYmVnaW5Db21wb3VuZENoYW5nZSgpCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5Db21wb3VuZENoYW5nZSgpIHsKLQkJLy8gZm9yd2FyZCB0aGUgcmVxdWVzdCB0byB0aGUgbW9kZWwtYmFzZWQgdW5kbyBtYW5hZ2VyCi0JCWlmIChmVW5kb01hbmFnZXIgIT0gbnVsbCkKLQkJCWZVbmRvTWFuYWdlci5iZWdpblJlY29yZGluZyhmVGV4dFZpZXdlcik7Ci0JfQotCi0JLyoqCi0JICogQXNzb2NpYXRlcyBhIHZpZXdlciB0byB0aGlzIHVuZG8gbWFuYWdlciBhbmQgYWxzbyBhdHRlbXB0cyB0byBnZXQgdGhlCi0JICogY29ycmVjdCBkb2N1bWVudC1zcGVjaWZpYyB1bmRvIG1hbmFnZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlciAtCi0JICogICAgICAgICAgICBBc3N1bWVzIHZpZXdlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdChJVGV4dFZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gZnV0dXJlX1RPRE8gY291bGQgcHJvYmFibHkgb3B0aW1pemUgdGhpcyB0byBjaGVjayBpZiBhbHJlYWR5Ci0JCS8vIGNvbm5lY3RlZCB0byBzYW1lIHZpZXdlci91bmRvIG1hbmFnZXIsIGRvbnQgZG8gYW55dGhpbmcKLQotCQkvLyBkaXNjb25uZWN0IGZyb20gYW55IG9sZCBtYW5hZ2VyL3ZpZXdlcgotCQlkaXNjb25uZWN0KCk7Ci0KLQkJLy8gY29ubmVjdCB0byBuZXcgdmlld2VyL3VuZG8gbWFuYWdlcgotCQlmVGV4dFZpZXdlciA9IChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyOwotCQlJRG9jdW1lbnQgZG9jID0gZlRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvYzsKLQkJCXNldERvY3VtZW50KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVVuZG9NYW5hZ2VyI2Rpc2Nvbm5lY3QoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0JCS8vIGRpc2Nvbm5lY3QgdGhlIHZpZXdlciBmcm9tIHRoZSB1bmRvIG1hbmFnZXIKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmVGV4dFZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZlVuZG9Ob3RpZmllcik7Ci0JCQlmVW5kb01hbmFnZXIuZGlzY29ubmVjdChmVGV4dFZpZXdlcik7Ci0JCX0KLQotCQkvLyBudWxsIG91dCB0aGUgdmlld2VyIGFuZCB1bmRvIG1hbmFnZXIKLQkJZlRleHRWaWV3ZXIgPSBudWxsOwotCQlmVW5kb01hbmFnZXIgPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXIjZW5kQ29tcG91bmRDaGFuZ2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZENvbXBvdW5kQ2hhbmdlKCkgewotCQkvLyBmb3J3YXJkIHRoZSByZXF1ZXN0IHRvIHRoZSBtb2RlbC1iYXNlZCB1bmRvIG1hbmFnZXIKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKQotCQkJZlVuZG9NYW5hZ2VyLmVuZFJlY29yZGluZyhmVGV4dFZpZXdlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklVbmRvTWFuYWdlciNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQkvLyBmb3J3YXJkIHRoZSByZXF1ZXN0IHRvIHRoZSBtb2RlbC1iYXNlZCB1bmRvIG1hbmFnZXIKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKQotCQkJZlVuZG9NYW5hZ2VyLnJlZG8oZlRleHRWaWV3ZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXIjcmVkb2FibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZG9hYmxlKCkgewotCQlib29sZWFuIGNhblJlZG8gPSBmYWxzZTsKLQotCQkvLyBmb3J3YXJkIHRoZSByZXF1ZXN0IHRvIHRoZSBtb2RlbC1iYXNlZCB1bmRvIG1hbmFnZXIKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKQotCQkJY2FuUmVkbyA9IGZVbmRvTWFuYWdlci5yZWRvYWJsZSgpOwotCi0JCXJldHVybiBjYW5SZWRvOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXIjcmVzZXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQkvLyBjYW5ub3QgcmVhbGx5IHJlc2V0IG1vZGVsLWJhc2VkIHVuZG8gbWFuYWdlciBiZWNhdXNlIG90aGVyIGNsaWVudHMKLQkJLy8gd2lsbCBiZSBhZmZlY3RlZAotCX0KLQotCS8qKgotCSAqIERpc2Nvbm5lY3QgZnJvbSB0aGUgb2xkIHVuZG8gbWFuYWdlciBhbmQgY29ubmVjdCB0byB0aGUgdW5kbyBtYW5hZ2VyCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgZG9jdW1lbnQgaXMgbm90IG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChmVW5kb01hbmFnZXIgIT0gbnVsbCkgewotCQkJZlRleHRWaWV3ZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZVbmRvTm90aWZpZXIpOwotCQkJZlVuZG9NYW5hZ2VyLmRpc2Nvbm5lY3QoZlRleHRWaWV3ZXIpOwotCQl9Ci0KLQkJZlVuZG9NYW5hZ2VyID0gZG9jdW1lbnQuZ2V0VW5kb01hbmFnZXIoKTsKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmVW5kb01hbmFnZXIuY29ubmVjdChmVGV4dFZpZXdlcik7Ci0JCQlmVGV4dFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZlVuZG9Ob3RpZmllcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVVuZG9NYW5hZ2VyI3NldE1heGltYWxVbmRvTGV2ZWwoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1heGltYWxVbmRvTGV2ZWwoaW50IHVuZG9MZXZlbCkgewotCQkvLyBjYW5ub3QgcmVhbGx5IHNldCBtYXhpbWFsIHVuZG8gbGV2ZWwgb24gbW9kZWwtYmFzZWQgdW5kbyBtYW5hZ2VyCi0JCS8vIGJlY2F1c2Ugb3RoZXIgY2xpZW50cyB3aWxsIGJlIGFmZmVjdGVkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklVbmRvTWFuYWdlciN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkvLyBmb3J3YXJkIHRoZSByZXF1ZXN0IHRvIHRoZSBtb2RlbC1iYXNlZCB1bmRvIG1hbmFnZXIKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKQotCQkJZlVuZG9NYW5hZ2VyLnVuZG8oZlRleHRWaWV3ZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXIjdW5kb2FibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVuZG9hYmxlKCkgewotCQlib29sZWFuIGNhblVuZG8gPSBmYWxzZTsKLQotCQkvLyBmb3J3YXJkIHRoZSByZXF1ZXN0IHRvIHRoZSBtb2RlbC1iYXNlZCB1bmRvIG1hbmFnZXIKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKQotCQkJY2FuVW5kbyA9IGZVbmRvTWFuYWdlci51bmRvYWJsZSgpOwotCi0JCXJldHVybiBjYW5VbmRvOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9UZXh0SG92ZXJJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvVGV4dEhvdmVySW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmUyYzFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9UZXh0SG92ZXJJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbjI7Ci0KLWNsYXNzIFRleHRIb3ZlckluZm9ybWF0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJSW5mb3JtYXRpb25Qcm92aWRlciwgSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb24sIElJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uMiB7Ci0JcHJpdmF0ZSBJVGV4dEhvdmVyIGZUZXh0SG92ZXI7Ci0KLQlwdWJsaWMgVGV4dEhvdmVySW5mb3JtYXRpb25Qcm92aWRlcihJVGV4dEhvdmVyIGhvdmVyKSB7Ci0JCWZUZXh0SG92ZXIgPSBob3ZlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gc3ViamVjdCkgewotCQlyZXR1cm4gKFN0cmluZykgZ2V0SW5mb3JtYXRpb24yKHRleHRWaWV3ZXIsIHN1YmplY3QpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24yKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gc3ViamVjdCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlckluZm8odGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotCi0JcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yIGdldEluZm9ybWF0aW9uUHJlc2VudGVyQ29udHJvbENyZWF0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldFN1YmplY3QoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlclJlZ2lvbih0ZXh0Vmlld2VyLCBvZmZzZXQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9BYnN0cmFjdERyb3BBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9BYnN0cmFjdERyb3BBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q1NDg0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvQWJzdHJhY3REcm9wQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotCi0vKioKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RHJvcEFjdGlvbiBpbXBsZW1lbnRzIElEcm9wQWN0aW9uIHsKLQotCS8qCi0JICogUmVwbGFjZXMgdGFyZ2V0RWRpdG9yJ3MgY3VycmVudCBzZWxlY3Rpb24gYnkgInRleHQiCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5zZXJ0KFN0cmluZyB0ZXh0LCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IG51bGw7Ci0JCUlEb2N1bWVudCBkb2MgPSBudWxsOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0KLQkJSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgdG9vbHMgPSAoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMpIHRhcmdldEVkaXRvci5nZXRBZGFwdGVyKElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmNsYXNzKTsKLQkJaWYgKHRvb2xzICE9IG51bGwpIHsKLQkJCWRvYyA9IHRvb2xzLmdldERvY3VtZW50KCk7Ci0JCQlzZWxlY3Rpb24gPSB0b29scy5nZXRTZWxlY3Rpb24oKTsKLQkJfQotCi0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlpZiAodGFyZ2V0RWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIHRhcmdldEVkaXRvcjsKLQkJfQotCQlpZiAodGV4dEVkaXRvciA9PSBudWxsKSB7Ci0JCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSAoKElBZGFwdGFibGUpIHRhcmdldEVkaXRvcikuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCX0KLQkJaWYgKHRleHRFZGl0b3IgPT0gbnVsbCAmJiB0b29scyAhPSBudWxsICYmIHRvb2xzLmdldEVkaXRvclBhcnQoKSBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSB0b29scy5nZXRFZGl0b3JQYXJ0KCk7Ci0JCX0KLQkJaWYgKHRleHRFZGl0b3IgPT0gbnVsbCAmJiB0b29scyAhPSBudWxsICYmIHRvb2xzLmdldEVkaXRvclBhcnQoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSB0b29scy5nZXRFZGl0b3JQYXJ0KCkuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCX0KLQotCQlpZiAoc2VsZWN0aW9uID09IG51bGwgJiYgdGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb24gPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCX0KLQkJaWYgKGRvYyA9PSBudWxsICYmIHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJZG9jID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJfQotCi0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJdHJ5IHsKLQkJCQlkb2MucmVwbGFjZSh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpLCB0ZXh0KTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmICh0ZXh0RWRpdG9yICE9IG51bGwgJiYgdGV4dFNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgc3AgPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlJVGV4dFNlbGVjdGlvbiBzZWwgPSBuZXcgVGV4dFNlbGVjdGlvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0Lmxlbmd0aCgpKTsKLQkJCXNwLnNldFNlbGVjdGlvbihzZWwpOwotCQkJdGV4dEVkaXRvci5zZWxlY3RBbmRSZXZlYWwoc2VsLmdldE9mZnNldCgpLCBzZWwuZ2V0TGVuZ3RoKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0ZWREYXRhKE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJ1bihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQsIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvQ2FyZXRNZWRpYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0NhcmV0TWVkaWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNmMDMxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvQ2FyZXRNZWRpYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC52aWV3LmV2ZW50cy5DYXJldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudmlldy5ldmVudHMuSUNhcmV0TGlzdGVuZXI7Ci0KLS8qKgotICogSGFzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBsaXN0ZW5pbmcgZm9yIGtleSBldmVudHMsIGFuZCBtb3VzZSBldmVudHMsCi0gKiBkZWNpZGluZyBpZiB0aGUgY2FyZXQgaGFzIG1vdmVkICh3aXRob3V0IGEgdGV4dCBjaGFuZ2UpLCBhbmQgaWYgc28sIHdpbGwKLSAqIG5vdGlmeSBDYXJldExpc3RlbmVycyB0aGF0IHRoZSBjYXJldCBoYXMgbW92ZWQuIE9iamVjdHMgd2hpY2ggYXJlCi0gKiBpbnRlcmVzdGVkIGluIEFMTCBjYXJldCBwb3N0aW9uIGNoYW5nZXMgd2lsbCBhbHNvIGhhdmUgdG8gbGlzdGVuIGZvcgotICogdGV4dENoYW5nZWQgZXZlbnRzLgotICogCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSBiYXNlIHNlbGVjdGlvbiBub3RpZmljYXRpb24KLSAqLwotcHVibGljIGNsYXNzIENhcmV0TWVkaWF0b3IgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLQljbGFzcyBDYXJldE1lZGlhdG9yTGlzdGVuZXIgaW1wbGVtZW50cyBLZXlMaXN0ZW5lciwgTW91c2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJaW50ZXJuYWxLZXlQcmVzc2VkKGUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkJaW50ZXJuYWxLZXlSZWxlYXNlZChlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQlpbnRlcm5hbE1vdXNlRG93bihlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQlpbnRlcm5hbE1vdXNlVXAoZSk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBSZWZyZXNoRGVsYXlKb2IgZXh0ZW5kcyBKb2IgewotCQlwcml2YXRlIGludCBmRGVsYXkgPSAwOwotCQlSZWZyZXNoRGVsYXlKb2IoaW50IGRlbGF5KSB7Ci0JCQlzdXBlcihTU0VVSU1lc3NhZ2VzLmNhcmV0X3VwZGF0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXNldFN5c3RlbSh0cnVlKTsKLQkJCWZEZWxheSA9IGRlbGF5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldHVwIGEgZGVsYXllZCBDYXJldEV2ZW50IGZpcmluZwotCQkgKi8KLQkJdm9pZCB0b3VjaCgpIHsKLQkJCWNhbmNlbCgpOwotCQkJc2NoZWR1bGUoZkRlbGF5KTsKLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCWhhbmRsZUV2ZW50KG51bGwpOwotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0JCi0JUmVmcmVzaERlbGF5Sm9iIGZEZWxheWVyID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVMQVkgPSAzMDA7Ci0KLQkvKiogdXNlZCBqdXN0IGZvciBkZWJ1ZyBwcmludCBvdXRzICovCi0JcHJpdmF0ZSBsb25nIGVuZFRpbWU7Ci0JcHJpdmF0ZSBsb25nIHN0YXJ0VGltZTsKLQotCXByb3RlY3RlZCBJQ2FyZXRMaXN0ZW5lcltdIGZDYXJldExpc3RlbmVyczsKLQlwcm90ZWN0ZWQgQ2FyZXRNZWRpYXRvckxpc3RlbmVyIGludGVybmFsTGlzdGVuZXI7Ci0JcHJvdGVjdGVkIFN0eWxlZFRleHQgdGV4dFdpZGdldDsKLQotCS8qKgotCSAqIENhcmV0TWVkaWF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ2FyZXRNZWRpYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYXJldE1lZGlhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuIE11c3QgYWx3YXlzIHByb3ZpZGUgdGhlIHdpZGdldCBpdHMKLQkgKiBzdXBwb3NlZCB0byBsaXN0ZW4gdG8uCi0JICovCi0JcHVibGljIENhcmV0TWVkaWF0b3IoU3R5bGVkVGV4dCBzdHlsZWRUZXh0V2lkZ2V0KSB7Ci0JCXRoaXMoKTsKLQkJc2V0VGV4dFdpZGdldChzdHlsZWRUZXh0V2lkZ2V0KTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQ2FyZXRMaXN0ZW5lcihJQ2FyZXRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2FyZXRNZWRpYXRvcjo6YWRkQ2FyZXRMaXN0ZW5lci4gUmVxdWVzdCB0byBhZGQgYW4gaW5zdGFuY2Ugb2YgIiArIGxpc3RlbmVyLmdldENsYXNzKCkgKyAiIGFzIGEgbGlzdGVuZXIgb24gY2FyZXRsaXN0bmVyLiIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gbWFrZSBzdXJlIGxpc3RlbmVyIGlzIG5vdCBhbHJlYWR5IGluIGxpc3RlbmluZyBhcnJheQotCQkvLyAoYW5kIGlmIGl0IGlzLCBwcmludCBhIHdhcm5pbmcgdG8gYWlkIGRlYnVnZ2luZywgaWYgbmVlZGVkKQotCi0JCWlmIChVdGlsaXRpZXMuY29udGFpbnMoZkNhcmV0TGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhcmV0TWVkaWF0b3I6OmFkZENhcmV0TGlzdGVuZXIuIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgd2FzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLiAiKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYXJldE1lZGlhdG9yOjphZGRDYXJldExpc3RlbmVyLiBBZGRpbmcgYW4gaW5zdGFuY2Ugb2YgIiArIGxpc3RlbmVyLmdldENsYXNzKCkgKyAiIGFzIGEgbGlzdGVuZXIgb24gY2FyZXQgbWVkaWF0b3IuIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBvbGRTaXplID0gMDsKLQkJCWlmIChmQ2FyZXRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCS8vIG5vcm1hbGx5IHdvbid0IGJlIG51bGwsIGJ1dCB3ZSBuZWVkIHRvIGJlIHN1cmUsIGZvciBmaXJzdAotCQkJCS8vIHRpbWUgdGhyb3VnaAotCQkJCW9sZFNpemUgPSBmQ2FyZXRMaXN0ZW5lcnMubGVuZ3RoOwotCQkJfQotCQkJaW50IG5ld1NpemUgPSBvbGRTaXplICsgMTsKLQkJCUlDYXJldExpc3RlbmVyW10gbmV3TGlzdGVuZXJzID0gbmV3IElDYXJldExpc3RlbmVyW25ld1NpemVdOwotCQkJaWYgKGZDYXJldExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShmQ2FyZXRMaXN0ZW5lcnMsIDAsIG5ld0xpc3RlbmVycywgMCwgb2xkU2l6ZSk7Ci0JCQl9Ci0JCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGFzdCBwb3NpdGlvbgotCQkJbmV3TGlzdGVuZXJzW25ld1NpemUgLSAxXSA9IGxpc3RlbmVyOwotCQkJLy8KLQkJCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJCWZDYXJldExpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUNhcmV0RXZlbnQoQ2FyZXRFdmVudCBldmVudCkgewotCQlpZiAoZkNhcmV0TGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSB0byBiZSB0aHJlYWQgc2FmZSwKLQkJCS8vIHNpbmNlIHRoZSBhZGQgYW5kIHJlbW92ZSBsaXN0bmVyIG1ldGhvZHMKLQkJCS8vIGNhbiBjaGFuZ2UgdGhpcyBvYmplY3QncyBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5Ci0JCQkvLyBmcm9tIGFub3RoZXIgdGhyZWFkCi0JCQkvLyAoYW5kIHNpbmNlIG9iamVjdCBhc3NpZ25tZW50IGlzIGF0b21pYywgd2UgZG9uJ3QgbmVlZCB0bwotCQkJLy8gc3luY2hyb25pemUKLQkJCUlDYXJldExpc3RlbmVyW10gaG9sZExpc3RlbmVycyA9IGZDYXJldExpc3RlbmVyczsKLQkJCS8vCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlob2xkTGlzdGVuZXJzW2ldLmNhcmV0TW92ZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBudWxsOwotCi0JCWlmIChEZWJ1Zy5kZWJ1Z0NhcmV0TWVkaWF0b3IpIHsKLQkJCWVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGltZXIgZmlyZWQ6ICIgKyAoZW5kVGltZSAtIHN0YXJ0VGltZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBjaGVjayBpZiAnb2tUb1VzZScKLQkJaWYgKHRleHRXaWRnZXQgIT0gbnVsbCAmJiAhdGV4dFdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWRpc3BsYXkgPSB0ZXh0V2lkZ2V0LmdldERpc3BsYXkoKTsKLQkJCWlmICgoZGlzcGxheSAhPSBudWxsKSAmJiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKHRleHRXaWRnZXQgIT0gbnVsbCAmJiAhdGV4dFdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlmaXJlQ2FyZXRFdmVudChuZXcgQ2FyZXRFdmVudCh0ZXh0V2lkZ2V0LCB0ZXh0V2lkZ2V0LmdldENhcmV0T2Zmc2V0KCkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxLZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJZkRlbGF5ZXIuY2FuY2VsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxLZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCXN3aXRjaCAoZS5rZXlDb2RlKSB7Ci0JCQljYXNlIFNXVC5BUlJPV19ET1dOIDoKLQkJCWNhc2UgU1dULkFSUk9XX1VQIDoKLQkJCWNhc2UgU1dULkFSUk9XX0xFRlQgOgotCQkJY2FzZSBTV1QuQVJST1dfUklHSFQgOgotCQkJY2FzZSBTV1QuSE9NRSA6Ci0JCQljYXNlIFNXVC5FTkQgOgotCQkJY2FzZSBTV1QuUEFHRV9ET1dOIDoKLQkJCWNhc2UgU1dULlBBR0VfVVAgOiB7Ci0JCQkJZkRlbGF5ZXIudG91Y2goKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOiB7Ci0JCQkJLy8gYWx3YXlzIHVwZGF0ZSBjdXJzb3IgcG9zdGlvbiwgZXZlbiBkdXJpbmcgbm9ybWFsIHR5cGluZwotCQkJCS8vICh0aGUgbG9naWMgbWF5IGxvb2sgZnVubnksIHNpbmNlIHdlIGFsd2F5cyB0byB0aGUgc2FtZQotCQkJCS8vIHRoaW5nLCBidXQgd2UgaGF2ZW4ndCBhbHdheXMgZG9uZSB0aGUgc2FtZSB0aGluZywgc28gSQotCQkJCS8vIHdhbnRlZCB0byBsZWF2ZSB0aGF0IGZhY3QgZG9jdW1lbnRlZCB2aWEgY29kZS4pCi0JCQkJZkRlbGF5ZXIudG91Y2goKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGludGVybmFsTW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQlmRGVsYXllci5jYW5jZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbE1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCS8vIE5vdGUsIGV2ZW4gZHVyaW5nIGEgc3dpcGUgc2VsZWN0LCB3aGVuIHRoZSBtb3VzZSBidXR0b24gZ29lcyB1cCwKLQkJLy8gYW5kIHRoZSB3aWRnZXQgaXMKLQkJLy8gcXVlcmllZCBmb3IgdGhlIGN1cnJlbnQgY2FyZXQgcG9zdGlvbiwgaXQgYWx3YXlzIHJldHVybnMgdGhlCi0JCS8vIGJlZ2lubmluZyBvZiB0aGUgc2VsZWN0aW9uLAotCQkvLyB3aGljaCBpcyBkZXNpcmFibGUgKGF0IGxlYXN0IGZvciB0aGUga25vd24gdXNlIG9mIHRoaXMgZmVhdHVyZSwKLQkJLy8gd2hpY2ggaXMgdG8gc2lnbmFsCi0JCS8vIHRoYXQgdGhlIHByb3BlcnR5IHNoZWV0IGNhbiB1cGRhdGUgaXRzZWxmLgotCQlmRGVsYXllci50b3VjaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWZEZWxheWVyLmNhbmNlbCgpOwotCQlpZiAodGV4dFdpZGdldCAhPSBudWxsICYmICF0ZXh0V2lkZ2V0LmlzRGlzcG9zZWQoKSkgewotCQkJdGV4dFdpZGdldC5yZW1vdmVLZXlMaXN0ZW5lcihpbnRlcm5hbExpc3RlbmVyKTsKLQkJCXRleHRXaWRnZXQucmVtb3ZlTW91c2VMaXN0ZW5lcihpbnRlcm5hbExpc3RlbmVyKTsKLQkJCXRleHRXaWRnZXQgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUNhcmV0TGlzdGVuZXIoSUNhcmV0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKChmQ2FyZXRMaXN0ZW5lcnMgIT0gbnVsbCkgJiYgKGxpc3RlbmVyICE9IG51bGwpKSB7Ci0JCQkvLyBpZiBpdHMgbm90IGluIHRoZSBsaXN0ZW5lcnMsIHdlJ2xsIGlnbm9yZSB0aGUgcmVxdWVzdAotCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmQ2FyZXRMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCWludCBvbGRTaXplID0gZkNhcmV0TGlzdGVuZXJzLmxlbmd0aDsKLQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgLSAxOwotCQkJCUlDYXJldExpc3RlbmVyW10gbmV3TGlzdGVuZXJzID0gbmV3IElDYXJldExpc3RlbmVyW25ld1NpemVdOwotCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRTaXplOyBpKyspIHsKLQkJCQkJaWYgKGZDYXJldExpc3RlbmVyc1tpXSA9PSBsaXN0ZW5lcikgeyAvLyBpZ25vcmUKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdHMgbm90IHRoZSBvbmUgd2UgYXJlIHJlbW92aW5nCi0JCQkJCQluZXdMaXN0ZW5lcnNbaW5kZXgrK10gPSBmQ2FyZXRMaXN0ZW5lcnNbaV07Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gbm93IHRoYXQgd2UgaGF2ZSBhIG5ldyBhcnJheSwgbGV0J3Mgc3dpdGNoIGl0IGZvciB0aGUgb2xkCi0JCQkJLy8gb25lCi0JCQkJZkNhcmV0TGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dFdpZGdldChTdHlsZWRUZXh0IG5ld1RleHRXaWRnZXQpIHsKLQkJaWYoZkRlbGF5ZXIgPT0gbnVsbCkgewotCQkJZkRlbGF5ZXIgPSBuZXcgUmVmcmVzaERlbGF5Sm9iKERFTEFZKTsKLQkJfQotCi0JCS8vIHVuaG9vayBmcm9tIHByZXZpb3VzLCBpZiBhbnkKLQkJaWYgKHRoaXMudGV4dFdpZGdldCAhPSBudWxsKSB7Ci0JCQlmRGVsYXllci5jYW5jZWwoKTsKLQkJCXRoaXMudGV4dFdpZGdldC5yZW1vdmVLZXlMaXN0ZW5lcihpbnRlcm5hbExpc3RlbmVyKTsKLQkJCXRoaXMudGV4dFdpZGdldC5yZW1vdmVNb3VzZUxpc3RlbmVyKGludGVybmFsTGlzdGVuZXIpOwotCQl9Ci0KLQkJdGhpcy50ZXh0V2lkZ2V0ID0gbmV3VGV4dFdpZGdldDsKLQotCQlpZiAoaW50ZXJuYWxMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlpbnRlcm5hbExpc3RlbmVyID0gbmV3IENhcmV0TWVkaWF0b3JMaXN0ZW5lcigpOwotCQl9Ci0KLQkJaWYgKHRoaXMudGV4dFdpZGdldCAhPSBudWxsKSB7Ci0JCQl0aGlzLnRleHRXaWRnZXQuYWRkS2V5TGlzdGVuZXIoaW50ZXJuYWxMaXN0ZW5lcik7Ci0JCQl0aGlzLnRleHRXaWRnZXQuYWRkTW91c2VMaXN0ZW5lcihpbnRlcm5hbExpc3RlbmVyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9FeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWFhNzM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9FeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBTaW1wbGUgZ2VuZXJpYyBJRCB0byBjbGFzcyB0byBtYXBwaW5nLiBMb2FkcyBhIHNwZWNpZmllZCBjbGFzcyBkZWZpbmVkIGluIGEKLSAqIGNvbmZpZ3VyYXRpb24gZWxlbWVudCB3aXRoIHRoZSBtYXRjaGluZyB0eXBlIGFuZCB0YXJnZXQgSUQuIEV4YW1wbGUKLSAqIHBsdWdpbi54bWwgc2VjdGlvbjoKLSAqIAotICogJmx0O2V4dGVuc2lvbgotICogcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uJnF1b3Q7Jmd0O2NvbnRlbnRvdXRsaW5lY29uZmlndXJhdGlvbgotICogdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLndzdC5zc2UuZHRkLmNvcmUuZHRkc291cmNlJnF1b3Q7Ci0gKiBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmR0ZC52aWV3cy5jb250ZW50b3V0bGluZS5EVERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24mcXVvdDsvJmd0OwotICogJmx0Oy9leHRlbnNpb24mZ3Q7Ci0gKiAKLSAqIFVzZWQgaW4gY29kZSBieSBnZXRDb25maWd1cmF0aW9uKCZxdW90O2NvbnRlbnRvdXRsaW5lY29uZmlndXJhdGlvbiZxdW90OywKLSAqICZxdW90O29yZy5lY2xpcHNlLndzdC5kdGQudWkuU3RydWN0dXJlZFRleHRFZGl0b3JEVEQmcXVvdDspOwotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCS8qKgotCSAqIEV4dGVuc2lvbiB0eXBlIHRvIHBhc3MgaW50byBnZXRDb25maWd1cmF0aW9ucyB0byBnZXQgY29udGVudCBvdXRsaW5lCi0JICogY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRPVVRMSU5FQ09ORklHVVJBVElPTiA9ICJjb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogRXh0ZW5zaW9uIHR5cGUgdG8gcGFzcyBpbnRvIGdldENvbmZpZ3VyYXRpb25zIHRvIGdldCBwcm9wZXJ0eSBzaGVldAotCSAqIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWVNIRUVUQ09ORklHVVJBVElPTiA9ICJwcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBFeHRlbnNpb24gdHlwZSB0byBwYXNzIGludG8gZ2V0Q29uZmlndXJhdGlvbnMgdG8gZ2V0IHNvdXJjZSB2aWV3ZXIKLQkgKiBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFVklFV0VSQ09ORklHVVJBVElPTiA9ICJzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEV4dGVuc2lvbiB0eXBlIHRvIHBhc3MgaW50byBnZXRDb25maWd1cmF0aW9ucyB0byBnZXQgZG9jdW1lbnRhdGlvbiB0ZXh0Ci0JICogaG92ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVEFUSU9OVEVYVEhPVkVSID0gImRvY3VtZW50YXRpb25UZXh0SG92ZXIiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogRXh0ZW5zaW9uIHR5cGUgdG8gcGFzcyBpbnRvIGdldENvbmZpZ3VyYXRpb25zIHRvIGdldCBkb3VibGUgY2xpY2sKLQkgKiBzdHJhdGVneQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRUNMSUNLU1RSQVRFR1kgPSAiZG91YmxlQ2xpY2tTdHJhdGVneSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UQVJHRVQgPSAidGFyZ2V0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OID0gInByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBNYXAgY29uZmlndXJhdGlvbk1hcCA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1RpbWUgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9leHRlbmRlZGNvbmZpZ3VyYXRpb25idWlsZGVyL3RpbWUiKSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGSU5JVElPTiA9ICJwcm92aXNpb25hbERlZmluaXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVQX0VYVEVOREVEQ09ORklHVVJBVElPTiA9ICJlZGl0b3JDb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIgaW5zdGFuY2UgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBleHRlbnNpb24uIElmIHRoZSBleHRlbnNpb24gcGx1Z2luIGhhcyBub3QgYmVlbiBsb2FkZWQgYQotCSAqIGJ1c3kgY3Vyc29yIHdpbGwgYmUgYWN0aXZhdGVkIGR1cmluZyB0aGUgZHVyYXRpb24gb2YgdGhlIGxvYWQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBjb25maWcgZWxlbWVudCBkZWZpbmluZyB0aGUgZXh0ZW5zaW9uCi0JICogQHBhcmFtIGNsYXNzQXR0cmlidXRlCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGNhcnJ5aW5nIHRoZSBjbGFzcwotCSAqIEByZXR1cm5zIHRoZSBleHRlbnNpb24gb2JqZWN0IGlmIHN1Y2Nlc3NmdWwuIElmIGFuIGVycm9yIG9jY3VycyB3aGVuCi0JICogICAgICAgICAgY3JlYXRlaW5nIGV4ZWN1dGFibGUgZXh0ZW5zaW9uLCB0aGUgZXhjZXB0aW9uIGlzIGxvZ2dlZCwgYW5kCi0JICogICAgICAgICAgbnVsbCByZXR1cm5lZC4KLQkgKi8KLQlzdGF0aWMgT2JqZWN0IGNyZWF0ZUV4dGVuc2lvbihmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgZmluYWwgU3RyaW5nIGNsYXNzQXR0cmlidXRlLCBmaW5hbCBTdHJpbmcgdGFyZ2V0SUQpIHsKLQkJZmluYWwgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFsxXTsKLQkJU3RyaW5nIHBsdWdpbklkID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCWlmIChidW5kbGUuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQl0cnkgewotCQkJCXJlc3VsdFswXSA9IGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihjbGFzc0F0dHJpYnV0ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBjYXRjaCBhbmQgbG9nIEFOWSBleGNlcHRpb24gd2hpbGUgY3JlYXRpbmcgdGhlIGV4dGVuc2lvbgotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImVycm9yIGxvYWRpbmcgY2xhc3MgIiArIGNsYXNzQXR0cmlidXRlICsgIiBmb3IgIiArIHRhcmdldElELCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShudWxsLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJcmVzdWx0WzBdID0gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGNsYXNzQXR0cmlidXRlKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGNhdGNoIGFuZCBsb2cgQU5ZIGV4Y2VwdGlvbiBmcm9tIGV4dGVuc2lvbiBwb2ludAotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXJyb3IgbG9hZGluZyBjbGFzcyAiICsgY2xhc3NBdHRyaWJ1dGUgKyAiIGZvciAiICsgdGFyZ2V0SUQsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCXJldHVybiByZXN1bHRbMF07Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlsb25nIHRpbWUwID0gMDsKLQotCXByaXZhdGUgRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgY3JlYXRlQ29uZmlndXJhdGlvbnMoTGlzdCBjb25maWd1cmF0aW9ucywgU3RyaW5nIGV4dGVuc2lvblR5cGUsIFN0cmluZyB0YXJnZXRJRCkgewotCQlpZiAoY29uZmlndXJhdGlvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KDApOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgY29uZmlndXJhdGlvbnMuZ2V0KGkpOwotCQkJaWYgKChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoZXh0ZW5zaW9uVHlwZSkgfHwgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhDT05GSUdVUkFUSU9OKSAmJiBleHRlbnNpb25UeXBlLmVxdWFscyhlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVFlQRSkpKSkpIHsKLQkJCQlTdHJpbmdbXSB0YXJnZXRzID0gU3RyaW5nVXRpbHMudW5wYWNrKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UQVJHRVQpKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHRhcmdldHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKHRhcmdldElELmVxdWFscyh0YXJnZXRzW2pdLnRyaW0oKSkpIHsKLQkJCQkJCU9iamVjdCBvID0gY3JlYXRlRXh0ZW5zaW9uKGVsZW1lbnQsIEFUVF9DTEFTUywgdGFyZ2V0SUQpOwotCQkJCQkJaWYgKG8gIT0gbnVsbCkgewotCQkJCQkJCXJlc3VsdC5hZGQobyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGZpbmRDb25maWd1cmF0aW9uRWxlbWVudHMoTGlzdCBjb25maWd1cmF0aW9ucywgU3RyaW5nIGV4dGVuc2lvblR5cGUsIFN0cmluZyB0YXJnZXRJRCkgewotCQlpZiAoY29uZmlndXJhdGlvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50WzBdOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgY29uZmlndXJhdGlvbnMuZ2V0KGkpOwotCQkJaWYgKChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoZXh0ZW5zaW9uVHlwZSkgfHwgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhERUZJTklUSU9OKSAmJiBleHRlbnNpb25UeXBlLmVxdWFscyhlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVFlQRSkpKSkpIHsKLQkJCQlTdHJpbmdbXSB0YXJnZXRzID0gU3RyaW5nVXRpbHMudW5wYWNrKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UQVJHRVQpKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHRhcmdldHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKHRhcmdldElELmVxdWFscyh0YXJnZXRzW2pdLnRyaW0oKSkpIHsKLQkJCQkJCXJlc3VsdC5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElDb25maWd1cmF0aW9uRWxlbWVudFswXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBnaXZlbiBleHRlbnNpb25UeXBlIG1hdGNoaW5nIHRoZQotCSAqIHRhcmdldElELCBpZiBvbmUgaXMgYXZhaWxhYmxlLiBJZiBtb3JlIHRoYW4gb25lIGNvbmZpZ3VyYXRpb24gaXMKLQkgKiBkZWZpbmVkLCB0aGUgZmlyc3Qgb25lIGZvdW5kIGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBleHRlbnNpb25UeXBlCi0JICogQHBhcmFtIHRhcmdldElECi0JICogQHJldHVybiBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBpZiBvbmUgd2FzIGRlZmluZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbmZpZ3VyYXRpb24oU3RyaW5nIGV4dGVuc2lvblR5cGUsIFN0cmluZyB0YXJnZXRJRCkgewotCQlpZiAodGFyZ2V0SUQgPT0gbnVsbCB8fCB0YXJnZXRJRC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgY29uZmlndXJhdGlvbnMgPSBnZXRDb25maWd1cmF0aW9ucyhleHRlbnNpb25UeXBlLCB0YXJnZXRJRCk7Ci0JCWlmIChjb25maWd1cmF0aW9ucy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb25zLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBjb25maWd1cmF0aW9ucyBmb3IgdGhlIGdpdmVuIGV4dGVuc2lvblR5cGUgbWF0Y2hpbmcgdGhlCi0JICogdGFyZ2V0SUQsIGlmIGFueSBhcmUgYXZhaWxhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBleHRlbnNpb25UeXBlCi0JICogQHBhcmFtIHRhcmdldElECi0JICogQHJldHVybiBhIExpc3Qgb2YgY29uZmlndXJhdGlvbiBvYmplY3RzLCB3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSBlbXB0eQotCSAqLwotCXB1YmxpYyBMaXN0IGdldENvbmZpZ3VyYXRpb25zKFN0cmluZyBleHRlbnNpb25UeXBlLCBTdHJpbmcgdGFyZ2V0SUQpIHsKLQkJaWYgKHRhcmdldElEID09IG51bGwgfHwgdGFyZ2V0SUQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KDApOwotCQlpZiAoY29uZmlndXJhdGlvbk1hcCA9PSBudWxsKSB7Ci0JCQljb25maWd1cmF0aW9uTWFwID0gbmV3IEhhc2hNYXAoMCk7Ci0JCQlzeW5jaHJvbml6ZWQgKGNvbmZpZ3VyYXRpb25NYXApIHsKLQkJCQlyZWFkUmVnaXN0cnkoUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSwgU1NFVUlQbHVnaW4uSUQsIEVQX0VYVEVOREVEQ09ORklHVVJBVElPTik7Ci0JCQkJaWYgKGRlYnVnVGltZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI3JlYWRSZWdpc3RyeSgpOiAgIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTGlzdCBleHRlbnNpb25zID0gKExpc3QpIGNvbmZpZ3VyYXRpb25NYXAuZ2V0KGV4dGVuc2lvblR5cGUpOwotCQlMaXN0IGNvbmZpZ3VyYXRpb25zID0gY3JlYXRlQ29uZmlndXJhdGlvbnMoZXh0ZW5zaW9ucywgZXh0ZW5zaW9uVHlwZSwgdGFyZ2V0SUQpOwotCQlpZiAoZGVidWdUaW1lKSB7Ci0JCQlpZiAoIWNvbmZpZ3VyYXRpb25zLmlzRW1wdHkoKSkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2dldENvbmZpZ3VyYXRpb24oIiArIGV4dGVuc2lvblR5cGUgKyAiLCAiICsgdGFyZ2V0SUQgKyAiKTogY29uZmlndXJhdGlvbnMgbG9hZGVkIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJZWxzZQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjZ2V0Q29uZmlndXJhdGlvbigiICsgZXh0ZW5zaW9uVHlwZSArICIsICIgKyB0YXJnZXRJRCArICIpOiByYW4gaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCX0KLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb25zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIGRlY2xhcmVkIGRlZmluaXRpb25zIGZvciB0aGUgZ2l2ZW4gZXh0ZW5zaW9uVHlwZSBtYXRjaGluZwotCSAqIHRoZSB0YXJnZXRJRCwgaWYgYW55IGFyZSBhdmFpbGFibGUuCi0JICogCi0JICogQHBhcmFtIGV4dGVuc2lvblR5cGUKLQkgKiBAcGFyYW0gdGFyZ2V0SUQKLQkgKiBAcmV0dXJuIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGRlZmluaXRpb25zLCBlbXB0eSBpZiBub25lIHdlcmUKLQkgKiAgICAgICAgIGRlY2xhcmVkCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldERlZmluaXRpb25zKFN0cmluZyBleHRlbnNpb25UeXBlLCBTdHJpbmcgdGFyZ2V0SUQpIHsKLQkJaWYgKHRhcmdldElEID09IG51bGwgfHwgdGFyZ2V0SUQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQlpZiAoZGVidWdUaW1lKSB7Ci0JCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCWlmIChjb25maWd1cmF0aW9uTWFwID09IG51bGwpIHsKLQkJCWNvbmZpZ3VyYXRpb25NYXAgPSBuZXcgSGFzaE1hcCgwKTsKLQkJCXN5bmNocm9uaXplZCAoY29uZmlndXJhdGlvbk1hcCkgewotCQkJCXJlYWRSZWdpc3RyeShQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLCBTU0VVSVBsdWdpbi5JRCwgRVBfRVhURU5ERURDT05GSUdVUkFUSU9OKTsKLQkJCQlpZiAoZGVidWdUaW1lKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjcmVhZFJlZ2lzdHJ5KCk6ICAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlMaXN0IGRlZmluaXRpb25zID0gKExpc3QpIGNvbmZpZ3VyYXRpb25NYXAuZ2V0KGV4dGVuc2lvblR5cGUpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGZpbmRDb25maWd1cmF0aW9uRWxlbWVudHMoZGVmaW5pdGlvbnMsIGV4dGVuc2lvblR5cGUsIHRhcmdldElEKTsKLQkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1tlbGVtZW50cy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJdmFsdWVzW2ldID0gZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKFZBTFVFKTsKLQkJfQotCQlpZiAoZGVidWdUaW1lKSB7Ci0JCQlpZiAodmFsdWVzLmxlbmd0aCA+IDApCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNnZXREZWZpbml0aW9ucygiICsgZXh0ZW5zaW9uVHlwZSArICIsICIgKyB0YXJnZXRJRCArICIpOiBkZWZpbml0aW9uIGxvYWRlZCBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCWVsc2UKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2dldERlZmluaXRpb25zKCIgKyBleHRlbnNpb25UeXBlICsgIiwgIiArIHRhcmdldElEICsgIik6IHJhbiBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJfQotCQlyZXR1cm4gdmFsdWVzOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCWlmIChuYW1lLmVxdWFscyhDT05GSUdVUkFUSU9OKSB8fCBuYW1lLmVxdWFscyhERUZJTklUSU9OKSkKLQkJCW5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVFlQRSk7Ci0JCUxpc3QgY29uZmlndXJhdGlvbnMgPSAoTGlzdCkgY29uZmlndXJhdGlvbk1hcC5nZXQobmFtZSk7Ci0JCWlmIChjb25maWd1cmF0aW9ucyA9PSBudWxsKSB7Ci0JCQljb25maWd1cmF0aW9ucyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQljb25maWd1cmF0aW9uTWFwLnB1dChuYW1lLCBjb25maWd1cmF0aW9ucyk7Ci0JCX0KLQkJY29uZmlndXJhdGlvbnMuYWRkKGVsZW1lbnQpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNzc2NDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0V4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JS2V5QmluZGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLkFjdGlvbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb24uSUV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb24uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyB0aGUgcmVnaXN0cnkgZm9yIGV4dGVuc2lvbnMgdGhhdCBwbHVnIGludG8gJ2VkaXRvckFjdGlvbnMnCi0gKiBleHRlbnNpb24gcG9pbnQuCi0gKi8KLQotcHVibGljIGNsYXNzIEV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCXB1YmxpYyBjbGFzcyBFeHRlbmRlZENvbnRyaWJ1dG9yIGltcGxlbWVudHMgSUV4dGVuZGVkQ29udHJpYnV0b3IsIElNZW51TGlzdGVuZXIgewotCQlwcml2YXRlIElFeHRlbmRlZFNpbXBsZUVkaXRvciBhY3RpdmVFeHRlbmRlZEVkaXRvciA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBMaXN0IGNhY2hlOwotCQlwcml2YXRlIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlwcml2YXRlIElNZW51TWFuYWdlciBtZW51QmFyID0gbnVsbDsKLQotCQlwcml2YXRlIFNldCBtZW51cyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJcHVibGljIEV4dGVuZGVkQ29udHJpYnV0b3IoTGlzdCBjYWNoZSkgewotCQkJdGhpcy5jYWNoZSA9IGNhY2hlOwotCQl9Ci0KLQkJcHJpdmF0ZSBJRXh0ZW5kZWRTaW1wbGVFZGl0b3IgY29tcHV0ZUV4dGVuZGVkRWRpdG9yKGZpbmFsIElFZGl0b3JQYXJ0IGVkaXRvcikgewotCQkJSUV4dGVuZGVkU2ltcGxlRWRpdG9yIHNpbXBsZUVkaXRvciA9IG51bGw7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSUV4dGVuZGVkU2ltcGxlRWRpdG9yKSB7Ci0JCQkJc2ltcGxlRWRpdG9yID0gKElFeHRlbmRlZFNpbXBsZUVkaXRvcikgZWRpdG9yOwotCQkJfQotCQkJaWYgKGVkaXRvciAhPSBudWxsICYmIHNpbXBsZUVkaXRvciA9PSBudWxsKSB7Ci0JCQkJZmluYWwgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgdG9vbHMgPSAoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMpIGVkaXRvci5nZXRBZGFwdGVyKElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmNsYXNzKTsKLQkJCQlpZiAodG9vbHMgIT0gbnVsbCkgewotCQkJCQlzaW1wbGVFZGl0b3IgPSBuZXcgSUV4dGVuZGVkU2ltcGxlRWRpdG9yKCkgewotCQkJCQkJcHVibGljIGludCBnZXRDYXJldFBvc2l0aW9uKCkgewotCQkJCQkJCXJldHVybiB0b29scy5nZXRDYXJldE9mZnNldCgpOwotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQkJCQkJCXJldHVybiB0b29scy5nZXREb2N1bWVudCgpOwotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgSUVkaXRvclBhcnQgZ2V0RWRpdG9yUGFydCgpIHsKLQkJCQkJCQlyZXR1cm4gdG9vbHMuZ2V0RWRpdG9yUGFydCgpOwotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uUmFuZ2UoKSB7Ci0JCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gdG9vbHMuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJcmV0dXJuIG5ldyBQb2ludChzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCQl9Ci0KLQkJCQkJfTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc2ltcGxlRWRpdG9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQkJbWVudUJhciA9IG1lbnU7Ci0JCQlsb25nIHRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGNhY2hlLmdldChpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25FbGVtZW50KSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBtZW51RWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIG9iajsKLQkJCQkJaWYgKChtZW51RWxlbWVudC5nZXROYW1lKCkpLmVxdWFscyhUQUdfTUVOVSkpIHsKLQkJCQkJCWNvbnRyaWJ1dGVNZW51KG1lbnVFbGVtZW50LCBtZW51LCB0cnVlKTsKLQkJCQkJCWlmIChkZWJ1Z01lbnUpCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjb250cmlidXRlVG9NZW51KCkgYWRkZWQ6ICIgKyBtZW51RWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBBY3Rpb25EZXNjcmlwdG9yKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlBY3Rpb25EZXNjcmlwdG9yIGFkID0gKEFjdGlvbkRlc2NyaXB0b3IpIG9iajsKLQkJCQkJCUlNZW51TWFuYWdlciBtbSA9IGNvbnRyaWJ1dGVNZW51QWN0aW9uKGFkLCBtZW51LCB0cnVlLCBmYWxzZSk7Ci0JCQkJCQlpZiAobW0gIT0gbnVsbCkgewotCQkJCQkJCW1hcC5wdXQoYWQuZ2V0Q29udHJpYnV0aW9uSXRlbSgpLCBtbSk7Ci0JCQkJCQkJbW0uYWRkTWVudUxpc3RlbmVyKHRoaXMpOwotCQkJCQkJCW1lbnVzLmFkZChtbSk7Ci0JCQkJCQkJaWYgKGRlYnVnTWVudSkKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjb250cmlidXRlVG9NZW51KCkgYWRkZWQ6ICIgKyBhZC5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiY29udHJpYnV0aW5nIHRvIG1lbnUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRlYnVnQ29udHJpYnV0ZVRpbWUpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjb250cmlidXRlVG9NZW51KCk6IHJhbiBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvUG9wdXBNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCQlsb25nIHRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGNhY2hlLmdldChpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25FbGVtZW50KSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBtZW51RWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIG9iajsKLQkJCQkJaWYgKChtZW51RWxlbWVudC5nZXROYW1lKCkpLmVxdWFscyhUQUdfUE9QVVBNRU5VKSkgewotCQkJCQkJY29udHJpYnV0ZU1lbnUobWVudUVsZW1lbnQsIG1lbnUsIHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGlvbkRlc2NyaXB0b3IpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUFjdGlvbkRlc2NyaXB0b3IgYWQgPSAoQWN0aW9uRGVzY3JpcHRvcikgb2JqOwotCQkJCQkJSUFjdGlvbiBhID0gYWQuZ2V0QWN0aW9uKCk7Ci0JCQkJCQlpZiAoYSBpbnN0YW5jZW9mIElFeHRlbmRlZEVkaXRvckFjdGlvbikgewotCQkJCQkJCS8vIHVuY2F1Z2h0IGV4Y2VwdGlvbnMgY291bGQgY2F1c2UgdGhlIG1lbnUgdG8gbm90Ci0JCQkJCQkJLy8gYmUgc2hvd24KLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpZiAoKChhZC5nZXRQb3B1cE1lbnVQYXRoKCkgIT0gbnVsbCkgfHwgKGFkLmdldFBvcHVwTWVudUdyb3VwKCkgIT0gbnVsbCkpICYmIChhIGluc3RhbmNlb2YgSUV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcpKSB7Ci0JCQkJCQkJCSAgICAoKElFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nKWEpLnJlYWxpemUoKTsKLQkJCQkJCQkJfQotCi0JCQkJCQkJCUlFeHRlbmRlZEVkaXRvckFjdGlvbiBlZWEgPSAoSUV4dGVuZGVkRWRpdG9yQWN0aW9uKSBhOwotCQkJCQkJCQllZWEuc2V0QWN0aXZlRXh0ZW5kZWRFZGl0b3IoYWN0aXZlRXh0ZW5kZWRFZGl0b3IpOwotCQkJCQkJCQllZWEudXBkYXRlKCk7Ci0JCQkJCQkJCWlmIChlZWEuaXNWaXNpYmxlKCkpIHsKLQkJCQkJCQkJCUlNZW51TWFuYWdlciBwYXJlbnQgPSBjb250cmlidXRlTWVudUFjdGlvbihhZCwgbWVudSwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJCQkJCQlpZiAoZGVidWdQb3B1cCAmJiBwYXJlbnQgIT0gbnVsbCkKLQkJCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NvbnRyaWJ1dGVUb1BvcHVwTWVudSgpIGFkZGVkOiAiICsgYWQuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCUlNZW51TWFuYWdlciBwYXJlbnQgPSBjb250cmlidXRlTWVudUFjdGlvbihhZCwgbWVudSwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJCQkJaWYgKGRlYnVnUG9wdXAgJiYgcGFyZW50ICE9IG51bGwpCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY29udHJpYnV0ZVRvUG9wdXBNZW51KCkgYWRkZWQ6ICIgKyBhZC5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiY29udHJpYnV0aW5nIHRvIHBvcHVwIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChkZWJ1Z0NvbnRyaWJ1dGVUaW1lKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY29udHJpYnV0ZVRvUG9wdXBNZW51KCk6IHJhbiBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvU3RhdHVzTGluZShJU3RhdHVzTGluZU1hbmFnZXIgbWFuYWdlcikgewotCQkJLy8gbm90aGluZyBmcm9tIGhlcmUKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCWxvbmcgdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGUuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gY2FjaGUuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpb25EZXNjcmlwdG9yKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlBY3Rpb25EZXNjcmlwdG9yIGFkID0gKEFjdGlvbkRlc2NyaXB0b3IpIG9iajsKLQkJCQkJCUlBY3Rpb24gYSA9IGFkLmdldEFjdGlvbigpOwotCQkJCQkJaWYgKGEgaW5zdGFuY2VvZiBJRXh0ZW5kZWRFZGl0b3JBY3Rpb24pIHsKLQkJCQkJCQlpZiAoKChhZC5nZXRUb29sYmFyUGF0aCgpICE9IG51bGwpIHx8IChhZC5nZXRUb29sYmFyR3JvdXAoKSAhPSBudWxsKSkgJiYgKGEgaW5zdGFuY2VvZiBJRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZykpIHsKLQkJCQkJCQkgICAgKChJRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZylhKS5yZWFsaXplKCk7Ci0JCQkJCQkJfQotCQkJCQkJCUlFeHRlbmRlZEVkaXRvckFjdGlvbiBlZWEgPSAoSUV4dGVuZGVkRWRpdG9yQWN0aW9uKSBhOwotCQkJCQkJCWVlYS5zZXRBY3RpdmVFeHRlbmRlZEVkaXRvcihhY3RpdmVFeHRlbmRlZEVkaXRvcik7Ci0JCQkJCQkJZWVhLnVwZGF0ZSgpOwotCQkJCQkJCWlmIChlZWEuaXNWaXNpYmxlKCkpIHsKLQkJCQkJCQkJYm9vbGVhbiBjb250cmlidXRlZCA9IGNvbnRyaWJ1dGVUb29sYmFyQWN0aW9uKGFkLCBtYW5hZ2VyLCB0cnVlKTsKLQkJCQkJCQkJaWYgKGRlYnVnVG9vbGJhciAmJiBjb250cmlidXRlZCkKLQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY29udHJpYnV0ZVRvVG9vbEJhcigpIGFkZGVkOiAiICsgYWQuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWlmIChkZWJ1Z1Rvb2xiYXIpCi0JCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NvbnRyaWJ1dGVUb1Rvb2xCYXIoKTogW3NraXBwZWRdICIgKyBhZC5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWJvb2xlYW4gY29udHJpYnV0ZWQgPSBjb250cmlidXRlVG9vbGJhckFjdGlvbihhZCwgbWFuYWdlciwgdHJ1ZSk7Ci0JCQkJCQkJaWYgKGRlYnVnVG9vbGJhciAmJiBjb250cmlidXRlZCkKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjb250cmlidXRlVG9Ub29sQmFyKCkgYWRkZWQ6ICIgKyBhZC5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiY29udHJpYnV0aW5nIHRvIHRvb2xiYXIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRlYnVnQ29udHJpYnV0ZVRpbWUpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjb250cmlidXRlVG9Ub29sQmFyKCk6IHJhbiBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gbWVudXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIElNZW51TWFuYWdlcikgewotCQkJCQkoKElNZW51TWFuYWdlcikgbykucmVtb3ZlTWVudUxpc3RlbmVyKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYmFycywgSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQkJLy8gbm90aGluZyBmcm9tIGhlcmUKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudSkgewotCQkJLy8gc2xvd3MgZG93biB0aGUgbWVudSBhbmQgaW50ZXJmZXJlcyB3aXRoIGl0IGZvciBvdGhlciBlZGl0b3JzOwotCQkJLy8gb3B0aW1pemUgb24gdmlzaWJpbGl0eQotCQkJSUVkaXRvclNpdGUgc2l0ZSA9IG51bGw7Ci0JCQlib29sZWFuIGFjdGl2ZUVkaXRvcklzVmlzaWJsZSA9IGZhbHNlOwotCi0JCQlpZiAoYWN0aXZlRXh0ZW5kZWRFZGl0b3IgIT0gbnVsbCAmJiBhY3RpdmVFeHRlbmRlZEVkaXRvci5nZXRFZGl0b3JQYXJ0KCkgIT0gbnVsbCkKLQkJCQlzaXRlID0gYWN0aXZlRXh0ZW5kZWRFZGl0b3IuZ2V0RWRpdG9yUGFydCgpLmdldEVkaXRvclNpdGUoKTsKLQkJCWlmIChzaXRlID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQkvLyBFY2xpcHNlIGJ1ZyA0ODc4NCAtIFtNUEVdIENsYXNzQ2FzdCBleGNlcHRpb24gV29ya2JlbmNoIHBhZ2UKLQkJCS8vIGlzUGFydFZpc2lhYmxlIGZvciBNdWx0aVBhZ2VTaXRlCi0JCQlpZiAoc2l0ZSBpbnN0YW5jZW9mIE11bHRpUGFnZUVkaXRvclNpdGUpIHsKLQkJCQlPYmplY3QgbXVsdGlQYWdlRWRpdG9yID0gKChNdWx0aVBhZ2VFZGl0b3JTaXRlKSBzaXRlKS5nZXRNdWx0aVBhZ2VFZGl0b3IoKTsKLQkJCQlhY3RpdmVFZGl0b3JJc1Zpc2libGUgPSBtdWx0aVBhZ2VFZGl0b3IuZXF1YWxzKHNpdGUuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpKSB8fCBtdWx0aVBhZ2VFZGl0b3IuZXF1YWxzKHNpdGUuZ2V0UGFnZSgpLmdldEFjdGl2ZVBhcnQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhY3RpdmVFZGl0b3JJc1Zpc2libGUgPSBzaXRlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFBhcnRTZXJ2aWNlKCkuZ2V0QWN0aXZlUGFydCgpLmVxdWFscyhhY3RpdmVFeHRlbmRlZEVkaXRvci5nZXRFZGl0b3JQYXJ0KCkpOwotCQkJfQotCQkJLy8gZHVlIHRvIGEgZGVsYXkgY2xhc3MgbG9hZGluZywgZG9uJ3QgcmV0dXJuIG5vdwotLy8JCQlpZiAoIWFjdGl2ZUVkaXRvcklzVmlzaWJsZSkKLS8vCQkJCXJldHVybjsKLQotCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IG1lbnUuZ2V0SXRlbXMoKTsKLQkJCWlmIChpdGVtcyA9PSBudWxsIHx8IGl0ZW1zLmxlbmd0aCA9PSAwKQotCQkJCXJldHVybjsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkgewotCQkJCS8vIGFkZCBtZW51IGxpc3RlbmVyIHRvIHN1Ym1lbnUKLQkJCQlpZiAoaXRlbXNbaV0gaW5zdGFuY2VvZiBJTWVudU1hbmFnZXIpIHsKLQkJCQkJKChJTWVudU1hbmFnZXIpIGl0ZW1zW2ldKS5hZGRNZW51TGlzdGVuZXIodGhpcyk7Ci0JCQkJCW1lbnVzLmFkZChpdGVtc1tpXSk7Ci0JCQkJfQotCQkJfQotCi0JCQlTZXQga2V5cyA9IG1hcC5rZXlTZXQoKTsKLQkJCUl0ZXJhdG9yIGl0ID0ga2V5cy5pdGVyYXRvcigpOwotCQkJYm9vbGVhbiBuZWVkQWN0aW9uQ29udHJpYnV0aW9uSXRlbVVwZGF0ZSA9IGZhbHNlOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSAoSUNvbnRyaWJ1dGlvbkl0ZW0pIGl0Lm5leHQoKTsKLQkJCQlJTWVudU1hbmFnZXIgbW0gPSAoSU1lbnVNYW5hZ2VyKSBtYXAuZ2V0KGl0ZW0pOwotCQkJCWlmIChtZW51LmdldElkKCkgIT0gbnVsbCAmJiBtZW51LmdldElkKCkuZXF1YWxzKG1tLmdldElkKCkpICYmIGl0ZW0gaW5zdGFuY2VvZiBBY3Rpb25Db250cmlidXRpb25JdGVtKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJQWN0aW9uIGFjdGlvbiA9ICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgaXRlbSkuZ2V0QWN0aW9uKCk7Ci0KLQkJCQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBJRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZykgewotCQkJCQkJICAgIElFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nIGVlYSA9IChJRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZylhY3Rpb247Ci0JCQkJCQkgICAgaWYgKGVlYS5pc0J1bmRsZUFjdGl2ZSgpID09IHRydWUgJiYgZWVhLmlzUmVhbGl6ZWQoKSA9PSBmYWxzZSkgewotCQkJCQkJICAgICAgICBlZWEucmVhbGl6ZSgpOwotCQkJCQkJICAgICAgICBuZWVkQWN0aW9uQ29udHJpYnV0aW9uSXRlbVVwZGF0ZSA9IHRydWU7Ci0JCQkJCQkgICAgfQotCQkJCQkJfQotCi0JCQkJCQlpZiAoYWN0aXZlRWRpdG9ySXNWaXNpYmxlIHx8IG5lZWRBY3Rpb25Db250cmlidXRpb25JdGVtVXBkYXRlKSB7Ci0JCQkJCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIElVcGRhdGUpIHsKLQkJCQkJCQkJKChJVXBkYXRlKSBhY3Rpb24pLnVwZGF0ZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJaWYgKGFjdGl2ZUVkaXRvcklzVmlzaWJsZSB8fCBuZWVkQWN0aW9uQ29udHJpYnV0aW9uSXRlbVVwZGF0ZSkgewotCQkJCQkJCWJvb2xlYW4gdmlzaWJsZSA9IHRydWU7Ci0JCQkJCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIElFeHRlbmRlZEVkaXRvckFjdGlvbikgewotCQkJCQkJCQl2aXNpYmxlID0gKChJRXh0ZW5kZWRFZGl0b3JBY3Rpb24pIGFjdGlvbikuaXNWaXNpYmxlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWl0ZW0uc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKG5lZWRBY3Rpb25Db250cmlidXRpb25JdGVtVXBkYXRlKSB7Ci0JCQkJCQkgICAgKChBY3Rpb25Db250cmlidXRpb25JdGVtKWl0ZW0pLnVwZGF0ZSgpOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJ1cGRhdGluZyBhY3Rpb25zIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChhY3RpdmVFZGl0b3JJc1Zpc2libGUgfHwgbmVlZEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW1VcGRhdGUpIHsKLQkJCSAgICBpZiAobmVlZEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW1VcGRhdGUpIHsKLQkJCSAgICAgICAgLy8gdGhlIGFjdGlvbiBpcyByZWFsaXplZCBzbyB0aGF0IG5lZWQgdG8gdXBkYXRlIHRoZSBtZW51IHcvCi0JCQkgICAgICAgIC8vIGZvcmNlIHNldCB0byB0cnVlCi0JCQkgICAgICAgIG1lbnUudXBkYXRlKHRydWUpOwotCQkJICAgIH0gZWxzZSB7Ci0JCQkgICAgICAgIG1lbnUudXBkYXRlKGZhbHNlKTsKLQkJCSAgICB9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCQlhY3RpdmVFeHRlbmRlZEVkaXRvciA9IGNvbXB1dGVFeHRlbmRlZEVkaXRvcihlZGl0b3IpOwotCQkJSUtleUJpbmRpbmdTZXJ2aWNlIHN2YyA9IChlZGl0b3IgIT0gbnVsbCkgPyBlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldEtleUJpbmRpbmdTZXJ2aWNlKCkgOiBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYWNoZS5zaXplKCk7IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBjYWNoZS5nZXQoaSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGlvbkRlc2NyaXB0b3IpIHsKLQkJCQkJQWN0aW9uRGVzY3JpcHRvciBhZCA9IChBY3Rpb25EZXNjcmlwdG9yKSBvYmo7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJQWN0aW9uIGFjdGlvbiA9IGFkLmdldEFjdGlvbigpOwotCQkJCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIElFeHRlbmRlZEVkaXRvckFjdGlvbikgewotCQkJCQkJCSgoSUV4dGVuZGVkRWRpdG9yQWN0aW9uKSBhY3Rpb24pLnNldEFjdGl2ZUV4dGVuZGVkRWRpdG9yKGFjdGl2ZUV4dGVuZGVkRWRpdG9yKTsKLQkJCQkJCQkoKElFeHRlbmRlZEVkaXRvckFjdGlvbikgYWN0aW9uKS51cGRhdGUoKTsKLQkJCQkJCQkvLyB1cGRhdGUgdmlzaWJpbGl0eSByaWdodCBub3cgc28gdGhhdCB0aGUgbWVudQotCQkJCQkJCS8vIHdpbGwgc2hvdy9oaWRlIHByb3Blcmx5Ci0JCQkJCQkJaWYgKCEoKElFeHRlbmRlZEVkaXRvckFjdGlvbikgYWN0aW9uKS5pc1Zpc2libGUoKSAmJiBhZC5nZXRDb250cmlidXRpb25JdGVtKCkgIT0gbnVsbCkKLQkJCQkJCQkJYWQuZ2V0Q29udHJpYnV0aW9uSXRlbSgpLnNldFZpc2libGUoZmFsc2UpOwotCQkJCQkJCWlmIChzdmMgIT0gbnVsbCAmJiBhY3Rpb24uZ2V0QWN0aW9uRGVmaW5pdGlvbklkKCkgIT0gbnVsbCkgewotCQkJCQkJCQlzdmMucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJzZXR0aW5nIGFjdGl2ZSBlZGl0b3Igb24gYWN0aW9ucyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChtZW51QmFyICE9IG51bGwgJiYgZWRpdG9yICE9IG51bGwpIHsKLQkJCQkvLyBDbGFzcyBjbHogPSBlZGl0b3IuZ2V0Q2xhc3MoKTsKLQkJCQkvLyB3aGlsZSAoY2x6ICE9IG51bGwpIHsKLQkJCQkvLyBpZiAoY2x6LmdldE5hbWUoKS5lcXVhbHModGFyZ2V0SUQpKSB7Ci0JCQkJLy8gY29udHJpYnV0ZVRvTWVudShtZW51QmFyKTsKLQkJCQkvLyBicmVhazsKLQkJCQkvLyB9Ci0JCQkJLy8gY2x6ID0gY2x6LmdldFN1cGVyY2xhc3MoKTsKLQkJCQkvLyB9Ci0JCQkJaWYgKHRhcmdldElEcy5jb250YWlucyhlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldElkKCkpKSB7Ci0JCQkJCWNvbnRyaWJ1dGVUb01lbnUobWVudUJhcik7Ci0JCQkJfQotCQkJfQotCi0JCQl1cGRhdGVUb29sYmFyQWN0aW9ucygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdXBkYXRlVG9vbGJhckFjdGlvbnMoKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGNhY2hlLmdldChpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aW9uRGVzY3JpcHRvcikgewotCQkJCQl0cnkgewotCQkJCQkJQWN0aW9uRGVzY3JpcHRvciBhZCA9IChBY3Rpb25EZXNjcmlwdG9yKSBvYmo7Ci0JCQkJCQlpZiAoYWQuZ2V0VG9vbGJhclBhdGgoKSAhPSBudWxsKSB7Ci0JCQkJCQkJSUFjdGlvbiBhY3Rpb24gPSBhZC5nZXRBY3Rpb24oKTsKLQkJCQkJCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgSVVwZGF0ZSkgewotCQkJCQkJCQkoKElVcGRhdGUpIGFjdGlvbikudXBkYXRlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigidXBkYXRpbmcgdG9vbGJhciBhY3Rpb25zIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTEFCRUwgPSAibGFiZWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUEFUSCA9ICJwYXRoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1RBUkdFVF9JRCA9ICJ0YXJnZXRJRCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGJvb2xlYW4gZGVidWdDb250cmlidXRlVGltZSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2V4dGVuZGVkZWRpdG9yYWN0aW9uYnVpbGRlci9jb250cmlidXRldGltZSIpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBib29sZWFuIGRlYnVnTWVudSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2V4dGVuZGVkZWRpdG9yYWN0aW9uYnVpbGRlci9kZWJ1Z21lbnUiKSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQ7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBib29sZWFuIGRlYnVnUG9wdXAgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9leHRlbmRlZGVkaXRvcmFjdGlvbmJ1aWxkZXIvZGVidWdwb3B1cCIpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJDsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGJvb2xlYW4gZGVidWdSZWFkVGltZSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2V4dGVuZGVkZWRpdG9yYWN0aW9uYnVpbGRlci9yZWFkdGltZSIpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1Rvb2xiYXIgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9leHRlbmRlZGVkaXRvcmFjdGlvbmJ1aWxkZXIvZGVidWd0b29sYmFyIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOREVEX0VESVRPUiA9ICJleHRlbmRlZEVkaXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMX0VYVEVOREVEX0VESVRPUl9BQ1RJT05TID0gImV4dGVuZGVkRWRpdG9yQWN0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BQ1RJT04gPSAiYWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NPTlRSSUJVVElPTl9UWVBFID0gImVkaXRvckNvbnRyaWJ1dGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19NRU5VID0gIm1lbnUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BPUFVQTUVOVSA9ICJwb3B1cG1lbnUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JVTEVSTUVOVSA9ICJydWxlcm1lbnUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1NFUEFSQVRPUiA9ICJzZXBhcmF0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgTGlzdCByZWFkaW5nQ2FjaGU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldENvbnRyaWJ1dGlvblRhZzsKLQlwcm90ZWN0ZWQgTGlzdCB0YXJnZXRJRHM7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbWVudSBmcm9tIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgbWVudSBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKiBhbmQgYWRkcyBpdCBpbnRvIHRoZSBwcm92aWRlZCBtZW51IG1hbmFnZXIuIElmICdhcHBlbmRJZk1pc3NpbmcnIGlzCi0JICogdHJ1ZSwgYW5kIG1lbnUgcGF0aCBzbG90IGlzIG5vdCBmb3VuZCwgaXQgd2lsbCBiZSBjcmVhdGVkIGFuZCBtZW51IHdpbGwKLQkgKiBiZSBhZGRlZCBpbnRvIGl0LiBPdGhlcndpc2UsIGFkZCBvcGVyYXRpb24gd2lsbCBmYWlsLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVNZW51KElDb25maWd1cmF0aW9uRWxlbWVudCBtZW51RWxlbWVudCwgSU1lbnVNYW5hZ2VyIG1uZywgYm9vbGVhbiBhcHBlbmRJZk1pc3NpbmcpIHsKLQkJLy8gR2V0IGNvbmZpZyBkYXRhLgotCQlTdHJpbmcgaWQgPSBtZW51RWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJU3RyaW5nIGxhYmVsID0gbWVudUVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9MQUJFTCk7Ci0JCVN0cmluZyBwYXRoID0gbWVudUVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QQVRIKTsKLQkJaWYgKGxhYmVsID09IG51bGwpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiSW52YWxpZCBNZW51IEV4dGVuc2lvbiAobGFiZWwgPT0gbnVsbCk6ICIgKyBpZCk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIENhbGN1bGF0ZSBtZW51IHBhdGggYW5kIGdyb3VwLgotCQlTdHJpbmcgZ3JvdXAgPSBudWxsOwotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlpbnQgbG9jID0gcGF0aC5sYXN0SW5kZXhPZignLycpOwotCQkJaWYgKGxvYyAhPSAtMSkgewotCQkJCWdyb3VwID0gcGF0aC5zdWJzdHJpbmcobG9jICsgMSk7Ci0JCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIGxvYyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBhc3N1bWUgdGhhdCBwYXRoIHJlcHJlc2VudHMgYSBzbG90Ci0JCQkJLy8gc28gYWN0dWFsIHBhdGggcG9ydGlvbiBzaG91bGQgYmUgbnVsbAotCQkJCWdyb3VwID0gcGF0aDsKLQkJCQlwYXRoID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8vIEZpbmQgcGFyZW50IG1lbnUuCi0JCUlNZW51TWFuYWdlciBwYXJlbnQgPSBtbmc7Ci0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCXBhcmVudCA9IG1uZy5maW5kTWVudVVzaW5nUGF0aChwYXRoKTsKLQkJCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJCS8vIExvZ2dlci5sb2coIkludmFsaWQgTWVudSBFeHRlbnNpb24gKFBhdGggaXMgaW52YWxpZCk6ICIgKwotCQkJCS8vIGlkKTsvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJLy8gSU1lbnVNYW5hZ2VyLmZpbmRNZW51VXNpbmdQYXRoKCkgcmV0dXJucyBpbnZpc2libGUgbWVudSBpdGVtIGlmCi0JCQkvLyB0aGUgbWFuYWdlciBjYW4ndCBmaW5kCi0JCQkvLyB0aGUgc3BlY2lmaWVkIHBhdGggYW5kIGNyZWF0ZSBuZXcgTWVudU1hbmFnZXIgZm9yIGl0LgotCQkJLy8gSSBkb24ndCBrbm93IHRoaXMgaXMgYSBzcGVjaWZpY2F0aW9uIG9yIGJ1Zy4KLQkJCS8vIEFueXdheSwgdG8gZW5zdXJlIHRoZSBtZW51IGNhbiBiZSB2aXNpYmxlLCBzZXRWaXNpYmxlKHRydWUpCi0JCQkvLyBuZWVkcyB0byBiZSBjYWxsZWQuCi0JCQlwYXJlbnQuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCi0JCS8vIEZpbmQgcmVmZXJlbmNlIGdyb3VwLgotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCWdyb3VwID0gSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlM7Ci0JCUlDb250cmlidXRpb25JdGVtIHNlcCA9IHBhcmVudC5maW5kKGdyb3VwKTsKLQkJaWYgKHNlcCA9PSBudWxsKSB7Ci0JCQlpZiAoYXBwZW5kSWZNaXNzaW5nKQotCQkJCXBhcmVudC5hZGQobmV3IFNlcGFyYXRvcihncm91cCkpOwotCQkJZWxzZSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbnZhbGlkIE1lbnUgRXh0ZW5zaW9uIChHcm91cCBpcyBpbnZhbGlkKTogIiArIGlkKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8vIElmIHRoZSBtZW51IGRvZXMgbm90IGV4aXN0IGNyZWF0ZSBpdC4KLQkJSU1lbnVNYW5hZ2VyIG5ld01lbnUgPSBwYXJlbnQuZmluZE1lbnVVc2luZ1BhdGgoaWQpOwotCQlpZiAobmV3TWVudSA9PSBudWxsKQotCQkJbmV3TWVudSA9IG5ldyBNZW51TWFuYWdlcihsYWJlbCwgaWQpOwotCi0JCS8vIENyZWF0ZSBzZXBhcmF0b3JzLgotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IG1lbnVFbGVtZW50LmdldENoaWxkcmVuKFRBR19TRVBBUkFUT1IpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQljb250cmlidXRlU2VwYXJhdG9yKG5ld01lbnUsIGNoaWxkcmVuW2ldKTsKLQkJfQotCi0JCS8vIEFkZCBuZXcgbWVudQotCQl0cnkgewotCQkJcGFyZW50Lmluc2VydEFmdGVyKGdyb3VwLCBuZXdNZW51KTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiSW52YWxpZCBNZW51IEV4dGVuc2lvbiAoR3JvdXAgaXMgbWlzc2luZyk6ICIgKyBpZCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnRyaWJ1dGVzIGFjdGlvbiBmcm9tIGFjdGlvbiBkZXNjcmlwdG9yIGludG8gdGhlIHByb3ZpZGVkIG1lbnUKLQkgKiBtYW5hZ2VyLgotCSAqLwotCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY29udHJpYnV0ZU1lbnVBY3Rpb24oQWN0aW9uRGVzY3JpcHRvciBhZCwgSU1lbnVNYW5hZ2VyIG1lbnUsIGJvb2xlYW4gYXBwZW5kSWZNaXNzaW5nLCBib29sZWFuIHBvcHVwbWVudSkgewotCQlpZiAoYWQuZ2V0Q29udHJpYnV0aW9uSXRlbSgpID09IG51bGwgfHwgYWQuZ2V0QWN0aW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIEdldCBjb25maWcgZGF0YS4KLQkJU3RyaW5nIG1wYXRoID0gcG9wdXBtZW51ID8gYWQuZ2V0UG9wdXBNZW51UGF0aCgpIDogYWQuZ2V0TWVudVBhdGgoKTsKLQkJU3RyaW5nIG1ncm91cCA9IHBvcHVwbWVudSA/IGFkLmdldFBvcHVwTWVudUdyb3VwKCkgOiBhZC5nZXRNZW51R3JvdXAoKTsKLQkJaWYgKG1wYXRoID09IG51bGwgJiYgbWdyb3VwID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBGaW5kIHBhcmVudCBtZW51LgotCQlJTWVudU1hbmFnZXIgcGFyZW50ID0gbWVudTsKLQkJaWYgKG1wYXRoICE9IG51bGwpIHsKLQkJCXBhcmVudCA9IHBhcmVudC5maW5kTWVudVVzaW5nUGF0aChtcGF0aCk7Ci0JCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCQkvLyBMb2dnZXIubG9nKCJJbnZhbGlkIE1lbnUgRXh0ZW5zaW9uIChQYXRoIGlzIGludmFsaWQpOiAiICsKLQkJCQkvLyBhZC5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJLy8gSU1lbnVNYW5hZ2VyLmZpbmRNZW51VXNpbmdQYXRoKCkgcmV0dXJucyBpbnZpc2libGUgbWVudSBpdGVtIGlmCi0JCQkvLyB0aGUgbWFuYWdlciBjYW4ndCBmaW5kCi0JCQkvLyB0aGUgc3BlY2lmaWVkIHBhdGggYW5kIGNyZWF0ZSBuZXcgTWVudU1hbmFnZXIgZm9yIGl0LgotCQkJLy8gSSBkb24ndCBrbm93IHRoaXMgaXMgYSBzcGVjaWZpY2F0aW9uIG9yIGJ1Zy4KLQkJCS8vIEFueXdheSwgdG8gZW5zdXJlIHRoZSBtZW51IGNhbiBiZSB2aXNpYmxlLCBzZXRWaXNpYmxlKHRydWUpCi0JCQkvLyBuZWVkcyB0byBiZSBjYWxsZWQuCi0JCQlwYXJlbnQuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCi0JCS8vIEZpcnN0IHJlbW92ZSBleGlzdGluZyBtZW51IGl0ZW0KLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IHBhcmVudC5maW5kKGFkLmdldElkKCkpOwotCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQlwYXJlbnQucmVtb3ZlKGFkLmdldElkKCkpOwotCQl9Ci0KLQkJLy8gRmluZCByZWZlcmVuY2UgZ3JvdXAuCi0JCWlmIChtZ3JvdXAgPT0gbnVsbCkKLQkJCW1ncm91cCA9IElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TOwotCQlJQ29udHJpYnV0aW9uSXRlbSBzZXAgPSBwYXJlbnQuZmluZChtZ3JvdXApOwotCQlpZiAoc2VwID09IG51bGwpIHsKLQkJCWlmIChhcHBlbmRJZk1pc3NpbmcpCi0JCQkJcGFyZW50LmFkZChzZXAgPSBuZXcgU2VwYXJhdG9yKG1ncm91cCkpOwotCQkJZWxzZSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbnZhbGlkIE1lbnUgRXh0ZW5zaW9uIChHcm91cCBpcyBpbnZhbGlkKTogIiArIGFkLmdldElkKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQkvLyBBZGQgYWN0aW9uLgotCQl0cnkgewotCQkJaWYgKHBvcHVwbWVudSkgewotCQkJCS8vIENvbnRleHQgbWVudSBuZWVkIGEgbmV3bHkgY3JlYXRlZCBjb250cmlidXRpb24gaXRlbQotCQkJCWlmIChzZXAgIT0gbnVsbCAmJiBzZXAuaXNHcm91cE1hcmtlcigpKQotCQkJCQlwYXJlbnQuYXBwZW5kVG9Hcm91cChzZXAuZ2V0SWQoKSwgYWQuZ2V0QWN0aW9uKCkpOwotCQkJCWVsc2UKLQkJCQkJcGFyZW50Lmluc2VydEFmdGVyKG1ncm91cCwgYWQuZ2V0QWN0aW9uKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gTm9ybWFsIG1lbnUgbmVlZCB0byBhZGQgZXhpc3RpbmcgY29udHJpYnV0aW9uIGl0ZW0gdG8KLQkJCQkvLyByZW1vdmUgaXQgZnJvbSBtZW51IGxpc3RlbmVyCi0JCQkJaWYgKHNlcCAhPSBudWxsICYmIHNlcC5pc0dyb3VwTWFya2VyKCkpCi0JCQkJCXBhcmVudC5hcHBlbmRUb0dyb3VwKHNlcC5nZXRJZCgpLCBhZC5nZXRDb250cmlidXRpb25JdGVtKCkpOwotCQkJCWVsc2UKLQkJCQkJcGFyZW50Lmluc2VydEFmdGVyKG1ncm91cCwgYWQuZ2V0Q29udHJpYnV0aW9uSXRlbSgpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiSW52YWxpZCBNZW51IEV4dGVuc2lvbiAoR3JvdXAgaXMgbWlzc2luZyk6ICIgKyBhZC5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJcGFyZW50ID0gbnVsbDsKLQkJfQotCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5hbWVkIG1lbnUgc2VwYXJhdG9yIGZyb20gdGhlIGluZm9ybWF0aW9uIGluIHRoZQotCSAqIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4gSWYgdGhlIHNlcGFyYXRvciBhbHJlYWR5IGV4aXN0cyBkbyBub3QgY3JlYXRlIGEKLQkgKiBzZWNvbmQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udHJpYnV0ZVNlcGFyYXRvcihJTWVudU1hbmFnZXIgbWVudSwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX05BTUUpOwotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA8PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJQ29udHJpYnV0aW9uSXRlbSBzZXAgPSBtZW51LmZpbmQoaWQpOwotCQlpZiAoc2VwICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoaWQpKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ29udHJpYnV0ZXMgYWN0aW9uIGZyb20gdGhlIGFjdGlvbiBkZXNjcmlwdG9yIGludG8gdGhlIHByb3ZpZGVkIHRvb2wKLQkgKiBiYXIgbWFuYWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250cmlidXRlVG9vbGJhckFjdGlvbihBY3Rpb25EZXNjcmlwdG9yIGFkLCBJVG9vbEJhck1hbmFnZXIgdG9vbGJhciwgYm9vbGVhbiBhcHBlbmRJZk1pc3NpbmcpIHsKLQkJaWYgKGFkLmdldENvbnRyaWJ1dGlvbkl0ZW0oKSA9PSBudWxsIHx8IGFkLmdldEFjdGlvbigpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gR2V0IGNvbmZpZyBkYXRhLgotCQlTdHJpbmcgdHBhdGggPSBhZC5nZXRUb29sYmFyUGF0aCgpOwotCQlTdHJpbmcgdGdyb3VwID0gYWQuZ2V0VG9vbGJhckdyb3VwKCk7Ci0JCWlmICh0cGF0aCA9PSBudWxsICYmIHRncm91cCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIEZpcnN0IHJlbW92ZSBleGlzdGluZyB0b29sYmFyIGl0ZW0KLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IHRvb2xiYXIuZmluZChhZC5nZXRJZCgpKTsKLQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJdG9vbGJhci5yZW1vdmUoYWQuZ2V0SWQoKSk7Ci0JCX0KLQotCQkvLyBGaW5kIHJlZmVyZW5jZSBncm91cC4KLQkJaWYgKHRncm91cCA9PSBudWxsKQotCQkJdGdyb3VwID0gSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlM7Ci0JCUlDb250cmlidXRpb25JdGVtIHNlcCA9IHRvb2xiYXIuZmluZCh0Z3JvdXApOwotCQlpZiAoc2VwID09IG51bGwpIHsKLQkJCWlmIChhcHBlbmRJZk1pc3NpbmcpCi0JCQkJdG9vbGJhci5hZGQobmV3IFNlcGFyYXRvcih0Z3JvdXApKTsKLQkJCWVsc2UgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiSW52YWxpZCBUb29sYmFyIEV4dGVuc2lvbiAoR3JvdXAgaXMgaW52YWxpZCk6ICIgKyBhZC5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCS8vIEFkZCBhY3Rpb24gdG8gdG9vbCBiYXIuCi0JCXRyeSB7Ci0JCQlpZiAoc2VwICE9IG51bGwgJiYgc2VwLmlzR3JvdXBNYXJrZXIoKSkKLQkJCQl0b29sYmFyLmFwcGVuZFRvR3JvdXAoc2VwLmdldElkKCksIGFkLmdldEFjdGlvbigpKTsKLQkJCWVsc2UKLQkJCQl0b29sYmFyLmluc2VydEFmdGVyKHRncm91cCwgYWQuZ2V0QWN0aW9uKCkpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbnZhbGlkIFRvb2xiYXIgRXh0ZW5zaW9uIChHcm91cCBpcyBtaXNzaW5nKTogIiArIGFkLmdldElkKCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmYWN0b3J5IG1ldGhvZCByZXR1cm5zIGEgbmV3IEFjdGlvbkRlc2NyaXB0b3IgZm9yIHRoZQotCSAqIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4gSXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMuCi0JICovCi0JcHJvdGVjdGVkIEFjdGlvbkRlc2NyaXB0b3IgY3JlYXRlQWN0aW9uRGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlBY3Rpb25EZXNjcmlwdG9yIGFkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFkID0gbmV3IEFjdGlvbkRlc2NyaXB0b3IoZWxlbWVudCk7Ci0JCQkvLyB0aGVzZSBjYXNlcyBsaWtlICJjbGFzcyBub3QgZm91bmQiIGFyZSBoYW5kbGVkCi0JCQkvLyBhdCBsb3dlciBsZXZlbCwgc28gbm8gYWN0aW9uIGlmIGZvcm1lZC4gSW4gdGhhdAotCQkJLy8gY2FzZSwgd2UgYWxzbyBkb24ndCB3YW50IHRvIGZvcm0gYW4gYWN0aW9uIGRlc2NyaXB0b3IuCi0JCQlpZiAoKGFkICE9IG51bGwpICYmIChhZC5nZXRBY3Rpb24oKSA9PSBudWxsKSkgewotCQkJCWFkID0gbnVsbDsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci50cmFjZUV4Y2VwdGlvbihFWFRFTkRFRF9FRElUT1IsIGUpOwotCQkJYWQgPSBudWxsOwotCQl9Ci0JCXJldHVybiBhZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwYXJ0IElEIGF0dHJpYnV0ZSB0aGF0IGlzIGV4cGVjdGVkIGluIHRoZQotCSAqIHRhcmdldCBleHRlbnNpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYXJnZXRJRChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVEFSR0VUX0lEKTsKLQkJcmV0dXJuIHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6ICI/Pz8iOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmVhZHMgZWRpdG9yIGNvbnRyaWJ1dG9yIGlmIHNwZWNpZmllZCBkaXJlY3RseSBpbiB0aGUgJ2VkaXRvcicKLQkgKiBleHRlbnNpb24gcG9pbnQsIGFuZCBhbGwgZXh0ZXJuYWwgY29udHJpYnV0aW9ucyBmb3IgdGhpcyBlZGl0b3IncyBJRAotCSAqIHJlZ2lzdGVyZWQgaW4gJ2VkaXRvckFjdGlvbnMnIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwdWJsaWMgSUV4dGVuZGVkQ29udHJpYnV0b3IgcmVhZEFjdGlvbkV4dGVuc2lvbnMoU3RyaW5nIGVkaXRvcklkKSB7Ci0JCXJldHVybiByZWFkQWN0aW9uRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW117ZWRpdG9ySWR9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyBlZGl0b3IgY29udHJpYnV0b3IgaWYgc3BlY2lmaWVkIGRpcmVjdGx5IGluIHRoZSAnZWRpdG9yJwotCSAqIGV4dGVuc2lvbiBwb2ludCwgYW5kIGFsbCBleHRlcm5hbCBjb250cmlidXRpb25zIGZvciB0aGlzIGVkaXRvcidzIElECi0JICogcmVnaXN0ZXJlZCBpbiAnZWRpdG9yQWN0aW9ucycgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXB1YmxpYyBJRXh0ZW5kZWRDb250cmlidXRvciByZWFkQWN0aW9uRXh0ZW5zaW9ucyhTdHJpbmdbXSBpZHMpIHsKLQkJbG9uZyB0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlFeHRlbmRlZENvbnRyaWJ1dG9yIGV4dCA9IG51bGw7Ci0JCXJlYWRDb250cmlidXRpb25zKGlkcywgVEFHX0NPTlRSSUJVVElPTl9UWVBFLCBQTF9FWFRFTkRFRF9FRElUT1JfQUNUSU9OUyk7Ci0JCWlmIChkZWJ1Z1JlYWRUaW1lKSB7Ci0JCQlTdHJpbmcgaWRsaXN0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpZHMubGVuZ3RoID4gMCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlkbGlzdCArPSBpZHNbaV07Ci0JCQkJCWlmIChpIDwgaWRzLmxlbmd0aCAtIDEpCi0JCQkJCQlpZGxpc3QgKz0gIiwiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNyZWFkQWN0aW9uRXh0ZW5zaW9ucygiICsgaWRsaXN0ICsgIik6IHJlYWQgaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyBbIiArIChyZWFkaW5nQ2FjaGUgIT0gbnVsbCA/IHJlYWRpbmdDYWNoZS5zaXplKCkgOiAwKSArICIgY29udHJpYnV0aW9uc10iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQl9Ci0JCWlmIChyZWFkaW5nQ2FjaGUgIT0gbnVsbCkgewotCQkJZXh0ID0gbmV3IEV4dGVuZGVkQ29udHJpYnV0b3IocmVhZGluZ0NhY2hlKTsKLQkJCXJlYWRpbmdDYWNoZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyB0aGUgY29udHJpYnV0aW9ucyBmcm9tIHRoZSByZWdpc3RyeSBmb3IgdGhlIHByb3ZpZGVkIHdvcmtiZW5jaAotCSAqIHBhcnQgYW5kIHRoZSBwcm92aWRlZCBleHRlbnNpb24gcG9pbnQgSURzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYWRDb250cmlidXRpb25zKFN0cmluZ1tdIGlkcywgU3RyaW5nIHRhZywgU3RyaW5nIGV4dGVuc2lvblBvaW50KSB7Ci0JCXJlYWRpbmdDYWNoZSA9IG51bGw7Ci0JCXRhcmdldElEcyA9IEFycmF5cy5hc0xpc3QoaWRzKTsKLQkJdGFyZ2V0Q29udHJpYnV0aW9uVGFnID0gdGFnOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlyZWFkUmVnaXN0cnkocmVnaXN0cnksIFBMVUdJTl9JRCwgZXh0ZW5zaW9uUG9pbnQpOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudHMgYWJzdHJhY3QgbWV0aG9kIHRvIGhhbmRsZSB0aGUgcHJvdmlkZWQgWE1MIGVsZW1lbnQgaW4gdGhlCi0JICogcmVnaXN0cnkuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHRhZyA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQlpZiAodGFnLmVxdWFscyh0YXJnZXRDb250cmlidXRpb25UYWcpKSB7Ci0JCQlTdHJpbmcgaWQgPSBnZXRUYXJnZXRJRChlbGVtZW50KTsKLQkJCWlmIChpZCA9PSBudWxsIHx8ICF0YXJnZXRJRHMuY29udGFpbnMoaWQpKSB7Ci0JCQkJLy8gVGhpcyBpcyBub3Qgb2YgaW50ZXJlc3QgdG8gdXMgLSBkb24ndCBnbyBkZWVwZXIKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICh0YWcuZXF1YWxzKFRBR19NRU5VKSkgewotCQkJaWYgKHJlYWRpbmdDYWNoZSA9PSBudWxsKQotCQkJCXJlYWRpbmdDYWNoZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXJlYWRpbmdDYWNoZS5hZGQoZWxlbWVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsgLy8ganVzdCBjYWNoZSB0aGUgZWxlbWVudCAtIGRvbid0IGdvIGludG8gaXQKLQkJfQotCQllbHNlIGlmICh0YWcuZXF1YWxzKFRBR19QT1BVUE1FTlUpKSB7Ci0JCQlpZiAocmVhZGluZ0NhY2hlID09IG51bGwpCi0JCQkJcmVhZGluZ0NhY2hlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJcmVhZGluZ0NhY2hlLmFkZChlbGVtZW50KTsKLQkJCXJldHVybiB0cnVlOyAvLyBqdXN0IGNhY2hlIHRoZSBlbGVtZW50IC0gZG9uJ3QgZ28gaW50byBpdAotCQl9Ci0JCWVsc2UgaWYgKHRhZy5lcXVhbHMoVEFHX1JVTEVSTUVOVSkpIHsKLQkJCWlmIChyZWFkaW5nQ2FjaGUgPT0gbnVsbCkKLQkJCQlyZWFkaW5nQ2FjaGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlyZWFkaW5nQ2FjaGUuYWRkKGVsZW1lbnQpOwotCQkJcmV0dXJuIHRydWU7IC8vIGp1c3QgY2FjaGUgdGhlIGVsZW1lbnQgLSBkb24ndCBnbyBpbnRvIGl0Ci0JCX0KLQkJZWxzZSBpZiAodGFnLmVxdWFscyhUQUdfQUNUSU9OKSkgewotCQkJaWYgKHJlYWRpbmdDYWNoZSA9PSBudWxsKQotCQkJCXJlYWRpbmdDYWNoZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUFjdGlvbkRlc2NyaXB0b3IgYWQgPSBjcmVhdGVBY3Rpb25EZXNjcmlwdG9yKGVsZW1lbnQpOwotCQkJaWYgKGFkICE9IG51bGwpCi0JCQkJcmVhZGluZ0NhY2hlLmFkZChhZCk7Ci0JCQlyZXR1cm4gdHJ1ZTsgLy8ganVzdCBjYWNoZSB0aGUgYWN0aW9uIC0gZG9uJ3QgZ28gaW50bwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmVhZEVsZW1lbnRDaGlsZHJlbihlbGVtZW50KTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0V4dGVuZGVkRWRpdG9yRHJvcFRhcmdldEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9FeHRlbmRlZEVkaXRvckRyb3BUYXJnZXRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2Mjc0NmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0V4dGVuZGVkRWRpdG9yRHJvcFRhcmdldEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlRyYW5zZmVyQnVpbGRlci5UcmFuc2ZlclByb3h5Rm9yRGVsYXlMb2FkaW5nOwotCi0vKioKLSAqIEV4dGVuZGVkRWRpdG9yRHJvcFRhcmdldEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuZGVkRWRpdG9yRHJvcFRhcmdldEFkYXB0ZXIgZXh0ZW5kcyBEcm9wVGFyZ2V0QWRhcHRlciB7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBlZGl0b3JJZHM7Ci0JcHJpdmF0ZSBQb2ludCBvcmlnaW5hbFJhbmdlID0gbnVsbDsKLQlwcml2YXRlIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBJVGV4dFZpZXdlciB0ZXh0Vmlld2VyID0gbnVsbDsKLQotCXByaXZhdGUgVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIHVzZVByb3h5OwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIEV4dGVuZGVkRWRpdG9yRHJvcFRhcmdldEFkYXB0ZXIoYm9vbGVhbiB1c2VQcm94eSkgZm9yCi0JICogICAgICAgICAgICAgdGhlIHBlcmZvcm1hbmNlCi0JICovCi0JcHVibGljIEV4dGVuZGVkRWRpdG9yRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCXRoaXMoZmFsc2UpOwotCX0KLQotCXB1YmxpYyBFeHRlbmRlZEVkaXRvckRyb3BUYXJnZXRBZGFwdGVyKGJvb2xlYW4gdXNlUHJveHkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy51c2VQcm94eSA9IHVzZVByb3h5OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGRvRHJvcChUcmFuc2ZlciB0cmFuc2ZlciwgRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCVRyYW5zZmVyQnVpbGRlciB0YiA9IG5ldyBUcmFuc2ZlckJ1aWxkZXIodXNlUHJveHkpOwotCi0JCUlEcm9wQWN0aW9uW10gYXMgPSBudWxsOwotCQlpZiAoZWRpdG9ySWRzICE9IG51bGwgJiYgZWRpdG9ySWRzLmxlbmd0aCA+IDApCi0JCQlhcyA9IHRiLmdldERyb3BBY3Rpb25zKGVkaXRvcklkcywgdHJhbnNmZXIpOwotCQllbHNlCi0JCQlhcyA9IHRiLmdldERyb3BBY3Rpb25zKGdldFRhcmdldEVkaXRvcigpLmdldENsYXNzKCkuZ2V0TmFtZSgpLCB0cmFuc2Zlcik7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcy5sZW5ndGg7ICsraSkgewotCQkJSURyb3BBY3Rpb24gZGEgPSBhc1tpXTsKLQkJCVRyYW5zZmVyIGFjdHVhbFRyYW5zZmVyOwotCQkJaWYgKHRyYW5zZmVyIGluc3RhbmNlb2YgVHJhbnNmZXJQcm94eUZvckRlbGF5TG9hZGluZykgewotCQkJCWFjdHVhbFRyYW5zZmVyID0gKChUcmFuc2ZlclByb3h5Rm9yRGVsYXlMb2FkaW5nKSB0cmFuc2ZlcikuZ2V0VHJhbnNmZXJDbGFzcygpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWN0dWFsVHJhbnNmZXIgPSB0cmFuc2ZlcjsKLQkJCX0KLQkJCWlmIChhY3R1YWxUcmFuc2ZlciBpbnN0YW5jZW9mIEZpbGVUcmFuc2ZlcikgewotCQkJCWlmIChldmVudC5kYXRhID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJObyBkYXRhIGluIERyb3BUYXJnZXRFdmVudCBmcm9tICIgKyBldmVudC53aWRnZXQpOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJU3RyaW5nW10gc3RycyA9IChTdHJpbmdbXSkgZXZlbnQuZGF0YTsKLQkJCQlib29sZWFuW10gYnMgPSBuZXcgYm9vbGVhbltzdHJzLmxlbmd0aF07Ci0JCQkJaW50IGMgPSAwOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc3Rycy5sZW5ndGg7ICsraikgewotCQkJCQlic1tqXSA9IGZhbHNlOwotCQkJCQlpZiAoZGEuaXNTdXBwb3J0ZWREYXRhKHN0cnNbal0pKSB7Ci0JCQkJCQlldmVudC5kYXRhID0gbmV3IFN0cmluZ1tde3N0cnNbal19OwotCQkJCQkJaWYgKCFkYS5ydW4oZXZlbnQsIHRhcmdldEVkaXRvcikpIHsKLQkJCQkJCQlic1tqXSA9IHRydWU7Ci0JCQkJCQkJYysrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYnNbal0gPSB0cnVlOwotCQkJCQkJYysrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChjID09IDApIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQkJaW50IGsgPSAwOwotCQkJCVN0cmluZ1tdIHJlc3RzID0gbmV3IFN0cmluZ1tjXTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHN0cnMubGVuZ3RoOyArK2opIHsKLQkJCQkJaWYgKGJzW2pdKQotCQkJCQkJcmVzdHNbaysrXSA9IHN0cnNbal07Ci0JCQkJfQotCQkJCWV2ZW50LmRhdGEgPSByZXN0czsKLQkJCX0KLQkJCWVsc2UgaWYgKGRhLmlzU3VwcG9ydGVkRGF0YShldmVudC5kYXRhKSkgewotCQkJCWlmIChkYS5ydW4oZXZlbnQsIHRhcmdldEVkaXRvcikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJVHJhbnNmZXJEYXRhIGRhdGEgPSBudWxsOwotCQlUcmFuc2ZlcltdIHRzID0gZ2V0VHJhbnNmZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHMubGVuZ3RoOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXZlbnQuZGF0YVR5cGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKHRzW2ldLmlzU3VwcG9ydGVkVHlwZShldmVudC5kYXRhVHlwZXNbal0pKSB7Ci0JCQkJCWRhdGEgPSBldmVudC5kYXRhVHlwZXNbal07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCQlldmVudC5jdXJyZW50RGF0YVR5cGUgPSBkYXRhOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKHRleHRWaWV3ZXIgIT0gbnVsbCkgewotCQkJb3JpZ2luYWxSYW5nZSA9IHRleHRWaWV3ZXIuZ2V0U2VsZWN0ZWRSYW5nZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZHJhZ0xlYXZlKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQlpZiAodGV4dFZpZXdlciAhPSBudWxsKSB7Ci0JCQl0ZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2Uob3JpZ2luYWxSYW5nZS54LCBvcmlnaW5hbFJhbmdlLnkpOwotCQl9Ci0JCWVsc2UgewotCQkJb3JpZ2luYWxSYW5nZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTY3JvbGwgdGhlIHZpc2libGUgYXJlYSBhcyBuZWVkZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJZXZlbnQub3BlcmF0aW9ucyAmPSB+RE5ELkRST1BfTU9WRTsKLQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJZXZlbnQuZmVlZGJhY2sgfD0gRE5ELkZFRURCQUNLX1NDUk9MTDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQub3BlcmF0aW9ucyA9PSBETkQuRFJPUF9OT05FKQotCQkJcmV0dXJuOwotCi0JCVRyYW5zZmVyW10gdHMgPSBnZXRUcmFuc2ZlcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRzW2ldLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpKSB7Ci0JCQkJaWYgKGRvRHJvcCh0c1tpXSwgZXZlbnQpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBJRWRpdG9yUGFydCBnZXRUYXJnZXRFZGl0b3IoKSB7Ci0JCXJldHVybiB0YXJnZXRFZGl0b3I7Ci0JfQotCi0JcHVibGljIElUZXh0Vmlld2VyIGdldFRleHRWaWV3ZXIoKSB7Ci0JCXJldHVybiB0ZXh0Vmlld2VyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcltdCi0JICovCi0JcHVibGljIFRyYW5zZmVyW10gZ2V0VHJhbnNmZXJzKCkgewotCQlpZiAodHJhbnNmZXJzID09IG51bGwpIHsKLQkJCVRyYW5zZmVyQnVpbGRlciB0YiA9IG5ldyBUcmFuc2ZlckJ1aWxkZXIodXNlUHJveHkpOwotCQkJaWYgKGVkaXRvcklkcyA9PSBudWxsIHx8IGVkaXRvcklkcy5sZW5ndGggPT0gMCkKLQkJCQl0cmFuc2ZlcnMgPSB0Yi5nZXREcm9wVGFyZ2V0VHJhbnNmZXJzKGdldFRhcmdldEVkaXRvcigpLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJCWVsc2UKLQkJCQl0cmFuc2ZlcnMgPSB0Yi5nZXREcm9wVGFyZ2V0VHJhbnNmZXJzKGVkaXRvcklkcyk7Ci0JCX0KLQkJcmV0dXJuIHRyYW5zZmVyczsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFZGl0b3IoSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCXRoaXMudGFyZ2V0RWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldElEcyhTdHJpbmdbXSBpZHMpIHsKLQkJZWRpdG9ySWRzID0gaWRzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHRWaWV3ZXIoSVRleHRWaWV3ZXIgdGV4dFZpZXdlcikgewotCQl0aGlzLnRleHRWaWV3ZXIgPSB0ZXh0Vmlld2VyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0ZpbGVEcm9wQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRmlsZURyb3BBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY4ZGU5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRmlsZURyb3BBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKiBBY3Rpb24gZm9yIGZpbGUgZHJvcAotICovCi1wdWJsaWMgY2xhc3MgRmlsZURyb3BBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdERyb3BBY3Rpb24gewotCXB1YmxpYyBib29sZWFuIHJ1bihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQsIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlTdHJpbmdbXSBzdHJzID0gKFN0cmluZ1tdKSBldmVudC5kYXRhOwotCQlpZiAoc3RycyA9PSBudWxsIHx8IHN0cnMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyBzdHIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0cnMubGVuZ3RoOyArK2kpIHsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChzdHJzW2ldKTsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJSUZpbGUgZmlsZSA9IHJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCXBhdGggPSBmaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJCX0KLQotCQkJc3RyICs9ICJcIiIgKyBwYXRoLnRvU3RyaW5nKCkgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXJldHVybiBpbnNlcnQoc3RyLCB0YXJnZXRFZGl0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9Gb3JtYXRQcm9jZXNzb3JzRXh0ZW5zaW9uUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRm9ybWF0UHJvY2Vzc29yc0V4dGVuc2lvblJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGYxMGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9Gb3JtYXRQcm9jZXNzb3JzRXh0ZW5zaW9uUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgRm9ybWF0UHJvY2Vzc29yc0V4dGVuc2lvblJlYWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBGb3JtYXRQcm9jZXNzb3JzRXh0ZW5zaW9uUmVhZGVyIGluc3RhbmNlOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgRm9ybWF0UHJvY2Vzc29yc0V4dGVuc2lvblJlYWRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEZvcm1hdFByb2Nlc3NvcnNFeHRlbnNpb25SZWFkZXIoKTsKLQotCQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCWluc3RhbmNlLnJlYWRSZWdpc3RyeShyZWdpc3RyeSwgIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIsICJmb3JtYXRQcm9jZXNzb3JzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotLy8JIFRPRE86IHByaXZhdGUgZmllbGQgbmV2ZXIgcmVhZCBsb2NhbGx5Ci0JU3RyaW5nIHByb2Nlc3NvckNsYXNzTmFtZTsKLQotCXB1YmxpYyBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBnZXRGb3JtYXRQcm9jZXNzb3IoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJaWYgKGNvbnRlbnRUeXBlSWQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvciA9IG51bGw7Ci0JCWlmIChtYXAuY29udGFpbnNLZXkoY29udGVudFR5cGVJZCkpIHsKLQkJCWZvcm1hdFByb2Nlc3NvciA9IChJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcikgbWFwLmdldChjb250ZW50VHlwZUlkKTsKLQkJfSBlbHNlIHsKLQkJCUlDb250ZW50VHlwZU1hbmFnZXIgbWFuYWdlciA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpOwotCQkJSUNvbnRlbnRUeXBlIHF1ZXJ5Q29udGVudFR5cGUgPSBtYW5hZ2VyLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWQpOwotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBlbGVtZW50Q29udGVudFR5cGVJZCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCUlDb250ZW50VHlwZSBlbGVtZW50Q29udGVudFR5cGUgPSBtYW5hZ2VyLmdldENvbnRlbnRUeXBlKGVsZW1lbnRDb250ZW50VHlwZUlkKTsKLQkJCQlpZiAocXVlcnlDb250ZW50VHlwZS5pc0tpbmRPZihlbGVtZW50Q29udGVudFR5cGUpKSB7Ci0JCQkJCWZvcm1hdFByb2Nlc3NvciA9IChJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcikgbWFwLmdldChlbGVtZW50Q29udGVudFR5cGVJZCk7Ci0JCQkJCW1hcC5wdXQoY29udGVudFR5cGVJZCwgZm9ybWF0UHJvY2Vzc29yKTsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghZm91bmQpCi0JCQkJbWFwLnB1dChjb250ZW50VHlwZUlkLCBudWxsKTsKLQkJfQotCi0JCXJldHVybiBmb3JtYXRQcm9jZXNzb3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoInByb2Nlc3NvciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBjb250ZW50VHlwZUlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNvbnRlbnRUeXBlSWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHByb2Nlc3NvckNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgcGx1Z2luSUQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JRCk7Ci0KLQkJCXRyeSB7Ci0JCQkJSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgcHJvY2Vzc29yID0gKElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yKWJ1bmRsZS5sb2FkQ2xhc3MocHJvY2Vzc29yQ2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCQkJCW1hcC5wdXQoY29udGVudFR5cGVJZCwgcHJvY2Vzc29yKTsKLQotCQkJCXJldHVybiB0cnVlOwotCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9Hb3RvQW5ub3RhdGlvbkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0dvdG9Bbm5vdGF0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZTFiOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0dvdG9Bbm5vdGF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuRWRpdG9yc1VJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Bbm5vdGF0aW9uUHJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklFZGl0b3JTdGF0dXNMaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGV4dEVkaXRvckFjdGlvbjsKLQotLyoqCi0gKiBCYXNlZCBvbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuamF2YWVkaXRvci5Hb3RvQW5ub3RhdGlvbkFjdGlvbiBhbmQKLSAqIHRoZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuSmF2YUVkaXRvcidzIGdvdG9FcnJvcigpIG1ldGhvZC4gUmV3cml0dGVuCi0gKiBiYXNlZCBvbiAzLjBNNyB2ZXJzaW9uIHRvIG9wZXJhdGUgZ2VuZXJpY2FsbHkuCi0gKiAKLSAqIEBkZXByZWNhdGVkIC0gdXNlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuR290b0Fubm90YXRpb25BY3Rpb24KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgR290b0Fubm90YXRpb25BY3Rpb24gZXh0ZW5kcyBUZXh0RWRpdG9yQWN0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvZ290b05leHRBbm5vdGF0aW9uIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIHN0YXR1cyBsaW5lIG9uIHNlbGVjdGlvbiBjaGFuZ2VkLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBTdGF0dXNMaW5lQ2xlYXJlciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCQlJU3RhdHVzTGluZU1hbmFnZXIgZlN0YXR1c0xpbmVNYW5hZ2VyID0gbnVsbDsKLQotCQlwcm90ZWN0ZWQgU3RhdHVzTGluZUNsZWFyZXIoSVN0YXR1c0xpbmVNYW5hZ2VyIG1ncikgewotCQkJc3VwZXIoKTsKLQkJCWZTdGF0dXNMaW5lTWFuYWdlciA9IG1ncjsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCWdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihTdGF0dXNMaW5lQ2xlYXJlci50aGlzKTsKLQotCQkJZlN0YXR1c0xpbmVNYW5hZ2VyLnNldEVycm9yTWVzc2FnZShudWxsLCBudWxsKTsKLQkJCWZTdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKG51bGwsIG51bGwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGZGb3J3YXJkOwotCXByaXZhdGUgU3RyaW5nIGZMYWJlbDsKLQotCXByaXZhdGUgU3RyaW5nIGZQcmVmaXg7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJlZml4Ci0JICogQHBhcmFtIGVkaXRvcgotCSAqLwotCXB1YmxpYyBHb3RvQW5ub3RhdGlvbkFjdGlvbihTdHJpbmcgcHJlZml4LCBib29sZWFuIGZvcndhcmQpIHsKLQkJc3VwZXIoU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCBwcmVmaXgsIG51bGwpOwotCQlmRm9yd2FyZCA9IGZvcndhcmQ7Ci0JCWZQcmVmaXggPSBwcmVmaXg7Ci0JCWZMYWJlbCA9IFNTRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKS5nZXRTdHJpbmcoZlByZWZpeCk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGxhYmVsIHVzZWQgZm9yIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TGFiZWwoKSB7Ci0JCXJldHVybiBmTGFiZWw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdExhYmVsKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYW5ub3RhdGlvbiBjbG9zZXN0IHRvIHRoZSBnaXZlbiByYW5nZSByZXNwZWN0aW5nIHRoZSBnaXZlbgotCSAqIGRpcmVjdGlvbi4gSWYgYW4gYW5ub3RhdGlvbiBpcyBmb3VuZCwgdGhlIGFubm90YXRpb25zIGN1cnJlbnQgcG9zaXRpb24KLQkgKiBpcyBjb3BpZWQgaW50byB0aGUgcHJvdmlkZWQgYW5ub3RhdGlvbiBwb3NpdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgcmVnaW9uIG9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSByZWdpb24gbGVuZ3RoCi0JICogQHBhcmFtIGZvcndhcmQKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGZvciBmb3J3YXJkcywgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvcgotCSAqICAgICAgICAgICAgYmFja3dhcmQKLQkgKiBAcGFyYW0gYW5ub3RhdGlvblBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgcG9zaXRpb24gb2YgdGhlIGZvdW5kIGFubm90YXRpb24KLQkgKiBAcmV0dXJuIHRoZSBmb3VuZCBhbm5vdGF0aW9uCi0JICovCi0JcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0TmV4dEFubm90YXRpb24oZmluYWwgaW50IG9mZnNldCwgZmluYWwgaW50IGxlbmd0aCwgYm9vbGVhbiBmb3J3YXJkLCBQb3NpdGlvbiBhbm5vdGF0aW9uUG9zaXRpb24pIHsKLQkJQW5ub3RhdGlvbiBuZXh0QW5ub3RhdGlvbiA9IG51bGw7Ci0JCVBvc2l0aW9uIG5leHRBbm5vdGF0aW9uUG9zaXRpb24gPSBudWxsOwotCQlBbm5vdGF0aW9uIGNvbnRhaW5pbmdBbm5vdGF0aW9uID0gbnVsbDsKLQkJUG9zaXRpb24gY29udGFpbmluZ0Fubm90YXRpb25Qb3NpdGlvbiA9IG51bGw7Ci0JCWJvb2xlYW4gY3VycmVudEFubm90YXRpb24gPSBmYWxzZTsKLQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRUZXh0RWRpdG9yKCkuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGdldFRleHRFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJaW50IGVuZE9mRG9jdW1lbnQgPSBkb2N1bWVudC5nZXRMZW5ndGgoKTsKLQkJaW50IGRpc3RhbmNlID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0KLQkJSUFubm90YXRpb25Nb2RlbCBtb2RlbCA9IGdldFRleHRFZGl0b3IoKS5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0QW5ub3RhdGlvbk1vZGVsKGdldFRleHRFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJLy8gZXh0ZXJuYWwgZmlsZXMgbWF5IG5vdCBoYXZlIGFuIGFubm90YXRpb24gbW9kZWwKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGUgPSBtb2RlbC5nZXRBbm5vdGF0aW9uSXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCUFubm90YXRpb24gYSA9IChBbm5vdGF0aW9uKSBlLm5leHQoKTsKLQkJCQlpZiAoIWlzTmF2aWdhdGlvblRhcmdldChhKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlQb3NpdGlvbiBwID0gbW9kZWwuZ2V0UG9zaXRpb24oYSk7Ci0JCQkJaWYgKHAgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlpZiAoZm9yd2FyZCAmJiBwLm9mZnNldCA9PSBvZmZzZXQgfHwgIWZvcndhcmQgJiYgcC5vZmZzZXQgKyBwLmdldExlbmd0aCgpID09IG9mZnNldCArIGxlbmd0aCkgewotCQkJCQlpZiAoY29udGFpbmluZ0Fubm90YXRpb24gPT0gbnVsbCB8fCAoZm9yd2FyZCAmJiBwLmxlbmd0aCA+PSBjb250YWluaW5nQW5ub3RhdGlvblBvc2l0aW9uLmxlbmd0aCB8fCAhZm9yd2FyZCAmJiBwLmxlbmd0aCA+PSBjb250YWluaW5nQW5ub3RhdGlvblBvc2l0aW9uLmxlbmd0aCkpIHsKLQkJCQkJCWNvbnRhaW5pbmdBbm5vdGF0aW9uID0gYTsKLQkJCQkJCWNvbnRhaW5pbmdBbm5vdGF0aW9uUG9zaXRpb24gPSBwOwotCQkJCQkJY3VycmVudEFubm90YXRpb24gPSBwLmxlbmd0aCA9PSBsZW5ndGg7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWludCBjdXJyZW50RGlzdGFuY2UgPSAwOwotCi0JCQkJCWlmIChmb3J3YXJkKSB7Ci0JCQkJCQljdXJyZW50RGlzdGFuY2UgPSBwLmdldE9mZnNldCgpIC0gb2Zmc2V0OwotCQkJCQkJaWYgKGN1cnJlbnREaXN0YW5jZSA8IDApIHsKLQkJCQkJCQljdXJyZW50RGlzdGFuY2UgPSBlbmRPZkRvY3VtZW50ICsgY3VycmVudERpc3RhbmNlOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoY3VycmVudERpc3RhbmNlIDwgZGlzdGFuY2UgfHwgY3VycmVudERpc3RhbmNlID09IGRpc3RhbmNlICYmIHAubGVuZ3RoIDwgbmV4dEFubm90YXRpb25Qb3NpdGlvbi5sZW5ndGgpIHsKLQkJCQkJCQlkaXN0YW5jZSA9IGN1cnJlbnREaXN0YW5jZTsKLQkJCQkJCQluZXh0QW5ub3RhdGlvbiA9IGE7Ci0JCQkJCQkJbmV4dEFubm90YXRpb25Qb3NpdGlvbiA9IHA7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQljdXJyZW50RGlzdGFuY2UgPSBvZmZzZXQgKyBsZW5ndGggLSAocC5nZXRPZmZzZXQoKSArIHAubGVuZ3RoKTsKLQkJCQkJCWlmIChjdXJyZW50RGlzdGFuY2UgPCAwKQotCQkJCQkJCWN1cnJlbnREaXN0YW5jZSA9IGVuZE9mRG9jdW1lbnQgKyBjdXJyZW50RGlzdGFuY2U7Ci0KLQkJCQkJCWlmIChjdXJyZW50RGlzdGFuY2UgPCBkaXN0YW5jZSB8fCBjdXJyZW50RGlzdGFuY2UgPT0gZGlzdGFuY2UgJiYgcC5sZW5ndGggPCBuZXh0QW5ub3RhdGlvblBvc2l0aW9uLmxlbmd0aCkgewotCQkJCQkJCWRpc3RhbmNlID0gY3VycmVudERpc3RhbmNlOwotCQkJCQkJCW5leHRBbm5vdGF0aW9uID0gYTsKLQkJCQkJCQluZXh0QW5ub3RhdGlvblBvc2l0aW9uID0gcDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY29udGFpbmluZ0Fubm90YXRpb25Qb3NpdGlvbiAhPSBudWxsICYmICghY3VycmVudEFubm90YXRpb24gfHwgbmV4dEFubm90YXRpb24gPT0gbnVsbCkpIHsKLQkJCWFubm90YXRpb25Qb3NpdGlvbi5zZXRPZmZzZXQoY29udGFpbmluZ0Fubm90YXRpb25Qb3NpdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQlhbm5vdGF0aW9uUG9zaXRpb24uc2V0TGVuZ3RoKGNvbnRhaW5pbmdBbm5vdGF0aW9uUG9zaXRpb24uZ2V0TGVuZ3RoKCkpOwotCQkJcmV0dXJuIGNvbnRhaW5pbmdBbm5vdGF0aW9uOwotCQl9Ci0JCWlmIChuZXh0QW5ub3RhdGlvblBvc2l0aW9uICE9IG51bGwpIHsKLQkJCWFubm90YXRpb25Qb3NpdGlvbi5zZXRPZmZzZXQobmV4dEFubm90YXRpb25Qb3NpdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQlhbm5vdGF0aW9uUG9zaXRpb24uc2V0TGVuZ3RoKG5leHRBbm5vdGF0aW9uUG9zaXRpb24uZ2V0TGVuZ3RoKCkpOwotCQl9Ci0KLQkJcmV0dXJuIG5leHRBbm5vdGF0aW9uOwotCX0KLQotCXByaXZhdGUgSVN0YXR1c0xpbmVNYW5hZ2VyIGdldFN0YXR1c0xpbmVNYW5hZ2VyKCkgewotCQkvLyBUaGUgb3JpZ2luYWwgSmF2YUVkaXRvciBNNyBpbXBsZW1lbnRhdGlvbiBtYWRlIHVzZSBvZiBhbiBhZGFwdGVyLAotCQkvLyBidXQgdGhhdCBhcHByb2FjaAotCQkvLyBmYWlscyB3aXRoIGEgTXVsdGlQYWdlRWRpdG9yU2l0ZQotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKHBhZ2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQlpZiAoZWRpdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yID0gZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotCQlpZiAoY29udHJpYnV0b3IgaW5zdGFuY2VvZiBFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcikgewotCQkJcmV0dXJuICgoRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpIGNvbnRyaWJ1dG9yKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0TGFiZWwoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jZ2V0VG9vbFRpcFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0TGFiZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBKdW1wcyB0byB0aGUgZXJyb3IgbmV4dCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGRpcmVjdGlvbiBiYXNlZCBvZmYKLQkgKiBKYXZhRWRpdG9yI2dvdG9Bbm5vdGF0aW9uKCkKLQkgKiAKLQkgKiBAcGFyYW0gZm9yd2FyZAotCSAqICAgICAgICAgICAgaXMgdGhlIGRpcmVjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGdvdG9Bbm5vdGF0aW9uKGJvb2xlYW4gZm9yd2FyZCkgewotCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIGdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQlQb3NpdGlvbiBwb3NpdGlvbiA9IG5ldyBQb3NpdGlvbigwLCAwKTsKLQkJaWYgKGZhbHNlIC8qIGRlbGF5ZWQgLSBzZWUgYnVnIDE4MzE2ICovKSB7Ci0JCQlnZXROZXh0QW5ub3RhdGlvbihzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSwgZm9yd2FyZCwgcG9zaXRpb24pOwotCQkJZ2V0VGV4dEVkaXRvcigpLnNlbGVjdEFuZFJldmVhbChwb3NpdGlvbi5nZXRPZmZzZXQoKSwgcG9zaXRpb24uZ2V0TGVuZ3RoKCkpOwotCQl9Ci0JCWVsc2UgLyogbm8gZGVsYXkgLSBzZWUgYnVnIDE4MzE2ICovewotCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0TmV4dEFubm90YXRpb24oc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCksIGZvcndhcmQsIHBvc2l0aW9uKTsKLQkJCUlFZGl0b3JTdGF0dXNMaW5lIGVkaXRvclN0YXR1c0xpbmUgPSAoSUVkaXRvclN0YXR1c0xpbmUpIGdldFRleHRFZGl0b3IoKS5nZXRBZGFwdGVyKElFZGl0b3JTdGF0dXNMaW5lLmNsYXNzKTsKLQkJCWlmIChlZGl0b3JTdGF0dXNMaW5lICE9IG51bGwpIHsKLQkJCQllZGl0b3JTdGF0dXNMaW5lLnNldE1lc3NhZ2UodHJ1ZSwgbnVsbCwgbnVsbCk7Ci0JCQkJZWRpdG9yU3RhdHVzTGluZS5zZXRNZXNzYWdlKGZhbHNlLCBudWxsLCBudWxsKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlTdGF0dXNMaW5lTWFuYWdlciBtZ3IgPSBnZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCQkJCWlmIChtZ3IgIT0gbnVsbCkgewotCQkJCQltZ3Iuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCQltZ3Iuc2V0TWVzc2FnZShudWxsLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJdXBkYXRlQW5ub3RhdGlvblZpZXdzKGFubm90YXRpb24pOwotCQkJCWlmIChfZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3QgYW5kIHJldmVhbCAiICsgYW5ub3RhdGlvbi5nZXRUeXBlKCkgKyAiQCIgKyBwb3NpdGlvbi5nZXRPZmZzZXQoKSArICI6IiArIHBvc2l0aW9uLmdldExlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQkJZ2V0VGV4dEVkaXRvcigpLnNlbGVjdEFuZFJldmVhbChwb3NpdGlvbi5nZXRPZmZzZXQoKSwgcG9zaXRpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWlmIChlZGl0b3JTdGF0dXNMaW5lICE9IG51bGwpIHsKLQkJCQkJZWRpdG9yU3RhdHVzTGluZS5zZXRNZXNzYWdlKHRydWUsIG51bGwsIG51bGwpOwotCQkJCQllZGl0b3JTdGF0dXNMaW5lLnNldE1lc3NhZ2UoZmFsc2UsIGFubm90YXRpb24uZ2V0VGV4dCgpLCBudWxsKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUlTdGF0dXNMaW5lTWFuYWdlciBtZ3IgPSBnZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCQkJCQlpZiAobWdyICE9IG51bGwpIHsKLQkJCQkJCW1nci5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJCQltZ3Iuc2V0TWVzc2FnZShudWxsLCBhbm5vdGF0aW9uLmdldFRleHQoKSk7Ci0JCQkJCX0KLQkJCQkJZ2V0VGV4dEVkaXRvcigpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBTdGF0dXNMaW5lQ2xlYXJlcihtZ3IpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIGFubm90YXRpb24gaXMgY29uZmlndXJlZCBhcyBhIHRhcmdldCBmb3IgdGhlCi0JICogIkdvIHRvIE5leHQvUHJldmlvdXMgQW5ub3RhdGlvbiIgYWN0aW9ucwotCSAqIAotCSAqIEBwYXJhbSBhbm5vdGF0aW9uCi0JICogICAgICAgICAgICB0aGUgYW5ub3RhdGlvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHRhcmdldCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogICAgICAgICBvdGhlcndpc2UKLQkgKiBAc2VlIEVjbGlwc2UgMy4wCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOYXZpZ2F0aW9uVGFyZ2V0KEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IEVkaXRvcnNVSS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlBbm5vdGF0aW9uUHJlZmVyZW5jZSBwcmVmZXJlbmNlID0gRWRpdG9yc1VJLmdldEFubm90YXRpb25QcmVmZXJlbmNlTG9va3VwKCkuZ2V0QW5ub3RhdGlvblByZWZlcmVuY2UoYW5ub3RhdGlvbik7Ci0JCS8vIFNlZSBidWcgNDE2ODkKLQkJLy8gU3RyaW5nIGtleT0gZm9yd2FyZCA/IHByZWZlcmVuY2UuZ2V0SXNHb1RvTmV4dE5hdmlnYXRpb25UYXJnZXRLZXkoKQotCQkvLyA6IHByZWZlcmVuY2UuZ2V0SXNHb1RvUHJldmlvdXNOYXZpZ2F0aW9uVGFyZ2V0S2V5KCk7Ci0JCVN0cmluZyBrZXkgPSBwcmVmZXJlbmNlID09IG51bGwgPyBudWxsIDogcHJlZmVyZW5jZS5nZXRJc0dvVG9OZXh0TmF2aWdhdGlvblRhcmdldEtleSgpOwotCQlyZXR1cm4gKGtleSAhPSBudWxsICYmIHByZWZlcmVuY2VzLmdldEJvb2xlYW4oa2V5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlnb3RvQW5ub3RhdGlvbihmRm9yd2FyZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWRpdG9yKElUZXh0RWRpdG9yIGVkaXRvcikgewotCQlzdXBlci5zZXRFZGl0b3IoZWRpdG9yKTsKLQkJdXBkYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgYW5ub3RhdGlvbiB2aWV3cyB0aGF0IHNob3cgdGhlIGdpdmVuIGFubm90YXRpb24uCi0JICogCi0JICogQHBhcmFtIGFubm90YXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBhbm5vdGF0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQW5ub3RhdGlvblZpZXdzKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlJTWFya2VyIG1hcmtlciA9IG51bGw7Ci0JCWlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTWFya2VyQW5ub3RhdGlvbikKLQkJCW1hcmtlciA9ICgoTWFya2VyQW5ub3RhdGlvbikgYW5ub3RhdGlvbikuZ2V0TWFya2VyKCk7Ci0KLQkJaWYgKG1hcmtlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQkJCUlWaWV3UGFydCB2aWV3ID0gbnVsbDsKLQkJCQkJCWlmIChtYXJrZXIuaXNTdWJ0eXBlT2YoSU1hcmtlci5QUk9CTEVNKSkgewotCQkJCQkJCXZpZXcgPSBwYWdlLmZpbmRWaWV3KElQYWdlTGF5b3V0LklEX1BST0JMRU1fVklFVyk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChtYXJrZXIuaXNTdWJ0eXBlT2YoSU1hcmtlci5UQVNLKSkgewotCQkJCQkJCXZpZXcgPSBwYWdlLmZpbmRWaWV3KElQYWdlTGF5b3V0LklEX1RBU0tfTElTVCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChtYXJrZXIuaXNTdWJ0eXBlT2YoSU1hcmtlci5CT09LTUFSSykpIHsKLQkJCQkJCQl2aWV3ID0gcGFnZS5maW5kVmlldyhJUGFnZUxheW91dC5JRF9CT09LTUFSS1MpOwotCQkJCQkJfQotCQkJCQkJLy8gSWYgdGhlIHZpZXcgaXNuJ3Qgb3BlbiBvbiB0aGlzIHBlcnNwZWN0aXZlLCBkb24ndAotCQkJCQkJLy8gaW50ZXJhY3Qgd2l0aCBpdAotCQkJCQkJaWYgKHZpZXcgIT0gbnVsbCkgewotCQkJCQkJCU1ldGhvZCBtZXRob2QgPSB2aWV3LmdldENsYXNzKCkuZ2V0TWV0aG9kKCJzZXRTZWxlY3Rpb24iLCBuZXcgQ2xhc3NbXXtJU3RydWN0dXJlZFNlbGVjdGlvbi5jbGFzcywgYm9vbGVhbi5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJCQkJCW1ldGhvZC5pbnZva2UodmlldywgbmV3IE9iamVjdFtde25ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1hcmtlciksIEJvb2xlYW4uVFJVRX0pOwotCQkJCQkJCQlwYWdlLmJyaW5nVG9Ub3Aodmlldyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gaWdub3JlIGV4Y2VwdGlvbnMsIGRvbid0IHVwZGF0ZSBhbnkgb2YgdGhlIGxpc3RzLCBqdXN0IHNldAotCQkJLy8gc3RhdHVzbGluZQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24geCkgewotCQkJCS8vCi0JCQl9Ci0JCQljYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHgpIHsKLQkJCQkvLwotCQkJfQotCQkJY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geCkgewotCQkJCS8vCi0JCQl9Ci0JCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JQWN0aW9uVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUFjdGlvblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTk1YmU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JQWN0aW9uVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotcHVibGljIGludGVyZmFjZSBJQWN0aW9uVmFsaWRhdG9yIHsKLQlib29sZWFuIGlzVmFsaWRBY3Rpb24oKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JRHJvcEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lEcm9wQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNzUxYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lEcm9wQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURyb3BBY3Rpb24gewotCi0KLQkvKioKLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgRHJvcFRhcmdldEV2ZW50LmRhdGEgd2lsbCBiZSBwYXNzZWQuCi0JICogQHJldHVybiBib29sZWFuIHRydWUgZm9yIHN1cHBvcnRlZCBkYXRhIHR5cGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRlZERhdGEoT2JqZWN0IGRhdGEpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuIHRydWUgZm9yIHRoZSBhY3Rpb24gaXMgYWN0dWFsbHkgcHJvY2Vzc2VkIGZhbHNlIGZvciB0aGUKLQkgKiAgICAgICAgIGFjdGlvbiBpcyBub3QgcHJvY2Vzc2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJ1bihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQsIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUV4dGVuZGVkQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JRXh0ZW5kZWRDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTc4YTM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JRXh0ZW5kZWRDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIElFeHRlbmRlZENvbnRyaWJ1dG9yIGV4dGVuZHMgSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLCBJUG9wdXBNZW51Q29udHJpYnV0b3IgewotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpOwotCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvU3RhdHVzTGluZShJU3RhdHVzTGluZU1hbmFnZXIgbWFuYWdlcik7Ci0KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciBtYW5hZ2VyKTsKLQotCXB1YmxpYyB2b2lkIHVwZGF0ZVRvb2xiYXJBY3Rpb25zKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUV4dGVuZGVkRWRpdG9yQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUV4dGVuZGVkRWRpdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZmU0N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lFeHRlbmRlZEVkaXRvckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElFeHRlbmRlZEVkaXRvckFjdGlvbiBleHRlbmRzIElVcGRhdGUgewotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgYWN0aW9uIGl0ZW0gaXMgdmlzaWJsZQotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpdGVtIGlzIHZpc2libGUsIGFuZAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgYWN0aXZlIGVkaXRvciBmb3IgdGhlIGFjdGlvbi4gSW1wbGVtZW50b3JzIHNob3VsZCBkaXNjb25uZWN0Ci0JICogZnJvbSB0aGUgb2xkIGVkaXRvciwgY29ubmVjdCB0byB0aGUgbmV3IGVkaXRvciwgYW5kIHVwZGF0ZSB0aGUgYWN0aW9uCi0JICogdG8gcmVmbGVjdCB0aGUgbmV3IGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0RWRpdG9yCi0JICogICAgICAgICAgICB0aGUgbmV3IGVkaXRvciB0YXJnZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFeHRlbmRlZEVkaXRvcihJRXh0ZW5kZWRTaW1wbGVFZGl0b3IgdGFyZ2V0RWRpdG9yKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JRXh0ZW5kZWRNYXJrdXBFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JRXh0ZW5kZWRNYXJrdXBFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2NDZkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUV4dGVuZGVkTWFya3VwRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogSUV4dGVuZGVkTWFya3VwRWRpdG9yCi0gKiAKLSAqIEBkZXByZWNhdGVkIHVzZSB0aGUgZWRpdG9yJ3MgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgYWRhcHRlciBhbmQgY2FzdCB0bwotICogICAgICAgICAgICAgSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgd2hlbiBhcHByb3ByaWF0ZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFeHRlbmRlZE1hcmt1cEVkaXRvciAgewotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgdGhlIElET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmdldE5vZGUoaW50KSBtZXRob2QKLQkgKiAgICAgICAgICAgICB3aXRoIElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmdldENhcmV0T2Zmc2V0KCkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Q2FyZXROb2RlKCk7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSBtZXRob2Qgb24gSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0RE9NRG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gc29tZSBlZGl0b3JzIHdpbGwgcHJvdmlkZSB0aGUgbGlzdCBvZiBzZWxlY3RlZCBub2RlcyBhcwotCSAqICAgICAgICAgICAgIHBhcnQgb2YgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuZ2V0U2VsZWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZWxlY3RlZE5vZGVzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUV4dGVuZGVkU2ltcGxlRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUV4dGVuZGVkU2ltcGxlRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxODc4MjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lFeHRlbmRlZFNpbXBsZUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQsIG9idGFpbiBhIElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIGFkYXB0ZXIgZnJvbSB0aGUgZWRpdG9yIHBhcnQKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElFeHRlbmRlZFNpbXBsZUVkaXRvciB7Ci0KLQlwdWJsaWMgaW50IGdldENhcmV0UG9zaXRpb24oKTsKLQotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKTsKLQotCXB1YmxpYyBJRWRpdG9yUGFydCBnZXRFZGl0b3JQYXJ0KCk7Ci0KLQlwdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lNb2RlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI1ZTI4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSURvY3VtZW50UHJvdmlkZXIgewotCUlTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoT2JqZWN0IGVsZW1lbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lQb3B1cE1lbnVDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lQb3B1cE1lbnVDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjQ3MjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JUG9wdXBNZW51Q29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVBvcHVwTWVudUNvbnRyaWJ1dG9yIHsKLQotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1BvcHVwTWVudShJTWVudU1hbmFnZXIgbWVudSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSVJlbGVhc2FibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JUmVsZWFzYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGE1OTlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JUmVsZWFzYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlbGVhc2FibGUgewotCS8qKgotCSAqIEdlbmVyaWMgY2F0Y2gtYWxsIGZvciByZWxlYXNpbmcgcmVzb3VyY2VzIGFuZCBvdGhlciByZWZlcmVuY2VzCi0JICovCi0Jdm9pZCByZWxlYXNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOGE5NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzIElFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciB7Ci0KLQkvKioKLQkgKiBFbmFibGVzIGRpc2FibGVzIGFjdGlvbnMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlIHNvdXJjZSB2aWV3ZXIgKGFuZAotCSAqIHNob3VsZCBvbmx5IHdvcmsgd2hlbiB0aGUgc291cmNlIHZpZXdlciBpcyBlbmFibGVkKQotCSAqIAotCSAqIEBwYXJhbSBlbmFibGVkCi0JICogICAgICAgICAgICB0cnVlIGlmIHNvdXJjZSB2aWV3ZXIgaXMgY3VycmVudGx5IGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JVGVtcG9yYXJ5QW5ub3RhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lUZW1wb3JhcnlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZjY0NDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lUZW1wb3JhcnlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotcHVibGljIGludGVyZmFjZSBJVGVtcG9yYXJ5QW5ub3RhdGlvbiB7Ci0JT2JqZWN0IGdldEtleSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjNmODJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0KLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgbWVzc2FnZSB0byBsb2cgaWYgY2F0ZWdvcnkgbWF0Y2hlcyAvZGVidWcvdHJhY2VmaWx0ZXIgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIHByaW50Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogICAgICAgICAgICBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aAotCSAqICAgICAgICAgICAgL2RlYnVnL3RyYWNlZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF90cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChpc1RyYWNpbmcoY2F0ZWdvcnkpKSB7Ci0JCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRmZjEwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LkVkaXRvcnNVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkVkaXRvclByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5JU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5wcmVmZXJlbmNlcy5Db21tb25FZGl0b3JQcmVmZXJlbmNlTmFtZXM7Ci0KLQotcHVibGljIGNsYXNzIFByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJQ29sb3JSZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0VGhlbWVNYW5hZ2VyKCkuZ2V0Q3VycmVudFRoZW1lKCkuZ2V0Q29sb3JSZWdpc3RyeSgpOwotCQkKLQkJLy8gdXNlIHRoZSBiYXNlIGFubm90YXRpb24gJiBxdWljayBkaWZmIHByZWZlcmVuY2UgcGFnZQotCQlFZGl0b3JzVUkudXNlQW5ub3RhdGlvbnNQcmVmZXJlbmNlUGFnZShzdG9yZSk7Ci0JCUVkaXRvcnNVSS51c2VRdWlja0RpZmZQcmVmZXJlbmNlUGFnZShzdG9yZSk7Ci0KLQkJLy8gbGV0IGFubm90YXRpb25zIHNob3cgdXAgaW4gdGhlIHZlcnRpY2FsIHJ1bGVyIGlmIHRoYXQncyB3aGF0IHRoZQotCQkvLyBwcmVmZXJlbmNlIGlzCi0JCS8vCQkvLyB0aGVzZSBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGhhdmUgYSBkaWZmZXJlbnQgZGVmYXVsdCB2YWx1ZSB0aGFuCi0JCS8vIHRoZSBvbmUgdGhlIGJhc2UgcHJvdmlkZXMKLQkJLy8JCXN0b3JlLnNldERlZmF1bHQoImVycm9ySW5kaWNhdGlvbkluVmVydGljYWxSdWxlciIsIGZhbHNlKTsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQkvLwkJc3RvcmUuc2V0RGVmYXVsdCgid2FybmluZ0luZGljYXRpb25JblZlcnRpY2FsUnVsZXIiLCBmYWxzZSk7Ci0JCS8vIC8vJE5PTi1OTFMtMSQKLQotCQkvLyB0aGVzZSBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGFyZSBub3QgcGFydCBvZiBiYXNlIHRleHQgZWRpdG9yCi0JCS8vIHByZWZlcmVuY2UKLQkJc3RvcmUuc2V0RGVmYXVsdChDb21tb25FZGl0b3JQcmVmZXJlbmNlTmFtZXMuRVZBTFVBVEVfVEVNUE9SQVJZX1BST0JMRU1TLCB0cnVlKTsKLQotCQlzZXRNYXRjaGluZ0JyYWNrZXRzUHJlZmVyZW5jZXMoc3RvcmUsIHJlZ2lzdHJ5KTsKLQotCQkvLyBob3ZlciBoZWxwIHByZWZlcmVuY2VzIGFyZSBub3QgcGFydCBvZiBiYXNlIHRleHQgZWRpdG9yIHByZWZlcmVuY2UKLQkJU3RyaW5nIG1vZDJOYW1lID0gQWN0aW9uLmZpbmRNb2RpZmllclN0cmluZyhTV1QuTU9EMik7IC8vIFNXVC5DT01NQU5ECi0JCS8vIG9uIE1hYzsKLQkJLy8gU1dULkNPTlRST0wKLQkJLy8gZWxzZXdoZXJlCi0JCXN0b3JlLnNldERlZmF1bHQoRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkVESVRPUl9URVhUX0hPVkVSX01PRElGSUVSUywgImNvbWJpbmF0aW9uSG92ZXJ8dHJ1ZXwwO3Byb2JsZW1Ib3ZlcnxmYWxzZXwwO2RvY3VtZW50YXRpb25Ib3ZlcnxmYWxzZXwwO2Fubm90YXRpb25Ib3Zlcnx0cnVlfCIgKyBtb2QyTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBzZXQgZGVmYXVsdCByZWFkLW9ubHkgZm9yZWdyb3VuZCBjb2xvciBzY2FsZSB2YWx1ZQotCQlzdG9yZS5zZXREZWZhdWx0KEVkaXRvclByZWZlcmVuY2VOYW1lcy5SRUFEX09OTFlfRk9SRUdST1VORF9TQ0FMRSwgMzApOwotCQkKLQkJLy8gc2V0IGRlZmF1bHQgZW5hYmxlIGZvbGRpbmcgdmFsdWUKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIuRk9MRElOR19FTkFCTEVELCBmYWxzZSk7Ci0JCQotCQkvLyBzZXQgZGVmYXVsdCBmb3Igc2hvdyBtZXNzYWdlIGRpYWxvZyB3aGVuIHVua25vd24gY29udGVudCB0eXBlIGluIGVkaXRvcgotCQlzdG9yZS5zZXREZWZhdWx0KEVkaXRvclByZWZlcmVuY2VOYW1lcy5TSE9XX1VOS05PV05fQ09OVEVOVF9UWVBFX01TRywgdHJ1ZSk7Ci0JCQotCQkvLyBzZXQgY29udGVudCBhc3Npc3QgZGVmYXVsdHMKLQkJc3RvcmUuc2V0RGVmYXVsdChFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9BVVRPQUNUSVZBVElPTl9ERUxBWSwgNTAwKTsKLQkJUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KHN0b3JlLCBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9QUk9QT1NBTFNfQkFDS0dST1VORCwgQ29sb3JIZWxwZXIuZmluZFJHQihyZWdpc3RyeSwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkNPREVBU1NJU1RfUFJPUE9TQUxTX0JBQ0tHUk9VTkQsIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSkpKTsKLQkJUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KHN0b3JlLCBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9QUk9QT1NBTFNfRk9SRUdST1VORCwgQ29sb3JIZWxwZXIuZmluZFJHQihyZWdpc3RyeSwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkNPREVBU1NJU1RfUFJPUE9TQUxTX0ZPUkVHUk9VTkQsIG5ldyBSR0IoMCwgMCwgMCkpKTsKLQkJUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KHN0b3JlLCBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9QQVJBTUVURVJTX0JBQ0tHUk9VTkQsIENvbG9ySGVscGVyLmZpbmRSR0IocmVnaXN0cnksIEVkaXRvclByZWZlcmVuY2VOYW1lcy5DT0RFQVNTSVNUX1BBUkFNRVRFUlNfQkFDS0dST1VORCwgbmV3IFJHQigyNTUsIDI1NSwgMjU1KSkpOwotCQlQcmVmZXJlbmNlQ29udmVydGVyLnNldERlZmF1bHQoc3RvcmUsIEVkaXRvclByZWZlcmVuY2VOYW1lcy5DT0RFQVNTSVNUX1BBUkFNRVRFUlNfRk9SRUdST1VORCwgQ29sb3JIZWxwZXIuZmluZFJHQihyZWdpc3RyeSwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkNPREVBU1NJU1RfUEFSQU1FVEVSU19GT1JFR1JPVU5ELCBuZXcgUkdCKDAsIDAsIDApKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE1hdGNoaW5nQnJhY2tldHNQcmVmZXJlbmNlcyhJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBDb2xvclJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCS8vIG1hdGNoaW5nIGJyYWNrZXRzIGlzIG5vdCBwYXJ0IG9mIGJhc2UgdGV4dCBlZGl0b3IgcHJlZmVyZW5jZQotCQlzdG9yZS5zZXREZWZhdWx0KEVkaXRvclByZWZlcmVuY2VOYW1lcy5NQVRDSElOR19CUkFDS0VUUywgdHJ1ZSk7Ci0JCVByZWZlcmVuY2VDb252ZXJ0ZXIuc2V0RGVmYXVsdChzdG9yZSwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLk1BVENISU5HX0JSQUNLRVRTX0NPTE9SLCBDb2xvckhlbHBlci5maW5kUkdCKHJlZ2lzdHJ5LCBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuTUFUQ0hJTkdfQlJBQ0tFVFNfQ09MT1IsIG5ldyBSR0IoMTkyLCAxOTIsIDE5MikpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1JlYWRPbmx5QXdhcmVEcm9wVGFyZ2V0QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1JlYWRPbmx5QXdhcmVEcm9wVGFyZ2V0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWE5NjhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9SZWFkT25seUF3YXJlRHJvcFRhcmdldEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlBd2FyZURyb3BUYXJnZXRBZGFwdGVyIGV4dGVuZHMgRXh0ZW5kZWRFZGl0b3JEcm9wVGFyZ2V0QWRhcHRlciB7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSBSZWFkT25seUF3YXJlRHJvcFRhcmdldEFkYXB0ZXIoYm9vbGVhbiB1c2VQcm94eSkgZm9yCi0JICogICAgICAgICAgICAgdGhlIHBlcmZvcm1hbmNlCi0JICovCi0JcHVibGljIFJlYWRPbmx5QXdhcmVEcm9wVGFyZ2V0QWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgUmVhZE9ubHlBd2FyZURyb3BUYXJnZXRBZGFwdGVyKGJvb2xlYW4gdXNlUHJveHkpIHsKLQkJc3VwZXIodXNlUHJveHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IGdldFRleHRWaWV3ZXIoKS5nZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlQb2ludCByYW5nZSA9IGdldFRleHRWaWV3ZXIoKS5nZXRTZWxlY3RlZFJhbmdlKCk7Ci0JCQlpZiAoKChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCkuY29udGFpbnNSZWFkT25seShyYW5nZS54LCByYW5nZS55KSkgewotCQkJCWV2ZW50Lm9wZXJhdGlvbnMgPSBETkQuRFJPUF9OT05FOwotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQkJZ2V0VGV4dFZpZXdlcigpLmdldFRleHRXaWRnZXQoKS5yZWRyYXcoKTsKLQkJCQlnZXRUZXh0Vmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpLnVwZGF0ZSgpOwotCQkJCWdldFRleHRWaWV3ZXIoKS5nZXRUZXh0V2lkZ2V0KCkuZ2V0RGlzcGxheSgpLmJlZXAoKTsKLQkJCX0KLQkJfQotCQlzdXBlci5kcm9wKGV2ZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TU0VVSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU1NFVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDFkZGZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TU0VVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgU1NFIFVJCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU1NFVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmUmVzb3VyY2VCdW5kbGU7Ci0KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKGZSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCWZSZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlmUmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiBmUmVzb3VyY2VCdW5kbGU7Ci0JfQotCi0JcHJpdmF0ZSBTU0VVSU1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLQotICAgIHN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBTU0VVSU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvcl9vcGVuaW5nX2ZpbGVfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GaWxlX2lzX3JlYWRfb25seTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMzJjb25jYXRfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNdWx0aXBsZV9lcnJvcnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VuZG9fVGV4dF9DaGFuZ2VfX0N0cmxfWl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5kb19UZXh0X0NoYW5nZV9fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VbmRvX18wX19fQ3RybF9aX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmRvX19fMF9fX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfUmVkb19UZXh0X0NoYW5nZV9fQ3RybF9ZX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWRvX1RleHRfQ2hhbmdlX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1JlZG9fXzBfX19DdHJsX1lfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlZG9fX18wX19fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdF9Eb2N1bWVudF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0X0FjdGl2ZV9FbGVtZW50c19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dF9DdXRfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRfUGFzdGVfVUlfOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cF9Eb2N1bWVudF9VSV87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ3V0X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9DdXRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ3V0X2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9DdXRfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0NvcHlfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0NvcHlfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ29weV9pbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ29weV9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfUGFzdGVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX1Bhc3RlX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX1Bhc3RlX2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9QYXN0ZV9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfRGVsZXRlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9EZWxldGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfRGVsZXRlX2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9EZWxldGVfZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50QXNzaXN0UHJvcG9zYWxzX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRBc3Npc3RQcm9wb3NhbHNfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50QXNzaXN0UHJvcG9zYWxzX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF9pbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdERvY3VtZW50X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdERvY3VtZW50X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0RG9jdW1lbnRfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0RG9jdW1lbnRfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0QWN0aXZlRWxlbWVudHNfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0QWN0aXZlRWxlbWVudHNfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXRBY3RpdmVFbGVtZW50c19pbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXRBY3RpdmVFbGVtZW50c19kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuRmlsZUZyb21Tb3VyY2VfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkZpbGVGcm9tU291cmNlX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkZpbGVGcm9tU291cmNlX2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5GaWxlRnJvbVNvdXJjZV9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdE5leHRfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRfU2hpZnRfUmlnaHRfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRfU2hpZnRfTGVmdF9VSV87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfNGNvbmNhdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50X3R5cGVfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JlZ3JvdW5kX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYWNrZ3JvdW5kX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCb2xkX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJdGFsaWNzX1VJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc3RvcmVfRGVmYXVsdF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2FtcGxlX3RleHRfX1VJXzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJyZWFrcG9pbnRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQnJlYWtwb2ludF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJyZWFrcG9pbnRfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQnJlYWtwb2ludF9lcnJvcl9kaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQnJlYWtwb2ludF9lcnJvcl9kaWFsb2dfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVCcmVha3BvaW50X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUJyZWFrcG9pbnRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVCcmVha3BvaW50X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuYWJsZUJyZWFrcG9pbnRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5hYmxlQnJlYWtwb2ludF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuYWJsZUJyZWFrcG9pbnRfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlzYWJsZUJyZWFrcG9pbnRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlzYWJsZUJyZWFrcG9pbnRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXNhYmxlQnJlYWtwb2ludF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYW5hZ2VCcmVha3BvaW50c19hZGRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFuYWdlQnJlYWtwb2ludHNfcmVtb3ZlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbmFnZUJyZWFrcG9pbnRzX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFuYWdlQnJlYWtwb2ludHNfZXJyb3JfYWRkaW5nX3RpdGxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYW5hZ2VCcmVha3BvaW50c19lcnJvcl9hZGRpbmdfbWVzc2FnZTE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdENvbG9yUGFnZURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nX0xpbms7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3ludGF4Q29sb3JpbmdfRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yTW9kZWxVdGlsXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yTW9kZWxVdGlsXzE7Ci0KLQkvLyBUT0RPOiBUaGVzZSBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBpcwotCS8vIGRlbGV0ZWQKLQkvLyB3ZWIgY29udGVudCBzZXR0aW5ncwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0RlZmF1bHRfSFRNTF9ET0NUWVBFX0lEX19fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9DU1NfcHJvZmlsZV9fXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfVGFyZ2V0X0RldmljZV9fXzM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfVG9nZ2xlSW5zZXJ0TW9kZV9sYWJlbDsKLQotCS8vCi0JLy8gVGhlc2Ugc3RyaW5ncyBhcmUgdXNlZCBpbiBXb3JrYmVuY2ggbWVudSBiYXIKLQkvLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cGFuZFNlbGVjdGlvblRvTWVudV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3VyY2VNZW51X2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmluZE9jY3VycmVuY2VzQWN0aW9uUHJvdmlkZXJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVBY3Rpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaG93UHJvcGVydGllc0FjdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0T3Blbk9uXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0QWN0aW9uRGVsZWdhdGVfam9iTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXRBY3Rpb25EZWxlZ2F0ZV9lcnJvclN0YXR1c01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0QWN0aW9uRGVsZWdhdGVfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXRBY3Rpb25EZWxlZ2F0ZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdEFjdGlvbkRlbGVnYXRlXzU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUcmFuc2x1Y2VuY3lQcmVmZXJlbmNlVGFiXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHJhbnNsdWNlbmN5UHJlZmVyZW5jZVRhYl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8yMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzIzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMjQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV80MDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzQxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfNDI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV80MzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzQ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrVGFnUHJlZmVyZW5jZVRhYl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrVGFnUHJlZmVyZW5jZVRhYl82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VQYWdlXzMyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzMzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdFeGNsdXNpb25UYWJfMDE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ0V4Y2x1c2lvblRhYl8wMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrVGFnRXhjbHVzaW9uVGFiXzAzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvcGVydHlQcmVmZXJlbmNlUGFnZV8wMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9wZXJ0eVByZWZlcmVuY2VQYWdlXzAyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZVByZWZlcmVuY2VQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9Nb2RpZmljYXRpb25Db21wbGV0aW9uUHJvcG9zYWxfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVCcmVha3BvaW50QWN0aW9uXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFuYWdlQnJlYWtwb2ludEFjdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbmFnZUJyZWFrcG9pbnRBY3Rpb25fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0QnJlYWtwb2ludEFjdGlvbl8wOwotCS8vIFVzZWQgaW4gU3RydWN0dXJlZCBUZXh0IEVkaXRvciBQcmVmZXJlbmNlIFBhZ2UgLyBIb3ZlcnMgVGFiCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2hvdmVyUHJlZmVyZW5jZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9rZXlNb2RpZmllcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRIb3ZlclByZWZlcmVuY2VUYWJfbW9kaWZpZXJJc05vdFZhbGlkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRIb3ZlclByZWZlcmVuY2VUYWJfbW9kaWZpZXJJc05vdFZhbGlkRm9ySG92ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9kdXBsaWNhdGVNb2RpZmllcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiX25hbWVDb2x1bW5UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiX21vZGlmaWVyQ29sdW1uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9kZWxpbWl0ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9pbnNlcnREZWxpbWl0ZXJBbmRNb2RpZmllckFuZERlbGltaXRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2luc2VydE1vZGlmaWVyQW5kRGVsaW1pdGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRIb3ZlclByZWZlcmVuY2VUYWJfaW5zZXJ0RGVsaW1pdGVyQW5kTW9kaWZpZXI7Ci0KLQkvLyB1c2VkIGR5bmFtaWNhbGx5Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tYmluYXRpb25Ib3Zlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21iaW5hdGlvbkhvdmVyX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvYmxlbUhvdmVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2JsZW1Ib3Zlcl9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvY3VtZW50YXRpb25Ib3Zlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb2N1bWVudGF0aW9uSG92ZXJfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhbm5vdGF0aW9uSG92ZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYW5ub3RhdGlvbkhvdmVyX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0U3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlc0FjdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmZXJlbmNlTWFuYWdlcl8wOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaG93Vmlld19lcnJvclRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2NfZGlydHlfcmVnaW9uc18wOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGV4dEhvdmVyTWFrZVN0aWNreUhpbnQ7Ci0KLQkvLyBFbmNvZGluZwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuY29kaW5nUHJlZmVyZW5jZVBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmNvZGluZ1ByZWZlcmVuY2VQYWdlXzE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidXN5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhcmV0X3VwZGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbXB0eUZpbGVQcmVmZXJlbmNlUGFnZV8wOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV84OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMjA7Ci0KLQkvKgotCSAqICoqKioqQmVsb3cgYXJlIHBvc3NpYmx5IHVudXNlZCBzdHJpbmdzIHRoYXQgbWF5IGJlIHJlbW92ZWQgKioqKioKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFuX2Vycm9yX2hhc19vY2N1cnJlZF93aGVuX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9ibGVtc19EdXJpbmdfU2F2ZV9Bc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZV9jb3VsZF9ub3RfYmVfY29tcGxldGVfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbmFnZUJyZWFrcG9pbnRzX2Vycm9yX3JlbW92aW5nX3RpdGxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYW5hZ2VCcmVha3BvaW50c19lcnJvcl9yZW1vdmluZ19tZXNzYWdlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYW5hZ2VCcmVha3BvaW50c19lcnJvcl9yZXRyaWV2aW5nX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfZXJyb3Jfc2F2ZV9tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9lcnJvcl9zYXZlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl93YXJuaW5nX3NhdmVfZGVsZXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJldmlvdXNfYW5ub3RhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXh0X2Fubm90YXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbm5vdGF0aW9uVHlwZXNfRXJyb3JzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFubm90YXRpb25UeXBlc19XYXJuaW5nczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbm5vdGF0aW9uVHlwZXNfVGFza3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW5ub3RhdGlvblR5cGVzX1NlYXJjaFJlc3VsdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW5ub3RhdGlvblR5cGVzX0Jvb2ttYXJrczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbm5vdGF0aW9uVHlwZXNfT3RoZXJzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0NvbnZlcnRUb1dpbmRvd3NfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0NvbnZlcnRUb1dpbmRvd3NfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ29udmVydFRvV2luZG93c19pbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ29udmVydFRvV2luZG93c19kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9Db252ZXJ0VG9VTklYX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9Db252ZXJ0VG9VTklYX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0NvbnZlcnRUb1VOSVhfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0NvbnZlcnRUb1VOSVhfZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ29udmVydFRvTWFjX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9Db252ZXJ0VG9NYWNfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ29udmVydFRvTWFjX2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9Db252ZXJ0VG9NYWNfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udmVydExpbmVEZWxpbWl0ZXJzTWVudV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaW5kT2NjdXJyZW5jZXNfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb252ZXJ0TGluZURlbGltaXRlcnNUb0NSTEZBY3Rpb25EZWxlZ2F0ZV9qb2JOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnZlcnRMaW5lRGVsaW1pdGVyc1RvQ1JMRkFjdGlvbkRlbGVnYXRlX2Vycm9yU3RhdHVzTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb252ZXJ0TGluZURlbGltaXRlcnNUb0NSTEZBY3Rpb25EZWxlZ2F0ZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnZlcnRMaW5lRGVsaW1pdGVyc1RvQ1JMRkFjdGlvbkRlbGVnYXRlXzQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2Fubm90YXRpb25Sb2xsb3ZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiX3Nob3dBZmZvcmRhbmNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRIb3ZlclByZWZlcmVuY2VUYWJfZW5hYmxlZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljRmluZE9jY3VycmVuY2VzQWN0aW9uXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNTZWFyY2hMYWJlbFByb3ZpZGVyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmF2aWdhdGlvblByZWZlcmVuY2VUYWJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsZU1vZGVsUHJvdmlkZXJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKRmFjZU5vZGVBZGFwdGVyXzA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmVQcm9qZWN0U2V0dGluZ3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlV29ya3NwYWNlU2V0dGluZ3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5hYmxlUHJvamVjdFNldHRpbmdzOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdvdG9NYXRjaGluZ0JyYWNrZXRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR290b01hdGNoaW5nQnJhY2tldF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHb3RvTWF0Y2hpbmdCcmFja2V0X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR290b01hdGNoaW5nQnJhY2tldF9lcnJvcl9pbnZhbGlkU2VsZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdvdG9NYXRjaGluZ0JyYWNrZXRfZXJyb3Jfbm9NYXRjaGluZ0JyYWNrZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR290b01hdGNoaW5nQnJhY2tldF9lcnJvcl9icmFja2V0T3V0c2lkZVNlbGVjdGVkRWxlbWVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvYWRpbmdSZWZlcmVuY2VkR3JhbW1hcnM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb2xkaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0aW9uX1RvZ2dsZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0aW9uX1RvZ2dsZV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3Rpb25fVG9nZ2xlX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3Rpb25fVG9nZ2xlX2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3Rpb25fRXhwYW5kQWxsX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3Rpb25fRXhwYW5kQWxsX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdGlvbl9FeHBhbmRBbGxfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdGlvbl9FeHBhbmRBbGxfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdGlvbl9Db2xsYXBzZUFsbF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0aW9uX0NvbGxhcHNlQWxsX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdGlvbl9Db2xsYXBzZUFsbF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0aW9uX0NvbGxhcHNlQWxsX2ltYWdlOwotCi0JLy8gVGhlc2Ugc3RyaW5ncyBhcmUgYWNjZXNzZWQgdXNpbmcgcmVzb3VyY2UgYnVuZGxlIGFuZCBpbiBwcm9wZXJ0aWVzCi0JLy8gZmlsZSwgbmVlZCB0byB1c2UgJy4nIGluc3RlYWQgb2YgJ18nIGluIHNvbWUga2V5cwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9NYW5hZ2VCb29rbWFya3NfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfTWFuYWdlQm9va21hcmtzX2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9NYW5hZ2VCb29rbWFya3NfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZUJvb2ttYXJrc19hZGRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZUJvb2ttYXJrc19yZW1vdmVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZUJvb2ttYXJrc19hZGRfZGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9NYW5hZ2VCb29rbWFya3NfYWRkX2RpYWxvZ19tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9NYW5hZ2VCb29rbWFya3NfZXJyb3JfZGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9NYW5hZ2VCb29rbWFya3NfZXJyb3JfZGlhbG9nX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZVRhc2tzX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZVRhc2tzX2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9NYW5hZ2VUYXNrc19kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfTWFuYWdlVGFza3NfYWRkX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9NYW5hZ2VUYXNrc19yZW1vdmVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZVRhc2tzX2FkZF9kaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZVRhc2tzX2FkZF9kaWFsb2dfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfTWFuYWdlVGFza3NfZXJyb3JfZGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9NYW5hZ2VUYXNrc19lcnJvcl9kaWFsb2dfbWVzc2FnZTsKLQkvKgotCSAqICoqKioqQWJvdmUgYXJlIHBvc3NpYmx5IHVudXNlZCBzdHJpbmdzIHRoYXQgbWF5IGJlIHJlbW92ZWQqKioqKgotCSAqLwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMzk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlZFRleHRFZGl0b3JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmtub3duQ29udGVudFR5cGVEaWFsb2dfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmtub3duQ29udGVudFR5cGVEaWFsb2dfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmtub3duQ29udGVudFR5cGVEaWFsb2dfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHlsZWRUZXh0Q29sb3JQaWNrZXJfMDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TU0VVSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1NTRVVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYzE5MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1NTRVVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLkZvcm1Db2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3MuVGFza1NjYW5uaW5nU2NoZWR1bGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mby5UZXh0SG92ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBTU0VVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aSI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBTU0VVSVBsdWdpbiBpbnN0YW5jZSA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCBmRGlhbG9nc0Zvcm1Ub29sa2l0OwotCi0JcHVibGljIHN0YXRpYyBTU0VVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgU1NFVUlQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIFRleHRIb3Zlck1hbmFnZXIgZlRleHRIb3Zlck1hbmFnZXI7Ci0KLQlwdWJsaWMgU1NFVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSBnZXRBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGwuZ2V0SW5zdGFuY2UoKTsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0ZXh0IGhvdmVyIG1hbmFnZXIKLQkgKiAKLQkgKiBAcmV0dXJuIFRleHRIb3Zlck1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgVGV4dEhvdmVyTWFuYWdlciBnZXRUZXh0SG92ZXJNYW5hZ2VyKCkgewotCQlpZiAoZlRleHRIb3Zlck1hbmFnZXIgPT0gbnVsbCkgewotCQkJZlRleHRIb3Zlck1hbmFnZXIgPSBuZXcgVGV4dEhvdmVyTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBmVGV4dEhvdmVyTWFuYWdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJLyoqCi0JCSAqIElmIHRoZSB1c2VyIHN0YXJ0cyB0aGUgd29ya2JlbmNoIHdpdGgKLQkJICogLURvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGFza3NjYW5uZXI9b2ZmLCB0aGUgc2Nhbm5lciBzaG91bGQgYmUKLQkJICogZGlzYWJsZWQKLQkJICovCi0JCVN0cmluZyBzY2FuID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGFza3NjYW5uZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc2NhbiA9PSBudWxsIHx8ICFzY2FuLmVxdWFsc0lnbm9yZUNhc2UoIm9mZiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVRhc2tTY2FubmluZ1NjaGVkdWxlci5zdGFydHVwKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIEZvcm1Ub29sa2l0IGdldERpYWxvZ3NGb3JtVG9vbGtpdCgpIHsKLQkJaWYgKGZEaWFsb2dzRm9ybVRvb2xraXQgPT0gbnVsbCkgewotCQkJRm9ybUNvbG9ycyBjb2xvcnM9IG5ldyBGb3JtQ29sb3JzKERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLQkJCWNvbG9ycy5zZXRCYWNrZ3JvdW5kKG51bGwpOwotCQkJY29sb3JzLnNldEZvcmVncm91bmQobnVsbCk7CQotCQkJZkRpYWxvZ3NGb3JtVG9vbGtpdD0gbmV3IEZvcm1Ub29sa2l0KGNvbG9ycyk7Ci0JCX0KLQkJcmV0dXJuIGZEaWFsb2dzRm9ybVRvb2xraXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlUYXNrU2Nhbm5pbmdTY2hlZHVsZXIuc2h1dGRvd24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU1NFVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TU0VVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDcxOTNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TU0VVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDA0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotRXJyb3Jfb3BlbmluZ19maWxlX1VJXz1FcnJvciBvcGVuaW5nIGZpbGUKLV9VSV9GaWxlX2lzX3JlYWRfb25seT1GaWxlIHswfSBpcyByZWFkLW9ubHkuCi1fMzJjb25jYXRfRVhDXz1FZGl0b3IgY291bGQgbm90IGJlIG9wZW4gb24gezB9Ci1NdWx0aXBsZV9lcnJvcnM9TXVsdGlwbGUgYW5ub3RhdGlvbnMgZm91bmQgYXQgdGhpcyBsaW5lOgotX1VuZG9fVGV4dF9DaGFuZ2VfX0N0cmxfWl9VSV89JlVuZG8gVGV4dCBDaGFuZ2UgQEN0cmwrWgotVW5kb19UZXh0X0NoYW5nZV9fVUlfPVVuZG8gVGV4dCBDaGFuZ2UuCi1fVW5kb19fMF9fX0N0cmxfWl9VSV89JlVuZG8gezB9IEBDdHJsK1oKLVVuZG9fX18wX19fVUlfPVVuZG86IHswfS4KLV9SZWRvX1RleHRfQ2hhbmdlX19DdHJsX1lfVUlfPSZSZWRvIFRleHQgQ2hhbmdlIEBDdHJsK1kKLVJlZG9fVGV4dF9DaGFuZ2VfX1VJXz1SZWRvIFRleHQgQ2hhbmdlLgotX1JlZG9fXzBfX19DdHJsX1lfVUlfPSZSZWRvIHswfSBAQ3RybCtZCi1SZWRvX19fMF9fX1VJXz1SZWRvOiB7MH0uCi1Gb3JtYXRfRG9jdW1lbnRfVUlfPUZvcm1hdAotRm9ybWF0X0FjdGl2ZV9FbGVtZW50c19VSV89Rm9ybWF0IEFjdGl2ZSBFbGVtZW50cwotVGV4dF9DdXRfVUlfPVRleHQgQ3V0Ci1UZXh0X1Bhc3RlX1VJXz1UZXh0IFBhc3RlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1DbGVhbnVwX0RvY3VtZW50X1VJXz1DbGVhbnVwIERvY3VtZW50Ci0KLUVkaXRvcl9DdXRfbGFiZWw9Q3UmdEBDdHJsK1gKLUVkaXRvcl9DdXRfdG9vbHRpcD1DdXQKLUVkaXRvcl9DdXRfaW1hZ2U9Ci1FZGl0b3JfQ3V0X2Rlc2NyaXB0aW9uPUN1dAotCi1FZGl0b3JfQ29weV9sYWJlbD0mQ29weUBDdHJsK0MKLUVkaXRvcl9Db3B5X3Rvb2x0aXA9Q29weQotRWRpdG9yX0NvcHlfaW1hZ2U9Ci1FZGl0b3JfQ29weV9kZXNjcmlwdGlvbj1Db3B5Ci0KLUVkaXRvcl9QYXN0ZV9sYWJlbD0mUGFzdGVAQ3RybCtWCi1FZGl0b3JfUGFzdGVfdG9vbHRpcD1QYXN0ZQotRWRpdG9yX1Bhc3RlX2ltYWdlPQotRWRpdG9yX1Bhc3RlX2Rlc2NyaXB0aW9uPVBhc3RlCi0KLUVkaXRvcl9EZWxldGVfbGFiZWw9JkRlbGV0ZUBEZWxldGUKLUVkaXRvcl9EZWxldGVfdG9vbHRpcD1EZWxldGUKLUVkaXRvcl9EZWxldGVfaW1hZ2U9Ci1FZGl0b3JfRGVsZXRlX2Rlc2NyaXB0aW9uPURlbGV0ZQotCi1Db250ZW50QXNzaXN0UHJvcG9zYWxzX2xhYmVsPUNvbiZ0ZW50IEFzc2lzdAotQ29udGVudEFzc2lzdFByb3Bvc2Fsc190b29sdGlwPUNvbnRlbnQgQXNzaXN0Ci1Db250ZW50QXNzaXN0UHJvcG9zYWxzX2Rlc2NyaXB0aW9uPUNvbnRlbnQgQXNzaXN0Ci0KLVF1aWNrRml4X2xhYmVsPSZRdWljayBGaXgKLVF1aWNrRml4X3Rvb2x0aXA9UXVpY2sgRml4Ci1RdWlja0ZpeF9pbWFnZT0KLVF1aWNrRml4X2Rlc2NyaXB0aW9uPVF1aWNrIEZpeAotCi1Ub2dnbGVDb21tZW50X2xhYmVsPVRvZ2cmbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF90b29sdGlwPVRvZ2dsZSBDb21tZW50Ci1Ub2dnbGVDb21tZW50X2ltYWdlPQotVG9nZ2xlQ29tbWVudF9kZXNjcmlwdGlvbj1Ub2dnbGUgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2xhYmVsPUFkZCAmQmxvY2sgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X3Rvb2x0aXA9QWRkIEJsb2NrIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF9pbWFnZT0KLUFkZEJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbj1BZGQgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsPVJlbW92ZSBCbG9jJmsgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXA9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF9pbWFnZT0KLVJlbW92ZUJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbj1SZW1vdmUgQmxvY2sgQ29tbWVudAotQ2xlYW51cERvY3VtZW50X2xhYmVsPUMmbGVhbnVwIERvY3VtZW50Li4uCi1DbGVhbnVwRG9jdW1lbnRfdG9vbHRpcD1DbGVhbnVwIERvY3VtZW50Ci1DbGVhbnVwRG9jdW1lbnRfaW1hZ2U9Ci1DbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb249Q2xlYW51cCBEb2N1bWVudAotRm9ybWF0RG9jdW1lbnRfbGFiZWw9JkZvcm1hdAotRm9ybWF0RG9jdW1lbnRfdG9vbHRpcD1Gb3JtYXQKLUZvcm1hdERvY3VtZW50X2ltYWdlPQotRm9ybWF0RG9jdW1lbnRfZGVzY3JpcHRpb249Rm9ybWF0Ci1Gb3JtYXRBY3RpdmVFbGVtZW50c19sYWJlbD1Gb3JtYXQgQWN0Jml2ZSBFbGVtZW50cwotRm9ybWF0QWN0aXZlRWxlbWVudHNfdG9vbHRpcD1Gb3JtYXQgQWN0aXZlIEVsZW1lbnRzCi1Gb3JtYXRBY3RpdmVFbGVtZW50c19pbWFnZT0KLUZvcm1hdEFjdGl2ZUVsZW1lbnRzX2Rlc2NyaXB0aW9uPUZvcm1hdCBBY3RpdmUgRWxlbWVudHMKLU9wZW5GaWxlRnJvbVNvdXJjZV9sYWJlbD1PcCZlbiBTZWxlY3Rpb24KLU9wZW5GaWxlRnJvbVNvdXJjZV90b29sdGlwPU9wZW4gYW4gZWRpdG9yIG9uIHRoZSBzZWxlY3RlZCBsaW5rCi1PcGVuRmlsZUZyb21Tb3VyY2VfaW1hZ2U9Ci1PcGVuRmlsZUZyb21Tb3VyY2VfZGVzY3JpcHRpb249T3BlbiBhbiBlZGl0b3Igb24gdGhlIHNlbGVjdGVkIGxpbmsKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbD0mRW5jbG9zaW5nIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBlbmNsb3NpbmcgZWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2Rlc2NyaXB0aW9uPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBlbmNsb3NpbmcgZWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbD0mTmV4dCBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIG5leHQgc2libGluZwotU3RydWN0dXJlU2VsZWN0TmV4dF9kZXNjcmlwdGlvbj1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgbmV4dCBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbD0mUHJldmlvdXMgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgcHJldmlvdXMgc2libGluZwotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfZGVzY3JpcHRpb249RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWw9JlJlc3RvcmUgTGFzdCBTZWxlY3Rpb24KLVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcD1SZXN0b3JlIGxhc3Qgc2VsZWN0aW9uCi1TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2Rlc2NyaXB0aW9uPVJlc3RvcmUgbGFzdCBzZWxlY3Rpb24KLVRleHRfU2hpZnRfUmlnaHRfVUlfPVRleHQgU2hpZnQgUmlnaHQKLVRleHRfU2hpZnRfTGVmdF9VSV89VGV4dCBTaGlmdCBMZWZ0Ci0KLV80Y29uY2F0PScnezB9JycgaXMgbm90IGEgdmFsaWQgaW5wdXQKLSMjIFRoZSBmb2xsb3dpbmcgc3RyaW5ncyBhcmUgZm9yICJYTUwtPlhNTCBTb3VyY2UtPlhNTCBTdHlsZSIgUHJlZmVyZW5jZXMsICJXZWIgVG9vbHMtPlNvdXJjZS0+SFRNTCBTdHlsZSIgUHJlZmVyZW5jZXMsIGFuZCAiV2ViIFRvb2xzLT5Tb3VyY2UtPkphdmFTY3JpcHQgU3R5bGUiIFByZWZlcmVuY2VzCi1Db250ZW50X3R5cGVfX1VJXz1DbyZudGVudCB0eXBlOgotRm9yZWdyb3VuZF9VSV89JkZvcmVncm91bmQ6Ci1CYWNrZ3JvdW5kX1VJXz0mQmFja2dyb3VuZDoKLUJvbGRfVUlfPUImb2xkCi1JdGFsaWNzX1VJPUl0YWxpY3MKLVJlc3RvcmVfRGVmYXVsdF9VSV89JlJlc3RvcmUgRGVmYXVsdAotU2FtcGxlX3RleHRfX1VJXz0mU2FtcGxlIHRleHQ6Ci0jIwotQWRkQnJlYWtwb2ludF9sYWJlbD1BZGQgJkJyZWFrcG9pbnQKLUFkZEJyZWFrcG9pbnRfdG9vbHRpcD1BZGQgQnJlYWtwb2ludAotQWRkQnJlYWtwb2ludF9kZXNjcmlwdGlvbj1BZGQgQnJlYWtwb2ludAotQWRkQnJlYWtwb2ludF9lcnJvcl9kaWFsb2dfdGl0bGU9QWRkIEJyZWFrcG9pbnQKLUFkZEJyZWFrcG9pbnRfZXJyb3JfZGlhbG9nX21lc3NhZ2U9Q2Fubm90IGFkZCBicmVha3BvaW50Ci0jIwotVG9nZ2xlQnJlYWtwb2ludF9sYWJlbD1Ub2dnbGUgQnJlYWtwb2ludAotVG9nZ2xlQnJlYWtwb2ludF90b29sdGlwPVRvZ2dsZSBCcmVha3BvaW50Ci1Ub2dnbGVCcmVha3BvaW50X2Rlc2NyaXB0aW9uPVRvZ2dsZSBCcmVha3BvaW50Ci0jIwotRW5hYmxlQnJlYWtwb2ludF9sYWJlbD1FbmFibGUgQnJlYWtwb2ludAotRW5hYmxlQnJlYWtwb2ludF90b29sdGlwPUVuYWJsZSBCcmVha3BvaW50Ci1FbmFibGVCcmVha3BvaW50X2Rlc2NyaXB0aW9uPUVuYWJsZSBCcmVha3BvaW50Ci0jIwotRGlzYWJsZUJyZWFrcG9pbnRfbGFiZWw9RGlzYWJsZSBCcmVha3BvaW50Ci1EaXNhYmxlQnJlYWtwb2ludF90b29sdGlwPURpc2FibGUgQnJlYWtwb2ludAotRGlzYWJsZUJyZWFrcG9pbnRfZGVzY3JpcHRpb249RGlzYWJsZSBCcmVha3BvaW50Ci0jIwotTWFuYWdlQnJlYWtwb2ludHNfYWRkX2xhYmVsPUFkZCAmQnJlYWtwb2ludAotTWFuYWdlQnJlYWtwb2ludHNfcmVtb3ZlX2xhYmVsPVJlbW92ZSBCcmVha3BvaW50Ci1NYW5hZ2VCcmVha3BvaW50c190b29sdGlwPUFkZC9SZW1vdmUgQnJlYWtwb2ludAotTWFuYWdlQnJlYWtwb2ludHNfZXJyb3JfYWRkaW5nX3RpdGxlMT1BZGQgQnJlYWtwb2ludAotTWFuYWdlQnJlYWtwb2ludHNfZXJyb3JfYWRkaW5nX21lc3NhZ2UxPUNhbm5vdCBhZGQgYnJlYWtwb2ludAotCi1BYnN0cmFjdENvbG9yUGFnZURlc2NyaXB0aW9uPUN1c3RvbWl6ZSB0aGUgc3ludGF4IGhpZ2hsaWdodGluZyBieSBzZWxlY3RpbmcgdGhlIHR5cGUgb2YgdGV4dCB3aG9zZSBzdHlsZSB5b3Ugd2FudCB0byBjdXN0b21pemUgZnJvbSBlaXRoZXIgdGhlIGNvbWJvIGJveCBvciB0aGUgc2FtcGxlIHRleHQgYXJlYQotIyMKLUVkaXRvck1vZGVsVXRpbF8wPW1vZGVsIGluIGludmFsaWQgc3RhdGUKLUVkaXRvck1vZGVsVXRpbF8xPVRoZXJlIHdhcyBhIHByb2JsZW0gYWRkaW5nIGFkYXB0ZXIgZmFjdG9yaWVzCi0KLSMgd2ViIGNvbnRlbnQgc2V0dGluZ3MKLVVJX0RlZmF1bHRfSFRNTF9ET0NUWVBFX0lEX19fMT0mRG9jdW1lbnQgdHlwZToKLVVJX0NTU19wcm9maWxlX19fMj0mQ1NTIHByb2ZpbGU6Ci1VSV9UYXJnZXRfRGV2aWNlX19fMz0mVGFyZ2V0IGRldmljZToKLQotRWRpdG9yX1RvZ2dsZUluc2VydE1vZGVfbGFiZWw9U21hJnJ0IEluc2VydCBNb2RlCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRoZXNlIHN0cmluZ3MgYXJlIHVzZWQgaW4gV29ya2JlbmNoIG1lbnUgYmFyCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotRXhwYW5kU2VsZWN0aW9uVG9NZW51X2xhYmVsPUUmeHBhbmQgU2VsZWN0aW9uIFRvCi1Tb3VyY2VNZW51X2xhYmVsPSZTb3VyY2UKLSMKLUZpbmRPY2N1cnJlbmNlc0FjdGlvblByb3ZpZGVyXzA9Q3VycmVudCBzZWxlY3Rpb24gZG9lcyBub3QgcmVzb2x2ZSB0byBhIHNlYXJjaGFibGUgZWxlbWVudAotUmVtb3ZlQWN0aW9uXzA9UmVtb3ZlIFByb3BlcnR5Ci1TaG93UHJvcGVydGllc0FjdGlvbl8wPVAmcm9wZXJ0aWVzCi1Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb25fMD1Db2xsYXBzZSBBbGwKLUNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbl8xPUxpbmsgd2l0aCBFZGl0b3IKLUFic3RyYWN0T3Blbk9uXzA9Q3VycmVudCB0ZXh0IHNlbGVjdGlvbiBkb2VzIG5vdCByZXNvbHZlIHRvIGEgZmlsZQotRm9ybWF0QWN0aW9uRGVsZWdhdGVfam9iTmFtZT1Gb3JtYXR0aW5nLi4uCi1Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV9lcnJvclN0YXR1c01lc3NhZ2U9RXhjZXB0aW9ucyBvY2N1cnJlZCB3aGlsZSBmb3JtYXR0aW5nIGRvY3VtZW50cwotRm9ybWF0QWN0aW9uRGVsZWdhdGVfMz1Gb3JtYXR0aW5nIHswfQotRm9ybWF0QWN0aW9uRGVsZWdhdGVfND1FeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgZm9ybWF0dGluZyBkb2N1bWVudCB7MH0KLUZvcm1hdEFjdGlvbkRlbGVnYXRlXzU9TWFsZm9ybWVkSW5wdXRFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgZm9ybWF0dGluZyBkb2N1bWVudCB7MH0KLVRyYW5zbHVjZW5jeVByZWZlcmVuY2VUYWJfMD1SZWFkLU9ubHkgdGV4dCBzdHlsZQotVHJhbnNsdWNlbmN5UHJlZmVyZW5jZVRhYl8xPVJlYWQtT25seSBjb250cmFzdCBwZXJjZW50YWdlOgotU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8yPU1hdGNoaW5nIGJyYWNrZXRzIGhpZ2hsaWdodAotU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV82PVRoZSBmb2xsb3dpbmcgcHJlZmVyZW5jZXMgYXBwbHkgdG8gdGhlIEhUTUwsIEpTUCwgWE1MLCBhbmQgb3RoZXIgc291cmNlIGVkaXRvcnMuCi1TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzIwPUhpZ2hsaWdodCAmbWF0Y2hpbmcgYnJhY2tldHMKLVN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMjM9QXBwZWFyYW5jZSBjbyZsb3Igb3B0aW9uczoKLVN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMjQ9QyZvbG9yOgotU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zMD0mUmVwb3J0IHByb2JsZW1zIGFzIHlvdSB0eXBlCi1TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM3PUVtcHR5IGlucHV0Ci1TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM4PWlzIG5vdCBhIHZhbGlkIGlucHV0LgotU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zOT1JbmZvcm0gd2hlbiB1bnN1cHBvcnRlZCBjb250ZW50IHR5cGUgaXMgaW4gZWRpdG9yCi1TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzQwPUFsc28gc2VlIHRoZSA8YT4nJ3swfScnPC9hPiBwcmVmZXJlbmNlcy4KLVN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfNDE9Q29tcGxldGlvbiBwcm9wb3NhbCBiYWNrZ3JvdW5kCi1TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzQyPUNvbXBsZXRpb24gcHJvcG9zYWwgZm9yZWdyb3VuZAotU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV80Mz1QYXJhbWV0ZXIgaGludHMgYmFja2dyb3VuZAotU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV80ND1QYXJhbWV0ZXIgaGludHMgZm9yZWdyb3VuZAotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMD1Mb3cKLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzE9Tm9ybWFsCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8yPUhpZ2gKLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzM9Ti9BCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl81PVRhc2sgVGFnCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl82PVRhZzoKLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzc9UHJpb3JpdHk6Ci1UYXNrVGFnUHJlZmVyZW5jZVRhYl8xMj1UYWcKLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzEzPVByaW9yaXR5Ci1UYXNrVGFnUHJlZmVyZW5jZVRhYl8xND1OZXcuLi4KLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzE1PUVkaXQuLi4KLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzE2PVJlbW92ZQotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTc9U2VsZWN0IEFsbAotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTg9RGVzZWxlY3QgQWxsCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8xOT1Ob3RlOiB0YWdzIGFyZSBjYXNlIGluc2Vuc2l0aXZlCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8yMD1UYXNrIFRhZ3MKLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzIyPVRhc2sgVGFncyBTZXR0aW5ncyBDaGFuZ2VkCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8yMz1UaGUgdGFzayB0YWdzIHNldHRpbmdzIGhhdmUgY2hhbmdlZC4gIE1ha2UgdGhlc2UgY2hhbmdlcyBlZmZlY3RpdmUgbm93PwotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjQ9WWVzCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8yNT1ObwotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjY9Q2FuY2VsCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8yNz1TY2FubmluZyBmaWxlcyBmb3IgdGFza3MKLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzI4PWRldGVjdGlvbiBhYm9ydGVkCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8yOT1kZXRlY3Rpb24gY29tcGxldGVkCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8zMD1kZXRlY3Rpb24gZW5jb3VudGVyZWQgZXJyb3JzCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8zMT1FbmFibGUgc2VhcmNoaW5nIGZvciBUYXNrIFRhZ3MKLVRhc2tUYWdQcmVmZXJlbmNlUGFnZV8zMj1DbGVhbiBhbmQgcmVkZXRlY3QgVGFza3MKLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzMzPVRhZ3MgaW4gY29tbWVudHMgaW5kaWNhdGluZyBUYXNrczoKLVRhc2tUYWdFeGNsdXNpb25UYWJfMDE9RmlsdGVycwotVGFza1RhZ0V4Y2x1c2lvblRhYl8wMj1TY2FuIHRoZSBzZWxlY3RlZCBDb250ZW50IFR5cGVzOgotVGFza1RhZ0V4Y2x1c2lvblRhYl8wMz1BZmZlY3RlZCBDb250ZW50IFR5cGVzOgotCi1Qcm9wZXJ0eVByZWZlcmVuY2VQYWdlXzAxPVByb2plY3QgU3BlY2lmaWMgQ29uZmlndXJhdGlvbgotUHJvcGVydHlQcmVmZXJlbmNlUGFnZV8wMj1TZWxlY3QgdGhlIHByb2plY3QgdG8gY29uZmlndXJlOgotCi1GaWxlUHJlZmVyZW5jZVBhZ2VfMD1FeHBhbmQgdGhlIHRyZWUgdG8gZWRpdCBwcmVmZXJlbmNlcyBmb3IgYSBzcGVjaWZpYyBjb250ZW50IHR5cGUuCi1Ob01vZGlmaWNhdGlvbkNvbXBsZXRpb25Qcm9wb3NhbF8wPU5vIGNvcnJlY3Rpb25zIGF2YWlsYWJsZQotVG9nZ2xlQnJlYWtwb2ludEFjdGlvbl8wPVRvZ2dsZSAmQnJlYWtwb2ludHMKLU1hbmFnZUJyZWFrcG9pbnRBY3Rpb25fMD0mRW5hYmxlIEJyZWFrcG9pbnRzCi1NYW5hZ2VCcmVha3BvaW50QWN0aW9uXzE9JkRpc2FibGUgQnJlYWtwb2ludHMKLUVkaXRCcmVha3BvaW50QWN0aW9uXzA9QnJlYWtwb2ludCAmUHJvcGVydGllcy4uLgotIyMgVXNlZCBpbiBTdHJ1Y3R1cmVkIFRleHQgRWRpdG9yIFByZWZlcmVuY2UgUGFnZSAvIEhvdmVycyBUYWIKLVRleHRIb3ZlclByZWZlcmVuY2VUYWJfdGl0bGU9SG92ZXJzCi1UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2hvdmVyUHJlZmVyZW5jZXM9VGV4dCAmSG92ZXIga2V5IG1vZGlmaWVyIHByZWZlcmVuY2VzOgotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9rZXlNb2RpZmllcj1QcmVzc2VkIGtleSAmbW9kaWZpZXIgd2hpbGUgaG92ZXJpbmc6Ci1UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2Rlc2NyaXB0aW9uPURlc2NyaXB0aW9uOgotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9tb2RpZmllcklzTm90VmFsaWQ9TW9kaWZpZXIgJyd7MH0nJyBpcyBub3QgdmFsaWQuCi1UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX21vZGlmaWVySXNOb3RWYWxpZEZvckhvdmVyPU1vZGlmaWVyICcnezB9JycgZm9yICcnezF9JycgaG92ZXIgaXMgbm90IHZhbGlkLgotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9kdXBsaWNhdGVNb2RpZmllcj0nJ3swfScnIGhvdmVyIHVzZXMgdGhlIHNhbWUgbW9kaWZpZXIgYXMgJyd7MX0nJyBob3Zlci4KLVRleHRIb3ZlclByZWZlcmVuY2VUYWJfbmFtZUNvbHVtblRpdGxlPVRleHQgSG92ZXIgTmFtZQotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9tb2RpZmllckNvbHVtblRpdGxlPVByZXNzZWQgS2V5IE1vZGlmaWVyIFdoaWxlIEhvdmVyaW5nCi1UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2RlbGltaXRlcj0rCi1UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2luc2VydERlbGltaXRlckFuZE1vZGlmaWVyQW5kRGVsaW1pdGVyPVwgKyB7MH0gKwotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9pbnNlcnRNb2RpZmllckFuZERlbGltaXRlcj1cIHswfSArCi1UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2luc2VydERlbGltaXRlckFuZE1vZGlmaWVyPVwgKyB7MH0KLWNvbWJpbmF0aW9uSG92ZXJfbGFiZWw9Q29tYmluZWQgSG92ZXIKLWNvbWJpbmF0aW9uSG92ZXJfZGVzYz1UcmllcyB0aGUgaG92ZXJzIGluIHRoZSBzZXF1ZW5jZSBsaXN0ZWQgaW4gdGhlIHRhYmxlIGJlbG93IHRoaXMgb25lIGFuZCB1c2VzIHRoZSBvbmUgd2hpY2ggZml0cyBiZXN0IGZvciB0aGUgc2VsZWN0ZWQgZWxlbWVudCBhbmQgdGhlIGN1cnJlbnQgY29udGV4dC4KLXByb2JsZW1Ib3Zlcl9sYWJlbD1Qcm9ibGVtIERlc2NyaXB0aW9uCi1wcm9ibGVtSG92ZXJfZGVzYz1TaG93cyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNlbGVjdGVkIHByb2JsZW0uCi1kb2N1bWVudGF0aW9uSG92ZXJfbGFiZWw9RG9jdW1lbnRhdGlvbiBEZXNjcmlwdGlvbgotZG9jdW1lbnRhdGlvbkhvdmVyX2Rlc2M9U2hvd3MgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIHNlbGVjdGVkIGVsZW1lbnQuCi1hbm5vdGF0aW9uSG92ZXJfbGFiZWw9QW5ub3RhdGlvbiBEZXNjcmlwdGlvbgotYW5ub3RhdGlvbkhvdmVyX2Rlc2M9U2hvd3MgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWxlY3RlZCBhbm5vdGF0aW9uLgotRWRpdFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZXNBY3Rpb25fMD1FZGl0b3IgUHJlZmVyZW5jZXMKLVN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMD1BcHBlYXJhbmNlCi1QcmVmZXJlbmNlTWFuYWdlcl8wPU9yaWdpbmFsIEVycm9yOgotCi1PY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzA9ezB9IC0gezF9IE9jY3VycmVuY2VzIGluIHsyfQotT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8yPWZpbGUKLVNob3dWaWV3X2Vycm9yVGl0bGU9UHJvYmxlbXMgU2hvd2luZyBWaWV3Ci1wcm9jX2RpcnR5X3JlZ2lvbnNfMCA9IFByb2Nlc3NpbmcgRGlydHkgUmVnaW9ucwotCi10ZXh0SG92ZXJNYWtlU3RpY2t5SGludD1QcmVzcyAnJ3swfScnIGZvciBmb2N1cy4KLQotIyMgRW5jb2RpbmcKLUVuY29kaW5nUHJlZmVyZW5jZVBhZ2VfMD1FbmNvZGluZyBzZXR0aW5ncyBmb3IgV2ViIGFuZCBYTUwgZmlsZXM6Ci1FbmNvZGluZ1ByZWZlcmVuY2VQYWdlXzE9VXNlIDMgYnl0ZSBCT00gKEJ5dGUgT3JkZXIgTWFyaykgd2hlbiBzYXZpbmcgVVRGLTggZW5jb2RlZCBmaWxlcwotYnVzeT1idXN5Ci1jYXJldF91cGRhdGU9Y2FyZXQgdXBkYXRlCi1FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZV8wPVRoaXMgY2F0ZWdvcnkgSUQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgJ29yZy5lY2xpcHNlLndzdC54bWwudWkucHJlZmVyZW5jZXMueG1sJyBhbmQgJ29yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLndlYicKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzA9U2VsZWN0aW9uIEluZm9ybWF0aW9uOgotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMj1QYXJ0aXRpb25zCi1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8zPUlUZXh0UmVnaW9ucwotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fND1TdHJ1Y3R1cmVkIE1vZGVsIENvbnRlbnQtVHlwZTogCi1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV81PU1vZGVsIEhhbmRsZXI6IAotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fNj1Eb2N1bWVudCBDbGFzczogCi1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV83PURvY3VtZW50IFByb3ZpZGVyIENsYXNzOiAKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzg9UGFydGl0aW9uaW5nczoKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzk9U3RhcnQKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzEwPUxlbmd0aAotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTE9VHlwZQotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTI9SW5wdXQgVHlwZTogCi1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xMz1QYXJ0aXRpb25lcjogCi1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xND1TdHJ1Y3R1cmVkIFNlbGVjdGlvbgotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTU9U3RhcnQKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzE2PUxlbmd0aAotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTc9VGV4dCBMZW5ndGgKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzE4PUNvbnRleHQKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzE5PVdvcmtiZW5jaCBTZWxlY3Rpb24KLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzIwPUluZGV4ZWQgUmVnaW9ucwotCi1TdHJ1Y3R1cmVkVGV4dEVkaXRvcl8wPVVuc3VwcG9ydGVkIGNvbnRlbnQgdHlwZSB3YXJuaW5nCi1Vbmtub3duQ29udGVudFR5cGVEaWFsb2dfMD1VbnN1cHBvcnRlZCBDb250ZW50IFR5cGUKLVVua25vd25Db250ZW50VHlwZURpYWxvZ18xPURvIG5vdCBzaG93IHRoaXMgbWVzc2FnZSBhZ2FpbgotVW5rbm93bkNvbnRlbnRUeXBlRGlhbG9nXzI9VW5zdXBwb3J0ZWQgY29udGVudCB0eXBlIGluIGVkaXRvci5cblRvIGFzc29jaWF0ZSBmaWxlIGV4dGVuc2lvbiB3aXRoIGEgc3VwcG9ydGVkIGNvbnRlbnQgdHlwZSxcbnBsZWFzZSBzZWUgPGE+Q29udGVudCBUeXBlcyBQcmVmZXJlbmNlIFBhZ2U8L2E+Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyBCZWxvdyBhcmUgcG9zc2libHkgdW51c2VkIHN0cmluZ3MgdGhhdCBtYXkgYmUgcmVtb3ZlZAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVNhdmVfbGFiZWw9JlNhdmUKLUFuX2Vycm9yX2hhc19vY2N1cnJlZF93aGVuX0VSUk9SXz1BbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hlbiByZXRyaWV2aW5nIHJlc291cmNlcyBmb3IgdGhlIHNvdXJjZSBlZGl0b3IuIFRoZSBFY2xpcHNlIFdvcmtiZW5jaCBpbnN0YWxsYXRpb24gbWF5IGhhdmUgYmVlbiBjb3JydXB0ZWQuCi0jIyBzYXZlIGFzIHByb2JsZW1zIChuZXh0IHR3bykgc2hvdWxkIG1hdGNoIHdoYXQgaXMgaW4gd29ya2JlbmNoCi1Qcm9ibGVtc19EdXJpbmdfU2F2ZV9Bc19VSV89UHJvYmxlbXMgRHVyaW5nIFNhdmUgQXMuLi4KLVNhdmVfY291bGRfbm90X2JlX2NvbXBsZXRlX1VJXz1TYXZlIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQuCi1NYW5hZ2VCcmVha3BvaW50c19lcnJvcl9yZW1vdmluZ190aXRsZTE9UmVtb3ZlIEJyZWFrcG9pbnQKLU1hbmFnZUJyZWFrcG9pbnRzX2Vycm9yX3JlbW92aW5nX21lc3NhZ2UxPUNhbm5vdCByZW1vdmUgYnJlYWtwb2ludAotTWFuYWdlQnJlYWtwb2ludHNfZXJyb3JfcmV0cmlldmluZ19tZXNzYWdlPVJldHJpZXZpbmcgbWFya2VycyBmYWlsZWQ6Ci1KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZURlc2NyaXB0aW9uPUVtYmVkZGVkIGNvbnRlbnQgdHlwZVwncyBzb3VyY2UgcHJlZmVyZW5jZXMgd2lsbCBiZSB1c2VkLiBTZWxlY3QgdGhlIGZpbGUgdHlwZSBmb3IgY3VzdG9taXphdGlvbgotIyBUaGUgZm9sbG93aW5nIGxpbmVzIGNvcGllZCBmcm9tIG9yZ1xlY2xpcHNlXHVpXGVkaXRvcnNcdGV4dFxUZXh0RWRpdG9yTWVzc2FnZXMucHJvcGVydGllcyBpbiBvcmcuZWNsaXBzZS51aSBwbHVnaW4KLUVkaXRvcl9lcnJvcl9zYXZlX21lc3NhZ2U9U2F2ZSBjb3VsZCBub3QgYmUgY29tcGxldGVkLiB7MH0KLUVkaXRvcl9lcnJvcl9zYXZlX3RpdGxlPVByb2JsZW1zIER1cmluZyBTYXZlIEFzLi4uCi1FZGl0b3Jfd2FybmluZ19zYXZlX2RlbGV0ZT1UaGUgb3JpZ2luYWwgZmlsZSAnJ3swfScnIGhhcyBiZWVuIGRlbGV0ZWQuCi0KLSMgYWN0aW9ucwotUHJldmlvdXNfYW5ub3RhdGlvbj1QcmV2aW91cyBBbm5vdGF0aW9uCi1OZXh0X2Fubm90YXRpb249TmV4dCBBbm5vdGF0aW9uCi0jIEFubm90YXRpb24gVHlwZXMKLUFubm90YXRpb25UeXBlc19FcnJvcnM9RXJyb3JzCi1Bbm5vdGF0aW9uVHlwZXNfV2FybmluZ3M9V2FybmluZ3MKLUFubm90YXRpb25UeXBlc19UYXNrcz1UYXNrcwotQW5ub3RhdGlvblR5cGVzX1NlYXJjaFJlc3VsdHM9U2VhcmNoIFJlc3VsdHMKLUFubm90YXRpb25UeXBlc19Cb29rbWFya3M9Qm9va21hcmtzCi1Bbm5vdGF0aW9uVHlwZXNfT3RoZXJzPU90aGVycwotCi1FZGl0b3JfQ29udmVydFRvV2luZG93c19sYWJlbD0mV2luZG93cwotRWRpdG9yX0NvbnZlcnRUb1dpbmRvd3NfdG9vbHRpcD1Db252ZXJ0cyBsaW5lIGRlbGltaXRlcnMgdG8gV2luZG93cwotRWRpdG9yX0NvbnZlcnRUb1dpbmRvd3NfaW1hZ2U9Ci1FZGl0b3JfQ29udmVydFRvV2luZG93c19kZXNjcmlwdGlvbj1Db252ZXJ0cyBsaW5lIGRlbGltaXRlcnMgdG8gV2luZG93cwotCi1FZGl0b3JfQ29udmVydFRvVU5JWF9sYWJlbD0mVU5JWAotRWRpdG9yX0NvbnZlcnRUb1VOSVhfdG9vbHRpcD1Db252ZXJ0cyBsaW5lIGRlbGltaXRlcnMgdG8gVU5JWAotRWRpdG9yX0NvbnZlcnRUb1VOSVhfaW1hZ2U9Ci1FZGl0b3JfQ29udmVydFRvVU5JWF9kZXNjcmlwdGlvbj1Db252ZXJ0cyBsaW5lIGRlbGltaXRlcnMgdG8gVU5JWAotCi1FZGl0b3JfQ29udmVydFRvTWFjX2xhYmVsPSZNYWMKLUVkaXRvcl9Db252ZXJ0VG9NYWNfdG9vbHRpcD1Db252ZXJ0cyBsaW5lIGRlbGltaXRlcnMgdG8gTWFjCi1FZGl0b3JfQ29udmVydFRvTWFjX2ltYWdlPQotRWRpdG9yX0NvbnZlcnRUb01hY19kZXNjcmlwdGlvbj1Db252ZXJ0cyBsaW5lIGRlbGltaXRlcnMgdG8gTWFjCi1Db252ZXJ0TGluZURlbGltaXRlcnNNZW51X2xhYmVsPUNvJm52ZXJ0IExpbmUgRGVsaW1pdGVycyB0bwotRmluZE9jY3VycmVuY2VzX2xhYmVsPU8mY2N1cnJlbmNlcyBpbiBGaWxlCi0KLUNvbnZlcnRMaW5lRGVsaW1pdGVyc1RvQ1JMRkFjdGlvbkRlbGVnYXRlX2pvYk5hbWU9Q29udmVydGluZyBsaW5lIGRlbGltaXRlcnMKLUNvbnZlcnRMaW5lRGVsaW1pdGVyc1RvQ1JMRkFjdGlvbkRlbGVnYXRlX2Vycm9yU3RhdHVzTWVzc2FnZT1FeGNlcHRpb25zIG9jY3VycmVkIHdoaWxlIGNvbnZlcnRpbmcgbGluZSBkZWxpbWl0ZXJzCi1Db252ZXJ0TGluZURlbGltaXRlcnNUb0NSTEZBY3Rpb25EZWxlZ2F0ZV8zPUNvbnZlcnRpbmcgbGluZSBkZWxpbWl0ZXJzIGZvciB7MH0KLUNvbnZlcnRMaW5lRGVsaW1pdGVyc1RvQ1JMRkFjdGlvbkRlbGVnYXRlXzQ9RXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGNvbnZlcnRpbmcgbGluZSBkZWxpbWl0ZXJzIGZvciBkb2N1bWVudCB7MH0KLVRleHRIb3ZlclByZWZlcmVuY2VUYWJfYW5ub3RhdGlvblJvbGxvdmVyPSZFbmFibGUgYW5ub3RhdGlvbiByb2xsLW92ZXIgKG9uIG5ldyBlZGl0b3JzKQotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9zaG93QWZmb3JkYW5jZT0mU2hvdyBhZmZvcmRhbmNlIGluIGhvdmVyIG9uIGhvdyB0byBtYWtlIGl0IHN0aWNreQotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9lbmFibGVkPSZFbmFibGVkCi0KLUJhc2ljRmluZE9jY3VycmVuY2VzQWN0aW9uXzA9cmVnaW9uIG1hdGNoOgotQmFzaWNTZWFyY2hMYWJlbFByb3ZpZGVyXzA9bGluZQotTmF2aWdhdGlvblByZWZlcmVuY2VUYWJfMD1Nb2RpZmllciAnJ3swfScnIGlzIG5vdCB2YWxpZC4KLU9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMT17MH0gLSAxIE9jY3VycmVuY2UgaW4gezF9Ci1GaWxlTW9kZWxQcm92aWRlcl8wPUVycm9yIHJlbG9hZGluZyB7MH0KLUpGYWNlTm9kZUFkYXB0ZXJfMD1VcGRhdGUgT3V0bGluZQotCi1Db25maWd1cmVQcm9qZWN0U2V0dGluZ3M9Q29uZmlndXJlIFByb2plY3QgU3BlY2lmaWMgU2V0dGluZ3MuLi4KLUNvbmZpZ3VyZVdvcmtzcGFjZVNldHRpbmdzPUNvbmZpZ3VyZSBXb3Jrc3BhY2UgU2V0dGluZ3MuLi4KLUVuYWJsZVByb2plY3RTZXR0aW5ncz1FbmFibGUgcHJvamVjdCBzcGVjaWZpYyBzZXR0aW5ncwotCi1Mb2FkaW5nUmVmZXJlbmNlZEdyYW1tYXJzPUxvYWRpbmcgcmVmZXJlbmNlZCBncmFtbWFycwotCi0jIyBGb2xkaW5nCi1Gb2xkaW5nPUZvbGRpbmcKLVN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMz1FbmFibGUgJmZvbGRpbmcKLVByb2plY3Rpb25fVG9nZ2xlX2xhYmVsPSAmRW5hYmxlIEZvbGRpbmcKLVByb2plY3Rpb25fVG9nZ2xlX3Rvb2x0aXA9IFRvZ2dsZXMgRm9sZGluZwotUHJvamVjdGlvbl9Ub2dnbGVfZGVzY3JpcHRpb249IFRvZ2dsZXMgZm9sZGluZyBmb3IgdGhlIGN1cnJlbnQgZWRpdG9yCi1Qcm9qZWN0aW9uX1RvZ2dsZV9pbWFnZT0KLVByb2plY3Rpb25fRXhwYW5kQWxsX2xhYmVsPSBFeHBhbmQgJkFsbAotUHJvamVjdGlvbl9FeHBhbmRBbGxfdG9vbHRpcD0gRXhwYW5kcyBBbGwgQ29sbGFwc2VkIFJlZ2lvbnMKLVByb2plY3Rpb25fRXhwYW5kQWxsX2Rlc2NyaXB0aW9uPSBFeHBhbmRzIGFueSBjb2xsYXBzZWQgcmVnaW9ucyBpbiB0aGUgY3VycmVudCBlZGl0b3IKLVByb2plY3Rpb25fRXhwYW5kQWxsX2ltYWdlPQotUHJvamVjdGlvbl9Db2xsYXBzZUFsbF9sYWJlbD0gQ29sbGFwc2UgQSZsbAotUHJvamVjdGlvbl9Db2xsYXBzZUFsbF90b29sdGlwPSBDb2xsYXBzZXMgQWxsIEV4cGFuZGVkIFJlZ2lvbnMKLVByb2plY3Rpb25fQ29sbGFwc2VBbGxfZGVzY3JpcHRpb249IENvbGxhcHNlIGFueSBleHBhbmRlZCByZWdpb25zIGluIHRoZSBjdXJyZW50IGVkaXRvcgotUHJvamVjdGlvbl9Db2xsYXBzZUFsbF9pbWFnZT0KLQotIyMgVGhlc2UgYXJlIGNvcGllZCBmcm9tIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuRWRpdG9yTWVzc2FnZXMucHJvcGVydGllcwotIyMgVGhleSBhcmUgbmVlZGVkIHRlbXBvcmFyaWx5IHVudGlsIENNVkMgZGVmZWN0IDIwMzE1OCAvIEJ1Z3ppbGxhIGRlZmVjdCAyMDA1NCBpcyBmaXhlZAotRWRpdG9yX01hbmFnZUJvb2ttYXJrc190b29sdGlwPUFkZHMgYW5kIFJlbW92ZXMgQm9va21hcmtzCi1FZGl0b3JfTWFuYWdlQm9va21hcmtzX2ltYWdlPQotRWRpdG9yX01hbmFnZUJvb2ttYXJrc19kZXNjcmlwdGlvbj1BZGRzIGFuZCByZW1vdmVzIEJvb2ttYXJrcwotRWRpdG9yX01hbmFnZUJvb2ttYXJrc19hZGRfbGFiZWw9QWRkIEJvbyZrbWFyay4uLgotRWRpdG9yX01hbmFnZUJvb2ttYXJrc19yZW1vdmVfbGFiZWw9UmVtb3ZlIEJvbyZrbWFyawotRWRpdG9yX01hbmFnZUJvb2ttYXJrc19hZGRfZGlhbG9nX3RpdGxlPUFkZCBCb29rbWFyawotRWRpdG9yX01hbmFnZUJvb2ttYXJrc19hZGRfZGlhbG9nX21lc3NhZ2U9RW50ZXIgQm9va21hcmsgbmFtZQotRWRpdG9yX01hbmFnZUJvb2ttYXJrc19lcnJvcl9kaWFsb2dfdGl0bGU9TWFuYWdpbmcgQm9va21hcmtzCi1FZGl0b3JfTWFuYWdlQm9va21hcmtzX2Vycm9yX2RpYWxvZ19tZXNzYWdlPVByb2JsZW1zIG1hbmFnaW5nIGJvb2ttYXJrcwotCi1FZGl0b3JfTWFuYWdlVGFza3NfdG9vbHRpcD1BZGRzIGFuZCBSZW1vdmVzIFRhc2tzCi1FZGl0b3JfTWFuYWdlVGFza3NfaW1hZ2U9Ci1FZGl0b3JfTWFuYWdlVGFza3NfZGVzY3JpcHRpb249QWRkcyBhbmQgcmVtb3ZlcyBUYXNrcwotRWRpdG9yX01hbmFnZVRhc2tzX2FkZF9sYWJlbD1BZGQgJlRhc2suLi4KLUVkaXRvcl9NYW5hZ2VUYXNrc19yZW1vdmVfbGFiZWw9UmVtb3ZlICZUYXNrCi1FZGl0b3JfTWFuYWdlVGFza3NfYWRkX2RpYWxvZ190aXRsZT1BZGQgVGFzawotRWRpdG9yX01hbmFnZVRhc2tzX2FkZF9kaWFsb2dfbWVzc2FnZT1FbnRlciBUYXNrIGRlc2NyaXB0aW9uCi1FZGl0b3JfTWFuYWdlVGFza3NfZXJyb3JfZGlhbG9nX3RpdGxlPU1hbmFnaW5nIFRhc2tzCi1FZGl0b3JfTWFuYWdlVGFza3NfZXJyb3JfZGlhbG9nX21lc3NhZ2U9UHJvYmxlbXMgbWFuYWdpbmcgdGFza3MKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyBBYm92ZSBhcmUgcG9zc2libHkgdW51c2VkIHN0cmluZ3MgdGhhdCBtYXkgYmUgcmVtb3ZlZAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotU3R5bGVkVGV4dENvbG9yUGlja2VyXzA9UGljayBhIGNvbG9yCi1TeW50YXhDb2xvcmluZ19MaW5rPURlZmF1bHQgY29sb3JzIGFuZCBmb250IGNhbiBiZSBjb25maWd1cmVkIG9uIHRoZSA8YSBocmVmPVwib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLkdlbmVyYWxUZXh0RWRpdG9yXCI+VGV4dCBFZGl0b3JzPC9hPiBhbmQgb24gdGhlIDxhIGhyZWY9XCJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMuQ29sb3JzQW5kRm9udHNcIj5Db2xvcnMgYW5kIEZvbnRzPC9hPiBwcmVmZXJlbmNlIHBhZ2UuCi1TeW50YXhDb2xvcmluZ19EZXNjcmlwdGlvbj1DdXN0b21pemUgdGhlIHN5bnRheCBoaWdobGlnaHRpbmcgYnkgc2VsZWN0aW5nIHRoZSB0eXBlIG9mIHRleHQgd2hvc2Ugc3R5bGUgeW91IHdhbnQgdG8gY3VzdG9taXplIGZyb20gZWl0aGVyIHRoZSBsaXN0IG9yIHRoZSBleGFtcGxlIHRleHQgYXJlYS4KLQotR290b01hdGNoaW5nQnJhY2tldF9sYWJlbD0gTWF0Y2hpbmcgJkJyYWNrZXQKLUdvdG9NYXRjaGluZ0JyYWNrZXRfdG9vbHRpcD1HbyB0byBNYXRjaGluZyBCcmFja2V0Ci1Hb3RvTWF0Y2hpbmdCcmFja2V0X2Rlc2NyaXB0aW9uPUdvIHRvIE1hdGNoaW5nIEJyYWNrZXQKLUdvdG9NYXRjaGluZ0JyYWNrZXRfZXJyb3JfaW52YWxpZFNlbGVjdGlvbj1ObyBicmFja2V0IHNlbGVjdGVkCi1Hb3RvTWF0Y2hpbmdCcmFja2V0X2Vycm9yX25vTWF0Y2hpbmdCcmFja2V0PU5vIG1hdGNoaW5nIGJyYWNrZXQgZm91bmQKLUdvdG9NYXRjaGluZ0JyYWNrZXRfZXJyb3JfYnJhY2tldE91dHNpZGVTZWxlY3RlZEVsZW1lbnQ9TWF0Y2hpbmcgYnJhY2tldCBpcyBvdXRzaWRlIHRoZSBzZWxlY3RlZCBlbGVtZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU2hvd1ZpZXdBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TaG93Vmlld0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTNhYTYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TaG93Vmlld0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLS8qKgotICogU3VyZmFjZXMgYSBWaWV3LgotICogCi0gKiBAYXV0aG9yIE5pdGluIERhaHlhYmhhaQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2hvd1ZpZXdBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgU2hvd1ZpZXdBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgU2hvd1ZpZXdBY3Rpb24oU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKi8KLQlwdWJsaWMgU2hvd1ZpZXdBY3Rpb24oU3RyaW5nIHRleHQsIEltYWdlRGVzY3JpcHRvciBpbWFnZSkgewotCQlzdXBlcih0ZXh0LCBpbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgU2hvd1ZpZXdBY3Rpb24oU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotCQlzdXBlcih0ZXh0LCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Vmlld0lEKCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXN1cGVyLnJ1bigpOwotCQlzaG93VmlldygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW5XaXRoRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLnJ1bldpdGhFdmVudChldmVudCk7Ci0JCXNob3dWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBzaG93VmlldygpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXBhZ2Uuc2hvd1ZpZXcoZ2V0Vmlld0lEKCkpOwotCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcih3aW5kb3cuZ2V0U2hlbGwoKSwgU1NFVUlNZXNzYWdlcy5TaG93Vmlld19lcnJvclRpdGxlLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJZS5nZXRNZXNzYWdlKCksIGUuZ2V0U3RhdHVzKCkpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0b3JhZ2VNb2RlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RvcmFnZU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBmYzBjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RvcmFnZU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdG9yYWdlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LkZpbGVEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5TdG9yYWdlRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkRvY3VtZW50UHJvdmlkZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSUVsZW1lbnRTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZFJlYWRlckNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZWJ1Zy5CcmVha3BvaW50UnVsZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuRWRpdG9yTW9kZWxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLkJyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQuSUV4dGVuZGVkU3RvcmFnZUVkaXRvcklucHV0OwotCi0vKioKLSAqIEEgU3RvcmFnZURvY3VtZW50UHJvdmlkZXIgdGhhdCBpcyBJU3RydWN0dXJlZE1vZGVsIGF3YXJlCi0gKi8KLXB1YmxpYyBjbGFzcyBTdG9yYWdlTW9kZWxQcm92aWRlciBleHRlbmRzIFN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyIGltcGxlbWVudHMgSU1vZGVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBjbGFzcyBJbnRlcm5hbEVsZW1lbnRTdGF0ZUxpc3RlbmVyIGltcGxlbWVudHMgSUVsZW1lbnRTdGF0ZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgZWxlbWVudENvbnRlbnRBYm91dFRvQmVSZXBsYWNlZChPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGRlYnVnRWxlbWVudFN0YXRlbGlzdGVuZXIpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBlbGVtZW50Q29udGVudEFib3V0VG9CZVJlcGxhY2VkOiAiICsgKChJRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIHdlIGp1c3QgZm9yd2FyZCB0aGUgZXZlbnQKLQkJCVN0b3JhZ2VNb2RlbFByb3ZpZGVyLnRoaXMuZmlyZUVsZW1lbnRDb250ZW50QWJvdXRUb0JlUmVwbGFjZWQoZWxlbWVudCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlbGVtZW50Q29udGVudFJlcGxhY2VkKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZGVidWdFbGVtZW50U3RhdGVsaXN0ZW5lcikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IGVsZW1lbnRDb250ZW50UmVwbGFjZWQ6ICIgKyAoKElFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlTdG9yYWdlSW5mbyBpbmZvID0gKFN0b3JhZ2VJbmZvKSBnZXRFbGVtZW50SW5mbyhlbGVtZW50KTsKLQotCQkJLyoqCi0JCQkgKiBGb3JjZSBhIHJlbG9hZCBvZiB0aGUgbWFya2VycyBpbnRvIGFubm90YXRpb25zIHNpbmNlIHRoZWlyCi0JCQkgKiBwcmV2aW91cyBQb3NpdGlvbnMgaGF2ZSBiZWVuIGRlbGV0ZWQuIERpc2Nvbm5lY3RpbmcgYW5kCi0JCQkgKiByZWNvbm5lY3RpbmcgZm9yY2VzIGEgY2FsbCB0byB0aGUgcHJpdmF0ZSBjYXRjaHVwV2l0aE1hcmtlcnMKLQkJCSAqIG1ldGhvZC4KLQkJCSAqLwotCQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLmZNb2RlbCAhPSBudWxsKSB7Ci0JCQkJaW5mby5mTW9kZWwuZGlzY29ubmVjdChpbmZvLmZEb2N1bWVudCk7Ci0JCQl9Ci0KLQkJCVJlYWRlciByZWFkZXIgPSBudWxsOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBpbm5lcmRvY3VtZW50ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJLy8gdXBkYXRlIGRvY3VtZW50IGZyb20gaW5wdXQncyBjb250ZW50cwotCQkJCUNvZGVkUmVhZGVyQ3JlYXRvciBjb2RlZFJlYWRlckNyZWF0b3IgPSBuZXcgQ29kZWRSZWFkZXJDcmVhdG9yKGNhbGN1bGF0ZUlEKChJU3RvcmFnZUVkaXRvcklucHV0KSBlbGVtZW50KSwgVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oKChJU3RvcmFnZUVkaXRvcklucHV0KSBlbGVtZW50KS5nZXRTdG9yYWdlKCkuZ2V0Q29udGVudHMoKSkpOwotCQkJCXJlYWRlciA9IGNvZGVkUmVhZGVyQ3JlYXRvci5nZXRDb2RlZFJlYWRlcigpOwotCi0JCQkJaW5uZXJkb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBpbmZvLmZEb2N1bWVudDsKLQotCQkJCWludCBvcmlnaW5hbExlbmd0aFRvUmVwbGFjZSA9IGlubmVyZG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0KLQkJCQlTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWludCBidWZmZXJTaXplID0gMjA0ODsKLQkJCQljaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbYnVmZmVyU2l6ZV07Ci0JCQkJaW50IG5SZWFkID0gMDsKLQkJCQlib29sZWFuIGVvZiA9IGZhbHNlOwotCQkJCXdoaWxlICghZW9mKSB7Ci0JCQkJCW5SZWFkID0gcmVhZGVyLnJlYWQoYnVmZmVyLCAwLCBidWZmZXJTaXplKTsKLQkJCQkJaWYgKG5SZWFkID09IC0xKSB7Ci0JCQkJCQllb2YgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChidWZmZXIsIDAsIG5SZWFkKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpbm5lcmRvY3VtZW50LnJlcGxhY2VUZXh0KHRoaXMsIDAsIG9yaWdpbmFsTGVuZ3RoVG9SZXBsYWNlLCBzdHJpbmdCdWZmZXIudG9TdHJpbmcoKSwgdHJ1ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJcmVhZGVyLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkvLyB3b3VsZCBiZSBoaWdobHkgdW51c3VhbAotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGZvcndhcmQgdGhlIGV2ZW50Ci0JCQlpZiAoaW5mby5mQ2FuQmVTYXZlZCkgewotCQkJCWluZm8uZkNhbkJlU2F2ZWQgPSBmYWxzZTsKLQkJCQlhZGRVbmNoYW5nZWRFbGVtZW50TGlzdGVuZXJzKGVsZW1lbnQsIGluZm8pOwotCQkJfQotCQkJZmlyZUVsZW1lbnRDb250ZW50UmVwbGFjZWQoZWxlbWVudCk7Ci0JCQlmaXJlRWxlbWVudERpcnR5U3RhdGVDaGFuZ2VkKGVsZW1lbnQsIGZhbHNlKTsKLQotCQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLmZNb2RlbCAhPSBudWxsKSB7Ci0JCQkJaW5mby5mTW9kZWwuY29ubmVjdChpbmZvLmZEb2N1bWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlbGVtZW50RGVsZXRlZChPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGRlYnVnRWxlbWVudFN0YXRlbGlzdGVuZXIpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBlbGVtZW50RGVsZXRlZDogIiArICgoSUVkaXRvcklucHV0KSBlbGVtZW50KS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkvLyB3ZSBqdXN0IGZvcndhcmQgdGhlIGV2ZW50Ci0JCQlTdG9yYWdlTW9kZWxQcm92aWRlci50aGlzLmZpcmVFbGVtZW50RGVsZXRlZChlbGVtZW50KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVsZW1lbnREaXJ0eVN0YXRlQ2hhbmdlZChPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBpc0RpcnR5KSB7Ci0JCQlpZiAoZGVidWdFbGVtZW50U3RhdGVsaXN0ZW5lcikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IGVsZW1lbnREaXJ0eVN0YXRlQ2hhbmdlZDogIiArICgoSUVkaXRvcklucHV0KSBlbGVtZW50KS5nZXROYW1lKCkgKyAiICgiICsgaXNEaXJ0eSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQkvLyB3ZSBqdXN0IGZvcndhcmQgdGhlIGV2ZW50Ci0JCQlTdG9yYWdlTW9kZWxQcm92aWRlci50aGlzLmZpcmVFbGVtZW50RGlydHlTdGF0ZUNoYW5nZWQoZWxlbWVudCwgaXNEaXJ0eSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlbGVtZW50TW92ZWQoT2JqZWN0IG9yaWdpbmFsRWxlbWVudCwgT2JqZWN0IG1vdmVkRWxlbWVudCkgewotCQkJaWYgKGRlYnVnRWxlbWVudFN0YXRlbGlzdGVuZXIpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBlbGVtZW50TW92ZWQgIiArIG9yaWdpbmFsRWxlbWVudCArICIgLS0+ICIgKyBtb3ZlZEVsZW1lbnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCS8vIHdlIGp1c3QgZm9yd2FyZCB0aGUgZXZlbnQKLQkJCVN0b3JhZ2VNb2RlbFByb3ZpZGVyLnRoaXMuZmlyZUVsZW1lbnRNb3ZlZChvcmlnaW5hbEVsZW1lbnQsIG1vdmVkRWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb2xsZWN0aW9uIG9mIGluZm8gdGhhdCBnb2VzIHdpdGggYSBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIE1vZGVsSW5mbyB7Ci0JCXB1YmxpYyBJRWRpdG9ySW5wdXQgZkVsZW1lbnQ7Ci0JCXB1YmxpYyBib29sZWFuIGZTaG91bGRSZWxlYXNlT25JbmZvRGlzcG9zZTsKLQkJcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZlN0cnVjdHVyZWRNb2RlbDsKLQotCQlwdWJsaWMgTW9kZWxJbmZvKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBJRWRpdG9ySW5wdXQgZWxlbWVudCwgYm9vbGVhbiBzZWxmQ3JlYXRlZCkgewotCQkJZkVsZW1lbnQgPSBlbGVtZW50OwotCQkJZlN0cnVjdHVyZWRNb2RlbCA9IHN0cnVjdHVyZWRNb2RlbDsKLQkJCWZTaG91bGRSZWxlYXNlT25JbmZvRGlzcG9zZSA9IHNlbGZDcmVhdGVkOwotCQl9Ci0JfQotCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdFbGVtZW50U3RhdGVsaXN0ZW5lciA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL3N0b3JhZ2Vtb2RlbHByb3ZpZGVyL2VsZW1lbnRzdGF0ZWxpc3RlbmVyIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z09wZXJhdGlvbnMgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zdG9yYWdlbW9kZWxwcm92aWRlci9vcGVyYXRpb25zIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgc3RhdGljIFN0b3JhZ2VNb2RlbFByb3ZpZGVyIGZJbnN0YW5jZSA9IG51bGw7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBTdG9yYWdlTW9kZWxQcm92aWRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKQotCQkJZkluc3RhbmNlID0gbmV3IFN0b3JhZ2VNb2RlbFByb3ZpZGVyKCk7Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBJRWxlbWVudFN0YXRlTGlzdGVuZXIgZkludGVybmFsTGlzdGVuZXI7Ci0JLyoqIElTdHJ1Y3R1cmVkTW9kZWwgaW5mb3JtYXRpb24gb2YgYWxsIGNvbm5lY3RlZCBlbGVtZW50cyAqLwotCXByaXZhdGUgTWFwIGZNb2RlbEluZm9NYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgYm9vbGVhbiBmUmV1c2VNb2RlbERvY3VtZW50ID0gdHJ1ZTsKLQotCXByaXZhdGUgU3RvcmFnZU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZJbnRlcm5hbExpc3RlbmVyID0gbmV3IEludGVybmFsRWxlbWVudFN0YXRlTGlzdGVuZXIoKTsKLQl9Ci0KLQlTdHJpbmcgY2FsY3VsYXRlQmFzZUxvY2F0aW9uKElTdG9yYWdlRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJU3RyaW5nIGxvY2F0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlTdG9yYWdlIHN0b3JhZ2UgPSBpbnB1dC5nZXRTdG9yYWdlKCk7Ci0JCQlpZiAoc3RvcmFnZSAhPSBudWxsKSB7Ci0JCQkJSVBhdGggc3RvcmFnZVBhdGggPSBzdG9yYWdlLmdldEZ1bGxQYXRoKCk7Ci0JCQkJU3RyaW5nIG5hbWUgPSBzdG9yYWdlLmdldE5hbWUoKTsKLQkJCQlpZiAoc3RvcmFnZVBhdGggIT0gbnVsbCkgewotCQkJCQkvLyBJZiB0aGV5IGFyZSBkaWZmZXJlbnQsIHRoZSBJU3RvcmFnZSBjb250cmFjdCBpcyBub3QKLQkJCQkJLy8gYmVpbmcgaG9ub3JlZAotCQkJCQkvLyAoaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczMDk4KS4KLQkJCQkJLy8gRmF2b3IgdGhlIG5hbWUuCi0JCQkJCWlmICghc3RvcmFnZVBhdGgubGFzdFNlZ21lbnQoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJCUlQYXRoIHdvcmtpbmdQYXRoID0gc3RvcmFnZVBhdGguYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLQkJCQkJCWxvY2F0aW9uID0gd29ya2luZ1BhdGguYXBwZW5kKG5hbWUpLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlsb2NhdGlvbiA9IHN0b3JhZ2VQYXRoLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGxvY2F0aW9uID09IG51bGwpCi0JCQkJCWxvY2F0aW9uID0gbmFtZTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKGxvY2F0aW9uID09IG51bGwpCi0JCQkJbG9jYXRpb24gPSBpbnB1dC5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCVN0cmluZyBjYWxjdWxhdGVJRChJU3RvcmFnZUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCS8qKgotCQkgKiBUeXBpY2FsbHkgQ1ZTIHdpbGwgcmV0dXJuIGEgcGF0aCBvZiAiZmlsZW5hbWUuZXh0IiBhbmQgdGhlIGlucHV0J3MKLQkJICogbmFtZSB3aWxsIGJlICJmaWxlbmFtZS5leHQgdmVyc2lvbiIuIFRoZSBwYXRoIG11c3QgYmUgdXNlZCB0byBsb2FkCi0JCSAqIHRoZSBtb2RlbCBzbyB0aGF0IHRoZSBzdWZmaXggd2lsbCBiZSBhdmFpbGFibGUgdG8gY29tcHV0ZSB0aGUKLQkJICogY29udGVudFR5cGUgcHJvcGVybHkuIFRoZSBlZGl0b3IgaW5wdXQgbmFtZSBjYW4gdGhlbiBiZSBzZXQgYXMgdGhlCi0JCSAqIGJhc2UgbG9jYXRpb24gZm9yIGRpc3BsYXkgb24gdGhlIGVkaXRvciB0aXRsZSBiYXIuCi0JCSAqIAotCQkgKi8KLQkJU3RyaW5nIHBhdGggPSBudWxsOwotCQl0cnkgewotCQkJSVN0b3JhZ2Ugc3RvcmFnZSA9IGlucHV0LmdldFN0b3JhZ2UoKTsKLQkJCWlmIChzdG9yYWdlICE9IG51bGwpIHsKLQkJCQlJUGF0aCBzdG9yYWdlUGF0aCA9IHN0b3JhZ2UuZ2V0RnVsbFBhdGgoKTsKLQkJCQlTdHJpbmcgbmFtZSA9IHN0b3JhZ2UuZ2V0TmFtZSgpOwotCQkJCWlmIChzdG9yYWdlUGF0aCAhPSBudWxsKSB7Ci0JCQkJCS8vIElmIHRoZXkgYXJlIGRpZmZlcmVudCwgdGhlIElTdG9yYWdlIGNvbnRyYWN0IGlzIG5vdAotCQkJCQkvLyBiZWluZyBob25vcmVkCi0JCQkJCS8vIChodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzMwOTgpLgotCQkJCQkvLyBGYXZvciB0aGUgbmFtZS4KLQkJCQkJaWYgKCFzdG9yYWdlUGF0aC5sYXN0U2VnbWVudCgpLmVxdWFscyhuYW1lKSkgewotCQkJCQkJSVBhdGggd29ya2luZ1BhdGggPSBzdG9yYWdlUGF0aC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotCQkJCQkJcGF0aCA9IHdvcmtpbmdQYXRoLmFwcGVuZChuYW1lKS50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcGF0aCA9IHN0b3JhZ2VQYXRoLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCQkJcGF0aCA9IG5hbWU7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChwYXRoID09IG51bGwpCi0JCQkJcGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLyoKLQkJICogUHJlcGVuZCB0aGUgaGFzaCB0byB0aGUgcGF0aCB2YWx1ZSBzbyB0aGF0IHdlIGhhdmUgYSAxOjE6MSBtYXRjaAotCQkgKiBiZXR3ZWVuIGVkaXRvciBpbnB1dHMsIGVsZW1lbnQgaW5mbywgYW5kIG1vZGVscy4gVGhlIGVkaXRvciBtYW5hZ2VyCi0JCSAqIHNob3VsZCBoZWxwIHByZXZlbnQgbmVlZGxlc3NseSBkdXBsaWNhdGVkIG1vZGVscyBhcyBsb25nIGFzIHR3bwotCQkgKiBlZGl0b3IgaW5wdXRzIGZyb20gdGhlIHNhbWUgc3RvcmFnZSBpbmRpY2F0ZSB0aGV5J3JlIGVxdWFscygpLgotCQkgKi8KLQkJcGF0aCA9IGlucHV0Lmhhc2hDb2RlKCkgKyAiIyIgKyBwYXRoOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXRoOwotCX0KLQotCS8vIHB1YmxpYyBib29sZWFuIGNhblNhdmVEb2N1bWVudChPYmplY3QgZWxlbWVudCkgewotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0KLQlwcm90ZWN0ZWQgSUFubm90YXRpb25Nb2RlbCBjcmVhdGVBbm5vdGF0aW9uTW9kZWwoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUFubm90YXRpb25Nb2RlbCBtb2RlbCA9IG51bGw7Ci0JCWlmIChkZWJ1Z09wZXJhdGlvbnMpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBjcmVhdGVBbm5vdGF0aW9uTW9kZWwgZm9yICIgKyAoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldFN0b3JhZ2UoKS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IGNyZWF0ZUFubm90YXRpb25Nb2RlbCBmb3IgIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQlJU3RvcmFnZUVkaXRvcklucHV0IGlucHV0ID0gKElTdG9yYWdlRWRpdG9ySW5wdXQpIGVsZW1lbnQ7Ci0JCQlTdHJpbmcgY29udGVudFR5cGUgPSAoZ2V0TW9kZWwoaW5wdXQpICE9IG51bGwgPyBnZXRNb2RlbChpbnB1dCkuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkgOiBudWxsKTsKLQkJCVN0cmluZyBleHQgPSBCcmVha3BvaW50UnVsZXJBY3Rpb24uZ2V0RmlsZUV4dGVuc2lvbigoSUVkaXRvcklucHV0KSBlbGVtZW50KTsKLQkJCUlSZXNvdXJjZSByZXMgPSBCcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2UoaW5wdXQsIGNvbnRlbnRUeXBlLCBleHQpOwotCQkJU3RyaW5nIGlkID0gaW5wdXQuZ2V0TmFtZSgpOwotCQkJaWYgKGlucHV0LmdldFN0b3JhZ2UoKSAhPSBudWxsICYmIGlucHV0LmdldFN0b3JhZ2UoKS5nZXRGdWxsUGF0aCgpICE9IG51bGwpIHsKLQkJCQlpZCA9IGlucHV0LmdldFN0b3JhZ2UoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQkvLyB3ZSBjYW4gb25seSBjcmVhdGUgYSByZXNvdXJjZSBtYXJrZXIgYW5ub3RhdGlvbm1vZGVsIG9mZiBvZiBhCi0JCQkvLyB2YWxpZCByZXNvdXJjZQotCQkJaWYgKHJlcyAhPSBudWxsKQotCQkJCW1vZGVsID0gbmV3IFN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbChyZXMsIGlkKTsKLQkJCWVsc2UKLQkJCQltb2RlbCA9IG5ldyBBbm5vdGF0aW9uTW9kZWwoKTsKLQkJfQotCQlpZiAobW9kZWwgPT0gbnVsbCkgewotCQkJbW9kZWwgPSBzdXBlci5jcmVhdGVBbm5vdGF0aW9uTW9kZWwoZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXByb3RlY3RlZCBJRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGRlYnVnT3BlcmF0aW9ucykgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0KQotCQkJCXRyeSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IGNyZWF0ZURvY3VtZW50IGZvciAiICsgKChJU3RvcmFnZUVkaXRvcklucHV0KSBlbGVtZW50KS5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBjcmVhdGVEb2N1bWVudCBmb3IgIiArIGVsZW1lbnQgKyAiKGV4Y2VwdGlvbiBjYXVnaHQpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCWVsc2UgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IGNyZWF0ZURvY3VtZW50IGZvciAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCS8vIFRoZSBmb2xsb3dpbmcgaXMgbGFyZ2VseSBjb3BpZWQgZnJvbSBGaWxlTW9kZWxQcm92aWRlcgotCi0JCUlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUVkaXRvcklucHV0KSB7Ci0JCQkvLyBjcmVhdGUgYSBuZXcgSURvY3VtZW50IGZvciB0aGUgZWxlbWVudDsgc2hvdWxkIGFsd2F5cyByZWZsZWN0Ci0JCQkvLyB0aGUgY29udGVudHMgb2YgdGhlIHJlc291cmNlCi0JCQlNb2RlbEluZm8gaW5mbyA9IGdldE1vZGVsSW5mb0ZvcigoSUVkaXRvcklucHV0KSBlbGVtZW50KTsKLQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJubyBjb3JyZXNwb25kaW5nIG1vZGVsIGluZm8gZm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IGluZm8uZlN0cnVjdHVyZWRNb2RlbDsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJaWYgKCFmUmV1c2VNb2RlbERvY3VtZW50ICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQkJCVJlYWRlciByZWFkZXIgPSBudWxsOwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IGlubmVyZG9jdW1lbnQgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJLy8gdXBkYXRlIGRvY3VtZW50IGZyb20gaW5wdXQncyBjb250ZW50cwotCi0JCQkJCQlDb2RlZFJlYWRlckNyZWF0b3IgY29kZWRSZWFkZXJDcmVhdG9yID0gbmV3IENvZGVkUmVhZGVyQ3JlYXRvcihjYWxjdWxhdGVJRCgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgZWxlbWVudCksIFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKCgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0U3RvcmFnZSgpLmdldENvbnRlbnRzKCkpKTsKLQkJCQkJCXJlYWRlciA9IGNvZGVkUmVhZGVyQ3JlYXRvci5nZXRDb2RlZFJlYWRlcigpOwotCi0JCQkJCQlpbm5lcmRvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJCQkJCWludCBvcmlnaW5hbExlbmd0aFRvUmVwbGFjZSA9IGlubmVyZG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0KLQkJCQkJCS8qCi0JCQkJCQkgKiBUT0RPX2Z1dHVyZTogd2UgY291bGQgaW1wbGVtZW50IHdpdGggc2VxdWVudGlhbAotCQkJCQkJICogcmV3cml0ZSwgaWYgd2UgZG9uJ3QgcGlja3VwIGF1dG9tYXRpY2FsbHkgZnJvbQotCQkJCQkJICogRmlsZUJ1ZmZlciBzdXBwb3J0LCBzbyBub3Qgc28gbXVjaCBoYXMgdG8gYmUgcHVsbGVkCi0JCQkJCQkgKiBpbnRvIG1lbW9yeSAoYXMgYW4gZXh0cmEgYmlnIHN0cmluZyksIGJ1dCB3ZSBuZWVkCi0JCQkJCQkgKiB0byBjYXJyeSB0aGF0IEFQSSB0aHJvdWdoIHNvIHRoYXQgU3RydWN0dXJlZE1vZGVsCi0JCQkJCQkgKiBpcyBub3Qgbm90aWZpZWQgdW50aWwgZG9uZS4KLQkJCQkJCSAqLwotCi0JCQkJCQkvLyBpbm5lcmRvY3VtZW50LnN0YXJ0U2VxdWVudGlhbFJld3JpdGUodHJ1ZSk7Ci0JCQkJCQkvLyBpbm5lcmRvY3VtZW50LnJlcGxhY2VUZXh0KHRoaXMsIDAsCi0JCQkJCQkvLyBpbm5lcmRvY3VtZW50LmdldExlbmd0aCgpLCAiIik7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJaW50IGJ1ZmZlclNpemUgPSAyMDQ4OwotCQkJCQkJY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyW2J1ZmZlclNpemVdOwotCQkJCQkJaW50IG5SZWFkID0gMDsKLQkJCQkJCWJvb2xlYW4gZW9mID0gZmFsc2U7Ci0JCQkJCQl3aGlsZSAoIWVvZikgewotCQkJCQkJCW5SZWFkID0gcmVhZGVyLnJlYWQoYnVmZmVyLCAwLCBidWZmZXJTaXplKTsKLQkJCQkJCQlpZiAoblJlYWQgPT0gLTEpIHsKLQkJCQkJCQkJZW9mID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoYnVmZmVyLCAwLCBuUmVhZCk7Ci0JCQkJCQkJCS8vIGlubmVyZG9jdW1lbnQucmVwbGFjZVRleHQodGhpcywKLQkJCQkJCQkJLy8gaW5uZXJkb2N1bWVudC5nZXRMZW5ndGgoKSwgMCwgbmV3Ci0JCQkJCQkJCS8vIFN0cmluZyhidWZmZXIsIDAsIG5SZWFkKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLy8gaWdub3JlIHJlYWQtb25seSBzZXR0aW5ncyBpZiByZXZlcnRpbmcgd2hvbGUKLQkJCQkJCS8vIGRvY3VtZW50Ci0JCQkJCQlpbm5lcmRvY3VtZW50LnJlcGxhY2VUZXh0KHRoaXMsIDAsIG9yaWdpbmFsTGVuZ3RoVG9SZXBsYWNlLCBzdHJpbmdCdWZmZXIudG9TdHJpbmcoKSwgdHJ1ZSk7Ci0JCQkJCQltb2RlbC5zZXREaXJ0eVN0YXRlKGZhbHNlKTsKLQotCQkJCQl9Ci0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQlpZiAocmVhZGVyICE9IG51bGwpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlyZWFkZXIuY2xvc2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJCS8vIHdvdWxkIGJlIGhpZ2hseSB1bnVzdWFsCi0JCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTEpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIGlmIChpbm5lcmRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJCS8vIGlubmVyZG9jdW1lbnQuc3RvcFNlcXVlbnRpYWxSZXdyaXRlKCk7Ci0JCQkJCQkvLyB9Ci0JCQkJCX0KLQotCQkJCX0KLQkJCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJCQlkb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQWxzbyBjcmVhdGUgTW9kZWxJbmZvIC0gZXh0cmEgcmVzb3VyY2Ugc3luY2hyb25pemF0aW9uIGNsYXNzZXMgc2hvdWxkCi0JICogYmUgc3RvcmVkIHdpdGhpbiB0aGUgTW9kZWxJbmZvCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnRJbmZvIGNyZWF0ZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBNb2RlbEluZm8gaWYgbmVjZXNzYXJ5Ci0JCWlmIChkZWJ1Z09wZXJhdGlvbnMpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkKLQkJCQl0cnkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBjcmVhdGVFbGVtZW50SW5mbyBmb3IgIiArICgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0U3RvcmFnZSgpLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogY3JlYXRlRWxlbWVudEluZm8gZm9yICIgKyBlbGVtZW50ICsgIihleGNlcHRpb24gY2F1Z2h0KSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQllbHNlCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJzdG9yYWdlTW9kZWxQcm92aWRlcjogY3JlYXRlRWxlbWVudEluZm8gZm9yICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKGdldE1vZGVsSW5mb0ZvcigoSUVkaXRvcklucHV0KSBlbGVtZW50KSA9PSBudWxsKSB7Ci0JCQljcmVhdGVNb2RlbEluZm8oKElFZGl0b3JJbnB1dCkgZWxlbWVudCk7Ci0JCX0KLQotCQlFbGVtZW50SW5mbyBpbmZvID0gc3VwZXIuY3JlYXRlRWxlbWVudEluZm8oZWxlbWVudCk7Ci0JCXJldHVybiBpbmZvOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZU1vZGVsSW5mbyhJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJaWYgKGdldE1vZGVsSW5mb0ZvcihpbnB1dCkgPT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBzZWxmQ3JlYXRlTW9kZWwoaW5wdXQpOwotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJY3JlYXRlTW9kZWxJbmZvKGlucHV0LCBzdHJ1Y3R1cmVkTW9kZWwsIHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVG8gYmUgdXNlZCB3aGVuIG1vZGVsIGlzIHByb3ZpZGVkIHRvIHVzLCBlbnN1cmVzIHRoYXQgd2hlbiBzZXRJbnB1dCBpcwotCSAqIHVzZWQgb24gdGhpcyBpbnB1dCwgdGhlIGdpdmVuIG1vZGVsIHdpbGwgYmUgdXNlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVNb2RlbEluZm8oSUVkaXRvcklucHV0IGlucHV0LCBJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgYm9vbGVhbiByZWxlYXNlTW9kZWxPbkRpc2Nvbm5lY3QpIHsKLQkJLy8gd2UgaGF2ZSB0byBtYWtlIHN1cmUgZmFjdG9yaWVzIGFyZSBhZGRlZCwgd2hldGhlciB3ZSBjcmVhdGVkIG9yCi0JCS8vIG5vdC4KLQkJaWYgKGdldE1vZGVsSW5mb0ZvcihpbnB1dCkgIT0gbnVsbCB8fCBnZXRNb2RlbEluZm9Gb3Ioc3RydWN0dXJlZE1vZGVsKSAhPSBudWxsKSB7Ci0JCQlpZiAoZGVidWdPcGVyYXRpb25zKSB7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCi0JCQkJCXRyeSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBEVVBMSUNBVEUgY3JlYXRlTW9kZWxJbmZvIGZvciAiICsgKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U3RvcmFnZSgpLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogRFVQTElDQVRFIGNyZWF0ZU1vZGVsSW5mbyBmb3IgIiArIGlucHV0ICsgIihleGNlcHRpb24gY2F1Z2h0KSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJzdG9yYWdlTW9kZWxQcm92aWRlcjogRFVQTElDQVRFIGNyZWF0ZU1vZGVsSW5mbyBmb3IgIiArIGlucHV0KTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChkZWJ1Z09wZXJhdGlvbnMpIHsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQpIHsKLQkJCQl0cnkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBjcmVhdGVNb2RlbEluZm8gZm9yICIgKyAoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBjcmVhdGVNb2RlbEluZm8gZm9yICIgKyBpbnB1dCArICIoZXhjZXB0aW9uIGNhdWdodCkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogY3JlYXRlTW9kZWxJbmZvIGZvciAiICsgaW5wdXQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCi0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElFeHRlbmRlZFN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJKChJRXh0ZW5kZWRTdG9yYWdlRWRpdG9ySW5wdXQpIGlucHV0KS5hZGRFbGVtZW50U3RhdGVMaXN0ZW5lcihmSW50ZXJuYWxMaXN0ZW5lcik7Ci0JCX0KLQotCQlFZGl0b3JNb2RlbFV0aWwuYWRkRmFjdG9yaWVzVG8oc3RydWN0dXJlZE1vZGVsKTsKLQotCQlNb2RlbEluZm8gbW9kZWxJbmZvID0gbmV3IE1vZGVsSW5mbyhzdHJ1Y3R1cmVkTW9kZWwsIGlucHV0LCByZWxlYXNlTW9kZWxPbkRpc2Nvbm5lY3QpOwotCQlmTW9kZWxJbmZvTWFwLnB1dChpbnB1dCwgbW9kZWxJbmZvKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlRWxlbWVudEluZm8oT2JqZWN0IGVsZW1lbnQsIEVsZW1lbnRJbmZvIGluZm8pIHsKLQkJaWYgKGRlYnVnT3BlcmF0aW9ucykgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogZGlzcG9zZUVsZW1lbnRJbmZvIGZvciAiICsgKChJU3RvcmFnZUVkaXRvcklucHV0KSBlbGVtZW50KS5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBkaXNwb3NlRWxlbWVudEluZm8gZm9yICIgKyBlbGVtZW50ICsgIihleGNlcHRpb24gY2F1Z2h0KSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBkaXNwb3NlRWxlbWVudEluZm8gZm9yICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRWRpdG9ySW5wdXQpIHsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IChJRWRpdG9ySW5wdXQpIGVsZW1lbnQ7Ci0JCQlNb2RlbEluZm8gbW9kZWxJbmZvID0gZ2V0TW9kZWxJbmZvRm9yKGlucHV0KTsKLQkJCWRpc3Bvc2VNb2RlbEluZm8obW9kZWxJbmZvKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlRWxlbWVudEluZm8oZWxlbWVudCwgaW5mbyk7Ci0JfQotCi0JLyoqCi0JICogZGlzY29ubmVjdCBmcm9tIHRoaXMgbW9kZWwgaW5mbwotCSAqIAotCSAqIEBwYXJhbSBpbmZvCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZU1vZGVsSW5mbyhNb2RlbEluZm8gaW5mbykgewotCQlpZiAoZGVidWdPcGVyYXRpb25zKSB7Ci0JCQlpZiAoaW5mby5mRWxlbWVudCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQpIHsKLQkJCQl0cnkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBkaXNwb3NlTW9kZWxJbmZvIGZvciAiICsgKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbmZvLmZFbGVtZW50KS5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBkaXNwb3NlTW9kZWxJbmZvIGZvciAiICsgaW5mby5mRWxlbWVudCArICIoZXhjZXB0aW9uIGNhdWdodCkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogZGlzcG9zZU1vZGVsSW5mbyBmb3IgIiArIGluZm8uZkVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpZiAoaW5mby5mRWxlbWVudCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQpIHsKLQkJCWlmIChpbmZvLmZFbGVtZW50IGluc3RhbmNlb2YgSUV4dGVuZGVkU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQkJKChJRXh0ZW5kZWRTdG9yYWdlRWRpdG9ySW5wdXQpIGluZm8uZkVsZW1lbnQpLnJlbW92ZUVsZW1lbnRTdGF0ZUxpc3RlbmVyKGZJbnRlcm5hbExpc3RlbmVyKTsKLQkJCX0KLQkJCWlmIChpbmZvLmZTaG91bGRSZWxlYXNlT25JbmZvRGlzcG9zZSkgewotCQkJCWluZm8uZlN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCX0KLQkJfQotCQlmTW9kZWxJbmZvTWFwLnJlbW92ZShpbmZvLmZFbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3REb2N1bWVudFByb3ZpZGVyI2RvUmVzZXREb2N1bWVudChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9SZXNldERvY3VtZW50KE9iamVjdCBlbGVtZW50LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZlJldXNlTW9kZWxEb2N1bWVudCA9IGZhbHNlOwotCQlzdXBlci5kb1Jlc2V0RG9jdW1lbnQoZWxlbWVudCwgbW9uaXRvcik7Ci0JCWZSZXVzZU1vZGVsRG9jdW1lbnQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdERvY3VtZW50UHJvdmlkZXIjZG9TYXZlRG9jdW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVEb2N1bWVudChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIE9iamVjdCBlbGVtZW50LCBJRG9jdW1lbnQgZG9jdW1lbnQsIGJvb2xlYW4gb3ZlcndyaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlEb2N1bWVudFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQkJLy8gQlVHMTE5MjExIC0gdHJ5IHRvIHVzZSByZWdpc3RlcmVkIGRvY3VtZW50IHByb3ZpZGVyIGlmIHBvc3NpYmxlCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUVkaXRvcklucHV0KSB7Ci0JCQlwcm92aWRlciA9IERvY3VtZW50UHJvdmlkZXJSZWdpc3RyeS5nZXREZWZhdWx0KCkuZ2V0RG9jdW1lbnRQcm92aWRlcigoSUVkaXRvcklucHV0KSBlbGVtZW50KTsKLQkJfQotCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkKLQkJCXByb3ZpZGVyID0gbmV3IEZpbGVEb2N1bWVudFByb3ZpZGVyKCk7Ci0JCXByb3ZpZGVyLnNhdmVEb2N1bWVudChtb25pdG9yLCBlbGVtZW50LCBkb2N1bWVudCwgb3ZlcndyaXRlKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbChJRWRpdG9ySW5wdXQgZWxlbWVudCkgewotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCU1vZGVsSW5mbyBpbmZvID0gZ2V0TW9kZWxJbmZvRm9yKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBpbmZvLmZTdHJ1Y3R1cmVkTW9kZWw7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuSU1vZGVsUHJvdmlkZXIjZ2V0TW9kZWwoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElFZGl0b3JJbnB1dCkKLQkJCXJldHVybiBnZXRNb2RlbCgoSUVkaXRvcklucHV0KSBlbGVtZW50KTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBNb2RlbEluZm8gZ2V0TW9kZWxJbmZvRm9yKElFZGl0b3JJbnB1dCBlbGVtZW50KSB7Ci0JCU1vZGVsSW5mbyByZXN1bHQgPSAoTW9kZWxJbmZvKSBmTW9kZWxJbmZvTWFwLmdldChlbGVtZW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIE1vZGVsSW5mbyBnZXRNb2RlbEluZm9Gb3IoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJTW9kZWxJbmZvIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJTW9kZWxJbmZvW10gbW9kZWxJbmZvcyA9IChNb2RlbEluZm9bXSkgZk1vZGVsSW5mb01hcC52YWx1ZXMoKS50b0FycmF5KG5ldyBNb2RlbEluZm9bMF0pOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RlbEluZm9zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJTW9kZWxJbmZvIGluZm8gPSBtb2RlbEluZm9zW2ldOwotCQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwuZXF1YWxzKGluZm8uZlN0cnVjdHVyZWRNb2RlbCkpIHsKLQkJCQkJcmVzdWx0ID0gaW5mbzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGxvYWRNb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkTW9kZWwKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBsb2FkTW9kZWwoSVN0b3JhZ2VFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlyZXR1cm4gbG9hZE1vZGVsKGlucHV0LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGxvYWRNb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcGFyYW0gbG9nRXhjZXB0aW9ucwotCSAqIEByZXR1cm4gSVN0cnVjdHVyZWRNb2RlbAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGxvYWRNb2RlbChJU3RvcmFnZUVkaXRvcklucHV0IGlucHV0LCBib29sZWFuIGxvZ0V4Y2VwdGlvbnMpIHsKLQkJU3RyaW5nIGlkID0gY2FsY3VsYXRlSUQoaW5wdXQpOwotCQlpZiAoaWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb250ZW50cyA9IGlucHV0LmdldFN0b3JhZ2UoKS5nZXRDb250ZW50cygpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIG5vU3RvcmFnZUV4YykgewotCQkJaWYgKGxvZ0V4Y2VwdGlvbnMpCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihOTFMuYmluZChTU0VVSU1lc3NhZ2VzLl8zMmNvbmNhdF9FWENfLCBuZXcgT2JqZWN0W117aW5wdXQuZ2V0TmFtZSgpfSksIG5vU3RvcmFnZUV4Yyk7Ci0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGZpcnN0IHBhcmFtZXRlciBtdXN0IGJlIHVuaXF1ZQotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChpZCwgY29udGVudHMsIG51bGwpOwotCQkJbW9kZWwuc2V0QmFzZUxvY2F0aW9uKGNhbGN1bGF0ZUJhc2VMb2NhdGlvbihpbnB1dCkpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAobG9nRXhjZXB0aW9ucykKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuXzMyY29uY2F0X0VYQ18sIG5ldyBPYmplY3RbXXtpbnB1dH0pLCBlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gbm90aGluZwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbnB1dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgc2VsZkNyZWF0ZU1vZGVsKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlyZXR1cm4gbG9hZE1vZGVsKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyNzZmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQWJzdHJhY3REb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQ29uZmlndXJhYmxlTGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0TGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEFkYXB0ZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVwYWlyYWJsZURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5wcm9qZWN0aW9uLlByb2plY3Rpb25Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UZXh0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UZXh0Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGV4dENoYW5naW5nRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5JTG9ja2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5OZXdEb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuQXNzZXJ0OwotCi0KLS8qKgotICogQWRhcHRzIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZXZlbnRzIGFuZCBtZXRob2RzIHRvIFN0eWxlZFRleHRDb250ZW50IGV2ZW50cwotICogYW5kIG1ldGhvZHMKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRBZGFwdGVyLCBJRG9jdW1lbnRBZGFwdGVyRXh0ZW5zaW9uIHsKLQotCXByaXZhdGUgY2xhc3MgRG9jdW1lbnRDbG9uZSBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnQgewotCi0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgY2xvbmUgd2l0aCB0aGUgZ2l2ZW4gY29udGVudC4KLQkJICogCi0JCSAqIEBwYXJhbSBjb250ZW50Ci0JCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQKLQkJICogQHBhcmFtIGxpbmVEZWxpbWl0ZXJzCi0JCSAqICAgICAgICAgICAgdGhlIGxpbmUgZGVsaW1pdGVycwotCQkgKi8KLQkJcHVibGljIERvY3VtZW50Q2xvbmUoU3RyaW5nIGNvbnRlbnQsIFN0cmluZ1tdIGxpbmVEZWxpbWl0ZXJzKSB7Ci0JCQlzdXBlcigpOwotCQkJc2V0VGV4dFN0b3JlKG5ldyBTdHJpbmdUZXh0U3RvcmUoY29udGVudCkpOwotCQkJQ29uZmlndXJhYmxlTGluZVRyYWNrZXIgdHJhY2tlciA9IG5ldyBDb25maWd1cmFibGVMaW5lVHJhY2tlcihsaW5lRGVsaW1pdGVycyk7Ci0JCQlzZXRMaW5lVHJhY2tlcih0cmFja2VyKTsKLQkJCWdldFRyYWNrZXIoKS5zZXQoY29udGVudCk7Ci0JCQljb21wbGV0ZUluaXRpYWxpemF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvLyBBIHByZS1ub3RpZmljYXRpb24gbGlzdGVuZXIgZm9yIHRoZSB2aWV3ZXIncyBEb2N1bWVudAotCWNsYXNzIERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRMaXN0ZW5lciB7Ci0JCXByb3RlY3RlZCBib29sZWFuIGFsbFRleHRDaGFuZ2VkID0gZmFsc2U7Ci0KLQkJcHJvdGVjdGVkIERvY3VtZW50RXZlbnQgY3VycmVudEV2ZW50OwotCi0JCXN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpCi0JCQkJcmV0dXJuOwotCi0JCQlwZW5kaW5nRG9jdW1lbnRDaGFuZ2VkRXZlbnQgPSB0cnVlOwotCQkJYWxsVGV4dENoYW5nZWQgPSBldmVudC5nZXRPZmZzZXQoKSA8PSAwICYmIGV2ZW50LmdldExlbmd0aCgpID49IFN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIudGhpcy5nZXREb2N1bWVudCgpLmdldExlbmd0aCgpOwotCQkJY3VycmVudEV2ZW50ID0gZXZlbnQ7Ci0KLQkJCVN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIudGhpcy5yZWxheVRleHRDaGFuZ2luZyhldmVudC5nZXRPZmZzZXQoKSwgZXZlbnQuZ2V0TGVuZ3RoKCksIGV2ZW50LmdldFRleHQoKSk7Ci0JCX0KLQotCQlzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChpc1N0b3BwZWRGb3J3YXJkaW5nQ2hhbmdlcygpKQotCQkJCXJldHVybjsKLQotCQkJaWYgKGN1cnJlbnRFdmVudCAhPSBudWxsICYmIGV2ZW50ID09IGN1cnJlbnRFdmVudCkgewotCQkJCWlmIChhbGxUZXh0Q2hhbmdlZCkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyLnRoaXMucmVsYXlUZXh0U2V0KCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyB0ZW1wIHdvcmsgYXJvdW5kIGZvciBpbW1lZGlhdGUgdGhyZWFkCi0JCQkJCS8vIHByb2JsZW0uCi0JCQkJCS8vIHNob3VsZCBoYXZlIG1vcmUgZ2VuZXJhbCBzb2x1dGlvbgotCQkJCQkvLyBzb29uLiAnc3luY0V4ZWMnIGFyZSBydW1vcmVkIHRvIGJlCi0JCQkJCS8vIHByb25lIHRvIGhhbmcuCi0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIudGhpcy5yZWxheVRleHRDaGFuZ2VkKCk7Ci0JCQkJfQotCQkJfQotCi0JCQljdXJyZW50RXZlbnQgPSBudWxsOwotCQkJcGVuZGluZ0RvY3VtZW50Q2hhbmdlZEV2ZW50ID0gZmFsc2U7Ci0JCQloYW5kbGVQZW5kaW5nRXZlbnRzKCk7Ci0JCQlsYXN0RXZlbnQgPSBudWxsOwotCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHJpbmdUZXh0U3RvcmUgaW1wbGVtZW50cyBJVGV4dFN0b3JlIHsKLQotCQlwcml2YXRlIFN0cmluZyBmQ29udGVudDsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBzdHJpbmcgdGV4dCBzdG9yZSB3aXRoIHRoZSBnaXZlbiBjb250ZW50LgotCQkgKiAKLQkJICogQHBhcmFtIGNvbnRlbnQKLQkJICogICAgICAgICAgICB0aGUgY29udGVudAotCQkgKi8KLQkJcHVibGljIFN0cmluZ1RleHRTdG9yZShTdHJpbmcgY29udGVudCkgewotCQkJQXNzZXJ0LmlzTm90TnVsbChjb250ZW50LCAiY29udGVudCBjYW4gbm90IGJlIG51bGwgd2hlbiBzZXR0aW5nIHRleHQgc3RvcmUiKTsgLy8kTk9OLU5MUy0xJAotCQkJZkNvbnRlbnQgPSBjb250ZW50OwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmUjZ2V0KGludCkKLQkJICovCi0JCXB1YmxpYyBjaGFyIGdldChpbnQgb2Zmc2V0KSB7Ci0JCQlyZXR1cm4gZkNvbnRlbnQuY2hhckF0KG9mZnNldCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTdG9yZSNnZXQoaW50LCBpbnQpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gZkNvbnRlbnQuc3Vic3RyaW5nKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlI2dldExlbmd0aCgpCi0JCSAqLwotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCXJldHVybiBmQ29udGVudC5sZW5ndGgoKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlI3JlcGxhY2UoaW50LCBpbnQsCi0JCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlcGxhY2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHRleHQpIHsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlI3NldChqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0KFN0cmluZyB0ZXh0KSB7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENoYW5nZXMgdG8gdGhlIERvY3VtZW50L0lTdHJ1Y3R1cmVkRG9jdW1lbnQgY2FuIGV4dGVuZCBiZXlvbmQgdGhlIHRleHQKLQkgKiBjaGFuZ2UgYXJlYSBhbmQgcmVxdWlyZSBtb3JlIHJlZHJhd2luZyB0byBrZWVwIHRoZSBoaWxpZ2h0aW5nIGNvcnJlY3QuCi0JICogVGhlIGV2ZW50IG11c3QgYmUgc2F2ZWQgc28gdGhhdCB0aGUgcmVkcmF3IGlzIG9ubHkgc2VudCBhZnRlciBhCi0JICogdGV4dENoYW5nZWQgZXZlbnQgaXMgcmVjZWl2ZWQuCi0JICovCi0JY2xhc3MgU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgewotCi0JCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQotCQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpIHsKLQkJCQkvLyBpZgotCQkJCS8vIChTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyLnRoaXMuZlN0b3BSZWxheWluZ0NoYW5nZXMpCi0JCQkJLy8gewotCQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNraXBwZWQgcmVsYXlpbmcgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvLyBzaG91bGQgdXNlIHRleHRTZXQgd2hlbiBhbGwgY29udGVudHMgaGF2ZQotCQkJLy8gY2hhbmdlZAotCQkJLy8gb3RoZXJ3aXNlIG5lZWQgdG8gdXNlIHRoZSBwYWlyIG9mCi0JCQkvLyB0ZXh0Q2hhbmdpbmcgYW5kCi0JCQkvLyB0ZXh0Q2hhbmdlZC4KLQkJCVN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIudGhpcy5sYXN0RXZlbnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKGZpbmFsIE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJza2lwcGVkIHJlbGF5aW5nIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50ICIgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5yZWFzb24gPT0gTm9DaGFuZ2VFdmVudC5SRUFEX09OTFlfU1RBVEVfQ0hBTkdFKSB7Ci0JCQkJaWYgKHBlbmRpbmdEb2N1bWVudENoYW5nZWRFdmVudCkgewotCQkJCQlpZiAobGFzdEV2ZW50UXVldWUgPT0gbnVsbCkgewotCQkJCQkJbGFzdEV2ZW50UXVldWUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCX0KLQkJCQkJbGFzdEV2ZW50UXVldWUuYWRkKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIudGhpcy5sYXN0RXZlbnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJCWlmIChpc1N0b3BwZWRGb3J3YXJkaW5nQ2hhbmdlcygpKSB7Ci0JCQkJLy8gaWYKLQkJCQkvLyAoU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlci50aGlzLmZTdG9wUmVsYXlpbmdDaGFuZ2VzKQotCQkJCS8vIHsKLQkJCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJub3QgcmVsYXlpbmcgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNhdmluZyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCAiICsgc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyLnRoaXMubGFzdEV2ZW50ID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCi0JCQlpZiAoaXNTdG9wcGVkRm9yd2FyZGluZ0NoYW5nZXMoKSkgewotCQkJCS8vIGlmCi0JCQkJLy8gKFN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIudGhpcy5mU3RvcFJlbGF5aW5nQ2hhbmdlcykKLQkJCQkvLyB7Ci0JCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibm90IHJlbGF5aW5nIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50ICIgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJzYXZpbmcgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlci50aGlzLmxhc3RFdmVudCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVnaW9uc1JlcGxhY2VkKFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJCWlmIChpc1N0b3BwZWRGb3J3YXJkaW5nQ2hhbmdlcygpKSB7Ci0JCQkJLy8gaWYKLQkJCQkvLyAoU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlci50aGlzLmZTdG9wUmVsYXlpbmdDaGFuZ2VzKQotCQkJCS8vIHsKLQkJCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJub3QgcmVsYXlpbmcgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNhdmluZyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCAiICsgc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyLnRoaXMubGFzdEV2ZW50ID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gcmVkcmF3QmFja2dyb3VuZCA9IHRydWU7Ci0KLQkvKiogVGhlIHZpc2libGUgY2hpbGQgZG9jdW1lbnQuICovCi0JcHJpdmF0ZSBQcm9qZWN0aW9uRG9jdW1lbnQgZkNoaWxkRG9jdW1lbnQ7Ci0KLQkvKiogVGhlIG1hc3RlciBkb2N1bWVudCAqLwotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQkvKiogVGhlIGRvY3VtZW50IGNsb25lIGZvciB0aGUgbm9uLWZvcndhcmRpbmcgY2FzZS4gKi8KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnRDbG9uZTsKLQotCS8vIG9ubHkgdXNlIHRoaXMgdGVtcCB3b3JrIGFyb3VuZCBpZiBvbiBHVEsKLQkvLyBpdCBjYXVzZXMgZnVubnkgImN1cnNvciBibGlua2luZyIgaWYgdXNlZCBvbiB3aW5kb3dzCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGZvcmNlUmVkcmF3T25SZWdpb25DaGFuZ2VkID0gUGxhdGZvcm0uZ2V0V1MoKS5lcXVhbHMoImd0ayIpOyAvLyROT04tTkxTLTEkCi0JLyoqIFRoZSBvcmlnaW5hbCBjb250ZW50ICovCi0JcHJpdmF0ZSBTdHJpbmcgZk9yaWdpbmFsQ29udGVudDsKLQkvKiogVGhlIG9yaWdpbmFsIGxpbmUgZGVsaW1pdGVycyAqLwotCXByaXZhdGUgU3RyaW5nW10gZk9yaWdpbmFsTGluZURlbGltaXRlcnM7Ci0KLQlwcml2YXRlIGludCBmU3RvcFJlbGF5aW5nQ2hhbmdlc1JlcXVlc3RzID0gMDsKLQotCXByaXZhdGUgU3R5bGVkVGV4dCBmU3R5bGVkVGV4dFdpZGdldDsKLQotCS8qKiBUaGUgcmVnaXN0ZXJlZCB0ZXh0IGNoYW5nZWQgbGlzdGVuZXJzICovCi0JVGV4dENoYW5nZUxpc3RlbmVyW10gZlRleHRDaGFuZ2VMaXN0ZW5lcnM7Ci0JcHJvdGVjdGVkIERvY3VtZW50TGlzdGVuZXIgaW50ZXJuYWxEb2N1bWVudExpc3RlbmVyOwotCi0JLy8gVGhlIGxpc3RlbmVycyBmb3IgcmVsYXlpbmcgRG9jdW1lbnRFdmVudHMgYW5kCi0JLy8gcmVxdWVzdGluZyByZXBhaW50cwotCS8vIGFmdGVyIG1vZGlmaWNhdGlvbgotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgbGFzdEV2ZW50ID0gbnVsbDsKLQlMaXN0IGxhc3RFdmVudFF1ZXVlOwotCWJvb2xlYW4gcGVuZGluZ0RvY3VtZW50Q2hhbmdlZEV2ZW50OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0JLyoqCi0JICogVEVTVCBPTkxZIC0gVEVTVCBPTkxZIC0gVEVTVCBPTkxZIE5PVCBBUEkgdXNlIHRoaXMgY29uc3RydWN0b3Igb25seSBmb3IKLQkgKiB0ZXN0cy4gQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCBhZGFwdGVyIHdoaWNoIGlzIGluaXRpYWxsbHkgbm90IGNvbm5lY3RlZAotCSAqIHRvIGFueSBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlcigpIHsKLQotCQlpbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyKCk7Ci0JCWludGVybmFsRG9jdW1lbnRMaXN0ZW5lciA9IG5ldyBEb2N1bWVudExpc3RlbmVyKCk7Ci0JCS8vIGZvciB0ZXN0aW5nIG9ubHkKLQkJLy8gc2V0RG9jdW1lbnQoZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKENvbnRlbnRUeXBlSWRlbnRpZmllckZvclhNTC5Db250ZW50VHlwZUlEX1hNTCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgYWRhcHRlciB3aGljaCBpcyBpbml0aWFsbGx5IG5vdCBjb25uZWN0ZWQgdG8gYW55Ci0JICogZG9jdW1lbnQuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIoU3R5bGVkVGV4dCBzdHlsZWRUZXh0V2lkZ2V0KSB7Ci0KLQkJLy8gZG8gbm90IHVzZSAndGhpcygpJyBpbiB0aGlzIGNhc2UKLQkJc3VwZXIoKTsKLQkJaW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcigpOwotCQlpbnRlcm5hbERvY3VtZW50TGlzdGVuZXIgPSBuZXcgRG9jdW1lbnRMaXN0ZW5lcigpOwotCQlmU3R5bGVkVGV4dFdpZGdldCA9IHN0eWxlZFRleHRXaWRnZXQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9zZXREb2N1bWVudChJRG9jdW1lbnQgbmV3RG9jKSB7Ci0JCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZEb2N1bWVudCkucmVtb3ZlRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoaW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCX0KLQkJZkRvY3VtZW50ID0gbmV3RG9jOwotCQlpZiAoIWlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpIHsKLQkJCWZEb2N1bWVudENsb25lID0gbnVsbDsKLQkJCWZPcmlnaW5hbENvbnRlbnQgPSBnZXREb2N1bWVudCgpICE9IG51bGwgPyBnZXREb2N1bWVudCgpLmdldCgpIDogbnVsbDsKLQkJCWZPcmlnaW5hbExpbmVEZWxpbWl0ZXJzID0gZ2V0RG9jdW1lbnQoKSAhPSBudWxsID8gZ2V0RG9jdW1lbnQoKS5nZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCkgOiBudWxsOwotCQl9Ci0KLQkJaWYgKERFQlVHICYmIGZEb2N1bWVudCAhPSBudWxsICYmICEoZkRvY3VtZW50IGluc3RhbmNlb2YgSUxvY2thYmxlKSkgewotCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6IG5vbiBJTG9ja2FibGUgZG9jdW1lbnQgdXNlZCBpbiBTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICAgZG9jdW1lbnQgdXBkYXRlcyBvbiBub24tZGlzcGxheSB0aHJlYWQgd2lsbCBub3QgYmUgc2FmZSBpZiBlZGl0b3Igb3BlbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGZEb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCSgoSVN0cnVjdHVyZWREb2N1bWVudCkgZkRvY3VtZW50KS5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihpbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0Q29udGVudCNhZGRUZXh0Q2hhbmdlTGlzdGVuZXIob3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UZXh0Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFRleHRDaGFuZ2VMaXN0ZW5lcihUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCQkvLyBtYWtlIHN1cmUgbGlzdGVuZXIgaXMgbm90IGFscmVhZHkgaW4gbGlzdGVuaW5nCi0JCS8vIChhbmQgaWYgaXQgaXMsIHByaW50IGEgd2FybmluZyB0byBhaWQgZGVidWdnaW5nLAotCQkvLyBpZiBuZWVkZWQpCi0KLQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmVGV4dENoYW5nZUxpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQlpZiAoRGVidWcuZGlzcGxheVdhcm5pbmdzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyOjphZGRUZXh0Q2hhbmdlZExpc3RlbmVycy4gbGlzdGVuZXIgIiArIGxpc3RlbmVyICsgIiB3YXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UuICIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyOjphZGRUZXh0Q2hhbmdlZExpc3RlbmVycy4gQWRkaW5nIGFuIGluc3RhbmNlIG9mICIgKyBsaXN0ZW5lci5nZXRDbGFzcygpICsgIiBhcyBhIGxpc3RlbmVyIG9uIHRleHQgYWRhcHRlci4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBvbGRTaXplID0gMDsKLQkJCWlmIChmVGV4dENoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJLy8gbm9ybWFsbHkgd29uJ3QgYmUgbnVsbCwgYnV0IHdlIG5lZWQgdG8gYmUKLQkJCQkvLyBzdXJlLCBmb3IgZmlyc3QgdGltZSB0aHJvdWdoCi0JCQkJb2xkU2l6ZSA9IGZUZXh0Q2hhbmdlTGlzdGVuZXJzLmxlbmd0aDsKLQkJCX0KLQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSArIDE7Ci0JCQlUZXh0Q2hhbmdlTGlzdGVuZXJbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgVGV4dENoYW5nZUxpc3RlbmVyW25ld1NpemVdOwotCQkJaWYgKGZUZXh0Q2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZUZXh0Q2hhbmdlTGlzdGVuZXJzLCAwLCBuZXdMaXN0ZW5lcnMsIDAsIG9sZFNpemUpOwotCQkJfQotCQkJLy8gYWRkIGxpc3RlbmVyIHRvIGxhc3QgcG9zaXRpb24KLQkJCW5ld0xpc3RlbmVyc1tuZXdTaXplIC0gMV0gPSBsaXN0ZW5lcjsKLQkJCS8vCi0JCQkvLyBub3cgc3dpdGNoIG5ldyBmb3Igb2xkCi0JCQlmVGV4dENoYW5nZUxpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCS8vCi0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0Q29udGVudCNnZXRDaGFyQ291bnQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hhckNvdW50KCkgewotCi0JCS8vIGdldERvY3VtZW50IGNhbiBzb21ldGltZXMgYmUgbnVsbCBkdXJpbmcgc3RhcnR1cAotCQkvLyBhbmQgZGlzcG9zZQotCQlpbnQgcmVzdWx0ID0gMDsKLQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KCk7Ci0JCWlmIChkb2MgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gZ2V0U2FmZURvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElEb2N1bWVudCBnZXRDbG9uZWREb2N1bWVudCgpIHsKLQkJaWYgKGZEb2N1bWVudENsb25lID09IG51bGwpIHsKLQkJCVN0cmluZyBjb250ZW50ID0gZk9yaWdpbmFsQ29udGVudCA9PSBudWxsID8gIiIgOiBmT3JpZ2luYWxDb250ZW50OyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBkZWxpbXMgPSBmT3JpZ2luYWxMaW5lRGVsaW1pdGVycyA9PSBudWxsID8gRGVmYXVsdExpbmVUcmFja2VyLkRFTElNSVRFUlMgOiBmT3JpZ2luYWxMaW5lRGVsaW1pdGVyczsKLQkJCWZEb2N1bWVudENsb25lID0gbmV3IERvY3VtZW50Q2xvbmUoY29udGVudCwgZGVsaW1zKTsKLQkJfQotCQlyZXR1cm4gZkRvY3VtZW50Q2xvbmU7Ci0JfQotCi0JRGlzcGxheSBnZXREaXNwbGF5KCkgewotCi0JCS8vIE5vdGU6IHRoZSB3b3JrYmVuY2ggc2hvdWxkIGFsd2F5cyBoYXZlIGEgZGlzcGxheQotCQkvLyAodW5sZXNzIHJ1bm5pbmcgaGVhZGxlc3MpLCB3aGVyZWFzIERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCS8vIG9ubHkgcmV0dXJucyB0aGUgZGlzcGxheSBpZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyB0aHJlYWQKLQkJLy8gaGFzIG9uZS4KLQkJaWYgKFBsYXRmb3JtVUkuaXNXb3JrYmVuY2hSdW5uaW5nKCkpCi0JCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCk7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZpc2libGUgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiBJRG9jdW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCi0JCWlmIChmQ2hpbGREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZEb2N1bWVudDsKLQkJcmV0dXJuIGZDaGlsZERvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgcmVnaW9uIGluIG1hc3RlciBkb2N1bWVudCBvZiBnaXZlbiByZWdpb24gKHNob3VsZCBiZSByZWdpb24gaW4KLQkgKiBwcm9qZWN0aW9uIGRvY3VtZW50KQotCSAqIAotCSAqIEByZXR1cm4gcmVnaW9uIGlmIG5vIHByb2plY3Rpb24gZG9jdW1lbnQgZXhpc3RzLCByZWdpb24gb2YgbWFzdGVyCi0JICogICAgICAgICBkb2N1bWVudCBpZiBwb3NzaWJsZSwgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIElSZWdpb24gZ2V0UHJvamVjdGlvblRvTWFzdGVyUmVnaW9uKElSZWdpb24gcmVnaW9uKSB7Ci0JCUlSZWdpb24gb3JpZ2luYWxSZWdpb24gPSByZWdpb247Ci0JCWlmIChmQ2hpbGREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW9yaWdpbmFsUmVnaW9uID0gZkNoaWxkRG9jdW1lbnQuZ2V0UHJvamVjdGlvbk1hcHBpbmcoKS50b09yaWdpblJlZ2lvbihyZWdpb24pOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG9yaWdpbmFsUmVnaW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgb2Zmc2V0IGluIHByb2plY3Rpb24gZG9jdW1lbnQgb2YgZ2l2ZW4gb2Zmc2V0IChzaG91bGQgYmUgb2Zmc2V0Ci0JICogaW4gbWFzdGVyIGRvY3VtZW50KQotCSAqIAotCSAqIEByZXR1cm4gb2Zmc2V0IGlmIG5vIHByb2plY3Rpb24gZG9jdW1lbnQgZXhpc3RzLCBvZmZzZXQgb2YgcHJvamVjdGlvbgotCSAqICAgICAgICAgZG9jdW1lbnQgaWYgcG9zc2libGUsIC0xIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgaW50IGdldE1hc3RlclRvUHJvamVjdGlvbk9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCWludCBvcmlnaW5hbE9mZnNldCA9IG9mZnNldDsKLQkJaWYgKGZDaGlsZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJb3JpZ2luYWxPZmZzZXQgPSBmQ2hpbGREb2N1bWVudC5nZXRQcm9qZWN0aW9uTWFwcGluZygpLnRvSW1hZ2VPZmZzZXQob2Zmc2V0KTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBvcmlnaW5hbE9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpbmUgYXQgdGhlIGdpdmVuIGNoYXJhY3RlciBvZmZzZXQgd2l0aG91dCBkZWxpbWl0ZXJzLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIG9mZnNldCBvZiB0aGUgbGluZSB0byByZXR1cm4uIERvZXMgbm90IGluY2x1ZGUgZGVsaW1pdGVycyBvZgotCSAqICAgICAgICAgICAgcHJlY2VlZGluZyBsaW5lcy4gT2Zmc2V0IDAgaXMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUKLQkgKiAgICAgICAgICAgIGRvY3VtZW50LgotCSAqIEByZXR1cm4gdGhlIGxpbmUgdGV4dCB3aXRob3V0IGRlbGltaXRlcnMKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRMaW5lKGludCBsaW5lTnVtYmVyKSB7Ci0KLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChsaW5lTnVtYmVyID49IGdldExpbmVDb3VudCgpKSB7Ci0JCQlpZiAoRGVidWcuZGlzcGxheVdhcm5pbmdzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJEZXZlbG9wbWVudCBEZWJ1ZzogSVN0cnVjdHVyZWREb2N1bWVudDpnZXRMaW5lKCkgZXJyb3IuIGxpbmVOdW1iZXIgcmVxdWVzdGVkICgiICsgbGluZU51bWJlciArICIpIHdhcyBncmVhdGVyIHRoYW4gbnVtYmVyIG9mIGxpbmVzKCIgKyBnZXRMaW5lQ291bnQoKSArICIpLiBFbXB0eVN0cmluZyByZXR1cm5lZCIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCXJlc3VsdCA9IEVNUFRZX1NUUklORzsKLQkJfQotCQllbHNlIHsKLQkJCUlEb2N1bWVudCBkb2MgPSBnZXRTYWZlRG9jdW1lbnQoKTsKLQkJCWlmIChkb2MgPT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IEVNUFRZX1NUUklORzsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRyeSB7Ci0JCQkJCUlSZWdpb24gciA9IGRvYy5nZXRMaW5lSW5mb3JtYXRpb24obGluZU51bWJlcik7Ci0JCQkJCWlmIChyLmdldExlbmd0aCgpID4gMCkgewotCQkJCQkJcmVzdWx0ID0gZG9jLmdldChyLmdldE9mZnNldCgpLCByLmdldExlbmd0aCgpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlc3VsdCA9IEVNUFRZX1NUUklORzsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlyZXN1bHQgPSBFTVBUWV9TVFJJTkc7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVHJpZXMgdG8gcmVwYWlyIHRoZSBsaW5lIGluZm9ybWF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50Ci0JICogQHNlZSBJUmVwYWlyYWJsZURvY3VtZW50I3JlcGFpckxpbmVJbmZvcm1hdGlvbigpCi0JICogQHNlZSBFY2xpcHNlIDMuMAotCSAqLwotCXByaXZhdGUgdm9pZCByZXBhaXJMaW5lSW5mb3JtYXRpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElSZXBhaXJhYmxlRG9jdW1lbnQpIHsKLQkJCUlSZXBhaXJhYmxlRG9jdW1lbnQgcmVwYWlyYWJsZSA9IChJUmVwYWlyYWJsZURvY3VtZW50KSBkb2N1bWVudDsKLQkJCXJlcGFpcmFibGUucmVwYWlyTGluZUluZm9ybWF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpbmUgaW5kZXggYXQgdGhlIGdpdmVuIGNoYXJhY3RlciBvZmZzZXQuCi0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgb2Zmc2V0IG9mIHRoZSBsaW5lIHRvIHJldHVybi4gVGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUKLQkgKiAgICAgICAgICAgIGRvY3VtZW50IGlzIGF0IG9mZnNldCAwLiBBbiBvZmZzZXQgb2YgZ2V0TGVuZ3RoKCkgaXMgdmFsaWQKLQkgKiAgICAgICAgICAgIGFuZCBzaG91bGQgYW5zd2VyIHRoZSBudW1iZXIgb2YgbGluZXMuCi0JICogQHJldHVybiB0aGUgbGluZSBpbmRleC4gVGhlIGZpcnN0IGxpbmUgaXMgYXQgaW5kZXggMC4gSWYgdGhlIGNoYXJhY3RlcgotCSAqICAgICAgICAgYXQgb2Zmc2V0IGlzIGEgZGVsaW1pdGVyIGNoYXJhY3RlciwgYW5zd2VyIHRoZSBsaW5lIGluZGV4IG9mCi0JICogICAgICAgICB0aGUgbGluZSB0aGF0IGlzIGRlbGltaXRlZC4gRm9yIGV4YW1wbGUsIHRleHQgPSAiXHJcblxyXG4iLAotCSAqICAgICAgICAgZGVsaW1pdGVyID0gIlxyXG4iLCB0aGVuOiBnZXRMaW5lQXRPZmZzZXQoMCkgPT0gMAotCSAqICAgICAgICAgZ2V0TGluZUF0T2Zmc2V0KDEpID09IDAgZ2V0TGluZUF0T2Zmc2V0KDIpID09IDEKLQkgKiAgICAgICAgIGdldExpbmVBdE9mZnNldCgzKSA9PSAxIGdldExpbmVBdE9mZnNldCg0KSA9PSAyCi0JICovCi0JcHVibGljIGludCBnZXRMaW5lQXRPZmZzZXQoaW50IG9mZnNldCkgewotCi0JCWludCByZXN1bHQgPSAwOwotCQlJRG9jdW1lbnQgZG9jID0gZ2V0U2FmZURvY3VtZW50KCk7Ci0JCWlmIChkb2MgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXN1bHQgPSBkb2MuZ2V0TGluZU9mT2Zmc2V0KG9mZnNldCk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCXJlcGFpckxpbmVJbmZvcm1hdGlvbihkb2MpOwotCQkJCXRyeSB7Ci0JCQkJCXJlc3VsdCA9IGRvYy5nZXRMaW5lT2ZPZmZzZXQob2Zmc2V0KTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgyKSB7Ci0JCQkJCS8vIHNob3VsZCBub3Qgb2NjdXIsIGJ1dCBzZWVtcyB0byBmb3IgcHJvamVjdGlvbgotCQkJCQkvLyBkb2N1bWVudHMsIHJlbGF0ZWQgdG8gcmVwYWludGluZyBvdmVydmlldyBydWxlcgotCQkJCQlyZXN1bHQgPSAwOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGluZUNvdW50KCkgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJSURvY3VtZW50IGRvYyA9IGdldFNhZmVEb2N1bWVudCgpOwotCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGRvYy5nZXROdW1iZXJPZkxpbmVzKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0Q29udGVudCNnZXRMaW5lRGVsaW1pdGVyCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGdldFBhcmVudERvY3VtZW50KCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlyZXN1bHQgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGdldFBhcmVudERvY3VtZW50KCkpLmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJfQotCQllbHNlIHsKLQkJCUlEb2N1bWVudCBkb2MgPSBnZXRTYWZlRG9jdW1lbnQoKTsKLQkJCXJlc3VsdCA9IFRleHRVdGlsaXRpZXMuZ2V0RGVmYXVsdExpbmVEZWxpbWl0ZXIoZG9jKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2hhcmFjdGVyIG9mZnNldCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBnaXZlbiBsaW5lLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBsaW5lSW5kZXgKLQkgKiAgICAgICAgICAgIGluZGV4IG9mIHRoZSBsaW5lLiBUaGUgZmlyc3QgbGluZSBpcyBhdCBpbmRleCAwLgotCSAqIEByZXR1cm4gb2Zmc2V0IG9mZnNldCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBsaW5lLiBUaGUgZmlyc3QKLQkgKiAgICAgICAgIGNoYXJhY3RlciBvZiB0aGUgZG9jdW1lbnQgaXMgYXQgb2Zmc2V0IDAuIFRoZSByZXR1cm4gdmFsdWUKLQkgKiAgICAgICAgIHNob3VsZCBpbmNsdWRlIGxpbmUgZGVsaW1pdGVycy4gRm9yIGV4YW1wbGUsIHRleHQgPQotCSAqICAgICAgICAgIlxyXG50ZXN0XHJcbiIsIGRlbGltaXRlciA9ICJcclxuIiwgdGhlbjogZ2V0T2Zmc2V0QXRMaW5lKDApID09Ci0JICogICAgICAgICAwIGdldE9mZnNldEF0TGluZSgxKSA9PSAyIGdldE9mZnNldEF0TGluZSgyKSA9PSA4IE5PVEU6IFdoZW4KLQkgKiAgICAgICAgIHRoZXJlIGlzIG5vIHRleHQgKGkuZS4sIG5vIGxpbmVzKSwgZ2V0T2Zmc2V0QXRMaW5lKDApIGlzIGEKLQkgKiAgICAgICAgIHZhbGlkIGNhbGwgdGhhdCBzaG91bGQgcmV0dXJuIDAuCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXRBdExpbmUoaW50IGxpbmVJbmRleCkgewotCi0JCWludCByZXN1bHQgPSAwOwotCQlJRG9jdW1lbnQgZG9jID0gZ2V0U2FmZURvY3VtZW50KCk7Ci0JCWlmIChkb2MgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXN1bHQgPSBkb2MuZ2V0TGluZU9mZnNldChsaW5lSW5kZXgpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXN1bHQgPSAwOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFyZW50IGRvY3VtZW50Ci0JICogCi0JICogQHJldHVybiB0aGUgcGFyZW50IGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZ2V0UGFyZW50RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgZG9jdW1lbnQgdG8gdXNlIGZvciByZXF1ZXN0IGZyb20gdGhlIFN0eWxlZFRleHQgd2lkZ2V0LiBJdHMKLQkgKiBlaXRoZXIgdGhlIGxpdmUgZG9jdW1uZXQgb3IgYSBjbG9uZSBvZiBpdCwgZGVwZW5kaW5nIG9uIHN0b3AvcmVzdW1lCi0JICogc3RhdGUuCi0JICovCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZ2V0U2FmZURvY3VtZW50KCkgewotCQlJRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpIHsKLQkJCXJlc3VsdCA9IGdldENsb25lZERvY3VtZW50KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBub3RlLCB0aGlzIGRvY3VtZW50IGNhbiBiZSBub3JtYWwgc3RydWN0dXJlZCB0ZXh0IGRvY3VtZW50LAotCQkJLy8gb3IgdGhlIHByb2plY3Rpb24vY2hpbGQgZG9jdW1lbnQKLQkJCXJlc3VsdCA9IGdldERvY3VtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dAotCSAqLwotCVN0eWxlZFRleHQgZ2V0U3R5bGVkVGV4dFdpZGdldCgpIHsKLQkJcmV0dXJuIGZTdHlsZWRUZXh0V2lkZ2V0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb250ZW50IGF0IHRoZSBnaXZlbiByYW5nZS4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiAgICAgICAgICAgIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIHRleHQgdG8gcmV0dXJuLiBPZmZzZXQgMCBpcyB0aGUKLQkgKiAgICAgICAgICAgIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgZG9jdW1lbnQuCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgdGV4dCB0byByZXR1cm4KLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IGF0IHRoZSBnaXZlbiByYW5nZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dFJhbmdlKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlEb2N1bWVudCBkb2MgPSBnZXRTYWZlRG9jdW1lbnQoKTsKLQkJCXJlc3VsdCA9IGRvYy5nZXQoc3RhcnQsIGxlbmd0aCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdCA9IEVNUFRZX1NUUklORzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBvbmx5IGZvciAibm8gY2hhbmdlIiBldmVudHMsIGZvciBub3cKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQZW5kaW5nRXZlbnRzKCkgewotCi0JCWlmIChsYXN0RXZlbnRRdWV1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGFzdEV2ZW50UXVldWUuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTm9DaGFuZ2VFdmVudCBub0NoYW5nZUV2ZW50ID0gKE5vQ2hhbmdlRXZlbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCXJlZHJhd05vQ2hhbmdlKG5vQ2hhbmdlRXZlbnQpOwotCQl9Ci0KLQkJbGFzdEV2ZW50UXVldWUgPSBudWxsOwotCQlsYXN0RXZlbnQgPSBudWxsOwotCX0KLQotCWJvb2xlYW4gaXNTdG9wcGVkRm9yd2FyZGluZ0NoYW5nZXMoKSB7Ci0JCXJldHVybiBmU3RvcFJlbGF5aW5nQ2hhbmdlc1JlcXVlc3RzID4gMDsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIG1ldGhvZCBpcyBhc3N1bWVkIHRvIGJlIGNhbGxlZCBvbmx5IGZvciByZWFkIG9ubHkgcmVnaW9uIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVkcmF3Tm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCi0JCWlmIChpc1N0b3BwZWRGb3J3YXJkaW5nQ2hhbmdlcygpKQotCQkJcmV0dXJuOwotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigibWF5YmUgcmVkcmF3IHN0dWZmIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWludCBzdGFydE9mZnNldCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0TGVuZ3RoKCk7Ci0JCXJlZHJhd1JhbmdlV2l0aExlbmd0aChzdGFydE9mZnNldCwgbGVuZ3RoKTsKLQotCX0KLQotCS8qKgotCSAqIFJlcXVlc3QgYSByZWRyYXcgb2YgdGhlIHRleHQgcmFuZ2Ugb2NjdXBpZWQgYnkgdGhlIGdpdmVuCi0JICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWRyYXdOb2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpCi0JCQlyZXR1cm47Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJtYXliZSByZWRyYXcgc3R1ZmYiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIGp1c3QgdGhlIG5ldyBzdHVmZgotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOwotCi0JCWludCBuTmV3Tm9kZXMgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpOwotCQlpZiAobk5ld05vZGVzID4gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0oMCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKG5OZXdOb2RlcyAtIDEpOwotCQkJcmVkcmF3UmFuZ2UoZmlyc3ROb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGxhc3ROb2RlLmdldEVuZE9mZnNldCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlZHJhd3MgdGhlIGdpdmUgb2Zmc2V0cyBpbiB0ZXJtcyBvZiB0aGUgU3RydWN0dXJlZERvY3VtZW50LiBJZiBvbmx5Ci0JICogcGFydCBvZiB0aGUgbW9kZWwgaXMgdmlzaWJsZSwgZW5zdXJlcyB0aGF0IG9ubHkgdGhlIHZpc2libGUgcG9ydGlvbiBvZgotCSAqIHRoZSBnaXZlbiByYW5nZSBpcyByZWRyYXduLgotCSAqIAotCSAqIEBwYXJhbSBzdGFydE1vZGVsT2Zmc2V0Ci0JICogQHBhcmFtIGVuZE1vZGVsT2Zmc2V0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZHJhd1JhbmdlKGZpbmFsIGludCBzdGFydE1vZGVsT2Zmc2V0LCBmaW5hbCBpbnQgZW5kTW9kZWxPZmZzZXQpIHsKLQotCQlpZiAoZ2V0RG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVkcmF3IHN0dWZmOiAiICsgc3RhcnRNb2RlbE9mZnNldCArICItIiArIGVuZE1vZGVsT2Zmc2V0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKGZDaGlsZERvY3VtZW50ID09IG51bGwpIHsKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZ2V0U3R5bGVkVGV4dFdpZGdldCgpLnJlZHJhd1JhbmdlKHN0YXJ0TW9kZWxPZmZzZXQsIGVuZE1vZGVsT2Zmc2V0IC0gc3RhcnRNb2RlbE9mZnNldCwgcmVkcmF3QmFja2dyb3VuZCk7Ci0JCQkJfQotCQkJfTsKLQkJCXJ1bk9uRGlzcGxheVRocmVhZElmTmVlZGVkZShydW5uYWJsZSk7Ci0KLQkJfQotCQllbHNlIHsKLQkJCWludCBoaWdoID0gZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKTsKLQkJCWludCBzdGFydE9mZnNldCA9IGdldE1hc3RlclRvUHJvamVjdGlvbk9mZnNldChzdGFydE1vZGVsT2Zmc2V0KTsKLQotCQkJaW50IGVuZE9mZnNldCA9IGdldE1hc3RlclRvUHJvamVjdGlvbk9mZnNldChlbmRNb2RlbE9mZnNldCk7Ci0KLQkJCS8vIGlmIG9mZnNldHMgd2VyZSBub3QgdmlzaWJsZSwganVzdCB0cnkgdG8gcmVkcmF3IGV2ZXJ5dGhpbmcgaW4KLQkJCS8vIHRoZSBjaGlsZCBkb2N1bWVudAotCQkJLy8gLy8gbm90IHZpc2libGUKLQkJCS8vIGlmIChlbmRPZmZzZXQgPCAwIHx8IHN0YXJ0T2Zmc2V0ID4gaGlnaCkKLQkJCS8vIHJldHVybjsKLQkJCS8vIHJlc3RyaWN0IGxvd2VyIGJvdW5kCi0JCQlpZiAoc3RhcnRPZmZzZXQgPCAwKSB7Ci0JCQkJc3RhcnRPZmZzZXQgPSAwOwotCQkJfQotCQkJLy8gcmVzdHJpY3QgdXBwZXIgYm91bmQKLQkJCS8vIGlmIChlbmRPZmZzZXQgPiBoaWdoKSB7Ci0JCQkvLyBlbmRPZmZzZXQgPSBoaWdoOwotCQkJLy8gfQotCQkJaWYgKGVuZE9mZnNldCA8IDApIHsKLQkJCQllbmRPZmZzZXQgPSBoaWdoOwotCQkJfQotCi0JCQlpbnQgbGVuZ3RoID0gZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQ7Ci0JCQkvLyByZWRyYXdCYWNrZ3JvdW5kIHdpdGggZmFsc2Ugd291bGQgYmUgZmFzdGVyCi0JCQkvLyBidXQgYXNzdW1lcyBiYWNrZ3JvdW5kIChvciBmb250KSBpcyBub3QKLQkJCS8vIGNoYW5naW5nCi0JCQlmaW5hbCBpbnQgZmluYWxTdGFydE9mZnNldCA9IHN0YXJ0T2Zmc2V0OwotCQkJZmluYWwgaW50IGZpbmFsbGVuZ3RoID0gbGVuZ3RoOwotCi0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWdldFN0eWxlZFRleHRXaWRnZXQoKS5yZWRyYXdSYW5nZShmaW5hbFN0YXJ0T2Zmc2V0LCBmaW5hbGxlbmd0aCwgcmVkcmF3QmFja2dyb3VuZCk7Ci0JCQkJfQotCQkJfTsKLQkJCXJ1bk9uRGlzcGxheVRocmVhZElmTmVlZGVkZShydW5uYWJsZSk7Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlZHJhd3MgdGhlIGdpdmUgb2Zmc2V0cyBpbiB0ZXJtcyBvZiB0aGUgRmxhdCBOb2RlIG1vZGVsLiBJZiBvbmx5IHBhcnQKLQkgKiBvZiB0aGUgbW9kZWwgaXMgdmlzaWJsZSwgZW5zdXJlcyB0aGF0IG9ubHkgdGhlIHZpc2libGUgcG9ydGlvbiBvZiB0aGUKLQkgKiBnaXZlbiByYW5nZSBpcyByZWRyYXduLgotCSAqIAotCSAqIEBwYXJhbSBzdGFydE1vZGVsT2Zmc2V0Ci0JICogQHBhcmFtIGVuZE1vZGVsT2Zmc2V0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHJlZHJhd1JhbmdlV2l0aExlbmd0aChmaW5hbCBpbnQgc3RhcnRNb2RlbE9mZnNldCwgZmluYWwgaW50IGxlbmd0aCkgewotCi0JCWlmIChnZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZWRyYXcgc3R1ZmY6ICIgKyBzdGFydE1vZGVsT2Zmc2V0ICsgIi0iICsgbGVuZ3RoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKGZDaGlsZERvY3VtZW50ID09IG51bGwpIHsKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZ2V0U3R5bGVkVGV4dFdpZGdldCgpLnJlZHJhd1JhbmdlKHN0YXJ0TW9kZWxPZmZzZXQsIGxlbmd0aCwgcmVkcmF3QmFja2dyb3VuZCk7Ci0JCQkJfQotCQkJfTsKLQkJCXJ1bk9uRGlzcGxheVRocmVhZElmTmVlZGVkZShydW5uYWJsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnQgaGlnaCA9IGdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0JCQkvLyBUT0RPIG5lZWQgdG8gdGFrZSBpbnRvIGFjY291bnQgc2VnbWVudGVkIHZpc2libGUgcmVnaW9ucwotCQkJaW50IHN0YXJ0T2Zmc2V0ID0gZ2V0TWFzdGVyVG9Qcm9qZWN0aW9uT2Zmc2V0KHN0YXJ0TW9kZWxPZmZzZXQpOwotCQkJLy8gbm90IHZpc2libGUKLQkJCWlmIChzdGFydE9mZnNldCA+IGhpZ2ggfHwgbGVuZ3RoIDwgMSkKLQkJCQlyZXR1cm47Ci0JCQkvLyByZXN0cmljdCBsb3dlciBib3VuZAotCQkJaWYgKHN0YXJ0T2Zmc2V0IDwgMCkgewotCQkJCXN0YXJ0T2Zmc2V0ID0gMDsKLQkJCX0KLQkJCWludCBlbmRPZmZzZXQgPSBzdGFydE9mZnNldCArIGxlbmd0aCAtIDE7Ci0JCQkvLyByZXN0cmljdCB1cHBlciBib3VuZAotCQkJaWYgKGVuZE9mZnNldCA+IGhpZ2gpIHsKLQkJCQllbmRPZmZzZXQgPSBoaWdoOwotCQkJfQotCi0JCQkvLyBub3RlOiBsZW5ndGggb2YgdGhlIGNoaWxkIGRvY3VtbmV0IHNob3VsZCBiZQotCQkJLy8gdXBkYXRlZCwKLQkJCS8vIG5lZWQgdG8gaW52ZXN0aWdhdGUgd2h5IGl0cyBub3QgYXQgdGhpcwotCQkJLy8gcG9pbnQsIGJ1dCBpcwotCQkJLy8gcHJvYmFibHkganVzdCBiZWNhdXNlIHRoZSBkb2N1bWVudCBldmVudAotCQkJLy8gaGFuZGxpbmcgaXMgbm90Ci0JCQkvLyBjb21wbGV0ZWx5IGZpbmlzaGVkLgotCQkJaW50IG5ld0xlbmd0aCA9IGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0OyAvLyBkMjgzMDA3Ci0KLQkJCS8vIHJlZHJhd0JhY2tncm91bmQgd2l0aCBmYWxzZSB3b3VsZCBiZSBmYXN0ZXIKLQkJCS8vIGJ1dCBhc3N1bWVzIGJhY2tncm91bmQgKG9yIGZvbnQpIGlzIG5vdAotCQkJLy8gY2hhbmdpbmcKLQkJCWZpbmFsIGludCBmaW5hbFN0YXJ0T2Zmc2V0ID0gc3RhcnRPZmZzZXQ7Ci0JCQlmaW5hbCBpbnQgZmluYWxOZXdMZW5ndGggPSBuZXdMZW5ndGg7Ci0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWdldFN0eWxlZFRleHRXaWRnZXQoKS5yZWRyYXdSYW5nZShmaW5hbFN0YXJ0T2Zmc2V0LCBmaW5hbE5ld0xlbmd0aCwgcmVkcmF3QmFja2dyb3VuZCk7Ci0JCQkJfQotCQkJfTsKLQkJCXJ1bk9uRGlzcGxheVRocmVhZElmTmVlZGVkZShydW5uYWJsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXF1ZXN0IGEgcmVkcmF3IG9mIHRoZSB0ZXh0IHJhbmdlIG9jY3VwaWVkIGJ5IHRoZSBnaXZlbgotCSAqIFJlZ2lvbkNoYW5nZWRFdmVudCBmb3IgY2VydGFpbiAobm90IGFsbCkgSVRleHRSZWdpb24gY29udGV4dHMKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWRyYXdSZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCi0JCWlmIChpc1N0b3BwZWRGb3J3YXJkaW5nQ2hhbmdlcygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIm1heWJlIHJlZHJhdyBzdHVmZiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCi0JCS8vIChuc2QpIFRPRE86IHRyeSB0byBtYWtlIHRoaXMgcmVsaWFibGUgc29tZWhvdwotCQkvLyB3aXRob3V0IGJlaW5nIGRpcmVjdGx5IGNvbnRlbnQgZGVwZW5kZW50Ci0JCS8vIGlmICgocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHx8Ci0JCS8vICh0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkJMT0NLX1RFWFQpIHx8Ci0JCS8vICh0eXBlID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSkgewotCQkvLyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0KLQkJLy8gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCS8vIC8vIHJlZHJhdyBiYWNrZ3JvdW5kIG9mIGZhbHNlIGlzIGZhc3RlciwKLQkJLy8gLy8gYnV0IGFzc3VtZXMgYmFja2dyb3VuZCAob3IgZm9udCkgaXMgbm90Ci0JCS8vIGNoYW5naW5nCi0JCS8vIHJlZHJhd1JhbmdlKGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbiksCi0JCS8vIGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pKTsKLQkJLy8gfQotCQlpZiAoZm9yY2VSZWRyYXdPblJlZ2lvbkNoYW5nZWQpIHsKLQkJCS8vIHdvcmthcm91bmQgZm9yIHJlZHJhd2luZyBwcm9ibGVtcyBvbiBMaW51eC1HVEsKLQkJCWludCBzdGFydE9mZnNldCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9mZnNldCgpOwotCQkJaW50IGVuZE9mZnNldCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9mZnNldCgpICsgc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0TGVuZ3RoKCk7Ci0JCQl0cnkgewotCQkJCUlSZWdpb24gc3RhcnRMaW5lID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZkRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KHN0YXJ0T2Zmc2V0KTsKLQkJCQlJUmVnaW9uIGVuZExpbmUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5mRG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoZW5kT2Zmc2V0KTsKLQkJCQlpZiAoc3RhcnRMaW5lICE9IG51bGwgJiYgZW5kTGluZSAhPSBudWxsKSB7Ci0JCQkJCXJlZHJhd1JhbmdlKHN0YXJ0TGluZS5nZXRPZmZzZXQoKSwgZW5kTGluZS5nZXRPZmZzZXQoKSArIGVuZExpbmUuZ2V0TGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbm90aGluZyBmb3Igbm93Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXF1ZXN0IGEgcmVkcmF3IG9mIHRoZSB0ZXh0IHJhbmdlIG9jY3VwaWVkIGJ5IHRoZSBnaXZlbgotCSAqIFJlZ2lvbnNSZXBsYWNlZEV2ZW50Ci0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVkcmF3UmVnaW9uc1JlcGxhY2VkKFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpCi0JCQlyZXR1cm47Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJtYXliZSByZWRyYXcgc3R1ZmYiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0TmV3UmVnaW9ucygpOwotCQlpbnQgblJlZ2lvbnMgPSBuZXdSZWdpb25zLnNpemUoKTsKLQkJaWYgKG5SZWdpb25zID4gMCkgewotCQkJSVRleHRSZWdpb24gZmlyc3RSZWdpb24gPSBuZXdSZWdpb25zLmdldCgwKTsKLQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSBuZXdSZWdpb25zLmdldChuUmVnaW9ucyAtIDEpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJcmVkcmF3UmFuZ2UoZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoZmlyc3RSZWdpb24pLCBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQobGFzdFJlZ2lvbikpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVkcmF3VGV4dENoYW5nZWQoKSB7Ci0KLQkJaWYgKGxhc3RFdmVudCAhPSBudWxsKSB7Ci0JCQkvLyB1cGRhdGUgZGlzcGxheSwgc2luY2Ugc29tZSBjYXNlcyBjYW4gZWZmZWN0Ci0JCQkvLyBoaWdobGlnaHRpbmcgYmV5b25kIHRoZSBjaGFuZ2VkIHRleHQgYXJlYS4KLQkJCWlmIChsYXN0RXZlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCkKLQkJCQlyZWRyYXdOb2Rlc1JlcGxhY2VkKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCkgbGFzdEV2ZW50KTsKLQkJCWlmIChsYXN0RXZlbnQgaW5zdGFuY2VvZiBSZWdpb25zUmVwbGFjZWRFdmVudCkKLQkJCQlyZWRyYXdSZWdpb25zUmVwbGFjZWQoKFJlZ2lvbnNSZXBsYWNlZEV2ZW50KSBsYXN0RXZlbnQpOwotCQkJaWYgKGxhc3RFdmVudCBpbnN0YW5jZW9mIFJlZ2lvbkNoYW5nZWRFdmVudCkKLQkJCQlyZWRyYXdSZWdpb25DaGFuZ2VkKChSZWdpb25DaGFuZ2VkRXZlbnQpIGxhc3RFdmVudCk7Ci0JCQkvLyBtb3ZlZCBmb2xsb3dpbmcgbGluZSB0byAnZG9jdW1lbnQgY2hhbmdlZCcgc28KLQkJCS8vIHRoZSAibGFzdCBldmVudCIgY2FuIGJlCi0JCQkvLyByZS1kcmF3biBhZnRlciBwZW5kaW5nIHJlLWRyYXdzCi0JCQkvLyBsYXN0RXZlbnQgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VuZHMgYSB0ZXh0IHJlcGxhY2UgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbGF5VGV4dENoYW5nZWQoKSB7Ci0KLQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpIHsKLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCAmJiBnZXREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5PVCByZWxheWluZyB0ZXh0IGNoYW5nZWQgKCIgKyBnZXREb2N1bWVudCgpLmdldExlbmd0aCgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50ICYmIGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZWxheWluZyB0ZXh0IGNoYW5nZWQgKCIgKyBnZXREb2N1bWVudCgpLmdldExlbmd0aCgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZmluYWwgVGV4dENoYW5nZWRFdmVudCB0ZXh0Q2hhbmdlZEV2ZW50ID0gbmV3IFRleHRDaGFuZ2VkRXZlbnQodGhpcyk7Ci0KLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZQotCQkvLyB0aGUgYWRkIGFuZCByZW1vdmUgbGlzdGVuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlCi0JCS8vIGxpc3RlbmVyIGFycmF5IGZyb20gYW5vdGhlciB0aHJlYWQKLQotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoZlRleHRDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gZlRleHRDaGFuZ2VMaXN0ZW5lcnM7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQkJLy8gdGhpcyBpcyBhIHNhZmUgY2FzdCwgc2luY2UgYWRkTGlzdGVuZXJzCi0JCQkJCQkvLyByZXF1aXJlcyBhIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcgotCQkJCQkJKChUZXh0Q2hhbmdlTGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLnRleHRDaGFuZ2VkKHRleHRDaGFuZ2VkRXZlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlydW5PbkRpc3BsYXlUaHJlYWRJZk5lZWRlZGUocnVubmFibGUpOwotCQlyZWRyYXdUZXh0Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIFNlbmRzIGEgdGV4dCBjaGFuZ2UgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVsYXlUZXh0Q2hhbmdpbmcoaW50IHJlcXVlc3RlZFN0YXJ0LCBpbnQgcmVxdWVzdGVkTGVuZ3RoLCBTdHJpbmcgcmVxdWVzdGVkQ2hhbmdlKSB7Ci0KLQkJaWYgKGdldERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpIHsKLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCAmJiBnZXREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5PVCByZWxheWluZyB0ZXh0IGNoYW5naW5nOiAiICsgcmVxdWVzdGVkU3RhcnQgKyAiOiIgKyBnZXREb2N1bWVudCgpLmdldExlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50ICYmIGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZWxheWluZyB0ZXh0IGNoYW5naW5nOiAiICsgcmVxdWVzdGVkU3RhcnQgKyAiOiIgKyBnZXREb2N1bWVudCgpLmdldExlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJbGFzdEV2ZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZpbmFsIFRleHRDaGFuZ2luZ0V2ZW50IHRleHRDaGFuZ2luZ0V2ZW50ID0gbmV3IFRleHRDaGFuZ2luZ0V2ZW50KHRoaXMpOwotCi0JCQl0ZXh0Q2hhbmdpbmdFdmVudC5zdGFydCA9IHJlcXVlc3RlZFN0YXJ0OwotCQkJdGV4dENoYW5naW5nRXZlbnQucmVwbGFjZUNoYXJDb3VudCA9IHJlcXVlc3RlZExlbmd0aDsKLQkJCXRleHRDaGFuZ2luZ0V2ZW50Lm5ld0NoYXJDb3VudCA9IChyZXF1ZXN0ZWRDaGFuZ2UgPT0gbnVsbCA/IDAgOiByZXF1ZXN0ZWRDaGFuZ2UubGVuZ3RoKCkpOwotCQkJdGV4dENoYW5naW5nRXZlbnQucmVwbGFjZUxpbmVDb3VudCA9IGdldERvY3VtZW50KCkuZ2V0TnVtYmVyT2ZMaW5lcyhyZXF1ZXN0ZWRTdGFydCwgcmVxdWVzdGVkTGVuZ3RoKSAtIDE7Ci0JCQl0ZXh0Q2hhbmdpbmdFdmVudC5uZXdUZXh0ID0gcmVxdWVzdGVkQ2hhbmdlOwotCQkJdGV4dENoYW5naW5nRXZlbnQubmV3TGluZUNvdW50ID0gKHJlcXVlc3RlZENoYW5nZSA9PSBudWxsID8gMCA6IGdldERvY3VtZW50KCkuY29tcHV0ZU51bWJlck9mTGluZXMocmVxdWVzdGVkQ2hhbmdlKSk7Ci0KLQkJCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwKLQkJCS8vIHNpbmNlIHRoZSBhZGQgYW5kIHJlbW92ZSBsaXN0bmVyCi0JCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUKLQkJCS8vIGxpc3RlbmVyIGFycmF5IGZyb20gYW5vdGhlciB0aHJlYWQKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGZUZXh0Q2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJCVRleHRDaGFuZ2VMaXN0ZW5lcltdIGhvbGRMaXN0ZW5lcnMgPSBmVGV4dENoYW5nZUxpc3RlbmVyczsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQkJCS8vIHRoaXMgaXMgYSBzYWZlIGNhc3QsIHNpbmNlCi0JCQkJCQkJLy8gYWRkTGlzdGVuZXJzIHJlcXVpcmVzIGEKLQkJCQkJCQkvLyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIKLQkJCQkJCQlob2xkTGlzdGVuZXJzW2ldLnRleHRDaGFuZ2luZyh0ZXh0Q2hhbmdpbmdFdmVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJcnVuT25EaXNwbGF5VGhyZWFkSWZOZWVkZWRlKHJ1bm5hYmxlKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlbmRzIGEgdGV4dCBzZXQgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLiBXaWRnZXQgc2hvdWxkCi0JICogcmVkcmF3IGl0c2VsZiBhdXRvbWF0aWNhbGx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbGF5VGV4dFNldCgpIHsKLQotCQlpZiAoaXNTdG9wcGVkRm9yd2FyZGluZ0NoYW5nZXMoKSkgewotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50ICYmIGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTk9UIHJlbGF5aW5nIHRleHQgc2V0ICgiICsgZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCAmJiBnZXREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVsYXlpbmcgdGV4dCBzZXQgKCIgKyBnZXREb2N1bWVudCgpLmdldExlbmd0aCgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJbGFzdEV2ZW50ID0gbnVsbDsKLQkJZmluYWwgVGV4dENoYW5nZWRFdmVudCB0ZXh0Q2hhbmdlZEV2ZW50ID0gbmV3IFRleHRDaGFuZ2VkRXZlbnQodGhpcyk7Ci0KLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZQotCQkvLyB0aGUgYWRkIGFuZCByZW1vdmUgbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUKLQkJLy8gbGlzdGVuZXIgYXJyYXkgZnJvbSBhbm90aGVyIHRocmVhZAotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoZlRleHRDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQlUZXh0Q2hhbmdlTGlzdGVuZXJbXSBob2xkTGlzdGVuZXJzID0gZlRleHRDaGFuZ2VMaXN0ZW5lcnM7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQkJaG9sZExpc3RlbmVyc1tpXS50ZXh0U2V0KHRleHRDaGFuZ2VkRXZlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlydW5PbkRpc3BsYXlUaHJlYWRJZk5lZWRlZGUocnVubmFibGUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0Q29udGVudCNyZW1vdmVUZXh0Q2hhbmdlTGlzdGVuZXIob3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UZXh0Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lcihmaW5hbCBUZXh0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCQlpZiAoKGZUZXh0Q2hhbmdlTGlzdGVuZXJzICE9IG51bGwpICYmIChsaXN0ZW5lciAhPSBudWxsKSkgewotCQkJLy8gaWYgaXRzIG5vdCBpbiB0aGUgbGlzdGVuZXJzLCB3ZSdsbCBpZ25vcmUgdGhlCi0JCQkvLyByZXF1ZXN0Ci0JCQlpZiAoIVV0aWxpdGllcy5jb250YWlucyhmVGV4dENoYW5nZUxpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXI6OnJlbW92ZVRleHRDaGFuZ2VkTGlzdGVuZXJzLiBsaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHdhcyBub3QgcHJlc2VudC4gIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlcjo6YWRkVGV4dENoYW5nZWRMaXN0ZW5lcnMuIFJlbW92aW5nIGFuIGluc3RhbmNlIG9mICIgKyBsaXN0ZW5lci5nZXRDbGFzcygpICsgIiBhcyBhIGxpc3RlbmVyIG9uIHRleHQgYWRhcHRlci4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZmluYWwgaW50IG9sZFNpemUgPSBmVGV4dENoYW5nZUxpc3RlbmVycy5sZW5ndGg7Ci0JCQkJaW50IG5ld1NpemUgPSBvbGRTaXplIC0gMTsKLQkJCQlmaW5hbCBUZXh0Q2hhbmdlTGlzdGVuZXJbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgVGV4dENoYW5nZUxpc3RlbmVyW25ld1NpemVdOwotCi0JCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCQkJCWlmIChmVGV4dENoYW5nZUxpc3RlbmVyc1tpXSAhPSBsaXN0ZW5lcikgewotCQkJCQkJCQkvLyBjb3B5IG9sZCB0byBuZXcgaWYgaXRzIG5vdCB0aGUKLQkJCQkJCQkJLy8gb25lIHdlIGFyZSByZW1vdmluZwotCQkJCQkJCQluZXdMaXN0ZW5lcnNbaW5kZXgrK10gPSBmVGV4dENoYW5nZUxpc3RlbmVyc1tpXTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCQkJCXJ1bk9uRGlzcGxheVRocmVhZElmTmVlZGVkZShydW5uYWJsZSk7Ci0JCQkJLy8gbm93IHRoYXQgd2UgaGF2ZSBhIG5ldyBhcnJheSwgbGV0J3MKLQkJCQkvLyBzd2l0Y2ggaXQgZm9yIHRoZSBvbGQgb25lCi0JCQkJZlRleHRDaGFuZ2VMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIHRoZSB0ZXh0IHdpdGggIm5ld1RleHQiIHN0YXJ0aW5nIGF0IHBvc2l0aW9uICJzdGFydCIgZm9yIGEKLQkgKiBsZW5ndGggb2YgInJlcGxhY2VMZW5ndGgiLgotCSAqIDxwPgotCSAqIEltcGxlbWVudG9ycyBoYXZlIHRvIG5vdGlmeSBUZXh0Q2hhbmdlZCBsaXN0ZW5lcnMgYWZ0ZXIgdGhlIGNvbnRlbnQgaGFzCi0JICogYmVlbiB1cGRhdGVkLiBUaGUgVGV4dENoYW5nZWRFdmVudCBzaG91bGQgYmUgc2V0IGFzIGZvbGxvd3M6Ci0JICogPHVsPgotCSAqIDxsaT5ldmVudC50eXBlID0gU1dULlRleHRSZXBsYWNlZAotCSAqIDxsaT5ldmVudC5zdGFydCA9IHN0YXJ0IG9mIHRoZSByZXBsYWNlZCB0ZXh0Ci0JICogPGxpPmV2ZW50Lm51bVJlcGxhY2VkTGluZXMgPSBudW1iZXIgb2YgcmVwbGFjZWQgbGluZXMKLQkgKiA8bGk+ZXZlbnQubnVtTmV3TGluZXMgPSBudW1iZXIgb2YgbmV3IGxpbmVzCi0JICogPGxpPmV2ZW50LnJlcGxhY2VkTGVuZ3RoID0gbGVuZ3RoIG9mIHRoZSByZXBsYWNlZCB0ZXh0Ci0JICogPGxpPmV2ZW50Lm5ld0xlbmd0aCA9IGxlbmd0aCBvZiB0aGUgbmV3IHRleHQKLQkgKiA8L3VsPgotCSAqIDxiPk5PVEU6IDwvYj4gbnVtTmV3TGluZXMgaXMgdGhlIG51bWJlciBvZiBpbnNlcnRlZCBsaW5lcyBhbmQKLQkgKiBudW1SZXBsYWNlZExpbmVzIGlzIHRoZSBudW1iZXIgb2YgZGVsZXRlZCBsaW5lcyBiYXNlZCBvbiB0aGUgY2hhbmdlCi0JICogdGhhdCBvY2N1cnMgdmlzdWFsbHkuIEZvciBleGFtcGxlOgotCSAqIDx1bD4KLQkgKiA8bGk+KHJlcGxhY2VkVGV4dCwgbmV3VGV4dCkgPT0+IChudW1SZXBsYWNlZExpbmVzLCBudW1OZXdMaW5lcykKLQkgKiA8bGk+KCIiLCAiXG4iKSA9PT4gKDAsIDEpCi0JICogPGxpPigiXG5cbiIsICJhIikgPT0+ICgyLCAwKQotCSAqIDxsaT4oImEiLCAiXG5cbiIpID09PiAoMCwgMikKLQkgKiA8bGk+KCJcbiIsICIiKSA9PT4gKDEsIDApCi0JICogPC91bD4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICBzdGFydCBvZmZzZXQgb2YgdGV4dCB0byByZXBsYWNlLCBub25lIG9mIHRoZSBvZmZzZXRzIGluY2x1ZGUKLQkgKiAgICAgICAgICAgIGRlbGltaXRlcnMgb2YgcHJlY2VlZGluZyBsaW5lcywgb2Zmc2V0IDAgaXMgdGhlIGZpcnN0Ci0JICogICAgICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIGRvY3VtZW50Ci0JICogQHBhcmFtIHJlcGxhY2VMZW5ndGgKLQkgKiAgICAgICAgICAgIHN0YXJ0IG9mZnNldCBvZiB0ZXh0IHRvIHJlcGxhY2UKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqICAgICAgICAgICAgc3RhcnQgb2Zmc2V0IG9mIHRleHQgdG8gcmVwbGFjZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2VUZXh0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgcmVwbGFjZUxlbmd0aCwgU3RyaW5nIHRleHQpIHsKLQotCQlpZiAoZ2V0UGFyZW50RG9jdW1lbnQoKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCS8vIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQgaW5pdGlhdGVzIHRoZSAiY2hhbmdpbmciCi0JCQkvLyBhbmQgImNoYW5nZWQiIGV2ZW50cy4KLQkJCS8vIHRoZXkgYXJlIGJvdGggZmlyZWQgYnkgdGhlIHRpbWUgdGhpcyBtZXRob2QKLQkJCS8vIHJldHVybnMuCi0JCQlJUmVnaW9uIHJlZ2lvbiA9IGdldFByb2plY3Rpb25Ub01hc3RlclJlZ2lvbihuZXcgUmVnaW9uKHN0YXJ0LCByZXBsYWNlTGVuZ3RoKSk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGdldFBhcmVudERvY3VtZW50KCkpLnJlcGxhY2VUZXh0KHRoaXMsIHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpLCB0ZXh0KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJLy8gZGVmYXVsdCBpcyB0byBqdXN0IHRyeSBhbmQgcmVwbGFjZSB0ZXh0IHJhbmdlIGluIGN1cnJlbnQgZG9jdW1lbnQKLQkJdHJ5IHsKLQkJCWdldERvY3VtZW50KCkucmVwbGFjZShzdGFydCwgcmVwbGFjZUxlbmd0aCwgdGV4dCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50QWRhcHRlckV4dGVuc2lvbiNyZXN1bWVGb3J3YXJkaW5nRG9jdW1lbnRDaGFuZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN1bWVGb3J3YXJkaW5nRG9jdW1lbnRDaGFuZ2VzKCkgewotCi0JCS8vIGZyb20gcmUtcmVhZGluZyB0aGUgdGV4dFNldCBBUEkgaW4gU3R5bGVkVGV4dCwgd2UKLQkJLy8gbXVzdCBjYWxsCi0JCS8vIHRleHRTZXQgaWYgYWxsIHRoZSBjb250ZW50cyBjaGFuZ2VkLiBJZiBhbGwgdGhlCi0JCS8vIGNvbnRlbnRzIGRpZAotCQkvLyBub3QgY2hhbmdlLCB3ZSBuZWVkIHRvIGNhbGwgdGhlIHBhaXIgb2YgQVBJcywKLQkJLy8gdGV4dENoYW5naW5nIGFuZAotCQkvLyB0ZXh0Q2hhbmdlZC4gU28sIGlmIHdlIGV2ZXIga2VlcCBjYXJlZnVsIHRyYWNrIG9mCi0JCS8vIGNoYW5nZXMKLQkJLy8gZHVyaW5nIHN0b3AgZm9yd2FyZGluZyBhbmQgcmVzdW1lIGZvcndhcmRpbmcsIHdlCi0JCS8vIGNhbgotCQkvLyBpbnZlc3RpZ2F0ZSBjaGFuZ2UgbWFrZSB1c2Ugb2YgdGhlIHBhaXIgb2YgQVBJcy4KLQkJZlN0b3BSZWxheWluZ0NoYW5nZXNSZXF1ZXN0cy0tOwotCQlpZiAoZlN0b3BSZWxheWluZ0NoYW5nZXNSZXF1ZXN0cyA9PSAwKSB7Ci0JCQkvLyBmSXNGb3J3YXJkaW5nPSB0cnVlOwotCQkJZkRvY3VtZW50Q2xvbmUgPSBudWxsOwotCQkJZk9yaWdpbmFsQ29udGVudCA9IG51bGw7Ci0JCQlmT3JpZ2luYWxMaW5lRGVsaW1pdGVycyA9IG51bGw7Ci0JCQkvLyBmaXJlVGV4dFNldCgpOwotCQkJcmVsYXlUZXh0U2V0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzICdSdW5uYWJsZScgc2hvdWxkIGJlIHZlcnkgYnJpZWYsIGFuZCBzaG91bGQgbm90ICJjYWxsIG91dCIgdG8KLQkgKiBvdGhlciBjb2RlIHdoaWNoIGl0c2VsZiBtaWdodCBjYWxsIHN5bmNFeGVjLCBvciBkZWFkbG9jayBtaWdodCBvY2N1ci4KLQkgKiAKLQkgKiBAcGFyYW0gcgotCSAqLwotCXByaXZhdGUgdm9pZCBydW5PbkRpc3BsYXlUaHJlYWRJZk5lZWRlZGUoUnVubmFibGUgcikgewotCQkvLyBpZiB0aGVyZSBpcyBubyBEaXNwbGF5IGF0IGFsbCAodGhhdCBpcywgcnVubmluZyBoZWFkbGVzcyksCi0JCS8vIG9yIGlmIHdlIGFyZSBhbHJlYWR5IHJ1bm5pbmcgb24gdGhlIGRpc3BsYXkgdGhyZWFkLCB0aGVuCi0JCS8vIHNpbXBseSBleGVjdXRlIHRoZSBydW5uYWJsZS4KLQkJaWYgKGdldERpc3BsYXkoKSA9PSBudWxsIHx8IChUaHJlYWQuY3VycmVudFRocmVhZCgpID09IGdldERpc3BsYXkoKS5nZXRUaHJlYWQoKSkpIHsKLQkJCXIucnVuKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBvdGhlcndpc2UgZm9yY2UgdGhlIHJ1bm5hYmxlIHRvIHJ1biBvbiB0aGUgZGlzcGxheSB0aHJlYWQuCi0JCQkvLwotCQkJLy8gSXRzIHVuY2xlYXIgaWYgd2UgbmVlZCB0aGlzIGF0IGFsbCwgb25jZQotCQkJLy8gd2UgImZvcmNlIiBkb2N1bWVudCB1cGRhdGUgdG8gYWx3YXlzIHRha2UgcGxhY2Ugb24gZGlzcGxheQotCQkJLy8gdGhyZWFkLgotCQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jIGluc3RhbmNlb2YgSUxvY2thYmxlKSB7Ci0KLQkJCQlJTG9jayBsb2NrID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlsb2NrID0gKChJTG9ja2FibGUpIGRvYykuZ2V0TG9ja09iamVjdCgpOwotCQkJCQlsb2NrLmFjcXVpcmUoKTsKLQkJCQkJZ2V0RGlzcGxheSgpLnN5bmNFeGVjKHIpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKGxvY2sgIT0gbnVsbCkgewotCQkJCQkJbG9jay5yZWxlYXNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBlbHNlLCBpZ25vcmUhLCBzaW5jZSByaXNrIG9mIGRlYWRsb2NrCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm9uIGxvY2thYmxlIGRvY3VtZW50IHVzZWQgZm9yIHN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld01vZGVsCi0JICovCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0KLQkJaWYgKGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJZ2V0RG9jdW1lbnQoKS5yZW1vdmVQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXIoaW50ZXJuYWxEb2N1bWVudExpc3RlbmVyKTsKLQkJfQotCQlsYXN0RXZlbnQgPSBudWxsOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBQcm9qZWN0aW9uRG9jdW1lbnQpIHsKLQkJCWZDaGlsZERvY3VtZW50ID0gKFByb2plY3Rpb25Eb2N1bWVudCkgZG9jdW1lbnQ7Ci0JCQlfc2V0RG9jdW1lbnQoZkNoaWxkRG9jdW1lbnQuZ2V0TWFzdGVyRG9jdW1lbnQoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmQ2hpbGREb2N1bWVudCA9IG51bGw7Ci0JCQlfc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQl9Ci0JCWlmIChnZXREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCWdldERvY3VtZW50KCkuYWRkUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyKGludGVybmFsRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNzZXRUZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgc3RyaW5nKSB7Ci0KLQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpIHsKLQkJCWZEb2N1bWVudENsb25lID0gbnVsbDsKLQkJCWZPcmlnaW5hbENvbnRlbnQgPSBnZXREb2N1bWVudCgpLmdldCgpOwotCQkJZk9yaWdpbmFsTGluZURlbGltaXRlcnMgPSBnZXREb2N1bWVudCgpLmdldExlZ2FsTGluZURlbGltaXRlcnMoKTsKLQkJfQotCQllbHNlIGlmIChnZXRQYXJlbnREb2N1bWVudCgpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJKChJU3RydWN0dXJlZERvY3VtZW50KSBnZXREb2N1bWVudCgpKS5zZXRUZXh0KHRoaXMsIHN0cmluZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlnZXREb2N1bWVudCgpLnNldChzdHJpbmcpOwotCQl9Ci0JCXJlbGF5VGV4dFNldCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdhcyBhZGRlZCB0byBtYWtlIHRlc3RpbmcgZWFzaWVyLiBOb3JtYWxseSwgdGhlIHdpZGdldCBpcwotCSAqIHNwZWNpZmllZCBvbiB0aGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2lkZ2V0KFN0eWxlZFRleHQgd2lkZ2V0KSB7Ci0KLQkJZlN0eWxlZFRleHRXaWRnZXQgPSB3aWRnZXQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEFkYXB0ZXJFeHRlbnNpb24jc3RvcEZvcndhcmRpbmdEb2N1bWVudENoYW5nZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BGb3J3YXJkaW5nRG9jdW1lbnRDaGFuZ2VzKCkgewotCi0JCWZTdG9wUmVsYXlpbmdDaGFuZ2VzUmVxdWVzdHMrKzsKLQkJLy8gb25seSBuZWVkIHRvIHRha2Ugc25hcHNob3Qgb24gZmlyc3QgcmVxdWVzdAotCQlpZiAoZlN0b3BSZWxheWluZ0NoYW5nZXNSZXF1ZXN0cyA9PSAxKSB7Ci0JCQlmRG9jdW1lbnRDbG9uZSA9IG51bGw7Ci0JCQlmT3JpZ2luYWxDb250ZW50ID0gZ2V0RG9jdW1lbnQoKS5nZXQoKTsKLQkJCWZPcmlnaW5hbExpbmVEZWxpbWl0ZXJzID0gZ2V0RG9jdW1lbnQoKS5nZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZExpbmVDaGFuZ2VIb3Zlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRMaW5lQ2hhbmdlSG92ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY5YWFkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZExpbmVDaGFuZ2VIb3Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuTGluZUNoYW5nZUhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIEVzY2FwZXMgZGlmZiBob3ZlciBwcmVzZW50YXRpb24gdGV4dCAoY29udmVydHMgPCB0byAmbHQ7ID4gdG8gJmd0OyBldGMuLi4pCi0gKiBzbyB0aGF0IGh0bWwgaW4gdGhlIGRpZmYgZmlsZSAoZGlzcGxheWVkIGluIGhvdmVyKSBpc24ndCBwcmVzZW50ZWQgYXMgc3R5bGUKLSAqIChib2xkLCBpdGFsaWMsIGNvbG9ycywgZXRjLi4uKQotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZExpbmVDaGFuZ2VIb3ZlciBleHRlbmRzIExpbmVDaGFuZ2VIb3ZlciB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbkhvdmVyRXh0ZW5zaW9uI2dldEhvdmVyQ29udHJvbENyZWF0b3IoKQotCSAqLwotCXB1YmxpYyBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvciBnZXRIb3ZlckNvbnRyb2xDcmVhdG9yKCkgewotCQkvLyB1c2UgdGhlIGRlZmF1bHQgaW5mb3JtYXRpb24gY29udHJvbCBjcmVhdG9yIHRoYXQganVzdCBkaXNwbGF5cyB0ZXh0Ci0JCS8vIGFzIHRleHQsIG5vdCBodG1sIGNvbnRlbnQKLQkJLy8gYmVjYXVzZSB0aGVyZSBpcyBubyBzcGVjaWFsIGh0bWwgdGhhdCBzaG91bGQgYmUgcHJlc2VudGVkIHdoZW4ganVzdAotCQkvLyBzaG93aW5nIGRpZmYKLQkJLy8gaW4gdGhlIGZ1dHVyZSwgc291cmNldmlld2VyIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgdGhpcyBwbGFpbgotCQkvLyB0ZXh0IGNvbnRyb2wgbGlrZSBqYXZhIHVzZXMKLQkJLy8gU291cmNlVmlld2VySW5mb3JtYXRpb25Db250cm9sCi0JCXJldHVybiBuZXcgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoKSB7Ci0JCQlwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbCBjcmVhdGVJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50KSB7Ci0JCQkJcmV0dXJuIG5ldyBEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sKHBhcmVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZE1hcmtlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdiMTk2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZE1hcmtlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvblByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuVGVtcG9yYXJ5QW5ub3RhdGlvbjsKLQotCi0vKioKLSAqIFRoaXMgaXMgb3ZlcnJpZGRlbiB0byBnZXQgYXJvdW5kIHRoZSBwcm9ibGVtIG9mIGJlaW5nIHJlZ2lzdGVyZWQgYXMgYQotICogb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uY29yZS5wcm9ibGVtbWFya2VyIHJhdGhlciB0aGFuIGEKLSAqIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2UucHJvYmxlbW1hcmtlciBjYXVzaW5nIGFsbCBwcm9ibGVtcyB0byBiZSBza2lwcGVkCi0gKiBpbiB0aGUgT3ZlcnZpZXdSdWxlcgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZE1hcmtlckFubm90YXRpb24gZXh0ZW5kcyBNYXJrZXJBbm5vdGF0aW9uIGltcGxlbWVudHMgSUFubm90YXRpb25QcmVzZW50YXRpb24gewotCS8vIGNvbnRyb2xzIGlmIGljb24gc2hvdWxkIGJlIHBhaW50ZWQgZ3JheQotCXByaXZhdGUgYm9vbGVhbiBmSXNHcmF5ZWQgPSBmYWxzZTsKLQlTdHJpbmcgZkFubm90YXRpb25UeXBlID0gbnVsbDsKLQotCVN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uKElNYXJrZXIgbWFya2VyKSB7Ci0JCXN1cGVyKG1hcmtlcik7Ci0JfQotCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRBbm5vdGF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIGZBbm5vdGF0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBFdmVudHVhbGx5IHdpbGwgaGF2ZSB0byB1c2UgSUFubm90YXRpb25QcmVzZW50YXRpb24gJgotCSAqIElBbm5vdGF0aW9uRXh0ZW5zaW9uCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLk1hcmtlckFubm90YXRpb24jZ2V0SW1hZ2Uob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheSkKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJaWYgKGZBbm5vdGF0aW9uVHlwZSA9PSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX0VSUk9SKSB7Ci0JCQlpbWFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19FUlJPUl9UU0spOwotCQl9Ci0JCWVsc2UgaWYgKGZBbm5vdGF0aW9uVHlwZSA9PSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX1dBUk5JTkcpIHsKLQkJCWltYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX1dBUk5fVFNLKTsKLQkJfQotCQllbHNlIGlmIChmQW5ub3RhdGlvblR5cGUgPT0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9JTkZPKSB7Ci0JCQlpbWFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19JTkZPX1RTSyk7Ci0JCX0KLQotCQlpZiAoaW1hZ2UgIT0gbnVsbCAmJiBpc0dyYXllZCgpKQotCQkJc2V0SW1hZ2UoZ2V0R3JheUltYWdlKGRpc3BsYXksIGltYWdlKSk7Ci0JCWVsc2UKLQkJCXNldEltYWdlKGltYWdlKTsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2UoZGlzcGxheSk7Ci0JfQotCi0JcHJpdmF0ZSBJbWFnZSBnZXRHcmF5SW1hZ2UoRGlzcGxheSBkaXNwbGF5LCBJbWFnZSBpbWFnZSkgewotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJU3RyaW5nIGtleSA9IEludGVnZXIudG9TdHJpbmcoaW1hZ2UuaGFzaENvZGUoKSk7Ci0JCQkvLyBtYWtlIHN1cmUgd2UgY2FjaGUgdGhlIGdyYXkgaW1hZ2UKLQkJCUltYWdlIGdyYXlJbWFnZSA9IEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsKLQkJCWlmIChncmF5SW1hZ2UgPT0gbnVsbCkgewotCQkJCWdyYXlJbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCBpbWFnZSwgU1dULklNQUdFX0dSQVkpOwotCQkJCUpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKS5wdXQoa2V5LCBncmF5SW1hZ2UpOwotCQkJfQotCQkJaW1hZ2UgPSBncmF5SW1hZ2U7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzR3JheWVkKCkgewotCQlyZXR1cm4gZklzR3JheWVkOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHNldEdyYXllZChib29sZWFuIGdyYXllZCkgewotCQlmSXNHcmF5ZWQgPSBncmF5ZWQ7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFubm90YXRpb24ncyBpY29uIHJlcHJlc2VudGF0aW9uIGFuZCBpdHMgZHJhd2luZyBsYXllcgotCSAqIGJhc2VkIHVwb24gdGhlIHByb3BlcnRpZXMgb2YgdGhlIHVuZGVybHlpbmcgbWFya2VyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRBbm5vdGF0aW9uVHlwZSgpIHsKLQotCQlJTWFya2VyIG1hcmtlciA9IGdldE1hcmtlcigpOwotCQlmQW5ub3RhdGlvblR5cGUgPSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX1VOS05PV047Ci0JCXRyeSB7Ci0JCQlpZiAobWFya2VyLmlzU3VidHlwZU9mKElNYXJrZXIuUFJPQkxFTSkpIHsKLQkJCQlpbnQgc2V2ZXJpdHkgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIC0xKTsKLQkJCQlzd2l0Y2ggKHNldmVyaXR5KSB7Ci0JCQkJCWNhc2UgSU1hcmtlci5TRVZFUklUWV9FUlJPUiA6Ci0JCQkJCQlmQW5ub3RhdGlvblR5cGUgPSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX0VSUk9SOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HIDoKLQkJCQkJCWZBbm5vdGF0aW9uVHlwZSA9IFRlbXBvcmFyeUFubm90YXRpb24uQU5OT1RfV0FSTklORzsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElNYXJrZXIuU0VWRVJJVFlfSU5GTyA6Ci0JCQkJCQlmQW5ub3RhdGlvblR5cGUgPSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX0lORk87Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2Q2YmFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuTWFya2VyVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQuSUJyZWFrcG9pbnRDb25zdGFudHM7Ci0KLQotLyoqCi0gKiBTb3VyY2UgZWRpdG9yIHJlc291cmNlIG1hcmtlciBhbm5vdGF0aW9uIG1vZGVsIGltcGxlbWVudGF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWwgZXh0ZW5kcyBSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbCB7Ci0JLyoqCi0JICogTG9hZGluZyBvZiBtYXJrZXJzIHdoZW4gd29ya2luZyB3aXRoIG5vbi1JUmVzb3VyY2VzIGlzIGFjY29tcGxpc2hlZCBieQotCSAqIGFkZGluZyB0aGUgbWFya2VycyB0byB0aGUgd29ya3NwYWNlIHJvb3Qgd2l0aCBhbiBhZGRpdGlvbmFsIGtleSwgd2hvc2UKLQkgKiB2YWx1ZSB1c2VzICcvJyBmb3Igc2VnbWVudCBzZXBhcmF0b3JzIHdoZW4gcmVwcmVzZW50aW5nIHBhdGhzLAotCSAqIGRldGVybWluaW5nIHdoZXRoZXIgdGhleSdyZSBhZGRlZCBpbnRvIHRoZSBhbm5vdGF0aW9uIG1vZGVsLgotCSAqIAotCSAqIFNldHRlcnMgb2YgdGhpcyBhdHRyaWJ1dGUgc2hvdWxkIHVzZSAnLydmb3Igc2VnbWVudCBzZXBhcmF0b3JzIHdoZW4KLQkgKiByZXByZXNlbnRpbmcgcGF0aHMuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VDT05EQVJZX0lEX0tFWSA9IElCcmVha3BvaW50Q29uc3RhbnRzLlJFU09VUkNFX1BBVEg7Ci0JCi0JcHJvdGVjdGVkIElSZXNvdXJjZSBmTWFya2VyUmVzb3VyY2U7Ci0JcHJvdGVjdGVkIFN0cmluZyBmU2Vjb25kYXJ5TWFya2VyQXR0cmlidXRlVmFsdWU7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWwoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXN1cGVyKHJlc291cmNlKTsKLQkJZk1hcmtlclJlc291cmNlID0gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbChJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBzZWNvbmRhcnlJRCkgewotCQlzdXBlcihyZXNvdXJjZSk7Ci0JCWZNYXJrZXJSZXNvdXJjZSA9IHJlc291cmNlOwotCQlmU2Vjb25kYXJ5TWFya2VyQXR0cmlidXRlVmFsdWUgPSBzZWNvbmRhcnlJRDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWwjY3JlYXRlTWFya2VyQW5ub3RhdGlvbihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyKQotCSAqLwotCXByb3RlY3RlZCBNYXJrZXJBbm5vdGF0aW9uIGNyZWF0ZU1hcmtlckFubm90YXRpb24oSU1hcmtlciBtYXJrZXIpIHsKLQkJLyoKLQkJICogV2UgbmVlZCB0byBkbyBzb21lIHNwZWNpYWwgcHJvY2Vzc2luZyBpZiBtYXJrZXIgaXMgYSB2YWxpZGF0aW9uCi0JCSAqIChha2EgcHJvYmxlbSkgbWFya2VyIG9yIGlmIG1hcmtlciBpcyBhIGJyZWFrcG9pbnQgbWFya2VyIHNvIGNyZWF0ZQotCQkgKiBhIHNwZWNpYWwgbWFya2VyIGFubm90YXRpb24gZm9yIHRob3NlIG1hcmtlcnMuIE90aGVyd2lzZSwgdXNlCi0JCSAqIGRlZmF1bHQuCi0JCSAqLwotCQlpZiAoTWFya2VyVXRpbGl0aWVzLmlzTWFya2VyVHlwZShtYXJrZXIsIElNYXJrZXIuUFJPQkxFTSkpIHsKLQkJCXJldHVybiBuZXcgU3RydWN0dXJlZE1hcmtlckFubm90YXRpb24obWFya2VyKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlTWFya2VyQW5ub3RhdGlvbihtYXJrZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdE1hcmtlckFubm90YXRpb25Nb2RlbCNnZXRNYXJrZXJQb3NpdGlvbihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyKQotCSAqLwotCXB1YmxpYyBQb3NpdGlvbiBnZXRNYXJrZXJQb3NpdGlvbihJTWFya2VyIG1hcmtlcikgewotCQlQb3NpdGlvbiBwb3MgPSBzdXBlci5nZXRNYXJrZXJQb3NpdGlvbihtYXJrZXIpOwotCi0JCS8vIGlmICgocG9zID09IG51bGwgfHwgcG9zLmdldExlbmd0aCgpID09IDApICYmIG1hcmtlci5nZXRUeXBlKCkgPT0KLQkJLy8gSUludGVybmFsRGVidWdVSUNvbnN0YW50cy5BTk5fSU5TVFJfUE9JTlRFUl9DVVJSRU5UKSB7Ci0JCWlmIChwb3MgPT0gbnVsbCB8fCBwb3MuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJLy8gV2UgcHJvYmFibHkgc2hvdWxkIGNyZWF0ZSBwb3NpdGlvbiBmcm9tIG1hcmtlciBpZiBtYXJrZXIKLQkJCS8vIGF0dHJpYnV0ZXMgc3BlY2lmeSBhIHZhbGlkIHBvc2l0aW9uCi0JCQlwb3MgPSBjcmVhdGVQb3NpdGlvbkZyb21NYXJrZXIobWFya2VyKTsKLQkJfQotCi0JCXJldHVybiBwb3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsI2lzQWNjZXB0YWJsZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQWNjZXB0YWJsZShJTWFya2VyIG1hcmtlcikgewotCQl0cnkgewotCQkJT2JqZWN0IGF0dHIgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKElCcmVha3BvaW50Q29uc3RhbnRzLkFUVFJfSElEREVOKTsKLQkJCWlmIChhdHRyICE9IG51bGwgJiYgQm9vbGVhbi5UUlVFLmVxdWFscyhhdHRyKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQotCQlpZiAoZlNlY29uZGFyeU1hcmtlckF0dHJpYnV0ZVZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gc3VwZXIuaXNBY2NlcHRhYmxlKG1hcmtlcik7Ci0JCVN0cmluZyBtYXJrZXJTZWNvbmRhcnlNYXJrZXJBdHRyaWJ1dGVWYWx1ZSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoU0VDT05EQVJZX0lEX0tFWSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gaXNTYW1lRmlsZSA9IGZTZWNvbmRhcnlNYXJrZXJBdHRyaWJ1dGVWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKG1hcmtlclNlY29uZGFyeU1hcmtlckF0dHJpYnV0ZVZhbHVlKTsKLQkJcmV0dXJuIHN1cGVyLmlzQWNjZXB0YWJsZShtYXJrZXIpICYmIGlzU2FtZUZpbGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU1YjIzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgbnNkCi0gKiAKLSAqIFVzZWQgYnkgdGhlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuYW5ub3RhdGlvbk1vZGVsQ3JlYXRpb24gZXh0ZW5zaW9uCi0gKiBwb2ludAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeSBleHRlbmRzIFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeSB7Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JQW5ub3RhdGlvbk1vZGVsRmFjdG9yeSNjcmVhdGVBbm5vdGF0aW9uTW9kZWwob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoKQotCSAqLwotCXB1YmxpYyBJQW5ub3RhdGlvbk1vZGVsIGNyZWF0ZUFubm90YXRpb25Nb2RlbChJUGF0aCBsb2NhdGlvbikgewotCQlJQW5ub3RhdGlvbk1vZGVsIG1vZGVsID0gbnVsbDsKLQkJSUZpbGUgZmlsZSA9IEZpbGVCdWZmZXJzLmdldFdvcmtzcGFjZUZpbGVBdExvY2F0aW9uKGxvY2F0aW9uKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJbW9kZWwgPSBuZXcgU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsKGZpbGUpOwotCQl9Ci0JCWVsc2UgewotCQkJbW9kZWwgPSBuZXcgU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIGxvY2F0aW9uLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSG92ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25Ib3Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjRhM2Y3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25Ib3Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLnRleHQuaHRtbC5IVE1MUHJpbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5EZWZhdWx0QW5ub3RhdGlvbkhvdmVyOwotCi0vKioKLSAqIERldGVybWluZXMgYWxsIG1lc3NhZ2VzIGZvciB0aGUgZ2l2ZW4gbGluZSBhbmQgY29sbGVjdHMsIGNvbmNhdGVuYXRlcywgYW5kCi0gKiBmb3JtYXRzIHRoZW0gaW4gSFRNTC4gVXNlIG9mIHRoZSBpbnRlcm5hbCBIVE1MUHJpbnRlciB3YXMgb2JzZXJ2ZWQgaW4KLSAqIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkhUTUxBbm5vdGF0aW9uSG92ZXIgLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSG92ZXIgZXh0ZW5kcyBEZWZhdWx0QW5ub3RhdGlvbkhvdmVyIHsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25Ib3ZlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSG92ZXIoYm9vbGVhbiBzaG93TGluZU51bWJlcikgewotCQlzdXBlcihzaG93TGluZU51bWJlcik7Ci0JfQotCi0JLyoKLQkgKiBGb3JtYXRzIGEgbWVzc2FnZSBhcyBIVE1MIHRleHQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmb3JtYXRTaW5nbGVNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUhUTUxQcmludGVyLmFkZFBhZ2VQcm9sb2coYnVmZmVyKTsKLQkJSFRNTFByaW50ZXIuYWRkUGFyYWdyYXBoKGJ1ZmZlciwgSFRNTFByaW50ZXIuY29udmVydFRvSFRNTENvbnRlbnQobWVzc2FnZSkpOwotCQlIVE1MUHJpbnRlci5hZGRQYWdlRXBpbG9nKGJ1ZmZlcik7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIEZvcm1hdHMgc2V2ZXJhbCBtZXNzYWdlIGFzIEhUTUwgdGV4dC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdE11bHRpcGxlTWVzc2FnZXMoTGlzdCBtZXNzYWdlcykgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlIVE1MUHJpbnRlci5hZGRQYWdlUHJvbG9nKGJ1ZmZlcik7Ci0JCUhUTUxQcmludGVyLmFkZFBhcmFncmFwaChidWZmZXIsIEhUTUxQcmludGVyLmNvbnZlcnRUb0hUTUxDb250ZW50KFNTRVVJTWVzc2FnZXMuTXVsdGlwbGVfZXJyb3JzKSk7Ci0KLQkJSFRNTFByaW50ZXIuc3RhcnRCdWxsZXRMaXN0KGJ1ZmZlcik7Ci0JCVNldCBjb2xsZWN0ZWRNZXNzYWdlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUl0ZXJhdG9yIGUgPSBtZXNzYWdlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBjb252ZXJ0ZWQgPSBIVE1MUHJpbnRlci5jb252ZXJ0VG9IVE1MQ29udGVudCgoU3RyaW5nKSBlLm5leHQoKSk7Ci0JCQljb2xsZWN0ZWRNZXNzYWdlcy5hZGQoY29udmVydGVkKTsKLQkJfQotCQllID0gY29sbGVjdGVkTWVzc2FnZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlIVE1MUHJpbnRlci5hZGRCdWxsZXQoYnVmZmVyLCBlLm5leHQoKS50b1N0cmluZygpKTsKLQkJfQotCQlIVE1MUHJpbnRlci5lbmRCdWxsZXRMaXN0KGJ1ZmZlcik7Ci0KLQkJSFRNTFByaW50ZXIuYWRkUGFnZUVwaWxvZyhidWZmZXIpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLklSZWxlYXNhYmxlI3JlbGVhc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRUZXh0TGluZUJyZWFraW5nUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFRleHRMaW5lQnJlYWtpbmdSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZlM2RlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFRleHRMaW5lQnJlYWtpbmdSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci0KLS8qCi0gKiBOb3QgYSByZWFsIHJlYWRlci4gQ291bGQgY2hhbmdlIGlmIHJlcXVlc3RlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRMaW5lQnJlYWtpbmdSZWFkZXIgewotCXByaXZhdGUgR0MgZkdDOwotCXByaXZhdGUgaW50IGZJbmRleDsKLQlwcml2YXRlIFN0cmluZyBmTGluZTsKLQlwcml2YXRlIGludCBmTWF4V2lkdGg7Ci0KLQlwcml2YXRlIEJ1ZmZlcmVkUmVhZGVyIGZSZWFkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZGVyIHRoYXQgYnJlYWtzIGFuIGlucHV0IHRleHQgdG8gZml0IGluIGEgZ2l2ZW4gd2lkdGguCi0JICogCi0JICogQHBhcmFtIHJlYWRlcgotCSAqICAgICAgICAgICAgUmVhZGVyIG9mIHRoZSBpbnB1dCB0ZXh0Ci0JICogQHBhcmFtIGdjCi0JICogICAgICAgICAgICBUaGUgZ3JhcGhpYyBjb250ZXh0IHRoYXQgZGVmaW5lcyB0aGUgY3VycmVudGx5IHVzZWQgZm9udAotCSAqICAgICAgICAgICAgc2l6ZXMKLQkgKiBAcGFyYW0gbWF4TGluZVdpZHRoCi0JICogICAgICAgICAgICBUaGUgbWF4IHdpZHRoIChwaXhlcykgd2hlcmUgdGhlIHRleHQgaGFzIHRvIGZpdCBpbgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dExpbmVCcmVha2luZ1JlYWRlcihSZWFkZXIgcmVhZGVyLCBHQyBnYywgaW50IG1heExpbmVXaWR0aCkgewotCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHJlYWRlcik7Ci0JCWZHQyA9IGdjOwotCQlmTWF4V2lkdGggPSBtYXhMaW5lV2lkdGg7Ci0JCWZMaW5lID0gbnVsbDsKLQkJZkluZGV4ID0gMDsKLQl9Ci0KLQlwcml2YXRlIGludCBmaW5kTmV4dEJyZWFrSW5kZXgoaW50IGN1cnJJbmRleCkgewotCQlpbnQgY3VycldpZHRoID0gMDsKLQkJaW50IGxpbmVMZW5ndGggPSBmTGluZS5sZW5ndGgoKTsKLQotCQl3aGlsZSAoY3VyckluZGV4IDwgbGluZUxlbmd0aCkgewotCQkJY2hhciBjaCA9IGZMaW5lLmNoYXJBdChjdXJySW5kZXgpOwotCQkJaW50IG5leHRJbmRleCA9IGN1cnJJbmRleCArIDE7Ci0JCQkvLyBsZWFkaW5nIHdoaXRlc3BhY2VzIGFyZSBjb3VudGVkIHRvIHRoZSBmb2xsb3dpbmcgd29yZAotCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2gpKSB7Ci0JCQkJd2hpbGUgKG5leHRJbmRleCA8IGxpbmVMZW5ndGggJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShmTGluZS5jaGFyQXQobmV4dEluZGV4KSkpIHsKLQkJCQkJbmV4dEluZGV4Kys7Ci0JCQkJfQotCQkJfQotCQkJd2hpbGUgKG5leHRJbmRleCA8IGxpbmVMZW5ndGggJiYgIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoZkxpbmUuY2hhckF0KG5leHRJbmRleCkpKSB7Ci0JCQkJbmV4dEluZGV4Kys7Ci0JCQl9Ci0JCQlTdHJpbmcgd29yZCA9IGZMaW5lLnN1YnN0cmluZyhjdXJySW5kZXgsIG5leHRJbmRleCk7Ci0JCQlpbnQgd29yZFdpZHRoID0gZkdDLnRleHRFeHRlbnQod29yZCkueDsKLQkJCWludCBuZXh0V2lkdGggPSB3b3JkV2lkdGggKyBjdXJyV2lkdGg7Ci0JCQlpZiAobmV4dFdpZHRoID4gZk1heFdpZHRoICYmIHdvcmRXaWR0aCA8IGZNYXhXaWR0aCkgewotCQkJCXJldHVybiBjdXJySW5kZXg7Ci0JCQl9Ci0JCQljdXJyV2lkdGggPSBuZXh0V2lkdGg7Ci0JCQljdXJySW5kZXggPSBuZXh0SW5kZXg7Ci0JCX0KLQkJcmV0dXJuIGN1cnJJbmRleDsKLQl9Ci0KLQlwcml2YXRlIGludCBmaW5kV29yZEJlZ2luKGludCBpZHgpIHsKLQkJd2hpbGUgKGlkeCA8IGZMaW5lLmxlbmd0aCgpICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoZkxpbmUuY2hhckF0KGlkeCkpKSB7Ci0JCQlpZHgrKzsKLQkJfQotCQlyZXR1cm4gaWR4OwotCX0KLQotCS8qKgotCSAqIFJlYWRzIHRoZSBuZXh0IGxpbmUuIFRoZSBsZW5ndGhzIG9mIHRoZSBsaW5lIHdpbGwgbm90IGV4Y2VlZCB0aGUgZ2l2ZWQKLQkgKiBtYXhpbXVtIHdpZHRoLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVhZExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZkxpbmUgPT0gbnVsbCkgewotCQkJU3RyaW5nIGxpbmUgPSBmUmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQlpZiAobGluZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlpbnQgbGluZUxlbiA9IGZHQy50ZXh0RXh0ZW50KGxpbmUpLng7Ci0JCQlpZiAobGluZUxlbiA8IGZNYXhXaWR0aCkgewotCQkJCXJldHVybiBsaW5lOwotCQkJfQotCQkJZkxpbmUgPSBsaW5lOwotCQkJZkluZGV4ID0gMDsKLQkJfQotCQlpbnQgYnJlYWtJZHggPSBmaW5kTmV4dEJyZWFrSW5kZXgoZkluZGV4KTsKLQkJU3RyaW5nIHJlcyA9IGZMaW5lLnN1YnN0cmluZyhmSW5kZXgsIGJyZWFrSWR4KTsKLQkJaWYgKGJyZWFrSWR4IDwgZkxpbmUubGVuZ3RoKCkpIHsKLQkJCWZJbmRleCA9IGZpbmRXb3JkQmVnaW4oYnJlYWtJZHgpOwotCQl9IGVsc2UgewotCQkJZkxpbmUgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRUZXh0U2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFRleHRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4ZGMyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFRleHRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IGlzIHVzZWQgYnkgdGhlIFNvdXJjZUVkaXRvclRyZWVWaWV3ZXIgdG8gdGVsbCB0aGUKLSAqIFZpZXdlclNlbGVjdGlvbk1hbmFnZXIgdGhhdCB0aGUgc2VsZWN0aW9uIHJlYWxseSBjYW1lIGZyb20gYSB1c2VyIGNsaWNrIG9uCi0gKiB0aGUgY29udGVudCBvdXRsaW5lciwgaW5zdGVhZCBvZiBiZWluZyBzZXQgcHJvZ3JhbWF0aWNhbGx5LgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCB7Ci0KLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0U2VsZWN0aW9uQ2hhbmdlZEV2ZW50KElTZWxlY3Rpb25Qcm92aWRlciBzb3VyY2UsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKHNvdXJjZSwgc2VsZWN0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFRleHRWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkVGV4dFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmRkYzYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkVGV4dFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyRXh0ZW5zaW9uMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkZvcm1hdHRpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JQ29udGVudEZvcm1hdHRlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JRm9ybWF0dGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJlc2VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucHJvamVjdGlvbi5Qcm9qZWN0aW9uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSU92ZXJ2aWV3UnVsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVZlcnRpY2FsUnVsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSUVkaXRvclN0YXR1c0xpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLklEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLklTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLlVuZG9Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkNvbXBhdGlibGVIaWdobGlnaHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkhpZ2hsaWdodGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5SZWNvbmNpbGVySGlnaGxpZ2h0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuU3RydWN0dXJlZFJlZ2lvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGxhdGZvcm1TdGF0dXNMaW5lVXRpbDsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyIGV4dGVuZHMgUHJvamVjdGlvblZpZXdlciBpbXBsZW1lbnRzIElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHsKLQkvKiogVGV4dCBvcGVyYXRpb24gY29kZXMgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFTRSA9IFByb2plY3Rpb25WaWV3ZXIuQ09MTEFQU0VfQUxMOyAvLyBzZWUKLQkvLyBQcm9qZWN0aW9uVmlld2VyLkNPTExBUFNFX0FMTAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTEVBTlVQX0RPQ1VNRU5UID0gQkFTRSArIDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0FDVElWRV9FTEVNRU5UUyA9IEJBU0UgKyAzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9BQ1RJVkVfRUxFTUVOVFNfVEVYVCA9IFNTRVVJTWVzc2FnZXMuRm9ybWF0X0FjdGl2ZV9FbGVtZW50c19VSV87IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfRE9DVU1FTlQgPSBCQVNFICsgMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX0RPQ1VNRU5UX1RFWFQgPSBTU0VVSU1lc3NhZ2VzLkZvcm1hdF9Eb2N1bWVudF9VSV87IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DVVQgPSBTU0VVSU1lc3NhZ2VzLlRleHRfQ3V0X1VJXzsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1BBU1RFID0gU1NFVUlNZXNzYWdlcy5UZXh0X1Bhc3RlX1VJXzsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NISUZUX0xFRlQgPSBTU0VVSU1lc3NhZ2VzLlRleHRfU2hpZnRfTGVmdF9VSV87IC8vJE5PTi1OTFMtMSQgPSAiVGV4dCBTaGlmdCBMZWZ0IgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NISUZUX1JJR0hUID0gU1NFVUlNZXNzYWdlcy5UZXh0X1NoaWZ0X1JpZ2h0X1VJXzsgLy8kTk9OLU5MUy0xJCA9ICJUZXh0IFNoaWZ0IFJpZ2h0IgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVFJBQ0VfRVhDRVBUSU9OUyA9IHRydWU7Ci0KLQkvKgotCSAqIE1heCBsZW5ndGggb2YgY2hhcnMgdG8gZm9ybWF0IGJlZm9yZSBpdCBpcyBjb25zaWRlcmVkIGEgImJpZyBmb3JtYXQiCi0JICogVGhpcyBpcyB1c2VkIHRvIGluZGljYXRpb24gYSBzbWFsbCB1bnJlc3RyaWN0ZWQgcmV3cml0ZSBzZXNzaW9uLgotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IE1BWF9TTUFMTF9GT1JNQVRfTEVOR1RIID0gMTAwMDsKLQlwcml2YXRlIGJvb2xlYW4gZkJhY2tncm91bmR1cGRhdGVJblByb2dyZXNzOwotCXByaXZhdGUgU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlciBmQ29udGVudENsZWFudXBIYW5kbGVyID0gbnVsbDsKLQkvL3ByaXZhdGUgSURvY3VtZW50QWRhcHRlciBmRG9jQWRhcHRlcjsKLQotCXByaXZhdGUgSGlnaGxpZ2h0ZXIgZkhpZ2hsaWdodGVyOwotCQotCXByaXZhdGUgUmVjb25jaWxlckhpZ2hsaWdodGVyIGZSZWNIaWdobGlnaHRlciA9IG51bGw7Ci0KLQkvLyBwcml2YXRlIFZpZXdlclNlbGVjdGlvbk1hbmFnZXIgZlZpZXdlclNlbGVjdGlvbk1hbmFnZXI7Ci0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGZDb25maWd1cmF0aW9uOwotCS8qCi0JICogVHJ1ZSBpZiBmb3JtYXR0ZXIgaGFzIGJlZW4gc2V0Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZGb3JtYXR0ZXJTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyI1NvdXJjZVZpZXdlcihDb21wb3NpdGUsCi0JICogICAgICBJVmVydGljYWxSdWxlciwgSU92ZXJ2aWV3UnVsZXIsIGJvb2xlYW4sIGludCkKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSVZlcnRpY2FsUnVsZXIgdmVydGljYWxSdWxlciwgSU92ZXJ2aWV3UnVsZXIgb3ZlcnZpZXdSdWxlciwgYm9vbGVhbiBzaG93QW5ub3RhdGlvbnNPdmVydmlldywgaW50IHN0eWxlcykgewotCQlzdXBlcihwYXJlbnQsIHZlcnRpY2FsUnVsZXIsIG92ZXJ2aWV3UnVsZXIsIHNob3dBbm5vdGF0aW9uc092ZXJ2aWV3LCBzdHlsZXMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBiZWVwKCkgewotCQlnZXRUZXh0V2lkZ2V0KCkuZ2V0RGlzcGxheSgpLmJlZXAoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpbkJhY2tncm91bmRVcGRhdGUoKSB7Ci0JCWZCYWNrZ3JvdW5kdXBkYXRlSW5Qcm9ncmVzcyA9IHRydWU7Ci0JCXNldFJlZHJhdyhmYWxzZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0T3BlcmF0aW9uVGFyZ2V0I2NhbkRvT3BlcmF0aW9uKGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5Eb09wZXJhdGlvbihpbnQgb3BlcmF0aW9uKSB7Ci0JCWlmIChmQmFja2dyb3VuZHVwZGF0ZUluUHJvZ3Jlc3MpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlzd2l0Y2ggKG9wZXJhdGlvbikgewotCQkJY2FzZSBDT05URU5UQVNTSVNUX1BST1BPU0FMUyA6IHsKLQkJCQkvLyAocGEpIGlmIHBvc2l0aW9uIGlzbid0IFJFQURfT05MWSAoY29udGFpbnNSZWFkT25seSgpCi0JCQkJLy8gcmV0dXJucyBmYWxzZSksCi0JCQkJLy8gT3RoZXJ3aXNlLCB5b3UgRE8gd2FudCBjb250ZW50IGFzc2lzdCAocmV0dXJuIHRydWUpCi0JCQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KCk7Ci0JCQkJaWYgKGRvYyAhPSBudWxsICYmIGRvYyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJcmV0dXJuIGlzRWRpdGFibGUoKSAmJiAoISgoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jKS5jb250YWluc1JlYWRPbmx5KGdldFNlbGVjdGVkUmFuZ2UoKS54LCAwKSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBDTEVBTlVQX0RPQ1VNRU5UIDogewotCQkJCXJldHVybiAoZkNvbnRlbnRDbGVhbnVwSGFuZGxlciAhPSBudWxsICYmIGlzRWRpdGFibGUoKSk7Ci0JCQl9Ci0JCQljYXNlIEZPUk1BVF9ET0NVTUVOVCA6Ci0JCQljYXNlIEZPUk1BVF9BQ1RJVkVfRUxFTUVOVFMgOiB7Ci0JCQkJLy8gaWYgZm9ybWF0dGVyIG5vdCBzZXQgeWV0LCBjb250ZW50Zm9ybWF0dGVyIGNhbiBiZSBudWxsCi0JCQkJcmV0dXJuICgoZkNvbnRlbnRGb3JtYXR0ZXIgIT0gbnVsbCB8fCAhZkZvcm1hdHRlclNldCkgJiYgaXNFZGl0YWJsZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuY2FuRG9PcGVyYXRpb24ob3BlcmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgYmUgaWRlbnRpY2FsIHRvIHN1cGVyY2xhc3MgdmVyc2lvbi4gUGx1cywgd2UgZ2V0IG91ciBvd24gc3BlY2lhbAotCSAqIEhpZ2hsaWdodGVyLiBQbHVzIHdlIHVuaW5zdGFsbCBiZWZvcmUgaW5zdGFsbGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmUoU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0KLQkJaWYgKGdldFRleHRXaWRnZXQoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXNldERvY3VtZW50UGFydGl0aW9uaW5nKGNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKHRoaXMpKTsKLQotCQkvLyBhbHdheXMgdW5pbnN0YWxsIGhpZ2hsaWdodGVyIGFuZCBudWxsIGl0IG91dCBvbiBuZXcgY29uZmlndXJhdGlvbgotCQlpZiAoZkhpZ2hsaWdodGVyICE9IG51bGwpIHsKLQkJCWZIaWdobGlnaHRlci51bmluc3RhbGwoKTsKLQkJCWZIaWdobGlnaHRlciA9IG51bGw7Ci0JCX0KLQotCQlpZihmUmVjSGlnaGxpZ2h0ZXIgIT0gbnVsbCkgewotCQkJZlJlY0hpZ2hsaWdodGVyLnVuaW5zdGFsbCgpOwotCQkJZlJlY0hpZ2hsaWdodGVyID0gbnVsbDsKLQkJfQotCQkKLQkJLy8gQnVnIDIzMDI5NyAtIFVuaW5zdGFsbCBwcmVzZW50YXRpb24gcmVjb25jaWxlciBpbiBwcmVwYXJhdGlvbiBvZiBhIG5ldyBvbmUKLQkJaWYoZlByZXNlbnRhdGlvblJlY29uY2lsZXIgIT0gbnVsbCkgewotCQkJZlByZXNlbnRhdGlvblJlY29uY2lsZXIudW5pbnN0YWxsKCk7Ci0JCQlmUHJlc2VudGF0aW9uUmVjb25jaWxlciA9IG51bGw7Ci0JCX0KLQotCQlJUmVjb25jaWxlciBuZXdSZWNvbmNpbGVyID0gY29uZmlndXJhdGlvbi5nZXRSZWNvbmNpbGVyKHRoaXMpOwotCi0JCWlmIChuZXdSZWNvbmNpbGVyICE9IGZSZWNvbmNpbGVyIHx8IG5ld1JlY29uY2lsZXIgPT0gbnVsbCB8fCBmUmVjb25jaWxlciA9PSBudWxsKSB7Ci0KLQkJCWlmIChmUmVjb25jaWxlciAhPSBudWxsKSB7Ci0JCQkJZlJlY29uY2lsZXIudW5pbnN0YWxsKCk7Ci0JCQl9Ci0KLQkJCWZSZWNvbmNpbGVyID0gbmV3UmVjb25jaWxlcjsKLQotCQkJaWYgKGZSZWNvbmNpbGVyICE9IG51bGwpIHsKLQkJCQlmUmVjb25jaWxlci5pbnN0YWxsKHRoaXMpOwotCQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zODU4Ci0JCQkJLy8gc3RpbGwgbmVlZCBzZXQgZG9jdW1lbnQgb24gdGhlIHJlY29uY2lsZXIgKHN0cmF0ZWdpZXMpCi0JCQkJaWYgKGZSZWNvbmNpbGVyIGluc3RhbmNlb2YgU3RydWN0dXJlZFJlZ2lvblByb2Nlc3NvcikKLQkJCQkJKChTdHJ1Y3R1cmVkUmVnaW9uUHJvY2Vzc29yKSBmUmVjb25jaWxlcikuc2V0RG9jdW1lbnQoZ2V0RG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlJQ29udGVudEFzc2lzdGFudCBuZXdBc3Npc3RhbnQgPSBjb25maWd1cmF0aW9uLmdldENvbnRlbnRBc3Npc3RhbnQodGhpcyk7Ci0JCWlmIChuZXdBc3Npc3RhbnQgIT0gZkNvbnRlbnRBc3Npc3RhbnQgfHwgbmV3QXNzaXN0YW50ID09IG51bGwgfHwgZkNvbnRlbnRBc3Npc3RhbnQgPT0gbnVsbCkgewotCQkJaWYgKGZDb250ZW50QXNzaXN0YW50ICE9IG51bGwpCi0JCQkJZkNvbnRlbnRBc3Npc3RhbnQudW5pbnN0YWxsKCk7Ci0KLQkJCWZDb250ZW50QXNzaXN0YW50ID0gbmV3QXNzaXN0YW50OwotCi0JCQlpZiAoZkNvbnRlbnRBc3Npc3RhbnQgIT0gbnVsbCkgewotCQkJCWZDb250ZW50QXNzaXN0YW50Lmluc3RhbGwodGhpcyk7Ci0JCQkJZkNvbnRlbnRBc3Npc3RhbnRJbnN0YWxsZWQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gMjQ4MDM2Ci0JCQkJLy8gZGlzYWJsZSB0aGUgY29udGVudCBhc3Npc3Qgb3BlcmF0aW9uIGlmIG5vIGNvbnRlbnQKLQkJCQkvLyBhc3Npc3RhbnQKLQkJCQllbmFibGVPcGVyYXRpb24oQ09OVEVOVEFTU0lTVF9QUk9QT1NBTFMsIGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCUlRdWlja0Fzc2lzdEFzc2lzdGFudCBxdWlja0Fzc2lzdGFudCA9IGNvbmZpZ3VyYXRpb24uZ2V0UXVpY2tBc3Npc3RBc3Npc3RhbnQodGhpcyk7Ci0JCWlmIChxdWlja0Fzc2lzdGFudCAhPSBmUXVpY2tBc3Npc3RBc3Npc3RhbnQgfHwgcXVpY2tBc3Npc3RhbnQgPT0gbnVsbCB8fCBmUXVpY2tBc3Npc3RBc3Npc3RhbnQgPT0gbnVsbCkgewotCQkJaWYgKGZRdWlja0Fzc2lzdEFzc2lzdGFudCAhPSBudWxsKQotCQkJCWZRdWlja0Fzc2lzdEFzc2lzdGFudC51bmluc3RhbGwoKTsKLQotCQkJZlF1aWNrQXNzaXN0QXNzaXN0YW50ID0gcXVpY2tBc3Npc3RhbnQ7Ci0KLQkJCWlmIChmUXVpY2tBc3Npc3RBc3Npc3RhbnQgIT0gbnVsbCkgewotCQkJCWZRdWlja0Fzc2lzdEFzc2lzdGFudC5pbnN0YWxsKHRoaXMpOwotCQkJCWZRdWlja0Fzc2lzdEFzc2lzdGFudEluc3RhbGxlZCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyAyNDgwMzYKLQkJCQkvLyBkaXNhYmxlIHRoZSBjb250ZW50IGFzc2lzdCBvcGVyYXRpb24gaWYgbm8gY29udGVudAotCQkJCS8vIGFzc2lzdGFudAotCQkJCWVuYWJsZU9wZXJhdGlvbihRVUlDS19BU1NJU1QsIGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCWZDb250ZW50Rm9ybWF0dGVyID0gY29uZmlndXJhdGlvbi5nZXRDb250ZW50Rm9ybWF0dGVyKHRoaXMpOwotCi0JCS8vIGRvIG5vdCB1bmluc3RhbGwgb2xkIGluZm9ybWF0aW9uIHByZXNlbnRlciBpZiBpdCdzIHRoZSBzYW1lCi0JCUlJbmZvcm1hdGlvblByZXNlbnRlciBuZXdJbmZvcm1hdGlvblByZXNlbnRlciA9IGNvbmZpZ3VyYXRpb24uZ2V0SW5mb3JtYXRpb25QcmVzZW50ZXIodGhpcyk7Ci0JCWlmIChuZXdJbmZvcm1hdGlvblByZXNlbnRlciA9PSBudWxsIHx8IGZJbmZvcm1hdGlvblByZXNlbnRlciA9PSBudWxsIHx8ICEobmV3SW5mb3JtYXRpb25QcmVzZW50ZXIuZXF1YWxzKGZJbmZvcm1hdGlvblByZXNlbnRlcikpKSB7Ci0JCQlpZiAoZkluZm9ybWF0aW9uUHJlc2VudGVyICE9IG51bGwpCi0JCQkJZkluZm9ybWF0aW9uUHJlc2VudGVyLnVuaW5zdGFsbCgpOwotCQkJZkluZm9ybWF0aW9uUHJlc2VudGVyID0gbmV3SW5mb3JtYXRpb25QcmVzZW50ZXI7Ci0JCQlpZiAoZkluZm9ybWF0aW9uUHJlc2VudGVyICE9IG51bGwpCi0JCQkJZkluZm9ybWF0aW9uUHJlc2VudGVyLmluc3RhbGwodGhpcyk7Ci0JCX0KLQotCQkvLyBkaXNjb25uZWN0IGZyb20gdGhlIG9sZCB1bmRvIG1hbmFnZXIgYmVmb3JlIHNldHRpbmcgdGhlIG5ldyBvbmUKLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmVW5kb01hbmFnZXIuZGlzY29ubmVjdCgpOwotCQl9Ci0JCXNldFVuZG9NYW5hZ2VyKGNvbmZpZ3VyYXRpb24uZ2V0VW5kb01hbmFnZXIodGhpcykpOwotCi0JCS8vIHJlbGVhc2Ugb2xkIGFubm90YXRpb24gaG92ZXIgYmVmb3JlIHNldHRpbmcgbmV3IG9uZQotCQlpZiAoZkFubm90YXRpb25Ib3ZlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkhvdmVyKSB7Ci0JCQkoKFN0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkhvdmVyKSBmQW5ub3RhdGlvbkhvdmVyKS5yZWxlYXNlKCk7Ci0JCX0KLQkJc2V0QW5ub3RhdGlvbkhvdmVyKGNvbmZpZ3VyYXRpb24uZ2V0QW5ub3RhdGlvbkhvdmVyKHRoaXMpKTsKLQotCQkvLyByZWxlYXNlIG9sZCBhbm5vdGF0aW9uIGhvdmVyIGJlZm9yZSBzZXR0aW5nIG5ldyBvbmUKLQkJaWYgKGZPdmVydmlld1J1bGVyQW5ub3RhdGlvbkhvdmVyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSG92ZXIpIHsKLQkJCSgoU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSG92ZXIpIGZPdmVydmlld1J1bGVyQW5ub3RhdGlvbkhvdmVyKS5yZWxlYXNlKCk7Ci0JCX0KLQkJc2V0T3ZlcnZpZXdSdWxlckFubm90YXRpb25Ib3Zlcihjb25maWd1cmF0aW9uLmdldEFubm90YXRpb25Ib3Zlcih0aGlzKSk7Ci0KLQkJZ2V0VGV4dFdpZGdldCgpLnNldFRhYnMoY29uZmlndXJhdGlvbi5nZXRUYWJXaWR0aCh0aGlzKSk7Ci0JCXNldEhvdmVyQ29udHJvbENyZWF0b3IoY29uZmlndXJhdGlvbi5nZXRJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKHRoaXMpKTsKLQotCQkvLyBpZiBoeXBlcmxpbmsgbWFuYWdlciBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIHVuaW5zdGFsbCBpdAotCQlpZiAoZkh5cGVybGlua01hbmFnZXIgIT0gbnVsbCkgewotCQkJc2V0SHlwZXJsaW5rRGV0ZWN0b3JzKG51bGwsIFNXVC5OT05FKTsKLQkJfQotCQlzZXRIeXBlcmxpbmtQcmVzZW50ZXIoY29uZmlndXJhdGlvbi5nZXRIeXBlcmxpbmtQcmVzZW50ZXIodGhpcykpOwotCQlJSHlwZXJsaW5rRGV0ZWN0b3JbXSBoeXBlcmxpbmtEZXRlY3RvcnMgPSBjb25maWd1cmF0aW9uLmdldEh5cGVybGlua0RldGVjdG9ycyh0aGlzKTsKLQkJaW50IGV2ZW50U3RhdGVNYXNrID0gY29uZmlndXJhdGlvbi5nZXRIeXBlcmxpbmtTdGF0ZU1hc2sodGhpcyk7Ci0JCXNldEh5cGVybGlua0RldGVjdG9ycyhoeXBlcmxpbmtEZXRlY3RvcnMsIGV2ZW50U3RhdGVNYXNrKTsKLQotCQlTdHJpbmdbXSB0eXBlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyh0aGlzKTsKLQotCQkvLyBjbGVhciBhdXRvaW5kZW50L2F1dG9lZGl0IHN0cmF0ZWdpZXMKLQkJZkF1dG9JbmRlbnRTdHJhdGVnaWVzID0gbnVsbDsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyB0ID0gdHlwZXNbaV07Ci0JCQlzZXRBdXRvRWRpdFN0cmF0ZWdpZXMoY29uZmlndXJhdGlvbi5nZXRBdXRvRWRpdFN0cmF0ZWdpZXModGhpcywgdCksIHQpOwotCQkJc2V0VGV4dERvdWJsZUNsaWNrU3RyYXRlZ3koY29uZmlndXJhdGlvbi5nZXREb3VibGVDbGlja1N0cmF0ZWd5KHRoaXMsIHQpLCB0KTsKLQotCQkJaW50W10gc3RhdGVNYXNrcyA9IGNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZFRleHRIb3ZlclN0YXRlTWFza3ModGhpcywgdCk7Ci0JCQlpZiAoc3RhdGVNYXNrcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzdGF0ZU1hc2tzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWludCBzdGF0ZU1hc2sgPSBzdGF0ZU1hc2tzW2pdOwotCQkJCQlzZXRUZXh0SG92ZXIoY29uZmlndXJhdGlvbi5nZXRUZXh0SG92ZXIodGhpcywgdCwgc3RhdGVNYXNrKSwgdCwgc3RhdGVNYXNrKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRUZXh0SG92ZXIoY29uZmlndXJhdGlvbi5nZXRUZXh0SG92ZXIodGhpcywgdCksIHQsIElUZXh0Vmlld2VyRXh0ZW5zaW9uMi5ERUZBVUxUX0hPVkVSX1NUQVRFX01BU0spOwotCQkJfQotCi0JCQlTdHJpbmdbXSBwcmVmaXhlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0SW5kZW50UHJlZml4ZXModGhpcywgdCk7Ci0JCQlpZiAocHJlZml4ZXMgIT0gbnVsbCAmJiBwcmVmaXhlcy5sZW5ndGggPiAwKQotCQkJCXNldEluZGVudFByZWZpeGVzKHByZWZpeGVzLCB0KTsKLQotCQkJcHJlZml4ZXMgPSBjb25maWd1cmF0aW9uLmdldERlZmF1bHRQcmVmaXhlcyh0aGlzLCB0KTsKLQkJCWlmIChwcmVmaXhlcyAhPSBudWxsICYmIHByZWZpeGVzLmxlbmd0aCA+IDApCi0JCQkJc2V0RGVmYXVsdFByZWZpeGVzKHByZWZpeGVzLCB0KTsKLQotCQkJLy8gQnVnIDIzMDI5NyAtIEFkZCBMaW5lU3R5bGVQcm92aWRlcnMgZnJvbSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gaWYKLQkJCS8vIHRoZSBkb2N1bWVudCBpcyBzZXQKLQkJCWlmKGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJCS8vIGFkZCBoaWdobGlnaHRlci9saW5lc3R5bGVwcm92aWRlcgotCQkJCUxpbmVTdHlsZVByb3ZpZGVyW10gcHJvdmlkZXJzID0gKChTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24pIGNvbmZpZ3VyYXRpb24pLmdldExpbmVTdHlsZVByb3ZpZGVycyh0aGlzLCB0KTsKLQkJCQlpZiAocHJvdmlkZXJzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcm92aWRlcnMubGVuZ3RoOyArK2opIHsKLQkJCQkJCQotCQkJCQkJaWYoZlJlY0hpZ2hsaWdodGVyID09IG51bGwpIHsKLQkJCQkJCQlmUmVjSGlnaGxpZ2h0ZXIgPSBuZXcgUmVjb25jaWxlckhpZ2hsaWdodGVyKCk7Ci0JCQkJCQkJKChTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24pIGNvbmZpZ3VyYXRpb24pLnNldEhpZ2hsaWdodGVyKGZSZWNIaWdobGlnaHRlcik7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocHJvdmlkZXJzW2pdIGluc3RhbmNlb2YgQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlcikgewotCQkJCQkJCSgoQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlcikgcHJvdmlkZXJzW2pdKS5pbml0KChJU3RydWN0dXJlZERvY3VtZW50KSBnZXREb2N1bWVudCgpLCBmUmVjSGlnaGxpZ2h0ZXIpOwotCQkJCQkJCWZSZWNIaWdobGlnaHRlci5hZGRQcm92aWRlcih0LCBwcm92aWRlcnNbal0pOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gaW5pdCB3aXRoIGNvbXBhdGliaWxpdHkgaW5zdGFuY2UKLQkJCQkJCQlpZiAoZkhpZ2hsaWdodGVyID09IG51bGwpIHsKLQkJCQkJCQkJZkhpZ2hsaWdodGVyID0gbmV3IENvbXBhdGlibGVIaWdobGlnaHRlcigpOwotCQkJCQkJCX0KLQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCAiQ29tcGF0aWJsZUhpZ2hsaWdodGVyIGluc3RhbGxpbmcgY29tcGF0aWJpbGl0eSBmb3IgIiArIHByb3ZpZGVyc1tqXS5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXByb3ZpZGVyc1tqXS5pbml0KChJU3RydWN0dXJlZERvY3VtZW50KSBnZXREb2N1bWVudCgpLCBmSGlnaGxpZ2h0ZXIpOwotCQkJCQkJCWZIaWdobGlnaHRlci5hZGRQcm92aWRlcih0LCBwcm92aWRlcnNbal0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gaW5pdGlhbGl6ZSBoaWdobGlnaHRlciBhZnRlciBsaW5lc3R5bGVwcm92aWRlcnMgd2VyZSBhZGRlZAotCQlpZiAoZkhpZ2hsaWdodGVyICE9IG51bGwpIHsKLQkJCWZIaWdobGlnaHRlci5zZXREb2N1bWVudFBhcnRpdGlvbmluZyhjb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWREb2N1bWVudFBhcnRpdGlvbmluZyh0aGlzKSk7Ci0JCQlmSGlnaGxpZ2h0ZXIuc2V0RG9jdW1lbnQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGdldERvY3VtZW50KCkpOwotCQkJZkhpZ2hsaWdodGVyLmluc3RhbGwodGhpcyk7Ci0JCX0KLQkJCi0JCWlmIChmUmVjSGlnaGxpZ2h0ZXIgIT0gbnVsbCkKLQkJCWZSZWNIaWdobGlnaHRlci5pbnN0YWxsKHRoaXMpOwotCi0JCWFjdGl2YXRlUGx1Z2lucygpOwotCi0JCWZDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKLQkJCi0JCS8vIFVwZGF0ZSB0aGUgdmlld2VyJ3MgcHJlc2VudGF0aW9uIHJlY29uY2lsZXIKLQkJZlByZXNlbnRhdGlvblJlY29uY2lsZXIgPSBjb25maWd1cmF0aW9uLmdldFByZXNlbnRhdGlvblJlY29uY2lsZXIodGhpcyk7Ci0JCQotCQlpZihmUHJlc2VudGF0aW9uUmVjb25jaWxlciAhPSBudWxsKQotCQkJZlByZXNlbnRhdGlvblJlY29uY2lsZXIuaW5zdGFsbCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiBAcGFyYW0gc3RhcnRPZmZzZXQKLQkgKiBAcGFyYW0gZW5kT2Zmc2V0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjb250YWluc1JlYWRPbmx5KElEb2N1bWVudCBkb2N1bWVudCwgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgZW5kT2Zmc2V0KSB7Ci0KLQkJaW50IHN0YXJ0ID0gc3RhcnRPZmZzZXQ7Ci0JCWludCBlbmQgPSBlbmRPZmZzZXQ7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbnVsbDsKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50OwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgUHJvamVjdGlvbkRvY3VtZW50KSB7Ci0JCQkJSURvY3VtZW50IGRvYyA9ICgoUHJvamVjdGlvbkRvY3VtZW50KSBkb2N1bWVudCkuZ2V0TWFzdGVyRG9jdW1lbnQoKTsKLQkJCQlpZiAoZG9jIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jOwotCQkJCQlpbnQgYWRqdXN0ID0gKChQcm9qZWN0aW9uRG9jdW1lbnQpIGRvY3VtZW50KS5nZXRQcm9qZWN0aW9uTWFwcGluZygpLmdldENvdmVyYWdlKCkuZ2V0T2Zmc2V0KCk7Ci0JCQkJCXN0YXJ0ID0gYWRqdXN0ICsgc3RhcnQ7Ci0JCQkJCWVuZCA9IGFkanVzdCArIGVuZDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7Ci0JCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50LmNvbnRhaW5zUmVhZE9ubHkoc3RhcnQsIGxlbmd0aCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHByZXNlbnQgZm9yIGNvbXBhdGliaWxpdHkgb25seQotCSAqLwotCXByb3RlY3RlZCBJRG9jdW1lbnRBZGFwdGVyIGNyZWF0ZURvY3VtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZURvY3VtZW50QWRhcHRlcigpOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0T3BlcmF0aW9uVGFyZ2V0I2RvT3BlcmF0aW9uKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb09wZXJhdGlvbihpbnQgb3BlcmF0aW9uKSB7Ci0KLQkJUG9pbnQgc2VsZWN0aW9uID0gZ2V0VGV4dFdpZGdldCgpLmdldFNlbGVjdGlvbigpOwotCQlpbnQgY3Vyc29yUG9zaXRpb24gPSBzZWxlY3Rpb24ueDsKLQkJaW50IHNlbGVjdGlvbkxlbmd0aCA9IHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLng7Ci0JCXN3aXRjaCAob3BlcmF0aW9uKSB7Ci0JCQljYXNlIENVVCA6Ci0JCQkJYmVnaW5SZWNvcmRpbmcoVEVYVF9DVVQsIFRFWFRfQ1VULCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQkJCQlzdXBlci5kb09wZXJhdGlvbihvcGVyYXRpb24pOwotCQkJCXNlbGVjdGlvbiA9IGdldFRleHRXaWRnZXQoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQljdXJzb3JQb3NpdGlvbiA9IHNlbGVjdGlvbi54OwotCQkJCXNlbGVjdGlvbkxlbmd0aCA9IHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLng7Ci0JCQkJZW5kUmVjb3JkaW5nKGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQQVNURSA6Ci0JCQkJYmVnaW5SZWNvcmRpbmcoVEVYVF9QQVNURSwgVEVYVF9QQVNURSwgY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JCQkJc3VwZXIuZG9PcGVyYXRpb24ob3BlcmF0aW9uKTsKLQkJCQlzZWxlY3Rpb24gPSBnZXRUZXh0V2lkZ2V0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJY3Vyc29yUG9zaXRpb24gPSBzZWxlY3Rpb24ueDsKLQkJCQlzZWxlY3Rpb25MZW5ndGggPSBzZWxlY3Rpb24ueSAtIHNlbGVjdGlvbi54OwotCQkJCWVuZFJlY29yZGluZyhjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09OVEVOVEFTU0lTVF9QUk9QT1NBTFMgOgotCQkJCS8vIG1heWJlIG5vdCBjb25maWd1cmVkPwotCQkJCWlmIChmQ29udGVudEFzc2lzdGFudCAhPSBudWxsICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkvLyBDTVZDIDI2MzI2OQotCQkJCQkvLyBuZWVkIGFuIGV4cGxpY2l0IGNoZWNrIGhlcmUgYmVjYXVzZSB0aGUKLQkJCQkJLy8gY29udGVudEFzc2lzdEFjdGlvbiBpcyBubyBsb25nZXIgYmVpbmcgdXBkYXRlZCBvbgotCQkJCQkvLyBjdXJzb3IKLQkJCQkJLy8gcG9zaXRpb24KLQkJCQkJaWYgKGNhbkRvT3BlcmF0aW9uKENPTlRFTlRBU1NJU1RfUFJPUE9TQUxTKSkgewotCQkJCQkJU3RyaW5nIGVyciA9IGZDb250ZW50QXNzaXN0YW50LnNob3dQb3NzaWJsZUNvbXBsZXRpb25zKCk7Ci0JCQkJCQlpZiAoZXJyICE9IG51bGwpIHsKLQkJCQkJCQkvLyBkb24ndCB3YW5uYSBiZWVwIGlmIHRoZXJlIGlzIG5vIGVycm9yCi0JCQkJCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5kaXNwbGF5RXJyb3JNZXNzYWdlKGVycik7Ci0JCQkJCQl9Ci0JCQkJCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmFkZE9uZVRpbWVDbGVhckxpc3RlbmVyKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJYmVlcCgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgQ09OVEVOVEFTU0lTVF9DT05URVhUX0lORk9STUFUSU9OIDoKLQkJCQlpZiAoZkNvbnRlbnRBc3Npc3RhbnQgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZXJyID0gZkNvbnRlbnRBc3Npc3RhbnQuc2hvd0NvbnRleHRJbmZvcm1hdGlvbigpOwotCQkJCQlpZiAoZXJyICE9IG51bGwpIHsKLQkJCQkJCS8vIGRvbid0IHdhbm5hIGJlZXAgaWYgdGhlcmUgaXMgbm8gZXJyb3IKLQkJCQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuZGlzcGxheUVycm9yTWVzc2FnZShlcnIpOwotCQkJCQl9Ci0JCQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuYWRkT25lVGltZUNsZWFyTGlzdGVuZXIoKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNISUZUX1JJR0hUIDoKLQkJCQliZWdpblJlY29yZGluZyhURVhUX1NISUZUX1JJR0hULCBURVhUX1NISUZUX1JJR0hULCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQkJCQl1cGRhdGVJbmRlbnRhdGlvblByZWZpeGVzKCk7Ci0JCQkJc3VwZXIuZG9PcGVyYXRpb24oU0hJRlRfUklHSFQpOwotCQkJCXNlbGVjdGlvbiA9IGdldFRleHRXaWRnZXQoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQljdXJzb3JQb3NpdGlvbiA9IHNlbGVjdGlvbi54OwotCQkJCXNlbGVjdGlvbkxlbmd0aCA9IHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLng7Ci0JCQkJZW5kUmVjb3JkaW5nKGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTSElGVF9MRUZUIDoKLQkJCQliZWdpblJlY29yZGluZyhURVhUX1NISUZUX0xFRlQsIFRFWFRfU0hJRlRfTEVGVCwgY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JCQkJdXBkYXRlSW5kZW50YXRpb25QcmVmaXhlcygpOwotCQkJCXN1cGVyLmRvT3BlcmF0aW9uKFNISUZUX0xFRlQpOwotCQkJCXNlbGVjdGlvbiA9IGdldFRleHRXaWRnZXQoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQljdXJzb3JQb3NpdGlvbiA9IHNlbGVjdGlvbi54OwotCQkJCXNlbGVjdGlvbkxlbmd0aCA9IHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLng7Ci0JCQkJZW5kUmVjb3JkaW5nKGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBGT1JNQVRfRE9DVU1FTlQgOgotCQkJCURvY3VtZW50UmV3cml0ZVNlc3Npb24gcmV3cml0ZVNlc3Npb24gPSBudWxsOwotCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJLyoKLQkJCQkJICogVGhpcyBjb21tYW5kIHdpbGwgYWN0dWFsbHkgZm9ybWF0IHNlbGVjdGlvbiBpZiB0ZXh0IGlzCi0JCQkJCSAqIHNlbGVjdGVkLCBvdGhlcndpc2UgZm9ybWF0IGVudGlyZSBkb2N1bWVudAotCQkJCQkgKi8KLQkJCQkJLy8gYmVnaW4gcmVjb3JkaW5nCi0JCQkJCWJlZ2luUmVjb3JkaW5nKEZPUk1BVF9ET0NVTUVOVF9URVhULCBGT1JNQVRfRE9DVU1FTlRfVEVYVCwgY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JCQkJCWJvb2xlYW4gZm9ybWF0RG9jdW1lbnQgPSBmYWxzZTsKLQkJCQkJSVJlZ2lvbiByZWdpb24gPSBudWxsOwotCQkJCQlQb2ludCBzID0gZ2V0U2VsZWN0ZWRSYW5nZSgpOwotCQkJCQlpZiAocy55ID4gMCkgewotCQkJCQkJLy8gb25seSBmb3JtYXQgY3VycmVudGx5IHNlbGVjdGVkIHRleHQKLQkJCQkJCXJlZ2lvbiA9IG5ldyBSZWdpb24ocy54LCBzLnkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gbm8gc2VsZWN0aW9uLCBzbyBmb3JtYXQgZW50aXJlIGRvY3VtZW50Ci0JCQkJCQlyZWdpb24gPSBnZXRNb2RlbENvdmVyYWdlKCk7Ci0JCQkJCQlmb3JtYXREb2N1bWVudCA9IHRydWU7Ci0JCQkJCX0KLQotCQkJCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkJCQlJRG9jdW1lbnRFeHRlbnNpb240IGV4dGVuc2lvbiA9IChJRG9jdW1lbnRFeHRlbnNpb240KSBkb2N1bWVudDsKLQkJCQkJCURvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlIHR5cGUgPSAoc2VsZWN0aW9uLnkgPT0gMCB8fCBzZWxlY3Rpb24ueSA+IE1BWF9TTUFMTF9GT1JNQVRfTEVOR1RIKSA/IERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRCA6IERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRF9TTUFMTDsKLQkJCQkJCXJld3JpdGVTZXNzaW9uID0gKGV4dGVuc2lvbi5nZXRBY3RpdmVSZXdyaXRlU2Vzc2lvbigpICE9IG51bGwpID8gbnVsbCA6IGV4dGVuc2lvbi5zdGFydFJld3JpdGVTZXNzaW9uKHR5cGUpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc2V0UmVkcmF3KGZhbHNlKTsKLQkJCQkJfQotCi0JCQkJCWlmIChmQ29udGVudEZvcm1hdHRlciBpbnN0YW5jZW9mIElDb250ZW50Rm9ybWF0dGVyRXh0ZW5zaW9uKSB7Ci0JCQkJCQlJQ29udGVudEZvcm1hdHRlckV4dGVuc2lvbiBleHRlbnNpb24gPSAoSUNvbnRlbnRGb3JtYXR0ZXJFeHRlbnNpb24pIGZDb250ZW50Rm9ybWF0dGVyOwotCQkJCQkJSUZvcm1hdHRpbmdDb250ZXh0IGNvbnRleHQgPSBuZXcgRm9ybWF0dGluZ0NvbnRleHQoKTsKLQkJCQkJCWNvbnRleHQuc2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfRE9DVU1FTlQsIEJvb2xlYW4udmFsdWVPZihmb3JtYXREb2N1bWVudCkpOwotCQkJCQkJY29udGV4dC5zZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9SRUdJT04sIHJlZ2lvbik7Ci0JCQkJCQlleHRlbnNpb24uZm9ybWF0KGRvY3VtZW50LCBjb250ZXh0KTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWZDb250ZW50Rm9ybWF0dGVyLmZvcm1hdChkb2N1bWVudCwgcmVnaW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChyZXdyaXRlU2Vzc2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJSURvY3VtZW50RXh0ZW5zaW9uNCBleHRlbnNpb24gPSAoSURvY3VtZW50RXh0ZW5zaW9uNCkgZG9jdW1lbnQ7Ci0JCQkJCQkJZXh0ZW5zaW9uLnN0b3BSZXdyaXRlU2Vzc2lvbihyZXdyaXRlU2Vzc2lvbik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlzZXRSZWRyYXcodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQkvLyBlbmQgcmVjb3JkaW5nCi0JCQkJCQlzZWxlY3Rpb24gPSBnZXRUZXh0V2lkZ2V0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQljdXJzb3JQb3NpdGlvbiA9IHNlbGVjdGlvbi54OwotCQkJCQkJc2VsZWN0aW9uTGVuZ3RoID0gc2VsZWN0aW9uLnkgLSBzZWxlY3Rpb24ueDsKLQkJCQkJCWVuZFJlY29yZGluZyhjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRk9STUFUX0FDVElWRV9FTEVNRU5UUyA6Ci0JCQkJcmV3cml0ZVNlc3Npb24gPSBudWxsOwotCQkJCWRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLQkJCQl0cnkgewotCQkJCQkvKgotCQkJCQkgKiBUaGlzIGNvbW1hbmQgd2lsbCBmb3JtYXQgdGhlIG5vZGUgYXQgY3Vyc29yIHBvc2l0aW9uCi0JCQkJCSAqIChhbmQgYWxsIGl0cyBjaGlsZHJlbikKLQkJCQkJICovCi0JCQkJCS8vIGJlZ2luIHJlY29yZGluZwotCQkJCQliZWdpblJlY29yZGluZyhGT1JNQVRfQUNUSVZFX0VMRU1FTlRTX1RFWFQsIEZPUk1BVF9BQ1RJVkVfRUxFTUVOVFNfVEVYVCwgY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JCQkJCUlSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJCQkJUG9pbnQgcyA9IGdldFNlbGVjdGVkUmFuZ2UoKTsKLQkJCQkJaWYgKHMueSA+IC0xKSB7Ci0JCQkJCQkvLyBvbmx5IGZvcm1hdCBub2RlIGF0IGN1cnNvciBwb3NpdGlvbgotCQkJCQkJcmVnaW9uID0gbmV3IFJlZ2lvbihzLngsIHMueSk7Ci0JCQkJCX0KLQotCQkJCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkJCQlJRG9jdW1lbnRFeHRlbnNpb240IGV4dGVuc2lvbiA9IChJRG9jdW1lbnRFeHRlbnNpb240KSBkb2N1bWVudDsKLQkJCQkJCURvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlIHR5cGUgPSAoc2VsZWN0aW9uLnkgPT0gMCB8fCBzZWxlY3Rpb24ueSA+IE1BWF9TTUFMTF9GT1JNQVRfTEVOR1RIKSA/IERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRCA6IERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRF9TTUFMTDsKLQkJCQkJCXJld3JpdGVTZXNzaW9uID0gKGV4dGVuc2lvbi5nZXRBY3RpdmVSZXdyaXRlU2Vzc2lvbigpICE9IG51bGwpID8gbnVsbCA6IGV4dGVuc2lvbi5zdGFydFJld3JpdGVTZXNzaW9uKHR5cGUpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc2V0UmVkcmF3KGZhbHNlKTsKLQkJCQkJfQotCi0JCQkJCWlmIChmQ29udGVudEZvcm1hdHRlciBpbnN0YW5jZW9mIElDb250ZW50Rm9ybWF0dGVyRXh0ZW5zaW9uKSB7Ci0JCQkJCQlJQ29udGVudEZvcm1hdHRlckV4dGVuc2lvbiBleHRlbnNpb24gPSAoSUNvbnRlbnRGb3JtYXR0ZXJFeHRlbnNpb24pIGZDb250ZW50Rm9ybWF0dGVyOwotCQkJCQkJSUZvcm1hdHRpbmdDb250ZXh0IGNvbnRleHQgPSBuZXcgRm9ybWF0dGluZ0NvbnRleHQoKTsKLQkJCQkJCWNvbnRleHQuc2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfRE9DVU1FTlQsIEJvb2xlYW4uRkFMU0UpOwotCQkJCQkJY29udGV4dC5zZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9SRUdJT04sIHJlZ2lvbik7Ci0JCQkJCQlleHRlbnNpb24uZm9ybWF0KGdldERvY3VtZW50KCksIGNvbnRleHQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZkNvbnRlbnRGb3JtYXR0ZXIuZm9ybWF0KGdldERvY3VtZW50KCksIHJlZ2lvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAocmV3cml0ZVNlc3Npb24gIT0gbnVsbCkgewotCQkJCQkJCUlEb2N1bWVudEV4dGVuc2lvbjQgZXh0ZW5zaW9uID0gKElEb2N1bWVudEV4dGVuc2lvbjQpIGRvY3VtZW50OwotCQkJCQkJCWV4dGVuc2lvbi5zdG9wUmV3cml0ZVNlc3Npb24ocmV3cml0ZVNlc3Npb24pOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJc2V0UmVkcmF3KHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJLy8gZW5kIHJlY29yZGluZwotCQkJCQkJc2VsZWN0aW9uID0gZ2V0VGV4dFdpZGdldCgpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJY3Vyc29yUG9zaXRpb24gPSBzZWxlY3Rpb24ueDsKLQkJCQkJCXNlbGVjdGlvbkxlbmd0aCA9IHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLng7Ci0JCQkJCQllbmRSZWNvcmRpbmcoY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlzdXBlci5kb09wZXJhdGlvbihvcGVyYXRpb24pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuZFJlY29yZGluZyhpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KCk7Ci0JCWlmIChkb2MgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBkb2M7Ci0JCQlJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bmRvTWFuYWdlciA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRVbmRvTWFuYWdlcigpOwotCi0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk4NjE3Ci0JCQkvLyB1bmRvIGFmdGVyIHBhc3RlIGluIGRvY3VtZW50IHdpdGggZm9sZHMgLSB3cm9uZyBiZWhhdmlvcgotCQkJSVJlZ2lvbiB3aWRnZXRTZWxlY3Rpb24gPSBuZXcgUmVnaW9uKGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQkJSVJlZ2lvbiBkb2N1bWVudFNlbGVjdGlvbiA9IHdpZGdldFJhbmdlMk1vZGVsUmFuZ2Uod2lkZ2V0U2VsZWN0aW9uKTsKLQkJCWlmIChkb2N1bWVudFNlbGVjdGlvbiA9PSBudWxsKQotCQkJCWRvY3VtZW50U2VsZWN0aW9uID0gd2lkZ2V0U2VsZWN0aW9uOwotCQkJdW5kb01hbmFnZXIuZW5kUmVjb3JkaW5nKHRoaXMsIGRvY3VtZW50U2VsZWN0aW9uLmdldE9mZnNldCgpLCBkb2N1bWVudFNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBUT0RPOiBob3cgdG8gaGFuZGxlIG90aGVyIGRvY3VtZW50IHR5cGVzPwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJlZ2luUmVjb3JkaW5nKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KCk7Ci0JCWlmIChkb2MgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBkb2M7Ci0JCQlJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bmRvTWFuYWdlciA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRVbmRvTWFuYWdlcigpOwotCi0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk4NjE3Ci0JCQkvLyB1bmRvIGFmdGVyIHBhc3RlIGluIGRvY3VtZW50IHdpdGggZm9sZHMgLSB3cm9uZyBiZWhhdmlvcgotCQkJSVJlZ2lvbiB3aWRnZXRTZWxlY3Rpb24gPSBuZXcgUmVnaW9uKGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQkJSVJlZ2lvbiBkb2N1bWVudFNlbGVjdGlvbiA9IHdpZGdldFJhbmdlMk1vZGVsUmFuZ2Uod2lkZ2V0U2VsZWN0aW9uKTsKLQkJCWlmIChkb2N1bWVudFNlbGVjdGlvbiA9PSBudWxsKQotCQkJCWRvY3VtZW50U2VsZWN0aW9uID0gd2lkZ2V0U2VsZWN0aW9uOwotCQkJdW5kb01hbmFnZXIuYmVnaW5SZWNvcmRpbmcodGhpcywgbGFiZWwsIGRlc2NyaXB0aW9uLCBkb2N1bWVudFNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgZG9jdW1lbnRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gVE9ETzogaG93IHRvIGhhbmRsZSBvdGhlciBkb2N1bWVudCB0eXBlcz8KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGVuZEJhY2tncm91bmRVcGRhdGUoKSB7Ci0JCWZCYWNrZ3JvdW5kdXBkYXRlSW5Qcm9ncmVzcyA9IGZhbHNlOwotCQlzZXRSZWRyYXcodHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRGlzcG9zZSgpIHsKLQkJTG9nZ2VyLnRyYWNlKCJTb3VyY2UgRWRpdG9yIiwgIlN0cnVjdHVyZWRUZXh0Vmlld2VyOjpoYW5kbGVEaXNwb3NlIGVudHJ5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCS8vIGJlZm9yZSB3ZSBkaXNwb3NlLCB3ZSBzZXQgYSBzcGVjaWFsICJlbXB0eSIgc2VsZWN0aW9uLCB0byBwcmV2ZW50Ci0JCS8vIHRoZSAibGVhayBvbmUgZG9jdW1lbnQiIHRoYXQKLQkJLy8gb3RoZXJ3aXNlIG9jY3VycyB3aGVuIGVkaXRvciBjbG9zZWQgKHNpbmNlIGxhc3Qgc2VsZWN0aW9uIHN0YXlzIGluCi0JCS8vIFNlbGVjdGVkUmVzb3VyY2VNYW5hZ2VyLgotCQkvLyB0aGUgb2NjdXJhbmNlIG9mIHRoZSAibGVhayIgaXNuJ3Qgc28gYmFkLCBidXQgbWFrZXMgZGVidWdnaW5nIG90aGVyCi0JCS8vIGxlYWtzIHZlcnkgaGFyZC4KLQkJc2V0U2VsZWN0aW9uKFRleHRTZWxlY3Rpb24uZW1wdHlTZWxlY3Rpb24oKSk7Ci0KLQkJaWYgKGZIaWdobGlnaHRlciAhPSBudWxsKSB7Ci0JCQlmSGlnaGxpZ2h0ZXIudW5pbnN0YWxsKCk7Ci0JCQlmSGlnaGxpZ2h0ZXIgPSBudWxsOwotCQl9Ci0JCQotCQlpZiAoZlJlY0hpZ2hsaWdodGVyICE9IG51bGwpIHsKLQkJCWZSZWNIaWdobGlnaHRlci51bmluc3RhbGwoKTsKLQkJCWZSZWNIaWdobGlnaHRlciA9IG51bGw7Ci0JCX0KLQkJc3VwZXIuaGFuZGxlRGlzcG9zZSgpOwotCi0JCUxvZ2dlci50cmFjZSgiU291cmNlIEVkaXRvciIsICJTdHJ1Y3R1cmVkVGV4dFZpZXdlcjo6aGFuZGxlRGlzcG9zZSBleGl0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qCi0JICogT3ZlcnJpZGRlbiBmb3Igc3BlY2lhbCBzdXBwb3J0IG9mIGJhY2tncm91bmQgdXBkYXRlIGFuZCByZWFkLW9ubHkKLQkgKiByZWdpb25zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlVmVyaWZ5RXZlbnQoVmVyaWZ5RXZlbnQgZSkgewotCQlJUmVnaW9uIG1vZGVsUmFuZ2UgPSBldmVudDJNb2RlbFJhbmdlKGUpOwotCQlpZiAoZXhwb3NlTW9kZWxSYW5nZShtb2RlbFJhbmdlKSkgewotCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoZkV2ZW50Q29uc3VtZXIgIT0gbnVsbCkgewotCQkJZkV2ZW50Q29uc3VtZXIucHJvY2Vzc0V2ZW50KGUpOwotCQkJaWYgKCFlLmRvaXQpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChmQmFja2dyb3VuZHVwZGF0ZUluUHJvZ3Jlc3MpIHsKLQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJYmVlcCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIGZvciByZWFkLW9ubHkgc3VwcG9ydAotCQlpZiAoY29udGFpbnNSZWFkT25seShnZXRWaXNpYmxlRG9jdW1lbnQoKSwgZS5zdGFydCwgZS5lbmQpKSB7Ci0JCQllLmRvaXQgPSBmYWxzZTsKLQkJCWJlZXAoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRyeSB7Ci0JCQlzdXBlci5oYW5kbGVWZXJpZnlFdmVudChlKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIHgpIHsKLQkJCS8vIG5vdGUsIHdlIGNhdGNoIGFuZCBsb2cgYW55IGV4Y2VwdGlvbiwKLQkJCS8vIHNpbmNlIGFuIG90aGVyd2lzZSBjYW4gYWN0dWFsbHkgcHJldmVudCB0eXBpbmchCi0JCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMTMxOAotCi0JCQlpZiAoVFJBQ0VfRVhDRVBUSU9OUykKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJTdHJ1Y3R1cmVkVGV4dFZpZXdlci5leGNlcHRpb24udmVyaWZ5VGV4dCIsIHgpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgbW9kZWxMaW5lMldpZGdldExpbmUoaW50IG1vZGVsTGluZSkgewotCQkvKioKLQkJICogbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBhIHdvcmthcm91bmQgZm9yIEJ1ZyA4NTcwOQotCQkgKi8KLQkJaWYgKGZJbmZvcm1hdGlvbk1hcHBpbmcgPT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVJlZ2lvbiBtb2RlbExpbmVSZWdpb24gPSBnZXREb2N1bWVudCgpLmdldExpbmVJbmZvcm1hdGlvbihtb2RlbExpbmUpOwotCQkJCQlJUmVnaW9uIHJlZ2lvbiA9IGdldE1vZGVsQ292ZXJhZ2UoKTsKLQkJCQkJaWYgKG1vZGVsTGluZVJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgbW9kZWxFbmQgPSBtb2RlbExpbmVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBtb2RlbExpbmVSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJCQlpbnQgcmVnaW9uRW5kID0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpOwotCQkJCQkJLy8gcmV0dXJucyAtMSBpZiBtb2RlbExpbmUgaXMgaW52YWxpZAotCQkJCQkJaWYgKChtb2RlbExpbmVSZWdpb24uZ2V0T2Zmc2V0KCkgPCByZWdpb24uZ2V0T2Zmc2V0KCkpIHx8IChtb2RlbEVuZCA+IHJlZ2lvbkVuZCkpCi0JCQkJCQkJcmV0dXJuIC0xOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHJldHVybnMgLTEgaWYgbW9kZWxMaW5lIGlzIGludmFsaWQKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIubW9kZWxMaW5lMldpZGdldExpbmUobW9kZWxMaW5lKTsKLQl9Ci0KLQlwdWJsaWMgaW50IG1vZGVsT2Zmc2V0MldpZGdldE9mZnNldChpbnQgbW9kZWxPZmZzZXQpIHsKLQkJLyoqCi0JCSAqIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgYSB3b3JrYXJvdW5kIGZvciBCdWcgODU3MDkKLQkJICovCi0JCWlmIChmSW5mb3JtYXRpb25NYXBwaW5nID09IG51bGwpIHsKLQkJCUlSZWdpb24gcmVnaW9uID0gZ2V0TW9kZWxDb3ZlcmFnZSgpOwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJLy8gcmV0dXJucyAtMSBpZiBtb2RlbE9mZnNldCBpcyBpbnZhbGlkCi0JCQkJaWYgKG1vZGVsT2Zmc2V0IDwgcmVnaW9uLmdldE9mZnNldCgpIHx8IG1vZGVsT2Zmc2V0ID4gKHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSkpCi0JCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIubW9kZWxPZmZzZXQyV2lkZ2V0T2Zmc2V0KG1vZGVsT2Zmc2V0KTsKLQl9Ci0KLQlwdWJsaWMgSVJlZ2lvbiBtb2RlbFJhbmdlMldpZGdldFJhbmdlKElSZWdpb24gbW9kZWxSYW5nZSkgewotCQkvLyBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIHdvcmthcm91bmQgZm9yIEJ1Zzg1NzA5Ci0JCWlmIChmSW5mb3JtYXRpb25NYXBwaW5nID09IG51bGwpIHsKLQkJCUlSZWdpb24gcmVnaW9uID0gZ2V0TW9kZWxDb3ZlcmFnZSgpOwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIG1vZGVsUmFuZ2UgIT0gbnVsbCkgewotCQkJCWludCBtb2RlbEVuZCA9IG1vZGVsUmFuZ2UuZ2V0T2Zmc2V0KCkgKyBtb2RlbFJhbmdlLmdldExlbmd0aCgpOwotCQkJCWludCByZWdpb25FbmQgPSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJLy8gcmV0dXJucyBudWxsIGlmIG1vZGVsUmFuZ2UgaXMgaW52YWxpZAotCQkJCWlmICgobW9kZWxSYW5nZS5nZXRPZmZzZXQoKSA8IHJlZ2lvbi5nZXRPZmZzZXQoKSkgfHwgKG1vZGVsRW5kID4gcmVnaW9uRW5kKSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLm1vZGVsUmFuZ2UyV2lkZ2V0UmFuZ2UobW9kZWxSYW5nZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyI3NldERvY3VtZW50KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbCwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBJQW5ub3RhdGlvbk1vZGVsIGFubm90YXRpb25Nb2RlbCwgaW50IG1vZGVsUmFuZ2VPZmZzZXQsIGludCBtb2RlbFJhbmdlTGVuZ3RoKSB7Ci0JCS8vIHBhcnRpYWwgZml4IGZvcjoKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE5NzAKLQkJLy8gd2hlbiBvdXIgZG9jdW1lbnQgaXMgc2V0LCBlc3BlY2lhbGx5IHRvIG51bGwgZHVyaW5nIGNsb3NlLAotCQkvLyBpbW1lZGlhdGVseSB1bmluc3RhbGwgdGhlIHJlY29uY2lsZXIuCi0JCS8vIHRoaXMgaXMgdG8gYXZvaWQgYW4gdW5uZWNlc3NhcnkgZmluYWwgInJlY29uY2lsZSIKLQkJLy8gdGhhdCBibG9ja3MgZGlzcGxheSB0aHJlYWQKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCWlmIChmUmVjb25jaWxlciAhPSBudWxsKSB7Ci0JCQkJZlJlY29uY2lsZXIudW5pbnN0YWxsKCk7Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5zZXREb2N1bWVudChkb2N1bWVudCwgYW5ub3RhdGlvbk1vZGVsLCBtb2RlbFJhbmdlT2Zmc2V0LCBtb2RlbFJhbmdlTGVuZ3RoKTsKLQotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudDsKLQotCQkJLy8gbm90aWZ5IGhpZ2hsaWdodGVyCi0JCQl1cGRhdGVIaWdobGlnaHRlcihzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCi0JCQkvLyBzZXQgdGhlIGZvcm1hdHRlciBhZ2FpbiBub3cgdGhhdCBkb2N1bWVudCBoYXMgYmVlbiBzZXQKLQkJCWlmICghZkZvcm1hdHRlclNldCAmJiBmQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJZkNvbnRlbnRGb3JtYXR0ZXIgPSBmQ29uZmlndXJhdGlvbi5nZXRDb250ZW50Rm9ybWF0dGVyKHRoaXMpOwotCQkJCWZGb3JtYXR0ZXJTZXQgPSB0cnVlOwotCQkJfQotCi0JCQkvLyBzZXQgZG9jdW1lbnQgaW4gdGhlIHZpZXdlci1iYXNlZCB1bmRvIG1hbmFnZXIKLQkJCWlmIChmVW5kb01hbmFnZXIgIT0gbnVsbCkgewotCQkJCWZVbmRvTWFuYWdlci5kaXNjb25uZWN0KCk7Ci0JCQkJZlVuZG9NYW5hZ2VyLmNvbm5lY3QodGhpcyk7Ci0JCQl9Ci0JCQkvLyBDYXJldEV2ZW50IGlzIG5vdCBzZW50IHRvIFZpZXdlclNlbGVjdGlvbk1hbmFnZXIgYWZ0ZXIgU2F2ZSBBcy4KLQkJCS8vIE5lZWQgdG8gbm90aWZ5IFZpZXdlclNlbGVjdGlvbk1hbmFnZXIgaGVyZS4KLQkJCS8vIG5vdGlmeVZpZXdlclNlbGVjdGlvbk1hbmFnZXIoZ2V0U2VsZWN0ZWRSYW5nZSgpLngsCi0JCQkvLyBnZXRTZWxlY3RlZFJhbmdlKCkueSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhlIGFjdGl2ZSBlZGl0b3IgdG8gc2V0IGEgc3RhdHVzIGxpbmUgbWVzc2FnZQotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBtc2cpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCUlFZGl0b3JTdGF0dXNMaW5lIHN0YXR1c0xpbmUgPSAoSUVkaXRvclN0YXR1c0xpbmUpIGVkaXRvci5nZXRBZGFwdGVyKElFZGl0b3JTdGF0dXNMaW5lLmNsYXNzKTsKLQkJCQkJaWYgKHN0YXR1c0xpbmUgIT0gbnVsbCkKLQkJCQkJCXN0YXR1c0xpbmUuc2V0TWVzc2FnZSh0cnVlLCBtc2csIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFVuaW5zdGFsbHMgYW55dGhpbmcgdGhhdCB3YXMgaW5zdGFsbGVkIGJ5IGNvbmZpZ3VyZQotCSAqLwotCXB1YmxpYyB2b2lkIHVuY29uZmlndXJlKCkgewotCQlMb2dnZXIudHJhY2UoIlNvdXJjZSBFZGl0b3IiLCAiU3RydWN0dXJlZFRleHRWaWV3ZXI6OnVuY29uZmlndXJlIGVudHJ5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpZiAoZkhpZ2hsaWdodGVyICE9IG51bGwpIHsKLQkJCWZIaWdobGlnaHRlci51bmluc3RhbGwoKTsKLQkJCWZIaWdobGlnaHRlciA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmIChmUmVjSGlnaGxpZ2h0ZXIgIT0gbnVsbCkgewotCQkJZlJlY0hpZ2hsaWdodGVyLnVuaW5zdGFsbCgpOwotCQkJZlJlY0hpZ2hsaWdodGVyID0gbnVsbDsKLQkJfQotCi0JCWlmIChmQW5ub3RhdGlvbkhvdmVyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSG92ZXIpIHsKLQkJCSgoU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSG92ZXIpIGZBbm5vdGF0aW9uSG92ZXIpLnJlbGVhc2UoKTsKLQkJfQotCi0JCWlmIChmT3ZlcnZpZXdSdWxlckFubm90YXRpb25Ib3ZlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkhvdmVyKSB7Ci0JCQkoKFN0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkhvdmVyKSBmT3ZlcnZpZXdSdWxlckFubm90YXRpb25Ib3ZlcikucmVsZWFzZSgpOwotCQl9Ci0KLQkJLy8gZG9lc24ndCBzZWVtIHRvIGJlIGhhbmRsZWQgZWxzZXdoZXJlLCBzbyB3ZSdsbCBiZSBzdXJlIGVycm9yCi0JCS8vIG1lc3NhZ2VzJ3MgYXJlIGNsZWFyZWQuCi0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQotCQlzdXBlci51bmNvbmZpZ3VyZSgpOwotCQlmQ29uZmlndXJhdGlvbiA9IG51bGw7Ci0JCUxvZ2dlci50cmFjZSgiU291cmNlIEVkaXRvciIsICJTdHJ1Y3R1cmVkVGV4dFZpZXdlcjo6dW5jb25maWd1cmUgZXhpdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51bmRvLklEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yI3VuZG9PcGVyYXRpb25TZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51bmRvLlVuZG9Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG9PcGVyYXRpb25TZWxlY3Rpb25DaGFuZ2VkKFVuZG9Eb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRSZXF1ZXN0ZXIoKSAhPSBudWxsICYmIGV2ZW50LmdldFJlcXVlc3RlcigpLmVxdWFscyh0aGlzKSAmJiBldmVudC5nZXREb2N1bWVudCgpLmVxdWFscyhnZXREb2N1bWVudCgpKSkgewotCQkJLy8gQlVHMTA3Njg3OiBVbmRvL3JlZG8gZG8gbm90IHNjcm9sbCBlZGl0b3IKLQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBUZXh0U2VsZWN0aW9uKGV2ZW50LmdldE9mZnNldCgpLCBldmVudC5nZXRMZW5ndGgoKSk7Ci0JCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCB0cnVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVIaWdobGlnaHRlcihJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWJvb2xlYW4gZG9jdW1lbnRTZXQgPSBmYWxzZTsKLQkJCi0JCS8vIGlmIGhpZ2hsaWdodGVyIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldCwgaW5pdGlhbGl6ZSBhbmQgaW5zdGFsbCBpdAotCQlpZiAoZlJlY0hpZ2hsaWdodGVyID09IG51bGwgJiYgZkNvbmZpZ3VyYXRpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24pIHsKLQkJCVN0cmluZ1tdIHR5cGVzID0gZkNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyh0aGlzKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgdCA9IHR5cGVzW2ldOwotCi0JCQkJLy8gYWRkIGhpZ2hsaWdodGVyL2xpbmVzdHlsZXByb3ZpZGVyCi0JCQkJTGluZVN0eWxlUHJvdmlkZXJbXSBwcm92aWRlcnMgPSAoKFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbikgZkNvbmZpZ3VyYXRpb24pLmdldExpbmVTdHlsZVByb3ZpZGVycyh0aGlzLCB0KTsKLQkJCQlpZiAocHJvdmlkZXJzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcm92aWRlcnMubGVuZ3RoOyArK2opIHsKLQkJCQkJCQotCQkJCQkJaWYoZlJlY0hpZ2hsaWdodGVyID09IG51bGwpIHsKLQkJCQkJCQlmUmVjSGlnaGxpZ2h0ZXIgPSBuZXcgUmVjb25jaWxlckhpZ2hsaWdodGVyKCk7Ci0JCQkJCQkJKChTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24pIGZDb25maWd1cmF0aW9uKS5zZXRIaWdobGlnaHRlcihmUmVjSGlnaGxpZ2h0ZXIpOwotCQkJCQkJfQotCQkJCQkJaWYgKHByb3ZpZGVyc1tqXSBpbnN0YW5jZW9mIEFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIpIHsKLQkJCQkJCQkoKEFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIpIHByb3ZpZGVyc1tqXSkuaW5pdChkb2N1bWVudCwgZlJlY0hpZ2hsaWdodGVyKTsKLQkJCQkJCQlmUmVjSGlnaGxpZ2h0ZXIuYWRkUHJvdmlkZXIodCwgcHJvdmlkZXJzW2pdKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGluaXQgd2l0aCBjb21wYXRpYmlsaXR5IGluc3RhbmNlCi0JCQkJCQkJaWYgKGZIaWdobGlnaHRlciA9PSBudWxsKSB7Ci0JCQkJCQkJCWZIaWdobGlnaHRlciA9IG5ldyBDb21wYXRpYmxlSGlnaGxpZ2h0ZXIoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgIkNvbXBhdGlibGVIaWdobGlnaHRlciBpbnN0YWxsaW5nIGNvbXBhdGliaWxpdHkgZm9yICIgKyBwcm92aWRlcnNbal0uZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlwcm92aWRlcnNbal0uaW5pdChkb2N1bWVudCwgZkhpZ2hsaWdodGVyKTsKLQkJCQkJCQlmSGlnaGxpZ2h0ZXIuYWRkUHJvdmlkZXIodCwgcHJvdmlkZXJzW2pdKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYoZlJlY0hpZ2hsaWdodGVyICE9IG51bGwpCi0JCQkJZlJlY0hpZ2hsaWdodGVyLmluc3RhbGwodGhpcyk7Ci0JCQlpZihmSGlnaGxpZ2h0ZXIgIT0gbnVsbCkgewotCQkJCWZIaWdobGlnaHRlci5zZXREb2N1bWVudFBhcnRpdGlvbmluZyhmQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcodGhpcykpOwotCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDMzNDcKLQkJCQkvLyBtYWtlIHN1cmUgdG8gc2V0IGRvY3VtZW50IGJlZm9yZSBpbnN0YWxsCi0JCQkJZkhpZ2hsaWdodGVyLnNldERvY3VtZW50KGRvY3VtZW50KTsKLQkJCQlmSGlnaGxpZ2h0ZXIuaW5zdGFsbCh0aGlzKTsKLQkJCQlkb2N1bWVudFNldCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZIaWdobGlnaHRlciAhPSBudWxsICYmICFkb2N1bWVudFNldCkKLQkJCWZIaWdobGlnaHRlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCQotCQkvLyBpbnN0YWxsIGNvbnRlbnQgdHlwZSBpbmRlcGVuZGVudCBwbHVnaW5zCi0JCWlmIChmUHJlc2VudGF0aW9uUmVjb25jaWxlciAhPSBudWxsKQotCQkJZlByZXNlbnRhdGlvblJlY29uY2lsZXIudW5pbnN0YWxsKCk7Ci0JCS8vIDIyODg0NyAtIFhTTCBDb250ZW50IEFzc2lzdCB0ZXN0cyBmYWlsIHdpdGggTnVsbCBQb2ludGVyIG9uIEhpZ2hsaWdodGVyCi0JCWlmKGZDb25maWd1cmF0aW9uICE9IG51bGwpCi0JCQlmUHJlc2VudGF0aW9uUmVjb25jaWxlciA9IGZDb25maWd1cmF0aW9uLmdldFByZXNlbnRhdGlvblJlY29uY2lsZXIodGhpcyk7Ci0JCQotCQlpZiAoZlByZXNlbnRhdGlvblJlY29uY2lsZXIgIT0gbnVsbCkKLQkJCWZQcmVzZW50YXRpb25SZWNvbmNpbGVyLmluc3RhbGwodGhpcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBNYWtlIHN1cmUgaW5kZW50YXRpb24gaXMgY29ycmVjdCBiZWZvcmUgdXNpbmcuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUluZGVudGF0aW9uUHJlZml4ZXMoKSB7Ci0JCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IGZDb25maWd1cmF0aW9uOwotCQlpZiAoZkNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nW10gdHlwZXMgPSBjb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXModGhpcyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nW10gcHJlZml4ZXMgPSBjb25maWd1cmF0aW9uLmdldEluZGVudFByZWZpeGVzKHRoaXMsIHR5cGVzW2ldKTsKLQkJCQlpZiAocHJlZml4ZXMgIT0gbnVsbCAmJiBwcmVmaXhlcy5sZW5ndGggPiAwKQotCQkJCQlzZXRJbmRlbnRQcmVmaXhlcyhwcmVmaXhlcywgdHlwZXNbaV0pOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1RleHREcm9wQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvVGV4dERyb3BBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJiYzMzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvVGV4dERyb3BBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi0vKioKLSAqIFRleHREcm9wQWN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0RHJvcEFjdGlvbiBleHRlbmRzIEFic3RyYWN0RHJvcEFjdGlvbiB7Ci0JcHVibGljIGJvb2xlYW4gcnVuKERyb3BUYXJnZXRFdmVudCBldmVudCwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCXJldHVybiBpbnNlcnQoKFN0cmluZykgZXZlbnQuZGF0YSwgdGFyZ2V0RWRpdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvVHJhbnNmZXJCdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvVHJhbnNmZXJCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkN2Q2NGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1RyYW5zZmVyQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLkRyb3BBY3Rpb25Qcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogQnVpbGRzIGRyb3AgdGFyZ2V0IHRyYW5zZmVycywgZHJhZyBzb3VyY2UgdHJhbnNmZXJzLCBhbmQgZHJvcCBhY3Rpb25zCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2ZlckJ1aWxkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9NRVRIT0QgPSAibWV0aG9kIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QUklPUklUWSA9ICJwcmlvcml0eSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfU0lOR0xFVE9OID0gInNpbmdsZXRvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVEFSR0VUX0lEID0gInRhcmdldElEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UUkFOU0ZFUl9JRCA9ICJ0cmFuc2ZlcklEIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1RpbWUgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS90cmFuc2ZlcmJ1aWxkZXIvdGltZSIpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExfRFJBR19TT1VSQ0VfVFJBTlNGRVJTID0gImRyYWdTb3VyY2VUcmFuc2ZlcnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExfRFJPUF9UQVJHRVRfVFJBTlNGRVJTID0gImRyb3BUYXJnZXRUcmFuc2ZlcnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJJT1JJVElFUyA9IHsiaGlnaGVzdCIsICJoaWdoIiwgIm1pZCIsICJsb3ciLCAibG93ZXN0In07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0RSQUdfU09VUkNFX0NPTlRSSUJVVElPTiA9ICJkcmFnU291cmNlQ29udHJpYnV0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19EUk9QX0FDVElPTiA9ICJkcm9wQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19EUk9QX1RBUkdFVF9DT05UUklCVVRJT04gPSAiZHJvcFRhcmdldENvbnRyaWJ1dGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19UUkFOU0ZFUiA9ICJ0cmFuc2ZlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgYm9vbGVhbiB1c2VQcm94eTsKLQotCWNsYXNzIFRyYW5zZmVyUHJveHlGb3JEZWxheUxvYWRpbmcgZXh0ZW5kcyBUcmFuc2ZlciB7Ci0JICAgIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzQXR0cmlidXRlOwotCSAgICBwcml2YXRlIFRyYW5zZmVyIHByb3h5OwotICAgICAgICBwcml2YXRlIE1ldGhvZCBnZXRUeXBlSWRzTWV0aG9kLCBnZXRUeXBlTmFtZXNNZXRob2QsIGphdmFUb05hdGl2ZU1ldGhvZCwgbmF0aXZlVG9KYXZhTWV0aG9kOwotCi0JICAgIFRyYW5zZmVyUHJveHlGb3JEZWxheUxvYWRpbmcoKSB7Ci0JICAgICAgICBzdXBlcigpOwotCSAgICB9Ci0KLQkgICAgVHJhbnNmZXJQcm94eUZvckRlbGF5TG9hZGluZyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxtLCBTdHJpbmcgY2xzQXR0cikgewotCSAgICAgICAgc3VwZXIoKTsKLQkgICAgICAgIHRoaXMuZWxlbWVudCA9IGVsbTsKLQkgICAgICAgIHRoaXMuY2xhc3NBdHRyaWJ1dGUgPSBjbHNBdHRyOwotCSAgICB9Ci0JICAgIAotCSAgICBwcml2YXRlIFRyYW5zZmVyIG5ld0luc3RhbmNlKCkgewotCSAgICAgICAgaWYgKChlbGVtZW50ICE9IG51bGwpICYmIChjbGFzc0F0dHJpYnV0ZSAhPSBudWxsKSkgewotCQkgICAgICAgIE9iamVjdCBvID0gY3JlYXRlRXh0ZW5zaW9uKGVsZW1lbnQsIGNsYXNzQXR0cmlidXRlKTsKLQkJICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFRyYW5zZmVyKSB7Ci0JCSAgICAgICAgICAgIGVsZW1lbnQgPSBudWxsOwotCQkgICAgICAgICAgICBjbGFzc0F0dHJpYnV0ZSA9IG51bGw7Ci0JCSAgICAgICAgICAgIHJldHVybiAoVHJhbnNmZXIpbzsKLQkJICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgICByZXR1cm4gbnVsbDsKLQkgICAgfQotCi0JICAgIHB1YmxpYyBUcmFuc2ZlckRhdGFbXSBnZXRTdXBwb3J0ZWRUeXBlcygpIHsKLQkgICAgICAgIGlmIChwcm94eSA9PSBudWxsKSB7Ci0JICAgICAgICAgICAgcHJveHkgPSBuZXdJbnN0YW5jZSgpOwotCSAgICAgICAgfQotCSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLQkgICAgICAgICAgICByZXR1cm4gcHJveHkuZ2V0U3VwcG9ydGVkVHlwZXMoKTsKLQkgICAgICAgIH0KLQkgICAgICAgIHJldHVybiBuZXcgVHJhbnNmZXJEYXRhWzBdOwotICAgICAgICB9Ci0gICAgICAgIHByb3RlY3RlZCBpbnRbXSBnZXRUeXBlSWRzKCkgewotCSAgICAgICAgaWYgKHByb3h5ID09IG51bGwpIHsKLQkgICAgICAgICAgICBwcm94eSA9IG5ld0luc3RhbmNlKCk7Ci0JICAgICAgICB9Ci0JICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChnZXRUeXBlSWRzTWV0aG9kID09IG51bGwpIHsKLSAgICAJICAgICAgICAgICAgQ2xhc3MgcnVudGltZUNsYXNzID0gcHJveHkuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVudGltZUNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgCSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgIAkgICAgICAgICAgICAgICAgZ2V0VHlwZUlkc01ldGhvZCA9IHJ1bnRpbWVDbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0VHlwZUlkcyIsIG5ldyBDbGFzc1swXSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFR5cGVJZHNNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgCSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lQ2xhc3MgPSBydW50aW1lQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAJICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lQ2xhc3MgPSBydW50aW1lQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAJICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoZ2V0VHlwZUlkc01ldGhvZCA9PSBudWxsKSAmJiAoZSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZ2V0VHlwZUlkc01ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlZCBJbnRlZ2VyW10gcmV0dXJuIHR5cGUgdG8gaW50W10KLSAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIHIgPSAoaW50W10pZ2V0VHlwZUlkc01ldGhvZC5pbnZva2UocHJveHksIG5ldyBPYmplY3RbMF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyICE9IG51bGwpICYmIChyLmxlbmd0aCA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gcmV0ID0gbmV3IGludFtyLmxlbmd0aF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0W2ldID0gcltpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMik7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZTMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZTMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCSAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBpbnRbMF07Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVOYW1lcygpIHsKLQkgICAgICAgIGlmIChwcm94eSA9PSBudWxsKSB7Ci0JICAgICAgICAgICAgcHJveHkgPSBuZXdJbnN0YW5jZSgpOwotCSAgICAgICAgfQotCSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0VHlwZU5hbWVzTWV0aG9kID09IG51bGwpIHsKLSAgICAJICAgICAgICAgICAgQ2xhc3MgcnVudGltZUNsYXNzID0gcHJveHkuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVudGltZUNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgCSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgIAkgICAgICAgICAgICAgICAgZ2V0VHlwZU5hbWVzTWV0aG9kID0gcnVudGltZUNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJnZXRUeXBlTmFtZXMiLCBuZXcgQ2xhc3NbMF0pOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUeXBlTmFtZXNNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgCSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lQ2xhc3MgPSBydW50aW1lQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAJICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lQ2xhc3MgPSBydW50aW1lQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAJICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoZ2V0VHlwZU5hbWVzTWV0aG9kID09IG51bGwpICYmIChlICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChnZXRUeXBlTmFtZXNNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmdbXSlnZXRUeXBlTmFtZXNNZXRob2QuaW52b2tlKHByb3h5LCBuZXcgT2JqZWN0WzBdKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMik7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZTMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZTMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCSAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0ZWRUeXBlKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQkgICAgICAgIGlmIChwcm94eSA9PSBudWxsKSB7Ci0JICAgICAgICAgICAgcHJveHkgPSBuZXdJbnN0YW5jZSgpOwotCSAgICAgICAgfQotCSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLQkgICAgICAgICAgICByZXR1cm4gcHJveHkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyRGF0YSk7Ci0JICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgamF2YVRvTmF0aXZlKE9iamVjdCBvYmplY3QsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQkgICAgICAgIGlmIChwcm94eSA9PSBudWxsKSB7Ci0JICAgICAgICAgICAgcHJveHkgPSBuZXdJbnN0YW5jZSgpOwotCSAgICAgICAgfQotCSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoamF2YVRvTmF0aXZlTWV0aG9kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgcnVudGltZUNsYXNzID0gcHJveHkuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVudGltZUNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgCSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgIAkgICAgICAgICAgICAgICAgamF2YVRvTmF0aXZlTWV0aG9kID0gcnVudGltZUNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJqYXZhVG9OYXRpdmUiLCBuZXcgQ2xhc3NbXXtvYmplY3QuZ2V0Q2xhc3MoKSwgdHJhbnNmZXJEYXRhLmdldENsYXNzKCl9KTsvLyROT04tTkxTLTEkCi0gICAgICAgIAkgICAgICAgICAgICAgICAgamF2YVRvTmF0aXZlTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIAkgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUNsYXNzID0gcnVudGltZUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgCSAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUNsYXNzID0gcnVudGltZUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgCSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoKGphdmFUb05hdGl2ZU1ldGhvZCA9PSBudWxsKSAmJiAoZSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoamF2YVRvTmF0aXZlTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmFUb05hdGl2ZU1ldGhvZC5pbnZva2UocHJveHksIG5ldyBPYmplY3RbXXtvYmplY3QsIHRyYW5zZmVyRGF0YX0pOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlMykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBuYXRpdmVUb0phdmEoVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCSAgICAgICAgaWYgKHByb3h5ID09IG51bGwpIHsKLQkgICAgICAgICAgICBwcm94eSA9IG5ld0luc3RhbmNlKCk7Ci0JICAgICAgICB9Ci0JICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChuYXRpdmVUb0phdmFNZXRob2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBDbGFzcyBydW50aW1lQ2xhc3MgPSBwcm94eS5nZXRDbGFzcygpOwotICAgICAgICAgICAgICAgICAgICBOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChydW50aW1lQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVUb0phdmFNZXRob2QgPSBydW50aW1lQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoIm5hdGl2ZVRvSmF2YSIsIG5ldyBDbGFzc1tde3RyYW5zZmVyRGF0YS5nZXRDbGFzcygpfSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVRvSmF2YU1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVDbGFzcyA9IHJ1bnRpbWVDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIAkgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVDbGFzcyA9IHJ1bnRpbWVDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIAkgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYXRpdmVUb0phdmFNZXRob2QgPT0gbnVsbCkgJiYgKGUgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG5hdGl2ZVRvSmF2YU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgCSAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlVG9KYXZhTWV0aG9kLmludm9rZShwcm94eSwgbmV3IE9iamVjdFtde3RyYW5zZmVyRGF0YX0pOwotICAgIAkgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgICAgICAgICAgCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLSAgICAJICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlMykgewotICAgICAgICAgICAgICAgICAgIAkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMyk7Ci0gICAgCSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdCgpOwotICAgICAgICB9Ci0gICAgICAgIFRyYW5zZmVyIGdldFRyYW5zZmVyQ2xhc3MoKSB7Ci0JICAgICAgICBpZiAocHJveHkgPT0gbnVsbCkgewotCSAgICAgICAgICAgIHByb3h5ID0gbmV3SW5zdGFuY2UoKTsKLQkgICAgICAgIH0KLQkgICAgICAgIHJldHVybiBwcm94eTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgCVN0cmluZyBjbGF6eiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGNsYXNzQXR0cmlidXRlKTsKLSAgICAgICAgCXJldHVybiBjbGF6eiAhPSBudWxsID8gY2xhenogOiBzdXBlci50b1N0cmluZygpOwotICAgICAgICB9Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNsYXNzQXR0cmlidXRlCi0JICogQHJldHVybiBPYmplY3QKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlzdGF0aWMgT2JqZWN0IGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIGZpbmFsIFN0cmluZyBjbGFzc0F0dHJpYnV0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCU9iamVjdCBvYmogPSBudWxsOwotCi0JCVN0cmluZyBzaW5nbGV0b24gPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfU0lOR0xFVE9OKTsKLQkJU3RyaW5nIG1ldGhvZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9NRVRIT0QpOwotCQlpZiAoVFJVRS5lcXVhbHNJZ25vcmVDYXNlKHNpbmdsZXRvbikgJiYgbWV0aG9kICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCQkJQ2xhc3MgY2xzID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKS5sb2FkQ2xhc3MobmFtZSk7Ci0JCQkJTWV0aG9kIG10ZCA9IGNscy5nZXRNZXRob2QobWV0aG9kLCBuZXcgQ2xhc3NbXXt9KTsKLQotCQkJCW9iaiA9IG10ZC5pbnZva2UobnVsbCwgbnVsbCk7Ci0JCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlvYmogPSBudWxsOwotCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCQlvYmogPSBudWxsOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJb2JqID0gbnVsbDsKLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCW9iaiA9IG51bGw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlvYmogPSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oY2xhc3NBdHRyaWJ1dGUpOwotCQl9Ci0KLQkJcmV0dXJuIG9iajsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGV4dGVuc2lvbi4gSWYgdGhlIGV4dGVuc2lvbiBwbHVnaW4gaGFzIG5vdCBiZWVuIGxvYWRlZCBhCi0JICogYnVzeSBjdXJzb3Igd2lsbCBiZSBhY3RpdmF0ZWQgZHVyaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgbG9hZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjbGFzc0F0dHJpYnV0ZQotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlRXh0ZW5zaW9uKGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBmaW5hbCBTdHJpbmcgY2xhc3NBdHRyaWJ1dGUpIHsKLQkJLy8gSWYgcGx1Z2luIGhhcyBiZWVuIGxvYWRlZCBjcmVhdGUgZXh0ZW5zaW9uLgotCQkvLyBPdGhlcndpc2UsIHNob3cgYnVzeSBjdXJzb3IgdGhlbiBjcmVhdGUgZXh0ZW5zaW9uLgotCQlmaW5hbCBPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0WzFdOwotCQlTdHJpbmcgcGx1Z2luSWQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJaWYgKGJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5BQ1RJVkUpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZWxlbWVudCwgY2xhc3NBdHRyaWJ1dGUpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJaGFuZGxlQ3JlYXRlRXhlY3V0YWJsZUV4Y2VwdGlvbihyZXN1bHQsIGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUobnVsbCwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlc3VsdFswXSA9IGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZWxlbWVudCwgY2xhc3NBdHRyaWJ1dGUpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJaGFuZGxlQ3JlYXRlRXhlY3V0YWJsZUV4Y2VwdGlvbihyZXN1bHQsIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdFswXTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICogQHBhcmFtIGUKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaGFuZGxlQ3JlYXRlRXhlY3V0YWJsZUV4Y2VwdGlvbihPYmplY3RbXSByZXN1bHQsIFRocm93YWJsZSBlKSB7Ci0JCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCXJlc3VsdFswXSA9IG51bGw7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjYWNoZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldENvbnRyaWJ1dGlvblRhZzsKLQotCXByb3RlY3RlZCBMaXN0IHRhcmdldElEczsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBJRHJvcEFjdGlvbgotCSAqLwotCXByb3RlY3RlZCBJRHJvcEFjdGlvbiBjcmVhdGVEcm9wQWN0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCU9iamVjdCBvYmogPSBudWxsOwotCQlvYmogPSBjcmVhdGVFeHRlbnNpb24oZWxlbWVudCwgQVRUX0NMQVNTKTsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAob2JqIGluc3RhbmNlb2YgSURyb3BBY3Rpb24pID8gKElEcm9wQWN0aW9uKSBEcm9wQWN0aW9uUHJveHkubmV3SW5zdGFuY2Uob2JqKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRyYW5zZmVySWQKLQkgKiBAcmV0dXJuIElEcm9wQWN0aW9uW10KLQkgKi8KLQlwcm90ZWN0ZWQgSURyb3BBY3Rpb25bXSBjcmVhdGVEcm9wQWN0aW9ucyhTdHJpbmcgdHJhbnNmZXJJZCkgewotCQlpZiAoY2FjaGUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSURyb3BBY3Rpb25bMF07Ci0KLQkJZmluYWwgaW50IG51bSA9IGNhY2hlLnNpemUoKTsKLQkJaWYgKG51bSA9PSAwKQotCQkJcmV0dXJuIG5ldyBJRHJvcEFjdGlvblswXTsKLQotCQlJRHJvcEFjdGlvbltdIGFzID0gbmV3IElEcm9wQWN0aW9uW251bV07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgcCA9IDA7IHAgPCBQUklPUklUSUVTLmxlbmd0aDsgcCsrKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGNhY2hlLmdldChpKTsKLQkJCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnQpKQotCQkJCQljb250aW51ZTsKLQotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgb2JqOwotCQkJCWlmICghKFRBR19EUk9QX0FDVElPTi5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB8fCAhKHRyYW5zZmVySWQuZXF1YWxzKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UUkFOU0ZFUl9JRCkpKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlpZiAoUFJJT1JJVElFU1twXS5lcXVhbHMoZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1BSSU9SSVRZKSkgfHwgKHAgPT0gMiAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUFJJT1JJVFkpID09IG51bGwpKSB7Ci0JCQkJCUlEcm9wQWN0aW9uIGEgPSBjcmVhdGVEcm9wQWN0aW9uKGVsZW1lbnQpOwotCQkJCQlpZiAoYSAhPSBudWxsKSB7Ci0JCQkJCQlhc1tqXSA9IGE7Ci0JCQkJCQlqKys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAobnVtID09IGopCi0JCQlyZXR1cm4gYXM7Ci0KLQkJSURyb3BBY3Rpb25bXSBhczIgPSBuZXcgSURyb3BBY3Rpb25bal07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgajsgaSsrKSB7Ci0JCQlhczJbaV0gPSBhc1tpXTsKLQkJfQotCi0JCXJldHVybiBhczI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFRyYW5zZmVyCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zZmVyIGNyZWF0ZVRyYW5zZmVyKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JICAgIE9iamVjdCBvYmogPSBudWxsOwotCSAgICBpZiAodXNlUHJveHkpIHsKLQkgICAgICAgIG9iaiA9IG5ldyBUcmFuc2ZlclByb3h5Rm9yRGVsYXlMb2FkaW5nKGVsZW1lbnQsIEFUVF9DTEFTUyk7Ci0JICAgIH0gZWxzZSB7Ci0JICAgICAgICBvYmogPSBjcmVhdGVFeHRlbnNpb24oZWxlbWVudCwgQVRUX0NMQVNTKTsKLQkgICAgfQotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBUcmFuc2ZlcikgPyAoVHJhbnNmZXIpIG9iaiA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBUcmFuc2ZlcltdCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zZmVyW10gY3JlYXRlVHJhbnNmZXJzKCkgewotCQlpZiAoY2FjaGUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgVHJhbnNmZXJbMF07Ci0KLQkJZmluYWwgaW50IG51bSA9IGNhY2hlLnNpemUoKTsKLQkJaWYgKG51bSA9PSAwKQotCQkJcmV0dXJuIG5ldyBUcmFuc2ZlclswXTsKLQotCQlUcmFuc2ZlcltdIHRzID0gbmV3IFRyYW5zZmVyW251bV07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgcCA9IDA7IHAgPCBQUklPUklUSUVTLmxlbmd0aDsgcCsrKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGNhY2hlLmdldChpKTsKLQkJCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnQpKQotCQkJCQljb250aW51ZTsKLQotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgb2JqOwotCQkJCWlmICghVEFHX1RSQU5TRkVSLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKFBSSU9SSVRJRVNbcF0uZXF1YWxzKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QUklPUklUWSkpIHx8IChwID09IDIgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1BSSU9SSVRZKSA9PSBudWxsKSkgewotCQkJCQlUcmFuc2ZlciB0ID0gY3JlYXRlVHJhbnNmZXIoZWxlbWVudCk7Ci0JCQkJCWlmICh0ICE9IG51bGwpIHsKLQkJCQkJCXRzW2pdID0gdDsKLQkJCQkJCWorKzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChudW0gPT0gaikKLQkJCXJldHVybiB0czsKLQotCQlUcmFuc2ZlcltdIHRzMiA9IG5ldyBUcmFuc2ZlcltqXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqOyBpKyspIHsKLQkJCXRzMltpXSA9IHRzW2ldOwotCQl9Ci0KLQkJcmV0dXJuIHRzMjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9ySWQKLQkgKiBAcmV0dXJuIFRyYW5zZmVyW10KLQkgKi8KLQlwdWJsaWMgVHJhbnNmZXJbXSBnZXREcmFnU291cmNlVHJhbnNmZXJzKFN0cmluZyBlZGl0b3JJZCkgewotCQlyZXR1cm4gZ2V0RHJhZ1NvdXJjZVRyYW5zZmVycyhuZXcgU3RyaW5nW117ZWRpdG9ySWR9KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9ySWRzCi0JICogQHJldHVybiBUcmFuc2ZlcltdCi0JICovCi0JcHVibGljIFRyYW5zZmVyW10gZ2V0RHJhZ1NvdXJjZVRyYW5zZmVycyhTdHJpbmdbXSBlZGl0b3JJZHMpIHsKLQkJbG9uZyB0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlyZWFkQ29udHJpYnV0aW9ucyhlZGl0b3JJZHMsIFRBR19EUkFHX1NPVVJDRV9DT05UUklCVVRJT04sIFBMX0RSQUdfU09VUkNFX1RSQU5TRkVSUyk7Ci0JCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gY3JlYXRlVHJhbnNmZXJzKCk7Ci0JCWlmIChkZWJ1Z1RpbWUpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2dldERyYWdTb3VyY2VUcmFuc2ZlcnMoIiArIGVkaXRvcklkcyArICIpOiAiICsgdHJhbnNmZXJzLmxlbmd0aCArICIgdHJhbnNmZXJzIGNyZWF0ZWQgaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCXJldHVybiB0cmFuc2ZlcnM7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldERyb3BBY3Rpb25zKFN0cmluZyBlZGl0b3JJZCwgVHJhbnNmZXIgdHJhbnNmZXIpIGZvciB0aGUgcGVyZm9ybWFuY2UKLQkgKiBAcGFyYW0gZWRpdG9ySWQKLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogQHJldHVybiBJRHJvcEFjdGlvbltdCi0JICovCi0JcHVibGljIElEcm9wQWN0aW9uW10gZ2V0RHJvcEFjdGlvbnMoU3RyaW5nIGVkaXRvcklkLCBTdHJpbmcgdHJhbnNmZXJDbGFzc05hbWUpIHsKLQkJcmV0dXJuIGdldERyb3BBY3Rpb25zKG5ldyBTdHJpbmdbXXtlZGl0b3JJZH0sIHRyYW5zZmVyQ2xhc3NOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGVkaXRvcklkCi0JICogQHBhcmFtIGNsYXNzCi0JICogQHJldHVybiBJRHJvcEFjdGlvbltdCi0JICovCi0JcHVibGljIElEcm9wQWN0aW9uW10gZ2V0RHJvcEFjdGlvbnMoU3RyaW5nIGVkaXRvcklkLCBUcmFuc2ZlciB0cmFuc2ZlcikgewotCQlyZXR1cm4gZ2V0RHJvcEFjdGlvbnMobmV3IFN0cmluZ1tde2VkaXRvcklkfSwgdHJhbnNmZXIpOwotCX0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0RHJvcEFjdGlvbnMoU3RyaW5nW10gZWRpdG9ySWRzLCBUcmFuc2ZlciB0cmFuc2ZlcikgZm9yIHRoZSBwZXJmb3JtYW5jZQotCSAqIEBwYXJhbSBlZGl0b3JJZAotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiBAcmV0dXJuIElEcm9wQWN0aW9uW10KLQkgKi8KLQlwdWJsaWMgSURyb3BBY3Rpb25bXSBnZXREcm9wQWN0aW9ucyhTdHJpbmdbXSBlZGl0b3JJZHMsIFN0cmluZyB0cmFuc2ZlckNsYXNzTmFtZSkgewotCQlsb25nIHRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCXJlYWRDb250cmlidXRpb25zKGVkaXRvcklkcywgVEFHX0RST1BfVEFSR0VUX0NPTlRSSUJVVElPTiwgUExfRFJPUF9UQVJHRVRfVFJBTlNGRVJTKTsKLQkJU3RyaW5nIHRyYW5zZmVySWQgPSBnZXRUcmFuc2ZlcklkT2ZDbGFzc05hbWUodHJhbnNmZXJDbGFzc05hbWUpOwotCQlJRHJvcEFjdGlvbltdIGFjdGlvbnMgPSBjcmVhdGVEcm9wQWN0aW9ucyh0cmFuc2ZlcklkKTsKLQkJaWYgKGRlYnVnVGltZSkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjZ2V0RHJvcEFjdGlvbnMoIiArIGVkaXRvcklkcyArICIpOiAiICsgYWN0aW9ucy5sZW5ndGggKyAiIGRyb3AgYWN0aW9ucyBjcmVhdGVkIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlyZXR1cm4gYWN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9ySWQKLQkgKiBAcGFyYW0gY2xhc3MKLQkgKiBAcmV0dXJuIElEcm9wQWN0aW9uW10KLQkgKi8KLQlwdWJsaWMgSURyb3BBY3Rpb25bXSBnZXREcm9wQWN0aW9ucyhTdHJpbmdbXSBlZGl0b3JJZHMsIFRyYW5zZmVyIHRyYW5zZmVyKSB7Ci0JICAgIFN0cmluZyB0cmFuc2ZlckNsYXNzTmFtZTsKLQkgICAgaWYgKHRyYW5zZmVyIGluc3RhbmNlb2YgVHJhbnNmZXJQcm94eUZvckRlbGF5TG9hZGluZykgewotCSAgICAgICAgdHJhbnNmZXJDbGFzc05hbWUgPSAoKFRyYW5zZmVyUHJveHlGb3JEZWxheUxvYWRpbmcpdHJhbnNmZXIpLmdldFRyYW5zZmVyQ2xhc3MoKS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkgICAgfSBlbHNlIHsKLQkgICAgICAgIHRyYW5zZmVyQ2xhc3NOYW1lID0gdHJhbnNmZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JICAgIH0KLQkgICAgcmV0dXJuIGdldERyb3BBY3Rpb25zKGVkaXRvcklkcywgdHJhbnNmZXJDbGFzc05hbWUpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9ySWQKLQkgKiBAcmV0dXJuIFRyYW5zZmVyW10KLQkgKi8KLQlwdWJsaWMgVHJhbnNmZXJbXSBnZXREcm9wVGFyZ2V0VHJhbnNmZXJzKFN0cmluZyBlZGl0b3JJZCkgewotCQlyZXR1cm4gZ2V0RHJvcFRhcmdldFRyYW5zZmVycyhuZXcgU3RyaW5nW117ZWRpdG9ySWR9KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9ySWRzCi0JICogQHJldHVybiBUcmFuc2ZlcltdCi0JICovCi0JcHVibGljIFRyYW5zZmVyW10gZ2V0RHJvcFRhcmdldFRyYW5zZmVycyhTdHJpbmdbXSBlZGl0b3JJZHMpIHsKLQkJbG9uZyB0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlyZWFkQ29udHJpYnV0aW9ucyhlZGl0b3JJZHMsIFRBR19EUk9QX1RBUkdFVF9DT05UUklCVVRJT04sIFBMX0RST1BfVEFSR0VUX1RSQU5TRkVSUyk7Ci0JCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gY3JlYXRlVHJhbnNmZXJzKCk7Ci0JCWlmIChkZWJ1Z1RpbWUpIHsKLQkJCVN0cmluZyBpZGxpc3QgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGVkaXRvcklkcy5sZW5ndGggPiAwKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JJZHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWRsaXN0ICs9IGVkaXRvcklkc1tpXTsKLQkJCQkJaWYgKGkgPCBlZGl0b3JJZHMubGVuZ3RoIC0gMSkKLQkJCQkJCWlkbGlzdCArPSAiLCI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2dldERyb3BUYXJnZXRUcmFuc2ZlcnMoIiArIGlkbGlzdCArICIpOiAiICsgdHJhbnNmZXJzLmxlbmd0aCArICIgdHJhbnNmZXJzIGNyZWF0ZWQgaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCX0KLQkJcmV0dXJuIHRyYW5zZmVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwYXJ0IElEIGF0dHJpYnV0ZSB0aGF0IGlzIGV4cGVjdGVkIGluIHRoZQotCSAqIHRhcmdldCBleHRlbnNpb24uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFyZ2V0SUQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1RBUkdFVF9JRCk7Ci0JCXJldHVybiB2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiAiPz8/IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFRyYW5zZmVySWRPZkNsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCVN0cmluZyBpZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIGludCBudW0gPSBjYWNoZS5zaXplKCk7Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCB8fCBjYWNoZSA9PSBudWxsIHx8IG51bSA9PSAwKQotCQkJcmV0dXJuIGlkOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBjYWNoZS5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25FbGVtZW50KSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBvYmo7Ci0JCQkJaWYgKGNsYXNzTmFtZS5lcXVhbHMoZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKSkpIHsKLQkJCQkJaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKGlkLmxlbmd0aCgpICE9IDAgPyBpZCA6IGNsYXNzTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVhZHMgdGhlIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgcmVnaXN0cnkgZm9yIHRoZSBwcm92aWRlZCB3b3JrYmVuY2gKLQkgKiBwYXJ0IGFuZCB0aGUgcHJvdmlkZWQgZXh0ZW5zaW9uIHBvaW50IElELgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSB0YWcKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uUG9pbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkQ29udHJpYnV0aW9ucyhTdHJpbmdbXSBpZHMsIFN0cmluZyB0YWcsIFN0cmluZyBleHRlbnNpb25Qb2ludCkgewotCQljYWNoZSA9IG51bGw7Ci0JCXRhcmdldElEcyA9IEFycmF5cy5hc0xpc3QoaWRzKTsKLQkJdGFyZ2V0Q29udHJpYnV0aW9uVGFnID0gdGFnOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlyZWFkUmVnaXN0cnkocmVnaXN0cnksIFBMVUdJTl9JRCwgZXh0ZW5zaW9uUG9pbnQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB0YWcgPSBlbGVtZW50LmdldE5hbWUoKTsKLQkJaWYgKHRhZy5lcXVhbHModGFyZ2V0Q29udHJpYnV0aW9uVGFnKSkgewotCQkJU3RyaW5nIGlkID0gZ2V0VGFyZ2V0SUQoZWxlbWVudCk7Ci0JCQlpZiAoaWQgPT0gbnVsbCB8fCAhdGFyZ2V0SURzLmNvbnRhaW5zKGlkKSkgewotCQkJCS8vIFRoaXMgaXMgbm90IG9mIGludGVyZXN0IHRvIHVzIC0gZG9uJ3QgZ28gZGVlcGVyCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAodGFnLmVxdWFscyhUQUdfVFJBTlNGRVIpKSB7Ci0JCQlpZiAoY2FjaGUgPT0gbnVsbCkKLQkJCQljYWNoZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNhY2hlLmFkZChlbGVtZW50KTsKLQkJCXJldHVybiB0cnVlOyAvLyBqdXN0IGNhY2hlIHRoZSBlbGVtZW50IC0gZG9uJ3QgZ28gaW50byBpdAotCQl9IGVsc2UgaWYgKHRhZy5lcXVhbHMoVEFHX0RST1BfQUNUSU9OKSkgewotCQkJaWYgKGNhY2hlID09IG51bGwpCi0JCQkJY2FjaGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkvL2NhY2hlLmFkZChjcmVhdGVBY3Rpb25EZXNjcmlwdG9yKGVsZW1lbnQpKTsKLQkJCWNhY2hlLmFkZChlbGVtZW50KTsKLQkJCXJldHVybiB0cnVlOyAvLyBqdXN0IGNhY2hlIHRoZSBhY3Rpb24gLSBkb24ndCBnbyBpbnRvCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZWFkRWxlbWVudENoaWxkcmVuKGVsZW1lbnQpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgVHJhbnNmZXJCdWlsZGVyKGJvb2xlYW4gdXNlUHJveHkpIGZvciB0aGUgcGVyZm9ybWFuY2UKLQkgKi8KLQlwdWJsaWMgVHJhbnNmZXJCdWlsZGVyKCkgewotICAgICAgICB0aGlzKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHJhbnNmZXJCdWlsZGVyKGJvb2xlYW4gdXNlUHJveHkpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy51c2VQcm94eSA9IHVzZVByb3h5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9Vbmtub3duQ29udGVudFR5cGVEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9Vbmtub3duQ29udGVudFR5cGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkMmY4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvVW5rbm93bkNvbnRlbnRUeXBlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLQotLyoqCi0gKiBNZXNzYWdlIGRpYWxvZyBpbmZvcm1pbmcgdXNlciB0aGF0IGFuIGVkaXRvciB3YXMgb3BlbiBvbiB1bnN1cHBvcnRlZAotICogY29udGVudCB0eXBlCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmtub3duQ29udGVudFR5cGVEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZSB7Ci0KLQlwdWJsaWMgVW5rbm93bkNvbnRlbnRUeXBlRGlhbG9nKFNoZWxsIHBhcmVudCwgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIGtleSkgewotCQkvLyBzZXQgbWVzc2FnZSB0byBudWxsIGluIHN1cGVyIHNvIHRoYXQgbWVzc2FnZSBkb2VzIG5vdCBhcHBlYXIgdHdpY2UKLQkJc3VwZXIocGFyZW50LCBTU0VVSU1lc3NhZ2VzLlVua25vd25Db250ZW50VHlwZURpYWxvZ18wLCBudWxsLCBudWxsLCBJTkZPUk1BVElPTiwgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUx9LCAwLCBTU0VVSU1lc3NhZ2VzLlVua25vd25Db250ZW50VHlwZURpYWxvZ18xLCBmYWxzZSk7Ci0JCXNldFByZWZTdG9yZShzdG9yZSk7Ci0JCXNldFByZWZLZXkoa2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQotCQkvLyBvdmVyd3JpdHRlbiBzbyB0aGF0IHZhbHVlIHN0b3JlZCBpcyBib29sZWFuLCBub3Qgc3RyaW5nCi0JCWlmIChidXR0b25JZCAhPSBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCAmJiBnZXRUb2dnbGVTdGF0ZSgpICYmIGdldFByZWZTdG9yZSgpICE9IG51bGwgJiYgZ2V0UHJlZktleSgpICE9IG51bGwpIHsKLQkJCXN3aXRjaCAoYnV0dG9uSWQpIHsKLQkJCQljYXNlIElEaWFsb2dDb25zdGFudHMuWUVTX0lEIDoKLQkJCQljYXNlIElEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9JRCA6Ci0JCQkJY2FzZSBJRGlhbG9nQ29uc3RhbnRzLlBST0NFRURfSUQgOgotCQkJCWNhc2UgSURpYWxvZ0NvbnN0YW50cy5PS19JRCA6Ci0JCQkJCWdldFByZWZTdG9yZSgpLnNldFZhbHVlKGdldFByZWZLZXkoKSwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElEaWFsb2dDb25zdGFudHMuTk9fSUQgOgotCQkJCWNhc2UgSURpYWxvZ0NvbnN0YW50cy5OT19UT19BTExfSUQgOgotCQkJCQlnZXRQcmVmU3RvcmUoKS5zZXRWYWx1ZShnZXRQcmVmS2V5KCksIHRydWUpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlTWVzc2FnZUFyZWEoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlzdXBlci5jcmVhdGVNZXNzYWdlQXJlYShjb21wb3NpdGUpOwotCQlMaW5rIG1lc3NhZ2VMaW5rID0gbmV3IExpbmsoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW1lc3NhZ2VMaW5rLnNldFRleHQoU1NFVUlNZXNzYWdlcy5Vbmtub3duQ29udGVudFR5cGVEaWFsb2dfMik7Ci0JCW1lc3NhZ2VMaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWxpbmtDbGlja2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgdm9pZCBsaW5rQ2xpY2tlZCgpIHsKLQkJU3RyaW5nIHBhZ2VJZCA9ICJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMuQ29udGVudFR5cGVzIjsgLy8kTk9OLU5MUy0xJAotCQlQcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IFByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwgcGFnZUlkLCBuZXcgU3RyaW5nW117cGFnZUlkfSwgbnVsbCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvQWN0aW9uQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL0FjdGlvbkNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMzQ5NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvQWN0aW9uQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIERhdmlkIENhcnZlci9TVEFSIC0gWzIxMjMzMF0gY2FuJ3QgY29udHJpYnV0ZSB0byB0aGUgWE1MIG9yIGFueSBTU0UgYmFzZWQgbWVudQotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotLy9pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Hcm91cE1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuR290b0Fubm90YXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JRXh0ZW5kZWRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51aS5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgdXNlZCBpbnNpZGUgbXVsdGkgcGFnZSBlZGl0b3IncwotICogQWN0aW9uQmFyQ29udHJpYnV0b3IsIHNpbmNlIGNhc2NhZGVkIGluaXQoKSBjYWxsIGZyb20gdGhlCi0gKiBBY3Rpb25CYXJDb250cmlidXRvciB3aWxsIGNhdXNlcyBleGNlcHRpb24gYW5kIGl0IGxlYWRzIHRvIGxvc2Ugd2hvbGUKLSAqIHRvb2xiYXJzLgotICogCi0gKiBJbnN0ZWFkLCB1c2UgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yIGZvciBzb3VyY2UgcGFnZSBjb250cmlidXRvciBvZgotICogbXVsdGkgcGFnZSBlZGl0b3IuCi0gKiAKLSAqIE5vdGUgdGhhdCB0aGlzIGNsYXNzIGlzIHN0aWxsIHZhbGlkIGZvciBzaW5nbGUgcGFnZSBlZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIEFjdGlvbkNvbnRyaWJ1dG9yIGV4dGVuZHMgVGV4dEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLCBJRXh0ZW5kZWRDb250cmlidXRvciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gX3Nob3dEZWJ1Z1N0YXR1cyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2FjdGlvbmNvbnRyaWJ1dG9yL2RlYnVnc3RhdHVzZmllbGRzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVESVRPUl9JRFMgPSB7Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IifTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIElFeHRlbmRlZENvbnRyaWJ1dG9yIGV4dGVuZGVkQ29udHJpYnV0b3I7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmQWRkQmxvY2tDb21tZW50ID0gbnVsbDsKLQotCXByb3RlY3RlZCBTZXBhcmF0b3IgZkNvbW1hbmRzU2VwYXJhdG9yID0gbnVsbDsKLQotCXByaXZhdGUgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0gZkRlYnVnU3RhdHVzT2Zmc2V0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgTWVudU1hbmFnZXIgZkV4cGFuZFNlbGVjdGlvblRvTWVudSA9IG51bGw7Ci0JcHJvdGVjdGVkIEdyb3VwTWFya2VyIGZNZW51QWRkaXRpb25zR3JvdXBNYXJrZXIgPSBudWxsOwotCXByb3RlY3RlZCBHb3RvQW5ub3RhdGlvbkFjdGlvbiBmTmV4dEFubm90YXRpb24gPSBudWxsOwotCi0JcHJvdGVjdGVkIEdvdG9Bbm5vdGF0aW9uQWN0aW9uIGZQcmV2aW91c0Fubm90YXRpb24gPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZlJlbW92ZUJsb2NrQ29tbWVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmU2hpZnRMZWZ0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZTaGlmdFJpZ2h0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdBY3Rpb24gPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZlN0cnVjdHVyZVNlbGVjdEhpc3RvcnlBY3Rpb24gPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZlN0cnVjdHVyZVNlbGVjdE5leHRBY3Rpb24gPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzQWN0aW9uID0gbnVsbDsKLQotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZlRvZ2dsZUNvbW1lbnQgPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZlRvZ2dsZUluc2VydE1vZGVBY3Rpb247Ci0JcHJvdGVjdGVkIEdyb3VwTWFya2VyIGZUb29sYmFyQWRkaXRpb25zR3JvdXBNYXJrZXIgPSBudWxsOwotCXByb3RlY3RlZCBTZXBhcmF0b3IgZlRvb2xiYXJTZXBhcmF0b3IgPSBudWxsOwotCQotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZkdvdG9NYXRjaGluZ0JyYWNrZXRBY3Rpb24gPSBudWxsOwotCi0JcHVibGljIEFjdGlvbkNvbnRyaWJ1dG9yKCkgewotCQlzdXBlcigpOwotCi0JCVJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0gU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCi0JCWZDb21tYW5kc1NlcGFyYXRvciA9IG5ldyBTZXBhcmF0b3IoKTsKLQotCQkvLyBlZGl0IGNvbW1hbmRzCi0JCWZTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdBY3Rpb24gPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9TVFJVQ1RVUkVfU0VMRUNUX0VOQ0xPU0lORyArIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVOREVSU0NPUkUpOwotCQlmU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nQWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLlNUUlVDVFVSRV9TRUxFQ1RfRU5DTE9TSU5HKTsKLQotCQlmU3RydWN0dXJlU2VsZWN0TmV4dEFjdGlvbiA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1NUUlVDVFVSRV9TRUxFQ1RfTkVYVCArIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVOREVSU0NPUkUpOwotCQlmU3RydWN0dXJlU2VsZWN0TmV4dEFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5TVFJVQ1RVUkVfU0VMRUNUX05FWFQpOwotCi0JCWZTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c0FjdGlvbiA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1NUUlVDVFVSRV9TRUxFQ1RfUFJFVklPVVMgKyBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRFUlNDT1JFKTsKLQkJZlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzQWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLlNUUlVDVFVSRV9TRUxFQ1RfUFJFVklPVVMpOwotCi0JCWZTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5QWN0aW9uID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfU1RSVUNUVVJFX1NFTEVDVF9ISVNUT1JZICsgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ERVJTQ09SRSk7Ci0JCWZTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5QWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLlNUUlVDVFVSRV9TRUxFQ1RfSElTVE9SWSk7Ci0KLQkJZkV4cGFuZFNlbGVjdGlvblRvTWVudSA9IG5ldyBNZW51TWFuYWdlcihTU0VVSU1lc3NhZ2VzLkV4cGFuZFNlbGVjdGlvblRvTWVudV9sYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJZkV4cGFuZFNlbGVjdGlvblRvTWVudS5hZGQoZlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ0FjdGlvbik7Ci0JCWZFeHBhbmRTZWxlY3Rpb25Ub01lbnUuYWRkKGZTdHJ1Y3R1cmVTZWxlY3ROZXh0QWN0aW9uKTsKLQkJZkV4cGFuZFNlbGVjdGlvblRvTWVudS5hZGQoZlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzQWN0aW9uKTsKLQkJZkV4cGFuZFNlbGVjdGlvblRvTWVudS5hZGQoZlN0cnVjdHVyZVNlbGVjdEhpc3RvcnlBY3Rpb24pOwotCi0JCS8vIHNvdXJjZSBjb21tYW5kcwotCQlmU2hpZnRSaWdodCA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlNISUZUX1JJR0hUICsgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ERVJTQ09SRSk7Ci0JCWZTaGlmdFJpZ2h0LnNldEFjdGlvbkRlZmluaXRpb25JZChJVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuU0hJRlRfUklHSFQpOwotCi0JCWZTaGlmdExlZnQgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5TSElGVF9MRUZUICsgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ERVJTQ09SRSk7Ci0JCWZTaGlmdExlZnQuc2V0QWN0aW9uRGVmaW5pdGlvbklkKElUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5TSElGVF9MRUZUKTsKLQotCQlmVG9nZ2xlQ29tbWVudCA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1RPR0dMRV9DT01NRU5UICsgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ERVJTQ09SRSk7Ci0JCWZUb2dnbGVDb21tZW50LnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLlRPR0dMRV9DT01NRU5UKTsKLQotCQlmQWRkQmxvY2tDb21tZW50ID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfQUREX0JMT0NLX0NPTU1FTlQgKyBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRFUlNDT1JFKTsKLQkJZkFkZEJsb2NrQ29tbWVudC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5BRERfQkxPQ0tfQ09NTUVOVCk7Ci0KLQkJZlJlbW92ZUJsb2NrQ29tbWVudCA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1JFTU9WRV9CTE9DS19DT01NRU5UICsgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ERVJTQ09SRSk7Ci0JCWZSZW1vdmVCbG9ja0NvbW1lbnQuc2V0QWN0aW9uRGVmaW5pdGlvbklkKEFjdGlvbkRlZmluaXRpb25JZHMuUkVNT1ZFX0JMT0NLX0NPTU1FTlQpOwotCi0JCS8vIGdvdG8gcHJldi9uZXh0IGVycm9yCi0JCS8vIENNVkMgMjQ5MDE3IGZvciBKYXZhRWRpdG9yIGNvbnNpc3RhbmN5Ci0JCWZQcmV2aW91c0Fubm90YXRpb24gPSBuZXcgR290b0Fubm90YXRpb25BY3Rpb24oIlByZXZpb3VzX2Fubm90YXRpb24iLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJZlByZXZpb3VzQW5ub3RhdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoIm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRlLnByZXZpb3VzIik7IC8vJE5PTi1OTFMtMSQKLQotCQlmTmV4dEFubm90YXRpb24gPSBuZXcgR290b0Fubm90YXRpb25BY3Rpb24oIk5leHRfYW5ub3RhdGlvbiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWZOZXh0QW5ub3RhdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoIm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRlLm5leHQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZHb3RvTWF0Y2hpbmdCcmFja2V0QWN0aW9uID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfR09UT19NQVRDSElOR19CUkFDS0VUICsgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ERVJTQ09SRSk7Ci0JCWZHb3RvTWF0Y2hpbmdCcmFja2V0QWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLkdPVE9fTUFUQ0hJTkdfQlJBQ0tFVCk7Ci0KLQkJLy8gUmVhZCBhY3Rpb24gZXh0ZW5zaW9ucy4KLQkJRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyKCk7Ci0JCWV4dGVuZGVkQ29udHJpYnV0b3IgPSBidWlsZGVyLnJlYWRBY3Rpb25FeHRlbnNpb25zKGdldEV4dGVuc2lvbklEcygpKTsKLQotCQlmTWVudUFkZGl0aW9uc0dyb3VwTWFya2VyID0gbmV3IEdyb3VwTWFya2VyKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX05BTUVfTUVOVV9BRERJVElPTlMpOwotCQlmVG9vbGJhclNlcGFyYXRvciA9IG5ldyBTZXBhcmF0b3IoKTsKLQkJZlRvb2xiYXJBZGRpdGlvbnNHcm91cE1hcmtlciA9IG5ldyBHcm91cE1hcmtlcihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9OQU1FX1RPT0xCQVJfQURESVRJT05TKTsKLQotCQlmVG9nZ2xlSW5zZXJ0TW9kZUFjdGlvbiA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsICJFZGl0b3IuVG9nZ2xlSW5zZXJ0TW9kZS4iLCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7IC8vJE5PTi1OTFMtMSQKLQkJZlRvZ2dsZUluc2VydE1vZGVBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKElUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5UT0dHTEVfSU5TRVJUX01PREUpOwotCi0JCWlmIChfc2hvd0RlYnVnU3RhdHVzKSB7Ci0JCQlmRGVidWdTdGF0dXNPZmZzZXQgPSBuZXcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuU1RBVFVTX0NBVEVHT1JZX09GRlNFVCwgdHJ1ZSwgMjApOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCS8vIGVkaXQgY29tbWFuZHMKLS8qCQlJTWVudU1hbmFnZXIgZWRpdE1lbnUgPSBtZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElUKTsKLQkJaWYgKGVkaXRNZW51ICE9IG51bGwpIHsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZUb2dnbGVJbnNlcnRNb2RlQWN0aW9uKTsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZFeHBhbmRTZWxlY3Rpb25Ub01lbnUpOwotCQkJZWRpdE1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQllZGl0TWVudS5hZGQoZk1lbnVBZGRpdGlvbnNHcm91cE1hcmtlcik7Ci0JCX0KLQotCQkvLyBzb3VyY2UgY29tbWFuZHMKLQkJU3RyaW5nIHNvdXJjZU1lbnVMYWJlbCA9IFNTRVVJTWVzc2FnZXMuU291cmNlTWVudV9sYWJlbDsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc291cmNlTWVudUlkID0gInNvdXJjZU1lbnVJZCI7IC8vIFRoaXMgaXMganVzdCBhIG1lbnUgaWQuIE5vIC8vJE5PTi1OTFMtMSQKLQkJLy8gbmVlZCB0byB0cmFuc2xhdGUuCi0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJSU1lbnVNYW5hZ2VyIHNvdXJjZU1lbnUgPSBuZXcgTWVudU1hbmFnZXIoc291cmNlTWVudUxhYmVsLCBzb3VyY2VNZW51SWQpOwotCQltZW51Lmluc2VydEFmdGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElULCBzb3VyY2VNZW51KTsKLQkJaWYgKHNvdXJjZU1lbnUgIT0gbnVsbCkgewotCQkJc291cmNlTWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZUb2dnbGVDb21tZW50KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZBZGRCbG9ja0NvbW1lbnQpOwotCQkJc291cmNlTWVudS5hZGQoZlJlbW92ZUJsb2NrQ29tbWVudCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmU2hpZnRSaWdodCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmU2hpZnRMZWZ0KTsKLQkJfQotCQkKLQkJSU1lbnVNYW5hZ2VyIGdvdG9NZW51ID0gbWVudS5maW5kTWVudVVzaW5nUGF0aChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkdPX1RPKTsKLQkJaWYgKGdvdG9NZW51ICE9IG51bGwpIHsKLQkJCWdvdG9NZW51LmFkZChmR290b01hdGNoaW5nQnJhY2tldEFjdGlvbik7Ci0JCX0KLSovCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9Qb3B1cE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJLy8gYWRkIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1N0YXR1c0xpbmUoSVN0YXR1c0xpbmVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJaWYgKF9zaG93RGVidWdTdGF0dXMpIHsKLQkJCW1hbmFnZXIuYWRkKGZEZWJ1Z1N0YXR1c09mZnNldCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7Ci0vKgkJdG9vbEJhck1hbmFnZXIuYWRkKGZUb29sYmFyU2VwYXJhdG9yKTsKLQkJdG9vbEJhck1hbmFnZXIuYWRkKGZUb29sYmFyQWRkaXRpb25zR3JvdXBNYXJrZXIpOwotKi8JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51KTsKLS8qCi0JCWFkZFRvTWVudShtZW51KTsKLSovCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuY29udHJpYnV0ZVRvTWVudShtZW51KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb24uSVBvcHVwTWVudUNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb1BvcHVwTWVudShvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1BvcHVwTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotLyoKLQkJYWRkVG9Qb3B1cE1lbnUobWVudSk7Ci0qLwotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKSB7Ci0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmNvbnRyaWJ1dGVUb1BvcHVwTWVudShtZW51KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9TdGF0dXNMaW5lKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvU3RhdHVzTGluZShJU3RhdHVzTGluZU1hbmFnZXIgbWFuYWdlcikgewotCQlzdXBlci5jb250cmlidXRlVG9TdGF0dXNMaW5lKG1hbmFnZXIpOwotCi0JCWFkZFRvU3RhdHVzTGluZShtYW5hZ2VyKTsKLQotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKSB7Ci0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmNvbnRyaWJ1dGVUb1N0YXR1c0xpbmUobWFuYWdlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvVG9vbEJhcih0b29sQmFyTWFuYWdlcik7Ci0KLS8qCQlhZGRUb1Rvb2xCYXIodG9vbEJhck1hbmFnZXIpOwotKi8KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkgewotCQkJZXh0ZW5kZWRDb250cmlidXRvci5jb250cmlidXRlVG9Ub29sQmFyKHRvb2xCYXJNYW5hZ2VyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBuZWVkIHRvIGNhbGwgc2V0QWN0aXZlRWRpdG9yIGJlZm9yZSBzdXBlci5kaXNwb3NlIGJlY2F1c2UgaW4gYm90aAotCQkvLyBzZXRBY3RpdmVFZGl0b3IgJiBzdXBlci5zZXRBY3RpdmVFZGl0b3IgaWYgZ2V0RWRpdG9yUGFydCA9PQotCQkvLyBhY3RpdmVFZGl0b3IsCi0JCS8vIHRoZSBtZXRob2QgaXMganVzdCByZXR1cm5lZC4gc28gdG8gZ2V0IGJvdGggbWV0aG9kcyB0byBydW4sCi0JCS8vIHNldEFjdGl2ZUVkaXRvcgotCQkvLyBuZWVkcyB0byBiZSBjYWxsZWQgc28gdGhhdCBpdCBjb3JyZWN0bHkgY2FsbHMgc3VwZXIuc2V0QWN0aXZlRWRpdG9yCi0JCXNldEFjdGl2ZUVkaXRvcihudWxsKTsKLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRFeHRlbnNpb25JRHMoKSB7Ci0JCXJldHVybiBFRElUT1JfSURTOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElUZXh0RWRpdG9yIGdldFRleHRFZGl0b3IoSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpCi0JCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3I7Ci0JCWlmICh0ZXh0RWRpdG9yID09IG51bGwgJiYgZWRpdG9yICE9IG51bGwpCi0JCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCXJldHVybiB0ZXh0RWRpdG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2luaXQob3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnMsCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGJhcnMsIElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLQkJc3VwZXIuaW5pdChiYXJzLCBwYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikgewotCQlpZiAoZ2V0QWN0aXZlRWRpdG9yUGFydCgpID09IGFjdGl2ZUVkaXRvcikKLQkJCXJldHVybjsKLQkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0KLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IGdldFRleHRFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQotLyoJCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRBY3Rpb25CYXJzKCk7Ci0JCWlmIChhY3Rpb25CYXJzICE9IG51bGwpIHsKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihJVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuR09UT19ORVhUX0FOTk9UQVRJT04sIGZOZXh0QW5ub3RhdGlvbik7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLkdPVE9fUFJFVklPVVNfQU5OT1RBVElPTiwgZlByZXZpb3VzQW5ub3RhdGlvbik7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QUkVWSU9VUy5nZXRJZCgpLCBmUHJldmlvdXNBbm5vdGF0aW9uKTsKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5Lk5FWFQuZ2V0SWQoKSwgZk5leHRBbm5vdGF0aW9uKTsKLQotCQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihJREVBY3Rpb25GYWN0b3J5LkFERF9UQVNLLmdldElkKCksIGdldEFjdGlvbih0ZXh0RWRpdG9yLCBJREVBY3Rpb25GYWN0b3J5LkFERF9UQVNLLmdldElkKCkpKTsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSURFQWN0aW9uRmFjdG9yeS5CT09LTUFSSy5nZXRJZCgpLCBnZXRBY3Rpb24odGV4dEVkaXRvciwgSURFQWN0aW9uRmFjdG9yeS5CT09LTUFSSy5nZXRJZCgpKSk7Ci0JCQl9Ci0JCX0KLQotCQlmU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nQWN0aW9uLnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfU1RSVUNUVVJFX1NFTEVDVF9FTkNMT1NJTkcpKTsKLQkJZlN0cnVjdHVyZVNlbGVjdE5leHRBY3Rpb24uc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9TVFJVQ1RVUkVfU0VMRUNUX05FWFQpKTsKLQkJZlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzQWN0aW9uLnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfU1RSVUNUVVJFX1NFTEVDVF9QUkVWSU9VUykpOwotCQlmU3RydWN0dXJlU2VsZWN0SGlzdG9yeUFjdGlvbi5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1NUUlVDVFVSRV9TRUxFQ1RfSElTVE9SWSkpOwotCi0JCWZTaGlmdFJpZ2h0LnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuU0hJRlRfUklHSFQpKTsKLQkJZlNoaWZ0TGVmdC5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlNISUZUX0xFRlQpKTsKLQotCQlmVG9nZ2xlQ29tbWVudC5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1RPR0dMRV9DT01NRU5UKSk7Ci0JCWZBZGRCbG9ja0NvbW1lbnQuc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9BRERfQkxPQ0tfQ09NTUVOVCkpOwotCQlmUmVtb3ZlQmxvY2tDb21tZW50LnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfUkVNT1ZFX0JMT0NLX0NPTU1FTlQpKTsKLQotCQkvLyBnbyB0byBwcmV2L25leHQgZXJyb3IKLQkJLy8gQ01WQyAyNDkwMTcgZm9yIEphdmFFZGl0b3IgY29uc2lzdGFuY3kKLQkJZlByZXZpb3VzQW5ub3RhdGlvbi5zZXRFZGl0b3IodGV4dEVkaXRvcik7Ci0JCWZOZXh0QW5ub3RhdGlvbi5zZXRFZGl0b3IodGV4dEVkaXRvcik7Ci0JCWZHb3RvTWF0Y2hpbmdCcmFja2V0QWN0aW9uLnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfR09UT19NQVRDSElOR19CUkFDS0VUKSk7Ci0KLQkJZlRvZ2dsZUluc2VydE1vZGVBY3Rpb24uc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5UT0dHTEVfSU5TRVJUX01PREUpKTsKLSovCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0JCX0KLQotCQlpZiAoX3Nob3dEZWJ1Z1N0YXR1cyAmJiB0ZXh0RWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3JFeHRlbnNpb24pIHsKLQkJCSgoSVRleHRFZGl0b3JFeHRlbnNpb24pIHRleHRFZGl0b3IpLnNldFN0YXR1c0ZpZWxkKGZEZWJ1Z1N0YXR1c09mZnNldCwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuU1RBVFVTX0NBVEVHT1JZX09GRlNFVCk7Ci0JCQlmRGVidWdTdGF0dXNPZmZzZXQuc2V0QWN0aXZlRWRpdG9yKHRleHRFZGl0b3IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLklTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciNzZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLS8qCQlmU2hpZnRSaWdodC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmU2hpZnRMZWZ0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWZOZXh0QW5ub3RhdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmUHJldmlvdXNBbm5vdGF0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0qLwotCQkvKgotCQkgKiBmQ29tbWVudC5zZXRFbmFibGVkKGVuYWJsZWQpOyBmVW5jb21tZW50LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCSAqLwotLyoJCQotCQlmVG9nZ2xlQ29tbWVudC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmQWRkQmxvY2tDb21tZW50LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWZSZW1vdmVCbG9ja0NvbW1lbnQuc2V0RW5hYmxlZChlbmFibGVkKTsKLSovCQkKLQkJLy8gY29udmVydCBsaW5lIGRlbGltaXRlcnMgYXJlIG5vdCBzb3VyY2Ugdmlld2VyLXNwZWNpZmljCi0JCQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb24uSUV4dGVuZGVkQ29udHJpYnV0b3IjdXBkYXRlVG9vbGJhckFjdGlvbnMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVRvb2xiYXJBY3Rpb25zKCkgewotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKSB7Ci0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLnVwZGF0ZVRvb2xiYXJBY3Rpb25zKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3Rpb25EZWZpbml0aW9uSWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3Rpb25EZWZpbml0aW9uSWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NDVkNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvQWN0aW9uRGVmaW5pdGlvbklkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBkZWZpbml0aW9ucyBpZHMgZm9yIGVkaXRvciBhY3Rpb25zLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjdGlvbkRlZmluaXRpb25JZHMgewotCS8vIFRPRE86IENhbiB0aGVzZSBiZSBiZXR0ZXIgZGVmaW5lZCB3aXRoIGEgInBsdWdpbiBwcmVmaXgiIHRvIGJlIG1vcmUKLQkvLyBwb3J0YWJsZT8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfQkxPQ0tfQ09NTUVOVCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkZC5ibG9jay5jb21tZW50IjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDTEVBTlVQX0RPQ1VNRU5UID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2xlYW51cC5kb2N1bWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTU1FTlQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb21tZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRURJVF9CUkVBS1BPSU5UUyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmJyZWFrcG9pbnRzLmVkaXQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGSU5EX09DQ1VSUkVOQ0VTID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT1JNQVRfQUNUSVZFX0VMRU1FTlRTID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZm9ybWF0LmFjdGl2ZS5lbGVtZW50cyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZPUk1BVF9ET0NVTUVOVCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmZvcm1hdC5kb2N1bWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1BTkFHRV9CUkVBS1BPSU5UUyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmJyZWFrcG9pbnRzLm1hbmFnZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE9QRU5fRklMRSA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLm9wZW4uZmlsZS5mcm9tLnNvdXJjZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTU9WRV9CTE9DS19DT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucmVtb3ZlLmJsb2NrLmNvbW1lbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVFJVQ1RVUkVfU0VMRUNUX0VOQ0xPU0lORyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QuZW5jbG9zaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSVUNUVVJFX1NFTEVDVF9ISVNUT1JZID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5sYXN0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSVUNUVVJFX1NFTEVDVF9ORVhUID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5uZXh0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSVUNUVVJFX1NFTEVDVF9QUkVWSU9VUyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QucHJldmlvdXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUT0dHTEVfQ09NTUVOVCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRvZ2dsZS5jb21tZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVE9HR0xFX0JSRUFLUE9JTlRTID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuYnJlYWtwb2ludHMudG9nZ2xlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVU5DT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudW5jb21tZW50IjsvLyROT04tTkxTLTEkCi0KLQkvLyByZWdpc3RlcmVkIGNvbW1hbmQgSURzLCBzbyB3ZSBwaWNrIHVwIHRoZSBkZWNsYXJlZCBrZXkgYmluZGluZ3MKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHT1RPX01BVENISU5HX0JSQUNLRVQ9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmdvdG8ubWF0Y2hpbmcuYnJhY2tldCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL0FjdGl2ZUVkaXRvckFjdGlvbkhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL0FjdGl2ZUVkaXRvckFjdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ1ODZlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3RpdmVFZGl0b3JBY3Rpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBhY3Rpb25zIGFyZSBub3QgcHJvcGVybHkgYWN0aXZhdGVkIHdpdGggdGhpcyBoYW5kbGVyIHNvIGRvIG5vdAotICogICAgICAgICAgICAgdXNlCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmVFZGl0b3JBY3Rpb25IYW5kbGVyIGltcGxlbWVudHMgSUFjdGlvbiB7Ci0KLQlwcml2YXRlIFN0cmluZyBmQWN0aW9uSWQ7Ci0JcHJpdmF0ZSBJV29ya2JlbmNoU2l0ZSBmU2l0ZTsKLQlwcml2YXRlIElBY3Rpb24gZlRhcmdldEFjdGlvbjsKLQotCXB1YmxpYyBBY3RpdmVFZGl0b3JBY3Rpb25IYW5kbGVyKElXb3JrYmVuY2hTaXRlIHNpdGUsIFN0cmluZyBpZCkgewotCQlzdXBlcigpOwotCQlmQWN0aW9uSWQgPSBpZDsKLQkJZlNpdGUgPSBzaXRlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldEFjY2VsZXJhdG9yKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFjY2VsZXJhdG9yKCkgewotCQl1cGRhdGVUYXJnZXRBY3Rpb24oKTsKLQkJcmV0dXJuIChmVGFyZ2V0QWN0aW9uICE9IG51bGwgPyBmVGFyZ2V0QWN0aW9uLmdldEFjY2VsZXJhdG9yKCkgOiAwKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldEFjdGlvbkRlZmluaXRpb25JZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBY3Rpb25EZWZpbml0aW9uSWQoKSB7Ci0JCXVwZGF0ZVRhcmdldEFjdGlvbigpOwotCQlyZXR1cm4gKGZUYXJnZXRBY3Rpb24gIT0gbnVsbCA/IGZUYXJnZXRBY3Rpb24uZ2V0QWN0aW9uRGVmaW5pdGlvbklkKCkgOiBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQl1cGRhdGVUYXJnZXRBY3Rpb24oKTsKLQkJcmV0dXJuIChmVGFyZ2V0QWN0aW9uICE9IG51bGwgPyBmVGFyZ2V0QWN0aW9uLmdldERlc2NyaXB0aW9uKCkgOiBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKCkgewotCQl1cGRhdGVUYXJnZXRBY3Rpb24oKTsKLQkJcmV0dXJuIChmVGFyZ2V0QWN0aW9uICE9IG51bGwgPyBmVGFyZ2V0QWN0aW9uLmdldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKCkgOiBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldEhlbHBMaXN0ZW5lcigpCi0JICovCi0JcHVibGljIEhlbHBMaXN0ZW5lciBnZXRIZWxwTGlzdGVuZXIoKSB7Ci0JCXVwZGF0ZVRhcmdldEFjdGlvbigpOwotCQlyZXR1cm4gKGZUYXJnZXRBY3Rpb24gIT0gbnVsbCA/IGZUYXJnZXRBY3Rpb24uZ2V0SGVscExpc3RlbmVyKCkgOiBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldEhvdmVySW1hZ2VEZXNjcmlwdG9yKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEhvdmVySW1hZ2VEZXNjcmlwdG9yKCkgewotCQl1cGRhdGVUYXJnZXRBY3Rpb24oKTsKLQkJcmV0dXJuIChmVGFyZ2V0QWN0aW9uICE9IG51bGwgPyBmVGFyZ2V0QWN0aW9uLmdldEhvdmVySW1hZ2VEZXNjcmlwdG9yKCkgOiBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldElkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyBoYXNoQ29kZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0SW1hZ2VEZXNjcmlwdG9yKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJdXBkYXRlVGFyZ2V0QWN0aW9uKCk7Ci0JCXJldHVybiAoZlRhcmdldEFjdGlvbiAhPSBudWxsID8gZlRhcmdldEFjdGlvbi5nZXRJbWFnZURlc2NyaXB0b3IoKSA6IG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0TWVudUNyZWF0b3IoKQotCSAqLwotCXB1YmxpYyBJTWVudUNyZWF0b3IgZ2V0TWVudUNyZWF0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0U3R5bGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3R5bGUoKSB7Ci0JCXJldHVybiBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0VGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQl1cGRhdGVUYXJnZXRBY3Rpb24oKTsKLQkJcmV0dXJuIChmVGFyZ2V0QWN0aW9uICE9IG51bGwgPyBmVGFyZ2V0QWN0aW9uLmdldFRleHQoKSA6IG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0VG9vbFRpcFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCXVwZGF0ZVRhcmdldEFjdGlvbigpOwotCQlyZXR1cm4gKGZUYXJnZXRBY3Rpb24gIT0gbnVsbCA/IGZUYXJnZXRBY3Rpb24uZ2V0VG9vbFRpcFRleHQoKSA6IG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jaXNDaGVja2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoKSB7Ci0JCXVwZGF0ZVRhcmdldEFjdGlvbigpOwotCQlyZXR1cm4gKGZUYXJnZXRBY3Rpb24gIT0gbnVsbCA/IGZUYXJnZXRBY3Rpb24uaXNDaGVja2VkKCkgOiB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2lzRW5hYmxlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQl1cGRhdGVUYXJnZXRBY3Rpb24oKTsKLQkJcmV0dXJuIChmVGFyZ2V0QWN0aW9uICE9IG51bGwgPyBmVGFyZ2V0QWN0aW9uLmlzRW5hYmxlZCgpIDogZmFsc2UpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jaXNIYW5kbGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0hhbmRsZWQoKSB7Ci0JCXVwZGF0ZVRhcmdldEFjdGlvbigpOwotCQlyZXR1cm4gKGZUYXJnZXRBY3Rpb24gIT0gbnVsbCA/IGZUYXJnZXRBY3Rpb24uaXNIYW5kbGVkKCkgOiBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNyZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXVwZGF0ZVRhcmdldEFjdGlvbigpOwotCQlpZiAoZlRhcmdldEFjdGlvbiAhPSBudWxsKQotCQkJZlRhcmdldEFjdGlvbi5ydW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bldpdGhFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJdXBkYXRlVGFyZ2V0QWN0aW9uKCk7Ci0JCWlmIChmVGFyZ2V0QWN0aW9uICE9IG51bGwpCi0JCQlmVGFyZ2V0QWN0aW9uLnJ1bldpdGhFdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogTk9UIFNVUFBPUlRFRAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0QWNjZWxlcmF0b3IoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2VsZXJhdG9yKGludCBrZXljb2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRBY3Rpb25EZWZpbml0aW9uSWQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25EZWZpbml0aW9uSWQoU3RyaW5nIGlkKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRDaGVja2VkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hlY2tlZChib29sZWFuIGNoZWNrZWQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldERlc2NyaXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHRleHQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IgbmV3SW1hZ2UpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldEVuYWJsZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0SGVscExpc3RlbmVyKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhlbHBMaXN0ZW5lcihIZWxwTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldEhvdmVySW1hZ2VEZXNjcmlwdG9yKG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IgbmV3SW1hZ2UpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldElkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRJbWFnZURlc2NyaXB0b3Iob3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IgbmV3SW1hZ2UpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldE1lbnVDcmVhdG9yKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVudUNyZWF0b3IoSU1lbnVDcmVhdG9yIGNyZWF0b3IpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldFRleHQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRUb29sVGlwVGV4dChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvb2xUaXBUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVRhcmdldEFjdGlvbigpIHsKLQkJaWYgKGZTaXRlICE9IG51bGwgJiYgZlNpdGUuZ2V0V29ya2JlbmNoV2luZG93KCkgIT0gbnVsbCAmJiBmU2l0ZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkgIT0gbnVsbCkgewotCQkJSUVkaXRvclBhcnQgcGFydCA9IGZTaXRlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCUlUZXh0RWRpdG9yIGVkaXRvciA9IG51bGw7Ci0JCQlpZiAocGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJCWVkaXRvciA9IChJVGV4dEVkaXRvcikgcGFydDsKLQkJCWVsc2UKLQkJCQllZGl0b3IgPSAoSVRleHRFZGl0b3IpIChwYXJ0ICE9IG51bGwgPyBwYXJ0LmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpIDogbnVsbCk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQlmVGFyZ2V0QWN0aW9uID0gZWRpdG9yLmdldEFjdGlvbihmQWN0aW9uSWQpOwotCQkJfSBlbHNlIHsKLQkJCQlmVGFyZ2V0QWN0aW9uID0gbnVsbDsKLQkJCX0KLQkJfSBlbHNlCi0JCQlmVGFyZ2V0QWN0aW9uID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9DbGVhbnVwQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9DbGVhbnVwQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNGRmMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvQ2xlYW51cEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRFZGl0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xlYW51cEFjdGlvbiBleHRlbmRzIFRleHRFZGl0b3JBY3Rpb24gewotCXByb3RlY3RlZCBEaWFsb2cgZkNsZWFudXBEaWFsb2c7Ci0KLQlwdWJsaWMgQ2xlYW51cEFjdGlvbihSZXNvdXJjZUJ1bmRsZSBidW5kbGUsIFN0cmluZyBwcmVmaXgsIElUZXh0RWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihidW5kbGUsIHByZWZpeCwgZWRpdG9yKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRGlhbG9nIGdldENsZWFudXBEaWFsb2coU2hlbGwgc2hlbGwpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IElTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBnZXRDbGVhbnVwUHJvY2Vzc29yKCk7Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChnZXRUZXh0RWRpdG9yKCkgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dEVkaXRvcikgewotCQkJZmluYWwgU3RydWN0dXJlZFRleHRFZGl0b3IgZWRpdG9yID0gKFN0cnVjdHVyZWRUZXh0RWRpdG9yKSBnZXRUZXh0RWRpdG9yKCk7Ci0JCQlEaWFsb2cgY2xlYW51cERpYWxvZyA9IGdldENsZWFudXBEaWFsb2coZWRpdG9yLmdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCWlmIChjbGVhbnVwRGlhbG9nICE9IG51bGwpIHsKLQkJCQlpZiAoY2xlYW51cERpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJCS8vIHNldHVwIHJ1bm5hYmxlCi0JCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBjbGVhbnVwUHJvY2Vzc29yID0gZ2V0Q2xlYW51cFByb2Nlc3NvcigpOwotCQkJCQkJCWlmIChjbGVhbnVwUHJvY2Vzc29yICE9IG51bGwpCi0JCQkJCQkJCWNsZWFudXBQcm9jZXNzb3IuY2xlYW51cE1vZGVsKGVkaXRvci5nZXRNb2RlbCgpKTsKLQkJCQkJCX0KLQkJCQkJfTsKLQotCQkJCQkvLyBUT0RPOiBtYWtlIGluZGVwZW5kZW50IG9mICdtb2RlbCcuCi0JCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBlZGl0b3IuZ2V0TW9kZWwoKTsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gYmVnaW4gcmVjb3JkaW5nCi0JCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBTU0VVSU1lc3NhZ2VzLkNsZWFudXBfRG9jdW1lbnRfVUlfLCBTU0VVSU1lc3NhZ2VzLkNsZWFudXBfRG9jdW1lbnRfVUlfLCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkJCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gbWFrZSBhIGJpZwotCQkJCQkJCS8vIG1vZGVsIGNoYW5nZQotCQkJCQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0JCQkJCQkJLy8gcnVuCi0JCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZWRpdG9yLmdldFRleHRWaWV3ZXIoKS5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBydW5uYWJsZSk7Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnCi0JCQkJCQkJLy8gbW9kZWwKLQkJCQkJCQkvLyBjaGFuZ2UKLQkJCQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQotCQkJCQkJCS8vIGVuZCByZWNvcmRpbmcKLQkJCQkJCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCW1vZGVsLmVuZFJlY29yZGluZyh0aGlzLCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL0Zvcm1hdEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9Gb3JtYXRBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDExYjkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL0Zvcm1hdEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkxvY2F0aW9uS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9ucy5NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkZvcm1hdFByb2Nlc3NvcnNFeHRlbnNpb25SZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBGb3JtYXRBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIFJlc291cmNlQWN0aW9uRGVsZWdhdGUgewotCi0JY2xhc3MgRm9ybWF0Sm9iIGV4dGVuZHMgSm9iIHsKLQotCQlwdWJsaWMgRm9ybWF0Sm9iKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcihuYW1lKTsKLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotCQkJT2JqZWN0W10gZWxlbWVudHMgPSBmU2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBlbGVtZW50cy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGVsZW1lbnRzW2ldIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJCXByb2Nlc3MobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSwgKElSZXNvdXJjZSkgZWxlbWVudHNbaV0pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJfQotCQkJfQotCQkJbW9uaXRvci5kb25lKCk7Ci0KLQkJCWlmIChmRXJyb3JTdGF0dXMuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPiAwKSB7Ci0JCQkJc3RhdHVzID0gZkVycm9yU3RhdHVzOwotCQkJCWZFcnJvclN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgU1NFVUlNZXNzYWdlcy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV9lcnJvclN0YXR1c01lc3NhZ2UsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgTXVsdGlTdGF0dXMgZkVycm9yU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFNTRVVJUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCBTU0VVSU1lc3NhZ2VzLkZvcm1hdEFjdGlvbkRlbGVnYXRlX2Vycm9yU3RhdHVzTWVzc2FnZSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElGaWxlIGZpbGUpIHsKLQkJaWYobW9uaXRvciA9PSBudWxsIHx8IG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCQkKLQkJdHJ5IHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAxMDApOwotCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJbW9uaXRvci53b3JrZWQoNSk7Ci0JCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCQlJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBnZXRGb3JtYXRQcm9jZXNzb3IoY29udGVudFR5cGUuZ2V0SWQoKSk7Ci0JCQkJaWYgKGZvcm1hdFByb2Nlc3NvciAhPSBudWxsICYmIChtb25pdG9yID09IG51bGwgfHwgIW1vbml0b3IuaXNDYW5jZWxlZCgpKSkgewotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuRm9ybWF0QWN0aW9uRGVsZWdhdGVfMywgbmV3IFN0cmluZ1tde2ZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLnN1YnN0cmluZygxKX0pOwkJCQkJbW9uaXRvci5zdWJUYXNrKG1lc3NhZ2UpOwotCQkJCQlmb3JtYXRQcm9jZXNzb3Iuc2V0UHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IpOwotCQkJCQlmb3JtYXRQcm9jZXNzb3IuZm9ybWF0RmlsZShmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCg5NSk7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsIGUpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV81LCBuZXcgU3RyaW5nW117ZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCl9KTsKLQkJCWZFcnJvclN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgZSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuRm9ybWF0QWN0aW9uRGVsZWdhdGVfNCwgbmV3IFN0cmluZ1tde2ZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpfSk7Ci0JCQlmRXJyb3JTdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGUpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuRm9ybWF0QWN0aW9uRGVsZWdhdGVfNCwgbmV3IFN0cmluZ1tde2ZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpfSk7Ci0JCQlmRXJyb3JTdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGUpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQotCQkvLyBOb3RlOiB0aGUgd29ya2JlbmNoIHNob3VsZCBhbHdheXMgaGF2ZSBhIGRpc3BsYXkKLQkJLy8gKHVubGVzcyBydW5uaW5nIGhlYWRsZXNzKSwgd2hlcmVhcyBEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkvLyBvbmx5IHJldHVybnMgdGhlIGRpc3BsYXkgaWYgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdGhyZWFkCi0JCS8vIGhhcyBvbmUuCi0JCWlmIChQbGF0Zm9ybVVJLmlzV29ya2JlbmNoUnVubmluZygpKQotCQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXQoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCWZpbmFsIElGaWxlIGZpbGUgPSAoSUZpbGUpIHJlc291cmNlOwotCQkJCi0JCQkvLyBCVUcgMTc4NTk4IC0gSWYgdGhlIHJlc291cmNlIGlzIHNoYXJlZCwgYW5kIGl0J3MgcG9zc2libGUgdG8KLQkJCS8vIGdldCB0aGUgd29ya2JlbmNoIERpc3BsYXksIHRoZSBVSSB0aHJlYWQgaXMgYXNrZWQgdG8gZXhlY3V0ZSB0aGUKLQkJCS8vIGZvcm1hdCBvZiB0aGUgZmlsZSB3aGVuIGl0IGNhbgotCQkJdHJ5IHsKLQkJCQlJVGV4dEZpbGVCdWZmZXJNYW5hZ2VyIG1hbmFnZXI9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpOwotCQkJCUlUZXh0RmlsZUJ1ZmZlciBidWZmZXIgPSBudWxsOwotCQkJCQotCQkJCXRyeSB7Ci0JCQkJCWlmKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQkJbWFuYWdlci5jb25uZWN0KGZpbGUuZ2V0RnVsbFBhdGgoKSwgTG9jYXRpb25LaW5kLklGSUxFLCBtb25pdG9yKTsKLQkJCQkJCWJ1ZmZlciA9IG1hbmFnZXIuZ2V0VGV4dEZpbGVCdWZmZXIocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSwgTG9jYXRpb25LaW5kLklGSUxFKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYoYnVmZmVyICE9IG51bGwgJiYgYnVmZmVyLmlzU2hhcmVkKCkpIHsKLQkJCQkJCURpc3BsYXkgZGlzcGxheSA9IGdldERpc3BsYXkoKTsKLQkJCQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJZm9ybWF0KG1vbml0b3IsIGZpbGUpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCWZvcm1hdChtb25pdG9yLCBmaWxlKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmKG1hbmFnZXIgIT0gbnVsbCkKLQkJCQkJCW1hbmFnZXIuZGlzY29ubmVjdChmaWxlLmdldEZ1bGxQYXRoKCksIExvY2F0aW9uS2luZC5JRklMRSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChTU0VVSU1lc3NhZ2VzLkZvcm1hdEFjdGlvbkRlbGVnYXRlXzQsIG5ldyBTdHJpbmdbXXtmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKX0pOwotCQkJCWZFcnJvclN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgZSkpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYobW9uaXRvciAhPSBudWxsKQotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJCQotCQl9IGVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgcmVzb3VyY2U7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJSVJlc291cmNlW10gbWVtYmVycyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIG1lbWJlcnMubGVuZ3RoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKG1vbml0b3IgIT0gbnVsbCAmJiAhbW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCQlmb3JtYXQobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSwgbWVtYmVyc1tpXSk7Ci0JCQkJfQotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChTU0VVSU1lc3NhZ2VzLkZvcm1hdEFjdGlvbkRlbGVnYXRlXzQsIG5ldyBTdHJpbmdbXXtyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCl9KTsKLQkJCQlmRXJyb3JTdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGUpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBnZXRGb3JtYXRQcm9jZXNzb3IoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJcmV0dXJuIEZvcm1hdFByb2Nlc3NvcnNFeHRlbnNpb25SZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRGb3JtYXRQcm9jZXNzb3IoY29udGVudFR5cGVJZCk7Ci0JfQotCi0JcHJvdGVjdGVkIEpvYiBnZXRKb2IoKSB7Ci0JCXJldHVybiBuZXcgRm9ybWF0Sm9iKFNTRVVJTWVzc2FnZXMuRm9ybWF0QWN0aW9uRGVsZWdhdGVfam9iTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51dGlsLlJlc291cmNlQWN0aW9uRGVsZWdhdGUjcHJvY2VzcyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAxMDApOwotCQlmb3JtYXQobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCA5OCksIHJlc291cmNlKTsKLQotCQl0cnkgewotCQkJcmVzb3VyY2UucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAyKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChTU0VVSU1lc3NhZ2VzLkZvcm1hdEFjdGlvbkRlbGVnYXRlXzQsIG5ldyBTdHJpbmdbXXtyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCl9KTsKLQkJCWZFcnJvclN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgZSkpOwotCQl9Ci0JCW1vbml0b3IuZG9uZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5SZXNvdXJjZUFjdGlvbkRlbGVnYXRlI3Byb2Nlc3NvckF2YWlsYWJsZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc29yQXZhaWxhYmxlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAocmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcmVzb3VyY2U7Ci0KLQkJCQkJSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gbnVsbDsKLQkJCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpOwotCQkJCQkJZm9ybWF0UHJvY2Vzc29yID0gZ2V0Rm9ybWF0UHJvY2Vzc29yKGNvbnRlbnRUeXBlLmdldElkKCkpOwotCQkJCQl9Ci0JCQkJCWlmIChmb3JtYXRQcm9jZXNzb3IgIT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ29udGFpbmVyKSByZXNvdXJjZTsKLQkJCQkJSVJlc291cmNlW10gbWVtYmVyczsKLQkJCQkJbWVtYmVycyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJCQkJYm9vbGVhbiBhdmFpbGFibGUgPSBwcm9jZXNzb3JBdmFpbGFibGUobWVtYmVyc1tpXSk7Ci0KLQkJCQkJCWlmIChhdmFpbGFibGUpIHsKLQkJCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL1Jlc291cmNlQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL1Jlc291cmNlQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkwNzkyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZXNvdXJjZUFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZTsKLQotcHVibGljIGNsYXNzIFJlc291cmNlQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUgewotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCi0JcHJpdmF0ZSBJV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZSBnZXRBY3RpdmVQcm9ncmVzc1NlcnZpY2UoKSB7Ci0JCUlXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotCQlpZiAoUGxhdGZvcm1VSS5pc1dvcmtiZW5jaFJ1bm5pbmcoKSkgewotCQkJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXb3JrYmVuY2hXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJaWYgKGFjdGl2ZVdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKSB7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IGFjdGl2ZVdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJCQlJV29ya2JlbmNoUGFydCBhY3RpdmVQYXJ0ID0gYWN0aXZlUGFnZS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQkJCWlmIChhY3RpdmVQYXJ0ICE9IG51bGwpIHsKLQkJCQkJCXNlcnZpY2UgPSAoSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2UpIGFjdGl2ZVBhcnQuZ2V0U2l0ZSgpLmdldEFkYXB0ZXIoSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2UuY2xhc3MpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzZXJ2aWNlOwotCX0KLQotCXByb3RlY3RlZCBKb2IgZ2V0Sm9iKCkgewotCQkvLyBSZXNvdXJjZUFjdGlvbkRlbGVnYXRlIGRvZXMgbm90IGNyZWF0ZSBiYWNrZ3JvdW5kIGpvYgotCQkvLyBzdWJjbGFzcyBjcmVhdGVzIHRoZSBiYWNrZ3JvdW5kIGpvYiBmb3IgdGhlIGFjdGlvbgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzb3JBdmFpbGFibGUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCS8vIFJlc291cmNlQWN0aW9uRGVsZWdhdGUgcmV0dXJucyBmYWxzZSBieSBkZWZhdWx0Ci0JCS8vIHN1YmNsYXNzIHJldHVybnMgdHJ1ZSBpZiBwcm9jZXNzb3IgaXMgYXZhaWxhYmxlOyBmYWxzZSBvdGhlcndpc2UKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGZTZWxlY3Rpb24gIT0gbnVsbCAmJiAhZlNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCUpvYiBqb2IgPSBnZXRKb2IoKTsKLQkJCWlmIChqb2IgIT0gbnVsbCkgewotCQkJCUlXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlIHByb2dyZXNzU2VydmljZSA9IGdldEFjdGl2ZVByb2dyZXNzU2VydmljZSgpOwotCQkJCWlmIChwcm9ncmVzc1NlcnZpY2UgIT0gbnVsbCkgewotCQkJCQlwcm9ncmVzc1NlcnZpY2Uuc2NoZWR1bGUoam9iKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWpvYi5zY2hlZHVsZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlmU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlib29sZWFuIGF2YWlsYWJsZSA9IGZhbHNlOwotCi0JCQlPYmplY3RbXSBlbGVtZW50cyA9IGZTZWxlY3Rpb24udG9BcnJheSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChlbGVtZW50c1tpXSBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCQlhdmFpbGFibGUgPSBwcm9jZXNzb3JBdmFpbGFibGUoKElSZXNvdXJjZSkgZWxlbWVudHNbaV0pOwotCi0JCQkJCWlmIChhdmFpbGFibGUpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWFjdGlvbi5zZXRFbmFibGVkKGF2YWlsYWJsZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL1N0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9TdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTQzY2MxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL1N0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX0FERF9CTE9DS19DT01NRU5UID0gIkFkZEJsb2NrQ29tbWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX0NMRUFOVVBfRE9DVU1FTlQgPSAiQ2xlYW51cERvY3VtZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfQ09NTUVOVCA9ICJDb21tZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfQ09OVEVOVEFTU0lTVF9DT05URVhUX0lORk9STUFUSU9OID0gIkNvbnRlbnRBc3Npc3RDb250ZXh0SW5mb3JtYXRpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9DT05URU5UQVNTSVNUX1BST1BPU0FMUyA9ICJDb250ZW50QXNzaXN0UHJvcG9zYWxzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfRklORF9PQ0NVUlJFTkNFUyA9ICJGaW5kT2NjdXJyZW5jZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfRk9STUFUX0FDVElWRV9FTEVNRU5UUyA9ICJGb3JtYXRBY3RpdmVFbGVtZW50cyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX0ZPUk1BVF9ET0NVTUVOVCA9ICJGb3JtYXREb2N1bWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX01BTkFHRV9CUkVBS1BPSU5UUyA9ICJNYW5hZ2VCcmVha3BvaW50cyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX09QRU5fRklMRSA9ICJPcGVuRmlsZUZyb21Tb3VyY2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9SRU1PVkVfQkxPQ0tfQ09NTUVOVCA9ICJSZW1vdmVCbG9ja0NvbW1lbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9TVFJVQ1RVUkVfU0VMRUNUX0VOQ0xPU0lORyA9ICJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9TVFJVQ1RVUkVfU0VMRUNUX0hJU1RPUlkgPSAiU3RydWN0dXJlU2VsZWN0SGlzdG9yeSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX1NUUlVDVFVSRV9TRUxFQ1RfTkVYVCA9ICJTdHJ1Y3R1cmVTZWxlY3ROZXh0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfU1RSVUNUVVJFX1NFTEVDVF9QUkVWSU9VUyA9ICJTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91cyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX1RPR0dMRV9DT01NRU5UID0gIlRvZ2dsZUNvbW1lbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9VTkNPTU1FTlQgPSAiVW5jb21tZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfR09UT19NQVRDSElOR19CUkFDS0VUID0gIkdvdG9NYXRjaGluZ0JyYWNrZXQiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBVTkRFUlNDT1JFIGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBET1QgPSAiLiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVOREVSU0NPUkUgPSAiXyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEdST1VQX05BTUVfTUVOVV9BRERJVElPTlMgPSAiTWVudUFkZGl0aW9ucyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEdST1VQX05BTUVfVE9PTEJBUl9BRERJVElPTlMgPSAiVG9vbGJhckFkZGl0aW9ucyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RBVFVTX0NBVEVHT1JZX09GRlNFVCA9ICJPZmZzZXQiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzODJhNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5jb250ZW50YXNzaXN0LklTdWJqZWN0Q29udHJvbENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuY29udGVudGFzc2lzdC5JU3ViamVjdENvbnRyb2xDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuY29udGVudGFzc2lzdC5JU3ViamVjdENvbnRyb2xDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklSZWxlYXNhYmxlOwotCi0vKioKLSAqIEEgcHJvY2Vzc29yIHRoYXQgYWdncmVnYXRlcyB0aGUgcHJvcG9zYWxzIG9mIG11bHRpcGxlIG90aGVyIHByb2Nlc3NvcnMuCi0gKiBXaGVuIHByb3Bvc2FscyBhcmUgcmVxdWVzdGVkLCB0aGUgY29udGFpbmVkIHByb2Nlc3NvcnMgYXJlIHF1ZXJpZWQgaW4gdGhlCi0gKiBvcmRlciB0aGV5IHdlcmUgYWRkZWQgdG8gdGhlIGNvbXBvdW5kIG9iamVjdC4gQ29waWVkIGZyb20KLSAqIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkNvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3Nvci4KLSAqIE1vZGlmaWNhdGlvbiB3YXMgbWFkZSB0byBhZGQgYSBkaXNwb3NlKCkgbWV0aG9kLgotICovCi1jbGFzcyBDb21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgaW1wbGVtZW50cyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciwgSVN1YmplY3RDb250cm9sQ29udGVudEFzc2lzdFByb2Nlc3NvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBXcmFwcGVkQ29udGV4dEluZm9ybWF0aW9uIGltcGxlbWVudHMgSUNvbnRleHRJbmZvcm1hdGlvbiwgSUNvbnRleHRJbmZvcm1hdGlvbkV4dGVuc2lvbiB7Ci0JCXByaXZhdGUgSUNvbnRleHRJbmZvcm1hdGlvbiBmSW5mbzsKLQkJcHJpdmF0ZSBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBmUHJvY2Vzc29yOwotCi0JCVdyYXBwZWRDb250ZXh0SW5mb3JtYXRpb24oSUNvbnRleHRJbmZvcm1hdGlvbiBpbmZvLCBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IpIHsKLQkJCWZJbmZvID0gaW5mbzsKLQkJCWZQcm9jZXNzb3IgPSBwcm9jZXNzb3I7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIGZJbmZvLmVxdWFscyhvYmopOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbiNnZXRDb250ZXh0RGlzcGxheVN0cmluZygpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldENvbnRleHREaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIGZJbmZvLmdldENvbnRleHREaXNwbGF5U3RyaW5nKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uI2dldEltYWdlKCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJCXJldHVybiBmSW5mby5nZXRJbWFnZSgpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbiNnZXRJbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZkluZm8uZ2V0SW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCQkgKi8KLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCXJldHVybiBmSW5mby5oYXNoQ29kZSgpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZkluZm8udG9TdHJpbmcoKTsKLQkJfQotCi0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldFByb2Nlc3NvcigpIHsKLQkJCXJldHVybiBmUHJvY2Vzc29yOwotCQl9Ci0KLQkJSUNvbnRleHRJbmZvcm1hdGlvbiBnZXRDb250ZXh0SW5mb3JtYXRpb24oKSB7Ci0JCQlyZXR1cm4gZkluZm87Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvbnRleHRJbmZvcm1hdGlvblBvc2l0aW9uKCkgewotCQkJaW50IHBvc2l0aW9uID0gLTE7Ci0JCQlpZiAoZkluZm8gaW5zdGFuY2VvZiBJQ29udGV4dEluZm9ybWF0aW9uRXh0ZW5zaW9uKQotCQkJCXBvc2l0aW9uID0gKChJQ29udGV4dEluZm9ybWF0aW9uRXh0ZW5zaW9uKWZJbmZvKS5nZXRDb250ZXh0SW5mb3JtYXRpb25Qb3NpdGlvbigpOwotCQkJcmV0dXJuIHBvc2l0aW9uOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tcG91bmRDb250ZW50QXNzaXN0VmFsaWRhdG9yIGltcGxlbWVudHMgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciB7Ci0JCUxpc3QgZlZhbGlkYXRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZlZhbGlkYXRvcjsKLQotCQl2b2lkIGFkZChJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQkJZlZhbGlkYXRvcnMuYWRkKHZhbGlkYXRvcik7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yI2luc3RhbGwob3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb24sCi0JCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwgaW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5zdGFsbChJQ29udGV4dEluZm9ybWF0aW9uIGluZm8sIElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJCS8vIGluc3RhbGwgZWl0aGVyIHRoZSB2YWxpZGF0b3IgaW4gdGhlIGluZm8sIG9yIGFsbCB2YWxpZGF0b3JzCi0JCQlmVmFsaWRhdG9yID0gZ2V0VmFsaWRhdG9yKGluZm8pOwotCQkJSUNvbnRleHRJbmZvcm1hdGlvbiByZWFsSW5mbyA9IGdldENvbnRleHRJbmZvcm1hdGlvbihpbmZvKTsKLQkJCWlmIChmVmFsaWRhdG9yICE9IG51bGwpCi0JCQkJZlZhbGlkYXRvci5pbnN0YWxsKHJlYWxJbmZvLCB2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJZWxzZSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGZWYWxpZGF0b3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciB2ID0gKElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IpIGl0Lm5leHQoKTsKLQkJCQkJdi5pbnN0YWxsKHJlYWxJbmZvLCB2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUlDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKElDb250ZXh0SW5mb3JtYXRpb24gaW5mbykgewotCQkJaWYgKGluZm8gaW5zdGFuY2VvZiBXcmFwcGVkQ29udGV4dEluZm9ybWF0aW9uKSB7Ci0JCQkJV3JhcHBlZENvbnRleHRJbmZvcm1hdGlvbiB3cmFwID0gKFdyYXBwZWRDb250ZXh0SW5mb3JtYXRpb24pIGluZm87Ci0JCQkJcmV0dXJuIHdyYXAuZ2V0UHJvY2Vzc29yKCkuZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSUNvbnRleHRJbmZvcm1hdGlvbiBnZXRDb250ZXh0SW5mb3JtYXRpb24oSUNvbnRleHRJbmZvcm1hdGlvbiBpbmZvKSB7Ci0JCQlJQ29udGV4dEluZm9ybWF0aW9uIHJlYWxJbmZvID0gaW5mbzsKLQkJCWlmIChpbmZvIGluc3RhbmNlb2YgV3JhcHBlZENvbnRleHRJbmZvcm1hdGlvbikgewotCQkJCVdyYXBwZWRDb250ZXh0SW5mb3JtYXRpb24gd3JhcCA9IChXcmFwcGVkQ29udGV4dEluZm9ybWF0aW9uKSBpbmZvOwotCQkJCXJlYWxJbmZvID0gd3JhcC5nZXRDb250ZXh0SW5mb3JtYXRpb24oKTsKLQkJCX0KLQotCQkJcmV0dXJuIHJlYWxJbmZvOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciNpc0NvbnRleHRJbmZvcm1hdGlvblZhbGlkKGludCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzQ29udGV4dEluZm9ybWF0aW9uVmFsaWQoaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJCS8vIHVzZSBlaXRoZXIgdGhlIHZhbGlkYXRvciBpbiB0aGUgaW5mbywgb3IgYWxsIHZhbGlkYXRvcnMKLQkJCWJvb2xlYW4gaXNWYWxpZCA9IGZhbHNlOwotCQkJaWYgKGZWYWxpZGF0b3IgIT0gbnVsbCkKLQkJCQlpc1ZhbGlkID0gZlZhbGlkYXRvci5pc0NvbnRleHRJbmZvcm1hdGlvblZhbGlkKGRvY3VtZW50UG9zaXRpb24pOwotCQkJZWxzZSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGZWYWxpZGF0b3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciB2ID0gKElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IpIGl0Lm5leHQoKTsKLQkJCQkJaXNWYWxpZCB8PSB2LmlzQ29udGV4dEluZm9ybWF0aW9uVmFsaWQoZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGlzVmFsaWQ7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbXBvdW5kQ29udGVudEFzc2lzdFZhbGlkYXRvclByZXNlbnRlciBleHRlbmRzIENvbXBvdW5kQ29udGVudEFzc2lzdFZhbGlkYXRvciBpbXBsZW1lbnRzIElDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIgewotCQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVQcmVzZW50YXRpb24oaW50IG9mZnNldCwgVGV4dFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24pIHsKLQkJCS8vIHVzZSBlaXRoZXIgdGhlIHZhbGlkYXRvciBpbiB0aGUgaW5mbywgb3IgYWxsIHZhbGlkYXRvcnMKLQkJCWJvb2xlYW4gcHJlc2VudGF0aW9uVXBkYXRlZCA9IGZhbHNlOwotCQkJaWYgKGZWYWxpZGF0b3IgaW5zdGFuY2VvZiBJQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyKQotCQkJCXByZXNlbnRhdGlvblVwZGF0ZWQgPSAoKElDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIpIGZWYWxpZGF0b3IpLnVwZGF0ZVByZXNlbnRhdGlvbihvZmZzZXQsIHByZXNlbnRhdGlvbik7Ci0JCQllbHNlIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZlZhbGlkYXRvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIHYgPSAoSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcikgaXQubmV4dCgpOwotCQkJCQlpZiAodiBpbnN0YW5jZW9mIElDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIpCi0JCQkJCQlwcmVzZW50YXRpb25VcGRhdGVkIHw9ICgoSUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlcikgdikudXBkYXRlUHJlc2VudGF0aW9uKG9mZnNldCwgcHJlc2VudGF0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcHJlc2VudGF0aW9uVXBkYXRlZDsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbXBvdW5kQ29udGVudEFzc2lzdFZhbGlkYXRvckV4IGV4dGVuZHMgQ29tcG91bmRDb250ZW50QXNzaXN0VmFsaWRhdG9yIGltcGxlbWVudHMgSVN1YmplY3RDb250cm9sQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIHsKLQkJLyoKLQkJICogQHNlZSBJU3ViamVjdENvbnRyb2xDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IjaW5zdGFsbChJQ29udGV4dEluZm9ybWF0aW9uLAotCQkgKiAgICAgIElDb250ZW50QXNzaXN0U3ViamVjdENvbnRyb2wsIGludCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGluc3RhbGwoSUNvbnRleHRJbmZvcm1hdGlvbiBpbmZvLCBJQ29udGVudEFzc2lzdFN1YmplY3RDb250cm9sIGNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbCwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJCS8vIGluc3RhbGwgZWl0aGVyIHRoZSB2YWxpZGF0b3IgaW4gdGhlIGluZm8sIG9yIGFsbCB2YWxpZGF0b3JzCi0JCQlmVmFsaWRhdG9yID0gZ2V0VmFsaWRhdG9yKGluZm8pOwotCQkJSUNvbnRleHRJbmZvcm1hdGlvbiByZWFsSW5mbyA9IGdldENvbnRleHRJbmZvcm1hdGlvbihpbmZvKTsKLQkJCWlmIChmVmFsaWRhdG9yIGluc3RhbmNlb2YgSVN1YmplY3RDb250cm9sQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKQotCQkJCSgoSVN1YmplY3RDb250cm9sQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKSBmVmFsaWRhdG9yKS5pbnN0YWxsKHJlYWxJbmZvLCBjb250ZW50QXNzaXN0U3ViamVjdENvbnRyb2wsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJZWxzZSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGZWYWxpZGF0b3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJaWYgKGl0Lm5leHQoKSBpbnN0YW5jZW9mIElTdWJqZWN0Q29udHJvbENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcikKLQkJCQkJCSgoSVN1YmplY3RDb250cm9sQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKSBpdC5uZXh0KCkpLmluc3RhbGwocmVhbEluZm8sIGNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbCwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb21wb3VuZENvbnRlbnRBc3Npc3RWYWxpZGF0b3JQcmVzZW50ZXJFeCBleHRlbmRzIENvbXBvdW5kQ29udGVudEFzc2lzdFZhbGlkYXRvclByZXNlbnRlciBpbXBsZW1lbnRzIElTdWJqZWN0Q29udHJvbENvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlciwgSVN1YmplY3RDb250cm9sQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIHsKLQkJLyoKLQkJICogQHNlZSBJU3ViamVjdENvbnRyb2xDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIjaW5zdGFsbChJQ29udGV4dEluZm9ybWF0aW9uLAotCQkgKiAgICAgIElDb250ZW50QXNzaXN0U3ViamVjdENvbnRyb2wsIGludCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGluc3RhbGwoSUNvbnRleHRJbmZvcm1hdGlvbiBpbmZvLCBJQ29udGVudEFzc2lzdFN1YmplY3RDb250cm9sIGNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbCwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJCS8vIGluc3RhbGwgZWl0aGVyIHRoZSB2YWxpZGF0b3IgaW4gdGhlIGluZm8sIG9yIGFsbCB2YWxpZGF0b3JzCi0JCQlmVmFsaWRhdG9yID0gZ2V0VmFsaWRhdG9yKGluZm8pOwotCQkJSUNvbnRleHRJbmZvcm1hdGlvbiByZWFsSW5mbyA9IGdldENvbnRleHRJbmZvcm1hdGlvbihpbmZvKTsKLQotCQkJaWYgKGZWYWxpZGF0b3IgaW5zdGFuY2VvZiBJU3ViamVjdENvbnRyb2xDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IpCi0JCQkJKChJU3ViamVjdENvbnRyb2xDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IpIGZWYWxpZGF0b3IpLmluc3RhbGwocmVhbEluZm8sIGNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbCwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQllbHNlIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZlZhbGlkYXRvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlpZiAoaXQubmV4dCgpIGluc3RhbmNlb2YgSVN1YmplY3RDb250cm9sQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKQotCQkJCQkJKChJU3ViamVjdENvbnRyb2xDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IpIGl0Lm5leHQoKSkuaW5zdGFsbChyZWFsSW5mbywgY29udGVudEFzc2lzdFN1YmplY3RDb250cm9sLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgZmluYWwgU2V0IGZQcm9jZXNzb3JzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLQlwcml2YXRlIFN0cmluZyBmRXJyb3JNZXNzYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugd2l0aCBvbmUgY2hpbGQgcHJvY2Vzc29yLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzb3IKLQkgKiAgICAgICAgICAgIHRoZSBwcm9jZXNzb3IgdG8gYWRkCi0JICovCi0JcHVibGljIENvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvcihJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IpIHsKLQkJYWRkKHByb2Nlc3Nvcik7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHByb2Nlc3NvciB0byB0aGlzIGNvbXBvdW5kIHByb2Nlc3Nvci4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2Vzc29yCi0JICogICAgICAgICAgICB0aGUgcHJvY2Vzc29yIHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChwcm9jZXNzb3IpOwotCQlmUHJvY2Vzc29ycy5hZGQocHJvY2Vzc29yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgcHJvY2Vzc29yIGZyb20gdGhpcyBjb21wb3VuZCBwcm9jZXNzb3IuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3NvcgotCSAqICAgICAgICAgICAgdGhlIHByb2Nlc3NvciB0byByZW1vdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yKSB7Ci0JCWZQcm9jZXNzb3JzLnJlbW92ZShwcm9jZXNzb3IpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgYW5kIGFkZHMgYWxsIHNwZWNpZmllZCBwcm9jZXNzb3JzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzb3JzCi0JICovCi0JcHVibGljIENvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvcihJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIHByb2Nlc3NvcnMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9jZXNzb3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhZGQocHJvY2Vzc29yc1tpXSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2NvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlmRXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJTGlzdCByZXQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZlByb2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgaXQubmV4dCgpOwotCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IHAuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudE9mZnNldCk7Ci0JCQlpZiAocHJvcG9zYWxzICE9IG51bGwgJiYgcHJvcG9zYWxzLmxlbmd0aCA+IDApIHsKLQkJCQlyZXQuYWRkQWxsKEFycmF5cy5hc0xpc3QocHJvcG9zYWxzKSk7Ci0JCQkJZkVycm9yTWVzc2FnZSA9IG51bGw7IC8vIEhpZGUgcHJldmlvdXMgZXJyb3JzCi0JCQl9IGVsc2UgewotCQkJCWlmIChmRXJyb3JNZXNzYWdlID09IG51bGwgJiYgcmV0LmlzRW1wdHkoKSkgewotCQkJCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gcC5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJCQkJaWYgKGVycm9yTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJCQlmRXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSByZXQudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtyZXQuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIDxwPgotCSAqIFRoZSByZXR1cm5lZCBvYmplY3RzIGFyZSB3cmFwcGVyIG9iamVjdHMgYXJvdW5kIHRoZSByZWFsIGluZm9ybWF0aW9uCi0JICogY29udGFpbmVycy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uW10gY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlmRXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJTGlzdCByZXQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZlByb2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgaXQubmV4dCgpOwotCQkJSUNvbnRleHRJbmZvcm1hdGlvbltdIGluZm9ybWF0aW9ucyA9IHAuY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbih2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KTsKLQkJCWlmIChpbmZvcm1hdGlvbnMgIT0gbnVsbCAmJiBpbmZvcm1hdGlvbnMubGVuZ3RoID4gMCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3JtYXRpb25zLmxlbmd0aDsgaSsrKQotCQkJCQlyZXQuYWRkKG5ldyBXcmFwcGVkQ29udGV4dEluZm9ybWF0aW9uKGluZm9ybWF0aW9uc1tpXSwgcCkpOwotCQkJCWZFcnJvck1lc3NhZ2UgPSBudWxsOyAvLyBIaWRlIHByZXZpb3VzIGVycm9ycwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZkVycm9yTWVzc2FnZSA9PSBudWxsICYmIHJldC5pc0VtcHR5KCkpIHsKLQkJCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IHAuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCQkJCWlmIChlcnJvck1lc3NhZ2UgIT0gbnVsbCkgewotCQkJCQkJZkVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKElDb250ZXh0SW5mb3JtYXRpb25bXSkgcmV0LnRvQXJyYXkobmV3IElDb250ZXh0SW5mb3JtYXRpb25bcmV0LnNpemUoKV0pOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJU2V0IHJldCA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBmUHJvY2Vzc29ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwID0gKElDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBpdC5uZXh0KCk7Ci0JCQljaGFyW10gY2hhcnMgPSBwLmdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpOwotCQkJaWYgKGNoYXJzICE9IG51bGwpCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkrKykKLQkJCQkJcmV0LmFkZChuZXcgQ2hhcmFjdGVyKGNoYXJzW2ldKSk7Ci0JCX0KLQotCQljaGFyW10gY2hhcnMgPSBuZXcgY2hhcltyZXQuc2l6ZSgpXTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmV0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgaSsrKSB7Ci0JCQlDaGFyYWN0ZXIgY2ggPSAoQ2hhcmFjdGVyKSBpdC5uZXh0KCk7Ci0JCQljaGFyc1tpXSA9IGNoLmNoYXJWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBjaGFyczsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCVNldCByZXQgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZlByb2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgaXQubmV4dCgpOwotCQkJY2hhcltdIGNoYXJzID0gcC5nZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKTsKLQkJCWlmIChjaGFycyAhPSBudWxsKQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKyspCi0JCQkJCXJldC5hZGQobmV3IENoYXJhY3RlcihjaGFyc1tpXSkpOwotCQl9Ci0KLQkJY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbcmV0LnNpemUoKV07Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHJldC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7IGkrKykgewotCQkJQ2hhcmFjdGVyIGNoID0gKENoYXJhY3RlcikgaXQubmV4dCgpOwotCQkJY2hhcnNbaV0gPSBjaC5jaGFyVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gY2hhcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSBvZiBvbmUgb2YKLQkgKiBjb250YWluZWQgcHJvY2Vzc29yIGlmIGFueSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJvY2Vzc29yIGhhcyBhbgotCSAqIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0RXJyb3JNZXNzYWdlKCkKLQkgKiBAcmV0dXJuIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGZFcnJvck1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIDxwPgotCSAqIFRoZSByZXR1cm5lZCB2YWxpZGF0b3IgaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgdmFsaWRhdG9ycyBwcm92aWRlZCBieQotCSAqIHRoZSBjaGlsZCBwcm9jZXNzb3JzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpIHsKLQkJYm9vbGVhbiBoYXNWYWxpZGF0b3IgPSBmYWxzZTsKLQkJYm9vbGVhbiBoYXNQcmVzZW50ZXIgPSBmYWxzZTsKLQkJYm9vbGVhbiBoYXNFeHRlbnNpb24gPSBmYWxzZTsKLQotCQlJdGVyYXRvciBpdHAgPSBmUHJvY2Vzc29ycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRwLmhhc05leHQoKSAmJiAoIWhhc1ByZXNlbnRlciB8fCAhaGFzRXh0ZW5zaW9uKSkgewotCQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgaXRwLm5leHQoKTsKLQkJCUlDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgdiA9IHAuZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCk7Ci0JCQlpZiAodiAhPSBudWxsKSB7Ci0JCQkJaGFzVmFsaWRhdG9yID0gdHJ1ZTsKLQkJCQlpZiAodiBpbnN0YW5jZW9mIElDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIpIHsKLQkJCQkJaGFzUHJlc2VudGVyID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKHYgaW5zdGFuY2VvZiBJU3ViamVjdENvbnRyb2xDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIgfHwgdiBpbnN0YW5jZW9mIElTdWJqZWN0Q29udHJvbENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcikgewotCQkJCQloYXNFeHRlbnNpb24gPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUNvbXBvdW5kQ29udGVudEFzc2lzdFZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCQlpZiAoaGFzUHJlc2VudGVyICYmIGhhc0V4dGVuc2lvbikKLQkJCXZhbGlkYXRvciA9IG5ldyBDb21wb3VuZENvbnRlbnRBc3Npc3RWYWxpZGF0b3JQcmVzZW50ZXJFeCgpOwotCQllbHNlIGlmIChoYXNQcmVzZW50ZXIpCi0JCQl2YWxpZGF0b3IgPSBuZXcgQ29tcG91bmRDb250ZW50QXNzaXN0VmFsaWRhdG9yUHJlc2VudGVyKCk7Ci0JCWVsc2UgaWYgKGhhc0V4dGVuc2lvbikKLQkJCXZhbGlkYXRvciA9IG5ldyBDb21wb3VuZENvbnRlbnRBc3Npc3RWYWxpZGF0b3JFeCgpOwotCQllbHNlIGlmIChoYXNWYWxpZGF0b3IpCi0JCQl2YWxpZGF0b3IgPSBuZXcgQ29tcG91bmRDb250ZW50QXNzaXN0VmFsaWRhdG9yKCk7Ci0KLQkJaWYgKHZhbGlkYXRvciAhPSBudWxsKQotCQkJZm9yIChJdGVyYXRvciBpdCA9IGZQcm9jZXNzb3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwID0gKElDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBpdC5uZXh0KCk7Ci0JCQkJSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciB2ID0gcC5nZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKTsKLQkJCQlpZiAodiAhPSBudWxsKQotCQkJCQl2YWxpZGF0b3IuYWRkKHYpOwotCQkJfQotCi0JCXJldHVybiB2YWxpZGF0b3I7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTdWJqZWN0Q29udHJvbENvbnRlbnRBc3Npc3RQcm9jZXNzb3IjY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSUNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElDb250ZW50QXNzaXN0U3ViamVjdENvbnRyb2wgY29udGVudEFzc2lzdFN1YmplY3RDb250cm9sLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJZkVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCUxpc3QgcmV0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGZQcm9jZXNzb3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBJU3ViamVjdENvbnRyb2xDb250ZW50QXNzaXN0UHJvY2Vzc29yKSB7Ci0JCQkJSVN1YmplY3RDb250cm9sQ29udGVudEFzc2lzdFByb2Nlc3NvciBwID0gKElTdWJqZWN0Q29udHJvbENvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIG87Ci0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IHAuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFN1YmplY3RDb250cm9sLCBkb2N1bWVudE9mZnNldCk7Ci0JCQkJaWYgKHByb3Bvc2FscyAhPSBudWxsICYmIHByb3Bvc2Fscy5sZW5ndGggPiAwKSB7Ci0JCQkJCXJldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChwcm9wb3NhbHMpKTsKLQkJCQkJZkVycm9yTWVzc2FnZSA9IG51bGw7IC8vIEhpZGUgcHJldmlvdXMgZXJyb3JzCi0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGZFcnJvck1lc3NhZ2UgPT0gbnVsbCAmJiByZXQuaXNFbXB0eSgpKSB7Ci0JCQkJCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gcC5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJCQkJCWlmIChlcnJvck1lc3NhZ2UgIT0gbnVsbCkgewotCQkJCQkJCWZFcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgcmV0LnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcmV0LnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiA8cD4KLQkgKiBUaGUgcmV0dXJuZWQgb2JqZWN0cyBhcmUgd3JhcHBlciBvYmplY3RzIGFyb3VuZCB0aGUgcmVhbCBpbmZvcm1hdGlvbgotCSAqIGNvbnRhaW5lcnMuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuY29udGVudGFzc2lzdC5JU3ViamVjdENvbnRyb2xDb250ZW50QXNzaXN0UHJvY2Vzc29yI2NvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0U3ViamVjdCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbltdIGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oSUNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbCBjb250ZW50QXNzaXN0U3ViamVjdENvbnRyb2wsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlmRXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJTGlzdCByZXQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZlByb2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIElTdWJqZWN0Q29udHJvbENvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIHsKLQkJCQlJU3ViamVjdENvbnRyb2xDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSAoSVN1YmplY3RDb250cm9sQ29udGVudEFzc2lzdFByb2Nlc3NvcikgbzsKLQkJCQlJQ29udGV4dEluZm9ybWF0aW9uW10gaW5mb3JtYXRpb25zID0gcC5jb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKGNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbCwgZG9jdW1lbnRPZmZzZXQpOwotCQkJCWlmIChpbmZvcm1hdGlvbnMgIT0gbnVsbCAmJiBpbmZvcm1hdGlvbnMubGVuZ3RoID4gMCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZm9ybWF0aW9ucy5sZW5ndGg7IGkrKykKLQkJCQkJCXJldC5hZGQobmV3IFdyYXBwZWRDb250ZXh0SW5mb3JtYXRpb24oaW5mb3JtYXRpb25zW2ldLCBwKSk7Ci0JCQkJCWZFcnJvck1lc3NhZ2UgPSBudWxsOyAvLyBIaWRlIHByZXZpb3VzIGVycm9ycwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChmRXJyb3JNZXNzYWdlID09IG51bGwgJiYgcmV0LmlzRW1wdHkoKSkgewotCQkJCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IHAuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCQkJCQlpZiAoZXJyb3JNZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJCQlmRXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoSUNvbnRleHRJbmZvcm1hdGlvbltdKSByZXQudG9BcnJheShuZXcgSUNvbnRleHRJbmZvcm1hdGlvbltyZXQuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZSBvZiBhbnkgY29udGVudCBhc3Npc3QgcHJvY2Vzc29ycyB0aGF0IG5lZWQgZGlzcG9zaW5nCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZ28gdGhyb3VnaCBsaXN0IG9mIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvcnMgYW5kIGRpc3Bvc2UKLQkJZm9yIChJdGVyYXRvciBpdCA9IGZQcm9jZXNzb3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSAoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGl0Lm5leHQoKTsKLQkJCWlmIChwIGluc3RhbmNlb2YgSVJlbGVhc2FibGUpIHsKLQkJCQkoKElSZWxlYXNhYmxlKSBwKS5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQkJZlByb2Nlc3NvcnMuY2xlYXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Db250ZW50QXNzaXN0VXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbnRlbnRBc3Npc3RVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzVmNTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbnRlbnRBc3Npc3RVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRBc3Npc3RVdGlscyB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjbG9zZXN0IEluZGV4ZWRSZWdpb24gZm9yIHRoZSBvZmZzZXQgYW5kIHZpZXdlciBhbGxvd2luZwotCSAqIGZvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIHZpZXdlciBvZmZzZXRzIGFuZCBtb2RlbCBwb3NpdGlvbnMuIG5vdGU6IHRoaXMKLQkgKiBtZXRob2QgcmV0dXJucyBhbiBJbmRleGVkUmVnaW9uIGZvciByZWFkIG9ubHkKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdmlld2VyIHdob3NlIGRvY3VtZW50IGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgcHJvcG9zYWxzCi0JICogQHBhcmFtIGRvY3VtZW50T2Zmc2V0Ci0JICogICAgICAgICAgICBhbiBvZmZzZXQgd2l0aGluIHRoZSBkb2N1bWVudCBmb3Igd2hpY2ggY29tcGxldGlvbnMgc2hvdWxkCi0JICogICAgICAgICAgICBiZSBjb21wdXRlZAotCSAqIEByZXR1cm4gYW4gSW5kZXhlZFJlZ2lvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5kZXhlZFJlZ2lvbiBnZXROb2RlQXQoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQotCQlpZiAodmlld2VyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJbmRleGVkUmVnaW9uIG5vZGUgPSBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1tID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCWlmIChtbSAhPSBudWxsKQotCQkJbW9kZWwgPSBtbS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZCh2aWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCXRyeSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCWludCBsYXN0T2Zmc2V0ID0gZG9jdW1lbnRPZmZzZXQ7Ci0JCQkJbm9kZSA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnRPZmZzZXQpOwotCQkJCXdoaWxlIChub2RlID09IG51bGwgJiYgbGFzdE9mZnNldCA+PSAwKSB7Ci0JCQkJCWxhc3RPZmZzZXQtLTsKLQkJCQkJbm9kZSA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24obGFzdE9mZnNldCk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2xvc2VzdCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZvciB0aGUgb2ZmZXN0IGFuZAotCSAqIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogQHBhcmFtIGRvY3VtZW50T2Zmc2V0Ci0JICogQHJldHVybiB0aGUgY2xvc2VzdCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZvciB0aGUgb2ZmZXN0IGFuZAotCSAqICAgICAgICAgdmlld2VyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IG51bGw7Ci0JCWlmICh2aWV3ZXIgPT0gbnVsbCB8fCB2aWV3ZXIuZ2V0RG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IGxhc3RPZmZzZXQgPSBkb2N1bWVudE9mZnNldDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgdmlld2VyLmdldERvY3VtZW50KCk7Ci0JCXNkUmVnaW9uID0gZG9jLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50T2Zmc2V0KTsKLQkJd2hpbGUgKHNkUmVnaW9uID09IG51bGwgJiYgbGFzdE9mZnNldCA+PSAwKSB7Ci0JCQlsYXN0T2Zmc2V0LS07Ci0JCQlzZFJlZ2lvbiA9IGRvYy5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChsYXN0T2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gc2RSZWdpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DdXN0b21Db21wbGV0aW9uUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2MyZjliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyRXh0ZW5zaW9uNTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIElDb21wbGV0aW9uUHJvcG9zYWwgd2hvc2UgdmFsdWVzIGNhbiBiZSByZWFkIGFmdGVyCi0gKiBjcmVhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBpbXBsZW1lbnRzIElDb21wbGV0aW9uUHJvcG9zYWwsIElDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24sIElDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yLCBJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsIHsKLQotCXByaXZhdGUgU3RyaW5nIGZBZGRpdGlvbmFsUHJvcG9zYWxJbmZvOwotCi0JcHJpdmF0ZSBJQ29udGV4dEluZm9ybWF0aW9uIGZDb250ZXh0SW5mb3JtYXRpb247Ci0KLQlwcml2YXRlIGludCBmQ3Vyc29yUG9zaXRpb24gPSAwOwotCi0JcHJpdmF0ZSBTdHJpbmcgZkRpc3BsYXlTdHJpbmc7Ci0KLQlwcml2YXRlIEltYWdlIGZJbWFnZTsKLQotCXByaXZhdGUgaW50IGZPcmlnaW5hbFJlcGxhY2VtZW50TGVuZ3RoOwotCi0JcHJpdmF0ZSBpbnQgZlJlbGV2YW5jZSA9IElSZWxldmFuY2VDb25zdGFudHMuUl9OT05FOwotCi0JcHJpdmF0ZSBpbnQgZlJlcGxhY2VtZW50TGVuZ3RoID0gMDsKLQotCXByaXZhdGUgaW50IGZSZXBsYWNlbWVudE9mZnNldCA9IDA7Ci0KLQlwcml2YXRlIFN0cmluZyBmUmVwbGFjZW1lbnRTdHJpbmcgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGZVcGRhdGVMZW5ndGhPblZhbGlkYXRlOwotCi0JcHJpdmF0ZSBjaGFyW10gZlRyaWdnZXJzOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3Igd2l0aCByZWxldmFuY2UgYW5kIHJlcGxhY2VtZW50IGxlbmd0aCB1cGRhdGUgZmxhZy4KLQkgKiAKLQkgKiBJZiB0aGUgPGNvZGU+dXBkYXRlUmVwbGFjZW1lbnRMZW5ndGhPblZhbGlkYXRlPC9jb2RlPiBmbGFnIGlzIHRydWUsCi0JICogdGhlbiB3aGVuIHRoZSB1c2VyIHR5cGVzLCB0aGUgcmVwbGFjZW1lbnQgbGVuZ3RoIHdpbGwgYmUgaW5jcmVtZW50ZWQgYnkKLQkgKiB0aGUgbnVtYmVyIG9mIG5ldyBjaGFyYWN0ZXJzIGluc2VydGVkIGZyb20gdGhlIG9yaWdpbmFsIHBvc2l0aW9uLgotCSAqIE90aGVyd2lzZSB0aGUgcmVwbGFjZW1lbnQgbGVuZ3RoIHdpbGwgbm90IGNoYW5nZSBvbiB2YWxpZGF0ZS4KLQkgKiAKLQkgKiBleC4KLQkgKiAKLQkgKiA8dGFnIHxuYW1lPSJhdHRyIj4gLSB0aGUgcmVwbGFjZW1lbnQgbGVuZ3RoIGlzIDQgPHRhZyBpfG5hbWU9ImF0dHIiPiAtCi0JICogdGhlIHJlcGxhY2VtZW50IGxlbmd0aCBpcyBub3cgNSA8dGFnIGlkfG5hbWU9ImF0dHIiPiAtIHRoZSByZXBsYWNlbWVudAotCSAqIGxlbmd0aCBpcyBub3cgNiA8dGFnIHxuYW1lPSJhdHRyIj4gLSB0aGUgcmVwbGFjZW1lbnRsZW5ndGggaXMgbm93IDQKLQkgKiBhZ2FpbiA8dGFnIHxuYW1lPSJhdHRyIj4gLSB0aGUgcmVwbGFjbWVudCBsZW5ndGggcmVtYWlucyA0Ci0JICogCi0JICovCi0JcHVibGljIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcsIGludCByZXBsYWNlbWVudE9mZnNldCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBpbnQgY3Vyc29yUG9zaXRpb24sIEltYWdlIGltYWdlLCBTdHJpbmcgZGlzcGxheVN0cmluZywgSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24sIFN0cmluZyBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCBpbnQgcmVsZXZhbmNlLCBib29sZWFuIHVwZGF0ZVJlcGxhY2VtZW50TGVuZ3RoT25WYWxpZGF0ZSkgewotCQlmUmVwbGFjZW1lbnRTdHJpbmcgPSByZXBsYWNlbWVudFN0cmluZzsKLQkJZlJlcGxhY2VtZW50T2Zmc2V0ID0gcmVwbGFjZW1lbnRPZmZzZXQ7Ci0JCWZSZXBsYWNlbWVudExlbmd0aCA9IHJlcGxhY2VtZW50TGVuZ3RoOwotCQlmQ3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLQkJZkltYWdlID0gaW1hZ2U7Ci0JCWZEaXNwbGF5U3RyaW5nID0gZGlzcGxheVN0cmluZzsKLQkJZkNvbnRleHRJbmZvcm1hdGlvbiA9IGNvbnRleHRJbmZvcm1hdGlvbjsKLQkJZkFkZGl0aW9uYWxQcm9wb3NhbEluZm8gPSBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvOwotCQlmUmVsZXZhbmNlID0gcmVsZXZhbmNlOwotCQlmVXBkYXRlTGVuZ3RoT25WYWxpZGF0ZSA9IHVwZGF0ZVJlcGxhY2VtZW50TGVuZ3RoT25WYWxpZGF0ZTsKLQkJZk9yaWdpbmFsUmVwbGFjZW1lbnRMZW5ndGggPSBmUmVwbGFjZW1lbnRMZW5ndGg7Ci0JfQotCi0JcHVibGljIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcsIGludCByZXBsYWNlbWVudE9mZnNldCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBpbnQgY3Vyc29yUG9zaXRpb24sIEltYWdlIGltYWdlLCBTdHJpbmcgZGlzcGxheVN0cmluZywgSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24sIFN0cmluZyBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCBpbnQgcmVsZXZhbmNlKSB7Ci0JCXRoaXMocmVwbGFjZW1lbnRTdHJpbmcsIHJlcGxhY2VtZW50T2Zmc2V0LCByZXBsYWNlbWVudExlbmd0aCwgY3Vyc29yUG9zaXRpb24sIGltYWdlLCBkaXNwbGF5U3RyaW5nLCBjb250ZXh0SW5mb3JtYXRpb24sIGFkZGl0aW9uYWxQcm9wb3NhbEluZm8sIHJlbGV2YW5jZSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKSwgZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSwgZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgZ2V0Q3Vyc29yUG9zaXRpb24oKSwgZ2V0SW1hZ2UoKSwgZ2V0RGlzcGxheVN0cmluZygpLCBnZXRDb250ZXh0SW5mb3JtYXRpb24oKSwgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpKTsKLQkJcHJvcG9zYWwuYXBwbHkoZG9jdW1lbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24jYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBjaGFyLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50LCBjaGFyIHRyaWdnZXIsIGludCBvZmZzZXQpIHsKLQkJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbChnZXRSZXBsYWNlbWVudFN0cmluZygpLCBnZXRSZXBsYWNlbWVudE9mZnNldCgpLCBnZXRSZXBsYWNlbWVudExlbmd0aCgpLCBnZXRDdXJzb3JQb3NpdGlvbigpLCBnZXRJbWFnZSgpLCBnZXREaXNwbGF5U3RyaW5nKCksIGdldENvbnRleHRJbmZvcm1hdGlvbigpLCBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkpOwotCQkvLyB3ZSBjdXJyZW50bHkgZG9uJ3QgZG8gYW55dGhpbmcgc3BlY2lhbCBmb3Igd2hpY2ggY2hhcmFjdGVyCi0JCS8vIHNlbGVjdGVkIHRoZSBwcm9wb3NhbCwgYW5kIHdoZXJlIHRoZSBjdXJzb3Igb2Zmc2V0IGlzCi0JCS8vIGJ1dCB3ZSBtaWdodCBpbiB0aGUgZnV0dXJlLi4uCi0JCXByb3Bvc2FsLmFwcGx5KGRvY3VtZW50KTsKLQkJLy8gd2Ugd2FudCB0byBDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIudXBkYXRlUHJlc2VudGF0aW9uKCkgaGVyZQotCX0KLQotCXB1YmxpYyB2b2lkIGFwcGx5KElUZXh0Vmlld2VyIHZpZXdlciwgY2hhciB0cmlnZ2VyLCBpbnQgc3RhdGVNYXNrLCBpbnQgb2Zmc2V0KSB7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHZpZXdlci5nZXREb2N1bWVudCgpOwotCQkvLyBDTVZDIDI1MjYzNCB0byBjb21wZW5zYXRlIGZvciAiaW52aXNpYmxlIiBpbml0aWFsIHJlZ2lvbgotCQlpbnQgY2FyZXRPZmZzZXQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHsKLQkJCUlUZXh0Vmlld2VyRXh0ZW5zaW9uNSBleHRlbnNpb24gPSAoSVRleHRWaWV3ZXJFeHRlbnNpb241KSB2aWV3ZXI7Ci0JCQljYXJldE9mZnNldCA9IGV4dGVuc2lvbi53aWRnZXRPZmZzZXQyTW9kZWxPZmZzZXQoY2FyZXRPZmZzZXQpOwotCQl9Ci0JCWVsc2UgewotCQkJY2FyZXRPZmZzZXQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldENhcmV0T2Zmc2V0KCkgKyB2aWV3ZXIuZ2V0VmlzaWJsZVJlZ2lvbigpLmdldE9mZnNldCgpOwotCQl9Ci0KLQkJaWYgKGNhcmV0T2Zmc2V0ID09IGdldFJlcGxhY2VtZW50T2Zmc2V0KCkpIHsKLQkJCWFwcGx5KGRvY3VtZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHJlcGxhY2UgdGhlIHRleHQgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNhcmV0IFBvc2l0aW9uIGFzIHRoaXMKLQkJCS8vIGNhdXNlcyB0aGUgY3Vyc29yIHRvIG1vdmUgb24gaXRzIG93bgotCQkJdHJ5IHsKLQkJCQlpbnQgZW5kT2Zmc2V0T2ZDaGFuZ2VzID0gZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKS5sZW5ndGgoKSArIGdldFJlcGxhY2VtZW50T2Zmc2V0KCk7Ci0JCQkJLy8gSW5zZXJ0IHRoZSBwb3J0aW9uIG9mIHRoZSBuZXcgdGV4dCB0aGF0IGNvbWVzIGFmdGVyIHRoZQotCQkJCS8vIGN1cnJlbnQgY2FyZXQgcG9zaXRpb24KLQkJCQlpZiAoZW5kT2Zmc2V0T2ZDaGFuZ2VzID49IGNhcmV0T2Zmc2V0KSB7Ci0JCQkJCWludCBwb3N0Q2FyZXRSZXBsYWNlbWVudExlbmd0aCA9IGdldFJlcGxhY2VtZW50T2Zmc2V0KCkgKyBnZXRSZXBsYWNlbWVudExlbmd0aCgpIC0gY2FyZXRPZmZzZXQ7Ci0JCQkJCWludCBwcmVDYXJldFJlcGxhY2VtZW50TGVuZ3RoID0gZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKS5sZW5ndGgoKSAtIChlbmRPZmZzZXRPZkNoYW5nZXMgLSBjYXJldE9mZnNldCk7Ci0JCQkJCWlmIChwb3N0Q2FyZXRSZXBsYWNlbWVudExlbmd0aCA8IDApIHsKLQkJCQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqIHBvc3RDYXJldFJlcGxhY2VtZW50TGVuZ3RoIHdhcyBuZWdhdGl2ZTogIiArIHBvc3RDYXJldFJlcGxhY2VtZW50TGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJLy8gVGhpcyBpcyBqdXN0IGEgcXVpY2sgZml4IHdoaWxlIEkgZmlndXJlIG91dCB3aGF0Ci0JCQkJCQkvLyByZXBsYWNlbWVudCBsZW5ndGggaXMgc3VwcG9zZWQgdG8gYmUKLQkJCQkJCS8vIGluIGVhY2ggY2FzZSwgb3RoZXJ3aXNlIHdlJ2xsIGdldCBuZWdhdGl2ZQotCQkJCQkJLy8gcmVwbGFjbWVudCBsZW5ndGggc29tZXRpbWVzCi0JCQkJCQlwb3N0Q2FyZXRSZXBsYWNlbWVudExlbmd0aCA9IDA7Ci0JCQkJCX0KLQkJCQkJZG9jdW1lbnQucmVwbGFjZShjYXJldE9mZnNldCwgcG9zdENhcmV0UmVwbGFjZW1lbnRMZW5ndGgsIGdldFJlcGxhY2VtZW50U3RyaW5nKCkuc3Vic3RyaW5nKHByZUNhcmV0UmVwbGFjZW1lbnRMZW5ndGgpKTsKLQkJCQl9Ci0JCQkJLy8gSW5zZXJ0IHRoZSBwb3J0aW9uIG9mIHRoZSBuZXcgdGV4dCB0aGF0IGNvbWVzIGJlZm9yZSB0aGUKLQkJCQkvLyBjdXJyZW50IGNhcmV0IHBvc2l0aW9uCi0JCQkJLy8gRG9uZSBzZWNvbmQgc2luY2Ugb2Zmc2V0cyB3b3VsZCBjaGFuZ2UgZm9yIHRoZSBwb3N0IHRleHQKLQkJCQkvLyBvdGhlcndpc2UKLQkJCQkvLyBPdXRyaWdodCBpbnNlcnRpb25zIGFyZSBoYW5kbGVkIGhlcmUKLQkJCQlpZiAoY2FyZXRPZmZzZXQgPiBnZXRSZXBsYWNlbWVudE9mZnNldCgpKSB7Ci0JCQkJCWludCBwcmVDYXJldFRleHRMZW5ndGggPSBjYXJldE9mZnNldCAtIGdldFJlcGxhY2VtZW50T2Zmc2V0KCk7Ci0JCQkJCWRvY3VtZW50LnJlcGxhY2UoZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSwgcHJlQ2FyZXRUZXh0TGVuZ3RoLCBnZXRSZXBsYWNlbWVudFN0cmluZygpLnN1YnN0cmluZygwLCBwcmVDYXJldFRleHRMZW5ndGgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCWFwcGx5KGRvY3VtZW50KTsKLQkJCX0KLQkJCWNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCQlhcHBseShkb2N1bWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCS8vIHJldHVybiBmUHJvcG9zYWwuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpOwotCQlyZXR1cm4gZkFkZGl0aW9uYWxQcm9wb3NhbEluZm87Ci0JfQotCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb24gZ2V0Q29udGV4dEluZm9ybWF0aW9uKCkgewotCQkvLyByZXR1cm4gZlByb3Bvc2FsLmdldENvbnRleHRJbmZvcm1hdGlvbigpOwotCQlyZXR1cm4gZkNvbnRleHRJbmZvcm1hdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0SW5mb3JtYXRpb24oSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mbykgewotCQlmQ29udGV4dEluZm9ybWF0aW9uID0gY29udGV4dEluZm87Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbiNnZXRDb250ZXh0SW5mb3JtYXRpb25Qb3NpdGlvbigpCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZXh0SW5mb3JtYXRpb25Qb3NpdGlvbigpIHsKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMDM1NQotCQkvLyByZXR1cm4gZ2V0Q3Vyc29yUG9zaXRpb24oKTsKLQkJaWYgKGdldENvbnRleHRJbmZvcm1hdGlvbigpID09IG51bGwpCi0JCQlyZXR1cm4gZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSAtIDE7Ci0JCXJldHVybiBnZXRSZXBsYWNlbWVudE9mZnNldCgpICsgZ2V0Q3Vyc29yUG9zaXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEN1cnNvclBvc2l0aW9uKCkgewotCQlyZXR1cm4gZkN1cnNvclBvc2l0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEN1cnNvclBvc2l0aW9uKGludCBwb3MpIHsKLQkJZkN1cnNvclBvc2l0aW9uID0gcG9zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpc3BsYXlTdHJpbmcoU3RyaW5nIG5ld0Rpc3BsYXlTdHJpbmcpIHsKLQkJZkRpc3BsYXlTdHJpbmcgPSBuZXdEaXNwbGF5U3RyaW5nOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheVN0cmluZygpIHsKLQkJLy8gcmV0dXJuIGZQcm9wb3NhbC5nZXREaXNwbGF5U3RyaW5nKCk7Ci0JCXJldHVybiBmRGlzcGxheVN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCS8vIHJldHVybiBmUHJvcG9zYWwuZ2V0SW1hZ2UoKTsKLQkJcmV0dXJuIGZJbWFnZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFJlbGV2YW5jZSgpIHsKLQkJcmV0dXJuIGZSZWxldmFuY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVwbGFjZW1lbnRMZW5ndGgoaW50IG5ld1JlcGxhY2VtZW50TGVuZ3RoKSB7Ci0JCWZSZXBsYWNlbWVudExlbmd0aCA9IG5ld1JlcGxhY2VtZW50TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSB7Ci0JCXJldHVybiBmUmVwbGFjZW1lbnRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRSZXBsYWNlbWVudE9mZnNldCgpIHsKLQkJcmV0dXJuIGZSZXBsYWNlbWVudE9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlcGxhY2VtZW50U3RyaW5nKCkgewotCQlyZXR1cm4gZlJlcGxhY2VtZW50U3RyaW5nOwotCX0KLQotCXB1YmxpYyBQb2ludCBnZXRTZWxlY3Rpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIHJldHVybiBmUHJvcG9zYWwuZ2V0U2VsZWN0aW9uKGRvY3VtZW50KTsKLQkJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbChnZXRSZXBsYWNlbWVudFN0cmluZygpLCBnZXRSZXBsYWNlbWVudE9mZnNldCgpLCBnZXRSZXBsYWNlbWVudExlbmd0aCgpLCBnZXRDdXJzb3JQb3NpdGlvbigpLCBnZXRJbWFnZSgpLCBnZXREaXNwbGF5U3RyaW5nKCksIGdldENvbnRleHRJbmZvcm1hdGlvbigpLCBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkpOwotCQlyZXR1cm4gcHJvcG9zYWwuZ2V0U2VsZWN0aW9uKGRvY3VtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uI2dldFRyaWdnZXJDaGFyYWN0ZXJzKCkKLQkgKi8KLQotCXB1YmxpYyBjaGFyW10gZ2V0VHJpZ2dlckNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBmVHJpZ2dlcnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHJpZ2dlckNoYXJhY3RlcnMoY2hhcltdIHRyaWdnZXJzKSB7Ci0JCWZUcmlnZ2VycyA9IHRyaWdnZXJzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24jaXNWYWxpZEZvcihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkRm9yKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gdmFsaWRhdGUoZG9jdW1lbnQsIG9mZnNldCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjc2VsZWN0ZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0ZWQoSVRleHRWaWV3ZXIgdmlld2VyLCBib29sZWFuIHNtYXJ0VG9nZ2xlKSB7Ci0JfQotCi0JLy8gY29kZSBpcyBib3Jyb3dlZCBmcm9tIEphdmFDb21wbGV0aW9uUHJvcG9zYWwKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydHNXaXRoKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgU3RyaW5nIHdvcmQpIHsKLQotCQlpbnQgd29yZExlbmd0aCA9IHdvcmQgPT0gbnVsbCA/IDAgOiB3b3JkLmxlbmd0aCgpOwotCQlpZiAob2Zmc2V0ID4gZlJlcGxhY2VtZW50T2Zmc2V0ICsgd29yZExlbmd0aCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQl0cnkgewotCQkJaW50IGxlbmd0aCA9IG9mZnNldCAtIGZSZXBsYWNlbWVudE9mZnNldDsKLQkJCVN0cmluZyBzdGFydCA9IGRvY3VtZW50LmdldChmUmVwbGFjZW1lbnRPZmZzZXQsIGxlbmd0aCk7Ci0KLQkJCXJldHVybiB3b3JkLnN1YnN0cmluZygwLCBsZW5ndGgpLmVxdWFsc0lnbm9yZUNhc2Uoc3RhcnQpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjdW5zZWxlY3RlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2VsZWN0ZWQoSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JfQotCi0JLyoqCi0JICogYm9ycm93ZWQgZnJvbSBKYXZhQ29tcGxldGlvblByb3Bvc2FsCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjdmFsaWRhdGUob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBpbnQsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJaWYgKG9mZnNldCA8IGZSZXBsYWNlbWVudE9mZnNldCkKLQkJCXJldHVybiBmYWxzZTsKLQkJYm9vbGVhbiB2YWxpZGF0ZWQgPSBzdGFydHNXaXRoKGRvY3VtZW50LCBvZmZzZXQsIGZEaXNwbGF5U3RyaW5nKTsKLQotCQlpZiAoZlVwZGF0ZUxlbmd0aE9uVmFsaWRhdGUpIHsKLQotCQkJLy8gaXQgd291bGQgYmUgYmV0dGVyIHRvIHVzZSAib3JpZ2luYWxDdXJzb3JQb3NpdGlvbiIgaW5zdGVhZCBvZgotCQkJLy8gZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSwgYnV0IHdlIGRvbid0IGhhdmUgdGhhdCBpbmZvLgotCQkJaW50IG5ld0xlbmd0aCA9IG9mZnNldCAtIGdldFJlcGxhY2VtZW50T2Zmc2V0KCk7Ci0JCQlpbnQgZGVsdGEgPSBuZXdMZW5ndGggLSBmT3JpZ2luYWxSZXBsYWNlbWVudExlbmd0aDsKLQkJCWZSZXBsYWNlbWVudExlbmd0aCA9IGRlbHRhICsgZk9yaWdpbmFsUmVwbGFjZW1lbnRMZW5ndGg7Ci0KLQkJCS8vIGlmIGl0J3MgYW4gYXR0cmlidXRlIHZhbHVlLCByZXBsYWNlbWVudCBvZmZzZXQgaXMKLQkJCS8vIGdvaW5nIHRvIGJlIG9uZSBvZmYgZnJvbSB0aGUgYWN0dWFsIGN1cnNvciBvZmZzZXQuLi4KLQkJCWNoYXIgZmlyc3RDaGFyID0gZG9jdW1lbnQuZ2V0KCkuY2hhckF0KGdldFJlcGxhY2VtZW50T2Zmc2V0KCkpOwotCQkJaWYgKGZpcnN0Q2hhciA9PSAnIicgfHwgZmlyc3RDaGFyID09ICdcJycpCi0JCQkJZlJlcGxhY2VtZW50TGVuZ3RoKys7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkYXRlZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVwbGFjZW1lbnRPZmZzZXQKLQkgKiAgICAgICAgICAgIFRoZSBmUmVwbGFjZW1lbnRPZmZzZXQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcGxhY2VtZW50T2Zmc2V0KGludCByZXBsYWNlbWVudE9mZnNldCkgewotCQlmUmVwbGFjZW1lbnRPZmZzZXQgPSByZXBsYWNlbWVudE9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVwbGFjZW1lbnRTdHJpbmcKLQkgKiAgICAgICAgICAgIFRoZSBmUmVwbGFjZW1lbnRTdHJpbmcgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcGxhY2VtZW50U3RyaW5nKFN0cmluZyByZXBsYWNlbWVudFN0cmluZykgewotCQlmUmVwbGFjZW1lbnRTdHJpbmcgPSByZXBsYWNlbWVudFN0cmluZzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9JUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9JUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlM2Y3YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0vKioKLSAqIENvbXBsZXRpb25Qcm9wb3NhbCB3aXRoIGEgcmVsZXZhbmNlIHZhbHVlLiBUaGUgcmVsZXZhbmNlIHZhbHVlIGlzIHVzZWQgdG8KLSAqIHNvcnQgdGhlIGNvbXBsZXRpb24gcHJvcG9zYWxzLiBQcm9wb3NhbHMgd2l0aCBoaWdoZXIgcmVsZXZhbmNlIHNob3VsZCBiZQotICogbGlzdGVkIGJlZm9yZSBwcm9wb3NhbHMgd2l0aCBsb3dlciByZWxldmFuY2UuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVsZXZhbmNlIG9mIHRoZSBwcm9wb3NhbC4KLQkgKi8KLQlpbnQgZ2V0UmVsZXZhbmNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9JUmVsZXZhbmNlQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9JUmVsZXZhbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNWExNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSVJlbGV2YW5jZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlbGV2YW5jZUNvbnN0YW50cyB7Ci0JaW50IFJfTk9ORSA9IDA7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9TdHJ1Y3R1cmVkQ29udGVudEFzc2lzdGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvU3RydWN0dXJlZENvbnRlbnRBc3Npc3RhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYzNWNhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9TdHJ1Y3R1cmVkQ29udGVudEFzc2lzdGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlcjsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRDb250ZW50QXNzaXN0YW50IGV4dGVuZHMgQ29udGVudEFzc2lzdGFudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfQVNTSVNUX1BST0NFU1NPUl9FWFRFTkRFRF9JRCA9ICJjb250ZW50YXNzaXN0cHJvY2Vzc29yIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogcGVyc29uYWwgbGlzdCBvZiBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3JzCi0JICovCi0JcHJpdmF0ZSBNYXAgZlByb2Nlc3NvcnM7Ci0JLyoqCi0JICogbGlzdCBvZiBwYXJ0aXRpb24gdHlwZXMgd2hlcmUgZXh0ZW5kZWQgcHJvY2Vzc29ycyBoYXZlIGJlZW4gaW5zdGFsbGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IGZJbnN0YWxsZWRFeHRlbmRlZENvbnRlbnRUeXBlczsKLQotCS8qKgotCSAqIEVhY2ggc2V0IGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvciBpcyBwbGFjZWQgaW5zaWRlIGEKLQkgKiBDb21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3Igd2hpY2ggYWxsb3dzIG11bHRpcGxlIHByb2Nlc3NvcnMgcGVyCi0JICogcGFydGl0aW9uIHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2Vzc29yCi0JICogICAgICAgICAgICB0aGUgY29udGVudCBhc3Npc3QgcHJvY2Vzc29yIHRvIHJlZ2lzdGVyLCBvcgotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gdG8gcmVtb3ZlIGFuIGV4aXN0aW5nIG9uZQotCSAqIEBwYXJhbSBjb250ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgdHlwZSB1bmRlciB3aGljaCB0byByZWdpc3RlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlpZiAoZlByb2Nlc3NvcnMgPT0gbnVsbCkKLQkJCWZQcm9jZXNzb3JzID0gbmV3IEhhc2hNYXAoKTsKLQotCQlDb21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgY29tcG91bmRQcm9jZXNzb3IgPSBnZXRFeGlzdGluZ0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IocGFydGl0aW9uVHlwZSk7Ci0KLQkJLy8gaWYgcHJvY2Vzc29yIGlzIG51bGwsIHlvdSB3YW50IHRvIHJlbW92ZSBhbGwgcHJvY2Vzc29ycyBvZgotCQkvLyBjb250ZW50VHlwZQotCQlpZiAocHJvY2Vzc29yID09IG51bGwgJiYgY29tcG91bmRQcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJY29tcG91bmRQcm9jZXNzb3IuZGlzcG9zZSgpOwotCQkJZlByb2Nlc3NvcnMucmVtb3ZlKHBhcnRpdGlvblR5cGUpOwotCQkJY29tcG91bmRQcm9jZXNzb3IgPSBudWxsOwotCQl9Ci0JCWlmIChwcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGEgbmV3IGNvbXBvdW5kcHJvY2VzcyBpZiB0aGVyZSBhbHJlYWR5IGlzbnQgb25lCi0JCQlpZiAoY29tcG91bmRQcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJCWNvbXBvdW5kUHJvY2Vzc29yID0gbmV3IENvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQkJfQotCQkJLy8gYWRkIHByb2Nlc3NvciB0byBjb21wb3VuZCBwcm9jZXNzb3IKLQkJCWNvbXBvdW5kUHJvY2Vzc29yLmFkZChwcm9jZXNzb3IpOwotCQkJLy8gYWRkIGNvbXBvdW5kIHByb2Nlc29yIHRvIHByb2Nlc3NvcnMgbGlzdCAod2lsbCByZXBsYWNlIG9sZCBvbmUsCi0JCQkvLyBldmVuIGlmIHNhbWUgaW5zdGFuY2UpCi0JCQlmUHJvY2Vzc29ycy5wdXQocGFydGl0aW9uVHlwZSwgY29tcG91bmRQcm9jZXNzb3IpOwotCQl9Ci0JCXN1cGVyLnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY29tcG91bmRQcm9jZXNzb3IsIHBhcnRpdGlvblR5cGUpOwotCX0KLQotCXByaXZhdGUgQ29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldEV4aXN0aW5nQ29udGVudEFzc2lzdFByb2Nlc3NvcihTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlDb21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgY29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yID0gbnVsbDsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gc3VwZXIuZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihwYXJ0aXRpb25UeXBlKTsKLQkJaWYgKHByb2Nlc3NvciAhPSBudWxsKSB7Ci0JCQlpZiAocHJvY2Vzc29yIGluc3RhbmNlb2YgQ29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yKSB7Ci0JCQkJY29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yID0gKENvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvcikgcHJvY2Vzc29yOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU3RydWN0dXJlZENvbnRlbnRBc3Npc3RhbnQgdXNlIENvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvciIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvciB0byBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4gY29udGVudAotCSAqIHR5cGUuIEFsc28gaW5zdGFsbHMgYW55IGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvcnMgdGhhdCB3ZXJlIGFkZGVkIGJ5Ci0JICogZXh0ZW5zaW9uIHBvaW50LgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGNvbnRlbnQgZm9yIHdoaWNoIHRoaXMgY29udGVudCBhc3Npc3RhbnQgaXMKLQkgKiAgICAgICAgICAgIHRvIGJlIHJlcXVlc3RlZAotCSAqIEByZXR1cm4gYW4gaW5zdGFuY2UgY29udGVudCBhc3Npc3QgcHJvY2Vzc29yIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogICAgICAgICBub25lIGV4aXN0cyBmb3IgdGhlIHNwZWNpZmllZCBjb250ZW50IHR5cGUKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlpZiAoZkluc3RhbGxlZEV4dGVuZGVkQ29udGVudFR5cGVzID09IG51bGwgfHwgIWZJbnN0YWxsZWRFeHRlbmRlZENvbnRlbnRUeXBlcy5jb250YWlucyhwYXJ0aXRpb25UeXBlKSkgewotCQkJLy8gZ2V0IGV4dGVuZGVkIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvcnMgdGhhdCBoYXZlIG5vdCBhbHJlYWR5Ci0JCQkvLyBiZWVuIHNldAotCQkJTGlzdCBwcm9jZXNzb3JzID0gRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpLmdldENvbmZpZ3VyYXRpb25zKENPTlRFTlRfQVNTSVNUX1BST0NFU1NPUl9FWFRFTkRFRF9JRCwgcGFydGl0aW9uVHlwZSk7Ci0JCQlpZiAocHJvY2Vzc29ycyAhPSBudWxsICYmICFwcm9jZXNzb3JzLmlzRW1wdHkoKSkgewotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBwcm9jZXNzb3JzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgaXRlci5uZXh0KCk7Ci0JCQkJCXNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IocHJvY2Vzc29yLCBwYXJ0aXRpb25UeXBlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBhZGQgcGFydGl0aW9uIHR5cGUgdG8gbGlzdCBvZiBleHRlbmRlZCBwYXJ0aXRpb24gdHlwZXMKLQkJCS8vIGluc3RhbGxlZCAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCBhbnkgZXh0ZW5kZWQgY29udGVudAotCQkJLy8gYXNzaXN0IHByb2Nlc3NvcnMgd2VyZSBpbnN0YWxsZWQgYmVjYXVzZSBkb250IHdhbnQgdG8gbG9vayBpdAotCQkJLy8gdXAgZXZlcnkgdGltZSkKLQkJCWlmIChmSW5zdGFsbGVkRXh0ZW5kZWRDb250ZW50VHlwZXMgPT0gbnVsbCkKLQkJCQlmSW5zdGFsbGVkRXh0ZW5kZWRDb250ZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmSW5zdGFsbGVkRXh0ZW5kZWRDb250ZW50VHlwZXMuYWRkKHBhcnRpdGlvblR5cGUpOwotCQl9Ci0KLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gc3VwZXIuZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihwYXJ0aXRpb25UeXBlKTsKLQkJcmV0dXJuIHByb2Nlc3NvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCS8vIGRpc3Bvc2Ugb2YgYWxsIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvcnMKLQkJaWYgKGZQcm9jZXNzb3JzICE9IG51bGwgJiYgIWZQcm9jZXNzb3JzLmlzRW1wdHkoKSkgewotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gZlByb2Nlc3NvcnMudmFsdWVzKCk7Ci0JCQlJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJKChDb21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGl0ZXIubmV4dCgpKS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlmUHJvY2Vzc29ycy5jbGVhcigpOwotCQl9Ci0JCWZQcm9jZXNzb3JzID0gbnVsbDsKLQotCQkvLyBjbGVhciBvdXQgbGlzdCBvZiBpbnN0YWxsZWQgY29udGVudCB0eXBlcwotCQlpZiAoZkluc3RhbGxlZEV4dGVuZGVkQ29udGVudFR5cGVzICE9IG51bGwpIHsKLQkJCWZJbnN0YWxsZWRFeHRlbmRlZENvbnRlbnRUeXBlcy5jbGVhcigpOwotCQl9Ci0JCXN1cGVyLnVuaW5zdGFsbCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBjb250ZW50IGFzc2lzdCBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIHNvbWUgY29udGVudAotCSAqIGFzc2lzdCBwcm9jZXNzb3JzLiBGYWxzZSBvdGhlcndpc2UuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGNvbnRlbnQgYXNzaXN0YW50IGhhcyBiZWVuIGluaXRpYWxpemVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLQkJcmV0dXJuIChmUHJvY2Vzc29ycyAhPSBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZTAwZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0NvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Hcm91cE1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5EZWxlZ2F0aW5nRHJhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5EZWxlZ2F0aW5nRHJvcEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5UcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVBvc3RTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJhZ1NvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTaG93SW5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2hvd0luVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblRhcmdldExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5TaG93SW5Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UgZXh0ZW5kcyBDb250ZW50T3V0bGluZVBhZ2UgaW1wbGVtZW50cyBJQWRhcHRhYmxlIHsKLQkvKgotCSAqIE1lbnUgbGlzdGVuZXIgdG8gY3JlYXRlIHRoZSBhZGRpdGlvbnMgZ3JvdXAgYW5kIGFkZCBhbnkgbWVudSBpdGVtcwotCSAqIGNvbnRyaWJ1dGVkIGJ5IHRoZSBjb25maWd1cmF0aW9uOyByZXF1aXJlZCBzaW5jZSB0aGUgY29udGV4dCBtZW51IGlzCi0JICogY2xlYXJlZCBldmVyeSB0aW1lIGl0IGlzIHNob3duCi0JICovCi0JY2xhc3MgQWRkaXRpb25Hcm91cEFkZGVyIGltcGxlbWVudHMgSU1lbnVMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IG1hbmFnZXIuZ2V0SXRlbXMoKTsKLQkJCWlmIChpdGVtcy5sZW5ndGggPiAwICYmIGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdLmdldElkKCkgIT0gbnVsbCkgewotCQkJCW1hbmFnZXIuaW5zZXJ0QWZ0ZXIoaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV0uZ2V0SWQoKSwgbmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJCX0KLQotCQkJLy8gYWRkIGNvbmZpZ3VyYXRpb24ncyBtZW51IGl0ZW1zCi0JCQlJTWVudUxpc3RlbmVyIGxpc3RlbmVyID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldE1lbnVMaXN0ZW5lcihnZXRUcmVlVmlld2VyKCkpOwotCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQlsaXN0ZW5lci5tZW51QWJvdXRUb1Nob3cobWFuYWdlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyBkb3VibGUtY2xpY2sgcmVnaXN0cmF0aW9uIHNvIGl0IGNhbiBiZSBkb25lIGJlZm9yZSB0aGUgQ29udHJvbAotCSAqIGlzIGNyZWF0ZWQuCi0JICovCi0JY2xhc3MgRG91YmxlQ2xpY2tQcm92aWRlciBpbXBsZW1lbnRzIElEb3VibGVDbGlja0xpc3RlbmVyIHsKLQkJcHJpdmF0ZSBJRG91YmxlQ2xpY2tMaXN0ZW5lcltdIGxpc3RlbmVycyA9IG51bGw7Ci0KLQkJdm9pZCBhZGREb3VibGVDbGlja0xpc3RlbmVyKElEb3VibGVDbGlja0xpc3RlbmVyIG5ld0xpc3RlbmVyKSB7Ci0JCQlpZiAobGlzdGVuZXJzID09IG51bGwpIHsKLQkJCQlsaXN0ZW5lcnMgPSBuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXJbXXtuZXdMaXN0ZW5lcn07Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJRG91YmxlQ2xpY2tMaXN0ZW5lcltdIG5ld0xpc3RlbmVycyA9IG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcltsaXN0ZW5lcnMubGVuZ3RoICsgMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShsaXN0ZW5lcnMsIDAsIG5ld0xpc3RlbmVycywgMCwgbGlzdGVuZXJzLmxlbmd0aCk7Ci0JCQkJbmV3TGlzdGVuZXJzW2xpc3RlbmVycy5sZW5ndGhdID0gbmV3TGlzdGVuZXI7Ci0JCQkJbGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJZmlyZURvdWJsZUNsaWNrRXZlbnQoZXZlbnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGZpcmVEb3VibGVDbGlja0V2ZW50KGZpbmFsIERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCUlEb3VibGVDbGlja0xpc3RlbmVyW10gZmlyaW5nTGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaXJpbmdMaXN0ZW5lcnMubGVuZ3RoOyArK2kpIHsKLQkJCQlmaW5hbCBJRG91YmxlQ2xpY2tMaXN0ZW5lciBsID0gZmlyaW5nTGlzdGVuZXJzW2ldOwotCQkJCVNhZmVSdW5uZXIucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWwuZG91YmxlQ2xpY2soZXZlbnQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQotCQl2b2lkIHJlbW92ZURvdWJsZUNsaWNrTGlzdGVuZXIoSURvdWJsZUNsaWNrTGlzdGVuZXIgb2xkTGlzdGVuZXIpIHsKLQkJCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCWlmIChsaXN0ZW5lcnMubGVuZ3RoID09IDEgJiYgbGlzdGVuZXJzWzBdLmVxdWFscyhvbGRMaXN0ZW5lcikpIHsKLQkJCQkJbGlzdGVuZXJzID0gbnVsbDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUxpc3QgbmV3TGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGxpc3RlbmVycykpOwotCQkJCQluZXdMaXN0ZW5lcnMucmVtb3ZlKG9sZExpc3RlbmVyKTsKLQkJCQkJbGlzdGVuZXJzID0gKElEb3VibGVDbGlja0xpc3RlbmVyW10pIG5ld0xpc3RlbmVycy50b0FycmF5KG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcltsaXN0ZW5lcnMubGVuZ3RoIC0gMV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIExpc3RlbnMgdG8gcG9zdCBzZWxlY3Rpb24gZnJvbSB0aGUgc2VsZWN0aW9uIHNlcnZpY2UsIGFwcGx5aW5nIGl0IHRvCi0JICogdGhlIHRyZWUgdmlld2VyLgotCSAqLwotCWNsYXNzIFBvc3RTZWxlY3Rpb25TZXJ2aWNlTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkvLyBmcm9tIHNlbGVjdGlvbiBzZXJ2aWNlCi0JCQlpZiAoX0RFQlVHKSB7Ci0JCQkJX0RFQlVHX1RJTUUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0gLyoKLQkJCQkgKiBCdWcgMTM2MzEwLCB1bmxlc3MgdGhpcyBwYWdlIGlzIHRoYXQgcGFydCdzCi0JCQkJICogSUNvbnRlbnRPdXRsaW5lUGFnZSwgaWdub3JlIHRoZSBzZWxlY3Rpb24gY2hhbmdlCi0JCQkJICovCi0JCQlpZiAocGFydCA9PSBudWxsIHx8IHBhcnQuZ2V0QWRhcHRlcihJQ29udGVudE91dGxpbmVQYWdlLmNsYXNzKSA9PSBDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UudGhpcykgewotCQkJCUlTZWxlY3Rpb24gdmFsaWRDb250ZW50U2VsZWN0aW9uID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldFNlbGVjdGlvbihnZXRUcmVlVmlld2VyKCksIHNlbGVjdGlvbik7Ci0KLQkJCQlib29sZWFuIGlzTGlua2VkID0gZ2V0Q29uZmlndXJhdGlvbigpLmlzTGlua2VkV2l0aEVkaXRvcihnZXRUcmVlVmlld2VyKCkpOwotCQkJCWlmIChpc0xpbmtlZCkgewotCQkJCQlnZXRUcmVlVmlld2VyKCkuc2V0U2VsZWN0aW9uKHZhbGlkQ29udGVudFNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKF9ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKE86IiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIF9ERUJVR19USU1FKSArICJtcykgIiArIHBhcnQgKyAiIDogIiArIHNlbGVjdGlvbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGb3J3YXJkcyBwb3N0LXNlbGVjdGlvbiBmcm9tIHRoZSB0cmVlIHZpZXdlciB0byB0aGUgbGlzdGVuZXJzIHdoaWxlCi0JICogYWN0aW5nIGFzIHRoaXMgcGFnZSdzIHNlbGVjdGlvbiBwcm92aWRlci4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFNlbGVjdGlvblByb3ZpZGVyIGltcGxlbWVudHMgSVBvc3RTZWxlY3Rpb25Qcm92aWRlciB7Ci0JCXByaXZhdGUgY2xhc3MgUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIWlzRmlyaW5nU2VsZWN0aW9uKCkpIHsKLQkJCQkJZmlyZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQsIHBvc3RMaXN0ZW5lcnMpOwotCQkJCQl1cGRhdGVTdGF0dXNMaW5lKGdldFNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSwgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgY2xhc3MgU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWlmICghaXNGaXJpbmdTZWxlY3Rpb24oKSkgewotCQkJCQlmaXJlU2VsZWN0aW9uQ2hhbmdlZChldmVudCwgbGlzdGVuZXJzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gaXNGaXJpbmdTZWxlY3Rpb24gPSBmYWxzZTsKLQkJcHJpdmF0ZSBMaXN0ZW5lckxpc3QgbGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCQlwcml2YXRlIExpc3RlbmVyTGlzdCBwb3N0TGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgcG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG5ldyBQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCk7Ci0JCXByaXZhdGUgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCk7Ci0KLQkJcHVibGljIHZvaWQgYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlwb3N0TGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBmaXJlU2VsZWN0aW9uQ2hhbmdlZChmaW5hbCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQsIExpc3RlbmVyTGlzdCBsaXN0ZW5lckxpc3QpIHsKLQkJCWlzRmlyaW5nU2VsZWN0aW9uID0gdHJ1ZTsKLQkJCU9iamVjdFtdIGxpc3RlbmVycyA9IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmluYWwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLQkJCQlTYWZlUnVubmVyLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlsLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCQlpc0ZpcmluZ1NlbGVjdGlvbiA9IGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgZ2V0UG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXJldHVybiBwb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotCQl9Ci0KLQkJcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQkJaWYgKGdldFRyZWVWaWV3ZXIoKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldFRyZWVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJCXJldHVybiBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCQl9Ci0KLQkJcHVibGljIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgZ2V0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcmV0dXJuIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRmlyaW5nU2VsZWN0aW9uKCkgewotCQkJcmV0dXJuIGlzRmlyaW5nU2VsZWN0aW9uOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlwb3N0TGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCWlmICghaXNGaXJpbmdTZWxlY3Rpb24pIHsKLQkJCQlnZXRUcmVlVmlld2VyKCkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFNob3dJblRhcmdldCBpbXBsZW1lbnRzIElTaG93SW5UYXJnZXQgewotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblRhcmdldCNzaG93KG9yZy5lY2xpcHNlLnVpLnBhcnQuU2hvd0luQ29udGV4dCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHNob3coU2hvd0luQ29udGV4dCBjb250ZXh0KSB7Ci0JCQlzZXRTZWxlY3Rpb24oY29udGV4dC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQlyZXR1cm4gZ2V0VHJlZVZpZXdlcigpLmdldFNlbGVjdGlvbigpLmVxdWFscyhjb250ZXh0LmdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIE5VTExfQ09ORklHVVJBVElPTiA9IG5ldyBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCXB1YmxpYyBJQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQkJcmV0dXJuIG5ldyBJVHJlZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJfQotCQkJfTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUTElORV9DT05URVhUX01FTlVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvci5PdXRsaW5lQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRMSU5FX0NPTlRFWFRfTUVOVV9TVUZGSVggPSAiLnNvdXJjZS5PdXRsaW5lQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIF9ERUJVRyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2NvbnRlbnRPdXRsaW5lIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkOwotCi0JcHJpdmF0ZSBsb25nIF9ERUJVR19USU1FID0gMDsKLQotCXByaXZhdGUgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJbXSBmQWN0aXZlRHJhZ0xpc3RlbmVyczsKLQlwcml2YXRlIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyW10gZkFjdGl2ZURyb3BMaXN0ZW5lcnM7Ci0JcHJpdmF0ZSBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gZkNvbmZpZ3VyYXRpb247Ci0KLQlwcml2YXRlIE1lbnUgZkNvbnRleHRNZW51OwotCXByaXZhdGUgU3RyaW5nIGZDb250ZXh0TWVudUlkOwotCi0JcHJpdmF0ZSBNZW51TWFuYWdlciBmQ29udGV4dE1lbnVNYW5hZ2VyOwotCXByaXZhdGUgRG91YmxlQ2xpY2tQcm92aWRlciBmRG91YmxlQ2xpY2tQcm92aWRlciA9IG51bGw7Ci0KLQlwcml2YXRlIERlbGVnYXRpbmdEcmFnQWRhcHRlciBmRHJhZ0FkYXB0ZXI7Ci0JcHJpdmF0ZSBEcmFnU291cmNlIGZEcmFnU291cmNlOwotCXByaXZhdGUgRGVsZWdhdGluZ0Ryb3BBZGFwdGVyIGZEcm9wQWRhcHRlcjsKLQlwcml2YXRlIERyb3BUYXJnZXQgZkRyb3BUYXJnZXQ7Ci0JcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yOwotCXByaXZhdGUgSU1lbnVMaXN0ZW5lciBmR3JvdXBBZGRlciA9IG51bGw7Ci0JcHJpdmF0ZSBPYmplY3QgZklucHV0ID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIGZJbnB1dENvbnRlbnRUeXBlSWRlbnRpZmllciA9IG51bGw7Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uTGlzdGVuZXIgZlNlbGVjdGlvbkxpc3RlbmVyID0gbnVsbDsKLQotCVNlbGVjdGlvblByb3ZpZGVyIGZTZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBBIENvbnRlbnRPdXRsaW5lUGFnZSB0aGF0IGFic3RyYWN0IGFzIG11Y2ggYmVoYXZpb3IgYXMgcG9zc2libGUgYXdheQotCSAqIGZyb20gdGhlIENvbnRyb2xzIGFuZCB2YXJpZXMgaXQgYnkgY29udGVudCB0eXBlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZHcm91cEFkZGVyID0gbmV3IEFkZGl0aW9uR3JvdXBBZGRlcigpOwotCQlmU2VsZWN0aW9uUHJvdmlkZXIgPSBuZXcgU2VsZWN0aW9uUHJvdmlkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gYSBsaXN0IG9mIHRob3NlIG5vdGlmaWVkIHdoZW4gc29tZW9uZSBkb3VibGUtY2xpY2tzCi0JICogaW4gdGhlIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIG5ld0xpc3RlbmVyIC0KLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREb3VibGVDbGlja0xpc3RlbmVyKElEb3VibGVDbGlja0xpc3RlbmVyIG5ld0xpc3RlbmVyKSB7Ci0JCWlmIChmRG91YmxlQ2xpY2tQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmRG91YmxlQ2xpY2tQcm92aWRlciA9IG5ldyBEb3VibGVDbGlja1Byb3ZpZGVyKCk7Ci0JCX0KLQkJZkRvdWJsZUNsaWNrUHJvdmlkZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXdMaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZUNvbnRleHRNZW51SUQoKSB7Ci0JCVN0cmluZyBpZCA9IG51bGw7Ci0JCWlmIChmSW5wdXRDb250ZW50VHlwZUlkZW50aWZpZXIgIT0gbnVsbCkgewotCQkJaWQgPSBmSW5wdXRDb250ZW50VHlwZUlkZW50aWZpZXIgKyBPVVRMSU5FX0NPTlRFWFRfTUVOVV9TVUZGSVg7Ci0JCX0KLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ29udGVudE91dGxpbmVQYWdlI2NyZWF0ZUNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCi0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQlmRWRpdG9yID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJfQotCi0JCWZEcmFnQWRhcHRlciA9IG5ldyBEZWxlZ2F0aW5nRHJhZ0FkYXB0ZXIoKTsKLQkJZkRyYWdTb3VyY2UgPSBuZXcgRHJhZ1NvdXJjZShnZXRDb250cm9sKCksIERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFKTsKLQkJZkRyb3BBZGFwdGVyID0gbmV3IERlbGVnYXRpbmdEcm9wQWRhcHRlcigpOwotCQlmRHJvcFRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KGdldENvbnRyb2woKSwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUpOwotCi0JCXNldENvbmZpZ3VyYXRpb24oZ2V0Q29uZmlndXJhdGlvbigpKTsKLQotCQkvKgotCQkgKiBDb250ZW50T3V0bGluZVBhZ2Ugb25seSBpbXBsZW1lbnRzIElTZWxlY3Rpb25Qcm92aWRlciB3aGlsZSB0aGUKLQkJICogdHJlZSB2aWV3ZXIgaW1wbGVtZW50cyBib3RoIElTZWxlY3Rpb25Qcm92aWRlciBhbmQKLQkJICogSVBvc3RTZWxlY3Rpb25Qcm92aWRlci4gVXNlIGFuIElTZWxlY3Rpb25Qcm92aWRlciB0aGF0IGxpc3RlbnMgdG8KLQkJICogcG9zdCBzZWxlY3Rpb24gZnJvbSB0aGUgdHJlZSB2aWV3ZXIgYW5kIGZvcndhcmQgb25seSBwb3N0IHNlbGVjdGlvbgotCQkgKiB0byB0aGUgc2VsZWN0aW9uIHNlcnZpY2UuCi0JCSAqLwotCQlnZXRUcmVlVmlld2VyKCkuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmU2VsZWN0aW9uUHJvdmlkZXIuZ2V0UG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpKTsKLQkJZ2V0VHJlZVZpZXdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmU2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkpOwotCQlpZiAoZkRvdWJsZUNsaWNrUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZkRvdWJsZUNsaWNrUHJvdmlkZXIgPSBuZXcgRG91YmxlQ2xpY2tQcm92aWRlcigpOwotCQl9Ci0JCWdldFRyZWVWaWV3ZXIoKS5hZGREb3VibGVDbGlja0xpc3RlbmVyKGZEb3VibGVDbGlja1Byb3ZpZGVyKTsKLQkJZ2V0U2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKGZTZWxlY3Rpb25Qcm92aWRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNlbGVjdGlvblNlcnZpY2UoKS5yZW1vdmVQb3N0U2VsZWN0aW9uTGlzdGVuZXIoZ2V0U2VsZWN0aW9uU2VydmljZUxpc3RlbmVyKCkpOwotCQlpZiAoZkRvdWJsZUNsaWNrUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJZ2V0VHJlZVZpZXdlcigpLnJlbW92ZURvdWJsZUNsaWNrTGlzdGVuZXIoZkRvdWJsZUNsaWNrUHJvdmlkZXIpOwotCQl9Ci0KLQkJLy8gZGlzcG9zZSBtZW51IGNvbnRyb2xzCi0JCWlmIChmQ29udGV4dE1lbnUgIT0gbnVsbCkgewotCQkJZkNvbnRleHRNZW51LmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoZkNvbnRleHRNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmQ29udGV4dE1lbnVNYW5hZ2VyLnJlbW92ZU1lbnVMaXN0ZW5lcihmR3JvdXBBZGRlcik7Ci0JCQlmQ29udGV4dE1lbnVNYW5hZ2VyLnJlbW92ZUFsbCgpOwotCQkJZkNvbnRleHRNZW51TWFuYWdlci5kaXNwb3NlKCk7Ci0JCX0KLQotCQlmRHJvcFRhcmdldC5kaXNwb3NlKCk7Ci0JCWZEcmFnU291cmNlLmRpc3Bvc2UoKTsKLQotCQlJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIgPSBnZXRTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0JCWlmIChzdGF0dXNMaW5lTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKG51bGwpOwotCQl9Ci0JCXNldENvbmZpZ3VyYXRpb24oTlVMTF9DT05GSUdVUkFUSU9OKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGtleSkgewotCQlPYmplY3QgYWRhcHRlciA9IG51bGw7Ci0JCWlmIChrZXkuZXF1YWxzKElTaG93SW5UYXJnZXQuY2xhc3MpKSB7Ci0JCQlhZGFwdGVyID0gbmV3IFNob3dJblRhcmdldCgpOwotCQl9Ci0JCWZpbmFsIElFZGl0b3JQYXJ0IGVkaXRvciA9IGZFZGl0b3I7Ci0KLQkJaWYgKGtleS5lcXVhbHMoSVNob3dJblNvdXJjZS5jbGFzcykgJiYgZWRpdG9yICE9IG51bGwpIHsKLQkJCWFkYXB0ZXIgPSBuZXcgSVNob3dJblNvdXJjZSgpIHsKLQkJCQlwdWJsaWMgU2hvd0luQ29udGV4dCBnZXRTaG93SW5Db250ZXh0KCkgewotCQkJCQlyZXR1cm4gbmV3IFNob3dJbkNvbnRleHQoZWRpdG9yLmdldEVkaXRvcklucHV0KCksIGVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQllbHNlIGlmIChrZXkuZXF1YWxzKElTaG93SW5UYXJnZXRMaXN0LmNsYXNzKSAmJiBlZGl0b3IgIT0gbnVsbCkgewotCQkJYWRhcHRlciA9IGVkaXRvci5nZXRBZGFwdGVyKGtleSk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgY3VycmVudGx5IHVzZWQgQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgewotCQlpZiAoZkNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgewotCQkJZkNvbmZpZ3VyYXRpb24gPSBOVUxMX0NPTkZJR1VSQVRJT047Ci0JCX0KLQkJcmV0dXJuIGZDb25maWd1cmF0aW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjZ2V0U2VsZWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBmU2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JSVNlbGVjdGlvbkxpc3RlbmVyIGdldFNlbGVjdGlvblNlcnZpY2VMaXN0ZW5lcigpIHsKLQkJaWYgKGZTZWxlY3Rpb25MaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgUG9zdFNlbGVjdGlvblNlcnZpY2VMaXN0ZW5lcigpOwotCQl9Ci0JCXJldHVybiBmU2VsZWN0aW9uTGlzdGVuZXI7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuSVBhZ2VCb29rVmlld1BhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlU2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElQYWdlU2l0ZSBwYWdlU2l0ZSkgewotCQlzdXBlci5pbml0KHBhZ2VTaXRlKTsKLQkJcGFnZVNpdGUuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2VsZWN0aW9uU2VydmljZSgpLmFkZFBvc3RTZWxlY3Rpb25MaXN0ZW5lcihnZXRTZWxlY3Rpb25TZXJ2aWNlTGlzdGVuZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIHRvIGEgbGlzdCBvZiB0aG9zZSBub3RpZmllZCB3aGVuIHNvbWVvbmUKLQkgKiBkb3VibGUtY2xpY2tzIGluIHRoZSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSBvbGRMaXN0ZW5lciAtCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihJRG91YmxlQ2xpY2tMaXN0ZW5lciBvbGRMaXN0ZW5lcikgewotCQlpZiAoZkRvdWJsZUNsaWNrUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJZkRvdWJsZUNsaWNrUHJvdmlkZXIucmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihvbGRMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25maWd1cmVzIChvciByZWNvbmZpZ3VyZXMpIHRoZSBwYWdlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4KLQkgKiBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbihDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQkvLyBpbnRlbnRpb25hbGx5IGRvIG5vdCBjaGVjayB0byBzZWUgaWYgdGhlIG5ldyBjb25maWd1cmF0aW9uICE9IG9sZAotCQkvLyBjb25maWd1cmF0aW9uCi0JCWlmIChnZXRUcmVlVmlld2VyKCkgIT0gbnVsbCkgewotCQkJLy8gcmVtb3ZlIHRoZSBrZXkgbGlzdGVuZXJzCi0JCQlpZiAoZ2V0Q29udHJvbCgpICE9IG51bGwgJiYgIWdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlLZXlMaXN0ZW5lcltdIGxpc3RlbmVycyA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRLZXlMaXN0ZW5lcnMoZ2V0VHJlZVZpZXdlcigpKTsKLQkJCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWdldENvbnRyb2woKS5yZW1vdmVLZXlMaXN0ZW5lcihsaXN0ZW5lcnNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlJQ29udHJpYnV0aW9uTWFuYWdlciB0b29sYmFyID0gZ2V0U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRUb29sQmFyTWFuYWdlcigpOwotCQkJaWYgKHRvb2xiYXIgIT0gbnVsbCkgewotCQkJCUlDb250cmlidXRpb25JdGVtW10gdG9vbGJhckl0ZW1zID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldFRvb2xiYXJDb250cmlidXRpb25zKGdldFRyZWVWaWV3ZXIoKSk7Ci0JCQkJaWYgKHRvb2xiYXJJdGVtcyAhPSBudWxsICYmIHRvb2xiYXJJdGVtcy5sZW5ndGggPiAwKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9vbGJhckl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQl0b29sYmFyLnJlbW92ZSh0b29sYmFySXRlbXNbaV0pOwotCQkJCQl9Ci0JCQkJCXRvb2xiYXIudXBkYXRlKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUlDb250cmlidXRpb25NYW5hZ2VyIG1lbnViYXIgPSBnZXRTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldE1lbnVNYW5hZ2VyKCk7Ci0JCQlpZiAobWVudWJhciAhPSBudWxsKSB7Ci0JCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBtZW51SXRlbXMgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0TWVudUNvbnRyaWJ1dGlvbnMoZ2V0VHJlZVZpZXdlcigpKTsKLQkJCQlpZiAobWVudUl0ZW1zICE9IG51bGwgJiYgbWVudUl0ZW1zLmxlbmd0aCA+IDApIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW51SXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCW1lbnViYXIucmVtb3ZlKG1lbnVJdGVtc1tpXSk7Ci0JCQkJCX0KLQkJCQkJbWVudWJhci5yZW1vdmUoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpOwotCQkJCQltZW51YmFyLnVwZGF0ZShmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gY2xlYXIgdGhlIERuRCBsaXN0ZW5lcnMgYW5kIHRyYW5zZmVyIHR5cGVzCi0JCQlpZiAoZkRyYWdBZGFwdGVyICE9IG51bGwgJiYgIWZEcmFnQWRhcHRlci5pc0VtcHR5KCkgJiYgZkRyYWdTb3VyY2UgIT0gbnVsbCAmJiAhZkRyYWdTb3VyY2UuaXNEaXNwb3NlZCgpICYmIGZEcmFnU291cmNlLmdldFRyYW5zZmVyKCkubGVuZ3RoID4gMCkgewotCQkJCWlmIChmQWN0aXZlRHJhZ0xpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZkFjdGl2ZURyYWdMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWZEcmFnQWRhcHRlci5yZW1vdmVEcmFnU291cmNlTGlzdGVuZXIoZkFjdGl2ZURyYWdMaXN0ZW5lcnNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZBY3RpdmVEcmFnTGlzdGVuZXJzID0gbnVsbDsKLQkJCQlmRHJhZ1NvdXJjZS5yZW1vdmVEcmFnTGlzdGVuZXIoZkRyYWdBZGFwdGVyKTsKLQkJCQlmRHJhZ1NvdXJjZS5zZXRUcmFuc2ZlcihuZXcgVHJhbnNmZXJbMF0pOwotCQkJfQotCQkJaWYgKGZEcm9wQWRhcHRlciAhPSBudWxsICYmICFmRHJvcEFkYXB0ZXIuaXNFbXB0eSgpICYmIGZEcm9wVGFyZ2V0ICE9IG51bGwgJiYgIWZEcm9wVGFyZ2V0LmlzRGlzcG9zZWQoKSAmJiBmRHJvcFRhcmdldC5nZXRUcmFuc2ZlcigpLmxlbmd0aCA+IDApIHsKLQkJCQlpZiAoZkFjdGl2ZURyb3BMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZBY3RpdmVEcm9wTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlmRHJvcEFkYXB0ZXIucmVtb3ZlRHJvcFRhcmdldExpc3RlbmVyKGZBY3RpdmVEcm9wTGlzdGVuZXJzW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmQWN0aXZlRHJvcExpc3RlbmVycyA9IG51bGw7Ci0JCQkJZkRyb3BUYXJnZXQucmVtb3ZlRHJvcExpc3RlbmVyKGZEcm9wQWRhcHRlcik7Ci0JCQkJZkRyb3BUYXJnZXQuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyWzBdKTsKLQkJCX0KLQkJCWdldENvbmZpZ3VyYXRpb24oKS5nZXRDb250ZW50UHJvdmlkZXIoZ2V0VHJlZVZpZXdlcigpKS5pbnB1dENoYW5nZWQoZ2V0VHJlZVZpZXdlcigpLCBmSW5wdXQsIG51bGwpOwotCQkJLy8gcmVsZWFzZSBhbnkgdGllcyB0byB0aGlzIHRyZWUgdmlld2VyCi0JCQlnZXRDb25maWd1cmF0aW9uKCkudW5jb25maWd1cmUoZ2V0VHJlZVZpZXdlcigpKTsKLQkJfQotCi0JCWZDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKLQotCQlpZiAoZ2V0VHJlZVZpZXdlcigpICE9IG51bGwgJiYgZ2V0Q29udHJvbCgpICE9IG51bGwgJiYgIWdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCS8vIChyZSlzZXQgdGhlIHByb3ZpZGVycwotCQkJZ2V0VHJlZVZpZXdlcigpLnNldExhYmVsUHJvdmlkZXIoZ2V0Q29uZmlndXJhdGlvbigpLmdldExhYmVsUHJvdmlkZXIoZ2V0VHJlZVZpZXdlcigpKSk7Ci0JCQlnZXRUcmVlVmlld2VyKCkuc2V0Q29udGVudFByb3ZpZGVyKGdldENvbmZpZ3VyYXRpb24oKS5nZXRDb250ZW50UHJvdmlkZXIoZ2V0VHJlZVZpZXdlcigpKSk7Ci0KLQkJCS8vIHZpZXcgdG9vbGJhcgotCQkJSUNvbnRyaWJ1dGlvbk1hbmFnZXIgdG9vbGJhciA9IGdldFNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkJCWlmICh0b29sYmFyICE9IG51bGwpIHsKLQkJCQlJQ29udHJpYnV0aW9uSXRlbVtdIHRvb2xiYXJJdGVtcyA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRUb29sYmFyQ29udHJpYnV0aW9ucyhnZXRUcmVlVmlld2VyKCkpOwotCQkJCWlmICh0b29sYmFySXRlbXMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRvb2xiYXJJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJdG9vbGJhci5hZGQodG9vbGJhckl0ZW1zW2ldKTsKLQkJCQkJfQotCQkJCQl0b29sYmFyLnVwZGF0ZSh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyB2aWV3IG1lbnUKLQkJCUlDb250cmlidXRpb25NYW5hZ2VyIG1lbnUgPSBnZXRTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldE1lbnVNYW5hZ2VyKCk7Ci0JCQlpZiAobWVudSAhPSBudWxsKSB7Ci0JCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBtZW51SXRlbXMgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0TWVudUNvbnRyaWJ1dGlvbnMoZ2V0VHJlZVZpZXdlcigpKTsKLQkJCQlpZiAobWVudUl0ZW1zICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW51SXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCW1lbnVJdGVtc1tpXS5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQkJbWVudS5hZGQobWVudUl0ZW1zW2ldKTsKLQkJCQkJCW1lbnVJdGVtc1tpXS51cGRhdGUoKTsKLQkJCQkJfQotCQkJCQltZW51LnVwZGF0ZSh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBhZGQgdGhlIGFsbG93ZWQgRG5EIGxpc3RlbmVycyBhbmQgdHlwZXMKLQkJCVRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyW10gZHJhZ0xpc3RlbmVycyA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnMoZ2V0VHJlZVZpZXdlcigpKTsKLQkJCWlmIChmRHJhZ0FkYXB0ZXIgIT0gbnVsbCAmJiBkcmFnTGlzdGVuZXJzLmxlbmd0aCA+IDApIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRyYWdMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZkRyYWdBZGFwdGVyLmFkZERyYWdTb3VyY2VMaXN0ZW5lcihkcmFnTGlzdGVuZXJzW2ldKTsKLQkJCQl9Ci0JCQkJZkFjdGl2ZURyYWdMaXN0ZW5lcnMgPSBkcmFnTGlzdGVuZXJzOwotCQkJCWZEcmFnU291cmNlLmFkZERyYWdMaXN0ZW5lcihmRHJhZ0FkYXB0ZXIpOwotCQkJCWZEcmFnU291cmNlLnNldFRyYW5zZmVyKGZEcmFnQWRhcHRlci5nZXRUcmFuc2ZlcnMoKSk7Ci0JCQl9Ci0JCQlUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcltdIGRyb3BMaXN0ZW5lcnMgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0VHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzKGdldFRyZWVWaWV3ZXIoKSk7Ci0JCQlpZiAoZkRyb3BBZGFwdGVyICE9IG51bGwgJiYgZHJvcExpc3RlbmVycy5sZW5ndGggPiAwKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkcm9wTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWZEcm9wQWRhcHRlci5hZGREcm9wVGFyZ2V0TGlzdGVuZXIoZHJvcExpc3RlbmVyc1tpXSk7Ci0JCQkJfQotCQkJCWZBY3RpdmVEcm9wTGlzdGVuZXJzID0gZHJvcExpc3RlbmVyczsKLQkJCQlmRHJvcFRhcmdldC5hZGREcm9wTGlzdGVuZXIoZkRyb3BBZGFwdGVyKTsKLQkJCQlmRHJvcFRhcmdldC5zZXRUcmFuc2ZlcihmRHJvcEFkYXB0ZXIuZ2V0VHJhbnNmZXJzKCkpOwotCQkJfQotCQkJLy8gYWRkIHRoZSBrZXkgbGlzdGVuZXJzCi0JCQlLZXlMaXN0ZW5lcltdIGxpc3RlbmVycyA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRLZXlMaXN0ZW5lcnMoZ2V0VHJlZVZpZXdlcigpKTsKLQkJCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWdldENvbnRyb2woKS5hZGRLZXlMaXN0ZW5lcihsaXN0ZW5lcnNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChmSW5wdXQgIT0gbnVsbCkgewotCQkJc2V0SW5wdXQoZklucHV0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiAgICAgICAgICAgIFRoZSBJRWRpdG9yUGFydCB0aGF0ICJvd25zIiB0aGlzIHBhZ2UuIFVzZWQgdG8gc3VwcG9ydCB0aGUKLQkgKiAgICAgICAgICAgICJTaG93IEluLi4uIiBtZW51LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRvclBhcnQoSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCWZFZGl0b3IgPSBlZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld0lucHV0Ci0JICogICAgICAgICAgICBUaGUgaW5wdXQgZm9yIHRoZSBwYWdlJ3Mgdmlld2VyLiBTaG91bGQgb25seSBiZSBzZXQgYWZ0ZXIgYQotCSAqICAgICAgICAgICAgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBhcHBsaWVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBuZXdJbnB1dCkgewotCQlmSW5wdXQgPSBuZXdJbnB1dDsKLQkJLyoKLQkJICogSW50ZW50aW9uYWxseSBub3Qgb3B0aW1pemVkIGZvciBjaGVja2luZyBuZXcgaW5wdXQgdnMuIG9sZCBpbnB1dCBzbwotCQkgKiB0aGF0IGFueSBleGlzdGluZyBjb250ZW50IHByb3ZpZGVycyBjYW4gYmUgdXBkYXRlZAotCQkgKi8KLQkJaWYgKGdldENvbnRyb2woKSAhPSBudWxsICYmICFnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlnZXRUcmVlVmlld2VyKCkuc2V0SW5wdXQoZklucHV0KTsKLQkJCXVwZGF0ZUNvbnRleHRNZW51SWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpZCAtCi0JICogICAgICAgICAgICB0aGUgY29udGVudCB0eXBlIGlkZW50aWZpZXIgdG8gdXNlIGZvciBmdXJ0aGVyIGV4dGVuc2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElucHV0Q29udGVudFR5cGVJZGVudGlmaWVyKFN0cmluZyBpZCkgewotCQlmSW5wdXRDb250ZW50VHlwZUlkZW50aWZpZXIgPSBpZDsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBvdXRsaW5lIHBhZ2UncyBjb250ZXh0IG1lbnUgZm9yIHRoZSBjdXJyZW50IGlucHV0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbnRleHRNZW51SWQoKSB7Ci0JCVN0cmluZyBjb21wdXRlZENvbnRleHRNZW51SWQgPSBudWxsOwotCQkvLyB1cGRhdGUgb3V0bGluZSB2aWV3J3MgY29udGV4dCBtZW51IGNvbnRyb2wgYW5kIElECi0KLQkJaWYgKGZFZGl0b3IgPT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJZkVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQl9Ci0JCX0KLQotCQljb21wdXRlZENvbnRleHRNZW51SWQgPSBjb21wdXRlQ29udGV4dE1lbnVJRCgpOwotCi0JCWlmIChjb21wdXRlZENvbnRleHRNZW51SWQgPT0gbnVsbCkgewotCQkJY29tcHV0ZWRDb250ZXh0TWVudUlkID0gT1VUTElORV9DT05URVhUX01FTlVfSUQ7Ci0JCX0KLQotCQkvKgotCQkgKiBVcGRhdGUgb3V0bGluZSBjb250ZXh0IG1lbnUgaWQgaWYgdXBkYXRpbmcgdG8gYSBuZXcgaWQgb3IgaWYKLQkJICogY29udGV4dCBtZW51IGlzIG5vdCBhbHJlYWR5IHNldCB1cAotCQkgKi8KLQkJaWYgKCFjb21wdXRlZENvbnRleHRNZW51SWQuZXF1YWxzKGZDb250ZXh0TWVudUlkKSB8fCAoZkNvbnRleHRNZW51ID09IG51bGwpKSB7Ci0JCQlmQ29udGV4dE1lbnVJZCA9IGNvbXB1dGVkQ29udGV4dE1lbnVJZDsKLQotCQkJaWYgKGdldENvbnRyb2woKSAhPSBudWxsICYmICFnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJLy8gZGlzcG9zZSBvZiBwcmV2aW91cyBjb250ZXh0IG1lbnUKLQkJCQlpZiAoZkNvbnRleHRNZW51ICE9IG51bGwpIHsKLQkJCQkJZkNvbnRleHRNZW51LmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJaWYgKGZDb250ZXh0TWVudU1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQlmQ29udGV4dE1lbnVNYW5hZ2VyLnJlbW92ZU1lbnVMaXN0ZW5lcihmR3JvdXBBZGRlcik7Ci0JCQkJCWZDb250ZXh0TWVudU1hbmFnZXIucmVtb3ZlQWxsKCk7Ci0JCQkJCWZDb250ZXh0TWVudU1hbmFnZXIuZGlzcG9zZSgpOwotCQkJCX0KLQotCQkJCWZDb250ZXh0TWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoZkNvbnRleHRNZW51SWQsIGZDb250ZXh0TWVudUlkKTsKLQkJCQlmQ29udGV4dE1lbnVNYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQotCQkJCWZDb250ZXh0TWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyKGZHcm91cEFkZGVyKTsKLQotCQkJCWZDb250ZXh0TWVudSA9IGZDb250ZXh0TWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUoZ2V0Q29udHJvbCgpKTsKLQkJCQlnZXRDb250cm9sKCkuc2V0TWVudShmQ29udGV4dE1lbnUpOwotCi0JCQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoZkNvbnRleHRNZW51SWQsIGZDb250ZXh0TWVudU1hbmFnZXIsIHRoaXMpOwotCi0JCQkJLyoKLQkJCQkgKiBhbHNvIHJlZ2lzdGVyIHRoaXMgbWVudSBmb3Igc291cmNlIHBhZ2UgcGFydCBhbmQgc3RydWN0dXJlZAotCQkJCSAqIHRleHQgb3V0bGluZSB2aWV3IGlkcwotCQkJCSAqLwotCQkJCWlmIChmRWRpdG9yICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHBhcnRJZCA9IGZFZGl0b3IuZ2V0U2l0ZSgpLmdldElkKCk7Ci0JCQkJCWlmIChwYXJ0SWQgIT0gbnVsbCkgewotCQkJCQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUocGFydElkICsgT1VUTElORV9DT05URVhUX01FTlVfU1VGRklYLCBmQ29udGV4dE1lbnVNYW5hZ2VyLCB0aGlzKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShPVVRMSU5FX0NPTlRFWFRfTUVOVV9JRCwgZkNvbnRleHRNZW51TWFuYWdlciwgdGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHVwZGF0ZVN0YXR1c0xpbmUoSVN0YXR1c0xpbmVNYW5hZ2VyIG1nciwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCUlMYWJlbFByb3ZpZGVyIHN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldFN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyKGdldFRyZWVWaWV3ZXIoKSk7Ci0JCWlmIChzdGF0dXNMaW5lTGFiZWxQcm92aWRlciAhPSBudWxsICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3QgZmlyc3RFbGVtZW50ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCXRleHQgPSBzdGF0dXNMaW5lTGFiZWxQcm92aWRlci5nZXRUZXh0KGZpcnN0RWxlbWVudCk7Ci0JCQlpbWFnZSA9IHN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyLmdldEltYWdlKGZpcnN0RWxlbWVudCk7Ci0JCX0KLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCW1nci5zZXRNZXNzYWdlKHRleHQpOwotCQl9Ci0JCWVsc2UgewotCQkJbWdyLnNldE1lc3NhZ2UoaW1hZ2UsIHRleHQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0lKRmFjZU5vZGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSUpGYWNlTm9kZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ3M2NkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSUpGYWNlTm9kZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUpGYWNlTm9kZUFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBub2RlKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gd2l0aCB0aGUgZWxlbWVudHMgYmVsb25naW5nIHRvIHRoZSBwYXNzZWQKLQkgKiBlbGVtZW50LiBUaGVzZSBhcmUgdGhlIHRvcCBsZXZlbCBpdGVtcyBpbiBhIGxpc3QsIHRyZWUsIHRhYmxlLCBldGMuLi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG5vZGUpOwotCi0JLyoqCi0JICogRmV0Y2hlcyB0aGUgbGFiZWwgaW1hZ2Ugc3BlY2lmaWMgdG8gdGhpcyBvYmplY3QgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEltYWdlIGdldExhYmVsSW1hZ2UoT2JqZWN0IG5vZGUpOwotCi0JLyoqCi0JICogRmV0Y2hlcyB0aGUgbGFiZWwgdGV4dCBzcGVjaWZpYyB0byB0aGlzIG9iamVjdCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsVGV4dChPYmplY3Qgbm9kZSk7Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgbm9kZSk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgbm9kZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmN2E1M2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0lKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgewotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKE9iamVjdCBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiByZXR1cm5zICJjb3B5IiBzbyBubyBvbmUgY2FuIG1vZGlmeSBvdXIgbGlzdC4gSXRzIGlzIGEgc2hhbGxvdyBjb3B5LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldExpc3RlbmVycygpOwotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoT2JqZWN0IGxpc3RlbmVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1Byb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZjg4MGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1Byb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZTsKLQotLyoqCi0gKiBBbiBJQWN0aW9uLkFTX0NIRUNLX0JPWCBhY3Rpb24gdGhhdCBzZXRzIGFuZCBnZXRzIGl0cyBjaGVja2VkIHN0YXRlIGFsb25nCi0gKiB3aXRoIGEgdmFsdWUgZnJvbSBhIHByZWZlcmVuY2Ugc3RvcmUuIFNob3VsZCBiZSB1c2VkIHdpdGgKLSAqIFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbSB0byBsaXN0ZW4gdG8gY2hhbmdlcyBpbiB0aGUKLSAqIHN0b3JlIGFuZCB1cGRhdGUgdGhlIGNoZWNrZWQgc3RhdGUgZnJvbSBQcm9wZXJ0eUNoYW5nZUV2ZW50cy4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSVVwZGF0ZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgZlByZWZlcmVuY2VLZXk7Ci0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGZTdG9yZTsKLQlwcml2YXRlIGJvb2xlYW4gZlVwZGF0ZUZyb21Qcm9wZXJ0eUNoYW5nZSA9IHRydWU7Ci0KLQlwdWJsaWMgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb24oU3RyaW5nIHRleHQsIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBwcmVmZXJlbmNlS2V5LCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcih0ZXh0LCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7Ci0JCWZQcmVmZXJlbmNlS2V5ID0gcHJlZmVyZW5jZUtleTsKLQkJZlN0b3JlID0gc3RvcmU7Ci0JCWZTdG9yZS5zZXREZWZhdWx0KGdldFByZWZlcmVuY2VLZXkoKSwgZGVmYXVsdFZhbHVlKTsKLQkJc2V0SWQoZ2V0UHJlZmVyZW5jZUtleSgpKTsKLQkJc2V0Q2hlY2tlZChnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKGdldFByZWZlcmVuY2VLZXkoKSkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgb3JkZXJQcmVmZXJlbmNlS2V5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZmVyZW5jZUtleSgpIHsKLQkJcmV0dXJuIGZQcmVmZXJlbmNlS2V5OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3RvcmUuCi0JICovCi0JcHVibGljIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gZlN0b3JlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdXBkYXRlRnJvbVByb3BlcnR5Q2hhbmdlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXBkYXRlRnJvbVByb3BlcnR5Q2hhbmdlKCkgewotCQlyZXR1cm4gZlVwZGF0ZUZyb21Qcm9wZXJ0eUNoYW5nZTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCBydW4oKSB7Ci0JCXN1cGVyLnJ1bigpOwotCQlmU3RvcmUuc2V0VmFsdWUoZ2V0UHJlZmVyZW5jZUtleSgpLCBpc0NoZWNrZWQoKSk7Ci0JCWlmICghaXNVcGRhdGVGcm9tUHJvcGVydHlDaGFuZ2UoKSkKLQkJCXVwZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB1cGRhdGVGcm9tUHJvcGVydHlDaGFuZ2UKLQkgKiAgICAgICAgICAgIFRoZSB1cGRhdGVGcm9tUHJvcGVydHlDaGFuZ2UgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVwZGF0ZUZyb21Qcm9wZXJ0eUNoYW5nZShib29sZWFuIHVwZGF0ZUZyb21Qcm9wZXJ0eUNoYW5nZSkgewotCQlmVXBkYXRlRnJvbVByb3BlcnR5Q2hhbmdlID0gdXBkYXRlRnJvbVByb3BlcnR5Q2hhbmdlOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc2V0Q2hlY2tlZChmU3RvcmUuZ2V0Qm9vbGVhbihnZXRQcmVmZXJlbmNlS2V5KCkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkMGFlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlOwotCi0vKioKLSAqIEEgbGlzdGVuZXIgb24gdGhlIGdpdmVuIGFjdGlvbidzIFByZWZlcmVuY2VTdG9yZS4gSXQgY2FsbHMgLnVwZGF0ZSgpIG9uIHRoZQotICogYWN0aW9uIHdoZW4gdGhlIGdpdmVuIGtleSBjaGFuZ2VzIHZhbHVlLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtIGV4dGVuZHMgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSB7Ci0KLQlwcml2YXRlIGNsYXNzIFByZWZlcmVuY2VVcGRhdGVMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKGZQcm9wZXJ0eSkpIHsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGZQcm9wZXJ0eSArICIgcHJlZmVyZW5jZSBjaGFuZ2VkLCB1cGRhdGluZyAiICsgZ2V0QWN0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCSgoSVVwZGF0ZSkgZ2V0QWN0aW9uKCkpLnVwZGF0ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWcgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0iKSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQ7Ci0KLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZMaXN0ZW5lciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZQcm9wZXJ0eSA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGZTdG9yZTsKLQotCXB1YmxpYyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb24gYWN0aW9uKSB7Ci0JCXN1cGVyKGFjdGlvbik7Ci0JCWZQcm9wZXJ0eSA9IGFjdGlvbi5nZXRQcmVmZXJlbmNlS2V5KCk7Ci0JCWZTdG9yZSA9IGFjdGlvbi5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJZkxpc3RlbmVyID0gbmV3IFByZWZlcmVuY2VVcGRhdGVMaXN0ZW5lcigpOwotCQljb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29ubmVjdCgpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBzdGFydGVkIGxpc3RlbmluZyBmb3IgIiArIGZQcm9wZXJ0eSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZlN0b3JlICE9IG51bGwpIHsKLQkJCWZTdG9yZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KCkgewotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtIHN0b3BwZWQgbGlzdGVuaW5nIGZvciAiICsgZlByb3BlcnR5KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChmU3RvcmUgIT0gbnVsbCkgewotCQkJZlN0b3JlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJZGlzY29ubmVjdCgpOwotCQlmUHJvcGVydHkgPSBudWxsOwotCQlmU3RvcmUgPSBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChnZXRBY3Rpb24oKS5nZXRJZCgpICE9IG51bGwpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIih0ZXh0PSIgKyBnZXRBY3Rpb24oKS5nZXRUZXh0KCkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Db21ib0xpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Db21ib0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4ZWI1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ29tYm9MaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBQZW9wbGUgc2hvdWxkIG1hbmFnZSB0aGVpciBvd24gY29tYm8vbGlzdAotICovCi1wdWJsaWMgY2xhc3MgQ29tYm9MaXN0IHsKLQlwcml2YXRlIENvbWJvIGNvbWJvOwotCi0KLQlwcml2YXRlIExpc3QgbGlzdDsKLQotCXB1YmxpYyBDb21ib0xpc3QoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCWNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgc3R5bGUpOwotCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCi0JLyoKLQkgKiBmb2xsb3dpbmcgbWV0aG9kcyBpcyBvcmlnaW5hbCBtZXRob2Qgb2YgQ29tYm8gY2xhc3MuCi0JICovCi0JcHVibGljIHZvaWQgYWRkKFN0cmluZyBrZXkpIHsKLQkJY2hlY2tFcnJvcigpOwotCQljb21iby5hZGQoa2V5KTsKLQkJbGlzdC5hZGQoa2V5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIGtleSwgaW50IGluZGV4KSB7Ci0JCWNoZWNrRXJyb3IoKTsKLQkJY29tYm8uYWRkKGtleSwgaW5kZXgpOwotCQlsaXN0LmFkZChpbmRleCwga2V5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWNoZWNrRXJyb3IoKTsKLQkJY29tYm8uYWRkKGtleSk7Ci0JCWxpc3QuYWRkKHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJY2hlY2tFcnJvcigpOwotCQljb21iby5hZGQoa2V5LCBpbmRleCk7Ci0JCWxpc3QuYWRkKGluZGV4LCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRm9jdXNMaXN0ZW5lcihGb2N1c0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWNvbWJvLmFkZEZvY3VzTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE1vZGlmeUxpc3RlbmVyKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRXJyb3IoKSB7Ci0JCWlmICghaXNDb25zaXN0ZW5jeSgpKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiRGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBudW1iZXIgb2Yga2V5c1siICsgY29tYm8uZ2V0SXRlbUNvdW50KCkgKyAiXSBhbmQgdGhlIG51bWJlciBvZiB2YWx1ZXNbIiArIGxpc3Quc2l6ZSgpICsgIl0gaW4gQ29tYm9MaXN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50IGNvbXB1dGVTaXplKGludCB3SGludCwgaW50IGhIaW50KSB7Ci0JCXJldHVybiBjb21iby5jb21wdXRlU2l6ZSh3SGludCwgaEhpbnQpOwotCX0KLQotCXB1YmxpYyBNYXAgY3JlYXRlSGFzaHRhYmxlKCkgewotCQljaGVja0Vycm9yKCk7Ci0JCU1hcCBtID0gbmV3IEhhc2h0YWJsZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspCi0JCQltLnB1dChjb21iby5nZXRJdGVtKGkpLCBsaXN0LmdldChpKSk7Ci0JCXJldHVybiBtOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlc2VsZWN0KGludCBpKSB7Ci0JCWNvbWJvLmRlc2VsZWN0KGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlc2VsZWN0QWxsKCkgewotCQljb21iby5kZXNlbGVjdEFsbCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBjb21iby5lcXVhbHMob2JqKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhjaGFuZ2VQb3NpdGlvbihpbnQgaSwgaW50IGopIHsKLQkJU3RyaW5nIHRtcEtleSA9IGdldEl0ZW0oaSk7Ci0JCU9iamVjdCB0bXBWYWx1ZSA9IGxpc3QucmVtb3ZlKGkpOwotCi0JCWNvbWJvLnNldEl0ZW0oaSwgZ2V0SXRlbShqKSk7Ci0JCWxpc3QuYWRkKGksIGxpc3QucmVtb3ZlKGogLSAxKSk7Ci0KLQkJY29tYm8uc2V0SXRlbShqLCB0bXBLZXkpOwotCQlsaXN0LmFkZChqLCB0bXBWYWx1ZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzQXNLZXkoU3RyaW5nIHN0cikgewotCQlpZiAoY29tYm8uaW5kZXhPZihzdHIpID49IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGV4aXN0c0FzVmFsdWUoU3RyaW5nIHN0cikgewotCQlpZiAobGlzdC5pbmRleE9mKHN0cikgPj0gMCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0RW5hYmxlZCgpIHsKLQkJcmV0dXJuIGNvbWJvLmdldEVuYWJsZWQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEl0ZW0oaW50IGluZGV4KSB7Ci0JCXJldHVybiBjb21iby5nZXRJdGVtKGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEl0ZW1Db3VudCgpIHsKLQkJcmV0dXJuIGNvbWJvLmdldEl0ZW1Db3VudCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgaW5kZXggPSAtMTsKLQkJY2hlY2tFcnJvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCWlmICghbGlzdC5nZXQoaSkuZXF1YWxzKHZhbHVlKSkKLQkJCQljb250aW51ZTsKLQkJCWluZGV4ID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpbmRleCAhPSAtMSkKLQkJCXJldHVybiBjb21iby5nZXRJdGVtKGluZGV4KTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRMYXlvdXREYXRhKCkgewotCQlyZXR1cm4gY29tYm8uZ2V0TGF5b3V0RGF0YSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWRWYWx1ZSgpIHsKLQkJY2hlY2tFcnJvcigpOwotCQlpbnQgaW5kZXggPSBnZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXRWYWx1ZShnZXRJdGVtKGluZGV4KSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTZWxlY3Rpb25JbmRleCgpIHsKLQkJcmV0dXJuIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gY29tYm8uZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoU3RyaW5nIGtleSkgewotCQlpZiAoa2V5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCWNoZWNrRXJyb3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21iby5nZXRJdGVtQ291bnQoKTsgaSsrKSB7Ci0JCQlpZiAoIWNvbWJvLmdldEl0ZW0oaSkuZXF1YWxzKGtleSkpCi0JCQkJY29udGludWU7Ci0JCQlpbmRleCA9IGk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoaW5kZXggIT0gLTEpCi0JCQlyZXR1cm4gKFN0cmluZykgbGlzdC5nZXQoaW5kZXgpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGluZGV4T2YoU3RyaW5nIHN0cikgewotCQlyZXR1cm4gY29tYm8uaW5kZXhPZihzdHIpOwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gaXNDb25zaXN0ZW5jeSgpIHsKLQotCQlpZiAobGlzdC5zaXplKCkgPT0gY29tYm8uZ2V0SXRlbUNvdW50KCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKGludCBpbmRleCkgewotCQljaGVja0Vycm9yKCk7Ci0JCWNvbWJvLnJlbW92ZShpbmRleCk7Ci0JCWxpc3QucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIHN0cikgewotCQljaGVja0Vycm9yKCk7Ci0JCWNvbWJvLnJlbW92ZShzdHIpOwotCQlsaXN0LnJlbW92ZShzdHIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdChpbnQgaW5kZXgpIHsKLQkJY29tYm8uc2VsZWN0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQljb21iby5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNldEZvY3VzKCkgewotCQlyZXR1cm4gY29tYm8uc2V0Rm9jdXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJdGVtKGludCBpbmRleCwgU3RyaW5nIHN0cikgewotCQljaGVja0Vycm9yKCk7Ci0JCWNvbWJvLnNldEl0ZW0oaW5kZXgsIHN0cik7Ci0JCWxpc3QucmVtb3ZlKGluZGV4KTsKLQkJbGlzdC5hZGQoaW5kZXgsIHN0cik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXRlbShTdHJpbmdbXSBzdHJBcnJheSkgewotCQljaGVja0Vycm9yKCk7Ci0JCWNvbWJvLnNldEl0ZW1zKHN0ckFycmF5KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJBcnJheS5sZW5ndGg7IGkrKykKLQkJCWxpc3QuYWRkKHN0ckFycmF5W2ldKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYXlvdXQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0IGxvKSB7Ci0JCWNvbWJvLnNldExheW91dChsbyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGF5b3V0RGF0YShPYmplY3QgbGF5b3V0RGF0YSkgewotCQljb21iby5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihQb2ludCBwb2ludCkgewotCQljb21iby5zZXRTZWxlY3Rpb24ocG9pbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHN0cikgewotCQljb21iby5zZXRUZXh0KHN0cik7Ci0JfQotCi0JcHVibGljIHZvaWQgc29ydEJ5S2V5KGludCBvZmZzZXQpIHsKLQkJaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gdGhpcy5jb21iby5nZXRJdGVtQ291bnQoKSAtIDEpCi0JCQlyZXR1cm47Ci0JCWNoZWNrRXJyb3IoKTsKLQkJLy8KLQkJZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IGNvbWJvLmdldEl0ZW1Db3VudCgpIC0gMTsgaSsrKSB7Ci0JCQlmb3IgKGludCBqID0gaSArIDE7IGogPCBjb21iby5nZXRJdGVtQ291bnQoKTsgaisrKSB7Ci0JCQkJaWYgKGdldEl0ZW0oaSkuY29tcGFyZVRvKGdldEl0ZW0oaikpID4gMCkgewotCQkJCQlleGNoYW5nZVBvc2l0aW9uKGksIGopOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NvbWJvTGlzdE9uUHJvcGVydHlQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2YzUxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgUGVvcGxlIHNob3VsZCBtYW5hZ2UgdGhlaXIgb3duIGNvbWJvL2xpc3QKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbWJvTGlzdE9uUHJvcGVydHlQYWdlIGV4dGVuZHMgQ29tYm9MaXN0IHsKLQotCi0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudEFwcGx5VmFsdWU7Ci0KLQlwdWJsaWMgQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2UoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QXBwbHlWYWx1ZSgpIHsKLQkJcmV0dXJuIGN1cnJlbnRBcHBseVZhbHVlOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHNldEFwcGx5VmFsdWUoU3RyaW5nIGN1cnJlbnRBcHBseVZhbHVlKSB7Ci0JCXRoaXMuY3VycmVudEFwcGx5VmFsdWUgPSBjdXJyZW50QXBwbHlWYWx1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Db250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Db250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzNzg2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5Db250ZW50U2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5Db250ZW50U2V0dGluZ3NDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSUNvbnRlbnRTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5XZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UKLSAqICAgICAgICAgICAgIG9yCi0gKiAgICAgICAgICAgICBlY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuQ1NTV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlCi0gKiAgICAgICAgICAgICBpbnN0ZWFkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIElTdGF0dXMgU1RBVFVTX0VSUk9SID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5JTkZPLCAiRVJST1IiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JLy8gZm9yIHZhbGlkYXRlRWRpdCgpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVN0YXR1cyBTVEFUVVNfT0sgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFNTRVVJUGx1Z2luLklELCBJU3RhdHVzLk9LLCAiT0siLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTWV0aG9kIHZhbGlkYXRlRWRpdC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwKLQkgKiBAcmV0dXJuIElTdGF0dXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlRWRpdChJRmlsZSBmaWxlLCBTaGVsbCBjb250ZXh0KSB7Ci0JCWlmIChmaWxlID09IG51bGwgfHwgIWZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gU1RBVFVTX0VSUk9SOwotCQlpZiAoIShmaWxlLmlzUmVhZE9ubHkoKSkpCi0JCQlyZXR1cm4gU1RBVFVTX09LOwotCi0JCUlQYXRoIGxvY2F0aW9uID0gZmlsZS5nZXRMb2NhdGlvbigpOwotCi0JCWZpbmFsIGxvbmcgYmVmb3JlTW9kaWZpZWRGcm9tSmF2YUlPID0gKGxvY2F0aW9uICE9IG51bGwpID8gbG9jYXRpb24udG9GaWxlKCkubGFzdE1vZGlmaWVkKCkgOiBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQkJZmluYWwgbG9uZyBiZWZvcmVNb2RpZmllZEZyb21JRmlsZSA9IGZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQotCQlJU3RhdHVzIHN0YXR1cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQobmV3IElGaWxlW117ZmlsZX0sIGNvbnRleHQpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQlyZXR1cm4gc3RhdHVzOwotCi0JCWZpbmFsIGxvbmcgYWZ0ZXJNb2RpZmllZEZyb21KYXZhSU8gPSAobG9jYXRpb24gIT0gbnVsbCkgPyBsb2NhdGlvbi50b0ZpbGUoKS5sYXN0TW9kaWZpZWQoKSA6IElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCQlmaW5hbCBsb25nIGFmdGVyTW9kaWZpZWRGcm9tSUZpbGUgPSBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0KLQkJaWYgKGJlZm9yZU1vZGlmaWVkRnJvbUphdmFJTyAhPSBhZnRlck1vZGlmaWVkRnJvbUphdmFJTyB8fCBiZWZvcmVNb2RpZmllZEZyb21JRmlsZSAhPSBhZnRlck1vZGlmaWVkRnJvbUlGaWxlKSB7Ci0JCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG1hbmFnZXIuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZmlsZSk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCWlmICghbW9kZWwuaXNEaXJ0eSgpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlyZXR1cm4gU1RBVFVTX0VSUk9SOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICgoYmVmb3JlTW9kaWZpZWRGcm9tSmF2YUlPICE9IGFmdGVyTW9kaWZpZWRGcm9tSmF2YUlPKSB8fCAoYmVmb3JlTW9kaWZpZWRGcm9tSUZpbGUgIT0gYWZ0ZXJNb2RpZmllZEZyb21JRmlsZSkpIHsKLQkJCS8vIHRoZSBmaWxlIGlzIHJlcGxhY2VkLiBNb2RpZmljYXRpb24gY2Fubm90IGJlCi0JCQkvLyBhcHBsaWVkLgotCQkJcmV0dXJuIFNUQVRVU19FUlJPUjsKLQkJfQotCQlyZXR1cm4gU1RBVFVTX09LOwotCX0KLQotCXByb3RlY3RlZCBDb21ib0xpc3RPblByb3BlcnR5UGFnZVtdIGNvbWJvOwotCXByb3RlY3RlZCBDb21wb3NpdGUgY29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIElDb250ZW50U2V0dGluZ3MgY29udGVudFNldHRpbmdzOwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQ1NTX0xBQkVMID0gU1NFVUlNZXNzYWdlcy5VSV9DU1NfcHJvZmlsZV9fXzI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIERFVklDRV9MQUJFTCA9IFNTRVVJTWVzc2FnZXMuVUlfVGFyZ2V0X0RldmljZV9fXzM7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfTEFCRUwgPSBTU0VVSU1lc3NhZ2VzLlVJX0RlZmF1bHRfSFRNTF9ET0NUWVBFX0lEX19fMTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBpbnQgbnVtYmVyT2ZDb21ibzsKLQlwcm90ZWN0ZWQgaW50IG51bUNvbHMgPSAxOwotCXByb3RlY3RlZCBpbnQgbnVtUm93cyA9IDE7Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSBwcm9wZXJ0eVBhZ2U7Ci0KLQlwdWJsaWMgQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhblVwKCkgewotCQkvLyBBcmUgVGhlcmUgYW55IHdheSB0byBndWFyYW50ZWUgdG8gY2FsbCBjbGVhblVwKCkgdG8gcmUtbG9hZAotCQkvLyBkb3dubG9hZGVkIC5jb250ZW50c2V0dGluZ3MgZmlsZQotCQkvLyBhZnRlciBDb250ZW50U2V0dGluZ3MucmVsZWFzZUNhY2hlKCkgaW4gQ29udGVudFNldHRpbmdTZWxmSGFuZGxlcgotCQkvLyBjbGFzcywgd2hpY2ggaXMgY2FsbGVkIGJ5IHJlc291cmNlQ2hhbmdlRXZlbnQKLQl9Ci0KLQotCXByb3RlY3RlZCBDb21ib0xpc3RPblByb3BlcnR5UGFnZSBjcmVhdGVDb21ib0JveE9mKFN0cmluZyB0aXRsZSkgewotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHByb3BlcnR5UGFnZSwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRUZXh0KHRpdGxlKTsKLQkJaWYgKHRpdGxlICE9IG51bGwgJiYgdGl0bGUuc3RhcnRzV2l0aChTU0VVSU1lc3NhZ2VzLlVJX0RlZmF1bHRfSFRNTF9ET0NUWVBFX0lEX19fMSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl9Ci0JCUNvbWJvTGlzdE9uUHJvcGVydHlQYWdlIGNvbWJvID0gbmV3IENvbWJvTGlzdE9uUHJvcGVydHlQYWdlKHByb3BlcnR5UGFnZSwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCS8vIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucywgaW50IG51bVJvd3MpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCS8vIGRhdGEuaG9yaXpvbnRhbFNwYW49bnVtQ29sdW1uczsKLQkJLy8gZGF0YS52ZXJ0aWNhbFNwYW49bnVtUm93czsKLQotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQljb250ZW50U2V0dGluZ3MgPSBDb250ZW50U2V0dGluZ3NDcmVhdG9yLmNyZWF0ZSgpOwotCi0JCXByb3BlcnR5UGFnZSA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIG51bUNvbHMsIG51bVJvd3MpOwotCi0JCWNyZWF0ZVNldHRpbmdzUGFnZUdVSSgpOwotCi0JCXJldHVybiBwcm9wZXJ0eVBhZ2U7Ci0KLQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZVNldHRpbmdzUGFnZUdVSSgpOwotCi0JLy8gcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYXBwbHlTZWxlY3RlZFByb3BlcnR5VmFsdWUoU3RyaW5nIHN0cixpbnQKLQkvLyBpbmRleCk7Ci0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGVsZXRlTm9uZVByb3BlcnR5KGludCBpbmRleCk7Ci0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbml0VmFsdWVDaGFuZ2VkKFN0cmluZyBiZWZvcmUsIFN0cmluZyBhZnRlcikgewotCQlpZiAoYmVmb3JlID09IG51bGwgJiYgYWZ0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGJlZm9yZSAhPSBudWxsICYmIGJlZm9yZS5lcXVhbHMoYWZ0ZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJLy8gc2VsZWN0ZWQoYXBwbGllZCkgaXRlbSBpcyByZXN0b3JlZC4KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZkNvbWJvOyBpKyspIHsKLQkJCS8vIFN0cmluZyBhcHBsaWVkVmFsdWUgPSBjb21ib1tpXS5nZXRBcHBseVZhbHVlKCk7Ci0JCQkvLyBzZXRTZWxlY3Rpb25JdGVtKGNvbWJvW2ldLGFwcGxpZWRWYWx1ZSk7Ci0JCQljb21ib1tpXS5zZWxlY3QoMCk7IC8vIHNlbGVjdCBub25lLgotCi0JCX0KLQotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJTWFwIHByb3BlcnRpZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWlmICh2YWxpZGF0ZVN0YXRlKCkgPT0gZmFsc2UpIHsKLQkJCWNsZWFuVXAoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZDb21ibzsgaSsrKSB7Ci0JCQkvLyBnZXQgc2VsZWN0ZWQgaXRlbSBpbiBDb21ibyBib3guCi0JCQlTdHJpbmcgc3RyID0gY29tYm9baV0uZ2V0U2VsZWN0ZWRWYWx1ZSgpOwotCQkJaWYgKHN0ciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJLy8gaWYgbm8gY2hhbmdlLCBza2lwIHNldFByb3BlcnR5Ci0JCQlpZiAoIWlzSW5pdFZhbHVlQ2hhbmdlZChjb21ib1tpXS5nZXRBcHBseVZhbHVlKCksIHN0cikpCi0JCQkJY29udGludWU7Ci0JCQkvLyBpZiBOT05FIGlzIHNlbGVjdGVkLCBkZWxldGUgYXR0ciBpbnN0YW5jZSAoYW5kIHdyaXRlCi0JCQkvLyAuY29udGVudHNldHRpbmdzLikKLQkJCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPT0gMCkKLQkJCQlkZWxldGVOb25lUHJvcGVydHkoaSk7Ci0JCQllbHNlCi0JCQkJcHV0U2VsZWN0ZWRQcm9wZXJ0eUludG8ocHJvcGVydGllcywgc3RyLCBpKTsKLQkJCS8vIGFwcGx5U2VsZWN0ZWRQcm9wZXJ0eVZhbHVlKHN0cixpKTsKLQotCQkJLy8gc2V0IGFwcGx5IHZhbHVlIGluIENvbWJvTGlzdE9uUHJvcGVydHlQYWdlLgotCQkJY29tYm9baV0uc2V0QXBwbHlWYWx1ZShzdHIpOwotCQl9Ci0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpKQotCQkJY29udGVudFNldHRpbmdzLnNldFByb3BlcnRpZXMoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBwcm9wZXJ0aWVzKTsKLQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkKLQkJCXByb3BlcnRpZXMuY2xlYXIoKTsKLQkJcHJvcGVydGllcyA9IG51bGw7Ci0JCWlmICghY29udGVudFNldHRpbmdzLmV4aXN0c1Byb3BlcnRpZXMoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpKSkKLQkJCWNvbnRlbnRTZXR0aW5ncy5kZWxldGVBbGxQcm9wZXJ0aWVzKChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHB1dFNlbGVjdGVkUHJvcGVydHlJbnRvKE1hcCBwcm9wZXJ0aWVzLCBTdHJpbmcgc3RyLCBpbnQgaSk7Ci0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNlbGVjdGlvbkl0ZW0oQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2UgY29tYm8sIFN0cmluZyB2YWx1ZSkgewotCQlpZiAoY29tYm8uZ2V0SXRlbUNvdW50KCkgPD0gMCkKLQkJCXJldHVybjsKLQkJY29tYm8uc2V0QXBwbHlWYWx1ZSh2YWx1ZSk7Ci0JCVN0cmluZyBpdGVtID0gY29tYm8uZ2V0S2V5KHZhbHVlKTsKLQkJaWYgKGl0ZW0gIT0gbnVsbCkKLQkJCWNvbWJvLnNlbGVjdChjb21iby5pbmRleE9mKGl0ZW0pKTsKLQkJZWxzZQotCQkJY29tYm8uc2VsZWN0KDApOwotCi0JfQotCi0JLyoKLQkgKiBWYWxpZGF0ZSBFZGl0LiBTaW1pbGFyIGZ1bmN0aW9uIHdpbGwgYmUgaW4gSFRNTENvbW1hbmQuamF2YQotCSAqIENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhIENTU0FjdGlvbk1hbmFnZXIuamF2YQotCSAqIERlc2lnblJlZG9BY3Rpb24uamF2YSBEZXNpZ25VbmRvQWN0aW9uLmphdmEKLQkgKiBIVE1MQ29udmVyc2lvblByb2Nlc3Nvci5qYXZhCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlU3RhdGUoKSB7Ci0KLQkJLy8gZ2V0IElGaWxlIG9mIC5jb250ZW50c2V0dGluZ3MKLQkJZmluYWwgU3RyaW5nIG5hbWUgPSBDb250ZW50U2V0dGluZ3MuZ2V0Q29udGVudFNldHRpbmdzTmFtZSgpOwotCQlmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCk7Ci0JCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCUlGaWxlIGZpbGUgPSBwcm9qZWN0LmdldEZpbGUobmFtZSk7Ci0KLQkJaWYgKGZpbGUgIT0gbnVsbCAmJiAhZmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiB0cnVlOyAvLyBJcyB0aGlzIHJlYWxseSBPSz8KLQkJLy8gSWYgZmFsc2Ugc2hvdWxkIGJlIHJldHVybmVkLAotCQkvLyBUaGlzIHN0YXRlbWFudCBjYW4gYmUgcmVtb3ZlZCwKLQkJLy8gc2luY2UgTW9kZWxNYW5hZ2VyVXRpbC52YWxpZGF0ZUVkaXQoKQotCQkvLyByZXR1cm5zIGVycm9yIHRvIHRoaXMgY2FzZS4KLQotCQlTaGVsbCBzaGVsbCA9IGdldENvbnRyb2woKS5nZXRTaGVsbCgpOwotCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlRWRpdChmaWxlLCBzaGVsbCk7Ci0JCXJldHVybiBzdGF0dXMuaXNPSygpID8gdHJ1ZSA6IGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQW5ub3RhdGlvblF1ZXJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Bbm5vdGF0aW9uUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdmMzc3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Bbm5vdGF0aW9uUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlRlbXBvcmFyeUFubm90YXRpb247Ci0KLS8qCi0gKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUucmVnaXN0cnkuTWFya2VyUXVlcnkKLSAqLwotY2xhc3MgQW5ub3RhdGlvblF1ZXJ5IHsKLQkvKioKLQkgKiBUaGUgYW5ub3RhdGlvbiB0eXBlIHRhcmdldHRlZCBieSB0aGlzIHF1ZXJ5LiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLQotCS8qKgotCSAqIEEgc29ydGVkIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgdGFyZ2V0dGVkIGJ5IHRoaXMgcXVlcnkuIFRoZSBsaXN0IGlzCi0JICogc29ydGVkIGZyb20gbGVhc3QgdG8gZ3JlYXRlc3QgYWNjb3JkaW5nIHRvIDxjb2RlPlN0aW5nLmNvbXBhcmU8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBhdHRyaWJ1dGVzOwotCi0JLyoqCi0JICogQ2FjaGVkIGhhc2ggY29kZSB2YWx1ZQotCSAqLwotCXByaXZhdGUgaW50IGhhc2hDb2RlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhbm5vdGF0aW9uIHF1ZXJ5IHdpdGggdGhlIGdpdmVuIHR5cGUgYW5kIGF0dHJpYnV0ZXMuCi0JICogPHA+Ci0JICogVGhlIHR5cGUgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LiBUaGUgYXR0cmlidXRlcyBtYXkgYmUgZW1wdHksIGJ1dAotCSAqIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb2JsZW1UeXBlCi0JICogICAgICAgICAgICB0aGUgdGFyZ2V0dGVkIGFubm90YXRpb24gdHlwZQotCSAqIEBwYXJhbSBtYXJrZXJBdHRyaWJ1dGVzCi0JICogICAgICAgICAgICB0aGUgdGFyZ2V0dGVkIGFubm90YXRpb24gYXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uUXVlcnkoU3RyaW5nIGFubm90YXRpb25UeXBlLCBTdHJpbmdbXSBhbm5vdGF0aW9uQXR0cmlidXRlcykgewotCQlpZiAoYW5ub3RhdGlvbkF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJdHlwZSA9IGFubm90YXRpb25UeXBlOwotCQlhdHRyaWJ1dGVzID0gYW5ub3RhdGlvbkF0dHJpYnV0ZXM7Ci0JCWNvbXB1dGVIYXNoQ29kZSgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIGEgcXVlcnkgYWdhaW5zdCB0aGUgZ2l2ZW4gYW5ub3RhdGlvbi4KLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGEgPGNvZGU+QW5ub3RhdGlvblF1ZXJ5UmVzdWx0PC9jb2RlPiBpZiB0aGUgbWFya2VyIGlzCi0JICogYXBwcm9wcmlhdGUgZm9yIHRoaXMgcXVlcnkgKGNvcnJlY3QgdHlwZSBhbmQgaGFzIGFsbCBvZiB0aGUgcXVlcnkKLQkgKiBhdHRyaWJ1dGVzKSwgb3RoZXJ3aXNlIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBhbm5vdGF0aW9uCi0JICogICAgICAgICAgICB0aGUgYW5ub3RhdGlvbiB0byBwZXJmb3JtIHRoZSBxdWVyeSBhZ2FpbnN0Ci0JICogQHJldHVybiBhIGFubm90YXRpb24gcXVlcnkgcmVzdWx0IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIEFubm90YXRpb25RdWVyeVJlc3VsdCBwZXJmb3JtUXVlcnkoQW5ub3RhdGlvbiBhbm5vKSB7Ci0JCWlmICghKGFubm8gaW5zdGFuY2VvZiBUZW1wb3JhcnlBbm5vdGF0aW9uKSkKLQkJCXJldHVybiBudWxsOwotCi0JCU1hcCBhbm5vQXR0cmlidXRlcyA9ICgoVGVtcG9yYXJ5QW5ub3RhdGlvbikgYW5ubykuZ2V0QXR0cmlidXRlcygpOwotCQkvLyBDaGVjayB0eXBlCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcm9ibGVtVHlwZSA9IChTdHJpbmcpIGFubm9BdHRyaWJ1dGVzLmdldCgicHJvYmxlbVR5cGUiKTsKLQkJCWlmICghdHlwZS5lcXVhbHMocHJvYmxlbVR5cGUpKQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1thdHRyaWJ1dGVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IHZhbHVlID0gYW5ub0F0dHJpYnV0ZXMuZ2V0KGF0dHJpYnV0ZXNbaV0pOwotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXZhbHVlc1tpXSA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0JCX0KLQkJLy8gQ3JlYXRlIGFuZCByZXR1cm4gdGhlIHJlc3VsdAotCQlyZXR1cm4gbmV3IEFubm90YXRpb25RdWVyeVJlc3VsdCh2YWx1ZXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gT2JqZWN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAoIShvIGluc3RhbmNlb2YgQW5ub3RhdGlvblF1ZXJ5KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKG8gPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlBbm5vdGF0aW9uUXVlcnkgbXEgPSAoQW5ub3RhdGlvblF1ZXJ5KSBvOwotCQlpZiAoISh0eXBlID09IG51bGwgPyBtcS50eXBlID09IG51bGwgOiB0eXBlLmVxdWFscyhtcS50eXBlKSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChhdHRyaWJ1dGVzLmxlbmd0aCAhPSBtcS5hdHRyaWJ1dGVzLmxlbmd0aCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIShhdHRyaWJ1dGVzW2ldLmVxdWFscyhtcS5hdHRyaWJ1dGVzW2ldKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIE9iamVjdC4KLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gaGFzaENvZGU7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGhhc2ggY29kZSBmb3IgdGhpcyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wdXRlSGFzaENvZGUoKSB7Ci0JCWhhc2hDb2RlID0gMTk7Ci0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJaGFzaENvZGUgPSBoYXNoQ29kZSAqIDM3ICsgdHlwZS5oYXNoQ29kZSgpOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQloYXNoQ29kZSA9IGhhc2hDb2RlICogMzcgKyBhdHRyaWJ1dGVzW2ldLmhhc2hDb2RlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXJnZXR0ZWQgbWFya2VyIHR5cGUuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRhcmdldHRlZCBtYXJrZXIgdHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGFyZ2V0dGVkIGF0dHJpYnV0ZXMuIFRoZSBhcnJheSBtYXkgYmUgZW1wdHkuCi0JICogCi0JICogQHJldHVybiB0aGUgdGFyZ2V0dGVkIGF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQW5ub3RhdGlvblF1ZXJ5UmVzdWx0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Bbm5vdGF0aW9uUXVlcnlSZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFkMTY3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Bbm5vdGF0aW9uUXVlcnlSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uOwotCi0vKgotICogQ29waWVkIGZyb20gcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUucmVnaXN0ci5NYXJrZXJRdWVyeVJlc3VsdAotICovCi1jbGFzcyBBbm5vdGF0aW9uUXVlcnlSZXN1bHQgewotCS8qKgotCSAqIEFuIG9yZGVyZWQgY29sbGVjdGlvbiBvZiBhbm5vdGF0aW9uIGF0dHJpYnV0ZSB2YWx1ZXMuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSB2YWx1ZXM7Ci0KLQkvKioKLQkgKiBDYWNoZWQgaGFzaCBjb2RlIHZhbHVlCi0JICovCi0JcHJpdmF0ZSBpbnQgaGFzaENvZGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFubm90YXRpb24gcXVlcnkgcmVzdWx0IHdpdGggdGhlIGdpdmVuIHZhbHVlcy4KLQkgKiA8cD4KLQkgKiBUaGUgdmFsdWVzIG1heSBub3QgYmUgZW1wdHkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhbm5vdGF0aW9uQXR0cmlidXRlVmFsdWVzCi0JICogICAgICAgICAgICB0aGUgdGFyZ2V0IGFubm90YXRpb24ncyBhdHRyaWJ1dGUgdmFsdWVzCi0JICovCi0JcHVibGljIEFubm90YXRpb25RdWVyeVJlc3VsdChTdHJpbmdbXSBhbm5vdGF0aW9uQXR0cmlidXRlVmFsdWVzKSB7Ci0JCWlmIChhbm5vdGF0aW9uQXR0cmlidXRlVmFsdWVzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQl2YWx1ZXMgPSBhbm5vdGF0aW9uQXR0cmlidXRlVmFsdWVzOwotCQljb21wdXRlSGFzaENvZGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIE9iamVjdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKCEobyBpbnN0YW5jZW9mIEFubm90YXRpb25RdWVyeVJlc3VsdCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChvID09IHRoaXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJQW5ub3RhdGlvblF1ZXJ5UmVzdWx0IG1xciA9IChBbm5vdGF0aW9uUXVlcnlSZXN1bHQpIG87Ci0JCWlmICh2YWx1ZXMubGVuZ3RoICE9IG1xci52YWx1ZXMubGVuZ3RoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCEodmFsdWVzW2ldLmVxdWFscyhtcXIudmFsdWVzW2ldKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIE9iamVjdC4KLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gaGFzaENvZGU7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGhhc2ggY29kZSBmb3IgdGhpcyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wdXRlSGFzaENvZGUoKSB7Ci0JCWhhc2hDb2RlID0gMTk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWhhc2hDb2RlID0gaGFzaENvZGUgKiAzNyArIHZhbHVlc1tpXS5oYXNoQ29kZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29tcG91bmRRdWlja0Fzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29tcG91bmRRdWlja0Fzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTQxMGQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0NvbXBvdW5kUXVpY2tBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5FeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIEEgcXVpY2sgYXNzaXN0IHByb2Nlc3NvciB0aGF0IHdpbGwgYWxsb3cgZm9yIG1vcmUgdGhhbiBvbmUgcXVpY2sgYXNzaXN0Ci0gKiBwcm9jZXNzb3IuIEl0IGluY2x1ZGVzIHF1aWNrIGFzc2lzdCBwcm9jZXNzb3JzIGNvbnRyaWJ1dGVkIHZpYSB0aGUKLSAqIHF1aWNrQXNzaXN0UHJvY2Vzc29yIGV4dGVuZGVkIGNvbmZpZ3VyYXRpb24gZXh0ZW5zaW9uIHBvaW50LiBJdCBhbHNvCi0gKiBpbmNsdWRlcyBxdWljayBhc3Npc3QgcHJvY2Vzc29ycyBjb250cmlidXRlZCB2aWEgdmFsaWRhdG9ycy4KLSAqLwotcHVibGljIGNsYXNzIENvbXBvdW5kUXVpY2tBc3Npc3RQcm9jZXNzb3IgaW1wbGVtZW50cyBJUXVpY2tBc3Npc3RQcm9jZXNzb3IgewotCXByaXZhdGUgZmluYWwgU3RyaW5nIFFVSUNLX0FTU0lTVF9QUk9DRVNTT1JfRVhURU5ERURfSUQgPSBJUXVpY2tBc3Npc3RQcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpOwotCXByaXZhdGUgTWFwIGZQcm9jZXNzb3JzOwotCXByaXZhdGUgSVF1aWNrQXNzaXN0UHJvY2Vzc29yIGZRdWlja0ZpeFByb2Nlc3NvcjsKLQkvKioKLQkgKiBsaXN0IG9mIHBhcnRpdGlvbiB0eXBlcyB3aGVyZSBleHRlbmRlZCBwcm9jZXNzb3JzIGhhdmUgYmVlbiBpbnN0YWxsZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgZkluc3RhbGxlZEV4dGVuZGVkQ29udGVudFR5cGVzOwotCi0JcHJpdmF0ZSBTZXQgZ2V0UXVpY2tBc3Npc3RQcm9jZXNzb3JzKFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCWlmIChmSW5zdGFsbGVkRXh0ZW5kZWRDb250ZW50VHlwZXMgPT0gbnVsbCB8fCAhZkluc3RhbGxlZEV4dGVuZGVkQ29udGVudFR5cGVzLmNvbnRhaW5zKHBhcnRpdGlvblR5cGUpKSB7Ci0JCQkvLyBnZXQgZXh0ZW5kZWQgcXVpY2sgYXNzaXN0IHByb2Nlc3NvcnMgdGhhdCBoYXZlIG5vdCBhbHJlYWR5Ci0JCQkvLyBiZWVuIHNldAotCQkJTGlzdCBwcm9jZXNzb3JzID0gRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpLmdldENvbmZpZ3VyYXRpb25zKFFVSUNLX0FTU0lTVF9QUk9DRVNTT1JfRVhURU5ERURfSUQsIHBhcnRpdGlvblR5cGUpOwotCQkJaWYgKHByb2Nlc3NvcnMgIT0gbnVsbCAmJiAhcHJvY2Vzc29ycy5pc0VtcHR5KCkpIHsKLQkJCQlJdGVyYXRvciBpdGVyID0gcHJvY2Vzc29ycy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlJUXVpY2tBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gKElRdWlja0Fzc2lzdFByb2Nlc3NvcikgaXRlci5uZXh0KCk7Ci0JCQkJCXNldFF1aWNrQXNzaXN0UHJvY2Vzc29yKHBhcnRpdGlvblR5cGUsIHByb2Nlc3Nvcik7Ci0JCQkJfQotCQkJfQotCQkJLy8gYWRkIHBhcnRpdGlvbiB0eXBlIHRvIGxpc3Qgb2YgZXh0ZW5kZWQgcGFydGl0aW9uIHR5cGVzCi0JCQkvLyBpbnN0YWxsZWQgKHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgYW55IGV4dGVuZGVkIGNvbnRlbnQKLQkJCS8vIGFzc2lzdCBwcm9jZXNzb3JzIHdlcmUgaW5zdGFsbGVkIGJlY2F1c2UgZG9udCB3YW50IHRvIGxvb2sgaXQKLQkJCS8vIHVwIGV2ZXJ5IHRpbWUpCi0JCQlpZiAoZkluc3RhbGxlZEV4dGVuZGVkQ29udGVudFR5cGVzID09IG51bGwpCi0JCQkJZkluc3RhbGxlZEV4dGVuZGVkQ29udGVudFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZkluc3RhbGxlZEV4dGVuZGVkQ29udGVudFR5cGVzLmFkZChwYXJ0aXRpb25UeXBlKTsKLQkJfQotCi0JCVNldCBwcm9jZXNzb3JzID0gbnVsbDsKLQkJaWYgKGZQcm9jZXNzb3JzICE9IG51bGwpCi0JCQlwcm9jZXNzb3JzID0gKFNldCkgZlByb2Nlc3NvcnMuZ2V0KHBhcnRpdGlvblR5cGUpOwotCi0JCXJldHVybiBwcm9jZXNzb3JzOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSBxdWljayBhc3Npc3QgcHJvY2Vzc29ycyByZWxldmFudCB0byB0aGUgcGFydGlvbiB3aGljaCBpcwotCSAqIGNhbGN1YXRlZCBmcm9tIHRoZSBnaXZlbiBkb2N1bWVudCBhbmQgb2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSBpbnZvY2F0aW9uQ29udGV4dAotCSAqIEByZXR1cm4gU2V0IG9mIHF1aWNrIGFzc2lzdCBwcm9jZXNzb3JzIG9yIG51bGwgaWYgbm9uZSBleGlzdAotCSAqLwotCXByaXZhdGUgU2V0IGdldFF1aWNrQXNzaXN0UHJvY2Vzc29ycyhJUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCkgewotCQlTZXQgcHJvY2Vzc3NvcnMgPSBudWxsOwotCi0JCUlTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyID0gaW52b2NhdGlvbkNvbnRleHQuZ2V0U291cmNlVmlld2VyKCk7Ci0JCWlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gc291cmNlVmlld2VyLmdldERvY3VtZW50KCk7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBwYXJ0aXRpb25UeXBlOwotCQkJCWlmIChkb2N1bWVudCAhPSBudWxsKQotCQkJCQlwYXJ0aXRpb25UeXBlID0gVGV4dFV0aWxpdGllcy5nZXRDb250ZW50VHlwZShkb2N1bWVudCwgSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORywgaW52b2NhdGlvbkNvbnRleHQuZ2V0T2Zmc2V0KCksIHRydWUpOwotCQkJCWVsc2UKLQkJCQkJcGFydGl0aW9uVHlwZSA9IElEb2N1bWVudC5ERUZBVUxUX0NPTlRFTlRfVFlQRTsKLQotCQkJCXByb2Nlc3Nzb3JzID0gZ2V0UXVpY2tBc3Npc3RQcm9jZXNzb3JzKHBhcnRpdGlvblR5cGUpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCB4LmdldE1lc3NhZ2UoKSwgeCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc3NvcnM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcXVpY2sgYXNzaXN0IHByb2Nlc3NvciBmb3IgdmFsaWRhdG9yIGNvbnRyaWJ1dGVkIHF1aWNrIGZpeGVzCi0JICogCi0JICogQHJldHVybiBJUXVpY2tBc3Npc3RQcm9jZXNzb3IKLQkgKi8KLQlwcml2YXRlIElRdWlja0Fzc2lzdFByb2Nlc3NvciBnZXRRdWlja0ZpeFByb2Nlc3NvcigpIHsKLQkJaWYgKGZRdWlja0ZpeFByb2Nlc3NvciA9PSBudWxsKQotCQkJZlF1aWNrRml4UHJvY2Vzc29yID0gbmV3IFNvdXJjZVZhbGlkYXRpb25RdWlja0Fzc2lzdFByb2Nlc3NvcigpOwotCi0JCXJldHVybiBmUXVpY2tGaXhQcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogQXNzb2NpYXRlcyBhIHF1aWNrIGFzc2lzdCBwcm9jZXNzb3IgdG8gYSBwYXJ0aXRpb24gdHlwZSBhbmQgYWRkcyBpdCB0bwotCSAqIHRoZSBsaXN0IG9mIHByb2Nlc3NvcnMgaW4gdGhpcyBjb21wb3VuZCBwcm9jZXNzb3IuCi0JICogCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGUKLQkgKiBAcGFyYW0gcHJvY2Vzc29yCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFF1aWNrQXNzaXN0UHJvY2Vzc29yKFN0cmluZyBwYXJ0aXRpb25UeXBlLCBJUXVpY2tBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yKSB7Ci0JCWlmIChmUHJvY2Vzc29ycyA9PSBudWxsKQotCQkJZlByb2Nlc3NvcnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCVNldCBwcm9jZXNzb3JzID0gKFNldCkgZlByb2Nlc3NvcnMuZ2V0KHBhcnRpdGlvblR5cGUpOwotCi0JCWlmIChwcm9jZXNzb3IgPT0gbnVsbCAmJiBwcm9jZXNzb3JzICE9IG51bGwpIHsKLQkJCS8vIHJlbW92aW5nIHF1aWNrIGFzc2lzdCBwcm9jZXNzb3IgZm9yIHRoaXMgcGFydGl0aW9uIHR5cGUKLQkJCXByb2Nlc3NvcnMuY2xlYXIoKTsKLQkJCS8vIGNoZWNrIGlmIGl0J3MgdGhlIG9ubHkKLQkJCWZQcm9jZXNzb3JzLnJlbW92ZShwYXJ0aXRpb25UeXBlKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChwcm9jZXNzb3JzID09IG51bGwpIHsKLQkJCQlwcm9jZXNzb3JzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLQkJCX0KLQkJCXByb2Nlc3NvcnMuYWRkKHByb2Nlc3Nvcik7Ci0JCQlmUHJvY2Vzc29ycy5wdXQocGFydGl0aW9uVHlwZSwgcHJvY2Vzc29ycyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5Bc3Npc3QoSVF1aWNrQXNzaXN0SW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQpIHsKLQkJU2V0IHByb2Nlc3NvcnMgPSBnZXRRdWlja0Fzc2lzdFByb2Nlc3NvcnMoaW52b2NhdGlvbkNvbnRleHQpOwotCQlpZiAocHJvY2Vzc29ycyAhPSBudWxsKSB7Ci0JCQkvLyBpdGVyYXRlIHRocm91Z2ggbGlzdCBvZiBwcm9jZXNzb3JzIHVudGlsIG9uZSBwcm9jZXNzb3Igc2F5cwotCQkJLy8gY2FuQXNzaXN0Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvY2Vzc29ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJSVF1aWNrQXNzaXN0UHJvY2Vzc29yIHAgPSAoSVF1aWNrQXNzaXN0UHJvY2Vzc29yKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKHAuY2FuQXNzaXN0KGludm9jYXRpb25Db250ZXh0KSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZpeChBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJLy8gb25seSBxdWljayBmaXggcHJvY2Vzc29yIGNvbnRyaWJ1dGVzIGZpeGVzIHNvIGp1c3QgY2hlY2sgaXQKLQkJSVF1aWNrQXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IGdldFF1aWNrRml4UHJvY2Vzc29yKCk7Ci0JCXJldHVybiBwcm9jZXNzb3IuY2FuRml4KGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZVF1aWNrQXNzaXN0UHJvcG9zYWxzKElRdWlja0Fzc2lzdEludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0KSB7Ci0JCUxpc3QgcHJvcG9zYWxzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBmaXJzdCBnZXQgbGlzdCBvZiBmaXhlcwotCQlJUXVpY2tBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gZ2V0UXVpY2tGaXhQcm9jZXNzb3IoKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IHByb2Nlc3Nvci5jb21wdXRlUXVpY2tBc3Npc3RQcm9wb3NhbHMoaW52b2NhdGlvbkNvbnRleHQpOwotCQlpZiAocHJvcG9zYWxzICE9IG51bGwgJiYgcHJvcG9zYWxzLmxlbmd0aCA+IDApIHsKLQkJCXByb3Bvc2Fsc0xpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QocHJvcG9zYWxzKSk7Ci0JCX0KLQotCQkvLyBubyBmaXhlcywgc28gdHJ5IGFkZGluZyBhc3Npc3RzCi0JCWlmIChwcm9wb3NhbHNMaXN0LmlzRW1wdHkoKSkgewotCQkJU2V0IHByb2Nlc3NvcnMgPSBnZXRRdWlja0Fzc2lzdFByb2Nlc3NvcnMoaW52b2NhdGlvbkNvbnRleHQpOwotCQkJaWYgKHByb2Nlc3NvcnMgIT0gbnVsbCkgewotCQkJCS8vIGl0ZXJhdGUgdGhyb3VnaCBsaXN0IG9mIHByb2Nlc3NvcnMgdW50aWwgb25lIHByb2Nlc3NvciBzYXlzCi0JCQkJLy8gY2FuQXNzaXN0Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IHByb2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlJUXVpY2tBc3Npc3RQcm9jZXNzb3IgYXNzaXN0UHJvY2Vzc29yID0gKElRdWlja0Fzc2lzdFByb2Nlc3NvcikgaXQubmV4dCgpOwotCQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gYXNzaXN0UHJvcG9zYWxzID0gYXNzaXN0UHJvY2Vzc29yLmNvbXB1dGVRdWlja0Fzc2lzdFByb3Bvc2FscyhpbnZvY2F0aW9uQ29udGV4dCk7Ci0JCQkJCWlmIChhc3Npc3RQcm9wb3NhbHMgIT0gbnVsbCAmJiBhc3Npc3RQcm9wb3NhbHMubGVuZ3RoID4gMCkgewotCQkJCQkJcHJvcG9zYWxzTGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChhc3Npc3RQcm9wb3NhbHMpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEphdmEgZWRpdG9yIGN1cnJlbnRseSByZXR1cm5zIGEgbm8gbW9kaWZpY2F0aW9uIGNvbXBsZXRpb24gcHJvcG9zYWwKLQkJICogYnV0IGl0IHNlZW1zIGJldHRlciB0byBqdXN0IHJldHVybiBudWxsIHNvIHVzZXIgZG9lcyBub3QgZ2V0Ci0JCSAqIGFubm95aW5nIHByb3Bvc2FsIHBvcHVwCi0JCSAqLwotCQlpZiAocHJvcG9zYWxzTGlzdC5pc0VtcHR5KCkpIHsKLQkJCS8vIHByb3Bvc2Fsc0xpc3QuYWRkKG5ldyBOb01vZGlmaWNhdGlvbkNvbXBsZXRpb25Qcm9wb3NhbCgpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIHByb3Bvc2Fsc0xpc3QudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtwcm9wb3NhbHNMaXN0LnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQkvLyBuZXZlciBoYXZlIGVycm9yIG1lc3NhZ2VzCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29udHJpYnV0ZWRQcm9jZXNzb3JEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db250cmlidXRlZFByb2Nlc3NvckRlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTcyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db250cmlidXRlZFByb2Nlc3NvckRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBzaW5jZSAyLjAgUkMwIFVzZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RQcm9jZXNzb3I7Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb250cmlidXRlZFByb2Nlc3NvckRlc2NyaXB0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZDb25maWd1cmF0aW9uRWxlbWVudDsKLQlwcml2YXRlIE9iamVjdCBmUHJvY2Vzc29ySW5zdGFuY2U7Ci0KLQlwdWJsaWMgQ29udHJpYnV0ZWRQcm9jZXNzb3JEZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWZDb25maWd1cmF0aW9uRWxlbWVudCA9IGVsZW1lbnQ7Ci0JCWZQcm9jZXNzb3JJbnN0YW5jZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9jZXNzb3IoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmUHJvY2Vzc29ySW5zdGFuY2UgPT0gbnVsbCAmJiBmQ29uZmlndXJhdGlvbkVsZW1lbnQgIT0gbnVsbCkgewotCQkJZlByb2Nlc3Nvckluc3RhbmNlID0gZkNvbmZpZ3VyYXRpb25FbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQ0xBU1MpOwotCQl9Ci0JCXJldHVybiBmUHJvY2Vzc29ySW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA0NDkzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLQotLyoqCi0gKiBQcm92aWRlcyB0aGUgYXBwcm9wcmlhdGUgY29ycmVjdGlvbiBhc3Npc3RhbnQgZm9yIGEgZ2l2ZW4gc291cmNlIHZpZXdlci4KLSAqIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgYSBwbGFjZWhvbGRlciB1bnRpbCB0aGUgYmFzZSBpbXBsZW1lbnRzIGEgY29tbW9uCi0gKiB3YXkgZm9yIHF1aWNrZml4L3F1aWNrIGFzc2lzdC4KLSAqIAotICogQGRlcHJlY2F0ZWQgc2luY2UgMi4wIFJDMCBVc2UKLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucXVpY2thc3Npc3QuSVF1aWNrQXNzaXN0UHJvY2Vzc29yOwotICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb3JyZWN0aW9uIGFzc2lzdGFudCBmb3IgdGhlIGdpdmVuIHNvdXJjZXZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlVmlld2VyCi0JICogQHJldHVybgotCSAqLwotCWFic3RyYWN0IHB1YmxpYyBJQ29udGVudEFzc2lzdGFudCBnZXRDb3JyZWN0aW9uQXNzaXN0YW50KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0lRdWlja0Fzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vSVF1aWNrQXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MjAyMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vSVF1aWNrQXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBzaW5jZSAyLjAgUkMwIFVzZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RQcm9jZXNzb3I7Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVF1aWNrQXNzaXN0UHJvY2Vzc29yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb2Nlc3NvciBjYW4gYXNzaXN0IGF0IHRoZSBnaXZlbiBvZmZzZXQuIFRoaXMgdGVzdAotCSAqIHNob3VsZCBiZSBhbiBvcHRpbWlzdGljIGd1ZXNzIGFuZCBiZSBleHRyZW1seSBjaGVhcC4KLQkgKi8KLQlib29sZWFuIGNhbkFzc2lzdChTdHJ1Y3R1cmVkVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpOwotCi0JLyoqCi0JICogQ29sbGVjdHMgcHJvcG9zYWxzIGZvciBhc3Npc3RhbnQgYXQgdGhlIGdpdmVuIG9mZnNldC4KLQkgKi8KLQlJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0UHJvcG9zYWxzKFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9JUXVpY2tGaXhQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0lRdWlja0ZpeFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTNkMjFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0lRdWlja0ZpeFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHNpbmNlIDIuMCBSQzAgVXNlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLSAqLwotcHVibGljIGludGVyZmFjZSBJUXVpY2tGaXhQcm9jZXNzb3IgewotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvY2Vzc29yIGNhbiBmaXggdGhlIGdpdmVuIHByb2JsZW0uIFRoaXMgdGVzdAotCSAqIHNob3VsZCBiZSBhbiBvcHRpbWlzdGljIGd1ZXNzIGFuZCBiZSBleHRyZW1seSBjaGVhcC4KLQkgKi8KLQlib29sZWFuIGNhbkZpeChBbm5vdGF0aW9uIGFubm5vdGF0aW9uKTsKLQotCS8qKgotCSAqIENvbGxlY3RzIHByb3Bvc2FscyBmb3IgZml4aW5nIHRoZSBnaXZlbiBwcm9ibGVtLgotCSAqLwotCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRQcm9wb3NhbHMoQW5ub3RhdGlvbiBhbm5ub3RhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Ob01vZGlmaWNhdGlvbkNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vTm9Nb2RpZmljYXRpb25Db21wbGV0aW9uUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFiYjFhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Ob01vZGlmaWNhdGlvbkNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgTm9Nb2RpZmljYXRpb25Db21wbGV0aW9uUHJvcG9zYWwgaW1wbGVtZW50cyBJQ29tcGxldGlvblByb3Bvc2FsIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0Q29udGV4dEluZm9ybWF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbiBnZXRDb250ZXh0SW5mb3JtYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0RGlzcGxheVN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5Ob01vZGlmaWNhdGlvbkNvbXBsZXRpb25Qcm9wb3NhbF8wOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRJbWFnZSgpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1F1aWNrRml4UmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1F1aWNrRml4UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwY2JkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9RdWlja0ZpeFJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgUXVpY2tGaXhSZWdpc3RyeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgUXVpY2tGaXhSZWdpc3RyeSBpbnN0YW5jZTsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFF1aWNrRml4UmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBRdWlja0ZpeFJlZ2lzdHJ5KCk7Ci0JCQluZXcgUXVpY2tGaXhSZWdpc3RyeVJlYWRlcigpLmFkZEhlbHAoaW5zdGFuY2UpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBUYWJsZSBvZiBxdWVyaWVzIGZvciBtYXJrZXIgcmVzb2x1dGlvbnMKLQkgKi8KLQlwcml2YXRlIE1hcCByZXNvbHV0aW9uUXVlcmllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JLyoqCi0JICogUmVzb2x1dGlvbiBjbGFzcyBhdHRyaWJ1dGUgbmFtZSBpbiBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQWRkcyBhIHJlc29sdXRpb24gcXVlcnkgdG8gdGhlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBxdWVyeQotCSAqICAgICAgICAgICAgYSBtYXJrZXIgcXVlcnkKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICogICAgICAgICAgICBhIHJlc3VsdCBmb3IgdGhlIGdpdmVuIHF1ZXJ5Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgZGVmaW5pbmcgdGhlIHJlc3VsdAotCSAqLwotCXZvaWQgYWRkUmVzb2x1dGlvblF1ZXJ5KEFubm90YXRpb25RdWVyeSBxdWVyeSwgQW5ub3RhdGlvblF1ZXJ5UmVzdWx0IHJlc3VsdCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQotCQlhZGRRdWVyeShyZXNvbHV0aW9uUXVlcmllcywgcXVlcnksIHJlc3VsdCwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHF1ZXJ5IHRvIHRoZSBnaXZlbiB0YWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGFibGUKLQkgKiAgICAgICAgICAgIHRoZSB0YWJsZSB0byB3aGljaCB0aGUgcXVlcnkgaXMgYWRkZWQKLQkgKiBAcGFyYW0gcXVlcnkKLQkgKiAgICAgICAgICAgIGEgbWFya2VyIHF1ZXJ5Ci0JICogQHBhcmFtIHJlc3VsdAotCSAqICAgICAgICAgICAgYSByZXN1bHQgZm9yIHRoZSBnaXZlbiBxdWVyeQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGRlZmluaW5nIHRoZSByZXN1bHQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkUXVlcnkoTWFwIHRhYmxlLCBBbm5vdGF0aW9uUXVlcnkgcXVlcnksIEFubm90YXRpb25RdWVyeVJlc3VsdCByZXN1bHQsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0KLQkJLy8gU2VlIGlmIHRoZSBxdWVyeSBpcyBhbHJlYWR5IGluIHRoZSB0YWJsZQotCQlNYXAgcmVzdWx0cyA9IChNYXApIHRhYmxlLmdldChxdWVyeSk7Ci0JCWlmIChyZXN1bHRzID09IG51bGwpIHsKLQkJCS8vIENyZWF0ZSBhIG5ldyByZXN1bHRzIHRhYmxlCi0JCQlyZXN1bHRzID0gbmV3IEhhc2hNYXAoKTsKLQotCQkJLy8gQWRkIHRoZSBxdWVyeSB0byB0aGUgdGFibGUKLQkJCXRhYmxlLnB1dChxdWVyeSwgcmVzdWx0cyk7Ci0JCX0KLQotCQlpZiAocmVzdWx0cy5jb250YWluc0tleShyZXN1bHQpKSB7Ci0JCQlDb2xsZWN0aW9uIGN1cnJlbnRFbGVtZW50cyA9IChDb2xsZWN0aW9uKSByZXN1bHRzLmdldChyZXN1bHQpOwotCQkJY3VycmVudEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCUNvbGxlY3Rpb24gZWxlbWVudHMgPSBuZXcgSGFzaFNldCgpOwotCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCi0JCQkvLyBBZGQgdGhlIG5ldyByZXN1bHQKLQkJCXJlc3VsdHMucHV0KHJlc3VsdCwgZWxlbWVudHMpOwotCQl9Ci0JfQotCi0JcHVibGljIElRdWlja0Fzc2lzdFByb2Nlc3NvcltdIGdldFF1aWNrRml4UHJvY2Vzc29ycyhBbm5vdGF0aW9uIGFubm8pIHsKLQkJLy8gQ29sbGVjdCBhbGwgbWF0Y2hlcwotCQlBcnJheUxpc3QgcHJvY2Vzc29ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb2x1dGlvblF1ZXJpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBbm5vdGF0aW9uUXVlcnkgcXVlcnkgPSAoQW5ub3RhdGlvblF1ZXJ5KSBpdGVyLm5leHQoKTsKLQkJCUFubm90YXRpb25RdWVyeVJlc3VsdCByZXN1bHQgPSBxdWVyeS5wZXJmb3JtUXVlcnkoYW5ubyk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQkvLyBTZWUgaWYgYSBtYXRjaGluZyByZXN1bHQgaXMgcmVnaXN0ZXJlZAotCQkJCU1hcCByZXN1bHRzVGFibGUgPSAoTWFwKSByZXNvbHV0aW9uUXVlcmllcy5nZXQocXVlcnkpOwotCi0JCQkJaWYgKHJlc3VsdHNUYWJsZS5jb250YWluc0tleShyZXN1bHQpKSB7Ci0KLQkJCQkJSXRlcmF0b3IgZWxlbWVudHMgPSAoKENvbGxlY3Rpb24pIHJlc3VsdHNUYWJsZS5nZXQocmVzdWx0KSkuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGVsZW1lbnRzLmhhc05leHQoKSkgewotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBlbGVtZW50cy5uZXh0KCk7Ci0KLQkJCQkJCUlRdWlja0Fzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlwcm9jZXNzb3IgPSAoSVF1aWNrQXNzaXN0UHJvY2Vzc29yKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0NMQVNTKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJCWlmIChwcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJCQkJCXByb2Nlc3NvcnMuYWRkKHByb2Nlc3Nvcik7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKElRdWlja0Fzc2lzdFByb2Nlc3NvcltdKSBwcm9jZXNzb3JzLnRvQXJyYXkobmV3IElRdWlja0Fzc2lzdFByb2Nlc3Nvcltwcm9jZXNzb3JzLnNpemUoKV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1F1aWNrRml4UmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1F1aWNrRml4UmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM0MWJkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9RdWlja0ZpeFJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb24uUmVnaXN0cnlSZWFkZXI7Ci0KLXB1YmxpYyBjbGFzcyBRdWlja0ZpeFJlZ2lzdHJ5UmVhZGVyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUlDS0ZJWFBST0NFU1NPUiA9ICJxdWlja0ZpeFByb2Nlc3NvciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BST0JMRU1UWVBFID0gInByb2JsZW1UeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURSA9ICJhdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9WQUxVRSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQXJyYXlMaXN0IGN1cnJlbnRBdHRyaWJ1dGVOYW1lczsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGN1cnJlbnRBdHRyaWJ1dGVWYWx1ZXM7Ci0KLQlwcml2YXRlIFF1aWNrRml4UmVnaXN0cnkgcXVpY2tGaXhQcm9jZXNzb3JSZWdpc3RyeTsKLQotCXByb3RlY3RlZCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoUVVJQ0tGSVhQUk9DRVNTT1IpKSB7Ci0JCQlyZWFkUXVpY2tGaXhQcm9jZXNzb3JFbGVtZW50KGVsZW1lbnQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhBVFRSSUJVVEUpKSB7Ci0JCQlyZWFkQXR0cmlidXRlRWxlbWVudChlbGVtZW50KTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzZXMgYSByZXNvbHV0aW9uIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVhZFF1aWNrRml4UHJvY2Vzc29yRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkvLyByZWFkIHR5cGUKLQkJU3RyaW5nIHR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUFJPQkxFTVRZUEUpOwotCi0JCS8vIHJlYWQgYXR0cmlidXRlcyBhbmQgdmFsdWVzCi0JCWN1cnJlbnRBdHRyaWJ1dGVOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJY3VycmVudEF0dHJpYnV0ZVZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVhZEVsZW1lbnRDaGlsZHJlbihlbGVtZW50KTsKLQkJU3RyaW5nW10gYXR0cmlidXRlTmFtZXMgPSAoU3RyaW5nW10pIGN1cnJlbnRBdHRyaWJ1dGVOYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbY3VycmVudEF0dHJpYnV0ZU5hbWVzLnNpemUoKV0pOwotCQlTdHJpbmdbXSBhdHRyaWJ1dGVWYWx1ZXMgPSAoU3RyaW5nW10pIGN1cnJlbnRBdHRyaWJ1dGVWYWx1ZXMudG9BcnJheShuZXcgU3RyaW5nW2N1cnJlbnRBdHRyaWJ1dGVWYWx1ZXMuc2l6ZSgpXSk7Ci0KLQkJLy8gYWRkIHF1ZXJ5IHRvIHRoZSByZWdpc3RyeQotCQlBbm5vdGF0aW9uUXVlcnkgcXVlcnkgPSBuZXcgQW5ub3RhdGlvblF1ZXJ5KHR5cGUsIGF0dHJpYnV0ZU5hbWVzKTsKLQkJQW5ub3RhdGlvblF1ZXJ5UmVzdWx0IHJlc3VsdCA9IG5ldyBBbm5vdGF0aW9uUXVlcnlSZXN1bHQoYXR0cmlidXRlVmFsdWVzKTsKLQkJcXVpY2tGaXhQcm9jZXNzb3JSZWdpc3RyeS5hZGRSZXNvbHV0aW9uUXVlcnkocXVlcnksIHJlc3VsdCwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBtYXJrZXIgaGVscCB0aGF0IGlzIGRlZmluZWQgaW4gdGhlIHBsdWdpbiByZWdpc3RyeSBhbmQgYWRkIGl0Ci0JICogdG8gdGhlIGdpdmVuIG1hcmtlciBoZWxwIHJlZ2lzdHJ5LgotCSAqIDxwPgotCSAqIFdhcm5pbmc6IFRoZSBtYXJrZXIgaGVscCByZWdpc3RyeSBtdXN0IGJlIHBhc3NlZCBpbiBiZWNhdXNlIHRoaXMgbWV0aG9kCi0JICogaXMgY2FsbGVkIGR1cmluZyB0aGUgcHJvY2VzcyBvZiBzZXR0aW5nIHVwIHRoZSBtYXJrZXIgaGVscCByZWdpc3RyeSBhbmQKLQkgKiBhdCB0aGlzIHRpbWUgaXQgaGFzIG5vdCBiZWVuIHNhZmVseSBzZXR1cCB3aXRoIHRoZSBwbHVnaW4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEhlbHAoUXVpY2tGaXhSZWdpc3RyeSByZWdpc3RyeSkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlxdWlja0ZpeFByb2Nlc3NvclJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCXJlYWRSZWdpc3RyeShleHRlbnNpb25SZWdpc3RyeSwgU1NFVUlQbHVnaW4uSUQsIFFVSUNLRklYUFJPQ0VTU09SKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzZXMgYW4gYXR0cmlidXRlIHN1YiBlbGVtZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCByZWFkQXR0cmlidXRlRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FKTsKLQkJU3RyaW5nIHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1ZBTFVFKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7Ci0JCQljdXJyZW50QXR0cmlidXRlTmFtZXMuYWRkKG5hbWUpOwotCQkJY3VycmVudEF0dHJpYnV0ZVZhbHVlcy5hZGQodmFsdWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vU291cmNlVmFsaWRhdGlvblF1aWNrQXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Tb3VyY2VWYWxpZGF0aW9uUXVpY2tBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAzM2ZkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Tb3VyY2VWYWxpZGF0aW9uUXVpY2tBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0ZpeGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsRXh0ZW5zaW9uMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5UZW1wb3JhcnlBbm5vdGF0aW9uOwotCi0vKioKLSAqIFRoaXMgcXVpY2sgYXNzaXN0IHByb2Nlc3NvciB3aWxsIHByb3ZpZGUgcXVpY2sgZml4ZXMgZm9yIHNvdXJjZSB2YWxpZGF0aW9uCi0gKiBlcnJvcnMgKFRlbXBvcmFyeSBBbm5vdGF0aW9uKQotICovCi1wdWJsaWMgY2xhc3MgU291cmNlVmFsaWRhdGlvblF1aWNrQXNzaXN0UHJvY2Vzc29yIGltcGxlbWVudHMgSVF1aWNrQXNzaXN0UHJvY2Vzc29yIHsKLQlwdWJsaWMgYm9vbGVhbiBjYW5Bc3Npc3QoSVF1aWNrQXNzaXN0SW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZpeChBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBJUXVpY2tGaXhhYmxlQW5ub3RhdGlvbikgewotCQkJaWYgKCgoSVF1aWNrRml4YWJsZUFubm90YXRpb24pIGFubm90YXRpb24pLmlzUXVpY2tGaXhhYmxlU3RhdGVTZXQoKSkgewotCQkJCXJldHVybiAoKElRdWlja0ZpeGFibGVBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKS5pc1F1aWNrRml4YWJsZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVRdWlja0Fzc2lzdFByb3Bvc2FscyhJUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBxdWlja0Fzc2lzdENvbnRleHQpIHsKLQkJSVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBxdWlja0Fzc2lzdENvbnRleHQuZ2V0U291cmNlVmlld2VyKCk7Ci0JCWludCBkb2N1bWVudE9mZnNldCA9IHF1aWNrQXNzaXN0Q29udGV4dC5nZXRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aCA9IHZpZXdlciAhPSBudWxsID8gdmlld2VyLmdldFNlbGVjdGVkUmFuZ2UoKS55IDogMDsKLQotCQlJQW5ub3RhdGlvbk1vZGVsIG1vZGVsID0gdmlld2VyLmdldEFubm90YXRpb25Nb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUxpc3QgYWxsUHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJQW5ub3RhdGlvbk1vZGVsRXh0ZW5zaW9uMikgewotCQkJSXRlcmF0b3IgaXRlciA9ICgoSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbjIpIG1vZGVsKS5nZXRBbm5vdGF0aW9uSXRlcmF0b3IoZG9jdW1lbnRPZmZzZXQsIGxlbmd0aCwgdHJ1ZSwgdHJ1ZSk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlMaXN0IHByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJQW5ub3RhdGlvbiBhbm5vID0gKEFubm90YXRpb24pIGl0ZXIubmV4dCgpOwotCQkJCWlmIChjYW5GaXgoYW5ubykpIHsKLQkJCQkJLy8gZmlyc3QgY2hlY2sgdG8gc2VlIGlmIGFubm90YXRpb24gYWxyZWFkeSBoYXMgYSBxdWljawotCQkJCQkvLyBmaXggcHJvY2Vzc29yIGF0dGFjaGVkIHRvIGl0Ci0JCQkJCWlmIChhbm5vIGluc3RhbmNlb2YgVGVtcG9yYXJ5QW5ub3RhdGlvbikgewotCQkJCQkJT2JqZWN0IG8gPSAoKFRlbXBvcmFyeUFubm90YXRpb24pIGFubm8pLmdldEFkZGl0aW9uYWxGaXhJbmZvKCk7Ci0JCQkJCQlpZiAobyBpbnN0YW5jZW9mIElRdWlja0Fzc2lzdFByb2Nlc3NvcikgewotCQkJCQkJCXByb2Nlc3NvcnMuYWRkKG8pOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy8gZ2V0IGFsbCByZWxldmFudCBxdWljayBmaXhlcyBmb3IgdGhpcyBhbm5vdGF0aW9uCi0JCQkJCVF1aWNrRml4UmVnaXN0cnkgcmVnaXN0cnkgPSBRdWlja0ZpeFJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCQkJCXByb2Nlc3NvcnMuYWRkQWxsKEFycmF5cy5hc0xpc3QocmVnaXN0cnkuZ2V0UXVpY2tGaXhQcm9jZXNzb3JzKGFubm8pKSk7Ci0KLQkJCQkJLy8gc2V0IHVwIGNvbnRleHQKLQkJCQkJTWFwIGF0dHJpYnV0ZXMgPSBudWxsOwotCQkJCQlpZiAoYW5ubyBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pIHsKLQkJCQkJCWF0dHJpYnV0ZXMgPSAoKFRlbXBvcmFyeUFubm90YXRpb24pIGFubm8pLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJfQotCQkJCQlQb3NpdGlvbiBwb3MgPSBtb2RlbC5nZXRQb3NpdGlvbihhbm5vKTsKLQkJCQkJU3RydWN0dXJlZFRleHRJbnZvY2F0aW9uQ29udGV4dCBzc2VDb250ZXh0ID0gbmV3IFN0cnVjdHVyZWRUZXh0SW52b2NhdGlvbkNvbnRleHQodmlld2VyLCBwb3MuZ2V0T2Zmc2V0KCksIHBvcy5nZXRMZW5ndGgoKSwgYXR0cmlidXRlcyk7Ci0KLQkJCQkJLy8gY2FsbCBlYWNoIHByb2Nlc3NvcgotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2Nlc3NvcnMuc2l6ZSgpOyArK2kpIHsKLQkJCQkJCUxpc3QgcHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJY29sbGVjdFByb3Bvc2FscygoSVF1aWNrQXNzaXN0UHJvY2Vzc29yKSBwcm9jZXNzb3JzLmdldChpKSwgYW5ubywgc3NlQ29udGV4dCwgcHJvcG9zYWxzKTsKLQotCQkJCQkJaWYgKHByb3Bvc2Fscy5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJYWxsUHJvcG9zYWxzLmFkZEFsbChwcm9wb3NhbHMpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYWxsUHJvcG9zYWxzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBhbGxQcm9wb3NhbHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFthbGxQcm9wb3NhbHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RQcm9wb3NhbHMoSVF1aWNrQXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBJUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCwgTGlzdCBwcm9wb3NhbHNMaXN0KSB7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuY29tcHV0ZVF1aWNrQXNzaXN0UHJvcG9zYWxzKGludm9jYXRpb25Db250ZXh0KTsKLQkJaWYgKHByb3Bvc2FscyAhPSBudWxsICYmIHByb3Bvc2Fscy5sZW5ndGggPiAwKSB7Ci0JCQlwcm9wb3NhbHNMaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KHByb3Bvc2FscykpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9TdHJ1Y3R1cmVkQ29ycmVjdGlvblByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vU3RydWN0dXJlZENvcnJlY3Rpb25Qcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE5NDI3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9TdHJ1Y3R1cmVkQ29ycmVjdGlvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBzaW5jZSAyLjAgUkMwIFVzZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RQcm9jZXNzb3I7Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQ29ycmVjdGlvblByb2Nlc3NvciBpbXBsZW1lbnRzIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQlwcm90ZWN0ZWQgSUFubm90YXRpb25Nb2RlbCBmQW5ub3RhdGlvbk1vZGVsOwotCXByb3RlY3RlZCBJUXVpY2tBc3Npc3RQcm9jZXNzb3IgZlF1aWNrQXNzaXN0UHJvY2Vzc29yOwotCXByb3RlY3RlZCBJUXVpY2tGaXhQcm9jZXNzb3IgZlF1aWNrRml4UHJvY2Vzc29yOwotCi0JcHVibGljIFN0cnVjdHVyZWRDb3JyZWN0aW9uUHJvY2Vzc29yKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWZBbm5vdGF0aW9uTW9kZWwgPSBzb3VyY2VWaWV3ZXIuZ2V0QW5ub3RhdGlvbk1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUXVpY2tBc3Npc3RQcm9wb3NhbHMoU3RydWN0dXJlZFRleHRWaWV3ZXIgdmlld2VyLCBBcnJheUxpc3QgcHJvcG9zYWxzLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJdHJ5IHsKLQkJCUlRdWlja0Fzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IgPSBnZXRRdWlja0Fzc2lzdFByb2Nlc3NvcigpOwotCQkJaWYgKHByb2Nlc3NvciAhPSBudWxsICYmIHByb2Nlc3Nvci5jYW5Bc3Npc3Qodmlld2VyLCBkb2N1bWVudE9mZnNldCkpIHsKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcmVzID0gcHJvY2Vzc29yLmdldFByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KTsKLQkJCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCByZXMubGVuZ3RoOyBrKyspIHsKLQkJCQkJCXByb3Bvc2Fscy5hZGQocmVzW2tdKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUXVpY2tGaXhQcm9wb3NhbHMoU3RydWN0dXJlZFRleHRWaWV3ZXIgdmlld2VyLCBBcnJheUxpc3QgcHJvcG9zYWxzLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJSXRlcmF0b3IgaXRlciA9IGZBbm5vdGF0aW9uTW9kZWwuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEFubm90YXRpb24pIGl0ZXIubmV4dCgpOwotCQkJUG9zaXRpb24gcG9zID0gZkFubm90YXRpb25Nb2RlbC5nZXRQb3NpdGlvbihhbm5vdGF0aW9uKTsKLQkJCWlmIChwb3MgIT0gbnVsbCAmJiBkb2N1bWVudE9mZnNldCA+PSBwb3Mub2Zmc2V0ICYmIGRvY3VtZW50T2Zmc2V0IDw9IHBvcy5vZmZzZXQgKyBwb3MubGVuZ3RoKSB7Ci0JCQkJSVF1aWNrRml4UHJvY2Vzc29yIHByb2Nlc3NvciA9IGdldFF1aWNrRml4UHJvY2Vzc29yKCk7Ci0JCQkJaWYgKHByb2Nlc3NvciAhPSBudWxsICYmIHByb2Nlc3Nvci5jYW5GaXgoYW5ub3RhdGlvbikpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSByZXMgPSBwcm9jZXNzb3IuZ2V0UHJvcG9zYWxzKGFubm90YXRpb24pOwotCQkJCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCByZXMubGVuZ3RoOyBrKyspIHsKLQkJCQkJCQkJcHJvcG9zYWxzLmFkZChyZXNba10pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCUFycmF5TGlzdCBwcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB7Ci0JCQlhZGRRdWlja0ZpeFByb3Bvc2FscygoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlciwgcHJvcG9zYWxzLCBkb2N1bWVudE9mZnNldCk7Ci0KLQkJCWlmIChwcm9wb3NhbHMuaXNFbXB0eSgpKSB7Ci0JCQkJYWRkUXVpY2tBc3Npc3RQcm9wb3NhbHMoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIsIHByb3Bvc2FscywgZG9jdW1lbnRPZmZzZXQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3Bvc2Fscy5pc0VtcHR5KCkpCi0JCQlwcm9wb3NhbHMuYWRkKG5ldyBOb01vZGlmaWNhdGlvbkNvbXBsZXRpb25Qcm9wb3NhbCgpKTsKLQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgcHJvcG9zYWxzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxzLnNpemUoKV0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2NvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbltdIGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldEVycm9yTWVzc2FnZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJUXVpY2tBc3Npc3RQcm9jZXNzb3IgZ2V0UXVpY2tBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJUXVpY2tGaXhQcm9jZXNzb3IgZ2V0UXVpY2tGaXhQcm9jZXNzb3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9CcmVha3BvaW50UnVsZXJBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9CcmVha3BvaW50UnVsZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY1MTk4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVidWcvQnJlYWtwb2ludFJ1bGVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JQnJlYWtwb2ludE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklWZXJ0aWNhbFJ1bGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5CcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50LklCcmVha3BvaW50UHJvdmlkZXI7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJyZWFrcG9pbnRSdWxlckFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElVcGRhdGUgewotCi0JcHJvdGVjdGVkIGNsYXNzIE1vdXNlVXBkYXRlciBpbXBsZW1lbnRzIE1vdXNlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJLy8gZG8gbm90aGluZyAoaGVyZSkKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCXVwZGF0ZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUlQYXRoIHBhdGggPSBudWxsOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQl0cnkgewotCQkJCXBhdGggPSAoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOwotCQl9Ci0JCVN0cmluZyBuYW1lID0gaW5wdXQuZ2V0TmFtZSgpOwotCQlpbnQgaW5kZXggPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoaW5kZXggPT0gKG5hbWUubGVuZ3RoKCkgLSAxKSkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElSZXNvdXJjZSBnZXRSZXNvdXJjZShJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQotCQkJcmVzb3VyY2UgPSAoKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRGaWxlKCk7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKSBpbnB1dC5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIGlucHV0LmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQotCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gbnVsbDsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCQkJaWYgKHdvcmtiZW5jaCAhPSBudWxsKSB7Ci0JCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQkJCUlQYXJ0U2VydmljZSBzZXJ2aWNlID0gd2luZG93LmdldFBhcnRTZXJ2aWNlKCk7Ci0JCQkJCWlmIChzZXJ2aWNlICE9IG51bGwpIHsKLQkJCQkJCU9iamVjdCBwYXJ0ID0gc2VydmljZS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQkJCQlpZiAocGFydCAhPSBudWxsICYmIHBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJCQkJCWVkaXRvclBhcnQgPSAoSUVkaXRvclBhcnQpIHBhcnQ7Ci0JCQkJCQkJaWYgKGVkaXRvclBhcnQgIT0gbnVsbCkgewotCQkJCQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQkJCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IG51bGw7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQkJCQkJCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yUGFydDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmICh0ZXh0RWRpdG9yID09IG51bGwpIHsKLQkJCQkJCQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJCQkJCQkJCUlEb2N1bWVudCB0ZXh0RG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChpbnB1dCk7Ci0JCQkJCQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHRleHREb2N1bWVudCk7Ci0JCQkJCQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJcmVzb3VyY2UgPSBCcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2UoaW5wdXQsIG1vZGVsLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpLCBnZXRGaWxlRXh0ZW5zaW9uKGlucHV0KSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCQkJCQkJCQlJQnJlYWtwb2ludFByb3ZpZGVyW10gcHJvdmlkZXJzID0gQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlci5nZXRJbnN0YW5jZSgpLmdldEJyZWFrcG9pbnRQcm92aWRlcnMoZWRpdG9yUGFydCwgbnVsbCwgZ2V0RmlsZUV4dGVuc2lvbihpbnB1dCkpOwotCQkJCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvdmlkZXJzLmxlbmd0aCAmJiByZXNvdXJjZSA9PSBudWxsOyBpKyspIHsKLQkJCQkJCQkJCQkJcmVzb3VyY2UgPSBwcm92aWRlcnNbaV0uZ2V0UmVzb3VyY2UoaW5wdXQpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHJvdGVjdGVkIE1vdXNlTGlzdGVuZXIgZk1vdXNlTGlzdGVuZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIElWZXJ0aWNhbFJ1bGVySW5mbyBmUnVsZXJJbmZvID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVRleHRFZGl0b3IgZlRleHRFZGl0b3IgPSBudWxsOwotCi0JcHVibGljIEJyZWFrcG9pbnRSdWxlckFjdGlvbihJVGV4dEVkaXRvciBlZGl0b3IsIElWZXJ0aWNhbFJ1bGVySW5mbyBydWxlckluZm8pIHsKLQkJc3VwZXIoKTsKLQkJZlRleHRFZGl0b3IgPSBlZGl0b3I7Ci0JCWlmKHJ1bGVySW5mbyAhPSBudWxsKSB7Ci0JCQlmUnVsZXJJbmZvID0gcnVsZXJJbmZvOwotCQkJZk1vdXNlTGlzdGVuZXIgPSBuZXcgTW91c2VVcGRhdGVyKCk7Ci0JCQlydWxlckluZm8uZ2V0Q29udHJvbCgpLmFkZE1vdXNlTGlzdGVuZXIoZk1vdXNlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+QWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWw8L2NvZGU+IG9mIHRoZQotCSAqIGVkaXRvcidzIGlucHV0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1hcmtlciBhbm5vdGF0aW9uIG1vZGVsCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsIGdldEFubm90YXRpb25Nb2RlbCgpIHsKLQkJSURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBmVGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgbW9kZWwgPSBwcm92aWRlci5nZXRBbm5vdGF0aW9uTW9kZWwoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIEFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsKQotCQkJcmV0dXJuIChBYnN0cmFjdE1hcmtlckFubm90YXRpb25Nb2RlbCkgbW9kZWw7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJQnJlYWtwb2ludFtdIGdldEJyZWFrcG9pbnRzKElNYXJrZXJbXSBtYXJrZXJzKSB7Ci0JCUlCcmVha3BvaW50TWFuYWdlciBtYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCk7Ci0JCUxpc3QgYnJlYWtwb2ludHMgPSBuZXcgQXJyYXlMaXN0KG1hcmtlcnMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQnJlYWtwb2ludCBicmVha3BvaW50ID0gbWFuYWdlci5nZXRCcmVha3BvaW50KG1hcmtlcnNbaV0pOwotCQkJaWYgKGJyZWFrcG9pbnQgIT0gbnVsbCkgewotCQkJCWJyZWFrcG9pbnRzLmFkZChicmVha3BvaW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElCcmVha3BvaW50W10pIGJyZWFrcG9pbnRzLnRvQXJyYXkobmV3IElCcmVha3BvaW50WzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5JRG9jdW1lbnQ8L2NvZGU+IG9mIHRoZSBlZGl0b3IncyBpbnB1dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCBvZiB0aGUgZWRpdG9yJ3MgaW5wdXQKLQkgKi8KLQlwcm90ZWN0ZWQgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IGZUZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJcmV0dXJuIHByb3ZpZGVyLmdldERvY3VtZW50KGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIG1hcmtlcnMgd2hpY2ggaW5jbHVkZSB0aGUgcnVsZXIncyBsaW5lIG9mIGFjdGl2aXR5LgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbWFya2VycyB3aGljaCBpbmNsdWRlIHRoZSBydWxlcidzIGxpbmUgb2YgYWN0aXZpdHkKLQkgKi8KLQlwcm90ZWN0ZWQgSU1hcmtlcltdIGdldE1hcmtlcnMoKSB7Ci0JCUxpc3QgbWFya2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpOwotCQlBYnN0cmFjdE1hcmtlckFubm90YXRpb25Nb2RlbCBhbm5vdGF0aW9uTW9kZWwgPSBnZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiBhbm5vdGF0aW9uTW9kZWwgIT0gbnVsbCAmJiByZXNvdXJjZS5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlJTWFya2VyW10gYWxsTWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKElCcmVha3BvaW50LkJSRUFLUE9JTlRfTUFSS0VSLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJaWYgKGFsbE1hcmtlcnMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbE1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChpbmNsdWRlc1J1bGVyTGluZShhbm5vdGF0aW9uTW9kZWwuZ2V0TWFya2VyUG9zaXRpb24oYWxsTWFya2Vyc1tpXSksIGRvY3VtZW50KSkgewotCQkJCQkJCW1hcmtlcnMuYWRkKGFsbE1hcmtlcnNbaV0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCi0JCXJldHVybiAoSU1hcmtlcltdKSBtYXJrZXJzLnRvQXJyYXkobmV3IElNYXJrZXJbMF0pOwotCX0KLQotCXByb3RlY3RlZCBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGdldFRleHRFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpOwotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShpbnB1dCk7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJ1bGVySW5mby4KLQkgKi8KLQlwdWJsaWMgSVZlcnRpY2FsUnVsZXJJbmZvIGdldFJ1bGVySW5mbygpIHsKLQkJcmV0dXJuIGZSdWxlckluZm87Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB0ZXh0RWRpdG9yLgotCSAqLwotCXB1YmxpYyBJVGV4dEVkaXRvciBnZXRUZXh0RWRpdG9yKCkgewotCQlyZXR1cm4gZlRleHRFZGl0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTWFya2VycygpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLQkJQWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWwgbW9kZWwgPSBnZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiBtb2RlbCAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCUlNYXJrZXJbXSBhbGxNYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoSUJyZWFrcG9pbnQuTElORV9CUkVBS1BPSU5UX01BUktFUiwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCWlmIChhbGxNYXJrZXJzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxNYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoaW5jbHVkZXNSdWxlckxpbmUobW9kZWwuZ2V0TWFya2VyUG9zaXRpb24oYWxsTWFya2Vyc1tpXSksIGRvY3VtZW50KSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBwb3NpdGlvbiBpbmNsdWRlcyB0aGUgcnVsZXIncyBsaW5lIG9mIGFjdGl2aXR5LgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIHRvIGJlIGNoZWNrZWQKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCB0aGUgcG9zaXRpb24gcmVmZXJzIHRvCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGluZSBpcyBpbmNsdWRlZCBieSB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgIHBvc2l0aW9uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZXNSdWxlckxpbmUoUG9zaXRpb24gcG9zaXRpb24sIElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAocG9zaXRpb24gIT0gbnVsbCAmJiBmUnVsZXJJbmZvICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaW50IG1hcmtlckxpbmUgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQocG9zaXRpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCWludCBsaW5lID0gZ2V0UnVsZXJJbmZvKCkuZ2V0TGluZU9mTGFzdE1vdXNlQnV0dG9uQWN0aXZpdHkoKTsKLQkJCQlpZiAobGluZSA9PSBtYXJrZXJMaW5lKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkvLyBjb21tZW50ZWQgYmVjYXVzZSBvZiAiMUdFVU9aOTogSVRQSlVJOkFMTCAtIENvbmZ1c2luZyBVSQotCQkJCS8vIGZvcgotCQkJCS8vIG11bHRpbGluZSBCb29rbWFya3MgYW5kIFRhc2tzIgotCQkJCS8vIHJldHVybiAobWFya2VyTGluZSA8PSBsaW5lICYmIGxpbmUgPD0KLQkJCQkvLyBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQocG9zaXRpb24uZ2V0T2Zmc2V0KCkgKwotCQkJCS8vIHBvc2l0aW9uLmdldExlbmd0aCgpKSk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL0RlYnVnVGV4dEVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL0RlYnVnVGV4dEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzMzNzgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9EZWJ1Z1RleHRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZWJ1ZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhdGhFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5GaWxlRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUxvY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblRhcmdldExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdERvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklFbGVtZW50U3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuTWFya2VyUnVsZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklFeHRlbmRlZENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVBvcHVwTWVudUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnMuQWN0aW9uRGVmaW5pdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5CcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5Db25maWd1cmF0aW9uUG9pbnRDYWxjdWxhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50LklFeHRlbmRlZFN0b3JhZ2VFZGl0b3JJbnB1dDsKLQotCi0vKioKLSAqIEBhdXRob3Igbml0aW4KLSAqIAotICogQSB0ZXh0IGVkaXRvciBjYXBhYmxlIG9mIHVzaW5nIHRoZSBJQnJlYWtwb2ludFByb3ZpZGVyIGZyYW1ld29yay4KLSAqIAotICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGNsaWVudHMgd2hvIHdpc2ggdG8gdXNlIHRoZQotICogSUJyZWFrcG9pbnRQcm92aWRlciBmcmFtZXdvcmsgYnV0IG5vdCB0aGUgU3RydWN0dXJlZFRleHRFZGl0b3IsIGUuZy4gVkJTCi0gKiBzb3VyY2UgZWRpdG9ycy4gSXQgaXMgcHJvdmlkZWQgQVMtSVMgYW5kIG1hcmtlZCBpbnRlcm5hbCBhcyBpdCBpcwotICogdW5zdXBwb3J0ZWQgYW5kIHN1YmplY3QgdG8gY2hhbmdlIGF0IGFueSB0aW1lLgotICovCi1wdWJsaWMgY2xhc3MgRGVidWdUZXh0RWRpdG9yIGV4dGVuZHMgVGV4dEVkaXRvciB7Ci0KLQlwcml2YXRlIGNsYXNzIFNob3dJblRhcmdldExpc3RlciBpbXBsZW1lbnRzIElTaG93SW5UYXJnZXRMaXN0IHsKLQkJcHVibGljIFN0cmluZ1tdIGdldFNob3dJblRhcmdldElkcygpIHsKLQkJCXJldHVybiBmU2hvd0luVGFyZ2V0SWRzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRG9jdW1lbnRQcm92aWRlciBmb3IgSVN0b3JhZ2VFZGl0b3JJbnB1dHMgLSBzdXBwb3J0cwotCSAqIElFeHRlbmRlZFN0b3JhZ2VFZGl0b3JJbnB1dCBub3RpZmljYXRpb25zIGFuZCBhc3NpZ25pbmcgYnJlYWtwb2ludAotCSAqIG1hcmtlcnMuCi0JICovCi0JY2xhc3MgU3RvcmFnZUlucHV0RG9jdW1lbnRQcm92aWRlciBleHRlbmRzIFN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyIGltcGxlbWVudHMgSUVsZW1lbnRTdGF0ZUxpc3RlbmVyIHsKLQkJcHJvdGVjdGVkIElBbm5vdGF0aW9uTW9kZWwgY3JlYXRlQW5ub3RhdGlvbk1vZGVsKE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJQW5ub3RhdGlvbk1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCUlTdG9yYWdlRWRpdG9ySW5wdXQgc3RvcmFnZUlucHV0ID0gKElTdG9yYWdlRWRpdG9ySW5wdXQpIGVsZW1lbnQ7Ci0JCQlTdHJpbmcgZXh0ID0gQnJlYWtwb2ludFJ1bGVyQWN0aW9uLmdldEZpbGVFeHRlbnNpb24oc3RvcmFnZUlucHV0KTsKLQkJCUlDb250ZW50VHlwZVtdIHR5cGVzID0gZ2V0RWRpdG9ySW5wdXRDb250ZW50VHlwZXMoc3RvcmFnZUlucHV0KTsKLQkJCUlSZXNvdXJjZSByZXMgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IHJlcyA9PSBudWxsICYmIGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJCXJlcyA9IEJyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXIuZ2V0SW5zdGFuY2UoKS5nZXRSZXNvdXJjZShzdG9yYWdlSW5wdXQsIHR5cGVzW2ldLmdldElkKCksIGV4dCk7Ci0JCQl9Ci0JCQlTdHJpbmcgaWQgPSBzdG9yYWdlSW5wdXQuZ2V0TmFtZSgpOwotCQkJaWYgKHN0b3JhZ2VJbnB1dC5nZXRTdG9yYWdlKCkgIT0gbnVsbCkgewotCQkJCUlQYXRoIGZ1bGxQYXRoID0gc3RvcmFnZUlucHV0LmdldFN0b3JhZ2UoKS5nZXRGdWxsUGF0aCgpOwotCQkJCWlmIChmdWxsUGF0aCAhPSBudWxsKQotCQkJCQlpZCA9IGZ1bGxQYXRoLnRvU3RyaW5nKCk7Ci0JCQkJZWxzZQotCQkJCQlpZCA9IHN0b3JhZ2VJbnB1dC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlpZiAocmVzICE9IG51bGwpCi0JCQkJbW9kZWwgPSBuZXcgU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsKHJlcywgaWQpOwotCQkJZWxzZQotCQkJCW1vZGVsID0gbmV3IFN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCBpZCk7Ci0KLQkJCXJldHVybiBtb2RlbDsKLQkJfQotCi0JCXByb3RlY3RlZCBBYnN0cmFjdERvY3VtZW50UHJvdmlkZXIuRWxlbWVudEluZm8gY3JlYXRlRWxlbWVudEluZm8oT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUV4dGVuZGVkU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQkJKChJRXh0ZW5kZWRTdG9yYWdlRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmFkZEVsZW1lbnRTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUVsZW1lbnRJbmZvKGVsZW1lbnQpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50LCBFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElFeHRlbmRlZFN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJCSgoSUV4dGVuZGVkU3RvcmFnZUVkaXRvcklucHV0KSBlbGVtZW50KS5yZW1vdmVFbGVtZW50U3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJCXN1cGVyLmRpc3Bvc2VFbGVtZW50SW5mbyhlbGVtZW50LCBpbmZvKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyI2RvU2F2ZURvY3VtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LCBib29sZWFuKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgZG9TYXZlRG9jdW1lbnQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPYmplY3QgZWxlbWVudCwgSURvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJLy8gdW50ZXN0ZWQKLQkJCW5ldyBGaWxlRG9jdW1lbnRQcm92aWRlcigpLnNhdmVEb2N1bWVudChtb25pdG9yLCBlbGVtZW50LCBkb2N1bWVudCwgb3ZlcndyaXRlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVsZW1lbnRDb250ZW50QWJvdXRUb0JlUmVwbGFjZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWZpcmVFbGVtZW50Q29udGVudEFib3V0VG9CZVJlcGxhY2VkKGVsZW1lbnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZWxlbWVudENvbnRlbnRSZXBsYWNlZChPYmplY3QgZWxlbWVudCkgewotCQkJZmlyZUVsZW1lbnRDb250ZW50UmVwbGFjZWQoZWxlbWVudCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlbGVtZW50RGVsZXRlZChPYmplY3QgZWxlbWVudCkgewotCQkJZmlyZUVsZW1lbnREZWxldGVkKGVsZW1lbnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZWxlbWVudERpcnR5U3RhdGVDaGFuZ2VkKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGlzRGlydHkpIHsKLQkJCWZpcmVFbGVtZW50RGlydHlTdGF0ZUNoYW5nZWQoZWxlbWVudCwgaXNEaXJ0eSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlbGVtZW50TW92ZWQoT2JqZWN0IG9yaWdpbmFsRWxlbWVudCwgT2JqZWN0IG1vdmVkRWxlbWVudCkgewotCQkJZmlyZUVsZW1lbnRNb3ZlZChvcmlnaW5hbEVsZW1lbnQsIG1vdmVkRWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQlTdHJpbmdbXSBmU2hvd0luVGFyZ2V0SWRzID0gbmV3IFN0cmluZ1tde0lQYWdlTGF5b3V0LklEX1JFU19OQVZ9OwotCXByaXZhdGUgSVNob3dJblRhcmdldExpc3QgZlNob3dJblRhcmdldExpc3RBZGFwdGVyID0gbmV3IFNob3dJblRhcmdldExpc3RlcigpOwotCi0JSURvY3VtZW50UHJvdmlkZXIgZlN0b3JhZ2VJbnB1dERvY3VtZW50UHJvdmlkZXIgPSBudWxsOwotCi0JcHVibGljIERlYnVnVGV4dEVkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RWRpdG9yI2NyZWF0ZUFjdGlvbnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLQotCQkvLyBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBBY3Rpb24gLSB0b2dnbGUgYnJlYWtwb2ludHMKLQkJSUFjdGlvbiBhY3Rpb24gPSBuZXcgVG9nZ2xlQnJlYWtwb2ludEFjdGlvbih0aGlzLCBnZXRWZXJ0aWNhbFJ1bGVyKCkpIHsKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGUoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCQkJSUxvY2F0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSAoSUxvY2F0aW9uUHJvdmlkZXIpIGdldEVkaXRvcklucHV0KCkuZ2V0QWRhcHRlcihJTG9jYXRpb25Qcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJSVBhdGggbG9jYXRpb24gPSBwcm92aWRlci5nZXRQYXRoKGdldEVkaXRvcklucHV0KCkpOwotCQkJCQlyZXR1cm4gZGV0ZWN0Q29udGVudFR5cGUobG9jYXRpb24pLmdldElkKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBJUGF0aEVkaXRvcklucHV0KSB7Ci0JCQkJCUlQYXRoIGxvY2F0aW9uID0gKChJUGF0aEVkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpKS5nZXRQYXRoKCk7Ci0JCQkJCXJldHVybiBkZXRlY3RDb250ZW50VHlwZShsb2NhdGlvbikuZ2V0SWQoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIElDb250ZW50VHlwZU1hbmFnZXIuQ1RfVEVYVDsKLQkJCX0KLQkJfTsKLQkJc2V0QWN0aW9uKEFjdGlvbkRlZmluaXRpb25JZHMuVE9HR0xFX0JSRUFLUE9JTlRTLCBhY3Rpb24pOwotCQkvLyBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBBY3Rpb24gLSBtYW5hZ2UgYnJlYWtwb2ludHMKLQkJYWN0aW9uID0gbmV3IE1hbmFnZUJyZWFrcG9pbnRBY3Rpb24odGhpcywgZ2V0VmVydGljYWxSdWxlcigpKTsKLQkJc2V0QWN0aW9uKEFjdGlvbkRlZmluaXRpb25JZHMuTUFOQUdFX0JSRUFLUE9JTlRTLCBhY3Rpb24pOwotCQkvLyBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBBY3Rpb24gLSBlZGl0IGJyZWFrcG9pbnRzCi0JCWFjdGlvbiA9IG5ldyBFZGl0QnJlYWtwb2ludEFjdGlvbih0aGlzLCBnZXRWZXJ0aWNhbFJ1bGVyKCkpOwotCQlzZXRBY3Rpb24oQWN0aW9uRGVmaW5pdGlvbklkcy5FRElUX0JSRUFLUE9JTlRTLCBhY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSBTaG93IEluIFRhcmdldCBJRHMgZnJvbSB0aGUgRXh0ZW5kZWQgQ29uZmlndXJhdGlvbiBleHRlbnNpb24KLQkgKiBwb2ludC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGNyZWF0ZVNob3dJblRhcmdldElkcygpIHsKLQkJTGlzdCBhbGxJZHMgPSBuZXcgQXJyYXlMaXN0KDApOwotCQlFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyIGJ1aWxkZXIgPSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCk7Ci0JCVN0cmluZ1tdIGNvbmZpZ3VyYXRpb25JZHMgPSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbklkcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gZGVmaW5pdGlvbnMgPSBidWlsZGVyLmdldERlZmluaXRpb25zKCJzaG93aW50YXJnZXQiLCBjb25maWd1cmF0aW9uSWRzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZWZpbml0aW9ucy5sZW5ndGg7IGorKykgewotCQkJCVN0cmluZyBzb21lSWRzID0gZGVmaW5pdGlvbnNbal07Ci0JCQkJaWYgKHNvbWVJZHMgIT0gbnVsbCAmJiBzb21lSWRzLmxlbmd0aCgpID4gMCkgewotCQkJCQlTdHJpbmdbXSBpZHMgPSBTdHJpbmdVdGlscy51bnBhY2soc29tZUlkcyk7Ci0JCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgaWRzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkvLyB0cmltLCBqdXN0IHRvIGtlZXAgdGhpbmdzIGNsZWFuCi0JCQkJCQlTdHJpbmcgaWQgPSBpZHNba10udHJpbSgpOwotCQkJCQkJaWYgKCFhbGxJZHMuY29udGFpbnMoaWQpKSB7Ci0JCQkJCQkJYWxsSWRzLmFkZChpZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWFsbElkcy5jb250YWlucyhJUGFnZUxheW91dC5JRF9SRVNfTkFWKSkgewotCQkJYWxsSWRzLmFkZChJUGFnZUxheW91dC5JRF9SRVNfTkFWKTsKLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKSBhbGxJZHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0KLQlJQ29udGVudFR5cGUgZGV0ZWN0Q29udGVudFR5cGUoSVBhdGggbG9jYXRpb24pIHsKLQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBudWxsOwotCi0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IEZpbGVCdWZmZXJzLmdldFdvcmtzcGFjZUZpbGVBdExvY2F0aW9uKGxvY2F0aW9uKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGQgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCS8vIE9wdGltaXplZCBkZXNjcmlwdGlvbiBsb29rdXAsIG1pZ2h0IG5vdCBzdWNjZWVkCi0JCQkJCWQgPSAoKElGaWxlKSByZXNvdXJjZSkuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkJCWlmIChkICE9IG51bGwpIHsKLQkJCQkJCXR5cGUgPSBkLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBTaG91bGQgbm90IGJlIHBvc3NpYmxlIGdpdmVuIHRoZSBhY2Nlc3NpYmxlIGFuZCBmaWxlCi0JCQkJCS8vIHR5cGUgY2hlY2sgYWJvdmUKLQkJCQl9Ci0JCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCQl0eXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKHJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJRmlsZSBmaWxlID0gRmlsZUJ1ZmZlcnMuZ2V0U3lzdGVtRmlsZUF0TG9jYXRpb24obG9jYXRpb24pOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCUlucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQkJCXR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IoaW5wdXQsIGxvY2F0aW9uLnRvT1NTdHJpbmcoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaW5wdXQuY2xvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkJdHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZUZvcihmaWxlLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCXR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShJQ29udGVudFR5cGVNYW5hZ2VyLkNUX1RFWFQpOwotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3IjZWRpdG9yQ29udGV4dE1lbnVBYm91dFRvU2hvdyhvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVkaXRvckNvbnRleHRNZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuZWRpdG9yQ29udGV4dE1lbnVBYm91dFRvU2hvdyhtZW51KTsKLQotCQlJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgYyA9IGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotCQlpZiAoYyBpbnN0YW5jZW9mIElQb3B1cE1lbnVDb250cmlidXRvcikgewotCQkJKChJUG9wdXBNZW51Q29udHJpYnV0b3IpIGMpLmNvbnRyaWJ1dGVUb1BvcHVwTWVudShtZW51KTsKLQkJfQotCQllbHNlIHsKLQkJCUV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlciBidWlsZGVyID0gbmV3IEV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlcigpOwotCQkJSUV4dGVuZGVkQ29udHJpYnV0b3IgcG1jID0gYnVpbGRlci5yZWFkQWN0aW9uRXh0ZW5zaW9ucyhnZXRDb25maWd1cmF0aW9uUG9pbnRzKCkpOwotCQkJaWYgKHBtYyAhPSBudWxsKSB7Ci0JCQkJcG1jLnNldEFjdGl2ZUVkaXRvcih0aGlzKTsKLQkJCQlwbWMuY29udHJpYnV0ZVRvUG9wdXBNZW51KG1lbnUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgcmVxdWlyZWQpIHsKLQkJLy8gTmF2aWdhdGUgYWN0aW9uIHNldCBtZW51Ci0JCWlmIChJU2hvd0luVGFyZ2V0TGlzdC5jbGFzcy5lcXVhbHMocmVxdWlyZWQpKQotCQkJcmV0dXJuIGZTaG93SW5UYXJnZXRMaXN0QWRhcHRlcjsKLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIocmVxdWlyZWQpOwotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldENvbmZpZ3VyYXRpb25Qb2ludHMoKSB7Ci0JCXJldHVybiBDb25maWd1cmF0aW9uUG9pbnRDYWxjdWxhdG9yLmdldENvbmZpZ3VyYXRpb25Qb2ludHModGhpcywgZ2V0SW5wdXRDb250ZW50VHlwZShnZXRFZGl0b3JJbnB1dCgpKSwgQ29uZmlndXJhdGlvblBvaW50Q2FsY3VsYXRvci5TT1VSQ0UsIERlYnVnVGV4dEVkaXRvci5jbGFzcyk7Ci0JfQotCi0JSUNvbnRlbnRUeXBlW10gZ2V0RWRpdG9ySW5wdXRDb250ZW50VHlwZXMoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUlDb250ZW50VHlwZVtdIHR5cGVzID0gbnVsbDsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQotCQlpZiAoaW5wdXQuZ2V0QWRhcHRlcihJRmlsZS5jbGFzcykgIT0gbnVsbCkgewotCQkJcmVzb3VyY2UgPSAoSUZpbGUpIGlucHV0LmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotCQl9Ci0JCWVsc2UgaWYgKGlucHV0LmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpICE9IG51bGwpIHsKLQkJCXJlc291cmNlID0gKElSZXNvdXJjZSkgaW5wdXQuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQl9Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCUlDb250ZW50RGVzY3JpcHRpb24gZCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8vIG9wdGltaXplZCBkZXNjcmlwdGlvbiBsb29rdXAsIG1pZ2h0IG5vdCBzdWNjZWVkCi0JCQkJZCA9ICgoSUZpbGUpIHJlc291cmNlKS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQkJCXR5cGVzID0gbmV3IElDb250ZW50VHlwZVtde2QuZ2V0Q29udGVudFR5cGUoKX07Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIHNob3VsZCBub3QgYmUgcG9zc2libGUgZ2l2ZW4gdGhlIGFjY2Vzc2libGUgYW5kIGZpbGUgdHlwZQotCQkJCS8vIGNoZWNrIGFib3ZlCi0JCQl9Ci0JCX0KLQkJaWYgKHR5cGVzID09IG51bGwpIHsKLQkJCXR5cGVzID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlc0ZvcihpbnB1dC5nZXROYW1lKCkpOwotCQl9Ci0JCXJldHVybiB0eXBlczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9ySW5wdXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5wdXRDb250ZW50VHlwZShJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsKLQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBnZXRFZGl0b3JJbnB1dENvbnRlbnRUeXBlcyhlZGl0b3JJbnB1dCk7Ci0JCWlmICh0eXBlcyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdHlwZXNbMF0uZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVidWdnaW5nQXZhaWxhYmxlKCkgewotCQlib29sZWFuIGRlYnVnZ2luZ0F2YWlsYWJsZSA9IGZhbHNlOwotCQlJQ29udGVudFR5cGVbXSB0eXBlcyA9IGdldEVkaXRvcklucHV0Q29udGVudFR5cGVzKGdldEVkaXRvcklucHV0KCkpOwotCQlmb3IgKGludCBpID0gMDsgIWRlYnVnZ2luZ0F2YWlsYWJsZSAmJiBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWRlYnVnZ2luZ0F2YWlsYWJsZSA9IGRlYnVnZ2luZ0F2YWlsYWJsZSB8fCBCcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyLmdldEluc3RhbmNlKCkuaXNBdmFpbGFibGUodHlwZXNbaV0uZ2V0SWQoKSwgQnJlYWtwb2ludFJ1bGVyQWN0aW9uLmdldEZpbGVFeHRlbnNpb24oZ2V0RWRpdG9ySW5wdXQoKSkpOwotCQl9Ci0JCXJldHVybiBkZWJ1Z2dpbmdBdmFpbGFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcnVsZXJDb250ZXh0TWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCWlmIChpc0RlYnVnZ2luZ0F2YWlsYWJsZSgpKSB7Ci0JCQltZW51LmFkZChnZXRBY3Rpb24oQWN0aW9uRGVmaW5pdGlvbklkcy5UT0dHTEVfQlJFQUtQT0lOVFMpKTsKLQkJCW1lbnUuYWRkKGdldEFjdGlvbihBY3Rpb25EZWZpbml0aW9uSWRzLk1BTkFHRV9CUkVBS1BPSU5UUykpOwotCQkJbWVudS5hZGQoZ2V0QWN0aW9uKEFjdGlvbkRlZmluaXRpb25JZHMuRURJVF9CUkVBS1BPSU5UUykpOwotCQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJfQotCQllbHNlIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBjb3VsZCBub3QgZW5hYmxlIGRlYnVnZ2luZyBhY3Rpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlzdXBlci5ydWxlckNvbnRleHRNZW51QWJvdXRUb1Nob3cobWVudSk7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHRoYXQgdGhlIGNvcnJlY3QgSURvY3VtZW50UHJvdmlkZXIgaXMgdXNlZC4gRm9yIElGaWxlIGFuZCBGaWxlcywKLQkgKiB0aGUgZGVmYXVsdCBwcm92aWRlciB3aXRoIGEgc3BlY2lmaWVkIEFubm90YXRpb25Nb2RlbEZhY3RvcnkgaXMgdXNlZC4KLQkgKiBGb3IgU3RvcmFnZUVkaXRvcklucHV0cywgdXNlIGEgY3VzdG9tIHByb3ZpZGVyIHRoYXQgY3JlYXRlcyBhIHVzYWJsZQotCSAqIFJlc291cmNlQW5ub3RhdGlvbk1vZGVsCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvciNzZXREb2N1bWVudFByb3ZpZGVyKG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudFByb3ZpZGVyKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0ICYmICEoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSkgewotCQkJaWYgKGZTdG9yYWdlSW5wdXREb2N1bWVudFByb3ZpZGVyID09IG51bGwpIHsKLQkJCQlmU3RvcmFnZUlucHV0RG9jdW1lbnRQcm92aWRlciA9IG5ldyBTdG9yYWdlSW5wdXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCQl9Ci0JCQlzZXREb2N1bWVudFByb3ZpZGVyKGZTdG9yYWdlSW5wdXREb2N1bWVudFByb3ZpZGVyKTsKLQkJfQotCQllbHNlIHsKLQkJCXN1cGVyLnNldERvY3VtZW50UHJvdmlkZXIoaW5wdXQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0VGV4dEVkaXRvciN1cGRhdGVDb250ZW50RGVwZW5kZW50QWN0aW9ucygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udGVudERlcGVuZGVudEFjdGlvbnMoKSB7Ci0JCXN1cGVyLnVwZGF0ZUNvbnRlbnREZXBlbmRlbnRBY3Rpb25zKCk7Ci0JCWlmIChpc0RlYnVnZ2luZ0F2YWlsYWJsZSgpKSB7Ci0JCQlzZXRBY3Rpb24oSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUlVMRVJfRE9VQkxFX0NMSUNLLCBnZXRBY3Rpb24oQWN0aW9uRGVmaW5pdGlvbklkcy5UT0dHTEVfQlJFQUtQT0lOVFMpKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIFRoZSBEZWZhdWx0IFRleHQgRWRpdG9yIHVzZXMgZWRpdG9yQ29udHJpYnV0aW9uIHRvIHBlcmZvcm0gdGhpcwotCQkJLy8gbWFwcGluZywgYnV0IHNpbmNlIGl0IHJlbGllcyBvbiB0aGUgSUVkaXRvclNpdGUgSUQsIGl0IGNhbid0IGJlCi0JCQkvLyByZWxpZWQgb24gZm9yIE11bHRpUGFnZUVkaXRvclBhcnRzLiBJbnN0ZWFkLCBmb3JjZSB0aGUgYWN0aW9uCi0JCQkvLyByZWdpc3RyYXRpb24gbWFudWFsbHkuCi0JCQlzZXRBY3Rpb24oSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUlVMRVJfRE9VQkxFX0NMSUNLLCBuZXcgTWFya2VyUnVsZXJBY3Rpb24oU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCAiRWRpdG9yLk1hbmFnZUJvb2ttYXJrcy4iLCB0aGlzLCBnZXRWZXJ0aWNhbFJ1bGVyKCksIElNYXJrZXIuQk9PS01BUkssIHRydWUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWZTaG93SW5UYXJnZXRJZHMgPSBjcmVhdGVTaG93SW5UYXJnZXRJZHMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVidWcvRWRpdEJyZWFrcG9pbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9FZGl0QnJlYWtwb2ludEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWI5ODhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9FZGl0QnJlYWtwb2ludEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklWZXJ0aWNhbFJ1bGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlEaWFsb2dBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0QnJlYWtwb2ludEFjdGlvbiBleHRlbmRzIEJyZWFrcG9pbnRSdWxlckFjdGlvbiB7Ci0JcHJvdGVjdGVkIElCcmVha3BvaW50W10gYnJlYWtwb2ludHMgPSBudWxsOwotCi0JLyoqCi0JICogQHBhcmFtIGVkaXRvcgotCSAqIEBwYXJhbSBydWxlckluZm8KLQkgKi8KLQlwdWJsaWMgRWRpdEJyZWFrcG9pbnRBY3Rpb24oSVRleHRFZGl0b3IgZWRpdG9yLCBJVmVydGljYWxSdWxlciBydWxlckluZm8pIHsKLQkJc3VwZXIoZWRpdG9yLCBydWxlckluZm8pOwotCQlzZXRUZXh0KFNTRVVJTWVzc2FnZXMuRWRpdEJyZWFrcG9pbnRBY3Rpb25fMCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCVByb3BlcnR5RGlhbG9nQWN0aW9uIGFjdGlvbiA9IG5ldyBQcm9wZXJ0eURpYWxvZ0FjdGlvbihnZXRUZXh0RWRpdG9yKCkuZ2V0RWRpdG9yU2l0ZSgpLCBuZXcgSVNlbGVjdGlvblByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0KLQkJCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYnJlYWtwb2ludHMpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQl9KTsKLQkJYWN0aW9uLnJ1bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJYm9vbGVhbiBlbmFibGVUaGlzQWN0aW9uID0gaGFzTWFya2VycygpOwotCQlzZXRFbmFibGVkKGVuYWJsZVRoaXNBY3Rpb24pOwotCQlicmVha3BvaW50cyA9IGdldEJyZWFrcG9pbnRzKGdldE1hcmtlcnMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL01hbmFnZUJyZWFrcG9pbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9NYW5hZ2VCcmVha3BvaW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkN2ZmMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL01hbmFnZUJyZWFrcG9pbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlYnVnOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JVmVydGljYWxSdWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLQotLyoqCi0gKiBNYW5hZ2VCcmVha3BvaW50QWN0aW9uIC0gRW5hYmxlcyBhbmQgRGlzYWJsZXMKLSAqLwotcHVibGljIGNsYXNzIE1hbmFnZUJyZWFrcG9pbnRBY3Rpb24gZXh0ZW5kcyBCcmVha3BvaW50UnVsZXJBY3Rpb24gewotCi0JcHJvdGVjdGVkIElCcmVha3BvaW50W10gYnJlYWtwb2ludHMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBkb0VuYWJsZSA9IHRydWU7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogQHBhcmFtIHJ1bGVySW5mbwotCSAqLwotCXB1YmxpYyBNYW5hZ2VCcmVha3BvaW50QWN0aW9uKElUZXh0RWRpdG9yIGVkaXRvciwgSVZlcnRpY2FsUnVsZXIgcnVsZXJJbmZvKSB7Ci0JCXN1cGVyKGVkaXRvciwgcnVsZXJJbmZvKTsKLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzYWJsZUJyZWFrcG9pbnRzKElCcmVha3BvaW50W10gYnJlYWtwb2ludHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBicmVha3BvaW50cy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlicmVha3BvaW50c1tpXS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVCcmVha3BvaW50cyhJQnJlYWtwb2ludFtdIGJyZWFrcG9pbnRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnJlYWtwb2ludHMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJYnJlYWtwb2ludHNbaV0uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChkb0VuYWJsZSkKLQkJCWVuYWJsZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRzKTsKLQkJZWxzZQotCQkJZGlzYWJsZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCS8vIGRvRW5hYmxlIG1lYW5zICJlbmFibGUiIGluc3RlYWQgb2YgImRpc2FibGUiCi0JCWRvRW5hYmxlID0gdHJ1ZTsKLQkJYnJlYWtwb2ludHMgPSBnZXRCcmVha3BvaW50cyhnZXRNYXJrZXJzKCkpOwotCQlmb3IgKGludCBpID0gMDsgZG9FbmFibGUgJiYgaSA8IGJyZWFrcG9pbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQnJlYWtwb2ludCBicmVha3BvaW50ID0gYnJlYWtwb2ludHNbaV07Ci0JCQl0cnkgewotCQkJCWlmIChicmVha3BvaW50LmlzRW5hYmxlZCgpKSB7Ci0JCQkJCWRvRW5hYmxlID0gZmFsc2U7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiYnJlYWtwb2ludCBub3QgcmVzcG9uZGluZyB0byBpc0VuYWJsZWQ6ICIgKyBicmVha3BvaW50LCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXNldEVuYWJsZWQoYnJlYWtwb2ludHMgIT0gbnVsbCAmJiBicmVha3BvaW50cy5sZW5ndGggPiAwKTsKLQkJaWYgKGRvRW5hYmxlKQotCQkJc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk1hbmFnZUJyZWFrcG9pbnRBY3Rpb25fMCk7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk1hbmFnZUJyZWFrcG9pbnRBY3Rpb25fMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9Ub2dnbGVCcmVha3BvaW50QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVidWcvVG9nZ2xlQnJlYWtwb2ludEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWQxMGRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9Ub2dnbGVCcmVha3BvaW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklCcmVha3BvaW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVZlcnRpY2FsUnVsZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uNDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLkJyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50LklCcmVha3BvaW50UHJvdmlkZXI7Ci0KLS8qKgotICogVG9nZ2xlQnJlYWtwb2ludEFjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgVG9nZ2xlQnJlYWtwb2ludEFjdGlvbiBleHRlbmRzIEJyZWFrcG9pbnRSdWxlckFjdGlvbiB7Ci0JSUFjdGlvbiBmRmFsbGJhY2tBY3Rpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogQHBhcmFtIHJ1bGVySW5mbwotCSAqLwotCXB1YmxpYyBUb2dnbGVCcmVha3BvaW50QWN0aW9uKElUZXh0RWRpdG9yIGVkaXRvciwgSVZlcnRpY2FsUnVsZXJJbmZvIHJ1bGVySW5mbykgewotCQlzdXBlcihlZGl0b3IsIHJ1bGVySW5mbyk7Ci0JCXNldFRleHQoU1NFVUlNZXNzYWdlcy5Ub2dnbGVCcmVha3BvaW50QWN0aW9uXzApOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFRvZ2dsZUJyZWFrcG9pbnRBY3Rpb24oSVRleHRFZGl0b3IgZWRpdG9yLCBJVmVydGljYWxSdWxlckluZm8gcnVsZXJJbmZvLCBJQWN0aW9uIGZhbGxiYWNrQWN0aW9uKSB7Ci0JCXRoaXMoZWRpdG9yLCBydWxlckluZm8pOwotCQlmRmFsbGJhY2tBY3Rpb24gPSBmYWxsYmFja0FjdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjcmVhdGVCcmVha3BvaW50cyhpbnQgbGluZU51bWJlcikgewotCQkvKgotCQkgKiBOb3RlOiB3ZSdsbCBhbHdheXMgYWxsb3cgcHJvY2Vzc2luZyB0byBjb250aW51ZSwgZXZlbiBmb3IgYSAicmVhZAotCQkgKiBvbmx5IiBJU3RvcmFnZUVkaXRvcklucHV0LCBmb3IgdGhlIEFjdGl2ZVNjcmlwdCBkZWJ1Z2dlci4gQnV0IHRoaXMKLQkJICogbWVhbnMgc29tZXRpbWVzIHRoZSBBY3RpdmVTY3JpcHQgcHJvdmlkZXIgbWlnaHQgZ2V0IGFuIGlucHV0IGZyb20KLQkJICogQ1ZTIG9yIHNvbWV0aGluZyB0aGF0IGlzIG5vdCByZWxhdGVkIHRvIGRlYnVnZ2luZy4KLQkJICovCi0KLQkJSVRleHRFZGl0b3IgZWRpdG9yID0gZ2V0VGV4dEVkaXRvcigpOwotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChpbnB1dCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyBjb250ZW50VHlwZSA9IGdldENvbnRlbnRUeXBlKGRvY3VtZW50KTsKLQkJSUJyZWFrcG9pbnRQcm92aWRlcltdIHByb3ZpZGVycyA9IEJyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXIuZ2V0SW5zdGFuY2UoKS5nZXRCcmVha3BvaW50UHJvdmlkZXJzKGVkaXRvciwgY29udGVudFR5cGUsIGdldEZpbGVFeHRlbnNpb24oaW5wdXQpKTsKLQotCQlpbnQgcG9zID0gLTE7Ci0JCUlTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIHRvb2xzID0gKElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKSBlZGl0b3IuZ2V0QWRhcHRlcihJU291cmNlRWRpdGluZ1RleHRUb29scy5jbGFzcyk7Ci0JCWlmICh0b29scyAhPSBudWxsKSB7Ci0JCQlwb3MgPSB0b29scy5nZXRDYXJldE9mZnNldCgpOwotCQl9Ci0KLQkJZmluYWwgaW50IG4gPSBwcm92aWRlcnMubGVuZ3RoOwotCQlMaXN0IGVycm9ycyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWlmIChEZWJ1Zy5kZWJ1Z0JyZWFrcG9pbnRzKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ocHJvdmlkZXJzW2ldLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRpbmcgYnJlYWtwb2ludCB0byBsaW5lICIgKyBsaW5lTnVtYmVyKTsgLy8kTk9OLU5MUy0xJAotCQkJCUlTdGF0dXMgc3RhdHVzID0gcHJvdmlkZXJzW2ldLmFkZEJyZWFrcG9pbnQoZG9jdW1lbnQsIGlucHV0LCBsaW5lTnVtYmVyLCBwb3MpOwotCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkgewotCQkJCQllcnJvcnMuYWRkKHN0YXR1cyk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWVycm9ycy5hZGQoZS5nZXRTdGF0dXMoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIHQpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gd2hpbGUgYWRkaW5nIGJyZWFrcG9pbnQiLCB0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlpZiAoZXJyb3JzLnNpemUoKSA+IDApIHsKLQkJCVNoZWxsIHNoZWxsID0gZWRpdG9yLmdldFNpdGUoKS5nZXRTaGVsbCgpOwotCQkJaWYgKGVycm9ycy5zaXplKCkgPiAxKSB7Ci0JCQkJc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFNTRVVJUGx1Z2luLklELCBJU3RhdHVzLk9LLCAoSVN0YXR1c1tdKSBlcnJvcnMudG9BcnJheShuZXcgSVN0YXR1c1swXSksIFNTRVVJTWVzc2FnZXMuTWFuYWdlQnJlYWtwb2ludHNfZXJyb3JfYWRkaW5nX21lc3NhZ2UxLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3RhdHVzID0gKElTdGF0dXMpIGVycm9ycy5nZXQoMCk7Ci0JCQl9Ci0JCQlpZiAoKHN0YXR1cy5nZXRTZXZlcml0eSgpID4gSVN0YXR1cy5JTkZPKSB8fCAoUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKSAmJiAhc3RhdHVzLmlzT0soKSkpIHsKLQkJCQlQbGF0Zm9ybS5nZXRMb2coU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpKS5sb2coc3RhdHVzKTsKLQkJCX0KLQkJCS8qCi0JCQkgKiBTaG93IGZvciBjb25kaXRpb25zIG1vcmUgc2V2ZXJlIHRoYW4gSU5GTyBvciB3aGVuIG5vCi0JCQkgKiBicmVha3BvaW50cyB3ZXJlIGNyZWF0ZWQKLQkJCSAqLwotCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID4gSVN0YXR1cy5JTkZPIHx8IGdldEJyZWFrcG9pbnRzKGdldE1hcmtlcnMoKSkubGVuZ3RoIDwgMSkgewotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgU1NFVUlNZXNzYWdlcy5NYW5hZ2VCcmVha3BvaW50c19lcnJvcl9hZGRpbmdfdGl0bGUxLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLCBzdGF0dXMpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJLyoKLQkJICogQWx0aG91Z2ggbm8gZXJyb3JzIHdlcmUgcmVwb3J0ZWQsIG5vIGJyZWFrcG9pbnRzIGV4aXN0IG9uIHRoaXMgbGluZQotCQkgKiBhZnRlciBoYXZpbmcgcnVuIHRoZSBleGlzdGluZyBwcm92aWRlcnMuIFJ1biB0aGUgZmFsbGJhY2sgYWN0aW9uLgotCQkgKi8KLQkJaWYgKChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA8IElTdGF0dXMuV0FSTklORykgJiYgZkZhbGxiYWNrQWN0aW9uICE9IG51bGwgJiYgIWhhc01hcmtlcnMoKSkgewotCQkJaWYgKGZGYWxsYmFja0FjdGlvbiBpbnN0YW5jZW9mIElTZWxlY3Rpb25MaXN0ZW5lcikgewotCQkJCSgoSVNlbGVjdGlvbkxpc3RlbmVyKSBmRmFsbGJhY2tBY3Rpb24pLnNlbGVjdGlvbkNoYW5nZWQobnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCQlmRmFsbGJhY2tBY3Rpb24ucnVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZShJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJSU1vZGVsTWFuYWdlciBtZ3IgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlTdHJpbmcgY29udGVudFR5cGUgPSBudWxsOwotCi0JCUlEb2N1bWVudFByb3ZpZGVyIHByb3ZpZGVyID0gZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCQlpZiAocHJvdmlkZXIgaW5zdGFuY2VvZiBJRG9jdW1lbnRQcm92aWRlckV4dGVuc2lvbjQpIHsKLQkJCXRyeSB7Ci0JCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSAoKElEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uNCkgcHJvdmlkZXIpLmdldENvbnRlbnRUeXBlKGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJCWlmICh0eXBlICE9IG51bGwpCi0JCQkJCWNvbnRlbnRUeXBlID0gdHlwZS5nZXRJZCgpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8qCi0JCQkJICogQSBmYWlsdXJlIGFjY2Vzc2luZyB0aGUgdW5kZXJseWluZyBzdG9yZSByZWFsbHkgaXNuJ3QKLQkJCQkgKiBpbnRlcmVzdGluZywgYWx0aG91Z2ggaXQgY2FuIGJlIGEgcHJvYmxlbSBmb3IKLQkJCQkgKiBJU3RvcmFnZUVkaXRvcklucHV0cy4KLQkJCQkgKi8KLQkJCX0KLQkJfQotCi0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBtZ3IuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCWNvbnRlbnRUeXBlID0gbW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb250ZW50VHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVCcmVha3BvaW50cyhpbnQgbGluZU51bWJlcikgewotCQlJQnJlYWtwb2ludE1hbmFnZXIgYnJlYWtwb2ludE1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKTsKLQkJSUJyZWFrcG9pbnRbXSBicmVha3BvaW50cyA9IGdldEJyZWFrcG9pbnRzKGdldE1hcmtlcnMoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnJlYWtwb2ludHMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJYnJlYWtwb2ludHNbaV0uZ2V0TWFya2VyKCkuZGVsZXRlKCk7Ci0JCQkJYnJlYWtwb2ludE1hbmFnZXIucmVtb3ZlQnJlYWtwb2ludChicmVha3BvaW50c1tpXSwgdHJ1ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaW50IGxpbmVOdW1iZXIgPSBmUnVsZXJJbmZvLmdldExpbmVPZkxhc3RNb3VzZUJ1dHRvbkFjdGl2aXR5KCkgKyAxOwotCQlib29sZWFuIGRvQWRkID0gIWhhc01hcmtlcnMoKTsKLQkJaWYgKGRvQWRkKQotCQkJY3JlYXRlQnJlYWtwb2ludHMobGluZU51bWJlcik7Ci0JCWVsc2UKLQkJCXJlbW92ZUJyZWFrcG9pbnRzKGxpbmVOdW1iZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlI3VwZGF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9Ub2dnbGVCcmVha3BvaW50c1RhcmdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL1RvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YzhjNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL1RvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklCcmVha3BvaW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLS8qKgotICogQGF1dGhvciBuc2QKLSAqLwotcHVibGljIGNsYXNzIFRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0IGltcGxlbWVudHMgSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0IHsKLQlzdGF0aWMgZmluYWwgSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0IGluc3RhbmNlID0gbmV3IFRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0KCk7Ci0KLQlwdWJsaWMgc3RhdGljIElUb2dnbGVCcmVha3BvaW50c1RhcmdldCBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklUb2dnbGVCcmVha3BvaW50c1RhcmdldCNjYW5Ub2dnbGVMaW5lQnJlYWtwb2ludHMob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVG9nZ2xlTGluZUJyZWFrcG9pbnRzKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlUZXh0RWRpdG9yIGVkaXRvciA9IChJVGV4dEVkaXRvcikgcGFydC5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBlZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgPiAtMSkgewotCQkJCWludCBsaW5lTnVtYmVyID0gLTE7Ci0JCQkJdHJ5IHsKLQkJCQkJbGluZU51bWJlciA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldCh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJaWYgKGxpbmVOdW1iZXIgPj0gMCkgewotCQkJCQlUb2dnbGVCcmVha3BvaW50QWN0aW9uIHRvZ2dsZXIgPSBuZXcgVG9nZ2xlQnJlYWtwb2ludEFjdGlvbihlZGl0b3IsIG51bGwpOwotCQkJCQl0b2dnbGVyLnVwZGF0ZSgpOwotCQkJCQlyZXR1cm4gdG9nZ2xlci5pc0VuYWJsZWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQjY2FuVG9nZ2xlTWV0aG9kQnJlYWtwb2ludHMob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVG9nZ2xlTWV0aG9kQnJlYWtwb2ludHMoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQjY2FuVG9nZ2xlV2F0Y2hwb2ludHMob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVG9nZ2xlV2F0Y2hwb2ludHMoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgSUJyZWFrcG9pbnRbXSBnZXRCcmVha3BvaW50cyhJUmVzb3VyY2UgcmVzb3VyY2UsIElEb2N1bWVudCBkb2N1bWVudCwgQWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWwgbW9kZWwsIGludCBsaW5lTnVtYmVyKSB7Ci0JCUxpc3QgbWFya2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgbW9kZWwgIT0gbnVsbCAmJiByZXNvdXJjZS5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlJTWFya2VyW10gYWxsTWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKElCcmVha3BvaW50LkxJTkVfQlJFQUtQT0lOVF9NQVJLRVIsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQlpZiAoYWxsTWFya2VycyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsTWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQkJUG9zaXRpb24gcCA9IG1vZGVsLmdldE1hcmtlclBvc2l0aW9uKGFsbE1hcmtlcnNbaV0pOwotCQkJCQkJaW50IG1hcmtlckxpbmUgPSAtMTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbWFya2VyTGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChwLmdldE9mZnNldCgpKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlMSkgewotCQkJCQkJfQotCQkJCQkJaWYgKG1hcmtlckxpbmUgPT0gbGluZU51bWJlcikgewotCQkJCQkJCW1hcmtlcnMuYWRkKGFsbE1hcmtlcnNbaV0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24geCkgewotCQkJfQotCQl9Ci0JCUlCcmVha3BvaW50TWFuYWdlciBtYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCk7Ci0JCUxpc3QgYnJlYWtwb2ludHMgPSBuZXcgQXJyYXlMaXN0KG1hcmtlcnMuc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlJQnJlYWtwb2ludCBicmVha3BvaW50ID0gbWFuYWdlci5nZXRCcmVha3BvaW50KChJTWFya2VyKSBtYXJrZXJzLmdldChpKSk7Ci0JCQlpZiAoYnJlYWtwb2ludCAhPSBudWxsKSB7Ci0JCQkJYnJlYWtwb2ludHMuYWRkKGJyZWFrcG9pbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSUJyZWFrcG9pbnRbXSkgYnJlYWtwb2ludHMudG9BcnJheShuZXcgSUJyZWFrcG9pbnRbMF0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQjdG9nZ2xlTGluZUJyZWFrcG9pbnRzKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHRvZ2dsZUxpbmVCcmVha3BvaW50cyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJVGV4dEVkaXRvciBlZGl0b3IgPSAoSVRleHRFZGl0b3IpIHBhcnQuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlpbnQgbGluZU51bWJlciA9IC0xOwotCQkJdHJ5IHsKLQkJCQlsaW5lTnVtYmVyID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCWlmIChsaW5lTnVtYmVyID49IDApIHsKLQkJCQlUb2dnbGVCcmVha3BvaW50QWN0aW9uIHRvZ2dsZXIgPSBuZXcgVG9nZ2xlQnJlYWtwb2ludEFjdGlvbihlZGl0b3IsIG51bGwpOwotCQkJCXRvZ2dsZXIudXBkYXRlKCk7Ci0JCQkJaWYgKHRvZ2dsZXIuaXNFbmFibGVkKCkpIHsKLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gdG9nZ2xlci5nZXRSZXNvdXJjZSgpOwotCQkJCQlBYnN0cmFjdE1hcmtlckFubm90YXRpb25Nb2RlbCBtb2RlbCA9IHRvZ2dsZXIuZ2V0QW5ub3RhdGlvbk1vZGVsKCk7Ci0JCQkJCUlCcmVha3BvaW50W10gYnJlYWtwb2ludHMgPSBnZXRCcmVha3BvaW50cyhyZXNvdXJjZSwgZG9jdW1lbnQsIG1vZGVsLCBsaW5lTnVtYmVyKTsKLQkJCQkJaWYgKGJyZWFrcG9pbnRzLmxlbmd0aCA+IDApIHsKLQkJCQkJCUlCcmVha3BvaW50TWFuYWdlciBicmVha3BvaW50TWFuYWdlciA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBicmVha3BvaW50cy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWJyZWFrcG9pbnRzW2ldLmdldE1hcmtlcigpLmRlbGV0ZSgpOwotCQkJCQkJCWJyZWFrcG9pbnRNYW5hZ2VyLnJlbW92ZUJyZWFrcG9pbnQoYnJlYWtwb2ludHNbaV0sIHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdG9nZ2xlci5jcmVhdGVCcmVha3BvaW50cyhsaW5lTnVtYmVyICsgMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0I3RvZ2dsZU1ldGhvZEJyZWFrcG9pbnRzKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHRvZ2dsZU1ldGhvZEJyZWFrcG9pbnRzKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklUb2dnbGVCcmVha3BvaW50c1RhcmdldCN0b2dnbGVXYXRjaHBvaW50cyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0b2dnbGVXYXRjaHBvaW50cyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvSFRNTDJUZXh0UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVyaXZlZC9IVE1MMlRleHRSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdhYzhjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVyaXZlZC9IVE1MMlRleHRSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlcml2ZWQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHVzaGJhY2tSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotCi0vKgotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSFRNTDJUZXh0UmVhZGVyIE1vZGlmaWNhdGlvbnMKLSAqIHdlcmUgbWFkZSB0byBhZGQgYnIvIHRhZyBhbmQgZml4IHdhcm5pbmdzCi0gKi8KLS8qKgotICogUmVhZHMgdGhlIHRleHQgY29udGVudHMgZnJvbSBhIHJlYWRlciBvZiBIVE1MIGNvbnRlbnRzIGFuZCB0cmFuc2xhdGVzIHRoZQotICogdGFncyBvciBjdXQgdGhlbSBvdXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MMlRleHRSZWFkZXIgZXh0ZW5kcyBTdWJzdGl0dXRpb25UZXh0UmVhZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkc9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIGZnRW50aXR5TG9va3VwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNldCBmZ1RhZ3M7Ci0KLQlzdGF0aWMgewotCi0JCWZnVGFncz0gbmV3IEhhc2hTZXQoKTsKLQkJZmdUYWdzLmFkZCgiYiIpOyAvLyROT04tTkxTLTEkCi0JCWZnVGFncy5hZGQoImJyIik7IC8vJE5PTi1OTFMtMSQKLQkJZmdUYWdzLmFkZCgiYnIvIik7Ly8kTk9OLU5MUy0xJAotCQlmZ1RhZ3MuYWRkKCJoNSIpOyAvLyROT04tTkxTLTEkCi0JCWZnVGFncy5hZGQoInAiKTsgLy8kTk9OLU5MUy0xJAotCQlmZ1RhZ3MuYWRkKCJkbCIpOyAvLyROT04tTkxTLTEkCi0JCWZnVGFncy5hZGQoImR0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZmdUYWdzLmFkZCgiZGQiKTsgLy8kTk9OLU5MUy0xJAotCQlmZ1RhZ3MuYWRkKCJsaSIpOyAvLyROT04tTkxTLTEkCi0JCWZnVGFncy5hZGQoInVsIik7IC8vJE5PTi1OTFMtMSQKLQkJZmdUYWdzLmFkZCgicHJlIik7IC8vJE5PTi1OTFMtMSQKLQotCQlmZ0VudGl0eUxvb2t1cD0gbmV3IEhhc2hNYXAoNyk7Ci0JCWZnRW50aXR5TG9va3VwLnB1dCgibHQiLCAiPCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmdFbnRpdHlMb29rdXAucHV0KCJndCIsICI+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZ0VudGl0eUxvb2t1cC5wdXQoIm5ic3AiLCAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmdFbnRpdHlMb29rdXAucHV0KCJhbXAiLCAiJiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmdFbnRpdHlMb29rdXAucHV0KCJjaXJjIiwgIl4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZnRW50aXR5TG9va3VwLnB1dCgidGlsZGUiLCAifiIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJZmdFbnRpdHlMb29rdXAucHV0KCJxdW90IiwgIlwiIik7CQkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHJpdmF0ZSBpbnQgZkNvdW50ZXI9IDA7Ci0JcHJpdmF0ZSBUZXh0UHJlc2VudGF0aW9uIGZUZXh0UHJlc2VudGF0aW9uOwotCXByaXZhdGUgaW50IGZCb2xkPSAwOwotCXByaXZhdGUgaW50IGZTdGFydE9mZnNldD0gLTE7Ci0JcHJpdmF0ZSBib29sZWFuIGZJblBhcmFncmFwaD0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc1ByZWZvcm1hdHRlZFRleHQ9IGZhbHNlOwotCi0JLyoqCi0JICogVHJhbnNmb3JtcyB0aGUgaHRtbCB0ZXh0IGZyb20gdGhlIHJlYWRlciB0byBmb3JtYXR0ZWQgdGV4dC4KLQkgKiBAcGFyYW0gcHJlc2VudGF0aW9uIElmIG5vdCA8Y29kZT5udWxsPC9jb2RlPiwgZm9ybWF0dGluZ3Mgd2lsbCBiZSBhcHBsaWVkIHRvCi0JICogdGhlIHByZXNlbnRhdGlvbi4KLQkqLwotCXB1YmxpYyBIVE1MMlRleHRSZWFkZXIoUmVhZGVyIHJlYWRlciwgVGV4dFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24pIHsKLQkJc3VwZXIobmV3IFB1c2hiYWNrUmVhZGVyKHJlYWRlcikpOwotCQlmVGV4dFByZXNlbnRhdGlvbj0gcHJlc2VudGF0aW9uOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBjPSBzdXBlci5yZWFkKCk7Ci0JCWlmIChjICE9IC0xKQotCQkJKysgZkNvdW50ZXI7Ci0JCXJldHVybiBjOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0YXJ0Qm9sZCgpIHsKLQkJaWYgKGZCb2xkID09IDApCi0JCQlmU3RhcnRPZmZzZXQ9IGZDb3VudGVyOwotCQkrKyBmQm9sZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdGFydFByZWZvcm1hdHRlZFRleHQoKSB7Ci0JCWZJc1ByZWZvcm1hdHRlZFRleHQ9IHRydWU7Ci0JCXNldFNraXBXaGl0ZXNwYWNlKGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9wUHJlZm9ybWF0dGVkVGV4dCgpIHsKLQkJZklzUHJlZm9ybWF0dGVkVGV4dD0gZmFsc2U7Ci0JCXNldFNraXBXaGl0ZXNwYWNlKHRydWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3BCb2xkKCkgewotCQktLSBmQm9sZDsKLQkJaWYgKGZCb2xkID09IDApIHsKLQkJCWlmIChmVGV4dFByZXNlbnRhdGlvbiAhPSBudWxsKSB7Ci0JCQkJZlRleHRQcmVzZW50YXRpb24uYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZShmU3RhcnRPZmZzZXQsIGZDb3VudGVyIC0gZlN0YXJ0T2Zmc2V0LCBudWxsLCBudWxsLCBTV1QuQk9MRCkpOwotCQkJfQotCQkJZlN0YXJ0T2Zmc2V0PSAtMTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5TdWJzdGl0dXRpb25UZXh0UmVhZGVyI2NvbXB1dGVTdWJzdGl0dXRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZVN1YnN0aXR1dGlvbihpbnQgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlpZiAoYyA9PSAnPCcpCi0JCQlyZXR1cm4gIHByb2Nlc3NIVE1MVGFnKCk7Ci0JCWVsc2UgaWYgKGMgPT0gJyYnKQotCQkJcmV0dXJuIHByb2Nlc3NFbnRpdHkoKTsKLQkJZWxzZSBpZiAoZklzUHJlZm9ybWF0dGVkVGV4dCkKLQkJCXJldHVybiBwcm9jZXNzUHJlZm9ybWF0dGVkVGV4dChjKTsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBodG1sMlRleHQoU3RyaW5nIGh0bWwpIHsKLQotCQlpZiAoaHRtbCA9PSBudWxsIHx8IGh0bWwubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0KLQkJU3RyaW5nIHRhZz0gaHRtbDsKLQkJaWYgKCcvJyA9PSB0YWcuY2hhckF0KDApKQotCQkJdGFnPSB0YWcuc3Vic3RyaW5nKDEpOwotCi0JCWlmICghZmdUYWdzLmNvbnRhaW5zKHRhZykpCi0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwotCi0KLQkJaWYgKCJwcmUiLmVxdWFscyhodG1sKSkgeyAvLyROT04tTkxTLTEkCi0JCQlzdGFydFByZWZvcm1hdHRlZFRleHQoKTsKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0JCX0KLQotCQlpZiAoIi9wcmUiLmVxdWFscyhodG1sKSkgeyAvLyROT04tTkxTLTEkCi0JCQlzdG9wUHJlZm9ybWF0dGVkVGV4dCgpOwotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQkJfQotCi0JCWlmIChmSXNQcmVmb3JtYXR0ZWRUZXh0KQotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQotCQlpZiAoImIiLmVxdWFscyhodG1sKSkgeyAvLyROT04tTkxTLTEkCi0JCQlzdGFydEJvbGQoKTsKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0JCX0KLQotCQlpZiAoImg1Ii5lcXVhbHMoaHRtbCkgfHwgImR0Ii5lcXVhbHMoaHRtbCkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlzdGFydEJvbGQoKTsKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0JCX0KLQotCQlpZiAoImRsIi5lcXVhbHMoaHRtbCkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBMSU5FX0RFTElNOwotCi0JCWlmICgiZGQiLmVxdWFscyhodG1sKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuICJcdCI7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoImxpIi5lcXVhbHMoaHRtbCkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBMSU5FX0RFTElNICsgIlx0IiArICItICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWlmICgiL2IiLmVxdWFscyhodG1sKSkgeyAvLyROT04tTkxTLTEkCi0JCQlzdG9wQm9sZCgpOwotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQkJfQotCi0JCWlmICgicCIuZXF1YWxzKGh0bWwpKSAgeyAvLyROT04tTkxTLTEkCi0JCQlmSW5QYXJhZ3JhcGg9IHRydWU7Ci0JCQlyZXR1cm4gTElORV9ERUxJTTsKLQkJfQotCi0JCWlmICgiYnIiLmVxdWFscyhodG1sKSB8fCAiYnIvIi5lcXVhbHMoaHRtbCkpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIExJTkVfREVMSU07Ci0KLQkJaWYgKCIvcCIuZXF1YWxzKGh0bWwpKSAgeyAvLyROT04tTkxTLTEkCi0JCQlib29sZWFuIGluUGFyYWdyYXBoPSBmSW5QYXJhZ3JhcGg7Ci0JCQlmSW5QYXJhZ3JhcGg9IGZhbHNlOwotCQkJcmV0dXJuIGluUGFyYWdyYXBoID8gRU1QVFlfU1RSSU5HIDogTElORV9ERUxJTTsKLQkJfQotCi0JCWlmICgiL2g1Ii5lcXVhbHMoaHRtbCkgfHwgIi9kdCIuZXF1YWxzKGh0bWwpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJc3RvcEJvbGQoKTsKLQkJCXJldHVybiBMSU5FX0RFTElNOwotCQl9Ci0KLQkJaWYgKCIvZGQiLmVxdWFscyhodG1sKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIExJTkVfREVMSU07Ci0KLQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQl9Ci0KLQkvKgotCSAqIEEgJzwnIGhhcyBiZWVuIHJlYWQuIFByb2Nlc3MgYSBodG1sIHRhZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIHByb2Nlc3NIVE1MVGFnKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlTdHJpbmdCdWZmZXIgYnVmPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBjaDsKLQkJZG8gewotCi0JCQljaD0gbmV4dENoYXIoKTsKLQotCQkJd2hpbGUgKGNoICE9IC0xICYmIGNoICE9ICc+JykgewotCQkJCWJ1Zi5hcHBlbmQoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKChjaGFyKSBjaCkpOwotCQkJCWNoPSBuZXh0Q2hhcigpOwotCQkJCWlmIChjaCA9PSAnIicpewotCQkJCQlidWYuYXBwZW5kKENoYXJhY3Rlci50b0xvd2VyQ2FzZSgoY2hhcikgY2gpKTsKLQkJCQkJY2g9IG5leHRDaGFyKCk7Ci0JCQkJCXdoaWxlIChjaCAhPSAtMSAmJiBjaCAhPSAnIicpewotCQkJCQkJYnVmLmFwcGVuZChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoKGNoYXIpIGNoKSk7Ci0JCQkJCQljaD0gbmV4dENoYXIoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoY2ggPT0gJzwnKXsKLQkJCQkJdW5yZWFkKGNoKTsKLQkJCQkJcmV0dXJuICc8JyArIGJ1Zi50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGNoID09IC0xKQotCQkJCXJldHVybiBudWxsOwotCi0JCQlpbnQgdGFnTGVuPSBidWYubGVuZ3RoKCk7Ci0JCQkvLyBuZWVkcyBzcGVjaWFsIHRyZWF0bWVudCBmb3IgY29tbWVudHMKLQkJCWlmICgodGFnTGVuID49IDMgJiYgIiEtLSIuZXF1YWxzKGJ1Zi5zdWJzdHJpbmcoMCwgMykpKSAvLyROT04tTkxTLTEkCi0JCQkJJiYgISh0YWdMZW4gPj0gNSAmJiAiLS0iLmVxdWFscyhidWYuc3Vic3RyaW5nKHRhZ0xlbiAtIDIpKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIHVuZmluaXNoZWQgY29tbWVudAotCQkJCWJ1Zi5hcHBlbmQoY2gpOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSB3aGlsZSAodHJ1ZSk7Ci0KLQkJcmV0dXJuIGh0bWwyVGV4dChidWYudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcHJvY2Vzc1ByZWZvcm1hdHRlZFRleHQoaW50IGMpIHsKLQkJaWYgIChjID09ICdccicgfHwgYyA9PSAnXG4nKQotCQkJZkNvdW50ZXIrKzsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgdW5yZWFkKGludCBjaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJKChQdXNoYmFja1JlYWRlcikgZ2V0UmVhZGVyKCkpLnVucmVhZChjaCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBlbnRpdHkyVGV4dChTdHJpbmcgc3ltYm9sKSB7Ci0JCWlmIChzeW1ib2wubGVuZ3RoKCkgPiAxICYmIHN5bWJvbC5jaGFyQXQoMCkgPT0gJyMnKSB7Ci0JCQlpbnQgY2g7Ci0JCQl0cnkgewotCQkJCWlmIChzeW1ib2wuY2hhckF0KDEpID09ICd4JykgewotCQkJCQljaD0gSW50ZWdlci5wYXJzZUludChzeW1ib2wuc3Vic3RyaW5nKDIpLCAxNik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2g9IEludGVnZXIucGFyc2VJbnQoc3ltYm9sLnN1YnN0cmluZygxKSwgMTApOwotCQkJCX0KLQkJCQlyZXR1cm4gRU1QVFlfU1RSSU5HICsgKGNoYXIpY2g7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCS8vIGxvZyBwcm9ibGVtPwotCQkJfQotCQl9IGVsc2UgewotCQkJU3RyaW5nIHN0cj0gKFN0cmluZykgZmdFbnRpdHlMb29rdXAuZ2V0KHN5bWJvbCk7Ci0JCQlpZiAoc3RyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gc3RyOwotCQkJfQotCQl9Ci0JCXJldHVybiAiJiIgKyBzeW1ib2w7IC8vIG5vdCBmb3VuZCAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiBBICcmJyBoYXMgYmVlbiByZWFkLiBQcm9jZXNzIGEgZW50aXR5Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgcHJvY2Vzc0VudGl0eSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1ZmZlciBidWY9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGNoPSBuZXh0Q2hhcigpOwotCQl3aGlsZSAoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdCgoY2hhciljaCkgfHwgY2ggPT0gJyMnKSB7Ci0JCQlidWYuYXBwZW5kKChjaGFyKSBjaCk7Ci0JCQljaD0gbmV4dENoYXIoKTsKLQkJfQotCi0JCWlmIChjaCA9PSAnOycpCi0JCQlyZXR1cm4gZW50aXR5MlRleHQoYnVmLnRvU3RyaW5nKCkpOwotCi0JCWJ1Zi5pbnNlcnQoMCwgJyYnKTsKLQkJaWYgKGNoICE9IC0xKQotCQkJYnVmLmFwcGVuZCgoY2hhcikgY2gpOwotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvSFRNTFRleHRQcmVzZW50ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZXJpdmVkL0hUTUxUZXh0UHJlc2VudGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZmEyODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvSFRNTFRleHRQcmVzZW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZXJpdmVkOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoKLSAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkhUTUxUZXh0UHJlc2VudGVyCi0gKiBNb2RpZmljYXRpb25zIHdlcmUgbWFkZSB0byB1c2Ugb3duIExvZ2dlciB0byBsb2cgZXhjZXB0aW9uLCBhbmQgdGhlCi0gKiBlbGxpcHNlcyBjb25zdGFudAotICovCi1wdWJsaWMgY2xhc3MgSFRNTFRleHRQcmVzZW50ZXIgaW1wbGVtZW50cyBEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sLklJbmZvcm1hdGlvblByZXNlbnRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMTElQU0VTID0gIi4uLiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9ERUxJTSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLCAiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIGludCBmQ291bnRlcjsKLQlwcml2YXRlIGJvb2xlYW4gZkVuZm9yY2VVcHBlckxpbmVMaW1pdDsKLQotCXB1YmxpYyBIVE1MVGV4dFByZXNlbnRlcihib29sZWFuIGVuZm9yY2VVcHBlckxpbmVMaW1pdCkgewotCQlzdXBlcigpOwotCQlmRW5mb3JjZVVwcGVyTGluZUxpbWl0ID0gZW5mb3JjZVVwcGVyTGluZUxpbWl0OwotCX0KLQotCXB1YmxpYyBIVE1MVGV4dFByZXNlbnRlcigpIHsKLQkJdGhpcyh0cnVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVhZGVyIGNyZWF0ZVJlYWRlcihTdHJpbmcgaG92ZXJJbmZvLCBUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbikgewotCQlyZXR1cm4gbmV3IEhUTUwyVGV4dFJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKGhvdmVySW5mbyksIHByZXNlbnRhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRhcHRUZXh0UHJlc2VudGF0aW9uKFRleHRQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uLCBpbnQgb2Zmc2V0LCBpbnQgaW5zZXJ0TGVuZ3RoKSB7Ci0KLQkJaW50IHlvdXJzU3RhcnQgPSBvZmZzZXQ7Ci0JCWludCB5b3Vyc0VuZCA9IG9mZnNldCArIGluc2VydExlbmd0aCAtIDE7Ci0JCXlvdXJzRW5kID0gTWF0aC5tYXgoeW91cnNTdGFydCwgeW91cnNFbmQpOwotCi0JCUl0ZXJhdG9yIGUgPSBwcmVzZW50YXRpb24uZ2V0QWxsU3R5bGVSYW5nZUl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCi0JCQlTdHlsZVJhbmdlIHJhbmdlID0gKFN0eWxlUmFuZ2UpIGUubmV4dCgpOwotCi0JCQlpbnQgbXlTdGFydCA9IHJhbmdlLnN0YXJ0OwotCQkJaW50IG15RW5kID0gcmFuZ2Uuc3RhcnQgKyByYW5nZS5sZW5ndGggLSAxOwotCQkJbXlFbmQgPSBNYXRoLm1heChteVN0YXJ0LCBteUVuZCk7Ci0KLQkJCWlmIChteUVuZCA8IHlvdXJzU3RhcnQpCi0JCQkJY29udGludWU7Ci0KLQkJCWlmIChteVN0YXJ0IDwgeW91cnNTdGFydCkKLQkJCQlyYW5nZS5sZW5ndGggKz0gaW5zZXJ0TGVuZ3RoOwotCQkJZWxzZQotCQkJCXJhbmdlLnN0YXJ0ICs9IGluc2VydExlbmd0aDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhcHBlbmQoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHN0cmluZywgVGV4dFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24pIHsKLQotCQlpbnQgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlidWZmZXIuYXBwZW5kKHN0cmluZyk7Ci0KLQkJaWYgKHByZXNlbnRhdGlvbiAhPSBudWxsKQotCQkJYWRhcHRUZXh0UHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbiwgZkNvdW50ZXIsIGxlbmd0aCk7Ci0KLQkJZkNvdW50ZXIgKz0gbGVuZ3RoOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEluZGVudChTdHJpbmcgbGluZSkgewotCQlpbnQgbGVuZ3RoID0gbGluZS5sZW5ndGgoKTsKLQotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpIDwgbGVuZ3RoICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UobGluZS5jaGFyQXQoaSkpKQotCQkJKytpOwotCi0JCXJldHVybiAoaSA9PSBsZW5ndGggPyBsaW5lIDogbGluZS5zdWJzdHJpbmcoMCwgaSkpICsgIiAiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiBAc2VlIElIb3ZlckluZm9ybWF0aW9uUHJlc2VudGVyI3VwZGF0ZVByZXNlbnRhdGlvbihEaXNwbGF5IGRpc3BsYXksCi0JICogICAgICBTdHJpbmcsIFRleHRQcmVzZW50YXRpb24sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdXBkYXRlUHJlc2VudGF0aW9uKERpc3BsYXkgZGlzcGxheSwgU3RyaW5nIGhvdmVySW5mbywgVGV4dFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24sIGludCBtYXhXaWR0aCwgaW50IG1heEhlaWdodCkgewotCi0JCWlmIChob3ZlckluZm8gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUdDIGdjID0gbmV3IEdDKGRpc3BsYXkpOwotCQl0cnkgewotCi0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJaW50IG1heE51bWJlck9mTGluZXMgPSBNYXRoLnJvdW5kKG1heEhlaWdodCAvIGdjLmdldEZvbnRNZXRyaWNzKCkuZ2V0SGVpZ2h0KCkpOwotCi0JCQlmQ291bnRlciA9IDA7Ci0JCQlMaW5lQnJlYWtpbmdSZWFkZXIgcmVhZGVyID0gbmV3IExpbmVCcmVha2luZ1JlYWRlcihjcmVhdGVSZWFkZXIoaG92ZXJJbmZvLCBwcmVzZW50YXRpb24pLCBnYywgbWF4V2lkdGgpOwotCi0JCQlib29sZWFuIGxhc3RMaW5lRm9ybWF0dGVkID0gZmFsc2U7Ci0JCQlTdHJpbmcgbGFzdExpbmVJbmRlbnQgPSBudWxsOwotCi0JCQlTdHJpbmcgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotCQkJYm9vbGVhbiBsaW5lRm9ybWF0dGVkID0gcmVhZGVyLmlzRm9ybWF0dGVkTGluZSgpOwotCQkJYm9vbGVhbiBmaXJzdExpbmVQcm9jZXNzZWQgPSBmYWxzZTsKLQotCQkJd2hpbGUgKGxpbmUgIT0gbnVsbCkgewotCi0JCQkJaWYgKGZFbmZvcmNlVXBwZXJMaW5lTGltaXQgJiYgbWF4TnVtYmVyT2ZMaW5lcyA8PSAwKQotCQkJCQlicmVhazsKLQotCQkJCWlmIChmaXJzdExpbmVQcm9jZXNzZWQpIHsKLQkJCQkJaWYgKCFsYXN0TGluZUZvcm1hdHRlZCkKLQkJCQkJCWFwcGVuZChidWZmZXIsIExJTkVfREVMSU0sIG51bGwpOwotCQkJCQllbHNlIHsKLQkJCQkJCWFwcGVuZChidWZmZXIsIExJTkVfREVMSU0sIHByZXNlbnRhdGlvbik7Ci0JCQkJCQlpZiAobGFzdExpbmVJbmRlbnQgIT0gbnVsbCkKLQkJCQkJCQlhcHBlbmQoYnVmZmVyLCBsYXN0TGluZUluZGVudCwgcHJlc2VudGF0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWFwcGVuZChidWZmZXIsIGxpbmUsIG51bGwpOwotCQkJCWZpcnN0TGluZVByb2Nlc3NlZCA9IHRydWU7Ci0KLQkJCQlsYXN0TGluZUZvcm1hdHRlZCA9IGxpbmVGb3JtYXR0ZWQ7Ci0JCQkJaWYgKCFsaW5lRm9ybWF0dGVkKQotCQkJCQlsYXN0TGluZUluZGVudCA9IG51bGw7Ci0JCQkJZWxzZSBpZiAobGFzdExpbmVJbmRlbnQgPT0gbnVsbCkKLQkJCQkJbGFzdExpbmVJbmRlbnQgPSBnZXRJbmRlbnQobGluZSk7Ci0KLQkJCQlsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJbGluZUZvcm1hdHRlZCA9IHJlYWRlci5pc0Zvcm1hdHRlZExpbmUoKTsKLQotCQkJCW1heE51bWJlck9mTGluZXMtLTsKLQkJCX0KLQotCQkJaWYgKGxpbmUgIT0gbnVsbCAmJiBidWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJYXBwZW5kKGJ1ZmZlciwgTElORV9ERUxJTSwgbGluZUZvcm1hdHRlZCA/IHByZXNlbnRhdGlvbiA6IG51bGwpOwotCQkJCWFwcGVuZChidWZmZXIsIEVMTElQU0VTLCBwcmVzZW50YXRpb24pOwotCQkJfQotCi0JCQlyZXR1cm4gdHJpbShidWZmZXIsIHByZXNlbnRhdGlvbik7Ci0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIHRyaW0oU3RyaW5nQnVmZmVyIGJ1ZmZlciwgVGV4dFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24pIHsKLQotCQlpbnQgbGVuZ3RoID0gYnVmZmVyLmxlbmd0aCgpOwotCi0JCWludCBlbmQgPSBsZW5ndGggLSAxOwotCQl3aGlsZSAoZW5kID49IDAgJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShidWZmZXIuY2hhckF0KGVuZCkpKQotCQkJLS1lbmQ7Ci0KLQkJaWYgKGVuZCA9PSAtMSkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChlbmQgPCBsZW5ndGggLSAxKQotCQkJYnVmZmVyLmRlbGV0ZShlbmQgKyAxLCBsZW5ndGgpOwotCQllbHNlCi0JCQllbmQgPSBsZW5ndGg7Ci0KLQkJaW50IHN0YXJ0ID0gMDsKLQkJd2hpbGUgKHN0YXJ0IDwgZW5kICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYnVmZmVyLmNoYXJBdChzdGFydCkpKQotCQkJKytzdGFydDsKLQotCQlidWZmZXIuZGVsZXRlKDAsIHN0YXJ0KTsKLQkJcHJlc2VudGF0aW9uLnNldFJlc3VsdFdpbmRvdyhuZXcgUmVnaW9uKHN0YXJ0LCBidWZmZXIubGVuZ3RoKCkpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZXJpdmVkL0xpbmVCcmVha2luZ1JlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvTGluZUJyZWFraW5nUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTU0NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvTGluZUJyZWFraW5nUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVyaXZlZDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkJyZWFrSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci0KLS8qKgotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuTGluZUJyZWFraW5nUmVhZGVyLgotICogTW9kaWZpY2F0aW9ucyB3ZXJlIG1hZGUgdG8gZml4IHdhcm5pbmdzLgotICovCi0vKgotICogTm90IGEgcmVhbCByZWFkZXIuIENvdWxkIGNoYW5nZSBpZiByZXF1ZXN0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmVCcmVha2luZ1JlYWRlciB7Ci0JcHJpdmF0ZSBHQyBmR0M7Ci0KLQlwcml2YXRlIFN0cmluZyBmTGluZTsKLQotCXByaXZhdGUgQnJlYWtJdGVyYXRvciBmTGluZUJyZWFrSXRlcmF0b3I7Ci0JcHJpdmF0ZSBpbnQgZk1heFdpZHRoOwotCXByaXZhdGUgaW50IGZPZmZzZXQ7Ci0KLQotCXByaXZhdGUgQnVmZmVyZWRSZWFkZXIgZlJlYWRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSByZWFkZXIgdGhhdCBicmVha3MgYW4gaW5wdXQgdGV4dCB0byBmaXQgaW4gYSBnaXZlbiB3aWR0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVhZGVyCi0JICogICAgICAgICAgICBSZWFkZXIgb2YgdGhlIGlucHV0IHRleHQKLQkgKiBAcGFyYW0gZ2MKLQkgKiAgICAgICAgICAgIFRoZSBncmFwaGljIGNvbnRleHQgdGhhdCBkZWZpbmVzIHRoZSBjdXJyZW50bHkgdXNlZCBmb250Ci0JICogICAgICAgICAgICBzaXplcwotCSAqIEBwYXJhbSBtYXhMaW5lV2lkdGgKLQkgKiAgICAgICAgICAgIFRoZSBtYXggd2lkdGggKHBpeGVzKSB3aGVyZSB0aGUgdGV4dCBoYXMgdG8gZml0IGluCi0JICovCi0JcHVibGljIExpbmVCcmVha2luZ1JlYWRlcihSZWFkZXIgcmVhZGVyLCBHQyBnYywgaW50IG1heExpbmVXaWR0aCkgewotCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHJlYWRlcik7Ci0JCWZHQyA9IGdjOwotCQlmTWF4V2lkdGggPSBtYXhMaW5lV2lkdGg7Ci0JCWZPZmZzZXQgPSAwOwotCQlmTGluZSA9IG51bGw7Ci0JCWZMaW5lQnJlYWtJdGVyYXRvciA9IEJyZWFrSXRlcmF0b3IuZ2V0TGluZUluc3RhbmNlKCk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZmluZE5leHRCcmVha09mZnNldChpbnQgY3Vyck9mZnNldCkgewotCQlpbnQgY3VycldpZHRoID0gMDsKLQkJaW50IG5leHRPZmZzZXQgPSBmTGluZUJyZWFrSXRlcmF0b3IuZm9sbG93aW5nKGN1cnJPZmZzZXQpOwotCQl3aGlsZSAobmV4dE9mZnNldCAhPSBCcmVha0l0ZXJhdG9yLkRPTkUpIHsKLQkJCVN0cmluZyB3b3JkID0gZkxpbmUuc3Vic3RyaW5nKGN1cnJPZmZzZXQsIG5leHRPZmZzZXQpOwotCQkJaW50IHdvcmRXaWR0aCA9IGZHQy50ZXh0RXh0ZW50KHdvcmQpLng7Ci0JCQlpbnQgbmV4dFdpZHRoID0gd29yZFdpZHRoICsgY3VycldpZHRoOwotCQkJaWYgKG5leHRXaWR0aCA+IGZNYXhXaWR0aCkgewotCQkJCWlmIChjdXJyV2lkdGggPiAwKSB7Ci0JCQkJCXJldHVybiBjdXJyT2Zmc2V0OwotCQkJCX0KLQkJCQlyZXR1cm4gbmV4dE9mZnNldDsKLQkJCX0KLQkJCWN1cnJXaWR0aCA9IG5leHRXaWR0aDsKLQkJCWN1cnJPZmZzZXQgPSBuZXh0T2Zmc2V0OwotCQkJbmV4dE9mZnNldCA9IGZMaW5lQnJlYWtJdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG5leHRPZmZzZXQ7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZmluZFdvcmRCZWdpbihpbnQgaWR4KSB7Ci0JCXdoaWxlIChpZHggPCBmTGluZS5sZW5ndGgoKSAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGZMaW5lLmNoYXJBdChpZHgpKSkgewotCQkJaWR4Kys7Ci0JCX0KLQkJcmV0dXJuIGlkeDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Zvcm1hdHRlZExpbmUoKSB7Ci0JCXJldHVybiBmTGluZSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlYWRzIHRoZSBuZXh0IGxpbmUuIFRoZSBsZW5ndGhzIG9mIHRoZSBsaW5lIHdpbGwgbm90IGV4Y2VlZCB0aGUgZ2l2ZWQKLQkgKiBtYXhpbXVtIHdpZHRoLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVhZExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZkxpbmUgPT0gbnVsbCkgewotCQkJU3RyaW5nIGxpbmUgPSBmUmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQlpZiAobGluZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCi0JCQlpbnQgbGluZUxlbiA9IGZHQy50ZXh0RXh0ZW50KGxpbmUpLng7Ci0JCQlpZiAobGluZUxlbiA8IGZNYXhXaWR0aCkgewotCQkJCXJldHVybiBsaW5lOwotCQkJfQotCQkJZkxpbmUgPSBsaW5lOwotCQkJZkxpbmVCcmVha0l0ZXJhdG9yLnNldFRleHQobGluZSk7Ci0JCQlmT2Zmc2V0ID0gMDsKLQkJfQotCQlpbnQgYnJlYWtPZmZzZXQgPSBmaW5kTmV4dEJyZWFrT2Zmc2V0KGZPZmZzZXQpOwotCQlTdHJpbmcgcmVzOwotCQlpZiAoYnJlYWtPZmZzZXQgIT0gQnJlYWtJdGVyYXRvci5ET05FKSB7Ci0JCQlyZXMgPSBmTGluZS5zdWJzdHJpbmcoZk9mZnNldCwgYnJlYWtPZmZzZXQpOwotCQkJZk9mZnNldCA9IGZpbmRXb3JkQmVnaW4oYnJlYWtPZmZzZXQpOwotCQkJaWYgKGZPZmZzZXQgPT0gZkxpbmUubGVuZ3RoKCkpIHsKLQkJCQlmTGluZSA9IG51bGw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXMgPSBmTGluZS5zdWJzdHJpbmcoZk9mZnNldCk7Ci0JCQlmTGluZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVyaXZlZC9TaW5nbGVDaGFyUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVyaXZlZC9TaW5nbGVDaGFyUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OTQ1ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvU2luZ2xlQ2hhclJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVyaXZlZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLS8qCi0gKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LmphdmFkb2MuU2luZ2xlQ2hhclJlYWRlci4KLSAqIE1vZGlmaWNhdGlvbiB3YXMgbWFkZSB0byBmaXggc3RhdGVtZW50IHVubmVjZXNzYXJpbHkgbmVzdGVkIHdpdGhpbiBlbHNlCi0gKiBjbGF1c2Ugd2FybmluZyBpbiByZWFkKC4uKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNpbmdsZUNoYXJSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjcmVhZCgpCi0JICovCi0JcHVibGljIGFic3RyYWN0IGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjcmVhZChjaGFyW10saW50LGludCkKLQkgKi8KLQlwdWJsaWMgaW50IHJlYWQoY2hhciBjYnVmW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBlbmQgPSBvZmYgKyBsZW47Ci0JCWZvciAoaW50IGkgPSBvZmY7IGkgPCBlbmQ7IGkrKykgewotCQkJaW50IGNoID0gcmVhZCgpOwotCQkJaWYgKGNoID09IC0xKSB7Ci0JCQkJaWYgKGkgPT0gb2ZmKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGkgLSBvZmY7Ci0JCQl9Ci0JCQljYnVmW2ldID0gKGNoYXIpIGNoOwotCQl9Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjcmVhZHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGVudCBhcyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGNoOwotCQl3aGlsZSAoKGNoID0gcmVhZCgpKSAhPSAtMSkgewotCQkJYnVmLmFwcGVuZCgoY2hhcikgY2gpOwotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVyaXZlZC9TdWJzdGl0dXRpb25UZXh0UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVyaXZlZC9TdWJzdGl0dXRpb25UZXh0UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMmE3OGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvU3Vic3RpdHV0aW9uVGV4dFJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlcml2ZWQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi0vKgotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuU3Vic3RpdHV0aW9uVGV4dFJlYWRlci4KLSAqIE1vZGlmaWNhdGlvbnMgd2VyZSBtYWRlIHRvIHJlYWQoKSB0byBhbGxvdyB3aGl0ZXNwYWNlcyBhbmQgZml4ZWQgc3RhdGVtZW50Ci0gKiB1bm5lY2Vzc2FyaWx5IG5lc3RlZCB3aXRoaW4gZWxzZSBjbGF1c2Ugd2FybmluZyBpbiBuZXh0Q2hhcigpCi0gKi8KLS8qKgotICogUmVhZHMgdGhlIHRleHQgY29udGVudHMgZnJvbSBhIHJlYWRlciBhbmQgY29tcHV0ZXMgZm9yIGVhY2ggY2hhcmFjdGVyIGEKLSAqIHBvdGVudGlhbCBzdWJzdGl0dXRpb24uIFRoZSBzdWJzdGl0dXRpb24gbWF5IGVhdCBtb3JlIGNoYXJhY3RlcnMgdGhhbiBvbmx5Ci0gKiB0aGUgb25lIHBhc3NlZCBpbnRvIHRoZSBjb21wdXRhdGlvbiByb3V0aW5lLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3Vic3RpdHV0aW9uVGV4dFJlYWRlciBleHRlbmRzIFNpbmdsZUNoYXJSZWFkZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9ERUxJTSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLCAiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIFJlYWRlciBmUmVhZGVyOwotCXByb3RlY3RlZCBib29sZWFuIGZXYXNXaGl0ZVNwYWNlOwotCXByaXZhdGUgaW50IGZDaGFyQWZ0ZXJXaGl0ZVNwYWNlOwotCi0JLyoqCi0JICogVGVsbHMgd2hldGhlciB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzIGFyZSBza2lwcGVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmU2tpcFdoaXRlU3BhY2UgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIGZSZWFkRnJvbUJ1ZmZlcjsKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBmQnVmZmVyOwotCXByaXZhdGUgaW50IGZJbmRleDsKLQotCi0JcHJvdGVjdGVkIFN1YnN0aXR1dGlvblRleHRSZWFkZXIoUmVhZGVyIHJlYWRlcikgewotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlmQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmSW5kZXggPSAwOwotCQlmUmVhZEZyb21CdWZmZXIgPSBmYWxzZTsKLQkJZkNoYXJBZnRlcldoaXRlU3BhY2UgPSAtMTsKLQkJZldhc1doaXRlU3BhY2UgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudCB0byBjb21wdXRlIHRoZSBzdWJzdGl0dXRpb24gZm9yIHRoZSBnaXZlbiBjaGFyYWN0ZXIgYW5kIGlmCi0JICogbmVjZXNzYXJ5IHN1YnNlcXVlbnQgY2hhcmFjdGVycy4gVXNlIDxjb2RlPm5leHRDaGFyPC9jb2RlPiB0byByZWFkCi0JICogc3Vic2VxdWVudCBjaGFyYWN0ZXJzLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgY29tcHV0ZVN1YnN0aXR1dGlvbihpbnQgYykgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW50ZXJuYWwgcmVhZGVyLgotCSAqLwotCXByb3RlY3RlZCBSZWFkZXIgZ2V0UmVhZGVyKCkgewotCQlyZXR1cm4gZlJlYWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZXh0IGNoYXJhY3Rlci4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IG5leHRDaGFyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZlJlYWRGcm9tQnVmZmVyID0gKGZCdWZmZXIubGVuZ3RoKCkgPiAwKTsKLQkJaWYgKGZSZWFkRnJvbUJ1ZmZlcikgewotCQkJY2hhciBjaCA9IGZCdWZmZXIuY2hhckF0KGZJbmRleCsrKTsKLQkJCWlmIChmSW5kZXggPj0gZkJ1ZmZlci5sZW5ndGgoKSkgewotCQkJCWZCdWZmZXIuc2V0TGVuZ3RoKDApOwotCQkJCWZJbmRleCA9IDA7Ci0JCQl9Ci0JCQlyZXR1cm4gY2g7Ci0JCX0KLQkJaW50IGNoID0gZkNoYXJBZnRlcldoaXRlU3BhY2U7Ci0JCWlmIChjaCA9PSAtMSkgewotCQkJY2ggPSBmUmVhZGVyLnJlYWQoKTsKLQkJfQotCQlpZiAoZlNraXBXaGl0ZVNwYWNlICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGNoYXIpIGNoKSkgewotCQkJZG8gewotCQkJCWNoID0gZlJlYWRlci5yZWFkKCk7Ci0JCQl9IHdoaWxlIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKSBjaCkpOwotCQkJaWYgKGNoICE9IC0xKSB7Ci0JCQkJZkNoYXJBZnRlcldoaXRlU3BhY2UgPSBjaDsKLQkJCQlyZXR1cm4gJyAnOwotCQkJfQotCQl9IGVsc2UgewotCQkJZkNoYXJBZnRlcldoaXRlU3BhY2UgPSAtMTsKLQkJfQotCQlyZXR1cm4gY2g7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjcmVhZCgpCi0JICovCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGM7Ci0JCWRvIHsKLQotCQkJYyA9IG5leHRDaGFyKCk7Ci0JCQl3aGlsZSAoIWZSZWFkRnJvbUJ1ZmZlcikgewotCQkJCVN0cmluZyBzID0gY29tcHV0ZVN1YnN0aXR1dGlvbihjKTsKLQkJCQlpZiAocyA9PSBudWxsKQotCQkJCQlicmVhazsKLQkJCQlpZiAocy5sZW5ndGgoKSA+IDApCi0JCQkJCWZCdWZmZXIuaW5zZXJ0KDAsIHMpOwotCQkJCWMgPSBuZXh0Q2hhcigpOwotCQkJfQotCi0JCX0gd2hpbGUgKGZTa2lwV2hpdGVTcGFjZSAmJiBmV2FzV2hpdGVTcGFjZSAmJiAoKGMgPT0gJyAnKSAmJiAhZlJlYWRGcm9tQnVmZmVyKSk7Ci0JCS8qCi0JCSAqIFNTRTogRm9yIGFib3ZlIGFuZCBiZWxvdyBjaGVjaywgaWYgd2hpdGVzcGFjZSBpcyByZWFkIGZyb20gYnVmZmVyLAotCQkgKiBkbyBub3Qgc2tpcAotCQkgKi8KLQkJZldhc1doaXRlU3BhY2UgPSAoKGMgPT0gJyAnICYmICFmUmVhZEZyb21CdWZmZXIpIHx8IGMgPT0gJ1xyJyB8fCBjID09ICdcbicpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkeSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZlJlYWRlci5yZWFkeSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVhZGVyI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZSZWFkZXIuY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmUmVhZGVyLnJlc2V0KCk7Ci0JCWZXYXNXaGl0ZVNwYWNlID0gdHJ1ZTsKLQkJZkNoYXJBZnRlcldoaXRlU3BhY2UgPSAtMTsKLQkJZkJ1ZmZlci5zZXRMZW5ndGgoMCk7Ci0JCWZJbmRleCA9IDA7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0U2tpcFdoaXRlc3BhY2UoYm9vbGVhbiBzdGF0ZSkgewotCQlmU2tpcFdoaXRlU3BhY2UgPSBzdGF0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1NraXBwaW5nV2hpdGVzcGFjZSgpIHsKLQkJcmV0dXJuIGZTa2lwV2hpdGVTcGFjZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdC91dGlsL1NoYXJlZEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdC91dGlsL1NoYXJlZEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOWIwYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXQvdXRpbC9TaGFyZWRFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLQotcHVibGljIGNsYXNzIFNoYXJlZEVkaXRvclBsdWdpbkltYWdlSGVscGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9DT0xMQVBTRUFMTCA9IEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRExDTF9DT0xMQVBTRUFMTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9ERUxFVEUgPSBFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RMQ0xfREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX1NZTkNFRCA9IEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRExDTF9TWU5DRUQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfQ09MTEFQU0VBTEwgPSBFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VMQ0xfQ09MTEFQU0VBTEw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfREVMRVRFID0gRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FTENMX0RFTEVURTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9TWU5DRUQgPSBFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VMQ0xfU1lOQ0VEOwotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBzcGVjaWZpZWQgaW1hZ2UgZnJvbSB0aGUgc291cmNlIGVkaXRvciBwbHVnaW4ncyBpbWFnZQotCSAqIHJlZ2lzdHJ5LiBOb3RlOiBUaGUgcmV0dXJuZWQgPGNvZGU+SW1hZ2U8L2NvZGU+IGlzIG1hbmFnZWQgYnkgdGhlCi0JICogd29ya2JlbmNoOyBjbGllbnRzIG11c3QgPGI+bm90IDwvYj4gZGlzcG9zZSBvZiB0aGUgcmV0dXJuZWQgaW1hZ2UuCi0JICogCi0JICogQHBhcmFtIHN5bWJvbGljTmFtZQotCSAqICAgICAgICAgICAgdGhlIHN5bWJvbGljIG5hbWUgb2YgdGhlIGltYWdlOyB0aGVyZSBhcmUgY29uc3RhbnRzIGRlY2xhcmVkCi0JICogICAgICAgICAgICBpbiB0aGlzIGNsYXNzIGZvciBidWlsZC1pbiBpbWFnZXMgdGhhdCBjb21lIHdpdGggdGhlIHNvdXJjZQotCSAqICAgICAgICAgICAgZWRpdG9yCi0JICogQHJldHVybiB0aGUgaW1hZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotCQlyZXR1cm4gRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShzeW1ib2xpY05hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBmb3Igc3BlY2lmaWVkIGltYWdlIGZyb20gdGhlIHNvdXJjZQotCSAqIGVkaXRvciBwbHVnaW4ncyBpbWFnZSByZWdpc3RyeS4gVW5saWtlIDxjb2RlPkltYWdlPC9jb2RlPnMsIGltYWdlCi0JICogZGVzY3JpcHRvcnMgdGhlbXNlbHZlcyBkbyBub3QgbmVlZCB0byBiZSBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3ltYm9saWNOYW1lCi0JICogICAgICAgICAgICB0aGUgc3ltYm9saWMgbmFtZSBvZiB0aGUgaW1hZ2U7IHRoZXJlIGFyZSBjb25zdGFudHMgZGVjbGFyZWQKLQkgKiAgICAgICAgICAgIGluIHRoaXMgaW50ZXJmYWNlIGZvciBidWlsZC1pbiBpbWFnZXMgdGhhdCBjb21lIHdpdGggdGhlCi0JICogICAgICAgICAgICBzb3VyY2UgZWRpdG9yCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKLQkJcmV0dXJuIEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKHN5bWJvbGljTmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXRvci9FZGl0b3JNb2RlbFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvRWRpdG9yTW9kZWxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNjE3NjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXRvci9FZGl0b3JNb2RlbFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotCi0vKioKLSAqIElOVEVSTkFMIFVTQUdFIE9OTFkKLSAqIAotICogQGF1dGhvciBuc2QKLSAqLwotcHVibGljIGNsYXNzIEVkaXRvck1vZGVsVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkRmFjdG9yaWVzVG8oZmluYWwgSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJQWRhcHRlckZhY3RvcnlSZWdpc3RyeSBhZGFwdGVyUmVnaXN0cnkgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QWRhcHRlckZhY3RvcnlSZWdpc3RyeSgpOwotCQlTdHJpbmcgY29udGVudFR5cGVJZCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKTsKLQotCQlJdGVyYXRvciBhZGFwdGVyRmFjdG9yeVByb3ZpZGVycyA9IG51bGw7Ci0JCWlmIChhZGFwdGVyUmVnaXN0cnkgaW5zdGFuY2VvZiBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5RXh0ZW5zaW9uKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeVByb3ZpZGVycyA9ICgoQWRhcHRlckZhY3RvcnlSZWdpc3RyeUV4dGVuc2lvbikgYWRhcHRlclJlZ2lzdHJ5KS5nZXRBZGFwdGVyRmFjdG9yaWVzKGNvbnRlbnRUeXBlSWQpOwotCQl9Ci0JCWVsc2UgewotCQkJYWRhcHRlckZhY3RvcnlQcm92aWRlcnMgPSBhZGFwdGVyUmVnaXN0cnkuZ2V0QWRhcHRlckZhY3RvcmllcygpOwotCQl9Ci0KLQkJRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeSA9IHN0cnVjdHVyZWRNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChmYWN0b3J5UmVnaXN0cnksIFNTRVVJTWVzc2FnZXMuRWRpdG9yTW9kZWxVdGlsXzApOyAvLyROT04tTkxTLTEkCi0JCS8vIEFkZCBhbGwgdGhvc2UgYXBwcm9wcmlhdGUgZm9yIHRoaXMgcGFydGljdWxhciB0eXBlIG9mIGNvbnRlbnQKLQkJd2hpbGUgKGFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJzLmhhc05leHQoKSkgewotCQkJdHJ5IHsKLQkJCQlmaW5hbCBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHByb3ZpZGVyID0gKEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJzLm5leHQoKTsKLQkJCQkvKgotCQkJCSAqIENvbnRlbnRUeXBlIG1pZ2h0IGhhdmUgYWxyZWFkeSBiZWVuIGNoZWNrZWQgYWJvdmUsIHRoaXMKLQkJCQkgKiBjaGVjayBpcyBoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eSBmb3IgdGhvc2UgdGhhdAotCQkJCSAqIGRvbid0IHNwZWNpZnkgYSBjb250ZW50IHR5cGUKLQkJCQkgKi8KLQkJCQlpZiAocHJvdmlkZXIuaXNGb3Ioc3RydWN0dXJlZE1vZGVsLmdldE1vZGVsSGFuZGxlcigpKSkgewotCQkJCQlTYWZlUnVubmVyLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKFNTRVVJTWVzc2FnZXMuRWRpdG9yTW9kZWxVdGlsXzEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXByb3ZpZGVyLmFkZEFkYXB0ZXJGYWN0b3JpZXMoc3RydWN0dXJlZE1vZGVsKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXRvci9FZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXRvci9FZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzg2MzNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBoYW5kbGUgaW1hZ2VzIHByb3ZpZGVkIGJ5IHRoaXMgcGx1Zy1pbi4KLSAqIAotICogTk9URTogRm9yIGludGVybmFsIHVzZSBvbmx5LiBGb3IgaW1hZ2VzIHVzZWQgZXh0ZXJuYWxseSwgcGxlYXNlIHVzZSB0aGUKLSAqIFNoYXJlZCoqKkltYWdlSGVscGVyIGNsYXNzIGluc3RlYWQuCi0gKiAKLSAqIEBhdXRob3IgYW15d3UKLSAqLwotcHVibGljIGNsYXNzIEVkaXRvclBsdWdpbkltYWdlSGVscGVyIHsKLQlwcml2YXRlIHN0YXRpYyBFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEVkaXRvclBsdWdpbkltYWdlSGVscGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEVkaXRvclBsdWdpbkltYWdlSGVscGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvLwkgc2F2ZSBhIGRlc2NyaXB0b3IgZm9yIGVhY2ggaW1hZ2UKLQlwcml2YXRlIEhhc2hNYXAgZkltYWdlRGVzY1JlZ2lzdHJ5ID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQTFVHSU5JRCA9IFNTRVVJUGx1Z2luLklEOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBmcm9tIHRoZSBnaXZlbiByZXNvdXJjZSBhbmQgYWRkcyB0aGUgaW1hZ2UgdG8gdGhlCi0JICogaW1hZ2UgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiBJbWFnZQotCSAqLwotCXByaXZhdGUgSW1hZ2UgY3JlYXRlSW1hZ2UoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBkZXNjID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCi0JCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCWltYWdlID0gZGVzYy5jcmVhdGVJbWFnZSgpOwotCQkJLy8gZG9udCBhZGQgdGhlIG1pc3NpbmcgaW1hZ2UgZGVzY3JpcHRvciBpbWFnZSB0byB0aGUgaW1hZ2UKLQkJCS8vIHJlZ2lzdHJ5Ci0JCQlpZiAoIWRlc2MuZXF1YWxzKEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCkpKQotCQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQocmVzb3VyY2UsIGltYWdlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZyb20gdGhlIGdpdmVuIGltYWdlRmlsZVBhdGggYW5kIGFkZHMgdGhlCi0JICogaW1hZ2UgZGVzY3JpcHRvciB0byB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgYW4gaW1hZ2UKLQkgKiBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBjcmVhdGVkLCB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvcgotCSAqIGlzIHJldHVybmVkIGJ1dCBub3QgYWRkZWQgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIGltYWdlRmlsZVBhdGgKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvciBpbWFnZSBkZXNjcmlwdG9yIGZvciBpbWFnZUZpbGVQYXRoIG9yIGRlZmF1bHQKLQkgKiAgICAgICAgICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqLwotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZUltYWdlRGVzY3JpcHRvcihTdHJpbmcgaW1hZ2VGaWxlUGF0aCkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTklELCBpbWFnZUZpbGVQYXRoKTsKLQkJaWYgKGltYWdlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQlnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLnB1dChpbWFnZUZpbGVQYXRoLCBpbWFnZURlc2NyaXB0b3IpOwotCQl9IGVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJfQotCi0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2UgZnJvbSB0aGUgaW1hZ2UgcmVnaXN0cnkuCi0JICogSWYgdGhlIGltYWdlIGNhbm5vdCBiZSByZXRyaWV2ZWQsIGF0dGVtcHQgdG8gZmluZCBhbmQgbG9hZCB0aGUgaW1hZ2UgYXQKLQkgKiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGluIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIGltYWdlIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZSB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIG9yIG51bGwgaWYgb25lIGNvdWxkCi0JICogICAgICAgICBub3QgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChyZXNvdXJjZSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgYW4gaW1hZ2UKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlCi0JICogZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgdGhlIGltYWdlIGRlc2NyaXB0b3IgY2Fubm90IGJlIHJldHJpZXZlZCwKLQkgKiBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZAotCSAqIGluIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIGltYWdlIGRlc2NyaXB0b3IgdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvciB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2F0ZWQgd2l0aCByZXNvdXJjZSBvcgotCSAqICAgICAgICAgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IgaWYgb25lIGNvdWxkIG5vdCBiZQotCSAqICAgICAgICAgZm91bmQKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0JCU9iamVjdCBvID0gZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAobyA9PSBudWxsKSB7Ci0JCQkvL2NyZWF0ZSBhIGRlc2NyaXB0b3IKLQkJCWltYWdlRGVzY3JpcHRvciA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSAoSW1hZ2VEZXNjcmlwdG9yKSBvOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiBIYXNoTWFwIC0gaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKSB7Ci0JCWlmIChmSW1hZ2VEZXNjUmVnaXN0cnkgPT0gbnVsbCkKLQkJCWZJbWFnZURlc2NSZWdpc3RyeSA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBmSW1hZ2VEZXNjUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSW1hZ2VSZWdpc3RyeSAtIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdG9yL0VkaXRvclBsdWdpbkltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjM4ODQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yOwotCi0vKioKLSAqIEJ1bmRsZSBvZiBtb3N0IGltYWdlcyB1c2VkIGJ5IHRoZSBTb3VyY2UgRWRpdG9yIHBsdWctaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0b3JQbHVnaW5JbWFnZXMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NUT09MMTZfU1BFTExDSEVDSyA9ICJpY29ucy9mdWxsL2N0b29sMTYvc3BlbGxjaGVjay5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfQ09MTEFQU0VBTEwgPSAiaWNvbnMvZnVsbC9kbGNsMTYvY29sbGFwc2VhbGwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX0RFTEVURSA9ICJpY29ucy9mdWxsL2RsY2wxNi9kZWxldGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ETENMX1NZTkNFRCA9ICJpY29ucy9mdWxsL2RsY2wxNi9zeW5jZWQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTDE2X1NQRUxMQ0hFQ0sgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L3NwZWxsY2hlY2suZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FTENMX0NPTExBUFNFQUxMID0gImljb25zL2Z1bGwvZWxjbDE2L2NvbGxhcHNlYWxsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9ERUxFVEUgPSAiaWNvbnMvZnVsbC9lbGNsMTYvZGVsZXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRUxDTF9TWU5DRUQgPSAiaWNvbnMvZnVsbC9lbGNsMTYvc3luY2VkLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0wxNl9TUEVMTENIRUNLID0gImljb25zL2Z1bGwvZXRvb2wxNi9zcGVsbGNoZWNrLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX09DQ19NQVRDSCA9ICJpY29ucy9mdWxsL29iajE2L29jY19tYXRjaC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1BSRUZFUkVOQ0VTID0gImljb25zL2Z1bGwvb2JqMTYvcHJlZmVyZW5jZXMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfUFJPUF9QUyA9ICJpY29ucy9mdWxsL29iajE2L3Byb3BfcHMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZTU0NjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIFNvdXJjZSBFZGl0b3IuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUKLSAqIGltcGxlbWVudGVkLgotICogPC9wPgotICogIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIZWxwQ29udGV4dElkcyB7Ci0KLQkvLyBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IFNTRVVJUGx1Z2luLklEICsgIi4iOyAvLyROT04tTkxTLTEkCi0JLy8gQWJzdHJhY3QgU291cmNlIEVkaXRvciBDb250ZXh0IE1lbnUKLQkvLyBDb250ZW50IEFzc2lzdAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRNTlVfQ09OVEVOVEFTU0lTVF9IRUxQSUQgPSBQUkVGSVggKyAieG1sbTEwMTAiOyAvLyROT04tTkxTLTEkCi0JLy8gRm9ybWF0IERvY3VtZW50Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVE1OVV9GT1JNQVRfRE9DX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxtMTAzMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBGb3JtYXQgQWN0aXZlIEVsZW1lbnRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVE1OVV9GT1JNQVRfRUxFTUVOVFNfSEVMUElEID0gUFJFRklYICsgInhtbG0xMDQwIjsgLy8kTk9OLU5MUy0xJAotCS8vIENsZWFudXAgRG9jdW1lbnQKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UTU5VX0NMRUFOVVBfRE9DX0hFTFBJRCA9IFBSRUZJWCArCi0JLy8gInhtbG0xMDUwIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gUHJvcGVydGllcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRNTlVfUFJPUEVSVElFU19IRUxQSUQgPSBQUkVGSVggKyAieG1sbTEwNzAiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBTdHJ1Y3R1cmVkIFRleHQgRWRpdG9yIFByZWZlcmVuY2UgUGFnZQotCS8vIEFwcGVhcmFuY2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU1RFX0FQUEVBUkFOQ0VfSEVMUElEID0gUFJFRklYICsgInN0ZWQwMDAxIjsgLy8kTk9OLU5MUy0xJAotCS8vIEhvdmVycwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTVEVfSE9WRVJTX0hFTFBJRCA9IFBSRUZJWCArICJzdGVkMDAwMyI7IC8vJE5PTi1OTFMtMSQKLQotLy8JLy8gUmVhZC1Pbmx5IFRleHQgU3R5bGUKLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZXRUJYX1JFQURPTkxZX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAwMSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFdlYiBhbmQgWE1MIFByZWZlcmVuY2UgUGFnZQotCS8vIFRhc2sgVGFncwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZXRUJYX1RBU0tUQUdTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAwMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFNvdXJjZSBFZGl0b3IgVmlldwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9TT1VSQ0VfVklFV19IRUxQSUQgPSBQUkVGSVggKyAieG1sbTIwMDAiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdG9yL1N0cnVjdHVyZWRNb2RlbERvY3VtZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvU3RydWN0dXJlZE1vZGVsRG9jdW1lbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTA2OWVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvU3RydWN0dXJlZE1vZGVsRG9jdW1lbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXJFeHRlbnNpb240OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSUVsZW1lbnRTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi0KLS8qKgotICogQGF1dGhvciBuaXRpbgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZE1vZGVsRG9jdW1lbnRQcm92aWRlciBpbXBsZW1lbnRzIElEb2N1bWVudFByb3ZpZGVyLCBJRG9jdW1lbnRQcm92aWRlckV4dGVuc2lvbiwgSURvY3VtZW50UHJvdmlkZXJFeHRlbnNpb240IHsKLQlwcml2YXRlIHN0YXRpYyBTdHJ1Y3R1cmVkTW9kZWxEb2N1bWVudFByb3ZpZGVyIF9pbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RydWN0dXJlZE1vZGVsRG9jdW1lbnRQcm92aWRlciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIF9pbnN0YW5jZTsKLQl9Ci0KLQl7Ci0JCV9pbnN0YW5jZSA9IG5ldyBTdHJ1Y3R1cmVkTW9kZWxEb2N1bWVudFByb3ZpZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkTW9kZWxEb2N1bWVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNhYm91dFRvQ2hhbmdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgYWJvdXRUb0NoYW5nZShPYmplY3QgZWxlbWVudCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNhZGRFbGVtZW50U3RhdGVMaXN0ZW5lcihvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklFbGVtZW50U3RhdGVMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbGVtZW50U3RhdGVMaXN0ZW5lcihJRWxlbWVudFN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXIjY2FuU2F2ZURvY3VtZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuU2F2ZURvY3VtZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiAoKElTdHJ1Y3R1cmVkTW9kZWwpIGVsZW1lbnQpLmlzRGlydHkoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXIjY2hhbmdlZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNoYW5nZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXIjY29ubmVjdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3QoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXIjZGlzY29ubmVjdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoT2JqZWN0IGVsZW1lbnQpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXIjZ2V0QW5ub3RhdGlvbk1vZGVsKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElBbm5vdGF0aW9uTW9kZWwgZ2V0QW5ub3RhdGlvbk1vZGVsKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNnZXREb2N1bWVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuICgoSVN0cnVjdHVyZWRNb2RlbCkgZWxlbWVudCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyI2dldE1vZGlmaWNhdGlvblN0YW1wKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuICgoSVN0cnVjdHVyZWRNb2RlbCkgZWxlbWVudCkuZ2V0U3luY2hyb25pemF0aW9uU3RhbXAoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXJFeHRlbnNpb24jZ2V0U3RhdHVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNnZXRTeW5jaHJvbml6YXRpb25TdGFtcChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBsb25nIGdldFN5bmNocm9uaXphdGlvblN0YW1wKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNpc0RlbGV0ZWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlckV4dGVuc2lvbiNpc01vZGlmaWFibGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWFibGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uI2lzUmVhZE9ubHkoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXJFeHRlbnNpb24jaXNTdGF0ZVZhbGlkYXRlZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RhdGVWYWxpZGF0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNtdXN0U2F2ZURvY3VtZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gbXVzdFNhdmVEb2N1bWVudChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gKChJU3RydWN0dXJlZE1vZGVsKSBlbGVtZW50KS5pc0RpcnR5KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyI3JlbW92ZUVsZW1lbnRTdGF0ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSUVsZW1lbnRTdGF0ZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUVsZW1lbnRTdGF0ZUxpc3RlbmVyKElFbGVtZW50U3RhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNyZXNldERvY3VtZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXREb2N1bWVudChPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNzYXZlRG9jdW1lbnQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlRG9jdW1lbnQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPYmplY3QgZWxlbWVudCwgSURvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJKChJU3RydWN0dXJlZE1vZGVsKSBlbGVtZW50KS5zYXZlKCk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uI3NldENhblNhdmVEb2N1bWVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhblNhdmVEb2N1bWVudChPYmplY3QgZWxlbWVudCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlckV4dGVuc2lvbiNzeW5jaHJvbml6ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplKE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uI3VwZGF0ZVN0YXRlQ2FjaGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVTdGF0ZUNhY2hlKE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uI3ZhbGlkYXRlU3RhdGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVTdGF0ZShPYmplY3QgZWxlbWVudCwgT2JqZWN0IGNvbXB1dGF0aW9uQ29udGV4dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCXB1YmxpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKCgoSVN0cnVjdHVyZWRNb2RlbCkgZWxlbWVudCkuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vQWN0aW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9BY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMTA4ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9BY3Rpb25EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi0KLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JQWN0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBXaGVuICdhY3Rpb24nIHRhZyBpcyBmb3VuZCBpbiB0aGUgcmVnaXN0cnksIGFuIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzCi0gKiBjcmVhdGVkLiBJdCBjcmVhdGVzIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24gb2JqZWN0IGFuZCBjYXB0dXJlcyBpbmZvcm1hdGlvbgotICogdGhhdCBpcyBsYXRlciB1c2VkIHRvIGFkZCB0aGlzIGFjdGlvbiBvYmplY3QgaW50byBtZW51L3Rvb2wgYmFyLiBUaGlzIGNsYXNzCi0gKiBpcyByZXVzZWQgZm9yIGdsb2JhbCAod29ya2JlbmNoKSBtZW51L3Rvb2wgYmFyLCBwb3B1cCBtZW51IGFjdGlvbnMsIGFzIHdlbGwKLSAqIGFzIHZpZXcncyBwdWxsZG93biBhbmQgbG9jYWwgdG9vbCBiYXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25EZXNjcmlwdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQUNDRUxFUkFUT1IgPSAiYWNjZWxlcmF0b3IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9ERUZJTklUSU9OX0lEID0gImRlZmluaXRpb25JZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0RJU0FCTEVESUNPTiA9ICJkaXNhYmxlZEljb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0hFTFBfQ09OVEVYVF9JRCA9ICJoZWxwQ29udGV4dElkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9IT1ZFUklDT04gPSAiaG92ZXJJY29uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JQ09OID0gImljb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0xBQkVMID0gImxhYmVsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9NRU5VQkFSX1BBVEggPSAibWVudWJhclBhdGgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BPUFVQTUVOVV9QQVRIID0gInBvcHVwbWVudVBhdGgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1NUQVRFID0gInN0YXRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UT09MQkFSX1BBVEggPSAidG9vbGJhclBhdGgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1RPT0xUSVAgPSAidG9vbHRpcCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZXh0ZW5zaW9uLiBJZiB0aGUgZXh0ZW5zaW9uIHBsdWdpbiBoYXMgbm90IGJlZW4gbG9hZGVkIGEKLQkgKiBidXN5IGN1cnNvciB3aWxsIGJlIGFjdGl2YXRlZCBkdXJpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSBsb2FkLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgY29uZmlnIGVsZW1lbnQgZGVmaW5pbmcgdGhlIGV4dGVuc2lvbgotCSAqIEBwYXJhbSBjbGFzc0F0dHJpYnV0ZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBjYXJyeWluZyB0aGUgY2xhc3MKLQkgKiBAcmV0dXJucyB0aGUgZXh0ZW5zaW9uIG9iamVjdCBpZiBzdWNjZXNzZnVsLiBJZiBhbiBlcnJvciBvY2N1cnMgd2hlbgotCSAqICAgICAgICAgIGNyZWF0ZWluZyBleGVjdXRhYmxlIGV4dGVuc2lvbiwgdGhlIGV4Y2VwdGlvbiBpcyBsb2dnZWQsIGFuZAotCSAqICAgICAgICAgIG51bGwgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlRXh0ZW5zaW9uKGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBmaW5hbCBTdHJpbmcgY2xhc3NBdHRyaWJ1dGUpIHsKLQkJZmluYWwgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFsxXTsKLQkJLy8gSWYgcGx1Z2luIGhhcyBiZWVuIGxvYWRlZCBjcmVhdGUgZXh0ZW5zaW9uLgotCQkvLyBPdGhlcndpc2UsIHNob3cgYnVzeSBjdXJzb3IgdGhlbiBjcmVhdGUgZXh0ZW5zaW9uLgotCQlTdHJpbmcgcGx1Z2luSWQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJaWYgKGJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5BQ1RJVkUpIHsKLQkJCXRyeSB7Ci0JCQkJcmVzdWx0WzBdID0gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGNsYXNzQXR0cmlidXRlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gY2F0Y2ggYW5kIGxvZyBBTlkgZXhjZXB0aW9uIGZyb20gZXh0ZW5zaW9uIHBvaW50Ci0JCQkJaGFuZGxlQ3JlYXRlRXhlY3V0YWJsZUV4Y2VwdGlvbihyZXN1bHQsIGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUobnVsbCwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlc3VsdFswXSA9IGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihjbGFzc0F0dHJpYnV0ZSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBjYXRjaCBhbmQgbG9nIEFOWSBleGNlcHRpb24gZnJvbSBleHRlbnNpb24gcG9pbnQKLQkJCQkJCWhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24ocmVzdWx0LCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCXJldHVybiByZXN1bHRbMF07Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBoYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKGZpbmFsIE9iamVjdFtdIHJlc3VsdCwgVGhyb3dhYmxlIGUpIHsKLQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJcmVzdWx0WzBdID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBpZDsKLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBpdGVtOwotCXByaXZhdGUgU3RyaW5nIG1lbnVHcm91cDsKLQlwcml2YXRlIFN0cmluZyBtZW51UGF0aDsKLQlwcml2YXRlIFN0cmluZyBwb3B1cG1lbnVHcm91cDsKLQlwcml2YXRlIFN0cmluZyBwb3B1cG1lbnVQYXRoOwotCXByaXZhdGUgU3RyaW5nIHRvb2xiYXJHcm91cDsKLQlwcml2YXRlIFN0cmluZyB0b29sYmFyUGF0aDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZGVzY3JpcHRvciB3aXRoIHRoZSB0YXJnZXRUeXBlCi0JICovCi0JcHVibGljIEFjdGlvbkRlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGFjdGlvbkVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkvLyBDYWxjdWxhdGUgbWVudSBhbmQgdG9vbGJhciBwYXRocy4KLQkJU3RyaW5nIG1wYXRoID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX01FTlVCQVJfUEFUSCk7Ci0JCVN0cmluZyBtZ3JvdXAgPSBudWxsOwotCQlpZiAobXBhdGggIT0gbnVsbCkgewotCQkJaW50IGxvYyA9IG1wYXRoLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQlpZiAobG9jICE9IC0xKSB7Ci0JCQkJbWdyb3VwID0gbXBhdGguc3Vic3RyaW5nKGxvYyArIDEpOwotCQkJCW1wYXRoID0gbXBhdGguc3Vic3RyaW5nKDAsIGxvYyk7Ci0JCQl9IGVsc2UgewotCQkJCW1ncm91cCA9IG1wYXRoOwotCQkJCW1wYXRoID0gbnVsbDsKLQkJCX0KLQkJfQotCQltZW51UGF0aCA9IG1wYXRoOwotCQltZW51R3JvdXAgPSBtZ3JvdXA7Ci0KLQkJU3RyaW5nIHBwYXRoID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1BPUFVQTUVOVV9QQVRIKTsKLQkJU3RyaW5nIHBncm91cCA9IG51bGw7Ci0JCWlmIChwcGF0aCAhPSBudWxsKSB7Ci0JCQlpbnQgbG9jID0gcHBhdGgubGFzdEluZGV4T2YoJy8nKTsKLQkJCWlmIChsb2MgIT0gLTEpIHsKLQkJCQlwZ3JvdXAgPSBwcGF0aC5zdWJzdHJpbmcobG9jICsgMSk7Ci0JCQkJcHBhdGggPSBwcGF0aC5zdWJzdHJpbmcoMCwgbG9jKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcGdyb3VwID0gcHBhdGg7Ci0JCQkJcHBhdGggPSBudWxsOwotCQkJfQotCQl9Ci0JCXBvcHVwbWVudVBhdGggPSBwcGF0aDsKLQkJcG9wdXBtZW51R3JvdXAgPSBwZ3JvdXA7Ci0KLQkJU3RyaW5nIHRwYXRoID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1RPT0xCQVJfUEFUSCk7Ci0JCVN0cmluZyB0Z3JvdXAgPSBudWxsOwotCQlpZiAodHBhdGggIT0gbnVsbCkgewotCQkJaW50IGxvYyA9IHRwYXRoLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQlpZiAobG9jICE9IC0xKSB7Ci0JCQkJdGdyb3VwID0gdHBhdGguc3Vic3RyaW5nKGxvYyArIDEpOwotCQkJCXRwYXRoID0gdHBhdGguc3Vic3RyaW5nKDAsIGxvYyk7Ci0JCQl9IGVsc2UgewotCQkJCXRncm91cCA9IHRwYXRoOwotCQkJCXRwYXRoID0gbnVsbDsKLQkJCX0KLQkJfQotCQl0b29sYmFyUGF0aCA9IHRwYXRoOwotCQl0b29sYmFyR3JvdXAgPSB0Z3JvdXA7Ci0KLQkJLy8gQ3JlYXRlIGFjdGlvbi4KLQkJSUFjdGlvbiBhY3Rpb24gPSBjcmVhdGVBY3Rpb24oYWN0aW9uRWxlbWVudCk7Ci0JCWlmIChhY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgbGFiZWwgPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTEFCRUwpOwotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCWFjdGlvbi5zZXRUZXh0KGxhYmVsKTsKLQotCQlpZCA9IGFjdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCWlmIChpZCA9PSBudWxsKSB7Ci0JCQlpZCA9IGFjdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0JCX0KLQkJaWYgKGlkICE9IG51bGwpCi0JCQlhY3Rpb24uc2V0SWQoaWQpOwotCi0JCVN0cmluZyBkZWZJZCA9IGFjdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9ERUZJTklUSU9OX0lEKTsKLQkJaWYgKGRlZklkICE9IG51bGwgJiYgZGVmSWQubGVuZ3RoKCkgIT0gMCkgewotCQkJYWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChkZWZJZCk7Ci0JCX0KLQotCQlTdHJpbmcgdG9vbHRpcCA9IGFjdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UT09MVElQKTsKLQkJaWYgKHRvb2x0aXAgIT0gbnVsbCkKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dCh0b29sdGlwKTsKLQotCQlTdHJpbmcgaGVscENvbnRleHRJZCA9IGFjdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9IRUxQX0NPTlRFWFRfSUQpOwotCQlpZiAoaGVscENvbnRleHRJZCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZnVsbElEID0gaGVscENvbnRleHRJZDsKLQkJCWlmIChoZWxwQ29udGV4dElkLmluZGV4T2YoIi4iKSA9PSAtMSkgLy8kTk9OLU5MUy0xJAotCQkJCS8vIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdlIGF1dG8gcXVhbGlmeSB0aGUgaWQgaWYgaXQgaXMKLQkJCQkvLyBub3QgcXVhbGlmaWVkKQotCQkJCWZ1bGxJRCA9IGFjdGlvbkVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCkgKyAiLiIgKyBoZWxwQ29udGV4dElkOyAvLyROT04tTkxTLTEkCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGFjdGlvbiwgZnVsbElEKTsKLQkJfQotCi0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IGFjdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9ERVNDUklQVElPTik7Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotCQkJYWN0aW9uLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQotCQlTdHJpbmcgc3RhdGUgPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfU1RBVEUpOwotCQlpZiAoc3RhdGUgIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldENoZWNrZWQoc3RhdGUuZXF1YWxzKCJ0cnVlIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTdHJpbmcgaWNvbiA9IGFjdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JQ09OKTsKLQkJaWYgKGljb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVV0aWwuZ2V0SW1hZ2VEZXNjcmlwdG9yRnJvbUV4dGVuc2lvbihhY3Rpb25FbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLCBpY29uKSk7Ci0JCX0KLQotCQlTdHJpbmcgaG92ZXJJY29uID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0hPVkVSSUNPTik7Ci0JCWlmIChob3Zlckljb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlVXRpbC5nZXRJbWFnZURlc2NyaXB0b3JGcm9tRXh0ZW5zaW9uKGFjdGlvbkVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCksIGhvdmVySWNvbikpOwotCQl9Ci0KLQkJU3RyaW5nIGRpc2FibGVkSWNvbiA9IGFjdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9ESVNBQkxFRElDT04pOwotCQlpZiAoZGlzYWJsZWRJY29uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVV0aWwuZ2V0SW1hZ2VEZXNjcmlwdG9yRnJvbUV4dGVuc2lvbihhY3Rpb25FbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLCBkaXNhYmxlZEljb24pKTsKLQkJfQotCi0JCVN0cmluZyBhY2NlbGVyYXRvciA9IGFjdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9BQ0NFTEVSQVRPUik7Ci0JCWlmIChhY2NlbGVyYXRvciAhPSBudWxsKQotCQkJcHJvY2Vzc0FjY2VsZXJhdG9yKGFjdGlvbiwgYWNjZWxlcmF0b3IpOwotCi0JCWl0ZW0gPSBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFBhcnNlcyB0aGUgZ2l2ZW4gYWNjZWxlcmF0b3IgdGV4dCwgYW5kIGNvbnZlcnRzIGl0IHRvIGFuIGFjY2VsZXJhdG9yCi0JICoga2V5IGNvZGUuCi0JICogCi0JICogQHBhcmFtIGFjY2VsZXJhdG9yVGV4dAotCSAqICAgICAgICAgICAgdGhlIGFjY2VsZXJhdG9yIHRleHQKLQkgKiBAcmVzdWx0IHRoZSBTV1Qga2V5IGNvZGUsIG9yIDAgaWYgdGhlcmUgaXMgbm8gYWNjZWxlcmF0b3IKLQkgKi8KLQlwcml2YXRlIGludCBjb252ZXJ0QWNjZWxlcmF0b3IoU3RyaW5nIGFjY2VsZXJhdG9yVGV4dCkgewotCQlpbnQgYWNjZWxlcmF0b3IgPSAwOwotCQlTdHJpbmdUb2tlbml6ZXIgc3RvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYWNjZWxlcmF0b3JUZXh0LCAiKyIpOyAvLyROT04tTkxTLTEkCi0KLQkJaW50IGtleUNvZGUgPSAtMTsKLQotCQlib29sZWFuIGhhc01vcmVUb2tlbnMgPSBzdG9rLmhhc01vcmVUb2tlbnMoKTsKLQkJd2hpbGUgKGhhc01vcmVUb2tlbnMpIHsKLQkJCVN0cmluZyB0b2tlbiA9IHN0b2submV4dFRva2VuKCk7Ci0JCQloYXNNb3JlVG9rZW5zID0gc3Rvay5oYXNNb3JlVG9rZW5zKCk7Ci0JCQkvLyBFdmVyeSB0b2tlbiBleGNlcHQgdGhlIGxhc3QgbXVzdCBiZSBvbmUgb2YgdGhlIG1vZGlmaWVycwotCQkJLy8gQ3RybCwgU2hpZnQsIG9yIEFsdC4KLQkJCWlmIChoYXNNb3JlVG9rZW5zKSB7Ci0JCQkJaW50IG1vZGlmaWVyID0gQWN0aW9uLmZpbmRNb2RpZmllcih0b2tlbik7Ci0JCQkJaWYgKG1vZGlmaWVyICE9IDApIHsKLQkJCQkJYWNjZWxlcmF0b3IgfD0gbW9kaWZpZXI7Ci0JCQkJfSBlbHNlIHsgLy9MZWF2ZSBpZiB0aGVyZSBhcmUgbm9uZQotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWtleUNvZGUgPSBBY3Rpb24uZmluZEtleUNvZGUodG9rZW4pOwotCQkJfQotCQl9Ci0JCWlmIChrZXlDb2RlICE9IC0xKSB7Ci0JCQlhY2NlbGVyYXRvciB8PSBrZXlDb2RlOwotCQl9Ci0JCXJldHVybiBhY2NlbGVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElBY3Rpb24gY3JlYXRlQWN0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBhY3Rpb25FbGVtZW50KSB7Ci0JCU9iamVjdCBhY3Rpb24gPSBuZXcgRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZyhhY3Rpb25FbGVtZW50LCBBVFRfQ0xBU1MpOwotCQlpZiAoYWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIElBY3Rpb25WYWxpZGF0b3IpIHsKLQkJCWlmICghKChJQWN0aW9uVmFsaWRhdG9yKSBhY3Rpb24pLmlzVmFsaWRBY3Rpb24oKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKGFjdGlvbiBpbnN0YW5jZW9mIElBY3Rpb24gPyAoSUFjdGlvbikgRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eS5uZXdJbnN0YW5jZShhY3Rpb24pIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWN0aW9uIG9iamVjdCBoZWxkIGluIHRoaXMgZGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgSUFjdGlvbiBnZXRBY3Rpb24oKSB7Ci0JCXJldHVybiAoaXRlbSAhPSBudWxsID8gaXRlbS5nZXRBY3Rpb24oKSA6IG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElDb250cmlidXRpb25JdGVtIG9iamVjdCBoZWxkIGluIHRoaXMgZGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgSUNvbnRyaWJ1dGlvbkl0ZW0gZ2V0Q29udHJpYnV0aW9uSXRlbSgpIHsKLQkJcmV0dXJuIGl0ZW07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhY3Rpb24ncyBpZCBhcyBkZWZpbmVkIGluIHRoZSByZWdpc3RyeS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBuYW1lZCBzbG90IChncm91cCkgaW4gdGhlIG1lbnUgd2hlcmUgdGhpcyBhY3Rpb24gc2hvdWxkIGJlCi0JICogYWRkZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZW51R3JvdXAoKSB7Ci0JCXJldHVybiBtZW51R3JvdXA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBtZW51IHBhdGggd2hlcmUgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGFkZGVkLiBJZiBudWxsLCB0aGUKLQkgKiBhY3Rpb24gd2lsbCBub3QgYmUgYWRkZWQgaW50byB0aGUgbWVudS4KLQkgKi8KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVudVBhdGgoKSB7Ci0JCXJldHVybiBtZW51UGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG5hbWVkIHNsb3QgKGdyb3VwKSBpbiB0aGUgcG9wdXAgbWVudSB3aGVyZSB0aGlzIGFjdGlvbiBzaG91bGQKLQkgKiBiZSBhZGRlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvcHVwTWVudUdyb3VwKCkgewotCQlyZXR1cm4gcG9wdXBtZW51R3JvdXA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBwb3B1cCBtZW51IHBhdGggd2hlcmUgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGFkZGVkLiBJZiBudWxsLCB0aGUKLQkgKiBhY3Rpb24gd2lsbCBub3QgYmUgYWRkZWQgaW50byB0aGUgcG9wdXAgbWVudS4KLQkgKi8KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UG9wdXBNZW51UGF0aCgpIHsKLQkJcmV0dXJuIHBvcHVwbWVudVBhdGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZWQgc2xvdCAoZ3JvdXApIGluIHRoZSB0b29sIGJhciB3aGVyZSB0aGlzIGFjdGlvbiBzaG91bGQKLQkgKiBiZSBhZGRlZC4KLQkgKi8KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbGJhckdyb3VwKCkgewotCQlyZXR1cm4gdG9vbGJhckdyb3VwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgcGF0aCBpbiB0aGUgdG9vbCBiYXIgd2hlcmUgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGFkZGVkLiBJZgotCSAqIG51bGwsIGFjdGlvbiB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgdG9vbCBiYXIuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sYmFyUGF0aCgpIHsKLQkJcmV0dXJuIHRvb2xiYXJQYXRoOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIGFjY2VsZXJhdG9yIGRlZmluaXRpb24uIElmIGl0IGlzIGEgbnVtYmVyIHRoZW4gcHJvY2VzcyB0aGUKLQkgKiBjb2RlIGRpcmVjdGx5IC0gaWYgbm90IHRoZW4gcGFyc2UgaXQgYW5kIGNyZWF0ZSB0aGUgY29kZQotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzQWNjZWxlcmF0b3IoSUFjdGlvbiBhY3Rpb24sIFN0cmluZyBhY2NlbGVyYXRvclRleHQpIHsKLQotCQlpZiAoYWNjZWxlcmF0b3JUZXh0Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0KLQkJLy9JcyBpdCBhIG51bWVyaWMgZGVmaW5pdGlvbj8KLQkJaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGFjY2VsZXJhdG9yVGV4dC5jaGFyQXQoMCkpKSB7Ci0JCQl0cnkgewotCQkJCWFjdGlvbi5zZXRBY2NlbGVyYXRvcihJbnRlZ2VyLnZhbHVlT2YoYWNjZWxlcmF0b3JUZXh0KS5pbnRWYWx1ZSgpKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkludmFsaWQgYWNjZWxlcmF0b3IgZGVjbGFyYXRpb246ICIgKyBpZCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlCi0JCQlhY3Rpb24uc2V0QWNjZWxlcmF0b3IoY29udmVydEFjY2VsZXJhdG9yKGFjY2VsZXJhdG9yVGV4dCkpOwotCX0KLQotCS8qKgotCSAqIEZvciBkZWJ1Z2dpbmcgb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkFjdGlvbkRlc2NyaXB0b3IoIiArIGlkICsgIikiOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9CcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNmY5YjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9CcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQuSUJyZWFrcG9pbnRQcm92aWRlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogUmVhZHMgYnJlYWtwb2ludCBleHRlbnNpb24gcmVnaXN0b3J5IGFuZCByZXR1cm5zIGJyZWFrcG9pbnQgcHJvdmlkZXIKLSAqIGluc3RhbmNlcwotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NPTlRFTlRfVFlQRVMgPSAiY29udGVudFR5cGVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfRVhURU5TSU9OUyA9ICJleHRlbnNpb25zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIEJyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXIgaW5zdGFuY2U7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMX0JSRUFLUE9JTlQgPSAiYnJlYWtwb2ludCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQlJFQUtQT0lOVF9DT05UUklCVVRJT04gPSAiYnJlYWtwb2ludENvbnRyaWJ1dGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BST1ZJREVSID0gInByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBDcmVhdGVzIGFuIGV4ZWN1dGFibGUgZXh0ZW5zaW9uLiBAcGFyYW0gZWxlbWVudCB0aGUgY29uZmlnIGVsZW1lbnQKLQkgKiBkZWZpbmluZyB0aGUgZXh0ZW5zaW9uIEBwYXJhbSBjbGFzc0F0dHJpYnV0ZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCi0JICogY2FycnlpbmcgdGhlIGNsYXNzIEByZXR1cm4gdGhlIGV4dGVuc2lvbiBvYmplY3QgQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0Jc3RhdGljIE9iamVjdCBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBmaW5hbCBTdHJpbmcgY2xhc3NBdHRyaWJ1dGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihjbGFzc0F0dHJpYnV0ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBleHRlbnNpb24uIElmIHRoZSBleHRlbnNpb24gcGx1Z2luIGhhcyBub3QgYmVlbiBsb2FkZWQgYQotCSAqIGJ1c3kgY3Vyc29yIHdpbGwgYmUgYWN0aXZhdGVkIGR1cmluZyB0aGUgZHVyYXRpb24gb2YgdGhlIGxvYWQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBjb25maWcgZWxlbWVudCBkZWZpbmluZyB0aGUgZXh0ZW5zaW9uCi0JICogQHBhcmFtIGNsYXNzQXR0cmlidXRlCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGNhcnJ5aW5nIHRoZSBjbGFzcwotCSAqIEByZXR1cm4gdGhlIGV4dGVuc2lvbiBvYmplY3QKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVFeHRlbnNpb24oZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIGZpbmFsIFN0cmluZyBjbGFzc0F0dHJpYnV0ZSkgewotCQkvLyBJZiBwbHVnaW4gaGFzIGJlZW4gbG9hZGVkIGNyZWF0ZSBleHRlbnNpb24uCi0JCS8vIE90aGVyd2lzZSwgc2hvdyBidXN5IGN1cnNvciB0aGVuIGNyZWF0ZSBleHRlbnNpb24uCi0JCWZpbmFsIE9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbMV07Ci0JCVN0cmluZyBwbHVnaW5JZCA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQlpZiAoYnVuZGxlLmdldFN0YXRlKCkgPT0gQnVuZGxlLkFDVElWRSkgewotCQkJdHJ5IHsKLQkJCQlyZXN1bHRbMF0gPSBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGVsZW1lbnQsIGNsYXNzQXR0cmlidXRlKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24ocmVzdWx0LCBlKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKG51bGwsIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXN1bHRbMF0gPSBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGVsZW1lbnQsIGNsYXNzQXR0cmlidXRlKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQloYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKHJlc3VsdCwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQl9Ci0JCXJldHVybiByZXN1bHRbMF07Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlcgotCSAqIAotCSAqIEByZXR1cm4gQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlcgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEJyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBCcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHQKLQkgKiBAcGFyYW0gZQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlQ3JlYXRlRXhlY3V0YWJsZUV4Y2VwdGlvbihPYmplY3RbXSByZXN1bHQsIFRocm93YWJsZSBlKSB7Ci0JCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCXJlc3VsdFswXSA9IG51bGw7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjYWNoZTsKLQlwcml2YXRlIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXRDb250cmlidXRpb25UYWc7Ci0KLQkvKgotCSAqIENvbnN0cnVjdG9yCi0JICovCi0JcHJpdmF0ZSBCcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQ3JlYXRlcyBhIGJyZWFrcG9pbnQgcHJvdmlkZXIgb2JqZWN0IHRvIGdpdmVuIGVsZW1lbnQgQHBhcmFtIGVsZW1lbnQKLQkgKiBjb25maWd1cmF0aW9uIGVsZW1lbnQgb2JqZWN0IEByZXR1cm4gSUJyZWFrcG9pbnRQcm92aWRlcgotCSAqLwotCXByb3RlY3RlZCBJQnJlYWtwb2ludFByb3ZpZGVyIGNyZWF0ZUJyZWFrcG9pbnRQcm92aWRlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlPYmplY3Qgb2JqID0gY3JlYXRlRXh0ZW5zaW9uKGVsZW1lbnQsIEFUVF9DTEFTUyk7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIElCcmVha3BvaW50UHJvdmlkZXIpID8gKElCcmVha3BvaW50UHJvdmlkZXIpIG9iaiA6IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGJyZWFrcG9pbnQgcHJvdmlkZXJzIG1hdGNoaW5nIHRoZSBnaXZlbiBrZXkgdG8gdGhlCi0JICogdmFsdWUgb2YgdGhlIElDb25maWd1cmF0aW9uRWxlbWVudCBhdHRyaWJ1dGUgImF0dHJOYW1lIiBAcmV0dXJuCi0JICogSUJyZWFrcG9pbnRQcm92aWRlcltdCi0JICovCi0JcHJvdGVjdGVkIElCcmVha3BvaW50UHJvdmlkZXJbXSBjcmVhdGVCcmVha3BvaW50UHJvdmlkZXJzKFN0cmluZyBhdHRyTmFtZSwgU3RyaW5nIGtleSkgewotCQlpZiAoY2FjaGUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSUJyZWFrcG9pbnRQcm92aWRlclswXTsKLQotCQlmaW5hbCBpbnQgbnVtID0gY2FjaGUuc2l6ZSgpOwotCQlpZiAobnVtID09IDApCi0JCQlyZXR1cm4gbmV3IElCcmVha3BvaW50UHJvdmlkZXJbMF07Ci0KLQkJSUJyZWFrcG9pbnRQcm92aWRlcltdIGJwID0gbmV3IElCcmVha3BvaW50UHJvdmlkZXJbbnVtXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gY2FjaGUuZ2V0KGkpOwotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25FbGVtZW50KSkKLQkJCQljb250aW51ZTsKLQotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBvYmo7Ci0JCQlpZiAoIVRBR19QUk9WSURFUi5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlib29sZWFuIGRvQ3JlYXRlID0gZmFsc2U7Ci0KLQkJCVN0cmluZyBhdHRyVmFsdWVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpOwotCi0JCQlpZiAoYXR0clZhbHVlcyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0clZhbHVlcywgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCVN0cmluZyB0eXBlID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJCQlpZiAodHlwZS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZShrZXkudHJpbSgpKSkgewotCQkJCQkJZG9DcmVhdGUgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChkb0NyZWF0ZSkgewotCQkJCUlCcmVha3BvaW50UHJvdmlkZXIgYiA9IGNyZWF0ZUJyZWFrcG9pbnRQcm92aWRlcihlbGVtZW50KTsKLQkJCQlpZiAoYiAhPSBudWxsKSB7Ci0JCQkJCWJwW2pdID0gYjsKLQkJCQkJaisrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUlCcmVha3BvaW50UHJvdmlkZXJbXSBicDIgPSBuZXcgSUJyZWFrcG9pbnRQcm92aWRlcltqXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqOyBpKyspIHsKLQkJCWJwMltpXSA9IGJwW2ldOwotCQl9Ci0KLQkJcmV0dXJuIGJwMjsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgYSBtYXRjaGluZyBhcnJheSBvZiBleHRlbnNpb24gcG9pbnRzIG1hdGNoaW5nIHRoaXMga2V5LiBEb2Vzbid0Ci0JICogY2F1c2UgaW5zdGFudGlhdGlvbiBvZiBwcm92aWRlcnMuIEByZXR1cm4gSUJyZWFrcG9pbnRQcm92aWRlcltdCi0JICovCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGZpbmRFbGVtZW50cyhTdHJpbmcga2V5KSB7Ci0JCWluaXRDYWNoZSgpOwotCi0JCWlmIChjYWNoZSA9PSBudWxsIHx8IGNhY2hlLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG5ldyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbMF07Ci0KLQkJaW50IG51bSA9IGNhY2hlLnNpemUoKTsKLQkJTGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBjYWNoZS5nZXQoaSk7Ci0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnQpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIG9iajsKLQkJCWlmICghVEFHX1BST1ZJREVSLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpCi0JCQkJY29udGludWU7Ci0KLQkJCWJvb2xlYW4gYWRkID0gZmFsc2U7Ci0JCQlTdHJpbmcgdHlwZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ09OVEVOVF9UWVBFUyk7Ci0JCQlTdHJpbmcgZXh0cyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9FWFRFTlNJT05TKTsKLQotCQkJaWYgKHR5cGVzID09IG51bGwgJiYgZXh0cyA9PSBudWxsKSB7Ci0JCQkJYWRkID0gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKCFhZGQgJiYgdHlwZXMgIT0gbnVsbCAmJiB0eXBlcy5sZW5ndGgoKSA+IDApIHsKLQkJCQlJQ29udGVudFR5cGUgdGVzdFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShrZXkpOwotCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHR5cGVzLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJU3RyaW5nIHR5cGUgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKHR5cGUpOwotCQkJCQlpZiAoY29udGVudFR5cGUgIT0gbnVsbCAmJiB0ZXN0VHlwZSAhPSBudWxsICYmIHRlc3RUeXBlLmlzS2luZE9mKGNvbnRlbnRUeXBlKSkgewotCQkJCQkJYWRkID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIWFkZCAmJiBleHRzICE9IG51bGwpIHsKLQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihleHRzLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJU3RyaW5nIGV4dCA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQkJaWYgKGV4dC50cmltKCkuZXF1YWxzKGtleS50cmltKCkpKSB7Ci0JCQkJCQlhZGQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChhZGQpIHsKLQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSkgZWxlbWVudHMudG9BcnJheShuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50WzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGJyZWFrcG9pbnQgcHJvdmlkZXJzIGZvciBhIHNwZWNpZmllZCBjb250ZW50IHR5cGUKLQkgKiBoYW5kbGVyCi0JICogCi0JICogQHBhcmFtIGhhbmRsZXIKLQkgKiAgICAgICAgICAgIGEgY29udGVudCB0eXBlIGhhbmRsZXIKLQkgKiBAcGFyYW0gZXh0Ci0JICogICAgICAgICAgICBmaWxlIGV4dGVuc2lvbgotCSAqIEByZXR1cm4gSUJyZWFrcG9pbnRQcm92aWRlcltdCi0JICovCi0JcHVibGljIElCcmVha3BvaW50UHJvdmlkZXJbXSBnZXRCcmVha3BvaW50UHJvdmlkZXJzKElFZGl0b3JQYXJ0IGVkaXRvcnBhcnQsIFN0cmluZyBjb250ZW50VHlwZUlELCBTdHJpbmcgZXh0KSB7Ci0JCWluaXRDYWNoZSgpOwotCi0JCS8vIEdldCBicmVha3BvaW50IHByb3ZpZGVycyBmb3IgdGhpcyBjb250ZW50IHR5cGUgaGFuZGxlcgotCQlJQnJlYWtwb2ludFByb3ZpZGVyW10gcHJvdmlkZXJzMSA9IG5ldyBJQnJlYWtwb2ludFByb3ZpZGVyWzBdOwotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZUlEKTsKLQkJTGlzdCBob2xkUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJd2hpbGUgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCUlCcmVha3BvaW50UHJvdmlkZXJbXSBwcm92aWRlcnMgPSAoSUJyZWFrcG9pbnRQcm92aWRlcltdKSBtYXAuZ2V0KGNvbnRlbnRUeXBlLmdldElkKCkpOwotCQkJaWYgKHByb3ZpZGVycyA9PSBudWxsKSB7Ci0JCQkJcHJvdmlkZXJzID0gY3JlYXRlQnJlYWtwb2ludFByb3ZpZGVycyhBVFRfQ09OVEVOVF9UWVBFUywgY29udGVudFR5cGUuZ2V0SWQoKSk7Ci0JCQkJaWYgKHByb3ZpZGVycyAhPSBudWxsKSB7Ci0JCQkJCW1hcC5wdXQoY29udGVudFR5cGUuZ2V0SWQoKSwgcHJvdmlkZXJzKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBwcm92aWRlcnMgd2VyZSByZXRyaWV2ZWQgZnJvbSBjYWNoZSBvciBuZXdseSBjcmVhdGVkCi0JCQlpZihwcm92aWRlcnMgIT0gbnVsbCkgewotCQkJCWhvbGRQcm92aWRlcnMuYWRkQWxsKEFycmF5cy5hc0xpc3QocHJvdmlkZXJzKSk7Ci0JCQl9Ci0JCQljb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLmdldEJhc2VUeXBlKCk7Ci0JCX0KLQkJcHJvdmlkZXJzMSA9IChJQnJlYWtwb2ludFByb3ZpZGVyW10pIGhvbGRQcm92aWRlcnMudG9BcnJheShuZXcgSUJyZWFrcG9pbnRQcm92aWRlcltob2xkUHJvdmlkZXJzLnNpemUoKV0pOwotCi0JCS8vIEdldCBicmVha3BvaW50IHByb3ZpZGVycyBmb3IgdGhpcyBleHRlbnNpb24KLQkJSUJyZWFrcG9pbnRQcm92aWRlcltdIHByb3ZpZGVyczIgPSBuZXcgSUJyZWFrcG9pbnRQcm92aWRlclswXTsKLQkJaWYgKGV4dCAhPSBudWxsKSB7Ci0JCQlwcm92aWRlcnMyID0gKElCcmVha3BvaW50UHJvdmlkZXJbXSkgbWFwLmdldChleHQpOwotCQkJaWYgKHByb3ZpZGVyczIgPT0gbnVsbCkgewotCQkJCXByb3ZpZGVyczIgPSBjcmVhdGVCcmVha3BvaW50UHJvdmlkZXJzKEFUVF9FWFRFTlNJT05TLCBleHQpOwotCQkJCWlmIChwcm92aWRlcnMyICE9IG51bGwpIHsKLQkJCQkJbWFwLnB1dChleHQsIHByb3ZpZGVyczIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGNyZWF0ZSBzaW5nbGUgaGFzaCBzZXQgdG8gcmVtb3ZlIGR1cGxpY2F0aW9uCi0JCVNldCBzID0gbmV3IEhhc2hTZXQoKTsKLQkJcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwcm92aWRlcnMxKSk7Ci0JCXMuYWRkQWxsKEFycmF5cy5hc0xpc3QocHJvdmlkZXJzMikpOwotCi0JCS8vIGNyZWF0ZSBJQnJlYWtwb2ludFByb3ZpZGVyW10gdG8gcmV0dXJuCi0JCUlCcmVha3BvaW50UHJvdmlkZXJbXSBwcm92aWRlcnMgPSBuZXcgSUJyZWFrcG9pbnRQcm92aWRlcltzLnNpemUoKV07Ci0JCUl0ZXJhdG9yIGl0ciA9IHMuaXRlcmF0b3IoKTsKLQkJaW50IGkgPSAwOwotCQlJU291cmNlRWRpdGluZ1RleHRUb29scyB0b29scyA9IG51bGw7Ci0JCWlmIChlZGl0b3JwYXJ0ICE9IG51bGwgJiYgaXRyLmhhc05leHQoKSkKLQkJCXRvb2xzID0gKElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKSBlZGl0b3JwYXJ0LmdldEFkYXB0ZXIoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuY2xhc3MpOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJcHJvdmlkZXJzW2ldID0gKElCcmVha3BvaW50UHJvdmlkZXIpIGl0ci5uZXh0KCk7Ci0JCQlwcm92aWRlcnNbaV0uc2V0U291cmNlRWRpdGluZ1RleHRUb29scyh0b29scyk7Ci0JCQlpKys7Ci0JCX0KLQkJcmV0dXJuIHByb3ZpZGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgZnJvbSBnaXZlbiBwYXJhbWV0ZXJzCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogQHBhcmFtIGhhbmRsZXIKLQkgKiBAcGFyYW0gZXh0Ci0JICogQHJldHVybiBJUmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKElFZGl0b3JJbnB1dCBpbnB1dCwgU3RyaW5nIGNvbnRlbnRUeXBlLCBTdHJpbmcgZXh0KSB7Ci0JCUlCcmVha3BvaW50UHJvdmlkZXJbXSBwcm92aWRlcnMgPSBnZXRCcmVha3BvaW50UHJvdmlkZXJzKG51bGwsIGNvbnRlbnRUeXBlLCBleHQpOwotCQlJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92aWRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCXJlcyA9IHByb3ZpZGVyc1tpXS5nZXRSZXNvdXJjZShpbnB1dCk7Ci0JCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0Q2FjaGUoKSB7Ci0JCWlmIChjYWNoZSA9PSBudWxsKSB7Ci0JCQljYWNoZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXJlYWRDb250cmlidXRpb25zKFRBR19CUkVBS1BPSU5UX0NPTlRSSUJVVElPTiwgUExfQlJFQUtQT0lOVCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGJyZWFrcG9pbnQgcHJvdmlkZXJzIGZvciBhIHNwZWNpZmllZCBjb250ZW50IHR5cGUKLQkgKiBoYW5kbGVyCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICogICAgICAgICAgICBhIGNvbnRlbnQgdHlwZSBJRCBvciBudWxsCi0JICogQHBhcmFtIGV4dAotCSAqICAgICAgICAgICAgYSBmaWxlbmFtZSBleHRlbnNpb24gb3IgbnVsbAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKFN0cmluZyBjb250ZW50VHlwZSwgU3RyaW5nIGV4dCkgewotCQlib29sZWFuIGF2YWlsYWJsZSA9IGZhbHNlOwotCQlpZiAoZXh0ICE9IG51bGwpCi0JCQlhdmFpbGFibGUgPSBmaW5kRWxlbWVudHMoZXh0KS5sZW5ndGggPiAwOwotCQlpZiAoIWF2YWlsYWJsZSAmJiBjb250ZW50VHlwZSAhPSBudWxsKQotCQkJYXZhaWxhYmxlID0gZmluZEVsZW1lbnRzKGNvbnRlbnRUeXBlKS5sZW5ndGggPiAwOwotCQlyZXR1cm4gYXZhaWxhYmxlOwotCX0KLQotCS8qKgotCSAqIFJlYWRzIHRoZSBjb250cmlidXRpb25zIGZyb20gdGhlIHJlZ2lzdHJ5IGZvciB0aGUgcHJvdmlkZWQgd29ya2JlbmNoCi0JICogcGFydCBhbmQgdGhlIHByb3ZpZGVkIGV4dGVuc2lvbiBwb2ludCBJRC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFnCi0JICogQHBhcmFtIGV4dGVuc2lvblBvaW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZENvbnRyaWJ1dGlvbnMoU3RyaW5nIHRhZywgU3RyaW5nIGV4dGVuc2lvblBvaW50KSB7Ci0JCXRhcmdldENvbnRyaWJ1dGlvblRhZyA9IHRhZzsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJcmVhZFJlZ2lzdHJ5KHJlZ2lzdHJ5LCBQTFVHSU5fSUQsIGV4dGVuc2lvblBvaW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdGFnID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCWlmICh0YWcuZXF1YWxzKHRhcmdldENvbnRyaWJ1dGlvblRhZykpIHsKLQkJCXJlYWRFbGVtZW50Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmICh0YWcuZXF1YWxzKFRBR19QUk9WSURFUikpIHsKLQkJCWNhY2hlLmFkZChlbGVtZW50KTsKLQkJCXJldHVybiB0cnVlOyAvLyBqdXN0IGNhY2hlIHRoZSBlbGVtZW50IC0gZG9uJ3QgZ28gaW50byBpdAotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0Ryb3BBY3Rpb25Qcm94eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9Ecm9wQWN0aW9uUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU4YWI4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0Ryb3BBY3Rpb25Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlByb3h5OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JRXh0ZW5kZWRTaW1wbGVFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTZWxmVmFsaWRhdGVFZGl0QWN0aW9uOwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgRHJvcEFjdGlvblByb3h5IGltcGxlbWVudHMgSW52b2NhdGlvbkhhbmRsZXIgewotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKE9iamVjdCBvYmopIHsKLQkJT2JqZWN0IGluc3RhbmNlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQkJQ2xhc3MgY2xhenogPSBvYmouZ2V0Q2xhc3MoKTsKLQkJCXdoaWxlIChjbGF6eiAhPSBudWxsKSB7Ci0JCQkJQ2xhc3NbXSBpbnRlcmZhY2VzID0gY2xhenouZ2V0SW50ZXJmYWNlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgewotCQkJCQlzZXQuYWRkKGludGVyZmFjZXNbaV0pOwotCQkJCX0KLQkJCQljbGF6eiA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKTsKLQkJCX0KLQkJCUNsYXNzW10gY2xhc3NlcyA9IG5ldyBDbGFzc1tzZXQuc2l6ZSgpXTsKLQkJCUl0ZXJhdG9yIGl0ciA9IHNldC5pdGVyYXRvcigpOwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCQljbGFzc2VzW2ldID0gKENsYXNzKSBpdHIubmV4dCgpOwotCQkJCWkrKzsKLQkJCX0KLQkJCWluc3RhbmNlID0gUHJveHkubmV3UHJveHlJbnN0YW5jZShvYmouZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLCBjbGFzc2VzLCBuZXcgRHJvcEFjdGlvblByb3h5KG9iaikpOwotCQl9IGNhdGNoIChFcnJvciBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcHJveHlpbmcgYSBkcm9wIGFjdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQlpbnN0YW5jZSA9IG9iajsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBJRXh0ZW5kZWRTaW1wbGVFZGl0b3IgZWRpdG9yID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZlJlY29yZGVyOwotCXByaXZhdGUgT2JqZWN0IG9iajsKLQotCXByaXZhdGUgRHJvcEFjdGlvblByb3h5KE9iamVjdCBvYmopIHsKLQkJdGhpcy5vYmogPSBvYmo7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJlZ2luUmVjb3JkaW5nKCkgewotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWRvY3VtZW50ID0gZWRpdG9yLmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLQkJCQlmUmVjb3JkZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvY3VtZW50KTsKLQkJCS8vIFByZXBhcmUgZm9yIFVuZG8KLQkJCWlmIChmUmVjb3JkZXIgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVtID0gZlJlY29yZGVyLmdldFVuZG9NYW5hZ2VyKCk7Ci0JCQkJaWYgKHVtICE9IG51bGwpIHsKLQkJCQkJaWYgKHRoaXMub2JqIGluc3RhbmNlb2YgSUFjdGlvbikKLQkJCQkJCXVtLmJlZ2luUmVjb3JkaW5nKHRoaXMsICgoSUFjdGlvbikgdGhpcy5vYmopLmdldFRleHQoKSwgKChJQWN0aW9uKSB0aGlzLm9iaikuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkJCWVsc2UKLQkJCQkJCXVtLmJlZ2luUmVjb3JkaW5nKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBlbmRSZWNvcmRpbmcoKSB7Ci0JCWlmIChmUmVjb3JkZXIgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgdW0gPSBmUmVjb3JkZXIuZ2V0VW5kb01hbmFnZXIoKTsKLQkJCWlmICh1bSAhPSBudWxsKQotCQkJCXVtLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJCWZSZWNvcmRlci5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCWZSZWNvcmRlciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyI2ludm9rZShPYmplY3QsIE1ldGhvZCwKLQkgKiAgICAgIE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCBwcm94eSwgTWV0aG9kIG0sIE9iamVjdFtdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgewotCQlPYmplY3QgcmVzdWx0OwotCQlTdHJpbmcgbmFtZSA9IG0uZ2V0TmFtZSgpOwotCQl0cnkgewotCQkJaWYgKG5hbWUuZXF1YWxzKCJlcXVhbHMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJLy8gV29ya2Fyb3VuZCBmb3IgSkRLJ3MgYnVnIDQ2NTI4NzYKLQkJCQkvLyAiZXF1YWxzIiBhbHdheXMgcmV0dXJucyBmYWxzZSBldmVuIGlmIGJvdGgKLQkJCQkvLyBJbnZvY2F0aW9uSGFuZGxlcgotCQkJCS8vIGNsYXNzCi0JCQkJLy8gaG9sZCB0aGUgc2FtZSBvYmplY3RzCi0JCQkJLy8gU2VlCi0JCQkJLy8gaHR0cDovL2RldmVsb3Blci5qYXZhLnN1bi5jb20vZGV2ZWxvcGVyL2J1Z1BhcmFkZS9idWdzLzQ2NTI4NzYuaHRtbAotCQkJCS8vIFRoaXMgcHJvYmxlbSBpcyBpbiB0aGUgSUJNIFNESyAxLjMuMQotCQkJCS8vIGJ1dCBJIGRvbid0IHNlZSB0aGUgYnVnIGluIFN1bidzIEpESyAxLjQuMSAoYmV0YSkKLQkJCQlPYmplY3QgYXJnID0gYXJnc1swXTsKLQkJCQlyZXR1cm4gKHByb3h5LmdldENsYXNzKCkgPT0gYXJnLmdldENsYXNzKCkgJiYgZXF1YWxzKFByb3h5LmdldEludm9jYXRpb25IYW5kbGVyKGFyZykpKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJydW4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGFyZ3NbMV0gaW5zdGFuY2VvZiBJRXh0ZW5kZWRTaW1wbGVFZGl0b3IpIHsKLQkJCQkJZWRpdG9yID0gKElFeHRlbmRlZFNpbXBsZUVkaXRvcikgYXJnc1sxXTsKLQkJCQl9Ci0JCQkJYmVnaW5SZWNvcmRpbmcoKTsKLQkJCQlpZiAoKGVkaXRvciAhPSBudWxsKSAmJiAhKG9iaiBpbnN0YW5jZW9mIElTZWxmVmFsaWRhdGVFZGl0QWN0aW9uKSkgewotCQkJCQkKLQkJCQkJLy8gVE9ETzogY2xlYW51cCB2YWxpZGF0ZUVkaXQKLQkJCQkJLy8ganVzdCBsZWF2aW5nIHRoaXMgY2hlY2sgYW5kIGZvbGxvd2luZyBjb2RlIGhlcmUgZm9yIHRyYW5zaXRpb24uIAotCQkJCQkvLyBJIGFzc3VtZSB3ZSdsbCByZW1vdmUgYWxsIG5lZWQgZm9yICd2YWxpZGF0ZUVkaXQnCi0JCQkJCS8vIG9yIG1vdmUgdG8gcGxhdGZvcm0gZWRpdG9yJ3MgdmFsaWRhdGVTdGF0ZSAKLQkJCQkJCi0vLwkJCQkJSVN0YXR1cyBzdGF0dXMgPSBlZGl0b3IudmFsaWRhdGVFZGl0KGdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpKTsKLS8vCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLS8vCQkJCQkJcmV0dXJuIG51bGw7Ci0vLwkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJlc3VsdCA9IG0uaW52b2tlKG9iaiwgYXJncyk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChuYW1lLmVxdWFscygicnVuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWVuZFJlY29yZGluZygpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9FeHRlbmRlZEVkaXRvckFjdGlvblByb3h5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0V4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjExYzdiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0V4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLklTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSUV4dGVuZGVkU2ltcGxlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5JU2VsZlZhbGlkYXRlRWRpdEFjdGlvbjsKLQotCi0vKioKLSAqIEJlZ2lucyBhbmQgZW5kcyBVbmRvTWFuYWdlciByZWNvcmRpbmcgYXJvdW5kIHJ1bigpIGFuZCBydW5XaXRoRXZlbnQoLi4uKQotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eSBpbXBsZW1lbnRzIEludm9jYXRpb25IYW5kbGVyIHsKLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShPYmplY3Qgb2JqKSB7Ci0JCVNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQlDbGFzcyBjbGF6eiA9IG9iai5nZXRDbGFzcygpOwotCQl3aGlsZSAoY2xhenogIT0gbnVsbCkgewotCQkJQ2xhc3NbXSBpbnRlcmZhY2VzID0gY2xhenouZ2V0SW50ZXJmYWNlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2V0LmFkZChpbnRlcmZhY2VzW2ldKTsKLQkJCX0KLQkJCWNsYXp6ID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOwotCQl9Ci0JCUNsYXNzW10gY2xhc3NlcyA9IG5ldyBDbGFzc1tzZXQuc2l6ZSgpXTsKLQkJSXRlcmF0b3IgaXRyID0gc2V0Lml0ZXJhdG9yKCk7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCWNsYXNzZXNbaV0gPSAoQ2xhc3MpIGl0ci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJcmV0dXJuIFByb3h5Lm5ld1Byb3h5SW5zdGFuY2Uob2JqLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwgY2xhc3NlcywgbmV3IEV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHkob2JqKSk7Ci0JfQotCi0JcHJpdmF0ZSBJRXh0ZW5kZWRTaW1wbGVFZGl0b3IgZWRpdG9yID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZlJlY29yZGVyOwotCXByaXZhdGUgT2JqZWN0IG9iajsKLQotCXByaXZhdGUgRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eShPYmplY3Qgb2JqKSB7Ci0JCXRoaXMub2JqID0gb2JqOwotCX0KLQotCXByaXZhdGUgdm9pZCBiZWdpblJlY29yZGluZygpIHsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQlkb2N1bWVudCA9IGVkaXRvci5nZXREb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpCi0JCQkJZlJlY29yZGVyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0JCQkvLyBQcmVwYXJlIGZvciBVbmRvCi0JCQlpZiAoZlJlY29yZGVyICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bSA9IGZSZWNvcmRlci5nZXRVbmRvTWFuYWdlcigpOwotCQkJCWlmICh1bSAhPSBudWxsKSB7Ci0JCQkJCXVtLmJlZ2luUmVjb3JkaW5nKHRoaXMsICgoSUFjdGlvbikgdGhpcy5vYmopLmdldFRleHQoKSwgKChJQWN0aW9uKSB0aGlzLm9iaikuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuZFJlY29yZGluZygpIHsKLQkJaWYgKGZSZWNvcmRlciAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bSA9IGZSZWNvcmRlci5nZXRVbmRvTWFuYWdlcigpOwotCQkJaWYgKHVtICE9IG51bGwpIHsKLQkJCQl1bS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JCQl9Ci0JCQlmUmVjb3JkZXIucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQlmUmVjb3JkZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlciNpbnZva2UoT2JqZWN0LCBNZXRob2QsCi0JICogICAgICBPYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGludm9rZShPYmplY3QgcHJveHksIE1ldGhvZCBtLCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBuYW1lID0gbS5nZXROYW1lKCk7Ci0JCXRyeSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoImVxdWFscyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBXb3JrYXJvdW5kIGZvciBKREsncyBidWcgNDY1Mjg3NgotCQkJCS8vICJlcXVhbHMiIGFsd2F5cyByZXR1cm5zIGZhbHNlIGV2ZW4gaWYgYm90aAotCQkJCS8vIEludm9jYXRpb25IYW5kbGVyCi0JCQkJLy8gY2xhc3MKLQkJCQkvLyBob2xkIHRoZSBzYW1lIG9iamVjdHMKLQkJCQkvLyBTZWUKLQkJCQkvLyBodHRwOi8vZGV2ZWxvcGVyLmphdmEuc3VuLmNvbS9kZXZlbG9wZXIvYnVnUGFyYWRlL2J1Z3MvNDY1Mjg3Ni5odG1sCi0JCQkJLy8gVGhpcyBwcm9ibGVtIGlzIGluIHRoZSBJQk0gU0RLIDEuMy4xCi0JCQkJLy8gYnV0IEkgZG9uJ3Qgc2VlIHRoZSBidWcgaW4gU3VuJ3MgSkRLIDEuNC4xIChiZXRhKQotCQkJCU9iamVjdCBhcmcgPSBhcmdzWzBdOwotCQkJCXJldHVybiAocHJveHkuZ2V0Q2xhc3MoKSA9PSBhcmcuZ2V0Q2xhc3MoKSAmJiBlcXVhbHMoUHJveHkuZ2V0SW52b2NhdGlvbkhhbmRsZXIoYXJnKSkpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCX0gZWxzZSBpZiAobmFtZS5lcXVhbHMoInJ1bldpdGhFdmVudCIpIHx8IG5hbWUuZXF1YWxzKCJydW4iKSkgeyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJYmVnaW5SZWNvcmRpbmcoKTsKLQkJCQlpZiAoKGVkaXRvciAhPSBudWxsKSAmJiAhKHRoaXMub2JqIGluc3RhbmNlb2YgSVNlbGZWYWxpZGF0ZUVkaXRBY3Rpb24pKSB7Ci0JCQkJCQotCQkJCQkvLyBUT0RPOiBjbGVhbnVwIHZhbGlkYXRlRWRpdAotCQkJCQkvLyBqdXN0IGxlYXZpbmcgdGhpcyBjaGVjayBhbmQgZm9sbG93aW5nIGNvZGUgaGVyZSBmb3IgdHJhbnNpdGlvbi4gCi0JCQkJCS8vIEkgYXNzdW1lIHdlJ2xsIHJlbW92ZSBhbGwgbmVlZCBmb3IgJ3ZhbGlkYXRlRWRpdCcKLQkJCQkJLy8gb3IgbW92ZSB0byBwbGF0Zm9ybSBlZGl0b3IncyB2YWxpZGF0ZVN0YXRlIAotCi0vLwkJCQkJSVN0YXR1cyBzdGF0dXMgPSBlZGl0b3IudmFsaWRhdGVFZGl0KGdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpKTsKLS8vCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLS8vCQkJCQkJcmV0dXJuIG51bGw7Ci0vLwkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAobmFtZS5lcXVhbHMoInNldEFjdGl2ZUV4dGVuZGVkRWRpdG9yIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChhcmdzWzBdIGluc3RhbmNlb2YgSUV4dGVuZGVkU2ltcGxlRWRpdG9yKSB7Ci0JCQkJCWVkaXRvciA9IChJRXh0ZW5kZWRTaW1wbGVFZGl0b3IpIGFyZ3NbMF07Ci0JCQkJfQotCQkJfQotCQkJcmVzdWx0ID0gbS5pbnZva2UodGhpcy5vYmosIGFyZ3MpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQkvL3Rocm93IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJaWYgKG5hbWUuZXF1YWxzKCJydW5XaXRoRXZlbnQiKSB8fCBuYW1lLmVxdWFscygicnVuIikpIHsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCS8vIG9ubHkgZXhwb3NlIHVzZXItZHJpdmVuIGV4Y2VwdGlvbnMgZnJvbSAicnVubmluZyIgdG8gdGhlCi0JCQkJLy8gdXNlcgotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChuYW1lLmVxdWFscygicnVuV2l0aEV2ZW50IikgfHwgbmFtZS5lcXVhbHMoInJ1biIpKSB7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQllbmRSZWNvcmRpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9FeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzNjMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9FeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JRXh0ZW5kZWRFZGl0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JRXh0ZW5kZWRTaW1wbGVFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIEV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcgaW1wbGVtZW50cyBJRXh0ZW5kZWRFZGl0b3JBY3Rpb24sIElFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nLCBJQWN0aW9uIHsKLSAgICBwcml2YXRlIElBY3Rpb24gcHJveHk7Ci0gICAgcHJpdmF0ZSBJQWN0aW9uIGR1bW15ID0gbmV3IEFjdGlvbigpIHsgLy8gdGhpcyBpcyBmb3IgbWFpbmx5IGl0cyBwcm9wZXJ0eSBjaGFuZ2Ugbm90aWZ5Li4uCi0gICAgfTsKLSAgICAvLyBwcm94eSdlZCBwcm9wZXJ0aWVzCi0gICAgcHJpdmF0ZSBTdHJpbmcgcF9pZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0X3BfaWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcF90ZXh0OwotICAgIHByaXZhdGUgU3RyaW5nIHBfZGVzY3JpcHRpb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNldF9wX3RleHQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNldF9wX2Rlc2NyaXB0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIHBfdG9vbFRpcFRleHQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNldF9wX3Rvb2xUaXBUZXh0OwotICAgIHByaXZhdGUgU3RyaW5nIHBfYWN0aW9uRGVmaW5pdGlvbklkOwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRfcF9hY3Rpb25EZWZpbml0aW9uSWQ7Ci0gICAgcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgcF9pbWFnZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0X3BfaW1hZ2U7Ci0gICAgcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgcF9ob3ZlckltYWdlOwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRfcF9ob3ZlckltYWdlOwotICAgIHByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIHBfZGlzYWJsZWRJbWFnZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0X3BfZGlzYWJsZWRJbWFnZTsKLSAgICBwcml2YXRlIGludCBwX2FjY2VsZXJhdG9yOwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRfcF9hY2NlbGVyYXRvcjsKLSAgICBwcml2YXRlIGludCBwX3N0eWxlID0gQVNfUFVTSF9CVVRUT047Ci0gICAgLy9wcml2YXRlIGJvb2xlYW4gc2V0X3Bfc3R5bGU7Ci0gICAgcHJpdmF0ZSBIZWxwTGlzdGVuZXIgcF9oZWxwTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNldF9wX2hlbHBMaXN0ZW5lcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gcF9lbmFibGVkID0gdHJ1ZTsgLy8gc2hvdWxkIGJlIHNhbWUgYXMgd2hhdCBpcyBkb25lIGluCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldF9wX2VuYWJsZWQ7Ci0gICAgcHJpdmF0ZSBMaXN0ZW5lckxpc3QgcF9saXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KDMpOwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRfcF9saXN0ZW5lcnM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHBfY2hlY2tlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0X3BfY2hlY2tlZDsKLSAgICBwcml2YXRlIElFeHRlbmRlZFNpbXBsZUVkaXRvciBwX3RhcmdldEVkaXRvcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0X3BfdGFyZ2V0RWRpdG9yOwotCXByaXZhdGUgYm9vbGVhbiBwX2lzdmlzaWJsZSA9IHRydWU7IC8vIHNob3VsZCBiZSB0cnVlCi0JCi0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIFN0cmluZyBjbGFzc0F0dHJpYnV0ZTsKLQotCSAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2FkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIHBfbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgICAgIHNldF9wX2xpc3RlbmVycyA9IHRydWU7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3h5LmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAJZHVtbXkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldEFjY2VsZXJhdG9yKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEFjY2VsZXJhdG9yKCkgewotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJveHkuZ2V0QWNjZWxlcmF0b3IoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcF9hY2NlbGVyYXRvcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldEFjdGlvbkRlZmluaXRpb25JZCgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25EZWZpbml0aW9uSWQoKSB7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm94eS5nZXRBY3Rpb25EZWZpbml0aW9uSWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcF9hY3Rpb25EZWZpbml0aW9uSWQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXREZXNjcmlwdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwX2lkICsgIjogZ2V0RGVzY3JpcHRpb24iKTsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm94eS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwX2Rlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoKQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoKSB7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm94eS5nZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwX2Rpc2FibGVkSW1hZ2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRIZWxwTGlzdGVuZXIoKQotICAgICAqLwotICAgIHB1YmxpYyBIZWxwTGlzdGVuZXIgZ2V0SGVscExpc3RlbmVyKCkgewotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJveHkuZ2V0SGVscExpc3RlbmVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBfaGVscExpc3RlbmVyOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoKQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoKSB7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm94eS5nZXRIb3ZlckltYWdlRGVzY3JpcHRvcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwX2hvdmVySW1hZ2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRJZCgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3h5LmdldElkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBfaWQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRJbWFnZURlc2NyaXB0b3IoKQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJveHkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBfaW1hZ2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRNZW51Q3JlYXRvcigpCi0gICAgICovCi0gICAgcHVibGljIElNZW51Q3JlYXRvciBnZXRNZW51Q3JlYXRvcigpIHsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwX2lkICsgIjogZ2V0TWVudUNyZWF0b3IiKTsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKLSAgICAgICAgcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3h5LmdldE1lbnVDcmVhdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRTdHlsZSgpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTdHlsZSgpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3h5LmdldFN0eWxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBfc3R5bGU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRUZXh0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm94eS5nZXRUZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBfdGV4dDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldFRvb2xUaXBUZXh0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJveHkuZ2V0VG9vbFRpcFRleHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcF90b29sVGlwVGV4dDsKLSAgICB9Ci0gICAgCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIGNvbnRyaWJ1dGluZyBidW5kbGUgaXMgYWN0aXZlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCdW5kbGVBY3RpdmUoKSB7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKSk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCAmJiBidW5kbGUuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNpc0NoZWNrZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ2hlY2tlZCgpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3h5LmlzQ2hlY2tlZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwX2NoZWNrZWQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNpc0VuYWJsZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3h5LmlzRW5hYmxlZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwX2VuYWJsZWQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNyZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBwX2xpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBkdW1teS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBpZiB0aGlzIGhhcyBhIGtleSBhY2NlbGVyYXRvciwgZmlyc3QgdXBkYXRlIHRoaXMgYWN0aW9uIGFuZCB0bwotICAgICAgICAgICAgLy8gc2VlIGlmIHRoaXMgYWN0aW9uIGlzIGVuYWJsZWQgb3Igbm90LgotICAgICAgICAgICAgaWYgKChwcm94eS5nZXRBY2NlbGVyYXRvcigpID4gMCkgfHwgKHByb3h5LmdldEFjdGlvbkRlZmluaXRpb25JZCgpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRW5hYmxlZCgpID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJveHkucnVuKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcm94eS5ydW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuV2l0aEV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChFdmVudCBldmVudCkgewotICAgICAgICByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBzYW1lIGFzIHJ1bigpCi0gICAgICAgICAgICBpZiAoKHByb3h5LmdldEFjY2VsZXJhdG9yKCkgPiAwKSB8fCAocHJveHkuZ2V0QWN0aW9uRGVmaW5pdGlvbklkKCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNFbmFibGVkKCkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBwcm94eS5ydW5XaXRoRXZlbnQoZXZlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJveHkucnVuV2l0aEV2ZW50KGV2ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0QWN0aW9uRGVmaW5pdGlvbklkKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aW9uRGVmaW5pdGlvbklkKFN0cmluZyBpZCkgewotICAgICAgICBwX2FjdGlvbkRlZmluaXRpb25JZCA9IGlkOwotICAgICAgICBzZXRfcF9hY3Rpb25EZWZpbml0aW9uSWQgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zZXRBY3Rpb25EZWZpbml0aW9uSWQoaWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAJZHVtbXkuc2V0QWN0aW9uRGVmaW5pdGlvbklkKGlkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0Q2hlY2tlZChib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENoZWNrZWQoYm9vbGVhbiBjaGVja2VkKSB7Ci0gICAgICAgIHBfY2hlY2tlZCA9IGNoZWNrZWQ7Ci0gICAgICAgIHNldF9wX2NoZWNrZWQgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zZXRDaGVja2VkKGNoZWNrZWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAJZHVtbXkuc2V0Q2hlY2tlZChjaGVja2VkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0RGVzY3JpcHRpb24oamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgcF9kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgICAgICBzZXRfcF9kZXNjcmlwdGlvbiA9IHRydWU7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3h5LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWR1bW15LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3Iob3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBuZXdJbWFnZSkgewotICAgICAgICBwX2Rpc2FibGVkSW1hZ2UgPSBuZXdJbWFnZTsKLSAgICAgICAgc2V0X3BfZGlzYWJsZWRJbWFnZSA9IHRydWU7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3h5LnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKG5ld0ltYWdlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWR1bW15LnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKG5ld0ltYWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0RW5hYmxlZChib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIHBfZW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgICAgIHNldF9wX2VuYWJsZWQgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAJZHVtbXkuc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0SGVscExpc3RlbmVyKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscExpc3RlbmVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhlbHBMaXN0ZW5lcihIZWxwTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgcF9oZWxwTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICAgICAgc2V0X3BfaGVscExpc3RlbmVyID0gdHJ1ZTsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJveHkuc2V0SGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWR1bW15LnNldEhlbHBMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldEhvdmVySW1hZ2VEZXNjcmlwdG9yKG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IgbmV3SW1hZ2UpIHsKLSAgICAgICAgcF9ob3ZlckltYWdlID0gbmV3SW1hZ2U7Ci0gICAgICAgIHNldF9wX2hvdmVySW1hZ2UgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihuZXdJbWFnZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlkdW1teS5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihuZXdJbWFnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldElkKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHBfaWQgPSBpZDsKLSAgICAgICAgc2V0X3BfaWQgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zZXRJZChpZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlkdW1teS5zZXRJZChpZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldEltYWdlRGVzY3JpcHRvcihvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBuZXdJbWFnZSkgewotICAgICAgICBwX2ltYWdlID0gbmV3SW1hZ2U7Ci0gICAgICAgIHNldF9wX2ltYWdlID0gdHJ1ZTsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJveHkuc2V0SW1hZ2VEZXNjcmlwdG9yKG5ld0ltYWdlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWR1bW15LnNldEltYWdlRGVzY3JpcHRvcihuZXdJbWFnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldE1lbnVDcmVhdG9yKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3IpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVudUNyZWF0b3IoSU1lbnVDcmVhdG9yIGNyZWF0b3IpIHsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwX2lkICsgIjogc2V0TWVudUNyZWF0b3IiKTsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKLSAgICAgICAgcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJveHkuc2V0TWVudUNyZWF0b3IoY3JlYXRvcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlkdW1teS5zZXRNZW51Q3JlYXRvcihjcmVhdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0VGV4dChqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgcF90ZXh0ID0gdGV4dDsKLSAgICAgICAgc2V0X3BfdGV4dCA9IHRydWU7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3h5LnNldFRleHQodGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlkdW1teS5zZXRUZXh0KHRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRUb29sVGlwVGV4dChqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvb2xUaXBUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHBfdG9vbFRpcFRleHQgPSB0ZXh0OwotICAgICAgICBzZXRfcF90b29sVGlwVGV4dCA9IHRydWU7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3h5LnNldFRvb2xUaXBUZXh0KHRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAJZHVtbXkuc2V0VG9vbFRpcFRleHQodGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldEFjY2VsZXJhdG9yKGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBY2NlbGVyYXRvcihpbnQga2V5Y29kZSkgewotICAgICAgICBwX2FjY2VsZXJhdG9yID0ga2V5Y29kZTsKLSAgICAgICAgc2V0X3BfYWNjZWxlcmF0b3IgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zZXRBY2NlbGVyYXRvcihrZXljb2RlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWR1bW15LnNldEFjY2VsZXJhdG9yKGtleWNvZGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklFeHRlbmRlZEVkaXRvckFjdGlvbiNzZXRBY3RpdmVFeHRlbmRlZEVkaXRvcihjb20uaWJtLnNzZS5lZGl0b3IuZXh0ZW5zaW9uLklFeHRlbmRlZFNpbXBsZUVkaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFeHRlbmRlZEVkaXRvcihJRXh0ZW5kZWRTaW1wbGVFZGl0b3IgdGFyZ2V0RWRpdG9yKSB7Ci0JCXBfdGFyZ2V0RWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCQlzZXRfcF90YXJnZXRFZGl0b3IgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmICgocHJveHkgIT0gbnVsbCkgJiYgKHByb3h5IGluc3RhbmNlb2YgSUV4dGVuZGVkRWRpdG9yQWN0aW9uKSkgewotICAgICAgICAgICAgKChJRXh0ZW5kZWRFZGl0b3JBY3Rpb24pcHJveHkpLnNldEFjdGl2ZUV4dGVuZGVkRWRpdG9yKHRhcmdldEVkaXRvcik7Ci0gICAgICAgIH0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLnNzZS5lZGl0b3IuZXh0ZW5zaW9uLklFeHRlbmRlZEVkaXRvckFjdGlvbiNpc1Zpc2libGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAoKHByb3h5ICE9IG51bGwpICYmIChwcm94eSBpbnN0YW5jZW9mIElFeHRlbmRlZEVkaXRvckFjdGlvbikpIHsKLSAgICAgICAgICAgIHJldHVybiAoKElFeHRlbmRlZEVkaXRvckFjdGlvbilwcm94eSkuaXNWaXNpYmxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBfaXN2aXNpYmxlOwotCX0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jaXNIYW5kbGVkCi0gICAgICovCi0JcHVibGljIGJvb2xlYW4gaXNIYW5kbGVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gc2VlIEFjdGlvbkRlc2NyaXB0b3IjY3JlYXRlRXh0ZW5zaW9uCi0JcHJpdmF0ZSBzdGF0aWMgSUFjdGlvbiBuZXdJbnN0YW5jZShmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxtLCBmaW5hbCBTdHJpbmcgY2xhKSB7Ci0JCWZpbmFsIE9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbMV07Ci0JCS8vIElmIHBsdWdpbiBoYXMgYmVlbiBsb2FkZWQgY3JlYXRlIGV4dGVuc2lvbi4KLQkJLy8gT3RoZXJ3aXNlLCBzaG93IGJ1c3kgY3Vyc29yIHRoZW4gY3JlYXRlIGV4dGVuc2lvbi4KLQkJQnVuZGxlIGJ1bmRsZT0gUGxhdGZvcm0uZ2V0QnVuZGxlKGVsbS5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKSk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCAmJiBidW5kbGUuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQl0cnkgewotCQkJCXJlc3VsdFswXSA9IGVsbS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGNsYSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBjYXRjaCBhbmQgbG9nIEFOWSBleGNlcHRpb24gZnJvbSBleHRlbnNpb24gcG9pbnQKLQkJCQloYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKHJlc3VsdCwgZSwgZWxtLmdldEF0dHJpYnV0ZShjbGEpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKG51bGwsIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXN1bHRbMF0gPSBlbG0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihjbGEpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gY2F0Y2ggYW5kIGxvZyBBTlkgZXhjZXB0aW9uIGZyb20gZXh0ZW5zaW9uIHBvaW50Ci0JCQkJCQloYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKHJlc3VsdCwgZSwgZWxtLmdldEF0dHJpYnV0ZShjbGEpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWlmICgocmVzdWx0WzBdICE9IG51bGwpICYmIChyZXN1bHRbMF0gaW5zdGFuY2VvZiBJQWN0aW9uKSkgewotCQkJcmV0dXJuIChJQWN0aW9uKXJlc3VsdFswXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLSAgICB9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBoYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKGZpbmFsIE9iamVjdFtdIHJlc3VsdCwgVGhyb3dhYmxlIGUsIFN0cmluZyBjbGFzc25hbWUpIHsKLQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiVW5hYmxlIHRvIGNyZWF0ZSBwcm94eSBhY3Rpb24gZm9yICIgKyBjbGFzc25hbWUsIGUpOwotCQlyZXN1bHRbMF0gPSBudWxsOwotCX0KLQotCS8qKgotICAgICAqIEluc3RhbnRpYXRlIGEgcmVhbCBjbGFzcyBoZXJlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVhbGl6ZSgpIHsKLSAgICAgICAgaWYgKChwcm94eSA9PSBudWxsKSAmJiAoZWxlbWVudCAhPSBudWxsKSAmJiAoY2xhc3NBdHRyaWJ1dGUgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHByb3h5ID0gbmV3SW5zdGFuY2UoZWxlbWVudCwgY2xhc3NBdHRyaWJ1dGUpOwotCSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLQkgICAgICAgICAgICAvLyBwcm9wYWdhdGUgcHJveHknZWQgcHJvcGVydGllcwotCSAgICAgICAgICAgIGlmIChzZXRfcF9saXN0ZW5lcnMgPT0gdHJ1ZSkgewotCSAgICAgICAgICAgICAgICBpZiAocF9saXN0ZW5lcnMuc2l6ZSgpID4gMCkgewotCSAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gbCA9IHBfbGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCSAgICAgICAgICAgICAgICAgICAgaW50IGxzID0gbC5sZW5ndGg7Ci0JICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxzOyBpKyspIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwbCA9IChJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikgbFtpXTsKLQkgICAgICAgICAgICAgICAgICAgICAgICBwcm94eS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHBsKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICBkdW1teS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHBsKTsgLy8gcmVtb3ZlIGxpc3RlbmVyIGZyb20gZHltbXkgc28gdGhhdCB3ZSBkb24ndCBzZW5kIG5vdGlmaWNhdGlvbnMgdHdpY2UgYW55bW9yZQotCSAgICAgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGlmIChzZXRfcF9hY2NlbGVyYXRvciA9PSB0cnVlKSB7Ci0JICAgICAgICAgICAgICAgIHByb3h5LnNldEFjY2VsZXJhdG9yKHBfYWNjZWxlcmF0b3IpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBpZiAoc2V0X3BfYWN0aW9uRGVmaW5pdGlvbklkID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfYWN0aW9uRGVmaW5pdGlvbklkICE9IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgICAgIHByb3h5LnNldEFjdGlvbkRlZmluaXRpb25JZChwX2FjdGlvbkRlZmluaXRpb25JZCk7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHNldF9wX2NoZWNrZWQgPT0gdHJ1ZSkgewotCSAgICAgICAgICAgICAgICBwcm94eS5zZXRDaGVja2VkKHBfY2hlY2tlZCk7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGlmIChzZXRfcF9kaXNhYmxlZEltYWdlID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfZGlzYWJsZWRJbWFnZSAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgICAgICAgICBwcm94eS5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihwX2Rpc2FibGVkSW1hZ2UpOwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGlmIChzZXRfcF9lbmFibGVkID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgcHJveHkuc2V0RW5hYmxlZChwX2VuYWJsZWQpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBpZiAoc2V0X3BfaGVscExpc3RlbmVyID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfaGVscExpc3RlbmVyICE9IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgICAgIHByb3h5LnNldEhlbHBMaXN0ZW5lcihwX2hlbHBMaXN0ZW5lcik7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHNldF9wX2hvdmVySW1hZ2UgPT0gdHJ1ZSkgewotCSAgICAgICAgICAgICAgICBpZiAocF9ob3ZlckltYWdlICE9IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgICAgIHByb3h5LnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKHBfaG92ZXJJbWFnZSk7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHNldF9wX2lkID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfaWQgIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICAgICAgcHJveHkuc2V0SWQocF9pZCk7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHNldF9wX2ltYWdlID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfaW1hZ2UgIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICAgICAgcHJveHkuc2V0SW1hZ2VEZXNjcmlwdG9yKHBfaW1hZ2UpOwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGlmIChzZXRfcF90ZXh0ID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfdGV4dCAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgICAgICAgICBwcm94eS5zZXRUZXh0KHBfdGV4dCk7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHNldF9wX2Rlc2NyaXB0aW9uID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICAgICAgcHJveHkuc2V0RGVzY3JpcHRpb24ocF9kZXNjcmlwdGlvbik7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHNldF9wX3Rvb2xUaXBUZXh0ID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfdG9vbFRpcFRleHQgIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICAgICAgcHJveHkuc2V0VG9vbFRpcFRleHQocF90b29sVGlwVGV4dCk7Ci0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHNldF9wX3RhcmdldEVkaXRvciA9PSB0cnVlKSB7Ci0JICAgICAgICAgICAgICAgIGlmIChwX3RhcmdldEVkaXRvciAhPSBudWxsKSB7Ci0JCQkJICAgICAgICBpZiAocHJveHkgaW5zdGFuY2VvZiBJRXh0ZW5kZWRFZGl0b3JBY3Rpb24pIHsKLQkJCQkgICAgICAgICAgICAoKElFeHRlbmRlZEVkaXRvckFjdGlvbilwcm94eSkuc2V0QWN0aXZlRXh0ZW5kZWRFZGl0b3IocF90YXJnZXRFZGl0b3IpOwotCQkJCSAgICAgICAgfQotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZWFsaXplZCgpIHsKLSAgICAgICAgcmV0dXJuIChwcm94eSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZSN1cGRhdGUoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAoKHByb3h5ICE9IG51bGwpICYmIChwcm94eSBpbnN0YW5jZW9mIElVcGRhdGUpKSB7Ci0gICAgICAgICAgICAoKElVcGRhdGUpIHByb3h5KS51cGRhdGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCBhIHJlYWwgYWN0aW9uIGNsYXNzCi0gICAgICovCi0gICAgcHVibGljIElBY3Rpb24gZ2V0QWN0aW9uKCkgewotICAgICAgICByZWFsaXplKCk7Ci0gICAgICAgIHJldHVybiBwcm94eTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoZXNlIGFyZSBBY3Rpb25zJ3MgY29uc3RydWN0b3JzCi0gICAgICovCi0gICAgRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgfQotICAgIHB1YmxpYyBFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nKGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBmaW5hbCBTdHJpbmcgY2xhc3NBdHRyaWJ1dGUpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICAgICAgdGhpcy5jbGFzc0F0dHJpYnV0ZSA9IGNsYXNzQXR0cmlidXRlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vSUV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vSUV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczODU4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nIHsKLSAgICBwdWJsaWMgSUFjdGlvbiBnZXRBY3Rpb24oKTsKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWxpemVkKCk7Ci0gICAgcHVibGljIHZvaWQgcmVhbGl6ZSgpOwotICAgIGJvb2xlYW4gaXNCdW5kbGVBY3RpdmUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vSW1hZ2VVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0ltYWdlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWZjNTYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vSW1hZ2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb247Ci0KLQotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIEltYWdlVXRpbCB7Ci0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIE1ldGhvZC4gUmV0dXJucyBhbiBJbWFnZURlc2NyaXB0b3Igd2hvc2UgcGF0aCwgcmVsYXRpdmUgdG8KLQkgKiB0aGUgcGx1Z2luIGNvbnRhaW5pbmcgdGhlIDxjb2RlPmV4dGVuc2lvbjwvY29kZT4gaXMKLQkgKiA8Y29kZT5zdWJkaXJlY3RvcnlBbmRGaWxlbmFtZTwvY29kZT4uIElmIHRoZXJlIGlzbid0IGFueSB2YWx1ZQotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZSB0aGVuIDxjb2RlPm51bGwKLQkgKiA8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIGNvbnZlbmllbmNlIGFuZCBvbmx5IGludGVuZGVkIGZvciB1c2UgYnkgdGhlIHdvcmtiZW5jaAotCSAqIGJlY2F1c2UgaXQgZXhwbGljaXRseSB1c2VzIHRoZSB3b3JrYmVuY2gncyByZWdpc3RyeSBmb3IKLQkgKiBjYWNoaW5nL3JldHJpZXZpbmcgaW1hZ2VzIGZyb20gb3RoZXIgZXh0ZW5zaW9ucyAtLSBvdGhlciBwbHVnaW5zIG11c3QKLQkgKiB1c2VyIHRoZWlyIG93biByZWdpc3RyeS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2QgaXMgc3ViamVjdCB0byByZW1vdmFsLgotCSAqIAotCSAqIE5vdGU6IHN1YmRpcmVjdG9yeUFuZEZpbGVuYW1lIG11c3Qgbm90IGhhdmUgYW55IGxlYWRpbmcgIi4iIG9yIHBhdGgKLQkgKiBzZXBhcmF0b3JzIC8gb3IgXCBJU1YncyBzaG91bGQgdXNlIGljb25zL215c2FtcGxlLmdpZiBhbmQgbm90Ci0JICogLi9pY29ucy9teXNhbXBsZS5naWYKLQkgKiAKLQkgKiBOb3RlOiBUaGlzIGNvbnN1bHRzIHRoZSBwbHVnaW4gZm9yIGV4dGVuc2lvbiBhbmQgb2J0YWlucyBpdHMKLQkgKiBpbnN0YWxsYXRpb24gbG9jYXRpb24uIGFsbCByZXF1ZXN0ZWQgaW1hZ2VzIGFyZSBhc3N1bWVkIHRvIGJlIGluIGEKLQkgKiBkaXJlY3RvcnkgYmVsb3cgYW5kIHJlbGF0aXZlIHRvIHRoYXQgcGx1Z2lucyBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvckZyb21FeHRlbnNpb24oSUV4dGVuc2lvbiBleHRlbnNpb24sIFN0cmluZyBzdWJkaXJlY3RvcnlBbmRGaWxlbmFtZSkgewotCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlKCk7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQlyZXR1cm4gZ2V0SW1hZ2VEZXNjcmlwdG9yRnJvbUJ1bmRsZShidW5kbGUsIHN1YmRpcmVjdG9yeUFuZEZpbGVuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBNZXRob2QuIFJldHVybiBhbiBJbWFnZURlc2NyaXB0b3Igd2hvc2UgcGF0aCByZWxhdGl2ZSB0bwotCSAqIHRoZSBwbHVnaW4gZGVzY3JpYmVkIGJ5IDxjb2RlPmJ1bmRsZTwvY29kZT4gaXMKLQkgKiA8Y29kZT5zdWJkaXJlY3RvcnlBbmRGaWxlbmFtZTwvY29kZT4uIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiBubyBpbWFnZSBjb3VsZCBiZSBmb3VuZC4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBjb252ZW5pZW5jZSBhbmQgb25seSBpbnRlbmRlZCBmb3IgdXNlIGJ5IHRoZSB3b3JrYmVuY2gKLQkgKiBiZWNhdXNlIGl0IGV4cGxpY2l0bHkgdXNlcyB0aGUgd29ya2JlbmNoJ3MgcmVnaXN0cnkgZm9yCi0JICogY2FjaGluZy9yZXRyaWV2aW5nIGltYWdlcyBmcm9tIG90aGVyIGV4dGVuc2lvbnMgLS0gb3RoZXIgcGx1Z2lucyBtdXN0Ci0JICogdXNlciB0aGVpciBvd24gcmVnaXN0cnkuIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kIGlzIHN1YmplY3QgdG8gcmVtb3ZhbC4KLQkgKiAKLQkgKiBOb3RlOiBzdWJkaXJlY3RvcnlBbmRGaWxlbmFtZSBtdXN0IG5vdCBoYXZlIGFueSBsZWFkaW5nICIuIiBvciBwYXRoCi0JICogc2VwYXJhdG9ycyAvIG9yIFwgSVNWJ3Mgc2hvdWxkIHVzZSBpY29ucy9teXNhbXBsZS5naWYgYW5kIG5vdAotCSAqIC4vaWNvbnMvbXlzYW1wbGUuZ2lmCi0JICogCi0JICogTm90ZTogVGhpcyBjb25zdWx0cyB0aGUgcGx1Z2luIGZvciBleHRlbnNpb24gYW5kIG9idGFpbnMgaXRzCi0JICogaW5zdGFsbGF0aW9uIGxvY2F0aW9uLiBhbGwgcmVxdWVzdGVkIGltYWdlcyBhcmUgYXNzdW1lZCB0byBiZSBpbiBhCi0JICogZGlyZWN0b3J5IGJlbG93IGFuZCByZWxhdGl2ZSB0byB0aGF0IHBsdWdpbnMgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3JGcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBzdWJkaXJlY3RvcnlBbmRGaWxlbmFtZSkgewotCi0JCVVSTCBwYXRoID0gYnVuZGxlLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJVVJMIGZ1bGxQYXRoU3RyaW5nID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZ1bGxQYXRoU3RyaW5nID0gbmV3IFVSTChwYXRoLCBzdWJkaXJlY3RvcnlBbmRGaWxlbmFtZSk7Ci0JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoZnVsbFBhdGhTdHJpbmcpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2ZThiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL1JlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLlNvcnRlcjsKLQotCi0vKioKLSAqIFRlbXBsYXRlIGltcGxlbWVudGF0aW9uIG9mIGEgcmVnaXN0cnkgcmVhZGVyIHRoYXQgY3JlYXRlcyBvYmplY3RzCi0gKiByZXByZXNlbnRpbmcgcmVnaXN0cnkgY29udGVudHMuIFR5cGljYWxseSwgYW4gZXh0ZW5zaW9uIGNvbnRhaW5zIG9uZQotICogZWxlbWVudCwgYnV0IHRoaXMgcmVhZGVyIGhhbmRsZXMgbXVsdGlwbGUgZWxlbWVudHMgcGVyIGV4dGVuc2lvbi4KLSAqIAotICogVG8gc3RhcnQgcmVhZGluZyB0aGUgZXh0ZW5zaW9ucyBmcm9tIHRoZSByZWdpc3RyeSBmb3IgYW4gZXh0ZW5zaW9uIHBvaW50LAotICogY2FsbCB0aGUgbWV0aG9kIDxjb2RlPnJlYWRSZWdpc3RyeTwvY29kZT4uCi0gKiAKLSAqIFRvIHJlYWQgY2hpbGRyZW4gb2YgYW4gSUNvbmZpZ3VyYXRpb25FbGVtZW50LCBjYWxsIHRoZSBtZXRob2QKLSAqIDxjb2RlPnJlYWRFbGVtZW50Q2hpbGRyZW48L2NvZGU+IGZyb20geW91ciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWV0aG9kCi0gKiA8Y29kZT5yZWFkRWxlbWVudDwvY29kZT4sIGFzIGl0IHdpbGwgbm90IGJlIGRvbmUgYnkgZGVmYXVsdC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXByb3RlY3RlZCBSZWdpc3RyeVJlYWRlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBleHRyYWN0cyBkZXNjcmlwdGlvbiBhcyBhIHN1YmVsZW1lbnQgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogCi0JICogQHJldHVybiBkZXNjcmlwdGlvbiBzdHJpbmcgaWYgZGVmaW5lZCwgb3IgZW1wdHkgc3RyaW5nIGlmIG5vdC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBjb25maWcuZ2V0Q2hpbGRyZW4oVEFHX0RFU0NSSVBUSU9OKTsKLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA+PSAxKSB7Ci0JCQlyZXR1cm4gY2hpbGRyZW5bMF0uZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBlcnJvciBpbiB0aGUgd29ya2JlbmNoIGxvZyB1c2luZyB0aGUgcHJvdmlkZWQgdGV4dCBhbmQgdGhlCi0JICogaW5mb3JtYXRpb24gaW4gdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2dFcnJvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRleHQpIHsKLQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKCJQbHVnaW4gIiArIGV4dGVuc2lvbi5nZXROYW1lc3BhY2UoKSArICIsIGV4dGVuc2lvbiAiICsgZXh0ZW5zaW9uLmdldEV4dGVuc2lvblBvaW50VW5pcXVlSWRlbnRpZmllcigpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJYnVmLmFwcGVuZCgiXG4iICsgdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIGJ1Zi50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIGEgdmVyeSBjb21tb24gcmVnaXN0cnkgZXJyb3Igd2hlbiBhIHJlcXVpcmVkIGF0dHJpYnV0ZSBpcyBtaXNzaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvZ01pc3NpbmdBdHRyaWJ1dGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCWxvZ0Vycm9yKGVsZW1lbnQsICJSZXF1aXJlZCBhdHRyaWJ1dGUgJyIgKyBhdHRyaWJ1dGVOYW1lICsgIicgbm90IGRlZmluZWQiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIGEgcmVnaXN0cnkgZXJyb3Igd2hlbiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGlzIHVua25vd24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9nVW5rbm93bkVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJbG9nRXJyb3IoZWxlbWVudCwgIlVua25vd24gZXh0ZW5zaW9uIHRhZyBmb3VuZDogIiArIGVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEFwcGx5IGEgcmVwcm9kdWNhYmxlIG9yZGVyIHRvIHRoZSBsaXN0IG9mIGV4dGVuc2lvbnMgcHJvdmlkZWQsIHN1Y2gKLQkgKiB0aGF0IHRoZSBvcmRlciB3aWxsIG5vdCBjaGFuZ2UgYXMgZXh0ZW5zaW9ucyBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSUV4dGVuc2lvbltdIG9yZGVyRXh0ZW5zaW9ucyhJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucykgewotCQkvLyBCeSBkZWZhdWx0LCB0aGUgb3JkZXIgaXMgYmFzZWQgb24gcGx1Z2luIGlkIHNvcnRlZAotCQkvLyBpbiBhc2NlbmRpbmcgb3JkZXIuIFRoZSBvcmRlciBmb3IgYSBwbHVnaW4gcHJvdmlkaW5nCi0JCS8vIG1vcmUgdGhhbiBvbmUgZXh0ZW5zaW9uIGZvciBhbiBleHRlbnNpb24gcG9pbnQgaXMKLQkJLy8gZGVwZW5kZW50IGluIHRoZSBvcmRlciBsaXN0ZWQgaW4gdGhlIFhNTCBmaWxlLgotCQlTb3J0ZXIgc29ydGVyID0gbmV3IFNvcnRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGNvbXBhcmUoT2JqZWN0IGV4dGVuc2lvbjEsIE9iamVjdCBleHRlbnNpb24yKSB7Ci0JCQkJU3RyaW5nIHMxID0gKChJRXh0ZW5zaW9uKSBleHRlbnNpb24xKS5nZXROYW1lc3BhY2UoKS50b1VwcGVyQ2FzZSgpOwotCQkJCVN0cmluZyBzMiA9ICgoSUV4dGVuc2lvbikgZXh0ZW5zaW9uMikuZ2V0TmFtZXNwYWNlKCkudG9VcHBlckNhc2UoKTsKLQkJCQkvL1JldHVybiB0cnVlIGlmIGVsZW1lbnRUd28gaXMgJ2dyZWF0ZXIgdGhhbicgZWxlbWVudE9uZQotCQkJCXJldHVybiBzMi5jb21wYXJlVG8oczEpID4gMDsKLQkJCX0KLQkJfTsKLQotCQlPYmplY3RbXSBzb3J0ZWQgPSBzb3J0ZXIuc29ydChleHRlbnNpb25zKTsKLQkJSUV4dGVuc2lvbltdIHNvcnRlZEV4dGVuc2lvbiA9IG5ldyBJRXh0ZW5zaW9uW3NvcnRlZC5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHNvcnRlZCwgMCwgc29ydGVkRXh0ZW5zaW9uLCAwLCBzb3J0ZWQubGVuZ3RoKTsKLQkJcmV0dXJuIHNvcnRlZEV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVhZCBlbGVtZW50J3MgYXR0cmlidXRlcy4gSWYgY2hpbGRyZW4gc2hvdWxkCi0JICogYWxzbyBiZSByZWFkLCB0aGVuIGltcGxlbWVudG9yIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nCi0JICogPGNvZGU+cmVhZEVsZW1lbnRDaGlsZHJlbjwvY29kZT4uIEltcGxlbWVudG9yIGlzIGFsc28gcmVzcG9uc2libGUKLQkgKiBmb3IgbG9nZ2luZyBtaXNzaW5nIGF0dHJpYnV0ZXMuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGVsZW1lbnQgd2FzIHJlY29nbml6ZWQsIGZhbHNlIGlmIG5vdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBSZWFkIHRoZSBlbGVtZW50J3MgY2hpbGRyZW4uIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBzdWJjbGFzcycKLQkgKiByZWFkRWxlbWVudCBtZXRob2Qgd2hlbiBpdCB3YW50cyB0byByZWFkIHRoZSBjaGlsZHJlbiBvZiB0aGUgZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudENoaWxkcmVuKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJlYWRFbGVtZW50cyhlbGVtZW50LmdldENoaWxkcmVuKCkpOwotCX0KLQotCS8qKgotCSAqIFJlYWQgZWFjaCBlbGVtZW50IG9uZSBhdCBhIHRpbWUgYnkgY2FsbGluZyB0aGUgc3ViY2xhc3MgaW1wbGVtZW50YXRpb24KLQkgKiBvZiA8Y29kZT5yZWFkRWxlbWVudDwvY29kZT4uCi0JICogCi0JICogTG9ncyBhbiBlcnJvciBpZiB0aGUgZWxlbWVudCB3YXMgbm90IHJlY29nbml6ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnRzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pKQotCQkJCWxvZ1Vua25vd25FbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlYWQgb25lIGV4dGVuc2lvbiBieSBsb29waW5nIHRocm91Z2ggaXRzIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZEV4dGVuc2lvbihJRXh0ZW5zaW9uIGV4dGVuc2lvbikgewotCQlyZWFkRWxlbWVudHMoZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgcmVhZFJlZ2lzdHJ5KElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZFJlZ2lzdHJ5KElQbHVnaW5SZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpIHsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQocGx1Z2luSWQsIGV4dGVuc2lvblBvaW50KTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gcG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZXh0ZW5zaW9ucyA9IG9yZGVyRXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLQkJCQlyZWFkRXh0ZW5zaW9uKGV4dGVuc2lvbnNbaV0pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFN0YXJ0IHRoZSByZWdpc3RyeSByZWFkaW5nIHByb2Nlc3MgdXNpbmcgdGhlIHN1cHBsaWVkIHBsdWdpbiBJRCBhbmQKLQkgKiBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZFJlZ2lzdHJ5KElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpIHsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQocGx1Z2luSWQsIGV4dGVuc2lvblBvaW50KTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gcG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZXh0ZW5zaW9ucyA9IG9yZGVyRXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLQkJCQlyZWFkRXh0ZW5zaW9uKGV4dGVuc2lvbnNbaV0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0dGluZ1N0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBlNWQ3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmZvcm1hdDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UeXBlZFBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Gb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUZvcm1hdHRpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3kgZXh0ZW5kcyBDb250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kgewotCi0JLyoqIERvY3VtZW50cyB0byBiZSBmb3JtYXR0ZWQgYnkgdGhpcyBzdHJhdGVneSAqLwotCXByaXZhdGUgZmluYWwgTGlua2VkTGlzdCBmRG9jdW1lbnRzID0gbmV3IExpbmtlZExpc3QoKTsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZGb3JtYXRQcm9jZXNzb3I7Ci0JLyoqIFBhcnRpdGlvbnMgdG8gYmUgZm9ybWF0dGVkIGJ5IHRoaXMgc3RyYXRlZ3kgKi8KLQlwcml2YXRlIGZpbmFsIExpbmtlZExpc3QgZlBhcnRpdGlvbnMgPSBuZXcgTGlua2VkTGlzdCgpOwotCXByaXZhdGUgSVJlZ2lvbiBmUmVnaW9uOwotCi0JLyoqCi0JICogQHBhcmFtIGZvcm1hdFByb2Nlc3NvcgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRm9ybWF0dGluZ1N0cmF0ZWd5KElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvcikgewotCQlzdXBlcigpOwotCi0JCWZGb3JtYXRQcm9jZXNzb3IgPSBmb3JtYXRQcm9jZXNzb3I7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGZvcm1hdCgpIHsKLQkJc3VwZXIuZm9ybWF0KCk7Ci0KLQkJZmluYWwgSURvY3VtZW50IGRvY3VtZW50ID0gKElEb2N1bWVudCkgZkRvY3VtZW50cy5yZW1vdmVGaXJzdCgpOwotCQlmaW5hbCBUeXBlZFBvc2l0aW9uIHBhcnRpdGlvbiA9IChUeXBlZFBvc2l0aW9uKSBmUGFydGl0aW9ucy5yZW1vdmVGaXJzdCgpOwotCi0JCWlmIChkb2N1bWVudCAhPSBudWxsICYmIHBhcnRpdGlvbiAhPSBudWxsICYmIGZSZWdpb24gIT0gbnVsbCAmJiBmRm9ybWF0UHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZkZvcm1hdFByb2Nlc3Nvci5mb3JtYXREb2N1bWVudChkb2N1bWVudCwgZlJlZ2lvbi5nZXRPZmZzZXQoKSwgZlJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXR0ZXJTdGFydHMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUZvcm1hdHRpbmdDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIGZvcm1hdHRlclN0YXJ0cyhmaW5hbCBJRm9ybWF0dGluZ0NvbnRleHQgY29udGV4dCkgewotCQlzdXBlci5mb3JtYXR0ZXJTdGFydHMoY29udGV4dCk7Ci0KLQkJZlBhcnRpdGlvbnMuYWRkTGFzdChjb250ZXh0LmdldFByb3BlcnR5KEZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllcy5DT05URVhUX1BBUlRJVElPTikpOwotCQlmRG9jdW1lbnRzLmFkZExhc3QoY29udGV4dC5nZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9NRURJVU0pKTsKLQkJZlJlZ2lvbiA9IChJUmVnaW9uKSBjb250ZXh0LmdldFByb3BlcnR5KEZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllcy5DT05URVhUX1JFR0lPTik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXR0ZXJTdG9wcygpCi0JICovCi0JcHVibGljIHZvaWQgZm9ybWF0dGVyU3RvcHMoKSB7Ci0JCXN1cGVyLmZvcm1hdHRlclN0b3BzKCk7Ci0KLQkJZlBhcnRpdGlvbnMuY2xlYXIoKTsKLQkJZkRvY3VtZW50cy5jbGVhcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9oYW5kbGVycy9BYnN0cmFjdFN0cnVjdHVyZWRTZWxlY3RIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvaGFuZGxlcnMvQWJzdHJhY3RTdHJ1Y3R1cmVkU2VsZWN0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTc5NzAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9oYW5kbGVycy9BYnN0cmFjdFN0cnVjdHVyZWRTZWxlY3RIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlNlbGVjdGlvbkhpc3Rvcnk7Ci0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBBYnN0cmFjdFN0cnVjdHVyZWRTZWxlY3RIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZUVkaXRvcihldmVudCk7Ci0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpCi0JCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3I7Ci0JCWVsc2UgewotCQkJT2JqZWN0IG8gPSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQlpZiAobyAhPSBudWxsKQotCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIG87Ci0JCX0KLQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJLy8gZGV0ZXJtaW5lIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24KLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbiAmJiBkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCi0JCQkJaWYgKHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgPCBkb2N1bWVudC5nZXRMZW5ndGgoKSkgewotCQkJCQkvLyBnZXQgY3VycmVudCBpbmRleGVkIHJlZ2lvbgotCQkJCQlJbmRleGVkUmVnaW9uIGN1cnNvckluZGV4ZWRSZWdpb24gPSBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uKTsKLQotCQkJCQkvLyBkZXRlcm1pbmUgbmV3IHNlbGVjdGlvbiBiYXNlZCBvbiBjdXJyZW50IGluZGV4ZWQgcmVnaW9uCi0JCQkJCVJlZ2lvbiBuZXdTZWxlY3Rpb25SZWdpb24gPSBnZXROZXdTZWxlY3Rpb25SZWdpb24oY3Vyc29ySW5kZXhlZFJlZ2lvbiwgdGV4dFNlbGVjdGlvbik7Ci0KLQkJCQkJLy8gc2VsZWN0IG5ldyBzZWxlY3Rpb24KLQkJCQkJaWYgKG5ld1NlbGVjdGlvblJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlTZWxlY3Rpb25IaXN0b3J5IGhpc3RvcnkgPSAoU2VsZWN0aW9uSGlzdG9yeSkgZWRpdG9yLmdldEFkYXB0ZXIoU2VsZWN0aW9uSGlzdG9yeS5jbGFzcyk7Ci0JCQkJCQlpZiAoaGlzdG9yeSAhPSBudWxsKSB7Ci0JCQkJCQkJaGlzdG9yeS5yZW1lbWJlcihuZXcgUmVnaW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpKTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQloaXN0b3J5Lmlnbm9yZVNlbGVjdGlvbkNoYW5nZXMoKTsKLQkJCQkJCQkJdGV4dEVkaXRvci5zZWxlY3RBbmRSZXZlYWwobmV3U2VsZWN0aW9uUmVnaW9uLmdldE9mZnNldCgpLCBuZXdTZWxlY3Rpb25SZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJCX0KLQkJCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQkJaGlzdG9yeS5saXN0ZW5Ub1NlbGVjdGlvbkNoYW5nZXMoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBwcm9iYWJseSBiZSByZW1vdmVkIGFuZCByZXBsYWNlZCBieSB1c2luZyBuZXcKLQkgKiBzZWxlY3Rpb24gcHJvdmlkZXIKLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEluZGV4ZWRSZWdpb24oSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0KLQkJaW50IGxhc3RPZmZzZXQgPSBvZmZzZXQ7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaW5kZXhlZFJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24obGFzdE9mZnNldCk7Ci0JCQkJd2hpbGUgKGluZGV4ZWRSZWdpb24gPT0gbnVsbCAmJiBsYXN0T2Zmc2V0ID49IDApIHsKLQkJCQkJbGFzdE9mZnNldC0tOwotCQkJCQlpbmRleGVkUmVnaW9uID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihsYXN0T2Zmc2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpbmRleGVkUmVnaW9uOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEN1cnNvckluZGV4ZWRSZWdpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvaGFuZGxlcnMvRmluZE9jY3VycmVuY2VzSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2hhbmRsZXJzL0ZpbmRPY2N1cnJlbmNlc0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQwOTcxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvaGFuZGxlcnMvRmluZE9jY3VycmVuY2VzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGxhdGZvcm1TdGF0dXNMaW5lVXRpbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbmRPY2N1cnJlbmNlc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVFZGl0b3IoZXZlbnQpOwotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvclBhcnQ7Ci0JCWVsc2UgewotCQkJT2JqZWN0IG8gPSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0JCWJvb2xlYW4gb2theSA9IGZhbHNlOwotCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gZ2V0VGV4dFNlbGVjdGlvbih0ZXh0RWRpdG9yKTsKLQkJCQlGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZmluZE9jY3VycmVuY2VQcm9jZXNzb3IgPSBnZXRQcm9jZXNzb3JGb3JDdXJyZW50U2VsZWN0aW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uKTsKLQkJCQlpZiAoZmluZE9jY3VycmVuY2VQcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJCQlpZiAodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJCQkJSUZpbGUgZmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgdGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0JCQkJCQlva2F5ID0gZmluZE9jY3VycmVuY2VQcm9jZXNzb3IuZmluZE9jY3VycmVuY2VzKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uLCBmaWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAob2theSkgewotCQkJLy8gY2xlYXIgc3RhdHVzIG1lc3NhZ2UKLQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gU1NFVUlNZXNzYWdlcy5GaW5kT2NjdXJyZW5jZXNBY3Rpb25Qcm92aWRlcl8wOyAvLyROT04tTkxTLTEkCi0JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuYWRkT25lVGltZUNsZWFyTGlzdGVuZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBhcHByb3ByaWF0ZSBmaW5kIG9jY3VycmVuY2VzIHByb2Nlc3NvcgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudCAtCi0JICogICAgICAgICAgICBhc3N1bWVzIG5vdCBudWxsCi0JICogQHBhcmFtIHRleHRTZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yRm9yQ3VycmVudFNlbGVjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJLy8gY2hlY2sgaWYgd2UgaGF2ZSBhbiBhY3Rpb24gdGhhdCdzIGVuYWJsZWQgb24gdGhlIGN1cnJlbnQgcGFydGl0aW9uCi0JCUlUeXBlZFJlZ2lvbiB0ciA9IGdldFBhcnRpdGlvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCVN0cmluZyBwYXJ0aXRpb24gPSB0ciAhPSBudWxsID8gdHIuZ2V0VHlwZSgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlJdGVyYXRvciBpdCA9IGdldFByb2Nlc3NvcnMoKS5pdGVyYXRvcigpOwotCQlGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgYWN0aW9uID0gbnVsbDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJYWN0aW9uID0gKEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcikgaXQubmV4dCgpOwotCQkJLy8gd2UganVzdCBjaG9vc2UgdGhlIGZpcnN0IGFjdGlvbiB0aGF0IGNhbiBoYW5kbGUgdGhlIHBhcnRpdGlvbgotCQkJaWYgKGFjdGlvbi5lbmFibGVkRm9yUGFyaXRpdGlvbihwYXJ0aXRpb24pKQotCQkJCXJldHVybiBhY3Rpb247Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJVHlwZWRSZWdpb24gZ2V0UGFydGl0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJVHlwZWRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaWYgKHRleHRTZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZWdpb24gPSBkb2N1bWVudC5nZXRQYXJ0aXRpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXJlZ2lvbiA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQlwcml2YXRlIElUZXh0U2VsZWN0aW9uIGdldFRleHRTZWxlY3Rpb24oSVRleHRFZGl0b3IgdGV4dEVkaXRvcikgewotCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gbnVsbDsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbiAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQl9Ci0JCXJldHVybiB0ZXh0U2VsZWN0aW9uOwotCX0KLQkKLQlhYnN0cmFjdCBwcm90ZWN0ZWQgTGlzdCBnZXRQcm9jZXNzb3JzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvaGFuZGxlcnMvRm9ybWF0SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2hhbmRsZXJzL0Zvcm1hdEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIxYjgxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvaGFuZGxlcnMvRm9ybWF0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gLSBidWcgMjEyMzMwIC0KLSAqICAgICAgICAgICAgICAgICAgICBCYXNlZCBvZmYgRm9ybWF0QWN0aW9uRGVsZWdhdGUuamF2YQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5Mb2NhdGlvbktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9ucy5NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkZvcm1hdFByb2Nlc3NvcnNFeHRlbnNpb25SZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBGb3JtYXRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSUhhbmRsZXIgewotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZTZWxlY3Rpb247Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbnVsbGluZyBvdXQganVzdCBpbiBjYXNlCi0JfQotCQotCXByaXZhdGUgSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2UgZ2V0QWN0aXZlUHJvZ3Jlc3NTZXJ2aWNlKCkgewotCQlJV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLQkJaWYgKFBsYXRmb3JtVUkuaXNXb3JrYmVuY2hSdW5uaW5nKCkpIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgYWN0aXZlV29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCWlmIChhY3RpdmVXb3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkgewotCQkJCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBhY3RpdmVXb3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhcnQgYWN0aXZlUGFydCA9IGFjdGl2ZVBhZ2UuZ2V0QWN0aXZlUGFydCgpOwotCQkJCQlpZiAoYWN0aXZlUGFydCAhPSBudWxsKSB7Ci0JCQkJCQlzZXJ2aWNlID0gKElXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlKSBhY3RpdmVQYXJ0LmdldFNpdGUoKS5nZXRBZGFwdGVyKElXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlLmNsYXNzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VydmljZTsKLQl9Ci0JCi0JCi0JCi0KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkKLQkgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coZXZlbnQpLmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCi0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJZlNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJYm9vbGVhbiBhdmFpbGFibGUgPSBmYWxzZTsKLQotCQkJT2JqZWN0W10gZWxlbWVudHMgPSBmU2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZWxlbWVudHNbaV0gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQkJYXZhaWxhYmxlID0gcHJvY2Vzc29yQXZhaWxhYmxlKChJUmVzb3VyY2UpIGVsZW1lbnRzW2ldKTsKLQotCQkJCQlpZiAoYXZhaWxhYmxlKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZiAoZlNlbGVjdGlvbiAhPSBudWxsICYmICFmU2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJSm9iIGpvYiA9IGdldEpvYigpOwotCQkJaWYgKGpvYiAhPSBudWxsKSB7Ci0JCQkJSVdvcmtiZW5jaFNpdGVQcm9ncmVzc1NlcnZpY2UgcHJvZ3Jlc3NTZXJ2aWNlID0gZ2V0QWN0aXZlUHJvZ3Jlc3NTZXJ2aWNlKCk7Ci0JCQkJaWYgKHByb2dyZXNzU2VydmljZSAhPSBudWxsKSB7Ci0JCQkJCXByb2dyZXNzU2VydmljZS5zY2hlZHVsZShqb2IpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJam9iLnNjaGVkdWxlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQljbGFzcyBGb3JtYXRKb2IgZXh0ZW5kcyBKb2IgewotCi0JCXB1YmxpYyBGb3JtYXRKb2IoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKG5hbWUpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0JCQlPYmplY3RbXSBlbGVtZW50cyA9IGZTZWxlY3Rpb24udG9BcnJheSgpOwotCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIGVsZW1lbnRzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZWxlbWVudHNbaV0gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQkJcHJvY2VzcyhuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpLCAoSVJlc291cmNlKSBlbGVtZW50c1tpXSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl9Ci0JCQl9Ci0JCQltb25pdG9yLmRvbmUoKTsKLQotCQkJaWYgKGZFcnJvclN0YXR1cy5nZXRDaGlsZHJlbigpLmxlbmd0aCA+IDApIHsKLQkJCQlzdGF0dXMgPSBmRXJyb3JTdGF0dXM7Ci0JCQkJZkVycm9yU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFNTRVVJUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCBTU0VVSU1lc3NhZ2VzLkZvcm1hdEFjdGlvbkRlbGVnYXRlX2Vycm9yU3RhdHVzTWVzc2FnZSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBNdWx0aVN0YXR1cyBmRXJyb3JTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsIFNTRVVJTWVzc2FnZXMuRm9ybWF0QWN0aW9uRGVsZWdhdGVfZXJyb3JTdGF0dXNNZXNzYWdlLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUZpbGUgZmlsZSkgewotCQlpZihtb25pdG9yID09IG51bGwgfHwgbW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0JCQotCQl0cnkgewotCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDEwMCk7Ci0JCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQltb25pdG9yLndvcmtlZCg1KTsKLQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpOwotCQkJCUlTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvciA9IGdldEZvcm1hdFByb2Nlc3Nvcihjb250ZW50VHlwZS5nZXRJZCgpKTsKLQkJCQlpZiAoZm9ybWF0UHJvY2Vzc29yICE9IG51bGwgJiYgKG1vbml0b3IgPT0gbnVsbCB8fCAhbW9uaXRvci5pc0NhbmNlbGVkKCkpKSB7Ci0JCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV8zLCBuZXcgU3RyaW5nW117ZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpfSk7CQkJCQltb25pdG9yLnN1YlRhc2sobWVzc2FnZSk7Ci0JCQkJCWZvcm1hdFByb2Nlc3Nvci5zZXRQcm9ncmVzc01vbml0b3IobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCA5NSkpOwotCQkJCQlmb3JtYXRQcm9jZXNzb3IuZm9ybWF0RmlsZShmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsIGUpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV81LCBuZXcgU3RyaW5nW117ZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCl9KTsKLQkJCWZFcnJvclN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgZSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuRm9ybWF0QWN0aW9uRGVsZWdhdGVfNCwgbmV3IFN0cmluZ1tde2ZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpfSk7Ci0JCQlmRXJyb3JTdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGUpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuRm9ybWF0QWN0aW9uRGVsZWdhdGVfNCwgbmV3IFN0cmluZ1tde2ZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpfSk7Ci0JCQlmRXJyb3JTdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGUpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdChmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJZmluYWwgSUZpbGUgZmlsZSA9IChJRmlsZSkgcmVzb3VyY2U7Ci0KLQkJCS8vIEJVRyAxNzg1OTggLSBJZiB0aGUgcmVzb3VyY2UgaXMgc2hhcmVkLCBhbmQgaXQncyBwb3NzaWJsZSB0bwotCQkJLy8gZ2V0IHRoZSB3b3JrYmVuY2ggRGlzcGxheSwgdGhlIFVJIHRocmVhZCBpcyBhc2tlZCB0byBleGVjdXRlIHRoZQotCQkJLy8gZm9ybWF0IG9mIHRoZSBmaWxlIHdoZW4gaXQgY2FuCi0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMjApOyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCQkJCUlUZXh0RmlsZUJ1ZmZlck1hbmFnZXIgbWFuYWdlcj0gRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCk7Ci0JCQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJaWYobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCQltYW5hZ2VyLmNvbm5lY3QoZmlsZS5nZXRGdWxsUGF0aCgpLCBMb2NhdGlvbktpbmQuSUZJTEUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJCQkJYnVmZmVyID0gbWFuYWdlci5nZXRUZXh0RmlsZUJ1ZmZlcihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLCBMb2NhdGlvbktpbmQuSUZJTEUpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZihidWZmZXIgIT0gbnVsbCAmJiBidWZmZXIuaXNTaGFyZWQoKSkgewotCQkJCQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotCQkJCQkJaWYgKGRpc3BsYXkgIT0gbnVsbCkgewotCQkJCQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQlmb3JtYXQobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxOCksIGZpbGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJZm9ybWF0KG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTgpLCBmaWxlKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmKG1hbmFnZXIgIT0gbnVsbCkKLQkJCQkJCW1hbmFnZXIuZGlzY29ubmVjdChmaWxlLmdldEZ1bGxQYXRoKCksIExvY2F0aW9uS2luZC5JRklMRSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0JCQkJfQotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChTU0VVSU1lc3NhZ2VzLkZvcm1hdEFjdGlvbkRlbGVnYXRlXzQsIG5ldyBTdHJpbmdbXXtmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKX0pOwotCQkJCWZFcnJvclN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgZSkpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYobW9uaXRvciAhPSBudWxsKQotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJCQotCQkJCi0JCX0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ29udGFpbmVyKSByZXNvdXJjZTsKLQotCQkJdHJ5IHsKLQkJCQlJUmVzb3VyY2VbXSBtZW1iZXJzID0gY29udGFpbmVyLm1lbWJlcnMoKTsKLQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgbWVtYmVycy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChtb25pdG9yICE9IG51bGwgJiYgIW1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQkJZm9ybWF0KG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSksIG1lbWJlcnNbaV0pOwotCQkJCX0KLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV80LCBuZXcgU3RyaW5nW117cmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpfSk7Ci0JCQkJZkVycm9yU3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNTRVVJUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBlKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0KLQkJLy8gTm90ZTogdGhlIHdvcmtiZW5jaCBzaG91bGQgYWx3YXlzIGhhdmUgYSBkaXNwbGF5Ci0JCS8vICh1bmxlc3MgcnVubmluZyBoZWFkbGVzcyksIHdoZXJlYXMgRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJLy8gb25seSByZXR1cm5zIHRoZSBkaXNwbGF5IGlmIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRocmVhZAotCQkvLyBoYXMgb25lLgotCQlpZiAoUGxhdGZvcm1VSS5pc1dvcmtiZW5jaFJ1bm5pbmcoKSkKLQkJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGdldEZvcm1hdFByb2Nlc3NvcihTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlyZXR1cm4gRm9ybWF0UHJvY2Vzc29yc0V4dGVuc2lvblJlYWRlci5nZXRJbnN0YW5jZSgpLmdldEZvcm1hdFByb2Nlc3Nvcihjb250ZW50VHlwZUlkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSm9iIGdldEpvYigpIHsKLQkJcmV0dXJuIG5ldyBGb3JtYXRKb2IoU1NFVUlNZXNzYWdlcy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV9qb2JOYW1lKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0LnV0aWwuUmVzb3VyY2VBY3Rpb25EZWxlZ2F0ZSNwcm9jZXNzKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3MoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDEwMCk7Ci0JCWZvcm1hdChuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDk4KSwgcmVzb3VyY2UpOwotCi0JCXRyeSB7Ci0JCQlyZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDIpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuRm9ybWF0QWN0aW9uRGVsZWdhdGVfNCwgbmV3IFN0cmluZ1tde3Jlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKX0pOwotCQkJZkVycm9yU3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNTRVVJUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBlKSk7Ci0JCX0KLQkJbW9uaXRvci5kb25lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLlJlc291cmNlQWN0aW9uRGVsZWdhdGUjcHJvY2Vzc29yQXZhaWxhYmxlKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzb3JBdmFpbGFibGUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgewotCQkJdHJ5IHsKLQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKLQotCQkJCQlJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBudWxsOwotCQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJCQlmb3JtYXRQcm9jZXNzb3IgPSBnZXRGb3JtYXRQcm9jZXNzb3IoY29udGVudFR5cGUuZ2V0SWQoKSk7Ci0JCQkJCX0KLQkJCQkJaWYgKGZvcm1hdFByb2Nlc3NvciAhPSBudWxsKQotCQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJCUlDb250YWluZXIgY29udGFpbmVyID0gKElDb250YWluZXIpIHJlc291cmNlOwotCQkJCQlJUmVzb3VyY2VbXSBtZW1iZXJzOwotCQkJCQltZW1iZXJzID0gY29udGFpbmVyLm1lbWJlcnMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlib29sZWFuIGF2YWlsYWJsZSA9IHByb2Nlc3NvckF2YWlsYWJsZShtZW1iZXJzW2ldKTsKLQotCQkJCQkJaWYgKGF2YWlsYWJsZSkgewotCQkJCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3RIaXN0b3J5SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2hhbmRsZXJzL1N0cnVjdHVyZWRTZWxlY3RIaXN0b3J5SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2M1NTI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0SGlzdG9yeUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU2VsZWN0aW9uSGlzdG9yeTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3RIaXN0b3J5SGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVFZGl0b3IoZXZlbnQpOwotCQlTZWxlY3Rpb25IaXN0b3J5IGhpc3RvcnkgPSAoU2VsZWN0aW9uSGlzdG9yeSkgZWRpdG9yLmdldEFkYXB0ZXIoU2VsZWN0aW9uSGlzdG9yeS5jbGFzcyk7Ci0JCWlmIChoaXN0b3J5ICE9IG51bGwpIHsKLQkJCUlSZWdpb24gb2xkID0gaGlzdG9yeS5nZXRMYXN0KCk7Ci0JCQlpZiAob2xkICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQloaXN0b3J5Lmlnbm9yZVNlbGVjdGlvbkNoYW5nZXMoKTsKLQotCQkJCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQkJCQllbHNlIHsKLQkJCQkJCU9iamVjdCBvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQkJCQl9Ci0JCQkJCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpCi0JCQkJCQl0ZXh0RWRpdG9yLnNlbGVjdEFuZFJldmVhbChvbGQuZ2V0T2Zmc2V0KCksIG9sZC5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQloaXN0b3J5Lmxpc3RlblRvU2VsZWN0aW9uQ2hhbmdlcygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0hpZ2hsaWdodGVySHlwZXJsaW5rUHJlc2VudGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0hpZ2hsaWdodGVySHlwZXJsaW5rUHJlc2VudGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwODVmYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2h5cGVybGluay9IaWdobGlnaHRlckh5cGVybGlua1ByZXNlbnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtQcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotCi0vKioKLSAqIFRoZSBpcyBhbG1vc3QgYW4gZXhhY3QgY29weSBvZiBEZWZhdWx0SHlwZXJsaW5rUHJlc2VudGVyLiBIb3dldmVyIHRoaXMKLSAqIGh5cGVybGluayBwcmVzZW50ZXIgd29ya3Mgd2l0aCB0aGUgU3RydWN0dXJlZFRleHRFZGl0b3IncyBIaWdobGlnaHRlcgotICogaW5zdGVhZCBvZiBUZXh0UHJlc2VudGF0aW9uLgotICogCi0gKiBUaGUgbWFpbiBkaWZmZXJlbmNlIGlzIDxjb2RlPnRleHQucmVkcmF3UmFuZ2Uob2Zmc2V0LCBsZW5ndGgsIHRydWUpOzwvY29kZT4KLSAqIGlzIGNhbGxlZCBpbnN0ZWFkIG9mIHBhc3NpbmcgZmFsc2UgZm9yIGNsZWFyQmFja2dyb3VuZC4gQWxzbyBhbGwgbWVudGlvbiBvZgotICogVGV4dFByZXNlbnRhdGlvbiB3YXMgcmVtb3ZlZCBzaW5jZSBpdCBkb2VzIG5vdCByZWFsbHkgYXBwbHkuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuRGVmYXVsdEh5cGVybGlua1ByZXNlbnRlcgotICovCi1wdWJsaWMgY2xhc3MgSGlnaGxpZ2h0ZXJIeXBlcmxpbmtQcmVzZW50ZXIgaW1wbGVtZW50cyBJSHlwZXJsaW5rUHJlc2VudGVyLCBQYWludExpc3RlbmVyLCBJVGV4dElucHV0TGlzdGVuZXIsIElEb2N1bWVudExpc3RlbmVyLCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBob2xkcyB0aGUgY29sb3IgdXNlZCBmb3IgaHlwZXJsaW5rcy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uIEEgUkdCIGNvbG9yIHZhbHVlIGVuY29kZWQgYXMgYQotCSAqIHN0cmluZyB1c2luZyBjbGFzcyA8Y29kZT5QcmVmZXJlbmNlQ29udmVydGVyPC9jb2RlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlN0cmluZ0NvbnZlcnRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSFlQRVJMSU5LX0NPTE9SID0gImh5cGVybGlua0NvbG9yIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKiogVGhlIHRleHQgdmlld2VyLiAqLwotCXByaXZhdGUgSVRleHRWaWV3ZXIgZlRleHRWaWV3ZXI7Ci0JLyoqIFRoZSBoYW5kIGN1cnNvci4gKi8KLQlwcml2YXRlIEN1cnNvciBmQ3Vyc29yOwotCS8qKiBUaGUgbGluayBjb2xvci4gKi8KLQlwcml2YXRlIENvbG9yIGZDb2xvcjsKLQkvKiogVGVsbHMgd2hldGhlciB0byBkaXNwb3NlIHRoZSBjb2xvciBvbiB1bmluc3RhbGwuICovCi0JcHJpdmF0ZSBib29sZWFuIGZEaXNwb3NlQ29sb3I7Ci0JLyoqIFRoZSBjdXJyZW50bHkgYWN0aXZlIHJlZ2lvbi4gKi8KLQlwcml2YXRlIElSZWdpb24gZkFjdGl2ZVJlZ2lvbjsKLQkvKiogVGhlIGN1cnJlbnRseSBhY3RpdmUgc3R5bGUgcmFuZ2UgYXMgcG9zaXRpb24uICovCi0JcHJpdmF0ZSBQb3NpdGlvbiBmUmVtZW1iZXJlZFBvc2l0aW9uOwotCS8qKiBUaGUgb3B0aW9uYWwgcHJlZmVyZW5jZSBzdG9yZSAqLwotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmUHJlZmVyZW5jZVN0b3JlOwotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGRlZmF1bHQgaHlwZXJsaW5rIHByZXNlbnRlciB3aGljaCB1c2VzCi0JICoge0BsaW5rICNIWVBFUkxJTktfQ09MT1J9dG8gcmVhZCB0aGUgY29sb3IgZnJvbSB0aGUgZ2l2ZW4gcHJlZmVyZW5jZQotCSAqIHN0b3JlLgotCSAqIAotCSAqIEBwYXJhbSBzdG9yZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2Ugc3RvcmUKLQkgKi8KLQlwdWJsaWMgSGlnaGxpZ2h0ZXJIeXBlcmxpbmtQcmVzZW50ZXIoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQlmUHJlZmVyZW5jZVN0b3JlID0gc3RvcmU7Ci0JCWZEaXNwb3NlQ29sb3IgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZGVmYXVsdCBoeXBlcmxpbmsgcHJlc2VudGVyLgotCSAqIAotCSAqIEBwYXJhbSBjb2xvcgotCSAqICAgICAgICAgICAgdGhlIGh5cGVybGluayBjb2xvciwgdG8gYmUgZGlzcG9zZWQgYnkgdGhlIGNhbGxlcgotCSAqLwotCXB1YmxpYyBIaWdobGlnaHRlckh5cGVybGlua1ByZXNlbnRlcihDb2xvciBjb2xvcikgewotCQlmRGlzcG9zZUNvbG9yID0gZmFsc2U7Ci0JCWZDb2xvciA9IGNvbG9yOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblNob3dNdWx0aXBsZUh5cGVybGlua3MoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzaG93SHlwZXJsaW5rcyhJSHlwZXJsaW5rW10gaHlwZXJsaW5rcykgewotCQlBc3NlcnQuaXNMZWdhbChoeXBlcmxpbmtzICE9IG51bGwgJiYgaHlwZXJsaW5rcy5sZW5ndGggPT0gMSk7Ci0JCWhpZ2hsaWdodFJlZ2lvbihoeXBlcmxpbmtzWzBdLmdldEh5cGVybGlua1JlZ2lvbigpKTsKLQkJYWN0aXZhdGVDdXJzb3IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBoaWRlSHlwZXJsaW5rcygpIHsKLQkJcmVwYWlyUmVwcmVzZW50YXRpb24oKTsKLQkJZlJlbWVtYmVyZWRQb3NpdGlvbiA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zdGFsbChJVGV4dFZpZXdlciB0ZXh0Vmlld2VyKSB7Ci0JCUFzc2VydC5pc05vdE51bGwodGV4dFZpZXdlcik7Ci0JCWZUZXh0Vmlld2VyID0gdGV4dFZpZXdlcjsKLQkJZlRleHRWaWV3ZXIuYWRkVGV4dElucHV0TGlzdGVuZXIodGhpcyk7Ci0KLQkJU3R5bGVkVGV4dCB0ZXh0ID0gZlRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlpZiAodGV4dCAhPSBudWxsICYmICF0ZXh0LmlzRGlzcG9zZWQoKSkgewotCQkJdGV4dC5hZGRQYWludExpc3RlbmVyKHRoaXMpOwotCQkJaWYgKGZQcmVmZXJlbmNlU3RvcmUgIT0gbnVsbCkKLQkJCQlmQ29sb3IgPSBjcmVhdGVDb2xvcihmUHJlZmVyZW5jZVN0b3JlLCBIWVBFUkxJTktfQ09MT1IsIHRleHQuZ2V0RGlzcGxheSgpKTsKLQkJfQotCi0JCWlmIChmUHJlZmVyZW5jZVN0b3JlICE9IG51bGwpCi0JCQlmUHJlZmVyZW5jZVN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsKCkgewotCQlmVGV4dFZpZXdlci5yZW1vdmVUZXh0SW5wdXRMaXN0ZW5lcih0aGlzKTsKLQotCQlpZiAoZkNvbG9yICE9IG51bGwpIHsKLQkJCWlmIChmRGlzcG9zZUNvbG9yKQotCQkJCWZDb2xvci5kaXNwb3NlKCk7Ci0JCQlmQ29sb3IgPSBudWxsOwotCQl9Ci0KLQkJaWYgKGZDdXJzb3IgIT0gbnVsbCkgewotCQkJZkN1cnNvci5kaXNwb3NlKCk7Ci0JCQlmQ3Vyc29yID0gbnVsbDsKLQkJfQotCi0JCVN0eWxlZFRleHQgdGV4dCA9IGZUZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRleHQgIT0gbnVsbCAmJiAhdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQl0ZXh0LnJlbW92ZVBhaW50TGlzdGVuZXIodGhpcyk7Ci0KLQkJZlRleHRWaWV3ZXIgPSBudWxsOwotCi0JCWlmIChmUHJlZmVyZW5jZVN0b3JlICE9IG51bGwpCi0JCQlmUHJlZmVyZW5jZVN0b3JlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChmVGV4dFZpZXdlcik7Ci0JCWZDb2xvciA9IGNvbG9yOwotCX0KLQotCXByaXZhdGUgdm9pZCBoaWdobGlnaHRSZWdpb24oSVJlZ2lvbiByZWdpb24pIHsKLQotCQlpZiAocmVnaW9uLmVxdWFscyhmQWN0aXZlUmVnaW9uKSkKLQkJCXJldHVybjsKLQotCQlyZXBhaXJSZXByZXNlbnRhdGlvbigpOwotCi0JCVN0eWxlZFRleHQgdGV4dCA9IGZUZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQotCi0JCS8vIFVuZGVybGluZQotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJaW50IGxlbmd0aCA9IDA7Ci0JCWlmIChmVGV4dFZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotCQkJSVRleHRWaWV3ZXJFeHRlbnNpb241IGV4dGVuc2lvbiA9IChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIGZUZXh0Vmlld2VyOwotCQkJSVJlZ2lvbiB3aWRnZXRSYW5nZSA9IGV4dGVuc2lvbi5tb2RlbFJhbmdlMldpZGdldFJhbmdlKHJlZ2lvbik7Ci0JCQlpZiAod2lkZ2V0UmFuZ2UgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCW9mZnNldCA9IHdpZGdldFJhbmdlLmdldE9mZnNldCgpOwotCQkJbGVuZ3RoID0gd2lkZ2V0UmFuZ2UuZ2V0TGVuZ3RoKCk7Ci0KLQkJfQotCQllbHNlIHsKLQkJCW9mZnNldCA9IHJlZ2lvbi5nZXRPZmZzZXQoKSAtIGZUZXh0Vmlld2VyLmdldFZpc2libGVSZWdpb24oKS5nZXRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJfQotCi0JCS8vIG5lZWRzIHRvIGNsZWFuIGJhY2tncm91bmQgZHVlIHRvIFN0cnVjdHVyZWRUZXh0RWRpdG9yJ3MgaGlnaGxpZ2h0ZXIKLQkJdGV4dC5yZWRyYXdSYW5nZShvZmZzZXQsIGxlbmd0aCwgdHJ1ZSk7Ci0KLQkJLy8gSW52YWxpZGF0ZSByZWdpb24gPT0+IGFwcGx5IHRleHQgcHJlc2VudGF0aW9uCi0JCWZBY3RpdmVSZWdpb24gPSByZWdpb247Ci0KLQkJaWYgKGZUZXh0Vmlld2VyIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb24yKQotCQkJKChJVGV4dFZpZXdlckV4dGVuc2lvbjIpIGZUZXh0Vmlld2VyKS5pbnZhbGlkYXRlVGV4dFByZXNlbnRhdGlvbihyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCWVsc2UKLQkJCWZUZXh0Vmlld2VyLmludmFsaWRhdGVUZXh0UHJlc2VudGF0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFjdGl2YXRlQ3Vyc29yKCkgewotCQlTdHlsZWRUZXh0IHRleHQgPSBmVGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0JCURpc3BsYXkgZGlzcGxheSA9IHRleHQuZ2V0RGlzcGxheSgpOwotCQlpZiAoZkN1cnNvciA9PSBudWxsKQotCQkJZkN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9IQU5EKTsKLQkJdGV4dC5zZXRDdXJzb3IoZkN1cnNvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc2V0Q3Vyc29yKCkgewotCQlTdHlsZWRUZXh0IHRleHQgPSBmVGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0ICE9IG51bGwgJiYgIXRleHQuaXNEaXNwb3NlZCgpKQotCQkJdGV4dC5zZXRDdXJzb3IobnVsbCk7Ci0KLQkJaWYgKGZDdXJzb3IgIT0gbnVsbCkgewotCQkJZkN1cnNvci5kaXNwb3NlKCk7Ci0JCQlmQ3Vyc29yID0gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZXBhaXJSZXByZXNlbnRhdGlvbigpIHsKLQotCQlpZiAoZkFjdGl2ZVJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWludCBvZmZzZXQgPSBmQWN0aXZlUmVnaW9uLmdldE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gZkFjdGl2ZVJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJZkFjdGl2ZVJlZ2lvbiA9IG51bGw7Ci0KLQkJcmVzZXRDdXJzb3IoKTsKLQotCQkvLyBJbnZhbGlkYXRlID09PiByZW1vdmUgYXBwbGllZCB0ZXh0IHByZXNlbnRhdGlvbgotCQlpZiAoZlRleHRWaWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjIpCi0JCQkoKElUZXh0Vmlld2VyRXh0ZW5zaW9uMikgZlRleHRWaWV3ZXIpLmludmFsaWRhdGVUZXh0UHJlc2VudGF0aW9uKG9mZnNldCwgbGVuZ3RoKTsKLQkJZWxzZQotCQkJZlRleHRWaWV3ZXIuaW52YWxpZGF0ZVRleHRQcmVzZW50YXRpb24oKTsKLQotCQkvLyBSZW1vdmUgdW5kZXJsaW5lCi0JCWlmIChmVGV4dFZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotCQkJSVRleHRWaWV3ZXJFeHRlbnNpb241IGV4dGVuc2lvbiA9IChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIGZUZXh0Vmlld2VyOwotCQkJb2Zmc2V0ID0gZXh0ZW5zaW9uLm1vZGVsT2Zmc2V0MldpZGdldE9mZnNldChvZmZzZXQpOwotCQl9Ci0JCWVsc2UgewotCQkJb2Zmc2V0IC09IGZUZXh0Vmlld2VyLmdldFZpc2libGVSZWdpb24oKS5nZXRPZmZzZXQoKTsKLQkJfQotCQl0cnkgewotCQkJU3R5bGVkVGV4dCB0ZXh0ID0gZlRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCi0JCQkvLyBuZWVkcyB0byBjbGVhbiBiYWNrZ3JvdW5kIGR1ZSB0byBTdHJ1Y3R1cmVkVGV4dEVkaXRvcidzCi0JCQkvLyBoaWdobGlnaHRlcgotCQkJdGV4dC5yZWRyYXdSYW5nZShvZmZzZXQsIGxlbmd0aCwgdHJ1ZSk7Ci0KLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHgpIHsKLQkJCS8vIGlnbm9yZSAtIGRvIG5vdCBsb2cKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBQYWludExpc3RlbmVyI3BhaW50Q29udHJvbChQYWludEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChmQWN0aXZlUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3R5bGVkVGV4dCB0ZXh0ID0gZlRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0JCWludCBvZmZzZXQgPSAwOwotCQlpbnQgbGVuZ3RoID0gMDsKLQotCQlpZiAoZlRleHRWaWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHsKLQotCQkJSVRleHRWaWV3ZXJFeHRlbnNpb241IGV4dGVuc2lvbiA9IChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIGZUZXh0Vmlld2VyOwotCQkJSVJlZ2lvbiB3aWRnZXRSYW5nZSA9IGV4dGVuc2lvbi5tb2RlbFJhbmdlMldpZGdldFJhbmdlKGZBY3RpdmVSZWdpb24pOwotCQkJaWYgKHdpZGdldFJhbmdlID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlvZmZzZXQgPSB3aWRnZXRSYW5nZS5nZXRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IHdpZGdldFJhbmdlLmdldExlbmd0aCgpOwotCi0JCX0KLQkJZWxzZSB7Ci0KLQkJCUlSZWdpb24gcmVnaW9uID0gZlRleHRWaWV3ZXIuZ2V0VmlzaWJsZVJlZ2lvbigpOwotCQkJaWYgKCFpbmNsdWRlcyhyZWdpb24sIGZBY3RpdmVSZWdpb24pKQotCQkJCXJldHVybjsKLQotCQkJb2Zmc2V0ID0gZkFjdGl2ZVJlZ2lvbi5nZXRPZmZzZXQoKSAtIHJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IGZBY3RpdmVSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCX0KLQotCQkvLyBzdXBwb3J0IGZvciBCSURJCi0JCVBvaW50IG1pbkxvY2F0aW9uID0gZ2V0TWluaW11bUxvY2F0aW9uKHRleHQsIG9mZnNldCwgbGVuZ3RoKTsKLQkJUG9pbnQgbWF4TG9jYXRpb24gPSBnZXRNYXhpbXVtTG9jYXRpb24odGV4dCwgb2Zmc2V0LCBsZW5ndGgpOwotCi0JCWludCB4MSA9IG1pbkxvY2F0aW9uLng7Ci0JCWludCB4MiA9IG1heExvY2F0aW9uLnggLSAxOwotCQlpbnQgeSA9IG1pbkxvY2F0aW9uLnkgKyB0ZXh0LmdldExpbmVIZWlnaHQoKSAtIDE7Ci0KLQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJaWYgKGZDb2xvciAhPSBudWxsICYmICFmQ29sb3IuaXNEaXNwb3NlZCgpKQotCQkJZ2Muc2V0Rm9yZWdyb3VuZChmQ29sb3IpOwotCQllbHNlIGlmIChmQ29sb3IgPT0gbnVsbCAmJiAhKG9mZnNldCA8IDAgJiYgb2Zmc2V0ID49IHRleHQuZ2V0Q2hhckNvdW50KCkpKSB7Ci0JCQlTdHlsZVJhbmdlIHN0eWxlID0gdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChzdHlsZSAhPSBudWxsKQotCQkJCWdjLnNldEZvcmVncm91bmQoc3R5bGUuZm9yZWdyb3VuZCk7Ci0JCX0KLQkJZ2MuZHJhd0xpbmUoeDEsIHksIHgyLCB5KTsKLQl9Ci0KLQlwcml2YXRlIFBvaW50IGdldE1pbmltdW1Mb2NhdGlvbihTdHlsZWRUZXh0IHRleHQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJaW50IG1heCA9IHRleHQuZ2V0Q2hhckNvdW50KCk7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSB0ZXh0LmdldEJvdW5kcygpOwotCQlQb2ludCBtaW5Mb2NhdGlvbiA9IG5ldyBQb2ludChib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8PSBsZW5ndGg7IGkrKykgewotCQkJaW50IGsgPSBvZmZzZXQgKyBpOwotCQkJaWYgKGsgPCAwIHx8IGsgPiBtYXgpCi0JCQkJYnJlYWs7Ci0KLQkJCVBvaW50IGxvY2F0aW9uID0gdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KGspOwotCQkJaWYgKGxvY2F0aW9uLnggPCBtaW5Mb2NhdGlvbi54KQotCQkJCW1pbkxvY2F0aW9uLnggPSBsb2NhdGlvbi54OwotCQkJaWYgKGxvY2F0aW9uLnkgPCBtaW5Mb2NhdGlvbi55KQotCQkJCW1pbkxvY2F0aW9uLnkgPSBsb2NhdGlvbi55OwotCQl9Ci0KLQkJcmV0dXJuIG1pbkxvY2F0aW9uOwotCX0KLQotCXByaXZhdGUgUG9pbnQgZ2V0TWF4aW11bUxvY2F0aW9uKFN0eWxlZFRleHQgdGV4dCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlQb2ludCBtYXhMb2NhdGlvbiA9IG5ldyBQb2ludCgwLCAwKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8PSBsZW5ndGg7IGkrKykgewotCQkJaW50IGsgPSBvZmZzZXQgKyBpOwotCQkJaWYgKGsgPCAwIHx8IGsgPiB0ZXh0LmdldENoYXJDb3VudCgpKQotCQkJCWJyZWFrOwotCi0JCQlQb2ludCBsb2NhdGlvbiA9IHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldChrKTsKLQkJCWlmIChsb2NhdGlvbi54ID4gbWF4TG9jYXRpb24ueCkKLQkJCQltYXhMb2NhdGlvbi54ID0gbG9jYXRpb24ueDsKLQkJCWlmIChsb2NhdGlvbi55ID4gbWF4TG9jYXRpb24ueSkKLQkJCQltYXhMb2NhdGlvbi55ID0gbG9jYXRpb24ueTsKLQkJfQotCi0JCXJldHVybiBtYXhMb2NhdGlvbjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5jbHVkZXMoSVJlZ2lvbiByZWdpb24sIElSZWdpb24gcG9zaXRpb24pIHsKLQkJcmV0dXJuIHBvc2l0aW9uLmdldE9mZnNldCgpID49IHJlZ2lvbi5nZXRPZmZzZXQoKSAmJiBwb3NpdGlvbi5nZXRPZmZzZXQoKSArIHBvc2l0aW9uLmdldExlbmd0aCgpIDw9IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChmQWN0aXZlUmVnaW9uICE9IG51bGwpIHsKLQkJCWZSZW1lbWJlcmVkUG9zaXRpb24gPSBuZXcgUG9zaXRpb24oZkFjdGl2ZVJlZ2lvbi5nZXRPZmZzZXQoKSwgZkFjdGl2ZVJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQl0cnkgewotCQkJCWV2ZW50LmdldERvY3VtZW50KCkuYWRkUG9zaXRpb24oZlJlbWVtYmVyZWRQb3NpdGlvbik7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCWZSZW1lbWJlcmVkUG9zaXRpb24gPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIjZG9jdW1lbnRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlpZiAoZlJlbWVtYmVyZWRQb3NpdGlvbiAhPSBudWxsKSB7Ci0JCQlpZiAoIWZSZW1lbWJlcmVkUG9zaXRpb24uaXNEZWxldGVkKCkpIHsKLQotCQkJCWV2ZW50LmdldERvY3VtZW50KCkucmVtb3ZlUG9zaXRpb24oZlJlbWVtYmVyZWRQb3NpdGlvbik7Ci0JCQkJZkFjdGl2ZVJlZ2lvbiA9IG5ldyBSZWdpb24oZlJlbWVtYmVyZWRQb3NpdGlvbi5nZXRPZmZzZXQoKSwgZlJlbWVtYmVyZWRQb3NpdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJZlJlbWVtYmVyZWRQb3NpdGlvbiA9IG51bGw7Ci0KLQkJCQlTdHlsZWRUZXh0IHdpZGdldCA9IGZUZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJCQlpZiAod2lkZ2V0ICE9IG51bGwgJiYgIXdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJd2lkZ2V0LmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWhpZGVIeXBlcmxpbmtzKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZkFjdGl2ZVJlZ2lvbiA9IG51bGw7Ci0JCQkJZlJlbWVtYmVyZWRQb3NpdGlvbiA9IG51bGw7Ci0JCQkJaGlkZUh5cGVybGlua3MoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SW5wdXRMaXN0ZW5lciNpbnB1dERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCWlmIChvbGRJbnB1dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQloaWRlSHlwZXJsaW5rcygpOwotCQlvbGRJbnB1dC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SW5wdXRMaXN0ZW5lciNpbnB1dERvY3VtZW50Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCWlmIChuZXdJbnB1dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQluZXdJbnB1dC5hZGREb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb2xvciBmcm9tIHRoZSBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIGdpdmVuIHByZWZlcmVuY2UKLQkgKiBzdG9yZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RvcmUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHN0b3JlCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIGtleQotCSAqIEBwYXJhbSBkaXNwbGF5Ci0JICogICAgICAgICAgICB0aGUgZGlzcGxheQotCSAqIEByZXR1cm4gdGhlIGNvbG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHN1Y2gKLQkgKiAgICAgICAgIGluZm9ybWF0aW9uIGF2YWlsYWJsZQotCSAqLwotCXByaXZhdGUgQ29sb3IgY3JlYXRlQ29sb3IoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIGtleSwgRGlzcGxheSBkaXNwbGF5KSB7Ci0KLQkJUkdCIHJnYiA9IG51bGw7Ci0KLQkJaWYgKHN0b3JlLmNvbnRhaW5zKGtleSkpIHsKLQotCQkJaWYgKHN0b3JlLmlzRGVmYXVsdChrZXkpKQotCQkJCXJnYiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0RGVmYXVsdENvbG9yKHN0b3JlLCBrZXkpOwotCQkJZWxzZQotCQkJCXJnYiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsIGtleSk7Ci0KLQkJCWlmIChyZ2IgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IENvbG9yKGRpc3BsYXksIHJnYik7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoIUhZUEVSTElOS19DT0xPUi5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHkoKSkpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGZEaXNwb3NlQ29sb3IgJiYgZkNvbG9yICE9IG51bGwgJiYgIWZDb2xvci5pc0Rpc3Bvc2VkKCkpCi0JCQlmQ29sb3IuZGlzcG9zZSgpOwotCQlmQ29sb3IgPSBudWxsOwotCi0JCVN0eWxlZFRleHQgdGV4dFdpZGdldCA9IGZUZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRleHRXaWRnZXQgIT0gbnVsbCAmJiAhdGV4dFdpZGdldC5pc0Rpc3Bvc2VkKCkpCi0JCQlmQ29sb3IgPSBjcmVhdGVDb2xvcihmUHJlZmVyZW5jZVN0b3JlLCBIWVBFUkxJTktfQ09MT1IsIHRleHRXaWRnZXQuZ2V0RGlzcGxheSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL09wZW5IeXBlcmxpbmtBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9oeXBlcmxpbmsvT3Blbkh5cGVybGlua0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWE2ZTU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9oeXBlcmxpbmsvT3Blbkh5cGVybGlua0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UZXh0RWRpdG9yQWN0aW9uOwotCi0vKioKLSAqIE9wZW4gaHlwZXJsaW5rIGFjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgT3Blbkh5cGVybGlua0FjdGlvbiBleHRlbmRzIFRleHRFZGl0b3JBY3Rpb24gewotCXByaXZhdGUgSUh5cGVybGlua0RldGVjdG9yW10gZkh5cGVybGlua0RldGVjdG9yczsKLQlwcml2YXRlIElUZXh0Vmlld2VyIGZUZXh0Vmlld2VyOwotCi0JcHVibGljIE9wZW5IeXBlcmxpbmtBY3Rpb24oUmVzb3VyY2VCdW5kbGUgYnVuZGxlLCBTdHJpbmcgcHJlZml4LCBJVGV4dEVkaXRvciBlZGl0b3IsIElUZXh0Vmlld2VyIHZpZXdlcikgewotCQlzdXBlcihidW5kbGUsIHByZWZpeCwgZWRpdG9yKTsKLQkJZlRleHRWaWV3ZXIgPSB2aWV3ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rRGV0ZWN0b3JzKElIeXBlcmxpbmtEZXRlY3RvcltdIGRldGVjdG9ycykgewotCQlmSHlwZXJsaW5rRGV0ZWN0b3JzID0gZGV0ZWN0b3JzOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGZIeXBlcmxpbmtEZXRlY3RvcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCWZpbmFsIElSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJSUh5cGVybGluayBoeXBlcmxpbmsgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAoZkh5cGVybGlua0RldGVjdG9ycykgewotCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGZIeXBlcmxpbmtEZXRlY3RvcnMubGVuZ3RoOyBpIDwgbGVuZ3RoICYmIGh5cGVybGluayA9PSBudWxsOyBpKyspIHsKLQkJCQlmaW5hbCBJSHlwZXJsaW5rRGV0ZWN0b3IgZGV0ZWN0b3IgPSBmSHlwZXJsaW5rRGV0ZWN0b3JzW2ldOwotCQkJCWlmIChkZXRlY3RvciA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQotCQkJCS8qIFRoZSBhcnJheSBpcyBmaW5hbCwgYnV0IGl0cyBjb250ZW50cyBhcmVuJ3QgKi8KLQkJCQlmaW5hbCBJSHlwZXJsaW5rW11bXSBoeXBlcmxpbmtzID0gbmV3IElIeXBlcmxpbmtbMV1bXTsKLQotCQkJCS8qCi0JCQkJICogRGV0ZWN0IGZyb20gd2l0aGluIGEgU2FmZVJ1bm5hYmxlIHNpbmNlIHRoZSBsaXN0IG9mCi0JCQkJICogZGV0ZWN0b3JzIGlzIGV4dGVuc2libGUKLQkJCQkgKi8KLQkJCQlTYWZlUnVubmFibGUgZGV0ZWN0b3JSdW5uYWJsZSA9IG5ldyBTYWZlUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQkJaHlwZXJsaW5rc1swXSA9IGRldGVjdG9yLmRldGVjdEh5cGVybGlua3MoZlRleHRWaWV3ZXIsIHJlZ2lvbiwgZmFsc2UpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlTYWZlUnVubmVyLnJ1bihkZXRlY3RvclJ1bm5hYmxlKTsKLQotCQkJCWlmIChoeXBlcmxpbmtzWzBdID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKGh5cGVybGlua3MubGVuZ3RoID4gMCkKLQkJCQkJaHlwZXJsaW5rID0gaHlwZXJsaW5rc1swXVswXTsKLQkJCX0KLQkJfQotCQlpZiAoaHlwZXJsaW5rICE9IG51bGwpIHsKLQkJCS8qKgotCQkJICogRm9yY2UgdGhlIGhpZ2hsaWdodCByYW5nZSB0byBjaGFuZ2Ugd2hlbiB0aGUgaHlwZXJsaW5rIGlzCi0JCQkgKiBvcGVuZWQgYnkgYWx0ZXJpbmcgdGhlIGhpZ2hsaWdodGVkIHJhbmdlIGJlZm9yZWhhbmQuCi0JCQkgKi8KLQkJCWdldFRleHRFZGl0b3IoKS5zZXRIaWdobGlnaHRSYW5nZShNYXRoLm1heCgwLCByZWdpb24uZ2V0T2Zmc2V0KCkgLSAxKSwgMCwgZmFsc2UpOwotCQkJaHlwZXJsaW5rLm9wZW4oKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vQWJzdHJhY3RPcGVuT24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vQWJzdHJhY3RPcGVuT24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmYjJhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL0Fic3RyYWN0T3Blbk9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwub3Blbm9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS5Qcm9ncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5FZGl0b3JzVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLlBsYXRmb3JtU3RhdHVzTGluZVV0aWw7Ci0KLQotLyoqCi0gKiBUaGlzIGFjdGlvbiBjbGFzcyByZXRyaWV2ZXMgdGhlIGxpbmsvZmlsZSBzZWxlY3RlZCBieSB0aGUgY3Vyc29yIGFuZAotICogYXR0ZW1wdHMgdG8gb3BlbiB0aGUgbGluay9maWxlIGluIHRoZSBkZWZhdWx0IGVkaXRvciBvciB3ZWIgYnJvd3NlcgotICogCi0gKiBAZGVwcmVjYXRlZCBVc2UgYmFzZSBzdXBwb3J0IGZvciBoeXBlcmxpbmsgbmF2aWdhdGlvbgotICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWJzdHJhY3RPcGVuT24gaW1wbGVtZW50cyBJT3Blbk9uIHsKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIENBTk5PVF9PUEVOID0gU1NFVUlNZXNzYWdlcy5BYnN0cmFjdE9wZW5Pbl8wOyAvLyROT04tTkxTLTEkCi0JLy8gZG9jdW1lbnQgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCBvcGVuCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTCA9ICJmaWxlOi8iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBIVFRQX1BST1RPQ09MID0gImh0dHA6Ly8iOy8vJE5PTi1OTFMtMSQKLQotCWFic3RyYWN0IHByb3RlY3RlZCBJUmVnaW9uIGRvR2V0T3Blbk9uUmVnaW9uKGludCBvZmZzZXQpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgZG9PcGVuT24oSVJlZ2lvbiByZWdpb24pOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggb3BlbiBvbgotCSAqIAotCSAqIEByZXR1cm4gSURvY3VtZW50Ci0JICovCi0JcHVibGljIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHRoZSBlZGl0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmaWxlIG5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUKLQkgKiBAcmV0dXJuIGVkaXRvciBpZCBvZiB0aGUgZWRpdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmlsZSBuYW1lCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RWRpdG9ySWQoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJSUVkaXRvclJlZ2lzdHJ5IGVkaXRvclJlZ2lzdHJ5ID0gd29ya2JlbmNoLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCUlFZGl0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBlZGl0b3JSZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKGZpbGVuYW1lKTsKLQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkKLQkJCXJldHVybiBkZXNjcmlwdG9yLmdldElkKCk7Ci0JCXJldHVybiBFZGl0b3JzVUkuREVGQVVMVF9URVhUX0VESVRPUl9JRDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIElGaWxlIGZyb20gdGhlIGdpdmVuIHVyaSBpZiBwb3NzaWJsZSwgbnVsbCBpZiBjYW5ub3QgZmluZAotCSAqIGZpbGUgZnJvbSB1cmkuCi0JICogCi0JICogQHBhcmFtIGZpbGVTdHJpbmcKLQkgKiAgICAgICAgICAgIGZpbGUgc3lzdGVtIHBhdGgKLQkgKiBAcmV0dXJuIHJldHVybnMgSUZpbGUgaWYgZmlsZVN0cmluZyBleGlzdHMgaW4gdGhlIHdvcmtzcGFjZQotCSAqLwotCXByb3RlY3RlZCBJRmlsZSBnZXRGaWxlKFN0cmluZyBmaWxlU3RyaW5nKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJLy8gdXNlIHRoZSBiYXNlIGxvY2F0aW9uIHRvIG9idGFpbiB0aGUgaW4td29ya3NwYWNlIElGaWxlCi0JCQkJSUZpbGUgbW9kZWxGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKG1vZGVsLmdldEJhc2VMb2NhdGlvbigpKSk7Ci0JCQkJaWYgKG1vZGVsRmlsZSAhPSBudWxsKSB7Ci0JCQkJCS8vIGZpbmQgdGhlIHJlZmVyZW5jZWQgZmlsZSdzIGxvY2F0aW9uIG9uIGRpc2sKLQkJCQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBtb2RlbC5nZXRSZXNvbHZlcigpOwotCQkJCQlpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGZpbGVzeXN0ZW1Mb2NhdGlvbiA9IHJlc29sdmVyLmdldExvY2F0aW9uQnlVUkkoZmlsZVN0cmluZyk7Ci0JCQkJCQlpZiAoZmlsZXN5c3RlbUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJCQlJRmlsZVtdIHdvcmtzcGFjZUZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlc3lzdGVtTG9jYXRpb24pKTsKLQkJCQkJCQkvLyBmYXZvciBhIHdvcmtzcGFjZSBmaWxlIGluIHRoZSBzYW1lIHByb2plY3QKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHdvcmtzcGFjZUZpbGVzLmxlbmd0aCAmJiBmaWxlID09IG51bGw7IGkrKykgewotCQkJCQkJCQlpZiAod29ya3NwYWNlRmlsZXNbaV0uZ2V0UHJvamVjdCgpLmVxdWFscyhtb2RlbEZpbGUuZ2V0UHJvamVjdCgpKSkgewotCQkJCQkJCQkJZmlsZSA9IHdvcmtzcGFjZUZpbGVzW2ldOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCS8vIGlmIG5vbmUgd2VyZSBpbiB0aGUgc2FtZSBwcm9qZWN0LCBqdXN0IHBpY2sgb25lCi0JCQkJCQkJaWYgKGZpbGUgPT0gbnVsbCAmJiB3b3Jrc3BhY2VGaWxlcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJCWZpbGUgPSB3b3Jrc3BhY2VGaWxlc1swXTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCWlmIChmaWxlID09IG51bGwgJiYgZmlsZVN0cmluZy5zdGFydHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChmaWxlU3RyaW5nKSk7Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLklPcGVuT24jZ2V0T3Blbk9uUmVnaW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJUmVnaW9uIGdldE9wZW5PblJlZ2lvbihJRG9jdW1lbnQgZG9jLCBpbnQgb2Zmc2V0KSB7Ci0JCUlSZWdpb24gcmVnaW9uOwotCQkvLyBzZXQgdGhlIGRvY3VtZW50IGZvciB0aGlzIGFjdGlvbgotCQlzZXREb2N1bWVudChkb2MpOwotCQlyZWdpb24gPSBkb0dldE9wZW5PblJlZ2lvbihvZmZzZXQpOwotCQkvLyByZXNldCB0aGUgZG9jdW1lbnQgYmFjayB0byBudWxsIGZvciB0aGlzIGFjdGlvbgotCQlzZXREb2N1bWVudChudWxsKTsKLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBUcnkgdG8gb3BlbiB0aGUgZXh0ZXJuYWwgZmlsZSwgZmlsZVN0cmluZyBpbiBpdHMgZGVmYXVsdCBlZGl0b3IKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVN0cmluZwotCSAqIEByZXR1cm4gSUVkaXRvclBhcnQgZWRpdG9yIG9wZW5lZCBvciBudWxsIGlmIGVkaXRvciBjb3VsZCBub3QgYmUgb3BlbmVkCi0JICovCi0JcHJvdGVjdGVkIElFZGl0b3JQYXJ0IG9wZW5FeHRlcm5hbEZpbGUoU3RyaW5nIGZpbGVTdHJpbmcpIHsKLQkJLy8gZmlsZSBkb2VzIG5vdCBleGlzdCBpbiB3b3Jrc3BhY2Ugc28gdHJ5IHRvIG9wZW4gdXNpbmcgc3lzdGVtIGVkaXRvcgotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlU3RyaW5nKTsKLQkJLy8gdHJ5IHRvIG9wZW4gZXhpc3RpbmcgZXh0ZXJuYWwgZmlsZSBpZiBpdCBleGlzdHMKLQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dChmaWxlKTsKLQkJCVN0cmluZyBlZGl0b3JJZCA9IGdldEVkaXRvcklkKGZpbGVTdHJpbmcpOwotCi0JCQl0cnkgewotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlyZXR1cm4gcGFnZS5vcGVuRWRpdG9yKGlucHV0LCBlZGl0b3JJZCwgdHJ1ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGllKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgcGllLmdldE1lc3NhZ2UoKSwgcGllKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB1c2VyIHRoYXQgb3BlbiBvbiBzZWxlY3Rpb24gYWN0aW9uIGNvdWxkIG5vdCBzdWNjZXNzZnVsbHkgb3BlbgotCSAqIHRoZSBzZWxlY3Rpb24gKHdyaXRlcyBtZXNzYWdlIG9uIHN0YXR1cyBiYXIgYW5kIGJlZXBzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5GaWxlRmFpbGVkKCkgewotCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlFcnJvck1lc3NhZ2UoQ0FOTk9UX09QRU4pOwotCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmFkZE9uZVRpbWVDbGVhckxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgdGhlIElGaWxlLCBpbnB1dCBpbiBpdHMgZGVmYXVsdCBlZGl0b3IsIGlmIHBvc3NpYmxlLCBhbmQgcmV0dXJucwotCSAqIHRoZSBlZGl0b3Igb3BlbmVkLiBQb3NzaWJsZSByZWFzb25zIGZvciBmYWlsdXJlOiBpbnB1dCBjYW5ub3QgYmUgZm91bmQsCi0JICogaW5wdXQgZG9lcyBub3QgZXhpc3QgaW4gd29ya2JlbmNoLCBlZGl0b3IgY2Fubm90IGJlIG9wZW5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIElFZGl0b3JQYXJ0IGVkaXRvciBvcGVuZWQgb3IgbnVsbCBpZiBpbnB1dCA9PSBudWxsIG9yIGRvZXMgbm90Ci0JICogICAgICAgICBleGlzdCwgZXh0ZXJuYWwgZWRpdG9yIHdhcyBvcGVuZWQsIGVkaXRvciBjb3VsZCBub3QgYmUgb3BlbmVkCi0JICovCi0JcHJvdGVjdGVkIElFZGl0b3JQYXJ0IG9wZW5GaWxlSW5FZGl0b3IoSUZpbGUgaW5wdXQpIHsKLQkJaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCXJldHVybiBJREUub3BlbkVkaXRvcihwYWdlLCBpbnB1dCwgdHJ1ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGllKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgcGllLmdldE1lc3NhZ2UoKSwgcGllKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyBvbgotCi0JLyoqCi0JICogT3BlbnMgdGhlIGFwcHJvcHJpYXRlIGVkaXRvciBmb3IgZmlsZVN0cmluZwotCSAqIAotCSAqIEBwYXJhbSBmaWxlU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkZpbGVJbkVkaXRvcihTdHJpbmcgZmlsZVN0cmluZykgewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBudWxsOwotCQlpZiAoZmlsZVN0cmluZyAhPSBudWxsKSB7Ci0JCQkvLyBvcGVuIHdlYiBicm93c2VyIGlmIHRoaXMgaXMgYSB3ZWIgYWRkcmVzcwotCQkJU3RyaW5nIHRlbXAgPSBmaWxlU3RyaW5nLnRvTG93ZXJDYXNlKCk7Ci0JCQlpZiAodGVtcC5zdGFydHNXaXRoKEhUVFBfUFJPVE9DT0wpKSB7Ci0JCQkJUHJvZ3JhbS5sYXVuY2goZmlsZVN0cmluZyk7IC8vIGxhdW5jaGVzIHdlYiBicm93c2VyL2V4ZWN1dGFibGUKLQkJCQkvLyBhc3NvY2lhdGVkIHdpdGggdXJpCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJLy8gY2hvcCBvZmYgdGhlIGZpbGUgcHJvdG9jb2wKLQkJCWlmICh0ZW1wLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCkpIHsKLQkJCQlmaWxlU3RyaW5nID0gZmlsZVN0cmluZy5zdWJzdHJpbmcoRklMRV9QUk9UT0NPTC5sZW5ndGgoKSk7Ci0JCQl9Ci0KLQkJCS8vIHRyeSB0byBsb2NhdGUgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZSBhbmQgcmV0dXJuIGFuIElGaWxlIGlmCi0JCQkvLyBmb3VuZAotCQkJSUZpbGUgZmlsZSA9IGdldEZpbGUoZmlsZVN0cmluZyk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJLy8gZmlsZSBleGlzdHMgaW4gd29ya3NwYWNlCi0JCQkJZWRpdG9yID0gb3BlbkZpbGVJbkVkaXRvcihmaWxlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGZpbGUgZG9lcyBub3QgZXhpc3QgaW4gd29ya3NwYWNlCi0JCQkJZWRpdG9yID0gb3BlbkV4dGVybmFsRmlsZShmaWxlU3RyaW5nKTsKLQkJCX0KLQkJfQotCQkvLyBubyBlZGl0b3Igd2FzIG9wZW5lZAotCQlpZiAoZWRpdG9yID09IG51bGwpIHsKLQkJCW9wZW5GaWxlRmFpbGVkKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuSU9wZW5PbiNvcGVuT24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0JcHVibGljIHZvaWQgb3Blbk9uKElEb2N1bWVudCBkb2MsIElSZWdpb24gcmVnaW9uKSB7Ci0JCS8vIHNldCB0aGUgZG9jdW1lbnQgZm9yIHRoaXMgYWN0aW9uCi0JCXNldERvY3VtZW50KGRvYyk7Ci0JCS8vIGlmIG5vIHJlZ2lvbiB3YXMgZ2l2ZW4gdGhpcyBhY3Rpb24gZmFpbHMKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJb3BlbkZpbGVGYWlsZWQoKTsKLQkJZWxzZQotCQkJZG9PcGVuT24ocmVnaW9uKTsKLQkJLy8gcmVzZXQgdGhlIGRvY3VtZW50IGJhY2sgdG8gbnVsbCBmb3IgdGhpcyBhY3Rpb24KLQkJc2V0RG9jdW1lbnQobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBjdXJyZW50IGRvY3VtZW50IGFzc29jaWF0ZWQgd2l0aCBvcGVuIG9uCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFkMGE4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL0V4dGVybmFsRmlsZUVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwub3Blbm9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklMb2NhdGlvblByb3ZpZGVyOwotCi0vKioKLSAqIEVkaXRvcklucHV0IGZvciBleHRlcm5hbCBmaWxlcy4gQ29waWVkIGZyb20KLSAqIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmVkaXRvcnMudGV4dC5KYXZhRmlsZUVkaXRvcklucHV0Ci0gKiAKLSAqIEBkZXByZWNhdGVkIFVzZSBvcmcuZWNsaXBzZS51aS5pZGUuRmlsZVN0b3JlRWRpdG9ySW5wdXQgYW5kIEVGUy5nZXRMb2NhbEZpbGVTeXN0ZW0oKS5mcm9tTG9jYWxGaWxlKCkKLSAqLwotcHVibGljIGNsYXNzIEV4dGVybmFsRmlsZUVkaXRvcklucHV0IGltcGxlbWVudHMgSUVkaXRvcklucHV0LCBJTG9jYXRpb25Qcm92aWRlciB7Ci0KLQlwcml2YXRlIEZpbGUgZkZpbGU7Ci0KLQlwdWJsaWMgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQoRmlsZSBmaWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZGaWxlID0gZmlsZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChvIGluc3RhbmNlb2YgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUV4dGVybmFsRmlsZUVkaXRvcklucHV0IGlucHV0ID0gKEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSBvOwotCQkJcmV0dXJuIGZGaWxlLmVxdWFscyhpbnB1dC5mRmlsZSk7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNleGlzdHMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIGZGaWxlLmV4aXN0cygpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoSUxvY2F0aW9uUHJvdmlkZXIuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQotCQkJcmV0dXJuIHRoaXM7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRJbWFnZURlc2NyaXB0b3IoKQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZGaWxlLmdldE5hbWUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklMb2NhdGlvblByb3ZpZGVyI2dldFBhdGgoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCBpbnB1dCA9IChFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgZWxlbWVudDsKLQkJCXJldHVybiBuZXcgUGF0aChpbnB1dC5mRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRQZXJzaXN0YWJsZSgpCi0JICovCi0JcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0VG9vbFRpcFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCXJldHVybiBmRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGZGaWxlLmhhc2hDb2RlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9JT3Blbk9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL0lPcGVuT24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2N2MzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL0lPcGVuT24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLm9wZW5vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIE9wZW4gT24uLi4gbmF2aWdhdGlvbgotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU9wZW5PbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgZW50aXJlIHJlZ2lvbiByZWxldmFudCB0byB0aGUgY3VycmVudCBvZmZzZXQgd2hlcmUgYW4KLQkgKiBvcGVuYWJsZSBzb3VyY2UgcmVnaW9uIGlzIGZvdW5kLiBudWxsIGlmIG9mZnNldCBkb2VzIG5vdCBjb250YWluIGFuCi0JICogb3BlbmFibGUgc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgSURvY3VtZW50Ci0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHJldHVybiBJUmVnaW9uIGVudGlyZSByZWdpb24gb2Ygb3BlbmFibGUgc291cmNlCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0T3Blbk9uUmVnaW9uKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCk7Ci0KLQkvKioKLQkgKiBPcGVucyB0aGUgZmlsZS9zb3VyY2UgcmVsZXZhbnQgdG8gcmVnaW9uIGlmIHBvc3NpYmxlLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIElUZXh0Vmlld2VyCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqICAgICAgICAgICAgUmVnaW9uIHRvIGV4YW1pbmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuT24oSURvY3VtZW50IGRvY3VtZW50LCBJUmVnaW9uIHJlZ2lvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL09wZW5GaWxlSHlwZXJsaW5rVHJhY2tlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuRmlsZUh5cGVybGlua1RyYWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcyYTYyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL09wZW5GaWxlSHlwZXJsaW5rVHJhY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLm9wZW5vbjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SW5wdXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXJFeHRlbnNpb241OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTW92ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuRWRpdG9yVXRpbGl0eTsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIFVzZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5IeXBlcmxpbmtNYW5hZ2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuRmlsZUh5cGVybGlua1RyYWNrZXIgaW1wbGVtZW50cyBLZXlMaXN0ZW5lciwgTW91c2VMaXN0ZW5lciwgTW91c2VNb3ZlTGlzdGVuZXIsIEZvY3VzTGlzdGVuZXIsIFBhaW50TGlzdGVuZXIsIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLCBJRG9jdW1lbnRMaXN0ZW5lciwgSVRleHRJbnB1dExpc3RlbmVyIHsKLQotCS8qKiBUaGUgc2Vzc2lvbiBpcyBhY3RpdmUuICovCi0JcHJpdmF0ZSBib29sZWFuIGZBY3RpdmU7Ci0KLQkvKiogVGhlIGN1cnJlbnRseSBhY3RpdmUgc3R5bGUgcmFuZ2UuICovCi0JcHJpdmF0ZSBJUmVnaW9uIGZBY3RpdmVSZWdpb247Ci0JLyoqIFByZWZlcmVuY2Uga2V5IGZvciBicm93c2VyLWxpa2UgbGlua3MgdG8gYmUgZW5hYmxlZCAqLwotCXByaXZhdGUgU3RyaW5nIGZCcm93c2VyTGlrZUxpbmtzS2V5TW9kaWZpZXJLZXk7Ci0KLQkvKiogVGhlIGxpbmsgY29sb3IuICovCi0JcHJpdmF0ZSBDb2xvciBmQ29sb3I7Ci0JLyoqIFRoZSBoYW5kIGN1cnNvci4gKi8KLQlwcml2YXRlIEN1cnNvciBmQ3Vyc29yOwotCS8qKiBUaGUga2V5IG1vZGlmaWVyIG1hc2suICovCi0JcHJpdmF0ZSBpbnQgZktleU1vZGlmaWVyTWFzazsKLQkvKiogUHJlZmVyZW5jZSBrZXkgZm9yIGh5cGVybGluayB1bmRlcmxpbmUgY29sb3IgKi8KLQlwcml2YXRlIFN0cmluZyBmTGlua0NvbG9yS2V5OwotCS8qKiBUaGUgcHJlZmVyZW5jZSBzdG9yZSAqLwotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmUHJlZmVyZW5jZVN0b3JlOwotCS8qKiBUaGUgY3VycmVudGx5IGFjdGl2ZSBzdHlsZSByYW5nZSBhcyBwb3NpdGlvbi4gKi8KLQlwcml2YXRlIFBvc2l0aW9uIGZSZW1lbWJlcmVkUG9zaXRpb247Ci0KLQkvKiogVGhlIHRleHQgdmlld2VyIHRoaXMgaHlwZXJsaW5rIHRyYWNrZXIgaXMgYXNzb2NpYXRlZCB3aXRoICovCi0JcHJpdmF0ZSBJVGV4dFZpZXdlciBmVGV4dFZpZXdlcjsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgT3BlbkZpbGVIeXBlcmxpbmtUcmFja2VyKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIpIHsKLQkJZlRleHRWaWV3ZXIgPSB0ZXh0Vmlld2VyOwotCX0KLQotCXByaXZhdGUgdm9pZCBhY3RpdmF0ZUN1cnNvcihJVGV4dFZpZXdlciB2aWV3ZXIpIHsKLQkJU3R5bGVkVGV4dCB0ZXh0ID0gdmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQkJRGlzcGxheSBkaXNwbGF5ID0gdGV4dC5nZXREaXNwbGF5KCk7Ci0JCWlmIChmQ3Vyc29yID09IG51bGwpCi0JCQlmQ3Vyc29yID0gbmV3IEN1cnNvcihkaXNwbGF5LCBTV1QuQ1VSU09SX0hBTkQpOwotCQl0ZXh0LnNldEN1cnNvcihmQ3Vyc29yKTsKLQl9Ci0KLQlwcml2YXRlIGludCBjb21wdXRlU3RhdGVNYXNrKFN0cmluZyBtb2RpZmllcnMpIHsKLQkJaWYgKG1vZGlmaWVycyA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCi0JCWlmIChtb2RpZmllcnMubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBTV1QuTk9ORTsKLQotCQlpbnQgc3RhdGVNYXNrID0gMDsKLQkJU3RyaW5nVG9rZW5pemVyIG1vZGlmaWVyVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihtb2RpZmllcnMsICIsOy46Ky0qICIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChtb2RpZmllclRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCWludCBtb2RpZmllciA9IEVkaXRvclV0aWxpdHkuZmluZExvY2FsaXplZE1vZGlmaWVyKG1vZGlmaWVyVG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCWlmIChtb2RpZmllciA9PSAwIHx8IChzdGF0ZU1hc2sgJiBtb2RpZmllcikgPT0gbW9kaWZpZXIpCi0JCQkJcmV0dXJuIC0xOwotCQkJc3RhdGVNYXNrID0gc3RhdGVNYXNrIHwgbW9kaWZpZXI7Ci0JCX0KLQkJcmV0dXJuIHN0YXRlTWFzazsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29sb3IgZnJvbSB0aGUgaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSBnaXZlbiBwcmVmZXJlbmNlCi0JICogc3RvcmUuIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmZvcm1hdGlvbgotCSAqIGF2YWlsYWJsZS4KLQkgKi8KLQlwcml2YXRlIENvbG9yIGNyZWF0ZUNvbG9yKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBrZXksIERpc3BsYXkgZGlzcGxheSkgewotCi0JCVJHQiByZ2IgPSBudWxsOwotCi0JCWlmIChzdG9yZS5jb250YWlucyhrZXkpKSB7Ci0KLQkJCWlmIChzdG9yZS5pc0RlZmF1bHQoa2V5KSkKLQkJCQlyZ2IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldERlZmF1bHRDb2xvcihzdG9yZSwga2V5KTsKLQkJCWVsc2UKLQkJCQlyZ2IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKHN0b3JlLCBrZXkpOwotCQl9Ci0KLQkJcmV0dXJuIEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IocmdiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlkZWFjdGl2YXRlKGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKGJvb2xlYW4gcmVkcmF3QWxsKSB7Ci0JCWlmICghZkFjdGl2ZSkKLQkJCXJldHVybjsKLQotCQlyZXBhaXJSZXByZXNlbnRhdGlvbihyZWRyYXdBbGwpOwotCQlmQWN0aXZlID0gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIjZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlpZiAoZkFjdGl2ZSAmJiBmQWN0aXZlUmVnaW9uICE9IG51bGwpIHsKLQkJCWZSZW1lbWJlcmVkUG9zaXRpb24gPSBuZXcgUG9zaXRpb24oZkFjdGl2ZVJlZ2lvbi5nZXRPZmZzZXQoKSwgZkFjdGl2ZVJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQl0cnkgewotCQkJCWV2ZW50LmdldERvY3VtZW50KCkuYWRkUG9zaXRpb24oZlJlbWVtYmVyZWRQb3NpdGlvbik7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkJZlJlbWVtYmVyZWRQb3NpdGlvbiA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChmUmVtZW1iZXJlZFBvc2l0aW9uICE9IG51bGwpIHsKLQkJCWlmICghZlJlbWVtYmVyZWRQb3NpdGlvbi5pc0RlbGV0ZWQoKSkgewotCi0JCQkJZXZlbnQuZ2V0RG9jdW1lbnQoKS5yZW1vdmVQb3NpdGlvbihmUmVtZW1iZXJlZFBvc2l0aW9uKTsKLQkJCQlmQWN0aXZlUmVnaW9uID0gbmV3IFJlZ2lvbihmUmVtZW1iZXJlZFBvc2l0aW9uLmdldE9mZnNldCgpLCBmUmVtZW1iZXJlZFBvc2l0aW9uLmdldExlbmd0aCgpKTsKLQkJCQlmUmVtZW1iZXJlZFBvc2l0aW9uID0gbnVsbDsKLQotCQkJCUlUZXh0Vmlld2VyIHZpZXdlciA9IGdldFRleHRWaWV3ZXIoKTsKLQkJCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQkJU3R5bGVkVGV4dCB3aWRnZXQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQkJCQlpZiAod2lkZ2V0ICE9IG51bGwgJiYgIXdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCXdpZGdldC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCWRlYWN0aXZhdGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQkJCQlmQWN0aXZlUmVnaW9uID0gbnVsbDsKLQkJCQlmUmVtZW1iZXJlZFBvc2l0aW9uID0gbnVsbDsKLQkJCQlkZWFjdGl2YXRlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyI2ZvY3VzR2FpbmVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyI2ZvY3VzTG9zdChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZXZlbnQpIHsKLQkJZGVhY3RpdmF0ZSgpOwotCX0KLQotCXByaXZhdGUgaW50IGdldEN1cnJlbnRUZXh0T2Zmc2V0KCkgewotCQl0cnkgewotCQkJU3R5bGVkVGV4dCB0ZXh0ID0gZ2V0VGV4dFZpZXdlcigpLmdldFRleHRXaWRnZXQoKTsKLQkJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQkJcmV0dXJuIC0xOwotCi0JCQlEaXNwbGF5IGRpc3BsYXkgPSB0ZXh0LmdldERpc3BsYXkoKTsKLQkJCVBvaW50IGFic29sdXRlUG9zaXRpb24gPSBkaXNwbGF5LmdldEN1cnNvckxvY2F0aW9uKCk7Ci0JCQlQb2ludCByZWxhdGl2ZVBvc2l0aW9uID0gdGV4dC50b0NvbnRyb2woYWJzb2x1dGVQb3NpdGlvbik7Ci0KLQkJCWludCB3aWRnZXRPZmZzZXQgPSB0ZXh0LmdldE9mZnNldEF0TG9jYXRpb24ocmVsYXRpdmVQb3NpdGlvbik7Ci0JCQlpZiAoZ2V0VGV4dFZpZXdlcigpIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb241KSB7Ci0JCQkJSVRleHRWaWV3ZXJFeHRlbnNpb241IGV4dGVuc2lvbiA9IChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIGdldFRleHRWaWV3ZXIoKTsKLQkJCQlyZXR1cm4gZXh0ZW5zaW9uLndpZGdldE9mZnNldDJNb2RlbE9mZnNldCh3aWRnZXRPZmZzZXQpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gd2lkZ2V0T2Zmc2V0ICsgZ2V0VGV4dFZpZXdlcigpLmdldFZpc2libGVSZWdpb24oKS5nZXRPZmZzZXQoKTsKLQkJCX0KLQotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBQb2ludCBnZXRNYXhpbXVtTG9jYXRpb24oU3R5bGVkVGV4dCB0ZXh0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCVBvaW50IG1heExvY2F0aW9uID0gbmV3IFBvaW50KEludGVnZXIuTUlOX1ZBTFVFLCBJbnRlZ2VyLk1JTl9WQUxVRSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gbGVuZ3RoOyBpKyspIHsKLQkJCVBvaW50IGxvY2F0aW9uID0gdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KG9mZnNldCArIGkpOwotCi0JCQlpZiAobG9jYXRpb24ueCA+IG1heExvY2F0aW9uLngpCi0JCQkJbWF4TG9jYXRpb24ueCA9IGxvY2F0aW9uLng7Ci0JCQlpZiAobG9jYXRpb24ueSA+IG1heExvY2F0aW9uLnkpCi0JCQkJbWF4TG9jYXRpb24ueSA9IGxvY2F0aW9uLnk7Ci0JCX0KLQotCQlyZXR1cm4gbWF4TG9jYXRpb247Ci0JfQotCi0JcHJpdmF0ZSBQb2ludCBnZXRNaW5pbXVtTG9jYXRpb24oU3R5bGVkVGV4dCB0ZXh0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCVBvaW50IG1pbkxvY2F0aW9uID0gbmV3IFBvaW50KEludGVnZXIuTUFYX1ZBTFVFLCBJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gbGVuZ3RoOyBpKyspIHsKLQkJCVBvaW50IGxvY2F0aW9uID0gdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KG9mZnNldCArIGkpOwotCi0JCQlpZiAobG9jYXRpb24ueCA8IG1pbkxvY2F0aW9uLngpCi0JCQkJbWluTG9jYXRpb24ueCA9IGxvY2F0aW9uLng7Ci0JCQlpZiAobG9jYXRpb24ueSA8IG1pbkxvY2F0aW9uLnkpCi0JCQkJbWluTG9jYXRpb24ueSA9IGxvY2F0aW9uLnk7Ci0JCX0KLQotCQlyZXR1cm4gbWluTG9jYXRpb247Ci0JfQotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGdldE5ld1ByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIGZQcmVmZXJlbmNlU3RvcmU7Ci0JfQotCi0JcHJpdmF0ZSBJVGV4dFZpZXdlciBnZXRUZXh0Vmlld2VyKCkgewotCQlyZXR1cm4gZlRleHRWaWV3ZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhpZ2hsaWdodFJlZ2lvbihJVGV4dFZpZXdlciB2aWV3ZXIsIElSZWdpb24gcmVnaW9uKSB7Ci0KLQkJaWYgKHJlZ2lvbi5lcXVhbHMoZkFjdGl2ZVJlZ2lvbikpCi0JCQlyZXR1cm47Ci0KLQkJcmVwYWlyUmVwcmVzZW50YXRpb24oKTsKLQotCQlTdHlsZWRUZXh0IHRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0KLQkJLy8gVW5kZXJsaW5lCi0JCWludCBvZmZzZXQgPSAwOwotCQlpbnQgbGVuZ3RoID0gMDsKLQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotCQkJSVRleHRWaWV3ZXJFeHRlbnNpb241IGV4dGVuc2lvbiA9IChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHZpZXdlcjsKLQkJCUlSZWdpb24gd2lkZ2V0UmFuZ2UgPSBleHRlbnNpb24ubW9kZWxSYW5nZTJXaWRnZXRSYW5nZShuZXcgUmVnaW9uKHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpKSk7Ci0JCQlpZiAod2lkZ2V0UmFuZ2UgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCW9mZnNldCA9IHdpZGdldFJhbmdlLmdldE9mZnNldCgpOwotCQkJbGVuZ3RoID0gd2lkZ2V0UmFuZ2UuZ2V0TGVuZ3RoKCk7Ci0KLQkJfSBlbHNlIHsKLQkJCW9mZnNldCA9IHJlZ2lvbi5nZXRPZmZzZXQoKSAtIHZpZXdlci5nZXRWaXNpYmxlUmVnaW9uKCkuZ2V0T2Zmc2V0KCk7Ci0JCQlsZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCX0KLQkJLy8gbmVlZCBjbGVhckJhY2tncm91bmQgdG8gYmUgdHJ1ZSBmb3IgcGFpbnQgZXZlbnQgdG8gYmUgZmlyZWQKLQkJdGV4dC5yZWRyYXdSYW5nZShvZmZzZXQsIGxlbmd0aCwgdHJ1ZSk7Ci0KLQkJZkFjdGl2ZVJlZ2lvbiA9IHJlZ2lvbjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5jbHVkZXMoSVJlZ2lvbiByZWdpb24sIElSZWdpb24gcG9zaXRpb24pIHsKLQkJcmV0dXJuIHBvc2l0aW9uLmdldE9mZnNldCgpID49IHJlZ2lvbi5nZXRPZmZzZXQoKSAmJiBwb3NpdGlvbi5nZXRPZmZzZXQoKSArIHBvc2l0aW9uLmdldExlbmd0aCgpIDw9IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXIjaW5wdXREb2N1bWVudEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChJRG9jdW1lbnQgb2xkSW5wdXQsIElEb2N1bWVudCBuZXdJbnB1dCkgewotCQlpZiAob2xkSW5wdXQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZGVhY3RpdmF0ZSgpOwotCQlvbGRJbnB1dC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SW5wdXRMaXN0ZW5lciNpbnB1dERvY3VtZW50Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCWlmIChuZXdJbnB1dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQluZXdJbnB1dC5hZGREb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluc3RhbGwoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQlmUHJlZmVyZW5jZVN0b3JlID0gc3RvcmU7Ci0JCUlUZXh0Vmlld2VyIHRleHRWaWV3ZXIgPSBnZXRUZXh0Vmlld2VyKCk7Ci0JCWlmICh0ZXh0Vmlld2VyID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3R5bGVkVGV4dCB0ZXh0ID0gdGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0KLQkJdXBkYXRlQ29sb3IodGV4dFZpZXdlcik7Ci0KLQkJdGV4dFZpZXdlci5hZGRUZXh0SW5wdXRMaXN0ZW5lcih0aGlzKTsKLQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsKQotCQkJZG9jdW1lbnQuYWRkRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQotCQl0ZXh0LmFkZEtleUxpc3RlbmVyKHRoaXMpOwotCQl0ZXh0LmFkZE1vdXNlTGlzdGVuZXIodGhpcyk7Ci0JCXRleHQuYWRkTW91c2VNb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCXRleHQuYWRkRm9jdXNMaXN0ZW5lcih0aGlzKTsKLQkJdGV4dC5hZGRQYWludExpc3RlbmVyKHRoaXMpOwotCi0JCXVwZGF0ZUtleU1vZGlmaWVyTWFzaygpOwotCi0JCWZQcmVmZXJlbmNlU3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lciNrZXlQcmVzc2VkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBldmVudCkgewotCi0JCWlmIChmQWN0aXZlKSB7Ci0JCQlkZWFjdGl2YXRlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoZXZlbnQua2V5Q29kZSAhPSBmS2V5TW9kaWZpZXJNYXNrKSB7Ci0JCQlkZWFjdGl2YXRlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmQWN0aXZlID0gdHJ1ZTsKLQotCQkvLwkJCXJlbW92ZWQgZm9yICMyNTg3MQotCQkvLwotCQkvLwkJCUlTb3VyY2VWaWV3ZXIgdmlld2VyPSBnZXRTb3VyY2VWaWV3ZXIoKTsKLQkJLy8JCQlpZiAodmlld2VyID09IG51bGwpCi0JCS8vCQkJCXJldHVybjsKLQkJLy8JCQkKLQkJLy8JCQlJUmVnaW9uIHJlZ2lvbj0gZ2V0Q3VycmVudFRleHRSZWdpb24odmlld2VyKTsKLQkJLy8JCQlpZiAocmVnaW9uID09IG51bGwpCi0JCS8vCQkJCXJldHVybjsKLQkJLy8JCQkKLQkJLy8JCQloaWdobGlnaHRSZWdpb24odmlld2VyLCByZWdpb24pOwotCQkvLwkJCWFjdGl2YXRlQ3Vyc29yKHZpZXdlcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXIja2V5UmVsZWFzZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBldmVudCkgewotCi0JCWlmICghZkFjdGl2ZSkKLQkJCXJldHVybjsKLQotCQlkZWFjdGl2YXRlKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lciNtb3VzZURvdWJsZUNsaWNrKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXIjbW91c2VEb3duKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBldmVudCkgewotCi0JCWlmICghZkFjdGl2ZSkKLQkJCXJldHVybjsKLQotCQlpZiAoZXZlbnQuc3RhdGVNYXNrICE9IGZLZXlNb2RpZmllck1hc2spIHsKLQkJCWRlYWN0aXZhdGUoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChldmVudC5idXR0b24gIT0gMSkgewotCQkJZGVhY3RpdmF0ZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VNb3ZlTGlzdGVuZXIjbW91c2VNb3ZlKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBldmVudCkgewotCi0JCWlmIChldmVudC53aWRnZXQgaW5zdGFuY2VvZiBDb250cm9sICYmICEoKENvbnRyb2wpIGV2ZW50LndpZGdldCkuaXNGb2N1c0NvbnRyb2woKSkgewotCQkJZGVhY3RpdmF0ZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCFmQWN0aXZlKSB7Ci0JCQlpZiAoZXZlbnQuc3RhdGVNYXNrICE9IGZLZXlNb2RpZmllck1hc2spCi0JCQkJcmV0dXJuOwotCQkJLy8gbW9kaWZpZXIgd2FzIGFscmVhZHkgcHJlc3NlZAotCQkJZkFjdGl2ZSA9IHRydWU7Ci0JCX0KLQotCQlJVGV4dFZpZXdlciB2aWV3ZXIgPSBnZXRUZXh0Vmlld2VyKCk7Ci0JCWlmICh2aWV3ZXIgPT0gbnVsbCkgewotCQkJZGVhY3RpdmF0ZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3R5bGVkVGV4dCB0ZXh0ID0gdmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0LmlzRGlzcG9zZWQoKSkgewotCQkJZGVhY3RpdmF0ZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKChldmVudC5zdGF0ZU1hc2sgJiBTV1QuQlVUVE9OMSkgIT0gMCAmJiB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCkgIT0gMCkgewotCQkJZGVhY3RpdmF0ZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlpbnQgb2Zmc2V0ID0gZ2V0Q3VycmVudFRleHRPZmZzZXQoKTsKLQkJSU9wZW5PbiBvcGVuT24gPSBPcGVuT25Qcm92aWRlci5nZXRJbnN0YW5jZSgpLmdldE9wZW5PbihnZXRUZXh0Vmlld2VyKCkuZ2V0RG9jdW1lbnQoKSwgb2Zmc2V0KTsKLQkJaWYgKG9wZW5PbiAhPSBudWxsKSB7Ci0JCQlyZWdpb24gPSBvcGVuT24uZ2V0T3Blbk9uUmVnaW9uKGdldFRleHRWaWV3ZXIoKS5nZXREb2N1bWVudCgpLCBvZmZzZXQpOwotCQl9Ci0JCWlmIChyZWdpb24gPT0gbnVsbCB8fCByZWdpb24uZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmVwYWlyUmVwcmVzZW50YXRpb24oKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWhpZ2hsaWdodFJlZ2lvbih2aWV3ZXIsIHJlZ2lvbik7Ci0JCWFjdGl2YXRlQ3Vyc29yKHZpZXdlcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lciNtb3VzZVVwKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCi0JCWlmICghZkFjdGl2ZSkKLQkJCXJldHVybjsKLQotCQlpZiAoZS5idXR0b24gIT0gMSkgewotCQkJZGVhY3RpdmF0ZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYm9vbGVhbiB3YXNBY3RpdmUgPSBmQ3Vyc29yICE9IG51bGw7Ci0JCUlSZWdpb24gcHJldmlvdXNSZWdpb24gPSBmQWN0aXZlUmVnaW9uOwotCi0JCWRlYWN0aXZhdGUoKTsKLQotCQlpZiAod2FzQWN0aXZlKSB7Ci0JCQlJT3Blbk9uIG9wZW5PbiA9IE9wZW5PblByb3ZpZGVyLmdldEluc3RhbmNlKCkuZ2V0T3Blbk9uKGdldFRleHRWaWV3ZXIoKS5nZXREb2N1bWVudCgpLCBwcmV2aW91c1JlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQlpZiAob3Blbk9uICE9IG51bGwpIHsKLQkJCQlvcGVuT24ub3Blbk9uKGdldFRleHRWaWV3ZXIoKS5nZXREb2N1bWVudCgpLCBwcmV2aW91c1JlZ2lvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgUGFpbnRMaXN0ZW5lciNwYWludENvbnRyb2woUGFpbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCkgewotCQlpZiAoZkFjdGl2ZVJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlUZXh0Vmlld2VyIHZpZXdlciA9IGdldFRleHRWaWV3ZXIoKTsKLQkJaWYgKHZpZXdlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0eWxlZFRleHQgdGV4dCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0KLQotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJaW50IGxlbmd0aCA9IDA7Ci0KLQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotCi0JCQlJVGV4dFZpZXdlckV4dGVuc2lvbjUgZXh0ZW5zaW9uID0gKElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgdmlld2VyOwotCQkJSVJlZ2lvbiB3aWRnZXRSYW5nZSA9IGV4dGVuc2lvbi5tb2RlbFJhbmdlMldpZGdldFJhbmdlKGZBY3RpdmVSZWdpb24pOwotCQkJaWYgKHdpZGdldFJhbmdlID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlvZmZzZXQgPSB3aWRnZXRSYW5nZS5nZXRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IHdpZGdldFJhbmdlLmdldExlbmd0aCgpOwotCi0JCX0gZWxzZSB7Ci0KLQkJCUlSZWdpb24gcmVnaW9uID0gdmlld2VyLmdldFZpc2libGVSZWdpb24oKTsKLQkJCWlmICghaW5jbHVkZXMocmVnaW9uLCBmQWN0aXZlUmVnaW9uKSkKLQkJCQlyZXR1cm47Ci0KLQkJCW9mZnNldCA9IGZBY3RpdmVSZWdpb24uZ2V0T2Zmc2V0KCkgLSByZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQlsZW5ndGggPSBmQWN0aXZlUmVnaW9uLmdldExlbmd0aCgpOwotCQl9Ci0KLQkJLy8gc3VwcG9ydCBmb3IgYmlkaQotCQlQb2ludCBtaW5Mb2NhdGlvbiA9IGdldE1pbmltdW1Mb2NhdGlvbih0ZXh0LCBvZmZzZXQsIGxlbmd0aCk7Ci0JCVBvaW50IG1heExvY2F0aW9uID0gZ2V0TWF4aW11bUxvY2F0aW9uKHRleHQsIG9mZnNldCwgbGVuZ3RoKTsKLQotCQlpbnQgeDEgPSBtaW5Mb2NhdGlvbi54OwotCQlpbnQgeDIgPSBtaW5Mb2NhdGlvbi54ICsgbWF4TG9jYXRpb24ueCAtIG1pbkxvY2F0aW9uLnggLSAxOwotCQlpbnQgeSA9IG1pbkxvY2F0aW9uLnkgKyB0ZXh0LmdldExpbmVIZWlnaHQoKSAtIDE7Ci0KLQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJaWYgKGZDb2xvciAhPSBudWxsICYmICFmQ29sb3IuaXNEaXNwb3NlZCgpKQotCQkJZ2Muc2V0Rm9yZWdyb3VuZChmQ29sb3IpOwotCQlnYy5kcmF3TGluZSh4MSwgeSwgeDIsIHkpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKGZMaW5rQ29sb3JLZXkpKSB7Ci0JCQlJVGV4dFZpZXdlciB2aWV3ZXIgPSBnZXRUZXh0Vmlld2VyKCk7Ci0JCQlpZiAodmlld2VyICE9IG51bGwpCi0JCQkJdXBkYXRlQ29sb3Iodmlld2VyKTsKLQkJfSBlbHNlIGlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhmQnJvd3Nlckxpa2VMaW5rc0tleU1vZGlmaWVyS2V5KSkgewotCQkJdXBkYXRlS2V5TW9kaWZpZXJNYXNrKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVwYWlyUmVwcmVzZW50YXRpb24oKSB7Ci0JCXJlcGFpclJlcHJlc2VudGF0aW9uKGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVwYWlyUmVwcmVzZW50YXRpb24oYm9vbGVhbiByZWRyYXdBbGwpIHsKLQotCQlpZiAoZkFjdGl2ZVJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWludCBvZmZzZXQgPSBmQWN0aXZlUmVnaW9uLmdldE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gZkFjdGl2ZVJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJZkFjdGl2ZVJlZ2lvbiA9IG51bGw7Ci0KLQkJSVRleHRWaWV3ZXIgdmlld2VyID0gZ2V0VGV4dFZpZXdlcigpOwotCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQotCQkJcmVzZXRDdXJzb3Iodmlld2VyKTsKLQotCQkJLy8gUmVtb3ZlIHVuZGVybGluZQotCQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotCQkJCUlUZXh0Vmlld2VyRXh0ZW5zaW9uNSBleHRlbnNpb24gPSAoSVRleHRWaWV3ZXJFeHRlbnNpb241KSB2aWV3ZXI7Ci0JCQkJb2Zmc2V0ID0gZXh0ZW5zaW9uLm1vZGVsT2Zmc2V0MldpZGdldE9mZnNldChvZmZzZXQpOwotCQkJfSBlbHNlIHsKLQkJCQlvZmZzZXQgLT0gdmlld2VyLmdldFZpc2libGVSZWdpb24oKS5nZXRPZmZzZXQoKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJU3R5bGVkVGV4dCB0ZXh0ID0gdmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQotCQkJCS8vIG5lZWQgY2xlYXJCYWNrZ3JvdW5kIHRvIGJlIHRydWUgZm9yIHBhaW50IGV2ZW50IHRvIGJlIGZpcmVkCi0JCQkJdGV4dC5yZWRyYXdSYW5nZShvZmZzZXQsIGxlbmd0aCwgdHJ1ZSk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geCkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oeCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzZXRDdXJzb3IoSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JCVN0eWxlZFRleHQgdGV4dCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0ICE9IG51bGwgJiYgIXRleHQuaXNEaXNwb3NlZCgpKQotCQkJdGV4dC5zZXRDdXJzb3IobnVsbCk7Ci0KLQkJaWYgKGZDdXJzb3IgIT0gbnVsbCkgewotCQkJZkN1cnNvci5kaXNwb3NlKCk7Ci0JCQlmQ3Vyc29yID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1ByZWZlcmVuY2VLZXlzKFN0cmluZyBsaW5rQ29sb3JLZXksIFN0cmluZyBicm93c2VyTGlrZUxpbmtzS2V5TW9kaWZpZXJLZXkpIHsKLQkJZkxpbmtDb2xvcktleSA9IGxpbmtDb2xvcktleTsKLQkJZkJyb3dzZXJMaWtlTGlua3NLZXlNb2RpZmllcktleSA9IGJyb3dzZXJMaWtlTGlua3NLZXlNb2RpZmllcktleTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCWlmIChmQ3Vyc29yICE9IG51bGwpIHsKLQkJCWZDdXJzb3IuZGlzcG9zZSgpOwotCQkJZkN1cnNvciA9IG51bGw7Ci0JCX0KLQotCQlJVGV4dFZpZXdlciB0ZXh0Vmlld2VyID0gZ2V0VGV4dFZpZXdlcigpOwotCQlpZiAodGV4dFZpZXdlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRleHRWaWV3ZXIucmVtb3ZlVGV4dElucHV0TGlzdGVuZXIodGhpcyk7Ci0KLQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLQkJCWRvY3VtZW50LnJlbW92ZURvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0KLQkJSVByZWZlcmVuY2VTdG9yZSBwcmVmZXJlbmNlU3RvcmUgPSBnZXROZXdQcmVmZXJlbmNlU3RvcmUoKTsKLQkJaWYgKHByZWZlcmVuY2VTdG9yZSAhPSBudWxsKQotCQkJcHJlZmVyZW5jZVN0b3JlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0KLQkJU3R5bGVkVGV4dCB0ZXh0ID0gdGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0KLQkJdGV4dC5yZW1vdmVLZXlMaXN0ZW5lcih0aGlzKTsKLQkJdGV4dC5yZW1vdmVNb3VzZUxpc3RlbmVyKHRoaXMpOwotCQl0ZXh0LnJlbW92ZU1vdXNlTW92ZUxpc3RlbmVyKHRoaXMpOwotCQl0ZXh0LnJlbW92ZUZvY3VzTGlzdGVuZXIodGhpcyk7Ci0JCXRleHQucmVtb3ZlUGFpbnRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ29sb3IoSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JCVN0eWxlZFRleHQgdGV4dCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0KLQkJRGlzcGxheSBkaXNwbGF5ID0gdGV4dC5nZXREaXNwbGF5KCk7Ci0JCWZDb2xvciA9IGNyZWF0ZUNvbG9yKGdldE5ld1ByZWZlcmVuY2VTdG9yZSgpLCBmTGlua0NvbG9yS2V5LCBkaXNwbGF5KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlS2V5TW9kaWZpZXJNYXNrKCkgewotCQlTdHJpbmcgbW9kaWZpZXJzID0gZ2V0TmV3UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKGZCcm93c2VyTGlrZUxpbmtzS2V5TW9kaWZpZXJLZXkpOwotCQlmS2V5TW9kaWZpZXJNYXNrID0gY29tcHV0ZVN0YXRlTWFzayhtb2RpZmllcnMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vT3Blbk9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL09wZW5PbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTc3MDJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vT3Blbk9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5vcGVub247Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRFZGl0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JRXh0ZW5kZWRTaW1wbGVFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotCi0KLS8qKgotICogRGV0ZXJtaW5lcyB0aGUgYXBwcm9wcmlhdGUgSU9wZW5GaWxlQWN0aW9uIHRvIGNhbGwgYmFzZWQgb24gY3VycmVudAotICogcGFydGl0aW9uLgotICogCi0gKiBAZGVwcmVjYXRlZCBVc2UgYmFzZSBzdXBwb3J0IGZvciBoeXBlcmxpbmsgbmF2aWdhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgT3Blbk9uQWN0aW9uIGV4dGVuZHMgVGV4dEVkaXRvckFjdGlvbiB7Ci0JcHVibGljIE9wZW5PbkFjdGlvbihSZXNvdXJjZUJ1bmRsZSBidW5kbGUsIFN0cmluZyBwcmVmaXgsIElUZXh0RWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihidW5kbGUsIHByZWZpeCwgZWRpdG9yKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRUZXh0RWRpdG9yKCkuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJSVRleHRFZGl0b3IgZWRpdG9yID0gZ2V0VGV4dEVkaXRvcigpOwotCi0JCQkJLy8gZmlndXJlIG91dCBjdXJyZW50IG9mZnNldAotCQkJCWludCBvZmZzZXQgPSAtMTsKLQkJCQlJU291cmNlRWRpdGluZ1RleHRUb29scyB0ZXh0VG9vbHMgPSAoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMpIGdldFRleHRFZGl0b3IoKS5nZXRBZGFwdGVyKElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmNsYXNzKTsKLQkJCQlpZiAodGV4dFRvb2xzICE9IG51bGwpIHsKLQkJCQkJb2Zmc2V0ID0gdGV4dFRvb2xzLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGVkaXRvciBpbnN0YW5jZW9mIElFeHRlbmRlZFNpbXBsZUVkaXRvcikgewotCQkJCQlvZmZzZXQgPSAoKElFeHRlbmRlZFNpbXBsZUVkaXRvcikgZWRpdG9yKS5nZXRDYXJldFBvc2l0aW9uKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoZWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkgIT0gbnVsbCkgewotCQkJCQkJSVNlbGVjdGlvbiBzZWwgPSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWwgaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJCQkJCW9mZnNldCA9ICgoSVRleHRTZWxlY3Rpb24pIHNlbCkuZ2V0T2Zmc2V0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJSU9wZW5PbiBvcGVuT24gPSBPcGVuT25Qcm92aWRlci5nZXRJbnN0YW5jZSgpLmdldE9wZW5Pbihkb2N1bWVudCwgb2Zmc2V0KTsKLQkJCQlpZiAob3Blbk9uICE9IG51bGwpIHsKLQkJCQkJb3Blbk9uLm9wZW5Pbihkb2N1bWVudCwgbmV3IFJlZ2lvbihvZmZzZXQsIDApKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vT3Blbk9uQnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuT25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMDI5NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuT25CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwub3Blbm9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb24uUmVnaXN0cnlSZWFkZXI7Ci0KLQotLyoqCi0gKiBSZWFkcyBleHRlbnNpb25zIGZvciBvcGVuIG9uIGV4dGVuc2lvbiBwb2ludCwKLSAqIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9ucy5vcGVub24KLSAqIAotICogQGRlcHJlY2F0ZWQgVXNlIGJhc2Ugc3VwcG9ydCBmb3IgaHlwZXJsaW5rIG5hdmlnYXRpb24KLSAqLwotcHVibGljIGNsYXNzIE9wZW5PbkJ1aWxkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgT3Blbk9uQnVpbGRlciBmSW5zdGFuY2U7Ci0JLy8gZXh0ZW5zaW9uIHBvaW50IElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExfT1BFTk9OID0gIm9wZW5vbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DT05URU5UX1RZUEVfSURFTlRJRklFUiA9ICJjb250ZW50dHlwZWlkZW50aWZpZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfT1BFTk9OID0gIm9wZW5vbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUEFSVElUSU9OX1RZUEUgPSAicGFydGl0aW9udHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIHJldHVybnMgc2luZ2xldG9uIGluc3RhbmNlIG9mIE9wZW5PbkJ1aWxkZXIKLQkgKiAKLQkgKiBAcmV0dXJuIE9wZW5PbkJ1aWxkZXIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBPcGVuT25CdWlsZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBPcGVuT25CdWlsZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBmQ3VycmVudENvbnRlbnRUeXBlOwotCXByaXZhdGUgT3Blbk9uRGVmaW5pdGlvbiBmQ3VycmVudE9wZW5PbkRlZmluaXRpb24gPSBudWxsOwotCi0JcHJpdmF0ZSBMaXN0IGZPcGVuT25EZWZzID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0Q29udHJpYnV0aW9uVGFnOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGFydCBJRCBhdHRyaWJ1dGUgdGhhdCBpcyBleHBlY3RlZCBpbiB0aGUKLQkgKiB0YXJnZXQgZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldElkKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE9wZW5PbkNsYXNzKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgb3BlbiBvbiBkZWZpbml0aW9uIG9iamVjdHMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE9wZW5PbkRlZmluaXRpb25bXSBnZXRPcGVuT25EZWZpbml0aW9ucygpIHsKLQkJaW5pdENhY2hlKCk7Ci0JCXJldHVybiAoT3Blbk9uRGVmaW5pdGlvbltdKSBmT3Blbk9uRGVmcy50b0FycmF5KG5ldyBPcGVuT25EZWZpbml0aW9uW2ZPcGVuT25EZWZzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBvcGVuIG9uIGRlZmluaXRpb24gb2JqZWN0cyB2YWxpZCBmb3IKLQkgKiBjb250ZW50VHlwZS9wYXJ0aXRpb25UeXBlCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGUKLQkgKiBAcmV0dXJuIGlmIGVpdGhlciBjb250ZW50VHlwZSBvciBwYXJ0aXRpb25UeXBlIGlzIG51bGwsIG51bGwgaXMKLQkgKiAgICAgICAgIHJldHVybmVkCi0JICovCi0JcHVibGljIE9wZW5PbkRlZmluaXRpb25bXSBnZXRPcGVuT25EZWZpbml0aW9ucyhTdHJpbmcgY29udGVudFR5cGUsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsIHx8IHBhcnRpdGlvblR5cGUgPT0gbnVsbCkgewotCQkJLy8gc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGRlZmluZSBhbiBvcGVub24gd2l0aG91dCBhIGNvbnRlbnQgdHlwZQotCQkJLy8gYnV0IGlmIGl0IHdlcmUgcG9zc2libGUgdGhlbiB3b3VsZCBuZWVkIHRvIHNlYXJjaCBhbGwgb3Blbm9uCi0JCQkvLyBkZWZpbml0aW9ucyBmb3IKLQkJCS8vIGRlZmluaXRpb25zIHdpdGggZW1wdHkgY29udGVudFR5cGUgbGlzdAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBlbnRpcmUgbGlzdCBvZiBvcGVub24gZGVmaW5pdGlvbiBvYmplY3RzCi0JCU9wZW5PbkRlZmluaXRpb25bXSBhbGxEZWZzID0gZ2V0T3Blbk9uRGVmaW5pdGlvbnMoKTsKLQkJLy8gY3VycmVudCBsaXN0IG9mIG9wZW4gb24gZGVmaW5pdGlvbnMgdmFsaWQgZm9yCi0JCS8vIGNvbnRlbnRUeXBlL3BhcnRpdGlvblR5cGUKLQkJTGlzdCBkZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBkZWZhdWx0IGRlZmluaXRpb25zIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIGVuZCBvZiBsaXN0IG9mIG9wZW4gb24KLQkJLy8gZGVmaW5pdGlvbnMKLQkJTGlzdCBsYXN0RGVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbERlZnMubGVuZ3RoOyArK2kpIHsKLQkJCS8vIGZvciBlYWNoIG9uZSBjaGVjayBpZiBpdCBjb250YWlucyBjb250ZW50VHlwZQotCQkJTGlzdCBwYXJ0aXRpb25zID0gKExpc3QpIGFsbERlZnNbaV0uZ2V0Q29udGVudFR5cGVzKCkuZ2V0KGNvbnRlbnRUeXBlKTsKLQkJCWlmIChwYXJ0aXRpb25zICE9IG51bGwpIHsKLQkJCQkvLyB0aGlzIG9wZW5vbiBkZWZpbml0aW9uIGlzIHZhbGlkIGZvciBhbGwgcGFydGl0aW9uIHR5cGVzIGZvcgotCQkJCS8vIHRoaXMgY29udGVudCB0eXBlCi0JCQkJaWYgKHBhcnRpdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJCS8vIHRoaXMgd2lsbCBiZSBhZGRlZCB0byBlbmQgb2YgbGlzdCBiZWNhdXNlIHRoaXMgaXMKLQkJCQkJLy8gY29uc2lkZXJlZCBhIGRlZmF1bHQgb3Blbm9uCi0JCQkJCWxhc3REZWZzLmFkZChhbGxEZWZzW2ldKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBleGFtaW5lIHRoZSBwYXJ0aXRpb24gdHlwZXMgb2YgdGhpcyBvcGVub24KLQkJCQkJaW50IGogPSAwOyAvLyBjdXJyZW50IGluZGV4IGluIGxpc3Qgb2YgcGFydGl0aW9ucwotCQkJCQlib29sZWFuIGFkZGVkID0gZmFsc2U7IC8vIG9wZW5vbiBoYXMgYmVlbiBhZGRlZCB0byBsaXN0Ci0JCQkJCXdoaWxlIChqIDwgcGFydGl0aW9ucy5zaXplKCkgJiYgIWFkZGVkKSB7Ci0JCQkJCQkvLyB0aGlzIG9wZW5vbiBkZWZpbml0aW9uIGFwcGxpZXMgdG8gcGFydGl0aW9uVHlwZSBzbwotCQkJCQkJLy8gYWRkIHRvIGxpc3Qgb2YgdmFsaWQgb3Blbm9ucwotCQkJCQkJaWYgKHBhcnRpdGlvblR5cGUuZXF1YWxzKHBhcnRpdGlvbnMuZ2V0KGopKSkgewotCQkJCQkJCWRlZnMuYWRkKGFsbERlZnNbaV0pOwotCQkJCQkJCWFkZGVkID0gdHJ1ZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gY29udGludWUgY2hlY2tpbmcgdG8gc2VlIGlmIHRoaXMgb3Blbm9uCi0JCQkJCQkJLy8gZGVmaW5pdGlvbiBpcyB2YWxpZCBmb3IgY3VycmVudCBwYXJ0aXRpb25UeXBlCi0JCQkJCQkJKytqOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGFwcGVuZCB0aGUgZGVmYXVsdCBvcGVub24gZGVmaW5pdGlvbnMKLQkJZGVmcy5hZGRBbGwobGFzdERlZnMpOwotCi0JCS8vIHJldHVybiB0aGUgbGlzdAotCQlyZXR1cm4gKE9wZW5PbkRlZmluaXRpb25bXSkgZGVmcy50b0FycmF5KG5ldyBPcGVuT25EZWZpbml0aW9uW2RlZnMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRDYWNoZSgpIHsKLQkJaWYgKGZPcGVuT25EZWZzID09IG51bGwpIHsKLQkJCWZPcGVuT25EZWZzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJCXJlYWRDb250cmlidXRpb25zKFRBR19PUEVOT04sIFBMX09QRU5PTik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzZXMgZWxlbWVudCB3aGljaCBzaG91bGQgYmUgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQgc3BlY2lmeWluZyBhCi0JICogY29udGVudCB0eXBlIGZvciB0aGUgY3VycmVudCBvcGVuIG9uIHRhZy4gQXNzdW1lcyB0aGF0IHRoZXJlIGlzIGEgdmFsaWQKLQkgKiBjdXJyZW50IG9wZW4gb24gZGVmaW5pdGlvbiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGNvbnRlbnR0eXBlaWRlbnRpZmllciBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbnRlbnRUeXBlVGFnKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCS8vIGFkZCB0byBjdXJyZW50IG9wZW5PbkRlZmluaXRpb24KLQkJU3RyaW5nIHRoZUlkID0gZ2V0SWQoZWxlbWVudCk7Ci0KLQkJaWYgKHRoZUlkICE9IG51bGwpIHsKLQkJCWZDdXJyZW50Q29udGVudFR5cGUgPSB0aGVJZDsKLQkJCWZDdXJyZW50T3Blbk9uRGVmaW5pdGlvbi5hZGRDb250ZW50VHlwZUlkKGZDdXJyZW50Q29udGVudFR5cGUpOwotCQl9IGVsc2UgewotCQkJZkN1cnJlbnRDb250ZW50VHlwZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzZXMgZWxlbWVudCB3aGljaCBzaG91bGQgYmUgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQgc3BlY2lmeWluZyBhbgotCSAqIG9wZW4gb24gb2JqZWN0LiBDcmVhdGVzIGEgbmV3IG9wZW4gb24gZGVmaW5pdGlvbiBvYmplY3QgYW5kIGFkZHMgaXQgdG8KLQkgKiB0aGUgbGlzdCBvZiBvcGVuIG9uIGRlZmluaXRpb24gb2JqZWN0cwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcGVub24gY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NPcGVuT25UYWcoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHRoZUlkID0gZ2V0SWQoZWxlbWVudCk7Ci0JCVN0cmluZyB0aGVDbGFzcyA9IGdldE9wZW5PbkNsYXNzKGVsZW1lbnQpOwotCi0JCWlmICh0aGVJZCAhPSBudWxsICYmIHRoZUNsYXNzICE9IG51bGwpIHsKLQkJCS8vIHN0YXJ0IGJ1aWxkaW5nIG5ldyBPcGVuT25EZWZpbml0aW9uCi0JCQlmQ3VycmVudE9wZW5PbkRlZmluaXRpb24gPSBuZXcgT3Blbk9uRGVmaW5pdGlvbih0aGVJZCwgdGhlQ2xhc3MsIGVsZW1lbnQpOwotCQkJZk9wZW5PbkRlZnMuYWRkKGZDdXJyZW50T3Blbk9uRGVmaW5pdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlmQ3VycmVudE9wZW5PbkRlZmluaXRpb24gPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJvY2Vzc2VzIGVsZW1lbnQgd2hpY2ggc2hvdWxkIGJlIGEgY29uZmlndXJhdGlvbiBlbGVtZW50IHNwZWNpZnlpbmcgYQotCSAqIHBhcnRpdGlvbiB0eXBlIGZvciB0aGUgY3VycmVudCBvcGVuIG9uL2NvbnRlbnQgdHlwZSB0YWcuIEFzc3VtZXMgdGhhdAotCSAqIHRoZXJlIGlzIGEgdmFsaWQgY3VycmVudCBvcGVuIG9uL2NvbnRlbnQgdHlwZSB0YWcuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHBhcnRpdGlvbnR5cGUgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NQYXJ0aXRpb25UeXBlVGFnKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCS8vIGFkZCB0byBjdXJyZW50IG9wZW5PbkRlZmluaXRpb24vY29udGVudFR5cGUKLQkJU3RyaW5nIHRoZUlkID0gZ2V0SWQoZWxlbWVudCk7Ci0KLQkJaWYgKHRoZUlkICE9IG51bGwpIHsKLQkJCWZDdXJyZW50T3Blbk9uRGVmaW5pdGlvbi5hZGRQYXJ0aXRpb25UeXBlKGZDdXJyZW50Q29udGVudFR5cGUsIHRoZUlkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlYWRzIHRoZSBjb250cmlidXRpb25zIGZyb20gdGhlIHJlZ2lzdHJ5IGZvciB0aGUgcHJvdmlkZWQgd29ya2JlbmNoCi0JICogcGFydCBhbmQgdGhlIHByb3ZpZGVkIGV4dGVuc2lvbiBwb2ludCBJRC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFnCi0JICogQHBhcmFtIGV4dGVuc2lvblBvaW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZENvbnRyaWJ1dGlvbnMoU3RyaW5nIHRhZywgU3RyaW5nIGV4dGVuc2lvblBvaW50KSB7Ci0JCXRhcmdldENvbnRyaWJ1dGlvblRhZyA9IHRhZzsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJcmVhZFJlZ2lzdHJ5KHJlZ2lzdHJ5LCBQTFVHSU5fSUQsIGV4dGVuc2lvblBvaW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLlJlZ2lzdHJ5UmVhZGVyI3JlYWRFbGVtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHRhZyA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCi0JCWlmICh0YWcuZXF1YWxzKHRhcmdldENvbnRyaWJ1dGlvblRhZykpIHsKLQkJCXByb2Nlc3NPcGVuT25UYWcoZWxlbWVudCk7Ci0KLQkJCS8vIG1ha2Ugc3VyZSBwcm9jZXNzaW5nIG9mIGN1cnJlbnQgb3BlbiBvbiB0YWcgcmVzdWx0ZWQgaW4gYQotCQkJLy8gY3VycmVudCBvcGVuIG9uIGRlZmluaXRpb24KLQkJCS8vIGJlZm9yZSBjb250aW51ZSByZWFkaW5nIHRoZSBjaGlsZHJlbgotCQkJaWYgKGZDdXJyZW50T3Blbk9uRGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0JCQkJcmVhZEVsZW1lbnRDaGlsZHJlbihlbGVtZW50KTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKHRhZy5lcXVhbHMoVEFHX0NPTlRFTlRfVFlQRV9JREVOVElGSUVSKSkgewotCQkJcHJvY2Vzc0NvbnRlbnRUeXBlVGFnKGVsZW1lbnQpOwotCi0JCQkvLyBtYWtlIHN1cmUgcHJvY2Vzc2luZyBvZiBjdXJyZW50IGNvbnRlbnQgdHlwZSByZXN1bHRlZCBpbiBhCi0JCQkvLyB2YWxpZCBjb250ZW50IHR5cGUKLQkJCS8vIGJlZm9yZSByZWFkaW5nIHRoZSBjaGlsZHJlbgotCQkJaWYgKGZDdXJyZW50Q29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJCXJlYWRFbGVtZW50Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmICh0YWcuZXF1YWxzKFRBR19QQVJUSVRJT05fVFlQRSkpIHsKLQkJCXByb2Nlc3NQYXJ0aXRpb25UeXBlVGFnKGVsZW1lbnQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuT25EZWZpbml0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL09wZW5PbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE2MGQ2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL09wZW5PbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5vcGVub247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBPcGVuIG9uIGRlZmluaXRpb24gb2JqZWN0Ci0gKiAKLSAqIEBkZXByZWNhdGVkIFVzZSBiYXNlIHN1cHBvcnQgZm9yIGh5cGVybGluayBuYXZpZ2F0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuT25EZWZpbml0aW9uIHsKLQlwcml2YXRlIFN0cmluZyBmQ2xhc3NOYW1lID0gbnVsbDsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZDb25maWd1cmF0aW9uRWxlbWVudCA9IG51bGw7Ci0KLQkvLyBhIGhhc2ggbWFwIG9mIGNvbnRlbnQgdHlwZSBJZHMgKFN0cmluZykgdGhhdCBwb2ludHMgdG8gbGlzdHMgb2YKLQkvLyBwYXJpdGlvbiB0eXBlcyAoTGlzdCBvZiBTdHJpbmdzKQotCS8vIGNvbnRlbnRUeXBlSWQgLT4gTGlzdChwYXJpdGlvblR5cGUsIHBhcml0aW9uVHlwZSwgcGFydGl0aW9uVHlwZSwgLi4uKQotCS8vIGNvbnRlbnRUeXBlSWQyIC0+IExpc3QocGFydGl0aW9uVHlwZSwgcGFydGl0aW9uVHlwZSwgLi4uKQotCS8vIC4uLgotCXByaXZhdGUgSGFzaE1hcCBmQ29udGVudFR5cGVzID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmSWQgPSBudWxsOwotCi0JLyoqCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIGNsYXNzMQotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uRWxlbWVudAotCSAqLwotCXB1YmxpYyBPcGVuT25EZWZpbml0aW9uKFN0cmluZyBpZCwgU3RyaW5nIGNsYXNzMSwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCWZJZCA9IGlkOwotCQlmQ2xhc3NOYW1lID0gY2xhc3MxOwotCQlmQ29uZmlndXJhdGlvbkVsZW1lbnQgPSBjb25maWd1cmF0aW9uRWxlbWVudDsKLQkJZkNvbnRlbnRUeXBlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ29udGVudFR5cGVJZChTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlpZiAoIWZDb250ZW50VHlwZXMuY29udGFpbnNLZXkoY29udGVudFR5cGVJZCkpCi0JCQlmQ29udGVudFR5cGVzLnB1dChjb250ZW50VHlwZUlkLCBuZXcgQXJyYXlMaXN0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhcnRpdGlvblR5cGUoU3RyaW5nIGNvbnRlbnRUeXBlSWQsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCWlmICghZkNvbnRlbnRUeXBlcy5jb250YWluc0tleShjb250ZW50VHlwZUlkKSkKLQkJCWZDb250ZW50VHlwZXMucHV0KGNvbnRlbnRUeXBlSWQsIG5ldyBBcnJheUxpc3QoKSk7Ci0KLQkJTGlzdCBwYXJ0aXRpb25MaXN0ID0gKExpc3QpIGZDb250ZW50VHlwZXMuZ2V0KGNvbnRlbnRUeXBlSWQpOwotCQlwYXJ0aXRpb25MaXN0LmFkZChwYXJ0aXRpb25UeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGV4dGVuc2lvbi4gSWYgdGhlIGV4dGVuc2lvbiBwbHVnaW4gaGFzIG5vdCBiZWVuIGxvYWRlZCBhCi0JICogYnVzeSBjdXJzb3Igd2lsbCBiZSBhY3RpdmF0ZWQgZHVyaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgbG9hZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwcml2YXRlIE9iamVjdCBjcmVhdGVFeHRlbnNpb24oU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkvLyBJZiBwbHVnaW4gaGFzIGJlZW4gbG9hZGVkIGNyZWF0ZSBleHRlbnNpb24uCi0JCS8vIE90aGVyd2lzZSwgc2hvdyBidXN5IGN1cnNvciB0aGVuIGNyZWF0ZSBleHRlbnNpb24uCi0JCWZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKTsKLQkJZmluYWwgU3RyaW5nIG5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0KLQkJZmluYWwgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFsxXTsKLQkJU3RyaW5nIHBsdWdpbklkID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCWlmIChidW5kbGUuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24obmFtZSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQloYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKHJlc3VsdCwgZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShudWxsLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJcmVzdWx0WzBdID0gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKG5hbWUpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJaGFuZGxlQ3JlYXRlRXhlY3V0YWJsZUV4Y2VwdGlvbihyZXN1bHQsIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdFswXTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIElPcGVuT24gZm9yIHRoaXMgZGVmaW5pdGlvbgotCSAqLwotCXB1YmxpYyBJT3Blbk9uIGNyZWF0ZU9wZW5PbigpIHsKLQkJSU9wZW5PbiBvcGVuT24gPSBudWxsOwotCi0JCWlmIChnZXRDbGFzc05hbWUoKSAhPSBudWxsKSB7Ci0JCQlvcGVuT24gPSAoSU9wZW5PbikgY3JlYXRlRXh0ZW5zaW9uKE9wZW5PbkJ1aWxkZXIuQVRUX0NMQVNTKTsKLQkJfQotCi0JCXJldHVybiBvcGVuT247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmQ2xhc3MuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBmQ2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZkNvbmZpZ3VyYXRpb25FbGVtZW50LgotCSAqLwotCXB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKSB7Ci0JCXJldHVybiBmQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmQ29udGVudFR5cGVzLgotCSAqLwotCXB1YmxpYyBIYXNoTWFwIGdldENvbnRlbnRUeXBlcygpIHsKLQkJcmV0dXJuIGZDb250ZW50VHlwZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmSWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGZJZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICogQHBhcmFtIGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ3JlYXRlRXhlY3V0YWJsZUV4Y2VwdGlvbihPYmplY3RbXSByZXN1bHQsIFRocm93YWJsZSBlKSB7Ci0JCUxvZ2dlci5sb2dFeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgb3BlbiBvbjogIiArIGdldElkKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCXJlc3VsdFswXSA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuT25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuT25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjA5ZmY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vT3Blbk9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5vcGVub247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nOwotCi0KLS8qKgotICogRGV0ZXJtaW5lcyB0aGUgYXBwcm9wcmlhdGUgSU9wZW5PbiB0byBjYWxsIGJhc2VkIG9uIGN1cnJlbnQgcGFydGl0aW9uLgotICogCi0gKiBAZGVwcmVjYXRlZCBVc2UgYmFzZSBzdXBwb3J0IGZvciBoeXBlcmxpbmsgbmF2aWdhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgT3Blbk9uUHJvdmlkZXIgewotCXByaXZhdGUgc3RhdGljIE9wZW5PblByb3ZpZGVyIGZJbnN0YW5jZTsKLQotCS8qKgotCSAqIHJldHVybnMgc2luZ2xldG9uIGluc3RhbmNlIG9mIE9wZW5PblByb3ZpZGVyCi0JICogCi0JICogQHJldHVybiBPcGVuT25Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIE9wZW5PblByb3ZpZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBPcGVuT25Qcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHR5cGUgb2YgZG9jdW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQgLQotCSAqICAgICAgICAgICAgYXNzdW1lcyBkb2N1bWVudCBpcyBub3QgbnVsbAotCSAqIEByZXR1cm4gU3RyaW5nIGNvbnRlbnQgdHlwZSBvZiBnaXZlbiBkb2N1bWVudAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGUoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQotCQlJTW9kZWxNYW5hZ2VyIG1nciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBtZ3IuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQl0eXBlID0gbW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIElPcGVuT24gZm9yIHRoZSBjdXJyZW50IHBhcnRpdGlvbgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSU9wZW5PbiBnZXRPcGVuT24oSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCUlPcGVuT24gb3Blbk9uID0gbnVsbDsKLQotCQkvLyBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgcGFydGl0aW9uCi0JCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY29udGVudFR5cGVJRCA9IGdldENvbnRlbnRUeXBlKGRvY3VtZW50KTsKLQkJCVN0cmluZyBwYXJ0aXRpb25UeXBlID0gZ2V0UGFydGl0aW9uVHlwZShkb2N1bWVudCwgb2Zmc2V0KTsKLQotCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGVJRCk7Ci0KLQkJCXdoaWxlIChvcGVuT24gPT0gbnVsbCAmJiBjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQkJLy8gUXVlcnkgT3Blbk9uQnVpbGRlciBhbmQgZ2V0IHRoZSBsaXN0IG9mIE9wZW5PbnMgZm9yIHRoZQotCQkJCS8vIGN1cnJlbnQgcGFydGl0aW9uCi0JCQkJT3Blbk9uRGVmaW5pdGlvbltdIGRlZnMgPSBPcGVuT25CdWlsZGVyLmdldEluc3RhbmNlKCkuZ2V0T3Blbk9uRGVmaW5pdGlvbnMoY29udGVudFR5cGUuZ2V0SWQoKSwgcGFydGl0aW9uVHlwZSk7Ci0JCQkJY29udGVudFR5cGUgPSBjb250ZW50VHlwZS5nZXRCYXNlVHlwZSgpOwotCi0JCQkJLy8gSWYgbW9yZSB0aGFuIDEgb3Blbm9uIGlzIHJldHVybmVkLCBuZWVkIHRvIGZ1cnRoZXIgY2hlY2sKLQkJCQkvLyB3aGljaCBPcGVuT24gaXMgdGhlIGFwcHJvcHJpYXRlIG9uZSB0byByZXR1cm4KLQkJCQkvLyBmb3Igbm93IGp1c3QgcmV0dXJuaW5nIHRoZSBmaXJzdCBvbmUKLQkJCQlpZiAoZGVmcyAhPSBudWxsICYmIGRlZnMubGVuZ3RoID4gMCkgewotCQkJCQlvcGVuT24gPSBkZWZzWzBdLmNyZWF0ZU9wZW5PbigpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBvcGVuT247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFydGl0aW9uIHR5cGUgbG9jYXRlZCBhdCBvZmZzZXQgaW4gdGhlIGRvY3VtZW50Ci0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgZG9jdW1lbnQgaXMgbm90IG51bGwKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiBTdHJpbmcgcGFydGl0aW9uIHR5cGUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIFRPRE86IHByb3ZpZGUgcGFydGl0aW9uaW5nIGluZm9ybWF0aW9uIHNvIHdlJ3JlIG5vdCB1c2luZyBhIGRlZmF1bHQgbGlrZSB0aGlzCi0JCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJdHlwZSA9IFRleHRVdGlsaXRpZXMuZ2V0Q29udGVudFR5cGUoZG9jdW1lbnQsIElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcsIG9mZnNldCwgZmFsc2UpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlMSkgewotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCUlUeXBlZFJlZ2lvbiByZWdpb24gPSBkb2N1bWVudC5nZXRQYXJ0aXRpb24ob2Zmc2V0KTsKLQkJCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQl0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQl0eXBlID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0VkaXRvclByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0VkaXRvclByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmNjY2FjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9FZGl0b3JQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLQotLyoqCi0gKiBQcmVmZXJlbmNlIGtleXMgZm9yIFNTRSBVSQotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yUHJlZmVyZW5jZU5hbWVzIHsKLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBjb250cm9scyBvbi10aGUtZmx5IHZhbGlkYXRpb24KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkFMVUFURV9URU1QT1JBUllfUFJPQkxFTVMgPSBnZXRFdmFsdWF0ZVRlbXBvcmFyeVByb2JsZW1zS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RXZhbHVhdGVUZW1wb3JhcnlQcm9ibGVtc0tleSgpIHsKLQkJcmV0dXJuICJldmFsdWF0ZVRlbXBvcmFyeVByb2JsZW1zIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgYnJhY2tldCBtYXRjaGluZyBoaWdobGlnaHRpbmcKLQkgKiBpcyB0dXJuZWQgb24gb3Igb2ZmLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1BVENISU5HX0JSQUNLRVRTID0gZ2V0TWF0Y2hpbmdCcmFja2V0c0tleSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE1hdGNoaW5nQnJhY2tldHNLZXkoKSB7Ci0JCXJldHVybiAibWF0Y2hpbmdCcmFja2V0cyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBob2xkcyB0aGUgY29sb3IgdXNlZCB0byBoaWdobGlnaHQgbWF0Y2hpbmcKLQkgKiBicmFja2V0cy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uIEEgUkdCIGNvbG9yIHZhbHVlIGVuY29kZWQgYXMgYQotCSAqIHN0cmluZyB1c2luZyBjbGFzcyA8Y29kZT5QcmVmZXJlbmNlQ29udmVydGVyPC9jb2RlPgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNQVRDSElOR19CUkFDS0VUU19DT0xPUiA9IGdldE1hdGNoaW5nQnJhY2tldHNDb2xvcktleSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE1hdGNoaW5nQnJhY2tldHNDb2xvcktleSgpIHsKLQkJcmV0dXJuICJtYXRjaGluZ0JyYWNrZXRzQ29sb3IiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgZGVmaW5lcyB0aGUga2V5IGZvciB0aGUgaG92ZXIgbW9kaWZpZXJzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX1RFWFRfSE9WRVJfTU9ESUZJRVJTID0gZ2V0VGV4dEhvdmVyTW9kaWZpZXJzS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGV4dEhvdmVyTW9kaWZpZXJzS2V5KCkgewotCQlyZXR1cm4gImhvdmVyTW9kaWZpZXJzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGRlZmluZXMgcmVhZCBvbmx5IGNvbnRyYXN0IHNjYWxlLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+SW50ZWdlcjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfT05MWV9GT1JFR1JPVU5EX1NDQUxFID0gZ2V0UmVhZE9ubHlGb3JlZ3JvdW5kU2NhbGVLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRSZWFkT25seUZvcmVncm91bmRTY2FsZUtleSgpIHsKLQkJcmV0dXJuICJyZWFkT25seUZvcmVncm91bmRTY2FsZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBkZWZpbmVzIHdoZXRoZXIgb3Igbm90IHRvIHNob3cgYSBtZXNzYWdlIGRpYWxvZwotCSAqIGluZm9ybWluZyB1c2VyIG9mIHVua25vd24gY29udGVudCB0eXBlIGluIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9XX1VOS05PV05fQ09OVEVOVF9UWVBFX01TRyA9ICJzaG93VW5rbm93bkNvbnRlbnRUeXBlTXNnIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBuYW1lIHByZWZlcmVuY2UgdGhhdCBob2xkcyB0aGUgYXV0byBhY3RpdmF0aW9uIGRlbGF5IHRpbWUgaW4KLQkgKiBtaWxsaXNlY29uZHMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09ERUFTU0lTVF9BVVRPQUNUSVZBVElPTl9ERUxBWSA9ICJjb250ZW50X2Fzc2lzdF9hdXRvYWN0aXZhdGlvbl9kZWxheSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGhvbGRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIHVzZWQgaW4gdGhlIGNvZGUKLQkgKiBhc3Npc3Qgc2VsZWN0aW9uIGRpYWxvZy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uIEEgUkdCIGNvbG9yIHZhbHVlIGVuY29kZWQgYXMgYQotCSAqIHN0cmluZyB1c2luZyBjbGFzcyA8Y29kZT5QcmVmZXJlbmNlQ29udmVydGVyPC9jb2RlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlN0cmluZ0NvbnZlcnRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09ERUFTU0lTVF9QUk9QT1NBTFNfQkFDS0dST1VORCA9ICJjb250ZW50X2Fzc2lzdF9wcm9wb3NhbHNfYmFja2dyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGhvbGRzIHRoZSBmb3JlZ3JvdW5kIGNvbG9yIHVzZWQgaW4gdGhlIGNvZGUKLQkgKiBhc3Npc3Qgc2VsZWN0aW9uIGRpYWxvZy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uIEEgUkdCIGNvbG9yIHZhbHVlIGVuY29kZWQgYXMgYQotCSAqIHN0cmluZyB1c2luZyBjbGFzcyA8Y29kZT5QcmVmZXJlbmNlQ29udmVydGVyPC9jb2RlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlN0cmluZ0NvbnZlcnRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09ERUFTU0lTVF9QUk9QT1NBTFNfRk9SRUdST1VORCA9ICJjb250ZW50X2Fzc2lzdF9wcm9wb3NhbHNfZm9yZWdyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGhvbGRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIHVzZWQgZm9yIHBhcmFtZXRlcgotCSAqIGhpbnRzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4gQSBSR0IgY29sb3IgdmFsdWUgZW5jb2RlZCBhcyBhCi0JICogc3RyaW5nIHVzaW5nIGNsYXNzIDxjb2RlPlByZWZlcmVuY2VDb252ZXJ0ZXI8L2NvZGU+Ci0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuU3RyaW5nQ29udmVydGVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXIKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0RFQVNTSVNUX1BBUkFNRVRFUlNfQkFDS0dST1VORCA9ICJjb250ZW50X2Fzc2lzdF9wYXJhbWV0ZXJzX2JhY2tncm91bmQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBob2xkcyB0aGUgZm9yZWdyb3VuZCBjb2xvciB1c2VkIGluIHRoZSBjb2RlCi0JICogYXNzaXN0IHNlbGVjdGlvbiBkaWFsb2cuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LiBBIFJHQiBjb2xvciB2YWx1ZSBlbmNvZGVkIGFzIGEKLQkgKiBzdHJpbmcgdXNpbmcgY2xhc3MgPGNvZGU+UHJlZmVyZW5jZUNvbnZlcnRlcjwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5TdHJpbmdDb252ZXJ0ZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNvbnZlcnRlcgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPREVBU1NJU1RfUEFSQU1FVEVSU19GT1JFR1JPVU5EID0gImNvbnRlbnRfYXNzaXN0X3BhcmFtZXRlcnNfZm9yZWdyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9PdmVybGF5UHJlZmVyZW5jZVN0b3JlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmViMTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9PdmVybGF5UHJlZmVyZW5jZVN0b3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogQW4gb3ZlcmxheWluZyBwcmVmZXJlbmNlIHN0b3JlLiBjb3BpZWQgZnJvbSBKRFQKLSAqLwotcHVibGljIGNsYXNzIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgaW1wbGVtZW50cyBJUHJlZmVyZW5jZVN0b3JlIHsKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgT3ZlcmxheUtleSB7Ci0KLQkJVHlwZURlc2NyaXB0b3IgZkRlc2NyaXB0b3I7Ci0JCVN0cmluZyBmS2V5OwotCi0JCXB1YmxpYyBPdmVybGF5S2V5KFR5cGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFN0cmluZyBrZXkpIHsKLQkJCWZEZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLQkJCWZLZXkgPSBrZXk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFByb3BlcnR5TGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkJLyoKLQkJICogQHNlZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJT3ZlcmxheUtleSBrZXkgPSBmaW5kT3ZlcmxheUtleShldmVudC5nZXRQcm9wZXJ0eSgpKTsKLQkJCWlmIChrZXkgIT0gbnVsbCkKLQkJCQlwcm9wYWdhdGVQcm9wZXJ0eShmUGFyZW50LCBrZXksIGZTdG9yZSk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVHlwZURlc2NyaXB0b3IgewotCQlwcml2YXRlIFR5cGVEZXNjcmlwdG9yKCkgewotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlRGVzY3JpcHRvciBCT09MRUFOID0gbmV3IFR5cGVEZXNjcmlwdG9yKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlRGVzY3JpcHRvciBET1VCTEUgPSBuZXcgVHlwZURlc2NyaXB0b3IoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVEZXNjcmlwdG9yIEZMT0FUID0gbmV3IFR5cGVEZXNjcmlwdG9yKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlRGVzY3JpcHRvciBJTlQgPSBuZXcgVHlwZURlc2NyaXB0b3IoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVEZXNjcmlwdG9yIExPTkcgPSBuZXcgVHlwZURlc2NyaXB0b3IoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVEZXNjcmlwdG9yIFNUUklORyA9IG5ldyBUeXBlRGVzY3JpcHRvcigpOwotCXByaXZhdGUgYm9vbGVhbiBmTG9hZGVkOwotCXByaXZhdGUgT3ZlcmxheUtleVtdIGZPdmVybGF5S2V5czsKLQotCi0JSVByZWZlcmVuY2VTdG9yZSBmUGFyZW50OwotCi0JcHJpdmF0ZSBQcm9wZXJ0eUxpc3RlbmVyIGZQcm9wZXJ0eUxpc3RlbmVyOwotCUlQcmVmZXJlbmNlU3RvcmUgZlN0b3JlOwotCi0KLQlwdWJsaWMgT3ZlcmxheVByZWZlcmVuY2VTdG9yZShJUHJlZmVyZW5jZVN0b3JlIHBhcmVudCwgT3ZlcmxheUtleVtdIG92ZXJsYXlLZXlzKSB7Ci0JCWZQYXJlbnQgPSBwYXJlbnQ7Ci0JCWZPdmVybGF5S2V5cyA9IG92ZXJsYXlLZXlzOwotCQlmU3RvcmUgPSBuZXcgUHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGtleXMgdG8gYWRkIHRvIHRoZSBsaXN0IG9mIG92ZXJsYXkga2V5cy4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUge0BsaW5rICNsb2FkKCl9aXMgY2FsbGVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5cwotCSAqIEBwbGFubmVkZm9yIDMuMAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEtleXMoT3ZlcmxheUtleVtdIGtleXMpIHsKLQkJQXNzZXJ0LmlzVHJ1ZSghZkxvYWRlZCk7Ci0JCUFzc2VydC5pc05vdE51bGwoa2V5cyk7Ci0KLQkJaW50IG92ZXJsYXlLZXlzTGVuZ3RoID0gZk92ZXJsYXlLZXlzLmxlbmd0aDsKLQkJT3ZlcmxheUtleVtdIHJlc3VsdCA9IG5ldyBPdmVybGF5S2V5W2tleXMubGVuZ3RoICsgb3ZlcmxheUtleXNMZW5ndGhdOwotCi0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBvdmVybGF5S2V5c0xlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQotCQkJcmVzdWx0W2ldID0gZk92ZXJsYXlLZXlzW2ldOwotCi0JCWZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQotCQkJcmVzdWx0W292ZXJsYXlLZXlzTGVuZ3RoICsgaV0gPSBrZXlzW2ldOwotCi0JCWZPdmVybGF5S2V5cyA9IHJlc3VsdDsKLQotCQlpZiAoZkxvYWRlZCkKLQkJCWxvYWQoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZlN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2NvbnRhaW5zKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmNvbnRhaW5zKG5hbWUpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb3ZlcnMoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gKGZpbmRPdmVybGF5S2V5KGtleSkgIT0gbnVsbCk7Ci0JfQotCi0JT3ZlcmxheUtleSBmaW5kT3ZlcmxheUtleShTdHJpbmcga2V5KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZk92ZXJsYXlLZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZk92ZXJsYXlLZXlzW2ldLmZLZXkuZXF1YWxzKGtleSkpCi0JCQkJcmV0dXJuIGZPdmVybGF5S2V5c1tpXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChTdHJpbmcsIE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFN0cmluZyBuYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlmU3RvcmUuZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQobmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXRCb29sZWFuKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0Qm9vbGVhbihuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXREZWZhdWx0Qm9vbGVhbihTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdEJvb2xlYW4oU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXREZWZhdWx0Qm9vbGVhbihuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXREZWZhdWx0RG91YmxlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgZG91YmxlIGdldERlZmF1bHREb3VibGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXREZWZhdWx0RG91YmxlKG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldERlZmF1bHRGbG9hdChTdHJpbmcpCi0JICovCi0JcHVibGljIGZsb2F0IGdldERlZmF1bHRGbG9hdChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldERlZmF1bHRGbG9hdChuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXREZWZhdWx0SW50KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgaW50IGdldERlZmF1bHRJbnQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXREZWZhdWx0SW50KG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldERlZmF1bHRMb25nKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXREZWZhdWx0TG9uZyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldERlZmF1bHRMb25nKG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldERlZmF1bHRTdHJpbmcoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFN0cmluZyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldERlZmF1bHRTdHJpbmcobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0RG91YmxlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgZG91YmxlIGdldERvdWJsZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldERvdWJsZShuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXRGbG9hdChTdHJpbmcpCi0JICovCi0JcHVibGljIGZsb2F0IGdldEZsb2F0KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0RmxvYXQobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0SW50KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldEludChuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXRMb25nKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRMb25nKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0TG9uZyhuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXRTdHJpbmcoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0U3RyaW5nKG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2lzRGVmYXVsdChTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuaXNEZWZhdWx0KG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWQoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZk92ZXJsYXlLZXlzLmxlbmd0aDsgaSsrKQotCQkJbG9hZFByb3BlcnR5KGZQYXJlbnQsIGZPdmVybGF5S2V5c1tpXSwgZlN0b3JlLCB0cnVlKTsKLQotCQlmTG9hZGVkID0gdHJ1ZTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWREZWZhdWx0cygpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmT3ZlcmxheUtleXMubGVuZ3RoOyBpKyspCi0JCQlzZXRUb0RlZmF1bHQoZk92ZXJsYXlLZXlzW2ldLmZLZXkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkUHJvcGVydHkoSVByZWZlcmVuY2VTdG9yZSBvcmdpbiwgT3ZlcmxheUtleSBrZXksIElQcmVmZXJlbmNlU3RvcmUgdGFyZ2V0LCBib29sZWFuIGZvcmNlSW5pdGlhbGl6YXRpb24pIHsKLQkJVHlwZURlc2NyaXB0b3IgZCA9IGtleS5mRGVzY3JpcHRvcjsKLQkJaWYgKEJPT0xFQU4gPT0gZCkgewotCi0JCQlpZiAoZm9yY2VJbml0aWFsaXphdGlvbikKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIHRydWUpOwotCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmdpbi5nZXRCb29sZWFuKGtleS5mS2V5KSk7Ci0JCQl0YXJnZXQuc2V0RGVmYXVsdChrZXkuZktleSwgb3JnaW4uZ2V0RGVmYXVsdEJvb2xlYW4oa2V5LmZLZXkpKTsKLQotCQl9IGVsc2UgaWYgKERPVUJMRSA9PSBkKSB7Ci0KLQkJCWlmIChmb3JjZUluaXRpYWxpemF0aW9uKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgMS4wRCk7Ci0JCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yZ2luLmdldERvdWJsZShrZXkuZktleSkpOwotCQkJdGFyZ2V0LnNldERlZmF1bHQoa2V5LmZLZXksIG9yZ2luLmdldERlZmF1bHREb3VibGUoa2V5LmZLZXkpKTsKLQotCQl9IGVsc2UgaWYgKEZMT0FUID09IGQpIHsKLQotCQkJaWYgKGZvcmNlSW5pdGlhbGl6YXRpb24pCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCAxLjBGKTsKLQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JnaW4uZ2V0RmxvYXQoa2V5LmZLZXkpKTsKLQkJCXRhcmdldC5zZXREZWZhdWx0KGtleS5mS2V5LCBvcmdpbi5nZXREZWZhdWx0RmxvYXQoa2V5LmZLZXkpKTsKLQotCQl9IGVsc2UgaWYgKElOVCA9PSBkKSB7Ci0KLQkJCWlmIChmb3JjZUluaXRpYWxpemF0aW9uKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgMSk7Ci0JCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yZ2luLmdldEludChrZXkuZktleSkpOwotCQkJdGFyZ2V0LnNldERlZmF1bHQoa2V5LmZLZXksIG9yZ2luLmdldERlZmF1bHRJbnQoa2V5LmZLZXkpKTsKLQotCQl9IGVsc2UgaWYgKExPTkcgPT0gZCkgewotCi0JCQlpZiAoZm9yY2VJbml0aWFsaXphdGlvbikKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIDFMKTsKLQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JnaW4uZ2V0TG9uZyhrZXkuZktleSkpOwotCQkJdGFyZ2V0LnNldERlZmF1bHQoa2V5LmZLZXksIG9yZ2luLmdldERlZmF1bHRMb25nKGtleS5mS2V5KSk7Ci0KLQkJfSBlbHNlIGlmIChTVFJJTkcgPT0gZCkgewotCi0JCQlpZiAoZm9yY2VJbml0aWFsaXphdGlvbikKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksICIxIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JnaW4uZ2V0U3RyaW5nKGtleS5mS2V5KSk7Ci0JCQl0YXJnZXQuc2V0RGVmYXVsdChrZXkuZktleSwgb3JnaW4uZ2V0RGVmYXVsdFN0cmluZyhrZXkuZktleSkpOwotCi0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNuZWVkc1NhdmluZygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gbmVlZHNTYXZpbmcoKSB7Ci0JCXJldHVybiBmU3RvcmUubmVlZHNTYXZpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wYWdhdGUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZk92ZXJsYXlLZXlzLmxlbmd0aDsgaSsrKQotCQkJcHJvcGFnYXRlUHJvcGVydHkoZlN0b3JlLCBmT3ZlcmxheUtleXNbaV0sIGZQYXJlbnQpOwotCX0KLQotCXZvaWQgcHJvcGFnYXRlUHJvcGVydHkoSVByZWZlcmVuY2VTdG9yZSBvcmdpbiwgT3ZlcmxheUtleSBrZXksIElQcmVmZXJlbmNlU3RvcmUgdGFyZ2V0KSB7Ci0KLQkJaWYgKG9yZ2luLmlzRGVmYXVsdChrZXkuZktleSkpIHsKLQkJCWlmICghdGFyZ2V0LmlzRGVmYXVsdChrZXkuZktleSkpCi0JCQkJdGFyZ2V0LnNldFRvRGVmYXVsdChrZXkuZktleSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlUeXBlRGVzY3JpcHRvciBkID0ga2V5LmZEZXNjcmlwdG9yOwotCQlpZiAoQk9PTEVBTiA9PSBkKSB7Ci0KLQkJCWJvb2xlYW4gb3JpZ2luVmFsdWUgPSBvcmdpbi5nZXRCb29sZWFuKGtleS5mS2V5KTsKLQkJCWJvb2xlYW4gdGFyZ2V0VmFsdWUgPSB0YXJnZXQuZ2V0Qm9vbGVhbihrZXkuZktleSk7Ci0JCQlpZiAodGFyZ2V0VmFsdWUgIT0gb3JpZ2luVmFsdWUpCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmlnaW5WYWx1ZSk7Ci0KLQkJfSBlbHNlIGlmIChET1VCTEUgPT0gZCkgewotCi0JCQlkb3VibGUgb3JpZ2luVmFsdWUgPSBvcmdpbi5nZXREb3VibGUoa2V5LmZLZXkpOwotCQkJZG91YmxlIHRhcmdldFZhbHVlID0gdGFyZ2V0LmdldERvdWJsZShrZXkuZktleSk7Ci0JCQlpZiAodGFyZ2V0VmFsdWUgIT0gb3JpZ2luVmFsdWUpCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmlnaW5WYWx1ZSk7Ci0KLQkJfSBlbHNlIGlmIChGTE9BVCA9PSBkKSB7Ci0KLQkJCWZsb2F0IG9yaWdpblZhbHVlID0gb3JnaW4uZ2V0RmxvYXQoa2V5LmZLZXkpOwotCQkJZmxvYXQgdGFyZ2V0VmFsdWUgPSB0YXJnZXQuZ2V0RmxvYXQoa2V5LmZLZXkpOwotCQkJaWYgKHRhcmdldFZhbHVlICE9IG9yaWdpblZhbHVlKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JpZ2luVmFsdWUpOwotCi0JCX0gZWxzZSBpZiAoSU5UID09IGQpIHsKLQotCQkJaW50IG9yaWdpblZhbHVlID0gb3JnaW4uZ2V0SW50KGtleS5mS2V5KTsKLQkJCWludCB0YXJnZXRWYWx1ZSA9IHRhcmdldC5nZXRJbnQoa2V5LmZLZXkpOwotCQkJaWYgKHRhcmdldFZhbHVlICE9IG9yaWdpblZhbHVlKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JpZ2luVmFsdWUpOwotCi0JCX0gZWxzZSBpZiAoTE9ORyA9PSBkKSB7Ci0KLQkJCWxvbmcgb3JpZ2luVmFsdWUgPSBvcmdpbi5nZXRMb25nKGtleS5mS2V5KTsKLQkJCWxvbmcgdGFyZ2V0VmFsdWUgPSB0YXJnZXQuZ2V0TG9uZyhrZXkuZktleSk7Ci0JCQlpZiAodGFyZ2V0VmFsdWUgIT0gb3JpZ2luVmFsdWUpCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmlnaW5WYWx1ZSk7Ci0KLQkJfSBlbHNlIGlmIChTVFJJTkcgPT0gZCkgewotCi0JCQlTdHJpbmcgb3JpZ2luVmFsdWUgPSBvcmdpbi5nZXRTdHJpbmcoa2V5LmZLZXkpOwotCQkJU3RyaW5nIHRhcmdldFZhbHVlID0gdGFyZ2V0LmdldFN0cmluZyhrZXkuZktleSk7Ci0JCQlpZiAodGFyZ2V0VmFsdWUgIT0gbnVsbCAmJiBvcmlnaW5WYWx1ZSAhPSBudWxsICYmICF0YXJnZXRWYWx1ZS5lcXVhbHMob3JpZ2luVmFsdWUpKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JpZ2luVmFsdWUpOwotCi0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNwdXRWYWx1ZShTdHJpbmcsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBwdXRWYWx1ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUucHV0VmFsdWUobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3JlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmU3RvcmUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0RGVmYXVsdChTdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldERlZmF1bHQoU3RyaW5nLCBkb3VibGUpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgZG91YmxlIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0RGVmYXVsdChTdHJpbmcsIGZsb2F0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0RGVmYXVsdChTdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXREZWZhdWx0KFN0cmluZywgbG9uZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0RGVmYXVsdChTdHJpbmcsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXRUb0RlZmF1bHQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvRGVmYXVsdChTdHJpbmcgbmFtZSkgewotCQlmU3RvcmUuc2V0VG9EZWZhdWx0KG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldFZhbHVlKFN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXRWYWx1ZShTdHJpbmcsIGRvdWJsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgZG91YmxlIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldFZhbHVlKFN0cmluZywgZmxvYXQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGZsb2F0IHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldFZhbHVlKFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0VmFsdWUoU3RyaW5nLCBsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBsb25nIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldFZhbHVlKFN0cmluZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JCWlmIChmUHJvcGVydHlMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmUHJvcGVydHlMaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUxpc3RlbmVyKCk7Ci0JCQlmUGFyZW50LmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByb3BlcnR5TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJaWYgKGZQcm9wZXJ0eUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCWZQYXJlbnQucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJvcGVydHlMaXN0ZW5lcik7Ci0JCQlmUHJvcGVydHlMaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvVGFiRm9sZGVyTGF5b3V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvVGFiRm9sZGVyTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYjg5MDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1RhYkZvbGRlckxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci0KLS8qKgotICogQ29waWVkIGZyb20gSkRUCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBUYWJGb2xkZXJMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgewotCi0JcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJaWYgKHdIaW50ICE9IFNXVC5ERUZBVUxUICYmIGhIaW50ICE9IFNXVC5ERUZBVUxUKQotCQkJcmV0dXJuIG5ldyBQb2ludCh3SGludCwgaEhpbnQpOwotCi0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotCQlpbnQgY291bnQgPSBjaGlsZHJlbi5sZW5ndGg7Ci0JCWludCBtYXhXaWR0aCA9IDAsIG1heEhlaWdodCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW2ldOwotCQkJUG9pbnQgcHQgPSBjaGlsZC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZsdXNoQ2FjaGUpOwotCQkJbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgcHQueCk7Ci0JCQltYXhIZWlnaHQgPSBNYXRoLm1heChtYXhIZWlnaHQsIHB0LnkpOwotCQl9Ci0KLQkJaWYgKHdIaW50ICE9IFNXVC5ERUZBVUxUKQotCQkJbWF4V2lkdGggPSB3SGludDsKLQkJaWYgKGhIaW50ICE9IFNXVC5ERUZBVUxUKQotCQkJbWF4SGVpZ2h0ID0gaEhpbnQ7Ci0KLQkJcmV0dXJuIG5ldyBQb2ludChtYXhXaWR0aCwgbWF4SGVpZ2h0KTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBjb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpOwotCi0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQljaGlsZHJlbltpXS5zZXRCb3VuZHMocmVjdCk7Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9BYnN0cmFjdENvbG9yUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0Q29sb3JQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZTNiMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0Q29sb3JQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29sb3JQYWdlIGV4dGVuZHMgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0JcHJvdGVjdGVkIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZk92ZXJsYXlTdG9yZTsKLQlwcm90ZWN0ZWQgU3R5bGVkVGV4dENvbG9yUGlja2VyIGZQaWNrZXIgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29sb3JpbmcgZ3JvdXAgdXNlZCBpbiBjcmVhdGVDb250ZW50cyBUaGlzIG1ldGhvZCBjYW4gYmUKLQkgKiBvdmVyd3JpdHRlbiB0byBzZXQgdGhlIHRleHQgb2YgdGhlIGdyb3VwIG9yIHByb3ZpZGUgYW4gaW5mb3BvcAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlQ29sb3JpbmdDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29sb3JpbmdDb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLQkJcmV0dXJuIGNvbG9yaW5nQ29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29tcG9zaXRlIGNvbnRyb2wgYW5kIHNldHMgdGhlIGRlZmF1bHQgbGF5b3V0IGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy9HcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIHNjcm9sbGJhcnMgZm9yIHRoaXMgcHJlZmVyZW5jZSBwYWdlIHdoZW4gbmVlZGVkCi0JCWZpbmFsIFNjcm9sbGVkQ29tcG9zaXRlIHNjMSA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCXNjMS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJQ29tcG9zaXRlIHBhZ2VDb21wb25lbnQgPSBjcmVhdGVDb21wb3NpdGUoc2MxLCAxKTsKLQkJc2MxLnNldENvbnRlbnQocGFnZUNvbXBvbmVudCk7Ci0JCXNldFNpemUocGFnZUNvbXBvbmVudCk7Ci0KLQkJTGFiZWwgZGVzY0xhYmVsID0gY3JlYXRlRGVzY3JpcHRpb25MYWJlbChwYWdlQ29tcG9uZW50LCBTU0VVSU1lc3NhZ2VzLkFic3RyYWN0Q29sb3JQYWdlRGVzY3JpcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCUNvbXBvc2l0ZSBjb2xvcmluZ0NvbXBvc2l0ZSA9IGNyZWF0ZUNvbG9yaW5nQ29tcG9zaXRlKHBhZ2VDb21wb25lbnQpOwotCQljcmVhdGVDb250ZW50c0ZvclBpY2tlcihjb2xvcmluZ0NvbXBvc2l0ZSk7Ci0KLQkJR3JpZERhdGEgZ2QgPSAoR3JpZERhdGEpIGRlc2NMYWJlbC5nZXRMYXlvdXREYXRhKCk7Ci0JCWdkLndpZHRoSGludCA9IChjb2xvcmluZ0NvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKS54OwotCQlzZXRTaXplKHBhZ2VDb21wb25lbnQpOwotCQlyZXR1cm4gcGFnZUNvbXBvbmVudDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBTdHlsZWRUZXh0Q29sb3JQaWNrZXIgdXNlZCBpbiBjcmVhdGVDb250ZW50cyBUaGlzIG1ldGhvZAotCSAqIGNhbiBiZSBvdmVyd3JpdHRlbiB0byBzZXQgdXAgU3R5bGVkVGV4dENvbG9yUGlja2VyIGRpZmZlcmVudGx5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHNGb3JQaWNrZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgdGhlIGNvbG9yIHBpY2tlcgotCQlmUGlja2VyID0gbmV3IFN0eWxlZFRleHRDb2xvclBpY2tlcihwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlmUGlja2VyLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZlBpY2tlci5zZXRQcmVmZXJlbmNlU3RvcmUoZk92ZXJsYXlTdG9yZSk7Ci0JCXNldHVwUGlja2VyKGZQaWNrZXIpOwotCi0JCWZQaWNrZXIuc2V0VGV4dChnZXRTYW1wbGVUZXh0KCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBkZXNjcmlwdGlvbiBsYWJlbCBkaXNwbGF5ZWQgYXQgdG9wIG9mIHByZWZlcmVuY2UgcGFnZS4gVGhpcwotCSAqIG1ldGhvZC9sYWJlbCBpcyB1c2VkIGluc3RlYWQgb2YgUHJlZmVyZW5jZVBhZ2UncyBkZXNjcmlwdGlvbiBsYWJlbAotCSAqIGJlY2F1c2UgdGhlIFNjcm9sbGVkQ29tcG9zaXRlIGNvbnRhaW5lZCBpbiB0aGlzIHBhZ2Ugd2lsbCBub3QgZnVsbHkKLQkgKiB3b3JrIChob3Jpem9udGFsIHNjcm9sbGluZykgd2l0aCBQcmVmZXJlbmNlUGFnZSdzIGRlc2NyaXB0aW9uIGxhYmVsLgotCSAqLwotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVEZXNjcmlwdGlvbkxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUIHwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KGRlc2NyaXB0aW9uKTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29tcG9zaXRlIGNvbnRyb2wgYW5kIHNldHMgdGhlIGRlZmF1bHQgbGF5b3V0IGRhdGEuCi0JICovCi0KLQlwcm90ZWN0ZWQgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy9HcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvL0dyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBncm91cDsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBsYWJlbCBpbnN0YW5jZSBhbmQgc2V0cyB0aGUgZGVmYXVsdAotCSAqIGxheW91dCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByb3RlY3RlZCBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZVB1c2hCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIHRleHQgaW5zdGFuY2UgYW5kIHNldHMgdGhlIGRlZmF1bHQgbGF5b3V0Ci0JICogZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJVGV4dCB0ZXh0ZmllbGQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJdGV4dGZpZWxkLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXRleHRmaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gdGV4dGZpZWxkOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGZQaWNrZXIgIT0gbnVsbCAmJiAhZlBpY2tlci5pc0Rpc3Bvc2VkKCkpCi0JCQlmUGlja2VyLnJlbGVhc2VQaWNrZXJSZXNvdXJjZXMoKTsKLQkJaWYgKGZPdmVybGF5U3RvcmUgIT0gbnVsbCkgewotCQkJZk92ZXJsYXlTdG9yZS5zdG9wKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3R5bGVkVGV4dENvbG9yUGlja2VyIGdldFBpY2tlcigpIHsKLQkJcmV0dXJuIGZQaWNrZXI7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTYW1wbGVUZXh0KCk7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHByZWZlcmVuY2UgcGFnZSBmb3IgdGhlIGdpdmVuIHdvcmtiZW5jaC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBhcyB0aGUgcHJlZmVyZW5jZSBwYWdlIGlzIGJlaW5nCi0JICogY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQuIENsaWVudHMgbXVzdCBub3QgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHdvcmtiZW5jaAotCSAqICAgICAgICAgICAgdGhlIHdvcmtiZW5jaAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJZk92ZXJsYXlTdG9yZSA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlKGdldFByZWZlcmVuY2VTdG9yZSgpLCBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkpOwotCQlmT3ZlcmxheVN0b3JlLmxvYWQoKTsKLQkJZk92ZXJsYXlTdG9yZS5zdGFydCgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdXNpbmcgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlCi0JICogcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWZPdmVybGF5U3RvcmUubG9hZERlZmF1bHRzKCk7Ci0JCWZQaWNrZXIucmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJZk92ZXJsYXlTdG9yZS5wcm9wYWdhdGUoKTsKLQkJIHNhdmVQcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgewotCQkvLyBzYXZlIHBsdWdpbiBwcmVmZXJlbmNlcyBoZXJlCi0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2l6ZSBvZiBjb21wb3NpdGUgdG8gdGhlIGRlZmF1bHQgdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaWYgKGNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQkvLyBOb3RlOiBUaGUgZm9udCBpcyBzZXQgaGVyZSBpbiBhbnRpY2lwYXRpb24gdGhhdCB0aGUgY2xhc3MgaW5oZXJpdGluZwotCQkJLy8gICAgICAgdGhpcyBiYXNlIGNsYXNzIG1heSBhZGQgd2lkZ2V0cyB0byB0aGUgZGlhbG9nLiAgIHNldFNpemUKLQkJCS8vICAgICAgIGlzIGFzc3VtZWQgdG8gYmUgY2FsbGVkIGp1c3QgYmVmb3JlIHdlIGdvIGxpdmUuCi0JCQlhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJCVBvaW50IG1pblNpemUgPSBjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCWNvbXBvc2l0ZS5zZXRTaXplKG1pblNpemUpOwotCQkJLy8gc2V0IHNjcm9sbGJhciBjb21wb3NpdGUncyBtaW4gc2l6ZSBzbyBwYWdlIGlzIGV4cGFuZGFibGUgYnV0Ci0JCQkvLyBoYXMgc2Nyb2xsYmFycyB3aGVuIG5lZWRlZAotCQkJaWYgKGNvbXBvc2l0ZS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFNjcm9sbGVkQ29tcG9zaXRlKSB7Ci0JCQkJU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gKFNjcm9sbGVkQ29tcG9zaXRlKSBjb21wb3NpdGUuZ2V0UGFyZW50KCk7Ci0JCQkJc2MxLnNldE1pblNpemUobWluU2l6ZSk7Ci0JCQkJc2MxLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0JCQkJc2MxLnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0dXBQaWNrZXIoU3R5bGVkVGV4dENvbG9yUGlja2VyIHBpY2tlcik7Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlib29sZWFuIGRvU2hyaW5rID0gZmFsc2U7Ci0JCS8vIGxpbWl0ZXIsIGZvciB0aGUgcmVhbGx5IGh1Z2UgZm9udHMKLQkJaWYgKHZpc2libGUpIHsKLQkJCWdldFBpY2tlcigpLnJlZnJlc2goKTsKLQkJCWludCB4ID0gTWF0aC5taW4oZ2V0Q29udHJvbCgpLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLngsIGdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuZ2V0Q2xpZW50QXJlYSgpLndpZHRoICogOSAvIDEwKTsKLQkJCWludCB5ID0gTWF0aC5taW4oZ2V0Q29udHJvbCgpLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLnksIGdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuZ2V0Q2xpZW50QXJlYSgpLmhlaWdodCAqIDkgLyAxMCk7Ci0JCQlib29sZWFuIHNocmlua1dpZHRoID0gKHggIT0gZ2V0Q29udHJvbCgpLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLngpOwotCQkJYm9vbGVhbiBzaHJpbmtIZWlnaHQgPSAoeSAhPSBnZXRDb250cm9sKCkuZ2V0U2hlbGwoKS5nZXRTaXplKCkueSk7Ci0JCQlkb1NocmluayA9IHNocmlua1dpZHRoIHx8IHNocmlua0hlaWdodDsKLQkJCWlmIChkb1NocmluaykgewotCQkJCS8vIG1vZGlmeSBqdXN0IHRoZSBoZWlnaHQKLQkJCQlpZiAoc2hyaW5rSGVpZ2h0ICYmICFzaHJpbmtXaWR0aCkKLQkJCQkJZ2V0U2hlbGwoKS5zZXRCb3VuZHMoZ2V0U2hlbGwoKS5nZXRMb2NhdGlvbigpLngsIDAsIGdldFNoZWxsKCkuZ2V0U2l6ZSgpLngsIGdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuZ2V0Q2xpZW50QXJlYSgpLmhlaWdodCk7Ci0JCQkJLy8gbW9kaWZ5IGp1c3QgdGhlIHdpZHRoCi0JCQkJZWxzZSBpZiAoIXNocmlua0hlaWdodCAmJiBzaHJpbmtXaWR0aCkKLQkJCQkJZ2V0U2hlbGwoKS5zZXRCb3VuZHMoMCwgZ2V0U2hlbGwoKS5nZXRMb2NhdGlvbigpLnksIGdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuZ2V0Q2xpZW50QXJlYSgpLndpZHRoLCBnZXRTaGVsbCgpLmdldFNpemUoKS55KTsKLQkJCQkvLyBjaGFuZ2UgdGhlIGVudGlyZSBzaGVsbCBzaXplIHRvIG9ubHkgZmlsbCB0aGUgZGlzcGxheSwgYW5kCi0JCQkJLy8gbW92ZSBpdCB0byB0aGUgb3JpZ2luCi0JCQkJZWxzZQotCQkJCQlnZXRTaGVsbCgpLnNldEJvdW5kcygwLCAwLCBnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmdldENsaWVudEFyZWEoKS53aWR0aCwgZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5nZXRDbGllbnRBcmVhKCkuaGVpZ2h0KTsKLQkJCX0KLQkJfQotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAoZG9TaHJpbmspIHsKLQkJCWdldENvbnRyb2woKS5nZXRTaGVsbCgpLnJlZHJhdygpOwotCQkJZ2V0Q29udHJvbCgpLmdldFNoZWxsKCkudXBkYXRlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0UHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMwYjZhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotCi0vKioKLSAqIChwYSkgd2h5IGlzIHRoaXMgY2xhc3MgYWJzdHJhY3QgaWYgdGhlcmUgYXJlIG5vIGFic3RyYWN0IG1ldGhvZHM/Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIsIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBXSURUSF9WQUxJREFUSU9OX0xPV0VSX0xJTUlUID0gMDsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IFdJRFRIX1ZBTElEQVRJT05fVVBQRVJfTElNSVQgPSA5OTk7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlQ2hlY2tCb3goQ29tcG9zaXRlIGdyb3VwLCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvL0dyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvL0dyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZVNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbWJvIGNyZWF0ZURyb3BEb3duQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tYm8gY29tYm9Cb3ggPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0KLQkJLy9HcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWNvbWJvQm94LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGNvbWJvQm94OwotCX0KLQotCXByb3RlY3RlZCBHcm91cCBjcmVhdGVHcm91cChDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvL0dyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgZ3JvdXAsIFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihncm91cCwgU1dULlJBRElPKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVNjcm9sbGVkQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIHNjcm9sbGJhcnMgZm9yIHRoaXMgcGFyZW50IHdoZW4gbmVlZGVkCi0JCWZpbmFsIFNjcm9sbGVkQ29tcG9zaXRlIHNjMSA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCXNjMS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZShzYzEsIDEpOwotCQlzYzEuc2V0Q29udGVudChjb21wb3NpdGUpOwotCi0JCS8vIG5vdCBjYWxsaW5nIHNldFNpemUgZm9yIGNvbXBvc2l0ZSB3aWxsIHJlc3VsdCBpbiBhIGJsYW5rIGNvbXBvc2l0ZSwKLQkJLy8gc28gY2FsbGluZyBpdCBoZXJlIGluaXRpYWxseQotCQkvLyBzZXRTaXplIGFjdHVhbGx5IG5lZWRzIHRvIGJlIGNhbGxlZCBhZnRlciBhbGwgY29udHJvbHMgYXJlIGNyZWF0ZWQsCi0JCS8vIHNvIHNjcm9sbGVkQ29tcG9zaXRlCi0JCS8vIGhhcyBjb3JyZWN0IG1pblNpemUKLQkJc2V0U2l6ZShjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVTZXBhcmF0b3IoQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtblNwYW4pIHsKLQkJLy8gQ3JlYXRlIGEgc3BhY2VyIGxpbmUKLQkJTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQotCQkvL0dyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW5TcGFuOwotCi0JCXNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gc2VwYXJhdG9yOwotCX0KLQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlVmFsdWVzKCkgewotCX0KLQotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsb2FkUHJlZmVyZW5jZXMoKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpbml0aWFsaXplVmFsdWVzKCk7Ci0JCQkJdmFsaWRhdGVWYWx1ZXMoKTsKLQkJCQllbmFibGVWYWx1ZXMoKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkvLyBJZiB3ZSBhcmUgY2FsbGVkIHRvbyBlYXJseSwgaS5lLiBiZWZvcmUgdGhlIGNvbnRyb2xzIGFyZSBjcmVhdGVkCi0JCS8vIHRoZW4gcmV0dXJuCi0JCS8vIHRvIGF2b2lkIG51bGwgcG9pbnRlciBleGNlcHRpb25zCi0JCWlmIChlLndpZGdldCAhPSBudWxsICYmIGUud2lkZ2V0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQotCQl2YWxpZGF0ZVZhbHVlcygpOwotCQllbmFibGVWYWx1ZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJc2F2ZVByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNhdmVQcmVmZXJlbmNlcygpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXN0b3JlVmFsdWVzKCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnZhbGlkSW5wdXRNZXNzYWdlKFN0cmluZyB3aWR0aFRleHQpIHsKLQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuXzRjb25jYXQsIChuZXcgT2JqZWN0W117d2lkdGhUZXh0fSkpOwotCQlzZXRFcnJvck1lc3NhZ2UobXNnKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaWYgKGNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQkvLyBOb3RlOiBUaGUgZm9udCBpcyBzZXQgaGVyZSBpbiBhbnRpY2lwYXRpb24gdGhhdCB0aGUgY2xhc3MgaW5oZXJpdGluZwotCQkJLy8gICAgICAgdGhpcyBiYXNlIGNsYXNzIG1heSBhZGQgd2lkZ2V0cyB0byB0aGUgZGlhbG9nLiAgIHNldFNpemUKLQkJCS8vICAgICAgIGlzIGFzc3VtZWQgdG8gYmUgY2FsbGVkIGp1c3QgYmVmb3JlIHdlIGdvIGxpdmUuCi0JCQlhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJCVBvaW50IG1pblNpemUgPSBjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCWNvbXBvc2l0ZS5zZXRTaXplKG1pblNpemUpOwotCQkJLy8gc2V0IHNjcm9sbGJhciBjb21wb3NpdGUncyBtaW4gc2l6ZSBzbyBwYWdlIGlzIGV4cGFuZGFibGUgYnV0Ci0JCQkvLyBoYXMgc2Nyb2xsYmFycyB3aGVuIG5lZWRlZAotCQkJaWYgKGNvbXBvc2l0ZS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFNjcm9sbGVkQ29tcG9zaXRlKSB7Ci0JCQkJU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gKFNjcm9sbGVkQ29tcG9zaXRlKSBjb21wb3NpdGUuZ2V0UGFyZW50KCk7Ci0JCQkJc2MxLnNldE1pblNpemUobWluU2l6ZSk7Ci0JCQkJc2MxLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0JCQkJc2MxLnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCVNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVZhbHVlcygpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQl3aWRnZXRTZWxlY3RlZChlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCS8vIElmIHdlIGFyZSBjYWxsZWQgdG9vIGVhcmx5LCBpLmUuIGJlZm9yZSB0aGUgY29udHJvbHMgYXJlIGNyZWF0ZWQKLQkJLy8gdGhlbiByZXR1cm4KLQkJLy8gdG8gYXZvaWQgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbnMKLQkJaWYgKGUud2lkZ2V0ICE9IG51bGwgJiYgZS53aWRnZXQuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0JCXZhbGlkYXRlVmFsdWVzKCk7Ci0JCWVuYWJsZVZhbHVlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9BYnN0cmFjdFByZWZlcmVuY2VUYWIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9BYnN0cmFjdFByZWZlcmVuY2VUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFmMThhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RQcmVmZXJlbmNlVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIEdlbmVyaWMgcHJlZmVyZW5jZSB0YWIgcGFnZSB0aGF0IGNvbnRhaW5zIGhlbHBmdWwgbWV0aG9kcwotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBBYnN0cmFjdFByZWZlcmVuY2VUYWIgaW1wbGVtZW50cyBJUHJlZmVyZW5jZVRhYiB7Ci0KLQlNYXAgZkNoZWNrQm94ZXMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZkNoZWNrQm94TGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZS53aWRnZXQ7Ci0JCQlmT3ZlcmxheVN0b3JlLnNldFZhbHVlKChTdHJpbmcpIGZDaGVja0JveGVzLmdldChidXR0b24pLCBidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfTsKLQlwcml2YXRlIFByZWZlcmVuY2VQYWdlIGZNYWluUHJlZmVyZW5jZVBhZ2U7Ci0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBmTnVtYmVyRmllbGRMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQludW1iZXJGaWVsZENoYW5nZWQoKFRleHQpIGUud2lkZ2V0KTsKLQkJfQotCX07Ci0JcHJpdmF0ZSBBcnJheUxpc3QgZk51bWJlckZpZWxkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlPdmVybGF5UHJlZmVyZW5jZVN0b3JlIGZPdmVybGF5U3RvcmU7Ci0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBmVGV4dEZpZWxkTGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGUud2lkZ2V0OwotCQkJZk92ZXJsYXlTdG9yZS5zZXRWYWx1ZSgoU3RyaW5nKSBmVGV4dEZpZWxkcy5nZXQodGV4dCksIHRleHQuZ2V0VGV4dCgpKTsKLQkJfQotCX07Ci0JTWFwIGZUZXh0RmllbGRzID0gbmV3IEhhc2hNYXAoKTsKLQotCXByb3RlY3RlZCBCdXR0b24gYWRkQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcga2V5LCBpbnQgaW5kZW50YXRpb24pIHsKLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQm94LnNldFRleHQobGFiZWwpOwotCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZ2QuaG9yaXpvbnRhbEluZGVudCA9IGluZGVudGF0aW9uOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWNoZWNrQm94LnNldExheW91dERhdGEoZ2QpOwotCQljaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihmQ2hlY2tCb3hMaXN0ZW5lcik7Ci0KLQkJZkNoZWNrQm94ZXMucHV0KGNoZWNrQm94LCBrZXkpOwotCi0JCXJldHVybiBjaGVja0JveDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHNpemUgMjogLSBmaXJzdCBlbGVtZW50IGlzIG9mIHR5cGUKLQkgKiA8Y29kZT5MYWJlbDwvY29kZT4tIHNlY29uZCBlbGVtZW50IGlzIG9mIHR5cGUgPGNvZGU+VGV4dDwvY29kZT4KLQkgKiBVc2UgPGNvZGU+Z2V0TGFiZWxDb250cm9sPC9jb2RlPiBhbmQgPGNvZGU+Z2V0VGV4dENvbnRyb2w8L2NvZGU+IHRvCi0JICogZ2V0IHRoZSAyIGNvbnRyb2xzLgotCSAqLwotCXByaXZhdGUgQ29udHJvbFtdIGFkZExhYmVsbGVkVGV4dEZpZWxkKENvbXBvc2l0ZSBjb21wb3NpdGUsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGtleSwgaW50IHRleHRMaW1pdCwgaW50IGluZGVudGF0aW9uLCBib29sZWFuIGlzTnVtYmVyKSB7Ci0JCUxhYmVsIGxhYmVsQ29udHJvbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWxDb250cm9sLnNldFRleHQobGFiZWwpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWdkLmhvcml6b250YWxJbmRlbnQgPSBpbmRlbnRhdGlvbjsKLQkJbGFiZWxDb250cm9sLnNldExheW91dERhdGEoZ2QpOwotCi0JCVRleHQgdGV4dENvbnRyb2wgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlnZC53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHModGV4dENvbnRyb2wsIHRleHRMaW1pdCArIDEpOwotCQl0ZXh0Q29udHJvbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdGV4dENvbnRyb2wuc2V0VGV4dExpbWl0KHRleHRMaW1pdCk7Ci0JCWZUZXh0RmllbGRzLnB1dCh0ZXh0Q29udHJvbCwga2V5KTsKLQkJaWYgKGlzTnVtYmVyKSB7Ci0JCQlmTnVtYmVyRmllbGRzLmFkZCh0ZXh0Q29udHJvbCk7Ci0JCQl0ZXh0Q29udHJvbC5hZGRNb2RpZnlMaXN0ZW5lcihmTnVtYmVyRmllbGRMaXN0ZW5lcik7Ci0JCX0gZWxzZSB7Ci0JCQl0ZXh0Q29udHJvbC5hZGRNb2RpZnlMaXN0ZW5lcihmVGV4dEZpZWxkTGlzdGVuZXIpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBDb250cm9sW117bGFiZWxDb250cm9sLCB0ZXh0Q29udHJvbH07Ci0JfQotCi0JcHJvdGVjdGVkIFRleHQgYWRkVGV4dEZpZWxkKENvbXBvc2l0ZSBjb21wb3NpdGUsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGtleSwgaW50IHRleHRMaW1pdCwgaW50IGluZGVudGF0aW9uLCBib29sZWFuIGlzTnVtYmVyKSB7Ci0JCXJldHVybiBnZXRUZXh0Q29udHJvbChhZGRMYWJlbGxlZFRleHRGaWVsZChjb21wb3NpdGUsIGxhYmVsLCBrZXksIHRleHRMaW1pdCwgaW5kZW50YXRpb24sIGlzTnVtYmVyKSk7Ci0JfQotCi0JLyoqCi0JICogQXBwbGllcyB0aGUgc3RhdHVzIHRvIHRoZSBzdGF0dXMgbGluZSBvZiBhIGRpYWxvZyBwYWdlLgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBseVRvU3RhdHVzTGluZShJU3RhdHVzIHN0YXR1cykgewotCQlTdHJpbmcgbWVzc2FnZSA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCXN3aXRjaCAoc3RhdHVzLmdldFNldmVyaXR5KCkpIHsKLQkJCWNhc2UgSVN0YXR1cy5PSyA6Ci0JCQkJZk1haW5QcmVmZXJlbmNlUGFnZS5zZXRNZXNzYWdlKG1lc3NhZ2UsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCQkJZk1haW5QcmVmZXJlbmNlUGFnZS5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElTdGF0dXMuV0FSTklORyA6Ci0JCQkJZk1haW5QcmVmZXJlbmNlUGFnZS5zZXRNZXNzYWdlKG1lc3NhZ2UsIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCQkJZk1haW5QcmVmZXJlbmNlUGFnZS5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElTdGF0dXMuSU5GTyA6Ci0JCQkJZk1haW5QcmVmZXJlbmNlUGFnZS5zZXRNZXNzYWdlKG1lc3NhZ2UsIElNZXNzYWdlUHJvdmlkZXIuSU5GT1JNQVRJT04pOwotCQkJCWZNYWluUHJlZmVyZW5jZVBhZ2Uuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJaWYgKG1lc3NhZ2UubGVuZ3RoKCkgPT0gMCkgewotCQkJCQltZXNzYWdlID0gbnVsbDsKLQkJCQl9Ci0JCQkJZk1haW5QcmVmZXJlbmNlUGFnZS5zZXRNZXNzYWdlKG51bGwpOwotCQkJCWZNYWluUHJlZmVyZW5jZVBhZ2Uuc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBpeGVscyBjb3JyZXNwb25kaW5nIHRvIHRoZSB3aWR0aCBvZiB0aGUgZ2l2ZW4KLQkgKiBudW1iZXIgb2YgY2hhcmFjdGVycy4gVGhpcyBtZXRob2Qgd2FzIGNvcGllZCBmcm9tCi0JICogb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlCi0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIGEKLQkgKiAgICAgICAgICAgIGNvbnRyb2wgaW4gdGhlIHBhZ2UKLQkgKiBAcGFyYW0gY2hhcnMKLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycwotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwaXhlbHMKLQkgKi8KLQlwcml2YXRlIGludCBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoQ29udHJvbCB0ZXN0Q29udHJvbCwgaW50IGNoYXJzKSB7Ci0JCS8vIENvbXB1dGUgYW5kIHN0b3JlIGEgZm9udCBtZXRyaWMKLQkJR0MgZ2MgPSBuZXcgR0ModGVzdENvbnRyb2wpOwotCQlnYy5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCUZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCi0JCS8vIHRlc3QgZm9yIGZhaWx1cmUgdG8gaW5pdGlhbGl6ZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotCQlpZiAoZm9udE1ldHJpY3MgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gRGlhbG9nLmNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhmb250TWV0cmljcywgY2hhcnMpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZk1haW5QcmVmZXJlbmNlUGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZVBhZ2UgZ2V0TWFpblByZWZlcmVuY2VQYWdlKCkgewotCQlyZXR1cm4gZk1haW5QcmVmZXJlbmNlUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZPdmVybGF5U3RvcmUuCi0JICovCi0JcHJvdGVjdGVkIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZ2V0T3ZlcmxheVN0b3JlKCkgewotCQlyZXR1cm4gZk92ZXJsYXlTdG9yZTsKLQl9Ci0KLQlwcml2YXRlIFRleHQgZ2V0VGV4dENvbnRyb2woQ29udHJvbFtdIGxhYmVsbGVkVGV4dEZpZWxkKSB7Ci0JCXJldHVybiAoVGV4dCkgbGFiZWxsZWRUZXh0RmllbGRbMV07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZpZWxkcygpIHsKLQkJSXRlcmF0b3IgZSA9IGZDaGVja0JveGVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBmQ2hlY2tCb3hlcy5nZXQoYik7Ci0JCQliLnNldFNlbGVjdGlvbihmT3ZlcmxheVN0b3JlLmdldEJvb2xlYW4oa2V5KSk7Ci0JCX0KLQotCQllID0gZlRleHRGaWVsZHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlUZXh0IHQgPSAoVGV4dCkgZS5uZXh0KCk7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZlRleHRGaWVsZHMuZ2V0KHQpOwotCQkJdC5zZXRUZXh0KGZPdmVybGF5U3RvcmUuZ2V0U3RyaW5nKGtleSkpOwotCQl9Ci0JfQotCi0Jdm9pZCBudW1iZXJGaWVsZENoYW5nZWQoVGV4dCB0ZXh0Q29udHJvbCkgewotCQlTdHJpbmcgbnVtYmVyID0gdGV4dENvbnRyb2wuZ2V0VGV4dCgpOwotCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlUG9zaXRpdmVOdW1iZXIobnVtYmVyKTsKLQkJaWYgKCFzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkKLQkJCWZPdmVybGF5U3RvcmUuc2V0VmFsdWUoKFN0cmluZykgZlRleHRGaWVsZHMuZ2V0KHRleHRDb250cm9sKSwgbnVtYmVyKTsKLQkJdXBkYXRlU3RhdHVzKHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1haW5QcmVmZXJlbmNlUGFnZQotCSAqICAgICAgICAgICAgVGhlIGZNYWluUHJlZmVyZW5jZVBhZ2UgdG8gc2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1haW5QcmVmZXJlbmNlUGFnZShQcmVmZXJlbmNlUGFnZSBtYWluUHJlZmVyZW5jZVBhZ2UpIHsKLQkJZk1haW5QcmVmZXJlbmNlUGFnZSA9IG1haW5QcmVmZXJlbmNlUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb3ZlcmxheVN0b3JlCi0JICogICAgICAgICAgICBUaGUgZk92ZXJsYXlTdG9yZSB0byBzZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3ZlcmxheVN0b3JlKE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgb3ZlcmxheVN0b3JlKSB7Ci0JCWZPdmVybGF5U3RvcmUgPSBvdmVybGF5U3RvcmU7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHN0YXR1cyBvZiBtYWluIHByZWZlcmVuY2UgcGFnZQotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGF0dXMoSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKCFzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmTnVtYmVyRmllbGRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGZOdW1iZXJGaWVsZHMuZ2V0KGkpOwotCQkJCUlTdGF0dXMgcyA9IHZhbGlkYXRlUG9zaXRpdmVOdW1iZXIodGV4dC5nZXRUZXh0KCkpOwotCQkJCXN0YXR1cyA9IHMuZ2V0U2V2ZXJpdHkoKSA+IHN0YXR1cy5nZXRTZXZlcml0eSgpID8gcyA6IHN0YXR1czsKLQkJCX0KLQkJfQotCi0JCWZNYWluUHJlZmVyZW5jZVBhZ2Uuc2V0VmFsaWQoIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKTsKLQkJYXBwbHlUb1N0YXR1c0xpbmUoc3RhdHVzKTsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVQb3NpdGl2ZU51bWJlcihTdHJpbmcgbnVtYmVyKSB7Ci0JCVN0YXR1c0luZm8gc3RhdHVzID0gbmV3IFN0YXR1c0luZm8oKTsKLQkJaWYgKG51bWJlci5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlzdGF0dXMuc2V0RXJyb3IoU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM3KTsKLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJaW50IHZhbHVlID0gSW50ZWdlci5wYXJzZUludChudW1iZXIpOwotCQkJCWlmICh2YWx1ZSA8IDApCi0JCQkJCXN0YXR1cy5zZXRFcnJvcihudW1iZXIgKyBTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMzgpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQlzdGF0dXMuc2V0RXJyb3IobnVtYmVyICsgU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM4KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9Db2xvckVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NvbG9yRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMWQxNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NvbG9yRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29sb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBICJidXR0b24iIG9mIGEgY2VydGFpbiBjb2xvciBkZXRlcm1pbmVkIGJ5IHRoZSBjb2xvciBwaWNrZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2xvckVkaXRvciB7Ci0JQnV0dG9uIGZCdXR0b247Ci0JQ29sb3IgZkNvbG9yOwotCVJHQiBmQ29sb3JWYWx1ZTsKLQotCXByaXZhdGUgUG9pbnQgZkV4dGVudDsKLQlJbWFnZSBmSW1hZ2U7Ci0KLQlwdWJsaWMgQ29sb3JFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCWZCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQlmRXh0ZW50ID0gY29tcHV0ZUltYWdlU2l6ZShwYXJlbnQpOwotCQlmSW1hZ2UgPSBuZXcgSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSwgZkV4dGVudC54LCBmRXh0ZW50LnkpOwotCi0JCUdDIGdjID0gbmV3IEdDKGZJbWFnZSk7Ci0JCWdjLnNldEJhY2tncm91bmQoZkJ1dHRvbi5nZXRCYWNrZ3JvdW5kKCkpOwotCQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIGZFeHRlbnQueCwgZkV4dGVudC55KTsKLQkJZ2MuZGlzcG9zZSgpOwotCi0JCWZCdXR0b24uc2V0SW1hZ2UoZkltYWdlKTsKLQotCQkvLyBidWcyNTQxIC0gYXNzb2NpYXRlIGNvbG9yIHZhbHVlIHRvIGJ1dHRvbidzIHZhbHVlIGZpZWxkCi0JCWZCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIobmV3IEFjY2Vzc2libGVDb250cm9sQWRhcHRlcigpIHsKLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIjZ2V0VmFsdWUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZ2V0VmFsdWUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQkJaWYgKGUuY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKSB7Ci0JCQkJCWlmIChnZXRDb2xvclZhbHVlKCkgIT0gbnVsbCkKLQkJCQkJCWUucmVzdWx0ID0gZ2V0Q29sb3JWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWUucmVzdWx0ID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbG9yRGlhbG9nIGNvbG9yRGlhbG9nID0gbmV3IENvbG9yRGlhbG9nKGZCdXR0b24uZ2V0U2hlbGwoKSk7Ci0JCQkJY29sb3JEaWFsb2cuc2V0UkdCKGZDb2xvclZhbHVlKTsKLQkJCQlSR0IgbmV3Q29sb3IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKG5ld0NvbG9yICE9IG51bGwpIHsKLQkJCQkJZkNvbG9yVmFsdWUgPSBuZXdDb2xvcjsKLQkJCQkJdXBkYXRlQ29sb3JJbWFnZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkJ1dHRvbi5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCWlmIChmSW1hZ2UgIT0gbnVsbCkgewotCQkJCQlmSW1hZ2UuZGlzcG9zZSgpOwotCQkJCQlmSW1hZ2UgPSBudWxsOwotCQkJCX0KLQkJCQlpZiAoZkNvbG9yICE9IG51bGwpIHsKLQkJCQkJZkNvbG9yLmRpc3Bvc2UoKTsKLQkJCQkJZkNvbG9yID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCBQb2ludCBjb21wdXRlSW1hZ2VTaXplKENvbnRyb2wgd2luZG93KSB7Ci0JCUdDIGdjID0gbmV3IEdDKHdpbmRvdyk7Ci0JCUZvbnQgZiA9IEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldChKRmFjZVJlc291cmNlcy5ERUZBVUxUX0ZPTlQpOwotCQlnYy5zZXRGb250KGYpOwotCQlpbnQgaGVpZ2h0ID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRIZWlnaHQoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQlQb2ludCBwID0gbmV3IFBvaW50KGhlaWdodCAqIDMgLSA2LCBoZWlnaHQpOwotCQlyZXR1cm4gcDsKLQl9Ci0KLQlwdWJsaWMgQnV0dG9uIGdldEJ1dHRvbigpIHsKLQkJcmV0dXJuIGZCdXR0b247Ci0JfQotCi0JcHVibGljIFJHQiBnZXRDb2xvclZhbHVlKCkgewotCQlyZXR1cm4gZkNvbG9yVmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sb3JWYWx1ZShSR0IgcmdiKSB7Ci0JCWZDb2xvclZhbHVlID0gcmdiOwotCQl1cGRhdGVDb2xvckltYWdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29sb3JJbWFnZSgpIHsKLQotCQlEaXNwbGF5IGRpc3BsYXkgPSBmQnV0dG9uLmdldERpc3BsYXkoKTsKLQotCQlHQyBnYyA9IG5ldyBHQyhmSW1hZ2UpOwotCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0JCWdjLmRyYXdSZWN0YW5nbGUoMCwgMiwgZkV4dGVudC54IC0gMSwgZkV4dGVudC55IC0gNCk7Ci0KLQkJaWYgKGZDb2xvciAhPSBudWxsKQotCQkJZkNvbG9yLmRpc3Bvc2UoKTsKLQotCQlmQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgZkNvbG9yVmFsdWUpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGZDb2xvcik7Ci0JCWdjLmZpbGxSZWN0YW5nbGUoMSwgMywgZkV4dGVudC54IC0gMiwgZkV4dGVudC55IC0gNSk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQotCQlmQnV0dG9uLnNldEltYWdlKGZJbWFnZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NvbG9ySGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ29sb3JIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg0ZGE3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ29sb3JIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi1wdWJsaWMgY2xhc3MgQ29sb3JIZWxwZXIgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEJBQ0tHUk9VTkQgPSAiYmFja2dyb3VuZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEJPTEQgPSAiYm9sZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZPUkVHUk9VTkQgPSAiZm9yZWdyb3VuZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5BTUUgPSAibmFtZSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTVFlMRV9TRVBBUkFUT1IgPSAifCI7IC8vJE5PTi1OTFMtMSQgCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE5VTEwgPSAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiBhbiBSR0IgU3RyaW5nIGdpdmVuIHRoZSBpbnQgciwgZywgYiB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb2xvclN0cmluZyhpbnQgciwgaW50IGcsIGludCBiKSB7Ci0JCXJldHVybiAiIyIgKyBnZXRIZXhTdHJpbmcociwgMikgKyBnZXRIZXhTdHJpbmcoZywgMikgKyBnZXRIZXhTdHJpbmcoYiwgMik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRIZXhTdHJpbmcoaW50IHZhbHVlLCBpbnQgbWluV2lkdGgpIHsKLQkJU3RyaW5nIGhleFN0cmluZyA9IEludGVnZXIudG9IZXhTdHJpbmcodmFsdWUpOwotCQlmb3IgKGludCBpID0gaGV4U3RyaW5nLmxlbmd0aCgpOyBpIDwgbWluV2lkdGg7IGkrKykgewotCQkJaGV4U3RyaW5nID0gIjAiICsgaGV4U3RyaW5nOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gaGV4U3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyBhIHByZWZlcmVuY2Ugc3RyaW5nIHRvIGJlIHBsYWNlZCBpbiBwcmVmZXJlbmNlcyBmcm9tIHRoZQotCSAqIGdpdmVuIFN0cmluZyBhcnJheS4KLQkgKiAKLQkgKiBAcGFyYW0gc3R5bGVQcmVmcwotCSAqICAgICAgICAgICAgYXNzdW1lcyBub3QgbnVsbCBhbmQgc2hvdWxkIGJlIGluIHRoZSBmb3JtIG9mIFN0cmluZ1swXSA9Ci0JICogICAgICAgICAgICBGb3JlZ3JvdW5kIFJHQiBTdHJpbmcsIFN0cmluZ1sxXSA9IEJhY2tncm91bmQgUkdCIFN0cmluZywKLQkgKiAgICAgICAgICAgIFN0cmluZ1syXSA9IEJvbGQgdHJ1ZS9mYWxzZQotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIGluIHRoZSBmb3JtIG9mIEZvcmVncm91bmQgUkdCIFN0cmluZyB8IEJhY2tncm91bmQgUkdCCi0JICogICAgICAgICBTdHJpbmcgfCBCb2xkIHRydWUvZmFsc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWNrU3R5bGVQcmVmZXJlbmNlcyhTdHJpbmdbXSBzdHlsZVByZWZzKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHlsZVN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0eWxlUHJlZnMubGVuZ3RoOyArK2kpIHsKLQkJCVN0cmluZyBzID0gc3R5bGVQcmVmc1tpXTsKLQkJCWlmIChpIDwgMikgewotCQkJCWlmIChzICE9IG51bGwpIHsKLQkJCQkJc3R5bGVTdHJpbmcuYXBwZW5kKHMpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3R5bGVTdHJpbmcuYXBwZW5kKE5VTEwpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0eWxlU3RyaW5nLmFwcGVuZChCb29sZWFuLnZhbHVlT2YocykpOwotCQkJfQotCi0JCQkvLyBhZGQgaW4gdGhlIHNlcGFyYXRvciAoZXhjZXB0IG9uIGxhc3QgaXRlcmF0aW9uKQotCQkJaWYgKGkgPCBzdHlsZVByZWZzLmxlbmd0aCAtIDEpIHsKLQkJCQlzdHlsZVN0cmluZy5hcHBlbmQoIiAiICsgU1RZTEVfU0VQQVJBVE9SICsgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3R5bGVTdHJpbmcudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IKLQkgKiBAcGFyYW0gYW5SR0JTdHJpbmcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJHQiB0b1JHQihTdHJpbmcgYW5SR0JTdHJpbmcpIHsKLQkJUkdCIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChhblJHQlN0cmluZy5sZW5ndGgoKSA+IDYgJiYgYW5SR0JTdHJpbmcuY2hhckF0KDApID09ICcjJykgewotCQkJaW50IHIgPSAwOwotCQkJaW50IGcgPSAwOwotCQkJaW50IGIgPSAwOwotCQkJdHJ5IHsKLQkJCQlyID0gSW50ZWdlci52YWx1ZU9mKGFuUkdCU3RyaW5nLnN1YnN0cmluZygxLCAzKSwgMTYpLmludFZhbHVlKCk7Ci0JCQkJZyA9IEludGVnZXIudmFsdWVPZihhblJHQlN0cmluZy5zdWJzdHJpbmcoMywgNSksIDE2KS5pbnRWYWx1ZSgpOwotCQkJCWIgPSBJbnRlZ2VyLnZhbHVlT2YoYW5SR0JTdHJpbmcuc3Vic3RyaW5nKDUsIDcpLCAxNikuaW50VmFsdWUoKTsKLQkJCQlyZXN1bHQgPSBuZXcgUkdCKHIsIGcsIGIpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mRXhjKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQ291bGQgbm90IGxvYWQgaGlnaGxpZ2h0aW5nIHByZWZlcmVuY2UgZm9yIGNvbG9yICIgKyBhblJHQlN0cmluZywgbmZFeGMpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBhblJHQgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvUkdCU3RyaW5nKFJHQiBhblJHQikgewotCQlpZiAoYW5SR0IgPT0gbnVsbCkKLQkJCXJldHVybiAiIzAwMDAwMCI7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcmVkID0gSW50ZWdlci50b0hleFN0cmluZyhhblJHQi5yZWQpOwotCQl3aGlsZSAocmVkLmxlbmd0aCgpIDwgMikKLQkJCXJlZCA9ICIwIiArIHJlZDsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBncmVlbiA9IEludGVnZXIudG9IZXhTdHJpbmcoYW5SR0IuZ3JlZW4pOwotCQl3aGlsZSAoZ3JlZW4ubGVuZ3RoKCkgPCAyKQotCQkJZ3JlZW4gPSAiMCIgKyBncmVlbjsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBibHVlID0gSW50ZWdlci50b0hleFN0cmluZyhhblJHQi5ibHVlKTsKLQkJd2hpbGUgKGJsdWUubGVuZ3RoKCkgPCAyKQotCQkJYmx1ZSA9ICIwIiArIGJsdWU7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gIiMiICsgcmVkICsgZ3JlZW4gKyBibHVlOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBFeHRyYWN0cyB0aGUgZm9yZWdyb3VuZCAoUkdCIFN0cmluZyksIGJhY2tncm91bmQgKFJHQiBTdHJpbmcpLCBib2xkCi0JICogKGJvb2xlYW4gU3RyaW5nKSBmcm9tIHRoZSBnaXZlbiBwcmVmZXJlbmNlIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJlZmVyZW5jZQotCSAqICAgICAgICAgICAgc2hvdWxkIGJlIGluIHRoZSBmb3JtIG9mIEZvcmVncm91bmQgUkdCIFN0cmluZyB8IEJhY2tncm91bmQKLQkgKiAgICAgICAgICAgIFJHQiBTdHJpbmcgfCBCb2xkIHRydWUvZmFsc2UgfCBJdGFsaWMgdHJ1ZS9mYWxzZSB8IFN0cmlrZXRocm91Z2ggdHJ1ZS9mYWxzZSB8IFVuZGVybGluZSB0cnVlL2ZhbHNlCi0JICogQHJldHVybiBTdHJpbmdbXSB3aGVyZSBTdHJpbmdbMF0gPSBGb3JlZ3JvdW5kIFJHQiBTdHJpbmcsIFN0cmluZ1sxXSA9Ci0JICogICAgICAgICBCYWNrZ3JvdW5kIFJHQiBTdHJpbmcsIFN0cmluZ1syXSA9IEJvbGQgdHJ1ZS9mYWxzZSwgMyA9IEl0YWxpYwotCSAqICAgICAgICAgdHJ1ZS9mYWxzZSwgNCA9IFN0cmlrZXRocm91Z2ggdHJ1ZS9mYWxzZSwgNSA9IFVuZGVybGluZQotCSAqICAgICAgICAgdHJ1ZS9mYWxzZTsgaW5kZXhlcyAyLTQgbWF5IGJlIG51bGwgaWYgd2UgcmFuIGludG8gcHJvYmxlbXMKLQkgKiAgICAgICAgIGV4dHJhY3RpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHVucGFja1N0eWxlUHJlZmVyZW5jZXMoU3RyaW5nIHByZWZlcmVuY2UpIHsKLQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IG5ldyBTdHJpbmdbNl07Ci0JCWlmIChwcmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocHJlZmVyZW5jZSwgU1RZTEVfU0VQQVJBVE9SKTsKLQkJCWlmIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgZm9yZWdyb3VuZCA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlzdHlsZVByZWZzWzBdID0gZm9yZWdyb3VuZDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0eWxlUHJlZnNbMF0gPSBOVUxMOwotCQkJfQotCQkJaWYgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBiYWNrZ3JvdW5kID0gc3QubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCXN0eWxlUHJlZnNbMV0gPSBiYWNrZ3JvdW5kOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3R5bGVQcmVmc1sxXSA9IE5VTEw7Ci0JCQl9Ci0KLQkJCWlmIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgYm9sZCA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlzdHlsZVByZWZzWzJdID0gQm9vbGVhbi52YWx1ZU9mKGJvbGQpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdHlsZVByZWZzWzJdID0gQm9vbGVhbi5GQUxTRS50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBpdGFsaWMgPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJc3R5bGVQcmVmc1szXSA9IEJvb2xlYW4udmFsdWVPZihpdGFsaWMpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdHlsZVByZWZzWzNdID0gQm9vbGVhbi5GQUxTRS50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBzdHJpa2V0aHJvdWdoID0gc3QubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCXN0eWxlUHJlZnNbNF0gPSBCb29sZWFuLnZhbHVlT2Yoc3RyaWtldGhyb3VnaCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0eWxlUHJlZnNbNF0gPSBCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlpZiAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIHVuZGVybGluZSA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlzdHlsZVByZWZzWzVdID0gQm9vbGVhbi52YWx1ZU9mKHVuZGVybGluZSkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0eWxlUHJlZnNbNV0gPSBCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3R5bGVQcmVmczsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gbG9va3VwIHRoZSBSR0IgdmFsdWUgZm9yIDxjb2RlPmtleTwvY29kZT4gZnJvbSB0aGUgY29sb3IKLQkgKiByZWdpc3RyeS4gSWYgb25lIGlzIG5vdCBmb3VuZCwgdGhlIDxjb2RlPmRlZmF1bHRSR0I8L2NvZGU+IGlzIHVzZWQuCi0JICogQHBhcmFtIHJlZ2lzdHJ5IFRoZSBDb2xvclJlZ2lzdHJ5IHRvIHNlYXJjaCBmb3IgdGhlIFJHQiB2YWx1ZQotCSAqIEBwYXJhbSBrZXkgVGhlIGtleSB0aGF0IHRoZSBSR0IgdmFsdWUgaXMgc3RvcmVkIHVuZGVyIGluIHRoZSByZWdpc3RyeQotCSAqIEBwYXJhbSBkZWZhdWx0UkdCIFRoZSBkZWZhdWx0IFJHQiB2YWx1ZSB0byByZXR1cm4gaW4gdGhlIGFic2VuY2Ugb2Ygb25lCi0JICogZnJvbSB0aGUgY29sb3IgcmVnaXN0cnkKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBSR0IgdmFsdWUgZnJvbSB0aGUgY29sb3IgcmVnaXN0cnkgZm9yIGEgZ2l2ZW4ga2V5LCBpZiBpdCBleGlzdHMuCi0JICogT3RoZXJ3aXNlLCByZXR1cm4gdGhlIGRlZmF1bHQgUkdCIHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUkdCIGZpbmRSR0IoQ29sb3JSZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIGtleSwgUkdCIGRlZmF1bHRSR0IpIHsKLQkJaWYocmVnaXN0cnkuaGFzVmFsdWVGb3Ioa2V5KSkKLQkJCXJldHVybiByZWdpc3RyeS5nZXRSR0Ioa2V5KTsKLQkJcmV0dXJuIGRlZmF1bHRSR0I7Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHRzIHRvIGZpbmQgdGhlIFJHQiBzdHJpbmcgZm9yIDxjb2RlPmtleTwvY29kZT4gZnJvbSB0aGUgY29sb3IgcmVnaXN0cnkuCi0JICogSWYgb25lIGlzIG5vdCBmb3VuZCwgYW4gUkdCIHN0cmluZyBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGFyYW1ldGVycyA8Y29kZT5yLGcsYjwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHJlZ2lzdHJ5IFRoZSBDb2xvclJlZ2lzdHJ5IHRvIHNlYXJjaCBmb3IgdGhlIFJHQiB2YWx1ZQotCSAqIEBwYXJhbSBrZXkgVGhlIGtleSB0aGF0IHRoZSBSR0IgdmFsdWUgaXMgc3RvcmVkIHVuZGVyIGluIHRoZSByZWdpc3RyeQotCSAqIEBwYXJhbSByIFRoZSBkZWZhdWx0IHJlZCB2YWx1ZQotCSAqIEBwYXJhbSBnIFRoZSBkZWZhdWx0IGdyZWVuIHZhbHVlCi0JICogQHBhcmFtIGIgVGhlIGRlZmF1bHQgYmx1ZSB2YWx1ZQotCSAqIAotCSAqIEByZXR1cm4gVGhlIFN0cmluZyBSR0IgdmFsdWUgZnJvbSB0aGUgY29sb3IgcmVnaXN0cnkgZm9yIGEgZ2l2ZW4ga2V5LCBpZiBpdCBleGlzdHMuCi0JICogT3RoZXJ3aXNlLCByZXR1cm4gdGhlIHN0cmluZyBSR0IgdmFsdWUgY3JlYXRlZCBmcm9tIHRoZSBkZWZhdWx0IHIsZyxiIHBhcmFtZXRlcnMuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmluZFJHQlN0cmluZyhDb2xvclJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcga2V5LCBpbnQgciwgaW50IGcsIGludCBiKSB7Ci0JCWlmKHJlZ2lzdHJ5Lmhhc1ZhbHVlRm9yKGtleSkpCi0JCQlyZXR1cm4gdG9SR0JTdHJpbmcocmVnaXN0cnkuZ2V0UkdCKGtleSkpOwotCQlyZXR1cm4gZ2V0Q29sb3JTdHJpbmcociwgZywgYik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NvbG9yTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9Db2xvck5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMGM5OTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NvbG9yTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDb2xvck5hbWVzIHsKLQlTdHJpbmcgQkFDS0dST1VORCA9ICJiYWNrZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBCT0xEID0gImJvbGQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTE9SID0gImNvbG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIENPTE9SUyA9ICJjb2xvcnMiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZPUkVHUk9VTkQgPSAiZm9yZWdyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSVRBTElDID0gIml0YWxpYyI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBOQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTM2ZTlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQpOwotCi0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IFNTRVVJTWVzc2FnZXMuRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2VfMDsgLy8kTk9OLU5MUy0xJAotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkpOwotCQkvLyBzb21lIHRoZW1lcyBvbiBHVEsgaGF2ZSBkaWZmZXJlbnQgYmFja2dyb3VuZCBjb2xvcnMgZm9yIFRleHQgYW5kIExhYmVscwotCQl0ZXh0LnNldEJhY2tncm91bmQoY29tcG9zaXRlLmdldEJhY2tncm91bmQoKSk7Ci0JCXRleHQuc2V0VGV4dChkZXNjcmlwdGlvbik7Ci0KLQkJc2V0U2l6ZShjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZVNjcm9sbGVkQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIHNjcm9sbGJhcnMgZm9yIHRoaXMgcGFyZW50IHdoZW4gbmVlZGVkCi0JCWZpbmFsIFNjcm9sbGVkQ29tcG9zaXRlIHNjMSA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCXNjMS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZShzYzEsIDEpOwotCQlzYzEuc2V0Q29udGVudChjb21wb3NpdGUpOwotCi0JCS8vIG5vdCBjYWxsaW5nIHNldFNpemUgZm9yIGNvbXBvc2l0ZSB3aWxsIHJlc3VsdCBpbiBhIGJsYW5rIGNvbXBvc2l0ZSwKLQkJLy8gc28gY2FsbGluZyBpdCBoZXJlIGluaXRpYWxseQotCQkvLyBzZXRTaXplIGFjdHVhbGx5IG5lZWRzIHRvIGJlIGNhbGxlZCBhZnRlciBhbGwgY29udHJvbHMgYXJlIGNyZWF0ZWQsCi0JCS8vIHNvIHNjcm9sbGVkQ29tcG9zaXRlCi0JCS8vIGhhcyBjb3JyZWN0IG1pblNpemUKLQkJc2V0U2l6ZShjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2l6ZShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWlmIChjb21wb3NpdGUgIT0gbnVsbCkgewotCQkJLy8gTm90ZTogVGhlIGZvbnQgaXMgc2V0IGhlcmUgaW4gYW50aWNpcGF0aW9uIHRoYXQgdGhlIGNsYXNzIGluaGVyaXRpbmcKLQkJCS8vICAgICAgIHRoaXMgYmFzZSBjbGFzcyBtYXkgYWRkIHdpZGdldHMgdG8gdGhlIGRpYWxvZy4gICBzZXRTaXplCi0JCQkvLyAgICAgICBpcyBhc3N1bWVkIHRvIGJlIGNhbGxlZCBqdXN0IGJlZm9yZSB3ZSBnbyBsaXZlLgotCQkJYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCQlQb2ludCBtaW5TaXplID0gY29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQljb21wb3NpdGUuc2V0U2l6ZShtaW5TaXplKTsKLQkJCS8vIHNldCBzY3JvbGxiYXIgY29tcG9zaXRlJ3MgbWluIHNpemUgc28gcGFnZSBpcyBleHBhbmRhYmxlIGJ1dAotCQkJLy8gaGFzIHNjcm9sbGJhcnMgd2hlbiBuZWVkZWQKLQkJCWlmIChjb21wb3NpdGUuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBTY3JvbGxlZENvbXBvc2l0ZSkgewotCQkJCVNjcm9sbGVkQ29tcG9zaXRlIHNjMSA9IChTY3JvbGxlZENvbXBvc2l0ZSkgY29tcG9zaXRlLmdldFBhcmVudCgpOwotCQkJCXNjMS5zZXRNaW5TaXplKG1pblNpemUpOwotCQkJCXNjMS5zZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotCQkJCXNjMS5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9GaWxlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9GaWxlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4NjUzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvRmlsZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuVGFiRm9sZGVyTGF5b3V0OwotCi1wdWJsaWMgY2xhc3MgRmlsZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVRhYltdIGZUYWJzID0gbnVsbDsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTExfVkVSVElDQUw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLQotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBTU0VVSU1lc3NhZ2VzLkZpbGVQcmVmZXJlbmNlUGFnZV8wOyAvLyROT04tTkxTLTEkCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgZGVzY3JpcHRpb24pOwotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCVRhYkZvbGRlciBmb2xkZXIgPSBuZXcgVGFiRm9sZGVyKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlmb2xkZXIuc2V0TGF5b3V0KG5ldyBUYWJGb2xkZXJMYXlvdXQoKSk7Ci0JCWZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotLy8JCVRhYkl0ZW0gdGFza0l0ZW0gPSBuZXcgVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKLS8vCQlJUHJlZmVyZW5jZVRhYiB0YXNrc1RhYiA9IG5ldyBUYXNrVGFnUHJlZmVyZW5jZVRhYigpOwotLy8JCXRhc2tJdGVtLnNldFRleHQodGFza3NUYWIuZ2V0VGl0bGUoKSk7Ci0vLwkJQ29udHJvbCB0YXNrVGFncyA9IHRhc2tzVGFiLmNyZWF0ZUNvbnRlbnRzKGZvbGRlcik7Ci0vLwkJdGFza0l0ZW0uc2V0Q29udHJvbCh0YXNrVGFncyk7Ci0KLQkJVGFiSXRlbSB0cmFuc2x1Y2VuY2VJdGVtID0gbmV3IFRhYkl0ZW0oZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCUlQcmVmZXJlbmNlVGFiIHRyYW5zbHVjZW5jZVRhYiA9IG5ldyBUcmFuc2x1Y2VuY3lQcmVmZXJlbmNlVGFiKHRoaXMpOwotCQl0cmFuc2x1Y2VuY2VJdGVtLnNldFRleHQodHJhbnNsdWNlbmNlVGFiLmdldFRpdGxlKCkpOwotCQlDb250cm9sIHRyYW5zbHVjZW5jZUNvbnRyb2wgPSB0cmFuc2x1Y2VuY2VUYWIuY3JlYXRlQ29udGVudHMoZm9sZGVyKTsKLQkJdHJhbnNsdWNlbmNlSXRlbS5zZXRDb250cm9sKHRyYW5zbHVjZW5jZUNvbnRyb2wpOwotCi0JCWZUYWJzID0gbmV3IElQcmVmZXJlbmNlVGFiW117Lyp0YXNrc1RhYiwqLyB0cmFuc2x1Y2VuY2VUYWJ9OwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggZGVza3RvcCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtQXBwbHkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1BcHBseSgpIHsKLQkJc3VwZXIucGVyZm9ybUFwcGx5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCWZUYWJzW2ldLnBlcmZvcm1BcHBseSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFicy5sZW5ndGg7IGkrKykgewotCQkJZlRhYnNbaV0ucGVyZm9ybURlZmF1bHRzKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIG9rID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCWZUYWJzW2ldLnBlcmZvcm1PaygpOwotCQl9Ci0JCVNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gb2s7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0lQcmVmZXJlbmNlVGFiLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSVByZWZlcmVuY2VUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjYjU2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSVByZWZlcmVuY2VUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByZWZlcmVuY2VUYWIgewotCi0JQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgdGFiRm9sZGVyKTsKLQotCVN0cmluZyBnZXRUaXRsZSgpOwotCi0Jdm9pZCBwZXJmb3JtQXBwbHkoKTsKLQotCXZvaWQgcGVyZm9ybURlZmF1bHRzKCk7Ci0KLQl2b2lkIHBlcmZvcm1PaygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1Njcm9sbGVkUGFnZUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9TY3JvbGxlZFBhZ2VDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZjljNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1Njcm9sbGVkUGFnZUNvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNoYXJlZFNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBTY3JvbGxlZFBhZ2VDb250ZW50IGV4dGVuZHMgU2hhcmVkU2Nyb2xsZWRDb21wb3NpdGUgewotCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCBmVG9vbGtpdDsKLQkKLQlwdWJsaWMgU2Nyb2xsZWRQYWdlQ29udGVudChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMocGFyZW50LCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCX0KLQkKLQlwdWJsaWMgU2Nyb2xsZWRQYWdlQ29udGVudChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCQotCQlzZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotCQlzZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQkJCi0JCWZUb29sa2l0ID0gU1NFVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXREaWFsb2dzRm9ybVRvb2xraXQoKTsKLQkJCi0JCUNvbXBvc2l0ZSBib2R5PSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLQkJYm9keS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQlzZXRDb250ZW50KGJvZHkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGFwdENoaWxkKENvbnRyb2wgY2hpbGRDb250cm9sKSB7Ci0JCWZUb29sa2l0LmFkYXB0KGNoaWxkQ29udHJvbCwgdHJ1ZSwgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBDb21wb3NpdGUgZ2V0Qm9keSgpIHsKLQkJcmV0dXJuIChDb21wb3NpdGUpIGdldENvbnRlbnQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9TdGF0dXNJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvU3RhdHVzSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzgzMTMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9TdGF0dXNJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuRWRpdG9yc1VJOwotCi0vKioKLSAqIEEgc2V0dGFibGUgSVN0YXR1cy4gQ2FuIGJlIGFuIGVycm9yLCB3YXJuaW5nLCBpbmZvIG9yIG9rLiBGb3IgZXJyb3IsIGluZm8KLSAqIGFuZCB3YXJuaW5nIHN0YXRlcywgYSBtZXNzYWdlIGRlc2NyaWJlcyB0aGUgcHJvYmxlbS4KLSAqIAotICogVGhpcyBjbGFzcyB3YXMgY29waWVkIGZyb20gb3RoZXIgU3RhdHVzSW5mbyBjbGFzc2VzIHRoYXQgYXJlIGxvY2F0ZWQgaW4KLSAqIGludGVybmFsIHBhY2thZ2VzCi0gKi8KLWNsYXNzIFN0YXR1c0luZm8gaW1wbGVtZW50cyBJU3RhdHVzIHsKLQkvKiogVGhlIHNldmVyaXR5IG9mIHRoaXMgc3RhdHVzLiAqLwotCXByaXZhdGUgaW50IGZTZXZlcml0eTsKLQotCS8qKiBUaGUgbWVzc2FnZSBvZiB0aGlzIHN0YXR1cy4gKi8KLQlwcml2YXRlIFN0cmluZyBmU3RhdHVzTWVzc2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzdGF0dXMgc2V0IHRvIE9LIChubyBtZXNzYWdlKS4KLQkgKi8KLQlwdWJsaWMgU3RhdHVzSW5mbygpIHsKLQkJdGhpcyhPSywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHN0YXR1cyB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSBhbmQgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2V2ZXJpdHkKLQkgKiAgICAgICAgICAgIHRoZSBzZXZlcml0eSBvZiB0aGlzIHN0YXR1czogRVJST1IsIFdBUk5JTkcsIElORk8gYW5kIE9LLgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSBvZiB0aGlzIHN0YXR1cy4gQXBwbGllcyBvbmx5IGZvciBFUlJPUiwgV0FSTklORwotCSAqICAgICAgICAgICAgYW5kIElORk8uCi0JICovCi0JcHVibGljIFN0YXR1c0luZm8oaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlmU3RhdHVzTWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCWZTZXZlcml0eSA9IHNldmVyaXR5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWx3YXlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBzZWUgSVN0YXR1cyNnZXRDaGlsZHJlbigpCi0JICovCi0JcHVibGljIElTdGF0dXNbXSBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBJU3RhdHVzWzBdOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWx3YXlzIHRoZSBlcnJvciBzZXZlcml0eS4KLQkgKiAKLQkgKiBAc2VlIElTdGF0dXMjZ2V0Q29kZSgpCi0JICovCi0JcHVibGljIGludCBnZXRDb2RlKCkgewotCQlyZXR1cm4gZlNldmVyaXR5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWx3YXlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBzZWUgSVN0YXR1cyNnZXRFeGNlcHRpb24oKQotCSAqLwotCXB1YmxpYyBUaHJvd2FibGUgZ2V0RXhjZXB0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVN0YXR1cyNnZXRNZXNzYWdlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBmU3RhdHVzTWVzc2FnZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVN0YXR1cyNnZXRQbHVnaW4oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gRWRpdG9yc1VJLlBMVUdJTl9JRDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVN0YXR1cyNnZXRTZXZlcml0eSgpCi0JICovCi0JcHVibGljIGludCBnZXRTZXZlcml0eSgpIHsKLQkJcmV0dXJuIGZTZXZlcml0eTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzdGF0dXMgaW5kaWNhdGVzIGFuIGVycm9yLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzdGF0dXMgaGFzIHNldmVyaXR5Ci0JICogICAgICAgICB7QGxpbmsgSVN0YXR1cyNFUlJPUn1hbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXJyb3IoKSB7Ci0JCXJldHVybiBmU2V2ZXJpdHkgPT0gSVN0YXR1cy5FUlJPUjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzdGF0dXMgaW5kaWNhdGVzIGFuIGluZm8uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHN0YXR1cyBoYXMgc2V2ZXJpdHkKLQkgKiAgICAgICAgIHtAbGluayBJU3RhdHVzI0lORk99YW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0luZm8oKSB7Ci0JCXJldHVybiBmU2V2ZXJpdHkgPT0gSVN0YXR1cy5JTkZPOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWx3YXlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiAKLQkgKiBAc2VlIElTdGF0dXMjaXNNdWx0aVN0YXR1cygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNdWx0aVN0YXR1cygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNpc09LKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09LKCkgewotCQlyZXR1cm4gZlNldmVyaXR5ID09IElTdGF0dXMuT0s7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc3RhdHVzIGluZGljYXRlcyBhIHdhcm5pbmcuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHN0YXR1cyBoYXMgc2V2ZXJpdHkKLQkgKiAgICAgICAgIHtAbGluayBJU3RhdHVzI1dBUk5JTkd9YW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dhcm5pbmcoKSB7Ci0JCXJldHVybiBmU2V2ZXJpdHkgPT0gSVN0YXR1cy5XQVJOSU5HOwotCX0KLQotCS8qCi0JICogQHNlZSBJU3RhdHVzI21hdGNoZXMoaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoaW50IHNldmVyaXR5TWFzaykgewotCQlyZXR1cm4gKGZTZXZlcml0eSAmIHNldmVyaXR5TWFzaykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0dXMgdG8gRVJST1IuCi0JICogCi0JICogQHBhcmFtIGVycm9yTWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2Ugd2hpY2ggY2FuIGJlIGFuIGVtcHR5IHN0cmluZywgYnV0IG5vdAotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFcnJvcihTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoZXJyb3JNZXNzYWdlKTsKLQkJZlN0YXR1c01lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7Ci0JCWZTZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdHVzIHRvIElORk8uCi0JICogCi0JICogQHBhcmFtIGluZm9NZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgaW5mbyBtZXNzYWdlIHdoaWNoIGNhbiBiZSBhbiBlbXB0eSBzdHJpbmcsIGJ1dCBub3QKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SW5mbyhTdHJpbmcgaW5mb01lc3NhZ2UpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpbmZvTWVzc2FnZSk7Ci0JCWZTdGF0dXNNZXNzYWdlID0gaW5mb01lc3NhZ2U7Ci0JCWZTZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0dXMgdG8gT0suCi0JICovCi0JcHVibGljIHZvaWQgc2V0T0soKSB7Ci0JCWZTdGF0dXNNZXNzYWdlID0gbnVsbDsKLQkJZlNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0dXMgdG8gV0FSTklORy4KLQkgKiAKLQkgKiBAcGFyYW0gd2FybmluZ01lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSB3YXJuaW5nIG1lc3NhZ2Ugd2hpY2ggY2FuIGJlIGFuIGVtcHR5IHN0cmluZywgYnV0IG5vdAotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXYXJuaW5nKFN0cmluZyB3YXJuaW5nTWVzc2FnZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKHdhcm5pbmdNZXNzYWdlKTsKLQkJZlN0YXR1c01lc3NhZ2UgPSB3YXJuaW5nTWVzc2FnZTsKLQkJZlNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1N0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MGVlMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1N0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZUxpbmtBcmVhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VzLklXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkVkaXRvclByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5UYWJGb2xkZXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLklTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnByZWZlcmVuY2VzLkNvbW1vbkVkaXRvclByZWZlcmVuY2VOYW1lczsKLQotLyoqCi0gKiBHdXR0ZWQgdmVyc2lvbiBvZiBKYXZhRWRpdG9yUHJlZmVyZW5jZVBhZ2UKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0JcHJpdmF0ZSBDb2xvckVkaXRvciBmQXBwZWFyYW5jZUNvbG9yRWRpdG9yOwotCXByaXZhdGUgTGlzdCBmQXBwZWFyYW5jZUNvbG9yTGlzdDsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nW11bXSBmQXBwZWFyYW5jZUNvbG9yTGlzdE1vZGVsID0gbmV3IFN0cmluZ1tdW117e1NTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8yLCBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuTUFUQ0hJTkdfQlJBQ0tFVFNfQ09MT1J9LCB7U1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzQxLCBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9QUk9QT1NBTFNfQkFDS0dST1VORH0sIHtTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfNDIsIEVkaXRvclByZWZlcmVuY2VOYW1lcy5DT0RFQVNTSVNUX1BST1BPU0FMU19GT1JFR1JPVU5EfSwge1NTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV80MywgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkNPREVBU1NJU1RfUEFSQU1FVEVSU19CQUNLR1JPVU5EfSwge1NTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV80NCwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkNPREVBU1NJU1RfUEFSQU1FVEVSU19GT1JFR1JPVU5EfX07IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIE1hcCBmQ2hlY2tCb3hlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBmQ2hlY2tCb3hMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBlLndpZGdldDsKLQkJCWZPdmVybGF5U3RvcmUuc2V0VmFsdWUoKFN0cmluZykgZkNoZWNrQm94ZXMuZ2V0KGJ1dHRvbiksIGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBNYXAgZkNvbG9yQnV0dG9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBmTnVtYmVyRmllbGRzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBmT3ZlcmxheVN0b3JlOwotCS8qKiBCdXR0b24gY29udHJvbGxpbmcgZGVmYXVsdCBzZXR0aW5nIG9mIHRoZSBzZWxlY3RlZCByZWZlcmVuY2UgcHJvdmlkZXIuICovCi0JLy8gVE9ETzogcHJpdmF0ZSBmaWVsZCBuZXZlciByZWFkIGxvY2FsbHkKLQlCdXR0b24gZlNldERlZmF1bHRCdXR0b247Ci0JcHJpdmF0ZSBJUHJlZmVyZW5jZVRhYltdIGZUYWJzID0gbnVsbDsKLQlwcml2YXRlIE1hcCBmVGV4dEZpZWxkcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc2V0RGVzY3JpcHRpb24oU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzYpOyAvLyROT04tTkxTLTEkCi0JCXNldFByZWZlcmVuY2VTdG9yZShTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCi0JCWZPdmVybGF5U3RvcmUgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZShnZXRQcmVmZXJlbmNlU3RvcmUoKSwgY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpKTsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbiBhZGRDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIFN0cmluZyBrZXksIGludCBpbmRlbnRhdGlvbikgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCb3guc2V0VGV4dChsYWJlbCk7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlnZC5ob3Jpem9udGFsSW5kZW50ID0gaW5kZW50YXRpb247Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJY2hlY2tCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWNoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGZDaGVja0JveExpc3RlbmVyKTsKLQotCQlmQ2hlY2tCb3hlcy5wdXQoY2hlY2tCb3gsIGtleSk7Ci0KLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCS8qKgotCSAqIEFwcGxpZXMgdGhlIHN0YXR1cyB0byB0aGUgc3RhdHVzIGxpbmUgb2YgYSBkaWFsb2cgcGFnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseVRvU3RhdHVzTGluZShEaWFsb2dQYWdlIHBhZ2UsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJc3dpdGNoIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSkgewotCQkJY2FzZSBJU3RhdHVzLk9LIDoKLQkJCQlwYWdlLnNldE1lc3NhZ2UobWVzc2FnZSwgSU1lc3NhZ2VQcm92aWRlci5OT05FKTsKLQkJCQlwYWdlLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVN0YXR1cy5XQVJOSU5HIDoKLQkJCQlwYWdlLnNldE1lc3NhZ2UobWVzc2FnZSwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLQkJCQlwYWdlLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVN0YXR1cy5JTkZPIDoKLQkJCQlwYWdlLnNldE1lc3NhZ2UobWVzc2FnZSwgSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTik7Ci0JCQkJcGFnZS5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlpZiAobWVzc2FnZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCW1lc3NhZ2UgPSBudWxsOwotCQkJCX0KLQkJCQlwYWdlLnNldE1lc3NhZ2UobnVsbCk7Ci0JCQkJcGFnZS5zZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgY3JlYXRlQXBwZWFyYW5jZVBhZ2UoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgYXBwZWFyYW5jZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlhcHBlYXJhbmNlQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCVN0cmluZyBsYWJlbCA9IFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8yMDsgLy8kTk9OLU5MUy0xJAotCQlhZGRDaGVja0JveChhcHBlYXJhbmNlQ29tcG9zaXRlLCBsYWJlbCwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLk1BVENISU5HX0JSQUNLRVRTLCAwKTsKLQotCQlsYWJlbCA9IFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zMDsgLy8kTk9OLU5MUy0xJAotCQlhZGRDaGVja0JveChhcHBlYXJhbmNlQ29tcG9zaXRlLCBsYWJlbCwgQ29tbW9uRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkVWQUxVQVRFX1RFTVBPUkFSWV9QUk9CTEVNUywgMCk7Ci0KLQkJUHJlZmVyZW5jZUxpbmtBcmVhIGNvbnRlbnRUeXBlQXJlYSA9IG5ldyBQcmVmZXJlbmNlTGlua0FyZWEoYXBwZWFyYW5jZUNvbXBvc2l0ZSwgU1dULk5PTkUsICJWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UiLCBTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfNDAsIChJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcikgZ2V0Q29udGFpbmVyKCksIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAyMDsKLQkJY29udGVudFR5cGVBcmVhLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWxhYmVsID0gU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM5OwotCQlhZGRDaGVja0JveChhcHBlYXJhbmNlQ29tcG9zaXRlLCBsYWJlbCwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLlNIT1dfVU5LTk9XTl9DT05URU5UX1RZUEVfTVNHLCAwKTsKLQotCQlsYWJlbCA9IFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zOwotCQlhZGRDaGVja0JveChhcHBlYXJhbmNlQ29tcG9zaXRlLCBsYWJlbCwgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyLkZPTERJTkdfRU5BQkxFRCwgMCk7Ci0KLQkJTGFiZWwgbCA9IG5ldyBMYWJlbChhcHBlYXJhbmNlQ29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2QuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoMSkgLyAyOwotCQlsLnNldExheW91dERhdGEoZ2QpOwotCi0JCWwgPSBuZXcgTGFiZWwoYXBwZWFyYW5jZUNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzIzKTsgLy8kTk9OLU5MUy0xJAotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJQ29tcG9zaXRlIGVkaXRvckNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoYXBwZWFyYW5jZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQllZGl0b3JDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWVkaXRvckNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlmQXBwZWFyYW5jZUNvbG9yTGlzdCA9IG5ldyBMaXN0KGVkaXRvckNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg3KTsKLQkJZkFwcGVhcmFuY2VDb2xvckxpc3Quc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJQ29tcG9zaXRlIHN0eWxlc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZWRpdG9yQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXN0eWxlc0NvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc3R5bGVzQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCWwgPSBuZXcgTGFiZWwoc3R5bGVzQ29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCS8vIG5lZWRzIHRvIGJlIG1hZGUgZmluYWwgc28gbGFiZWwgY2FuIGJlIHNldCBpbgotCQkvLyBmb3JlZ3JvdW5kY29sb3JidXR0b24ncyBhY2MgbGlzdGVuZXIKLQkJZmluYWwgU3RyaW5nIGJ1dHRvbkxhYmVsID0gU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzI0OyAvLyROT04tTkxTLTEkIAotCQlsLnNldFRleHQoYnV0dG9uTGFiZWwpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlsLnNldExheW91dERhdGEoZ2QpOwotCi0JCWZBcHBlYXJhbmNlQ29sb3JFZGl0b3IgPSBuZXcgQ29sb3JFZGl0b3Ioc3R5bGVzQ29tcG9zaXRlKTsKLQkJQnV0dG9uIGZvcmVncm91bmRDb2xvckJ1dHRvbiA9IGZBcHBlYXJhbmNlQ29sb3JFZGl0b3IuZ2V0QnV0dG9uKCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWZvcmVncm91bmRDb2xvckJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlmQXBwZWFyYW5jZUNvbG9yTGlzdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUFwcGVhcmFuY2VDb2xvckxpc3RTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0JCWZvcmVncm91bmRDb2xvckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWludCBpID0gZkFwcGVhcmFuY2VDb2xvckxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlTdHJpbmcga2V5ID0gZkFwcGVhcmFuY2VDb2xvckxpc3RNb2RlbFtpXVsxXTsKLQotCQkJCVByZWZlcmVuY2VDb252ZXJ0ZXIuc2V0VmFsdWUoZk92ZXJsYXlTdG9yZSwga2V5LCBmQXBwZWFyYW5jZUNvbG9yRWRpdG9yLmdldENvbG9yVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGJ1ZzI1NDEgLSBhc3NvY2lhdGUgY29sb3IgbGFiZWwgdG8gYnV0dG9uJ3MgbGFiZWwgZmllbGQKLQkJZm9yZWdyb3VuZENvbG9yQnV0dG9uLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCWlmIChlLmNoaWxkSUQgPT0gQUNDLkNISUxESURfU0VMRikKLQkJCQkJZS5yZXN1bHQgPSBidXR0b25MYWJlbDsKLQkJCX0KLQkJfSk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChhcHBlYXJhbmNlQ29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuUFJFRlNURV9BUFBFQVJBTkNFX0hFTFBJRCk7Ci0JCXJldHVybiBhcHBlYXJhbmNlQ29tcG9zaXRlOwotCX0KLQotCS8qCi0JICogQHNlZSBQcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhDb21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBuZWVkIHRvIGNyZWF0ZSB0YWJzIGJlZm9yZSBsb2FkaW5nL3N0YXJ0aW5nIG92ZXJsYXlzdG9yZSBpbiBjYXNlCi0JCS8vIHRhYnMgYWxzbyBhZGQgdmFsdWVzCi0JCUlQcmVmZXJlbmNlVGFiIGhvdmVyc1RhYiA9IG5ldyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiKHRoaXMsIGZPdmVybGF5U3RvcmUpOwotCi0JCWZPdmVybGF5U3RvcmUubG9hZCgpOwotCQlmT3ZlcmxheVN0b3JlLnN0YXJ0KCk7Ci0KLQkJVGFiRm9sZGVyIGZvbGRlciA9IG5ldyBUYWJGb2xkZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWZvbGRlci5zZXRMYXlvdXQobmV3IFRhYkZvbGRlckxheW91dCgpKTsKLQkJZm9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtKGZvbGRlciwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzApOyAvLyROT04tTkxTLTEkCi0JCWl0ZW0uc2V0Q29udHJvbChjcmVhdGVBcHBlYXJhbmNlUGFnZShmb2xkZXIpKTsKLQotCQlpdGVtID0gbmV3IFRhYkl0ZW0oZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChob3ZlcnNUYWIuZ2V0VGl0bGUoKSk7Ci0JCWl0ZW0uc2V0Q29udHJvbChob3ZlcnNUYWIuY3JlYXRlQ29udGVudHMoZm9sZGVyKSk7Ci0KLQkJZlRhYnMgPSBuZXcgSVByZWZlcmVuY2VUYWJbXXtob3ZlcnNUYWJ9OwotCi0JCWluaXRpYWxpemUoKTsKLQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGZvbGRlcik7Ci0JCXJldHVybiBmb2xkZXI7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCS8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscChnZXRDb250cm9sKCksCi0JCS8vIElKYXZhSGVscENvbnRleHRJZHMuSkFWQV9FRElUT1JfUFJFRkVSRU5DRV9QQUdFKTsKLQl9Ci0KLQlwcml2YXRlIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGNyZWF0ZU92ZXJsYXlTdG9yZUtleXMoKSB7Ci0JCUFycmF5TGlzdCBvdmVybGF5S2V5cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLk1BVENISU5HX0JSQUNLRVRTX0NPTE9SKSk7Ci0JCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuQk9PTEVBTiwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLk1BVENISU5HX0JSQUNLRVRTKSk7Ci0KLQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5CT09MRUFOLCBDb21tb25FZGl0b3JQcmVmZXJlbmNlTmFtZXMuRVZBTFVBVEVfVEVNUE9SQVJZX1BST0JMRU1TKSk7Ci0JCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuQk9PTEVBTiwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLlNIT1dfVU5LTk9XTl9DT05URU5UX1RZUEVfTVNHKSk7Ci0KLQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5CT09MRUFOLCBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIuRk9MRElOR19FTkFCTEVEKSk7Ci0JCQotCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkNPREVBU1NJU1RfUFJPUE9TQUxTX0JBQ0tHUk9VTkQpKTsKLQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5TVFJJTkcsIEVkaXRvclByZWZlcmVuY2VOYW1lcy5DT0RFQVNTSVNUX1BST1BPU0FMU19GT1JFR1JPVU5EKSk7Ci0JCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuU1RSSU5HLCBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuQ09ERUFTU0lTVF9QQVJBTUVURVJTX0JBQ0tHUk9VTkQpKTsKLQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5TVFJJTkcsIEVkaXRvclByZWZlcmVuY2VOYW1lcy5DT0RFQVNTSVNUX1BBUkFNRVRFUlNfRk9SRUdST1VORCkpOwotCi0JCU92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGtleXMgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W292ZXJsYXlLZXlzLnNpemUoKV07Ci0JCW92ZXJsYXlLZXlzLnRvQXJyYXkoa2V5cyk7Ci0JCXJldHVybiBrZXlzOwotCX0KLQotCS8qCi0JICogQHNlZSBEaWFsb2dQYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChmT3ZlcmxheVN0b3JlICE9IG51bGwpIHsKLQkJCWZPdmVybGF5U3RvcmUuc3RvcCgpOwotCQkJZk92ZXJsYXlTdG9yZSA9IG51bGw7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUFwcGVhcmFuY2VDb2xvckxpc3RTZWxlY3Rpb24oKSB7Ci0JCWludCBpID0gZkFwcGVhcmFuY2VDb2xvckxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJU3RyaW5nIGtleSA9IGZBcHBlYXJhbmNlQ29sb3JMaXN0TW9kZWxbaV1bMV07Ci0JCVJHQiByZ2IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGZPdmVybGF5U3RvcmUsIGtleSk7Ci0JCWZBcHBlYXJhbmNlQ29sb3JFZGl0b3Iuc2V0Q29sb3JWYWx1ZShyZ2IpOwotCX0KLQotCS8qCi0JICogQHNlZSBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdCgpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWluaXRpYWxpemVGaWVsZHMoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZBcHBlYXJhbmNlQ29sb3JMaXN0TW9kZWwubGVuZ3RoOyBpKyspCi0JCQlmQXBwZWFyYW5jZUNvbG9yTGlzdC5hZGQoZkFwcGVhcmFuY2VDb2xvckxpc3RNb2RlbFtpXVswXSk7Ci0JCWZBcHBlYXJhbmNlQ29sb3JMaXN0LmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmIChmQXBwZWFyYW5jZUNvbG9yTGlzdCAhPSBudWxsICYmICFmQXBwZWFyYW5jZUNvbG9yTGlzdC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJZkFwcGVhcmFuY2VDb2xvckxpc3Quc2VsZWN0KDApOwotCQkJCQloYW5kbGVBcHBlYXJhbmNlQ29sb3JMaXN0U2VsZWN0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUZpZWxkcygpIHsKLQkJSXRlcmF0b3IgZSA9IGZDb2xvckJ1dHRvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlDb2xvckVkaXRvciBjID0gKENvbG9yRWRpdG9yKSBlLm5leHQoKTsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBmQ29sb3JCdXR0b25zLmdldChjKTsKLQkJCVJHQiByZ2IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGZPdmVybGF5U3RvcmUsIGtleSk7Ci0JCQljLnNldENvbG9yVmFsdWUocmdiKTsKLQkJfQotCi0JCWUgPSBmQ2hlY2tCb3hlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUJ1dHRvbiBiID0gKEJ1dHRvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZkNoZWNrQm94ZXMuZ2V0KGIpOwotCQkJYi5zZXRTZWxlY3Rpb24oZk92ZXJsYXlTdG9yZS5nZXRCb29sZWFuKGtleSkpOwotCQl9Ci0KLQkJZSA9IGZUZXh0RmllbGRzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJVGV4dCB0ID0gKFRleHQpIGUubmV4dCgpOwotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGZUZXh0RmllbGRzLmdldCh0KTsKLQkJCXQuc2V0VGV4dChmT3ZlcmxheVN0b3JlLmdldFN0cmluZyhrZXkpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtQXBwbHkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1BcHBseSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFicy5sZW5ndGg7IGkrKykgewotCQkJZlRhYnNbaV0ucGVyZm9ybUFwcGx5KCk7Ci0JCX0KLQkJc3VwZXIucGVyZm9ybUFwcGx5KCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlmT3ZlcmxheVN0b3JlLmxvYWREZWZhdWx0cygpOwotCi0JCWluaXRpYWxpemVGaWVsZHMoKTsKLQotCQloYW5kbGVBcHBlYXJhbmNlQ29sb3JMaXN0U2VsZWN0aW9uKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFicy5sZW5ndGg7IGkrKykgewotCQkJZlRhYnNbaV0ucGVyZm9ybURlZmF1bHRzKCk7Ci0JCX0KLQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQotCQkvLyB0aGVyZSBpcyBjdXJyZW50bHkgbm8gbmVlZCBmb3IgYSB2aWV3ZXIKLQkJLy8gZlByZXZpZXdWaWV3ZXIuaW52YWxpZGF0ZVRleHRQcmVzZW50YXRpb24oKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCWZUYWJzW2ldLnBlcmZvcm1PaygpOwotCQl9Ci0KLQkJZk92ZXJsYXlTdG9yZS5wcm9wYWdhdGUoKTsKLQkJU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCS8vIHRhYiB3aWR0aCBpcyBhbHNvIGEgbW9kZWwtc2lkZSBwcmVmZXJlbmNlIHNvIG5lZWQgdG8gc2V0IGl0Ci0JCS8vIFRPRE8gbmVlZCB0byBoYW5kbGUgdGFiIHdpZHRoIGZvciBmb3JtYXR0ZXIgc29tZWhvdwotCQkvLyBpbnQgdGFiV2lkdGggPQotCQkvLyBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRJbnQoQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfVEFCX1dJRFRIKTsKLQkJLy8gTW9kZWxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVEFCX1dJRFRILAotCQkvLyB0YWJXaWR0aCk7Ci0JCS8vIE1vZGVsUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQl2b2lkIHVwZGF0ZVN0YXR1cyhJU3RhdHVzIHN0YXR1cykgewotCQlpZiAoIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZOdW1iZXJGaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgZk51bWJlckZpZWxkcy5nZXQoaSk7Ci0JCQkJSVN0YXR1cyBzID0gdmFsaWRhdGVQb3NpdGl2ZU51bWJlcih0ZXh0LmdldFRleHQoKSk7Ci0JCQkJc3RhdHVzID0gcy5nZXRTZXZlcml0eSgpID4gc3RhdHVzLmdldFNldmVyaXR5KCkgPyBzIDogc3RhdHVzOwotCQkJfQotCQl9Ci0KLQkJc2V0VmFsaWQoIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKTsKLQkJYXBwbHlUb1N0YXR1c0xpbmUodGhpcywgc3RhdHVzKTsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVQb3NpdGl2ZU51bWJlcihTdHJpbmcgbnVtYmVyKSB7Ci0JCVN0YXR1c0luZm8gc3RhdHVzID0gbmV3IFN0YXR1c0luZm8oKTsKLQkJaWYgKG51bWJlci5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlzdGF0dXMuc2V0RXJyb3IoU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM3KTsKLQkJfQotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJaW50IHZhbHVlID0gSW50ZWdlci5wYXJzZUludChudW1iZXIpOwotCQkJCWlmICh2YWx1ZSA8IDApCi0JCQkJCXN0YXR1cy5zZXRFcnJvcihudW1iZXIgKyBTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMzgpOwotCQkJfQotCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJc3RhdHVzLnNldEVycm9yKG51bWJlciArIFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zOCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvU3R5bGVkVGV4dENvbG9yUGlja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvU3R5bGVkVGV4dENvbG9yUGlja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWJmMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1N0eWxlZFRleHRDb2xvclBpY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkNvbG9yU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgY29uZmlndXJhYmxlIGJ5IHNldHRpbmcgMyBwcm9wZXJ0aWVzOiAxKSBhbiBhcnJheSBvZiBTdHJpbmdzCi0gKiBhcyB0aGUgc3R5bGVOYW1lczsgb25lIHVuaXF1ZSBlbnRyeSBmb3IgZXZlcnkgc3R5bGUgdHlwZSBtZWFudCB0byBiZQotICogY29uZmlndXJhYmxlIGJ5IHRoZSB1c2VyIDIpIGEgRGljdGlvbmFyeSBvZiBkZXNjcmlwdGlvbnMsIG1hcHBpbmcgdGhlCi0gKiBzdHlsZU5hbWVzIHRvIHVuaXF1ZSBkZXNjcmlwdGlvbnMgLSBtZWFudCBmb3IgdXNlIHdpdGhpbiB0aGUgc2VsZWN0aW9uCi0gKiBDb21ib0JveCBUT0RPIChwYSkgdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgd29ya2luZyBvZmYgZG9jdW1lbnQgcGFydGl0aW9ucwotICogbm93ICgyLjErKSAzKSBhIERpY3Rpb25hcnkgbWFwcGluZyBwYXJzZWQgSVRleHRSZWdpb24gY29udGV4dHMgKHN0cmluZ3MpIHRvCi0gKiB0aGUgbG9jYWxseSBkZWZpbmVkIHN0eWxlTmFtZXMKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFN0eWxlZFRleHRDb2xvclBpY2tlciBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIGNsYXNzIERlc2NyaXB0aW9uU29ydGVyIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLlNvcnRlciB7Ci0JCUNvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQotCQlwdWJsaWMgYm9vbGVhbiBjb21wYXJlKE9iamVjdCBlbGVtZW50T25lLCBPYmplY3QgZWxlbWVudFR3bykgewotCQkJLyoqCi0JCQkgKiBSZXR1cm5zIHRydWUgaWYgZWxlbWVudFR3byBpcyAnZ3JlYXRlciB0aGFuJyBlbGVtZW50T25lIFRoaXMgaXMKLQkJCSAqIHRoZSAnb3JkZXJpbmcnIG1ldGhvZCBvZiB0aGUgc29ydCBvcGVyYXRpb24uIEVhY2ggc3ViY2xhc3MKLQkJCSAqIG92ZXJpZGVzIHRoaXMgbWV0aG9kIHdpdGggdGhlIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0JCQkgKiAnZ3JlYXRlciB0aGFuJyBjb25jZXB0IGZvciB0aGUgb2JqZWN0cyBiZWluZyBzb3J0ZWQuCi0JCQkgKi8KLQkJCXJldHVybiAoY29sbGF0b3IuY29tcGFyZShlbGVtZW50T25lLnRvU3RyaW5nKCksIGVsZW1lbnRUd28udG9TdHJpbmcoKSkpIDwgMDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tHUk9VTkQgPSAiYmFja2dyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0xEID0gImJvbGQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1IgPSAiY29sb3IiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBuYW1lcyBmb3IgcHJlZmVyZW5jZSBlbGVtZW50cyAuLi4gbm9uLU5MUwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkVHUk9VTkQgPSAiZm9yZWdyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVEFMSUMgPSAiaXRhbGljIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBzaG93SXRhbGljID0gZmFsc2U7Ci0JcHJvdGVjdGVkIEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIgYmFja2dyb3VuZEFjY0xpc3RlbmVyID0gbmV3IEFjY2Vzc2libGVDb250cm9sQWRhcHRlcigpIHsKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyI2dldFZhbHVlKEFjY2Vzc2libGVDb250cm9sRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBnZXRWYWx1ZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLQkJCWlmIChlLmNoaWxkSUQgPT0gQUNDLkNISUxESURfU0VMRikgewotCQkJCWUucmVzdWx0ID0gZkJhY2tncm91bmQuZ2V0Q29sb3JWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQl9OwotCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBidXR0b25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTdHJpbmcgbmFtZWRTdHlsZSA9IGdldFN0eWxlTmFtZShmU3R5bGVDb21iby5nZXRJdGVtKGZTdHlsZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpKTsKLQkJCWlmIChuYW1lZFN0eWxlID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJaWYgKGUud2lkZ2V0ID09IGZCb2xkKSB7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMl07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZCb2xkLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzJdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHNob3dJdGFsaWMgJiYgZS53aWRnZXQgPT0gZkl0YWxpYykgewotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzNdOwotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBTdHJpbmcudmFsdWVPZihmSXRhbGljLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzNdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IGZDbGVhclN0eWxlKSB7Ci0JCQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VG9EZWZhdWx0KG5hbWVkU3R5bGUpOwotCQkJCXJlZnJlc2goKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0aW9uTGlzdGVuZXIgY29tYm9MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpbnQgc2VsZWN0ZWRJbmRleCA9IGZTdHlsZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBzZWxlY3RlZEluZGV4ID49IDAgPyBmU3R5bGVDb21iby5nZXRJdGVtKHNlbGVjdGVkSW5kZXgpIDogbnVsbDsKLQkJCWFjdGl2YXRlKGdldFN0eWxlTmFtZShkZXNjcmlwdGlvbikpOwotCQl9Ci0JfTsKLQlwcm90ZWN0ZWQgQ29sb3JTZWxlY3RvciBmQmFja2dyb3VuZDsKLQlwcm90ZWN0ZWQgTGFiZWwgZkJhY2tncm91bmRMYWJlbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZCb2xkOwotCXByb3RlY3RlZCBCdXR0b24gZkNsZWFyU3R5bGU7Ci0JLy8gRGljdGlvbmFyeSBtYXBwaW5nIHRoZSBJVGV4dFJlZ2lvbiB0eXBlcyBhYm92ZSB0byBjb2xvciBuYW1lcywgd2hpY2gKLQkvLyBhcmUsIGluIHR1cm4sIGF0dHJpYnV0ZXMKLQlwcm90ZWN0ZWQgRGljdGlvbmFyeSBmQ29udGV4dFN0eWxlTWFwID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ29sb3IgZkRlZmF1bHRCYWNrZ3JvdW5kID0gZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpOwotCi0JcHJvdGVjdGVkIENvbG9yIGZEZWZhdWx0Rm9yZWdyb3VuZCA9IGdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKTsKLQkvLyBEaWN0aW9uYXJ5IG1hcHBpbmcgdGhlIElUZXh0UmVnaW9uIHR5cGVzIGFib3ZlIHRvIGRpc3BsYXkgc3RyaW5ncywgZm9yCi0JLy8gdXNlIGluIHRoZSBjb21ibyBib3gKLQlwcm90ZWN0ZWQgRGljdGlvbmFyeSBmRGVzY3JpcHRpb25zID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ29sb3JTZWxlY3RvciBmRm9yZWdyb3VuZDsKLQlwcm90ZWN0ZWQgTGFiZWwgZkZvcmVncm91bmRMYWJlbDsKLS8vCXByaXZhdGUgU3RyaW5nIGZHZW5lcmF0b3JLZXk7Ci0JcHJvdGVjdGVkIFN0cmluZyBmSW5wdXQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBCdXR0b24gZkl0YWxpYzsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmTm9kZXMgPSBudWxsOwotCS8vIGRlZmVjdCAyMDA3NjQgLSBBQ0M6ZGlzcGxheSB2YWx1ZXMgZm9yIGNvbG9yIGJ1dHRvbnMKLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lciBmb3JlZ3JvdW5kQWNjTGlzdGVuZXIgPSBuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKCkgewotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIjZ2V0VmFsdWUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGdldFZhbHVlKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQkJaWYgKGUuY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKSB7Ci0JCQkJZS5yZXN1bHQgPSBmRm9yZWdyb3VuZC5nZXRDb2xvclZhbHVlKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCX07Ci0JLy8gQSBSZWdpb25QYXJzZXIsIHdoaWNoIHdpbGwgdHVybiB0aGUgaW5wdXQgaW50bwotCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ocykgYW5kIFJlZ2lvbnMKLQlwcm90ZWN0ZWQgUmVnaW9uUGFyc2VyIGZQYXJzZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGZQcmVmZXJlbmNlU3RvcmU7Ci0JcHJvdGVjdGVkIENvbWJvIGZTdHlsZUNvbWJvID0gbnVsbDsKLQkvLyBUaGUgbGlzdCBvZiBzdXBwb3J0ZWQgSVRleHRSZWdpb24gdHlwZXMgW1N0cmluZ3NdCi0JcHJvdGVjdGVkIExpc3QgZlN0eWxlTGlzdCA9IG51bGw7Ci0KLQkvLyBjb250cm9scyBpbiBwaWNrZXIKLQlwcm90ZWN0ZWQgU3R5bGVkVGV4dCBmVGV4dCA9IG51bGw7Ci0KLQkvKioKLQkgKiBYTUxUZXh0Q29sb3JQaWNrZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBTdHlsZWRUZXh0Q29sb3JQaWNrZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQkvL0dyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCXNldExheW91dChsYXlvdXQpOwotCQljcmVhdGVDb250cm9scyh0aGlzKTsKLQl9Ci0KLQkvLyBhY3RpdmF0ZSBjb250cm9scyBiYXNlZCBvbiB0aGUgZ2l2ZW4gbG9jYWwgY29sb3IgdHlwZQotCXByb3RlY3RlZCB2b2lkIGFjdGl2YXRlKFN0cmluZyBuYW1lZFN0eWxlKSB7Ci0JCWlmIChuYW1lZFN0eWxlID09IG51bGwpIHsKLQkJCWZGb3JlZ3JvdW5kLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJhY2tncm91bmQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZCb2xkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJaWYgKHNob3dJdGFsaWMpCi0JCQkJZkl0YWxpYy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZGb3JlZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IAotCQllbHNlIHsJCQotCQkJZkZvcmVncm91bmQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCYWNrZ3JvdW5kLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKHRydWUpOwotCQkJZkJvbGQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWlmIChzaG93SXRhbGljKQotCQkJCWZJdGFsaWMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZGb3JlZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCYWNrZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQotCQl9Ci0JCVRleHRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlKG5hbWVkU3R5bGUpOwotCQlDb2xvciBjb2xvciA9IGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCk7Ci0JCWlmIChjb2xvciA9PSBudWxsKSB7Ci0JCQljb2xvciA9IGZEZWZhdWx0Rm9yZWdyb3VuZDsKLQkJfQotCQlmRm9yZWdyb3VuZC5zZXRDb2xvclZhbHVlKGNvbG9yLmdldFJHQigpKTsKLQotCQljb2xvciA9IGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCk7Ci0JCWlmIChjb2xvciA9PSBudWxsKSB7Ci0JCQljb2xvciA9IGZEZWZhdWx0QmFja2dyb3VuZDsKLQkJfQotCQlmQmFja2dyb3VuZC5zZXRDb2xvclZhbHVlKGNvbG9yLmdldFJHQigpKTsKLQotCQlmQm9sZC5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOwotCQlpZiAoc2hvd0l0YWxpYykKLQkJCWZJdGFsaWMuc2V0U2VsZWN0aW9uKChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFwcGx5U3R5bGVzKCkgewotCQlpZiAoZlRleHQgPT0gbnVsbCB8fCBmVGV4dC5pc0Rpc3Bvc2VkKCkgfHwgZklucHV0ID09IG51bGwgfHwgZklucHV0Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0JCS8vCQlMaXN0IHJlZ2lvbnMgPSBmUGFyc2VyLmdldFJlZ2lvbnMoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gZk5vZGVzOwotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IG5vZGUuZ2V0UmVnaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCS8vIGxvb2t1cCB0aGUgbG9jYWwgY29sb3JpbmcgdHlwZSBhbmQgYXBwbHkgaXQKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IChTdHJpbmcpIGdldENvbnRleHRTdHlsZU1hcCgpLmdldChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSk7Ci0JCQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGUobmFtZWRTdHlsZSk7Ci0JCQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2Uobm9kZS5nZXRTdGFydE9mZnNldChjdXJyZW50UmVnaW9uKSwgY3VycmVudFJlZ2lvbi5nZXRMZW5ndGgoKSwgYXR0cmlidXRlLmdldEZvcmVncm91bmQoKSwgYXR0cmlidXRlLmdldEJhY2tncm91bmQoKSwgYXR0cmlidXRlLmdldFN0eWxlKCkpOwotCQkJCWZUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCQkJfQotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xvc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBuZXcgY2hlY2tib3ggaW5zdGFuY2UgYW5kIHNldHMgdGhlIGRlZmF1bHQgbGF5b3V0IGRhdGEuCi0JICogCi0JICogQHBhcmFtIGdyb3VwCi0JICogICAgICAgICAgICB0aGUgY29tcG9zaXRlIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgY2hlY2tib3gKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gc2V0IGludG8gdGhlIGNoZWNrYm94Ci0JICogQHJldHVybiB0aGUgbmV3IGNoZWNrYm94Ci0JICovCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlQ2hlY2tCb3goQ29tcG9zaXRlIGdyb3VwLCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5DRU5URVIpOwotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORDsKLQkJLy8JZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEw7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCXByaXZhdGUgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nW10gbGFiZWxzLCBpbnQgc2VsZWN0ZWRJdGVtKSB7Ci0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCQljb21iby5zZXRJdGVtcyhsYWJlbHMpOwotCQlpZiAoc2VsZWN0ZWRJdGVtID49IDApCi0JCQljb21iby5zZWxlY3Qoc2VsZWN0ZWRJdGVtKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEw7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGNvbXBvc2l0ZSBjb250cm9sIGFuZCBzZXRzIHRoZSBkZWZhdWx0IGxheW91dCBkYXRhLgotCSAqLwotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJLy9HcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSA1OwotCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gZmFsc2U7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJLy9HcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZmFsc2U7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVI7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHN0eWxlUm93ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMyk7Ci0JCS8vIHJvdyAxIC0gY29udGVudCB0eXBlIGxhYmVsLCBjb21ibyBib3gsIHJlc3RvcmUgZGVmYXVsdHMKLQkJY3JlYXRlTGFiZWwoc3R5bGVSb3csIFNTRVVJTWVzc2FnZXMuQ29udGVudF90eXBlX19VSV8pOyAvLyROT04tTkxTLTEkID0gIkNvbnRlbnQgdHlwZToiCi0JCS8vIENvbnRleHRzIGNvbWJvIGJveAotCQlmU3R5bGVDb21ibyA9IGNyZWF0ZUNvbWJvKHN0eWxlUm93LCBuZXcgU3RyaW5nWzBdLCAtMSk7Ci0JCWZDbGVhclN0eWxlID0gY3JlYXRlUHVzaEJ1dHRvbihzdHlsZVJvdywgU1NFVUlNZXNzYWdlcy5SZXN0b3JlX0RlZmF1bHRfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJSZXN0b3JlIERlZmF1bHQiCi0JCUNvbXBvc2l0ZSBzdHlsZVJvdzI7Ci0JCWlmIChzaG93SXRhbGljKQotCQkJc3R5bGVSb3cyID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgNyk7Ci0JCWVsc2UKLQkJCXN0eWxlUm93MiA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDYpOwotCQkvLyByb3cgMiAtIGZvcmVncm91bmQgbGFiZWwsIGJ1dHRvbiwgYmFja2dyb3VuZCBsYWJlbCwgYnV0dG9uLCBib2xkLAotCQkvLyBpdGFsaWNzPwotCQlmRm9yZWdyb3VuZExhYmVsID0gY3JlYXRlTGFiZWwoc3R5bGVSb3cyLCBTU0VVSU1lc3NhZ2VzLkZvcmVncm91bmRfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJGb3JlZ3JvdW5kIgotCQlmRm9yZWdyb3VuZCA9IG5ldyBDb2xvclNlbGVjdG9yKHN0eWxlUm93Mik7Ci0JCWZGb3JlZ3JvdW5kLmdldEJ1dHRvbigpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQlzZXRBY2Nlc3NpYmxlKGZGb3JlZ3JvdW5kLmdldEJ1dHRvbigpLCBmRm9yZWdyb3VuZExhYmVsLmdldFRleHQoKSk7Ci0JCWZGb3JlZ3JvdW5kLmdldEJ1dHRvbigpLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKGZvcmVncm91bmRBY2NMaXN0ZW5lcik7IC8vIGRlZmVjdAotCQkvLyAyMDA3NjQKLQkJLy8gLQotCQkvLyBBQ0M6ZGlzcGxheQotCQkvLyB2YWx1ZXMKLQkJLy8gZm9yCi0JCS8vIGNvbG9yCi0JCS8vIGJ1dHRvbnMKLQkJKChHcmlkRGF0YSkgZkZvcmVncm91bmQuZ2V0QnV0dG9uKCkuZ2V0TGF5b3V0RGF0YSgpKS5taW5pbXVtV2lkdGggPSAyMDsKLQkJZkJhY2tncm91bmRMYWJlbCA9IGNyZWF0ZUxhYmVsKHN0eWxlUm93MiwgU1NFVUlNZXNzYWdlcy5CYWNrZ3JvdW5kX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiQmFja2dyb3VuZCIKLQkJZkJhY2tncm91bmQgPSBuZXcgQ29sb3JTZWxlY3RvcihzdHlsZVJvdzIpOwotCQlmQmFja2dyb3VuZC5nZXRCdXR0b24oKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJc2V0QWNjZXNzaWJsZShmQmFja2dyb3VuZC5nZXRCdXR0b24oKSwgZkJhY2tncm91bmRMYWJlbC5nZXRUZXh0KCkpOwotCQlmQmFja2dyb3VuZC5nZXRCdXR0b24oKS5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcihiYWNrZ3JvdW5kQWNjTGlzdGVuZXIpOyAvLyBkZWZlY3QKLQkJLy8gMjAwNzY0Ci0JCS8vIC0KLQkJLy8gQUNDOmRpc3BsYXkKLQkJLy8gdmFsdWVzCi0JCS8vIGZvcgotCQkvLyBjb2xvcgotCQkvLyBidXR0b25zCi0JCSgoR3JpZERhdGEpIGZCYWNrZ3JvdW5kLmdldEJ1dHRvbigpLmdldExheW91dERhdGEoKSkubWluaW11bVdpZHRoID0gMjA7Ci0JCWNyZWF0ZUxhYmVsKHN0eWxlUm93MiwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWZCb2xkID0gY3JlYXRlQ2hlY2tCb3goc3R5bGVSb3cyLCBTU0VVSU1lc3NhZ2VzLkJvbGRfVUlfKTsKLQkJaWYgKHNob3dJdGFsaWMpCi0JCQlmSXRhbGljID0gY3JlYXRlQ2hlY2tCb3goc3R5bGVSb3cyLCBTU0VVSU1lc3NhZ2VzLkl0YWxpY3NfVUkpOwotCQkvLwkJLy8gRGVmYXVsdHMgY2hlY2tib3gKLQkJZkZvcmVncm91bmQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWZCYWNrZ3JvdW5kLnNldEVuYWJsZWQoZmFsc2UpOwotCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWlmIChzaG93SXRhbGljKQotCQkJZkl0YWxpYy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZkZvcmVncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZkJhY2tncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJQ29tcG9zaXRlIHNhbXBsZSA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEpOwotCQljcmVhdGVMYWJlbChzYW1wbGUsIFNTRVVJTWVzc2FnZXMuU2FtcGxlX3RleHRfX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiJlNhbXBsZSB0ZXh0OiIKLQkJLy8gQlVHMTQxMDg5IC0gbWFrZSBzdXJlIHRleHQgaXMgbGVmdC1hbGlnbmVkCi0JCWZUZXh0ID0gbmV3IFN0eWxlZFRleHQoc2FtcGxlLCBTV1QuTEVGVF9UT19SSUdIVCB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlmVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWZUZXh0LnNldEJhY2tncm91bmQoZkRlZmF1bHRCYWNrZ3JvdW5kKTsKLQkJZlRleHQuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRUZXh0Rm9udCgpKTsKLQkJZlRleHQuYWRkS2V5TGlzdGVuZXIoZ2V0VGV4dEtleUxpc3RlbmVyKCkpOwotCQlmVGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihnZXRUZXh0U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZE1vdXNlTGlzdGVuZXIoZ2V0VGV4dE1vdXNlTGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZFRyYXZlcnNlTGlzdGVuZXIoZ2V0VHJhdmVyc2VMaXN0ZW5lcigpKTsgLy8gZGVmZWN0IDIyMDM3NyAtCi0JCS8vIFByb3ZpZGUgdGFiCi0JCS8vIHRyYXZlcnNhbCBmb3IKLQkJLy8gZlRleHQgd2lkZ2V0Ci0JCXNldEFjY2Vzc2libGUoZlRleHQsIFNTRVVJTWVzc2FnZXMuU2FtcGxlX3RleHRfX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiJlNhbXBsZSB0ZXh0OiIKLQkJZkZvcmVncm91bmQuYWRkTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhDb2xvclNlbGVjdG9yLlBST1BfQ09MT1JDSEFOR0UpKSB7Ci0JCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gZ2V0U3R5bGVOYW1lKGZTdHlsZUNvbWJvLmdldEl0ZW0oZlN0eWxlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSkpOwotCQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMF07Ci0JCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSAibnVsbCI7ICAgLy8kTk9OLU5MUy0xJAotCQkJCQkJT2JqZWN0IG5ld1ZhbHVlT2JqZWN0ID0gZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWlmIChuZXdWYWx1ZU9iamVjdCBpbnN0YW5jZW9mIFJHQikgewotCQkJCQkJCW5ld1ZhbHVlID0gQ29sb3JIZWxwZXIudG9SR0JTdHJpbmcoKFJHQiluZXdWYWx1ZU9iamVjdCk7Ci0JCQkJCQl9Ci0JCi0JCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCQlzdHlsZVByZWZzWzBdID0gbmV3VmFsdWU7Ci0JCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlmQmFja2dyb3VuZC5hZGRMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKENvbG9yU2VsZWN0b3IuUFJPUF9DT0xPUkNIQU5HRSkpIHsKLQkJCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBnZXRTdHlsZU5hbWUoZlN0eWxlQ29tYm8uZ2V0SXRlbShmU3R5bGVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKSk7Ci0JCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1sxXTsKLQotCQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gIm51bGwiOyAgIC8vJE5PTi1OTFMtMSQKLQkJCQkJCU9iamVjdCBuZXdWYWx1ZU9iamVjdCA9IGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlpZiAobmV3VmFsdWVPYmplY3QgaW5zdGFuY2VvZiBSR0IpIHsKLQkJCQkJCQluZXdWYWx1ZSA9IENvbG9ySGVscGVyLnRvUkdCU3RyaW5nKChSR0IpbmV3VmFsdWVPYmplY3QpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCQlzdHlsZVByZWZzWzFdID0gbmV3VmFsdWU7Ci0JCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZDbGVhclN0eWxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGJ1dHRvbkxpc3RlbmVyKTsKLQkJZkJvbGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIoYnV0dG9uTGlzdGVuZXIpOwotCQlpZiAoc2hvd0l0YWxpYykKLQkJCWZJdGFsaWMuYWRkU2VsZWN0aW9uTGlzdGVuZXIoYnV0dG9uTGlzdGVuZXIpOwotCQlmU3R5bGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihjb21ib0xpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBsYWJlbCBpbnN0YW5jZSBhbmQgc2V0cyB0aGUgZGVmYXVsdAotCSAqIGxheW91dCBkYXRhLgotCSAqLwotCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZVB1c2hCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJLy8JZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lZFN0eWxlKSB7Ci0JCVRleHRBdHRyaWJ1dGUgdGEgPSBuZXcgVGV4dEF0dHJpYnV0ZShnZXREZWZhdWx0Rm9yZWdyb3VuZCgpLCBnZXREZWZhdWx0QmFja2dyb3VuZCgpLCBTV1QuTk9STUFMKTsKLQotCQlpZiAobmFtZWRTdHlsZSAhPSBudWxsICYmIGdldFByZWZlcmVuY2VTdG9yZSgpICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCQlSR0IgYmFja2dyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMV0pOwotCi0JCQkJaW50IGZvbnRNb2RpZmllciA9IFNXVC5OT1JNQUw7Ci0JCQkJYm9vbGVhbiBib2xkID0gQm9vbGVhbi52YWx1ZU9mKHN0eWxlUHJlZnNbMl0pLmJvb2xlYW5WYWx1ZSgpOwotCQkJCWlmIChib2xkKQotCQkJCQlmb250TW9kaWZpZXIgPSBmb250TW9kaWZpZXIgfCBTV1QuQk9MRDsKLQotCQkJCWlmIChzaG93SXRhbGljKSB7Ci0JCQkJCWJvb2xlYW4gaXRhbGljID0gQm9vbGVhbi52YWx1ZU9mKHN0eWxlUHJlZnNbM10pLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQlpZiAoaXRhbGljKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgU1dULklUQUxJQzsKLQkJCQl9Ci0KLQkJCQl0YSA9IG5ldyBUZXh0QXR0cmlidXRlKChmb3JlZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihmb3JlZ3JvdW5kKSA6IG51bGwsIChiYWNrZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihiYWNrZ3JvdW5kKSA6IG51bGwsIGZvbnRNb2RpZmllcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRhOwotCX0KLQotCS8vIGRlZmVjdCAyMDA3NjQgLSBBQ0M6ZGlzcGxheSB2YWx1ZXMgZm9yIGNvbG9yIGJ1dHRvbnMKLQkvKioKLQkgKiBAcmV0dXJuIFN0cmluZyAtIGNvbG9yIEJ1dHRvbiBiJ3MgY3VycmVudCBSQkcgdmFsdWUKLQkgKi8KLS8vCXByaXZhdGUgU3RyaW5nIGdldENvbG9yQnV0dG9uVmFsdWUoQnV0dG9uIGIpIHsKLS8vCQlpZiAoKGIgPT0gbnVsbCkgfHwgKGIuZ2V0SW1hZ2UoKSA9PSBudWxsKSB8fCAoYi5nZXRJbWFnZSgpLmdldEltYWdlRGF0YSgpID09IG51bGwpIHx8IChiLmdldEltYWdlKCkuZ2V0SW1hZ2VEYXRhKCkuZ2V0UkdCcygpID09IG51bGwpIHx8IChiLmdldEltYWdlKCkuZ2V0SW1hZ2VEYXRhKCkuZ2V0UkdCcygpWzBdID09IG51bGwpKQotLy8JCQlyZXR1cm4gbnVsbDsKLS8vCQlTdHJpbmcgdmFsID0gYi5nZXRJbWFnZSgpLmdldEltYWdlRGF0YSgpLmdldFJHQnMoKVswXS50b1N0cmluZygpOwotLy8JCXJldHVybiB2YWw7Ci0vLwl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0UHJlZmVyZW5jZVN0b3JlIGluc3RlYWQgbGVmdCBmb3IgbGVnYWN5IGNsaWVudHMsCi0JICogICAgICAgICAgICAgZGVsZXRlIGJ5IFdUUCBNNAotCSAqLwotCXB1YmxpYyBOb2RlIGdldENvbG9yc05vZGUoKSB7Ci0JCS8vcmV0dXJuIGZDb2xvcnNOb2RlOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5EaWN0aW9uYXJ5Ci0JICovCi0JcHVibGljIERpY3Rpb25hcnkgZ2V0Q29udGV4dFN0eWxlTWFwKCkgewotCQlyZXR1cm4gZkNvbnRleHRTdHlsZU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcgotCSAqLwotCXB1YmxpYyBDb2xvciBnZXREZWZhdWx0QmFja2dyb3VuZCgpIHsKLQkJcmV0dXJuIGZEZWZhdWx0QmFja2dyb3VuZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcgotCSAqLwotCXB1YmxpYyBDb2xvciBnZXREZWZhdWx0Rm9yZWdyb3VuZCgpIHsKLQkJcmV0dXJuIGZEZWZhdWx0Rm9yZWdyb3VuZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5EaWN0aW9uYXJ5Ci0JICovCi0JcHVibGljIERpY3Rpb25hcnkgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gZkRlc2NyaXB0aW9uczsKLQl9Ci0KLQlwdWJsaWMgRm9udCBnZXRGb250KCkgewotCQlyZXR1cm4gZlRleHQuZ2V0Rm9udCgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJLy8gZW5zdXJlIHRoZSBvZmZzZXQgaXMgY2xlYW4KLQkJaWYgKG9mZnNldCA+PSBmSW5wdXQubGVuZ3RoKCkpCi0JCQlyZXR1cm4gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KGZJbnB1dC5sZW5ndGgoKSAtIDEpOwotCQllbHNlIGlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuIGdldE5hbWVkU3R5bGVBdE9mZnNldCgwKTsKLQkJLy8gZmluZCB0aGUgSVRleHRSZWdpb24gYXQgdGhpcyBvZmZzZXQKLQkJaWYgKGZOb2RlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYU5vZGUgPSBmTm9kZXM7Ci0JCXdoaWxlIChhTm9kZSAhPSBudWxsICYmICFhTm9kZS5jb250YWluc09mZnNldChvZmZzZXQpKQotCQkJYU5vZGUgPSBhTm9kZS5nZXROZXh0KCk7Ci0JCWlmIChhTm9kZSAhPSBudWxsKSB7Ci0JCQkvLyBmaW5kIHRoZSBJVGV4dFJlZ2lvbidzIENvbnRleHQgYXQgdGhpcyBvZmZzZXQKLQkJCUlUZXh0UmVnaW9uIGludGVyZXN0ID0gYU5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChpbnRlcmVzdCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKG9mZnNldCA+IGFOb2RlLmdldFRleHRFbmRPZmZzZXQoaW50ZXJlc3QpKQotCQkJCXJldHVybiBudWxsOwotCQkJU3RyaW5nIHJlZ2lvbkNvbnRleHQgPSBpbnRlcmVzdC5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uQ29udGV4dCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJLy8gZmluZCB0aGUgbmFtZWQgc3R5bGUgKGludGVybmFsL3NlbGVjdGFibGUgbmFtZSkgZm9yIHRoYXQKLQkJCS8vIGNvbnRleHQKLQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKFN0cmluZykgZ2V0Q29udGV4dFN0eWxlTWFwKCkuZ2V0KHJlZ2lvbkNvbnRleHQpOwotCQkJaWYgKG5hbWVkU3R5bGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBuYW1lZFN0eWxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JcHVibGljIFJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCXJldHVybiBmUGFyc2VyOwotCX0KLQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBmUHJlZmVyZW5jZVN0b3JlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nW10KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTdHlsZUxpc3QoKSB7Ci0JCXJldHVybiBmU3R5bGVMaXN0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN0eWxlTmFtZShTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHN0eWxlTmFtZSA9IG51bGw7Ci0JCWphdmEudXRpbC5FbnVtZXJhdGlvbiBrZXlzID0gZ2V0RGVzY3JpcHRpb25zKCkua2V5cygpOwotCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJU3RyaW5nIHRlc3QgPSBrZXlzLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKLQkJCWlmIChnZXREZXNjcmlwdGlvbnMoKS5nZXQodGVzdCkuZXF1YWxzKGRlc2NyaXB0aW9uKSkgewotCQkJCXN0eWxlTmFtZSA9IHRlc3Q7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0eWxlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBmSW5wdXQ7Ci0JfQotCi0JcHJpdmF0ZSBLZXlMaXN0ZW5lciBnZXRUZXh0S2V5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb3VzZUxpc3RlbmVyIGdldFRleHRNb3VzZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vdXNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZ2V0VGV4dFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KGUueCk7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQkoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24oZS54KTsKLQkJCQl9Ci0JCQl9Ci0KLS8vIENvbW1lbnRlZCBvdXQgd2hlbiBtb3ZpbmcgdG8gUkMyIHRvIHJlbW92ZSAidW51c2VkIiBlcnJvci93YXJuaW5nCQkJCi0vLwkJCXB1YmxpYyB2b2lkIHdpZGdldERvdWJsZVNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLS8vCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoZS54KTsKLS8vCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLS8vCQkJCQkoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24oZS54KTsKLS8vCQkJCX0KLS8vCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0Q29sb3JBdE9mZnNldChlLngpOwotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJKChTdHlsZWRUZXh0KSBlLndpZGdldCkuc2V0U2VsZWN0aW9uKGUueCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8vIGRlZmVjdCAyMjAzNzcgLSBQcm92aWRlIHRhYiB0cmF2ZXJzYWwgZm9yIGZUZXh0IHdpZGdldAotCXByaXZhdGUgVHJhdmVyc2VMaXN0ZW5lciBnZXRUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyI2tleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpZiAoKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCkgfHwgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfUFJFVklPVVMpKQotCQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gcmVmcmVzaCB0aGUgR1VJIGFmdGVyIGEgY29sb3IgY2hhbmdlCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJZlRleHQuc2V0UmVkcmF3KGZhbHNlKTsKLQkJaW50IHNlbGVjdGVkSW5kZXggPSBmU3R5bGVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBzZWxlY3RlZEluZGV4ID49IDAgPyBmU3R5bGVDb21iby5nZXRJdGVtKHNlbGVjdGVkSW5kZXgpIDogbnVsbDsKLQkJYWN0aXZhdGUoZ2V0U3R5bGVOYW1lKGRlc2NyaXB0aW9uKSk7Ci0JCS8vIHVwZGF0ZSBGb250Ci0JCWZUZXh0LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0VGV4dEZvbnQoKSk7Ci0JCS8vIHJlYXBwbHlTdHlsZXMKLQkJYXBwbHlTdHlsZXMoKTsKLQkJZlRleHQuc2V0UmVkcmF3KHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2VQaWNrZXJSZXNvdXJjZXMoKSB7Ci0vLwkJaWYgKGZGb3JlZ3JvdW5kICE9IG51bGwgJiYgIWZGb3JlZ3JvdW5kLmlzRGlzcG9zZWQoKSAmJiBmRm9yZWdyb3VuZC5nZXRJbWFnZSgpICE9IG51bGwpCi0vLwkJCWZGb3JlZ3JvdW5kLmdldEltYWdlKCkuZGlzcG9zZSgpOwotLy8JCWlmIChmQmFja2dyb3VuZCAhPSBudWxsICYmICFmQmFja2dyb3VuZC5pc0Rpc3Bvc2VkKCkgJiYgZkJhY2tncm91bmQuZ2V0SW1hZ2UoKSAhPSBudWxsKQotLy8JCQlmQmFja2dyb3VuZC5nZXRJbWFnZSgpLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VsZWN0Q29sb3JBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyBuYW1lZFN0eWxlID0gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KG9mZnNldCk7Ci0JCWlmIChuYW1lZFN0eWxlID09IG51bGwpIHsKLQkJCWZTdHlsZUNvbWJvLmRlc2VsZWN0QWxsKCk7Ci0JCQlhY3RpdmF0ZShudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAoU3RyaW5nKSBnZXREZXNjcmlwdGlvbnMoKS5nZXQobmFtZWRTdHlsZSk7Ci0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaXRlbUNvdW50ID0gZlN0eWxlQ29tYm8uZ2V0SXRlbUNvdW50KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUNvdW50OyBpKyspIHsKLQkJCWlmIChmU3R5bGVDb21iby5nZXRJdGVtKGkpLmVxdWFscyhkZXNjcmlwdGlvbikpIHsKLQkJCQlmU3R5bGVDb21iby5zZWxlY3QoaSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogU3BlY2lmaWNhbGx5IHNldCB0aGUgcmVwb3J0aW5nIG5hbWUgb2YgYSBjb250cm9sIGZvciBhY2Nlc3NpYmlsaXR5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFjY2Vzc2libGUoQ29udHJvbCBjb250cm9sLCBTdHJpbmcgbmFtZSkgewotCQlpZiAoY29udHJvbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmaW5hbCBTdHJpbmcgbiA9IG5hbWU7Ci0JCWNvbnRyb2wuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJaWYgKGUuY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKQotCQkJCQllLnJlc3VsdCA9IG47Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBzZXRQcmVmZXJlbmNlU3RvcmUgaW5zdGVhZCBsZWZ0IGZvciBsZWdhY3kgY2xpZW50cywKLQkgKiAgICAgICAgICAgICBkZWxldGUgYnkgV1RQIE00Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sb3JzTm9kZShOb2RlIG5ld0NvbG9yc05vZGUpIHsKLQkJLy9mQ29sb3JzTm9kZSA9IG5ld0NvbG9yc05vZGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld0NvbnRleHRTdHlsZU1hcAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkRpY3Rpb25hcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0U3R5bGVNYXAoRGljdGlvbmFyeSBuZXdDb250ZXh0U3R5bGVNYXApIHsKLQkJZkNvbnRleHRTdHlsZU1hcCA9IG5ld0NvbnRleHRTdHlsZU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3RGVmYXVsdEJhY2tncm91bmQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRCYWNrZ3JvdW5kKENvbG9yIG5ld0RlZmF1bHRCYWNrZ3JvdW5kKSB7Ci0JCWZEZWZhdWx0QmFja2dyb3VuZCA9IG5ld0RlZmF1bHRCYWNrZ3JvdW5kOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBzZXRQcmVmZXJlbmNlU3RvcmUgaW5zdGVhZCBsZWZ0IGZvciBsZWdhY3kgY2xpZW50cywKLQkgKiAgICAgICAgICAgICBkZWxldGUgYnkgV1RQIE00Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdENvbG9yc05vZGUoTm9kZSBuZXdEZWZhdWx0Q29sb3JzTm9kZSkgewotCQkvL2ZEZWZhdWx0Q29sb3JzTm9kZSA9IG5ld0RlZmF1bHRDb2xvcnNOb2RlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdEZWZhdWx0Rm9yZWdyb3VuZAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdEZvcmVncm91bmQoQ29sb3IgbmV3RGVmYXVsdEZvcmVncm91bmQpIHsKLQkJZkRlZmF1bHRGb3JlZ3JvdW5kID0gbmV3RGVmYXVsdEZvcmVncm91bmQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld0Rlc2NyaXB0aW9ucwotCSAqICAgICAgICAgICAgamF2YS51dGlsLkRpY3Rpb25hcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbnMoRGljdGlvbmFyeSBuZXdEZXNjcmlwdGlvbnMpIHsKLQkJZkRlc2NyaXB0aW9ucyA9IG5ld0Rlc2NyaXB0aW9uczsKLQkJdXBkYXRlU3R5bGVMaXN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9udChGb250IGZvbnQpIHsKLQkJZlRleHQuc2V0Rm9udChmb250KTsKLQkJZlRleHQucmVkcmF3KCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgZ2VuZXJhdG9yIGtleSBzaG91bGQgbm8gbG9uZ2VyIGJlIG5lZWRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRvcktleShTdHJpbmcga2V5KSB7Ci0vLwkJZkdlbmVyYXRvcktleSA9IGtleTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3UGFyc2VyCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyc2VyKFJlZ2lvblBhcnNlciBuZXdQYXJzZXIpIHsKLQkJZlBhcnNlciA9IG5ld1BhcnNlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcmVmZXJlbmNlU3RvcmUoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQlmUHJlZmVyZW5jZVN0b3JlID0gc3RvcmU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1N0eWxlTGlzdAotCSAqICAgICAgICAgICAgU3RyaW5nW10KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHlsZUxpc3QoTGlzdCBuZXdTdHlsZUxpc3QpIHsKLQkJZlN0eWxlTGlzdCA9IG5ld1N0eWxlTGlzdDsKLQkJdXBkYXRlU3R5bGVMaXN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgcykgewotCQlmSW5wdXQgPSBzOwotCQlnZXRQYXJzZXIoKS5yZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGZJbnB1dC50b0NoYXJBcnJheSgpKSk7Ci0JCWZOb2RlcyA9IGdldFBhcnNlcigpLmdldERvY3VtZW50UmVnaW9ucygpOwotCQlpZiAoRGVidWcuZGlzcGxheUluZm8pCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxlbmd0aCBvZiBpbnB1dDogIiAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCQkrIHMubGVuZ3RoKCkgKyAiLCAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgZ2V0UGFyc2VyKCkuZ2V0UmVnaW9ucygpLnNpemUoKSArICIgcmVnaW9ucy4iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZlRleHQgIT0gbnVsbCkKLQkJCWZUZXh0LnNldFRleHQocyk7Ci0JCWFwcGx5U3R5bGVzKCk7Ci0JfQotCi0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQgotCSAqIEBwYXJhbSBhblJHQlN0cmluZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkZWZhdWx0UkdCCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCCi0JICovCi0JLy8gVE9ETzogbmV2ZXIgdXNlZAotCSBSR0IgdG9SR0IoU3RyaW5nIGFuUkdCU3RyaW5nLCBSR0IgZGVmYXVsdFJHQikgewotCQlSR0IgcmVzdWx0ID0gQ29sb3JIZWxwZXIudG9SR0IoYW5SR0JTdHJpbmcpOwotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXR1cm4gZGVmYXVsdFJHQjsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlU3R5bGVMaXN0KCkgewotCQlpZiAoZlN0eWxlTGlzdCA9PSBudWxsIHx8IGZEZXNjcmlwdGlvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nW10gZGVzY3JpcHRpb25zID0gbmV3IFN0cmluZ1tmU3R5bGVMaXN0LnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlN0eWxlTGlzdC5zaXplKCk7IGkrKykgewotCQkJaWYgKGZTdHlsZUxpc3QuZ2V0KGkpICE9IG51bGwpCi0JCQkJZGVzY3JpcHRpb25zW2ldID0gKFN0cmluZykgZ2V0RGVzY3JpcHRpb25zKCkuZ2V0KGZTdHlsZUxpc3QuZ2V0KGkpKTsKLQkJCWVsc2UKLQkJCQlkZXNjcmlwdGlvbnNbaV0gPSAoU3RyaW5nKSBmU3R5bGVMaXN0LmdldChpKTsKLQkJfQotCQlPYmplY3RbXSBzb3J0ZWRPYmplY3RzID0gbmV3IERlc2NyaXB0aW9uU29ydGVyKCkuc29ydChkZXNjcmlwdGlvbnMpOwotCQlTdHJpbmdbXSBzb3J0ZWREZXNjcmlwdGlvbnMgPSBuZXcgU3RyaW5nW2Rlc2NyaXB0aW9ucy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJc29ydGVkRGVzY3JpcHRpb25zW2ldID0gc29ydGVkT2JqZWN0c1tpXS50b1N0cmluZygpOwotCQl9Ci0JCWZTdHlsZUNvbWJvLnNldEl0ZW1zKHNvcnRlZERlc2NyaXB0aW9ucyk7Ci0JCWZTdHlsZUNvbWJvLnNlbGVjdCgwKTsgLy9kZWZlY3QgMjE5ODU1IC0gaW5pdGlhbGx5IHNlbGVjdCBmaXJzdCBpdGVtCi0JCS8vIGluIGNvbWJvQm94Ci0JCS8vCQlmU3R5bGVDb21iby5kZXNlbGVjdEFsbCgpOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9UZXh0SG92ZXJQcmVmZXJlbmNlVGFiLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvVGV4dEhvdmVyUHJlZmVyZW5jZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDA5MDRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9UZXh0SG92ZXJQcmVmZXJlbmNlVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5FZGl0b3JQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mby5UZXh0SG92ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mby5UZXh0SG92ZXJNYW5hZ2VyLlRleHRIb3ZlckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkVkaXRvclV0aWxpdHk7Ci0KLS8qKgotICogUHJlZmVyZW5jZSB0YWIgZm9yIFN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaG92ZXIgaGVscCBwcmVmZXJlbmNlcwotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlVGFiIHsKLQotCXByaXZhdGUgY2xhc3MgSW50ZXJuYWxUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JCXB1YmxpYyBJbnRlcm5hbFRhYmxlTGFiZWxQcm92aWRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCWNhc2UgMCA6IC8vIHRleHQgaG92ZXIgbGFiZWwKLQkJCQkJcmV0dXJuICgoVGV4dEhvdmVyTWFuYWdlci5UZXh0SG92ZXJEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRMYWJlbCgpOwotCi0JCQkJY2FzZSAxIDogLy8gdGV4dCBob3ZlciBzdGF0ZSBtYXNrCi0JCQkJCXJldHVybiAoKFRleHRIb3Zlck1hbmFnZXIuVGV4dEhvdmVyRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0TW9kaWZpZXJTdHJpbmcoKTsKLQotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSU1JVEVSID0gU1NFVUlNZXNzYWdlcy5UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2RlbGltaXRlcjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgVGV4dCBmRGVzY3JpcHRpb247Ci0JcHJpdmF0ZSBUYWJsZSBmSG92ZXJUYWJsZTsKLQlwcml2YXRlIFRhYmxlVmlld2VyIGZIb3ZlclRhYmxlVmlld2VyOwotCXByaXZhdGUgVGFibGVDb2x1bW4gZk1vZGlmaWVyQ29sdW1uOwotCS8vIGZvciB0aGlzIHByZWZlcmVuY2UgcGFnZQotCXByaXZhdGUgVGV4dCBmTW9kaWZpZXJFZGl0b3I7Ci0JcHJpdmF0ZSBUYWJsZUNvbHVtbiBmTmFtZUNvbHVtbjsKLQotCXByaXZhdGUgVGV4dEhvdmVyRGVzY3JpcHRvcltdIGZUZXh0SG92ZXJzOyAvLyBjdXJyZW50IGxpc3Qgb2YgdGV4dCBob3ZlcnMKLQotCXB1YmxpYyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiKFByZWZlcmVuY2VQYWdlIG1haW5QcmVmZXJlbmNlUGFnZSwgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG1haW5QcmVmZXJlbmNlUGFnZSk7Ci0JCUFzc2VydC5pc05vdE51bGwoc3RvcmUpOwotCQlzZXRNYWluUHJlZmVyZW5jZVBhZ2UobWFpblByZWZlcmVuY2VQYWdlKTsKLQkJc2V0T3ZlcmxheVN0b3JlKHN0b3JlKTsKLQkJZ2V0T3ZlcmxheVN0b3JlKCkuYWRkS2V5cyhjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5JUHJlZmVyZW5jZVRhYiNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHRhYkZvbGRlcikgewotCQlDb21wb3NpdGUgaG92ZXJDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJaG92ZXJDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWhvdmVyQ29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCi0JCS8vIGNvbW1lbnRlZCBvdXQgdW50aWwgdGhlc2UgcHJlZmVyZW5jZXMgYXJlIGFjdHVhbGx5IGhhbmRsZWQgaW4gc29tZQotCQkvLyB3YXkKLQkJLy8JCVN0cmluZyByb2xsT3ZlckxhYmVsPQotCQkvLyBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUZXh0SG92ZXJQcmVmZXJlbmNlVGFiLmFubm90YXRpb25Sb2xsb3ZlciIpOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vCQlhZGRDaGVja0JveChob3ZlckNvbXBvc2l0ZSwgcm9sbE92ZXJMYWJlbCwKLQkJLy8gQ29tbW9uRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkVESVRPUl9BTk5PVEFUSU9OX1JPTExfT1ZFUiwgMCk7Ci0JCS8vCi0JCS8vCQkvLyBBZmZvcmRhbmNlIGNoZWNrYm94Ci0JCS8vCQlTdHJpbmcgc2hvd0FmZm9yZGFuY2VMYWJlbCA9Ci0JCS8vIFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRleHRIb3ZlclByZWZlcmVuY2VUYWIuc2hvd0FmZm9yZGFuY2UiKTsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQkvLwkJYWRkQ2hlY2tCb3goaG92ZXJDb21wb3NpdGUsIHNob3dBZmZvcmRhbmNlTGFiZWwsCi0JCS8vIENvbW1vbkVkaXRvclByZWZlcmVuY2VOYW1lcy5FRElUT1JfU0hPV19URVhUX0hPVkVSX0FGRk9SREFOQ0UsIDApOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGhvdmVyQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2hvdmVyUHJlZmVyZW5jZXMpOyAvLyROT04tTkxTLTEkCi0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlmSG92ZXJUYWJsZVZpZXdlciA9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KGhvdmVyQ29tcG9zaXRlLCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJLy8gSG92ZXIgdGFibGUKLQkJZkhvdmVyVGFibGUgPSBmSG92ZXJUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCQlmSG92ZXJUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlmSG92ZXJUYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDQ1MDcKLQkgICAgR0MgZ2MgPSBuZXcgR0MoZkhvdmVyVGFibGUpOwotCSAgICBnYy5zZXRGb250KGZIb3ZlclRhYmxlLmdldEZvbnQoKSk7Ci0JICAgIEZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkgICAgZ2MuZGlzcG9zZSgpOwotCQlpbnQgaGVpZ2h0SGludCA9IERpYWxvZy5jb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCA3KTsKLQkJZ2QuaGVpZ2h0SGludCA9IGhlaWdodEhpbnQ7Ci0JCQotCQlmSG92ZXJUYWJsZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEsIDE0MCwgdHJ1ZSkpOwotCQl0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEsIDE0MCwgdHJ1ZSkpOwotCQlmSG92ZXJUYWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCi0JCWZIb3ZlclRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUhvdmVyTGlzdFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQotCQlmTmFtZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihmSG92ZXJUYWJsZSwgU1dULk5PTkUpOwotCQlmTmFtZUNvbHVtbi5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9uYW1lQ29sdW1uVGl0bGUpOyAvLyROT04tTkxTLTEkCi0JCWZOYW1lQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQotCQlmTW9kaWZpZXJDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oZkhvdmVyVGFibGUsIFNXVC5OT05FKTsKLQkJZk1vZGlmaWVyQ29sdW1uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX21vZGlmaWVyQ29sdW1uVGl0bGUpOyAvLyROT04tTkxTLTEkCi0JCWZNb2RpZmllckNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0KLQkJZkhvdmVyVGFibGVWaWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQkJZkhvdmVyVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJZkhvdmVyVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgSW50ZXJuYWxUYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCSgoQ2hlY2tib3hUYWJsZVZpZXdlcikgZkhvdmVyVGFibGVWaWV3ZXIpLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCS8qCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lciNjaGVja1N0YXRlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlTdHJpbmcgaWQgPSAoKFRleHRIb3ZlckRlc2NyaXB0b3IpIGV2ZW50LmdldEVsZW1lbnQoKSkuZ2V0SWQoKTsKLQkJCQlpZiAoaWQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCi0JCQkJVGV4dEhvdmVyTWFuYWdlci5UZXh0SG92ZXJEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBnZXRUZXh0SG92ZXJNYW5hZ2VyKCkuZ2V0VGV4dEhvdmVycygpOwotCQkJCVRleHRIb3Zlck1hbmFnZXIuVGV4dEhvdmVyRGVzY3JpcHRvciBob3ZlckNvbmZpZyA9IG51bGw7Ci0JCQkJaW50IGkgPSAwLCBsZW5ndGggPSBmVGV4dEhvdmVycy5sZW5ndGg7Ci0JCQkJd2hpbGUgKGkgPCBsZW5ndGgpIHsKLQkJCQkJaWYgKGlkLmVxdWFscyhkZXNjcmlwdG9yc1tpXS5nZXRJZCgpKSkgewotCQkJCQkJaG92ZXJDb25maWcgPSBmVGV4dEhvdmVyc1tpXTsKLQkJCQkJCWhvdmVyQ29uZmlnLnNldEVuYWJsZWQoZXZlbnQuZ2V0Q2hlY2tlZCgpKTsKLQkJCQkJCWZNb2RpZmllckVkaXRvci5zZXRFbmFibGVkKGV2ZW50LmdldENoZWNrZWQoKSk7Ci0JCQkJCQlmSG92ZXJUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZGVzY3JpcHRvcnNbaV0pKTsKLQkJCQkJfQotCQkJCQlpKys7Ci0JCQkJfQotCi0JCQkJaGFuZGxlSG92ZXJMaXN0U2VsZWN0aW9uKCk7Ci0JCQkJdXBkYXRlU3RhdHVzKGhvdmVyQ29uZmlnKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gVGV4dCBmaWVsZCBmb3IgbW9kaWZpZXIgc3RyaW5nCi0JCWxhYmVsID0gbmV3IExhYmVsKGhvdmVyQ29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2tleU1vZGlmaWVyKTsgLy8kTk9OLU5MUy0xJAotCQlmTW9kaWZpZXJFZGl0b3IgPSBuZXcgVGV4dChob3ZlckNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWZNb2RpZmllckVkaXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlmTW9kaWZpZXJFZGl0b3IuYWRkS2V5TGlzdGVuZXIobmV3IEtleUxpc3RlbmVyKCkgewotCQkJcHJpdmF0ZSBib29sZWFuIGlzTW9kaWZpZXJDYW5kaWRhdGU7Ci0KLQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJCWlzTW9kaWZpZXJDYW5kaWRhdGUgPSBlLmtleUNvZGUgPiAwICYmIGUuY2hhcmFjdGVyID09IDAgJiYgZS5zdGF0ZU1hc2sgPT0gMDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkJCWlmIChpc01vZGlmaWVyQ2FuZGlkYXRlICYmIGUuc3RhdGVNYXNrID4gMCAmJiBlLnN0YXRlTWFzayA9PSBlLnN0YXRlTWFzayAmJiBlLmNoYXJhY3RlciA9PSAwKSB7Ly8gJiYKLQkJCQkJLy8gZS50aW1lCi0JCQkJCS8vIC10aW1lCi0JCQkJCS8vIDwKLQkJCQkJLy8gMTAwMCkKLQkJCQkJLy8gewotCQkJCQlTdHJpbmcgdGV4dCA9IGZNb2RpZmllckVkaXRvci5nZXRUZXh0KCk7Ci0JCQkJCVBvaW50IHNlbGVjdGlvbiA9IGZNb2RpZmllckVkaXRvci5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaW50IGkgPSBzZWxlY3Rpb24ueCAtIDE7Ci0JCQkJCXdoaWxlIChpID4gLTEgJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0ZXh0LmNoYXJBdChpKSkpIHsKLQkJCQkJCWktLTsKLQkJCQkJfQotCQkJCQlib29sZWFuIG5lZWRzUHJlZml4RGVsaW1pdGVyID0gaSA+IC0xICYmICFTdHJpbmcudmFsdWVPZih0ZXh0LmNoYXJBdChpKSkuZXF1YWxzKERFTElNSVRFUik7Ci0KLQkJCQkJaSA9IHNlbGVjdGlvbi55OwotCQkJCQl3aGlsZSAoaSA8IHRleHQubGVuZ3RoKCkgJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0ZXh0LmNoYXJBdChpKSkpIHsKLQkJCQkJCWkrKzsKLQkJCQkJfQotCQkJCQlib29sZWFuIG5lZWRzUG9zdGZpeERlbGltaXRlciA9IGkgPCB0ZXh0Lmxlbmd0aCgpICYmICFTdHJpbmcudmFsdWVPZih0ZXh0LmNoYXJBdChpKSkuZXF1YWxzKERFTElNSVRFUik7Ci0KLQkJCQkJU3RyaW5nIGluc2VydFN0cmluZzsKLQotCQkJCQlpZiAobmVlZHNQcmVmaXhEZWxpbWl0ZXIgJiYgbmVlZHNQb3N0Zml4RGVsaW1pdGVyKQotCQkJCQkJaW5zZXJ0U3RyaW5nID0gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2luc2VydERlbGltaXRlckFuZE1vZGlmaWVyQW5kRGVsaW1pdGVyLCBuZXcgU3RyaW5nW117QWN0aW9uLmZpbmRNb2RpZmllclN0cmluZyhlLnN0YXRlTWFzayl9KTsKLQkJCQkJZWxzZSBpZiAobmVlZHNQcmVmaXhEZWxpbWl0ZXIpCi0JCQkJCQlpbnNlcnRTdHJpbmcgPSBOTFMuYmluZChTU0VVSU1lc3NhZ2VzLlRleHRIb3ZlclByZWZlcmVuY2VUYWJfaW5zZXJ0RGVsaW1pdGVyQW5kTW9kaWZpZXIsIG5ldyBTdHJpbmdbXXtBY3Rpb24uZmluZE1vZGlmaWVyU3RyaW5nKGUuc3RhdGVNYXNrKX0pOwotCQkJCQllbHNlIGlmIChuZWVkc1Bvc3RmaXhEZWxpbWl0ZXIpCi0JCQkJCQlpbnNlcnRTdHJpbmcgPSBOTFMuYmluZChTU0VVSU1lc3NhZ2VzLlRleHRIb3ZlclByZWZlcmVuY2VUYWJfaW5zZXJ0TW9kaWZpZXJBbmREZWxpbWl0ZXIsIG5ldyBTdHJpbmdbXXtBY3Rpb24uZmluZE1vZGlmaWVyU3RyaW5nKGUuc3RhdGVNYXNrKX0pOwotCQkJCQllbHNlCi0JCQkJCQlpbnNlcnRTdHJpbmcgPSBBY3Rpb24uZmluZE1vZGlmaWVyU3RyaW5nKGUuc3RhdGVNYXNrKTsKLQotCQkJCQlpZiAoaW5zZXJ0U3RyaW5nICE9IG51bGwpCi0JCQkJCQlmTW9kaWZpZXJFZGl0b3IuaW5zZXJ0KGluc2VydFN0cmluZyk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmTW9kaWZpZXJFZGl0b3IuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaGFuZGxlTW9kaWZpZXJNb2RpZmllZCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBEZXNjcmlwdGlvbgotCQlMYWJlbCBkZXNjcmlwdGlvbkxhYmVsID0gbmV3IExhYmVsKGhvdmVyQ29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWRlc2NyaXB0aW9uTGFiZWwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRleHRIb3ZlclByZWZlcmVuY2VUYWJfZGVzY3JpcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGVzY3JpcHRpb25MYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZkRlc2NyaXB0aW9uID0gbmV3IFRleHQoaG92ZXJDb21wb3NpdGUsIFNXVC5MRUZUIHwgU1dULldSQVAgfCBTV1QuTVVMVEkgfCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkRlc2NyaXB0aW9uLnNldExheW91dERhdGEoZ2QpOwotCi0JCWluaXRpYWxpemUoKTsKLQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGhvdmVyQ29tcG9zaXRlKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGhvdmVyQ29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuUFJFRlNURV9IT1ZFUlNfSEVMUElEKTsKLQkJcmV0dXJuIGhvdmVyQ29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10gY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpIHsKLQkJQXJyYXlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuU1RSSU5HLCBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuRURJVE9SX1RFWFRfSE9WRVJfTU9ESUZJRVJTKSk7Ci0KLQkJT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10ga2V5cyA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbb3ZlcmxheUtleXMuc2l6ZSgpXTsKLQkJb3ZlcmxheUtleXMudG9BcnJheShrZXlzKTsKLQkJcmV0dXJuIGtleXM7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVUZXh0SG92ZXJTdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGV4dEhvdmVycy5sZW5ndGg7IGkrKykgewotCQkJYnVmLmFwcGVuZChmVGV4dEhvdmVyc1tpXS5nZXRJZCgpKTsKLQkJCWJ1Zi5hcHBlbmQoVGV4dEhvdmVyTWFuYWdlci5IT1ZFUl9BVFRSSUJVVEVfU0VQQVJBVE9SKTsKLQkJCWJ1Zi5hcHBlbmQoQm9vbGVhbi50b1N0cmluZyhmVGV4dEhvdmVyc1tpXS5pc0VuYWJsZWQoKSkpOwotCQkJYnVmLmFwcGVuZChUZXh0SG92ZXJNYW5hZ2VyLkhPVkVSX0FUVFJJQlVURV9TRVBBUkFUT1IpOwotCQkJU3RyaW5nIG1vZGlmaWVyID0gZlRleHRIb3ZlcnNbaV0uZ2V0TW9kaWZpZXJTdHJpbmcoKTsKLQkJCWlmIChtb2RpZmllciA9PSBudWxsIHx8IG1vZGlmaWVyLmxlbmd0aCgpID09IDApCi0JCQkJbW9kaWZpZXIgPSBUZXh0SG92ZXJNYW5hZ2VyLk5PX01PRElGSUVSOwotCQkJYnVmLmFwcGVuZChtb2RpZmllcik7Ci0JCQlidWYuYXBwZW5kKFRleHRIb3Zlck1hbmFnZXIuSE9WRVJfU0VQQVJBVE9SKTsKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0SG92ZXJNYW5hZ2VyIGdldFRleHRIb3Zlck1hbmFnZXIoKSB7Ci0JCXJldHVybiBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGV4dEhvdmVyTWFuYWdlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5JUHJlZmVyZW5jZVRhYiNnZXRUaXRsZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIFNTRVVJTWVzc2FnZXMuVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl90aXRsZTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXZvaWQgaGFuZGxlSG92ZXJMaXN0U2VsZWN0aW9uKCkgewotCQlpbnQgaSA9IGZIb3ZlclRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0KLQkJaWYgKGkgPT0gLTEpIHsKLQkJCWlmIChmSG92ZXJUYWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpID09IDApCi0JCQkJZk1vZGlmaWVyRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYm9vbGVhbiBlbmFibGVkID0gZlRleHRIb3ZlcnNbaV0uaXNFbmFibGVkKCk7Ci0JCWZNb2RpZmllckVkaXRvci5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmTW9kaWZpZXJFZGl0b3Iuc2V0VGV4dChmVGV4dEhvdmVyc1tpXS5nZXRNb2RpZmllclN0cmluZygpKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gZlRleHRIb3ZlcnNbaV0uZ2V0RGVzY3JpcHRpb24oKTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlkZXNjcmlwdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZEZXNjcmlwdGlvbi5zZXRUZXh0KGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlTW9kaWZpZXJNb2RpZmllZCgpIHsKLQkJaW50IGkgPSBmSG92ZXJUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaSA9PSAtMSkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgbW9kaWZpZXJzID0gZk1vZGlmaWVyRWRpdG9yLmdldFRleHQoKTsKLQkJZlRleHRIb3ZlcnNbaV0uc2V0TW9kaWZpZXJTdHJpbmcobW9kaWZpZXJzKTsKLQotCQkvLyB1cGRhdGUgdGFibGUKLQkJZkhvdmVyVGFibGVWaWV3ZXIucmVmcmVzaChmVGV4dEhvdmVyc1tpXSk7Ci0KLQkJdXBkYXRlU3RhdHVzKGZUZXh0SG92ZXJzW2ldKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJcmVzdG9yZUZyb21PdmVybGF5KCk7Ci0JCWZIb3ZlclRhYmxlVmlld2VyLnNldElucHV0KGZUZXh0SG92ZXJzKTsKLQotCQlpbml0aWFsaXplRmllbGRzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVRhYiNpbml0aWFsaXplRmllbGRzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRmllbGRzKCkgewotCQlzdXBlci5pbml0aWFsaXplRmllbGRzKCk7Ci0KLQkJZk1vZGlmaWVyRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkvLyBpbml0aWFsaXplIGNoZWNrYm94ZXMgaW4gaG92ZXIgdGFibGUKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGV4dEhvdmVycy5sZW5ndGg7IGkrKykKLQkJCWZIb3ZlclRhYmxlLmdldEl0ZW0oaSkuc2V0Q2hlY2tlZChmVGV4dEhvdmVyc1tpXS5pc0VuYWJsZWQoKSk7Ci0JCWZIb3ZlclRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudWkuSVByZWZlcmVuY2VUYWIjcGVyZm9ybUFwcGx5KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoKSB7Ci0JCXBlcmZvcm1PaygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5JUHJlZmVyZW5jZVRhYiNwZXJmb3JtRGVmYXVsdHMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5JUHJlZmVyZW5jZVRhYiNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1PaygpIHsKLQkJU3RyaW5nIHRleHRIb3ZlclN0cmluZyA9IGdlbmVyYXRlVGV4dEhvdmVyU3RyaW5nKCk7Ci0JCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKEVkaXRvclByZWZlcmVuY2VOYW1lcy5FRElUT1JfVEVYVF9IT1ZFUl9NT0RJRklFUlMsIHRleHRIb3ZlclN0cmluZyk7Ci0JCWdldFRleHRIb3Zlck1hbmFnZXIoKS5yZXNldFRleHRIb3ZlcnMoKTsgLy8gbm90aWZ5IHRleHQgaG92ZXIgbWFuYWdlcgotCQkvLyBpdCBzaG91bGQgcmVzZXQgdG8gZ2V0Ci0JCS8vIGxhdGVzdCBwcmVmZXJlbmNlcwotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyBmVGV4dEhvdmVycyB3aXRoIHRleHQgaG92ZXIgZGVzY3JpcHRpb24gZnJvbSB0aGUgb3ZlcmxheQotCSAqIHN0b3JlICh3aGljaCBpcyB0aGUgcHJlZmVyZW5jZXMpCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmVGcm9tT3ZlcmxheSgpIHsKLQkJU3RyaW5nIGRlc2NyaXB0b3JzU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKEVkaXRvclByZWZlcmVuY2VOYW1lcy5FRElUT1JfVEVYVF9IT1ZFUl9NT0RJRklFUlMpOwotCQlmVGV4dEhvdmVycyA9IGdldFRleHRIb3Zlck1hbmFnZXIoKS5nZW5lcmF0ZVRleHRIb3ZlckRlc2NyaXB0b3JzKGRlc2NyaXB0b3JzU3RyaW5nKTsKLQl9Ci0KLQl2b2lkIHVwZGF0ZVN0YXR1cyhUZXh0SG92ZXJNYW5hZ2VyLlRleHRIb3ZlckRlc2NyaXB0b3IgaG92ZXJDb25maWcpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzSW5mbygpOwotCi0JCWlmIChob3ZlckNvbmZpZyAhPSBudWxsICYmIGhvdmVyQ29uZmlnLmlzRW5hYmxlZCgpICYmIEVkaXRvclV0aWxpdHkuY29tcHV0ZVN0YXRlTWFzayhob3ZlckNvbmZpZy5nZXRNb2RpZmllclN0cmluZygpKSA9PSAtMSkKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXNJbmZvKElTdGF0dXMuRVJST1IsIE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9tb2RpZmllcklzTm90VmFsaWQsIG5ldyBTdHJpbmdbXXtob3ZlckNvbmZpZy5nZXRNb2RpZmllclN0cmluZygpfSkpOwotCi0JCWludCBpID0gMDsKLQkJSGFzaE1hcCBzdGF0ZU1hc2tzID0gbmV3IEhhc2hNYXAoZlRleHRIb3ZlcnMubGVuZ3RoKTsKLQkJd2hpbGUgKHN0YXR1cy5pc09LKCkgJiYgaSA8IGZUZXh0SG92ZXJzLmxlbmd0aCkgewotCQkJaWYgKGZUZXh0SG92ZXJzW2ldLmlzRW5hYmxlZCgpKSB7Ci0JCQkJU3RyaW5nIGxhYmVsID0gZlRleHRIb3ZlcnNbaV0uZ2V0TGFiZWwoKTsKLQkJCQlJbnRlZ2VyIHN0YXRlTWFzayA9IG5ldyBJbnRlZ2VyKEVkaXRvclV0aWxpdHkuY29tcHV0ZVN0YXRlTWFzayhmVGV4dEhvdmVyc1tpXS5nZXRNb2RpZmllclN0cmluZygpKSk7Ci0JCQkJaWYgKHN0YXRlTWFzay5pbnRWYWx1ZSgpID09IC0xKQotCQkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzSW5mbyhJU3RhdHVzLkVSUk9SLCBOTFMuYmluZChTU0VVSU1lc3NhZ2VzLlRleHRIb3ZlclByZWZlcmVuY2VUYWJfbW9kaWZpZXJJc05vdFZhbGlkRm9ySG92ZXIsIG5ldyBTdHJpbmdbXXtmVGV4dEhvdmVyc1tpXS5nZXRNb2RpZmllclN0cmluZygpLCBsYWJlbH0pKTsKLQkJCQllbHNlIGlmIChzdGF0ZU1hc2tzLmNvbnRhaW5zS2V5KHN0YXRlTWFzaykpCi0JCQkJCXN0YXR1cyA9IG5ldyBTdGF0dXNJbmZvKElTdGF0dXMuRVJST1IsIE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9kdXBsaWNhdGVNb2RpZmllciwgbmV3IFN0cmluZ1tde2xhYmVsLCAoU3RyaW5nKSBzdGF0ZU1hc2tzLmdldChzdGF0ZU1hc2spfSkpOwotCQkJCWVsc2UKLQkJCQkJc3RhdGVNYXNrcy5wdXQoc3RhdGVNYXNrLCBsYWJlbCk7Ci0JCQl9Ci0JCQlpKys7Ci0JCX0KLQotCQl1cGRhdGVTdGF0dXMoc3RhdHVzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvVHJhbnNsdWNlbmN5UHJlZmVyZW5jZVRhYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1RyYW5zbHVjZW5jeVByZWZlcmVuY2VUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA4YTk5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvVHJhbnNsdWNlbmN5UHJlZmVyZW5jZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JbnRlZ2VyRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlN0cmluZ0ZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRWRpdG9yUHJlZmVyZW5jZU5hbWVzOwotCi1wdWJsaWMgY2xhc3MgVHJhbnNsdWNlbmN5UHJlZmVyZW5jZVRhYiBpbXBsZW1lbnRzIElQcmVmZXJlbmNlVGFiIHsKLQotCXByaXZhdGUgUHJlZmVyZW5jZVBhZ2UgZk1haW5QcmVmZXJlbmNlUGFnZTsKLQlwcml2YXRlIEludGVnZXJGaWVsZEVkaXRvciBmVHJhbnNsdWNlbmN5U2NhbGUgPSBudWxsOwotCXByaXZhdGUgZmluYWwgaW50IE1BWF9QRVJDRU5UQUdFID0gMTAwOwotCi0JcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB2YWxpZGl0eUNoYW5nZUxpc3RlbmVyID0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoRmllbGRFZGl0b3IuSVNfVkFMSUQpKQotCQkJCXVwZGF0ZVZhbGlkU3RhdGUoKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFRyYW5zbHVjZW5jeVByZWZlcmVuY2VUYWIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFRyYW5zbHVjZW5jeVByZWZlcmVuY2VUYWIoUHJlZmVyZW5jZVBhZ2UgbWFpblByZWZlcmVuY2VQYWdlKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobWFpblByZWZlcmVuY2VQYWdlKTsKLQkJc2V0TWFpblByZWZlcmVuY2VQYWdlKG1haW5QcmVmZXJlbmNlUGFnZSk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudWkuSVByZWZlcmVuY2VUYWIjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSB0YWJGb2xkZXIpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiRm9sZGVyLCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJU3RyaW5nIHRleHQgPSBTU0VVSU1lc3NhZ2VzLlRyYW5zbHVjZW5jeVByZWZlcmVuY2VUYWJfMTsgLy8kTk9OLU5MUy0xJAotCQlmVHJhbnNsdWNlbmN5U2NhbGUgPSBuZXcgSW50ZWdlckZpZWxkRWRpdG9yKEVkaXRvclByZWZlcmVuY2VOYW1lcy5SRUFEX09OTFlfRk9SRUdST1VORF9TQ0FMRSwgdGV4dCwgY29tcG9zaXRlKTsKLQotCQlmVHJhbnNsdWNlbmN5U2NhbGUuc2V0RXJyb3JNZXNzYWdlKEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiU3RyaW5nRmllbGRFZGl0b3IuZXJyb3JNZXNzYWdlIikpOy8vJE5PTi1OTFMtMSQKLQkJZlRyYW5zbHVjZW5jeVNjYWxlLnNldFByZWZlcmVuY2VTdG9yZShnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCWZUcmFuc2x1Y2VuY3lTY2FsZS5zZXRQcmVmZXJlbmNlUGFnZShnZXRNYWluUHJlZmVyZW5jZVBhZ2UoKSk7Ci0JCWZUcmFuc2x1Y2VuY3lTY2FsZS5zZXRUZXh0TGltaXQoSW50ZWdlci50b1N0cmluZyhNQVhfUEVSQ0VOVEFHRSkubGVuZ3RoKCkpOwotCQlmVHJhbnNsdWNlbmN5U2NhbGUuc2V0VmFsaWRhdGVTdHJhdGVneShTdHJpbmdGaWVsZEVkaXRvci5WQUxJREFURV9PTl9LRVlfU1RST0tFKTsKLQkJZlRyYW5zbHVjZW5jeVNjYWxlLnNldFZhbGlkUmFuZ2UoMCwgTUFYX1BFUkNFTlRBR0UpOwotCQlmVHJhbnNsdWNlbmN5U2NhbGUubG9hZCgpOwotCQlmVHJhbnNsdWNlbmN5U2NhbGUuc2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih2YWxpZGl0eUNoYW5nZUxpc3RlbmVyKTsKLQotLy8JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuUFJFRldFQlhfUkVBRE9OTFlfSEVMUElEKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZNYWluUHJlZmVyZW5jZVBhZ2UuCi0JICovCi0JcHJpdmF0ZSBQcmVmZXJlbmNlUGFnZSBnZXRNYWluUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXJldHVybiBmTWFpblByZWZlcmVuY2VQYWdlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJlZmVyZW5jZSBzdG9yZSB1c2VkIGluIHRoaXMgdGFiCi0JICovCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudWkuSVByZWZlcmVuY2VUYWIjZ2V0VGl0bGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiBTU0VVSU1lc3NhZ2VzLlRyYW5zbHVjZW5jeVByZWZlcmVuY2VUYWJfMDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5JUHJlZmVyZW5jZVRhYiNwZXJmb3JtQXBwbHkoKQotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseSgpIHsKLQkJZlRyYW5zbHVjZW5jeVNjYWxlLnN0b3JlKCk7Ci0JCVNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudWkuSVByZWZlcmVuY2VUYWIjcGVyZm9ybURlZmF1bHRzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWZUcmFuc2x1Y2VuY3lTY2FsZS5sb2FkRGVmYXVsdCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5JUHJlZmVyZW5jZVRhYiNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1PaygpIHsKLQkJcGVyZm9ybUFwcGx5KCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1haW5QcmVmZXJlbmNlUGFnZQotCSAqICAgICAgICAgICAgVGhlIGZNYWluUHJlZmVyZW5jZVBhZ2UgdG8gc2V0LgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRNYWluUHJlZmVyZW5jZVBhZ2UoUHJlZmVyZW5jZVBhZ2UgbWFpblByZWZlcmVuY2VQYWdlKSB7Ci0JCWZNYWluUHJlZmVyZW5jZVBhZ2UgPSBtYWluUHJlZmVyZW5jZVBhZ2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVZhbGlkU3RhdGUoKSB7Ci0JCWlmIChnZXRNYWluUHJlZmVyZW5jZVBhZ2UoKSAhPSBudWxsKSB7Ci0JCQlnZXRNYWluUHJlZmVyZW5jZVBhZ2UoKS5zZXRWYWxpZChmVHJhbnNsdWNlbmN5U2NhbGUuaXNWYWxpZCgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL0lTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb2plY3Rpb24vSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZDlhZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb2plY3Rpb24vSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLQotLyoqCi0gKiBJbXBsZW1lbnRvcnMgb2YgdGhpcyBpbnRlcmZhY2Ugd2hpY2ggd2lsbCBjcmVhdGUgYW5kIG1haW50YWluCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbn0KLSAqIG9iamVjdHMgdGhhdCBkZWZpbmUgZm9sZGVkIHJlZ2lvbnMgaW4gdGhlIHRoZQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcn1mb3IgYQotICogc3RydWN0dXJlZCBtb2RlbC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gInN0cnVjdHVyZWR0ZXh0Zm9sZGluZ3Byb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgY29udHJvbHMgd2hldGhlciBmb2xkaW5nIGlzIGVuYWJsZWQgaW4gdGhlCi0JICogU3RydWN0dXJlZCBUZXh0IGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT0xESU5HX0VOQUJMRUQgPSAiZm9sZGluZ0VuYWJsZWQiOyAvLyROT04tTkxTLTEkIAotCi0JLy8gY29waWVkIGludGVyZmFjZSBmcm9tCi0JLy8gb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuZm9sZGluZy5JSmF2YUZvbGRpbmdTdHJ1Y3R1cmVQcm92aWRlcgotCS8qKgotCSAqIEluc3RhbGxzIHRoaXMgc3RydWN0dXJlIHByb3ZpZGVyIG9uIHRoZSBnaXZlbiB2aWV3ZXIuIEltcGxlbWVudGF0aW9ucwotCSAqIHNob3VsZCBsaXN0ZW4gdG8gdGhlIHByb2plY3Rpb24gZXZlbnRzIGdlbmVyYXRlZCBieSA8Y29kZT52aWV3ZXI8L2NvZGU+Ci0JICogYW5kIGVuYWJsZSAvIGRpc2FibGUgZ2VuZXJhdGlvbiBvZiBwcm9qZWN0aW9uIHN0cnVjdHVyZSBhY2NvcmRpbmdseS4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgcHJvamVjdGlvbiB2aWV3ZXIgdGhhdCBkaXNwbGF5cyB0aGUgYW5ub3RhdGlvbnMgY3JlYXRlZAotCSAqICAgICAgICAgICAgYnkgdGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKTsKLQotCS8qKgotCSAqIFVuaW5zdGFsbHMgdGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXIuIEFueSByZWZlcmVuY2VzIHRvIHZpZXdlcnMgc2hvdWxkIGJlCi0JICogY2xlYXJlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKTsKLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhpcyBwcm92aWRlciB3aXRoIHRoZSBjb3JyZWN0IGRvY3VtZW50LiBBc3N1bWVzIHByb2plY3Rpb24KLQkgKiBpcyBlbmFibGVkLiAob3RoZXJ3aXNlLCBvbmx5IGluc3RhbGwgd291bGQgaGF2ZSBiZWVuIGNhbGxlZCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9BZGFwdGVyUHJvcGVydHlTaGVldEVudHJ5TGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQWRhcHRlclByb3BlcnR5U2hlZXRFbnRyeUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThmOTE5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9BZGFwdGVyUHJvcGVydHlTaGVldEVudHJ5TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLQotCi1wdWJsaWMgY2xhc3MgQWRhcHRlclByb3BlcnR5U2hlZXRFbnRyeUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9wZXJ0eVNoZWV0RW50cnkpIHsKLQkJCXJldHVybiAoKElQcm9wZXJ0eVNoZWV0RW50cnkpIGVsZW1lbnQpLmdldEltYWdlKCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQlJUHJvcGVydHlTaGVldEVudHJ5IGVudHJ5ID0gKElQcm9wZXJ0eVNoZWV0RW50cnkpICgoSU5vZGVOb3RpZmllcikgZWxlbWVudCkuZ2V0QWRhcHRlckZvcihJUHJvcGVydHlTaGVldEVudHJ5LmNsYXNzKTsKLQkJCWlmIChlbnRyeSAhPSBudWxsKQotCQkJCXJldHVybiBlbnRyeS5nZXRJbWFnZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRJbWFnZShlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9wZXJ0eVNoZWV0RW50cnkpIHsKLQkJCXJldHVybiAoKElQcm9wZXJ0eVNoZWV0RW50cnkpIGVsZW1lbnQpLmdldFZhbHVlQXNTdHJpbmcoKTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUlQcm9wZXJ0eVNoZWV0RW50cnkgZW50cnkgPSAoSVByb3BlcnR5U2hlZXRFbnRyeSkgKChJTm9kZU5vdGlmaWVyKSBlbGVtZW50KS5nZXRBZGFwdGVyRm9yKElQcm9wZXJ0eVNoZWV0RW50cnkuY2xhc3MpOwotCQkJaWYgKGVudHJ5ICE9IG51bGwpCi0JCQkJcmV0dXJuIGVudHJ5LmdldFZhbHVlQXNTdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9Db25maWd1cmFibGVQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQ29uZmlndXJhYmxlUHJvcGVydHlTaGVldFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFkODQyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9Db25maWd1cmFibGVQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JUGFnZVNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbjsKLQotCi0vKioKLSAqIEEgY29uZmlndXJhYmxlIElQcm9wZXJ0eVNoZWV0UGFnZSBzaW5jZSB0aGUgc3RhbmRhcmQgUHJvcGVydHlTaGVldFBhZ2UgZG9lcwotICogbm90IGV4cG9zZSBpdHMgdmlld2VyIGZpZWxkLgotICovCi0KLXB1YmxpYyBjbGFzcyBDb25maWd1cmFibGVQcm9wZXJ0eVNoZWV0UGFnZSBleHRlbmRzIFByb3BlcnR5U2hlZXRQYWdlIHsKLQlwcml2YXRlIGNsYXNzIE51bGxQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiBleHRlbmRzIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIHsKLQkJcHVibGljIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGdldFByb3BlcnR5U291cmNlUHJvdmlkZXIoSVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBfREVCVUcgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wcm9wZXJ0eVNoZWV0IikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkOzsKLQotCXByaXZhdGUgbG9uZyBfREVCVUdfVElNRSA9IDA7Ci0KLQlwcml2YXRlIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIGZDb25maWd1cmF0aW9uOwotCXByaXZhdGUgT2JqZWN0W10gZlNlbGVjdGVkRW50cmllcyA9IG51bGw7Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uIGZJbnB1dCA9IG51bGw7Ci0JcHJpdmF0ZSBJTWVudU1hbmFnZXIgZk1lbnVNYW5hZ2VyOwotCi0JcHJpdmF0ZSBSZW1vdmVBY3Rpb24gZlJlbW92ZUFjdGlvbjsKLQotCXByaXZhdGUgSVN0YXR1c0xpbmVNYW5hZ2VyIGZTdGF0dXNMaW5lTWFuYWdlcjsKLQotCXByaXZhdGUgSVRvb2xCYXJNYW5hZ2VyIGZUb29sQmFyTWFuYWdlcjsKLQotCXByaXZhdGUgZmluYWwgUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gTlVMTF9DT05GSUdVUkFUSU9OID0gbmV3IE51bGxQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbigpOwotCi0JcHVibGljIENvbmZpZ3VyYWJsZVByb3BlcnR5U2hlZXRQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKGdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKHRoaXMpKTsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXNldENvbmZpZ3VyYXRpb24obnVsbCk7Ci0JCWdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkucmVtb3ZlUG9zdFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmIChmQ29uZmlndXJhdGlvbiA9PSBudWxsKQotCQkJZkNvbmZpZ3VyYXRpb24gPSBOVUxMX0NPTkZJR1VSQVRJT047Ci0JCXJldHVybiBmQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVFbnRyeVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoZ2V0Q29udHJvbCgpICE9IG51bGwgJiYgIWdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkgJiYgc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCXN1cGVyLmhhbmRsZUVudHJ5U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlmU2VsZWN0ZWRFbnRyaWVzID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0FycmF5KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmU2VsZWN0ZWRFbnRyaWVzID0gbnVsbDsKLQkJCX0KLQkJCWZSZW1vdmVBY3Rpb24uc2V0RW5hYmxlZCghc2VsZWN0aW9uLmlzRW1wdHkoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElQYWdlU2l0ZSBwYWdlU2l0ZSkgewotCQlzdXBlci5pbml0KHBhZ2VTaXRlKTsKLQkJcGFnZVNpdGUuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2VsZWN0aW9uU2VydmljZSgpLmFkZFBvc3RTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYWtlQ29udHJpYnV0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsIElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciwgSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyKSB7Ci0JCXN1cGVyLm1ha2VDb250cmlidXRpb25zKG1lbnVNYW5hZ2VyLCB0b29sQmFyTWFuYWdlciwgc3RhdHVzTGluZU1hbmFnZXIpOwotCQlmTWVudU1hbmFnZXIgPSBtZW51TWFuYWdlcjsKLQkJZlRvb2xCYXJNYW5hZ2VyID0gdG9vbEJhck1hbmFnZXI7Ci0JCWZTdGF0dXNMaW5lTWFuYWdlciA9IHN0YXR1c0xpbmVNYW5hZ2VyOwotCi0JCWZSZW1vdmVBY3Rpb24gPSBuZXcgUmVtb3ZlQWN0aW9uKHRoaXMpOwotCQl0b29sQmFyTWFuYWdlci5hZGQoZlJlbW92ZUFjdGlvbik7Ci0JCW1lbnVNYW5hZ2VyLmFkZChmUmVtb3ZlQWN0aW9uKTsKLQkJZ2V0Q29uZmlndXJhdGlvbigpLmFkZENvbnRyaWJ1dGlvbnMobWVudU1hbmFnZXIsIHRvb2xCYXJNYW5hZ2VyLCBzdGF0dXNMaW5lTWFuYWdlcik7Ci0KLQkJbWVudU1hbmFnZXIudXBkYXRlKHRydWUpOwotCX0KLQotCXZvaWQgcmVtb3ZlKCkgewotCQlpZiAoZlNlbGVjdGVkRW50cmllcyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBlbnRyaWVzID0gZlNlbGVjdGVkRW50cmllczsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZklucHV0OwotCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJSVByb3BlcnR5U291cmNlIHNvdXJjZSA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKHRoaXMpLmdldFByb3BlcnR5U291cmNlKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UgaW5zdGFuY2VvZiBJUHJvcGVydHlTb3VyY2VFeHRlbnNpb24pIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoZW50cmllc1tpXSBpbnN0YW5jZW9mIElQcm9wZXJ0eVNoZWV0RW50cnkpIHsKLQkJCQkJCQlJUHJvcGVydHlTaGVldEVudHJ5IGVudHJ5ID0gKElQcm9wZXJ0eVNoZWV0RW50cnkpIGVudHJpZXNbaV07Ci0JCQkJCQkJKChJUHJvcGVydHlTb3VyY2VFeHRlbnNpb24pIHNvdXJjZSkucmVtb3ZlUHJvcGVydHkoZW50cnkuZ2V0RGlzcGxheU5hbWUoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEZpbHRlciB0aGUgc2VsZWN0aW9uIHRocm91Z2ggdGhlIGN1cnJlbnQgQ29uZmlndXJhdGlvbi4gTm90IGV2ZXJ5Ci0JICogc2VsZWN0aW9uIHJlY2VpdmVkIGlzIGEgU3RydWN0dXJlZCBzZWxlY3Rpb24gbm9yIGFyZSB0aGUgU3RydWN0dXJlZAotCSAqIHNlbGVjdGlvbidzIGVsZW1lbnRzIGFsbCB0byBiZSBkaXNwbGF5ZWQuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChfREVCVUcpIHsKLQkJCV9ERUJVR19USU1FID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJaWYgKGdldENvbnRyb2woKSAhPSBudWxsICYmIGdldENvbnRyb2woKS5pc1Zpc2libGUoKSAmJiAhZ2V0Q29udHJvbCgpLmlzRm9jdXNDb250cm9sKCkpIHsKLQkJCUlTZWxlY3Rpb24gcHJlZmVycmVkU2VsZWN0aW9uID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldElucHV0U2VsZWN0aW9uKHBhcnQsIHNlbGVjdGlvbik7Ci0JCQkvKgotCQkJICogRG8gc29tZSBtaW5vciBjYWNoaW5nIG9mIHRoZSBzZWxlY3Rpb24uCi0JCQkgKiAKLQkJCSAqIEFzIGEgUHJvcGVydHlTaGVldFBhZ2UsIHdlJ3ZlIGFsd2F5cyBub3RpZmllZCBvZiBzZWxlY3Rpb24KLQkJCSAqIGNoYW5nZXMsIGJ1dCB3ZSd2ZSBhbHNvIHN1YnNjcmliZWQgdG8gcG9zdCBzZWxlY3Rpb24KLQkJCSAqIG5vdGlmaWNhdGlvbiBzbyB3ZSBjYW4gdHJhY2sgY2FyZXQgbW92ZW1lbnRzIGluIHNvdXJjZSB2aWV3ZXJzLgotCQkJICogV2hlbiBzZWxlY3RpbmcgYSBibG9jayBvZiB0ZXh0LCB3ZSdyZSB0aHVzIG5vdGlmaWVkIG9mIHRoZSBuZXcKLQkJCSAqIHNlbGVjdGlvbiB0d2ljZS4gUmVtZW1iZXJpbmcgd2hhdCBvdXIgbGFzdCAqZWZmZWN0aXZlKgotCQkJICogc2VsZWN0aW9uIHdhcyBhbGxvd3MgdXMgdG8gY3V0IG91dCBtb3N0IG9mIHRoZQotCQkJICogZG91YmxlLW5vdGlmaWNhdGlvbiBwZW5hbHR5LgotCQkJICovCi0JCQlpZiAoIXByZWZlcnJlZFNlbGVjdGlvbi5lcXVhbHMoZklucHV0KSkgewotCQkJCWZJbnB1dCA9IHByZWZlcnJlZFNlbGVjdGlvbjsKLQkJCQlmU2VsZWN0ZWRFbnRyaWVzID0gbnVsbDsKLQkJCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHBhcnQsIHByZWZlcnJlZFNlbGVjdGlvbik7Ci0JCQl9Ci0KLQkJCWlmIChfREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIihQOnNlcnZpY2UgIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIF9ERUJVR19USU1FKSArICJtcykgIiArIHBhcnQgKyAiIDogIiArICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHByZWZlcnJlZFNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKF9ERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJbc2tpcHBlZF0gKFA6IiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIF9ERUJVR19USU1FKSArICJtcykgIiArIHBhcnQgKyAiIDogIiArIHNlbGVjdGlvbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotCSAqICAgICAgICAgICAgVGhlIGNvbmZpZ3VyYXRpb24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb24oUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQlpZiAoZkNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJZkNvbmZpZ3VyYXRpb24ucmVtb3ZlQ29udHJpYnV0aW9ucyhmTWVudU1hbmFnZXIsIGZUb29sQmFyTWFuYWdlciwgZlN0YXR1c0xpbmVNYW5hZ2VyKTsKLQkJCWZDb25maWd1cmF0aW9uLnVuY29uZmlndXJlKCk7Ci0JCX0KLQotCQlmQ29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0KLQkJaWYgKGZDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLQkJCXNldFByb3BlcnR5U291cmNlUHJvdmlkZXIoZkNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcih0aGlzKSk7Ci0JCQlmQ29uZmlndXJhdGlvbi5hZGRDb250cmlidXRpb25zKGZNZW51TWFuYWdlciwgZlRvb2xCYXJNYW5hZ2VyLCBmU3RhdHVzTGluZU1hbmFnZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCXN1cGVyLnNldEZvY3VzKCk7Ci0KLQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQlJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IgPSBhY3RpdmVQYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJaWYgKGFjdGl2ZUVkaXRvciAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvclNpdGUgZWRpdG9yU2l0ZSA9IGFjdGl2ZUVkaXRvci5nZXRFZGl0b3JTaXRlKCk7Ci0JCQkJaWYgKGVkaXRvclNpdGUgIT0gbnVsbCkgewotCQkJCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSBlZGl0b3JTaXRlLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQkJCWlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJCQlzZWxlY3Rpb25DaGFuZ2VkKGFjdGl2ZUVkaXRvciwgc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQ3VzdG9tUHJvcGVydHlEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9DdXN0b21Qcm9wZXJ0eURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0ODYxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9DdXN0b21Qcm9wZXJ0eURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlEZXNjcmlwdG9yOwotCi1wdWJsaWMgY2xhc3MgQ3VzdG9tUHJvcGVydHlEZXNjcmlwdG9yIGV4dGVuZHMgUHJvcGVydHlEZXNjcmlwdG9yIHsKLQotCXByb3RlY3RlZCBDbGFzcyBjZWxsRWRpdG9yQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyBhIHByb3BlcnR5IGRlc2NyaXB0b3Igd2l0aCBhIHVuaXF1ZSBuYW1lIGFuZCBhIGRpc3BsYXkgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIHRoZSBpZCBmb3IgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIGRpc3BsYXlOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSB0byBkaXNwbGF5IGZvciB0aGUgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgQ3VzdG9tUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBpZCwgU3RyaW5nIG5ld0Rpc3BsYXlOYW1lLCBDbGFzcyBlZGl0b3JDbGFzcykgewotCQlzdXBlcihpZCwgbmV3RGlzcGxheU5hbWUpOwotCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKSBpZCk7Ci0JCXNldENlbGxFZGl0b3JDbGFzcyhlZGl0b3JDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHByb3BlcnR5IGRlc2NyaXB0b3Igd2l0aCBhIHVuaXF1ZSBuYW1lIGFuZCBhIGRpc3BsYXkgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gdW5pcXVlTmFtZQotCSAqICAgICAgICAgICAgdGhlIHVuaXF1ZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEBwYXJhbSBkaXNwbGF5TmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgdG8gZGlzcGxheSBmb3IgdGhlIHByb3BlcnR5Ci0JICovCi0JcHVibGljIEN1c3RvbVByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgdW5pcXVlTmFtZSwgU3RyaW5nIG5ld0Rpc3BsYXlOYW1lKSB7Ci0JCXRoaXModW5pcXVlTmFtZSwgbmV3RGlzcGxheU5hbWUsIFRleHRDZWxsRWRpdG9yLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgQ2VsbEVkaXRvciBjcmVhdGVQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBnZXRQcm9wZXJ0eUVkaXRvcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBDbGFzcyBnZXRDZWxsRWRpdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiBjZWxsRWRpdG9yQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdG9yIHVzZWQgdG8gZWRpdCB0aGUgcHJvcGVydHkuCi0JICogCi0JICogQHJldHVybiBhbiBlZGl0b3IgZm9yIHRoZSBwcm9wZXJ0eQotCSAqLwotCXByb3RlY3RlZCBDZWxsRWRpdG9yIGdldFByb3BlcnR5RWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKGdldENlbGxFZGl0b3JDbGFzcygpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb25zdHJ1Y3RvciA9IGdldENlbGxFZGl0b3JDbGFzcygpLmdldERlY2xhcmVkQ29uc3RydWN0b3IobmV3IENsYXNzW117Q29tcG9zaXRlLmNsYXNzfSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7Ci0JCQlyZXR1cm4gbmV3IFRleHRDZWxsRWRpdG9yKHBhcmVudCk7Ci0JCX0KLQkJaWYgKGNvbnN0cnVjdG9yICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIChDZWxsRWRpdG9yKSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W117cGFyZW50fSk7Ci0JCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGllKSB7Ci0JCQl9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IFRleHRDZWxsRWRpdG9yKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2VsbEVkaXRvckNsYXNzKENsYXNzIG5ld0NlbGxFZGl0b3JDbGFzcykgewotCQljZWxsRWRpdG9yQ2xhc3MgPSBuZXdDZWxsRWRpdG9yQ2xhc3M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvUmVtb3ZlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9SZW1vdmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAyYTEyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9SZW1vdmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByaXZhdGUgQ29uZmlndXJhYmxlUHJvcGVydHlTaGVldFBhZ2UgZlBhZ2U7Ci0KLQlwdWJsaWMgUmVtb3ZlQWN0aW9uKENvbmZpZ3VyYWJsZVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UpIHsKLQkJc3VwZXIoKTsKLQkJZlBhZ2UgPSBwYWdlOwotCQlzZXRUZXh0KGdldFRleHQoKSk7Ci0JCXNldFRvb2xUaXBUZXh0KGdldFRleHQoKSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VMQ0xfREVMRVRFKSk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRExDTF9ERUxFVEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jZ2V0VGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5SZW1vdmVBY3Rpb25fMDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWZQYWdlLnJlbW92ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1Nob3dQcm9wZXJ0aWVzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9TaG93UHJvcGVydGllc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjg3ZTBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1Nob3dQcm9wZXJ0aWVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TaG93Vmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotCi0vKioKLSAqIFN1cmZhY2VzIHRoZSBQcm9wZXJ0aWVzIHZpZXcKLSAqIAotICogQGF1dGhvciBOaXRpbiBEYWh5YWJoYWkKLSAqLwotcHVibGljIGNsYXNzIFNob3dQcm9wZXJ0aWVzQWN0aW9uIGV4dGVuZHMgU2hvd1ZpZXdBY3Rpb24gewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBWSUVXX0lEID0gIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgU2hvd1Byb3BlcnRpZXNBY3Rpb24oKSB7Ci0JCXN1cGVyKFNTRVVJTWVzc2FnZXMuU2hvd1Byb3BlcnRpZXNBY3Rpb25fMCwgRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUFJPUF9QUykpOyAvLyROT04tTkxTLTEkCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywgSUhlbHBDb250ZXh0SWRzLkNPTlRNTlVfUFJPUEVSVElFU19IRUxQSUQpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Vmlld0lEKCkgewotCQlyZXR1cm4gVklFV19JRDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcHJlZmVyZW5jZXMvQ29tbW9uRWRpdG9yUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcHJlZmVyZW5jZXMvQ29tbW9uRWRpdG9yUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYWEzMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3ByZWZlcmVuY2VzL0NvbW1vbkVkaXRvclByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRWRpdG9yUHJlZmVyZW5jZU5hbWVzOwotCi0vKioKLSAqIENvbW1vbiBlZGl0b3IgcHJlZmVyZW5jZSBrZXlzIHVzZWQgYnkgdGhlIFN0cnVjdHVyZWQgVGV4dCBFZGl0b3IuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29tbW9uRWRpdG9yUHJlZmVyZW5jZU5hbWVzIHsKLQlwcml2YXRlIENvbW1vbkVkaXRvclByZWZlcmVuY2VOYW1lcygpIHsKLQkJLy8gZW1wdHkgcHJpdmF0ZSBjb25zdHJ1Y3RvciBzbyB1c2VycyBjYW5ub3QgaW5zdGFudGlhdGUgY2xhc3MKLQl9Ci0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBjb250cm9scyBhcy15b3UtdHlwZSB2YWxpZGF0aW9uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZBTFVBVEVfVEVNUE9SQVJZX1BST0JMRU1TID0gRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkVWQUxVQVRFX1RFTVBPUkFSWV9QUk9CTEVNUzsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmJmMGQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQWRhcHRlckZhY3RvcnlQcm92aWRlciB7Ci0KLQlwdWJsaWMgdm9pZCBhZGRBZGFwdGVyRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKTsKLQotCS8vIFRPRE9faXNzdWU6IElEb2N1bWVudFR5cGVIYW5kbGVyIGRvZXNuJ3Qgc2VlbSBjb3JyZWN0IGluIHRoaXMgQVBJLgotCS8vIHJlZXhhbWluZSBhbmQgc2VlIGlmIHNob3VsZCBiZSBNb2RlbEhhbmRsZXIsIG9yIENvbnRlbnRUeXBlSWRlbnRpZmVyCi0JLy8gaW5zdGVhZC4KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihJRG9jdW1lbnRUeXBlSGFuZGxlciBjb250ZW50VHlwZURlc2NyaXB0aW9uKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGFkZCB0aG9zZSBmYWN0b3JpZXMgcmVsYXRlZCB0byBlbWJlZGRlZCBjb250ZW50Ci0JICogdHlwZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlaW5pdGlhbGl6ZUZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEwNDMzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogVGhpcyBpcyBiYXNpY2FsbHkgYSAiZmFjdG9yeSBmb3IgZmFjdG9yaWVzIi4gSXQgaXMgdG8gdXNlZCB0byBhc3NvY2lhdGUKLSAqICJlZGl0IHRpbWUiIEFkYXB0ZXJGYWN0b3JpZXMgd2l0aCBhIFN0cnVjdHVyZWRNb2RlbCwgYmFzZWQgb24gdGhlCi0gKiBJU3RydWN0dXJlZE1vZGVsJ3MgQ29udGVudFR5cGVEZXNjcmlwdGlvbi4gSW4gcGx1Z2luLnhtbCBmaWxlcywgdGhlcmUKLSAqIHNob3VsZCBiZSBhbiBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIGRlZmluZWQgZm9yIGV2ZXJ5IGRlZmluaXRpb24gb2YKLSAqIENvbnRlbnRUeXBlRGVzY3JpcHRpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIEl0ZXJhdG9yIG92ZXIgYSBDb2xsZWN0aW9uIG9mIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJzCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRBZGFwdGVyRmFjdG9yaWVzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlSZWdpc3RyeUV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnlFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0NzI2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlSZWdpc3RyeUV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQWRhcHRlckZhY3RvcnlSZWdpc3RyeUV4dGVuc2lvbiB7Ci0JSXRlcmF0b3IgZ2V0QWRhcHRlckZhY3RvcmllcyhTdHJpbmcgY29udGVudFR5cGVJRCk7Ci0KLQlMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXNBc0xpc3QoU3RyaW5nIGNvbnRlbnRUeXBlSUQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhlYmY0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGwgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5LCBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5RXh0ZW5zaW9uIHsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkgaW5zdGFuY2UgPSBudWxsOwotCi0Jc3RhdGljIHN5bmNocm9uaXplZCBwdWJsaWMgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8vIHRoaXMgbWFwIGV4aXN0cyBzbyB0aGVyZSBpcyBvbmx5IG9uZSBwcm92aWRlcgotCS8vIGluc3RhbmNlIG5vdCBkdXBsaWNhdGUgcHJvdmlkZXJzIGZvciBkaWZmZXJlbnQgY29udGVudCB0eXBlcwotCXByaXZhdGUgSGFzaE1hcCBhZGFwdGVyUHJvdmlkZXJzID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCS8qKgotCSAqIFRoaXMgSGFzaE1hcCBjb250YWluczogW2NvbnRlbnRUeXBlSWQgLT4gZWxlbWVudDJwcm92aWRlck1hcF0gfCBWCi0JICogW2NvbmZpZ3VyYXRpb25FbGVtZW50IC0+IEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJdCi0JICogCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGhhc2hNYXAgPSBudWxsOwotCi0JLy8gcHJvdmlkZXJzIHdpdGggbm8gY29udGVudCB0eXBlIGFzc29jaWF0ZWQKLQkvLyBqdXN0IGFkZGVkIHRocm91Z2ggdGhlIGFkZCguLi4pIG1ldGhvZAotCXByaXZhdGUgSGFzaFNldCB1bmFzc29jaWF0ZWRQcm92aWRlcnMgPSBudWxsOwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5oYXNoTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJdGhpcy51bmFzc29jaWF0ZWRQcm92aWRlcnMgPSBuZXcgSGFzaFNldCgpOwotCQl0aGlzLmFkYXB0ZXJQcm92aWRlcnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCS8vIGRvZXNuJ3QgaW5zdGFudGlhdGUgY2xhc3NlcywganVzdCBzdG9yZXMgY29uZmlndXJhdGlvbiBlbGVtZW50cwotCQlBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5UmVhZGVyLnJlYWRSZWdpc3RyeShoYXNoTWFwKTsKLQl9Ci0KLQl2b2lkIGFkZChBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIpIHsKLQkJdGhpcy51bmFzc29jaWF0ZWRQcm92aWRlcnMuYWRkKGFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRBZGFwdGVyRmFjdG9yaWVzKCkgewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiR0VUVElORyBBTEwgQURBUFRFUiBGQUNUT1JJRVMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIGFkZCBwcm92aWRlcnMgdGhhdCBoYXZlIG5vIGNvbnRlbnQgdHlwZSBzcGVjaWZpY2F0aW9uCi0JCXJlc3VsdHMuYWRkQWxsKHRoaXMudW5hc3NvY2lhdGVkUHJvdmlkZXJzKTsKLQkJSXRlcmF0b3IgaXQgPSB0aGlzLmhhc2hNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlSWQgPSBudWxsOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQljb250ZW50VHlwZUlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCi0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgKyBmb3I6ICIgKyBjb250ZW50VHlwZUlkKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlyZXN1bHRzLmFkZEFsbChnZXRBZGFwdGVyRmFjdG9yaWVzQXNMaXN0KGNvbnRlbnRUeXBlSWQpKTsKLQkJfQotCi0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdHMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0QWRhcHRlckZhY3RvcmllcyhTdHJpbmcgY29udGVudFR5cGVJRCkgewotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiR0VUVElORyBBREFQVEVSIEZBQ1RPUklFUyBmb3I6ICIgKyBjb250ZW50VHlwZUlEKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIGFkZCBwcm92aWRlcnMgdGhhdCBoYXZlIG5vIGNvbnRlbnQgdHlwZSBzcGVjaWZpY2F0aW9uCi0JCXJlc3VsdHMuYWRkQWxsKHVuYXNzb2NpYXRlZFByb3ZpZGVycyk7Ci0KLQkJLy8gYWRkIHVua25vd24gY29udGVudCB0eXBlIHByb3ZpZGVycyAoZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5KQotCQlyZXN1bHRzLmFkZEFsbChnZXRBZGFwdGVyRmFjdG9yaWVzQXNMaXN0KEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlSZWFkZXIuVU5LTk9XTl9DT05URU5UX1RZUEUpKTsKLQotCQkvLyBhZGQgcHJvdmlkZXJzIGZvciBzcGVjaWZpYyBjb250ZW50IHR5cGUKLQkJcmVzdWx0cy5hZGRBbGwoZ2V0QWRhcHRlckZhY3Rvcmllc0FzTGlzdChQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZUlEKSkpOwotCi0KLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gcmVzdWx0cy5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXNBc0xpc3QoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCUlDb250ZW50VHlwZSB0eXBlID0gY29udGVudFR5cGU7Ci0JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKHR5cGUgIT0gbnVsbCAmJiAhdHlwZS5nZXRJZCgpLmVxdWFscyhJQ29udGVudFR5cGVNYW5hZ2VyLkNUX1RFWFQpKSB7Ci0JCQlyZXN1bHRzLmFkZEFsbChnZXRBZGFwdGVyRmFjdG9yaWVzQXNMaXN0KHR5cGUuZ2V0SWQoKSkpOwotCQkJdHlwZSA9IHR5cGUuZ2V0QmFzZVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBVc2luZyB0aGlzIG5ldyBBUEksIG9ubHkgQWRhcHRlckZhY3RvcnlQcm92aWRlcnMgZm9yIGEgY2VydGFpbiBjb250ZW50Ci0JICogdHlwZSBhcmUgaW5zdGFudGlhdGVkLiBUaGlzIHdpbGwgYWxsb3cgZm9yIHRoZSBtaW5pbXVtIG51bWJlciBvZgotCSAqIHBsdWdpbnMgdG8gYmUgbG9hZGVkIHJhdGhlciB0aGFuIGFsbCB0aGF0IGltcGxlbWVudCB0aGUgYWRhcHRlciBmYWN0b3J5Ci0JICogZXh0ZW5zaW9uIHBvaW50LgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50VHlwZUlECi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXNBc0xpc3QoU3RyaW5nIGNvbnRlbnRUeXBlSUQpIHsKLQotCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gZ2V0IGVsZW1lbnQyUHJvdmlkZXIgbWFwIGZvciBzcGVjaWZpZWQgY29udGVudCB0eXBlCi0JCU9iamVjdCBvID0gaGFzaE1hcC5nZXQoY29udGVudFR5cGVJRCk7Ci0JCWlmIChvICE9IG51bGwpIHsKLQkJCS8vIGluc3RhbnRpYXRlIGlmIG5lY2Vzc2FyeSBmcm9tCi0JCQkvLyBlbGVtZW50MmFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIKLQkJCS8vIG1hcAotCQkJTWFwIGVsZW1lbnQyUHJvdmlkZXIgPSAoTWFwKSBvOwotCQkJSXRlcmF0b3IgaXQgPSBlbGVtZW50MlByb3ZpZGVyLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCQlTdHJpbmcgY2xhc3NuYW1lID0gbnVsbDsKLQkJCU9iamVjdCBleGlzdGluZyA9IG51bGw7Ci0JCQlBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHAgPSBudWxsOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCWVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQkJbyA9IGVsZW1lbnQyUHJvdmlkZXIuZ2V0KGVsZW1lbnQpOwotCQkJCWlmIChvICE9IG51bGwpIHsKLQkJCQkJLy8gdGhpcyBwcm92aWRlciBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQKLQkJCQkJaWYgKERFQlVHKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJhbHJlYWR5IGNyZWF0ZWQ6ICIgKyBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCXJlc3VsdHMuYWRkKG8pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gbmVlZCB0byBjcmVhdGUgdGhlIHByb3ZpZGVyCi0JCQkJCXRyeSB7Ci0JCQkJCQljbGFzc25hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCi0JCQkJCQlpZiAoREVCVUcpCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJhYm91dCB0byBjcmVhdGU6ICIgKyBjbGFzc25hbWUpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCS8vIGNoZWNrIGlmIHdlIGNyZWF0ZWQgb25lIGFscmVhZHkKLQkJCQkJCWV4aXN0aW5nID0gdGhpcy5hZGFwdGVyUHJvdmlkZXJzLmdldChjbGFzc25hbWUpOwotCQkJCQkJaWYgKGV4aXN0aW5nID09IG51bGwpIHsKLQkJCQkJCQkvLyB0aGlzIGlzIHRoZSBvbmx5IHBsYWNlCi0JCQkJCQkJLy8gQWRhcHRlckZhY3RvcnlQcm92aWRlcnMKLQkJCQkJCQkvLyBhcmUgY3JlYXRlZAotCQkJCQkJCXAgPSAoQWRhcHRlckZhY3RvcnlQcm92aWRlcikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVF9DTEFTUyk7IC8vICROT04tTkxTLTEkCi0JCQkJCQkJdGhpcy5hZGFwdGVyUHJvdmlkZXJzLnB1dChjbGFzc25hbWUsIHApOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcCA9IChBZGFwdGVyRmFjdG9yeVByb3ZpZGVyKSBleGlzdGluZzsKLQkJCQkJCX0KLQotCQkJCQkJLy8gYWRkIHRvIGVsZW1lbnQyUHJvdmlkZXIgZm9yIHRoaXMgY29udGVudFR5cGUKLQkJCQkJCWVsZW1lbnQyUHJvdmlkZXIucHV0KGVsZW1lbnQsIHApOwotCQkJCQkJLy8gYWRkIHRvIHJlc3VsdHMgdG8gcmV0dXJuIGZvciB0aGlzIG1ldGhvZAotCQkJCQkJcmVzdWx0cy5hZGQocCk7Ci0KLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBpZiB0aGUgcHJvdmlkZXIgdGhyb3dzIGFueSBleGNlcHRpb24sIGp1c3QgbG9nCi0JCQkJCQkvLyBhbmQKLQkJCQkJCS8vIGNvbnRpbnVlCi0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4M2U1ZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBqdXN0IGNvbnZlcnRzIHdoYXQncyBpbiB0aGUgcGx1Z2lucyByZWdpc3RyeSBpbnRvIGEgZm9ybSBtb3JlCi0gKiBlYXNpbHkgdXNlYWJsZSBieSBvdGhlcnMsIHRoZSBDb250ZW50VHlwZVJlZ2lzdHJ5LgotICovCi1jbGFzcyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5UmVhZGVyIHsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JLy8KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBUQUdfQ09OVEVOVF9UWVBFID0gImNvbnRlbnRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHX05BTUUgPSAiYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVOS05PV05fQ09OVEVOVF9UWVBFID0gInVua25vd24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBhZGRzIGNvbmZpZ3VyYXRpb24gZWxlbWVudCB0byBjb250ZW50VHlwZUlkIG1hcCBbY29udGVudFR5cGVJZCAtPgotCSAqIGVsZW1lbnQycHJvdmlkZXJNYXBdIHwgViBbZWxlbWVudCAtPiBwcm92aWRlcl0KLQkgKiAKLQkgKiBOT1RFOiB0aGlzIGRvZXNuJ3QgY3JlYXRlIHRoZSBwcm92aWRlciB5ZXQsIHRoYXQgbXVzdCBiZSBkb25lIG9uIGRlbWFuZAotCSAqIGFuZCBzdG9yZWQgaW4gdGhlIGFwcHJvcHJpYXRlIGVsZW1lbnQycHJvdmlkZXIKLQkgKiAKLQkgKiBAcGFyYW0gbWFwCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlSWQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkRWxlbWVudEZvckNvbnRlbnRUeXBlKEhhc2hNYXAgbWFwLCBTdHJpbmcgY29udGVudFR5cGVJZCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQotCQlPYmplY3QgbyA9IG1hcC5nZXQoY29udGVudFR5cGVJZCk7Ci0JCWlmIChvID09IG51bGwpIHsKLQkJCUhhc2hNYXAgZWxlbWVudDJwcm92aWRlciA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkvLyBkb24ndCBjcmVhdGUgdGhlIGV4ZWN1dGFibGUgZXh0ZW5zaW9uIHlldAotCQkJZWxlbWVudDJwcm92aWRlci5wdXQoZWxlbWVudCwgbnVsbCk7Ci0JCQltYXAucHV0KGNvbnRlbnRUeXBlSWQsIGVsZW1lbnQycHJvdmlkZXIpOwotCi0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJhZGRlZCAiICsgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKSArICIsIGJ1dCBkaWRuJ3QgY3JlYXRlIGV4ZWMgZXh0ZW5zaW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGVsc2UgewotCQkJLy8gYWRkIGVsZW1lbnQgdG8gdW5rbm93biBsaXN0IChub3QgZXhlY3V0YWJsZSBleHQgeWV0Li4uKQotCQkJSGFzaE1hcCBlbGVtZW50MnByb3ZpZGVyID0gKEhhc2hNYXApIG87Ci0JCQllbGVtZW50MnByb3ZpZGVyLnB1dChlbGVtZW50LCBudWxsKTsKLQotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWRkZWQgIiArIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUykgKyAiIHRvIHVua25vd24gbGlzdCwgYnV0IGRpZG4ndCBjcmVhdGUgZXhlYyBleHRlbnNpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiB0aGUgbWFwIHBhc3NlZCBpbjogW2NvbnRlbnRUeXBlSWQgLT4gZWxlbWVudDJwcm92aWRlck1hcF0gfCBWIFtlbGVtZW50IC0+Ci0JICogcHJvdmlkZXJdCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gbWFwCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQWRhcHRlckZhY3RvcnlQcm92aWRlciByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgSGFzaE1hcCBtYXApIHsKLQotCQlBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgPSBudWxsOwotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19OQU1FKSkgewotCQkJdHJ5IHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlib29sZWFuIHNwZWNpZmllZENvbnRlbnRUeXBlID0gZmFsc2U7Ci0JCQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCkgewotCQkJCQkvLyBjb250ZW50IHR5cGVzIGFyZSBzcGVjaWZpZWQKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKGNoaWxkcmVuW2ldLmdldE5hbWUoKS5lcXVhbHMoVEFHX0NPTlRFTlRfVFlQRSkpIHsKLQkJCQkJCQkvLyBpdCdzIHBvc3NpYmxlIHRvIGhhdmUgbm9uLWNvbnRlbnRUeXBlIGNoaWxkcmVudAotCQkJCQkJCXNwZWNpZmllZENvbnRlbnRUeXBlID0gdHJ1ZTsKLQkJCQkJCQlTdHJpbmcgY29udGVudFR5cGUgPSBjaGlsZHJlbltpXS5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJCQkJCQlhZGRFbGVtZW50Rm9yQ29udGVudFR5cGUobWFwLCBjb250ZW50VHlwZSwgZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFzcGVjaWZpZWRDb250ZW50VHlwZSkgewotCQkJCQkvLyBubyBjb250ZW50IHR5cGUgYXNzb2NpYXRpb24KLQkJCQkJYWRkRWxlbWVudEZvckNvbnRlbnRUeXBlKG1hcCwgVU5LTk9XTl9DT05URU5UX1RZUEUsIGVsZW1lbnQpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWYgdGhlIHByb3ZpZGVyIHRocm93cyBhbnkgZXhjZXB0aW9uLCBqdXN0IGxvZyBhbmQgY29udGludWUKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFdlIHNpbXBseSByZXF1aXJlIGFuICdhZGQnIG1ldGhvZCwgb2Ygd2hhdCBldmVyIGl0IGlzIHdlIGFyZSB0byByZWFkCi0JICogaW50bwotCSAqLwotCXN0YXRpYyB2b2lkIHJlYWRSZWdpc3RyeShIYXNoTWFwIG1hcCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCXJlYWRFbGVtZW50KGVsZW1lbnRzW2ldLCBtYXApOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gbnVsbDsKLQotCS8vICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEFEQVBURVJfQ0xBU1MgPSAiYWRhcHRlckNsYXNzIjsKLQkvLyAvLyROT04tTkxTLTEkCi0JLy8gICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgRE9DX1RZUEVfSUQgPSAiZG9jVHlwZUlkIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIE1JTUVfVFlQRV9MSVNUID0gIm1pbWVUeXBlTGlzdCI7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCS8vCi0JLyoqCi0JICogQ29udGVudFR5cGVSZWdpc3RyeVJlYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL0Fic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNTE4OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL0Fic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkVkaXRvclV0aWxpdHk7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIgewotCXByaXZhdGUgY2xhc3MgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlKG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCS8vIGhhdmUgdG8gZG8gaXQgdGhpcyB3YXkgc28gb3RoZXJzIGNhbiBvdmVycmlkZSB0aGUgbWV0aG9kCi0JCQloYW5kbGVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJvdGVjdGVkIEhpZ2hsaWdodGVyIGZIaWdobGlnaHRlcjsKLQlwcml2YXRlIGJvb2xlYW4gZkluaXRpYWxpemVkOwotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZQcmVmZXJlbmNlTGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCi0JLy9wcml2YXRlIElTb3VyY2VWaWV3ZXIgZlNvdXJjZVZpZXdlciA9IG51bGw7Ci0JcHJvdGVjdGVkIFJlY29uY2lsZXJIaWdobGlnaHRlciBmUmVjSGlnaGxpZ2h0ZXIgPSBudWxsOwotCQotCS8qKiBDb250YWlucyBhbGwgdGV4dCBhdHRyaWJ1dGVzIHBlcnRhaW5pbmcgdG8gdGhpcyBsaW5lIHN0eWxlIHByb3ZpZGVyICovCi0JcHJpdmF0ZSBIYXNoTWFwIGZUZXh0QXR0cmlidXRlcyA9IG51bGw7Ci0KLQkvLyB3ZSBrZWVwIHRyYWNrIG9mIExvZ01lc3NhZ2UgdG8gYXZvaWQgd3JpdGluZyBodW5kcmVkcyBvZiBtZXNzYWdlcywKLQkvLyBidXQgc3RpbGwgZ2l2ZSBhIGhpbnQgdGhhdCBzb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCBhdHRyaWJ1dGVQcm92aWRlcnMKLQkvLyBhbmQvb3IgcmVnaW9ucy4KLQkvLyBJdCdzIG9ubHkgd3JpdHRlbiBpbiB0aGUgY2FzZSBvZiBhIHByb2dyYW0gZXJyb3IsIGJ1dCB0aGVyZSdzIG5vIHVzZQotCS8vIGFkZGluZwotCS8vIHNhbHQgdG8gdGhlIHdvdW5kLgotCS8vIHByaXZhdGUgYm9vbGVhbiB3cm90ZU9uZUxvZ01lc3NhZ2U7Ci0JLyoqCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogTG9va3MgdXAgdGhlIGNvbG9yS2V5IGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlIGFuZCBhZGRzIHRoZSBzdHlsZQotCSAqIGluZm9ybWF0aW9uIHRvIGxpc3Qgb2YgVGV4dEF0dHJpYnV0ZXMKLQkgKiAKLQkgKiBAcGFyYW0gY29sb3JLZXkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUZXh0QXR0cmlidXRlKFN0cmluZyBjb2xvcktleSkgewotCQlpZiAoZ2V0Q29sb3JQcmVmZXJlbmNlcygpICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0Q29sb3JQcmVmZXJlbmNlcygpLmdldFN0cmluZyhjb2xvcktleSk7Ci0JCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMF0pOwotCQkJCVJHQiBiYWNrZ3JvdW5kID0gQ29sb3JIZWxwZXIudG9SR0Ioc3R5bGVQcmVmc1sxXSk7Ci0JCQkJYm9vbGVhbiBib2xkID0gQm9vbGVhbi52YWx1ZU9mKHN0eWxlUHJlZnNbMl0pLmJvb2xlYW5WYWx1ZSgpOwotCQkJCWJvb2xlYW4gaXRhbGljID0gQm9vbGVhbi52YWx1ZU9mKHN0eWxlUHJlZnNbM10pLmJvb2xlYW5WYWx1ZSgpOwotCQkJCWJvb2xlYW4gc3RyaWtldGhyb3VnaCA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzRdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQlib29sZWFuIHVuZGVybGluZSA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzVdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQlpbnQgc3R5bGUgPSBTV1QuTk9STUFMOwotCQkJCWlmIChib2xkKSB7Ci0JCQkJCXN0eWxlID0gc3R5bGUgfCBTV1QuQk9MRDsKLQkJCQl9Ci0JCQkJaWYgKGl0YWxpYykgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgU1dULklUQUxJQzsKLQkJCQl9Ci0JCQkJaWYgKHN0cmlrZXRocm91Z2gpIHsKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IFRleHRBdHRyaWJ1dGUuU1RSSUtFVEhST1VHSDsKLQkJCQl9Ci0JCQkJaWYgKHVuZGVybGluZSkgewotCQkJCQlzdHlsZSA9IHN0eWxlIHwgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkU7Ci0JCQkJfQotCi0JCQkJVGV4dEF0dHJpYnV0ZSBjcmVhdGVUZXh0QXR0cmlidXRlID0gY3JlYXRlVGV4dEF0dHJpYnV0ZShmb3JlZ3JvdW5kLCBiYWNrZ3JvdW5kLCBzdHlsZSk7Ci0JCQkJZ2V0VGV4dEF0dHJpYnV0ZXMoKS5wdXQoY29sb3JLZXksIGNyZWF0ZVRleHRBdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29tbW9uSW5pdChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBIaWdobGlnaHRlciBoaWdobGlnaHRlcikgewotCi0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmSGlnaGxpZ2h0ZXIgPSBoaWdobGlnaHRlcjsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIHZlcnNpb24gZG9lcyAidHJpbSIgcmVnaW9ucyB0byBtYXRjaCByZXF1ZXN0Ci0JICovCi0JcHJpdmF0ZSBTdHlsZVJhbmdlIGNyZWF0ZVN0eWxlUmFuZ2UoSVRleHRSZWdpb25Db2xsZWN0aW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24sIFRleHRBdHRyaWJ1dGUgYXR0ciwgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWludCBzdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCWlmIChzdGFydCA8IHN0YXJ0T2Zmc2V0KQotCQkJc3RhcnQgPSBzdGFydE9mZnNldDsKLQkJCi0JCS8vIEJhc2UgdGhlIHRleHQgZW5kIG9mZnNldCBvZmYgb2YgdGhlLCBwb3NzaWJseSBhZGp1c3RlZCwgc3RhcnQKLQkJaW50IHRleHRFbmQgPSBzdGFydCArIGZsYXROb2RlLmdldFRleHQocmVnaW9uKS5sZW5ndGgoKTsKLQkJaW50IG1heE9mZnNldCA9IHN0YXJ0T2Zmc2V0ICsgbGVuZ3RoOwotCQkKLQkJaW50IGVuZCA9IGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkvLyBVc2UgdGhlIGVuZCBvZiB0aGUgdGV4dCBpbiB0aGUgcmVnaW9uIHRvIGF2b2lkIGFwcGx5aW5nIGJhY2tncm91bmQgY29sb3IgdG8gdHJhaWxpbmcgd2hpdGVzcGFjZQotCQlpZih0ZXh0RW5kIDwgZW5kKQotCQkJZW5kID0gdGV4dEVuZDsKLQkJLy8gaW5zdGVhZCBvZiBlbmQtc3RhcnQ/Ci0JCWlmIChlbmQgPiBtYXhPZmZzZXQpCi0JCQllbmQgPSBtYXhPZmZzZXQ7Ci0JCVN0eWxlUmFuZ2UgcmVzdWx0ID0gbmV3IFN0eWxlUmFuZ2Uoc3RhcnQsIGVuZCAtIHN0YXJ0LCBhdHRyLmdldEZvcmVncm91bmQoKSwgYXR0ci5nZXRCYWNrZ3JvdW5kKCksIGF0dHIuZ2V0U3R5bGUoKSk7Ci0JCWlmKChhdHRyLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0gpICE9IDApIHsKLQkJCXJlc3VsdC5zdHJpa2VvdXQgPSB0cnVlOwotCQl9Ci0JCWlmKChhdHRyLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlVOREVSTElORSkgIT0gMCkgewotCQkJcmVzdWx0LnVuZGVybGluZSA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCXByb3RlY3RlZCBUZXh0QXR0cmlidXRlIGNyZWF0ZVRleHRBdHRyaWJ1dGUoUkdCIGZvcmVncm91bmQsIFJHQiBiYWNrZ3JvdW5kLCBib29sZWFuIGJvbGQpIHsKLQkJcmV0dXJuIG5ldyBUZXh0QXR0cmlidXRlKChmb3JlZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihmb3JlZ3JvdW5kKSA6IG51bGwsIChiYWNrZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihiYWNrZ3JvdW5kKSA6IG51bGwsIGJvbGQgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0QXR0cmlidXRlIGNyZWF0ZVRleHRBdHRyaWJ1dGUoUkdCIGZvcmVncm91bmQsIFJHQiBiYWNrZ3JvdW5kLCBpbnQgc3R5bGUpIHsKLQkJcmV0dXJuIG5ldyBUZXh0QXR0cmlidXRlKChmb3JlZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihmb3JlZ3JvdW5kKSA6IG51bGwsIChiYWNrZ3JvdW5kICE9IG51bGwpID8gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihiYWNrZ3JvdW5kKSA6IG51bGwsIHN0eWxlKTsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKTsKLQkKLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbGxlY3Rpb24sIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlRm9yKHJlZ2lvbik7Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0Q29sb3JQcmVmZXJlbmNlcygpOwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIEhpZ2hsaWdodGVyIGdldEhpZ2hsaWdodGVyKCkgewotCQlyZXR1cm4gZkhpZ2hsaWdodGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhhc2h0YWJsZSBjb250YWluaW5nIGFsbCB0aGUgdGV4dCBhdHRyaWJ1dGVzIGZvciB0aGlzIGxpbmUKLQkgKiBzdHlsZSBwcm92aWRlci4gTGF6aWx5IGNyZWF0ZXMgYSBoYXNodGFibGUgaWYgb25lIGhhcyBub3QgYWxyZWFkeSBiZWVuCi0JICogY3JlYXRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEhhc2hNYXAgZ2V0VGV4dEF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChmVGV4dEF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJZlRleHRBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJCWxvYWRDb2xvcnMoKTsKLQkJfQotCQlyZXR1cm4gZlRleHRBdHRyaWJ1dGVzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZm9yY2UgYSBmdWxsIHVwZGF0ZSBvZiB0aGUgdGV4dCB2aWV3ZXIKLQkJaWYoZlJlY0hpZ2hsaWdodGVyICE9IG51bGwpCi0JCQlmUmVjSGlnaGxpZ2h0ZXIucmVmcmVzaERpc3BsYXkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBIaWdobGlnaHRlciBoaWdobGlnaHRlcikgewotCi0JCWNvbW1vbkluaXQoc3RydWN0dXJlZERvY3VtZW50LCBoaWdobGlnaHRlcik7Ci0KLQkJaWYgKGlzSW5pdGlhbGl6ZWQoKSkKLQkJCXJldHVybjsKLQotCQlyZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0KLQkJc2V0SW5pdGlhbGl6ZWQodHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWluaXQoc3RydWN0dXJlZERvY3VtZW50LCAoSGlnaGxpZ2h0ZXIpIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBSZWNvbmNpbGVySGlnaGxpZ2h0ZXIgaGlnaGxpZ2h0ZXIpCXsKLQkJZkRvY3VtZW50ID0gc3RydWN0dXJlZERvY3VtZW50OwotCQlmUmVjSGlnaGxpZ2h0ZXIgPSBoaWdobGlnaHRlcjsKLQkJCi0JCWlmKGlzSW5pdGlhbGl6ZWQoKSkKLQkJCXJldHVybjsKLQkJCi0JCXJlZ2lzdGVyUHJlZmVyZW5jZU1hbmFnZXIoKTsKLQkJCi0JCXNldEluaXRpYWxpemVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gbGVmdCBiZWNhdXNlIGl0J3MgcHVibGljLCBidXQgd2UgYXJlbid0IGFkYXB0ZXJzIGFueSBtb3JlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUgPT0gTGluZVN0eWxlUHJvdmlkZXIuY2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLQkJcmV0dXJuIGZJbml0aWFsaXplZDsKLQl9Ci0JCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgbG9hZENvbG9ycygpOwotCi0JcHVibGljIGJvb2xlYW4gcHJlcGFyZVJlZ2lvbnMoSVR5cGVkUmVnaW9uIHR5cGVkUmVnaW9uLCBpbnQgbGluZVJlcXVlc3RTdGFydCwgaW50IGxpbmVSZXF1ZXN0TGVuZ3RoLCBDb2xsZWN0aW9uIGhvbGRSZXN1bHRzKSB7Ci0JCWZpbmFsIGludCBwYXJ0aXRpb25TdGFydE9mZnNldCA9IHR5cGVkUmVnaW9uLmdldE9mZnNldCgpOwotCQlmaW5hbCBpbnQgcGFydGl0aW9uTGVuZ3RoID0gdHlwZWRSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZ2V0RG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwYXJ0aXRpb25TdGFydE9mZnNldCk7Ci0JCWJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOwotCi0JCWhhbmRsZWQgPSBwcmVwYXJlVGV4dFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBwYXJ0aXRpb25TdGFydE9mZnNldCwgcGFydGl0aW9uTGVuZ3RoLCBob2xkUmVzdWx0cyk7Ci0KLQkJcmV0dXJuIGhhbmRsZWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqIEBwYXJhbSBzdGFydAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcGFyYW0gaG9sZFJlc3VsdHMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHByZXBhcmVUZXh0UmVnaW9uKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBibG9ja2VkUmVnaW9uLCBpbnQgcGFydGl0aW9uU3RhcnRPZmZzZXQsIGludCBwYXJ0aXRpb25MZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7Ci0JCWZpbmFsIGludCBwYXJ0aXRpb25FbmRPZmZzZXQgPSBwYXJ0aXRpb25TdGFydE9mZnNldCArIHBhcnRpdGlvbkxlbmd0aCAtIDE7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gYmxvY2tlZFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCWludCBuUmVnaW9ucyA9IHJlZ2lvbnMuc2l6ZSgpOwotCQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2UgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5SZWdpb25zOyBpKyspIHsKLQkJCXJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJVGV4dEF0dHJpYnV0ZSBhdHRyID0gbnVsbDsKLQkJCVRleHRBdHRyaWJ1dGUgcHJldmlvdXNBdHRyID0gbnVsbDsKLQkJCWlmIChibG9ja2VkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgPiBwYXJ0aXRpb25FbmRPZmZzZXQpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoYmxvY2tlZFJlZ2lvbi5nZXRFbmRPZmZzZXQocmVnaW9uKSA8PSBwYXJ0aXRpb25TdGFydE9mZnNldCkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCQkJCWhhbmRsZWQgPSBwcmVwYXJlVGV4dFJlZ2lvbigoSVRleHRSZWdpb25Db2xsZWN0aW9uKSByZWdpb24sIHBhcnRpdGlvblN0YXJ0T2Zmc2V0LCBwYXJ0aXRpb25MZW5ndGgsIGhvbGRSZXN1bHRzKTsKLQkJCX0gZWxzZSB7Ci0KLQkJCQlhdHRyID0gZ2V0QXR0cmlidXRlRm9yKGJsb2NrZWRSZWdpb24sIHJlZ2lvbik7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQloYW5kbGVkID0gdHJ1ZTsKLQkJCQkJLy8gaWYgdGhpcyByZWdpb24ncyBhdHRyIGlzIHRoZSBzYW1lIGFzIHByZXZpb3VzIG9uZSwgdGhlbgotCQkJCQkvLyBqdXN0IGFkanVzdCB0aGUgcHJldmlvdXMgc3R5bGUgcmFuZ2UKLQkJCQkJLy8gaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZSBvZiBvbmUKLQkJCQkJLy8gbm90ZTogdG8gdXNlICdlcXVhbHMnIGluIHRoaXMgY2FzZSBpcyBpbXBvcnRhbnQsIHNpbmNlCi0JCQkJCS8vIHNvbWV0aW1lcwotCQkJCQkvLyBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIGF0dHJpYnV0ZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBhCi0JCQkJCS8vIHJlZ2lvbiwgZXZlbiB0aGUKLQkJCQkJLy8gdGhlIGF0dHJpYnV0ZSBoYXMgdGhlIHNhbWUgdmFsdWVzLgotCQkJCQkvLyBUT0RPOiB0aGlzIG5lZWRzIHRvIGJlIGltcHJvdmVkIHRvIGhhbmRsZSByZWFkb25seQotCQkJCQkvLyByZWdpb25zIGNvcnJlY3RseQotCQkJCQlpZiAoKHN0eWxlUmFuZ2UgIT0gbnVsbCkgJiYgKHByZXZpb3VzQXR0ciAhPSBudWxsKSAmJiAocHJldmlvdXNBdHRyLmVxdWFscyhhdHRyKSkpIHsKLQkJCQkJCXN0eWxlUmFuZ2UubGVuZ3RoICs9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN0eWxlUmFuZ2UgPSBjcmVhdGVTdHlsZVJhbmdlKGJsb2NrZWRSZWdpb24sIHJlZ2lvbiwgYXR0ciwgcGFydGl0aW9uU3RhcnRPZmZzZXQsIHBhcnRpdGlvbkxlbmd0aCk7Ci0JCQkJCQlob2xkUmVzdWx0cy5hZGQoc3R5bGVSYW5nZSk7Ci0JCQkJCQkvLyB0ZWNobmljYWxseSBzcGVha2luZywgd2UgZG9uJ3QgbmVlZCB0byB1cGRhdGUKLQkJCQkJCS8vIHByZXZpb3VzQXR0cgotCQkJCQkJLy8gaW4gdGhlIG90aGVyIGNhc2UsIGJlY2F1c2UgdGhlIG90aGVyIGNhc2UgaXMgd2hlbgotCQkJCQkJLy8gaXQgaGFzbid0IGNoYW5nZWQKLQkJCQkJCXByZXZpb3VzQXR0ciA9IGF0dHI7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlwcmV2aW91c0F0dHIgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaGFuZGxlZDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHJlcGFyZVRleHRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpbnQgcGFydGl0aW9uU3RhcnRPZmZzZXQsIGludCBwYXJ0aXRpb25MZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7Ci0JCWZpbmFsIGludCBwYXJ0aXRpb25FbmRPZmZzZXQgPSBwYXJ0aXRpb25TdGFydE9mZnNldCArIHBhcnRpdGlvbkxlbmd0aCAtIDE7Ci0JCXdoaWxlIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCAmJiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSA8PSBwYXJ0aXRpb25FbmRPZmZzZXQpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlpbnQgblJlZ2lvbnMgPSByZWdpb25zLnNpemUoKTsKLQkJCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZSA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5SZWdpb25zOyBpKyspIHsKLQkJCQlyZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQlUZXh0QXR0cmlidXRlIGF0dHIgPSBudWxsOwotCQkJCVRleHRBdHRyaWJ1dGUgcHJldmlvdXNBdHRyID0gbnVsbDsKLQkJCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgPiBwYXJ0aXRpb25FbmRPZmZzZXQpCi0JCQkJCWJyZWFrOwotCQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KHJlZ2lvbikgPD0gcGFydGl0aW9uU3RhcnRPZmZzZXQpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCQkJCQlib29sZWFuIGhhbmRsZWRDb2xsZWN0aW9uID0gKHByZXBhcmVUZXh0UmVnaW9uKChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHJlZ2lvbiwgcGFydGl0aW9uU3RhcnRPZmZzZXQsIHBhcnRpdGlvbkxlbmd0aCwgaG9sZFJlc3VsdHMpKTsKLQkJCQkJaGFuZGxlZCA9ICghaGFuZGxlZCkgPyBoYW5kbGVkQ29sbGVjdGlvbiA6IGhhbmRsZWQ7Ci0JCQkJfSBlbHNlIHsKLQotCQkJCQlhdHRyID0gZ2V0QXR0cmlidXRlRm9yKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVnaW9uKTsKLQkJCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQkJaGFuZGxlZCA9IHRydWU7Ci0JCQkJCQkvLyBpZiB0aGlzIHJlZ2lvbidzIGF0dHIgaXMgdGhlIHNhbWUgYXMgcHJldmlvdXMgb25lLAotCQkJCQkJLy8gdGhlbiBqdXN0IGFkanVzdCB0aGUgcHJldmlvdXMgc3R5bGUgcmFuZ2UKLQkJCQkJCS8vIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2Ugb2Ygb25lCi0JCQkJCQkvLyBub3RlOiB0byB1c2UgJ2VxdWFscycgaW4gdGhpcyBjYXNlIGlzIGltcG9ydGFudCwKLQkJCQkJCS8vIHNpbmNlIHNvbWV0aW1lcwotCQkJCQkJLy8gZGlmZmVyZW50IGluc3RhbmNlcyBvZiBhdHRyaWJ1dGVzIGFyZSBhc3NvY2lhdGVkCi0JCQkJCQkvLyB3aXRoIGEgcmVnaW9uLCBldmVuIHRoZQotCQkJCQkJLy8gdGhlIGF0dHJpYnV0ZSBoYXMgdGhlIHNhbWUgdmFsdWVzLgotCQkJCQkJLy8gVE9ETzogdGhpcyBuZWVkcyB0byBiZSBpbXByb3ZlZCB0byBoYW5kbGUgcmVhZG9ubHkKLQkJCQkJCS8vIHJlZ2lvbnMgY29ycmVjdGx5Ci0JCQkJCQlpZiAoKHN0eWxlUmFuZ2UgIT0gbnVsbCkgJiYgKHByZXZpb3VzQXR0ciAhPSBudWxsKSAmJiAocHJldmlvdXNBdHRyLmVxdWFscyhhdHRyKSkpIHsKLQkJCQkJCQlzdHlsZVJhbmdlLmxlbmd0aCArPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXN0eWxlUmFuZ2UgPSBjcmVhdGVTdHlsZVJhbmdlKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVnaW9uLCBhdHRyLCBwYXJ0aXRpb25TdGFydE9mZnNldCwgcGFydGl0aW9uTGVuZ3RoKTsKLQkJCQkJCQlob2xkUmVzdWx0cy5hZGQoc3R5bGVSYW5nZSk7Ci0JCQkJCQkJLy8gdGVjaG5pY2FsbHkgc3BlYWtpbmcsIHdlIGRvbid0IG5lZWQgdG8gdXBkYXRlCi0JCQkJCQkJLy8gcHJldmlvdXNBdHRyCi0JCQkJCQkJLy8gaW4gdGhlIG90aGVyIGNhc2UsIGJlY2F1c2UgdGhlIG90aGVyIGNhc2UgaXMKLQkJCQkJCQkvLyB3aGVuIGl0IGhhc24ndCBjaGFuZ2VkCi0JCQkJCQkJcHJldmlvdXNBdHRyID0gYXR0cjsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXByZXZpb3VzQXR0ciA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoRGVidWcuc3ludGF4SGlnaGxpZ2h0aW5nICYmICFoYW5kbGVkKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibm90IGhhbmRsZWQgaW4gcHJlcGFyZVJlZ2lvbnMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIGhhbmRsZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJQcmVmZXJlbmNlTWFuYWdlcigpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBwcmVmID0gZ2V0Q29sb3JQcmVmZXJlbmNlcygpOwotCQlpZiAocHJlZiAhPSBudWxsKSB7Ci0JCQlwcmVmLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQl1blJlZ2lzdGVyUHJlZmVyZW5jZU1hbmFnZXIoKTsKLQkJaWYgKGZUZXh0QXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCQlmVGV4dEF0dHJpYnV0ZXMuY2xlYXIoKTsKLQkJCWZUZXh0QXR0cmlidXRlcyA9IG51bGw7Ci0JCX0KLQkJc2V0SW5pdGlhbGl6ZWQoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluaXRpYWxpemVkLgotCSAqIAotCSAqIEBwYXJhbSBpbml0aWFsaXplZAotCSAqICAgICAgICAgICAgVGhlIGluaXRpYWxpemVkIHRvIHNldAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRJbml0aWFsaXplZChib29sZWFuIGluaXRpYWxpemVkKSB7Ci0JCXRoaXMuZkluaXRpYWxpemVkID0gaW5pdGlhbGl6ZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdW5SZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHByZWYgPSBnZXRDb2xvclByZWZlcmVuY2VzKCk7Ci0JCWlmIChwcmVmICE9IG51bGwpIHsKLQkJCXByZWYucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9Db21wYXRpYmxlSGlnaGxpZ2h0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9Db21wYXRpYmxlSGlnaGxpZ2h0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5OGQ3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3R5bGUvQ29tcGF0aWJsZUhpZ2hsaWdodGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVTdHlsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0vKioKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjQyMDkKLSAqIAotICogQ3JlYXRlZCB0byBwcm92aWRlIGNvbXBhdGliaWxpdHkgd2l0aCByZWZyZXNoRGlzcGxheSgpIGFuZCBnZXRUZXh0Vmlld2VyKCkKLSAqIG1ldGhvZHMgb24gdGhlIHN1cGVyY2xhc3MgdGhhdCBtaWdodCBiZSBjYWxsZWQgYnkgTGluZVN0eWxlUHJvdmlkZXJzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29tcGF0aWJsZUhpZ2hsaWdodGVyIGV4dGVuZHMgSGlnaGxpZ2h0ZXIgewotCi0JcHJpdmF0ZSBJVGV4dFZpZXdlciB0ZXh0Vmlld2VyOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkhpZ2hsaWdodGVyI2FkZFByb3ZpZGVyKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3ZpZGVyKFN0cmluZyBwYXJ0aXRpb25UeXBlLCBMaW5lU3R5bGVQcm92aWRlciBwcm92aWRlcikgewotCQlzdXBlci5hZGRQcm92aWRlcihwYXJ0aXRpb25UeXBlLCBwcm92aWRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkhpZ2hsaWdodGVyI2dldFRleHRWaWV3ZXIoKQotCSAqLwotCXB1YmxpYyBJVGV4dFZpZXdlciBnZXRUZXh0Vmlld2VyKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dFZpZXdlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5IaWdobGlnaHRlciNpbnN0YWxsKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIpCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChJVGV4dFZpZXdlciBuZXdUZXh0Vmlld2VyKSB7Ci0JCXRleHRWaWV3ZXIgPSBuZXdUZXh0Vmlld2VyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5IaWdobGlnaHRlciNsaW5lR2V0U3R5bGUoaW50LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBTdHlsZVJhbmdlW10gbGluZUdldFN0eWxlKGludCBldmVudExpbmVPZmZzZXQsIGludCBldmVudExpbmVMZW5ndGgpIHsKLQkJcmV0dXJuIG5ldyBTdHlsZVJhbmdlWzBdOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5IaWdobGlnaHRlciNsaW5lR2V0U3R5bGUob3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5MaW5lU3R5bGVFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaW5lR2V0U3R5bGUoTGluZVN0eWxlRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuSGlnaGxpZ2h0ZXIjcmVmcmVzaERpc3BsYXkoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hEaXNwbGF5KCkgewotCQlpZiAodGV4dFZpZXdlciAhPSBudWxsKQotCQkJdGV4dFZpZXdlci5pbnZhbGlkYXRlVGV4dFByZXNlbnRhdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5IaWdobGlnaHRlciNyZWZyZXNoRGlzcGxheShpbnQsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaERpc3BsYXkoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJlZnJlc2hEaXNwbGF5KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkhpZ2hsaWdodGVyI3JlbW92ZVByb3ZpZGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvdmlkZXIoU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuSGlnaGxpZ2h0ZXIjc2V0RG9jdW1lbnQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5IaWdobGlnaHRlciNzZXREb2N1bWVudFBhcnRpdGlvbmluZyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50UGFydGl0aW9uaW5nKFN0cmluZyBwYXJ0aXRpb25pbmcpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuSGlnaGxpZ2h0ZXIjdW5pbnN0YWxsKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCXRleHRWaWV3ZXIgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9IaWdobGlnaHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL0hpZ2hsaWdodGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MWMyMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL0hpZ2hsaWdodGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXJFeHRlbnNpb241OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVTdHlsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkVkaXRvclByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuRWRpdG9yVXRpbGl0eTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRvIGRpcmVjdGx5IG1lZGlhdGUgYmV0d2VlbiB0aGUgU3RydWN0dXJlZCBEb2N1bWVudCBkYXRhCi0gKiBzdHJ1Y3R1cmUgYW5kIHRoZSB0ZXh0IHdpZGdldCdzIHRleHQgYW5kIGV2ZW50cy4gSXQgYXNzdW1lcyB0aGVyZSBvbmx5IHRoZQotICogbW9kZWwgaXMgaW50ZXJlc3RlZCBpbiB0ZXh0IGV2ZW50cywgYW5kIGFsbCBvdGhlciB2aWV3cyB3aWxsIHdvcmsgZnJvbSB0aGF0Ci0gKiBtb2RlbC4gQ2hhbmdlcyB0byB0aGUgdGV4dCB3aWRnZXRzIGlucHV0IGNhbiBjYXVzZSBjaGFuZ2VzIGluIHRoZSBtb2RlbCwKLSAqIHdoaWNoIGluIHR1cm4gY2F1c2UgY2hhbmdlcyB0byB0aGUgd2lkZ2V0J3MgZGlzcGxheS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSGlnaGxpZ2h0ZXIgaW1wbGVtZW50cyBJSGlnaGxpZ2h0ZXIgewotCi0JLyoqCi0JICogQSB1dGlsaXR5IGNsYXNzIHRvIGRvIHZhcmlvdXMgY29sb3IgbWFuaXB1bGF0aW9ucwotCSAqLwotCXByaXZhdGUgY2xhc3MgWVVWX1JHQkNvbnZlcnRlciB7Ci0JCS8qKgotCQkgKiBUaGlzIGNsYXNzICJob2xkcyIgdGhlIFlVViB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBSR0IgY29sb3IKLQkJICovCi0JCXByaXZhdGUgY2xhc3MgWVVWIHsKLQotCQkJY2xhc3MgTm9ybWFsaXplZFJHQiB7Ci0JCQkJZG91YmxlIGJsdWU7Ci0JCQkJZG91YmxlIGdyZWVuOwotCQkJCXByaXZhdGUgZmluYWwgZG91YmxlIG1heFJHQiA9IDI1Ni4wOwotCQkJCWRvdWJsZSByZWQ7Ci0KLQkJCQlwdWJsaWMgTm9ybWFsaXplZFJHQihSR0IgcmdiKSB7Ci0JCQkJCS8vIGZpcnN0IG5vcm1hbGl6ZSB0byBiZXR3ZWVuIDAgLSAxCi0JCQkJCXJlZCA9IHJnYi5yZWQgLyBtYXhSR0I7Ci0JCQkJCWdyZWVuID0gcmdiLmdyZWVuIC8gbWF4UkdCOwotCQkJCQlibHVlID0gcmdiLmJsdWUgLyBtYXhSR0I7Ci0KLQkJCQkJcmVkID0gZ2FtbWFOb3JtYWxpemVkKHJlZCk7Ci0JCQkJCWdyZWVuID0gZ2FtbWFOb3JtYWxpemVkKGdyZWVuKTsKLQkJCQkJYmx1ZSA9IGdhbW1hTm9ybWFsaXplZChibHVlKTsKLQotCQkJCX0KLQkJCX0KLQotCQkJcHJpdmF0ZSBOb3JtYWxpemVkUkdCIG5vcm1hbGl6ZWRSR0I7Ci0KLQkJCVJHQiBvcmlnaW5hbFJHQjsKLQkJCXByaXZhdGUgZG91YmxlIHUgPSAtMTsKLQkJCXByaXZhdGUgZG91YmxlIHYgPSAtMTsKLQkJCXByaXZhdGUgZG91YmxlIHkgPSAtMTsKLQotCQkJcHJpdmF0ZSBZVVYoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQotCQkJcHVibGljIFlVVihkb3VibGUgeSwgZG91YmxlIHUsIGRvdWJsZSB2KSB7Ci0JCQkJdGhpcygpOwotCQkJCXRoaXMueSA9IHk7Ci0JCQkJdGhpcy51ID0gdTsKLQkJCQl0aGlzLnYgPSB2OwotCQkJfQotCi0JCQlwdWJsaWMgWVVWKFJHQiByZ2IpIHsKLQkJCQl0aGlzKCk7Ci0JCQkJb3JpZ2luYWxSR0IgPSByZ2I7Ci0JCQkJbm9ybWFsaXplZFJHQiA9IG5ldyBOb3JtYWxpemVkUkdCKHJnYik7Ci0JCQkJLy8gZm9yY2UgY2FsY3VsYXRpb25zCi0JCQkJZ2V0WSgpOwotCQkJCWdldFYoKTsKLQkJCQlnZXRVKCk7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogbm9ybWFsaXplIHRvICJhdmVyYWdlIiBnYW1tYSAyLjIyMjIgb3IgMS8wLjQ1Ci0JCQkgKi8KLQkJCWRvdWJsZSBnYW1tYU5vcm1hbGl6ZWQoZG91YmxlIGNvbG9yQ29tcG9uZW50KSB7Ci0JCQkJaWYgKGNvbG9yQ29tcG9uZW50IDwgMC4wMTgpIHsKLQkJCQkJcmV0dXJuIGNvbG9yQ29tcG9uZW50ICogMC40NTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiAxLjA5OSAqIE1hdGgucG93KGNvbG9yQ29tcG9uZW50LCAwLjQ1KSAtIDAuMDk5OwotCQkJCX0KLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAcmV0dXJuIFJHQiBiYXNlZCBvbiBvcmlnaW5hbCBSR0IgYW5kIGN1cnJlbnQgWVVWIHZhbHVlczsKLQkJCSAqLwotCQkJcHVibGljIFJHQiBnZXRSR0IoKSB7Ci0JCQkJUkdCIHJlc3VsdCA9IG51bGw7Ci0JCQkJZG91YmxlIHIgPSBnZXRZKCkgKyAxLjE0ICogZ2V0VigpOwotCQkJCWRvdWJsZSBnID0gZ2V0WSgpIC0gMC4zOTUgKiBnZXRVKCkgLSAwLjU4ICogZ2V0VigpOwotCQkJCWRvdWJsZSBiID0gZ2V0WSgpICsgMi4wMzIgKiBnZXRVKCk7Ci0KLQkJCQlpbnQgcmVkID0gKGludCkgKGludmVyc2VHYW1tYU5vcm1hbGl6ZWQocikgKiAyNTYpOwotCQkJCWludCBncmVlbiA9IChpbnQpIChpbnZlcnNlR2FtbWFOb3JtYWxpemVkKGcpICogMjU2KTsKLQkJCQlpbnQgYmx1ZSA9IChpbnQpIChpbnZlcnNlR2FtbWFOb3JtYWxpemVkKGIpICogMjU2KTsKLQkJCQlpZiAocmVkIDwgMCkKLQkJCQkJcmVkID0gMDsKLQkJCQllbHNlIGlmIChyZWQgPiAyNTUpCi0JCQkJCXJlZCA9IDI1NTsKLQkJCQlpZiAoZ3JlZW4gPCAwKQotCQkJCQlncmVlbiA9IDA7Ci0JCQkJZWxzZSBpZiAoZ3JlZW4gPiAyNTUpCi0JCQkJCWdyZWVuID0gMjU1OwotCQkJCWlmIChibHVlIDwgMCkKLQkJCQkJYmx1ZSA9IDA7Ci0JCQkJZWxzZSBpZiAoYmx1ZSA+IDI1NSkKLQkJCQkJYmx1ZSA9IDI1NTsKLQotCQkJCXJlc3VsdCA9IG5ldyBSR0IocmVkLCBncmVlbiwgYmx1ZSk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHVibGljIGRvdWJsZSBnZXRVKCkgewotCQkJCWlmICh1ID09IC0xKSB7Ci0JCQkJCXUgPSAwLjQ5NDkgKiAobm9ybWFsaXplZFJHQi5ibHVlIC0gZ2V0WSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHU7Ci0KLQkJCX0KLQotCQkJcHVibGljIGRvdWJsZSBnZXRWKCkgewotCQkJCWlmICh2ID09IC0xKSB7Ci0JCQkJCXYgPSAwLjg3NyAqIChub3JtYWxpemVkUkdCLnJlZCAtIGdldFkoKSk7Ci0JCQkJfQotCQkJCXJldHVybiB2OwotCQkJfQotCi0JCQlwdWJsaWMgZG91YmxlIGdldFkoKSB7Ci0JCQkJaWYgKHkgPT0gLTEpIHsKLQkJCQkJeSA9IDAuMjk5ICogbm9ybWFsaXplZFJHQi5yZWQgKyAwLjU4NyAqIG5vcm1hbGl6ZWRSR0IuZ3JlZW4gKyAwLjExNCAqIG5vcm1hbGl6ZWRSR0IuYmx1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHk7Ci0JCQl9Ci0KLQkJCWRvdWJsZSBpbnZlcnNlR2FtbWFOb3JtYWxpemVkKGRvdWJsZSBjb2xvckNvbXBvbmVudCkgewotCQkJCWlmIChjb2xvckNvbXBvbmVudCA8IDAuMDE4KSB7Ci0JCQkJCXJldHVybiBjb2xvckNvbXBvbmVudCAqIC4yMjI7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gTWF0aC5wb3coKCguOTA5OSAqIGNvbG9yQ29tcG9uZW50ICsgMC4wOSkpLCAyLjIyKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCXB1YmxpYyBZVVZfUkdCQ29udmVydGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBkb3VibGUgY2FsY3VsYXRlWUNvbXBvbmVudChDb2xvciB0YXJnZXRDb2xvcikgewotCQkJcmV0dXJuIG5ldyBZVVYodGFyZ2V0Q29sb3IuZ2V0UkdCKCkpLmdldFkoKTsKLQkJfQotCi0JCXB1YmxpYyBSR0IgdHJhbnNmb3JtUkdCKFJHQiBvcmlnaW5hbFJHQiwgZG91YmxlIHNjYWxlRmFjdG9yLCBkb3VibGUgdGFyZ2V0KSB7Ci0JCQlSR0IgdHJhbnNmb3JtZWRSR0IgPSBudWxsOwotCQkJLy8gQ0NJUjYwMSB5dXYgPSBuZXcgQ0NJUjYwMShvcmlnaW5hbFJHQik7Ci0JCQlZVVYgeXV2ID0gbmV3IFlVVihvcmlnaW5hbFJHQik7Ci0JCQlkb3VibGUgeSA9IHl1di5nZXRZKCk7Ci0JCQkvLyB6ZXJvIGlzIGJsYWNrLCBvbmUgaXMgd2hpdGUKLQkJCWlmICh5IDwgdGFyZ2V0KSB7Ci0JCQkJLy8gaXMgImRhcmsiIG1ha2UgbGlnaHRlcgotCQkJCXkgPSB5ICsgKCh0YXJnZXQgLSB5KSAqIHNjYWxlRmFjdG9yKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGlzICJsaWdodCIgbWFrZSBkYXJrZXIKLQkJCQl5ID0geSAtICgoeSAtIHRhcmdldCkgKiBzY2FsZUZhY3Rvcik7Ci0JCQl9Ci0JCQkvLyB5dXYuc2V0WSh5KTsKLQkJCVlVViBuZXdZVVYgPSBuZXcgWVVWKHksIHl1di5nZXRVKCksIHl1di5nZXRWKCkpOwotCQkJLy8gQ0NJUjYwMSBuZXdZVVYgPSBuZXcgQ0NJUjYwMSh5LCB5dXYuZ2V0Q2I2MDEoKSwKLQkJCS8vIHl1di5nZXRDcjYwMSgpKTsKLQkJCXRyYW5zZm9ybWVkUkdCID0gbmV3WVVWLmdldFJHQigpOwotCQkJcmV0dXJuIHRyYW5zZm9ybWVkUkdCOwotCQl9Ci0KLQkJcHVibGljIFJHQiB0cmFuc2Zvcm1SR0JUb0dyZXkoUkdCIG9yaWdpbmFsUkdCLCBkb3VibGUgc2NhbGVGYWN0b3IsIGRvdWJsZSB0YXJnZXQpIHsKLQkJCVJHQiB0cmFuc2Zvcm1lZFJHQiA9IG51bGw7Ci0JCQkvLyB3ZSBsZWZ0IHRoZSAiZnVsbCIgQVBJIG1ldGhvZCBzaWduYXR1cmUsIGJ1dCB0aGlzCi0JCQkvLyB2ZXJzaW9uIGRvZXMgbm90IHRha2UgaW50byBhY2NvdW50IG9yaWdpbmFsUkdCLCB0aG91Z2gKLQkJCS8vIGl0IG1pZ2h0IHNvbWVkYXkuCi0JCQkvLyBmb3Igbm93LCB3ZSdsbCBzaW1wbHkgbWFrZSB0aGUgbmV3IFJHQiBncmV5LCBlaXRoZXIgYSBsaXR0bGUKLQkJCS8vIGxpZ2h0ZXIsIG9yIGEgbGl0dGxlIGRhcmtlciB0aGFuIGJhY2tncm91bmQuCi0JCQlkb3VibGUgeSA9IDA7Ci0JCQlkb3VibGUgbWlkID0gMC41OwotCQkJLy8gemVybyBpcyBibGFjaywgb25lIGlzIHdoaXRlCi0JCQlpZiAodGFyZ2V0IDwgbWlkKSB7Ci0JCQkJLy8gaXMgImRhcmsiIG1ha2UgbGlnaHRlcgotCQkJCXkgPSB0YXJnZXQgKyBzY2FsZUZhY3RvcjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGlzICJsaWdodCIgbWFrZSBkYXJrZXIKLQkJCQl5ID0gdGFyZ2V0IC0gc2NhbGVGYWN0b3I7Ci0JCQl9Ci0JCQlpbnQgYyA9IChpbnQpIE1hdGgucm91bmQoeSAqIDI1NSk7Ci0JCQkvLyBqdXN0IHRvIGdhdXJkIGFnYWluc3QgbWlzLXVzZSwgb3Igc2NhbGUncyB2YWx1ZXMgZ3JlYXRlcgotCQkJLy8gdGhhbiBtaWQgcG9pbnQgKGFuZCBwb3NzaWJseSByb3VuZGluZyBlcnJvcikKLQkJCWlmIChjID4gMjU1KQotCQkJCWMgPSAyNTU7Ci0JCQlpZiAoYyA8IDApCi0JCQkJYyA9IDA7Ci0JCQl0cmFuc2Zvcm1lZFJHQiA9IG5ldyBSR0IoYywgYywgYyk7Ci0JCQlyZXR1cm4gdHJhbnNmb3JtZWRSR0I7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQlwcml2YXRlIGZpbmFsIFN0eWxlUmFuZ2VbXSBFTVBUWV9TVFlMRV9SQU5HRSA9IG5ldyBTdHlsZVJhbmdlWzBdOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NUWUxFX1BST1ZJREVSX0VYVEVOREVEX0lEID0gImxpbmVzdHlsZXByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTlVNQkVSX1NUWUxFUyA9IDUwMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEVGVF9TVFlMRVNfU0laRSA9IDIwMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRfU1RZTEVTX1NJWkUgPSAyMDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JRERMRV9TVFlMRVNfU0laRSA9IDE7Ci0KLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZGb3JlZ3JvdW5kU2NhbGVMaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJaWYgKEVkaXRvclByZWZlcmVuY2VOYW1lcy5SRUFEX09OTFlfRk9SRUdST1VORF9TQ0FMRS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHkoKSkpIHsKLQkJCQlJUHJlZmVyZW5jZVN0b3JlIGVkaXRvclN0b3JlID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkJCXJlYWRPbmx5Rm9yZWdyb3VuZFNjYWxlRmFjdG9yID0gZWRpdG9yU3RvcmUuZ2V0SW50KEVkaXRvclByZWZlcmVuY2VOYW1lcy5SRUFEX09OTFlfRk9SRUdST1VORF9TQ0FMRSk7Ci0JCQkJZGlzcG9zZUNvbG9yVGFibGUoKTsKLQkJCQlyZWZyZXNoRGlzcGxheSgpOwotCQkJfQotCQl9Ci0JfTsKLQlwcml2YXRlIExpc3QgZkhvbGRTdHlsZVJlc3VsdHM7Ci0JcHJpdmF0ZSBTdHJpbmcgZlBhcnRpdGlvbmluZyA9IElEb2N1bWVudEV4dGVuc2lvbjMuREVGQVVMVF9QQVJUSVRJT05JTkc7Ci0KLQlwcml2YXRlIGludCBmU2F2ZWRMZW5ndGggPSAtMTsKLQlwcml2YXRlIGludCBmU2F2ZWRPZmZzZXQgPSAtMTsKLQlwcml2YXRlIFN0eWxlUmFuZ2VbXSBmU2F2ZWRSYW5nZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBNYXAgZlRhYmxlT2ZQcm92aWRlcnM7Ci0KLQlwcml2YXRlIE1hcCBmRXh0ZW5kZWRQcm92aWRlcnM7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGluZVN0eWxlUHJvdmlkZXIgTk9PUF9QUk9WSURFUiA9IG5ldyBMaW5lU3R5bGVQcm92aWRlckZvck5vT3AoKTsKLQotCXByaXZhdGUgZG91YmxlIHJlYWRPbmx5QmFja2dyb3VuZFNjYWxlRmFjdG9yID0gMTA7Ci0JcHJpdmF0ZSBIYXNodGFibGUgcmVhZE9ubHlDb2xvclRhYmxlOwotCWRvdWJsZSByZWFkT25seUZvcmVncm91bmRTY2FsZUZhY3RvciA9IDMwOwotCi0JcHJpdmF0ZSBZVVZfUkdCQ29udmVydGVyIHJnYkNvbnZlcnRlcjsKLQlwcml2YXRlIElUZXh0Vmlld2VyIHRleHRWaWV3ZXI7Ci0JcHJpdmF0ZSBTdHlsZWRUZXh0IHRleHRXaWRnZXQ7Ci0KLQlwdWJsaWMgSGlnaGxpZ2h0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCQotCQkvLyBpbiB0aGUgJ2xpbWl0U2l6ZScgbWV0aG9kLCB3ZSBtYWtlIHRoaXMgc3Ryb25nIGFzc3VtcHRpb24sIHNvLCB3aWxsIGNoZWNrIGhlcmUsIAotCQkvLyBzbyBpZiB0d2Vha2VkIGluIGZ1dHVyZSwgd2UnbGwgZ2V0IGEgcXVpY2sgcmVtaW5kZXIuIAotCQlpZiAoTEVGVF9TVFlMRVNfU0laRSArIE1JRERMRV9TVFlMRVNfU0laRSArIFJJR0hUX1NUWUxFU19TSVpFID4gTUFYX05VTUJFUl9TVFlMRVMpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkhpZ2hsaWdoZXIgY29uc3RhbnRzIGFyZSBub3QgZGVmaW5lZCBjb3JyZWN0bHkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW1wdHlSYW5nZShpbnQgc3RhcnQsIGludCBsZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJU3R5bGVSYW5nZSByZXN1bHQgPSBuZXcgU3R5bGVSYW5nZSgpOwotCQlyZXN1bHQuc3RhcnQgPSBzdGFydDsKLQkJcmVzdWx0Lmxlbmd0aCA9IGxlbmd0aDsKLQkJaG9sZFJlc3VsdHMuYWRkKHJlc3VsdCk7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIGEgZ2l2ZW4gbGluZSBzdHlsZSBwcm92aWRlciBmb3IgYSBwYXJ0aWN1bGFyIHBhcnRpdGlvbiB0eXBlLgotCSAqIElmIHRoZXJlIGlzIGFscmVhZHkgYSBsaW5lIHN0eWxlIHByb3ZpZGVyIHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZSwgdGhlCi0JICogbmV3IGxpbmUgc3R5bGUgcHJvdmlkZXIgaXMgcmVnaXN0ZXJlZCBpbnN0ZWFkIG9mIHRoZSBvbGQgb25lLgotCSAqIAotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlCi0JICogICAgICAgICAgICB0aGUgcGFydGl0aW9uIHR5cGUgdW5kZXIgd2hpY2ggdG8gcmVnaXN0ZXIKLQkgKiBAcGFyYW0gdGhlCi0JICogICAgICAgICAgICBsaW5lIHN0eWxlIHByb3ZpZGVyIHRvIHJlZ2lzdGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgcmVtb3ZlIGFuIGV4aXN0aW5nIG9uZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3ZpZGVyKFN0cmluZyBwYXJ0aXRpb25UeXBlLCBMaW5lU3R5bGVQcm92aWRlciBwcm92aWRlcikgewotCQlnZXRUYWJsZU9mUHJvdmlkZXJzKCkucHV0KHBhcnRpdGlvblR5cGUsIHByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGp1c3QgdGhlIHN0eWxlIHJhbmdlcycgc3RhcnQgYW5kIGxlbmd0aCBzbyB0aGF0IHRoZXkgcmVmZXIgdG8gdGhlCi0JICogdGV4dHZpZXdlciB3aWRnZXQncyByYW5nZSBpbnN0ZWFkIG9mIHRoZSB0ZXh0dmlld2VyJ3MgZG9jdW1lbnQgcmFuZ2UuCi0JICogCi0JICogQHBhcmFtIHJhbmdlcwotCSAqIEBwYXJhbSBhZGp1c3RtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRqdXN0KFN0eWxlUmFuZ2VbXSByYW5nZXMsIGludCBhZGp1c3RtZW50KSB7Ci0JCUlUZXh0Vmlld2VyIHZpZXdlciA9IGdldFRleHRWaWV3ZXIoKTsKLQotCQlpZiAoYWRqdXN0bWVudCAhPSAwKSB7Ci0JCQkvLyBqdXN0IHVzZSB0aGUgYWRqdXN0bWVudCB2YWx1ZQotCQkJLy8gY29udmVydCBkb2N1bWVudCByZWdpb25zIGJhY2sgdG8gd2lkZ2V0IHJlZ2lvbnMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8ganVzdCBhZGp1c3QgdGhlIHJhbmdlIHVzaW5nIHRoZSBnaXZlbiBhZGp1c3RtZW50Ci0JCQkJcmFuZ2VzW2ldLnN0YXJ0ICs9IGFkanVzdG1lbnQ7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAodmlld2VyIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb241KSB7Ci0JCQkvLyB1c2UgSVRleHRWaWV3ZXJFeHRlbnNpb241Ci0JCQlJVGV4dFZpZXdlckV4dGVuc2lvbjUgZXh0ZW5zaW9uID0gKElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgdmlld2VyOwotCi0JCQkvLyBjb252ZXJ0IGRvY3VtZW50IHJlZ2lvbnMgYmFjayB0byB3aWRnZXQgcmVnaW9ucwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBnZXQgZG9jdW1lbnQgcmFuZ2UsIHRha2luZyBpbnRvIGFjY291bnQgZm9sZGluZwotCQkJCS8vIHJlZ2lvbnMgaW4gdmlld2VyCi0JCQkJSVJlZ2lvbiByZWdpb24gPSBleHRlbnNpb24ubW9kZWxSYW5nZTJXaWRnZXRSYW5nZShuZXcgUmVnaW9uKHJhbmdlc1tpXS5zdGFydCwgcmFuZ2VzW2ldLmxlbmd0aCkpOwotCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQlyYW5nZXNbaV0uc3RhcnQgPSByZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQkJCXJhbmdlc1tpXS5sZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJfSAvLyBlbHNlIHdoYXQgaGFwcGVucyBpZiByZWdpb24gaXMgbm90IGZvdW5kPyEKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSBSZWFkIE9ubHkgYXJlYXMgaGF2ZSB1bmNoYW5nZWQgYmFja2dyb3VuZCBjb2xvcnMKLQkgKi8KLQl2b2lkIGFkanVzdEJhY2tncm91bmQoU3R5bGVSYW5nZSBzdHlsZVJhbmdlKSB7Ci0JCVJHQiBvbGRSR0IgPSBudWxsOwotCQlDb2xvciBvbGRDb2xvciA9IHN0eWxlUmFuZ2UuYmFja2dyb3VuZDsKLQkJaWYgKG9sZENvbG9yID09IG51bGwpIHsKLQkJCW9sZENvbG9yID0gZ2V0VGV4dFdpZGdldCgpLmdldEJhY2tncm91bmQoKTsKLQkJfQotCQlvbGRSR0IgPSBvbGRDb2xvci5nZXRSR0IoKTsKLQkJQ29sb3IgbmV3Q29sb3IgPSBnZXRDYWNoZWRDb2xvckZvcihvbGRSR0IpOwotCQlpZiAobmV3Q29sb3IgPT0gbnVsbCkgewotCQkJZG91YmxlIHRhcmdldCA9IGdldFJHQkNvbnZlcnRlcigpLmNhbGN1bGF0ZVlDb21wb25lbnQob2xkQ29sb3IpOwotCQkJLy8gaWYgYmFja2dyb3VuZCBpcyAibGlnaHQiIG1ha2UgaXQgZGFya2VyLCBhbmQgdmljZSB2ZXJzYQotCQkJaWYgKHRhcmdldCA8IDAuNSkKLQkJCQl0YXJnZXQgPSAxLjA7Ci0JCQllbHNlCi0JCQkJdGFyZ2V0ID0gMC4wOwotCQkJUkdCIG5ld1JHQiA9IGdldFJHQkNvbnZlcnRlcigpLnRyYW5zZm9ybVJHQihvbGRSR0IsIHJlYWRPbmx5QmFja2dyb3VuZFNjYWxlRmFjdG9yIC8gMTAwLjAsIHRhcmdldCk7Ci0KLQkJCWNhY2hlQ29sb3Iob2xkUkdCLCBuZXdSR0IpOwotCQkJbmV3Q29sb3IgPSBnZXRDYWNoZWRDb2xvckZvcihvbGRSR0IpOwotCQl9Ci0JCXN0eWxlUmFuZ2UuYmFja2dyb3VuZCA9IG5ld0NvbG9yOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGp1c3RGb3JlZ3JvdW5kKFN0eWxlUmFuZ2Ugc3R5bGVSYW5nZSkgewotCQlSR0Igb2xkUkdCID0gbnVsbDsKLQkJLy8gQ29sb3Igb2xkQ29sb3IgPSBzdHlsZVJhbmdlLmZvcmVncm91bmQ7Ci0JCUNvbG9yIG9sZENvbG9yID0gc3R5bGVSYW5nZS5iYWNrZ3JvdW5kOwotCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgewotCQkJLy8gb2xkUkdCID0gZ2V0VGV4dFdpZGdldCgpLmdldEZvcmVncm91bmQoKS5nZXRSR0IoKTsKLQkJCW9sZENvbG9yID0gZ2V0VGV4dFdpZGdldCgpLmdldEJhY2tncm91bmQoKTsKLQkJCW9sZFJHQiA9IG9sZENvbG9yLmdldFJHQigpOwotCQl9Ci0JCWVsc2UgewotCQkJb2xkUkdCID0gb2xkQ29sb3IuZ2V0UkdCKCk7Ci0JCX0KLQkJQ29sb3IgbmV3Q29sb3IgPSBnZXRDYWNoZWRDb2xvckZvcihvbGRSR0IpOwotCQlpZiAobmV3Q29sb3IgPT0gbnVsbCkgewotCQkJLy8gbWFrZSB0ZXh0ICJjbG9zZXIgdG8iIGJhY2tncm91bmQgbHVtYW5lbmNlCi0JCQlkb3VibGUgdGFyZ2V0ID0gZ2V0UkdCQ29udmVydGVyKCkuY2FsY3VsYXRlWUNvbXBvbmVudChvbGRDb2xvcik7Ci0JCQlSR0IgbmV3UkdCID0gZ2V0UkdCQ29udmVydGVyKCkudHJhbnNmb3JtUkdCVG9HcmV5KG9sZFJHQiwgcmVhZE9ubHlGb3JlZ3JvdW5kU2NhbGVGYWN0b3IgLyAxMDAuMCwgdGFyZ2V0KTsKLQotCQkJLy8gc2F2ZSBjb252ZXJzaW9uLCBzbyBjYWxjdWxhdGlvbnMgb25seSBuZWVkIHRvIGJlIGRvbmUgb25jZQotCQkJY2FjaGVDb2xvcihvbGRSR0IsIG5ld1JHQik7Ci0JCQluZXdDb2xvciA9IGdldENhY2hlZENvbG9yRm9yKG9sZFJHQik7Ci0JCX0KLQkJc3R5bGVSYW5nZS5mb3JlZ3JvdW5kID0gbmV3Q29sb3I7Ci0JfQotCi0JLyoqCi0JICogQ2FjaGUgcmVhZC1vbmx5IGNvbG9yLgotCSAqIAotCSAqIEBwYXJhbSBvbGRSR0IKLQkgKiBAcGFyYW0gbmV3Q29sb3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2FjaGVDb2xvcihSR0Igb2xkUkdCLCBSR0IgbmV3Q29sb3IpIHsKLQkJaWYgKHJlYWRPbmx5Q29sb3JUYWJsZSA9PSBudWxsKSB7Ci0JCQlyZWFkT25seUNvbG9yVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCX0KLQkJcmVhZE9ubHlDb2xvclRhYmxlLnB1dChvbGRSR0IsIG5ld0NvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3R5bGVSYW5nZVtdIGNvbnZlcnRSZWFkT25seVJlZ2lvbnMoU3R5bGVSYW5nZVtdIHJlc3VsdCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLQotCQkvKioKLQkJICogKGRtdykgRm9yIGNsaWVudC9wcm92aWRlciBzaW1wbGljaXR5IChhbmQgY29uc2lzdGVudCBsb29rIGFuZCBmZWVsKQotCQkgKiB3ZSdsbCBoYW5kbGUgcmVhZG9ubHkgcmVnaW9ucyBpbiBvbmUgc3BvdCwgaGVyZSBpbiB0aGUgSGlnaGxpZ2h0ZXIuCi0JCSAqIEN1cnJlbnRseSBpdCBpcyBhIGZhaXIgYXNzdW1wdGlvbiB0aGF0IGVhY2ggcmVhZG9ubHkgcmVnaW9uIHdpbGwgYmUKLQkJICogb24gYW4gSVRleHRSZWdpb24gYm91bmRhcnksIHNvIHdlIGNvbWJpbmUgY29uc2VjdXRpdmUgc3R5bGVzIHdoZW4KLQkJICogZm91bmQgdG8gYmUgZXF1aXZhbGVudC4gUGx1cywgZm9yIG5vdywgd2UnbGwganVzdCBhZGp1c3QKLQkJICogZm9yZWdyb3VuZC4gRXZlbnR1YWxseSB3aWxsIHVzZSBhICJkaW1taW5nIiBhbGdyb3JpdGhtIHRvIGFkanVzdAotCQkgKiBjb2xvcidzIHNhdHVhdGlvbi9icmlnaHRuZXNzLgotCQkgKi8KLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudC5jb250YWluc1JlYWRPbmx5KHN0YXJ0LCBsZW5ndGgpKSB7Ci0JCQkvLyBzb21ldGhpbmcgaXMgcmVhZC1vbmx5IGluIHRoZSBsaW5lLCBzbyBnbyB0aHJvdWdoIGVhY2ggc3R5bGUsCi0JCQkvLyBhbmQgYWRqdXN0Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZSA9IHJlc3VsdFtpXTsKLQkJCQlpZiAoc3RydWN0dXJlZERvY3VtZW50LmNvbnRhaW5zUmVhZE9ubHkoc3R5bGVSYW5nZS5zdGFydCwgc3R5bGVSYW5nZS5sZW5ndGgpKSB7Ci0JCQkJCWFkanVzdEZvcmVncm91bmQoc3R5bGVSYW5nZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgb3V0IHRoZSByZWFkT25seUNvbG9yVGFibGUKLQkgKi8KLQl2b2lkIGRpc3Bvc2VDb2xvclRhYmxlKCkgewotCQlpZiAocmVhZE9ubHlDb2xvclRhYmxlICE9IG51bGwpIHsKLQkJCXJlYWRPbmx5Q29sb3JUYWJsZS5jbGVhcigpOwotCQl9Ci0JCXJlYWRPbmx5Q29sb3JUYWJsZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMganVzdCB0byBnZXQgZXhpc3RpbmcgcmVhZC1vbmx5IGNvbG9ycy4KLQkgKi8KLQlwcml2YXRlIENvbG9yIGdldENhY2hlZENvbG9yRm9yKFJHQiBvbGRSR0IpIHsKLQkJQ29sb3IgcmVzdWx0ID0gbnVsbDsKLQotCQlpZiAocmVhZE9ubHlDb2xvclRhYmxlICE9IG51bGwpIHsKLQkJCVJHQiByZWFkT25seVJHQiA9IChSR0IpIHJlYWRPbmx5Q29sb3JUYWJsZS5nZXQob2xkUkdCKTsKLQkJCXJlc3VsdCA9IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IocmVhZE9ubHlSR0IpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQWRqdXN0IHRoZSBnaXZlbiB3aWRnZXQgb2Zmc2V0IGFuZCBsZW5ndGggc28gdGhhdCB0aGV5IGFyZSB0aGUKLQkgKiB0ZXh0dmlld2VyIGRvY3VtZW50J3Mgb2Zmc2V0IGFuZCBsZW5ndGgsIHRha2luZyBpbnRvIGFjY291bnQgd2hhdCBpcwotCSAqIGFjdHVhbGx5IHZpc2libGUgaW4gdGhlIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHJldHVybiBhIHJlZ2lvbiBjb250YWluaW5nIHRoZSBvZmZzZXQgYW5kIGxlbmd0aCB3aXRoaW4gdGhlCi0JICogICAgICAgICB0ZXh0dmlld2VyJ3MgZG9jdW1lbnQgb3IgbnVsbCBpZiB0aGUgb2Zmc2V0IGlzIG5vdCB3aXRoaW4gdGhlCi0JICogICAgICAgICBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgSVJlZ2lvbiBnZXREb2N1bWVudFJhbmdlRnJvbVdpZGdldFJhbmdlKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJSVJlZ2lvbiBzdHlsZVJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0Vmlld2VyIHZpZXdlciA9IGdldFRleHRWaWV3ZXIoKTsKLQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotCQkJLy8gZ2V0IGRvY3VtZW50IHJhbmdlLCB0YWtpbmcgaW50byBhY2NvdW50IGZvbGRpbmcgcmVnaW9ucyBpbgotCQkJLy8gdmlld2VyCi0JCQlJVGV4dFZpZXdlckV4dGVuc2lvbjUgZXh0ZW5zaW9uID0gKElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgdmlld2VyOwotCQkJc3R5bGVSZWdpb24gPSBleHRlbnNpb24ud2lkZ2V0UmFuZ2UyTW9kZWxSYW5nZShuZXcgUmVnaW9uKG9mZnNldCwgbGVuZ3RoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBnZXQgZG9jdW1lbnQgcmFuZ2UsIHRha2luZyBpbnRvIGFjY291bnQgdmlld2VyIHZpc2libGUgcmVnaW9uCi0JCQkvLyBnZXQgdmlzaWJsZSByZWdpb24gaW4gdmlld2VyCi0JCQlJUmVnaW9uIHZyID0gbnVsbDsKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkKLQkJCQl2ciA9IHZpZXdlci5nZXRWaXNpYmxlUmVnaW9uKCk7Ci0JCQllbHNlCi0JCQkJdnIgPSBuZXcgUmVnaW9uKDAsIGdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpOwotCi0JCQkvLyBpZiBvZmZzZXQgaXMgbm90IHdpdGhpbiB2aXNpYmxlIHJlZ2lvbiwgdGhlbiB3ZSBkb24ndCByZWFsbHkKLQkJCS8vIGNhcmUKLQkJCWlmIChvZmZzZXQgPD0gdnIuZ2V0TGVuZ3RoKCkpIHsKLQkJCQkvLyBBZGp1c3QgdGhlIG9mZnNldCB0byBiZSB3aXRoaW4gdmlzaWJsZSByZWdpb24KLQkJCQlzdHlsZVJlZ2lvbiA9IG5ldyBSZWdpb24ob2Zmc2V0ICsgdnIuZ2V0T2Zmc2V0KCksIGxlbmd0aCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0eWxlUmVnaW9uOwotCX0KLQotCi0JcHJpdmF0ZSBNYXAgZ2V0RXh0ZW5kZWRQcm92aWRlcnMoKSB7Ci0JCWlmIChmRXh0ZW5kZWRQcm92aWRlcnMgPT0gbnVsbCkgewotCQkJZkV4dGVuZGVkUHJvdmlkZXJzID0gbmV3IEhhc2hNYXAoMyk7Ci0JCX0KLQkJcmV0dXJuIGZFeHRlbmRlZFByb3ZpZGVyczsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0UHJvdmlkZXJGb3IuCi0JICogCi0JICogQHBhcmFtIHR5cGVkUmVnaW9uCi0JICogQHJldHVybiBMaW5lU3R5bGVQcm92aWRlcgotCSAqLwotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZ2V0UHJvdmlkZXJGb3IoSVR5cGVkUmVnaW9uIHR5cGVkUmVnaW9uKSB7Ci0JCVN0cmluZyB0eXBlID0gdHlwZWRSZWdpb24uZ2V0VHlwZSgpOwotCQlMaW5lU3R5bGVQcm92aWRlciByZXN1bHQgPSAoTGluZVN0eWxlUHJvdmlkZXIpIGZUYWJsZU9mUHJvdmlkZXJzLmdldCh0eXBlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkvLyBOT1QgWUVUIEZJTkFMSVpFRCAtIERPIE5PVCBDT05TSURFUiBBUyBBUEkKLQkJCXN5bmNocm9uaXplZCAoZ2V0RXh0ZW5kZWRQcm92aWRlcnMoKSkgewotCQkJCWlmICghZ2V0RXh0ZW5kZWRQcm92aWRlcnMoKS5jb250YWluc0tleSh0eXBlKSkgewotCQkJCQlMaW5lU3R5bGVQcm92aWRlciBwcm92aWRlciA9IChMaW5lU3R5bGVQcm92aWRlcikgRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpLmdldENvbmZpZ3VyYXRpb24oTElORV9TVFlMRV9QUk9WSURFUl9FWFRFTkRFRF9JRCwgdHlwZSk7Ci0JCQkJCWdldEV4dGVuZGVkUHJvdmlkZXJzKCkucHV0KHR5cGUsIHByb3ZpZGVyKTsKLQkJCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJCXByb3ZpZGVyLmluaXQoZ2V0RG9jdW1lbnQoKSwgdGhpcyk7Ci0JCQkJCX0KLQkJCQkJcmVzdWx0ID0gcHJvdmlkZXI7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSAoTGluZVN0eWxlUHJvdmlkZXIpIGdldEV4dGVuZGVkUHJvdmlkZXJzKCkuZ2V0KHR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IE5PT1BfUFJPVklERVI7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIFlVVl9SR0JDb252ZXJ0ZXIgZ2V0UkdCQ29udmVydGVyKCkgewotCQlpZiAocmdiQ29udmVydGVyID09IG51bGwpIHsKLQkJCXJnYkNvbnZlcnRlciA9IG5ldyBZVVZfUkdCQ29udmVydGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHJnYkNvbnZlcnRlcjsKLQl9Ci0KLQlwcml2YXRlIE1hcCBnZXRUYWJsZU9mUHJvdmlkZXJzKCkgewotCQlpZiAoZlRhYmxlT2ZQcm92aWRlcnMgPT0gbnVsbCkgewotCQkJZlRhYmxlT2ZQcm92aWRlcnMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXJldHVybiBmVGFibGVPZlByb3ZpZGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0Vmlld2VyLgotCSAqIAotCSAqIEByZXR1cm4gSVRleHRWaWV3ZXIKLQkgKi8KLQlwdWJsaWMgSVRleHRWaWV3ZXIgZ2V0VGV4dFZpZXdlcigpIHsKLQkJcmV0dXJuIHRleHRWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHlsZWRUZXh0IGdldFRleHRXaWRnZXQoKSB7Ci0JCXJldHVybiB0ZXh0V2lkZ2V0OwotCX0KLQotCS8qKgotCSAqIEluc3RhbGxzIGhpZ2hsaWdodGVyIHN1cHBvcnQgb24gdGhlIGdpdmVuIHRleHQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Vmlld2VyCi0JICogICAgICAgICAgICB0aGUgdGV4dCB2aWV3ZXIgb24gd2hpY2ggY29udGVudCBhc3Npc3Qgd2lsbCB3b3JrCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChJVGV4dFZpZXdlciBuZXdUZXh0Vmlld2VyKSB7Ci0JCXRoaXMudGV4dFZpZXdlciA9IG5ld1RleHRWaWV3ZXI7Ci0KLQkJSVByZWZlcmVuY2VTdG9yZSBlZGl0b3JTdG9yZSA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJZWRpdG9yU3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmRm9yZWdyb3VuZFNjYWxlTGlzdGVuZXIpOwotCQlyZWFkT25seUZvcmVncm91bmRTY2FsZUZhY3RvciA9IGVkaXRvclN0b3JlLmdldEludChFZGl0b3JQcmVmZXJlbmNlTmFtZXMuUkVBRF9PTkxZX0ZPUkVHUk9VTkRfU0NBTEUpOwotCi0JCWlmICh0ZXh0V2lkZ2V0ICE9IG51bGwpIHsKLQkJCXRleHRXaWRnZXQucmVtb3ZlTGluZVN0eWxlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJdGV4dFdpZGdldCA9IG5ld1RleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlpZiAodGV4dFdpZGdldCAhPSBudWxsKSB7Ci0JCQl0ZXh0V2lkZ2V0LmFkZExpbmVTdHlsZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJcmVmcmVzaERpc3BsYXkoKTsKLQl9Ci0KLQlwdWJsaWMgU3R5bGVSYW5nZVtdIGxpbmVHZXRTdHlsZShpbnQgZXZlbnRMaW5lT2Zmc2V0LCBpbnQgZXZlbnRMaW5lTGVuZ3RoKSB7Ci0JCVN0eWxlUmFuZ2VbXSBldmVudFN0eWxlcyA9IEVNUFRZX1NUWUxFX1JBTkdFOwotCQl0cnkgewotCQkJaWYgKGdldERvY3VtZW50KCkgPT0gbnVsbCB8fCBldmVudExpbmVMZW5ndGggPT0gMCkgewotCQkJCS8vIGdldERvY3VtZW50KCkgPT0gbnVsbAotCQkJCS8vIGR1cmluZyBpbml0aWFsaXphdGlvbiwgdGhpcyBpcyBzb21ldGltZXMgY2FsbGVkIGJlZm9yZSBvdXIKLQkJCQkvLyBzdHJ1Y3R1cmVkCi0JCQkJLy8gaXMgc2V0LCBpbiB3aGljaCBjYXNlIHdlIHNldCBzdHlsZXMgdG8gYmUgdGhlIGVtcHR5IHN0eWxlCi0JCQkJLy8gcmFuZ2UKLQkJCQkvLyAoZXZlbnQuc3R5bGVzIGNhbiBub3QgYmUgbnVsbCkKLQotCQkJCS8vIGV2ZW50TGluZUxlbmd0aCA9PSAwCi0JCQkJLy8gd2Ugc29tZXRpbWVzIGdldCBvZGQgcmVxdWVzdHMgZnJvbSB0aGUgdmVyeSBsYXN0IENSTEYgaW4KLQkJCQkvLyB0aGUKLQkJCQkvLyBkb2N1bWVudAotCQkJCS8vIGl0IGhhcyBubyBsZW5ndGgsIGFuZCB0aGVyZSBpcyBubyBub2RlIGZvciBpdCEKLQkJCQlldmVudFN0eWxlcyA9IEVNUFRZX1NUWUxFX1JBTkdFOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyoKLQkJCQkgKiBMaW5lU3R5bGVQcm92aWRlcnMgd29yayB1c2luZyBhYnNvbHV0ZSBkb2N1bWVudCBvZmZzZXRzLiBUbwotCQkJCSAqIHN1cHBvcnQgdmlzaWJsZSByZWdpb25zLCBhZGp1c3QgdGhlIHJlcXVlc3RlZCByYW5nZSB1cCB0bwotCQkJCSAqIHRoZSBmdWxsIGRvY3VtZW50IG9mZnNldHMuCi0JCQkJICovCi0JCQkJSVJlZ2lvbiBzdHlsZVJlZ2lvbiA9IGdldERvY3VtZW50UmFuZ2VGcm9tV2lkZ2V0UmFuZ2UoZXZlbnRMaW5lT2Zmc2V0LCBldmVudExpbmVMZW5ndGgpOwotCQkJCWlmIChzdHlsZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWludCBzdGFydCA9IHN0eWxlUmVnaW9uLmdldE9mZnNldCgpOwotCQkJCQlpbnQgbGVuZ3RoID0gc3R5bGVSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0KLQkJCQkJSVR5cGVkUmVnaW9uW10gcGFydGl0aW9ucyA9IFRleHRVdGlsaXRpZXMuY29tcHV0ZVBhcnRpdGlvbmluZyhnZXREb2N1bWVudCgpLCBmUGFydGl0aW9uaW5nLCBzdGFydCwgbGVuZ3RoLCBmYWxzZSk7Ci0JCQkJCWV2ZW50U3R5bGVzID0gcHJlcGFyZVN0eWxlUmFuZ2VzQXJyYXkocGFydGl0aW9ucywgc3RhcnQsIGxlbmd0aCk7Ci0KLQkJCQkJLyoKLQkJCQkJICogSWYgdGhlcmUgaXMgYSBzdWJ0ZXh0IG9mZnNldCwgdGhlIHN0eWxlIHJhbmdlcyBtdXN0IGJlCi0JCQkJCSAqIGFkanVzdGVkIHRvIHRoZSBleHBlY3RlZCBvZmZzZXRzIGp1c3QgY2hlY2sgaWYKLQkJCQkJICogZXZlbnRMaW5lT2Zmc2V0IGlzIGRpZmZlcmVudCB0aGFuIHN0YXJ0IHRoZW4gYWRqdXN0LAotCQkJCQkgKiBvdGhlcndpc2UgdSBjYW4gbGVhdmUgaXQgYWxvbmUgdW5sZXNzIHRoZXJlIGlzIHNwZWNpYWwKLQkJCQkJICogaGFuZGxpbmcgZm9yIGl0ZXh0dmlld2VyZXh0ZW5zaW9uNT8KLQkJCQkJICovCi0JCQkJCWlmIChzdGFydCAhPSBldmVudExpbmVPZmZzZXQpIHsKLQkJCQkJCWludCBvZmZzZXQgPSAwOwotCQkJCQkJLy8gZmlndXJlIG91dCB2aXNpYmxlIHJlZ2lvbiB0byB1c2UgZm9yIGFkanVzdG1lbnQKLQkJCQkJCS8vIG9ubHkgYWRqdXN0IGlmIG5lZWQgdG8KLQkJCQkJCWlmICghKGdldFRleHRWaWV3ZXIoKSBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkpIHsKLQkJCQkJCQlJUmVnaW9uIHZyID0gZ2V0VGV4dFZpZXdlcigpLmdldFZpc2libGVSZWdpb24oKTsKLQkJCQkJCQlpZiAodnIgIT0gbnVsbCkgewotCQkJCQkJCQlvZmZzZXQgPSB2ci5nZXRPZmZzZXQoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlhZGp1c3QoZXZlbnRTdHlsZXMsIC1vZmZzZXQpOwotCQkJCQl9Ci0KLQkJCQkJZXZlbnRTdHlsZXMgPSBsaW1pdFNpemUoZXZlbnRTdHlsZXMpOwotCQkJCQkKLQkJCQkJLy8gZm9yIGRlYnVnZ2luZyBvbmx5Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJaWYgKCF2YWxpZChldmVudFN0eWxlcywgZXZlbnRMaW5lT2Zmc2V0LCBldmVudExpbmVMZW5ndGgpKSB7Ci0JCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIkhpZ2hsaWdodGVyOjpsaW5lR2V0U3R5bGUgZm91bmQgaW52YWxpZCBzdHlsZXMgYXQgb2Zmc2V0ICIgKyBldmVudExpbmVPZmZzZXQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWYgQU5ZIGV4Y2VwdGlvbiBvY2N1cnMgZHVyaW5nIGhpZ2hsaWdodGluZywKLQkJCS8vIGp1c3QgcmV0dXJuICJubyBoaWdobGlnaHRpbmciCi0JCQlldmVudFN0eWxlcyA9IEVNUFRZX1NUWUxFX1JBTkdFOwotCQkJaWYgKERlYnVnLnN5bnRheEhpZ2hsaWdodGluZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIGR1cmluZyBoaWdobGlnaHRpbmchIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXJldHVybiBldmVudFN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB0byBjZW50cmFsaXplIHRoZSBsb2dpYyBpbiBsaW1pdGluZyB0aGUgb3ZlcmFsbCBudW1iZXIgb2Ygc3R5bGUgcmFuZ2VzCi0JICogdGhhdCBtYWtlIGl0IHRvIHRoZSBzdHlsZWQgdGV4dCB3aWRnZXQuIAotCSAqIAotCSAqIFRvbyBtYW55IHN0eWxlcyBzZW50IHRvIFN0eWxlZFRleHQgcmVzdWx0cyBpbiBhcHBhcmVudCwgYnV0IG5vdCByZWFsLCAKLQkgKiBoYW5ncyBvZiBFY2xpcHNlIERpc3BsYXkgdGhyZWFkLiBTZWUgIAotCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDg4MDYKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnRTdHlsZXMKLQkgKiBAcmV0dXJuCi0JICovCi0JIHByaXZhdGUgU3R5bGVSYW5nZVtdIGxpbWl0U2l6ZShTdHlsZVJhbmdlW10gZXZlbnRTdHlsZXMpIHsKLQkJCi0JCS8vIHF1aWNrIHJldHVybiB3aXRoIHNhbWUgb2JqZWN0IGlmIG5vdCBtb2RpZmljYXRpb24gbmVlZGVkCi0JCWlmIChldmVudFN0eWxlcy5sZW5ndGggPCBNQVhfTlVNQkVSX1NUWUxFUykgewotCQkJcmV0dXJuIGV2ZW50U3R5bGVzOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gd2UgY291bGQganVzdCB0YWtlIHRoZSBlYXN5IHdheSBvdXQgYW5kIHRydW5jYXRlLCBidXQgd2lsbCAKLQkJCS8vIGJlIG11Y2ggYmV0dGVyIGFwcGVhcmluZyBpZiBib3RoIHRoZSBzdGFydCBvZiB0aGUgbGluZSBhbmQgdGhlIAotCQkJLy8gZW5kIG9mIHRoZSBsaW5lIGFyZSBkaXNwbGF5ZWQgd2l0aCBzdHlsZXMuIFNpbmNlIHRoZXNlIGFyZSBib3RoCi0JCQkvLyB0aGUgcGFydHMgb2YgdGhlIGxpbmUgYSB1c2VyIGlzIGxpa2VseSB0byBsb29rIGF0LiBUaGUgbWlkZGxlIG9mIHRoZSAKLQkJCS8vIGxpbmUgd2lsbCBzdGlsbCBiZSAicGxhaW4iLiBQcmVzdW1hYmx5LCB0aGUgdXNlciB3b3VsZCByZS1mb3JtYXQgdGhlIAotCQkJLy8gZmlsZSB0byBhdm9pZCBsb25nIGxpbmVzLCBzbyB1bmxpa2VseSB0byBzZWUgdGhlIG1pZGRsZS4gCi0JCQlTdHlsZVJhbmdlW10gbmV3UmFuZ2VzID0gbmV3IFN0eWxlUmFuZ2VbTEVGVF9TVFlMRVNfU0laRSArIFJJR0hUX1NUWUxFU19TSVpFICsgTUlERExFX1NUWUxFU19TSVpFXTsgCi0JCQlTeXN0ZW0uYXJyYXljb3B5KGV2ZW50U3R5bGVzLCAwLCBuZXdSYW5nZXMsIDAsIExFRlRfU1RZTEVTX1NJWkUpOwotCQkJLy8KLQkJCS8vIGRvIGVuZCwgYmVmb3JlIHdlIGRvIG1pZGRsZQotCQkJU3lzdGVtLmFycmF5Y29weShldmVudFN0eWxlcywgZXZlbnRTdHlsZXMubGVuZ3RoLVJJR0hUX1NUWUxFU19TSVpFLCBuZXdSYW5nZXMsIExFRlRfU1RZTEVTX1NJWkUgKyBNSURETEVfU1RZTEVTX1NJWkUsIFJJR0hUX1NUWUxFU19TSVpFKTsKLQkJCS8vCi0JCQkvLyB0ZWNobmljYWxseSwgd2Ugc2hvdWxkIGNvbXB1dGUgdGhlIGV4YWN0IG1pZGRsZSBhcyBvbmUgYmlnIHN0eWxlIHJhbmdlLCAKLQkJCS8vIHdpdGggZGVmYXVsdCBjb2xvcnMgYW5kIHN0eWxlcywgc28gaWYgc29tZW9uZSBkb2VzIGFjdHVhbGx5IHR5cGUgb3Igd29yayB3aXRoIAotCQkJLy8gZG9jdW1uZXQgYXMgaXMsIHdpbGwgc3RpbGwgYmUgY29ycmVjdC4gCi0JCQkvLwotCQkJU3R5bGVSYW5nZSBhbGxCbGFuayA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0JCQlTdHlsZVJhbmdlIGxhc3RLbm93biA9IG5ld1Jhbmdlc1tMRUZUX1NUWUxFU19TSVpFIC0gMV07Ci0JCQlhbGxCbGFuay5zdGFydCA9IGxhc3RLbm93bi5zdGFydCArIGxhc3RLbm93bi5sZW5ndGg7Ci0JCQlTdHlsZVJhbmdlIG5leHRLbm93biA9IG5ld1Jhbmdlc1tMRUZUX1NUWUxFU19TSVpFICsgTUlERExFX1NUWUxFU19TSVpFICsgMV07Ci0JCQlhbGxCbGFuay5sZW5ndGggPSBuZXh0S25vd24uc3RhcnQgLSBhbGxCbGFuay5zdGFydDsKLQkJCW5ld1Jhbmdlc1tMRUZUX1NUWUxFU19TSVpFXSA9IGFsbEJsYW5rOwotCQkJcmV0dXJuIG5ld1JhbmdlczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEEgcGFzc3Rocm91Z2ggbWV0aG9kIHRoYXQgZXh0cmFjdHMgcmVsZXZhbnQgZGF0YSBmcm9tIHRoZQotCSAqIExpbmVTdHlsZUV2ZW50IGFuZCBwYXNzZXMgaXQgYWxvbmcuIFRoaXMgbWV0aG9kIHdhcyBzZXBhcmF0ZWQgZm9yCi0JICogcGVyZm9ybWFuY2UgdGVzdGluZyBwdXJwb3Nlcy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uTGluZVN0eWxlTGlzdGVuZXIjbGluZUdldFN0eWxlKExpbmVTdHlsZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpbmVHZXRTdHlsZShMaW5lU3R5bGVFdmVudCBldmVudCkgewotCQlpbnQgb2Zmc2V0ID0gZXZlbnQubGluZU9mZnNldDsKLQkJaW50IGxlbmd0aCA9IGV2ZW50LmxpbmVUZXh0Lmxlbmd0aCgpOwotCi0JCS8qCi0JCSAqIEZvciBzb21lIHJlYXNvbiwgd2UgYXJlIHNvbWV0aW1lcyBhc2tlZCBmb3IgdGhlIHNhbWUgc3R5bGUgcmFuZ2UKLQkJICogb3ZlciBhbmQgb3ZlciBhZ2Fpbi4gVGhpcyB3YXMgZm91bmQgdG8gaGFwcGVuIGR1cmluZyAncmV2ZXJ0JyBvZiBhCi0JCSAqIGZpbGUgd2l0aCBvbmUgbGluZSBpbiBpdCB0aGF0IGlzIDQwSyBsb25nISBTbywgd2hpbGUgd2UgZG9uJ3Qga25vdwotCQkgKiByb290IGNhdXNlLCBjYWNoaW5nIHRoZSBzdHlsZWQgcmFuZ2VzIGluIGNhc2UgdGhlIGV4YWN0IHNhbWUKLQkJICogcmVxdWVzdCBpcyBtYWRlIG11bHRpcGxlIHRpbWVzIHNlZW1zIGxpa2UgY2hlYXAgaW5zdXJhbmNlLgotCQkgKi8KLQkJaWYgKG9mZnNldCA9PSBmU2F2ZWRPZmZzZXQgJiYgbGVuZ3RoID09IGZTYXZlZExlbmd0aCAmJiBmU2F2ZWRSYW5nZXMgIT0gbnVsbCkgewotCQkJZXZlbnQuc3R5bGVzID0gZlNhdmVkUmFuZ2VzOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gbmVlZCB0byBhc3NpZ24gdGhpcyBhcnJheSBoZXJlLCBvciBlbHNlIHRoZSBmaWVsZCB3b24ndCBnZXQKLQkJCS8vIHVwZGF0ZWQKLQkJCWV2ZW50LnN0eWxlcyA9IGxpbmVHZXRTdHlsZShvZmZzZXQsIGxlbmd0aCk7Ci0JCQkvLyBub3cgc2F2ZWQgImNhY2hlZCBkYXRhIiBmb3IgcmVwZWF0ZWQgcmVxdWVzdHMgd2hpY2ggYXJlIGV4YWNsdHkKLQkJCS8vIHNhbWUKLQkJCWZTYXZlZE9mZnNldCA9IG9mZnNldDsKLQkJCWZTYXZlZExlbmd0aCA9IGxlbmd0aDsKLQkJCWZTYXZlZFJhbmdlcyA9IGV2ZW50LnN0eWxlczsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGU6IGl0cyB2ZXJ5IGltcG9ydGFudCB0aGlzIG1ldGhvZCBuZXZlciByZXR1cm4gbnVsbCwgd2hpY2ggaXMgd2h5Ci0JICogdGhlIGZpbmFsIG51bGwgY2hlY2sgaXMgaW4gYSBmaW5hbGx5IGNsYXVzZQotCSAqLwotCi0JcHJvdGVjdGVkIFN0eWxlUmFuZ2VbXSBwcmVwYXJlU3R5bGVSYW5nZXNBcnJheShJVHlwZWRSZWdpb25bXSBwYXJ0aXRpb25zLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQotCQlTdHlsZVJhbmdlW10gcmVzdWx0ID0gRU1QVFlfU1RZTEVfUkFOR0U7Ci0KLQkJaWYgKGZIb2xkU3R5bGVSZXN1bHRzID09IG51bGwpIHsKLQkJCWZIb2xkU3R5bGVSZXN1bHRzID0gbmV3IEFycmF5TGlzdChwYXJ0aXRpb25zLmxlbmd0aCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmSG9sZFN0eWxlUmVzdWx0cy5jbGVhcigpOwotCQl9Ci0KLQkJLy8gVE9ETzogbWFrZSBzb21lIG9mIHRoZXNlIGluc3RhbmNlIHZhcmlhYmxlcyB0byBwcmV2ZW50IGNyZWF0aW9uIG9uCi0JCS8vIHN0YWNrCi0JCUxpbmVTdHlsZVByb3ZpZGVyIGN1cnJlbnRMaW5lU3R5bGVQcm92aWRlciA9IG51bGw7Ci0JCWJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUlUeXBlZFJlZ2lvbiBjdXJyZW50UGFydGl0aW9uID0gcGFydGl0aW9uc1tpXTsKLQkJCWN1cnJlbnRMaW5lU3R5bGVQcm92aWRlciA9IGdldFByb3ZpZGVyRm9yKGN1cnJlbnRQYXJ0aXRpb24pOwotCQkJY3VycmVudExpbmVTdHlsZVByb3ZpZGVyLmluaXQoZ2V0RG9jdW1lbnQoKSwgdGhpcyk7Ci0JCQloYW5kbGVkID0gY3VycmVudExpbmVTdHlsZVByb3ZpZGVyLnByZXBhcmVSZWdpb25zKGN1cnJlbnRQYXJ0aXRpb24sIGN1cnJlbnRQYXJ0aXRpb24uZ2V0T2Zmc2V0KCksIGN1cnJlbnRQYXJ0aXRpb24uZ2V0TGVuZ3RoKCksIGZIb2xkU3R5bGVSZXN1bHRzKTsKLQkJCWlmIChEZWJ1Zy5zeW50YXhIaWdobGlnaHRpbmcgJiYgIWhhbmRsZWQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRpZCBub3QgaGFuZGxlIGhpZ2hsaWdodGluZyBpbiBIaWdobGlnaHRlciBpbm5lciB3aGlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpbnQgcmVzdWx0U2l6ZSA9IGZIb2xkU3R5bGVSZXN1bHRzLnNpemUoKTsKLQkJaWYgKHJlc3VsdFNpemUgPiAwKSB7Ci0JCQlyZXN1bHQgPSAoU3R5bGVSYW5nZVtdKSBmSG9sZFN0eWxlUmVzdWx0cy50b0FycmF5KG5ldyBTdHlsZVJhbmdlW2ZIb2xkU3R5bGVSZXN1bHRzLnNpemUoKV0pOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gRU1QVFlfU1RZTEVfUkFOR0U7Ci0JCX0KLQkJcmVzdWx0ID0gY29udmVydFJlYWRPbmx5UmVnaW9ucyhyZXN1bHQsIHN0YXJ0LCBsZW5ndGgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2hEaXNwbGF5KCkgewotCQlpZiAodGV4dFdpZGdldCAhPSBudWxsICYmICF0ZXh0V2lkZ2V0LmlzRGlzcG9zZWQoKSkKLQkJCXRleHRXaWRnZXQucmVkcmF3KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaERpc3BsYXkoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmICh0ZXh0V2lkZ2V0ICE9IG51bGwgJiYgIXRleHRXaWRnZXQuaXNEaXNwb3NlZCgpKQotCQkJdGV4dFdpZGdldC5yZWRyYXdSYW5nZShzdGFydCwgbGVuZ3RoLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm92aWRlcihTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlnZXRUYWJsZU9mUHJvdmlkZXJzKCkucmVtb3ZlKHBhcnRpdGlvblR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoU3RyaW5nIHBhcnRpdGlvbmluZykgewotCQlpZiAocGFydGl0aW9uaW5nICE9IG51bGwpIHsKLQkJCWZQYXJ0aXRpb25pbmcgPSBwYXJ0aXRpb25pbmc7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmUGFydGl0aW9uaW5nID0gSURvY3VtZW50RXh0ZW5zaW9uMy5ERUZBVUxUX1BBUlRJVElPTklORzsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVuaW5zdGFsbHMgaGlnaGxpZ2h0ZXIgc3VwcG9ydCBmcm9tIHRoZSB0ZXh0IHZpZXdlciBpdCBoYXMgcHJldmlvdXNseQotCSAqIGJlIGluc3RhbGxlZCBvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCWlmICh0ZXh0V2lkZ2V0ICE9IG51bGwgJiYgIXRleHRXaWRnZXQuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0ZXh0V2lkZ2V0LnJlbW92ZUxpbmVTdHlsZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCXRleHRXaWRnZXQgPSBudWxsOwotCi0JCUNvbGxlY3Rpb24gcHJvdmlkZXJzID0gZ2V0VGFibGVPZlByb3ZpZGVycygpLnZhbHVlcygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHByb3ZpZGVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlMaW5lU3R5bGVQcm92aWRlciBsaW5lU3R5bGVQcm92aWRlciA9IChMaW5lU3R5bGVQcm92aWRlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJbGluZVN0eWxlUHJvdmlkZXIucmVsZWFzZSgpOwotCQkJLy8gdGhpcyByZW1vdmUgcHJvYmFibHkgaXNuJ3Qgc3RyaWN0bHkgbmVlZGVkLCBzaW5jZQotCQkJLy8gdHlwaWNhbGx5IGhpZ2hsaWdodGVyIGluc3RhbmNlIGFzIGEgd2hvbGUgd2lsbCBnbwotCQkJLy8gYXdheSAuLi4gYnV0IGluIGNhc2UgdGhhdCBldmVyIGNoYW5nZXMsIHRoaXMgc2VlbXMgbGlrZQotCQkJLy8gYSBiZXR0ZXIgc3R5bGUuCi0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfQotCi0JCXN5bmNocm9uaXplZCAoZ2V0RXh0ZW5kZWRQcm92aWRlcnMoKSkgewotCQkJcHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdChnZXRFeHRlbmRlZFByb3ZpZGVycygpLnZhbHVlcygpKTsKLQkJCWdldEV4dGVuZGVkUHJvdmlkZXJzKCkuY2xlYXIoKTsKLQkJfQotCQlpdGVyYXRvciA9IHByb3ZpZGVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlMaW5lU3R5bGVQcm92aWRlciBsaW5lU3R5bGVQcm92aWRlciA9IChMaW5lU3R5bGVQcm92aWRlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGxpbmVTdHlsZVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQlsaW5lU3R5bGVQcm92aWRlci5yZWxlYXNlKCk7Ci0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQotCQlJUHJlZmVyZW5jZVN0b3JlIGVkaXRvclN0b3JlID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQllZGl0b3JTdG9yZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZGb3JlZ3JvdW5kU2NhbGVMaXN0ZW5lcik7Ci0JCWRpc3Bvc2VDb2xvclRhYmxlKCk7Ci0KLQkJLy8gY2xlYXIgb3V0IGNhY2hlZCB2YXJpYWJsZXMgKGQyODI4OTQpCi0JCWZTYXZlZE9mZnNldCA9IC0xOwotCQlmU2F2ZWRMZW5ndGggPSAtMTsKLQkJZlNhdmVkUmFuZ2VzID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBQdXJlbHkgYSBkZWJ1Z2dpbmcgYWlkZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWQoU3R5bGVSYW5nZVtdIGV2ZW50U3R5bGVzLCBpbnQgc3RhcnRPZmZzZXQsIGludCBsaW5lTGVuZ3RoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChldmVudFN0eWxlcyAhPSBudWxsKSB7Ci0JCQlpZiAoZXZlbnRTdHlsZXMubGVuZ3RoID4gMCkgewotCQkJCVN0eWxlUmFuZ2UgZmlyc3QgPSBldmVudFN0eWxlc1swXTsKLQkJCQlTdHlsZVJhbmdlIGxhc3QgPSBldmVudFN0eWxlc1tldmVudFN0eWxlcy5sZW5ndGggLSAxXTsKLQkJCQlpZiAoc3RhcnRPZmZzZXQgPiBmaXJzdC5zdGFydCkgewotCQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWludCBsaW5lRW5kT2Zmc2V0ID0gc3RhcnRPZmZzZXQgKyBsaW5lTGVuZ3RoOwotCQkJCQlpbnQgbGFzdE9mZnNldCA9IGxhc3Quc3RhcnQgKyBsYXN0Lmxlbmd0aDsKLQkJCQkJaWYgKGxhc3RPZmZzZXQgPiBsaW5lRW5kT2Zmc2V0KSB7Ci0JCQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBhIHplcm8gbGVuZ3RoIGFycmF5IGlzIG9rCi0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9JSGlnaGxpZ2h0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9JSGlnaGxpZ2h0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FmMzdkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3R5bGUvSUhpZ2hsaWdodGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVTdHlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBkYXZpZHcKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIaWdobGlnaHRlciBleHRlbmRzIExpbmVTdHlsZUxpc3RlbmVyIHsKLQl2b2lkIGFkZFByb3ZpZGVyKFN0cmluZyBwYXJ0aXRpb25UeXBlLCBMaW5lU3R5bGVQcm92aWRlciBwcm92aWRlcik7Ci0KLQl2b2lkIGluc3RhbGwoSVRleHRWaWV3ZXIgdmlld2VyKTsKLQotCXZvaWQgcmVtb3ZlUHJvdmlkZXIoU3RyaW5nIHBhcnRpdGlvblR5cGUpOwotCi0Jdm9pZCBzZXREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCi0Jdm9pZCB1bmluc3RhbGwoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOTUzMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotcHVibGljIGludGVyZmFjZSBMaW5lU3R5bGVQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHByb3ZpZGVyIGZvciB0aGUgZ2l2ZW4gSGlnaGxpZ2h0ZXIgYW5kIGRvY3VtZW50LiBUaGlzCi0JICogbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UgYmVmb3JlIHByZXBhcmVSZWdpb25zIGlzIGNhbGxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiBAcGFyYW0gaGlnaGxpZ2h0ZXIKLQkgKi8KLQl2b2lkIGluaXQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgSGlnaGxpZ2h0ZXIgaGlnaGxpZ2h0ZXIpOwotCi0JLyoqCi0JICogT3B0aW9uYWxseSBhcHBlbmRzIFN0eWxlUmFuZ2VzIHRvIHRoZSBzdHlsZVJhbmdlcyBDb2xsZWN0aW9uLCBpbiBvcmRlciwKLQkgKiBhbmQgb25seSBjb3ZlcmluZyB0aGUgZ2l2ZW4gcmFuZ2Ugd2l0aGluIHRoZSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY3VycmVudFJlZ2lvbiAtCi0JICogICAgICAgICAgICB0aGUgY3VycmVudCBkb2N1bWVudCBwYXJ0aXRpb24KLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHBhcmFtIHN0eWxlUmFuZ2VzCi0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgTGluZVN0eWxlUHJvdmlkZXIgaGFuZGxlZCB0aGUgcmVxdWVzdDsgaGFuZGxpbmcKLQkgKiAgICAgICAgIGluY2x1ZGVzIG5vdCBhZGRpbmcgU3R5bGVSYW5nZXMgaWYgdGhhdCBpcyBzdGlsbCB0aGUgY29ycmVjdAotCSAqICAgICAgICAgYmVoYXZpb3IKLQkgKi8KLQlib29sZWFuIHByZXBhcmVSZWdpb25zKElUeXBlZFJlZ2lvbiBjdXJyZW50UmVnaW9uLCBpbnQgc3RhcnQsIGludCBsZW5ndGgsIENvbGxlY3Rpb24gc3R5bGVSYW5nZXMpOwotCi0JLyoqCi0JICogSW5zdHJ1Y3RzIHRoaXMgcHJvdmlkZXIgdG8gZnJlZSB1cCBhbnkgInJlc291cmNlcyIgaXQgbWlnaHQgYmUgaG9sZGluZwotCSAqIG9uIHRvIChzdWNoIGFzIGxpc3RlbmluZyBmb3IgcHJlZmVyZW5jZSBjaGFuZ2VzKS4gSXQgaXMgb25seSBjYWxsZWQKLQkgKiBvbmNlIGluIHRoZSBsaWZldGltZSBvZiB0aGlzIHByb3ZpZGVyLgotCSAqLwotCXZvaWQgcmVsZWFzZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yTm9PcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yTm9PcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDYwOTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvck5vT3AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIGJ5IGRlZmF1bHQsIGlmIG5vIGF0dHJpYnV0ZSBwcm92aWRlciBpcyBmb3VuZCBmb3IgYQotICogY2VydGFpbiByZWdpb24gdHlwZS4gSXRzIHByb2JhYmx5IGFuIGVycm9yIGluIGEgZmFjdG9yeSBzb21ld2hlcmUgaWYgYW4KLSAqIGFkYXB0ZXIgaXMgbm90IGZvdW5kLCBidXQgdGhpcyBjbGFzcyBhbGxvd3MgdGhlIGxvZ2ljIHRvIHByb2NlZWQgYmFzaWNhbGx5Ci0gKiBzaW1wbHkgcHJvdmlkaW5nIGRlZmF1bHQgY29sb3JlZCBzeW50YXggaGlnaGxpZ2h0aW5nLgotICogCi0gKiBOb3QgdG8gYmUgc3ViY2xhc3NlZC4KLSAqLwotZmluYWwgcHVibGljIGNsYXNzIExpbmVTdHlsZVByb3ZpZGVyRm9yTm9PcCBpbXBsZW1lbnRzIExpbmVTdHlsZVByb3ZpZGVyIHsKLQotCXB1YmxpYyB2b2lkIGluaXQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgSGlnaGxpZ2h0ZXIgaGlnaGxpZ2h0ZXIpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlciNwcmVwYXJlUmVnaW9ucyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbiwKLQkgKiAgICAgIGludCwgaW50LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcmVwYXJlUmVnaW9ucyhJVHlwZWRSZWdpb24gY3VycmVudFJlZ2lvbiwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLCBDb2xsZWN0aW9uIGhvbGRSZXN1bHRzKSB7Ci0JCS8vIGFkZCBub3RoaW5nLCBidXQgc2F5IGhhbmRsZWQuCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3R5bGUvUmVjb25jaWxlckhpZ2hsaWdodGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3R5bGUvUmVjb25jaWxlckhpZ2hsaWdodGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OWIxMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL1JlY29uY2lsZXJIaWdobGlnaHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLXB1YmxpYyBjbGFzcyBSZWNvbmNpbGVySGlnaGxpZ2h0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfU1RZTEVfUFJPVklERVJfRVhURU5ERURfSUQgPSAibGluZXN0eWxlcHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE1hcCBmVGFibGVPZlByb3ZpZGVycyA9IG51bGw7Ci0KLQlwcml2YXRlIE1hcCBmRXh0ZW5kZWRQcm92aWRlcnMgPSBudWxsOwotCi0JcHJpdmF0ZSBJVGV4dFZpZXdlciBmVGV4dFZpZXdlciA9IG51bGw7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIF90cmFjZSA9IEJvb2xlYW4udmFsdWVPZihQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zdHJ1Y3R1cmVkUHJlc2VudGF0aW9uUmVjb25jaWxlciIpKS5ib29sZWFuVmFsdWUoKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUUkFDRV9QUkVGSVggPSAiU3RydWN0dXJlZFByZXNlbnRhdGlvblJlY29uY2lsZXI6ICI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGxvbmcgdGltZTA7Ci0KLQkvKioKLQkgKiBpbnN0YW5jZSBmb3Igb2xkZXIgTGluZVN0eWxlUHJvdmlkZXJzIGxvYWRlZCBieSBleHRlbnNpb24gcG9pbnQsCi0JICogY3JlYXRlZCBpZiBuZWVkZWQKLQkgKi8KLQlwcml2YXRlIENvbXBhdGlibGVIaWdobGlnaHRlciBmQ29tcGF0aWJsZUhpZ2hsaWdodGVyID0gbnVsbDsKLQotCXB1YmxpYyB2b2lkIHJlZnJlc2hEaXNwbGF5KCkgewotCQlpZiAoX3RyYWNlKSB7Ci0JCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCWlmIChmVGV4dFZpZXdlciAhPSBudWxsKQotCQkJZlRleHRWaWV3ZXIuaW52YWxpZGF0ZVRleHRQcmVzZW50YXRpb24oKTsKLQkJaWYgKF90cmFjZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFRSQUNFX1BSRUZJWCArICJSZWNvbmNpbGVySGlnaGxpZ2h0ZXIgcmVmcmVzaERpc3BsYXkgdG9vayAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3lzdGVtLm91dC5mbHVzaCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIGEgZ2l2ZW4gbGluZSBzdHlsZSBwcm92aWRlciBmb3IgYSBwYXJ0aWN1bGFyIHBhcnRpdGlvbiB0eXBlLgotCSAqIElmIHRoZXJlIGlzIGFscmVhZHkgYSBsaW5lIHN0eWxlIHByb3ZpZGVyIHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZSwgdGhlCi0JICogbmV3IGxpbmUgc3R5bGUgcHJvdmlkZXIgaXMgcmVnaXN0ZXJlZCBpbnN0ZWFkIG9mIHRoZSBvbGQgb25lLgotCSAqIAotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlCi0JICogICAgICAgICAgICB0aGUgcGFydGl0aW9uIHR5cGUgdW5kZXIgd2hpY2ggdG8gcmVnaXN0ZXIKLQkgKiBAcGFyYW0gdGhlCi0JICogICAgICAgICAgICBsaW5lIHN0eWxlIHByb3ZpZGVyIHRvIHJlZ2lzdGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgcmVtb3ZlIGFuIGV4aXN0aW5nIG9uZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3ZpZGVyKFN0cmluZyBwYXJ0aXRpb25UeXBlLCBMaW5lU3R5bGVQcm92aWRlciBwcm92aWRlcikgewotCQlnZXRUYWJsZU9mUHJvdmlkZXJzKCkucHV0KHBhcnRpdGlvblR5cGUsIHByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm92aWRlcihTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlnZXRUYWJsZU9mUHJvdmlkZXJzKCkucmVtb3ZlKHBhcnRpdGlvblR5cGUpOwotCX0KLQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlciBnZXRQcm92aWRlcihTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlMaW5lU3R5bGVQcm92aWRlciByZXN1bHQgPSAoTGluZVN0eWxlUHJvdmlkZXIpIGdldFRhYmxlT2ZQcm92aWRlcnMoKS5nZXQocGFydGl0aW9uVHlwZSk7Ci0KLQkJLy8gVGhlIHByb3ZpZGVyIHdhcyBub3Qgd2l0aGluIHRoZSBkZWZhdWx0IHNldCBvZiBwcm92aWRlcnMuIFVzZSB0aGUKLQkJLy8gZXh0ZW5kZWQgY29uZmlndXJhdGlvbgotCQkvLyB0byBsb29rIHVwIGFkZGl0aW9uYWwgcHJvdmlkZXJzCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJLy8gTk9UIFlFVCBGSU5BTElaRUQgLSBETyBOT1QgQ09OU0lERVIgQVMgQVBJCi0JCQlzeW5jaHJvbml6ZWQgKGdldEV4dGVuZGVkUHJvdmlkZXJzKCkpIHsKLQkJCQlpZiAoIWdldEV4dGVuZGVkUHJvdmlkZXJzKCkuY29udGFpbnNLZXkocGFydGl0aW9uVHlwZSkpIHsKLQkJCQkJcmVzdWx0ID0gKExpbmVTdHlsZVByb3ZpZGVyKSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCkuZ2V0Q29uZmlndXJhdGlvbihMSU5FX1NUWUxFX1BST1ZJREVSX0VYVEVOREVEX0lELCBwYXJ0aXRpb25UeXBlKTsKLQkJCQkJZ2V0RXh0ZW5kZWRQcm92aWRlcnMoKS5wdXQocGFydGl0aW9uVHlwZSwgcmVzdWx0KTsKLQotCQkJCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgZlRleHRWaWV3ZXIgIT0gbnVsbCAmJiBmVGV4dFZpZXdlci5nZXREb2N1bWVudCgpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIpIHsKLQkJCQkJCQkoKEFic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIpIHJlc3VsdCkuaW5pdCgoSVN0cnVjdHVyZWREb2N1bWVudCkgZlRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSwgdGhpcyk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCAiQ29tcGF0aWJsZUhpZ2hsaWdodGVyIGluc3RhbGxpbmcgY29tcGF0aWJpbGl0eSBmb3IgIiArIHJlc3VsdC5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmIChmQ29tcGF0aWJsZUhpZ2hsaWdodGVyID09IG51bGwpIHsKLQkJCQkJCQkJZkNvbXBhdGlibGVIaWdobGlnaHRlciA9IG5ldyBDb21wYXRpYmxlSGlnaGxpZ2h0ZXIoKTsKLQkJCQkJCQkJZkNvbXBhdGlibGVIaWdobGlnaHRlci5pbnN0YWxsKGZUZXh0Vmlld2VyKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmVzdWx0LmluaXQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZUZXh0Vmlld2VyLmdldERvY3VtZW50KCksIGZDb21wYXRpYmxlSGlnaGxpZ2h0ZXIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSAoTGluZVN0eWxlUHJvdmlkZXIpIGdldEV4dGVuZGVkUHJvdmlkZXJzKCkuZ2V0KHBhcnRpdGlvblR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTWFwIGdldFRhYmxlT2ZQcm92aWRlcnMoKSB7Ci0JCWlmIChmVGFibGVPZlByb3ZpZGVycyA9PSBudWxsKSB7Ci0JCQlmVGFibGVPZlByb3ZpZGVycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJcmV0dXJuIGZUYWJsZU9mUHJvdmlkZXJzOwotCX0KLQotCXByaXZhdGUgTWFwIGdldEV4dGVuZGVkUHJvdmlkZXJzKCkgewotCQlpZiAoZkV4dGVuZGVkUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCWZFeHRlbmRlZFByb3ZpZGVycyA9IG5ldyBIYXNoTWFwKDMpOwotCQl9Ci0JCXJldHVybiBmRXh0ZW5kZWRQcm92aWRlcnM7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zdGFsbChJVGV4dFZpZXdlciB0ZXh0Vmlld2VyKSB7Ci0JCWZUZXh0Vmlld2VyID0gdGV4dFZpZXdlcjsKLQkJaWYgKGZDb21wYXRpYmxlSGlnaGxpZ2h0ZXIgIT0gbnVsbCkgewotCQkJZkNvbXBhdGlibGVIaWdobGlnaHRlci51bmluc3RhbGwoKTsKLQkJCWZDb21wYXRpYmxlSGlnaGxpZ2h0ZXIuaW5zdGFsbChmVGV4dFZpZXdlcik7Ci0JCX0KLQkJcmVmcmVzaERpc3BsYXkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0VGFibGVPZlByb3ZpZGVycygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJTGluZVN0eWxlUHJvdmlkZXIgcHJvdmlkZXIgPSAoTGluZVN0eWxlUHJvdmlkZXIpIGl0Lm5leHQoKTsKLQkJCWlmIChwcm92aWRlciAhPSBudWxsKQotCQkJCXByb3ZpZGVyLnJlbGVhc2UoKTsKLQkJfQotCi0JCWl0ID0gZ2V0RXh0ZW5kZWRQcm92aWRlcnMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlMaW5lU3R5bGVQcm92aWRlciBwcm92aWRlciA9IChMaW5lU3R5bGVQcm92aWRlcikgaXQubmV4dCgpOwotCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpCi0JCQkJcHJvdmlkZXIucmVsZWFzZSgpOwotCQl9Ci0KLQkJZ2V0VGFibGVPZlByb3ZpZGVycygpLmNsZWFyKCk7Ci0JCWdldEV4dGVuZGVkUHJvdmlkZXJzKCkuY2xlYXIoKTsKLQkJZlRhYmxlT2ZQcm92aWRlcnMgPSBudWxsOwotCQlpZiAoZkNvbXBhdGlibGVIaWdobGlnaHRlciAhPSBudWxsKSB7Ci0JCQlmQ29tcGF0aWJsZUhpZ2hsaWdodGVyLnVuaW5zdGFsbCgpOwotCQl9Ci0JCWZUZXh0Vmlld2VyID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3R5bGUvU3RydWN0dXJlZFByZXNlbnRhdGlvblJlY29uY2lsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9TdHJ1Y3R1cmVkUHJlc2VudGF0aW9uUmVjb25jaWxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDM5ZDZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9TdHJ1Y3R1cmVkUHJlc2VudGF0aW9uUmVjb25jaWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0UG9zaXRpb25VcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lckV4dGVuc2lvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVBvc2l0aW9uVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlR5cGVkUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5wcmVzZW50YXRpb24uSVByZXNlbnRhdGlvbkRhbWFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5wcmVzZW50YXRpb24uSVByZXNlbnRhdGlvblJlY29uY2lsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5wcmVzZW50YXRpb24uSVByZXNlbnRhdGlvblJlY29uY2lsZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5wcmVzZW50YXRpb24uSVByZXNlbnRhdGlvblJlcGFpcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5FZGl0b3JQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkVkaXRvclV0aWxpdHk7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkUHJlc2VudGF0aW9uUmVjb25jaWxlciBpbXBsZW1lbnRzIElQcmVzZW50YXRpb25SZWNvbmNpbGVyLCBJUHJlc2VudGF0aW9uUmVjb25jaWxlckV4dGVuc2lvbiB7Ci0KLQkvKiogUHJlZml4IG9mIHRoZSBuYW1lIG9mIHRoZSBwb3NpdGlvbiBjYXRlZ29yeSBmb3IgdHJhY2tpbmcgZGFtYWdlIHJlZ2lvbnMuICovCi0JZmluYWwgc3RhdGljIFN0cmluZyBUUkFDS0VEX1BBUlRJVElPTj0gIl9fcmVjb25jaWxlcl90cmFja2VkX3BhcnRpdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIF90cmFjZSA9IEJvb2xlYW4udmFsdWVPZihQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zdHJ1Y3R1cmVkUHJlc2VudGF0aW9uUmVjb25jaWxlciIpKS5ib29sZWFuVmFsdWUoKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gX3RyYWNlVGltZSA9IEJvb2xlYW4udmFsdWVPZihQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zdHJ1Y3R1cmVkUHJlc2VudGF0aW9uUmVjb25jaWxlci90aW1lIikpLmJvb2xlYW5WYWx1ZSgpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFX1BSRUZJWCA9ICJTdHJ1Y3R1cmVkUHJlc2VudGF0aW9uUmVjb25jaWxlcjogIjsKLQlwcml2YXRlIGxvbmcgdGltZTA7Ci0JcHJpdmF0ZSBsb25nIHRpbWUxOwotCi0KLQkvKioKLQkgKiBBIHV0aWxpdHkgY2xhc3MgdG8gZG8gdmFyaW91cyBjb2xvciBtYW5pcHVsYXRpb25zCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBZVVZfUkdCQ29udmVydGVyIHsKLQkJLyoqCi0JCSAqIFRoaXMgY2xhc3MgImhvbGRzIiB0aGUgWVVWIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIFJHQiBjb2xvcgotCQkgKi8KLQkJcHJpdmF0ZSBjbGFzcyBZVVYgewotCi0JCQljbGFzcyBOb3JtYWxpemVkUkdCIHsKLQkJCQlkb3VibGUgYmx1ZTsKLQkJCQlkb3VibGUgZ3JlZW47Ci0JCQkJcHJpdmF0ZSBmaW5hbCBkb3VibGUgbWF4UkdCID0gMjU2LjA7Ci0JCQkJZG91YmxlIHJlZDsKLQotCQkJCXB1YmxpYyBOb3JtYWxpemVkUkdCKFJHQiByZ2IpIHsKLQkJCQkJLy8gZmlyc3Qgbm9ybWFsaXplIHRvIGJldHdlZW4gMCAtIDEKLQkJCQkJcmVkID0gcmdiLnJlZCAvIG1heFJHQjsKLQkJCQkJZ3JlZW4gPSByZ2IuZ3JlZW4gLyBtYXhSR0I7Ci0JCQkJCWJsdWUgPSByZ2IuYmx1ZSAvIG1heFJHQjsKLQotCQkJCQlyZWQgPSBnYW1tYU5vcm1hbGl6ZWQocmVkKTsKLQkJCQkJZ3JlZW4gPSBnYW1tYU5vcm1hbGl6ZWQoZ3JlZW4pOwotCQkJCQlibHVlID0gZ2FtbWFOb3JtYWxpemVkKGJsdWUpOwotCi0JCQkJfQotCQkJfQotCi0JCQlwcml2YXRlIE5vcm1hbGl6ZWRSR0Igbm9ybWFsaXplZFJHQjsKLQotCQkJUkdCIG9yaWdpbmFsUkdCOwotCQkJcHJpdmF0ZSBkb3VibGUgdSA9IC0xOwotCQkJcHJpdmF0ZSBkb3VibGUgdiA9IC0xOwotCQkJcHJpdmF0ZSBkb3VibGUgeSA9IC0xOwotCi0JCQlwcml2YXRlIFlVVigpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCi0JCQlwdWJsaWMgWVVWKGRvdWJsZSB5LCBkb3VibGUgdSwgZG91YmxlIHYpIHsKLQkJCQl0aGlzKCk7Ci0JCQkJdGhpcy55ID0geTsKLQkJCQl0aGlzLnUgPSB1OwotCQkJCXRoaXMudiA9IHY7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBZVVYoUkdCIHJnYikgewotCQkJCXRoaXMoKTsKLQkJCQlvcmlnaW5hbFJHQiA9IHJnYjsKLQkJCQlub3JtYWxpemVkUkdCID0gbmV3IE5vcm1hbGl6ZWRSR0IocmdiKTsKLQkJCQkvLyBmb3JjZSBjYWxjdWxhdGlvbnMKLQkJCQlnZXRZKCk7Ci0JCQkJZ2V0VigpOwotCQkJCWdldFUoKTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBub3JtYWxpemUgdG8gImF2ZXJhZ2UiIGdhbW1hIDIuMjIyMiBvciAxLzAuNDUKLQkJCSAqLwotCQkJZG91YmxlIGdhbW1hTm9ybWFsaXplZChkb3VibGUgY29sb3JDb21wb25lbnQpIHsKLQkJCQlpZiAoY29sb3JDb21wb25lbnQgPCAwLjAxOCkgewotCQkJCQlyZXR1cm4gY29sb3JDb21wb25lbnQgKiAwLjQ1OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIDEuMDk5ICogTWF0aC5wb3coY29sb3JDb21wb25lbnQsIDAuNDUpIC0gMC4wOTk7Ci0JCQkJfQotCQkJfQotCi0JCQkvKioKLQkJCSAqIEByZXR1cm4gUkdCIGJhc2VkIG9uIG9yaWdpbmFsIFJHQiBhbmQgY3VycmVudCBZVVYgdmFsdWVzOwotCQkJICovCi0JCQlwdWJsaWMgUkdCIGdldFJHQigpIHsKLQkJCQlSR0IgcmVzdWx0ID0gbnVsbDsKLQkJCQlkb3VibGUgciA9IGdldFkoKSArIDEuMTQgKiBnZXRWKCk7Ci0JCQkJZG91YmxlIGcgPSBnZXRZKCkgLSAwLjM5NSAqIGdldFUoKSAtIDAuNTggKiBnZXRWKCk7Ci0JCQkJZG91YmxlIGIgPSBnZXRZKCkgKyAyLjAzMiAqIGdldFUoKTsKLQotCQkJCWludCByZWQgPSAoaW50KSAoaW52ZXJzZUdhbW1hTm9ybWFsaXplZChyKSAqIDI1Nik7Ci0JCQkJaW50IGdyZWVuID0gKGludCkgKGludmVyc2VHYW1tYU5vcm1hbGl6ZWQoZykgKiAyNTYpOwotCQkJCWludCBibHVlID0gKGludCkgKGludmVyc2VHYW1tYU5vcm1hbGl6ZWQoYikgKiAyNTYpOwotCQkJCWlmIChyZWQgPCAwKQotCQkJCQlyZWQgPSAwOwotCQkJCWVsc2UgaWYgKHJlZCA+IDI1NSkKLQkJCQkJcmVkID0gMjU1OwotCQkJCWlmIChncmVlbiA8IDApCi0JCQkJCWdyZWVuID0gMDsKLQkJCQllbHNlIGlmIChncmVlbiA+IDI1NSkKLQkJCQkJZ3JlZW4gPSAyNTU7Ci0JCQkJaWYgKGJsdWUgPCAwKQotCQkJCQlibHVlID0gMDsKLQkJCQllbHNlIGlmIChibHVlID4gMjU1KQotCQkJCQlibHVlID0gMjU1OwotCi0JCQkJcmVzdWx0ID0gbmV3IFJHQihyZWQsIGdyZWVuLCBibHVlKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwdWJsaWMgZG91YmxlIGdldFUoKSB7Ci0JCQkJaWYgKHUgPT0gLTEpIHsKLQkJCQkJdSA9IDAuNDk0OSAqIChub3JtYWxpemVkUkdCLmJsdWUgLSBnZXRZKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gdTsKLQotCQkJfQotCi0JCQlwdWJsaWMgZG91YmxlIGdldFYoKSB7Ci0JCQkJaWYgKHYgPT0gLTEpIHsKLQkJCQkJdiA9IDAuODc3ICogKG5vcm1hbGl6ZWRSR0IucmVkIC0gZ2V0WSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHY7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBkb3VibGUgZ2V0WSgpIHsKLQkJCQlpZiAoeSA9PSAtMSkgewotCQkJCQl5ID0gMC4yOTkgKiBub3JtYWxpemVkUkdCLnJlZCArIDAuNTg3ICogbm9ybWFsaXplZFJHQi5ncmVlbiArIDAuMTE0ICogbm9ybWFsaXplZFJHQi5ibHVlOwotCQkJCX0KLQkJCQlyZXR1cm4geTsKLQkJCX0KLQotCQkJZG91YmxlIGludmVyc2VHYW1tYU5vcm1hbGl6ZWQoZG91YmxlIGNvbG9yQ29tcG9uZW50KSB7Ci0JCQkJaWYgKGNvbG9yQ29tcG9uZW50IDwgMC4wMTgpIHsKLQkJCQkJcmV0dXJuIGNvbG9yQ29tcG9uZW50ICogLjIyMjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBNYXRoLnBvdygoKC45MDk5ICogY29sb3JDb21wb25lbnQgKyAwLjA5KSksIDIuMjIpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0KLQkJcHVibGljIFlVVl9SR0JDb252ZXJ0ZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGRvdWJsZSBjYWxjdWxhdGVZQ29tcG9uZW50KENvbG9yIHRhcmdldENvbG9yKSB7Ci0JCQlyZXR1cm4gbmV3IFlVVih0YXJnZXRDb2xvci5nZXRSR0IoKSkuZ2V0WSgpOwotCQl9Ci0KLQkJcHVibGljIFJHQiB0cmFuc2Zvcm1SR0IoUkdCIG9yaWdpbmFsUkdCLCBkb3VibGUgc2NhbGVGYWN0b3IsIGRvdWJsZSB0YXJnZXQpIHsKLQkJCVJHQiB0cmFuc2Zvcm1lZFJHQiA9IG51bGw7Ci0JCQkvLyBDQ0lSNjAxIHl1diA9IG5ldyBDQ0lSNjAxKG9yaWdpbmFsUkdCKTsKLQkJCVlVViB5dXYgPSBuZXcgWVVWKG9yaWdpbmFsUkdCKTsKLQkJCWRvdWJsZSB5ID0geXV2LmdldFkoKTsKLQkJCS8vIHplcm8gaXMgYmxhY2ssIG9uZSBpcyB3aGl0ZQotCQkJaWYgKHkgPCB0YXJnZXQpIHsKLQkJCQkvLyBpcyAiZGFyayIgbWFrZSBsaWdodGVyCi0JCQkJeSA9IHkgKyAoKHRhcmdldCAtIHkpICogc2NhbGVGYWN0b3IpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gaXMgImxpZ2h0IiBtYWtlIGRhcmtlcgotCQkJCXkgPSB5IC0gKCh5IC0gdGFyZ2V0KSAqIHNjYWxlRmFjdG9yKTsKLQkJCX0KLQkJCS8vIHl1di5zZXRZKHkpOwotCQkJWVVWIG5ld1lVViA9IG5ldyBZVVYoeSwgeXV2LmdldFUoKSwgeXV2LmdldFYoKSk7Ci0JCQkvLyBDQ0lSNjAxIG5ld1lVViA9IG5ldyBDQ0lSNjAxKHksIHl1di5nZXRDYjYwMSgpLAotCQkJLy8geXV2LmdldENyNjAxKCkpOwotCQkJdHJhbnNmb3JtZWRSR0IgPSBuZXdZVVYuZ2V0UkdCKCk7Ci0JCQlyZXR1cm4gdHJhbnNmb3JtZWRSR0I7Ci0JCX0KLQotCQlwdWJsaWMgUkdCIHRyYW5zZm9ybVJHQlRvR3JleShSR0Igb3JpZ2luYWxSR0IsIGRvdWJsZSBzY2FsZUZhY3RvciwgZG91YmxlIHRhcmdldCkgewotCQkJUkdCIHRyYW5zZm9ybWVkUkdCID0gbnVsbDsKLQkJCS8vIHdlIGxlZnQgdGhlICJmdWxsIiBBUEkgbWV0aG9kIHNpZ25hdHVyZSwgYnV0IHRoaXMKLQkJCS8vIHZlcnNpb24gZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgb3JpZ2luYWxSR0IsIHRob3VnaAotCQkJLy8gaXQgbWlnaHQgc29tZWRheS4KLQkJCS8vIGZvciBub3csIHdlJ2xsIHNpbXBseSBtYWtlIHRoZSBuZXcgUkdCIGdyZXksIGVpdGhlciBhIGxpdHRsZQotCQkJLy8gbGlnaHRlciwgb3IgYSBsaXR0bGUgZGFya2VyIHRoYW4gYmFja2dyb3VuZC4KLQkJCWRvdWJsZSB5ID0gMDsKLQkJCWRvdWJsZSBtaWQgPSAwLjU7Ci0JCQkvLyB6ZXJvIGlzIGJsYWNrLCBvbmUgaXMgd2hpdGUKLQkJCWlmICh0YXJnZXQgPCBtaWQpIHsKLQkJCQkvLyBpcyAiZGFyayIgbWFrZSBsaWdodGVyCi0JCQkJeSA9IHRhcmdldCArIHNjYWxlRmFjdG9yOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gaXMgImxpZ2h0IiBtYWtlIGRhcmtlcgotCQkJCXkgPSB0YXJnZXQgLSBzY2FsZUZhY3RvcjsKLQkJCX0KLQkJCWludCBjID0gKGludCkgTWF0aC5yb3VuZCh5ICogMjU1KTsKLQkJCS8vIGp1c3QgdG8gZ2F1cmQgYWdhaW5zdCBtaXMtdXNlLCBvciBzY2FsZSdzIHZhbHVlcyBncmVhdGVyCi0JCQkvLyB0aGFuIG1pZCBwb2ludCAoYW5kIHBvc3NpYmx5IHJvdW5kaW5nIGVycm9yKQotCQkJaWYgKGMgPiAyNTUpCi0JCQkJYyA9IDI1NTsKLQkJCWlmIChjIDwgMCkKLQkJCQljID0gMDsKLQkJCXRyYW5zZm9ybWVkUkdCID0gbmV3IFJHQihjLCBjLCBjKTsKLQkJCXJldHVybiB0cmFuc2Zvcm1lZFJHQjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEludGVybmFsIGxpc3RlbmVyIGNsYXNzLgotCSAqLwotCWNsYXNzIEludGVybmFsTGlzdGVuZXIgaW1wbGVtZW50cwotCQkJSVRleHRJbnB1dExpc3RlbmVyLCBJRG9jdW1lbnRMaXN0ZW5lciwgSVRleHRMaXN0ZW5lciwgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLAotCQkJSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIsIElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uLCBJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lckV4dGVuc2lvbjIsIElEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIgewotCi0JCS8qKiBTZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYmV0d2VlbiBhIGRvY3VtZW50IGFib3V0IHRvIGJlIGNoYW5nZWQgYW5kIGEgY2hhbmdlZCBldmVudC4gKi8KLQkJcHJpdmF0ZSBib29sZWFuIGZEb2N1bWVudENoYW5naW5nPSBmYWxzZTsKLQkJCi0JCS8qKiBGbGFnIGZvciB0aGUgZG9jdW1lbnQgYmVpbmcgaW4gYSByZXdyaXRlIHNlc3Npb24gKi8KLQkJcHJpdmF0ZSBib29sZWFuIGZJblJld3JpdGVTZXNzaW9uID0gZmFsc2U7Ci0JCQotCQkvKiogRmxhZyBmb3Igc29tZSBraW5kIG9mIGNoYW5nZXMgYmVpbmcgYXBwbGllZCBkdXJpbmcgYSBkb2N1bWVudCByZXdyaXRlIHNlc3Npb24gKi8KLQkJcHJpdmF0ZSBib29sZWFuIGZIYXNJbmNvbWluZ0NoYW5nZXMgPSBmYWxzZTsKLQkJCi0JCS8qKgotCQkgKiBUaGUgY2FjaGVkIHJlZHJhdyBzdGF0ZSBvZiB0aGUgdGV4dCB2aWV3ZXIuCi0JCSAqIEBzaW5jZSAzLjAKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBmQ2FjaGVkUmVkcmF3U3RhdGU9IHRydWU7Ci0KLQkJcHVibGljIHZvaWQgbmV3TW9kZWwoTmV3RG9jdW1lbnRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJaWYoZkluUmV3cml0ZVNlc3Npb24pIHsKLQkJCQlmSGFzSW5jb21pbmdDaGFuZ2VzID0gdHJ1ZTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoX3RyYWNlKSB7Ci0JCQkJdGltZTEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJCWludCBsZW5ndGggPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRMZW5ndGgoKTsKLQkJCXJlY29yZERhbWFnZShuZXcgUmVnaW9uKDAsIGxlbmd0aCksIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldERvY3VtZW50KCkpOwotCQkJaWYgKF90cmFjZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG4iICsgVFJBQ0VfUFJFRklYICsgImNhbGN1bGF0ZWQgZGFtYWdlIGZvciBOZXdEb2N1bWVudEV2ZW50OiAobGVuZ3RoPSIgKyBsZW5ndGggKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0JCQl9Ci0JCQlpZiAoX3RyYWNlICYmIF90cmFjZVRpbWUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVFJBQ0VfUFJFRklYICsgImNhbGN1bGF0ZWQgZGFtYWdlIGZvciBOZXdEb2N1bWVudEV2ZW50IGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktdGltZTEpICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCVN5c3RlbS5vdXQuZmx1c2goKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCWlmKGZJblJld3JpdGVTZXNzaW9uKSB7Ci0JCQkJZkhhc0luY29taW5nQ2hhbmdlcyA9IHRydWU7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKF90cmFjZSkgewotCQkJCXRpbWUxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQucmVhc29uICE9IE5vQ2hhbmdlRXZlbnQuTk9fRVZFTlQpIHsKLQkJCQlJUmVnaW9uIGRhbWFnZSA9IG5ldyBSZWdpb24oMCwgc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZkRvY3VtZW50LmdldExlbmd0aCgpKTsKLQkJCQlyZWNvcmREYW1hZ2UoZGFtYWdlLCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5mRG9jdW1lbnQpOwotCQkJfQotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LnJlYXNvbiA9PSBOb0NoYW5nZUV2ZW50LlJFQURfT05MWV9TVEFURV9DSEFOR0UpIHsKLQkJCQlmVmlld2VyLmludmFsaWRhdGVUZXh0UHJlc2VudGF0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoX3RyYWNlICYmIF90cmFjZVRpbWUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuIiArIFRSQUNFX1BSRUZJWCArICJjYWxjdWxhdGVkIGRhbWFnZSBmb3IgTm9DaGFuZ2VFdmVudCBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXRpbWUxKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlpZihmSW5SZXdyaXRlU2Vzc2lvbikgewotCQkJCWZIYXNJbmNvbWluZ0NoYW5nZXMgPSB0cnVlOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChfdHJhY2UpIHsKLQkJCQl0aW1lMSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQkJSVJlZ2lvbiBkYW1hZ2U7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdEb2N1bWVudFJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCQlpZiAobmV3RG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpID4gMCkgewotCQkJCWludCBzdGFydE9mZnNldCA9IG5ld0RvY3VtZW50UmVnaW9ucy5pdGVtKDApLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGxlbmd0aCA9IG5ld0RvY3VtZW50UmVnaW9ucy5pdGVtKG5ld0RvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKSAtIDEpLmdldEVuZE9mZnNldCgpIC0gc3RhcnRPZmZzZXQ7Ci0JCQkJZGFtYWdlID0gbmV3IFJlZ2lvbihzdGFydE9mZnNldCwgbGVuZ3RoKTsKLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZGFtYWdlID0gbmV3IFJlZ2lvbihzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5mT2Zmc2V0LCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCQlyZWNvcmREYW1hZ2UoZGFtYWdlLCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5mRG9jdW1lbnQpOwotCQkJaWYgKF90cmFjZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG4iICsgVFJBQ0VfUFJFRklYICsgImNhbGN1bGF0ZWQgZGFtYWdlIGZvciBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDogWyIgKyBkYW1hZ2UuZ2V0T2Zmc2V0KCkgKyAiOiIgKyBkYW1hZ2UuZ2V0TGVuZ3RoKCkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtNCQKLQkJCQlTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0JCQl9Ci0JCQlpZiAoX3RyYWNlICYmIF90cmFjZVRpbWUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVFJBQ0VfUFJFRklYICsgImNhbGN1bGF0ZWQgZGFtYWdlIGZvciBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXRpbWUxKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJaWYoZkluUmV3cml0ZVNlc3Npb24pIHsKLQkJCQlmSGFzSW5jb21pbmdDaGFuZ2VzID0gdHJ1ZTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoX3RyYWNlKSB7Ci0JCQkJdGltZTEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCUlUZXh0UmVnaW9uIGNoYW5nZWRSZWdpb24gPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRSZWdpb24oKTsKLQkJCWludCBzdGFydE9mZnNldCA9IGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNoYW5nZWRSZWdpb24pOwotCQkJaW50IGxlbmd0aCA9IGNoYW5nZWRSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQlJUmVnaW9uIGRhbWFnZSA9IG5ldyBSZWdpb24oc3RhcnRPZmZzZXQsIGxlbmd0aCk7Ci0KLQkJCXJlY29yZERhbWFnZShkYW1hZ2UsIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmZEb2N1bWVudCk7Ci0JCQlpZiAoX3RyYWNlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJcbiIgKyBUUkFDRV9QUkVGSVggKyAiY2FsY3VsYXRlZCBkYW1hZ2UgZm9yIFJlZ2lvbkNoYW5nZWRFdmVudDogWyIgKyBkYW1hZ2UuZ2V0T2Zmc2V0KCkgKyAiOiIgKyBkYW1hZ2UuZ2V0TGVuZ3RoKCkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtNCQKLQkJCQlTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0JCQl9Ci0JCQlpZiAoX3RyYWNlICYmIF90cmFjZVRpbWUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVFJBQ0VfUFJFRklYICsgImNhbGN1bGF0ZWQgZGFtYWdlIGZvciBSZWdpb25DaGFuZ2VkRXZlbnQgaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKS10aW1lMSkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJU3lzdGVtLm91dC5mbHVzaCgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVnaW9uc1JlcGxhY2VkKFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlpZihmSW5SZXdyaXRlU2Vzc2lvbikgewotCQkJCWZIYXNJbmNvbWluZ0NoYW5nZXMgPSB0cnVlOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChfdHJhY2UpIHsKLQkJCQl0aW1lMSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQkJSVJlZ2lvbiBkYW1hZ2U7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE5ld1JlZ2lvbnMoKTsKLQkJCWlmIChuZXdSZWdpb25zLnNpemUoKSA+IDApIHsKLQkJCQlJVGV4dFJlZ2lvbiBmaXJzdENoYW5nZWRSZWdpb24gPSBuZXdSZWdpb25zLmdldCgwKTsKLQkJCQlJVGV4dFJlZ2lvbiBsYXN0Q2hhbmdlZFJlZ2lvbiA9IG5ld1JlZ2lvbnMuZ2V0KG5ld1JlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCQkJaW50IHN0YXJ0T2Zmc2V0ID0gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZmlyc3RDaGFuZ2VkUmVnaW9uKTsKLQkJCQlpbnQgbGVuZ3RoID0gZG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KGxhc3RDaGFuZ2VkUmVnaW9uKSAtIHN0YXJ0T2Zmc2V0OwotCQkJCWRhbWFnZSA9IG5ldyBSZWdpb24oc3RhcnRPZmZzZXQsIGxlbmd0aCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlkYW1hZ2UgPSBuZXcgUmVnaW9uKGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGRvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJCXJlY29yZERhbWFnZShkYW1hZ2UsIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmZEb2N1bWVudCk7Ci0JCQlpZiAoX3RyYWNlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJcbiIgKyBUUkFDRV9QUkVGSVggKyAiY2FsY3VsYXRlZCBkYW1hZ2UgZm9yIFJlZ2lvbnNSZXBsYWNlZEV2ZW50OiBbIiArIGRhbWFnZS5nZXRPZmZzZXQoKSArICI6IiArIGRhbWFnZS5nZXRMZW5ndGgoKSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkLy8kTk9OLU5MUy00JAotCQkJCVN5c3RlbS5vdXQuZmx1c2goKTsKLQkJCX0KLQkJCWlmIChfdHJhY2UgJiYgX3RyYWNlVGltZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihUUkFDRV9QUkVGSVggKyAiY2FsY3VsYXRlZCBkYW1hZ2UgZm9yIFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktdGltZTEpICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCVN5c3RlbS5vdXQuZmx1c2goKTsKLQkJCX0KLQkJfQotCQkKLQkJLyoKLQkJICogQHNlZSBJVGV4dElucHV0TGlzdGVuZXIjaW5wdXREb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoSURvY3VtZW50LCBJRG9jdW1lbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnB1dERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChJRG9jdW1lbnQgb2xkRG9jdW1lbnQsIElEb2N1bWVudCBuZXdEb2N1bWVudCkgewotCQkJaWYgKG9sZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCi0JCQkJCWZWaWV3ZXIucmVtb3ZlVGV4dExpc3RlbmVyKHRoaXMpOwotCQkJCQlvbGREb2N1bWVudC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCQkJCQlvbGREb2N1bWVudC5yZW1vdmVEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyKHRoaXMpOwotCQkJCQlpZiAob2xkRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIG9sZERvY3VtZW50KS5yZW1vdmVEb2N1bWVudENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJCQkJfQotCi0JCQkJCW9sZERvY3VtZW50LnJlbW92ZVBvc2l0aW9uVXBkYXRlcihmUG9zaXRpb25VcGRhdGVyKTsKLQkJCQkJb2xkRG9jdW1lbnQucmVtb3ZlUG9zaXRpb25DYXRlZ29yeShmUG9zaXRpb25DYXRlZ29yeSk7Ci0KLQkJCQl9IGNhdGNoIChCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHgpIHsKLQkJCQkJLy8gc2hvdWxkIG5vdCBoYXBwZW5lZCBmb3IgZm9ybWVyIGlucHV0IGRvY3VtZW50czsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElUZXh0SW5wdXRMaXN0ZW5lciNpbnB1dERvY3VtZW5DaGFuZ2VkKElEb2N1bWVudCwgSURvY3VtZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXREb2N1bWVudENoYW5nZWQoSURvY3VtZW50IG9sZERvY3VtZW50LCBJRG9jdW1lbnQgbmV3RG9jdW1lbnQpIHsKLQkJCWlmIChfdHJhY2UgfHwgX3RyYWNlVGltZSkgewotCQkJCXRpbWUxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0KLQkJCWZEb2N1bWVudENoYW5naW5nPSBmYWxzZTsKLQkJCWZDYWNoZWRSZWRyYXdTdGF0ZT0gdHJ1ZTsKLQotCQkJaWYgKG5ld0RvY3VtZW50ICE9IG51bGwpIHsKLQkJCQluZXdEb2N1bWVudC5hZGRQb3NpdGlvbkNhdGVnb3J5KGZQb3NpdGlvbkNhdGVnb3J5KTsKLQkJCQluZXdEb2N1bWVudC5hZGRQb3NpdGlvblVwZGF0ZXIoZlBvc2l0aW9uVXBkYXRlcik7Ci0KLQkJCQluZXdEb2N1bWVudC5hZGREb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyKHRoaXMpOwotCQkJCW5ld0RvY3VtZW50LmFkZERvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JCQkJaWYobmV3RG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCSgoSVN0cnVjdHVyZWREb2N1bWVudCluZXdEb2N1bWVudCkuYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCQkJfQotCQkJCWZWaWV3ZXIuYWRkVGV4dExpc3RlbmVyKHRoaXMpOwotCi0JCQkJc2V0RG9jdW1lbnRUb0RhbWFnZXJzKG5ld0RvY3VtZW50KTsKLQkJCQlzZXREb2N1bWVudFRvUmVwYWlyZXJzKG5ld0RvY3VtZW50KTsKLQkJCQlwcm9jZXNzRGFtYWdlKG5ldyBSZWdpb24oMCwgbmV3RG9jdW1lbnQuZ2V0TGVuZ3RoKCkpLCBuZXdEb2N1bWVudCk7Ci0JCQl9Ci0JCQlpZiAoX3RyYWNlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKFRSQUNFX1BSRUZJWCArICJwcm9jZXNzZWQgZGFtYWdlIGZvciBpbnB1dERvY3VtZW50Q2hhbmdlZCBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTEpICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lciNkb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQoSURvY3VtZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkKElEb2N1bWVudCBkb2N1bWVudCkgewotCQkJaWYgKF90cmFjZVRpbWUpIHsKLQkJCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQkJaWYgKCFmRG9jdW1lbnRDaGFuZ2luZyAmJiBmQ2FjaGVkUmVkcmF3U3RhdGUpCi0JCQkJcHJvY2Vzc0RhbWFnZShuZXcgUmVnaW9uKDAsIGRvY3VtZW50LmdldExlbmd0aCgpKSwgZG9jdW1lbnQpOwotCQkJZWxzZQotCQkJCWZEb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQ9IHRydWU7Ci0JCQlpZiAoX3RyYWNlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKFRSQUNFX1BSRUZJWCArICJwcm9jZXNzZWQgZGFtYWdlIGZvciBkb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQgW2Z1bGwgZG9jdW1lbnRdIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChfdHJhY2UgJiYgX3RyYWNlVGltZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihUUkFDRV9QUkVGSVggKyAicHJvY2Vzc2VkIGRhbWFnZSBmb3IgZG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uI2RvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZChJRG9jdW1lbnQsIElSZWdpb24pCi0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZChJRG9jdW1lbnQgZG9jdW1lbnQsIElSZWdpb24gY2hhbmdlZFJlZ2lvbikgewotCQkJaWYgKF90cmFjZVRpbWUpIHsKLQkJCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQkJaWYgKCFmRG9jdW1lbnRDaGFuZ2luZyAmJiBmQ2FjaGVkUmVkcmF3U3RhdGUpIHsKLQkJCQlwcm9jZXNzRGFtYWdlKG5ldyBSZWdpb24oY2hhbmdlZFJlZ2lvbi5nZXRPZmZzZXQoKSwgY2hhbmdlZFJlZ2lvbi5nZXRMZW5ndGgoKSksIGRvY3VtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJZkRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZD0gdHJ1ZTsKLQkJCQlmQ2hhbmdlZERvY3VtZW50UGFydGl0aW9ucz0gY2hhbmdlZFJlZ2lvbjsKLQkJCX0KLQkJCWlmIChfdHJhY2UpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVFJBQ0VfUFJFRklYICsgInByb2Nlc3NlZCBkYW1hZ2UgZm9yIGRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZCBbIiArIGNoYW5nZWRSZWdpb24uZ2V0T2Zmc2V0KCkgKyAiOiIgKyBjaGFuZ2VkUmVnaW9uLmdldExlbmd0aCgpICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCWlmIChfdHJhY2UgJiYgX3RyYWNlVGltZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihUUkFDRV9QUkVGSVggKyAicHJvY2Vzc2VkIGRhbWFnZSBmb3IgZG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb24yI2RvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZEV2ZW50KQotCQkgKiBAc2luY2UgMy4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQoRG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCUlSZWdpb24gY2hhbmdlZFJlZ2lvbj0gZXZlbnQuZ2V0Q2hhbmdlZFJlZ2lvbihnZXREb2N1bWVudFBhcnRpdGlvbmluZygpKTsKLQkJCWlmIChjaGFuZ2VkUmVnaW9uICE9IG51bGwpCi0JCQkJZG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkKGV2ZW50LmdldERvY3VtZW50KCksIGNoYW5nZWRSZWdpb24pOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGUpIHsKLQotCQkJZkRvY3VtZW50Q2hhbmdpbmc9IHRydWU7Ci0JCQlpZiAoZkNhY2hlZFJlZHJhd1N0YXRlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW50IG9mZnNldD0gZS5nZXRPZmZzZXQoKSArIGUuZ2V0TGVuZ3RoKCk7Ci0JCQkJCUlUeXBlZFJlZ2lvbiByZWdpb249IGdldFBhcnRpdGlvbihlLmdldERvY3VtZW50KCksIG9mZnNldCk7Ci0JCQkJCWZSZW1lbWJlcmVkUG9zaXRpb249IG5ldyBUeXBlZFBvc2l0aW9uKHJlZ2lvbik7Ci0JCQkJCWUuZ2V0RG9jdW1lbnQoKS5hZGRQb3NpdGlvbihmUG9zaXRpb25DYXRlZ29yeSwgZlJlbWVtYmVyZWRQb3NpdGlvbik7Ci0JCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCQkvLyBjYW4gbm90IGhhcHBlbgotCQkJCX0gY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24geCkgewotCQkJCQkvLyBzaG91bGQgbm90IGhhcHBlbiBvbiBpbnB1dCBlbGVtZW50cwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSURvY3VtZW50TGlzdGVuZXIjZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCQlpZiAoZkNhY2hlZFJlZHJhd1N0YXRlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZS5nZXREb2N1bWVudCgpLnJlbW92ZVBvc2l0aW9uKGZQb3NpdGlvbkNhdGVnb3J5LCBmUmVtZW1iZXJlZFBvc2l0aW9uKTsKLQkJCQl9IGNhdGNoIChCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHgpIHsKLQkJCQkJLy8gY2FuIG5vdCBoYXBwZW4gb24gaW5wdXQgZG9jdW1lbnRzCi0JCQkJfQotCQkJfQotCQkJZkRvY3VtZW50Q2hhbmdpbmc9IGZhbHNlOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJVGV4dExpc3RlbmVyI3RleHRDaGFuZ2VkKFRleHRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHRleHRDaGFuZ2VkKFRleHRFdmVudCBlKSB7Ci0JCQlpZihmSW5SZXdyaXRlU2Vzc2lvbikgewotCQkJCWZIYXNJbmNvbWluZ0NoYW5nZXMgPSB0cnVlOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWZDYWNoZWRSZWRyYXdTdGF0ZT0gZS5nZXRWaWV3ZXJSZWRyYXdTdGF0ZSgpOwotCSAJCWlmICghZkNhY2hlZFJlZHJhd1N0YXRlKSB7Ci0JCQkJaWYgKF90cmFjZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuIiArIFRSQUNFX1BSRUZJWCArICJyZXR1cm5lZCBlYXJseSBmcm9tIHRleHRDaGFuZ2VkKFRleHRFdmVudCkiKTsgLy8kTk9OLU5MUy0xJAkgLy8kTk9OLU5MUy0yJAkKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKF90cmFjZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG4iICsgVFJBQ0VfUFJFRklYICsgImVudGVyaW5nIHRleHRDaGFuZ2VkKFRleHRFdmVudCkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQotCSAJCUlSZWdpb24gZGFtYWdlPSBudWxsOwotCSAJCUlEb2N1bWVudCBkb2N1bWVudD0gbnVsbDsKLQotCQkgCWlmIChlLmdldERvY3VtZW50RXZlbnQoKSA9PSBudWxsKSB7Ci0JCSAJCWRvY3VtZW50PSBmVmlld2VyLmdldERvY3VtZW50KCk7Ci0JCSAJCWlmIChkb2N1bWVudCAhPSBudWxsKSAgewotCQkJIAkJaWYgKGUuZ2V0T2Zmc2V0KCkgPT0gMCAmJiBlLmdldExlbmd0aCgpID09IDAgJiYgZS5nZXRUZXh0KCkgPT0gbnVsbCkgewotCQkJCQkJLy8gcmVkcmF3IHN0YXRlIGNoYW5nZSwgZGFtYWdlIHRoZSB3aG9sZSBkb2N1bWVudAotCQkJCQkJZGFtYWdlPSBuZXcgUmVnaW9uKDAsIGRvY3VtZW50LmdldExlbmd0aCgpKTsKLQkJCSAJCX0gZWxzZSB7Ci0JCQkJCQlJUmVnaW9uIHJlZ2lvbj0gd2lkZ2V0UmVnaW9uMk1vZGVsUmVnaW9uKGUpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlTdHJpbmcgdGV4dD0gZG9jdW1lbnQuZ2V0KHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCQlEb2N1bWVudEV2ZW50IGRlPSBuZXcgRG9jdW1lbnRFdmVudChkb2N1bWVudCwgcmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCksIHRleHQpOwotCQkJCQkJCWRhbWFnZT0gZ2V0RGFtYWdlKGRlLCBmYWxzZSk7Ci0JCQkJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkJCQkJLyogaWdub3JlZCBpbiBwbGF0Zm9ybSBQcmVzZW50YXRpb25SZWNvbmNpbGVyLCB0b28gKi8KLQkJCQkJCX0KLQkJCSAJCX0KLQkJIAkJfQotCQkgCX0gZWxzZSAgewotCQkgCQlEb2N1bWVudEV2ZW50IGRlPSBlLmdldERvY3VtZW50RXZlbnQoKTsKLQkJIAkJZG9jdW1lbnQ9IGRlLmdldERvY3VtZW50KCk7Ci0JCSAJCWRhbWFnZT0gZ2V0RGFtYWdlKGRlLCB0cnVlKTsKLQkJIAl9Ci0JCQlpZihfdHJhY2UgJiYgX3RyYWNlVGltZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihUUkFDRV9QUkVGSVggKyAiY2FsY3VsYXRlZCBzaW1wbGUgdGV4dCBkYW1hZ2UgYXQgIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0JCQl9Ci0KLQkJCWlmIChkYW1hZ2UgIT0gbnVsbCAmJiBkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJcHJvY2Vzc0RhbWFnZShkYW1hZ2UsIGRvY3VtZW50KTsKLQkJCQlpZihfdHJhY2UgJiYgX3RyYWNlVGltZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVFJBQ0VfUFJFRklYICsgInByb2Nlc3NlZCBzaW1wbGUgdGV4dCBkYW1hZ2UgYXQgIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJU3lzdGVtLm91dC5mbHVzaCgpOwotCQkJCX0KLQkJCX0KLQotCQkJcHJvY2Vzc1JlY29yZGVkRGFtYWdlcygpOwotCQkJaWYoX3RyYWNlICYmIF90cmFjZVRpbWUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVFJBQ0VfUFJFRklYICsgInByb2Nlc3NlZCByZWNvcmRlZCBzdHJ1Y3R1cmVkIHRleHQgZGFtYWdlIGF0ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlmRG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkPSBmYWxzZTsKLQkJCWZDaGFuZ2VkRG9jdW1lbnRQYXJ0aXRpb25zPSBudWxsOwotCQkJaWYoX3RyYWNlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKFRSQUNFX1BSRUZJWCArICJmaW5pc2hlZCB0ZXh0Q2hhbmdlZChUZXh0RXZlbnQpIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogVHJhbnNsYXRlcyB0aGUgZ2l2ZW4gdGV4dCBldmVudCBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIHJhbmdlIG9mIHRoZSB2aWV3ZXIncyBkb2N1bWVudC4KLQkJICoKLQkJICogQHBhcmFtIGUgdGhlIHRleHQgZXZlbnQKLQkJICogQHJldHVybiB0aGUgd2lkZ2V0IHJlZ2lvbiBjb3JyZXNwb25kaW5nIHRoZSByZWdpb24gb2YgdGhlIGdpdmVuIGV2ZW50Ci0JCSAqIEBzaW5jZSAyLjEKLQkJICovCi0JCXByb3RlY3RlZCBJUmVnaW9uIHdpZGdldFJlZ2lvbjJNb2RlbFJlZ2lvbihUZXh0RXZlbnQgZSkgewotCi0JCQlTdHJpbmcgdGV4dD0gZS5nZXRUZXh0KCk7Ci0JCQlpbnQgbGVuZ3RoPSB0ZXh0ID09IG51bGwgPyAwIDogdGV4dC5sZW5ndGgoKTsKLQotCQkJaWYgKGZWaWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHsKLQkJCQlJVGV4dFZpZXdlckV4dGVuc2lvbjUgZXh0ZW5zaW9uPSAoSVRleHRWaWV3ZXJFeHRlbnNpb241KSBmVmlld2VyOwotCQkJCXJldHVybiBleHRlbnNpb24ud2lkZ2V0UmFuZ2UyTW9kZWxSYW5nZShuZXcgUmVnaW9uKGUuZ2V0T2Zmc2V0KCksIGxlbmd0aCkpOwotCQkJfQotCi0JCQlJUmVnaW9uIHZpc2libGU9IGZWaWV3ZXIuZ2V0VmlzaWJsZVJlZ2lvbigpOwotCQkJSVJlZ2lvbiByZWdpb249IG5ldyBSZWdpb24oZS5nZXRPZmZzZXQoKSArIHZpc2libGUuZ2V0T2Zmc2V0KCksIGxlbmd0aCk7Ci0JCQlyZXR1cm4gcmVnaW9uOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkNoYW5nZWQoRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkV2ZW50IGV2ZW50KSB7Ci0JCQlmSW5SZXdyaXRlU2Vzc2lvbiA9IChldmVudCAhPSBudWxsICYmIGV2ZW50LmZDaGFuZ2VUeXBlID09IERvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudC5TRVNTSU9OX1NUQVJUKTsKLQkJCWlmKCFmSW5SZXdyaXRlU2Vzc2lvbiAmJiBmSGFzSW5jb21pbmdDaGFuZ2VzICYmIGV2ZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoX3RyYWNlKQotCQkJCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCXByb2Nlc3NEYW1hZ2UobmV3IFJlZ2lvbigwLCBldmVudC5mRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpLCBldmVudC5mRG9jdW1lbnQpOwotCQkJCWlmKF90cmFjZSAmJiBfdHJhY2VUaW1lKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oVFJBQ0VfUFJFRklYICsgIiBwcm9jZXNzZWQgZGFtYWdlZCBhZnRlciBlbmRpbmcgZG9jdW1lbnQgcmV3cml0ZSBzZXNzaW9uIGF0ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJZkhhc0luY29taW5nQ2hhbmdlcyA9IGZhbHNlOwotCQkJfQotCQl9Ci0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVjb3JkZWREYW1hZ2UgewotCQlJUmVnaW9uIGRhbWFnZTsgCi0JCUlEb2N1bWVudCBkb2N1bWVudDsKLQkJUmVjb3JkZWREYW1hZ2UoSVJlZ2lvbiBkYW1hZ2UsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQkJdGhpcy5kYW1hZ2UgPSBkYW1hZ2U7Ci0JCQl0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCX0KLQl9Ci0KLQkvKiogVGhlIG1hcCBvZiBwcmVzZW50YXRpb24gZGFtYWdlcnMuICovCi0JcHJpdmF0ZSBNYXAgZkRhbWFnZXJzOwotCS8qKiBUaGUgbWFwIG9mIHByZXNlbnRhdGlvbiByZXBhaXJlcnMuICovCi0JcHJpdmF0ZSBNYXAgZlJlcGFpcmVyczsKLQkvKiogVGhlIHRhcmdldCB2aWV3ZXIuICovCi0JcHJpdmF0ZSBJVGV4dFZpZXdlciBmVmlld2VyOwotCS8qKiBUaGUgaW50ZXJuYWwgbGlzdGVuZXIuICovCi0JcHJpdmF0ZSBJbnRlcm5hbExpc3RlbmVyIGZJbnRlcm5hbExpc3RlbmVyPSBuZXcgSW50ZXJuYWxMaXN0ZW5lcigpOwotCS8qKiBUaGUgbmFtZSBvZiB0aGUgcG9zaXRpb24gY2F0ZWdvcnkgdG8gdHJhY2sgZGFtYWdlIHJlZ2lvbnMuICovCi0JcHJpdmF0ZSBTdHJpbmcgZlBvc2l0aW9uQ2F0ZWdvcnk7Ci0JLyoqIFRoZSBwb3NpdGlvbiB1cGRhdGVkIGZvciB0aGUgZGFtYWdlIHJlZ2lvbnMnIHBvc2l0aW9uIGNhdGVnb3J5LiAqLwotCXByaXZhdGUgSVBvc2l0aW9uVXBkYXRlciBmUG9zaXRpb25VcGRhdGVyOwotCS8qKiBUaGUgcG9zaXRpb25zIHJlcHJlc2VudGluZyB0aGUgZGFtYWdlIHJlZ2lvbnMuICovCi0JcHJpdmF0ZSBUeXBlZFBvc2l0aW9uIGZSZW1lbWJlcmVkUG9zaXRpb247Ci0JLyoqIEZsYWcgaW5kaWNhdGluZyB0aGUgcmVjZWlwdCBvZiBhIHBhcnRpdGlvbmluZyBjaGFuZ2VkIG5vdGlmaWNhdGlvbi4gKi8KLQlwcml2YXRlIGJvb2xlYW4gZkRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZD0gZmFsc2U7Ci0JLyoqIFRoZSByYW5nZSBjb3ZlcmluZyB0aGUgY2hhbmdlZCBwYXJ0aXRpb25pbmcuICovCi0JcHJpdmF0ZSBJUmVnaW9uIGZDaGFuZ2VkRG9jdW1lbnRQYXJ0aXRpb25zPSBudWxsOwotCQotCS8qKgotCSAqIEJlY2F1c2Ugc3RydWN0dXJlZCBkb2N1bWVudCBldmVudHMgZmlyZSBiZWZvcmUgdGV4dENoYW5nZWQoKSwgaXQncwotCSAqIHBvc3NpYmxlIHRoZSB3aWRnZXQgaXNuJ3QgZnVsbHkgYXdhcmUgb2YgdGhlIGNoYW5nZXMgdG8gaXRzIGNvbnRlbnRzLgotCSAqICJSZWNvcmQiIHRoZSBkYW1hZ2UgdG8gcHJvY2VzcyBhZnRlciB0ZXh0Q2hhbmdlZCgpIGhhcyBiZWVuIGZpcmVkLgotCSAqLwotCXByaXZhdGUgTGlzdCBmUmVjb3JkZWREYW1hZ2VzID0gbmV3IEFycmF5TGlzdCgyKTsKLQkKLQkvKioKLQkgKiBUaGUgcGFydGl0aW9uaW5nIHVzZWQgYnkgdGhpcyBwcmVzZW50YXRpb24gcmVjb25jaWxlci4KLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZlBhcnRpdGlvbmluZzsKLQotCXByaXZhdGUgWVVWX1JHQkNvbnZlcnRlciByZ2JDb252ZXJ0ZXI7Ci0JcHJpdmF0ZSBNYXAgcmVhZE9ubHlDb2xvclRhYmxlOwotCWRvdWJsZSByZWFkT25seUZvcmVncm91bmRTY2FsZUZhY3RvciA9IDMwOwotCQotCS8vcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBmRG9jdW1lbnRMaXN0ZW5lciA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcigpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBwcmVzZW50YXRpb24gcmVjb25jaWxlci4gVGhlcmUgYXJlIG5vIGRhbWFnZXJzIG9yIHJlcGFpcmVycwotCSAqIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHJlY29uY2lsZXIgYnkgZGVmYXVsdC4gVGhlIGRlZmF1bHQgcGFydGl0aW9uaW5nCi0JICogPGNvZGU+SURvY3VtZW50RXh0ZW5zaW9uMy5ERUZBVUxUX1BBUlRJVElPTklORzwvY29kZT4gaXMgdXNlZC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFByZXNlbnRhdGlvblJlY29uY2lsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZQYXJ0aXRpb25pbmc9IElEb2N1bWVudEV4dGVuc2lvbjMuREVGQVVMVF9QQVJUSVRJT05JTkc7Ci0JCWZQb3NpdGlvbkNhdGVnb3J5PSBUUkFDS0VEX1BBUlRJVElPTiArIGhhc2hDb2RlKCk7Ci0JCWZQb3NpdGlvblVwZGF0ZXI9IG5ldyBEZWZhdWx0UG9zaXRpb25VcGRhdGVyKGZQb3NpdGlvbkNhdGVnb3J5KTsKLQotCQkvLyBubyBsaXN0ZW5lciBmb3Igbm93IHNpbmNlIHRoZXJlJ3Mgbm8gVUkgdG8gY2hhbmdlIHRoZSB2YWx1ZQotCQlJUHJlZmVyZW5jZVN0b3JlIGVkaXRvclN0b3JlID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlyZWFkT25seUZvcmVncm91bmRTY2FsZUZhY3RvciA9IGVkaXRvclN0b3JlLmdldEludChFZGl0b3JQcmVmZXJlbmNlTmFtZXMuUkVBRF9PTkxZX0ZPUkVHUk9VTkRfU0NBTEUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRvY3VtZW50IHBhcnRpdGlvbmluZyBmb3IgdGhpcyBwcmVzZW50YXRpb24gcmVjb25jaWxlci4KLQkgKgotCSAqIEBwYXJhbSBwYXJ0aXRpb25pbmcgdGhlIGRvY3VtZW50IHBhcnRpdGlvbmluZyBmb3IgdGhpcyBwcmVzZW50YXRpb24gcmVjb25jaWxlci4KLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoU3RyaW5nIHBhcnRpdGlvbmluZykgewotCQlBc3NlcnQuaXNOb3ROdWxsKHBhcnRpdGlvbmluZyk7Ci0JCWZQYXJ0aXRpb25pbmc9IHBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5wcmVzZW50YXRpb24uSVByZXNlbnRhdGlvblJlY29uY2lsZXJFeHRlbnNpb24jZ2VEb2N1bWVudHRQYXJ0aXRpb25pbmcoKQotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50UGFydGl0aW9uaW5nKCkgewotCQlyZXR1cm4gZlBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgdGhlIGdpdmVuIHByZXNlbnRhdGlvbiBkYW1hZ2VyIGZvciBhIHBhcnRpY3VsYXIgY29udGVudCB0eXBlLgotCSAqIElmIHRoZXJlIGlzIGFscmVhZHkgYSBkYW1hZ2VyIHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZSwgdGhlIG9sZCBkYW1hZ2VyCi0JICogaXMgcmVtb3ZlZCBmaXJzdC4KLQkgKgotCSAqIEBwYXJhbSBkYW1hZ2VyIHRoZSBwcmVzZW50YXRpb24gZGFtYWdlciB0byByZWdpc3Rlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gcmVtb3ZlIGFuIGV4aXN0aW5nIG9uZQotCSAqIEBwYXJhbSBjb250ZW50VHlwZSB0aGUgY29udGVudCB0eXBlIHVuZGVyIHdoaWNoIHRvIHJlZ2lzdGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGFtYWdlcihJUHJlc2VudGF0aW9uRGFtYWdlciBkYW1hZ2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRlbnRUeXBlKTsKLQotCQlpZiAoZkRhbWFnZXJzID09IG51bGwpCi0JCQlmRGFtYWdlcnM9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJaWYgKGRhbWFnZXIgPT0gbnVsbCkKLQkJCWZEYW1hZ2Vycy5yZW1vdmUoY29udGVudFR5cGUpOwotCQllbHNlCi0JCQlmRGFtYWdlcnMucHV0KGNvbnRlbnRUeXBlLCBkYW1hZ2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgdGhlIGdpdmVuIHByZXNlbnRhdGlvbiByZXBhaXJlciBmb3IgYSBwYXJ0aWN1bGFyIGNvbnRlbnQgdHlwZS4KLQkgKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgcmVwYWlyZXIgcmVnaXN0ZXJlZCBmb3IgdGhpcyB0eXBlLCB0aGUgb2xkIHJlcGFpcmVyCi0JICogaXMgcmVtb3ZlZCBmaXJzdC4KLQkgKgotCSAqIEBwYXJhbSByZXBhaXJlciB0aGUgcHJlc2VudGF0aW9uIHJlcGFpcmVyIHRvIHJlZ2lzdGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byByZW1vdmUgYW4gZXhpc3Rpbmcgb25lCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlIHRoZSBjb250ZW50IHR5cGUgdW5kZXIgd2hpY2ggdG8gcmVnaXN0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXBhaXJlcihJUHJlc2VudGF0aW9uUmVwYWlyZXIgcmVwYWlyZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCi0JCUFzc2VydC5pc05vdE51bGwoY29udGVudFR5cGUpOwotCi0JCWlmIChmUmVwYWlyZXJzID09IG51bGwpCi0JCQlmUmVwYWlyZXJzPSBuZXcgSGFzaE1hcCgpOwotCi0JCWlmIChyZXBhaXJlciA9PSBudWxsKQotCQkJZlJlcGFpcmVycy5yZW1vdmUoY29udGVudFR5cGUpOwotCQllbHNlCi0JCQlmUmVwYWlyZXJzLnB1dChjb250ZW50VHlwZSwgcmVwYWlyZXIpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlc2VudGF0aW9uUmVjb25jaWxlciNpbnN0YWxsKElUZXh0Vmlld2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGwoSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmKF90cmFjZSkgewotCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlBc3NlcnQuaXNOb3ROdWxsKHZpZXdlcik7Ci0KLQkJZlZpZXdlcj0gdmlld2VyOwotCQlmVmlld2VyLmFkZFRleHRJbnB1dExpc3RlbmVyKGZJbnRlcm5hbExpc3RlbmVyKTsKLQkJCi0JCUlEb2N1bWVudCBkb2N1bWVudD0gdmlld2VyLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlmSW50ZXJuYWxMaXN0ZW5lci5pbnB1dERvY3VtZW50Q2hhbmdlZChudWxsLCBkb2N1bWVudCk7Ci0JCQlpZihkb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KS5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmSW50ZXJuYWxMaXN0ZW5lcik7Ci0JCQl9Ci0JCQlpZihkb2N1bWVudCBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjQpIHsKLQkJCQkoKElEb2N1bWVudEV4dGVuc2lvbjQpIGRvY3VtZW50KS5hZGREb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIoZkludGVybmFsTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JCWlmKF90cmFjZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFRSQUNFX1BSRUZJWCArICJpbnN0YWxsZWQgdG8gdGV4dCB2aWV3ZXIgaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlc2VudGF0aW9uUmVjb25jaWxlciN1bmluc3RhbGwoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbCgpIHsKLQkJaWYoX3RyYWNlKSB7Ci0JCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCWZWaWV3ZXIucmVtb3ZlVGV4dElucHV0TGlzdGVuZXIoZkludGVybmFsTGlzdGVuZXIpOwotCi0JCUlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCWlmKCggZG9jdW1lbnQgPSBmVmlld2VyLmdldERvY3VtZW50KCkpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJKChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCkucmVtb3ZlRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkludGVybmFsTGlzdGVuZXIpOwotCQl9Ci0JCWlmKGRvY3VtZW50IGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uNCkgewotCQkJKChJRG9jdW1lbnRFeHRlbnNpb240KSBkb2N1bWVudCkucmVtb3ZlRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyKGZJbnRlcm5hbExpc3RlbmVyKTsKLQkJfQotCQkvLyBFbnN1cmUgd2UgdW5pbnN0YWxsIGFsbCBsaXN0ZW5lcnMKLQkJZkludGVybmFsTGlzdGVuZXIuaW5wdXREb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoZlZpZXdlci5nZXREb2N1bWVudCgpLCBudWxsKTsKLQkJaWYoX3RyYWNlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oVFJBQ0VfUFJFRklYICsgInVuaW5zdGFsbGVkIGZyb20gdGV4dCB2aWV3ZXIgaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlc2VudGF0aW9uUmVjb25jaWxlciNnZXREYW1hZ2VyKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVByZXNlbnRhdGlvbkRhbWFnZXIgZ2V0RGFtYWdlcihTdHJpbmcgY29udGVudFR5cGUpIHsKLQotCQlpZiAoZkRhbWFnZXJzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gKElQcmVzZW50YXRpb25EYW1hZ2VyKSBmRGFtYWdlcnMuZ2V0KGNvbnRlbnRUeXBlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZXNlbnRhdGlvblJlY29uY2lsZXIjZ2V0UmVwYWlyZXIoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJUHJlc2VudGF0aW9uUmVwYWlyZXIgZ2V0UmVwYWlyZXIoU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0KLQkJaWYgKGZSZXBhaXJlcnMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiAoSVByZXNlbnRhdGlvblJlcGFpcmVyKSBmUmVwYWlyZXJzLmdldChjb250ZW50VHlwZSk7Ci0JfQotCi0JLyoqCi0JICogSW5mb3JtcyBhbGwgcmVnaXN0ZXJlZCBkYW1hZ2VycyBhYm91dCB0aGUgZG9jdW1lbnQgb24gd2hpY2ggdGhleSB3aWxsIHdvcmsuCi0JICoKLQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IG9uIHdoaWNoIHRvIHdvcmsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudFRvRGFtYWdlcnMoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChmRGFtYWdlcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgZT0gZkRhbWFnZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlJUHJlc2VudGF0aW9uRGFtYWdlciBkYW1hZ2VyPSAoSVByZXNlbnRhdGlvbkRhbWFnZXIpIGUubmV4dCgpOwotCQkJCWRhbWFnZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5mb3JtcyBhbGwgcmVnaXN0ZXJlZCByZXBhaXJlcnMgYWJvdXQgdGhlIGRvY3VtZW50IG9uIHdoaWNoIHRoZXkgd2lsbCB3b3JrLgotCSAqCi0JICogQHBhcmFtIGRvY3VtZW50IHRoZSBkb2N1bWVudCBvbiB3aGljaCB0byB3b3JrCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG9jdW1lbnRUb1JlcGFpcmVycyhJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGZSZXBhaXJlcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgZT0gZlJlcGFpcmVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJSVByZXNlbnRhdGlvblJlcGFpcmVyIHJlcGFpcmVyPSAoSVByZXNlbnRhdGlvblJlcGFpcmVyKSBlLm5leHQoKTsKLQkJCQlyZXBhaXJlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgInJlcGFpciBkZXNjcmlwdGlvbiIgZm9yIHRoZSBnaXZlbiBkYW1hZ2UgYW5kIHJldHVybnMgdGhpcwotCSAqIGRlc2NyaXB0aW9uIGFzIGEgdGV4dCBwcmVzZW50YXRpb24uIEZvciB0aGlzLCBpdCBxdWVyaWVzIHRoZSBwYXJ0aXRpb25pbmcKLQkgKiBvZiB0aGUgZGFtYWdlIHJlZ2lvbiBhbmQgYXNrcyB0aGUgYXBwcm9wcmlhdGUgcHJlc2VudGF0aW9uIHJlcGFpcmVyIGZvcgotCSAqIGVhY2ggcGFydGl0aW9uIHRvIGNvbnN0cnVjdCB0aGUgInJlcGFpciBkZXNjcmlwdGlvbiIgZm9yIHRoaXMgcGFydGl0aW9uLgotCSAqCi0JICogQHBhcmFtIGRhbWFnZSB0aGUgZGFtYWdlIHRvIGJlIHJlcGFpcmVkCi0JICogQHBhcmFtIGRvY3VtZW50IHRoZSBkb2N1bWVudCB3aG9zZSBwcmVzZW50YXRpb24gbXVzdCBiZSByZXBhaXJlZAotCSAqIEByZXR1cm4gdGhlIHByZXNlbnRhdGlvbiByZXBhaXIgZGVzY3JpcHRpb24gYXMgdGV4dCBwcmVzZW50YXRpb24gb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBwYXJ0aXRpb25pbmcgY291bGQgbm90IGJlIGNvbXB1dGVkCi0JICovCi0JcHJvdGVjdGVkIFRleHRQcmVzZW50YXRpb24gY3JlYXRlUHJlc2VudGF0aW9uKElSZWdpb24gZGFtYWdlLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdHJ5IHsKLQkJCWlmIChmUmVwYWlyZXJzID09IG51bGwgfHwgZlJlcGFpcmVycy5pc0VtcHR5KCkpIHsKLQkJCQlUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbj0gbmV3IFRleHRQcmVzZW50YXRpb24oZGFtYWdlLCAxKTsKLQkJCQlwcmVzZW50YXRpb24uc2V0RGVmYXVsdFN0eWxlUmFuZ2UobmV3IFN0eWxlUmFuZ2UoZGFtYWdlLmdldE9mZnNldCgpLCBkYW1hZ2UuZ2V0TGVuZ3RoKCksIG51bGwsIG51bGwpKTsKLQkJCQlyZXR1cm4gcHJlc2VudGF0aW9uOwotCQkJfQotCi0JCQlUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbj0gbmV3IFRleHRQcmVzZW50YXRpb24oZGFtYWdlLCAxMDAwKTsKLQotCQkJSVR5cGVkUmVnaW9uW10gcGFydGl0aW9ucz0gVGV4dFV0aWxpdGllcy5jb21wdXRlUGFydGl0aW9uaW5nKGRvY3VtZW50LCBnZXREb2N1bWVudFBhcnRpdGlvbmluZygpLCBkYW1hZ2UuZ2V0T2Zmc2V0KCksIGRhbWFnZS5nZXRMZW5ndGgoKSwgZmFsc2UpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IHBhcnRpdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJVHlwZWRSZWdpb24gcj0gcGFydGl0aW9uc1tpXTsKLQkJCQlJUHJlc2VudGF0aW9uUmVwYWlyZXIgcmVwYWlyZXI9IGdldFJlcGFpcmVyKHIuZ2V0VHlwZSgpKTsKLQkJCQlpZiAocmVwYWlyZXIgIT0gbnVsbCkKLQkJCQkJcmVwYWlyZXIuY3JlYXRlUHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbiwgcik7Ci0JCQl9Ci0KLQkJCXJldHVybiBwcmVzZW50YXRpb247Ci0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJLyogaWdub3JlZCBpbiBwbGF0Zm9ybSBQcmVzZW50YXRpb25SZWNvbmNpbGVyLCB0b28gKi8KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoqCi0JICogQ2hlY2tzIGZvciB0aGUgZmlyc3QgYW5kIHRoZSBsYXN0IGFmZmVjdGVkIHBhcnRpdGlvbiBhZmZlY3RlZCBieSBhCi0JICogZG9jdW1lbnQgZXZlbnQgYW5kIGNhbGxzIHRoZWlyIGRhbWFnZXJzLiBJbnZhbGlkYXRlcyBldmVyeXRoaW5nIGZyb20gdGhlCi0JICogc3RhcnQgb2YgdGhlIGRhbWFnZSBmb3IgdGhlIGZpcnN0IHBhcnRpdGlvbiB1bnRpbCB0aGUgZW5kIG9mIHRoZSBkYW1hZ2UKLQkgKiBmb3IgdGhlIGxhc3QgcGFydGl0aW9uLgotCSAqCi0JICogQHBhcmFtIGUgdGhlIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGRvY3VtZW50IGNoYW5nZQotCSAqIEBwYXJhbSBvcHRpbWl6ZSA8Y29kZT50cnVlPC9jb2RlPiBpZiBwYXJ0aXRpb24gY2hhbmdlcyBzaG91bGQgYmUKLQkgKiAgICAgICAgY29uc2lkZXJlZCBmb3Igb3B0aW1pemF0aW9uCi0JICogQHJldHVybiB0aGUgZGFtYWdlZCBjYXVzZWQgYnkgdGhlIGNoYW5nZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICAgICAgICAgY29tcHV0aW5nIHRoZSBwYXJ0aXRpb25pbmcgZmFpbGVkCi0JICogQHNpbmNlIDMuMAotCSAqLwotCUlSZWdpb24gZ2V0RGFtYWdlKERvY3VtZW50RXZlbnQgZSwgYm9vbGVhbiBvcHRpbWl6ZSkgewotCQlpbnQgbGVuZ3RoPSBlLmdldFRleHQoKSA9PSBudWxsID8gMCA6IGUuZ2V0VGV4dCgpLmxlbmd0aCgpOwotCQkKLQkJaWYgKGZEYW1hZ2VycyA9PSBudWxsIHx8IGZEYW1hZ2Vycy5pc0VtcHR5KCkpIHsKLQkJCWxlbmd0aD0gTWF0aC5tYXgoZS5nZXRMZW5ndGgoKSwgbGVuZ3RoKTsKLQkJCWxlbmd0aD0gTWF0aC5taW4oZS5nZXREb2N1bWVudCgpLmdldExlbmd0aCgpIC0gZS5nZXRPZmZzZXQoKSwgbGVuZ3RoKTsKLQkJCXJldHVybiBuZXcgUmVnaW9uKGUuZ2V0T2Zmc2V0KCksIGxlbmd0aCk7Ci0JCX0KLQotCQlib29sZWFuIGlzRGVsZXRpb249IGxlbmd0aCA9PSAwOwotCQlJUmVnaW9uIGRhbWFnZT0gbnVsbDsKLQkJdHJ5IHsKLQkJCWludCBvZmZzZXQ9IGUuZ2V0T2Zmc2V0KCk7Ci0JCQlpZiAoaXNEZWxldGlvbikKLQkJCQlvZmZzZXQ9IE1hdGgubWF4KDAsIG9mZnNldCAtIDEpOwotCQkJSVR5cGVkUmVnaW9uIHBhcnRpdGlvbj0gZ2V0UGFydGl0aW9uKGUuZ2V0RG9jdW1lbnQoKSwgb2Zmc2V0KTsKLQkJCUlQcmVzZW50YXRpb25EYW1hZ2VyIGRhbWFnZXI9IGdldERhbWFnZXIocGFydGl0aW9uLmdldFR5cGUoKSk7Ci0JCQlpZiAoZGFtYWdlciA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCi0JCQlJUmVnaW9uIHI9IGRhbWFnZXIuZ2V0RGFtYWdlUmVnaW9uKHBhcnRpdGlvbiwgZSwgZkRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZCk7Ci0KLQkJCWlmICghZkRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZCAmJiBvcHRpbWl6ZSAmJiAhaXNEZWxldGlvbikgewotCQkJCWRhbWFnZT0gcjsKLQkJCX0gZWxzZSB7Ci0KLQkJCQlpbnQgZGFtYWdlRW5kPSBnZXREYW1hZ2VFbmRPZmZzZXQoZSk7Ci0KLQkJCQlpbnQgcGFyaXRpdGlvbkRhbWFnZUVuZD0gLTE7Ci0JCQkJaWYgKGZDaGFuZ2VkRG9jdW1lbnRQYXJ0aXRpb25zICE9IG51bGwpCi0JCQkJCXBhcml0aXRpb25EYW1hZ2VFbmQ9IGZDaGFuZ2VkRG9jdW1lbnRQYXJ0aXRpb25zLmdldE9mZnNldCgpICsgZkNoYW5nZWREb2N1bWVudFBhcnRpdGlvbnMuZ2V0TGVuZ3RoKCk7Ci0KLQkJCQlpbnQgZW5kPSBNYXRoLm1heChkYW1hZ2VFbmQsIHBhcml0aXRpb25EYW1hZ2VFbmQpOwotCi0JCQkJZGFtYWdlPSBlbmQgPT0gLTEgPyByIDogbmV3IFJlZ2lvbihyLmdldE9mZnNldCgpLCBlbmQgLSByLmdldE9mZnNldCgpKTsKLQkJCX0KLQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkvKiBpZ25vcmVkIGluIHBsYXRmb3JtIFByZXNlbnRhdGlvblJlY29uY2lsZXIsIHRvbyAqLwotCQl9Ci0KLQkJcmV0dXJuIGRhbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmQgb2Zmc2V0IG9mIHRoZSBkYW1hZ2UuIElmIGEgcGFydGl0aW9uIGhhcyBiZWVuIHNwbGl0IGJ5Ci0JICogdGhlIGdpdmVuIGRvY3VtZW50IGV2ZW50IGFsc28gdGhlIHNlY29uZCBoYWxmIG9mIHRoZSBvcmlnaW5hbAotCSAqIHBhcnRpdGlvbiBtdXN0IGJlIGNvbnNpZGVyZWQuIFRoaXMgaXMgYWNoaWV2ZWQgYnkgdXNpbmcgdGhlIHJlbWVtYmVyZWQKLQkgKiBwYXJ0aXRpb24gcmFuZ2UuCi0JICoKLQkgKiBAcGFyYW0gZSB0aGUgZXZlbnQgZGVzY3JpYmluZyB0aGUgY2hhbmdlCi0JICogQHJldHVybiB0aGUgZGFtYWdlIGVuZCBvZmZzZXQgKGV4Y2x1ZGluZykKLQkgKiBAZXhjZXB0aW9uIEJhZExvY2F0aW9uRXhjZXB0aW9uIGlmIG1ldGhvZCBhY2Nlc3NlcyBpbnZhbGlkIG9mZnNldAotCSAqLwotCWludCBnZXREYW1hZ2VFbmRPZmZzZXQoRG9jdW1lbnRFdmVudCBlKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCi0JCUlEb2N1bWVudCBkPSBlLmdldERvY3VtZW50KCk7Ci0KLQkJaW50IGxlbmd0aD0gMDsKLQkJaWYgKGUuZ2V0VGV4dCgpICE9IG51bGwpIHsKLQkJCWxlbmd0aD0gZS5nZXRUZXh0KCkubGVuZ3RoKCk7Ci0JCQlpZiAobGVuZ3RoID4gMCkKLQkJCQktLSBsZW5ndGg7Ci0JCX0KLQotCQlJVHlwZWRSZWdpb24gcGFydGl0aW9uPSBnZXRQYXJ0aXRpb24oZCwgZS5nZXRPZmZzZXQoKSArIGxlbmd0aCk7Ci0JCWludCBlbmRPZmZzZXQ9IHBhcnRpdGlvbi5nZXRPZmZzZXQoKSArIHBhcnRpdGlvbi5nZXRMZW5ndGgoKTsKLQkJaWYgKGVuZE9mZnNldCA9PSBlLmdldE9mZnNldCgpKQotCQkJcmV0dXJuIC0xOwotCi0JCWludCBlbmQ9IGZSZW1lbWJlcmVkUG9zaXRpb24gPT0gbnVsbCA/IC0xIDogZlJlbWVtYmVyZWRQb3NpdGlvbi5nZXRPZmZzZXQoKSArIGZSZW1lbWJlcmVkUG9zaXRpb24uZ2V0TGVuZ3RoKCk7Ci0JCWlmIChlbmRPZmZzZXQgPCBlbmQgJiYgZW5kIDwgZC5nZXRMZW5ndGgoKSkKLQkJCXBhcnRpdGlvbj0gZ2V0UGFydGl0aW9uKGQsIGVuZCk7Ci0KLQkJSVByZXNlbnRhdGlvbkRhbWFnZXIgZGFtYWdlcj0gZ2V0RGFtYWdlcihwYXJ0aXRpb24uZ2V0VHlwZSgpKTsKLQkJaWYgKGRhbWFnZXIgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlJUmVnaW9uIHI9IGRhbWFnZXIuZ2V0RGFtYWdlUmVnaW9uKHBhcnRpdGlvbiwgZSwgZkRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZCk7Ci0KLQkJcmV0dXJuIHIuZ2V0T2Zmc2V0KCkgKyByLmdldExlbmd0aCgpOwotCX0KLQkKLQl2b2lkIHByb2Nlc3NSZWNvcmRlZERhbWFnZXMoKSB7Ci0JCVJlY29yZGVkRGFtYWdlW10gcmVjb3JkaW5ncyA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAoZlJlY29yZGVkRGFtYWdlcykgewotCQkJcmVjb3JkaW5ncyA9IChSZWNvcmRlZERhbWFnZVtdKSBmUmVjb3JkZWREYW1hZ2VzLnRvQXJyYXkobmV3IFJlY29yZGVkRGFtYWdlW2ZSZWNvcmRlZERhbWFnZXMuc2l6ZSgpXSk7Ci0JCQlmUmVjb3JkZWREYW1hZ2VzLmNsZWFyKCk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWNvcmRpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm9jZXNzRGFtYWdlKHJlY29yZGluZ3NbaV0uZGFtYWdlLCByZWNvcmRpbmdzW2ldLmRvY3VtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByb2Nlc3NlcyB0aGUgZ2l2ZW4gZGFtYWdlLgotCSAqIEBwYXJhbSBkYW1hZ2UgdGhlIGRhbWFnZSB0byBiZSByZXBhaXJlZAotCSAqIEBwYXJhbSBkb2N1bWVudCB0aGUgZG9jdW1lbnQgd2hvc2UgcHJlc2VudGF0aW9uIG11c3QgYmUgcmVwYWlyZWQKLQkgKi8KLQl2b2lkIHByb2Nlc3NEYW1hZ2UoSVJlZ2lvbiBkYW1hZ2UsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZGFtYWdlICE9IG51bGwgJiYgZGFtYWdlLmdldExlbmd0aCgpID4gMCkgewotCQkJVGV4dFByZXNlbnRhdGlvbiBwID0gY3JlYXRlUHJlc2VudGF0aW9uKGRhbWFnZSwgZG9jdW1lbnQpOwotCQkJaWYgKHAgIT0gbnVsbCkgewotCQkJCS8qKgotCQkJCSAqIDIyOTc0OSAtIFJlYWQtT25seSBoaWdobGlnaHRpbmcgc3VwcG9ydCBtaXNzaW5nCi0JCQkJICovCi0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQ7Ci0JCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudC5jb250YWluc1JlYWRPbmx5KGRhbWFnZS5nZXRPZmZzZXQoKSwgZGFtYWdlLmdldExlbmd0aCgpKSkgewotCQkJCQlJdGVyYXRvciBub25EZWZhdWx0U3R5bGVSYW5nZUl0ZXJhdG9yID0gcC5nZXROb25EZWZhdWx0U3R5bGVSYW5nZUl0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChub25EZWZhdWx0U3R5bGVSYW5nZUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJU3R5bGVSYW5nZSBzdHlsZVJhbmdlID0gKFN0eWxlUmFuZ2UpIG5vbkRlZmF1bHRTdHlsZVJhbmdlSXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudC5jb250YWluc1JlYWRPbmx5KHN0eWxlUmFuZ2Uuc3RhcnQsIHN0eWxlUmFuZ2UubGVuZ3RoKSkgewotCQkJCQkJCWFkanVzdEZvcmVncm91bmQoc3R5bGVSYW5nZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYXBwbHlUZXh0UmVnaW9uQ29sbGVjdGlvbihwKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFByb2Nlc3NlcyB0aGUgZ2l2ZW4gZGFtYWdlLgotCSAqIEBwYXJhbSBkYW1hZ2UgdGhlIGRhbWFnZSB0byBiZSByZXBhaXJlZAotCSAqIEBwYXJhbSBkb2N1bWVudCB0aGUgZG9jdW1lbnQgd2hvc2UgcHJlc2VudGF0aW9uIG11c3QgYmUgcmVwYWlyZWQKLQkgKi8KLQl2b2lkIHJlY29yZERhbWFnZShJUmVnaW9uIGRhbWFnZSwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChkYW1hZ2UgIT0gbnVsbCAmJiBkYW1hZ2UuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGZSZWNvcmRlZERhbWFnZXMpIHsKLQkJCQlmUmVjb3JkZWREYW1hZ2VzLmFkZChuZXcgUmVjb3JkZWREYW1hZ2UoZGFtYWdlLCBkb2N1bWVudCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwbGllcyB0aGUgZ2l2ZW4gdGV4dCBwcmVzZW50YXRpb24gdG8gdGhlIHRleHQgdmlld2VyIHRoZSBwcmVzZW50YXRpb24KLQkgKiByZWNvbmNpbGVyIGlzIGluc3RhbGxlZCBvbi4KLQkgKgotCSAqIEBwYXJhbSBwcmVzZW50YXRpb24gdGhlIHRleHQgcHJlc2VudGF0aW9uIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHRleHQgdmlld2VyCi0JICovCi0Jdm9pZCBhcHBseVRleHRSZWdpb25Db2xsZWN0aW9uKFRleHRQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uKSB7Ci0JCWZWaWV3ZXIuY2hhbmdlVGV4dFByZXNlbnRhdGlvbihwcmVzZW50YXRpb24sIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJ0aXRpb24gZm9yIHRoZSBnaXZlbiBvZmZzZXQgaW4gdGhlIGdpdmVuIGRvY3VtZW50LgotCSAqCi0JICogQHBhcmFtIGRvY3VtZW50IHRoZSBkb2N1bWVudAotCSAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldAotCSAqIEByZXR1cm4gdGhlIHBhcnRpdGlvbgotCSAqIEB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gaWYgb2Zmc2V0IGlzIGludmFsaWQgaW4gdGhlIGdpdmVuIGRvY3VtZW50Ci0JICogQHNpbmNlIDMuMAotCSAqLwotCUlUeXBlZFJlZ2lvbiBnZXRQYXJ0aXRpb24oSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gVGV4dFV0aWxpdGllcy5nZXRQYXJ0aXRpb24oZG9jdW1lbnQsIGdldERvY3VtZW50UGFydGl0aW9uaW5nKCksIG9mZnNldCwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGp1c3RGb3JlZ3JvdW5kKFN0eWxlUmFuZ2Ugc3R5bGVSYW5nZSkgewotCQlSR0Igb2xkUkdCID0gbnVsbDsKLQkJLy8gQ29sb3Igb2xkQ29sb3IgPSBzdHlsZVJhbmdlLmZvcmVncm91bmQ7Ci0JCUNvbG9yIG9sZENvbG9yID0gc3R5bGVSYW5nZS5iYWNrZ3JvdW5kOwotCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgewotCQkJLy8gb2xkUkdCID0gZ2V0VGV4dFdpZGdldCgpLmdldEZvcmVncm91bmQoKS5nZXRSR0IoKTsKLQkJCW9sZENvbG9yID0gZlZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuZ2V0QmFja2dyb3VuZCgpOwotCQkJb2xkUkdCID0gb2xkQ29sb3IuZ2V0UkdCKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlvbGRSR0IgPSBvbGRDb2xvci5nZXRSR0IoKTsKLQkJfQotCQlDb2xvciBuZXdDb2xvciA9IGdldENhY2hlZENvbG9yRm9yKG9sZFJHQik7Ci0JCWlmIChuZXdDb2xvciA9PSBudWxsKSB7Ci0JCQkvLyBtYWtlIHRleHQgImNsb3NlciB0byIgYmFja2dyb3VuZCBsdW1hbmVuY2UKLQkJCWRvdWJsZSB0YXJnZXQgPSBnZXRSR0JDb252ZXJ0ZXIoKS5jYWxjdWxhdGVZQ29tcG9uZW50KG9sZENvbG9yKTsKLQkJCVJHQiBuZXdSR0IgPSBnZXRSR0JDb252ZXJ0ZXIoKS50cmFuc2Zvcm1SR0JUb0dyZXkob2xkUkdCLCByZWFkT25seUZvcmVncm91bmRTY2FsZUZhY3RvciAvIDEwMC4wLCB0YXJnZXQpOwotCi0JCQkvLyBzYXZlIGNvbnZlcnNpb24sIHNvIGNhbGN1bGF0aW9ucyBvbmx5IG5lZWQgdG8gYmUgZG9uZSBvbmNlCi0JCQljYWNoZUNvbG9yKG9sZFJHQiwgbmV3UkdCKTsKLQkJCW5ld0NvbG9yID0gZ2V0Q2FjaGVkQ29sb3JGb3Iob2xkUkdCKTsKLQkJfQotCQlzdHlsZVJhbmdlLmZvcmVncm91bmQgPSBuZXdDb2xvcjsKLQl9Ci0KLQlwcml2YXRlIFlVVl9SR0JDb252ZXJ0ZXIgZ2V0UkdCQ29udmVydGVyKCkgewotCQlpZiAocmdiQ29udmVydGVyID09IG51bGwpIHsKLQkJCXJnYkNvbnZlcnRlciA9IG5ldyBZVVZfUkdCQ29udmVydGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHJnYkNvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiBDYWNoZSByZWFkLW9ubHkgY29sb3IuCi0JICogCi0JICogQHBhcmFtIG9sZFJHQgotCSAqIEBwYXJhbSBuZXdDb2xvcgotCSAqLwotCXByaXZhdGUgdm9pZCBjYWNoZUNvbG9yKFJHQiBvbGRSR0IsIFJHQiBuZXdDb2xvcikgewotCQlpZiAocmVhZE9ubHlDb2xvclRhYmxlID09IG51bGwpIHsKLQkJCXJlYWRPbmx5Q29sb3JUYWJsZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJcmVhZE9ubHlDb2xvclRhYmxlLnB1dChvbGRSR0IsIG5ld0NvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBqdXN0IHRvIGdldCBleGlzdGluZyByZWFkLW9ubHkgY29sb3JzLgotCSAqLwotCXByaXZhdGUgQ29sb3IgZ2V0Q2FjaGVkQ29sb3JGb3IoUkdCIG9sZFJHQikgewotCQlDb2xvciByZXN1bHQgPSBudWxsOwotCQotCQlpZiAocmVhZE9ubHlDb2xvclRhYmxlICE9IG51bGwpIHsKLQkJCVJHQiByZWFkT25seVJHQiA9IChSR0IpIHJlYWRPbmx5Q29sb3JUYWJsZS5nZXQob2xkUkdCKTsKLQkJCXJlc3VsdCA9IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IocmVhZE9ubHlSR0IpOwotCQl9Ci0JCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0Fic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0Fic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYTlkNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9BYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLkRpcnR5UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JVGVtcG9yYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uOwotCi0KLS8qKgotICogQSBiYXNlIFJlY29uY2lsaW5nU3RyYXRlZ3kuIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQKLSAqIGNyZWF0ZVJlY29uY2lsZVN0ZXBzKCkuIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBrbm93IGFib3V0Ci0gKiBJU3RydWN0dXJlZERvY3VtZW50LCBvbmx5IElEb2N1bWVudC4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5IGltcGxlbWVudHMgSVJlY29uY2lsaW5nU3RyYXRlZ3ksIElSZWNvbmNpbGluZ1N0cmF0ZWd5RXh0ZW5zaW9uLCBJUmVsZWFzYWJsZSB7Ci0KLQkvKiogZGVidWcgZmxhZyAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWNvbmNpbGVyam9iIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIHRoZXNlIGxpbWl0cyBhcmUgc2FmZXR5cyBmb3IgInJ1bmF3YXkiIHZhbGlkYXRpb24gY2FzZXMKLQkvLyBzaG91bGQgYmUgdXNlZCB0byBzYWZlZ3VhcmQgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGxvb3BzIG9yIHBvdGVudGlhbGx5Ci0JLy8gbG9uZyBhbm5vdGF0aW9ucwotCS8vIChzaW5jZSB0aGUgcGFpbnRlciBzZWVtcyB0byBhZmZlY3QgcGVyZm9ybWFuY2Ugd2hlbiBwYWludGluZyBsb25nCi0JLy8gYW5ub3RhdGlvbnMpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU5OT1RBVElPTl9MRU5HVEhfTElNSVQgPSAyNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UX0VSUk9SX0xJTUlUID0gMjU7Ci0KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCS8vIHByaXZhdGUgSVJlY29uY2lsZVN0ZXAgZkZpcnN0U3RlcCA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIGZQcm9ncmVzc01vbml0b3IgPSBudWxsOwotCXByaXZhdGUgSVNvdXJjZVZpZXdlciBmU291cmNlVmlld2VyID0gbnVsbDsKLS8vCXByaXZhdGUgQ29tcGFyYXRvciBmQ29tcGFyYXRvcjsKLQotCS8vIGxpc3Qgb2YgInZhbGlkYXRvciIgYW5ub3RhdGlvbnMKLQkvLyBmb3IgZ3JheS91bi1ncmF5IGNhcGFiaWxpdHkKLQlwcml2YXRlIEhhc2hTZXQgZk1hcmtlckFubm90YXRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc3RyYXRlZ3kuIFRoZSBlZGl0b3IgcGFyYW1ldGVyIGlzIGZvciBhY2Nlc3MgdG8gdGhlCi0JICogYW5ub3RhdGlvbiBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICovCi0JcHVibGljIEFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWZTb3VyY2VWaWV3ZXIgPSBzb3VyY2VWaWV3ZXI7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHdoZXJlIHdlIGFkZCByZXN1bHRzIHRvIHRoZSBhbm5vdGF0aW9uTW9kZWwsIGRvaW5nIGFueSBzcGVjaWFsCi0JICogImV4dHJhIiBwcm9jZXNzaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlc3VsdFRvQW5ub3RhdGlvbk1vZGVsKElSZWNvbmNpbGVSZXN1bHQgcmVzdWx0KSB7Ci0JCWlmICghKHJlc3VsdCBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pKQotCQkJcmV0dXJuOwotCQkvLyBjYW4gYmUgbnVsbCB3aGVuIGNsb3NpbmcgdGhlIGVkaXRvcgotCQlpZiAoZ2V0QW5ub3RhdGlvbk1vZGVsKCkgIT0gbnVsbCkgewotCQkJVGVtcG9yYXJ5QW5ub3RhdGlvbiB0ZW1wQW5ub3RhdGlvbiA9IChUZW1wb3JhcnlBbm5vdGF0aW9uKSByZXN1bHQ7Ci0KLQkJCVN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uIHNtYSA9IGdldENvcnJlc3BvbmRpbmdNYXJrZXJBbm5vdGF0aW9uKHRlbXBBbm5vdGF0aW9uKTsKLQkJCWlmIChzbWEgIT0gbnVsbCkgewotCQkJCS8vIHVuLWdyYXkgb3V0IHRoZSBtYXJrZXIgYW5ub3RhdGlvbgotCQkJCXNtYS5zZXRHcmF5ZWQoZmFsc2UpOwotCQkJfQotCi0JCQlnZXRBbm5vdGF0aW9uTW9kZWwoKS5hZGRBbm5vdGF0aW9uKHRlbXBBbm5vdGF0aW9uLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuIGlmIHRoaXMgc3RyYXRlZ3kgaXMgcmVzcG9uaXNibGUgZm9yIGFkZGluZyB0aGlzIHR5cGUgb2Yga2V5Ci0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuSGFuZGxlUGFydGl0aW9uKFN0cmluZyBwYXJ0aXRpb24pIHsKLQkJLy8gU3RyaW5nW10gaGF5c3RhY2sgPSBnZXRQYXJ0aXRpb25UeXBlcygpOwotCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IGhheXN0YWNrLmxlbmd0aDsgaSsrKSB7Ci0JCS8vIGlmIChoYXlzdGFja1tpXS5lcXVhbHMocGFydGl0aW9uKSkKLQkJLy8gcmV0dXJuIHRydWU7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gLyoqCi0JLy8gKiBAcGFyYW0gc3RlcAotCS8vICogQHJldHVybgotCS8vICovCi0JLy8gcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNTdGVwKElSZWNvbmNpbGVTdGVwIHN0ZXApIHsKLQkvLyBpZiAoZkZpcnN0U3RlcCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwKQotCS8vIHJldHVybiAoKFN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwKSBmRmlyc3RTdGVwKS5pc1NpYmxpbmdTdGVwKHN0ZXApOwotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHdoZXJlIHlvdSBzaG91bGQgY3JlYXRlIHRoZSBzdGVwcyBmb3IgdGhpcyBzdHJhdGVneQotCSAqLwotCWFic3RyYWN0IHB1YmxpYyB2b2lkIGNyZWF0ZVJlY29uY2lsZVN0ZXBzKCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgQUxMIHRlbXBvcmFyeSBhbm5vdGF0aW9ucyB0aGF0IHRoaXMgc3RyYXRlZ3kgY2FuIGhhbmRsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgVGVtcG9yYXJ5QW5ub3RhdGlvbltdIGdldEFsbEFubm90YXRpb25zVG9SZW1vdmUoKSB7Ci0JCUxpc3QgcmVtb3ZhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZ2V0QW5ub3RhdGlvbk1vZGVsKCk7Ci0JCWlmIChhbm5vdGF0aW9uTW9kZWwgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaSA9IGFubm90YXRpb25Nb2RlbC5nZXRBbm5vdGF0aW9uSXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpLm5leHQoKTsKLQkJCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJVGVtcG9yYXJ5QW5ub3RhdGlvbikpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJSVRlbXBvcmFyeUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChJVGVtcG9yYXJ5QW5ub3RhdGlvbikgb2JqOwotCQkJCVJlY29uY2lsZUFubm90YXRpb25LZXkga2V5ID0gKFJlY29uY2lsZUFubm90YXRpb25LZXkpIGFubm90YXRpb24uZ2V0S2V5KCk7Ci0JCQkJLy8gdGhlbiBpZiB0aGlzIHN0cmF0ZWd5IGtub3dzIGhvdyB0byBhZGQvcmVtb3ZlIHRoaXMKLQkJCQkvLyBwYXJ0aXRpb24gdHlwZQotCQkJCWlmIChjYW5IYW5kbGVQYXJ0aXRpb24oa2V5LmdldFBhcnRpdGlvblR5cGUoKSkgLyoKLQkJCQkJCQkJCQkJCQkJCQkgKiAmJgotCQkJCQkJCQkJCQkJCQkJCSAqIGNvbnRhaW5zU3RlcChrZXkuZ2V0U3RlcCgpKQotCQkJCQkJCQkJCQkJCQkJCSAqLykKLQkJCQkJcmVtb3ZhbHMuYWRkKGFubm90YXRpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiAoVGVtcG9yYXJ5QW5ub3RhdGlvbltdKSByZW1vdmFscy50b0FycmF5KG5ldyBUZW1wb3JhcnlBbm5vdGF0aW9uW3JlbW92YWxzLnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCBJQW5ub3RhdGlvbk1vZGVsIGdldEFubm90YXRpb25Nb2RlbCgpIHsKLQkJSUFubm90YXRpb25Nb2RlbCBtb2RlbCA9IG51bGw7Ci0JCWlmIChmU291cmNlVmlld2VyICE9IG51bGwpIHsKLQkJCW1vZGVsID0gZlNvdXJjZVZpZXdlci5nZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHJvdGVjdGVkIFRlbXBvcmFyeUFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9uc1RvUmVtb3ZlKERpcnR5UmVnaW9uIGRyLCBMaXN0IHN0ZXBzUnVuKSB7Ci0KLQkJTGlzdCByZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZ2V0QW5ub3RhdGlvbk1vZGVsKCk7Ci0JCS8vIGNhbiBiZSBudWxsIHdoZW4gY2xvc2luZyB0aGUgZWRpdG9yCi0JCWlmIChnZXRBbm5vdGF0aW9uTW9kZWwoKSAhPSBudWxsKSB7Ci0KLQkJCS8vIGNsZWFyIHZhbGlkYXRvciBhbm5vdGF0aW9ucwotCQkJZ2V0TWFya2VyQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCi0JCQlJdGVyYXRvciBpID0gYW5ub3RhdGlvbk1vZGVsLmdldEFubm90YXRpb25JdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0KLQkJCQlPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0KLQkJCQkvLyBjaGVjayBpZiBpdCdzIGEgdmFsaWRhdG9yIG1hcmtlciBhbm5vdGF0aW9uCi0JCQkJLy8gaWYgaXQgaXMgc2F2ZSBpdCBmb3IgY29tcGFyaXNpb24gbGF0ZXIgKHRvICJncmF5IiBpY29ucykKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgU3RydWN0dXJlZE1hcmtlckFubm90YXRpb24pIHsKLQkJCQkJU3RydWN0dXJlZE1hcmtlckFubm90YXRpb24gc21hID0gKFN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uKSBvYmo7Ci0KLQkJCQkJaWYgKHNtYS5nZXRBbm5vdGF0aW9uVHlwZSgpID09IFRlbXBvcmFyeUFubm90YXRpb24uQU5OT1RfRVJST1IgfHwgc21hLmdldEFubm90YXRpb25UeXBlKCkgPT0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9XQVJOSU5HKQotCQkJCQkJZk1hcmtlckFubm90YXRpb25zLmFkZChzbWEpOwotCQkJCX0KLQotCQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pKQotCQkJCQljb250aW51ZTsKLQotCQkJCVRlbXBvcmFyeUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChUZW1wb3JhcnlBbm5vdGF0aW9uKSBvYmo7Ci0JCQkJUmVjb25jaWxlQW5ub3RhdGlvbktleSBrZXkgPSAoUmVjb25jaWxlQW5ub3RhdGlvbktleSkgYW5ub3RhdGlvbi5nZXRLZXkoKTsKLQotCQkJCS8vIHRoZW4gaWYgdGhpcyBzdHJhdGVneSBrbm93cyBob3cgdG8gYWRkL3JlbW92ZSB0aGlzCi0JCQkJLy8gcGFydGl0aW9uIHR5cGUKLQkJCQlpZiAoY2FuSGFuZGxlUGFydGl0aW9uKGtleS5nZXRQYXJ0aXRpb25UeXBlKCkpICYmIHN0ZXBzUnVuLmNvbnRhaW5zKGtleS5nZXRTdGVwKCkpKSB7Ci0JCQkJCWlmIChrZXkuZ2V0U2NvcGUoKSA9PSBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlBBUlRJQUwgJiYgYW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLm92ZXJsYXBzV2l0aChkci5nZXRPZmZzZXQoKSwgZHIuZ2V0TGVuZ3RoKCkpKSB7Ci0JCQkJCQlyZW1vdmUuYWRkKGFubm90YXRpb24pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGtleS5nZXRTY29wZSgpID09IFJlY29uY2lsZUFubm90YXRpb25LZXkuVE9UQUwpIHsKLQkJCQkJCXJlbW92ZS5hZGQoYW5ub3RhdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChUZW1wb3JhcnlBbm5vdGF0aW9uW10pIHJlbW92ZS50b0FycmF5KG5ldyBUZW1wb3JhcnlBbm5vdGF0aW9uW3JlbW92ZS5zaXplKCldKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGNvbnRhaW5zU3RlcChJUmVjb25jaWxlU3RlcCBzdGVwKTsKLQotCS8qKgotCSAqIEdldHMgcGFydGl0aW9uIHR5cGVzIGZyb20gYWxsIHN0ZXBzIGluIHRoaXMgc3RyYXRlZ3kuCi0JICogCi0JICogQHJldHVybiBwYXJpdGlvbiB0eXBlcyBmcm9tIGFsbCBzdGVwcwotCSAqLwotCS8vIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJ0aXRpb25UeXBlcygpIHsKLQkvLyBpZiAoZkZpcnN0U3RlcCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwKQotCS8vIHJldHVybiAoKFN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwKSBmRmlyc3RTdGVwKS5nZXRQYXJ0aXRpb25UeXBlcygpOwotCS8vIHJldHVybiBuZXcgU3RyaW5nWzBdOwotCS8vIH0KLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQljcmVhdGVSZWNvbmNpbGVTdGVwcygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5RXh0ZW5zaW9uI2luaXRpYWxSZWNvbmNpbGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxSZWNvbmNpbGUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLQkJaWYgKERFQlVHICYmIChmUHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgZlByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiBTVFJBVEVHWSBDQU5DRUxFRCAqKjoiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGZQcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiBmUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIHRoZSByZXN1bHRzIGZyb20gdGhlIHJlY29uY2lsZSBzdGVwcyBpbiB0aGlzIHN0cmF0ZWd5LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3MoZmluYWwgSVJlY29uY2lsZVJlc3VsdFtdIHJlc3VsdHMpIHsKLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJbdHJhY2UgcmVjb25jaWxlcl0gPiBTVEFSVElORyBQUk9DRVNTIE1FVEhPRCB3aXRoICgiICsgcmVzdWx0cy5sZW5ndGggKyAiKSByZXN1bHRzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWlmIChyZXN1bHRzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aCAmJiBpIDwgRUxFTUVOVF9FUlJPUl9MSU1JVCAmJiAhaXNDYW5jZWxlZCgpOyBpKyspIHsKLQotCQkJaWYgKGlzQ2FuY2VsZWQoKSkgewotCQkJCWlmIChERUJVRykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJbdHJhY2UgcmVjb25jaWxlcl0gPioqIFBST0NFU1MgKGFkZGluZykgV0FTIENBTkNFTExFRCAqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJYWRkUmVzdWx0VG9Bbm5vdGF0aW9uTW9kZWwocmVzdWx0c1tpXSk7Ci0JCX0KLQotCQlpZiAoREVCVUcpIHsKLQkJCVN0cmluZ0J1ZmZlciB0cmFjZVN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVzdWx0cy5sZW5ndGg7IGorKykKLQkJCQl0cmFjZVN0cmluZy5hcHBlbmQoIlxuICgrKSA6IiArIHJlc3VsdHNbal0gKyAiOlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJbdHJhY2UgcmVjb25jaWxlcl0gPiBQUk9DRVNTSU5HICgiICsgcmVzdWx0cy5sZW5ndGggKyAiKSByZXN1bHRzIGluIEFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5ICIgKyB0cmFjZVN0cmluZyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsaW5nU3RyYXRlZ3kjcmVjb25jaWxlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWNvbmNpbGUoRGlydHlSZWdpb24gZGlydHlSZWdpb24sIElSZWdpb24gc3ViUmVnaW9uKSB7Ci0JCS8vIG5vdCB1c2VkCi0JCS8vIHdlIG9ubHkgaGF2ZSB2YWxpZGF0b3Igc3RyYXRlZ3kgbm93Ci0KLQkJLy8gLy8gZXh0ZXJuYWwgZmlsZXMgbWF5IGJlIG51bGwKLQkJLy8gaWYgKGlzQ2FuY2VsZWQoKSB8fCBmRmlyc3RTdGVwID09IG51bGwpCi0JCS8vIHJldHVybjsKLQkJLy8KLQkJLy8gVGVtcG9yYXJ5QW5ub3RhdGlvbltdIGFubm90YXRpb25zVG9SZW1vdmUgPSBuZXcKLQkJLy8gVGVtcG9yYXJ5QW5ub3RhdGlvblswXTsKLQkJLy8gSVJlY29uY2lsZVJlc3VsdFtdIGFubm90YXRpb25zVG9BZGQgPSBuZXcgSVJlY29uY2lsZVJlc3VsdFswXTsKLQkJLy8gU3RydWN0dXJlZFJlY29uY2lsZVN0ZXAgc3RydWN0dXJlZFN0ZXAgPSAoU3RydWN0dXJlZFJlY29uY2lsZVN0ZXApCi0JCS8vIGZGaXJzdFN0ZXA7Ci0JCS8vICAgICAgICAKLQkJLy8gYW5ub3RhdGlvbnNUb1JlbW92ZSA9IGdldEFubm90YXRpb25zVG9SZW1vdmUoZGlydHlSZWdpb24pOwotCQkvLyBhbm5vdGF0aW9uc1RvQWRkID0gc3RydWN0dXJlZFN0ZXAucmVjb25jaWxlKGRpcnR5UmVnaW9uLAotCQkvLyBzdWJSZWdpb24pOwotCQkvLyAgICAgICAgCi0JCS8vIHNtYXJ0UHJvY2Vzcyhhbm5vdGF0aW9uc1RvUmVtb3ZlLCBhbm5vdGF0aW9uc1RvQWRkKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFydGl0aW9uCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsaW5nU3RyYXRlZ3kjcmVjb25jaWxlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWNvbmNpbGUoSVJlZ2lvbiBwYXJ0aXRpb24pIHsKLQkJLy8gbm90IHVzZWQsIHdlIHVzZToKLQkJLy8gcmVjb25jaWxlKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uLCBJUmVnaW9uIHN1YlJlZ2lvbikKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyByZWxlYXNlKCkgb24gYWxsIHRoZSBzdGVwcyBpbiB0aGlzIHN0cmF0ZWd5LiBDdXJyZW50bHkgZG9uZSBpbgotCSAqIFN0cnVjdHVyZWRSZWdpb25Qcm9jZXNzb3IuU291cmNlV2lkZ2V0RGlzcG9zZUxpc3RlbmVyI3dpZGdldERpc3Bvc2VkKC4uLikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyByZWxlYXNlIHN0ZXBzIChlYWNoIHN0ZXAgY2FsbHMgcmVsZWFzZSBvbiB0aGUgbmV4dCkKLQkJLy8gaWYgKGZGaXJzdFN0ZXAgIT0gbnVsbCAmJiBmRmlyc3RTdGVwIGluc3RhbmNlb2YgSVJlbGVhc2FibGUpCi0JCS8vICgoSVJlbGVhc2FibGUpIGZGaXJzdFN0ZXApLnJlbGVhc2UoKTsKLQkJLy8gd2UgZG9uJ3QgdG8gbnVsbCBvdXQgdGhlIHN0ZXBzLCBpbiBjYXNlCi0JCS8vIGl0J3MgcmVjb25maWd1cmVkIGxhdGVyCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUFubm90YXRpb25zKFRlbXBvcmFyeUFubm90YXRpb25bXSBhbm5vdGF0aW9uc1RvUmVtb3ZlKSB7Ci0KLQkJSUFubm90YXRpb25Nb2RlbCBhbm5vdGF0aW9uTW9kZWwgPSBnZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQkJLy8gY2FuIGJlIG51bGwgd2hlbiBjbG9zaW5nIHRoZSBlZGl0b3IKLQkJaWYgKGFubm90YXRpb25Nb2RlbCAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zVG9SZW1vdmUubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCWlmIChERUJVRykKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiW3RyYWNlIHJlY29uY2lsZXJdID4qKiBSRU1PVkFMIFdBUyBDQU5DRUxMRUQgKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uIHNtYSA9IGdldENvcnJlc3BvbmRpbmdNYXJrZXJBbm5vdGF0aW9uKGFubm90YXRpb25zVG9SZW1vdmVbaV0pOwotCQkJCWlmIChzbWEgIT0gbnVsbCkgewotCQkJCQkvLyBncmF5IG91dCB0aGUgbWFya2VyIGFubm90YXRpb24KLQkJCQkJc21hLnNldEdyYXllZCh0cnVlKTsKLQkJCQl9Ci0JCQkJLy8gcmVtb3ZlIHRoZSB0ZW1wIG9uZQotCQkJCWFubm90YXRpb25Nb2RlbC5yZW1vdmVBbm5vdGF0aW9uKGFubm90YXRpb25zVG9SZW1vdmVbaV0pOwotCi0JCQl9Ci0JCX0KLQotCQlpZiAoREVCVUcpIHsKLQkJCVN0cmluZ0J1ZmZlciB0cmFjZVN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnNUb1JlbW92ZS5sZW5ndGg7IGkrKykKLQkJCQl0cmFjZVN0cmluZy5hcHBlbmQoIlxuICgtKSA6IiArIGFubm90YXRpb25zVG9SZW1vdmVbaV0gKyAiOlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJbdHJhY2UgcmVjb25jaWxlcl0gPiBSRU1PVkVEICgiICsgYW5ub3RhdGlvbnNUb1JlbW92ZS5sZW5ndGggKyAiKSBhbm5vdGF0aW9ucyBpbiBBYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneSA6IiArIHRyYWNlU3RyaW5nKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uIGdldENvcnJlc3BvbmRpbmdNYXJrZXJBbm5vdGF0aW9uKFRlbXBvcmFyeUFubm90YXRpb24gdGVtcEFubm90YXRpb24pIHsKLQotCQlJdGVyYXRvciBpdCA9IGdldE1hcmtlckFubm90YXRpb25zKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJU3RydWN0dXJlZE1hcmtlckFubm90YXRpb24gbWFya2VyQW5ub3RhdGlvbiA9IChTdHJ1Y3R1cmVkTWFya2VyQW5ub3RhdGlvbikgaXQubmV4dCgpOwotCQkJU3RyaW5nIG1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQltZXNzYWdlID0gKFN0cmluZykgbWFya2VyQW5ub3RhdGlvbi5nZXRNYXJrZXIoKS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQkvLyBpdCB3b3VsZCBiZSBuaWNlIHRvIGNoZWNrIGxpbmUgbnVtYmVyIGhlcmUuLi4KLQkJCWlmIChtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5lcXVhbHModGVtcEFubm90YXRpb24uZ2V0VGV4dCgpKSkKLQkJCQlyZXR1cm4gbWFya2VyQW5ub3RhdGlvbjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQWxsQW5ub3RhdGlvbnMoKSB7Ci0JCXJlbW92ZUFubm90YXRpb25zKGdldEFsbEFubm90YXRpb25zVG9SZW1vdmUoKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBkb2N1bWVudCBmb3IgdGhpcyBzdHJhdGVneS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxpbmdTdHJhdGVneSNzZXREb2N1bWVudChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQotCQkvLyByZW1vdmUgYWxsIG9sZCBhbm5vdGF0aW9ucyBzaW5jZSBpdCdzIGEgbmV3IGRvY3VtZW50Ci0JCXJlbW92ZUFsbEFubm90YXRpb25zKCk7Ci0KLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZWxlYXNlKCk7Ci0KLQkJLy8gaWYgKGdldEZpcnN0U3RlcCgpICE9IG51bGwpCi0JCS8vIGdldEZpcnN0U3RlcCgpLnNldElucHV0TW9kZWwobmV3IERvY3VtZW50QWRhcHRlcihkb2N1bWVudCkpOwotCi0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxpbmdTdHJhdGVneUV4dGVuc2lvbiNzZXRQcm9ncmVzc01vbml0b3Iob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBmUHJvZ3Jlc3NNb25pdG9yID0gbW9uaXRvcjsKLQkJLy8gaWYgKGZGaXJzdFN0ZXAgIT0gbnVsbCkKLQkJLy8gZkZpcnN0U3RlcC5zZXRQcm9ncmVzc01vbml0b3IoZlByb2dyZXNzTW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIGFubm90YXRpb24gaXMgYWxyZWFkeSB0aGVyZSwgaWYgaXQgaXMsIG5vIG5lZWQgdG8gcmVtb3ZlCi0JICogb3IgYWRkIGFnYWluLiBUaGlzIHdpbGwgYXZvaWQgYSBsb3Qgb2YgImZsaWNrZXJpbmciIGJlaGF2aW9yLgotCSAqIAotCSAqIEBwYXJhbSBhbm5vdGF0aW9uc1RvUmVtb3ZlCi0JICogQHBhcmFtIGFubm90YXRpb25zVG9BZGQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzbWFydFByb2Nlc3MoVGVtcG9yYXJ5QW5ub3RhdGlvbltdIGFubm90YXRpb25zVG9SZW1vdmUsIElSZWNvbmNpbGVSZXN1bHRbXSBhbm5vdGF0aW9uc1RvQWRkKSB7Ci0vLwkJQ29tcGFyYXRvciBjb21wID0gZ2V0VGVtcG9yYXJ5QW5ub3RhdGlvbkNvbXBhcmF0b3IoKTsKLS8vCQlMaXN0IHNvcnRlZFJlbW92YWxzID0gQXJyYXlzLmFzTGlzdChhbm5vdGF0aW9uc1RvUmVtb3ZlKTsKLS8vCQlDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZFJlbW92YWxzLCBjb21wKTsKLS8vCi0vLwkJTGlzdCBzb3J0ZWRBZGRpdGlvbnMgPSBBcnJheXMuYXNMaXN0KGFubm90YXRpb25zVG9BZGQpOwotLy8JCUNvbGxlY3Rpb25zLnNvcnQoc29ydGVkQWRkaXRpb25zLCBjb21wKTsKLS8vCi0vLwkJTGlzdCBmaWx0ZXJlZFJlbW92YWxzID0gbmV3IEFycmF5TGlzdChzb3J0ZWRSZW1vdmFscyk7Ci0vLwkJTGlzdCBmaWx0ZXJlZEFkZGl0aW9ucyA9IG5ldyBBcnJheUxpc3Qoc29ydGVkQWRkaXRpb25zKTsKLS8vCi0vLwkJYm9vbGVhbiBpZ25vcmUgPSBmYWxzZTsKLS8vCQlpbnQgbGFzdEZvdW5kQWRkZWQgPSAwOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgc29ydGVkUmVtb3ZhbHMuc2l6ZSgpOyBpKyspIHsKLS8vCQkJVGVtcG9yYXJ5QW5ub3RhdGlvbiByZW1vdmFsID0gKFRlbXBvcmFyeUFubm90YXRpb24pIHNvcnRlZFJlbW92YWxzLmdldChpKTsKLS8vCQkJZm9yIChpbnQgaiA9IGxhc3RGb3VuZEFkZGVkOyBqIDwgc29ydGVkQWRkaXRpb25zLnNpemUoKTsgaisrKSB7Ci0vLwkJCQlUZW1wb3JhcnlBbm5vdGF0aW9uIGFkZGl0aW9uID0gKFRlbXBvcmFyeUFubm90YXRpb24pIHNvcnRlZEFkZGl0aW9ucy5nZXQoaik7Ci0vLwkJCQkvLyBxdWljayBwb3NpdGlvbiBjaGVjayBoZXJlCi0vLwkJCQlpZiAocmVtb3ZhbC5nZXRQb3NpdGlvbigpLmVxdWFscyhhZGRpdGlvbi5nZXRQb3NpdGlvbigpKSkgewotLy8JCQkJCWxhc3RGb3VuZEFkZGVkID0gajsKLS8vCQkJCQkvLyByZW1vdmUgcGVyZm9ybXMgVGVtcG9yYXJ5QW5ub3RhdGlvbi5lcXVhbHMoKQotLy8JCQkJCS8vIHdoaWNoIGNoZWNrcyB0ZXh0IGFzIHdlbGwKLS8vCQkJCQlmaWx0ZXJlZEFkZGl0aW9ucy5yZW1vdmUoYWRkaXRpb24pOwotLy8JCQkJCWlnbm9yZSA9IHRydWU7Ci0vLwkJCQkJaWYgKERFQlVHKQotLy8JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiB+IHNtYXJ0IHByb2Nlc3MgaWdub3Jpbmc6ICIgKyByZW1vdmFsLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCkpOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJYnJlYWs7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJaWYgKGlnbm9yZSkgewotLy8JCQkJZmlsdGVyZWRSZW1vdmFscy5yZW1vdmUocmVtb3ZhbCk7Ci0vLwkJCX0KLS8vCQkJaWdub3JlID0gZmFsc2U7Ci0vLwkJfQotCQlpZiAoZ2V0QW5ub3RhdGlvbk1vZGVsKCkgaW5zdGFuY2VvZiBJQW5ub3RhdGlvbk1vZGVsRXh0ZW5zaW9uKSB7Ci0vLwkJCVRlbXBvcmFyeUFubm90YXRpb25bXSBmaWx0ZXJlZFJlbW92YWxBcnJheSA9IChUZW1wb3JhcnlBbm5vdGF0aW9uW10pIGZpbHRlcmVkUmVtb3ZhbHMudG9BcnJheShuZXcgVGVtcG9yYXJ5QW5ub3RhdGlvbltmaWx0ZXJlZFJlbW92YWxzLnNpemUoKV0pOwotLy8JCQkvLyBhcHBseSAiZ3JleSItbmVzcwotLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcmVkUmVtb3ZhbEFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0vLwkJCQlpZiAoaXNDYW5jZWxlZCgpKSB7Ci0vLwkJCQkJaWYgKERFQlVHKQotLy8JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlt0cmFjZSByZWNvbmNpbGVyXSA+KiogcmVwbGFjaW5nIFdBUyBDQU5DRUxMRUQgKioiKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJCXJldHVybjsKLS8vCQkJCX0KLS8vCQkJCVN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uIHNtYSA9IGdldENvcnJlc3BvbmRpbmdNYXJrZXJBbm5vdGF0aW9uKGZpbHRlcmVkUmVtb3ZhbEFycmF5W2ldKTsKLS8vCQkJCWlmIChzbWEgIT0gbnVsbCkgewotLy8JCQkJCS8vIGdyYXkgb3V0IHRoZSBtYXJrZXIgYW5ub3RhdGlvbgotLy8JCQkJCXNtYS5zZXRHcmF5ZWQodHJ1ZSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJTWFwIGFubm90YXRpb25zVG9BZGRNYXAgPSBuZXcgSGFzaE1hcCgpOwotLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcmVkQWRkaXRpb25zLnNpemUoKTsgaSsrKSB7Ci0vLwkJCQlUZW1wb3JhcnlBbm5vdGF0aW9uIHRlbXBvcmFyeUFubm90YXRpb24gPSAoVGVtcG9yYXJ5QW5ub3RhdGlvbikgZmlsdGVyZWRBZGRpdGlvbnMuZ2V0KGkpOwotLy8JCQkJYW5ub3RhdGlvbnNUb0FkZE1hcC5wdXQodGVtcG9yYXJ5QW5ub3RhdGlvbiwgdGVtcG9yYXJ5QW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpKTsKLS8vCQkJfQotLy8JCQlpZiAoaXNDYW5jZWxlZCgpKSB7Ci0vLwkJCQlpZiAoREVCVUcpCi0vLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJbdHJhY2UgcmVjb25jaWxlcl0gPioqIFBST0NFU1MgKHJlcGxhY2luZykgV0FTIENBTkNFTExFRCAqKiIpOyAvLyROT04tTkxTLTEkCi0vLwkJCQlyZXR1cm47Ci0vLwkJCX0KLS8vCQkJLyoKLS8vCQkJICogVXNpbmcgdGhlIGV4dGVuc2lvbiBtZWFucyB3ZSBjYW4ndCBlbmZvcmNlIHRoZQotLy8JCQkgKiBFTEVNRU5UX0VSUk9SX0xJTUlUIGxpbWl0LgotLy8JCQkgKi8KLS8vCQkJKChJQW5ub3RhdGlvbk1vZGVsRXh0ZW5zaW9uKSBnZXRBbm5vdGF0aW9uTW9kZWwoKSkucmVwbGFjZUFubm90YXRpb25zKGZpbHRlcmVkUmVtb3ZhbEFycmF5LCBhbm5vdGF0aW9uc1RvQWRkTWFwKTsKLQotCQkJTWFwIGFubm90YXRpb25zVG9BZGRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9uc1RvQWRkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVGVtcG9yYXJ5QW5ub3RhdGlvbiB0ZW1wb3JhcnlBbm5vdGF0aW9uID0gKFRlbXBvcmFyeUFubm90YXRpb24pIGFubm90YXRpb25zVG9BZGRbaV07Ci0JCQkJYW5ub3RhdGlvbnNUb0FkZE1hcC5wdXQodGVtcG9yYXJ5QW5ub3RhdGlvbiwgdGVtcG9yYXJ5QW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpKTsKLQkJCX0KLQkJCWlmIChpc0NhbmNlbGVkKCkpIHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiW3RyYWNlIHJlY29uY2lsZXJdID4qKiBQUk9DRVNTIChyZXBsYWNpbmcpIFdBUyBDQU5DRUxMRUQgKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCSgoSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbikgZ2V0QW5ub3RhdGlvbk1vZGVsKCkpLnJlcGxhY2VBbm5vdGF0aW9ucyhhbm5vdGF0aW9uc1RvUmVtb3ZlLCBhbm5vdGF0aW9uc1RvQWRkTWFwKTsKLQkJfQotCQllbHNlIHsKLS8vCQkJcmVtb3ZlQW5ub3RhdGlvbnMoKFRlbXBvcmFyeUFubm90YXRpb25bXSkgZmlsdGVyZWRSZW1vdmFscy50b0FycmF5KG5ldyBUZW1wb3JhcnlBbm5vdGF0aW9uW2ZpbHRlcmVkUmVtb3ZhbHMuc2l6ZSgpXSkpOwotLy8JCQlwcm9jZXNzKChJUmVjb25jaWxlUmVzdWx0W10pIGZpbHRlcmVkQWRkaXRpb25zLnRvQXJyYXkobmV3IElSZWNvbmNpbGVSZXN1bHRbZmlsdGVyZWRBZGRpdGlvbnMuc2l6ZSgpXSkpOwotCQkJcmVtb3ZlQW5ub3RhdGlvbnMoYW5ub3RhdGlvbnNUb1JlbW92ZSk7Ci0JCQlwcm9jZXNzKGFubm90YXRpb25zVG9BZGQpOwotCQl9Ci0JfQotCi0vLwlwcml2YXRlIENvbXBhcmF0b3IgZ2V0VGVtcG9yYXJ5QW5ub3RhdGlvbkNvbXBhcmF0b3IoKSB7Ci0vLwkJaWYgKGZDb21wYXJhdG9yID09IG51bGwpIHsKLS8vCQkJZkNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLS8vCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKLS8vCQkJCQlUZW1wb3JhcnlBbm5vdGF0aW9uIHRhMSA9IChUZW1wb3JhcnlBbm5vdGF0aW9uKSBhcmcwOwotLy8JCQkJCVRlbXBvcmFyeUFubm90YXRpb24gdGEyID0gKFRlbXBvcmFyeUFubm90YXRpb24pIGFyZzE7Ci0vLwkJCQkJaW50IHJlc3VsdCA9IHRhMS5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpIC0gdGEyLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCk7Ci0vLwkJCQkJaWYocmVzdWx0ICE9IDApCi0vLwkJCQkJCXJldHVybiByZXN1bHQ7Ci0vLwkJCQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZSh0YTEuZ2V0VGV4dCgpLCB0YTIuZ2V0VGV4dCgpKTsKLS8vCQkJCX0KLS8vCQkJfTsKLS8vCQl9Ci0vLwkJcmV0dXJuIGZDb21wYXJhdG9yOwotLy8JfQotCi0JcHVibGljIEhhc2hTZXQgZ2V0TWFya2VyQW5ub3RhdGlvbnMoKSB7Ci0JCWlmIChmTWFya2VyQW5ub3RhdGlvbnMgPT0gbnVsbCkKLQkJCWZNYXJrZXJBbm5vdGF0aW9ucyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXJldHVybiBmTWFya2VyQW5ub3RhdGlvbnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9EaXJ0eVJlZ2lvblByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9EaXJ0eVJlZ2lvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGRhM2Q1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvRGlydHlSZWdpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SW5wdXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci0KLS8qKgotICogVGhpcyBKb2IgaG9sZHMgYSBxdWV1ZSBvZiB1cGRhdGVzIGZyb20gdGhlIGVkaXRvciAoRGlydHlSZWdpb25zKSB0bwotICogcHJvY2Vzcy4gV2hlbiBhIG5ldyByZXF1ZXN0IGNvbWVzIGluLCB0aGUgY3VycmVudCBydW4gaXMgY2FuY2VsZWQsIHRoZSBuZXcKLSAqIHJlcXVlc3QgaXMgYWRkZWQgdG8gdGhlIHF1ZXVlLCB0aGVuIHRoZSBqb2IgaXMgcmUtc2NoZWR1bGVkLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgRGlydHlSZWdpb25Qcm9jZXNzb3IgZXh0ZW5kcyBKb2IgaW1wbGVtZW50cyBJUmVjb25jaWxlciwgSVJlY29uY2lsZXJFeHRlbnNpb24sIElDb25maWd1cmFibGVSZWNvbmNpbGVyIHsKLQljbGFzcyBEb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgSURvY3VtZW50TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJLyoKLQkJCSAqIGlmIGluIHJld3JpdGUgc2Vzc2lvbiBhbmQgYWxyZWFkeSBnb2luZyB0byByZXByb2Nlc3MgZW50aXJlCi0JCQkgKiBkb2N1bWVudCBhZnRlciByZXdyaXRlIHNlc3Npb24sIGRvIG5vdGhpbmcKLQkJCSAqLwotCQkJaWYgKGlzSW5SZXdyaXRlU2Vzc2lvbigpICYmIGZSZXByb2Nlc3NBZnRlclJld3JpdGUpCi0JCQkJcmV0dXJuOwotCQkJLy8gc2F2ZSBwYXJ0aXRpb24gdHlwZSAodG8gc2VlIGlmIGl0IGNoYW5nZXMgaW4gZG9jdW1lbnRDaGFuZ2VkKCkpCi0JCQlmTGFzdFBhcnRpdGlvbnMgPSBnZXRQYXJ0aXRpb25SZWdpb25zKGV2ZW50LmdldE9mZnNldCgpLCBldmVudC5nZXRMZW5ndGgoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJLyoKLQkJCSAqIGlmIGluIHJld3JpdGUgc2Vzc2lvbiBhbmQgYWxyZWFkeSBnb2luZyB0byByZXByb2Nlc3MgZW50aXJlCi0JCQkgKiBkb2N1bWVudCBhZnRlciByZXdyaXRlIHNlc3Npb24sIGRvIG5vdGhpbmcKLQkJCSAqLwotCQkJaWYgKGlzSW5SZXdyaXRlU2Vzc2lvbigpICYmIGZSZXByb2Nlc3NBZnRlclJld3JpdGUpCi0JCQkJcmV0dXJuOwotCi0JCQlpZiAocGFydGl0aW9uc0NoYW5nZWQoZXZlbnQpKSB7Ci0JCQkJLy8gcGFfVE9ETwotCQkJCS8vIHRoaXMgaXMgYSBzaW1wbGUgd2F5IHRvIGVuc3VyZSBvbGQKLQkJCQkvLyBhbm5vdGF0aW9ucyBhcmUgcmVtb3ZlZCB3aGVuIHBhcnRpdGlvbiBjaGFuZ2VzCi0KLQkJCQkvLyBpdCBtaWdodCBiZSBhIHBlcmZvcm1hbmNlIGhpdCB0aG91Z2gKLQkJCQlzZXRFbnRpcmVEb2N1bWVudERpcnR5KGdldERvY3VtZW50KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyoKLQkJCQkgKiBOb3RlIHRoYXQgY3JlYXRpbmcgRGlydHlSZWdpb25zICpub3cqIG1lYW5zIHRoYXQgdGhlIHdyb25nCi0JCQkJICogdGV4dCBtYXkgYmUgaW5jbHVkZWQKLQkJCQkgKi8KLQkJCQlEaXJ0eVJlZ2lvbiBkciA9IG51bGw7Ci0JCQkJaWYgKGV2ZW50LmdldExlbmd0aCgpID09IDApIHsKLQkJCQkJLyoKLQkJCQkJICogSXQncyBhbiBpbnNlcnQtLSB3ZSB1c2UgdGV4dCBsZW5ndGggdGhvdWdoIHNvIHRoYXQgdGhlCi0JCQkJCSAqIG5ldyByZWdpb24gZ2V0cyB2YWxpZGF0ZWQuLi4KLQkJCQkJICovCi0JCQkJCWRyID0gY3JlYXRlRGlydHlSZWdpb24oZXZlbnQuZ2V0T2Zmc2V0KCksIDAsIERpcnR5UmVnaW9uLklOU0VSVCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoIiIuZXF1YWxzKGV2ZW50LmdldFRleHQoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8gaXQncyBhIGRlbGV0ZQotCQkJCQkJZHIgPSBjcmVhdGVEaXJ0eVJlZ2lvbihldmVudC5nZXRPZmZzZXQoKSwgZXZlbnQuZ2V0TGVuZ3RoKCksIERpcnR5UmVnaW9uLlJFTU9WRSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBpdCdzIGEgcmVwbGFjZQotCQkJCQkJZHIgPSBjcmVhdGVEaXJ0eVJlZ2lvbihldmVudC5nZXRPZmZzZXQoKSwgZXZlbnQuZ2V0TGVuZ3RoKCksIERpcnR5UmVnaW9uLklOU0VSVCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGlzSW5SZXdyaXRlU2Vzc2lvbigpKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIHdoaWxlIGluIHJld3JpdGUgc2Vzc2lvbiwgZm91bmQgYSBkaXJ0eSByZWdpb24sIHNvIGZsYWcKLQkJCQkJICogdGhhdCBlbnRpcmUgZG9jdW1lbnQgbmVlZHMgdG8gYmUgcmVwcm9jZXNlZCBhZnRlcgotCQkJCQkgKiByZXdyaXRlIHNlc3Npb24KLQkJCQkJICovCi0JCQkJCWlmICghZlJlcHJvY2Vzc0FmdGVyUmV3cml0ZSAmJiAoZHIgIT0gbnVsbCkpIHsKLQkJCQkJCWZSZXByb2Nlc3NBZnRlclJld3JpdGUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlwcm9jZXNzRGlydHlSZWdpb24oZHIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBDaGVja3MgcHJldmlvdXMgcGFydGl0aW9ucyBmcm9tIHRoZSBzcGFuIG9mIHRoZSBldmVudCB3LyB0aGUgbmV3Ci0JCSAqIHBhcnRpdGlvbnMgZnJvbSB0aGUgc3BhbiBvZiB0aGUgZXZlbnQuIElmIHBhcnRpdGlvbnMgY2hhbmdlZCwKLQkJICogcmV0dXJuIHRydWUsIGVsc2UgcmV0dXJuIGZhbHNlCi0JCSAqIAotCQkgKiBAcGFyYW0gZXZlbnQKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIHBhcnRpdGlvbnNDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQkJaW50IGxlbmd0aCA9IGV2ZW50LmdldExlbmd0aCgpOwotCi0JCQlpZiAoZXZlbnQuZ2V0TGVuZ3RoKCkgPT0gMCAmJiBldmVudC5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJLy8gaXQncyBhbiBpbnNlcnQsIHdlIHdhbnQgcGFydGl0aW9ucyBvZiB0aGUgbmV3IHRleHQKLQkJCQlsZW5ndGggPSBldmVudC5nZXRUZXh0KCkubGVuZ3RoKCk7Ci0JCQl9Ci0KLQkJCUlUeXBlZFJlZ2lvbltdIG5ld1BhcnRpdGlvbnMgPSBnZXRQYXJ0aXRpb25SZWdpb25zKGV2ZW50LmdldE9mZnNldCgpLCBsZW5ndGgpOwotCQkJaWYgKGZMYXN0UGFydGl0aW9ucyAhPSBudWxsKSB7Ci0JCQkJaWYgKGZMYXN0UGFydGl0aW9ucy5sZW5ndGggIT0gbmV3UGFydGl0aW9ucy5sZW5ndGgpIHsKLQkJCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZMYXN0UGFydGl0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKCFmTGFzdFBhcnRpdGlvbnNbaV0uZ2V0VHlwZSgpLmVxdWFscyhuZXdQYXJ0aXRpb25zW2ldLmdldFR5cGUoKSkpIHsKLQkJCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjaGFuZ2VkOwotCQl9Ci0KLQotCX0KLQotCS8qKgotCSAqIFJlY29uY2lsZXMgdGhlIGVudGlyZSBkb2N1bWVudCB3aGVuIHRoZSBkb2N1bWVudCBpbiB0aGUgdmlld2VyIGlzCi0JICogY2hhbmdlZC4gVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGRvY3VtZW50IGlzIGluaXRpYWxseSBvcGVuZWQsIGFzIHdlbGwgYXMKLQkgKiBhZnRlciBhIHNhdmUtYXMuCi0JICogCi0JICogQWxzbyBzZWUgcHJvY2Vzc1Bvc3RNb2RlbEV2ZW50KC4uLikgZm9yIHNpbWlsYXIgYmVoYXZpb3Igd2hlbiBkb2N1bWVudAotCSAqIGZvciB0aGUgbW9kZWwgaXMgY2hhbmdlZC4KLQkgKi8KLQljbGFzcyBUZXh0SW5wdXRMaXN0ZW5lciBpbXBsZW1lbnRzIElUZXh0SW5wdXRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dERvY3VtZW50Q2hhbmdlZChJRG9jdW1lbnQgb2xkSW5wdXQsIElEb2N1bWVudCBuZXdJbnB1dCkgewotCQkJaGFuZGxlSW5wdXREb2N1bWVudENoYW5nZWQob2xkSW5wdXQsIG5ld0lucHV0KTsKLQkJfQotCX0KLQotCWNsYXNzIERvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lciBpbXBsZW1lbnRzIElEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIgewotCQlsb25nIHRpbWUwID0gMDsKLQotCQlwdWJsaWMgdm9pZCBkb2N1bWVudFJld3JpdGVTZXNzaW9uQ2hhbmdlZChEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQgZXZlbnQpIHsKLQkJCWJvb2xlYW4gb2xkVmFsdWUgPSBmSW5SZXdyaXRlU2Vzc2lvbjsKLQkJCWZJblJld3JpdGVTZXNzaW9uID0gZXZlbnQgIT0gbnVsbCAmJiBldmVudC5nZXRDaGFuZ2VUeXBlKCkuZXF1YWxzKERvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudC5TRVNTSU9OX1NUQVJUKTsKLQotCQkJaWYgKGV2ZW50LmdldENoYW5nZVR5cGUoKS5lcXVhbHMoRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkV2ZW50LlNFU1NJT05fU1RBUlQpKSB7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJfQotCQkJCS8vIGJ1ZyAyMzU0NDYgLSBzb3VyY2UgdmFsaWRhdGlvbiBhbm5vdGF0aW9ucyBsb3N0IGFmdGVyIHJld3JpdGUgc2Vzc2lvbgotCQkJCWlmICghZ2V0RGlydHlSZWdpb25RdWV1ZSgpLmlzRW1wdHkoKSkgewotCQkJCQlmbHVzaERpcnR5UmVnaW9uUXVldWUoKTsKLQkJCQkJZlJlcHJvY2Vzc0FmdGVyUmV3cml0ZSA9IHRydWU7CQotCQkJCX0gZWxzZSB7Ci0JCQkJCWZSZXByb2Nlc3NBZnRlclJld3JpdGUgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChldmVudC5nZXRDaGFuZ2VUeXBlKCkuZXF1YWxzKERvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudC5TRVNTSU9OX1NUT1ApKSB7Ci0JCQkJaWYgKGZJblJld3JpdGVTZXNzaW9uIF4gb2xkVmFsdWUgJiYgZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiUmV3cml0ZSBzZXNzaW9uIGxhc3RlZCAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7Ci0JCQkJCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQl9Ci0JCQkJCWlmIChmUmVwcm9jZXNzQWZ0ZXJSZXdyaXRlKSB7Ci0JCQkJCQlEaXJ0eVJlZ2lvbiBlbnRpcmVEb2N1bWVudCA9IGNyZWF0ZURpcnR5UmVnaW9uKDAsIGZEb2N1bWVudC5nZXRMZW5ndGgoKSwgRGlydHlSZWdpb24uSU5TRVJUKTsKLQkJCQkJCXByb2Nlc3NEaXJ0eVJlZ2lvbihlbnRpcmVEb2N1bWVudCk7Ci0JCQkJCX0KLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiRnVsbCBkb2N1bWVudCByZXByb2Nlc3MgdG9vayAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7Ci0JCQkJCX0KLQkJCQkJZlJlcHJvY2Vzc0FmdGVyUmV3cml0ZSA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKiBkZWJ1ZyBmbGFnICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVVBEQVRFX0RFTEFZID0gNzUwOwotCi0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvZGVidWcvcmVjb25jaWxlcmpvYiIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIGxvbmcgZkRlbGF5OwotCi0KLQkvKiogbG9jYWwgcXVldWUgb2YgZGlydHkgcmVnaW9ucyAoY3JlYXRlZCBoZXJlKSB0byBiZSByZWNvbmNpbGVkICovCi0JcHJpdmF0ZSBMaXN0IGZEaXJ0eVJlZ2lvblF1ZXVlID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChuZXcgQXJyYXlMaXN0KCkpOwotCi0JLyoqIGRvY3VtZW50IHRoYXQgdGhpcyByZWNvbmNpbGVyIHdvcmtzIG9uICovCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQotCXByaXZhdGUgSURvY3VtZW50TGlzdGVuZXIgZkRvY3VtZW50TGlzdGVuZXIgPSBuZXcgRG9jdW1lbnRMaXN0ZW5lcigpOwotCXByaXZhdGUgSURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lciBmRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyID0gbmV3IERvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcigpOwotCi0JLyoqCi0JICogc2V0IHRydWUgYWZ0ZXIgZmlyc3QgaW5zdGFsbCB0byBwcmV2ZW50IGR1cGxpY2F0ZSB3b3JrIGRvbmUgaW4gdGhlCi0JICogaW5zdGFsbCBtZXRob2QgKHNpbmNlIGluc3RhbGwgZ2V0cyBjYWxsZWQgbXVsdGlwbGUgdGltZXMpCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZJc0luc3RhbGxlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogc28gd2UgY2FuIHRlbGwgaWYgYSBwYXJ0aXRpb24gY2hhbmdlZCBhZnRlciB0aGUgbGFzdCBlZGl0Ci0JICovCi0JSVR5cGVkUmVnaW9uW10gZkxhc3RQYXJ0aXRpb25zOwotCi0JTGlzdCBmTm9uSW5jcmVtZW50YWxTdHJhdGVnaWVzQWxyZWFkeVByb2Nlc3NlZCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0KLQkvKioKLQkgKiBUaGUgcGFydGl0aW9uaW5nIHRoaXMgcmVjb25jaWxlciB1c2VzLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZQYXJ0aXRpb25pbmc7Ci0KLQlNYXAgZlJlY29uY2lsaW5nU3RyYXRlZ2llcyA9IG51bGw7Ci0KLQkvKiogZm9yIGluaXRpYWwgcmVjb25jaWxlIHdoZW4gZG9jdW1lbnQgaXMgb3BlbmVkICovCi0JcHJpdmF0ZSBUZXh0SW5wdXRMaXN0ZW5lciBmVGV4dElucHV0TGlzdGVuZXIgPSBudWxsOwotCS8qKiB0aGUgdGV4dCB2aWV3ZXIgKi8KLQlwcml2YXRlIElUZXh0Vmlld2VyIGZWaWV3ZXI7Ci0JYm9vbGVhbiBmSW5SZXdyaXRlU2Vzc2lvbiA9IGZhbHNlOwotCS8qKgotCSAqIHRydWUgaWYgZW50aXJlIGRvY3VtZW50IG5lZWRzIHRvIGJlIHJlcHJvY2Vzc2VkIGFmdGVyIHJld3JpdGUgc2Vzc2lvbgotCSAqLwotCWJvb2xlYW4gZlJlcHJvY2Vzc0FmdGVyUmV3cml0ZSA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBTdHJ1Y3R1cmVkUmVnaW9uUHJvY2Vzc29yCi0JICovCi0JcHVibGljIERpcnR5UmVnaW9uUHJvY2Vzc29yKCkgewotCQkvLyBpbml0IGpvYiBzdHVmZgotCQlzdXBlcihTU0VVSU1lc3NhZ2VzLnByb2NfZGlydHlfcmVnaW9uc18wKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRQcmlvcml0eShKb2IuTE9ORyk7Ci0JCXNldFN5c3RlbSh0cnVlKTsKLQotCQkvLyBpbml0IHJlY29uY2lsZXIgc3R1ZmYKLQkJc2V0RGVsYXkoVVBEQVRFX0RFTEFZKTsKLQkJZlJlY29uY2lsaW5nU3RyYXRlZ2llcyA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gcmVzb3VyY2UgdG8gdGhlIHNldCBvZiByZXNvdXJjZXMgdGhhdCBuZWVkIHJlZnJlc2hpbmcuCi0JICogU3luY2hyb25pemVkIGluIG9yZGVyIHRvIHByb3RlY3QgdGhlIGNvbGxlY3Rpb24gZHVyaW5nIGFkZC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZFJlcXVlc3QoRGlydHlSZWdpb24gbmV3RGlydHlSZWdpb24pIHsKLQkJLy8gTk9URTogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGEgbG90IHNvIG1ha2Ugc3VyZSBpdCdzIGZhc3QKLQkJTGlzdCBkaXJ0eVJlZ2lvblF1ZXVlID0gZ2V0RGlydHlSZWdpb25RdWV1ZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGlydHlSZWdpb25RdWV1ZS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkvLyBnbyB0aHJvdWdoIGxpc3Qgb2YgZXhpc3RpbmcgZGlydHkgcmVnaW9ucyBhbmQgY2hlY2sgaWYgYW55Ci0JCQkvLyBkaXJ0eSByZWdpb25zIG5lZWQgdG8gYmUgZGlzY2FyZGVkCi0JCQlEaXJ0eVJlZ2lvbiBjdXJyZW50RXhpc3RpbmcgPSAoRGlydHlSZWdpb24pIGl0Lm5leHQoKTsKLQkJCURpcnR5UmVnaW9uIG91dGVyID0gZ2V0T3V0ZXJSZWdpb24oY3VycmVudEV4aXN0aW5nLCBuZXdEaXJ0eVJlZ2lvbik7Ci0JCQkvLyBpZiB3ZSBhbHJlYWR5IGhhdmUgYSByZXF1ZXN0IHdoaWNoIGNvbnRhaW5zIHRoZSBuZXcgcmVxdWVzdCwKLQkJCS8vIGRpc2NhcmQgdGhlIG5ldyByZXF1ZXN0Ci0JCQlpZiAob3V0ZXIgPT0gY3VycmVudEV4aXN0aW5nKQotCQkJCXJldHVybjsKLQkJCS8vIGlmIG5ldyByZXF1ZXN0IGNvbnRhaW5zIGFueSBleGlzdGluZyByZXF1ZXN0cywKLQkJCS8vIHJlbW92ZSB0aG9zZQotCQkJaWYgKG91dGVyID09IG5ld0RpcnR5UmVnaW9uKQotCQkJCWl0LnJlbW92ZSgpOwotCQl9Ci0JCWRpcnR5UmVnaW9uUXVldWUuYWRkKG5ld0RpcnR5UmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyBzdWJjbGFzc2VzIHRoYXQgcHJvY2Vzc2luZyBvZiBtdWx0aXBsZSBkaXJ0eSByZWdpb25zIGhhcyBiZWd1bgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJlZ2luUHJvY2Vzc2luZygpIHsKLQkJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRpcnR5UmVnaW9uCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJVHlwZWRSZWdpb25bXSBjb21wdXRlUGFydGl0aW9uaW5nKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uKSB7Ci0JCWludCBkck9mZnNldCA9IGRpcnR5UmVnaW9uLmdldE9mZnNldCgpOwotCQlpbnQgZHJMZW5ndGggPSBkaXJ0eVJlZ2lvbi5nZXRMZW5ndGgoKTsKLQotCQlyZXR1cm4gY29tcHV0ZVBhcnRpdGlvbmluZyhkck9mZnNldCwgZHJMZW5ndGgpOwotCX0KLQotCXByb3RlY3RlZCBJVHlwZWRSZWdpb25bXSBjb21wdXRlUGFydGl0aW9uaW5nKGludCBkck9mZnNldCwgaW50IGRyTGVuZ3RoKSB7Ci0JCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudCgpOwotCQlpbnQgZG9jTGVuZ3RoID0gZG9jLmdldExlbmd0aCgpOwotCi0JCUlUeXBlZFJlZ2lvbltdIHRyID0gbmV3IElUeXBlZFJlZ2lvblswXTsKLQotCQlpZiAoZHJPZmZzZXQgPiBkb2NMZW5ndGgpIHsKLQkJCWRyT2Zmc2V0ID0gZG9jTGVuZ3RoOwotCQkJZHJMZW5ndGggPSAwOwotCQl9Ci0JCWVsc2UgaWYgKGRyT2Zmc2V0ICsgZHJMZW5ndGggPiBkb2NMZW5ndGgpIHsKLQkJCWRyTGVuZ3RoID0gZG9jTGVuZ3RoIC0gZHJPZmZzZXQ7Ci0JCX0KLQotCQl0cnkgewotCQkJLy8gZGlydHkgcmVnaW9uIG1heSBzcGFuIG11bHRpcGxlIHBhcnRpdGlvbnMKLQkJCXRyID0gVGV4dFV0aWxpdGllcy5jb21wdXRlUGFydGl0aW9uaW5nKGRvYywgZ2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoKSwgZHJPZmZzZXQsIGRyTGVuZ3RoLCB0cnVlKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIGluZm8gPSAiZHI6IFsiICsgZHJPZmZzZXQgKyAiOiIgKyBkckxlbmd0aCArICJdIGRvYzogWyIgKyBkb2NMZW5ndGggKyAiXSAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGluZm8sIGUpOwotCQkJdHIgPSBuZXcgSVR5cGVkUmVnaW9uWzBdOwotCQl9Ci0JCXJldHVybiB0cjsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGRldGVybWluZSBpZiBvbmUgZGlydHkgcmVnaW9uIGNvbnRhaW5zIHRoZSBvdGhlciBhbmQgaWYgc28sCi0JICogd2hpY2ggaXMgdGhlIG9uZSB0aGF0IGNvbnRhaW5zIGl0LgotCSAqIAotCSAqIEBwYXJhbSByb290Ci0JICogQHBhcmFtIHBvc3NpYmxlCi0JICogQHJldHVybiB0aGUgb3V0ZXIgZGlydHkgcmVnaW9uIGlmIGl0IGNvbnRhaW5zIHRoZSBvdGhlciBkaXJ0eSByZWdpb24sCi0JICogICAgICAgICBudWxsIG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBEaXJ0eVJlZ2lvbiBnZXRPdXRlclJlZ2lvbihEaXJ0eVJlZ2lvbiByb290LCBEaXJ0eVJlZ2lvbiBwb3NzaWJsZSkgewotCQlEaXJ0eVJlZ2lvbiBvdXRlciA9IG51bGw7Ci0JCWlmIChpc0NvbnRhaW5lZChyb290LCBwb3NzaWJsZSkpCi0JCQlvdXRlciA9IHJvb3Q7Ci0JCWVsc2UgaWYgKGlzQ29udGFpbmVkKHBvc3NpYmxlLCByb290KSkKLQkJCW91dGVyID0gcG9zc2libGU7Ci0JCXJldHVybiBvdXRlcjsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGRldGVybWluZSBvZiBhICJwb3NzaWJsZSIgZGlydHkgcmVnaW9uIGNhbiBiZSBkaXNjYXJkZWQgaW4KLQkgKiBmYXZvciBvZiB1c2luZyBqdXN0IHRoZSAicm9vdCIgZGlydHkgcmVnaW9uLgotCSAqIAotCSAqIEByZXR1cm4gaWYgdGhlIHJvb3QgZGlydHkgcmVnaW9uIGNvbnRhaW5zIHBvc3NpYmxlLCByZXR1cm4gdHJ1ZSwKLQkgKiAgICAgICAgIG90aGVyd2lzZSByZXR1cm4gZmFsc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDb250YWluZWQoRGlydHlSZWdpb24gcm9vdCwgRGlydHlSZWdpb24gcG9zc2libGUpIHsKLQkJaW50IHJvb3RTdGFydCA9IHJvb3QuZ2V0T2Zmc2V0KCk7Ci0JCWludCByb290RW5kID0gcm9vdFN0YXJ0ICsgcm9vdC5nZXRMZW5ndGgoKTsKLQkJaW50IHBvc3NTdGFydCA9IHBvc3NpYmxlLmdldE9mZnNldCgpOwotCQlpbnQgcG9zc0VuZCA9IHBvc3NTdGFydCArIHBvc3NpYmxlLmdldExlbmd0aCgpOwotCQlpZiAocm9vdFN0YXJ0IDw9IHBvc3NTdGFydCAmJiByb290RW5kID49IHBvc3NFbmQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBEaXJ0eVJlZ2lvbiBjcmVhdGVEaXJ0eVJlZ2lvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdHlwZSkgewotCQlEaXJ0eVJlZ2lvbiBkdXJ0eSA9IG51bGw7Ci0JCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudCgpOwotCi0JCWlmIChkb2MgIT0gbnVsbCkgewotCQkJLy8gc2FmZXR5IGZvciBCTEUKLQkJCWludCBkb2NMZW4gPSBkb2MuZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAob2Zmc2V0ID4gZG9jTGVuKSB7Ci0JCQkJb2Zmc2V0ID0gZG9jTGVuOwotCQkJCWxlbmd0aCA9IDA7Ci0JCQl9Ci0JCQllbHNlIGlmIChvZmZzZXQgKyBsZW5ndGggPj0gZG9jTGVuKQotCQkJCWxlbmd0aCA9IGRvY0xlbiAtIG9mZnNldDsKLQkJCXRyeSB7Ci0JCQkJZHVydHkgPSBuZXcgRGlydHlSZWdpb24ob2Zmc2V0LCBsZW5ndGgsIHR5cGUsIGRvYy5nZXQob2Zmc2V0LCBsZW5ndGgpKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIGluZm8gPSAiZHI6IFsiICsgb2Zmc2V0ICsgIjoiICsgbGVuZ3RoICsgIl0gZG9jOiBbIiArIGRvY0xlbiArICJdICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGluZm8sIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkdXJ0eTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGlydHlSZWdpb24gY3JlYXRlRGlydHlSZWdpb24oSVR5cGVkUmVnaW9uIHRyLCBTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gY3JlYXRlRGlydHlSZWdpb24odHIuZ2V0T2Zmc2V0KCksIHRyLmdldExlbmd0aCgpLCB0eXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmbHVzaERpcnR5UmVnaW9uUXVldWUoKSB7Ci0JCWZEaXJ0eVJlZ2lvblF1ZXVlLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgc3ViY2xhc3NlcyB0aGF0IHByb2Nlc3Npbmcgb2YgbXVsdGlwbGUgZGlydHkgcmVnaW9ucyBoYXMKLQkgKiBlbmRlZCwgZm9yIG5vdwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZFByb2Nlc3NpbmcoKSB7Ci0JCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAotCX0KLQotCS8qKgotCSAqIERlbGF5IGJldHdlZW4gcHJvY2Vzc2luZyBvZiBEaXJ0eVJlZ2lvbnMuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWxvbmcgZ2V0RGVsYXkoKSB7Ci0JCXJldHVybiBmRGVsYXk7Ci0JfQotCi0JTGlzdCBnZXREaXJ0eVJlZ2lvblF1ZXVlKCkgewotCQlyZXR1cm4gZkRpcnR5UmVnaW9uUXVldWU7Ci0JfQotCi0JLyoqCi0JICogVGhlIElEb2N1bWVudCBvbiB3aGljaCB0aGlzIHJlY29uY2lsZXIgb3BlcmF0ZXMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50UGFydGl0aW9uaW5nKCkgewotCQlpZiAoZlBhcnRpdGlvbmluZyA9PSBudWxsKQotCQkJcmV0dXJuIElEb2N1bWVudEV4dGVuc2lvbjMuREVGQVVMVF9QQVJUSVRJT05JTkc7Ci0JCXJldHVybiBmUGFydGl0aW9uaW5nOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRQYXJ0aXRpb25zKGludCBkck9mZnNldCwgaW50IGRyTGVuZ3RoKSB7Ci0KLQkJSVR5cGVkUmVnaW9uW10gcmVnaW9ucyA9IG5ldyBJVHlwZWRSZWdpb25bMF07Ci0JCWludCBkb2NMZW5ndGggPSBnZXREb2N1bWVudCgpLmdldExlbmd0aCgpOwotCi0JCWlmIChkck9mZnNldCA+IGRvY0xlbmd0aCkgewotCQkJZHJPZmZzZXQgPSBkb2NMZW5ndGg7Ci0JCQlkckxlbmd0aCA9IDA7Ci0JCX0KLQkJZWxzZSBpZiAoZHJPZmZzZXQgKyBkckxlbmd0aCA+IGRvY0xlbmd0aCkgewotCQkJZHJMZW5ndGggPSBkb2NMZW5ndGggLSBkck9mZnNldDsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZWdpb25zID0gVGV4dFV0aWxpdGllcy5jb21wdXRlUGFydGl0aW9uaW5nKGdldERvY3VtZW50KCksIGdldERvY3VtZW50UGFydGl0aW9uaW5nKCksIGRyT2Zmc2V0LCBkckxlbmd0aCwgdHJ1ZSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQlyZWdpb25zID0gbmV3IElUeXBlZFJlZ2lvblswXTsKLQkJfQotCQlTdHJpbmdbXSBwYXJ0aXRpb25zID0gbmV3IFN0cmluZ1tyZWdpb25zLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykKLQkJCXBhcnRpdGlvbnNbaV0gPSByZWdpb25zW2ldLmdldFR5cGUoKTsKLQkJcmV0dXJuIHBhcnRpdGlvbnM7Ci0JfQotCi0JSVR5cGVkUmVnaW9uW10gZ2V0UGFydGl0aW9uUmVnaW9ucyhpbnQgZHJPZmZzZXQsIGludCBkckxlbmd0aCkgewotCQlJVHlwZWRSZWdpb25bXSByZWdpb25zID0gbmV3IElUeXBlZFJlZ2lvblswXTsKLQkJaW50IGRvY0xlbmd0aCA9IGdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0KLQkJaWYgKGRyT2Zmc2V0ID4gZG9jTGVuZ3RoKSB7Ci0JCQlkck9mZnNldCA9IGRvY0xlbmd0aDsKLQkJCWRyTGVuZ3RoID0gMDsKLQkJfQotCQllbHNlIGlmIChkck9mZnNldCArIGRyTGVuZ3RoID4gZG9jTGVuZ3RoKSB7Ci0JCQlkckxlbmd0aCA9IGRvY0xlbmd0aCAtIGRyT2Zmc2V0OwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXJlZ2lvbnMgPSBUZXh0VXRpbGl0aWVzLmNvbXB1dGVQYXJ0aXRpb25pbmcoZ2V0RG9jdW1lbnQoKSwgZ2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoKSwgZHJPZmZzZXQsIGRyTGVuZ3RoLCB0cnVlKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXJlZ2lvbnMgPSBuZXcgSVR5cGVkUmVnaW9uWzBdOwotCQl9Ci0JCXJldHVybiByZWdpb25zOwotCX0KLQkJCi0JCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlY29uY2lsaW5nIHN0cmF0ZWd5IHJlZ2lzdGVyZWQgd2l0aCB0aGUgcmVjb25jaWxlciBmb3IgdGhlCi0JICogc3BlY2lmaWVkIHBhcnRpdGlvbiB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlCi0JICogICAgICAgICAgICB0aGUgcGFydGl0aW9uIHR5cGUgZm9yIHdoaWNoIHRvIGRldGVybWluZSB0aGUgcmVjb25jaWxpbmcKLQkgKiAgICAgICAgICAgIHN0cmF0ZWd5Ci0JICogCi0JICogQHJldHVybiB0aGUgcmVjb25jaWxpbmcgc3RyYXRlZ3kgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIHBhcnRpdGlvbgotCSAqICAgICAgICAgdHlwZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc3VjaCBzdHJhdGVneQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVyI2dldFJlY29uY2lsaW5nU3RyYXRlZ3koamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVJlY29uY2lsaW5nU3RyYXRlZ3kgZ2V0UmVjb25jaWxpbmdTdHJhdGVneShTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlpZiAocGFydGl0aW9uVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSVJlY29uY2lsaW5nU3RyYXRlZ3kpIGZSZWNvbmNpbGluZ1N0cmF0ZWdpZXMuZ2V0KHBhcnRpdGlvblR5cGUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFsc28gc3luY2hyb25pemVkIGJlY2F1c2UgaXQgYWNjZXNzZXMgdGhlIGZSZXF1ZXN0cyBxdWV1ZQotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGN1cnJlbnRseSByZXF1ZXN0ZWQgTm9kZXMgdG8gcmVmcmVzaAotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIERpcnR5UmVnaW9uW10gZ2V0UmVxdWVzdHMoKSB7Ci0JCURpcnR5UmVnaW9uW10gdG9SZWZyZXNoID0gKERpcnR5UmVnaW9uW10pIGZEaXJ0eVJlZ2lvblF1ZXVlLnRvQXJyYXkobmV3IERpcnR5UmVnaW9uW2ZEaXJ0eVJlZ2lvblF1ZXVlLnNpemUoKV0pOwotCQlmbHVzaERpcnR5UmVnaW9uUXVldWUoKTsKLQkJcmV0dXJuIHRvUmVmcmVzaDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IHZpZXdlciB0aGlzIHJlY29uY2lsZXIgaXMgaW5zdGFsbGVkIG9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgdmlld2VyIHRoaXMgcmVjb25jaWxlciBpcyBpbnN0YWxsZWQgb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVRleHRWaWV3ZXIgZ2V0VGV4dFZpZXdlcigpIHsKLQkJcmV0dXJuIGZWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG9sZElucHV0Ci0JICogQHBhcmFtIG5ld0lucHV0Ci0JICovCi0Jdm9pZCBoYW5kbGVJbnB1dERvY3VtZW50Q2hhbmdlZChJRG9jdW1lbnQgb2xkSW5wdXQsIElEb2N1bWVudCBuZXdJbnB1dCkgewotCQkvLyBkb24ndCBib3RoZXIgaWYgcmVjb25jaWxlciBub3QgaW5zdGFsbGVkCi0JCWlmIChpc0luc3RhbGxlZCgpKSB7Ci0JCQlzZXREb2N1bWVudChuZXdJbnB1dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlciNpbnN0YWxsKElUZXh0Vmlld2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGwoSVRleHRWaWV3ZXIgdGV4dFZpZXdlcikgewotCQkvLyB3ZSBtaWdodCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aCB0aGUgc2FtZSB2aWV3ZS5yLAotCQkvLyBtYXliZSBhZnRlciBiZWluZyB1bmluc3RhbGxlZCBhcyB3ZWxsLCBzbyB0cmFjayBzZXBhcmF0ZWx5Ci0JCWlmICghaXNJbnN0YWxsZWQoKSkgewotCQkJZlZpZXdlciA9IHRleHRWaWV3ZXI7Ci0JCQlmVGV4dElucHV0TGlzdGVuZXIgPSBuZXcgVGV4dElucHV0TGlzdGVuZXIoKTsKLQkJCXRleHRWaWV3ZXIuYWRkVGV4dElucHV0TGlzdGVuZXIoZlRleHRJbnB1dExpc3RlbmVyKTsKLQkJCXNldEluc3RhbGxlZCh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSB2aWV3ZXIgaGFzIGJlZW4gc2V0IG9uIHRoaXMgUmVjb25jaWxlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZpZXdlciBoYXMgYmVlbiBzZXQgb24gdGhpcyBSZWNvbmNpbGVyLCBmYWxzZQotCSAqICAgICAgICAgb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW5zdGFsbGVkKCkgewotCQlyZXR1cm4gZklzSW5zdGFsbGVkOwotCX0KLQotCWJvb2xlYW4gaXNJblJld3JpdGVTZXNzaW9uKCkgewotCQlyZXR1cm4gZkluUmV3cml0ZVNlc3Npb247Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IGZvciBzcGVjaWZpYyBoYW5kbGluZyBvZiBkaXJ0eSByZWdpb25zLiBUaGUKLQkgKiBtZXRob2QgaXMgaW52b2tlZCBmb3IgZWFjaCBkaXJ0eSByZWdpb24gaW4gdGhlIEpvYidzIHF1ZXVlLgotCSAqIAotCSAqIEBwYXJhbSBkaXJ0eVJlZ2lvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3MoRGlydHlSZWdpb24gZGlydHlSZWdpb24pIHsKLQkJaWYgKGlzSW5SZXdyaXRlU2Vzc2lvbigpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLyoKLQkJICogQnJlYWsgdGhlIGRpcnR5IHJlZ2lvbiBpbnRvIGEgc2VxdWVuY2Ugb2YgcGFydGl0aW9ucyBhbmQgZmluZCB0aGUKLQkJICogY29ycmVzcG9uZGluZyBzdHJhdGVneSB0byByZWNvbmNpbGUgdGhvc2UgcGFydGl0aW9ucy4gSWYgYSBzdHJhdGVneQotCQkgKiBpbXBsZW1lbnRzIElOb25JbmNyZW1lbnRhbFJlY29uY2lsaW5nU3RyYXRlZ3ksIG9ubHkgY2FsbCBpdCBvbmNlCi0JCSAqIHJlZ2FyZGxlc3Mgb2YgdGhlIG51bWJlciBhbmQgdHlwZXMgb2YgcGFydGl0aW9ucy4KLQkJICovCi0JCUlUeXBlZFJlZ2lvbltdIHBhcnRpdGlvbnMgPSBjb21wdXRlUGFydGl0aW9uaW5nKGRpcnR5UmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUmVjb25jaWxpbmdTdHJhdGVneSBzdHJhdGVneSA9IGdldFJlY29uY2lsaW5nU3RyYXRlZ3kocGFydGl0aW9uc1tpXS5nZXRUeXBlKCkpOwotCQkJaWYgKHN0cmF0ZWd5ICE9IG51bGwpIHsKLQkJCQlzdHJhdGVneS5yZWNvbmNpbGUocGFydGl0aW9uc1tpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnZva2UgZGlydHkgcmVnaW9uIHByb2Nlc3NpbmcuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBwcm9jZXNzRGlydHlSZWdpb24oRGlydHlSZWdpb24gZHIpIHsKLQkJaWYgKGRyID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJY2FuY2VsKCk7Ci0JCWFkZFJlcXVlc3QoZHIpOwotCQlzY2hlZHVsZShnZXREZWxheSgpKTsKLQotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWRkZWQgcmVxdWVzdCBmb3I6IFsiICsgZHIuZ2V0VGV4dCgpICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInF1ZXVlIHNpemUgaXMgbm93OiAiICsgZ2V0RGlydHlSZWdpb25RdWV1ZSgpLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoIVBsYXRmb3JtVUkuaXNXb3JrYmVuY2hSdW5uaW5nKCkpCi0JCQlyZXR1cm4gc3RhdHVzOwotCi0JCXRyeSB7Ci0JCQliZWdpblByb2Nlc3NpbmcoKTsKLQotCQkJRGlydHlSZWdpb25bXSB0b1JlZnJlc2ggPSBnZXRSZXF1ZXN0cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b1JlZnJlc2gubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCXByb2Nlc3ModG9SZWZyZXNoW2ldKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDM2NzYKLQkJCS8vIHN0b3AgZXJyb3JzIGZyb20gcG9wcGluZyB1cCBhIGRpYWxvZwotCQkJLy8gZnJvbSB0aGUgam9iIG1hbmFnZXIKLQotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNjA1MgotCQkJLy8gZG9uJ3QgbG9nIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uCi0JCQlpZiAoIShlIGluc3RhbmNlb2YgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24pKQotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oInByb2JsZW0gd2l0aCByZWNvbmNpbGluZyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZmluYWxseSB7Ci0JCQllbmRQcm9jZXNzaW5nKCk7Ci0KLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVsYXkobG9uZyBkZWxheSkgewotCQlmRGVsYXkgPSBkZWxheTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJLy8gdW5ob29rIG9sZCBkb2N1bWVudCBsaXN0ZW5lcgotCQkJZkRvY3VtZW50LnJlbW92ZURvY3VtZW50TGlzdGVuZXIoZkRvY3VtZW50TGlzdGVuZXIpOwotCQkJaWYgKGZEb2N1bWVudCBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjQpIHsKLQkJCQkoKElEb2N1bWVudEV4dGVuc2lvbjQpIGZEb2N1bWVudCkucmVtb3ZlRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyKGZEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0KLQkJZkRvY3VtZW50ID0gZG9jOwotCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKGZEb2N1bWVudCBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjQpIHsKLQkJCQkoKElEb2N1bWVudEV4dGVuc2lvbjQpIGZEb2N1bWVudCkuYWRkRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyKGZEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIpOwotCQkJfQotCQkJLy8gaG9vayB1cCBuZXcgZG9jdW1lbnQgbGlzdGVuZXIKLQkJCWZEb2N1bWVudC5hZGREb2N1bWVudExpc3RlbmVyKGZEb2N1bWVudExpc3RlbmVyKTsKLQkJfQotCQkKLQkJc2V0RW50aXJlRG9jdW1lbnREaXJ0eShkb2MpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRvY3VtZW50IHBhcnRpdGlvbmluZyBmb3IgdGhpcyByZWNvbmNpbGVyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJ0aXRpb25pbmcKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBwYXJ0aXRpb25pbmcgZm9yIHRoaXMgcmVjb25jaWxlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50UGFydGl0aW9uaW5nKFN0cmluZyBwYXJ0aXRpb25pbmcpIHsKLQkJZlBhcnRpdGlvbmluZyA9IHBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiBCYXNpY2FsbHkgbWVhbnMgcHJvY2VzcyB0aGUgZW50aXJlIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEVudGlyZURvY3VtZW50RGlydHkoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0KLQkJLy8gbWFrZSB0aGUgZW50aXJlIGRvY3VtZW50IGRpcnR5Ci0JCS8vIHRoaXMgYWxzbyBoYXBwZW5zIG9uIGEgInNhdmUgYXMiCi0JCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGlzSW5zdGFsbGVkKCkpIHsKLQotCQkJLy8gc2luY2Ugd2UncmUgbWFya2luZyB0aGUgZW50aXJlIGRvYyBkaXJ0eQotCQkJZmx1c2hEaXJ0eVJlZ2lvblF1ZXVlKCk7Ci0KLQkJCS8qKgotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE5OTA1MwotCQkJICogCi0JCQkgKiBQcm9jZXNzIHRoZSBzdHJhdGVnaWVzIGZvciB0aGUgbGFzdCBrbm93bi1nb29kIHBhcnRpdGlvbnMgdG8KLQkJCSAqIGVuc3VyZSBhbGwgcHJvYmxlbSBhbm5vdGF0aW9ucyBhcmUgY2xlYXJlZCBpZiBuZWVkZWQuCi0JCQkgKi8KLQkJCWlmIChmTGFzdFBhcnRpdGlvbnMgIT0gbnVsbCAmJiBkb2N1bWVudC5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmTGFzdFBhcnRpdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSVJlY29uY2lsaW5nU3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRSZWNvbmNpbGluZ1N0cmF0ZWd5KGZMYXN0UGFydGl0aW9uc1tpXS5nZXRUeXBlKCkpOwotCQkJCQlpZiAoc3RyYXRlZ3kgIT0gbnVsbCkgewotCQkJCQkJc3RyYXRlZ3kucmVjb25jaWxlKGZMYXN0UGFydGl0aW9uc1tpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlEaXJ0eVJlZ2lvbiBlbnRpcmVEb2N1bWVudCA9IGNyZWF0ZURpcnR5UmVnaW9uKDAsIGRvY3VtZW50LmdldExlbmd0aCgpLCBEaXJ0eVJlZ2lvbi5JTlNFUlQpOwotCQkJCXByb2Nlc3NEaXJ0eVJlZ2lvbihlbnRpcmVEb2N1bWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXNJbnN0YWxsZWQKLQkgKiAgICAgICAgICAgIFRoZSBpc0luc3RhbGxlZCB0byBzZXQuCi0JICovCi0Jdm9pZCBzZXRJbnN0YWxsZWQoYm9vbGVhbiBpc0luc3RhbGxlZCkgewotCQlmSXNJbnN0YWxsZWQgPSBpc0luc3RhbGxlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWNvbmNpbGluZ1N0cmF0ZWd5KFN0cmluZyBwYXJ0aXRpb25UeXBlLCBJUmVjb25jaWxpbmdTdHJhdGVneSBzdHJhdGVneSkgewotCQlpZiAocGFydGl0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlpZiAoc3RyYXRlZ3kgPT0gbnVsbCkgewotCQkJZlJlY29uY2lsaW5nU3RyYXRlZ2llcy5yZW1vdmUocGFydGl0aW9uVHlwZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmUmVjb25jaWxpbmdTdHJhdGVnaWVzLnB1dChwYXJ0aXRpb25UeXBlLCBzdHJhdGVneSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlciN1bmluc3RhbGwoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbCgpIHsKLQkJaWYgKGlzSW5zdGFsbGVkKCkpIHsKLQkJCS8vIHJlbW92ZXMgd2lkZ2V0IGxpc3RlbmVyCi0JCQlnZXRUZXh0Vmlld2VyKCkucmVtb3ZlVGV4dElucHV0TGlzdGVuZXIoZlRleHRJbnB1dExpc3RlbmVyKTsKLQkJCXNldEluc3RhbGxlZChmYWxzZSk7Ci0JCX0KLQkJc2V0RG9jdW1lbnQobnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9Eb2N1bWVudEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvRG9jdW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNTU3NDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9Eb2N1bWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxhYmxlTW9kZWw7Ci0KLS8qKgotICogQWRhcHRzIGFuIDxjb2RlPklEb2N1bWVudDwvY29kZT4gdG8gYSA8Y29kZT5JUmVjb25jaWxhYmxlTW9kZWw8L2NvZGU+LgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudEFkYXB0ZXIgaW1wbGVtZW50cyBJUmVjb25jaWxhYmxlTW9kZWwgewotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRleHQgbW9kZWwgYWRhcHRlciBmb3IgdGhlIGdpdmVuIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBEb2N1bWVudEFkYXB0ZXIoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBtb2RlbCdzIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZGVsJ3MgaW5wdXQgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvRG9jdW1lbnRSZWdpb25Qcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvRG9jdW1lbnRSZWdpb25Qcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ4OGRmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0RvY3VtZW50UmVnaW9uUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3IuVmFsaWRhdG9yQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3IuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yLlZhbGlkYXRvclN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc3BlbGxpbmcuU3BlbGxjaGVja1N0cmF0ZWd5OwotCi0vKioKLSAqIEFkZHMgdG8gRGlydHlSZWdpb25Qcm9jZXNzb3IgSm9iOiAtIElEb2N1bWVudExpc3RlbmVyIC0gVmFsaWRhdG9yU3RyYXRlZ3kgLQotICogVGV4dCB2aWV3ZXIoZGlzcG9zZSwgaW5wdXQgY2hhbmdlZCkgbGlzdGVuZXJzLiAtIGRlZmF1bHQsIHNwZWxsaW5nLCBhbmQKLSAqIHZhbGlkYXRvciBzdHJhdGVnaWVzIC0gRGlydHlSZWdpb24gcHJvY2Vzc2luZyBsb2dpYy4KLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50UmVnaW9uUHJvY2Vzc29yIGV4dGVuZHMgRGlydHlSZWdpb25Qcm9jZXNzb3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19WQUxJREFUT1JTID0gQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWNvbmNpbGVyVmFsaWRhdG9ycyIpKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBzdHJhdGVneSB0byB1c2UgdGhlIGRlZmluZWQgZGVmYXVsdCBTcGVsbGluZyBzZXJ2aWNlLgotCSAqLwotCXByaXZhdGUgSVJlY29uY2lsaW5nU3RyYXRlZ3kgZlNwZWxsY2hlY2tTdHJhdGVneTsKLQotCS8qKgotCSAqIFRoZSBzdHJhdGVneSB0aGF0IHJ1bnMgdmFsaWRhdG9ycyBjb250cmlidXRlZCB2aWEKLQkgKiA8Y29kZT5vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbnMuc291cmNldmFsaWRhdGlvbjwvY29kZT4KLQkgKiBleHRlbnNpb24gcG9pbnQKLQkgKi8KLQlwcml2YXRlIFZhbGlkYXRvclN0cmF0ZWd5IGZWYWxpZGF0b3JTdHJhdGVneTsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIFNTRV9VSV9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwcm90ZWN0ZWQgdm9pZCBiZWdpblByb2Nlc3NpbmcoKSB7Ci0JCXN1cGVyLmJlZ2luUHJvY2Vzc2luZygpOwotCQlWYWxpZGF0b3JTdHJhdGVneSB2YWxpZGF0b3JTdHJhdGVneSA9IGdldFZhbGlkYXRvclN0cmF0ZWd5KCk7Ci0JCWlmICh2YWxpZGF0b3JTdHJhdGVneSAhPSBudWxsKSB7Ci0JCQl2YWxpZGF0b3JTdHJhdGVneS5iZWdpblByb2Nlc3NpbmcoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZFByb2Nlc3NpbmcoKSB7Ci0JCXN1cGVyLmVuZFByb2Nlc3NpbmcoKTsKLQkJVmFsaWRhdG9yU3RyYXRlZ3kgdmFsaWRhdG9yU3RyYXRlZ3kgPSBnZXRWYWxpZGF0b3JTdHJhdGVneSgpOwotCQlpZiAodmFsaWRhdG9yU3RyYXRlZ3kgIT0gbnVsbCkgewotCQkJdmFsaWRhdG9yU3RyYXRlZ3kuZW5kUHJvY2Vzc2luZygpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZShJRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBjb250ZW50VHlwZUlkID0gbnVsbDsKLQotCQlJQ29udGVudFR5cGUgY3QgPSBudWxsOwotCQl0cnkgewotCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0RGVzY3JpcHRpb25Gb3IobmV3IFN0cmluZ1JlYWRlcihkb2MuZ2V0KCkpLCBudWxsLCBJQ29udGVudERlc2NyaXB0aW9uLkFMTCk7Ci0JCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJY3QgPSBkZXNjLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJaWYgKGN0ICE9IG51bGwpCi0JCQkJCWNvbnRlbnRUeXBlSWQgPSBjdC5nZXRJZCgpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBqdXN0IGJhaWwKLQkJfQotCQlyZXR1cm4gY29udGVudFR5cGVJZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVJlY29uY2lsaW5nU3RyYXRlZ3kgZ2V0U3BlbGxjaGVja1N0cmF0ZWd5KCkgewotCQlpZiAoZlNwZWxsY2hlY2tTdHJhdGVneSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgY29udGVudFR5cGVJZCA9IGdldENvbnRlbnRUeXBlKGdldERvY3VtZW50KCkpOwotCQkJaWYgKGNvbnRlbnRUeXBlSWQgIT0gbnVsbCkgewotCQkJCWlmIChnZXRUZXh0Vmlld2VyKCkgaW5zdGFuY2VvZiBJU291cmNlVmlld2VyKSB7Ci0JCQkJCUlTb3VyY2VWaWV3ZXIgdmlld2VyID0gKElTb3VyY2VWaWV3ZXIpIGdldFRleHRWaWV3ZXIoKTsKLQkJCQkJZlNwZWxsY2hlY2tTdHJhdGVneSA9IG5ldyBTcGVsbGNoZWNrU3RyYXRlZ3kodmlld2VyLCBjb250ZW50VHlwZUlkKTsKLQkJCQkJZlNwZWxsY2hlY2tTdHJhdGVneS5zZXREb2N1bWVudChnZXREb2N1bWVudCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZTcGVsbGNoZWNrU3RyYXRlZ3k7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBWYWxpZGF0b3JTdHJhdGVneS4KLQkgKi8KLQlwcm90ZWN0ZWQgVmFsaWRhdG9yU3RyYXRlZ3kgZ2V0VmFsaWRhdG9yU3RyYXRlZ3koKSB7Ci0JCWlmIChmVmFsaWRhdG9yU3RyYXRlZ3kgPT0gbnVsbCkgewotCQkJVmFsaWRhdG9yU3RyYXRlZ3kgdmFsaWRhdG9yU3RyYXRlZ3kgPSBudWxsOwotCi0JCQlpZiAoZ2V0VGV4dFZpZXdlcigpIGluc3RhbmNlb2YgSVNvdXJjZVZpZXdlcikgewotCQkJCUlTb3VyY2VWaWV3ZXIgdmlld2VyID0gKElTb3VyY2VWaWV3ZXIpIGdldFRleHRWaWV3ZXIoKTsKLQkJCQlTdHJpbmcgY29udGVudFR5cGVJZCA9IG51bGw7Ci0KLQkJCQlJRG9jdW1lbnQgZG9jID0gdmlld2VyLmdldERvY3VtZW50KCk7Ci0JCQkJY29udGVudFR5cGVJZCA9IGdldENvbnRlbnRUeXBlKGRvYyk7Ci0KLQkJCQlpZiAoY29udGVudFR5cGVJZCAhPSBudWxsKSB7Ci0JCQkJCXZhbGlkYXRvclN0cmF0ZWd5ID0gbmV3IFZhbGlkYXRvclN0cmF0ZWd5KHZpZXdlciwgY29udGVudFR5cGVJZCk7Ci0JCQkJCVZhbGlkYXRvckJ1aWxkZXIgdkJ1aWxkZXIgPSBuZXcgVmFsaWRhdG9yQnVpbGRlcigpOwotCQkJCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHZtZHMgPSB2QnVpbGRlci5nZXRWYWxpZGF0b3JNZXRhRGF0YShTU0VfVUlfSUQpOwotCQkJCQlMaXN0IGVuYWJsZWRWYWxpZGF0b3JzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCQkJLyogaWYgYW55ICJtdXN0IiBoYW5kbGUgdGhpcyBjb250ZW50IHR5cGUsIGp1c3QgYWRkIHRoZW0gKi8KLQkJCQkJYm9vbGVhbiBmb3VuZFNwZWNpZmljQ29udGVudFR5cGVWYWxpZGF0b3JzID0gZmFsc2U7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdm1kcy5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKHZtZHNbaV0ubXVzdEhhbmRsZUNvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWQpKSB7Ci0JCQkJCQkJaWYgKERFQlVHX1ZBTElEQVRPUlMpCi0JCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGNvbnRlbnRUeXBlSWQgKyAiIHVzaW5nIHNwZWNpZmljIHZhbGlkYXRvciAiICsgdm1kc1tpXS5nZXRWYWxpZGF0b3JJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWZvdW5kU3BlY2lmaWNDb250ZW50VHlwZVZhbGlkYXRvcnMgPSB0cnVlOwotCQkJCQkJCWVuYWJsZWRWYWxpZGF0b3JzLmFkZCh2bWRzW2ldKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIWZvdW5kU3BlY2lmaWNDb250ZW50VHlwZVZhbGlkYXRvcnMpIHsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdm1kcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWlmICh2bWRzW2ldLmNhbkhhbmRsZUNvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWQpKSB7Ci0JCQkJCQkJCWlmIChERUJVR19WQUxJREFUT1JTKQotCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgY29udGVudFR5cGVJZCArICIgdXNpbmcgaW5oZXJpdGVkKD8pIHZhbGlkYXRvciAiICsgdm1kc1tpXS5nZXRWYWxpZGF0b3JJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQllbmFibGVkVmFsaWRhdG9ycy5hZGQodm1kc1tpXSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW5hYmxlZFZhbGlkYXRvcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCXZhbGlkYXRvclN0cmF0ZWd5LmFkZFZhbGlkYXRvck1ldGFEYXRhKChWYWxpZGF0b3JNZXRhRGF0YSkgZW5hYmxlZFZhbGlkYXRvcnMuZ2V0KGkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZWYWxpZGF0b3JTdHJhdGVneSA9IHZhbGlkYXRvclN0cmF0ZWd5OwotCQl9Ci0JCXJldHVybiBmVmFsaWRhdG9yU3RyYXRlZ3k7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRpcnR5UmVnaW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2VzcyhEaXJ0eVJlZ2lvbiBkaXJ0eVJlZ2lvbikgewotCQlpZiAoIWlzSW5zdGFsbGVkKCkgfHwgaXNJblJld3JpdGVTZXNzaW9uKCkpCi0JCQlyZXR1cm47Ci0KLQkJc3VwZXIucHJvY2VzcyhkaXJ0eVJlZ2lvbik7Ci0KLQkJLy8gQWxzbyBjYWxsIHRoZSB2YWxpZGF0aW9uIGFuZCBzcGVsbC1jaGVjayBzdHJhdGVnaWVzCi0JCUlUeXBlZFJlZ2lvbltdIHBhcnRpdGlvbnMgPSBjb21wdXRlUGFydGl0aW9uaW5nKGRpcnR5UmVnaW9uKTsKLQotCQlEaXJ0eVJlZ2lvbiBkaXJ0eSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJLy8gW3NvdXJjZV12YWxpZGF0b3IgKGV4dGVuc2lvbikgZm9yIHRoaXMgcGFydGl0aW9uCi0JCQlpZiAoZ2V0VmFsaWRhdG9yU3RyYXRlZ3koKSAhPSBudWxsKSB7Ci0JCQkJZGlydHkgPSBjcmVhdGVEaXJ0eVJlZ2lvbihwYXJ0aXRpb25zW2ldLCBEaXJ0eVJlZ2lvbi5JTlNFUlQpOwotCQkJCWdldFZhbGlkYXRvclN0cmF0ZWd5KCkucmVjb25jaWxlKHBhcnRpdGlvbnNbaV0sIGRpcnR5KTsKLQkJCX0KLQkJfQotCi0JCS8vIHNpbmdsZSBzcGVsbC1jaGVjayBmb3IgZXZlcnl0aGluZwotCQlpZiAoZ2V0U3BlbGxjaGVja1N0cmF0ZWd5KCkgIT0gbnVsbCkgewotCQkJZ2V0U3BlbGxjaGVja1N0cmF0ZWd5KCkucmVjb25jaWxlKGRpcnR5UmVnaW9uLCBkaXJ0eVJlZ2lvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyLnNldERvY3VtZW50KGRvYyk7Ci0JCUlSZWNvbmNpbGluZ1N0cmF0ZWd5IHZhbGlkYXRvclN0cmF0ZWd5ID0gZ2V0VmFsaWRhdG9yU3RyYXRlZ3koKTsKLQkJaWYgKHZhbGlkYXRvclN0cmF0ZWd5ICE9IG51bGwpIHsKLQkJCXZhbGlkYXRvclN0cmF0ZWd5LnNldERvY3VtZW50KGRvYyk7Ci0JCX0KLQkJaWYgKGZTcGVsbGNoZWNrU3RyYXRlZ3kgIT0gbnVsbCkgewotCQkJZlNwZWxsY2hlY2tTdHJhdGVneS5zZXREb2N1bWVudChkb2MpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW50aXJlRG9jdW1lbnREaXJ0eShJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc3VwZXIuc2V0RW50aXJlRG9jdW1lbnREaXJ0eShkb2N1bWVudCk7Ci0KLQkJLy8gbWFrZSB0aGUgZW50aXJlIGRvY3VtZW50IGRpcnR5Ci0JCS8vIHRoaXMgYWxzbyBoYXBwZW5zIG9uIGEgInNhdmUgYXMiCi0JCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGlzSW5zdGFsbGVkKCkgJiYgZkxhc3RQYXJ0aXRpb25zICE9IG51bGwgJiYgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJLyoqCi0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTk5MDUzCi0JCQkgKiAKLQkJCSAqIFByb2Nlc3MgdGhlIHN0cmF0ZWdpZXMgZm9yIHRoZSBsYXN0IGtub3duLWdvb2QgcGFydGl0aW9ucy4KLQkJCSAqLwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmTGFzdFBhcnRpdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlWYWxpZGF0b3JTdHJhdGVneSB2YWxpZGF0b3JTdHJhdGVneSA9IGdldFZhbGlkYXRvclN0cmF0ZWd5KCk7Ci0JCQkJaWYgKHZhbGlkYXRvclN0cmF0ZWd5ICE9IG51bGwpIHsKLQkJCQkJdmFsaWRhdG9yU3RyYXRlZ3kucmVjb25jaWxlKGZMYXN0UGFydGl0aW9uc1tpXSwgY3JlYXRlRGlydHlSZWdpb24oZkxhc3RQYXJ0aXRpb25zW2ldLCBEaXJ0eVJlZ2lvbi5SRU1PVkUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZlNwZWxsY2hlY2tTdHJhdGVneSAhPSBudWxsKSB7Ci0JCQkJZlNwZWxsY2hlY2tTdHJhdGVneS5yZWNvbmNpbGUobmV3IFJlZ2lvbigwLCBkb2N1bWVudC5nZXRMZW5ndGgoKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5EaXJ0eVJlZ2lvblByb2Nlc3NvciN1bmluc3RhbGwoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbCgpIHsKLQkJaWYgKGlzSW5zdGFsbGVkKCkpIHsKLQotCQkJY2FuY2VsKCk7Ci0KLQkJCUlSZWNvbmNpbGluZ1N0cmF0ZWd5IHZhbGlkYXRvclN0cmF0ZWd5ID0gZ2V0VmFsaWRhdG9yU3RyYXRlZ3koKTsKLQotCQkJaWYgKHZhbGlkYXRvclN0cmF0ZWd5ICE9IG51bGwpIHsKLQkJCQlpZiAodmFsaWRhdG9yU3RyYXRlZ3kgaW5zdGFuY2VvZiBJUmVsZWFzYWJsZSkKLQkJCQkJKChJUmVsZWFzYWJsZSkgdmFsaWRhdG9yU3RyYXRlZ3kpLnJlbGVhc2UoKTsKLQkJCX0KLQkJCWlmIChmU3BlbGxjaGVja1N0cmF0ZWd5ICE9IG51bGwpIHsKLQkJCQlmU3BlbGxjaGVja1N0cmF0ZWd5LnNldERvY3VtZW50KG51bGwpOwotCQkJfQotCQl9Ci0JCXN1cGVyLnVuaW5zdGFsbCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvSUNvbmZpZ3VyYWJsZVJlY29uY2lsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvSUNvbmZpZ3VyYWJsZVJlY29uY2lsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY4YjI4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0lDb25maWd1cmFibGVSZWNvbmNpbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5OwotCi0vKioKLSAqIEEgcmVjb25jaWxlciB0aGF0IGFsbG93cyBJUmVjb25jaWxpbmdTdHJhdGVnaWVzIHRvIGJlIGFzc2lnbmVkIHRvIHBhcnRpdGlvbgotICogdHlwZXMuIFRoZSByZWNvbmNpbGVyIHdpbGwgY2FsbCB0aGUgcmVnaXN0ZXJlZCBJUmVjb25jaWxpbmdTdHJhdGVneSB3aGVuCi0gKiBkaXJ0eSByZWdpb25zIHdoaWNoIGNvbnRhaW4gcGFydGl0aW9ucyBvZiBhIHNwZWNpZmljIHR5cGUgbmVlZCB0byBiZQotICogcmVjb25jaWxlZC4KLSAqIAotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmFibGVSZWNvbmNpbGVyIHsKLQkvKioKLQkgKiBTZXRzIHRoZSByZWNvbmNpbGluZyBzdHJhdGVneSBmb3IgdGhlIHJlY29uY2lsZXIgdG8gdXNlIGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgY29udGVudCB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlCi0JICogICAgICAgICAgICB0aGUgcGFydGl0aW9uIHR5cGUKLQkgKiBAcGFyYW0gc3RyYXRlZ3kKLQkgKiAgICAgICAgICAgIHRoZSByZWNvbmNpbGluZyBzdHJhdGVneQotCSAqLwotCXZvaWQgc2V0UmVjb25jaWxpbmdTdHJhdGVneShTdHJpbmcgcGFydGl0aW9uVHlwZSwgSVJlY29uY2lsaW5nU3RyYXRlZ3kgc3RyYXRlZ3kpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9JUmVjb25jaWxlQW5ub3RhdGlvbktleS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9JUmVjb25jaWxlQW5ub3RhdGlvbktleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2IwMmIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvSVJlY29uY2lsZUFubm90YXRpb25LZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlU3RlcDsKLQotLyoqCi0gKiBEZWZpbmVzIGFuIGFubm90YXRpb24ga2V5IHRoYXQgdGhlCi0gKiA8Y29kZT5BYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneTwvY29kZT4ga25vd3MgaG93IHRvCi0gKiByZW1vdmUgYXBwcm9wcmlhdGVseS4KLSAqIAotICogQGRlcHJlY2F0ZWQgbm90IEFQSSwgdGhpcyB3aWxsIHByb2JhYmx5IGp1c3QgYmVjb21lIGFuIGFic3RyYWN0IGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlY29uY2lsZUFubm90YXRpb25LZXkgewotCXN0YXRpYyBmaW5hbCBpbnQgUEFSVElBTCA9IDE7Ci0Jc3RhdGljIGZpbmFsIGludCBUT1RBTCA9IDA7Ci0KLQlTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZSgpOwotCi0JLy9pbnQgZ2V0U2NvcGUoKTsKLQotCUlSZWNvbmNpbGVTdGVwIGdldFN0ZXAoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvSVN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0lTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTFiYzk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvSVN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLkRpcnR5UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlU3RlcDsKLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICogQGRlcHJlY2F0ZWQgc3RpbGwgd29ya2luZyBvdXQgQVBJIChvciBpZiBhbnl0aGluZyBoZXJlIHNob3VsZCBiZSBBUEkpCi0gKiAKLSAqIEludGVyZmFjZSBmb3IgYSBzdGVwIGluIFN0cnVjdHVyZWRSZWdpb25Qcm9jZXNzb3IgZnJhbWV3b3JrLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcCBleHRlbmRzIElSZWNvbmNpbGVTdGVwIHsKLQkvKioKLQkgKiBQYXJ0aXRpb25zIGZvciB3aGljaCB0aGlzIHN0ZXAgY2FuIGFkZC9yZW1vdmUgYW5ub3Rpb25zCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgcGFydGl0aW9ucyBmb3Igd2hpY2ggdGhpcyBzdGVwIGNhbiBhZGQvcmVtb3ZlCi0JICogICAgICAgICBhbm5vdGlvbnMKLQkgKi8KLQlTdHJpbmdbXSBnZXRQYXJ0aXRpb25UeXBlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2NvcGUgZm9yIHdoaWNoIHRoaXMgc3RlcCBhZGRzIGFubm90YXRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNjb3BlIGZvciB3aGljaCB0aGlzIHN0ZXAgYWRkcyBhbm5vdGF0aW9ucwotCSAqLwotCS8vaW50IGdldFNjb3BlKCk7Ci0KLQkvKioKLQkgKiBUZWxscyB5b3UgaWYgdGhlIHN0ZXAgaXMgZXF1YWwgdG8gdGhpcyBzdGVwIG9yIGFueSBvZiB0aGUgc2libGluZwotCSAqIHN0ZXBzLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGlzU2libGluZ1N0ZXAoSVJlY29uY2lsZVN0ZXAgc3RlcCk7Ci0KLQkvKioKLQkgKiBBZGRzIGF3YXJlbmVzcyB0aGF0IHRoZSBSZWNvbmNpbGVyIGlzIHJlY29uY2lsaW5nIHRoZSBlbnRpcmUgZG9jdW1lbnQKLQkgKiB0aGlzIGNhbGwuCi0JICogCi0JICogQHBhcmFtIGRpcnR5UmVnaW9uCi0JICogQHBhcmFtIHN1YlJlZ2lvbgotCSAqIEBwYXJhbSByZWZyZXNoQWxsCi0JICogQHJldHVybgotCSAqLwotCUlSZWNvbmNpbGVSZXN1bHRbXSByZWNvbmNpbGUoRGlydHlSZWdpb24gZGlydHlSZWdpb24sIElSZWdpb24gc3ViUmVnaW9uLCBib29sZWFuIHJlZnJlc2hBbGwpOwotCi0JLyoqCi0JICogVXNlZCB0byByZXNldCB0aGUgc3RhdGUgb2YgdGhlIFN0cmF0ZWd5LiBGb3IgZXhhbXBsZTogYW55IGZsYWdzIHRoYXQKLQkgKiBuZWVkIHRvIGJlIHJlc2V0IGFmdGVyIGEgbG9uZyBydW5uaW5nIG9wZXJhdGlvbiBsaWtlIHByb2Nlc3NBbGwoKS4KLQkgKi8KLQl2b2lkIHJlc2V0KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0lTdHJ1Y3R1cmVkUmVjb25jaWxpbmdTdHJhdGVneS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9JU3RydWN0dXJlZFJlY29uY2lsaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIwMmY4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0lTdHJ1Y3R1cmVkUmVjb25jaWxpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsaW5nU3RyYXRlZ3k7Ci0KLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIHN0cnVjdHVyZWQgcmVjb25jaWxpbmcgc3RyYXRlZ2llcy4KLSAqIAotICogQGRlcHJlY2F0ZWQgZG9lc24ndCBuZWVkIHRvIGJlIEFQSSBhbmQgbWlnaHQgZ28gYXdheQotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkUmVjb25jaWxpbmdTdHJhdGVneSBleHRlbmRzIElSZWNvbmNpbGluZ1N0cmF0ZWd5IHsKLQkvKioKLQkgKiBBZGRzIGF3YXJlbmVzcyB0aGF0IHRoZSByZWNvbmNpbGVyIGlzIHByb2Nlc3NpbmcgdGhlIGVudGlyZSBkb2N1bWVudAotCSAqIHZpYSByZWZyZXNoQWxsIGZsYWcuCi0JICogCi0JICogQHBhcmFtIGRpcnR5UmVnaW9uCi0JICogQHBhcmFtIHN1YlJlZ2lvbgotCSAqIEBwYXJhbSByZWZyZXNoQWxsCi0JICovCi0JcHVibGljIHZvaWQgcmVjb25jaWxlKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uLCBJUmVnaW9uIHN1YlJlZ2lvbiwgYm9vbGVhbiByZWZyZXNoQWxsKTsKLQotCS8qKgotCSAqIFVzZWQgdG8gcmVzZXQgdGhlIHN0YXRlIG9mIHRoZSBTdHJhdGVneS4gRm9yIGV4YW1wbGU6IGFueSBmbGFncyB0aGF0Ci0JICogbmVlZCB0byBiZSByZXNldCBhZnRlciBhIGxvbmcgcnVubmluZyBvcGVyYXRpb24gbGlrZSBwcm9jZXNzQWxsKCkuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvUmVjb25jaWxlQW5ub3RhdGlvbktleS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9SZWNvbmNpbGVBbm5vdGF0aW9uS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5Mjg0YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9SZWNvbmNpbGVBbm5vdGF0aW9uS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVN0ZXA7Ci0KLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5JUmVjb25jaWxlQW5ub3RhdGlvbktleTwvY29kZT4gbm90ZTogY2xpZW50cwotICogc2hvdWxkIHVzZSB0aGUgbWV0aG9kIFN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwI2NyZWF0ZUtleShTdHJpbmcKLSAqIHBhcnRpdGlvblR5cGUsIGludCBzY29wZSkKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIFJlY29uY2lsZUFubm90YXRpb25LZXkgewotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlRJQUwgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPVEFMID0gMDsKLSAgICAKLQlwcml2YXRlIFN0cmluZyBmUGFydGl0aW9uVHlwZSA9IG51bGw7Ci0KLQlwcml2YXRlIElSZWNvbmNpbGVTdGVwIGZSZWNvbmNpbGVTdGVwID0gbnVsbDsKLQlwcml2YXRlIGludCBmU2NvcGU7Ci0KLQlwdWJsaWMgUmVjb25jaWxlQW5ub3RhdGlvbktleShJUmVjb25jaWxlU3RlcCBzdGVwLCBTdHJpbmcgcGFydGl0aW9uVHlwZSwgaW50IHNjb3BlKSB7Ci0JCWZSZWNvbmNpbGVTdGVwID0gc3RlcDsKLQkJZlBhcnRpdGlvblR5cGUgPSBwYXJ0aXRpb25UeXBlOwotCQlmU2NvcGUgPSBzY29wZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoKSB7Ci0JCXJldHVybiBmUGFydGl0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNjb3BlKCkgewotCQlyZXR1cm4gZlNjb3BlOwotCX0KLQotCXB1YmxpYyBJUmVjb25jaWxlU3RlcCBnZXRTdGVwKCkgewotCQlyZXR1cm4gZlJlY29uY2lsZVN0ZXA7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKSArICJcclxuaWQ6ICIgKyBmUGFydGl0aW9uVHlwZTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvU3RydWN0dXJlZFJlY29uY2lsZVN0ZXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvU3RydWN0dXJlZFJlY29uY2lsZVN0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ4YjBiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL1N0cnVjdHVyZWRSZWNvbmNpbGVTdGVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuQWJzdHJhY3RSZWNvbmNpbGVTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsYWJsZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLQotCi0vKioKLSAqIFJlY29uY2lsZVN0ZXAgdGhhdCBrbm93cyBhYm91dCB0aGUgYW5ub3RhdGlvbiB0aGF0IGl0IGFkZHMgdG8gdGhlCi0gKiBBbm5vdGF0aW9uTW9kZWwuIEl0IGtub3dzIGhvdyB0byBjcmVhdGUgYW4gYW5ub3RhdGlvbiBrZXkgKGZvciBzbWFydAotICogcmVtb3ZhbCBsYXRlcikgSXQga25vd3MgdGhlIHBhcnRpdGlvbiB0eXBlcyBvbiB3aGljaCBpdCBjYW4gb3BlcmF0ZS4gSXQKLSAqIGtub3dzIHRoZSBzY29wZSBvbiB3aGljaCBpdCBvcGVyYXRlcyAoZm9yIHNob3J0IGNpcmN1aXRpbmcpIEl0IGtub3dzIGlmIHRoZQotICogUmVjb25jaWxlciBpcyByZWNvbmNpbGluZyB0aGUgZW50aXJlIGRvY3VtZW50LgotICogCi0gKiBDbGllbnRzIG11c3Qgc3ViY2xhc3MgdGhpcyBjbGFzcy4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwIGV4dGVuZHMgQWJzdHJhY3RSZWNvbmNpbGVTdGVwIGltcGxlbWVudHMgSVJlbGVhc2FibGUgewotCi0JLyoqIGRlYnVnIGZsYWcgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvZGVidWcvcmVjb25jaWxlcmpvYiIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSVJlY29uY2lsZVJlc3VsdFtdIEVNUFRZX1JFQ09OQ0lMRV9SRVNVTFRfU0VUID0gbmV3IElSZWNvbmNpbGVSZXN1bHRbMF07Ci0JCi0JLyoqCi0JICogSXQncyBwb3NzaWJsZSBmb3IgYSBwYXJ0aWFsIHN0ZXAgdG8gZ2V0IGNhbGxlZCBvbiB0aGUgc2FtZSBhcmVhIHR3aWNlCi0JICogKGFzIHcvIGEgZnVsbCBkb2N1bWVudCByZWNvbmNpbGUpIHRoaXMgbGlzdCBrZWVwcyB0cmFjayBvZiBhcmVhIGFscmVhZHkKLQkgKiBjb3ZlcmVkLiBTaG91bGQgYmUgcmVzZXQoKSBhZnRlciB0aGUgImJhdGNoIiBvZiByZWNvbmNpbGluZyBpcwotCSAqIGZpbmlzaGVkLgotCSAqLwotCXByaXZhdGUgSGFzaFNldCBmUGFydGl0aW9uVHlwZXMgPSBudWxsOwotCi0JcHVibGljIFN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwKCkgewotCQlzdXBlcigpOwotCQlmUGFydGl0aW9uVHlwZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCXB1YmxpYyBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5IGNyZWF0ZUtleShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uLCBpbnQgc2NvcGUpIHsKLQotCQlJVHlwZWRSZWdpb24gdHIgPSBnZXRQYXJ0aXRpb24oc2RSZWdpb24pOwotCQlTdHJpbmcgcGFydGl0aW9uVHlwZSA9ICh0ciAhPSBudWxsKSA/IHRyLmdldFR5cGUoKSA6IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTjsKLQkJcmV0dXJuIGNyZWF0ZUtleShwYXJ0aXRpb25UeXBlLCBzY29wZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNkUmVnaW9uCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJVHlwZWRSZWdpb24gZ2V0UGFydGl0aW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJSVR5cGVkUmVnaW9uIHRyID0gbnVsbDsKLQkJaWYgKCFzZFJlZ2lvbi5pc0RlbGV0ZWQoKSkKLQkJCXRyID0gZ2V0UGFydGl0aW9uKHNkUmVnaW9uLmdldFBhcmVudERvY3VtZW50KCksIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQlyZXR1cm4gdHI7Ci0JfQotCi0JcHJpdmF0ZSBJVHlwZWRSZWdpb24gZ2V0UGFydGl0aW9uKElEb2N1bWVudCBkb2MsIGludCBvZmZzZXQpIHsKLQkJSVR5cGVkUmVnaW9uIHRyID0gbnVsbDsKLQkJLy8gbm90IHN1cmUgd2h5IGRvY3VtZW50IHdvdWxkIGV2ZXIgYmUgbnVsbCwgYnV0IHB1dCBpbiB0aGlzIAotCQkvLyBndWFyZCBmb3IgCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04NjA2OQotCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJdHIgPSBUZXh0VXRpbGl0aWVzLmdldFBhcnRpdGlvbihkb2MsIElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcsIG9mZnNldCwgZmFsc2UpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCWlmIChERUJVRykKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigicHJvYmxlbSBnZXR0aW5nIHBhcnRpdGlvbiBhdDogIiArIG9mZnNldCwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHI7Ci0JfQotCi0JLyoqCi0JICogQ2xpZW50cyBzaG91bGQgdXNlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSBhbm5vdGF0aW9uIGtleXMgYXMgaXQKLQkgKiByZWdpc3RlcnMgdGhlIGtleSBmb3IgcmVtb3ZhbCBsYXRlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFydGl0aW9uVHlwZQotCSAqIEBwYXJhbSBzY29wZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgUmVjb25jaWxlQW5ub3RhdGlvbktleSBjcmVhdGVLZXkoU3RyaW5nIHBhcnRpdGlvblR5cGUsIGludCBzY29wZSkgewotCQlmUGFydGl0aW9uVHlwZXMuYWRkKHBhcnRpdGlvblR5cGUpOwotCQlyZXR1cm4gbmV3IFJlY29uY2lsZUFubm90YXRpb25LZXkodGhpcywgcGFydGl0aW9uVHlwZSwgc2NvcGUpOwotCX0KLQotCXByb3RlY3RlZCBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCUlEb2N1bWVudCBkb2MgPSBudWxsOwotCQlJUmVjb25jaWxhYmxlTW9kZWwgck1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKHJNb2RlbCBpbnN0YW5jZW9mIERvY3VtZW50QWRhcHRlcikgewotCQkJZG9jID0gKChEb2N1bWVudEFkYXB0ZXIpIHJNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gZG9jOwotCX0KLQotCXB1YmxpYyBJUmVjb25jaWxhYmxlTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiBnZXRJbnB1dE1vZGVsKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElEb2N1bWVudCBkb2MsIGludCBvZmZzZXQpIHsKLQkJSVR5cGVkUmVnaW9uIHRyID0gZ2V0UGFydGl0aW9uKGRvYywgb2Zmc2V0KTsKLQkJcmV0dXJuICh0ciAhPSBudWxsKSA/IHRyLmdldFR5cGUoKSA6IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UGFydGl0aW9uVHlwZXMoKSB7Ci0JCS8vIHVzaW5nIGhhc2ggc2V0IHRvIGF1dG9tYXRpY2FsbHkgZ2V0IHJpZCBvZiBkdXBlcwotCQlIYXNoU2V0IHRlbXBSZXN1bHRzID0gbmV3IEhhc2hTZXQoKTsKLQkJLy8gYWRkIHRoZXNlIHBhcnRpdGlvbiB0eXBlcwotCQl0ZW1wUmVzdWx0cy5hZGRBbGwoZlBhcnRpdGlvblR5cGVzKTsKLQkJcmV0dXJuIChTdHJpbmdbXSkgdGVtcFJlc3VsdHMudG9BcnJheShuZXcgU3RyaW5nW3RlbXBSZXN1bHRzLnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzRG9jID0gbnVsbDsKLQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KCk7Ci0JCWlmIChkb2MgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KQotCQkJc0RvYyA9IChJU3RydWN0dXJlZERvY3VtZW50KSBnZXREb2N1bWVudCgpOwotCQlyZXR1cm4gc0RvYzsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGR1cGxpY2F0ZXMuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdHMxCi0JICogQHBhcmFtIHJlc3VsdHMyCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJUmVjb25jaWxlUmVzdWx0W10gbWVyZ2UoSVJlY29uY2lsZVJlc3VsdFtdIHJlc3VsdHMxLCBJUmVjb25jaWxlUmVzdWx0W10gcmVzdWx0czIpIHsKLQkJaWYgKHJlc3VsdHMxID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0czI7Ci0JCWlmIChyZXN1bHRzMiA9PSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdHMxOwotCi0JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChyZXN1bHRzMSkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdHMyLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRzLmFkZChyZXN1bHRzMltpXSk7Ci0JCX0KLQkJcmV0dXJuIChJUmVjb25jaWxlUmVzdWx0W10pIHJlc3VsdHMudG9BcnJheShuZXcgSVJlY29uY2lsZVJlc3VsdFtyZXN1bHRzLnNpemUoKV0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLkFic3RyYWN0UmVjb25jaWxlU3RlcCNyZWNvbmNpbGVNb2RlbChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0JcHJvdGVjdGVkIElSZWNvbmNpbGVSZXN1bHRbXSByZWNvbmNpbGVNb2RlbChEaXJ0eVJlZ2lvbiBkaXJ0eVJlZ2lvbiwgSVJlZ2lvbiBzdWJSZWdpb24pIHsKLQkJcmV0dXJuIEVNUFRZX1JFQ09OQ0lMRV9SRVNVTFRfU0VUOwotCX0KLQotCS8qKgotCSAqIFJlbGVhc2UgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIHN0ZXAgaGVyZSBhcyBuZWVkZWQuIEJlIHN1cmUgdG8gY2FsbAotCSAqIHN1cGVyLnJlbGVhc2UoKSB3aGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyB0byBwcm9wYWdhdGUgdGhlCi0JICogcmVsZWFzZSB0aHJvdWdoIGFsbCBzdGVwcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyAKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL1N0cnVjdHVyZWRSZWdpb25Qcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvU3RydWN0dXJlZFJlZ2lvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGFhMTEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvU3RydWN0dXJlZFJlZ2lvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLk1vZGVsTGlmZWN5Y2xlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExpZmVjeWNsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLS8qKgotICogQW4gSVN0cnVjdHVyZWRNb2RlbCBhd2FyZSBSZWdpb24gUHJvY2Vzc29yLiBBZGRzIE1vZGVsTGlmZWN5Y2xlIGxpc3RlbmVyLgotICogTW9kZWxMaWZlY3ljbGUgbGlzdGVuZXIgbm90aWZpZXMgdXMgdGhhdCBzb21lIHJlaW5pdGlhbGl6YXRpb24gbmVlZHMgdG8KLSAqIHRha2UgcGxhY2UuCi0gKiAKLSAqIE1vZGVsIGF3YXJlICJwcm9jZXNzKCkiIEltcGxlbWVudHMgYSBJbmRleGVkUmVnaW9uLWJhc2VkICJjb250YWlucygpIgotICogbWV0aG9kIHVzaW5nIElTdHJ1Y3R1cmVkTW9kZWwuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRSZWdpb25Qcm9jZXNzb3IgZXh0ZW5kcyBEb2N1bWVudFJlZ2lvblByb2Nlc3NvciB7Ci0KLQljbGFzcyBNb2RlbExpZmVjeWNsZUxpc3RlbmVyIGltcGxlbWVudHMgSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgewotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIjcHJvY2Vzc1Bvc3RNb2RlbEV2ZW50KG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5Nb2RlbExpZmVjeWNsZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJvY2Vzc1Bvc3RNb2RlbEV2ZW50KE1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQpIHsKLQotCQkJLy8gaWYgdW5kZXJseWluZyBTdHJ1Y3R1cmVkRG9jdW1lbnQgY2hhbmdlZCwgbmVlZCB0byByZWNvbm5lY3QgaXQKLQkJCS8vIGhlcmUuLi4KLQkJCS8vIGV4LiBmaWxlIGlzIG1vZGlmaWVkIG91dHNpZGUgdGhlIHdvcmtiZW5jaAotCQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX0RPQ1VNRU5UX0NIQU5HRUQpIHsKLQotCQkJCS8vIGNoZWNrIHRoYXQgaXQncyB0aGlzIG1vZGVsIHRoYXQgY2hhbmdlZAotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgdGhpc01vZGVsID0gZ2V0U3RydWN0dXJlZE1vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLQkJCQl0cnkgewotCQkJCQlpZiAodGhpc01vZGVsICE9IG51bGwgJiYgZXZlbnQuZ2V0TW9kZWwoKS5lcXVhbHModGhpc01vZGVsKSkgewotCi0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHNEb2MgPSBldmVudC5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkUmVnaW9uUHJvY2Vzc29yOiBET0NVTUVOVCBNT0RFTCBDSEFOR0VEIFRPOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzRG9jLmdldCgpKTsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlzZXREb2N1bWVudChzRG9jKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKHRoaXNNb2RlbCAhPSBudWxsKQotCQkJCQkJdGhpc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciNwcm9jZXNzUHJlTW9kZWxFdmVudChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuTW9kZWxMaWZlY3ljbGVFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb2Nlc3NQcmVNb2RlbEV2ZW50KE1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQpIHsKLQotCQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX0RPQ1VNRU5UX0NIQU5HRUQpIHsKLQotCQkJCWZsdXNoRGlydHlSZWdpb25RdWV1ZSgpOwotCQkJCS8vIG5vdGU6IG9sZCBhbm5vdGF0aW9ucyBhcmUgcmVtb3ZlZCB2aWEgdGhlIHN0cmF0ZWdpZXMgb24KLQkJCQkvLyBBYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneSNzZXREb2N1bWVudCguLi4pCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElNb2RlbExpZmVjeWNsZUxpc3RlbmVyIGZMaWZlQ3ljbGVMaXN0ZW5lciA9IG5ldyBNb2RlbExpZmVjeWNsZUxpc3RlbmVyKCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLkRpcnR5UmVnaW9uUHJvY2Vzc29yI2dldE91dGVyUmVnaW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbikKLQkgKi8KLQlwcm90ZWN0ZWQgRGlydHlSZWdpb24gZ2V0T3V0ZXJSZWdpb24oRGlydHlSZWdpb24gcm9vdCwgRGlydHlSZWdpb24gcG9zc2libGUpIHsKLQkJLy8gZmlyc3QgdHJ5IHNpbXBsZSByZWdpb24gY2hlY2sgaWYgb25lIHJlZ2lvbiBjb250YWlucyB0aGUgb3RoZXIKLQkJRGlydHlSZWdpb24gb3V0ZXIgPSBzdXBlci5nZXRPdXRlclJlZ2lvbihyb290LCBwb3NzaWJsZSk7Ci0JCWlmIChvdXRlciA9PSBudWxsKSB7Ci0JCQkvLyBub3cgY29tcGFyZSBub2RlcwotCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBnZXRTdHJ1Y3R1cmVkTW9kZWxGb3JSZWFkKGdldERvY3VtZW50KCkpOwotCQkJdHJ5IHsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiByb290UmVnaW9uID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24ocm9vdC5nZXRPZmZzZXQoKSk7Ci0JCQkJCUluZGV4ZWRSZWdpb24gcG9zc1JlZ2lvbiA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHBvc3NpYmxlLmdldE9mZnNldCgpKTsKLQkJCQkJaWYgKHJvb3RSZWdpb24gIT0gbnVsbCAmJiBwb3NzUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCWludCByb290U3RhcnQgPSByb290UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQlpbnQgcG9zc1N0YXJ0ID0gcG9zc1JlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJLy8gZmlyc3QganVzdCBjaGVjayBpZiByb290cmVnaW9uIHN0YXJ0cyBiZWZvcmUKLQkJCQkJCS8vIHBvc3NyZWdpb24KLQkJCQkJCWlmIChyb290U3RhcnQgPD0gcG9zc1N0YXJ0KSB7Ci0JCQkJCQkJLy8gY2hlY2sgaWYgcG9zc3JlZ2lvbiBpcyBpbnNpZGUgcm9vdHJlZ2lvbgotCQkJCQkJCW91dGVyID0gX2dldE91dGVyUmVnaW9uKHJvb3QsIHBvc3NpYmxlLCBzTW9kZWwsIHJvb3RTdGFydCwgcG9zc1N0YXJ0KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIG90aGVyd2lzZSBpZiByb290cmVnaW9uIGlzIGluc2lkZSBwb3NzcmVnaW9uCi0JCQkJCQkJb3V0ZXIgPSBfZ2V0T3V0ZXJSZWdpb24ocG9zc2libGUsIHJvb3QsIHNNb2RlbCwgcG9zc1N0YXJ0LCByb290U3RhcnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG91dGVyOwotCX0KLQotCS8qKgotCSAqIEFzc3VtZXMgdGhhdCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgcmVnaW9uMSdzIG5vZGUgc3RhcnQgb2Zmc2V0ID49Ci0JICogcmVnaW9uMidzIG5vZGUgc3RhcnQgb2Zmc2V0LiBEZXRlcm1pbmVzIGlmIHJlZ2lvbjEgY29udGFpbnMgcmVnaW9uMiBvcgotCSAqIHZpY2UgdmVyc2EuIFJldHVybnMgcmVnaW9uMSBpZjoKLQkgKiA8dWw+Ci0JICogPGxpPnJlZ2lvbjEncyBub2RlIHJlZ2lvbiA9PSByZWdpb24yJ3Mgbm9kZSByZWdpb248L2xpPgotCSAqIDxsaT5yZWdpb24xJ3Mgbm9kZSByZWdpb24gY29udGFpbnMgcmVnaW9uMidzIG5vZGUgcmVnaW9uPC9saT4KLQkgKiA8L3VsPgotCSAqIFJldHVybnMgcmVnaW9uMiBpZjoKLQkgKiA8dWw+Ci0JICogPGxpPnJlZ2lvbjEncyBub2RlIHJlZ2lvbiBhbmQgcmVnaW9uMidzIG5vZGUgcmVnaW9uIHN0YXJ0cyBhdCBzYW1lCi0JICogb2Zmc2V0IGJ1dCByZWdpb24yJ3Mgbm9kZSByZWdpb24gaXMgbG9uZ2VyPC9saT4KLQkgKiA8L3VsPgotCSAqIFJldHVybnMgbnVsbCBvdGhlcndpc2UuCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbjEKLQkgKiBAcGFyYW0gcmVnaW9uMgotCSAqIEBwYXJhbSBzTW9kZWwKLQkgKiBAcGFyYW0gcmVnaW9uMU5vZGVTdGFydAotCSAqIEBwYXJhbSByZWdpb24yTm9kZVN0YXJ0Ci0JICogQHJldHVybiBvdXRlciBkaXJ0eSByZWdpb24gb3IgbnVsbCBpZiBub25lIGV4aXN0cy4KLQkgKi8KLQlwcml2YXRlIERpcnR5UmVnaW9uIF9nZXRPdXRlclJlZ2lvbihEaXJ0eVJlZ2lvbiByZWdpb24xLCBEaXJ0eVJlZ2lvbiByZWdpb24yLCBJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCwgaW50IHJlZ2lvbjFOb2RlU3RhcnQsIGludCByZWdpb24yTm9kZVN0YXJ0KSB7Ci0JCURpcnR5UmVnaW9uIG91dGVyID0gbnVsbDsKLQkJaW50IHJlZ2lvbjFOb2RlRW5kID0gLTE7Ci0JCWludCByZWdpb24yTm9kZUVuZCA9IC0xOwotCQkvLyB0aGVuIGNoZWNrIGlmIHJlZ2lvbjEncyBlbmQgYXBwZWFycyBhZnRlcgotCQkvLyByZWdpb24yJ3MgZW5kCi0JCUluZGV4ZWRSZWdpb24gcmVnaW9uMUVuZE5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihyZWdpb24xLmdldE9mZnNldCgpICsgcmVnaW9uMS5nZXRMZW5ndGgoKSk7Ci0JCWlmIChyZWdpb24xRW5kTm9kZSA9PSBudWxsKSB7Ci0JCQkvLyBpZiBubyBlbmQsIGp1c3QgYXNzdW1lIHJlZ2lvbiBzcGFucyBhbGwgdGhlCi0JCQkvLyB3YXkgdG8gdGhlIGVuZCBzbyBpdCBpbmNsdWRlcyBvdGhlciByZWdpb24KLQkJCW91dGVyID0gcmVnaW9uMTsKLQkJfQotCQllbHNlIHsKLQkJCXJlZ2lvbjFOb2RlRW5kID0gcmVnaW9uMUVuZE5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlJbmRleGVkUmVnaW9uIHJlZ2lvbjJFbmROb2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24ocmVnaW9uMi5nZXRPZmZzZXQoKSArIHJlZ2lvbjIuZ2V0TGVuZ3RoKCkpOwotCQkJcmVnaW9uMk5vZGVFbmQgPSByZWdpb24yRW5kTm9kZSAhPSBudWxsID8gcmVnaW9uMkVuZE5vZGUuZ2V0RW5kT2Zmc2V0KCkgOiBnZXREb2N1bWVudCgpLmdldExlbmd0aCgpOwotCQkJaWYgKHJlZ2lvbjFOb2RlRW5kID49IHJlZ2lvbjJOb2RlRW5kKSB7Ci0JCQkJLy8gcm9vdCBjb250YWlucyBvciBpcyBlcXVhbCB0byBwb3NzaWJsZQotCQkJCW91dGVyID0gcmVnaW9uMTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvbjFOb2RlU3RhcnQgPT0gcmVnaW9uMk5vZGVTdGFydCAmJiByZWdpb24yTm9kZUVuZCA+PSByZWdpb24xTm9kZUVuZCkgewotCQkJCS8vIHBvc3NpYmxlIGNvbnRhaW5zIHJvb3QgYmVjYXVzZSB0aGV5Ci0JCQkJLy8gYm90aCBzdGFydCBhdCBzYW1lIHBsYWNlIGJ1dCBwb3NzaWJsZQotCQkJCS8vIGlzIGxvbmdlcgotCQkJCW91dGVyID0gcmVnaW9uMjsKLQkJCX0KLQkJfQotCQlpZiAoREVCVUcpIHsKLQkJCWlmIChvdXRlciAhPSBudWxsKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hlY2tpbmcgaWYgWyIgKyByZWdpb24xTm9kZVN0YXJ0ICsgIjoiICsgcmVnaW9uMU5vZGVFbmQgKyAiXSBjb250YWlucyBbIiArIHJlZ2lvbjJOb2RlU3RhcnQgKyAiOiIgKyByZWdpb24yTm9kZUVuZCArICJdIC4uLiAiICsgb3V0ZXIudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJZWxzZQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hlY2tpbmcgaWYgWyIgKyByZWdpb24xTm9kZVN0YXJ0ICsgIjoiICsgcmVnaW9uMU5vZGVFbmQgKyAiXSBjb250YWlucyBbIiArIHJlZ2lvbjJOb2RlU3RhcnQgKyAiOiIgKyByZWdpb24yTm9kZUVuZCArICJdIC4uLiBOTyBDT05UQUlOIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQl9Ci0JCXJldHVybiBvdXRlcjsKLQl9Ci0KLQkvKioKLQkgKiBXZSBhbHJlYWR5IGtub3cgY29udGVudCB0eXBlIGZyb20gd2hlbiB3ZSBjcmVhdGVkIHRoZSBtb2RlbCwgc28ganVzdAotCSAqIHVzZSB0aGF0LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGUoSURvY3VtZW50IGRvYykgewotCi0JCVN0cmluZyBjb250ZW50VHlwZUlkID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2MpOwotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJY29udGVudFR5cGVJZCA9IHNNb2RlbC5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRUeXBlSWQ7Ci0JfQotCi0KLQkvKioKLQkgKiBSZW1lbWJlciB0byByZWxlYXNlIG1vZGVsIGFmdGVyIHVzZSEhCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRTdHJ1Y3R1cmVkTW9kZWxGb3JSZWFkKElEb2N1bWVudCBkb2MpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQlpZiAoZG9jICE9IG51bGwpCi0JCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvYyk7Ci0JCXJldHVybiBzTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGhvb2tVcE1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gZ2V0U3RydWN0dXJlZE1vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCXRyeSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlzTW9kZWwuYWRkTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcihmTGlmZUN5Y2xlTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3MoRGlydHlSZWdpb24gZGlydHlSZWdpb24pIHsKLQkJaWYgKGdldERvY3VtZW50KCkgPT0gbnVsbCB8fCBpc0luUmV3cml0ZVNlc3Npb24oKSkKLQkJCXJldHVybjsKLQotCQkvLyB1c2Ugc3RydWN0dXJlZCBtb2RlbCB0byBkZXRlcm1pbmUgYXJlYSB0byBwcm9jZXNzCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLQkJdHJ5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCWludCBzdGFydCA9IGRpcnR5UmVnaW9uLmdldE9mZnNldCgpOwotCQkJCWludCBlbmQgPSBzdGFydCArIGRpcnR5UmVnaW9uLmdldExlbmd0aCgpOwotCQkJCUluZGV4ZWRSZWdpb24gaXJTdGFydCA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0KTsKLQkJCQlJbmRleGVkUmVnaW9uIGlyRW5kID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24oZW5kKTsKLQotCQkJCWlmIChpclN0YXJ0ICE9IG51bGwpIHsKLQkJCQkJc3RhcnQgPSBNYXRoLm1pbihzdGFydCwgaXJTdGFydC5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQl9Ci0JCQkJaWYgKGlyRW5kICE9IG51bGwpIHsKLQkJCQkJZW5kID0gTWF0aC5tYXgoZW5kLCBpckVuZC5nZXRFbmRPZmZzZXQoKSk7Ci0JCQkJfQotCQkJCXN1cGVyLnByb2Nlc3MoY3JlYXRlRGlydHlSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0LCBEaXJ0eVJlZ2lvbi5JTlNFUlQpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN1cGVyLnByb2Nlc3MoZGlydHlSZWdpb24pOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlaW5pdGlhbGl6ZXMgbGlzdGVuZXJzIGFuZCBzZXRzIG5ldyBkb2N1bWVudCBvbmFsbCBzdHJhdGVnaWVzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLkFic3RyYWN0UmVjb25jaWxlciNyZWNvbmNpbGVyRG9jdW1lbnRDaGFuZ2VkKElEb2N1bWVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWNvbmNpbGVyRG9jdW1lbnRDaGFuZ2VkKElEb2N1bWVudCBuZXdEb2N1bWVudCkgewotCQlzZXREb2N1bWVudChuZXdEb2N1bWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnQoSURvY3VtZW50IG5ld0RvY3VtZW50KSB7Ci0JCS8vIHVuaG9vayBvbGQgbGlmZWN5Y2xlIGxpc3RuZXIKLQkJdW5ob29rTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcihnZXREb2N1bWVudCgpKTsKLQkJc3VwZXIuc2V0RG9jdW1lbnQobmV3RG9jdW1lbnQpOwotCQkvLyBhZGQgbmV3IGxpZmVjeWNsZSBsaXN0ZW5lcgotCQlpZiAobmV3RG9jdW1lbnQgIT0gbnVsbCkKLQkJCWhvb2tVcE1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIobmV3RG9jdW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgdm9pZCB1bmhvb2tNb2RlbExpZmVjeWNsZUxpc3RlbmVyKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IGdldFN0cnVjdHVyZWRNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQl0cnkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZW1vdmVNb2RlbExpZmVjeWNsZUxpc3RlbmVyKGZMaWZlQ3ljbGVMaXN0ZW5lcik7Ci0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0KLQkJLy8gcmVtb3ZlcyBtb2RlbCBsaXN0ZW5lcnMKLQkJdW5ob29rTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcihnZXREb2N1bWVudCgpKTsKLQkJc3VwZXIudW5pbnN0YWxsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9TdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvU3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OTVkMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9TdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0vKioKLSAqIFVzZXMgSVN0cnVjdHVyZWRNb2RlbCBub2RlcyB0byBjaGVjayAib3ZlcmxhcHMoKSIgd2hlbiBnZXR0aW5nIGFubm90YXRpb25zIHRvIHJlbW92ZS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneSBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5IHsKLQkKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3koSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJc3VwZXIoc291cmNlVmlld2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhpcyBwb3NpdGlvbiBvdmVybGFwcyBhbnkgb2YgdGhlIFN0cnVjdHVyZWREb2N1bWVudCByZWdpb25zJwotCSAqIGNvcnJlc3Rwb25kaW5nIEluZGV4ZWRSZWdpb24uCi0JICogCi0JICogQHBhcmFtIHBvcwotCSAqIEBwYXJhbSBkcgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcG9zaXRpb24gb3ZlcmxhcHMgYW55IG9mIHRoZSByZWdpb25zLCBvdGhlcndpc2UKLQkgKiAgICAgICAgIGZhbHNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG92ZXJsYXBzKFBvc2l0aW9uIHBvcywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIHNkUmVnaW9ucykgewotCQlpbnQgc3RhcnQgPSAtMTsKLQkJaW50IGVuZCA9IC0xOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNkUmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkgICAgaWYoIXNkUmVnaW9uc1tpXS5pc0RlbGV0ZWQoKSkgewotICAgIAkJCUluZGV4ZWRSZWdpb24gY29ycmVzcG9uZGluZyA9IGdldENvcnJlc3BvbmRpbmdOb2RlKHNkUmVnaW9uc1tpXSk7Ci0gICAgICAgICAgICAgICAgaWYoY29ycmVzcG9uZGluZyAhPSBudWxsKSB7Ci0gICAgICAgIAkJCWlmIChzdGFydCA9PSAtMSB8fCBzdGFydCA+IGNvcnJlc3BvbmRpbmcuZ2V0U3RhcnRPZmZzZXQoKSkKLSAgICAgICAgCQkJCXN0YXJ0ID0gY29ycmVzcG9uZGluZy5nZXRTdGFydE9mZnNldCgpOwotICAgICAgICAJCQlpZiAoZW5kID09IC0xIHx8IGVuZCA8IGNvcnJlc3BvbmRpbmcuZ2V0RW5kT2Zmc2V0KCkpCi0gICAgICAgIAkJCQllbmQgPSBjb3JyZXNwb25kaW5nLmdldEVuZE9mZnNldCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQkJfQotCQlyZXR1cm4gcG9zLm92ZXJsYXBzV2l0aChzdGFydCwgZW5kIC0gc3RhcnQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgbm9kZSBmb3IgdGhlIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc2RSZWdpb24KLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIG5vZGUgZm9yIHNkUmVnaW9uCi0JICovCi0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q29ycmVzcG9uZGluZ05vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZ2V0RG9jdW1lbnQoKSk7Ci0gICAgICAgIEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc01vZGVsICE9IG51bGwpIAotICAgICAgICAgICAgICAgIGluZGV4ZWRSZWdpb24gPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzZFJlZ2lvbi5nZXRTdGFydCgpKTsgICAgCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc01vZGVsICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmRleGVkUmVnaW9uOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9UZW1wb3JhcnlBbm5vdGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL1RlbXBvcmFyeUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY3ZWE5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL1RlbXBvcmFyeUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0ZpeGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25BY2Nlc3NFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25QcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSW1hZ2VVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5FZGl0b3JzVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Bbm5vdGF0aW9uUHJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFubm90YXRpb25QcmVmZXJlbmNlTG9va3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVRlbXBvcmFyeUFubm90YXRpb247Ci0KLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBJVGVtcG9yYXJ5QW5ub3RhdGlvbiBACi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgVGVtcG9yYXJ5QW5ub3RhdGlvbiBleHRlbmRzIEFubm90YXRpb24gaW1wbGVtZW50cyBJVGVtcG9yYXJ5QW5ub3RhdGlvbiwgSVJlY29uY2lsZVJlc3VsdCwgSUFubm90YXRpb25QcmVzZW50YXRpb24sIElRdWlja0ZpeGFibGVBbm5vdGF0aW9uIHsKLQkvLyByZW1lbWJlciB0byBjaGFuZ2UgdGhlc2UgaWYgaXQgY2hhbmdlcyBpbiB0aGUgZXh0ZW5zaW9uIHBvaW50Ci0JLy8gbWF5IG5lZWQgYSBkaWZmZXJlbnQgaG9tZSBmb3IgdGhlbSBpbiB0aGUgZnV0dXJlLCBidXQgdGhleSdyZSBoZXJlIGZvcgotCS8vIG5vdwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFOTk9UX0VSUk9SID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGVtcC5lcnJvciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBTk5PVF9JTkZPID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGVtcC5pbmZvIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gcGFfVE9ETyB3aGF0IHNob3VsZCB0aGUgSUQgYmUgZm9yIHRoaXM/Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQU5OT1RfVU5LTk9XTiA9IEFubm90YXRpb24uVFlQRV9VTktOT1dOOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFOTk9UX1dBUk5JTkcgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZW1wLndhcm5pbmciOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBjb3BpZWQgZnJvbSBDb21waWxhdGlvblVuaXREb2N1bWVudFByb3ZpZGVyLlByb2JsZW1Bbm5vdGF0aW9uCi0gICAgLy9YWFg6IFRvIGJlIGZ1bGx5IGNvcnJlY3QgdGhlc2UgY29uc3RhbnRzIHNob3VsZCBiZSBub24tc3RhdGljCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19MQVlFUjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0xBWUVSOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0xBWUVSOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgQW5ub3RhdGlvblByZWZlcmVuY2VMb29rdXAgbG9va3VwPSBFZGl0b3JzVUkuZ2V0QW5ub3RhdGlvblByZWZlcmVuY2VMb29rdXAoKTsKLSAgICAgICAgSU5GT19MQVlFUj0gY29tcHV0ZUxheWVyKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlbXAuaW5mbyIsIGxvb2t1cCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgV0FSTklOR19MQVlFUj0gY29tcHV0ZUxheWVyKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlbXAud2FybmluZyIsIGxvb2t1cCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgRVJST1JfTEFZRVI9IGNvbXB1dGVMYXllcigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZW1wLmVycm9yIiwgbG9va3VwKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgY29tcHV0ZUxheWVyKFN0cmluZyBhbm5vdGF0aW9uVHlwZSwgQW5ub3RhdGlvblByZWZlcmVuY2VMb29rdXAgbG9va3VwKSB7Ci0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbj0gbmV3IEFubm90YXRpb24oYW5ub3RhdGlvblR5cGUsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgQW5ub3RhdGlvblByZWZlcmVuY2UgcHJlZmVyZW5jZT0gbG9va3VwLmdldEFubm90YXRpb25QcmVmZXJlbmNlKGFubm90YXRpb24pOwotICAgICAgICBpZiAocHJlZmVyZW5jZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIHByZWZlcmVuY2UuZ2V0UHJlc2VudGF0aW9uTGF5ZXIoKSArIDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBJQW5ub3RhdGlvbkFjY2Vzc0V4dGVuc2lvbi5ERUZBVUxUX0xBWUVSICsgMTsKLSAgICB9Ci0gICAgCi0gICAgCi0JcHJpdmF0ZSBPYmplY3QgZkFkZGl0aW9uYWxGaXhJbmZvID0gbnVsbDsKLQotCXByaXZhdGUgT2JqZWN0IGZLZXkgPSBudWxsOwotCXByaXZhdGUgUG9zaXRpb24gZlBvc2l0aW9uID0gbnVsbDsKLQlwcml2YXRlIE1hcCBmQXR0cmlidXRlcyA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc1F1aWNrRml4YWJsZSA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSXNRdWlja0ZpeGFibGVTdGF0ZVNldCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBpbnQgZlByb2JsZW1JRDsKLQotICAgIHByaXZhdGUgaW50IGZMYXllciA9IERFRkFVTFRfTEFZRVI7Ci0gICAgCi0gICAgcHJpdmF0ZSBJbWFnZSBmSW1hZ2UgPSBudWxsOwotCi0JcHVibGljIFRlbXBvcmFyeUFubm90YXRpb24oUG9zaXRpb24gcCwgU3RyaW5nIHR5cGUsIFN0cmluZyBtZXNzYWdlLCBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5IGtleSkgewotCQlzdXBlcigpOwotCQlmUG9zaXRpb24gPSBwOwotCQlzZXRUeXBlKHR5cGUpOwotCQlmS2V5ID0ga2V5OwotCQlzZXRUZXh0KG1lc3NhZ2UpOwotICAgICAgICBpbml0TGF5ZXIoKTsKLSAgICAgICAgaW5pdEltYWdlKCk7Ci0JfQotCi0JcHVibGljIFRlbXBvcmFyeUFubm90YXRpb24oUG9zaXRpb24gcCwgU3RyaW5nIHR5cGUsIFN0cmluZyBtZXNzYWdlLCBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5IGtleSwgaW50IHByb2JsZW1JZCkgewotCQlzdXBlcigpOwotCQlmUG9zaXRpb24gPSBwOwotCQlmS2V5ID0ga2V5OwotCQlzZXRUeXBlKHR5cGUpOwotCQlzZXRUZXh0KG1lc3NhZ2UpOwotCQlmUHJvYmxlbUlEID0gcHJvYmxlbUlkOwotICAgICAgICBpbml0TGF5ZXIoKTsKLSAgICAgICAgaW5pdEltYWdlKCk7Ci0JfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRMYXllcigpIHsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB0eXBlID0gZ2V0VHlwZSgpOwotICAgICAgICBpZih0eXBlLmVxdWFscyhBTk5PVF9FUlJPUikpIHsKLSAgICAgICAgICAgIGZMYXllciA9IEVSUk9SX0xBWUVSOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYodHlwZS5lcXVhbHMoQU5OT1RfV0FSTklORykpIHsKLSAgICAgICAgICAgIGZMYXllciA9IFdBUk5JTkdfTEFZRVI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZih0eXBlLmVxdWFscyhBTk5PVF9JTkZPKSkgewotICAgICAgICAgICAgZkxheWVyID0gSU5GT19MQVlFUjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaW5pdEltYWdlKCkgewotICAgICAgICAvLyBsYXRlciB3ZSBjYW4gYWRkIHN1cHBvcnQgZm9yIHF1aWNrIGZpeCBpbWFnZXMuCi0gICAgICAgIFN0cmluZyB0eXBlID0gZ2V0VHlwZSgpOwotICAgICAgICBpZih0eXBlLmVxdWFscyhBTk5PVF9FUlJPUikpIHsKLSAgICAgICAgICAgIGZJbWFnZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZih0eXBlLmVxdWFscyhBTk5PVF9XQVJOSU5HKSkgewotICAgICAgICAgICAgZkltYWdlID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKHR5cGUuZXF1YWxzKEFOTk9UX0lORk8pKSB7Ci0gICAgICAgICAgICBmSW1hZ2UgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCS8vIHRoaXMgY2hlY2sgZG9lc24ndCB0YWtlIGludG8gY29uc2lkZXJhdGlvbiB0aGF0IGFubm90YXRpb24KLQkJLy8gcG9zaXRpb25zIHRoYXQgY2hhbmdlIGZyb20gYSB0ZXh0IGVkaXQgYmVmb3JlIGl0Ci0JCS8vIHdlIHNob3VsZCBiZSBjaGVja2luZyBpZiB0aGUgYW5ub3RhdGlvbiBpcyBzdGlsbCBvbiB0aGUgc2FtZSBsaW5lLAotCQkvLyBhbmQgdGhlIGRpc3RhbmNlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIGlzIHRoZSBzYW1lCi0JCWlmIChvYmogaW5zdGFuY2VvZiBUZW1wb3JhcnlBbm5vdGF0aW9uKSB7Ci0KLQkJCVRlbXBvcmFyeUFubm90YXRpb24gdGEgPSAoVGVtcG9yYXJ5QW5ub3RhdGlvbikgb2JqOwotCi0gICAgICAgICAgICBib29sZWFuIHNhbWVQb3NpdGlvbiA9IHRhLmdldFBvc2l0aW9uKCkuZXF1YWxzKHRoaXMuZ2V0UG9zaXRpb24oKSk7Ci0gICAgICAgICAgICBib29sZWFuIHNhbWVUZXh0ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGlmKHRhLmdldFRleHQoKSAhPSBudWxsICYmIHRoaXMuZ2V0VGV4dCgpICE9IG51bGwgJiYgdGEuZ2V0VGV4dCgpLmVxdWFscyh0aGlzLmdldFRleHQoKSkpCi0gICAgICAgICAgICAgICAgc2FtZVRleHQgPSB0cnVlOwotICAgICAgICAgICAgZWxzZSBpZih0YS5nZXRUZXh0KCApPT0gbnVsbCAmJiB0aGlzLmdldFRleHQoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHNhbWVUZXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgIAotCQkJcmV0dXJuICBzYW1lVGV4dCAmJiBzYW1lUG9zaXRpb247Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOwotCX0KLQotCS8qKgotCSAqIEFkZGl0aW9uYWwgaW5mbyByZXF1aXJlZCB0byBmaXggdGhpcyBwcm9ibGVtLgotCSAqIAotCSAqIEByZXR1cm4gYW4gT2JqZWN0IHRoYXQgY29udGFpbnMgYWRkaXRpb25hbCBpbmZvIG9uIGhvdyB0byBmaXggdGhpcwotCSAqICAgICAgICAgcHJvYmxlbSwgb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGRpdGlvbmFsRml4SW5mbygpIHsKLQkJcmV0dXJuIGZBZGRpdGlvbmFsRml4SW5mbzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuSVRlbXBvcmFyeUFubm90YXRpb24jZ2V0RGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBnZXRUZXh0KCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0JCXJldHVybiBmS2V5OwotCX0KLQotCXB1YmxpYyBQb3NpdGlvbiBnZXRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZQb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByb2JsZW1JRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFByb2JsZW1JRCgpIHsKLQkJcmV0dXJuIGZQcm9ibGVtSUQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uI2lzUGVyc2lzdGVudCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0ZW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHVzZWZ1bCB0byBmaXhpbmcgdGhpcyBwcm9ibGVtLgotCSAqIAotCSAqIEBwYXJhbSBhbgotCSAqICAgICAgICAgICAgT2JqZWN0IHRoYXQgY29udGFpbnMgYWRkaXRpb25hbCBpbmZvIG9uIGhvdyB0byBmaXggdGhpcwotCSAqICAgICAgICAgICAgcHJvYmxlbQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkZGl0aW9uYWxGaXhJbmZvKE9iamVjdCBpbmZvKSB7Ci0JCWZBZGRpdGlvbmFsRml4SW5mbyA9IGluZm87Ci0JCXNldFF1aWNrRml4YWJsZSh0cnVlKTsKLQl9Ci0KLSAgICBwdWJsaWMgaW50IGdldExheWVyKCkgewotICAgICAgICByZXR1cm4gZkxheWVyOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIEBzZWUgQW5ub3RhdGlvbiNwYWludAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBDYW52YXMgY2FudmFzLCBSZWN0YW5nbGUgcikgewotICAgICAgICAvL2luaXRpYWxpemVJbWFnZXMoKTsKLSAgICAgICAgaWYgKGZJbWFnZSAhPSBudWxsKQotICAgICAgICAgICAgSW1hZ2VVdGlsaXRpZXMuZHJhd0ltYWdlKGZJbWFnZSwgZ2MsIGNhbnZhcywgciwgU1dULkNFTlRFUiwgU1dULlRPUCk7Ci0gICAgfQotICAgIAotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiIiArIGZQb3NpdGlvbi5nZXRPZmZzZXQoKSArICc6JyArIGZQb3NpdGlvbi5nZXRMZW5ndGgoKSArICI6ICIgKyBnZXRUZXh0KCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQkKLQlwdWJsaWMgTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBmQXR0cmlidXRlczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhNYXAgYXR0cmlidXRlcykgewotCQlmQXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUXVpY2tGaXhhYmxlKCkgewotCQlyZXR1cm4gZklzUXVpY2tGaXhhYmxlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRRdWlja0ZpeGFibGUoYm9vbGVhbiBzdGF0ZSkgewotCQlmSXNRdWlja0ZpeGFibGUgPSBzdGF0ZTsKLQkJZklzUXVpY2tGaXhhYmxlU3RhdGVTZXQgPSB0cnVlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1F1aWNrRml4YWJsZVN0YXRlU2V0KCkgewotCQlyZXR1cm4gZklzUXVpY2tGaXhhYmxlU3RhdGVTZXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvQW5ub3RhdGlvbkluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL0Fubm90YXRpb25JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwOTQyMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvQW5ub3RhdGlvbkluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBIb2xkcyBpbmZvIHRvIGNyZWF0ZSBhIFRlbXBvcmFyeUFubm90YXRpb24uCi0gKgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkluZm8gewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX1BST0JMRU1fSUQgPSAtMTsKLQlwcml2YXRlCUlNZXNzYWdlIGZNZXNzYWdlID0gbnVsbDsKLQlwcml2YXRlIE9iamVjdCBmQWRkaXRpb25hbEZpeEluZm8gPSBudWxsOwotCXByaXZhdGUgaW50IGZQcm9ibGVtSWQgPSBOT19QUk9CTEVNX0lEOwotCQotCXB1YmxpYyBBbm5vdGF0aW9uSW5mbyhJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWZNZXNzYWdlID0gbWVzc2FnZTsKLQkJCi0JfQotCXB1YmxpYyBBbm5vdGF0aW9uSW5mbyhJTWVzc2FnZSBtZXNzYWdlLCBpbnQgcHJvYmxlbUlkLCBPYmplY3QgYWRkaXRpb25hbEZpeEluZm8pIHsKLQkJdGhpcyhtZXNzYWdlKTsKLQkJZlByb2JsZW1JZCA9IHByb2JsZW1JZDsKLQkJZkFkZGl0aW9uYWxGaXhJbmZvID0gYWRkaXRpb25hbEZpeEluZm87Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBJTWVzc2FnZSBnZXRNZXNzYWdlKCkgewotCQlyZXR1cm4gZk1lc3NhZ2U7Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0QWRkaXRpb25hbEZpeEluZm8oKSB7Ci0JCXJldHVybiBmQWRkaXRpb25hbEZpeEluZm87Ci0JfQotCQotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0UHJvYmxlbUlkKCkgewotCQlyZXR1cm4gZlByb2JsZW1JZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9JU291cmNlVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9JU291cmNlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMDk5NzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvSVNvdXJjZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIGFsbG93IGZvciAicGFydGlhbCBkb2N1bWVudCIgYXMgeW91IHR5cGUgdmFsaWRhdGlvbi4KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNvdXJjZVZhbGlkYXRvciB7Ci0JCi0JLyoqCi0JICogQXMgeW91IHR5cGUgdmFsaWRhdGlvbiBpcyBnZXR0aW5nICJob29rZWQgdXAiIHRvIHRoaXMgSURvY3VtZW50LgotCSAqIFRoaXMgaXMgdGhlIGluc3RhbmNlIG9mIElEb2N1bWVudCB0aGF0IHRoZSB2YWxpZGF0b3Igc2hvdWxkCi0JICogb3BlcmF0ZSBvbiBmb3IgZWFjaCB2YWxpZGF0ZSBjYWxsLgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqLwotCXZvaWQgY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpOwotCQotCS8qKgotCSAqIFRoZSBzYW1lIElEb2N1bWVudCBwYXNzZWQgaW4gZnJvbSB0aGUgY29ubmVjdCgpIG1ldGhvZC4KLQkgKiBUaGlzIGluZGljYXRlcyB0aGF0IGFzIHlvdSB0eXBlIHZhbGlkYXRpb24gaXMgInNodXR0aW5nIGRvd24iCi0JICogZm9yIHRoaXMgSURvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqLwotCXZvaWQgZGlzY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpOwotCQotCS8qKgotCSAqIExpa2UgSVZhbGlkYXRvciN2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpCi0JICogZXhjZXB0IHBhc3NlcyB0aGUgZGlydHkgcmVnaW9uLCBzbyBkb2N1bWVudCB2YWxpZGF0aW9uIGNhbiBiZSBiZXR0ZXIKLQkgKiBvcHRpbWl6ZWQuCi0JICogCi0JICogQHBhcmFtIGRpcnR5UmVnaW9uCi0JICogQHBhcmFtIGhlbHBlcgotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqLwotCXZvaWQgdmFsaWRhdGUoSVJlZ2lvbiBkaXJ0eVJlZ2lvbiwgSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL0luY3JlbWVudGFsSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9JbmNyZW1lbnRhbEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGE5MTZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL0luY3JlbWVudGFsSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotCi0KLQotcHVibGljIGNsYXNzIEluY3JlbWVudGFsSGVscGVyIGltcGxlbWVudHMgSVZhbGlkYXRpb25Db250ZXh0IHsKLQlwcml2YXRlIElQcm9qZWN0IGZQcm9qZWN0OwotCi0JcHJpdmF0ZSBTdHJpbmcgZlVSSSA9IG51bGw7Ci0JCi0JcHVibGljIEluY3JlbWVudGFsSGVscGVyKElEb2N1bWVudCBzb3VyY2VEb2N1bWVudCwgSVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcigpOwotCQlmUHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQb3J0YWJsZU5hbWUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiByZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIGZQcm9qZWN0OwotCX0KLQotCXB1YmxpYyBPYmplY3QgbG9hZE1vZGVsKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBsb2FkTW9kZWwoU3RyaW5nIHN5bWJvbGljTmFtZSwgT2JqZWN0W10gcGFybXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0Jdm9pZCBzZXRVUkkoU3RyaW5nIHVyaSkgewotCQlmVVJJID0gdXJpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0VVJJcygpIHsKLQkJaWYoZlVSSSAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtmVVJJfTsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvSW5jcmVtZW50YWxSZXBvcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvSW5jcmVtZW50YWxSZXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWM4ZTJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL0luY3JlbWVudGFsUmVwb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotCi0vKioKLSAqIFJpZ2h0IG5vdyB3ZSdsbCBvbmx5IHVzZSBvbmUgcmVwb3J0ZXIgcGVyIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIEluY3JlbWVudGFsUmVwb3J0ZXIgaW1wbGVtZW50cyBJUmVwb3J0ZXIgewotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBmUHJvZ3Jlc3NNb25pdG9yOwotCXByaXZhdGUgSGFzaE1hcCBtZXNzYWdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgSW5jcmVtZW50YWxSZXBvcnRlcihJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlzdXBlcigpOwotCQlmUHJvZ3Jlc3NNb25pdG9yID0gcHJvZ3Jlc3NNb25pdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoSVZhbGlkYXRvciB2YWxpZGF0b3IsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IG5ldyBBbm5vdGF0aW9uSW5mbyhtZXNzYWdlKTsKLQkJYWRkQW5ub3RhdGlvbkluZm8odmFsaWRhdG9yLCBpbmZvKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGRBbm5vdGF0aW9uSW5mbyhJVmFsaWRhdG9yIHZhbGlkYXRvciwgQW5ub3RhdGlvbkluZm8gaW5mbykgewotCQlPYmplY3QgZXhpc3RpbmdWYWx1ZSA9IG1lc3NhZ2VzLmdldCh2YWxpZGF0b3IpOwotCQlpZiAoZXhpc3RpbmdWYWx1ZSAhPSBudWxsKSB7Ci0JCQkoKEhhc2hTZXQpIGV4aXN0aW5nVmFsdWUpLmFkZChpbmZvKTsKLQkJfQotCQllbHNlIHsKLQkJCUhhc2hTZXQgbmV3VmFsdWUgPSBuZXcgSGFzaFNldCgxKTsKLQkJCW5ld1ZhbHVlLmFkZChpbmZvKTsKLQkJCW1lc3NhZ2VzLnB1dCh2YWxpZGF0b3IsIG5ld1ZhbHVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3BsYXlTdWJ0YXNrKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWlmICgobWVzc2FnZSA9PSBudWxsKSB8fCAobWVzc2FnZS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGZQcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewotCQkJZlByb2dyZXNzTW9uaXRvci5zdWJUYXNrKG1lc3NhZ2UuZ2V0VGV4dCh2YWxpZGF0b3IuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIG1lc3NhZ2VzIGlzIGEgbGlzdCBvZjoKLQkJLy8gdmFsaWRhdG9ycyA9PiBIYXNoU2V0KEFubm90YXRpb25JbmZvMSwgQW5ub3RhdGlvbkluZm8yLCAuLi4pCi0JCS8vIChvbmUgSGFzaFNldCBwZXIgdmFsaWRhdG9yLi4uKQotCQlPYmplY3RbXSBsaXN0cyA9IG1lc3NhZ2VzLnZhbHVlcygpLnRvQXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0cy5sZW5ndGg7IGkrKykgewotCQkJSXRlcmF0b3IgaXQgPSAoKEhhc2hTZXQpbGlzdHNbaV0pLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IChBbm5vdGF0aW9uSW5mbykgaXQubmV4dCgpOwotCQkJCXJlc3VsdC5hZGQoaW5mby5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uSW5mb1tdIGdldEFubm90YXRpb25JbmZvKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJT2JqZWN0W10gaW5mb3MgPSBtZXNzYWdlcy52YWx1ZXMoKS50b0FycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdC5hZGRBbGwoKEhhc2hTZXQpaW5mb3NbaV0pOwotCQl9Ci0JCXJldHVybiAoQW5ub3RhdGlvbkluZm9bXSlyZXN1bHQudG9BcnJheShuZXcgQW5ub3RhdGlvbkluZm9bcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgewotCQlpZiAoZlByb2dyZXNzTW9uaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZlByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJT2JqZWN0IG8gPSBtZXNzYWdlcy5nZXQodmFsaWRhdG9yKTsKLQkJaWYobyAhPSBudWxsICYmIG8gaW5zdGFuY2VvZiBIYXNoU2V0KSB7Ci0JCQkoKEhhc2hTZXQpbykuY2xlYXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXJlbW92ZUFsbE1lc3NhZ2VzKHZhbGlkYXRvcik7Ci0JfQotCi0JLy8gZ3JvdXAgbmFtZXMgYXJlIHVuc3VwcG9ydGVkCi0JcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZVN1YnNldChJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iaiwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQlyZW1vdmVBbGxNZXNzYWdlcyh2YWxpZGF0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL1JlY29uY2lsZVN0ZXBGb3JWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL1JlY29uY2lsZVN0ZXBGb3JWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk0MGJiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9SZWNvbmNpbGVTdGVwRm9yVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGFibGVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5Eb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuUmVjb25jaWxlQW5ub3RhdGlvbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5TdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5UZW1wb3JhcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0KLS8qKgotICogQSByZWNvbmNpbGUgc3RlcCBmb3IgYW4gSVZhbGlkYXRvciBmb3IgcmVjb25jaWxlLiBVc2VkIHRoZSByZWNvbmNpbGUKLSAqIGZyYW1ld29yayB0byBjcmVhdGUgVGVtcG9yYXJ5QW5ub3RhdGlvbnMgZnJvbSB0aGUgdmFsaWRhdG9yIG1lc3NhZ2VzLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgUmVjb25jaWxlU3RlcEZvclZhbGlkYXRvciBleHRlbmRzIFN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwIHsKLQotCS8qKiBkZWJ1ZyBmbGFnICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2RlYnVnL3JlY29uY2lsZXJqb2IiKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBmaW5hbCBJUmVjb25jaWxlUmVzdWx0W10gRU1QVFlfUkVDT05DSUxFX1JFU1VMVF9TRVQgPSBuZXcgSVJlY29uY2lsZVJlc3VsdFswXTsKLQlwcml2YXRlIEluY3JlbWVudGFsSGVscGVyIGZIZWxwZXIgPSBudWxsOwotCXByaXZhdGUgSW5jcmVtZW50YWxSZXBvcnRlciBmUmVwb3J0ZXIgPSBudWxsOwotCXByaXZhdGUgaW50IGZTY29wZSA9IC0xOwotCXByaXZhdGUgSVZhbGlkYXRvciBmVmFsaWRhdG9yID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBRVUlDS0FTU0lTVFBST0NFU1NPUiA9IElRdWlja0Fzc2lzdFByb2Nlc3Nvci5jbGFzcy5nZXROYW1lKCk7Ci0KLQotCXB1YmxpYyBSZWNvbmNpbGVTdGVwRm9yVmFsaWRhdG9yKElWYWxpZGF0b3IgdiwgaW50IHNjb3BlKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJaWYgKHYgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInZhbGlkYXRvciBjYW5ub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0KLQkJZlZhbGlkYXRvciA9IHY7Ci0JCWZTY29wZSA9IHNjb3BlOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGEgbWFwIG9mIElWYWxpZGF0b3JGb3JSZWNvbmNpbGUgdG8gTGlzdCB0byBhbm5vdGF0aW9ucyBiYXNlZAotCSAqIG9uIHRob3NlIG1lc3NhZ2VzCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2VzCi0JICogQHJldHVybgotCSAqLwotCS8vIHByb3RlY3RlZCBJUmVjb25jaWxlUmVzdWx0W10gY3JlYXRlQW5ub3RhdGlvbnMoTGlzdCBtZXNzYWdlTGlzdCkgewotCS8vIExpc3QgYW5ub3RhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlTGlzdC5zaXplKCk7IGkrKykgewotCS8vIElNZXNzYWdlIHZhbGlkYXRpb25NZXNzYWdlID0gKElNZXNzYWdlKSBtZXNzYWdlTGlzdC5nZXQoaSk7Ci0JLy8KLQkvLyBpbnQgb2Zmc2V0ID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0T2Zmc2V0KCk7Ci0JLy8KLQkvLyBpZiAob2Zmc2V0IDwgMCkKLQkvLyBjb250aW51ZTsKLQkvLwotCS8vIFN0cmluZyBtZXNzYWdlVGV4dCA9IG51bGw7Ci0JLy8gdHJ5IHsKLQkvLyBtZXNzYWdlVGV4dCA9Ci0JLy8gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0VGV4dCh2YWxpZGF0aW9uTWVzc2FnZS5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotCS8vIH0KLQkvLyBjYXRjaCAoRXhjZXB0aW9uIHQpIHsKLQkvLyBMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gcmVwb3J0aW5nIG1lc3NhZ2UgZnJvbSB2YWxpZGF0b3IiLCB0KTsKLQkvLyAvLyROT04tTkxTLTEkCi0JLy8gY29udGludWU7Ci0JLy8gfQotCS8vCQkJCi0JLy8gU3RyaW5nIHR5cGUgPSBnZXRTZXZlcml0eSh2YWxpZGF0aW9uTWVzc2FnZSk7Ci0JLy8gLy8gdGhpcyBwb3NpdGlvbiBzZWVtcyBsaWtlIGl0IHdvdWxkIGJlIHBvc3NpYmx5IGJlIHRoZSB3cm9uZwotCS8vIC8vIGxlbmd0aAotCS8vIGludCBsZW5ndGggPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRMZW5ndGgoKTsKLQkvLyBpZiAobGVuZ3RoID49IDApIHsKLQkvLyBQb3NpdGlvbiBwID0gbmV3IFBvc2l0aW9uKG9mZnNldCwgbGVuZ3RoKTsKLQkvLyBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5IGtleSA9IGNyZWF0ZUtleShnZXRQYXJ0aXRpb25UeXBlKGdldERvY3VtZW50KCksCi0JLy8gb2Zmc2V0KSwgZ2V0U2NvcGUoKSk7Ci0JLy8gYW5ub3RhdGlvbnMuYWRkKG5ldyBUZW1wb3JhcnlBbm5vdGF0aW9uKHAsIHR5cGUsIG1lc3NhZ2VUZXh0LCBrZXkpKTsKLQkvLyB9Ci0JLy8gfQotCS8vCi0JLy8gcmV0dXJuIChJUmVjb25jaWxlUmVzdWx0W10pIGFubm90YXRpb25zLnRvQXJyYXkobmV3Ci0JLy8gSVJlY29uY2lsZVJlc3VsdFthbm5vdGF0aW9ucy5zaXplKCldKTsKLQkvLyB9Ci0JLyoqCi0JICogQ29udmVydHMgYSBtYXAgb2YgSVZhbGlkYXRvckZvclJlY29uY2lsZSB0byBMaXN0IHRvIGFubm90YXRpb25zIGJhc2VkCi0JICogb24gdGhvc2UgbWVzc2FnZXMKLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElSZWNvbmNpbGVSZXN1bHRbXSBjcmVhdGVBbm5vdGF0aW9ucyhBbm5vdGF0aW9uSW5mb1tdIGluZm9zKSB7Ci0KLQotCQlMaXN0IGFubm90YXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZm9zLmxlbmd0aDsgaSsrKSB7Ci0KLQkJCUFubm90YXRpb25JbmZvIGluZm8gPSBpbmZvc1tpXTsKLQotCQkJSU1lc3NhZ2UgdmFsaWRhdGlvbk1lc3NhZ2UgPSBpbmZvLmdldE1lc3NhZ2UoKTsKLQkJCWludCBvZmZzZXQgPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRPZmZzZXQoKTsKLQkJCWlmIChvZmZzZXQgPCAwKQotCQkJCWNvbnRpbnVlOwotCi0JCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQltZXNzYWdlVGV4dCA9IHZhbGlkYXRpb25NZXNzYWdlLmdldFRleHQodmFsaWRhdGlvbk1lc3NhZ2UuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gdCkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImV4Y2VwdGlvbiByZXBvcnRpbmcgbWVzc2FnZSBmcm9tIHZhbGlkYXRvciIsIHQpOyAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgdHlwZSA9IGdldFNldmVyaXR5KHZhbGlkYXRpb25NZXNzYWdlKTsKLQkJCS8vIHRoaXMgcG9zaXRpb24gc2VlbXMgbGlrZSBpdCB3b3VsZCBiZSBwb3NzaWJseSBiZSB0aGUgd3JvbmcKLQkJCS8vIGxlbmd0aAotCQkJaW50IGxlbmd0aCA9IHZhbGlkYXRpb25NZXNzYWdlLmdldExlbmd0aCgpOwotCQkJaWYgKGxlbmd0aCA+PSAwKSB7Ci0KLQkJCQlQb3NpdGlvbiBwID0gbmV3IFBvc2l0aW9uKG9mZnNldCwgbGVuZ3RoKTsKLQkJCQlSZWNvbmNpbGVBbm5vdGF0aW9uS2V5IGtleSA9IGNyZWF0ZUtleShnZXRQYXJ0aXRpb25UeXBlKGdldERvY3VtZW50KCksIG9mZnNldCksIGdldFNjb3BlKCkpOwotCi0JCQkJLy8gY3JlYXRlIGFuIGFubm90YXRpb24gdy8gcHJvYmxlbSBJRCBhbmQgZml4IGluZm8KLQkJCQlUZW1wb3JhcnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBuZXcgVGVtcG9yYXJ5QW5ub3RhdGlvbihwLCB0eXBlLCBtZXNzYWdlVGV4dCwga2V5KTsKLQkJCQlPYmplY3QgZXh0cmFJbmZvID0gaW5mby5nZXRBZGRpdGlvbmFsRml4SW5mbygpOwotCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzA5ODgKLQkJCQkvLyBhZGQgcXVpY2sgZml4IGluZm9ybWF0aW9uCi0JCQkJaWYgKGV4dHJhSW5mbyA9PSBudWxsKSB7Ci0JCQkJCWV4dHJhSW5mbyA9IHZhbGlkYXRpb25NZXNzYWdlLmdldEF0dHJpYnV0ZShRVUlDS0FTU0lTVFBST0NFU1NPUik7Ci0JCQkJfQotCQkJCWFubm90YXRpb24uc2V0QWRkaXRpb25hbEZpeEluZm8oZXh0cmFJbmZvKTsKLQkJCQlhbm5vdGF0aW9uLnNldEF0dHJpYnV0ZXModmFsaWRhdGlvbk1lc3NhZ2UuZ2V0QXR0cmlidXRlcygpKTsKLQkJCQlhbm5vdGF0aW9ucy5hZGQoYW5ub3RhdGlvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJUmVjb25jaWxlUmVzdWx0W10pIGFubm90YXRpb25zLnRvQXJyYXkobmV3IElSZWNvbmNpbGVSZXN1bHRbYW5ub3RhdGlvbnMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U2V2ZXJpdHkoSU1lc3NhZ2UgdmFsaWRhdGlvbk1lc3NhZ2UpIHsKLQkJU3RyaW5nIHR5cGUgPSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX0lORk87Ci0JCXN3aXRjaCAodmFsaWRhdGlvbk1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSkgewotCQkJY2FzZSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZIDoKLQkJCQl0eXBlID0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9FUlJPUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZIDoKLQkJCQl0eXBlID0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJTWVzc2FnZS5MT1dfU0VWRVJJVFkgOgotCQkJCXR5cGUgPSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX1dBUk5JTkc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElNZXNzYWdlLkVSUk9SX0FORF9XQVJOSU5HIDoKLQkJCQl0eXBlID0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9XQVJOSU5HOwotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXByaXZhdGUgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGdldERvY3VtZW50KCkpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkJLy8gVGhlIGJhc2VMb2NhdGlvbiBtYXkgYmUgYSBwYXRoIG9uIGRpc2sgb3IgcmVsYXRpdmUgdG8gdGhlCi0JCQkJLy8gd29ya3NwYWNlIHJvb3QuIERvbid0IHRyYW5zbGF0ZSBvbi1kaXNrIHBhdGhzIHRvCi0JCQkJLy8gaW4td29ya3NwYWNlIHJlc291cmNlcy4KLQkJCQlJUGF0aCBiYXNlUGF0aCA9IG5ldyBQYXRoKGJhc2VMb2NhdGlvbik7Ci0JCQkJaWYgKGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSAmJiAhYmFzZVBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQkJZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShiYXNlUGF0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwcml2YXRlIEluY3JlbWVudGFsSGVscGVyIGdldEhlbHBlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChmSGVscGVyID09IG51bGwpCi0JCQlmSGVscGVyID0gbmV3IEluY3JlbWVudGFsSGVscGVyKGdldERvY3VtZW50KCksIHByb2plY3QpOwotCQlyZXR1cm4gZkhlbHBlcjsKLQl9Ci0KLQlwcml2YXRlIEluY3JlbWVudGFsUmVwb3J0ZXIgZ2V0UmVwb3J0ZXIoKSB7Ci0JCWlmIChmUmVwb3J0ZXIgPT0gbnVsbCkKLQkJCWZSZXBvcnRlciA9IG5ldyBJbmNyZW1lbnRhbFJlcG9ydGVyKGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJcmV0dXJuIGZSZXBvcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGlzIHZhbGlkYXRvciBpcyBwYXJ0aWFsIG9yIHRvdGFsCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2NvcGUoKSB7Ci0JCXJldHVybiBmU2NvcGU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbFJlY29uY2lsZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCBJUmVjb25jaWxlUmVzdWx0W10gcmVjb25jaWxlTW9kZWwoRGlydHlSZWdpb24gZGlydHlSZWdpb24sIElSZWdpb24gc3ViUmVnaW9uKSB7Ci0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiW3RyYWNlIHJlY29uY2lsZXJdID4gcmVjb25jaWxpbmcgbW9kZWwgaW4gVkFMSURBVE9SIHN0ZXAgdy8gZGlydHkgcmVnaW9uOiBbIiArIGRpcnR5UmVnaW9uLmdldFRleHQoKSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCUlSZWNvbmNpbGVSZXN1bHRbXSByZXN1bHRzID0gRU1QVFlfUkVDT05DSUxFX1JFU1VMVF9TRVQ7Ci0JCWlmIChkaXJ0eVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlmIChmVmFsaWRhdG9yIGluc3RhbmNlb2YgSVNvdXJjZVZhbGlkYXRvcikgewotCQkJCQlyZXN1bHRzID0gdmFsaWRhdGUoZGlydHlSZWdpb24sIHN1YlJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHRzID0gdmFsaWRhdGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRVhFUFRJT04gSU4gUkVDT05DSUxFIFNURVAgRk9SIFZBTElEQVRPUiIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJbdHJhY2UgcmVjb25jaWxlcl0gPiBWQUxJREFUT1Igc3RlcCBkb25lIik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgZGVidWdTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCJWYWxpZGF0b3JTdGVwOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZlZhbGlkYXRvciAhPSBudWxsKQotCQkJZGVidWdTdHJpbmcuYXBwZW5kKGZWYWxpZGF0b3IudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBkZWJ1Z1N0cmluZy50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCBJUmVjb25jaWxlUmVzdWx0W10gdmFsaWRhdGUoKSB7Ci0JCUlSZWNvbmNpbGVSZXN1bHRbXSByZXN1bHRzID0gRU1QVFlfUkVDT05DSUxFX1JFU1VMVF9TRVQ7Ci0KLQkJSUZpbGUgZmlsZSA9IGdldEZpbGUoKTsKLQotCQl0cnkgewotCQkJSW5jcmVtZW50YWxIZWxwZXIgaGVscGVyID0gZ2V0SGVscGVyKGZpbGUgIT0gbnVsbCA/IGZpbGUuZ2V0UHJvamVjdCgpIDogbnVsbCk7Ci0JCQlJbmNyZW1lbnRhbFJlcG9ydGVyIHJlcG9ydGVyID0gZ2V0UmVwb3J0ZXIoKTsKLQotCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0JCQkJaGVscGVyLnNldFVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0KLQkJCWZWYWxpZGF0b3IudmFsaWRhdGUoaGVscGVyLCByZXBvcnRlcik7Ci0KLQkJCS8vIHJlc3VsdHMgPSBjcmVhdGVBbm5vdGF0aW9ucyhyZXBvcnRlci5nZXRNZXNzYWdlcygpKTsKLQkJCXJlc3VsdHMgPSBjcmVhdGVBbm5vdGF0aW9ucyhyZXBvcnRlci5nZXRBbm5vdGF0aW9uSW5mbygpKTsKLQkJCXJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKGZWYWxpZGF0b3IpOwotCi0JCQlmVmFsaWRhdG9yLmNsZWFudXAocmVwb3J0ZXIpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dE1vZGVsKElSZWNvbmNpbGFibGVNb2RlbCBpbnB1dE1vZGVsKSB7Ci0JCWlmIChpbnB1dE1vZGVsIGluc3RhbmNlb2YgRG9jdW1lbnRBZGFwdGVyKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSAoKERvY3VtZW50QWRhcHRlcikgaW5wdXRNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKGZWYWxpZGF0b3IgaW5zdGFuY2VvZiBJU291cmNlVmFsaWRhdG9yKSB7Ci0JCQkJCS8vIG5vdGlmeSB0aGF0IGRvY3VtZW50IGNvbm5lY3RpbmcKLQkJCQkJKChJU291cmNlVmFsaWRhdG9yKSBmVmFsaWRhdG9yKS5jb25uZWN0KGRvY3VtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuc2V0SW5wdXRNb2RlbChpbnB1dE1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlpZiAoZlZhbGlkYXRvciBpbnN0YW5jZW9mIElTb3VyY2VWYWxpZGF0b3IpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCS8vIG5vdGlmeSB0aGF0IGRvY3VtZW50IGRpc2Nvbm5lY3RpbmcKLQkJCQkoKElTb3VyY2VWYWxpZGF0b3IpIGZWYWxpZGF0b3IpLmRpc2Nvbm5lY3QoZG9jdW1lbnQpOwotCQkJfQotCQkJZlZhbGlkYXRvci5jbGVhbnVwKGdldFJlcG9ydGVyKCkpOwotCQl9Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVJlY29uY2lsZVJlc3VsdFtdIHZhbGlkYXRlKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uLCBJUmVnaW9uIHN1YlJlZ2lvbikgewotCQlJUmVjb25jaWxlUmVzdWx0W10gcmVzdWx0cyA9IEVNUFRZX1JFQ09OQ0lMRV9SRVNVTFRfU0VUOwotCi0JCUlGaWxlIGZpbGUgPSBnZXRGaWxlKCk7Ci0KLQkJdHJ5IHsKLQkJCUluY3JlbWVudGFsSGVscGVyIGhlbHBlciA9IGdldEhlbHBlcihmaWxlICE9IG51bGwgPyBmaWxlLmdldFByb2plY3QoKSA6IG51bGwpOwotCQkJLyoKLQkJCSAqIFNldHRpbmcgdGhlIFVSSSBpc24ndCBuZWNlc3NhcnkgZm9yIGFsbCBzb3VyY2UgdmFsaWRhdG9ycywgd2UKLQkJCSAqIGNhbiBzdGlsbCBjb250aW51ZSB3aXRob3V0IGl0Ci0JCQkgKi8KLQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgewotCQkJCWhlbHBlci5zZXRVUkkoZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJfQotCi0JCQlpZiAoZlZhbGlkYXRvciBpbnN0YW5jZW9mIElTb3VyY2VWYWxpZGF0b3IpIHsKLQkJCQlJbmNyZW1lbnRhbFJlcG9ydGVyIHJlcG9ydGVyID0gZ2V0UmVwb3J0ZXIoKTsKLQkJCQkoKElTb3VyY2VWYWxpZGF0b3IpIGZWYWxpZGF0b3IpLnZhbGlkYXRlKGRpcnR5UmVnaW9uLCBoZWxwZXIsIHJlcG9ydGVyKTsKLQkJCQkvLyBjYWxsIElWYWxpZGF0b3IuY2xlYW51cCgpIGR1cmluZyByZWxlYXNlKCkKLQkJCQkvLyByZXN1bHRzID0gY3JlYXRlQW5ub3RhdGlvbnMocmVwb3J0ZXIuZ2V0TWVzc2FnZXMoKSk7Ci0JCQkJcmVzdWx0cyA9IGNyZWF0ZUFubm90YXRpb25zKHJlcG9ydGVyLmdldEFubm90YXRpb25JbmZvKCkpOwotCQkJCXJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKGZWYWxpZGF0b3IpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9WYWxpZGF0b3JCdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9WYWxpZGF0b3JCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZjZjY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvVmFsaWRhdG9yQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5SZWdpc3RyeVJlYWRlcjsKLQotCi0vKioKLSAqIEJhc2VkIG9mZiBvZiBUcmFuc2ZlckJ1aWxkZXIuIFJlYWRzIHRoZSBleHRlbnNpb24gcG9pbnQgZm9yCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbnMuc291cmNldmFsaWRhdGlvbjwvY29kZT4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvckJ1aWxkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0gICAgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfU0NPUEUgPSAic2NvcGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbGlkYXRvck1ldGFEYXRhW10gRU1UUFlfVk1EX0FSUkFZID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhWzBdOwotCi0JLy8gZXh0ZW5zaW9uIHBvaW50IElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExfU09VUkNFX1ZBTElEQVRJT04gPSAic291cmNldmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DT05URU5UX1RZUEVfSURFTlRJRklFUiA9ICJjb250ZW50VHlwZUlkZW50aWZpZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BBUlRJVElPTl9UWVBFID0gInBhcnRpdGlvblR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVkFMSURBVE9SID0gInZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFX0ZJTFRFUiA9ICJyZWNvbmNpbGVfdmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGZDdXJyZW50Q1RJRDsKLQlwcml2YXRlIFZhbGlkYXRvck1ldGFEYXRhIGZDdXJyZW50Vk1EID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZlZtZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXRDb250cmlidXRpb25UYWc7Ci0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXRJRDsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFVOS05PV04gPSAiPz8/IjsgLy8kTk9OLU5MUy0xJAotICAgIAotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBhcnQgSUQgYXR0cmlidXRlIHRoYXQgaXMgZXhwZWN0ZWQgaW4gdGhlCi0JICogdGFyZ2V0IGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJRChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQlyZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogVU5LTk9XTjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdG9yQ2xhc3MoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKTsKLQkJcmV0dXJuIHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6IFVOS05PV047IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9ySWQKLQkgKiBAcmV0dXJuIFRyYW5zZmVyW10KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRWYWxpZGF0b3JNZXRhRGF0YShTdHJpbmcgZWRpdG9ySWQpIHsKLQkJcmVhZENvbnRyaWJ1dGlvbnMoZWRpdG9ySWQsIFRBR19WQUxJREFUT1IsIFBMX1NPVVJDRV9WQUxJREFUSU9OKTsKLQkJcmV0dXJuIChWYWxpZGF0b3JNZXRhRGF0YVtdKSBmVm1kcy50b0FycmF5KG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtmVm1kcy5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRvclNjb3BlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9TQ09QRSk7Ci0JCXJldHVybiB2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiBVTktOT1dOOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmVhZHMgdGhlIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgcmVnaXN0cnkgZm9yIHRoZSBwcm92aWRlZCB3b3JrYmVuY2gKLQkgKiBwYXJ0IGFuZCB0aGUgcHJvdmlkZWQgZXh0ZW5zaW9uIHBvaW50IElELgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSB0YWcKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uUG9pbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkQ29udHJpYnV0aW9ucyhTdHJpbmcgaWQsIFN0cmluZyB0YWcsIFN0cmluZyBleHRlbnNpb25Qb2ludCkgewotCQl0YXJnZXRJRCA9IGlkOwotCQl0YXJnZXRDb250cmlidXRpb25UYWcgPSB0YWc7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCXJlYWRSZWdpc3RyeShyZWdpc3RyeSwgUExVR0lOX0lELCBleHRlbnNpb25Qb2ludCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHRhZyA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQkvL2llLiB0YXJnZXRDb250cmlidXRpb25UYWcgPT0gdmFsaWRhdG9yCi0JCWlmICh0YWcuZXF1YWxzKHRhcmdldENvbnRyaWJ1dGlvblRhZykpIHsKLQkJCVN0cmluZyB2SWQgPSBnZXRJRChlbGVtZW50KTsKLQkJCVN0cmluZyB2Q2xhc3MgPSBnZXRWYWxpZGF0b3JDbGFzcyhlbGVtZW50KTsKLQkJCVN0cmluZyB2U2NvcGUgPSBnZXRWYWxpZGF0b3JTY29wZShlbGVtZW50KTsKLQotCQkJaWYgKHZJZCA9PSBudWxsKSB7Ci0JCQkJLy8gVGhpcyBpcyBub3Qgb2YgaW50ZXJlc3QgdG8gdXMgLSBkb24ndCBnbyBkZWVwZXIKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCS8vIHN0YXJ0IGJ1aWxkaW5nIGEgVk1ECi0JCQlmQ3VycmVudFZNRCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YShlbGVtZW50LCB2SWQsIHZDbGFzcywgdlNjb3BlKTsKLQkJCWZWbWRzLmFkZChmQ3VycmVudFZNRCk7Ci0KLQkJCWlmIChMb2dnZXIuaXNUcmFjaW5nKFZhbGlkYXRvckJ1aWxkZXIuVFJBQ0VfRklMVEVSKSkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFkZGVkIHJlY29uY2lsZSB2YWxpZGF0b3I6ICIgKyB2SWQgKyAiOiIgKyB2Q2xhc3MgKyAiOiIgKyB2U2NvcGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9IGVsc2UgaWYgKHRhZy5lcXVhbHMoVEFHX0NPTlRFTlRfVFlQRV9JREVOVElGSUVSKSkgewotCQkJLy8gYWRkIHRvIGN1cnJlbnQgVk1ECi0JCQlmQ3VycmVudENUSUQgPSBnZXRJRChlbGVtZW50KTsKLQkJCWZDdXJyZW50Vk1ELmFkZENvbnRlbnRUeXBlSWQoZkN1cnJlbnRDVElEKTsKLQkJfSBlbHNlIGlmICh0YWcuZXF1YWxzKFRBR19QQVJUSVRJT05fVFlQRSkpIHsKLQkJCS8vIGFkZCB0byBjdXJyZW50IFZNRAotCQkJU3RyaW5nIHBhcnRpdGlvblR5cGUgPSBnZXRJRChlbGVtZW50KTsKLQkJCWZDdXJyZW50Vk1ELmFkZFBhcml0aW9uVHlwZShmQ3VycmVudENUSUQsIHBhcnRpdGlvblR5cGUpOwotCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJlYWRFbGVtZW50Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvVmFsaWRhdG9yTWV0YURhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL1ZhbGlkYXRvck1ldGFEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YmNkY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvVmFsaWRhdG9yTWV0YURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5SZWNvbmNpbGVBbm5vdGF0aW9uS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogT2JqZWN0IHRoYXQgaG9sZHMgaW5mb3JtYXRpb24gcmVsZXZhbnQgdG8gdGhlIGNyZWF0aW9uIG9mIGEgdmFsaWRhdG9yIGZvcgotICogdGhlIHJlY29uY2lsaW5nIGZyYW1ld29yay4KLSAqIAotICogQGF1dGhvciBwYXZlcnksbml0aW5kCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JNZXRhRGF0YSB7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNsYXNzID0gbnVsbDsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBmQ29uZmlndXJhdGlvbkVsZW1lbnQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZJZCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZlNjb3BlOwotCi0JLy8gYSBoYXNoIG1hcCBvZiBleHBsaWNpdGx5IGRlY2xhcmVkIGNvbnRlbnQgdHlwZSBJZHMgKFN0cmluZykgdGhhdCBwb2ludHMgdG8gbGlzdHMgb2YKLQkvLyBwYXJ0aXRpb24gdHlwZXMgKExpc3Qgb2YgU3RyaW5ncykKLQkvLyBjb250ZW50VHlwZUlkIC0+IExpc3QocGFyaXRpb25UeXBlLCBwYXJpdGlvblR5cGUsIHBhcnRpdGlvblR5cGUsIC4uLikKLQkvLyBjb250ZW50VHlwZUlkMiAtPiBMaXN0KHBhcnRpdGlvblR5cGUsIHBhcnRpdGlvblR5cGUsIC4uLikKLQkvLyAuLi4KLQlwcml2YXRlIEhhc2hNYXAgZk1hdHJpeCA9IG51bGw7Ci0KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyB2SWQsIFN0cmluZyB2Q2xhc3MsIFN0cmluZyB2U2NvcGUpIHsKLQkJZklkID0gdklkOwotCQlmQ2xhc3MgPSB2Q2xhc3M7Ci0JCWZDb25maWd1cmF0aW9uRWxlbWVudCA9IGVsZW1lbnQ7Ci0JCWZTY29wZSA9IHZTY29wZTsKLQkJZk1hdHJpeCA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogVE9ETzogVGhpcyBleGFjdCBtZXRob2QgaXMgYWxzbyBpbiBWYWxpZGF0b3JTdHJhdGVneS4gU2hvdWxkIGJlIGluIGEgY29tbW9uIHBsYWNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZW50VHlwZUlkCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gY2FsY3VsYXRlUGFyZW50Q29udGVudFR5cGVJZHMoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQotICAgICAgICBTZXQgcGFyZW50VHlwZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICAKLSAgICAgICAgSUNvbnRlbnRUeXBlTWFuYWdlciBjdE1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsgICAgCi0gICAgICAgIElDb250ZW50VHlwZSBjdCA9IGN0TWFuYWdlci5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZUlkKTsKLSAgICAgICAgU3RyaW5nIGlkID0gY29udGVudFR5cGVJZDsKLQotICAgICAgICB3aGlsZShjdCAhPSBudWxsICYmIGlkICE9IG51bGwpIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcGFyZW50VHlwZXMuYWRkKGlkKTsKLSAgICAgICAgICAgIGN0ID0gY3RNYW5hZ2VyLmdldENvbnRlbnRUeXBlKGlkKTsKLSAgICAgICAgICAgIGlmKGN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJQ29udGVudFR5cGUgYmFzZVR5cGUgPSBjdC5nZXRCYXNlVHlwZSgpOwotICAgICAgICAgICAgICAgIGlkID0gKGJhc2VUeXBlICE9IG51bGwpID8gYmFzZVR5cGUuZ2V0SWQoKSA6IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTdHJpbmdbXSlwYXJlbnRUeXBlcy50b0FycmF5KG5ldyBTdHJpbmdbcGFyZW50VHlwZXMuc2l6ZSgpXSk7Ci0gICAgfQotICAgIAotCXB1YmxpYyB2b2lkIGFkZENvbnRlbnRUeXBlSWQoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJaWYgKCFmTWF0cml4LmNvbnRhaW5zS2V5KGNvbnRlbnRUeXBlSWQpKQotCQkJZk1hdHJpeC5wdXQoY29udGVudFR5cGVJZCwgbmV3IEFycmF5TGlzdCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYXJpdGlvblR5cGUoU3RyaW5nIGNvbnRlbnRUeXBlSWQsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCWlmICghZk1hdHJpeC5jb250YWluc0tleShjb250ZW50VHlwZUlkKSkKLQkJCWZNYXRyaXgucHV0KGNvbnRlbnRUeXBlSWQsIG5ldyBBcnJheUxpc3QoKSk7Ci0KLQkJTGlzdCBwYXJ0aXRpb25MaXN0ID0gKExpc3QpIGZNYXRyaXguZ2V0KGNvbnRlbnRUeXBlSWQpOwotCQlwYXJ0aXRpb25MaXN0LmFkZChwYXJ0aXRpb25UeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyB2YWxpZGF0b3IgZXhwbGljaXRseSBkZWNsYXJlZCB0aGF0IGl0IGNvdWxkIGhhbmRsZQotCSAqICAgICAgICAgdGhpcyBjb250ZW50IHR5cGUgb3IgYW55IG9mIGl0cyBwYXJlbnQgY29udGVudCB0eXBlcwotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkhhbmRsZUNvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSkgewotICAgICAgICAvLyBuZWVkIHRvIGl0ZXJhdGUgaGllcmFyY2h5Ci0gICAgICAgIFN0cmluZ1tdIGNvbnRlbnRIaWVyYXJjaHkgPSBjYWxjdWxhdGVQYXJlbnRDb250ZW50VHlwZUlkcyhjb250ZW50VHlwZSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudEhpZXJhcmNoeS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYoZk1hdHJpeC5jb250YWluc0tleShjb250ZW50SGllcmFyY2h5W2ldKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgdmFsaWRhdG9yIGV4cGxpY2l0bHkgZGVjbGFyZWQgdGhhdCBpdCBjb3VsZCBoYW5kbGUKLQkgKiAgICAgICAgIHRoaXMgY29udGVudCB0eXBlCi0JICovCi0JcHVibGljIGJvb2xlYW4gbXVzdEhhbmRsZUNvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSkgewotICAgICAgICByZXR1cm4gZk1hdHJpeC5jb250YWluc0tleShjb250ZW50VHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlSWRzCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGUKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyB2YWxpZGF0b3IgZGVjbGFyZWQgdGhhdCBpdCBjb3VsZCBoYW5kbGUgdGhpcwotCSAqICAgICAgICAgY29udGVudCB0eXBlLCBvciBvbmUgb2YgaXRzIHBhcmVudCBjb250ZW50IHR5cGVzLCBhbmQgcGFydGl0aW9uCi0JICogICAgICAgICB0eXBlCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlUGFydGl0aW9uVHlwZShTdHJpbmcgY29udGVudFR5cGVJZHNbXSwgU3RyaW5nIHBhcml0aW9uVHlwZSkgewotICAgICAgICBmb3IoaW50IGk9MDsgaTxjb250ZW50VHlwZUlkcy5sZW5ndGg7IGkrKykgewotICAgIAkJaWYgKGZNYXRyaXguY29udGFpbnNLZXkoY29udGVudFR5cGVJZHNbaV0pKSB7Ci0gICAgCQkJTGlzdCBwYXJ0aXRpb25zID0gKExpc3QpIGZNYXRyaXguZ2V0KGNvbnRlbnRUeXBlSWRzW2ldKTsKLSAgICAJCQlmb3IgKGludCBqID0gMDsgaiA8IHBhcnRpdGlvbnMuc2l6ZSgpOyBqKyspIHsKLSAgICAJCQkJaWYgKHBhcml0aW9uVHlwZS5lcXVhbHMocGFydGl0aW9ucy5nZXQoaikpKQotICAgIAkJCQkJcmV0dXJuIHRydWU7Ci0gICAgCQkJfQotICAgIAkJfQotICAgICAgICB9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjbGFzc0F0dHJpYnV0ZQotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JT2JqZWN0IGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIGZpbmFsIFN0cmluZyBjbGFzc0F0dHJpYnV0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlPYmplY3Qgb2JqID0gbnVsbDsKLQkJb2JqID0gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGNsYXNzQXR0cmlidXRlKTsKLQkJcmV0dXJuIG9iajsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGV4dGVuc2lvbi4gSWYgdGhlIGV4dGVuc2lvbiBwbHVnaW4gaGFzIG5vdCBiZWVuIGxvYWRlZCBhCi0JICogYnVzeSBjdXJzb3Igd2lsbCBiZSBhY3RpdmF0ZWQgZHVyaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgbG9hZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjbGFzc0F0dHJpYnV0ZQotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVFeHRlbnNpb24oKSB7Ci0JCS8vIElmIHBsdWdpbiBoYXMgYmVlbiBsb2FkZWQgY3JlYXRlIGV4dGVuc2lvbi4KLQkJLy8gT3RoZXJ3aXNlLCBzaG93IGJ1c3kgY3Vyc29yIHRoZW4gY3JlYXRlIGV4dGVuc2lvbi4KLQkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBnZXRDb25maWd1cmF0aW9uRWxlbWVudCgpOwotCQlmaW5hbCBPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0WzFdOwotCQlTdHJpbmcgcGx1Z2luSWQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJaWYgKGJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5BQ1RJVkUpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZWxlbWVudCwgImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24ocmVzdWx0LCBlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKG51bGwsIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXN1bHRbMF0gPSBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGVsZW1lbnQsICJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQloYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKHJlc3VsdCwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0WzBdOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYSB2YWxpZGF0b3IgaW5zdGFuY2UgYmFzZWQgb24gdGhpcyBWYWxpZGF0b3JNZXRhRGF0YSBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcigpIHsKLQkJT2JqZWN0IG9iaiA9IG51bGw7Ci0JCW9iaiA9IGNyZWF0ZUV4dGVuc2lvbigpOwotCQlpZiAob2JqID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAob2JqIGluc3RhbmNlb2YgSVZhbGlkYXRvcikgPyAoSVZhbGlkYXRvcikgb2JqIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCkgewotCQlyZXR1cm4gZkNvbmZpZ3VyYXRpb25FbGVtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiBmQ2xhc3M7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JJZCgpIHsKLQkJcmV0dXJuIGZJZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICogQHBhcmFtIGUKLQkgKi8KLQl2b2lkIGhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24oT2JqZWN0W10gcmVzdWx0LCBUaHJvd2FibGUgZSkgewotCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQlyZXN1bHRbMF0gPSBudWxsOwotCX0KLQkvKioKLQkgKiBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlRPVEFMIG9yICBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlBBUlRJQUwKLQkgKiBAcmV0dXJuCi0JICovCi0gICAgcHVibGljIGludCBnZXRWYWxpZGF0b3JTY29wZSgpIHsKLSAgICAgICAgcmV0dXJuIGZTY29wZS5lcXVhbHNJZ25vcmVDYXNlKCJ0b3RhbCIpID8gUmVjb25jaWxlQW5ub3RhdGlvbktleS5UT1RBTCA6IFJlY29uY2lsZUFubm90YXRpb25LZXkuUEFSVElBTDsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBkZWJ1Z1N0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoIlZhbGlkYXRvck1ldGFEYXRhOiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChmSWQgIT0gbnVsbCkKLQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiIFtpZDoiICsgZklkICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJldHVybiBkZWJ1Z1N0cmluZy50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9WYWxpZGF0b3JTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjhjMTJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklSZWxlYXNhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLkRvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5SZWNvbmNpbGVBbm5vdGF0aW9uS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5UZW1wb3JhcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotCi0vKioKLSAqIFNwZWNpYWwgdmFsaWRhdG9yIHN0cmF0ZWd5LiBSdW5zIHZhbGlkYXRvciBzdGVwcyBjb250cmlidXRlZCB2aWEgdGhlCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbnMuc291cmNldmFsaWRhdGlvbjwvY29kZT4gZXh0ZW5zaW9uCi0gKiBwb2ludAotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yU3RyYXRlZ3kgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kgewotCi0JcHJpdmF0ZSBTdHJpbmdbXSBmQ29udGVudFR5cGVJZHMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmTWV0YURhdGEgPSBudWxsOwotCS8qKiB2YWxpZGF0b3IgaWQgKGFzIGRlY2xhcmVkIGluIGV4dCBwb2ludCkgLT4gUmVjb25jaWxlU3RlcEZvclZhbGlkYXRvciAqICovCi0JcHJpdmF0ZSBIYXNoTWFwIGZWaWRUb1ZTdGVwTWFwID0gbnVsbDsKLQotCS8qCi0JICogTGlzdCBvZiBWYWxpZGF0b3JNZXRhRGF0YXMgb2YgdG90YWwgc2NvcGUgdmFsaWRhdG9ycyB0aGF0IGhhdmUgYmVlbiBydW4KLQkgKiBzaW5jZSBiZWdpblByb2Nlc3NpbmcoKSB3YXMgY2FsbGVkLgotCSAqLwotCXByaXZhdGUgTGlzdCBmVG90YWxTY29wZVZhbGlkYXRvcnNBbHJlYWR5UnVuOwotCi0JcHVibGljIFZhbGlkYXRvclN0cmF0ZWd5KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJc3VwZXIoc291cmNlVmlld2VyKTsKLQkJZk1ldGFEYXRhID0gbmV3IEFycmF5TGlzdCgpOwotCQlmQ29udGVudFR5cGVJZHMgPSBjYWxjdWxhdGVQYXJlbnRDb250ZW50VHlwZUlkcyhjb250ZW50VHlwZSk7Ci0JCWZWaWRUb1ZTdGVwTWFwID0gbmV3IEhhc2hNYXAoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRWYWxpZGF0b3JNZXRhRGF0YShWYWxpZGF0b3JNZXRhRGF0YSB2bWQpIHsKLQkJZk1ldGFEYXRhLmFkZCh2bWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUHJvY2Vzc2luZygpIHsKLQkJaWYgKGZUb3RhbFNjb3BlVmFsaWRhdG9yc0FscmVhZHlSdW4gPT0gbnVsbCkKLQkJCWZUb3RhbFNjb3BlVmFsaWRhdG9yc0FscmVhZHlSdW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVsc2UKLQkJCWZUb3RhbFNjb3BlVmFsaWRhdG9yc0FscmVhZHlSdW4uY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29udGVudCB0eXBlIHBhc3NlZCBpbiBzaG91bGQgYmUgdGhlIG1vc3Qgc3BlY2lmaWMgb25lLiBUT0RPOiBUaGlzCi0JICogZXhhY3QgbWV0aG9kIGlzIGFsc28gaW4gVmFsaWRhdG9yTWV0YURhdGEuIFNob3VsZCBiZSBpbiBhIGNvbW1vbiBwbGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBjYWxjdWxhdGVQYXJlbnRDb250ZW50VHlwZUlkcyhTdHJpbmcgY29udGVudFR5cGVJZCkgewotCi0JCVNldCBwYXJlbnRUeXBlcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJSUNvbnRlbnRUeXBlTWFuYWdlciBjdE1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLQkJSUNvbnRlbnRUeXBlIGN0ID0gY3RNYW5hZ2VyLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWQpOwotCQlTdHJpbmcgaWQgPSBjb250ZW50VHlwZUlkOwotCi0JCXdoaWxlIChjdCAhPSBudWxsICYmIGlkICE9IG51bGwpIHsKLQotCQkJcGFyZW50VHlwZXMuYWRkKGlkKTsKLQkJCWN0ID0gY3RNYW5hZ2VyLmdldENvbnRlbnRUeXBlKGlkKTsKLQkJCWlmIChjdCAhPSBudWxsKSB7Ci0JCQkJSUNvbnRlbnRUeXBlIGJhc2VUeXBlID0gY3QuZ2V0QmFzZVR5cGUoKTsKLQkJCQlpZCA9IChiYXNlVHlwZSAhPSBudWxsKSA/IGJhc2VUeXBlLmdldElkKCkgOiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiAoU3RyaW5nW10pIHBhcmVudFR5cGVzLnRvQXJyYXkobmV3IFN0cmluZ1twYXJlbnRUeXBlcy5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5IYW5kbGVQYXJ0aXRpb24oU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmTWV0YURhdGEuc2l6ZSgpOyBpKyspIHsKLQkJCXZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgZk1ldGFEYXRhLmdldChpKTsKLQkJCWlmICh2bWQuY2FuSGFuZGxlUGFydGl0aW9uVHlwZShnZXRDb250ZW50VHlwZUlkcygpLCBwYXJ0aXRpb25UeXBlKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNTdGVwKElSZWNvbmNpbGVTdGVwIHN0ZXApIHsKLQkJcmV0dXJuIGZWaWRUb1ZTdGVwTWFwLmNvbnRhaW5zVmFsdWUoc3RlcCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlY29uY2lsZS5BYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneSNjcmVhdGVSZWNvbmNpbGVTdGVwcygpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUmVjb25jaWxlU3RlcHMoKSB7Ci0JCS8vIGRvIG5vdGhpbmcsIHN0ZXBzIGFyZSBjcmVhdGVkCi0JfQotCi0JcHVibGljIHZvaWQgZW5kUHJvY2Vzc2luZygpIHsKLQkJZlRvdGFsU2NvcGVWYWxpZGF0b3JzQWxyZWFkeVJ1bi5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIEFsbCBjb250ZW50IHR5cGVzIG9uIHdoaWNoIHRoaXMgVmFsaWRhdG9yU3RyYXRlZ3kgY2FuIHJ1bgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29udGVudFR5cGVJZHMoKSB7Ci0JCXJldHVybiBmQ29udGVudFR5cGVJZHM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRyCi0JICogICAgICAgICAgICBQYXJ0aXRpb24gb2YgdGhlIHJlZ2lvbiB0byByZWNvbmNpbGUuCi0JICogQHBhcmFtIGRyCi0JICogICAgICAgICAgICBEaXJ0eSByZWdpb24gcmVwcmVzZW50YXRpb24gb2YgdGhlIHR5cGVkIHJlZ2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHJlY29uY2lsZShJVHlwZWRSZWdpb24gdHIsIERpcnR5UmVnaW9uIGRyKSB7Ci0JCS8qCi0JCSAqIEFib3J0IGlmIG5vIHdvcmtzcGFjZSBmaWxlIGlzIGtub3duIChuZXcgdmFsaWRhdGlvbiBmcmFtZXdvcmsgZG9lcwotCQkgKiBub3Qgc3VwcG9ydCB0aGF0IHNjZW5hcmlvKSBvciBubyB2YWxpZGF0b3JzIGhhdmUgYmVlbiBzcGVjaWZpZWQKLQkJICovCi0JCWlmIChpc0NhbmNlbGVkKCkgfHwgZk1ldGFEYXRhLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQotCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoKTsKLQkJLy8gZm9yIGV4dGVybmFsIGZpbGVzLCB0aGlzIGNhbiBiZSBudWxsCi0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgcGFydGl0aW9uVHlwZSA9IHRyLmdldFR5cGUoKTsKLQotCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBudWxsOwotCQlMaXN0IGFubm90YXRpb25zVG9BZGQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgc3RlcHNSYW5PblRoaXNEaXJ0eVJlZ2lvbiA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQotCQkvKgotCQkgKiBLZWVwIHRyYWNrIG9mIHRoZSBkaXNhYmxlZCB2YWxpZGF0b3JzIGJ5IHNvdXJjZSBpZCBmb3IgdGhlIFYyCi0JCSAqIHZhbGlkYXRvcnMuCi0JCSAqLwotCQlTZXQgZGlzYWJsZWRWYWxzQnlTb3VyY2VJZCA9IG5ldyBIYXNoU2V0KDIwKTsKLQkJCi0JCS8qCi0JCSAqIEtlZXAgdHJhY2sgb2YgdGhlIGRpc2FibGVkIHZhbGlkYXRvcnMgYnkgY2xhc3MgaWQgZm9yIHRoZSB2MQotCQkgKiB2YWxpZGF0b3JzLgotCQkgKi8KLQkJU2V0IGRpc2FibGVkVmFsc0J5Q2xhc3MgPSBuZXcgSGFzaFNldCgyMCk7Ci0JCUlGaWxlIGZpbGUgPSBnZXRGaWxlKCk7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5nZXREaXNhYmxlZFZhbGlkYXRvcnNGb3IoZmlsZSkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVZhbGlkYXRvciB2ID0gKFZhbGlkYXRvcikgaXQubmV4dCgpOwotCQkJCUlWYWxpZGF0b3IgaXYgPSB2LmFzSVZhbGlkYXRvcigpOwotCQkJCWlmIChpdiAhPSBudWxsICYmIHYuZ2V0U291cmNlSWQoKSAhPSBudWxsKQotCQkJCQlkaXNhYmxlZFZhbHNCeVNvdXJjZUlkLmFkZCh2LmdldFNvdXJjZUlkKCkpOwotCQkJCVZhbGlkYXRvci5WMSB2MSA9IHYuYXNWMVZhbGlkYXRvcigpOwotCQkJCWlmICh2MSAhPSBudWxsKQotCQkJCQlkaXNhYmxlZFZhbHNCeUNsYXNzLmFkZCh2MS5nZXRJZCgpKTsKLQkJCX0KLQkJfQotCQkJCQotCQkvKgotCQkgKiBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSByZWxldmFudCB2YWxpZGF0b3IgbWV0YSBkYXRhIHRvIGZpbmQKLQkJICogc3VwcG9ydGluZyB2YWxpZGF0b3JzIGZvciB0aGlzIHBhcnRpdGlvbiB0eXBlLiBEb24ndCBjaGVjawotCQkgKiB0aGlzLmNhbkhhbmRsZVBhcnRpdGlvbigpIGJlZm9yZS1oYW5kIHNpbmNlIGl0IGp1c3QgbG9vcHMgdGhyb3VnaAotCQkgKiBhbmQgY2FsbHMgdm1kLmNhbkhhbmRsZVBhcnRpdGlvblR5cGUoKS4uLndoaWNoIHdlJ3JlIGFscmVhZHkgZG9pbmcKLQkJICogaGVyZSBhbnl3YXkgdG8gZmluZCB0aGUgcmlnaHQgdm1kLgotCQkgKi8KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmTWV0YURhdGEuc2l6ZSgpICYmICFpc0NhbmNlbGVkKCk7IGkrKykgewotCQkJdm1kID0gKFZhbGlkYXRvck1ldGFEYXRhKSBmTWV0YURhdGEuZ2V0KGkpOwotCQkJaWYgKHZtZC5jYW5IYW5kbGVQYXJ0aXRpb25UeXBlKGdldENvbnRlbnRUeXBlSWRzKCksIHBhcnRpdGlvblR5cGUpKSB7Ci0JCQkJLyoKLQkJCQkgKiBDaGVjayBpZiB2YWxpZGF0b3IgaXMgZW5hYmxlZCBhY2NvcmRpbmcgdG8gdmFsaWRhdGlvbgotCQkJCSAqIHByZWZlcmVuY2VzIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGNyZWF0ZS91c2UgaXQKLQkJCQkgKi8KLQkJCQlpZiAoIWRpc2FibGVkVmFsc0J5U291cmNlSWQuY29udGFpbnModm1kLmdldFZhbGlkYXRvcklkKCkpICYmICFkaXNhYmxlZFZhbHNCeUNsYXNzLmNvbnRhaW5zKHZtZC5nZXRWYWxpZGF0b3JDbGFzcygpKSkgewotCQkJCQlpbnQgdmFsaWRhdG9yU2NvcGUgPSB2bWQuZ2V0VmFsaWRhdG9yU2NvcGUoKTsKLQkJCQkJUmVjb25jaWxlU3RlcEZvclZhbGlkYXRvciB2YWxpZGF0b3JTdGVwID0gbnVsbDsKLQkJCQkJLy8gZ2V0IHN0ZXAgZm9yIHBhcnRpdGlvbiB0eXBlCi0JCQkJCU9iamVjdCBvID0gZlZpZFRvVlN0ZXBNYXAuZ2V0KHZtZC5nZXRWYWxpZGF0b3JJZCgpKTsKLQkJCQkJaWYgKG8gIT0gbnVsbCkgewotCQkJCQkJdmFsaWRhdG9yU3RlcCA9IChSZWNvbmNpbGVTdGVwRm9yVmFsaWRhdG9yKSBvOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gaWYgZG9lc24ndCBleGlzdCwgY3JlYXRlIG9uZQotCQkJCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSB2bWQuY3JlYXRlVmFsaWRhdG9yKCk7Ci0KLQkJCQkJCXZhbGlkYXRvclN0ZXAgPSBuZXcgUmVjb25jaWxlU3RlcEZvclZhbGlkYXRvcih2YWxpZGF0b3IsIHZhbGlkYXRvclNjb3BlKTsKLQkJCQkJCXZhbGlkYXRvclN0ZXAuc2V0SW5wdXRNb2RlbChuZXcgRG9jdW1lbnRBZGFwdGVyKGRvYykpOwotCi0JCQkJCQlmVmlkVG9WU3RlcE1hcC5wdXQodm1kLmdldFZhbGlkYXRvcklkKCksIHZhbGlkYXRvclN0ZXApOwotCQkJCQl9Ci0KLQkJCQkJaWYgKCFmVG90YWxTY29wZVZhbGlkYXRvcnNBbHJlYWR5UnVuLmNvbnRhaW5zKHZtZCkpIHsKLQkJCQkJCWFubm90YXRpb25zVG9BZGQuYWRkQWxsKEFycmF5cy5hc0xpc3QodmFsaWRhdG9yU3RlcC5yZWNvbmNpbGUoZHIsIGRyKSkpOwotCQkJCQkJc3RlcHNSYW5PblRoaXNEaXJ0eVJlZ2lvbi5hZGQodmFsaWRhdG9yU3RlcCk7Ci0KLQkJCQkJCWlmICh2YWxpZGF0b3JTY29wZSA9PSBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlRPVEFMKSB7Ci0JCQkJCQkJLy8gbWFyayB0aGlzIHZhbGlkYXRvciBhcyAicnVuIgotCQkJCQkJCWZUb3RhbFNjb3BlVmFsaWRhdG9yc0FscmVhZHlSdW4uYWRkKHZtZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlUZW1wb3JhcnlBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnNUb1JlbW92ZSA9IGdldEFubm90YXRpb25zVG9SZW1vdmUoZHIsIHN0ZXBzUmFuT25UaGlzRGlydHlSZWdpb24pOwotCQlpZiAoYW5ub3RhdGlvbnNUb1JlbW92ZS5sZW5ndGggKyBhbm5vdGF0aW9uc1RvQWRkLnNpemUoKSA+IDApCi0JCQlzbWFydFByb2Nlc3MoYW5ub3RhdGlvbnNUb1JlbW92ZSwgKElSZWNvbmNpbGVSZXN1bHRbXSkgYW5ub3RhdGlvbnNUb0FkZC50b0FycmF5KG5ldyBJUmVjb25jaWxlUmVzdWx0W2Fubm90YXRpb25zVG9BZGQuc2l6ZSgpXSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQkJSXRlcmF0b3IgaXQgPSBmVmlkVG9WU3RlcE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQlJUmVjb25jaWxlU3RlcCBzdGVwID0gbnVsbDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJc3RlcCA9IChJUmVjb25jaWxlU3RlcCkgaXQubmV4dCgpOwotCQkJaWYgKHN0ZXAgaW5zdGFuY2VvZiBJUmVsZWFzYWJsZSkKLQkJCQkoKElSZWxlYXNhYmxlKSBzdGVwKS5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLkFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5I3NldERvY3VtZW50KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkgewotCi0JCXN1cGVyLnNldERvY3VtZW50KGRvY3VtZW50KTsKLQotCQkvLyB2YWxpZGF0b3Igc3RlcHMgYXJlIGluICJmVklkVG9WU3RlcE1hcCIgKGFzIG9wcG9zZWQgdG8gZkZpcnN0U3RlcCA+Ci0JCS8vIG5leHQgc3RlcCBldGMuLi4pCi0JCUl0ZXJhdG9yIGl0ID0gZlZpZFRvVlN0ZXBNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJSVJlY29uY2lsZVN0ZXAgc3RlcCA9IG51bGw7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCXN0ZXAgPSAoSVJlY29uY2lsZVN0ZXApIGl0Lm5leHQoKTsKLQkJCXN0ZXAuc2V0SW5wdXRNb2RlbChuZXcgRG9jdW1lbnRBZGFwdGVyKGRvY3VtZW50KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIElGaWxlIGZyb20gY3VycmVudCBkb2N1bWVudAotCSAqIAotCSAqIEByZXR1cm4gSUZpbGUgdGhlIElGaWxlLCBudWxsIGlmIG5vIHN1Y2ggZmlsZSBleGlzdHMKLQkgKi8KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJCS8vIFRoZSBiYXNlTG9jYXRpb24gbWF5IGJlIGEgcGF0aCBvbiBkaXNrIG9yIHJlbGF0aXZlIHRvIHRoZQotCQkJCS8vIHdvcmtzcGFjZSByb290LiBEb24ndCB0cmFuc2xhdGUgb24tZGlzayBwYXRocyB0bwotCQkJCS8vIGluLXdvcmtzcGFjZSByZXNvdXJjZXMuCi0JCQkJSVBhdGggYmFzZVBhdGggPSBuZXcgUGF0aChiYXNlTG9jYXRpb24pOwotCQkJCWlmIChiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQkJZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShiYXNlUGF0aCk7Ci0JCQkJCS8qCi0JCQkJCSAqIElmIHRoZSBJRmlsZSBkb2Vzbid0ICBleGlzdCwgbWFrZSBzdXJlIGl0J3Mgbm90Ci0JCQkJCSAqIHJldHVybmVkCi0JCQkJCSAqLwotCQkJCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQkJCQlmaWxlID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9ydWxlcy9TdHJ1Y3R1cmVkRG9jdW1lbnREYW1hZ2VyUmVwYWlyZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9ydWxlcy9TdHJ1Y3R1cmVkRG9jdW1lbnREYW1hZ2VyUmVwYWlyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgwNjY3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcnVsZXMvU3RydWN0dXJlZERvY3VtZW50RGFtYWdlclJlcGFpcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5ydWxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuRGVmYXVsdERhbWFnZXJSZXBhaXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlJ1bGVCYXNlZFNjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgYSBwcmVzZW50YXRpb24gZGFtYWdlciBhbmQgcHJlc2VudGF0aW9uIHJlcGFpcmVyLgotICogSXQgdXNlcyBhIExpbmVTdHlsZVByb3ZpZGVyIHRvIHJldHJpZXZlIHRoZSBzdHlsZSByYW5nZXMgYXNzb2NpYXRlZCB3aXRoCi0gKiB0aGUgY2FsY3VsYXRlZCBkYW1hZ2VkIHJlZ2lvbi4KLSAqIAotICogQHNlZSBMaW5lU3R5bGVQcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50RGFtYWdlclJlcGFpcmVyIGV4dGVuZHMgRGVmYXVsdERhbWFnZXJSZXBhaXJlciB7Ci0KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGZQcm92aWRlciA9IG51bGw7Ci0JCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudERhbWFnZXJSZXBhaXJlcigpIHsKLQkJc3VwZXIobmV3IFJ1bGVCYXNlZFNjYW5uZXIoKSk7Ci0JfQotCQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnREYW1hZ2VyUmVwYWlyZXIoTGluZVN0eWxlUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJc3VwZXIobmV3IFJ1bGVCYXNlZFNjYW5uZXIoKSk7Ci0JCWZQcm92aWRlciA9IHByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVByZXNlbnRhdGlvbihUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbiwgSVR5cGVkUmVnaW9uIHJlZ2lvbikgewotCQlpZihmUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlib29sZWFuIGhhbmRsZWQgPSBmUHJvdmlkZXIucHJlcGFyZVJlZ2lvbnMocmVnaW9uLCByZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSwgc3R5bGVzKTsKLQotCQkJZm9yKEl0ZXJhdG9yIGl0ID0gc3R5bGVzLml0ZXJhdG9yKCk7IGhhbmRsZWQgJiYgaXQuaGFzTmV4dCgpOyApCi0JCQkJcHJlc2VudGF0aW9uLmFkZFN0eWxlUmFuZ2UoKFN0eWxlUmFuZ2UpaXQubmV4dCgpKTsKLQkJfQotCQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb3ZpZGVyKExpbmVTdHlsZVByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCWZQcm92aWRlciA9IHByb3ZpZGVyOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvQmFzaWNTZWFyY2hMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0Jhc2ljU2VhcmNoTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzNkNTQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvQmFzaWNTZWFyY2hMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuRWRpdG9yUGx1Z2luSW1hZ2VzOwotCi0KLQotLyoqCi0gKiBCYXNpYyBsYWJlbCBwcm92aWRlciB0aGF0IGp1c3QgcHJvdmlkZXMgYW4gaW1hZ2UgYW5kIGRlZmF1bHQgdGV4dC4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljU2VhcmNoTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyIHsKLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfT0NDX01BVENIKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQotCQlTdHJpbmdCdWZmZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNYXRjaCkgewotCQkJTWF0Y2ggbSA9IChNYXRjaCkgZWxlbWVudDsKLQotCQkJSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgbS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAobWFya2VyLmV4aXN0cygpKSB7Ci0JCQkJU3RyaW5nIHJlc3VsdFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCXRyeSB7Ci0JCQkJCXJlc3VsdFRleHQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJCXRleHQuYXBwZW5kKHJlc3VsdFRleHQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGV4dC5hcHBlbmQoZWxlbWVudC50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gdGV4dC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0Jhc2ljU2VhcmNoUXVlcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvQmFzaWNTZWFyY2hRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTI5YzIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvQmFzaWNTZWFyY2hRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuTmV3U2VhcmNoVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5NYXJrZXJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgQmFzaWNTZWFyY2hRdWVyeSBpbXBsZW1lbnRzIElTZWFyY2hRdWVyeSB7Ci0KLQkvKiogYXR0cmlidXRlIHRvIGlkZW50aWZ5IG1hcmtlcnMgYWRkZWQgYnkgZmluZCBvY2N1cnJlbmNlcyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfT0NDVVJSRU5DRVNfTUFSS0VSID0gIm9jY3VycmVuY2VzX21hcmtlciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGludCBMSU5FX0xFTkdUSF9MSU1JVCA9IDIwMDsKLQotCS8qKiB0aGUgZmlsZSB3ZSdyZSBzZWFyY2hpbmcgKiAqLwotCXByaXZhdGUgSUZpbGUgZkZpbGUgPSBudWxsOwotCS8qKiBvY2N1cnJlbmNlIHNlYXJjaCBtYXRjaGVzICogKi8KLQlwcml2YXRlIExpc3QgZk1hdGNoZXMgPSBudWxsOwotCi0JcHVibGljIEJhc2ljU2VhcmNoUXVlcnkoSUZpbGUgZmlsZSkgewotCQl0aGlzLmZGaWxlID0gZmlsZTsKLQkJdGhpcy5mTWF0Y2hlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRNYXRjaChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBtYXRjaFN0YXJ0LCBpbnQgbWF0Y2hFbmQpIHsKLQotCQl0cnkgewotCQkJaW50IGxpbmVOdW1iZXIgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQobWF0Y2hTdGFydCk7Ci0JCQlpbnQgbGluZVN0YXJ0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyKTsKLQkJCWludCBsaW5lTGVuZ3RoID0gZG9jdW1lbnQuZ2V0TGluZUxlbmd0aChsaW5lTnVtYmVyKTsKLQotCQkJU3RyaW5nIHNlYXJjaFJlc3VsdFN0cmluZyA9IGRvY3VtZW50LmdldCgpLnN1YnN0cmluZyhsaW5lU3RhcnQsIGxpbmVTdGFydCArIGxpbmVMZW5ndGgpLnRyaW0oKTsKLQotCQkJLy8gY3JlYXRlIHNlYXJjaCBtYXJrZXIgKHNvIGFubm90YXRpb25zIHNob3cgdXAgaW4gZWRpdG9yKQotCQkJSU1hcmtlciBtYXJrZXIgPSBjcmVhdGVTZWFyY2hNYXJrZXIobWF0Y2hTdGFydCwgbWF0Y2hFbmQsIGxpbmVOdW1iZXIsIHNlYXJjaFJlc3VsdFN0cmluZyk7Ci0KLQkJCWFkZE1hdGNoKG5ldyBNYXRjaChtYXJrZXIsIE1hdGNoLlVOSVRfQ0hBUkFDVEVSLCBtYXRjaFN0YXJ0LCBtYXRjaFN0YXJ0ICsgbWF0Y2hFbmQpKTsKLQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE1hdGNoKE1hdGNoIG1hdGNoKSB7Ci0JCWlmIChtYXRjaCAhPSBudWxsKQotCQkJdGhpcy5mTWF0Y2hlcy5hZGQobWF0Y2gpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeSNjYW5SZXJ1bigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUmVydW4oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjY2FuUnVuSW5CYWNrZ3JvdW5kKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SdW5JbkJhY2tncm91bmQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyTWF0Y2hlcygpIHsKLQkJdGhpcy5mTWF0Y2hlcy5jbGVhcigpOwotCX0KLQotCXByb3RlY3RlZCBJTWFya2VyIGNyZWF0ZVNlYXJjaE1hcmtlcihpbnQgbWF0Y2hTdGFydCwgaW50IG1hdGNoRW5kLCBpbnQgbGluZU51bWJlciwgU3RyaW5nIHNlYXJjaFJlc3VsdFN0cmluZykgewotCi0JCUlNYXJrZXIgbWFya2VyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChnZXRGaWxlKCkgIT0gbnVsbCkgewotCi0JCQkJbWFya2VyID0gZ2V0RmlsZSgpLmNyZWF0ZU1hcmtlcihOZXdTZWFyY2hVSS5TRUFSQ0hfTUFSS0VSKTsKLQkJCQlIYXNoTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCg2KTsKLQotCQkJCU1hcmtlclV0aWxpdGllcy5zZXRDaGFyU3RhcnQoYXR0cmlidXRlcywgbWF0Y2hTdGFydCk7Ci0JCQkJTWFya2VyVXRpbGl0aWVzLnNldENoYXJFbmQoYXR0cmlidXRlcywgbWF0Y2hFbmQpOwotCQkJCU1hcmtlclV0aWxpdGllcy5zZXRMaW5lTnVtYmVyKGF0dHJpYnV0ZXMsIGxpbmVOdW1iZXIpOwotCi0JCQkJLy8gdGhpcyBtaWdodCBiZSBiYWQgaWYgbGluZSBvZiB0ZXh0IGlzIFZFUlkgbG9uZz8KLQkJCQlpZiAoc2VhcmNoUmVzdWx0U3RyaW5nLmxlbmd0aCgpID4gTElORV9MRU5HVEhfTElNSVQpCi0JCQkJCXNlYXJjaFJlc3VsdFN0cmluZyA9IHNlYXJjaFJlc3VsdFN0cmluZy5zdWJzdHJpbmcoMCwgTElORV9MRU5HVEhfTElNSVQpICsgIi4uLiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlNYXJrZXJVdGlsaXRpZXMuc2V0TWVzc2FnZShhdHRyaWJ1dGVzLCBzZWFyY2hSZXN1bHRTdHJpbmcpOwotCi0JCQkJLy8gc28gd2UgY2FuIHJlbW92ZSB0aGVtIGxhdGVyCi0JCQkJYXR0cmlidXRlcy5wdXQoQVRUUl9PQ0NVUlJFTkNFU19NQVJLRVIsIG5ldyBCb29sZWFuKHRydWUpKTsKLQotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIG1hcmtlcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVsZXRlT2NjdXJyZW5jZXNNYXJrZXJzKCkgewotCi0JCWZpbmFsIExpc3QgcmVtb3ZhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQkvLyBjbGVhciBhbGwgb2xkIGZpbmQgb2NjdXJyZW5jZXMgbWFya2VycwotCQkJSU1hcmtlcltdIHNlYXJjaE1hcmtlcnMgPSBmRmlsZS5maW5kTWFya2VycyhOZXdTZWFyY2hVSS5TRUFSQ0hfTUFSS0VSLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWFyY2hNYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJT2JqZWN0IG8gPSBzZWFyY2hNYXJrZXJzW2ldLmdldEF0dHJpYnV0ZShCYXNpY1NlYXJjaFF1ZXJ5LkFUVFJfT0NDVVJSRU5DRVNfTUFSS0VSKTsKLQkJCQlpZiAobyAhPSBudWxsICYmICgoQm9vbGVhbikgbykuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkKLQkJCQkJcmVtb3ZhbHMuYWRkKHNlYXJjaE1hcmtlcnNbaV0pOwotCi0JCQl9Ci0KLQkJCWlmIChyZW1vdmFscy5zaXplKCkgPiAwKSB7Ci0JCQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZW1vdmFscy5zaXplKCk7IGkrKykKLQkJCQkJCQkoKElNYXJrZXIpIHJlbW92YWxzLmdldChpKSkuZGVsZXRlKCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCS8vIEJVRzE1ODg0NiAtIGRlYWRsb2NrIGlmIGxvY2sgdXAgZW50aXJlIHdvcmtzcGFjZSwgc28gb25seSBsb2NrCi0JCQkJLy8gdXAgdGhlIGZpbGUgd2UgYXJlIHNlYXJjaGluZyBvbgotCQkJCUlTY2hlZHVsaW5nUnVsZSBtYXJrZXJSdWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkubWFya2VyUnVsZShmRmlsZSk7Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgbWFya2VyUnVsZSwgSVdvcmtzcGFjZS5BVk9JRF9VUERBVEUsIG51bGwpOyAKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGFjdXRhbCB3b3JrIG9mIHRoZSBxdWVyeS4gV2lsbCBiZSBydW4gaW4gYSBiYWNrZ3JvdW5kIEpvYgotCSAqIGF1dG9tYXRpY2FsbHkgaWYgY2FuUnVuSW5CYWNrZ3JvdW5kKC4uKSByZXR1cm5zIHRydWUuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIGRvUXVlcnkoKSB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qCi0JICogcHVibGljIHRvIGF2b2lkIHN5bnRoZXRpYyBtZXRob2QgYWNjZXNzIGZyb20gaW5uZXIgY2xhc3MKLQkgKi8KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZkZpbGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldExhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgTWF0Y2hbXSBnZXRNYXRjaGVzKCkgewotCQkvLyBnZXQgcmlkIG9mIHRoZSBvbGQgbWFya2VycwotCQlpZihmRmlsZS5leGlzdHMoKSkgewotCQkJZGVsZXRlT2NjdXJyZW5jZXNNYXJrZXJzKCk7Ci0JCQlkb1F1ZXJ5KCk7Ci0JCX0KLQkJcmV0dXJuIChNYXRjaFtdKSB0aGlzLmZNYXRjaGVzLnRvQXJyYXkobmV3IE1hdGNoW3RoaXMuZk1hdGNoZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldFNlYXJjaFJlc3VsdCgpCi0JICovCi0JcHVibGljIElTZWFyY2hSZXN1bHQgZ2V0U2VhcmNoUmVzdWx0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB1c2VkIGluIHNlYXJjaCByZXN1bHQgZGlzcGxheSBsYWJlbHMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWFyY2hUZXh0KCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gZGVmZXIgdG8gImdldCguLi4pIgotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0ZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0ZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YmI0MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9GaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGxhdGZvcm1TdGF0dXNMaW5lVXRpbDsKLQotLyoqCi0gKiBQZXJmb3JtcyB0aGUgYXBwcm9wcmlhdGUgRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGFjdGlvbiBjYWxsIGJhc2VkIG9uCi0gKiBzZWxlY3Rpb24uIENsaWVudHMgY2FuIGFkZCBwcm9jZXNzb3JzIGZvciBkaWZmZXJlbnQgcGFydGl0aW9ucyB2aWEKLSAqIDxjb2RlPmdldFByb2Nlc3NvcnM8L2NvZGU+Ci0gKiAKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUyLCBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG51bGxpbmcgb3V0IGp1c3QgaW4gY2FzZQotCQlmRWRpdG9yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5GaW5kT2NjdXJyZW5jZXNfbGFiZWwpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJYm9vbGVhbiBva2F5ID0gZmFsc2U7Ci0JCWlmIChmRWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGZFZGl0b3I7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gZ2V0VGV4dFNlbGVjdGlvbih0ZXh0RWRpdG9yKTsKLQkJCQlGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZmluZE9jY3VycmVuY2VQcm9jZXNzb3IgPSBnZXRQcm9jZXNzb3JGb3JDdXJyZW50U2VsZWN0aW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uKTsKLQkJCQlpZiAoZmluZE9jY3VycmVuY2VQcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJCQlpZiAodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJCQkJSUZpbGUgZmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgdGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0JCQkJCQlva2F5ID0gZmluZE9jY3VycmVuY2VQcm9jZXNzb3IuZmluZE9jY3VycmVuY2VzKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uLCBmaWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAob2theSkgewotCQkJLy8gY2xlYXIgc3RhdHVzIG1lc3NhZ2UKLQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gU1NFVUlNZXNzYWdlcy5GaW5kT2NjdXJyZW5jZXNBY3Rpb25Qcm92aWRlcl8wOyAvLyROT04tTkxTLTEkCi0JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuYWRkT25lVGltZUNsZWFyTGlzdGVuZXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIGNsZWFyIHN0YXR1cyBtZXNzYWdlCi0JCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBhcHByb3ByaWF0ZSBmaW5kIG9jY3VycmVuY2VzIHByb2Nlc3NvcgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudCAtCi0JICogICAgICAgICAgICBhc3N1bWVzIG5vdCBudWxsCi0JICogQHBhcmFtIHRleHRTZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yRm9yQ3VycmVudFNlbGVjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJLy8gY2hlY2sgaWYgd2UgaGF2ZSBhbiBhY3Rpb24gdGhhdCdzIGVuYWJsZWQgb24gdGhlIGN1cnJlbnQgcGFydGl0aW9uCi0JCUlUeXBlZFJlZ2lvbiB0ciA9IGdldFBhcnRpdGlvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCVN0cmluZyBwYXJ0aXRpb24gPSB0ciAhPSBudWxsID8gdHIuZ2V0VHlwZSgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlJdGVyYXRvciBpdCA9IGdldFByb2Nlc3NvcnMoKS5pdGVyYXRvcigpOwotCQlGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgYWN0aW9uID0gbnVsbDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJYWN0aW9uID0gKEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcikgaXQubmV4dCgpOwotCQkJLy8gd2UganVzdCBjaG9vc2UgdGhlIGZpcnN0IGFjdGlvbiB0aGF0IGNhbiBoYW5kbGUgdGhlIHBhcnRpdGlvbgotCQkJaWYgKGFjdGlvbi5lbmFibGVkRm9yUGFyaXRpdGlvbihwYXJ0aXRpb24pKQotCQkJCXJldHVybiBhY3Rpb247Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJVHlwZWRSZWdpb24gZ2V0UGFydGl0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJVHlwZWRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaWYgKHRleHRTZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZWdpb24gPSBkb2N1bWVudC5nZXRQYXJ0aXRpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXJlZ2lvbiA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQlwcml2YXRlIElUZXh0U2VsZWN0aW9uIGdldFRleHRTZWxlY3Rpb24oSVRleHRFZGl0b3IgdGV4dEVkaXRvcikgewotCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gbnVsbDsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbiAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQl9Ci0JCXJldHVybiB0ZXh0U2VsZWN0aW9uOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBMaXN0IGdldFByb2Nlc3NvcnMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0ZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzlkMDlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5OZXdTZWFyY2hVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLS8qKgotICogPHA+Ci0gKiBGaW5kcyBvY2N1cnJlbmNlcyBvZiBhIHNwZWNpZmllZCByZWdpb24gdHlwZSB3LyByZWdpb24gdGV4dCBpbiBhbgotICogSVN0cnVjdHVyZWREb2N1bWVudC4gQ2xpZW50cyBtdXN0IGltcGxlbWVudCBnZXRQYXJ0aXRpb25UeXBlcygpIGFuZAotICogZ2V0UmVnaW9uVHlwZXMoKSB0byBpbmRpY2F0ZSB3aGljaCBwYXJ0aXRpb24gdHlwZXMgYW5kIHJlZ2lvbiB0eXBlcyBpdCBjYW4KLSAqIG9wZXJhdGUgb24uCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogQ2xpZW50cyBzaG91bGQgb3ZlcnJpZGUgPGNvZGU+Z2V0U2VhcmNoUXVlcnkoKTwvY29kZT4gaW4gb3JkZXIgdG8gcHJvdmlkZQotICogdGhlaXIgb3duIHR5cGUgb2YgInNlYXJjaCIgKGVnLiBzZWFyY2hpbmcgZm9yIFhNTCBzdGFydCB0YWdzLCBzZWFyY2hpbmcgZm9yCi0gKiBKYXZhIGVsZW1lbnRzLCBldGMuLi4pCi0gKiA8L3A+Ci0gKiAKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciB7Ci0JcHVibGljIGJvb2xlYW4gZmluZE9jY3VycmVuY2VzKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiwgSUZpbGUgZmlsZSkgewotCQlib29sZWFuIGZpbmRPY2N1cnJlbmNlcyA9IGZhbHNlOwotCi0JCS8vIGRldGVybWluZSBpZiBhY3Rpb24gc2hvdWxkIGJlIGVuYWJsZWQgb3Igbm90Ci0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50OwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQkJCWlmIChzZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJSVRleHRSZWdpb24gciA9IHNkUmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCWlmIChyICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHR5cGUgPSByLmdldFR5cGUoKTsKLQkJCQkJaWYgKGVuYWJsZWRGb3JSZWdpb25UeXBlKHR5cGUpKSB7Ci0JCQkJCQlTdHJpbmcgbWF0Y2hUZXh0ID0gc2RSZWdpb24uZ2V0VGV4dChyKTsKLQotCQkJCQkJLy8gZmlyc3Qgb2YgYWxsIGFjdGl2YXRlIHRoZSB2aWV3Ci0JCQkJCQlOZXdTZWFyY2hVSS5hY3RpdmF0ZVNlYXJjaFJlc3VsdFZpZXcoKTsKLQotCQkJCQkJaWYgKG1hdGNoVGV4dCAhPSBudWxsICYmIHR5cGUgIT0gbnVsbCkgewotCQkJCQkJCUlTZWFyY2hRdWVyeSBzZWFyY2hRdWVyeSA9IGdldFNlYXJjaFF1ZXJ5KGZpbGUsIHN0cnVjdHVyZWREb2N1bWVudCwgbWF0Y2hUZXh0LCB0eXBlLCB0ZXh0U2VsZWN0aW9uKTsKLQkJCQkJCQlpZiAoc2VhcmNoUXVlcnkgIT0gbnVsbCkgewotCQkJCQkJCQlpZiAoc2VhcmNoUXVlcnkuY2FuUnVuSW5CYWNrZ3JvdW5kKCkpCi0JCQkJCQkJCQlOZXdTZWFyY2hVSS5ydW5RdWVyeUluQmFja2dyb3VuZChzZWFyY2hRdWVyeSk7Ci0JCQkJCQkJCWVsc2UKLQkJCQkJCQkJCU5ld1NlYXJjaFVJLnJ1blF1ZXJ5SW5Gb3JlZ3JvdW5kKG51bGwsIHNlYXJjaFF1ZXJ5KTsKLQkJCQkJCQl9Ci0JCQkJCQkJZmluZE9jY3VycmVuY2VzID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmluZE9jY3VycmVuY2VzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZWdpb25UeXBlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBjYW4gb3BlcmF0ZSBvbiB0aGlzIHJlZ2lvbgotCSAqICAgICAgICAgdHlwZSAoSVRleHRSZWdpb24pLCBvdGhlcndpc2UgZmFsc2UuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZWRGb3JSZWdpb25UeXBlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0KLQkJU3RyaW5nW10gYWNjZXB0ID0gZ2V0UmVnaW9uVHlwZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY2NlcHQubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChyZWdpb25UeXBlLmVxdWFscyhhY2NlcHRbaV0pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDbGllbnRzIHNob3VsZCBvdmVycmlkZSB0aGlzIHRvIGVuYWJsZSBmaW5kIG9jY3VycmVuY2VzIG9uIGNlcnRhaW4KLQkgKiBwYXJ0aXRpb24ocykuCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIFN0cmluZ1tdIGdldFBhcnRpdGlvblR5cGVzKCk7Ci0KLQkvKioKLQkgKiBDbGllbnRzIHNob3VsZCBvdmVycmlkZSB0aGlzIHRvIGVuYWJsZSBmaW5kIG9jY3VycmVuY2VzIG9uIGRpZmZlcmVudAotCSAqIHJlZ2lvbiB0eXBlKHMpLgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmdbXSBnZXRSZWdpb25UeXBlcygpOwotCi0JLyoqCi0JICogQ2xpZW50cyBzaG91bGQgb3ZlcnJpZGUgdG8gcHJvdmlkZSB0aGVpciBvd24gc2VhcmNoIGZvciB0aGUgZmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSVNlYXJjaFF1ZXJ5IGdldFNlYXJjaFF1ZXJ5KElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyByZWdpb25UZXh0LCBTdHJpbmcgcmVnaW9uVHlwZSwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IE9jY3VycmVuY2VzU2VhcmNoUXVlcnkoZmlsZSwgZG9jdW1lbnQsIHJlZ2lvblRleHQsIHJlZ2lvblR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBjYW4gb3BlcmF0ZSBvbiB0aGlzIHR5cGUgb2YKLQkgKiAgICAgICAgIHBhcnRpdGlvbiwgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlbmFibGVkRm9yUGFyaXRpdGlvbihTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlTdHJpbmdbXSBhY2NlcHQgPSBnZXRQYXJ0aXRpb25UeXBlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFjY2VwdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKHBhcnRpdGlvblR5cGUuZXF1YWxzKGFjY2VwdFtpXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvT2NjdXJyZW5jZXNDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvT2NjdXJyZW5jZXNDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEyNTFmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBPY2N1cnJlbmNlc0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0JcHJpdmF0ZSBPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdCBmUmVzdWx0ID0gbnVsbDsKLQlwcml2YXRlIFRhYmxlVmlld2VyIGZUYWJsZVZpZXdlciA9IG51bGw7Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKHRoaXMuZlJlc3VsdCAhPSBudWxsKQotCQkJdGhpcy5mUmVzdWx0LmNsZWFyTWF0Y2hlcygpOwotCQlpZiAodGhpcy5mVGFibGVWaWV3ZXIgIT0gbnVsbCkKLQkJCXRoaXMuZlRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgZWxlbWVudHNDaGFuZ2VkKE9iamVjdFtdIHVwZGF0ZWRFbGVtZW50cykgewotCi0JCS8vVE9ETzogY29waWVkIGZyb20gSmF2YVNlYXJjaFRhYmxlQ29udGVudFByb3ZpZGVyCi0JCWludCBhZGRDb3VudCA9IDA7Ci0JCWludCByZW1vdmVDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXBkYXRlZEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5mUmVzdWx0LmdldE1hdGNoQ291bnQodXBkYXRlZEVsZW1lbnRzW2ldKSA+IDApIHsKLQkJCQlpZiAodGhpcy5mVGFibGVWaWV3ZXIudGVzdEZpbmRJdGVtKHVwZGF0ZWRFbGVtZW50c1tpXSkgIT0gbnVsbCkKLQkJCQkJdGhpcy5mVGFibGVWaWV3ZXIucmVmcmVzaCh1cGRhdGVkRWxlbWVudHNbaV0pOwotCQkJCWVsc2UKLQkJCQkJdGhpcy5mVGFibGVWaWV3ZXIuYWRkKHVwZGF0ZWRFbGVtZW50c1tpXSk7Ci0JCQkJYWRkQ291bnQrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5mVGFibGVWaWV3ZXIucmVtb3ZlKHVwZGF0ZWRFbGVtZW50c1tpXSk7Ci0JCQkJcmVtb3ZlQ291bnQrKzsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQotCQl0aGlzLmZSZXN1bHQgPSAoT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQpIGlucHV0RWxlbWVudDsKLQkJcmV0dXJuIHRoaXMuZlJlc3VsdC5nZXRNYXRjaGVzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQotCQlpZiAodmlld2VyIGluc3RhbmNlb2YgVGFibGVWaWV3ZXIpCi0JCQl0aGlzLmZUYWJsZVZpZXdlciA9IChUYWJsZVZpZXdlcikgdmlld2VyOwotCQl0aGlzLmZSZXN1bHQgPSAoT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQpIG5ld0lucHV0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0KLQkJaWYgKHRoaXMuZlRhYmxlVmlld2VyICE9IG51bGwpCi0JCQl0aGlzLmZUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9PY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzU2VhcmNoUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxZTQ4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzU2VhcmNoUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLQotLyoqCi0gKiBCYXNpYyBJU2VhcmNoUXVlcnkgdGhhdCBmaW5kcyBtYXRjaGVzIG9mIHJlZ2lvbiB0eXBlIGFuZCByZWdpb24gdGV4dC4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIE9jY3VycmVuY2VzU2VhcmNoUXVlcnkgZXh0ZW5kcyBCYXNpY1NlYXJjaFF1ZXJ5IHsKLQotCS8qKgotCSAqIFdlIG5lZWQgYSBydW5uYWJsZSBzbyB0aGF0IHRoZSBzZWFyY2ggbWFya2VycyBzaG93IHVwIGluIHRoZSBsaXZlCi0JICogZG9jdW1lbnQuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBGaW5kUmVnaW9ucyBpbXBsZW1lbnRzIElXb3Jrc3BhY2VSdW5uYWJsZSB7Ci0KLQkJcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZGaW5kUmVnaW9uc0RvY3VtZW50ID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgZk1hdGNoTmFtZSA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIGZNYXRjaFJlZ2lvblR5cGUgPSBudWxsOwotCi0JCXB1YmxpYyBGaW5kUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgbWF0Y2hUZXh0LCBTdHJpbmcgbWF0Y2hSZWdpb25UeXBlKSB7Ci0KLQkJCXRoaXMuZkZpbmRSZWdpb25zRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJCXRoaXMuZk1hdGNoTmFtZSA9IG1hdGNoVGV4dDsKLQkJCXRoaXMuZk1hdGNoUmVnaW9uVHlwZSA9IG1hdGNoUmVnaW9uVHlwZTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBmaW5kT2NjdXJyZW5jZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJCWlmICghaXNDYW5jZWxlZChtb25pdG9yKSkgewotCi0JCQkJaW50IG1hdGNoU3RhcnQgPSAtMTsKLQkJCQlpbnQgbWF0Y2hFbmQgPSAtMTsKLQkJCQlTdHJpbmcgZmluZFJlZ2lvblRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBudWxsOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudCA9IHRoaXMuZkZpbmRSZWdpb25zRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQkJCS8vIHRoaXMgaXMgdGhlIG1haW4gbG9vcCB0aGF0IGl0ZXJhdGVzIHRoZSBkb2N1bWVudAotCQkJCXdoaWxlIChjdXJyZW50ICE9IG51bGwgJiYgIWlzQ2FuY2VsZWQobW9uaXRvcikpIHsKLQkJCQkJcmVnaW9ucyA9IGN1cnJlbnQuZ2V0UmVnaW9ucygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpICYmICFpc0NhbmNlbGVkKG1vbml0b3IpOyBpKyspIHsKLQotCQkJCQkJciA9IHJlZ2lvbnMuZ2V0KGkpOwotCi0JCQkJCQkvLyBtYXliZSB0aGlzIGlzIHRoZSBlcXVhbHMgY2hlY2sgd2hlcmUgc29tZSB2YWxpZAotCQkJCQkJLy8gbWF0Y2hlcyBhcmUgZmFpbGluZyAobGlrZSBzZWFyY2hpbmcgb24gZW5kIHRhZykKLQkJCQkJCWlmIChyLmdldFR5cGUoKS5lcXVhbHModGhpcy5mTWF0Y2hSZWdpb25UeXBlKSAmJiBjdXJyZW50LmdldFRleHQocikuZXF1YWxzKHRoaXMuZk1hdGNoTmFtZSkpIHsKLQotCQkJCQkJCWZpbmRSZWdpb25UZXh0ID0gY3VycmVudC5nZXRUZXh0KHIpOwotCi0JCQkJCQkJLy8gcmVnaW9uIGZvdW5kCi0JCQkJCQkJbWF0Y2hTdGFydCA9IGN1cnJlbnQuZ2V0U3RhcnRPZmZzZXQocik7Ci0JCQkJCQkJbWF0Y2hFbmQgPSBtYXRjaFN0YXJ0ICsgZmluZFJlZ2lvblRleHQudHJpbSgpLmxlbmd0aCgpOwotCi0JCQkJCQkJYWRkTWF0Y2godGhpcy5mRmluZFJlZ2lvbnNEb2N1bWVudCwgbWF0Y2hTdGFydCwgbWF0Y2hFbmQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWN1cnJlbnQgPSBjdXJyZW50LmdldE5leHQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gaXNDYW5jZWxlZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXJldHVybiBtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJCXRyeSB7Ci0JCQkJZmluZE9jY3VycmVuY2VzKG1vbml0b3IpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gZW5kIGlubmVyIGNsYXNzIEZpbmRSZWdpb25zCi0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZSZWdpb25UZXh0ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmUmVnaW9uVHlwZSA9IG51bGw7Ci0KLQlwdWJsaWMgT2NjdXJyZW5jZXNTZWFyY2hRdWVyeShJRmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcmVnaW9uVGV4dCwgU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJc3VwZXIoZmlsZSk7Ci0JCXRoaXMuZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCXRoaXMuZlJlZ2lvblRleHQgPSByZWdpb25UZXh0OwotCQl0aGlzLmZSZWdpb25UeXBlID0gcmVnaW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXJ1bigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblJ1bkluQmFja2dyb3VuZCgpIHsKLQkJLy8gcGFfVE9ETyBpbnZlc3RpZ2F0ZSB3aGF0IGlzIHJlcXVpcmVkIHRvIGRvIHRoaXMgc2FmZWx5Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkJhc2ljU2VhcmNoUXVlcnkjZG9RdWVyeSgpCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9RdWVyeSgpIHsKLQotCQljbGVhck1hdGNoZXMoKTsKLQotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCUZpbmRSZWdpb25zIGZpbmRSZWdpb25zID0gbmV3IEZpbmRSZWdpb25zKHRoaXMuZkRvY3VtZW50LCB0aGlzLmZSZWdpb25UZXh0LCB0aGlzLmZSZWdpb25UeXBlKTsKLQkJdHJ5IHsKLQkJCS8vIEJVRzE1ODg0NiAtIGRlYWRsb2NrIGlmIGxvY2sgdXAgZW50aXJlIHdvcmtzcGFjZSwgc28gb25seSBsb2NrCi0JCQkvLyB1cCB0aGUgZmlsZSB3ZSBhcmUgc2VhcmNoaW5nIG9uCi0JCQlJU2NoZWR1bGluZ1J1bGUgbWFya2VyUnVsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpLm1hcmtlclJ1bGUoZ2V0RmlsZSgpKTsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4oZmluZFJlZ2lvbnMsIG1hcmtlclJ1bGUsIElXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLCBudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNTRVVJUGx1Z2luLklELCBJU3RhdHVzLk9LLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEZpbGVuYW1lKCkgewotCQlTdHJpbmcgZmlsZW5hbWUgPSBTU0VVSU1lc3NhZ2VzLk9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMjsgLy8kTk9OLU5MUy0xJCAiZmlsZSIKLQkJaWYgKGdldEZpbGUoKSAhPSBudWxsKQotCQkJZmlsZW5hbWUgPSBnZXRGaWxlKCkuZ2V0TmFtZSgpLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBmaWxlbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlTdHJpbmcgbGFiZWwgPSBTU0VVSU1lc3NhZ2VzLk9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMDsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdbXSBhcmdzID0ge2dldFNlYXJjaFRleHQoKSwgZ2V0T2NjdXJyZW5jZXNDb3VudFRleHQoKSwgZ2V0RmlsZW5hbWUoKX07Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChsYWJlbCwgYXJncyk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldE9jY3VycmVuY2VzQ291bnRUZXh0KCkgewotCQlTdHJpbmcgY291bnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBwYV9UT0RPIGR5bmFtaWNhbGx5IGNoYW5nZSBjb3VudAotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JcHVibGljIElTZWFyY2hSZXN1bHQgZ2V0U2VhcmNoUmVzdWx0KCkgewotCQlyZXR1cm4gbmV3IE9jY3VycmVuY2VzU2VhcmNoUmVzdWx0KHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VhcmNoVGV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuZlJlZ2lvblRleHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9PY2N1cnJlbmNlc1NlYXJjaFJlc3VsdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9PY2N1cnJlbmNlc1NlYXJjaFJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjdmNzEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LklFZGl0b3JNYXRjaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUZpbGVNYXRjaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuRWRpdG9yUGx1Z2luSW1hZ2VzOwotCi0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIE9jY3VycmVuY2VzU2VhcmNoUmVzdWx0IGV4dGVuZHMgQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IGltcGxlbWVudHMgSUVkaXRvck1hdGNoQWRhcHRlciwgSUZpbGVNYXRjaEFkYXB0ZXIgewotCi0JcHJpdmF0ZSBJU2VhcmNoUXVlcnkgZlF1ZXJ5ID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIE1hdGNoW10gTk9fTUFUQ0hFUyA9IG5ldyBNYXRjaFswXTsKLQotCXB1YmxpYyBPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdChJU2VhcmNoUXVlcnkgcXVlcnkpIHsKLQkJdGhpcy5mUXVlcnkgPSBxdWVyeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhck1hdGNoZXMoKSB7Ci0JCWlmIChnZXRRdWVyeSgpIGluc3RhbmNlb2YgT2NjdXJyZW5jZXNTZWFyY2hRdWVyeSkKLQkJCSgoT2NjdXJyZW5jZXNTZWFyY2hRdWVyeSkgZ2V0UXVlcnkoKSkuY2xlYXJNYXRjaGVzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5JRWRpdG9yTWF0Y2hBZGFwdGVyI2NvbXB1dGVDb250YWluZWRNYXRjaGVzKG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0KQotCSAqLwotCXB1YmxpYyBNYXRjaFtdIGNvbXB1dGVDb250YWluZWRNYXRjaGVzKEFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCByZXN1bHQsIElFZGl0b3JQYXJ0IGVkaXRvcikgewotCi0JCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQlpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlJRmlsZUVkaXRvcklucHV0IGZpbGVFZGl0b3JJbnB1dCA9IChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dDsKLQkJCXJldHVybiBjb21wdXRlQ29udGFpbmVkTWF0Y2hlcyhyZXN1bHQsIGZpbGVFZGl0b3JJbnB1dC5nZXRGaWxlKCkpOwotCQl9Ci0JCXJldHVybiB0aGlzLk5PX01BVENIRVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5JRmlsZU1hdGNoQWRhcHRlciNjb21wdXRlQ29udGFpbmVkTWF0Y2hlcyhvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSkKLQkgKi8KLQlwdWJsaWMgTWF0Y2hbXSBjb21wdXRlQ29udGFpbmVkTWF0Y2hlcyhBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgcmVzdWx0LCBJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBnZXRNYXRjaGVzKCk7Ci0JfQotCi0JcHVibGljIElFZGl0b3JNYXRjaEFkYXB0ZXIgZ2V0RWRpdG9yTWF0Y2hBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LklGaWxlTWF0Y2hBZGFwdGVyI2dldEZpbGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZShPYmplY3QgZWxlbWVudCkgewotCQkvLyByZXR1cm4gdGhlIGZpbGUgZm9yIHRoZSBtYXRjaAotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImdldCBmaWxlIGZvcjoiK2VsZW1lbnQpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNYXJrZXIpIHsKLQkJCUlSZXNvdXJjZSByID0gKChJTWFya2VyKSBlbGVtZW50KS5nZXRSZXNvdXJjZSgpOwotCQkJaWYgKHIgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCWZpbGUgPSAoSUZpbGUpIHI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JcHVibGljIElGaWxlTWF0Y2hBZGFwdGVyIGdldEZpbGVNYXRjaEFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfT0NDX01BVENIKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGxhYmVsIHNob3dzIHVwIGluIHRoZSBzZWFyY2ggaGlzdG9yeQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBnZXRRdWVyeSgpLmdldExhYmVsKCk7Ci0JfQotCi0JcHVibGljIE1hdGNoW10gZ2V0TWF0Y2hlcygpIHsKLQkJLy8gZW5zdXJlIHRoYXQgcXVlcnkgaXMgZG9uZSBydW5uaW5nCi0JCXJldHVybiAoKE9jY3VycmVuY2VzU2VhcmNoUXVlcnkpIGdldFF1ZXJ5KCkpLmdldE1hdGNoZXMoKTsKLQl9Ci0KLQlwdWJsaWMgSVNlYXJjaFF1ZXJ5IGdldFF1ZXJ5KCkgewotCQlyZXR1cm4gdGhpcy5mUXVlcnk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUb29sdGlwKCkgewotCQlyZXR1cm4gZ2V0TGFiZWwoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LklFZGl0b3JNYXRjaEFkYXB0ZXIjaXNTaG93bkluRWRpdG9yKG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoLAotCSAqICAgICAgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaG93bkluRWRpdG9yKE1hdGNoIG1hdGNoLCBJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9PY2N1cnJlbmNlc1NlYXJjaFZpZXdQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzU2VhcmNoVmlld1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ1NDEzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzU2VhcmNoVmlld1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotLyoqCi0gKiBCYXNlIHBhZ2UgZm9yIE9jY3VycmVuY2VzIGluIGZpbGUgc2VhcmNoIHJlc3VsdHMuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBPY2N1cnJlbmNlc1NlYXJjaFZpZXdQYWdlIGV4dGVuZHMgQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UgewotCi0JcHJpdmF0ZSBPY2N1cnJlbmNlc0NvbnRlbnRQcm92aWRlciBmQ29udGVudFByb3ZpZGVyID0gbnVsbDsKLQotCXB1YmxpYyBPY2N1cnJlbmNlc1NlYXJjaFZpZXdQYWdlKCkgewotCQlzdXBlcihBYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZS5GTEFHX0xBWU9VVF9GTEFUKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlI2NsZWFyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhcigpIHsKLQkJaWYgKHRoaXMuZkNvbnRlbnRQcm92aWRlciAhPSBudWxsKQotCQkJdGhpcy5mQ29udGVudFByb3ZpZGVyLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSNjb25maWd1cmVUYWJsZVZpZXdlcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVRhYmxlVmlld2VyKFRhYmxlVmlld2VyIHZpZXdlcikgewotCi0JCS8vIHBhX1RPRE8gbmVlZCBzb3J0ZXI/Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBCYXNpY1NlYXJjaExhYmVsUHJvdmlkZXIoKSk7Ci0JCXRoaXMuZkNvbnRlbnRQcm92aWRlciA9IG5ldyBPY2N1cnJlbmNlc0NvbnRlbnRQcm92aWRlcigpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHRoaXMuZkNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSNjb25maWd1cmVUcmVlVmlld2VyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVUcmVlVmlld2VyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UjZWxlbWVudHNDaGFuZ2VkKGphdmEubGFuZy5PYmplY3RbXSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbGVtZW50c0NoYW5nZWQoT2JqZWN0W10gb2JqZWN0cykgewotCQlpZiAodGhpcy5mQ29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXRoaXMuZkNvbnRlbnRQcm92aWRlci5lbGVtZW50c0NoYW5nZWQob2JqZWN0cyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JjZVJlZnJlc2goKSB7Ci0JCXRoaXMuZkNvbnRlbnRQcm92aWRlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHJpdmF0ZSBJV29ya2JlbmNoUGFnZSBnZXRBY3RpdmVQYWdlKCkgewotCi0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlI2dldERpc3BsYXllZE1hdGNoZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTWF0Y2hbXSBnZXREaXNwbGF5ZWRNYXRjaGVzKE9iamVjdCBlbGVtZW50KSB7Ci0JCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0yNjQwCi0JCS8vIHdlIG9ubHkgZXZlciBzaG93IG9uZSBhdCBhIHRpbWUsIHRoZSBlbGVtZW50IHBhc3NlZCBpbiBpcyB0aGUgbWF0Y2gKLQkJLy8gc3VwZXIgd2FzIHJldHVybmluZyBudWxsCi0JCXJldHVybiBuZXcgTWF0Y2hbXXsoTWF0Y2gpIGVsZW1lbnR9OwotCX0KLQotCXByaXZhdGUgdm9pZCBzaG93KElNYXJrZXIgbWFya2VyKSB7Ci0KLQkJSVJlc291cmNlIHJlc291cmNlID0gbWFya2VyLmdldFJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsIHx8ICFyZXNvdXJjZS5leGlzdHMoKSkKLQkJCXJldHVybjsKLQotCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gZ2V0QWN0aXZlUGFnZSgpOwotCQl0cnkgewotCQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCi0JCQkJLy8gb3BlbiBlZGl0b3IgaWYgbmVlZGVkCi0JCQkJSURFLm9wZW5FZGl0b3IoZ2V0QWN0aXZlUGFnZSgpLCBtYXJrZXIpOwotCi0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gYWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJSUdvdG9NYXJrZXIgZ290b01hcmtlciA9IChJR290b01hcmtlcikgZWRpdG9yLmdldEFkYXB0ZXIoSUdvdG9NYXJrZXIuY2xhc3MpOwotCQkJCQlpZiAoZ290b01hcmtlciAhPSBudWxsKQotCQkJCQkJZ290b01hcmtlci5nb3RvTWFya2VyKG1hcmtlcik7Ci0JCQkJfQotCi0JCQl9Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIHBvc3NpYmxlIGV4Y2VwdGlvbiB0cnlpbmcgdG8gb3BlbiBlZGl0b3IKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlI3Nob3dNYXRjaChvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaCwKLQkgKiAgICAgIGludCwgaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dNYXRjaChNYXRjaCBtYXRjaCwgaW50IGN1cnJlbnRPZmZzZXQsIGludCBjdXJyZW50TGVuZ3RoKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlPYmplY3QgbyA9IG1hdGNoLmdldEVsZW1lbnQoKTsKLQkJaWYgKG8gaW5zdGFuY2VvZiBJTWFya2VyKSB7Ci0JCQlzaG93KChJTWFya2VyKSBvKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU2VsZWN0aW9uSGlzdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TZWxlY3Rpb25IaXN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YTg4NTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TZWxlY3Rpb25IaXN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb25IaXN0b3J5IHsKLQlwcml2YXRlIElUZXh0RWRpdG9yIGZFZGl0b3I7Ci0JcHJpdmF0ZSBMaXN0IGZIaXN0b3J5OwotCXByaXZhdGUgTGlzdCBmSGlzdG9yeUFjdGlvbnM7Ci0JcHJpdmF0ZSBpbnQgZlNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyQ291bnRlcjsKLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgZlNlbGVjdGlvbkxpc3RlbmVyOwotCi0JcHVibGljIFNlbGVjdGlvbkhpc3RvcnkoSVRleHRFZGl0b3IgZWRpdG9yKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoZWRpdG9yKTsKLQkJZkVkaXRvciA9IGVkaXRvcjsKLQkJZkhpc3RvcnkgPSBuZXcgQXJyYXlMaXN0KDMpOwotCQlmU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGZTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckNvdW50ZXIgPT0gMCkKLQkJCQkJZmx1c2goKTsKLQkJCX0KLQkJfTsKLQkJZkVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmU2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZlNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJZkVkaXRvciA9IG51bGw7Ci0JCWlmIChmSGlzdG9yeSAhPSBudWxsICYmICFmSGlzdG9yeS5pc0VtcHR5KCkpIHsKLQkJCWZIaXN0b3J5LmNsZWFyKCk7Ci0JCX0KLQkJaWYgKGZIaXN0b3J5QWN0aW9ucyAhPSBudWxsICYmICFmSGlzdG9yeUFjdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQlmSGlzdG9yeUFjdGlvbnMuY2xlYXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZsdXNoKCkgewotCQlpZiAoZkhpc3RvcnkuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlmSGlzdG9yeS5jbGVhcigpOwotCQl1cGRhdGVIaXN0b3J5QWN0aW9uKCk7Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0TGFzdCgpIHsKLQkJaWYgKGlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgc2l6ZSA9IGZIaXN0b3J5LnNpemUoKTsKLQkJSVJlZ2lvbiByZXN1bHQgPSAoSVJlZ2lvbikgZkhpc3RvcnkucmVtb3ZlKHNpemUgLSAxKTsKLQkJdXBkYXRlSGlzdG9yeUFjdGlvbigpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIGlnbm9yZVNlbGVjdGlvbkNoYW5nZXMoKSB7Ci0JCWZTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckNvdW50ZXIrKzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gZkhpc3RvcnkuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RlblRvU2VsZWN0aW9uQ2hhbmdlcygpIHsKLQkJZlNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyQ291bnRlci0tOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbWVtYmVyKElSZWdpb24gcmVnaW9uKSB7Ci0JCWZIaXN0b3J5LmFkZChyZWdpb24pOwotCQl1cGRhdGVIaXN0b3J5QWN0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SGlzdG9yeUFjdGlvbihJQWN0aW9uIGFjdGlvbikgewotCQlBc3NlcnQuaXNOb3ROdWxsKGFjdGlvbik7Ci0JCQotCQlpZiAoZkhpc3RvcnlBY3Rpb25zID09IG51bGwpCi0JCQlmSGlzdG9yeUFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghZkhpc3RvcnlBY3Rpb25zLmNvbnRhaW5zKGFjdGlvbikpCi0JCQlmSGlzdG9yeUFjdGlvbnMuYWRkKGFjdGlvbik7Ci0JCQotCQkvLyB1cGRhdGUgYWN0aW9uCi0JCWlmIChmSGlzdG9yeSAhPSBudWxsICYmICFmSGlzdG9yeS5pc0VtcHR5KCkpCi0JCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJZWxzZQotCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVIaXN0b3J5QWN0aW9uKCkgewotCQlpZiAoZkhpc3RvcnlBY3Rpb25zICE9IG51bGwgJiYgIWZIaXN0b3J5QWN0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCWJvb2xlYW4gZW5hYmxlZCA9IGZhbHNlOwotCQkJaWYgKGZIaXN0b3J5ICE9IG51bGwgJiYgIWZIaXN0b3J5LmlzRW1wdHkoKSkKLQkJCQllbmFibGVkID0gdHJ1ZTsKLQotCQkJSXRlcmF0b3IgaXRlciA9IGZIaXN0b3J5QWN0aW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJKChJQWN0aW9uKWl0ZXIubmV4dCgpKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVTZWxlY3RBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlU2VsZWN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMjdkMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVTZWxlY3RBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHVzZSBTdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGUgaW5zdGVhZAotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdHJ1Y3R1cmVTZWxlY3RBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBmRWRpdG9yID0gbnVsbDsKLQlwcm90ZWN0ZWQgU2VsZWN0aW9uSGlzdG9yeSBmSGlzdG9yeTsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBmTW9kZWwgPSBudWxsOwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBmVmlld2VyID0gbnVsbDsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVTZWxlY3RBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChlZGl0b3IpOwotCQlmRWRpdG9yID0gZWRpdG9yOwotCQlmSGlzdG9yeSA9IChTZWxlY3Rpb25IaXN0b3J5KSBlZGl0b3IuZ2V0QWRhcHRlcihTZWxlY3Rpb25IaXN0b3J5LmNsYXNzKTsKLQkJZlZpZXdlciA9IGVkaXRvci5nZXRUZXh0Vmlld2VyKCk7Ci0JCWZNb2RlbCA9IGVkaXRvci5nZXRNb2RlbCgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGZWaWV3ZXIpOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEN1cnNvckluZGV4ZWRSZWdpb24oKTsKLQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEluZGV4ZWRSZWdpb24oaW50IG9mZnNldCkgewotCQlJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24gPSBudWxsOwotCi0JCWludCBsYXN0T2Zmc2V0ID0gb2Zmc2V0OwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBmRWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChmRWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGxhc3RPZmZzZXQpOwotCQkJCXdoaWxlIChpbmRleGVkUmVnaW9uID09IG51bGwgJiYgbGFzdE9mZnNldCA+PSAwKSB7Ci0JCQkJCWxhc3RPZmZzZXQtLTsKLQkJCQkJaW5kZXhlZFJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24obGFzdE9mZnNldCk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5kZXhlZFJlZ2lvbjsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgUmVnaW9uIGdldE5ld1NlbGVjdGlvblJlZ2lvbihOb2RlIG5vZGUsIFJlZ2lvbiByZWdpb24pOwotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlSZWdpb24gY3VycmVudFJlZ2lvbiA9IG5ldyBSZWdpb24oZlZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCkueCwgZlZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCkueSk7Ci0JCWlmIChjdXJyZW50UmVnaW9uLmdldExlbmd0aCgpID09IGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKSkKLQkJCXJldHVybjsKLQotCQlJbmRleGVkUmVnaW9uIGN1cnNvckluZGV4ZWRSZWdpb24gPSBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKCk7Ci0JCWlmIChjdXJzb3JJbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBjdXJzb3JOb2RlID0gKE5vZGUpIGN1cnNvckluZGV4ZWRSZWdpb247Ci0KLQkJCS8vIHVzZSBwYXJlbnQgbm9kZSBmb3IgZW1wdHkgdGV4dCBub2RlCi0JCQlpZiAoY3Vyc29yTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIGN1cnNvck5vZGUuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQljdXJzb3JOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQlpZiAoY3Vyc29yTm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pCi0JCQkJCWN1cnNvckluZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgY3Vyc29yTm9kZTsKLQkJCX0KLQotCQkJUmVnaW9uIGN1cnNvck5vZGVSZWdpb24gPSBuZXcgUmVnaW9uKGN1cnNvckluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgY3Vyc29ySW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIGN1cnNvckluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0KLQkJCVJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQkJaWYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPj0gY3VycmVudFJlZ2lvbi5nZXRPZmZzZXQoKSAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpIDw9IGN1cnJlbnRSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJyZW50UmVnaW9uLmdldExlbmd0aCgpICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpID49IGN1cnJlbnRSZWdpb24uZ2V0T2Zmc2V0KCkgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPD0gY3VycmVudFJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnJlbnRSZWdpb24uZ2V0TGVuZ3RoKCkpCi0JCQkJbmV3UmVnaW9uID0gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKGN1cnNvck5vZGUsIGN1cnJlbnRSZWdpb24pOwotCQkJZWxzZQotCQkJCW5ld1JlZ2lvbiA9IGN1cnNvck5vZGVSZWdpb247Ci0KLQkJCWlmIChuZXdSZWdpb24gIT0gbnVsbCkgewotCQkJCWZIaXN0b3J5LnJlbWVtYmVyKGN1cnJlbnRSZWdpb24pOwotCQkJCXRyeSB7Ci0JCQkJCWZIaXN0b3J5Lmlnbm9yZVNlbGVjdGlvbkNoYW5nZXMoKTsKLQkJCQkJZkVkaXRvci5zZWxlY3RBbmRSZXZlYWwobmV3UmVnaW9uLmdldE9mZnNldCgpLCBuZXdSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJZkhpc3RvcnkubGlzdGVuVG9TZWxlY3Rpb25DaGFuZ2VzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZVNlbGVjdEhpc3RvcnlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAzN2M1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZVNlbGVjdEhpc3RvcnlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZVNlbGVjdEhpc3RvcnlBY3Rpb24gZXh0ZW5kcyBTdHJ1Y3R1cmVTZWxlY3RBY3Rpb24gaW1wbGVtZW50cyBJVXBkYXRlIHsKLQlwdWJsaWMgU3RydWN0dXJlU2VsZWN0SGlzdG9yeUFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yKTsKLQkJc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWwpOyAvLyROT04tTkxTLTEkCi0JCXNldFRvb2xUaXBUZXh0KFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfZGVzY3JpcHRpb24pOyAvLyROT04tTkxTLTEkCi0KLQkJdXBkYXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24oTm9kZSBub2RlLCBSZWdpb24gcmVnaW9uKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSVJlZ2lvbiBvbGQgPSBmSGlzdG9yeS5nZXRMYXN0KCk7Ci0JCWlmIChvbGQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlmSGlzdG9yeS5pZ25vcmVTZWxlY3Rpb25DaGFuZ2VzKCk7Ci0JCQkJZkVkaXRvci5zZWxlY3RBbmRSZXZlYWwob2xkLmdldE9mZnNldCgpLCBvbGQuZ2V0TGVuZ3RoKCkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmSGlzdG9yeS5saXN0ZW5Ub1NlbGVjdGlvbkNoYW5nZXMoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc2V0RW5hYmxlZCghZkhpc3RvcnkuaXNFbXB0eSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJkZjRhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZSwgSUFjdGlvbkRlbGVnYXRlMiwgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yOwotCXByaXZhdGUgU2VsZWN0aW9uSGlzdG9yeSBmSGlzdG9yeTsKLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZFZGl0b3IgPSBudWxsOwotCQlmSGlzdG9yeSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGZFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZkVkaXRvcjsKLQotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJLy8gZGV0ZXJtaW5lIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24KLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbiAmJiBkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCi0JCQkJaWYgKHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgPCBkb2N1bWVudC5nZXRMZW5ndGgoKSkgewotCQkJCQkvLyBnZXQgY3VycmVudCBpbmRleGVkIHJlZ2lvbgotCQkJCQlJbmRleGVkUmVnaW9uIGN1cnNvckluZGV4ZWRSZWdpb24gPSBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uKTsKLQotCQkJCQkvLyBkZXRlcm1pbmUgbmV3IHNlbGVjdGlvbiBiYXNlZCBvbiBjdXJyZW50IGluZGV4ZWQgcmVnaW9uCi0JCQkJCVJlZ2lvbiBuZXdTZWxlY3Rpb25SZWdpb24gPSBnZXROZXdTZWxlY3Rpb25SZWdpb24oY3Vyc29ySW5kZXhlZFJlZ2lvbiwgdGV4dFNlbGVjdGlvbik7Ci0KLQkJCQkJLy8gc2VsZWN0IG5ldyBzZWxlY3Rpb24KLQkJCQkJaWYgKG5ld1NlbGVjdGlvblJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlmSGlzdG9yeS5yZW1lbWJlcihuZXcgUmVnaW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZkhpc3RvcnkuaWdub3JlU2VsZWN0aW9uQ2hhbmdlcygpOwotCQkJCQkJCXRleHRFZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKG5ld1NlbGVjdGlvblJlZ2lvbi5nZXRPZmZzZXQoKSwgbmV3U2VsZWN0aW9uUmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCX0KLQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCWZIaXN0b3J5Lmxpc3RlblRvU2VsZWN0aW9uQ2hhbmdlcygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJQWN0aW9uIGFjdGlvbiwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCWZFZGl0b3IgPSB0YXJnZXRFZGl0b3I7Ci0JCWlmIChmRWRpdG9yICE9IG51bGwpCi0JCQlmSGlzdG9yeSA9IChTZWxlY3Rpb25IaXN0b3J5KSBmRWRpdG9yLmdldEFkYXB0ZXIoU2VsZWN0aW9uSGlzdG9yeS5jbGFzcyk7Ci0JCWVsc2UKLQkJCWZIaXN0b3J5ID0gbnVsbDsKLQl9Ci0JCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pOwotCQotCWFic3RyYWN0IHByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbik7Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBwcm9iYWJseSBiZSByZW1vdmVkIGFuZCByZXBsYWNlZCBieSB1c2luZyBuZXcgc2VsZWN0aW9uIHByb3ZpZGVyCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHBhcmFtIG9mZnNldAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRJbmRleGVkUmVnaW9uKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgewotCQlJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24gPSBudWxsOwotCi0JCWludCBsYXN0T2Zmc2V0ID0gb2Zmc2V0OwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGxhc3RPZmZzZXQpOwotCQkJCXdoaWxlIChpbmRleGVkUmVnaW9uID09IG51bGwgJiYgbGFzdE9mZnNldCA+PSAwKSB7Ci0JCQkJCWxhc3RPZmZzZXQtLTsKLQkJCQkJaW5kZXhlZFJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24obGFzdE9mZnNldCk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5kZXhlZFJlZ2lvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdEhpc3RvcnlBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0SGlzdG9yeUFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZGM1YzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0SGlzdG9yeUFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotCi0vKioKLSAqIFNlbGVjdGlvbiBoaXN0b3J5IGFjdGlvbiBkZWxlZ2F0ZS4gS2VlcHMgdHJhY2sgb2Ygc2VsZWN0aW9uIHdpdGhpbiBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkU2VsZWN0SGlzdG9yeUFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUyLCBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0JcHJpdmF0ZSBTZWxlY3Rpb25IaXN0b3J5IGZIaXN0b3J5OwotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZkVkaXRvciA9IG51bGw7Ci0JCWZIaXN0b3J5ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcCk7Ci0JCQlhY3Rpb24uc2V0RGVzY3JpcHRpb24oU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2Rlc2NyaXB0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlJUmVnaW9uIG9sZCA9IGZIaXN0b3J5LmdldExhc3QoKTsKLQkJaWYgKG9sZCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZIaXN0b3J5Lmlnbm9yZVNlbGVjdGlvbkNoYW5nZXMoKTsKLQkJCQlpZiAoZkVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJCQkoKElUZXh0RWRpdG9yKSBmRWRpdG9yKS5zZWxlY3RBbmRSZXZlYWwob2xkLmdldE9mZnNldCgpLCBvbGQuZ2V0TGVuZ3RoKCkpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJZkhpc3RvcnkubGlzdGVuVG9TZWxlY3Rpb25DaGFuZ2VzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bihhY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCQlpZiAoZkVkaXRvciAhPSBudWxsKQotCQkJZkhpc3RvcnkgPSAoU2VsZWN0aW9uSGlzdG9yeSkgZkVkaXRvci5nZXRBZGFwdGVyKFNlbGVjdGlvbkhpc3RvcnkuY2xhc3MpOwotCQllbHNlCi0JCQlmSGlzdG9yeSA9IG51bGw7Ci0JCWlmIChmSGlzdG9yeSAhPSBudWxsKSB7Ci0JCQlmSGlzdG9yeS5zZXRIaXN0b3J5QWN0aW9uKGFjdGlvbik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc3BlbGxpbmcvU3BlbGxjaGVja1N0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc3BlbGxpbmcvU3BlbGxjaGVja1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ODEzM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NwZWxsaW5nL1NwZWxsY2hlY2tTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zcGVsbGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uTW9kZWxFeHRlbnNpb24yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LkVkaXRvcnNVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnNwZWxsaW5nLklTcGVsbGluZ1Byb2JsZW1Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5zcGVsbGluZy5TcGVsbGluZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5zcGVsbGluZy5TcGVsbGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5zcGVsbGluZy5TcGVsbGluZ1Byb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5zcGVsbGluZy5TcGVsbGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Gb3JlaWduUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5FeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlJlY29uY2lsZUFubm90YXRpb25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuU3RydWN0dXJlZFJlY29uY2lsZVN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuU3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlRlbXBvcmFyeUFubm90YXRpb247Ci0KLS8qKgotICogQSByZWNvbmNpbGluZyBzdHJhdGVneSB0aGF0IHF1ZXJpZXMgdGhlIFNwZWxsaW5nU2VydmljZSB1c2luZyBpdHMgZGVmYXVsdAotICogZW5naW5lLiBSZXN1bHRzIGFyZSBzaG93IGFzIHRlbXBvcmFyeSBhbm5vdGF0aW9ucy4KLSAqIAotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgU3BlbGxjaGVja1N0cmF0ZWd5IGV4dGVuZHMgU3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5IHsKLQotCWNsYXNzIFNwZWxsQ2hlY2tQcmVmZXJlbmNlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBpc0ludGVyZXN0aW5nUHJvcGVydHkoT2JqZWN0IHByb3BlcnR5KSB7Ci0JCQlyZXR1cm4gU3BlbGxpbmdTZXJ2aWNlLlBSRUZFUkVOQ0VfU1BFTExJTkdfRU5BQkxFRC5lcXVhbHMocHJvcGVydHkpIHx8IFNwZWxsaW5nU2VydmljZS5QUkVGRVJFTkNFX1NQRUxMSU5HX0VOR0lORS5lcXVhbHMocHJvcGVydHkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJaWYgKGlzSW50ZXJlc3RpbmdQcm9wZXJ0eShldmVudC5nZXRQcm9wZXJ0eSgpKSkgewotCQkJCWlmIChldmVudC5nZXRPbGRWYWx1ZSgpID09IG51bGwgfHwgZXZlbnQuZ2V0TmV3VmFsdWUoKSA9PSBudWxsIHx8ICFldmVudC5nZXROZXdWYWx1ZSgpLmVxdWFscyhldmVudC5nZXRPbGRWYWx1ZSgpKSkgewotCQkJCQlyZWNvbmNpbGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFNwZWxsaW5nUHJvYmxlbUNvbGxlY3RvciBpbXBsZW1lbnRzIElTcGVsbGluZ1Byb2JsZW1Db2xsZWN0b3IgewotCQlMaXN0IGFubm90YXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXB1YmxpYyB2b2lkIGFjY2VwdChTcGVsbGluZ1Byb2JsZW0gcHJvYmxlbSkgewotCQkJaWYgKGlzSW50ZXJlc3RpbmdQcm9ibGVtKHByb2JsZW0pKSB7Ci0JCQkJVGVtcG9yYXJ5QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbmV3IFRlbXBvcmFyeUFubm90YXRpb24obmV3IFBvc2l0aW9uKHByb2JsZW0uZ2V0T2Zmc2V0KCksIHByb2JsZW0uZ2V0TGVuZ3RoKCkpLCBTcGVsbGluZ0Fubm90YXRpb24uVFlQRSwgcHJvYmxlbS5nZXRNZXNzYWdlKCksIGZSZWNvbmNpbGVBbm5vdGF0aW9uS2V5KTsKLQotCQkJCVNwZWxsaW5nUXVpY2tBc3Npc3RQcm9jZXNzb3IgcXVpY2tBc3Npc3RQcm9jZXNzb3IgPSBuZXcgU3BlbGxpbmdRdWlja0Fzc2lzdFByb2Nlc3NvcigpOwotCQkJCXF1aWNrQXNzaXN0UHJvY2Vzc29yLnNldFNwZWxsaW5nUHJvYmxlbShwcm9ibGVtKTsKLQkJCQlhbm5vdGF0aW9uLnNldEFkZGl0aW9uYWxGaXhJbmZvKHF1aWNrQXNzaXN0UHJvY2Vzc29yKTsKLQkJCQlhbm5vdGF0aW9ucy5hZGQoYW5ub3RhdGlvbik7Ci0JCQkJaWYgKF9ERUJVR19TUEVMTElOR19QUk9CTEVNUykgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBwcm9ibGVtLmdldE1lc3NhZ2UoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYmVnaW5Db2xsZWN0aW5nKCkgewotCQl9Ci0KLQkJdm9pZCBjbGVhcigpIHsKLQkJCWFubm90YXRpb25zLmNsZWFyKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlbmRDb2xsZWN0aW5nKCkgewotCQl9Ci0KLQkJQW5ub3RhdGlvbltdIGdldEFubm90YXRpb25zKCkgewotCQkJcmV0dXJuIChBbm5vdGF0aW9uW10pIGFubm90YXRpb25zLnRvQXJyYXkobmV3IEFubm90YXRpb25bYW5ub3RhdGlvbnMuc2l6ZSgpXSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIF9ERUJVR19TUEVMTElORyA9IEJvb2xlYW4udmFsdWVPZihQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWNvbmNpbGVyU3BlbGxpbmciKSkuYm9vbGVhblZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIF9ERUJVR19TUEVMTElOR19QUk9CTEVNUyA9IEJvb2xlYW4udmFsdWVPZihQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWNvbmNpbGVyU3BlbGxpbmcvc2hvd1Byb2JsZW1zIikpLmJvb2xlYW5WYWx1ZSgpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5ERURfQlVJTERFUl9UWVBFX0NPTlRFWFRTID0gInNwZWxsaW5ncmVnaW9ucyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlRFTlRfVFlQRSA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlbXAuc3BlbGxpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBmQ29udGVudFR5cGVJZCA9IG51bGw7Ci0KLQlwcml2YXRlIFNwZWxsaW5nUHJvYmxlbUNvbGxlY3RvciBmUHJvYmxlbUNvbGxlY3RvciA9IG5ldyBTcGVsbGluZ1Byb2JsZW1Db2xsZWN0b3IoKTsKLQotCS8qCi0JICogS2V5aW5nIG91ciBUZW1wb3JhcnkgQW5ub3RhdGlvbnMgYmFzZWQgb24gdGhlIHBhcnRpdGlvbiBkb2Vzbid0IGhlbHAKLQkgKiB0aGlzIHN0cmF0ZWd5IHRvIG9ubHkgcmVtb3ZlIGl0cyBvd24gVGVtcG9yYXJ5QW5ub3RhdGlvbnMgc2luY2UgaXQncwotCSAqIHBvc3NpYmx5IHJ1biBvbiBhbGwgcGFydGl0aW9ucy4gSW5zdGVhZCwgc2V0IHRoZSBrZXkgdG8gdXNlIGFuCi0JICogYXJiaXRyYXJ5IHBhcnRpdGlvbiB0eXBlIHRoYXQgd2UgY2FuIGNoZWNrIGZvciB1c2luZyBvdXIgb3duCi0JICogaW1wbGVtZW50YXRpb24gb2YgZ2V0QW5ub3RhdGlvbnNUb1JlbW92ZShEaXJ0eVJlZ2lvbikuCi0JICovCi0JUmVjb25jaWxlQW5ub3RhdGlvbktleSBmUmVjb25jaWxlQW5ub3RhdGlvbktleTsKLQotCXByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZlNwZWxsQ2hlY2tQcmVmZXJlbmNlTGlzdGVuZXI7Ci0KLQlwcml2YXRlIFNwZWxsaW5nQ29udGV4dCBmU3BlbGxpbmdDb250ZXh0OwotCi0JcHJpdmF0ZSBTdHJpbmdbXSBmU3VwcG9ydGVkVGV4dFJlZ2lvbkNvbnRleHRzOwotCXByaXZhdGUgSVJlY29uY2lsZVN0ZXAgZlNwZWxsaW5nU3RlcCA9IG5ldyBTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcCgpIHsKLQl9OwotCi0JcHVibGljIFNwZWxsY2hlY2tTdHJhdGVneShJU291cmNlVmlld2VyIHZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJc3VwZXIodmlld2VyKTsKLQkJZkNvbnRlbnRUeXBlSWQgPSBjb250ZW50VHlwZUlkOwotCi0JCWZTcGVsbGluZ0NvbnRleHQgPSBuZXcgU3BlbGxpbmdDb250ZXh0KCk7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGZDb250ZW50VHlwZUlkKTsKLQkJZlNwZWxsaW5nQ29udGV4dC5zZXRDb250ZW50VHlwZShjb250ZW50VHlwZSk7Ci0JCWZSZWNvbmNpbGVBbm5vdGF0aW9uS2V5ID0gbmV3IFJlY29uY2lsZUFubm90YXRpb25LZXkoZlNwZWxsaW5nU3RlcCwgS0VZX0NPTlRFTlRfVFlQRSwgUmVjb25jaWxlQW5ub3RhdGlvbktleS5QQVJUSUFMKTsKLQotCQkvKioKLQkJICogSW5oZXJpdCBzcGVsbGluZyByZWdpb24gcnVsZXMKLQkJICovCi0JCUxpc3QgY29udGV4dHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlDb250ZW50VHlwZSB0ZXN0VHlwZSA9IGNvbnRlbnRUeXBlOwotCQl3aGlsZSAodGVzdFR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nW10gdGV4dFJlZ2lvbkNvbnRleHRzID0gRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpLmdldERlZmluaXRpb25zKEVYVEVOREVEX0JVSUxERVJfVFlQRV9DT05URVhUUywgdGVzdFR5cGUuZ2V0SWQoKSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHRleHRSZWdpb25Db250ZXh0cy5sZW5ndGg7IGorKykgewotCQkJCWNvbnRleHRzLmFkZEFsbChBcnJheXMuYXNMaXN0KFN0cmluZ1V0aWxzLnVucGFjayh0ZXh0UmVnaW9uQ29udGV4dHNbal0pKSk7Ci0JCQl9Ci0JCQl0ZXN0VHlwZSA9IHRlc3RUeXBlLmdldEJhc2VUeXBlKCk7Ci0JCX0KLQkJZlN1cHBvcnRlZFRleHRSZWdpb25Db250ZXh0cyA9IChTdHJpbmdbXSkgY29udGV4dHMudG9BcnJheShuZXcgU3RyaW5nW2NvbnRleHRzLnNpemUoKV0pOwotCi0JCWZTcGVsbENoZWNrUHJlZmVyZW5jZUxpc3RlbmVyID0gbmV3IFNwZWxsQ2hlY2tQcmVmZXJlbmNlTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc1N0ZXAoSVJlY29uY2lsZVN0ZXAgc3RlcCkgewotCQlyZXR1cm4gZlNwZWxsaW5nU3RlcC5lcXVhbHMoc3RlcCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlUmVjb25jaWxlU3RlcHMoKSB7Ci0KLQl9Ci0KLQlwcml2YXRlIFRlbXBvcmFyeUFubm90YXRpb25bXSBnZXRTcGVsbGluZ0Fubm90YXRpb25zVG9SZW1vdmUoSVJlZ2lvbiByZWdpb24pIHsKLQkJTGlzdCB0b1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUFubm90YXRpb25Nb2RlbCBhbm5vdGF0aW9uTW9kZWwgPSBnZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQkJLy8gY2FuIGJlIG51bGwgd2hlbiBjbG9zaW5nIHRoZSBlZGl0b3IKLQkJaWYgKGFubm90YXRpb25Nb2RlbCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpID0gbnVsbDsKLQkJCWJvb2xlYW4gYW5ub3RhdGlvbk92ZXJsYXBzID0gZmFsc2U7Ci0JCQlpZiAoYW5ub3RhdGlvbk1vZGVsIGluc3RhbmNlb2YgSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbjIpIHsKLQkJCQlpID0gKChJQW5ub3RhdGlvbk1vZGVsRXh0ZW5zaW9uMikgYW5ub3RhdGlvbk1vZGVsKS5nZXRBbm5vdGF0aW9uSXRlcmF0b3IocmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCksIHRydWUsIHRydWUpOwotCQkJCWFubm90YXRpb25PdmVybGFwcyA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpID0gYW5ub3RhdGlvbk1vZGVsLmdldEFubm90YXRpb25JdGVyYXRvcigpOwotCQkJfQotCi0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0JCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgVGVtcG9yYXJ5QW5ub3RhdGlvbikpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJVGVtcG9yYXJ5QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFRlbXBvcmFyeUFubm90YXRpb24pIG9iajsKLQkJCQlSZWNvbmNpbGVBbm5vdGF0aW9uS2V5IGtleSA9IChSZWNvbmNpbGVBbm5vdGF0aW9uS2V5KSBhbm5vdGF0aW9uLmdldEtleSgpOwotCi0JCQkJLy8gdGhlbiBpZiB0aGlzIHN0cmF0ZWd5IGtub3dzIGhvdyB0byBhZGQvcmVtb3ZlIHRoaXMKLQkJCQkvLyBwYXJ0aXRpb24gdHlwZQotCQkJCWlmIChrZXkgIT0gbnVsbCAmJiBrZXkuZXF1YWxzKGZSZWNvbmNpbGVBbm5vdGF0aW9uS2V5KSkgewotCQkJCQlpZiAoa2V5LmdldFNjb3BlKCkgPT0gUmVjb25jaWxlQW5ub3RhdGlvbktleS5QQVJUSUFMICYmIChhbm5vdGF0aW9uT3ZlcmxhcHMgfHwgYW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLm92ZXJsYXBzV2l0aChyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSkpKSB7Ci0JCQkJCQl0b1JlbW92ZS5hZGQoYW5ub3RhdGlvbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoa2V5LmdldFNjb3BlKCkgPT0gUmVjb25jaWxlQW5ub3RhdGlvbktleS5UT1RBTCkgewotCQkJCQkJdG9SZW1vdmUuYWRkKGFubm90YXRpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChUZW1wb3JhcnlBbm5vdGF0aW9uW10pIHRvUmVtb3ZlLnRvQXJyYXkobmV3IFRlbXBvcmFyeUFubm90YXRpb25bdG9SZW1vdmUuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogSnVkZ2Ugd2hldGhlciBhIHNwZWxsaW5nIHByb2JsZW0gaXMgImludGVyZXN0aW5nIi4gQWNjZXB0IGFueSByZWdpb25zCi0JICogdGhhdCBhcmUgZXhwbGljaXRseSBhbGxvd2VkLCBhbmQgc2luY2UgdmFsaWQgcHJvc2UgYXJlYXMgYXJlIHJhcmVseSBpbgotCSAqIGEgY29tcGxpY2F0ZWQgZG9jdW1lbnQgcmVnaW9uLCBhY2NlcHQgYW55IGRvY3VtZW50IHJlZ2lvbiB3aXRoIG1vcmUKLQkgKiB0aGFuIG9uZSB0ZXh0IHJlZ2lvbiBhbmQgcmVqZWN0IGFueSBkb2N1bWVudCByZWdpb25zIGNvbnRhaW5pbmcgZm9yZWlnbgotCSAqIHRleHQgcmVnaW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvYmxlbQotCSAqICAgICAgICAgICAgYSBTcGVsbGluZ1Byb2JsZW0KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3RvciBzaG91bGQgYWNjZXB0IHRoZSBnaXZlbiBTcGVsbGluZ1Byb2JsZW0KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ludGVyZXN0aW5nUHJvYmxlbShTcGVsbGluZ1Byb2JsZW0gcHJvYmxlbSkgewotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gKChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocHJvYmxlbS5nZXRPZmZzZXQoKSk7Ci0JCQlpZiAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwcm9ibGVtLmdldE9mZnNldCgpKTsKLQkJCQlpZiAodGV4dFJlZ2lvbiAhPSBudWxsICYmIGlzU3VwcG9ydGVkQ29udGV4dCh0ZXh0UmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWlmIChkb2N1bWVudFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpIGluc3RhbmNlb2YgRm9yZWlnblJlZ2lvbikKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmIChkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpID09IDEpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1N1cHBvcnRlZENvbnRleHQoU3RyaW5nIHR5cGUpIHsKLQkJYm9vbGVhbiBpc1N1cHBvcnRlZCA9IGZhbHNlOwotCQlpZiAoZlN1cHBvcnRlZFRleHRSZWdpb25Db250ZXh0cy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZTdXBwb3J0ZWRUZXh0UmVnaW9uQ29udGV4dHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodHlwZS5lcXVhbHMoZlN1cHBvcnRlZFRleHRSZWdpb25Db250ZXh0c1tpXSkpIHsKLQkJCQkJaXNTdXBwb3J0ZWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpc1N1cHBvcnRlZCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGlzU3VwcG9ydGVkOwotCX0KLQotCXZvaWQgcmVjb25jaWxlKCkgewotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSVJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IG5ldyBSZWdpb24oMCwgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpOwotCQkJcmVjb25jaWxlKGRvY3VtZW50UmVnaW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5I3JlY29uY2lsZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0JcHVibGljIHZvaWQgcmVjb25jaWxlKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uLCBJUmVnaW9uIHN1YlJlZ2lvbikgewotCQlpZiAoaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCi0JCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZ2V0QW5ub3RhdGlvbk1vZGVsKCk7Ci0KLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCWxvbmcgdGltZTAgPSAwOwotCQkJaWYgKF9ERUJVR19TUEVMTElORykgewotCQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQkvKioKLQkJCSAqIEFwcGFyZW50bHkgdGhlIGRlZmF1bHQgc3BlbGxpbmcgZW5naW5lIGhhcyBub3RpY2VhYmxlIG92ZXJoZWFkCi0JCQkgKiB3aGVuIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBpbiByYXBpZCBzdWNjZXNzaW9uLiBJdCdzIGZhc3RlciB0bwotCQkJICogY2hlY2sgdGhlIGVudGlyZSBkaXJ0eSByZWdpb24gYXQgb25jZSBzaW5jZSB3ZSBrbm93IHRoYXQgd2UncmUKLQkJCSAqIG5vdCBkaWZmZXJlbnRpYXRpbmcgYnkgcGFydGl0aW9uLgotCQkJICogCi0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTkyNTMwCi0JCQkgKi8KLQkJCWlmIChfREVCVUdfU1BFTExJTkcpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiU3BlbGwgQ2hlY2tpbmcgWyIgKyBkaXJ0eVJlZ2lvbi5nZXRPZmZzZXQoKSArICI6IiArIGRpcnR5UmVnaW9uLmdldExlbmd0aCgpICsgIl0gOiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApKTsKLQkJCX0KLQkJCXNwZWxsQ2hlY2soZGlydHlSZWdpb24sIGRpcnR5UmVnaW9uLCBhbm5vdGF0aW9uTW9kZWwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNwZWxsQ2hlY2soRGlydHlSZWdpb24gZGlydHlSZWdpb24sIElSZWdpb24gcmVnaW9uVG9CZUNoZWNrZWQsIElBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsKSB7Ci0JCVRlbXBvcmFyeUFubm90YXRpb25bXSBhbm5vdGF0aW9uc1RvUmVtb3ZlOwotCQlBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnNUb0FkZDsKLQkJYW5ub3RhdGlvbnNUb1JlbW92ZSA9IGdldFNwZWxsaW5nQW5ub3RhdGlvbnNUb1JlbW92ZShyZWdpb25Ub0JlQ2hlY2tlZCk7Ci0KLQkJaWYgKF9ERUJVR19TUEVMTElOR19QUk9CTEVNUykgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlNwZWxsIGNoZWNraW5nIFsiICsgcmVnaW9uVG9CZUNoZWNrZWQuZ2V0T2Zmc2V0KCkgKyAiLSIgKyAocmVnaW9uVG9CZUNoZWNrZWQuZ2V0T2Zmc2V0KCkgKyByZWdpb25Ub0JlQ2hlY2tlZC5nZXRMZW5ndGgoKSkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCWlmIChnZXREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCUVkaXRvcnNVSS5nZXRTcGVsbGluZ1NlcnZpY2UoKS5jaGVjayhnZXREb2N1bWVudCgpLCBuZXcgSVJlZ2lvbltde2RpcnR5UmVnaW9ufSwgZlNwZWxsaW5nQ29udGV4dCwgZlByb2JsZW1Db2xsZWN0b3IsIG51bGwpOwotCQl9Ci0JCWFubm90YXRpb25zVG9BZGQgPSBmUHJvYmxlbUNvbGxlY3Rvci5nZXRBbm5vdGF0aW9ucygpOwotCQlmUHJvYmxlbUNvbGxlY3Rvci5jbGVhcigpOwotCi0KLQkJaWYgKGFubm90YXRpb25Nb2RlbCBpbnN0YW5jZW9mIElBbm5vdGF0aW9uTW9kZWxFeHRlbnNpb24pIHsKLQkJCUlBbm5vdGF0aW9uTW9kZWxFeHRlbnNpb24gbW9kZWxFeHRlbnNpb24gPSAoSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbikgYW5ub3RhdGlvbk1vZGVsOwotCQkJTWFwIGFubm90YXRpb25zVG9BZGRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9uc1RvQWRkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYW5ub3RhdGlvbnNUb0FkZE1hcC5wdXQoYW5ub3RhdGlvbnNUb0FkZFtpXSwgKChUZW1wb3JhcnlBbm5vdGF0aW9uKSBhbm5vdGF0aW9uc1RvQWRkW2ldKS5nZXRQb3NpdGlvbigpKTsKLQkJCX0KLQkJCW1vZGVsRXh0ZW5zaW9uLnJlcGxhY2VBbm5vdGF0aW9ucyhhbm5vdGF0aW9uc1RvUmVtb3ZlLCBhbm5vdGF0aW9uc1RvQWRkTWFwKTsKLQkJfQotCi0JCWVsc2UgewotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhbm5vdGF0aW9uc1RvQWRkLmxlbmd0aDsgaisrKSB7Ci0JCQkJYW5ub3RhdGlvbk1vZGVsLmFkZEFubm90YXRpb24oYW5ub3RhdGlvbnNUb0FkZFtqXSwgKChUZW1wb3JhcnlBbm5vdGF0aW9uKSBhbm5vdGF0aW9uc1RvQWRkW2pdKS5nZXRQb3NpdGlvbigpKTsKLQkJCX0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgYW5ub3RhdGlvbnNUb1JlbW92ZS5sZW5ndGg7IGorKykgewotCQkJCWFubm90YXRpb25Nb2RlbC5yZW1vdmVBbm5vdGF0aW9uKGFubm90YXRpb25zVG9SZW1vdmVbal0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcnRpdGlvbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5I3JlY29uY2lsZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0KLQlwdWJsaWMgdm9pZCByZWNvbmNpbGUoSVJlZ2lvbiBwYXJ0aXRpb24pIHsKLQkJRGlydHlSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmVnaW9uID0gbmV3IERpcnR5UmVnaW9uKHBhcnRpdGlvbi5nZXRPZmZzZXQoKSwgcGFydGl0aW9uLmdldExlbmd0aCgpLCBEaXJ0eVJlZ2lvbi5JTlNFUlQsIGRvY3VtZW50LmdldChwYXJ0aXRpb24uZ2V0T2Zmc2V0KCksIHBhcnRpdGlvbi5nZXRMZW5ndGgoKSkpOwotCQkJCXJlY29uY2lsZShyZWdpb24sIHJlZ2lvbik7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJRWRpdG9yc1VJLmdldFByZWZlcmVuY2VTdG9yZSgpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlNwZWxsQ2hlY2tQcmVmZXJlbmNlTGlzdGVuZXIpOwotCQl9Ci0KLQkJc3VwZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCi0JCWlmIChnZXREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCUVkaXRvcnNVSS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZTcGVsbENoZWNrUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc3BlbGxpbmcvU3BlbGxpbmdRdWlja0Fzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NwZWxsaW5nL1NwZWxsaW5nUXVpY2tBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2ZjBmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc3BlbGxpbmcvU3BlbGxpbmdRdWlja0Fzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNwZWxsaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3Iuc3BlbGxpbmcuU3BlbGxpbmdQcm9ibGVtOwotCi0vKioKLSAqIFNwZWxsaW5nIGNvcnJlY3Rpb24gcHJvY2Vzc29yIHVzZWQgdG8gc2hvdyBxdWljayBmaXhlcyBmb3Igc3BlbGxpbmcKLSAqIHByb2JsZW1zLgotICogCi0gKiBAc2luY2UgMi4wCi0gKi8KLWNsYXNzIFNwZWxsaW5nUXVpY2tBc3Npc3RQcm9jZXNzb3IgaW1wbGVtZW50cyBJUXVpY2tBc3Npc3RQcm9jZXNzb3IgewotCXByaXZhdGUgU3BlbGxpbmdQcm9ibGVtIGZTcGVsbGluZ1Byb2JsZW0gPSBudWxsOwotCi0JcHVibGljIGJvb2xlYW4gY2FuQXNzaXN0KElRdWlja0Fzc2lzdEludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaXgoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXJldHVybiAhYW5ub3RhdGlvbi5pc01hcmtlZERlbGV0ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVRdWlja0Fzc2lzdFByb3Bvc2FscyhJUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBxdWlja0Fzc2lzdENvbnRleHQpIHsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IG51bGw7Ci0KLQkJaWYgKGZTcGVsbGluZ1Byb2JsZW0gIT0gbnVsbCkgewotCQkJcHJvcG9zYWxzID0gZlNwZWxsaW5nUHJvYmxlbS5nZXRQcm9wb3NhbHMoKTsKLQkJfQotCQlyZXR1cm4gcHJvcG9zYWxzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQl2b2lkIHNldFNwZWxsaW5nUHJvYmxlbShTcGVsbGluZ1Byb2JsZW0gc3BlbGxpbmdQcm9ibGVtKSB7Ci0JCWZTcGVsbGluZ1Byb2JsZW0gPSBzcGVsbGluZ1Byb2JsZW07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vQWJzdHJhY3RIb3ZlclByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vQWJzdHJhY3RIb3ZlclByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjMzMDYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90YWdpbmZvL0Fic3RyYWN0SG92ZXJQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50YWdpbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0SW5mb3JtYXRpb25Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuRWRpdG9yc1VJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVyaXZlZC5IVE1MVGV4dFByZXNlbnRlcjsKLQotLyoqCi0gKiBBYnN0cmFjdCBjbGFzcyBmb3IgcHJvdmlkaW5nIGhvdmVyIGluZm9ybWF0aW9uIGZvciBTb3VyY2UgZWRpdG9yLiBJbmNsdWRlcwotICogYSBob3ZlciBjb250cm9sIGNyZWF0b3Igd2hpY2ggaGFzIHRoZSAiUHJlc3MgRjIgZm9yIGZvY3VzIiBtZXNzYWdlIGJ1aWx0Ci0gKiBpbi4KLSAqIAotICogQHNpbmNlIFdUUCAxLjUKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEFic3RyYWN0SG92ZXJQcm9jZXNzb3IgaW1wbGVtZW50cyBJVGV4dEhvdmVyLCBJVGV4dEhvdmVyRXh0ZW5zaW9uIHsKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlckV4dGVuc2lvbiNnZXRIb3ZlckNvbnRyb2xDcmVhdG9yKCkKLQkgKi8KLQlwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IgZ2V0SG92ZXJDb250cm9sQ3JlYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcigpIHsKLQkJCXB1YmxpYyBJSW5mb3JtYXRpb25Db250cm9sIGNyZWF0ZUluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnQpIHsKLQkJCQlyZXR1cm4gbmV3IERlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2wocGFyZW50LCBTV1QuTk9ORSwgbmV3IEhUTUxUZXh0UHJlc2VudGVyKHRydWUpLCBFZGl0b3JzVUkuZ2V0VG9vbHRpcEFmZm9yZGFuY2VTdHJpbmcoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9Bbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU4NDc1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9Bbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuRWRpdG9yc1VJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQW5ub3RhdGlvblByZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5DaGFpbmVkUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklUZW1wb3JhcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotCi0vKioKLSAqIEhvdmVyIGhlbHAgdGhhdCBkaXNwbGF5cyBhbm5vdGF0aW9ucyBzaG93biBpbiB0ZXh0IG9mIGVkaXRvci4gQ3VycmVudGx5LAotICogdGhpcyB0ZXh0IGhvdmVyIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBBYnN0cmFjdFRleHRIb3ZlclByb2Nlc3Nvci4KLSAqIAotICogQGF1dGhvciBhbXl3dQotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RIb3ZlclByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExJU1RfQkVHSU4gPSAiPHVsPiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTElTVF9FTEVNRU5UID0gIjxsaT4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBUkFHUkFQSF9FTkQgPSAiPC9wPiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSQUdSQVBIX1NUQVJUID0gIjxwPiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmUHJlZmVyZW5jZVN0b3JlID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRm9ybWF0cyBhIG1zZyB0byBhIHByb3BlciBodG1sIG1lc3NhZ2UKLQkgKiAKLQkgKiBAcGFyYW0gbXNnIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgbXNnIGlzIG5laXRoZXIgbnVsbCBub3IgZW1wdHkgc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZvcm1hdE1lc3NhZ2UoU3RyaW5nIG1zZykgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKFBBUkFHUkFQSF9TVEFSVCk7Ci0JCWJ1Zi5hcHBlbmQoU3RyaW5nVXRpbHMuY29udmVydFRvSFRNTENvbnRlbnQobXNnKSk7Ci0JCWJ1Zi5hcHBlbmQoUEFSQUdSQVBIX0VORCk7Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXRzIG11bHRpcGxlIG1lc3NhZ2VzIGludG8gcHJvcGVyIGh0bWwgbWVzc2FnZQotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmb3JtYXRNZXNzYWdlcyhMaXN0IG1lc3NhZ2VzKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoUEFSQUdSQVBIX1NUQVJUKTsKLQkJYnVmZmVyLmFwcGVuZChTU0VVSU1lc3NhZ2VzLk11bHRpcGxlX2Vycm9ycyk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChMSVNUX0JFR0lOKTsKLQotCQlJdGVyYXRvciBlID0gbWVzc2FnZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlidWZmZXIuYXBwZW5kKExJU1RfRUxFTUVOVCk7Ci0JCQlidWZmZXIuYXBwZW5kKFN0cmluZ1V0aWxzLmNvbnZlcnRUb0hUTUxDb250ZW50KChTdHJpbmcpIGUubmV4dCgpKSk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZChQQVJBR1JBUEhfRU5EKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFubm90YXRpb24gcHJlZmVyZW5jZSBmb3IgdGhlIGdpdmVuIGFubm90YXRpb24uIChjb3BpZWQKLQkgKiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LmphdmEuaG92ZXIuQW5ub3RhdGlvbkhvdmVyKQotCSAqIAotCSAqIEBwYXJhbSBhbm5vdGF0aW9uCi0JICogICAgICAgICAgICB0aGUgYW5ub3RhdGlvbgotCSAqIEByZXR1cm4gdGhlIGFubm90YXRpb24gcHJlZmVyZW5jZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHJpdmF0ZSBBbm5vdGF0aW9uUHJlZmVyZW5jZSBnZXRBbm5vdGF0aW9uUHJlZmVyZW5jZShBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQotCQlpZiAoYW5ub3RhdGlvbi5pc01hcmtlZERlbGV0ZWQoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gRWRpdG9yc1VJLmdldEFubm90YXRpb25QcmVmZXJlbmNlTG9va3VwKCkuZ2V0QW5ub3RhdGlvblByZWZlcmVuY2UoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIb3ZlckluZm8oSVRleHRWaWV3ZXIgdmlld2VyLCBJUmVnaW9uIGhvdmVyUmVnaW9uKSB7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgbW9kZWwgPSAoKFNvdXJjZVZpZXdlcikgdmlld2VyKS5nZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCUxpc3QgbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJdGVyYXRvciBlID0gbW9kZWwuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlBbm5vdGF0aW9uIGEgPSAoQW5ub3RhdGlvbikgZS5uZXh0KCk7Ci0JCQkJaWYgKCFpc0Fubm90YXRpb25WYWxpZChhKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlQb3NpdGlvbiBwID0gbW9kZWwuZ2V0UG9zaXRpb24oYSk7Ci0JCQkJLy8gY2hlY2sgaWYgdGhpcyBpcyBhbiBhbm5vdGF0aW9uIGluIHRoZSByZWdpb24gd2UgYXJlCi0JCQkJLy8gY29uY2VybmVkIHdpdGgKLQkJCQlpZiAocC5vdmVybGFwc1dpdGgoaG92ZXJSZWdpb24uZ2V0T2Zmc2V0KCksIGhvdmVyUmVnaW9uLmdldExlbmd0aCgpKSkgewotCQkJCQlTdHJpbmcgbXNnID0gYS5nZXRUZXh0KCk7Ci0JCQkJCWlmICgobXNnICE9IG51bGwpICYmIG1zZy50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkvLyBpdCBpcyBwb3NzaWJsZSBmb3IgdGVtcG9yYXJ5IGFubm90YXRpb25zIHRvCi0JCQkJCQkvLyBkdXBsaWNhdGUgb3RoZXIgYW5ub3RhdGlvbnMgc28gbWFrZSBzdXJlIG5vdCB0byBhZGQKLQkJCQkJCS8vIGR1cHMKLQkJCQkJCWlmIChhIGluc3RhbmNlb2YgSVRlbXBvcmFyeUFubm90YXRpb24pIHsKLQkJCQkJCQlib29sZWFuIGR1cGxpY2F0ZWQgPSBmYWxzZTsKLQkJCQkJCQlpbnQgaiA9IDA7Ci0JCQkJCQkJd2hpbGUgKGogPCBtZXNzYWdlcy5zaXplKCkgJiYgIWR1cGxpY2F0ZWQpIHsKLQkJCQkJCQkJZHVwbGljYXRlZCA9IG1lc3NhZ2VzLmdldChqKS5lcXVhbHMobXNnKTsKLQkJCQkJCQkJKytqOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIWR1cGxpY2F0ZWQpIHsKLQkJCQkJCQkJbWVzc2FnZXMuYWRkKG1zZyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJbWVzc2FnZXMuYWRkKG1zZyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobWVzc2FnZXMuc2l6ZSgpID4gMSkgewotCQkJCXJldHVybiBmb3JtYXRNZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCQl9Ci0JCQllbHNlIGlmIChtZXNzYWdlcy5zaXplKCkgPiAwKSB7Ci0JCQkJcmV0dXJuIGZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuZ2V0KDApLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVyUmVnaW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlJQW5ub3RhdGlvbk1vZGVsIG1vZGVsID0gKChTb3VyY2VWaWV3ZXIpIHRleHRWaWV3ZXIpLmdldEFubm90YXRpb25Nb2RlbCgpOwotCQlSZWdpb24gaG92ZXJSZWdpb24gPSBudWxsOwotCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlID0gbW9kZWwuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlBbm5vdGF0aW9uIGEgPSAoQW5ub3RhdGlvbikgZS5uZXh0KCk7Ci0JCQkJaWYgKCFpc0Fubm90YXRpb25WYWxpZChhKSkKLQkJCQkJY29udGludWU7Ci0JCQkJUG9zaXRpb24gcCA9IG1vZGVsLmdldFBvc2l0aW9uKGEpOwotCQkJCWlmIChwLmluY2x1ZGVzKG9mZnNldCkpIHsKLQkJCQkJLy8gZmluZCB0aGUgc21hbGxlc3QgcmVnaW9uIGNvbnRhaW5pbmcgb2Zmc2V0Ci0JCQkJCWlmICgoaG92ZXJSZWdpb24gPT0gbnVsbCkgfHwgKGhvdmVyUmVnaW9uLmdldExlbmd0aCgpID4gcC5nZXRMZW5ndGgoKSkpIHsKLQkJCQkJCWhvdmVyUmVnaW9uID0gbmV3IFJlZ2lvbihwLmdldE9mZnNldCgpLCBwLmdldExlbmd0aCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaG92ZXJSZWdpb247Ci0JfQotCi0JLyoqCi0JICogUmV0cmVpdmVzIHRoZSBwcmVmZXJlbmNlIHN0b3JlIElmIG5vIHByZWZlcmVuY2Ugc3RvcmUgaXMgY3VycmVudGx5Ci0JICogc3RvcmVkLCByZXRyZWl2ZSB0aGUgYXBwcm9wcmlhdGUgcHJlZmVyZW5jZSBzdG9yZQotCSAqLwotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCWlmIChmUHJlZmVyZW5jZVN0b3JlID09IG51bGwpIHsKLQkJCUlQcmVmZXJlbmNlU3RvcmUgc3NlRWRpdG9yUHJlZnMgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQlJUHJlZmVyZW5jZVN0b3JlIGJhc2VFZGl0b3JQcmVmcyA9IEVkaXRvcnNVSS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCWZQcmVmZXJlbmNlU3RvcmUgPSBuZXcgQ2hhaW5lZFByZWZlcmVuY2VTdG9yZShuZXcgSVByZWZlcmVuY2VTdG9yZVtde3NzZUVkaXRvclByZWZzLCBiYXNlRWRpdG9yUHJlZnN9KTsKLQkJfQotCQlyZXR1cm4gZlByZWZlcmVuY2VTdG9yZTsKLQl9Ci0KLQlib29sZWFuIGlzQW5ub3RhdGlvblZhbGlkKEFubm90YXRpb24gYSkgewotCQlBbm5vdGF0aW9uUHJlZmVyZW5jZSBwcmVmZXJlbmNlID0gZ2V0QW5ub3RhdGlvblByZWZlcmVuY2UoYSk7Ci0JCWlmIChwcmVmZXJlbmNlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyB0ZXh0UHJlZmVyZW5jZUtleSA9IHByZWZlcmVuY2UuZ2V0VGV4dFByZWZlcmVuY2VLZXkoKTsKLQkJU3RyaW5nIGhpZ2hsaWdodFByZWZlcmVuY2VLZXkgPSBwcmVmZXJlbmNlLmdldEhpZ2hsaWdodFByZWZlcmVuY2VLZXkoKTsKLQkJaWYgKHRleHRQcmVmZXJlbmNlS2V5ID09IG51bGwgfHwgIShnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKHRleHRQcmVmZXJlbmNlS2V5KSkgfHwgaGlnaGxpZ2h0UHJlZmVyZW5jZUtleSA9PSBudWxsIHx8IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oaGlnaGxpZ2h0UHJlZmVyZW5jZUtleSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90YWdpbmZvL0Jlc3RNYXRjaEhvdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9CZXN0TWF0Y2hIb3Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmNiYzhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90YWdpbmZvL0Jlc3RNYXRjaEhvdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIFByb3ZpZGVzIHRoZSBiZXN0IGhvdmVyIGhlbHAgZG9jdW1lbnRhdGlvbiAoYnkgdXNpbmcgb3RoZXIgaG92ZXIgaGVscAotICogcHJvY2Vzc29ycykgUHJpb3JpdHkgb2YgaG92ZXIgaGVscCBwcm9jZXNzb3JzIGlzOiBQcm9ibGVtSG92ZXJQcm9jZXNzb3IsCi0gKiBUYWdJbmZvUHJvY2Vzc29yLCBBbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IKLSAqLwotcHVibGljIGNsYXNzIEJlc3RNYXRjaEhvdmVyIGltcGxlbWVudHMgSVRleHRIb3ZlciwgSVRleHRIb3ZlckV4dGVuc2lvbiB7Ci0JcHJpdmF0ZSBJVGV4dEhvdmVyIGZCZXN0TWF0Y2hIb3ZlcjsgLy8gY3VycmVudCBiZXN0IG1hdGNoIHRleHQgaG92ZXIKLQlwcml2YXRlIElUZXh0SG92ZXIgZlRhZ0luZm9Ib3ZlcjsgLy8gZG9jdW1lbnRhdGlvbi9pbmZvcm1hdGlvbiBob3ZlcgotCXByaXZhdGUgTGlzdCBmVGV4dEhvdmVyczsgLy8gbGlzdCBvZiB0ZXh0IGhvdmVycyB0byBjb25zaWRlciBpbiBiZXN0Ci0JLy8gbWF0Y2gKLQotCXB1YmxpYyBCZXN0TWF0Y2hIb3ZlcihJVGV4dEhvdmVyIGluZm90YWdob3ZlcikgewotCQlmVGFnSW5mb0hvdmVyID0gaW5mb3RhZ2hvdmVyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGxpc3Qgb2YgdGV4dCBob3ZlcnMgYXBwbGljYWJsZSB0byB0aGlzIGJlc3QgbWF0Y2ggaG92ZXIKLQkgKiBwcm9jZXNzb3IKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3Qgb2YgSVRleHRIb3ZlciAtIGluIGFic3RyYWN0IGNsYXNzIHRoaXMgaXMgZW1wdHkgbGlzdAotCSAqLwotCXByaXZhdGUgTGlzdCBjcmVhdGVUZXh0SG92ZXJzTGlzdCgpIHsKLQkJTGlzdCBob3Zlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIGlmIGN1cnJlbnRseSBkZWJ1Z2dpbmcsIHRoZW4gYWRkIHRoZSBkZWJ1ZyBob3ZlciB0byB0aGUgbGlzdCBvZgotCQkvLyBiZXN0IG1hdGNoCi0JCWlmIChMb2dnZXIuaXNUcmFjaW5nKERlYnVnSW5mb0hvdmVyUHJvY2Vzc29yLlRSQUNFRklMVEVSKSkgewotCQkJaG92ZXJMaXN0LmFkZChuZXcgRGVidWdJbmZvSG92ZXJQcm9jZXNzb3IoKSk7Ci0JCX0KLQotCQlob3Zlckxpc3QuYWRkKG5ldyBQcm9ibGVtQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yKCkpOwotCQlpZiAoZlRhZ0luZm9Ib3ZlciAhPSBudWxsKSB7Ci0JCQlob3Zlckxpc3QuYWRkKGZUYWdJbmZvSG92ZXIpOwotCQl9Ci0JCWhvdmVyTGlzdC5hZGQobmV3IEFubm90YXRpb25Ib3ZlclByb2Nlc3NvcigpKTsKLQkJcmV0dXJuIGhvdmVyTGlzdDsKLQl9Ci0KLQlwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IgZ2V0SG92ZXJDb250cm9sQ3JlYXRvcigpIHsKLQkJSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IgY3JlYXRvciA9IG51bGw7Ci0KLQkJaWYgKGZCZXN0TWF0Y2hIb3ZlciBpbnN0YW5jZW9mIElUZXh0SG92ZXJFeHRlbnNpb24pIHsKLQkJCWNyZWF0b3IgPSAoKElUZXh0SG92ZXJFeHRlbnNpb24pIGZCZXN0TWF0Y2hIb3ZlcikuZ2V0SG92ZXJDb250cm9sQ3JlYXRvcigpOwotCQl9Ci0JCXJldHVybiBjcmVhdG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVySW5mbyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG92ZXJJbmZvKElUZXh0Vmlld2VyIHZpZXdlciwgSVJlZ2lvbiBob3ZlclJlZ2lvbikgewotCQlTdHJpbmcgZGlzcGxheVRleHQgPSBudWxsOwotCi0JCS8vIGFscmVhZHkgaGF2ZSBhIGJlc3QgbWF0Y2ggaG92ZXIgcGlja2VkIG91dCBmcm9tIGdldEhvdmVyUmVnaW9uIGNhbGwKLQkJaWYgKGZCZXN0TWF0Y2hIb3ZlciAhPSBudWxsKSB7Ci0JCQlkaXNwbGF5VGV4dCA9IGZCZXN0TWF0Y2hIb3Zlci5nZXRIb3ZlckluZm8odmlld2VyLCBob3ZlclJlZ2lvbik7Ci0JCX0KLQkJLy8gZWl0aGVyIGhhZCBubyBiZXN0IG1hdGNoIGhvdmVyIG9yIGJlc3QgbWF0Y2ggaG92ZXIgcmV0dXJuZWQgbnVsbAotCQlpZiAoZGlzcGxheVRleHQgPT0gbnVsbCkgewotCQkJLy8gZ28gdGhyb3VnaCBsaXN0IG9mIHRleHQgaG92ZXJzIGFuZCByZXR1cm4gZmlyc3QgZGlzcGxheSBzdHJpbmcKLQkJCUl0ZXJhdG9yIGkgPSBnZXRUZXh0SG92ZXJzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlICgoaS5oYXNOZXh0KCkpICYmIChkaXNwbGF5VGV4dCA9PSBudWxsKSkgewotCQkJCUlUZXh0SG92ZXIgaG92ZXIgPSAoSVRleHRIb3ZlcikgaS5uZXh0KCk7Ci0JCQkJZGlzcGxheVRleHQgPSBob3Zlci5nZXRIb3ZlckluZm8odmlld2VyLCBob3ZlclJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRpc3BsYXlUZXh0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVyUmVnaW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCUlSZWdpb24gaG92ZXJSZWdpb24gPSBudWxsOwotCi0JCS8vIGdvIHRocm91Z2ggbGlzdCBvZiB0ZXh0IGhvdmVycyBhbmQgcmV0dXJuIGZpcnN0IGhvdmVyIHJlZ2lvbgotCQlJVGV4dEhvdmVyIGhvdmVyID0gbnVsbDsKLQkJSXRlcmF0b3IgaSA9IGdldFRleHRIb3ZlcnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoKGkuaGFzTmV4dCgpKSAmJiAoaG92ZXJSZWdpb24gPT0gbnVsbCkpIHsKLQkJCWhvdmVyID0gKElUZXh0SG92ZXIpIGkubmV4dCgpOwotCQkJaG92ZXJSZWdpb24gPSBob3Zlci5nZXRIb3ZlclJlZ2lvbih2aWV3ZXIsIG9mZnNldCk7Ci0JCX0KLQotCQkvLyBzdG9yZSB0aGUgdGV4dCBob3ZlciBwcm9jZXNzb3IgdGhhdCBmb3VuZCByZWdpb24KLQkJaWYgKGhvdmVyUmVnaW9uICE9IG51bGwpCi0JCQlmQmVzdE1hdGNoSG92ZXIgPSBob3ZlcjsKLQkJZWxzZQotCQkJZkJlc3RNYXRjaEhvdmVyID0gbnVsbDsKLQotCQlyZXR1cm4gaG92ZXJSZWdpb247Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFRleHRIb3ZlcnMoKSB7Ci0JCWlmIChmVGV4dEhvdmVycyA9PSBudWxsKSB7Ci0JCQlmVGV4dEhvdmVycyA9IGNyZWF0ZVRleHRIb3ZlcnNMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGZUZXh0SG92ZXJzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90YWdpbmZvL0RlYnVnSW5mb0hvdmVyUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9EZWJ1Z0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTlkYjA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90YWdpbmZvL0RlYnVnSW5mb0hvdmVyUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLQotLyoqCi0gKiBQcm92aWRlcyBkZWJ1ZyBob3ZlciBoZWxwCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWJ1Z0luZm9Ib3ZlclByb2Nlc3NvciBleHRlbmRzIEFic3RyYWN0SG92ZXJQcm9jZXNzb3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSID0gImRlYnVnaW5mb2hvdmVyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGZQcmVmZXJlbmNlU3RvcmUgPSBudWxsOwotCi0JcHVibGljIERlYnVnSW5mb0hvdmVyUHJvY2Vzc29yKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVySW5mbyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG92ZXJJbmZvKElUZXh0Vmlld2VyIHZpZXdlciwgSVJlZ2lvbiBob3ZlclJlZ2lvbikgewotCQlTdHJpbmcgZGlzcGxheVRleHQgPSBudWxsOwotCQlpZiAoKGhvdmVyUmVnaW9uID09IG51bGwpIHx8ICh2aWV3ZXIgPT0gbnVsbCkgfHwgKHZpZXdlci5nZXREb2N1bWVudCgpID09IG51bGwpKSB7Ci0JCQlkaXNwbGF5VGV4dCA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnQgb2Zmc2V0ID0gaG92ZXJSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0KLQkJCUlUeXBlZFJlZ2lvbiByZWdpb247Ci0JCQl0cnkgewotCQkJCXJlZ2lvbiA9IHZpZXdlci5nZXREb2N1bWVudCgpLmdldFBhcnRpdGlvbihvZmZzZXQpOwotCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQlkaXNwbGF5VGV4dCA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlkaXNwbGF5VGV4dCA9ICJOdWxsIFJlZ2lvbiB3YXMgcmV0dXJuZWQ/ISI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCWRpc3BsYXlUZXh0ID0gIkJhZExvY2F0aW9uRXhjZXB0aW9uIE9jY3VycmVkIT8iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gZGlzcGxheVRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVnaW9uIHRvIGhvdmVyIHRoZSB0ZXh0IG92ZXIgYmFzZWQgb24gdGhlIG9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dFZpZXdlcgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAKLQkgKiBAcmV0dXJuIElSZWdpb24gcmVnaW9uIHRvIGhvdmVyIG92ZXIgaWYgb2Zmc2V0IGlzIG5vdCBvdmVyIGludmFsaWQKLQkgKiAgICAgICAgIHdoaXRlc3BhY2UuIG90aGVyd2lzZSwgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVyUmVnaW9uKElUZXh0Vmlld2VyLCBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlJVHlwZWRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaWYgKCh0ZXh0Vmlld2VyID09IG51bGwpIHx8ICh0ZXh0Vmlld2VyLmdldERvY3VtZW50KCkgPT0gbnVsbCkpIHsKLQkJCXJlZ2lvbiA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0KLQkJCXRyeSB7Ci0JCQkJcmVnaW9uID0gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpLmdldFBhcnRpdGlvbihvZmZzZXQpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlyZWdpb24gPSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWdpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vUHJvYmxlbUFubm90YXRpb25Ib3ZlclByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vUHJvYmxlbUFubm90YXRpb25Ib3ZlclByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjAxMjMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90YWdpbmZvL1Byb2JsZW1Bbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuRGVmYXVsdE1hcmtlckFubm90YXRpb25BY2Nlc3M7Ci0KLS8qKgotICogSG92ZXIgaGVscCB0aGF0IGRpc3BsYXlzIHByb2JsZW0gYW5ub3RhdGlvbnMgd2hlbiBzaG93biBpbiB0ZXh0IG9mIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBhbXl3dQotICovCi1wdWJsaWMgY2xhc3MgUHJvYmxlbUFubm90YXRpb25Ib3ZlclByb2Nlc3NvciBleHRlbmRzIEFubm90YXRpb25Ib3ZlclByb2Nlc3NvciB7Ci0KLQkvLyB0aGVzZSBzdHJpbmdzIGFyZSBkZXJpdmVkIGZyb20gdGhlIGFubm90YXRpb25UeXBlcyBleHRlbnNpb24gaW4KLQkvLyBvcmcuZWNsaXBzZS51aS5lZGl0b3JzIHBsdWdpbgotCS8vIGlmIHRob3NlIHN0cmluZ3MgY2hhbmdlLCB0aGVuIHRoZXNlIHN0cmluZ3MgbmVlZCB0byBjaGFuZ2UgYXMgd2VsbAotCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTg1ODQKLQlmaW5hbCBwcml2YXRlIFN0cmluZyBBTk5PVEFUSU9OX0VSUk9SID0gIm9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmVycm9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHByaXZhdGUgU3RyaW5nIEFOTk9UQVRJT05fV0FSTklORyA9ICJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci53YXJuaW5nIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgRGVmYXVsdE1hcmtlckFubm90YXRpb25BY2Nlc3MgZkFubm90YXRpb25BY2Nlc3MgPSBuZXcgRGVmYXVsdE1hcmtlckFubm90YXRpb25BY2Nlc3MoKTsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgUHJvYmxlbUFubm90YXRpb25Ib3ZlclByb2Nlc3NvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS50YWdpbmZvLkFubm90YXRpb25Ib3ZlclByb2Nlc3NvciNpc0Fubm90YXRpb25WYWxpZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQW5ub3RhdGlvblZhbGlkKEFubm90YXRpb24gYSkgewotCQlTdHJpbmcgdHlwZSA9IGEuZ2V0VHlwZSgpOwotCQlpZiAoZkFubm90YXRpb25BY2Nlc3MuaXNTdWJ0eXBlKHR5cGUsIEFOTk9UQVRJT05fRVJST1IpIHx8IGZBbm5vdGF0aW9uQWNjZXNzLmlzU3VidHlwZSh0eXBlLCBBTk5PVEFUSU9OX1dBUk5JTkcpKQotCQkJcmV0dXJuIHN1cGVyLmlzQW5ub3RhdGlvblZhbGlkKGEpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vVGV4dEhvdmVyTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vVGV4dEhvdmVyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjhiMWEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90YWdpbmZvL1RleHRIb3Zlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50YWdpbmZvOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRWRpdG9yUHJlZmVyZW5jZU5hbWVzOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogTWFuYWdlcyB0ZXh0IGhvdmVycyBmb3IgU3RydWN0dXJlZCBUZXh0IGVkaXRvcnMKLSAqLwotcHVibGljIGNsYXNzIFRleHRIb3Zlck1hbmFnZXIgewotCS8qKgotCSAqIENvbnRhaW5zIGRlc2NyaXB0aW9uIG9mIGEgdGV4dCBob3ZlcgotCSAqLwotCXB1YmxpYyBjbGFzcyBUZXh0SG92ZXJEZXNjcmlwdG9yIHsKLQkJcHJpdmF0ZSBTdHJpbmcgZkRlc2NyaXB0aW9uOwotCQlwcml2YXRlIGJvb2xlYW4gZkVuYWJsZWQ7Ci0JCXByaXZhdGUgU3RyaW5nIGZJZDsKLQkJcHJpdmF0ZSBTdHJpbmcgZkxhYmVsOwotCQlwcml2YXRlIFN0cmluZyBmTW9kaWZpZXJTdHJpbmc7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBpZAotCQkgKiBAcGFyYW0gbGFiZWwKLQkJICogQHBhcmFtIGRlc2MKLQkJICovCi0JCXB1YmxpYyBUZXh0SG92ZXJEZXNjcmlwdG9yKFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzYykgewotCQkJZklkID0gaWQ7Ci0JCQlmTGFiZWwgPSBsYWJlbDsKLQkJCWZEZXNjcmlwdGlvbiA9IGRlc2M7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGlkCi0JCSAqIEBwYXJhbSBsYWJlbAotCQkgKiBAcGFyYW0gZGVzYwotCQkgKiBAcGFyYW0gZW5hYmxlZAotCQkgKiBAcGFyYW0gbW9kaWZpZXJTdHJpbmcKLQkJICovCi0JCXB1YmxpYyBUZXh0SG92ZXJEZXNjcmlwdG9yKFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzYywgYm9vbGVhbiBlbmFibGVkLCBTdHJpbmcgbW9kaWZpZXJTdHJpbmcpIHsKLQkJCWZJZCA9IGlkOwotCQkJZkxhYmVsID0gbGFiZWw7Ci0JCQlmRGVzY3JpcHRpb24gPSBkZXNjOwotCQkJZkVuYWJsZWQgPSBlbmFibGVkOwotCQkJZk1vZGlmaWVyU3RyaW5nID0gbW9kaWZpZXJTdHJpbmc7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBmRGVzY3JpcHRpb24uCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIGZEZXNjcmlwdGlvbjsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZJZC4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQlyZXR1cm4gZklkOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZkxhYmVsCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJcmV0dXJuIGZMYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZNb2RpZmllclN0cmluZy4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TW9kaWZpZXJTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZk1vZGlmaWVyU3RyaW5nOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZkVuYWJsZWQuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQlyZXR1cm4gZkVuYWJsZWQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGVuYWJsZWQKLQkJICogICAgICAgICAgICBUaGUgZkVuYWJsZWQgdG8gc2V0LgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJCWZFbmFibGVkID0gZW5hYmxlZDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gbW9kaWZpZXJTdHJpbmcKLQkJICogICAgICAgICAgICBUaGUgZk1vZGlmaWVyU3RyaW5nIHRvIHNldC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVyU3RyaW5nKFN0cmluZyBtb2RpZmllclN0cmluZykgewotCQkJZk1vZGlmaWVyU3RyaW5nID0gbW9kaWZpZXJTdHJpbmc7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX0hPVkVSID0gImFubm90YXRpb25Ib3ZlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGxpc3Qgb2YgZGlmZmVyZW50IHR5cGVzIG9mIFNvdXJjZSBlZGl0b3IgaG92ZXJzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NQklOQVRJT05fSE9WRVIgPSAiY29tYmluYXRpb25Ib3ZlciI7IC8vJE5PTi1OTFMtMSQKLQkvLyBob3ZlciBkZXNjcmlwdGlvbnMgYXJlIGluIC5wcm9wZXJ0aWVzIGZpbGUgd2l0aCB0aGUga2V5IGluIHRoZSBmb3JtIG9mCi0JLy8gIltpZF1fZGVzYyIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fS0VZID0gIl9kZXNjIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UQVRJT05fSE9WRVIgPSAiZG9jdW1lbnRhdGlvbkhvdmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhPVkVSX0FUVFJJQlVURV9TRVBBUkFUT1IgPSAifCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT1ZFUl9TRVBBUkFUT1IgPSAiOyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGhvdmVyIGxhYmVscyBhcmUgaW4gLnByb3BlcnRpZXMgZmlsZSB3aXRoIHRoZSBrZXkgaW4gdGhlIGZvcm0gb2YKLQkvLyAiW2lkXV9sYWJlbCIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUxfS0VZID0gIl9sYWJlbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX01PRElGSUVSID0gIjAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQkxFTV9IT1ZFUiA9ICJwcm9ibGVtSG92ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBURVhUX0hPVkVSX0lEUyA9IG5ldyBTdHJpbmdbXXtDT01CSU5BVElPTl9IT1ZFUiwgUFJPQkxFTV9IT1ZFUiwgRE9DVU1FTlRBVElPTl9IT1ZFUiwgQU5OT1RBVElPTl9IT1ZFUn07Ci0JLyoqCi0JICogQ3VycmVudCBsaXN0IG9mIFN0cnVjdHVyZWQgVGV4dCBlZGl0b3IgdGV4dCBob3ZlcnMKLQkgKi8KLQlwcml2YXRlIFRleHRIb3ZlckRlc2NyaXB0b3JbXSBmVGV4dEhvdmVyczsKLQotCXB1YmxpYyBUZXh0SG92ZXJNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGJlc3QgbWF0Y2ggaG92ZXIgd2l0aCB0aGUgZ2l2ZSB0ZXh0IGhvdmVyIGFzIHRoZSBkb2N1bWVudGF0aW9uCi0JICogaG92ZXIKLQkgKiAKLQkgKiBAcGFyYW0gaW5mb0hvdmVyCi0JICogQHJldHVybiBJVGV4dEhvdmVyCi0JICogQGRlcHJlY2F0ZWQgYXMgb2YgV1RQIDMuMCBNMwotCSAqLwotCXB1YmxpYyBJVGV4dEhvdmVyIGNyZWF0ZUJlc3RNYXRjaEhvdmVyKElUZXh0SG92ZXIgaW5mb0hvdmVyKSB7Ci0JCXJldHVybiBuZXcgQmVzdE1hdGNoSG92ZXIoaW5mb0hvdmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBhIGxpc3Qgb2YgdGV4dCBob3ZlciBkZXNjcmlwdG9ycyBmcm9tIHRoZSBnaXZlbiBkZWxpbWl0ZWQKLQkgKiBzdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dEhvdmVyU3RyaW5ncwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgVGV4dEhvdmVyRGVzY3JpcHRvcltdIGdlbmVyYXRlVGV4dEhvdmVyRGVzY3JpcHRvcnMoU3RyaW5nIHRleHRIb3ZlclN0cmluZ3MpIHsKLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih0ZXh0SG92ZXJTdHJpbmdzLCBIT1ZFUl9TRVBBUkFUT1IpOwotCi0JCS8vIHJlYWQgZnJvbSBwcmVmZXJlbmNlIGFuZCBsb2FkIGlkLWRlc2NyaXB0b3IgbWFwcGluZyB0byBhIGhhc2ggdGFibGUKLQkJSGFzaE1hcCBpZFRvTW9kaWZpZXIgPSBuZXcgSGFzaE1hcChzdC5jb3VudFRva2VucygpKTsKLQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRleHRIb3ZlclN0cmluZyA9IHN0Lm5leHRUb2tlbigpOwotCQkJU3RyaW5nVG9rZW5pemVyIHN0MiA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGV4dEhvdmVyU3RyaW5nLCBIT1ZFUl9BVFRSSUJVVEVfU0VQQVJBVE9SKTsKLQkJCWlmIChzdDIuY291bnRUb2tlbnMoKSA9PSAzKSB7Ci0JCQkJU3RyaW5nIGlkID0gc3QyLm5leHRUb2tlbigpOwotCQkJCWJvb2xlYW4gZW5hYmxlZCA9IEJvb2xlYW4udmFsdWVPZihzdDIubmV4dFRva2VuKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCVN0cmluZyBtb2RpZmllclN0cmluZyA9IHN0Mi5uZXh0VG9rZW4oKTsKLQkJCQlpZiAobW9kaWZpZXJTdHJpbmcuZXF1YWxzKE5PX01PRElGSUVSKSkKLQkJCQkJbW9kaWZpZXJTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQkJU3RyaW5nIGxhYmVsID0gbnVsbDsKLQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWxhYmVsID0gU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLmdldFN0cmluZyhpZCArIExBQkVMX0tFWSk7Ci0JCQkJCWRlc2NyaXB0aW9uID0gU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLmdldFN0cmluZyhpZCArIERFU0NSSVBUSU9OX0tFWSk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJfQotCQkJCVRleHRIb3ZlckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBUZXh0SG92ZXJEZXNjcmlwdG9yKGlkLCBsYWJlbCwgZGVzY3JpcHRpb24sIGVuYWJsZWQsIG1vZGlmaWVyU3RyaW5nKTsKLQkJCQkvLyBzaG91bGQgY2hlY2sgdG8gc2VlIGlmIGlkcyBhcHBlYXIgbW9yZSB0aGFuIG9uY2UKLQkJCQlpZFRvTW9kaWZpZXIucHV0KGlkLCBkZXNjcmlwdG9yKTsKLQkJCX0KLQkJfQotCi0JCS8vIGdvIHRocm91Z2ggYWxsIGRlZmluZWQgdGV4dCBob3ZlcnMgYW5kIG1hdGNoIHdpdGggdGhlaXIgcHJlZmVyZW5jZQotCQlUZXh0SG92ZXJEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgVGV4dEhvdmVyRGVzY3JpcHRvcltURVhUX0hPVkVSX0lEUy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IFRFWFRfSE9WRVJfSURTLmxlbmd0aDsgaSsrKSB7Ci0JCQlUZXh0SG92ZXJEZXNjcmlwdG9yIGRlc2MgPSAoVGV4dEhvdmVyRGVzY3JpcHRvcikgaWRUb01vZGlmaWVyLmdldChURVhUX0hPVkVSX0lEU1tpXSk7Ci0JCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJZGVzY3JpcHRvcnNbaV0gPSBkZXNjOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIGxhYmVsID0gbnVsbDsKLQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWxhYmVsID0gU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLmdldFN0cmluZyhURVhUX0hPVkVSX0lEU1tpXSArIExBQkVMX0tFWSk7Ci0JCQkJCWRlc2NyaXB0aW9uID0gU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLmdldFN0cmluZyhURVhUX0hPVkVSX0lEU1tpXSArIERFU0NSSVBUSU9OX0tFWSk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJfQotCQkJCWRlc2NyaXB0b3JzW2ldID0gbmV3IFRleHRIb3ZlckRlc2NyaXB0b3IoVEVYVF9IT1ZFUl9JRFNbaV0sIGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3JzOwotCX0KLQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IGhvdmVycyBmb3IgU3RydWN0dXJlZCBUZXh0IGVkaXRvci4gSWYgZlRleHRIb3ZlciBoYXMKLQkgKiBub3QgYmVlbiBpbml0aWFsaWVkLCBpdCB3aWxsIGJlIGluaXRpYWxpemVkLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZlRleHRIb3ZlcnMuCi0JICovCi0JcHVibGljIFRleHRIb3ZlckRlc2NyaXB0b3JbXSBnZXRUZXh0SG92ZXJzKCkgewotCQlpZiAoZlRleHRIb3ZlcnMgPT0gbnVsbCkgewotCQkJU3RyaW5nIHRleHRIb3ZlclN0cmluZ3MgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkVESVRPUl9URVhUX0hPVkVSX01PRElGSUVSUyk7Ci0JCQlmVGV4dEhvdmVycyA9IGdlbmVyYXRlVGV4dEhvdmVyRGVzY3JpcHRvcnModGV4dEhvdmVyU3RyaW5ncyk7Ci0JCX0KLQkJcmV0dXJuIGZUZXh0SG92ZXJzOwotCX0KLQotCS8qKgotCSAqIFNldHMgZlRleHRIb3ZlcnMgdG8gbnVsbCBzbyB0aGF0IG5leHQgdGltZSBnZXRUZXh0SG92ZXJzIGlzIGNhbGxlZCwKLQkgKiBmVGV4dEhvdmVycyB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBsYXRlc3QgcHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXRUZXh0SG92ZXJzKCkgewotCQlmVGV4dEhvdmVycyA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RleHQvRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RleHQvRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjdmYTQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90ZXh0L0RvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiBNYXRjaGVzIHRoZSBzdGFydCBhbmQgZW5kaW5nIGNoYXJhY3RlcnMgb2YgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgd2l0aAotICogdGhlIGdpdmVuIGFsbG93ZWQgdHlwZXMuIE5vdGUgdGhhdCBFY2xpcHNlIFIzTTggb25seSBwYWludHMgc2luZ2xlCi0gKiBjaGFyYWN0ZXItd2lkZSBtYXRjaGVzIGFuZCB0aGlzIGlzbid0IHRydWUgcGFpciBtYXRjaGluZyBiZWhhdmlvci4gU2VlIFJGRQotICogIzU2ODM2IGF0IGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD01NjgzNi4KLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIgaW1wbGVtZW50cyBJQ2hhcmFjdGVyUGFpck1hdGNoZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiY2hhcmFjdGVycGFpcm1hdGNoZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgaW50IGZBbmNob3I7Ci0KLQlwcm90ZWN0ZWQgSUNoYXJhY3RlclBhaXJNYXRjaGVyIGZOZXh0TWF0Y2hlcjsKLQotCXByb3RlY3RlZCBMaXN0IGZSZWdpb25UeXBlczsKLQotCXB1YmxpYyBEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyKFN0cmluZ1tdIHZhbGlkQ29udGV4dHMsIElDaGFyYWN0ZXJQYWlyTWF0Y2hlciBuZXh0TWF0Y2hlcikgewotCQlmUmVnaW9uVHlwZXMgPSBBcnJheXMuYXNMaXN0KHZhbGlkQ29udGV4dHMpOwotCQlmTmV4dE1hdGNoZXIgPSBuZXh0TWF0Y2hlcjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2NsZWFyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKGZOZXh0TWF0Y2hlciAhPSBudWxsKQotCQkJZk5leHRNYXRjaGVyLmNsZWFyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGZOZXh0TWF0Y2hlciAhPSBudWxsKQotCQkJZk5leHRNYXRjaGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNnZXRBbmNob3IoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QW5jaG9yKCkgewotCQlpZiAoZkFuY2hvciA8IDAgJiYgZk5leHRNYXRjaGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZk5leHRNYXRjaGVyLmdldEFuY2hvcigpOwotCQlyZXR1cm4gZkFuY2hvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNtYXRjaChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBtYXRjaChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQkJaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID49IGRvY3VtZW50LmdldExlbmd0aCgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVJlZ2lvbiBtYXRjaCA9IG51bGw7Ci0JCWlmICghZlJlZ2lvblR5cGVzLmlzRW1wdHkoKSAmJiBkb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jUmVnaW9uID0gKChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChkb2NSZWdpb24gIT0gbnVsbCkgewotCQkJCS8vIGxvb2sgYXQgdGhlIHByZXZpb3VzIGRvY3VtZW50IHJlZ2lvbiBmaXJzdCBzaW5jZSBpdHMgZW5kID09Ci0JCQkJLy8gdGhpcyBvbmUncyBzdGFydAotCQkJCWlmIChkb2NSZWdpb24uZ2V0UHJldmlvdXMoKSAhPSBudWxsICYmIGRvY1JlZ2lvbi5nZXRQcmV2aW91cygpLmdldEVuZE9mZnNldCgpID09IG9mZnNldCAmJiBmUmVnaW9uVHlwZXMuY29udGFpbnMoZG9jUmVnaW9uLmdldFByZXZpb3VzKCkuZ2V0VHlwZSgpKSkgewotCQkJCQlmQW5jaG9yID0gSUNoYXJhY3RlclBhaXJNYXRjaGVyLlJJR0hUOwotCQkJCQltYXRjaCA9IG5ldyBSZWdpb24oZG9jUmVnaW9uLmdldFByZXZpb3VzKCkuZ2V0U3RhcnRPZmZzZXQoKSwgMSk7Ci0JCQkJfQotCQkJCS8vIGNoZWNrIGZvciBvZmZzZXQgaW4gdGhlIGxhc3QgdGV4dCByZWdpb24gZm9yIGEgbWF0Y2ggdG8KLQkJCQkvLyBkb2N1bWVudCByZWdpb24gc3RhcnQgb2Zmc2V0Ci0JCQkJZWxzZSBpZiAoZlJlZ2lvblR5cGVzLmNvbnRhaW5zKGRvY1JlZ2lvbi5nZXRUeXBlKCkpICYmIGRvY1JlZ2lvbi5nZXRTdGFydE9mZnNldChkb2NSZWdpb24uZ2V0TGFzdFJlZ2lvbigpKSA8PSBvZmZzZXQgJiYgb2Zmc2V0IDw9IGRvY1JlZ2lvbi5nZXRFbmRPZmZzZXQoZG9jUmVnaW9uLmdldExhc3RSZWdpb24oKSkpIHsKLQkJCQkJZkFuY2hvciA9IElDaGFyYWN0ZXJQYWlyTWF0Y2hlci5SSUdIVDsKLQkJCQkJbWF0Y2ggPSBuZXcgUmVnaW9uKGRvY1JlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCAxKTsKLQkJCQl9Ci0JCQkJLy8gY2hlY2sgZm9yIG9mZnNldCBpbiB0aGUgZmlyc3QgdGV4dCByZWdpb24gZm9yIGEgbWF0Y2ggdG8KLQkJCQkvLyBkb2N1bWVudCByZWdpb24gZW5kIG9mZnNldAotCQkJCWVsc2UgaWYgKGZSZWdpb25UeXBlcy5jb250YWlucyhkb2NSZWdpb24uZ2V0VHlwZSgpKSkgewotCQkJCQlpZiAoZG9jUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGRvY1JlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpKSA8PSBvZmZzZXQgJiYgb2Zmc2V0IDw9IGRvY1JlZ2lvbi5nZXRFbmRPZmZzZXQoZG9jUmVnaW9uLmdldEZpcnN0UmVnaW9uKCkpKSB7Ci0JCQkJCQlmQW5jaG9yID0gSUNoYXJhY3RlclBhaXJNYXRjaGVyLkxFRlQ7Ci0JCQkJCQltYXRjaCA9IG5ldyBSZWdpb24oZG9jUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gMSwgMSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAobWF0Y2ggPT0gbnVsbCkgewotCQkJCQkvKiBOb3cgY2hlY2sgdGhlIHRleHQgcmVnaW9uICovCi0JCQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRUZXh0UmVnaW9uID0gZG9jUmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJCWlmIChjdXJyZW50VGV4dFJlZ2lvbiAhPSBudWxsICYmIGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSA+IDEpIHsKLQkJCQkJCWludCBvZmZzZXRBdE5lYXJFZGdlID0gb2Zmc2V0OwotCQkJCQkJaWYgKG9mZnNldCA9PSBkb2NSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChjdXJyZW50VGV4dFJlZ2lvbikpIHsKLQkJCQkJCQlvZmZzZXRBdE5lYXJFZGdlID0gb2Zmc2V0LTE7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChvZmZzZXQgPT0gZG9jUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGN1cnJlbnRUZXh0UmVnaW9uKSsxKSB7Ci0JCQkJCQkJb2Zmc2V0QXROZWFyRWRnZSA9IG9mZnNldC0xOwotCQkJCQkJfQotCi0JCQkJCQlpZiAob2Zmc2V0QXROZWFyRWRnZSA9PSBkb2NSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY3VycmVudFRleHRSZWdpb24pKSB7Ci0JCQkJCQkJaW50IGVuZCA9IGRvY1JlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KGN1cnJlbnRUZXh0UmVnaW9uKTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpZiAoZG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXRBdE5lYXJFZGdlKSA9PSBkb2N1bWVudC5nZXRDaGFyKGVuZCAtIDEpKSB7Ci0JCQkJCQkJCQlmQW5jaG9yID0gSUNoYXJhY3RlclBhaXJNYXRjaGVyLkxFRlQ7Ci0JCQkJCQkJCQltYXRjaCA9IG5ldyBSZWdpb24oZW5kIC0gMSwgMSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJLy8gbm90aGluZywgbm90IGltcG9ydGFudCBlbm91Z2gKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChvZmZzZXRBdE5lYXJFZGdlID09IGRvY1JlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KGN1cnJlbnRUZXh0UmVnaW9uKS0xKSB7Ci0JCQkJCQkJaW50IHN0YXJ0ID0gZG9jUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGN1cnJlbnRUZXh0UmVnaW9uKTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpZiAoZG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXRBdE5lYXJFZGdlKSA9PSBkb2N1bWVudC5nZXRDaGFyKHN0YXJ0KSkgewotCQkJCQkJCQkJZkFuY2hvciA9IElDaGFyYWN0ZXJQYWlyTWF0Y2hlci5SSUdIVDsKLQkJCQkJCQkJCW1hdGNoID0gbmV3IFJlZ2lvbihzdGFydCwgMSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJLy8gbm90aGluZywgbm90IGltcG9ydGFudCBlbm91Z2gKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG1hdGNoID09IG51bGwgJiYgZk5leHRNYXRjaGVyICE9IG51bGwpIHsKLQkJCWZBbmNob3IgPSAtMTsKLQkJCW1hdGNoID0gZk5leHRNYXRjaGVyLm1hdGNoKGRvY3VtZW50LCBvZmZzZXQpOwotCQl9Ci0JCXJldHVybiBtYXRjaDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdWkvT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91aS9PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjEyMzBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91aS9PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TYXNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTZWxlY3Rpb25TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5NYXJrZXJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TaW1wbGVNYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlRleHRQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlJlY29uY2lsZUFubm90YXRpb25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuVGVtcG9yYXJ5QW5ub3RhdGlvbjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuTnVtYmVyRm9ybWF0OwotCi0vKioKLSAqIEBhdXRob3IgbnNkIEEgU3RhdHVzIExpbmUgY29udHJpYnV0aW9uIGludGVuZGVkIHRvIGRpc3BsYXkgdGhlIHNlbGVjdGVkCi0gKiAgICAgICAgIG9mZnNldHMgaW4gYW4gZWRpdG9yLiBEb3VibGUtY2xpY2tpbmcgc2hvd3MgaW5mb3JtYXRpb24gYWJvdXQKLSAqICAgICAgICAgcGFydGl0aW9ucywgZG9jdW1lbnQgcmVnaW9ucywgYW5ub3RhdGlvbnMsIGFuZCBzZWxlY3Rpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbSBleHRlbmRzIFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtIHsKLQotCWNsYXNzIEFubm90YXRpb25Qcm9wZXJ0eVNvdXJjZSBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZSB7Ci0JCUFubm90YXRpb24gZkFubm90YXRpb24gPSBudWxsOwotCQlJUHJvcGVydHlEZXNjcmlwdG9yW10gZkRlc2NyaXB0b3JzID0gbnVsbDsKLQkJU3RyaW5nW10gVEVNUE9SQVJZX0FOTk9UQVRJT05fS0VZUyA9IG5ldyBTdHJpbmdbXXsiUGFydGl0aW9uIFR5cGUiLCAiU3RlcCIsICJTY29wZSIsICJPZmZzZXQiLCAiTGVuZ3RoIiwgIkRlc2NyaXB0aW9uIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCi0KLQkJcHVibGljIEFubm90YXRpb25Qcm9wZXJ0eVNvdXJjZShBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJCXN1cGVyKCk7Ci0JCQlmQW5ub3RhdGlvbiA9IGFubm90YXRpb247Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpIHsKLQkJCWlmIChmRGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChmQW5ub3RhdGlvbiBpbnN0YW5jZW9mIFNpbXBsZU1hcmtlckFubm90YXRpb24pIHsKLQkJCQkJCU1hcCBhdHRycyA9ICgoU2ltcGxlTWFya2VyQW5ub3RhdGlvbikgZkFubm90YXRpb24pLmdldE1hcmtlcigpLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJCU9iamVjdFtdIGtleXMgPSBhdHRycy5rZXlTZXQoKS50b0FycmF5KCk7Ci0KLQkJCQkJCWZEZXNjcmlwdG9ycyA9IG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW2tleXMubGVuZ3RoXTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJCQkJCVRleHRQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKGtleXNbaV0udG9TdHJpbmcoKSwga2V5c1tpXS50b1N0cmluZygpKTsKLQkJCQkJCQlmRGVzY3JpcHRvcnNbaV0gPSBkZXNjcmlwdG9yOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGZBbm5vdGF0aW9uIGluc3RhbmNlb2YgVGVtcG9yYXJ5QW5ub3RhdGlvbikgewotCQkJCQkJT2JqZWN0IGtleSA9ICgoVGVtcG9yYXJ5QW5ub3RhdGlvbikgZkFubm90YXRpb24pLmdldEtleSgpOwotCQkJCQkJaWYgKGtleSAhPSBudWxsICYmIGtleSBpbnN0YW5jZW9mIFJlY29uY2lsZUFubm90YXRpb25LZXkpIHsKLQkJCQkJCQlTdHJpbmdbXSBrZXlzID0gVEVNUE9SQVJZX0FOTk9UQVRJT05fS0VZUzsKLQkJCQkJCQlmRGVzY3JpcHRvcnMgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltrZXlzLmxlbmd0aF07Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCVRleHRQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKGtleXNbaV0udG9TdHJpbmcoKSwga2V5c1tpXS50b1N0cmluZygpKTsKLQkJCQkJCQkJZkRlc2NyaXB0b3JzW2ldID0gZGVzY3JpcHRvcjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmRGVzY3JpcHRvcnMgPT0gbnVsbCkKLQkJCQlmRGVzY3JpcHRvcnMgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvclswXTsKLQkJCXJldHVybiBmRGVzY3JpcHRvcnM7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQkJaWYgKGZBbm5vdGF0aW9uIGluc3RhbmNlb2YgU2ltcGxlTWFya2VyQW5ub3RhdGlvbikgewotCQkJCU9iamVjdCBvOwotCQkJCXRyeSB7Ci0JCQkJCW8gPSAoKFNpbXBsZU1hcmtlckFubm90YXRpb24pIGZBbm5vdGF0aW9uKS5nZXRNYXJrZXIoKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0KGlkKTsKLQkJCQkJaWYgKG8gIT0gbnVsbCkgewotCQkJCQkJdmFsdWUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGZBbm5vdGF0aW9uIGluc3RhbmNlb2YgVGVtcG9yYXJ5QW5ub3RhdGlvbikgewotCQkJCWlmIChURU1QT1JBUllfQU5OT1RBVElPTl9LRVlTWzBdLmVxdWFscyhpZCkpIHsKLQkJCQkJT2JqZWN0IGtleSA9ICgoVGVtcG9yYXJ5QW5ub3RhdGlvbikgZkFubm90YXRpb24pLmdldEtleSgpOwotCQkJCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5IGluc3RhbmNlb2YgUmVjb25jaWxlQW5ub3RhdGlvbktleSkgewotCQkJCQkJdmFsdWUgPSAoKFJlY29uY2lsZUFubm90YXRpb25LZXkpIGtleSkuZ2V0UGFydGl0aW9uVHlwZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKFRFTVBPUkFSWV9BTk5PVEFUSU9OX0tFWVNbMV0uZXF1YWxzKGlkKSkgewotCQkJCQlPYmplY3Qga2V5ID0gKChUZW1wb3JhcnlBbm5vdGF0aW9uKSBmQW5ub3RhdGlvbikuZ2V0S2V5KCk7Ci0JCQkJCWlmIChrZXkgIT0gbnVsbCAmJiBrZXkgaW5zdGFuY2VvZiBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5KSB7Ci0JCQkJCQlJUmVjb25jaWxlU3RlcCBzdGVwID0gKChSZWNvbmNpbGVBbm5vdGF0aW9uS2V5KSBrZXkpLmdldFN0ZXAoKTsKLQkJCQkJCWlmIChzdGVwICE9IG51bGwpIHsKLQkJCQkJCQl2YWx1ZSA9IHN0ZXAudG9TdHJpbmcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChURU1QT1JBUllfQU5OT1RBVElPTl9LRVlTWzJdLmVxdWFscyhpZCkpIHsKLQkJCQkJT2JqZWN0IGtleSA9ICgoVGVtcG9yYXJ5QW5ub3RhdGlvbikgZkFubm90YXRpb24pLmdldEtleSgpOwotCQkJCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5IGluc3RhbmNlb2YgUmVjb25jaWxlQW5ub3RhdGlvbktleSkgewotCQkJCQkJaW50IHNjb3BlID0gKChSZWNvbmNpbGVBbm5vdGF0aW9uS2V5KSBrZXkpLmdldFNjb3BlKCk7Ci0JCQkJCQlpZiAoc2NvcGUgPT0gUmVjb25jaWxlQW5ub3RhdGlvbktleS5QQVJUSUFMKSB7Ci0JCQkJCQkJdmFsdWUgPSAiUEFSVElBTCI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWlmIChzY29wZSA9PSBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlRPVEFMKSB7Ci0JCQkJCQkJdmFsdWUgPSAiVE9UQUwiOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoVEVNUE9SQVJZX0FOTk9UQVRJT05fS0VZU1szXS5lcXVhbHMoaWQpKSB7Ci0JCQkJCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldEFubm90YXRpb25Nb2RlbChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQkJUG9zaXRpb24gcCA9IGFubm90YXRpb25Nb2RlbC5nZXRQb3NpdGlvbihmQW5ub3RhdGlvbik7Ci0JCQkJCWlmIChwICE9IG51bGwpIHsKLQkJCQkJCXZhbHVlID0gU3RyaW5nLnZhbHVlT2YocC5nZXRPZmZzZXQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoVEVNUE9SQVJZX0FOTk9UQVRJT05fS0VZU1s0XS5lcXVhbHMoaWQpKSB7Ci0JCQkJCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldEFubm90YXRpb25Nb2RlbChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQkJUG9zaXRpb24gcCA9IGFubm90YXRpb25Nb2RlbC5nZXRQb3NpdGlvbihmQW5ub3RhdGlvbik7Ci0JCQkJCWlmIChwICE9IG51bGwpIHsKLQkJCQkJCXZhbHVlID0gU3RyaW5nLnZhbHVlT2YocC5nZXRMZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoVEVNUE9SQVJZX0FOTk9UQVRJT05fS0VZU1s1XS5lcXVhbHMoaWQpKSB7Ci0JCQkJCXZhbHVlID0gKChUZW1wb3JhcnlBbm5vdGF0aW9uKSBmQW5ub3RhdGlvbikuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBpZCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZkFubm90YXRpb24gaW5zdGFuY2VvZiBTaW1wbGVNYXJrZXJBbm5vdGF0aW9uKSB7Ci0JCQkJCSgoU2ltcGxlTWFya2VyQW5ub3RhdGlvbikgZkFubm90YXRpb24pLmdldE1hcmtlcigpLmdldEF0dHJpYnV0ZXMoKS5yZW1vdmUoaWQpOwotCQkJCX0KLQkJCQllbHNlIGlmIChmQW5ub3RhdGlvbiBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pIHsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkLCBPYmplY3QgdmFsdWUpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZBbm5vdGF0aW9uIGluc3RhbmNlb2YgU2ltcGxlTWFya2VyQW5ub3RhdGlvbikgewotCQkJCQkoKE1hcmtlckFubm90YXRpb24pIGZBbm5vdGF0aW9uKS5nZXRNYXJrZXIoKS5zZXRBdHRyaWJ1dGUoaWQudG9TdHJpbmcoKSwgdmFsdWUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChmQW5ub3RhdGlvbiBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pIHsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIEluZm9ybWF0aW9uRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCQlJRG9jdW1lbnQgZkRvY3VtZW50ID0gZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCi0JCXB1YmxpYyBJbmZvcm1hdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVBbm5vdGF0aW9uVGFiQ29udGVudHMoQ29tcG9zaXRlIGFubm90YXRpb25zVGFiQ29tcG9zaXRlKSB7Ci0JCQlhbm5vdGF0aW9uc1RhYkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlhbm5vdGF0aW9uc1RhYkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQkJZmluYWwgQ29tcG9zaXRlIGFubm90YXRpb25zQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShhbm5vdGF0aW9uc1RhYkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJYW5ub3RhdGlvbnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0KLQkJCWZpbmFsIFRhYmxlVmlld2VyIGFubm90YXRpb25zVGFibGUgPSBuZXcgVGFibGVWaWV3ZXIoYW5ub3RhdGlvbnNDb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJCWFubm90YXRpb25zVGFibGUuc2V0Q29tcGFyYXRvcihuZXcgVmlld2VyQ29tcGFyYXRvcihuZXcgQ29tcGFyYXRvcigpIHsKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uMSA9IChBbm5vdGF0aW9uKSBvMTsKLQkJCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uMiA9IChBbm5vdGF0aW9uKSBvMjsKLQkJCQkJU3RyaW5nIGxpbmUxID0gZ2V0TGluZU51bWJlcihhbm5vdGF0aW9uMSk7Ci0JCQkJCVN0cmluZyBsaW5lMiA9IGdldExpbmVOdW1iZXIoYW5ub3RhdGlvbjIpOwotCQkJCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChsaW5lMSkgLSBJbnRlZ2VyLnBhcnNlSW50KGxpbmUyKTsKLQkJCQl9Ci0JCQl9KSk7Ci0JCQlhbm5vdGF0aW9uc1RhYmxlLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCQlhbm5vdGF0aW9uc1RhYmxlLmdldFRhYmxlKCkuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJCWFubm90YXRpb25zVGFibGUuZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCQlTdHJpbmdbXSBjb2x1bW5zID0gbmV3IFN0cmluZ1tdeyJMaW5lIiwgIk93bmVyIiwgIlR5cGUiLCAiQ2xhc3MiLCAiTWVzc2FnZSJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCWFubm90YXRpb25zVGFibGUuc2V0TGFiZWxQcm92aWRlcihuZXcgSVRhYmxlTGFiZWxQcm92aWRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQW5ub3RhdGlvbikgZWxlbWVudDsKLQkJCQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQkJCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJCQljYXNlIDAgOgotCQkJCQkJCXRleHQgPSBnZXRMaW5lTnVtYmVyKGFubm90YXRpb24pOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAxIDoKLQkJCQkJCQl0ZXh0ID0gZ2V0T3duZXIoYW5ub3RhdGlvbik7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDIgOgotCQkJCQkJCXRleHQgPSBnZXRUeXBlKGFubm90YXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDMgOgotCQkJCQkJCXRleHQgPSBhbm5vdGF0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSA0IDoKLQkJCQkJCQl0ZXh0ID0gYW5ub3RhdGlvbi5nZXRUZXh0KCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCQkJCXRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gdGV4dDsKLQkJCQl9Ci0KLQotCQkJCXByaXZhdGUgU3RyaW5nIGdldE93bmVyKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQkJCQlTdHJpbmcgb3duZXIgPSBudWxsOwotCQkJCQlpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE1hcmtlckFubm90YXRpb24pIHsKLQkJCQkJCW93bmVyID0gKChNYXJrZXJBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKS5nZXRNYXJrZXIoKS5nZXRBdHRyaWJ1dGUoIm93bmVyIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAkJCQkKLQkJCQkJfQotCQkJCQllbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgVGVtcG9yYXJ5QW5ub3RhdGlvbikgewotCQkJCQkJT2JqZWN0IGtleSA9ICgoVGVtcG9yYXJ5QW5ub3RhdGlvbikgYW5ub3RhdGlvbikuZ2V0S2V5KCk7Ci0JCQkJCQlpZiAoa2V5ICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoa2V5IGluc3RhbmNlb2YgUmVjb25jaWxlQW5ub3RhdGlvbktleSkgewotCQkJCQkJCQlrZXkgPSBrZXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChrZXkgIT0gbnVsbCkKLQkJCQkJCQkJb3duZXIgPSBrZXkudG9TdHJpbmcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gb3duZXI7Ci0JCQkJfQotCi0JCQkJcHJpdmF0ZSBTdHJpbmcgZ2V0VHlwZShBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJCQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCQkJCQlpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE1hcmtlckFubm90YXRpb24pIHsKLQkJCQkJCXR5cGUgPSAiTToiK01hcmtlclV0aWxpdGllcy5nZXRNYXJrZXJUeXBlKCgoTWFya2VyQW5ub3RhdGlvbikgYW5ub3RhdGlvbikuZ2V0TWFya2VyKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl0eXBlID0gIkE6Iithbm5vdGF0aW9uLmdldFR5cGUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWlmICh0eXBlID09IG51bGwpCi0JCQkJCQl0eXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIHR5cGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCX0KLQkJCX0pOwotCi0JCQlUYWJsZUxheW91dCB0bGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCQlDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvcltjb2x1bW5zLmxlbmd0aF07Ci0JCQlpbnQgY29sdW1uV2lkdGhzW10gPSBuZXcgaW50W117RGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Qm91bmRzKCkud2lkdGggLyAxNCwgRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Qm91bmRzKCkud2lkdGggLyA3LCBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRCb3VuZHMoKS53aWR0aCAvIDcsIERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEJvdW5kcygpLndpZHRoIC8gMTQsIERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEJvdW5kcygpLndpZHRoIC8gN307Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCQl0bGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMSkpOwotCQkJCVRhYmxlQ29sdW1uIHRjID0gbmV3IFRhYmxlQ29sdW1uKGFubm90YXRpb25zVGFibGUuZ2V0VGFibGUoKSwgU1dULk5PTkUpOwotCQkJCXRjLnNldFRleHQoY29sdW1uc1tpXSk7Ci0JCQkJdGMuc2V0UmVzaXphYmxlKHRydWUpOwotCQkJCXRjLnNldFdpZHRoKGNvbHVtbldpZHRoc1tpXSk7Ci0JCQl9Ci0JCQlhbm5vdGF0aW9uc1RhYmxlLnNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLQkJCWFubm90YXRpb25zVGFibGUuc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5zKTsKLQkJCUxpc3QgbWF0Y2hpbmdBbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCQlpZiAoZlRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldEFubm90YXRpb25Nb2RlbChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQlpZiAoYW5ub3RhdGlvbk1vZGVsICE9IG51bGwpIHsKLQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBhbm5vdGF0aW9uTW9kZWwuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCUFubm90YXRpb24gZWxlbWVudCA9IChBbm5vdGF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAodHJ1ZSkgewotCQkJCQkJCW1hdGNoaW5nQW5ub3RhdGlvbnMuYWRkKGVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJYW5ub3RhdGlvbnNUYWJsZS5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpKTsKLQkJCWFubm90YXRpb25zVGFibGUuc2V0SW5wdXQobWF0Y2hpbmdBbm5vdGF0aW9ucyk7Ci0KLQkJCWZpbmFsIFNhc2ggc2FzaCA9IG5ldyBTYXNoKGFubm90YXRpb25zQ29tcG9zaXRlLCBTV1QuSE9SSVpPTlRBTCk7Ci0KLQkJCWZpbmFsIFByb3BlcnR5U2hlZXRQYWdlIHByb3BlcnR5U2hlZXQgPSBuZXcgUHJvcGVydHlTaGVldFBhZ2UoKTsKLQkJCXByb3BlcnR5U2hlZXQuY3JlYXRlQ29udHJvbChhbm5vdGF0aW9uc0NvbXBvc2l0ZSk7Ci0JCQlwcm9wZXJ0eVNoZWV0LnNldFByb3BlcnR5U291cmNlUHJvdmlkZXIobmV3IElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKCkgewotCQkJCXB1YmxpYyBJUHJvcGVydHlTb3VyY2UgZ2V0UHJvcGVydHlTb3VyY2UoT2JqZWN0IG9iamVjdCkgewotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQW5ub3RhdGlvbikgewotCQkJCQkJSVByb3BlcnR5U291cmNlIGFubm90YXRpb25Qcm9wZXJ0eVNvdXJjZSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHlTb3VyY2UoKChBbm5vdGF0aW9uKSBvYmplY3QpKTsKLQkJCQkJCXJldHVybiBhbm5vdGF0aW9uUHJvcGVydHlTb3VyY2U7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWFubm90YXRpb25zVGFibGUuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCXByb3BlcnR5U2hlZXQuc2VsZWN0aW9uQ2hhbmdlZChudWxsLCBldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWZpbmFsIEZvcm1MYXlvdXQgZm9ybSA9IG5ldyBGb3JtTGF5b3V0KCk7Ci0JCQlhbm5vdGF0aW9uc0NvbXBvc2l0ZS5zZXRMYXlvdXQoZm9ybSk7Ci0KLQkJCUZvcm1EYXRhIHRhYmxlRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJdGFibGVEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJCXRhYmxlRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2FzaCwgMik7Ci0JCQl0YWJsZURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJCXRhYmxlRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQkJYW5ub3RhdGlvbnNUYWJsZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YSh0YWJsZURhdGEpOwotCi0JCQlGb3JtRGF0YSBwcm9wZXJ0aWVzRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJcHJvcGVydGllc0RhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHNhc2gsIDIpOwotCQkJcHJvcGVydGllc0RhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJCXByb3BlcnRpZXNEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCQlwcm9wZXJ0aWVzRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJCXByb3BlcnR5U2hlZXQuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEocHJvcGVydGllc0RhdGEpOwotCi0JCQlmaW5hbCBGb3JtRGF0YSBzYXNoRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJc2FzaERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDYwLCAwKTsKLQkJCXNhc2hEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCQlzYXNoRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQkJc2FzaC5zZXRMYXlvdXREYXRhKHNhc2hEYXRhKTsKLQkJCXNhc2guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJc2FzaERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIGUueSk7Ci0JCQkJCWFubm90YXRpb25zQ29tcG9zaXRlLmxheW91dCgpOwotCQkJCX0KLQkJCX0pOwotCQkJYW5ub3RhdGlvbnNDb21wb3NpdGUucGFjayh0cnVlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZlRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSBudWxsOwotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJCXN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQotCQkJcGFyZW50LmdldFNoZWxsKCkuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzAgKyB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgIi0iICsgKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQkJVGV4dCBkb2N1bWVudFR5cGVMYWJlbCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlkb2N1bWVudFR5cGVMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCWRvY3VtZW50VHlwZUxhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV82ICsgZkRvY3VtZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlUZXh0IGRvY3VtZW50UHJvdmlkZXJMYWJlbCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlkb2N1bWVudFByb3ZpZGVyTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlkb2N1bWVudFByb3ZpZGVyTGFiZWwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzcgKyBmVGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCVRleHQgZWRpdG9ySW5wdXRMYWJlbCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQllZGl0b3JJbnB1dExhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkJZWRpdG9ySW5wdXRMYWJlbC5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTIgKyBmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlmaW5hbCBUZXh0IGJvbUxhYmVsID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWJvbUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkJYm9tTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlib21MYWJlbC5zZXRUZXh0KCJCeXRlIE9yZGVyIE1hcms6ICIpOwotCi0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlUZXh0IG1vZGVsSWRMYWJlbCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQkJCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQltb2RlbElkTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQkJbW9kZWxJZExhYmVsLnNldFRleHQoIklEOiAiICsgbW9kZWwuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCVRleHQgbW9kZWxCYXNlTG9jYXRpb25MYWJlbCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQkJCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQltb2RlbEJhc2VMb2NhdGlvbkxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkJCW1vZGVsQmFzZUxvY2F0aW9uTGFiZWwuc2V0VGV4dCgiQmFzZSBMb2NhdGlvbjogIiArIG1vZGVsLmdldEJhc2VMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJVGV4dCBtb2RlbENvbnRlbnRUeXBlTGFiZWwgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQkJbW9kZWxDb250ZW50VHlwZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkJCW1vZGVsQ29udGVudFR5cGVMYWJlbC5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fNCArIG1vZGVsLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJVGV4dCBtb2RlbEhhbmRsZXJDb250ZW50VHlwZUxhYmVsID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5SRUFEX09OTFkpOwotCQkJCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQltb2RlbEhhbmRsZXJDb250ZW50VHlwZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkJCW1vZGVsSGFuZGxlckNvbnRlbnRUeXBlTGFiZWwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzUgKyBtb2RlbC5nZXRNb2RlbEhhbmRsZXIoKS5nZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZCgpICsgIiAoIiArIG1vZGVsLmdldE1vZGVsSGFuZGxlcigpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQkJCWZpbmFsIFRleHQgY291bnRzID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5SRUFEX09OTFkpOwotCQkJCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQljb3VudHMuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQkJY291bnRzLnNldFRleHQoIkNvdW50aW5nLi4uIik7Ci0JCQkJY291bnRzLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWZpbmFsIElTdHJ1Y3R1cmVkTW9kZWwgZmluYWxNb2RlbCA9IG1vZGVsOwotCQkJCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQkJCUpvYiBjb3VudGVyID0gbmV3IEpvYigiQ291bnRpbmcgcmVnaW9ucyIpIHsKLQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPSBmaW5hbE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJCQkJCWludCBsZW5ndGggPSBmaW5hbE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpOwotCQkJCQkJaW50IHJlZ2lvbkNvdW50ID0gMDsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQkJCXJlZ2lvbkNvdW50ICs9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNbaV0uZ2V0TnVtYmVyT2ZSZWdpb25zKCk7Ci0JCQkJCQl9Ci0JCQkJCQlOdW1iZXJGb3JtYXQgZm9ybWF0dGVyID0gTnVtYmVyRm9ybWF0LmdldEludGVnZXJJbnN0YW5jZSgpOwotCQkJCQkJZmluYWwgU3RyaW5nIHJlZ2lvbmNvdW50ID0gIkNvdW50OiAiICsgZm9ybWF0dGVyLmZvcm1hdChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmxlbmd0aCkgKyAiIGRvY3VtZW50IHJlZ2lvbnMgY29udGFpbmluZyAiICsgZm9ybWF0dGVyLmZvcm1hdChyZWdpb25Db3VudCkgKyAiIHRleHQgcmVnaW9ucyByZXByZXNlbnRpbmcgIiArIGZvcm1hdHRlci5mb3JtYXQobGVuZ3RoKSArICIgY2hhcmFjdGVycyI7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQljb3VudHMuc2V0VGV4dChyZWdpb25jb3VudCk7Ci0JCQkJCQkJCWNvdW50cy5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCQlib21MYWJlbC5zZXRUZXh0KCJCeXRlIE9yZGVyIE1hcms6ICIgKyBnZXRCT01UZXh0KGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlib21MYWJlbC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWNvdW50ZXIuc2NoZWR1bGUoMTAwMCk7Ci0KLQkJCQlMYWJlbCBibGFua1JvdyA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQkJYmxhbmtSb3cuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQl9Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCi0JCQlUYWJGb2xkZXIgdGFiZm9sZGVyID0gbmV3IFRhYkZvbGRlcihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCXRhYmZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkJVGFiSXRlbSBwYXJ0aXRpb25UYWIgPSBuZXcgVGFiSXRlbSh0YWJmb2xkZXIsIFNXVC5CT1JERVIpOwotCQkJcGFydGl0aW9uVGFiLnNldFRleHQoU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8yKTsgLy8kTk9OLU5MUy0xJAotCQkJU2FzaEZvcm0gcGFydGl0aW9ucyA9IG5ldyBTYXNoRm9ybSh0YWJmb2xkZXIsIFNXVC5OT05FKTsKLQkJCXBhcnRpdGlvbnMuc2V0T3JpZW50YXRpb24oU1dULlZFUlRJQ0FMKTsKLQkJCXBhcnRpdGlvblRhYi5zZXRDb250cm9sKHBhcnRpdGlvbnMpOwotCQkJY3JlYXRlUGFydGl0aW9uVGFiQ29udGVudHMocGFydGl0aW9ucyk7Ci0JCQlwYXJ0aXRpb25zLnNldFdlaWdodHMobmV3IGludFtdezIsIDF9KTsKLQotCQkJVGFiSXRlbSBhbm5vdGF0aW9uc1RhYiA9IG5ldyBUYWJJdGVtKHRhYmZvbGRlciwgU1dULkJPUkRFUik7Ci0JCQlhbm5vdGF0aW9uc1RhYi5zZXRUZXh0KCJBbm5vdGF0aW9ucyIpOyAvLyROT04tTkxTLTEkCi0JCQlDb21wb3NpdGUgYW5ub3RhdGlvbnMgPSBuZXcgQ29tcG9zaXRlKHRhYmZvbGRlciwgU1dULk5PTkUpOwotCQkJYW5ub3RhdGlvbnNUYWIuc2V0Q29udHJvbChhbm5vdGF0aW9ucyk7Ci0JCQljcmVhdGVBbm5vdGF0aW9uVGFiQ29udGVudHMoYW5ub3RhdGlvbnMpOwotCi0JCQkvLyBvbmx5IGNyZWF0ZSB0aGUgSVRleHRSZWdpb25zIHRhYiBmb3IgSVN0cnVjdHVyZWREb2N1bWVudHMKLQkJCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJVGFiSXRlbSByZWdpb25UYWIgPSBuZXcgVGFiSXRlbSh0YWJmb2xkZXIsIFNXVC5CT1JERVIpOwotCQkJCXJlZ2lvblRhYi5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMyk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTYXNoRm9ybSByZWdpb25zID0gbmV3IFNhc2hGb3JtKHRhYmZvbGRlciwgU1dULk5PTkUpOwotCQkJCXJlZ2lvbnMuc2V0T3JpZW50YXRpb24oU1dULkhPUklaT05UQUwpOwotCQkJCXJlZ2lvblRhYi5zZXRDb250cm9sKHJlZ2lvbnMpOwotCQkJCWNyZWF0ZVJlZ2lvblRhYkNvbnRlbnRzKHJlZ2lvbnMpOwotCQkJCXJlZ2lvbnMuc2V0V2VpZ2h0cyhuZXcgaW50W117MywgMn0pOwotCQkJfQotCi0JCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQkJVGFiSXRlbSBlZGl0b3JTZWxlY3Rpb25UYWIgPSBuZXcgVGFiSXRlbSh0YWJmb2xkZXIsIFNXVC5CT1JERVIpOwotCQkJCWVkaXRvclNlbGVjdGlvblRhYi5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTQpOwotCQkJCUNvbXBvc2l0ZSBlZGl0b3JTZWxlY3Rpb25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRhYmZvbGRlciwgU1dULk5PTkUpOwotCQkJCWVkaXRvclNlbGVjdGlvblRhYi5zZXRDb250cm9sKGVkaXRvclNlbGVjdGlvbkNvbXBvc2l0ZSk7Ci0JCQkJZmlsbFNlbGVjdGlvblRhYkNvbnRlbnRzKGVkaXRvclNlbGVjdGlvbkNvbXBvc2l0ZSwgc3RydWN0dXJlZFNlbGVjdGlvbi50b0xpc3QoKSwgIkNsYXNzOiAiICsgc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCVRhYkl0ZW0gb3ZlcmxhcHBpbmdJbmRleGVkUmVnaW9uc1RhYiA9IG5ldyBUYWJJdGVtKHRhYmZvbGRlciwgU1dULkJPUkRFUik7Ci0JCQkJb3ZlcmxhcHBpbmdJbmRleGVkUmVnaW9uc1RhYi5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMjApOwotCQkJCUNvbXBvc2l0ZSBvdmVybGFwcGluZ0luZGV4ZWRSZWdpb25zVGFiQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0YWJmb2xkZXIsIFNXVC5OT05FKTsKLQkJCQlvdmVybGFwcGluZ0luZGV4ZWRSZWdpb25zVGFiLnNldENvbnRyb2wob3ZlcmxhcHBpbmdJbmRleGVkUmVnaW9uc1RhYkNvbXBvc2l0ZSk7Ci0JCQkJZmlsbFNlbGVjdGlvblRhYkNvbnRlbnRzKG92ZXJsYXBwaW5nSW5kZXhlZFJlZ2lvbnNUYWJDb21wb3NpdGUsIGdldEluZGV4ZWRSZWdpb25zKHRleHRTZWxlY3Rpb24pLCAiQWxsIEluZGV4ZWRSZWdpb25zIG92ZXJsYXBwaW5nIHRleHQgc2VsZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQotCQkJSUVkaXRvclNpdGUgc2l0ZSA9IGZUZXh0RWRpdG9yLmdldEVkaXRvclNpdGUoKTsKLQkJCWlmIChzaXRlICE9IG51bGwpIHsKLQkJCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IHNpdGUuZ2V0V29ya2JlbmNoV2luZG93KCk7Ci0JCQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQkJCUlTZWxlY3Rpb25TZXJ2aWNlIHNlcnZpY2UgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uU2VydmljZSgpOwotCQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbkZyb21TZXJ2aWNlID0gc2VydmljZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKHNlcnZpY2UgIT0gbnVsbCAmJiAhc2VsZWN0aW9uRnJvbVNlcnZpY2UuZXF1YWxzKHN0cnVjdHVyZWRTZWxlY3Rpb24pICYmIHNlbGVjdGlvbkZyb21TZXJ2aWNlIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQkJCVRhYkl0ZW0gc2VsZWN0aW9uU2VydmljZVRhYiA9IG5ldyBUYWJJdGVtKHRhYmZvbGRlciwgU1dULkJPUkRFUik7Ci0JCQkJCQlzZWxlY3Rpb25TZXJ2aWNlVGFiLnNldFRleHQoU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xOSk7Ci0JCQkJCQlDb21wb3NpdGUgc2VsZWN0aW9uU2VydmljZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCQkJCQlzZWxlY3Rpb25TZXJ2aWNlVGFiLnNldENvbnRyb2woc2VsZWN0aW9uU2VydmljZUNvbXBvc2l0ZSk7Ci0JCQkJCQlmaWxsU2VsZWN0aW9uVGFiQ29udGVudHMoc2VsZWN0aW9uU2VydmljZUNvbXBvc2l0ZSwgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uRnJvbVNlcnZpY2UpLnRvTGlzdCgpLCAiQ2xhc3M6ICIgKyBzZWxlY3Rpb25Gcm9tU2VydmljZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gZWRpdG9ySW5wdXQKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0Qk9NVGV4dChJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsKLQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGVkaXRvcklucHV0LmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotCQkJU3RyaW5nIGRldGVjdGVkQk9NID0gIm5vbmUiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJSW5wdXRTdHJlYW0gcyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJcyA9IGZpbGUuZ2V0Q29udGVudHModHJ1ZSk7Ci0JCQkJCWlmIChzICE9IG51bGwpIHsKLQkJCQkJCWludCBiMSA9IHMucmVhZCgpICYgMHhGRjsKLQkJCQkJCWludCBiMiA9IHMucmVhZCgpICYgMHhGRjsKLQkJCQkJCWlmIChiMSA9PSAweEZFICYmIGIyID09IDB4RkYpIHsKLQkJCQkJCQlkZXRlY3RlZEJPTSA9ICJGRSBGRiAoVVRGLTE2QkUpIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoYjEgPT0gMHhGRiAmJiBiMiA9PSAweEZFKSB7Ci0JCQkJCQkJZGV0ZWN0ZWRCT00gPSAiRkYgRkUgKFVURi0xNkxFKSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWludCBiMyA9IHMucmVhZCgpICYgMHhGRjsKLQkJCQkJCQlpZiAoYjEgPT0gMHhFRiAmJiBiMiA9PSAweEJCICYmIGIzID09IDB4QkYpIHsKLQkJCQkJCQkJZGV0ZWN0ZWRCT00gPSAiRUYgQkIgQkYgKFVURi04KSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWRldGVjdGVkQk9NID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAocyAhPSBudWxsKQotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzLmNsb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWRldGVjdGVkQk9NID0gIk4vQSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBkZXRlY3RlZEJPTTsKLQkJfQotCi0JCXByaXZhdGUgTGlzdCBnZXRJbmRleGVkUmVnaW9ucyhJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCQlTZXQgb3ZlcmxhcHBpbmdJbmRleGVkUmVnaW9ucyA9IG5ldyBIYXNoU2V0KDIpOwotCQkJaW50IHN0YXJ0ID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKTsKLQkJCWludCBlbmQgPSBzdGFydCArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiByID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihpKTsKLQkJCQkJaWYgKHIgIT0gbnVsbCkgewotCQkJCQkJb3ZlcmxhcHBpbmdJbmRleGVkUmVnaW9ucy5hZGQocik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBBcnJheXMuYXNMaXN0KG92ZXJsYXBwaW5nSW5kZXhlZFJlZ2lvbnMudG9BcnJheSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gc2FzaAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZVBhcnRpdGlvblRhYkNvbnRlbnRzKFNhc2hGb3JtIHNhc2gpIHsKLQkJCUNvbXBvc2l0ZSBwYXJ0aW9uaW5nQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShzYXNoLCBTV1QuTk9ORSk7Ci0JCQlwYXJ0aW9uaW5nQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQkJcGFydGlvbmluZ0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFydGlvbmluZ0NvbXBvc2l0ZSwgU1dULlNJTkdMRSk7Ci0JCQlsYWJlbC5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fOCk7IC8vJE5PTi1OTFMtMSQKLQkJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCQlmaW5hbCBDb21ibyBwYXJ0aXRpb25pbmdDb21ibyA9IG5ldyBDb21ibyhwYXJ0aW9uaW5nQ29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKLQkJCXBhcnRpdGlvbmluZ0NvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpKTsKLQotCQkJZmluYWwgTGFiZWwgcGFydGl0aW9uZXJJbnN0YW5jZUxhYmVsID0gbmV3IExhYmVsKHBhcnRpb25pbmdDb21wb3NpdGUsIFNXVC5TSU5HTEUpOwotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlwYXJ0aXRpb25lckluc3RhbmNlTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCWZpbmFsIFRhYmxlVmlld2VyIGZQYXJ0aXRpb25UYWJsZSA9IG5ldyBUYWJsZVZpZXdlcihwYXJ0aW9uaW5nQ29tcG9zaXRlLCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWZQYXJ0aXRpb25UYWJsZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlmUGFydGl0aW9uVGFibGUuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJCWZQYXJ0aXRpb25UYWJsZS5nZXRUYWJsZSgpLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCQlmUGFydGl0aW9uVGFibGUuZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCQlTdHJpbmdbXSBjb2x1bW5zID0gbmV3IFN0cmluZ1tde1NTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fOSwgU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xMCwgU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xMX07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlmUGFydGl0aW9uVGFibGUuc2V0TGFiZWxQcm92aWRlcihuZXcgSVRhYmxlTGFiZWxQcm92aWRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJCQlJVHlwZWRSZWdpb24gcGFydGl0aW9uID0gKElUeXBlZFJlZ2lvbikgZWxlbWVudDsKLQkJCQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQkJCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJCQljYXNlIDAgOgotCQkJCQkJCXRleHQgPSBJbnRlZ2VyLnRvU3RyaW5nKHBhcnRpdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDEgOgotCQkJCQkJCXRleHQgPSBJbnRlZ2VyLnRvU3RyaW5nKHBhcnRpdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDIgOgotCQkJCQkJCXRleHQgPSBwYXJ0aXRpb24uZ2V0VHlwZSgpOwotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmICh0ZXh0ID09IG51bGwpCi0JCQkJCQl0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIHRleHQ7Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQl9Ci0JCQl9KTsKLQkJCVRhYmxlTGF5b3V0IHRsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJCUNlbGxFZGl0b3JbXSBjZWxsRWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yW2NvbHVtbnMubGVuZ3RoXTsKLQkJCWludCBjb2x1bW5XaWR0aHNbXSA9IG5ldyBpbnRbXXtEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRCb3VuZHMoKS53aWR0aCAvIDE0LCBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRCb3VuZHMoKS53aWR0aCAvIDE0LCBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRCb3VuZHMoKS53aWR0aCAvIDV9OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdGxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEpKTsKLQkJCQlUYWJsZUNvbHVtbiB0YyA9IG5ldyBUYWJsZUNvbHVtbihmUGFydGl0aW9uVGFibGUuZ2V0VGFibGUoKSwgU1dULk5PTkUpOwotCQkJCXRjLnNldFRleHQoY29sdW1uc1tpXSk7Ci0JCQkJdGMuc2V0UmVzaXphYmxlKHRydWUpOwotCQkJCXRjLnNldFdpZHRoKGNvbHVtbldpZHRoc1tpXSk7Ci0JCQl9Ci0JCQlmUGFydGl0aW9uVGFibGUuc2V0Q2VsbEVkaXRvcnMoY2VsbEVkaXRvcnMpOwotCQkJZlBhcnRpdGlvblRhYmxlLnNldENvbHVtblByb3BlcnRpZXMoY29sdW1ucyk7Ci0JCQlmaW5hbCBTdHJpbmdbXSBwYXJ0aXRpb25pbmdzID0gKGZEb2N1bWVudCBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjMpID8gKChJRG9jdW1lbnRFeHRlbnNpb24zKSBmRG9jdW1lbnQpLmdldFBhcnRpdGlvbmluZ3MoKSA6IG5ldyBTdHJpbmdbXXtJRG9jdW1lbnRFeHRlbnNpb24zLkRFRkFVTFRfUEFSVElUSU9OSU5HfTsKLQkJCXBhcnRpdGlvbmluZ0NvbWJvLnNldEl0ZW1zKHBhcnRpdGlvbmluZ3MpOwotCQkJcGFydGl0aW9uaW5nQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlJU2VsZWN0aW9uIHNlbCA9IGZUZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHNlbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBwYXJ0aXRpb25lclRleHQgPSBmRG9jdW1lbnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb24zID8gKChJRG9jdW1lbnRFeHRlbnNpb24zKSBmRG9jdW1lbnQpLmdldERvY3VtZW50UGFydGl0aW9uZXIocGFydGl0aW9uaW5nQ29tYm8uZ2V0SXRlbShwYXJ0aXRpb25pbmdDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKSkudG9TdHJpbmcoKSA6ICgiIiArIGZEb2N1bWVudC5nZXREb2N1bWVudFBhcnRpdGlvbmVyKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlwYXJ0aXRpb25lckluc3RhbmNlTGFiZWwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzEzICsgcGFydGl0aW9uZXJUZXh0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZlBhcnRpdGlvblRhYmxlLnNldElucHV0KFRleHRVdGlsaXRpZXMuY29tcHV0ZVBhcnRpdGlvbmluZyhmRG9jdW1lbnQsIHBhcnRpdGlvbmluZ0NvbWJvLmdldEl0ZW0ocGFydGl0aW9uaW5nQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSksIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCksIHRydWUpKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZTEpIHsKLQkJCQkJCWZQYXJ0aXRpb25UYWJsZS5zZXRJbnB1dChuZXcgSVR5cGVkUmVnaW9uWzBdKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJdHJ5IHsKLQkJCQlpZiAocGFydGl0aW9uaW5ncy5sZW5ndGggPiAwKSB7Ci0JCQkJCVN0cmluZyBzZWxlY3RlZFBhcnRpdGlvbmluZyA9IHBhcnRpdGlvbmluZ0NvbWJvLmdldEl0ZW0oMCk7Ci0JCQkJCWlmIChVdGlsaXRpZXMuY29udGFpbnMocGFydGl0aW9uaW5ncywgSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORykpIHsKLQkJCQkJCXNlbGVjdGVkUGFydGl0aW9uaW5nID0gSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORzsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9uaW5ncy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWlmIChwYXJ0aXRpb25pbmdzW2ldLmVxdWFscyhJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HKSkgewotCQkJCQkJCQlwYXJ0aXRpb25pbmdDb21iby5zZWxlY3QoaSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcGFydGl0aW9uaW5nQ29tYm8uc2VsZWN0KDApOwotCQkJCQl9Ci0JCQkJCUlTZWxlY3Rpb24gc2VsID0gZlRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsOwotCQkJCQlJVHlwZWRSZWdpb25bXSBwYXJ0aXRpb25zID0gVGV4dFV0aWxpdGllcy5jb21wdXRlUGFydGl0aW9uaW5nKGZEb2N1bWVudCwgc2VsZWN0ZWRQYXJ0aXRpb25pbmcsIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCksIHRydWUpOwotCQkJCQlmUGFydGl0aW9uVGFibGUuc2V0SW5wdXQocGFydGl0aW9ucyk7Ci0JCQkJCVN0cmluZyBwYXJ0aXRpb25lclRleHQgPSBmRG9jdW1lbnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb24zID8gKChJRG9jdW1lbnRFeHRlbnNpb24zKSBmRG9jdW1lbnQpLmdldERvY3VtZW50UGFydGl0aW9uZXIocGFydGl0aW9uaW5nQ29tYm8uZ2V0SXRlbShwYXJ0aXRpb25pbmdDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKSkudG9TdHJpbmcoKSA6ICgiIiArIGZEb2N1bWVudC5nZXREb2N1bWVudFBhcnRpdGlvbmVyKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCXBhcnRpdGlvbmVySW5zdGFuY2VMYWJlbC5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTMgKyBwYXJ0aXRpb25lclRleHQpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlJU2VsZWN0aW9uIHNlbCA9IGZUZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHNlbDsKLQkJCQkJZlBhcnRpdGlvblRhYmxlLnNldElucHV0KGZEb2N1bWVudC5jb21wdXRlUGFydGl0aW9uaW5nKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZTEpIHsKLQkJCQlmUGFydGl0aW9uVGFibGUuc2V0SW5wdXQobmV3IElUeXBlZFJlZ2lvblswXSk7Ci0JCQl9Ci0JCQlwYXJ0aXRpb25pbmdDb21iby5zZXRGb2N1cygpOwotCi0KLQkJCWZpbmFsIFN0eWxlZFRleHQgdGV4dCA9IG5ldyBTdHlsZWRUZXh0KHNhc2gsIFNXVC5NVUxUSSB8IFNXVC5SRUFEX09OTFkpOwotCQkJZlBhcnRpdGlvblRhYmxlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQlpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQkJSVJlZ2lvbiBwYXJ0aXRpb24gPSAoSVJlZ2lvbikgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJCQkJU3RyaW5nIHNvdXJjZTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJc291cmNlID0gZG9jdW1lbnQuZ2V0KHBhcnRpdGlvbi5nZXRPZmZzZXQoKSwgcGFydGl0aW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCQl0ZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJdGV4dC5zZXRUZXh0KHNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCXRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGNvbXBvc2l0ZQotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVSZWdpb25UYWJDb250ZW50cyhTYXNoRm9ybSBzYXNoRm9ybSkgewotCQkJSVNlbGVjdGlvbiBzZWwgPSBmVGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJZmluYWwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsOwotCQkJZmluYWwgTGlzdCBkb2N1bWVudFJlZ2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAoZkRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZEb2N1bWVudDsKLQkJCQlpbnQgcG9zID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKTsKLQkJCQlpbnQgZW5kID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2NSZWdpb24gPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocG9zKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFJlZ2lvbiA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChlbmQpOwotCQkJCWlmIChwb3MgPCBlbmQpIHsKLQkJCQkJd2hpbGUgKGRvY1JlZ2lvbiAhPSBlbmRSZWdpb24pIHsKLQkJCQkJCWRvY3VtZW50UmVnaW9ucy5hZGQoZG9jUmVnaW9uKTsKLQkJCQkJCWRvY1JlZ2lvbiA9IGRvY1JlZ2lvbi5nZXROZXh0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZG9jdW1lbnRSZWdpb25zLmFkZChkb2NSZWdpb24pOwotCQkJfQotCi0JCQlmaW5hbCBUcmVlVmlld2VyIHRyZWUgPSBuZXcgVHJlZVZpZXdlcihzYXNoRm9ybSwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJCWZpbmFsIFN0cmluZyBTVEFSVCA9IFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTU7IC8vJE5PTi1OTFMtMSQKLQkJCWZpbmFsIFN0cmluZyBMRU5HVEggPSBTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzE2OyAvLyROT04tTkxTLTEkCi0JCQlmaW5hbCBTdHJpbmcgVEVYVExFTkdUSCA9IFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTc7IC8vJE5PTi1OTFMtMSQKLQkJCWZpbmFsIFN0cmluZyBDT05URVhUID0gU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xODsgLy8kTk9OLU5MUy0xJAotCQkJdHJlZS5zZXRDb250ZW50UHJvdmlkZXIobmV3IElUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KDApOwotCQkJCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGRBbGwoZG9jdW1lbnRSZWdpb25zKTsKLQkJCQkJfQotCQkJCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCQkJCQkJY2hpbGRyZW4uYWRkKCgoSVRleHRSZWdpb25Db2xsZWN0aW9uKSBwYXJlbnRFbGVtZW50KS5nZXRSZWdpb25zKCkudG9BcnJheSgpKTsKLQkJCQkJfQotCQkJCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElUZXh0UmVnaW9uKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQobmV3IEtleVZhbHVlUGFpcihDT05URVhULCAoKElUZXh0UmVnaW9uKSBwYXJlbnRFbGVtZW50KS5nZXRUeXBlKCkpKTsKLQkJCQkJCWNoaWxkcmVuLmFkZChuZXcgS2V5VmFsdWVQYWlyKFNUQVJULCBJbnRlZ2VyLnRvU3RyaW5nKCgoSVRleHRSZWdpb24pIHBhcmVudEVsZW1lbnQpLmdldFN0YXJ0KCkpKSk7Ci0JCQkJCQljaGlsZHJlbi5hZGQobmV3IEtleVZhbHVlUGFpcihURVhUTEVOR1RILCBJbnRlZ2VyLnRvU3RyaW5nKCgoSVRleHRSZWdpb24pIHBhcmVudEVsZW1lbnQpLmdldFRleHRMZW5ndGgoKSkpKTsKLQkJCQkJCWNoaWxkcmVuLmFkZChuZXcgS2V5VmFsdWVQYWlyKExFTkdUSCwgSW50ZWdlci50b1N0cmluZygoKElUZXh0UmVnaW9uKSBwYXJlbnRFbGVtZW50KS5nZXRMZW5ndGgoKSkpKTsKLQkJCQkJfQotCQkJCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElUZXh0UmVnaW9uTGlzdCkgewotCQkJCQkJY2hpbGRyZW4uYWRkKEFycmF5cy5hc0xpc3QoKChJVGV4dFJlZ2lvbkxpc3QpIHBhcmVudEVsZW1lbnQpLnRvQXJyYXkoKSkpOwotCQkJCQl9Ci0JCQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotCQkJCQkJY2hpbGRyZW4uYWRkQWxsKChDb2xsZWN0aW9uKSBwYXJlbnRFbGVtZW50KTsKLQkJCQkJfQotCQkJCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE9iamVjdFtdKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGRBbGwoQXJyYXlzLmFzTGlzdCgoT2JqZWN0W10pIHBhcmVudEVsZW1lbnQpKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJCXJldHVybiBkb2N1bWVudFJlZ2lvbnMudG9BcnJheSgpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQkJCXJldHVybiAoKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGVsZW1lbnQpLmdldFBhcmVudERvY3VtZW50KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJCXJldHVybiAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBlbGVtZW50KS5nZXRQYXJlbnQoKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gIShlbGVtZW50IGluc3RhbmNlb2YgS2V5VmFsdWVQYWlyKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCQl9Ci0JCQl9KTsKLQkJCXRyZWUuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBLZXlWYWx1ZVBhaXIpCi0JCQkJCQlyZXR1cm4gKChLZXlWYWx1ZVBhaXIpIGVsZW1lbnQpLmZLZXkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpICsgIjogIiArICgoS2V5VmFsdWVQYWlyKSBlbGVtZW50KS5mVmFsdWU7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGVsZW1lbnQ7Ci0JCQkJCQlpbnQgcGFja2FnZU5hbWVMZW5ndGggPSBkb2N1bWVudFJlZ2lvbi5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkubGVuZ3RoKCk7Ci0JCQkJCQlpZiAocGFja2FnZU5hbWVMZW5ndGggPiAwKQotCQkJCQkJCXBhY2thZ2VOYW1lTGVuZ3RoKys7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9IGRvY3VtZW50UmVnaW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpLnN1YnN0cmluZyhwYWNrYWdlTmFtZUxlbmd0aCk7Ci0JCQkJCQlTdHJpbmcgdGV4dCA9ICJbIiArIGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgKyAiLSIgKyBkb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSArICJdICIgKyBuYW1lICsgIkAiICsgZWxlbWVudC5oYXNoQ29kZSgpICsgIiAiICsgZG9jdW1lbnRSZWdpb24uZ2V0VHlwZSgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCQkJCXJldHVybiB0ZXh0OwotCQkJCQl9Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVRleHRSZWdpb24pIHsKLQkJCQkJCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSAoSVRleHRSZWdpb24pIGVsZW1lbnQ7Ci0JCQkJCQlpbnQgcGFja2FnZU5hbWVMZW5ndGggPSB0ZXh0UmVnaW9uLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKS5sZW5ndGgoKTsKLQkJCQkJCWlmIChwYWNrYWdlTmFtZUxlbmd0aCA+IDApCi0JCQkJCQkJcGFja2FnZU5hbWVMZW5ndGgrKzsKLQkJCQkJCVN0cmluZyBuYW1lID0gdGV4dFJlZ2lvbi5nZXRDbGFzcygpLmdldE5hbWUoKS5zdWJzdHJpbmcocGFja2FnZU5hbWVMZW5ndGgpOwotCQkJCQkJU3RyaW5nIHRleHQgPSAiWyIgKyB0ZXh0UmVnaW9uLmdldFN0YXJ0KCkgKyAiLSIgKyB0ZXh0UmVnaW9uLmdldEVuZCgpICsgIl0gIiArIG5hbWUgKyAiQCIgKyBlbGVtZW50Lmhhc2hDb2RlKCkgKyAiICIgKyB0ZXh0UmVnaW9uLmdldFR5cGUoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQkJCQlyZXR1cm4gdGV4dDsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQkJCXRyZWUuc2V0SW5wdXQoZkRvY3VtZW50KTsKLQotCi0JCQlmaW5hbCBUZXh0IGRpc3BsYXlUZXh0ID0gbmV3IFRleHQoc2FzaEZvcm0sIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLQkJCWRpc3BsYXlUZXh0LnNldEJhY2tncm91bmQoc2FzaEZvcm0uZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpKTsKLQkJCXRyZWUuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJCWlmIChvIGluc3RhbmNlb2YgS2V5VmFsdWVQYWlyKQotCQkJCQkJCWRpc3BsYXlUZXh0LnNldFRleHQoKChLZXlWYWx1ZVBhaXIpIG8pLmZWYWx1ZS50b1N0cmluZygpKTsKLQkJCQkJCWVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJCQkJCUlUZXh0U2VsZWN0aW9uIHRleHQgPSAoSVRleHRTZWxlY3Rpb24pIG87Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJZGlzcGxheVRleHQuc2V0VGV4dChmRG9jdW1lbnQuZ2V0KHRleHQuZ2V0T2Zmc2V0KCksIHRleHQuZ2V0TGVuZ3RoKCkpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJZGlzcGxheVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChvIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSB7Ci0JCQkJCQkJSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIG87Ci0JCQkJCQkJZGlzcGxheVRleHQuc2V0VGV4dChyZWdpb24uZ2V0RnVsbFRleHQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQkJZGlzcGxheVRleHQuc2V0VGV4dCgiIiArIG8pOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCXJldHVybiBzYXNoRm9ybTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBmaWxsU2VsZWN0aW9uVGFiQ29udGVudHMoQ29tcG9zaXRlIGFyZWEsIExpc3Qgc2VsZWN0aW9uLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCWFyZWEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJYXJlYS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQkJTGFiZWwgdHlwZU5hbWUgPSBuZXcgTGFiZWwoYXJlYSwgU1dULldSQVApOwotCQkJdHlwZU5hbWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCQkJdHlwZU5hbWUuc2V0VGV4dChkZXNjcmlwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQotCQkJKG5ldyBMYWJlbChhcmVhLCBTV1QuTk9ORSkpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCQlTYXNoRm9ybSBzdHJ1Y3R1cmVkU2FzaEZvcm0gPSBuZXcgU2FzaEZvcm0oYXJlYSwgU1dULk5PTkUpOwotCQkJc3RydWN0dXJlZFNhc2hGb3JtLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQkJc3RydWN0dXJlZFNhc2hGb3JtLnNldE9yaWVudGF0aW9uKFNXVC5WRVJUSUNBTCk7Ci0KLQkJCWZpbmFsIFRhYmxlVmlld2VyIHN0cnVjdHVyZWRTZWxlY3Rpb25UYWJsZSA9IG5ldyBUYWJsZVZpZXdlcihzdHJ1Y3R1cmVkU2FzaEZvcm0sIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQotCQkJc3RydWN0dXJlZFNlbGVjdGlvblRhYmxlLmdldFRhYmxlKCkuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJCXN0cnVjdHVyZWRTZWxlY3Rpb25UYWJsZS5nZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJCXN0cnVjdHVyZWRTZWxlY3Rpb25UYWJsZS5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKLQkJCQlwdWJsaWMgaW50IGNhdGVnb3J5KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikKLQkJCQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIGVsZW1lbnQpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCXJldHVybiBzdXBlci5jYXRlZ29yeShlbGVtZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJc3RydWN0dXJlZFNlbGVjdGlvblRhYmxlLnNldExhYmVsUHJvdmlkZXIobmV3IElUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJfQotCi0JCQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQkJCQlJTm9kZUFkYXB0ZXIgYWRhcHRlckZvciA9ICgoSU5vZGVOb3RpZmllcikgZWxlbWVudCkuZ2V0QWRhcHRlckZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQkJCQlpZiAoY29sdW1uSW5kZXggPT0gMiAmJiBhZGFwdGVyRm9yICE9IG51bGwgJiYgYWRhcHRlckZvciBpbnN0YW5jZW9mIElKRmFjZU5vZGVBZGFwdGVyKSB7Ci0JCQkJCQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IChJSkZhY2VOb2RlQWRhcHRlcikgYWRhcHRlckZvcjsKLQkJCQkJCQlyZXR1cm4gYWRhcHRlci5nZXRMYWJlbEltYWdlKChlbGVtZW50KSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJCQkJY2FzZSAwIDogewotCQkJCQkJCQl0ZXh0ID0gU3RyaW5nLnZhbHVlT2YoKChMaXN0KSBzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUuZ2V0SW5wdXQoKSkuaW5kZXhPZihlbGVtZW50KSk7Ci0JCQkJCQkJfQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDEgOiB7Ci0JCQkJCQkJCXRleHQgPSBlbGVtZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCQkJCX0KLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAyIDogewotCQkJCQkJCQl0ZXh0ID0gU3RyaW5nVXRpbHMuZmlyc3RMaW5lT2YoZWxlbWVudC50b1N0cmluZygpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQl0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gdGV4dDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCX0KLQkJCX0pOwotCi0JCQlUYWJsZUxheW91dCB0bGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCQl0bGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNywgdHJ1ZSkpOwotCQkJdGxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDI4LCB0cnVlKSk7Ci0JCQl0bGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIHRydWUpKTsKLQkJCXN0cnVjdHVyZWRTZWxlY3Rpb25UYWJsZS5nZXRUYWJsZSgpLnNldExheW91dCh0bGF5b3V0KTsKLQotCQkJVGFibGVDb2x1bW4gdGMgPSBuZXcgVGFibGVDb2x1bW4oc3RydWN0dXJlZFNlbGVjdGlvblRhYmxlLmdldFRhYmxlKCksIFNXVC5OT05FKTsKLQkJCXRjLnNldFRleHQoIkl0ZW0iKTsgLy8kTk9OLU5MUy0xJAotCQkJdGMuc2V0UmVzaXphYmxlKHRydWUpOwotCQkJdGMuc2V0V2lkdGgoNDApOwotCi0JCQl0YyA9IG5ldyBUYWJsZUNvbHVtbihzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUuZ2V0VGFibGUoKSwgU1dULk5PTkUpOwotCQkJdGMuc2V0VGV4dCgiQ2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGMuc2V0UmVzaXphYmxlKHRydWUpOwotCQkJdGMuc2V0V2lkdGgoNDApOwotCi0JCQl0YyA9IG5ldyBUYWJsZUNvbHVtbihzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUuZ2V0VGFibGUoKSwgU1dULk5PTkUpOwotCQkJdGMuc2V0VGV4dCgiVmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGMuc2V0UmVzaXphYmxlKHRydWUpOwotCQkJdGMuc2V0V2lkdGgoNDApOwotCi0JCQlzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJCWZpbmFsIExpc3QgaW5wdXQgPSBzZWxlY3Rpb247Ci0JCQlzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUuc2V0SW5wdXQoaW5wdXQpOwotCi0JCQlmaW5hbCBUcmVlVmlld2VyIGluZm9UcmVlID0gbmV3IFRyZWVWaWV3ZXIoc3RydWN0dXJlZFNhc2hGb3JtLCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJCWluZm9UcmVlLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVHJlZVZpZXdlciAmJiBpbmZvVHJlZS5nZXRJbnB1dCgpIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXJGb3IgPSAoKElOb2RlTm90aWZpZXIpIGluZm9UcmVlLmdldElucHV0KCkpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJCQkJaWYgKGFkYXB0ZXJGb3IgIT0gbnVsbCAmJiBhZGFwdGVyRm9yIGluc3RhbmNlb2YgSUpGYWNlTm9kZUFkYXB0ZXIpIHsKLQkJCQkJCQlJSkZhY2VOb2RlQWRhcHRlciBhZGFwdGVyID0gKElKRmFjZU5vZGVBZGFwdGVyKSBhZGFwdGVyRm9yOwotCQkJCQkJCXJldHVybiBhZGFwdGVyLmdldExhYmVsSW1hZ2UoKGluZm9UcmVlLmdldElucHV0KCkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3MpIHsKLQkJCQkJCXJldHVybiAiQ2xhc3M6ICIgKyAoKENsYXNzKSBlbGVtZW50KS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJCQkJCXJldHVybiAiUmVnaXN0ZXJlZCBBZGFwdGVyczoiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVnaW9uKSB7Ci0JCQkJCQlyZXR1cm4gIkluZGV4ZWQgUmVnaW9uIG9mZnNldCBzcGFuOiBbIiArICgoSVJlZ2lvbikgZWxlbWVudCkuZ2V0T2Zmc2V0KCkgKyAiLSIgKyAoKElSZWdpb24pIGVsZW1lbnQpLmdldExlbmd0aCgpICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQl9Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVHJlZVZpZXdlciAmJiBpbmZvVHJlZS5nZXRJbnB1dCgpIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IChJSkZhY2VOb2RlQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBpbmZvVHJlZS5nZXRJbnB1dCgpKS5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gYWRhcHRlci5nZXRMYWJlbFRleHQoKGluZm9UcmVlLmdldElucHV0KCkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQkJCWluZm9UcmVlLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKQotCQkJCQkJcmV0dXJuICgoQ29sbGVjdGlvbikgcGFyZW50RWxlbWVudCkudG9BcnJheSgpOwotCQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCQlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCg0KTsKLQkJCQkJaWYgKGlucHV0RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllciAmJiAoKElOb2RlTm90aWZpZXIpIGlucHV0RWxlbWVudCkuZ2V0QWRhcHRlckZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcykgIT0gbnVsbCkgewotCQkJCQkJCWVsZW1lbnRzLmFkZChpbmZvVHJlZSk7Ci0JCQkJCQl9Ci0JCQkJCQllbGVtZW50cy5hZGQoaW5wdXRFbGVtZW50LmdldENsYXNzKCkpOwotCQkJCQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJCQllbGVtZW50cy5hZGQobmV3IFJlZ2lvbigoKEluZGV4ZWRSZWdpb24pIGlucHV0RWxlbWVudCkuZ2V0U3RhcnRPZmZzZXQoKSwgKChJbmRleGVkUmVnaW9uKSBpbnB1dEVsZW1lbnQpLmdldEVuZE9mZnNldCgpKSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkJCWVsZW1lbnRzLmFkZCgoKElOb2RlTm90aWZpZXIpIGlucHV0RWxlbWVudCkuZ2V0QWRhcHRlcnMoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGVsZW1lbnRzLnRvQXJyYXkoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gZWxlbWVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb247Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXN0cnVjdHVyZWRTZWxlY3Rpb25UYWJsZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJaW50IHNlbGVjdGlvbkluZGV4ID0gc3RydWN0dXJlZFNlbGVjdGlvblRhYmxlLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQkJaWYgKHNlbGVjdGlvbkluZGV4ICE9IC0xKSB7Ci0JCQkJCQlpbmZvVHJlZS5zZXRJbnB1dChzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUuZ2V0RWxlbWVudEF0KHNlbGVjdGlvbkluZGV4KSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpbmZvVHJlZS5zZXRJbnB1dChldmVudC5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJfQotCQkJCQlpbmZvVHJlZS5leHBhbmRUb0xldmVsKDIpOwotCQkJCX0KLQkJCX0pOwotCi0JCQlzdHJ1Y3R1cmVkU2FzaEZvcm0uc2V0V2VpZ2h0cyhuZXcgaW50W117MywgMn0pOwotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0TGluZU51bWJlcihBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJCWludCBsaW5lID0gLTE7Ci0JCQlpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE1hcmtlckFubm90YXRpb24pIHsKLQkJCQlsaW5lID0gTWFya2VyVXRpbGl0aWVzLmdldExpbmVOdW1iZXIoKChNYXJrZXJBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKS5nZXRNYXJrZXIoKSk7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSUFubm90YXRpb25Nb2RlbCBhbm5vdGF0aW9uTW9kZWwgPSBmVGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0QW5ub3RhdGlvbk1vZGVsKGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJCVBvc2l0aW9uIHAgPSBhbm5vdGF0aW9uTW9kZWwuZ2V0UG9zaXRpb24oYW5ub3RhdGlvbik7Ci0JCQkJaWYgKHAgIT0gbnVsbCAmJiAhcC5pc0RlbGV0ZWQoKSkgewotCQkJCQl0cnkgewotCQkJCQkJbGluZSA9IGZEb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQocC5nZXRPZmZzZXQoKSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKGxpbmUpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIEtleVZhbHVlUGFpciB7Ci0JCU9iamVjdCBmS2V5OwotCQlTdHJpbmcgZlZhbHVlOwotCi0JCXB1YmxpYyBLZXlWYWx1ZVBhaXIoT2JqZWN0IGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCQlmS2V5ID0ga2V5OwotCQkJZlZhbHVlID0gdmFsdWU7Ci0JCX0KLQl9Ci0KLQljbGFzcyBTaG93RWRpdG9ySW5mb3JtYXRpb25BY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCQlwdWJsaWMgU2hvd0VkaXRvckluZm9ybWF0aW9uQWN0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCS8qKgotCQkJICogVE9ETzogUHJvdmlkZSBhIG1vcmUgdXNlZnVsIGNvbnRyb2wsIG1heWJlIGEgdGFibGUgd2hlcmUgdGhlCi0JCQkgKiBzZWxlY3Rpb24gc2hvd3MgeW91IHRoZSBwYXJ0aXRpb24ncyB0ZXh0IGluIGEgU3R5bGVkVGV4dCBwYW5lCi0JCQkgKiBiZW5lYXRoIGl0LgotCQkJICovCi0JCQlzdXBlci5ydW4oKTsKLQkJCW5ldyBJbmZvcm1hdGlvbkRpYWxvZygoKENvbnRyb2wpIGZUZXh0RWRpdG9yLmdldEFkYXB0ZXIoQ29udHJvbC5jbGFzcykpLmdldFNoZWxsKCkpLm9wZW4oKTsKLQkJfQotCX0KLQotCUlBY3Rpb24gZlNob3dFZGl0b3JJbmZvcm1hdGlvbkFjdGlvbiA9IG5ldyBTaG93RWRpdG9ySW5mb3JtYXRpb25BY3Rpb24oKTsKLQotCUlUZXh0RWRpdG9yIGZUZXh0RWRpdG9yID0gbnVsbDsKLQotCS8qKgotCSAqIEBwYXJhbSBpZAotCSAqLwotCXB1YmxpYyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbShTdHJpbmcgaWQpIHsKLQkJc3VwZXIoaWQpOwotCQlzZXRUb29sVGlwVGV4dCgiRG91YmxlLWNsaWNrIGZvciBtb3JlIGluZm9ybWF0aW9uIik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIHZpc2libGUKLQkgKiBAcGFyYW0gd2lkdGhJbkNoYXJzCi0JICovCi0JcHVibGljIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtKFN0cmluZyBpZCwgYm9vbGVhbiB2aXNpYmxlLCBpbnQgd2lkdGhJbkNoYXJzKSB7Ci0JCXN1cGVyKGlkLCB2aXNpYmxlLCB3aWR0aEluQ2hhcnMpOwotCQlzZXRUb29sVGlwVGV4dCgiRG91YmxlLWNsaWNrIGZvciBtb3JlIGluZm9ybWF0aW9uIik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElUZXh0RWRpdG9yIHRleHRFZGl0b3IpIHsKLQkJZlRleHRFZGl0b3IgPSB0ZXh0RWRpdG9yOwotCQlzZXRBY3Rpb25IYW5kbGVyKGZTaG93RWRpdG9ySW5mb3JtYXRpb25BY3Rpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91aS9TdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25JbWFnZVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdWkvU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSW1hZ2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDQ5MjNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91aS9TdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25JbWFnZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklBbm5vdGF0aW9uSW1hZ2VQcm92aWRlcjsKLQotLyoqCi0gKiBJbWFnZSBwcm92aWRlciBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvciBhbm5vdGF0aW9ucy4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkltYWdlUHJvdmlkZXIgaW1wbGVtZW50cyBJQW5ub3RhdGlvbkltYWdlUHJvdmlkZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklBbm5vdGF0aW9uSW1hZ2VQcm92aWRlciNnZXRJbWFnZURlc2NyaXB0b3IoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgaW1hZ2VEZXNjcml0cG9ySWQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JQW5ub3RhdGlvbkltYWdlUHJvdmlkZXIjZ2V0SW1hZ2VEZXNjcmlwdG9ySWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEltYWdlRGVzY3JpcHRvcklkKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotICAgICAgICByZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSUFubm90YXRpb25JbWFnZVByb3ZpZGVyI2dldE1hbmFnZWRJbWFnZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRNYW5hZ2VkSW1hZ2UoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCS8vIGZ1dHVyZSByZXR1cm4gZGlmZmVyZW50IHR5cGVzIG9mIG1hbmFnZWQgaW1hZ2VzIGFzIEpEVCBkb2VzCi0JCS8vIGVnLiBvdmVybGF5IGljb24gaW1hZ2VzLCAiZ3JheWVkIiBpbWFnZXMsIHF1aWNrIGZpeGFibGUsIGV0Yy4uLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL0Fzc2VydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3V0aWwvQXNzZXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNGVhZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3V0aWwvQXNzZXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbDsKLQotCi0vKioKLSAqIDxjb2RlPkFzc2VydDwvY29kZT4gaXMgdXNlZnVsIGZvciBmb3IgZW1iZWRkaW5nIHJ1bnRpbWUgc2FuaXR5IGNoZWNrcyBpbgotICogY29kZS4gVGhlIHByZWRpY2F0ZSBtZXRob2RzIGFsbCB0ZXN0IGEgY29uZGl0aW9uIGFuZCB0aHJvdyBzb21lIHR5cGUgb2YKLSAqIHVuY2hlY2tlZCBleGNlcHRpb24gaWYgdGhlIGNvbmRpdGlvbiBkb2VzIG5vdCBob2xkLgotICogPHA+Ci0gKiBBc3NlcnRpb24gZmFpbHVyZSBleGNlcHRpb25zLCBsaWtlIG1vc3QgcnVudGltZSBleGNlcHRpb25zLCBhcmUgdGhyb3duIHdoZW4KLSAqIHNvbWV0aGluZyBpcyBtaXNiZWhhdmluZy4gQXNzZXJ0aW9uIGZhaWx1cmVzIGFyZSBpbnZhcmlhYmx5IHVuc3BlY2lmaWVkCi0gKiBiZWhhdmlvcjsgY29uc2VxdWVudGx5LCBjbGllbnRzIHNob3VsZCBuZXZlciByZWx5IG9uIHRoZXNlIGJlaW5nIHRocm93bgotICogKGFuZCBjZXJ0YWlubHkgc2hvdWxkIG5vdCBiZWluZyBjYXRjaGluZyB0aGVtIHNwZWNpZmljYWxseSkuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBc3NlcnQgewotCi0JLyoqCi0JICogPGNvZGU+QXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uPC9jb2RlPiBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uIHRocm93bgotCSAqIGJ5IHNvbWUgb2YgdGhlIG1ldGhvZHMgaW4gPGNvZGU+QXNzZXJ0PC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBUaGlzIGNsYXNzIGlzIG5vdCBkZWNsYXJlZCBwdWJsaWMgdG8gcHJldmVudCBzb21lIG1pc3VzZXM7IHByb2dyYW1zCi0JICogdGhhdCBjYXRjaCBvciBvdGhlcndpc2UgZGVwZW5kIG9uIGFzc2VydGlvbiBmYWlsdXJlcyBhcmUgc3VzY2VwdGlibGUgdG8KLQkgKiB1bmV4cGVjdGVkIGJyZWFrYWdlIHdoZW4gYXNzZXJ0aW9ucyBpbiB0aGUgY29kZSBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKiA8L3A+Ci0JICovCi0JY2xhc3MgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uLgotCQkgKi8KLQkJcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KLQkJICovCi0JCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oU3RyaW5nIGRldGFpbCkgewotCQkJc3VwZXIoZGV0YWlsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCBhbiBhcmd1bWVudCBpcyBsZWdhbC4gSWYgdGhlIGdpdmVuIGJvb2xlYW4gaXMgbm90Ci0JICogPGNvZGU+dHJ1ZTwvY29kZT4sIGFuIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4gaXMKLQkgKiB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQKLQkgKiBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIGxlZ2FsaXR5IHRlc3QgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWwoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1lc3NhZ2UpOwotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoaXMgaXMKLQkgKiBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4gVGhlIGdpdmVuCi0JICogbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gdGVzdAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaXNOb3ROdWxsKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEFzc2VydCgpLm5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24obWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGJvb2xlYW4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIElmIHRoaXMgaXMgbm90Ci0JICogdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4gVGhlIGdpdmVuIG1lc3NhZ2UKLQkgKiBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZQotCSAqICAgICAgICAgY2hlY2sgZmFpbHMpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZShib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmICghZXhwcmVzc2lvbikgewotCQkJdGhyb3cgbmV3IEFzc2VydCgpLm5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24obWVzc2FnZSk7Ci0JCX0KLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkLiAqLwotCXByaXZhdGUgQXNzZXJ0KCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL0VkaXRvclV0aWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL0VkaXRvclV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEyNjM0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9FZGl0b3JVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci0KLS8qKgotICogSGVscGZ1bCBtZXRob2RzIHRvIGJlIHVzZWQgd2l0aCB0aGUgU291cmNlIEVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yVXRpbGl0eSB7Ci0KLQkvKioKLQkgKiBBcHBlbmRzIHRvIG1vZGlmaWVyIHN0cmluZyBvZiB0aGUgZ2l2ZW4gU1dUIG1vZGlmaWVyIGJpdCB0byB0aGUgZ2l2ZW4KLQkgKiBtb2RpZmllclN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kaWZpZXJTdHJpbmcKLQkgKiAgICAgICAgICAgIHRoZSBtb2RpZmllciBzdHJpbmcKLQkgKiBAcGFyYW0gbW9kaWZpZXIKLQkgKiAgICAgICAgICAgIGFuIGludCB3aXRoIFNXVCBtb2RpZmllciBiaXQKLQkgKiBAcmV0dXJuIHRoZSBjb25jYXRlbmF0ZWQgbW9kaWZpZXIgc3RyaW5nCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFwcGVuZE1vZGlmaWVyU3RyaW5nKFN0cmluZyBtb2RpZmllclN0cmluZywgaW50IG1vZGlmaWVyKSB7Ci0JCWlmIChtb2RpZmllclN0cmluZyA9PSBudWxsKQotCQkJbW9kaWZpZXJTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbmV3TW9kaWZpZXJTdHJpbmcgPSBBY3Rpb24uZmluZE1vZGlmaWVyU3RyaW5nKG1vZGlmaWVyKTsKLQkJaWYgKG1vZGlmaWVyU3RyaW5nLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbmV3TW9kaWZpZXJTdHJpbmc7Ci0JCXJldHVybiBtb2RpZmllclN0cmluZyArICIgKyAiICsgbmV3TW9kaWZpZXJTdHJpbmc7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgc3RhdGUgbWFzayBmb3IgdGhlIGdpdmVuIG1vZGlmaWVyIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kaWZpZXJzCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHdpdGggdGhlIG1vZGlmaWVycywgc2VwYXJhdGVkIGJ5ICcrJywgJy0nLCAnOycsCi0JICogICAgICAgICAgICAnLCcgb3IgJy4nCi0JICogQHJldHVybiB0aGUgc3RhdGUgbWFzayBvciAtMSBpZiB0aGUgaW5wdXQgaXMgaW52YWxpZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVTdGF0ZU1hc2soU3RyaW5nIG1vZGlmaWVycykgewotCQlpZiAobW9kaWZpZXJzID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJaWYgKG1vZGlmaWVycy5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIFNXVC5OT05FOwotCi0JCWludCBzdGF0ZU1hc2sgPSAwOwotCQlTdHJpbmdUb2tlbml6ZXIgbW9kaWZpZXJUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG1vZGlmaWVycywgIiw7LjorLSogIik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKG1vZGlmaWVyVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJaW50IG1vZGlmaWVyID0gRWRpdG9yVXRpbGl0eS5maW5kTG9jYWxpemVkTW9kaWZpZXIobW9kaWZpZXJUb2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJaWYgKG1vZGlmaWVyID09IDAgfHwgKHN0YXRlTWFzayAmIG1vZGlmaWVyKSA9PSBtb2RpZmllcikKLQkJCQlyZXR1cm4gLTE7Ci0JCQlzdGF0ZU1hc2sgPSBzdGF0ZU1hc2sgfCBtb2RpZmllcjsKLQkJfQotCQlyZXR1cm4gc3RhdGVNYXNrOwotCX0KLQotCS8qKgotCSAqIE1hcHMgdGhlIGxvY2FsaXplZCBtb2RpZmllciBuYW1lIHRvIGEgY29kZSBpbiB0aGUgc2FtZSBtYW5uZXIgYXMKLQkgKiAjZmluZE1vZGlmaWVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIFNXVCBtb2RpZmllciBiaXQsIG9yIDxjb2RlPjA8L2NvZGU+IGlmIG5vIG1hdGNoIHdhcyBmb3VuZAotCSAqIEBzZWUgZmluZE1vZGlmaWVyCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZmluZExvY2FsaXplZE1vZGlmaWVyKFN0cmluZyB0b2tlbikgewotCQlpZiAodG9rZW4gPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCi0JCWlmICh0b2tlbi5lcXVhbHNJZ25vcmVDYXNlKEFjdGlvbi5maW5kTW9kaWZpZXJTdHJpbmcoU1dULkNUUkwpKSkKLQkJCXJldHVybiBTV1QuQ1RSTDsKLQkJaWYgKHRva2VuLmVxdWFsc0lnbm9yZUNhc2UoQWN0aW9uLmZpbmRNb2RpZmllclN0cmluZyhTV1QuU0hJRlQpKSkKLQkJCXJldHVybiBTV1QuU0hJRlQ7Ci0JCWlmICh0b2tlbi5lcXVhbHNJZ25vcmVDYXNlKEFjdGlvbi5maW5kTW9kaWZpZXJTdHJpbmcoU1dULkFMVCkpKQotCQkJcmV0dXJuIFNXVC5BTFQ7Ci0JCWlmICh0b2tlbi5lcXVhbHNJZ25vcmVDYXNlKEFjdGlvbi5maW5kTW9kaWZpZXJTdHJpbmcoU1dULkNPTU1BTkQpKSkKLQkJCXJldHVybiBTV1QuQ09NTUFORDsKLQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBUZW1wb3JhcnkgbWV0aG9kIHRvIGhlbHAgbWlncmF0ZSBmcm9tIHVzaW5nIFN0cnVjdHVyZWRUZXh0Q29sb3JzIHRvCi0JICogdXNpbmcgYmFzZSBDb2xvclJlZ2lzdHJ5LiBJbnN0ZWFkIG9mIHVzaW5nIHN5bWJvbGljIG5hbWVzIGluIHRoZSBjb2xvcgotCSAqIHJlZ2lzdHJ5LCB3ZSBhcmUgY3VycmVudGx5IG1hcHBpbmcgdGhlIHJnYi50b1N0cmluZyB2YWx1ZSB0bwotCSAqIGNvcnJlc3BvbmRpbmcgY29sb3IuCi0JICogCi0JICogQHBhcmFtIHJnYgotCSAqIEByZXR1cm4gQ29sb3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbG9yIGdldENvbG9yKFJHQiByZ2IpIHsKLQkJaWYgKHJnYiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gZ2V0IHRoZSBjb2xvciBmcm9tIHRoZSBwbGF0Zm9ybSBjb2xvciByZWdpc3RyeQotCQlDb2xvciBjb2xvciA9IEpGYWNlUmVzb3VyY2VzLmdldENvbG9yUmVnaXN0cnkoKS5nZXQocmdiLnRvU3RyaW5nKCkpOwotCi0JCS8vIGlmIHRoZSBwbGF0Zm9ybSBjb2xvciByZWdpc3RyeSBkb2VzIG5vdCBoYXZlIHRoaXMgY29sb3IgeWV0LCBhZGQgdG8KLQkJLy8gdGhlIHJlZ2lzdHJ5Ci0JCWlmIChjb2xvciA9PSBudWxsKSB7Ci0JCQlKRmFjZVJlc291cmNlcy5nZXRDb2xvclJlZ2lzdHJ5KCkucHV0KHJnYi50b1N0cmluZygpLCByZ2IpOwotCQkJY29sb3IgPSBKRmFjZVJlc291cmNlcy5nZXRDb2xvclJlZ2lzdHJ5KCkuZ2V0KHJnYi50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gY29sb3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kaWZpZXIgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gU1dUIG1vZGlmaWVyIG1vZGlmaWVyIGJpdHMuCi0JICogCi0JICogQHBhcmFtIHN0YXRlTWFzawotCSAqICAgICAgICAgICAgdGhlIFNXVCBtb2RpZmllciBiaXRzCi0JICogQHJldHVybiB0aGUgbW9kaWZpZXIgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TW9kaWZpZXJTdHJpbmcoaW50IHN0YXRlTWFzaykgewotCQlTdHJpbmcgbW9kaWZpZXJTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoKHN0YXRlTWFzayAmIFNXVC5DVFJMKSA9PSBTV1QuQ1RSTCkKLQkJCW1vZGlmaWVyU3RyaW5nID0gYXBwZW5kTW9kaWZpZXJTdHJpbmcobW9kaWZpZXJTdHJpbmcsIFNXVC5DVFJMKTsKLQkJaWYgKChzdGF0ZU1hc2sgJiBTV1QuQUxUKSA9PSBTV1QuQUxUKQotCQkJbW9kaWZpZXJTdHJpbmcgPSBhcHBlbmRNb2RpZmllclN0cmluZyhtb2RpZmllclN0cmluZywgU1dULkFMVCk7Ci0JCWlmICgoc3RhdGVNYXNrICYgU1dULlNISUZUKSA9PSBTV1QuU0hJRlQpCi0JCQltb2RpZmllclN0cmluZyA9IGFwcGVuZE1vZGlmaWVyU3RyaW5nKG1vZGlmaWVyU3RyaW5nLCBTV1QuU0hJRlQpOwotCQlpZiAoKHN0YXRlTWFzayAmIFNXVC5DT01NQU5EKSA9PSBTV1QuQ09NTUFORCkKLQkJCW1vZGlmaWVyU3RyaW5nID0gYXBwZW5kTW9kaWZpZXJTdHJpbmcobW9kaWZpZXJTdHJpbmcsIFNXVC5DT01NQU5EKTsKLQotCQlyZXR1cm4gbW9kaWZpZXJTdHJpbmc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3V0aWwvUGl4ZWxDb252ZXJ0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL1BpeGVsQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNzRiM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3V0aWwvUGl4ZWxDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogQmFzZWQgb24gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnV0aWwuUGl4ZWxDb252ZXJ0ZXIKLSAqLwotcHVibGljIGNsYXNzIFBpeGVsQ29udmVydGVyIHsKLQkKLQlwcml2YXRlIGZpbmFsIEZvbnRNZXRyaWNzIGZGb250TWV0cmljczsKLQkKLQlwdWJsaWMgUGl4ZWxDb252ZXJ0ZXIoQ29udHJvbCBjb250cm9sKSB7Ci0JCXRoaXMoY29udHJvbC5nZXRGb250KCkpOwotCX0KLQkKLQlwdWJsaWMgUGl4ZWxDb252ZXJ0ZXIoRm9udCBmb250KSB7Ci0JCUdDIGdjID0gbmV3IEdDKGZvbnQuZ2V0RGV2aWNlKCkpOwotCQlnYy5zZXRGb250KGZvbnQpOwotCQlmRm9udE1ldHJpY3M9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoKLQkgKiBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlI2NvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoaW50KQotCSAqLwotCXB1YmxpYyBpbnQgY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyhpbnQgY2hhcnMpIHsKLQkJcmV0dXJuIERpYWxvZy5jb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKGZGb250TWV0cmljcywgY2hhcnMpOwotCX0KLQotCS8qCi0JICogc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nUGFnZSNjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhpbnQpCi0JICovCi0JcHVibGljIGludCBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhpbnQgZGx1cykgewotCQlyZXR1cm4gRGlhbG9nLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGZGb250TWV0cmljcywgZGx1cyk7Ci0JfQotCi0JLyoKLQkgKiBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlI2NvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhpbnQpCi0JICovCi0JcHVibGljIGludCBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoaW50IGRsdXMpIHsKLQkJcmV0dXJuIERpYWxvZy5jb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoZkZvbnRNZXRyaWNzLCBkbHVzKTsKLQl9Ci0JCi0JLyoKLQkgKiBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlI2NvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhpbnQpCi0JICovCi0JcHVibGljIGludCBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoaW50IGNoYXJzKSB7Ci0JCXJldHVybiBEaWFsb2cuY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGZGb250TWV0cmljcywgY2hhcnMpOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL1BsYXRmb3JtU3RhdHVzTGluZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL1BsYXRmb3JtU3RhdHVzTGluZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q2NDI0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9QbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlZlcmlmeUtleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogVXRpbGl0eSB0byBkaXNwbGF5IChhbmQvb3IgY2xlYXIpIG1lc3NhZ2VzIG9uIHRoZSBzdGF0dXMgbGluZS4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIFBsYXRmb3JtU3RhdHVzTGluZVV0aWwgewotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2xlYXJFcnJvck1lc3NhZ2UgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWRpc3BsYXlNZXNzYWdlKG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byBjbGVhciBtZXNzYWdlIG9uIGZvY3VzIGxvc3MsIGNoYW5nZSBvZiBzZWxlY3Rpb24sIGtleSB0eXBlLAotCSAqIGV0Yy4uLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIE9uZVRpbWVMaXN0ZW5lciBleHRlbmRzIEZvY3VzQWRhcHRlciBpbXBsZW1lbnRzIFZlcmlmeUtleUxpc3RlbmVyLCBTZWxlY3Rpb25MaXN0ZW5lciwgTW91c2VMaXN0ZW5lciB7Ci0KLQkJcHJpdmF0ZSBSdW5uYWJsZSBmUnVubmVyID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHlsZWRUZXh0IGZTdHlsZWRUZXh0OwotCi0JCXB1YmxpYyBPbmVUaW1lTGlzdGVuZXIoU3R5bGVkVGV4dCB0YXJnZXQsIFJ1bm5hYmxlIHIpIHsKLQkJCWZTdHlsZWRUZXh0ID0gdGFyZ2V0OwotCQkJZlJ1bm5lciA9IHI7Ci0JCQlmU3R5bGVkVGV4dC5hZGRWZXJpZnlLZXlMaXN0ZW5lcih0aGlzKTsKLQkJCWZTdHlsZWRUZXh0LmFkZEZvY3VzTGlzdGVuZXIodGhpcyk7Ci0JCQlmU3R5bGVkVGV4dC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJCWZTdHlsZWRUZXh0LmFkZE1vdXNlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQl1bmhvb2tBbmRSdW4oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7Ci0JCQl1bmhvb2tBbmRSdW4oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCXVuaG9va0FuZFJ1bigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJCS8vCi0JCX0KLQotCQlwcml2YXRlIHZvaWQgdW5ob29rQW5kUnVuKCkgewotCQkJZlN0eWxlZFRleHQucmVtb3ZlVmVyaWZ5S2V5TGlzdGVuZXIodGhpcyk7Ci0JCQlmU3R5bGVkVGV4dC5yZW1vdmVGb2N1c0xpc3RlbmVyKHRoaXMpOwotCQkJZlN0eWxlZFRleHQucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQlmU3R5bGVkVGV4dC5yZW1vdmVNb3VzZUxpc3RlbmVyKHRoaXMpOwotCQkJZlN0eWxlZFRleHQuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhmUnVubmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHZlcmlmeUtleShWZXJpZnlFdmVudCBldmVudCkgewotCQkJdW5ob29rQW5kUnVuKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJdW5ob29rQW5kUnVuKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl1bmhvb2tBbmRSdW4oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0YXR1cyBsaW5lIHdpbGwgYmUgY2xlYXJlZCB3LyBrZXkgdHlwZSwgb3Igc2VsZWN0aW9uIGNoYW5nZQotCSAqIAotCSAqIEBwYXJhbSB3aWRnZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkT25lVGltZUNsZWFyTGlzdGVuZXIoKSB7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotCQlib29sZWFuIGFkZGVkID0gZmFsc2U7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpIGVkaXRvci5nZXRBZGFwdGVyKENvbnRyb2wuY2xhc3MpOwotCQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJYWRkT25lVGltZUNsZWFyTGlzdGVuZXIoKChTdHlsZWRUZXh0KSBjb250cm9sKSk7Ci0JCQkJYWRkZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmICghYWRkZWQpIHsKLQkJCS8vIGNsZWFyIHRoZSBlcnJvciBtZXNzYWdlIGltbWVkaWF0ZWx5Ci0JCQlkaXNwbGF5TWVzc2FnZShudWxsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkT25lVGltZUNsZWFyTGlzdGVuZXIoU3R5bGVkVGV4dCB3aWRnZXQpIHsKLQkJbmV3IE9uZVRpbWVMaXN0ZW5lcih3aWRnZXQsIG5ldyBDbGVhckVycm9yTWVzc2FnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIHN0YXR1cyBsaW5lIGltbWVkaWF0ZWx5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyU3RhdHVzTGluZSgpIHsKLQkJZGlzcGxheU1lc3NhZ2UobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheSBhIG1lc3NhZ2Ugb24gdGhlIHN0YXR1cyBsaW5lICh3aXRoIGEgYmVlcCkKLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRpc3BsYXlFcnJvck1lc3NhZ2UoU3RyaW5nIG1zZykgewotCQlkaXNwbGF5TWVzc2FnZShtc2cpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5iZWVwKCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheSBhIG1lc3NhZ2Ugb24gdGhlIHN0YXR1cyBsaW5lIChubyBiZWVwKQotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlzcGxheU1lc3NhZ2UoU3RyaW5nIG1zZykgewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLnNldEVycm9yTWVzc2FnZShtc2cpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJRWRpdG9yUGFydCBnZXRBY3RpdmVFZGl0b3IoKSB7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IG51bGw7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyA9PSBudWxsKSB7Ci0JCQl3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQl9Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKQotCQkJCWVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGVkaXRvcjsKLQl9Ci0KLQlwcml2YXRlIFBsYXRmb3JtU3RhdHVzTGluZVV0aWwoKSB7Ci0JCS8vIGZvcmNlIHVzZSBvZiBzaW5nbGV0b24KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9SZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3V0aWwvUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZjODk1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9SZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLQotCi0vKioKLSAqIFRlbXBsYXRlIGltcGxlbWVudGF0aW9uIG9mIGEgcmVnaXN0cnkgcmVhZGVyIHRoYXQgY3JlYXRlcyBvYmplY3RzCi0gKiByZXByZXNlbnRpbmcgcmVnaXN0cnkgY29udGVudHMuIFR5cGljYWxseSwgYW4gZXh0ZW5zaW9uIGNvbnRhaW5zIG9uZQotICogZWxlbWVudCwgYnV0IHRoaXMgcmVhZGVyIGhhbmRsZXMgbXVsdGlwbGUgZWxlbWVudHMgcGVyIGV4dGVuc2lvbi4KLSAqIAotICogVG8gc3RhcnQgcmVhZGluZyB0aGUgZXh0ZW5zaW9ucyBmcm9tIHRoZSByZWdpc3RyeSBmb3IgYW4gZXh0ZW5zaW9uIHBvaW50LAotICogY2FsbCB0aGUgbWV0aG9kIDxjb2RlPnJlYWRSZWdpc3RyeTwvY29kZT4uCi0gKiAKLSAqIFRvIHJlYWQgY2hpbGRyZW4gb2YgYW4gSUNvbmZpZ3VyYXRpb25FbGVtZW50LCBjYWxsIHRoZSBtZXRob2QKLSAqIDxjb2RlPnJlYWRFbGVtZW50Q2hpbGRyZW48L2NvZGU+IGZyb20geW91ciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWV0aG9kCi0gKiA8Y29kZT5yZWFkRWxlbWVudDwvY29kZT4sIGFzIGl0IHdpbGwgbm90IGJlIGRvbmUgYnkgZGVmYXVsdC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXByb3RlY3RlZCBSZWdpc3RyeVJlYWRlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBleHRyYWN0cyBkZXNjcmlwdGlvbiBhcyBhIHN1YmVsZW1lbnQgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogCi0JICogQHJldHVybiBkZXNjcmlwdGlvbiBzdHJpbmcgaWYgZGVmaW5lZCwgb3IgZW1wdHkgc3RyaW5nIGlmIG5vdC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBjb25maWcuZ2V0Q2hpbGRyZW4oVEFHX0RFU0NSSVBUSU9OKTsKLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA+PSAxKSB7Ci0JCQlyZXR1cm4gY2hpbGRyZW5bMF0uZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBlcnJvciBpbiB0aGUgd29ya2JlbmNoIGxvZyB1c2luZyB0aGUgcHJvdmlkZWQgdGV4dCBhbmQgdGhlCi0JICogaW5mb3JtYXRpb24gaW4gdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2dFcnJvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRleHQpIHsKLQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKCJQbHVnaW4gIiArIGV4dGVuc2lvbi5nZXROYW1lc3BhY2UoKSArICIsIGV4dGVuc2lvbiAiICsgZXh0ZW5zaW9uLmdldEV4dGVuc2lvblBvaW50VW5pcXVlSWRlbnRpZmllcigpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJYnVmLmFwcGVuZCgiXG4iICsgdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIGJ1Zi50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIGEgdmVyeSBjb21tb24gcmVnaXN0cnkgZXJyb3Igd2hlbiBhIHJlcXVpcmVkIGF0dHJpYnV0ZSBpcyBtaXNzaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvZ01pc3NpbmdBdHRyaWJ1dGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCWxvZ0Vycm9yKGVsZW1lbnQsICJSZXF1aXJlZCBhdHRyaWJ1dGUgJyIgKyBhdHRyaWJ1dGVOYW1lICsgIicgbm90IGRlZmluZWQiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIGEgcmVnaXN0cnkgZXJyb3Igd2hlbiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGlzIHVua25vd24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9nVW5rbm93bkVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJbG9nRXJyb3IoZWxlbWVudCwgIlVua25vd24gZXh0ZW5zaW9uIHRhZyBmb3VuZDogIiArIGVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEFwcGx5IGEgcmVwcm9kdWNhYmxlIG9yZGVyIHRvIHRoZSBsaXN0IG9mIGV4dGVuc2lvbnMgcHJvdmlkZWQsIHN1Y2gKLQkgKiB0aGF0IHRoZSBvcmRlciB3aWxsIG5vdCBjaGFuZ2UgYXMgZXh0ZW5zaW9ucyBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSUV4dGVuc2lvbltdIG9yZGVyRXh0ZW5zaW9ucyhJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucykgewotCQkvLyBCeSBkZWZhdWx0LCB0aGUgb3JkZXIgaXMgYmFzZWQgb24gcGx1Z2luIGlkIHNvcnRlZAotCQkvLyBpbiBhc2NlbmRpbmcgb3JkZXIuIFRoZSBvcmRlciBmb3IgYSBwbHVnaW4gcHJvdmlkaW5nCi0JCS8vIG1vcmUgdGhhbiBvbmUgZXh0ZW5zaW9uIGZvciBhbiBleHRlbnNpb24gcG9pbnQgaXMKLQkJLy8gZGVwZW5kZW50IGluIHRoZSBvcmRlciBsaXN0ZWQgaW4gdGhlIFhNTCBmaWxlLgotCQlTb3J0ZXIgc29ydGVyID0gbmV3IFNvcnRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGNvbXBhcmUoT2JqZWN0IGV4dGVuc2lvbjEsIE9iamVjdCBleHRlbnNpb24yKSB7Ci0JCQkJU3RyaW5nIHMxID0gKChJRXh0ZW5zaW9uKSBleHRlbnNpb24xKS5nZXROYW1lc3BhY2UoKS50b1VwcGVyQ2FzZSgpOwotCQkJCVN0cmluZyBzMiA9ICgoSUV4dGVuc2lvbikgZXh0ZW5zaW9uMikuZ2V0TmFtZXNwYWNlKCkudG9VcHBlckNhc2UoKTsKLQkJCQkvL1JldHVybiB0cnVlIGlmIGVsZW1lbnRUd28gaXMgJ2dyZWF0ZXIgdGhhbicgZWxlbWVudE9uZQotCQkJCXJldHVybiBzMi5jb21wYXJlVG8oczEpID4gMDsKLQkJCX0KLQkJfTsKLQotCQlPYmplY3RbXSBzb3J0ZWQgPSBzb3J0ZXIuc29ydChleHRlbnNpb25zKTsKLQkJSUV4dGVuc2lvbltdIHNvcnRlZEV4dGVuc2lvbiA9IG5ldyBJRXh0ZW5zaW9uW3NvcnRlZC5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHNvcnRlZCwgMCwgc29ydGVkRXh0ZW5zaW9uLCAwLCBzb3J0ZWQubGVuZ3RoKTsKLQkJcmV0dXJuIHNvcnRlZEV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVhZCBlbGVtZW50J3MgYXR0cmlidXRlcy4gSWYgY2hpbGRyZW4gc2hvdWxkCi0JICogYWxzbyBiZSByZWFkLCB0aGVuIGltcGxlbWVudG9yIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nCi0JICogPGNvZGU+cmVhZEVsZW1lbnRDaGlsZHJlbjwvY29kZT4uIEltcGxlbWVudG9yIGlzIGFsc28gcmVzcG9uc2libGUKLQkgKiBmb3IgbG9nZ2luZyBtaXNzaW5nIGF0dHJpYnV0ZXMuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGVsZW1lbnQgd2FzIHJlY29nbml6ZWQsIGZhbHNlIGlmIG5vdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBSZWFkIHRoZSBlbGVtZW50J3MgY2hpbGRyZW4uIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBzdWJjbGFzcycKLQkgKiByZWFkRWxlbWVudCBtZXRob2Qgd2hlbiBpdCB3YW50cyB0byByZWFkIHRoZSBjaGlsZHJlbiBvZiB0aGUgZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudENoaWxkcmVuKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJlYWRFbGVtZW50cyhlbGVtZW50LmdldENoaWxkcmVuKCkpOwotCX0KLQotCS8qKgotCSAqIFJlYWQgZWFjaCBlbGVtZW50IG9uZSBhdCBhIHRpbWUgYnkgY2FsbGluZyB0aGUgc3ViY2xhc3MgaW1wbGVtZW50YXRpb24KLQkgKiBvZiA8Y29kZT5yZWFkRWxlbWVudDwvY29kZT4uCi0JICogCi0JICogTG9ncyBhbiBlcnJvciBpZiB0aGUgZWxlbWVudCB3YXMgbm90IHJlY29nbml6ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnRzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pKQotCQkJCWxvZ1Vua25vd25FbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlYWQgb25lIGV4dGVuc2lvbiBieSBsb29waW5nIHRocm91Z2ggaXRzIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZEV4dGVuc2lvbihJRXh0ZW5zaW9uIGV4dGVuc2lvbikgewotCQlyZWFkRWxlbWVudHMoZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgcmVhZFJlZ2lzdHJ5KElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZFJlZ2lzdHJ5KElQbHVnaW5SZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpIHsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQocGx1Z2luSWQsIGV4dGVuc2lvblBvaW50KTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gcG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZXh0ZW5zaW9ucyA9IG9yZGVyRXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLQkJCQlyZWFkRXh0ZW5zaW9uKGV4dGVuc2lvbnNbaV0pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFN0YXJ0IHRoZSByZWdpc3RyeSByZWFkaW5nIHByb2Nlc3MgdXNpbmcgdGhlIHN1cHBsaWVkIHBsdWdpbiBJRCBhbmQKLQkgKiBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZFJlZ2lzdHJ5KElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpIHsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQocGx1Z2luSWQsIGV4dGVuc2lvblBvaW50KTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gcG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZXh0ZW5zaW9ucyA9IG9yZGVyRXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLQkJCQlyZWFkRXh0ZW5zaW9uKGV4dGVuc2lvbnNbaV0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3V0aWwvU29ydGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9Tb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E4OTVkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9Tb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWw7Ci0KLQotCi0vKioKLSAqIFRoZSBTb3J0T3BlcmF0aW9uIHRha2VzIGEgY29sbGVjdGlvbiBvZiBvYmplY3RzIGFuZCByZXR1cm5zIGEgc29ydGVkCi0gKiBjb2xsZWN0aW9uIG9mIHRoZXNlIG9iamVjdHMuIENvbmNyZXRlIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHByb3ZpZGUgdGhlCi0gKiBjcml0ZXJpYSBmb3IgdGhlIHNvcnRpbmcgb2YgdGhlIG9iamVjdHMgYmFzZWQgb24gdGhlIHR5cGUgb2YgdGhlIG9iamVjdHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTb3J0ZXIgewotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGVsZW1lbnRUd28gaXMgJ2dyZWF0ZXIgdGhhbicgZWxlbWVudE9uZSBUaGlzIGlzIHRoZQotCSAqICdvcmRlcmluZycgbWV0aG9kIG9mIHRoZSBzb3J0IG9wZXJhdGlvbi4gRWFjaCBzdWJjbGFzcyBvdmVyaWRlcyB0aGlzCi0JICogbWV0aG9kIHdpdGggdGhlIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gb2YgdGhlICdncmVhdGVyIHRoYW4nIGNvbmNlcHQKLQkgKiBmb3IgdGhlIG9iamVjdHMgYmVpbmcgc29ydGVkLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNvbXBhcmUoT2JqZWN0IGVsZW1lbnRPbmUsIE9iamVjdCBlbGVtZW50VHdvKTsKLQotCS8qKgotCSAqIFNvcnQgdGhlIG9iamVjdHMgaW4gc29ydGVkIGNvbGxlY3Rpb24gYW5kIHJldHVybiB0aGF0IGNvbGxlY3Rpb24uCi0JICovCi0JcHJpdmF0ZSBPYmplY3RbXSBxdWlja1NvcnQoT2JqZWN0W10gc29ydGVkQ29sbGVjdGlvbiwgaW50IGxlZnQsIGludCByaWdodCkgewotCQlpbnQgb3JpZ2luYWxMZWZ0ID0gbGVmdDsKLQkJaW50IG9yaWdpbmFsUmlnaHQgPSByaWdodDsKLQkJT2JqZWN0IG1pZCA9IHNvcnRlZENvbGxlY3Rpb25bKGxlZnQgKyByaWdodCkgLyAyXTsKLQotCQlkbyB7Ci0JCQl3aGlsZSAoY29tcGFyZShzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdLCBtaWQpKQotCQkJCWxlZnQrKzsKLQkJCXdoaWxlIChjb21wYXJlKG1pZCwgc29ydGVkQ29sbGVjdGlvbltyaWdodF0pKQotCQkJCXJpZ2h0LS07Ci0JCQlpZiAobGVmdCA8PSByaWdodCkgewotCQkJCU9iamVjdCB0bXAgPSBzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdOwotCQkJCXNvcnRlZENvbGxlY3Rpb25bbGVmdF0gPSBzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XTsKLQkJCQlzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XSA9IHRtcDsKLQkJCQlsZWZ0Kys7Ci0JCQkJcmlnaHQtLTsKLQkJCX0KLQkJfSB3aGlsZSAobGVmdCA8PSByaWdodCk7Ci0KLQkJaWYgKG9yaWdpbmFsTGVmdCA8IHJpZ2h0KQotCQkJc29ydGVkQ29sbGVjdGlvbiA9IHF1aWNrU29ydChzb3J0ZWRDb2xsZWN0aW9uLCBvcmlnaW5hbExlZnQsIHJpZ2h0KTsKLQkJaWYgKGxlZnQgPCBvcmlnaW5hbFJpZ2h0KQotCQkJc29ydGVkQ29sbGVjdGlvbiA9IHF1aWNrU29ydChzb3J0ZWRDb2xsZWN0aW9uLCBsZWZ0LCBvcmlnaW5hbFJpZ2h0KTsKLQotCQlyZXR1cm4gc29ydGVkQ29sbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgc29ydGVkIGNvbGxlY3Rpb24gZnJvbSB0aGlzIHVuc29ydGVkIGNvbGxlY3Rpb24uIFNvcnQKLQkgKiB1c2luZyBxdWljayBzb3J0LgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBzb3J0KE9iamVjdFtdIHVuU29ydGVkQ29sbGVjdGlvbikgewotCQlpbnQgc2l6ZSA9IHVuU29ydGVkQ29sbGVjdGlvbi5sZW5ndGg7Ci0JCU9iamVjdFtdIHNvcnRlZENvbGxlY3Rpb24gPSBuZXcgT2JqZWN0W3NpemVdOwotCi0JCS8vY29weSB0aGUgYXJyYXkgc28gY2FuIHJldHVybiBhIG5ldyBzb3J0ZWQgY29sbGVjdGlvbgotCQlTeXN0ZW0uYXJyYXljb3B5KHVuU29ydGVkQ29sbGVjdGlvbiwgMCwgc29ydGVkQ29sbGVjdGlvbiwgMCwgc2l6ZSk7Ci0JCWlmIChzaXplID4gMSkKLQkJCXF1aWNrU29ydChzb3J0ZWRDb2xsZWN0aW9uLCAwLCBzaXplIC0gMSk7Ci0KLQkJcmV0dXJuIHNvcnRlZENvbGxlY3Rpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ZpZXcvZXZlbnRzL0NhcmV0RXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9DYXJldEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MDc4MzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ZpZXcvZXZlbnRzL0NhcmV0RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnZpZXcuZXZlbnRzOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIC0gdXNlIGJhc2Ugc2VsZWN0aW9uIG5vdGlmaWNhdGlvbgotICogCi0gKiBTaW1wbHkgaG9sZHMgZGF0YSB0byBiZSBwYXNzZWQgdG8gQ2FyZXRFdmVudExpc3RlbmVycwotICovCi1wdWJsaWMgY2xhc3MgQ2FyZXRFdmVudCBleHRlbmRzIGphdmEudXRpbC5FdmVudE9iamVjdCB7Ci0KLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCS8vIGluaXRpYWxpemUgdG8gaW1wb3NzaWJsZSBsb2NhdGlvbgotCWludCBmUG9zaXRpb24gPSAtMTsKLQotCS8qKgotCSAqIGRvZXNudCd0IG1ha2Ugc2Vuc2UgdG8gaGF2ZSBhIENhcmV0RXZlbnQgd2l0aG91dCB0aGUgQ2FyZXQgcG9zdGlvbiwgc28KLQkgKiB1c2Ugb3RoZXIgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FyZXRFdmVudChPYmplY3Qgc291cmNlKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgcHJlZmVycmVkIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBDYXJldEV2ZW50KE9iamVjdCBzb3VyY2UsIGludCBwb3NpdGlvbikgewotCQlzdXBlcihzb3VyY2UpOwotCQlzZXRQb3NpdGlvbihwb3NpdGlvbik7Ci0JfQotCi0JcHVibGljIGludCBnZXRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZQb3NpdGlvbjsKLQl9Ci0KLQl2b2lkIHNldFBvc2l0aW9uKGludCBuZXdQb3NpdGlvbikgewotCQlmUG9zaXRpb24gPSBuZXdQb3NpdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdmlldy9ldmVudHMvSUNhcmV0TGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9JQ2FyZXRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTVlNzJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9JQ2FyZXRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudmlldy5ldmVudHM7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgLSB1c2UgYmFzZSBzZWxlY3Rpb24gbm90aWZpY2F0aW9uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNhcmV0TGlzdGVuZXIgZXh0ZW5kcyBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lciB7Ci0JcHVibGljIHZvaWQgY2FyZXRNb3ZlZChDYXJldEV2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9JTm9kZVNlbGVjdGlvbkxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdmlldy9ldmVudHMvSU5vZGVTZWxlY3Rpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGZkOWE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9JTm9kZVNlbGVjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC52aWV3LmV2ZW50czsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIC0gdXNlIGJhc2Ugc2VsZWN0aW9uIG5vdGlmaWNhdGlvbgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSU5vZGVTZWxlY3Rpb25MaXN0ZW5lciB7Ci0Jdm9pZCBub2RlU2VsZWN0aW9uQ2hhbmdlZChOb2RlU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9JVGV4dFNlbGVjdGlvbkxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdmlldy9ldmVudHMvSVRleHRTZWxlY3Rpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjQxYmZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9JVGV4dFNlbGVjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC52aWV3LmV2ZW50czsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSBiYXNlIHNlbGVjdGlvbiBub3RpZmljYXRpb24KLSAqLwotcHVibGljIGludGVyZmFjZSBJVGV4dFNlbGVjdGlvbkxpc3RlbmVyIHsKLQl2b2lkIHRleHRTZWxlY3Rpb25DaGFuZ2VkKFRleHRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ZpZXcvZXZlbnRzL05vZGVTZWxlY3Rpb25DaGFuZ2VkRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9Ob2RlU2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OWQ3NTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ZpZXcvZXZlbnRzL05vZGVTZWxlY3Rpb25DaGFuZ2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnZpZXcuZXZlbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgLSB1c2UgYmFzZSBzZWxlY3Rpb24gbm90aWZpY2F0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV4dGVuZHMgamF2YS51dGlsLkV2ZW50T2JqZWN0IHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JaW50IGZDYXJldFBvc2l0aW9uOwotCi0JTGlzdCBmU2VsZWN0ZWROb2RlczsKLQotCXB1YmxpYyBOb2RlU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KE9iamVjdCBzb3VyY2UsIExpc3Qgc2VsZWN0ZWROb2RlcywgaW50IGNhcmV0UG9zaXRpb24pIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJZlNlbGVjdGVkTm9kZXMgPSBzZWxlY3RlZE5vZGVzOwotCQlmQ2FyZXRQb3NpdGlvbiA9IGNhcmV0UG9zaXRpb247Ci0JfQotCi0JcHVibGljIGludCBnZXRDYXJldFBvc2l0aW9uKCkgewotCQlyZXR1cm4gZkNhcmV0UG9zaXRpb247Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0U2VsZWN0ZWROb2RlcygpIHsKLQkJcmV0dXJuIGZTZWxlY3RlZE5vZGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9UZXh0U2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdmlldy9ldmVudHMvVGV4dFNlbGVjdGlvbkNoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzgwN2U1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9UZXh0U2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC52aWV3LmV2ZW50czsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSBiYXNlIHNlbGVjdGlvbiBub3RpZmljYXRpb24KLSAqLwotcHVibGljIGNsYXNzIFRleHRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXh0ZW5kcyBqYXZhLnV0aWwuRXZlbnRPYmplY3QgewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQlpbnQgZlRleHRTZWxlY3Rpb25FbmQ7Ci0KLQlpbnQgZlRleHRTZWxlY3Rpb25TdGFydDsKLQotCXB1YmxpYyBUZXh0U2VsZWN0aW9uQ2hhbmdlZEV2ZW50KE9iamVjdCBzb3VyY2UsIGludCB0ZXh0U2VsZWN0aW9uU3RhcnQsIGludCB0ZXh0U2VsZWN0aW9uRW5kKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JCWZUZXh0U2VsZWN0aW9uU3RhcnQgPSB0ZXh0U2VsZWN0aW9uU3RhcnQ7Ci0JCWZUZXh0U2VsZWN0aW9uRW5kID0gdGV4dFNlbGVjdGlvbkVuZDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRTZWxlY3Rpb25FbmQoKSB7Ci0JCXJldHVybiBmVGV4dFNlbGVjdGlvbkVuZDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRTZWxlY3Rpb25TdGFydCgpIHsKLQkJcmV0dXJuIGZUZXh0U2VsZWN0aW9uU3RhcnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0NvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0NvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGNiZjU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS92aWV3cy9jb250ZW50b3V0bGluZS9Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5UcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLS8qKgotICogQmFzaWMgQ29uZmlndXJhdGlvbiBjbGFzcyBmb3IgT3V0bGluZSBQYWdlcwotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gewotCS8qKgotCSAqIEFkZCBhIGNvbGxhcHNlIGFjdGlvbiB0byBoZWxwIHdpdGggbmF2aWdhdGlvbi4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIENvbGxhcHNlVHJlZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JCXByaXZhdGUgVHJlZVZpZXdlciBmVHJlZVZpZXdlciA9IG51bGw7Ci0KLQkJcHVibGljIENvbGxhcHNlVHJlZUFjdGlvbihUcmVlVmlld2VyIHZpZXdlcikgewotCQkJc3VwZXIoU1NFVUlNZXNzYWdlcy5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb25fMCwgQVNfUFVTSF9CVVRUT04pOyAvLyROT04tTkxTLTEkCi0JCQlzZXRJbWFnZURlc2NyaXB0b3IoQ09MTEFQU0VfRSk7Ci0JCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihDT0xMQVBTRV9EKTsKLQkJCXNldFRvb2xUaXBUZXh0KGdldFRleHQoKSk7Ci0JCQlmVHJlZVZpZXdlciA9IHZpZXdlcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXN1cGVyLnJ1bigpOwotCQkJZlRyZWVWaWV3ZXIuY29sbGFwc2VBbGwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRvZ2dsZXMgd2hldGhlciBpbmNvbWluZyBzZWxlY3Rpb24gbm90aWZpY2F0aW9uIGFmZmVjdHMgdXMKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRvZ2dsZUxpbmtBY3Rpb24gZXh0ZW5kcyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbiB7Ci0JCXB1YmxpYyBUb2dnbGVMaW5rQWN0aW9uKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBwcmVmZXJlbmNlKSB7Ci0JCQlzdXBlcihTU0VVSU1lc3NhZ2VzLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbl8xLCBzdG9yZSwgcHJlZmVyZW5jZSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXNldFRvb2xUaXBUZXh0KGdldFRleHQoKSk7Ci0JCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihTWU5DRURfRCk7Ci0JCQlzZXRJbWFnZURlc2NyaXB0b3IoU1lOQ0VEX0UpOwotCQkJdXBkYXRlKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCQlzdXBlci51cGRhdGUoKTsKLQkJCXNldExpbmtXaXRoRWRpdG9yKGlzQ2hlY2tlZCgpKTsKLQkJfQotCX0KLQotCUltYWdlRGVzY3JpcHRvciBDT0xMQVBTRV9EID0gRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19ETENMX0NPTExBUFNFQUxMKTsKLQlJbWFnZURlc2NyaXB0b3IgQ09MTEFQU0VfRSA9IEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRUxDTF9DT0xMQVBTRUFMTCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZklzTGlua1dpdGhFZGl0b3IgPSBmYWxzZTsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXI7Ci0JcHJpdmF0ZSBJQ29udHJpYnV0aW9uSXRlbVtdIGZNZW51Q29udHJpYnV0aW9ucyA9IG51bGw7Ci0JcHJpdmF0ZSBJQ29udHJpYnV0aW9uSXRlbVtdIGZUb29sYmFyQ29udHJpYnV0aW9ucyA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT1VUTElORV9MSU5LX1BSRUYgPSAib3V0bGluZS1saW5rLWVkaXRvciI7IC8vJE5PTi1OTFMtMSQKLQlJbWFnZURlc2NyaXB0b3IgU1lOQ0VEX0QgPSBFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RMQ0xfU1lOQ0VEKTsKLQlJbWFnZURlc2NyaXB0b3IgU1lOQ0VEX0UgPSBFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VMQ0xfU1lOQ0VEKTsKLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbigpIHsKLQkJLy8gTXVzdCBoYXZlIGVtcHR5IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24KLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb250cmlidXRpb25zIGZvciB0aGUgdmlldydzIGxvY2FsIG1lbnUuIFN1YmNsYXNzZXMgc2hvdWxkCi0JICogbWVyZ2UgdGhlaXIgY29udHJpYnV0aW9ucyB3aXRoIHRoZXNlLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBUcmVlVmlld2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIG1lbnUgY29udHJpYnV0aW9ucwotCSAqLwotCXByb3RlY3RlZCBJQ29udHJpYnV0aW9uSXRlbVtdIGNyZWF0ZU1lbnVDb250cmlidXRpb25zKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCUlDb250cmlidXRpb25JdGVtIHRvZ2dsZUxpbmtJdGVtID0gbmV3IFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbShuZXcgVG9nZ2xlTGlua0FjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKSwgT1VUTElORV9MSU5LX1BSRUYpKTsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IG5ldyBJQ29udHJpYnV0aW9uSXRlbVtde3RvZ2dsZUxpbmtJdGVtfTsKLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRvb2xiYXIgY29udHJpYnV0aW9ucy4gU3ViY2xhc3NlcyBzaG91bGQgbWVyZ2UgdGhlaXIKLQkgKiBjb250cmlidXRpb25zIHdpdGggdGhlc2UuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIFRyZWVWaWV3ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdG9vbGJhciBjb250cmlidXRpb25zCi0JICovCi0JcHJvdGVjdGVkIElDb250cmlidXRpb25JdGVtW10gY3JlYXRlVG9vbGJhckNvbnRyaWJ1dGlvbnMoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29sbGFwc2VBbGxJdGVtID0gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0obmV3IENvbGxhcHNlVHJlZUFjdGlvbih2aWV3ZXIpKTsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IG5ldyBJQ29udHJpYnV0aW9uSXRlbVtde2NvbGxhcHNlQWxsSXRlbX07Ci0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDb250ZW50UHJvdmlkZXIgdG8gdXNlIHdpdGggdGhlIGdpdmVuIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgVHJlZVZpZXdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgSUNvbnRlbnRQcm92aWRlciB0byB1c2Ugd2l0aCB0aGlzIHZpZXdlcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIEtleUxpc3RlbmVycyB0byBhdHRhY2ggdG8gdGhlIGdpdmVuIHZpZXdlcidzCi0JICogY29udHJvbCBvciBudWxsLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBUcmVlVmlld2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIEtleUxpc3RlbmVycyB0byBhdHRhY2ggdG8gdGhlIFRyZWVWaWV3ZXIncyBDb250cm9sLAotCSAqICAgICAgICAgb3IgbnVsbC4gVGhlIGxpc3RlbmVycyBzaG91bGQgYWRoZXJlIHRvIHRoZSBLZXlFdmVudC5kb2l0IGZpZWxkCi0JICogICAgICAgICB0byBlbnN1cmUgcHJvcGVyIGJlaGF2aW9ycy4gT3JkZXJpbmcgb2YgdGhlIGV2ZW50IG5vdGlmaWNhdGlvbnMKLQkgKiAgICAgICAgIGlzIGRlcGVuZGVudCBvbiB0aGUgQ29udHJvbCBpbiB0aGUgVHJlZVZpZXdlci4KLQkgKi8KLQlwdWJsaWMgS2V5TGlzdGVuZXJbXSBnZXRLZXlMaXN0ZW5lcnMoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgTGFiZWxQcm92aWRlciBmb3IgdGhlIGl0ZW1zIHdpdGhpbiB0aGUgZ2l2ZW4gdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBUcmVlVmlld2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRoZSBJTGFiZWxQcm92aWRlciBmb3IgaXRlbXMgd2l0aGluIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQlpZiAoZkxhYmVsUHJvdmlkZXIgPT0gbnVsbCkKLQkJCWZMYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKTsKLQkJcmV0dXJuIGZMYWJlbFByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIGZvciB0aGUgbG9jYWwgbWVudSBpbiB0aGUgb3V0bGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgVHJlZVZpZXdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBJQ29udHJpYnV0aW9uSXRlbVtdIGZvciB0aGUgbG9jYWwgbWVudQotCSAqLwotCXB1YmxpYyBmaW5hbCBJQ29udHJpYnV0aW9uSXRlbVtdIGdldE1lbnVDb250cmlidXRpb25zKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmTWVudUNvbnRyaWJ1dGlvbnMgPT0gbnVsbCkgewotCQkJZk1lbnVDb250cmlidXRpb25zID0gY3JlYXRlTWVudUNvbnRyaWJ1dGlvbnModmlld2VyKTsKLQkJfQotCQlyZXR1cm4gZk1lbnVDb250cmlidXRpb25zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1lbnUgbGlzdGVuZXIgdG8gbm90aWZ5IHdoZW4gdGhlIGdpdmVuIHZpZXdlcidzIGNvbnRleHQKLQkgKiBtZW51IGlzIGFib3V0IHRvIGJlIHNob3duIG9yIG51bGwuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIFRyZWVWaWV3ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIElNZW51TGlzdGVuZXIgdG8gbm90aWZ5IHdoZW4gdGhlIHZpZXdlcidzIGNvbnRleHQgbWVudSBpcwotCSAqICAgICAgICAgYWJvdXQgdG8gYmUgc2hvd24sIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgSU1lbnVMaXN0ZW5lciBnZXRNZW51TGlzdGVuZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgUHJlZmVyZW5jZVN0b3JlIHRvIHVzZSBmb3IgdGhpcyBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2Ugc3RvcmUgaW4gd2hpY2ggdG8gcmVtZW1iZXIgcHJlZmVyZW5jZXMgKHN1Y2ggYXMKLQkgKiAgICAgICAgIHRoZSBsaW5rLXdpdGgtZWRpdG9yIHRvZ2dsZSBzdGF0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBTU0VVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIChmaWx0ZXJlZCkgc2VsZWN0aW9uIGZyb20gdGhlIGdpdmVuIHNlbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICBtb2RlbCBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgVHJlZVZpZXdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBUaGUgKGZpbHRlcmVkKSBzZWxlY3Rpb24gZnJvbSB0aGlzIGV2ZW50LiBVc2VzIGluY2x1ZGUgbWFwcGluZwotCSAqICAgICAgICAgbW9kZWwgc2VsZWN0aW9uIG9udG8gZWxlbWVudHMgcHJvdmlkZWQgYnkgdGhlIGNvbnRlbnQgcHJvdmlkZXIuCi0JICogICAgICAgICBTaG91bGQgb25seSByZXR1cm4gZWxlbWVudHMgdGhhdCB3aWxsIGJlIHNob3duIGluIHRoZSBUcmVlCi0JICogICAgICAgICBDb250cm9sLgotCSAqLwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbihUcmVlVmlld2VyIHZpZXdlciwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICogQHBhcmFtIHRyZWVWaWV3ZXIKLQkgKiBAcmV0dXJuIGEgbGFiZWwgcHJvdmlkZXIgcHJvdmlkaW5nIHRoZSBzdGF0dXMgbGluZSBjb250ZW50cwotCSAqLwotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRTdGF0dXNMaW5lTGFiZWxQcm92aWRlcihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb250cmlidXRpb24gaXRlbXMgZm9yIHRoZSBsb2NhbCB0b29sYmFyIGluIHRoZSBvdXRsaW5lLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBUcmVlVmlld2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIElDb250cmlidXRpb25JdGVtW10gZm9yIHRoZSBsb2NhbCB0b29sYmFyCi0JICovCi0JcHVibGljIGZpbmFsIElDb250cmlidXRpb25JdGVtW10gZ2V0VG9vbGJhckNvbnRyaWJ1dGlvbnMoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZUb29sYmFyQ29udHJpYnV0aW9ucyA9PSBudWxsKSB7Ci0JCQlmVG9vbGJhckNvbnRyaWJ1dGlvbnMgPSBjcmVhdGVUb29sYmFyQ29udHJpYnV0aW9ucyh2aWV3ZXIpOwotCQl9Ci0JCXJldHVybiBmVG9vbGJhckNvbnRyaWJ1dGlvbnM7Ci0JfQotCi0JLyoqCi0JICogQWRvcHRlZCBzaW5jZSB5b3UgY2FuJ3QgZWFzaWx5IHJlbW92ZURyYWdTdXBwb3J0IGZyb20KLQkgKiBTdHJ1Y3R1cmVkVmlld2Vycy4KLQkgKiAKLQkgKiBAcGFyYW0gdHJlZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIFRyZWVWaWV3ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzCi0JICovCi0JcHVibGljIFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyW10gZ2V0VHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyWzBdOwotCX0KLQotCS8qKgotCSAqIEFkb3B0ZWQgc2luY2UgeW91IGNhbid0IGVhc2lseSByZW1vdmVEcm9wU3VwcG9ydCBmcm9tCi0JICogU3RydWN0dXJlZFZpZXdlcnMuCi0JICogCi0JICogQHBhcmFtIHRyZWVWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBUcmVlVmlld2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycwotCSAqLwotCXB1YmxpYyBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcltdIGdldFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycyhUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lclswXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgbm9kZSBzZWxlY3Rpb24gY2hhbmdlcyBhZmZlY3Qgc2VsZWN0aW9uIGluIHRoZQotCSAqIFRyZWVWaWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHRyZWVWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBUcmVlVmlld2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRydWUgaWYgb3V0bGluZSBpcyBjdXJyZW50bHkgbGlua2VkIHRvIHNlbGVjdGlvbiBpbiBlZGl0b3IsCi0JICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xpbmtlZFdpdGhFZGl0b3IoVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCXJldHVybiBmSXNMaW5rV2l0aEVkaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgb3Igbm90IG91dGxpbmUgdmlldyBzaG91bGQgYmUgbGlua2VkIHdpdGggc2VsZWN0aW9uIGluCi0JICogZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBpc0xpbmtXaXRoRWRpdG9yCi0JICogICAgICAgICAgICBUaGUgaXNMaW5rV2l0aEVkaXRvciB0byBzZXQuCi0JICovCi0Jdm9pZCBzZXRMaW5rV2l0aEVkaXRvcihib29sZWFuIGlzTGlua1dpdGhFZGl0b3IpIHsKLQkJZklzTGlua1dpdGhFZGl0b3IgPSBpc0xpbmtXaXRoRWRpdG9yOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYWwgaG9vayBmb3IgcmVzb3VyY2UgcmVsZWFzaW5nIGFuZCBsaXN0ZW5lciByZW1vdmFsIHdoZW4KLQkgKiBjb25maWd1cmF0aW9ucyBjaGFuZ2Ugb3IgdGhlIHZpZXdlciBpcyBkaXNwb3NlZCBvZi4gVGhpcyBpbXBsZW1lbnRhdGlvbgotCSAqIHN0b3BzIG9mIGFueSByZW1haW5pbmcgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtIGZyb20KLQkgKiBwcmVmZXJlbmNlIGxpc3RlbmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgVHJlZVZpZXdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmUoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZUb29sYmFyQ29udHJpYnV0aW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZUb29sYmFyQ29udHJpYnV0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmVG9vbGJhckNvbnRyaWJ1dGlvbnNbaV0gaW5zdGFuY2VvZiBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLQkJCQkJKChQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIGZUb29sYmFyQ29udHJpYnV0aW9uc1tpXSkuZGlzY29ubmVjdCgpOwotCQkJCX0KLQkJCX0KLQkJCWZUb29sYmFyQ29udHJpYnV0aW9ucyA9IG51bGw7Ci0JCX0KLQkJaWYgKGZNZW51Q29udHJpYnV0aW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZNZW51Q29udHJpYnV0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmTWVudUNvbnRyaWJ1dGlvbnNbaV0gaW5zdGFuY2VvZiBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLQkJCQkJKChQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIGZNZW51Q29udHJpYnV0aW9uc1tpXSkuZGlzY29ubmVjdCgpOwotCQkJCX0KLQkJCX0KLQkJCWZNZW51Q29udHJpYnV0aW9ucyA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvdmlld3MvcHJvcGVydGllcy9JUHJvcGVydHlTb3VyY2VFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0lQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzRlZWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0lQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXM7Ci0KLS8qKgotICogRGVjbGFyZXMgdGhhdCB0aGlzIElQcm9wZXJ0eVNvdXJjZSBtaWdodCBzdXBwb3J0IG91dHJpZ2h0IHJlbW92YWwgb2YgYQotICogcHJvcGVydHkKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbiB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IG1hdGNoaW5nIHRoZSBnaXZlbiBuYW1lIGNhbiBiZSByZW1vdmVkLAotCSAqIGZhbHNlIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBtYXRjaGluZyB0aGlzIG5hbWUgY2FuIGJlIHJlbW92ZWQKLQkgKi8KLQlib29sZWFuIGlzUHJvcGVydHlSZW1vdmFibGUoT2JqZWN0IG5hbWUpOwotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gZGlzcGxheWVkIG5hbWUuIElmIG5vIHN1Y2ggcHJvcGVydHkKLQkgKiBleGlzdHMsIG5vdGhpbmcgaXMgZG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIGRpc3BsYXllZCBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqLwotCXZvaWQgcmVtb3ZlUHJvcGVydHkoT2JqZWN0IG5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS92aWV3cy9wcm9wZXJ0aWVzL1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4OWUzOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOwotCi0KLS8qKgotICogQ29uZmlndXJhdGlvbiBjbGFzcyBmb3IgUHJvcGVydHkgU2hlZXQgUGFnZXMuIE5vdCBmaW5hbGl6ZWQuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIHsKLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgY29udHJpYnV0aW9uIG1lbnUgaXRlbXMgdG8gdGhlIGdpdmVuIG1lbnVNYW5hZ2VyLCB0b29sYmFyTWFuYWdlciwKLQkgKiBzdGF0dXNMaW5lTWFuYWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gbWVudU1hbmFnZXIKLQkgKiAgICAgICAgICAgIHRoZSBsb2NhbCBtZW51IG1hbmFnZXIgb2YgdGhlIHByb3BlcnR5IHNoZWV0Ci0JICogQHBhcmFtIHRvb2xCYXJNYW5hZ2VyCi0JICogICAgICAgICAgICB0aGUgbG9jYWwgdG9vbGJhciBtYW5hZ2VyIG9mIHRoZSBwcm9wZXJ0eSBzaGVldAotCSAqIEBwYXJhbSBzdGF0dXNMaW5lTWFuYWdlcgotCSAqICAgICAgICAgICAgdGhlIHN0YXR1cyBsaW5lIG1hbmFnZXIgb2YgdGhlIHByb3BlcnR5IHNoZWV0Ci0JICovCi0JcHVibGljIHZvaWQgYWRkQ29udHJpYnV0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsIElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciwgSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd3MgZm9yIGZpbHRlcmF0aW9uIG9mIHNlbGVjdGlvbiBiZWZvcmUgYmVpbmcgc2VudCB0byB0aGUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3RpbmdQYXJ0Ci0JICogICAgICAgICAgICBtYXkgYmUgbnVsbAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIG1vZGVsIHNlbGVjdGlvbgotCSAqIEByZXR1cm4gdGhlIChmaWx0ZXJlZCkgc2VsZWN0aW9uIHRvIGJlIHNlbnQgdG8gdGhlIHZpZXdlcgotCSAqLwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldElucHV0U2VsZWN0aW9uKElXb3JrYmVuY2hQYXJ0IHNlbGVjdGluZ1BhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlTZWxlY3Rpb24gcHJlZmVycmVkU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCS8vIGRvbid0IHN1cHBvcnQgbW9yZSB0aGFuIG9uZSBzZWxlY3RlZCBub2RlCi0JCQlpZiAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5zaXplKCkgPiAxKQotCQkJCXByZWZlcnJlZFNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0JCX0KLQkJcmV0dXJuIHByZWZlcnJlZFNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb3JyZWN0IElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBwYWdlCi0JICogICAgICAgICAgICB0aGUgcGFnZSB0byBiZSBjb25maWd1cmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGZvciB0aGUgZ2l2ZW4gcGFnZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJUHJvcGVydHlTb3VyY2VQcm92aWRlciBnZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKElQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgY29udHJpYnV0aW9uIG1lbnUgaXRlbXMgZnJvbSB0aGUgZ2l2ZW4gbWVudU1hbmFnZXIsCi0JICogdG9vbGJhck1hbmFnZXIsIHN0YXR1c0xpbmVNYW5hZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBtZW51TWFuYWdlcgotCSAqICAgICAgICAgICAgdGhlIGxvY2FsIG1lbnUgbWFuYWdlciBvZiB0aGUgcHJvcGVydHkgc2hlZXQKLQkgKiBAcGFyYW0gdG9vbEJhck1hbmFnZXIKLQkgKiAgICAgICAgICAgIHRoZSBsb2NhbCB0b29sYmFyIG1hbmFnZXIgb2YgdGhlIHByb3BlcnR5IHNoZWV0Ci0JICogQHBhcmFtIHN0YXR1c0xpbmVNYW5hZ2VyCi0JICogICAgICAgICAgICB0aGUgc3RhdHVzIGxpbmUgbWFuYWdlciBvZiB0aGUgcHJvcGVydHkgc2hlZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDb250cmlidXRpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlciwgSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyLCBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEdlbmVyYWwgaG9vayBmb3IgcmVzb3VyY2UgcmVsZWFzaW5nIGFuZCBsaXN0ZW5lciByZW1vdmFsIHdoZW4KLQkgKiBjb25maWd1cmF0aW9ucyBjaGFuZ2UuCi0JICovCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmUoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3Rlc3RUb2MueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3Rlc3RUb2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTQyYjkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS90ZXN0VG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MKLQlsYWJlbD0iVGVzdCBUT0MiCi0JdG9waWM9Imh0bWwvdG9jLmh0bWwiPgotCTxsaW5rIHRvYz0idG9jLnhtbCIgLz4KLTwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS90b2MueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YzBiYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iU2FtcGxlIFRhYmxlIG9mIENvbnRlbnRzIj4KLQk8dG9waWMKLQkJbGFiZWw9Ik1haW4gVG9waWMiCi0JCWhyZWY9Imh0bWwvbWFpbnRvcGljLmh0bWwiPgotCQk8dG9waWMKLQkJCWxhYmVsPSJTdWIgVG9waWMiCi0JCQlocmVmPSJodG1sL3N1YnRvcGljLmh0bWwiIC8+Ci0JPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMgMiIgLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2Q0NzY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotCi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTg3ZDgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZDBlOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gTWF5IDE0IDIyOjQ0OjQ1IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc5MjViZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jV2VkIEp1biAxNSAxNDoxNDo0NiBFRFQgMjAwNQotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjVhZjNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMTAxLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMmE3Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUsIDIwMDg8L3A+Ci08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMKLXBsdWctaW4gKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcwotcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhCi0JaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZQotRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5Ci0oIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyCi11c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UKLXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QKLXRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZAotY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQKLXN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTxoMz5UaGlyZCBQYXJ0eSBDb250ZW50PC9oMz4KLTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZAotcGFydGllcyBhcyBzZXQgb3V0IGJlbG93LiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseQotZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgZm9sbG93aW5nIGlzIHByb3ZpZGVkIGZvciBpbmZvcm1hdGlvbmFsCi1wdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSBmb3IKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci0KLTxoND5PcGVuIE1vYmlsZSBBbGxpYW5jZSBEVERzPC9oND4KLQotPHA+VGhlIHBsdWctaW4gaXMgYWNjb21wYW5pZWQgYnkgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucwotKCZxdW90O1dBUCBEVERzJnF1b3Q7KSBkZWZpbmVkIGJ5IHRoZSBXaXJlbGVzcyBBcHBsaWNhdGlvbiBQcm90b2NvbAotKFdBUCkgRm9ydW0uIFRoZSBXQVAgRm9ydW0gaGFzIG5vdyBiZWVuIGNvbnNvbGlkYXRlZCBpbnRvIHRoZSBPcGVuCi1Nb2JpbGUgQWxsaWFuY2UgKE9NQSkuIFRoZSBXQVAgRFREcyBhcmUgdGhlIGZvbGxvd2luZyBmaWxlcyBsb2NhdGVkIGluCi10aGUgcGx1Zy1pbjo8L3A+Ci08dWw+Ci0JPGxpPjxzdHJvbmc+d21sMTEuZHRkPC9zdHJvbmc+IG9idGFpbmVkIGZyb20gPGEKLQkJaHJlZj0iaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3dtbF8xLjEueG1sIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3dtbF8xLjEueG1sPC9hPjwvbGk+Ci0JPGxpPjxzdHJvbmc+d21sMTMuZHRkPC9zdHJvbmc+IG9idGFpbmVkIGZyb20gPGEKLQkJaHJlZj0iaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3dtbDEzLmR0ZCIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC93bWwxMy5kdGQ8L2E+PC9saT4KLQk8bGk+PHN0cm9uZz54aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZDwvc3Ryb25nPiBvYnRhaW5lZCBmcm9tIDxhCi0JCWhyZWY9Imh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC94aHRtbC1tb2JpbGUxMC5kdGQiIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQveGh0bWwtbW9iaWxlMTAuZHRkPC9hPjwvbGk+Ci08L3VsPgotCi08cD5Zb3VyIHVzZSBvZiB0aGUgV0FQIERURHMgaXMgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCi1vZiB0aGUgRVBMLjwvcD4KLQotPHA+TW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgV0FQIGFuZCB0aGUgT01BIGlzIGF2YWlsYWJsZSBhdCA8YQotCWhyZWY9Imh0dHA6Ly93d3cub3Blbm1vYmlsZWFsbGlhbmNlLm9yZy90ZWNoL2FmZmlsaWF0ZXMvd2FwL3dhcGluZGV4Lmh0bWwiPmh0dHA6Ly93d3cub3Blbm1vYmlsZWFsbGlhbmNlLm9yZy90ZWNoL2FmZmlsaWF0ZXMvd2FwL3dhcGluZGV4Lmh0bWw8L2E+LjwvcD4KLQotPGg0PlczQyBEVERzPC9oND4KLQotPHA+VGhlIHBsdWctaW4gaXMgYWNjb21wYW5pZWQgYnkgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucyAoJnF1b3Q7Ci1XM0MgRFREcyZxdW90OykgZGVmaW5lZCBieSB0aGUgdGhlIFczQyBFeHRlbnNpYmxlIEh5cGVyVGV4dCBNYXJrdXAKLUxhbmd1YWdlIChYSFRNTCkgMS4xLiBYSFRNTCBpcyBkZXNjcmliZWQgYXQgPGEKLQlocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDExLyI+aHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS88L2E+LjwvcD4KLVRoZSBXM0MgRFREcyBhcmUgdGhlIGZvbGxvd2luZyBmaWxlcyBsb2NhdGVkIGluIHRoZSBwbHVnLWluOgotPHA+Ci08dWw+Ci0JPGxpPjxzdHJvbmc+eGh0bWwxMS1mbGF0LmR0ZDwvc3Ryb25nPiBvYnRhaW5lZCBmcm9tIDxhCi0JCWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvRFREL3hodG1sMTEuZHRkIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQ8L2E+PC9saT4KLQk8bGk+PHN0cm9uZz54aHRtbDEtZnJhbWVzZXQuZHRkPC9zdHJvbmc+IG9idGFpbmVkIGZyb20gPGEKLQkJaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtZnJhbWVzZXQuZHRkIgotCQl0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtZnJhbWVzZXQuZHRkPC9hPjwvbGk+Ci0JPGxpPjxzdHJvbmc+eGh0bWwxLXN0cmljdDwvc3Ryb25nPiBvYnRhaW5lZCBmcm9tIDxhCi0JCWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiCi0JCXRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkPC9hPjwvbGk+Ci0JPGxpPjxzdHJvbmc+eGh0bWwxLXRyYW5zaXRpb25hbC5kdGQ8L3N0cm9uZz4gb2J0YWluZWQgZnJvbSA8YQotCQlocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIgotCQl0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZDwvYT48L2xpPgotCTxsaT48c3Ryb25nPnhodG1sLWJhc2ljMTAtZi5kdGQ8L3N0cm9uZz4gb2J0YWluZWQgZnJvbSA8YQotCQlocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1iYXNpYy94aHRtbC1iYXNpYzEwLmR0ZCIKLQkJdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLWJhc2ljL3hodG1sLWJhc2ljMTAuZHRkPC9hPjwvbGk+Ci0JPGxpPjxzdHJvbmc+eGh0bWwtbGF0MS5lbnQ8L3N0cm9uZz4gb2J0YWluZWQgZnJvbSA8YQotCQlocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sLWxhdDEuZW50IiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1sYXQxLmVudDwvYT48L2xpPgotCTxsaT48c3Ryb25nPnhodG1sLXNwZWNpYWwuZW50PC9zdHJvbmc+IG9idGFpbmVkIGZyb20gPGEKLQkJaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1zcGVjaWFsLmVudCIKLQkJdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwtc3BlY2lhbC5lbnQ8L2E+PC9saT4KLQk8bGk+PHN0cm9uZz54aHRtbC1zeW1ib2wuZW50PC9zdHJvbmc+IG9idGFpbmVkIGZyb20gPGEKLQkJaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1zeW1ib2wuZW50IgotCQl0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1zeW1ib2wuZW50PC9hPjwvbGk+Ci08L3VsPgotCi08cD5BcyBkZXNjcmliZWQgaW4gc2VjdGlvbiA1LjEwIG9mIHRoZSBGQVEgbG9jYXRlZCBhdCA8YQotCWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvSVBSLUZBUS0yMDAwMDYyMC5odG1sI0RURCIKLQl0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9JUFItRkFRLTIwMDAwNjIwLmh0bWwjRFREPC9hPiwKLXlvdXIgdXNlIG9mIHRoZSBXM0MgRFREcyBpcyBnb3Zlcm5lZCBieSB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1XM0MgU29mdHdhcmUgTGljZW5zZSBhIGNvcHkgb2Ygd2hpY2ggaXMgaW5jbHVkZWQgaW4gdGhlIGZpbGUgPGEKLQlocmVmPSJhYm91dF9maWxlcy9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAuaHRtIj5hYm91dF9maWxlcy9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAuaHRtPC9hPgotYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhCi0JaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAiCi0JdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwPC9hPi48L3A+Ci08aDQ+V1NETCBTY2hlbWFzPC9oND4KLQotPHA+VGhlIHBsdWctaW4gaXMgYWNjb21wYW5pZWQgYnkgZml2ZSBzY2hlbWEgZmlsZXMuIFlvdXIgdXNlIG9mIHRoZQotZm9sbG93aW5nIGZpbGVzIGxvY2F0ZWQgaW4gdGhlIHhzZCBkaXJlY3Rvcnkgb2YgdGhlIHBsdWctaW46PC9wPgotCi08dWw+Ci0JPGxpPjxzdHJvbmc+aHR0cC54c2Q8L3N0cm9uZz4gb2J0YWluZWQgZnJvbSA8YQotCQlocmVmPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLzwvYT48L2xpPgotCTxsaT48c3Ryb25nPnNvYXAueHNkPC9zdHJvbmc+IG9idGFpbmVkIGZyb20gPGEKLQkJaHJlZj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC88L2E+PC9saT4KLQk8bGk+PHN0cm9uZz53c2RsLnhzZDwvc3Ryb25nPiBvYnRhaW5lZCBmcm9tIDxhCi0JCWhyZWY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC88L2E+PC9saT4KLQk8bGk+PHN0cm9uZz53c2RsLW1pbmUueHNkPC9zdHJvbmc+IG9idGFpbmVkIGZyb20gPGEKLQkJaHJlZj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS88L2E+PC9saT4KLTwvdWw+Ci0KLTxwPmlzIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgJnF1b3Q7TGljZW5zZSBmb3IKLVdTREwgU2NoZW1hIEZpbGVzJnF1b3Q7IGEgY29weSB3aGljaCBpcyBsb2NhdGVkIGluIDxhCi0JaHJlZj0iYWJvdXRfZmlsZXMvd3NkbC1zY2hlbWEtZmlsZXMtbGljZW5zZS50eHQiPmFib3V0X2ZpbGVzL3dzZGwtc2NoZW1hLWZpbGVzLWxpY2Vuc2UudHh0PC9hPi48L3A+Ci0KLTxwPlRoZSBmb2xsb3dpbmcgZmlsZSBsb2NhdGVkIGluIHRoZSB4c2QgZGlyZWN0b3J5IG9mIHRoZSBwbHVnLWluOgotPHA+Ci08dWw+Ci0JPGxpPjxzdHJvbmc+c29hcC1lbmMueHNkPC9zdHJvbmc+Ci08L3VsPgotCi08cD5pcyBnb3Zlcm5lZCBieSB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIFczQyBTb2Z0d2FyZQotTGljZW5zZSBhcyBkZXNjcmliZWQgaW4gc2VjdGlvbiA1LjEwIG9mIHRoZSBGQVEgbG9jYXRlZCBhdCA8YQotCWhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvSVBSLUZBUS0yMDAwMDYyMC5odG1sI0RURCIKLQl0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9JUFItRkFRLTIwMDAwNjIwLmh0bWwjRFREPC9hPi4KLUEgY29weSBvZiB0aGUgVzNDIFNvZnR3YXJlIExpY2Vuc2UgaXMgbG9jYXRlZCBpbiA8YQotCWhyZWY9ImFib3V0X2ZpbGVzL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMC5odG0iPmFib3V0X2ZpbGVzL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMC5odG08L2E+Ci1hbmQgaXMgYWxzbyBhdmFpbAotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXRfZmlsZXMvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwLmh0bSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXRfZmlsZXMvY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAyYWM3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0X2ZpbGVzL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+Ci0KLQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJIVE1MIFRpZHksIHNlZSB3d3cudzMub3JnIj4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY29weXJpZ2h0LXNvZnR3YXJlLTE5OTgwNzIwX2ZpbGVzL2Jhc2UuY3NzIj48dGl0bGU+VzNDIElQUiBTT0ZUV0FSRSBOT1RJQ0U8L3RpdGxlPjwvaGVhZD48Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIiB0ZXh0PSIjMDAwMDAwIj4KLTxoMT5XM0M8c3VwPq48L3N1cD4gU09GVFdBUkUgTk9USUNFIEFORCBMSUNFTlNFPC9oMT4KLQotPGgzPkNvcHlyaWdodCCpIDE5OTQtMjAwMiA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8iPldvcmxkCi1XaWRlIFdlYiBDb25zb3J0aXVtPC9hPiwgKDxhIGhyZWY9Imh0dHA6Ly93d3cubGNzLm1pdC5lZHUvIj5NYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZgotVGVjaG5vbG9neTwvYT4sIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5yaWEuZnIvIj5JbnN0aXR1dCBOYXRpb25hbCBkZQotUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZTwvYT4sIDxhIGhyZWY9Imh0dHA6Ly93d3cua2Vpby5hYy5qcC8iPktlaW8gVW5pdmVyc2l0eTwvYT4pLiBBbGwgUmlnaHRzCi1SZXNlcnZlZC4gaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC88L2gzPgotCi08cD5UaGlzIFczQyB3b3JrIChpbmNsdWRpbmcgc29mdHdhcmUsIGRvY3VtZW50cywgb3Igb3RoZXIgcmVsYXRlZAotaXRlbXMpIGlzIGJlaW5nIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyB1bmRlciB0aGUKLWZvbGxvd2luZyBsaWNlbnNlLiBCeSBvYnRhaW5pbmcsIHVzaW5nIGFuZC9vciBjb3B5aW5nIHRoaXMgd29yaywKLXlvdSAodGhlIGxpY2Vuc2VlKSBhZ3JlZSB0aGF0IHlvdSBoYXZlIHJlYWQsIHVuZGVyc3Rvb2QsIGFuZCB3aWxsCi1jb21wbHkgd2l0aCB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zOjwvcD4KLQotPHA+UGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQotYW5kIGl0cyBkb2N1bWVudGF0aW9uLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCZuYnNwOyBmb3IgYW55Ci1wdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBvciByb3lhbHR5IGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0Ci15b3UgaW5jbHVkZSB0aGUgZm9sbG93aW5nIG9uIEFMTCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZAotZG9jdW1lbnRhdGlvbiBvciBwb3J0aW9ucyB0aGVyZW9mLCBpbmNsdWRpbmcgbW9kaWZpY2F0aW9ucywgdGhhdAoteW91IG1ha2U6PC9wPgotCi08b2w+Ci08bGk+VGhlIGZ1bGwgdGV4dCBvZiB0aGlzIE5PVElDRSBpbiBhIGxvY2F0aW9uIHZpZXdhYmxlIHRvIHVzZXJzIG9mCi10aGUgcmVkaXN0cmlidXRlZCBvciBkZXJpdmF0aXZlIHdvcmsuPC9saT4KLQotPGxpPkFueSBwcmUtZXhpc3RpbmcgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGRpc2NsYWltZXJzLCBub3RpY2VzLCBvcgotdGVybXMgYW5kIGNvbmRpdGlvbnMuIElmIG5vbmUgZXhpc3QsIGEgc2hvcnQgbm90aWNlIG9mIHRoZQotZm9sbG93aW5nIGZvcm0gKGh5cGVydGV4dCBpcyBwcmVmZXJyZWQsIHRleHQgaXMgcGVybWl0dGVkKSBzaG91bGQKLWJlIHVzZWQgd2l0aGluIHRoZSBib2R5IG9mIGFueSByZWRpc3RyaWJ1dGVkIG9yIGRlcml2YXRpdmUgY29kZToKLSJDb3B5cmlnaHQgqSBbJGRhdGUtb2Ytc29mdHdhcmVdIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLyI+V29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bTwvYT4sICg8YSBocmVmPSJodHRwOi8vd3d3Lmxjcy5taXQuZWR1LyI+TWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YKLVRlY2hub2xvZ3k8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LmlucmlhLmZyLyI+SW5zdGl0dXQgTmF0aW9uYWwgZGUKLVJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWU8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LmtlaW8uYWMuanAvIj5LZWlvIFVuaXZlcnNpdHk8L2E+KS4gQWxsIFJpZ2h0cwotUmVzZXJ2ZWQuIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvIjwvbGk+Ci0KLTxsaT5Ob3RpY2Ugb2YgYW55IGNoYW5nZXMgb3IgbW9kaWZpY2F0aW9ucyB0byB0aGUgVzNDIGZpbGVzLAotaW5jbHVkaW5nIHRoZSBkYXRlIGNoYW5nZXMgd2VyZSBtYWRlLiAoV2UgcmVjb21tZW5kIHlvdSBwcm92aWRlCi1VUklzIHRvIHRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIHRoZSBjb2RlIGlzIGRlcml2ZWQuKTwvbGk+Ci08L29sPgotCi08cD5USElTIFNPRlRXQVJFIEFORCBET0NVTUVOVEFUSU9OIElTIFBST1ZJREVEICJBUyBJUywiIEFORAotQ09QWVJJR0hUIEhPTERFUlMgTUFLRSBOTyBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUgotSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTywgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEFOWSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgVEhBVCBUSEUKLVVTRSBPRiBUSEUgU09GVFdBUkUgT1IgRE9DVU1FTlRBVElPTiBXSUxMIE5PVCBJTkZSSU5HRSBBTlkgVEhJUkQKLVBBUlRZIFBBVEVOVFMsIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLjwvcD4KLQotPHA+Q09QWVJJR0hUIEhPTERFUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLVNQRUNJQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIEFOWSBVU0UgT0YgVEhFCi1TT0ZUV0FSRSBPUiBET0NVTUVOVEFUSU9OLjwvcD4KLQotPHA+VGhlIG5hbWUgYW5kIHRyYWRlbWFya3Mgb2YgY29weXJpZ2h0IGhvbGRlcnMgbWF5IE5PVCBiZSB1c2VkIGluCi1hZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dAotc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gVGl0bGUgdG8gY29weXJpZ2h0IGluIHRoaXMKLXNvZnR3YXJlIGFuZCBhbnkgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIHdpbGwgYXQgYWxsIHRpbWVzIHJlbWFpbgotd2l0aCBjb3B5cmlnaHQgaG9sZGVycy48L3A+Ci0KLTxwPl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXzwvcD4KLQotPHA+VGhpcyBmb3JtdWxhdGlvbiBvZiBXM0MncyBub3RpY2UgYW5kIGxpY2Vuc2UgYmVjYW1lIGFjdGl2ZSBvbgotQXVndXN0IDE0IDE5OTggc28gYXMgdG8gaW1wcm92ZSBjb21wYXRpYmlsaXR5IHdpdGggR1BMLiBUaGlzCi12ZXJzaW9uIGVuc3VyZXMgdGhhdCBXM0Mgc29mdHdhcmUgbGljZW5zaW5nIHRlcm1zIGFyZSBubyBtb3JlCi1yZXN0cmljdGl2ZSB0aGFuIEdQTCBhbmQgY29uc2VxdWVudGx5IFczQyBzb2Z0d2FyZSBtYXkgYmUKLWRpc3RyaWJ1dGVkIGluIEdQTCBwYWNrYWdlcy4gU2VlIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDUxOS5odG1sIj5vbGRlciBmb3JtdWxhdGlvbjwvYT4gZm9yCi10aGUgcG9saWN5IHByaW9yIHRvIHRoaXMgZGF0ZS4gUGxlYXNlIHNlZSBvdXIgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9JUFItRkFRLmh0bWwiPkNvcHlyaWdodCBGQVE8L2E+IGZvciBjb21tb24gcXVlc3Rpb25zIGFib3V0Ci11c2luZyBtYXRlcmlhbHMgZnJvbSBvdXIgc2l0ZSwgaW5jbHVkaW5nIHNwZWNpZmljIHRlcm1zIGFuZAotY29uZGl0aW9ucyBmb3IgcGFja2FnZXMgbGlrZSBsaWJ3d3csIEFtYXlhLCBhbmQgSmlnc2F3LiBPdGhlcgotcXVlc3Rpb25zIGFib3V0IHRoaXMgbm90aWNlIGNhbiBiZSBkaXJlY3RlZCB0byA8YSBocmVmPSJtYWlsdG86c2l0ZS1wb2xpY3lAdzMub3JnIj5zaXRlLXBvbGljeUB3My5vcmc8L2E+Ljxicj4KLSZuYnNwOzwvcD4KLQotPHA+Jm5ic3A7PC9wPgotCi08YWRkcmVzcz48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9IZWxwL1dlYm1hc3Rlci5odG1sIj53ZWJtYXN0ZXI8L2E+PGJyPgotIChsYXN0IHVwZGF0ZWQgJERhdGU6IDIwMDcvMDUvMTUgMDI6NDI6MjQgJCk8L2FkZHJlc3M+Ci0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9hYm91dF9maWxlcy9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjBfZmlsZXMvYmFzZS5jc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0X2ZpbGVzL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMF9maWxlcy9iYXNlLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U1N2FjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0X2ZpbGVzL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMF9maWxlcy9iYXNlLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qIENvcHlyaWdodCAxOTk3LTIwMDMgVzNDIChNSVQsIEVSQ0lNLCBLZWlvKS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgIFRoZSBmb2xsb3dpbmcgc29mdHdhcmUgbGljZW5zaW5nIHJ1bGVzIGFwcGx5OgotICAgaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtc29mdHdhcmUgKi8KLQotLyogJElkOiBiYXNlLmNzcyx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjI0IGRhdmlkX3dpbGxpYW1zIEV4cCAkICovCi0KLS8qIHRoaXMgc3R5bGUgc2hlZXQgZGVmaW5lcyB0aGUgYmFzaWMgc3R5bGUgZm9yIGFsbCBXM0MgcGFnZXMgKi8KLS8qIHlvdSBjYW4gcG9pbnQgdG8gdGhpcyBieSBhZGRpbmc6Ci0KLSAgICAgPExJTksgcmVsPSJTdHlsZXNoZWV0IiBocmVmPSIvU3R5bGVTaGVldHMvYmFzZSI+Ci0KLQotICAgaW4gdGhlIEhFQUQgb2YgeW91ciBIVE1MIGRvY3VtZW50ICovCi0KLWJvZHkgewotICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKLSAgY29sb3I6IGJsYWNrOwotICBiYWNrZ3JvdW5kOiB3aGl0ZTsKLX0KLQotYTpsaW5rLCBhOmFjdGl2ZSB7Ci0gIGNvbG9yOiAjMDBlOwotICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKLX0KLQotYTp2aXNpdGVkIHsKLSAgY29sb3I6ICM1Mjk7Ci0gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwotfQotCi1kaXYuaW50cm8gewotICBtYXJnaW4tbGVmdDogNSU7Ci0gIG1hcmdpbi1yaWdodDogNSU7Ci0gIGZvbnQtc3R5bGU6IGl0YWxpYwotfQotCi1wcmUgewotICBmb250LWZhbWlseTogbW9ub3NwYWNlCi19Ci0KLWE6bGluayBpbWcsIGE6dmlzaXRlZCBpbWcgewotICAgYm9yZGVyLXN0eWxlOiBub25lCi19Ci0KLWEgaW1nIHsgY29sb3I6IHdoaXRlOyB9ICAgICAgICAvKiBoaWRlIHRoZSBib3JkZXIgaW4gTmV0c2NhcGUgNCAqLwotQG1lZGlhIGFsbCB7ICAgICAgICAgICAgICAgICAgIC8qIGhpZGUgZnJvbSBOZXRzY2FwZSA0ICovCi0gIGEgaW1nIHsgY29sb3I6IGluaGVyaXQ7IH0gICAgLyogdW5kbyB0aGUgcnVsZSBhYm92ZSAqLwotfQotCi11bC50b2MsIG9sLnRvYyB7Ci0gIGxpc3Qtc3R5bGU6IGRpc2M7Ci0gIGxpc3Qtc3R5bGU6IG5vbmU7Ci19Ci0KLWRpdi5pc3N1ZSB7Ci0gIHBhZGRpbmc6IDAuNWVtOwotICBib3JkZXI6IG5vbmU7Ci0gIG1hcmdpbi1yaWdodDogNSU7Ci19Ci0KLS5oaWRlbWUgeyBkaXNwbGF5OiBub25lIH0KLQotQG1lZGlhIHByaW50IHsKLQotICB0YWJsZSB7Ci0gICAgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkCi0gIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXRfZmlsZXMvd3NkbC1zY2hlbWEtZmlsZXMtbGljZW5zZS50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2Fib3V0X2ZpbGVzL3dzZGwtc2NoZW1hLWZpbGVzLWxpY2Vuc2UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTVmODFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvYWJvdXRfZmlsZXMvd3NkbC1zY2hlbWEtZmlsZXMtbGljZW5zZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1Db3B5cmlnaHQgMjAwMSAtIDIwMDUsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbgotQWxsIFJpZ2h0cyBSZXNlcnZlZAotCi1MaWNlbnNlIGZvciBXU0RMIFNjaGVtYSBGaWxlcwotCi1UaGUgQXV0aG9ycyBncmFudCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFdTREwgU2NoZW1hIAotRmlsZXMgaW4gYW55IG1lZGl1bSB3aXRob3V0IGZlZSBvciByb3lhbHR5IGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgYW5kIAotbGljZW5zZSBhcmUgZGlzdHJpYnV0ZWQgd2l0aCB0aGVtLiAgVGhlIG9yaWdpbmFscyBvZiB0aGVzZSBmaWxlcyBjYW4gCi1iZSBsb2NhdGVkIGF0OgotCi0gICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLwotICAgIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8KLSAgICBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLwotICAgIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8KLSAgICAKLQotVEhFU0UgU0NIRU1BIEZJTEVTIEFSRSBQUk9WSURFRCAiQVMgSVMsIiBBTkQgVEhFIEFVVEhPUlMgTUFLRSBOTyBSRVBSRVNFTlRBVElPTlMgCi1PUiBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIFJFR0FSRElORyBUSEVTRSBGSUxFUywgSU5DTFVESU5HLCBCVVQgTk9UIAotTElNSVRFRCBUTywgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCAKLU5PTi1JTkZSSU5HRU1FTlQgT1IgVElUTEUuICBUSEUgQVVUSE9SUyBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIAotSU5ESVJFQ1QsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIE9SIAotUkVMQVRJTkcgVE8gQU5ZIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFU0UgRklMRVMuCi0KLVRoZSBuYW1lIGFuZCB0cmFkZW1hcmtzIG9mIHRoZSBBdXRob3JzIG1heSBOT1QgYmUgdXNlZCBpbiBhbnkgbWFubmVyLCAKLWluY2x1ZGluZyBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byB0aGVzZSBmaWxlcyBvciBhbnkgcHJvZ3JhbSAKLW9yIHNlcnZpY2UgdGhhdCB1c2VzIHRoZXNlIGZpbGVzLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaXRsZSB0byBjb3B5cmlnaHQgCi1pbiB0aGVzZSBmaWxlcyB3aWxsIGF0IGFsbCB0aW1lcyByZW1haW4gd2l0aCB0aGUgQXV0aG9ycy4KLQotTm8gb3RoZXIgcmlnaHRzIGFyZSBncmFudGVkIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZDE0MTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBkdGRzLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dF9maWxlcy8sXAotICAgICAgICAgICAgICAgeHNkLwotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IHhzZC8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBkdGRzLyxcCi0gICAgICAgICAgICAgICBhYm91dF9maWxlcy8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3dtbDExLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy93bWwxMS5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYjEyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3dtbDExLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi08IS0tCi1XaXJlbGVzcyBNYXJrdXAgTGFuZ3VhZ2UgKFdNTCkgRG9jdW1lbnQgVHlwZSBEZWZpbml0aW9uLgotCi1Db3B5cmlnaHQgV2lyZWxlc3MgQXBwbGljYXRpb24gUHJvdG9jb2wgRm9ydW0gTHRkLiwgMTk5OCwxOTk5LgotICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAKLQotV01MIGlzIGFuIFhNTCBsYW5ndWFnZS4gIFR5cGljYWwgdXNhZ2U6Ci0gICA8P3htbCB2ZXJzaW9uPSIxLjAiPz4KLSAgIDwhRE9DVFlQRSB3bWwgUFVCTElDICItLy9XQVBGT1JVTS8vRFREIFdNTCAxLjEvL0VOIgotICAgICAgICAgICJodHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQvd21sXzEuMS54bWwiPgotICAgPHdtbD4KLSAgIC4uLgotICAgPC93bWw+Ci0KLVRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIFdpcmVsZXNzIAotQXBwbGljYXRpb24gUHJvdG9jb2wgRm9ydW0gTHRkLiB3ZWIgc2l0ZSBhdAotaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvZG9jcy9jb3B5cmlnaHQuaHRtLgotLS0+Ci0KLTwhRU5USVRZICUgbGVuZ3RoICAiQ0RBVEEiPiAgICA8IS0tIFswLTldKyBmb3IgcGl4ZWxzIG9yIFswLTldKyIlIiBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2UgbGVuZ3RoIC0tPgotPCFFTlRJVFkgJSB2ZGF0YSAgICJDREFUQSI+ICAgIDwhLS0gYXR0cmlidXRlIHZhbHVlIHBvc3NpYmx5IGNvbnRhaW5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIHJlZmVyZW5jZXMgLS0+Ci08IUVOVElUWSAlIEhSRUYgICAgIiV2ZGF0YTsiPiAgPCEtLSBVUkksIFVSTCBvciBVUk4gZGVzaWduYXRpbmcgYSBoeXBlcnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuIE1heSBjb250YWluIHZhcmlhYmxlIHJlZmVyZW5jZXMgLS0+Ci08IUVOVElUWSAlIGJvb2xlYW4gICAgICAiKHRydWV8ZmFsc2UpIj4KLTwhRU5USVRZICUgbnVtYmVyICAiTk1UT0tFTiI+ICA8IS0tIGEgbnVtYmVyLCB3aXRoIGZvcm1hdCBbMC05XSsgLS0+Ci08IUVOVElUWSAlIGNvcmVhdHRycyAgImlkICAgIElEICAgICAjSU1QTElFRCAKLSAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgQ0RBVEEgICNJTVBMSUVEIj4KLQotCi0KLTwhRU5USVRZICUgZW1waCAgICAiZW0gfCBzdHJvbmcgfCBiIHwgaSB8IHUgfCBiaWcgfCBzbWFsbCI+Ci08IUVOVElUWSAlIGxheW91dCAgImJyIj4KLQotPCFFTlRJVFkgJSB0ZXh0ICAgICAiI1BDREFUQSB8ICVlbXBoOyI+Ci0KLTwhLS0gZmxvdyBjb3ZlcnMgImNhcmQtbGV2ZWwiIGVsZW1lbnRzLCBzdWNoIGFzIHRleHQgYW5kIGltYWdlcyAtLT4KLTwhRU5USVRZICUgZmxvdyAgICAgIiV0ZXh0OyB8ICVsYXlvdXQ7IHwgaW1nIHwgYW5jaG9yIHwgYSB8IHRhYmxlIj4KLQotPCEtLSBUYXNrIHR5cGVzIC0tPgotPCFFTlRJVFkgJSB0YXNrICAgImdvIHwgcHJldiB8IG5vb3AgfCByZWZyZXNoIj4KLQotPCEtLSBOYXZpZ2F0aW9uIGFuZCBldmVudCBlbGVtZW50cyAtLT4KLTwhRU5USVRZICUgbmF2ZWxtdHMgImRvIHwgb25ldmVudCI+Ci0KLTwhLS09PT09PT09PT09PT09PT09IERlY2tzIGFuZCBDYXJkcyA9PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCB3bWwgKCBoZWFkPywgdGVtcGxhdGU/LCBjYXJkKyApPgotPCFBVFRMSVNUIHdtbAotICB4bWw6bGFuZyAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IS0tIGNhcmQgaW50cmluc2ljIGV2ZW50cyAtLT4KLTwhRU5USVRZICUgY2FyZGV2Ci0gIm9uZW50ZXJmb3J3YXJkICAlSFJFRjsgICAgICAgICAgI0lNUExJRUQKLSAgb25lbnRlcmJhY2t3YXJkICVIUkVGOyAgICAgICAgICAjSU1QTElFRAotICBvbnRpbWVyICAgICAgICAgJUhSRUY7ICAgICAgICAgICNJTVBMSUVEIgotICA+Ci0KLTwhLS0gY2FyZCBmaWVsZCB0eXBlcyAtLT4KLTwhRU5USVRZICUgZmllbGRzICAiJWZsb3c7IHwgaW5wdXQgfCBzZWxlY3QgfCBmaWVsZHNldCI+Ci0KLTwhRUxFTUVOVCBjYXJkIChvbmV2ZW50KiwgdGltZXI/LCAoZG8gfCBwKSopPgotPCFBVFRMSVNUIGNhcmQKLSAgdGl0bGUgICAgICAgICAgICV2ZGF0YTsgICAgICAgI0lNUExJRUQKLSAgbmV3Y29udGV4dCAgICAgICVib29sZWFuOyAgICAgImZhbHNlIgotICBvcmRlcmVkICAgICAgICAgJWJvb2xlYW47ICAgICAidHJ1ZSIKLSAgeG1sOmxhbmcgICAgICAgIE5NVE9LRU4gICAgICAgI0lNUExJRUQKLSAgJWNhcmRldjsKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBFdmVudCBCaW5kaW5ncyA9PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBkbyAoJXRhc2s7KT4KLTwhQVRUTElTVCBkbwotICB0eXBlICAgICAgICAgQ0RBVEEgICAgICAgI1JFUVVJUkVECi0gIGxhYmVsICAgICAgICAldmRhdGE7ICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICAgTk1UT0tFTiAgICAgI0lNUExJRUQKLSAgb3B0aW9uYWwgICAgICVib29sZWFuOyAgICJmYWxzZSIKLSAgeG1sOmxhbmcgICAgIE5NVE9LRU4gICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIG9uZXZlbnQgKCV0YXNrOyk+Ci08IUFUVExJU1Qgb25ldmVudAotICB0eXBlICAgICAgICAgQ0RBVEEgICAgICAgI1JFUVVJUkVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRGVjay1sZXZlbCBkZWNsYXJhdGlvbnMgPT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgaGVhZCAoIGFjY2VzcyB8IG1ldGEgKSs+Ci08IUFUVExJU1QgaGVhZAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCB0ZW1wbGF0ZSAoJW5hdmVsbXRzOykqPgotPCFBVFRMSVNUIHRlbXBsYXRlCi0gICVjYXJkZXY7Ci0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIGFjY2VzcyBFTVBUWT4KLTwhQVRUTElTVCBhY2Nlc3MKLSAgZG9tYWluICAgICAgIENEQVRBICAgICAgICNJTVBMSUVECi0gIHBhdGggICAgICAgICBDREFUQSAgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBtZXRhIEVNUFRZPgotPCFBVFRMSVNUIG1ldGEKLSAgaHR0cC1lcXVpdiAgICAgQ0RBVEEgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICAgICBDREFUQSAgICAgICNJTVBMSUVECi0gIGZvcnVhICAgICAgICAgICVib29sZWFuOyAgI0lNUExJRUQKLSAgY29udGVudCAgICAgICAgQ0RBVEEgICAgICAjUkVRVUlSRUQKLSAgc2NoZW1lICAgICAgICAgQ0RBVEEgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IFRhc2tzID09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGdvIChwb3N0ZmllbGQgfCBzZXR2YXIpKj4KLTwhQVRUTElTVCBnbwotICBocmVmICAgICAgICAgICAgJUhSRUY7ICAgICAgICAgICAjUkVRVUlSRUQKLSAgc2VuZHJlZmVyZXIgICAgICVib29sZWFuOyAgICAgICAiZmFsc2UiCi0gIG1ldGhvZCAgICAgICAgICAocG9zdHxnZXQpICAgICAgImdldCIKLSAgYWNjZXB0LWNoYXJzZXQgIENEQVRBICAgICAgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBwcmV2IChzZXR2YXIpKj4KLTwhQVRUTElTVCBwcmV2Ci0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIHJlZnJlc2ggKHNldHZhcikqPgotPCFBVFRMSVNUIHJlZnJlc2gKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgbm9vcCBFTVBUWT4KLTwhQVRUTElTVCBub29wCi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gcG9zdGZpZWxkID09PT09PT09PT09PT09PT0tLT4KLSAKLTwhRUxFTUVOVCBwb3N0ZmllbGQgRU1QVFk+Ci08IUFUVExJU1QgcG9zdGZpZWxkCi0gIG5hbWUgICAgICAgICAldmRhdGE7ICAgICAgICAgICAjUkVRVUlSRUQKLSAgdmFsdWUgICAgICAgICV2ZGF0YTsgICAgICAgICAgICNSRVFVSVJFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IHZhcmlhYmxlcyA9PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBzZXR2YXIgRU1QVFk+Ci08IUFUVExJU1Qgc2V0dmFyCi0gIG5hbWUgICAgICAgICAldmRhdGE7ICAgICAgICAgICAjUkVRVUlSRUQKLSAgdmFsdWUgICAgICAgICV2ZGF0YTsgICAgICAgICAgICNSRVFVSVJFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09IENhcmQgRmllbGRzID09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIHNlbGVjdCAob3B0Z3JvdXB8b3B0aW9uKSs+Ci08IUFUVExJU1Qgc2VsZWN0Ci0gIHRpdGxlICAgICAgICAldmRhdGE7ICAgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICAgTk1UT0tFTiAgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgICV2ZGF0YTsgICAgICAgICAgICNJTVBMSUVECi0gIGluYW1lICAgICAgICBOTVRPS0VOICAgICAgICAgICAjSU1QTElFRAotICBpdmFsdWUgICAgICAgJXZkYXRhOyAgICAgICAgICAgI0lNUExJRUQKLSAgbXVsdGlwbGUgICAgICVib29sZWFuOyAgICAgICAgICJmYWxzZSIKLSAgdGFiaW5kZXggICAgICVudW1iZXI7ICAgICAgICAgICNJTVBMSUVECi0gIHhtbDpsYW5nICAgICBOTVRPS0VOICAgICAgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBvcHRncm91cCAob3B0Z3JvdXB8b3B0aW9uKSsgPgotPCFBVFRMSVNUIG9wdGdyb3VwCi0gIHRpdGxlICAgICAgJXZkYXRhOyAgICAjSU1QTElFRAotICB4bWw6bGFuZyAgIE5NVE9LRU4gICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgb3B0aW9uICgjUENEQVRBIHwgb25ldmVudCkqPgotPCFBVFRMSVNUIG9wdGlvbgotICB2YWx1ZSAgICAgICV2ZGF0YTsgICAgI0lNUExJRUQKLSAgdGl0bGUgICAgICAldmRhdGE7ICAgICNJTVBMSUVECi0gIG9ucGljayAgICAgJUhSRUY7ICAgICAjSU1QTElFRAotICB4bWw6bGFuZyAgIE5NVE9LRU4gICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgaW5wdXQgRU1QVFk+Ci08IUFUVExJU1QgaW5wdXQKLSAgbmFtZSAgICAgICBOTVRPS0VOICAgICAgICAgICAjUkVRVUlSRUQKLSAgdHlwZSAgICAgICAodGV4dHxwYXNzd29yZCkgICAidGV4dCIKLSAgdmFsdWUgICAgICAldmRhdGE7ICAgICAgICAgICAjSU1QTElFRAotICBmb3JtYXQgICAgIENEQVRBICAgICAgICAgICAgICNJTVBMSUVECi0gIGVtcHR5b2sgICAgJWJvb2xlYW47ICAgICAgICAgImZhbHNlIgotICBzaXplICAgICAgICVudW1iZXI7ICAgICAgICAgICNJTVBMSUVECi0gIG1heGxlbmd0aCAgJW51bWJlcjsgICAgICAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAlbnVtYmVyOyAgICAgICAgICAjSU1QTElFRAotICB0aXRsZSAgICAgICV2ZGF0YTsgICAgICAgICAgICNJTVBMSUVECi0gIHhtbDpsYW5nICAgTk1UT0tFTiAgICAgICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgZmllbGRzZXQgKCVmaWVsZHM7IHwgZG8pKiA+Ci08IUFUVExJU1QgZmllbGRzZXQKLSAgdGl0bGUgICAgICAgICAgICV2ZGF0YTsgICAgICAjSU1QTElFRAotICB4bWw6bGFuZyAgICAgICAgTk1UT0tFTiAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIHRpbWVyIEVNUFRZPgotPCFBVFRMSVNUIHRpbWVyCi0gIG5hbWUgICAgICAgTk1UT0tFTiAgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAldmRhdGE7ICAgICAgICAgICAjUkVRVUlSRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBJbWFnZXMgPT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIElBbGlnbiAiKHRvcHxtaWRkbGV8Ym90dG9tKSIgPgotCi08IUVMRU1FTlQgaW1nIEVNUFRZPgotPCFBVFRMSVNUIGltZwotICBhbHQgICAgICAgICV2ZGF0YTsgICAgICAjUkVRVUlSRUQKLSAgc3JjICAgICAgICAlSFJFRjsgICAgICAgI1JFUVVJUkVECi0gIGxvY2Fsc3JjICAgJXZkYXRhOyAgICAgICNJTVBMSUVECi0gIHZzcGFjZSAgICAgJWxlbmd0aDsgICAgICIwIgotICBoc3BhY2UgICAgICVsZW5ndGg7ICAgICAiMCIKLSAgYWxpZ24gICAgICAlSUFsaWduOyAgICAgImJvdHRvbSIKLSAgaGVpZ2h0ICAgICAlbGVuZ3RoOyAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAlbGVuZ3RoOyAgICAgI0lNUExJRUQKLSAgeG1sOmxhbmcgICBOTVRPS0VOICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBBbmNob3IgPT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgYW5jaG9yICggI1BDREFUQSB8IGJyIHwgaW1nIHwgZ28gfCBwcmV2IHwgcmVmcmVzaCApKj4KLTwhQVRUTElTVCBhbmNob3IKLSAgdGl0bGUgICAgICAgICV2ZGF0YTsgICAgICAjSU1QTElFRAotICB4bWw6bGFuZyAgICAgTk1UT0tFTiAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIGEgKCAjUENEQVRBIHwgYnIgfCBpbWcgKSo+Ci08IUFUVExJU1QgYQotICBocmVmICAgICAgICAgJUhSRUY7ICAgICAgICNSRVFVSVJFRAotICB0aXRsZSAgICAgICAgJXZkYXRhOyAgICAgICNJTVBMSUVECi0gIHhtbDpsYW5nICAgICBOTVRPS0VOICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBUYWJsZXMgPT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgdGFibGUgKHRyKSs+Ci08IUFUVExJU1QgdGFibGUKLSAgdGl0bGUgICAgICAgJXZkYXRhOyAgICAjSU1QTElFRAotICBhbGlnbiAgICAgICBDREFUQSAgICAgICNJTVBMSUVECi0gIGNvbHVtbnMgICAgICVudW1iZXI7ICAgI1JFUVVJUkVECi0gIHhtbDpsYW5nICAgIE5NVE9LRU4gICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgdHIgKHRkKSs+Ci08IUFUVExJU1QgdHIKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgdGQgKCAldGV4dDsgfCAlbGF5b3V0OyB8IGltZyB8IGFuY2hvciB8IGEgKSo+Ci08IUFUVExJU1QgdGQKLSAgeG1sOmxhbmcgICAgICAgIE5NVE9LRU4gICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBUZXh0IGxheW91dCBhbmQgbGluZSBicmVha3MgPT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgZW0gICAgICglZmxvdzspKj4KLTwhQVRUTElTVCBlbQotICB4bWw6bGFuZyAgICAgICAgTk1UT0tFTiAgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBzdHJvbmcgKCVmbG93OykqPgotPCFBVFRMSVNUIHN0cm9uZwotICB4bWw6bGFuZyAgICAgICAgTk1UT0tFTiAgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBiICAgICAgKCVmbG93OykqPgotPCFBVFRMSVNUIGIKLSAgeG1sOmxhbmcgICAgICAgIE5NVE9LRU4gICAgICAgI0lNUExJRUQKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgaSAgICAgICglZmxvdzspKj4KLTwhQVRUTElTVCBpCi0gIHhtbDpsYW5nICAgICAgICBOTVRPS0VOICAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIHUgICAgICAoJWZsb3c7KSo+Ci08IUFUVExJU1QgdQotICB4bWw6bGFuZyAgICAgICAgTk1UT0tFTiAgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBiaWcgICAgKCVmbG93OykqPgotPCFBVFRMSVNUIGJpZwotICB4bWw6bGFuZyAgICAgICAgTk1UT0tFTiAgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBzbWFsbCAgKCVmbG93OykqPgotPCFBVFRMSVNUIHNtYWxsCi0gIHhtbDpsYW5nICAgICAgICBOTVRPS0VOICAgICAgICNJTVBMSUVECi0gICVjb3JlYXR0cnM7Ci0gID4KLQotPCFFTlRJVFkgJSBUQWxpZ24gIihsZWZ0fHJpZ2h0fGNlbnRlcikiPgotPCFFTlRJVFkgJSBXcmFwTW9kZSAiKHdyYXB8bm93cmFwKSIgPgotPCFFTEVNRU5UIHAgKCVmaWVsZHM7IHwgZG8pKj4KLTwhQVRUTElTVCBwCi0gIGFsaWduICAgICAgICVUQWxpZ247ICAgICAibGVmdCIKLSAgbW9kZSAgICAgICAgJVdyYXBNb2RlOyAgICNJTVBMSUVECi0gIHhtbDpsYW5nICAgIE5NVE9LRU4gICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBiciBFTVBUWT4KLTwhQVRUTElTVCBicgotICB4bWw6bGFuZyAgICAgICAgTk1UT0tFTiAgICAgICAjSU1QTElFRAotICAlY29yZWF0dHJzOwotICA+Ci0KLTwhRU5USVRZIHF1b3QgICImIzM0OyI+ICAgICA8IS0tIHF1b3RhdGlvbiBtYXJrIC0tPgotPCFFTlRJVFkgYW1wICAgIiYjMzg7IzM4OyI+IDwhLS0gYW1wZXJzYW5kIC0tPgotPCFFTlRJVFkgYXBvcyAgIiYjMzk7Ij4gICAgIDwhLS0gYXBvc3Ryb3BoZSAtLT4KLTwhRU5USVRZIGx0ICAgICImIzM4OyM2MDsiPiA8IS0tIGxlc3MgdGhhbiAtLT4KLTwhRU5USVRZIGd0ICAgICImIzYyOyI+ICAgICA8IS0tIGdyZWF0ZXIgdGhhbiAtLT4KLTwhRU5USVRZIG5ic3AgICImIzE2MDsiPiAgICA8IS0tIG5vbi1icmVha2luZyBzcGFjZSAtLT4KLTwhRU5USVRZIHNoeSAgICImIzE3MzsiPiAgICA8IS0tIHNvZnQgaHlwaGVuIChkaXNjcmV0aW9uYXJ5IGh5cGhlbikgLS0+Ci0KLTwhLS0KLUNvcHlyaWdodCBXaXJlbGVzcyBBcHBsaWNhdGlvbiBQcm90b2NvbCBGb3J1bSBMdGQuLCAxOTk4LDE5OTkuCi0gICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIAotLS0+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvd21sMTMuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3dtbDEzLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkODViMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMvd21sMTMuZHRkCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sLWJhc2ljMTAtZi5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwtYmFzaWMxMC1mLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIzZDI1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwtYmFzaWMxMC1mLmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDMwODYgKzAsMCBAQAotPCEtLSBYSFRNTCBCYXNpYyAxLjAgRFREICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWJhc2ljMTAuZHRkIC0tPgotCi08IS0tIFhIVE1MIEJhc2ljIDEuMCBEVEQKLQotICAgICBUaGlzIGlzIFhIVE1MIEJhc2ljLCBhIHByb3BlciBzdWJzZXQgb2YgWEhUTUwuCi0KLSAgICAgVGhlIEV4dGVuc2libGUgSHlwZXJUZXh0IE1hcmt1cCBMYW5ndWFnZSAoWEhUTUwpCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bQotICAgICAgICAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUKLSAgICAgICAgIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuCi0gICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gICAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhlIFhIVE1MIEJhc2ljIERURAotICAgICBhbmQgaXRzIGFjY29tcGFueWluZyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMKLSAgICAgaGVyZWJ5IGdyYW50ZWQgaW4gcGVycGV0dWl0eSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZQotICAgICBhbmQgdGhpcyBwYXJhZ3JhcGggYXBwZWFyIGluIGFsbCBjb3BpZXMuICBUaGUgY29weXJpZ2h0IGhvbGRlcnMgbWFrZQotICAgICBubyByZXByZXNlbnRhdGlvbiBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhlIERURCBmb3IgYW55IHB1cnBvc2UuCi0KLSAgICAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3NlZCBvciBpbXBsaWVkIHdhcnJhbnR5LgotCi0gICAgICAgIEVkaXRvcnM6ICAgIE11cnJheSBNLiBBbHRoZWltIDxtYWlsdG86YWx0aGVpbUBlbmcuc3VuLmNvbT4KLSAgICAgICAgICAgICAgICAgICAgUGV0ZXIgU3RhcmsgICAgICAgPG1haWx0bzpQZXRlci5TdGFya0BlY3MuZXJpY3Nzb24uc2U+Ci0gICAgICAgIFJldmlzaW9uOiAgICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0tLT4KLTwhLS0gVGhpcyBpcyB0aGUgZHJpdmVyIGZpbGUgZm9yIHZlcnNpb24gMS4wIG9mIHRoZSBYSFRNTCBCYXNpYyBEVEQuCi0KLSAgICAgVGhpcyBEVEQgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgUFVCTElDOiAiLS8vVzNDLy9EVEQgWEhUTUwgQmFzaWMgMS4wLy9FTiIKLSAgICAgU1lTVEVNOiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtYmFzaWMveGh0bWwtYmFzaWMxMC5kdGQiCi0tLT4KLTwhRU5USVRZICUgWEhUTUwudmVyc2lvbiAgIi0vL1czQy8vRFREIFhIVE1MIEJhc2ljIDEuMC8vRU4iID4KLQotPCEtLSBVc2UgdGhpcyBVUkkgdG8gaWRlbnRpZnkgdGhlIGRlZmF1bHQgbmFtZXNwYWNlOgotCi0gICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLQotICAgICBTZWUgdGhlIFF1YWxpZmllZCBOYW1lcyBtb2R1bGUgZm9yIGluZm9ybWF0aW9uCi0gICAgIG9uIHRoZSB1c2Ugb2YgbmFtZXNwYWNlIHByZWZpeGVzIGluIHRoZSBEVEQuCi0tLT4KLTwhRU5USVRZICUgTlMucHJlZml4ZWQgIklHTk9SRSIgPgotPCFFTlRJVFkgJSBYSFRNTC5wcmVmaXggICIiID4KLQotPCEtLSBSZXNlcnZlZCBmb3IgdXNlIHdpdGggdGhlIFhMaW5rIG5hbWVzcGFjZToKLS0tPgotPCFFTlRJVFkgJSBYTElOSy54bWxucyAiIiA+Ci08IUVOVElUWSAlIFhMSU5LLnhtbG5zLmF0dHJpYiAiIiA+Ci0KLTwhLS0gRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgdXNpbmcgWEhUTUwgQmFzaWMgMS4wIGRpcmVjdGx5LCB1c2UKLSAgICAgdGhlIEZQSSBpbiB0aGUgRE9DVFlQRSBkZWNsYXJhdGlvbiwgd2l0aCB0aGUgeG1sbnMgYXR0cmlidXRlCi0gICAgIG9uIHRoZSBkb2N1bWVudCBlbGVtZW50IHRvIGlkZW50aWZ5IHRoZSBkZWZhdWx0IG5hbWVzcGFjZToKLQotICAgICAgICAgPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0gICAgICAgICA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIEJhc2ljIDEuMC8vRU4iCi0gICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLWJhc2ljL3hodG1sLWJhc2ljMTAuZHRkIiA+Ci0gICAgICAgICA8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlbiIgPgotICAgICAgICAgLi4uCi0gICAgICAgICA8L2h0bWw+Ci0tLT4KLQotPCEtLSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSB3aXRoIGRvY3VtZW50IHByb2ZpbGVzIC0tPgotPCFFTlRJVFkgJSBYSFRNTC5wcm9maWxlICAiIiA+Ci0KLTwhLS0gQmlkaXJlY3Rpb25hbCBUZXh0IGZlYXR1cmVzCi0gICAgIFRoaXMgZmVhdHVyZS10ZXN0IGVudGl0eSBpcyB1c2VkIHRvIGRlY2xhcmUgZWxlbWVudHMKLSAgICAgYW5kIGF0dHJpYnV0ZXMgdXNlZCBmb3IgYmlkaXJlY3Rpb25hbCB0ZXh0IHN1cHBvcnQuCi0tLT4KLTwhRU5USVRZICUgWEhUTUwuYmlkaSAgIklHTk9SRSIgPgotCi08P2RvYyB0eXBlPSJkb2N0eXBlIiByb2xlPSJ0aXRsZSIgeyBYSFRNTCBCYXNpYyAxLjAgfSA/PgotCi08IS0tIDo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjogLS0+Ci0KLTwhRU5USVRZICUgeGh0bWwtZXZlbnRzLm1vZHVsZSAgICJJR05PUkUiID4KLTwhRU5USVRZICUgeGh0bWwtYmRvLm1vZHVsZSAgICAgICIlWEhUTUwuYmlkaTsiID4KLQotPCFFTlRJVFkgJSB4aHRtbC1tb2RlbC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIEJhc2ljIDEuMCBEb2N1bWVudCBNb2RlbCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWJhc2ljMTAtbW9kZWwtMS5tb2QiID4KLQotPCFFTlRJVFkgJSB4aHRtbC1mcmFtZXdvcmsubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBNb2R1bGFyIEZyYW1ld29yayAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWZyYW1ld29yay0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBNb2R1bGFyIEZyYW1ld29yayBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1mcmFtZXdvcmstMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgTW9kdWxhciBGcmFtZXdvcmsgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1mcmFtZXdvcmstMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTW9kdWxhciBGcmFtZXdvcmsKLQotICAgICBUaGlzIHJlcXVpcmVkIG1vZHVsZSBpbnN0YW50aWF0ZXMgdGhlIG1vZHVsZXMgbmVlZGVkCi0gICAgIHRvIHN1cHBvcnQgdGhlIFhIVE1MIG1vZHVsYXJpemF0aW9uIG1vZGVsLCBpbmNsdWRpbmc6Ci0KLSAgICAgICAgKyAgbm90YXRpb25zCi0gICAgICAgICsgIGRhdGF0eXBlcwotICAgICAgICArICBuYW1lc3BhY2UtcXVhbGlmaWVkIG5hbWVzCi0gICAgICAgICsgIGNvbW1vbiBhdHRyaWJ1dGVzCi0gICAgICAgICsgIGRvY3VtZW50IG1vZGVsCi0gICAgICAgICsgIGNoYXJhY3RlciBlbnRpdGllcwotCi0gICAgIFRoZSBJbnRyaW5zaWMgRXZlbnRzIG1vZHVsZSBpcyBpZ25vcmVkIGJ5IGRlZmF1bHQgYnV0Ci0gICAgIG9jY3VycyBpbiB0aGlzIG1vZHVsZSBiZWNhdXNlIGl0IG11c3QgYmUgaW5zdGFudGlhdGVkCi0gICAgIHByaW9yIHRvIEF0dHJpYnV0ZXMgYnV0IGFmdGVyIERhdGF0eXBlcy4KLS0tPgotCi08IUVOVElUWSAlIHhodG1sLWFyY2gubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtYXJjaC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1hcmNoLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzZSBBcmNoaXRlY3R1cmUgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1hcmNoLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEJhc2UgQXJjaGl0ZWN0dXJlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWFyY2gtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzZSBBcmNoaXRlY3R1cmUgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1hcmNoLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFRoaXMgb3B0aW9uYWwgbW9kdWxlIGluY2x1ZGVzIGRlY2xhcmF0aW9ucyB0aGF0IGVuYWJsZSBYSFRNTCB0byBiZSB1c2VkCi0gICAgIGFzIGEgYmFzZSBhcmNoaXRlY3R1cmUgYWNjb3JkaW5nIHRvIHRoZSAnQXJjaGl0ZWN0dXJhbCBGb3JtcyBEZWZpbml0aW9uCi0gICAgIFJlcXVpcmVtZW50cycgKEFubmV4IEEuMywgSVNPL0lFQyAxMDc0NCwgMm5kIGVkaXRpb24pLiBGb3IgbW9yZSBpbmZvcm1hdGlvbgotICAgICBvbiB1c2Ugb2YgYXJjaGl0ZWN0dXJhbCBmb3Jtcywgc2VlIHRoZSBIeVRpbWUgd2ViIHNpdGUgYXQ6Ci0KLSAgICAgICAgIGh0dHA6Ly93d3cuaHl0aW1lLm9yZy8KLS0tPgotCi08P0lTMTA3NDQgQXJjQmFzZSB4aHRtbCA/PgotCi08IU5PVEFUSU9OIHhodG1sIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBBRkRSIEFSQ0JBU0UgWEhUTUwgMS4xLy9FTiIgPgotCi08IS0tIEVudGl0eSBkZWNsYXJhdGlvbiBmb3IgYXNzb2NpYXRlZCBBcmNoaXRlY3R1cmFsIERURAotLS0+Ci08IUVOVElUWSB4aHRtbC1hcmNoLmR0ZAotICAgICAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCBBcmNoaXRlY3R1cmUgMS4xLy9FTiIKLSAgICAgICAgICAgICAieGh0bWwxMS1hcmNoLmR0ZCIgPgotCi08P0lTMTA3NDQ6YXJjaCB4aHRtbAotICAgIHB1YmxpYy1pZCAgICAgICA9ICAiLS8vVzNDLy9OT1RBVElPTiBBRkRSIEFSQ0JBU0UgWEhUTUwgMS4xLy9FTiIKLSAgICBkdGQtcHVibGljLWlkICAgPSAgIi0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iCi0gICAgZHRkLXN5c3RlbS1pZCAgID0gICJ4aHRtbDExLmR0ZCIKLSAgICBkb2MtZWxlbS1mb3JtICAgPSAgImh0bWwiCi0gICAgZm9ybS1hdHQgICAgICAgID0gICJodG1sIgotICAgIHJlbmFtZXItYXR0ICAgICA9ICAiaHRuYW1lcyIKLSAgICBzdXBwcmVzc29yLWF0dCAgPSAgImh0c3VwcCIKLSAgICBkYXRhLWlnbm9yZS1hdHQgPSAgImh0aWduIgotICAgIGF1dG8gICAgICAgICAgICA9ICAiQXJjQXV0byIKLSAgICBvcHRpb25zICAgICAgICAgPSAgIkh0TW9kUmVxIEh0TW9kT3B0IgotICAgIEh0TW9kUmVxICAgICAgICA9ICAiRnJhbWV3b3JrIFRleHQgSHlwZXJ0ZXh0IExpc3RzIFN0cnVjdHVyZSIKLSAgICBIdE1vZE9wdCAgICAgICAgPSAgIlN0YW5kYXJkIgotPz4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYXJjaC0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLW5vdGF0aW9ucy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1ub3RhdGlvbnMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtbm90YXRpb25zLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT05TIFhIVE1MIE5vdGF0aW9ucyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLW5vdGF0aW9ucy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBOb3RhdGlvbnMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1ub3RhdGlvbnMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJAotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTlMgWEhUTUwgTm90YXRpb25zIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtbm90YXRpb25zLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIE5vdGF0aW9ucwotCi0gICAgIGRlZmluZXMgdGhlIGZvbGxvd2luZyBub3RhdGlvbnMsIG1hbnkgb2YgdGhlc2UgaW1wb3J0ZWQgZnJvbSAKLSAgICAgb3RoZXIgc3BlY2lmaWNhdGlvbnMgYW5kIHN0YW5kYXJkcy4gV2hlbiBhbiBleGlzdGluZyBGUEkgaXMKLSAgICAga25vd24sIGl0IGlzIGluY29ycG9yYXRlZCBoZXJlLgotLS0+Ci0KLTwhLS0gWE1MIE5vdGF0aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBTR01MIGFuZCBYTUwgTm90YXRpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gVzNDIFhNTCAxLjAgUmVjb21tZW5kYXRpb24gLS0+Ci08IU5PVEFUSU9OIHczYy14bWwgCi0gICAgIFBVQkxJQyAiSVNPIDg4NzkvL05PVEFUSU9OIEV4dGVuc2libGUgTWFya3VwIExhbmd1YWdlIChYTUwpIDEuMC8vRU4iID4KLQotPCEtLSBYTUwgMS4wIENEQVRBIC0tPgotPCFOT1RBVElPTiBjZGF0YSAKLSAgICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhNTCAxLjA6IENEQVRBLy9FTiIgPgotCi08IS0tIFNHTUwgRm9ybWFsIFB1YmxpYyBJZGVudGlmaWVycyAtLT4KLTwhTk9UQVRJT04gZnBpCi0gICAgIFBVQkxJQyAiSVNPIDg4Nzk6MTk4Ni8vTk9UQVRJT04gRm9ybWFsIFB1YmxpYyBJZGVudGlmaWVyLy9FTiIgPgotCi08IS0tIFhIVE1MIE5vdGF0aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBMZW5ndGggZGVmaW5lZCBmb3IgY2VsbHBhZGRpbmcvY2VsbHNwYWNpbmcgLS0+Ci0KLTwhLS0gbm4gZm9yIHBpeGVscyBvciBubiUgZm9yIHBlcmNlbnRhZ2UgbGVuZ3RoIC0tPgotPCFOT1RBVElPTiBsZW5ndGggCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBMZW5ndGgvL0VOIiA+Ci0KLTwhLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbGluayB0eXBlcyAtLT4KLTwhTk9UQVRJT04gbGlua1R5cGVzIAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTGlua1R5cGVzLy9FTiIgPgotCi08IS0tIHNpbmdsZSBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSBkZXNjcmlwdG9ycyAtLT4KLTwhTk9UQVRJT04gbWVkaWFEZXNjIAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTWVkaWFEZXNjLy9FTiIgPgotCi08IS0tIHBpeGVsLCBwZXJjZW50YWdlLCBvciByZWxhdGl2ZSAtLT4KLTwhTk9UQVRJT04gbXVsdGlMZW5ndGggCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBNdWx0aUxlbmd0aC8vRU4iID4KLQotPCEtLSBvbmUgb3IgbW9yZSBkaWdpdHMgKE5VTUJFUikgLS0+Ci08IU5PVEFUSU9OIG51bWJlciAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IE51bWJlci8vRU4iID4KLQotPCEtLSBpbnRlZ2VyIHJlcHJlc2VudGluZyBsZW5ndGggaW4gcGl4ZWxzIC0tPgotPCFOT1RBVElPTiBwaXhlbHMgCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBQaXhlbHMvL0VOIiA+Ci0KLTwhLS0gc2NyaXB0IGV4cHJlc3Npb24gLS0+Ci08IU5PVEFUSU9OIHNjcmlwdCAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFNjcmlwdC8vRU4iID4KLQotPCEtLSB0ZXh0dWFsIGNvbnRlbnQgLS0+Ci08IU5PVEFUSU9OIHRleHQgCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBUZXh0Ly9FTiIgPgotCi08IS0tIEltcG9ydGVkIE5vdGF0aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSBbSVNPMTA2NDZdIC0tPgotPCFOT1RBVElPTiBjaGFyYWN0ZXIgCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDaGFyYWN0ZXIvL0VOIiA+Ci0KLTwhLS0gYSBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IU5PVEFUSU9OIGNoYXJzZXQgCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDaGFyc2V0Ly9FTiIgPgotCi08IS0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhTk9UQVRJT04gY2hhcnNldHMgCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDaGFyc2V0cy8vRU4iID4KLQotPCEtLSBtZWRpYSB0eXBlLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFOT1RBVElPTiBjb250ZW50VHlwZSAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IENvbnRlbnRUeXBlLy9FTiIgPgotCi08IS0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIHR5cGVzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFOT1RBVElPTiBjb250ZW50VHlwZXMgCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDb250ZW50VHlwZXMvL0VOIiA+Ci0KLTwhLS0gZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gSVNPIGRhdGUgZm9ybWF0IC0tPgotPCFOT1RBVElPTiBkYXRldGltZSAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IERhdGV0aW1lLy9FTiIgPgotCi08IS0tIGEgbGFuZ3VhZ2UgY29kZSwgYXMgcGVyIFtSRkMxNzY2XSAtLT4KLTwhTk9UQVRJT04gbGFuZ3VhZ2VDb2RlIAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTGFuZ3VhZ2VDb2RlLy9FTiIgPgotCi08IS0tIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLCBzZWUgW1VSSV0gLS0+Ci08IU5PVEFUSU9OIHVyaSAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFVSSS8vRU4iID4KLQotPCEtLSBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnMsIHNlZSBbVVJJXSAtLT4KLTwhTk9UQVRJT04gdXJpcyAKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFVSSXMvL0VOIiA+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLW5vdGF0aW9ucy0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWRhdGF0eXBlcy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1kYXRhdHlwZXMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtZGF0YXR5cGVzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgRGF0YXR5cGVzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtZGF0YXR5cGVzLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIERhdGF0eXBlcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWRhdGF0eXBlcy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBEYXRhdHlwZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1kYXRhdHlwZXMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gRGF0YXR5cGVzCi0KLSAgICAgZGVmaW5lcyBjb250YWluZXJzIGZvciB0aGUgZm9sbG93aW5nIGRhdGF0eXBlcywgbWFueSBvZgotICAgICB0aGVzZSBpbXBvcnRlZCBmcm9tIG90aGVyIHNwZWNpZmljYXRpb25zIGFuZCBzdGFuZGFyZHMuCi0tLT4KLQotPCEtLSBMZW5ndGggZGVmaW5lZCBmb3IgY2VsbHBhZGRpbmcvY2VsbHNwYWNpbmcgLS0+Ci0KLTwhLS0gbm4gZm9yIHBpeGVscyBvciBubiUgZm9yIHBlcmNlbnRhZ2UgbGVuZ3RoIC0tPgotPCFFTlRJVFkgJSBMZW5ndGguZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbGluayB0eXBlcyAtLT4KLTwhRU5USVRZICUgTGlua1R5cGVzLmRhdGF0eXBlICJOTVRPS0VOUyIgPgotCi08IS0tIHNpbmdsZSBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSBkZXNjcmlwdG9ycyAtLT4KLTwhRU5USVRZICUgTWVkaWFEZXNjLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIHBpeGVsLCBwZXJjZW50YWdlLCBvciByZWxhdGl2ZSAtLT4KLTwhRU5USVRZICUgTXVsdGlMZW5ndGguZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gb25lIG9yIG1vcmUgZGlnaXRzIChOVU1CRVIpIC0tPgotPCFFTlRJVFkgJSBOdW1iZXIuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gaW50ZWdlciByZXByZXNlbnRpbmcgbGVuZ3RoIGluIHBpeGVscyAtLT4KLTwhRU5USVRZICUgUGl4ZWxzLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIHNjcmlwdCBleHByZXNzaW9uIC0tPgotPCFFTlRJVFkgJSBTY3JpcHQuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gdGV4dHVhbCBjb250ZW50IC0tPgotPCFFTlRJVFkgJSBUZXh0LmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIEltcG9ydGVkIERhdGF0eXBlcyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSBbSVNPMTA2NDZdIC0tPgotPCFFTlRJVFkgJSBDaGFyYWN0ZXIuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gYSBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IUVOVElUWSAlIENoYXJzZXQuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjaGFyYWN0ZXIgZW5jb2RpbmdzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFFTlRJVFkgJSBDaGFyc2V0cy5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBtZWRpYSB0eXBlLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFFTlRJVFkgJSBDb250ZW50VHlwZS5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSB0eXBlcywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhRU5USVRZICUgQ29udGVudFR5cGVzLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGRhdGUgYW5kIHRpbWUgaW5mb3JtYXRpb24uIElTTyBkYXRlIGZvcm1hdCAtLT4KLTwhRU5USVRZICUgRGF0ZXRpbWUuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gZm9ybWFsIHB1YmxpYyBpZGVudGlmaWVyLCBhcyBwZXIgW0lTTzg4NzldIC0tPgotPCFFTlRJVFkgJSBGUEkuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gYSBsYW5ndWFnZSBjb2RlLCBhcyBwZXIgW1JGQzE3NjZdIC0tPgotPCFFTlRJVFkgJSBMYW5ndWFnZUNvZGUuZGF0YXR5cGUgIk5NVE9LRU4iID4KLQotPCEtLSBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciwgc2VlIFtVUkldIC0tPgotPCFFTlRJVFkgJSBVUkkuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXJzLCBzZWUgW1VSSV0gLS0+Ci08IUVOVElUWSAlIFVSSXMuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWRhdGF0eXBlcy0xLm1vZCAtLT4KLV1dPgotCi08IS0tIHBsYWNlaG9sZGVyIGZvciBYTGluayBzdXBwb3J0IG1vZHVsZSAtLT4KLTwhRU5USVRZICUgeGh0bWwteGxpbmsubW9kICIiID4KLQotCi08IUVOVElUWSAlIHhodG1sLXFuYW1lLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLXFuYW1lLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLXFuYW1lLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgUXVhbGlmaWVkIE5hbWVzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtcW5hbWUtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFFuYW1lIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1xbmFtZS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBRdWFsaWZpZWQgTmFtZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1xbmFtZS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBYSFRNTCBRbmFtZSAoUXVhbGlmaWVkIE5hbWUpIE1vZHVsZQotCi0gICAgIFRoaXMgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbiB0d28gcGFydHMsIGxhYmVsZWQgU2VjdGlvbiAnQScgYW5kICdCJzoKLQotICAgICAgIFNlY3Rpb24gQSBkZWNsYXJlcyBwYXJhbWV0ZXIgZW50aXRpZXMgdG8gc3VwcG9ydCBuYW1lc3BhY2UtCi0gICAgICAgcXVhbGlmaWVkIG5hbWVzLCBuYW1lc3BhY2UgZGVjbGFyYXRpb25zLCBhbmQgbmFtZSBwcmVmaXhpbmcgCi0gICAgICAgZm9yIFhIVE1MIGFuZCBleHRlbnNpb25zLgotICAgIAotICAgICAgIFNlY3Rpb24gQiBkZWNsYXJlcyBwYXJhbWV0ZXIgZW50aXRpZXMgdXNlZCB0byBwcm92aWRlCi0gICAgICAgbmFtZXNwYWNlLXF1YWxpZmllZCBuYW1lcyBmb3IgYWxsIFhIVE1MIGVsZW1lbnQgdHlwZXM6Ci0KLSAgICAgICAgICVhcHBsZXQucW5hbWU7ICAgdGhlIHhtbG5zLXF1YWxpZmllZCBuYW1lIGZvciA8YXBwbGV0PgotICAgICAgICAgJWJhc2UucW5hbWU7ICAgICB0aGUgeG1sbnMtcXVhbGlmaWVkIG5hbWUgZm9yIDxiYXNlPgotICAgICAgICAgLi4uCi0KLSAgICAgWEhUTUwgZXh0ZW5zaW9ucyB3b3VsZCBjcmVhdGUgYSBtb2R1bGUgc2ltaWxhciB0byB0aGlzIG9uZS4gCi0gICAgIEluY2x1ZGVkIGluIHRoZSBYSFRNTCBkaXN0cmlidXRpb24gaXMgYSB0ZW1wbGF0ZSBtb2R1bGUgCi0gICAgICgndGVtcGxhdGUtcW5hbWUtMS5tb2QnKSBzdWl0YWJsZSBmb3IgdGhpcyBwdXJwb3NlLgotLS0+Ci0KLTwhLS0gU2VjdGlvbiBBOiBYSFRNTCBYTUwgTmFtZXNwYWNlIEZyYW1ld29yayA6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OiAtLT4KLQotPCEtLSAxLiBEZWNsYXJlIGEgJVhIVE1MLnByZWZpeGVkOyBjb25kaXRpb25hbCBzZWN0aW9uIGtleXdvcmQsIHVzZWQKLSAgICAgICAgdG8gYWN0aXZhdGUgbmFtZXNwYWNlIHByZWZpeGluZy4gVGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIAotICAgICAgICBpbmhlcml0ICclTlMucHJlZml4ZWQ7JyBmcm9tIHRoZSBEVEQgZHJpdmVyLCBzbyB0aGF0IHVubGVzcyAKLSAgICAgICAgb3ZlcnJpZGRlbiwgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIGZvbGxvd3MgdGhlIG92ZXJhbGwgRFREIAotICAgICAgICBwcmVmaXhpbmcgc2NoZW1lLgotLS0+Ci08IUVOVElUWSAlIE5TLnByZWZpeGVkICJJR05PUkUiID4KLTwhRU5USVRZICUgWEhUTUwucHJlZml4ZWQgIiVOUy5wcmVmaXhlZDsiID4KLQotPCEtLSAyLiBEZWNsYXJlIGEgcGFyYW1ldGVyIGVudGl0eSAoZWcuLCAlWEhUTUwueG1sbnM7KSBjb250YWluaW5nIAotICAgICAgICB0aGUgVVJJIHJlZmVyZW5jZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBYSFRNTCBuYW1lc3BhY2U6Ci0tLT4KLTwhRU5USVRZICUgWEhUTUwueG1sbnMgICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiA+Ci0KLTwhLS0gMy4gRGVjbGFyZSBwYXJhbWV0ZXIgZW50aXRpZXMgKGVnLiwgJVhIVE1MLnByZWZpeDspIGNvbnRhaW5pbmcKLSAgICAgICAgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIHByZWZpeCBzdHJpbmcocykgdG8gdXNlIHdoZW4gcHJlZml4aW5nIAotICAgICAgICBpcyBlbmFibGVkLiBUaGlzIG1heSBiZSBvdmVycmlkZGVuIGluIHRoZSBEVEQgZHJpdmVyIG9yIHRoZQotICAgICAgICBpbnRlcm5hbCBzdWJzZXQgb2YgYW4gZG9jdW1lbnQgaW5zdGFuY2UuIElmIG5vIGRlZmF1bHQgcHJlZml4Ci0gICAgICAgIGlzIGRlc2lyZWQsIHRoaXMgbWF5IGJlIGRlY2xhcmVkIGFzIGFuIGVtcHR5IHN0cmluZy4KLQotICAgICBOT1RFOiBBcyBzcGVjaWZpZWQgaW4gW1hNTE5BTUVTXSwgdGhlIG5hbWVzcGFjZSBwcmVmaXggc2VydmVzIAotICAgICBhcyBhIHByb3h5IGZvciB0aGUgVVJJIHJlZmVyZW5jZSwgYW5kIGlzIG5vdCBpbiBpdHNlbGYgc2lnbmlmaWNhbnQuCi0tLT4KLTwhRU5USVRZICUgWEhUTUwucHJlZml4ICAiIiA+Ci0KLTwhLS0gNC4gRGVjbGFyZSBwYXJhbWV0ZXIgZW50aXRpZXMgKGVnLiwgJVhIVE1MLnBmeDspIGNvbnRhaW5pbmcgdGhlIAotICAgICAgICBjb2xvbml6ZWQgcHJlZml4KGVzKSAoZWcuLCAnJVhIVE1MLnByZWZpeDs6JykgdXNlZCB3aGVuIAotICAgICAgICBwcmVmaXhpbmcgaXMgYWN0aXZlLCBhbiBlbXB0eSBzdHJpbmcgd2hlbiBpdCBpcyBub3QuCi0tLT4KLTwhWyVYSFRNTC5wcmVmaXhlZDtbCi08IUVOVElUWSAlIFhIVE1MLnBmeCAgIiVYSFRNTC5wcmVmaXg7OiIgPgotXV0+Ci08IUVOVElUWSAlIFhIVE1MLnBmeCAgIiIgPgotCi08IS0tIGRlY2xhcmUgcXVhbGlmaWVkIG5hbWUgZXh0ZW5zaW9ucyBoZXJlIC4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtcW5hbWUtZXh0cmEubW9kICIiID4KLQotCi08IS0tIDUuIFRoZSBwYXJhbWV0ZXIgZW50aXR5ICVYSFRNTC54bWxucy5leHRyYS5hdHRyaWI7IG1heSBiZQotICAgICAgICByZWRlY2xhcmVkIHRvIGNvbnRhaW4gYW55IG5vbi1YSFRNTCBuYW1lc3BhY2UgZGVjbGFyYXRpb24gCi0gICAgICAgIGF0dHJpYnV0ZXMgZm9yIG5hbWVzcGFjZXMgZW1iZWRkZWQgaW4gWEhUTUwuIFRoZSBkZWZhdWx0IAotICAgICAgICBpcyBhbiBlbXB0eSBzdHJpbmcuICBYTGluayBzaG91bGQgYmUgaW5jbHVkZWQgaGVyZSBpZiB1c2VkIAotICAgICAgICBpbiB0aGUgRFRELgotLS0+Ci08IUVOVElUWSAlIFhIVE1MLnhtbG5zLmV4dHJhLmF0dHJpYiAiIiA+Ci0KLTwhLS0gVGhlIHJlbWFpbmRlciBvZiBTZWN0aW9uIEEgaXMgb25seSBmb2xsb3dlZCBpbiBYSFRNTCwgbm90IGV4dGVuc2lvbnMuIC0tPgotCi08IS0tIERlY2xhcmUgYSBwYXJhbWV0ZXIgZW50aXR5ICVOUy5kZWNsLmF0dHJpYjsgY29udGFpbmluZwotICAgICBhbGwgWE1MIE5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgdXNlZCBpbiB0aGUgRFRELCBwbHVzIHRoZQotICAgICB4bWxucyBkZWNsYXJhdGlvbiBmb3IgWEhUTUwsIGl0cyBmb3JtIGRlcGVuZGVudCBvbiB3aGV0aGVyIAotICAgICBwcmVmaXhpbmcgaXMgYWN0aXZlLiAKLS0tPgotPCFbJVhIVE1MLnByZWZpeGVkO1sKLTwhRU5USVRZICUgTlMuZGVjbC5hdHRyaWIKLSAgICAgInhtbG5zOiVYSFRNTC5wcmVmaXg7ICAlVVJJLmRhdGF0eXBlOyAgICNGSVhFRCAnJVhIVE1MLnhtbG5zOycKLSAgICAgICVYSFRNTC54bWxucy5leHRyYS5hdHRyaWI7IgotPgotXV0+Ci08IUVOVElUWSAlIE5TLmRlY2wuYXR0cmliCi0gICAgICIlWEhUTUwueG1sbnMuZXh0cmEuYXR0cmliOyIKLT4KLQotPCEtLSBUaGlzIGlzIGEgcGxhY2Vob2xkZXIgZm9yIGZ1dHVyZSBYTGluayBzdXBwb3J0LgotLS0+Ci08IUVOVElUWSAlIFhMSU5LLnhtbG5zLmF0dHJpYiAiIiA+Ci0KLTwhLS0gRGVjbGFyZSBhIHBhcmFtZXRlciBlbnRpdHkgJU5TLmRlY2wuYXR0cmliOyBjb250YWluaW5nIGFsbCAKLSAgICAgWE1MIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBhdHRyaWJ1dGVzIHVzZWQgYnkgWEhUTUwsIGluY2x1ZGluZwotICAgICBhIGRlZmF1bHQgeG1sbnMgYXR0cmlidXRlIHdoZW4gcHJlZml4aW5nIGlzIGluYWN0aXZlLgotLS0+Ci08IVslWEhUTUwucHJlZml4ZWQ7WwotPCFFTlRJVFkgJSBYSFRNTC54bWxucy5hdHRyaWIKLSAgICAgIiVOUy5kZWNsLmF0dHJpYjsKLSAgICAgICVYTElOSy54bWxucy5hdHRyaWI7IgotPgotXV0+Ci08IUVOVElUWSAlIFhIVE1MLnhtbG5zLmF0dHJpYgotICAgICAieG1sbnMgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjRklYRUQgJyVYSFRNTC54bWxuczsnCi0gICAgICAlWExJTksueG1sbnMuYXR0cmliOyIKLT4KLQotPCEtLSBwbGFjZWhvbGRlciBmb3IgcXVhbGlmaWVkIG5hbWUgcmVkZWNsYXJhdGlvbnMgLS0+Ci08IUVOVElUWSAlIHhodG1sLXFuYW1lLnJlZGVjbCAiIiA+Ci0KLQotPCEtLSBTZWN0aW9uIEI6IFhIVE1MIFF1YWxpZmllZCBOYW1lcyA6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OiAtLT4KLQotPCEtLSA2LiBUaGlzIHNlY3Rpb24gZGVjbGFyZXMgcGFyYW1ldGVyIGVudGl0aWVzIHVzZWQgdG8gcHJvdmlkZQotICAgICAgICBuYW1lc3BhY2UtcXVhbGlmaWVkIG5hbWVzIGZvciBhbGwgWEhUTUwgZWxlbWVudCB0eXBlcy4KLS0tPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWFwcGxldC0xLm1vZCAtLT4KLTwhRU5USVRZICUgYXBwbGV0LnFuYW1lICAiJVhIVE1MLnBmeDthcHBsZXQiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1iYXNlLTEubW9kIC0tPgotPCFFTlRJVFkgJSBiYXNlLnFuYW1lICAgICIlWEhUTUwucGZ4O2Jhc2UiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1iZG8tMS5tb2QgLS0+Ci08IUVOVElUWSAlIGJkby5xbmFtZSAgICAgIiVYSFRNTC5wZng7YmRvIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYmxrcGhyYXMtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGFkZHJlc3MucW5hbWUgIiVYSFRNTC5wZng7YWRkcmVzcyIgPgotPCFFTlRJVFkgJSBibG9ja3F1b3RlLnFuYW1lICAiJVhIVE1MLnBmeDtibG9ja3F1b3RlIiA+Ci08IUVOVElUWSAlIHByZS5xbmFtZSAgICAgIiVYSFRNTC5wZng7cHJlIiA+Ci08IUVOVElUWSAlIGgxLnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDEiID4KLTwhRU5USVRZICUgaDIucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoMiIgPgotPCFFTlRJVFkgJSBoMy5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2gzIiA+Ci08IUVOVElUWSAlIGg0LnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDQiID4KLTwhRU5USVRZICUgaDUucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoNSIgPgotPCFFTlRJVFkgJSBoNi5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2g2IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYmxrcHJlcy0xLm1vZCAtLT4KLTwhRU5USVRZICUgaHIucW5hbWUgICAgICAiJVhIVE1MLnBmeDtociIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWJsa3N0cnVjdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgZGl2LnFuYW1lICAgICAiJVhIVE1MLnBmeDtkaXYiID4KLTwhRU5USVRZICUgcC5xbmFtZSAgICAgICAiJVhIVE1MLnBmeDtwIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtZWRpdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgaW5zLnFuYW1lICAgICAiJVhIVE1MLnBmeDtpbnMiID4KLTwhRU5USVRZICUgZGVsLnFuYW1lICAgICAiJVhIVE1MLnBmeDtkZWwiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1mb3JtLTEubW9kIC0tPgotPCFFTlRJVFkgJSBmb3JtLnFuYW1lICAgICIlWEhUTUwucGZ4O2Zvcm0iID4KLTwhRU5USVRZICUgbGFiZWwucW5hbWUgICAiJVhIVE1MLnBmeDtsYWJlbCIgPgotPCFFTlRJVFkgJSBpbnB1dC5xbmFtZSAgICIlWEhUTUwucGZ4O2lucHV0IiA+Ci08IUVOVElUWSAlIHNlbGVjdC5xbmFtZSAgIiVYSFRNTC5wZng7c2VsZWN0IiA+Ci08IUVOVElUWSAlIG9wdGdyb3VwLnFuYW1lICAiJVhIVE1MLnBmeDtvcHRncm91cCIgPgotPCFFTlRJVFkgJSBvcHRpb24ucW5hbWUgICIlWEhUTUwucGZ4O29wdGlvbiIgPgotPCFFTlRJVFkgJSB0ZXh0YXJlYS5xbmFtZSAgIiVYSFRNTC5wZng7dGV4dGFyZWEiID4KLTwhRU5USVRZICUgZmllbGRzZXQucW5hbWUgICIlWEhUTUwucGZ4O2ZpZWxkc2V0IiA+Ci08IUVOVElUWSAlIGxlZ2VuZC5xbmFtZSAgIiVYSFRNTC5wZng7bGVnZW5kIiA+Ci08IUVOVElUWSAlIGJ1dHRvbi5xbmFtZSAgIiVYSFRNTC5wZng7YnV0dG9uIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaHlwZXJ0ZXh0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBhLnFuYW1lICAgICAgICIlWEhUTUwucGZ4O2EiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pbWFnZS0xLm1vZCAtLT4KLTwhRU5USVRZICUgaW1nLnFuYW1lICAgICAiJVhIVE1MLnBmeDtpbWciID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pbmxwaHJhcy0xLm1vZCAtLT4KLTwhRU5USVRZICUgYWJici5xbmFtZSAgICAiJVhIVE1MLnBmeDthYmJyIiA+Ci08IUVOVElUWSAlIGFjcm9ueW0ucW5hbWUgIiVYSFRNTC5wZng7YWNyb255bSIgPgotPCFFTlRJVFkgJSBjaXRlLnFuYW1lICAgICIlWEhUTUwucGZ4O2NpdGUiID4KLTwhRU5USVRZICUgY29kZS5xbmFtZSAgICAiJVhIVE1MLnBmeDtjb2RlIiA+Ci08IUVOVElUWSAlIGRmbi5xbmFtZSAgICAgIiVYSFRNTC5wZng7ZGZuIiA+Ci08IUVOVElUWSAlIGVtLnFuYW1lICAgICAgIiVYSFRNTC5wZng7ZW0iID4KLTwhRU5USVRZICUga2JkLnFuYW1lICAgICAiJVhIVE1MLnBmeDtrYmQiID4KLTwhRU5USVRZICUgcS5xbmFtZSAgICAgICAiJVhIVE1MLnBmeDtxIiA+Ci08IUVOVElUWSAlIHNhbXAucW5hbWUgICAgIiVYSFRNTC5wZng7c2FtcCIgPgotPCFFTlRJVFkgJSBzdHJvbmcucW5hbWUgICIlWEhUTUwucGZ4O3N0cm9uZyIgPgotPCFFTlRJVFkgJSB2YXIucW5hbWUgICAgICIlWEhUTUwucGZ4O3ZhciIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWlubHByZXMtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGIucW5hbWUgICAgICAgIiVYSFRNTC5wZng7YiIgPgotPCFFTlRJVFkgJSBiaWcucW5hbWUgICAgICIlWEhUTUwucGZ4O2JpZyIgPgotPCFFTlRJVFkgJSBpLnFuYW1lICAgICAgICIlWEhUTUwucGZ4O2kiID4KLTwhRU5USVRZICUgc21hbGwucW5hbWUgICAiJVhIVE1MLnBmeDtzbWFsbCIgPgotPCFFTlRJVFkgJSBzdWIucW5hbWUgICAgICIlWEhUTUwucGZ4O3N1YiIgPgotPCFFTlRJVFkgJSBzdXAucW5hbWUgICAgICIlWEhUTUwucGZ4O3N1cCIgPgotPCFFTlRJVFkgJSB0dC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3R0IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaW5sc3RydWN0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBici5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2JyIiA+Ci08IUVOVElUWSAlIHNwYW4ucW5hbWUgICAgIiVYSFRNTC5wZng7c3BhbiIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWlzbWFwLTEubW9kIChhbHNvIGNzaXNtYXAsIHNzaXNtYXApIC0tPgotPCFFTlRJVFkgJSBtYXAucW5hbWUgICAgICIlWEhUTUwucGZ4O21hcCIgPgotPCFFTlRJVFkgJSBhcmVhLnFuYW1lICAgICIlWEhUTUwucGZ4O2FyZWEiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1saW5rLTEubW9kIC0tPgotPCFFTlRJVFkgJSBsaW5rLnFuYW1lICAgICIlWEhUTUwucGZ4O2xpbmsiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1saXN0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBkbC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2RsIiA+Ci08IUVOVElUWSAlIGR0LnFuYW1lICAgICAgIiVYSFRNTC5wZng7ZHQiID4KLTwhRU5USVRZICUgZGQucW5hbWUgICAgICAiJVhIVE1MLnBmeDtkZCIgPgotPCFFTlRJVFkgJSBvbC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O29sIiA+Ci08IUVOVElUWSAlIHVsLnFuYW1lICAgICAgIiVYSFRNTC5wZng7dWwiID4KLTwhRU5USVRZICUgbGkucW5hbWUgICAgICAiJVhIVE1MLnBmeDtsaSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLW1ldGEtMS5tb2QgLS0+Ci08IUVOVElUWSAlIG1ldGEucW5hbWUgICAgIiVYSFRNTC5wZng7bWV0YSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXBhcmFtLTEubW9kIC0tPgotPCFFTlRJVFkgJSBwYXJhbS5xbmFtZSAgICIlWEhUTUwucGZ4O3BhcmFtIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtb2JqZWN0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBvYmplY3QucW5hbWUgICIlWEhUTUwucGZ4O29iamVjdCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXNjcmlwdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgc2NyaXB0LnFuYW1lICAiJVhIVE1MLnBmeDtzY3JpcHQiID4KLTwhRU5USVRZICUgbm9zY3JpcHQucW5hbWUgICIlWEhUTUwucGZ4O25vc2NyaXB0IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtc3RydWN0LTEubW9kIC0tPgotPCFFTlRJVFkgJSBodG1sLnFuYW1lICAgICIlWEhUTUwucGZ4O2h0bWwiID4KLTwhRU5USVRZICUgaGVhZC5xbmFtZSAgICAiJVhIVE1MLnBmeDtoZWFkIiA+Ci08IUVOVElUWSAlIHRpdGxlLnFuYW1lICAgIiVYSFRNTC5wZng7dGl0bGUiID4KLTwhRU5USVRZICUgYm9keS5xbmFtZSAgICAiJVhIVE1MLnBmeDtib2R5IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtc3R5bGUtMS5tb2QgLS0+Ci08IUVOVElUWSAlIHN0eWxlLnFuYW1lICAgIiVYSFRNTC5wZng7c3R5bGUiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC10YWJsZS0xLm1vZCAtLT4KLTwhRU5USVRZICUgdGFibGUucW5hbWUgICAiJVhIVE1MLnBmeDt0YWJsZSIgPgotPCFFTlRJVFkgJSBjYXB0aW9uLnFuYW1lICIlWEhUTUwucGZ4O2NhcHRpb24iID4KLTwhRU5USVRZICUgdGhlYWQucW5hbWUgICAiJVhIVE1MLnBmeDt0aGVhZCIgPgotPCFFTlRJVFkgJSB0Zm9vdC5xbmFtZSAgICIlWEhUTUwucGZ4O3Rmb290IiA+Ci08IUVOVElUWSAlIHRib2R5LnFuYW1lICAgIiVYSFRNTC5wZng7dGJvZHkiID4KLTwhRU5USVRZICUgY29sZ3JvdXAucW5hbWUgICIlWEhUTUwucGZ4O2NvbGdyb3VwIiA+Ci08IUVOVElUWSAlIGNvbC5xbmFtZSAgICAgIiVYSFRNTC5wZng7Y29sIiA+Ci08IUVOVElUWSAlIHRyLnFuYW1lICAgICAgIiVYSFRNTC5wZng7dHIiID4KLTwhRU5USVRZICUgdGgucW5hbWUgICAgICAiJVhIVE1MLnBmeDt0aCIgPgotPCFFTlRJVFkgJSB0ZC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3RkIiA+Ci0KLQotPCEtLSBQcm92aXNpb25hbCBYSFRNTCAyLjAgUXVhbGlmaWVkIE5hbWVzICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWltYWdlLTIubW9kIC0tPgotPCFFTlRJVFkgJSBhbHQucW5hbWUgICAgICIlWEhUTUwucGZ4O2FsdCIgPgotCi08IS0tIGVuZCBvZiB4aHRtbC1xbmFtZS0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWV2ZW50cy5tb2R1bGUgIklHTk9SRSIgPgotPCFbJXhodG1sLWV2ZW50cy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1ldmVudHMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBJbnRyaW5zaWMgRXZlbnRzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtZXZlbnRzLTEubW9kIiA+Ci0leGh0bWwtZXZlbnRzLm1vZDtdXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1hdHRyaWJzLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWF0dHJpYnMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtYXR0cmlicy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIENvbW1vbiBBdHRyaWJ1dGVzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtYXR0cmlicy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBDb21tb24gQXR0cmlidXRlcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1hdHRyaWJzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIENvbW1vbiBBdHRyaWJ1dGVzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtYXR0cmlicy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBDb21tb24gQXR0cmlidXRlcwotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIG1hbnkgb2YgdGhlIGNvbW1vbiBhdHRyaWJ1dGVzIGZvciB0aGUgWEhUTUwgRFRELgotICAgICAlTlMuZGVjbC5hdHRyaWI7IGlzIGRlY2xhcmVkIGluIHRoZSBYSFRNTCBRbmFtZSBtb2R1bGUuCi0tLT4KLQotPCFFTlRJVFkgJSBpZC5hdHRyaWIKLSAgICAgImlkICAgICAgICAgICBJRCAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhRU5USVRZICUgY2xhc3MuYXR0cmliCi0gICAgICJjbGFzcyAgICAgICAgTk1UT0tFTlMgICAgICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IUVOVElUWSAlIHRpdGxlLmF0dHJpYgotICAgICAidGl0bGUgICAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCFFTlRJVFkgJSBDb3JlLmV4dHJhLmF0dHJpYiAiIiA+Ci0KLTwhRU5USVRZICUgQ29yZS5hdHRyaWIKLSAgICAgIiVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICAlaWQuYXR0cmliOwotICAgICAgJWNsYXNzLmF0dHJpYjsKLSAgICAgICV0aXRsZS5hdHRyaWI7Ci0gICAgICAlQ29yZS5leHRyYS5hdHRyaWI7IgotPgotCi08IUVOVElUWSAlIGxhbmcuYXR0cmliCi0gICAgICJ4bWw6bGFuZyAgICAgJUxhbmd1YWdlQ29kZS5kYXRhdHlwZTsgICNJTVBMSUVEIgotPgotCi08IVslWEhUTUwuYmlkaTtbCi08IUVOVElUWSAlIGRpci5hdHRyaWIKLSAgICAgImRpciAgICAgICAgICAoIGx0ciB8IHJ0bCApICAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhRU5USVRZICUgSTE4bi5hdHRyaWIKLSAgICAgIiVkaXIuYXR0cmliOwotICAgICAgJWxhbmcuYXR0cmliOyIKLT4KLQotXV0+Ci08IUVOVElUWSAlIEkxOG4uYXR0cmliCi0gICAgICIlbGFuZy5hdHRyaWI7IgotPgotCi08IUVOVElUWSAlIENvbW1vbi5leHRyYS5hdHRyaWIgIiIgPgotCi08IS0tIGludHJpbnNpYyBldmVudCBhdHRyaWJ1dGVzIGRlY2xhcmVkIHByZXZpb3VzbHkKLS0tPgotPCFFTlRJVFkgJSBFdmVudHMuYXR0cmliICIiID4KLQotPCFFTlRJVFkgJSBDb21tb24uYXR0cmliCi0gICAgICIlQ29yZS5hdHRyaWI7Ci0gICAgICAlSTE4bi5hdHRyaWI7Ci0gICAgICAlRXZlbnRzLmF0dHJpYjsKLSAgICAgICVDb21tb24uZXh0cmEuYXR0cmliOyIKLT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYXR0cmlicy0xLm1vZCAtLT4KLV1dPgotCi08IS0tIHBsYWNlaG9sZGVyIGZvciBjb250ZW50IG1vZGVsIHJlZGVjbGFyYXRpb25zIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1tb2RlbC5yZWRlY2wgIiIgPgotCi0KLTwhRU5USVRZICUgeGh0bWwtbW9kZWwubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtbW9kZWwubW9kdWxlO1sKLTwhLS0gaW5zdGFudGlhdGUgdGhlIERvY3VtZW50IE1vZGVsIG1vZHVsZSBkZWNsYXJlZCBpbiB0aGUgRFREIGRyaXZlcgotLS0+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCYXNpYyAxLjAgRG9jdW1lbnQgTW9kZWwgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWJhc2ljMTAtbW9kZWwtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MIEJhc2ljLCBhIHByb3BlciBzdWJzZXQgb2YgWEhUTUwuCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBCYXNpYyAxLjAgRG9jdW1lbnQgTW9kZWwgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLWJhc2ljL3hodG1sLWJhc2ljMTAtbW9kZWwtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gWEhUTUwgQmFzaWMgRG9jdW1lbnQgTW9kZWwKLQotICAgICBUaGlzIG1vZHVsZSBkZXNjcmliZXMgdGhlIGdyb3VwaW5ncyBvZiBlbGVtZW50cyB0aGF0IG1ha2UgdXAKLSAgICAgY29tbW9uIGNvbnRlbnQgbW9kZWxzIGZvciBYSFRNTCBlbGVtZW50cy4KLS0tPgotCi08IS0tIE9wdGlvbmFsIEVsZW1lbnRzIGluIGhlYWQgIC4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIEhlYWRPcHRzLm1peAotICAgICAiKCAlbWV0YS5xbmFtZTsgfCAlbGluay5xbmFtZTsgfCAlb2JqZWN0LnFuYW1lOyApKiIgPgotCi08IS0tIE1pc2NlbGxhbmVvdXMgRWxlbWVudHMgIC4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIE1pc2MuY2xhc3MgIiIgPgotCi08IS0tIElubGluZSBFbGVtZW50cyAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIElubFN0cnVjdC5jbGFzcyAiJWJyLnFuYW1lOyB8ICVzcGFuLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIElubFBocmFzLmNsYXNzCi0gICAgICJ8ICVlbS5xbmFtZTsgfCAlc3Ryb25nLnFuYW1lOyB8ICVkZm4ucW5hbWU7IHwgJWNvZGUucW5hbWU7Ci0gICAgICB8ICVzYW1wLnFuYW1lOyB8ICVrYmQucW5hbWU7IHwgJXZhci5xbmFtZTsgfCAlY2l0ZS5xbmFtZTsKLSAgICAgIHwgJWFiYnIucW5hbWU7IHwgJWFjcm9ueW0ucW5hbWU7IHwgJXEucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgSW5sUHJlcy5jbGFzcyAiIiA+Ci0KLTwhRU5USVRZICUgSTE4bi5jbGFzcyAiIiA+Ci0KLTwhRU5USVRZICUgQW5jaG9yLmNsYXNzICJ8ICVhLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIElubFNwZWNpYWwuY2xhc3MgInwgJWltZy5xbmFtZTsgfCAlb2JqZWN0LnFuYW1lOyIgPgotCi08IUVOVElUWSAlIElubEZvcm0uY2xhc3MKLSAgICAgInwgJWlucHV0LnFuYW1lOyB8ICVzZWxlY3QucW5hbWU7IHwgJXRleHRhcmVhLnFuYW1lOwotICAgICAgfCAlbGFiZWwucW5hbWU7IgotPgotCi08IUVOVElUWSAlIElubGluZS5leHRyYSAiIiA+Ci0KLTwhRU5USVRZICUgSW5saW5lLmNsYXNzCi0gICAgICIlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgJUFuY2hvci5jbGFzczsKLSAgICAgICVJbmxTcGVjaWFsLmNsYXNzOwotICAgICAgJUlubEZvcm0uY2xhc3M7Ci0gICAgICAlSW5saW5lLmV4dHJhOyIKLT4KLQotPCFFTlRJVFkgJSBJbmxOb0FuY2hvci5jbGFzcwotICAgICAiJUlubFN0cnVjdC5jbGFzczsKLSAgICAgICVJbmxQaHJhcy5jbGFzczsKLSAgICAgICVJbmxTcGVjaWFsLmNsYXNzOwotICAgICAgJUlubEZvcm0uY2xhc3M7Ci0gICAgICAlSW5saW5lLmV4dHJhOyIKLT4KLQotPCFFTlRJVFkgJSBJbmxOb0FuY2hvci5taXgKLSAgICAgIiVJbmxOb0FuY2hvci5jbGFzczsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotPCFFTlRJVFkgJSBJbmxpbmUubWl4Ci0gICAgICIlSW5saW5lLmNsYXNzOwotICAgICAgJU1pc2MuY2xhc3M7IgotPgotCi08IS0tIEJsb2NrIEVsZW1lbnRzICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIEhlYWRpbmcuY2xhc3MKLSAgICAgIiVoMS5xbmFtZTsgfCAlaDIucW5hbWU7IHwgJWgzLnFuYW1lOwotICAgICAgfCAlaDQucW5hbWU7IHwgJWg1LnFuYW1lOyB8ICVoNi5xbmFtZTsiCi0+Ci08IUVOVElUWSAlIExpc3QuY2xhc3MgICIldWwucW5hbWU7IHwgJW9sLnFuYW1lOyB8ICVkbC5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBUYWJsZS5jbGFzcyAifCAldGFibGUucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgRm9ybS5jbGFzcyAgInwgJWZvcm0ucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgQmxrU3RydWN0LmNsYXNzICIlcC5xbmFtZTsgfCAlZGl2LnFuYW1lOyIgPgotCi08IUVOVElUWSAlIEJsa1BocmFzLmNsYXNzCi0gICAgICJ8ICVwcmUucW5hbWU7IHwgJWJsb2NrcXVvdGUucW5hbWU7IHwgJWFkZHJlc3MucW5hbWU7IgotPgotCi08IUVOVElUWSAlIEJsa1ByZXMuY2xhc3MgIiIgPgotCi08IUVOVElUWSAlIEJsa1NwZWNpYWwuY2xhc3MKLSAgICAgIiVUYWJsZS5jbGFzczsKLSAgICAgICVGb3JtLmNsYXNzOyIKLT4KLQotPCFFTlRJVFkgJSBCbG9jay5leHRyYSAiIiA+Ci0KLTwhRU5USVRZICUgQmxvY2suY2xhc3MKLSAgICAgIiVCbGtTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlQmxrUGhyYXMuY2xhc3M7Ci0gICAgICAlQmxrU3BlY2lhbC5jbGFzczsKLSAgICAgICVCbG9jay5leHRyYTsiCi0+Ci0KLTwhRU5USVRZICUgQmxvY2subWl4Ci0gICAgICIlSGVhZGluZy5jbGFzczsKLSAgICAgIHwgJUxpc3QuY2xhc3M7Ci0gICAgICB8ICVCbG9jay5jbGFzczsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotPCEtLSBBbGwgQ29udGVudCBFbGVtZW50cyAgLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBkZWNsYXJlcyBhbGwgY29udGVudCBleGNlcHQgdGFibGVzCi0tLT4KLTwhRU5USVRZICUgRmxvd05vVGFibGUubWl4Ci0gICAgICIlSGVhZGluZy5jbGFzczsKLSAgICAgIHwgJUxpc3QuY2xhc3M7Ci0gICAgICB8ICVCbGtTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlQmxrUGhyYXMuY2xhc3M7Ci0gICAgICAlRm9ybS5jbGFzczsKLSAgICAgICVCbG9jay5leHRyYTsKLSAgICAgIHwgJUlubGluZS5jbGFzczsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotPCFFTlRJVFkgJSBGbG93Lm1peAotICAgICAiJUhlYWRpbmcuY2xhc3M7Ci0gICAgICB8ICVMaXN0LmNsYXNzOwotICAgICAgfCAlQmxvY2suY2xhc3M7Ci0gICAgICB8ICVJbmxpbmUuY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJhc2ljMTAtbW9kZWwtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1jaGFyZW50Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWNoYXJlbnQubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtY2hhcmVudC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIENoYXJhY3RlciBFbnRpdGllcyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWNoYXJlbnQtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQ2hhcmFjdGVyIEVudGl0aWVzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWNoYXJlbnQtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgQ2hhcmFjdGVyIEVudGl0aWVzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtY2hhcmVudC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBDaGFyYWN0ZXIgRW50aXRpZXMgZm9yIFhIVE1MCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIHNldCBvZiBjaGFyYWN0ZXIgZW50aXRpZXMgZm9yIFhIVE1MLAotICAgICBpbmNsdWRpbmcgdGhlIExhdGluIDEsIFN5bWJvbCBhbmQgU3BlY2lhbCBjaGFyYWN0ZXIgY29sbGVjdGlvbnMuCi0tLT4KLQotPCFFTlRJVFkgJSB4aHRtbC1sYXQxCi0gICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIExhdGluIDEgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgICAgInhodG1sLWxhdDEuZW50IiA+Ci08IUVOVElUWSAlIHhodG1sLXN5bWJvbAotICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBTeW1ib2xzIGZvciBYSFRNTC8vRU4iCi0gICAgICAgICAgICJ4aHRtbC1zeW1ib2wuZW50IiA+Ci08IUVOVElUWSAlIHhodG1sLXNwZWNpYWwKLSAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbCBmb3IgWEhUTUwvL0VOIgotICAgICAgICAgICAieGh0bWwtc3BlY2lhbC5lbnQiID4KLQotPCEtLSBQb3J0aW9ucyAoQykgSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiAxOTg2Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLTwhLS0gQ2hhcmFjdGVyIGVudGl0eSBzZXQuIFR5cGljYWwgaW52b2NhdGlvbjoKLSAgICA8IUVOVElUWSAlIEhUTUxsYXQxIFBVQkxJQwotICAgICAgICItLy9XM0MvL0VOVElUSUVTIExhdGluIDEgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1sYXQxLmVudCI+Ci0gICAgJUhUTUxsYXQxOwotLS0+Ci0KLTwhRU5USVRZIG5ic3AgICAiJiMxNjA7Ij4gPCEtLSBuby1icmVhayBzcGFjZSA9IG5vbi1icmVha2luZyBzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQTAgSVNPbnVtIC0tPgotPCFFTlRJVFkgaWV4Y2wgICImIzE2MTsiPiA8IS0tIGludmVydGVkIGV4Y2xhbWF0aW9uIG1hcmssIFUrMDBBMSBJU09udW0gLS0+Ci08IUVOVElUWSBjZW50ICAgIiYjMTYyOyI+IDwhLS0gY2VudCBzaWduLCBVKzAwQTIgSVNPbnVtIC0tPgotPCFFTlRJVFkgcG91bmQgICImIzE2MzsiPiA8IS0tIHBvdW5kIHNpZ24sIFUrMDBBMyBJU09udW0gLS0+Ci08IUVOVElUWSBjdXJyZW4gIiYjMTY0OyI+IDwhLS0gY3VycmVuY3kgc2lnbiwgVSswMEE0IElTT251bSAtLT4KLTwhRU5USVRZIHllbiAgICAiJiMxNjU7Ij4gPCEtLSB5ZW4gc2lnbiA9IHl1YW4gc2lnbiwgVSswMEE1IElTT251bSAtLT4KLTwhRU5USVRZIGJydmJhciAiJiMxNjY7Ij4gPCEtLSBicm9rZW4gYmFyID0gYnJva2VuIHZlcnRpY2FsIGJhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQTYgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2VjdCAgICImIzE2NzsiPiA8IS0tIHNlY3Rpb24gc2lnbiwgVSswMEE3IElTT251bSAtLT4KLTwhRU5USVRZIHVtbCAgICAiJiMxNjg7Ij4gPCEtLSBkaWFlcmVzaXMgPSBzcGFjaW5nIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQTggSVNPZGlhIC0tPgotPCFFTlRJVFkgY29weSAgICImIzE2OTsiPiA8IS0tIGNvcHlyaWdodCBzaWduLCBVKzAwQTkgSVNPbnVtIC0tPgotPCFFTlRJVFkgb3JkZiAgICImIzE3MDsiPiA8IS0tIGZlbWluaW5lIG9yZGluYWwgaW5kaWNhdG9yLCBVKzAwQUEgSVNPbnVtIC0tPgotPCFFTlRJVFkgbGFxdW8gICImIzE3MTsiPiA8IS0tIGxlZnQtcG9pbnRpbmcgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsZWZ0IHBvaW50aW5nIGd1aWxsZW1ldCwgVSswMEFCIElTT251bSAtLT4KLTwhRU5USVRZIG5vdCAgICAiJiMxNzI7Ij4gPCEtLSBub3Qgc2lnbiA9IGRpc2NyZXRpb25hcnkgaHlwaGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBQyBJU09udW0gLS0+Ci08IUVOVElUWSBzaHkgICAgIiYjMTczOyI+IDwhLS0gc29mdCBoeXBoZW4gPSBkaXNjcmV0aW9uYXJ5IGh5cGhlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQUQgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmVnICAgICImIzE3NDsiPiA8IS0tIHJlZ2lzdGVyZWQgc2lnbiA9IHJlZ2lzdGVyZWQgdHJhZGUgbWFyayBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBRSBJU09udW0gLS0+Ci08IUVOVElUWSBtYWNyICAgIiYjMTc1OyI+IDwhLS0gbWFjcm9uID0gc3BhY2luZyBtYWNyb24gPSBvdmVybGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQVBMIG92ZXJiYXIsIFUrMDBBRiBJU09kaWEgLS0+Ci08IUVOVElUWSBkZWcgICAgIiYjMTc2OyI+IDwhLS0gZGVncmVlIHNpZ24sIFUrMDBCMCBJU09udW0gLS0+Ci08IUVOVElUWSBwbHVzbW4gIiYjMTc3OyI+IDwhLS0gcGx1cy1taW51cyBzaWduID0gcGx1cy1vci1taW51cyBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCMSBJU09udW0gLS0+Ci08IUVOVElUWSBzdXAyICAgIiYjMTc4OyI+IDwhLS0gc3VwZXJzY3JpcHQgdHdvID0gc3VwZXJzY3JpcHQgZGlnaXQgdHdvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzcXVhcmVkLCBVKzAwQjIgSVNPbnVtIC0tPgotPCFFTlRJVFkgc3VwMyAgICImIzE3OTsiPiA8IS0tIHN1cGVyc2NyaXB0IHRocmVlID0gc3VwZXJzY3JpcHQgZGlnaXQgdGhyZWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGN1YmVkLCBVKzAwQjMgSVNPbnVtIC0tPgotPCFFTlRJVFkgYWN1dGUgICImIzE4MDsiPiA8IS0tIGFjdXRlIGFjY2VudCA9IHNwYWNpbmcgYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEI0IElTT2RpYSAtLT4KLTwhRU5USVRZIG1pY3JvICAiJiMxODE7Ij4gPCEtLSBtaWNybyBzaWduLCBVKzAwQjUgSVNPbnVtIC0tPgotPCFFTlRJVFkgcGFyYSAgICImIzE4MjsiPiA8IS0tIHBpbGNyb3cgc2lnbiA9IHBhcmFncmFwaCBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCNiBJU09udW0gLS0+Ci08IUVOVElUWSBtaWRkb3QgIiYjMTgzOyI+IDwhLS0gbWlkZGxlIGRvdCA9IEdlb3JnaWFuIGNvbW1hCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBHcmVlayBtaWRkbGUgZG90LCBVKzAwQjcgSVNPbnVtIC0tPgotPCFFTlRJVFkgY2VkaWwgICImIzE4NDsiPiA8IS0tIGNlZGlsbGEgPSBzcGFjaW5nIGNlZGlsbGEsIFUrMDBCOCBJU09kaWEgLS0+Ci08IUVOVElUWSBzdXAxICAgIiYjMTg1OyI+IDwhLS0gc3VwZXJzY3JpcHQgb25lID0gc3VwZXJzY3JpcHQgZGlnaXQgb25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCOSBJU09udW0gLS0+Ci08IUVOVElUWSBvcmRtICAgIiYjMTg2OyI+IDwhLS0gbWFzY3VsaW5lIG9yZGluYWwgaW5kaWNhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCQSBJU09udW0gLS0+Ci08IUVOVElUWSByYXF1byAgIiYjMTg3OyI+IDwhLS0gcmlnaHQtcG9pbnRpbmcgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSByaWdodCBwb2ludGluZyBndWlsbGVtZXQsIFUrMDBCQiBJU09udW0gLS0+Ci08IUVOVElUWSBmcmFjMTQgIiYjMTg4OyI+IDwhLS0gdnVsZ2FyIGZyYWN0aW9uIG9uZSBxdWFydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmcmFjdGlvbiBvbmUgcXVhcnRlciwgVSswMEJDIElTT251bSAtLT4KLTwhRU5USVRZIGZyYWMxMiAiJiMxODk7Ij4gPCEtLSB2dWxnYXIgZnJhY3Rpb24gb25lIGhhbGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZyYWN0aW9uIG9uZSBoYWxmLCBVKzAwQkQgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzM0ICImIzE5MDsiPiA8IS0tIHZ1bGdhciBmcmFjdGlvbiB0aHJlZSBxdWFydGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnMsIFUrMDBCRSBJU09udW0gLS0+Ci08IUVOVElUWSBpcXVlc3QgIiYjMTkxOyI+IDwhLS0gaW52ZXJ0ZWQgcXVlc3Rpb24gbWFyawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHVybmVkIHF1ZXN0aW9uIG1hcmssIFUrMDBCRiBJU09udW0gLS0+Ci08IUVOVElUWSBBZ3JhdmUgIiYjMTkyOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGdyYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgQWFjdXRlICImIzE5MzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFjaXJjICAiJiMxOTQ7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEF0aWxkZSAiJiMxOTU7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBdW1sICAgIiYjMTk2OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFyaW5nICAiJiMxOTc7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggcmluZyBhYm92ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSByaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNSBJU09sYXQxIC0tPgotPCFFTlRJVFkgQUVsaWcgICImIzE5ODsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEFFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxpZ2F0dXJlIEFFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNiBJU09sYXQxIC0tPgotPCFFTlRJVFkgQ2NlZGlsICImIzE5OTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEMgd2l0aCBjZWRpbGxhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNyBJU09sYXQxIC0tPgotPCFFTlRJVFkgRWdyYXZlICImIzIwMDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzggSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVhY3V0ZSAiJiMyMDE7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM5IElTT2xhdDEgLS0+Ci08IUVOVElUWSBFY2lyYyAgIiYjMjAyOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENBIElTT2xhdDEgLS0+Ci08IUVOVElUWSBFdW1sICAgIiYjMjAzOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0IgSVNPbGF0MSAtLT4KLTwhRU5USVRZIElncmF2ZSAiJiMyMDQ7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENDIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJYWN1dGUgIiYjMjA1OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDRCBJU09sYXQxIC0tPgotPCFFTlRJVFkgSWNpcmMgICImIzIwNjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDRSBJU09sYXQxIC0tPgotPCFFTlRJVFkgSXVtbCAgICImIzIwNzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENGIElTT2xhdDEgLS0+Ci08IUVOVElUWSBFVEggICAgIiYjMjA4OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRVRILCBVKzAwRDAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE50aWxkZSAiJiMyMDk7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBOIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBPZ3JhdmUgIiYjMjEwOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgT2FjdXRlICImIzIxMTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE9jaXJjICAiJiMyMTI7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE90aWxkZSAiJiMyMTM7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBPdW1sICAgIiYjMjE0OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHRpbWVzICAiJiMyMTU7Ij4gPCEtLSBtdWx0aXBsaWNhdGlvbiBzaWduLCBVKzAwRDcgSVNPbnVtIC0tPgotPCFFTlRJVFkgT3NsYXNoICImIzIxNjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBzdHJva2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gc2xhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ4IElTT2xhdDEgLS0+Ci08IUVOVElUWSBVZ3JhdmUgIiYjMjE3OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgVWFjdXRlICImIzIxODsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFVjaXJjICAiJiMyMTk7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFV1bWwgICAiJiMyMjA7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgWWFjdXRlICImIzIyMTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFRIT1JOICAiJiMyMjI7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBUSE9STiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHN6bGlnICAiJiMyMjM7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgc2hhcnAgcyA9IGVzcy16ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERGIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhZ3JhdmUgIiYjMjI0OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBncmF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGV0dGVyIGEgZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhYWN1dGUgIiYjMjI1OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFjaXJjICAiJiMyMjY7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhdGlsZGUgIiYjMjI3OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGF1bWwgICAiJiMyMjg7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFyaW5nICAiJiMyMjk7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIHJpbmcgYWJvdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxldHRlciBhIHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBhZWxpZyAgIiYjMjMwOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGFlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBzbWFsbCBsaWdhdHVyZSBhZSwgVSswMEU2IElTT2xhdDEgLS0+Ci08IUVOVElUWSBjY2VkaWwgIiYjMjMxOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGMgd2l0aCBjZWRpbGxhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFNyBJU09sYXQxIC0tPgotPCFFTlRJVFkgZWdyYXZlICImIzIzMjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU4IElTT2xhdDEgLS0+Ci08IUVOVElUWSBlYWN1dGUgIiYjMjMzOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGVjaXJjICAiJiMyMzQ7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVBIElTT2xhdDEgLS0+Ci08IUVOVElUWSBldW1sICAgIiYjMjM1OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVCIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpZ3JhdmUgIiYjMjM2OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGlhY3V0ZSAiJiMyMzc7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFRCBJU09sYXQxIC0tPgotPCFFTlRJVFkgaWNpcmMgICImIzIzODsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGl1bWwgICAiJiMyMzk7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGV0aCAgICAiJiMyNDA7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZXRoLCBVKzAwRjAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG50aWxkZSAiJiMyNDE7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbiB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgb2dyYXZlICImIzI0MjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEYyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBvYWN1dGUgIiYjMjQzOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG9jaXJjICAiJiMyNDQ7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBvdGlsZGUgIiYjMjQ1OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG91bWwgICAiJiMyNDY7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGRpdmlkZSAiJiMyNDc7Ij4gPCEtLSBkaXZpc2lvbiBzaWduLCBVKzAwRjcgSVNPbnVtIC0tPgotPCFFTlRJVFkgb3NsYXNoICImIzI0ODsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggc3Ryb2tlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGV0dGVyIG8gc2xhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY4IElTT2xhdDEgLS0+Ci08IUVOVElUWSB1Z3JhdmUgIiYjMjQ5OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHVhY3V0ZSAiJiMyNTA7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgdWNpcmMgICImIzI1MTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHV1bWwgICAiJiMyNTI7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHlhY3V0ZSAiJiMyNTM7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgeSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGRCBJU09sYXQxIC0tPgotPCFFTlRJVFkgdGhvcm4gICImIzI1NDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB0aG9ybiB3aXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGRSBJU09sYXQxIC0tPgotPCFFTlRJVFkgeXVtbCAgICImIzI1NTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB5IHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGRiBJU09sYXQxIC0tPgotCi08IS0tIE1hdGhlbWF0aWNhbCwgR3JlZWsgYW5kIFN5bWJvbGljIGNoYXJhY3RlcnMgZm9yIEhUTUwgLS0+Ci0KLTwhLS0gQ2hhcmFjdGVyIGVudGl0eSBzZXQuIFR5cGljYWwgaW52b2NhdGlvbjoKLSAgICAgPCFFTlRJVFkgJSBIVE1Mc3ltYm9sIFBVQkxJQwotICAgICAgICAiLS8vVzNDLy9FTlRJVElFUyBTeW1ib2xzIGZvciBYSFRNTC8vRU4iCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sLXN5bWJvbC5lbnQiPgotICAgICAlSFRNTHN5bWJvbDsKLS0tPgotCi08IS0tIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODY6Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLQotPCEtLSBSZWxldmFudCBJU08gZW50aXR5IHNldCBpcyBnaXZlbiB1bmxlc3MgbmFtZXMgYXJlIG5ld2x5IGludHJvZHVjZWQuCi0gICAgIE5ldyBuYW1lcyAoaS5lLiwgbm90IGluIElTTyA4ODc5IGxpc3QpIGRvIG5vdCBjbGFzaCB3aXRoIGFueQotICAgICBleGlzdGluZyBJU08gODg3OSBlbnRpdHkgbmFtZXMuIElTTyAxMDY0NiBjaGFyYWN0ZXIgbnVtYmVycwotICAgICBhcmUgZ2l2ZW4gZm9yIGVhY2ggY2hhcmFjdGVyLCBpbiBoZXguIHZhbHVlcyBhcmUgZGVjaW1hbAotICAgICBjb252ZXJzaW9ucyBvZiB0aGUgSVNPIDEwNjQ2IHZhbHVlcyBhbmQgcmVmZXIgdG8gdGhlIGRvY3VtZW50Ci0gICAgIGNoYXJhY3RlciBzZXQuIE5hbWVzIGFyZSBVbmljb2RlIG5hbWVzLiAKLS0tPgotCi08IS0tIExhdGluIEV4dGVuZGVkLUIgLS0+Ci08IUVOVElUWSBmbm9mICAgICAiJiM0MDI7Ij4gPCEtLSBsYXRpbiBzbWFsbCBmIHdpdGggaG9vayA9IGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZsb3JpbiwgVSswMTkyIElTT3RlY2ggLS0+Ci0KLTwhLS0gR3JlZWsgLS0+Ci08IUVOVElUWSBBbHBoYSAgICAiJiM5MTM7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBhbHBoYSwgVSswMzkxIC0tPgotPCFFTlRJVFkgQmV0YSAgICAgIiYjOTE0OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgYmV0YSwgVSswMzkyIC0tPgotPCFFTlRJVFkgR2FtbWEgICAgIiYjOTE1OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZ2FtbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzOTMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIERlbHRhICAgICImIzkxNjsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGRlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMzk0IElTT2dyazMgLS0+Ci08IUVOVElUWSBFcHNpbG9uICAiJiM5MTc7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBlcHNpbG9uLCBVKzAzOTUgLS0+Ci08IUVOVElUWSBaZXRhICAgICAiJiM5MTg7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB6ZXRhLCBVKzAzOTYgLS0+Ci08IUVOVElUWSBFdGEgICAgICAiJiM5MTk7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBldGEsIFUrMDM5NyAtLT4KLTwhRU5USVRZIFRoZXRhICAgICImIzkyMDsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHRoZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMzk4IElTT2dyazMgLS0+Ci08IUVOVElUWSBJb3RhICAgICAiJiM5MjE7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBpb3RhLCBVKzAzOTkgLS0+Ci08IUVOVElUWSBLYXBwYSAgICAiJiM5MjI7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBrYXBwYSwgVSswMzlBIC0tPgotPCFFTlRJVFkgTGFtYmRhICAgIiYjOTIzOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbGFtYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMzlCIElTT2dyazMgLS0+Ci08IUVOVElUWSBNdSAgICAgICAiJiM5MjQ7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBtdSwgVSswMzlDIC0tPgotPCFFTlRJVFkgTnUgICAgICAgIiYjOTI1OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbnUsIFUrMDM5RCAtLT4KLTwhRU5USVRZIFhpICAgICAgICImIzkyNjsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHhpLCBVKzAzOUUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIE9taWNyb24gICImIzkyNzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG9taWNyb24sIFUrMDM5RiAtLT4KLTwhRU5USVRZIFBpICAgICAgICImIzkyODsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBpLCBVKzAzQTAgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIFJobyAgICAgICImIzkyOTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHJobywgVSswM0ExIC0tPgotPCEtLSB0aGVyZSBpcyBubyBTaWdtYWYsIGFuZCBubyBVKzAzQTIgY2hhcmFjdGVyIGVpdGhlciAtLT4KLTwhRU5USVRZIFNpZ21hICAgICImIzkzMTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHNpZ21hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0EzIElTT2dyazMgLS0+Ci08IUVOVElUWSBUYXUgICAgICAiJiM5MzI7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB0YXUsIFUrMDNBNCAtLT4KLTwhRU5USVRZIFVwc2lsb24gICImIzkzMzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHVwc2lsb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIFBoaSAgICAgICImIzkzNDsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBoaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBNiBJU09ncmszIC0tPgotPCFFTlRJVFkgQ2hpICAgICAgIiYjOTM1OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgY2hpLCBVKzAzQTcgLS0+Ci08IUVOVElUWSBQc2kgICAgICAiJiM5MzY7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBwc2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIE9tZWdhICAgICImIzkzNzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG9tZWdhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E5IElTT2dyazMgLS0+Ci0KLTwhRU5USVRZIGFscGhhICAgICImIzk0NTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBhbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCMSBJU09ncmszIC0tPgotPCFFTlRJVFkgYmV0YSAgICAgIiYjOTQ2OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGJldGEsIFUrMDNCMiBJU09ncmszIC0tPgotPCFFTlRJVFkgZ2FtbWEgICAgIiYjOTQ3OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGdhbW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0IzIElTT2dyazMgLS0+Ci08IUVOVElUWSBkZWx0YSAgICAiJiM5NDg7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGVwc2lsb24gICImIzk0OTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBlcHNpbG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0I1IElTT2dyazMgLS0+Ci08IUVOVElUWSB6ZXRhICAgICAiJiM5NTA7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgemV0YSwgVSswM0I2IElTT2dyazMgLS0+Ci08IUVOVElUWSBldGEgICAgICAiJiM5NTE7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZXRhLCBVKzAzQjcgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHRoZXRhICAgICImIzk1MjsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB0aGV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCOCBJU09ncmszIC0tPgotPCFFTlRJVFkgaW90YSAgICAgIiYjOTUzOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGlvdGEsIFUrMDNCOSBJU09ncmszIC0tPgotPCFFTlRJVFkga2FwcGEgICAgIiYjOTU0OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGthcHBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0JBIElTT2dyazMgLS0+Ci08IUVOVElUWSBsYW1iZGEgICAiJiM5NTU7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgbGFtYmRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0JCIElTT2dyazMgLS0+Ci08IUVOVElUWSBtdSAgICAgICAiJiM5NTY7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgbXUsIFUrMDNCQyBJU09ncmszIC0tPgotPCFFTlRJVFkgbnUgICAgICAgIiYjOTU3OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG51LCBVKzAzQkQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHhpICAgICAgICImIzk1ODsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB4aSwgVSswM0JFIElTT2dyazMgLS0+Ci08IUVOVElUWSBvbWljcm9uICAiJiM5NTk7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgb21pY3JvbiwgVSswM0JGIE5FVyAtLT4KLTwhRU5USVRZIHBpICAgICAgICImIzk2MDsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBwaSwgVSswM0MwIElTT2dyazMgLS0+Ci08IUVOVElUWSByaG8gICAgICAiJiM5NjE7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgcmhvLCBVKzAzQzEgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHNpZ21hZiAgICImIzk2MjsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBmaW5hbCBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDMiBJU09ncmszIC0tPgotPCFFTlRJVFkgc2lnbWEgICAgIiYjOTYzOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHNpZ21hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0MzIElTT2dyazMgLS0+Ci08IUVOVElUWSB0YXUgICAgICAiJiM5NjQ7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGF1LCBVKzAzQzQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHVwc2lsb24gICImIzk2NTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB1cHNpbG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0M1IElTT2dyazMgLS0+Ci08IUVOVElUWSBwaGkgICAgICAiJiM5NjY7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgcGhpLCBVKzAzQzYgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGNoaSAgICAgICImIzk2NzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBjaGksIFUrMDNDNyBJU09ncmszIC0tPgotPCFFTlRJVFkgcHNpICAgICAgIiYjOTY4OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHBzaSwgVSswM0M4IElTT2dyazMgLS0+Ci08IUVOVElUWSBvbWVnYSAgICAiJiM5Njk7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgb21lZ2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQzkgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHRoZXRhc3ltICImIzk3NzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB0aGV0YSBzeW1ib2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzRDEgTkVXIC0tPgotPCFFTlRJVFkgdXBzaWggICAgIiYjOTc4OyI+IDwhLS0gZ3JlZWsgdXBzaWxvbiB3aXRoIGhvb2sgc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0QyIE5FVyAtLT4KLTwhRU5USVRZIHBpdiAgICAgICImIzk4MjsiPiA8IS0tIGdyZWVrIHBpIHN5bWJvbCwgVSswM0Q2IElTT2dyazMgLS0+Ci0KLTwhLS0gR2VuZXJhbCBQdW5jdHVhdGlvbiAtLT4KLTwhRU5USVRZIGJ1bGwgICAgICImIzgyMjY7Ij4gPCEtLSBidWxsZXQgPSBibGFjayBzbWFsbCBjaXJjbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDIyIElTT3B1YiAgLS0+Ci08IS0tIGJ1bGxldCBpcyBOT1QgdGhlIHNhbWUgYXMgYnVsbGV0IG9wZXJhdG9yLCBVKzIyMTkgLS0+Ci08IUVOVElUWSBoZWxsaXAgICAiJiM4MjMwOyI+IDwhLS0gaG9yaXpvbnRhbCBlbGxpcHNpcyA9IHRocmVlIGRvdCBsZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDI2IElTT3B1YiAgLS0+Ci08IUVOVElUWSBwcmltZSAgICAiJiM4MjQyOyI+IDwhLS0gcHJpbWUgPSBtaW51dGVzID0gZmVldCwgVSsyMDMyIElTT3RlY2ggLS0+Ci08IUVOVElUWSBQcmltZSAgICAiJiM4MjQzOyI+IDwhLS0gZG91YmxlIHByaW1lID0gc2Vjb25kcyA9IGluY2hlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMzMgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9saW5lICAgICImIzgyNTQ7Ij4gPCEtLSBvdmVybGluZSA9IHNwYWNpbmcgb3ZlcnNjb3JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAzRSBORVcgLS0+Ci08IUVOVElUWSBmcmFzbCAgICAiJiM4MjYwOyI+IDwhLS0gZnJhY3Rpb24gc2xhc2gsIFUrMjA0NCBORVcgLS0+Ci0KLTwhLS0gTGV0dGVybGlrZSBTeW1ib2xzIC0tPgotPCFFTlRJVFkgd2VpZXJwICAgIiYjODQ3MjsiPiA8IS0tIHNjcmlwdCBjYXBpdGFsIFAgPSBwb3dlciBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFdlaWVyc3RyYXNzIHAsIFUrMjExOCBJU09hbXNvIC0tPgotPCFFTlRJVFkgaW1hZ2UgICAgIiYjODQ2NTsiPiA8IS0tIGJsYWNrbGV0dGVyIGNhcGl0YWwgSSA9IGltYWdpbmFyeSBwYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjExMSBJU09hbXNvIC0tPgotPCFFTlRJVFkgcmVhbCAgICAgIiYjODQ3NjsiPiA8IS0tIGJsYWNrbGV0dGVyIGNhcGl0YWwgUiA9IHJlYWwgcGFydCBzeW1ib2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMTFDIElTT2Ftc28gLS0+Ci08IUVOVElUWSB0cmFkZSAgICAiJiM4NDgyOyI+IDwhLS0gdHJhZGUgbWFyayBzaWduLCBVKzIxMjIgSVNPbnVtIC0tPgotPCFFTlRJVFkgYWxlZnN5bSAgIiYjODUwMTsiPiA8IS0tIGFsZWYgc3ltYm9sID0gZmlyc3QgdHJhbnNmaW5pdGUgY2FyZGluYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMTM1IE5FVyAtLT4KLTwhLS0gYWxlZiBzeW1ib2wgaXMgTk9UIHRoZSBzYW1lIGFzIGhlYnJldyBsZXR0ZXIgYWxlZiwKLSAgICAgVSswNUQwIGFsdGhvdWdoIHRoZSBzYW1lIGdseXBoIGNvdWxkIGJlIHVzZWQgdG8gZGVwaWN0IGJvdGggY2hhcmFjdGVycyAtLT4KLQotPCEtLSBBcnJvd3MgLS0+Ci08IUVOVElUWSBsYXJyICAgICAiJiM4NTkyOyI+IDwhLS0gbGVmdHdhcmRzIGFycm93LCBVKzIxOTAgSVNPbnVtIC0tPgotPCFFTlRJVFkgdWFyciAgICAgIiYjODU5MzsiPiA8IS0tIHVwd2FyZHMgYXJyb3csIFUrMjE5MSBJU09udW0tLT4KLTwhRU5USVRZIHJhcnIgICAgICImIzg1OTQ7Ij4gPCEtLSByaWdodHdhcmRzIGFycm93LCBVKzIxOTIgSVNPbnVtIC0tPgotPCFFTlRJVFkgZGFyciAgICAgIiYjODU5NTsiPiA8IS0tIGRvd253YXJkcyBhcnJvdywgVSsyMTkzIElTT251bSAtLT4KLTwhRU5USVRZIGhhcnIgICAgICImIzg1OTY7Ij4gPCEtLSBsZWZ0IHJpZ2h0IGFycm93LCBVKzIxOTQgSVNPYW1zYSAtLT4KLTwhRU5USVRZIGNyYXJyICAgICImIzg2Mjk7Ij4gPCEtLSBkb3dud2FyZHMgYXJyb3cgd2l0aCBjb3JuZXIgbGVmdHdhcmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjYXJyaWFnZSByZXR1cm4sIFUrMjFCNSBORVcgLS0+Ci08IUVOVElUWSBsQXJyICAgICAiJiM4NjU2OyI+IDwhLS0gbGVmdHdhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQwIElTT3RlY2ggLS0+Ci08IS0tIFVuaWNvZGUgZG9lcyBub3Qgc2F5IHRoYXQgbEFyciBpcyB0aGUgc2FtZSBhcyB0aGUgJ2lzIGltcGxpZWQgYnknIGFycm93Ci0gICAgYnV0IGFsc28gZG9lcyBub3QgaGF2ZSBhbnkgb3RoZXIgY2hhcmFjdGVyIGZvciB0aGF0IGZ1bmN0aW9uLiBTbyA/IGxBcnIgY2FuCi0gICAgYmUgdXNlZCBmb3IgJ2lzIGltcGxpZWQgYnknIGFzIElTT3RlY2ggc3VnZ2VzdHMgLS0+Ci08IUVOVElUWSB1QXJyICAgICAiJiM4NjU3OyI+IDwhLS0gdXB3YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMSBJU09hbXNhIC0tPgotPCFFTlRJVFkgckFyciAgICAgIiYjODY1ODsiPiA8IS0tIHJpZ2h0d2FyZHMgZG91YmxlIGFycm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjFEMiBJU090ZWNoIC0tPgotPCEtLSBVbmljb2RlIGRvZXMgbm90IHNheSB0aGlzIGlzIHRoZSAnaW1wbGllcycgY2hhcmFjdGVyIGJ1dCBkb2VzIG5vdCBoYXZlIAotICAgICBhbm90aGVyIGNoYXJhY3RlciB3aXRoIHRoaXMgZnVuY3Rpb24gc28gPwotICAgICByQXJyIGNhbiBiZSB1c2VkIGZvciAnaW1wbGllcycgYXMgSVNPdGVjaCBzdWdnZXN0cyAtLT4KLTwhRU5USVRZIGRBcnIgICAgICImIzg2NTk7Ij4gPCEtLSBkb3dud2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDMgSVNPYW1zYSAtLT4KLTwhRU5USVRZIGhBcnIgICAgICImIzg2NjA7Ij4gPCEtLSBsZWZ0IHJpZ2h0IGRvdWJsZSBhcnJvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxRDQgSVNPYW1zYSAtLT4KLQotPCEtLSBNYXRoZW1hdGljYWwgT3BlcmF0b3JzIC0tPgotPCFFTlRJVFkgZm9yYWxsICAgIiYjODcwNDsiPiA8IS0tIGZvciBhbGwsIFUrMjIwMCBJU090ZWNoIC0tPgotPCFFTlRJVFkgcGFydCAgICAgIiYjODcwNjsiPiA8IS0tIHBhcnRpYWwgZGlmZmVyZW50aWFsLCBVKzIyMDIgSVNPdGVjaCAgLS0+Ci08IUVOVElUWSBleGlzdCAgICAiJiM4NzA3OyI+IDwhLS0gdGhlcmUgZXhpc3RzLCBVKzIyMDMgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGVtcHR5ICAgICImIzg3MDk7Ij4gPCEtLSBlbXB0eSBzZXQgPSBudWxsIHNldCA9IGRpYW1ldGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIwNSBJU09hbXNvIC0tPgotPCFFTlRJVFkgbmFibGEgICAgIiYjODcxMTsiPiA8IS0tIG5hYmxhID0gYmFja3dhcmQgZGlmZmVyZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyMDcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGlzaW4gICAgICImIzg3MTI7Ij4gPCEtLSBlbGVtZW50IG9mLCBVKzIyMDggSVNPdGVjaCAtLT4KLTwhRU5USVRZIG5vdGluICAgICImIzg3MTM7Ij4gPCEtLSBub3QgYW4gZWxlbWVudCBvZiwgVSsyMjA5IElTT3RlY2ggLS0+Ci08IUVOVElUWSBuaSAgICAgICAiJiM4NzE1OyI+IDwhLS0gY29udGFpbnMgYXMgbWVtYmVyLCBVKzIyMEIgSVNPdGVjaCAtLT4KLTwhLS0gc2hvdWxkIHRoZXJlIGJlIGEgbW9yZSBtZW1vcmFibGUgbmFtZSB0aGFuICduaSc/IC0tPgotPCFFTlRJVFkgcHJvZCAgICAgIiYjODcxOTsiPiA8IS0tIG4tYXJ5IHByb2R1Y3QgPSBwcm9kdWN0IHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjBGIElTT2Ftc2IgLS0+Ci08IS0tIHByb2QgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAzQTAgJ2dyZWVrIGNhcGl0YWwgbGV0dGVyIHBpJyB0aG91Z2gKLSAgICAgdGhlIHNhbWUgZ2x5cGggbWlnaHQgYmUgdXNlZCBmb3IgYm90aCAtLT4KLTwhRU5USVRZIHN1bSAgICAgICImIzg3MjE7Ij4gPCEtLSBuLWFyeSBzdW1hdGlvbiwgVSsyMjExIElTT2Ftc2IgLS0+Ci08IS0tIHN1bSBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDNBMyAnZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgc2lnbWEnCi0gICAgIHRob3VnaCB0aGUgc2FtZSBnbHlwaCBtaWdodCBiZSB1c2VkIGZvciBib3RoIC0tPgotPCFFTlRJVFkgbWludXMgICAgIiYjODcyMjsiPiA8IS0tIG1pbnVzIHNpZ24sIFUrMjIxMiBJU090ZWNoIC0tPgotPCFFTlRJVFkgbG93YXN0ICAgIiYjODcyNzsiPiA8IS0tIGFzdGVyaXNrIG9wZXJhdG9yLCBVKzIyMTcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHJhZGljICAgICImIzg3MzA7Ij4gPCEtLSBzcXVhcmUgcm9vdCA9IHJhZGljYWwgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyMUEgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHByb3AgICAgICImIzg3MzM7Ij4gPCEtLSBwcm9wb3J0aW9uYWwgdG8sIFUrMjIxRCBJU090ZWNoIC0tPgotPCFFTlRJVFkgaW5maW4gICAgIiYjODczNDsiPiA8IS0tIGluZmluaXR5LCBVKzIyMUUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGFuZyAgICAgICImIzg3MzY7Ij4gPCEtLSBhbmdsZSwgVSsyMjIwIElTT2Ftc28gLS0+Ci08IUVOVElUWSBhbmQgICAgICAiJiM4NzQzOyI+IDwhLS0gbG9naWNhbCBhbmQgPSB3ZWRnZSwgVSsyMjI3IElTT3RlY2ggLS0+Ci08IUVOVElUWSBvciAgICAgICAiJiM4NzQ0OyI+IDwhLS0gbG9naWNhbCBvciA9IHZlZSwgVSsyMjI4IElTT3RlY2ggLS0+Ci08IUVOVElUWSBjYXAgICAgICAiJiM4NzQ1OyI+IDwhLS0gaW50ZXJzZWN0aW9uID0gY2FwLCBVKzIyMjkgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGN1cCAgICAgICImIzg3NDY7Ij4gPCEtLSB1bmlvbiA9IGN1cCwgVSsyMjJBIElTT3RlY2ggLS0+Ci08IUVOVElUWSBpbnQgICAgICAiJiM4NzQ3OyI+IDwhLS0gaW50ZWdyYWwsIFUrMjIyQiBJU090ZWNoIC0tPgotPCFFTlRJVFkgdGhlcmU0ICAgIiYjODc1NjsiPiA8IS0tIHRoZXJlZm9yZSwgVSsyMjM0IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzaW0gICAgICAiJiM4NzY0OyI+IDwhLS0gdGlsZGUgb3BlcmF0b3IgPSB2YXJpZXMgd2l0aCA9IHNpbWlsYXIgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjNDIElTT3RlY2ggLS0+Ci08IS0tIHRpbGRlIG9wZXJhdG9yIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgdGhlIHRpbGRlLCBVKzAwN0UsCi0gICAgIGFsdGhvdWdoIHRoZSBzYW1lIGdseXBoIG1pZ2h0IGJlIHVzZWQgdG8gcmVwcmVzZW50IGJvdGggIC0tPgotPCFFTlRJVFkgY29uZyAgICAgIiYjODc3MzsiPiA8IS0tIGFwcHJveGltYXRlbHkgZXF1YWwgdG8sIFUrMjI0NSBJU090ZWNoIC0tPgotPCFFTlRJVFkgYXN5bXAgICAgIiYjODc3NjsiPiA8IS0tIGFsbW9zdCBlcXVhbCB0byA9IGFzeW1wdG90aWMgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjQ4IElTT2Ftc3IgLS0+Ci08IUVOVElUWSBuZSAgICAgICAiJiM4ODAwOyI+IDwhLS0gbm90IGVxdWFsIHRvLCBVKzIyNjAgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGVxdWl2ICAgICImIzg4MDE7Ij4gPCEtLSBpZGVudGljYWwgdG8sIFUrMjI2MSBJU090ZWNoIC0tPgotPCFFTlRJVFkgbGUgICAgICAgIiYjODgwNDsiPiA8IS0tIGxlc3MtdGhhbiBvciBlcXVhbCB0bywgVSsyMjY0IElTT3RlY2ggLS0+Ci08IUVOVElUWSBnZSAgICAgICAiJiM4ODA1OyI+IDwhLS0gZ3JlYXRlci10aGFuIG9yIGVxdWFsIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI2NSBJU090ZWNoIC0tPgotPCFFTlRJVFkgc3ViICAgICAgIiYjODgzNDsiPiA8IS0tIHN1YnNldCBvZiwgVSsyMjgyIElTT3RlY2ggLS0+Ci08IUVOVElUWSBzdXAgICAgICAiJiM4ODM1OyI+IDwhLS0gc3VwZXJzZXQgb2YsIFUrMjI4MyBJU090ZWNoIC0tPgotPCEtLSBub3RlIHRoYXQgbnN1cCwgJ25vdCBhIHN1cGVyc2V0IG9mLCBVKzIyODMnIGlzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBTeW1ib2wgCi0gICAgIGZvbnQgZW5jb2RpbmcgYW5kIGlzIG5vdCBpbmNsdWRlZC4gU2hvdWxkIGl0IGJlLCBmb3Igc3ltbWV0cnk/Ci0gICAgIEl0IGlzIGluIElTT2Ftc24gIC0tPiAKLTwhRU5USVRZIG5zdWIgICAgICImIzg4MzY7Ij4gPCEtLSBub3QgYSBzdWJzZXQgb2YsIFUrMjI4NCBJU09hbXNuIC0tPgotPCFFTlRJVFkgc3ViZSAgICAgIiYjODgzODsiPiA8IS0tIHN1YnNldCBvZiBvciBlcXVhbCB0bywgVSsyMjg2IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzdXBlICAgICAiJiM4ODM5OyI+IDwhLS0gc3VwZXJzZXQgb2Ygb3IgZXF1YWwgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjg3IElTT3RlY2ggLS0+Ci08IUVOVElUWSBvcGx1cyAgICAiJiM4ODUzOyI+IDwhLS0gY2lyY2xlZCBwbHVzID0gZGlyZWN0IHN1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyOTUgSVNPYW1zYiAtLT4KLTwhRU5USVRZIG90aW1lcyAgICImIzg4NTU7Ij4gPCEtLSBjaXJjbGVkIHRpbWVzID0gdmVjdG9yIHByb2R1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjk3IElTT2Ftc2IgLS0+Ci08IUVOVElUWSBwZXJwICAgICAiJiM4ODY5OyI+IDwhLS0gdXAgdGFjayA9IG9ydGhvZ29uYWwgdG8gPSBwZXJwZW5kaWN1bGFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjJBNSBJU090ZWNoIC0tPgotPCFFTlRJVFkgc2RvdCAgICAgIiYjODkwMTsiPiA8IS0tIGRvdCBvcGVyYXRvciwgVSsyMkM1IElTT2Ftc2IgLS0+Ci08IS0tIGRvdCBvcGVyYXRvciBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDBCNyBtaWRkbGUgZG90IC0tPgotCi08IS0tIE1pc2NlbGxhbmVvdXMgVGVjaG5pY2FsIC0tPgotPCFFTlRJVFkgbGNlaWwgICAgIiYjODk2ODsiPiA8IS0tIGxlZnQgY2VpbGluZyA9IGFwbCB1cHN0aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjMwOCBJU09hbXNjICAtLT4KLTwhRU5USVRZIHJjZWlsICAgICImIzg5Njk7Ij4gPCEtLSByaWdodCBjZWlsaW5nLCBVKzIzMDkgSVNPYW1zYyAgLS0+Ci08IUVOVElUWSBsZmxvb3IgICAiJiM4OTcwOyI+IDwhLS0gbGVmdCBmbG9vciA9IGFwbCBkb3duc3RpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzBBIElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgcmZsb29yICAgIiYjODk3MTsiPiA8IS0tIHJpZ2h0IGZsb29yLCBVKzIzMEIgSVNPYW1zYyAgLS0+Ci08IUVOVElUWSBsYW5nICAgICAiJiM5MDAxOyI+IDwhLS0gbGVmdC1wb2ludGluZyBhbmdsZSBicmFja2V0ID0gYnJhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjMyOSBJU090ZWNoIC0tPgotPCEtLSBsYW5nIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMDNDICdsZXNzIHRoYW4nIAotICAgICBvciBVKzIwMzkgJ3NpbmdsZSBsZWZ0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrJyAtLT4KLTwhRU5USVRZIHJhbmcgICAgICImIzkwMDI7Ij4gPCEtLSByaWdodC1wb2ludGluZyBhbmdsZSBicmFja2V0ID0ga2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjMyQSBJU090ZWNoIC0tPgotPCEtLSByYW5nIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMDNFICdncmVhdGVyIHRoYW4nIAotICAgICBvciBVKzIwM0EgJ3NpbmdsZSByaWdodC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaycgLS0+Ci0KLTwhLS0gR2VvbWV0cmljIFNoYXBlcyAtLT4KLTwhRU5USVRZIGxveiAgICAgICImIzk2NzQ7Ij4gPCEtLSBsb3plbmdlLCBVKzI1Q0EgSVNPcHViIC0tPgotCi08IS0tIE1pc2NlbGxhbmVvdXMgU3ltYm9scyAtLT4KLTwhRU5USVRZIHNwYWRlcyAgICImIzk4MjQ7Ij4gPCEtLSBibGFjayBzcGFkZSBzdWl0LCBVKzI2NjAgSVNPcHViIC0tPgotPCEtLSBibGFjayBoZXJlIHNlZW1zIHRvIG1lYW4gZmlsbGVkIGFzIG9wcG9zZWQgdG8gaG9sbG93IC0tPgotPCFFTlRJVFkgY2x1YnMgICAgIiYjOTgyNzsiPiA8IS0tIGJsYWNrIGNsdWIgc3VpdCA9IHNoYW1yb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjY2MyBJU09wdWIgLS0+Ci08IUVOVElUWSBoZWFydHMgICAiJiM5ODI5OyI+IDwhLS0gYmxhY2sgaGVhcnQgc3VpdCA9IHZhbGVudGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzI2NjUgSVNPcHViIC0tPgotPCFFTlRJVFkgZGlhbXMgICAgIiYjOTgzMDsiPiA8IS0tIGJsYWNrIGRpYW1vbmQgc3VpdCwgVSsyNjY2IElTT3B1YiAtLT4KLQotPCEtLSBTcGVjaWFsIGNoYXJhY3RlcnMgZm9yIEhUTUwgLS0+Ci0KLTwhLS0gQ2hhcmFjdGVyIGVudGl0eSBzZXQuIFR5cGljYWwgaW52b2NhdGlvbjoKLSAgICAgPCFFTlRJVFkgJSBIVE1Mc3BlY2lhbCBQVUJMSUMKLSAgICAgICAgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbCBmb3IgWEhUTUwvL0VOIgotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1zcGVjaWFsLmVudCI+Ci0gICAgICVIVE1Mc3BlY2lhbDsKLS0tPgotCi08IS0tIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODY6Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLQotPCEtLSBSZWxldmFudCBJU08gZW50aXR5IHNldCBpcyBnaXZlbiB1bmxlc3MgbmFtZXMgYXJlIG5ld2x5IGludHJvZHVjZWQuCi0gICAgIE5ldyBuYW1lcyAoaS5lLiwgbm90IGluIElTTyA4ODc5IGxpc3QpIGRvIG5vdCBjbGFzaCB3aXRoIGFueQotICAgICBleGlzdGluZyBJU08gODg3OSBlbnRpdHkgbmFtZXMuIElTTyAxMDY0NiBjaGFyYWN0ZXIgbnVtYmVycwotICAgICBhcmUgZ2l2ZW4gZm9yIGVhY2ggY2hhcmFjdGVyLCBpbiBoZXguIHZhbHVlcyBhcmUgZGVjaW1hbAotICAgICBjb252ZXJzaW9ucyBvZiB0aGUgSVNPIDEwNjQ2IHZhbHVlcyBhbmQgcmVmZXIgdG8gdGhlIGRvY3VtZW50Ci0gICAgIGNoYXJhY3RlciBzZXQuIE5hbWVzIGFyZSBVbmljb2RlIG5hbWVzLiAKLS0tPgotCi08IS0tIEMwIENvbnRyb2xzIGFuZCBCYXNpYyBMYXRpbiAtLT4KLTwhRU5USVRZIHF1b3QgICAgIiYjMzQ7Ij4gPCEtLSAgcXVvdGF0aW9uIG1hcmsgPSBBUEwgcXVvdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwMjIgSVNPbnVtIC0tPgotPCFFTlRJVFkgYW1wICAgICAiJiMzODsjMzg7Ij4gPCEtLSAgYW1wZXJzYW5kLCBVKzAwMjYgSVNPbnVtIC0tPgotPCFFTlRJVFkgbHQgICAgICAiJiMzODsjNjA7Ij4gPCEtLSAgbGVzcy10aGFuIHNpZ24sIFUrMDAzQyBJU09udW0gLS0+Ci08IUVOVElUWSBndCAgICAgICImIzYyOyI+IDwhLS0gIGdyZWF0ZXItdGhhbiBzaWduLCBVKzAwM0UgSVNPbnVtIC0tPgotPCFFTlRJVFkgYXBvcwkgIiYjMzk7Ij4gPCEtLSAgYXBvc3Ryb3BoZSBtYXJrLCBVKzAwMjcgSVNPbnVtIC0tPgotCi08IS0tIExhdGluIEV4dGVuZGVkLUEgLS0+Ci08IUVOVElUWSBPRWxpZyAgICImIzMzODsiPiA8IS0tICBsYXRpbiBjYXBpdGFsIGxpZ2F0dXJlIE9FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMTUyIElTT2xhdDIgLS0+Ci08IUVOVElUWSBvZWxpZyAgICImIzMzOTsiPiA8IS0tICBsYXRpbiBzbWFsbCBsaWdhdHVyZSBvZSwgVSswMTUzIElTT2xhdDIgLS0+Ci08IS0tIGxpZ2F0dXJlIGlzIGEgbWlzbm9tZXIsIHRoaXMgaXMgYSBzZXBhcmF0ZSBjaGFyYWN0ZXIgaW4gc29tZSBsYW5ndWFnZXMgLS0+Ci08IUVOVElUWSBTY2Fyb24gICImIzM1MjsiPiA8IS0tICBsYXRpbiBjYXBpdGFsIGxldHRlciBTIHdpdGggY2Fyb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNjAgSVNPbGF0MiAtLT4KLTwhRU5USVRZIHNjYXJvbiAgIiYjMzUzOyI+IDwhLS0gIGxhdGluIHNtYWxsIGxldHRlciBzIHdpdGggY2Fyb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNjEgSVNPbGF0MiAtLT4KLTwhRU5USVRZIFl1bWwgICAgIiYjMzc2OyI+IDwhLS0gIGxhdGluIGNhcGl0YWwgbGV0dGVyIFkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNzggSVNPbGF0MiAtLT4KLQotPCEtLSBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMgLS0+Ci08IUVOVElUWSBjaXJjICAgICImIzcxMDsiPiA8IS0tICBtb2RpZmllciBsZXR0ZXIgY2lyY3VtZmxleCBhY2NlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAyQzYgSVNPcHViIC0tPgotPCFFTlRJVFkgdGlsZGUgICAiJiM3MzI7Ij4gPCEtLSAgc21hbGwgdGlsZGUsIFUrMDJEQyBJU09kaWEgLS0+Ci0KLTwhLS0gR2VuZXJhbCBQdW5jdHVhdGlvbiAtLT4KLTwhRU5USVRZIGVuc3AgICAgIiYjODE5NDsiPiA8IS0tIGVuIHNwYWNlLCBVKzIwMDIgSVNPcHViIC0tPgotPCFFTlRJVFkgZW1zcCAgICAiJiM4MTk1OyI+IDwhLS0gZW0gc3BhY2UsIFUrMjAwMyBJU09wdWIgLS0+Ci08IUVOVElUWSB0aGluc3AgICImIzgyMDE7Ij4gPCEtLSB0aGluIHNwYWNlLCBVKzIwMDkgSVNPcHViIC0tPgotPCFFTlRJVFkgenduaiAgICAiJiM4MjA0OyI+IDwhLS0gemVybyB3aWR0aCBub24tam9pbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDBDIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIHp3aiAgICAgIiYjODIwNTsiPiA8IS0tIHplcm8gd2lkdGggam9pbmVyLCBVKzIwMEQgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgbHJtICAgICAiJiM4MjA2OyI+IDwhLS0gbGVmdC10by1yaWdodCBtYXJrLCBVKzIwMEUgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgcmxtICAgICAiJiM4MjA3OyI+IDwhLS0gcmlnaHQtdG8tbGVmdCBtYXJrLCBVKzIwMEYgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgbmRhc2ggICAiJiM4MjExOyI+IDwhLS0gZW4gZGFzaCwgVSsyMDEzIElTT3B1YiAtLT4KLTwhRU5USVRZIG1kYXNoICAgIiYjODIxMjsiPiA8IS0tIGVtIGRhc2gsIFUrMjAxNCBJU09wdWIgLS0+Ci08IUVOVElUWSBsc3F1byAgICImIzgyMTY7Ij4gPCEtLSBsZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxOCBJU09udW0gLS0+Ci08IUVOVElUWSByc3F1byAgICImIzgyMTc7Ij4gPCEtLSByaWdodCBzaW5nbGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMTkgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2JxdW8gICAiJiM4MjE4OyI+IDwhLS0gc2luZ2xlIGxvdy05IHF1b3RhdGlvbiBtYXJrLCBVKzIwMUEgTkVXIC0tPgotPCFFTlRJVFkgbGRxdW8gICAiJiM4MjIwOyI+IDwhLS0gbGVmdCBkb3VibGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMUMgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmRxdW8gICAiJiM4MjIxOyI+IDwhLS0gcmlnaHQgZG91YmxlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDFEIElTT251bSAtLT4KLTwhRU5USVRZIGJkcXVvICAgIiYjODIyMjsiPiA8IS0tIGRvdWJsZSBsb3ctOSBxdW90YXRpb24gbWFyaywgVSsyMDFFIE5FVyAtLT4KLTwhRU5USVRZIGRhZ2dlciAgIiYjODIyNDsiPiA8IS0tIGRhZ2dlciwgVSsyMDIwIElTT3B1YiAtLT4KLTwhRU5USVRZIERhZ2dlciAgIiYjODIyNTsiPiA8IS0tIGRvdWJsZSBkYWdnZXIsIFUrMjAyMSBJU09wdWIgLS0+Ci08IUVOVElUWSBwZXJtaWwgICImIzgyNDA7Ij4gPCEtLSBwZXIgbWlsbGUgc2lnbiwgVSsyMDMwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsc2FxdW8gICImIzgyNDk7Ij4gPCEtLSBzaW5nbGUgbGVmdC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAzOSBJU08gcHJvcG9zZWQgLS0+Ci08IS0tIGxzYXF1byBpcyBwcm9wb3NlZCBidXQgbm90IHlldCBJU08gc3RhbmRhcmRpemVkIC0tPgotPCFFTlRJVFkgcnNhcXVvICAiJiM4MjUwOyI+IDwhLS0gc2luZ2xlIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDNBIElTTyBwcm9wb3NlZCAtLT4KLTwhLS0gcnNhcXVvIGlzIHByb3Bvc2VkIGJ1dCBub3QgeWV0IElTTyBzdGFuZGFyZGl6ZWQgLS0+Ci08IUVOVElUWSBldXJvICAgIiYjODM2NDsiPiA8IS0tICBldXJvIHNpZ24sIFUrMjBBQyBORVcgLS0+Ci0KLQotPCEtLSBlbmQgb2YgeGh0bWwtY2hhcmVudC0xLm1vZCAtLT4KLV1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1mcmFtZXdvcmstMS5tb2QgLS0+Ci0KLQotPCFFTlRJVFkgJSBwcmUuY29udGVudAotICAgICAiKCAjUENEQVRBCi0gICAgICB8ICVJbmxTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlSW5sUGhyYXMuY2xhc3M7Ci0gICAgICAlQW5jaG9yLmNsYXNzOwotICAgICAgJUlubGluZS5leHRyYTsgKSoiCi0+Ci0KLTwhRU5USVRZICUgeGh0bWwtdGV4dC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFRleHQgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC10ZXh0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFRleHQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXRleHQtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgVGV4dCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLXRleHQtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gVGV4dHVhbCBDb250ZW50Ci0KLSAgICAgVGhlIFRleHQgbW9kdWxlIGluY2x1ZGVzIGRlY2xhcmF0aW9ucyBmb3IgYWxsIGNvcmUgCi0gICAgIHRleHQgY29udGFpbmVyIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzLgotLS0+Ci0KLTwhRU5USVRZICUgeGh0bWwtaW5sc3RydWN0Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWlubHN0cnVjdC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1pbmxzdHJ1Y3QubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbmxpbmUgU3RydWN0dXJhbCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWlubHN0cnVjdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBJbmxpbmUgU3RydWN0dXJhbCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1pbmxzdHJ1Y3QtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFN0cnVjdHVyYWwgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1pbmxzdHJ1Y3QtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSW5saW5lIFN0cnVjdHVyYWwKLQotICAgICAgICBiciwgc3BhbgotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAKLSAgICAgdXNlZCB0byBzdXBwb3J0IGlubGluZS1sZXZlbCBzdHJ1Y3R1cmFsIG1hcmt1cC4KLS0tPgotCi08IS0tIGJyOiBmb3JjZWQgbGluZSBicmVhayAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBici5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWJyLmVsZW1lbnQ7WwotCi08IUVOVElUWSAlIGJyLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBici5xbmFtZSAgImJyIiA+Ci08IUVMRU1FTlQgJWJyLnFuYW1lOyAgJWJyLmNvbnRlbnQ7ID4KLQotPCEtLSBlbmQgb2YgYnIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBici5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVici5xbmFtZTsKLSAgICAgICVDb3JlLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGJyLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gc3BhbjogZ2VuZXJpYyBpbmxpbmUgY29udGFpbmVyIC4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHNwYW4uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzcGFuLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzcGFuLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc3Bhbi5xbmFtZSAgInNwYW4iID4KLTwhRUxFTUVOVCAlc3Bhbi5xbmFtZTsgICVzcGFuLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHNwYW4uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzcGFuLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc3Bhbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc3Bhbi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygc3Bhbi5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1pbmxzdHJ1Y3QtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1pbmxwaHJhcy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1pbmxwaHJhcy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1pbmxwaHJhcy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBQaHJhc2FsIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtaW5scGhyYXMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSW5saW5lIFBocmFzYWwgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaW5scGhyYXMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFBocmFzYWwgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1pbmxwaHJhcy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbmxpbmUgUGhyYXNhbAotCi0gICAgICAgIGFiYnIsIGFjcm9ueW0sIGNpdGUsIGNvZGUsIGRmbiwgZW0sIGtiZCwgcSwgc2FtcCwgc3Ryb25nLCB2YXIKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgdXNlZCB0bwotICAgICBzdXBwb3J0IGlubGluZS1sZXZlbCBwaHJhc2FsIG1hcmt1cC4KLS0tPgotCi08IUVOVElUWSAlIGFiYnIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVhYmJyLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBhYmJyLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYWJici5xbmFtZSAgImFiYnIiID4KLTwhRUxFTUVOVCAlYWJici5xbmFtZTsgICVhYmJyLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGFiYnIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhYmJyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYWJici5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYWJici5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYWJici5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGFjcm9ueW0uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVhY3JvbnltLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBhY3JvbnltLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYWNyb255bS5xbmFtZSAgImFjcm9ueW0iID4KLTwhRUxFTUVOVCAlYWNyb255bS5xbmFtZTsgICVhY3JvbnltLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGFjcm9ueW0uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhY3JvbnltLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYWNyb255bS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYWNyb255bS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYWNyb255bS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGNpdGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVjaXRlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBjaXRlLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgY2l0ZS5xbmFtZSAgImNpdGUiID4KLTwhRUxFTUVOVCAlY2l0ZS5xbmFtZTsgICVjaXRlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGNpdGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjaXRlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslY2l0ZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlY2l0ZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgY2l0ZS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGNvZGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVjb2RlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBjb2RlLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgY29kZS5xbmFtZSAgImNvZGUiID4KLTwhRUxFTUVOVCAlY29kZS5xbmFtZTsgICVjb2RlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGNvZGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjb2RlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslY29kZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlY29kZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgY29kZS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGRmbi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWRmbi5lbGVtZW50O1sKLTwhRU5USVRZICUgZGZuLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgZGZuLnFuYW1lICAiZGZuIiA+Ci08IUVMRU1FTlQgJWRmbi5xbmFtZTsgICVkZm4uY29udGVudDsgPgotPCEtLSBlbmQgb2YgZGZuLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZGZuLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZGZuLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVkZm4ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGRmbi5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGVtLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZW0uZWxlbWVudDtbCi08IUVOVElUWSAlIGVtLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgZW0ucW5hbWUgICJlbSIgPgotPCFFTEVNRU5UICVlbS5xbmFtZTsgICVlbS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBlbS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGVtLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZW0uYXR0bGlzdDtbCi08IUFUVExJU1QgJWVtLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBlbS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGtiZC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWtiZC5lbGVtZW50O1sKLTwhRU5USVRZICUga2JkLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUga2JkLnFuYW1lICAia2JkIiA+Ci08IUVMRU1FTlQgJWtiZC5xbmFtZTsgICVrYmQuY29udGVudDsgPgotPCEtLSBlbmQgb2Yga2JkLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUga2JkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsla2JkLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVrYmQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGtiZC5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHEuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVxLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBxLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgcS5xbmFtZSAgInEiID4KLTwhRUxFTUVOVCAlcS5xbmFtZTsgICVxLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBxLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslcS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgY2l0ZSAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgcS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHNhbXAuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzYW1wLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzYW1wLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc2FtcC5xbmFtZSAgInNhbXAiID4KLTwhRUxFTUVOVCAlc2FtcC5xbmFtZTsgICVzYW1wLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHNhbXAuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzYW1wLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc2FtcC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc2FtcC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygc2FtcC5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHN0cm9uZy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXN0cm9uZy5lbGVtZW50O1sKLTwhRU5USVRZICUgc3Ryb25nLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc3Ryb25nLnFuYW1lICAic3Ryb25nIiA+Ci08IUVMRU1FTlQgJXN0cm9uZy5xbmFtZTsgICVzdHJvbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc3Ryb25nLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3Ryb25nLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc3Ryb25nLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzdHJvbmcucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHN0cm9uZy5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHZhci5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXZhci5lbGVtZW50O1sKLTwhRU5USVRZICUgdmFyLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgdmFyLnFuYW1lICAidmFyIiA+Ci08IUVMRU1FTlQgJXZhci5xbmFtZTsgICV2YXIuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdmFyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdmFyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldmFyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV2YXIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHZhci5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1pbmxwaHJhcy0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWJsa3N0cnVjdC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1ibGtzdHJ1Y3QubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtYmxrc3RydWN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgU3RydWN0dXJhbCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWJsa3N0cnVjdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCbG9jayBTdHJ1Y3R1cmFsIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1ibGtzdHJ1Y3QtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgU3RydWN0dXJhbCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLWJsa3N0cnVjdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBCbG9jayBTdHJ1Y3R1cmFsCi0KLSAgICAgICAgZGl2LCBwCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIHVzZWQgdG8KLSAgICAgc3VwcG9ydCBibG9jay1sZXZlbCBzdHJ1Y3R1cmFsIG1hcmt1cC4KLS0tPgotCi08IUVOVElUWSAlIGRpdi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWRpdi5lbGVtZW50O1sKLTwhRU5USVRZICUgZGl2LmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Lm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGRpdi5xbmFtZSAgImRpdiIgPgotPCFFTEVNRU5UICVkaXYucW5hbWU7ICAlZGl2LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGRpdi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGRpdi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWRpdi5hdHRsaXN0O1sKLTwhLS0gZW5kIG9mIGRpdi5hdHRsaXN0IC0tPl1dPgotPCFBVFRMSVNUICVkaXYucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLQotPCFFTlRJVFkgJSBwLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslcC5lbGVtZW50O1sKLTwhRU5USVRZICUgcC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiID4KLTwhRU5USVRZICUgcC5xbmFtZSAgInAiID4KLTwhRUxFTUVOVCAlcC5xbmFtZTsgICVwLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHAuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBwLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslcC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgcC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1ibGtzdHJ1Y3QtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1ibGtwaHJhcy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1ibGtwaHJhcy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1ibGtwaHJhcy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJsb2NrIFBocmFzYWwgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1ibGtwaHJhcy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCbG9jayBQaHJhc2FsIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1ibGtwaHJhcy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCbG9jayBQaHJhc2FsIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtYmxrcGhyYXMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQmxvY2sgUGhyYXNhbAotCi0gICAgICAgIGFkZHJlc3MsIGJsb2NrcXVvdGUsIHByZSwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNgotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyB1c2VkIHRvCi0gICAgIHN1cHBvcnQgYmxvY2stbGV2ZWwgcGhyYXNhbCBtYXJrdXAuCi0tLT4KLQotPCFFTlRJVFkgJSBhZGRyZXNzLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYWRkcmVzcy5lbGVtZW50O1sKLTwhRU5USVRZICUgYWRkcmVzcy5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiID4KLTwhRU5USVRZICUgYWRkcmVzcy5xbmFtZSAgImFkZHJlc3MiID4KLTwhRUxFTUVOVCAlYWRkcmVzcy5xbmFtZTsgICVhZGRyZXNzLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGFkZHJlc3MuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhZGRyZXNzLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYWRkcmVzcy5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYWRkcmVzcy5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYWRkcmVzcy5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGJsb2NrcXVvdGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVibG9ja3F1b3RlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBibG9ja3F1b3RlLmNvbnRlbnQKLSAgICAgIiggJUJsb2NrLm1peDsgKSsiCi0+Ci08IUVOVElUWSAlIGJsb2NrcXVvdGUucW5hbWUgICJibG9ja3F1b3RlIiA+Ci08IUVMRU1FTlQgJWJsb2NrcXVvdGUucW5hbWU7ICAlYmxvY2txdW90ZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBibG9ja3F1b3RlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYmxvY2txdW90ZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJsb2NrcXVvdGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJWJsb2NrcXVvdGUucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGNpdGUgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGJsb2NrcXVvdGUuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBwcmUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVwcmUuZWxlbWVudDtbCi08IUVOVElUWSAlIHByZS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgCi0gICAgICB8ICVJbmxTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlSW5sUGhyYXMuY2xhc3M7Ci0gICAgICB8ICV0dC5xbmFtZTsgfCAlaS5xbmFtZTsgfCAlYi5xbmFtZTsKLSAgICAgICVJMThuLmNsYXNzOwotICAgICAgJUFuY2hvci5jbGFzczsKLSAgICAgIHwgJXNjcmlwdC5xbmFtZTsgfCAlbWFwLnFuYW1lOwotICAgICAgJUlubGluZS5leHRyYTsgKSoiCi0+Ci08IUVOVElUWSAlIHByZS5xbmFtZSAgInByZSIgPgotPCFFTEVNRU5UICVwcmUucW5hbWU7ICAlcHJlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHByZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHByZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXByZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcHJlLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICB4bWw6c3BhY2UgICAgKCBwcmVzZXJ2ZSApICAgICAgICAgICAgICNGSVhFRCAncHJlc2VydmUnCi0+Ci08IS0tIGVuZCBvZiBwcmUuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uICBIZWFkaW5nIEVsZW1lbnRzICAuLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIEhlYWRpbmcuY29udGVudCAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIgPgotCi08IUVOVElUWSAlIGgxLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDEuZWxlbWVudDtbCi08IUVOVElUWSAlIGgxLnFuYW1lICAiaDEiID4KLTwhRUxFTUVOVCAlaDEucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoMS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGgxLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDEuYXR0bGlzdDtbCi08IUFUVExJU1QgJWgxLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoMS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGgyLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDIuZWxlbWVudDtbCi08IUVOVElUWSAlIGgyLnFuYW1lICAiaDIiID4KLTwhRUxFTUVOVCAlaDIucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoMi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGgyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDIuYXR0bGlzdDtbCi08IUFUVExJU1QgJWgyLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoMi5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGgzLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDMuZWxlbWVudDtbCi08IUVOVElUWSAlIGgzLnFuYW1lICAiaDMiID4KLTwhRUxFTUVOVCAlaDMucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoMy5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGgzLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDMuYXR0bGlzdDtbCi08IUFUVExJU1QgJWgzLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoMy5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGg0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDQuZWxlbWVudDtbCi08IUVOVElUWSAlIGg0LnFuYW1lICAiaDQiID4KLTwhRUxFTUVOVCAlaDQucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoNC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGg0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDQuYXR0bGlzdDtbCi08IUFUVExJU1QgJWg0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoNC5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGg1LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDUuZWxlbWVudDtbCi08IUVOVElUWSAlIGg1LnFuYW1lICAiaDUiID4KLTwhRUxFTUVOVCAlaDUucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoNS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGg1LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDUuYXR0bGlzdDtbCi08IUFUVExJU1QgJWg1LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoNS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGg2LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaDYuZWxlbWVudDtbCi08IUVOVElUWSAlIGg2LnFuYW1lICAiaDYiID4KLTwhRUxFTUVOVCAlaDYucW5hbWU7ICAlSGVhZGluZy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoNi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGg2LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaDYuYXR0bGlzdDtbCi08IUFUVExJU1QgJWg2LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoNi5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1ibGtwaHJhcy0xLm1vZCAtLT4KLV1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC10ZXh0LTEubW9kIC0tPgotCi0KLTwhRU5USVRZICUgeGh0bWwtaHlwZXJ0ZXh0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSHlwZXJ0ZXh0IDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtaHlwZXJ0ZXh0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEh5cGVydGV4dCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWh5cGVydGV4dC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBIeXBlcnRleHQgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1oeXBlcnRleHQtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSHlwZXJ0ZXh0Ci0KLSAgICAgICAgYQotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBhbmNob3IgKCdhJykgZWxlbWVudCB0eXBlLCB3aGljaAotICAgICBkZWZpbmVzIHRoZSBzb3VyY2Ugb2YgYSBoeXBlcnRleHQgbGluay4gVGhlIGRlc3RpbmF0aW9uCi0gICAgIChvciBsaW5rICd0YXJnZXQnKSBpcyBpZGVudGlmaWVkIHZpYSBpdHMgJ2lkJyBhdHRyaWJ1dGUgCi0gICAgIHJhdGhlciB0aGFuIHRoZSAnbmFtZScgYXR0cmlidXRlIGFzIHdhcyB1c2VkIGluIEhUTUwuCi0tLT4KLQotPCEtLSAuLi4uLi4uLi4uLi4gIEFuY2hvciBFbGVtZW50ICAuLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgYS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWEuZWxlbWVudDtbCi08IUVOVElUWSAlIGEuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubE5vQW5jaG9yLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGEucW5hbWUgICJhIiA+Ci08IUVMRU1FTlQgJWEucW5hbWU7ICAlYS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBhLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWEuYXR0bGlzdDtbCi08IUFUVExJU1QgJWEucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGhyZWYgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNoYXJzZXQgICAgICAlQ2hhcnNldC5kYXRhdHlwZTsgICAgICAgI0lNUExJRUQKLSAgICAgIHR5cGUgICAgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI0lNUExJRUQKLSAgICAgIGhyZWZsYW5nICAgICAlTGFuZ3VhZ2VDb2RlLmRhdGF0eXBlOyAgI0lNUExJRUQKLSAgICAgIHJlbCAgICAgICAgICAlTGlua1R5cGVzLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIHJldiAgICAgICAgICAlTGlua1R5cGVzLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIGFjY2Vzc2tleSAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIHRhYmluZGV4ICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGEuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtaHlwZXJ0ZXh0LTEubW9kIC0tPgotCi0KLTwhRU5USVRZICUgeGh0bWwtbGlzdC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIExpc3RzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtbGlzdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBMaXN0cyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1saXN0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIExpc3RzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtbGlzdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBMaXN0cwotCi0gICAgICAgIGRsLCBkdCwgZGQsIG9sLCB1bCwgbGkKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgbGlzdC1vcmllbnRlZCBlbGVtZW50IHR5cGVzCi0gICAgIGFuZCB0aGVpciBhdHRyaWJ1dGVzLgotLS0+Ci0KLTwhRU5USVRZICUgZGwucW5hbWUgICJkbCIgPgotPCFFTlRJVFkgJSBkdC5xbmFtZSAgImR0IiA+Ci08IUVOVElUWSAlIGRkLnFuYW1lICAiZGQiID4KLTwhRU5USVRZICUgb2wucW5hbWUgICJvbCIgPgotPCFFTlRJVFkgJSB1bC5xbmFtZSAgInVsIiA+Ci08IUVOVElUWSAlIGxpLnFuYW1lICAibGkiID4KLQotPCEtLSBkbDogRGVmaW5pdGlvbiBMaXN0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgZGwuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVkbC5lbGVtZW50O1sKLTwhRU5USVRZICUgZGwuY29udGVudCAgIiggJWR0LnFuYW1lOyB8ICVkZC5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAlZGwucW5hbWU7ICAlZGwuY29udGVudDsgPgotPCEtLSBlbmQgb2YgZGwuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkbC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWRsLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVkbC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZGwuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBkdDogRGVmaW5pdGlvbiBUZXJtIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgZHQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVkdC5lbGVtZW50O1sKLTwhRU5USVRZICUgZHQuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTEVNRU5UICVkdC5xbmFtZTsgICVkdC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBkdC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGR0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZHQuYXR0bGlzdDtbCi08IUFUVExJU1QgJWR0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBkdC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGRkOiBEZWZpbml0aW9uIERlc2NyaXB0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBkZC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWRkLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBkZC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7ICkqIgotPgotPCFFTEVNRU5UICVkZC5xbmFtZTsgICVkZC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBkZC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGRkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZGQuYXR0bGlzdDtbCi08IUFUVExJU1QgJWRkLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBkZC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIG9sOiBPcmRlcmVkIExpc3QgKG51bWJlcmVkIHN0eWxlcykgLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBvbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJW9sLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBvbC5jb250ZW50ICAiKCAlbGkucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJW9sLnFuYW1lOyAgJW9sLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIG9sLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgb2wuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVvbC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlb2wucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIG9sLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdWw6IFVub3JkZXJlZCBMaXN0IChidWxsZXQgc3R5bGVzKSAuLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHVsLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldWwuZWxlbWVudDtbCi08IUVOVElUWSAlIHVsLmNvbnRlbnQgICIoICVsaS5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAldWwucW5hbWU7ICAldWwuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdWwuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB1bC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXVsLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV1bC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdWwuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBsaTogTGlzdCBJdGVtIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgbGkuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVsaS5lbGVtZW50O1sKLTwhRU5USVRZICUgbGkuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3cubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAlbGkucW5hbWU7ICAlbGkuY29udGVudDsgPgotPCEtLSBlbmQgb2YgbGkuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBsaS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWxpLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVsaS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgbGkuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtbGlzdC0xLm1vZCAtLT4KLQotCi08IS0tIDo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6IC0tPgotCi08IS0tIEltYWdlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWltYWdlLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWltYWdlLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWltYWdlLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW1hZ2VzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtaW1hZ2UtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSW1hZ2VzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaW1hZ2UtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJvdmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW1hZ2VzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtaW1hZ2UtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSW1hZ2VzCi0KLSAgICAgICAgaW1nCi0KLSAgICAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgbWFya3VwIHRvIHN1cHBvcnQgYmFzaWMgaW1hZ2UgZW1iZWRkaW5nLgotLS0+Ci0KLTwhLS0gVG8gYXZvaWQgcHJvYmxlbXMgd2l0aCB0ZXh0LW9ubHkgVUFzIGFzIHdlbGwgYXMgdG8gbWFrZQotICAgICBpbWFnZSBjb250ZW50IHVuZGVyc3RhbmRhYmxlIGFuZCBuYXZpZ2FibGUgdG8gdXNlcnMgb2YKLSAgICAgbm9uLXZpc3VhbCBVQXMsIHlvdSBuZWVkIHRvIHByb3ZpZGUgYSBkZXNjcmlwdGlvbiB3aXRoCi0gICAgIHRoZSAnYWx0JyBhdHRyaWJ1dGUsIGFuZCBhdm9pZCBzZXJ2ZXItc2lkZSBpbWFnZSBtYXBzLgotLS0+Ci0KLTwhRU5USVRZICUgaW1nLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaW1nLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBpbWcuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIGltZy5xbmFtZSAgImltZyIgPgotPCFFTEVNRU5UICVpbWcucW5hbWU7ICAlaW1nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGltZy5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGltZy5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWltZy5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaW1nLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBzcmMgICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgYWx0ICAgICAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjUkVRVUlSRUQKLSAgICAgIGxvbmdkZXNjICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGhlaWdodCAgICAgICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIHdpZHRoICAgICAgICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGltZy5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1pbWFnZS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIFRhYmxlcyBNb2R1bGUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXRhYmxlLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLXRhYmxlLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLXRhYmxlLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzaWMgVGFibGVzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtYmFzaWMtdGFibGUtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEJhc2ljIFRhYmxlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1iYXNpYy10YWJsZS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwgQmFzaWMsIGEgcHJvcGVyIHN1YnNldCBvZiBYSFRNTC4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2ljIFRhYmxlcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLWJhc2ljLXRhYmxlLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEJhc2ljIFRhYmxlcwotCi0gICAgICAgIHRhYmxlLCBjYXB0aW9uLCB0ciwgdGgsIHRkCi0KLSAgICAgVGhpcyB0YWJsZSBtb2R1bGUgZGVjbGFyZXMgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgZGVmaW5pbmcKLSAgICAgYSB0YWJsZSBtb2RlbCBiYXNlZCBmdW5kYW1lbnRhbGx5IG9uIGZlYXR1cmVzIGZvdW5kIGluIHRoZQotICAgICB3aWRlbHktZGVwbG95ZWQgSFRNTCAzLjIgdGFibGUgbW9kZWwuICBXaGlsZSB0aGlzIG1vZHVsZQotICAgICBtaW1pY3MgdGhlIGNvbnRlbnQgbW9kZWwgYW5kIHRhYmxlIGF0dHJpYnV0ZXMgb2YgSFRNTCAzLjIKLSAgICAgdGFibGVzLCB0aGUgZWxlbWVudCB0eXBlcyBkZWNsYXJlZCBoZXJlaW4gYWxzbyBpbmNsdWRlcyBhbGwKLSAgICAgSFRNTCA0IGNvbW1vbiBhbmQgbW9zdCBvZiB0aGUgSFRNTCA0IHRhYmxlIGF0dHJpYnV0ZXMuCi0tLT4KLQotPCEtLSBkZWNsYXJlIHF1YWxpZmllZCBlbGVtZW50IHR5cGUgbmFtZXM6Ci0tLT4KLTwhRU5USVRZICUgdGFibGUucW5hbWUgICJ0YWJsZSIgPgotPCFFTlRJVFkgJSBjYXB0aW9uLnFuYW1lICAiY2FwdGlvbiIgPgotPCFFTlRJVFkgJSB0ci5xbmFtZSAgInRyIiA+Ci08IUVOVElUWSAlIHRoLnFuYW1lICAidGgiID4KLTwhRU5USVRZICUgdGQucW5hbWUgICJ0ZCIgPgotCi08IS0tIGhvcml6b250YWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMKLS0tPgotPCFFTlRJVFkgJSBDZWxsSEFsaWduLmF0dHJpYgotICAgICAiYWxpZ24gICAgICAgICggbGVmdAotICAgICAgICAgICAgICAgICAgIHwgY2VudGVyCi0gICAgICAgICAgICAgICAgICAgfCByaWdodCApICAgICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IS0tIHZlcnRpY2FsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzCi0tLT4KLTwhRU5USVRZICUgQ2VsbFZBbGlnbi5hdHRyaWIKLSAgICAgInZhbGlnbiAgICAgICAoIHRvcAotICAgICAgICAgICAgICAgICAgIHwgbWlkZGxlCi0gICAgICAgICAgICAgICAgICAgfCBib3R0b20gKSAgICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IS0tIHNjb3BlIGlzIHNpbXBsZXIgdGhhbiBheGVzIGF0dHJpYnV0ZSBmb3IgY29tbW9uIHRhYmxlcwotLS0+Ci08IUVOVElUWSAlIHNjb3BlLmF0dHJpYgotICAgICAic2NvcGUgICAgICAgICggcm93IHwgY29sICApICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCEtLSB0YWJsZTogVGFibGUgRWxlbWVudCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgdGFibGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0YWJsZS5lbGVtZW50O1sKLTwhRU5USVRZICUgdGFibGUuY29udGVudAotICAgICAiKCAlY2FwdGlvbi5xbmFtZTs/LCAldHIucW5hbWU7KyApIgotPgotPCFFTEVNRU5UICV0YWJsZS5xbmFtZTsgICV0YWJsZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0YWJsZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRhYmxlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGFibGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRhYmxlLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBzdW1tYXJ5ICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiB0YWJsZS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGNhcHRpb246IFRhYmxlIENhcHRpb24gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBjYXB0aW9uLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslY2FwdGlvbi5lbGVtZW50O1sKLTwhRU5USVRZICUgY2FwdGlvbi5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJWNhcHRpb24ucW5hbWU7ICAlY2FwdGlvbi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBjYXB0aW9uLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgY2FwdGlvbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWNhcHRpb24uYXR0bGlzdDtbCi08IUFUVExJU1QgJWNhcHRpb24ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGNhcHRpb24uYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB0cjogVGFibGUgUm93IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgdHIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0ci5lbGVtZW50O1sKLTwhRU5USVRZICUgdHIuY29udGVudCAgIiggJXRoLnFuYW1lOyB8ICV0ZC5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAldHIucW5hbWU7ICAldHIuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdHIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0ci5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0ci5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgJUNlbGxIQWxpZ24uYXR0cmliOwotICAgICAgJUNlbGxWQWxpZ24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdHIuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB0aDogVGFibGUgSGVhZGVyIENlbGwgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gdGggaXMgZm9yIGhlYWRlciBjZWxscywgdGQgZm9yIGRhdGEsCi0gICAgIGJ1dCBmb3IgY2VsbHMgYWN0aW5nIGFzIGJvdGggdXNlIHRkCi0tLT4KLQotPCFFTlRJVFkgJSB0aC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRoLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0aC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvd05vVGFibGUubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAldGgucW5hbWU7ICAldGguY29udGVudDsgPgotPCEtLSBlbmQgb2YgdGguZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0aC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRoLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0aC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgYWJiciAgICAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRAotICAgICAgYXhpcyAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgaGVhZGVycyAgICAgIElEUkVGUyAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgJXNjb3BlLmF0dHJpYjsKLSAgICAgIHJvd3NwYW4gICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgJzEnCi0gICAgICBjb2xzcGFuICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICcxJwotICAgICAgJUNlbGxIQWxpZ24uYXR0cmliOwotICAgICAgJUNlbGxWQWxpZ24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdGguYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB0ZDogVGFibGUgRGF0YSBDZWxsIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgdGQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0ZC5lbGVtZW50O1sKLTwhRU5USVRZICUgdGQuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3dOb1RhYmxlLm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJXRkLnFuYW1lOyAgJXRkLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRkLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0ZC5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGFiYnIgICAgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGF4aXMgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGhlYWRlcnMgICAgICBJRFJFRlMgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgICVzY29wZS5hdHRyaWI7Ci0gICAgICByb3dzcGFuICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICcxJwotICAgICAgY29sc3BhbiAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAnMScKLSAgICAgICVDZWxsSEFsaWduLmF0dHJpYjsKLSAgICAgICVDZWxsVkFsaWduLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHRkLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJhc2ljLXRhYmxlLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gRm9ybXMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtZm9ybS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1mb3JtLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWZvcm0ubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNpYyBGb3JtcyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWJhc2ljLWZvcm0tMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgU2ltcGxpZmllZCBGb3JtcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYmFzaWMtZm9ybS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwgQmFzaWMsIGEgcHJvcGVyIHN1YnNldCBvZiBYSFRNTC4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2ljIEZvcm1zIDEuMC8vRU4iICAKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1iYXNpYy1mb3JtLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEJhc2ljIEZvcm1zCi0KLSAgICAgVGhpcyBmb3JtcyBtb2R1bGUgaXMgYmFzZWQgb24gdGhlIEhUTUwgMy4yIGZvcm1zIG1vZGVsLCB3aXRoCi0gICAgIHRoZSBXQUktcmVxdWVzdGVkIGFkZGl0aW9uIG9mIHRoZSBsYWJlbCBlbGVtZW50LiBXaGlsZSB0aGlzIAotICAgICBtb2R1bGUgZXNzZW50aWFsbHkgbWltaWNzIHRoZSBjb250ZW50IG1vZGVsIGFuZCBhdHRyaWJ1dGVzIG9mIAotICAgICBIVE1MIDMuMiBmb3JtcywgdGhlIGVsZW1lbnQgdHlwZXMgZGVjbGFyZWQgaGVyZWluIGFsc28gaW5jbHVkZQotICAgICBhbGwgSFRNTCA0IGNvbW1vbiBhdHRyaWJ1dGVzLgotCi0gICAgICAgIGZvcm0sIGxhYmVsLCBpbnB1dCwgc2VsZWN0LCBvcHRpb24sIHRleHRhcmVhCi0tLT4KLQotPCEtLSBkZWNsYXJlIHF1YWxpZmllZCBlbGVtZW50IHR5cGUgbmFtZXM6Ci0tLT4KLTwhRU5USVRZICUgZm9ybS5xbmFtZSAgImZvcm0iID4KLTwhRU5USVRZICUgbGFiZWwucW5hbWUgICJsYWJlbCIgPgotPCFFTlRJVFkgJSBpbnB1dC5xbmFtZSAgImlucHV0IiA+Ci08IUVOVElUWSAlIHNlbGVjdC5xbmFtZSAgInNlbGVjdCIgPgotPCFFTlRJVFkgJSBvcHRpb24ucW5hbWUgICJvcHRpb24iID4KLTwhRU5USVRZICUgdGV4dGFyZWEucW5hbWUgICJ0ZXh0YXJlYSIgPgotCi08IS0tICVCbGtOb0Zvcm0ubWl4OyBpbmNsdWRlcyBhbGwgbm9uLWZvcm0gYmxvY2sgZWxlbWVudHMsCi0gICAgIHBsdXMgJU1pc2MuY2xhc3M7Ci0tLT4KLTwhRU5USVRZICUgQmxrTm9Gb3JtLm1peAotICAgICAiJUhlYWRpbmcuY2xhc3M7Ci0gICAgICB8ICVMaXN0LmNsYXNzOwotICAgICAgfCAlQmxrU3RydWN0LmNsYXNzOwotICAgICAgJUJsa1BocmFzLmNsYXNzOwotICAgICAgJUJsa1ByZXMuY2xhc3M7Ci0gICAgICB8ICV0YWJsZS5xbmFtZTsgCi0gICAgICAlQmxvY2suZXh0cmE7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhLS0gZm9ybTogRm9ybSBFbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGZvcm0uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVmb3JtLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBmb3JtLmNvbnRlbnQKLSAgICAgIiggJUJsa05vRm9ybS5taXg7ICkrIgotPgotPCFFTEVNRU5UICVmb3JtLnFuYW1lOyAgJWZvcm0uY29udGVudDsgPgotPCEtLSBlbmQgb2YgZm9ybS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGZvcm0uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVmb3JtLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVmb3JtLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBhY3Rpb24gICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgbWV0aG9kICAgICAgICggZ2V0IHwgcG9zdCApICAgICAgICAgICAnZ2V0JwotICAgICAgZW5jdHlwZSAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJwotPgotPCEtLSBlbmQgb2YgZm9ybS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGxhYmVsOiBGb3JtIEZpZWxkIExhYmVsIFRleHQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBsYWJlbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWxhYmVsLmVsZW1lbnQ7WwotPCEtLSBFYWNoIGxhYmVsIG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIE9ORSBmaWVsZAotLS0+Ci08IUVOVElUWSAlIGxhYmVsLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSAKLSAgICAgIHwgJWlucHV0LnFuYW1lOyB8ICVzZWxlY3QucW5hbWU7IHwgJXRleHRhcmVhLnFuYW1lOwotICAgICAgfCAlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgJUkxOG4uY2xhc3M7Ci0gICAgICAlSW5sUHJlcy5jbGFzczsKLSAgICAgICVJbmxTcGVjaWFsLmNsYXNzOwotICAgICAgJU1pc2MuY2xhc3M7ICkqIgotPgotPCFFTEVNRU5UICVsYWJlbC5xbmFtZTsgICVsYWJlbC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBsYWJlbC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGxhYmVsLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslbGFiZWwuYXR0bGlzdDtbCi08IUFUVExJU1QgJWxhYmVsLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBmb3IgICAgICAgICAgSURSRUYgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBhY2Nlc3NrZXkgICAgJUNoYXJhY3Rlci5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBsYWJlbC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGlucHV0OiBGb3JtIENvbnRyb2wgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBpbnB1dC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWlucHV0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBpbnB1dC5jb250ZW50ICAiRU1QVFkiID4KLTwhRUxFTUVOVCAlaW5wdXQucW5hbWU7ICAlaW5wdXQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaW5wdXQuZWxlbWVudCAtLT5dXT4KLQotPCEtLSBCYXNpYyBGb3JtcyByZW1vdmVzICdpbWFnZScgYW5kICdmaWxlJyBpbnB1dCB0eXBlcy4KLS0tPgotPCFFTlRJVFkgJSBpbnB1dC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWlucHV0LmF0dGxpc3Q7WwotPCFFTlRJVFkgJSBJbnB1dFR5cGUuY2xhc3MKLSAgICAgIiggdGV4dCB8IHBhc3N3b3JkIHwgY2hlY2tib3ggfCByYWRpbyAKLSAgICAgIHwgc3VibWl0IHwgcmVzZXQgfCBoaWRkZW4gKSIKLT4KLTwhLS0gYXR0cmlidXRlIG5hbWUgcmVxdWlyZWQgZm9yIGFsbCBidXQgc3VibWl0ICYgcmVzZXQKLS0tPgotPCFBVFRMSVNUICVpbnB1dC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgdHlwZSAgICAgICAgICVJbnB1dFR5cGUuY2xhc3M7ICAgICAgICAndGV4dCcKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHZhbHVlICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNoZWNrZWQgICAgICAoIGNoZWNrZWQgKSAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHNpemUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIG1heGxlbmd0aCAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIHNyYyAgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGFjY2Vzc2tleSAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGlucHV0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gc2VsZWN0OiBPcHRpb24gU2VsZWN0b3IgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHNlbGVjdC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXNlbGVjdC5lbGVtZW50O1sKLTwhRU5USVRZICUgc2VsZWN0LmNvbnRlbnQgICIoICVvcHRpb24ucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJXNlbGVjdC5xbmFtZTsgICVzZWxlY3QuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc2VsZWN0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc2VsZWN0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc2VsZWN0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzZWxlY3QucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHNpemUgICAgICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG11bHRpcGxlICAgICAoIG11bHRpcGxlICkgICAgICAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIHNlbGVjdC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIG9wdGlvbjogU2VsZWN0YWJsZSBDaG9pY2UgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBvcHRpb24uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVvcHRpb24uZWxlbWVudDtbCi08IUVOVElUWSAlIG9wdGlvbi5jb250ZW50ICAiKCAjUENEQVRBICkiID4KLTwhRUxFTUVOVCAlb3B0aW9uLnFuYW1lOyAgJW9wdGlvbi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBvcHRpb24uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBvcHRpb24uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVvcHRpb24uYXR0bGlzdDtbCi08IUFUVExJU1QgJW9wdGlvbi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgc2VsZWN0ZWQgICAgICggc2VsZWN0ZWQgKSAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgdmFsdWUgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2Ygb3B0aW9uLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdGV4dGFyZWE6IE11bHRpLUxpbmUgVGV4dCBGaWVsZCAuLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHRleHRhcmVhLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGV4dGFyZWEuZWxlbWVudDtbCi08IUVOVElUWSAlIHRleHRhcmVhLmNvbnRlbnQgICIoICNQQ0RBVEEgKSIgPgotPCFFTEVNRU5UICV0ZXh0YXJlYS5xbmFtZTsgICV0ZXh0YXJlYS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0ZXh0YXJlYS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRleHRhcmVhLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGV4dGFyZWEuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRleHRhcmVhLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBuYW1lICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICByb3dzICAgICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNSRVFVSVJFRAotICAgICAgY29scyAgICAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjUkVRVUlSRUQKLSAgICAgIGFjY2Vzc2tleSAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIHRleHRhcmVhLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJhc2ljLWZvcm0tMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBMaW5rIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1saW5rLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWxpbmsubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtbGluay5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIExpbmsgRWxlbWVudCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWxpbmstMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgTGluayBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtbGluay0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBMaW5rIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1saW5rLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIExpbmsgZWxlbWVudAotCi0gICAgICAgIGxpbmsKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgbGluayBlbGVtZW50IHR5cGUgYW5kIGl0cyBhdHRyaWJ1dGVzLAotICAgICB3aGljaCBjb3VsZCAoaW4gcHJpbmNpcGxlKSBiZSB1c2VkIHRvIGRlZmluZSBkb2N1bWVudC1sZXZlbCBsaW5rcwotICAgICB0byBleHRlcm5hbCByZXNvdXJjZXMgc3VjaCBhczoKLQotICAgICBhKSBmb3IgZG9jdW1lbnQgc3BlY2lmaWMgdG9vbGJhcnMvbWVudXMsIGUuZy4gc3RhcnQsIGNvbnRlbnRzLAotICAgICAgICBwcmV2aW91cywgbmV4dCwgaW5kZXgsIGVuZCwgaGVscAotICAgICBiKSB0byBsaW5rIHRvIGEgc2VwYXJhdGUgc3R5bGUgc2hlZXQgKHJlbD0ic3R5bGVzaGVldCIpCi0gICAgIGMpIHRvIG1ha2UgYSBsaW5rIHRvIGEgc2NyaXB0IChyZWw9InNjcmlwdCIpCi0gICAgIGQpIGJ5IHN0eWxlc2hlZXRzIHRvIGNvbnRyb2wgaG93IGNvbGxlY3Rpb25zIG9mIGh0bWwgbm9kZXMgYXJlCi0gICAgICAgIHJlbmRlcmVkIGludG8gcHJpbnRlZCBkb2N1bWVudHMKLSAgICAgZSkgdG8gbWFrZSBhIGxpbmsgdG8gYSBwcmludGFibGUgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50Ci0gICAgICAgIGUuZy4gYSBwb3N0c2NyaXB0IG9yIHBkZiB2ZXJzaW9uIChyZWw9ImFsdGVybmF0ZSIgbWVkaWE9InByaW50IikKLS0tPgotCi08IS0tIGxpbms6IE1lZGlhLUluZGVwZW5kZW50IExpbmsgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBsaW5rLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslbGluay5lbGVtZW50O1sKLTwhRU5USVRZICUgbGluay5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgbGluay5xbmFtZSAgImxpbmsiID4KLTwhRUxFTUVOVCAlbGluay5xbmFtZTsgICVsaW5rLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGxpbmsuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBsaW5rLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslbGluay5hdHRsaXN0O1sKLTwhQVRUTElTVCAlbGluay5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgY2hhcnNldCAgICAgICVDaGFyc2V0LmRhdGF0eXBlOyAgICAgICAjSU1QTElFRAotICAgICAgaHJlZiAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgaHJlZmxhbmcgICAgICVMYW5ndWFnZUNvZGUuZGF0YXR5cGU7ICAjSU1QTElFRAotICAgICAgdHlwZSAgICAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAjSU1QTElFRAotICAgICAgcmVsICAgICAgICAgICVMaW5rVHlwZXMuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgcmV2ICAgICAgICAgICVMaW5rVHlwZXMuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgbWVkaWEgICAgICAgICVNZWRpYURlc2MuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgbGluay5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1saW5rLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gRG9jdW1lbnQgTWV0YWluZm9ybWF0aW9uIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtbWV0YS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1tZXRhLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLW1ldGEubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBNZXRhaW5mb3JtYXRpb24gMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1tZXRhLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIERvY3VtZW50IE1ldGFpbmZvcm1hdGlvbiBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLW1ldGEtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAwIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLWJhc2ljMTAtZi5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTWV0YWluZm9ybWF0aW9uIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtbWV0YS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBNZXRhIEluZm9ybWF0aW9uCi0KLSAgICAgICAgbWV0YQotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBtZXRhIGVsZW1lbnQgdHlwZSBhbmQgaXRzIGF0dHJpYnV0ZXMsCi0gICAgIHVzZWQgdG8gcHJvdmlkZSBkZWNsYXJhdGl2ZSBkb2N1bWVudCBtZXRhaW5mb3JtYXRpb24uCi0tLT4KLQotPCEtLSBtZXRhOiBHZW5lcmljIE1ldGFpbmZvcm1hdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgbWV0YS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJW1ldGEuZWxlbWVudDtbCi08IUVOVElUWSAlIG1ldGEuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIG1ldGEucW5hbWUgICJtZXRhIiA+Ci08IUVMRU1FTlQgJW1ldGEucW5hbWU7ICAlbWV0YS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBtZXRhLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgbWV0YS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJW1ldGEuYXR0bGlzdDtbCi08IUFUVExJU1QgJW1ldGEucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJUkxOG4uYXR0cmliOwotICAgICAgaHR0cC1lcXVpdiAgIE5NVE9LRU4gICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgbmFtZSAgICAgICAgIE5NVE9LRU4gICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgY29udGVudCAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjUkVRVUlSRUQKLSAgICAgIHNjaGVtZSAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIG1ldGEuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtbWV0YS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIEJhc2UgRWxlbWVudCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWJhc2UubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtYmFzZS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1iYXNlLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzZSBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtYmFzZS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCYXNlIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1iYXNlLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1iYXNpYzEwLWYuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2UgRWxlbWVudCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhdGl6YXRpb24vRFREL3hodG1sLWJhc2UtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQmFzZSBlbGVtZW50Ci0KLSAgICAgICAgYmFzZQotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBiYXNlIGVsZW1lbnQgdHlwZSBhbmQgaXRzIGF0dHJpYnV0ZXMsCi0gICAgIHVzZWQgdG8gZGVmaW5lIGEgYmFzZSBVUkkgYWdhaW5zdCB3aGljaCByZWxhdGl2ZSBVUklzIGluIHRoZQotICAgICBkb2N1bWVudCB3aWxsIGJlIHJlc29sdmVkLgotCi0gICAgIE5vdGUgdGhhdCB0aGlzIG1vZHVsZSBhbHNvIHJlZGVjbGFyZXMgdGhlIGNvbnRlbnQgbW9kZWwgZm9yCi0gICAgIHRoZSBoZWFkIGVsZW1lbnQgdG8gaW5jbHVkZSB0aGUgYmFzZSBlbGVtZW50LgotLS0+Ci0KLTwhLS0gYmFzZTogRG9jdW1lbnQgQmFzZSBVUkkgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGJhc2UuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyViYXNlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBiYXNlLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBiYXNlLnFuYW1lICAiYmFzZSIgPgotPCFFTEVNRU5UICViYXNlLnFuYW1lOyAgJWJhc2UuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYmFzZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJhc2UuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyViYXNlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICViYXNlLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgIGhyZWYgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI1JFUVVJUkVECi0+Ci08IS0tIGVuZCBvZiBiYXNlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaGVhZC5jb250ZW50Ci0gICAgIiggJUhlYWRPcHRzLm1peDssCi0gICAgICggKCAldGl0bGUucW5hbWU7LCAlSGVhZE9wdHMubWl4OywgKCAlYmFzZS5xbmFtZTssICVIZWFkT3B0cy5taXg7ICk/ICkKLSAgICAgfCAoICViYXNlLnFuYW1lOywgJUhlYWRPcHRzLm1peDssICggJXRpdGxlLnFuYW1lOywgJUhlYWRPcHRzLm1peDsgKSkpKSIKLT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYmFzZS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIFBhcmFtIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXBhcmFtLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLXBhcmFtLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLXBhcmFtLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgUGFyYW0gRWxlbWVudCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLXBhcmFtLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFBhcmFtIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1wYXJhbS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBQYXJhbSBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGF0aXphdGlvbi9EVEQveGh0bWwtcGFyYW0tMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gUGFyYW1ldGVycyBmb3IgSmF2YSBBcHBsZXRzIGFuZCBFbWJlZGRlZCBPYmplY3RzCi0KLSAgICAgICAgcGFyYW0KLQotICAgICBUaGlzIG1vZHVsZSBwcm92aWRlcyBkZWNsYXJhdGlvbnMgZm9yIHRoZSBwYXJhbSBlbGVtZW50LCAKLSAgICAgdXNlZCB0byBwcm92aWRlIG5hbWVkIHByb3BlcnR5IHZhbHVlcyBmb3IgdGhlIGFwcGxldAotICAgICBhbmQgb2JqZWN0IGVsZW1lbnRzLiAKLS0tPgotCi08IS0tIHBhcmFtOiBOYW1lZCBQcm9wZXJ0eSBWYWx1ZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBwYXJhbS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXBhcmFtLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBwYXJhbS5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgcGFyYW0ucW5hbWUgICJwYXJhbSIgPgotPCFFTEVNRU5UICVwYXJhbS5xbmFtZTsgICVwYXJhbS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBwYXJhbS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHBhcmFtLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslcGFyYW0uYXR0bGlzdDtbCi08IUFUVExJU1QgJXBhcmFtLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsgCi0gICAgICAlaWQuYXR0cmliOwotICAgICAgbmFtZSAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjUkVRVUlSRUQKLSAgICAgIHZhbHVlICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHZhbHVldHlwZSAgICAoIGRhdGEgfCByZWYgfCBvYmplY3QgKSAgJ2RhdGEnCi0gICAgICB0eXBlICAgICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBwYXJhbS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1wYXJhbS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIEVtYmVkZGVkIE9iamVjdCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLW9iamVjdC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1vYmplY3QubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtb2JqZWN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRW1iZWRkZWQgT2JqZWN0IDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtb2JqZWN0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEVtYmVkZGVkIE9iamVjdCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLW9iamVjdC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBFbWJlZGRlZCBPYmplY3QgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1vYmplY3QtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gRW1iZWRkZWQgT2JqZWN0cwotCi0gICAgICAgIG9iamVjdAotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBvYmplY3QgZWxlbWVudCB0eXBlIGFuZCBpdHMgYXR0cmlidXRlcywKLSAgICAgdXNlZCB0byBlbWJlZCBleHRlcm5hbCBvYmplY3RzIGFzIHBhcnQgb2YgWEhUTUwgcGFnZXMuIEluIHRoZQotICAgICBkb2N1bWVudCwgcGxhY2UgcGFyYW0gZWxlbWVudHMgcHJpb3IgdG8gdGhlIG9iamVjdCBlbGVtZW50cyAKLSAgICAgdGhhdCByZXF1aXJlIHRoZWlyIGNvbnRlbnQuCi0KLSAgICAgTm90ZSB0aGF0IHVzZSBvZiB0aGlzIG1vZHVsZSByZXF1aXJlcyBpbnN0YW50aWF0aW9uIG9mIHRoZSAKLSAgICAgUGFyYW0gRWxlbWVudCBNb2R1bGUgcHJpb3IgdG8gdGhpcyBtb2R1bGUuCi0tLT4KLQotPCEtLSBvYmplY3Q6IEdlbmVyaWMgRW1iZWRkZWQgT2JqZWN0IC4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgb2JqZWN0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslb2JqZWN0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBvYmplY3QuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3cubWl4OyB8ICVwYXJhbS5xbmFtZTsgKSoiCi0+Ci08IUVOVElUWSAlIG9iamVjdC5xbmFtZSAgIm9iamVjdCIgPgotPCFFTEVNRU5UICVvYmplY3QucW5hbWU7ICAlb2JqZWN0LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIG9iamVjdC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIG9iamVjdC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJW9iamVjdC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlb2JqZWN0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBkZWNsYXJlICAgICAgKCBkZWNsYXJlICkgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBjbGFzc2lkICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBjb2RlYmFzZSAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBkYXRhICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICB0eXBlICAgICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNJTVBMSUVECi0gICAgICBjb2RldHlwZSAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNJTVBMSUVECi0gICAgICBhcmNoaXZlICAgICAgJVVSSXMuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0gICAgICBzdGFuZGJ5ICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0gICAgICBoZWlnaHQgICAgICAgJUxlbmd0aC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICB3aWR0aCAgICAgICAgJUxlbmd0aC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBuYW1lICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB0YWJpbmRleCAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBvYmplY3QuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtb2JqZWN0LTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtc3RydWN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRG9jdW1lbnQgU3RydWN0dXJlIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtc3RydWN0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFN0cnVjdHVyZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXN0cnVjdC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtYmFzaWMxMC1mLmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBEb2N1bWVudCBTdHJ1Y3R1cmUgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXRpemF0aW9uL0RURC94aHRtbC1zdHJ1Y3QtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gRG9jdW1lbnQgU3RydWN0dXJlCi0KLSAgICAgICAgdGl0bGUsIGhlYWQsIGJvZHksIGh0bWwKLQotICAgICBUaGUgU3RydWN0dXJlIE1vZHVsZSBkZWZpbmVzIHRoZSBtYWpvciBzdHJ1Y3R1cmFsIGVsZW1lbnRzIGFuZCAKLSAgICAgdGhlaXIgYXR0cmlidXRlcy4KLQotICAgICBOb3RlIHRoYXQgdGhlIGNvbnRlbnQgbW9kZWwgb2YgdGhlIGhlYWQgZWxlbWVudCB0eXBlIGlzIHJlZGVjbGFyZWQgCi0gICAgIHdoZW4gdGhlIEJhc2UgTW9kdWxlIGlzIGluY2x1ZGVkIGluIHRoZSBEVEQuCi0KLSAgICAgVGhlIHBhcmFtZXRlciBlbnRpdHkgY29udGFpbmluZyB0aGUgWE1MIG5hbWVzcGFjZSBVUkkgdmFsdWUgdXNlZCAKLSAgICAgZm9yIFhIVE1MIGlzICclWEhUTUwueG1sbnM7JywgZGVmaW5lZCBpbiB0aGUgUXVhbGlmaWVkIE5hbWVzIG1vZHVsZS4KLS0tPgotCi08IS0tIHRpdGxlOiBEb2N1bWVudCBUaXRsZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBUaGUgdGl0bGUgZWxlbWVudCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBmbG93IG9mIHRleHQuCi0gICAgIEl0IHNob3VsZCBiZSBkaXNwbGF5ZWQsIGZvciBleGFtcGxlIGFzIHRoZSBwYWdlIGhlYWRlciBvcgotICAgICB3aW5kb3cgdGl0bGUuIEV4YWN0bHkgb25lIHRpdGxlIGlzIHJlcXVpcmVkIHBlciBkb2N1bWVudC4KLS0tPgotCi08IUVOVElUWSAlIHRpdGxlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGl0bGUuZWxlbWVudDtbCi08IUVOVElUWSAlIHRpdGxlLmNvbnRlbnQgICIoICNQQ0RBVEEgKSIgPgotPCFFTlRJVFkgJSB0aXRsZS5xbmFtZSAgInRpdGxlIiA+Ci08IUVMRU1FTlQgJXRpdGxlLnFuYW1lOyAgJXRpdGxlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRpdGxlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGl0bGUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0aXRsZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGl0bGUucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOyAKLSAgICAgICVJMThuLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHRpdGxlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gaGVhZDogRG9jdW1lbnQgSGVhZCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGhlYWQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoZWFkLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoZWFkLmNvbnRlbnQKLSAgICAiKCAlSGVhZE9wdHMubWl4OywgJXRpdGxlLnFuYW1lOywgJUhlYWRPcHRzLm1peDsgKSIKLT4KLTwhRU5USVRZICUgaGVhZC5xbmFtZSAgImhlYWQiID4KLTwhRUxFTUVOVCAlaGVhZC5xbmFtZTsgICVoZWFkLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGhlYWQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoZWFkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaGVhZC5hdHRsaXN0O1sKLTwhLS0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2Ugd2l0aCBkb2N1bWVudCBwcm9maWxlcwotLS0+Ci08IUVOVElUWSAlIHByb2ZpbGUuYXR0cmliCi0gICAgICJwcm9maWxlICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICclWEhUTUwucHJvZmlsZTsnIgotPgotCi08IUFUVExJU1QgJWhlYWQucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOyAKLSAgICAgICVJMThuLmF0dHJpYjsKLSAgICAgICVwcm9maWxlLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGhlYWQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBib2R5OiBEb2N1bWVudCBCb2R5IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgYm9keS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWJvZHkuZWxlbWVudDtbCi08IUVOVElUWSAlIGJvZHkuY29udGVudAotICAgICAiKCAlQmxvY2subWl4OyApKyIKLT4KLTwhRU5USVRZICUgYm9keS5xbmFtZSAgImJvZHkiID4KLTwhRUxFTUVOVCAlYm9keS5xbmFtZTsgICVib2R5LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGJvZHkuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBib2R5LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYm9keS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYm9keS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYm9keS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGh0bWw6IFhIVE1MIERvY3VtZW50IEVsZW1lbnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBodG1sLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaHRtbC5lbGVtZW50O1sKLTwhRU5USVRZICUgaHRtbC5jb250ZW50ICAiKCAlaGVhZC5xbmFtZTssICVib2R5LnFuYW1lOyApIiA+Ci08IUVOVElUWSAlIGh0bWwucW5hbWUgICJodG1sIiA+Ci08IUVMRU1FTlQgJWh0bWwucW5hbWU7ICAlaHRtbC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBodG1sLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaHRtbC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWh0bWwuYXR0bGlzdDtbCi08IS0tIHZlcnNpb24gYXR0cmlidXRlIHZhbHVlIGRlZmluZWQgaW4gZHJpdmVyCi0tLT4KLTwhRU5USVRZICUgWEhUTUwudmVyc2lvbi5hdHRyaWIKLSAgICAgInZlcnNpb24gICAgICAlRlBJLmRhdGF0eXBlOyAgICAgICAgICAgI0ZJWEVEICclWEhUTUwudmVyc2lvbjsnIgotPgotCi08IS0tIHNlZSB0aGUgUXVhbGlmaWVkIE5hbWVzIG1vZHVsZSBmb3IgaW5mb3JtYXRpb24gCi0gICAgIG9uIGhvdyB0byBleHRlbmQgWEhUTUwgdXNpbmcgWE1MIG5hbWVzcGFjZXMgCi0tLT4KLTwhQVRUTElTVCAlaHRtbC5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7IAotICAgICAgJVhIVE1MLnZlcnNpb24uYXR0cmliOwotICAgICAgJUkxOG4uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaHRtbC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1zdHJ1Y3QtMS5tb2QgLS0+Ci0KLQotPCEtLSBlbmQgb2YgWEhUTUwgQmFzaWMgMS4wIERURCAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbC1sYXQxLmVudCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbC1sYXQxLmVudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIxOThlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwtbGF0MS5lbnQKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotPCEtLSBQb3J0aW9ucyAoQykgSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiAxOTg2Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLTwhLS0gQ2hhcmFjdGVyIGVudGl0eSBzZXQuIFR5cGljYWwgaW52b2NhdGlvbjoKLSAgICA8IUVOVElUWSAlIEhUTUxsYXQxIFBVQkxJQwotICAgICAgICItLy9XM0MvL0VOVElUSUVTIExhdGluIDEgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1sYXQxLmVudCI+Ci0gICAgJUhUTUxsYXQxOwotLS0+Ci0KLTwhRU5USVRZIG5ic3AgICAiJiMxNjA7Ij4gPCEtLSBuby1icmVhayBzcGFjZSA9IG5vbi1icmVha2luZyBzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQTAgSVNPbnVtIC0tPgotPCFFTlRJVFkgaWV4Y2wgICImIzE2MTsiPiA8IS0tIGludmVydGVkIGV4Y2xhbWF0aW9uIG1hcmssIFUrMDBBMSBJU09udW0gLS0+Ci08IUVOVElUWSBjZW50ICAgIiYjMTYyOyI+IDwhLS0gY2VudCBzaWduLCBVKzAwQTIgSVNPbnVtIC0tPgotPCFFTlRJVFkgcG91bmQgICImIzE2MzsiPiA8IS0tIHBvdW5kIHNpZ24sIFUrMDBBMyBJU09udW0gLS0+Ci08IUVOVElUWSBjdXJyZW4gIiYjMTY0OyI+IDwhLS0gY3VycmVuY3kgc2lnbiwgVSswMEE0IElTT251bSAtLT4KLTwhRU5USVRZIHllbiAgICAiJiMxNjU7Ij4gPCEtLSB5ZW4gc2lnbiA9IHl1YW4gc2lnbiwgVSswMEE1IElTT251bSAtLT4KLTwhRU5USVRZIGJydmJhciAiJiMxNjY7Ij4gPCEtLSBicm9rZW4gYmFyID0gYnJva2VuIHZlcnRpY2FsIGJhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQTYgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2VjdCAgICImIzE2NzsiPiA8IS0tIHNlY3Rpb24gc2lnbiwgVSswMEE3IElTT251bSAtLT4KLTwhRU5USVRZIHVtbCAgICAiJiMxNjg7Ij4gPCEtLSBkaWFlcmVzaXMgPSBzcGFjaW5nIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQTggSVNPZGlhIC0tPgotPCFFTlRJVFkgY29weSAgICImIzE2OTsiPiA8IS0tIGNvcHlyaWdodCBzaWduLCBVKzAwQTkgSVNPbnVtIC0tPgotPCFFTlRJVFkgb3JkZiAgICImIzE3MDsiPiA8IS0tIGZlbWluaW5lIG9yZGluYWwgaW5kaWNhdG9yLCBVKzAwQUEgSVNPbnVtIC0tPgotPCFFTlRJVFkgbGFxdW8gICImIzE3MTsiPiA8IS0tIGxlZnQtcG9pbnRpbmcgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsZWZ0IHBvaW50aW5nIGd1aWxsZW1ldCwgVSswMEFCIElTT251bSAtLT4KLTwhRU5USVRZIG5vdCAgICAiJiMxNzI7Ij4gPCEtLSBub3Qgc2lnbiA9IGFuZ2xlZCBkYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBQyBJU09udW0gLS0+Ci08IUVOVElUWSBzaHkgICAgIiYjMTczOyI+IDwhLS0gc29mdCBoeXBoZW4gPSBkaXNjcmV0aW9uYXJ5IGh5cGhlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQUQgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmVnICAgICImIzE3NDsiPiA8IS0tIHJlZ2lzdGVyZWQgc2lnbiA9IHJlZ2lzdGVyZWQgdHJhZGUgbWFyayBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBRSBJU09udW0gLS0+Ci08IUVOVElUWSBtYWNyICAgIiYjMTc1OyI+IDwhLS0gbWFjcm9uID0gc3BhY2luZyBtYWNyb24gPSBvdmVybGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQVBMIG92ZXJiYXIsIFUrMDBBRiBJU09kaWEgLS0+Ci08IUVOVElUWSBkZWcgICAgIiYjMTc2OyI+IDwhLS0gZGVncmVlIHNpZ24sIFUrMDBCMCBJU09udW0gLS0+Ci08IUVOVElUWSBwbHVzbW4gIiYjMTc3OyI+IDwhLS0gcGx1cy1taW51cyBzaWduID0gcGx1cy1vci1taW51cyBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCMSBJU09udW0gLS0+Ci08IUVOVElUWSBzdXAyICAgIiYjMTc4OyI+IDwhLS0gc3VwZXJzY3JpcHQgdHdvID0gc3VwZXJzY3JpcHQgZGlnaXQgdHdvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzcXVhcmVkLCBVKzAwQjIgSVNPbnVtIC0tPgotPCFFTlRJVFkgc3VwMyAgICImIzE3OTsiPiA8IS0tIHN1cGVyc2NyaXB0IHRocmVlID0gc3VwZXJzY3JpcHQgZGlnaXQgdGhyZWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGN1YmVkLCBVKzAwQjMgSVNPbnVtIC0tPgotPCFFTlRJVFkgYWN1dGUgICImIzE4MDsiPiA8IS0tIGFjdXRlIGFjY2VudCA9IHNwYWNpbmcgYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEI0IElTT2RpYSAtLT4KLTwhRU5USVRZIG1pY3JvICAiJiMxODE7Ij4gPCEtLSBtaWNybyBzaWduLCBVKzAwQjUgSVNPbnVtIC0tPgotPCFFTlRJVFkgcGFyYSAgICImIzE4MjsiPiA8IS0tIHBpbGNyb3cgc2lnbiA9IHBhcmFncmFwaCBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCNiBJU09udW0gLS0+Ci08IUVOVElUWSBtaWRkb3QgIiYjMTgzOyI+IDwhLS0gbWlkZGxlIGRvdCA9IEdlb3JnaWFuIGNvbW1hCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBHcmVlayBtaWRkbGUgZG90LCBVKzAwQjcgSVNPbnVtIC0tPgotPCFFTlRJVFkgY2VkaWwgICImIzE4NDsiPiA8IS0tIGNlZGlsbGEgPSBzcGFjaW5nIGNlZGlsbGEsIFUrMDBCOCBJU09kaWEgLS0+Ci08IUVOVElUWSBzdXAxICAgIiYjMTg1OyI+IDwhLS0gc3VwZXJzY3JpcHQgb25lID0gc3VwZXJzY3JpcHQgZGlnaXQgb25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCOSBJU09udW0gLS0+Ci08IUVOVElUWSBvcmRtICAgIiYjMTg2OyI+IDwhLS0gbWFzY3VsaW5lIG9yZGluYWwgaW5kaWNhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBCQSBJU09udW0gLS0+Ci08IUVOVElUWSByYXF1byAgIiYjMTg3OyI+IDwhLS0gcmlnaHQtcG9pbnRpbmcgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSByaWdodCBwb2ludGluZyBndWlsbGVtZXQsIFUrMDBCQiBJU09udW0gLS0+Ci08IUVOVElUWSBmcmFjMTQgIiYjMTg4OyI+IDwhLS0gdnVsZ2FyIGZyYWN0aW9uIG9uZSBxdWFydGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmcmFjdGlvbiBvbmUgcXVhcnRlciwgVSswMEJDIElTT251bSAtLT4KLTwhRU5USVRZIGZyYWMxMiAiJiMxODk7Ij4gPCEtLSB2dWxnYXIgZnJhY3Rpb24gb25lIGhhbGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZyYWN0aW9uIG9uZSBoYWxmLCBVKzAwQkQgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzM0ICImIzE5MDsiPiA8IS0tIHZ1bGdhciBmcmFjdGlvbiB0aHJlZSBxdWFydGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnMsIFUrMDBCRSBJU09udW0gLS0+Ci08IUVOVElUWSBpcXVlc3QgIiYjMTkxOyI+IDwhLS0gaW52ZXJ0ZWQgcXVlc3Rpb24gbWFyawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdHVybmVkIHF1ZXN0aW9uIG1hcmssIFUrMDBCRiBJU09udW0gLS0+Ci08IUVOVElUWSBBZ3JhdmUgIiYjMTkyOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGdyYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgQWFjdXRlICImIzE5MzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFjaXJjICAiJiMxOTQ7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEF0aWxkZSAiJiMxOTU7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBdW1sICAgIiYjMTk2OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEFyaW5nICAiJiMxOTc7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggcmluZyBhYm92ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSByaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNSBJU09sYXQxIC0tPgotPCFFTlRJVFkgQUVsaWcgICImIzE5ODsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEFFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxpZ2F0dXJlIEFFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNiBJU09sYXQxIC0tPgotPCFFTlRJVFkgQ2NlZGlsICImIzE5OTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEMgd2l0aCBjZWRpbGxhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNyBJU09sYXQxIC0tPgotPCFFTlRJVFkgRWdyYXZlICImIzIwMDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzggSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVhY3V0ZSAiJiMyMDE7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM5IElTT2xhdDEgLS0+Ci08IUVOVElUWSBFY2lyYyAgIiYjMjAyOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENBIElTT2xhdDEgLS0+Ci08IUVOVElUWSBFdW1sICAgIiYjMjAzOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0IgSVNPbGF0MSAtLT4KLTwhRU5USVRZIElncmF2ZSAiJiMyMDQ7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENDIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJYWN1dGUgIiYjMjA1OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDRCBJU09sYXQxIC0tPgotPCFFTlRJVFkgSWNpcmMgICImIzIwNjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDRSBJU09sYXQxIC0tPgotPCFFTlRJVFkgSXVtbCAgICImIzIwNzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENGIElTT2xhdDEgLS0+Ci08IUVOVElUWSBFVEggICAgIiYjMjA4OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRVRILCBVKzAwRDAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE50aWxkZSAiJiMyMDk7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBOIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBPZ3JhdmUgIiYjMjEwOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgT2FjdXRlICImIzIxMTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE9jaXJjICAiJiMyMTI7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE90aWxkZSAiJiMyMTM7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBPdW1sICAgIiYjMjE0OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHRpbWVzICAiJiMyMTU7Ij4gPCEtLSBtdWx0aXBsaWNhdGlvbiBzaWduLCBVKzAwRDcgSVNPbnVtIC0tPgotPCFFTlRJVFkgT3NsYXNoICImIzIxNjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBzdHJva2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gc2xhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ4IElTT2xhdDEgLS0+Ci08IUVOVElUWSBVZ3JhdmUgIiYjMjE3OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgVWFjdXRlICImIzIxODsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFVjaXJjICAiJiMyMTk7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFV1bWwgICAiJiMyMjA7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgWWFjdXRlICImIzIyMTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFkgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIFRIT1JOICAiJiMyMjI7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBUSE9STiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHN6bGlnICAiJiMyMjM7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgc2hhcnAgcyA9IGVzcy16ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERGIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhZ3JhdmUgIiYjMjI0OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBncmF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGV0dGVyIGEgZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhYWN1dGUgIiYjMjI1OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFjaXJjICAiJiMyMjY7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEUyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBhdGlsZGUgIiYjMjI3OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGF1bWwgICAiJiMyMjg7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFyaW5nICAiJiMyMjk7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIHJpbmcgYWJvdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxldHRlciBhIHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBhZWxpZyAgIiYjMjMwOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGFlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBzbWFsbCBsaWdhdHVyZSBhZSwgVSswMEU2IElTT2xhdDEgLS0+Ci08IUVOVElUWSBjY2VkaWwgIiYjMjMxOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGMgd2l0aCBjZWRpbGxhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFNyBJU09sYXQxIC0tPgotPCFFTlRJVFkgZWdyYXZlICImIzIzMjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU4IElTT2xhdDEgLS0+Ci08IUVOVElUWSBlYWN1dGUgIiYjMjMzOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGVjaXJjICAiJiMyMzQ7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVBIElTT2xhdDEgLS0+Ci08IUVOVElUWSBldW1sICAgIiYjMjM1OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVCIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpZ3JhdmUgIiYjMjM2OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGlhY3V0ZSAiJiMyMzc7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFRCBJU09sYXQxIC0tPgotPCFFTlRJVFkgaWNpcmMgICImIzIzODsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGl1bWwgICAiJiMyMzk7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGV0aCAgICAiJiMyNDA7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZXRoLCBVKzAwRjAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG50aWxkZSAiJiMyNDE7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbiB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgb2dyYXZlICImIzI0MjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEYyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBvYWN1dGUgIiYjMjQzOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG9jaXJjICAiJiMyNDQ7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY0IElTT2xhdDEgLS0+Ci08IUVOVElUWSBvdGlsZGUgIiYjMjQ1OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG91bWwgICAiJiMyNDY7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGRpdmlkZSAiJiMyNDc7Ij4gPCEtLSBkaXZpc2lvbiBzaWduLCBVKzAwRjcgSVNPbnVtIC0tPgotPCFFTlRJVFkgb3NsYXNoICImIzI0ODsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggc3Ryb2tlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGV0dGVyIG8gc2xhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEY4IElTT2xhdDEgLS0+Ci08IUVOVElUWSB1Z3JhdmUgIiYjMjQ5OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHVhY3V0ZSAiJiMyNTA7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgdWNpcmMgICImIzI1MTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHV1bWwgICAiJiMyNTI7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRkMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHlhY3V0ZSAiJiMyNTM7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgeSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGRCBJU09sYXQxIC0tPgotPCFFTlRJVFkgdGhvcm4gICImIzI1NDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB0aG9ybiB3aXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGRSBJU09sYXQxIC0tPgotPCFFTlRJVFkgeXVtbCAgICImIzI1NTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB5IHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGRiBJU09sYXQxIC0tPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sLW1vYmlsZTEwLWZsYXQuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sLW1vYmlsZTEwLWZsYXQuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjExNTAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDMyMTYgKzAsMCBAQAotPCEtLSBYSFRNTCBNb2JpbGUgMS4wIERURCAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1tb2JpbGUxMC5kdGQgLS0+Ci08IS0tIAotICAgICBUaGlzIGlzIFhIVE1MIE1vYmlsZSBwcm9maWxlLCBhIHByb3BlciBzdWJzZXQgb2YgWEhUTUwuCi0gICAgIAotICAgICAJQFdpcmVsZXNzIEFwcGxpY2F0aW9uIFByb3RvY29sIEZvcnVtLCBMdGQuIDIwMDEuCi0KLQlUZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBXaXJlbGVzcyBBcHBsaWNhdGlvbiBQcm90b2NvbCBGb3J1bSBMdGQuIAotCVdlYiBzaXRlIChodHRwOi8vd3d3LndhcGZvcnVtLm9yZy93aGF0L2NvcHlyaWdodC5odG0pLgotICAgIAotLS0+Ci08IS0tIFRoaXMgaXMgdGhlIGRyaXZlciBmaWxlIGZvciB2ZXJzaW9uIDEuMCBvZiB0aGUgWEhUTUwgTW9iaWxlIERURC4KLQotICAgICBUaGlzIERURCBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICBQVUJMSUM6ICItLy9XQVBGT1JVTS8vRFREIFhIVE1MIE1vYmlsZSAxLjAvL0VOIgotICAgICBTWVNURU06ICJodHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQveGh0bWwtbW9iaWxlMTAuZHRkIgotLS0+Ci08IUVOVElUWSAlIFhIVE1MLnZlcnNpb24gICItLy9XQVBGT1JVTS8vRFREIFhIVE1MIE1vYmlsZSAxLjAvL0VOIiA+Ci0KLTwhLS0gVXNlIHRoaXMgVVJJIHRvIGlkZW50aWZ5IHRoZSBkZWZhdWx0IG5hbWVzcGFjZToKLQotICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0KLSAgICAgU2VlIHRoZSBRdWFsaWZpZWQgTmFtZXMgbW9kdWxlIGZvciBpbmZvcm1hdGlvbgotICAgICBvbiB0aGUgdXNlIG9mIG5hbWVzcGFjZSBwcmVmaXhlcyBpbiB0aGUgRFRELgotLS0+Ci08IUVOVElUWSAlIE5TLnByZWZpeGVkICJJR05PUkUiID4KLTwhRU5USVRZICUgWEhUTUwucHJlZml4ICAiIiA+Ci0KLTwhLS0gRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgdXNpbmcgWEhUTUwgTW9iaWxlIDEuMCBkaXJlY3RseSwgdXNlCi0gICAgIHRoZSBGUEkgaW4gdGhlIERPQ1RZUEUgZGVjbGFyYXRpb24sIHdpdGggdGhlIHhtbG5zIGF0dHJpYnV0ZQotICAgICBvbiB0aGUgZG9jdW1lbnQgZWxlbWVudCB0byBpZGVudGlmeSB0aGUgZGVmYXVsdCBuYW1lc3BhY2U6Ci0KLSAgICAgICAgIDw/eG1sIHZlcnNpb249IjEuMCI/PgotICAgICAgICAgPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XQVBGT1JVTS8vRFREIFhIVE1MIE1vYmlsZSAxLjAvL0VOIgotICAgICAgICAgICAgICJodHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQveGh0bWwtbW9iaWxlMTAuZHRkIiA+Ci0gICAgICAgICA8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlbiIgPgotICAgICAgICAgLi4uCi0gICAgICAgICA8L2h0bWw+Ci0tLT4KLQotPCEtLSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSB3aXRoIGRvY3VtZW50IHByb2ZpbGVzIC0tPgotPCFFTlRJVFkgJSBYSFRNTC5wcm9maWxlICAiIiA+Ci0KLTwhLS0gSW5saW5lIFN0eWxlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtaW5sc3R5bGUubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbmxpbmUgU3R5bGUgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaW5sc3R5bGUtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSW5saW5lIFN0eWxlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaW5sc3R5bGUtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgSW5saW5lIFN0eWxlIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaW5sc3R5bGUtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSW5saW5lIFN0eWxlCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlICdzdHlsZScgYXR0cmlidXRlLCB1c2VkIHRvIHN1cHBvcnQgaW5saW5lCi0gICAgIHN0eWxlIG1hcmt1cC4gVGhpcyBtb2R1bGUgbXVzdCBiZSBpbnN0YW50aWF0ZWQgcHJpb3IgdG8gdGhlIFhIVE1MCi0gICAgIENvbW1vbiBBdHRyaWJ1dGVzIG1vZHVsZSBpbiBvcmRlciB0byBiZSBpbmNsdWRlZCBpbiAlQ29yZS5hdHRyaWI7LgotLS0+Ci0KLTwhRU5USVRZICUgc3R5bGUuYXR0cmliCi0gICAgICJzdHlsZSAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi0KLTwhRU5USVRZICUgQ29yZS5leHRyYS5hdHRyaWIKLSAgICAgIiVzdHlsZS5hdHRyaWI7IgotPgotCi08IS0tIGVuZCBvZiB4aHRtbC1pbmxzdHlsZS0xLm1vZCAtLT4KLQotCi08IS0tIERvY3VtZW50IE1vZGVsIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLW1vZGVsLm1vZAotICAgICBQVUJMSUMgIi0vL1dBUEZPUlVNLy9FTlRJVElFUyBYSFRNTCBNb2JpbGUgMS4wIERvY3VtZW50IE1vZGVsIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3hodG1sLW1vYmlsZTEwLW1vZGVsLTEubW9kIiA+Ci0KLTwhLS0gWEhUTUwgRnJhbWV3b3JrIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIFhIVE1MLmJpZGkgICJJR05PUkUiID4KLTwhRU5USVRZICUgeGh0bWwtZnJhbWV3b3JrLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgTW9kdWxhciBGcmFtZXdvcmsgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtZnJhbWV3b3JrLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIE1vZHVsYXIgRnJhbWV3b3JrIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWZyYW1ld29yay0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgTW9kdWxhciBGcmFtZXdvcmsgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1mcmFtZXdvcmstMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTW9kdWxhciBGcmFtZXdvcmsKLQotICAgICBUaGlzIHJlcXVpcmVkIG1vZHVsZSBpbnN0YW50aWF0ZXMgdGhlIG1vZHVsZXMgbmVlZGVkCi0gICAgIHRvIHN1cHBvcnQgdGhlIFhIVE1MIG1vZHVsYXJpemF0aW9uIG1vZGVsLCBpbmNsdWRpbmc6Ci0KLSAgICAgICAgKyAgbm90YXRpb25zCi0gICAgICAgICsgIGRhdGF0eXBlcwotICAgICAgICArICBuYW1lc3BhY2UtcXVhbGlmaWVkIG5hbWVzCi0gICAgICAgICsgIGNvbW1vbiBhdHRyaWJ1dGVzCi0gICAgICAgICsgIGRvY3VtZW50IG1vZGVsCi0gICAgICAgICsgIGNoYXJhY3RlciBlbnRpdGllcwotCi0gICAgIFRoZSBJbnRyaW5zaWMgRXZlbnRzIG1vZHVsZSBpcyBpZ25vcmVkIGJ5IGRlZmF1bHQgYnV0Ci0gICAgIG9jY3VycyBpbiB0aGlzIG1vZHVsZSBiZWNhdXNlIGl0IG11c3QgYmUgaW5zdGFudGlhdGVkCi0gICAgIHByaW9yIHRvIEF0dHJpYnV0ZXMgYnV0IGFmdGVyIERhdGF0eXBlcy4KLS0tPgotCi08IUVOVElUWSAlIHhodG1sLWFyY2gubW9kdWxlICJJR05PUkUiID4KLTwhWyV4aHRtbC1hcmNoLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWFyY2gubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNlIEFyY2hpdGVjdHVyZSAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWFyY2gtMS5tb2QiID4KLSV4aHRtbC1hcmNoLm1vZDtdXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1ub3RhdGlvbnMubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtbm90YXRpb25zLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLW5vdGF0aW9ucy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OUyBYSFRNTCBOb3RhdGlvbnMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1ub3RhdGlvbnMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgTm90YXRpb25zIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtbm90YXRpb25zLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OUyBYSFRNTCBOb3RhdGlvbnMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1ub3RhdGlvbnMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTm90YXRpb25zCi0KLSAgICAgZGVmaW5lcyB0aGUgZm9sbG93aW5nIG5vdGF0aW9ucywgbWFueSBvZiB0aGVzZSBpbXBvcnRlZCBmcm9tCi0gICAgIG90aGVyIHNwZWNpZmljYXRpb25zIGFuZCBzdGFuZGFyZHMuIFdoZW4gYW4gZXhpc3RpbmcgRlBJIGlzCi0gICAgIGtub3duLCBpdCBpcyBpbmNvcnBvcmF0ZWQgaGVyZS4KLS0tPgotCi08IS0tIFhNTCBOb3RhdGlvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gU0dNTCBhbmQgWE1MIE5vdGF0aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFczQyBYTUwgMS4wIFJlY29tbWVuZGF0aW9uIC0tPgotPCFOT1RBVElPTiB3M2MteG1sCi0gICAgIFBVQkxJQyAiSVNPIDg4NzkvL05PVEFUSU9OIEV4dGVuc2libGUgTWFya3VwIExhbmd1YWdlIChYTUwpIDEuMC8vRU4iID4KLQotPCEtLSBYTUwgMS4wIENEQVRBIC0tPgotPCFOT1RBVElPTiBjZGF0YQotICAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWE1MIDEuMDogQ0RBVEEvL0VOIiA+Ci0KLTwhLS0gU0dNTCBGb3JtYWwgUHVibGljIElkZW50aWZpZXJzIC0tPgotPCFOT1RBVElPTiBmcGkKLSAgICAgUFVCTElDICJJU08gODg3OToxOTg2Ly9OT1RBVElPTiBGb3JtYWwgUHVibGljIElkZW50aWZpZXIvL0VOIiA+Ci0KLTwhLS0gWEhUTUwgTm90YXRpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIExlbmd0aCBkZWZpbmVkIGZvciBjZWxscGFkZGluZy9jZWxsc3BhY2luZyAtLT4KLQotPCEtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci08IU5PVEFUSU9OIGxlbmd0aAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTGVuZ3RoLy9FTiIgPgotCi08IS0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGxpbmsgdHlwZXMgLS0+Ci08IU5PVEFUSU9OIGxpbmtUeXBlcwotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTGlua1R5cGVzLy9FTiIgPgotCi08IS0tIHNpbmdsZSBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSBkZXNjcmlwdG9ycyAtLT4KLTwhTk9UQVRJT04gbWVkaWFEZXNjCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBNZWRpYURlc2MvL0VOIiA+Ci0KLTwhLS0gcGl4ZWwsIHBlcmNlbnRhZ2UsIG9yIHJlbGF0aXZlIC0tPgotPCFOT1RBVElPTiBtdWx0aUxlbmd0aAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTXVsdGlMZW5ndGgvL0VOIiA+Ci0KLTwhLS0gb25lIG9yIG1vcmUgZGlnaXRzIChOVU1CRVIpIC0tPgotPCFOT1RBVElPTiBudW1iZXIKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IE51bWJlci8vRU4iID4KLQotPCEtLSBpbnRlZ2VyIHJlcHJlc2VudGluZyBsZW5ndGggaW4gcGl4ZWxzIC0tPgotPCFOT1RBVElPTiBwaXhlbHMKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFBpeGVscy8vRU4iID4KLQotPCEtLSBzY3JpcHQgZXhwcmVzc2lvbiAtLT4KLTwhTk9UQVRJT04gc2NyaXB0Ci0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBTY3JpcHQvL0VOIiA+Ci0KLTwhLS0gdGV4dHVhbCBjb250ZW50IC0tPgotPCFOT1RBVElPTiB0ZXh0Ci0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBUZXh0Ly9FTiIgPgotCi08IS0tIEltcG9ydGVkIE5vdGF0aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSBbSVNPMTA2NDZdIC0tPgotPCFOT1RBVElPTiBjaGFyYWN0ZXIKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IENoYXJhY3Rlci8vRU4iID4KLQotPCEtLSBhIGNoYXJhY3RlciBlbmNvZGluZywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhTk9UQVRJT04gY2hhcnNldAotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogQ2hhcnNldC8vRU4iID4KLQotPCEtLSBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNoYXJhY3RlciBlbmNvZGluZ3MsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IU5PVEFUSU9OIGNoYXJzZXRzCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDaGFyc2V0cy8vRU4iID4KLQotPCEtLSBtZWRpYSB0eXBlLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFOT1RBVElPTiBjb250ZW50VHlwZQotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogQ29udGVudFR5cGUvL0VOIiA+Ci0KLTwhLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgdHlwZXMsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IU5PVEFUSU9OIGNvbnRlbnRUeXBlcwotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogQ29udGVudFR5cGVzLy9FTiIgPgotCi08IS0tIGRhdGUgYW5kIHRpbWUgaW5mb3JtYXRpb24uIElTTyBkYXRlIGZvcm1hdCAtLT4KLTwhTk9UQVRJT04gZGF0ZXRpbWUKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IERhdGV0aW1lLy9FTiIgPgotCi08IS0tIGEgbGFuZ3VhZ2UgY29kZSwgYXMgcGVyIFtSRkMzMDY2XSAtLT4KLTwhTk9UQVRJT04gbGFuZ3VhZ2VDb2RlCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBMYW5ndWFnZUNvZGUvL0VOIiA+Ci0KLTwhLS0gYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIsIHNlZSBbVVJJXSAtLT4KLTwhTk9UQVRJT04gdXJpCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBVUkkvL0VOIiA+Ci0KLTwhLS0gYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXJzLCBzZWUgW1VSSV0gLS0+Ci08IU5PVEFUSU9OIHVyaXMKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFVSSXMvL0VOIiA+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLW5vdGF0aW9ucy0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWRhdGF0eXBlcy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1kYXRhdHlwZXMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtZGF0YXR5cGVzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgRGF0YXR5cGVzIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtZGF0YXR5cGVzLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIERhdGF0eXBlcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWRhdGF0eXBlcy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgRGF0YXR5cGVzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtZGF0YXR5cGVzLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIERhdGF0eXBlcwotCi0gICAgIGRlZmluZXMgY29udGFpbmVycyBmb3IgdGhlIGZvbGxvd2luZyBkYXRhdHlwZXMsIG1hbnkgb2YKLSAgICAgdGhlc2UgaW1wb3J0ZWQgZnJvbSBvdGhlciBzcGVjaWZpY2F0aW9ucyBhbmQgc3RhbmRhcmRzLgotLS0+Ci0KLTwhLS0gTGVuZ3RoIGRlZmluZWQgZm9yIGNlbGxwYWRkaW5nL2NlbGxzcGFjaW5nIC0tPgotCi08IS0tIG5uIGZvciBwaXhlbHMgb3Igbm4lIGZvciBwZXJjZW50YWdlIGxlbmd0aCAtLT4KLTwhRU5USVRZICUgTGVuZ3RoLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGxpbmsgdHlwZXMgLS0+Ci08IUVOVElUWSAlIExpbmtUeXBlcy5kYXRhdHlwZSAiTk1UT0tFTlMiID4KLQotPCEtLSBzaW5nbGUgb3IgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgZGVzY3JpcHRvcnMgLS0+Ci08IUVOVElUWSAlIE1lZGlhRGVzYy5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBwaXhlbCwgcGVyY2VudGFnZSwgb3IgcmVsYXRpdmUgLS0+Ci08IUVOVElUWSAlIE11bHRpTGVuZ3RoLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIG9uZSBvciBtb3JlIGRpZ2l0cyAoTlVNQkVSKSAtLT4KLTwhRU5USVRZICUgTnVtYmVyLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGludGVnZXIgcmVwcmVzZW50aW5nIGxlbmd0aCBpbiBwaXhlbHMgLS0+Ci08IUVOVElUWSAlIFBpeGVscy5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBzY3JpcHQgZXhwcmVzc2lvbiAtLT4KLTwhRU5USVRZICUgU2NyaXB0LmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIHRleHR1YWwgY29udGVudCAtLT4KLTwhRU5USVRZICUgVGV4dC5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBJbXBvcnRlZCBEYXRhdHlwZXMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gW0lTTzEwNjQ2XSAtLT4KLTwhRU5USVRZICUgQ2hhcmFjdGVyLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGEgY2hhcmFjdGVyIGVuY29kaW5nLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFFTlRJVFkgJSBDaGFyc2V0LmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhRU5USVRZICUgQ2hhcnNldHMuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gQ29sb3Igc3BlY2lmaWNhdGlvbiB1c2luZyBjb2xvciBuYW1lIG9yIHNSR0IgKCNSUkdHQkIpIHZhbHVlcyAtLT4KLTwhRU5USVRZICUgQ29sb3IuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gbWVkaWEgdHlwZSwgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhRU5USVRZICUgQ29udGVudFR5cGUuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgdHlwZXMsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IUVOVElUWSAlIENvbnRlbnRUeXBlcy5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBkYXRlIGFuZCB0aW1lIGluZm9ybWF0aW9uLiBJU08gZGF0ZSBmb3JtYXQgLS0+Ci08IUVOVElUWSAlIERhdGV0aW1lLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGZvcm1hbCBwdWJsaWMgaWRlbnRpZmllciwgYXMgcGVyIFtJU084ODc5XSAtLT4KLTwhRU5USVRZICUgRlBJLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGEgbGFuZ3VhZ2UgY29kZSwgYXMgcGVyIFtSRkMzMDY2XSAtLT4KLTwhRU5USVRZICUgTGFuZ3VhZ2VDb2RlLmRhdGF0eXBlICJOTVRPS0VOIiA+Ci0KLTwhLS0gYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIsIHNlZSBbVVJJXSAtLT4KLTwhRU5USVRZICUgVVJJLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVycywgc2VlIFtVUkldIC0tPgotPCFFTlRJVFkgJSBVUklzLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGVuZCBvZiB4aHRtbC1kYXRhdHlwZXMtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBwbGFjZWhvbGRlciBmb3IgWExpbmsgc3VwcG9ydCBtb2R1bGUgLS0+Ci08IUVOVElUWSAlIHhodG1sLXhsaW5rLm1vZCAiIiA+Ci0KLQotPCFFTlRJVFkgJSB4aHRtbC1xbmFtZS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1xbmFtZS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1xbmFtZS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIFF1YWxpZmllZCBOYW1lcyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLXFuYW1lLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBRbmFtZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtcW5hbWUtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIFF1YWxpZmllZCBOYW1lcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXFuYW1lLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSMyMDAwLTEwLTIyOiBhZGRlZCBxbmFtZSBkZWNsYXJhdGlvbnMgZm9yIHJ1YnkgZWxlbWVudHMKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gWEhUTUwgUW5hbWUgKFF1YWxpZmllZCBOYW1lKSBNb2R1bGUKLQotICAgICBUaGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4gdHdvIHBhcnRzLCBsYWJlbGVkIFNlY3Rpb24gJ0EnIGFuZCAnQic6Ci0KLSAgICAgICBTZWN0aW9uIEEgZGVjbGFyZXMgcGFyYW1ldGVyIGVudGl0aWVzIHRvIHN1cHBvcnQgbmFtZXNwYWNlLQotICAgICAgIHF1YWxpZmllZCBuYW1lcywgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucywgYW5kIG5hbWUgcHJlZml4aW5nCi0gICAgICAgZm9yIFhIVE1MIGFuZCBleHRlbnNpb25zLgotCi0gICAgICAgU2VjdGlvbiBCIGRlY2xhcmVzIHBhcmFtZXRlciBlbnRpdGllcyB1c2VkIHRvIHByb3ZpZGUKLSAgICAgICBuYW1lc3BhY2UtcXVhbGlmaWVkIG5hbWVzIGZvciBhbGwgWEhUTUwgZWxlbWVudCB0eXBlczoKLQotICAgICAgICAgJWFwcGxldC5xbmFtZTsgICB0aGUgeG1sbnMtcXVhbGlmaWVkIG5hbWUgZm9yIDxhcHBsZXQ+Ci0gICAgICAgICAlYmFzZS5xbmFtZTsgICAgIHRoZSB4bWxucy1xdWFsaWZpZWQgbmFtZSBmb3IgPGJhc2U+Ci0gICAgICAgICAuLi4KLQotICAgICBYSFRNTCBleHRlbnNpb25zIHdvdWxkIGNyZWF0ZSBhIG1vZHVsZSBzaW1pbGFyIHRvIHRoaXMgb25lLgotICAgICBJbmNsdWRlZCBpbiB0aGUgWEhUTUwgZGlzdHJpYnV0aW9uIGlzIGEgdGVtcGxhdGUgbW9kdWxlCi0gICAgICgndGVtcGxhdGUtcW5hbWUtMS5tb2QnKSBzdWl0YWJsZSBmb3IgdGhpcyBwdXJwb3NlLgotLS0+Ci0KLTwhLS0gU2VjdGlvbiBBOiBYSFRNTCBYTUwgTmFtZXNwYWNlIEZyYW1ld29yayA6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OiAtLT4KLQotPCEtLSAxLiBEZWNsYXJlIGEgJVhIVE1MLnByZWZpeGVkOyBjb25kaXRpb25hbCBzZWN0aW9uIGtleXdvcmQsIHVzZWQKLSAgICAgICAgdG8gYWN0aXZhdGUgbmFtZXNwYWNlIHByZWZpeGluZy4gVGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkCi0gICAgICAgIGluaGVyaXQgJyVOUy5wcmVmaXhlZDsnIGZyb20gdGhlIERURCBkcml2ZXIsIHNvIHRoYXQgdW5sZXNzCi0gICAgICAgIG92ZXJyaWRkZW4sIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb2xsb3dzIHRoZSBvdmVyYWxsIERURAotICAgICAgICBwcmVmaXhpbmcgc2NoZW1lLgotLS0+Ci08IUVOVElUWSAlIE5TLnByZWZpeGVkICJJR05PUkUiID4KLTwhRU5USVRZICUgWEhUTUwucHJlZml4ZWQgIiVOUy5wcmVmaXhlZDsiID4KLQotPCEtLSAyLiBEZWNsYXJlIGEgcGFyYW1ldGVyIGVudGl0eSAoZWcuLCAlWEhUTUwueG1sbnM7KSBjb250YWluaW5nCi0gICAgICAgIHRoZSBVUkkgcmVmZXJlbmNlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIFhIVE1MIG5hbWVzcGFjZToKLS0tPgotPCFFTlRJVFkgJSBYSFRNTC54bWxucyAgImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiID4KLQotPCEtLSAzLiBEZWNsYXJlIHBhcmFtZXRlciBlbnRpdGllcyAoZWcuLCAlWEhUTUwucHJlZml4OykgY29udGFpbmluZwotICAgICAgICB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgcHJlZml4IHN0cmluZyhzKSB0byB1c2Ugd2hlbiBwcmVmaXhpbmcKLSAgICAgICAgaXMgZW5hYmxlZC4gVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBpbiB0aGUgRFREIGRyaXZlciBvciB0aGUKLSAgICAgICAgaW50ZXJuYWwgc3Vic2V0IG9mIGFuIGRvY3VtZW50IGluc3RhbmNlLiBJZiBubyBkZWZhdWx0IHByZWZpeAotICAgICAgICBpcyBkZXNpcmVkLCB0aGlzIG1heSBiZSBkZWNsYXJlZCBhcyBhbiBlbXB0eSBzdHJpbmcuCi0KLSAgICAgTk9URTogQXMgc3BlY2lmaWVkIGluIFtYTUxOQU1FU10sIHRoZSBuYW1lc3BhY2UgcHJlZml4IHNlcnZlcwotICAgICBhcyBhIHByb3h5IGZvciB0aGUgVVJJIHJlZmVyZW5jZSwgYW5kIGlzIG5vdCBpbiBpdHNlbGYgc2lnbmlmaWNhbnQuCi0tLT4KLTwhRU5USVRZICUgWEhUTUwucHJlZml4ICAiIiA+Ci0KLTwhLS0gNC4gRGVjbGFyZSBwYXJhbWV0ZXIgZW50aXRpZXMgKGVnLiwgJVhIVE1MLnBmeDspIGNvbnRhaW5pbmcgdGhlCi0gICAgICAgIGNvbG9uaXplZCBwcmVmaXgoZXMpIChlZy4sICclWEhUTUwucHJlZml4OzonKSB1c2VkIHdoZW4KLSAgICAgICAgcHJlZml4aW5nIGlzIGFjdGl2ZSwgYW4gZW1wdHkgc3RyaW5nIHdoZW4gaXQgaXMgbm90LgotLS0+Ci08IVslWEhUTUwucHJlZml4ZWQ7WwotPCFFTlRJVFkgJSBYSFRNTC5wZnggICIlWEhUTUwucHJlZml4OzoiID4KLV1dPgotPCFFTlRJVFkgJSBYSFRNTC5wZnggICIiID4KLQotPCEtLSBkZWNsYXJlIHF1YWxpZmllZCBuYW1lIGV4dGVuc2lvbnMgaGVyZSAuLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXFuYW1lLWV4dHJhLm1vZCAiIiA+Ci0KLQotPCEtLSA1LiBUaGUgcGFyYW1ldGVyIGVudGl0eSAlWEhUTUwueG1sbnMuZXh0cmEuYXR0cmliOyBtYXkgYmUKLSAgICAgICAgcmVkZWNsYXJlZCB0byBjb250YWluIGFueSBub24tWEhUTUwgbmFtZXNwYWNlIGRlY2xhcmF0aW9uCi0gICAgICAgIGF0dHJpYnV0ZXMgZm9yIG5hbWVzcGFjZXMgZW1iZWRkZWQgaW4gWEhUTUwuIFRoZSBkZWZhdWx0Ci0gICAgICAgIGlzIGFuIGVtcHR5IHN0cmluZy4gIFhMaW5rIHNob3VsZCBiZSBpbmNsdWRlZCBoZXJlIGlmIHVzZWQKLSAgICAgICAgaW4gdGhlIERURC4KLS0tPgotPCFFTlRJVFkgJSBYSFRNTC54bWxucy5leHRyYS5hdHRyaWIgIiIgPgotCi08IS0tIFRoZSByZW1haW5kZXIgb2YgU2VjdGlvbiBBIGlzIG9ubHkgZm9sbG93ZWQgaW4gWEhUTUwsIG5vdCBleHRlbnNpb25zLiAtLT4KLQotPCEtLSBEZWNsYXJlIGEgcGFyYW1ldGVyIGVudGl0eSAlTlMuZGVjbC5hdHRyaWI7IGNvbnRhaW5pbmcKLSAgICAgYWxsIFhNTCBOYW1lc3BhY2UgZGVjbGFyYXRpb25zIHVzZWQgaW4gdGhlIERURCwgcGx1cyB0aGUKLSAgICAgeG1sbnMgZGVjbGFyYXRpb24gZm9yIFhIVE1MLCBpdHMgZm9ybSBkZXBlbmRlbnQgb24gd2hldGhlcgotICAgICBwcmVmaXhpbmcgaXMgYWN0aXZlLgotLS0+Ci08IVslWEhUTUwucHJlZml4ZWQ7WwotPCFFTlRJVFkgJSBOUy5kZWNsLmF0dHJpYgotICAgICAieG1sbnM6JVhIVE1MLnByZWZpeDsgICVVUkkuZGF0YXR5cGU7ICAgI0ZJWEVEICclWEhUTUwueG1sbnM7JwotICAgICAgJVhIVE1MLnhtbG5zLmV4dHJhLmF0dHJpYjsiCi0+Ci1dXT4KLTwhRU5USVRZICUgTlMuZGVjbC5hdHRyaWIKLSAgICAgIiVYSFRNTC54bWxucy5leHRyYS5hdHRyaWI7IgotPgotCi08IS0tIFRoaXMgaXMgYSBwbGFjZWhvbGRlciBmb3IgZnV0dXJlIFhMaW5rIHN1cHBvcnQuCi0tLT4KLTwhRU5USVRZICUgWExJTksueG1sbnMuYXR0cmliICIiID4KLQotPCEtLSBEZWNsYXJlIGEgcGFyYW1ldGVyIGVudGl0eSAlTlMuZGVjbC5hdHRyaWI7IGNvbnRhaW5pbmcgYWxsCi0gICAgIFhNTCBuYW1lc3BhY2UgZGVjbGFyYXRpb24gYXR0cmlidXRlcyB1c2VkIGJ5IFhIVE1MLCBpbmNsdWRpbmcKLSAgICAgYSBkZWZhdWx0IHhtbG5zIGF0dHJpYnV0ZSB3aGVuIHByZWZpeGluZyBpcyBpbmFjdGl2ZS4KLS0tPgotPCFbJVhIVE1MLnByZWZpeGVkO1sKLTwhRU5USVRZICUgWEhUTUwueG1sbnMuYXR0cmliCi0gICAgICIlTlMuZGVjbC5hdHRyaWI7Ci0gICAgICAlWExJTksueG1sbnMuYXR0cmliOyIKLT4KLV1dPgotPCFFTlRJVFkgJSBYSFRNTC54bWxucy5hdHRyaWIKLSAgICAgInhtbG5zICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0ZJWEVEICclWEhUTUwueG1sbnM7JwotICAgICAgJVhMSU5LLnhtbG5zLmF0dHJpYjsiCi0+Ci0KLTwhLS0gcGxhY2Vob2xkZXIgZm9yIHF1YWxpZmllZCBuYW1lIHJlZGVjbGFyYXRpb25zIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1xbmFtZS5yZWRlY2wgIiIgPgotCi0KLTwhLS0gU2VjdGlvbiBCOiBYSFRNTCBRdWFsaWZpZWQgTmFtZXMgOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjogLS0+Ci0KLTwhLS0gNi4gVGhpcyBzZWN0aW9uIGRlY2xhcmVzIHBhcmFtZXRlciBlbnRpdGllcyB1c2VkIHRvIHByb3ZpZGUKLSAgICAgICAgbmFtZXNwYWNlLXF1YWxpZmllZCBuYW1lcyBmb3IgYWxsIFhIVE1MIGVsZW1lbnQgdHlwZXMuCi0tLT4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1hcHBsZXQtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGFwcGxldC5xbmFtZSAgIiVYSFRNTC5wZng7YXBwbGV0IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYmFzZS0xLm1vZCAtLT4KLTwhRU5USVRZICUgYmFzZS5xbmFtZSAgICAiJVhIVE1MLnBmeDtiYXNlIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYmRvLTEubW9kIC0tPgotPCFFTlRJVFkgJSBiZG8ucW5hbWUgICAgICIlWEhUTUwucGZ4O2JkbyIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWJsa3BocmFzLTEubW9kIC0tPgotPCFFTlRJVFkgJSBhZGRyZXNzLnFuYW1lICIlWEhUTUwucGZ4O2FkZHJlc3MiID4KLTwhRU5USVRZICUgYmxvY2txdW90ZS5xbmFtZSAgIiVYSFRNTC5wZng7YmxvY2txdW90ZSIgPgotPCFFTlRJVFkgJSBwcmUucW5hbWUgICAgICIlWEhUTUwucGZ4O3ByZSIgPgotPCFFTlRJVFkgJSBoMS5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2gxIiA+Ci08IUVOVElUWSAlIGgyLnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDIiID4KLTwhRU5USVRZICUgaDMucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoMyIgPgotPCFFTlRJVFkgJSBoNC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2g0IiA+Ci08IUVOVElUWSAlIGg1LnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDUiID4KLTwhRU5USVRZICUgaDYucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoNiIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWJsa3ByZXMtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGhyLnFuYW1lICAgICAgIiVYSFRNTC5wZng7aHIiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1ibGtzdHJ1Y3QtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGRpdi5xbmFtZSAgICAgIiVYSFRNTC5wZng7ZGl2IiA+Ci08IUVOVElUWSAlIHAucW5hbWUgICAgICAgIiVYSFRNTC5wZng7cCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWVkaXQtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGlucy5xbmFtZSAgICAgIiVYSFRNTC5wZng7aW5zIiA+Ci08IUVOVElUWSAlIGRlbC5xbmFtZSAgICAgIiVYSFRNTC5wZng7ZGVsIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtZm9ybS0xLm1vZCAtLT4KLTwhRU5USVRZICUgZm9ybS5xbmFtZSAgICAiJVhIVE1MLnBmeDtmb3JtIiA+Ci08IUVOVElUWSAlIGxhYmVsLnFuYW1lICAgIiVYSFRNTC5wZng7bGFiZWwiID4KLTwhRU5USVRZICUgaW5wdXQucW5hbWUgICAiJVhIVE1MLnBmeDtpbnB1dCIgPgotPCFFTlRJVFkgJSBzZWxlY3QucW5hbWUgICIlWEhUTUwucGZ4O3NlbGVjdCIgPgotPCFFTlRJVFkgJSBvcHRncm91cC5xbmFtZSAgIiVYSFRNTC5wZng7b3B0Z3JvdXAiID4KLTwhRU5USVRZICUgb3B0aW9uLnFuYW1lICAiJVhIVE1MLnBmeDtvcHRpb24iID4KLTwhRU5USVRZICUgdGV4dGFyZWEucW5hbWUgICIlWEhUTUwucGZ4O3RleHRhcmVhIiA+Ci08IUVOVElUWSAlIGZpZWxkc2V0LnFuYW1lICAiJVhIVE1MLnBmeDtmaWVsZHNldCIgPgotPCFFTlRJVFkgJSBsZWdlbmQucW5hbWUgICIlWEhUTUwucGZ4O2xlZ2VuZCIgPgotPCFFTlRJVFkgJSBidXR0b24ucW5hbWUgICIlWEhUTUwucGZ4O2J1dHRvbiIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWh5cGVydGV4dC0xLm1vZCAtLT4KLTwhRU5USVRZICUgYS5xbmFtZSAgICAgICAiJVhIVE1MLnBmeDthIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaW1hZ2UtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGltZy5xbmFtZSAgICAgIiVYSFRNTC5wZng7aW1nIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaW5scGhyYXMtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGFiYnIucW5hbWUgICAgIiVYSFRNTC5wZng7YWJiciIgPgotPCFFTlRJVFkgJSBhY3JvbnltLnFuYW1lICIlWEhUTUwucGZ4O2Fjcm9ueW0iID4KLTwhRU5USVRZICUgY2l0ZS5xbmFtZSAgICAiJVhIVE1MLnBmeDtjaXRlIiA+Ci08IUVOVElUWSAlIGNvZGUucW5hbWUgICAgIiVYSFRNTC5wZng7Y29kZSIgPgotPCFFTlRJVFkgJSBkZm4ucW5hbWUgICAgICIlWEhUTUwucGZ4O2RmbiIgPgotPCFFTlRJVFkgJSBlbS5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2VtIiA+Ci08IUVOVElUWSAlIGtiZC5xbmFtZSAgICAgIiVYSFRNTC5wZng7a2JkIiA+Ci08IUVOVElUWSAlIHEucW5hbWUgICAgICAgIiVYSFRNTC5wZng7cSIgPgotPCFFTlRJVFkgJSBzYW1wLnFuYW1lICAgICIlWEhUTUwucGZ4O3NhbXAiID4KLTwhRU5USVRZICUgc3Ryb25nLnFuYW1lICAiJVhIVE1MLnBmeDtzdHJvbmciID4KLTwhRU5USVRZICUgdmFyLnFuYW1lICAgICAiJVhIVE1MLnBmeDt2YXIiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pbmxwcmVzLTEubW9kIC0tPgotPCFFTlRJVFkgJSBiLnFuYW1lICAgICAgICIlWEhUTUwucGZ4O2IiID4KLTwhRU5USVRZICUgYmlnLnFuYW1lICAgICAiJVhIVE1MLnBmeDtiaWciID4KLTwhRU5USVRZICUgaS5xbmFtZSAgICAgICAiJVhIVE1MLnBmeDtpIiA+Ci08IUVOVElUWSAlIHNtYWxsLnFuYW1lICAgIiVYSFRNTC5wZng7c21hbGwiID4KLTwhRU5USVRZICUgc3ViLnFuYW1lICAgICAiJVhIVE1MLnBmeDtzdWIiID4KLTwhRU5USVRZICUgc3VwLnFuYW1lICAgICAiJVhIVE1MLnBmeDtzdXAiID4KLTwhRU5USVRZICUgdHQucW5hbWUgICAgICAiJVhIVE1MLnBmeDt0dCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWlubHN0cnVjdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgYnIucW5hbWUgICAgICAiJVhIVE1MLnBmeDticiIgPgotPCFFTlRJVFkgJSBzcGFuLnFuYW1lICAgICIlWEhUTUwucGZ4O3NwYW4iID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pc21hcC0xLm1vZCAoYWxzbyBjc2lzbWFwLCBzc2lzbWFwKSAtLT4KLTwhRU5USVRZICUgbWFwLnFuYW1lICAgICAiJVhIVE1MLnBmeDttYXAiID4KLTwhRU5USVRZICUgYXJlYS5xbmFtZSAgICAiJVhIVE1MLnBmeDthcmVhIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtbGluay0xLm1vZCAtLT4KLTwhRU5USVRZICUgbGluay5xbmFtZSAgICAiJVhIVE1MLnBmeDtsaW5rIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtbGlzdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgZGwucW5hbWUgICAgICAiJVhIVE1MLnBmeDtkbCIgPgotPCFFTlRJVFkgJSBkdC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2R0IiA+Ci08IUVOVElUWSAlIGRkLnFuYW1lICAgICAgIiVYSFRNTC5wZng7ZGQiID4KLTwhRU5USVRZICUgb2wucW5hbWUgICAgICAiJVhIVE1MLnBmeDtvbCIgPgotPCFFTlRJVFkgJSB1bC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3VsIiA+Ci08IUVOVElUWSAlIGxpLnFuYW1lICAgICAgIiVYSFRNTC5wZng7bGkiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1tZXRhLTEubW9kIC0tPgotPCFFTlRJVFkgJSBtZXRhLnFuYW1lICAgICIlWEhUTUwucGZ4O21ldGEiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1wYXJhbS0xLm1vZCAtLT4KLTwhRU5USVRZICUgcGFyYW0ucW5hbWUgICAiJVhIVE1MLnBmeDtwYXJhbSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLW9iamVjdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgb2JqZWN0LnFuYW1lICAiJVhIVE1MLnBmeDtvYmplY3QiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1zY3JpcHQtMS5tb2QgLS0+Ci08IUVOVElUWSAlIHNjcmlwdC5xbmFtZSAgIiVYSFRNTC5wZng7c2NyaXB0IiA+Ci08IUVOVElUWSAlIG5vc2NyaXB0LnFuYW1lICAiJVhIVE1MLnBmeDtub3NjcmlwdCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXN0cnVjdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgaHRtbC5xbmFtZSAgICAiJVhIVE1MLnBmeDtodG1sIiA+Ci08IUVOVElUWSAlIGhlYWQucW5hbWUgICAgIiVYSFRNTC5wZng7aGVhZCIgPgotPCFFTlRJVFkgJSB0aXRsZS5xbmFtZSAgICIlWEhUTUwucGZ4O3RpdGxlIiA+Ci08IUVOVElUWSAlIGJvZHkucW5hbWUgICAgIiVYSFRNTC5wZng7Ym9keSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXN0eWxlLTEubW9kIC0tPgotPCFFTlRJVFkgJSBzdHlsZS5xbmFtZSAgICIlWEhUTUwucGZ4O3N0eWxlIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtdGFibGUtMS5tb2QgLS0+Ci08IUVOVElUWSAlIHRhYmxlLnFuYW1lICAgIiVYSFRNTC5wZng7dGFibGUiID4KLTwhRU5USVRZICUgY2FwdGlvbi5xbmFtZSAiJVhIVE1MLnBmeDtjYXB0aW9uIiA+Ci08IUVOVElUWSAlIHRoZWFkLnFuYW1lICAgIiVYSFRNTC5wZng7dGhlYWQiID4KLTwhRU5USVRZICUgdGZvb3QucW5hbWUgICAiJVhIVE1MLnBmeDt0Zm9vdCIgPgotPCFFTlRJVFkgJSB0Ym9keS5xbmFtZSAgICIlWEhUTUwucGZ4O3Rib2R5IiA+Ci08IUVOVElUWSAlIGNvbGdyb3VwLnFuYW1lICAiJVhIVE1MLnBmeDtjb2xncm91cCIgPgotPCFFTlRJVFkgJSBjb2wucW5hbWUgICAgICIlWEhUTUwucGZ4O2NvbCIgPgotPCFFTlRJVFkgJSB0ci5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3RyIiA+Ci08IUVOVElUWSAlIHRoLnFuYW1lICAgICAgIiVYSFRNTC5wZng7dGgiID4KLTwhRU5USVRZICUgdGQucW5hbWUgICAgICAiJVhIVE1MLnBmeDt0ZCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXJ1YnktMS5tb2QgLS0+Ci0KLTwhRU5USVRZICUgcnVieS5xbmFtZSAgICAiJVhIVE1MLnBmeDtydWJ5IiA+Ci08IUVOVElUWSAlIHJiYy5xbmFtZSAgICAgIiVYSFRNTC5wZng7cmJjIiA+Ci08IUVOVElUWSAlIHJ0Yy5xbmFtZSAgICAgIiVYSFRNTC5wZng7cnRjIiA+Ci08IUVOVElUWSAlIHJiLnFuYW1lICAgICAgIiVYSFRNTC5wZng7cmIiID4KLTwhRU5USVRZICUgcnQucW5hbWUgICAgICAiJVhIVE1MLnBmeDtydCIgPgotPCFFTlRJVFkgJSBycC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3JwIiA+Ci0KLTwhLS0gUHJvdmlzaW9uYWwgWEhUTUwgMi4wIFF1YWxpZmllZCBOYW1lcyAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pbWFnZS0yLm1vZCAtLT4KLTwhRU5USVRZICUgYWx0LnFuYW1lICAgICAiJVhIVE1MLnBmeDthbHQiID4KLQotPCEtLSBlbmQgb2YgeGh0bWwtcW5hbWUtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1ldmVudHMubW9kdWxlICJJR05PUkUiID4KLTwhWyV4aHRtbC1ldmVudHMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtZXZlbnRzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgSW50cmluc2ljIEV2ZW50cyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWV2ZW50cy0xLm1vZCIgPgotJXhodG1sLWV2ZW50cy5tb2Q7XV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtYXR0cmlicy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1hdHRyaWJzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWF0dHJpYnMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBDb21tb24gQXR0cmlidXRlcyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWF0dHJpYnMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQ29tbW9uIEF0dHJpYnV0ZXMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYXR0cmlicy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgQ29tbW9uIEF0dHJpYnV0ZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1hdHRyaWJzLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIENvbW1vbiBBdHRyaWJ1dGVzCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgbWFueSBvZiB0aGUgY29tbW9uIGF0dHJpYnV0ZXMgZm9yIHRoZSBYSFRNTCBEVEQuCi0gICAgICVOUy5kZWNsLmF0dHJpYjsgaXMgZGVjbGFyZWQgaW4gdGhlIFhIVE1MIFFuYW1lIG1vZHVsZS4KLS0tPgotCi08IUVOVElUWSAlIGlkLmF0dHJpYgotICAgICAiaWQgICAgICAgICAgIElEICAgICAgICAgICAgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCFFTlRJVFkgJSBjbGFzcy5hdHRyaWIKLSAgICAgImNsYXNzICAgICAgICBOTVRPS0VOUyAgICAgICAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhRU5USVRZICUgdGl0bGUuYXR0cmliCi0gICAgICJ0aXRsZSAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IUVOVElUWSAlIENvcmUuZXh0cmEuYXR0cmliICIiID4KLQotPCFFTlRJVFkgJSBDb3JlLmF0dHJpYgotICAgICAiJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgICVpZC5hdHRyaWI7Ci0gICAgICAlY2xhc3MuYXR0cmliOwotICAgICAgJXRpdGxlLmF0dHJpYjsKLSAgICAgICVDb3JlLmV4dHJhLmF0dHJpYjsiCi0+Ci0KLTwhRU5USVRZICUgbGFuZy5hdHRyaWIKLSAgICAgInhtbDpsYW5nICAgICAlTGFuZ3VhZ2VDb2RlLmRhdGF0eXBlOyAgI0lNUExJRUQiCi0+Ci0KLTwhWyVYSFRNTC5iaWRpO1sKLTwhRU5USVRZICUgZGlyLmF0dHJpYgotICAgICAiZGlyICAgICAgICAgICggbHRyIHwgcnRsICkgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCFFTlRJVFkgJSBJMThuLmF0dHJpYgotICAgICAiJWRpci5hdHRyaWI7Ci0gICAgICAlbGFuZy5hdHRyaWI7IgotPgotCi1dXT4KLTwhRU5USVRZICUgSTE4bi5hdHRyaWIKLSAgICAgIiVsYW5nLmF0dHJpYjsiCi0+Ci0KLTwhRU5USVRZICUgQ29tbW9uLmV4dHJhLmF0dHJpYiAiIiA+Ci0KLTwhLS0gaW50cmluc2ljIGV2ZW50IGF0dHJpYnV0ZXMgZGVjbGFyZWQgcHJldmlvdXNseQotLS0+Ci08IUVOVElUWSAlIEV2ZW50cy5hdHRyaWIgIiIgPgotCi08IUVOVElUWSAlIENvbW1vbi5hdHRyaWIKLSAgICAgIiVDb3JlLmF0dHJpYjsKLSAgICAgICVJMThuLmF0dHJpYjsKLSAgICAgICVFdmVudHMuYXR0cmliOwotICAgICAgJUNvbW1vbi5leHRyYS5hdHRyaWI7IgotPgotCi08IS0tIGVuZCBvZiB4aHRtbC1hdHRyaWJzLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gcGxhY2Vob2xkZXIgZm9yIGNvbnRlbnQgbW9kZWwgcmVkZWNsYXJhdGlvbnMgLS0+Ci08IUVOVElUWSAlIHhodG1sLW1vZGVsLnJlZGVjbCAiIiA+Ci0KLQotPCFFTlRJVFkgJSB4aHRtbC1tb2RlbC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1tb2RlbC5tb2R1bGU7WwotPCEtLSBpbnN0YW50aWF0ZSB0aGUgRG9jdW1lbnQgTW9kZWwgbW9kdWxlIGRlY2xhcmVkIGluIHRoZSBEVEQgZHJpdmVyCi0tLT4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIE1vYmlsZSAxLjAgRG9jdW1lbnQgTW9kZWwgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLW1vYmlsZTEwLW1vZGVsLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCBNb2JpbGUsIGEgcHJvcGVyIHN1YnNldCBvZiBYSFRNTC4KLSAgICAgCUBXaXJlbGVzcyBBcHBsaWNhdGlvbiBQcm90b2NvbCBGb3J1bSwgTHRkLiAyMDAxLgotCi0JVGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlIGFyZSBhdmFpbGFibGUgZnJvbSB0aGUgV2lyZWxlc3MgQXBwbGljYXRpb24gUHJvdG9jb2wgRm9ydW0gTHRkLiAKLQlXZWIgc2l0ZSAoaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvd2hhdC9jb3B5cmlnaHQuaHRtKS4KLSAgICAKLS0tPgotPCEtLSBYSFRNTCBNb2JpbGUgRG9jdW1lbnQgTW9kZWwKLQotICAgICBUaGlzIG1vZHVsZSBkZXNjcmliZXMgdGhlIGdyb3VwaW5ncyBvZiBlbGVtZW50cyB0aGF0IG1ha2UgdXAKLSAgICAgY29tbW9uIGNvbnRlbnQgbW9kZWxzIGZvciBYSFRNTCBlbGVtZW50cy4KLS0tPgotCi08IS0tIE9wdGlvbmFsIEVsZW1lbnRzIGluIGhlYWQgIC4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIEhlYWRPcHRzLm1peAotICAgICAiKCAlbWV0YS5xbmFtZTsgfCAlbGluay5xbmFtZTsgfCAlb2JqZWN0LnFuYW1lOyB8ICVzdHlsZS5xbmFtZTsgKSoiID4KLQotPCEtLSBNaXNjZWxsYW5lb3VzIEVsZW1lbnRzICAuLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBNaXNjLmNsYXNzICIiID4KLQotPCEtLSBJbmxpbmUgRWxlbWVudHMgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBJbmxTdHJ1Y3QuY2xhc3MgIiVici5xbmFtZTsgfCAlc3Bhbi5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBJbmxQaHJhcy5jbGFzcwotICAgICAifCAlZW0ucW5hbWU7IHwgJXN0cm9uZy5xbmFtZTsgfCAlZGZuLnFuYW1lOyB8ICVjb2RlLnFuYW1lOwotICAgICAgfCAlc2FtcC5xbmFtZTsgfCAla2JkLnFuYW1lOyB8ICV2YXIucW5hbWU7IHwgJWNpdGUucW5hbWU7Ci0gICAgICB8ICVhYmJyLnFuYW1lOyB8ICVhY3JvbnltLnFuYW1lOyB8ICVxLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIElubFByZXMuY2xhc3MKLSAgICAgInwgJWkucW5hbWU7IHwgJWIucW5hbWU7IHwgJWJpZy5xbmFtZTsgfCAlc21hbGwucW5hbWU7ICIgPgotCi0KLTwhRU5USVRZICUgSTE4bi5jbGFzcyAiIiA+Ci0KLTwhRU5USVRZICUgQW5jaG9yLmNsYXNzICJ8ICVhLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIElubFNwZWNpYWwuY2xhc3MgInwgJWltZy5xbmFtZTsgfCAlb2JqZWN0LnFuYW1lOyIgPgotCi08IUVOVElUWSAlIElubEZvcm0uY2xhc3MKLSAgICAgInwgJWlucHV0LnFuYW1lOyB8ICVzZWxlY3QucW5hbWU7IHwgJXRleHRhcmVhLnFuYW1lOwotICAgICAgfCAlbGFiZWwucW5hbWU7IgotPgotCi08IUVOVElUWSAlIElubGluZS5leHRyYSAiIiA+Ci0KLTwhRU5USVRZICUgSW5saW5lLmNsYXNzCi0gICAgICIlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgJUFuY2hvci5jbGFzczsKLSAgICAgICVJbmxTcGVjaWFsLmNsYXNzOwotICAgICAgJUlubEZvcm0uY2xhc3M7Ci0gICAgICAlSW5saW5lLmV4dHJhOyIKLT4KLQotPCFFTlRJVFkgJSBJbmxOb0FuY2hvci5jbGFzcwotICAgICAiJUlubFN0cnVjdC5jbGFzczsKLSAgICAgICVJbmxQaHJhcy5jbGFzczsKLSAgICAgICVJbmxTcGVjaWFsLmNsYXNzOwotICAgICAgJUlubEZvcm0uY2xhc3M7Ci0gICAgICAlSW5saW5lLmV4dHJhOyIKLT4KLQotPCFFTlRJVFkgJSBJbmxOb0FuY2hvci5taXgKLSAgICAgIiVJbmxOb0FuY2hvci5jbGFzczsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotPCFFTlRJVFkgJSBJbmxpbmUubWl4Ci0gICAgICIlSW5saW5lLmNsYXNzOwotICAgICAgJU1pc2MuY2xhc3M7IgotPgotCi08IS0tIEJsb2NrIEVsZW1lbnRzICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIEhlYWRpbmcuY2xhc3MKLSAgICAgIiVoMS5xbmFtZTsgfCAlaDIucW5hbWU7IHwgJWgzLnFuYW1lOwotICAgICAgfCAlaDQucW5hbWU7IHwgJWg1LnFuYW1lOyB8ICVoNi5xbmFtZTsiCi0+Ci08IUVOVElUWSAlIExpc3QuY2xhc3MgICIldWwucW5hbWU7IHwgJW9sLnFuYW1lOyB8ICVkbC5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBUYWJsZS5jbGFzcyAifCAldGFibGUucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgRm9ybS5jbGFzcyAgInwgJWZvcm0ucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgRmllbGRzZXQuY2xhc3MgICJ8ICVmaWVsZHNldC5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBCbGtTdHJ1Y3QuY2xhc3MgIiVwLnFuYW1lOyB8ICVkaXYucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgQmxrUGhyYXMuY2xhc3MKLSAgICAgInwgJXByZS5xbmFtZTsgfCAlYmxvY2txdW90ZS5xbmFtZTsgfCAlYWRkcmVzcy5xbmFtZTsiCi0+Ci0KLTwhRU5USVRZICUgQmxrUHJlcy5jbGFzcyAifCAlaHIucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgQmxrU3BlY2lhbC5jbGFzcwotICAgICAiJVRhYmxlLmNsYXNzOwotICAgICAgJUZvcm0uY2xhc3M7Ci0gICAgICAlRmllbGRzZXQuY2xhc3M7IgotPgotCi08IUVOVElUWSAlIEJsb2NrLmV4dHJhICIiID4KLQotPCFFTlRJVFkgJSBCbG9jay5jbGFzcwotICAgICAiJUJsa1N0cnVjdC5jbGFzczsKLSAgICAgICVCbGtQaHJhcy5jbGFzczsKLSAgICAgICVCbGtQcmVzLmNsYXNzOwotICAgICAgJUJsa1NwZWNpYWwuY2xhc3M7Ci0gICAgICAlQmxvY2suZXh0cmE7IgotPgotCi08IUVOVElUWSAlIEJsa05vRm9ybS5taXgKLSAgICAgIiVIZWFkaW5nLmNsYXNzOwotICAgICAgfCAlTGlzdC5jbGFzczsKLSAgICAgIHwgJUJsa1N0cnVjdC5jbGFzczsKLSAgICAgICVCbGtQaHJhcy5jbGFzczsKLSAgICAgICVCbGtQcmVzLmNsYXNzOwotICAgICAgJVRhYmxlLmNsYXNzOwotICAgICAgJUJsb2NrLmV4dHJhOwotICAgICAgJU1pc2MuY2xhc3M7IgotPgotCi08IUVOVElUWSAlIEJsb2NrLm1peAotICAgICAiJUhlYWRpbmcuY2xhc3M7Ci0gICAgICB8ICVMaXN0LmNsYXNzOwotICAgICAgfCAlQmxvY2suY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhLS0gQWxsIENvbnRlbnQgRWxlbWVudHMgIC4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gZGVjbGFyZXMgYWxsIGNvbnRlbnQgZXhjZXB0IHRhYmxlcwotLS0+Ci08IUVOVElUWSAlIEZsb3dOb1RhYmxlLm1peAotICAgICAiJUhlYWRpbmcuY2xhc3M7Ci0gICAgICB8ICVMaXN0LmNsYXNzOwotICAgICAgfCAlQmxrU3RydWN0LmNsYXNzOwotICAgICAgJUJsa1BocmFzLmNsYXNzOwotICAgICAgJUZvcm0uY2xhc3M7Ci0gICAgICAlQmxvY2suZXh0cmE7Ci0gICAgICB8ICVJbmxpbmUuY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLQotPCFFTlRJVFkgJSBGbG93Lm1peAotICAgICAiJUhlYWRpbmcuY2xhc3M7Ci0gICAgICB8ICVMaXN0LmNsYXNzOwotICAgICAgfCAlQmxvY2suY2xhc3M7Ci0gICAgICB8ICVJbmxpbmUuY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLW1vYmlsZTEwLW1vZGVsLTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtY2hhcmVudC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1jaGFyZW50Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWNoYXJlbnQubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBDaGFyYWN0ZXIgRW50aXRpZXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1jaGFyZW50LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIENoYXJhY3RlciBFbnRpdGllcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1jaGFyZW50LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBDaGFyYWN0ZXIgRW50aXRpZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1jaGFyZW50LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIENoYXJhY3RlciBFbnRpdGllcyBmb3IgWEhUTUwKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgc2V0IG9mIGNoYXJhY3RlciBlbnRpdGllcyBmb3IgWEhUTUwsCi0gICAgIGluY2x1ZGluZyB0aGUgTGF0aW4gMSwgU3ltYm9sIGFuZCBTcGVjaWFsIGNoYXJhY3RlciBjb2xsZWN0aW9ucy4KLS0tPgotCi08IUVOVElUWSAlIHhodG1sLWxhdDEKLSAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4gMSBmb3IgWEhUTUwvL0VOIgotICAgICAgICAgICAieGh0bWwtbGF0MS5lbnQiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWE1MLWNvbXBhdGlibGUgSVNPIExhdGluIDEgQ2hhcmFjdGVyIEVudGl0eSBTZXQgZm9yIFhIVE1MIC4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtbGF0MS5lbnQKLQotICAgICBUeXBpY2FsIGludm9jYXRpb246Ci0KLSAgICAgICA8IUVOVElUWSAlIHhodG1sLWxhdDEKLSAgICAgICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIExhdGluIDEgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgICAgICAgICAgICJ4aHRtbC1sYXQxLmVudCIgPgotICAgICAgICV4aHRtbC1sYXQxOwotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBMYXRpbiAxIGZvciBYSFRNTC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbGF0MS5lbnQiCi0KLSAgICAgUmV2aXNpb246ICAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgUG9ydGlvbnMgKEMpIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24gMTk4NjoKLSAgICAgUGVybWlzc2lvbiB0byBjb3B5IGluIGFueSBmb3JtIGlzIGdyYW50ZWQgZm9yIHVzZSB3aXRoIGNvbmZvcm1pbmcKLSAgICAgU0dNTCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMgYXMgZGVmaW5lZCBpbiBJU08gODg3OSwgcHJvdmlkZWQKLSAgICAgdGhpcyBub3RpY2UgaXMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcy4KLS0tPgotCi08IUVOVElUWSBuYnNwICAgIiYjMTYwOyIgPjwhLS0gbm8tYnJlYWsgc3BhY2UgPSBub24tYnJlYWtpbmcgc3BhY2UsIFUrMDBBMCBJU09udW0gLS0+Ci08IUVOVElUWSBpZXhjbCAgIiYjMTYxOyIgPjwhLS0gaW52ZXJ0ZWQgZXhjbGFtYXRpb24gbWFyaywgVSswMEExIElTT251bSAtLT4KLTwhRU5USVRZIGNlbnQgICAiJiMxNjI7IiA+PCEtLSBjZW50IHNpZ24sIFUrMDBBMiBJU09udW0gLS0+Ci08IUVOVElUWSBwb3VuZCAgIiYjMTYzOyIgPjwhLS0gcG91bmQgc2lnbiwgVSswMEEzIElTT251bSAtLT4KLTwhRU5USVRZIGN1cnJlbiAiJiMxNjQ7IiA+PCEtLSBjdXJyZW5jeSBzaWduLCBVKzAwQTQgSVNPbnVtIC0tPgotPCFFTlRJVFkgeWVuICAgICImIzE2NTsiID48IS0tIHllbiBzaWduID0geXVhbiBzaWduLCBVKzAwQTUgSVNPbnVtIC0tPgotPCFFTlRJVFkgYnJ2YmFyICImIzE2NjsiID48IS0tIGJyb2tlbiBiYXIgPSBicm9rZW4gdmVydGljYWwgYmFyLCBVKzAwQTYgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2VjdCAgICImIzE2NzsiID48IS0tIHNlY3Rpb24gc2lnbiwgVSswMEE3IElTT251bSAtLT4KLTwhRU5USVRZIHVtbCAgICAiJiMxNjg7IiA+PCEtLSBkaWFlcmVzaXMgPSBzcGFjaW5nIGRpYWVyZXNpcywgVSswMEE4IElTT2RpYSAtLT4KLTwhRU5USVRZIGNvcHkgICAiJiMxNjk7IiA+PCEtLSBjb3B5cmlnaHQgc2lnbiwgVSswMEE5IElTT251bSAtLT4KLTwhRU5USVRZIG9yZGYgICAiJiMxNzA7IiA+PCEtLSBmZW1pbmluZSBvcmRpbmFsIGluZGljYXRvciwgVSswMEFBIElTT251bSAtLT4KLTwhRU5USVRZIGxhcXVvICAiJiMxNzE7IiA+PCEtLSBsZWZ0LXBvaW50aW5nIGRvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFyayA9IGxlZnQgcG9pbnRpbmcgZ3VpbGxlbWV0LCBVKzAwQUIgSVNPbnVtIC0tPgotPCFFTlRJVFkgbm90ICAgICImIzE3MjsiID48IS0tIG5vdCBzaWduLCBVKzAwQUMgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2h5ICAgICImIzE3MzsiID48IS0tIHNvZnQgaHlwaGVuID0gZGlzY3JldGlvbmFyeSBoeXBoZW4sIFUrMDBBRCBJU09udW0gLS0+Ci08IUVOVElUWSByZWcgICAgIiYjMTc0OyIgPjwhLS0gcmVnaXN0ZXJlZCBzaWduID0gcmVnaXN0ZXJlZCB0cmFkZSBtYXJrIHNpZ24sIFUrMDBBRSBJU09udW0gLS0+Ci08IUVOVElUWSBtYWNyICAgIiYjMTc1OyIgPjwhLS0gbWFjcm9uID0gc3BhY2luZyBtYWNyb24gPSBvdmVybGluZSA9IEFQTCBvdmVyYmFyLCBVKzAwQUYgSVNPZGlhIC0tPgotPCFFTlRJVFkgZGVnICAgICImIzE3NjsiID48IS0tIGRlZ3JlZSBzaWduLCBVKzAwQjAgSVNPbnVtIC0tPgotPCFFTlRJVFkgcGx1c21uICImIzE3NzsiID48IS0tIHBsdXMtbWludXMgc2lnbiA9IHBsdXMtb3ItbWludXMgc2lnbiwgVSswMEIxIElTT251bSAtLT4KLTwhRU5USVRZIHN1cDIgICAiJiMxNzg7IiA+PCEtLSBzdXBlcnNjcmlwdCB0d28gPSBzdXBlcnNjcmlwdCBkaWdpdCB0d28gPSBzcXVhcmVkLCBVKzAwQjIgSVNPbnVtIC0tPgotPCFFTlRJVFkgc3VwMyAgICImIzE3OTsiID48IS0tIHN1cGVyc2NyaXB0IHRocmVlID0gc3VwZXJzY3JpcHQgZGlnaXQgdGhyZWUgPSBjdWJlZCwgVSswMEIzIElTT251bSAtLT4KLTwhRU5USVRZIGFjdXRlICAiJiMxODA7IiA+PCEtLSBhY3V0ZSBhY2NlbnQgPSBzcGFjaW5nIGFjdXRlLCBVKzAwQjQgSVNPZGlhIC0tPgotPCFFTlRJVFkgbWljcm8gICImIzE4MTsiID48IS0tIG1pY3JvIHNpZ24sIFUrMDBCNSBJU09udW0gLS0+Ci08IUVOVElUWSBwYXJhICAgIiYjMTgyOyIgPjwhLS0gcGlsY3JvdyBzaWduID0gcGFyYWdyYXBoIHNpZ24sIFUrMDBCNiBJU09udW0gLS0+Ci08IUVOVElUWSBtaWRkb3QgIiYjMTgzOyIgPjwhLS0gbWlkZGxlIGRvdCA9IEdlb3JnaWFuIGNvbW1hID0gR3JlZWsgbWlkZGxlIGRvdCwgVSswMEI3IElTT251bSAtLT4KLTwhRU5USVRZIGNlZGlsICAiJiMxODQ7IiA+PCEtLSBjZWRpbGxhID0gc3BhY2luZyBjZWRpbGxhLCBVKzAwQjggSVNPZGlhIC0tPgotPCFFTlRJVFkgc3VwMSAgICImIzE4NTsiID48IS0tIHN1cGVyc2NyaXB0IG9uZSA9IHN1cGVyc2NyaXB0IGRpZ2l0IG9uZSwgVSswMEI5IElTT251bSAtLT4KLTwhRU5USVRZIG9yZG0gICAiJiMxODY7IiA+PCEtLSBtYXNjdWxpbmUgb3JkaW5hbCBpbmRpY2F0b3IsIFUrMDBCQSBJU09udW0gLS0+Ci08IUVOVElUWSByYXF1byAgIiYjMTg3OyIgPjwhLS0gcmlnaHQtcG9pbnRpbmcgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrID0gcmlnaHQgcG9pbnRpbmcgZ3VpbGxlbWV0LCBVKzAwQkIgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzE0ICImIzE4ODsiID48IS0tIHZ1bGdhciBmcmFjdGlvbiBvbmUgcXVhcnRlciA9IGZyYWN0aW9uIG9uZSBxdWFydGVyLCBVKzAwQkMgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzEyICImIzE4OTsiID48IS0tIHZ1bGdhciBmcmFjdGlvbiBvbmUgaGFsZiA9IGZyYWN0aW9uIG9uZSBoYWxmLCBVKzAwQkQgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzM0ICImIzE5MDsiID48IS0tIHZ1bGdhciBmcmFjdGlvbiB0aHJlZSBxdWFydGVycyA9IGZyYWN0aW9uIHRocmVlIHF1YXJ0ZXJzLCBVKzAwQkUgSVNPbnVtIC0tPgotPCFFTlRJVFkgaXF1ZXN0ICImIzE5MTsiID48IS0tIGludmVydGVkIHF1ZXN0aW9uIG1hcmsgPSB0dXJuZWQgcXVlc3Rpb24gbWFyaywgVSswMEJGIElTT251bSAtLT4KLTwhRU5USVRZIEFncmF2ZSAiJiMxOTI7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIEEgd2l0aCBncmF2ZSA9IGxhdGluIGNhcGl0YWwgQSBncmF2ZSwgVSswMEMwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBYWN1dGUgIiYjMTkzOyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBBIHdpdGggYWN1dGUsIFUrMDBDMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgQWNpcmMgICImIzE5NDsiID48IS0tIGxhdGluIGNhcGl0YWwgQSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBDMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgQXRpbGRlICImIzE5NTsiID48IS0tIGxhdGluIGNhcGl0YWwgQSB3aXRoIHRpbGRlLCBVKzAwQzMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEF1bWwgICAiJiMxOTY7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIEEgd2l0aCBkaWFlcmVzaXMsIFUrMDBDNCBJU09sYXQxIC0tPgotPCFFTlRJVFkgQXJpbmcgICImIzE5NzsiID48IS0tIGxhdGluIGNhcGl0YWwgQSB3aXRoIHJpbmcgYWJvdmUgPSBsYXRpbiBjYXBpdGFsIEEgcmluZywgVSswMEM1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBBRWxpZyAgIiYjMTk4OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBBRSA9IGxhdGluIGNhcGl0YWwgbGlnYXR1cmUgQUUsIFUrMDBDNiBJU09sYXQxIC0tPgotPCFFTlRJVFkgQ2NlZGlsICImIzE5OTsiID48IS0tIGxhdGluIGNhcGl0YWwgQyB3aXRoIGNlZGlsbGEsIFUrMDBDNyBJU09sYXQxIC0tPgotPCFFTlRJVFkgRWdyYXZlICImIzIwMDsiID48IS0tIGxhdGluIGNhcGl0YWwgRSB3aXRoIGdyYXZlLCBVKzAwQzggSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVhY3V0ZSAiJiMyMDE7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIEUgd2l0aCBhY3V0ZSwgVSswMEM5IElTT2xhdDEgLS0+Ci08IUVOVElUWSBFY2lyYyAgIiYjMjAyOyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBFIHdpdGggY2lyY3VtZmxleCwgVSswMENBIElTT2xhdDEgLS0+Ci08IUVOVElUWSBFdW1sICAgIiYjMjAzOyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBFIHdpdGggZGlhZXJlc2lzLCBVKzAwQ0IgSVNPbGF0MSAtLT4KLTwhRU5USVRZIElncmF2ZSAiJiMyMDQ7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIEkgd2l0aCBncmF2ZSwgVSswMENDIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJYWN1dGUgIiYjMjA1OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBJIHdpdGggYWN1dGUsIFUrMDBDRCBJU09sYXQxIC0tPgotPCFFTlRJVFkgSWNpcmMgICImIzIwNjsiID48IS0tIGxhdGluIGNhcGl0YWwgSSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBDRSBJU09sYXQxIC0tPgotPCFFTlRJVFkgSXVtbCAgICImIzIwNzsiID48IS0tIGxhdGluIGNhcGl0YWwgSSB3aXRoIGRpYWVyZXNpcywgVSswMENGIElTT2xhdDEgLS0+Ci08IUVOVElUWSBFVEggICAgIiYjMjA4OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBFVEgsIFUrMDBEMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgTnRpbGRlICImIzIwOTsiID48IS0tIGxhdGluIGNhcGl0YWwgTiB3aXRoIHRpbGRlLCBVKzAwRDEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE9ncmF2ZSAiJiMyMTA7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIE8gd2l0aCBncmF2ZSwgVSswMEQyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBPYWN1dGUgIiYjMjExOyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBPIHdpdGggYWN1dGUsIFUrMDBEMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgT2NpcmMgICImIzIxMjsiID48IS0tIGxhdGluIGNhcGl0YWwgTyB3aXRoIGNpcmN1bWZsZXgsIFUrMDBENCBJU09sYXQxIC0tPgotPCFFTlRJVFkgT3RpbGRlICImIzIxMzsiID48IS0tIGxhdGluIGNhcGl0YWwgTyB3aXRoIHRpbGRlLCBVKzAwRDUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE91bWwgICAiJiMyMTQ7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIE8gd2l0aCBkaWFlcmVzaXMsIFUrMDBENiBJU09sYXQxIC0tPgotPCFFTlRJVFkgdGltZXMgICImIzIxNTsiID48IS0tIG11bHRpcGxpY2F0aW9uIHNpZ24sIFUrMDBENyBJU09udW0gLS0+Ci08IUVOVElUWSBPc2xhc2ggIiYjMjE2OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBPIHdpdGggc3Ryb2tlID0gbGF0aW4gY2FwaXRhbCBPIHNsYXNoLCBVKzAwRDggSVNPbGF0MSAtLT4KLTwhRU5USVRZIFVncmF2ZSAiJiMyMTc7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIFUgd2l0aCBncmF2ZSwgVSswMEQ5IElTT2xhdDEgLS0+Ci08IUVOVElUWSBVYWN1dGUgIiYjMjE4OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBVIHdpdGggYWN1dGUsIFUrMDBEQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgVWNpcmMgICImIzIxOTsiID48IS0tIGxhdGluIGNhcGl0YWwgVSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBEQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgVXVtbCAgICImIzIyMDsiID48IS0tIGxhdGluIGNhcGl0YWwgVSB3aXRoIGRpYWVyZXNpcywgVSswMERDIElTT2xhdDEgLS0+Ci08IUVOVElUWSBZYWN1dGUgIiYjMjIxOyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBZIHdpdGggYWN1dGUsIFUrMDBERCBJU09sYXQxIC0tPgotPCFFTlRJVFkgVEhPUk4gICImIzIyMjsiID48IS0tIGxhdGluIGNhcGl0YWwgVEhPUk4sIFUrMDBERSBJU09sYXQxIC0tPgotPCFFTlRJVFkgc3psaWcgICImIzIyMzsiID48IS0tIGxhdGluIHNtYWxsIHNoYXJwIHMgPSBlc3MtemVkLCBVKzAwREYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFncmF2ZSAiJiMyMjQ7IiA+PCEtLSBsYXRpbiBzbWFsbCBhIHdpdGggZ3JhdmUgPSBsYXRpbiBzbWFsbCBhIGdyYXZlLCBVKzAwRTAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFhY3V0ZSAiJiMyMjU7IiA+PCEtLSBsYXRpbiBzbWFsbCBhIHdpdGggYWN1dGUsIFUrMDBFMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWNpcmMgICImIzIyNjsiID48IS0tIGxhdGluIHNtYWxsIGEgd2l0aCBjaXJjdW1mbGV4LCBVKzAwRTIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGF0aWxkZSAiJiMyMjc7IiA+PCEtLSBsYXRpbiBzbWFsbCBhIHdpdGggdGlsZGUsIFUrMDBFMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgYXVtbCAgICImIzIyODsiID48IS0tIGxhdGluIHNtYWxsIGEgd2l0aCBkaWFlcmVzaXMsIFUrMDBFNCBJU09sYXQxIC0tPgotPCFFTlRJVFkgYXJpbmcgICImIzIyOTsiID48IS0tIGxhdGluIHNtYWxsIGEgd2l0aCByaW5nIGFib3ZlID0gbGF0aW4gc21hbGwgYSByaW5nLCBVKzAwRTUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFlbGlnICAiJiMyMzA7IiA+PCEtLSBsYXRpbiBzbWFsbCBhZSA9IGxhdGluIHNtYWxsIGxpZ2F0dXJlIGFlLCBVKzAwRTYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGNjZWRpbCAiJiMyMzE7IiA+PCEtLSBsYXRpbiBzbWFsbCBjIHdpdGggY2VkaWxsYSwgVSswMEU3IElTT2xhdDEgLS0+Ci08IUVOVElUWSBlZ3JhdmUgIiYjMjMyOyIgPjwhLS0gbGF0aW4gc21hbGwgZSB3aXRoIGdyYXZlLCBVKzAwRTggSVNPbGF0MSAtLT4KLTwhRU5USVRZIGVhY3V0ZSAiJiMyMzM7IiA+PCEtLSBsYXRpbiBzbWFsbCBlIHdpdGggYWN1dGUsIFUrMDBFOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgZWNpcmMgICImIzIzNDsiID48IS0tIGxhdGluIHNtYWxsIGUgd2l0aCBjaXJjdW1mbGV4LCBVKzAwRUEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGV1bWwgICAiJiMyMzU7IiA+PCEtLSBsYXRpbiBzbWFsbCBlIHdpdGggZGlhZXJlc2lzLCBVKzAwRUIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGlncmF2ZSAiJiMyMzY7IiA+PCEtLSBsYXRpbiBzbWFsbCBpIHdpdGggZ3JhdmUsIFUrMDBFQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgaWFjdXRlICImIzIzNzsiID48IS0tIGxhdGluIHNtYWxsIGkgd2l0aCBhY3V0ZSwgVSswMEVEIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpY2lyYyAgIiYjMjM4OyIgPjwhLS0gbGF0aW4gc21hbGwgaSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBFRSBJU09sYXQxIC0tPgotPCFFTlRJVFkgaXVtbCAgICImIzIzOTsiID48IS0tIGxhdGluIHNtYWxsIGkgd2l0aCBkaWFlcmVzaXMsIFUrMDBFRiBJU09sYXQxIC0tPgotPCFFTlRJVFkgZXRoICAgICImIzI0MDsiID48IS0tIGxhdGluIHNtYWxsIGV0aCwgVSswMEYwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBudGlsZGUgIiYjMjQxOyIgPjwhLS0gbGF0aW4gc21hbGwgbiB3aXRoIHRpbGRlLCBVKzAwRjEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG9ncmF2ZSAiJiMyNDI7IiA+PCEtLSBsYXRpbiBzbWFsbCBvIHdpdGggZ3JhdmUsIFUrMDBGMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgb2FjdXRlICImIzI0MzsiID48IS0tIGxhdGluIHNtYWxsIG8gd2l0aCBhY3V0ZSwgVSswMEYzIElTT2xhdDEgLS0+Ci08IUVOVElUWSBvY2lyYyAgIiYjMjQ0OyIgPjwhLS0gbGF0aW4gc21hbGwgbyB3aXRoIGNpcmN1bWZsZXgsIFUrMDBGNCBJU09sYXQxIC0tPgotPCFFTlRJVFkgb3RpbGRlICImIzI0NTsiID48IS0tIGxhdGluIHNtYWxsIG8gd2l0aCB0aWxkZSwgVSswMEY1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBvdW1sICAgIiYjMjQ2OyIgPjwhLS0gbGF0aW4gc21hbGwgbyB3aXRoIGRpYWVyZXNpcywgVSswMEY2IElTT2xhdDEgLS0+Ci08IUVOVElUWSBkaXZpZGUgIiYjMjQ3OyIgPjwhLS0gZGl2aXNpb24gc2lnbiwgVSswMEY3IElTT251bSAtLT4KLTwhRU5USVRZIG9zbGFzaCAiJiMyNDg7IiA+PCEtLSBsYXRpbiBzbWFsbCBvIHdpdGggc3Ryb2tlLCA9IGxhdGluIHNtYWxsIG8gc2xhc2gsIFUrMDBGOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgdWdyYXZlICImIzI0OTsiID48IS0tIGxhdGluIHNtYWxsIHUgd2l0aCBncmF2ZSwgVSswMEY5IElTT2xhdDEgLS0+Ci08IUVOVElUWSB1YWN1dGUgIiYjMjUwOyIgPjwhLS0gbGF0aW4gc21hbGwgdSB3aXRoIGFjdXRlLCBVKzAwRkEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHVjaXJjICAiJiMyNTE7IiA+PCEtLSBsYXRpbiBzbWFsbCB1IHdpdGggY2lyY3VtZmxleCwgVSswMEZCIElTT2xhdDEgLS0+Ci08IUVOVElUWSB1dW1sICAgIiYjMjUyOyIgPjwhLS0gbGF0aW4gc21hbGwgdSB3aXRoIGRpYWVyZXNpcywgVSswMEZDIElTT2xhdDEgLS0+Ci08IUVOVElUWSB5YWN1dGUgIiYjMjUzOyIgPjwhLS0gbGF0aW4gc21hbGwgeSB3aXRoIGFjdXRlLCBVKzAwRkQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHRob3JuICAiJiMyNTQ7IiA+PCEtLSBsYXRpbiBzbWFsbCB0aG9ybiB3aXRoLCBVKzAwRkUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIHl1bWwgICAiJiMyNTU7IiA+PCEtLSBsYXRpbiBzbWFsbCB5IHdpdGggZGlhZXJlc2lzLCBVKzAwRkYgSVNPbGF0MSAtLT4KLTwhLS0gZW5kIG9mIHhodG1sLWxhdDEuZW50IC0tPgotCi0KLTwhRU5USVRZICUgeGh0bWwtc3ltYm9sCi0gICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgICAgInhodG1sLXN5bWJvbC5lbnQiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gSVNPIE1hdGgsIEdyZWVrIGFuZCBTeW1ib2xpYyBDaGFyYWN0ZXIgRW50aXR5IFNldCBmb3IgWEhUTUwgLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtc3ltYm9sLmVudAotCi0gICAgIFR5cGljYWwgaW52b2NhdGlvbjoKLQotICAgICAgIDwhRU5USVRZICUgeGh0bWwtc3ltYm9sCi0gICAgICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBTeW1ib2xzIGZvciBYSFRNTC8vRU4iCi0gICAgICAgICAgICAgICAgICAieGh0bWwtc3ltYm9sLmVudCIgPgotICAgICAgICV4aHRtbC1zeW1ib2w7Ci0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMgZm9yIFhIVE1MLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1zeW1ib2wuZW50IgotCi0gICAgIFJldmlzaW9uOiAgJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODY6Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aCBjb25mb3JtaW5nCi0gICAgIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4gSVNPIDg4NzksIHByb3ZpZGVkCi0gICAgIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLQotPCEtLSBSZWxldmFudCBJU08gZW50aXR5IHNldCBpcyBnaXZlbiB1bmxlc3MgbmFtZXMgYXJlIG5ld2x5IGludHJvZHVjZWQuCi0gICAgIE5ldyBuYW1lcyAoaS5lLiwgbm90IGluIElTTyA4ODc5IFtTR01MXSBsaXN0KSBkbyBub3QgY2xhc2ggd2l0aAotICAgICBhbnkgZXhpc3RpbmcgSVNPIDg4NzkgZW50aXR5IG5hbWVzLiBJU08gMTA2NDYgW0lTTzEwNjQ2XSBjaGFyYWN0ZXIKLSAgICAgbnVtYmVycyBhcmUgZ2l2ZW4gZm9yIGVhY2ggY2hhcmFjdGVyLCBpbiBoZXguIEVudGl0eSB2YWx1ZXMgYXJlCi0gICAgIGRlY2ltYWwgY29udmVyc2lvbnMgb2YgdGhlIElTTyAxMDY0NiB2YWx1ZXMgYW5kIHJlZmVyIHRvIHRoZQotICAgICBkb2N1bWVudCBjaGFyYWN0ZXIgc2V0LiBOYW1lcyBhcmUgVW5pY29kZSBbVU5JQ09ERV0gbmFtZXMuCi0tLT4KLQotPCEtLSBMYXRpbiBFeHRlbmRlZC1CIC0tPgotPCFFTlRJVFkgZm5vZiAgICAgIiYjNDAyOyIgPjwhLS0gbGF0aW4gc21hbGwgZiB3aXRoIGhvb2sgPSBmdW5jdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmbG9yaW4sIFUrMDE5MiBJU090ZWNoIC0tPgotCi08IS0tIEdyZWVrIC0tPgotPCFFTlRJVFkgQWxwaGEgICAgIiYjOTEzOyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgYWxwaGEsIFUrMDM5MSAtLT4KLTwhRU5USVRZIEJldGEgICAgICImIzkxNDsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGJldGEsIFUrMDM5MiAtLT4KLTwhRU5USVRZIEdhbW1hICAgICImIzkxNTsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGdhbW1hLCBVKzAzOTMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIERlbHRhICAgICImIzkxNjsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGRlbHRhLCBVKzAzOTQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIEVwc2lsb24gICImIzkxNzsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGVwc2lsb24sIFUrMDM5NSAtLT4KLTwhRU5USVRZIFpldGEgICAgICImIzkxODsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHpldGEsIFUrMDM5NiAtLT4KLTwhRU5USVRZIEV0YSAgICAgICImIzkxOTsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGV0YSwgVSswMzk3IC0tPgotPCFFTlRJVFkgVGhldGEgICAgIiYjOTIwOyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdGhldGEsIFUrMDM5OCBJU09ncmszIC0tPgotPCFFTlRJVFkgSW90YSAgICAgIiYjOTIxOyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgaW90YSwgVSswMzk5IC0tPgotPCFFTlRJVFkgS2FwcGEgICAgIiYjOTIyOyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIga2FwcGEsIFUrMDM5QSAtLT4KLTwhRU5USVRZIExhbWJkYSAgICImIzkyMzsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGxhbWJkYSwgVSswMzlCIElTT2dyazMgLS0+Ci08IUVOVElUWSBNdSAgICAgICAiJiM5MjQ7IiA+PCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBtdSwgVSswMzlDIC0tPgotPCFFTlRJVFkgTnUgICAgICAgIiYjOTI1OyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbnUsIFUrMDM5RCAtLT4KLTwhRU5USVRZIFhpICAgICAgICImIzkyNjsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHhpLCBVKzAzOUUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIE9taWNyb24gICImIzkyNzsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG9taWNyb24sIFUrMDM5RiAtLT4KLTwhRU5USVRZIFBpICAgICAgICImIzkyODsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBpLCBVKzAzQTAgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIFJobyAgICAgICImIzkyOTsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHJobywgVSswM0ExIC0tPgotPCEtLSB0aGVyZSBpcyBubyBTaWdtYWYsIGFuZCBubyBVKzAzQTIgY2hhcmFjdGVyIGVpdGhlciAtLT4KLTwhRU5USVRZIFNpZ21hICAgICImIzkzMTsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHNpZ21hLCBVKzAzQTMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIFRhdSAgICAgICImIzkzMjsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHRhdSwgVSswM0E0IC0tPgotPCFFTlRJVFkgVXBzaWxvbiAgIiYjOTMzOyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdXBzaWxvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBNSBJU09ncmszIC0tPgotPCFFTlRJVFkgUGhpICAgICAgIiYjOTM0OyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGhpLCBVKzAzQTYgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIENoaSAgICAgICImIzkzNTsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGNoaSwgVSswM0E3IC0tPgotPCFFTlRJVFkgUHNpICAgICAgIiYjOTM2OyIgPjwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcHNpLCBVKzAzQTggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIE9tZWdhICAgICImIzkzNzsiID48IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG9tZWdhLCBVKzAzQTkgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGFscGhhICAgICImIzk0NTsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBhbHBoYSwgVSswM0IxIElTT2dyazMgLS0+Ci08IUVOVElUWSBiZXRhICAgICAiJiM5NDY7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgYmV0YSwgVSswM0IyIElTT2dyazMgLS0+Ci08IUVOVElUWSBnYW1tYSAgICAiJiM5NDc7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZ2FtbWEsIFUrMDNCMyBJU09ncmszIC0tPgotPCFFTlRJVFkgZGVsdGEgICAgIiYjOTQ4OyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGRlbHRhLCBVKzAzQjQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGVwc2lsb24gICImIzk0OTsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBlcHNpbG9uLCBVKzAzQjUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHpldGEgICAgICImIzk1MDsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciB6ZXRhLCBVKzAzQjYgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGV0YSAgICAgICImIzk1MTsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBldGEsIFUrMDNCNyBJU09ncmszIC0tPgotPCFFTlRJVFkgdGhldGEgICAgIiYjOTUyOyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHRoZXRhLCBVKzAzQjggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGlvdGEgICAgICImIzk1MzsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBpb3RhLCBVKzAzQjkgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGthcHBhICAgICImIzk1NDsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBrYXBwYSwgVSswM0JBIElTT2dyazMgLS0+Ci08IUVOVElUWSBsYW1iZGEgICAiJiM5NTU7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgbGFtYmRhLCBVKzAzQkIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG11ICAgICAgICImIzk1NjsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBtdSwgVSswM0JDIElTT2dyazMgLS0+Ci08IUVOVElUWSBudSAgICAgICAiJiM5NTc7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgbnUsIFUrMDNCRCBJU09ncmszIC0tPgotPCFFTlRJVFkgeGkgICAgICAgIiYjOTU4OyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHhpLCBVKzAzQkUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG9taWNyb24gICImIzk1OTsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBvbWljcm9uLCBVKzAzQkYgTkVXIC0tPgotPCFFTlRJVFkgcGkgICAgICAgIiYjOTYwOyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHBpLCBVKzAzQzAgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHJobyAgICAgICImIzk2MTsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciByaG8sIFUrMDNDMSBJU09ncmszIC0tPgotPCFFTlRJVFkgc2lnbWFmICAgIiYjOTYyOyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGZpbmFsIHNpZ21hLCBVKzAzQzIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHNpZ21hICAgICImIzk2MzsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBzaWdtYSwgVSswM0MzIElTT2dyazMgLS0+Ci08IUVOVElUWSB0YXUgICAgICAiJiM5NjQ7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGF1LCBVKzAzQzQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHVwc2lsb24gICImIzk2NTsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciB1cHNpbG9uLCBVKzAzQzUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHBoaSAgICAgICImIzk2NjsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBwaGksIFUrMDNDNiBJU09ncmszIC0tPgotPCFFTlRJVFkgY2hpICAgICAgIiYjOTY3OyIgPjwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGNoaSwgVSswM0M3IElTT2dyazMgLS0+Ci08IUVOVElUWSBwc2kgICAgICAiJiM5Njg7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgcHNpLCBVKzAzQzggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG9tZWdhICAgICImIzk2OTsiID48IS0tIGdyZWVrIHNtYWxsIGxldHRlciBvbWVnYSwgVSswM0M5IElTT2dyazMgLS0+Ci08IUVOVElUWSB0aGV0YXN5bSAiJiM5Nzc7IiA+PCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGhldGEgc3ltYm9sLCBVKzAzRDEgTkVXIC0tPgotPCFFTlRJVFkgdXBzaWggICAgIiYjOTc4OyIgPjwhLS0gZ3JlZWsgdXBzaWxvbiB3aXRoIGhvb2sgc3ltYm9sLCBVKzAzRDIgTkVXIC0tPgotPCFFTlRJVFkgcGl2ICAgICAgIiYjOTgyOyIgPjwhLS0gZ3JlZWsgcGkgc3ltYm9sLCBVKzAzRDYgSVNPZ3JrMyAtLT4KLQotPCEtLSBHZW5lcmFsIFB1bmN0dWF0aW9uIC0tPgotPCFFTlRJVFkgYnVsbCAgICAgIiYjODIyNjsiID48IS0tIGJ1bGxldCA9IGJsYWNrIHNtYWxsIGNpcmNsZSwgVSsyMDIyIElTT3B1YiAgLS0+Ci08IS0tIGJ1bGxldCBpcyBOT1QgdGhlIHNhbWUgYXMgYnVsbGV0IG9wZXJhdG9yLCBVKzIyMTkgLS0+Ci08IUVOVElUWSBoZWxsaXAgICAiJiM4MjMwOyIgPjwhLS0gaG9yaXpvbnRhbCBlbGxpcHNpcyA9IHRocmVlIGRvdCBsZWFkZXIsIFUrMjAyNiBJU09wdWIgIC0tPgotPCFFTlRJVFkgcHJpbWUgICAgIiYjODI0MjsiID48IS0tIHByaW1lID0gbWludXRlcyA9IGZlZXQsIFUrMjAzMiBJU090ZWNoIC0tPgotPCFFTlRJVFkgUHJpbWUgICAgIiYjODI0MzsiID48IS0tIGRvdWJsZSBwcmltZSA9IHNlY29uZHMgPSBpbmNoZXMsIFUrMjAzMyBJU090ZWNoIC0tPgotPCFFTlRJVFkgb2xpbmUgICAgIiYjODI1NDsiID48IS0tIG92ZXJsaW5lID0gc3BhY2luZyBvdmVyc2NvcmUsIFUrMjAzRSBORVcgLS0+Ci08IUVOVElUWSBmcmFzbCAgICAiJiM4MjYwOyIgPjwhLS0gZnJhY3Rpb24gc2xhc2gsIFUrMjA0NCBORVcgLS0+Ci0KLTwhLS0gTGV0dGVybGlrZSBTeW1ib2xzIC0tPgotPCFFTlRJVFkgd2VpZXJwICAgIiYjODQ3MjsiID48IS0tIHNjcmlwdCBjYXBpdGFsIFAgPSBwb3dlciBzZXQgPSBXZWllcnN0cmFzcyBwLCBVKzIxMTggSVNPYW1zbyAtLT4KLTwhRU5USVRZIGltYWdlICAgICImIzg0NjU7IiA+PCEtLSBibGFja2xldHRlciBjYXBpdGFsIEkgPSBpbWFnaW5hcnkgcGFydCwgVSsyMTExIElTT2Ftc28gLS0+Ci08IUVOVElUWSByZWFsICAgICAiJiM4NDc2OyIgPjwhLS0gYmxhY2tsZXR0ZXIgY2FwaXRhbCBSID0gcmVhbCBwYXJ0IHN5bWJvbCwgVSsyMTFDIElTT2Ftc28gLS0+Ci08IUVOVElUWSB0cmFkZSAgICAiJiM4NDgyOyIgPjwhLS0gdHJhZGUgbWFyayBzaWduLCBVKzIxMjIgSVNPbnVtIC0tPgotPCFFTlRJVFkgYWxlZnN5bSAgIiYjODUwMTsiID48IS0tIGFsZWYgc3ltYm9sID0gZmlyc3QgdHJhbnNmaW5pdGUgY2FyZGluYWwsIFUrMjEzNSBORVcgLS0+Ci08IS0tIGFsZWYgc3ltYm9sIGlzIE5PVCB0aGUgc2FtZSBhcyBoZWJyZXcgbGV0dGVyIGFsZWYsIFUrMDVEMCBhbHRob3VnaAotICAgICB0aGUgc2FtZSBnbHlwaCBjb3VsZCBiZSB1c2VkIHRvIGRlcGljdCBib3RoIGNoYXJhY3RlcnMgLS0+Ci0KLTwhLS0gQXJyb3dzIC0tPgotPCFFTlRJVFkgbGFyciAgICAgIiYjODU5MjsiID48IS0tIGxlZnR3YXJkcyBhcnJvdywgVSsyMTkwIElTT251bSAtLT4KLTwhRU5USVRZIHVhcnIgICAgICImIzg1OTM7IiA+PCEtLSB1cHdhcmRzIGFycm93LCBVKzIxOTEgSVNPbnVtLS0+Ci08IUVOVElUWSByYXJyICAgICAiJiM4NTk0OyIgPjwhLS0gcmlnaHR3YXJkcyBhcnJvdywgVSsyMTkyIElTT251bSAtLT4KLTwhRU5USVRZIGRhcnIgICAgICImIzg1OTU7IiA+PCEtLSBkb3dud2FyZHMgYXJyb3csIFUrMjE5MyBJU09udW0gLS0+Ci08IUVOVElUWSBoYXJyICAgICAiJiM4NTk2OyIgPjwhLS0gbGVmdCByaWdodCBhcnJvdywgVSsyMTk0IElTT2Ftc2EgLS0+Ci08IUVOVElUWSBjcmFyciAgICAiJiM4NjI5OyIgPjwhLS0gZG93bndhcmRzIGFycm93IHdpdGggY29ybmVyIGxlZnR3YXJkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY2FycmlhZ2UgcmV0dXJuLCBVKzIxQjUgTkVXIC0tPgotPCFFTlRJVFkgbEFyciAgICAgIiYjODY1NjsiID48IS0tIGxlZnR3YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMCBJU090ZWNoIC0tPgotPCEtLSBVbmljb2RlIGRvZXMgbm90IHNheSB0aGF0IGxBcnIgaXMgdGhlIHNhbWUgYXMgdGhlICdpcyBpbXBsaWVkIGJ5JyBhcnJvdwotICAgIGJ1dCBhbHNvIGRvZXMgbm90IGhhdmUgYW55IG90aGVyIGNoYXJhY3RlciBmb3IgdGhhdCBmdW5jdGlvbi4gU28gPyBsQXJyIGNhbgotICAgIGJlIHVzZWQgZm9yICdpcyBpbXBsaWVkIGJ5JyBhcyBJU090ZWNoIHN1Z2dlc3RzIC0tPgotPCFFTlRJVFkgdUFyciAgICAgIiYjODY1NzsiID48IS0tIHVwd2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDEgSVNPYW1zYSAtLT4KLTwhRU5USVRZIHJBcnIgICAgICImIzg2NTg7IiA+PCEtLSByaWdodHdhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQyIElTT3RlY2ggLS0+Ci08IS0tIFVuaWNvZGUgZG9lcyBub3Qgc2F5IHRoaXMgaXMgdGhlICdpbXBsaWVzJyBjaGFyYWN0ZXIgYnV0IGRvZXMgbm90IGhhdmUKLSAgICAgYW5vdGhlciBjaGFyYWN0ZXIgd2l0aCB0aGlzIGZ1bmN0aW9uIHNvID8KLSAgICAgckFyciBjYW4gYmUgdXNlZCBmb3IgJ2ltcGxpZXMnIGFzIElTT3RlY2ggc3VnZ2VzdHMgLS0+Ci08IUVOVElUWSBkQXJyICAgICAiJiM4NjU5OyIgPjwhLS0gZG93bndhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQzIElTT2Ftc2EgLS0+Ci08IUVOVElUWSBoQXJyICAgICAiJiM4NjYwOyIgPjwhLS0gbGVmdCByaWdodCBkb3VibGUgYXJyb3csIFUrMjFENCBJU09hbXNhIC0tPgotCi08IS0tIE1hdGhlbWF0aWNhbCBPcGVyYXRvcnMgLS0+Ci08IUVOVElUWSBmb3JhbGwgICAiJiM4NzA0OyIgPjwhLS0gZm9yIGFsbCwgVSsyMjAwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBwYXJ0ICAgICAiJiM4NzA2OyIgPjwhLS0gcGFydGlhbCBkaWZmZXJlbnRpYWwsIFUrMjIwMiBJU090ZWNoICAtLT4KLTwhRU5USVRZIGV4aXN0ICAgICImIzg3MDc7IiA+PCEtLSB0aGVyZSBleGlzdHMsIFUrMjIwMyBJU090ZWNoIC0tPgotPCFFTlRJVFkgZW1wdHkgICAgIiYjODcwOTsiID48IS0tIGVtcHR5IHNldCA9IG51bGwgc2V0ID0gZGlhbWV0ZXIsIFUrMjIwNSBJU09hbXNvIC0tPgotPCFFTlRJVFkgbmFibGEgICAgIiYjODcxMTsiID48IS0tIG5hYmxhID0gYmFja3dhcmQgZGlmZmVyZW5jZSwgVSsyMjA3IElTT3RlY2ggLS0+Ci08IUVOVElUWSBpc2luICAgICAiJiM4NzEyOyIgPjwhLS0gZWxlbWVudCBvZiwgVSsyMjA4IElTT3RlY2ggLS0+Ci08IUVOVElUWSBub3RpbiAgICAiJiM4NzEzOyIgPjwhLS0gbm90IGFuIGVsZW1lbnQgb2YsIFUrMjIwOSBJU090ZWNoIC0tPgotPCFFTlRJVFkgbmkgICAgICAgIiYjODcxNTsiID48IS0tIGNvbnRhaW5zIGFzIG1lbWJlciwgVSsyMjBCIElTT3RlY2ggLS0+Ci08IS0tIHNob3VsZCB0aGVyZSBiZSBhIG1vcmUgbWVtb3JhYmxlIG5hbWUgdGhhbiAnbmknPyAtLT4KLTwhRU5USVRZIHByb2QgICAgICImIzg3MTk7IiA+PCEtLSBuLWFyeSBwcm9kdWN0ID0gcHJvZHVjdCBzaWduLCBVKzIyMEYgSVNPYW1zYiAtLT4KLTwhLS0gcHJvZCBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDNBMCAnZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGknIHRob3VnaAotICAgICB0aGUgc2FtZSBnbHlwaCBtaWdodCBiZSB1c2VkIGZvciBib3RoIC0tPgotPCFFTlRJVFkgc3VtICAgICAgIiYjODcyMTsiID48IS0tIG4tYXJ5IHN1bWF0aW9uLCBVKzIyMTEgSVNPYW1zYiAtLT4KLTwhLS0gc3VtIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswM0EzICdncmVlayBjYXBpdGFsIGxldHRlciBzaWdtYScKLSAgICAgdGhvdWdoIHRoZSBzYW1lIGdseXBoIG1pZ2h0IGJlIHVzZWQgZm9yIGJvdGggLS0+Ci08IUVOVElUWSBtaW51cyAgICAiJiM4NzIyOyIgPjwhLS0gbWludXMgc2lnbiwgVSsyMjEyIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsb3dhc3QgICAiJiM4NzI3OyIgPjwhLS0gYXN0ZXJpc2sgb3BlcmF0b3IsIFUrMjIxNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgcmFkaWMgICAgIiYjODczMDsiID48IS0tIHNxdWFyZSByb290ID0gcmFkaWNhbCBzaWduLCBVKzIyMUEgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHByb3AgICAgICImIzg3MzM7IiA+PCEtLSBwcm9wb3J0aW9uYWwgdG8sIFUrMjIxRCBJU090ZWNoIC0tPgotPCFFTlRJVFkgaW5maW4gICAgIiYjODczNDsiID48IS0tIGluZmluaXR5LCBVKzIyMUUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGFuZyAgICAgICImIzg3MzY7IiA+PCEtLSBhbmdsZSwgVSsyMjIwIElTT2Ftc28gLS0+Ci08IUVOVElUWSBhbmQgICAgICAiJiM4NzQzOyIgPjwhLS0gbG9naWNhbCBhbmQgPSB3ZWRnZSwgVSsyMjI3IElTT3RlY2ggLS0+Ci08IUVOVElUWSBvciAgICAgICAiJiM4NzQ0OyIgPjwhLS0gbG9naWNhbCBvciA9IHZlZSwgVSsyMjI4IElTT3RlY2ggLS0+Ci08IUVOVElUWSBjYXAgICAgICAiJiM4NzQ1OyIgPjwhLS0gaW50ZXJzZWN0aW9uID0gY2FwLCBVKzIyMjkgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGN1cCAgICAgICImIzg3NDY7IiA+PCEtLSB1bmlvbiA9IGN1cCwgVSsyMjJBIElTT3RlY2ggLS0+Ci08IUVOVElUWSBpbnQgICAgICAiJiM4NzQ3OyIgPjwhLS0gaW50ZWdyYWwsIFUrMjIyQiBJU090ZWNoIC0tPgotPCFFTlRJVFkgdGhlcmU0ICAgIiYjODc1NjsiID48IS0tIHRoZXJlZm9yZSwgVSsyMjM0IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzaW0gICAgICAiJiM4NzY0OyIgPjwhLS0gdGlsZGUgb3BlcmF0b3IgPSB2YXJpZXMgd2l0aCA9IHNpbWlsYXIgdG8sIFUrMjIzQyBJU090ZWNoIC0tPgotPCEtLSB0aWxkZSBvcGVyYXRvciBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIHRoZSB0aWxkZSwgVSswMDdFLAotICAgICBhbHRob3VnaCB0aGUgc2FtZSBnbHlwaCBtaWdodCBiZSB1c2VkIHRvIHJlcHJlc2VudCBib3RoICAtLT4KLTwhRU5USVRZIGNvbmcgICAgICImIzg3NzM7IiA+PCEtLSBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvLCBVKzIyNDUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGFzeW1wICAgICImIzg3NzY7IiA+PCEtLSBhbG1vc3QgZXF1YWwgdG8gPSBhc3ltcHRvdGljIHRvLCBVKzIyNDggSVNPYW1zciAtLT4KLTwhRU5USVRZIG5lICAgICAgICImIzg4MDA7IiA+PCEtLSBub3QgZXF1YWwgdG8sIFUrMjI2MCBJU090ZWNoIC0tPgotPCFFTlRJVFkgZXF1aXYgICAgIiYjODgwMTsiID48IS0tIGlkZW50aWNhbCB0bywgVSsyMjYxIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsZSAgICAgICAiJiM4ODA0OyIgPjwhLS0gbGVzcy10aGFuIG9yIGVxdWFsIHRvLCBVKzIyNjQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGdlICAgICAgICImIzg4MDU7IiA+PCEtLSBncmVhdGVyLXRoYW4gb3IgZXF1YWwgdG8sIFUrMjI2NSBJU090ZWNoIC0tPgotPCFFTlRJVFkgc3ViICAgICAgIiYjODgzNDsiID48IS0tIHN1YnNldCBvZiwgVSsyMjgyIElTT3RlY2ggLS0+Ci08IUVOVElUWSBzdXAgICAgICAiJiM4ODM1OyIgPjwhLS0gc3VwZXJzZXQgb2YsIFUrMjI4MyBJU090ZWNoIC0tPgotPCEtLSBub3RlIHRoYXQgbnN1cCwgJ25vdCBhIHN1cGVyc2V0IG9mLCBVKzIyODMnIGlzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBTeW1ib2wKLSAgICAgZm9udCBlbmNvZGluZyBhbmQgaXMgbm90IGluY2x1ZGVkLiBTaG91bGQgaXQgYmUsIGZvciBzeW1tZXRyeT8KLSAgICAgSXQgaXMgaW4gSVNPYW1zbiAgLS0+Ci08IUVOVElUWSBuc3ViICAgICAiJiM4ODM2OyIgPjwhLS0gbm90IGEgc3Vic2V0IG9mLCBVKzIyODQgSVNPYW1zbiAtLT4KLTwhRU5USVRZIHN1YmUgICAgICImIzg4Mzg7IiA+PCEtLSBzdWJzZXQgb2Ygb3IgZXF1YWwgdG8sIFUrMjI4NiBJU090ZWNoIC0tPgotPCFFTlRJVFkgc3VwZSAgICAgIiYjODgzOTsiID48IS0tIHN1cGVyc2V0IG9mIG9yIGVxdWFsIHRvLCBVKzIyODcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9wbHVzICAgICImIzg4NTM7IiA+PCEtLSBjaXJjbGVkIHBsdXMgPSBkaXJlY3Qgc3VtLCBVKzIyOTUgSVNPYW1zYiAtLT4KLTwhRU5USVRZIG90aW1lcyAgICImIzg4NTU7IiA+PCEtLSBjaXJjbGVkIHRpbWVzID0gdmVjdG9yIHByb2R1Y3QsIFUrMjI5NyBJU09hbXNiIC0tPgotPCFFTlRJVFkgcGVycCAgICAgIiYjODg2OTsiID48IS0tIHVwIHRhY2sgPSBvcnRob2dvbmFsIHRvID0gcGVycGVuZGljdWxhciwgVSsyMkE1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzZG90ICAgICAiJiM4OTAxOyIgPjwhLS0gZG90IG9wZXJhdG9yLCBVKzIyQzUgSVNPYW1zYiAtLT4KLTwhLS0gZG90IG9wZXJhdG9yIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMEI3IG1pZGRsZSBkb3QgLS0+Ci0KLTwhLS0gTWlzY2VsbGFuZW91cyBUZWNobmljYWwgLS0+Ci08IUVOVElUWSBsY2VpbCAgICAiJiM4OTY4OyIgPjwhLS0gbGVmdCBjZWlsaW5nID0gYXBsIHVwc3RpbGUsIFUrMjMwOCBJU09hbXNjICAtLT4KLTwhRU5USVRZIHJjZWlsICAgICImIzg5Njk7IiA+PCEtLSByaWdodCBjZWlsaW5nLCBVKzIzMDkgSVNPYW1zYyAgLS0+Ci08IUVOVElUWSBsZmxvb3IgICAiJiM4OTcwOyIgPjwhLS0gbGVmdCBmbG9vciA9IGFwbCBkb3duc3RpbGUsIFUrMjMwQSBJU09hbXNjICAtLT4KLTwhRU5USVRZIHJmbG9vciAgICImIzg5NzE7IiA+PCEtLSByaWdodCBmbG9vciwgVSsyMzBCIElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgbGFuZyAgICAgIiYjOTAwMTsiID48IS0tIGxlZnQtcG9pbnRpbmcgYW5nbGUgYnJhY2tldCA9IGJyYSwgVSsyMzI5IElTT3RlY2ggLS0+Ci08IS0tIGxhbmcgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwM0MgJ2xlc3MgdGhhbicKLSAgICAgb3IgVSsyMDM5ICdzaW5nbGUgbGVmdC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaycgLS0+Ci08IUVOVElUWSByYW5nICAgICAiJiM5MDAyOyIgPjwhLS0gcmlnaHQtcG9pbnRpbmcgYW5nbGUgYnJhY2tldCA9IGtldCwgVSsyMzJBIElTT3RlY2ggLS0+Ci08IS0tIHJhbmcgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwM0UgJ2dyZWF0ZXIgdGhhbicKLSAgICAgb3IgVSsyMDNBICdzaW5nbGUgcmlnaHQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmsnIC0tPgotCi08IS0tIEdlb21ldHJpYyBTaGFwZXMgLS0+Ci08IUVOVElUWSBsb3ogICAgICAiJiM5Njc0OyIgPjwhLS0gbG96ZW5nZSwgVSsyNUNBIElTT3B1YiAtLT4KLQotPCEtLSBNaXNjZWxsYW5lb3VzIFN5bWJvbHMgLS0+Ci08IUVOVElUWSBzcGFkZXMgICAiJiM5ODI0OyIgPjwhLS0gYmxhY2sgc3BhZGUgc3VpdCwgVSsyNjYwIElTT3B1YiAtLT4KLTwhLS0gYmxhY2sgaGVyZSBzZWVtcyB0byBtZWFuIGZpbGxlZCBhcyBvcHBvc2VkIHRvIGhvbGxvdyAtLT4KLTwhRU5USVRZIGNsdWJzICAgICImIzk4Mjc7IiA+PCEtLSBibGFjayBjbHViIHN1aXQgPSBzaGFtcm9jaywgVSsyNjYzIElTT3B1YiAtLT4KLTwhRU5USVRZIGhlYXJ0cyAgICImIzk4Mjk7IiA+PCEtLSBibGFjayBoZWFydCBzdWl0ID0gdmFsZW50aW5lLCBVKzI2NjUgSVNPcHViIC0tPgotPCFFTlRJVFkgZGlhbXMgICAgIiYjOTgzMDsiID48IS0tIGJsYWNrIGRpYW1vbmQgc3VpdCwgVSsyNjY2IElTT3B1YiAtLT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtc3ltYm9sLmVudCAtLT4KLQotCi08IUVOVElUWSAlIHhodG1sLXNwZWNpYWwKLSAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbCBmb3IgWEhUTUwvL0VOIgotICAgICAgICAgICAieGh0bWwtc3BlY2lhbC5lbnQiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWE1MLWNvbXBhdGlibGUgSVNPIFNwZWNpYWwgQ2hhcmFjdGVyIEVudGl0eSBTZXQgZm9yIFhIVE1MIC4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtc3BlY2lhbC5lbnQKLQotICAgICBUeXBpY2FsIGludm9jYXRpb246Ci0KLSAgICAgICA8IUVOVElUWSAlIHhodG1sLXNwZWNpYWwKLSAgICAgICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFNwZWNpYWwgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgICAgICAgICAgICJ4aHRtbC1zcGVjaWFsLmVudCIgPgotICAgICAgICV4aHRtbC1zcGVjaWFsOwotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBTcGVjaWFsIGZvciBYSFRNTC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtc3BlY2lhbC5lbnQiCi0KLSAgICAgUmV2aXNpb246ICAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgUG9ydGlvbnMgKEMpIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24gMTk4NjoKLSAgICAgUGVybWlzc2lvbiB0byBjb3B5IGluIGFueSBmb3JtIGlzIGdyYW50ZWQgZm9yIHVzZSB3aXRoIGNvbmZvcm1pbmcKLSAgICAgU0dNTCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMgYXMgZGVmaW5lZCBpbiBJU08gODg3OSwgcHJvdmlkZWQKLSAgICAgdGhpcyBub3RpY2UgaXMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcy4KLQotICAgICBSZXZpc2lvbnM6Ci0yMDAwLTEwLTI4OiBhZGRlZCAmYXBvczsgYW5kIGFsdGVyZWQgWE1MIFByZWRlZmluZWQgRW50aXRpZXMgZm9yIGNvbXBhdGliaWxpdHkKLS0tPgotCi08IS0tIFJlbGV2YW50IElTTyBlbnRpdHkgc2V0IGlzIGdpdmVuIHVubGVzcyBuYW1lcyBhcmUgbmV3bHkgaW50cm9kdWNlZC4KLSAgICAgTmV3IG5hbWVzIChpLmUuLCBub3QgaW4gSVNPIDg4NzkgW1NHTUxdIGxpc3QpIGRvIG5vdCBjbGFzaCB3aXRoCi0gICAgIGFueSBleGlzdGluZyBJU08gODg3OSBlbnRpdHkgbmFtZXMuIElTTyAxMDY0NiBbSVNPMTA2NDZdIGNoYXJhY3RlcgotICAgICBudW1iZXJzIGFyZSBnaXZlbiBmb3IgZWFjaCBjaGFyYWN0ZXIsIGluIGhleC4gRW50aXR5IHZhbHVlcyBhcmUKLSAgICAgZGVjaW1hbCBjb252ZXJzaW9ucyBvZiB0aGUgSVNPIDEwNjQ2IHZhbHVlcyBhbmQgcmVmZXIgdG8gdGhlCi0gICAgIGRvY3VtZW50IGNoYXJhY3RlciBzZXQuIE5hbWVzIGFyZSBVbmljb2RlIFtVTklDT0RFXSBuYW1lcy4KLS0tPgotCi08IS0tIEMwIENvbnRyb2xzIGFuZCBCYXNpYyBMYXRpbiAtLT4KLTwhRU5USVRZIGx0ICAgICAgIiYjMzg7JiM2MDsiID48IS0tIGxlc3MtdGhhbiBzaWduLCBVKzAwM0MgSVNPbnVtIC0tPgotPCFFTlRJVFkgZ3QgICAgICAiJiM2MjsiID48IS0tIGdyZWF0ZXItdGhhbiBzaWduLCBVKzAwM0UgSVNPbnVtIC0tPgotPCFFTlRJVFkgYW1wICAgICAiJiMzODsmIzM4OyIgPjwhLS0gYW1wZXJzYW5kLCBVKzAwMjYgSVNPbnVtIC0tPgotPCFFTlRJVFkgYXBvcyAgICAiJiMzOTsiID48IS0tIGFwb3N0cm9waGUsIFUrMDAyNyBJU09udW0gLS0+Ci08IUVOVElUWSBxdW90ICAgICImIzM0OyIgPjwhLS0gcXVvdGF0aW9uIG1hcmsgPSBBUEwgcXVvdGUsIFUrMDAyMiBJU09udW0gLS0+Ci0KLTwhLS0gTGF0aW4gRXh0ZW5kZWQtQSAtLT4KLTwhRU5USVRZIE9FbGlnICAgIiYjMzM4OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBsaWdhdHVyZSBPRSwgVSswMTUyIElTT2xhdDIgLS0+Ci08IUVOVElUWSBvZWxpZyAgICImIzMzOTsiID48IS0tIGxhdGluIHNtYWxsIGxpZ2F0dXJlIG9lLCBVKzAxNTMgSVNPbGF0MiAtLT4KLQotPCEtLSBsaWdhdHVyZSBpcyBhIG1pc25vbWVyLCB0aGlzIGlzIGEgc2VwYXJhdGUgY2hhcmFjdGVyIGluIHNvbWUgbGFuZ3VhZ2VzIC0tPgotPCFFTlRJVFkgU2Nhcm9uICAiJiMzNTI7IiA+PCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBTIHdpdGggY2Fyb24sIFUrMDE2MCBJU09sYXQyIC0tPgotPCFFTlRJVFkgc2Nhcm9uICAiJiMzNTM7IiA+PCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgcyB3aXRoIGNhcm9uLCBVKzAxNjEgSVNPbGF0MiAtLT4KLTwhRU5USVRZIFl1bWwgICAgIiYjMzc2OyIgPjwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgWSB3aXRoIGRpYWVyZXNpcywgVSswMTc4IElTT2xhdDIgLS0+Ci0KLTwhLS0gU3BhY2luZyBNb2RpZmllciBMZXR0ZXJzIC0tPgotPCFFTlRJVFkgY2lyYyAgICAiJiM3MTA7IiA+PCEtLSBtb2RpZmllciBsZXR0ZXIgY2lyY3VtZmxleCBhY2NlbnQsIFUrMDJDNiBJU09wdWIgLS0+Ci08IUVOVElUWSB0aWxkZSAgICImIzczMjsiID48IS0tIHNtYWxsIHRpbGRlLCBVKzAyREMgSVNPZGlhIC0tPgotCi08IS0tIEdlbmVyYWwgUHVuY3R1YXRpb24gLS0+Ci08IUVOVElUWSBlbnNwICAgICImIzgxOTQ7IiA+PCEtLSBlbiBzcGFjZSwgVSsyMDAyIElTT3B1YiAtLT4KLTwhRU5USVRZIGVtc3AgICAgIiYjODE5NTsiID48IS0tIGVtIHNwYWNlLCBVKzIwMDMgSVNPcHViIC0tPgotPCFFTlRJVFkgdGhpbnNwICAiJiM4MjAxOyIgPjwhLS0gdGhpbiBzcGFjZSwgVSsyMDA5IElTT3B1YiAtLT4KLTwhRU5USVRZIHp3bmogICAgIiYjODIwNDsiID48IS0tIHplcm8gd2lkdGggbm9uLWpvaW5lciwgVSsyMDBDIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIHp3aiAgICAgIiYjODIwNTsiID48IS0tIHplcm8gd2lkdGggam9pbmVyLCBVKzIwMEQgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgbHJtICAgICAiJiM4MjA2OyIgPjwhLS0gbGVmdC10by1yaWdodCBtYXJrLCBVKzIwMEUgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgcmxtICAgICAiJiM4MjA3OyIgPjwhLS0gcmlnaHQtdG8tbGVmdCBtYXJrLCBVKzIwMEYgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgbmRhc2ggICAiJiM4MjExOyIgPjwhLS0gZW4gZGFzaCwgVSsyMDEzIElTT3B1YiAtLT4KLTwhRU5USVRZIG1kYXNoICAgIiYjODIxMjsiID48IS0tIGVtIGRhc2gsIFUrMjAxNCBJU09wdWIgLS0+Ci08IUVOVElUWSBsc3F1byAgICImIzgyMTY7IiA+PCEtLSBsZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFyaywgVSsyMDE4IElTT251bSAtLT4KLTwhRU5USVRZIHJzcXVvICAgIiYjODIxNzsiID48IS0tIHJpZ2h0IHNpbmdsZSBxdW90YXRpb24gbWFyaywgVSsyMDE5IElTT251bSAtLT4KLTwhRU5USVRZIHNicXVvICAgIiYjODIxODsiID48IS0tIHNpbmdsZSBsb3ctOSBxdW90YXRpb24gbWFyaywgVSsyMDFBIE5FVyAtLT4KLTwhRU5USVRZIGxkcXVvICAgIiYjODIyMDsiID48IS0tIGxlZnQgZG91YmxlIHF1b3RhdGlvbiBtYXJrLCBVKzIwMUMgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmRxdW8gICAiJiM4MjIxOyIgPjwhLS0gcmlnaHQgZG91YmxlIHF1b3RhdGlvbiBtYXJrLCBVKzIwMUQgSVNPbnVtIC0tPgotPCFFTlRJVFkgYmRxdW8gICAiJiM4MjIyOyIgPjwhLS0gZG91YmxlIGxvdy05IHF1b3RhdGlvbiBtYXJrLCBVKzIwMUUgTkVXIC0tPgotPCFFTlRJVFkgZGFnZ2VyICAiJiM4MjI0OyIgPjwhLS0gZGFnZ2VyLCBVKzIwMjAgSVNPcHViIC0tPgotPCFFTlRJVFkgRGFnZ2VyICAiJiM4MjI1OyIgPjwhLS0gZG91YmxlIGRhZ2dlciwgVSsyMDIxIElTT3B1YiAtLT4KLTwhRU5USVRZIHBlcm1pbCAgIiYjODI0MDsiID48IS0tIHBlciBtaWxsZSBzaWduLCBVKzIwMzAgSVNPdGVjaCAtLT4KLQotPCEtLSBsc2FxdW8gaXMgcHJvcG9zZWQgYnV0IG5vdCB5ZXQgSVNPIHN0YW5kYXJkaXplZCAtLT4KLTwhRU5USVRZIGxzYXF1byAgIiYjODI0OTsiID48IS0tIHNpbmdsZSBsZWZ0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrLCBVKzIwMzkgSVNPIHByb3Bvc2VkIC0tPgotPCEtLSByc2FxdW8gaXMgcHJvcG9zZWQgYnV0IG5vdCB5ZXQgSVNPIHN0YW5kYXJkaXplZCAtLT4KLTwhRU5USVRZIHJzYXF1byAgIiYjODI1MDsiID48IS0tIHNpbmdsZSByaWdodC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaywgVSsyMDNBIElTTyBwcm9wb3NlZCAtLT4KLTwhRU5USVRZIGV1cm8gICAgIiYjODM2NDsiID48IS0tIGV1cm8gc2lnbiwgVSsyMEFDIE5FVyAtLT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtc3BlY2lhbC5lbnQgLS0+Ci0KLQotPCEtLSBlbmQgb2YgeGh0bWwtY2hhcmVudC0xLm1vZCAtLT4KLV1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1mcmFtZXdvcmstMS5tb2QgLS0+Ci0KLQotPCEtLSBYSFRNTCBDb3JlIE1vZHVsZXMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgcHJlLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQQotICAgICAgfCAlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgJUFuY2hvci5jbGFzczsKLSAgICAgICVJbmxpbmUuZXh0cmE7ICkqIgotPgotCi08IUVOVElUWSAlIHhodG1sLXRleHQubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBUZXh0IDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXRleHQtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgVGV4dCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtdGV4dC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgVGV4dCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXRleHQtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gVGV4dHVhbCBDb250ZW50Ci0KLSAgICAgVGhlIFRleHQgbW9kdWxlIGluY2x1ZGVzIGRlY2xhcmF0aW9ucyBmb3IgYWxsIGNvcmUKLSAgICAgdGV4dCBjb250YWluZXIgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMuCi0tLT4KLQotPCFFTlRJVFkgJSB4aHRtbC1pbmxzdHJ1Y3QubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtaW5sc3RydWN0Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWlubHN0cnVjdC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBTdHJ1Y3R1cmFsIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtaW5sc3RydWN0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIElubGluZSBTdHJ1Y3R1cmFsIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWlubHN0cnVjdC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFN0cnVjdHVyYWwgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1pbmxzdHJ1Y3QtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSW5saW5lIFN0cnVjdHVyYWwKLQotICAgICAgICBiciwgc3BhbgotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcwotICAgICB1c2VkIHRvIHN1cHBvcnQgaW5saW5lLWxldmVsIHN0cnVjdHVyYWwgbWFya3VwLgotLS0+Ci0KLTwhLS0gYnI6IGZvcmNlZCBsaW5lIGJyZWFrIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGJyLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYnIuZWxlbWVudDtbCi0KLTwhRU5USVRZICUgYnIuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIGJyLnFuYW1lICAiYnIiID4KLTwhRUxFTUVOVCAlYnIucW5hbWU7ICAlYnIuY29udGVudDsgPgotCi08IS0tIGVuZCBvZiBici5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYnIuYXR0bGlzdDtbCi08IUFUVExJU1QgJWJyLnFuYW1lOwotICAgICAgJUNvcmUuYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYnIuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBzcGFuOiBnZW5lcmljIGlubGluZSBjb250YWluZXIgLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgc3Bhbi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXNwYW4uZWxlbWVudDtbCi08IUVOVElUWSAlIHNwYW4uY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBzcGFuLnFuYW1lICAic3BhbiIgPgotPCFFTEVNRU5UICVzcGFuLnFuYW1lOyAgJXNwYW4uY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc3Bhbi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHNwYW4uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzcGFuLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzcGFuLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBzcGFuLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWlubHN0cnVjdC0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWlubHBocmFzLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWlubHBocmFzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWlubHBocmFzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFBocmFzYWwgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1pbmxwaHJhcy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBJbmxpbmUgUGhyYXNhbCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1pbmxwaHJhcy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFBocmFzYWwgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1pbmxwaHJhcy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbmxpbmUgUGhyYXNhbAotCi0gICAgICAgIGFiYnIsIGFjcm9ueW0sIGNpdGUsIGNvZGUsIGRmbiwgZW0sIGtiZCwgcSwgc2FtcCwgc3Ryb25nLCB2YXIKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgdXNlZCB0bwotICAgICBzdXBwb3J0IGlubGluZS1sZXZlbCBwaHJhc2FsIG1hcmt1cC4KLS0tPgotCi08IUVOVElUWSAlIGFiYnIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVhYmJyLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBhYmJyLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYWJici5xbmFtZSAgImFiYnIiID4KLTwhRUxFTUVOVCAlYWJici5xbmFtZTsgICVhYmJyLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGFiYnIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhYmJyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYWJici5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYWJici5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYWJici5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGFjcm9ueW0uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVhY3JvbnltLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBhY3JvbnltLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYWNyb255bS5xbmFtZSAgImFjcm9ueW0iID4KLTwhRUxFTUVOVCAlYWNyb255bS5xbmFtZTsgICVhY3JvbnltLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGFjcm9ueW0uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhY3JvbnltLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYWNyb255bS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYWNyb255bS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYWNyb255bS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGNpdGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVjaXRlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBjaXRlLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgY2l0ZS5xbmFtZSAgImNpdGUiID4KLTwhRUxFTUVOVCAlY2l0ZS5xbmFtZTsgICVjaXRlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGNpdGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjaXRlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslY2l0ZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlY2l0ZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgY2l0ZS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGNvZGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVjb2RlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBjb2RlLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgY29kZS5xbmFtZSAgImNvZGUiID4KLTwhRUxFTUVOVCAlY29kZS5xbmFtZTsgICVjb2RlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGNvZGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjb2RlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslY29kZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlY29kZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgY29kZS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGRmbi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWRmbi5lbGVtZW50O1sKLTwhRU5USVRZICUgZGZuLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgZGZuLnFuYW1lICAiZGZuIiA+Ci08IUVMRU1FTlQgJWRmbi5xbmFtZTsgICVkZm4uY29udGVudDsgPgotPCEtLSBlbmQgb2YgZGZuLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZGZuLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZGZuLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVkZm4ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGRmbi5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGVtLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZW0uZWxlbWVudDtbCi08IUVOVElUWSAlIGVtLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgZW0ucW5hbWUgICJlbSIgPgotPCFFTEVNRU5UICVlbS5xbmFtZTsgICVlbS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBlbS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGVtLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZW0uYXR0bGlzdDtbCi08IUFUVExJU1QgJWVtLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBlbS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGtiZC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWtiZC5lbGVtZW50O1sKLTwhRU5USVRZICUga2JkLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUga2JkLnFuYW1lICAia2JkIiA+Ci08IUVMRU1FTlQgJWtiZC5xbmFtZTsgICVrYmQuY29udGVudDsgPgotPCEtLSBlbmQgb2Yga2JkLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUga2JkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsla2JkLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVrYmQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGtiZC5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHEuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVxLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBxLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgcS5xbmFtZSAgInEiID4KLTwhRUxFTUVOVCAlcS5xbmFtZTsgICVxLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBxLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslcS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgY2l0ZSAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgcS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHNhbXAuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzYW1wLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzYW1wLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc2FtcC5xbmFtZSAgInNhbXAiID4KLTwhRUxFTUVOVCAlc2FtcC5xbmFtZTsgICVzYW1wLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHNhbXAuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzYW1wLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc2FtcC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc2FtcC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygc2FtcC5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHN0cm9uZy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXN0cm9uZy5lbGVtZW50O1sKLTwhRU5USVRZICUgc3Ryb25nLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc3Ryb25nLnFuYW1lICAic3Ryb25nIiA+Ci08IUVMRU1FTlQgJXN0cm9uZy5xbmFtZTsgICVzdHJvbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc3Ryb25nLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3Ryb25nLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc3Ryb25nLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzdHJvbmcucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHN0cm9uZy5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHZhci5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXZhci5lbGVtZW50O1sKLTwhRU5USVRZICUgdmFyLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgdmFyLnFuYW1lICAidmFyIiA+Ci08IUVMRU1FTlQgJXZhci5xbmFtZTsgICV2YXIuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdmFyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdmFyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldmFyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV2YXIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHZhci5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1pbmxwaHJhcy0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWJsa3N0cnVjdC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1ibGtzdHJ1Y3QubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtYmxrc3RydWN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgU3RydWN0dXJhbCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWJsa3N0cnVjdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCbG9jayBTdHJ1Y3R1cmFsIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1ibGtzdHJ1Y3QtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJsb2NrIFN0cnVjdHVyYWwgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1ibGtzdHJ1Y3QtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQmxvY2sgU3RydWN0dXJhbAotCi0gICAgICAgIGRpdiwgcAotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyB1c2VkIHRvCi0gICAgIHN1cHBvcnQgYmxvY2stbGV2ZWwgc3RydWN0dXJhbCBtYXJrdXAuCi0tLT4KLQotPCFFTlRJVFkgJSBkaXYuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVkaXYuZWxlbWVudDtbCi08IUVOVElUWSAlIGRpdi5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBkaXYucW5hbWUgICJkaXYiID4KLTwhRUxFTUVOVCAlZGl2LnFuYW1lOyAgJWRpdi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBkaXYuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkaXYuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVkaXYuYXR0bGlzdDtbCi08IUFUVExJU1QgJWRpdi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZGl2LmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgcC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXAuZWxlbWVudDtbCi08IUVOVElUWSAlIHAuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIiA+Ci08IUVOVElUWSAlIHAucW5hbWUgICJwIiA+Ci08IUVMRU1FTlQgJXAucW5hbWU7ICAlcC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBwLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgcC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXAuYXR0bGlzdDtbCi08IUFUVExJU1QgJXAucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHAuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYmxrc3RydWN0LTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtYmxrcGhyYXMubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtYmxrcGhyYXMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtYmxrcGhyYXMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCbG9jayBQaHJhc2FsIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtYmxrcGhyYXMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQmxvY2sgUGhyYXNhbCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYmxrcGhyYXMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJsb2NrIFBocmFzYWwgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1ibGtwaHJhcy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBCbG9jayBQaHJhc2FsCi0KLSAgICAgICAgYWRkcmVzcywgYmxvY2txdW90ZSwgcHJlLCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2Ci0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIHVzZWQgdG8KLSAgICAgc3VwcG9ydCBibG9jay1sZXZlbCBwaHJhc2FsIG1hcmt1cC4KLS0tPgotCi08IUVOVElUWSAlIGFkZHJlc3MuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVhZGRyZXNzLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBhZGRyZXNzLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIgPgotPCFFTlRJVFkgJSBhZGRyZXNzLnFuYW1lICAiYWRkcmVzcyIgPgotPCFFTEVNRU5UICVhZGRyZXNzLnFuYW1lOyAgJWFkZHJlc3MuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYWRkcmVzcy5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGFkZHJlc3MuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVhZGRyZXNzLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVhZGRyZXNzLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBhZGRyZXNzLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgYmxvY2txdW90ZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWJsb2NrcXVvdGUuZWxlbWVudDtbCi08IUVOVElUWSAlIGJsb2NrcXVvdGUuY29udGVudAotICAgICAiKCAlQmxvY2subWl4OyApKyIKLT4KLTwhRU5USVRZICUgYmxvY2txdW90ZS5xbmFtZSAgImJsb2NrcXVvdGUiID4KLTwhRUxFTUVOVCAlYmxvY2txdW90ZS5xbmFtZTsgICVibG9ja3F1b3RlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGJsb2NrcXVvdGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBibG9ja3F1b3RlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYmxvY2txdW90ZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYmxvY2txdW90ZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgY2l0ZSAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgYmxvY2txdW90ZS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHByZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXByZS5lbGVtZW50O1sKLTwhRU5USVRZICUgcHJlLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQQotICAgICAgfCAlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgfCAldHQucW5hbWU7IHwgJWkucW5hbWU7IHwgJWIucW5hbWU7Ci0gICAgICAlSTE4bi5jbGFzczsKLSAgICAgICVBbmNob3IuY2xhc3M7Ci0gICAgICB8ICVzY3JpcHQucW5hbWU7IHwgJW1hcC5xbmFtZTsKLSAgICAgICVJbmxpbmUuZXh0cmE7ICkqIgotPgotPCFFTlRJVFkgJSBwcmUucW5hbWUgICJwcmUiID4KLTwhRUxFTUVOVCAlcHJlLnFuYW1lOyAgJXByZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBwcmUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBwcmUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVwcmUuYXR0bGlzdDtbCi08IUFUVExJU1QgJXByZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgeG1sOnNwYWNlICAgICggcHJlc2VydmUgKSAgICAgICAgICAgICAjRklYRUQgJ3ByZXNlcnZlJwotPgotPCEtLSBlbmQgb2YgcHJlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLiAgSGVhZGluZyBFbGVtZW50cyAgLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBIZWFkaW5nLmNvbnRlbnQgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiID4KLQotPCFFTlRJVFkgJSBoMS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWgxLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoMS5xbmFtZSAgImgxIiA+Ci08IUVMRU1FTlQgJWgxLnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoMS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWgxLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoMS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDEuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoMi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWgyLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoMi5xbmFtZSAgImgyIiA+Ci08IUVMRU1FTlQgJWgyLnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoMi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWgyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoMi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDIuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoMy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWgzLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoMy5xbmFtZSAgImgzIiA+Ci08IUVMRU1FTlQgJWgzLnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDMuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoMy5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWgzLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoMy5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDMuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWg0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoNC5xbmFtZSAgImg0IiA+Ci08IUVMRU1FTlQgJWg0LnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWg0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoNC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDQuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWg1LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoNS5xbmFtZSAgImg1IiA+Ci08IUVMRU1FTlQgJWg1LnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWg1LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoNS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDUuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWg2LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoNi5xbmFtZSAgImg2IiA+Ci08IUVMRU1FTlQgJWg2LnFuYW1lOyAgJUhlYWRpbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaDYuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoNi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWg2LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVoNi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaDYuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYmxrcGhyYXMtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtdGV4dC0xLm1vZCAtLT4KLQotCi08IUVOVElUWSAlIHhodG1sLWh5cGVydGV4dC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEh5cGVydGV4dCAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1oeXBlcnRleHQtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSHlwZXJ0ZXh0IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaHlwZXJ0ZXh0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBIeXBlcnRleHQgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1oeXBlcnRleHQtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSHlwZXJ0ZXh0Ci0KLSAgICAgICAgYQotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBhbmNob3IgKCdhJykgZWxlbWVudCB0eXBlLCB3aGljaAotICAgICBkZWZpbmVzIHRoZSBzb3VyY2Ugb2YgYSBoeXBlcnRleHQgbGluay4gVGhlIGRlc3RpbmF0aW9uCi0gICAgIChvciBsaW5rICd0YXJnZXQnKSBpcyBpZGVudGlmaWVkIHZpYSBpdHMgJ2lkJyBhdHRyaWJ1dGUKLSAgICAgcmF0aGVyIHRoYW4gdGhlICduYW1lJyBhdHRyaWJ1dGUgYXMgd2FzIHVzZWQgaW4gSFRNTC4KLS0tPgotCi08IS0tIC4uLi4uLi4uLi4uLiAgQW5jaG9yIEVsZW1lbnQgIC4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBhLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYS5lbGVtZW50O1sKLTwhRU5USVRZICUgYS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5sTm9BbmNob3IubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYS5xbmFtZSAgImEiID4KLTwhRUxFTUVOVCAlYS5xbmFtZTsgICVhLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgaHJlZiAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgY2hhcnNldCAgICAgICVDaGFyc2V0LmRhdGF0eXBlOyAgICAgICAjSU1QTElFRAotICAgICAgdHlwZSAgICAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAjSU1QTElFRAotICAgICAgaHJlZmxhbmcgICAgICVMYW5ndWFnZUNvZGUuZGF0YXR5cGU7ICAjSU1QTElFRAotICAgICAgcmVsICAgICAgICAgICVMaW5rVHlwZXMuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgcmV2ICAgICAgICAgICVMaW5rVHlwZXMuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgYWNjZXNza2V5ICAgICVDaGFyYWN0ZXIuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgdGFiaW5kZXggICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgYS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1oeXBlcnRleHQtMS5tb2QgLS0+Ci0KLQotPCFFTlRJVFkgJSB4aHRtbC1saXN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTGlzdHMgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbGlzdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBMaXN0cyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1saXN0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBMaXN0cyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWxpc3QtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTGlzdHMKLQotICAgICAgICBkbCwgZHQsIGRkLCBvbCwgdWwsIGxpCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGxpc3Qtb3JpZW50ZWQgZWxlbWVudCB0eXBlcwotICAgICBhbmQgdGhlaXIgYXR0cmlidXRlcy4KLS0tPgotCi08IUVOVElUWSAlIGRsLnFuYW1lICAiZGwiID4KLTwhRU5USVRZICUgZHQucW5hbWUgICJkdCIgPgotPCFFTlRJVFkgJSBkZC5xbmFtZSAgImRkIiA+Ci08IUVOVElUWSAlIG9sLnFuYW1lICAib2wiID4KLTwhRU5USVRZICUgdWwucW5hbWUgICJ1bCIgPgotPCFFTlRJVFkgJSBsaS5xbmFtZSAgImxpIiA+Ci0KLTwhLS0gZGw6IERlZmluaXRpb24gTGlzdCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGRsLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZGwuZWxlbWVudDtbCi08IUVOVElUWSAlIGRsLmNvbnRlbnQgICIoICVkdC5xbmFtZTsgfCAlZGQucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJWRsLnFuYW1lOyAgJWRsLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGRsLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZGwuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVkbC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZGwucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGRsLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZHQ6IERlZmluaXRpb24gVGVybSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGR0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZHQuZWxlbWVudDtbCi08IUVOVElUWSAlIGR0LmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAlZHQucW5hbWU7ICAlZHQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgZHQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkdC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWR0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVkdC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZHQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBkZDogRGVmaW5pdGlvbiBEZXNjcmlwdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgZGQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVkZC5lbGVtZW50O1sKLTwhRU5USVRZICUgZGQuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3cubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAlZGQucW5hbWU7ICAlZGQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgZGQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkZC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWRkLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVkZC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZGQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBvbDogT3JkZXJlZCBMaXN0IChudW1iZXJlZCBzdHlsZXMpIC4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgb2wuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVvbC5lbGVtZW50O1sKLTwhRU5USVRZICUgb2wuY29udGVudCAgIiggJWxpLnFuYW1lOyApKyIgPgotPCFFTEVNRU5UICVvbC5xbmFtZTsgICVvbC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBvbC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIG9sLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslb2wuYXR0bGlzdDtbCi08IUFUVExJU1QgJW9sLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBvbC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHVsOiBVbm9yZGVyZWQgTGlzdCAoYnVsbGV0IHN0eWxlcykgLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSB1bC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXVsLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB1bC5jb250ZW50ICAiKCAlbGkucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJXVsLnFuYW1lOyAgJXVsLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHVsLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdWwuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV1bC5hdHRsaXN0O1sKLTwhQVRUTElTVCAldWwucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHVsLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gbGk6IExpc3QgSXRlbSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGxpLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslbGkuZWxlbWVudDtbCi08IUVOVElUWSAlIGxpLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Lm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJWxpLnFuYW1lOyAgJWxpLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGxpLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgbGkuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVsaS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlbGkucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGxpLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWxpc3QtMS5tb2QgLS0+Ci0KLTwhLS0gRXh0ZW5kIGxpc3RzIHdpdGggdmFsdWUgYW5kIHN0YXJ0IGF0dHJpYnV0ZXMgLS0+IAotPCFBVFRMSVNUICVsaS5xbmFtZTsKLSAgICAgIHZhbHVlICAgICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgICNJTVBMSUVECi0+Ci08IUFUVExJU1QgJW9sLnFuYW1lOwotICAgICAgc3RhcnQgICAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotCi08IS0tIDo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6IC0tPgotCi08IS0tIEltYWdlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWltYWdlLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW1hZ2VzIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWltYWdlLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEltYWdlcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWltYWdlLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSb3Zpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbWFnZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1pbWFnZS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbWFnZXMKLQotICAgICAgICBpbWcKLQotICAgICBUaGlzIG1vZHVsZSBwcm92aWRlcyBtYXJrdXAgdG8gc3VwcG9ydCBiYXNpYyBpbWFnZSBlbWJlZGRpbmcuCi0tLT4KLQotPCEtLSBUbyBhdm9pZCBwcm9ibGVtcyB3aXRoIHRleHQtb25seSBVQXMgYXMgd2VsbCBhcyB0byBtYWtlCi0gICAgIGltYWdlIGNvbnRlbnQgdW5kZXJzdGFuZGFibGUgYW5kIG5hdmlnYWJsZSB0byB1c2VycyBvZgotICAgICBub24tdmlzdWFsIFVBcywgeW91IG5lZWQgdG8gcHJvdmlkZSBhIGRlc2NyaXB0aW9uIHdpdGgKLSAgICAgdGhlICdhbHQnIGF0dHJpYnV0ZSwgYW5kIGF2b2lkIHNlcnZlci1zaWRlIGltYWdlIG1hcHMuCi0tLT4KLQotPCFFTlRJVFkgJSBpbWcuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVpbWcuZWxlbWVudDtbCi08IUVOVElUWSAlIGltZy5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgaW1nLnFuYW1lICAiaW1nIiA+Ci08IUVMRU1FTlQgJWltZy5xbmFtZTsgICVpbWcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaW1nLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaW1nLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaW1nLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVpbWcucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIHNyYyAgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI1JFUVVJUkVECi0gICAgICBhbHQgICAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNSRVFVSVJFRAotICAgICAgbG9uZ2Rlc2MgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgaGVpZ2h0ICAgICAgICVMZW5ndGguZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgd2lkdGggICAgICAgICVMZW5ndGguZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgaW1nLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWltYWdlLTEubW9kIC0tPgotCi0KLTwhLS0gVGFibGVzIE1vZHVsZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtdGFibGUubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNpYyBUYWJsZXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmFzaWMtdGFibGUtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEJhc2ljIFRhYmxlIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1iYXNpYy10YWJsZS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwgQmFzaWMsIGEgcHJvcGVyIHN1YnNldCBvZiBYSFRNTC4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNpYyBUYWJsZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1iYXNpYy10YWJsZS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBCYXNpYyBUYWJsZXMKLQotICAgICAgICB0YWJsZSwgY2FwdGlvbiwgdHIsIHRoLCB0ZAotCi0gICAgIFRoaXMgdGFibGUgbW9kdWxlIGRlY2xhcmVzIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGRlZmluaW5nCi0gICAgIGEgdGFibGUgbW9kZWwgYmFzZWQgZnVuZGFtZW50YWxseSBvbiBmZWF0dXJlcyBmb3VuZCBpbiB0aGUKLSAgICAgd2lkZWx5LWRlcGxveWVkIEhUTUwgMy4yIHRhYmxlIG1vZGVsLiAgV2hpbGUgdGhpcyBtb2R1bGUKLSAgICAgbWltaWNzIHRoZSBjb250ZW50IG1vZGVsIGFuZCB0YWJsZSBhdHRyaWJ1dGVzIG9mIEhUTUwgMy4yCi0gICAgIHRhYmxlcywgdGhlIGVsZW1lbnQgdHlwZXMgZGVjbGFyZWQgaGVyZWluIGFsc28gaW5jbHVkZXMgYWxsCi0gICAgIEhUTUwgNCBjb21tb24gYW5kIG1vc3Qgb2YgdGhlIEhUTUwgNCB0YWJsZSBhdHRyaWJ1dGVzLgotLS0+Ci0KLTwhLS0gZGVjbGFyZSBxdWFsaWZpZWQgZWxlbWVudCB0eXBlIG5hbWVzOgotLS0+Ci08IUVOVElUWSAlIHRhYmxlLnFuYW1lICAidGFibGUiID4KLTwhRU5USVRZICUgY2FwdGlvbi5xbmFtZSAgImNhcHRpb24iID4KLTwhRU5USVRZICUgdHIucW5hbWUgICJ0ciIgPgotPCFFTlRJVFkgJSB0aC5xbmFtZSAgInRoIiA+Ci08IUVOVElUWSAlIHRkLnFuYW1lICAidGQiID4KLQotPCEtLSBob3Jpem9udGFsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzCi0tLT4KLTwhRU5USVRZICUgQ2VsbEhBbGlnbi5hdHRyaWIKLSAgICAgImFsaWduICAgICAgICAoIGxlZnQKLSAgICAgICAgICAgICAgICAgICB8IGNlbnRlcgotICAgICAgICAgICAgICAgICAgIHwgcmlnaHQgKSAgICAgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCEtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cwotLS0+Ci08IUVOVElUWSAlIENlbGxWQWxpZ24uYXR0cmliCi0gICAgICJ2YWxpZ24gICAgICAgKCB0b3AKLSAgICAgICAgICAgICAgICAgICB8IG1pZGRsZQotICAgICAgICAgICAgICAgICAgIHwgYm90dG9tICkgICAgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCEtLSBzY29wZSBpcyBzaW1wbGVyIHRoYW4gYXhlcyBhdHRyaWJ1dGUgZm9yIGNvbW1vbiB0YWJsZXMKLS0tPgotPCFFTlRJVFkgJSBzY29wZS5hdHRyaWIKLSAgICAgInNjb3BlICAgICAgICAoIHJvdyB8IGNvbCAgKSAgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhLS0gdGFibGU6IFRhYmxlIEVsZW1lbnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHRhYmxlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGFibGUuZWxlbWVudDtbCi08IUVOVElUWSAlIHRhYmxlLmNvbnRlbnQKLSAgICAgIiggJWNhcHRpb24ucW5hbWU7PywgJXRyLnFuYW1lOysgKSIKLT4KLTwhRUxFTUVOVCAldGFibGUucW5hbWU7ICAldGFibGUuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdGFibGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0YWJsZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRhYmxlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0YWJsZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgc3VtbWFyeSAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgdGFibGUuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBjYXB0aW9uOiBUYWJsZSBDYXB0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgY2FwdGlvbi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWNhcHRpb24uZWxlbWVudDtbCi08IUVOVElUWSAlIGNhcHRpb24uY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTEVNRU5UICVjYXB0aW9uLnFuYW1lOyAgJWNhcHRpb24uY29udGVudDsgPgotPCEtLSBlbmQgb2YgY2FwdGlvbi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGNhcHRpb24uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVjYXB0aW9uLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVjYXB0aW9uLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBjYXB0aW9uLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdHI6IFRhYmxlIFJvdyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHRyLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldHIuZWxlbWVudDtbCi08IUVOVElUWSAlIHRyLmNvbnRlbnQgICIoICV0aC5xbmFtZTsgfCAldGQucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJXRyLnFuYW1lOyAgJXRyLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdHIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0ci5hdHRsaXN0O1sKLTwhQVRUTElTVCAldHIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgICVDZWxsSEFsaWduLmF0dHJpYjsKLSAgICAgICVDZWxsVkFsaWduLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHRyLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdGg6IFRhYmxlIEhlYWRlciBDZWxsIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIHRoIGlzIGZvciBoZWFkZXIgY2VsbHMsIHRkIGZvciBkYXRhLAotICAgICBidXQgZm9yIGNlbGxzIGFjdGluZyBhcyBib3RoIHVzZSB0ZAotLS0+Ci0KLTwhRU5USVRZICUgdGguZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0aC5lbGVtZW50O1sKLTwhRU5USVRZICUgdGguY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3dOb1RhYmxlLm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJXRoLnFuYW1lOyAgJXRoLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRoLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGguYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0aC5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGgucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGFiYnIgICAgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGF4aXMgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGhlYWRlcnMgICAgICBJRFJFRlMgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgICVzY29wZS5hdHRyaWI7Ci0gICAgICByb3dzcGFuICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICcxJwotICAgICAgY29sc3BhbiAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAnMScKLSAgICAgICVDZWxsSEFsaWduLmF0dHJpYjsKLSAgICAgICVDZWxsVkFsaWduLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHRoLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdGQ6IFRhYmxlIERhdGEgQ2VsbCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHRkLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGQuZWxlbWVudDtbCi08IUVOVElUWSAlIHRkLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Tm9UYWJsZS5taXg7ICkqIgotPgotPCFFTEVNRU5UICV0ZC5xbmFtZTsgICV0ZC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0ZC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGQuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRkLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBhYmJyICAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0gICAgICBheGlzICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBoZWFkZXJzICAgICAgSURSRUZTICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICAlc2NvcGUuYXR0cmliOwotICAgICAgcm93c3BhbiAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAnMScKLSAgICAgIGNvbHNwYW4gICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgJzEnCi0gICAgICAlQ2VsbEhBbGlnbi5hdHRyaWI7Ci0gICAgICAlQ2VsbFZBbGlnbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0ZC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1iYXNpYy10YWJsZS0xLm1vZCAtLT4KLQotCi08IS0tIEZvcm1zIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gCi0JWEhUTUwgYmFzaWMgZm9ybXMgbW9kdWxlIGV4dGVuZGVkIHdpdGggb3B0Z3JvdXAgYW5kIGZpZWxkc2V0Ci0tLT4KLTwhRUxFTUVOVCAlb3B0Z3JvdXAucW5hbWU7ICglb3B0aW9uLnFuYW1lOykrPgotPCFBVFRMSVNUICVvcHRncm91cC5xbmFtZTsKLQklQ29tbW9uLmF0dHJpYjsgCi0JbGFiZWwgJVRleHQuZGF0YXR5cGU7ICNSRVFVSVJFRAotPgotPCFFTlRJVFkgJSBzZWxlY3QuY29udGVudCAiKCAlb3B0Z3JvdXAucW5hbWU7IHwgJW9wdGlvbi5xbmFtZTsgKSsiPgotPCFFTEVNRU5UICVmaWVsZHNldC5xbmFtZTsgKCNQQ0RBVEEgfCAlRmxvdy5taXg7KSo+Ci08IUFUVExJU1QgJWZpZWxkc2V0LnFuYW1lOwotCSVDb21tb24uYXR0cmliOyAKLT4KLTwhRU5USVRZICUgZm9ybS5jb250ZW50ICIoICVCbGtOb0Zvcm0ubWl4OyB8ICVmaWVsZHNldC5xbmFtZTsgKSsiPgotPCFFTlRJVFkgJSB4aHRtbC1mb3JtLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmFzaWMgRm9ybXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmFzaWMtZm9ybS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBTaW1wbGlmaWVkIEZvcm1zIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1iYXNpYy1mb3JtLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCBCYXNpYywgYSBwcm9wZXIgc3Vic2V0IG9mIFhIVE1MLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2ljIEZvcm1zIDEuMC8vRU4iICAKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1iYXNpYy1mb3JtLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEJhc2ljIEZvcm1zCi0KLSAgICAgVGhpcyBmb3JtcyBtb2R1bGUgaXMgYmFzZWQgb24gdGhlIEhUTUwgMy4yIGZvcm1zIG1vZGVsLCB3aXRoCi0gICAgIHRoZSBXQUktcmVxdWVzdGVkIGFkZGl0aW9uIG9mIHRoZSBsYWJlbCBlbGVtZW50LiBXaGlsZSB0aGlzIAotICAgICBtb2R1bGUgZXNzZW50aWFsbHkgbWltaWNzIHRoZSBjb250ZW50IG1vZGVsIGFuZCBhdHRyaWJ1dGVzIG9mIAotICAgICBIVE1MIDMuMiBmb3JtcywgdGhlIGVsZW1lbnQgdHlwZXMgZGVjbGFyZWQgaGVyZWluIGFsc28gaW5jbHVkZQotICAgICBhbGwgSFRNTCA0IGNvbW1vbiBhdHRyaWJ1dGVzLgotCi0gICAgICAgIGZvcm0sIGxhYmVsLCBpbnB1dCwgc2VsZWN0LCBvcHRpb24sIHRleHRhcmVhCi0tLT4KLQotPCEtLSBkZWNsYXJlIHF1YWxpZmllZCBlbGVtZW50IHR5cGUgbmFtZXM6Ci0tLT4KLTwhRU5USVRZICUgZm9ybS5xbmFtZSAgImZvcm0iID4KLTwhRU5USVRZICUgbGFiZWwucW5hbWUgICJsYWJlbCIgPgotPCFFTlRJVFkgJSBpbnB1dC5xbmFtZSAgImlucHV0IiA+Ci08IUVOVElUWSAlIHNlbGVjdC5xbmFtZSAgInNlbGVjdCIgPgotPCFFTlRJVFkgJSBvcHRpb24ucW5hbWUgICJvcHRpb24iID4KLTwhRU5USVRZICUgdGV4dGFyZWEucW5hbWUgICJ0ZXh0YXJlYSIgPgotCi08IS0tICVCbGtOb0Zvcm0ubWl4OyBpbmNsdWRlcyBhbGwgbm9uLWZvcm0gYmxvY2sgZWxlbWVudHMsCi0gICAgIHBsdXMgJU1pc2MuY2xhc3M7Ci0tLT4KLTwhRU5USVRZICUgQmxrTm9Gb3JtLm1peAotICAgICAiJUhlYWRpbmcuY2xhc3M7Ci0gICAgICB8ICVMaXN0LmNsYXNzOwotICAgICAgfCAlQmxrU3RydWN0LmNsYXNzOwotICAgICAgJUJsa1BocmFzLmNsYXNzOwotICAgICAgJUJsa1ByZXMuY2xhc3M7Ci0gICAgICB8ICV0YWJsZS5xbmFtZTsgCi0gICAgICAlQmxvY2suZXh0cmE7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhLS0gZm9ybTogRm9ybSBFbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGZvcm0uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVmb3JtLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBmb3JtLmNvbnRlbnQKLSAgICAgIiggJUJsa05vRm9ybS5taXg7ICkrIgotPgotPCFFTEVNRU5UICVmb3JtLnFuYW1lOyAgJWZvcm0uY29udGVudDsgPgotPCEtLSBlbmQgb2YgZm9ybS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGZvcm0uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVmb3JtLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVmb3JtLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBhY3Rpb24gICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgbWV0aG9kICAgICAgICggZ2V0IHwgcG9zdCApICAgICAgICAgICAnZ2V0JwotICAgICAgZW5jdHlwZSAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJwotPgotPCEtLSBlbmQgb2YgZm9ybS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGxhYmVsOiBGb3JtIEZpZWxkIExhYmVsIFRleHQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBsYWJlbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWxhYmVsLmVsZW1lbnQ7WwotPCEtLSBFYWNoIGxhYmVsIG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIE9ORSBmaWVsZAotLS0+Ci08IUVOVElUWSAlIGxhYmVsLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSAKLSAgICAgIHwgJWlucHV0LnFuYW1lOyB8ICVzZWxlY3QucW5hbWU7IHwgJXRleHRhcmVhLnFuYW1lOwotICAgICAgfCAlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgJUkxOG4uY2xhc3M7Ci0gICAgICAlSW5sUHJlcy5jbGFzczsKLSAgICAgICVJbmxTcGVjaWFsLmNsYXNzOwotICAgICAgJU1pc2MuY2xhc3M7ICkqIgotPgotPCFFTEVNRU5UICVsYWJlbC5xbmFtZTsgICVsYWJlbC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBsYWJlbC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGxhYmVsLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslbGFiZWwuYXR0bGlzdDtbCi08IUFUVExJU1QgJWxhYmVsLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBmb3IgICAgICAgICAgSURSRUYgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBhY2Nlc3NrZXkgICAgJUNoYXJhY3Rlci5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBsYWJlbC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGlucHV0OiBGb3JtIENvbnRyb2wgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBpbnB1dC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWlucHV0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBpbnB1dC5jb250ZW50ICAiRU1QVFkiID4KLTwhRUxFTUVOVCAlaW5wdXQucW5hbWU7ICAlaW5wdXQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaW5wdXQuZWxlbWVudCAtLT5dXT4KLQotPCEtLSBCYXNpYyBGb3JtcyByZW1vdmVzICdpbWFnZScgYW5kICdmaWxlJyBpbnB1dCB0eXBlcy4KLS0tPgotPCFFTlRJVFkgJSBpbnB1dC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWlucHV0LmF0dGxpc3Q7WwotPCFFTlRJVFkgJSBJbnB1dFR5cGUuY2xhc3MKLSAgICAgIiggdGV4dCB8IHBhc3N3b3JkIHwgY2hlY2tib3ggfCByYWRpbyAKLSAgICAgIHwgc3VibWl0IHwgcmVzZXQgfCBoaWRkZW4gKSIKLT4KLTwhLS0gYXR0cmlidXRlIG5hbWUgcmVxdWlyZWQgZm9yIGFsbCBidXQgc3VibWl0ICYgcmVzZXQKLS0tPgotPCFBVFRMSVNUICVpbnB1dC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgdHlwZSAgICAgICAgICVJbnB1dFR5cGUuY2xhc3M7ICAgICAgICAndGV4dCcKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHZhbHVlICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNoZWNrZWQgICAgICAoIGNoZWNrZWQgKSAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHNpemUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIG1heGxlbmd0aCAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIHNyYyAgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHRhYmluZGV4ICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIGFjY2Vzc2tleSAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGlucHV0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gc2VsZWN0OiBPcHRpb24gU2VsZWN0b3IgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHNlbGVjdC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXNlbGVjdC5lbGVtZW50O1sKLTwhRU5USVRZICUgc2VsZWN0LmNvbnRlbnQgICIoICVvcHRpb24ucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJXNlbGVjdC5xbmFtZTsgICVzZWxlY3QuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc2VsZWN0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc2VsZWN0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc2VsZWN0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzZWxlY3QucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHNpemUgICAgICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG11bHRpcGxlICAgICAoIG11bHRpcGxlICkgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHRhYmluZGV4ICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIHNlbGVjdC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIG9wdGlvbjogU2VsZWN0YWJsZSBDaG9pY2UgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBvcHRpb24uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVvcHRpb24uZWxlbWVudDtbCi08IUVOVElUWSAlIG9wdGlvbi5jb250ZW50ICAiKCAjUENEQVRBICkiID4KLTwhRUxFTUVOVCAlb3B0aW9uLnFuYW1lOyAgJW9wdGlvbi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBvcHRpb24uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBvcHRpb24uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVvcHRpb24uYXR0bGlzdDtbCi08IUFUVExJU1QgJW9wdGlvbi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgc2VsZWN0ZWQgICAgICggc2VsZWN0ZWQgKSAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgdmFsdWUgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2Ygb3B0aW9uLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdGV4dGFyZWE6IE11bHRpLUxpbmUgVGV4dCBGaWVsZCAuLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHRleHRhcmVhLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGV4dGFyZWEuZWxlbWVudDtbCi08IUVOVElUWSAlIHRleHRhcmVhLmNvbnRlbnQgICIoICNQQ0RBVEEgKSIgPgotPCFFTEVNRU5UICV0ZXh0YXJlYS5xbmFtZTsgICV0ZXh0YXJlYS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0ZXh0YXJlYS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRleHRhcmVhLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGV4dGFyZWEuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRleHRhcmVhLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBuYW1lICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICByb3dzICAgICAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNSRVFVSVJFRAotICAgICAgY29scyAgICAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjUkVRVUlSRUQKLSAgICAgIHRhYmluZGV4ICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIGFjY2Vzc2tleSAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIHRleHRhcmVhLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJhc2ljLWZvcm0tMS5tb2QgLS0+Ci0KLQotPCEtLSBMaW5rIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1saW5rLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTGluayBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWxpbmstMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgTGluayBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtbGluay0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTGluayBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbGluay0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBMaW5rIGVsZW1lbnQKLQotICAgICAgICBsaW5rCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGxpbmsgZWxlbWVudCB0eXBlIGFuZCBpdHMgYXR0cmlidXRlcywKLSAgICAgd2hpY2ggY291bGQgKGluIHByaW5jaXBsZSkgYmUgdXNlZCB0byBkZWZpbmUgZG9jdW1lbnQtbGV2ZWwgbGlua3MKLSAgICAgdG8gZXh0ZXJuYWwgcmVzb3VyY2VzIHN1Y2ggYXM6Ci0KLSAgICAgYSkgZm9yIGRvY3VtZW50IHNwZWNpZmljIHRvb2xiYXJzL21lbnVzLCBlLmcuIHN0YXJ0LCBjb250ZW50cywKLSAgICAgICAgcHJldmlvdXMsIG5leHQsIGluZGV4LCBlbmQsIGhlbHAKLSAgICAgYikgdG8gbGluayB0byBhIHNlcGFyYXRlIHN0eWxlIHNoZWV0IChyZWw9InN0eWxlc2hlZXQiKQotICAgICBjKSB0byBtYWtlIGEgbGluayB0byBhIHNjcmlwdCAocmVsPSJzY3JpcHQiKQotICAgICBkKSBieSBzdHlsZSBzaGVldHMgdG8gY29udHJvbCBob3cgY29sbGVjdGlvbnMgb2YgaHRtbCBub2RlcyBhcmUKLSAgICAgICAgcmVuZGVyZWQgaW50byBwcmludGVkIGRvY3VtZW50cwotICAgICBlKSB0byBtYWtlIGEgbGluayB0byBhIHByaW50YWJsZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgICAgZS5nLiBhIHBvc3RzY3JpcHQgb3IgcGRmIHZlcnNpb24gKHJlbD0iYWx0ZXJuYXRlIiBtZWRpYT0icHJpbnQiKQotLS0+Ci0KLTwhLS0gbGluazogTWVkaWEtSW5kZXBlbmRlbnQgTGluayAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGxpbmsuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVsaW5rLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBsaW5rLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBsaW5rLnFuYW1lICAibGluayIgPgotPCFFTEVNRU5UICVsaW5rLnFuYW1lOyAgJWxpbmsuY29udGVudDsgPgotPCEtLSBlbmQgb2YgbGluay5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGxpbmsuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVsaW5rLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVsaW5rLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBjaGFyc2V0ICAgICAgJUNoYXJzZXQuZGF0YXR5cGU7ICAgICAgICNJTVBMSUVECi0gICAgICBocmVmICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBocmVmbGFuZyAgICAgJUxhbmd1YWdlQ29kZS5kYXRhdHlwZTsgICNJTVBMSUVECi0gICAgICB0eXBlICAgICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNJTVBMSUVECi0gICAgICByZWwgICAgICAgICAgJUxpbmtUeXBlcy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICByZXYgICAgICAgICAgJUxpbmtUeXBlcy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICBtZWRpYSAgICAgICAgJU1lZGlhRGVzYy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBsaW5rLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWxpbmstMS5tb2QgLS0+Ci0KLQotPCEtLSBEb2N1bWVudCBNZXRhaW5mb3JtYXRpb24gTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1tZXRhLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTWV0YWluZm9ybWF0aW9uIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLW1ldGEtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgRG9jdW1lbnQgTWV0YWluZm9ybWF0aW9uIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtbWV0YS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTWV0YWluZm9ybWF0aW9uIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbWV0YS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBNZXRhIEluZm9ybWF0aW9uCi0KLSAgICAgICAgbWV0YQotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBtZXRhIGVsZW1lbnQgdHlwZSBhbmQgaXRzIGF0dHJpYnV0ZXMsCi0gICAgIHVzZWQgdG8gcHJvdmlkZSBkZWNsYXJhdGl2ZSBkb2N1bWVudCBtZXRhaW5mb3JtYXRpb24uCi0tLT4KLQotPCEtLSBtZXRhOiBHZW5lcmljIE1ldGFpbmZvcm1hdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgbWV0YS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJW1ldGEuZWxlbWVudDtbCi08IUVOVElUWSAlIG1ldGEuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIG1ldGEucW5hbWUgICJtZXRhIiA+Ci08IUVMRU1FTlQgJW1ldGEucW5hbWU7ICAlbWV0YS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBtZXRhLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgbWV0YS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJW1ldGEuYXR0bGlzdDtbCi08IUFUVExJU1QgJW1ldGEucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJUkxOG4uYXR0cmliOwotICAgICAgaHR0cC1lcXVpdiAgIE5NVE9LRU4gICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgbmFtZSAgICAgICAgIE5NVE9LRU4gICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgY29udGVudCAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjUkVRVUlSRUQKLSAgICAgIHNjaGVtZSAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIG1ldGEuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtbWV0YS0xLm1vZCAtLT4KLQotCi08IS0tIEJhc2UgRWxlbWVudCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWJhc2UubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNlIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmFzZS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCYXNlIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1iYXNlLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNlIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1iYXNlLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEJhc2UgZWxlbWVudAotCi0gICAgICAgIGJhc2UKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgYmFzZSBlbGVtZW50IHR5cGUgYW5kIGl0cyBhdHRyaWJ1dGVzLAotICAgICB1c2VkIHRvIGRlZmluZSBhIGJhc2UgVVJJIGFnYWluc3Qgd2hpY2ggcmVsYXRpdmUgVVJJcyBpbiB0aGUKLSAgICAgZG9jdW1lbnQgd2lsbCBiZSByZXNvbHZlZC4KLQotICAgICBOb3RlIHRoYXQgdGhpcyBtb2R1bGUgYWxzbyByZWRlY2xhcmVzIHRoZSBjb250ZW50IG1vZGVsIGZvcgotICAgICB0aGUgaGVhZCBlbGVtZW50IHRvIGluY2x1ZGUgdGhlIGJhc2UgZWxlbWVudC4KLS0tPgotCi08IS0tIGJhc2U6IERvY3VtZW50IEJhc2UgVVJJIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBiYXNlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYmFzZS5lbGVtZW50O1sKLTwhRU5USVRZICUgYmFzZS5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgYmFzZS5xbmFtZSAgImJhc2UiID4KLTwhRUxFTUVOVCAlYmFzZS5xbmFtZTsgICViYXNlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGJhc2UuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBiYXNlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYmFzZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYmFzZS5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICBocmVmICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNSRVFVSVJFRAotPgotPCEtLSBlbmQgb2YgYmFzZS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGhlYWQuY29udGVudAotICAgICIoICVIZWFkT3B0cy5taXg7LAotICAgICAoICggJXRpdGxlLnFuYW1lOywgJUhlYWRPcHRzLm1peDssICggJWJhc2UucW5hbWU7LCAlSGVhZE9wdHMubWl4OyApPyApCi0gICAgIHwgKCAlYmFzZS5xbmFtZTssICVIZWFkT3B0cy5taXg7LCAoICV0aXRsZS5xbmFtZTssICVIZWFkT3B0cy5taXg7ICkpKSkiCi0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJhc2UtMS5tb2QgLS0+Ci0KLQotPCEtLSBTdHlsZXNoZWV0cyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1zdHlsZS5tb2QgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFN0eWxlIFNoZWV0cyAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1zdHlsZS0xLm1vZCI+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIERvY3VtZW50IFN0eWxlIFNoZWV0IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXN0eWxlLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgU3R5bGUgU2hlZXRzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtc3R5bGUtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gU3R5bGUgU2hlZXRzCi0KLSAgICAgICAgc3R5bGUKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgc3R5bGUgZWxlbWVudCB0eXBlIGFuZCBpdHMgYXR0cmlidXRlcywKLSAgICAgdXNlZCB0byBlbWJlZCBzdHlsZSBzaGVldCBpbmZvcm1hdGlvbiBpbiB0aGUgZG9jdW1lbnQgaGVhZCBlbGVtZW50LgotLS0+Ci0KLTwhLS0gc3R5bGU6IFN0eWxlIFNoZWV0IEluZm9ybWF0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHN0eWxlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc3R5bGUuZWxlbWVudDtbCi08IUVOVElUWSAlIHN0eWxlLmNvbnRlbnQgICIoICNQQ0RBVEEgKSIgPgotPCFFTlRJVFkgJSBzdHlsZS5xbmFtZSAgInN0eWxlIiA+Ci08IUVMRU1FTlQgJXN0eWxlLnFuYW1lOyAgJXN0eWxlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHN0eWxlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3R5bGUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVzdHlsZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc3R5bGUucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJXRpdGxlLmF0dHJpYjsKLSAgICAgICVJMThuLmF0dHJpYjsKLSAgICAgIHR5cGUgICAgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI1JFUVVJUkVECi0gICAgICBtZWRpYSAgICAgICAgJU1lZGlhRGVzYy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICB4bWw6c3BhY2UgICAgKCBwcmVzZXJ2ZSApICAgICAgICAgICAgICNGSVhFRCAncHJlc2VydmUnCi0+Ci08IS0tIGVuZCBvZiBzdHlsZS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1zdHlsZS0xLm1vZCAtLT4KLQotCi08IS0tIFBhcmFtIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXBhcmFtLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgUGFyYW0gRWxlbWVudCAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1wYXJhbS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBQYXJhbSBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtcGFyYW0tMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFBhcmFtIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1wYXJhbS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBQYXJhbWV0ZXJzIGZvciBKYXZhIEFwcGxldHMgYW5kIEVtYmVkZGVkIE9iamVjdHMKLQotICAgICAgICBwYXJhbQotCi0gICAgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGRlY2xhcmF0aW9ucyBmb3IgdGhlIHBhcmFtIGVsZW1lbnQsCi0gICAgIHVzZWQgdG8gcHJvdmlkZSBuYW1lZCBwcm9wZXJ0eSB2YWx1ZXMgZm9yIHRoZSBhcHBsZXQKLSAgICAgYW5kIG9iamVjdCBlbGVtZW50cy4KLS0tPgotCi08IS0tIHBhcmFtOiBOYW1lZCBQcm9wZXJ0eSBWYWx1ZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBwYXJhbS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXBhcmFtLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBwYXJhbS5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgcGFyYW0ucW5hbWUgICJwYXJhbSIgPgotPCFFTEVNRU5UICVwYXJhbS5xbmFtZTsgICVwYXJhbS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBwYXJhbS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHBhcmFtLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslcGFyYW0uYXR0bGlzdDtbCi08IUFUVExJU1QgJXBhcmFtLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgICVpZC5hdHRyaWI7Ci0gICAgICBuYW1lICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgdmFsdWUgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgdmFsdWV0eXBlICAgICggZGF0YSB8IHJlZiB8IG9iamVjdCApICAnZGF0YScKLSAgICAgIHR5cGUgICAgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIHBhcmFtLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXBhcmFtLTEubW9kIC0tPgotCi0KLTwhLS0gRW1iZWRkZWQgT2JqZWN0IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtb2JqZWN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRW1iZWRkZWQgT2JqZWN0IDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLW9iamVjdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBFbWJlZGRlZCBPYmplY3QgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1vYmplY3QtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sLW1vYmlsZTEwLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEVtYmVkZGVkIE9iamVjdCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLW9iamVjdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBFbWJlZGRlZCBPYmplY3RzCi0KLSAgICAgICAgb2JqZWN0Ci0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIG9iamVjdCBlbGVtZW50IHR5cGUgYW5kIGl0cyBhdHRyaWJ1dGVzLCB1c2VkCi0gICAgIHRvIGVtYmVkIGV4dGVybmFsIG9iamVjdHMgYXMgcGFydCBvZiBYSFRNTCBwYWdlcy4gSW4gdGhlIGRvY3VtZW50LAotICAgICBwbGFjZSBwYXJhbSBlbGVtZW50cyBwcmlvciB0byBvdGhlciBjb250ZW50IHdpdGhpbiB0aGUgb2JqZWN0IGVsZW1lbnQuCi0KLSAgICAgTm90ZSB0aGF0IHVzZSBvZiB0aGlzIG1vZHVsZSByZXF1aXJlcyBpbnN0YW50aWF0aW9uIG9mIHRoZSBQYXJhbQotICAgICBFbGVtZW50IE1vZHVsZS4KLS0tPgotCi08IS0tIG9iamVjdDogR2VuZXJpYyBFbWJlZGRlZCBPYmplY3QgLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBvYmplY3QuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVvYmplY3QuZWxlbWVudDtbCi08IUVOVElUWSAlIG9iamVjdC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7IHwgJXBhcmFtLnFuYW1lOyApKiIKLT4KLTwhRU5USVRZICUgb2JqZWN0LnFuYW1lICAib2JqZWN0IiA+Ci08IUVMRU1FTlQgJW9iamVjdC5xbmFtZTsgICVvYmplY3QuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygb2JqZWN0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgb2JqZWN0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslb2JqZWN0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVvYmplY3QucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGRlY2xhcmUgICAgICAoIGRlY2xhcmUgKSAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNsYXNzaWQgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNvZGViYXNlICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGRhdGEgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHR5cGUgICAgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI0lNUExJRUQKLSAgICAgIGNvZGV0eXBlICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI0lNUExJRUQKLSAgICAgIGFyY2hpdmUgICAgICAlVVJJcy5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHN0YW5kYnkgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGhlaWdodCAgICAgICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIHdpZHRoICAgICAgICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHRhYmluZGV4ICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIG9iamVjdC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1vYmplY3QtMS5tb2QgLS0+Ci0KLQotPCEtLSBEb2N1bWVudCBTdHJ1Y3R1cmUgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1zdHJ1Y3QubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBEb2N1bWVudCBTdHJ1Y3R1cmUgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtc3RydWN0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFN0cnVjdHVyZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXN0cnVjdC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwtbW9iaWxlMTAtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRG9jdW1lbnQgU3RydWN0dXJlIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtc3RydWN0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIERvY3VtZW50IFN0cnVjdHVyZQotCi0gICAgICAgIHRpdGxlLCBoZWFkLCBib2R5LCBodG1sCi0KLSAgICAgVGhlIFN0cnVjdHVyZSBNb2R1bGUgZGVmaW5lcyB0aGUgbWFqb3Igc3RydWN0dXJhbCBlbGVtZW50cyBhbmQKLSAgICAgdGhlaXIgYXR0cmlidXRlcy4KLQotICAgICBOb3RlIHRoYXQgdGhlIGNvbnRlbnQgbW9kZWwgb2YgdGhlIGhlYWQgZWxlbWVudCB0eXBlIGlzIHJlZGVjbGFyZWQKLSAgICAgd2hlbiB0aGUgQmFzZSBNb2R1bGUgaXMgaW5jbHVkZWQgaW4gdGhlIERURC4KLQotICAgICBUaGUgcGFyYW1ldGVyIGVudGl0eSBjb250YWluaW5nIHRoZSBYTUwgbmFtZXNwYWNlIFVSSSB2YWx1ZSB1c2VkCi0gICAgIGZvciBYSFRNTCBpcyAnJVhIVE1MLnhtbG5zOycsIGRlZmluZWQgaW4gdGhlIFF1YWxpZmllZCBOYW1lcyBtb2R1bGUuCi0tLT4KLQotPCEtLSB0aXRsZTogRG9jdW1lbnQgVGl0bGUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gVGhlIHRpdGxlIGVsZW1lbnQgaXMgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgZmxvdyBvZiB0ZXh0LgotICAgICBJdCBzaG91bGQgYmUgZGlzcGxheWVkLCBmb3IgZXhhbXBsZSBhcyB0aGUgcGFnZSBoZWFkZXIgb3IKLSAgICAgd2luZG93IHRpdGxlLiBFeGFjdGx5IG9uZSB0aXRsZSBpcyByZXF1aXJlZCBwZXIgZG9jdW1lbnQuCi0tLT4KLQotPCFFTlRJVFkgJSB0aXRsZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRpdGxlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0aXRsZS5jb250ZW50ICAiKCAjUENEQVRBICkiID4KLTwhRU5USVRZICUgdGl0bGUucW5hbWUgICJ0aXRsZSIgPgotPCFFTEVNRU5UICV0aXRsZS5xbmFtZTsgICV0aXRsZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0aXRsZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRpdGxlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGl0bGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRpdGxlLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgICVJMThuLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHRpdGxlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gaGVhZDogRG9jdW1lbnQgSGVhZCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGhlYWQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoZWFkLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoZWFkLmNvbnRlbnQKLSAgICAiKCAlSGVhZE9wdHMubWl4OywgJXRpdGxlLnFuYW1lOywgJUhlYWRPcHRzLm1peDsgKSIKLT4KLTwhRU5USVRZICUgaGVhZC5xbmFtZSAgImhlYWQiID4KLTwhRUxFTUVOVCAlaGVhZC5xbmFtZTsgICVoZWFkLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGhlYWQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBoZWFkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaGVhZC5hdHRsaXN0O1sKLTwhLS0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2Ugd2l0aCBkb2N1bWVudCBwcm9maWxlcwotLS0+Ci08IUVOVElUWSAlIHByb2ZpbGUuYXR0cmliCi0gICAgICJwcm9maWxlICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICclWEhUTUwucHJvZmlsZTsnIgotPgotCi08IUFUVExJU1QgJWhlYWQucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJUkxOG4uYXR0cmliOwotICAgICAgJXByb2ZpbGUuYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaGVhZC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGJvZHk6IERvY3VtZW50IEJvZHkgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBib2R5LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYm9keS5lbGVtZW50O1sKLTwhRU5USVRZICUgYm9keS5jb250ZW50Ci0gICAgICIoICVCbG9jay5taXg7ICkrIgotPgotPCFFTlRJVFkgJSBib2R5LnFuYW1lICAiYm9keSIgPgotPCFFTEVNRU5UICVib2R5LnFuYW1lOyAgJWJvZHkuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYm9keS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJvZHkuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVib2R5LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVib2R5LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBib2R5LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gaHRtbDogWEhUTUwgRG9jdW1lbnQgRWxlbWVudCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGh0bWwuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVodG1sLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBodG1sLmNvbnRlbnQgICIoICVoZWFkLnFuYW1lOywgJWJvZHkucW5hbWU7ICkiID4KLTwhRU5USVRZICUgaHRtbC5xbmFtZSAgImh0bWwiID4KLTwhRUxFTUVOVCAlaHRtbC5xbmFtZTsgICVodG1sLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGh0bWwuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBodG1sLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaHRtbC5hdHRsaXN0O1sKLTwhLS0gdmVyc2lvbiBhdHRyaWJ1dGUgdmFsdWUgZGVmaW5lZCBpbiBkcml2ZXIKLS0tPgotPCFFTlRJVFkgJSBYSFRNTC52ZXJzaW9uLmF0dHJpYgotICAgICAidmVyc2lvbiAgICAgICVGUEkuZGF0YXR5cGU7ICAgICAgICAgICAjRklYRUQgJyVYSFRNTC52ZXJzaW9uOyciCi0+Ci0KLTwhLS0gc2VlIHRoZSBRdWFsaWZpZWQgTmFtZXMgbW9kdWxlIGZvciBpbmZvcm1hdGlvbgotICAgICBvbiBob3cgdG8gZXh0ZW5kIFhIVE1MIHVzaW5nIFhNTCBuYW1lc3BhY2VzCi0tLT4KLTwhQVRUTElTVCAlaHRtbC5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICAlWEhUTUwudmVyc2lvbi5hdHRyaWI7Ci0gICAgICAlSTE4bi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBodG1sLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXN0cnVjdC0xLm1vZCAtLT4KLQotCi08IS0tIEJsb2NrIFByZXNlbnRhdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1ibGtwcmVzLm1vZCBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgUHJlc2VudGF0aW9uIDEuMC8vRU4iCi0gCQkiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWJsa3ByZXMtMS5tb2QiPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCbG9jayBQcmVzZW50YXRpb24gTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1ibGtwcmVzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCbG9jayBQcmVzZW50YXRpb24gMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1ibGtwcmVzLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEJsb2NrIFByZXNlbnRhdGlvbmFsIEVsZW1lbnRzCi0KLSAgICAgICAgaHIKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgdXNlZCB0bwotICAgICBzdXBwb3J0IGJsb2NrLWxldmVsIHByZXNlbnRhdGlvbmFsIG1hcmt1cC4KLS0tPgotCi08IUVOVElUWSAlIGhyLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaHIuZWxlbWVudDtbCi08IUVOVElUWSAlIGhyLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBoci5xbmFtZSAgImhyIiA+Ci08IUVMRU1FTlQgJWhyLnFuYW1lOyAgJWhyLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGhyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaHIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoci5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaHIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGhyLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJsa3ByZXMtMS5tb2QgLS0+Ci0KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIAotCUlubGluZSBQcmVzZW50YXRpb246IGIsIGJpZywgaSwgc21hbGwJCQotLS0+Ci08IUVOVElUWSAlIHN1Yi5lbGVtZW50ICJJR05PUkUiPgotPCFFTlRJVFkgJSBzdWIuYXR0bGlzdCAiSUdOT1JFIj4KLTwhRU5USVRZICUgc3VwLmVsZW1lbnQgIklHTk9SRSI+Ci08IUVOVElUWSAlIHN1cC5hdHRsaXN0ICJJR05PUkUiPgotPCFFTlRJVFkgJSB0dC5lbGVtZW50ICJJR05PUkUiPgotPCFFTlRJVFkgJSB0dC5hdHRsaXN0ICJJR05PUkUiPgotPCFFTlRJVFkgJSB4aHRtbC1pbmxwcmVzLm1vZCBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFByZXNlbnRhdGlvbiAxLjAvL0VOIgotCQkiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWlubHByZXMtMS5tb2QiPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBJbmxpbmUgUHJlc2VudGF0aW9uIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1pbmxwcmVzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbC1tb2JpbGUxMC1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbmxpbmUgUHJlc2VudGF0aW9uIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaW5scHJlcy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbmxpbmUgUHJlc2VudGF0aW9uYWwgRWxlbWVudHMKLQotICAgICAgICBiLCBiaWcsIGksIHNtYWxsLCBzdWIsIHN1cCwgdHQKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgdXNlZCB0bwotICAgICBzdXBwb3J0IGlubGluZS1sZXZlbCBwcmVzZW50YXRpb25hbCBtYXJrdXAuCi0tLT4KLQotPCFFTlRJVFkgJSBiLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYi5lbGVtZW50O1sKLTwhRU5USVRZICUgYi5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGIucW5hbWUgICJiIiA+Ci08IUVMRU1FTlQgJWIucW5hbWU7ICAlYi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBiLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWIuYXR0bGlzdDtbCi08IUFUVExJU1QgJWIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGIuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBiaWcuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyViaWcuZWxlbWVudDtbCi08IUVOVElUWSAlIGJpZy5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGJpZy5xbmFtZSAgImJpZyIgPgotPCFFTEVNRU5UICViaWcucW5hbWU7ICAlYmlnLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGJpZy5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJpZy5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJpZy5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYmlnLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBiaWcuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBpLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslaS5lbGVtZW50O1sKLTwhRU5USVRZICUgaS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGkucW5hbWUgICJpIiA+Ci08IUVMRU1FTlQgJWkucW5hbWU7ICAlaS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBpLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWkuYXR0bGlzdDtbCi08IUFUVExJU1QgJWkucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGkuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzbWFsbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXNtYWxsLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzbWFsbC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHNtYWxsLnFuYW1lICAic21hbGwiID4KLTwhRUxFTUVOVCAlc21hbGwucW5hbWU7ICAlc21hbGwuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc21hbGwuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzbWFsbC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXNtYWxsLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzbWFsbC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygc21hbGwuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzdWIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzdWIuZWxlbWVudDtbCi08IUVOVElUWSAlIHN1Yi5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHN1Yi5xbmFtZSAgInN1YiIgPgotPCFFTEVNRU5UICVzdWIucW5hbWU7ICAlc3ViLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHN1Yi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHN1Yi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXN1Yi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc3ViLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBzdWIuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzdXAuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzdXAuZWxlbWVudDtbCi08IUVOVElUWSAlIHN1cC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHN1cC5xbmFtZSAgInN1cCIgPgotPCFFTEVNRU5UICVzdXAucW5hbWU7ICAlc3VwLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHN1cC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHN1cC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXN1cC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc3VwLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBzdXAuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0dC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXR0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0dC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIHR0LnFuYW1lICAidHQiID4KLTwhRUxFTUVOVCAldHQucW5hbWU7ICAldHQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdHQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0dC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXR0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0dC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdHQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtaW5scHJlcy0xLm1vZCAtLT4KLQotCi08IS0tIGVuZCBvZiBYSFRNTCBNb2JpbGUgMS4wIERURCAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwtc3BlY2lhbC5lbnQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwtc3BlY2lhbC5lbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNzA5ZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sLXNwZWNpYWwuZW50CisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCEtLSBTcGVjaWFsIGNoYXJhY3RlcnMgZm9yIEhUTUwgLS0+Ci0KLTwhLS0gQ2hhcmFjdGVyIGVudGl0eSBzZXQuIFR5cGljYWwgaW52b2NhdGlvbjoKLSAgICAgPCFFTlRJVFkgJSBIVE1Mc3BlY2lhbCBQVUJMSUMKLSAgICAgICAgIi0vL1czQy8vRU5USVRJRVMgU3BlY2lhbCBmb3IgWEhUTUwvL0VOIgotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1zcGVjaWFsLmVudCI+Ci0gICAgICVIVE1Mc3BlY2lhbDsKLS0tPgotCi08IS0tIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODY6Ci0gICAgIFBlcm1pc3Npb24gdG8gY29weSBpbiBhbnkgZm9ybSBpcyBncmFudGVkIGZvciB1c2Ugd2l0aAotICAgICBjb25mb3JtaW5nIFNHTUwgc3lzdGVtcyBhbmQgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4KLSAgICAgSVNPIDg4NzksIHByb3ZpZGVkIHRoaXMgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMuCi0tLT4KLQotPCEtLSBSZWxldmFudCBJU08gZW50aXR5IHNldCBpcyBnaXZlbiB1bmxlc3MgbmFtZXMgYXJlIG5ld2x5IGludHJvZHVjZWQuCi0gICAgIE5ldyBuYW1lcyAoaS5lLiwgbm90IGluIElTTyA4ODc5IGxpc3QpIGRvIG5vdCBjbGFzaCB3aXRoIGFueQotICAgICBleGlzdGluZyBJU08gODg3OSBlbnRpdHkgbmFtZXMuIElTTyAxMDY0NiBjaGFyYWN0ZXIgbnVtYmVycwotICAgICBhcmUgZ2l2ZW4gZm9yIGVhY2ggY2hhcmFjdGVyLCBpbiBoZXguIHZhbHVlcyBhcmUgZGVjaW1hbAotICAgICBjb252ZXJzaW9ucyBvZiB0aGUgSVNPIDEwNjQ2IHZhbHVlcyBhbmQgcmVmZXIgdG8gdGhlIGRvY3VtZW50Ci0gICAgIGNoYXJhY3RlciBzZXQuIE5hbWVzIGFyZSBVbmljb2RlIG5hbWVzLiAKLS0tPgotCi08IS0tIEMwIENvbnRyb2xzIGFuZCBCYXNpYyBMYXRpbiAtLT4KLTwhRU5USVRZIHF1b3QgICAgIiYjMzQ7Ij4gPCEtLSAgcXVvdGF0aW9uIG1hcmsgPSBBUEwgcXVvdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwMjIgSVNPbnVtIC0tPgotPCFFTlRJVFkgYW1wICAgICAiJiMzODsjMzg7Ij4gPCEtLSAgYW1wZXJzYW5kLCBVKzAwMjYgSVNPbnVtIC0tPgotPCFFTlRJVFkgbHQgICAgICAiJiMzODsjNjA7Ij4gPCEtLSAgbGVzcy10aGFuIHNpZ24sIFUrMDAzQyBJU09udW0gLS0+Ci08IUVOVElUWSBndCAgICAgICImIzYyOyI+IDwhLS0gIGdyZWF0ZXItdGhhbiBzaWduLCBVKzAwM0UgSVNPbnVtIC0tPgotPCFFTlRJVFkgYXBvcwkgIiYjMzk7Ij4gPCEtLSAgYXBvc3Ryb3BoZSBtYXJrLCBVKzAwMjcgSVNPbnVtIC0tPgotCi08IS0tIExhdGluIEV4dGVuZGVkLUEgLS0+Ci08IUVOVElUWSBPRWxpZyAgICImIzMzODsiPiA8IS0tICBsYXRpbiBjYXBpdGFsIGxpZ2F0dXJlIE9FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMTUyIElTT2xhdDIgLS0+Ci08IUVOVElUWSBvZWxpZyAgICImIzMzOTsiPiA8IS0tICBsYXRpbiBzbWFsbCBsaWdhdHVyZSBvZSwgVSswMTUzIElTT2xhdDIgLS0+Ci08IS0tIGxpZ2F0dXJlIGlzIGEgbWlzbm9tZXIsIHRoaXMgaXMgYSBzZXBhcmF0ZSBjaGFyYWN0ZXIgaW4gc29tZSBsYW5ndWFnZXMgLS0+Ci08IUVOVElUWSBTY2Fyb24gICImIzM1MjsiPiA8IS0tICBsYXRpbiBjYXBpdGFsIGxldHRlciBTIHdpdGggY2Fyb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNjAgSVNPbGF0MiAtLT4KLTwhRU5USVRZIHNjYXJvbiAgIiYjMzUzOyI+IDwhLS0gIGxhdGluIHNtYWxsIGxldHRlciBzIHdpdGggY2Fyb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNjEgSVNPbGF0MiAtLT4KLTwhRU5USVRZIFl1bWwgICAgIiYjMzc2OyI+IDwhLS0gIGxhdGluIGNhcGl0YWwgbGV0dGVyIFkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNzggSVNPbGF0MiAtLT4KLQotPCEtLSBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMgLS0+Ci08IUVOVElUWSBjaXJjICAgICImIzcxMDsiPiA8IS0tICBtb2RpZmllciBsZXR0ZXIgY2lyY3VtZmxleCBhY2NlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAyQzYgSVNPcHViIC0tPgotPCFFTlRJVFkgdGlsZGUgICAiJiM3MzI7Ij4gPCEtLSAgc21hbGwgdGlsZGUsIFUrMDJEQyBJU09kaWEgLS0+Ci0KLTwhLS0gR2VuZXJhbCBQdW5jdHVhdGlvbiAtLT4KLTwhRU5USVRZIGVuc3AgICAgIiYjODE5NDsiPiA8IS0tIGVuIHNwYWNlLCBVKzIwMDIgSVNPcHViIC0tPgotPCFFTlRJVFkgZW1zcCAgICAiJiM4MTk1OyI+IDwhLS0gZW0gc3BhY2UsIFUrMjAwMyBJU09wdWIgLS0+Ci08IUVOVElUWSB0aGluc3AgICImIzgyMDE7Ij4gPCEtLSB0aGluIHNwYWNlLCBVKzIwMDkgSVNPcHViIC0tPgotPCFFTlRJVFkgenduaiAgICAiJiM4MjA0OyI+IDwhLS0gemVybyB3aWR0aCBub24tam9pbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDBDIE5FVyBSRkMgMjA3MCAtLT4KLTwhRU5USVRZIHp3aiAgICAgIiYjODIwNTsiPiA8IS0tIHplcm8gd2lkdGggam9pbmVyLCBVKzIwMEQgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgbHJtICAgICAiJiM4MjA2OyI+IDwhLS0gbGVmdC10by1yaWdodCBtYXJrLCBVKzIwMEUgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgcmxtICAgICAiJiM4MjA3OyI+IDwhLS0gcmlnaHQtdG8tbGVmdCBtYXJrLCBVKzIwMEYgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgbmRhc2ggICAiJiM4MjExOyI+IDwhLS0gZW4gZGFzaCwgVSsyMDEzIElTT3B1YiAtLT4KLTwhRU5USVRZIG1kYXNoICAgIiYjODIxMjsiPiA8IS0tIGVtIGRhc2gsIFUrMjAxNCBJU09wdWIgLS0+Ci08IUVOVElUWSBsc3F1byAgICImIzgyMTY7Ij4gPCEtLSBsZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxOCBJU09udW0gLS0+Ci08IUVOVElUWSByc3F1byAgICImIzgyMTc7Ij4gPCEtLSByaWdodCBzaW5nbGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMTkgSVNPbnVtIC0tPgotPCFFTlRJVFkgc2JxdW8gICAiJiM4MjE4OyI+IDwhLS0gc2luZ2xlIGxvdy05IHF1b3RhdGlvbiBtYXJrLCBVKzIwMUEgTkVXIC0tPgotPCFFTlRJVFkgbGRxdW8gICAiJiM4MjIwOyI+IDwhLS0gbGVmdCBkb3VibGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMUMgSVNPbnVtIC0tPgotPCFFTlRJVFkgcmRxdW8gICAiJiM4MjIxOyI+IDwhLS0gcmlnaHQgZG91YmxlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDFEIElTT251bSAtLT4KLTwhRU5USVRZIGJkcXVvICAgIiYjODIyMjsiPiA8IS0tIGRvdWJsZSBsb3ctOSBxdW90YXRpb24gbWFyaywgVSsyMDFFIE5FVyAtLT4KLTwhRU5USVRZIGRhZ2dlciAgIiYjODIyNDsiPiA8IS0tIGRhZ2dlciwgVSsyMDIwIElTT3B1YiAtLT4KLTwhRU5USVRZIERhZ2dlciAgIiYjODIyNTsiPiA8IS0tIGRvdWJsZSBkYWdnZXIsIFUrMjAyMSBJU09wdWIgLS0+Ci08IUVOVElUWSBwZXJtaWwgICImIzgyNDA7Ij4gPCEtLSBwZXIgbWlsbGUgc2lnbiwgVSsyMDMwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsc2FxdW8gICImIzgyNDk7Ij4gPCEtLSBzaW5nbGUgbGVmdC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAzOSBJU08gcHJvcG9zZWQgLS0+Ci08IS0tIGxzYXF1byBpcyBwcm9wb3NlZCBidXQgbm90IHlldCBJU08gc3RhbmRhcmRpemVkIC0tPgotPCFFTlRJVFkgcnNhcXVvICAiJiM4MjUwOyI+IDwhLS0gc2luZ2xlIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDNBIElTTyBwcm9wb3NlZCAtLT4KLTwhLS0gcnNhcXVvIGlzIHByb3Bvc2VkIGJ1dCBub3QgeWV0IElTTyBzdGFuZGFyZGl6ZWQgLS0+Ci08IUVOVElUWSBldXJvICAgIiYjODM2NDsiPiA8IS0tICBldXJvIHNpZ24sIFUrMjBBQyBORVcgLS0+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwtc3ltYm9sLmVudCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbC1zeW1ib2wuZW50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmY4NzZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbC1zeW1ib2wuZW50CisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLTwhLS0gTWF0aGVtYXRpY2FsLCBHcmVlayBhbmQgU3ltYm9saWMgY2hhcmFjdGVycyBmb3IgSFRNTCAtLT4KLQotPCEtLSBDaGFyYWN0ZXIgZW50aXR5IHNldC4gVHlwaWNhbCBpbnZvY2F0aW9uOgotICAgICA8IUVOVElUWSAlIEhUTUxzeW1ib2wgUFVCTElDCi0gICAgICAgICItLy9XM0MvL0VOVElUSUVTIFN5bWJvbHMgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwtc3ltYm9sLmVudCI+Ci0gICAgICVIVE1Mc3ltYm9sOwotLS0+Ci0KLTwhLS0gUG9ydGlvbnMgKEMpIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24gMTk4NjoKLSAgICAgUGVybWlzc2lvbiB0byBjb3B5IGluIGFueSBmb3JtIGlzIGdyYW50ZWQgZm9yIHVzZSB3aXRoCi0gICAgIGNvbmZvcm1pbmcgU0dNTCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMgYXMgZGVmaW5lZCBpbgotICAgICBJU08gODg3OSwgcHJvdmlkZWQgdGhpcyBub3RpY2UgaXMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcy4KLS0tPgotCi08IS0tIFJlbGV2YW50IElTTyBlbnRpdHkgc2V0IGlzIGdpdmVuIHVubGVzcyBuYW1lcyBhcmUgbmV3bHkgaW50cm9kdWNlZC4KLSAgICAgTmV3IG5hbWVzIChpLmUuLCBub3QgaW4gSVNPIDg4NzkgbGlzdCkgZG8gbm90IGNsYXNoIHdpdGggYW55Ci0gICAgIGV4aXN0aW5nIElTTyA4ODc5IGVudGl0eSBuYW1lcy4gSVNPIDEwNjQ2IGNoYXJhY3RlciBudW1iZXJzCi0gICAgIGFyZSBnaXZlbiBmb3IgZWFjaCBjaGFyYWN0ZXIsIGluIGhleC4gdmFsdWVzIGFyZSBkZWNpbWFsCi0gICAgIGNvbnZlcnNpb25zIG9mIHRoZSBJU08gMTA2NDYgdmFsdWVzIGFuZCByZWZlciB0byB0aGUgZG9jdW1lbnQKLSAgICAgY2hhcmFjdGVyIHNldC4gTmFtZXMgYXJlIFVuaWNvZGUgbmFtZXMuIAotLS0+Ci0KLTwhLS0gTGF0aW4gRXh0ZW5kZWQtQiAtLT4KLTwhRU5USVRZIGZub2YgICAgICImIzQwMjsiPiA8IS0tIGxhdGluIHNtYWxsIGYgd2l0aCBob29rID0gZnVuY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmxvcmluLCBVKzAxOTIgSVNPdGVjaCAtLT4KLQotPCEtLSBHcmVlayAtLT4KLTwhRU5USVRZIEFscGhhICAgICImIzkxMzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGFscGhhLCBVKzAzOTEgLS0+Ci08IUVOVElUWSBCZXRhICAgICAiJiM5MTQ7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBiZXRhLCBVKzAzOTIgLS0+Ci08IUVOVElUWSBHYW1tYSAgICAiJiM5MTU7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBnYW1tYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5MyBJU09ncmszIC0tPgotPCFFTlRJVFkgRGVsdGEgICAgIiYjOTE2OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzOTQgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIEVwc2lsb24gICImIzkxNzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGVwc2lsb24sIFUrMDM5NSAtLT4KLTwhRU5USVRZIFpldGEgICAgICImIzkxODsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHpldGEsIFUrMDM5NiAtLT4KLTwhRU5USVRZIEV0YSAgICAgICImIzkxOTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGV0YSwgVSswMzk3IC0tPgotPCFFTlRJVFkgVGhldGEgICAgIiYjOTIwOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdGhldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzOTggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIElvdGEgICAgICImIzkyMTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGlvdGEsIFUrMDM5OSAtLT4KLTwhRU5USVRZIEthcHBhICAgICImIzkyMjsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGthcHBhLCBVKzAzOUEgLS0+Ci08IUVOVElUWSBMYW1iZGEgICAiJiM5MjM7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBsYW1iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzOUIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIE11ICAgICAgICImIzkyNDsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG11LCBVKzAzOUMgLS0+Ci08IUVOVElUWSBOdSAgICAgICAiJiM5MjU7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBudSwgVSswMzlEIC0tPgotPCFFTlRJVFkgWGkgICAgICAgIiYjOTI2OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgeGksIFUrMDM5RSBJU09ncmszIC0tPgotPCFFTlRJVFkgT21pY3JvbiAgIiYjOTI3OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgb21pY3JvbiwgVSswMzlGIC0tPgotPCFFTlRJVFkgUGkgICAgICAgIiYjOTI4OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGksIFUrMDNBMCBJU09ncmszIC0tPgotPCFFTlRJVFkgUmhvICAgICAgIiYjOTI5OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcmhvLCBVKzAzQTEgLS0+Ci08IS0tIHRoZXJlIGlzIG5vIFNpZ21hZiwgYW5kIG5vIFUrMDNBMiBjaGFyYWN0ZXIgZWl0aGVyIC0tPgotPCFFTlRJVFkgU2lnbWEgICAgIiYjOTMxOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgc2lnbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIFRhdSAgICAgICImIzkzMjsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHRhdSwgVSswM0E0IC0tPgotPCFFTlRJVFkgVXBzaWxvbiAgIiYjOTMzOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdXBzaWxvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBNSBJU09ncmszIC0tPgotPCFFTlRJVFkgUGhpICAgICAgIiYjOTM0OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGhpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E2IElTT2dyazMgLS0+Ci08IUVOVElUWSBDaGkgICAgICAiJiM5MzU7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBjaGksIFUrMDNBNyAtLT4KLTwhRU5USVRZIFBzaSAgICAgICImIzkzNjsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBzaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBOCBJU09ncmszIC0tPgotPCFFTlRJVFkgT21lZ2EgICAgIiYjOTM3OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgb21lZ2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTkgSVNPZ3JrMyAtLT4KLQotPCFFTlRJVFkgYWxwaGEgICAgIiYjOTQ1OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGFscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0IxIElTT2dyazMgLS0+Ci08IUVOVElUWSBiZXRhICAgICAiJiM5NDY7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgYmV0YSwgVSswM0IyIElTT2dyazMgLS0+Ci08IUVOVElUWSBnYW1tYSAgICAiJiM5NDc7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZ2FtbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGRlbHRhICAgICImIzk0ODsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBkZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCNCBJU09ncmszIC0tPgotPCFFTlRJVFkgZXBzaWxvbiAgIiYjOTQ5OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGVwc2lsb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHpldGEgICAgICImIzk1MDsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB6ZXRhLCBVKzAzQjYgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGV0YSAgICAgICImIzk1MTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBldGEsIFUrMDNCNyBJU09ncmszIC0tPgotPCFFTlRJVFkgdGhldGEgICAgIiYjOTUyOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHRoZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0I4IElTT2dyazMgLS0+Ci08IUVOVElUWSBpb3RhICAgICAiJiM5NTM7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgaW90YSwgVSswM0I5IElTT2dyazMgLS0+Ci08IUVOVElUWSBrYXBwYSAgICAiJiM5NTQ7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIga2FwcGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQkEgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGxhbWJkYSAgICImIzk1NTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBsYW1iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQkIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG11ICAgICAgICImIzk1NjsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBtdSwgVSswM0JDIElTT2dyazMgLS0+Ci08IUVOVElUWSBudSAgICAgICAiJiM5NTc7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgbnUsIFUrMDNCRCBJU09ncmszIC0tPgotPCFFTlRJVFkgeGkgICAgICAgIiYjOTU4OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHhpLCBVKzAzQkUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG9taWNyb24gICImIzk1OTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBvbWljcm9uLCBVKzAzQkYgTkVXIC0tPgotPCFFTlRJVFkgcGkgICAgICAgIiYjOTYwOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHBpLCBVKzAzQzAgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHJobyAgICAgICImIzk2MTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciByaG8sIFUrMDNDMSBJU09ncmszIC0tPgotPCFFTlRJVFkgc2lnbWFmICAgIiYjOTYyOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGZpbmFsIHNpZ21hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0MyIElTT2dyazMgLS0+Ci08IUVOVElUWSBzaWdtYSAgICAiJiM5NjM7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgc2lnbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQzMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHRhdSAgICAgICImIzk2NDsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciB0YXUsIFUrMDNDNCBJU09ncmszIC0tPgotPCFFTlRJVFkgdXBzaWxvbiAgIiYjOTY1OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHVwc2lsb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQzUgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHBoaSAgICAgICImIzk2NjsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBwaGksIFUrMDNDNiBJU09ncmszIC0tPgotPCFFTlRJVFkgY2hpICAgICAgIiYjOTY3OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGNoaSwgVSswM0M3IElTT2dyazMgLS0+Ci08IUVOVElUWSBwc2kgICAgICAiJiM5Njg7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgcHNpLCBVKzAzQzggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG9tZWdhICAgICImIzk2OTsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBvbWVnYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDOSBJU09ncmszIC0tPgotPCFFTlRJVFkgdGhldGFzeW0gIiYjOTc3OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHRoZXRhIHN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNEMSBORVcgLS0+Ci08IUVOVElUWSB1cHNpaCAgICAiJiM5Nzg7Ij4gPCEtLSBncmVlayB1cHNpbG9uIHdpdGggaG9vayBzeW1ib2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzRDIgTkVXIC0tPgotPCFFTlRJVFkgcGl2ICAgICAgIiYjOTgyOyI+IDwhLS0gZ3JlZWsgcGkgc3ltYm9sLCBVKzAzRDYgSVNPZ3JrMyAtLT4KLQotPCEtLSBHZW5lcmFsIFB1bmN0dWF0aW9uIC0tPgotPCFFTlRJVFkgYnVsbCAgICAgIiYjODIyNjsiPiA8IS0tIGJ1bGxldCA9IGJsYWNrIHNtYWxsIGNpcmNsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMjIgSVNPcHViICAtLT4KLTwhLS0gYnVsbGV0IGlzIE5PVCB0aGUgc2FtZSBhcyBidWxsZXQgb3BlcmF0b3IsIFUrMjIxOSAtLT4KLTwhRU5USVRZIGhlbGxpcCAgICImIzgyMzA7Ij4gPCEtLSBob3Jpem9udGFsIGVsbGlwc2lzID0gdGhyZWUgZG90IGxlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMjYgSVNPcHViICAtLT4KLTwhRU5USVRZIHByaW1lICAgICImIzgyNDI7Ij4gPCEtLSBwcmltZSA9IG1pbnV0ZXMgPSBmZWV0LCBVKzIwMzIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIFByaW1lICAgICImIzgyNDM7Ij4gPCEtLSBkb3VibGUgcHJpbWUgPSBzZWNvbmRzID0gaW5jaGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAzMyBJU090ZWNoIC0tPgotPCFFTlRJVFkgb2xpbmUgICAgIiYjODI1NDsiPiA8IS0tIG92ZXJsaW5lID0gc3BhY2luZyBvdmVyc2NvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDNFIE5FVyAtLT4KLTwhRU5USVRZIGZyYXNsICAgICImIzgyNjA7Ij4gPCEtLSBmcmFjdGlvbiBzbGFzaCwgVSsyMDQ0IE5FVyAtLT4KLQotPCEtLSBMZXR0ZXJsaWtlIFN5bWJvbHMgLS0+Ci08IUVOVElUWSB3ZWllcnAgICAiJiM4NDcyOyI+IDwhLS0gc2NyaXB0IGNhcGl0YWwgUCA9IHBvd2VyIHNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gV2VpZXJzdHJhc3MgcCwgVSsyMTE4IElTT2Ftc28gLS0+Ci08IUVOVElUWSBpbWFnZSAgICAiJiM4NDY1OyI+IDwhLS0gYmxhY2tsZXR0ZXIgY2FwaXRhbCBJID0gaW1hZ2luYXJ5IHBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMTExIElTT2Ftc28gLS0+Ci08IUVOVElUWSByZWFsICAgICAiJiM4NDc2OyI+IDwhLS0gYmxhY2tsZXR0ZXIgY2FwaXRhbCBSID0gcmVhbCBwYXJ0IHN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxMUMgSVNPYW1zbyAtLT4KLTwhRU5USVRZIHRyYWRlICAgICImIzg0ODI7Ij4gPCEtLSB0cmFkZSBtYXJrIHNpZ24sIFUrMjEyMiBJU09udW0gLS0+Ci08IUVOVElUWSBhbGVmc3ltICAiJiM4NTAxOyI+IDwhLS0gYWxlZiBzeW1ib2wgPSBmaXJzdCB0cmFuc2Zpbml0ZSBjYXJkaW5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxMzUgTkVXIC0tPgotPCEtLSBhbGVmIHN5bWJvbCBpcyBOT1QgdGhlIHNhbWUgYXMgaGVicmV3IGxldHRlciBhbGVmLAotICAgICBVKzA1RDAgYWx0aG91Z2ggdGhlIHNhbWUgZ2x5cGggY291bGQgYmUgdXNlZCB0byBkZXBpY3QgYm90aCBjaGFyYWN0ZXJzIC0tPgotCi08IS0tIEFycm93cyAtLT4KLTwhRU5USVRZIGxhcnIgICAgICImIzg1OTI7Ij4gPCEtLSBsZWZ0d2FyZHMgYXJyb3csIFUrMjE5MCBJU09udW0gLS0+Ci08IUVOVElUWSB1YXJyICAgICAiJiM4NTkzOyI+IDwhLS0gdXB3YXJkcyBhcnJvdywgVSsyMTkxIElTT251bS0tPgotPCFFTlRJVFkgcmFyciAgICAgIiYjODU5NDsiPiA8IS0tIHJpZ2h0d2FyZHMgYXJyb3csIFUrMjE5MiBJU09udW0gLS0+Ci08IUVOVElUWSBkYXJyICAgICAiJiM4NTk1OyI+IDwhLS0gZG93bndhcmRzIGFycm93LCBVKzIxOTMgSVNPbnVtIC0tPgotPCFFTlRJVFkgaGFyciAgICAgIiYjODU5NjsiPiA8IS0tIGxlZnQgcmlnaHQgYXJyb3csIFUrMjE5NCBJU09hbXNhIC0tPgotPCFFTlRJVFkgY3JhcnIgICAgIiYjODYyOTsiPiA8IS0tIGRvd253YXJkcyBhcnJvdyB3aXRoIGNvcm5lciBsZWZ0d2FyZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGNhcnJpYWdlIHJldHVybiwgVSsyMUI1IE5FVyAtLT4KLTwhRU5USVRZIGxBcnIgICAgICImIzg2NTY7Ij4gPCEtLSBsZWZ0d2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDAgSVNPdGVjaCAtLT4KLTwhLS0gVW5pY29kZSBkb2VzIG5vdCBzYXkgdGhhdCBsQXJyIGlzIHRoZSBzYW1lIGFzIHRoZSAnaXMgaW1wbGllZCBieScgYXJyb3cKLSAgICBidXQgYWxzbyBkb2VzIG5vdCBoYXZlIGFueSBvdGhlciBjaGFyYWN0ZXIgZm9yIHRoYXQgZnVuY3Rpb24uIFNvID8gbEFyciBjYW4KLSAgICBiZSB1c2VkIGZvciAnaXMgaW1wbGllZCBieScgYXMgSVNPdGVjaCBzdWdnZXN0cyAtLT4KLTwhRU5USVRZIHVBcnIgICAgICImIzg2NTc7Ij4gPCEtLSB1cHdhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQxIElTT2Ftc2EgLS0+Ci08IUVOVElUWSByQXJyICAgICAiJiM4NjU4OyI+IDwhLS0gcmlnaHR3YXJkcyBkb3VibGUgYXJyb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMUQyIElTT3RlY2ggLS0+Ci08IS0tIFVuaWNvZGUgZG9lcyBub3Qgc2F5IHRoaXMgaXMgdGhlICdpbXBsaWVzJyBjaGFyYWN0ZXIgYnV0IGRvZXMgbm90IGhhdmUgCi0gICAgIGFub3RoZXIgY2hhcmFjdGVyIHdpdGggdGhpcyBmdW5jdGlvbiBzbyA/Ci0gICAgIHJBcnIgY2FuIGJlIHVzZWQgZm9yICdpbXBsaWVzJyBhcyBJU090ZWNoIHN1Z2dlc3RzIC0tPgotPCFFTlRJVFkgZEFyciAgICAgIiYjODY1OTsiPiA8IS0tIGRvd253YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMyBJU09hbXNhIC0tPgotPCFFTlRJVFkgaEFyciAgICAgIiYjODY2MDsiPiA8IS0tIGxlZnQgcmlnaHQgZG91YmxlIGFycm93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjFENCBJU09hbXNhIC0tPgotCi08IS0tIE1hdGhlbWF0aWNhbCBPcGVyYXRvcnMgLS0+Ci08IUVOVElUWSBmb3JhbGwgICAiJiM4NzA0OyI+IDwhLS0gZm9yIGFsbCwgVSsyMjAwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBwYXJ0ICAgICAiJiM4NzA2OyI+IDwhLS0gcGFydGlhbCBkaWZmZXJlbnRpYWwsIFUrMjIwMiBJU090ZWNoICAtLT4KLTwhRU5USVRZIGV4aXN0ICAgICImIzg3MDc7Ij4gPCEtLSB0aGVyZSBleGlzdHMsIFUrMjIwMyBJU090ZWNoIC0tPgotPCFFTlRJVFkgZW1wdHkgICAgIiYjODcwOTsiPiA8IS0tIGVtcHR5IHNldCA9IG51bGwgc2V0ID0gZGlhbWV0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjA1IElTT2Ftc28gLS0+Ci08IUVOVElUWSBuYWJsYSAgICAiJiM4NzExOyI+IDwhLS0gbmFibGEgPSBiYWNrd2FyZCBkaWZmZXJlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIwNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgaXNpbiAgICAgIiYjODcxMjsiPiA8IS0tIGVsZW1lbnQgb2YsIFUrMjIwOCBJU090ZWNoIC0tPgotPCFFTlRJVFkgbm90aW4gICAgIiYjODcxMzsiPiA8IS0tIG5vdCBhbiBlbGVtZW50IG9mLCBVKzIyMDkgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG5pICAgICAgICImIzg3MTU7Ij4gPCEtLSBjb250YWlucyBhcyBtZW1iZXIsIFUrMjIwQiBJU090ZWNoIC0tPgotPCEtLSBzaG91bGQgdGhlcmUgYmUgYSBtb3JlIG1lbW9yYWJsZSBuYW1lIHRoYW4gJ25pJz8gLS0+Ci08IUVOVElUWSBwcm9kICAgICAiJiM4NzE5OyI+IDwhLS0gbi1hcnkgcHJvZHVjdCA9IHByb2R1Y3Qgc2lnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyMEYgSVNPYW1zYiAtLT4KLTwhLS0gcHJvZCBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDNBMCAnZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGknIHRob3VnaAotICAgICB0aGUgc2FtZSBnbHlwaCBtaWdodCBiZSB1c2VkIGZvciBib3RoIC0tPgotPCFFTlRJVFkgc3VtICAgICAgIiYjODcyMTsiPiA8IS0tIG4tYXJ5IHN1bWF0aW9uLCBVKzIyMTEgSVNPYW1zYiAtLT4KLTwhLS0gc3VtIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswM0EzICdncmVlayBjYXBpdGFsIGxldHRlciBzaWdtYScKLSAgICAgdGhvdWdoIHRoZSBzYW1lIGdseXBoIG1pZ2h0IGJlIHVzZWQgZm9yIGJvdGggLS0+Ci08IUVOVElUWSBtaW51cyAgICAiJiM4NzIyOyI+IDwhLS0gbWludXMgc2lnbiwgVSsyMjEyIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsb3dhc3QgICAiJiM4NzI3OyI+IDwhLS0gYXN0ZXJpc2sgb3BlcmF0b3IsIFUrMjIxNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgcmFkaWMgICAgIiYjODczMDsiPiA8IS0tIHNxdWFyZSByb290ID0gcmFkaWNhbCBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIxQSBJU090ZWNoIC0tPgotPCFFTlRJVFkgcHJvcCAgICAgIiYjODczMzsiPiA8IS0tIHByb3BvcnRpb25hbCB0bywgVSsyMjFEIElTT3RlY2ggLS0+Ci08IUVOVElUWSBpbmZpbiAgICAiJiM4NzM0OyI+IDwhLS0gaW5maW5pdHksIFUrMjIxRSBJU090ZWNoIC0tPgotPCFFTlRJVFkgYW5nICAgICAgIiYjODczNjsiPiA8IS0tIGFuZ2xlLCBVKzIyMjAgSVNPYW1zbyAtLT4KLTwhRU5USVRZIGFuZCAgICAgICImIzg3NDM7Ij4gPCEtLSBsb2dpY2FsIGFuZCA9IHdlZGdlLCBVKzIyMjcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9yICAgICAgICImIzg3NDQ7Ij4gPCEtLSBsb2dpY2FsIG9yID0gdmVlLCBVKzIyMjggSVNPdGVjaCAtLT4KLTwhRU5USVRZIGNhcCAgICAgICImIzg3NDU7Ij4gPCEtLSBpbnRlcnNlY3Rpb24gPSBjYXAsIFUrMjIyOSBJU090ZWNoIC0tPgotPCFFTlRJVFkgY3VwICAgICAgIiYjODc0NjsiPiA8IS0tIHVuaW9uID0gY3VwLCBVKzIyMkEgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGludCAgICAgICImIzg3NDc7Ij4gPCEtLSBpbnRlZ3JhbCwgVSsyMjJCIElTT3RlY2ggLS0+Ci08IUVOVElUWSB0aGVyZTQgICAiJiM4NzU2OyI+IDwhLS0gdGhlcmVmb3JlLCBVKzIyMzQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHNpbSAgICAgICImIzg3NjQ7Ij4gPCEtLSB0aWxkZSBvcGVyYXRvciA9IHZhcmllcyB3aXRoID0gc2ltaWxhciB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyM0MgSVNPdGVjaCAtLT4KLTwhLS0gdGlsZGUgb3BlcmF0b3IgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyB0aGUgdGlsZGUsIFUrMDA3RSwKLSAgICAgYWx0aG91Z2ggdGhlIHNhbWUgZ2x5cGggbWlnaHQgYmUgdXNlZCB0byByZXByZXNlbnQgYm90aCAgLS0+Ci08IUVOVElUWSBjb25nICAgICAiJiM4NzczOyI+IDwhLS0gYXBwcm94aW1hdGVseSBlcXVhbCB0bywgVSsyMjQ1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBhc3ltcCAgICAiJiM4Nzc2OyI+IDwhLS0gYWxtb3N0IGVxdWFsIHRvID0gYXN5bXB0b3RpYyB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyNDggSVNPYW1zciAtLT4KLTwhRU5USVRZIG5lICAgICAgICImIzg4MDA7Ij4gPCEtLSBub3QgZXF1YWwgdG8sIFUrMjI2MCBJU090ZWNoIC0tPgotPCFFTlRJVFkgZXF1aXYgICAgIiYjODgwMTsiPiA8IS0tIGlkZW50aWNhbCB0bywgVSsyMjYxIElTT3RlY2ggLS0+Ci08IUVOVElUWSBsZSAgICAgICAiJiM4ODA0OyI+IDwhLS0gbGVzcy10aGFuIG9yIGVxdWFsIHRvLCBVKzIyNjQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGdlICAgICAgICImIzg4MDU7Ij4gPCEtLSBncmVhdGVyLXRoYW4gb3IgZXF1YWwgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjY1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzdWIgICAgICAiJiM4ODM0OyI+IDwhLS0gc3Vic2V0IG9mLCBVKzIyODIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHN1cCAgICAgICImIzg4MzU7Ij4gPCEtLSBzdXBlcnNldCBvZiwgVSsyMjgzIElTT3RlY2ggLS0+Ci08IS0tIG5vdGUgdGhhdCBuc3VwLCAnbm90IGEgc3VwZXJzZXQgb2YsIFUrMjI4MycgaXMgbm90IGNvdmVyZWQgYnkgdGhlIFN5bWJvbCAKLSAgICAgZm9udCBlbmNvZGluZyBhbmQgaXMgbm90IGluY2x1ZGVkLiBTaG91bGQgaXQgYmUsIGZvciBzeW1tZXRyeT8KLSAgICAgSXQgaXMgaW4gSVNPYW1zbiAgLS0+IAotPCFFTlRJVFkgbnN1YiAgICAgIiYjODgzNjsiPiA8IS0tIG5vdCBhIHN1YnNldCBvZiwgVSsyMjg0IElTT2Ftc24gLS0+Ci08IUVOVElUWSBzdWJlICAgICAiJiM4ODM4OyI+IDwhLS0gc3Vic2V0IG9mIG9yIGVxdWFsIHRvLCBVKzIyODYgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHN1cGUgICAgICImIzg4Mzk7Ij4gPCEtLSBzdXBlcnNldCBvZiBvciBlcXVhbCB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyODcgSVNPdGVjaCAtLT4KLTwhRU5USVRZIG9wbHVzICAgICImIzg4NTM7Ij4gPCEtLSBjaXJjbGVkIHBsdXMgPSBkaXJlY3Qgc3VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI5NSBJU09hbXNiIC0tPgotPCFFTlRJVFkgb3RpbWVzICAgIiYjODg1NTsiPiA8IS0tIGNpcmNsZWQgdGltZXMgPSB2ZWN0b3IgcHJvZHVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyOTcgSVNPYW1zYiAtLT4KLTwhRU5USVRZIHBlcnAgICAgICImIzg4Njk7Ij4gPCEtLSB1cCB0YWNrID0gb3J0aG9nb25hbCB0byA9IHBlcnBlbmRpY3VsYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMkE1IElTT3RlY2ggLS0+Ci08IUVOVElUWSBzZG90ICAgICAiJiM4OTAxOyI+IDwhLS0gZG90IG9wZXJhdG9yLCBVKzIyQzUgSVNPYW1zYiAtLT4KLTwhLS0gZG90IG9wZXJhdG9yIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswMEI3IG1pZGRsZSBkb3QgLS0+Ci0KLTwhLS0gTWlzY2VsbGFuZW91cyBUZWNobmljYWwgLS0+Ci08IUVOVElUWSBsY2VpbCAgICAiJiM4OTY4OyI+IDwhLS0gbGVmdCBjZWlsaW5nID0gYXBsIHVwc3RpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzA4IElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgcmNlaWwgICAgIiYjODk2OTsiPiA8IS0tIHJpZ2h0IGNlaWxpbmcsIFUrMjMwOSBJU09hbXNjICAtLT4KLTwhRU5USVRZIGxmbG9vciAgICImIzg5NzA7Ij4gPCEtLSBsZWZ0IGZsb29yID0gYXBsIGRvd25zdGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIzMEEgSVNPYW1zYyAgLS0+Ci08IUVOVElUWSByZmxvb3IgICAiJiM4OTcxOyI+IDwhLS0gcmlnaHQgZmxvb3IsIFUrMjMwQiBJU09hbXNjICAtLT4KLTwhRU5USVRZIGxhbmcgICAgICImIzkwMDE7Ij4gPCEtLSBsZWZ0LXBvaW50aW5nIGFuZ2xlIGJyYWNrZXQgPSBicmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzI5IElTT3RlY2ggLS0+Ci08IS0tIGxhbmcgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwM0MgJ2xlc3MgdGhhbicgCi0gICAgIG9yIFUrMjAzOSAnc2luZ2xlIGxlZnQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmsnIC0tPgotPCFFTlRJVFkgcmFuZyAgICAgIiYjOTAwMjsiPiA8IS0tIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIGJyYWNrZXQgPSBrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMzJBIElTT3RlY2ggLS0+Ci08IS0tIHJhbmcgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwM0UgJ2dyZWF0ZXIgdGhhbicgCi0gICAgIG9yIFUrMjAzQSAnc2luZ2xlIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrJyAtLT4KLQotPCEtLSBHZW9tZXRyaWMgU2hhcGVzIC0tPgotPCFFTlRJVFkgbG96ICAgICAgIiYjOTY3NDsiPiA8IS0tIGxvemVuZ2UsIFUrMjVDQSBJU09wdWIgLS0+Ci0KLTwhLS0gTWlzY2VsbGFuZW91cyBTeW1ib2xzIC0tPgotPCFFTlRJVFkgc3BhZGVzICAgIiYjOTgyNDsiPiA8IS0tIGJsYWNrIHNwYWRlIHN1aXQsIFUrMjY2MCBJU09wdWIgLS0+Ci08IS0tIGJsYWNrIGhlcmUgc2VlbXMgdG8gbWVhbiBmaWxsZWQgYXMgb3Bwb3NlZCB0byBob2xsb3cgLS0+Ci08IUVOVElUWSBjbHVicyAgICAiJiM5ODI3OyI+IDwhLS0gYmxhY2sgY2x1YiBzdWl0ID0gc2hhbXJvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyNjYzIElTT3B1YiAtLT4KLTwhRU5USVRZIGhlYXJ0cyAgICImIzk4Mjk7Ij4gPCEtLSBibGFjayBoZWFydCBzdWl0ID0gdmFsZW50aW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjY2NSBJU09wdWIgLS0+Ci08IUVOVElUWSBkaWFtcyAgICAiJiM5ODMwOyI+IDwhLS0gYmxhY2sgZGlhbW9uZCBzdWl0LCBVKzI2NjYgSVNPcHViIC0tPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sMS1mcmFtZXNldC5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwxLWZyYW1lc2V0LmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQzZjc5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwxLWZyYW1lc2V0LmR0ZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMjUgKzAsMCBAQAotPCEtLQotICAgRXh0ZW5zaWJsZSBIVE1MIHZlcnNpb24gMS4wIEZyYW1lc2V0IERURAotCi0gICBUaGlzIGlzIHRoZSBzYW1lIGFzIEhUTUwgNC4wIEZyYW1lc2V0IGV4Y2VwdCBmb3IKLSAgIGNoYW5nZXMgZHVlIHRvIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIFhNTCBhbmQgU0dNTC4KLQotICAgTmFtZXNwYWNlID0gaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbAotCi0gICBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiwgc2VlOiBodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEKLQotICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwKLSAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotCi0gICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIEZyYW1lc2V0Ly9FTiIKLSAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtZnJhbWVzZXQuZHRkIgotCi0gICAkUmV2aXNpb246IDEuMSAkCi0gICAkRGF0ZTogMjAwNy8wNS8xNSAwMjo0MjoyMiAkCi0KLS0tPgotCi08IS0tPT09PT09PT09PT09PT09PSBDaGFyYWN0ZXIgbW5lbW9uaWMgZW50aXRpZXMgPT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIEhUTUxsYXQxIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4gMSBmb3IgWEhUTUwvL0VOIgotICAgInhodG1sLWxhdDEuZW50Ij4KLSVIVE1MbGF0MTsKLQotPCFFTlRJVFkgJSBIVE1Mc3ltYm9sIFBVQkxJQwotICAgIi0vL1czQy8vRU5USVRJRVMgU3ltYm9scyBmb3IgWEhUTUwvL0VOIgotICAgInhodG1sLXN5bWJvbC5lbnQiPgotJUhUTUxzeW1ib2w7Ci0KLTwhRU5USVRZICUgSFRNTHNwZWNpYWwgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBTcGVjaWFsIGZvciBYSFRNTC8vRU4iCi0gICAieGh0bWwtc3BlY2lhbC5lbnQiPgotJUhUTUxzcGVjaWFsOwotCi08IS0tPT09PT09PT09PT09PT09PT09IEltcG9ydGVkIE5hbWVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIENvbnRlbnRUeXBlICJDREFUQSI+Ci0gICAgPCEtLSBtZWRpYSB0eXBlLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotCi08IUVOVElUWSAlIENvbnRlbnRUeXBlcyAiQ0RBVEEiPgotICAgIDwhLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgdHlwZXMsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci0KLTwhRU5USVRZICUgQ2hhcnNldCAiQ0RBVEEiPgotICAgIDwhLS0gYSBjaGFyYWN0ZXIgZW5jb2RpbmcsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci0KLTwhRU5USVRZICUgQ2hhcnNldHMgIkNEQVRBIj4KLSAgICA8IS0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLQotPCFFTlRJVFkgJSBMYW5ndWFnZUNvZGUgIk5NVE9LRU4iPgotICAgIDwhLS0gYSBsYW5ndWFnZSBjb2RlLCBhcyBwZXIgW1JGQzE3NjZdIC0tPgotCi08IUVOVElUWSAlIENoYXJhY3RlciAiQ0RBVEEiPgotICAgIDwhLS0gYSBzaW5nbGUgY2hhcmFjdGVyIGZyb20gW0lTTzEwNjQ2XSAtLT4KLQotPCFFTlRJVFkgJSBOdW1iZXIgIkNEQVRBIj4KLSAgICA8IS0tIG9uZSBvciBtb3JlIGRpZ2l0cyAtLT4KLQotPCFFTlRJVFkgJSBMaW5rVHlwZXMgIkNEQVRBIj4KLSAgICA8IS0tIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGxpbmsgdHlwZXMgLS0+Ci0KLTwhRU5USVRZICUgTWVkaWFEZXNjICJDREFUQSI+Ci0gICAgPCEtLSBzaW5nbGUgb3IgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbWVkaWEgZGVzY3JpcHRvcnMgLS0+Ci0KLTwhRU5USVRZICUgVVJJICJDREFUQSI+Ci0gICAgPCEtLSBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciwgc2VlIFtSRkMyMzk2XSAtLT4KLQotPCFFTlRJVFkgJSBVcmlMaXN0ICJDREFUQSI+Ci0gICAgPCEtLSBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnMgLS0+Ci0KLTwhRU5USVRZICUgRGF0ZXRpbWUgIkNEQVRBIj4KLSAgICA8IS0tIGRhdGUgYW5kIHRpbWUgaW5mb3JtYXRpb24uIElTTyBkYXRlIGZvcm1hdCAtLT4KLQotPCFFTlRJVFkgJSBTY3JpcHQgIkNEQVRBIj4KLSAgICA8IS0tIHNjcmlwdCBleHByZXNzaW9uIC0tPgotCi08IUVOVElUWSAlIFN0eWxlU2hlZXQgIkNEQVRBIj4KLSAgICA8IS0tIHN0eWxlIHNoZWV0IGRhdGEgLS0+Ci0KLTwhRU5USVRZICUgVGV4dCAiQ0RBVEEiPgotICAgIDwhLS0gdXNlZCBmb3IgdGl0bGVzIGV0Yy4gLS0+Ci0KLTwhRU5USVRZICUgRnJhbWVUYXJnZXQgIk5NVE9LRU4iPgotICAgIDwhLS0gcmVuZGVyIGluIHRoaXMgZnJhbWUgLS0+Ci0KLTwhRU5USVRZICUgTGVuZ3RoICJDREFUQSI+Ci0gICAgPCEtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci0KLTwhRU5USVRZICUgTXVsdGlMZW5ndGggIkNEQVRBIj4KLSAgICA8IS0tIHBpeGVsLCBwZXJjZW50YWdlLCBvciByZWxhdGl2ZSAtLT4KLQotPCFFTlRJVFkgJSBNdWx0aUxlbmd0aHMgIkNEQVRBIj4KLSAgICA8IS0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIE11bHRpTGVuZ3RoIC0tPgotCi08IUVOVElUWSAlIFBpeGVscyAiQ0RBVEEiPgotICAgIDwhLS0gaW50ZWdlciByZXByZXNlbnRpbmcgbGVuZ3RoIGluIHBpeGVscyAtLT4KLQotPCEtLSB0aGVzZSBhcmUgdXNlZCBmb3IgaW1hZ2UgbWFwcyAtLT4KLQotPCFFTlRJVFkgJSBTaGFwZSAiKHJlY3R8Y2lyY2xlfHBvbHl8ZGVmYXVsdCkiPgotCi08IUVOVElUWSAlIENvb3JkcyAiQ0RBVEEiPgotICAgIDwhLS0gY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbGVuZ3RocyAtLT4KLQotPCEtLSB1c2VkIGZvciBvYmplY3QsIGFwcGxldCwgaW1nLCBpbnB1dCBhbmQgaWZyYW1lIC0tPgotPCFFTlRJVFkgJSBJbWdBbGlnbiAiKHRvcHxtaWRkbGV8Ym90dG9tfGxlZnR8cmlnaHQpIj4KLQotPCEtLSBhIGNvbG9yIHVzaW5nIHNSR0I6ICNSUkdHQkIgYXMgSGV4IHZhbHVlcyAtLT4KLTwhRU5USVRZICUgQ29sb3IgIkNEQVRBIj4KLQotPCEtLSBUaGVyZSBhcmUgYWxzbyAxNiB3aWRlbHkga25vd24gY29sb3IgbmFtZXMgd2l0aCB0aGVpciBzUkdCIHZhbHVlczoKLQotICAgIEJsYWNrICA9ICMwMDAwMDAgICAgR3JlZW4gID0gIzAwODAwMAotICAgIFNpbHZlciA9ICNDMEMwQzAgICAgTGltZSAgID0gIzAwRkYwMAotICAgIEdyYXkgICA9ICM4MDgwODAgICAgT2xpdmUgID0gIzgwODAwMAotICAgIFdoaXRlICA9ICNGRkZGRkYgICAgWWVsbG93ID0gI0ZGRkYwMAotICAgIE1hcm9vbiA9ICM4MDAwMDAgICAgTmF2eSAgID0gIzAwMDA4MAotICAgIFJlZCAgICA9ICNGRjAwMDAgICAgQmx1ZSAgID0gIzAwMDBGRgotICAgIFB1cnBsZSA9ICM4MDAwODAgICAgVGVhbCAgID0gIzAwODA4MAotICAgIEZ1Y2hzaWE9ICNGRjAwRkYgICAgQXF1YSAgID0gIzAwRkZGRgotLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEdlbmVyaWMgQXR0cmlidXRlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gY29yZSBhdHRyaWJ1dGVzIGNvbW1vbiB0byBtb3N0IGVsZW1lbnRzCi0gIGlkICAgICAgIGRvY3VtZW50LXdpZGUgdW5pcXVlIGlkCi0gIGNsYXNzICAgIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzZXMKLSAgc3R5bGUgICAgYXNzb2NpYXRlZCBzdHlsZSBpbmZvCi0gIHRpdGxlICAgIGFkdmlzb3J5IHRpdGxlL2FtcGxpZmljYXRpb24KLS0tPgotPCFFTlRJVFkgJSBjb3JlYXR0cnMKLSAiaWQgICAgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQKLSAgY2xhc3MgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgc3R5bGUgICAgICAgJVN0eWxlU2hlZXQ7ICAgI0lNUExJRUQKLSAgdGl0bGUgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQiCi0gID4KLQotPCEtLSBpbnRlcm5hdGlvbmFsaXphdGlvbiBhdHRyaWJ1dGVzCi0gIGxhbmcgICAgICAgIGxhbmd1YWdlIGNvZGUgKGJhY2t3YXJkcyBjb21wYXRpYmxlKQotICB4bWw6bGFuZyAgICBsYW5ndWFnZSBjb2RlIChhcyBwZXIgWE1MIDEuMCBzcGVjKQotICBkaXIgICAgICAgICBkaXJlY3Rpb24gZm9yIHdlYWsvbmV1dHJhbCB0ZXh0Ci0tLT4KLTwhRU5USVRZICUgaTE4bgotICJsYW5nICAgICAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICB4bWw6bGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICBkaXIgICAgICAgICAobHRyfHJ0bCkgICAgICAjSU1QTElFRCIKLSAgPgotCi08IS0tIGF0dHJpYnV0ZXMgZm9yIGNvbW1vbiBVSSBldmVudHMKLSAgb25jbGljayAgICAgYSBwb2ludGVyIGJ1dHRvbiB3YXMgY2xpY2tlZAotICBvbmRibGNsaWNrICBhIHBvaW50ZXIgYnV0dG9uIHdhcyBkb3VibGUgY2xpY2tlZAotICBvbm1vdXNlZG93biBhIHBvaW50ZXIgYnV0dG9uIHdhcyBwcmVzc2VkIGRvd24KLSAgb25tb3VzZXVwICAgYSBwb2ludGVyIGJ1dHRvbiB3YXMgcmVsZWFzZWQKLSAgb25tb3VzZW1vdmUgYSBwb2ludGVyIHdhcyBtb3ZlZCBvbnRvIHRoZSBlbGVtZW50Ci0gIG9ubW91c2VvdXQgIGEgcG9pbnRlciB3YXMgbW92ZWQgYXdheSBmcm9tIHRoZSBlbGVtZW50Ci0gIG9ua2V5cHJlc3MgIGEga2V5IHdhcyBwcmVzc2VkIGFuZCByZWxlYXNlZAotICBvbmtleWRvd24gICBhIGtleSB3YXMgcHJlc3NlZCBkb3duCi0gIG9ua2V5dXAgICAgIGEga2V5IHdhcyByZWxlYXNlZAotLS0+Ci08IUVOVElUWSAlIGV2ZW50cwotICJvbmNsaWNrICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmRibGNsaWNrICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlZG93biAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNldXAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlb3ZlciAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlbW92ZSAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbm1vdXNlb3V0ICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmtleXByZXNzICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmtleWRvd24gICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmtleXVwICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCIKLSAgPgotCi08IS0tIGF0dHJpYnV0ZXMgZm9yIGVsZW1lbnRzIHRoYXQgY2FuIGdldCB0aGUgZm9jdXMKLSAgYWNjZXNza2V5ICAgYWNjZXNzaWJpbGl0eSBrZXkgY2hhcmFjdGVyCi0gIHRhYmluZGV4ICAgIHBvc2l0aW9uIGluIHRhYmJpbmcgb3JkZXIKLSAgb25mb2N1cyAgICAgdGhlIGVsZW1lbnQgZ290IHRoZSBmb2N1cwotICBvbmJsdXIgICAgICB0aGUgZWxlbWVudCBsb3N0IHRoZSBmb2N1cwotLS0+Ci08IUVOVElUWSAlIGZvY3VzCi0gImFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEIgotICA+Ci0KLTwhRU5USVRZICUgYXR0cnMgIiVjb3JlYXR0cnM7ICVpMThuOyAlZXZlbnRzOyI+Ci0KLTwhLS0gdGV4dCBhbGlnbm1lbnQgZm9yIHAsIGRpdiwgaDEtaDYuIFRoZSBkZWZhdWx0IGlzCi0gICAgIGFsaWduPSJsZWZ0IiBmb3IgbHRyIGhlYWRpbmdzLCAicmlnaHQiIGZvciBydGwgLS0+Ci0KLTwhRU5USVRZICUgVGV4dEFsaWduICJhbGlnbiAobGVmdHxjZW50ZXJ8cmlnaHQpICNJTVBMSUVEIj4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gVGV4dCBFbGVtZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBzcGVjaWFsCi0gICAiYnIgfCBzcGFuIHwgYmRvIHxvYmplY3QgfCBhcHBsZXQgfCBpbWcgfCBtYXAgfCBpZnJhbWUiPgotCi08IUVOVElUWSAlIGZvbnRzdHlsZSAidHQgfCBpIHwgYiB8IGJpZyB8IHNtYWxsIHwgdQotICAgICAgICAgICAgICAgICAgICAgIHwgcyB8IHN0cmlrZSB8Zm9udCB8IGJhc2Vmb250Ij4KLQotPCFFTlRJVFkgJSBwaHJhc2UgImVtIHwgc3Ryb25nIHwgZGZuIHwgY29kZSB8IHEgfCBzdWIgfCBzdXAgfAotICAgICAgICAgICAgICAgICAgIHNhbXAgfCBrYmQgfCB2YXIgfCBjaXRlIHwgYWJiciB8IGFjcm9ueW0iPgotCi08IUVOVElUWSAlIGlubGluZS5mb3JtcyAiaW5wdXQgfCBzZWxlY3QgfCB0ZXh0YXJlYSB8IGxhYmVsIHwgYnV0dG9uIj4KLQotPCEtLSB0aGVzZSBjYW4gb2NjdXIgYXQgYmxvY2sgb3IgaW5saW5lIGxldmVsIC0tPgotPCFFTlRJVFkgJSBtaXNjICJpbnMgfCBkZWwgfCBzY3JpcHQgfCBub3NjcmlwdCI+Ci0KLTwhRU5USVRZICUgaW5saW5lICJhIHwgJXNwZWNpYWw7IHwgJWZvbnRzdHlsZTsgfCAlcGhyYXNlOyB8ICVpbmxpbmUuZm9ybXM7Ij4KLQotPCEtLSAlSW5saW5lOyBjb3ZlcnMgaW5saW5lIG9yICJ0ZXh0LWxldmVsIiBlbGVtZW50cyAtLT4KLTwhRU5USVRZICUgSW5saW5lICIoI1BDREFUQSB8ICVpbmxpbmU7IHwgJW1pc2M7KSoiPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEJsb2NrIGxldmVsIGVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGhlYWRpbmcgImgxfGgyfGgzfGg0fGg1fGg2Ij4KLTwhRU5USVRZICUgbGlzdHMgInVsIHwgb2wgfCBkbCB8IG1lbnUgfCBkaXIiPgotPCFFTlRJVFkgJSBibG9ja3RleHQgInByZSB8IGhyIHwgYmxvY2txdW90ZSB8IGFkZHJlc3MgfCBjZW50ZXIiPgotCi08IUVOVElUWSAlIGJsb2NrCi0gICAgInAgfCAlaGVhZGluZzsgfCBkaXYgfCAlbGlzdHM7IHwgJWJsb2NrdGV4dDsgfCBpc2luZGV4IHwgZmllbGRzZXQgfCB0YWJsZSI+Ci0KLTwhRU5USVRZICUgQmxvY2sgIiglYmxvY2s7IHwgZm9ybSB8ICVtaXNjOykqIj4KLQotPCEtLSAlRmxvdzsgbWl4ZXMgQmxvY2sgYW5kIElubGluZSBhbmQgaXMgdXNlZCBmb3IgbGlzdCBpdGVtcyBldGMuIC0tPgotPCFFTlRJVFkgJSBGbG93ICIoI1BDREFUQSB8ICVibG9jazsgfCBmb3JtIHwgJWlubGluZTsgfCAlbWlzYzspKiI+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gQ29udGVudCBtb2RlbHMgZm9yIGV4Y2x1c2lvbnMgPT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gYSBlbGVtZW50cyB1c2UgJUlubGluZTsgZXhjbHVkaW5nIGEgLS0+Ci0KLTwhRU5USVRZICUgYS5jb250ZW50Ci0gICAiKCNQQ0RBVEEgfCAlc3BlY2lhbDsgfCAlZm9udHN0eWxlOyB8ICVwaHJhc2U7IHwgJWlubGluZS5mb3JtczsgfCAlbWlzYzspKiI+Ci0KLTwhLS0gcHJlIHVzZXMgJUlubGluZSBleGNsdWRpbmcgaW1nLCBvYmplY3QsIGFwcGxldCwgYmlnLCBzbWFsbCwKLSAgICAgc3ViLCBzdXAsIGZvbnQsIG9yIGJhc2Vmb250IC0tPgotCi08IUVOVElUWSAlIHByZS5jb250ZW50Ci0gICAiKCNQQ0RBVEEgfCBhIHwgYnIgfCBzcGFuIHwgYmRvIHwgbWFwIHwgdHQgfCBpIHwgYiB8IHUgfCBzIHwKLSAgICAgICVwaHJhc2U7IHwgJWlubGluZS5mb3JtczspKiI+Ci0KLTwhLS0gZm9ybSB1c2VzICVGbG93OyBleGNsdWRpbmcgZm9ybSAtLT4KLQotPCFFTlRJVFkgJSBmb3JtLmNvbnRlbnQgIigjUENEQVRBIHwgJWJsb2NrOyB8ICVpbmxpbmU7IHwgJW1pc2M7KSoiPgotCi08IS0tIGJ1dHRvbiB1c2VzICVGbG93OyBidXQgZXhjbHVkZXMgYSwgZm9ybSwgZm9ybSBjb250cm9scywgaWZyYW1lIC0tPgotCi08IUVOVElUWSAlIGJ1dHRvbi5jb250ZW50Ci0gICAiKCNQQ0RBVEEgfCBwIHwgJWhlYWRpbmc7IHwgZGl2IHwgJWxpc3RzOyB8ICVibG9ja3RleHQ7IHwKLSAgICAgIHRhYmxlIHwgYnIgfCBzcGFuIHwgYmRvIHwgb2JqZWN0IHwgYXBwbGV0IHwgaW1nIHwgbWFwIHwKLSAgICAgICVmb250c3R5bGU7IHwgJXBocmFzZTsgfCAlbWlzYzspKiI+Ci0KLTwhLS09PT09PT09PT09PT09PT09IERvY3VtZW50IFN0cnVjdHVyZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gdGhlIG5hbWVzcGFjZSBVUkkgZGVzaWduYXRlcyB0aGUgZG9jdW1lbnQgcHJvZmlsZSAtLT4KLQotPCFFTEVNRU5UIGh0bWwgKGhlYWQsIGZyYW1lc2V0KT4KLTwhQVRUTElTVCBodG1sCi0gICVpMThuOwotICB4bWxucyAgICAgICAlVVJJOyAgICAgICAgICAjRklYRUQgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgSGVhZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBoZWFkLm1pc2MgIihzY3JpcHR8c3R5bGV8bWV0YXxsaW5rfG9iamVjdHxpc2luZGV4KSoiPgotCi08IS0tIGNvbnRlbnQgbW9kZWwgaXMgJWhlYWQubWlzYzsgY29tYmluZWQgd2l0aCBhIHNpbmdsZQotICAgICB0aXRsZSBhbmQgYW4gb3B0aW9uYWwgYmFzZSBlbGVtZW50IGluIGFueSBvcmRlciAtLT4KLQotPCFFTEVNRU5UIGhlYWQgKCVoZWFkLm1pc2M7LAotICAgICAoKHRpdGxlLCAlaGVhZC5taXNjOywgKGJhc2UsICVoZWFkLm1pc2M7KT8pIHwKLSAgICAgIChiYXNlLCAlaGVhZC5taXNjOywgKHRpdGxlLCAlaGVhZC5taXNjOykpKSk+Ci0KLTwhQVRUTElTVCBoZWFkCi0gICVpMThuOwotICBwcm9maWxlICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gVGhlIHRpdGxlIGVsZW1lbnQgaXMgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgZmxvdyBvZiB0ZXh0LgotICAgICAgIEl0IHNob3VsZCBiZSBkaXNwbGF5ZWQsIGZvciBleGFtcGxlIGFzIHRoZSBwYWdlIGhlYWRlciBvcgotICAgICAgIHdpbmRvdyB0aXRsZS4gRXhhY3RseSBvbmUgdGl0bGUgaXMgcmVxdWlyZWQgcGVyIGRvY3VtZW50LgotICAgIC0tPgotPCFFTEVNRU5UIHRpdGxlICgjUENEQVRBKT4KLTwhQVRUTElTVCB0aXRsZSAlaTE4bjs+Ci0KLTwhLS0gZG9jdW1lbnQgYmFzZSBVUkkgLS0+Ci0KLTwhRUxFTUVOVCBiYXNlIEVNUFRZPgotPCFBVFRMSVNUIGJhc2UKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQKLSAgPgotCi08IS0tIGdlbmVyaWMgbWV0YWluZm9ybWF0aW9uIC0tPgotPCFFTEVNRU5UIG1ldGEgRU1QVFk+Ci08IUFUVExJU1QgbWV0YQotICAlaTE4bjsKLSAgaHR0cC1lcXVpdiAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgY29udGVudCAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVECi0gIHNjaGVtZSAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLQotICBSZWxhdGlvbnNoaXAgdmFsdWVzIGNhbiBiZSB1c2VkIGluIHByaW5jaXBsZToKLQotICAgYSkgZm9yIGRvY3VtZW50IHNwZWNpZmljIHRvb2xiYXJzL21lbnVzIHdoZW4gdXNlZAotICAgICAgd2l0aCB0aGUgbGluayBlbGVtZW50IGluIGRvY3VtZW50IGhlYWQgZS5nLgotICAgICAgICBzdGFydCwgY29udGVudHMsIHByZXZpb3VzLCBuZXh0LCBpbmRleCwgZW5kLCBoZWxwCi0gICBiKSB0byBsaW5rIHRvIGEgc2VwYXJhdGUgc3R5bGUgc2hlZXQgKHJlbD0ic3R5bGVzaGVldCIpCi0gICBjKSB0byBtYWtlIGEgbGluayB0byBhIHNjcmlwdCAocmVsPSJzY3JpcHQiKQotICAgZCkgYnkgc3R5bGVzaGVldHMgdG8gY29udHJvbCBob3cgY29sbGVjdGlvbnMgb2YKLSAgICAgIGh0bWwgbm9kZXMgYXJlIHJlbmRlcmVkIGludG8gcHJpbnRlZCBkb2N1bWVudHMKLSAgIGUpIHRvIG1ha2UgYSBsaW5rIHRvIGEgcHJpbnRhYmxlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudAotICAgICAgZS5nLiBhIFBvc3RTY3JpcHQgb3IgUERGIHZlcnNpb24gKHJlbD0iYWx0ZXJuYXRlIiBtZWRpYT0icHJpbnQiKQotLS0+Ci0KLTwhRUxFTUVOVCBsaW5rIEVNUFRZPgotPCFBVFRMSVNUIGxpbmsKLSAgJWF0dHJzOwotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRAotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBocmVmbGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICByZWwgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICByZXYgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICBtZWRpYSAgICAgICAlTWVkaWFEZXNjOyAgICAjSU1QTElFRAotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRAotICA+Ci0KLTwhLS0gc3R5bGUgaW5mbywgd2hpY2ggbWF5IGluY2x1ZGUgQ0RBVEEgc2VjdGlvbnMgLS0+Ci08IUVMRU1FTlQgc3R5bGUgKCNQQ0RBVEEpPgotPCFBVFRMSVNUIHN0eWxlCi0gICVpMThuOwotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjUkVRVUlSRUQKLSAgbWVkaWEgICAgICAgJU1lZGlhRGVzYzsgICAgI0lNUExJRUQKLSAgdGl0bGUgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgeG1sOnNwYWNlICAgKHByZXNlcnZlKSAgICAgI0ZJWEVEICdwcmVzZXJ2ZScKLSAgPgotCi08IS0tIHNjcmlwdCBzdGF0ZW1lbnRzLCB3aGljaCBtYXkgaW5jbHVkZSBDREFUQSBzZWN0aW9ucyAtLT4KLTwhRUxFTUVOVCBzY3JpcHQgKCNQQ0RBVEEpPgotPCFBVFRMSVNUIHNjcmlwdAotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRAotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjUkVRVUlSRUQKLSAgbGFuZ3VhZ2UgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGVmZXIgICAgICAgKGRlZmVyKSAgICAgICAgI0lNUExJRUQKLSAgeG1sOnNwYWNlICAgKHByZXNlcnZlKSAgICAgI0ZJWEVEICdwcmVzZXJ2ZScKLSAgPgotCi08IS0tIGFsdGVybmF0ZSBjb250ZW50IGNvbnRhaW5lciBmb3Igbm9uIHNjcmlwdC1iYXNlZCByZW5kZXJpbmcgLS0+Ci0KLTwhRUxFTUVOVCBub3NjcmlwdCAlRmxvdzs+Ci08IUFUVExJU1Qgbm9zY3JpcHQKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PSBGcmFtZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gb25seSBvbmUgbm9mcmFtZXMgZWxlbWVudCBwZXJtaXR0ZWQgcGVyIGRvY3VtZW50IC0tPgotCi08IUVMRU1FTlQgZnJhbWVzZXQgKGZyYW1lc2V0fGZyYW1lfG5vZnJhbWVzKSo+Ci08IUFUVExJU1QgZnJhbWVzZXQKLSAgJWNvcmVhdHRyczsKLSAgcm93cyAgICAgICAgJU11bHRpTGVuZ3RoczsgI0lNUExJRUQKLSAgY29scyAgICAgICAgJU11bHRpTGVuZ3RoczsgI0lNUExJRUQKLSAgb25sb2FkICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb251bmxvYWQgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIHJlc2VydmVkIGZyYW1lIG5hbWVzIHN0YXJ0IHdpdGggIl8iIG90aGVyd2lzZSBzdGFydHMgd2l0aCBsZXR0ZXIgLS0+Ci0KLTwhLS0gdGlsZWQgd2luZG93IHdpdGhpbiBmcmFtZXNldCAtLT4KLQotPCFFTEVNRU5UIGZyYW1lIEVNUFRZPgotPCFBVFRMSVNUIGZyYW1lCi0gICVjb3JlYXR0cnM7Ci0gIGxvbmdkZXNjICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGZyYW1lYm9yZGVyICgxfDApICAgICAgICAgICIxIgotICBtYXJnaW53aWR0aCAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICBtYXJnaW5oZWlnaHQgJVBpeGVsczsgICAgICAjSU1QTElFRAotICBub3Jlc2l6ZSAgICAobm9yZXNpemUpICAgICAjSU1QTElFRAotICBzY3JvbGxpbmcgICAoeWVzfG5vfGF1dG8pICAiYXV0byIKLSAgPgotCi08IS0tIGlubGluZSBzdWJ3aW5kb3cgLS0+Ci0KLTwhRUxFTUVOVCBpZnJhbWUgJUZsb3c7PgotPCFBVFRMSVNUIGlmcmFtZQotICAlY29yZWF0dHJzOwotICBsb25nZGVzYyAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBmcmFtZWJvcmRlciAoMXwwKSAgICAgICAgICAiMSIKLSAgbWFyZ2lud2lkdGggJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgbWFyZ2luaGVpZ2h0ICVQaXhlbHM7ICAgICAgI0lNUExJRUQKLSAgc2Nyb2xsaW5nICAgKHllc3xub3xhdXRvKSAgImF1dG8iCi0gIGFsaWduICAgICAgICVJbWdBbGlnbjsgICAgICNJTVBMSUVECi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBhbHRlcm5hdGUgY29udGVudCBjb250YWluZXIgZm9yIG5vbiBmcmFtZS1iYXNlZCByZW5kZXJpbmcgLS0+Ci0KLTwhRUxFTUVOVCBub2ZyYW1lcyAoYm9keSk+Ci08IUFUVExJU1Qgbm9mcmFtZXMKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IERvY3VtZW50IEJvZHkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBib2R5ICVGbG93Oz4KLTwhQVRUTElTVCBib2R5Ci0gICVhdHRyczsKLSAgb25sb2FkICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb251bmxvYWQgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgYmFja2dyb3VuZCAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgYmdjb2xvciAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgdGV4dCAgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgbGluayAgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgdmxpbmsgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgYWxpbmsgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgZGl2ICVGbG93Oz4gIDwhLS0gZ2VuZXJpYyBsYW5ndWFnZS9zdHlsZSBjb250YWluZXIgLS0+Ci08IUFUVExJU1QgZGl2Ci0gICVhdHRyczsKLSAgJVRleHRBbGlnbjsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBQYXJhZ3JhcGhzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgcCAlSW5saW5lOz4KLTwhQVRUTElTVCBwCi0gICVhdHRyczsKLSAgJVRleHRBbGlnbjsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBIZWFkaW5ncyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIFRoZXJlIGFyZSBzaXggbGV2ZWxzIG9mIGhlYWRpbmdzIGZyb20gaDEgKHRoZSBtb3N0IGltcG9ydGFudCkKLSAgdG8gaDYgKHRoZSBsZWFzdCBpbXBvcnRhbnQpLgotLS0+Ci0KLTwhRUxFTUVOVCBoMSAgJUlubGluZTs+Ci08IUFUVExJU1QgaDEKLSAgJWF0dHJzOwotICAlVGV4dEFsaWduOwotICA+Ci0KLTwhRUxFTUVOVCBoMiAlSW5saW5lOz4KLTwhQVRUTElTVCBoMgotICAlYXR0cnM7Ci0gICVUZXh0QWxpZ247Ci0gID4KLQotPCFFTEVNRU5UIGgzICVJbmxpbmU7PgotPCFBVFRMSVNUIGgzCi0gICVhdHRyczsKLSAgJVRleHRBbGlnbjsKLSAgPgotCi08IUVMRU1FTlQgaDQgJUlubGluZTs+Ci08IUFUVExJU1QgaDQKLSAgJWF0dHJzOwotICAlVGV4dEFsaWduOwotICA+Ci0KLTwhRUxFTUVOVCBoNSAlSW5saW5lOz4KLTwhQVRUTElTVCBoNQotICAlYXR0cnM7Ci0gICVUZXh0QWxpZ247Ci0gID4KLQotPCFFTEVNRU5UIGg2ICVJbmxpbmU7PgotPCFBVFRMSVNUIGg2Ci0gICVhdHRyczsKLSAgJVRleHRBbGlnbjsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBMaXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIFVub3JkZXJlZCBsaXN0IGJ1bGxldCBzdHlsZXMgLS0+Ci0KLTwhRU5USVRZICUgVUxTdHlsZSAiKGRpc2N8c3F1YXJlfGNpcmNsZSkiPgotCi08IS0tIFVub3JkZXJlZCBsaXN0IC0tPgotCi08IUVMRU1FTlQgdWwgKGxpKSs+Ci08IUFUVExJU1QgdWwKLSAgJWF0dHJzOwotICB0eXBlICAgICAgICAlVUxTdHlsZTsgICAgICNJTVBMSUVECi0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIE9yZGVyZWQgbGlzdCBudW1iZXJpbmcgc3R5bGUKLQotICAgIDEgICBhcmFiaWMgbnVtYmVycyAgICAgIDEsIDIsIDMsIC4uLgotICAgIGEgICBsb3dlciBhbHBoYSAgICAgICAgIGEsIGIsIGMsIC4uLgotICAgIEEgICB1cHBlciBhbHBoYSAgICAgICAgIEEsIEIsIEMsIC4uLgotICAgIGkgICBsb3dlciByb21hbiAgICAgICAgIGksIGlpLCBpaWksIC4uLgotICAgIEkgICB1cHBlciByb21hbiAgICAgICAgIEksIElJLCBJSUksIC4uLgotCi0gICAgVGhlIHN0eWxlIGlzIGFwcGxpZWQgdG8gdGhlIHNlcXVlbmNlIG51bWJlciB3aGljaCBieSBkZWZhdWx0Ci0gICAgaXMgcmVzZXQgdG8gMSBmb3IgdGhlIGZpcnN0IGxpc3QgaXRlbSBpbiBhbiBvcmRlcmVkIGxpc3QuCi0tLT4KLTwhRU5USVRZICUgT0xTdHlsZSAiQ0RBVEEiPgotCi08IS0tIE9yZGVyZWQgKG51bWJlcmVkKSBsaXN0IC0tPgotCi08IUVMRU1FTlQgb2wgKGxpKSs+Ci08IUFUVExJU1Qgb2wKLSAgJWF0dHJzOwotICB0eXBlICAgICAgICAlT0xTdHlsZTsgICAgICAjSU1QTElFRAotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICAjSU1QTElFRAotICBzdGFydCAgICAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gc2luZ2xlIGNvbHVtbiBsaXN0IChERVBSRUNBVEVEKSAtLT4gCi08IUVMRU1FTlQgbWVudSAobGkpKz4KLTwhQVRUTElTVCBtZW51Ci0gICVhdHRyczsKLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gbXVsdGlwbGUgY29sdW1uIGxpc3QgKERFUFJFQ0FURUQpIC0tPiAKLTwhRUxFTUVOVCBkaXIgKGxpKSs+Ci08IUFUVExJU1QgZGlyCi0gICVhdHRyczsKLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gTElTdHlsZSBpcyBjb25zdHJhaW5lZCB0bzogIiglVUxTdHlsZTt8JU9MU3R5bGU7KSIgLS0+Ci08IUVOVElUWSAlIExJU3R5bGUgIkNEQVRBIj4KLQotPCEtLSBsaXN0IGl0ZW0gLS0+Ci0KLTwhRUxFTUVOVCBsaSAlRmxvdzs+Ci08IUFUVExJU1QgbGkKLSAgJWF0dHJzOwotICB0eXBlICAgICAgICAlTElTdHlsZTsgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gZGVmaW5pdGlvbiBsaXN0cyAtIGR0IGZvciB0ZXJtLCBkZCBmb3IgaXRzIGRlZmluaXRpb24gLS0+Ci0KLTwhRUxFTUVOVCBkbCAoZHR8ZGQpKz4KLTwhQVRUTElTVCBkbAotICAlYXR0cnM7Ci0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIGR0ICVJbmxpbmU7PgotPCFBVFRMSVNUIGR0Ci0gICVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgZGQgJUZsb3c7PgotPCFBVFRMSVNUIGRkCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBBZGRyZXNzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGluZm9ybWF0aW9uIG9uIGF1dGhvciAtLT4KLQotPCFFTEVNRU5UIGFkZHJlc3MgJUlubGluZTs+Ci08IUFUVExJU1QgYWRkcmVzcwotICAlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSG9yaXpvbnRhbCBSdWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGhyIEVNUFRZPgotPCFBVFRMSVNUIGhyCi0gICVhdHRyczsKLSAgYWxpZ24gICAgICAgKGxlZnR8Y2VudGVyfHJpZ2h0KSAjSU1QTElFRAotICBub3NoYWRlICAgICAobm9zaGFkZSkgICAgICAjSU1QTElFRAotICBzaXplICAgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFByZWZvcm1hdHRlZCBUZXh0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gY29udGVudCBpcyAlSW5saW5lOyBleGNsdWRpbmcgCi0gICAgICAgICJpbWd8b2JqZWN0fGFwcGxldHxiaWd8c21hbGx8c3VifHN1cHxmb250fGJhc2Vmb250IiAtLT4KLQotPCFFTEVNRU5UIHByZSAlcHJlLmNvbnRlbnQ7PgotPCFBVFRMSVNUIHByZQotICAlYXR0cnM7Ci0gIHdpZHRoICAgICAgICVOdW1iZXI7ICAgICAgI0lNUExJRUQKLSAgeG1sOnNwYWNlICAgKHByZXNlcnZlKSAgICAjRklYRUQgJ3ByZXNlcnZlJwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEJsb2NrLWxpa2UgUXVvdGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBibG9ja3F1b3RlICVGbG93Oz4KLTwhQVRUTElTVCBibG9ja3F1b3RlCi0gICVhdHRyczsKLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBUZXh0IGFsaWdubWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGNlbnRlciBjb250ZW50IC0tPgotPCFFTEVNRU5UIGNlbnRlciAlRmxvdzs+Ci08IUFUVExJU1QgY2VudGVyCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbnNlcnRlZC9EZWxldGVkIFRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi0KLTwhLS0KLSAgaW5zL2RlbCBhcmUgYWxsb3dlZCBpbiBibG9jayBhbmQgaW5saW5lIGNvbnRlbnQsIGJ1dCBpdHMKLSAgaW5hcHByb3ByaWF0ZSB0byBpbmNsdWRlIGJsb2NrIGNvbnRlbnQgd2l0aGluIGFuIGlucyBlbGVtZW50Ci0gIG9jY3VycmluZyBpbiBpbmxpbmUgY29udGVudC4KLS0tPgotPCFFTEVNRU5UIGlucyAlRmxvdzs+Ci08IUFUVExJU1QgaW5zCi0gICVhdHRyczsKLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGF0ZXRpbWUgICAgJURhdGV0aW1lOyAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgZGVsICVGbG93Oz4KLTwhQVRUTElTVCBkZWwKLSAgJWF0dHJzOwotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBkYXRldGltZSAgICAlRGF0ZXRpbWU7ICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gVGhlIEFuY2hvciBFbGVtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gY29udGVudCBpcyAlSW5saW5lOyBleGNlcHQgdGhhdCBhbmNob3JzIHNob3VsZG4ndCBiZSBuZXN0ZWQgLS0+Ci0KLTwhRUxFTUVOVCBhICVhLmNvbnRlbnQ7PgotPCFBVFRMSVNUIGEKLSAgJWF0dHJzOwotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRAotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBocmVmbGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICByZWwgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICByZXYgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBzaGFwZSAgICAgICAlU2hhcGU7ICAgICAgICAicmVjdCIKLSAgY29vcmRzICAgICAgJUNvb3JkczsgICAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09IElubGluZSBFbGVtZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgc3BhbiAlSW5saW5lOz4gPCEtLSBnZW5lcmljIGxhbmd1YWdlL3N0eWxlIGNvbnRhaW5lciAtLT4KLTwhQVRUTElTVCBzcGFuCi0gICVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgYmRvICVJbmxpbmU7PiAgPCEtLSBJMThOIEJpRGkgb3Zlci1yaWRlIC0tPgotPCFBVFRMSVNUIGJkbwotICAlY29yZWF0dHJzOwotICAlZXZlbnRzOwotICBsYW5nICAgICAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICB4bWw6bGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICBkaXIgICAgICAgICAobHRyfHJ0bCkgICAgICAjUkVRVUlSRUQKLSAgPgotCi08IUVMRU1FTlQgYnIgRU1QVFk+ICAgPCEtLSBmb3JjZWQgbGluZSBicmVhayAtLT4KLTwhQVRUTElTVCBicgotICAlY29yZWF0dHJzOwotICBjbGVhciAgICAgICAobGVmdHxhbGx8cmlnaHR8bm9uZSkgIm5vbmUiCi0gID4KLQotPCFFTEVNRU5UIGVtICVJbmxpbmU7PiAgIDwhLS0gZW1waGFzaXMgLS0+Ci08IUFUVExJU1QgZW0gJWF0dHJzOz4KLQotPCFFTEVNRU5UIHN0cm9uZyAlSW5saW5lOz4gICA8IS0tIHN0cm9uZyBlbXBoYXNpcyAtLT4KLTwhQVRUTElTVCBzdHJvbmcgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGRmbiAlSW5saW5lOz4gICA8IS0tIGRlZmluaXRpb25hbCAtLT4KLTwhQVRUTElTVCBkZm4gJWF0dHJzOz4KLQotPCFFTEVNRU5UIGNvZGUgJUlubGluZTs+ICAgPCEtLSBwcm9ncmFtIGNvZGUgLS0+Ci08IUFUVExJU1QgY29kZSAlYXR0cnM7PgotCi08IUVMRU1FTlQgc2FtcCAlSW5saW5lOz4gICA8IS0tIHNhbXBsZSAtLT4KLTwhQVRUTElTVCBzYW1wICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBrYmQgJUlubGluZTs+ICA8IS0tIHNvbWV0aGluZyB1c2VyIHdvdWxkIHR5cGUgLS0+Ci08IUFUVExJU1Qga2JkICVhdHRyczs+Ci0KLTwhRUxFTUVOVCB2YXIgJUlubGluZTs+ICAgPCEtLSB2YXJpYWJsZSAtLT4KLTwhQVRUTElTVCB2YXIgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGNpdGUgJUlubGluZTs+ICAgPCEtLSBjaXRhdGlvbiAtLT4KLTwhQVRUTElTVCBjaXRlICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBhYmJyICVJbmxpbmU7PiAgIDwhLS0gYWJicmV2aWF0aW9uIC0tPgotPCFBVFRMSVNUIGFiYnIgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGFjcm9ueW0gJUlubGluZTs+ICAgPCEtLSBhY3JvbnltIC0tPgotPCFBVFRMSVNUIGFjcm9ueW0gJWF0dHJzOz4KLQotPCFFTEVNRU5UIHEgJUlubGluZTs+ICAgPCEtLSBpbmxpbmVkIHF1b3RlIC0tPgotPCFBVFRMSVNUIHEKLSAgICVhdHRyczsKLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgID4KLQotPCFFTEVNRU5UIHN1YiAlSW5saW5lOz4gPCEtLSBzdWJzY3JpcHQgLS0+Ci08IUFUVExJU1Qgc3ViICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBzdXAgJUlubGluZTs+IDwhLS0gc3VwZXJzY3JpcHQgLS0+Ci08IUFUVExJU1Qgc3VwICVhdHRyczs+Ci0KLTwhRUxFTUVOVCB0dCAlSW5saW5lOz4gICA8IS0tIGZpeGVkIHBpdGNoIGZvbnQgLS0+Ci08IUFUVExJU1QgdHQgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGkgJUlubGluZTs+ICAgPCEtLSBpdGFsaWMgZm9udCAtLT4KLTwhQVRUTElTVCBpICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBiICVJbmxpbmU7PiAgIDwhLS0gYm9sZCBmb250IC0tPgotPCFBVFRMSVNUIGIgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGJpZyAlSW5saW5lOz4gICA8IS0tIGJpZ2dlciBmb250IC0tPgotPCFBVFRMSVNUIGJpZyAlYXR0cnM7PgotCi08IUVMRU1FTlQgc21hbGwgJUlubGluZTs+ICAgPCEtLSBzbWFsbGVyIGZvbnQgLS0+Ci08IUFUVExJU1Qgc21hbGwgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHUgJUlubGluZTs+ICAgPCEtLSB1bmRlcmxpbmUgLS0+Ci08IUFUVExJU1QgdSAlYXR0cnM7PgotCi08IUVMRU1FTlQgcyAlSW5saW5lOz4gICA8IS0tIHN0cmlrZS10aHJvdWdoIC0tPgotPCFBVFRMSVNUIHMgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHN0cmlrZSAlSW5saW5lOz4gICA8IS0tIHN0cmlrZS10aHJvdWdoIC0tPgotPCFBVFRMSVNUIHN0cmlrZSAlYXR0cnM7PgotCi08IUVMRU1FTlQgYmFzZWZvbnQgRU1QVFk+ICA8IS0tIGJhc2UgZm9udCBzaXplIC0tPgotPCFBVFRMSVNUIGJhc2Vmb250Ci0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVECi0gIHNpemUgICAgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRAotICBjb2xvciAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICBmYWNlICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBmb250ICVJbmxpbmU7PiA8IS0tIGxvY2FsIGNoYW5nZSB0byBmb250IC0tPgotPCFBVFRMSVNUIGZvbnQKLSAgJWNvcmVhdHRyczsKLSAgJWkxOG47Ci0gIHNpemUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGNvbG9yICAgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gIGZhY2UgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09IE9iamVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLQotICBvYmplY3QgaXMgdXNlZCB0byBlbWJlZCBvYmplY3RzIGFzIHBhcnQgb2YgSFRNTCBwYWdlcy4KLSAgcGFyYW0gZWxlbWVudHMgc2hvdWxkIHByZWNlZGUgb3RoZXIgY29udGVudC4gUGFyYW1ldGVycwotICBjYW4gYWxzbyBiZSBleHByZXNzZWQgYXMgYXR0cmlidXRlL3ZhbHVlIHBhaXJzIG9uIHRoZQotICBvYmplY3QgZWxlbWVudCBpdHNlbGYgd2hlbiBicmV2aXR5IGlzIGRlc2lyZWQuCi0tLT4KLQotPCFFTEVNRU5UIG9iamVjdCAoI1BDREFUQSB8IHBhcmFtIHwgJWJsb2NrOyB8IGZvcm0gfCVpbmxpbmU7IHwgJW1pc2M7KSo+Ci08IUFUVExJU1Qgb2JqZWN0Ci0gICVhdHRyczsKLSAgZGVjbGFyZSAgICAgKGRlY2xhcmUpICAgICAgI0lNUExJRUQKLSAgY2xhc3NpZCAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgY29kZWJhc2UgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGF0YSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgY29kZXR5cGUgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgYXJjaGl2ZSAgICAgJVVyaUxpc3Q7ICAgICAgI0lNUExJRUQKLSAgc3RhbmRieSAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgYWxpZ24gICAgICAgJUltZ0FsaWduOyAgICAgI0lNUExJRUQKLSAgYm9yZGVyICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgaHNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgdnNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tCi0gIHBhcmFtIGlzIHVzZWQgdG8gc3VwcGx5IGEgbmFtZWQgcHJvcGVydHkgdmFsdWUuCi0gIEluIFhNTCBpdCB3b3VsZCBzZWVtIG5hdHVyYWwgdG8gZm9sbG93IFJERiBhbmQgc3VwcG9ydCBhbgotICBhYmJyZXZpYXRlZCBzeW50YXggd2hlcmUgdGhlIHBhcmFtIGVsZW1lbnRzIGFyZSByZXBsYWNlZAotICBieSBhdHRyaWJ1dGUgdmFsdWUgcGFpcnMgb24gdGhlIG9iamVjdCBzdGFydCB0YWcuCi0tLT4KLTwhRUxFTUVOVCBwYXJhbSBFTVBUWT4KLTwhQVRUTElTVCBwYXJhbQotICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWV0eXBlICAgKGRhdGF8cmVmfG9iamVjdCkgImRhdGEiCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSmF2YSBhcHBsZXQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLQotICBPbmUgb2YgY29kZSBvciBvYmplY3QgYXR0cmlidXRlcyBtdXN0IGJlIHByZXNlbnQuCi0gIFBsYWNlIHBhcmFtIGVsZW1lbnRzIGJlZm9yZSBvdGhlciBjb250ZW50LgotLS0+Ci08IUVMRU1FTlQgYXBwbGV0ICgjUENEQVRBIHwgcGFyYW0gfCAlYmxvY2s7IHwgZm9ybSB8ICVpbmxpbmU7IHwgJW1pc2M7KSo+Ci08IUFUVExJU1QgYXBwbGV0Ci0gICVjb3JlYXR0cnM7Ci0gIGNvZGViYXNlICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGFyY2hpdmUgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGNvZGUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIG9iamVjdCAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNSRVFVSVJFRAotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjUkVRVUlSRUQKLSAgYWxpZ24gICAgICAgJUltZ0FsaWduOyAgICAgI0lNUExJRUQKLSAgaHNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgdnNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbWFnZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gICBUbyBhdm9pZCBhY2Nlc3NpYmlsaXR5IHByb2JsZW1zIGZvciBwZW9wbGUgd2hvIGFyZW4ndAotICAgYWJsZSB0byBzZWUgdGhlIGltYWdlLCB5b3Ugc2hvdWxkIHByb3ZpZGUgYSB0ZXh0Ci0gICBkZXNjcmlwdGlvbiB1c2luZyB0aGUgYWx0IGFuZCBsb25nZGVzYyBhdHRyaWJ1dGVzLgotICAgSW4gYWRkaXRpb24sIGF2b2lkIHRoZSB1c2Ugb2Ygc2VydmVyLXNpZGUgaW1hZ2UgbWFwcy4KLS0tPgotCi08IUVMRU1FTlQgaW1nIEVNUFRZPgotPCFBVFRMSVNUIGltZwotICAlYXR0cnM7Ci0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRAotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQKLSAgbmFtZSAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgbG9uZ2Rlc2MgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaXNtYXAgICAgICAgKGlzbWFwKSAgICAgICAgI0lNUExJRUQKLSAgYWxpZ24gICAgICAgJUltZ0FsaWduOyAgICAgI0lNUExJRUQKLSAgYm9yZGVyICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgaHNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgdnNwYWNlICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIHVzZW1hcCBwb2ludHMgdG8gYSBtYXAgZWxlbWVudCB3aGljaCBtYXkgYmUgaW4gdGhpcyBkb2N1bWVudAotICBvciBhbiBleHRlcm5hbCBkb2N1bWVudCwgYWx0aG91Z2ggdGhlIGxhdHRlciBpcyBub3Qgd2lkZWx5IHN1cHBvcnRlZCAtLT4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBDbGllbnQtc2lkZSBpbWFnZSBtYXBzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBUaGVzZSBjYW4gYmUgcGxhY2VkIGluIHRoZSBzYW1lIGRvY3VtZW50IG9yIGdyb3VwZWQgaW4gYQotICAgICBzZXBhcmF0ZSBkb2N1bWVudCBhbHRob3VnaCB0aGlzIGlzbid0IHlldCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IUVMRU1FTlQgbWFwICgoJWJsb2NrOyB8IGZvcm0gfCAlbWlzYzspKyB8IGFyZWErKT4KLTwhQVRUTElTVCBtYXAKLSAgJWkxOG47Ci0gICVldmVudHM7Ci0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNSRVFVSVJFRAotICBjbGFzcyAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBzdHlsZSAgICAgICAlU3R5bGVTaGVldDsgICAjSU1QTElFRAotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBhcmVhIEVNUFRZPgotPCFBVFRMSVNUIGFyZWEKLSAgJWF0dHJzOwotICBzaGFwZSAgICAgICAlU2hhcGU7ICAgICAgICAicmVjdCIKLSAgY29vcmRzICAgICAgJUNvb3JkczsgICAgICAgI0lNUExJRUQKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgbm9ocmVmICAgICAgKG5vaHJlZikgICAgICAgI0lNUExJRUQKLSAgYWx0ICAgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRm9ybXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGZvcm0gJWZvcm0uY29udGVudDs+ICAgPCEtLSBmb3JtcyBzaG91bGRuJ3QgYmUgbmVzdGVkIC0tPgotCi08IUFUVExJU1QgZm9ybQotICAlYXR0cnM7Ci0gIGFjdGlvbiAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRAotICBtZXRob2QgICAgICAoZ2V0fHBvc3QpICAgICAiZ2V0IgotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICBlbmN0eXBlICAgICAlQ29udGVudFR5cGU7ICAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgotICBvbnN1Ym1pdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbnJlc2V0ICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBhY2NlcHQgICAgICAlQ29udGVudFR5cGVzOyAjSU1QTElFRAotICBhY2NlcHQtY2hhcnNldCAlQ2hhcnNldHM7ICAjSU1QTElFRAotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLSAgRWFjaCBsYWJlbCBtdXN0IG5vdCBjb250YWluIG1vcmUgdGhhbiBPTkUgZmllbGQKLSAgTGFiZWwgZWxlbWVudHMgc2hvdWxkbid0IGJlIG5lc3RlZC4KLS0tPgotPCFFTEVNRU5UIGxhYmVsICVJbmxpbmU7PgotPCFBVFRMSVNUIGxhYmVsCi0gICVhdHRyczsKLSAgZm9yICAgICAgICAgSURSRUYgICAgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVOVElUWSAlIElucHV0VHlwZQotICAiKHRleHQgfCBwYXNzd29yZCB8IGNoZWNrYm94IHwKLSAgICByYWRpbyB8IHN1Ym1pdCB8IHJlc2V0IHwKLSAgICBmaWxlIHwgaGlkZGVuIHwgaW1hZ2UgfCBidXR0b24pIgotICAgPgotCi08IS0tIHRoZSBuYW1lIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBmb3IgYWxsIGJ1dCBzdWJtaXQgJiByZXNldCAtLT4KLQotPCFFTEVNRU5UIGlucHV0IEVNUFRZPiAgICAgPCEtLSBmb3JtIGNvbnRyb2wgLS0+Ci08IUFUVExJU1QgaW5wdXQKLSAgJWF0dHJzOwotICB0eXBlICAgICAgICAlSW5wdXRUeXBlOyAgICAidGV4dCIKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgY2hlY2tlZCAgICAgKGNoZWNrZWQpICAgICAgI0lNUExJRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgcmVhZG9ubHkgICAgKHJlYWRvbmx5KSAgICAgI0lNUExJRUQKLSAgc2l6ZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgbWF4bGVuZ3RoICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgYWx0ICAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25zZWxlY3QgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25jaGFuZ2UgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgYWNjZXB0ICAgICAgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQKLSAgYWxpZ24gICAgICAgJUltZ0FsaWduOyAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgc2VsZWN0IChvcHRncm91cHxvcHRpb24pKz4gIDwhLS0gb3B0aW9uIHNlbGVjdG9yIC0tPgotPCFBVFRMSVNUIHNlbGVjdAotICAlYXR0cnM7Ci0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHNpemUgICAgICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIG11bHRpcGxlICAgIChtdWx0aXBsZSkgICAgICNJTVBMSUVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIG9wdGdyb3VwIChvcHRpb24pKz4gICA8IS0tIG9wdGlvbiBncm91cCAtLT4KLTwhQVRUTElTVCBvcHRncm91cAotICAlYXR0cnM7Ci0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIGxhYmVsICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRAotICA+Ci0KLTwhRUxFTUVOVCBvcHRpb24gKCNQQ0RBVEEpPiAgICAgPCEtLSBzZWxlY3RhYmxlIGNob2ljZSAtLT4KLTwhQVRUTElTVCBvcHRpb24KLSAgJWF0dHJzOwotICBzZWxlY3RlZCAgICAoc2VsZWN0ZWQpICAgICAjSU1QTElFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICBsYWJlbCAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCB0ZXh0YXJlYSAoI1BDREFUQSk+ICAgICA8IS0tIG11bHRpLWxpbmUgdGV4dCBmaWVsZCAtLT4KLTwhQVRUTElTVCB0ZXh0YXJlYQotICAlYXR0cnM7Ci0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHJvd3MgICAgICAgICVOdW1iZXI7ICAgICAgICNSRVFVSVJFRAotICBjb2xzICAgICAgICAlTnVtYmVyOyAgICAgICAjUkVRVUlSRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgcmVhZG9ubHkgICAgKHJlYWRvbmx5KSAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25zZWxlY3QgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25jaGFuZ2UgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tCi0gIFRoZSBmaWVsZHNldCBlbGVtZW50IGlzIHVzZWQgdG8gZ3JvdXAgZm9ybSBmaWVsZHMuCi0gIE9ubHkgb25lIGxlZ2VuZCBlbGVtZW50IHNob3VsZCBvY2N1ciBpbiB0aGUgY29udGVudAotICBhbmQgaWYgcHJlc2VudCBzaG91bGQgb25seSBiZSBwcmVjZWRlZCBieSB3aGl0ZXNwYWNlLgotLS0+Ci08IUVMRU1FTlQgZmllbGRzZXQgKCNQQ0RBVEEgfCBsZWdlbmQgfCAlYmxvY2s7IHwgZm9ybSB8ICVpbmxpbmU7IHwgJW1pc2M7KSo+Ci08IUFUVExJU1QgZmllbGRzZXQKLSAgJWF0dHJzOwotICA+Ci0KLTwhRU5USVRZICUgTEFsaWduICIodG9wfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhRUxFTUVOVCBsZWdlbmQgJUlubGluZTs+ICAgICA8IS0tIGZpZWxkc2V0IGxhYmVsIC0tPgotPCFBVFRMSVNUIGxlZ2VuZAotICAlYXR0cnM7Ci0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIGFsaWduICAgICAgICVMQWxpZ247ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLQotIENvbnRlbnQgaXMgJUZsb3c7IGV4Y2x1ZGluZyBhLCBmb3JtLCBmb3JtIGNvbnRyb2xzLCBpZnJhbWUKLS0tPiAKLTwhRUxFTUVOVCBidXR0b24gJWJ1dHRvbi5jb250ZW50Oz4gIDwhLS0gcHVzaCBidXR0b24gLS0+Ci08IUFUVExJU1QgYnV0dG9uCi0gICVhdHRyczsKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgKGJ1dHRvbnxzdWJtaXR8cmVzZXQpICJzdWJtaXQiCi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBzaW5nbGUtbGluZSB0ZXh0IGlucHV0IGNvbnRyb2wgKERFUFJFQ0FURUQpIC0tPgotPCFFTEVNRU5UIGlzaW5kZXggRU1QVFk+Ci08IUFUVExJU1QgaXNpbmRleAotICAlY29yZWF0dHJzOwotICAlaTE4bjsKLSAgcHJvbXB0ICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09PT0gVGFibGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIERlcml2ZWQgZnJvbSBJRVRGIEhUTUwgdGFibGUgc3RhbmRhcmQsIHNlZSBbUkZDMTk0Ml0gLS0+Ci0KLTwhLS0KLSBUaGUgYm9yZGVyIGF0dHJpYnV0ZSBzZXRzIHRoZSB0aGlja25lc3Mgb2YgdGhlIGZyYW1lIGFyb3VuZCB0aGUKLSB0YWJsZS4gVGhlIGRlZmF1bHQgdW5pdHMgYXJlIHNjcmVlbiBwaXhlbHMuCi0KLSBUaGUgZnJhbWUgYXR0cmlidXRlIHNwZWNpZmllcyB3aGljaCBwYXJ0cyBvZiB0aGUgZnJhbWUgYXJvdW5kCi0gdGhlIHRhYmxlIHNob3VsZCBiZSByZW5kZXJlZC4gVGhlIHZhbHVlcyBhcmUgbm90IHRoZSBzYW1lIGFzCi0gQ0FMUyB0byBhdm9pZCBhIG5hbWUgY2xhc2ggd2l0aCB0aGUgdmFsaWduIGF0dHJpYnV0ZS4KLS0tPgotPCFFTlRJVFkgJSBURnJhbWUgIih2b2lkfGFib3ZlfGJlbG93fGhzaWRlc3xsaHN8cmhzfHZzaWRlc3xib3h8Ym9yZGVyKSI+Ci0KLTwhLS0KLSBUaGUgcnVsZXMgYXR0cmlidXRlIGRlZmluZXMgd2hpY2ggcnVsZXMgdG8gZHJhdyBiZXR3ZWVuIGNlbGxzOgotCi0gSWYgcnVsZXMgaXMgYWJzZW50IHRoZW4gYXNzdW1lOgotICAgICAibm9uZSIgaWYgYm9yZGVyIGlzIGFic2VudCBvciBib3JkZXI9IjAiIG90aGVyd2lzZSAiYWxsIgotLS0+Ci0KLTwhRU5USVRZICUgVFJ1bGVzICIobm9uZSB8IGdyb3VwcyB8IHJvd3MgfCBjb2xzIHwgYWxsKSI+Ci0gIAotPCEtLSBob3Jpem9udGFsIHBsYWNlbWVudCBvZiB0YWJsZSByZWxhdGl2ZSB0byBkb2N1bWVudCAtLT4KLTwhRU5USVRZICUgVEFsaWduICIobGVmdHxjZW50ZXJ8cmlnaHQpIj4KLQotPCEtLSBob3Jpem9udGFsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzCi0KLSAgY2hhciAgICAgICAgYWxpZ25tZW50IGNoYXIsIGUuZy4gY2hhcj0iOiIKLSAgY2hhcm9mZiAgICAgb2Zmc2V0IGZvciBhbGlnbm1lbnQgY2hhcgotLS0+Ci08IUVOVElUWSAlIGNlbGxoYWxpZ24KLSAgImFsaWduICAgICAgKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnl8Y2hhcikgI0lNUExJRUQKLSAgIGNoYXIgICAgICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgIGNoYXJvZmYgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQiCi0gID4KLQotPCEtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cyAtLT4KLTwhRU5USVRZICUgY2VsbHZhbGlnbgotICAidmFsaWduICAgICAodG9wfG1pZGRsZXxib3R0b218YmFzZWxpbmUpICNJTVBMSUVEIgotICA+Ci0KLTwhRUxFTUVOVCB0YWJsZQotICAgICAoY2FwdGlvbj8sIChjb2wqfGNvbGdyb3VwKiksIHRoZWFkPywgdGZvb3Q/LCAodGJvZHkrfHRyKykpPgotPCFFTEVNRU5UIGNhcHRpb24gICVJbmxpbmU7PgotPCFFTEVNRU5UIHRoZWFkICAgICh0cikrPgotPCFFTEVNRU5UIHRmb290ICAgICh0cikrPgotPCFFTEVNRU5UIHRib2R5ICAgICh0cikrPgotPCFFTEVNRU5UIGNvbGdyb3VwIChjb2wpKj4KLTwhRUxFTUVOVCBjb2wgICAgICBFTVBUWT4KLTwhRUxFTUVOVCB0ciAgICAgICAodGh8dGQpKz4KLTwhRUxFTUVOVCB0aCAgICAgICAlRmxvdzs+Ci08IUVMRU1FTlQgdGQgICAgICAgJUZsb3c7PgotCi08IUFUVExJU1QgdGFibGUKLSAgJWF0dHJzOwotICBzdW1tYXJ5ICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICBib3JkZXIgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICBmcmFtZSAgICAgICAlVEZyYW1lOyAgICAgICAjSU1QTElFRAotICBydWxlcyAgICAgICAlVFJ1bGVzOyAgICAgICAjSU1QTElFRAotICBjZWxsc3BhY2luZyAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICBjZWxscGFkZGluZyAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICBhbGlnbiAgICAgICAlVEFsaWduOyAgICAgICAjSU1QTElFRAotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRU5USVRZICUgQ0FsaWduICIodG9wfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhQVRUTElTVCBjYXB0aW9uCi0gICVhdHRyczsKLSAgYWxpZ24gICAgICAgJUNBbGlnbjsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tCi1jb2xncm91cCBncm91cHMgYSBzZXQgb2YgY29sIGVsZW1lbnRzLiBJdCBhbGxvd3MgeW91IHRvIGdyb3VwCi1zZXZlcmFsIHNlbWFudGljYWxseSByZWxhdGVkIGNvbHVtbnMgdG9nZXRoZXIuCi0tLT4KLTwhQVRUTElTVCBjb2xncm91cAotICAlYXR0cnM7Ci0gIHNwYW4gICAgICAgICVOdW1iZXI7ICAgICAgICIxIgotICB3aWR0aCAgICAgICAlTXVsdGlMZW5ndGg7ICAjSU1QTElFRAotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCEtLQotIGNvbCBlbGVtZW50cyBkZWZpbmUgdGhlIGFsaWdubWVudCBwcm9wZXJ0aWVzIGZvciBjZWxscyBpbgotIG9uZSBvciBtb3JlIGNvbHVtbnMuCi0KLSBUaGUgd2lkdGggYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIGNvbHVtbnMsIGUuZy4KLQotICAgICB3aWR0aD02NCAgICAgICAgd2lkdGggaW4gc2NyZWVuIHBpeGVscwotICAgICB3aWR0aD0wLjUqICAgICAgcmVsYXRpdmUgd2lkdGggb2YgMC41Ci0KLSBUaGUgc3BhbiBhdHRyaWJ1dGUgY2F1c2VzIHRoZSBhdHRyaWJ1dGVzIG9mIG9uZQotIGNvbCBlbGVtZW50IHRvIGFwcGx5IHRvIG1vcmUgdGhhbiBvbmUgY29sdW1uLgotLS0+Ci08IUFUVExJU1QgY29sCi0gICVhdHRyczsKLSAgc3BhbiAgICAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gIHdpZHRoICAgICAgICVNdWx0aUxlbmd0aDsgICNJTVBMSUVECi0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IS0tCi0gICAgVXNlIHRoZWFkIHRvIGR1cGxpY2F0ZSBoZWFkZXJzIHdoZW4gYnJlYWtpbmcgdGFibGUKLSAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGhlYWRlcnMgd2hlbgotICAgIHRib2R5IHNlY3Rpb25zIGFyZSByZW5kZXJlZCBpbiBzY3JvbGxpbmcgcGFuZWwuCi0KLSAgICBVc2UgdGZvb3QgdG8gZHVwbGljYXRlIGZvb3RlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMsIG9yIGZvciBzdGF0aWMgZm9vdGVycyB3aGVuCi0gICAgdGJvZHkgc2VjdGlvbnMgYXJlIHJlbmRlcmVkIGluIHNjcm9sbGluZyBwYW5lbC4KLQotICAgIFVzZSBtdWx0aXBsZSB0Ym9keSBzZWN0aW9ucyB3aGVuIHJ1bGVzIGFyZSBuZWVkZWQKLSAgICBiZXR3ZWVuIGdyb3VwcyBvZiB0YWJsZSByb3dzLgotLS0+Ci08IUFUVExJU1QgdGhlYWQKLSAgJWF0dHJzOwotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCFBVFRMSVNUIHRmb290Ci0gICVhdHRyczsKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhQVRUTElTVCB0Ym9keQotICAlYXR0cnM7Ci0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IUFUVExJU1QgdHIKLSAgJWF0dHJzOwotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBTY29wZSBpcyBzaW1wbGVyIHRoYW4gaGVhZGVycyBhdHRyaWJ1dGUgZm9yIGNvbW1vbiB0YWJsZXMgLS0+Ci08IUVOVElUWSAlIFNjb3BlICIocm93fGNvbHxyb3dncm91cHxjb2xncm91cCkiPgotCi08IS0tIHRoIGlzIGZvciBoZWFkZXJzLCB0ZCBmb3IgZGF0YSBhbmQgZm9yIGNlbGxzIGFjdGluZyBhcyBib3RoIC0tPgotCi08IUFUVExJU1QgdGgKLSAgJWF0dHJzOwotICBhYmJyICAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICBheGlzICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBoZWFkZXJzICAgICBJRFJFRlMgICAgICAgICAjSU1QTElFRAotICBzY29wZSAgICAgICAlU2NvcGU7ICAgICAgICAjSU1QTElFRAotICByb3dzcGFuICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgY29sc3BhbiAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgbm93cmFwICAgICAgKG5vd3JhcCkgICAgICAgI0lNUExJRUQKLSAgYmdjb2xvciAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgaGVpZ2h0ICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUFUVExJU1QgdGQKLSAgJWF0dHJzOwotICBhYmJyICAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICBheGlzICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBoZWFkZXJzICAgICBJRFJFRlMgICAgICAgICAjSU1QTElFRAotICBzY29wZSAgICAgICAlU2NvcGU7ICAgICAgICAjSU1QTElFRAotICByb3dzcGFuICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgY29sc3BhbiAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgbm93cmFwICAgICAgKG5vd3JhcCkgICAgICAgI0lNUExJRUQKLSAgYmdjb2xvciAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgaGVpZ2h0ICAgICAgJVBpeGVsczsgICAgICAgI0lNUExJRUQKLSAgPgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwxLXN0cmljdC5kdGQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwxLXN0cmljdC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjExYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sMS1zdHJpY3QuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsOTg4ICswLDAgQEAKLTwhLS0KLSAgIEV4dGVuc2libGUgSFRNTCB2ZXJzaW9uIDEuMCBTdHJpY3QgRFRECi0KLSAgIFRoaXMgaXMgdGhlIHNhbWUgYXMgSFRNTCA0LjAgU3RyaWN0IGV4Y2VwdCBmb3IKLSAgIGNoYW5nZXMgZHVlIHRvIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIFhNTCBhbmQgU0dNTC4KLQotICAgTmFtZXNwYWNlID0gaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbAotCi0gICBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiwgc2VlOiBodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEKLQotICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwKLSAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotCi0gICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiCi0KLSAgICRSZXZpc2lvbjogMS4xICQKLSAgICREYXRlOiAyMDA3LzA1LzE1IDAyOjQyOjIyICQKLQotLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09IENoYXJhY3RlciBtbmVtb25pYyBlbnRpdGllcyA9PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgSFRNTGxhdDEgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBMYXRpbiAxIGZvciBYSFRNTC8vRU4iCi0gICAieGh0bWwtbGF0MS5lbnQiPgotJUhUTUxsYXQxOwotCi08IUVOVElUWSAlIEhUTUxzeW1ib2wgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBTeW1ib2xzIGZvciBYSFRNTC8vRU4iCi0gICAieGh0bWwtc3ltYm9sLmVudCI+Ci0lSFRNTHN5bWJvbDsKLQotPCFFTlRJVFkgJSBIVE1Mc3BlY2lhbCBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIFNwZWNpYWwgZm9yIFhIVE1MLy9FTiIKLSAgICJ4aHRtbC1zcGVjaWFsLmVudCI+Ci0lSFRNTHNwZWNpYWw7Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gSW1wb3J0ZWQgTmFtZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGUgIkNEQVRBIj4KLSAgICA8IS0tIG1lZGlhIHR5cGUsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGVzICJDREFUQSI+Ci0gICAgPCEtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSB0eXBlcywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLQotPCFFTlRJVFkgJSBDaGFyc2V0ICJDREFUQSI+Ci0gICAgPCEtLSBhIGNoYXJhY3RlciBlbmNvZGluZywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLQotPCFFTlRJVFkgJSBDaGFyc2V0cyAiQ0RBVEEiPgotICAgIDwhLS0gYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjaGFyYWN0ZXIgZW5jb2RpbmdzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotCi08IUVOVElUWSAlIExhbmd1YWdlQ29kZSAiTk1UT0tFTiI+Ci0gICAgPCEtLSBhIGxhbmd1YWdlIGNvZGUsIGFzIHBlciBbUkZDMTc2Nl0gLS0+Ci0KLTwhRU5USVRZICUgQ2hhcmFjdGVyICJDREFUQSI+Ci0gICAgPCEtLSBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSBbSVNPMTA2NDZdIC0tPgotCi08IUVOVElUWSAlIE51bWJlciAiQ0RBVEEiPgotICAgIDwhLS0gb25lIG9yIG1vcmUgZGlnaXRzIC0tPgotCi08IUVOVElUWSAlIExpbmtUeXBlcyAiQ0RBVEEiPgotICAgIDwhLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbGluayB0eXBlcyAtLT4KLQotPCFFTlRJVFkgJSBNZWRpYURlc2MgIkNEQVRBIj4KLSAgICA8IS0tIHNpbmdsZSBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSBkZXNjcmlwdG9ycyAtLT4KLQotPCFFTlRJVFkgJSBVUkkgIkNEQVRBIj4KLSAgICA8IS0tIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLCBzZWUgW1JGQzIzOTZdIC0tPgotCi08IUVOVElUWSAlIFVyaUxpc3QgIkNEQVRBIj4KLSAgICA8IS0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVycyAtLT4KLQotPCFFTlRJVFkgJSBEYXRldGltZSAiQ0RBVEEiPgotICAgIDwhLS0gZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gSVNPIGRhdGUgZm9ybWF0IC0tPgotCi08IUVOVElUWSAlIFNjcmlwdCAiQ0RBVEEiPgotICAgIDwhLS0gc2NyaXB0IGV4cHJlc3Npb24gLS0+Ci0KLTwhRU5USVRZICUgU3R5bGVTaGVldCAiQ0RBVEEiPgotICAgIDwhLS0gc3R5bGUgc2hlZXQgZGF0YSAtLT4KLQotPCFFTlRJVFkgJSBUZXh0ICJDREFUQSI+Ci0gICAgPCEtLSB1c2VkIGZvciB0aXRsZXMgZXRjLiAtLT4KLQotPCFFTlRJVFkgJSBGcmFtZVRhcmdldCAiTk1UT0tFTiI+Ci0gICAgPCEtLSByZW5kZXIgaW4gdGhpcyBmcmFtZSAtLT4KLQotPCFFTlRJVFkgJSBMZW5ndGggIkNEQVRBIj4KLSAgICA8IS0tIG5uIGZvciBwaXhlbHMgb3Igbm4lIGZvciBwZXJjZW50YWdlIGxlbmd0aCAtLT4KLQotPCFFTlRJVFkgJSBNdWx0aUxlbmd0aCAiQ0RBVEEiPgotICAgIDwhLS0gcGl4ZWwsIHBlcmNlbnRhZ2UsIG9yIHJlbGF0aXZlIC0tPgotCi08IUVOVElUWSAlIE11bHRpTGVuZ3RocyAiQ0RBVEEiPgotICAgIDwhLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgTXVsdGlMZW5ndGggLS0+Ci0KLTwhRU5USVRZICUgUGl4ZWxzICJDREFUQSI+Ci0gICAgPCEtLSBpbnRlZ2VyIHJlcHJlc2VudGluZyBsZW5ndGggaW4gcGl4ZWxzIC0tPgotCi08IS0tIHRoZXNlIGFyZSB1c2VkIGZvciBpbWFnZSBtYXBzIC0tPgotCi08IUVOVElUWSAlIFNoYXBlICIocmVjdHxjaXJjbGV8cG9seXxkZWZhdWx0KSI+Ci0KLTwhRU5USVRZICUgQ29vcmRzICJDREFUQSI+Ci0gICAgPCEtLSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBsZW5ndGhzIC0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBHZW5lcmljIEF0dHJpYnV0ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGNvcmUgYXR0cmlidXRlcyBjb21tb24gdG8gbW9zdCBlbGVtZW50cwotICBpZCAgICAgICBkb2N1bWVudC13aWRlIHVuaXF1ZSBpZAotICBjbGFzcyAgICBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjbGFzc2VzCi0gIHN0eWxlICAgIGFzc29jaWF0ZWQgc3R5bGUgaW5mbwotICB0aXRsZSAgICBhZHZpc29yeSB0aXRsZS9hbXBsaWZpY2F0aW9uCi0tLT4KLTwhRU5USVRZICUgY29yZWF0dHJzCi0gImlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVECi0gIGNsYXNzICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHN0eWxlICAgICAgICVTdHlsZVNoZWV0OyAgICNJTVBMSUVECi0gIHRpdGxlICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVEIgotICA+Ci0KLTwhLS0gaW50ZXJuYXRpb25hbGl6YXRpb24gYXR0cmlidXRlcwotICBsYW5nICAgICAgICBsYW5ndWFnZSBjb2RlIChiYWNrd2FyZHMgY29tcGF0aWJsZSkKLSAgeG1sOmxhbmcgICAgbGFuZ3VhZ2UgY29kZSAoYXMgcGVyIFhNTCAxLjAgc3BlYykKLSAgZGlyICAgICAgICAgZGlyZWN0aW9uIGZvciB3ZWFrL25ldXRyYWwgdGV4dAotLS0+Ci08IUVOVElUWSAlIGkxOG4KLSAibGFuZyAgICAgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgeG1sOmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgZGlyICAgICAgICAgKGx0cnxydGwpICAgICAgI0lNUExJRUQiCi0gID4KLQotPCEtLSBhdHRyaWJ1dGVzIGZvciBjb21tb24gVUkgZXZlbnRzCi0gIG9uY2xpY2sgICAgIGEgcG9pbnRlciBidXR0b24gd2FzIGNsaWNrZWQKLSAgb25kYmxjbGljayAgYSBwb2ludGVyIGJ1dHRvbiB3YXMgZG91YmxlIGNsaWNrZWQKLSAgb25tb3VzZWRvd24gYSBwb2ludGVyIGJ1dHRvbiB3YXMgcHJlc3NlZCBkb3duCi0gIG9ubW91c2V1cCAgIGEgcG9pbnRlciBidXR0b24gd2FzIHJlbGVhc2VkCi0gIG9ubW91c2Vtb3ZlIGEgcG9pbnRlciB3YXMgbW92ZWQgb250byB0aGUgZWxlbWVudAotICBvbm1vdXNlb3V0ICBhIHBvaW50ZXIgd2FzIG1vdmVkIGF3YXkgZnJvbSB0aGUgZWxlbWVudAotICBvbmtleXByZXNzICBhIGtleSB3YXMgcHJlc3NlZCBhbmQgcmVsZWFzZWQKLSAgb25rZXlkb3duICAgYSBrZXkgd2FzIHByZXNzZWQgZG93bgotICBvbmtleXVwICAgICBhIGtleSB3YXMgcmVsZWFzZWQKLS0tPgotPCFFTlRJVFkgJSBldmVudHMKLSAib25jbGljayAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25kYmxjbGljayAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25tb3VzZWRvd24gJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25tb3VzZXVwICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25tb3VzZW92ZXIgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25tb3VzZW1vdmUgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25tb3VzZW91dCAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25rZXlwcmVzcyAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25rZXlkb3duICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25rZXl1cCAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQiCi0gID4KLQotPCEtLSBhdHRyaWJ1dGVzIGZvciBlbGVtZW50cyB0aGF0IGNhbiBnZXQgdGhlIGZvY3VzCi0gIGFjY2Vzc2tleSAgIGFjY2Vzc2liaWxpdHkga2V5IGNoYXJhY3RlcgotICB0YWJpbmRleCAgICBwb3NpdGlvbiBpbiB0YWJiaW5nIG9yZGVyCi0gIG9uZm9jdXMgICAgIHRoZSBlbGVtZW50IGdvdCB0aGUgZm9jdXMKLSAgb25ibHVyICAgICAgdGhlIGVsZW1lbnQgbG9zdCB0aGUgZm9jdXMKLS0tPgotPCFFTlRJVFkgJSBmb2N1cwotICJhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRCIKLSAgPgotCi08IUVOVElUWSAlIGF0dHJzICIlY29yZWF0dHJzOyAlaTE4bjsgJWV2ZW50czsiPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBUZXh0IEVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIHNwZWNpYWwKLSAgICJiciB8IHNwYW4gfCBiZG8gfCBvYmplY3QgfCBpbWcgfCBtYXAiPgotCi08IUVOVElUWSAlIGZvbnRzdHlsZSAidHQgfCBpIHwgYiB8IGJpZyB8IHNtYWxsIj4KLQotPCFFTlRJVFkgJSBwaHJhc2UgImVtIHwgc3Ryb25nIHwgZGZuIHwgY29kZSB8IHEgfCBzdWIgfCBzdXAgfAotICAgICAgICAgICAgICAgICAgIHNhbXAgfCBrYmQgfCB2YXIgfCBjaXRlIHwgYWJiciB8IGFjcm9ueW0iPgotCi08IUVOVElUWSAlIGlubGluZS5mb3JtcyAiaW5wdXQgfCBzZWxlY3QgfCB0ZXh0YXJlYSB8IGxhYmVsIHwgYnV0dG9uIj4KLQotPCEtLSB0aGVzZSBjYW4gb2NjdXIgYXQgYmxvY2sgb3IgaW5saW5lIGxldmVsIC0tPgotPCFFTlRJVFkgJSBtaXNjICJpbnMgfCBkZWwgfCBzY3JpcHQgfCBub3NjcmlwdCI+Ci0KLTwhRU5USVRZICUgaW5saW5lICJhIHwgJXNwZWNpYWw7IHwgJWZvbnRzdHlsZTsgfCAlcGhyYXNlOyB8ICVpbmxpbmUuZm9ybXM7Ij4KLQotPCEtLSAlSW5saW5lOyBjb3ZlcnMgaW5saW5lIG9yICJ0ZXh0LWxldmVsIiBlbGVtZW50cyAtLT4KLTwhRU5USVRZICUgSW5saW5lICIoI1BDREFUQSB8ICVpbmxpbmU7IHwgJW1pc2M7KSoiPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEJsb2NrIGxldmVsIGVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGhlYWRpbmcgImgxfGgyfGgzfGg0fGg1fGg2Ij4KLTwhRU5USVRZICUgbGlzdHMgInVsIHwgb2wgfCBkbCI+Ci08IUVOVElUWSAlIGJsb2NrdGV4dCAicHJlIHwgaHIgfCBibG9ja3F1b3RlIHwgYWRkcmVzcyI+Ci0KLTwhRU5USVRZICUgYmxvY2sKLSAgICAgInAgfCAlaGVhZGluZzsgfCBkaXYgfCAlbGlzdHM7IHwgJWJsb2NrdGV4dDsgfCBmaWVsZHNldCB8IHRhYmxlIj4KLQotPCFFTlRJVFkgJSBCbG9jayAiKCVibG9jazsgfCBmb3JtIHwgJW1pc2M7KSoiPgotCi08IS0tICVGbG93OyBtaXhlcyBCbG9jayBhbmQgSW5saW5lIGFuZCBpcyB1c2VkIGZvciBsaXN0IGl0ZW1zIGV0Yy4gLS0+Ci08IUVOVElUWSAlIEZsb3cgIigjUENEQVRBIHwgJWJsb2NrOyB8IGZvcm0gfCAlaW5saW5lOyB8ICVtaXNjOykqIj4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBDb250ZW50IG1vZGVscyBmb3IgZXhjbHVzaW9ucyA9PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBhIGVsZW1lbnRzIHVzZSAlSW5saW5lOyBleGNsdWRpbmcgYSAtLT4KLQotPCFFTlRJVFkgJSBhLmNvbnRlbnQKLSAgICIoI1BDREFUQSB8ICVzcGVjaWFsOyB8ICVmb250c3R5bGU7IHwgJXBocmFzZTsgfCAlaW5saW5lLmZvcm1zOyB8ICVtaXNjOykqIj4KLQotPCEtLSBwcmUgdXNlcyAlSW5saW5lIGV4Y2x1ZGluZyBpbWcsIG9iamVjdCwgYmlnLCBzbWFsbCwgc3VwIG9yIHN1cCAtLT4KLQotPCFFTlRJVFkgJSBwcmUuY29udGVudAotICAgIigjUENEQVRBIHwgYSB8IGJyIHwgc3BhbiB8IGJkbyB8IG1hcCB8IHR0IHwgaSB8IGIgfAotICAgICAgJXBocmFzZTsgfCAlaW5saW5lLmZvcm1zOykqIj4KLQotPCEtLSBmb3JtIHVzZXMgJUJsb2NrOyBleGNsdWRpbmcgZm9ybSAtLT4KLQotPCFFTlRJVFkgJSBmb3JtLmNvbnRlbnQgIiglYmxvY2s7IHwgJW1pc2M7KSoiPgotCi08IS0tIGJ1dHRvbiB1c2VzICVGbG93OyBidXQgZXhjbHVkZXMgYSwgZm9ybSBhbmQgZm9ybSBjb250cm9scyAtLT4KLQotPCFFTlRJVFkgJSBidXR0b24uY29udGVudAotICAgIigjUENEQVRBIHwgcCB8ICVoZWFkaW5nOyB8IGRpdiB8ICVsaXN0czsgfCAlYmxvY2t0ZXh0OyB8Ci0gICAgdGFibGUgfCAlc3BlY2lhbDsgfCAlZm9udHN0eWxlOyB8ICVwaHJhc2U7IHwgJW1pc2M7KSoiPgotCi08IS0tPT09PT09PT09PT09PT09PSBEb2N1bWVudCBTdHJ1Y3R1cmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIHRoZSBuYW1lc3BhY2UgVVJJIGRlc2lnbmF0ZXMgdGhlIGRvY3VtZW50IHByb2ZpbGUgLS0+Ci0KLTwhRUxFTUVOVCBodG1sIChoZWFkLCBib2R5KT4KLTwhQVRUTElTVCBodG1sCi0gICVpMThuOwotICB4bWxucyAgICAgICAlVVJJOyAgICAgICAgICAjRklYRUQgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgSGVhZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBoZWFkLm1pc2MgIihzY3JpcHR8c3R5bGV8bWV0YXxsaW5rfG9iamVjdCkqIj4KLQotPCEtLSBjb250ZW50IG1vZGVsIGlzICVoZWFkLm1pc2M7IGNvbWJpbmVkIHdpdGggYSBzaW5nbGUKLSAgICAgdGl0bGUgYW5kIGFuIG9wdGlvbmFsIGJhc2UgZWxlbWVudCBpbiBhbnkgb3JkZXIgLS0+Ci0KLTwhRUxFTUVOVCBoZWFkICglaGVhZC5taXNjOywKLSAgICAgKCh0aXRsZSwgJWhlYWQubWlzYzssIChiYXNlLCAlaGVhZC5taXNjOyk/KSB8Ci0gICAgICAoYmFzZSwgJWhlYWQubWlzYzssICh0aXRsZSwgJWhlYWQubWlzYzspKSkpPgotCi08IUFUVExJU1QgaGVhZAotICAlaTE4bjsKLSAgcHJvZmlsZSAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIFRoZSB0aXRsZSBlbGVtZW50IGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIGZsb3cgb2YgdGV4dC4KLSAgICAgICBJdCBzaG91bGQgYmUgZGlzcGxheWVkLCBmb3IgZXhhbXBsZSBhcyB0aGUgcGFnZSBoZWFkZXIgb3IKLSAgICAgICB3aW5kb3cgdGl0bGUuIEV4YWN0bHkgb25lIHRpdGxlIGlzIHJlcXVpcmVkIHBlciBkb2N1bWVudC4KLSAgICAtLT4KLTwhRUxFTUVOVCB0aXRsZSAoI1BDREFUQSk+Ci08IUFUVExJU1QgdGl0bGUgJWkxOG47PgotCi08IS0tIGRvY3VtZW50IGJhc2UgVVJJIC0tPgotCi08IUVMRU1FTlQgYmFzZSBFTVBUWT4KLTwhQVRUTElTVCBiYXNlCi0gIGhyZWYgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBnZW5lcmljIG1ldGFpbmZvcm1hdGlvbiAtLT4KLTwhRUxFTUVOVCBtZXRhIEVNUFRZPgotPCFBVFRMSVNUIG1ldGEKLSAgJWkxOG47Ci0gIGh0dHAtZXF1aXYgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGNvbnRlbnQgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRAotICBzY2hlbWUgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLSAgUmVsYXRpb25zaGlwIHZhbHVlcyBjYW4gYmUgdXNlZCBpbiBwcmluY2lwbGU6Ci0KLSAgIGEpIGZvciBkb2N1bWVudCBzcGVjaWZpYyB0b29sYmFycy9tZW51cyB3aGVuIHVzZWQKLSAgICAgIHdpdGggdGhlIGxpbmsgZWxlbWVudCBpbiBkb2N1bWVudCBoZWFkIGUuZy4KLSAgICAgICAgc3RhcnQsIGNvbnRlbnRzLCBwcmV2aW91cywgbmV4dCwgaW5kZXgsIGVuZCwgaGVscAotICAgYikgdG8gbGluayB0byBhIHNlcGFyYXRlIHN0eWxlIHNoZWV0IChyZWw9InN0eWxlc2hlZXQiKQotICAgYykgdG8gbWFrZSBhIGxpbmsgdG8gYSBzY3JpcHQgKHJlbD0ic2NyaXB0IikKLSAgIGQpIGJ5IHN0eWxlc2hlZXRzIHRvIGNvbnRyb2wgaG93IGNvbGxlY3Rpb25zIG9mCi0gICAgICBodG1sIG5vZGVzIGFyZSByZW5kZXJlZCBpbnRvIHByaW50ZWQgZG9jdW1lbnRzCi0gICBlKSB0byBtYWtlIGEgbGluayB0byBhIHByaW50YWJsZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgIGUuZy4gYSBQb3N0U2NyaXB0IG9yIFBERiB2ZXJzaW9uIChyZWw9ImFsdGVybmF0ZSIgbWVkaWE9InByaW50IikKLS0tPgotCi08IUVMRU1FTlQgbGluayBFTVBUWT4KLTwhQVRUTElTVCBsaW5rCi0gICVhdHRyczsKLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgcmVsICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQKLSAgcmV2ICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQKLSAgbWVkaWEgICAgICAgJU1lZGlhRGVzYzsgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIHN0eWxlIGluZm8sIHdoaWNoIG1heSBpbmNsdWRlIENEQVRBIHNlY3Rpb25zIC0tPgotPCFFTEVNRU5UIHN0eWxlICgjUENEQVRBKT4KLTwhQVRUTElTVCBzdHlsZQotICAlaTE4bjsKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI1JFUVVJUkVECi0gIG1lZGlhICAgICAgICVNZWRpYURlc2M7ICAgICNJTVBMSUVECi0gIHRpdGxlICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIHhtbDpzcGFjZSAgIChwcmVzZXJ2ZSkgICAgICNGSVhFRCAncHJlc2VydmUnCi0gID4KLQotPCEtLSBzY3JpcHQgc3RhdGVtZW50cywgd2hpY2ggbWF5IGluY2x1ZGUgQ0RBVEEgc2VjdGlvbnMgLS0+Ci08IUVMRU1FTlQgc2NyaXB0ICgjUENEQVRBKT4KLTwhQVRUTElTVCBzY3JpcHQKLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI1JFUVVJUkVECi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGRlZmVyICAgICAgIChkZWZlcikgICAgICAgICNJTVBMSUVECi0gIHhtbDpzcGFjZSAgIChwcmVzZXJ2ZSkgICAgICNGSVhFRCAncHJlc2VydmUnCi0gID4KLQotPCEtLSBhbHRlcm5hdGUgY29udGVudCBjb250YWluZXIgZm9yIG5vbiBzY3JpcHQtYmFzZWQgcmVuZGVyaW5nIC0tPgotCi08IUVMRU1FTlQgbm9zY3JpcHQgJUJsb2NrOz4KLTwhQVRUTElTVCBub3NjcmlwdAotICAlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgQm9keSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGJvZHkgJUJsb2NrOz4KLTwhQVRUTElTVCBib2R5Ci0gICVhdHRyczsKLSAgb25sb2FkICAgICAgICAgICVTY3JpcHQ7ICAgI0lNUExJRUQKLSAgb251bmxvYWQgICAgICAgICVTY3JpcHQ7ICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgZGl2ICVGbG93Oz4gIDwhLS0gZ2VuZXJpYyBsYW5ndWFnZS9zdHlsZSBjb250YWluZXIgLS0+Ci08IUFUVExJU1QgZGl2Ci0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBQYXJhZ3JhcGhzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgcCAlSW5saW5lOz4KLTwhQVRUTElTVCBwCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBIZWFkaW5ncyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIFRoZXJlIGFyZSBzaXggbGV2ZWxzIG9mIGhlYWRpbmdzIGZyb20gaDEgKHRoZSBtb3N0IGltcG9ydGFudCkKLSAgdG8gaDYgKHRoZSBsZWFzdCBpbXBvcnRhbnQpLgotLS0+Ci0KLTwhRUxFTUVOVCBoMSAgJUlubGluZTs+Ci08IUFUVExJU1QgaDEKLSAgICVhdHRyczsKLSAgID4KLQotPCFFTEVNRU5UIGgyICVJbmxpbmU7PgotPCFBVFRMSVNUIGgyCi0gICAlYXR0cnM7Ci0gICA+Ci0KLTwhRUxFTUVOVCBoMyAlSW5saW5lOz4KLTwhQVRUTElTVCBoMwotICAgJWF0dHJzOwotICAgPgotCi08IUVMRU1FTlQgaDQgJUlubGluZTs+Ci08IUFUVExJU1QgaDQKLSAgICVhdHRyczsKLSAgID4KLQotPCFFTEVNRU5UIGg1ICVJbmxpbmU7PgotPCFBVFRMSVNUIGg1Ci0gICAlYXR0cnM7Ci0gICA+Ci0KLTwhRUxFTUVOVCBoNiAlSW5saW5lOz4KLTwhQVRUTElTVCBoNgotICAgJWF0dHJzOwotICAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBMaXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIFVub3JkZXJlZCBsaXN0IC0tPgotCi08IUVMRU1FTlQgdWwgKGxpKSs+Ci08IUFUVExJU1QgdWwKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS0gT3JkZXJlZCAobnVtYmVyZWQpIGxpc3QgLS0+Ci0KLTwhRUxFTUVOVCBvbCAobGkpKz4KLTwhQVRUTElTVCBvbAotICAlYXR0cnM7Ci0gID4KLQotPCEtLSBsaXN0IGl0ZW0gLS0+Ci0KLTwhRUxFTUVOVCBsaSAlRmxvdzs+Ci08IUFUVExJU1QgbGkKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS0gZGVmaW5pdGlvbiBsaXN0cyAtIGR0IGZvciB0ZXJtLCBkZCBmb3IgaXRzIGRlZmluaXRpb24gLS0+Ci0KLTwhRUxFTUVOVCBkbCAoZHR8ZGQpKz4KLTwhQVRUTElTVCBkbAotICAlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIGR0ICVJbmxpbmU7PgotPCFBVFRMSVNUIGR0Ci0gICVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgZGQgJUZsb3c7PgotPCFBVFRMSVNUIGRkCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBBZGRyZXNzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGluZm9ybWF0aW9uIG9uIGF1dGhvciAtLT4KLQotPCFFTEVNRU5UIGFkZHJlc3MgJUlubGluZTs+Ci08IUFUVExJU1QgYWRkcmVzcwotICAlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSG9yaXpvbnRhbCBSdWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGhyIEVNUFRZPgotPCFBVFRMSVNUIGhyCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBQcmVmb3JtYXR0ZWQgVGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGNvbnRlbnQgaXMgJUlubGluZTsgZXhjbHVkaW5nICJpbWd8b2JqZWN0fGJpZ3xzbWFsbHxzdWJ8c3VwIiAtLT4KLQotPCFFTEVNRU5UIHByZSAlcHJlLmNvbnRlbnQ7PgotPCFBVFRMSVNUIHByZQotICAlYXR0cnM7Ci0gIHhtbDpzcGFjZSAocHJlc2VydmUpICNGSVhFRCAncHJlc2VydmUnCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gQmxvY2stbGlrZSBRdW90ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGJsb2NrcXVvdGUgJUJsb2NrOz4KLTwhQVRUTElTVCBibG9ja3F1b3RlCi0gICVhdHRyczsKLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBJbnNlcnRlZC9EZWxldGVkIFRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tCi0gIGlucy9kZWwgYXJlIGFsbG93ZWQgaW4gYmxvY2sgYW5kIGlubGluZSBjb250ZW50LCBidXQgaXRzCi0gIGluYXBwcm9wcmlhdGUgdG8gaW5jbHVkZSBibG9jayBjb250ZW50IHdpdGhpbiBhbiBpbnMgZWxlbWVudAotICBvY2N1cnJpbmcgaW4gaW5saW5lIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBpbnMgJUZsb3c7PgotPCFBVFRMSVNUIGlucwotICAlYXR0cnM7Ci0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGRhdGV0aW1lICAgICVEYXRldGltZTsgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIGRlbCAlRmxvdzs+Ci08IUFUVExJU1QgZGVsCi0gICVhdHRyczsKLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGF0ZXRpbWUgICAgJURhdGV0aW1lOyAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09IFRoZSBBbmNob3IgRWxlbWVudCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGNvbnRlbnQgaXMgJUlubGluZTsgZXhjZXB0IHRoYXQgYW5jaG9ycyBzaG91bGRuJ3QgYmUgbmVzdGVkIC0tPgotCi08IUVMRU1FTlQgYSAlYS5jb250ZW50Oz4KLTwhQVRUTElTVCBhCi0gICVhdHRyczsKLSAgY2hhcnNldCAgICAgJUNoYXJzZXQ7ICAgICAgI0lNUExJRUQKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaHJlZmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgcmVsICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQKLSAgcmV2ICAgICAgICAgJUxpbmtUeXBlczsgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgc2hhcGUgICAgICAgJVNoYXBlOyAgICAgICAgInJlY3QiCi0gIGNvb3JkcyAgICAgICVDb29yZHM7ICAgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09PSBJbmxpbmUgRWxlbWVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIHNwYW4gJUlubGluZTs+IDwhLS0gZ2VuZXJpYyBsYW5ndWFnZS9zdHlsZSBjb250YWluZXIgLS0+Ci08IUFUVExJU1Qgc3BhbgotICAlYXR0cnM7Ci0gID4KLQotPCFFTEVNRU5UIGJkbyAlSW5saW5lOz4gIDwhLS0gSTE4TiBCaURpIG92ZXItcmlkZSAtLT4KLTwhQVRUTElTVCBiZG8KLSAgJWNvcmVhdHRyczsKLSAgJWV2ZW50czsKLSAgbGFuZyAgICAgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgeG1sOmxhbmcgICAgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQKLSAgZGlyICAgICAgICAgKGx0cnxydGwpICAgICAgI1JFUVVJUkVECi0gID4KLQotPCFFTEVNRU5UIGJyIEVNUFRZPiAgIDwhLS0gZm9yY2VkIGxpbmUgYnJlYWsgLS0+Ci08IUFUVExJU1QgYnIKLSAgJWNvcmVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgZW0gJUlubGluZTs+ICAgPCEtLSBlbXBoYXNpcyAtLT4KLTwhQVRUTElTVCBlbSAlYXR0cnM7PgotCi08IUVMRU1FTlQgc3Ryb25nICVJbmxpbmU7PiAgIDwhLS0gc3Ryb25nIGVtcGhhc2lzIC0tPgotPCFBVFRMSVNUIHN0cm9uZyAlYXR0cnM7PgotCi08IUVMRU1FTlQgZGZuICVJbmxpbmU7PiAgIDwhLS0gZGVmaW5pdGlvbmFsIC0tPgotPCFBVFRMSVNUIGRmbiAlYXR0cnM7PgotCi08IUVMRU1FTlQgY29kZSAlSW5saW5lOz4gICA8IS0tIHByb2dyYW0gY29kZSAtLT4KLTwhQVRUTElTVCBjb2RlICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBzYW1wICVJbmxpbmU7PiAgIDwhLS0gc2FtcGxlIC0tPgotPCFBVFRMSVNUIHNhbXAgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGtiZCAlSW5saW5lOz4gIDwhLS0gc29tZXRoaW5nIHVzZXIgd291bGQgdHlwZSAtLT4KLTwhQVRUTElTVCBrYmQgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHZhciAlSW5saW5lOz4gICA8IS0tIHZhcmlhYmxlIC0tPgotPCFBVFRMSVNUIHZhciAlYXR0cnM7PgotCi08IUVMRU1FTlQgY2l0ZSAlSW5saW5lOz4gICA8IS0tIGNpdGF0aW9uIC0tPgotPCFBVFRMSVNUIGNpdGUgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGFiYnIgJUlubGluZTs+ICAgPCEtLSBhYmJyZXZpYXRpb24gLS0+Ci08IUFUVExJU1QgYWJiciAlYXR0cnM7PgotCi08IUVMRU1FTlQgYWNyb255bSAlSW5saW5lOz4gICA8IS0tIGFjcm9ueW0gLS0+Ci08IUFUVExJU1QgYWNyb255bSAlYXR0cnM7PgotCi08IUVMRU1FTlQgcSAlSW5saW5lOz4gICA8IS0tIGlubGluZWQgcXVvdGUgLS0+Ci08IUFUVExJU1QgcQotICAlYXR0cnM7Ci0gIGNpdGUgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIHN1YiAlSW5saW5lOz4gPCEtLSBzdWJzY3JpcHQgLS0+Ci08IUFUVExJU1Qgc3ViICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBzdXAgJUlubGluZTs+IDwhLS0gc3VwZXJzY3JpcHQgLS0+Ci08IUFUVExJU1Qgc3VwICVhdHRyczs+Ci0KLTwhRUxFTUVOVCB0dCAlSW5saW5lOz4gICA8IS0tIGZpeGVkIHBpdGNoIGZvbnQgLS0+Ci08IUFUVExJU1QgdHQgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGkgJUlubGluZTs+ICAgPCEtLSBpdGFsaWMgZm9udCAtLT4KLTwhQVRUTElTVCBpICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBiICVJbmxpbmU7PiAgIDwhLS0gYm9sZCBmb250IC0tPgotPCFBVFRMSVNUIGIgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGJpZyAlSW5saW5lOz4gICA8IS0tIGJpZ2dlciBmb250IC0tPgotPCFBVFRMSVNUIGJpZyAlYXR0cnM7PgotCi08IUVMRU1FTlQgc21hbGwgJUlubGluZTs+ICAgPCEtLSBzbWFsbGVyIGZvbnQgLS0+Ci08IUFUVExJU1Qgc21hbGwgJWF0dHJzOz4KLQotPCEtLT09PT09PT09PT09PT09PT09PT09IE9iamVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLQotICBvYmplY3QgaXMgdXNlZCB0byBlbWJlZCBvYmplY3RzIGFzIHBhcnQgb2YgSFRNTCBwYWdlcy4KLSAgcGFyYW0gZWxlbWVudHMgc2hvdWxkIHByZWNlZGUgb3RoZXIgY29udGVudC4gUGFyYW1ldGVycwotICBjYW4gYWxzbyBiZSBleHByZXNzZWQgYXMgYXR0cmlidXRlL3ZhbHVlIHBhaXJzIG9uIHRoZQotICBvYmplY3QgZWxlbWVudCBpdHNlbGYgd2hlbiBicmV2aXR5IGlzIGRlc2lyZWQuCi0tLT4KLQotPCFFTEVNRU5UIG9iamVjdCAoI1BDREFUQSB8IHBhcmFtIHwgJWJsb2NrOyB8IGZvcm0gfCAlaW5saW5lOyB8ICVtaXNjOykqPgotPCFBVFRMSVNUIG9iamVjdAotICAlYXR0cnM7Ci0gIGRlY2xhcmUgICAgIChkZWNsYXJlKSAgICAgICNJTVBMSUVECi0gIGNsYXNzaWQgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGNvZGViYXNlICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGRhdGEgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVECi0gIGNvZGV0eXBlICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVECi0gIGFyY2hpdmUgICAgICVVcmlMaXN0OyAgICAgICNJTVBMSUVECi0gIHN0YW5kYnkgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLQotICBwYXJhbSBpcyB1c2VkIHRvIHN1cHBseSBhIG5hbWVkIHByb3BlcnR5IHZhbHVlLgotICBJbiBYTUwgaXQgd291bGQgc2VlbSBuYXR1cmFsIHRvIGZvbGxvdyBSREYgYW5kIHN1cHBvcnQgYW4KLSAgYWJicmV2aWF0ZWQgc3ludGF4IHdoZXJlIHRoZSBwYXJhbSBlbGVtZW50cyBhcmUgcmVwbGFjZWQKLSAgYnkgYXR0cmlidXRlIHZhbHVlIHBhaXJzIG9uIHRoZSBvYmplY3Qgc3RhcnQgdGFnLgotLS0+Ci08IUVMRU1FTlQgcGFyYW0gRU1QVFk+Ci08IUFUVExJU1QgcGFyYW0KLSAgaWQgICAgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWV0eXBlICAgKGRhdGF8cmVmfG9iamVjdCkgImRhdGEiCi0gIHR5cGUgICAgICAgICVDb250ZW50VHlwZTsgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gSW1hZ2VzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLQotICAgVG8gYXZvaWQgYWNjZXNzaWJpbGl0eSBwcm9ibGVtcyBmb3IgcGVvcGxlIHdobyBhcmVuJ3QKLSAgIGFibGUgdG8gc2VlIHRoZSBpbWFnZSwgeW91IHNob3VsZCBwcm92aWRlIGEgdGV4dAotICAgZGVzY3JpcHRpb24gdXNpbmcgdGhlIGFsdCBhbmQgbG9uZ2Rlc2MgYXR0cmlidXRlcy4KLSAgIEluIGFkZGl0aW9uLCBhdm9pZCB0aGUgdXNlIG9mIHNlcnZlci1zaWRlIGltYWdlIG1hcHMuCi0gICBOb3RlIHRoYXQgaW4gdGhpcyBEVEQgdGhlcmUgaXMgbm8gbmFtZSBhdHRyaWJ1dGUuIFRoYXQKLSAgIGlzIG9ubHkgYXZhaWxhYmxlIGluIHRoZSB0cmFuc2l0aW9uYWwgYW5kIGZyYW1lc2V0IERURC4KLS0tPgotCi08IUVMRU1FTlQgaW1nIEVNUFRZPgotPCFBVFRMSVNUIGltZwotICAlYXR0cnM7Ci0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNSRVFVSVJFRAotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQKLSAgbG9uZ2Rlc2MgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgdXNlbWFwICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgaXNtYXAgICAgICAgKGlzbWFwKSAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIHVzZW1hcCBwb2ludHMgdG8gYSBtYXAgZWxlbWVudCB3aGljaCBtYXkgYmUgaW4gdGhpcyBkb2N1bWVudAotICBvciBhbiBleHRlcm5hbCBkb2N1bWVudCwgYWx0aG91Z2ggdGhlIGxhdHRlciBpcyBub3Qgd2lkZWx5IHN1cHBvcnRlZCAtLT4KLQotPCEtLT09PT09PT09PT09PT09PT09PSBDbGllbnQtc2lkZSBpbWFnZSBtYXBzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBUaGVzZSBjYW4gYmUgcGxhY2VkIGluIHRoZSBzYW1lIGRvY3VtZW50IG9yIGdyb3VwZWQgaW4gYQotICAgICBzZXBhcmF0ZSBkb2N1bWVudCBhbHRob3VnaCB0aGlzIGlzbid0IHlldCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IUVMRU1FTlQgbWFwICgoJWJsb2NrOyB8IGZvcm0gfCAlbWlzYzspKyB8IGFyZWErKT4KLTwhQVRUTElTVCBtYXAKLSAgJWkxOG47Ci0gICVldmVudHM7Ci0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNSRVFVSVJFRAotICBjbGFzcyAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBzdHlsZSAgICAgICAlU3R5bGVTaGVldDsgICAjSU1QTElFRAotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBhcmVhIEVNUFRZPgotPCFBVFRMSVNUIGFyZWEKLSAgJWF0dHJzOwotICBzaGFwZSAgICAgICAlU2hhcGU7ICAgICAgICAicmVjdCIKLSAgY29vcmRzICAgICAgJUNvb3JkczsgICAgICAgI0lNUExJRUQKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgbm9ocmVmICAgICAgKG5vaHJlZikgICAgICAgI0lNUExJRUQKLSAgYWx0ICAgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRm9ybXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhRUxFTUVOVCBmb3JtICVmb3JtLmNvbnRlbnQ7PiAgIDwhLS0gZm9ybXMgc2hvdWxkbid0IGJlIG5lc3RlZCAtLT4KLQotPCFBVFRMSVNUIGZvcm0KLSAgJWF0dHJzOwotICBhY3Rpb24gICAgICAlVVJJOyAgICAgICAgICAjUkVRVUlSRUQKLSAgbWV0aG9kICAgICAgKGdldHxwb3N0KSAgICAgImdldCIKLSAgZW5jdHlwZSAgICAgJUNvbnRlbnRUeXBlOyAgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIKLSAgb25zdWJtaXQgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25yZXNldCAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgYWNjZXB0ICAgICAgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQKLSAgYWNjZXB0LWNoYXJzZXQgJUNoYXJzZXRzOyAgI0lNUExJRUQKLSAgPgotCi08IS0tCi0gIEVhY2ggbGFiZWwgbXVzdCBub3QgY29udGFpbiBtb3JlIHRoYW4gT05FIGZpZWxkCi0gIExhYmVsIGVsZW1lbnRzIHNob3VsZG4ndCBiZSBuZXN0ZWQuCi0tLT4KLTwhRUxFTUVOVCBsYWJlbCAlSW5saW5lOz4KLTwhQVRUTElTVCBsYWJlbAotICAlYXR0cnM7Ci0gIGZvciAgICAgICAgIElEUkVGICAgICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTlRJVFkgJSBJbnB1dFR5cGUKLSAgIih0ZXh0IHwgcGFzc3dvcmQgfCBjaGVja2JveCB8Ci0gICAgcmFkaW8gfCBzdWJtaXQgfCByZXNldCB8Ci0gICAgZmlsZSB8IGhpZGRlbiB8IGltYWdlIHwgYnV0dG9uKSIKLSAgID4KLQotPCEtLSB0aGUgbmFtZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgZm9yIGFsbCBidXQgc3VibWl0ICYgcmVzZXQgLS0+Ci0KLTwhRUxFTUVOVCBpbnB1dCBFTVBUWT4gICAgIDwhLS0gZm9ybSBjb250cm9sIC0tPgotPCFBVFRMSVNUIGlucHV0Ci0gICVhdHRyczsKLSAgdHlwZSAgICAgICAgJUlucHV0VHlwZTsgICAgInRleHQiCi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGNoZWNrZWQgICAgIChjaGVja2VkKSAgICAgICNJTVBMSUVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIHJlYWRvbmx5ICAgIChyZWFkb25seSkgICAgICNJTVBMSUVECi0gIHNpemUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIG1heGxlbmd0aCAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGFsdCAgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHVzZW1hcCAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uc2VsZWN0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIGFjY2VwdCAgICAgICVDb250ZW50VHlwZXM7ICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIHNlbGVjdCAob3B0Z3JvdXB8b3B0aW9uKSs+ICA8IS0tIG9wdGlvbiBzZWxlY3RvciAtLT4KLTwhQVRUTElTVCBzZWxlY3QKLSAgJWF0dHJzOwotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBzaXplICAgICAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBtdWx0aXBsZSAgICAobXVsdGlwbGUpICAgICAjSU1QTElFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBvcHRncm91cCAob3B0aW9uKSs+ICAgPCEtLSBvcHRpb24gZ3JvdXAgLS0+Ci08IUFUVExJU1Qgb3B0Z3JvdXAKLSAgJWF0dHJzOwotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICBsYWJlbCAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQKLSAgPgotCi08IUVMRU1FTlQgb3B0aW9uICgjUENEQVRBKT4gICAgIDwhLS0gc2VsZWN0YWJsZSBjaG9pY2UgLS0+Ci08IUFUVExJU1Qgb3B0aW9uCi0gICVhdHRyczsKLSAgc2VsZWN0ZWQgICAgKHNlbGVjdGVkKSAgICAgI0lNUExJRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgbGFiZWwgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgdmFsdWUgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgdGV4dGFyZWEgKCNQQ0RBVEEpPiAgICAgPCEtLSBtdWx0aS1saW5lIHRleHQgZmllbGQgLS0+Ci08IUFUVExJU1QgdGV4dGFyZWEKLSAgJWF0dHJzOwotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICByb3dzICAgICAgICAlTnVtYmVyOyAgICAgICAjUkVRVUlSRUQKLSAgY29scyAgICAgICAgJU51bWJlcjsgICAgICAgI1JFUVVJUkVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIHJlYWRvbmx5ICAgIChyZWFkb25seSkgICAgICNJTVBMSUVECi0gIHRhYmluZGV4ICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gIGFjY2Vzc2tleSAgICVDaGFyYWN0ZXI7ICAgICNJTVBMSUVECi0gIG9uZm9jdXMgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uYmx1ciAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uc2VsZWN0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uY2hhbmdlICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLQotICBUaGUgZmllbGRzZXQgZWxlbWVudCBpcyB1c2VkIHRvIGdyb3VwIGZvcm0gZmllbGRzLgotICBPbmx5IG9uZSBsZWdlbmQgZWxlbWVudCBzaG91bGQgb2NjdXIgaW4gdGhlIGNvbnRlbnQKLSAgYW5kIGlmIHByZXNlbnQgc2hvdWxkIG9ubHkgYmUgcHJlY2VkZWQgYnkgd2hpdGVzcGFjZS4KLS0tPgotPCFFTEVNRU5UIGZpZWxkc2V0ICgjUENEQVRBIHwgbGVnZW5kIHwgJWJsb2NrOyB8IGZvcm0gfCAlaW5saW5lOyB8ICVtaXNjOykqPgotPCFBVFRMSVNUIGZpZWxkc2V0Ci0gICVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgbGVnZW5kICVJbmxpbmU7PiAgICAgPCEtLSBmaWVsZHNldCBsYWJlbCAtLT4KLTwhQVRUTElTVCBsZWdlbmQKLSAgJWF0dHJzOwotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLSBDb250ZW50IGlzICVGbG93OyBleGNsdWRpbmcgYSwgZm9ybSBhbmQgZm9ybSBjb250cm9scwotLS0+IAotPCFFTEVNRU5UIGJ1dHRvbiAlYnV0dG9uLmNvbnRlbnQ7PiAgPCEtLSBwdXNoIGJ1dHRvbiAtLT4KLTwhQVRUTElTVCBidXR0b24KLSAgJWF0dHJzOwotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB0eXBlICAgICAgICAoYnV0dG9ufHN1Ym1pdHxyZXNldCkgInN1Ym1pdCIKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09PT0gVGFibGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIERlcml2ZWQgZnJvbSBJRVRGIEhUTUwgdGFibGUgc3RhbmRhcmQsIHNlZSBbUkZDMTk0Ml0gLS0+Ci0KLTwhLS0KLSBUaGUgYm9yZGVyIGF0dHJpYnV0ZSBzZXRzIHRoZSB0aGlja25lc3Mgb2YgdGhlIGZyYW1lIGFyb3VuZCB0aGUKLSB0YWJsZS4gVGhlIGRlZmF1bHQgdW5pdHMgYXJlIHNjcmVlbiBwaXhlbHMuCi0KLSBUaGUgZnJhbWUgYXR0cmlidXRlIHNwZWNpZmllcyB3aGljaCBwYXJ0cyBvZiB0aGUgZnJhbWUgYXJvdW5kCi0gdGhlIHRhYmxlIHNob3VsZCBiZSByZW5kZXJlZC4gVGhlIHZhbHVlcyBhcmUgbm90IHRoZSBzYW1lIGFzCi0gQ0FMUyB0byBhdm9pZCBhIG5hbWUgY2xhc2ggd2l0aCB0aGUgdmFsaWduIGF0dHJpYnV0ZS4KLS0tPgotPCFFTlRJVFkgJSBURnJhbWUgIih2b2lkfGFib3ZlfGJlbG93fGhzaWRlc3xsaHN8cmhzfHZzaWRlc3xib3h8Ym9yZGVyKSI+Ci0KLTwhLS0KLSBUaGUgcnVsZXMgYXR0cmlidXRlIGRlZmluZXMgd2hpY2ggcnVsZXMgdG8gZHJhdyBiZXR3ZWVuIGNlbGxzOgotCi0gSWYgcnVsZXMgaXMgYWJzZW50IHRoZW4gYXNzdW1lOgotICAgICAibm9uZSIgaWYgYm9yZGVyIGlzIGFic2VudCBvciBib3JkZXI9IjAiIG90aGVyd2lzZSAiYWxsIgotLS0+Ci0KLTwhRU5USVRZICUgVFJ1bGVzICIobm9uZSB8IGdyb3VwcyB8IHJvd3MgfCBjb2xzIHwgYWxsKSI+Ci0gIAotPCEtLSBob3Jpem9udGFsIHBsYWNlbWVudCBvZiB0YWJsZSByZWxhdGl2ZSB0byBkb2N1bWVudCAtLT4KLTwhRU5USVRZICUgVEFsaWduICIobGVmdHxjZW50ZXJ8cmlnaHQpIj4KLQotPCEtLSBob3Jpem9udGFsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzCi0KLSAgY2hhciAgICAgICAgYWxpZ25tZW50IGNoYXIsIGUuZy4gY2hhcj0nOicKLSAgY2hhcm9mZiAgICAgb2Zmc2V0IGZvciBhbGlnbm1lbnQgY2hhcgotLS0+Ci08IUVOVElUWSAlIGNlbGxoYWxpZ24KLSAgImFsaWduICAgICAgKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnl8Y2hhcikgI0lNUExJRUQKLSAgIGNoYXIgICAgICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgIGNoYXJvZmYgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQiCi0gID4KLQotPCEtLSB2ZXJ0aWNhbCBhbGlnbm1lbnQgYXR0cmlidXRlcyBmb3IgY2VsbCBjb250ZW50cyAtLT4KLTwhRU5USVRZICUgY2VsbHZhbGlnbgotICAidmFsaWduICAgICAodG9wfG1pZGRsZXxib3R0b218YmFzZWxpbmUpICNJTVBMSUVEIgotICA+Ci0KLTwhRUxFTUVOVCB0YWJsZQotICAgICAoY2FwdGlvbj8sIChjb2wqfGNvbGdyb3VwKiksIHRoZWFkPywgdGZvb3Q/LCAodGJvZHkrfHRyKykpPgotPCFFTEVNRU5UIGNhcHRpb24gICVJbmxpbmU7PgotPCFFTEVNRU5UIHRoZWFkICAgICh0cikrPgotPCFFTEVNRU5UIHRmb290ICAgICh0cikrPgotPCFFTEVNRU5UIHRib2R5ICAgICh0cikrPgotPCFFTEVNRU5UIGNvbGdyb3VwIChjb2wpKj4KLTwhRUxFTUVOVCBjb2wgICAgICBFTVBUWT4KLTwhRUxFTUVOVCB0ciAgICAgICAodGh8dGQpKz4KLTwhRUxFTUVOVCB0aCAgICAgICAlRmxvdzs+Ci08IUVMRU1FTlQgdGQgICAgICAgJUZsb3c7PgotCi08IUFUVExJU1QgdGFibGUKLSAgJWF0dHJzOwotICBzdW1tYXJ5ICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICBib3JkZXIgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICBmcmFtZSAgICAgICAlVEZyYW1lOyAgICAgICAjSU1QTElFRAotICBydWxlcyAgICAgICAlVFJ1bGVzOyAgICAgICAjSU1QTElFRAotICBjZWxsc3BhY2luZyAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICBjZWxscGFkZGluZyAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRU5USVRZICUgQ0FsaWduICIodG9wfGJvdHRvbXxsZWZ0fHJpZ2h0KSI+Ci0KLTwhQVRUTElTVCBjYXB0aW9uCi0gICVhdHRyczsKLSAgPgotCi08IS0tCi1jb2xncm91cCBncm91cHMgYSBzZXQgb2YgY29sIGVsZW1lbnRzLiBJdCBhbGxvd3MgeW91IHRvIGdyb3VwCi1zZXZlcmFsIHNlbWFudGljYWxseSByZWxhdGVkIGNvbHVtbnMgdG9nZXRoZXIuCi0tLT4KLTwhQVRUTElTVCBjb2xncm91cAotICAlYXR0cnM7Ci0gIHNwYW4gICAgICAgICVOdW1iZXI7ICAgICAgICIxIgotICB3aWR0aCAgICAgICAlTXVsdGlMZW5ndGg7ICAjSU1QTElFRAotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCEtLQotIGNvbCBlbGVtZW50cyBkZWZpbmUgdGhlIGFsaWdubWVudCBwcm9wZXJ0aWVzIGZvciBjZWxscyBpbgotIG9uZSBvciBtb3JlIGNvbHVtbnMuCi0KLSBUaGUgd2lkdGggYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIGNvbHVtbnMsIGUuZy4KLQotICAgICB3aWR0aD02NCAgICAgICAgd2lkdGggaW4gc2NyZWVuIHBpeGVscwotICAgICB3aWR0aD0wLjUqICAgICAgcmVsYXRpdmUgd2lkdGggb2YgMC41Ci0KLSBUaGUgc3BhbiBhdHRyaWJ1dGUgY2F1c2VzIHRoZSBhdHRyaWJ1dGVzIG9mIG9uZQotIGNvbCBlbGVtZW50IHRvIGFwcGx5IHRvIG1vcmUgdGhhbiBvbmUgY29sdW1uLgotLS0+Ci08IUFUVExJU1QgY29sCi0gICVhdHRyczsKLSAgc3BhbiAgICAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gIHdpZHRoICAgICAgICVNdWx0aUxlbmd0aDsgICNJTVBMSUVECi0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IS0tCi0gICAgVXNlIHRoZWFkIHRvIGR1cGxpY2F0ZSBoZWFkZXJzIHdoZW4gYnJlYWtpbmcgdGFibGUKLSAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGhlYWRlcnMgd2hlbgotICAgIHRib2R5IHNlY3Rpb25zIGFyZSByZW5kZXJlZCBpbiBzY3JvbGxpbmcgcGFuZWwuCi0KLSAgICBVc2UgdGZvb3QgdG8gZHVwbGljYXRlIGZvb3RlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMsIG9yIGZvciBzdGF0aWMgZm9vdGVycyB3aGVuCi0gICAgdGJvZHkgc2VjdGlvbnMgYXJlIHJlbmRlcmVkIGluIHNjcm9sbGluZyBwYW5lbC4KLQotICAgIFVzZSBtdWx0aXBsZSB0Ym9keSBzZWN0aW9ucyB3aGVuIHJ1bGVzIGFyZSBuZWVkZWQKLSAgICBiZXR3ZWVuIGdyb3VwcyBvZiB0YWJsZSByb3dzLgotLS0+Ci08IUFUVExJU1QgdGhlYWQKLSAgJWF0dHJzOwotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCFBVFRMSVNUIHRmb290Ci0gICVhdHRyczsKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhQVRUTElTVCB0Ym9keQotICAlYXR0cnM7Ci0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IUFUVExJU1QgdHIKLSAgJWF0dHJzOwotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotCi08IS0tIFNjb3BlIGlzIHNpbXBsZXIgdGhhbiBoZWFkZXJzIGF0dHJpYnV0ZSBmb3IgY29tbW9uIHRhYmxlcyAtLT4KLTwhRU5USVRZICUgU2NvcGUgIihyb3d8Y29sfHJvd2dyb3VwfGNvbGdyb3VwKSI+Ci0KLTwhLS0gdGggaXMgZm9yIGhlYWRlcnMsIHRkIGZvciBkYXRhIGFuZCBmb3IgY2VsbHMgYWN0aW5nIGFzIGJvdGggLS0+Ci0KLTwhQVRUTElTVCB0aAotICAlYXR0cnM7Ci0gIGFiYnIgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIGF4aXMgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGhlYWRlcnMgICAgIElEUkVGUyAgICAgICAgICNJTVBMSUVECi0gIHNjb3BlICAgICAgICVTY29wZTsgICAgICAgICNJTVBMSUVECi0gIHJvd3NwYW4gICAgICVOdW1iZXI7ICAgICAgICIxIgotICBjb2xzcGFuICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhQVRUTElTVCB0ZAotICAlYXR0cnM7Ci0gIGFiYnIgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIGF4aXMgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGhlYWRlcnMgICAgIElEUkVGUyAgICAgICAgICNJTVBMSUVECi0gIHNjb3BlICAgICAgICVTY29wZTsgICAgICAgICNJTVBMSUVECi0gIHJvd3NwYW4gICAgICVOdW1iZXI7ICAgICAgICIxIgotICBjb2xzcGFuICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZjOWVlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL2R0ZHMveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTk2ICswLDAgQEAKLTwhLS0KLSAgIEV4dGVuc2libGUgSFRNTCB2ZXJzaW9uIDEuMCBUcmFuc2l0aW9uYWwgRFRECi0KLSAgIFRoaXMgaXMgdGhlIHNhbWUgYXMgSFRNTCA0LjAgVHJhbnNpdGlvbmFsIGV4Y2VwdCBmb3IKLSAgIGNoYW5nZXMgZHVlIHRvIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIFhNTCBhbmQgU0dNTC4KLQotICAgTmFtZXNwYWNlID0gaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbAotCi0gICBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiwgc2VlOiBodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEKLQotICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgVzNDIChNSVQsIElOUklBLCBLZWlvKSwKLSAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotCi0gICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiCi0KLSAgICRSZXZpc2lvbjogMS4xICQKLSAgICREYXRlOiAyMDA3LzA1LzE1IDAyOjQyOjIyICQKLQotLS0+Ci0KLTwhLS09PT09PT09PT09PT09PT09IENoYXJhY3RlciBtbmVtb25pYyBlbnRpdGllcyA9PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgSFRNTGxhdDEgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBMYXRpbiAxIGZvciBYSFRNTC8vRU4iCi0gICAieGh0bWwtbGF0MS5lbnQiPgotJUhUTUxsYXQxOwotCi08IUVOVElUWSAlIEhUTUxzeW1ib2wgUFVCTElDCi0gICAiLS8vVzNDLy9FTlRJVElFUyBTeW1ib2xzIGZvciBYSFRNTC8vRU4iCi0gICAieGh0bWwtc3ltYm9sLmVudCI+Ci0lSFRNTHN5bWJvbDsKLQotPCFFTlRJVFkgJSBIVE1Mc3BlY2lhbCBQVUJMSUMKLSAgICItLy9XM0MvL0VOVElUSUVTIFNwZWNpYWwgZm9yIFhIVE1MLy9FTiIKLSAgICJ4aHRtbC1zcGVjaWFsLmVudCI+Ci0lSFRNTHNwZWNpYWw7Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gSW1wb3J0ZWQgTmFtZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGUgIkNEQVRBIj4KLSAgICA8IS0tIG1lZGlhIHR5cGUsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci0KLTwhRU5USVRZICUgQ29udGVudFR5cGVzICJDREFUQSI+Ci0gICAgPCEtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSB0eXBlcywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLQotPCFFTlRJVFkgJSBDaGFyc2V0ICJDREFUQSI+Ci0gICAgPCEtLSBhIGNoYXJhY3RlciBlbmNvZGluZywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLQotPCFFTlRJVFkgJSBDaGFyc2V0cyAiQ0RBVEEiPgotICAgIDwhLS0gYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBjaGFyYWN0ZXIgZW5jb2RpbmdzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotCi08IUVOVElUWSAlIExhbmd1YWdlQ29kZSAiTk1UT0tFTiI+Ci0gICAgPCEtLSBhIGxhbmd1YWdlIGNvZGUsIGFzIHBlciBbUkZDMTc2Nl0gLS0+Ci0KLTwhRU5USVRZICUgQ2hhcmFjdGVyICJDREFUQSI+Ci0gICAgPCEtLSBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSBbSVNPMTA2NDZdIC0tPgotCi08IUVOVElUWSAlIE51bWJlciAiQ0RBVEEiPgotICAgIDwhLS0gb25lIG9yIG1vcmUgZGlnaXRzIC0tPgotCi08IUVOVElUWSAlIExpbmtUeXBlcyAiQ0RBVEEiPgotICAgIDwhLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbGluayB0eXBlcyAtLT4KLQotPCFFTlRJVFkgJSBNZWRpYURlc2MgIkNEQVRBIj4KLSAgICA8IS0tIHNpbmdsZSBvciBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSBkZXNjcmlwdG9ycyAtLT4KLQotPCFFTlRJVFkgJSBVUkkgIkNEQVRBIj4KLSAgICA8IS0tIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLCBzZWUgW1JGQzIzOTZdIC0tPgotCi08IUVOVElUWSAlIFVyaUxpc3QgIkNEQVRBIj4KLSAgICA8IS0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVycyAtLT4KLQotPCFFTlRJVFkgJSBEYXRldGltZSAiQ0RBVEEiPgotICAgIDwhLS0gZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gSVNPIGRhdGUgZm9ybWF0IC0tPgotCi08IUVOVElUWSAlIFNjcmlwdCAiQ0RBVEEiPgotICAgIDwhLS0gc2NyaXB0IGV4cHJlc3Npb24gLS0+Ci0KLTwhRU5USVRZICUgU3R5bGVTaGVldCAiQ0RBVEEiPgotICAgIDwhLS0gc3R5bGUgc2hlZXQgZGF0YSAtLT4KLQotPCFFTlRJVFkgJSBUZXh0ICJDREFUQSI+Ci0gICAgPCEtLSB1c2VkIGZvciB0aXRsZXMgZXRjLiAtLT4KLQotPCFFTlRJVFkgJSBGcmFtZVRhcmdldCAiTk1UT0tFTiI+Ci0gICAgPCEtLSByZW5kZXIgaW4gdGhpcyBmcmFtZSAtLT4KLQotPCFFTlRJVFkgJSBMZW5ndGggIkNEQVRBIj4KLSAgICA8IS0tIG5uIGZvciBwaXhlbHMgb3Igbm4lIGZvciBwZXJjZW50YWdlIGxlbmd0aCAtLT4KLQotPCFFTlRJVFkgJSBNdWx0aUxlbmd0aCAiQ0RBVEEiPgotICAgIDwhLS0gcGl4ZWwsIHBlcmNlbnRhZ2UsIG9yIHJlbGF0aXZlIC0tPgotCi08IUVOVElUWSAlIE11bHRpTGVuZ3RocyAiQ0RBVEEiPgotICAgIDwhLS0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgTXVsdGlMZW5ndGggLS0+Ci0KLTwhRU5USVRZICUgUGl4ZWxzICJDREFUQSI+Ci0gICAgPCEtLSBpbnRlZ2VyIHJlcHJlc2VudGluZyBsZW5ndGggaW4gcGl4ZWxzIC0tPgotCi08IS0tIHRoZXNlIGFyZSB1c2VkIGZvciBpbWFnZSBtYXBzIC0tPgotCi08IUVOVElUWSAlIFNoYXBlICIocmVjdHxjaXJjbGV8cG9seXxkZWZhdWx0KSI+Ci0KLTwhRU5USVRZICUgQ29vcmRzICJDREFUQSI+Ci0gICAgPCEtLSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBsZW5ndGhzIC0tPgotCi08IS0tIHVzZWQgZm9yIG9iamVjdCwgYXBwbGV0LCBpbWcsIGlucHV0IGFuZCBpZnJhbWUgLS0+Ci08IUVOVElUWSAlIEltZ0FsaWduICIodG9wfG1pZGRsZXxib3R0b218bGVmdHxyaWdodCkiPgotCi08IS0tIGEgY29sb3IgdXNpbmcgc1JHQjogI1JSR0dCQiBhcyBIZXggdmFsdWVzIC0tPgotPCFFTlRJVFkgJSBDb2xvciAiQ0RBVEEiPgotCi08IS0tIFRoZXJlIGFyZSBhbHNvIDE2IHdpZGVseSBrbm93biBjb2xvciBuYW1lcyB3aXRoIHRoZWlyIHNSR0IgdmFsdWVzOgotCi0gICAgQmxhY2sgID0gIzAwMDAwMCAgICBHcmVlbiAgPSAjMDA4MDAwCi0gICAgU2lsdmVyID0gI0MwQzBDMCAgICBMaW1lICAgPSAjMDBGRjAwCi0gICAgR3JheSAgID0gIzgwODA4MCAgICBPbGl2ZSAgPSAjODA4MDAwCi0gICAgV2hpdGUgID0gI0ZGRkZGRiAgICBZZWxsb3cgPSAjRkZGRjAwCi0gICAgTWFyb29uID0gIzgwMDAwMCAgICBOYXZ5ICAgPSAjMDAwMDgwCi0gICAgUmVkICAgID0gI0ZGMDAwMCAgICBCbHVlICAgPSAjMDAwMEZGCi0gICAgUHVycGxlID0gIzgwMDA4MCAgICBUZWFsICAgPSAjMDA4MDgwCi0gICAgRnVjaHNpYT0gI0ZGMDBGRiAgICBBcXVhICAgPSAjMDBGRkZGCi0tLT4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gR2VuZXJpYyBBdHRyaWJ1dGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBjb3JlIGF0dHJpYnV0ZXMgY29tbW9uIHRvIG1vc3QgZWxlbWVudHMKLSAgaWQgICAgICAgZG9jdW1lbnQtd2lkZSB1bmlxdWUgaWQKLSAgY2xhc3MgICAgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2xhc3NlcwotICBzdHlsZSAgICBhc3NvY2lhdGVkIHN0eWxlIGluZm8KLSAgdGl0bGUgICAgYWR2aXNvcnkgdGl0bGUvYW1wbGlmaWNhdGlvbgotLS0+Ci08IUVOVElUWSAlIGNvcmVhdHRycwotICJpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRAotICBjbGFzcyAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBzdHlsZSAgICAgICAlU3R5bGVTaGVldDsgICAjSU1QTElFRAotICB0aXRsZSAgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRCIKLSAgPgotCi08IS0tIGludGVybmF0aW9uYWxpemF0aW9uIGF0dHJpYnV0ZXMKLSAgbGFuZyAgICAgICAgbGFuZ3VhZ2UgY29kZSAoYmFja3dhcmRzIGNvbXBhdGlibGUpCi0gIHhtbDpsYW5nICAgIGxhbmd1YWdlIGNvZGUgKGFzIHBlciBYTUwgMS4wIHNwZWMpCi0gIGRpciAgICAgICAgIGRpcmVjdGlvbiBmb3Igd2Vhay9uZXV0cmFsIHRleHQKLS0tPgotPCFFTlRJVFkgJSBpMThuCi0gImxhbmcgICAgICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVECi0gIHhtbDpsYW5nICAgICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVECi0gIGRpciAgICAgICAgIChsdHJ8cnRsKSAgICAgICNJTVBMSUVEIgotICA+Ci0KLTwhLS0gYXR0cmlidXRlcyBmb3IgY29tbW9uIFVJIGV2ZW50cwotICBvbmNsaWNrICAgICBhIHBvaW50ZXIgYnV0dG9uIHdhcyBjbGlja2VkCi0gIG9uZGJsY2xpY2sgIGEgcG9pbnRlciBidXR0b24gd2FzIGRvdWJsZSBjbGlja2VkCi0gIG9ubW91c2Vkb3duIGEgcG9pbnRlciBidXR0b24gd2FzIHByZXNzZWQgZG93bgotICBvbm1vdXNldXAgICBhIHBvaW50ZXIgYnV0dG9uIHdhcyByZWxlYXNlZAotICBvbm1vdXNlbW92ZSBhIHBvaW50ZXIgd2FzIG1vdmVkIG9udG8gdGhlIGVsZW1lbnQKLSAgb25tb3VzZW91dCAgYSBwb2ludGVyIHdhcyBtb3ZlZCBhd2F5IGZyb20gdGhlIGVsZW1lbnQKLSAgb25rZXlwcmVzcyAgYSBrZXkgd2FzIHByZXNzZWQgYW5kIHJlbGVhc2VkCi0gIG9ua2V5ZG93biAgIGEga2V5IHdhcyBwcmVzc2VkIGRvd24KLSAgb25rZXl1cCAgICAgYSBrZXkgd2FzIHJlbGVhc2VkCi0tLT4KLTwhRU5USVRZICUgZXZlbnRzCi0gIm9uY2xpY2sgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9uZGJsY2xpY2sgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ubW91c2Vkb3duICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ubW91c2V1cCAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ubW91c2VvdmVyICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ubW91c2Vtb3ZlICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ubW91c2VvdXQgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ua2V5cHJlc3MgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ua2V5ZG93biAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ua2V5dXAgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVEIgotICA+Ci0KLTwhLS0gYXR0cmlidXRlcyBmb3IgZWxlbWVudHMgdGhhdCBjYW4gZ2V0IHRoZSBmb2N1cwotICBhY2Nlc3NrZXkgICBhY2Nlc3NpYmlsaXR5IGtleSBjaGFyYWN0ZXIKLSAgdGFiaW5kZXggICAgcG9zaXRpb24gaW4gdGFiYmluZyBvcmRlcgotICBvbmZvY3VzICAgICB0aGUgZWxlbWVudCBnb3QgdGhlIGZvY3VzCi0gIG9uYmx1ciAgICAgIHRoZSBlbGVtZW50IGxvc3QgdGhlIGZvY3VzCi0tLT4KLTwhRU5USVRZICUgZm9jdXMKLSAiYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQiCi0gID4KLQotPCFFTlRJVFkgJSBhdHRycyAiJWNvcmVhdHRyczsgJWkxOG47ICVldmVudHM7Ij4KLQotPCEtLSB0ZXh0IGFsaWdubWVudCBmb3IgcCwgZGl2LCBoMS1oNi4gVGhlIGRlZmF1bHQgaXMKLSAgICAgYWxpZ249ImxlZnQiIGZvciBsdHIgaGVhZGluZ3MsICJyaWdodCIgZm9yIHJ0bCAtLT4KLQotPCFFTlRJVFkgJSBUZXh0QWxpZ24gImFsaWduIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQiPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBUZXh0IEVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIHNwZWNpYWwKLSAgICJiciB8IHNwYW4gfCBiZG8gfCBvYmplY3QgfCBhcHBsZXQgfCBpbWcgfCBtYXAgfCBpZnJhbWUiPgotCi08IUVOVElUWSAlIGZvbnRzdHlsZSAidHQgfCBpIHwgYiB8IGJpZyB8IHNtYWxsIHwgdQotICAgICAgICAgICAgICAgICAgICAgIHwgcyB8IHN0cmlrZSB8Zm9udCB8IGJhc2Vmb250Ij4KLQotPCFFTlRJVFkgJSBwaHJhc2UgImVtIHwgc3Ryb25nIHwgZGZuIHwgY29kZSB8IHEgfCBzdWIgfCBzdXAgfAotICAgICAgICAgICAgICAgICAgIHNhbXAgfCBrYmQgfCB2YXIgfCBjaXRlIHwgYWJiciB8IGFjcm9ueW0iPgotCi08IUVOVElUWSAlIGlubGluZS5mb3JtcyAiaW5wdXQgfCBzZWxlY3QgfCB0ZXh0YXJlYSB8IGxhYmVsIHwgYnV0dG9uIj4KLQotPCEtLSB0aGVzZSBjYW4gb2NjdXIgYXQgYmxvY2sgb3IgaW5saW5lIGxldmVsIC0tPgotPCFFTlRJVFkgJSBtaXNjICJpbnMgfCBkZWwgfCBzY3JpcHQgfCBub3NjcmlwdCI+Ci0KLTwhRU5USVRZICUgaW5saW5lICJhIHwgJXNwZWNpYWw7IHwgJWZvbnRzdHlsZTsgfCAlcGhyYXNlOyB8ICVpbmxpbmUuZm9ybXM7Ij4KLQotPCEtLSAlSW5saW5lOyBjb3ZlcnMgaW5saW5lIG9yICJ0ZXh0LWxldmVsIiBlbGVtZW50cyAtLT4KLTwhRU5USVRZICUgSW5saW5lICIoI1BDREFUQSB8ICVpbmxpbmU7IHwgJW1pc2M7KSoiPgotCi08IS0tPT09PT09PT09PT09PT09PT09IEJsb2NrIGxldmVsIGVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVOVElUWSAlIGhlYWRpbmcgImgxfGgyfGgzfGg0fGg1fGg2Ij4KLTwhRU5USVRZICUgbGlzdHMgInVsIHwgb2wgfCBkbCB8IG1lbnUgfCBkaXIiPgotPCFFTlRJVFkgJSBibG9ja3RleHQgInByZSB8IGhyIHwgYmxvY2txdW90ZSB8IGFkZHJlc3MgfCBjZW50ZXIgfCBub2ZyYW1lcyI+Ci0KLTwhRU5USVRZICUgYmxvY2sKLSAgICAicCB8ICVoZWFkaW5nOyB8IGRpdiB8ICVsaXN0czsgfCAlYmxvY2t0ZXh0OyB8IGlzaW5kZXggfGZpZWxkc2V0IHwgdGFibGUiPgotCi08IUVOVElUWSAlIEJsb2NrICIoJWJsb2NrOyB8IGZvcm0gfCAlbWlzYzspKiI+Ci0KLTwhLS0gJUZsb3c7IG1peGVzIEJsb2NrIGFuZCBJbmxpbmUgYW5kIGlzIHVzZWQgZm9yIGxpc3QgaXRlbXMgZXRjLiAtLT4KLTwhRU5USVRZICUgRmxvdyAiKCNQQ0RBVEEgfCAlYmxvY2s7IHwgZm9ybSB8ICVpbmxpbmU7IHwgJW1pc2M7KSoiPgotCi08IS0tPT09PT09PT09PT09PT09PT09IENvbnRlbnQgbW9kZWxzIGZvciBleGNsdXNpb25zID09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIGEgZWxlbWVudHMgdXNlICVJbmxpbmU7IGV4Y2x1ZGluZyBhIC0tPgotCi08IUVOVElUWSAlIGEuY29udGVudAotICAgIigjUENEQVRBIHwgJXNwZWNpYWw7IHwgJWZvbnRzdHlsZTsgfCAlcGhyYXNlOyB8ICVpbmxpbmUuZm9ybXM7IHwgJW1pc2M7KSoiPgotCi08IS0tIHByZSB1c2VzICVJbmxpbmUgZXhjbHVkaW5nIGltZywgb2JqZWN0LCBhcHBsZXQsIGJpZywgc21hbGwsCi0gICAgIHN1Yiwgc3VwLCBmb250LCBvciBiYXNlZm9udCAtLT4KLQotPCFFTlRJVFkgJSBwcmUuY29udGVudAotICAgIigjUENEQVRBIHwgYSB8IGJyIHwgc3BhbiB8IGJkbyB8IG1hcCB8IHR0IHwgaSB8IGIgfCB1IHwgcyB8Ci0gICAgICAlcGhyYXNlOyB8ICVpbmxpbmUuZm9ybXM7KSoiPgotCi08IS0tIGZvcm0gdXNlcyAlRmxvdzsgZXhjbHVkaW5nIGZvcm0gLS0+Ci0KLTwhRU5USVRZICUgZm9ybS5jb250ZW50ICIoI1BDREFUQSB8ICVibG9jazsgfCAlaW5saW5lOyB8ICVtaXNjOykqIj4KLQotPCEtLSBidXR0b24gdXNlcyAlRmxvdzsgYnV0IGV4Y2x1ZGVzIGEsIGZvcm0sIGZvcm0gY29udHJvbHMsIGlmcmFtZSAtLT4KLQotPCFFTlRJVFkgJSBidXR0b24uY29udGVudAotICAgIigjUENEQVRBIHwgcCB8ICVoZWFkaW5nOyB8IGRpdiB8ICVsaXN0czsgfCAlYmxvY2t0ZXh0OyB8Ci0gICAgICB0YWJsZSB8IGJyIHwgc3BhbiB8IGJkbyB8IG9iamVjdCB8IGFwcGxldCB8IGltZyB8IG1hcCB8Ci0gICAgICAlZm9udHN0eWxlOyB8ICVwaHJhc2U7IHwgJW1pc2M7KSoiPgotCi08IS0tPT09PT09PT09PT09PT09PSBEb2N1bWVudCBTdHJ1Y3R1cmUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIHRoZSBuYW1lc3BhY2UgVVJJIGRlc2lnbmF0ZXMgdGhlIGRvY3VtZW50IHByb2ZpbGUgLS0+Ci0KLTwhRUxFTUVOVCBodG1sIChoZWFkLCBib2R5KT4KLTwhQVRUTElTVCBodG1sCi0gICVpMThuOwotICB4bWxucyAgICAgICAlVVJJOyAgICAgICAgICAjRklYRUQgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgSGVhZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTlRJVFkgJSBoZWFkLm1pc2MgIihzY3JpcHR8c3R5bGV8bWV0YXxsaW5rfG9iamVjdHxpc2luZGV4KSoiPgotCi08IS0tIGNvbnRlbnQgbW9kZWwgaXMgJWhlYWQubWlzYzsgY29tYmluZWQgd2l0aCBhIHNpbmdsZQotICAgICB0aXRsZSBhbmQgYW4gb3B0aW9uYWwgYmFzZSBlbGVtZW50IGluIGFueSBvcmRlciAtLT4KLQotPCFFTEVNRU5UIGhlYWQgKCVoZWFkLm1pc2M7LAotICAgICAoKHRpdGxlLCAlaGVhZC5taXNjOywgKGJhc2UsICVoZWFkLm1pc2M7KT8pIHwKLSAgICAgIChiYXNlLCAlaGVhZC5taXNjOywgKHRpdGxlLCAlaGVhZC5taXNjOykpKSk+Ci0KLTwhQVRUTElTVCBoZWFkCi0gICVpMThuOwotICBwcm9maWxlICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gVGhlIHRpdGxlIGVsZW1lbnQgaXMgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgZmxvdyBvZiB0ZXh0LgotICAgICAgIEl0IHNob3VsZCBiZSBkaXNwbGF5ZWQsIGZvciBleGFtcGxlIGFzIHRoZSBwYWdlIGhlYWRlciBvcgotICAgICAgIHdpbmRvdyB0aXRsZS4gRXhhY3RseSBvbmUgdGl0bGUgaXMgcmVxdWlyZWQgcGVyIGRvY3VtZW50LgotICAgIC0tPgotPCFFTEVNRU5UIHRpdGxlICgjUENEQVRBKT4KLTwhQVRUTElTVCB0aXRsZSAlaTE4bjs+Ci0KLTwhLS0gZG9jdW1lbnQgYmFzZSBVUkkgLS0+Ci0KLTwhRUxFTUVOVCBiYXNlIEVNUFRZPgotPCFBVFRMSVNUIGJhc2UKLSAgaHJlZiAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQKLSAgPgotCi08IS0tIGdlbmVyaWMgbWV0YWluZm9ybWF0aW9uIC0tPgotPCFFTEVNRU5UIG1ldGEgRU1QVFk+Ci08IUFUVExJU1QgbWV0YQotICAlaTE4bjsKLSAgaHR0cC1lcXVpdiAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgY29udGVudCAgICAgQ0RBVEEgICAgICAgICAgI1JFUVVJUkVECi0gIHNjaGVtZSAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLQotICBSZWxhdGlvbnNoaXAgdmFsdWVzIGNhbiBiZSB1c2VkIGluIHByaW5jaXBsZToKLQotICAgYSkgZm9yIGRvY3VtZW50IHNwZWNpZmljIHRvb2xiYXJzL21lbnVzIHdoZW4gdXNlZAotICAgICAgd2l0aCB0aGUgbGluayBlbGVtZW50IGluIGRvY3VtZW50IGhlYWQgZS5nLgotICAgICAgICBzdGFydCwgY29udGVudHMsIHByZXZpb3VzLCBuZXh0LCBpbmRleCwgZW5kLCBoZWxwCi0gICBiKSB0byBsaW5rIHRvIGEgc2VwYXJhdGUgc3R5bGUgc2hlZXQgKHJlbD0ic3R5bGVzaGVldCIpCi0gICBjKSB0byBtYWtlIGEgbGluayB0byBhIHNjcmlwdCAocmVsPSJzY3JpcHQiKQotICAgZCkgYnkgc3R5bGVzaGVldHMgdG8gY29udHJvbCBob3cgY29sbGVjdGlvbnMgb2YKLSAgICAgIGh0bWwgbm9kZXMgYXJlIHJlbmRlcmVkIGludG8gcHJpbnRlZCBkb2N1bWVudHMKLSAgIGUpIHRvIG1ha2UgYSBsaW5rIHRvIGEgcHJpbnRhYmxlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudAotICAgICAgZS5nLiBhIFBvc3RTY3JpcHQgb3IgUERGIHZlcnNpb24gKHJlbD0iYWx0ZXJuYXRlIiBtZWRpYT0icHJpbnQiKQotLS0+Ci0KLTwhRUxFTUVOVCBsaW5rIEVNUFRZPgotPCFBVFRMSVNUIGxpbmsKLSAgJWF0dHJzOwotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRAotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBocmVmbGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICByZWwgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICByZXYgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICBtZWRpYSAgICAgICAlTWVkaWFEZXNjOyAgICAjSU1QTElFRAotICB0YXJnZXQgICAgICAlRnJhbWVUYXJnZXQ7ICAjSU1QTElFRAotICA+Ci0KLTwhLS0gc3R5bGUgaW5mbywgd2hpY2ggbWF5IGluY2x1ZGUgQ0RBVEEgc2VjdGlvbnMgLS0+Ci08IUVMRU1FTlQgc3R5bGUgKCNQQ0RBVEEpPgotPCFBVFRMSVNUIHN0eWxlCi0gICVpMThuOwotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjUkVRVUlSRUQKLSAgbWVkaWEgICAgICAgJU1lZGlhRGVzYzsgICAgI0lNUExJRUQKLSAgdGl0bGUgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgeG1sOnNwYWNlICAgKHByZXNlcnZlKSAgICAgI0ZJWEVEICdwcmVzZXJ2ZScKLSAgPgotCi08IS0tIHNjcmlwdCBzdGF0ZW1lbnRzLCB3aGljaCBtYXkgaW5jbHVkZSBDREFUQSBzZWN0aW9ucyAtLT4KLTwhRUxFTUVOVCBzY3JpcHQgKCNQQ0RBVEEpPgotPCFBVFRMSVNUIHNjcmlwdAotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRAotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjUkVRVUlSRUQKLSAgbGFuZ3VhZ2UgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGVmZXIgICAgICAgKGRlZmVyKSAgICAgICAgI0lNUExJRUQKLSAgeG1sOnNwYWNlICAgKHByZXNlcnZlKSAgICAgI0ZJWEVEICdwcmVzZXJ2ZScKLSAgPgotCi08IS0tIGFsdGVybmF0ZSBjb250ZW50IGNvbnRhaW5lciBmb3Igbm9uIHNjcmlwdC1iYXNlZCByZW5kZXJpbmcgLS0+Ci0KLTwhRUxFTUVOVCBub3NjcmlwdCAlRmxvdzs+Ci08IUFUVExJU1Qgbm9zY3JpcHQKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PSBGcmFtZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gaW5saW5lIHN1YndpbmRvdyAtLT4KLQotPCFFTEVNRU5UIGlmcmFtZSAlRmxvdzs+Ci08IUFUVExJU1QgaWZyYW1lCi0gICVjb3JlYXR0cnM7Ci0gIGxvbmdkZXNjICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gIHNyYyAgICAgICAgICVVUkk7ICAgICAgICAgICNJTVBMSUVECi0gIGZyYW1lYm9yZGVyICgxfDApICAgICAgICAgICIxIgotICBtYXJnaW53aWR0aCAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICBtYXJnaW5oZWlnaHQgJVBpeGVsczsgICAgICAjSU1QTElFRAotICBzY3JvbGxpbmcgICAoeWVzfG5vfGF1dG8pICAiYXV0byIKLSAgYWxpZ24gICAgICAgJUltZ0FsaWduOyAgICAgI0lNUExJRUQKLSAgaGVpZ2h0ICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIGFsdGVybmF0ZSBjb250ZW50IGNvbnRhaW5lciBmb3Igbm9uIGZyYW1lLWJhc2VkIHJlbmRlcmluZyAtLT4KLQotPCFFTEVNRU5UIG5vZnJhbWVzICVGbG93Oz4KLTwhQVRUTElTVCBub2ZyYW1lcwotICAlYXR0cnM7Ci0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gRG9jdW1lbnQgQm9keSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGJvZHkgJUZsb3c7PgotPCFBVFRMSVNUIGJvZHkKLSAgJWF0dHJzOwotICBvbmxvYWQgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbnVubG9hZCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBiYWNrZ3JvdW5kICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICB0ZXh0ICAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICBsaW5rICAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICB2bGluayAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICBhbGluayAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBkaXYgJUZsb3c7PiAgPCEtLSBnZW5lcmljIGxhbmd1YWdlL3N0eWxlIGNvbnRhaW5lciAtLT4KLTwhQVRUTElTVCBkaXYKLSAgJWF0dHJzOwotICAlVGV4dEFsaWduOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFBhcmFncmFwaHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhRUxFTUVOVCBwICVJbmxpbmU7PgotPCFBVFRMSVNUIHAKLSAgJWF0dHJzOwotICAlVGV4dEFsaWduOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEhlYWRpbmdzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgVGhlcmUgYXJlIHNpeCBsZXZlbHMgb2YgaGVhZGluZ3MgZnJvbSBoMSAodGhlIG1vc3QgaW1wb3J0YW50KQotICB0byBoNiAodGhlIGxlYXN0IGltcG9ydGFudCkuCi0tLT4KLQotPCFFTEVNRU5UIGgxICAlSW5saW5lOz4KLTwhQVRUTElTVCBoMQotICAlYXR0cnM7Ci0gICVUZXh0QWxpZ247Ci0gID4KLQotPCFFTEVNRU5UIGgyICVJbmxpbmU7PgotPCFBVFRMSVNUIGgyCi0gICVhdHRyczsKLSAgJVRleHRBbGlnbjsKLSAgPgotCi08IUVMRU1FTlQgaDMgJUlubGluZTs+Ci08IUFUVExJU1QgaDMKLSAgJWF0dHJzOwotICAlVGV4dEFsaWduOwotICA+Ci0KLTwhRUxFTUVOVCBoNCAlSW5saW5lOz4KLTwhQVRUTElTVCBoNAotICAlYXR0cnM7Ci0gICVUZXh0QWxpZ247Ci0gID4KLQotPCFFTEVNRU5UIGg1ICVJbmxpbmU7PgotPCFBVFRMSVNUIGg1Ci0gICVhdHRyczsKLSAgJVRleHRBbGlnbjsKLSAgPgotCi08IUVMRU1FTlQgaDYgJUlubGluZTs+Ci08IUFUVExJU1QgaDYKLSAgJWF0dHJzOwotICAlVGV4dEFsaWduOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IExpc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gVW5vcmRlcmVkIGxpc3QgYnVsbGV0IHN0eWxlcyAtLT4KLQotPCFFTlRJVFkgJSBVTFN0eWxlICIoZGlzY3xzcXVhcmV8Y2lyY2xlKSI+Ci0KLTwhLS0gVW5vcmRlcmVkIGxpc3QgLS0+Ci0KLTwhRUxFTUVOVCB1bCAobGkpKz4KLTwhQVRUTElTVCB1bAotICAlYXR0cnM7Ci0gIHR5cGUgICAgICAgICVVTFN0eWxlOyAgICAgI0lNUExJRUQKLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gT3JkZXJlZCBsaXN0IG51bWJlcmluZyBzdHlsZQotCi0gICAgMSAgIGFyYWJpYyBudW1iZXJzICAgICAgMSwgMiwgMywgLi4uCi0gICAgYSAgIGxvd2VyIGFscGhhICAgICAgICAgYSwgYiwgYywgLi4uCi0gICAgQSAgIHVwcGVyIGFscGhhICAgICAgICAgQSwgQiwgQywgLi4uCi0gICAgaSAgIGxvd2VyIHJvbWFuICAgICAgICAgaSwgaWksIGlpaSwgLi4uCi0gICAgSSAgIHVwcGVyIHJvbWFuICAgICAgICAgSSwgSUksIElJSSwgLi4uCi0KLSAgICBUaGUgc3R5bGUgaXMgYXBwbGllZCB0byB0aGUgc2VxdWVuY2UgbnVtYmVyIHdoaWNoIGJ5IGRlZmF1bHQKLSAgICBpcyByZXNldCB0byAxIGZvciB0aGUgZmlyc3QgbGlzdCBpdGVtIGluIGFuIG9yZGVyZWQgbGlzdC4KLS0tPgotPCFFTlRJVFkgJSBPTFN0eWxlICJDREFUQSI+Ci0KLTwhLS0gT3JkZXJlZCAobnVtYmVyZWQpIGxpc3QgLS0+Ci0KLTwhRUxFTUVOVCBvbCAobGkpKz4KLTwhQVRUTElTVCBvbAotICAlYXR0cnM7Ci0gIHR5cGUgICAgICAgICVPTFN0eWxlOyAgICAgICNJTVBMSUVECi0gIGNvbXBhY3QgICAgIChjb21wYWN0KSAgICAgICNJTVBMSUVECi0gIHN0YXJ0ICAgICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBzaW5nbGUgY29sdW1uIGxpc3QgKERFUFJFQ0FURUQpIC0tPiAKLTwhRUxFTUVOVCBtZW51IChsaSkrPgotPCFBVFRMSVNUIG1lbnUKLSAgJWF0dHJzOwotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBtdWx0aXBsZSBjb2x1bW4gbGlzdCAoREVQUkVDQVRFRCkgLS0+IAotPCFFTEVNRU5UIGRpciAobGkpKz4KLTwhQVRUTElTVCBkaXIKLSAgJWF0dHJzOwotICBjb21wYWN0ICAgICAoY29tcGFjdCkgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBMSVN0eWxlIGlzIGNvbnN0cmFpbmVkIHRvOiAiKCVVTFN0eWxlO3wlT0xTdHlsZTspIiAtLT4KLTwhRU5USVRZICUgTElTdHlsZSAiQ0RBVEEiPgotCi08IS0tIGxpc3QgaXRlbSAtLT4KLQotPCFFTEVNRU5UIGxpICVGbG93Oz4KLTwhQVRUTElTVCBsaQotICAlYXR0cnM7Ci0gIHR5cGUgICAgICAgICVMSVN0eWxlOyAgICAgICNJTVBMSUVECi0gIHZhbHVlICAgICAgICVOdW1iZXI7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLSBkZWZpbml0aW9uIGxpc3RzIC0gZHQgZm9yIHRlcm0sIGRkIGZvciBpdHMgZGVmaW5pdGlvbiAtLT4KLQotPCFFTEVNRU5UIGRsIChkdHxkZCkrPgotPCFBVFRMSVNUIGRsCi0gICVhdHRyczsKLSAgY29tcGFjdCAgICAgKGNvbXBhY3QpICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgZHQgJUlubGluZTs+Ci08IUFUVExJU1QgZHQKLSAgJWF0dHJzOwotICA+Ci0KLTwhRUxFTUVOVCBkZCAlRmxvdzs+Ci08IUFUVExJU1QgZGQKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEFkZHJlc3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gaW5mb3JtYXRpb24gb24gYXV0aG9yIC0tPgotCi08IUVMRU1FTlQgYWRkcmVzcyAlSW5saW5lOz4KLTwhQVRUTElTVCBhZGRyZXNzCi0gICVhdHRyczsKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBIb3Jpem9udGFsIFJ1bGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgaHIgRU1QVFk+Ci08IUFUVExJU1QgaHIKLSAgJWF0dHJzOwotICBhbGlnbiAgICAgICAobGVmdHxjZW50ZXJ8cmlnaHQpICNJTVBMSUVECi0gIG5vc2hhZGUgICAgIChub3NoYWRlKSAgICAgICNJTVBMSUVECi0gIHNpemUgICAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gUHJlZm9ybWF0dGVkIFRleHQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCEtLSBjb250ZW50IGlzICVJbmxpbmU7IGV4Y2x1ZGluZyAKLSAgICAgICAgImltZ3xvYmplY3R8YXBwbGV0fGJpZ3xzbWFsbHxzdWJ8c3VwfGZvbnR8YmFzZWZvbnQiIC0tPgotCi08IUVMRU1FTlQgcHJlICVwcmUuY29udGVudDs+Ci08IUFUVExJU1QgcHJlCi0gICVhdHRyczsKLSAgd2lkdGggICAgICAgJU51bWJlcjsgICAgICAjSU1QTElFRAotICB4bWw6c3BhY2UgICAocHJlc2VydmUpICAgICNGSVhFRCAncHJlc2VydmUnCi0gID4KLQotPCEtLT09PT09PT09PT09PT09PT09PT0gQmxvY2stbGlrZSBRdW90ZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotPCFFTEVNRU5UIGJsb2NrcXVvdGUgJUZsb3c7PgotPCFBVFRMSVNUIGJsb2NrcXVvdGUKLSAgJWF0dHJzOwotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IFRleHQgYWxpZ25tZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gY2VudGVyIGNvbnRlbnQgLS0+Ci08IUVMRU1FTlQgY2VudGVyICVGbG93Oz4KLTwhQVRUTElTVCBjZW50ZXIKLSAgJWF0dHJzOwotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEluc2VydGVkL0RlbGV0ZWQgVGV4dCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgaW5zL2RlbCBhcmUgYWxsb3dlZCBpbiBibG9jayBhbmQgaW5saW5lIGNvbnRlbnQsIGJ1dCBpdHMKLSAgaW5hcHByb3ByaWF0ZSB0byBpbmNsdWRlIGJsb2NrIGNvbnRlbnQgd2l0aGluIGFuIGlucyBlbGVtZW50Ci0gIG9jY3VycmluZyBpbiBpbmxpbmUgY29udGVudC4KLS0tPgotPCFFTEVNRU5UIGlucyAlRmxvdzs+Ci08IUFUVExJU1QgaW5zCi0gICVhdHRyczsKLSAgY2l0ZSAgICAgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgZGF0ZXRpbWUgICAgJURhdGV0aW1lOyAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgZGVsICVGbG93Oz4KLTwhQVRUTElTVCBkZWwKLSAgJWF0dHJzOwotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBkYXRldGltZSAgICAlRGF0ZXRpbWU7ICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT0gVGhlIEFuY2hvciBFbGVtZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gY29udGVudCBpcyAlSW5saW5lOyBleGNlcHQgdGhhdCBhbmNob3JzIHNob3VsZG4ndCBiZSBuZXN0ZWQgLS0+Ci0KLTwhRUxFTUVOVCBhICVhLmNvbnRlbnQ7PgotPCFBVFRMSVNUIGEKLSAgJWF0dHJzOwotICBjaGFyc2V0ICAgICAlQ2hhcnNldDsgICAgICAjSU1QTElFRAotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBocmVmbGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICByZWwgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICByZXYgICAgICAgICAlTGlua1R5cGVzOyAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBzaGFwZSAgICAgICAlU2hhcGU7ICAgICAgICAicmVjdCIKLSAgY29vcmRzICAgICAgJUNvb3JkczsgICAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PT09IElubGluZSBFbGVtZW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgc3BhbiAlSW5saW5lOz4gPCEtLSBnZW5lcmljIGxhbmd1YWdlL3N0eWxlIGNvbnRhaW5lciAtLT4KLTwhQVRUTElTVCBzcGFuCi0gICVhdHRyczsKLSAgPgotCi08IUVMRU1FTlQgYmRvICVJbmxpbmU7PiAgPCEtLSBJMThOIEJpRGkgb3Zlci1yaWRlIC0tPgotPCFBVFRMSVNUIGJkbwotICAlY29yZWF0dHJzOwotICAlZXZlbnRzOwotICBsYW5nICAgICAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICB4bWw6bGFuZyAgICAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRAotICBkaXIgICAgICAgICAobHRyfHJ0bCkgICAgICAjUkVRVUlSRUQKLSAgPgotCi08IUVMRU1FTlQgYnIgRU1QVFk+ICAgPCEtLSBmb3JjZWQgbGluZSBicmVhayAtLT4KLTwhQVRUTElTVCBicgotICAlY29yZWF0dHJzOwotICBjbGVhciAgICAgICAobGVmdHxhbGx8cmlnaHR8bm9uZSkgIm5vbmUiCi0gID4KLQotPCFFTEVNRU5UIGVtICVJbmxpbmU7PiAgIDwhLS0gZW1waGFzaXMgLS0+Ci08IUFUVExJU1QgZW0gJWF0dHJzOz4KLQotPCFFTEVNRU5UIHN0cm9uZyAlSW5saW5lOz4gICA8IS0tIHN0cm9uZyBlbXBoYXNpcyAtLT4KLTwhQVRUTElTVCBzdHJvbmcgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGRmbiAlSW5saW5lOz4gICA8IS0tIGRlZmluaXRpb25hbCAtLT4KLTwhQVRUTElTVCBkZm4gJWF0dHJzOz4KLQotPCFFTEVNRU5UIGNvZGUgJUlubGluZTs+ICAgPCEtLSBwcm9ncmFtIGNvZGUgLS0+Ci08IUFUVExJU1QgY29kZSAlYXR0cnM7PgotCi08IUVMRU1FTlQgc2FtcCAlSW5saW5lOz4gICA8IS0tIHNhbXBsZSAtLT4KLTwhQVRUTElTVCBzYW1wICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBrYmQgJUlubGluZTs+ICA8IS0tIHNvbWV0aGluZyB1c2VyIHdvdWxkIHR5cGUgLS0+Ci08IUFUVExJU1Qga2JkICVhdHRyczs+Ci0KLTwhRUxFTUVOVCB2YXIgJUlubGluZTs+ICAgPCEtLSB2YXJpYWJsZSAtLT4KLTwhQVRUTElTVCB2YXIgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGNpdGUgJUlubGluZTs+ICAgPCEtLSBjaXRhdGlvbiAtLT4KLTwhQVRUTElTVCBjaXRlICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBhYmJyICVJbmxpbmU7PiAgIDwhLS0gYWJicmV2aWF0aW9uIC0tPgotPCFBVFRMSVNUIGFiYnIgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGFjcm9ueW0gJUlubGluZTs+ICAgPCEtLSBhY3JvbnltIC0tPgotPCFBVFRMSVNUIGFjcm9ueW0gJWF0dHJzOz4KLQotPCFFTEVNRU5UIHEgJUlubGluZTs+ICAgPCEtLSBpbmxpbmVkIHF1b3RlIC0tPgotPCFBVFRMSVNUIHEKLSAgJWF0dHJzOwotICBjaXRlICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBzdWIgJUlubGluZTs+IDwhLS0gc3Vic2NyaXB0IC0tPgotPCFBVFRMSVNUIHN1YiAlYXR0cnM7PgotCi08IUVMRU1FTlQgc3VwICVJbmxpbmU7PiA8IS0tIHN1cGVyc2NyaXB0IC0tPgotPCFBVFRMSVNUIHN1cCAlYXR0cnM7PgotCi08IUVMRU1FTlQgdHQgJUlubGluZTs+ICAgPCEtLSBmaXhlZCBwaXRjaCBmb250IC0tPgotPCFBVFRMSVNUIHR0ICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBpICVJbmxpbmU7PiAgIDwhLS0gaXRhbGljIGZvbnQgLS0+Ci08IUFUVExJU1QgaSAlYXR0cnM7PgotCi08IUVMRU1FTlQgYiAlSW5saW5lOz4gICA8IS0tIGJvbGQgZm9udCAtLT4KLTwhQVRUTElTVCBiICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBiaWcgJUlubGluZTs+ICAgPCEtLSBiaWdnZXIgZm9udCAtLT4KLTwhQVRUTElTVCBiaWcgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHNtYWxsICVJbmxpbmU7PiAgIDwhLS0gc21hbGxlciBmb250IC0tPgotPCFBVFRMSVNUIHNtYWxsICVhdHRyczs+Ci0KLTwhRUxFTUVOVCB1ICVJbmxpbmU7PiAgIDwhLS0gdW5kZXJsaW5lIC0tPgotPCFBVFRMSVNUIHUgJWF0dHJzOz4KLQotPCFFTEVNRU5UIHMgJUlubGluZTs+ICAgPCEtLSBzdHJpa2UtdGhyb3VnaCAtLT4KLTwhQVRUTElTVCBzICVhdHRyczs+Ci0KLTwhRUxFTUVOVCBzdHJpa2UgJUlubGluZTs+ICAgPCEtLSBzdHJpa2UtdGhyb3VnaCAtLT4KLTwhQVRUTElTVCBzdHJpa2UgJWF0dHJzOz4KLQotPCFFTEVNRU5UIGJhc2Vmb250IEVNUFRZPiAgPCEtLSBiYXNlIGZvbnQgc2l6ZSAtLT4KLTwhQVRUTElTVCBiYXNlZm9udAotICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRAotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjUkVRVUlSRUQKLSAgY29sb3IgICAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgZmFjZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgZm9udCAlSW5saW5lOz4gPCEtLSBsb2NhbCBjaGFuZ2UgdG8gZm9udCAtLT4KLTwhQVRUTElTVCBmb250Ci0gICVjb3JlYXR0cnM7Ci0gICVpMThuOwotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBjb2xvciAgICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICBmYWNlICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PSBPYmplY3QgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0KLSAgb2JqZWN0IGlzIHVzZWQgdG8gZW1iZWQgb2JqZWN0cyBhcyBwYXJ0IG9mIEhUTUwgcGFnZXMuCi0gIHBhcmFtIGVsZW1lbnRzIHNob3VsZCBwcmVjZWRlIG90aGVyIGNvbnRlbnQuIFBhcmFtZXRlcnMKLSAgY2FuIGFsc28gYmUgZXhwcmVzc2VkIGFzIGF0dHJpYnV0ZS92YWx1ZSBwYWlycyBvbiB0aGUKLSAgb2JqZWN0IGVsZW1lbnQgaXRzZWxmIHdoZW4gYnJldml0eSBpcyBkZXNpcmVkLgotLS0+Ci0KLTwhRUxFTUVOVCBvYmplY3QgKCNQQ0RBVEEgfCBwYXJhbSB8ICVibG9jazsgfCBmb3JtIHwgJWlubGluZTsgfCAlbWlzYzspKj4KLTwhQVRUTElTVCBvYmplY3QKLSAgJWF0dHJzOwotICBkZWNsYXJlICAgICAoZGVjbGFyZSkgICAgICAjSU1QTElFRAotICBjbGFzc2lkICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBjb2RlYmFzZSAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBkYXRhICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICB0eXBlICAgICAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICBjb2RldHlwZSAgICAlQ29udGVudFR5cGU7ICAjSU1QTElFRAotICBhcmNoaXZlICAgICAlVXJpTGlzdDsgICAgICAjSU1QTElFRAotICBzdGFuZGJ5ICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBhbGlnbiAgICAgICAlSW1nQWxpZ247ICAgICAjSU1QTElFRAotICBib3JkZXIgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICBoc3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICB2c3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLSAgcGFyYW0gaXMgdXNlZCB0byBzdXBwbHkgYSBuYW1lZCBwcm9wZXJ0eSB2YWx1ZS4KLSAgSW4gWE1MIGl0IHdvdWxkIHNlZW0gbmF0dXJhbCB0byBmb2xsb3cgUkRGIGFuZCBzdXBwb3J0IGFuCi0gIGFiYnJldmlhdGVkIHN5bnRheCB3aGVyZSB0aGUgcGFyYW0gZWxlbWVudHMgYXJlIHJlcGxhY2VkCi0gIGJ5IGF0dHJpYnV0ZSB2YWx1ZSBwYWlycyBvbiB0aGUgb2JqZWN0IHN0YXJ0IHRhZy4KLS0tPgotPCFFTEVNRU5UIHBhcmFtIEVNUFRZPgotPCFBVFRMSVNUIHBhcmFtCi0gIGlkICAgICAgICAgIElEICAgICAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNSRVFVSVJFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZXR5cGUgICAoZGF0YXxyZWZ8b2JqZWN0KSAiZGF0YSIKLSAgdHlwZSAgICAgICAgJUNvbnRlbnRUeXBlOyAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PT09PSBKYXZhIGFwcGxldCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tCi0gIE9uZSBvZiBjb2RlIG9yIG9iamVjdCBhdHRyaWJ1dGVzIG11c3QgYmUgcHJlc2VudC4KLSAgUGxhY2UgcGFyYW0gZWxlbWVudHMgYmVmb3JlIG90aGVyIGNvbnRlbnQuCi0tLT4KLTwhRUxFTUVOVCBhcHBsZXQgKCNQQ0RBVEEgfCBwYXJhbSB8ICVibG9jazsgfCBmb3JtIHwgJWlubGluZTsgfCAlbWlzYzspKj4KLTwhQVRUTElTVCBhcHBsZXQKLSAgJWNvcmVhdHRyczsKLSAgY29kZWJhc2UgICAgJVVSSTsgICAgICAgICAgI0lNUExJRUQKLSAgYXJjaGl2ZSAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgY29kZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgb2JqZWN0ICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgYWx0ICAgICAgICAgJVRleHQ7ICAgICAgICAgI0lNUExJRUQKLSAgbmFtZSAgICAgICAgTk1UT0tFTiAgICAgICAgI0lNUExJRUQKLSAgd2lkdGggICAgICAgJUxlbmd0aDsgICAgICAgI1JFUVVJUkVECi0gIGhlaWdodCAgICAgICVMZW5ndGg7ICAgICAgICNSRVFVSVJFRAotICBhbGlnbiAgICAgICAlSW1nQWxpZ247ICAgICAjSU1QTElFRAotICBoc3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICB2c3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09IEltYWdlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0KLSAgIFRvIGF2b2lkIGFjY2Vzc2liaWxpdHkgcHJvYmxlbXMgZm9yIHBlb3BsZSB3aG8gYXJlbid0Ci0gICBhYmxlIHRvIHNlZSB0aGUgaW1hZ2UsIHlvdSBzaG91bGQgcHJvdmlkZSBhIHRleHQKLSAgIGRlc2NyaXB0aW9uIHVzaW5nIHRoZSBhbHQgYW5kIGxvbmdkZXNjIGF0dHJpYnV0ZXMuCi0gICBJbiBhZGRpdGlvbiwgYXZvaWQgdGhlIHVzZSBvZiBzZXJ2ZXItc2lkZSBpbWFnZSBtYXBzLgotLS0+Ci0KLTwhRUxFTUVOVCBpbWcgRU1QVFk+Ci08IUFUVExJU1QgaW1nCi0gICVhdHRyczsKLSAgc3JjICAgICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVECi0gIGFsdCAgICAgICAgICVUZXh0OyAgICAgICAgICNSRVFVSVJFRAotICBuYW1lICAgICAgICBOTVRPS0VOICAgICAgICAjSU1QTElFRAotICBsb25nZGVzYyAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBoZWlnaHQgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBpc21hcCAgICAgICAoaXNtYXApICAgICAgICAjSU1QTElFRAotICBhbGlnbiAgICAgICAlSW1nQWxpZ247ICAgICAjSU1QTElFRAotICBib3JkZXIgICAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRAotICBoc3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICB2c3BhY2UgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0gdXNlbWFwIHBvaW50cyB0byBhIG1hcCBlbGVtZW50IHdoaWNoIG1heSBiZSBpbiB0aGlzIGRvY3VtZW50Ci0gIG9yIGFuIGV4dGVybmFsIGRvY3VtZW50LCBhbHRob3VnaCB0aGUgbGF0dGVyIGlzIG5vdCB3aWRlbHkgc3VwcG9ydGVkIC0tPgotCi08IS0tPT09PT09PT09PT09PT09PT09IENsaWVudC1zaWRlIGltYWdlIG1hcHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IS0tIFRoZXNlIGNhbiBiZSBwbGFjZWQgaW4gdGhlIHNhbWUgZG9jdW1lbnQgb3IgZ3JvdXBlZCBpbiBhCi0gICAgIHNlcGFyYXRlIGRvY3VtZW50IGFsdGhvdWdoIHRoaXMgaXNuJ3QgeWV0IHdpZGVseSBzdXBwb3J0ZWQgLS0+Ci0KLTwhRUxFTUVOVCBtYXAgKCglYmxvY2s7IHwgZm9ybSB8ICVtaXNjOykrIHwgYXJlYSspPgotPCFBVFRMSVNUIG1hcAotICAlaTE4bjsKLSAgJWV2ZW50czsKLSAgaWQgICAgICAgICAgSUQgICAgICAgICAgICAgI1JFUVVJUkVECi0gIGNsYXNzICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIHN0eWxlICAgICAgICVTdHlsZVNoZWV0OyAgICNJTVBMSUVECi0gIHRpdGxlICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIG5hbWUgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIGFyZWEgRU1QVFk+Ci08IUFUVExJU1QgYXJlYQotICAlYXR0cnM7Ci0gIHNoYXBlICAgICAgICVTaGFwZTsgICAgICAgICJyZWN0IgotICBjb29yZHMgICAgICAlQ29vcmRzOyAgICAgICAjSU1QTElFRAotICBocmVmICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBub2hyZWYgICAgICAobm9ocmVmKSAgICAgICAjSU1QTElFRAotICBhbHQgICAgICAgICAlVGV4dDsgICAgICAgICAjUkVRVUlSRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgdGFyZ2V0ICAgICAgJUZyYW1lVGFyZ2V0OyAgI0lNUExJRUQKLSAgPgotCi08IS0tPT09PT09PT09PT09PT09PSBGb3JtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi08IUVMRU1FTlQgZm9ybSAlZm9ybS5jb250ZW50Oz4gICA8IS0tIGZvcm1zIHNob3VsZG4ndCBiZSBuZXN0ZWQgLS0+Ci0KLTwhQVRUTElTVCBmb3JtCi0gICVhdHRyczsKLSAgYWN0aW9uICAgICAgJVVSSTsgICAgICAgICAgI1JFUVVJUkVECi0gIG1ldGhvZCAgICAgIChnZXR8cG9zdCkgICAgICJnZXQiCi0gIG5hbWUgICAgICAgIE5NVE9LRU4gICAgICAgICNJTVBMSUVECi0gIGVuY3R5cGUgICAgICVDb250ZW50VHlwZTsgICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiCi0gIG9uc3VibWl0ICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIG9ucmVzZXQgICAgICVTY3JpcHQ7ICAgICAgICNJTVBMSUVECi0gIGFjY2VwdCAgICAgICVDb250ZW50VHlwZXM7ICNJTVBMSUVECi0gIGFjY2VwdC1jaGFyc2V0ICVDaGFyc2V0czsgICNJTVBMSUVECi0gIHRhcmdldCAgICAgICVGcmFtZVRhcmdldDsgICNJTVBMSUVECi0gID4KLQotPCEtLQotICBFYWNoIGxhYmVsIG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIE9ORSBmaWVsZAotICBMYWJlbCBlbGVtZW50cyBzaG91bGRuJ3QgYmUgbmVzdGVkLgotLS0+Ci08IUVMRU1FTlQgbGFiZWwgJUlubGluZTs+Ci08IUFUVExJU1QgbGFiZWwKLSAgJWF0dHJzOwotICBmb3IgICAgICAgICBJRFJFRiAgICAgICAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhRU5USVRZICUgSW5wdXRUeXBlCi0gICIodGV4dCB8IHBhc3N3b3JkIHwgY2hlY2tib3ggfAotICAgIHJhZGlvIHwgc3VibWl0IHwgcmVzZXQgfAotICAgIGZpbGUgfCBoaWRkZW4gfCBpbWFnZSB8IGJ1dHRvbikiCi0gICA+Ci0KLTwhLS0gdGhlIG5hbWUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIGZvciBhbGwgYnV0IHN1Ym1pdCAmIHJlc2V0IC0tPgotCi08IUVMRU1FTlQgaW5wdXQgRU1QVFk+ICAgICA8IS0tIGZvcm0gY29udHJvbCAtLT4KLTwhQVRUTElTVCBpbnB1dAotICAlYXR0cnM7Ci0gIHR5cGUgICAgICAgICVJbnB1dFR5cGU7ICAgICJ0ZXh0IgotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBjaGVja2VkICAgICAoY2hlY2tlZCkgICAgICAjSU1QTElFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICByZWFkb25seSAgICAocmVhZG9ubHkpICAgICAjSU1QTElFRAotICBzaXplICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICBtYXhsZW5ndGggICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBzcmMgICAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICBhbHQgICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB1c2VtYXAgICAgICAlVVJJOyAgICAgICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbnNlbGVjdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBhY2NlcHQgICAgICAlQ29udGVudFR5cGVzOyAjSU1QTElFRAotICBhbGlnbiAgICAgICAlSW1nQWxpZ247ICAgICAjSU1QTElFRAotICA+Ci0KLTwhRUxFTUVOVCBzZWxlY3QgKG9wdGdyb3VwfG9wdGlvbikrPiAgPCEtLSBvcHRpb24gc2VsZWN0b3IgLS0+Ci08IUFUVExJU1Qgc2VsZWN0Ci0gICVhdHRyczsKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgc2l6ZSAgICAgICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgbXVsdGlwbGUgICAgKG11bHRpcGxlKSAgICAgI0lNUExJRUQKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25jaGFuZ2UgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IUVMRU1FTlQgb3B0Z3JvdXAgKG9wdGlvbikrPiAgIDwhLS0gb3B0aW9uIGdyb3VwIC0tPgotPCFBVFRMSVNUIG9wdGdyb3VwCi0gICVhdHRyczsKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgbGFiZWwgICAgICAgJVRleHQ7ICAgICAgICAgI1JFUVVJUkVECi0gID4KLQotPCFFTEVNRU5UIG9wdGlvbiAoI1BDREFUQSk+ICAgICA8IS0tIHNlbGVjdGFibGUgY2hvaWNlIC0tPgotPCFBVFRMSVNUIG9wdGlvbgotICAlYXR0cnM7Ci0gIHNlbGVjdGVkICAgIChzZWxlY3RlZCkgICAgICNJTVBMSUVECi0gIGRpc2FibGVkICAgIChkaXNhYmxlZCkgICAgICNJTVBMSUVECi0gIGxhYmVsICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIHZhbHVlICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTEVNRU5UIHRleHRhcmVhICgjUENEQVRBKT4gICAgIDwhLS0gbXVsdGktbGluZSB0ZXh0IGZpZWxkIC0tPgotPCFBVFRMSVNUIHRleHRhcmVhCi0gICVhdHRyczsKLSAgbmFtZSAgICAgICAgQ0RBVEEgICAgICAgICAgI0lNUExJRUQKLSAgcm93cyAgICAgICAgJU51bWJlcjsgICAgICAgI1JFUVVJUkVECi0gIGNvbHMgICAgICAgICVOdW1iZXI7ICAgICAgICNSRVFVSVJFRAotICBkaXNhYmxlZCAgICAoZGlzYWJsZWQpICAgICAjSU1QTElFRAotICByZWFkb25seSAgICAocmVhZG9ubHkpICAgICAjSU1QTElFRAotICB0YWJpbmRleCAgICAlTnVtYmVyOyAgICAgICAjSU1QTElFRAotICBhY2Nlc3NrZXkgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICBvbmZvY3VzICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmJsdXIgICAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbnNlbGVjdCAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICBvbmNoYW5nZSAgICAlU2NyaXB0OyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLSAgVGhlIGZpZWxkc2V0IGVsZW1lbnQgaXMgdXNlZCB0byBncm91cCBmb3JtIGZpZWxkcy4KLSAgT25seSBvbmUgbGVnZW5kIGVsZW1lbnQgc2hvdWxkIG9jY3VyIGluIHRoZSBjb250ZW50Ci0gIGFuZCBpZiBwcmVzZW50IHNob3VsZCBvbmx5IGJlIHByZWNlZGVkIGJ5IHdoaXRlc3BhY2UuCi0tLT4KLTwhRUxFTUVOVCBmaWVsZHNldCAoI1BDREFUQSB8IGxlZ2VuZCB8ICVibG9jazsgfCBmb3JtIHwgJWlubGluZTsgfCAlbWlzYzspKj4KLTwhQVRUTElTVCBmaWVsZHNldAotICAlYXR0cnM7Ci0gID4KLQotPCFFTlRJVFkgJSBMQWxpZ24gIih0b3B8Ym90dG9tfGxlZnR8cmlnaHQpIj4KLQotPCFFTEVNRU5UIGxlZ2VuZCAlSW5saW5lOz4gICAgIDwhLS0gZmllbGRzZXQgbGFiZWwgLS0+Ci08IUFUVExJU1QgbGVnZW5kCi0gICVhdHRyczsKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgYWxpZ24gICAgICAgJUxBbGlnbjsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tCi0gQ29udGVudCBpcyAlRmxvdzsgZXhjbHVkaW5nIGEsIGZvcm0sIGZvcm0gY29udHJvbHMsIGlmcmFtZQotLS0+IAotPCFFTEVNRU5UIGJ1dHRvbiAlYnV0dG9uLmNvbnRlbnQ7PiAgPCEtLSBwdXNoIGJ1dHRvbiAtLT4KLTwhQVRUTElTVCBidXR0b24KLSAgJWF0dHJzOwotICBuYW1lICAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB2YWx1ZSAgICAgICBDREFUQSAgICAgICAgICAjSU1QTElFRAotICB0eXBlICAgICAgICAoYnV0dG9ufHN1Ym1pdHxyZXNldCkgInN1Ym1pdCIKLSAgZGlzYWJsZWQgICAgKGRpc2FibGVkKSAgICAgI0lNUExJRUQKLSAgdGFiaW5kZXggICAgJU51bWJlcjsgICAgICAgI0lNUExJRUQKLSAgYWNjZXNza2V5ICAgJUNoYXJhY3RlcjsgICAgI0lNUExJRUQKLSAgb25mb2N1cyAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgb25ibHVyICAgICAgJVNjcmlwdDsgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIHNpbmdsZS1saW5lIHRleHQgaW5wdXQgY29udHJvbCAoREVQUkVDQVRFRCkgLS0+Ci08IUVMRU1FTlQgaXNpbmRleCBFTVBUWT4KLTwhQVRUTElTVCBpc2luZGV4Ci0gICVjb3JlYXR0cnM7Ci0gICVpMThuOwotICBwcm9tcHQgICAgICAlVGV4dDsgICAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PSBUYWJsZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0KLTwhLS0gRGVyaXZlZCBmcm9tIElFVEYgSFRNTCB0YWJsZSBzdGFuZGFyZCwgc2VlIFtSRkMxOTQyXSAtLT4KLQotPCEtLQotIFRoZSBib3JkZXIgYXR0cmlidXRlIHNldHMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgZnJhbWUgYXJvdW5kIHRoZQotIHRhYmxlLiBUaGUgZGVmYXVsdCB1bml0cyBhcmUgc2NyZWVuIHBpeGVscy4KLQotIFRoZSBmcmFtZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHdoaWNoIHBhcnRzIG9mIHRoZSBmcmFtZSBhcm91bmQKLSB0aGUgdGFibGUgc2hvdWxkIGJlIHJlbmRlcmVkLiBUaGUgdmFsdWVzIGFyZSBub3QgdGhlIHNhbWUgYXMKLSBDQUxTIHRvIGF2b2lkIGEgbmFtZSBjbGFzaCB3aXRoIHRoZSB2YWxpZ24gYXR0cmlidXRlLgotLS0+Ci08IUVOVElUWSAlIFRGcmFtZSAiKHZvaWR8YWJvdmV8YmVsb3d8aHNpZGVzfGxoc3xyaHN8dnNpZGVzfGJveHxib3JkZXIpIj4KLQotPCEtLQotIFRoZSBydWxlcyBhdHRyaWJ1dGUgZGVmaW5lcyB3aGljaCBydWxlcyB0byBkcmF3IGJldHdlZW4gY2VsbHM6Ci0KLSBJZiBydWxlcyBpcyBhYnNlbnQgdGhlbiBhc3N1bWU6Ci0gICAgICJub25lIiBpZiBib3JkZXIgaXMgYWJzZW50IG9yIGJvcmRlcj0iMCIgb3RoZXJ3aXNlICJhbGwiCi0tLT4KLQotPCFFTlRJVFkgJSBUUnVsZXMgIihub25lIHwgZ3JvdXBzIHwgcm93cyB8IGNvbHMgfCBhbGwpIj4KLSAgCi08IS0tIGhvcml6b250YWwgcGxhY2VtZW50IG9mIHRhYmxlIHJlbGF0aXZlIHRvIGRvY3VtZW50IC0tPgotPCFFTlRJVFkgJSBUQWxpZ24gIihsZWZ0fGNlbnRlcnxyaWdodCkiPgotCi08IS0tIGhvcml6b250YWwgYWxpZ25tZW50IGF0dHJpYnV0ZXMgZm9yIGNlbGwgY29udGVudHMKLQotICBjaGFyICAgICAgICBhbGlnbm1lbnQgY2hhciwgZS5nLiBjaGFyPSc6JwotICBjaGFyb2ZmICAgICBvZmZzZXQgZm9yIGFsaWdubWVudCBjaGFyCi0tLT4KLTwhRU5USVRZICUgY2VsbGhhbGlnbgotICAiYWxpZ24gICAgICAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeXxjaGFyKSAjSU1QTElFRAotICAgY2hhciAgICAgICAlQ2hhcmFjdGVyOyAgICAjSU1QTElFRAotICAgY2hhcm9mZiAgICAlTGVuZ3RoOyAgICAgICAjSU1QTElFRCIKLSAgPgotCi08IS0tIHZlcnRpY2FsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzIC0tPgotPCFFTlRJVFkgJSBjZWxsdmFsaWduCi0gICJ2YWxpZ24gICAgICh0b3B8bWlkZGxlfGJvdHRvbXxiYXNlbGluZSkgI0lNUExJRUQiCi0gID4KLQotPCFFTEVNRU5UIHRhYmxlCi0gICAgIChjYXB0aW9uPywgKGNvbCp8Y29sZ3JvdXAqKSwgdGhlYWQ/LCB0Zm9vdD8sICh0Ym9keSt8dHIrKSk+Ci08IUVMRU1FTlQgY2FwdGlvbiAgJUlubGluZTs+Ci08IUVMRU1FTlQgdGhlYWQgICAgKHRyKSs+Ci08IUVMRU1FTlQgdGZvb3QgICAgKHRyKSs+Ci08IUVMRU1FTlQgdGJvZHkgICAgKHRyKSs+Ci08IUVMRU1FTlQgY29sZ3JvdXAgKGNvbCkqPgotPCFFTEVNRU5UIGNvbCAgICAgIEVNUFRZPgotPCFFTEVNRU5UIHRyICAgICAgICh0aHx0ZCkrPgotPCFFTEVNRU5UIHRoICAgICAgICVGbG93Oz4KLTwhRUxFTUVOVCB0ZCAgICAgICAlRmxvdzs+Ci0KLTwhQVRUTElTVCB0YWJsZQotICAlYXR0cnM7Ci0gIHN1bW1hcnkgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIHdpZHRoICAgICAgICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIGJvcmRlciAgICAgICVQaXhlbHM7ICAgICAgICNJTVBMSUVECi0gIGZyYW1lICAgICAgICVURnJhbWU7ICAgICAgICNJTVBMSUVECi0gIHJ1bGVzICAgICAgICVUUnVsZXM7ICAgICAgICNJTVBMSUVECi0gIGNlbGxzcGFjaW5nICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIGNlbGxwYWRkaW5nICVMZW5ndGg7ICAgICAgICNJTVBMSUVECi0gIGFsaWduICAgICAgICVUQWxpZ247ICAgICAgICNJTVBMSUVECi0gIGJnY29sb3IgICAgICVDb2xvcjsgICAgICAgICNJTVBMSUVECi0gID4KLQotPCFFTlRJVFkgJSBDQWxpZ24gIih0b3B8Ym90dG9tfGxlZnR8cmlnaHQpIj4KLQotPCFBVFRMSVNUIGNhcHRpb24KLSAgJWF0dHJzOwotICBhbGlnbiAgICAgICAlQ0FsaWduOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhLS0KLWNvbGdyb3VwIGdyb3VwcyBhIHNldCBvZiBjb2wgZWxlbWVudHMuIEl0IGFsbG93cyB5b3UgdG8gZ3JvdXAKLXNldmVyYWwgc2VtYW50aWNhbGx5IHJlbGF0ZWQgY29sdW1ucyB0b2dldGhlci4KLS0tPgotPCFBVFRMSVNUIGNvbGdyb3VwCi0gICVhdHRyczsKLSAgc3BhbiAgICAgICAgJU51bWJlcjsgICAgICAgIjEiCi0gIHdpZHRoICAgICAgICVNdWx0aUxlbmd0aDsgICNJTVBMSUVECi0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IS0tCi0gY29sIGVsZW1lbnRzIGRlZmluZSB0aGUgYWxpZ25tZW50IHByb3BlcnRpZXMgZm9yIGNlbGxzIGluCi0gb25lIG9yIG1vcmUgY29sdW1ucy4KLQotIFRoZSB3aWR0aCBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1ucywgZS5nLgotCi0gICAgIHdpZHRoPTY0ICAgICAgICB3aWR0aCBpbiBzY3JlZW4gcGl4ZWxzCi0gICAgIHdpZHRoPTAuNSogICAgICByZWxhdGl2ZSB3aWR0aCBvZiAwLjUKLQotIFRoZSBzcGFuIGF0dHJpYnV0ZSBjYXVzZXMgdGhlIGF0dHJpYnV0ZXMgb2Ygb25lCi0gY29sIGVsZW1lbnQgdG8gYXBwbHkgdG8gbW9yZSB0aGFuIG9uZSBjb2x1bW4uCi0tLT4KLTwhQVRUTElTVCBjb2wKLSAgJWF0dHJzOwotICBzcGFuICAgICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgd2lkdGggICAgICAgJU11bHRpTGVuZ3RoOyAgI0lNUExJRUQKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhLS0KLSAgICBVc2UgdGhlYWQgdG8gZHVwbGljYXRlIGhlYWRlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMsIG9yIGZvciBzdGF0aWMgaGVhZGVycyB3aGVuCi0gICAgdGJvZHkgc2VjdGlvbnMgYXJlIHJlbmRlcmVkIGluIHNjcm9sbGluZyBwYW5lbC4KLQotICAgIFVzZSB0Zm9vdCB0byBkdXBsaWNhdGUgZm9vdGVycyB3aGVuIGJyZWFraW5nIHRhYmxlCi0gICAgYWNyb3NzIHBhZ2UgYm91bmRhcmllcywgb3IgZm9yIHN0YXRpYyBmb290ZXJzIHdoZW4KLSAgICB0Ym9keSBzZWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gc2Nyb2xsaW5nIHBhbmVsLgotCi0gICAgVXNlIG11bHRpcGxlIHRib2R5IHNlY3Rpb25zIHdoZW4gcnVsZXMgYXJlIG5lZWRlZAotICAgIGJldHdlZW4gZ3JvdXBzIG9mIHRhYmxlIHJvd3MuCi0tLT4KLTwhQVRUTElTVCB0aGVhZAotICAlYXR0cnM7Ci0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgPgotCi08IUFUVExJU1QgdGZvb3QKLSAgJWF0dHJzOwotICAlY2VsbGhhbGlnbjsKLSAgJWNlbGx2YWxpZ247Ci0gID4KLQotPCFBVFRMSVNUIHRib2R5Ci0gICVhdHRyczsKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICA+Ci0KLTwhQVRUTElTVCB0cgotICAlYXR0cnM7Ci0gICVjZWxsaGFsaWduOwotICAlY2VsbHZhbGlnbjsKLSAgYmdjb2xvciAgICAgJUNvbG9yOyAgICAgICAgI0lNUExJRUQKLSAgPgotCi08IS0tIFNjb3BlIGlzIHNpbXBsZXIgdGhhbiBoZWFkZXJzIGF0dHJpYnV0ZSBmb3IgY29tbW9uIHRhYmxlcyAtLT4KLTwhRU5USVRZICUgU2NvcGUgIihyb3d8Y29sfHJvd2dyb3VwfGNvbGdyb3VwKSI+Ci0KLTwhLS0gdGggaXMgZm9yIGhlYWRlcnMsIHRkIGZvciBkYXRhIGFuZCBmb3IgY2VsbHMgYWN0aW5nIGFzIGJvdGggLS0+Ci0KLTwhQVRUTElTVCB0aAotICAlYXR0cnM7Ci0gIGFiYnIgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIGF4aXMgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGhlYWRlcnMgICAgIElEUkVGUyAgICAgICAgICNJTVBMSUVECi0gIHNjb3BlICAgICAgICVTY29wZTsgICAgICAgICNJTVBMSUVECi0gIHJvd3NwYW4gICAgICVOdW1iZXI7ICAgICAgICIxIgotICBjb2xzcGFuICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICBub3dyYXAgICAgICAobm93cmFwKSAgICAgICAjSU1QTElFRAotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICBoZWlnaHQgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICA+Ci0KLTwhQVRUTElTVCB0ZAotICAlYXR0cnM7Ci0gIGFiYnIgICAgICAgICVUZXh0OyAgICAgICAgICNJTVBMSUVECi0gIGF4aXMgICAgICAgIENEQVRBICAgICAgICAgICNJTVBMSUVECi0gIGhlYWRlcnMgICAgIElEUkVGUyAgICAgICAgICNJTVBMSUVECi0gIHNjb3BlICAgICAgICVTY29wZTsgICAgICAgICNJTVBMSUVECi0gIHJvd3NwYW4gICAgICVOdW1iZXI7ICAgICAgICIxIgotICBjb2xzcGFuICAgICAlTnVtYmVyOyAgICAgICAiMSIKLSAgJWNlbGxoYWxpZ247Ci0gICVjZWxsdmFsaWduOwotICBub3dyYXAgICAgICAobm93cmFwKSAgICAgICAjSU1QTElFRAotICBiZ2NvbG9yICAgICAlQ29sb3I7ICAgICAgICAjSU1QTElFRAotICB3aWR0aCAgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICBoZWlnaHQgICAgICAlUGl4ZWxzOyAgICAgICAjSU1QTElFRAotICA+Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvZHRkcy94aHRtbDExLWZsYXQuZHRkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sMTEtZmxhdC5kdGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYTg1MTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9kdGRzL3hodG1sMTEtZmxhdC5kdGQKKysrIC9kZXYvbnVsbApAQCAtMSw0NTEzICswLDAgQEAKLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIDEuMSBEVEQgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbDExLmR0ZAotLS0+Ci0KLTwhLS0gWEhUTUwgMS4xIERURAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0KLSAgICAgVGhlIEV4dGVuc2libGUgSHlwZXJUZXh0IE1hcmt1cCBMYW5ndWFnZSAoWEhUTUwpCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDAgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bQotICAgICAgICAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUKLSAgICAgICAgIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuCi0gICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gICAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhlIFhIVE1MIERURCBhbmQgaXRzIAotICAgICBhY2NvbXBhbnlpbmcgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSAKLSAgICAgZ3JhbnRlZCBpbiBwZXJwZXR1aXR5LCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCAKLSAgICAgdGhpcyBwYXJhZ3JhcGggYXBwZWFyIGluIGFsbCBjb3BpZXMuICBUaGUgY29weXJpZ2h0IGhvbGRlcnMgbWFrZSBubyAKLSAgICAgcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoZSBEVEQgZm9yIGFueSBwdXJwb3NlLgotCi0gICAgIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzZWQgb3IgaW1wbGllZCB3YXJyYW50eS4KLQotICAgICAgICBBdXRob3I6ICAgICBNdXJyYXkgTS4gQWx0aGVpbSA8YWx0aGVpbUBlbmcuc3VuLmNvbT4KLSAgICAgICAgUmV2aXNpb246ICAgJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQKLQotLS0+Ci08IS0tIFRoaXMgaXMgdGhlIGRyaXZlciBmaWxlIGZvciB2ZXJzaW9uIDEuMSBvZiB0aGUgWEhUTUwgRFRELgotCi0gICAgIFBsZWFzZSB1c2UgdGhpcyBmb3JtYWwgcHVibGljIGlkZW50aWZpZXIgdG8gaWRlbnRpZnkgaXQ6Ci0KLSAgICAgICAgICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIgotLS0+Ci08IUVOVElUWSAlIFhIVE1MLnZlcnNpb24gICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIiA+Ci0KLTwhLS0gVXNlIHRoaXMgVVJJIHRvIGlkZW50aWZ5IHRoZSBkZWZhdWx0IG5hbWVzcGFjZToKLQotICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0KLSAgICAgU2VlIHRoZSBRdWFsaWZpZWQgTmFtZXMgbW9kdWxlIGZvciBpbmZvcm1hdGlvbgotICAgICBvbiB0aGUgdXNlIG9mIG5hbWVzcGFjZSBwcmVmaXhlcyBpbiB0aGUgRFRELgotLS0+Ci08IUVOVElUWSAlIE5TLnByZWZpeGVkICJJR05PUkUiID4KLTwhRU5USVRZICUgWEhUTUwucHJlZml4ICIiID4KLQotPCEtLSBSZXNlcnZlZCBmb3IgdXNlIHdpdGggdGhlIFhMaW5rIG5hbWVzcGFjZToKLS0tPgotPCFFTlRJVFkgJSBYTElOSy54bWxucyAiIiA+Ci08IUVOVElUWSAlIFhMSU5LLnhtbG5zLmF0dHJpYiAiIiA+Ci0KLTwhLS0gRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgdXNpbmcgWEhUTUwgMS4xIGRpcmVjdGx5LCB1c2UgdGhlIEZQSQotICAgICBpbiB0aGUgRE9DVFlQRSBkZWNsYXJhdGlvbiwgd2l0aCB0aGUgeG1sbnMgYXR0cmlidXRlIG9uIHRoZQotICAgICBkb2N1bWVudCBlbGVtZW50IHRvIGlkZW50aWZ5IHRoZSBkZWZhdWx0IG5hbWVzcGFjZToKLQotICAgICAgIDw/eG1sIHZlcnNpb249IjEuMCI/PgotICAgICAgIDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiIgInhodG1sMTEuZHRkIj4KLSAgICAgICA8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgICAgICAgICB4bWw6bGFuZz0iZW4iPgotICAgICAgIC4uLgotICAgICAgIDwvaHRtbD4KLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotLS0+Ci0KLTwhLS0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2Ugd2l0aCBkb2N1bWVudCBwcm9maWxlcyAtLT4KLTwhRU5USVRZICUgWEhUTUwucHJvZmlsZSAgIiIgPgotCi08IS0tIEJpZGlyZWN0aW9uYWwgVGV4dCBmZWF0dXJlcwotICAgICBUaGlzIGZlYXR1cmUtdGVzdCBlbnRpdHkgaXMgdXNlZCB0byBkZWNsYXJlIGVsZW1lbnRzCi0gICAgIGFuZCBhdHRyaWJ1dGVzIHVzZWQgZm9yIGJpZGlyZWN0aW9uYWwgdGV4dCBzdXBwb3J0LgotLS0+Ci08IUVOVElUWSAlIFhIVE1MLmJpZGkgICJJTkNMVURFIiA+Ci0KLTw/ZG9jIHR5cGU9ImRvY3R5cGUiIHJvbGU9InRpdGxlIiB7IFhIVE1MIDEuMSB9ID8+Ci0KLTwhLS0gOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjogLS0+Ci0KLTwhLS0gUHJlLUZyYW1ld29yayBSZWRlY2xhcmF0aW9uIHBsYWNlaG9sZGVyICAuLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gdGhpcyBzZXJ2ZXMgYXMgYSBsb2NhdGlvbiB0byBpbnNlcnQgbWFya3VwIGRlY2xhcmF0aW9ucwotICAgICBpbnRvIHRoZSBEVEQgcHJpb3IgdG8gdGhlIGZyYW1ld29yayBkZWNsYXJhdGlvbnMuCi0tLT4KLTwhRU5USVRZICUgeGh0bWwtcHJlZnctcmVkZWNsLm1vZHVsZSAiSUdOT1JFIiA+Ci08IVsleGh0bWwtcHJlZnctcmVkZWNsLm1vZHVsZTtbCi0leGh0bWwtcHJlZnctcmVkZWNsLm1vZDsKLTwhLS0gZW5kIG9mIHhodG1sLXByZWZ3LXJlZGVjbC5tb2R1bGUgLS0+XV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtZXZlbnRzLm1vZHVsZSAiSU5DTFVERSIgPgotCi08IS0tIElubGluZSBTdHlsZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWlubHN0eWxlLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWlubHN0eWxlLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWlubHN0eWxlLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFN0eWxlIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWlubHN0eWxlLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIElubGluZSBTdHlsZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWlubHN0eWxlLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgSW5saW5lIFN0eWxlIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaW5sc3R5bGUtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gSW5saW5lIFN0eWxlCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlICdzdHlsZScgYXR0cmlidXRlLCB1c2VkIHRvIHN1cHBvcnQgaW5saW5lCi0gICAgIHN0eWxlIG1hcmt1cC4gVGhpcyBtb2R1bGUgbXVzdCBiZSBpbnN0YW50aWF0ZWQgcHJpb3IgdG8gdGhlIFhIVE1MCi0gICAgIENvbW1vbiBBdHRyaWJ1dGVzIG1vZHVsZSBpbiBvcmRlciB0byBiZSBpbmNsdWRlZCBpbiAlQ29yZS5hdHRyaWI7LgotLS0+Ci0KLTwhRU5USVRZICUgc3R5bGUuYXR0cmliCi0gICAgICJzdHlsZSAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi0KLTwhRU5USVRZICUgQ29yZS5leHRyYS5hdHRyaWIKLSAgICAgIiVzdHlsZS5hdHRyaWI7IgotPgotCi08IS0tIGVuZCBvZiB4aHRtbC1pbmxzdHlsZS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIGRlY2xhcmUgRG9jdW1lbnQgTW9kZWwgbW9kdWxlIGluc3RhbnRpYXRlZCBpbiBmcmFtZXdvcmsKLS0tPgotPCFFTlRJVFkgJSB4aHRtbC1tb2RlbC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIDEuMSBEb2N1bWVudCBNb2RlbCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sMTEtbW9kZWwtMS5tb2QiID4KLQotPCEtLSBNb2R1bGFyIEZyYW1ld29yayBNb2R1bGUgKHJlcXVpcmVkKSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1mcmFtZXdvcmsubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtZnJhbWV3b3JrLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWZyYW1ld29yay5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIE1vZHVsYXIgRnJhbWV3b3JrIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWZyYW1ld29yay0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBNb2R1bGFyIEZyYW1ld29yayBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1mcmFtZXdvcmstMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgTW9kdWxhciBGcmFtZXdvcmsgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1mcmFtZXdvcmstMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTW9kdWxhciBGcmFtZXdvcmsKLQotICAgICBUaGlzIHJlcXVpcmVkIG1vZHVsZSBpbnN0YW50aWF0ZXMgdGhlIG1vZHVsZXMgbmVlZGVkCi0gICAgIHRvIHN1cHBvcnQgdGhlIFhIVE1MIG1vZHVsYXJpemF0aW9uIG1vZGVsLCBpbmNsdWRpbmc6Ci0KLSAgICAgICAgKyAgbm90YXRpb25zCi0gICAgICAgICsgIGRhdGF0eXBlcwotICAgICAgICArICBuYW1lc3BhY2UtcXVhbGlmaWVkIG5hbWVzCi0gICAgICAgICsgIGNvbW1vbiBhdHRyaWJ1dGVzCi0gICAgICAgICsgIGRvY3VtZW50IG1vZGVsCi0gICAgICAgICsgIGNoYXJhY3RlciBlbnRpdGllcwotCi0gICAgIFRoZSBJbnRyaW5zaWMgRXZlbnRzIG1vZHVsZSBpcyBpZ25vcmVkIGJ5IGRlZmF1bHQgYnV0Ci0gICAgIG9jY3VycyBpbiB0aGlzIG1vZHVsZSBiZWNhdXNlIGl0IG11c3QgYmUgaW5zdGFudGlhdGVkCi0gICAgIHByaW9yIHRvIEF0dHJpYnV0ZXMgYnV0IGFmdGVyIERhdGF0eXBlcy4KLS0tPgotCi08IUVOVElUWSAlIHhodG1sLWFyY2gubW9kdWxlICJJR05PUkUiID4KLTwhWyV4aHRtbC1hcmNoLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWFyY2gubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNlIEFyY2hpdGVjdHVyZSAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWFyY2gtMS5tb2QiID4KLSV4aHRtbC1hcmNoLm1vZDtdXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1ub3RhdGlvbnMubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtbm90YXRpb25zLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLW5vdGF0aW9ucy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OUyBYSFRNTCBOb3RhdGlvbnMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1ub3RhdGlvbnMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgTm90YXRpb25zIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtbm90YXRpb25zLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT05TIFhIVE1MIE5vdGF0aW9ucyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLW5vdGF0aW9ucy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBOb3RhdGlvbnMKLQotICAgICBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgbm90YXRpb25zLCBtYW55IG9mIHRoZXNlIGltcG9ydGVkIGZyb20KLSAgICAgb3RoZXIgc3BlY2lmaWNhdGlvbnMgYW5kIHN0YW5kYXJkcy4gV2hlbiBhbiBleGlzdGluZyBGUEkgaXMKLSAgICAga25vd24sIGl0IGlzIGluY29ycG9yYXRlZCBoZXJlLgotLS0+Ci0KLTwhLS0gWE1MIE5vdGF0aW9ucyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBTR01MIGFuZCBYTUwgTm90YXRpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gVzNDIFhNTCAxLjAgUmVjb21tZW5kYXRpb24gLS0+Ci08IU5PVEFUSU9OIHczYy14bWwKLSAgICAgUFVCTElDICJJU08gODg3OS8vTk9UQVRJT04gRXh0ZW5zaWJsZSBNYXJrdXAgTGFuZ3VhZ2UgKFhNTCkgMS4wLy9FTiIgPgotCi08IS0tIFhNTCAxLjAgQ0RBVEEgLS0+Ci08IU5PVEFUSU9OIGNkYXRhCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYTUwgMS4wOiBDREFUQS8vRU4iID4KLQotPCEtLSBTR01MIEZvcm1hbCBQdWJsaWMgSWRlbnRpZmllcnMgLS0+Ci08IU5PVEFUSU9OIGZwaQotICAgICBQVUJMSUMgIklTTyA4ODc5OjE5ODYvL05PVEFUSU9OIEZvcm1hbCBQdWJsaWMgSWRlbnRpZmllci8vRU4iID4KLQotPCEtLSBYSFRNTCBOb3RhdGlvbnMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gTGVuZ3RoIGRlZmluZWQgZm9yIGNlbGxwYWRkaW5nL2NlbGxzcGFjaW5nIC0tPgotCi08IS0tIG5uIGZvciBwaXhlbHMgb3Igbm4lIGZvciBwZXJjZW50YWdlIGxlbmd0aCAtLT4KLTwhTk9UQVRJT04gbGVuZ3RoCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBMZW5ndGgvL0VOIiA+Ci0KLTwhLS0gc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgbGluayB0eXBlcyAtLT4KLTwhTk9UQVRJT04gbGlua1R5cGVzCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBMaW5rVHlwZXMvL0VOIiA+Ci0KLTwhLS0gc2luZ2xlIG9yIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIGRlc2NyaXB0b3JzIC0tPgotPCFOT1RBVElPTiBtZWRpYURlc2MKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IE1lZGlhRGVzYy8vRU4iID4KLQotPCEtLSBwaXhlbCwgcGVyY2VudGFnZSwgb3IgcmVsYXRpdmUgLS0+Ci08IU5PVEFUSU9OIG11bHRpTGVuZ3RoCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBNdWx0aUxlbmd0aC8vRU4iID4KLQotPCEtLSBvbmUgb3IgbW9yZSBkaWdpdHMgKE5VTUJFUikgLS0+Ci08IU5PVEFUSU9OIG51bWJlcgotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogTnVtYmVyLy9FTiIgPgotCi08IS0tIGludGVnZXIgcmVwcmVzZW50aW5nIGxlbmd0aCBpbiBwaXhlbHMgLS0+Ci08IU5PVEFUSU9OIHBpeGVscwotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogUGl4ZWxzLy9FTiIgPgotCi08IS0tIHNjcmlwdCBleHByZXNzaW9uIC0tPgotPCFOT1RBVElPTiBzY3JpcHQKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFNjcmlwdC8vRU4iID4KLQotPCEtLSB0ZXh0dWFsIGNvbnRlbnQgLS0+Ci08IU5PVEFUSU9OIHRleHQKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFRleHQvL0VOIiA+Ci0KLTwhLS0gSW1wb3J0ZWQgTm90YXRpb25zIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIFtJU08xMDY0Nl0gLS0+Ci08IU5PVEFUSU9OIGNoYXJhY3RlcgotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogQ2hhcmFjdGVyLy9FTiIgPgotCi08IS0tIGEgY2hhcmFjdGVyIGVuY29kaW5nLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFOT1RBVElPTiBjaGFyc2V0Ci0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDaGFyc2V0Ly9FTiIgPgotCi08IS0tIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2hhcmFjdGVyIGVuY29kaW5ncywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhTk9UQVRJT04gY2hhcnNldHMKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IENoYXJzZXRzLy9FTiIgPgotCi08IS0tIG1lZGlhIHR5cGUsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IU5PVEFUSU9OIGNvbnRlbnRUeXBlCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDb250ZW50VHlwZS8vRU4iID4KLQotPCEtLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtZWRpYSB0eXBlcywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhTk9UQVRJT04gY29udGVudFR5cGVzCi0gICAgUFVCTElDICItLy9XM0MvL05PVEFUSU9OIFhIVE1MIERhdGF0eXBlOiBDb250ZW50VHlwZXMvL0VOIiA+Ci0KLTwhLS0gZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gSVNPIGRhdGUgZm9ybWF0IC0tPgotPCFOT1RBVElPTiBkYXRldGltZQotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogRGF0ZXRpbWUvL0VOIiA+Ci0KLTwhLS0gYSBsYW5ndWFnZSBjb2RlLCBhcyBwZXIgW1JGQzMwNjZdIC0tPgotPCFOT1RBVElPTiBsYW5ndWFnZUNvZGUKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IExhbmd1YWdlQ29kZS8vRU4iID4KLQotPCEtLSBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciwgc2VlIFtVUkldIC0tPgotPCFOT1RBVElPTiB1cmkKLSAgICBQVUJMSUMgIi0vL1czQy8vTk9UQVRJT04gWEhUTUwgRGF0YXR5cGU6IFVSSS8vRU4iID4KLQotPCEtLSBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnMsIHNlZSBbVVJJXSAtLT4KLTwhTk9UQVRJT04gdXJpcwotICAgIFBVQkxJQyAiLS8vVzNDLy9OT1RBVElPTiBYSFRNTCBEYXRhdHlwZTogVVJJcy8vRU4iID4KLQotPCEtLSBlbmQgb2YgeGh0bWwtbm90YXRpb25zLTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtZGF0YXR5cGVzLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWRhdGF0eXBlcy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1kYXRhdHlwZXMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBEYXRhdHlwZXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1kYXRhdHlwZXMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgRGF0YXR5cGVzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtZGF0YXR5cGVzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIERhdGF0eXBlcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWRhdGF0eXBlcy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBEYXRhdHlwZXMKLQotICAgICBkZWZpbmVzIGNvbnRhaW5lcnMgZm9yIHRoZSBmb2xsb3dpbmcgZGF0YXR5cGVzLCBtYW55IG9mCi0gICAgIHRoZXNlIGltcG9ydGVkIGZyb20gb3RoZXIgc3BlY2lmaWNhdGlvbnMgYW5kIHN0YW5kYXJkcy4KLS0tPgotCi08IS0tIExlbmd0aCBkZWZpbmVkIGZvciBjZWxscGFkZGluZy9jZWxsc3BhY2luZyAtLT4KLQotPCEtLSBubiBmb3IgcGl4ZWxzIG9yIG5uJSBmb3IgcGVyY2VudGFnZSBsZW5ndGggLS0+Ci08IUVOVElUWSAlIExlbmd0aC5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBsaW5rIHR5cGVzIC0tPgotPCFFTlRJVFkgJSBMaW5rVHlwZXMuZGF0YXR5cGUgIk5NVE9LRU5TIiA+Ci0KLTwhLS0gc2luZ2xlIG9yIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIGRlc2NyaXB0b3JzIC0tPgotPCFFTlRJVFkgJSBNZWRpYURlc2MuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gcGl4ZWwsIHBlcmNlbnRhZ2UsIG9yIHJlbGF0aXZlIC0tPgotPCFFTlRJVFkgJSBNdWx0aUxlbmd0aC5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBvbmUgb3IgbW9yZSBkaWdpdHMgKE5VTUJFUikgLS0+Ci08IUVOVElUWSAlIE51bWJlci5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBpbnRlZ2VyIHJlcHJlc2VudGluZyBsZW5ndGggaW4gcGl4ZWxzIC0tPgotPCFFTlRJVFkgJSBQaXhlbHMuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gc2NyaXB0IGV4cHJlc3Npb24gLS0+Ci08IUVOVElUWSAlIFNjcmlwdC5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSB0ZXh0dWFsIGNvbnRlbnQgLS0+Ci08IUVOVElUWSAlIFRleHQuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gSW1wb3J0ZWQgRGF0YXR5cGVzIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIGEgc2luZ2xlIGNoYXJhY3RlciBmcm9tIFtJU08xMDY0Nl0gLS0+Ci08IUVOVElUWSAlIENoYXJhY3Rlci5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBhIGNoYXJhY3RlciBlbmNvZGluZywgYXMgcGVyIFtSRkMyMDQ1XSAtLT4KLTwhRU5USVRZICUgQ2hhcnNldC5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNoYXJhY3RlciBlbmNvZGluZ3MsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IUVOVElUWSAlIENoYXJzZXRzLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIG1lZGlhIHR5cGUsIGFzIHBlciBbUkZDMjA0NV0gLS0+Ci08IUVOVElUWSAlIENvbnRlbnRUeXBlLmRhdGF0eXBlICJDREFUQSIgPgotCi08IS0tIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhIHR5cGVzLCBhcyBwZXIgW1JGQzIwNDVdIC0tPgotPCFFTlRJVFkgJSBDb250ZW50VHlwZXMuZGF0YXR5cGUgIkNEQVRBIiA+Ci0KLTwhLS0gZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbi4gSVNPIGRhdGUgZm9ybWF0IC0tPgotPCFFTlRJVFkgJSBEYXRldGltZS5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBmb3JtYWwgcHVibGljIGlkZW50aWZpZXIsIGFzIHBlciBbSVNPODg3OV0gLS0+Ci08IUVOVElUWSAlIEZQSS5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBhIGxhbmd1YWdlIGNvZGUsIGFzIHBlciBbUkZDMzA2Nl0gLS0+Ci08IUVOVElUWSAlIExhbmd1YWdlQ29kZS5kYXRhdHlwZSAiTk1UT0tFTiIgPgotCi08IS0tIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyLCBzZWUgW1VSSV0gLS0+Ci08IUVOVElUWSAlIFVSSS5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnMsIHNlZSBbVVJJXSAtLT4KLTwhRU5USVRZICUgVVJJcy5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBlbmQgb2YgeGh0bWwtZGF0YXR5cGVzLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gcGxhY2Vob2xkZXIgZm9yIFhMaW5rIHN1cHBvcnQgbW9kdWxlIC0tPgotPCFFTlRJVFkgJSB4aHRtbC14bGluay5tb2QgIiIgPgotCi0KLTwhRU5USVRZICUgeGh0bWwtcW5hbWUubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtcW5hbWUubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtcW5hbWUubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBRdWFsaWZpZWQgTmFtZXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1xbmFtZS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgUW5hbWUgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXFuYW1lLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIFF1YWxpZmllZCBOYW1lcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXFuYW1lLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSMyMDAwLTEwLTIyOiBhZGRlZCBxbmFtZSBkZWNsYXJhdGlvbnMgZm9yIHJ1YnkgZWxlbWVudHMKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gWEhUTUwgUW5hbWUgKFF1YWxpZmllZCBOYW1lKSBNb2R1bGUKLQotICAgICBUaGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4gdHdvIHBhcnRzLCBsYWJlbGVkIFNlY3Rpb24gJ0EnIGFuZCAnQic6Ci0KLSAgICAgICBTZWN0aW9uIEEgZGVjbGFyZXMgcGFyYW1ldGVyIGVudGl0aWVzIHRvIHN1cHBvcnQgbmFtZXNwYWNlLQotICAgICAgIHF1YWxpZmllZCBuYW1lcywgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucywgYW5kIG5hbWUgcHJlZml4aW5nCi0gICAgICAgZm9yIFhIVE1MIGFuZCBleHRlbnNpb25zLgotCi0gICAgICAgU2VjdGlvbiBCIGRlY2xhcmVzIHBhcmFtZXRlciBlbnRpdGllcyB1c2VkIHRvIHByb3ZpZGUKLSAgICAgICBuYW1lc3BhY2UtcXVhbGlmaWVkIG5hbWVzIGZvciBhbGwgWEhUTUwgZWxlbWVudCB0eXBlczoKLQotICAgICAgICAgJWFwcGxldC5xbmFtZTsgICB0aGUgeG1sbnMtcXVhbGlmaWVkIG5hbWUgZm9yIDxhcHBsZXQ+Ci0gICAgICAgICAlYmFzZS5xbmFtZTsgICAgIHRoZSB4bWxucy1xdWFsaWZpZWQgbmFtZSBmb3IgPGJhc2U+Ci0gICAgICAgICAuLi4KLQotICAgICBYSFRNTCBleHRlbnNpb25zIHdvdWxkIGNyZWF0ZSBhIG1vZHVsZSBzaW1pbGFyIHRvIHRoaXMgb25lLgotICAgICBJbmNsdWRlZCBpbiB0aGUgWEhUTUwgZGlzdHJpYnV0aW9uIGlzIGEgdGVtcGxhdGUgbW9kdWxlCi0gICAgICgndGVtcGxhdGUtcW5hbWUtMS5tb2QnKSBzdWl0YWJsZSBmb3IgdGhpcyBwdXJwb3NlLgotLS0+Ci0KLTwhLS0gU2VjdGlvbiBBOiBYSFRNTCBYTUwgTmFtZXNwYWNlIEZyYW1ld29yayA6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OiAtLT4KLQotPCEtLSAxLiBEZWNsYXJlIGEgJVhIVE1MLnByZWZpeGVkOyBjb25kaXRpb25hbCBzZWN0aW9uIGtleXdvcmQsIHVzZWQKLSAgICAgICAgdG8gYWN0aXZhdGUgbmFtZXNwYWNlIHByZWZpeGluZy4gVGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkCi0gICAgICAgIGluaGVyaXQgJyVOUy5wcmVmaXhlZDsnIGZyb20gdGhlIERURCBkcml2ZXIsIHNvIHRoYXQgdW5sZXNzCi0gICAgICAgIG92ZXJyaWRkZW4sIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb2xsb3dzIHRoZSBvdmVyYWxsIERURAotICAgICAgICBwcmVmaXhpbmcgc2NoZW1lLgotLS0+Ci08IUVOVElUWSAlIE5TLnByZWZpeGVkICJJR05PUkUiID4KLTwhRU5USVRZICUgWEhUTUwucHJlZml4ZWQgIiVOUy5wcmVmaXhlZDsiID4KLQotPCEtLSAyLiBEZWNsYXJlIGEgcGFyYW1ldGVyIGVudGl0eSAoZWcuLCAlWEhUTUwueG1sbnM7KSBjb250YWluaW5nCi0gICAgICAgIHRoZSBVUkkgcmVmZXJlbmNlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIFhIVE1MIG5hbWVzcGFjZToKLS0tPgotPCFFTlRJVFkgJSBYSFRNTC54bWxucyAgImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiID4KLQotPCEtLSAzLiBEZWNsYXJlIHBhcmFtZXRlciBlbnRpdGllcyAoZWcuLCAlWEhUTUwucHJlZml4OykgY29udGFpbmluZwotICAgICAgICB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgcHJlZml4IHN0cmluZyhzKSB0byB1c2Ugd2hlbiBwcmVmaXhpbmcKLSAgICAgICAgaXMgZW5hYmxlZC4gVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiBpbiB0aGUgRFREIGRyaXZlciBvciB0aGUKLSAgICAgICAgaW50ZXJuYWwgc3Vic2V0IG9mIGFuIGRvY3VtZW50IGluc3RhbmNlLiBJZiBubyBkZWZhdWx0IHByZWZpeAotICAgICAgICBpcyBkZXNpcmVkLCB0aGlzIG1heSBiZSBkZWNsYXJlZCBhcyBhbiBlbXB0eSBzdHJpbmcuCi0KLSAgICAgTk9URTogQXMgc3BlY2lmaWVkIGluIFtYTUxOQU1FU10sIHRoZSBuYW1lc3BhY2UgcHJlZml4IHNlcnZlcwotICAgICBhcyBhIHByb3h5IGZvciB0aGUgVVJJIHJlZmVyZW5jZSwgYW5kIGlzIG5vdCBpbiBpdHNlbGYgc2lnbmlmaWNhbnQuCi0tLT4KLTwhRU5USVRZICUgWEhUTUwucHJlZml4ICAiIiA+Ci0KLTwhLS0gNC4gRGVjbGFyZSBwYXJhbWV0ZXIgZW50aXRpZXMgKGVnLiwgJVhIVE1MLnBmeDspIGNvbnRhaW5pbmcgdGhlCi0gICAgICAgIGNvbG9uaXplZCBwcmVmaXgoZXMpIChlZy4sICclWEhUTUwucHJlZml4OzonKSB1c2VkIHdoZW4KLSAgICAgICAgcHJlZml4aW5nIGlzIGFjdGl2ZSwgYW4gZW1wdHkgc3RyaW5nIHdoZW4gaXQgaXMgbm90LgotLS0+Ci08IVslWEhUTUwucHJlZml4ZWQ7WwotPCFFTlRJVFkgJSBYSFRNTC5wZnggICIlWEhUTUwucHJlZml4OzoiID4KLV1dPgotPCFFTlRJVFkgJSBYSFRNTC5wZnggICIiID4KLQotPCEtLSBkZWNsYXJlIHF1YWxpZmllZCBuYW1lIGV4dGVuc2lvbnMgaGVyZSAuLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXFuYW1lLWV4dHJhLm1vZCAiIiA+Ci0KLQotPCEtLSA1LiBUaGUgcGFyYW1ldGVyIGVudGl0eSAlWEhUTUwueG1sbnMuZXh0cmEuYXR0cmliOyBtYXkgYmUKLSAgICAgICAgcmVkZWNsYXJlZCB0byBjb250YWluIGFueSBub24tWEhUTUwgbmFtZXNwYWNlIGRlY2xhcmF0aW9uCi0gICAgICAgIGF0dHJpYnV0ZXMgZm9yIG5hbWVzcGFjZXMgZW1iZWRkZWQgaW4gWEhUTUwuIFRoZSBkZWZhdWx0Ci0gICAgICAgIGlzIGFuIGVtcHR5IHN0cmluZy4gIFhMaW5rIHNob3VsZCBiZSBpbmNsdWRlZCBoZXJlIGlmIHVzZWQKLSAgICAgICAgaW4gdGhlIERURC4KLS0tPgotPCFFTlRJVFkgJSBYSFRNTC54bWxucy5leHRyYS5hdHRyaWIgIiIgPgotCi08IS0tIFRoZSByZW1haW5kZXIgb2YgU2VjdGlvbiBBIGlzIG9ubHkgZm9sbG93ZWQgaW4gWEhUTUwsIG5vdCBleHRlbnNpb25zLiAtLT4KLQotPCEtLSBEZWNsYXJlIGEgcGFyYW1ldGVyIGVudGl0eSAlTlMuZGVjbC5hdHRyaWI7IGNvbnRhaW5pbmcKLSAgICAgYWxsIFhNTCBOYW1lc3BhY2UgZGVjbGFyYXRpb25zIHVzZWQgaW4gdGhlIERURCwgcGx1cyB0aGUKLSAgICAgeG1sbnMgZGVjbGFyYXRpb24gZm9yIFhIVE1MLCBpdHMgZm9ybSBkZXBlbmRlbnQgb24gd2hldGhlcgotICAgICBwcmVmaXhpbmcgaXMgYWN0aXZlLgotLS0+Ci08IVslWEhUTUwucHJlZml4ZWQ7WwotPCFFTlRJVFkgJSBOUy5kZWNsLmF0dHJpYgotICAgICAieG1sbnM6JVhIVE1MLnByZWZpeDsgICVVUkkuZGF0YXR5cGU7ICAgI0ZJWEVEICclWEhUTUwueG1sbnM7JwotICAgICAgJVhIVE1MLnhtbG5zLmV4dHJhLmF0dHJpYjsiCi0+Ci1dXT4KLTwhRU5USVRZICUgTlMuZGVjbC5hdHRyaWIKLSAgICAgIiVYSFRNTC54bWxucy5leHRyYS5hdHRyaWI7IgotPgotCi08IS0tIFRoaXMgaXMgYSBwbGFjZWhvbGRlciBmb3IgZnV0dXJlIFhMaW5rIHN1cHBvcnQuCi0tLT4KLTwhRU5USVRZICUgWExJTksueG1sbnMuYXR0cmliICIiID4KLQotPCEtLSBEZWNsYXJlIGEgcGFyYW1ldGVyIGVudGl0eSAlTlMuZGVjbC5hdHRyaWI7IGNvbnRhaW5pbmcgYWxsCi0gICAgIFhNTCBuYW1lc3BhY2UgZGVjbGFyYXRpb24gYXR0cmlidXRlcyB1c2VkIGJ5IFhIVE1MLCBpbmNsdWRpbmcKLSAgICAgYSBkZWZhdWx0IHhtbG5zIGF0dHJpYnV0ZSB3aGVuIHByZWZpeGluZyBpcyBpbmFjdGl2ZS4KLS0tPgotPCFbJVhIVE1MLnByZWZpeGVkO1sKLTwhRU5USVRZICUgWEhUTUwueG1sbnMuYXR0cmliCi0gICAgICIlTlMuZGVjbC5hdHRyaWI7Ci0gICAgICAlWExJTksueG1sbnMuYXR0cmliOyIKLT4KLV1dPgotPCFFTlRJVFkgJSBYSFRNTC54bWxucy5hdHRyaWIKLSAgICAgInhtbG5zICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0ZJWEVEICclWEhUTUwueG1sbnM7JwotICAgICAgJVhMSU5LLnhtbG5zLmF0dHJpYjsiCi0+Ci0KLTwhLS0gcGxhY2Vob2xkZXIgZm9yIHF1YWxpZmllZCBuYW1lIHJlZGVjbGFyYXRpb25zIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1xbmFtZS5yZWRlY2wgIiIgPgotCi0KLTwhLS0gU2VjdGlvbiBCOiBYSFRNTCBRdWFsaWZpZWQgTmFtZXMgOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjogLS0+Ci0KLTwhLS0gNi4gVGhpcyBzZWN0aW9uIGRlY2xhcmVzIHBhcmFtZXRlciBlbnRpdGllcyB1c2VkIHRvIHByb3ZpZGUKLSAgICAgICAgbmFtZXNwYWNlLXF1YWxpZmllZCBuYW1lcyBmb3IgYWxsIFhIVE1MIGVsZW1lbnQgdHlwZXMuCi0tLT4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1hcHBsZXQtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGFwcGxldC5xbmFtZSAgIiVYSFRNTC5wZng7YXBwbGV0IiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYmFzZS0xLm1vZCAtLT4KLTwhRU5USVRZICUgYmFzZS5xbmFtZSAgICAiJVhIVE1MLnBmeDtiYXNlIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtYmRvLTEubW9kIC0tPgotPCFFTlRJVFkgJSBiZG8ucW5hbWUgICAgICIlWEhUTUwucGZ4O2JkbyIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWJsa3BocmFzLTEubW9kIC0tPgotPCFFTlRJVFkgJSBhZGRyZXNzLnFuYW1lICIlWEhUTUwucGZ4O2FkZHJlc3MiID4KLTwhRU5USVRZICUgYmxvY2txdW90ZS5xbmFtZSAgIiVYSFRNTC5wZng7YmxvY2txdW90ZSIgPgotPCFFTlRJVFkgJSBwcmUucW5hbWUgICAgICIlWEhUTUwucGZ4O3ByZSIgPgotPCFFTlRJVFkgJSBoMS5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2gxIiA+Ci08IUVOVElUWSAlIGgyLnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDIiID4KLTwhRU5USVRZICUgaDMucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoMyIgPgotPCFFTlRJVFkgJSBoNC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2g0IiA+Ci08IUVOVElUWSAlIGg1LnFuYW1lICAgICAgIiVYSFRNTC5wZng7aDUiID4KLTwhRU5USVRZICUgaDYucW5hbWUgICAgICAiJVhIVE1MLnBmeDtoNiIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWJsa3ByZXMtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGhyLnFuYW1lICAgICAgIiVYSFRNTC5wZng7aHIiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1ibGtzdHJ1Y3QtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGRpdi5xbmFtZSAgICAgIiVYSFRNTC5wZng7ZGl2IiA+Ci08IUVOVElUWSAlIHAucW5hbWUgICAgICAgIiVYSFRNTC5wZng7cCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWVkaXQtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGlucy5xbmFtZSAgICAgIiVYSFRNTC5wZng7aW5zIiA+Ci08IUVOVElUWSAlIGRlbC5xbmFtZSAgICAgIiVYSFRNTC5wZng7ZGVsIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtZm9ybS0xLm1vZCAtLT4KLTwhRU5USVRZICUgZm9ybS5xbmFtZSAgICAiJVhIVE1MLnBmeDtmb3JtIiA+Ci08IUVOVElUWSAlIGxhYmVsLnFuYW1lICAgIiVYSFRNTC5wZng7bGFiZWwiID4KLTwhRU5USVRZICUgaW5wdXQucW5hbWUgICAiJVhIVE1MLnBmeDtpbnB1dCIgPgotPCFFTlRJVFkgJSBzZWxlY3QucW5hbWUgICIlWEhUTUwucGZ4O3NlbGVjdCIgPgotPCFFTlRJVFkgJSBvcHRncm91cC5xbmFtZSAgIiVYSFRNTC5wZng7b3B0Z3JvdXAiID4KLTwhRU5USVRZICUgb3B0aW9uLnFuYW1lICAiJVhIVE1MLnBmeDtvcHRpb24iID4KLTwhRU5USVRZICUgdGV4dGFyZWEucW5hbWUgICIlWEhUTUwucGZ4O3RleHRhcmVhIiA+Ci08IUVOVElUWSAlIGZpZWxkc2V0LnFuYW1lICAiJVhIVE1MLnBmeDtmaWVsZHNldCIgPgotPCFFTlRJVFkgJSBsZWdlbmQucW5hbWUgICIlWEhUTUwucGZ4O2xlZ2VuZCIgPgotPCFFTlRJVFkgJSBidXR0b24ucW5hbWUgICIlWEhUTUwucGZ4O2J1dHRvbiIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWh5cGVydGV4dC0xLm1vZCAtLT4KLTwhRU5USVRZICUgYS5xbmFtZSAgICAgICAiJVhIVE1MLnBmeDthIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaW1hZ2UtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGltZy5xbmFtZSAgICAgIiVYSFRNTC5wZng7aW1nIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtaW5scGhyYXMtMS5tb2QgLS0+Ci08IUVOVElUWSAlIGFiYnIucW5hbWUgICAgIiVYSFRNTC5wZng7YWJiciIgPgotPCFFTlRJVFkgJSBhY3JvbnltLnFuYW1lICIlWEhUTUwucGZ4O2Fjcm9ueW0iID4KLTwhRU5USVRZICUgY2l0ZS5xbmFtZSAgICAiJVhIVE1MLnBmeDtjaXRlIiA+Ci08IUVOVElUWSAlIGNvZGUucW5hbWUgICAgIiVYSFRNTC5wZng7Y29kZSIgPgotPCFFTlRJVFkgJSBkZm4ucW5hbWUgICAgICIlWEhUTUwucGZ4O2RmbiIgPgotPCFFTlRJVFkgJSBlbS5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2VtIiA+Ci08IUVOVElUWSAlIGtiZC5xbmFtZSAgICAgIiVYSFRNTC5wZng7a2JkIiA+Ci08IUVOVElUWSAlIHEucW5hbWUgICAgICAgIiVYSFRNTC5wZng7cSIgPgotPCFFTlRJVFkgJSBzYW1wLnFuYW1lICAgICIlWEhUTUwucGZ4O3NhbXAiID4KLTwhRU5USVRZICUgc3Ryb25nLnFuYW1lICAiJVhIVE1MLnBmeDtzdHJvbmciID4KLTwhRU5USVRZICUgdmFyLnFuYW1lICAgICAiJVhIVE1MLnBmeDt2YXIiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pbmxwcmVzLTEubW9kIC0tPgotPCFFTlRJVFkgJSBiLnFuYW1lICAgICAgICIlWEhUTUwucGZ4O2IiID4KLTwhRU5USVRZICUgYmlnLnFuYW1lICAgICAiJVhIVE1MLnBmeDtiaWciID4KLTwhRU5USVRZICUgaS5xbmFtZSAgICAgICAiJVhIVE1MLnBmeDtpIiA+Ci08IUVOVElUWSAlIHNtYWxsLnFuYW1lICAgIiVYSFRNTC5wZng7c21hbGwiID4KLTwhRU5USVRZICUgc3ViLnFuYW1lICAgICAiJVhIVE1MLnBmeDtzdWIiID4KLTwhRU5USVRZICUgc3VwLnFuYW1lICAgICAiJVhIVE1MLnBmeDtzdXAiID4KLTwhRU5USVRZICUgdHQucW5hbWUgICAgICAiJVhIVE1MLnBmeDt0dCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLWlubHN0cnVjdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgYnIucW5hbWUgICAgICAiJVhIVE1MLnBmeDticiIgPgotPCFFTlRJVFkgJSBzcGFuLnFuYW1lICAgICIlWEhUTUwucGZ4O3NwYW4iID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pc21hcC0xLm1vZCAoYWxzbyBjc2lzbWFwLCBzc2lzbWFwKSAtLT4KLTwhRU5USVRZICUgbWFwLnFuYW1lICAgICAiJVhIVE1MLnBmeDttYXAiID4KLTwhRU5USVRZICUgYXJlYS5xbmFtZSAgICAiJVhIVE1MLnBmeDthcmVhIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtbGluay0xLm1vZCAtLT4KLTwhRU5USVRZICUgbGluay5xbmFtZSAgICAiJVhIVE1MLnBmeDtsaW5rIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtbGlzdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgZGwucW5hbWUgICAgICAiJVhIVE1MLnBmeDtkbCIgPgotPCFFTlRJVFkgJSBkdC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O2R0IiA+Ci08IUVOVElUWSAlIGRkLnFuYW1lICAgICAgIiVYSFRNTC5wZng7ZGQiID4KLTwhRU5USVRZICUgb2wucW5hbWUgICAgICAiJVhIVE1MLnBmeDtvbCIgPgotPCFFTlRJVFkgJSB1bC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3VsIiA+Ci08IUVOVElUWSAlIGxpLnFuYW1lICAgICAgIiVYSFRNTC5wZng7bGkiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1tZXRhLTEubW9kIC0tPgotPCFFTlRJVFkgJSBtZXRhLnFuYW1lICAgICIlWEhUTUwucGZ4O21ldGEiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1wYXJhbS0xLm1vZCAtLT4KLTwhRU5USVRZICUgcGFyYW0ucW5hbWUgICAiJVhIVE1MLnBmeDtwYXJhbSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLW9iamVjdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgb2JqZWN0LnFuYW1lICAiJVhIVE1MLnBmeDtvYmplY3QiID4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1zY3JpcHQtMS5tb2QgLS0+Ci08IUVOVElUWSAlIHNjcmlwdC5xbmFtZSAgIiVYSFRNTC5wZng7c2NyaXB0IiA+Ci08IUVOVElUWSAlIG5vc2NyaXB0LnFuYW1lICAiJVhIVE1MLnBmeDtub3NjcmlwdCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXN0cnVjdC0xLm1vZCAtLT4KLTwhRU5USVRZICUgaHRtbC5xbmFtZSAgICAiJVhIVE1MLnBmeDtodG1sIiA+Ci08IUVOVElUWSAlIGhlYWQucW5hbWUgICAgIiVYSFRNTC5wZng7aGVhZCIgPgotPCFFTlRJVFkgJSB0aXRsZS5xbmFtZSAgICIlWEhUTUwucGZ4O3RpdGxlIiA+Ci08IUVOVElUWSAlIGJvZHkucW5hbWUgICAgIiVYSFRNTC5wZng7Ym9keSIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXN0eWxlLTEubW9kIC0tPgotPCFFTlRJVFkgJSBzdHlsZS5xbmFtZSAgICIlWEhUTUwucGZ4O3N0eWxlIiA+Ci0KLTwhLS0gbW9kdWxlOiAgeGh0bWwtdGFibGUtMS5tb2QgLS0+Ci08IUVOVElUWSAlIHRhYmxlLnFuYW1lICAgIiVYSFRNTC5wZng7dGFibGUiID4KLTwhRU5USVRZICUgY2FwdGlvbi5xbmFtZSAiJVhIVE1MLnBmeDtjYXB0aW9uIiA+Ci08IUVOVElUWSAlIHRoZWFkLnFuYW1lICAgIiVYSFRNTC5wZng7dGhlYWQiID4KLTwhRU5USVRZICUgdGZvb3QucW5hbWUgICAiJVhIVE1MLnBmeDt0Zm9vdCIgPgotPCFFTlRJVFkgJSB0Ym9keS5xbmFtZSAgICIlWEhUTUwucGZ4O3Rib2R5IiA+Ci08IUVOVElUWSAlIGNvbGdyb3VwLnFuYW1lICAiJVhIVE1MLnBmeDtjb2xncm91cCIgPgotPCFFTlRJVFkgJSBjb2wucW5hbWUgICAgICIlWEhUTUwucGZ4O2NvbCIgPgotPCFFTlRJVFkgJSB0ci5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3RyIiA+Ci08IUVOVElUWSAlIHRoLnFuYW1lICAgICAgIiVYSFRNTC5wZng7dGgiID4KLTwhRU5USVRZICUgdGQucW5hbWUgICAgICAiJVhIVE1MLnBmeDt0ZCIgPgotCi08IS0tIG1vZHVsZTogIHhodG1sLXJ1YnktMS5tb2QgLS0+Ci0KLTwhRU5USVRZICUgcnVieS5xbmFtZSAgICAiJVhIVE1MLnBmeDtydWJ5IiA+Ci08IUVOVElUWSAlIHJiYy5xbmFtZSAgICAgIiVYSFRNTC5wZng7cmJjIiA+Ci08IUVOVElUWSAlIHJ0Yy5xbmFtZSAgICAgIiVYSFRNTC5wZng7cnRjIiA+Ci08IUVOVElUWSAlIHJiLnFuYW1lICAgICAgIiVYSFRNTC5wZng7cmIiID4KLTwhRU5USVRZICUgcnQucW5hbWUgICAgICAiJVhIVE1MLnBmeDtydCIgPgotPCFFTlRJVFkgJSBycC5xbmFtZSAgICAgICIlWEhUTUwucGZ4O3JwIiA+Ci0KLTwhLS0gUHJvdmlzaW9uYWwgWEhUTUwgMi4wIFF1YWxpZmllZCBOYW1lcyAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBtb2R1bGU6ICB4aHRtbC1pbWFnZS0yLm1vZCAtLT4KLTwhRU5USVRZICUgYWx0LnFuYW1lICAgICAiJVhIVE1MLnBmeDthbHQiID4KLQotPCEtLSBlbmQgb2YgeGh0bWwtcW5hbWUtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1ldmVudHMubW9kdWxlICJJR05PUkUiID4KLTwhWyV4aHRtbC1ldmVudHMubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtZXZlbnRzLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgSW50cmluc2ljIEV2ZW50cyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWV2ZW50cy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBJbnRyaW5zaWMgRXZlbnRzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1ldmVudHMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgSW50cmluc2ljIEV2ZW50cyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWV2ZW50cy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbnRyaW5zaWMgRXZlbnQgQXR0cmlidXRlcwotCi0gICAgIFRoZXNlIGFyZSB0aGUgZXZlbnQgYXR0cmlidXRlcyBkZWZpbmVkIGluIEhUTUwgNC4wLAotICAgICBTZWN0aW9uIDE4LjIuMyAiSW50cmluc2ljIEV2ZW50cyIuIFRoaXMgbW9kdWxlIG11c3QgYmUKLSAgICAgaW5zdGFudGlhdGVkIHByaW9yIHRvIHRoZSBBdHRyaWJ1dGVzIE1vZHVsZSBidXQgYWZ0ZXIKLSAgICAgdGhlIERhdGF0eXBlIE1vZHVsZSBpbiB0aGUgTW9kdWxhciBGcmFtZXdvcmsgbW9kdWxlLgotCi0gICAgIk5vdGU6IEF1dGhvcnMgb2YgSFRNTCBkb2N1bWVudHMgYXJlIGFkdmlzZWQgdGhhdCBjaGFuZ2VzCi0gICAgIGFyZSBsaWtlbHkgdG8gb2NjdXIgaW4gdGhlIHJlYWxtIG9mIGludHJpbnNpYyBldmVudHMKLSAgICAgKGUuZy4sIGhvdyBzY3JpcHRzIGFyZSBib3VuZCB0byBldmVudHMpLiBSZXNlYXJjaCBpbgotICAgICB0aGlzIHJlYWxtIGlzIGNhcnJpZWQgb24gYnkgbWVtYmVycyBvZiB0aGUgVzNDIERvY3VtZW50Ci0gICAgIE9iamVjdCBNb2RlbCBXb3JraW5nIEdyb3VwIChzZWUgdGhlIFczQyBXZWIgc2l0ZSBhdAotICAgICBodHRwOi8vd3d3LnczLm9yZy8gZm9yIG1vcmUgaW5mb3JtYXRpb24pLiIKLS0tPgotPCEtLSBOT1RFOiBCZWNhdXNlIHRoZSBBVFRMSVNUIGRlY2xhcmF0aW9ucyBpbiB0aGlzIG1vZHVsZSBvY2N1cgotICAgICBiZWZvcmUgdGhlaXIgcmVzcGVjdGl2ZSBFTEVNRU5UIGRlY2xhcmF0aW9ucyBpbiBvdGhlcgotICAgICBtb2R1bGVzLCB0aGVyZSBtYXkgYmUgYSBkZXBlbmRlbmN5IG9uIHRoaXMgbW9kdWxlIHRoYXQKLSAgICAgc2hvdWxkIGJlIGNvbnNpZGVyZWQgaWYgYW55IG9mIHRoZSBwYXJhbWV0ZXIgZW50aXRpZXMgdXNlZAotICAgICBmb3IgZWxlbWVudCB0eXBlIG5hbWVzIChlZy4sICVhLnFuYW1lOykgYXJlIHJlZGVjbGFyZWQuCi0tLT4KLQotPCFFTlRJVFkgJSBFdmVudHMuYXR0cmliCi0gICAgICJvbmNsaWNrICAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbmRibGNsaWNrICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbm1vdXNlZG93biAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbm1vdXNldXAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbm1vdXNlb3ZlciAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbm1vdXNlbW92ZSAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbm1vdXNlb3V0ICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbmtleXByZXNzICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbmtleWRvd24gICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbmtleXVwICAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVEIgotPgotCi08IS0tIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBvbiBhbmNob3IgZWxlbWVudAotLS0+Ci08IUFUVExJU1QgJWEucW5hbWU7Ci0gICAgIG9uZm9jdXMgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgICNJTVBMSUVECi0gICAgIG9uYmx1ciAgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgICNJTVBMSUVECi0+Ci0KLTwhLS0gYWRkaXRpb25hbCBhdHRyaWJ1dGVzIG9uIGZvcm0gZWxlbWVudAotLS0+Ci08IUFUVExJU1QgJWZvcm0ucW5hbWU7Ci0gICAgICBvbnN1Ym1pdCAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBvbnJlc2V0ICAgICAgJVNjcmlwdC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci0KLTwhLS0gYWRkaXRpb25hbCBhdHRyaWJ1dGVzIG9uIGxhYmVsIGVsZW1lbnQKLS0tPgotPCFBVFRMSVNUICVsYWJlbC5xbmFtZTsKLSAgICAgIG9uZm9jdXMgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9uYmx1ciAgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgb24gaW5wdXQgZWxlbWVudAotLS0+Ci08IUFUVExJU1QgJWlucHV0LnFuYW1lOwotICAgICAgb25mb2N1cyAgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25ibHVyICAgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25zZWxlY3QgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25jaGFuZ2UgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotCi08IS0tIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBvbiBzZWxlY3QgZWxlbWVudAotLS0+Ci08IUFUVExJU1QgJXNlbGVjdC5xbmFtZTsKLSAgICAgIG9uZm9jdXMgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9uYmx1ciAgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9uY2hhbmdlICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgb24gdGV4dGFyZWEgZWxlbWVudAotLS0+Ci08IUFUVExJU1QgJXRleHRhcmVhLnFuYW1lOwotICAgICAgb25mb2N1cyAgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25ibHVyICAgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25zZWxlY3QgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgb25jaGFuZ2UgICAgICVTY3JpcHQuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotCi08IS0tIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBvbiBidXR0b24gZWxlbWVudAotLS0+Ci08IUFUVExJU1QgJWJ1dHRvbi5xbmFtZTsKLSAgICAgIG9uZm9jdXMgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9uYmx1ciAgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgb24gYm9keSBlbGVtZW50Ci0tLT4KLTwhQVRUTElTVCAlYm9keS5xbmFtZTsKLSAgICAgIG9ubG9hZCAgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9udW5sb2FkICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgb24gYXJlYSBlbGVtZW50Ci0tLT4KLTwhQVRUTElTVCAlYXJlYS5xbmFtZTsKLSAgICAgIG9uZm9jdXMgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG9uYmx1ciAgICAgICAlU2NyaXB0LmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtZXZlbnRzLTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtYXR0cmlicy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1hdHRyaWJzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWF0dHJpYnMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBDb21tb24gQXR0cmlidXRlcyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWF0dHJpYnMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQ29tbW9uIEF0dHJpYnV0ZXMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtYXR0cmlicy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTlRJVElFUyBYSFRNTCBDb21tb24gQXR0cmlidXRlcyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWF0dHJpYnMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQ29tbW9uIEF0dHJpYnV0ZXMKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyBtYW55IG9mIHRoZSBjb21tb24gYXR0cmlidXRlcyBmb3IgdGhlIFhIVE1MIERURC4KLSAgICAgJU5TLmRlY2wuYXR0cmliOyBpcyBkZWNsYXJlZCBpbiB0aGUgWEhUTUwgUW5hbWUgbW9kdWxlLgotLS0+Ci0KLTwhRU5USVRZICUgaWQuYXR0cmliCi0gICAgICJpZCAgICAgICAgICAgSUQgICAgICAgICAgICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IUVOVElUWSAlIGNsYXNzLmF0dHJpYgotICAgICAiY2xhc3MgICAgICAgIE5NVE9LRU5TICAgICAgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCFFTlRJVFkgJSB0aXRsZS5hdHRyaWIKLSAgICAgInRpdGxlICAgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhRU5USVRZICUgQ29yZS5leHRyYS5hdHRyaWIgIiIgPgotCi08IUVOVElUWSAlIENvcmUuYXR0cmliCi0gICAgICIlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJWlkLmF0dHJpYjsKLSAgICAgICVjbGFzcy5hdHRyaWI7Ci0gICAgICAldGl0bGUuYXR0cmliOwotICAgICAgJUNvcmUuZXh0cmEuYXR0cmliOyIKLT4KLQotPCFFTlRJVFkgJSBsYW5nLmF0dHJpYgotICAgICAieG1sOmxhbmcgICAgICVMYW5ndWFnZUNvZGUuZGF0YXR5cGU7ICAjSU1QTElFRCIKLT4KLQotPCFbJVhIVE1MLmJpZGk7WwotPCFFTlRJVFkgJSBkaXIuYXR0cmliCi0gICAgICJkaXIgICAgICAgICAgKCBsdHIgfCBydGwgKSAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IUVOVElUWSAlIEkxOG4uYXR0cmliCi0gICAgICIlZGlyLmF0dHJpYjsKLSAgICAgICVsYW5nLmF0dHJpYjsiCi0+Ci0KLV1dPgotPCFFTlRJVFkgJSBJMThuLmF0dHJpYgotICAgICAiJWxhbmcuYXR0cmliOyIKLT4KLQotPCFFTlRJVFkgJSBDb21tb24uZXh0cmEuYXR0cmliICIiID4KLQotPCEtLSBpbnRyaW5zaWMgZXZlbnQgYXR0cmlidXRlcyBkZWNsYXJlZCBwcmV2aW91c2x5Ci0tLT4KLTwhRU5USVRZICUgRXZlbnRzLmF0dHJpYiAiIiA+Ci0KLTwhRU5USVRZICUgQ29tbW9uLmF0dHJpYgotICAgICAiJUNvcmUuYXR0cmliOwotICAgICAgJUkxOG4uYXR0cmliOwotICAgICAgJUV2ZW50cy5hdHRyaWI7Ci0gICAgICAlQ29tbW9uLmV4dHJhLmF0dHJpYjsiCi0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWF0dHJpYnMtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBwbGFjZWhvbGRlciBmb3IgY29udGVudCBtb2RlbCByZWRlY2xhcmF0aW9ucyAtLT4KLTwhRU5USVRZICUgeGh0bWwtbW9kZWwucmVkZWNsICIiID4KLQotCi08IUVOVElUWSAlIHhodG1sLW1vZGVsLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLW1vZGVsLm1vZHVsZTtbCi08IS0tIGluc3RhbnRpYXRlIHRoZSBEb2N1bWVudCBNb2RlbCBtb2R1bGUgZGVjbGFyZWQgaW4gdGhlIERURCBkcml2ZXIKLS0tPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgMS4xIERvY3VtZW50IE1vZGVsIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sMTEtbW9kZWwtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MIDEuMSwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMCBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIDEuMSBEb2N1bWVudCBNb2RlbCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS1tb2RlbC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBYSFRNTCAxLjEgRG9jdW1lbnQgTW9kZWwKLQotICAgICBUaGlzIG1vZHVsZSBkZXNjcmliZXMgdGhlIGdyb3VwaW5ncyBvZiBlbGVtZW50cyB0aGF0IG1ha2UgdXAKLSAgICAgY29tbW9uIGNvbnRlbnQgbW9kZWxzIGZvciBYSFRNTCBlbGVtZW50cy4KLQotICAgICBYSFRNTCBoYXMgdGhyZWUgYmFzaWMgY29udGVudCBtb2RlbHM6Ci0KLSAgICAgICAgICVJbmxpbmUubWl4OyAgY2hhcmFjdGVyLWxldmVsIGVsZW1lbnRzCi0gICAgICAgICAlQmxvY2subWl4OyAgIGJsb2NrLWxpa2UgZWxlbWVudHMsIGVnLiwgcGFyYWdyYXBocyBhbmQgbGlzdHMKLSAgICAgICAgICVGbG93Lm1peDsgICAgYW55IGJsb2NrIG9yIGlubGluZSBlbGVtZW50cwotCi0gICAgIEFueSBwYXJhbWV0ZXIgZW50aXRpZXMgZGVjbGFyZWQgaW4gdGhpcyBtb2R1bGUgbWF5IGJlIHVzZWQKLSAgICAgdG8gY3JlYXRlIGVsZW1lbnQgY29udGVudCBtb2RlbHMsIGJ1dCB0aGUgYWJvdmUgdGhyZWUgYXJlCi0gICAgIGNvbnNpZGVyZWQgJ2dsb2JhbCcgKGluc29mYXIgYXMgdGhhdCB0ZXJtIGFwcGxpZXMgaGVyZSkuCi0KLSAgICAgVGhlIHJlc2VydmVkIHdvcmQgJyNQQ0RBVEEnIChpbmRpY2F0aW5nIGEgdGV4dCBzdHJpbmcpIGlzIG5vdwotICAgICBpbmNsdWRlZCBleHBsaWNpdGx5IHdpdGggZWFjaCBlbGVtZW50IGRlY2xhcmF0aW9uIHRoYXQgaXMKLSAgICAgZGVjbGFyZWQgYXMgbWl4ZWQgY29udGVudCwgYXMgWE1MIHJlcXVpcmVzIHRoYXQgdGhpcyB0b2tlbgotICAgICBvY2N1ciBmaXJzdCBpbiBhIGNvbnRlbnQgbW9kZWwgc3BlY2lmaWNhdGlvbi4KLS0tPgotPCEtLSBFeHRlbmRpbmcgdGhlIE1vZGVsCi0KLSAgICAgV2hpbGUgaW4gc29tZSBjYXNlcyB0aGlzIG1vZHVsZSBtYXkgbmVlZCB0byBiZSByZXdyaXR0ZW4gdG8KLSAgICAgYWNjb21tb2RhdGUgY2hhbmdlcyB0byB0aGUgZG9jdW1lbnQgbW9kZWwsIG1pbm9yIGV4dGVuc2lvbnMKLSAgICAgbWF5IGJlIGFjY29tcGxpc2hlZCBieSByZWRlY2xhcmluZyBhbnkgb2YgdGhlIHRocmVlICouZXh0cmE7Ci0gICAgIHBhcmFtZXRlciBlbnRpdGllcyB0byBjb250YWluIGV4dGVuc2lvbiBlbGVtZW50IHR5cGVzIGFzIGZvbGxvd3M6Ci0KLSAgICAgICAgICVNaXNjLmV4dHJhOyAgICB3aG9zZSBwYXJlbnQgbWF5IGJlIGFueSBibG9jayBvcgotICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZSBlbGVtZW50LgotCi0gICAgICAgICAlSW5saW5lLmV4dHJhOyAgd2hvc2UgcGFyZW50IG1heSBiZSBhbnkgaW5saW5lIGVsZW1lbnQuCi0KLSAgICAgICAgICVCbG9jay5leHRyYTsgICB3aG9zZSBwYXJlbnQgbWF5IGJlIGFueSBibG9jayBlbGVtZW50LgotCi0gICAgIElmIHVzZWQsIHRoZXNlIHBhcmFtZXRlciBlbnRpdGllcyBtdXN0IGJlIGFuIE9SLXNlcGFyYXRlZAotICAgICBsaXN0IGJlZ2lubmluZyB3aXRoIGFuIE9SIHNlcGFyYXRvciAoInwiKSwgZWcuLCAifCBhIHwgYiB8IGMiCi0KLSAgICAgQWxsIGJsb2NrIGFuZCBpbmxpbmUgKi5jbGFzcyBwYXJhbWV0ZXIgZW50aXRpZXMgbm90IHBhcnQKLSAgICAgb2YgdGhlICpzdHJ1Y3QuY2xhc3MgY2xhc3NlcyBiZWdpbiB3aXRoICJ8ICIgdG8gYWxsb3cgZm9yCi0gICAgIGV4Y2x1c2lvbiBmcm9tIG1peGVzLgotLS0+Ci0KLTwhLS0gLi4uLi4uLi4uLi4uLi4gIE9wdGlvbmFsIEVsZW1lbnRzIGluIGhlYWQgIC4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBIZWFkT3B0cy5taXgKLSAgICAgIiggJXNjcmlwdC5xbmFtZTsgfCAlc3R5bGUucW5hbWU7IHwgJW1ldGEucW5hbWU7Ci0gICAgICB8ICVsaW5rLnFuYW1lOyB8ICVvYmplY3QucW5hbWU7ICkqIgotPgotCi08IS0tIC4uLi4uLi4uLi4uLi4uLi4uICBNaXNjZWxsYW5lb3VzIEVsZW1lbnRzICAuLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gaW5zIGFuZCBkZWwgYXJlIHVzZWQgdG8gZGVub3RlIGVkaXRpbmcgY2hhbmdlcwotLS0+Ci08IUVOVElUWSAlIEVkaXQuY2xhc3MgInwgJWlucy5xbmFtZTsgfCAlZGVsLnFuYW1lOyIgPgotCi08IS0tIHNjcmlwdCBhbmQgbm9zY3JpcHQgYXJlIHVzZWQgdG8gY29udGFpbiBzY3JpcHRzCi0gICAgIGFuZCBhbHRlcm5hdGl2ZSBjb250ZW50Ci0tLT4KLTwhRU5USVRZICUgU2NyaXB0LmNsYXNzICJ8ICVzY3JpcHQucW5hbWU7IHwgJW5vc2NyaXB0LnFuYW1lOyIgPgotCi08IUVOVElUWSAlIE1pc2MuZXh0cmEgIiIgPgotCi08IS0tIFRoZXNlIGVsZW1lbnRzIGFyZSBuZWl0aGVyIGJsb2NrIG5vciBpbmxpbmUsIGFuZCBjYW4KLSAgICAgZXNzZW50aWFsbHkgYmUgdXNlZCBhbnl3aGVyZSBpbiB0aGUgZG9jdW1lbnQgYm9keS4KLS0tPgotPCFFTlRJVFkgJSBNaXNjLmNsYXNzCi0gICAgICIlRWRpdC5jbGFzczsKLSAgICAgICVTY3JpcHQuY2xhc3M7Ci0gICAgICAlTWlzYy5leHRyYTsiCi0+Ci0KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4gIElubGluZSBFbGVtZW50cyAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBJbmxTdHJ1Y3QuY2xhc3MgIiVici5xbmFtZTsgfCAlc3Bhbi5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBJbmxQaHJhcy5jbGFzcwotICAgICAifCAlZW0ucW5hbWU7IHwgJXN0cm9uZy5xbmFtZTsgfCAlZGZuLnFuYW1lOyB8ICVjb2RlLnFuYW1lOwotICAgICAgfCAlc2FtcC5xbmFtZTsgfCAla2JkLnFuYW1lOyB8ICV2YXIucW5hbWU7IHwgJWNpdGUucW5hbWU7Ci0gICAgICB8ICVhYmJyLnFuYW1lOyB8ICVhY3JvbnltLnFuYW1lOyB8ICVxLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIElubFByZXMuY2xhc3MKLSAgICAgInwgJXR0LnFuYW1lOyB8ICVpLnFuYW1lOyB8ICViLnFuYW1lOyB8ICViaWcucW5hbWU7Ci0gICAgICB8ICVzbWFsbC5xbmFtZTsgfCAlc3ViLnFuYW1lOyB8ICVzdXAucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgSTE4bi5jbGFzcyAifCAlYmRvLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIEFuY2hvci5jbGFzcyAifCAlYS5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBJbmxTcGVjaWFsLmNsYXNzCi0gICAgICJ8ICVpbWcucW5hbWU7IHwgJW1hcC5xbmFtZTsKLSAgICAgIHwgJW9iamVjdC5xbmFtZTsiID4KLQotPCFFTlRJVFkgJSBJbmxGb3JtLmNsYXNzCi0gICAgICJ8ICVpbnB1dC5xbmFtZTsgfCAlc2VsZWN0LnFuYW1lOyB8ICV0ZXh0YXJlYS5xbmFtZTsKLSAgICAgIHwgJWxhYmVsLnFuYW1lOyB8ICVidXR0b24ucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgSW5saW5lLmV4dHJhICIiID4KLQotPCFFTlRJVFkgJSBSdWJ5LmNsYXNzICJ8ICVydWJ5LnFuYW1lOyIgPgotCi08IS0tICVJbmxpbmUuY2xhc3M7IGluY2x1ZGVzIGFsbCBpbmxpbmUgZWxlbWVudHMsCi0gICAgIHVzZWQgYXMgYSBjb21wb25lbnQgaW4gbWl4ZXMKLS0tPgotPCFFTlRJVFkgJSBJbmxpbmUuY2xhc3MKLSAgICAgIiVJbmxTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlSW5sUGhyYXMuY2xhc3M7Ci0gICAgICAlSW5sUHJlcy5jbGFzczsKLSAgICAgICVJMThuLmNsYXNzOwotICAgICAgJUFuY2hvci5jbGFzczsKLSAgICAgICVJbmxTcGVjaWFsLmNsYXNzOwotICAgICAgJUlubEZvcm0uY2xhc3M7Ci0gICAgICAlUnVieS5jbGFzczsKLSAgICAgICVJbmxpbmUuZXh0cmE7IgotPgotCi08IS0tICVJbmxOb1J1YnkuY2xhc3M7IGluY2x1ZGVzIGFsbCBpbmxpbmUgZWxlbWVudHMKLSAgICAgZXhjZXB0IHJ1YnksIHVzZWQgYXMgYSBjb21wb25lbnQgaW4gbWl4ZXMKLS0tPgotPCFFTlRJVFkgJSBJbmxOb1J1YnkuY2xhc3MKLSAgICAgIiVJbmxTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlSW5sUGhyYXMuY2xhc3M7Ci0gICAgICAlSW5sUHJlcy5jbGFzczsKLSAgICAgICVJMThuLmNsYXNzOwotICAgICAgJUFuY2hvci5jbGFzczsKLSAgICAgICVJbmxTcGVjaWFsLmNsYXNzOwotICAgICAgJUlubEZvcm0uY2xhc3M7Ci0gICAgICAlSW5saW5lLmV4dHJhOyIKLT4KLQotPCEtLSAlTm9SdWJ5LmNvbnRlbnQ7IGluY2x1ZGVzIGFsbCBpbmxpbmVzIGV4Y2VwdCBydWJ5Ci0tLT4KLTwhRU5USVRZICUgTm9SdWJ5LmNvbnRlbnQKLSAgICAgIiggI1BDREFUQQotICAgICAgfCAlSW5sTm9SdWJ5LmNsYXNzOwotICAgICAgJU1pc2MuY2xhc3M7ICkqIgotPgotCi08IS0tICVJbmxOb0FuY2hvci5jbGFzczsgaW5jbHVkZXMgYWxsIG5vbi1hbmNob3IgaW5saW5lcywKLSAgICAgdXNlZCBhcyBhIGNvbXBvbmVudCBpbiBtaXhlcwotLS0+Ci08IUVOVElUWSAlIElubE5vQW5jaG9yLmNsYXNzCi0gICAgICIlSW5sU3RydWN0LmNsYXNzOwotICAgICAgJUlubFBocmFzLmNsYXNzOwotICAgICAgJUlubFByZXMuY2xhc3M7Ci0gICAgICAlSTE4bi5jbGFzczsKLSAgICAgICVJbmxTcGVjaWFsLmNsYXNzOwotICAgICAgJUlubEZvcm0uY2xhc3M7Ci0gICAgICAlUnVieS5jbGFzczsKLSAgICAgICVJbmxpbmUuZXh0cmE7IgotPgotCi08IS0tICVJbmxOb0FuY2hvci5taXg7IGluY2x1ZGVzIGFsbCBub24tYW5jaG9yIGlubGluZXMKLS0tPgotPCFFTlRJVFkgJSBJbmxOb0FuY2hvci5taXgKLSAgICAgIiVJbmxOb0FuY2hvci5jbGFzczsKLSAgICAgICVNaXNjLmNsYXNzOyIKLT4KLQotPCEtLSAlSW5saW5lLm1peDsgaW5jbHVkZXMgYWxsIGlubGluZSBlbGVtZW50cywgaW5jbHVkaW5nICVNaXNjLmNsYXNzOwotLS0+Ci08IUVOVElUWSAlIElubGluZS5taXgKLSAgICAgIiVJbmxpbmUuY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uICBCbG9jayBFbGVtZW50cyAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbiB0aGUgSFRNTCA0LjAgRFRELCBoZWFkaW5nIGFuZCBsaXN0IGVsZW1lbnRzIHdlcmUgaW5jbHVkZWQKLSAgICAgaW4gdGhlICVibG9jazsgcGFyYW1ldGVyIGVudGl0eS4gVGhlICVIZWFkaW5nLmNsYXNzOyBhbmQKLSAgICAgJUxpc3QuY2xhc3M7IHBhcmFtZXRlciBlbnRpdGllcyBtdXN0IG5vdyBiZSBpbmNsdWRlZCBleHBsaWNpdGx5Ci0gICAgIG9uIGVsZW1lbnQgZGVjbGFyYXRpb25zIHdoZXJlIGRlc2lyZWQuCi0tLT4KLQotPCFFTlRJVFkgJSBIZWFkaW5nLmNsYXNzCi0gICAgICIlaDEucW5hbWU7IHwgJWgyLnFuYW1lOyB8ICVoMy5xbmFtZTsKLSAgICAgIHwgJWg0LnFuYW1lOyB8ICVoNS5xbmFtZTsgfCAlaDYucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgTGlzdC5jbGFzcyAiJXVsLnFuYW1lOyB8ICVvbC5xbmFtZTsgfCAlZGwucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgVGFibGUuY2xhc3MgInwgJXRhYmxlLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIEZvcm0uY2xhc3MgICJ8ICVmb3JtLnFuYW1lOyIgPgotCi08IUVOVElUWSAlIEZpZWxkc2V0LmNsYXNzICAifCAlZmllbGRzZXQucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgQmxrU3RydWN0LmNsYXNzICIlcC5xbmFtZTsgfCAlZGl2LnFuYW1lOyIgPgotCi08IUVOVElUWSAlIEJsa1BocmFzLmNsYXNzCi0gICAgICJ8ICVwcmUucW5hbWU7IHwgJWJsb2NrcXVvdGUucW5hbWU7IHwgJWFkZHJlc3MucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgQmxrUHJlcy5jbGFzcyAifCAlaHIucW5hbWU7IiA+Ci0KLTwhRU5USVRZICUgQmxrU3BlY2lhbC5jbGFzcwotICAgICAiJVRhYmxlLmNsYXNzOwotICAgICAgJUZvcm0uY2xhc3M7Ci0gICAgICAlRmllbGRzZXQuY2xhc3M7IgotPgotCi08IUVOVElUWSAlIEJsb2NrLmV4dHJhICIiID4KLQotPCEtLSAlQmxvY2suY2xhc3M7IGluY2x1ZGVzIGFsbCBibG9jayBlbGVtZW50cywKLSAgICAgdXNlZCBhcyBhbiBjb21wb25lbnQgaW4gbWl4ZXMKLS0tPgotPCFFTlRJVFkgJSBCbG9jay5jbGFzcwotICAgICAiJUJsa1N0cnVjdC5jbGFzczsKLSAgICAgICVCbGtQaHJhcy5jbGFzczsKLSAgICAgICVCbGtQcmVzLmNsYXNzOwotICAgICAgJUJsa1NwZWNpYWwuY2xhc3M7Ci0gICAgICAlQmxvY2suZXh0cmE7IgotPgotCi08IS0tICVCbG9jay5taXg7IGluY2x1ZGVzIGFsbCBibG9jayBlbGVtZW50cyBwbHVzICVNaXNjLmNsYXNzOwotLS0+Ci08IUVOVElUWSAlIEJsb2NrLm1peAotICAgICAiJUhlYWRpbmcuY2xhc3M7Ci0gICAgICB8ICVMaXN0LmNsYXNzOwotICAgICAgfCAlQmxvY2suY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLiAgQWxsIENvbnRlbnQgRWxlbWVudHMgIC4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSAlRmxvdy5taXg7IGluY2x1ZGVzIGFsbCB0ZXh0IGNvbnRlbnQsIGJsb2NrIGFuZCBpbmxpbmUKLS0tPgotPCFFTlRJVFkgJSBGbG93Lm1peAotICAgICAiJUhlYWRpbmcuY2xhc3M7Ci0gICAgICB8ICVMaXN0LmNsYXNzOwotICAgICAgfCAlQmxvY2suY2xhc3M7Ci0gICAgICB8ICVJbmxpbmUuY2xhc3M7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sMTEtbW9kZWwtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1jaGFyZW50Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWNoYXJlbnQubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtY2hhcmVudC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFhIVE1MIENoYXJhY3RlciBFbnRpdGllcyAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWNoYXJlbnQtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQ2hhcmFjdGVyIEVudGl0aWVzIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWNoYXJlbnQtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgWEhUTUwgQ2hhcmFjdGVyIEVudGl0aWVzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtY2hhcmVudC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBDaGFyYWN0ZXIgRW50aXRpZXMgZm9yIFhIVE1MCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIHNldCBvZiBjaGFyYWN0ZXIgZW50aXRpZXMgZm9yIFhIVE1MLAotICAgICBpbmNsdWRpbmcgdGhlIExhdGluIDEsIFN5bWJvbCBhbmQgU3BlY2lhbCBjaGFyYWN0ZXIgY29sbGVjdGlvbnMuCi0tLT4KLQotPCFFTlRJVFkgJSB4aHRtbC1sYXQxCi0gICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIExhdGluIDEgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgICAgInhodG1sLWxhdDEuZW50IiA+Ci08IS0tIFBvcnRpb25zIChDKSBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uIDE5ODYKLSAgICAgUGVybWlzc2lvbiB0byBjb3B5IGluIGFueSBmb3JtIGlzIGdyYW50ZWQgZm9yIHVzZSB3aXRoCi0gICAgIGNvbmZvcm1pbmcgU0dNTCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMgYXMgZGVmaW5lZCBpbgotICAgICBJU08gODg3OSwgcHJvdmlkZWQgdGhpcyBub3RpY2UgaXMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcy4KLS0tPgotPCEtLSBDaGFyYWN0ZXIgZW50aXR5IHNldC4gVHlwaWNhbCBpbnZvY2F0aW9uOgotICAgIDwhRU5USVRZICUgSFRNTGxhdDEgUFVCTElDCi0gICAgICAgIi0vL1czQy8vRU5USVRJRVMgTGF0aW4gMSBmb3IgWEhUTUwvL0VOIgotICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sLWxhdDEuZW50Ij4KLSAgICAlSFRNTGxhdDE7Ci0tLT4KLQotPCFFTlRJVFkgbmJzcCAgICImIzE2MDsiPiA8IS0tIG5vLWJyZWFrIHNwYWNlID0gbm9uLWJyZWFraW5nIHNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBMCBJU09udW0gLS0+Ci08IUVOVElUWSBpZXhjbCAgIiYjMTYxOyI+IDwhLS0gaW52ZXJ0ZWQgZXhjbGFtYXRpb24gbWFyaywgVSswMEExIElTT251bSAtLT4KLTwhRU5USVRZIGNlbnQgICAiJiMxNjI7Ij4gPCEtLSBjZW50IHNpZ24sIFUrMDBBMiBJU09udW0gLS0+Ci08IUVOVElUWSBwb3VuZCAgIiYjMTYzOyI+IDwhLS0gcG91bmQgc2lnbiwgVSswMEEzIElTT251bSAtLT4KLTwhRU5USVRZIGN1cnJlbiAiJiMxNjQ7Ij4gPCEtLSBjdXJyZW5jeSBzaWduLCBVKzAwQTQgSVNPbnVtIC0tPgotPCFFTlRJVFkgeWVuICAgICImIzE2NTsiPiA8IS0tIHllbiBzaWduID0geXVhbiBzaWduLCBVKzAwQTUgSVNPbnVtIC0tPgotPCFFTlRJVFkgYnJ2YmFyICImIzE2NjsiPiA8IS0tIGJyb2tlbiBiYXIgPSBicm9rZW4gdmVydGljYWwgYmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBNiBJU09udW0gLS0+Ci08IUVOVElUWSBzZWN0ICAgIiYjMTY3OyI+IDwhLS0gc2VjdGlvbiBzaWduLCBVKzAwQTcgSVNPbnVtIC0tPgotPCFFTlRJVFkgdW1sICAgICImIzE2ODsiPiA8IS0tIGRpYWVyZXNpcyA9IHNwYWNpbmcgZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBOCBJU09kaWEgLS0+Ci08IUVOVElUWSBjb3B5ICAgIiYjMTY5OyI+IDwhLS0gY29weXJpZ2h0IHNpZ24sIFUrMDBBOSBJU09udW0gLS0+Ci08IUVOVElUWSBvcmRmICAgIiYjMTcwOyI+IDwhLS0gZmVtaW5pbmUgb3JkaW5hbCBpbmRpY2F0b3IsIFUrMDBBQSBJU09udW0gLS0+Ci08IUVOVElUWSBsYXF1byAgIiYjMTcxOyI+IDwhLS0gbGVmdC1wb2ludGluZyBkb3VibGUgYW5nbGUgcXVvdGF0aW9uIG1hcmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxlZnQgcG9pbnRpbmcgZ3VpbGxlbWV0LCBVKzAwQUIgSVNPbnVtIC0tPgotPCFFTlRJVFkgbm90ICAgICImIzE3MjsiPiA8IS0tIG5vdCBzaWduID0gZGlzY3JldGlvbmFyeSBoeXBoZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEFDIElTT251bSAtLT4KLTwhRU5USVRZIHNoeSAgICAiJiMxNzM7Ij4gPCEtLSBzb2Z0IGh5cGhlbiA9IGRpc2NyZXRpb25hcnkgaHlwaGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBBRCBJU09udW0gLS0+Ci08IUVOVElUWSByZWcgICAgIiYjMTc0OyI+IDwhLS0gcmVnaXN0ZXJlZCBzaWduID0gcmVnaXN0ZXJlZCB0cmFkZSBtYXJrIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEFFIElTT251bSAtLT4KLTwhRU5USVRZIG1hY3IgICAiJiMxNzU7Ij4gPCEtLSBtYWNyb24gPSBzcGFjaW5nIG1hY3JvbiA9IG92ZXJsaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBUEwgb3ZlcmJhciwgVSswMEFGIElTT2RpYSAtLT4KLTwhRU5USVRZIGRlZyAgICAiJiMxNzY7Ij4gPCEtLSBkZWdyZWUgc2lnbiwgVSswMEIwIElTT251bSAtLT4KLTwhRU5USVRZIHBsdXNtbiAiJiMxNzc7Ij4gPCEtLSBwbHVzLW1pbnVzIHNpZ24gPSBwbHVzLW9yLW1pbnVzIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEIxIElTT251bSAtLT4KLTwhRU5USVRZIHN1cDIgICAiJiMxNzg7Ij4gPCEtLSBzdXBlcnNjcmlwdCB0d28gPSBzdXBlcnNjcmlwdCBkaWdpdCB0d28KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNxdWFyZWQsIFUrMDBCMiBJU09udW0gLS0+Ci08IUVOVElUWSBzdXAzICAgIiYjMTc5OyI+IDwhLS0gc3VwZXJzY3JpcHQgdGhyZWUgPSBzdXBlcnNjcmlwdCBkaWdpdCB0aHJlZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY3ViZWQsIFUrMDBCMyBJU09udW0gLS0+Ci08IUVOVElUWSBhY3V0ZSAgIiYjMTgwOyI+IDwhLS0gYWN1dGUgYWNjZW50ID0gc3BhY2luZyBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQjQgSVNPZGlhIC0tPgotPCFFTlRJVFkgbWljcm8gICImIzE4MTsiPiA8IS0tIG1pY3JvIHNpZ24sIFUrMDBCNSBJU09udW0gLS0+Ci08IUVOVElUWSBwYXJhICAgIiYjMTgyOyI+IDwhLS0gcGlsY3JvdyBzaWduID0gcGFyYWdyYXBoIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEI2IElTT251bSAtLT4KLTwhRU5USVRZIG1pZGRvdCAiJiMxODM7Ij4gPCEtLSBtaWRkbGUgZG90ID0gR2VvcmdpYW4gY29tbWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEdyZWVrIG1pZGRsZSBkb3QsIFUrMDBCNyBJU09udW0gLS0+Ci08IUVOVElUWSBjZWRpbCAgIiYjMTg0OyI+IDwhLS0gY2VkaWxsYSA9IHNwYWNpbmcgY2VkaWxsYSwgVSswMEI4IElTT2RpYSAtLT4KLTwhRU5USVRZIHN1cDEgICAiJiMxODU7Ij4gPCEtLSBzdXBlcnNjcmlwdCBvbmUgPSBzdXBlcnNjcmlwdCBkaWdpdCBvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEI5IElTT251bSAtLT4KLTwhRU5USVRZIG9yZG0gICAiJiMxODY7Ij4gPCEtLSBtYXNjdWxpbmUgb3JkaW5hbCBpbmRpY2F0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEJBIElTT251bSAtLT4KLTwhRU5USVRZIHJhcXVvICAiJiMxODc7Ij4gPCEtLSByaWdodC1wb2ludGluZyBkb3VibGUgYW5nbGUgcXVvdGF0aW9uIG1hcmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHJpZ2h0IHBvaW50aW5nIGd1aWxsZW1ldCwgVSswMEJCIElTT251bSAtLT4KLTwhRU5USVRZIGZyYWMxNCAiJiMxODg7Ij4gPCEtLSB2dWxnYXIgZnJhY3Rpb24gb25lIHF1YXJ0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZyYWN0aW9uIG9uZSBxdWFydGVyLCBVKzAwQkMgSVNPbnVtIC0tPgotPCFFTlRJVFkgZnJhYzEyICImIzE4OTsiPiA8IS0tIHZ1bGdhciBmcmFjdGlvbiBvbmUgaGFsZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZnJhY3Rpb24gb25lIGhhbGYsIFUrMDBCRCBJU09udW0gLS0+Ci08IUVOVElUWSBmcmFjMzQgIiYjMTkwOyI+IDwhLS0gdnVsZ2FyIGZyYWN0aW9uIHRocmVlIHF1YXJ0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmcmFjdGlvbiB0aHJlZSBxdWFydGVycywgVSswMEJFIElTT251bSAtLT4KLTwhRU5USVRZIGlxdWVzdCAiJiMxOTE7Ij4gPCEtLSBpbnZlcnRlZCBxdWVzdGlvbiBtYXJrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0dXJuZWQgcXVlc3Rpb24gbWFyaywgVSswMEJGIElTT251bSAtLT4KLTwhRU5USVRZIEFncmF2ZSAiJiMxOTI7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggZ3JhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEMwIElTT2xhdDEgLS0+Ci08IUVOVElUWSBBYWN1dGUgIiYjMTkzOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgQWNpcmMgICImIzE5NDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDMiBJU09sYXQxIC0tPgotPCFFTlRJVFkgQXRpbGRlICImIzE5NTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzMgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEF1bWwgICAiJiMxOTY7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDNCBJU09sYXQxIC0tPgotPCFFTlRJVFkgQXJpbmcgICImIzE5NzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCByaW5nIGFib3ZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM1IElTT2xhdDEgLS0+Ci08IUVOVElUWSBBRWxpZyAgIiYjMTk4OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQUUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIGNhcGl0YWwgbGlnYXR1cmUgQUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM2IElTT2xhdDEgLS0+Ci08IUVOVElUWSBDY2VkaWwgIiYjMTk5OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQyB3aXRoIGNlZGlsbGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEM3IElTT2xhdDEgLS0+Ci08IUVOVElUWSBFZ3JhdmUgIiYjMjAwOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDOCBJU09sYXQxIC0tPgotPCFFTlRJVFkgRWFjdXRlICImIzIwMTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBhY3V0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQzkgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVjaXJjICAiJiMyMDI7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0EgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEV1bWwgICAiJiMyMDM7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBDQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgSWdyYXZlICImIzIwNDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0MgSVNPbGF0MSAtLT4KLTwhRU5USVRZIElhY3V0ZSAiJiMyMDU7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENEIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJY2lyYyAgIiYjMjA2OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGNpcmN1bWZsZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMENFIElTT2xhdDEgLS0+Ci08IUVOVElUWSBJdW1sICAgIiYjMjA3OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwQ0YgSVNPbGF0MSAtLT4KLTwhRU5USVRZIEVUSCAgICAiJiMyMDg7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBFVEgsIFUrMDBEMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgTnRpbGRlICImIzIwOTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE4gd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE9ncmF2ZSAiJiMyMTA7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQyIElTT2xhdDEgLS0+Ci08IUVOVElUWSBPYWN1dGUgIiYjMjExOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgT2NpcmMgICImIzIxMjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBENCBJU09sYXQxIC0tPgotPCFFTlRJVFkgT3RpbGRlICImIzIxMzsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCB0aWxkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIE91bWwgICAiJiMyMTQ7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBENiBJU09sYXQxIC0tPgotPCFFTlRJVFkgdGltZXMgICImIzIxNTsiPiA8IS0tIG11bHRpcGxpY2F0aW9uIHNpZ24sIFUrMDBENyBJU09udW0gLS0+Ci08IUVOVElUWSBPc2xhc2ggIiYjMjE2OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIHN0cm9rZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyBzbGFzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRDggSVNPbGF0MSAtLT4KLTwhRU5USVRZIFVncmF2ZSAiJiMyMTc7Ij4gPCEtLSBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggZ3JhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEQ5IElTT2xhdDEgLS0+Ci08IUVOVElUWSBVYWN1dGUgIiYjMjE4OyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEQSBJU09sYXQxIC0tPgotPCFFTlRJVFkgVWNpcmMgICImIzIxOTsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBEQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgVXVtbCAgICImIzIyMDsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMERDIElTT2xhdDEgLS0+Ci08IUVOVElUWSBZYWN1dGUgIiYjMjIxOyI+IDwhLS0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgWSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBERCBJU09sYXQxIC0tPgotPCFFTlRJVFkgVEhPUk4gICImIzIyMjsiPiA8IS0tIGxhdGluIGNhcGl0YWwgbGV0dGVyIFRIT1JOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBERSBJU09sYXQxIC0tPgotPCFFTlRJVFkgc3psaWcgICImIzIyMzsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBzaGFycCBzID0gZXNzLXplZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwREYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFncmF2ZSAiJiMyMjQ7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGdyYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTAgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFhY3V0ZSAiJiMyMjU7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFMSBJU09sYXQxIC0tPgotPCFFTlRJVFkgYWNpcmMgICImIzIyNjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGF0aWxkZSAiJiMyMjc7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgYXVtbCAgICImIzIyODsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFNCBJU09sYXQxIC0tPgotPCFFTlRJVFkgYXJpbmcgICImIzIyOTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggcmluZyBhYm92ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbGF0aW4gc21hbGwgbGV0dGVyIGEgcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTUgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGFlbGlnICAiJiMyMzA7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxhdGluIHNtYWxsIGxpZ2F0dXJlIGFlLCBVKzAwRTYgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGNjZWRpbCAiJiMyMzE7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgYyB3aXRoIGNlZGlsbGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEU3IElTT2xhdDEgLS0+Ci08IUVOVElUWSBlZ3JhdmUgIiYjMjMyOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRTggSVNPbGF0MSAtLT4KLTwhRU5USVRZIGVhY3V0ZSAiJiMyMzM7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgZWNpcmMgICImIzIzNDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUEgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGV1bWwgICAiJiMyMzU7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRUIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIGlncmF2ZSAiJiMyMzY7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgaWFjdXRlICImIzIzNzsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEVEIElTT2xhdDEgLS0+Ci08IUVOVElUWSBpY2lyYyAgIiYjMjM4OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFRSBJU09sYXQxIC0tPgotPCFFTlRJVFkgaXVtbCAgICImIzIzOTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBFRiBJU09sYXQxIC0tPgotPCFFTlRJVFkgZXRoICAgICImIzI0MDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBldGgsIFUrMDBGMCBJU09sYXQxIC0tPgotPCFFTlRJVFkgbnRpbGRlICImIzI0MTsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBuIHdpdGggdGlsZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEYxIElTT2xhdDEgLS0+Ci08IUVOVElUWSBvZ3JhdmUgIiYjMjQyOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBncmF2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjIgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG9hY3V0ZSAiJiMyNDM7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGFjdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGMyBJU09sYXQxIC0tPgotPCFFTlRJVFkgb2NpcmMgICImIzI0NDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggY2lyY3VtZmxleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjQgSVNPbGF0MSAtLT4KLTwhRU5USVRZIG90aWxkZSAiJiMyNDU7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIHRpbGRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGNSBJU09sYXQxIC0tPgotPCFFTlRJVFkgb3VtbCAgICImIzI0NjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGNiBJU09sYXQxIC0tPgotPCFFTlRJVFkgZGl2aWRlICImIzI0NzsiPiA8IS0tIGRpdmlzaW9uIHNpZ24sIFUrMDBGNyBJU09udW0gLS0+Ci08IUVOVElUWSBvc2xhc2ggIiYjMjQ4OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBzdHJva2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyBzbGFzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAwRjggSVNPbGF0MSAtLT4KLTwhRU5USVRZIHVncmF2ZSAiJiMyNDk7Ij4gPCEtLSBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGdyYXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGOSBJU09sYXQxIC0tPgotPCFFTlRJVFkgdWFjdXRlICImIzI1MDsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZBIElTT2xhdDEgLS0+Ci08IUVOVElUWSB1Y2lyYyAgIiYjMjUxOyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBjaXJjdW1mbGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGQiBJU09sYXQxIC0tPgotPCFFTlRJVFkgdXVtbCAgICImIzI1MjsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggZGlhZXJlc2lzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDBGQyBJU09sYXQxIC0tPgotPCFFTlRJVFkgeWFjdXRlICImIzI1MzsiPiA8IS0tIGxhdGluIHNtYWxsIGxldHRlciB5IHdpdGggYWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZEIElTT2xhdDEgLS0+Ci08IUVOVElUWSB0aG9ybiAgIiYjMjU0OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHRob3JuIHdpdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZFIElTT2xhdDEgLS0+Ci08IUVOVElUWSB5dW1sICAgIiYjMjU1OyI+IDwhLS0gbGF0aW4gc21hbGwgbGV0dGVyIHkgd2l0aCBkaWFlcmVzaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMEZGIElTT2xhdDEgLS0+Ci0KLQotPCFFTlRJVFkgJSB4aHRtbC1zeW1ib2wKLSAgICBQVUJMSUMgIi0vL1czQy8vRU5USVRJRVMgU3ltYm9scyBmb3IgWEhUTUwvL0VOIgotICAgICAgICAgICAieGh0bWwtc3ltYm9sLmVudCIgPgotPCEtLSBNYXRoZW1hdGljYWwsIEdyZWVrIGFuZCBTeW1ib2xpYyBjaGFyYWN0ZXJzIGZvciBIVE1MIC0tPgotCi08IS0tIENoYXJhY3RlciBlbnRpdHkgc2V0LiBUeXBpY2FsIGludm9jYXRpb246Ci0gICAgIDwhRU5USVRZICUgSFRNTHN5bWJvbCBQVUJMSUMKLSAgICAgICAgIi0vL1czQy8vRU5USVRJRVMgU3ltYm9scyBmb3IgWEhUTUwvL0VOIgotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbC1zeW1ib2wuZW50Ij4KLSAgICAgJUhUTUxzeW1ib2w7Ci0tLT4KLQotPCEtLSBQb3J0aW9ucyAoQykgSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiAxOTg2OgotICAgICBQZXJtaXNzaW9uIHRvIGNvcHkgaW4gYW55IGZvcm0gaXMgZ3JhbnRlZCBmb3IgdXNlIHdpdGgKLSAgICAgY29uZm9ybWluZyBTR01MIHN5c3RlbXMgYW5kIGFwcGxpY2F0aW9ucyBhcyBkZWZpbmVkIGluCi0gICAgIElTTyA4ODc5LCBwcm92aWRlZCB0aGlzIG5vdGljZSBpcyBpbmNsdWRlZCBpbiBhbGwgY29waWVzLgotLS0+Ci0KLTwhLS0gUmVsZXZhbnQgSVNPIGVudGl0eSBzZXQgaXMgZ2l2ZW4gdW5sZXNzIG5hbWVzIGFyZSBuZXdseSBpbnRyb2R1Y2VkLgotICAgICBOZXcgbmFtZXMgKGkuZS4sIG5vdCBpbiBJU08gODg3OSBsaXN0KSBkbyBub3QgY2xhc2ggd2l0aCBhbnkKLSAgICAgZXhpc3RpbmcgSVNPIDg4NzkgZW50aXR5IG5hbWVzLiBJU08gMTA2NDYgY2hhcmFjdGVyIG51bWJlcnMKLSAgICAgYXJlIGdpdmVuIGZvciBlYWNoIGNoYXJhY3RlciwgaW4gaGV4LiB2YWx1ZXMgYXJlIGRlY2ltYWwKLSAgICAgY29udmVyc2lvbnMgb2YgdGhlIElTTyAxMDY0NiB2YWx1ZXMgYW5kIHJlZmVyIHRvIHRoZSBkb2N1bWVudAotICAgICBjaGFyYWN0ZXIgc2V0LiBOYW1lcyBhcmUgVW5pY29kZSBuYW1lcy4gCi0tLT4KLQotPCEtLSBMYXRpbiBFeHRlbmRlZC1CIC0tPgotPCFFTlRJVFkgZm5vZiAgICAgIiYjNDAyOyI+IDwhLS0gbGF0aW4gc21hbGwgZiB3aXRoIGhvb2sgPSBmdW5jdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBmbG9yaW4sIFUrMDE5MiBJU090ZWNoIC0tPgotCi08IS0tIEdyZWVrIC0tPgotPCFFTlRJVFkgQWxwaGEgICAgIiYjOTEzOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgYWxwaGEsIFUrMDM5MSAtLT4KLTwhRU5USVRZIEJldGEgICAgICImIzkxNDsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGJldGEsIFUrMDM5MiAtLT4KLTwhRU5USVRZIEdhbW1hICAgICImIzkxNTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGdhbW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswMzkzIElTT2dyazMgLS0+Ci08IUVOVElUWSBEZWx0YSAgICAiJiM5MTY7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBkZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5NCBJU09ncmszIC0tPgotPCFFTlRJVFkgRXBzaWxvbiAgIiYjOTE3OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZXBzaWxvbiwgVSswMzk1IC0tPgotPCFFTlRJVFkgWmV0YSAgICAgIiYjOTE4OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgemV0YSwgVSswMzk2IC0tPgotPCFFTlRJVFkgRXRhICAgICAgIiYjOTE5OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZXRhLCBVKzAzOTcgLS0+Ci08IUVOVElUWSBUaGV0YSAgICAiJiM5MjA7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB0aGV0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5OCBJU09ncmszIC0tPgotPCFFTlRJVFkgSW90YSAgICAgIiYjOTIxOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgaW90YSwgVSswMzk5IC0tPgotPCFFTlRJVFkgS2FwcGEgICAgIiYjOTIyOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIga2FwcGEsIFUrMDM5QSAtLT4KLTwhRU5USVRZIExhbWJkYSAgICImIzkyMzsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGxhbWJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDM5QiBJU09ncmszIC0tPgotPCFFTlRJVFkgTXUgICAgICAgIiYjOTI0OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbXUsIFUrMDM5QyAtLT4KLTwhRU5USVRZIE51ICAgICAgICImIzkyNTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG51LCBVKzAzOUQgLS0+Ci08IUVOVElUWSBYaSAgICAgICAiJiM5MjY7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB4aSwgVSswMzlFIElTT2dyazMgLS0+Ci08IUVOVElUWSBPbWljcm9uICAiJiM5Mjc7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBvbWljcm9uLCBVKzAzOUYgLS0+Ci08IUVOVElUWSBQaSAgICAgICAiJiM5Mjg7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBwaSwgVSswM0EwIElTT2dyazMgLS0+Ci08IUVOVElUWSBSaG8gICAgICAiJiM5Mjk7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciByaG8sIFUrMDNBMSAtLT4KLTwhLS0gdGhlcmUgaXMgbm8gU2lnbWFmLCBhbmQgbm8gVSswM0EyIGNoYXJhY3RlciBlaXRoZXIgLS0+Ci08IUVOVElUWSBTaWdtYSAgICAiJiM5MzE7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBMyBJU09ncmszIC0tPgotPCFFTlRJVFkgVGF1ICAgICAgIiYjOTMyOyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdGF1LCBVKzAzQTQgLS0+Ci08IUVOVElUWSBVcHNpbG9uICAiJiM5MzM7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciB1cHNpbG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E1IElTT2dyazMgLS0+Ci08IUVOVElUWSBQaGkgICAgICAiJiM5MzQ7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBwaGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQTYgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIENoaSAgICAgICImIzkzNTsiPiA8IS0tIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGNoaSwgVSswM0E3IC0tPgotPCFFTlRJVFkgUHNpICAgICAgIiYjOTM2OyI+IDwhLS0gZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcHNpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0E4IElTT2dyazMgLS0+Ci08IUVOVElUWSBPbWVnYSAgICAiJiM5Mzc7Ij4gPCEtLSBncmVlayBjYXBpdGFsIGxldHRlciBvbWVnYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNBOSBJU09ncmszIC0tPgotCi08IUVOVElUWSBhbHBoYSAgICAiJiM5NDU7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjEgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGJldGEgICAgICImIzk0NjsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBiZXRhLCBVKzAzQjIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGdhbW1hICAgICImIzk0NzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBnYW1tYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCMyBJU09ncmszIC0tPgotPCFFTlRJVFkgZGVsdGEgICAgIiYjOTQ4OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGRlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0I0IElTT2dyazMgLS0+Ci08IUVOVElUWSBlcHNpbG9uICAiJiM5NDk7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZXBzaWxvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCNSBJU09ncmszIC0tPgotPCFFTlRJVFkgemV0YSAgICAgIiYjOTUwOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHpldGEsIFUrMDNCNiBJU09ncmszIC0tPgotPCFFTlRJVFkgZXRhICAgICAgIiYjOTUxOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGV0YSwgVSswM0I3IElTT2dyazMgLS0+Ci08IUVOVElUWSB0aGV0YSAgICAiJiM5NTI7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGhldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQjggSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGlvdGEgICAgICImIzk1MzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBpb3RhLCBVKzAzQjkgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIGthcHBhICAgICImIzk1NDsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBrYXBwYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCQSBJU09ncmszIC0tPgotPCFFTlRJVFkgbGFtYmRhICAgIiYjOTU1OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIGxhbWJkYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNCQiBJU09ncmszIC0tPgotPCFFTlRJVFkgbXUgICAgICAgIiYjOTU2OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG11LCBVKzAzQkMgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIG51ICAgICAgICImIzk1NzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBudSwgVSswM0JEIElTT2dyazMgLS0+Ci08IUVOVElUWSB4aSAgICAgICAiJiM5NTg7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgeGksIFUrMDNCRSBJU09ncmszIC0tPgotPCFFTlRJVFkgb21pY3JvbiAgIiYjOTU5OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG9taWNyb24sIFUrMDNCRiBORVcgLS0+Ci08IUVOVElUWSBwaSAgICAgICAiJiM5NjA7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgcGksIFUrMDNDMCBJU09ncmszIC0tPgotPCFFTlRJVFkgcmhvICAgICAgIiYjOTYxOyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHJobywgVSswM0MxIElTT2dyazMgLS0+Ci08IUVOVElUWSBzaWdtYWYgICAiJiM5NjI7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgZmluYWwgc2lnbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAzQzIgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHNpZ21hICAgICImIzk2MzsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDMyBJU09ncmszIC0tPgotPCFFTlRJVFkgdGF1ICAgICAgIiYjOTY0OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHRhdSwgVSswM0M0IElTT2dyazMgLS0+Ci08IUVOVElUWSB1cHNpbG9uICAiJiM5NjU7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgdXBzaWxvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNDNSBJU09ncmszIC0tPgotPCFFTlRJVFkgcGhpICAgICAgIiYjOTY2OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIHBoaSwgVSswM0M2IElTT2dyazMgLS0+Ci08IUVOVElUWSBjaGkgICAgICAiJiM5Njc7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgY2hpLCBVKzAzQzcgSVNPZ3JrMyAtLT4KLTwhRU5USVRZIHBzaSAgICAgICImIzk2ODsiPiA8IS0tIGdyZWVrIHNtYWxsIGxldHRlciBwc2ksIFUrMDNDOCBJU09ncmszIC0tPgotPCFFTlRJVFkgb21lZ2EgICAgIiYjOTY5OyI+IDwhLS0gZ3JlZWsgc21hbGwgbGV0dGVyIG9tZWdhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0M5IElTT2dyazMgLS0+Ci08IUVOVElUWSB0aGV0YXN5bSAiJiM5Nzc7Ij4gPCEtLSBncmVlayBzbWFsbCBsZXR0ZXIgdGhldGEgc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSswM0QxIE5FVyAtLT4KLTwhRU5USVRZIHVwc2loICAgICImIzk3ODsiPiA8IS0tIGdyZWVrIHVwc2lsb24gd2l0aCBob29rIHN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDNEMiBORVcgLS0+Ci08IUVOVElUWSBwaXYgICAgICAiJiM5ODI7Ij4gPCEtLSBncmVlayBwaSBzeW1ib2wsIFUrMDNENiBJU09ncmszIC0tPgotCi08IS0tIEdlbmVyYWwgUHVuY3R1YXRpb24gLS0+Ci08IUVOVElUWSBidWxsICAgICAiJiM4MjI2OyI+IDwhLS0gYnVsbGV0ID0gYmxhY2sgc21hbGwgY2lyY2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAyMiBJU09wdWIgIC0tPgotPCEtLSBidWxsZXQgaXMgTk9UIHRoZSBzYW1lIGFzIGJ1bGxldCBvcGVyYXRvciwgVSsyMjE5IC0tPgotPCFFTlRJVFkgaGVsbGlwICAgIiYjODIzMDsiPiA8IS0tIGhvcml6b250YWwgZWxsaXBzaXMgPSB0aHJlZSBkb3QgbGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAyNiBJU09wdWIgIC0tPgotPCFFTlRJVFkgcHJpbWUgICAgIiYjODI0MjsiPiA8IS0tIHByaW1lID0gbWludXRlcyA9IGZlZXQsIFUrMjAzMiBJU090ZWNoIC0tPgotPCFFTlRJVFkgUHJpbWUgICAgIiYjODI0MzsiPiA8IS0tIGRvdWJsZSBwcmltZSA9IHNlY29uZHMgPSBpbmNoZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDMzIElTT3RlY2ggLS0+Ci08IUVOVElUWSBvbGluZSAgICAiJiM4MjU0OyI+IDwhLS0gb3ZlcmxpbmUgPSBzcGFjaW5nIG92ZXJzY29yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwM0UgTkVXIC0tPgotPCFFTlRJVFkgZnJhc2wgICAgIiYjODI2MDsiPiA8IS0tIGZyYWN0aW9uIHNsYXNoLCBVKzIwNDQgTkVXIC0tPgotCi08IS0tIExldHRlcmxpa2UgU3ltYm9scyAtLT4KLTwhRU5USVRZIHdlaWVycCAgICImIzg0NzI7Ij4gPCEtLSBzY3JpcHQgY2FwaXRhbCBQID0gcG93ZXIgc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBXZWllcnN0cmFzcyBwLCBVKzIxMTggSVNPYW1zbyAtLT4KLTwhRU5USVRZIGltYWdlICAgICImIzg0NjU7Ij4gPCEtLSBibGFja2xldHRlciBjYXBpdGFsIEkgPSBpbWFnaW5hcnkgcGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxMTEgSVNPYW1zbyAtLT4KLTwhRU5USVRZIHJlYWwgICAgICImIzg0NzY7Ij4gPCEtLSBibGFja2xldHRlciBjYXBpdGFsIFIgPSByZWFsIHBhcnQgc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjExQyBJU09hbXNvIC0tPgotPCFFTlRJVFkgdHJhZGUgICAgIiYjODQ4MjsiPiA8IS0tIHRyYWRlIG1hcmsgc2lnbiwgVSsyMTIyIElTT251bSAtLT4KLTwhRU5USVRZIGFsZWZzeW0gICImIzg1MDE7Ij4gPCEtLSBhbGVmIHN5bWJvbCA9IGZpcnN0IHRyYW5zZmluaXRlIGNhcmRpbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjEzNSBORVcgLS0+Ci08IS0tIGFsZWYgc3ltYm9sIGlzIE5PVCB0aGUgc2FtZSBhcyBoZWJyZXcgbGV0dGVyIGFsZWYsCi0gICAgIFUrMDVEMCBhbHRob3VnaCB0aGUgc2FtZSBnbHlwaCBjb3VsZCBiZSB1c2VkIHRvIGRlcGljdCBib3RoIGNoYXJhY3RlcnMgLS0+Ci0KLTwhLS0gQXJyb3dzIC0tPgotPCFFTlRJVFkgbGFyciAgICAgIiYjODU5MjsiPiA8IS0tIGxlZnR3YXJkcyBhcnJvdywgVSsyMTkwIElTT251bSAtLT4KLTwhRU5USVRZIHVhcnIgICAgICImIzg1OTM7Ij4gPCEtLSB1cHdhcmRzIGFycm93LCBVKzIxOTEgSVNPbnVtLS0+Ci08IUVOVElUWSByYXJyICAgICAiJiM4NTk0OyI+IDwhLS0gcmlnaHR3YXJkcyBhcnJvdywgVSsyMTkyIElTT251bSAtLT4KLTwhRU5USVRZIGRhcnIgICAgICImIzg1OTU7Ij4gPCEtLSBkb3dud2FyZHMgYXJyb3csIFUrMjE5MyBJU09udW0gLS0+Ci08IUVOVElUWSBoYXJyICAgICAiJiM4NTk2OyI+IDwhLS0gbGVmdCByaWdodCBhcnJvdywgVSsyMTk0IElTT2Ftc2EgLS0+Ci08IUVOVElUWSBjcmFyciAgICAiJiM4NjI5OyI+IDwhLS0gZG93bndhcmRzIGFycm93IHdpdGggY29ybmVyIGxlZnR3YXJkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY2FycmlhZ2UgcmV0dXJuLCBVKzIxQjUgTkVXIC0tPgotPCFFTlRJVFkgbEFyciAgICAgIiYjODY1NjsiPiA8IS0tIGxlZnR3YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMCBJU090ZWNoIC0tPgotPCEtLSBVbmljb2RlIGRvZXMgbm90IHNheSB0aGF0IGxBcnIgaXMgdGhlIHNhbWUgYXMgdGhlICdpcyBpbXBsaWVkIGJ5JyBhcnJvdwotICAgIGJ1dCBhbHNvIGRvZXMgbm90IGhhdmUgYW55IG90aGVyIGNoYXJhY3RlciBmb3IgdGhhdCBmdW5jdGlvbi4gU28gPyBsQXJyIGNhbgotICAgIGJlIHVzZWQgZm9yICdpcyBpbXBsaWVkIGJ5JyBhcyBJU090ZWNoIHN1Z2dlc3RzIC0tPgotPCFFTlRJVFkgdUFyciAgICAgIiYjODY1NzsiPiA8IS0tIHVwd2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDEgSVNPYW1zYSAtLT4KLTwhRU5USVRZIHJBcnIgICAgICImIzg2NTg7Ij4gPCEtLSByaWdodHdhcmRzIGRvdWJsZSBhcnJvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIxRDIgSVNPdGVjaCAtLT4KLTwhLS0gVW5pY29kZSBkb2VzIG5vdCBzYXkgdGhpcyBpcyB0aGUgJ2ltcGxpZXMnIGNoYXJhY3RlciBidXQgZG9lcyBub3QgaGF2ZSAKLSAgICAgYW5vdGhlciBjaGFyYWN0ZXIgd2l0aCB0aGlzIGZ1bmN0aW9uIHNvID8KLSAgICAgckFyciBjYW4gYmUgdXNlZCBmb3IgJ2ltcGxpZXMnIGFzIElTT3RlY2ggc3VnZ2VzdHMgLS0+Ci08IUVOVElUWSBkQXJyICAgICAiJiM4NjU5OyI+IDwhLS0gZG93bndhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQzIElTT2Ftc2EgLS0+Ci08IUVOVElUWSBoQXJyICAgICAiJiM4NjYwOyI+IDwhLS0gbGVmdCByaWdodCBkb3VibGUgYXJyb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMUQ0IElTT2Ftc2EgLS0+Ci0KLTwhLS0gTWF0aGVtYXRpY2FsIE9wZXJhdG9ycyAtLT4KLTwhRU5USVRZIGZvcmFsbCAgICImIzg3MDQ7Ij4gPCEtLSBmb3IgYWxsLCBVKzIyMDAgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHBhcnQgICAgICImIzg3MDY7Ij4gPCEtLSBwYXJ0aWFsIGRpZmZlcmVudGlhbCwgVSsyMjAyIElTT3RlY2ggIC0tPgotPCFFTlRJVFkgZXhpc3QgICAgIiYjODcwNzsiPiA8IS0tIHRoZXJlIGV4aXN0cywgVSsyMjAzIElTT3RlY2ggLS0+Ci08IUVOVElUWSBlbXB0eSAgICAiJiM4NzA5OyI+IDwhLS0gZW1wdHkgc2V0ID0gbnVsbCBzZXQgPSBkaWFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyMDUgSVNPYW1zbyAtLT4KLTwhRU5USVRZIG5hYmxhICAgICImIzg3MTE7Ij4gPCEtLSBuYWJsYSA9IGJhY2t3YXJkIGRpZmZlcmVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjA3IElTT3RlY2ggLS0+Ci08IUVOVElUWSBpc2luICAgICAiJiM4NzEyOyI+IDwhLS0gZWxlbWVudCBvZiwgVSsyMjA4IElTT3RlY2ggLS0+Ci08IUVOVElUWSBub3RpbiAgICAiJiM4NzEzOyI+IDwhLS0gbm90IGFuIGVsZW1lbnQgb2YsIFUrMjIwOSBJU090ZWNoIC0tPgotPCFFTlRJVFkgbmkgICAgICAgIiYjODcxNTsiPiA8IS0tIGNvbnRhaW5zIGFzIG1lbWJlciwgVSsyMjBCIElTT3RlY2ggLS0+Ci08IS0tIHNob3VsZCB0aGVyZSBiZSBhIG1vcmUgbWVtb3JhYmxlIG5hbWUgdGhhbiAnbmknPyAtLT4KLTwhRU5USVRZIHByb2QgICAgICImIzg3MTk7Ij4gPCEtLSBuLWFyeSBwcm9kdWN0ID0gcHJvZHVjdCBzaWduLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIwRiBJU09hbXNiIC0tPgotPCEtLSBwcm9kIGlzIE5PVCB0aGUgc2FtZSBjaGFyYWN0ZXIgYXMgVSswM0EwICdncmVlayBjYXBpdGFsIGxldHRlciBwaScgdGhvdWdoCi0gICAgIHRoZSBzYW1lIGdseXBoIG1pZ2h0IGJlIHVzZWQgZm9yIGJvdGggLS0+Ci08IUVOVElUWSBzdW0gICAgICAiJiM4NzIxOyI+IDwhLS0gbi1hcnkgc3VtYXRpb24sIFUrMjIxMSBJU09hbXNiIC0tPgotPCEtLSBzdW0gaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAzQTMgJ2dyZWVrIGNhcGl0YWwgbGV0dGVyIHNpZ21hJwotICAgICB0aG91Z2ggdGhlIHNhbWUgZ2x5cGggbWlnaHQgYmUgdXNlZCBmb3IgYm90aCAtLT4KLTwhRU5USVRZIG1pbnVzICAgICImIzg3MjI7Ij4gPCEtLSBtaW51cyBzaWduLCBVKzIyMTIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGxvd2FzdCAgICImIzg3Mjc7Ij4gPCEtLSBhc3RlcmlzayBvcGVyYXRvciwgVSsyMjE3IElTT3RlY2ggLS0+Ci08IUVOVElUWSByYWRpYyAgICAiJiM4NzMwOyI+IDwhLS0gc3F1YXJlIHJvb3QgPSByYWRpY2FsIHNpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjFBIElTT3RlY2ggLS0+Ci08IUVOVElUWSBwcm9wICAgICAiJiM4NzMzOyI+IDwhLS0gcHJvcG9ydGlvbmFsIHRvLCBVKzIyMUQgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGluZmluICAgICImIzg3MzQ7Ij4gPCEtLSBpbmZpbml0eSwgVSsyMjFFIElTT3RlY2ggLS0+Ci08IUVOVElUWSBhbmcgICAgICAiJiM4NzM2OyI+IDwhLS0gYW5nbGUsIFUrMjIyMCBJU09hbXNvIC0tPgotPCFFTlRJVFkgYW5kICAgICAgIiYjODc0MzsiPiA8IS0tIGxvZ2ljYWwgYW5kID0gd2VkZ2UsIFUrMjIyNyBJU090ZWNoIC0tPgotPCFFTlRJVFkgb3IgICAgICAgIiYjODc0NDsiPiA8IS0tIGxvZ2ljYWwgb3IgPSB2ZWUsIFUrMjIyOCBJU090ZWNoIC0tPgotPCFFTlRJVFkgY2FwICAgICAgIiYjODc0NTsiPiA8IS0tIGludGVyc2VjdGlvbiA9IGNhcCwgVSsyMjI5IElTT3RlY2ggLS0+Ci08IUVOVElUWSBjdXAgICAgICAiJiM4NzQ2OyI+IDwhLS0gdW5pb24gPSBjdXAsIFUrMjIyQSBJU090ZWNoIC0tPgotPCFFTlRJVFkgaW50ICAgICAgIiYjODc0NzsiPiA8IS0tIGludGVncmFsLCBVKzIyMkIgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHRoZXJlNCAgICImIzg3NTY7Ij4gPCEtLSB0aGVyZWZvcmUsIFUrMjIzNCBJU090ZWNoIC0tPgotPCFFTlRJVFkgc2ltICAgICAgIiYjODc2NDsiPiA8IS0tIHRpbGRlIG9wZXJhdG9yID0gdmFyaWVzIHdpdGggPSBzaW1pbGFyIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjIzQyBJU090ZWNoIC0tPgotPCEtLSB0aWxkZSBvcGVyYXRvciBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIHRoZSB0aWxkZSwgVSswMDdFLAotICAgICBhbHRob3VnaCB0aGUgc2FtZSBnbHlwaCBtaWdodCBiZSB1c2VkIHRvIHJlcHJlc2VudCBib3RoICAtLT4KLTwhRU5USVRZIGNvbmcgICAgICImIzg3NzM7Ij4gPCEtLSBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvLCBVKzIyNDUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGFzeW1wICAgICImIzg3NzY7Ij4gPCEtLSBhbG1vc3QgZXF1YWwgdG8gPSBhc3ltcHRvdGljIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI0OCBJU09hbXNyIC0tPgotPCFFTlRJVFkgbmUgICAgICAgIiYjODgwMDsiPiA8IS0tIG5vdCBlcXVhbCB0bywgVSsyMjYwIElTT3RlY2ggLS0+Ci08IUVOVElUWSBlcXVpdiAgICAiJiM4ODAxOyI+IDwhLS0gaWRlbnRpY2FsIHRvLCBVKzIyNjEgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGxlICAgICAgICImIzg4MDQ7Ij4gPCEtLSBsZXNzLXRoYW4gb3IgZXF1YWwgdG8sIFUrMjI2NCBJU090ZWNoIC0tPgotPCFFTlRJVFkgZ2UgICAgICAgIiYjODgwNTsiPiA8IS0tIGdyZWF0ZXItdGhhbiBvciBlcXVhbCB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyNjUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHN1YiAgICAgICImIzg4MzQ7Ij4gPCEtLSBzdWJzZXQgb2YsIFUrMjI4MiBJU090ZWNoIC0tPgotPCFFTlRJVFkgc3VwICAgICAgIiYjODgzNTsiPiA8IS0tIHN1cGVyc2V0IG9mLCBVKzIyODMgSVNPdGVjaCAtLT4KLTwhLS0gbm90ZSB0aGF0IG5zdXAsICdub3QgYSBzdXBlcnNldCBvZiwgVSsyMjgzJyBpcyBub3QgY292ZXJlZCBieSB0aGUgU3ltYm9sIAotICAgICBmb250IGVuY29kaW5nIGFuZCBpcyBub3QgaW5jbHVkZWQuIFNob3VsZCBpdCBiZSwgZm9yIHN5bW1ldHJ5PwotICAgICBJdCBpcyBpbiBJU09hbXNuICAtLT4gCi08IUVOVElUWSBuc3ViICAgICAiJiM4ODM2OyI+IDwhLS0gbm90IGEgc3Vic2V0IG9mLCBVKzIyODQgSVNPYW1zbiAtLT4KLTwhRU5USVRZIHN1YmUgICAgICImIzg4Mzg7Ij4gPCEtLSBzdWJzZXQgb2Ygb3IgZXF1YWwgdG8sIFUrMjI4NiBJU090ZWNoIC0tPgotPCFFTlRJVFkgc3VwZSAgICAgIiYjODgzOTsiPiA8IS0tIHN1cGVyc2V0IG9mIG9yIGVxdWFsIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI4NyBJU090ZWNoIC0tPgotPCFFTlRJVFkgb3BsdXMgICAgIiYjODg1MzsiPiA8IS0tIGNpcmNsZWQgcGx1cyA9IGRpcmVjdCBzdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMjk1IElTT2Ftc2IgLS0+Ci08IUVOVElUWSBvdGltZXMgICAiJiM4ODU1OyI+IDwhLS0gY2lyY2xlZCB0aW1lcyA9IHZlY3RvciBwcm9kdWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjI5NyBJU09hbXNiIC0tPgotPCFFTlRJVFkgcGVycCAgICAgIiYjODg2OTsiPiA8IS0tIHVwIHRhY2sgPSBvcnRob2dvbmFsIHRvID0gcGVycGVuZGljdWxhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIyQTUgSVNPdGVjaCAtLT4KLTwhRU5USVRZIHNkb3QgICAgICImIzg5MDE7Ij4gPCEtLSBkb3Qgb3BlcmF0b3IsIFUrMjJDNSBJU09hbXNiIC0tPgotPCEtLSBkb3Qgb3BlcmF0b3IgaXMgTk9UIHRoZSBzYW1lIGNoYXJhY3RlciBhcyBVKzAwQjcgbWlkZGxlIGRvdCAtLT4KLQotPCEtLSBNaXNjZWxsYW5lb3VzIFRlY2huaWNhbCAtLT4KLTwhRU5USVRZIGxjZWlsICAgICImIzg5Njg7Ij4gPCEtLSBsZWZ0IGNlaWxpbmcgPSBhcGwgdXBzdGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIzMDggSVNPYW1zYyAgLS0+Ci08IUVOVElUWSByY2VpbCAgICAiJiM4OTY5OyI+IDwhLS0gcmlnaHQgY2VpbGluZywgVSsyMzA5IElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgbGZsb29yICAgIiYjODk3MDsiPiA8IS0tIGxlZnQgZmxvb3IgPSBhcGwgZG93bnN0aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjMwQSBJU09hbXNjICAtLT4KLTwhRU5USVRZIHJmbG9vciAgICImIzg5NzE7Ij4gPCEtLSByaWdodCBmbG9vciwgVSsyMzBCIElTT2Ftc2MgIC0tPgotPCFFTlRJVFkgbGFuZyAgICAgIiYjOTAwMTsiPiA8IS0tIGxlZnQtcG9pbnRpbmcgYW5nbGUgYnJhY2tldCA9IGJyYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIzMjkgSVNPdGVjaCAtLT4KLTwhLS0gbGFuZyBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDAzQyAnbGVzcyB0aGFuJyAKLSAgICAgb3IgVSsyMDM5ICdzaW5nbGUgbGVmdC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaycgLS0+Ci08IUVOVElUWSByYW5nICAgICAiJiM5MDAyOyI+IDwhLS0gcmlnaHQtcG9pbnRpbmcgYW5nbGUgYnJhY2tldCA9IGtldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIzMkEgSVNPdGVjaCAtLT4KLTwhLS0gcmFuZyBpcyBOT1QgdGhlIHNhbWUgY2hhcmFjdGVyIGFzIFUrMDAzRSAnZ3JlYXRlciB0aGFuJyAKLSAgICAgb3IgVSsyMDNBICdzaW5nbGUgcmlnaHQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmsnIC0tPgotCi08IS0tIEdlb21ldHJpYyBTaGFwZXMgLS0+Ci08IUVOVElUWSBsb3ogICAgICAiJiM5Njc0OyI+IDwhLS0gbG96ZW5nZSwgVSsyNUNBIElTT3B1YiAtLT4KLQotPCEtLSBNaXNjZWxsYW5lb3VzIFN5bWJvbHMgLS0+Ci08IUVOVElUWSBzcGFkZXMgICAiJiM5ODI0OyI+IDwhLS0gYmxhY2sgc3BhZGUgc3VpdCwgVSsyNjYwIElTT3B1YiAtLT4KLTwhLS0gYmxhY2sgaGVyZSBzZWVtcyB0byBtZWFuIGZpbGxlZCBhcyBvcHBvc2VkIHRvIGhvbGxvdyAtLT4KLTwhRU5USVRZIGNsdWJzICAgICImIzk4Mjc7Ij4gPCEtLSBibGFjayBjbHViIHN1aXQgPSBzaGFtcm9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzI2NjMgSVNPcHViIC0tPgotPCFFTlRJVFkgaGVhcnRzICAgIiYjOTgyOTsiPiA8IS0tIGJsYWNrIGhlYXJ0IHN1aXQgPSB2YWxlbnRpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyNjY1IElTT3B1YiAtLT4KLTwhRU5USVRZIGRpYW1zICAgICImIzk4MzA7Ij4gPCEtLSBibGFjayBkaWFtb25kIHN1aXQsIFUrMjY2NiBJU09wdWIgLS0+Ci0KLQotPCFFTlRJVFkgJSB4aHRtbC1zcGVjaWFsCi0gICAgUFVCTElDICItLy9XM0MvL0VOVElUSUVTIFNwZWNpYWwgZm9yIFhIVE1MLy9FTiIKLSAgICAgICAgICAgInhodG1sLXNwZWNpYWwuZW50IiA+Ci08IS0tIFNwZWNpYWwgY2hhcmFjdGVycyBmb3IgSFRNTCAtLT4KLQotPCEtLSBDaGFyYWN0ZXIgZW50aXR5IHNldC4gVHlwaWNhbCBpbnZvY2F0aW9uOgotICAgICA8IUVOVElUWSAlIEhUTUxzcGVjaWFsIFBVQkxJQwotICAgICAgICAiLS8vVzNDLy9FTlRJVElFUyBTcGVjaWFsIGZvciBYSFRNTC8vRU4iCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sLXNwZWNpYWwuZW50Ij4KLSAgICAgJUhUTUxzcGVjaWFsOwotLS0+Ci0KLTwhLS0gUG9ydGlvbnMgKEMpIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24gMTk4NjoKLSAgICAgUGVybWlzc2lvbiB0byBjb3B5IGluIGFueSBmb3JtIGlzIGdyYW50ZWQgZm9yIHVzZSB3aXRoCi0gICAgIGNvbmZvcm1pbmcgU0dNTCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMgYXMgZGVmaW5lZCBpbgotICAgICBJU08gODg3OSwgcHJvdmlkZWQgdGhpcyBub3RpY2UgaXMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcy4KLS0tPgotCi08IS0tIFJlbGV2YW50IElTTyBlbnRpdHkgc2V0IGlzIGdpdmVuIHVubGVzcyBuYW1lcyBhcmUgbmV3bHkgaW50cm9kdWNlZC4KLSAgICAgTmV3IG5hbWVzIChpLmUuLCBub3QgaW4gSVNPIDg4NzkgbGlzdCkgZG8gbm90IGNsYXNoIHdpdGggYW55Ci0gICAgIGV4aXN0aW5nIElTTyA4ODc5IGVudGl0eSBuYW1lcy4gSVNPIDEwNjQ2IGNoYXJhY3RlciBudW1iZXJzCi0gICAgIGFyZSBnaXZlbiBmb3IgZWFjaCBjaGFyYWN0ZXIsIGluIGhleC4gdmFsdWVzIGFyZSBkZWNpbWFsCi0gICAgIGNvbnZlcnNpb25zIG9mIHRoZSBJU08gMTA2NDYgdmFsdWVzIGFuZCByZWZlciB0byB0aGUgZG9jdW1lbnQKLSAgICAgY2hhcmFjdGVyIHNldC4gTmFtZXMgYXJlIFVuaWNvZGUgbmFtZXMuIAotLS0+Ci0KLTwhLS0gQzAgQ29udHJvbHMgYW5kIEJhc2ljIExhdGluIC0tPgotPCFFTlRJVFkgcXVvdCAgICAiJiMzNDsiPiA8IS0tICBxdW90YXRpb24gbWFyayA9IEFQTCBxdW90ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDAyMiBJU09udW0gLS0+Ci08IUVOVElUWSBhbXAgICAgICImIzM4OyMzODsiPiA8IS0tICBhbXBlcnNhbmQsIFUrMDAyNiBJU09udW0gLS0+Ci08IUVOVElUWSBsdCAgICAgICImIzM4OyM2MDsiPiA8IS0tICBsZXNzLXRoYW4gc2lnbiwgVSswMDNDIElTT251bSAtLT4KLTwhRU5USVRZIGd0ICAgICAgIiYjNjI7Ij4gPCEtLSAgZ3JlYXRlci10aGFuIHNpZ24sIFUrMDAzRSBJU09udW0gLS0+Ci08IUVOVElUWSBhcG9zCSAiJiMzOTsiPiA8IS0tICBhcG9zdHJvcGhlIG1hcmssIFUrMDAyNyBJU09udW0gLS0+Ci0KLTwhLS0gTGF0aW4gRXh0ZW5kZWQtQSAtLT4KLTwhRU5USVRZIE9FbGlnICAgIiYjMzM4OyI+IDwhLS0gIGxhdGluIGNhcGl0YWwgbGlnYXR1cmUgT0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzAxNTIgSVNPbGF0MiAtLT4KLTwhRU5USVRZIG9lbGlnICAgIiYjMzM5OyI+IDwhLS0gIGxhdGluIHNtYWxsIGxpZ2F0dXJlIG9lLCBVKzAxNTMgSVNPbGF0MiAtLT4KLTwhLS0gbGlnYXR1cmUgaXMgYSBtaXNub21lciwgdGhpcyBpcyBhIHNlcGFyYXRlIGNoYXJhY3RlciBpbiBzb21lIGxhbmd1YWdlcyAtLT4KLTwhRU5USVRZIFNjYXJvbiAgIiYjMzUyOyI+IDwhLS0gIGxhdGluIGNhcGl0YWwgbGV0dGVyIFMgd2l0aCBjYXJvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDE2MCBJU09sYXQyIC0tPgotPCFFTlRJVFkgc2Nhcm9uICAiJiMzNTM7Ij4gPCEtLSAgbGF0aW4gc21hbGwgbGV0dGVyIHMgd2l0aCBjYXJvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDE2MSBJU09sYXQyIC0tPgotPCFFTlRJVFkgWXVtbCAgICAiJiMzNzY7Ij4gPCEtLSAgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgWSB3aXRoIGRpYWVyZXNpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDE3OCBJU09sYXQyIC0tPgotCi08IS0tIFNwYWNpbmcgTW9kaWZpZXIgTGV0dGVycyAtLT4KLTwhRU5USVRZIGNpcmMgICAgIiYjNzEwOyI+IDwhLS0gIG1vZGlmaWVyIGxldHRlciBjaXJjdW1mbGV4IGFjY2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMDJDNiBJU09wdWIgLS0+Ci08IUVOVElUWSB0aWxkZSAgICImIzczMjsiPiA8IS0tICBzbWFsbCB0aWxkZSwgVSswMkRDIElTT2RpYSAtLT4KLQotPCEtLSBHZW5lcmFsIFB1bmN0dWF0aW9uIC0tPgotPCFFTlRJVFkgZW5zcCAgICAiJiM4MTk0OyI+IDwhLS0gZW4gc3BhY2UsIFUrMjAwMiBJU09wdWIgLS0+Ci08IUVOVElUWSBlbXNwICAgICImIzgxOTU7Ij4gPCEtLSBlbSBzcGFjZSwgVSsyMDAzIElTT3B1YiAtLT4KLTwhRU5USVRZIHRoaW5zcCAgIiYjODIwMTsiPiA8IS0tIHRoaW4gc3BhY2UsIFUrMjAwOSBJU09wdWIgLS0+Ci08IUVOVElUWSB6d25qICAgICImIzgyMDQ7Ij4gPCEtLSB6ZXJvIHdpZHRoIG5vbi1qb2luZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMEMgTkVXIFJGQyAyMDcwIC0tPgotPCFFTlRJVFkgendqICAgICAiJiM4MjA1OyI+IDwhLS0gemVybyB3aWR0aCBqb2luZXIsIFUrMjAwRCBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSBscm0gICAgICImIzgyMDY7Ij4gPCEtLSBsZWZ0LXRvLXJpZ2h0IG1hcmssIFUrMjAwRSBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSBybG0gICAgICImIzgyMDc7Ij4gPCEtLSByaWdodC10by1sZWZ0IG1hcmssIFUrMjAwRiBORVcgUkZDIDIwNzAgLS0+Ci08IUVOVElUWSBuZGFzaCAgICImIzgyMTE7Ij4gPCEtLSBlbiBkYXNoLCBVKzIwMTMgSVNPcHViIC0tPgotPCFFTlRJVFkgbWRhc2ggICAiJiM4MjEyOyI+IDwhLS0gZW0gZGFzaCwgVSsyMDE0IElTT3B1YiAtLT4KLTwhRU5USVRZIGxzcXVvICAgIiYjODIxNjsiPiA8IS0tIGxlZnQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDE4IElTT251bSAtLT4KLTwhRU5USVRZIHJzcXVvICAgIiYjODIxNzsiPiA8IS0tIHJpZ2h0IHNpbmdsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxOSBJU09udW0gLS0+Ci08IUVOVElUWSBzYnF1byAgICImIzgyMTg7Ij4gPCEtLSBzaW5nbGUgbG93LTkgcXVvdGF0aW9uIG1hcmssIFUrMjAxQSBORVcgLS0+Ci08IUVOVElUWSBsZHF1byAgICImIzgyMjA7Ij4gPCEtLSBsZWZ0IGRvdWJsZSBxdW90YXRpb24gbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxQyBJU09udW0gLS0+Ci08IUVOVElUWSByZHF1byAgICImIzgyMjE7Ij4gPCEtLSByaWdodCBkb3VibGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwMUQgSVNPbnVtIC0tPgotPCFFTlRJVFkgYmRxdW8gICAiJiM4MjIyOyI+IDwhLS0gZG91YmxlIGxvdy05IHF1b3RhdGlvbiBtYXJrLCBVKzIwMUUgTkVXIC0tPgotPCFFTlRJVFkgZGFnZ2VyICAiJiM4MjI0OyI+IDwhLS0gZGFnZ2VyLCBVKzIwMjAgSVNPcHViIC0tPgotPCFFTlRJVFkgRGFnZ2VyICAiJiM4MjI1OyI+IDwhLS0gZG91YmxlIGRhZ2dlciwgVSsyMDIxIElTT3B1YiAtLT4KLTwhRU5USVRZIHBlcm1pbCAgIiYjODI0MDsiPiA8IS0tIHBlciBtaWxsZSBzaWduLCBVKzIwMzAgSVNPdGVjaCAtLT4KLTwhRU5USVRZIGxzYXF1byAgIiYjODI0OTsiPiA8IS0tIHNpbmdsZSBsZWZ0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSsyMDM5IElTTyBwcm9wb3NlZCAtLT4KLTwhLS0gbHNhcXVvIGlzIHByb3Bvc2VkIGJ1dCBub3QgeWV0IElTTyBzdGFuZGFyZGl6ZWQgLS0+Ci08IUVOVElUWSByc2FxdW8gICImIzgyNTA7Ij4gPCEtLSBzaW5nbGUgcmlnaHQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVKzIwM0EgSVNPIHByb3Bvc2VkIC0tPgotPCEtLSByc2FxdW8gaXMgcHJvcG9zZWQgYnV0IG5vdCB5ZXQgSVNPIHN0YW5kYXJkaXplZCAtLT4KLTwhRU5USVRZIGV1cm8gICAiJiM4MzY0OyI+IDwhLS0gIGV1cm8gc2lnbiwgVSsyMEFDIE5FVyAtLT4KLQotCi08IS0tIGVuZCBvZiB4aHRtbC1jaGFyZW50LTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWZyYW1ld29yay0xLm1vZCAtLT4KLV1dPgotCi08IS0tIFBvc3QtRnJhbWV3b3JrIFJlZGVjbGFyYXRpb24gcGxhY2Vob2xkZXIgIC4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIHRoaXMgc2VydmVzIGFzIGEgbG9jYXRpb24gdG8gaW5zZXJ0IG1hcmt1cCBkZWNsYXJhdGlvbnMKLSAgICAgaW50byB0aGUgRFREIGZvbGxvd2luZyB0aGUgZnJhbWV3b3JrIGRlY2xhcmF0aW9ucy4KLS0tPgotPCFFTlRJVFkgJSB4aHRtbC1wb3N0ZnctcmVkZWNsLm1vZHVsZSAiSUdOT1JFIiA+Ci08IVsleGh0bWwtcG9zdGZ3LXJlZGVjbC5tb2R1bGU7WwotJXhodG1sLXBvc3Rmdy1yZWRlY2wubW9kOwotPCEtLSBlbmQgb2YgeGh0bWwtcG9zdGZ3LXJlZGVjbC5tb2R1bGUgLS0+XV0+Ci0KLTwhLS0gVGV4dCBNb2R1bGUgKFJlcXVpcmVkKSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtdGV4dC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC10ZXh0Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLXRleHQubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBUZXh0IDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXRleHQtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgVGV4dCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtdGV4dC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBUZXh0IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtdGV4dC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBUZXh0dWFsIENvbnRlbnQKLQotICAgICBUaGUgVGV4dCBtb2R1bGUgaW5jbHVkZXMgZGVjbGFyYXRpb25zIGZvciBhbGwgY29yZQotICAgICB0ZXh0IGNvbnRhaW5lciBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcy4KLS0tPgotCi08IUVOVElUWSAlIHhodG1sLWlubHN0cnVjdC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1pbmxzdHJ1Y3QubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtaW5sc3RydWN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFN0cnVjdHVyYWwgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1pbmxzdHJ1Y3QtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSW5saW5lIFN0cnVjdHVyYWwgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaW5sc3RydWN0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBTdHJ1Y3R1cmFsIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtaW5sc3RydWN0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIElubGluZSBTdHJ1Y3R1cmFsCi0KLSAgICAgICAgYnIsIHNwYW4KLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMKLSAgICAgdXNlZCB0byBzdXBwb3J0IGlubGluZS1sZXZlbCBzdHJ1Y3R1cmFsIG1hcmt1cC4KLS0tPgotCi08IS0tIGJyOiBmb3JjZWQgbGluZSBicmVhayAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBici5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWJyLmVsZW1lbnQ7WwotCi08IUVOVElUWSAlIGJyLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBici5xbmFtZSAgImJyIiA+Ci08IUVMRU1FTlQgJWJyLnFuYW1lOyAgJWJyLmNvbnRlbnQ7ID4KLQotPCEtLSBlbmQgb2YgYnIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBici5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVici5xbmFtZTsKLSAgICAgICVDb3JlLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGJyLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gc3BhbjogZ2VuZXJpYyBpbmxpbmUgY29udGFpbmVyIC4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHNwYW4uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzcGFuLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzcGFuLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc3Bhbi5xbmFtZSAgInNwYW4iID4KLTwhRUxFTUVOVCAlc3Bhbi5xbmFtZTsgICVzcGFuLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHNwYW4uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzcGFuLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc3Bhbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc3Bhbi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygc3Bhbi5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1pbmxzdHJ1Y3QtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1pbmxwaHJhcy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1pbmxwaHJhcy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1pbmxwaHJhcy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBQaHJhc2FsIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtaW5scGhyYXMtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSW5saW5lIFBocmFzYWwgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaW5scGhyYXMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgSW5saW5lIFBocmFzYWwgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1pbmxwaHJhcy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbmxpbmUgUGhyYXNhbAotCi0gICAgICAgIGFiYnIsIGFjcm9ueW0sIGNpdGUsIGNvZGUsIGRmbiwgZW0sIGtiZCwgcSwgc2FtcCwgc3Ryb25nLCB2YXIKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgZWxlbWVudHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgdXNlZCB0bwotICAgICBzdXBwb3J0IGlubGluZS1sZXZlbCBwaHJhc2FsIG1hcmt1cC4KLS0tPgotCi08IUVOVElUWSAlIGFiYnIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVhYmJyLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBhYmJyLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYWJici5xbmFtZSAgImFiYnIiID4KLTwhRUxFTUVOVCAlYWJici5xbmFtZTsgICVhYmJyLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGFiYnIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhYmJyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYWJici5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYWJici5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYWJici5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGFjcm9ueW0uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVhY3JvbnltLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBhY3JvbnltLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYWNyb255bS5xbmFtZSAgImFjcm9ueW0iID4KLTwhRUxFTUVOVCAlYWNyb255bS5xbmFtZTsgICVhY3JvbnltLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGFjcm9ueW0uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhY3JvbnltLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYWNyb255bS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYWNyb255bS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYWNyb255bS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGNpdGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVjaXRlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBjaXRlLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgY2l0ZS5xbmFtZSAgImNpdGUiID4KLTwhRUxFTUVOVCAlY2l0ZS5xbmFtZTsgICVjaXRlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGNpdGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjaXRlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslY2l0ZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlY2l0ZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgY2l0ZS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGNvZGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVjb2RlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBjb2RlLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgY29kZS5xbmFtZSAgImNvZGUiID4KLTwhRUxFTUVOVCAlY29kZS5xbmFtZTsgICVjb2RlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGNvZGUuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjb2RlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslY29kZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlY29kZS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgY29kZS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGRmbi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWRmbi5lbGVtZW50O1sKLTwhRU5USVRZICUgZGZuLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgZGZuLnFuYW1lICAiZGZuIiA+Ci08IUVMRU1FTlQgJWRmbi5xbmFtZTsgICVkZm4uY29udGVudDsgPgotPCEtLSBlbmQgb2YgZGZuLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZGZuLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZGZuLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVkZm4ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGRmbi5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGVtLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslZW0uZWxlbWVudDtbCi08IUVOVElUWSAlIGVtLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgZW0ucW5hbWUgICJlbSIgPgotPCFFTEVNRU5UICVlbS5xbmFtZTsgICVlbS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBlbS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGVtLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZW0uYXR0bGlzdDtbCi08IUFUVExJU1QgJWVtLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBlbS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGtiZC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWtiZC5lbGVtZW50O1sKLTwhRU5USVRZICUga2JkLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUga2JkLnFuYW1lICAia2JkIiA+Ci08IUVMRU1FTlQgJWtiZC5xbmFtZTsgICVrYmQuY29udGVudDsgPgotPCEtLSBlbmQgb2Yga2JkLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUga2JkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsla2JkLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVrYmQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGtiZC5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHEuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVxLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBxLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgcS5xbmFtZSAgInEiID4KLTwhRUxFTUVOVCAlcS5xbmFtZTsgICVxLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBxLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslcS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgY2l0ZSAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgcS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHNhbXAuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzYW1wLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzYW1wLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc2FtcC5xbmFtZSAgInNhbXAiID4KLTwhRUxFTUVOVCAlc2FtcC5xbmFtZTsgICVzYW1wLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHNhbXAuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBzYW1wLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc2FtcC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlc2FtcC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2Ygc2FtcC5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHN0cm9uZy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXN0cm9uZy5lbGVtZW50O1sKLTwhRU5USVRZICUgc3Ryb25nLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc3Ryb25nLnFuYW1lICAic3Ryb25nIiA+Ci08IUVMRU1FTlQgJXN0cm9uZy5xbmFtZTsgICVzdHJvbmcuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc3Ryb25nLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3Ryb25nLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc3Ryb25nLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzdHJvbmcucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHN0cm9uZy5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHZhci5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXZhci5lbGVtZW50O1sKLTwhRU5USVRZICUgdmFyLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgdmFyLnFuYW1lICAidmFyIiA+Ci08IUVMRU1FTlQgJXZhci5xbmFtZTsgICV2YXIuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdmFyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdmFyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldmFyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV2YXIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHZhci5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1pbmxwaHJhcy0xLm1vZCAtLT4KLV1dPgotCi08IUVOVElUWSAlIHhodG1sLWJsa3N0cnVjdC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1ibGtzdHJ1Y3QubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtYmxrc3RydWN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgU3RydWN0dXJhbCAxLjAvL0VOIgotICAgICAgICAgICAgInhodG1sLWJsa3N0cnVjdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCbG9jayBTdHJ1Y3R1cmFsIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1ibGtzdHJ1Y3QtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgU3RydWN0dXJhbCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWJsa3N0cnVjdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBCbG9jayBTdHJ1Y3R1cmFsCi0KLSAgICAgICAgZGl2LCBwCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIHVzZWQgdG8KLSAgICAgc3VwcG9ydCBibG9jay1sZXZlbCBzdHJ1Y3R1cmFsIG1hcmt1cC4KLS0tPgotCi08IUVOVElUWSAlIGRpdi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWRpdi5lbGVtZW50O1sKLTwhRU5USVRZICUgZGl2LmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Lm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGRpdi5xbmFtZSAgImRpdiIgPgotPCFFTEVNRU5UICVkaXYucW5hbWU7ICAlZGl2LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGRpdi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGRpdi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWRpdi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZGl2LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBkaXYuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBwLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslcC5lbGVtZW50O1sKLTwhRU5USVRZICUgcC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiID4KLTwhRU5USVRZICUgcC5xbmFtZSAgInAiID4KLTwhRUxFTUVOVCAlcC5xbmFtZTsgICVwLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHAuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBwLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslcC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgcC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1ibGtzdHJ1Y3QtMS5tb2QgLS0+Ci1dXT4KLQotPCFFTlRJVFkgJSB4aHRtbC1ibGtwaHJhcy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1ibGtwaHJhcy5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1ibGtwaHJhcy5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJsb2NrIFBocmFzYWwgMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1ibGtwaHJhcy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCbG9jayBQaHJhc2FsIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1ibGtwaHJhcy0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCbG9jayBQaHJhc2FsIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmxrcGhyYXMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQmxvY2sgUGhyYXNhbAotCi0gICAgICAgIGFkZHJlc3MsIGJsb2NrcXVvdGUsIHByZSwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNgotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyB1c2VkIHRvCi0gICAgIHN1cHBvcnQgYmxvY2stbGV2ZWwgcGhyYXNhbCBtYXJrdXAuCi0tLT4KLQotPCFFTlRJVFkgJSBhZGRyZXNzLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslYWRkcmVzcy5lbGVtZW50O1sKLTwhRU5USVRZICUgYWRkcmVzcy5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiID4KLTwhRU5USVRZICUgYWRkcmVzcy5xbmFtZSAgImFkZHJlc3MiID4KLTwhRUxFTUVOVCAlYWRkcmVzcy5xbmFtZTsgICVhZGRyZXNzLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGFkZHJlc3MuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBhZGRyZXNzLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYWRkcmVzcy5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYWRkcmVzcy5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYWRkcmVzcy5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGJsb2NrcXVvdGUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVibG9ja3F1b3RlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBibG9ja3F1b3RlLmNvbnRlbnQKLSAgICAgIiggJUJsb2NrLm1peDsgKSsiCi0+Ci08IUVOVElUWSAlIGJsb2NrcXVvdGUucW5hbWUgICJibG9ja3F1b3RlIiA+Ci08IUVMRU1FTlQgJWJsb2NrcXVvdGUucW5hbWU7ICAlYmxvY2txdW90ZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBibG9ja3F1b3RlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYmxvY2txdW90ZS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJsb2NrcXVvdGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJWJsb2NrcXVvdGUucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGNpdGUgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGJsb2NrcXVvdGUuYXR0bGlzdCAtLT5dXT4KLQotPCFFTlRJVFkgJSBwcmUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVwcmUuZWxlbWVudDtbCi08IUVOVElUWSAlIHByZS5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEKLSAgICAgIHwgJUlubFN0cnVjdC5jbGFzczsKLSAgICAgICVJbmxQaHJhcy5jbGFzczsKLSAgICAgIHwgJXR0LnFuYW1lOyB8ICVpLnFuYW1lOyB8ICViLnFuYW1lOwotICAgICAgJUkxOG4uY2xhc3M7Ci0gICAgICAlQW5jaG9yLmNsYXNzOwotICAgICAgfCAlc2NyaXB0LnFuYW1lOyB8ICVtYXAucW5hbWU7Ci0gICAgICAlSW5saW5lLmV4dHJhOyApKiIKLT4KLTwhRU5USVRZICUgcHJlLnFuYW1lICAicHJlIiA+Ci08IUVMRU1FTlQgJXByZS5xbmFtZTsgICVwcmUuY29udGVudDsgPgotPCEtLSBlbmQgb2YgcHJlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgcHJlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslcHJlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVwcmUucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIHhtbDpzcGFjZSAgICAoIHByZXNlcnZlICkgICAgICAgICAgICAgI0ZJWEVEICdwcmVzZXJ2ZScKLT4KLTwhLS0gZW5kIG9mIHByZS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4gIEhlYWRpbmcgRWxlbWVudHMgIC4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgSGVhZGluZy5jb250ZW50ICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIiA+Ci0KLTwhRU5USVRZICUgaDEuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoMS5lbGVtZW50O1sKLTwhRU5USVRZICUgaDEucW5hbWUgICJoMSIgPgotPCFFTEVNRU5UICVoMS5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGgxLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDEuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoMS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDEucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGgxLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoMi5lbGVtZW50O1sKLTwhRU5USVRZICUgaDIucW5hbWUgICJoMiIgPgotPCFFTEVNRU5UICVoMi5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGgyLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDIuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoMi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGgyLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDMuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoMy5lbGVtZW50O1sKLTwhRU5USVRZICUgaDMucW5hbWUgICJoMyIgPgotPCFFTEVNRU5UICVoMy5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGgzLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDMuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoMy5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDMucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGgzLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoNC5lbGVtZW50O1sKLTwhRU5USVRZICUgaDQucW5hbWUgICJoNCIgPgotPCFFTEVNRU5UICVoNC5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGg0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoNC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGg0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDUuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoNS5lbGVtZW50O1sKLTwhRU5USVRZICUgaDUucW5hbWUgICJoNSIgPgotPCFFTEVNRU5UICVoNS5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGg1LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoNS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDUucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGg1LmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDYuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVoNi5lbGVtZW50O1sKLTwhRU5USVRZICUgaDYucW5hbWUgICJoNiIgPgotPCFFTEVNRU5UICVoNi5xbmFtZTsgICVIZWFkaW5nLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGg2LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaDYuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoNi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaDYucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGg2LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWJsa3BocmFzLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXRleHQtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBIeXBlcnRleHQgTW9kdWxlIChyZXF1aXJlZCkgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1oeXBlcnRleHQubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtaHlwZXJ0ZXh0Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWh5cGVydGV4dC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEh5cGVydGV4dCAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1oeXBlcnRleHQtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgSHlwZXJ0ZXh0IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtaHlwZXJ0ZXh0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEh5cGVydGV4dCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWh5cGVydGV4dC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBIeXBlcnRleHQKLQotICAgICAgICBhCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGFuY2hvciAoJ2EnKSBlbGVtZW50IHR5cGUsIHdoaWNoCi0gICAgIGRlZmluZXMgdGhlIHNvdXJjZSBvZiBhIGh5cGVydGV4dCBsaW5rLiBUaGUgZGVzdGluYXRpb24KLSAgICAgKG9yIGxpbmsgJ3RhcmdldCcpIGlzIGlkZW50aWZpZWQgdmlhIGl0cyAnaWQnIGF0dHJpYnV0ZQotICAgICByYXRoZXIgdGhhbiB0aGUgJ25hbWUnIGF0dHJpYnV0ZSBhcyB3YXMgdXNlZCBpbiBIVE1MLgotLS0+Ci0KLTwhLS0gLi4uLi4uLi4uLi4uICBBbmNob3IgRWxlbWVudCAgLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGEuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVhLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBhLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxOb0FuY2hvci5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBhLnFuYW1lICAiYSIgPgotPCFFTEVNRU5UICVhLnFuYW1lOyAgJWEuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGEuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVhLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVhLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBocmVmICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBjaGFyc2V0ICAgICAgJUNoYXJzZXQuZGF0YXR5cGU7ICAgICAgICNJTVBMSUVECi0gICAgICB0eXBlICAgICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNJTVBMSUVECi0gICAgICBocmVmbGFuZyAgICAgJUxhbmd1YWdlQ29kZS5kYXRhdHlwZTsgICNJTVBMSUVECi0gICAgICByZWwgICAgICAgICAgJUxpbmtUeXBlcy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICByZXYgICAgICAgICAgJUxpbmtUeXBlcy5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICBhY2Nlc3NrZXkgICAgJUNoYXJhY3Rlci5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0gICAgICB0YWJpbmRleCAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBhLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWh5cGVydGV4dC0xLm1vZCAtLT4KLV1dPgotCi08IS0tIExpc3RzIE1vZHVsZSAocmVxdWlyZWQpICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWxpc3QubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtbGlzdC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1saXN0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTGlzdHMgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbGlzdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBMaXN0cyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1saXN0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIExpc3RzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbGlzdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBMaXN0cwotCi0gICAgICAgIGRsLCBkdCwgZGQsIG9sLCB1bCwgbGkKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyB0aGUgbGlzdC1vcmllbnRlZCBlbGVtZW50IHR5cGVzCi0gICAgIGFuZCB0aGVpciBhdHRyaWJ1dGVzLgotLS0+Ci0KLTwhRU5USVRZICUgZGwucW5hbWUgICJkbCIgPgotPCFFTlRJVFkgJSBkdC5xbmFtZSAgImR0IiA+Ci08IUVOVElUWSAlIGRkLnFuYW1lICAiZGQiID4KLTwhRU5USVRZICUgb2wucW5hbWUgICJvbCIgPgotPCFFTlRJVFkgJSB1bC5xbmFtZSAgInVsIiA+Ci08IUVOVElUWSAlIGxpLnFuYW1lICAibGkiID4KLQotPCEtLSBkbDogRGVmaW5pdGlvbiBMaXN0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgZGwuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVkbC5lbGVtZW50O1sKLTwhRU5USVRZICUgZGwuY29udGVudCAgIiggJWR0LnFuYW1lOyB8ICVkZC5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAlZGwucW5hbWU7ICAlZGwuY29udGVudDsgPgotPCEtLSBlbmQgb2YgZGwuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBkbC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWRsLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVkbC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgZGwuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBkdDogRGVmaW5pdGlvbiBUZXJtIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgZHQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVkdC5lbGVtZW50O1sKLTwhRU5USVRZICUgZHQuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUlubGluZS5taXg7ICkqIgotPgotPCFFTEVNRU5UICVkdC5xbmFtZTsgICVkdC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBkdC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGR0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZHQuYXR0bGlzdDtbCi08IUFUVExJU1QgJWR0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBkdC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGRkOiBEZWZpbml0aW9uIERlc2NyaXB0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBkZC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWRkLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBkZC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7ICkqIgotPgotPCFFTEVNRU5UICVkZC5xbmFtZTsgICVkZC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBkZC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGRkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslZGQuYXR0bGlzdDtbCi08IUFUVExJU1QgJWRkLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBkZC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIG9sOiBPcmRlcmVkIExpc3QgKG51bWJlcmVkIHN0eWxlcykgLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBvbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJW9sLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBvbC5jb250ZW50ICAiKCAlbGkucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJW9sLnFuYW1lOyAgJW9sLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIG9sLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgb2wuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVvbC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlb2wucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIG9sLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gdWw6IFVub3JkZXJlZCBMaXN0IChidWxsZXQgc3R5bGVzKSAuLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHVsLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldWwuZWxlbWVudDtbCi08IUVOVElUWSAlIHVsLmNvbnRlbnQgICIoICVsaS5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAldWwucW5hbWU7ICAldWwuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdWwuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB1bC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXVsLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV1bC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdWwuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBsaTogTGlzdCBJdGVtIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgbGkuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVsaS5lbGVtZW50O1sKLTwhRU5USVRZICUgbGkuY29udGVudAotICAgICAiKCAjUENEQVRBIHwgJUZsb3cubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAlbGkucW5hbWU7ICAlbGkuY29udGVudDsgPgotPCEtLSBlbmQgb2YgbGkuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBsaS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWxpLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVsaS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgbGkuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtbGlzdC0xLm1vZCAtLT4KLV1dPgotCi08IS0tIDo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6IC0tPgotCi08IS0tIEVkaXQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWVkaXQubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtZWRpdC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1lZGl0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRWRpdGluZyBFbGVtZW50cyAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1lZGl0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEVkaXRpbmcgRWxlbWVudHMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWVkaXQtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRWRpdGluZyBNYXJrdXAgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1lZGl0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEVkaXRpbmcgRWxlbWVudHMKLQotICAgICAgICBpbnMsIGRlbAotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZXMgdXNlZCB0byBpbmRpY2F0ZQotICAgICBpbnNlcnRlZCBhbmQgZGVsZXRlZCBjb250ZW50IHdoaWxlIGVkaXRpbmcgYSBkb2N1bWVudC4KLS0tPgotCi08IS0tIGluczogSW5zZXJ0ZWQgVGV4dCAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBpbnMuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVpbnMuZWxlbWVudDtbCi08IUVOVElUWSAlIGlucy5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7ICkqIgotPgotPCFFTlRJVFkgJSBpbnMucW5hbWUgICJpbnMiID4KLTwhRUxFTUVOVCAlaW5zLnFuYW1lOyAgJWlucy5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBpbnMuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBpbnMuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVpbnMuYXR0bGlzdDtbCi08IUFUVExJU1QgJWlucy5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgY2l0ZSAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgZGF0ZXRpbWUgICAgICVEYXRldGltZS5kYXRhdHlwZTsgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgaW5zLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZGVsOiBEZWxldGVkIFRleHQgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGRlbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWRlbC5lbGVtZW50O1sKLTwhRU5USVRZICUgZGVsLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVGbG93Lm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGRlbC5xbmFtZSAgImRlbCIgPgotPCFFTEVNRU5UICVkZWwucW5hbWU7ICAlZGVsLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGRlbC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGRlbC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWRlbC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZGVsLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBjaXRlICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBkYXRldGltZSAgICAgJURhdGV0aW1lLmRhdGF0eXBlOyAgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBkZWwuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtZWRpdC0xLm1vZCAtLT4KLV1dPgotCi08IS0tIEJJREkgT3ZlcnJpZGUgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWJkby5tb2R1bGUgIiVYSFRNTC5iaWRpOyIgPgotPCFbJXhodG1sLWJkby5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1iZG8ubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCSURJIE92ZXJyaWRlIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmRvLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEJETyBFbGVtZW50IE1vZHVsZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWJkby0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCRE8gRWxlbWVudCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWJkby0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBCaWRpcmVjdGlvbmFsIE92ZXJyaWRlIChiZG8pIEVsZW1lbnQKLQotICAgICBUaGlzIG1vZHVsZXMgZGVjbGFyZXMgdGhlIGVsZW1lbnQgJ2JkbycsIHVzZWQgdG8gb3ZlcnJpZGUgdGhlCi0gICAgIFVuaWNvZGUgYmlkaXJlY3Rpb25hbCBhbGdvcml0aG0gZm9yIHNlbGVjdGVkIGZyYWdtZW50cyBvZiB0ZXh0LgotCi0gICAgIERFUEVOREVOQ0lFUzoKLSAgICAgUmVsaWVzIG9uIHRoZSBjb25kaXRpb25hbCBzZWN0aW9uIGtleXdvcmQgJVhIVE1MLmJpZGk7IGRlY2xhcmVkCi0gICAgIGFzICJJTkNMVURFIi4gQmlkaXJlY3Rpb25hbCB0ZXh0IHN1cHBvcnQgaW5jbHVkZXMgYm90aCB0aGUgYmRvCi0gICAgIGVsZW1lbnQgYW5kIHRoZSAnZGlyJyBhdHRyaWJ1dGUuCi0tLT4KLQotPCFFTlRJVFkgJSBiZG8uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyViZG8uZWxlbWVudDtbCi08IUVOVElUWSAlIGJkby5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlSW5saW5lLm1peDsgKSoiCi0+Ci08IUVOVElUWSAlIGJkby5xbmFtZSAgImJkbyIgPgotPCFFTEVNRU5UICViZG8ucW5hbWU7ICAlYmRvLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGJkby5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJkby5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJkby5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYmRvLnFuYW1lOwotICAgICAgJUNvcmUuYXR0cmliOwotICAgICAgeG1sOmxhbmcgICAgICVMYW5ndWFnZUNvZGUuZGF0YXR5cGU7ICAjSU1QTElFRAotICAgICAgZGlyICAgICAgICAgICggbHRyIHwgcnRsICkgICAgICAgICAgICAjUkVRVUlSRUQKLT4KLV1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1iZG8tMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBSdWJ5IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSBSdWJ5LmNvbW1vbi5hdHRsaXN0cyAiSU5DTFVERSIgPgotPCFFTlRJVFkgJSBSdWJ5LmNvbW1vbi5hdHRyaWIgIiVDb21tb24uYXR0cmliOyIgPgotPCFFTlRJVFkgJSB4aHRtbC1ydWJ5Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLXJ1YnkubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtcnVieS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFJ1YnkgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9ydWJ5L3hodG1sLXJ1YnktMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgUnVieSBNb2R1bGUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtcnVieS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk5LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkCi0KLSAgICAgVGhpcyBtb2R1bGUgaXMgYmFzZWQgb24gdGhlIFczQyBSdWJ5IEFubm90YXRpb24gU3BlY2lmaWNhdGlvbjoKLQotICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9ydWJ5Ci0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFJ1YnkgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3J1YnkveGh0bWwtcnVieS0xLm1vZCIKLQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFJ1YnkgRWxlbWVudHMKLQotICAgICAgICBydWJ5LCByYmMsIHJ0YywgcmIsIHJ0LCBycAotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyB1c2VkIHRvCi0gICAgIHN1cHBvcnQgcnVieSBhbm5vdGF0aW9uIG1hcmt1cC4KLS0tPgotCi08IS0tIGRlY2xhcmUgcXVhbGlmaWVkIGVsZW1lbnQgdHlwZSBuYW1lczoKLS0tPgotPCFFTlRJVFkgJSBydWJ5LnFuYW1lICAicnVieSIgPgotPCFFTlRJVFkgJSByYmMucW5hbWUgICJyYmMiID4KLTwhRU5USVRZICUgcnRjLnFuYW1lICAicnRjIiA+Ci08IUVOVElUWSAlIHJiLnFuYW1lICAicmIiID4KLTwhRU5USVRZICUgcnQucW5hbWUgICJydCIgPgotPCFFTlRJVFkgJSBycC5xbmFtZSAgInJwIiA+Ci0KLTwhLS0gcnAgZmFsbGJhY2sgaXMgaW5jbHVkZWQgYnkgZGVmYXVsdC4KLS0tPgotPCFFTlRJVFkgJSBSdWJ5LmZhbGxiYWNrICJJTkNMVURFIiA+Ci08IUVOVElUWSAlIFJ1YnkuZmFsbGJhY2subWFuZGF0b3J5ICJJR05PUkUiID4KLQotPCEtLSBDb21wbGV4IHJ1YnkgaXMgaW5jbHVkZWQgYnkgZGVmYXVsdDsgaXQgbWF5IGJlIAotICAgICBvdmVycmlkZGVuIGJ5IG90aGVyIG1vZHVsZXMgdG8gaWdub3JlIGl0LgotLS0+Ci08IUVOVElUWSAlIFJ1YnkuY29tcGxleCAiSU5DTFVERSIgPgotCi08IS0tIEZyYWdtZW50cyBmb3IgdGhlIGNvbnRlbnQgbW9kZWwgb2YgdGhlIHJ1YnkgZWxlbWVudCAtLT4KLTwhWyVSdWJ5LmZhbGxiYWNrO1sKLTwhWyVSdWJ5LmZhbGxiYWNrLm1hbmRhdG9yeTtbCi08IUVOVElUWSAlIFJ1YnkuY29udGVudC5zaW1wbGUgCi0gICAgICIoICVyYi5xbmFtZTssICVycC5xbmFtZTssICVydC5xbmFtZTssICVycC5xbmFtZTsgKSIKLT4KLV1dPgotPCFFTlRJVFkgJSBSdWJ5LmNvbnRlbnQuc2ltcGxlIAotICAgICAiKCAlcmIucW5hbWU7LCAoICVydC5xbmFtZTsgfCAoICVycC5xbmFtZTssICVydC5xbmFtZTssICVycC5xbmFtZTsgKSApICkiCi0+Ci1dXT4KLTwhRU5USVRZICUgUnVieS5jb250ZW50LnNpbXBsZSAiKCAlcmIucW5hbWU7LCAlcnQucW5hbWU7ICkiID4KLQotPCFbJVJ1YnkuY29tcGxleDtbCi08IUVOVElUWSAlIFJ1YnkuY29udGVudC5jb21wbGV4IAotICAgICAifCAoICVyYmMucW5hbWU7LCAlcnRjLnFuYW1lOywgJXJ0Yy5xbmFtZTs/ICkiCi0+Ci1dXT4KLTwhRU5USVRZICUgUnVieS5jb250ZW50LmNvbXBsZXggIiIgPgotCi08IS0tIENvbnRlbnQgbW9kZWxzIG9mIHRoZSByYiBhbmQgdGhlIHJ0IGVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0bwotICAgICBhbGxvdyBvdGhlciBpbmxpbmUtbGV2ZWwgZWxlbWVudHMgb2YgaXRzIHBhcmVudCBtYXJrdXAgbGFuZ3VhZ2UsCi0gICAgIGJ1dCBpdCBzaG91bGQgbm90IGluY2x1ZGUgcnVieSBkZXNjZW5kZW50IGVsZW1lbnRzLiBUaGUgZm9sbG93aW5nCi0gICAgIHBhcmFtZXRlciBlbnRpdHkgJU5vUnVieS5jb250ZW50OyBjYW4gYmUgdXNlZCB0byByZWRlZmluZQotICAgICB0aG9zZSBjb250ZW50IG1vZGVscyB3aXRoIG1pbmltdW0gZWZmb3J0LiAgSXQncyBkZWZpbmVkIGFzCi0gICAgICcoICNQQ0RBVEEgKScgYnkgZGVmYXVsdC4KLS0tPgotPCFFTlRJVFkgJSBOb1J1YnkuY29udGVudCAiKCAjUENEQVRBICkiID4KLQotPCEtLSBvbmUgb3IgbW9yZSBkaWdpdHMgKE5VTUJFUikgLS0+Ci08IUVOVElUWSAlIE51bWJlci5kYXRhdHlwZSAiQ0RBVEEiID4KLQotPCEtLSBydWJ5IGVsZW1lbnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgcnVieS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXJ1YnkuZWxlbWVudDtbCi08IUVOVElUWSAlIHJ1YnkuY29udGVudAotICAgICAiKCAlUnVieS5jb250ZW50LnNpbXBsZTsgJVJ1YnkuY29udGVudC5jb21wbGV4OyApIgotPgotPCFFTEVNRU5UICVydWJ5LnFuYW1lOyAgJXJ1YnkuY29udGVudDsgPgotPCEtLSBlbmQgb2YgcnVieS5lbGVtZW50IC0tPl1dPgotCi08IVslUnVieS5jb21wbGV4O1sKLTwhLS0gcmJjIChydWJ5IGJhc2UgY29tcG9uZW50KSBlbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHJiYy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXJiYy5lbGVtZW50O1sKLTwhRU5USVRZICUgcmJjLmNvbnRlbnQKLSAgICAgIiglcmIucW5hbWU7KSsiCi0+Ci08IUVMRU1FTlQgJXJiYy5xbmFtZTsgICVyYmMuY29udGVudDsgPgotPCEtLSBlbmQgb2YgcmJjLmVsZW1lbnQgLS0+XV0+Ci0KLTwhLS0gcnRjIChydWJ5IHRleHQgY29tcG9uZW50KSBlbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHJ0Yy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXJ0Yy5lbGVtZW50O1sKLTwhRU5USVRZICUgcnRjLmNvbnRlbnQKLSAgICAgIiglcnQucW5hbWU7KSsiCi0+Ci08IUVMRU1FTlQgJXJ0Yy5xbmFtZTsgICVydGMuY29udGVudDsgPgotPCEtLSBlbmQgb2YgcnRjLmVsZW1lbnQgLS0+XV0+Ci1dXT4KLQotPCEtLSByYiAocnVieSBiYXNlKSBlbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgcmIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVyYi5lbGVtZW50O1sKLTwhLS0gJXJiLmNvbnRlbnQ7IHVzZXMgJU5vUnVieS5jb250ZW50OyBhcyBpdHMgY29udGVudCBtb2RlbCwKLSAgICAgd2hpY2ggaXMgJyggI1BDREFUQSApJyBieSBkZWZhdWx0LiBJdCBtYXkgYmUgb3ZlcnJpZGRlbgotICAgICBieSBvdGhlciBtb2R1bGVzIHRvIGFsbG93IG90aGVyIGlubGluZS1sZXZlbCBlbGVtZW50cwotICAgICBvZiBpdHMgcGFyZW50IG1hcmt1cCBsYW5ndWFnZSwgYnV0IGl0IHNob3VsZCBub3QgaW5jbHVkZQotICAgICBydWJ5IGRlc2NlbmRlbnQgZWxlbWVudHMuCi0tLT4KLTwhRU5USVRZICUgcmIuY29udGVudCAiJU5vUnVieS5jb250ZW50OyIgPgotPCFFTEVNRU5UICVyYi5xbmFtZTsgICVyYi5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiByYi5lbGVtZW50IC0tPl1dPgotCi08IS0tIHJ0IChydWJ5IHRleHQpIGVsZW1lbnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBydC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXJ0LmVsZW1lbnQ7WwotPCEtLSAlcnQuY29udGVudDsgdXNlcyAlTm9SdWJ5LmNvbnRlbnQ7IGFzIGl0cyBjb250ZW50IG1vZGVsLAotICAgICB3aGljaCBpcyAnKCAjUENEQVRBICknIGJ5IGRlZmF1bHQuIEl0IG1heSBiZSBvdmVycmlkZGVuCi0gICAgIGJ5IG90aGVyIG1vZHVsZXMgdG8gYWxsb3cgb3RoZXIgaW5saW5lLWxldmVsIGVsZW1lbnRzCi0gICAgIG9mIGl0cyBwYXJlbnQgbWFya3VwIGxhbmd1YWdlLCBidXQgaXQgc2hvdWxkIG5vdCBpbmNsdWRlCi0gICAgIHJ1YnkgZGVzY2VuZGVudCBlbGVtZW50cy4KLS0tPgotPCFFTlRJVFkgJSBydC5jb250ZW50ICIlTm9SdWJ5LmNvbnRlbnQ7IiA+Ci0KLTwhRUxFTUVOVCAlcnQucW5hbWU7ICAlcnQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgcnQuZWxlbWVudCAtLT5dXT4KLQotPCEtLSByYnNwYW4gYXR0cmlidXRlIGlzIHVzZWQgZm9yIGNvbXBsZXggcnVieSBvbmx5IC4uLi4uLiAtLT4KLTwhWyVSdWJ5LmNvbXBsZXg7WwotPCFFTlRJVFkgJSBydC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXJ0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVydC5xbmFtZTsKLSAgICAgIHJic3BhbiAgICAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgIjEiCi0+Ci08IS0tIGVuZCBvZiBydC5hdHRsaXN0IC0tPl1dPgotXV0+Ci0KLTwhLS0gcnAgKHJ1YnkgcGFyZW50aGVzaXMpIGVsZW1lbnQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IVslUnVieS5mYWxsYmFjaztbCi08IUVOVElUWSAlIHJwLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslcnAuZWxlbWVudDtbCi08IUVOVElUWSAlIHJwLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSApIgotPgotPCFFTEVNRU5UICVycC5xbmFtZTsgICVycC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBycC5lbGVtZW50IC0tPl1dPgotXV0+Ci0KLTwhLS0gUnVieSBDb21tb24gQXR0cmlidXRlcwotCi0gICAgIFRoZSBmb2xsb3dpbmcgb3B0aW9uYWwgQVRUTElTVCBkZWNsYXJhdGlvbnMgcHJvdmlkZSBhbiBlYXN5IHdheQotICAgICB0byBkZWZpbmUgY29tbW9uIGF0dHJpYnV0ZXMgZm9yIHJ1YnkgZWxlbWVudHMuICBUaGVzZSBkZWNsYXJhdGlvbnMKLSAgICAgYXJlIGlnbm9yZWQgYnkgZGVmYXVsdC4KLQotICAgICBSdWJ5IGVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBoYXZlIGNvbW1vbiBhdHRyaWJ1dGVzIG9mIGl0cwotICAgICBwYXJlbnQgbWFya3VwIGxhbmd1YWdlLiAgRm9yIGV4YW1wbGUsIGlmIGEgbWFya3VwIGxhbmd1YWdlIGRlZmluZXMKLSAgICAgY29tbW9uIGF0dHJpYnV0ZXMgYXMgYSBwYXJhbWV0ZXIgZW50aXR5ICVhdHRyczssIHlvdSBtYXkgYWRkCi0gICAgIHRob3NlIGF0dHJpYnV0ZXMgYnkganVzdCBkZWNsYXJpbmcgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXIgZW50aXRpZXMKLQotICAgICAgICAgPCFFTlRJVFkgJSBSdWJ5LmNvbW1vbi5hdHRsaXN0cyAgIklOQ0xVREUiID4KLSAgICAgICAgIDwhRU5USVRZICUgUnVieS5jb21tb24uYXR0cmliICAiJWF0dHJzOyIgPgotCi0gICAgIGJlZm9yZSBpbmNsdWRpbmcgdGhlIFJ1YnkgbW9kdWxlLgotLS0+Ci0KLTwhRU5USVRZICUgUnVieS5jb21tb24uYXR0bGlzdHMgICJJR05PUkUiID4KLTwhWyVSdWJ5LmNvbW1vbi5hdHRsaXN0cztbCi08IUVOVElUWSAlIFJ1YnkuY29tbW9uLmF0dHJpYiAgIiIgPgotCi08IS0tIGNvbW1vbiBhdHRyaWJ1dGVzIGZvciBydWJ5IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBSdWJ5LmNvbW1vbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJVJ1YnkuY29tbW9uLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVydWJ5LnFuYW1lOwotICAgICAgJVJ1YnkuY29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIFJ1YnkuY29tbW9uLmF0dGxpc3QgLS0+XV0+Ci0KLTwhWyVSdWJ5LmNvbXBsZXg7WwotPCEtLSBjb21tb24gYXR0cmlidXRlcyBmb3IgcmJjIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgUmJjLmNvbW1vbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJVJiYy5jb21tb24uYXR0bGlzdDtbCi08IUFUVExJU1QgJXJiYy5xbmFtZTsKLSAgICAgICVSdWJ5LmNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBSYmMuY29tbW9uLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gY29tbW9uIGF0dHJpYnV0ZXMgZm9yIHJ0YyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIFJ0Yy5jb21tb24uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVSdGMuY29tbW9uLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVydGMucW5hbWU7Ci0gICAgICAlUnVieS5jb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgUnRjLmNvbW1vbi5hdHRsaXN0IC0tPl1dPgotXV0+Ci0KLTwhLS0gY29tbW9uIGF0dHJpYnV0ZXMgZm9yIHJiIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIFJiLmNvbW1vbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJVJiLmNvbW1vbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcmIucW5hbWU7Ci0gICAgICAlUnVieS5jb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgUmIuY29tbW9uLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gY29tbW9uIGF0dHJpYnV0ZXMgZm9yIHJ0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIFJ0LmNvbW1vbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJVJ0LmNvbW1vbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcnQucW5hbWU7Ci0gICAgICAlUnVieS5jb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgUnQuY29tbW9uLmF0dGxpc3QgLS0+XV0+Ci0KLTwhWyVSdWJ5LmZhbGxiYWNrO1sKLTwhLS0gY29tbW9uIGF0dHJpYnV0ZXMgZm9yIHJwIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIFJwLmNvbW1vbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJVJwLmNvbW1vbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcnAucW5hbWU7Ci0gICAgICAlUnVieS5jb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgUnAuY29tbW9uLmF0dGxpc3QgLS0+XV0+Ci1dXT4KLV1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1ydWJ5LTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gUHJlc2VudGF0aW9uIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtcHJlcy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1wcmVzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLXByZXMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBQcmVzZW50YXRpb24gMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtcHJlcy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBQcmVzZW50YXRpb24gTW9kdWxlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1wcmVzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFByZXNlbnRhdGlvbiAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXByZXMtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gUHJlc2VudGF0aW9uYWwgRWxlbWVudHMKLQotICAgICBUaGlzIG1vZHVsZSBkZWZpbmVzIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIGZvcgotICAgICBzaW1wbGUgcHJlc2VudGF0aW9uLXJlbGF0ZWQgbWFya3VwLgotLS0+Ci0KLTwhRU5USVRZICUgeGh0bWwtaW5scHJlcy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1pbmxwcmVzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWlubHByZXMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbmxpbmUgUHJlc2VudGF0aW9uIDEuMC8vRU4iCi0gICAgICAgICAgICAieGh0bWwtaW5scHJlcy0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBJbmxpbmUgUHJlc2VudGF0aW9uIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1pbmxwcmVzLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIElubGluZSBQcmVzZW50YXRpb24gMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1pbmxwcmVzLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIElubGluZSBQcmVzZW50YXRpb25hbCBFbGVtZW50cwotCi0gICAgICAgIGIsIGJpZywgaSwgc21hbGwsIHN1Yiwgc3VwLCB0dAotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBlbGVtZW50cyBhbmQgdGhlaXIgYXR0cmlidXRlcyB1c2VkIHRvCi0gICAgIHN1cHBvcnQgaW5saW5lLWxldmVsIHByZXNlbnRhdGlvbmFsIG1hcmt1cC4KLS0tPgotCi08IUVOVElUWSAlIGIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyViLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBiLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYi5xbmFtZSAgImIiID4KLTwhRUxFTUVOVCAlYi5xbmFtZTsgICViLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBiLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgYi5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGJpZy5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWJpZy5lbGVtZW50O1sKLTwhRU5USVRZICUgYmlnLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgYmlnLnFuYW1lICAiYmlnIiA+Ci08IUVMRU1FTlQgJWJpZy5xbmFtZTsgICViaWcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYmlnLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYmlnLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslYmlnLmF0dGxpc3Q7WwotPCFBVFRMSVNUICViaWcucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGJpZy5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIGkuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVpLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBpLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgaS5xbmFtZSAgImkiID4KLTwhRUxFTUVOVCAlaS5xbmFtZTsgICVpLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGkuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBpLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlaS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgaS5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHNtYWxsLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc21hbGwuZWxlbWVudDtbCi08IUVOVElUWSAlIHNtYWxsLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc21hbGwucW5hbWUgICJzbWFsbCIgPgotPCFFTEVNRU5UICVzbWFsbC5xbmFtZTsgICVzbWFsbC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzbWFsbC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHNtYWxsLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc21hbGwuYXR0bGlzdDtbCi08IUFUVExJU1QgJXNtYWxsLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBzbWFsbC5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHN1Yi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXN1Yi5lbGVtZW50O1sKLTwhRU5USVRZICUgc3ViLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc3ViLnFuYW1lICAic3ViIiA+Ci08IUVMRU1FTlQgJXN1Yi5xbmFtZTsgICVzdWIuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc3ViLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3ViLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc3ViLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzdWIucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHN1Yi5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHN1cC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXN1cC5lbGVtZW50O1sKLTwhRU5USVRZICUgc3VwLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgc3VwLnFuYW1lICAic3VwIiA+Ci08IUVMRU1FTlQgJXN1cC5xbmFtZTsgICVzdXAuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc3VwLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc3VwLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc3VwLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzdXAucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHN1cC5hdHRsaXN0IC0tPl1dPgotCi08IUVOVElUWSAlIHR0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldHQuZWxlbWVudDtbCi08IUVOVElUWSAlIHR0LmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRU5USVRZICUgdHQucW5hbWUgICJ0dCIgPgotPCFFTEVNRU5UICV0dC5xbmFtZTsgICV0dC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0dC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHR0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldHQuYXR0bGlzdDtbCi08IUFUVExJU1QgJXR0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0dC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1pbmxwcmVzLTEubW9kIC0tPgotXV0+Ci0KLTwhRU5USVRZICUgeGh0bWwtYmxrcHJlcy5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1ibGtwcmVzLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWJsa3ByZXMubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCbG9jayBQcmVzZW50YXRpb24gMS4wLy9FTiIKLSAgICAgICAgICAgICJ4aHRtbC1ibGtwcmVzLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIEJsb2NrIFByZXNlbnRhdGlvbiBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWJsa3ByZXMtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgQmxvY2sgUHJlc2VudGF0aW9uIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmxrcHJlcy0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBCbG9jayBQcmVzZW50YXRpb25hbCBFbGVtZW50cwotCi0gICAgICAgIGhyCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGVsZW1lbnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzIHVzZWQgdG8KLSAgICAgc3VwcG9ydCBibG9jay1sZXZlbCBwcmVzZW50YXRpb25hbCBtYXJrdXAuCi0tLT4KLQotPCFFTlRJVFkgJSBoci5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWhyLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBoci5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgaHIucW5hbWUgICJociIgPgotPCFFTEVNRU5UICVoci5xbmFtZTsgICVoci5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBoci5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGhyLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaHIuYXR0bGlzdDtbCi08IUFUVExJU1QgJWhyLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoci5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1ibGtwcmVzLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXByZXMtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBMaW5rIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1saW5rLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLWxpbmsubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtbGluay5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIExpbmsgRWxlbWVudCAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1saW5rLTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIExpbmsgRWxlbWVudCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLWxpbmstMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTGluayBFbGVtZW50IDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtbGluay0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBMaW5rIGVsZW1lbnQKLQotICAgICAgICBsaW5rCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGxpbmsgZWxlbWVudCB0eXBlIGFuZCBpdHMgYXR0cmlidXRlcywKLSAgICAgd2hpY2ggY291bGQgKGluIHByaW5jaXBsZSkgYmUgdXNlZCB0byBkZWZpbmUgZG9jdW1lbnQtbGV2ZWwgbGlua3MKLSAgICAgdG8gZXh0ZXJuYWwgcmVzb3VyY2VzIHN1Y2ggYXM6Ci0KLSAgICAgYSkgZm9yIGRvY3VtZW50IHNwZWNpZmljIHRvb2xiYXJzL21lbnVzLCBlLmcuIHN0YXJ0LCBjb250ZW50cywKLSAgICAgICAgcHJldmlvdXMsIG5leHQsIGluZGV4LCBlbmQsIGhlbHAKLSAgICAgYikgdG8gbGluayB0byBhIHNlcGFyYXRlIHN0eWxlIHNoZWV0IChyZWw9InN0eWxlc2hlZXQiKQotICAgICBjKSB0byBtYWtlIGEgbGluayB0byBhIHNjcmlwdCAocmVsPSJzY3JpcHQiKQotICAgICBkKSBieSBzdHlsZXNoZWV0cyB0byBjb250cm9sIGhvdyBjb2xsZWN0aW9ucyBvZiBodG1sIG5vZGVzIGFyZQotICAgICAgICByZW5kZXJlZCBpbnRvIHByaW50ZWQgZG9jdW1lbnRzCi0gICAgIGUpIHRvIG1ha2UgYSBsaW5rIHRvIGEgcHJpbnRhYmxlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudAotICAgICAgICBlLmcuIGEgcG9zdHNjcmlwdCBvciBwZGYgdmVyc2lvbiAocmVsPSJhbHRlcm5hdGUiIG1lZGlhPSJwcmludCIpCi0tLT4KLQotPCEtLSBsaW5rOiBNZWRpYS1JbmRlcGVuZGVudCBMaW5rIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgbGluay5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWxpbmsuZWxlbWVudDtbCi08IUVOVElUWSAlIGxpbmsuY29udGVudCAgIkVNUFRZIiA+Ci08IUVOVElUWSAlIGxpbmsucW5hbWUgICJsaW5rIiA+Ci08IUVMRU1FTlQgJWxpbmsucW5hbWU7ICAlbGluay5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBsaW5rLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgbGluay5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWxpbmsuYXR0bGlzdDtbCi08IUFUVExJU1QgJWxpbmsucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGNoYXJzZXQgICAgICAlQ2hhcnNldC5kYXRhdHlwZTsgICAgICAgI0lNUExJRUQKLSAgICAgIGhyZWYgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGhyZWZsYW5nICAgICAlTGFuZ3VhZ2VDb2RlLmRhdGF0eXBlOyAgI0lNUExJRUQKLSAgICAgIHR5cGUgICAgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI0lNUExJRUQKLSAgICAgIHJlbCAgICAgICAgICAlTGlua1R5cGVzLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIHJldiAgICAgICAgICAlTGlua1R5cGVzLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIG1lZGlhICAgICAgICAlTWVkaWFEZXNjLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGxpbmsuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtbGluay0xLm1vZCAtLT4KLV1dPgotCi08IS0tIERvY3VtZW50IE1ldGFpbmZvcm1hdGlvbiBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLW1ldGEubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtbWV0YS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1tZXRhLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgTWV0YWluZm9ybWF0aW9uIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLW1ldGEtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgRG9jdW1lbnQgTWV0YWluZm9ybWF0aW9uIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtbWV0YS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBNZXRhaW5mb3JtYXRpb24gMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1tZXRhLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIE1ldGEgSW5mb3JtYXRpb24KLQotICAgICAgICBtZXRhCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIG1ldGEgZWxlbWVudCB0eXBlIGFuZCBpdHMgYXR0cmlidXRlcywKLSAgICAgdXNlZCB0byBwcm92aWRlIGRlY2xhcmF0aXZlIGRvY3VtZW50IG1ldGFpbmZvcm1hdGlvbi4KLS0tPgotCi08IS0tIG1ldGE6IEdlbmVyaWMgTWV0YWluZm9ybWF0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBtZXRhLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslbWV0YS5lbGVtZW50O1sKLTwhRU5USVRZICUgbWV0YS5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgbWV0YS5xbmFtZSAgIm1ldGEiID4KLTwhRUxFTUVOVCAlbWV0YS5xbmFtZTsgICVtZXRhLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIG1ldGEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBtZXRhLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslbWV0YS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlbWV0YS5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICAlSTE4bi5hdHRyaWI7Ci0gICAgICBodHRwLWVxdWl2ICAgTk1UT0tFTiAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBuYW1lICAgICAgICAgTk1UT0tFTiAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBjb250ZW50ICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgc2NoZW1lICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgbWV0YS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1tZXRhLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gQmFzZSBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtYmFzZS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1iYXNlLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWJhc2UubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBCYXNlIEVsZW1lbnQgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtYmFzZS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBCYXNlIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1iYXNlLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEJhc2UgRWxlbWVudCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWJhc2UtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gQmFzZSBlbGVtZW50Ci0KLSAgICAgICAgYmFzZQotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBiYXNlIGVsZW1lbnQgdHlwZSBhbmQgaXRzIGF0dHJpYnV0ZXMsCi0gICAgIHVzZWQgdG8gZGVmaW5lIGEgYmFzZSBVUkkgYWdhaW5zdCB3aGljaCByZWxhdGl2ZSBVUklzIGluIHRoZQotICAgICBkb2N1bWVudCB3aWxsIGJlIHJlc29sdmVkLgotCi0gICAgIE5vdGUgdGhhdCB0aGlzIG1vZHVsZSBhbHNvIHJlZGVjbGFyZXMgdGhlIGNvbnRlbnQgbW9kZWwgZm9yCi0gICAgIHRoZSBoZWFkIGVsZW1lbnQgdG8gaW5jbHVkZSB0aGUgYmFzZSBlbGVtZW50LgotLS0+Ci0KLTwhLS0gYmFzZTogRG9jdW1lbnQgQmFzZSBVUkkgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGJhc2UuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyViYXNlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBiYXNlLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBiYXNlLnFuYW1lICAiYmFzZSIgPgotPCFFTEVNRU5UICViYXNlLnFuYW1lOyAgJWJhc2UuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYmFzZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJhc2UuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyViYXNlLmF0dGxpc3Q7WwotPCFBVFRMSVNUICViYXNlLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgIGhyZWYgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI1JFUVVJUkVECi0+Ci08IS0tIGVuZCBvZiBiYXNlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhRU5USVRZICUgaGVhZC5jb250ZW50Ci0gICAgIiggJUhlYWRPcHRzLm1peDssCi0gICAgICggKCAldGl0bGUucW5hbWU7LCAlSGVhZE9wdHMubWl4OywgKCAlYmFzZS5xbmFtZTssICVIZWFkT3B0cy5taXg7ICk/ICkKLSAgICAgfCAoICViYXNlLnFuYW1lOywgJUhlYWRPcHRzLm1peDssICggJXRpdGxlLnFuYW1lOywgJUhlYWRPcHRzLm1peDsgKSkpKSIKLT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtYmFzZS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIFNjcmlwdGluZyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXNjcmlwdC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1zY3JpcHQubW9kdWxlO1sKLTwhRU5USVRZICUgeGh0bWwtc2NyaXB0Lm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgU2NyaXB0aW5nIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXNjcmlwdC0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBEb2N1bWVudCBTY3JpcHRpbmcgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1zY3JpcHQtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgU2NyaXB0aW5nIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtc2NyaXB0LTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFNjcmlwdGluZwotCi0gICAgICAgIHNjcmlwdCwgbm9zY3JpcHQKLQotICAgICBUaGlzIG1vZHVsZSBkZWNsYXJlcyBlbGVtZW50IHR5cGVzIGFuZCBhdHRyaWJ1dGVzIHVzZWQgdG8gcHJvdmlkZQotICAgICBzdXBwb3J0IGZvciBleGVjdXRhYmxlIHNjcmlwdHMgYXMgd2VsbCBhcyBhbiBhbHRlcm5hdGUgY29udGVudAotICAgICBjb250YWluZXIgd2hlcmUgc2NyaXB0cyBhcmUgbm90IHN1cHBvcnRlZC4KLS0tPgotCi08IS0tIHNjcmlwdDogU2NyaXB0aW5nIFN0YXRlbWVudCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBzY3JpcHQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVzY3JpcHQuZWxlbWVudDtbCi08IUVOVElUWSAlIHNjcmlwdC5jb250ZW50ICAiKCAjUENEQVRBICkiID4KLTwhRU5USVRZICUgc2NyaXB0LnFuYW1lICAic2NyaXB0IiA+Ci08IUVMRU1FTlQgJXNjcmlwdC5xbmFtZTsgICVzY3JpcHQuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc2NyaXB0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc2NyaXB0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc2NyaXB0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzY3JpcHQucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgY2hhcnNldCAgICAgICVDaGFyc2V0LmRhdGF0eXBlOyAgICAgICAjSU1QTElFRAotICAgICAgdHlwZSAgICAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAjUkVRVUlSRUQKLSAgICAgIHNyYyAgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGRlZmVyICAgICAgICAoIGRlZmVyICkgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHhtbDpzcGFjZSAgICAoIHByZXNlcnZlICkgICAgICAgICAgICAgI0ZJWEVEICdwcmVzZXJ2ZScKLT4KLTwhLS0gZW5kIG9mIHNjcmlwdC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIG5vc2NyaXB0OiBOby1TY3JpcHQgQWx0ZXJuYXRlIENvbnRlbnQgLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBub3NjcmlwdC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJW5vc2NyaXB0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBub3NjcmlwdC5jb250ZW50Ci0gICAgICIoICVCbG9jay5taXg7ICkrIgotPgotPCFFTlRJVFkgJSBub3NjcmlwdC5xbmFtZSAgIm5vc2NyaXB0IiA+Ci08IUVMRU1FTlQgJW5vc2NyaXB0LnFuYW1lOyAgJW5vc2NyaXB0LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIG5vc2NyaXB0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgbm9zY3JpcHQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVub3NjcmlwdC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlbm9zY3JpcHQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIG5vc2NyaXB0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLXNjcmlwdC0xLm1vZCAtLT4KLV1dPgotCi08IS0tIFN0eWxlIFNoZWV0cyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1zdHlsZS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1zdHlsZS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1zdHlsZS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFN0eWxlIFNoZWV0cyAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1zdHlsZS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBEb2N1bWVudCBTdHlsZSBTaGVldCBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtc3R5bGUtMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIFN0eWxlIFNoZWV0cyAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXN0eWxlLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFN0eWxlIFNoZWV0cwotCi0gICAgICAgIHN0eWxlCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIHN0eWxlIGVsZW1lbnQgdHlwZSBhbmQgaXRzIGF0dHJpYnV0ZXMsCi0gICAgIHVzZWQgdG8gZW1iZWQgc3R5bGVzaGVldCBpbmZvcm1hdGlvbiBpbiB0aGUgZG9jdW1lbnQgaGVhZCBlbGVtZW50LgotLS0+Ci0KLTwhLS0gc3R5bGU6IFN0eWxlIFNoZWV0IEluZm9ybWF0aW9uIC4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBzdHlsZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXN0eWxlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzdHlsZS5jb250ZW50ICAiKCAjUENEQVRBICkiID4KLTwhRU5USVRZICUgc3R5bGUucW5hbWUgICJzdHlsZSIgPgotPCFFTEVNRU5UICVzdHlsZS5xbmFtZTsgICVzdHlsZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBzdHlsZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHN0eWxlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc3R5bGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJXN0eWxlLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgICV0aXRsZS5hdHRyaWI7Ci0gICAgICAlSTE4bi5hdHRyaWI7Ci0gICAgICB0eXBlICAgICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICNSRVFVSVJFRAotICAgICAgbWVkaWEgICAgICAgICVNZWRpYURlc2MuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgeG1sOnNwYWNlICAgICggcHJlc2VydmUgKSAgICAgICAgICAgICAjRklYRUQgJ3ByZXNlcnZlJwotPgotPCEtLSBlbmQgb2Ygc3R5bGUuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtc3R5bGUtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBJbWFnZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1pbWFnZS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1pbWFnZS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1pbWFnZS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEltYWdlcyAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1pbWFnZS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBJbWFnZXMgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1pbWFnZS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUm92aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBJbWFnZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1pbWFnZS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBJbWFnZXMKLQotICAgICAgICBpbWcKLQotICAgICBUaGlzIG1vZHVsZSBwcm92aWRlcyBtYXJrdXAgdG8gc3VwcG9ydCBiYXNpYyBpbWFnZSBlbWJlZGRpbmcuCi0tLT4KLQotPCEtLSBUbyBhdm9pZCBwcm9ibGVtcyB3aXRoIHRleHQtb25seSBVQXMgYXMgd2VsbCBhcyB0byBtYWtlCi0gICAgIGltYWdlIGNvbnRlbnQgdW5kZXJzdGFuZGFibGUgYW5kIG5hdmlnYWJsZSB0byB1c2VycyBvZgotICAgICBub24tdmlzdWFsIFVBcywgeW91IG5lZWQgdG8gcHJvdmlkZSBhIGRlc2NyaXB0aW9uIHdpdGgKLSAgICAgdGhlICdhbHQnIGF0dHJpYnV0ZSwgYW5kIGF2b2lkIHNlcnZlci1zaWRlIGltYWdlIG1hcHMuCi0tLT4KLQotPCFFTlRJVFkgJSBpbWcuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVpbWcuZWxlbWVudDtbCi08IUVOVElUWSAlIGltZy5jb250ZW50ICAiRU1QVFkiID4KLTwhRU5USVRZICUgaW1nLnFuYW1lICAiaW1nIiA+Ci08IUVMRU1FTlQgJWltZy5xbmFtZTsgICVpbWcuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaW1nLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaW1nLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslaW1nLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVpbWcucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIHNyYyAgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI1JFUVVJUkVECi0gICAgICBhbHQgICAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNSRVFVSVJFRAotICAgICAgbG9uZ2Rlc2MgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgaGVpZ2h0ICAgICAgICVMZW5ndGguZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgd2lkdGggICAgICAgICVMZW5ndGguZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgaW1nLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gZW5kIG9mIHhodG1sLWltYWdlLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gQ2xpZW50LXNpZGUgSW1hZ2UgTWFwIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtY3Npc21hcC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1jc2lzbWFwLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLWNzaXNtYXAubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBDbGllbnQtc2lkZSBJbWFnZSBNYXBzIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWNzaXNtYXAtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgQ2xpZW50LXNpZGUgSW1hZ2UgTWFwIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtY3Npc21hcC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBDbGllbnQtc2lkZSBJbWFnZSBNYXBzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtY3Npc21hcC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBDbGllbnQtc2lkZSBJbWFnZSBNYXBzCi0KLSAgICAgICAgYXJlYSwgbWFwCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgdG8gc3VwcG9ydCBjbGllbnQtc2lkZQotICAgICBpbWFnZSBtYXBzLiBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIEltYWdlIE1vZHVsZSAob3IgYSBtb2R1bGUKLSAgICAgZGVjbGFyaW5nIHRoZSBpbWcgZWxlbWVudCB0eXBlKSBiZSBpbmNsdWRlZCBpbiB0aGUgRFRELgotCi0gICAgIFRoZXNlIGNhbiBiZSBwbGFjZWQgaW4gdGhlIHNhbWUgZG9jdW1lbnQgb3IgZ3JvdXBlZCBpbiBhCi0gICAgIHNlcGFyYXRlIGRvY3VtZW50LCBhbHRob3VnaCB0aGUgbGF0dGVyIGlzbid0IHdpZGVseSBzdXBwb3J0ZWQKLS0tPgotCi08IUVOVElUWSAlIGFyZWEuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVhcmVhLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBhcmVhLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBhcmVhLnFuYW1lICAiYXJlYSIgPgotPCFFTEVNRU5UICVhcmVhLnFuYW1lOyAgJWFyZWEuY29udGVudDsgPgotPCEtLSBlbmQgb2YgYXJlYS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIFNoYXBlLmRhdGF0eXBlICIoIHJlY3QgfCBjaXJjbGUgfCBwb2x5IHwgZGVmYXVsdCApIj4KLTwhRU5USVRZICUgQ29vcmRzLmRhdGF0eXBlICJDREFUQSIgPgotCi08IUVOVElUWSAlIGFyZWEuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVhcmVhLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVhcmVhLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBocmVmICAgICAgICAgJVVSSS5kYXRhdHlwZTsgICAgICAgICAgICNJTVBMSUVECi0gICAgICBzaGFwZSAgICAgICAgJVNoYXBlLmRhdGF0eXBlOyAgICAgICAgICdyZWN0JwotICAgICAgY29vcmRzICAgICAgICVDb29yZHMuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgbm9ocmVmICAgICAgICggbm9ocmVmICkgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgYWx0ICAgICAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjUkVRVUlSRUQKLSAgICAgIHRhYmluZGV4ICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIGFjY2Vzc2tleSAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIGFyZWEuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBtb2RpZnkgYW5jaG9yIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGxpc3QKLSAgICAgdG8gYWxsb3cgZm9yIGNsaWVudC1zaWRlIGltYWdlIG1hcHMKLS0tPgotPCFBVFRMSVNUICVhLnFuYW1lOwotICAgICAgc2hhcGUgICAgICAgICVTaGFwZS5kYXRhdHlwZTsgICAgICAgICAncmVjdCcKLSAgICAgIGNvb3JkcyAgICAgICAlQ29vcmRzLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSBtb2RpZnkgaW1nIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGxpc3QKLSAgICAgdG8gYWxsb3cgZm9yIGNsaWVudC1zaWRlIGltYWdlIG1hcHMKLS0tPgotPCFBVFRMSVNUICVpbWcucW5hbWU7Ci0gICAgICB1c2VtYXAgICAgICAgSURSRUYgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0+Ci0KLTwhLS0gbW9kaWZ5IGZvcm0gaW5wdXQgYXR0cmlidXRlIGRlZmluaXRpb24gbGlzdAotICAgICB0byBhbGxvdyBmb3IgY2xpZW50LXNpZGUgaW1hZ2UgbWFwcwotLS0+Ci08IUFUVExJU1QgJWlucHV0LnFuYW1lOwotICAgICAgdXNlbWFwICAgICAgIElEUkVGICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotPgotCi08IS0tIG1vZGlmeSBvYmplY3QgYXR0cmlidXRlIGRlZmluaXRpb24gbGlzdAotICAgICB0byBhbGxvdyBmb3IgY2xpZW50LXNpZGUgaW1hZ2UgbWFwcwotLS0+Ci08IUFUVExJU1QgJW9iamVjdC5xbmFtZTsKLSAgICAgIHVzZW1hcCAgICAgICBJRFJFRiAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSAndXNlbWFwJyBwb2ludHMgdG8gdGhlICdpZCcgYXR0cmlidXRlIG9mIGEgPG1hcD4gZWxlbWVudCwKLSAgICAgd2hpY2ggbXVzdCBiZSBpbiB0aGUgc2FtZSBkb2N1bWVudDsgc3VwcG9ydCBmb3IgZXh0ZXJuYWwKLSAgICAgZG9jdW1lbnQgbWFwcyB3YXMgbm90IHdpZGVseSBzdXBwb3J0ZWQgaW4gSFRNTCBhbmQgaXMKLSAgICAgZWxpbWluYXRlZCBpbiBYSFRNTC4KLQotICAgICBJdCBpcyBjb25zaWRlcmVkIGFuIGVycm9yIGZvciB0aGUgZWxlbWVudCBwb2ludGVkIHRvIGJ5Ci0gICAgIGEgdXNlbWFwIElEUkVGIHRvIG9jY3VyIGluIGFueXRoaW5nIGJ1dCBhIDxtYXA+IGVsZW1lbnQuCi0tLT4KLQotPCFFTlRJVFkgJSBtYXAuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVtYXAuZWxlbWVudDtbCi08IUVOVElUWSAlIG1hcC5jb250ZW50Ci0gICAgICIoKCAlQmxvY2subWl4OyApIHwgJWFyZWEucW5hbWU7ICkrIgotPgotPCFFTlRJVFkgJSBtYXAucW5hbWUgICJtYXAiID4KLTwhRUxFTUVOVCAlbWFwLnFuYW1lOyAgJW1hcC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBtYXAuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBtYXAuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVtYXAuYXR0bGlzdDtbCi08IUFUVExJU1QgJW1hcC5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICBpZCAgICAgICAgICAgSUQgICAgICAgICAgICAgICAgICAgICAgICNSRVFVSVJFRAotICAgICAgJWNsYXNzLmF0dHJpYjsKLSAgICAgICV0aXRsZS5hdHRyaWI7Ci0gICAgICAlQ29yZS5leHRyYS5hdHRyaWI7Ci0gICAgICAlSTE4bi5hdHRyaWI7Ci0gICAgICAlRXZlbnRzLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIG1hcC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1jc2lzbWFwLTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gU2VydmVyLXNpZGUgSW1hZ2UgTWFwIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtc3Npc21hcC5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC1zc2lzbWFwLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLXNzaXNtYXAubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBTZXJ2ZXItc2lkZSBJbWFnZSBNYXBzIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXNzaXNtYXAtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgU2VydmVyLXNpZGUgSW1hZ2UgTWFwIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtc3Npc21hcC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBTZXJ2ZXItc2lkZSBJbWFnZSBNYXBzIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtc3Npc21hcC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0jMjAwMC0xMC0yMjogYWRkZWQgZGVjbGFyYXRpb24gZm9yICdpc21hcCcgb24gPGlucHV0PgotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBTZXJ2ZXItc2lkZSBJbWFnZSBNYXBzCi0KLSAgICAgVGhpcyBhZGRzIHRoZSAnaXNtYXAnIGF0dHJpYnV0ZSB0byB0aGUgaW1nIGFuZCBpbnB1dCBlbGVtZW50cwotICAgICB0byBzdXBwb3J0IHNlcnZlci1zaWRlIHByb2Nlc3Npbmcgb2YgYSB1c2VyIHNlbGVjdGlvbi4KLS0tPgotCi08IUFUVExJU1QgJWltZy5xbmFtZTsKLSAgICAgIGlzbWFwICAgICAgICAoIGlzbWFwICkgICAgICAgICAgICAgICAgI0lNUExJRUQKLT4KLQotPCFBVFRMSVNUICVpbnB1dC5xbmFtZTsKLSAgICAgIGlzbWFwICAgICAgICAoIGlzbWFwICkgICAgICAgICAgICAgICAgI0lNUExJRUQKLT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtc3Npc21hcC0xLm1vZCAtLT4KLV1dPgotCi08IS0tIFBhcmFtIEVsZW1lbnQgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLXBhcmFtLm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLXBhcmFtLm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLXBhcmFtLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgUGFyYW0gRWxlbWVudCAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1wYXJhbS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBQYXJhbSBFbGVtZW50IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtcGFyYW0tMS5tb2QKLQotICAgICBUaGlzIGlzIFhIVE1MLCBhIHJlZm9ybXVsYXRpb24gb2YgSFRNTCBhcyBhIG1vZHVsYXIgWE1MIGFwcGxpY2F0aW9uLgotICAgICBDb3B5cmlnaHQgMTk5OC0yMDAxIFczQyAoTUlULCBJTlJJQSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gICAgIFJldmlzaW9uOiAkSWQ6IHhodG1sMTEtZmxhdC5kdGQsdiAxLjEgMjAwNy8wNS8xNSAwMjo0MjoyMiBkYXZpZF93aWxsaWFtcyBFeHAgJCBTTUkKLQotICAgICBUaGlzIERURCBtb2R1bGUgaXMgaWRlbnRpZmllZCBieSB0aGUgUFVCTElDIGFuZCBTWVNURU0gaWRlbnRpZmllcnM6Ci0KLSAgICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgUGFyYW0gRWxlbWVudCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLXBhcmFtLTEubW9kIgotCi0gICAgIFJldmlzaW9uczoKLSAgICAgKG5vbmUpCi0gICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIFBhcmFtZXRlcnMgZm9yIEphdmEgQXBwbGV0cyBhbmQgRW1iZWRkZWQgT2JqZWN0cwotCi0gICAgICAgIHBhcmFtCi0KLSAgICAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgZGVjbGFyYXRpb25zIGZvciB0aGUgcGFyYW0gZWxlbWVudCwKLSAgICAgdXNlZCB0byBwcm92aWRlIG5hbWVkIHByb3BlcnR5IHZhbHVlcyBmb3IgdGhlIGFwcGxldAotICAgICBhbmQgb2JqZWN0IGVsZW1lbnRzLgotLS0+Ci0KLTwhLS0gcGFyYW06IE5hbWVkIFByb3BlcnR5IFZhbHVlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIHBhcmFtLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslcGFyYW0uZWxlbWVudDtbCi08IUVOVElUWSAlIHBhcmFtLmNvbnRlbnQgICJFTVBUWSIgPgotPCFFTlRJVFkgJSBwYXJhbS5xbmFtZSAgInBhcmFtIiA+Ci08IUVMRU1FTlQgJXBhcmFtLnFuYW1lOyAgJXBhcmFtLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHBhcmFtLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgcGFyYW0uYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVwYXJhbS5hdHRsaXN0O1sKLTwhQVRUTElTVCAlcGFyYW0ucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJWlkLmF0dHJpYjsKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI1JFUVVJUkVECi0gICAgICB2YWx1ZSAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB2YWx1ZXR5cGUgICAgKCBkYXRhIHwgcmVmIHwgb2JqZWN0ICkgICdkYXRhJwotICAgICAgdHlwZSAgICAgICAgICVDb250ZW50VHlwZS5kYXRhdHlwZTsgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgcGFyYW0uYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtcGFyYW0tMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBFbWJlZGRlZCBPYmplY3QgTW9kdWxlICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC1vYmplY3QubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtb2JqZWN0Lm1vZHVsZTtbCi08IUVOVElUWSAlIHhodG1sLW9iamVjdC5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEVtYmVkZGVkIE9iamVjdCAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1vYmplY3QtMS5tb2QiID4KLTwhLS0gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gWEhUTUwgRW1iZWRkZWQgT2JqZWN0IE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhLS0gZmlsZTogeGh0bWwtb2JqZWN0LTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEVtYmVkZGVkIE9iamVjdCAxLjAvL0VOIgotICAgICAgIFNZU1RFTSAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLW9iamVjdC0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBFbWJlZGRlZCBPYmplY3RzCi0KLSAgICAgICAgb2JqZWN0Ci0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIG9iamVjdCBlbGVtZW50IHR5cGUgYW5kIGl0cyBhdHRyaWJ1dGVzLCB1c2VkCi0gICAgIHRvIGVtYmVkIGV4dGVybmFsIG9iamVjdHMgYXMgcGFydCBvZiBYSFRNTCBwYWdlcy4gSW4gdGhlIGRvY3VtZW50LAotICAgICBwbGFjZSBwYXJhbSBlbGVtZW50cyBwcmlvciB0byBvdGhlciBjb250ZW50IHdpdGhpbiB0aGUgb2JqZWN0IGVsZW1lbnQuCi0KLSAgICAgTm90ZSB0aGF0IHVzZSBvZiB0aGlzIG1vZHVsZSByZXF1aXJlcyBpbnN0YW50aWF0aW9uIG9mIHRoZSBQYXJhbQotICAgICBFbGVtZW50IE1vZHVsZS4KLS0tPgotCi08IS0tIG9iamVjdDogR2VuZXJpYyBFbWJlZGRlZCBPYmplY3QgLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBvYmplY3QuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVvYmplY3QuZWxlbWVudDtbCi08IUVOVElUWSAlIG9iamVjdC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7IHwgJXBhcmFtLnFuYW1lOyApKiIKLT4KLTwhRU5USVRZICUgb2JqZWN0LnFuYW1lICAib2JqZWN0IiA+Ci08IUVMRU1FTlQgJW9iamVjdC5xbmFtZTsgICVvYmplY3QuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygb2JqZWN0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgb2JqZWN0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslb2JqZWN0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVvYmplY3QucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGRlY2xhcmUgICAgICAoIGRlY2xhcmUgKSAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNsYXNzaWQgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNvZGViYXNlICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGRhdGEgICAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHR5cGUgICAgICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI0lNUExJRUQKLSAgICAgIGNvZGV0eXBlICAgICAlQ29udGVudFR5cGUuZGF0YXR5cGU7ICAgI0lNUExJRUQKLSAgICAgIGFyY2hpdmUgICAgICAlVVJJcy5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHN0YW5kYnkgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGhlaWdodCAgICAgICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIHdpZHRoICAgICAgICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHRhYmluZGV4ICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIG9iamVjdC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC1vYmplY3QtMS5tb2QgLS0+Ci1dXT4KLQotPCEtLSBUYWJsZXMgTW9kdWxlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCFFTlRJVFkgJSB4aHRtbC10YWJsZS5tb2R1bGUgIklOQ0xVREUiID4KLTwhWyV4aHRtbC10YWJsZS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC10YWJsZS5tb2QKLSAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIFRhYmxlcyAxLjAvL0VOIgotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC10YWJsZS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBUYWJsZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC10YWJsZS0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBUYWJsZXMgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC10YWJsZS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBUYWJsZXMKLQotICAgICAgICB0YWJsZSwgY2FwdGlvbiwgdGhlYWQsIHRmb290LCB0Ym9keSwgY29sZ3JvdXAsIGNvbCwgdHIsIHRoLCB0ZAotCi0gICAgIFRoaXMgbW9kdWxlIGRlY2xhcmVzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZXMgdXNlZCB0byBwcm92aWRlCi0gICAgIHRhYmxlIG1hcmt1cCBzaW1pbGFyIHRvIEhUTUwgNC4wLCBpbmNsdWRpbmcgZmVhdHVyZXMgdGhhdCBlbmFibGUKLSAgICAgYmV0dGVyIGFjY2Vzc2liaWxpdHkgZm9yIG5vbi12aXN1YWwgdXNlciBhZ2VudHMuCi0tLT4KLQotPCEtLSBkZWNsYXJlIHF1YWxpZmllZCBlbGVtZW50IHR5cGUgbmFtZXM6Ci0tLT4KLTwhRU5USVRZICUgdGFibGUucW5hbWUgICJ0YWJsZSIgPgotPCFFTlRJVFkgJSBjYXB0aW9uLnFuYW1lICAiY2FwdGlvbiIgPgotPCFFTlRJVFkgJSB0aGVhZC5xbmFtZSAgInRoZWFkIiA+Ci08IUVOVElUWSAlIHRmb290LnFuYW1lICAidGZvb3QiID4KLTwhRU5USVRZICUgdGJvZHkucW5hbWUgICJ0Ym9keSIgPgotPCFFTlRJVFkgJSBjb2xncm91cC5xbmFtZSAgImNvbGdyb3VwIiA+Ci08IUVOVElUWSAlIGNvbC5xbmFtZSAgImNvbCIgPgotPCFFTlRJVFkgJSB0ci5xbmFtZSAgInRyIiA+Ci08IUVOVElUWSAlIHRoLnFuYW1lICAidGgiID4KLTwhRU5USVRZICUgdGQucW5hbWUgICJ0ZCIgPgotCi08IS0tIFRoZSBmcmFtZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHdoaWNoIHBhcnRzIG9mIHRoZSBmcmFtZSBhcm91bmQKLSAgICAgdGhlIHRhYmxlIHNob3VsZCBiZSByZW5kZXJlZC4gVGhlIHZhbHVlcyBhcmUgbm90IHRoZSBzYW1lIGFzCi0gICAgIENBTFMgdG8gYXZvaWQgYSBuYW1lIGNsYXNoIHdpdGggdGhlIHZhbGlnbiBhdHRyaWJ1dGUuCi0tLT4KLTwhRU5USVRZICUgZnJhbWUuYXR0cmliCi0gICAgICJmcmFtZSAgICAgICAgKCB2b2lkCi0gICAgICAgICAgICAgICAgICAgfCBhYm92ZQotICAgICAgICAgICAgICAgICAgIHwgYmVsb3cKLSAgICAgICAgICAgICAgICAgICB8IGhzaWRlcwotICAgICAgICAgICAgICAgICAgIHwgbGhzCi0gICAgICAgICAgICAgICAgICAgfCByaHMKLSAgICAgICAgICAgICAgICAgICB8IHZzaWRlcwotICAgICAgICAgICAgICAgICAgIHwgYm94Ci0gICAgICAgICAgICAgICAgICAgfCBib3JkZXIgKSAgICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IS0tIFRoZSBydWxlcyBhdHRyaWJ1dGUgZGVmaW5lcyB3aGljaCBydWxlcyB0byBkcmF3IGJldHdlZW4gY2VsbHM6Ci0KLSAgICAgSWYgcnVsZXMgaXMgYWJzZW50IHRoZW4gYXNzdW1lOgotCi0gICAgICAgIm5vbmUiIGlmIGJvcmRlciBpcyBhYnNlbnQgb3IgYm9yZGVyPSIwIiBvdGhlcndpc2UgImFsbCIKLS0tPgotPCFFTlRJVFkgJSBydWxlcy5hdHRyaWIKLSAgICAgInJ1bGVzICAgICAgICAoIG5vbmUKLSAgICAgICAgICAgICAgICAgICB8IGdyb3VwcwotICAgICAgICAgICAgICAgICAgIHwgcm93cwotICAgICAgICAgICAgICAgICAgIHwgY29scwotICAgICAgICAgICAgICAgICAgIHwgYWxsICkgICAgICAgICAgICAgICAgICAjSU1QTElFRCIKLT4KLQotPCEtLSBob3Jpem9udGFsIGFsaWdubWVudCBhdHRyaWJ1dGVzIGZvciBjZWxsIGNvbnRlbnRzCi0tLT4KLTwhRU5USVRZICUgQ2VsbEhBbGlnbi5hdHRyaWIKLSAgICAgImFsaWduICAgICAgICAoIGxlZnQKLSAgICAgICAgICAgICAgICAgICB8IGNlbnRlcgotICAgICAgICAgICAgICAgICAgIHwgcmlnaHQKLSAgICAgICAgICAgICAgICAgICB8IGp1c3RpZnkKLSAgICAgICAgICAgICAgICAgICB8IGNoYXIgKSAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGNoYXIgICAgICAgICAlQ2hhcmFjdGVyLmRhdGF0eXBlOyAgICAgI0lNUExJRUQKLSAgICAgIGNoYXJvZmYgICAgICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQiCi0+Ci0KLTwhLS0gdmVydGljYWwgYWxpZ25tZW50IGF0dHJpYnV0ZSBmb3IgY2VsbCBjb250ZW50cwotLS0+Ci08IUVOVElUWSAlIENlbGxWQWxpZ24uYXR0cmliCi0gICAgICJ2YWxpZ24gICAgICAgKCB0b3AKLSAgICAgICAgICAgICAgICAgICB8IG1pZGRsZQotICAgICAgICAgICAgICAgICAgIHwgYm90dG9tCi0gICAgICAgICAgICAgICAgICAgfCBiYXNlbGluZSApICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IS0tIHNjb3BlIGlzIHNpbXBsZXIgdGhhbiBheGVzIGF0dHJpYnV0ZSBmb3IgY29tbW9uIHRhYmxlcwotLS0+Ci08IUVOVElUWSAlIHNjb3BlLmF0dHJpYgotICAgICAic2NvcGUgICAgICAgICggcm93Ci0gICAgICAgICAgICAgICAgICAgfCBjb2wKLSAgICAgICAgICAgICAgICAgICB8IHJvd2dyb3VwCi0gICAgICAgICAgICAgICAgICAgfCBjb2xncm91cCApICAgICAgICAgICAgICNJTVBMSUVEIgotPgotCi08IS0tIHRhYmxlOiBUYWJsZSBFbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSB0YWJsZS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRhYmxlLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0YWJsZS5jb250ZW50Ci0gICAgICIoICVjYXB0aW9uLnFuYW1lOz8sICggJWNvbC5xbmFtZTsqIHwgJWNvbGdyb3VwLnFuYW1lOyogKSwKLSAgICAgICgoICV0aGVhZC5xbmFtZTs/LCAldGZvb3QucW5hbWU7PywgJXRib2R5LnFuYW1lOysgKSB8ICggJXRyLnFuYW1lOysgKSkpIgotPgotPCFFTEVNRU5UICV0YWJsZS5xbmFtZTsgICV0YWJsZS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0YWJsZS5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRhYmxlLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGFibGUuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRhYmxlLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBzdW1tYXJ5ICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0gICAgICB3aWR0aCAgICAgICAgJUxlbmd0aC5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBib3JkZXIgICAgICAgJVBpeGVscy5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICAlZnJhbWUuYXR0cmliOwotICAgICAgJXJ1bGVzLmF0dHJpYjsKLSAgICAgIGNlbGxzcGFjaW5nICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIGNlbGxwYWRkaW5nICAlTGVuZ3RoLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIHRhYmxlLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gY2FwdGlvbjogVGFibGUgQ2FwdGlvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGNhcHRpb24uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVjYXB0aW9uLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBjYXB0aW9uLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAlY2FwdGlvbi5xbmFtZTsgICVjYXB0aW9uLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGNhcHRpb24uZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjYXB0aW9uLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslY2FwdGlvbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlY2FwdGlvbi5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgY2FwdGlvbi5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHRoZWFkOiBUYWJsZSBIZWFkZXIgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBVc2UgdGhlYWQgdG8gZHVwbGljYXRlIGhlYWRlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGhlYWRlcnMgd2hlbgotICAgICB0Ym9keSBzZWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gc2Nyb2xsaW5nIHBhbmVsLgotLS0+Ci0KLTwhRU5USVRZICUgdGhlYWQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0aGVhZC5lbGVtZW50O1sKLTwhRU5USVRZICUgdGhlYWQuY29udGVudCAgIiggJXRyLnFuYW1lOyApKyIgPgotPCFFTEVNRU5UICV0aGVhZC5xbmFtZTsgICV0aGVhZC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0aGVhZC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRoZWFkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGhlYWQuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRoZWFkLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICAlQ2VsbEhBbGlnbi5hdHRyaWI7Ci0gICAgICAlQ2VsbFZBbGlnbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0aGVhZC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHRmb290OiBUYWJsZSBGb290ZXIgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBVc2UgdGZvb3QgdG8gZHVwbGljYXRlIGZvb3RlcnMgd2hlbiBicmVha2luZyB0YWJsZQotICAgICBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLCBvciBmb3Igc3RhdGljIGZvb3RlcnMgd2hlbgotICAgICB0Ym9keSBzZWN0aW9ucyBhcmUgcmVuZGVyZWQgaW4gc2Nyb2xsaW5nIHBhbmVsLgotLS0+Ci0KLTwhRU5USVRZICUgdGZvb3QuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0Zm9vdC5lbGVtZW50O1sKLTwhRU5USVRZICUgdGZvb3QuY29udGVudCAgIiggJXRyLnFuYW1lOyApKyIgPgotPCFFTEVNRU5UICV0Zm9vdC5xbmFtZTsgICV0Zm9vdC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0Zm9vdC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRmb290LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGZvb3QuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRmb290LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICAlQ2VsbEhBbGlnbi5hdHRyaWI7Ci0gICAgICAlQ2VsbFZBbGlnbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0Zm9vdC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHRib2R5OiBUYWJsZSBCb2R5IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBVc2UgbXVsdGlwbGUgdGJvZHkgc2VjdGlvbnMgd2hlbiBydWxlcyBhcmUgbmVlZGVkCi0gICAgIGJldHdlZW4gZ3JvdXBzIG9mIHRhYmxlIHJvd3MuCi0tLT4KLQotPCFFTlRJVFkgJSB0Ym9keS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRib2R5LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0Ym9keS5jb250ZW50ICAiKCAldHIucW5hbWU7ICkrIiA+Ci08IUVMRU1FTlQgJXRib2R5LnFuYW1lOyAgJXRib2R5LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRib2R5LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGJvZHkuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0Ym9keS5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGJvZHkucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgICVDZWxsSEFsaWduLmF0dHJpYjsKLSAgICAgICVDZWxsVkFsaWduLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIHRib2R5LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gY29sZ3JvdXA6IFRhYmxlIENvbHVtbiBHcm91cCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIGNvbGdyb3VwIGdyb3VwcyBhIHNldCBvZiBjb2wgZWxlbWVudHMuIEl0IGFsbG93cyB5b3UKLSAgICAgdG8gZ3JvdXAgc2V2ZXJhbCBzZW1hbnRpY2FsbHktcmVsYXRlZCBjb2x1bW5zIHRvZ2V0aGVyLgotLS0+Ci0KLTwhRU5USVRZICUgY29sZ3JvdXAuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVjb2xncm91cC5lbGVtZW50O1sKLTwhRU5USVRZICUgY29sZ3JvdXAuY29udGVudCAgIiggJWNvbC5xbmFtZTsgKSoiID4KLTwhRUxFTUVOVCAlY29sZ3JvdXAucW5hbWU7ICAlY29sZ3JvdXAuY29udGVudDsgPgotPCEtLSBlbmQgb2YgY29sZ3JvdXAuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBjb2xncm91cC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWNvbGdyb3VwLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVjb2xncm91cC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgc3BhbiAgICAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAnMScKLSAgICAgIHdpZHRoICAgICAgICAlTXVsdGlMZW5ndGguZGF0YXR5cGU7ICAgI0lNUExJRUQKLSAgICAgICVDZWxsSEFsaWduLmF0dHJpYjsKLSAgICAgICVDZWxsVkFsaWduLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGNvbGdyb3VwLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gY29sOiBUYWJsZSBDb2x1bW4gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIGNvbCBlbGVtZW50cyBkZWZpbmUgdGhlIGFsaWdubWVudCBwcm9wZXJ0aWVzIGZvcgotICAgICBjZWxscyBpbiBvbmUgb3IgbW9yZSBjb2x1bW5zLgotCi0gICAgIFRoZSB3aWR0aCBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSB3aWR0aCBvZiB0aGUKLSAgICAgY29sdW1ucywgZS5nLgotCi0gICAgICAgd2lkdGg9IjY0IiAgICAgICAgd2lkdGggaW4gc2NyZWVuIHBpeGVscwotICAgICAgIHdpZHRoPSIwLjUqIiAgICAgIHJlbGF0aXZlIHdpZHRoIG9mIDAuNQotCi0gICAgIFRoZSBzcGFuIGF0dHJpYnV0ZSBjYXVzZXMgdGhlIGF0dHJpYnV0ZXMgb2Ygb25lCi0gICAgIGNvbCBlbGVtZW50IHRvIGFwcGx5IHRvIG1vcmUgdGhhbiBvbmUgY29sdW1uLgotLS0+Ci0KLTwhRU5USVRZICUgY29sLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslY29sLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBjb2wuY29udGVudCAgIkVNUFRZIiA+Ci08IUVMRU1FTlQgJWNvbC5xbmFtZTsgICVjb2wuY29udGVudDsgPgotPCEtLSBlbmQgb2YgY29sLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgY29sLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslY29sLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVjb2wucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIHNwYW4gICAgICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgJzEnCi0gICAgICB3aWR0aCAgICAgICAgJU11bHRpTGVuZ3RoLmRhdGF0eXBlOyAgICNJTVBMSUVECi0gICAgICAlQ2VsbEhBbGlnbi5hdHRyaWI7Ci0gICAgICAlQ2VsbFZBbGlnbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBjb2wuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB0cjogVGFibGUgUm93IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgdHIuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyV0ci5lbGVtZW50O1sKLTwhRU5USVRZICUgdHIuY29udGVudCAgIiggJXRoLnFuYW1lOyB8ICV0ZC5xbmFtZTsgKSsiID4KLTwhRUxFTUVOVCAldHIucW5hbWU7ICAldHIuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdHIuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0ci5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRyLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0ci5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgJUNlbGxIQWxpZ24uYXR0cmliOwotICAgICAgJUNlbGxWQWxpZ24uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdHIuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSB0aDogVGFibGUgSGVhZGVyIENlbGwgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gdGggaXMgZm9yIGhlYWRlciBjZWxscywgdGQgZm9yIGRhdGEsCi0gICAgIGJ1dCBmb3IgY2VsbHMgYWN0aW5nIGFzIGJvdGggdXNlIHRkCi0tLT4KLQotPCFFTlRJVFkgJSB0aC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRoLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0aC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7ICkqIgotPgotPCFFTEVNRU5UICV0aC5xbmFtZTsgICV0aC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0aC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRoLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGguYXR0bGlzdDtbCi08IUFUVExJU1QgJXRoLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBhYmJyICAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0gICAgICBheGlzICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBoZWFkZXJzICAgICAgSURSRUZTICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICAlc2NvcGUuYXR0cmliOwotICAgICAgcm93c3BhbiAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAnMScKLSAgICAgIGNvbHNwYW4gICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgJzEnCi0gICAgICAlQ2VsbEhBbGlnbi5hdHRyaWI7Ci0gICAgICAlQ2VsbFZBbGlnbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0aC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHRkOiBUYWJsZSBEYXRhIENlbGwgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSB0ZC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRkLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0ZC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlRmxvdy5taXg7ICkqIgotPgotPCFFTEVNRU5UICV0ZC5xbmFtZTsgICV0ZC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiB0ZC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIHRkLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVsldGQuYXR0bGlzdDtbCi08IUFUVExJU1QgJXRkLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBhYmJyICAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNJTVBMSUVECi0gICAgICBheGlzICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBoZWFkZXJzICAgICAgSURSRUZTICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICAlc2NvcGUuYXR0cmliOwotICAgICAgcm93c3BhbiAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAnMScKLSAgICAgIGNvbHNwYW4gICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgJzEnCi0gICAgICAlQ2VsbEhBbGlnbi5hdHRyaWI7Ci0gICAgICAlQ2VsbFZBbGlnbi5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiB0ZC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGVuZCBvZiB4aHRtbC10YWJsZS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIEZvcm1zIE1vZHVsZSAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWZvcm0ubW9kdWxlICJJTkNMVURFIiA+Ci08IVsleGh0bWwtZm9ybS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1mb3JtLm1vZAotICAgICBQVUJMSUMgIi0vL1czQy8vRUxFTUVOVFMgWEhUTUwgRm9ybXMgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtZm9ybS0xLm1vZCIgPgotPCEtLSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBYSFRNTCBGb3JtcyBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotPCEtLSBmaWxlOiB4aHRtbC1mb3JtLTEubW9kCi0KLSAgICAgVGhpcyBpcyBYSFRNTCwgYSByZWZvcm11bGF0aW9uIG9mIEhUTUwgYXMgYSBtb2R1bGFyIFhNTCBhcHBsaWNhdGlvbi4KLSAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSBXM0MgKE1JVCwgSU5SSUEsIEtlaW8pLCBBbGwgUmlnaHRzIFJlc2VydmVkLgotICAgICBSZXZpc2lvbjogJElkOiB4aHRtbDExLWZsYXQuZHRkLHYgMS4xIDIwMDcvMDUvMTUgMDI6NDI6MjIgZGF2aWRfd2lsbGlhbXMgRXhwICQgU01JCi0KLSAgICAgVGhpcyBEVEQgbW9kdWxlIGlzIGlkZW50aWZpZWQgYnkgdGhlIFBVQkxJQyBhbmQgU1lTVEVNIGlkZW50aWZpZXJzOgotCi0gICAgICAgUFVCTElDICItLy9XM0MvL0VMRU1FTlRTIFhIVE1MIEZvcm1zIDEuMC8vRU4iCi0gICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtZm9ybS0xLm1vZCIKLQotICAgICBSZXZpc2lvbnM6Ci0gICAgIChub25lKQotICAgICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBGb3JtcwotCi0gICAgICAgIGZvcm0sIGxhYmVsLCBpbnB1dCwgc2VsZWN0LCBvcHRncm91cCwgb3B0aW9uLAotICAgICAgICB0ZXh0YXJlYSwgZmllbGRzZXQsIGxlZ2VuZCwgYnV0dG9uCi0KLSAgICAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgbWFya3VwIHRvIHByb3ZpZGUgc3VwcG9ydCBmb3Igb25saW5lCi0gICAgIGZvcm1zLCBiYXNlZCBvbiB0aGUgZmVhdHVyZXMgZm91bmQgaW4gSFRNTCA0LjAgZm9ybXMuCi0tLT4KLQotPCEtLSBkZWNsYXJlIHF1YWxpZmllZCBlbGVtZW50IHR5cGUgbmFtZXM6Ci0tLT4KLTwhRU5USVRZICUgZm9ybS5xbmFtZSAgImZvcm0iID4KLTwhRU5USVRZICUgbGFiZWwucW5hbWUgICJsYWJlbCIgPgotPCFFTlRJVFkgJSBpbnB1dC5xbmFtZSAgImlucHV0IiA+Ci08IUVOVElUWSAlIHNlbGVjdC5xbmFtZSAgInNlbGVjdCIgPgotPCFFTlRJVFkgJSBvcHRncm91cC5xbmFtZSAgIm9wdGdyb3VwIiA+Ci08IUVOVElUWSAlIG9wdGlvbi5xbmFtZSAgIm9wdGlvbiIgPgotPCFFTlRJVFkgJSB0ZXh0YXJlYS5xbmFtZSAgInRleHRhcmVhIiA+Ci08IUVOVElUWSAlIGZpZWxkc2V0LnFuYW1lICAiZmllbGRzZXQiID4KLTwhRU5USVRZICUgbGVnZW5kLnFuYW1lICAibGVnZW5kIiA+Ci08IUVOVElUWSAlIGJ1dHRvbi5xbmFtZSAgImJ1dHRvbiIgPgotCi08IS0tICVCbGtOb0Zvcm0ubWl4OyBpbmNsdWRlcyBhbGwgbm9uLWZvcm0gYmxvY2sgZWxlbWVudHMsCi0gICAgIHBsdXMgJU1pc2MuY2xhc3M7Ci0tLT4KLTwhRU5USVRZICUgQmxrTm9Gb3JtLm1peAotICAgICAiJUhlYWRpbmcuY2xhc3M7Ci0gICAgICB8ICVMaXN0LmNsYXNzOwotICAgICAgfCAlQmxrU3RydWN0LmNsYXNzOwotICAgICAgJUJsa1BocmFzLmNsYXNzOwotICAgICAgJUJsa1ByZXMuY2xhc3M7Ci0gICAgICAlVGFibGUuY2xhc3M7Ci0gICAgICAlQmxvY2suZXh0cmE7Ci0gICAgICAlTWlzYy5jbGFzczsiCi0+Ci0KLTwhLS0gZm9ybTogRm9ybSBFbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGZvcm0uZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVmb3JtLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBmb3JtLmNvbnRlbnQKLSAgICAgIiggJUJsa05vRm9ybS5taXg7Ci0gICAgICB8ICVmaWVsZHNldC5xbmFtZTsgKSsiCi0+Ci08IUVMRU1FTlQgJWZvcm0ucW5hbWU7ICAlZm9ybS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBmb3JtLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZm9ybS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWZvcm0uYXR0bGlzdDtbCi08IUFUVExJU1QgJWZvcm0ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIGFjdGlvbiAgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgI1JFUVVJUkVECi0gICAgICBtZXRob2QgICAgICAgKCBnZXQgfCBwb3N0ICkgICAgICAgICAgICdnZXQnCi0gICAgICBlbmN0eXBlICAgICAgJUNvbnRlbnRUeXBlLmRhdGF0eXBlOyAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnCi0gICAgICBhY2NlcHQtY2hhcnNldCAlQ2hhcnNldHMuZGF0YXR5cGU7ICAgICNJTVBMSUVECi0gICAgICBhY2NlcHQgICAgICAgJUNvbnRlbnRUeXBlcy5kYXRhdHlwZTsgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBmb3JtLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gbGFiZWw6IEZvcm0gRmllbGQgTGFiZWwgVGV4dCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IS0tIEVhY2ggbGFiZWwgbXVzdCBub3QgY29udGFpbiBtb3JlIHRoYW4gT05FIGZpZWxkCi0tLT4KLQotPCFFTlRJVFkgJSBsYWJlbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWxhYmVsLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBsYWJlbC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEKLSAgICAgIHwgJWlucHV0LnFuYW1lOyB8ICVzZWxlY3QucW5hbWU7IHwgJXRleHRhcmVhLnFuYW1lOyB8ICVidXR0b24ucW5hbWU7Ci0gICAgICB8ICVJbmxTdHJ1Y3QuY2xhc3M7Ci0gICAgICAlSW5sUGhyYXMuY2xhc3M7Ci0gICAgICAlSTE4bi5jbGFzczsKLSAgICAgICVJbmxQcmVzLmNsYXNzOwotICAgICAgJUFuY2hvci5jbGFzczsKLSAgICAgICVJbmxTcGVjaWFsLmNsYXNzOwotICAgICAgJUlubGluZS5leHRyYTsKLSAgICAgICVNaXNjLmNsYXNzOyApKiIKLT4KLTwhRUxFTUVOVCAlbGFiZWwucW5hbWU7ICAlbGFiZWwuY29udGVudDsgPgotPCEtLSBlbmQgb2YgbGFiZWwuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBsYWJlbC5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWxhYmVsLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVsYWJlbC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgZm9yICAgICAgICAgIElEUkVGICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgYWNjZXNza2V5ICAgICVDaGFyYWN0ZXIuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgbGFiZWwuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBpbnB1dDogRm9ybSBDb250cm9sIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgaW5wdXQuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVpbnB1dC5lbGVtZW50O1sKLTwhRU5USVRZICUgaW5wdXQuY29udGVudCAgIkVNUFRZIiA+Ci08IUVMRU1FTlQgJWlucHV0LnFuYW1lOyAgJWlucHV0LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGlucHV0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgaW5wdXQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVpbnB1dC5hdHRsaXN0O1sKLTwhRU5USVRZICUgSW5wdXRUeXBlLmNsYXNzCi0gICAgICIoIHRleHQgfCBwYXNzd29yZCB8IGNoZWNrYm94IHwgcmFkaW8gfCBzdWJtaXQKLSAgICAgIHwgcmVzZXQgfCBmaWxlIHwgaGlkZGVuIHwgaW1hZ2UgfCBidXR0b24gKSIKLT4KLTwhLS0gYXR0cmlidXRlICduYW1lJyByZXF1aXJlZCBmb3IgYWxsIGJ1dCBzdWJtaXQgJiByZXNldAotLS0+Ci08IUFUVExJU1QgJWlucHV0LnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICB0eXBlICAgICAgICAgJUlucHV0VHlwZS5jbGFzczsgICAgICAgICd0ZXh0JwotICAgICAgbmFtZSAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgdmFsdWUgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgY2hlY2tlZCAgICAgICggY2hlY2tlZCApICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgZGlzYWJsZWQgICAgICggZGlzYWJsZWQgKSAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgcmVhZG9ubHkgICAgICggcmVhZG9ubHkgKSAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgc2l6ZSAgICAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgbWF4bGVuZ3RoICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgc3JjICAgICAgICAgICVVUkkuZGF0YXR5cGU7ICAgICAgICAgICAjSU1QTElFRAotICAgICAgYWx0ICAgICAgICAgICVUZXh0LmRhdGF0eXBlOyAgICAgICAgICAjSU1QTElFRAotICAgICAgdGFiaW5kZXggICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjSU1QTElFRAotICAgICAgYWNjZXNza2V5ICAgICVDaGFyYWN0ZXIuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotICAgICAgYWNjZXB0ICAgICAgICVDb250ZW50VHlwZXMuZGF0YXR5cGU7ICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgaW5wdXQuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBzZWxlY3Q6IE9wdGlvbiBTZWxlY3RvciAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgc2VsZWN0LmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslc2VsZWN0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBzZWxlY3QuY29udGVudAotICAgICAiKCAlb3B0Z3JvdXAucW5hbWU7IHwgJW9wdGlvbi5xbmFtZTsgKSsiCi0+Ci08IUVMRU1FTlQgJXNlbGVjdC5xbmFtZTsgICVzZWxlY3QuY29udGVudDsgPgotPCEtLSBlbmQgb2Ygc2VsZWN0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgc2VsZWN0LmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslc2VsZWN0LmF0dGxpc3Q7WwotPCFBVFRMSVNUICVzZWxlY3QucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIG5hbWUgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHNpemUgICAgICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLSAgICAgIG11bHRpcGxlICAgICAoIG11bHRpcGxlICkgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGRpc2FibGVkICAgICAoIGRpc2FibGVkICkgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHRhYmluZGV4ICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIHNlbGVjdC5hdHRsaXN0IC0tPl1dPgotCi08IS0tIG9wdGdyb3VwOiBPcHRpb24gR3JvdXAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSBvcHRncm91cC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJW9wdGdyb3VwLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBvcHRncm91cC5jb250ZW50ICAiKCAlb3B0aW9uLnFuYW1lOyApKyIgPgotPCFFTEVNRU5UICVvcHRncm91cC5xbmFtZTsgICVvcHRncm91cC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBvcHRncm91cC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIG9wdGdyb3VwLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslb3B0Z3JvdXAuYXR0bGlzdDtbCi08IUFUVExJU1QgJW9wdGdyb3VwLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBkaXNhYmxlZCAgICAgKCBkaXNhYmxlZCApICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICBsYWJlbCAgICAgICAgJVRleHQuZGF0YXR5cGU7ICAgICAgICAgICNSRVFVSVJFRAotPgotPCEtLSBlbmQgb2Ygb3B0Z3JvdXAuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBvcHRpb246IFNlbGVjdGFibGUgQ2hvaWNlIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgb3B0aW9uLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVslb3B0aW9uLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBvcHRpb24uY29udGVudCAgIiggI1BDREFUQSApIiA+Ci08IUVMRU1FTlQgJW9wdGlvbi5xbmFtZTsgICVvcHRpb24uY29udGVudDsgPgotPCEtLSBlbmQgb2Ygb3B0aW9uLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgb3B0aW9uLmF0dGxpc3QgICJJTkNMVURFIiA+Ci08IVslb3B0aW9uLmF0dGxpc3Q7WwotPCFBVFRMSVNUICVvcHRpb24ucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLSAgICAgIHNlbGVjdGVkICAgICAoIHNlbGVjdGVkICkgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGRpc2FibGVkICAgICAoIGRpc2FibGVkICkgICAgICAgICAgICAgI0lNUExJRUQKLSAgICAgIGxhYmVsICAgICAgICAlVGV4dC5kYXRhdHlwZTsgICAgICAgICAgI0lNUExJRUQKLSAgICAgIHZhbHVlICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKLT4KLTwhLS0gZW5kIG9mIG9wdGlvbi5hdHRsaXN0IC0tPl1dPgotCi08IS0tIHRleHRhcmVhOiBNdWx0aS1MaW5lIFRleHQgRmllbGQgLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCFFTlRJVFkgJSB0ZXh0YXJlYS5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJXRleHRhcmVhLmVsZW1lbnQ7WwotPCFFTlRJVFkgJSB0ZXh0YXJlYS5jb250ZW50ICAiKCAjUENEQVRBICkiID4KLTwhRUxFTUVOVCAldGV4dGFyZWEucW5hbWU7ICAldGV4dGFyZWEuY29udGVudDsgPgotPCEtLSBlbmQgb2YgdGV4dGFyZWEuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSB0ZXh0YXJlYS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJXRleHRhcmVhLmF0dGxpc3Q7WwotPCFBVFRMSVNUICV0ZXh0YXJlYS5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgbmFtZSAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAotICAgICAgcm93cyAgICAgICAgICVOdW1iZXIuZGF0YXR5cGU7ICAgICAgICAjUkVRVUlSRUQKLSAgICAgIGNvbHMgICAgICAgICAlTnVtYmVyLmRhdGF0eXBlOyAgICAgICAgI1JFUVVJUkVECi0gICAgICBkaXNhYmxlZCAgICAgKCBkaXNhYmxlZCApICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICByZWFkb25seSAgICAgKCByZWFkb25seSApICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB0YWJpbmRleCAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBhY2Nlc3NrZXkgICAgJUNoYXJhY3Rlci5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiB0ZXh0YXJlYS5hdHRsaXN0IC0tPl1dPgotCi08IS0tIGZpZWxkc2V0OiBGb3JtIENvbnRyb2wgR3JvdXAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSAjUENEQVRBIGlzIHRvIHNvbHZlIHRoZSBtaXhlZCBjb250ZW50IHByb2JsZW0sCi0gICAgIHBlciBzcGVjaWZpY2F0aW9uIG9ubHkgd2hpdGVzcGFjZSBpcyBhbGxvd2VkCi0tLT4KLQotPCFFTlRJVFkgJSBmaWVsZHNldC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWZpZWxkc2V0LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBmaWVsZHNldC5jb250ZW50Ci0gICAgICIoICNQQ0RBVEEgfCAlbGVnZW5kLnFuYW1lOyB8ICVGbG93Lm1peDsgKSoiCi0+Ci08IUVMRU1FTlQgJWZpZWxkc2V0LnFuYW1lOyAgJWZpZWxkc2V0LmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGZpZWxkc2V0LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgZmllbGRzZXQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVmaWVsZHNldC5hdHRsaXN0O1sKLTwhQVRUTElTVCAlZmllbGRzZXQucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGZpZWxkc2V0LmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gbGVnZW5kOiBGaWVsZHNldCBMZWdlbmQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGxlZ2VuZC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWxlZ2VuZC5lbGVtZW50O1sKLTwhRU5USVRZICUgbGVnZW5kLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQSB8ICVJbmxpbmUubWl4OyApKiIKLT4KLTwhRUxFTUVOVCAlbGVnZW5kLnFuYW1lOyAgJWxlZ2VuZC5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBsZWdlbmQuZWxlbWVudCAtLT5dXT4KLQotPCFFTlRJVFkgJSBsZWdlbmQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVsZWdlbmQuYXR0bGlzdDtbCi08IUFUVExJU1QgJWxlZ2VuZC5xbmFtZTsKLSAgICAgICVDb21tb24uYXR0cmliOwotICAgICAgYWNjZXNza2V5ICAgICVDaGFyYWN0ZXIuZGF0YXR5cGU7ICAgICAjSU1QTElFRAotPgotPCEtLSBlbmQgb2YgbGVnZW5kLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gYnV0dG9uOiBQdXNoIEJ1dHRvbiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGJ1dHRvbi5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWJ1dHRvbi5lbGVtZW50O1sKLTwhRU5USVRZICUgYnV0dG9uLmNvbnRlbnQKLSAgICAgIiggI1BDREFUQQotICAgICAgfCAlQmxrTm9Gb3JtLm1peDsKLSAgICAgIHwgJUlubFN0cnVjdC5jbGFzczsKLSAgICAgICVJbmxQaHJhcy5jbGFzczsKLSAgICAgICVJbmxQcmVzLmNsYXNzOwotICAgICAgJUkxOG4uY2xhc3M7Ci0gICAgICAlSW5sU3BlY2lhbC5jbGFzczsKLSAgICAgICVJbmxpbmUuZXh0cmE7ICkqIgotPgotPCFFTEVNRU5UICVidXR0b24ucW5hbWU7ICAlYnV0dG9uLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIGJ1dHRvbi5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGJ1dHRvbi5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJ1dHRvbi5hdHRsaXN0O1sKLTwhQVRUTElTVCAlYnV0dG9uLnFuYW1lOwotICAgICAgJUNvbW1vbi5hdHRyaWI7Ci0gICAgICBuYW1lICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB2YWx1ZSAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB0eXBlICAgICAgICAgKCBidXR0b24gfCBzdWJtaXQgfCByZXNldCApICdzdWJtaXQnCi0gICAgICBkaXNhYmxlZCAgICAgKCBkaXNhYmxlZCApICAgICAgICAgICAgICNJTVBMSUVECi0gICAgICB0YWJpbmRleCAgICAgJU51bWJlci5kYXRhdHlwZTsgICAgICAgICNJTVBMSUVECi0gICAgICBhY2Nlc3NrZXkgICAgJUNoYXJhY3Rlci5kYXRhdHlwZTsgICAgICNJTVBMSUVECi0+Ci08IS0tIGVuZCBvZiBidXR0b24uYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtZm9ybS0xLm1vZCAtLT4KLV1dPgotCi08IS0tIExlZ2FjeSBNYXJrdXAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IUVOVElUWSAlIHhodG1sLWxlZ2FjeS5tb2R1bGUgIklHTk9SRSIgPgotPCFbJXhodG1sLWxlZ2FjeS5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1sZWdhY3kubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBMZWdhY3kgTWFya3VwIDEuMC8vRU4iCi0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtbW9kdWxhcml6YXRpb24vRFREL3hodG1sLWxlZ2FjeS0xLm1vZCIgPgotJXhodG1sLWxlZ2FjeS5tb2Q7XV0+Ci0KLTwhLS0gRG9jdW1lbnQgU3RydWN0dXJlIE1vZHVsZSAocmVxdWlyZWQpICAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLTwhRU5USVRZICUgeGh0bWwtc3RydWN0Lm1vZHVsZSAiSU5DTFVERSIgPgotPCFbJXhodG1sLXN0cnVjdC5tb2R1bGU7WwotPCFFTlRJVFkgJSB4aHRtbC1zdHJ1Y3QubW9kCi0gICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBEb2N1bWVudCBTdHJ1Y3R1cmUgMS4wLy9FTiIKLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1tb2R1bGFyaXphdGlvbi9EVEQveGh0bWwtc3RydWN0LTEubW9kIiA+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIFhIVE1MIFN0cnVjdHVyZSBNb2R1bGUgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIGZpbGU6IHhodG1sLXN0cnVjdC0xLm1vZAotCi0gICAgIFRoaXMgaXMgWEhUTUwsIGEgcmVmb3JtdWxhdGlvbiBvZiBIVE1MIGFzIGEgbW9kdWxhciBYTUwgYXBwbGljYXRpb24uCi0gICAgIENvcHlyaWdodCAxOTk4LTIwMDEgVzNDIChNSVQsIElOUklBLCBLZWlvKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAgICAgUmV2aXNpb246ICRJZDogeGh0bWwxMS1mbGF0LmR0ZCx2IDEuMSAyMDA3LzA1LzE1IDAyOjQyOjIyIGRhdmlkX3dpbGxpYW1zIEV4cCAkIFNNSQotCi0gICAgIFRoaXMgRFREIG1vZHVsZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSBQVUJMSUMgYW5kIFNZU1RFTSBpZGVudGlmaWVyczoKLQotICAgICAgIFBVQkxJQyAiLS8vVzNDLy9FTEVNRU5UUyBYSFRNTCBEb2N1bWVudCBTdHJ1Y3R1cmUgMS4wLy9FTiIKLSAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sLW1vZHVsYXJpemF0aW9uL0RURC94aHRtbC1zdHJ1Y3QtMS5tb2QiCi0KLSAgICAgUmV2aXNpb25zOgotICAgICAobm9uZSkKLSAgICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhLS0gRG9jdW1lbnQgU3RydWN0dXJlCi0KLSAgICAgICAgdGl0bGUsIGhlYWQsIGJvZHksIGh0bWwKLQotICAgICBUaGUgU3RydWN0dXJlIE1vZHVsZSBkZWZpbmVzIHRoZSBtYWpvciBzdHJ1Y3R1cmFsIGVsZW1lbnRzIGFuZAotICAgICB0aGVpciBhdHRyaWJ1dGVzLgotCi0gICAgIE5vdGUgdGhhdCB0aGUgY29udGVudCBtb2RlbCBvZiB0aGUgaGVhZCBlbGVtZW50IHR5cGUgaXMgcmVkZWNsYXJlZAotICAgICB3aGVuIHRoZSBCYXNlIE1vZHVsZSBpcyBpbmNsdWRlZCBpbiB0aGUgRFRELgotCi0gICAgIFRoZSBwYXJhbWV0ZXIgZW50aXR5IGNvbnRhaW5pbmcgdGhlIFhNTCBuYW1lc3BhY2UgVVJJIHZhbHVlIHVzZWQKLSAgICAgZm9yIFhIVE1MIGlzICclWEhUTUwueG1sbnM7JywgZGVmaW5lZCBpbiB0aGUgUXVhbGlmaWVkIE5hbWVzIG1vZHVsZS4KLS0tPgotCi08IS0tIHRpdGxlOiBEb2N1bWVudCBUaXRsZSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAtLT4KLQotPCEtLSBUaGUgdGl0bGUgZWxlbWVudCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBmbG93IG9mIHRleHQuCi0gICAgIEl0IHNob3VsZCBiZSBkaXNwbGF5ZWQsIGZvciBleGFtcGxlIGFzIHRoZSBwYWdlIGhlYWRlciBvcgotICAgICB3aW5kb3cgdGl0bGUuIEV4YWN0bHkgb25lIHRpdGxlIGlzIHJlcXVpcmVkIHBlciBkb2N1bWVudC4KLS0tPgotCi08IUVOVElUWSAlIHRpdGxlLmVsZW1lbnQgICJJTkNMVURFIiA+Ci08IVsldGl0bGUuZWxlbWVudDtbCi08IUVOVElUWSAlIHRpdGxlLmNvbnRlbnQgICIoICNQQ0RBVEEgKSIgPgotPCFFTlRJVFkgJSB0aXRsZS5xbmFtZSAgInRpdGxlIiA+Ci08IUVMRU1FTlQgJXRpdGxlLnFuYW1lOyAgJXRpdGxlLmNvbnRlbnQ7ID4KLTwhLS0gZW5kIG9mIHRpdGxlLmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgdGl0bGUuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyV0aXRsZS5hdHRsaXN0O1sKLTwhQVRUTElTVCAldGl0bGUucW5hbWU7Ci0gICAgICAlWEhUTUwueG1sbnMuYXR0cmliOwotICAgICAgJUkxOG4uYXR0cmliOwotPgotPCEtLSBlbmQgb2YgdGl0bGUuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBoZWFkOiBEb2N1bWVudCBIZWFkIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgaGVhZC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWhlYWQuZWxlbWVudDtbCi08IUVOVElUWSAlIGhlYWQuY29udGVudAotICAgICIoICVIZWFkT3B0cy5taXg7LCAldGl0bGUucW5hbWU7LCAlSGVhZE9wdHMubWl4OyApIgotPgotPCFFTlRJVFkgJSBoZWFkLnFuYW1lICAiaGVhZCIgPgotPCFFTEVNRU5UICVoZWFkLnFuYW1lOyAgJWhlYWQuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaGVhZC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGhlYWQuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVoZWFkLmF0dGxpc3Q7WwotPCEtLSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSB3aXRoIGRvY3VtZW50IHByb2ZpbGVzCi0tLT4KLTwhRU5USVRZICUgcHJvZmlsZS5hdHRyaWIKLSAgICAgInByb2ZpbGUgICAgICAlVVJJLmRhdGF0eXBlOyAgICAgICAgICAgJyVYSFRNTC5wcm9maWxlOyciCi0+Ci0KLTwhQVRUTElTVCAlaGVhZC5xbmFtZTsKLSAgICAgICVYSFRNTC54bWxucy5hdHRyaWI7Ci0gICAgICAlSTE4bi5hdHRyaWI7Ci0gICAgICAlcHJvZmlsZS5hdHRyaWI7Ci0+Ci08IS0tIGVuZCBvZiBoZWFkLmF0dGxpc3QgLS0+XV0+Ci0KLTwhLS0gYm9keTogRG9jdW1lbnQgQm9keSAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgotCi08IUVOVElUWSAlIGJvZHkuZWxlbWVudCAgIklOQ0xVREUiID4KLTwhWyVib2R5LmVsZW1lbnQ7WwotPCFFTlRJVFkgJSBib2R5LmNvbnRlbnQKLSAgICAgIiggJUJsb2NrLm1peDsgKSsiCi0+Ci08IUVOVElUWSAlIGJvZHkucW5hbWUgICJib2R5IiA+Ci08IUVMRU1FTlQgJWJvZHkucW5hbWU7ICAlYm9keS5jb250ZW50OyA+Ci08IS0tIGVuZCBvZiBib2R5LmVsZW1lbnQgLS0+XV0+Ci0KLTwhRU5USVRZICUgYm9keS5hdHRsaXN0ICAiSU5DTFVERSIgPgotPCFbJWJvZHkuYXR0bGlzdDtbCi08IUFUVExJU1QgJWJvZHkucW5hbWU7Ci0gICAgICAlQ29tbW9uLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGJvZHkuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBodG1sOiBYSFRNTCBEb2N1bWVudCBFbGVtZW50IC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci0KLTwhRU5USVRZICUgaHRtbC5lbGVtZW50ICAiSU5DTFVERSIgPgotPCFbJWh0bWwuZWxlbWVudDtbCi08IUVOVElUWSAlIGh0bWwuY29udGVudCAgIiggJWhlYWQucW5hbWU7LCAlYm9keS5xbmFtZTsgKSIgPgotPCFFTlRJVFkgJSBodG1sLnFuYW1lICAiaHRtbCIgPgotPCFFTEVNRU5UICVodG1sLnFuYW1lOyAgJWh0bWwuY29udGVudDsgPgotPCEtLSBlbmQgb2YgaHRtbC5lbGVtZW50IC0tPl1dPgotCi08IUVOVElUWSAlIGh0bWwuYXR0bGlzdCAgIklOQ0xVREUiID4KLTwhWyVodG1sLmF0dGxpc3Q7WwotPCEtLSB2ZXJzaW9uIGF0dHJpYnV0ZSB2YWx1ZSBkZWZpbmVkIGluIGRyaXZlcgotLS0+Ci08IUVOVElUWSAlIFhIVE1MLnZlcnNpb24uYXR0cmliCi0gICAgICJ2ZXJzaW9uICAgICAgJUZQSS5kYXRhdHlwZTsgICAgICAgICAgICNGSVhFRCAnJVhIVE1MLnZlcnNpb247JyIKLT4KLQotPCEtLSBzZWUgdGhlIFF1YWxpZmllZCBOYW1lcyBtb2R1bGUgZm9yIGluZm9ybWF0aW9uCi0gICAgIG9uIGhvdyB0byBleHRlbmQgWEhUTUwgdXNpbmcgWE1MIG5hbWVzcGFjZXMKLS0tPgotPCFBVFRMSVNUICVodG1sLnFuYW1lOwotICAgICAgJVhIVE1MLnhtbG5zLmF0dHJpYjsKLSAgICAgICVYSFRNTC52ZXJzaW9uLmF0dHJpYjsKLSAgICAgICVJMThuLmF0dHJpYjsKLT4KLTwhLS0gZW5kIG9mIGh0bWwuYXR0bGlzdCAtLT5dXT4KLQotPCEtLSBlbmQgb2YgeGh0bWwtc3RydWN0LTEubW9kIC0tPgotXV0+Ci0KLTwhLS0gZW5kIG9mIFhIVE1MIDEuMSBEVEQgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLS0+Ci08IS0tIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIC0tPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NDhkZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotZG9jdW1lbnRUeXBlLmRpc3BsYXlOYW1lLjAgPSBYSFRNTCAxLjAgU3RyaWN0Ci1kb2N1bWVudFR5cGUuZGlzcGxheU5hbWUuMSA9IFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwKLWRvY3VtZW50VHlwZS5kaXNwbGF5TmFtZS4yID0gWEhUTUwgMS4wIEZyYW1lc2V0Ci1kb2N1bWVudFR5cGUuZGlzcGxheU5hbWUuMyA9IFhIVE1MIEJhc2ljIDEuMAotZG9jdW1lbnRUeXBlLmRpc3BsYXlOYW1lLjQgPSBYSFRNTCAxLjEKLWRvY3VtZW50VHlwZS5kaXNwbGF5TmFtZS41ID0gWEhUTUwgTVAgMS4wCi1kb2N1bWVudFR5cGUuZGlzcGxheU5hbWUuNiA9IFdNTCAxLjMKLUJ1bmRsZS1OYW1lLjAgPSBTdGFuZGFyZCBTY2hlbWFzIGFuZCBEVERzCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM0MGMzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLQotICAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgICA8IS0tIENhdGFsb2cgQ29udHJpYnV0aW9ucyAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBSZWdpc3RlciB3ZWxsIGtub3duIFdlYiBEVERzIGFuZCBYU0RzICAgIC0tPgotICAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotICAgIDwhLS0gbmV3IGZvcm0gLS0+Ci0KLSAgICA8IS0tIAotICAgICAgICBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMDQ4MQotICAgICAgICB5b3UgbWF5IGhhdmUgdG8gY29tbWVudCBvdXQgZm9sbG93aW5nIGV4dGVuc2lvbiBpZiB1c2VkIAotICAgICAgICBpbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gCi0gICAgICAgIAotICAgIC0tPgotCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNhdGFsb2dDb250cmlidXRpb25zIj4KLSAgICAgICAgPGNhdGFsb2dDb250cmlidXRpb24gaWQ9ImRlZmF1bHQiPgotCi0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vV0FQRk9SVU0vL0RURCBXTUwgMS4xLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHMvd21sMTEuZHRkIj4KLSAgICAgICAgICAgIDwvcHVibGljPgotCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkcy94aHRtbDEtc3RyaWN0LmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotICAgICAgICAgICAgPC9wdWJsaWM+Ci0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0gICAgICAgICAgICA8L3B1YmxpYz4KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIEZyYW1lc2V0Ly9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHMveGh0bWwxLWZyYW1lc2V0LmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLWZyYW1lc2V0LmR0ZCI+Ci0gICAgICAgICAgICA8L3B1YmxpYz4KLQotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9XM0MvL0RURCBYSFRNTCBCYXNpYyAxLjAvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkcy94aHRtbC1iYXNpYzEwLWYuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtYmFzaWMveGh0bWwtYmFzaWMxMC5kdGQiPgotICAgICAgICAgICAgPC9wdWJsaWM+Ci0KLSAgICAgICAgICAgIDxwdWJsaWMKLSAgICAgICAgICAgICAgICBwdWJsaWNJZD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiIKLSAgICAgICAgICAgICAgICB1cmk9ImR0ZHMveGh0bWwxMS1mbGF0LmR0ZCIKLSAgICAgICAgICAgICAgICB3ZWJVUkw9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvRFREL3hodG1sMTEuZHRkIj4KLSAgICAgICAgICAgIDwvcHVibGljPgotCi0gICAgICAgICAgICA8cHVibGljCi0gICAgICAgICAgICAgICAgcHVibGljSWQ9Ii0vL1dBUEZPUlVNLy9EVEQgWEhUTUwgTW9iaWxlIDEuMC8vRU4iCi0gICAgICAgICAgICAgICAgdXJpPSJkdGRzL3hodG1sLW1vYmlsZTEwLWZsYXQuZHRkIgotICAgICAgICAgICAgICAgIHdlYlVSTD0iaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3hodG1sLW1vYmlsZTEwLmR0ZCI+Ci0gICAgICAgICAgICA8L3B1YmxpYz4KLQotICAgICAgICAgICAgPHB1YmxpYwotICAgICAgICAgICAgICAgIHB1YmxpY0lkPSItLy9XQVBGT1JVTS8vRFREIFdNTCAxLjMvL0VOIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkcy93bWwxMy5kdGQiCi0gICAgICAgICAgICAgICAgd2ViVVJMPSJodHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQvd21sMTMuZHRkIj4KLSAgICAgICAgICAgIDwvcHVibGljPgotCi0gICAgICAgIAotCi0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgICAgICAgICAgdXJpPSJ4c2Qvd3NkbC54c2QiIC8+Ci0gICAgICAgICAgICA8dXJpCi0gICAgICAgICAgICAgICAgbmFtZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICAgICAgICAgICAgICB1cmk9InhzZC9zb2FwLnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIgotICAgICAgICAgICAgICAgIHVyaT0ieHNkL2h0dHAueHNkIiAvPgotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iCi0gICAgICAgICAgICAgICAgdXJpPSJ4c2Qvd3NkbC1taW1lLnhzZCIgLz4KLSAgICAgICAgICAgIDx1cmkKLSAgICAgICAgICAgICAgICBuYW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB1cmk9InhzZC9zb2FwZW5jLnhzZCIgLz4KLQotCi0gICAgICAgICAgICA8IS0tIHRoZXNlIGFyZSByZW1vdmVkIGZyb20gdGhlIGNhdGFsb2csIHNpbmNlIHRoZXkgYXJlIC1ub3QtIAotICAgICAgICAgICAgdGhlIHNhbWUgYXMgdGhvc2UgaW4gdGhlIHhzZC51aSBwbHVnaW4sIHdoaWNoIAotICAgICAgICAgICAgcG9pbnQgdG8gdGhlIG9yZy5lY2xpcHNlLnhzZCB2ZXJzaW9ucwotICAgICAgICAgICAgPHVyaQotICAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMvWE1MU2NoZW1hLmR0ZCIgLz4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDxzeXN0ZW0KLSAgICAgICAgICAgICAgICBzeXN0ZW1JZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIgotICAgICAgICAgICAgICAgIHVyaT0iZHRkc0FuZFNjaGVtYXMveG1sLnhzZCIgLz4KLSAgICAgICAgICAgICAtLT4KLSAgICAgICAgPC9jYXRhbG9nQ29udHJpYnV0aW9uPgotCi0gICAgPC9leHRlbnNpb24+Ci0KLQotCi0KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZG9jdW1lbnRUeXBlcyI+Ci0gICAgICAgIDxkb2N1bWVudFR5cGUKLSAgICAgICAgICAgIGVsZW1lbnROYW1lPSJodG1sIgotICAgICAgICAgICAgZGlzcGxheU5hbWU9IiVkb2N1bWVudFR5cGUuZGlzcGxheU5hbWUuMCIKLSAgICAgICAgICAgIG5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgICAgICAgIGlzWEhUTUw9InRydWUiCi0gICAgICAgICAgICBoYXNGcmFtZXNldD0iZmFsc2UiCi0gICAgICAgICAgICBwdWJsaWNJRD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgICAgICAgICBzeXN0ZW1JRD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci0gICAgICAgIDwvZG9jdW1lbnRUeXBlPgotICAgICAgICA8ZG9jdW1lbnRUeXBlCi0gICAgICAgICAgICBlbGVtZW50TmFtZT0iaHRtbCIKLSAgICAgICAgICAgIGRpc3BsYXlOYW1lPSIlZG9jdW1lbnRUeXBlLmRpc3BsYXlOYW1lLjEiCi0gICAgICAgICAgICBuYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICAgICAgICBpc1hIVE1MPSJ0cnVlIgotICAgICAgICAgICAgaGFzRnJhbWVzZXQ9ImZhbHNlIgotICAgICAgICAgICAgcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICAgICAgICAgZGVmYXVsdFhIVE1MPSJ0cnVlIgotICAgICAgICAgICAgc3lzdGVtSUQ9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotICAgICAgICA8L2RvY3VtZW50VHlwZT4KLSAgICAgICAgPGRvY3VtZW50VHlwZQotICAgICAgICAgICAgZWxlbWVudE5hbWU9Imh0bWwiCi0gICAgICAgICAgICBkaXNwbGF5TmFtZT0iJWRvY3VtZW50VHlwZS5kaXNwbGF5TmFtZS4yIgotICAgICAgICAgICAgbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgICAgICAgaXNYSFRNTD0idHJ1ZSIKLSAgICAgICAgICAgIGhhc0ZyYW1lc2V0PSJ0cnVlIgotICAgICAgICAgICAgcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBGcmFtZXNldC8vRU4iCi0gICAgICAgICAgICBzeXN0ZW1JRD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtZnJhbWVzZXQuZHRkIj4KLSAgICAgICAgPC9kb2N1bWVudFR5cGU+Ci0gICAgICAgIDxkb2N1bWVudFR5cGUKLSAgICAgICAgICAgIGVsZW1lbnROYW1lPSJodG1sIgotICAgICAgICAgICAgZGlzcGxheU5hbWU9IiVkb2N1bWVudFR5cGUuZGlzcGxheU5hbWUuMyIKLSAgICAgICAgICAgIG5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLSAgICAgICAgICAgIGlzWEhUTUw9InRydWUiCi0gICAgICAgICAgICBoYXNGcmFtZXNldD0iZmFsc2UiCi0gICAgICAgICAgICBwdWJsaWNJRD0iLS8vVzNDLy9EVEQgWEhUTUwgQmFzaWMgMS4wLy9FTiIKLSAgICAgICAgICAgIHN5c3RlbUlEPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbC1iYXNpYy94aHRtbC1iYXNpYzEwLmR0ZCI+Ci0gICAgICAgIDwvZG9jdW1lbnRUeXBlPgotICAgICAgICA8ZG9jdW1lbnRUeXBlCi0gICAgICAgICAgICBlbGVtZW50TmFtZT0iaHRtbCIKLSAgICAgICAgICAgIGRpc3BsYXlOYW1lPSIlZG9jdW1lbnRUeXBlLmRpc3BsYXlOYW1lLjQiCi0gICAgICAgICAgICBuYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0gICAgICAgICAgICBpc1hIVE1MPSJ0cnVlIgotICAgICAgICAgICAgaGFzRnJhbWVzZXQ9ImZhbHNlIgotICAgICAgICAgICAgcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iCi0gICAgICAgICAgICBzeXN0ZW1JRD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPgotICAgICAgICA8L2RvY3VtZW50VHlwZT4KLSAgICAgICAgPGRvY3VtZW50VHlwZQotICAgICAgICAgICAgZWxlbWVudE5hbWU9Imh0bWwiCi0gICAgICAgICAgICBkaXNwbGF5TmFtZT0iJWRvY3VtZW50VHlwZS5kaXNwbGF5TmFtZS41IgotICAgICAgICAgICAgbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotICAgICAgICAgICAgaXNYSFRNTD0idHJ1ZSIKLSAgICAgICAgICAgIGhhc0ZyYW1lc2V0PSJmYWxzZSIKLSAgICAgICAgICAgIHB1YmxpY0lEPSItLy9XQVBGT1JVTS8vRFREIFhIVE1MIE1vYmlsZSAxLjAvL0VOIgotICAgICAgICAgICAgc3lzdGVtSUQ9Imh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC94aHRtbC1tb2JpbGUxMC5kdGQiPgotICAgICAgICA8L2RvY3VtZW50VHlwZT4KLSAgICAgICAgPGRvY3VtZW50VHlwZQotICAgICAgICAgICAgZWxlbWVudE5hbWU9IndtbCIKLSAgICAgICAgICAgIGRpc3BsYXlOYW1lPSIlZG9jdW1lbnRUeXBlLmRpc3BsYXlOYW1lLjYiCi0gICAgICAgICAgICBuYW1lc3BhY2VVUkk9IiIKLSAgICAgICAgICAgIGlzV01MPSJ0cnVlIgotICAgICAgICAgICAgaGFzRnJhbWVzZXQ9ImZhbHNlIgotICAgICAgICAgICAgcHVibGljSUQ9Ii0vL1dBUEZPUlVNLy9EVEQgV01MIDEuMy8vRU4iCi0gICAgICAgICAgICBkZWZhdWx0V01MPSJ0cnVlIgotICAgICAgICAgICAgc3lzdGVtSUQ9Imh0dHA6Ly93d3cud2FwZm9ydW0ub3JnL0RURC93bWwxMy5kdGQiPgotICAgICAgICA8L2RvY3VtZW50VHlwZT4KLSAgICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC9odHRwLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMveHNkL2h0dHAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTQ2NmY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMveHNkL2h0dHAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAKLUNvcHlyaWdodCAyMDAxIC0gMjAwNSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgTWljcm9zb2Z0IENvcnBvcmF0aW9uCi1BbGwgUmlnaHRzIFJlc2VydmVkCi0KLUxpY2Vuc2UgZm9yIFdTREwgU2NoZW1hIEZpbGVzCi0KLVRoZSBBdXRob3JzIGdyYW50IHBlcm1pc3Npb24gdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgV1NETCBTY2hlbWEgCi1GaWxlcyBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgZmVlIG9yIHJveWFsdHkgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBhbmQgCi1saWNlbnNlIGFyZSBkaXN0cmlidXRlZCB3aXRoIHRoZW0uICBUaGUgb3JpZ2luYWxzIG9mIHRoZXNlIGZpbGVzIGNhbiAKLWJlIGxvY2F0ZWQgYXQ6Ci0KLWh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC93c2RsLWh0dHAueHNkCi0KLVRIRVNFIFNDSEVNQSBGSUxFUyBBUkUgUFJPVklERUQgIkFTIElTLCIgQU5EIFRIRSBBVVRIT1JTIE1BS0UgTk8gUkVQUkVTRU5UQVRJT05TIAotT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBSRUdBUkRJTkcgVEhFU0UgRklMRVMsIElOQ0xVRElORywgQlVUIE5PVCAKLUxJTUlURUQgVE8sIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgCi1OT04tSU5GUklOR0VNRU5UIE9SIFRJVExFLiAgVEhFIEFVVEhPUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCAKLUlORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBPUiAKLVJFTEFUSU5HIFRPIEFOWSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRVNFIEZJTEVTLgotCi1UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiB0aGUgQXV0aG9ycyBtYXkgTk9UIGJlIHVzZWQgaW4gYW55IG1hbm5lciwgCi1pbmNsdWRpbmcgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlc2UgZmlsZXMgb3IgYW55IHByb2dyYW0gCi1vciBzZXJ2aWNlIHRoYXQgdXNlcyB0aGVzZSBmaWxlcywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGl0bGUgdG8gY29weXJpZ2h0IAotaW4gdGhlc2UgZmlsZXMgd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggdGhlIEF1dGhvcnMuCi0KLU5vIG90aGVyIHJpZ2h0cyBhcmUgZ3JhbnRlZCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLgotCi0KLQotICAtLT4gCi08c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIKLSAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyI+Ci0KLQk8aW1wb3J0IG5hbWVzcGFjZSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotCi0gICAJPGVsZW1lbnQgbmFtZT0iYWRkcmVzcyIgdHlwZT0iaHR0cDphZGRyZXNzVHlwZSIvPgotCi0gICAJPGNvbXBsZXhUeXBlIG5hbWU9ImFkZHJlc3NUeXBlIj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQk8ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLQkJCTxzZXF1ZW5jZS8+Ci0KLSAgIAkJCTxhdHRyaWJ1dGUgbmFtZT0ibG9jYXRpb24iIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLSAgIAk8L2NvbXBsZXhUeXBlPgotCi0gICAJPGVsZW1lbnQgbmFtZT0iYmluZGluZyIgdHlwZT0iaHR0cDpiaW5kaW5nVHlwZSIvPgotICAgCTxjb21wbGV4VHlwZSBuYW1lPSJiaW5kaW5nVHlwZSI+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJPGV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0KLQkJCTxzZXF1ZW5jZS8+Ci0JICAgICAgCQk8YXR0cmlidXRlIG5hbWU9InZlcmIiIHR5cGU9Ik5NVE9LRU4iIHVzZT0icmVxdWlyZWQiLz4KLQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0gICAJPC9jb21wbGV4VHlwZT4KLQotICAgCTxlbGVtZW50IG5hbWU9Im9wZXJhdGlvbiIgdHlwZT0iaHR0cDpvcGVyYXRpb25UeXBlIi8+Ci0gICAJPGNvbXBsZXhUeXBlIG5hbWU9Im9wZXJhdGlvblR5cGUiPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0KLQkJPGV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0JCQk8c2VxdWVuY2UvPgotCSAgICAgIAkJPGF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0iYW55VVJJIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0KLSAgIAk8ZWxlbWVudCBuYW1lPSJ1cmxFbmNvZGVkIj4KLSAgICAgIAkJPGNvbXBsZXhUeXBlLz4gIAkJCi0gICAJPC9lbGVtZW50PgotCi0gICAJPGVsZW1lbnQgbmFtZT0idXJsUmVwbGFjZW1lbnQiPgotICAgICAgCQk8Y29tcGxleFR5cGUvPgotICAgICAJPC9lbGVtZW50PgotPC9zY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy94c2Qvc29hcC54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC9zb2FwLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VmODUyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC9zb2FwLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIAotIAotQ29weXJpZ2h0IDIwMDEgLSAyMDA1LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBNaWNyb3NvZnQgQ29ycG9yYXRpb24KLUFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotTGljZW5zZSBmb3IgV1NETCBTY2hlbWEgRmlsZXMKLQotVGhlIEF1dGhvcnMgZ3JhbnQgcGVybWlzc2lvbiB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBXU0RMIFNjaGVtYSAKLUZpbGVzIGluIGFueSBtZWRpdW0gd2l0aG91dCBmZWUgb3Igcm95YWx0eSBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGFuZCAKLWxpY2Vuc2UgYXJlIGRpc3RyaWJ1dGVkIHdpdGggdGhlbS4gIFRoZSBvcmlnaW5hbHMgb2YgdGhlc2UgZmlsZXMgY2FuIAotYmUgbG9jYXRlZCBhdDoKLQotaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLzIwMDMtMDItMTEueHNkCi0KLVRIRVNFIFNDSEVNQSBGSUxFUyBBUkUgUFJPVklERUQgIkFTIElTLCIgQU5EIFRIRSBBVVRIT1JTIE1BS0UgTk8gUkVQUkVTRU5UQVRJT05TIAotT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBSRUdBUkRJTkcgVEhFU0UgRklMRVMsIElOQ0xVRElORywgQlVUIE5PVCAKLUxJTUlURUQgVE8sIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgCi1OT04tSU5GUklOR0VNRU5UIE9SIFRJVExFLiAgVEhFIEFVVEhPUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCAKLUlORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBPUiAKLVJFTEFUSU5HIFRPIEFOWSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRVNFIEZJTEVTLgotCi1UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiB0aGUgQXV0aG9ycyBtYXkgTk9UIGJlIHVzZWQgaW4gYW55IG1hbm5lciwgCi1pbmNsdWRpbmcgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlc2UgZmlsZXMgb3IgYW55IHByb2dyYW0gCi1vciBzZXJ2aWNlIHRoYXQgdXNlcyB0aGVzZSBmaWxlcywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGl0bGUgdG8gY29weXJpZ2h0IAotaW4gdGhlc2UgZmlsZXMgd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggdGhlIEF1dGhvcnMuCi0KLU5vIG90aGVyIHJpZ2h0cyBhcmUgZ3JhbnRlZCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLgotCi0KLS0tPiAKLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiA+Ci0KLSAgPHhzOmltcG9ydCBuYW1lc3BhY2UgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIC8+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW5jb2RpbmdTdHlsZSIgPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAiZW5jb2RpbmdTdHlsZSIgaW5kaWNhdGVzIGFueSBjYW5vbmljYWxpemF0aW9uIGNvbnZlbnRpb25zIGZvbGxvd2VkIGluIHRoZSBjb250ZW50cyBvZiB0aGUgY29udGFpbmluZyBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIHRoZSB2YWx1ZSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIGluZGljYXRlcyB0aGUgcGF0dGVybiBkZXNjcmliZWQgaW4gU09BUCBzcGVjaWZpY2F0aW9uCi0gICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgPC94czphbm5vdGF0aW9uPgotCi0gICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOmFueVVSSSIgLz4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImJpbmRpbmciIHR5cGU9InNvYXA6dEJpbmRpbmciIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0QmluZGluZyIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJpbGl0eUVsZW1lbnQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0cmFuc3BvcnQiIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdHlsZSIgdHlwZT0ic29hcDp0U3R5bGVDaG9pY2UiIHVzZT0ib3B0aW9uYWwiIC8+Ci0KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idFN0eWxlQ2hvaWNlIiA+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIgPgotICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJycGMiIC8+Ci0gICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRvY3VtZW50IiAvPgotICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Im9wZXJhdGlvbiIgdHlwZT0ic29hcDp0T3BlcmF0aW9uIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idE9wZXJhdGlvbiIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJpbGl0eUVsZW1lbnQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzb2FwQWN0aW9uIiB0eXBlPSJ4czphbnlVUkkiIHVzZT0ib3B0aW9uYWwiIC8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3R5bGUiIHR5cGU9InNvYXA6dFN0eWxlQ2hvaWNlIiB1c2U9Im9wdGlvbmFsIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImJvZHkiIHR5cGU9InNvYXA6dEJvZHkiIC8+Ci0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJ0Qm9keUF0dHJpYnV0ZXMiID4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nU3R5bGUiIHR5cGU9InNvYXA6ZW5jb2RpbmdTdHlsZSIgdXNlPSJvcHRpb25hbCIgLz4JICAgCi0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1c2UiIHR5cGU9InNvYXA6dXNlQ2hvaWNlIiB1c2U9Im9wdGlvbmFsIiAvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czphbnlVUkkiIHVzZT0ib3B0aW9uYWwiIC8+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0Qm9keSIgPgotCi0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmlsaXR5RWxlbWVudCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InBhcnRzIiB0eXBlPSJ4czpOTVRPS0VOUyIgdXNlPSJvcHRpb25hbCIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZiA9ICJzb2FwOnRCb2R5QXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIAotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ1c2VDaG9pY2UiID4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIiA+Ci0KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibGl0ZXJhbCIgLz4KLSAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZW5jb2RlZCIgLz4KLSAgICA8L3hzOnJlc3RyaWN0aW9uPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZmF1bHQiIHR5cGU9InNvYXA6dEZhdWx0IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idEZhdWx0UmVzIiBhYnN0cmFjdD0idHJ1ZSIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJzb2FwOnRCb2R5IiA+Ci0KLQkgICAgPHhzOmF0dHJpYnV0ZSByZWY9IndzZGw6cmVxdWlyZWQiIHVzZT0ib3B0aW9uYWwiIC8+IAotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InBhcnRzIiB0eXBlPSJ4czpOTVRPS0VOUyIgdXNlPSJwcm9oaWJpdGVkIiAvPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJzb2FwOnRCb2R5QXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4gIAkKLSAgPC94czpjb21wbGV4VHlwZT4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRGYXVsdCIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ic29hcDp0RmF1bHRSZXMiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLQotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotCi0gIDx4czplbGVtZW50IG5hbWU9ImhlYWRlciIgdHlwZT0ic29hcDp0SGVhZGVyIiAvPgotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0idEhlYWRlckF0dHJpYnV0ZXMiID4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzOlFOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icGFydCIgdHlwZT0ieHM6Tk1UT0tFTiIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVzZSIgdHlwZT0ic29hcDp1c2VDaG9pY2UiIHVzZT0icmVxdWlyZWQiIC8+Ci0KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nU3R5bGUiIHR5cGU9InNvYXA6ZW5jb2RpbmdTdHlsZSIgdXNlPSJvcHRpb25hbCIgLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6YW55VVJJIiB1c2U9Im9wdGlvbmFsIiAvPiAgICAgIAotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idEhlYWRlciIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJpbGl0eUVsZW1lbnQiID4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ic29hcDpoZWFkZXJmYXVsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLQotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJzb2FwOnRIZWFkZXJBdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJoZWFkZXJmYXVsdCIgdHlwZT0ic29hcDp0SGVhZGVyRmF1bHQiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0SGVhZGVyRmF1bHQiID4KLQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJzb2FwOnRIZWFkZXJBdHRyaWJ1dGVzIiAvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImFkZHJlc3MiIHR5cGU9InNvYXA6dEFkZHJlc3MiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0QWRkcmVzcyIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJpbGl0eUVsZW1lbnQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotPC94czpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy94c2Qvc29hcGVuYy54c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC9zb2FwZW5jLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVjODBkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC9zb2FwZW5jLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU4NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCcgPz4KLQotPCEtLSBTY2hlbWEgZm9yIHRoZSBTT0FQLzEuMSBlbmNvZGluZwotCi1Qb3J0aW9ucyDCqSAyMDAxIERldmVsb3BNZW50b3IuIAotwqkgMjAwMSBXM0MgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAKLSAKLVRoaXMgZG9jdW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIFczQyBTb2Z0d2FyZSBMaWNlbnNlIFsxXSBhcyBkZXNjcmliZWQgaW4gdGhlIEZBUSBbMl0uCi1bMV0gaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtc29mdHdhcmUtMTk5ODA3MjAKLVsyXSBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL0lQUi1GQVEtMjAwMDA2MjAuaHRtbCNEVEQgCi1CeSBvYnRhaW5pbmcsIHVzaW5nIGFuZC9vciBjb3B5aW5nIHRoaXMgd29yaywgeW91ICh0aGUgbGljZW5zZWUpIGFncmVlIHRoYXQgeW91IGhhdmUgcmVhZCwgdW5kZXJzdG9vZCwgYW5kIHdpbGwgY29tcGx5IHdpdGggdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9uczoKLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sICBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIG9yIHJveWFsdHkgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgeW91IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBvbiBBTEwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbiBvciBwb3J0aW9ucyB0aGVyZW9mLCBpbmNsdWRpbmcgbW9kaWZpY2F0aW9ucywgdGhhdCB5b3UgbWFrZToKLQotMS4gIFRoZSBmdWxsIHRleHQgb2YgdGhpcyBOT1RJQ0UgaW4gYSBsb2NhdGlvbiB2aWV3YWJsZSB0byB1c2VycyBvZiB0aGUgcmVkaXN0cmlidXRlZCBvciBkZXJpdmF0aXZlIHdvcmsuIAotCi0yLiAgQW55IHByZS1leGlzdGluZyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgZGlzY2xhaW1lcnMsIG5vdGljZXMsIG9yIHRlcm1zIGFuZCBjb25kaXRpb25zLiBJZiBub25lIGV4aXN0LCBhIHNob3J0IG5vdGljZSBvZiB0aGUgZm9sbG93aW5nIGZvcm0gKGh5cGVydGV4dCBpcyBwcmVmZXJyZWQsIHRleHQgaXMgcGVybWl0dGVkKSBzaG91bGQgYmUgdXNlZCB3aXRoaW4gdGhlIGJvZHkgb2YgYW55IHJlZGlzdHJpYnV0ZWQgb3IgZGVyaXZhdGl2ZSBjb2RlOiAiQ29weXJpZ2h0IMKpIDIwMDEgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSwgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvIiAKLQotMy4gIE5vdGljZSBvZiBhbnkgY2hhbmdlcyBvciBtb2RpZmljYXRpb25zIHRvIHRoZSBXM0MgZmlsZXMsIGluY2x1ZGluZyB0aGUgZGF0ZSBjaGFuZ2VzIHdlcmUgbWFkZS4gKFdlIHJlY29tbWVuZCB5b3UgcHJvdmlkZSBVUklzIHRvIHRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIHRoZSBjb2RlIGlzIGRlcml2ZWQuKSAgIAotCi1PcmlnaW5hbCBXM0MgZmlsZXM7IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDYvc29hcC1lbmNvZGluZwotQ2hhbmdlcyBtYWRlOiAKLSAgICAgLSByZXZlcnRlZCBuYW1lc3BhY2UgdG8gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgLSByZXZlcnRlZCByb290IHRvIG9ubHkgYWxsb3cgMCBhbmQgMSBhcyBsZXhpY2FsIHZhbHVlcwotCSAtIHJlbW92ZWQgZGVmYXVsdCB2YWx1ZSBmcm9tIHJvb3QgYXR0cmlidXRlIGRlY2xhcmF0aW9uCi0KLVRISVMgU09GVFdBUkUgQU5EIERPQ1VNRU5UQVRJT04gSVMgUFJPVklERUQgIkFTIElTLCIgQU5EIENPUFlSSUdIVCBIT0xERVJTIE1BS0UgTk8gUkVQUkVTRU5UQVRJT05TIE9SIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTywgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBUSEFUIFRIRSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04gV0lMTCBOT1QgSU5GUklOR0UgQU5ZIFRISVJEIFBBUlRZIFBBVEVOVFMsIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLgotCi1DT1BZUklHSFQgSE9MREVSUyBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBBTlkgVVNFIE9GIFRIRSBTT0ZUV0FSRSBPUiBET0NVTUVOVEFUSU9OLgotCi1UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiBjb3B5cmlnaHQgaG9sZGVycyBtYXkgTk9UIGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gVGl0bGUgdG8gY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgYW5kIGFueSBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggY29weXJpZ2h0IGhvbGRlcnMuCi0KLS0tPgotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iID4KLSAgICAgICAgCi0gPHhzOmF0dHJpYnV0ZSBuYW1lPSJyb290IiA+Ci0gICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0JICAgJ3Jvb3QnIGNhbiBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIHNlcmlhbGl6YXRpb24gcm9vdHMgZnJvbSBvdGhlcgotICAgICAgIGVsZW1lbnRzIHRoYXQgYXJlIHByZXNlbnQgaW4gYSBzZXJpYWxpemF0aW9uIGJ1dCBhcmUgbm90IHJvb3RzIG9mCi0gICAgICAgYSBzZXJpYWxpemVkIHZhbHVlIGdyYXBoIAotCSA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLQotICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6Ym9vbGVhbic+Ci0JICAgPHhzOnBhdHRlcm4gdmFsdWU9JzB8MScgLz4KLQkgPC94czpyZXN0cmljdGlvbj4KLSAgIDwveHM6c2ltcGxlVHlwZT4KLSA8L3hzOmF0dHJpYnV0ZT4KLQotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iY29tbW9uQXR0cmlidXRlcyIgPgotICAgIDx4czphbm5vdGF0aW9uPgotCSAgPHhzOmRvY3VtZW50YXRpb24+Ci0KLQkgICAgQXR0cmlidXRlcyBjb21tb24gdG8gYWxsIGVsZW1lbnRzIHRoYXQgZnVuY3Rpb24gYXMgYWNjZXNzb3JzIG9yIAotICAgICAgICByZXByZXNlbnQgaW5kZXBlbmRlbnQgKG11bHRpLXJlZikgdmFsdWVzLiAgVGhlIGhyZWYgYXR0cmlidXRlIGlzCi0gICAgICAgIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gYSBtYW5uZXIgbGlrZSBDT05SRUYuICBUaGF0IGlzLCB0aGUgZWxlbWVudAotICAgICAgICBjb250ZW50IHNob3VsZCBiZSBlbXB0eSBpZmYgdGhlIGhyZWYgYXR0cmlidXRlIGFwcGVhcnMKLQkgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiIC8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJocmVmIiB0eXBlPSJ4czphbnlVUkkiIC8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotCi0gIDwhLS0gR2xvYmFsIEF0dHJpYnV0ZXMuICBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGludGVuZGVkIHRvIGJlIHVzYWJsZSB2aWEgcXVhbGlmaWVkIGF0dHJpYnV0ZSBuYW1lcyBvbiBhbnkgY29tcGxleCB0eXBlIHJlZmVyZW5jaW5nIHRoZW0uIC0tPgotICAgICAgIAotICA8IS0tIEFycmF5IGF0dHJpYnV0ZXMuIE5lZWRlZCB0byBnaXZlIHRoZSB0eXBlIGFuZCBkaW1lbnNpb25zIG9mIGFuIGFycmF5J3MgY29udGVudHMsIGFuZCB0aGUgb2Zmc2V0IGZvciBwYXJ0aWFsbHktdHJhbnNtaXR0ZWQgYXJyYXlzLiAtLT4KLQotICAgCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImFycmF5Q29vcmRpbmF0ZSIgPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciIC8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAKLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhcnJheVR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJvZmZzZXQiIHR5cGU9InRuczphcnJheUNvb3JkaW5hdGUiIC8+Ci0gIAotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iYXJyYXlBdHRyaWJ1dGVzIiA+Ci0gICAgPHhzOmF0dHJpYnV0ZSByZWY9InRuczphcnJheVR5cGUiIC8+Ci0gICAgPHhzOmF0dHJpYnV0ZSByZWY9InRuczpvZmZzZXQiIC8+Ci0gIDwveHM6YXR0cmlidXRlR3JvdXA+ICAgIAotICAKLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwb3NpdGlvbiIgdHlwZT0idG5zOmFycmF5Q29vcmRpbmF0ZSIgLz4gCi0gIAotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iYXJyYXlNZW1iZXJBdHRyaWJ1dGVzIiA+Ci0KLSAgICA8eHM6YXR0cmlidXRlIHJlZj0idG5zOnBvc2l0aW9uIiAvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPiAgICAKLQotICA8eHM6Z3JvdXAgbmFtZT0iQXJyYXkiID4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNhbnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCTwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Z3JvdXA+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iQXJyYXkiIHR5cGU9InRuczpBcnJheSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkFycmF5IiA+Ci0KLSAgICA8eHM6YW5ub3RhdGlvbj4KLQkgIDx4czpkb2N1bWVudGF0aW9uPgotCSAgICdBcnJheScgaXMgYSBjb21wbGV4IHR5cGUgZm9yIGFjY2Vzc29ycyBpZGVudGlmaWVkIGJ5IHBvc2l0aW9uIAotCSAgPC94czpkb2N1bWVudGF0aW9uPgotCTwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6Z3JvdXAgcmVmPSJ0bnM6QXJyYXkiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6YXJyYXlBdHRyaWJ1dGVzIiAvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICA8L3hzOmNvbXBsZXhUeXBlPiAKLQotICA8IS0tICdTdHJ1Y3QnIGlzIGEgY29tcGxleCB0eXBlIGZvciBhY2Nlc3NvcnMgaWRlbnRpZmllZCBieSBuYW1lLiAKLSAgICAgICBDb25zdHJhaW50OiBObyBlbGVtZW50IG1heSBiZSBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgYW55IG90aGVyLAotICAgICAgIG5vciBtYXkgYW55IGVsZW1lbnQgaGF2ZSBhIG1heE9jY3VycyA+IDEuIC0tPgotCi0gICAKLSAgPHhzOmVsZW1lbnQgbmFtZT0iU3RydWN0IiB0eXBlPSJ0bnM6U3RydWN0IiAvPgotCi0gIDx4czpncm91cCBuYW1lPSJTdHJ1Y3QiID4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNhbnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCTwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Z3JvdXA+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlN0cnVjdCIgPgotICAgIDx4czpncm91cCByZWY9InRuczpTdHJ1Y3QiIG1pbk9jY3Vycz0iMCIgLz4KLQotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIi8+Ci0gIDwveHM6Y29tcGxleFR5cGU+IAotCi0gIDwhLS0gJ0Jhc2U2NCcgY2FuIGJlIHVzZWQgdG8gc2VyaWFsaXplIGJpbmFyeSBkYXRhIHVzaW5nIGJhc2U2NCBlbmNvZGluZwotICAgICAgIGFzIGRlZmluZWQgaW4gUkZDMjA0NSBidXQgd2l0aG91dCB0aGUgTUlNRSBsaW5lIGxlbmd0aCBsaW1pdGF0aW9uLiAtLT4KLQotICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJiYXNlNjQiID4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YmFzZTY0QmluYXJ5IiAvPgotICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSA8IS0tIEVsZW1lbnQgZGVjbGFyYXRpb25zIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBvZiB0aGUgc2ltcGxlIHR5cGVzIGluIHRoZSAKLSAgICAgIFhNTCBTY2hlbWFzIFNwZWNpZmljYXRpb24uIC0tPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImR1cmF0aW9uIiB0eXBlPSJ0bnM6ZHVyYXRpb24iIC8+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImR1cmF0aW9uIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmR1cmF0aW9uIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImRhdGVUaW1lIiB0eXBlPSJ0bnM6ZGF0ZVRpbWUiIC8+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGVUaW1lIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmRhdGVUaW1lIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJOT1RBVElPTiIgdHlwZT0idG5zOk5PVEFUSU9OIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTk9UQVRJT04iID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6UU5hbWUiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gIAotCi0gIDx4czplbGVtZW50IG5hbWU9InRpbWUiIHR5cGU9InRuczp0aW1lIiAvPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnRpbWUiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZGF0ZSIgdHlwZT0idG5zOmRhdGUiIC8+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGUiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6ZGF0ZSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJnWWVhck1vbnRoIiB0eXBlPSJ0bnM6Z1llYXJNb250aCIgLz4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ1llYXJNb250aCIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpnWWVhck1vbnRoIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImdZZWFyIiB0eXBlPSJ0bnM6Z1llYXIiIC8+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImdZZWFyIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmdZZWFyIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImdNb250aERheSIgdHlwZT0idG5zOmdNb250aERheSIgLz4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ01vbnRoRGF5IiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmdNb250aERheSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJnRGF5IiB0eXBlPSJ0bnM6Z0RheSIgLz4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ0RheSIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpnRGF5IiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImdNb250aCIgdHlwZT0idG5zOmdNb250aCIgLz4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ01vbnRoIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmdNb250aCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgCi0gIDx4czplbGVtZW50IG5hbWU9ImJvb2xlYW4iIHR5cGU9InRuczpib29sZWFuIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYm9vbGVhbiIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmJvb2xlYW4iID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iYmFzZTY0QmluYXJ5IiB0eXBlPSJ0bnM6YmFzZTY0QmluYXJ5IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYmFzZTY0QmluYXJ5IiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YmFzZTY0QmluYXJ5IiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImhleEJpbmFyeSIgdHlwZT0idG5zOmhleEJpbmFyeSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImhleEJpbmFyeSIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6aGV4QmluYXJ5IiA+Ci0gICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJmbG9hdCIgdHlwZT0idG5zOmZsb2F0IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZmxvYXQiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpmbG9hdCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJkb3VibGUiIHR5cGU9InRuczpkb3VibGUiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJkb3VibGUiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpkb3VibGUiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iYW55VVJJIiB0eXBlPSJ0bnM6YW55VVJJIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYW55VVJJIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW55VVJJIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9IlFOYW1lIiB0eXBlPSJ0bnM6UU5hbWUiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJRTmFtZSIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOlFOYW1lIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIAotICA8eHM6ZWxlbWVudCBuYW1lPSJzdHJpbmciIHR5cGU9InRuczpzdHJpbmciIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzdHJpbmciID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibm9ybWFsaXplZFN0cmluZyIgdHlwZT0idG5zOm5vcm1hbGl6ZWRTdHJpbmciIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJub3JtYWxpemVkU3RyaW5nIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6bm9ybWFsaXplZFN0cmluZyIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ0b2tlbiIgdHlwZT0idG5zOnRva2VuIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idG9rZW4iID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czp0b2tlbiIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJsYW5ndWFnZSIgdHlwZT0idG5zOmxhbmd1YWdlIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibGFuZ3VhZ2UiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpsYW5ndWFnZSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJOYW1lIiB0eXBlPSJ0bnM6TmFtZSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik5hbWUiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpOYW1lIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Ik5NVE9LRU4iIHR5cGU9InRuczpOTVRPS0VOIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTk1UT0tFTiIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOk5NVE9LRU4iID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iTkNOYW1lIiB0eXBlPSJ0bnM6TkNOYW1lIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTkNOYW1lIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6TkNOYW1lIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Ik5NVE9LRU5TIiB0eXBlPSJ0bnM6Tk1UT0tFTlMiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJOTVRPS0VOUyIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOk5NVE9LRU5TIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9IklEIiB0eXBlPSJ0bnM6SUQiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJRCIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOklEIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9IklEUkVGIiB0eXBlPSJ0bnM6SURSRUYiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJRFJFRiIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOklEUkVGIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9IkVOVElUWSIgdHlwZT0idG5zOkVOVElUWSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkVOVElUWSIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOkVOVElUWSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJJRFJFRlMiIHR5cGU9InRuczpJRFJFRlMiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJRFJFRlMiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpJRFJFRlMiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iRU5USVRJRVMiIHR5cGU9InRuczpFTlRJVElFUyIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkVOVElUSUVTIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6RU5USVRJRVMiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZGVjaW1hbCIgdHlwZT0idG5zOmRlY2ltYWwiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJkZWNpbWFsIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6ZGVjaW1hbCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJpbnRlZ2VyIiB0eXBlPSJ0bnM6aW50ZWdlciIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImludGVnZXIiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czppbnRlZ2VyIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Im5vblBvc2l0aXZlSW50ZWdlciIgdHlwZT0idG5zOm5vblBvc2l0aXZlSW50ZWdlciIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im5vblBvc2l0aXZlSW50ZWdlciIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm5vblBvc2l0aXZlSW50ZWdlciIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJuZWdhdGl2ZUludGVnZXIiIHR5cGU9InRuczpuZWdhdGl2ZUludGVnZXIiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJuZWdhdGl2ZUludGVnZXIiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpuZWdhdGl2ZUludGVnZXIiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibG9uZyIgdHlwZT0idG5zOmxvbmciIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJsb25nIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6bG9uZyIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJpbnQiIHR5cGU9InRuczppbnQiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJpbnQiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czppbnQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ic2hvcnQiIHR5cGU9InRuczpzaG9ydCIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InNob3J0IiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6c2hvcnQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iYnl0ZSIgdHlwZT0idG5zOmJ5dGUiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJieXRlIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6Ynl0ZSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJub25OZWdhdGl2ZUludGVnZXIiIHR5cGU9InRuczpub25OZWdhdGl2ZUludGVnZXIiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJub25OZWdhdGl2ZUludGVnZXIiID4KLQotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpub25OZWdhdGl2ZUludGVnZXIiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idW5zaWduZWRMb25nIiB0eXBlPSJ0bnM6dW5zaWduZWRMb25nIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idW5zaWduZWRMb25nIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6dW5zaWduZWRMb25nIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9InVuc2lnbmVkSW50IiB0eXBlPSJ0bnM6dW5zaWduZWRJbnQiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ1bnNpZ25lZEludCIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnVuc2lnbmVkSW50IiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9InVuc2lnbmVkU2hvcnQiIHR5cGU9InRuczp1bnNpZ25lZFNob3J0IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idW5zaWduZWRTaG9ydCIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnVuc2lnbmVkU2hvcnQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idW5zaWduZWRCeXRlIiB0eXBlPSJ0bnM6dW5zaWduZWRCeXRlIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idW5zaWduZWRCeXRlIiA+Ci0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6dW5zaWduZWRCeXRlIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9InBvc2l0aXZlSW50ZWdlciIgdHlwZT0idG5zOnBvc2l0aXZlSW50ZWdlciIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InBvc2l0aXZlSW50ZWdlciIgPgotCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnBvc2l0aXZlSW50ZWdlciIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJhbnlUeXBlIiAvPgotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC93c2RsLW1pbWUueHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3RhbmRhcmQuc2NoZW1hcy94c2Qvd3NkbC1taW1lLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU3YTUzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC93c2RsLW1pbWUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gCi1Db3B5cmlnaHQgMjAwMS0yMDA1LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBNaWNyb3NvZnQgQ29ycG9yYXRpb24KLUFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotTGljZW5zZSBmb3IgV1NETCBTY2hlbWEgRmlsZXMKLQotVGhlIEF1dGhvcnMgZ3JhbnQgcGVybWlzc2lvbiB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBXU0RMIFNjaGVtYSAKLUZpbGVzIGluIGFueSBtZWRpdW0gd2l0aG91dCBmZWUgb3Igcm95YWx0eSBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGFuZCAKLWxpY2Vuc2UgYXJlIGRpc3RyaWJ1dGVkIHdpdGggdGhlbS4gIFRoZSBvcmlnaW5hbHMgb2YgdGhlc2UgZmlsZXMgY2FuIAotYmUgbG9jYXRlZCBhdDoKLQotaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLzIwMDQtMDgtMjQueHNkCi0KLVRIRVNFIFNDSEVNQSBGSUxFUyBBUkUgUFJPVklERUQgIkFTIElTLCIgQU5EIFRIRSBBVVRIT1JTIE1BS0UgTk8gUkVQUkVTRU5UQVRJT05TIAotT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBSRUdBUkRJTkcgVEhFU0UgRklMRVMsIElOQ0xVRElORywgQlVUIE5PVCAKLUxJTUlURUQgVE8sIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgCi1OT04tSU5GUklOR0VNRU5UIE9SIFRJVExFLiAgVEhFIEFVVEhPUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCAKLUlORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBPUiAKLVJFTEFUSU5HIFRPIEFOWSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRVNFIEZJTEVTLgotCi1UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiB0aGUgQXV0aG9ycyBtYXkgTk9UIGJlIHVzZWQgaW4gYW55IG1hbm5lciwgCi1pbmNsdWRpbmcgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlc2UgZmlsZXMgb3IgYW55IHByb2dyYW0gCi1vciBzZXJ2aWNlIHRoYXQgdXNlcyB0aGVzZSBmaWxlcywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGl0bGUgdG8gY29weXJpZ2h0IAotaW4gdGhlc2UgZmlsZXMgd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggdGhlIEF1dGhvcnMuCi0KLU5vIG90aGVyIHJpZ2h0cyBhcmUgZ3JhbnRlZCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLgotCi0KLSAgLS0+IAotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iPgotCTxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotCTxlbGVtZW50IG5hbWU9ImNvbnRlbnQiIHR5cGU9Im1pbWU6Y29udGVudFR5cGUiLz4KLQk8Y29tcGxleFR5cGUgbmFtZT0iY29udGVudFR5cGUiPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLQkJCQk8c2VxdWVuY2UvPgotCQkJCTxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQkJPGF0dHJpYnV0ZSBuYW1lPSJwYXJ0IiB0eXBlPSJOTVRPS0VOIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxlbGVtZW50IG5hbWU9Im11bHRpcGFydFJlbGF0ZWQiIHR5cGU9Im1pbWU6bXVsdGlwYXJ0UmVsYXRlZFR5cGUiLz4KLQk8Y29tcGxleFR5cGUgbmFtZT0ibXVsdGlwYXJ0UmVsYXRlZFR5cGUiPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLQkJCQk8c2VxdWVuY2U+Ci0JCQkJCTxlbGVtZW50IHJlZj0ibWltZTpwYXJ0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC9zZXF1ZW5jZT4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGVsZW1lbnQgbmFtZT0icGFydCIgdHlwZT0ibWltZTp0UGFydCIvPgotCTxjb21wbGV4VHlwZSBuYW1lPSJ0UGFydCI+Ci0JCTxzZXF1ZW5jZT4KLQkJCTxhbnkgbmFtZXNwYWNlPSIjI2FueSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3NlcXVlbmNlPgotCQk8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9Ik5NVE9LRU4iIHVzZT0ib3B0aW9uYWwiLz4KLQk8L2NvbXBsZXhUeXBlPgotICAgCTxlbGVtZW50IG5hbWU9Im1pbWVYbWwiIHR5cGUgPSAibWltZTp0TWltZVhtbCIvPgotICAgCTxjb21wbGV4VHlwZSBuYW1lPSJ0TWltZVhtbCI+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJpbGl0eUVsZW1lbnQiPgotCQkJCTxzZXF1ZW5jZS8+Ci0JCQkJPGF0dHJpYnV0ZSBuYW1lPSJwYXJ0IiB0eXBlPSJOTVRPS0VOIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLSAgIAk8L2NvbXBsZXhUeXBlPgotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzL3hzZC93c2RsLnhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMveHNkL3dzZGwueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTgxZDYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnN0YW5kYXJkLnNjaGVtYXMveHNkL3dzZGwueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gCi0gCi1Db3B5cmlnaHQgMjAwMSAtIDIwMDUsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbgotQWxsIFJpZ2h0cyBSZXNlcnZlZAotCi1MaWNlbnNlIGZvciBXU0RMIFNjaGVtYSBGaWxlcwotCi1UaGUgQXV0aG9ycyBncmFudCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFdTREwgU2NoZW1hIAotRmlsZXMgaW4gYW55IG1lZGl1bSB3aXRob3V0IGZlZSBvciByb3lhbHR5IGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgYW5kIAotbGljZW5zZSBhcmUgZGlzdHJpYnV0ZWQgd2l0aCB0aGVtLiAgVGhlIG9yaWdpbmFscyBvZiB0aGVzZSBmaWxlcyBjYW4gCi1iZSBsb2NhdGVkIGF0OgotCi1odHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLzIwMDQtMDgtMjQueHNkCi0KLVRIRVNFIFNDSEVNQSBGSUxFUyBBUkUgUFJPVklERUQgIkFTIElTLCIgQU5EIFRIRSBBVVRIT1JTIE1BS0UgTk8gUkVQUkVTRU5UQVRJT05TIAotT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBSRUdBUkRJTkcgVEhFU0UgRklMRVMsIElOQ0xVRElORywgQlVUIE5PVCAKLUxJTUlURUQgVE8sIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgCi1OT04tSU5GUklOR0VNRU5UIE9SIFRJVExFLiAgVEhFIEFVVEhPUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCAKLUlORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBPUiAKLVJFTEFUSU5HIFRPIEFOWSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRVNFIEZJTEVTLgotCi1UaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiB0aGUgQXV0aG9ycyBtYXkgTk9UIGJlIHVzZWQgaW4gYW55IG1hbm5lciwgCi1pbmNsdWRpbmcgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlc2UgZmlsZXMgb3IgYW55IHByb2dyYW0gCi1vciBzZXJ2aWNlIHRoYXQgdXNlcyB0aGVzZSBmaWxlcywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGl0bGUgdG8gY29weXJpZ2h0IAotaW4gdGhlc2UgZmlsZXMgd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggdGhlIEF1dGhvcnMuCi0KLU5vIG90aGVyIHJpZ2h0cyBhcmUgZ3JhbnRlZCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLgotCi0KLS0tPiAKLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiID4KLSAgIAotICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiIG5hbWU9InREb2N1bWVudGF0aW9uIiA+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmFueSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0RG9jdW1lbnRlZCIgPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBUaGlzIHR5cGUgaXMgZXh0ZW5kZWQgYnkgIGNvbXBvbmVudCB0eXBlcyB0byBhbGxvdyB0aGVtIHRvIGJlIGRvY3VtZW50ZWQKLSAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOnNlcXVlbmNlPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZG9jdW1lbnRhdGlvbiIgdHlwZT0id3NkbDp0RG9jdW1lbnRhdGlvbiIgbWluT2NjdXJzPSIwIiAvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSA8IS0tIGltcGxlbWVudGVkIHJlc29sdXRpb24gb2Ygc3dhMTI0IC0tPgotIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0RXh0ZW5zaWJsZUF0dHJpYnV0ZXNEb2N1bWVudGVkIiBhYnN0cmFjdD0idHJ1ZSIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RG9jdW1lbnRlZCIgPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICBUaGlzIHR5cGUgaXMgZXh0ZW5kZWQgYnkgY29tcG9uZW50IHR5cGVzIHRvIGFsbG93IGF0dHJpYnV0ZXMgZnJvbSBvdGhlciBuYW1lc3BhY2VzIHRvIGJlIGFkZGVkLgotICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94czphbm5vdGF0aW9uPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+ICAgCi0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gPCEtLSBpbXBsZW1lbnRlZCByZXNvbHV0aW9uIG9mIHN3YTEyNCAtLT4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRFeHRlbnNpYmxlRG9jdW1lbnRlZCIgYWJzdHJhY3Q9InRydWUiID4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dERvY3VtZW50ZWQiID4KLSAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgVGhpcyB0eXBlIGlzIGV4dGVuZGVkIGJ5IGNvbXBvbmVudCB0eXBlcyB0byBhbGxvdyBlbGVtZW50cyBmcm9tIG90aGVyIG5hbWVzcGFjZXMgdG8gYmUgYWRkZWQuCi0gICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgLz4gICAKLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZGVmaW5pdGlvbnMiIHR5cGU9IndzZGw6dERlZmluaXRpb25zIiA+Ci0gICAgPHhzOmtleSBuYW1lPSJtZXNzYWdlIiA+Ci0gICAgICA8eHM6c2VsZWN0b3IgeHBhdGg9IndzZGw6bWVzc2FnZSIgLz4KLSAgICAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWUiIC8+Ci0gICAgPC94czprZXk+Ci0gICAgPHhzOmtleSBuYW1lPSJwb3J0VHlwZSIgPgotICAgICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ3c2RsOnBvcnRUeXBlIiAvPgotICAgICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIgLz4KLSAgICA8L3hzOmtleT4KLSAgICA8eHM6a2V5IG5hbWU9ImJpbmRpbmciID4KLSAgICAgIDx4czpzZWxlY3RvciB4cGF0aD0id3NkbDpiaW5kaW5nIiAvPgotICAgICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIgLz4KLSAgICA8L3hzOmtleT4KLSAgICA8eHM6a2V5IG5hbWU9InNlcnZpY2UiID4KLSAgICAgIDx4czpzZWxlY3RvciB4cGF0aD0id3NkbDpzZXJ2aWNlIiAvPgotICAgICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIgLz4KLSAgICA8L3hzOmtleT4KLSAgICA8eHM6a2V5IG5hbWU9ImltcG9ydCIgPgotICAgICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ3c2RsOmltcG9ydCIgLz4KLSAgICAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWVzcGFjZSIgLz4KLSAgICA8L3hzOmtleT4KLSAgPC94czplbGVtZW50PgotCi0gIDx4czpncm91cCBuYW1lPSJhbnlUb3BMZXZlbE9wdGlvbmFsRWxlbWVudCIgPgotICAgIDx4czphbm5vdGF0aW9uPgotICAgICAgPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICBBbnkgdG9wIGxldmVsIG9wdGlvbmFsIGVsZW1lbnQgYWxsb3dlZCB0byBhcHBlYXIgbW9yZSB0aGVuIG9uY2UgLSBhbnkgY2hpbGQgb2YgZGVmaW5pdGlvbnMgZWxlbWVudCBleGNlcHQgd3NkbDp0eXBlcy4gQW55IGV4dGVuc2liaWxpdHkgZWxlbWVudCBpcyBhbGxvd2VkIGluIGFueSBwbGFjZS4KLSAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOmNob2ljZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImltcG9ydCIgdHlwZT0id3NkbDp0SW1wb3J0IiAvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idHlwZXMiIHR5cGU9IndzZGw6dFR5cGVzIiAvPiAgICAgICAgICAgICAgICAgICAgIAotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgIHR5cGU9IndzZGw6dE1lc3NhZ2UiID4KLSAgICAgICAgPHhzOnVuaXF1ZSBuYW1lPSJwYXJ0IiA+Ci0gICAgICAgICAgPHhzOnNlbGVjdG9yIHhwYXRoPSJ3c2RsOnBhcnQiIC8+Ci0gICAgICAgICAgPHhzOmZpZWxkIHhwYXRoPSJAbmFtZSIgLz4KLSAgICAgICAgPC94czp1bmlxdWU+Ci0gICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwb3J0VHlwZSIgdHlwZT0id3NkbDp0UG9ydFR5cGUiIC8+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJiaW5kaW5nIiAgdHlwZT0id3NkbDp0QmluZGluZyIgLz4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InNlcnZpY2UiICB0eXBlPSJ3c2RsOnRTZXJ2aWNlIiA+Ci0gICAgICAgIDx4czp1bmlxdWUgbmFtZT0icG9ydCIgPgotICAgICAgICAgIDx4czpzZWxlY3RvciB4cGF0aD0id3NkbDpwb3J0IiAvPgotICAgICAgICAgIDx4czpmaWVsZCB4cGF0aD0iQG5hbWUiIC8+Ci0gICAgICAgIDwveHM6dW5pcXVlPgotCSAgPC94czplbGVtZW50PgotICAgIDwveHM6Y2hvaWNlPgotICA8L3hzOmdyb3VwPgotCi0gIDwhLS0gaW1wbGVtZW50ZWQgcmVzb2x1dGlvbiBvZiBlcjAxNSBhbmQgVVBBIGZpeC4gQVNLIC0tPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idERlZmluaXRpb25zIj4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2libGVEb2N1bWVudGVkIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgPHhzOmdyb3VwIHJlZj0id3NkbDphbnlUb3BMZXZlbE9wdGlvbmFsRWxlbWVudCIvPgotICAgICAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ3c2RsOmFueVRvcExldmVsT3B0aW9uYWxFbGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KLSAgICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIgdXNlPQotIm9wdGlvbmFsIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0SW1wb3J0IiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmxlQXR0cmlidXRlc0RvY3VtZW50ZWQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ieHM6YW55VVJJIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgIAotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idFR5cGVzIiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PiAgIAotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmxlRG9jdW1lbnRlZCIgLz4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PiAgIAotICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAKLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRNZXNzYWdlIiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PiAgIAotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmxlRG9jdW1lbnRlZCIgPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGFydCIgdHlwZT0id3NkbDp0UGFydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PiAgIAotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0UGFydCIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4gICAKLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJsZUF0dHJpYnV0ZXNEb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVsZW1lbnQiIHR5cGU9InhzOlFOYW1lIiB1c2U9Im9wdGlvbmFsIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOlFOYW1lIiB1c2U9Im9wdGlvbmFsIiAvPiAgICAKLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+ICAgCi0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRQb3J0VHlwZSIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4gICAKLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJsZUF0dHJpYnV0ZXNEb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJvcGVyYXRpb24iIHR5cGU9IndzZGw6dE9wZXJhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PiAgIAotICA8L3hzOmNvbXBsZXhUeXBlPgotICAgCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0T3BlcmF0aW9uIiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PiAgIAotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmxlRG9jdW1lbnRlZCIgPgotCSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmNob2ljZT4KLSAgICAgICAgICAgIDx4czpncm91cCByZWY9IndzZGw6cmVxdWVzdC1yZXNwb25zZS1vci1vbmUtd2F5LW9wZXJhdGlvbiIgLz4KLSAgICAgICAgICAgIDx4czpncm91cCByZWY9IndzZGw6c29saWNpdC1yZXNwb25zZS1vci1ub3RpZmljYXRpb24tb3BlcmF0aW9uIiAvPgotICAgICAgICAgIDwveHM6Y2hvaWNlPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYXJhbWV0ZXJPcmRlciIgdHlwZT0ieHM6Tk1UT0tFTlMiIHVzZT0ib3B0aW9uYWwiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PiAgIAotICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIAotICA8eHM6Z3JvdXAgbmFtZT0icmVxdWVzdC1yZXNwb25zZS1vci1vbmUtd2F5LW9wZXJhdGlvbiIgPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImlucHV0IiB0eXBlPSJ3c2RsOnRQYXJhbSIgLz4KLQkgIDx4czpzZXF1ZW5jZSBtaW5PY2N1cnM9JzAnID4KLQkgICAgPHhzOmVsZW1lbnQgbmFtZT0ib3V0cHV0IiB0eXBlPSJ3c2RsOnRQYXJhbSIgLz4KLQkJPHhzOmVsZW1lbnQgbmFtZT0iZmF1bHQiIHR5cGU9IndzZGw6dEZhdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOnNlcXVlbmNlPgotICA8L3hzOmdyb3VwPgotCi0gIDx4czpncm91cCBuYW1lPSJzb2xpY2l0LXJlc3BvbnNlLW9yLW5vdGlmaWNhdGlvbi1vcGVyYXRpb24iID4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJvdXRwdXQiIHR5cGU9IndzZGw6dFBhcmFtIiAvPgotCSAgPHhzOnNlcXVlbmNlIG1pbk9jY3Vycz0nMCcgPgotCSAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbnB1dCIgdHlwZT0id3NkbDp0UGFyYW0iIC8+Ci0JCTx4czplbGVtZW50IG5hbWU9ImZhdWx0IiB0eXBlPSJ3c2RsOnRGYXVsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpncm91cD4KLSAgICAgICAgCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0UGFyYW0iID4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2libGVBdHRyaWJ1dGVzRG9jdW1lbnRlZCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJvcHRpb25hbCIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRGYXVsdCIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJsZUF0dHJpYnV0ZXNEb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgIAotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idEJpbmRpbmciID4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2libGVEb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJvcGVyYXRpb24iIHR5cGU9IndzZGw6dEJpbmRpbmdPcGVyYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOlFOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLSAgICAKLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRCaW5kaW5nT3BlcmF0aW9uTWVzc2FnZSIgPgotICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0id3NkbDp0RXh0ZW5zaWJsZURvY3VtZW50ZWQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0ib3B0aW9uYWwiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotICAKLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRCaW5kaW5nT3BlcmF0aW9uRmF1bHQiID4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2libGVEb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idEJpbmRpbmdPcGVyYXRpb24iID4KLSAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9IndzZGw6dEV4dGVuc2libGVEb2N1bWVudGVkIiA+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbnB1dCIgdHlwZT0id3NkbDp0QmluZGluZ09wZXJhdGlvbk1lc3NhZ2UiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJvdXRwdXQiIHR5cGU9IndzZGw6dEJpbmRpbmdPcGVyYXRpb25NZXNzYWdlIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZmF1bHQiIHR5cGU9IndzZGw6dEJpbmRpbmdPcGVyYXRpb25GYXVsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAKLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRTZXJ2aWNlIiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmxlRG9jdW1lbnRlZCIgPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icG9ydCIgdHlwZT0id3NkbDp0UG9ydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOQ05hbWUiIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAKLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRQb3J0IiA+Ci0gICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ3c2RsOnRFeHRlbnNpYmxlRG9jdW1lbnRlZCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJiaW5kaW5nIiB0eXBlPSJ4czpRTmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhcnJheVR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRFeHRlbnNpYmlsaXR5RWxlbWVudCIgYWJzdHJhY3Q9InRydWUiID4KLSAgICA8eHM6YXR0cmlidXRlIHJlZj0id3NkbDpyZXF1aXJlZCIgdXNlPSJvcHRpb25hbCIgLz4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY5N2QwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWNvbnRlbnRtb2RlbCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1zZWFyY2giLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtdmFsaWRhdGlvbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1jYXRhbG9nIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWVtZk1vZGVsU3luY2giLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWYvcmVzb3VyY2UvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vaW50ZXJuYWwvZW1mL3V0aWxpdGllcy8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi9pbnRlcm5hbC9lbWZ3b3JrYmVuY2gvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy9kb20vVHJlZVdhbGtlckltcGwiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy93M2MvZG9tL3Jhbmdlcy9Eb2N1bWVudFJhbmdlIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvdzNjL2RvbS9yYW5nZXMvUmFuZ2UiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy93M2MvZG9tL3RyYXZlcnNhbC9Eb2N1bWVudFRyYXZlcnNhbCIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL3czYy9kb20vdHJhdmVyc2FsL05vZGVGaWx0ZXIiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy93M2MvZG9tL3RyYXZlcnNhbC9Ob2RlSXRlcmF0b3IiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy93M2MvZG9tL3RyYXZlcnNhbC9UcmVlV2Fsa2VyIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvdzNjL2RvbS9yYW5nZXMvUmFuZ2VFeGNlcHRpb24iLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL2ltcGwvWE1MRXJyb3JSZXBvcnRlciIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMvcGFyc2Vycy9TdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb24iLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9BdWdtZW50YXRpb25zIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvTmFtZXNwYWNlQ29udGV4dCIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMveG5pL1FOYW1lIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy94bmkvWE1MQXR0cmlidXRlcyIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMveG5pL1hNTExvY2F0b3IiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9YTUxSZXNvdXJjZUlkZW50aWZpZXIiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9YTklFeGNlcHRpb24iLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9wYXJzZXIvWE1MRW50aXR5UmVzb2x2ZXIiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9wYXJzZXIvWE1MSW5wdXRTb3VyY2UiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3BhcnNlcnMvU0FYUGFyc2VyIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy9wYXJzZXJzL0Fic3RyYWN0U0FYUGFyc2VyIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3M2Y4YmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi14bWxtb2RlbC5qYXIKLW9yZy5lY2xpcHNlLndzdC54bWwuY29yZV8xLjAuMC5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NmU0ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC54bWwuY29yZS9kZWJ1Zz10cnVlCi1vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvZGVidWcvdHJhY2VmaWx0ZXI9Ci1vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvZGVidWcvY21kb2N1bWVudG1hbmFnZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC54bWwuY29yZS9kZWJ1Zy9jbWRvY3VtZW50Y2FjaGU9ZmFsc2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDE3NTE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+PC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDA1MzA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSNTYXQgTWFyIDI0IDAyOjE4OjIzIEVEVCAyMDA3DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYTVjNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1dlZCBOb3YgMTUgMDI6MjY6MTAgRVNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxyXG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2Y2E1YTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNXZWQgTm92IDE1IDAyOjEzOjMxIEVTVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTEKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy5qRmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzM2U2NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy5qRmxleAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi0lJQotCi0ldGFibGUKLSVwdWJsaWMKLSVmaW5hbAotJWNsYXNzIFhNTDEwTmFtZXMKLSVmdW5jdGlvbiBpc1ZhbGlkWE1MMTBOYW1lCi0ldHlwZSBib29sZWFuCi0ldW5pY29kZQotJWlnbm9yZWNhc2UKLSVidWZmZXIgMjA0OAotJWFwaXByaXZhdGUKLQotUyA9IChceDIwIHwgXHgwOSB8IFx4MEQgfCBceDBBKQotCi1CYXNlQ2hhciA9IFtcdTAwNDEtXHUwMDVBXHUwMDYxLVx1MDA3QVx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDBGRlx1MDEwMC1cdTAxMzFcdTAxMzQtXHUwMTNFXHUwMTQxLVx1MDE0OFx1MDE0QS1cdTAxN0VcdTAxODAtXHUwMUMzXHUwMUNELVx1MDFGMFx1MDFGNC1cdTAxRjVcdTAxRkEtXHUwMjE3XHUwMjUwLVx1MDJBOFx1MDJCQi1cdTAyQzFcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzQ0VcdTAzRDAtXHUwM0Q2XHUwM0RBXHUwM0RDXHUwM0RFXHUwM0UwXHUwM0UyLVx1MDNGM1x1MDQwMS1cdTA0MENcdTA0MEUtXHUwNDRGXHUwNDUxLVx1MDQ1Q1x1MDQ1RS1cdTA0ODFcdTA0OTAtXHUwNEM0XHUwNEM3LVx1MDRDOFx1MDRDQi1cdTA0Q0NcdTA0RDAtXHUwNEVCXHUwNEVFLVx1MDRGNVx1MDRGOC1cdTA0RjlcdTA1MzEtXHUwNTU2XHUwNTU5XHUwNTYxLVx1MDU4Nlx1MDVEMC1cdTA1RUFcdTA1RjAtXHUwNUYyXHUwNjIxLVx1MDYzQVx1MDY0MS1cdTA2NEFcdTA2NzEtXHUwNkI3XHUwNkJBLVx1MDZCRVx1MDZDMC1cdTA2Q0VcdTA2RDAtXHUwNkQzXHUwNkQ1XHUwNkU1LVx1MDZFNlx1MDkwNS1cdTA5MzlcdTA5M0RcdTA5NTgtXHUwOTYxXHUwOTg1LVx1MDk4Q1x1MDk4Ri1cdTA5OTBcdTA5OTMtXHUwOUE4XHUwOUFBLVx1MDlCMFx1MDlCMlx1MDlCNi1cdTA5QjlcdTA5REMtXHUwOUREXHUwOURGLVx1MDlFMVx1MDlGMC1cdTA5RjFcdTBBMDUtXHUwQTBBXHUwQTBGLVx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyLVx1MEEzM1x1MEEzNS1cdTBBMzZcdTBBMzgtXHUwQTM5XHUwQTU5LVx1MEE1Q1x1MEE1RVx1MEE3Mi1cdTBBNzRcdTBBODUtXHUwQThCXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyLVx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkRcdTBBRTBcdTBCMDUtXHUwQjBDXHUwQjBGLVx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyLVx1MEIzM1x1MEIzNi1cdTBCMzlcdTBCM0RcdTBCNUMtXHUwQjVEXHUwQjVGLVx1MEI2MVx1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OS1cdTBCOUFcdTBCOUNcdTBCOUUtXHUwQjlGXHUwQkEzLVx1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI1XHUwQkI3LVx1MEJCOVx1MEMwNS1cdTBDMENcdTBDMEUtXHUwQzEwXHUwQzEyLVx1MEMyOFx1MEMyQS1cdTBDMzNcdTBDMzUtXHUwQzM5XHUwQzYwLVx1MEM2MVx1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0RFXHUwQ0UwLVx1MENFMVx1MEQwNS1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQyOFx1MEQyQS1cdTBEMzlcdTBENjAtXHUwRDYxXHUwRTAxLVx1MEUyRVx1MEUzMFx1MEUzMi1cdTBFMzNcdTBFNDAtXHUwRTQ1XHUwRTgxLVx1MEU4Mlx1MEU4NFx1MEU4Ny1cdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUEtXHUwRUFCXHUwRUFELVx1MEVBRVx1MEVCMFx1MEVCMi1cdTBFQjNcdTBFQkRcdTBFQzAtXHUwRUM0XHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNjlcdTEwQTAtXHUxMEM1XHUxMEQwLVx1MTBGNlx1MTEwMFx1MTEwMi1cdTExMDNcdTExMDUtXHUxMTA3XHUxMTA5XHUxMTBCLVx1MTEwQ1x1MTEwRS1cdTExMTJcdTExM0NcdTExM0VcdTExNDBcdTExNENcdTExNEVcdTExNTBcdTExNTQtXHUxMTU1XHUxMTU5XHUxMTVGLVx1MTE2MVx1MTE2M1x1MTE2NVx1MTE2N1x1MTE2OVx1MTE2RC1cdTExNkVcdTExNzItXHUxMTczXHUxMTc1XHUxMTlFXHUxMUE4XHUxMUFCXHUxMUFFLVx1MTFBRlx1MTFCNy1cdTExQjhcdTExQkFcdTExQkMtXHUxMUMyXHUxMUVCXHUxMUYwXHUxMUY5XHUxRTAwLVx1MUU5Qlx1MUVBMC1cdTFFRjlcdTFGMDAtXHUxRjE1XHUxRjE4LVx1MUYxRFx1MUYyMC1cdTFGNDVcdTFGNDgtXHUxRjREXHUxRjUwLVx1MUY1N1x1MUY1OVx1MUY1Qlx1MUY1RFx1MUY1Ri1cdTFGN0RcdTFGODAtXHUxRkI0XHUxRkI2LVx1MUZCQ1x1MUZCRVx1MUZDMi1cdTFGQzRcdTFGQzYtXHUxRkNDXHUxRkQwLVx1MUZEM1x1MUZENi1cdTFGREJcdTFGRTAtXHUxRkVDXHUxRkYyLVx1MUZGNFx1MUZGNi1cdTFGRkNcdTIxMjZcdTIxMkEtXHUyMTJCXHUyMTJFXHUyMTgwLVx1MjE4Mlx1MzA0MS1cdTMwOTRcdTMwQTEtXHUzMEZBXHUzMTA1LVx1MzEyQ1x1QUMwMC1cdUQ3QTNdCi0KLUlkZW9ncmFwaGljID0gW1x1NEUwMC1cdTlGQTVcdTMwMDdcdTMwMjEtXHUzMDI5XQotCi1Db21iaW5pbmdDaGFyID0gW1x1MDMwMC1cdTAzNDVcdTAzNjAtXHUwMzYxXHUwNDgzLVx1MDQ4Nlx1MDU5MS1cdTA1QTFcdTA1QTMtXHUwNUI5XHUwNUJCLVx1MDVCRFx1MDVCRlx1MDVDMS1cdTA1QzJcdTA1QzRcdTA2NEItXHUwNjUyXHUwNjcwXHUwNkQ2LVx1MDZEQ1x1MDZERC1cdTA2REZcdTA2RTAtXHUwNkU0XHUwNkU3LVx1MDZFOFx1MDZFQS1cdTA2RURcdTA5MDEtXHUwOTAzXHUwOTNDXHUwOTNFLVx1MDk0Q1x1MDk0RFx1MDk1MS1cdTA5NTRcdTA5NjItXHUwOTYzXHUwOTgxLVx1MDk4M1x1MDlCQ1x1MDlCRVx1MDlCRlx1MDlDMC1cdTA5QzRcdTA5QzctXHUwOUM4XHUwOUNCLVx1MDlDRFx1MDlEN1x1MDlFMi1cdTA5RTNcdTBBMDJcdTBBM0NcdTBBM0VcdTBBM0ZcdTBBNDAtXHUwQTQyXHUwQTQ3LVx1MEE0OFx1MEE0Qi1cdTBBNERcdTBBNzAtXHUwQTcxXHUwQTgxLVx1MEE4M1x1MEFCQ1x1MEFCRS1cdTBBQzVcdTBBQzctXHUwQUM5XHUwQUNCLVx1MEFDRFx1MEIwMS1cdTBCMDNcdTBCM0NcdTBCM0UtXHUwQjQzXHUwQjQ3LVx1MEI0OFx1MEI0Qi1cdTBCNERcdTBCNTYtXHUwQjU3XHUwQjgyLVx1MEI4M1x1MEJCRS1cdTBCQzJcdTBCQzYtXHUwQkM4XHUwQkNBLVx1MEJDRFx1MEJEN1x1MEMwMS1cdTBDMDNcdTBDM0UtXHUwQzQ0XHUwQzQ2LVx1MEM0OFx1MEM0QS1cdTBDNERcdTBDNTUtXHUwQzU2XHUwQzgyLVx1MEM4M1x1MENCRS1cdTBDQzRcdTBDQzYtXHUwQ0M4XHUwQ0NBLVx1MENDRFx1MENENS1cdTBDRDZcdTBEMDItXHUwRDAzXHUwRDNFLVx1MEQ0M1x1MEQ0Ni1cdTBENDhcdTBENEEtXHUwRDREXHUwRDU3XHUwRTMxXHUwRTM0LVx1MEUzQVx1MEU0Ny1cdTBFNEVcdTBFQjFcdTBFQjQtXHUwRUI5XHUwRUJCLVx1MEVCQ1x1MEVDOC1cdTBFQ0RcdTBGMTgtXHUwRjE5XHUwRjM1XHUwRjM3XHUwRjM5XHUwRjNFXHUwRjNGXHUwRjcxLVx1MEY4NFx1MEY4Ni1cdTBGOEJcdTBGOTAtXHUwRjk1XHUwRjk3XHUwRjk5LVx1MEZBRFx1MEZCMS1cdTBGQjdcdTBGQjlcdTIwRDAtXHUyMERDXHUyMEUxXHUzMDJBLVx1MzAyRlx1MzA5OVx1MzA5QV0KLQotRGlnaXQgPSAgW1x1MDAzMC1cdTAwMzlcdTA2NjAtXHUwNjY5XHUwNkYwLVx1MDZGOVx1MDk2Ni1cdTA5NkZcdTA5RTYtXHUwOUVGXHUwQTY2LVx1MEE2Rlx1MEFFNi1cdTBBRUZcdTBCNjYtXHUwQjZGXHUwQkU3LVx1MEJFRlx1MEM2Ni1cdTBDNkZcdTBDRTYtXHUwQ0VGXHUwRDY2LVx1MEQ2Rlx1MEU1MC1cdTBFNTlcdTBFRDAtXHUwRUQ5XHUwRjIwLVx1MEYyOV0KLQotRXh0ZW5kZXIgPSBbXHUwMEI3XHUwMkQwXHUwMkQxXHUwMzg3XHUwNjQwXHUwRTQ2XHUwRUM2XHUzMDA1XHUzMDMxLVx1MzAzNVx1MzA5RC1cdTMwOUVcdTMwRkMtXHUzMEZFXQotCi1MZXR0ZXIgPSAoe0Jhc2VDaGFyfSB8IHtJZGVvZ3JhcGhpY30pCi0KLU5hbWVDaGFyID0gKHtMZXR0ZXJ9IHwge0RpZ2l0fSB8IC4gfCAtIHwgXyB8IDogfCB7Q29tYmluaW5nQ2hhcn0gfCB7RXh0ZW5kZXJ9KQotCi1OYW1lID0gKHtMZXR0ZXJ9IHwgXyB8IDogKSAoe05hbWVDaGFyfSkqCi0KLQotCi0lewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0JICovCi0JcHVibGljIFhNTDEwTmFtZXMoKSB7Ci0JCXRoaXMuenpSZWFkZXIgPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRYTUwxME5hbWUoU3RyaW5nIHN0cmluZ1RvQ2hlY2spIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJeXlyZXNldChuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoc3RyaW5nVG9DaGVjaykpOwotCQl0cnkgewotCQkJcmVzdWx0ID0gaXNWYWxpZFhNTDEwTmFtZSgpOwotCQl9Ci0JCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNob3VsZCBiZSBpbXBvc3NpYmxlIHdpdGggc3RyaW5ncywgYnV0IGlmIG9jY3VycywganVzdCBtZWFucwotCQkJLy8gIm5vdCIKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0lfQotCi0KLQotCi0lJQotCi08WVlJTklUSUFMPgotewotCi0JLy8gZG9uJ3QgbWF0Y2ggaWYgY29udGFpbnMgdHJhaWxpbmcgb3IgZW1iZWRkZWQgc3BhY2UKLQl7TmFtZX0ge1N9KyAgICAgICAgIHtyZXR1cm4gZmFsc2U7fQotCXtOYW1lfSB7U30rIHtOYW1lfSAge3JldHVybiBmYWxzZTt9Ci0KLQl7TmFtZX0gICAgICAgICAgICAgIHtyZXR1cm4gdHJ1ZTt9Ci0KLQkvLyBtYXRjaCBhbnl0aGluZyBzaG91bGQgY29tZSBsYXN0Ci0JLiAgICAgICAgICAgICAgICAgICB7cmV0dXJuIGZhbHNlO30KLQotfQotCi0KLS8vIHRoaXMgcnVsZSBhbHdheXMgaW4gZWZmZWN0Ci08PEVPRj4+Ci17Ci0Je3JldHVybiBmYWxzZTt9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci5qRmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNTBhMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci5qRmxleAorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLSUlCi0KLSV7Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSA4MDAwOwotCVN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZVRleHQgPSBudWxsOwotCi0KLQlwdWJsaWMgWE1MSGVhZFRva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsKLSAgICAgICAgICAgICAgICAvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gICAgICAgICAgICAgICAgenpSZWFkZXIgPSBpbjsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgICAgICAgICAgICAgICB6elN0YXRlID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgICAgICAgICAgICAgICB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQotICAgICAgICAgICAgICAgIC8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgICAgICAgICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5cy5maWxsKHp6QnVmZmVyLCAoY2hhcikwKTsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgenpNYXJrZWRQb3MgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgICAgICAgICAgICAgICB6elB1c2hiYWNrUG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHp6Q3VycmVudFBvcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICB6elN0YXJ0UmVhZCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgICAgICAgICAgICAgKiBmcm9tIGlucHV0Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgenpFbmRSZWFkID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAgICAgICAgICAgICAgIHl5bGluZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgICAgICAgICAgICAgICB5eWNoYXIgPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgICAgICAgICAgICAgICAgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgeXljb2x1bW4gPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcKLSAgICAgICAgICAgICAgICAgKiBvZiBhIGxpbmUKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB6ekF0Qk9MID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIC8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgICAgICAgICAgICAgICB6ekF0RU9GID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgICAgICAgICAgICAgICB6ekVPRkRvbmUgPSBmYWxzZTsKLQotCi0gICAgICAgICAgICAgICAgZlN0YXRlU3RhY2suY2xlYXIoKTsKLQotICAgICAgICAgICAgICAgIGhhc01vcmUgPSB0cnVlOwotICAJCQotICAJfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQkKLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQkKLQotJX0KLQotJWVvZnsKLQloYXNNb3JlPWZhbHNlOwotJWVvZn0KLQotJXB1YmxpYwotJWNsYXNzIFhNTEhlYWRUb2tlbml6ZXIKLSVmdW5jdGlvbiBwcmltR2V0TmV4dFRva2VuCi0ldHlwZSBTdHJpbmcKLSVjaGFyCi0ldW5pY29kZQotJWlnbm9yZWNhc2UgCi0vLyVkZWJ1ZwotJXN3aXRjaAotJWJ1ZmZlciA4MTkyCi0KLVVURjE2QkUgPSBceEZFXHhGRgotVVRGMTZMRSA9IFx4RkZceEZFCi1VVEY4M0J5dGVCT00gPSBceEVGXHhCQlx4QkYKLQotLy9TcGFjZUNoYXIgPSBbXHgyMFx4MDldCi0KLS8vIFszXSBTIDo6PSAoMHgyMCB8IDB4OSB8IDB4RCB8IDB4QSkrCi1TID0gW1x4MjBceDA5XHgwRFx4MEFdCi0KLUJlZ2luQXR0cmliZVZhbHVlID0ge1N9KiBcPSB7U30qCi0KLUxpbmVUZXJtaW5hdG9yID0gXHJ8XG4KLQotCi0lc3RhdGUgU1RfWE1MRGVjbAotJXN0YXRlIFF1b3RlZEF0dHJpYnV0ZVZhbHVlCi0lc3RhdGUgRFFfU1RSSU5HCi0lc3RhdGUgU1FfU1RSSU5HCi0lc3RhdGUgVW5EZWxpbWl0ZWRTdHJpbmcKLQotJSUKLQotCi08WVlJTklUSUFMPiAgCi17Ci0JLy8gZm9yY2UgdG8gc3RhcnQgYXQgYmVnaW5uaW5nIG9mIGxpbmUgKF4pIGFuZCBhdCBiZWdpbm5pbmcgb2YgZmlsZSAoeXljaGFyID09IDApCi0JXntVVEYxNkJFfSAgIAkJe2lmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFO319Ci0JXntVVEYxNkxFfSAgIAkJe2lmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFO319Ci0JXntVVEY4M0J5dGVCT019ICAgCXtpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NO319Ci0JCi0JLy8gZm9yY2UgdG8gYmUgc3RhcnRlZCBvbiBmaXJzdCBsaW5lLCBidXQgd2UgZG8gYWxsb3cgcHJlY2VlZGluZyBzcGFjZXMKLQleIHtTfSogIjxcP3htbCIge1N9KyB7aWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9fQotCQotfQkKLQkKLTxTVF9YTUxEZWNsPiAKLXsKLQkidmVyc2lvbiIge0JlZ2luQXR0cmliZVZhbHVlfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFZlcnNpb247fQotCSJlbmNvZGluZyIge0JlZ2luQXR0cmliZVZhbHVlfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7fQotCS8vIG5vdGUgdGhlICJmb3JjZWQgZW5kIiAodmlhICdoYXNNb3JlPWZhbHNlJykgb25jZSB0aGUgZW5kIG9mIFhNTCBEZWNsYXJhdGlvbiBmb3VuZAotCS8vIFRoaXMgaXMgc2luY2Ugbm9uLWFzY2lpIGNoYXJzIG1heSBmb2xsb3cgYW5kIG1heSBjYXVzZSBJT0V4Y2VwdGlvbnMgd2hpY2ggd291bGQgbm90IG9jY3VyIG9uY2Ugc3RyZWFtIGlzIAotCS8vIHJlYWQgd2l0aCBpbmNvcnJlY3QgZW5jb2RpbmcgKHN1Y2ggYXMgaWYgcGxhdGZvcm0gZW5jb2RpbmcgaXMgaW4gZWZmZWN0IHVudGlsIHRydWUgZW5jb2RpbmcgZGV0ZWN0ZWQpLiAKLQkiXD8+IiAgICB7eXliZWdpbihZWUlOSVRJQUwpOyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7fQotfQkKLQotCQotCi08UXVvdGVkQXR0cmlidXRlVmFsdWU+Ci17Ci0JXCIgICAgICAgICAgICAgICAgICAgICAgeyB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLQlcJwkJCXsgeXliZWdpbihTUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9Ci0JLy8gaW4gdGhpcyBzdGF0ZSwgYW55dGhpbmcgb3RoZXIgdGhhbiBhIHNwYWNlIGNoYXJhY3RlciBjYW4gc3RhcnQgYW4gdW5kZWxpbWl0ZWQgc3RyaW5nCi0Je1N9Ki4gICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7fQotCi19CQotCi0KLTxEUV9TVFJJTkc+Ci17Ci0KLQlcIiAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7IH0KLSAgCXtMaW5lVGVybWluYXRvcn0gICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSJcPz4iCQkJeyB5eXB1c2hiYWNrKDIpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSc8JwkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCS4JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0KLQotCi19Ci0KLTxTUV9TVFJJTkc+Ci17Ci0KLQlcJyAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7fQotICAJe0xpbmVUZXJtaW5hdG9yfSAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIiU+IgkJCXsgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSc8JwkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCS4JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0KLQotCi19Ci0KLTxVbkRlbGltaXRlZFN0cmluZz4KLXsKLQotCXtTfSAgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7IH0KLSAgCXtMaW5lVGVybWluYXRvcn0gICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSJcPz4iCQkJeyB5eXB1c2hiYWNrKDIpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JJzwnCQotCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCS8vIHRoZXNlIGFyZSBhIGJpdCBzcGVjaWFsLCBzaW5jZSB3ZSBzdGFydGVkIGFuIHVuZGVsaW1pdCBzdHJpbmcsIGJ1dCBmb3VuZCBhIHF1b3RlIC4uLiBwcm9iYWJseSBpbmRpY2F0ZXMgYSBtaXNzaW5nIGJlZ2lubmluZyBxdW90ZQotCVwnCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9Ci0JCi0JXCIJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlO30KLQkKLQkuCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9Ci0KLX0KLQotLy8gVGhlICJtYXRjaCBhbnl0aGluZyIgcnVsZSBzaG91bGQgYWx3YXlzIGJlIGluIGVmZmVjdCBleGNlcHQgZm9yIHdoZW4gbG9va2luZyBmb3IgZW5kIG9mIHN0cmluZwotLy8gKFRoYXQgaXMsIHJlbWVtYmVyIHRvIHVwZGF0ZSBzdGF0ZSBsaXN0IGlmL3doZW4gbmV3IHN0YXRlcyBhZGRlZCkKLTxZWUlOSVRJQUwsIFNUX1hNTERlY2wsIFF1b3RlZEF0dHJpYnV0ZVZhbHVlPgotewotLy8gdGhpcyBpcyB0aGUgZmFsbGJhY2sgKG1hdGNoICJhbnl0aGluZyIpIHJ1bGUgIChmb3IgdGhpcyBzY2FubmVyLCBpbnB1dCBpcyBpZ25vcmVkLCBhbmQgcG9zaXRpb24gYWR2YW5jZWQsIGlmIG5vdCByZWNvZ25pemVkKQotLnxcbiAgICAgICAgICAgICAge2lmICh5eWNoYXIgPiBNQVhfVE9fU0NBTikge2hhc01vcmU9ZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5NQVhfQ0hBUlNfUkVBQ0hFRDt9fQotfQotCi0vLyB0aGlzIHJ1bGUgYWx3YXlzIGluIGVmZmVjdAotPDxFT0Y+PiAgICAgICAgIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7fQotCi0JClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGROYW1lcy54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9EZXZUaW1lU3VwcG9ydC9idWlsZE5hbWVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5NzU2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9EZXZUaW1lU3VwcG9ydC9idWlsZE5hbWVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJ0b2tlbml6ZXIiIGRlZmF1bHQ9IlhNTDEwTmFtZXMiPgotCQotCTwhLS0gTm90ZTogZm9yIEVjbGlwc2UgZW52LiwgdGhlIEpGbGV4IDEuNCBqYXIgc2hvdWxkIGJlIGFkZGVkIAotCXRvIHRoZSBhbnQgZ2xvYmFsIGVudHJpZXMgIC0tPgotCTx0YXNrZGVmIGNsYXNzbmFtZT0iSkZsZXguYW50dGFzay5KRmxleFRhc2siIG5hbWU9ImpmbGV4IiAvPgotCQkKLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmZpbGUiIHZhbHVlPSJYTUwxME5hbWVzLmpGbGV4Ii8+CQkJCi0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0iSGVhZFBhcnNlcnMiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiB2YWx1ZT0iLi4vc3JjIi8+Ci0JCTwhLS0gdG91Y2ggY2F1c2VzIHRvIGFsd2F5cyBidWlsZCwgcmVtb3ZlIGZvciByZWFsICdtYWtlJyBiZWhhdmlvciAtLT4KLQkJPHRvdWNoIGZpbGU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0iLz4KLQkJCQkJCi0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9IlhNTDEwTmFtZXMiIGRlcGVuZHM9ImluaXQiPgotCQk8YW50Y2FsbCB0YXJnZXQ9InJ1bi1qZmxleCIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJydW4tamZsZXgiIGRlcGVuZHM9ImluaXQiPgotCQk8amZsZXgKLQkgICAgCWZpbGU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0iCi0JICAgIAlkZXN0ZGlyPSIke2Rlc3QuZGlyfSIKLQkJCXZlcmJvc2U9InRydWUiCi0JCQlub2Jhaz0idHJ1ZSIKLQkJCXRpbWU9Im9uIgotCSAgICAvPgotCTwvdGFyZ2V0PgotCQotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGRQYXJzZXIueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGRQYXJzZXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTYxOWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L2J1aWxkUGFyc2VyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJ0b2tlbml6ZXIiIGRlZmF1bHQ9IkhlYWRUb2tlbml6ZXIiPgotCQotCTwhLS0gTm90ZTogZm9yIEVjbGlwc2UgZW52LiwgdGhlIEpGbGV4IDEuNCBqYXIgc2hvdWxkIGJlIGFkZGVkIAotCXRvIHRoZSBhbnQgZ2xvYmFsIGVudHJpZXMgIC0tPgotCTx0YXNrZGVmIGNsYXNzbmFtZT0iSkZsZXguYW50dGFzay5KRmxleFRhc2siIG5hbWU9ImpmbGV4IiAvPgotCQkKLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmZpbGUiIHZhbHVlPSJYTUxIZWFkVG9rZW5pemVyLmpGbGV4Ii8+CQkJCi0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0iSGVhZFBhcnNlcnMiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiB2YWx1ZT0iLi4vc3JjIi8+Ci0JCTwhLS0gdG91Y2ggY2F1c2VzIHRvIGFsd2F5cyBidWlsZCwgcmVtb3ZlIGZvciByZWFsICdtYWtlJyBiZWhhdmlvciAtLT4KLQkJPHRvdWNoIGZpbGU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0iLz4KLQkJCQkJCi0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9IkhlYWRUb2tlbml6ZXIiIGRlcGVuZHM9ImluaXQiPgotCQk8YW50Y2FsbCB0YXJnZXQ9InJ1bi1qZmxleCIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJydW4tamZsZXgiIGRlcGVuZHM9ImluaXQiPgotCQk8amZsZXgKLQkgICAgCWZpbGU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0iCi0JICAgIAlkZXN0ZGlyPSIke2Rlc3QuZGlyfSIKLQkJCXZlcmJvc2U9InRydWUiCi0JCQlub2Jhaz0idHJ1ZSIKLQkJCXRpbWU9Im9uIgotCSAgICAvPgotCTwvdGFyZ2V0PgotCQotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUyZmQ1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4zMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaW1wbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuZmFjdG9yeTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5tb2RlbHF1ZXJ5aW1wbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW1mMnhtbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmZvcm1hdHRlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvcGFnYXRlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9uczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guaW1wbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLm1hdGNoaW5nO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gucXVpY2tzY2FuO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50YXNrczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmxvZ2dpbmc7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQKLVJlcXVpcmUtQnVuZGxlOiBvcmcuYXBhY2hlLnhlcmNlcztidW5kbGUtdmVyc2lvbj0iWzIuOS4wLDMuMC4wKSI7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDEsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMTAwLDMuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5lZGl0O2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4xMDQsMS4yLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMS4yLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMTAxLDEuMi4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjguMSw0LjAuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eTsgZXhjbHVkZTo9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZSIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvUkVBRE1FLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYTY0NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRIZSBYTUwgc3BlY2lmaWMgbW9kZWwgaW1wbGVtZW50YXRpb24uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OWEyZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLwotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIERldlRpbWVTdXBwb3J0Lwotc291cmNlLi4gPSBzcmMtY2F0YWxvZyxcCi0gICAgICAgICAgIHNyYy1jb250ZW50bW9kZWwvLFwKLSAgICAgICAgICAgc3JjLXZhbGlkYXRpb24vLFwKLSAgICAgICAgICAgc3JjLyxcCi0gICAgICAgICAgIHNyYy1lbWZNb2RlbFN5bmNoLyxcCi0gICAgICAgICAgIHNyYy1zZWFyY2gvCi0KLW91dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvY29tcG9uZW50LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNjFlYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLndzdC54bWwiPgotCTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlciIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vZWNsaXBzZS5vcmcvd2VidG9vbHMvd3N0L2NvbXBvbmVudHMveG1sL292ZXJ2aWV3Lmh0bWwiIC8+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aSIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTCIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MucHJvcGVydGllcyIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IlhNTFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcCIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLnNvdXJjZSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS5zb3VyY2UiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuYXBhY2hlLnhlcmNlcyIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotPC9jb21wb25lbnQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTU0NDkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1TdHJ1Y3R1cmVkIFNvdXJjZSBYTUwgTW9kZWwKLVN0cnVjdHVyZWRfWE1MX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWU9U3RydWN0dXJlZCBYTUwgRG9jdW1lbnQgRmFjdG9yeSBFeHRlbnNpb24KLVhNTF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1YTUwgKElsbGZvcm1lZCkKLSMgY29udGVudG1vZGVsIHN0cmluZ3MKLUNvbnRlbnRfTW9kZWxfRG9jdW1lbnRfRmFjdG9yaWVzX0V4dGVuc2lvbi5uYW1lPUNvbnRlbnQgTW9kZWwgRG9jdW1lbnQgRmFjdG9yaWVzCi1Db250ZW50X01vZGVsX0Fubm90YXRpb25fRmlsZXNfRXh0ZW5zaW9uLm5hbWU9Q29udGVudCBNb2RlbCBBbm5vdGF0aW9uIEZpbGVzCi1Nb2RlbF9RdWVyeV9FeHRlbnNpb24ubmFtZT1Nb2RlbCBRdWVyeSBFeHRlbnNpb24KLVhNTF9DYXRhbG9nX0NvbnRyaWJ1dGlvbnNfRXh0ZW5zaW9uX1BvaW50Lm5hbWU9WE1MIENhdGFsb2cgQ29udHJpYnV0aW9ucyBFeHRlbnNpb24gUG9pbnQKLVhTTF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1YU0wKLVhNSV9Db250ZW50X1R5cGU9WE1JCi1YTUxfVmFsaWRhdG9yLm5hbWU9WE1MIFZhbGlkYXRvcgotWE1MX1ZhbGlkYXRpb25fRXJyb3JfQ3VzdG9taXplci5uYW1lPVhNTCBWYWxpZGF0b3IgRXJyb3IgQ3VzdG9taXplciBFeHRlbnNpb24gUG9pbnQKLV92YWxpZGF0aW9uTWFya2VyLm5hbWU9WE1MIFByb2JsZW0KLV90YXNrTWFya2VyLm5hbWU9WE1MIFRhc2sKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGViYWE2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8IS0tIEFuIGV4dGVuc2lvbiBmb3IgY29udHJpYnV0aW5nIGEgWE1MIHZhbGlkYXRpb24gZXJyb3IgY3VzdG9taXplci4gLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJlcnJvckN1c3RvbWl6ZXIiIG5hbWU9IiVYTUxfVmFsaWRhdGlvbl9FcnJvcl9DdXN0b21pemVyLm5hbWUiIHNjaGVtYT0ic2NoZW1hL2Vycm9yQ3VzdG9taXplci5leHNkIi8+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxIYW5kbGVyIj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJZGVmYXVsdD0idHJ1ZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvclhNTCIKLQkJCWFzc29jaWF0ZWRDb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIiPgotCQk8L21vZGVsSGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxIYW5kbGVyIj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJZGVmYXVsdD0idHJ1ZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvclhNTCIKLQkJCWFzc29jaWF0ZWRDb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIyIj4KLQkJPC9tb2RlbEhhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmVtYmVkZGVkVHlwZUhhbmRsZXIiPgotCQk8ZW1iZWRkZWRUeXBlSGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRYTUwiPgotCQk8L2VtYmVkZGVkVHlwZUhhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGFza3NjYW5uZXIiPgotCQk8c2Nhbm5lcgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50YXNrcy5YTUxGaWxlVGFza1NjYW5uZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRhc2tzLlhNTEZpbGVUYXNrU2Nhbm5lcjpvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGFza01hcmtlciIKLQkJCWNvbnRlbnRUeXBlSWRzPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJaWQ9InRhc2tNYXJrZXIiCi0JCW5hbWU9IiVfdGFza01hcmtlci5uYW1lIgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyI+Ci0JCTxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy50YXNrbWFya2VyIi8+Ci0JCTxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+Ci0JPC9leHRlbnNpb24+Ci0JIAotICAgPCEtLSBIZXJlIHdlIGRlZmluZSBhIG5ldyBleHRlbnNpb24gcG9pbnQuICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkCi0gICAgICAgIHRvIHByb2dyYW1tYXRpY2FsbHkgY29udHJpYnV0ZSBjYXRhbG9nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nLiAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImNhdGFsb2dDb250cmlidXRpb25zIiBuYW1lPSIlWE1MX0NhdGFsb2dfQ29udHJpYnV0aW9uc19FeHRlbnNpb25fUG9pbnQubmFtZSIgc2NoZW1hPSJzY2hlbWEvY2F0YWxvZ0NvbnRyaWJ1dGlvbnMuZXhzZCIvPgotCi0gICA8IS0tIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGV4dGVuZHMgdGhlIENvbW1vbiBFeHRlbnNiaWxlIFVSSSBSZXNvbHZlciBzbyB0aGF0Ci0gICAgICAgIHRoZSBYTUwgQ2F0YWxvZyBjYW4gcGFydGljaXBhcmUgaW4gcmVzb2x2aW5nIHByb2Nlc3Nlcy4gLS0+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLnJlc29sdmVyRXh0ZW5zaW9ucyI+Ci0gICAgICA8cmVzb2x2ZXJFeHRlbnNpb24KLSAgICAgICAgICAgIHN0YWdlPSJwb3N0bm9ybWFsaXphdGlvbiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5YTUxDYXRhbG9nVVJJUmVzb2x2ZXJFeHRlbnNpb24iPgotICAgICAgPC9yZXNvbHZlckV4dGVuc2lvbj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5kb2N1bWVudENyZWF0aW9uIgotCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50ZmFjdG9yaWVzIgotCQluYW1lPSIlU3RydWN0dXJlZF9YTUxfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZSI+Ci0JCTxmYWN0b3J5Ci0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5maWxlYnVmZmVycy5CYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5kb2N1bWVudENyZWF0aW9uIgotCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50ZmFjdG9yaWVzMiIKLQkJbmFtZT0iJVN0cnVjdHVyZWRfWE1MX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5maWxlVHlwZXMiPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJ4c2wiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0ieHNsdCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJkYWR4Ij4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249IndzZGwiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0ibnN0Ij4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249InhtaSI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJ4c2QiPgotCQk8L2ZpbGVUeXBlcz4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0UHJvY2Vzc29ycyI+Ci0JCTxwcm9jZXNzb3IKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLlhNTEZvcm1hdHRlckZvcm1hdFByb2Nlc3NvciIKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiPgotCQk8L3Byb2Nlc3Nvcj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDMwODMgLS0+XAotCTwhLS0gIEZZSTogdGhpcyB4bWkgdHlwZSAqc2hvdWxkKiBiZSBkZWZpbmVkIGluIEVNRiwgYnV0LCBzaW5jZSBpc24ndAotCQkJd2Ugd2lsbCBoZXJlLiBJbiBmdXR1cmUgdmVyc2lvbnMgaXMgY291bGQgYmUgcmVtb3ZlZCAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJ4bWkiCi0JCQlwcmlvcml0eT0ibG93IgotCQkJbmFtZT0iJVhNSV9Db250ZW50X1R5cGUiCi0JCQlpZD0ieG1pc291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIj4KLQkJPC9jb250ZW50LXR5cGU+Ci0KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJ4bWwseHNsLHhzbHQsd3NkbCx4c2QsZXhzZCx4bWkiCi0JCQlwcmlvcml0eT0ibG93IgotCQkJbmFtZT0iJVhNTF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWlkPSJ4bWxzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS50ZXh0IgotCQkJZGVmYXVsdC1jaGFyc2V0PSJVVEYtOCI+Ci0JCQk8ZGVzY3JpYmVyIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuQ29udGVudERlc2NyaWJlckZvclhNTCIgLz4KLQkJPC9jb250ZW50LXR5cGU+Ci0KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJ4c2wseHNsdCIKLQkJCXByaW9yaXR5PSJoaWdoIgotCQkJbmFtZT0iJVhTTF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWlkPSJ4c2xzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0JCQlkZWZhdWx0LWNoYXJzZXQ9IlVURi04Ij4KLQkJPC9jb250ZW50LXR5cGU+Ci0JPC9leHRlbnNpb24+Ci0KLQotCTwhLS0gaW5pdGlhbGl6ZSB4bWwgY29yZSBwcmVmZXJlbmNlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbi1wb2ludCBpZD0iZG9jdW1lbnRGYWN0b3JpZXMiIG5hbWU9IiVDb250ZW50X01vZGVsX0RvY3VtZW50X0ZhY3Rvcmllc19FeHRlbnNpb24ubmFtZSIgc2NoZW1hPSJzY2hlbWEvZG9jdW1lbnRGYWN0b3JpZXMuZXhzZCIvPgotCi0JPGV4dGVuc2lvbi1wb2ludCBpZD0ibW9kZWxRdWVyeUV4dGVuc2lvbnMiIG5hbWU9IiVNb2RlbF9RdWVyeV9FeHRlbnNpb24ubmFtZSIgc2NoZW1hPSJzY2hlbWEvbW9kZWxRdWVyeUV4dGVuc2lvbnMuZXhzZCIvPgotCi0JPGV4dGVuc2lvbi1wb2ludCBpZD0iYW5ub3RhdGlvbkZpbGVzIiBuYW1lPSIlQ29udGVudF9Nb2RlbF9Bbm5vdGF0aW9uX0ZpbGVzX0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9hbm5vdGF0aW9uRmlsZXMuZXhzZCIvPgkKLQkJCi0JPGV4dGVuc2lvbiAKLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLnV0aWwudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgotICAgICAgIDx1aUNvbnRleHRTZW5zaXRpdmVDbGFzcwotICAgICAgICAgICAgY29udGV4dD0iVUkiCi0gICAgICAgICAgICBrZXk9InJlbmRlcmVyRmFjdG9yeSIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmVtZjJ4bWwuRU1GMkRPTVNTRVJlbmRlcmVyRmFjdG9yeSI+Ci0gICAgICAgPC91aUNvbnRleHRTZW5zaXRpdmVDbGFzcz4KLSAgPC9leHRlbnNpb24+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gUmVnaXN0ZXIgdGhlIFhNTCB2YWxpZGF0b3Igd2l0aCB0aGUgdmFsaWRhdGlvbiAJCS0tPgotCTwhLS0gZnJhbWV3b3JrLiAJCQkJCQkJCQkJICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gPGV4dGVuc2lvbgotICAgICAgICAgaWQ9InZhbGlkYXRpb25NYXJrZXIiCi0gICAgICAgICBuYW1lPSIlX3ZhbGlkYXRpb25NYXJrZXIubmFtZSIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KLSAgICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5wcm9ibGVtbWFya2VyIi8+Ci0gICAgICA8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgotIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIGlkPSJ4bWwiIG5hbWU9IiVYTUxfVmFsaWRhdG9yLm5hbWUiIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JWMiI+Ci0gICAgICA8dmFsaWRhdG9yCi0gICAgICAgICAgICBidWlsZD0idHJ1ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlZhbGlkYXRvciIKLSAgICAgICAgICAgIG1hbnVhbD0idHJ1ZSIKLSAgICAgICAgICAgIHNvdXJjZWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhNTCIKLSAgICAgICAgICAgIHZlcnNpb249IjMiCi0gICAgICAgICAgICBtYXJrZXJJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnZhbGlkYXRpb25NYXJrZXIiPgotICAgICAgICAgPGluY2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0gICAgICAgICAgICAgICA8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiPjwvY29udGVudFR5cGU+Ci0gICAgICAgICAgICAgICA8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiPjwvY29udGVudFR5cGU+Ci0gICAgICAgICAgICAgICA8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54c2xzb3VyY2UiPjwvY29udGVudFR5cGU+Ci0gICAgICAgICAgICAgICA8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50bGRzb3VyY2UiPjwvY29udGVudFR5cGU+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9InhtbCI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9ImdwaCI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICAgICA8ZmlsZWV4dAotICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICBleHQ9Indkby1jb25uZWN0aW9ucyI+Ci0gICAgICAgICAgICAgICA8L2ZpbGVleHQ+Ci0gICAgICAgICAgICA8L3J1bGVzPgotICAgICAgICAgPC9pbmNsdWRlPgotICAgICAgICAgPGV4Y2x1ZGU+Ci0gICAgICAgICAgICA8cnVsZXM+Ci0JCQkJPHByb2plY3ROYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJOYXR1cmUiLz4KLQkJCQk8cHJvamVjdE5hdHVyZSBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuRUFSTmF0dXJlIi8+Ci0gICAgCQkJPGZpbGUgY2FzZVNlbnNpdGl2ZT0idHJ1ZSIgbmFtZT0iLnByb2plY3QiIHR5cGU9ImZpbGUiLz4KLSAgICAJCQk8ZmlsZSBjYXNlU2Vuc2l0aXZlPSJ0cnVlIiBuYW1lPSIuY2xhc3NwYXRoIiB0eXBlPSJmaWxlIi8+Ci0gICAgCQkJPGZpbGUgY2FzZVNlbnNpdGl2ZT0idHJ1ZSIgbmFtZT0iLnNldHRpbmdzIiAgdHlwZT0iZm9sZGVyIi8+Ci0gICAgICAgICAgICA8L3J1bGVzPgotICAgICAgICAgPC9leGNsdWRlPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc2NoZW1hL2Fubm90YXRpb25GaWxlcy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc2NoZW1hL2Fubm90YXRpb25GaWxlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDE3ZjU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uRmlsZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSIgaWQ9ImFubm90YXRpb25GaWxlcyIgbmFtZT0iQ29udGVudCBNb2RlbCBBbm5vdGF0aW9uIEZpbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhbm5vdGF0aW9uRmlsZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uRmlsZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InB1YmxpY0lkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvY2F0YWxvZ0NvbnRyaWJ1dGlvbnMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9jYXRhbG9nQ29udHJpYnV0aW9ucy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2JhZDFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9jYXRhbG9nQ29udHJpYnV0aW9ucy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIiBpZD0iY2F0YWxvZ0NvbnRyaWJ1dGlvbnMiIG5hbWU9IlhNTCBDYXRhbG9nIENvbnRyaWJ1dGlvbnMgRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyB0byBzcGVjaWZ5IGVudHJpZXMgZm9yIFhNTCBDYXRhbG9nLiAgQ2F0YWxvZyBlbnRyaWVzIGhhdmUgZm9ybWF0IHNwZWNpZmllZCBpbiAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9kb3dubG9hZC5waHAvMTQwNDEveG1sLWNhdGFsb2dzLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2VudGl0eS9zcGVjLmh0bWwmbHQ7L2EmZ3Q7LiAgCi1FYWNoIGNhdGFsb2cgZXh0ZW5zaW9uIGNvbnNpc3RzIG9mIGEgc2luZ2xlIGNhdGFsb2dDb250cmlidXRpb24gZWxlbWVudC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNhdGFsb2dDb250cmlidXRpb24iLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjYXRhbG9nQ29udHJpYnV0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgY2F0YWxvZ0NvbnRyaWJ1dGlvbiBlbGVtZW50IG1heSBoYXZlIGlkLCBhbmQgaXQgaXMganVzdCBhIGNvbnRhaW5lciBmb3IgdGhlIGNvbnRyaWJ1dGVkIGNhdGFsb2cgZW50cmllcy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHVibGljIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InN5c3RlbSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ1cmkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibmV4dENhdGFsb2ciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIElkIG9mIHRoZSBjYXRhbG9nIHRvIHdoaWNoIGVudHJpZXMgd2lsbCBiZSBhZGRlZC4gQ291bGQgYmUgJnF1b3Q7ZGVmYXVsdCZxdW90OywgYW5kIGlmIG9tbWl0ZWQsIGVudHJpZXMgYXJlIGFkZGVkIHRvIHRoZSBkZWZhdWx0IHdvcmtzcGFjZSBjYXRhbG9nLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwdWJsaWMiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSBwdWJsaWMgZWxlbWVudCBhc3NvY2lhdGVzIGEgVVJJIHJlZmVyZW5jZSB3aXRoIHRoZSBwdWJsaWMgaWRlbnRpdGllciBwb3J0aW9uIG9mIGFuIGV4dGVybmFsIGlkZW50aWZpZXIuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJZCBvZiB0aGUgZWxlbWVudCwgb3B0aW9uYWwuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHVibGljSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHB1YmxpYyBpZGVudGlmaWVyIHBvcnRpb24gb2YgYW4gZXh0ZXJuYWwgaWRlbnRpZmllci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSB1cmkgYXR0cmlidXRlIGNvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4ueG1sIGZpbGUsIHVzZSBwbGF0Zm9ybTovIG9yIGZpbGU6LyBwcm90b2NvbHMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9IndlYlVSTCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbHRlcm5hdGl2ZSBXZWIgYWRkcmVzcyBmb3IgdGhlIHB1YmxpYyBJRAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzeXN0ZW0iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSBzeXN0ZW0gZWxlbWVudHMgYXNzb2NpYXRlcyBhIFVSSSByZWZlcmVuY2Ugd2l0aCB0aGUgc3lzdGVtIGlkZW50aWZpZXIgb2YgYW4gZXh0ZXJuYWwgaWRlbnRpZmllcgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSWQgb2YgdGhlIGVsZW1lbnQsIG9wdGlvbmFsLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN5c3RlbUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBzeXN0ZW0gaWRlbnRpZmllciBwb3J0aW9uIG9mIGFuIGV4dGVybmFsIGlkZW50aWZpZXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJpIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgdXJpIGF0dHJpYnV0ZSBjb3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgcGx1Z2luLnhtbCBmaWxlLCB1c2UgcGxhdGZvcm06LyBvciBmaWxlOi8gcHJvdG9jb2xzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0icmVzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idXJpIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgdXJpIGVsZW1lbnQgYXNzb2NpYXRlcyBhIFVSSSByZWZlcmVuY2Ugd2l0aCB0aGUgYSBVUkkgcmVmZXJlbmNlIHRoYXQgaXMgbm90IHBhcnQgb2YgYW4gZXh0ZXJuYWwgaWRlbnRpZmllci4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIElkIG9mIHRoZSBlbGVtZW50LCBvcHRpb25hbC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSB1cmkgYXR0cmlidXRlIGNvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4ueG1sIGZpbGUsIHVzZSBwbGF0Zm9ybTovIG9yIGZpbGU6LyBwcm90b2NvbHMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBVUkkgcmVmZXJlbmNlIHRoYXQgaXMgbm90IHBhcnQgb2YgYW4gZXh0ZXJuYWwgaWRlbnRpdGllci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibmV4dENhdGFsb2ciPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoZSBuZXh0Q2F0YWxvZyBlbGVtZW50cyBpbmRpY2F0ZSBhZGRpdGlvbmFsIGNhdGFsb2cgZW50cnkgZmlsZShzKSB0byBiZSBjb25zaWRlcmVkIGR1cmluZyB0aGUgcHJvY2VzcyBvZiByZXNvbHV0aW9uLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJZCBvZiB0aGUgZWxlbWVudCwgb3B0aW9uYWwuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIHVyaSBhdHRyaWJ1dGUgY291bGQgYmUgcmVsYXRpdmUgdG8gdGhlIHBsdWdpbi54bWwgZmlsZSwgdXNlIHBsYXRmb3JtOi8gb3IgZmlsZTovIHByb3RvY29scy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiAKLSAgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jYXRhbG9nQ29udHJpYnV0aW9ucyZxdW90OyZndDsKLSAgICAgICZsdDtjYXRhbG9nQ29udHJpYnV0aW9uJmd0OyAKLSAgICAgICAgICZsdDtzeXN0ZW0gCi0gICAgICAgICAgICAgICBzeXN0ZW1JZD0mcXVvdDtodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyZxdW90OwotICAgICAgICAgICAgICAgdXJpPSZxdW90O2RhdGEveHNkL3dzZGwueG1sJnF1b3Q7ICZndDsgCi0gICAgICAgICAgICAmbHQ7cHJvcGVydHkgCi0gICAgICAgICAgICAgICAgICBuYW1lPSZxdW90O3dlYlVSTCZxdW90OwotICAgICAgICAgICAgICAgICAgdmFsdWU9JnF1b3Q7aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8mcXVvdDsvJmd0OwotICAgICAgICAgJmx0Oy9zeXN0ZW0mZ3Q7Ci0gICAgICAgICAmbHQ7dXJpCi0gICAgICAgICAgICAgICBuYW1lPSZxdW90O2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8mcXVvdDsgCi0gICAgICAgICAgICAgICB1cmk9JnF1b3Q7ZGF0YS94c2Qvc29hcC54c2QmcXVvdDsvJmd0OyAKLSAgICAgICAgICZsdDtwdWJsaWMKLSAgICAgICAgICAgICAgIHB1YmxpY0lkPSZxdW90O2h0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSZxdW90OwotICAgICAgICAgICAgICAgdXJpPSZxdW90O2RhdGEveHNkL1hTTFNjaGVtYS54c2QmcXVvdDsmZ3Q7Ci0gICAgICAgICAmbHQ7L3B1YmxpYyZndDsKLSAgICAgICAgICZsdDtuZXh0Q2F0YWxvZwotICAgICAgICAgICAgICAgaWQ9JnF1b3Q7bmVzdGVkQ2F0YWxvZyZxdW90OyAKLSAgICAgICAgICAgICAgIGNhdGFsb2c9JnF1b3Q7ZGF0YS9jYXRhbG9nMS54bWwmcXVvdDsvJmd0OyAKLSAgICAgICZsdDsvY2F0YWxvZ0NvbnRyaWJ1dGlvbiZndDsgCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc2NoZW1hL2RvY3VtZW50RmFjdG9yaWVzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvZG9jdW1lbnRGYWN0b3JpZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQwZDkwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvZG9jdW1lbnRGYWN0b3JpZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSIgaWQ9ImRvY3VtZW50RmFjdG9yaWVzIiBuYW1lPSJDb250ZW50IE1vZGVsIERvY3VtZW50IEZhY3RvcmllcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjdG9yeSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmFjdG9yeSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9lcnJvckN1c3RvbWl6ZXIuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9lcnJvckN1c3RvbWl6ZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA4ZjE5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvZXJyb3JDdXN0b21pemVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiIGlkPSJlcnJvckN1c3RvbWl6ZXIiIG5hbWU9IlhNTCBWYWxpZGF0aW9uIEVycm9yIEN1c3RvbWl6ZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGVycm9yIGN1c3RvbWl6ZXIgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhIGNsaWVudCB0byBjb250cmlidXRlIGFuIGVycm9yIGN1c3RvbWl6ZXIgZm9yIGEgc3BlY2lmaWMgbmFtZXNwYWNlLiBUaGUgZXJyb3IgY3VzdG9taXplciBjYW4gcHJvdmlkZSBlcnJvciBtZXNzYWdlcyB0aGF0IGFyZSBtb3JlIGRvbWFpbiBzcGVjaWZpYyB0aGFuIHRoZSBnZW5lcmljIGVycm9yIG1lc3NhZ2VzIHByb3ZpZGVkIGJ5IHRoZSB1bmRlcmx5aW5nIGdlbmVyaWMgWE1MIHZhbGlkYXRvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZXJyb3JDdXN0b21pemVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJlcnJvckN1c3RvbWl6ZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIG5hbWVzcGFjZSBmb3Igd2hpY2ggdGhpcyBlcnJvciBjdXN0b21pemVyIHdpbGwgY29uc2lkZXIgZXJyb3IgY3VzdG9taXphdGlvbnMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb24uSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXImbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIEVycm9yIEN1c3RvbWl6ZXIgY29udHJpYnV0aW9uOgotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIGlkPSZxdW90O3NhbXBsZUVycm9yQ3VzdG9taXplciZxdW90OwotICAgICAgICAgbmFtZT0mcXVvdDtTYW1wbGUgRXJyb3IgQ3VzdG9taXplciZxdW90OwotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmVycm9yQ3VzdG9taXplciZxdW90OyZndDsKLSAgICAgICZsdDtlcnJvckN1c3RvbWl6ZXIKLSAgICAgICAgICAgIG5hbWVzcGFjZT0mcXVvdDtodHRwOi8vc2FtcGxlLm5hbWVzcGFjZSZxdW90OwotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLlNhbXBsZUVycm9yQ3VzdG9taXplciZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBzdXBwbGllZCBjbGFzcyBtdXN0IGltcGxlbWVudCAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb24uSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXImbHQ7L2NvZGUmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc2NoZW1hL21vZGVsUXVlcnlFeHRlbnNpb25zLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvbW9kZWxRdWVyeUV4dGVuc2lvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNkZGYwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvbW9kZWxRdWVyeUV4dGVuc2lvbnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSIgaWQ9Im1vZGVsUXVlcnlFeHRlbnNpb25zIiBuYW1lPSJNb2RlbCBRdWVyeSBFeHRlbnNpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1vZGVsUXVlcnlFeHRlbnNpb24iLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1vZGVsUXVlcnlFeHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZW50VHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDcxMzgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLXB1YmxpYyBjbGFzcyBDYXRhbG9nIGltcGxlbWVudHMgSUNhdGFsb2cKLXsKLQotCWNsYXNzIENhdGFsb2dMUwotCXsKLQkJcHVibGljIHZvaWQgbG9hZCgpCi0JCXsKLQkJfQotCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzYXZlKCkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJbmV3IENhdGFsb2dXcml0ZXIoKS53cml0ZShDYXRhbG9nLnRoaXMsIGxvY2F0aW9uKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQkJewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBEZWZhdWx0Q2F0YWxvZ0xTIGV4dGVuZHMgQ2F0YWxvZ0xTCi0JewotCQlwdWJsaWMgdm9pZCBsb2FkKCkKLQkJewotCQkJTmV4dENhdGFsb2cgdXNlckNhdGFsb2dSZWZlcmVuY2UgPSBuZXcgTmV4dENhdGFsb2coKTsKLQkJCXVzZXJDYXRhbG9nUmVmZXJlbmNlLnNldElkKFhNTENvcmVQbHVnaW4uVVNFUl9DQVRBTE9HX0lEKTsKLQkJCXVzZXJDYXRhbG9nUmVmZXJlbmNlLnNldENhdGFsb2dMb2NhdGlvbihVU0VSX0NBVEFMT0dfRklMRSk7Ci0JCQlhZGRDYXRhbG9nRWxlbWVudCh1c2VyQ2F0YWxvZ1JlZmVyZW5jZSk7Ci0KLQkJCU5leHRDYXRhbG9nIHN5c3RlbUNhdGFsb2dSZWZlcmVuY2UgPSBuZXcgTmV4dENhdGFsb2coKTsKLQkJCXN5c3RlbUNhdGFsb2dSZWZlcmVuY2Uuc2V0SWQoWE1MQ29yZVBsdWdpbi5TWVNURU1fQ0FUQUxPR19JRCk7Ci0JCQlzeXN0ZW1DYXRhbG9nUmVmZXJlbmNlLnNldENhdGFsb2dMb2NhdGlvbihTWVNURU1fQ0FUQUxPR19GSUxFKTsKLQkJCWFkZENhdGFsb2dFbGVtZW50KHN5c3RlbUNhdGFsb2dSZWZlcmVuY2UpOwotCi0JCQkvKgotCQkJICogSGVyZSB3ZSBzYXZlIHRoZSBmaWxlIGluIG9yZGVyIHRvICdyZWZsZWN0JyB0aGUgY2F0YWxvZyB0aGF0Ci0JCQkgKiB3ZSd2ZSBjcmVhdGVkIGZyb20gcGx1Zy1pbiBleHRlbnNpb25zIHRvIGRpc2suIFRoZSAnZGVmYXVsdCcKLQkJCSAqIGNhdGFsb2cgaXMgb25seSBldmVyIHdyaXR0ZW4gdG8gZGlzayBhbmQgbmV2ZXIgcmVhZCBmcm9tIGRpc2suCi0JCQkgKi8KLQkJCXNhdmUoKTsKLQkJfQotCX0KLQotCWNsYXNzIEludGVybmFsUmVzb2x2ZXIKLQl7Ci0JCXByb3RlY3RlZCBNYXAgcHVibGljTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlwcm90ZWN0ZWQgTWFwIHN5c3RlbU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJcHJvdGVjdGVkIE1hcCB1cmlNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCUludGVybmFsUmVzb2x2ZXIoKQotCQl7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBjYXRhbG9nRWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQkJewotCQkJCUlDYXRhbG9nRWxlbWVudCBjYXRhbG9nRWxlbWVudCA9IChJQ2F0YWxvZ0VsZW1lbnQpIGkubmV4dCgpOwotCQkJCWlmIChjYXRhbG9nRWxlbWVudC5nZXRUeXBlKCkgPT0gSUNhdGFsb2dFbGVtZW50LlRZUEVfRU5UUlkpCi0JCQkJewotCQkJCQlJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gKElDYXRhbG9nRW50cnkpIGNhdGFsb2dFbGVtZW50OwotCQkJCQlNYXAgbWFwID0gZ2V0RW50cnlNYXAoZW50cnkuZ2V0RW50cnlUeXBlKCkpOwotCQkJCQltYXAucHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBNYXAgZ2V0RW50cnlNYXAoaW50IGVudHJ5VHlwZSkKLQkJewotCQkJTWFwIG1hcCA9IHN5c3RlbU1hcDsKLQkJCXN3aXRjaCAoZW50cnlUeXBlKQotCQkJewotCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDOgotCQkJCW1hcCA9IHB1YmxpY01hcDsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1VSSToKLQkJCQltYXAgPSB1cmlNYXA7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIG1hcDsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWFwcGVkVVJJKE1hcCBtYXAsIFN0cmluZyBrZXkpCi0JCXsKLQkJCUNhdGFsb2dFbnRyeSBlbnRyeSA9IChDYXRhbG9nRW50cnkpIG1hcC5nZXQoa2V5KTsKLQkJCWlmKGVudHJ5ID09IG51bGwpIHJldHVybiBudWxsOwotCQkJU3RyaW5nIHVyaSA9IGVudHJ5LmdldFVSSSgpOwotCQkJdHJ5Ci0JCQl7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBDUyA6IGRvIHdlIHJlYWxseSB3YW50IHRvIHJlc29sdmUgdGhlc2UgaGVyZT8KLSAgICAgICAgICAgICAgICAvLyBJJ20gZ3Vlc3Npbmcgd2Ugc2hvdWxkIHJldHVybiB0aGUgJ3BsYXRmb3JtOicgZm9ybSBvZiB0aGUgVVJJCi0gICAgICAgICAgICAgICAgLy8gdG8gdGhlIGNhbGxlci4KLSAgICAgICAgICAgICAgICBpZiAodXJpLnN0YXJ0c1dpdGgoInBsYXRmb3JtOiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgeyAgCi0JCQkJICBVUkwgZW50cnlVUkwgPSBuZXcgVVJMKGVudHJ5LmdldEFic29sdXRlUGF0aCh1cmkpKTsgICAgICAgICAgICAgICAgCi0JCQkJICB1cmkgPSBQbGF0Zm9ybS5yZXNvbHZlKGVudHJ5VVJMKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGVuc3VyZSBVUkkncyBhcmUgb2YgZm9ybSAiZmlsZTovLy9EOi9YWFgiIGFuZCBOT1QgIAotICAgICAgICAgICAgICAgICAgLy8gImZpbGU6RDovWFhYIi4gIE90aGVyd2lzZSB0aGUgRU1GIFVSSSBjbGFzcyBnZXRzIGNvbmZ1c2VkCi0gICAgICAgICAgICAgICAgICAvLyAoc2VlIGJ1ZyAxMDM2MDcpIAotICAgICAgICAgICAgICAgICAgU3RyaW5nIEZJTEVfU0NIRU1FID0gImZpbGU6IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgaWYgKHVyaS5zdGFydHNXaXRoKEZJTEVfU0NIRU1FKSAmJiAhdXJpLnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUUgKyAiLyIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHVyaSA9IEZJTEVfU0NIRU1FICsgIi8vLyIgKyB1cmkuc3Vic3RyaW5nKEZJTEVfU0NIRU1FLmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIHVyaTsgCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQkJewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIFN0cmluZyByZXNvbHZlUHVibGljKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotCQkJCXRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0JCXsKLQkJCVN0cmluZyByZXN1bHQgPSBnZXRNYXBwZWRVUkkocHVibGljTWFwLCBwdWJsaWNJZCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQl7Ci0JCQkJcmVzdWx0ID0gZ2V0TWFwcGVkVVJJKHN5c3RlbU1hcCwgc3lzdGVtSWQpOwotCQkJfQotCQkJLy8gb3VyIGNsaWVudHMgdXNlZCB0byBwYXNzIG5hbWVzcGFjZSBpbiBwbGFjZSBvZiBwdWJsaWMgaWQsIHNvIHdlIG5lZWQgdG8gY2hlY2sgdXJpIG1hcCBmb3IgdGhvc2UKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXsKLQkJCQlyZXN1bHQgPSBnZXRNYXBwZWRVUkkodXJpTWFwLCBwdWJsaWNJZCk7Ci0JCQl9Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQl7Ci0JCQkJcmVzdWx0ID0gcmVzb2x2ZVN1Ym9yZGluYXRlQ2F0YWxvZ3MoCi0JCQkJCQlJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZVN5c3RlbShTdHJpbmcgc3lzdGVtSWQpCi0JCQkJdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLQkJewotCQkJU3RyaW5nIHJlc3VsdCA9IGdldE1hcHBlZFVSSShzeXN0ZW1NYXAsIHN5c3RlbUlkKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXsKLQkJCQlyZXN1bHQgPSByZXNvbHZlU3Vib3JkaW5hdGVDYXRhbG9ncygKLQkJCQkJCUlDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9TWVNURU0sIG51bGwsIHN5c3RlbUlkKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIHVyaSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKLQkJCQlJT0V4Y2VwdGlvbgotCQl7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gZ2V0TWFwcGVkVVJJKHVyaU1hcCwgdXJpKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXsKLQkJCQlyZXN1bHQgPSByZXNvbHZlU3Vib3JkaW5hdGVDYXRhbG9ncygKLQkJCQkJCUlDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkksIG51bGwsIHVyaSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JY2xhc3MgU3lzdGVtQ2F0YWxvZ0xTIGV4dGVuZHMgQ2F0YWxvZ0xTCi0JewotCQlwdWJsaWMgdm9pZCBsb2FkKCkKLQkJewotCQkJbmV3IENhdGFsb2dDb250cmlidXRvclJlZ2lzdHJ5UmVhZGVyKENhdGFsb2cudGhpcykucmVhZFJlZ2lzdHJ5KCk7Ci0KLQkJCS8qCi0JCQkgKiBIZXJlIHdlIHNhdmUgdGhlIGZpbGUgaW4gb3JkZXIgdG8gJ3JlZmxlY3QnIHRoZSBjYXRhbG9nIHRoYXQKLQkJCSAqIHdlJ3ZlIGNyZWF0ZWQgZnJvbSBwbHVnaW4gZXh0ZW5zaW9ucyB0byBkaXNrLiAKLQkJCSAqIFRoZSAnc3lzdGVtJyBjYXRhbG9nIGlzIG9ubHkgZXZlciB3cml0dGVuIHRvIGRpc2sgYW5kIG5ldmVyIHJlYWQgZnJvbSBkaXNrLgotCQkJICovCi0JCQlzYXZlKCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBVc2VyQ2F0YWxvZ0xTIGV4dGVuZHMgQ2F0YWxvZ0xTCi0JewotCQlwdWJsaWMgdm9pZCBsb2FkKCkKLQkJewotCQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJVVJMIHVybCA9IG5ldyBVUkwobG9jYXRpb24pOwotCQkJCWlucHV0U3RyZWFtID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJCQlib29sZWFuIG9sZE5vdGlmaWNhdGlvbkVuYWJsZWQgPSBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJCQlzZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCQljbGVhcigpOwotCQkJCXRyeQotCQkJCXsKLQkJCQkJQ2F0YWxvZ1JlYWRlci5yZWFkKENhdGFsb2cudGhpcywgaW5wdXRTdHJlYW0pOwotCQkJCX0gZmluYWxseQotCQkJCXsKLQkJCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChvbGROb3RpZmljYXRpb25FbmFibGVkKTsKLQkJCQl9Ci0JCQkJbm90aWZ5Q2hhbmdlZCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JCQl7Ci0JCQl9IGZpbmFsbHkKLQkJCXsKLQkJCQlpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCXRyeQotCQkJCQl7Ci0JCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkKLQkJCQkJewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DQVRBTE9HX0ZJTEUgPSAiZGVmYXVsdF9jYXRhbG9nLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9DQVRBTE9HX0ZJTEUgPSAic3lzdGVtX2NhdGFsb2cueG1sIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9DQVRBTE9HX0ZJTEUgPSAidXNlcl9jYXRhbG9nLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBTdHJpbmcgYmFzZTsKLQotCXByb3RlY3RlZCBMaXN0IGNhdGFsb2dFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBDYXRhbG9nTFMgY2F0YWxvZ0xTOwotCi0JcHJvdGVjdGVkIFN0cmluZyBpZDsKLQotCXByb3RlY3RlZCBJbnRlcm5hbFJlc29sdmVyIGludGVybmFsUmVzb2x2ZXI7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvY2F0aW9uOwotCi0JcHJvdGVjdGVkIENhdGFsb2dTZXQgcmVzb3VyY2VTZXQ7Ci0KLQlwdWJsaWMgQ2F0YWxvZyhDYXRhbG9nU2V0IGNhdGFsb2dSZXNvdXJjZVNldCwgU3RyaW5nIGlkLCBTdHJpbmcgbG9jYXRpb24pCi0JewotCQl0aGlzLnJlc291cmNlU2V0ID0gY2F0YWxvZ1Jlc291cmNlU2V0OwotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQotCQlpZiAoWE1MQ29yZVBsdWdpbi5ERUZBVUxUX0NBVEFMT0dfSUQuZXF1YWxzKGlkKSkKLQkJewotCQkJY2F0YWxvZ0xTID0gbmV3IERlZmF1bHRDYXRhbG9nTFMoKTsKLQkJfSBlbHNlIGlmIChYTUxDb3JlUGx1Z2luLlNZU1RFTV9DQVRBTE9HX0lELmVxdWFscyhpZCkpCi0JCXsKLQkJCWNhdGFsb2dMUyA9IG5ldyBTeXN0ZW1DYXRhbG9nTFMoKTsKLQkJfSBlbHNlCi0JCXsKLQkJCWNhdGFsb2dMUyA9IG5ldyBVc2VyQ2F0YWxvZ0xTKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDYXRhbG9nRWxlbWVudChJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCWNhdGFsb2dFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCWVsZW1lbnQuc2V0T3duZXJDYXRhbG9nKHRoaXMpOwotCQlpbnRlcm5hbFJlc29sdmVyID0gbnVsbDsKLQkJbm90aWZ5QWRkRWxlbWVudChlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFbnRyaWVzRnJvbUNhdGFsb2coSUNhdGFsb2cgY2F0YWxvZykKLQl7Ci0JCXRyeQotCQl7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCWlmIChjYXRhbG9nICE9IG51bGwpCi0JCQl7Ci0JCQkJSUNhdGFsb2dFbGVtZW50W10gZW50cmllcyA9ICgoQ2F0YWxvZyljYXRhbG9nKS5nZXRDYXRhbG9nRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspCi0JCQkJewotCQkJCQlDYXRhbG9nRWxlbWVudCBjbG9uZSA9IChDYXRhbG9nRWxlbWVudCkoKENhdGFsb2dFbGVtZW50KWVudHJpZXNbaV0pLmNsb25lKCk7Ci0JCQkJCWFkZENhdGFsb2dFbGVtZW50KGNsb25lKTsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCXsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgImFyZ3VtZW50IHdhcyBudWxsIGluIENhdGFsb2cuYWRkRW50cmllc0Zyb21DYXRhbG9nIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBmaW5hbGx5Ci0JCXsKLQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQkJaW50ZXJuYWxSZXNvbHZlciA9IG51bGw7Ci0JCW5vdGlmeUNoYW5nZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJQ2F0YWxvZ0xpc3RlbmVyIGxpc3RlbmVyKQotCXsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKQotCXsKLQkJY2F0YWxvZ0VsZW1lbnRzLmNsZWFyKCk7Ci0JCWludGVybmFsUmVzb2x2ZXIgPSBudWxsOwotCQlub3RpZnlDaGFuZ2VkKCk7Ci0JfQotCi0JcHVibGljIElDYXRhbG9nRWxlbWVudCBjcmVhdGVDYXRhbG9nRWxlbWVudChpbnQgdHlwZSkKLQl7Ci0JCXN3aXRjaCAodHlwZSkKLQkJewotCQljYXNlIElDYXRhbG9nRWxlbWVudC5UWVBFX0VOVFJZOgotCQkJcmV0dXJuIG5ldyBDYXRhbG9nRW50cnkoKTsKLQkJY2FzZSBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9ORVhUX0NBVEFMT0c6Ci0JCQlyZXR1cm4gbmV3IE5leHRDYXRhbG9nKCk7Ci0JCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQzoKLQkJCXJldHVybiBuZXcgQ2F0YWxvZ0VudHJ5KElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUMpOwotCQljYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9TWVNURU06Ci0JCQlyZXR1cm4gbmV3IENhdGFsb2dFbnRyeShJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfU1lTVEVNKTsKLQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJOgotCQkJcmV0dXJuIG5ldyBDYXRhbG9nRW50cnkoSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1VSSSk7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gbmV3IENhdGFsb2dFbGVtZW50KHR5cGUpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCYXNlKCkKLQl7Ci0JCXJldHVybiBiYXNlOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRDYXRhbG9nRWxlbWVudHMoaW50IHR5cGUpCi0JewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUNhdGFsb2dFbGVtZW50W10gZWxlbWVudHMgPSAoSUNhdGFsb2dFbGVtZW50W10pIGNhdGFsb2dFbGVtZW50cwotCQkJCS50b0FycmF5KG5ldyBJQ2F0YWxvZ0VsZW1lbnRbY2F0YWxvZ0VsZW1lbnRzLnNpemUoKV0pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJaWYgKGVsZW1lbnQuZ2V0VHlwZSgpID09IHR5cGUpCi0JCQl7Ci0JCQkJcmVzdWx0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJQ2F0YWxvZ0VudHJ5W10gZ2V0Q2F0YWxvZ0VudHJpZXMoKQotCXsKLQkJTGlzdCByZXN1bHQgPSBnZXRDYXRhbG9nRWxlbWVudHMoSUNhdGFsb2dFbGVtZW50LlRZUEVfRU5UUlkpOwotCQlyZXR1cm4gKElDYXRhbG9nRW50cnlbXSkgcmVzdWx0Ci0JCQkJLnRvQXJyYXkobmV3IElDYXRhbG9nRW50cnlbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCBDYXRhbG9nU2V0IGdldENhdGFsb2dTZXQoKQotCXsKLQkJcmV0dXJuIHJlc291cmNlU2V0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotCXsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKQotCXsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBJTmV4dENhdGFsb2dbXSBnZXROZXh0Q2F0YWxvZ3MoKQotCXsKLQkJTGlzdCByZXN1bHQgPSBnZXRDYXRhbG9nRWxlbWVudHMoSUNhdGFsb2dFbGVtZW50LlRZUEVfTkVYVF9DQVRBTE9HKTsKLQkJcmV0dXJuIChJTmV4dENhdGFsb2dbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElOZXh0Q2F0YWxvZ1tyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIEludGVybmFsUmVzb2x2ZXIgZ2V0T3JDcmVhdGVJbnRlcm5hbFJlc29sdmVyKCkKLQl7Ci0JCWlmIChpbnRlcm5hbFJlc29sdmVyID09IG51bGwpCi0JCXsKLQkJCWludGVybmFsUmVzb2x2ZXIgPSBuZXcgSW50ZXJuYWxSZXNvbHZlcigpOwotCQl9Ci0JCXJldHVybiBpbnRlcm5hbFJlc29sdmVyOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpCi0JewotCQlyZXR1cm4gaXNOb3RpZmljYXRpb25FbmFibGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCWNhdGFsb2dMUy5sb2FkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5QWRkRWxlbWVudChJQ2F0YWxvZ0VsZW1lbnQgZW50cnkpCi0JewotCQlpZiAoaXNOb3RpZmljYXRpb25FbmFibGVkKQotCQl7Ci0JCQlJQ2F0YWxvZ0V2ZW50IGV2ZW50ID0gbmV3IENhdGFsb2dFdmVudCh0aGlzLCBlbnRyeSwKLQkJCQkJSUNhdGFsb2dFdmVudC5FTEVNRU5UX0FEREVEKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlDaGFuZ2VkKCkKLQl7Ci0JCUlDYXRhbG9nRXZlbnQgZXZlbnQgPSBuZXcgQ2F0YWxvZ0V2ZW50KHRoaXMsIG51bGwsCi0JCQkJSUNhdGFsb2dFdmVudC5DSEFOR0VEKTsKLQkJbm90aWZ5TGlzdGVuZXJzKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoSUNhdGFsb2dFdmVudCBldmVudCkKLQl7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbGlzdC5hZGRBbGwobGlzdGVuZXJMaXN0KTsKLQkJZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCXsKLQkJCUlDYXRhbG9nTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUNhdGFsb2dMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5jYXRhbG9nQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlSZW1vdmVFbGVtZW50KElDYXRhbG9nRWxlbWVudCBlbGVtZW50KQotCXsKLQkJaWYgKGlzTm90aWZpY2F0aW9uRW5hYmxlZCkKLQkJewotCQkJSUNhdGFsb2dFdmVudCBldmVudCA9IG5ldyBDYXRhbG9nRXZlbnQodGhpcywgZWxlbWVudCwKLQkJCQkJSUNhdGFsb2dFdmVudC5FTEVNRU5UX1JFTU9WRUQpOwotCQkJbm90aWZ5TGlzdGVuZXJzKGV2ZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNhdGFsb2dFbGVtZW50KElDYXRhbG9nRWxlbWVudCBlbGVtZW50KQotCXsKLQkJY2F0YWxvZ0VsZW1lbnRzLnJlbW92ZShlbGVtZW50KTsKLQkJaW50ZXJuYWxSZXNvbHZlciA9IG51bGw7Ci0JCW5vdGlmeVJlbW92ZUVsZW1lbnQoZWxlbWVudCk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElDYXRhbG9nTGlzdGVuZXIgbGlzdGVuZXIpCi0JewotCQlsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVQdWJsaWMoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0JCQl0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldE9yQ3JlYXRlSW50ZXJuYWxSZXNvbHZlcigpLnJlc29sdmVQdWJsaWMocHVibGljSWQsIHN5c3RlbUlkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVTdWJvcmRpbmF0ZUNhdGFsb2dzKGludCBlbnRyeVR5cGUsIFN0cmluZyBwdWJsaWNJZCwKLQkJCVN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLQl7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlJTmV4dENhdGFsb2dbXSBuZXh0Q2F0YWxvZ3MgPSBnZXROZXh0Q2F0YWxvZ3MoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0Q2F0YWxvZ3MubGVuZ3RoOyBpKyspCi0JCXsKLQkJCUlOZXh0Q2F0YWxvZyBuZXh0Q2F0YWxvZyA9IG5leHRDYXRhbG9nc1tpXTsKLQkJCUlDYXRhbG9nIGNhdGFsb2cgPSBuZXh0Q2F0YWxvZy5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotCQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkKLQkJCXsKLQkJCQlzd2l0Y2ggKGVudHJ5VHlwZSkKLQkJCQl7Ci0JCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDOgotCQkJCQlyZXN1bHQgPSBjYXRhbG9nLnJlc29sdmVQdWJsaWMocHVibGljSWQsIHN5c3RlbUlkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfU1lTVEVNOgotCQkJCQlyZXN1bHQgPSBjYXRhbG9nLnJlc29sdmVTeXN0ZW0oc3lzdGVtSWQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkk6Ci0JCQkJCXJlc3VsdCA9IGNhdGFsb2cucmVzb2x2ZVVSSShzeXN0ZW1JZCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJewotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVTeXN0ZW0oU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAotCQkJSU9FeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRPckNyZWF0ZUludGVybmFsUmVzb2x2ZXIoKS5yZXNvbHZlU3lzdGVtKHN5c3RlbUlkKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIHVyaSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKLQkJCUlPRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0T3JDcmVhdGVJbnRlcm5hbFJlc29sdmVyKCkucmVzb2x2ZVVSSSh1cmkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCWNhdGFsb2dMUy5zYXZlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QmFzZShTdHJpbmcgYmFzZSkKLQl7Ci0JCXRoaXMuYmFzZSA9IGJhc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKQotCXsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikKLQl7Ci0JCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROb3RpZmljYXRpb25FbmFibGVkKGJvb2xlYW4gYikKLQl7Ci0JCWlzTm90aWZpY2F0aW9uRW5hYmxlZCA9IGI7Ci0JfQotCi0JcHVibGljIElDYXRhbG9nRWxlbWVudFtdIGdldENhdGFsb2dFbGVtZW50cygpCi0JewotCQlyZXR1cm4gKElDYXRhbG9nRWxlbWVudFtdKSBjYXRhbG9nRWxlbWVudHMudG9BcnJheShuZXcgSUNhdGFsb2dFbGVtZW50W2NhdGFsb2dFbGVtZW50cy5zaXplKCldKTsKLQl9Ci0JCi0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0NvbnRyaWJ1dG9yUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dDb250cmlidXRvclJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMDFjNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0NvbnRyaWJ1dG9yUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIENhdGFsb2dDb250cmlidXRvclJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJjYXRhbG9nQ29udHJpYnV0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NPTlRSSUJVVElPTiA9ICJjYXRhbG9nQ29udHJpYnV0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAvKgotICAgKiB0aGlzIGlzIGEgc2FtcGxlIGV4cHRlbnNpb24gCi0gICAqIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jYXRhbG9nQ29udHJpYnV0aW9ucyI+IAotICAgKiA8Y2F0YWxvZ0NvbnRyaWJ1dGlvbj4KLSAgICogICAgPHVyaQotICAgKiAgICAgICAgICAgICBuYW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiAKLSAgICogICAgICAgICAgICAgdXJpPSJ4c2Qvc29hcC54c2QiLz4gCi0gICAqICAgCTxwdWJsaWMKLSAgICogICAgICAgICAgcHVibGljSWQ9Ii0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iCi0gICAqICAgICAgICAgIHVyaT0iZHRkcy94aHRtbDExLWZsYXQuZHRkIi8+IAotICAgKiAgCTxuZXh0Q2F0YWxvZyBpZD0ibmVzdGVkQ2F0YWxvZyIgY2F0YWxvZz0iZGF0YS9jYXRhbG9nMS54bWwiLz4gCi0gICAqICA8L2NhdGFsb2dDb250cmlidXRpb24+IAotICAgKiAgPC9leHRlbnNpb24+Ci0gICAqICAKLSAgICovCi0gIHByb3RlY3RlZCBJQ2F0YWxvZyBjYXRhbG9nOwotCi0gIHByb3RlY3RlZCBTdHJpbmcgZGVjbGFyaW5nRXh0ZW5zaW9uSWQ7Ci0gIAotICBwcm90ZWN0ZWQgQ2F0YWxvZ0NvbnRyaWJ1dG9yUmVnaXN0cnlSZWFkZXIoSUNhdGFsb2cgYUNhdGFsb2cpCi0gIHsKLSAgICBjYXRhbG9nID0gYUNhdGFsb2c7Ci0gIH0KLQotICAvKioKLSAgICogcmVhZCBmcm9tIHBsdWdpbiByZWdpc3RyeSBhbmQgcGFyc2UgaXQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCByZWFkUmVnaXN0cnkoKQotICB7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHBsdWdpblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBwbHVnaW5SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLSAgICBpZiAocG9pbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVBhdGgoVVJMIHBsYXRmb3JtVVJMLCBTdHJpbmcgcGF0aCkgCi0gIHsgICAgICAKLQlTdHJpbmcgZmlsZUxvY2F0aW9uID0gcGF0aDsKLQlpbnQgamFyUGF0aFN0YXJ0ID0gcGF0aC5pbmRleE9mKCJqYXI6Iik7IC8vJE5PTi1OTFMtMSQKLQlqYXJQYXRoU3RhcnQgPSBqYXJQYXRoU3RhcnQgPCAwID8gMCA6IGphclBhdGhTdGFydCArICJqYXI6Ii5sZW5ndGgoKTsgLy8kTk9OLU5MUy0xJAotCWludCBqYXJQYXRoRW5kID0gcGF0aC5pbmRleE9mKCIhIik7IC8vJE5PTi1OTFMtMSQKLQlqYXJQYXRoRW5kID0gamFyUGF0aEVuZCA8IDAgPyBwYXRoLmxlbmd0aCgpIDogamFyUGF0aEVuZDsKLQlmaWxlTG9jYXRpb24gPSBwYXRoLnN1YnN0cmluZyhqYXJQYXRoU3RhcnQsIGphclBhdGhFbmQpOwotCQotCVN0cmluZyByZXN1bHQgPSBwYXRoOwotCVN0cmluZyByZXNvbHZlZExvY2F0aW9uID0gZmlsZUxvY2F0aW9uOwotCVVSTCByZXNvbHZlZFVSTCA9IG51bGw7Ci0gICAgaWYgKGZpbGVMb2NhdGlvbi5zdGFydHNXaXRoKCJwbGF0Zm9ybTovcGx1Z2luIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICAvLyB0aGlzIGlzIHRoZSBzcGVjbGlhbCBjYXNlLCB3aGVyZSB0aGUgcmVzb3VyY2UgaXMgbG9jYXRlZCByZWxhdGl2ZSAKLSAgICAgIC8vIHRvIGFub3RoZXIgcGx1Z2luIChub3QgdGhlIG9uZSB0aGF0IGRlY2xhcmVzIHRoZSBleHRlbnNpb24gcG9pbnQpCi0gICAgICAvLwotCQl0cnkKLQkJewotCQkJcmVzb2x2ZWRVUkwgPSBQbGF0Zm9ybS5yZXNvbHZlKG5ldyBVUkwoZmlsZUxvY2F0aW9uKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCXsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfSAKLSAgICB9Ci0gICAgZWxzZXsKLSAgICAJIC8vIHRoaXMgaXMgdGhlIHR5cGljYWwgY2FzZSwgd2hlcmUgdGhlIHJlc291cmNlIGlzIGxvY2F0ZWQgcmVsYXRpdmUKLSAgICAgICAgLy8gdG8gdGhlIHBsdWdpbiB0aGF0IGRlY2xhcmVzIHRoZSBleHRlbnNpb24gcG9pbnQKLSAgICAJIHRyeSB7Ci0gICAgCSAgICAgCXJlc29sdmVkVVJMID0gbmV3IFVSTChQbGF0Zm9ybS5yZXNvbHZlKHBsYXRmb3JtVVJMKSwgZmlsZUxvY2F0aW9uKTsKLSAgICAJIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAJICAgIAkvLyBkbyBub3RoaW5nCi0gICAgCSB9Ci0gICAgfQotICAgCi0gICBpZihyZXNvbHZlZFVSTCAhPSBudWxsKXsKLSAgICAJcmVzb2x2ZWRMb2NhdGlvbiA9IHJlc29sdmVkVVJMLnRvRXh0ZXJuYWxGb3JtKCkucmVwbGFjZSgnXFwnLCAnLycpOwotICAgIAlyZXN1bHQgPSByZXN1bHQucmVwbGFjZUZpcnN0KGZpbGVMb2NhdGlvbiwgcmVzb2x2ZWRMb2NhdGlvbik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgVVJMIGdldFBsYXRmb3JtVVJMKFN0cmluZyBwbHVnaW5JZCl7Ci0JICBCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKQotCQl7Ci0JCQlVUkwgYnVuZGxlRW50cnkgPSBidW5kbGUuZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlpZihidW5kbGVFbnRyeSAhPSBudWxsKXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCXJldHVybiBQbGF0Zm9ybS5yZXNvbHZlKGJ1bmRsZUVudHJ5KTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyByZXNvbHZlUGF0aChTdHJpbmcgcGF0aCkKLSAgewotCSAgcmV0dXJuIHJlc29sdmVQYXRoKGdldFBsYXRmb3JtVVJMKGRlY2xhcmluZ0V4dGVuc2lvbklkKSwgcGF0aCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHRyeQotICAgIHsKLQkgIGRlY2xhcmluZ0V4dGVuc2lvbklkID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgfQotICAgIAotICAgIGlmIChUQUdfQ09OVFJJQlVUSU9OLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpewotICAgIAlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBtYXBwaW5nSW5mb0VsZW1lbnRMaXN0ID0gZWxlbWVudC5nZXRDaGlsZHJlbihPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1BVQkxJQyk7Ci0gICAgCXByb2Nlc3NNYXBwaW5nSW5mb0VsZW1lbnRzKG1hcHBpbmdJbmZvRWxlbWVudExpc3QpOwotICAgIAltYXBwaW5nSW5mb0VsZW1lbnRMaXN0ID0gZWxlbWVudC5nZXRDaGlsZHJlbihPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1NZU1RFTSk7Ci0gICAgCXByb2Nlc3NNYXBwaW5nSW5mb0VsZW1lbnRzKG1hcHBpbmdJbmZvRWxlbWVudExpc3QpOwotICAgIAltYXBwaW5nSW5mb0VsZW1lbnRMaXN0ID0gZWxlbWVudC5nZXRDaGlsZHJlbihPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1VSSSk7Ci0gICAgCXByb2Nlc3NNYXBwaW5nSW5mb0VsZW1lbnRzKG1hcHBpbmdJbmZvRWxlbWVudExpc3QpOwotICAgIAlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBuZXh0Q2F0YWxvZ0VsZW1lbnRMaXN0ID0gZWxlbWVudC5nZXRDaGlsZHJlbihPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX05FWFRfQ0FUQUxPRyk7Ci0gICAgCXByb2Nlc3NOZXh0Q2F0YWxvZ0VsZW1lbnRzKG5leHRDYXRhbG9nRWxlbWVudExpc3QpOwotICAgIAkKLSAgICB9Ci0gICAgCi0gIH0KLQotICBwcml2YXRlIHZvaWQgcHJvY2Vzc01hcHBpbmdJbmZvRWxlbWVudHMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRFbGVtZW50TGlzdCkKLSAgewotICAgIGlmIChjYXRhbG9nID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZEVsZW1lbnRMaXN0Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBjaGlsZEVsZW1lbnRMaXN0W2ldOwotICAgICAgU3RyaW5nIG5hbWUgPSBjaGlsZEVsZW1lbnQuZ2V0TmFtZSgpOwotICAgICAgU3RyaW5nIGtleSA9IG51bGw7Ci0JCi0gICAgICBpbnQgdHlwZSA9IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUM7Ci0gICAgICBpZiAoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19QVUJMSUMuZXF1YWxzKG5hbWUpKQotICAgICAgewotICAgICAgICBrZXkgPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1BVQkxJQ19JRCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1NZU1RFTS5lcXVhbHMobmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGtleSA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfU1lTVEVNX0lEKTsKLSAgICAgICAgdHlwZSA9IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9TWVNURU07Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1VSSS5lcXVhbHMobmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGtleSA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgICAgIHR5cGUgPSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19ORVhUX0NBVEFMT0cuZXF1YWxzKG5hbWUpKQotICAgICAgewotICAgICAgICBwcm9jZXNzTmV4dENhdGFsb2dFbGVtZW50cyhuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50W117Y2hpbGRFbGVtZW50fSk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaWYgKGtleSA9PSBudWxsIHx8IGtleS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfZW50cnlfa2V5X25vdF9zZXQpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIFN0cmluZyBlbnRyeVVSSSA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfVVJJKTsgLy8gbWFuZGF0b3J5Ci0gICAgICBpZiAoZW50cnlVUkkgPT0gbnVsbCB8fCBlbnRyeVVSSS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFhNTENvcmVNZXNzYWdlcy5DYXRhbG9nX2VudHJ5X3VyaV9ub3Rfc2V0KTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBJQ2F0YWxvZ0VsZW1lbnQgY2F0YWxvZ0VsZW1lbnQgPSBjYXRhbG9nLmNyZWF0ZUNhdGFsb2dFbGVtZW50KHR5cGUpOwotICAgICAgaWYgKGNhdGFsb2dFbGVtZW50IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkKLSAgICAgIHsKLSAgICAgICAgSUNhdGFsb2dFbnRyeSBlbnRyeSA9IChJQ2F0YWxvZ0VudHJ5KSBjYXRhbG9nRWxlbWVudDsKLSAgICAgICAgZW50cnkuc2V0S2V5KGtleSk7Ci0JCVN0cmluZyByZXNvbHZlZFBhdGggPSByZXNvbHZlUGF0aChlbnRyeVVSSSk7Ci0JCWVudHJ5LnNldFVSSShyZXNvbHZlZFBhdGgpOwotICAgICAgICBTdHJpbmcgaWQgPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0lEKTsgLy8gb3B0aW9uYWwKLSAgICAgICAgaWYgKGlkICE9IG51bGwgJiYgIWlkLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIGVudHJ5LnNldElkKGlkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gcHJvY2VzcyBhbnkgb3RoZXIgYXR0cmlidXRlcwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlTmFtZXMoKS5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZU5hbWVzKClbal07Ci0gICAgICAgIGlmICghYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSSkgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9OQU1FKSAmJiAhYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1BVQkxJQ19JRCkKLSAgICAgICAgICAgICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfU1lTVEVNX0lEKSAmJiAhYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0NBVEFMT0cpICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfSUQpCi0gICAgICAgICAgICAmJiAhYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0JBU0UpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGF0dHJWYWx1ZSA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpOwotICAgICAgICAgIGlmIChhdHRyVmFsdWUgIT0gbnVsbCAmJiAhYXR0clZhbHVlLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXRhbG9nRWxlbWVudC5zZXRBdHRyaWJ1dGVWYWx1ZShhdHRyTmFtZSwgYXR0clZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGFsb2cuYWRkQ2F0YWxvZ0VsZW1lbnQoY2F0YWxvZ0VsZW1lbnQpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzTmV4dENhdGFsb2dFbGVtZW50cyhJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZEVsZW1lbnRMaXN0KQotICB7Ci0gICAgaWYgKGNhdGFsb2cgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkRWxlbWVudExpc3QubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkRWxlbWVudCA9IGNoaWxkRWxlbWVudExpc3RbaV07Ci0gICAgICBTdHJpbmcgbG9jYXRpb24gPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0NBVEFMT0cpOyAvLyBtYW5kYXRvcnkKLSAgICAgIGlmIChsb2NhdGlvbiA9PSBudWxsIHx8IGxvY2F0aW9uLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFhNTENvcmVNZXNzYWdlcy5DYXRhbG9nX25leHRfY2F0YWxvZ19sb2NhdGlvbl91cmlfbm90X3NldCk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgSU5leHRDYXRhbG9nIG5leHRDYXRhbG9nID0gbmV3IE5leHRDYXRhbG9nKCk7Ci0JICBTdHJpbmcgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZVBhdGgobG9jYXRpb24pOwotICAgICAgbmV4dENhdGFsb2cuc2V0Q2F0YWxvZ0xvY2F0aW9uKHJlc29sdmVkUGF0aCk7Ci0JICBTdHJpbmcgaWQgPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0lEKTsKLQkgIGlmIChpZCAhPSBudWxsICYmICFpZC5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7IAotCQkgIG5leHRDYXRhbG9nLnNldElkKGlkKTsKLSAgICAgIH0KLSAgICAgIGNhdGFsb2cuYWRkQ2F0YWxvZ0VsZW1lbnQobmV4dENhdGFsb2cpOwotICAgIH0KLSAgfQotICAKLSAKLSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTUxYTA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIENhdGFsb2dFbGVtZW50IGltcGxlbWVudHMgSUNhdGFsb2dFbGVtZW50Ci17Ci0JaW50IHR5cGU7Ci0KLQlTdHJpbmcgaWQ7Ci0KLQlNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlJQ2F0YWxvZyBvd25lckNhdGFsb2c7Ci0KLQlwdWJsaWMgQ2F0YWxvZ0VsZW1lbnQoaW50IGFUeXBlKQotCXsKLQkJc3VwZXIoKTsKLQkJdHlwZSA9IGFUeXBlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0JewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBuYW1lKQotCXsKLQkJcmV0dXJuIChTdHJpbmcpIGF0dHJpYnV0ZXMuZ2V0KG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCi0JewotCQlhdHRyaWJ1dGVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldEF0dHJpYnV0ZXMoKQotCXsKLQkJQ29sbGVjdGlvbiBjID0gYXR0cmlidXRlcy52YWx1ZXMoKTsKLQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tjLnNpemUoKV07Ci0JCWF0dHJpYnV0ZXMua2V5U2V0KCkudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotCXsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkKLQl7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQlwdWJsaWMgSUNhdGFsb2cgZ2V0T3duZXJDYXRhbG9nKCkKLQl7Ci0JCXJldHVybiBvd25lckNhdGFsb2c7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3duZXJDYXRhbG9nKElDYXRhbG9nIGNhdGFsb2cpCi0JewotCQl0aGlzLm93bmVyQ2F0YWxvZyA9IGNhdGFsb2c7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgbWFrZUFic29sdXRlKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBsb2NhdGlvbikKLQl7Ci0JCVVSTCBsb2NhbCA9IG51bGw7Ci0JCWxvY2F0aW9uID0gbG9jYXRpb24ucmVwbGFjZSgnXFwnLCAnLycpOwotCQl0cnkKLQkJewotCQkJVVJMIGJhc2VVUkwgPSBuZXcgVVJMKGJhc2VMb2NhdGlvbik7Ci0JCQlsb2NhbCA9IG5ldyBVUkwoYmFzZVVSTCwgbG9jYXRpb24pOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLQkJewotCQl9Ci0KLQkJaWYgKGxvY2FsICE9IG51bGwpCi0JCXsKLQkJCXJldHVybiBsb2NhbC50b1N0cmluZygpOwotCQl9IGVsc2UKLQkJewotCQkJcmV0dXJuIGxvY2F0aW9uOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoU3RyaW5nIHBhdGgpCi0JewotCQl0cnkKLQkJewotCQkJVVJJIHVyaSA9IG5ldyBVUkkocGF0aCk7Ci0JCQlpZiAodXJpLmlzQWJzb2x1dGUoKSkKLQkJCXsKLQkJCQlyZXR1cm4gcGF0aDsKLQkJCX0KLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpCi0JCXsKLQkJfQotCi0JCVN0cmluZyByZXN1bHQgPSBwYXRoOwotCQlDYXRhbG9nIGNhdGFsb2cgPSAoQ2F0YWxvZykgZ2V0T3duZXJDYXRhbG9nKCk7Ci0JCWlmIChjYXRhbG9nICE9IG51bGwpCi0JCXsKLQkJCVN0cmluZyBiYXNlID0gY2F0YWxvZy5nZXRCYXNlKCk7Ci0JCQlpZiAoYmFzZSA9PSBudWxsIHx8IGJhc2UuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCWJhc2UgPSBjYXRhbG9nLmdldExvY2F0aW9uKCk7Ci0JCQl9Ci0JCQlyZXN1bHQgPSBtYWtlQWJzb2x1dGUoYmFzZSwgcGF0aCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JICAvKgotCSAgICogU2luY2Ugd2UgZG9uJ3QgaGF2ZSBldmVudHMgbm90aWZpY2F0aW9ucyBmb3IgZW50cnkgcHJvcGVydGllcywgY2xvbmUoKQotCSAgICogY291bGQgYWxsb3cgdG8gY29weSBhbmQgZWRpdCBlbnRyeSBhbmQgdGhlbiByZXBsYWNlIGl0IGluIGNhdGFsb2cuIEVudHJ5Ci0JICAgKiByZXBsYWNlbWVudCB3aWxsIHNpZ25hbCBJQ2F0YWxvZ0V2ZW50IEByZXR1cm4KLQkgICAqLwotCSAgcHVibGljIE9iamVjdCBjbG9uZSgpCi0JICB7Ci0JCUlDYXRhbG9nRWxlbWVudCBlbGVtZW50ID0gb3duZXJDYXRhbG9nLmNyZWF0ZUNhdGFsb2dFbGVtZW50KHR5cGUpOwotCSAgICBTdHJpbmdbXSBhdHRyaWJ1dGVzID0gZ2V0QXR0cmlidXRlcygpOyAgIAotCSAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspCi0JICAgIHsKLQkgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBhdHRyaWJ1dGVzW2ldOwotCSAgICAgIFN0cmluZyBhdHRyVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhdHRyTmFtZSk7Ci0JICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVWYWx1ZShhdHRyTmFtZSwgYXR0clZhbHVlKTsKLQkgICAgfQotCQllbGVtZW50LnNldE93bmVyQ2F0YWxvZyhvd25lckNhdGFsb2cpOwotCQllbGVtZW50LnNldElkKGlkKTsKLQkgICAgcmV0dXJuIGVsZW1lbnQ7Ci0JICB9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dFbnRyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0VudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MGE4ZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0VudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLQotcHVibGljIGNsYXNzIENhdGFsb2dFbnRyeSBleHRlbmRzIENhdGFsb2dFbGVtZW50IGltcGxlbWVudHMgSUNhdGFsb2dFbnRyeSwgQ2xvbmVhYmxlCi17Ci0gIGludCBlbnRyeVR5cGUgPSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDOwotICBTdHJpbmcga2V5OwotICBTdHJpbmcgdXJpOwotCi0gIHByb3RlY3RlZCBDYXRhbG9nRW50cnkoaW50IGFuRW50cnlUeXBlKQotICB7Ci0gICAgc3VwZXIoSUNhdGFsb2dFbGVtZW50LlRZUEVfRU5UUlkpOwotICAgIGVudHJ5VHlwZSA9IGFuRW50cnlUeXBlOwotICB9Ci0KLSAgcHJvdGVjdGVkIENhdGFsb2dFbnRyeSgpCi0gIHsKLSAgICBzdXBlcihJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9FTlRSWSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFbnRyeVR5cGUoaW50IHZhbHVlKQotICB7Ci0gICAgZW50cnlUeXBlID0gdmFsdWU7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEVudHJ5VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZW50cnlUeXBlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGtleSA9IHZhbHVlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRLZXkoKQotICB7Ci0gICAgcmV0dXJuIGtleTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkKLSAgewotICAgIHJldHVybiB1cmk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFVSSShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICB1cmkgPSB2YWx1ZTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKQotICB7Ci0gICAgQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gKENhdGFsb2dFbnRyeSlzdXBlci5jbG9uZSgpOwotCWVudHJ5LnNldEVudHJ5VHlwZShlbnRyeVR5cGUpOwotICAgIGVudHJ5LnNldEtleShrZXkpOwotICAgIGVudHJ5LnNldFVSSSh1cmkpOwotICAgIHJldHVybiBlbnRyeTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0V2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiYTY0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0V2ZW50OwotCi0KLXB1YmxpYyBjbGFzcyBDYXRhbG9nRXZlbnQgaW1wbGVtZW50cyBJQ2F0YWxvZ0V2ZW50Ci17Ci0gIHByb3RlY3RlZCBJQ2F0YWxvZyBjYXRhbG9nOwotICBwcm90ZWN0ZWQgSUNhdGFsb2dFbGVtZW50IGNhdGFsb2dFbGVtZW50OwotICBwcm90ZWN0ZWQgaW50IGV2ZW50VHlwZTsKLQotICBwdWJsaWMgQ2F0YWxvZ0V2ZW50KENhdGFsb2cgY2F0YWxvZywgSUNhdGFsb2dFbGVtZW50IGVsZW1lbnQsIGludCBldmVudFR5cGUpCi0gIHsKLSAgICB0aGlzLmNhdGFsb2cgPSBjYXRhbG9nOwotICAgIHRoaXMuY2F0YWxvZ0VsZW1lbnQgPSBlbGVtZW50OwotICAgIHRoaXMuZXZlbnRUeXBlID0gZXZlbnRUeXBlOwotICB9Ci0KLSAgcHVibGljIElDYXRhbG9nIGdldENhdGFsb2coKQotICB7Ci0gICAgcmV0dXJuIGNhdGFsb2c7Ci0gIH0KLQotICBwdWJsaWMgSUNhdGFsb2dFbGVtZW50IGdldENhdGFsb2dFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBjYXRhbG9nRWxlbWVudDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkKLSAgewotICAgIHJldHVybiBldmVudFR5cGU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRiODhkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIAotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDYXRhbG9nUmVhZGVyCi17Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWFkKENhdGFsb2cgeG1sQ2F0YWxvZywgSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbnB1dCksIG5ldyBDYXRhbG9nQ29udGVudEhhbmRsZXIoeG1sQ2F0YWxvZykpOwotICAgIH0KLSAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgfQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgIH0KLSAgfQotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIENhdGFsb2dDb250ZW50SGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgQ2F0YWxvZyBjYXRhbG9nOwotICAgIHByb3RlY3RlZCBTdGFjayBiYXNlVVJJU3RhY2sgPSBuZXcgU3RhY2soKTsKLQotICAgIHB1YmxpYyBDYXRhbG9nQ29udGVudEhhbmRsZXIoQ2F0YWxvZyB4bWxDYXRhbG9nKQotICAgIHsKLSAgICAgIHRoaXMuY2F0YWxvZyA9IHhtbENhdGFsb2c7Ci0gICAgICBTdHJpbmcgYmFzZSA9IHhtbENhdGFsb2cuZ2V0QmFzZSgpOwotICAgICAgaWYoYmFzZSA9PSBudWxsIHx8IGJhc2UgPT0gIiIpIHsgIC8vJE5PTi1OTFMtMSQKLSAgICAJICBiYXNlID0geG1sQ2F0YWxvZy5nZXRMb2NhdGlvbigpOwotICAgICAgfQotICAgICAgYmFzZVVSSVN0YWNrLnB1c2goYmFzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgLy8gc2V0IGJhc2UKLSAgICAgIFN0cmluZyBiYXNlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9CQVNFKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKGJhc2UgIT0gbnVsbCAmJiAhYmFzZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgICAgYmFzZVVSSVN0YWNrLnB1c2goYmFzZSk7Ci0gICAgICB9IGVsc2UgewotICAgIAkgIGJhc2VVUklTdGFjay5wdXNoKGJhc2VVUklTdGFjay5wZWVrKCkpOwotICAgICAgfQotCi0JICAvLyBwcm9jZXNzaW5nIGZvciBiYWNrd2FyZCBjb21wYXRhYmlsaXR5IHN0YXJ0Ci0JICBpZiAobG9jYWxOYW1lLmVxdWFscyhDb21wYXRhYmlsaXR5Q29uc3RhbnRzLlRBR19VU0VSX0VOVFJZKSkKLSAgICAgIHsKLQkJaW50IHR5cGUgPSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDOwotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBDb21wYXRhYmlsaXR5Q29uc3RhbnRzLkFUVF9UWVBFKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAodHlwZU5hbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmICh0eXBlTmFtZS5jb21wYXJlVG9JZ25vcmVDYXNlKCJTWVNURU0iKSA9PSAwKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgewotICAgICAgICAgICAgdHlwZSA9IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9TWVNURU07Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0JCSAgSUNhdGFsb2dFbGVtZW50IGNhdGFsb2dFbGVtZW50ID0gY2F0YWxvZy5jcmVhdGVDYXRhbG9nRWxlbWVudCh0eXBlKTsKLQkgICAgICBpZiAoY2F0YWxvZ0VsZW1lbnQgaW5zdGFuY2VvZiBDYXRhbG9nRW50cnkpCi0JICAgICAgewotCSAgICAgICAgQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeSA9IChDYXRhbG9nRW50cnkpIGNhdGFsb2dFbGVtZW50OwotCQkgICAgU3RyaW5nIGtleSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIENvbXBhdGFiaWxpdHlDb25zdGFudHMuQVRUX0lEKTsgICAJCSAgICAgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgY2F0YWxvZ0VudHJ5LnNldEtleShrZXkpOwotCSAgICAgICAgU3RyaW5nIGVudHJ5VXJpID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgQ29tcGF0YWJpbGl0eUNvbnN0YW50cy5BVFRfVVJJKTsgICAgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgCi0JICAgICAgICAvLyBGb3IgcmVsYXRpdmUgVVJJcywgdHJ5IHRvIHJlc29sdmUgdGhlbSB1c2luZyB0aGUgY29ycmVzcG9uZGluZyBiYXNlIFVSSS4KLQkgICAgICAgIGlmKFVSSS5jcmVhdGVVUkkoZW50cnlVcmkpLmlzUmVsYXRpdmUoKSkgewotCSAgICAgICAgCWVudHJ5VXJpID0gVVJJLnJlc29sdmVSZWxhdGl2ZVVSSShlbnRyeVVyaSwgYmFzZVVSSVN0YWNrLnBlZWsoKS50b1N0cmluZygpKTsKLQkgICAgICAgIH0KLQotCSAgICAgICAgY2F0YWxvZ0VudHJ5LnNldFVSSShVUklIZWxwZXIuZW5zdXJlVVJJUHJvdG9jb2xGb3JtYXQoZW50cnlVcmkpKTsgIAotCSAgICAgICAgU3RyaW5nIHdlYlVSTCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIENvbXBhdGFiaWxpdHlDb25zdGFudHMuQVRUX1dFQl9VUkwpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAod2ViVVJMICE9IG51bGwpCi0JCQl7Ci0JCQkJY2F0YWxvZ0VudHJ5LnNldEF0dHJpYnV0ZVZhbHVlKAotCQkJCQkJSUNhdGFsb2dFbnRyeS5BVFRSX1dFQl9VUkwsIHdlYlVSTCk7Ci0JCQl9Ci0JICAgICAgfQotCQkgIGNhdGFsb2cuYWRkQ2F0YWxvZ0VsZW1lbnQoY2F0YWxvZ0VsZW1lbnQpOwotCQkgIHJldHVybjsKLSAgICAgIH0KLQkgIC8vICBwcm9jZXNzaW5nIGZvciBiYWNrd2FyZCBjb21wYXRhYmlsaXR5IHN0YXJ0Ci0gICAgICAKLQkgIGludCB0eXBlID0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQzsKLQkgIFN0cmluZyBrZXkgPSBudWxsOwotCSAvL2R3IFN0cmluZyBjYXRhbG9nSWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9JRCk7Ci0gICAgICBpZiAoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19QVUJMSUMuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGtleSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1BVQkxJQ19JRCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfU1lTVEVNLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgICBrZXkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9TWVNURU1fSUQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHR5cGUgPSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfU1lTVEVNOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19VUkkuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGtleSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX05BTUUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHR5cGUgPSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLlRBR19ORVhUX0NBVEFMT0cuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuZXh0Q2F0YWxvZ0lkID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfSUQpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfQ0FUQUxPRyk7ICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgTmV4dENhdGFsb2cgZGVsZWdhdGUgPSBuZXcgTmV4dENhdGFsb2coKTsKLSAgICAgICAgZGVsZWdhdGUuc2V0Q2F0YWxvZ0xvY2F0aW9uKGxvY2F0aW9uKTsgIAotICAgICAgICBkZWxlZ2F0ZS5zZXRJZChuZXh0Q2F0YWxvZ0lkKTsKLSAgICAgICAgY2F0YWxvZy5hZGRDYXRhbG9nRWxlbWVudChkZWxlZ2F0ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGVsc2V7Ci0gICAgCSAgLy8gZG8gbm90IGhhbmRsZSBvdGhlciBlbnRyaWVzCi0gICAgCSAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKGtleSA9PSBudWxsIHx8IGtleS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19lbnRyeV9rZXlfbm90X3NldCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIFN0cmluZyBlbnRyeVVSSSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSSk7IC8vIG1hbmRhdG9yeSAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoZW50cnlVUkkgPT0gbnVsbCB8fCBlbnRyeVVSSS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19lbnRyeV91cmlfbm90X3NldCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAKLSAgICAgIElDYXRhbG9nRWxlbWVudCBjYXRhbG9nRWxlbWVudCA9IGNhdGFsb2cuY3JlYXRlQ2F0YWxvZ0VsZW1lbnQodHlwZSk7Ci0gICAgICBpZiAoY2F0YWxvZ0VsZW1lbnQgaW5zdGFuY2VvZiBDYXRhbG9nRW50cnkpCi0gICAgICB7Ci0gICAgICAgIENhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkgPSAoQ2F0YWxvZ0VudHJ5KSBjYXRhbG9nRWxlbWVudDsKLSAgICAgICAgY2F0YWxvZ0VudHJ5LnNldEtleShrZXkpOyAKLQotICAgICAgICAvLyAgICAgIEZvciByZWxhdGl2ZSBVUklzLCB0cnkgdG8gcmVzb2x2ZSB0aGVtIHVzaW5nIHRoZSBjb3JyZXNwb25kaW5nIGJhc2UgVVJJLgotICAgICAgICBpZihVUkkuY3JlYXRlVVJJKGVudHJ5VVJJKS5pc1JlbGF0aXZlKCkpIHsKLSAgICAgICAgCWVudHJ5VVJJID0gVVJJLnJlc29sdmVSZWxhdGl2ZVVSSShlbnRyeVVSSSwgYmFzZVVSSVN0YWNrLnBlZWsoKS50b1N0cmluZygpKTsKLSAgICAgICAgfSAKLQotICAgICAgICBjYXRhbG9nRW50cnkuc2V0VVJJKFVSSUhlbHBlci5lbnN1cmVVUklQcm90b2NvbEZvcm1hdChlbnRyeVVSSSkpOyAgICAgCi0KLSAgICAgIH0KLSAgICAgIC8vIHByb2Nlc3MgYW55IG90aGVyIGF0dHJpYnV0ZXMKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaisrKQotICAgICAgewotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBhdHRyaWJ1dGVzLmdldExvY2FsTmFtZShqKTsKLSAgICAgICAgaWYgKCFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfVVJJKSAmJiAhYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX05BTUUpICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfUFVCTElDX0lEKQotICAgICAgICAgICAgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9TWVNURU1fSUQpICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfQ0FUQUxPRykgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9JRCkKLSAgICAgICAgICAgICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfQkFTRSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgYXR0clZhbHVlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShhdHRyTmFtZSk7Ci0gICAgICAgICAgaWYgKGF0dHJWYWx1ZSAhPSBudWxsICYmICFhdHRyVmFsdWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhdGFsb2dFbGVtZW50LnNldEF0dHJpYnV0ZVZhbHVlKGF0dHJOYW1lLCBhdHRyVmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0YWxvZy5hZGRDYXRhbG9nRWxlbWVudChjYXRhbG9nRWxlbWVudCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGlmIChiYXNlVVJJU3RhY2suc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgYmFzZVVSSVN0YWNrLnBvcCgpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgfSAgCi0gIAotICAvLyBmb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eQotICBpbnRlcmZhY2UgQ29tcGF0YWJpbGl0eUNvbnN0YW50c3sKLQkgIAotCSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lEX1hNTF9DQVRBTE9HX1NFVFRJTkdTID0gIlhNTENhdGFsb2dTZXR0aW5ncyI7IC8vJE5PTi1OTFMtMSQKLQkgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19JRF9VU0VSX0VOVFJJRVMgPSAiVXNlckVudHJpZXMiOyAvLyROT04tTkxTLTEkCi0JICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVVNFUl9FTlRSWSA9ICJVc2VyRW50cnkiOyAvLyROT04tTkxTLTEkCi0JICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVFlQRSA9ICJUWVBFIjsgLy8kTk9OLU5MUy0xJAotCSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gIklEIjsgLy8kTk9OLU5MUy0xJAotCSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1VSSSA9ICJVUkkiOyAvLyROT04tTkxTLTEkCi0JICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfV0VCX1VSTCA9ICJXRUJfVVJMIjsgLy8kTk9OLU5MUy0xJAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nU2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZmJkMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ1NldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ2F0YWxvZ1NldCB7Ci0JcHJvdGVjdGVkIE1hcCB1cmlSZXNvdXJjZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJvdGVjdGVkIE1hcCBjYXRhbG9nUGVyc2lzdGVuY2VMb2NhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCXB1YmxpYyBDYXRhbG9nU2V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEZpbmQgYSBDYXRhbG9nIHdpdGggdGhlIGdpdmVuIElELiAgSWYgb25lIGlzIG5vdCBmb3VuZCwgY3JlYXRlIG9uZSBhdCB0aGUgZ2l2ZW4gVVJJLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSB1cmkgLSB0aGUgVVJJLCB0aGUgcGFyZW50IG9mIHRoaXMgZmlsZSBwYXRoIG11c3QgYWxyZWFkeSBleGlzdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ2F0YWxvZyBsb29rdXBPckNyZWF0ZUNhdGFsb2coU3RyaW5nIGlkLCBTdHJpbmcgdXJpKSB7Ci0JCUNhdGFsb2cgY2F0YWxvZyA9IGdldENhdGFsb2coaWQsIHVyaSk7Ci0JCWlmIChjYXRhbG9nID09IG51bGwpIHsKLQkJCWNhdGFsb2cgPSBuZXcgQ2F0YWxvZyh0aGlzLCBpZCwgdXJpKTsKLQkJCXRyeSB7Ci0JCQkJY2F0YWxvZy5sb2FkKCk7Ci0JCQkJdXJpUmVzb3VyY2VNYXAucHV0KHVyaSwgY2F0YWxvZyk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB3ZSBjYXRjaCBhbmQgbG9nIGFsbCBleGNlcHRpb25zLCB0byBkaXNhbGxvdwotCQkJCS8vIG9uZSBiYWQgZXh0ZW5zaW9uIGludGVyZmVyaW5nIHdpdGggb3RoZXJzCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXJyb3IgbG9hZGluZyBjYXRhbG9nOiAiICsgaWQgKyAiICIgKyB1cmksIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2F0YWxvZzsKLQl9Ci0KLQlwcml2YXRlIENhdGFsb2cgZ2V0Q2F0YWxvZyhTdHJpbmcgaWQsIFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIChDYXRhbG9nKSB1cmlSZXNvdXJjZU1hcC5nZXQodXJpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwdXRDYXRhbG9nUGVyc2lzdGVuY2VMb2NhdGlvbihTdHJpbmcgbG9naWNhbFVSSSwgU3RyaW5nIGFjdHVhbFVSSSkgewotCQljYXRhbG9nUGVyc2lzdGVuY2VMb2NhdGlvbnMucHV0KGxvZ2ljYWxVUkksIGFjdHVhbFVSSSk7Ci0JfQotCi0JLy8gTmV2ZXIgdXNlZD8KLQlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2dQZXJzaXN0ZW5jZUxvY2F0aW9uKFN0cmluZyBpZCkgewotCQlyZXR1cm4gKFN0cmluZykgY2F0YWxvZ1BlcnNpc3RlbmNlTG9jYXRpb25zLmdldChpZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ1dyaXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ1dyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTAwZTFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIFdyaXRlIE9BU0lTIFhNTCBDYXRhbG9nIGZvcm1hdAotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDYXRhbG9nV3JpdGVyCi17Ci0gIHByaXZhdGUgRG9jdW1lbnQgZG9jOwotCi0gIHB1YmxpYyB2b2lkIHdyaXRlKElDYXRhbG9nIHhtbENhdGFsb2csIFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLQlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQl0cnkgewotICAgICAgdmlzaXRDYXRhbG9nKHhtbENhdGFsb2cpOwotICAgICAgb3V0cHV0U3RyZWFtID0gZ2V0T3V0cHV0U3RyZWFtKHVyaSk7Ci0gICAgICBzZXJpYWxpemUob3V0cHV0U3RyZWFtKTsKLQl9Ci0JZmluYWxseSB7Ci0JICBpZihvdXRwdXRTdHJlYW0gIT0gbnVsbCkgewotCQlvdXRwdXRTdHJlYW0uY2xvc2UoKTsKLQkgIH0KLQl9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZShJQ2F0YWxvZyBjYXRhbG9nLCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoY2F0YWxvZyAhPSBudWxsKQotICAgIHsKLSAgICAgIHZpc2l0Q2F0YWxvZyhjYXRhbG9nKTsKLSAgICAgIHNlcmlhbGl6ZShvcyk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHZpc2l0Q2F0YWxvZyhJQ2F0YWxvZyB4bWxDYXRhbG9nKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZG9jID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICB9Ci0gICAgaWYgKGRvYyA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIEVsZW1lbnQgY2F0YWxvZ0VsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudE5TKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5uYW1lc3BhY2VOYW1lLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX0NBVEFMT0cpOwotICAgIGRvYy5hcHBlbmRDaGlsZChjYXRhbG9nRWxlbWVudCk7Ci0gICAgcHJvY2Vzc0NhdGFsb2dFbnRyaWVzKHhtbENhdGFsb2csIGNhdGFsb2dFbGVtZW50KTsKLSAgICBwcm9jZXNzTmV4dENhdGFsb2dzKHhtbENhdGFsb2csIGNhdGFsb2dFbGVtZW50KTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzQ2F0YWxvZ0VudHJpZXMoSUNhdGFsb2cgY2F0YWxvZywgRWxlbWVudCBwYXJlbnQpCi0gIHsKLSAgICBJQ2F0YWxvZ0VudHJ5W10gY2F0YWxvZ0VudHJpZXMgPSBjYXRhbG9nLmdldENhdGFsb2dFbnRyaWVzKCk7Ci0gIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2F0YWxvZ0VudHJpZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSUNhdGFsb2dFbnRyeSBlbnRyeSA9IGNhdGFsb2dFbnRyaWVzW2ldOwotICAgICAgU3RyaW5nIGtleSA9IGVudHJ5LmdldEtleSgpOwotICAgICAgU3RyaW5nIHVyaSA9IGVudHJ5LmdldFVSSSgpOwotCSAgU3RyaW5nIGlkID0gZW50cnkuZ2V0SWQoKTsKLQkgIEVsZW1lbnQgY2hpbGRFbGVtZW50ID0gbnVsbDsKLQkgCi0gICAgIHN3aXRjaCAoZW50cnkuZ2V0RW50cnlUeXBlKCkpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQyA6Ci0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfUFVCTElDKTsKLSAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9QVUJMSUNfSUQsIGtleSk7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSSwgdXJpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTSA6Ci0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfU1lTVEVNKTsKLSAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9TWVNURU1fSUQsIGtleSk7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSSwgdXJpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1VSSSA6Ci0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfVVJJKTsKLSAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9OQU1FLCBrZXkpOwotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9VUkksIHVyaSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQkgIGlmKGNoaWxkRWxlbWVudCAhPSBudWxsICYmIGlkICE9IG51bGwgJiYgIWlkLmVxdWFscygiIikpeyAvLyROT04tTkxTLTEkCi0JCSAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9JRCwgaWQpOwotCSAgfQotICAgICAgCi0gICAgICBTdHJpbmdbXSBhdHRyaWJ1dGVzID0gZW50cnkuZ2V0QXR0cmlidXRlcygpOyAgIAotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBhdHRyaWJ1dGVzW2pdOwotICAgICAgICBpZiAoYXR0ck5hbWUgIT0gbnVsbCAmJiAhYXR0ck5hbWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0JCSAgU3RyaW5nIGF0dHJWYWx1ZSA9IGVudHJ5LmdldEF0dHJpYnV0ZVZhbHVlKGF0dHJOYW1lKTsKLSAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwgJiYgYXR0clZhbHVlICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkRWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NOZXh0Q2F0YWxvZ3MoSUNhdGFsb2cgY2F0YWxvZywgRWxlbWVudCBwYXJlbnQpCi0gIHsKLSAgICAvLyBoYW5kbGUgY2F0YWxvZyBlbnRyaWVzCi0gICAgSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gY2F0YWxvZy5nZXROZXh0Q2F0YWxvZ3MoKTsKLSAgICBFbGVtZW50IGNoaWxkRWxlbWVudCA9IG51bGw7Ci0gICAvL2R3IFN0cmluZyBhdHRyVmFsdWUgPSBudWxsOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElOZXh0Q2F0YWxvZyBkZWxlZ2F0ZSA9IG5leHRDYXRhbG9nc1tpXTsKLSAgICAgIGNoaWxkRWxlbWVudCA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX05FWFRfQ0FUQUxPRyk7Ci0gICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChjaGlsZEVsZW1lbnQpOwotICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBkZWxlZ2F0ZS5nZXRDYXRhbG9nTG9jYXRpb24oKTsKLSAgICAgICAgaWYgKGxvY2F0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0NBVEFMT0csIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCQkgU3RyaW5nIGlkID0gZGVsZWdhdGUuZ2V0SWQoKTsKLQkJIGlmIChpZCAhPSBudWxsKQotCQkgewotCQkJIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfSUQsIGlkKTsKLQkJIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2VyaWFsaXplKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoZG9jID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRyYW5zZm9ybWVyRmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIC8vIFVubGVzcyBhIHdpZHRoIGlzIHNldCwgdGhlcmUgd2lsbCBiZSBvbmx5IGxpbmUgYnJlYWtzIGJ1dCBubwotICAgICAgLy8gaW5kZW50YXRpb24uCi0gICAgICAvLyBUaGUgSUJNIEpESyBhbmQgdGhlIFN1biBKREsgZG9uJ3QgYWdyZWUgb24gdGhlIHByb3BlcnR5IG5hbWUsCi0gICAgICAvLyBzbyB3ZSBzZXQgdGhlbSBib3RoLgotICAgICAgLy8KLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFufWluZGVudC1hbW91bnQiLCAiMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsICIyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgU3RyaW5nIGVuY29kaW5nID0gIlVURi04IjsgLy8gVEJEIC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKQotICAgICAgewotICAgICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCBlbmNvZGluZyk7Ci0gICAgICB9Ci0gICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2MpLCBuZXcgU3RyZWFtUmVzdWx0KG91dHB1dFN0cmVhbSkpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGZpbGVQYXRoID0gcmVtb3ZlUHJvdG9jb2wodXJpKTsKLSAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlUGF0aCk7Ci0gICAgT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotICAgIHJldHVybiBzdHJlYW07Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHJlbW92ZVByb3RvY29sKFN0cmluZyB1cmkpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gdXJpOyAgCi0gICAgU3RyaW5nIHByb3RvY29sX3BhdHRlcm4gPSAiOiI7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAodXJpICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gdXJpLmluZGV4T2YocHJvdG9jb2xfcGF0dGVybik7Ci0gICAgICBpZiAoaW5kZXggPiAyKQotICAgICAgewotICAgICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKGluZGV4ICsgcHJvdG9jb2xfcGF0dGVybi5sZW5ndGgoKSk7ICAgICAgICAgICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvTmV4dENhdGFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL05leHRDYXRhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Zjc1NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvTmV4dENhdGFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBSYWogTWFuZGF5YW0sIElCTQotICogICAgICAgICAgIDEzNjQwMCBOZXh0Q2F0YWxvZy5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpIHRha2VzIGEgbG90IG9mIHRpbWUgY29tcHV0aW5nIGNvbnN0YW50IGluZm9ybWF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotCi0KLQotcHVibGljIGNsYXNzIE5leHRDYXRhbG9nIGV4dGVuZHMgQ2F0YWxvZ0VsZW1lbnQgaW1wbGVtZW50cyBJTmV4dENhdGFsb2cKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb247Ci0gIHByaXZhdGUgSUNhdGFsb2cgcmVmZXJlbmNlZENhdGFsb2c7Ci0KLSAgcHVibGljIE5leHRDYXRhbG9nKCkKLSAgewotICAgIHN1cGVyKElDYXRhbG9nRWxlbWVudC5UWVBFX05FWFRfQ0FUQUxPRyk7Ci0gIH0KLSAgICAKLSAgcHVibGljIFN0cmluZyBnZXRDYXRhbG9nTG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGxvY2F0aW9uOwotICB9Ci0KLSAgcHVibGljIElDYXRhbG9nIGdldFJlZmVyZW5jZWRDYXRhbG9nKCkKLSAgewotICAgIGlmIChyZWZlcmVuY2VkQ2F0YWxvZyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlZmVyZW5jZWRDYXRhbG9nID0gKChDYXRhbG9nKW93bmVyQ2F0YWxvZykuZ2V0Q2F0YWxvZ1NldCgpLmxvb2t1cE9yQ3JlYXRlQ2F0YWxvZyhnZXRJZCgpLCBnZXRBYnNvbHV0ZVBhdGgobG9jYXRpb24pKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlZmVyZW5jZWRDYXRhbG9nOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0xvY2F0aW9uKFN0cmluZyB1cmkpCi0gIHsKLSAgICBsb2NhdGlvbiA9IHVyaTsKLSAgICByZWZlcmVuY2VkQ2F0YWxvZyA9IG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKQotICB7Ci0JTmV4dENhdGFsb2cgbmV4dENhdGFsb2cgPSAoTmV4dENhdGFsb2cpc3VwZXIuY2xvbmUoKTsKLQluZXh0Q2F0YWxvZy5zZXRDYXRhbG9nTG9jYXRpb24obG9jYXRpb24pOwotICAgIHJldHVybiBuZXh0Q2F0YWxvZzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvT0FTSVNDYXRhbG9nQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9PQVNJU0NhdGFsb2dDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjNTc4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9PQVNJU0NhdGFsb2dDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotcHVibGljIGludGVyZmFjZSBPQVNJU0NhdGFsb2dDb25zdGFudHMKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbmFtZXNwYWNlTmFtZSA9ICJ1cm46b2FzaXM6bmFtZXM6dGM6ZW50aXR5OnhtbG5zOnhtbDpjYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVHlwZXMgb2YgdGhlIGNhdGFsb2cgZW50cmllcyAqLwotICAvKiogVGhlIENBVEFMT0cgZWxlbWVudCBuYW1lLiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0FUQUxPRyA9ICJjYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIEdST1VQIGNhdGFsb2cgZW50cnkuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19HUk9VUCA9ICJncm91cCI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIFRoZSBQVUJMSUMgY2F0YWxvZyBlbnRyeS4gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BVQkxJQyA9ICJwdWJsaWMiOyAvLyROT04tTkxTLTEkCi0gIC8qKiBUaGUgU1lTVEVNIGNhdGFsb2cgZXRucnkuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19TWVNURU0gPSAic3lzdGVtIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIFVSSSBjYXRhbG9nIGVudHJ5LiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVVJJID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIFRoZSBSRVdSSVRFX1NZU1RFTSBjYXRhbG9nIGVudHJ5LiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVXUklURV9TWVNURU0gPSAicmV3cml0ZVN5c3RlbSI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIFRoZSBSRVdSSVRFX1VSSSBjYXRhbG9nIGVudHJ5LiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVXUklURV9VUkkgPSAicmV3cml0ZVB1YmxpYyI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIFRoZSBERUxFR0FURV9QVUJMSUMgY2F0YWxvZyBlbnRyeS4gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0RFTEVHQVRFX1BVQkxJQyA9ICJkZWxlZ2F0ZVB1YmxpYyI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIFRoZSBERUxFR0FURV9TWVNURU0gY2F0YWxvZyBlbnRyeS4gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0RFTEVHQVRFX1NZU1RFTSA9ICJkZWxlZ2F0ZVN5c3RlbSI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIFRoZSBERUxFR0FURV9VUkkgY2F0YWxvZyBlbnRyeS4gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0RFTEVHQVRFX1VSSSA9ICJkZWxlZ2F0ZVVyaSI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIFRoZSBORVhUX0NBVEFMT0cgY2F0YWxvZyBlbnRyeS4gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05FWFRfQ0FUQUxPRyA9ICJuZXh0Q2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIEF0dHJpYnV0ZXMgKi8KLSAgLyoqIEF0dHJpYnV0ZSBpZCB1c2VkIGluIGFsbCBjYXRhbG9nIGVudHJpZXMgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIEF0dHJpYnV0ZSBpZCBiYXNlIGluIGFsbCBjYXRhbG9nIGVudHJpZXMgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9CQVNFID0gInhtbDpiYXNlIjsgLy8kTk9OLU5MUy0xJAotICAvKiogQXR0cmlidXRlIGlkIHByZWZlcmUgaW4gY2F0YWxvZyBlbnRyaWVzOiBDQVRBTE9HLCBHUk9VUCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BSRUZFUkUgPSAicHJlZmVyZSI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBQVUJMSUMgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QVUJMSUNfSUQgPSAicHVibGljSWQiOyAvLyROT04tTkxTLTEkCi0gIC8qKgotICAgKiBBdHRyaWJ1dGUgdXNlZCBpbiBjYXRhbG9nIGVudHJpZXMgb2YgdHlwZTogU1lTVEVNCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1NZU1RFTV9JRCA9ICJzeXN0ZW1JZCI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBVUkkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotICAvKioKLSAgICogQXR0cmlidXRlIHVzZWQgaW4gY2F0YWxvZyBlbnRyaWVzIG9mIHR5cGU6IFBVQkxJQywgVVJJCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1VSSSA9ICJ1cmkiOyAvLyROT04tTkxTLTEkCi0gIC8qKgotICAgKiBBdHRyaWJ1dGUgdXNlZCBpbiBjYXRhbG9nIGVudHJpZXMgb2YgdHlwZTogUkVXUklURV9TWVNURU0sIERFTEVHQVRFX1NZU1RFTQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TWVNURU1fSURfU1RBUlRfU1RSSU5HID0gInN5c3RlbUlkU3RhcnRTdHJpbmciOyAvLyROT04tTkxTLTEkCi0gIC8qKgotICAgKiBBdHRyaWJ1dGUgdXNlZCBpbiBjYXRhbG9nIGVudHJpZXMgb2YgdHlwZTogUkVXUklURV9TWVNURU0sIFJFV1JJVEVfVVJJCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1JFV1JJVEVfUFJFRklYID0gInJld3JpdGVQcmVmaXgiOyAvLyROT04tTkxTLTEkCi0gIC8qKgotICAgKiBBdHRyaWJ1dGUgdXNlZCBpbiBjYXRhbG9nIGVudHJpZXMgb2YgdHlwZTogREVMRUdBVEVfUFVCTElDCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BVQkxJQ19JRF9TVEFSVF9TVFJJTkcgPSAicHVibGljSWRTdGFydFN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBERUxFR0FURV9QVUJMSUMsCi0gICAqIERFTEVHQVRFX1NZU1RFTSwgREVMRUdBVEVfVVJJLCBORVhUX0NBVEFMT0cKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ0FUQUxPRyA9ICJjYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAotICAvKioKLSAgICogQXR0cmlidXRlIHVzZWQgaW4gY2F0YWxvZyBlbnRyaWVzIG9mIHR5cGU6IFJFV1JJVEVfVVJJLCBERUxFR0FURV9VUkkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVVJJX1NUQVJUX1NUUklORyA9ICJ1cmlTdGFydFN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dVUklSZXNvbHZlckV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1VSSVJlc29sdmVyRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNGFmMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1VSSVJlc29sdmVyRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGluamVjdCB0aGUgWE1MQ2F0YWxvZyByZXNvbHV0aW9uIGJlaGF2aW91ciBpbnRvIHRoZQotICogQ29tbW9uIEV4dGVuc2libGUgVVJJIFJlc29sdmVyLiBUaGlzIGNsYXNzIGlzIHJlZmVyZW5jZWQgaW4gdGhlIFhNTCBDYXRhbG9nCi0gKiBwbHVnaW4ncyBwbHVnaW4ueG1sIGZpbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nVVJJUmVzb2x2ZXJFeHRlbnNpb24gaW1wbGVtZW50cyBVUklSZXNvbHZlckV4dGVuc2lvbgotewotICBwdWJsaWMgU3RyaW5nIHJlc29sdmUoSUZpbGUgZmlsZSwgU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICAvLyBpZiB3ZSBoYXZlIGNhdGFsb2cgaW4gYSBwcm9qZWN0IHdlIG1heSBhZGQgaXQKLSAgICAvLyB0byB0aGUgY2F0YWxvZyBtYW5hZ2VyIGZpcnN0Ci0gICAgSUNhdGFsb2cgY2F0YWxvZyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0gICAgaWYgKGNhdGFsb2cgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUl9ERUJVRywgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfcmVzb2x1dGlvbl9udWxsX2NhdGFsb2cpOwotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIFN0cmluZyByZXNvbHZlZCA9IG51bGw7Ci0gICAgaWYgKHN5c3RlbUlkICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHJlc29sdmVkID0gY2F0YWxvZy5yZXNvbHZlU3lzdGVtKHN5c3RlbUlkKTsKLSAgICAgICAgaWYgKHJlc29sdmVkID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXNvbHZlZCA9IGNhdGFsb2cucmVzb2x2ZVVSSShzeXN0ZW1JZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWUpCi0gICAgICB7Ci0gICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19yZXNvbHV0aW9uX21hbGZvcm1lZF91cmwpOwotICAgICAgICByZXNvbHZlZCA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaWUpCi0gICAgICB7Ci0gICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19yZXNvbHV0aW9uX2lvX2V4Y2VwdGlvbik7Ci0gICAgICAgIHJlc29sdmVkID0gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHJlc29sdmVkID09IG51bGwpCi0gICAgewotICAgICAgaWYgKHB1YmxpY0lkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIENTIDogdGhpcyBpcyBhIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBidWcgOTY3NzIKLSAgICAgICAgLy8KLSAgICAgICAgLy8gRm9yIHNjaGVtYXMgd2UgYWx3YXlzIHVzZSBsb2NhdGlvbnMgd2hlcmUgYXZhaWxhYmxlIGFuZCBvbmx5IHVzZQotICAgICAgICAvLyBuYW1lc3BhY2Ugd2hlbiBubyBsb2NhdGlvbiBpcyBzcGVjaWZpZWQuICBGb3IgWE1MIGVudGl0aWVzIChzdWNoIGFzIERPQ1RZUEUpIAotICAgICAgICAvLyBkZWZhdWx0IGFsd2F5cyB1dGlsaXplIHRoZSBwdWJsaWMgY2F0YWxvZyBlbnRyeS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhpcyBsYW1lIHRlc3QgYmVsb3cgcm91Z2hseSBkaXNjcmltaW5hdGUgYmV0d2VlbiBzY2hlbWEgYW5kIFhNTCBlbnRpdGllcy4KLSAgICAgICAgLy8gVE9ETyAoYnVnIDEwMzI0MykgcmVtb3ZlIHRoaXMgbGFtZSB0ZXN0IG9uY2Ugd2UgbW92ZSB0byB0aGUgbmV3IFVSSVJlc29sdmVyIEFQSQotICAgICAgICAvLyBzaW5jZSB0aGUgbmV3IEFQSSBpcyBleHBsaWNpdCBhYm91dCBuYW1lc3BhY2UgYW5kIHB1YmxpY0lkCi0gICAgICAgIC8vIAotICAgICAgICBpZiAoIShzeXN0ZW1JZCAhPSBudWxsICYmIHN5c3RlbUlkLmVuZHNXaXRoKCIueHNkIikpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXNvbHZlZCA9IGNhdGFsb2cucmVzb2x2ZVB1YmxpYyhwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgICAgICAgICAgaWYgKHJlc29sdmVkID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc29sdmVkID0gY2F0YWxvZy5yZXNvbHZlVVJJKHB1YmxpY0lkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUl9ERUJVRywgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfcmVzb2x1dGlvbl9tYWxmb3JtZWRfdXJsKTsKLSAgICAgICAgICAgIHJlc29sdmVkID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGllKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19yZXNvbHV0aW9uX2lvX2V4Y2VwdGlvbik7Ci0gICAgICAgICAgICByZXNvbHZlZCA9IG51bGw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXNvbHZlZDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MzdhM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotCi0KLS8qKgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicuCi0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2F0YWxvZwotewotICAgIC8qKgotICAgICAqIFJldHVybnMgY2F0YWxvZyBpZCBzdHJpbmcKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGNhdGFsb2cgaWQgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgY2F0YWxvZyBpZCBzdHJpbmcKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpOwotICAgIAotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbik7Ci0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgYXBwbGljYWJsZSBQVUJMSUMgb3IgU1lTVEVNIGlkZW50aWZpZXIuCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2Qgc2VhcmNoZXMgdGhlIENhdGFsb2cgYW5kIHJldHVybnMgdGhlIHN5c3RlbSBpZGVudGlmaWVyCi0gICAgICogc3BlY2lmaWVkIGZvciB0aGUgZ2l2ZW4gc3lzdGVtIG9yIHB1YmxpYyBpZGVudGlmaWVycy4gSWYgbm8gYXBwcm9wcmlhdGUKLSAgICAgKiBQVUJMSUMgb3IgU1lTVEVNIGVudHJ5IGlzIGZvdW5kIGluIHRoZSBDYXRhbG9nLCBudWxsIGlzIHJldHVybmVkLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHVibGljSWQKLSAgICAgKiAgICAgICAgICAgIFRoZSBwdWJsaWMgaWRlbnRpZmllciB0byBsb2NhdGUgaW4gdGhlIGNhdGFsb2cuIFB1YmxpYwotICAgICAqICAgICAgICAgICAgaWRlbnRpZmllcnMgYXJlIG5vcm1hbGl6ZWQgYmVmb3JlIGNvbXBhcmlzb24uCi0gICAgICogQHBhcmFtIHN5c3RlbUlkCi0gICAgICogICAgICAgICAgICBUaGUgbm9taW5hbCBzeXN0ZW0gaWRlbnRpZmllciBmb3IgdGhlIGVudGl0eSBpbiBxdWVzdGlvbiAoYXMKLSAgICAgKiAgICAgICAgICAgIHByb3ZpZGVkIGluIHRoZSBzb3VyY2UgZG9jdW1lbnQpLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgVGhlIGZvcm1hbCBzeXN0ZW0gaWRlbnRpZmllciBvZiBhIHN1Ym9yZGluYXRlIGNhdGFsb2cgY2Fubm90Ci0gICAgICogICAgICAgICAgICAgYmUgdHVybmVkIGludG8gYSB2YWxpZCBVUkwuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIEVycm9yIHJlYWRpbmcgc3Vib3JkaW5hdGUgY2F0YWxvZyBmaWxlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHN5c3RlbSBpZGVudGlmaWVyIHRvIHVzZS4gTm90ZSB0aGF0IHRoZSBub21pbmFsIHN5c3RlbQotICAgICAqICAgICAgICAgaWRlbnRpZmllciBpcyBub3QgcmV0dXJuZWQgaWYgYSBtYXRjaCBpcyBub3QgZm91bmQgaW4gdGhlCi0gICAgICogICAgICAgICBjYXRhbG9nLCBpbnN0ZWFkIG51bGwgaXMgcmV0dXJuZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBtYXRjaCB3YXMKLSAgICAgKiAgICAgICAgIGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZVB1YmxpYyhTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgICAgICAgICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBhcHBsaWNhYmxlIFNZU1RFTSBzeXN0ZW0gaWRlbnRpZmllci4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBJZiBhIFNZU1RFTSBlbnRyeSBleGlzdHMgaW4gdGhlIENhdGFsb2cgZm9yIHRoZSBzeXN0ZW0gSUQgc3BlY2lmaWVkLAotICAgICAqIHJldHVybiB0aGUgbWFwcGVkIHZhbHVlLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBPbiBXaW5kb3dzLWJhc2VkIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGUgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBzeXN0ZW0KLSAgICAgKiBpZGVudGlmaWVyIHByb3ZpZGVkIGFuZCB0aGUgU1lTVEVNIGVudHJpZXMgaW4gdGhlIENhdGFsb2cgaXMKLSAgICAgKiBjYXNlLWluc2Vuc2l0aXZlLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3lzdGVtSWQKLSAgICAgKiAgICAgICAgICAgIFRoZSBzeXN0ZW0gSUQgdG8gbG9jYXRlIGluIHRoZSBjYXRhbG9nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHJlc29sdmVkIHN5c3RlbSBpZGVudGlmaWVyLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgVGhlIGZvcm1hbCBzeXN0ZW0gaWRlbnRpZmllciBvZiBhIHN1Ym9yZGluYXRlIGNhdGFsb2cgY2Fubm90Ci0gICAgICogICAgICAgICAgICAgYmUgdHVybmVkIGludG8gYSB2YWxpZCBVUkwuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIEVycm9yIHJlYWRpbmcgc3Vib3JkaW5hdGUgY2F0YWxvZyBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZVN5c3RlbShTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCi0gICAgICAgICAgICBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgYXBwbGljYWJsZSBVUkkuCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogSWYgYSBVUkkgZW50cnkgZXhpc3RzIGluIHRoZSBDYXRhbG9nIGZvciB0aGUgVVJJIHNwZWNpZmllZCwgcmV0dXJuIHRoZQotICAgICAqIG1hcHBlZCB2YWx1ZS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogVVJJIGNvbXBhcmlzb24gaXMgY2FzZSBzZW5zaXRpdmUuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKiAgICAgICAgICAgIFRoZSBVUkkgdG8gbG9jYXRlIGluIHRoZSBjYXRhbG9nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHJlc29sdmVkIFVSSS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIFRoZSBzeXN0ZW0gaWRlbnRpZmllciBvZiBhIHN1Ym9yZGluYXRlIGNhdGFsb2cgY2Fubm90IGJlCi0gICAgICogICAgICAgICAgICAgdHVybmVkIGludG8gYSB2YWxpZCBVUkwuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIEVycm9yIHJlYWRpbmcgc3Vib3JkaW5hdGUgY2F0YWxvZyBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZVVSSShTdHJpbmcgdXJpKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAotICAgICAgICAgICAgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGNhdGFsb2cgZWxlbWVudCB0byB0aGUgY29sbGVjdGlvbiBvZiB0aGUgY2F0YWxvZyBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudCAtCi0gICAgICogICAgICAgICAgICBjYXRhbG9nIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDYXRhbG9nRWxlbWVudChJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGNhdGFsb2cgZWxlbWVudCBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIHRoZSBjYXRhbG9nIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBlbGVtZW50IC0KLSAgICAgKiAgICAgICAgICAgIGNhdGFsb2cgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNhdGFsb2dFbGVtZW50KElDYXRhbG9nRWxlbWVudCBlbGVtZW50KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgY2F0YWxvZyBlbGVtZW50cyBvZiB0eXBlIElDYXRhbG9nRWxlbWVudC5UWVBFX0VOVFJZCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBjYXRhbG9nIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIElDYXRhbG9nRW50cnlbXSBnZXRDYXRhbG9nRW50cmllcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBjYXRhbG9nIGVsZW1lbnRzIG9mIHR5cGUKLSAgICAgKiBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9ERUxFR0FURQotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY2F0YWxvZyBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBJTmV4dENhdGFsb2dbXSBnZXROZXh0Q2F0YWxvZ3MoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgbmV3IGNhdGFsb2cgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZS4gSWYgdGhlIHR5cGUgaXMgb25lCi0gICAgICogb2YgRUxFTUVOVF9UWVBFLCB0aGUgcmVzdWx0IGVudHJ5IHdpbGwgaGF2ZSBjb3JyZXNwb25kaW5nIGludGVyZmFjZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIElDYXRhbG9nRWxlbWVudCBjcmVhdGVDYXRhbG9nRWxlbWVudChpbnQgdHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCB0aGUgZWxlbWVudHMgZnJvbSB0aGlzIGNhdGFsb2cuCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKTsKLSAgICAKLSAgICAvL3B1YmxpYyB2b2lkIGxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qCi0gICAgICogTG9hZHMgY2F0YWxvZyBmcm9tIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uIEV4cGVjdGluZyBPQVNJUyBYTUwgQ2F0YWxvZwotICAgICAqIGZvcm1hdAotICAgICAqIAotICAgICAqIEBwYXJhbSBsb2NhdGlvbiAtCi0gICAgICogICAgICAgICAgICB1cmkgb2YgdGhlIGZpbGUgd2hlcmUgY2F0YWxvZyB3aWxsIGJlIHNhdmVkCi0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0KLSAgICAgKiAgICAgICAgICAgICBwcm9ibGVtIGxvYWRpbmcgZmlsZQotICAgICAqIAotICAgICAqLwotICAgIC8vcHVibGljIHZvaWQgbG9hZChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoKLSAgICAgKiBTYXZlcyBjYXRhbG9nIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW4gT0FTSVMgWE1MIENhdGFsb2cgZm9ybWF0Ci0gICAgICogCi0gICAgICogQHBhcmFtIGxvY2F0aW9uIC0KLSAgICAgKiAgICAgICAgICAgIHVyaSBvZiB0aGUgZmlsZSB3aGVyZSBjYXRhbG9nIHdpbGwgYmUgc2F2ZWQKLQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gLQotICAgICAqICAgICAgICAgICAgIHByb2JsZW0gc2F2aW5nIGZpbGUKLSAgICAgKiAKLSAgICAgKi8KLSAgICAvL3B1YmxpYyB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgY29waWVzIGFsbCBjYXRhbG9nIGVudHJpZXMgZnJvbSBzb3VyY2UgY2F0YWxvZyB0byB0aGlzIG9uZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2F0YWxvZyAtCi0gICAgICogICAgICAgICAgICBzb3VyY2UgY2F0YWxvZwotICAgICAqIEBwYXJhbSBpbmNsdWRlTmVzdGVkIC0KLSAgICAgKiAgICAgICAgICAgIGEgYm9vbGVhbiBmbGFnIGluZGljYXRpbmcgd2V0aGVyIHRvIGluY2x1ZGUgZW50cmllcyBvZiB0aGUKLSAgICAgKiAgICAgICAgICAgIHNhbWUgdHlwZSBmcm9tIHRoZSBuZXN0ZWQgY2F0YWxvZ3MKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRFbnRyaWVzRnJvbUNhdGFsb2coSUNhdGFsb2cgY2F0YWxvZyk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbGlzdGVuZXIgb2YgdGhlIGNhdGFsb2cgZXZlbnRzCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIC0KLSAgICAgKiAgICAgICAgICAgIGxpc3RlbmVyIG9mIHRoZSBjYXRhbG9nIGV2ZW50cwotICAgICAqIEBzZWUgSUNhdGFsb2dFdmVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElDYXRhbG9nTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIGxpc3RlbmVyIG9mIHRoZSBjYXRhbG9nIGV2ZW50cwotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lciAtCi0gICAgICogICAgICAgICAgICBsaXN0ZW5lciBvZiB0aGUgY2F0YWxvZyBldmVudHMKLSAgICAgKiBAc2VlIElDYXRhbG9nRXZlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJQ2F0YWxvZ0xpc3RlbmVyIGxpc3RlbmVyKTsgICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2dFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MDU1YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2dFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWw7Ci0KLQotLyoqCi0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2F0YWxvZ0VsZW1lbnQKLXsKLSAgICAvKiogVHlwZXMgb2YgdGhlIGNhdGFsb2cgZW50cmllcyAqLwotICAgIC8qKiBUaGUgUFVCTElDLCBVUkkgb3IgU1lTVEVNIENhdGFsb2cgRW50cnkuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9FTlRSWSA9IDE7Ci0KLSAgICAvKiogVGhlIE5FWFRfQ0FUQUxPRyBDYXRhbG9nIEVudHJ5IHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9ORVhUX0NBVEFMT0cgPSAxMDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBpbnQgZ2V0VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSB3aXRoIHNwZWNpZmllZCBuYW1lLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgd2l0aCBzcGVjaWZpZWQgbmFtZS4KLSAgICAgKiBAc2VlICNzZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcpCi0gICAgICovCi0gICAgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBuYW1lZCBhdHRyaWJ1dGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCB3aWxsIGJlIHNldAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgbmFtZWQgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldEF0dHJpYnV0ZVZhbHVlKCkKLSAgICAgKi8KLSAgICB2b2lkIHNldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBhdHRyaWJ1dGUgbmFtZXMgZm9yIGFueSBkeW5hbWljIGF0dHJpYnV0ZXMgdGhhdCBtYXkgZXhpc3QKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFycmF5IG9mIGF0dHJpYnV0ZSBuYW1lcwotICAgICAqIEBzZWUgI2dldEF0dHJpYnV0ZVZhbHVlKCkKLSAgICAgKiBAc2VlICNzZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcpCi0gICAgICovCi0gICAgU3RyaW5nW10gZ2V0QXR0cmlidXRlcygpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgZWxlbWVudCdzIGlkIHN0cmluZwotICAgICAqIAotICAgICAqIEByZXR1cm4gZWxlbWVudCdzIGlkIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIGVsZW1lbnQncyBpZCBzdHJpbmcKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldE93bmVyQ2F0YWxvZyhJQ2F0YWxvZyBjYXRhbG9nKTsKLSAgICAKLSAgICBwdWJsaWMgSUNhdGFsb2cgZ2V0T3duZXJDYXRhbG9nKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0VudHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0VudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MWNiZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2dFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsOwotCi0vKioKLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYXRhbG9nRW50cnkgZXh0ZW5kcyBJQ2F0YWxvZ0VsZW1lbnQKLXsKLSAgICAvKiogVGhlIFNZU1RFTSBDYXRhbG9nIEVudHJ5IHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5UUllfVFlQRV9QVUJMSUMgPSAyOwotCi0gICAgLyoqIFRoZSBTWVNURU0gQ2F0YWxvZyBFbnRyeSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVFJZX1RZUEVfU1lTVEVNID0gMzsKLQotICAgIC8qKiBUaGUgVVJJIENhdGFsb2cgRW50cnkgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRSWV9UWVBFX1VSSSA9IDQ7Ci0KLSAgICAvKiogQXR0cmlidXRlIG5hbWUgZm9yIFdlYiBhZGRyZXNzIG9mIGNhdGFsb2cgZW50cnkgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1dFQl9VUkwgPSAid2ViVVJMIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGVudHJ5VHlwZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVudHJ5VHlwZShpbnQgZW50cnlUeXBlKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEVudHJ5VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VVJJKFN0cmluZyB1cmkpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2dFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2dFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODI1NzY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbDsKLQotCi0KLS8qKgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNhdGFsb2dFdmVudAotewotICAgIC8qKiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIQU5HRUQgPSAwOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9BRERFRCA9IDE7Ci0KLSAgICAvKiogKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UX1JFTU9WRUQgPSAyOwotCi0gICAgLyoqICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9DSEFOR0VEID0gMzsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEV2ZW50VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBJQ2F0YWxvZyBnZXRDYXRhbG9nKCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIElDYXRhbG9nRWxlbWVudCBnZXRDYXRhbG9nRWxlbWVudCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2dMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2dMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzNkYzBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbDsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi0KLS8qKgotICogVGhlIGNsaWVudHMgb2YgdGhlIGNhdGFsb2cgdGhhdCB3YW50IHRvIGxpc3RlbiB0byBjYXRhbG9nIGNoYW5nZXMgc2hvdWxkCi0gKiBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKiAKLSAqIEBzZWUgSUNhdGFsb2csIElDYXRhbG9nRXZlbnQsCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2F0YWxvZ0xpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcgotewotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGFsbG93cyB0byByZWFjdCB0byBjYXRhbG9nIGV2ZW50cwotICAgICAqIAotICAgICAqIEBwYXJhbSBldmVudCAtCi0gICAgICogICAgICAgICAgICBhbiBldmVudCB0aGF0IGNsaWVudCBzaG91bGQgcmVhY3QgdG8KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjYXRhbG9nQ2hhbmdlZChJQ2F0YWxvZ0V2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lOZXh0Q2F0YWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSU5leHRDYXRhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YzkzOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSU5leHRDYXRhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWw7Ci0KLQotCi0vKioKLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbmV4dENhdGFsb2cgT0FTSVMgWE1MIGNhdGFsb2cgZWxlbWVudC4gT2JqZWN0IG9mIHRoZQotICogY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlIHdvdWxkIHNlcnZlIGFzIGEgcmVmZXJlbmNlIHRvIHRoZQotICogY2F0YWxvZyBvYmplY3QuCi0gKiAKLSAqIEBzZWUgSUNhdGFsb2csIElDYXRhbG9nRWxlbWVudAotICogCi0gKiBUaGlzIGludGVyZmFjZSBjdXJyZW50bHkgaXMgdXNlZCBvbmx5IGJ5IHRoZSBjYXRhbG9nIGl0c2VsZi4gTmVlZCB0byBmaW5kIGlmCi0gKiB0aGVyZSBhcmUgYW55IGNsaWVudHMgdGhhdCBuZWVkIGl0LgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5leHRDYXRhbG9nIGV4dGVuZHMgSUNhdGFsb2dFbGVtZW50Ci17Ci0gICAgLyoqCi0gICAgICogU2V0IGxvY2F0aW9uIG9mIHRoZSByZWZlcmVuY2VkIGNhdGFsb2cuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaSAtCi0gICAgICogICAgICAgICAgICBsb2NhdGlvbiB1cmkgb2YgdGhlIHJlZmVyZW5jZWQgY2F0YWxvZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENhdGFsb2dMb2NhdGlvbihTdHJpbmcgdXJpKTsKLQotICAgIC8qKgotICAgICAqIEdldCBsb2NhdGlvbiB1cmkgb2YgdGhlIHJlZmVyZW5jZWQgY2F0YWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGxvY2F0aW9uIHVyaSBvZiB0aGUgcmVmZXJlbmNlZCBjYXRhbG9nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDYXRhbG9nTG9jYXRpb24oKTsKLSAgICAKLSAgICBwdWJsaWMgSUNhdGFsb2cgZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLQotICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01BbnlFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01BbnlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYTQ3MDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQW55RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLS8qKgotICogQ01BbnlFbGVtZW50IGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNQW55RWxlbWVudCBleHRlbmRzIENNQ29udGVudCB7Ci0vKioKLSAqIGdldE5hbWVzcGFjZVVSSSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICovCi1TdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmNzE4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLS8qKgotICogQXR0cmlidXRlRGVjbGFyYXRpb24gaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBleHRlbmRzIENNTm9kZSB7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElPTkFMICAgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVSVJFRCAgID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklYRUQgICAgICA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0hJQklURUQgPSA0OwotLyoqCi0gKiBnZXRBdHRyTmFtZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICovCi1TdHJpbmcgZ2V0QXR0ck5hbWUoKTsKLS8qKgotICogZ2V0QXR0clR5cGUgbWV0aG9kCi0gKiBAcmV0dXJuIENNRGF0YVR5cGUKLSAqLwotQ01EYXRhVHlwZSBnZXRBdHRyVHlwZSgpOwotLyoqCi0gKiBnZXREZWZhdWx0VmFsdWUgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqIEBkZXByZWNhdGVkIC0tIHRvIGJlIHJlcGxhY2VkIGluIGZ1dHVyZSB3aXRoIGFkZGl0aW9uYWwgQ01EYXRhVHlwZSBtZXRob2RzIChjdXJyZW50bHkgZm91bmQgb24gQ01EYXRhVHlwZUhlbHBlcikKLSAqLwotU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpOwotLyoqCi0gKiBnZXRFbnVtQXR0ciBtZXRob2QKLSAqIEByZXR1cm4gamF2YS51dGlsLkVudW1lcmF0aW9uCi0gKiBAZGVwcmVjYXRlZCAtLSB0byBiZSByZXBsYWNlZCBpbiBmdXR1cmUgd2l0aCBhZGRpdGlvbmFsIENNRGF0YVR5cGUgbWV0aG9kcyAoY3VycmVudGx5IGZvdW5kIG9uIENNRGF0YVR5cGVIZWxwZXIpCi0gKi8KLUVudW1lcmF0aW9uIGdldEVudW1BdHRyKCk7Ci0vKioKLSAqIGdldFVzYWdlIG1ldGhvZAotICogQHJldHVybiBpbnQKLSAqLwotaW50IGdldFVzYWdlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Db250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Db250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOGIyOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQ29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ01Db250ZW50IGV4dGVuZHMgQ01Ob2RlCi17Ci0vKioKLSAqIGdldE1heE9jY3VyIG1ldGhvZAotICogQHJldHVybiBpbnQKLSAqCi0gKiBJZiAtMSwgaXQncyBVTkJPVU5ERUQuCi0gKi8KLWludCBnZXRNYXhPY2N1cigpOwotLyoqCi0gKiBnZXRNaW5PY2N1ciBtZXRob2QKLSAqIEByZXR1cm4gaW50Ci0gKgotICogSWYgMCwgaXQncyBPUFRJT05BTC4KLSAqIElmIDEsIGl0J3MgUkVRVUlSRUQuCi0gKi8KLWludCBnZXRNaW5PY2N1cigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRGF0YVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURhdGFUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDlmNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRGF0YVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIENNRGF0YVR5cGUKLSAqLwotcHVibGljIGludGVyZmFjZSBDTURhdGFUeXBlIGV4dGVuZHMgQ01Ob2RlIHsKLSAgICAKLSAgLy8gdG9kby4uLiBhdCBzb21lIHBvaW50IHdlIHNob3VsZCByZW1vdmUgdGhlc2UgbmFtZXMgdG8KLSAgLy8gYXZvaWQgZXhwb3NpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyB2aWEgdGhlIGludGVyZmFjZXMKLSAgLy8KLQlzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBID0gIkNEQVRBIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiSUQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBJRFJFRiA9ICJJRFJFRiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWSA9ICJFTlRJVFkiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVElFUyA9ICJFTlRJVElFUyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OID0gIk5PVEFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTk1UT0tFTiA9ICJOTVRPS0VOIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTk1UT0tFTlMgPSAiTk1UT0tFTlMiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBOVU1CRVIgPSAiTlVNQkVSIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJID0gIlVSSSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVOVU0gPSAiRU5VTSI7IC8vJE5PTi1OTFMtMSQKLQotICBzdGF0aWMgZmluYWwgaW50IElNUExJRURfVkFMVUVfTk9ORSAgICAgICAgICAgICA9IDE7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgSU1QTElFRF9WQUxVRV9GSVhFRCAgICAgICAgICAgID0gMjsKLSAgc3RhdGljIGZpbmFsIGludCBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQgICAgICAgICAgPSAzOwotCi0vKioKLSAqIGdldFR5cGVOYW1lIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLVN0cmluZyBnZXREYXRhVHlwZU5hbWUoKTsgICAgCi0KLS8qKgotICogZ2V0SW1wbGllZFZhbHVlS2luZCBtZXRob2QKLSAqIEByZXR1cm4gaW50Ci0gKgotICogUmV0dXJucyBvbmUgb2YgOgotICogSU1QTElFRF9WQUxVRV9OT05FLCBJTVBMSUVEX1ZBTFVFX0ZJWEVELCBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQuCi0gKi8gICAgICAKLQotaW50IGdldEltcGxpZWRWYWx1ZUtpbmQoKTsgIAotCi0vKioKLSAqIGdldFR5cGVOYW1lIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nICAKLSAqCi0gKiBSZXR1cm5zIHRoZSBpbXBsaWVkIHZhbHVlIG9yIG51bGwgaWYgbm9uZSBleGlzdHMuCi0gKi8KLVN0cmluZyBnZXRJbXBsaWVkVmFsdWUoKTsKLQotLyoqCi0gKiBnZXRUeXBlTmFtZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0gKgotICovCi1TdHJpbmdbXSBnZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0KLS8qKgotICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqCi0gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgc3VpdGFibGUgZGVmYXVsdCB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gYW4gaW5zdGFuY2Ugb2YgdGhlIGRhdGEgdHlwZSBpcyBjcmVhdGVkLgotICogVGhpcyByZXR1cm5zIG51bGwgb2YgYSBzdWl0YWJsZSBkZWZhdWx0IGlzIG5vdCBhdmFpbGFibGUuCi0gKi8KLVN0cmluZyBnZW5lcmF0ZUluc3RhbmNlVmFsdWUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGQ3YTQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTURvY3VtZW50IGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnQgZXh0ZW5kcyBDTU5vZGUgewotLyoqCi0gKiBnZXRFbGVtZW50cyBtZXRob2QKLSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLSAqCi0gKiBSZXR1cm5zIENNTmFtZWROb2RlTWFwIG9mIEVsZW1lbnREZWNsYXJhdGlvbgotICovCi1DTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpOwotLyoqCi0gKiBnZXRFbnRpdGllcyBtZXRob2QKLSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLSAqCi0gKiBSZXR1cm5zIENNTmFtZWROb2RlTWFwIG9mIEVudGl0eURlY2xhcmF0aW9uCi0gKi8KLUNNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCk7Ci0vKioKLSAqIGdldE5hbWVzcGFjZSBtZXRob2QKLSAqIEByZXR1cm4gQ01OYW1lc3BhY2UKLSAqLwotQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZTRkOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLS8qKgotICogQ01Eb2N1bWVudGF0aW9uIGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnRhdGlvbiBleHRlbmRzIENNTm9kZSB7ICAgICAgICAKLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpOwotICBwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01FbGVtZW50RGVjbGFyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUVsZW1lbnREZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzQ4MDc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUVsZW1lbnREZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLS8qKgotICogQ01FbGVtZW50RGVjbGFyYXRpb24gaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01FbGVtZW50RGVjbGFyYXRpb24gZXh0ZW5kcyBDTUNvbnRlbnQgewotICAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTlkgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVNUFRZID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSVhFRCA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUENEQVRBID0gNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDREFUQSA9IDU7IC8vIHRvZG8uLi4gY2xhcmlmeSB0aGlzIG9uZQotLyoqCi0gKiBnZXRBdHRyaWJ1dGVzIG1ldGhvZAotICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotICoKLSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgQXR0cmlidXRlRGVjbGFyYXRpb24KLSAqLwotQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpOwotLyoqCi0gKiBnZXRDTUNvbnRlbnQgbWV0aG9kCi0gKiBAcmV0dXJuIENNQ29udGVudAotICoKLSAqIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGlzIGVsZW1lbnQncyBjb250ZW50IG1vZGVsLgotICogVGhpcyBjYW4gYmUgYW4gQ01FbGVtZW50RGVjbGFyYXRpb24gb3IgYSBDTUdyb3VwCi0gKi8KLUNNQ29udGVudCBnZXRDb250ZW50KCk7Ci0vKioKLSAqIGdldENvbnRlbnRUeXBlIG1ldGhvZAotICogQHJldHVybiBpbnQKLSAqCi0gKiBSZXR1cm5zIG9uZSBvZiA6Ci0gKiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQS4KLSAqLwotcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpOwotLyoqCi0gKiBnZXRFbGVtZW50TmFtZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICovCi1TdHJpbmcgZ2V0RWxlbWVudE5hbWUoKTsKLQotLyoqCi0gKiBnZXREYXRhVHlwZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICovCi1DTURhdGFUeXBlIGdldERhdGFUeXBlKCk7Ci0KLS8qKgotICogZ2V0TG9jYWxFbGVtZW50cyBtZXRob2QKLSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLSAqCi0gKiBSZXR1cm5zIGEgbGlzdCBvZiBsb2NhbGx5IGRlZmluZWQgZWxlbWVudHMuCi0gKi8KLUNNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUVudGl0eURlY2xhcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01FbnRpdHlEZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWI1NDM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUVudGl0eURlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTUVudGl0eURlY2xhcmF0aW9uIGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRW50aXR5RGVjbGFyYXRpb24gZXh0ZW5kcyBDTU5vZGUgewotICAKLS8qKgotICogZ2V0TmFtZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICovCi1TdHJpbmcgZ2V0TmFtZSgpOwotLyoqCi0gKiBnZXRWYWx1ZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICovCi1TdHJpbmcgZ2V0VmFsdWUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTAxY2E3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTUdyb3VwIGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNR3JvdXAgZXh0ZW5kcyBDTUNvbnRlbnQgewotICAKLQlzdGF0aWMgZmluYWwgaW50IEFMTCA9IDM7Ci0Jc3RhdGljIGZpbmFsIGludCBDSE9JQ0UgPSAyOwotCXN0YXRpYyBmaW5hbCBpbnQgU0VRVUVOQ0UgPSAxOwotLyoqCi0gKiBnZXRDaGlsZE5vZGVzIG1ldGhvZAotICogQHJldHVybiBDTU5vZGVMaXN0Ci0gKgotICogUmV0dXJucyBjaGlsZCBDTU5vZGVMaXN0LCB3aGljaCBpbmNsdWRlcyBFbGVtZW50RGVmaW5pdGlvbiBvciBDTUVsZW1lbnQuCi0gKi8KLUNNTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpOwotCi0vKioKLSAqIGdldE9wZXJhdGlvbiBtZXRob2QKLSAqIEByZXR1cm4gaW50Ci0gKgotICogUmV0dXJucyBvbmUgb2YgOgotICogQUxPTkUgKGEpLCBTRVFVRU5DRSAoYSxiKSwgQ0hPSUNFIChhfGIpLCBBTEwgKGEmYikuCi0gKi8KLWludCBnZXRPcGVyYXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTmFtZWROb2RlTWFwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lZE5vZGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3OWI4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lZE5vZGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLS8qKgotICogTmFtZWRDTU5vZGVNYXAKLSAqLwotcHVibGljIGludGVyZmFjZSBDTU5hbWVkTm9kZU1hcCB7Ci0vKioKLSAqIGdldExlbmd0aCBtZXRob2QKLSAqIEByZXR1cm4gaW50Ci0gKi8KLWludCBnZXRMZW5ndGgoKTsKLS8qKgotICogZ2V0TmFtZWRJdGVtIG1ldGhvZAotICogQHJldHVybiBDTU5vZGUKLSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLSAqLwotQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSk7Ci0vKioKLSAqIGl0ZW0gbWV0aG9kCi0gKiBAcmV0dXJuIENNTm9kZQotICogQHBhcmFtIGluZGV4IGludAotICovCi1DTU5vZGUgaXRlbShpbnQgaW5kZXgpOwotCi0vKioKLSAqCi0gKi8KLUl0ZXJhdG9yIGl0ZXJhdG9yKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5hbWVzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDBiY2JjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLS8qKgotICogQ01OYW1lc3BhY2UgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01OYW1lc3BhY2UgZXh0ZW5kcyBDTU5vZGUgewotICAKLS8qKgotICogZ2V0UHJlZml4IG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLVN0cmluZyBnZXRQcmVmaXgoKTsKLS8qKgotICogZ2V0VVJJIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLVN0cmluZyBnZXRVUkkoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJkOTVlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTU5vZGUgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Ob2RlIHsgICAgICAgIAotICAKLSAgc3RhdGljIGZpbmFsIGludCBBTllfRUxFTUVOVCAgICAgICAgICAgPSAxOwotCXN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFX0RFQ0xBUkFUSU9OID0gMjsKLQlzdGF0aWMgZmluYWwgaW50IERBVEFfVFlQRSAgICAgICAgICAgICA9IDM7Ci0Jc3RhdGljIGZpbmFsIGludCBET0NVTUVOVCAgICAgICAgICAgICAgPSA0OwotCXN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9ERUNMQVJBVElPTiAgID0gNTsKLQlzdGF0aWMgZmluYWwgaW50IEVOVElUWV9ERUNMQVJBVElPTiAgICA9IDY7Ci0Jc3RhdGljIGZpbmFsIGludCBHUk9VUCAgICAgICAgICAgICAgICAgPSA3OwotICBzdGF0aWMgZmluYWwgaW50IE5BTUVfU1BBQ0UgICAgICAgICAgICA9IDg7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgRE9DVU1FTlRBVElPTiAgICAgICAgID0gOTsKLS8qKgotICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotU3RyaW5nIGdldE5vZGVOYW1lKCk7Ci0vKioKLSAqIGdldE5vZGVUeXBlIG1ldGhvZAotICogQHJldHVybiBpbnQKLSAqCi0gKiBSZXR1cm5zIG9uZSBvZiA6Ci0gKgotICovCi1pbnQgZ2V0Tm9kZVR5cGUoKTsKLQotLyoqCi0gKiBzdXBwb3J0cyBtZXRob2QKLSAqIEByZXR1cm4gYm9vbGVhbgotICoKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0gKgotICovCi1ib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0vKioKLSAqIGdldFByb3BlcnR5IG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0gKgotICogUmV0dXJucyB0aGUgb2JqZWN0IHByb3BlcnR5IGRlc2NpcGVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUKLSAqCi0gKi8KLU9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsgLy90b2RvIHRocm93IHVuc3VwcG9ydGVkIHByb3BlcnR5IGV4Y2VwdGlvbgotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRhZGJmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLS8qKgotICogQ01Ob2RlTGlzdCBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBDTU5vZGVMaXN0IHsKLSAgCi0vKioKLSAqIGdldExlbmd0aCBtZXRob2QKLSAqIEByZXR1cm4gaW50Ci0gKi8KLWludCBnZXRMZW5ndGgoKTsKLS8qKgotICogaXRlbSBtZXRob2QKLSAqIEByZXR1cm4gQ01Ob2RlCi0gKiBAcGFyYW0gaW5kZXggaW50Ci0gKi8KLUNNTm9kZSBpdGVtKGludCBpbmRleCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ29udGVudE1vZGVsTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NvbnRlbnRNb2RlbE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAyYjE2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ29udGVudE1vZGVsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5LkNNRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuZmFjdG9yeS5DTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuZmFjdG9yeS5DTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5UmVhZGVyOwotCi0KLS8qKgotICogQ29udGVudE1vZGVsTWFuYWdlciBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudE1vZGVsTWFuYWdlciBleHRlbmRzIFBsdWdpbiB7Ci0JLy8gcHJpdmF0ZSBzdGF0aWMgSW5mZXJyZWRHcmFtbWFyRmFjdG9yeSBpbmZlcnJlZEdyYW1tYXJGYWN0b3J5OwotCXByaXZhdGUgQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSBjbURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5OwotCXByaXZhdGUgQW5ub3RhdGlvbkZpbGVSZWdpc3RyeSBhbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5OwotCi0JcHJpdmF0ZSBzdGF0aWMgQ29udGVudE1vZGVsTWFuYWdlciBpbnN0YW5jZTsKLQotCXB1YmxpYyBDb250ZW50TW9kZWxNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29udGVudE1vZGVsTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IENvbnRlbnRNb2RlbE1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudChTdHJpbmcgdXJpLCBTdHJpbmcgcmVzb3VyY2VUeXBlKSB7Ci0JCWlmIChyZXNvdXJjZVR5cGUgPT0gbnVsbCAmJiB1cmkgIT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gdXJpLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc291cmNlVHlwZSA9IHVyaS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJfQotCi0JCWlmIChyZXNvdXJjZVR5cGUgIT0gbnVsbCkgewotCQkJcmVzb3VyY2VUeXBlID0gcmVzb3VyY2VUeXBlLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJQ01Eb2N1bWVudEZhY3RvcnkgZmFjdG9yeSA9IGdldENNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkoKS5nZXRGYWN0b3J5KHJlc291cmNlVHlwZSk7Ci0JCXJldHVybiBmYWN0b3J5ICE9IG51bGwgPyBmYWN0b3J5LmNyZWF0ZUNNRG9jdW1lbnQodXJpKSA6IG51bGw7Ci0JfQotCi0KLQlwcml2YXRlIENNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkgZ2V0Q01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJaWYgKGNtRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkgPT0gbnVsbCkgewotCQkJY21Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSA9IG5ldyBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCQluZXcgQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeVJlYWRlcihjbURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5KS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gY21Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeTsKLQl9Ci0KLQotCXB1YmxpYyBMaXN0IGdldEFubm90YXRpb25GaWxlc0luZm9zKFN0cmluZyBwdWJsaWNJZCkgewotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbkZpbGVSZWdpc3RyeSgpLmdldEFubm90YXRpb25GaWxlc0luZm9zKHB1YmxpY0lkKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25GaWxlUmVnaXN0cnkgZ2V0QW5ub3RhdGlvbkZpbGVSZWdpc3RyeSgpIHsKLQkJaWYgKGFubm90YXRpb25GaWxlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJYW5ub3RhdGlvbkZpbGVSZWdpc3RyeSA9IG5ldyBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5KCk7Ci0JCQluZXcgQW5ub3RhdGlvbkZpbGVSZWdpc3RyeVJlYWRlcihhbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5KS5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gYW5ub3RhdGlvbkZpbGVSZWdpc3RyeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYTNiMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Fubm90YXRpb24vQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0gICAgICAgICAKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uCi17ICAgICAgIAotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGhhc2h0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgQW5ub3RhdGlvbigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNwZWMoU3RyaW5nIHNwZWMpCi0gIHsKLSAgICBoYXNodGFibGUucHV0KCJzcGVjIiwgc3BlYyk7IC8vJE5PTi1OTFMtMSQKLSAgfSAgICAgCi0KLSAgcHVibGljIFN0cmluZyBnZXRTcGVjKCkKLSAgewotICAgIHJldHVybiAoU3RyaW5nKWhhc2h0YWJsZS5nZXQoInNwZWMiKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0gICAgICAKLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaGFzaHRhYmxlLnB1dChuYW1lLCB2YWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsgICAgIAotICAgIHJldHVybiAoU3RyaW5nKWhhc2h0YWJsZS5nZXQocHJvcGVydHlOYW1lKTsKLSAgfSAgICAKLQotICBwdWJsaWMgTGlzdCBnZXRBdHRyaWJ1dGVMaXN0KCkKLSAgewotICAgIHJldHVybiBudWxsOyAvLyB0b2RvCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9hbm5vdGF0aW9uL0Fubm90YXRpb25NYXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9hbm5vdGF0aW9uL0Fubm90YXRpb25NYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI5MzAzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb24uQW5ub3RhdGlvbkZpbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmlsZVBhcnNlcjsKLQotCi0vKioKLSAqIEFubm90YXRpb25NYXAKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25NYXAgewotCXByb3RlY3RlZCBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JcHJvdGVjdGVkIEhhc2h0YWJsZSBoYXNodGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlID0gdHJ1ZTsKLQotCXB1YmxpYyBBbm5vdGF0aW9uTWFwKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhc2VTZW5zaXRpdmUoYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKLQkJdGhpcy5pc0Nhc2VTZW5zaXRpdmUgPSBpc0Nhc2VTZW5zaXRpdmU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJU3RyaW5nIHNwZWMgPSBhbm5vdGF0aW9uLmdldFNwZWMoKTsKLQkJaWYgKHNwZWMgIT0gbnVsbCkgewotCQkJbGlzdC5hZGQoYW5ub3RhdGlvbik7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNwZWMsICJbXXxcdFxuXHJcZiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjbU5vZGVTcGVjID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJYWRkQW5ub3RhdGlvbkZvckNNTm9kZVNwZWMoY21Ob2RlU3BlYywgYW5ub3RhdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uRm9yQ01Ob2RlU3BlYyhTdHJpbmcgY21Ob2RlU3BlYywgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCVN0cmluZyBrZXkgPSBpc0Nhc2VTZW5zaXRpdmUgPyBjbU5vZGVTcGVjIDogY21Ob2RlU3BlYy50b0xvd2VyQ2FzZSgpOwotCQlMaXN0IGxpc3QgPSAoTGlzdCkgaGFzaHRhYmxlLmdldChrZXkpOwotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQlsaXN0ID0gbmV3IFZlY3RvcigpOwotCi0JCQloYXNodGFibGUucHV0KGtleSwgbGlzdCk7Ci0JCX0KLQkJbGlzdC5hZGQoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgY21Ob2RlU3BlYywgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIGtleSA9IGlzQ2FzZVNlbnNpdGl2ZSA/IGNtTm9kZVNwZWMgOiBjbU5vZGVTcGVjLnRvTG93ZXJDYXNlKCk7Ci0JCUxpc3QgYW5ub3RhdGlvbkxpc3QgPSAoTGlzdCkgaGFzaHRhYmxlLmdldChrZXkpOwotCQlpZiAoYW5ub3RhdGlvbkxpc3QgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gYW5ub3RhdGlvbkxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEFubm90YXRpb24pIGkubmV4dCgpOwotCQkJCXJlc3VsdCA9IGFubm90YXRpb24uZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShDTU5vZGUgY21Ob2RlLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgY21Ob2RlU3BlYyA9IChTdHJpbmcpIGNtTm9kZS5nZXRQcm9wZXJ0eSgic3BlYyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChjbU5vZGVTcGVjID09IG51bGwpIHsKLQkJCWNtTm9kZVNwZWMgPSBjbU5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJfQotCQlpZiAoY21Ob2RlU3BlYyAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRQcm9wZXJ0eShjbU5vZGVTcGVjLCBwcm9wZXJ0eU5hbWUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWQoU3RyaW5nIHVyaSwgU3RyaW5nIGJ1bmRsZUlkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQW5ub3RhdGlvbkZpbGVQYXJzZXIgcGFyc2VyID0gbmV3IEFubm90YXRpb25GaWxlUGFyc2VyKCk7Ci0JCUFubm90YXRpb25GaWxlSW5mbyBmaWxlSW5mbyA9IG5ldyBBbm5vdGF0aW9uRmlsZUluZm8odXJpLCBidW5kbGVJZCk7Ci0JCXBhcnNlci5wYXJzZSh0aGlzLCBmaWxlSW5mbyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNQW55RWxlbWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUFueUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMDBhOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNQW55RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIENNQW55RWxlbWVudEltcGwgZXh0ZW5kcyBDTUNvbnRlbnRJbXBsIGltcGxlbWVudHMgQ01BbnlFbGVtZW50Ci17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlVVJJOyAgCi0KLSAgcHVibGljIENNQW55RWxlbWVudEltcGwoU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgewotICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotICAgIG1pbk9jY3VyID0gLTE7Ci0gIH0gICAgICAgICAgICAgCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU5vZGVOYW1lKFN0cmluZyB1cmkpCi0gIHsKLSAgICByZXR1cm4gdXJpICE9IG51bGwgPyAoImFueSMiICsgdXJpKSA6ICJhbnkiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgfQotCi0gIC8vIGltcGxlbWVudHMgQ01Ob2RlCi0gIC8vCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGNvbXB1dGVOb2RlTmFtZShuYW1lc3BhY2VVUkkpOwotICB9Ci0gCi0gIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIEFOWV9FTEVNRU5UOwotICB9IAotCi0gIC8vIGltcGxlbWVudHMgQ01BbnlFbGVtZW50Ci0gIC8vCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkKLSAgewotICAgIHJldHVybiBuYW1lc3BhY2VVUkk7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZGY0ZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbgotewotICBwcm90ZWN0ZWQgQ01EYXRhVHlwZSBkYXRhVHlwZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBub2RlTmFtZTsgICAgCi0gIHByb3RlY3RlZCBpbnQgdXNhZ2U7ICAKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnQgY21Eb2N1bWVudDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJlZml4UXVhbGlmaWNhdGlvbjsKLSAgcHJvdGVjdGVkIExpc3QgeHNpVHlwZXM7Ci0gICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbChTdHJpbmcgbm9kZU5hbWUsIGludCB1c2FnZSkKLSAgewotICAgIHRoaXMobm9kZU5hbWUsIHVzYWdlLCBudWxsKTsKLSAgfSAgICAgCi0KLSAgcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsKFN0cmluZyBub2RlTmFtZSwgaW50IHVzYWdlLCBDTURhdGFUeXBlIGRhdGFUeXBlKQotICB7ICAgICAgICAKLSAgICB0aGlzLm5vZGVOYW1lID0gbm9kZU5hbWU7Ci0gICAgdGhpcy51c2FnZSA9IHVzYWdlOwotICAgIHRoaXMuZGF0YVR5cGUgPSBkYXRhVHlwZTsgCi0gIH0gICAgCi0KLSAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTjsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBudWxsOyAgIAotICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJDTURvY3VtZW50IikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICByZXN1bHQgPSBjbURvY3VtZW50OwotICAgIH0gCi0gICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiWFNJVHlwZXMiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcmVzdWx0ID0geHNpVHlwZXM7Ci0gICAgfQotICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9uc1ByZWZpeFF1YWxpZmljYXRpb24iKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJlc3VsdCA9IHByZWZpeFF1YWxpZmljYXRpb24gPyAicXVhbGlmaWVkIiA6ICJ1bnF1YWxpZmllZCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0gIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHJlZml4UXVhbGlmaWNhdGlvbihib29sZWFuIHF1YWxpZmllZCkKLSAgewotICAgIHByZWZpeFF1YWxpZmljYXRpb24gPSBxdWFsaWZpZWQ7Ci0gIH0gICAgICAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIHNldFhTSVR5cGVzKExpc3QgbGlzdCkKLSAgewotICAgIHhzaVR5cGVzID0gbGlzdDsKLSAgfQotICAgICAKLSAgcHVibGljIHZvaWQgc2V0Q01Eb2N1bWVudChDTURvY3VtZW50IGNtRG9jdW1lbnQpCi0gIHsKLSAgICB0aGlzLmNtRG9jdW1lbnQgPSBjbURvY3VtZW50OwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbm9kZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEF0dHJOYW1lKCkKLSAgewotICAgIHJldHVybiBub2RlTmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEF0dHJUeXBlKENNRGF0YVR5cGUgZGF0YVR5cGUpCi0gIHsKLSAgICB0aGlzLmRhdGFUeXBlID0gZGF0YVR5cGU7Ci0gIH0KLQotICBwdWJsaWMgQ01EYXRhVHlwZSBnZXRBdHRyVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZGF0YVR5cGU7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldFVzYWdlKCkKLSAgewotICAgIHJldHVybiB1c2FnZTsKLSAgfQotICAgICAgICAgICAKLSAgLyoqIEBkZXByZWNhdGVkICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkKLSAgewotICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICB9ICAgICAgICAgICAgICAgICAKLQotICAvKiogQGRlcHJlY2F0ZWQgKi8KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldEVudW1BdHRyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Db250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNQ29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1N2VlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Db250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ01Db250ZW50SW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBDTUNvbnRlbnQKLXsKLSAgcHJvdGVjdGVkIGludCBtaW5PY2N1ciA9IDA7Ci0gIHByb3RlY3RlZCBpbnQgbWF4T2NjdXIgPSAtMTsgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gIC8vIGltcGxlbWVudHMgQ01Db250ZW50Ci0gIC8vCi0gIHB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKQotICB7Ci0gICAgcmV0dXJuIG1heE9jY3VyOwotICB9ICAgICAgICAgIAotIAotICBwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkKLSAgewotICAgIHJldHVybiBtaW5PY2N1cjsKLSAgfSAgCi0gICAgIAotICAvLyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYwotICAvLwotICBwdWJsaWMgdm9pZCBzZXRNYXhPY2N1cihpbnQgbikKLSAgewotICAgIG1heE9jY3VyID0gbjsKLSAgfSAgICAgICAgICAKLSAKLSAgcHVibGljIHZvaWQgc2V0TWluT2NjdXIoaW50IG4pCi0gIHsKLSAgICBtaW5PY2N1ciA9IG47Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01EYXRhVHlwZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTURhdGFUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDA0NjI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTURhdGFUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBDTURhdGFUeXBlSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBDTURhdGFUeXBlCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgZGF0YVR5cGVOYW1lOwotICBwcm90ZWN0ZWQgU3RyaW5nW10gZW51bWVyYXRlZFZhbHVlczsgICAgIAotICBwcm90ZWN0ZWQgU3RyaW5nIGluc3RhbmNlVmFsdWU7Ci0KLSAgcHVibGljIENNRGF0YVR5cGVJbXBsKFN0cmluZyBkYXRhVHlwZU5hbWUsIFN0cmluZyBpbnN0YW5jZVZhbHVlKQotICB7Ci0gICAgdGhpcy5kYXRhVHlwZU5hbWUgPSBkYXRhVHlwZU5hbWU7Ci0gICAgdGhpcy5pbnN0YW5jZVZhbHVlID0gaW5zdGFuY2VWYWx1ZTsKLSAgICB0aGlzLmVudW1lcmF0ZWRWYWx1ZXMgPSBuZXcgU3RyaW5nWzBdOwotICB9Ci0KLSAgcHVibGljIENNRGF0YVR5cGVJbXBsKFN0cmluZyBkYXRhVHlwZU5hbWUsIFN0cmluZ1tdIGVudW1lcmF0ZWRWYWx1ZXMpCi0gIHsKLSAgICB0aGlzLmRhdGFUeXBlTmFtZSA9IGRhdGFUeXBlTmFtZTsKLSAgICB0aGlzLmVudW1lcmF0ZWRWYWx1ZXMgPSBlbnVtZXJhdGVkVmFsdWVzOyAgIAotICAgIHRoaXMuaW5zdGFuY2VWYWx1ZSA9IGVudW1lcmF0ZWRWYWx1ZXNbMF07Ci0gIH0KLQotCi0gIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIENNTm9kZS5EQVRBX1RZUEU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgewotICAgIHJldHVybiBnZXREYXRhVHlwZU5hbWUoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGVOYW1lKCkKLSAgewotICAgIHJldHVybiBkYXRhVHlwZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEltcGxpZWRWYWx1ZUtpbmQoKQotICB7Ci0gICAgcmV0dXJuIElNUExJRURfVkFMVUVfTk9ORTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW1wbGllZFZhbHVlKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEVudW1lcmF0ZWRWYWx1ZXMoKQotICB7Ci0gICAgcmV0dXJuIGVudW1lcmF0ZWRWYWx1ZXM7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdlbmVyYXRlSW5zdGFuY2VWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gaW5zdGFuY2VWYWx1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRG9jdW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Eb2N1bWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M3NmE4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Eb2N1bWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLQotCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudEltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudAotewotICBwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLSAgcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBlbGVtZW50cyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBsb2NhbEVsZW1lbnRQb29sOwotICBwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIGFueUVsZW1lbnRzOwotCi0gIHB1YmxpYyBDTURvY3VtZW50SW1wbChTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKQotICB7Ci0gICAgdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgewotICAgIHJldHVybiBET0NVTUVOVDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gIH0KLSAKLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJlc3VsdCA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICB9ICAgICAgICAgICAgICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotCi0gIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudHM7Ci0gIH0KLQotICBwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsIGdldEFueUVsZW1lbnRzKCkKLSAgeyAKLSAgICBpZiAoYW55RWxlbWVudHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBhbnlFbGVtZW50cyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFueUVsZW1lbnRzOwotICB9Ci0gIAotICBwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsIGdldExvY2FsRWxlbWVudFBvb2woKQotICB7IAotICAgIGlmIChsb2NhbEVsZW1lbnRQb29sID09IG51bGwpCi0gICAgewotICAgICAgbG9jYWxFbGVtZW50UG9vbCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgICB9ICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gbG9jYWxFbGVtZW50UG9vbDsKLSAgfQotCi0gIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpCi0gIHsKLSAgICByZXR1cm4gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICB9Ci0KLSAgcHVibGljIENNTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRWxlbWVudERlY2xhcmF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRWxlbWVudERlY2xhcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODc5YjlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUVsZW1lbnREZWNsYXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwgZXh0ZW5kcyBDTUNvbnRlbnRJbXBsIGltcGxlbWVudHMgQ01FbGVtZW50RGVjbGFyYXRpb24KLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOyAgICAgICAgICAKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnQgY21Eb2N1bWVudDsKLSAgcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBhdHRyaWJ1dGVNYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0gIHByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgbG9jYWxFbGVtZW50TWFwID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICBwcm90ZWN0ZWQgQ01Db250ZW50IGNvbnRlbnQ7Ci0gIHByb3RlY3RlZCBDTURhdGFUeXBlIGRhdGFUeXBlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xvY2FsOwotCi0gIHB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwoQ01Eb2N1bWVudCBjbURvY3VtZW50LCBTdHJpbmcgbmFtZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMuY21Eb2N1bWVudCA9IGNtRG9jdW1lbnQ7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfSAgICAgCi0KLSAgLy8gaW1wbGVtZW50cyBDTU5vZGUKLSAgLy8KLSAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotIAotICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgewotICAgIHJldHVybiBFTEVNRU5UX0RFQ0xBUkFUSU9OOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7IAotICAgIE9iamVjdCByZXN1bHQgPSBudWxsOyAgICAgICAgICAgICAgIAotICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvbnNQcmVmaXhRdWFsaWZpY2F0aW9uIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICByZXN1bHQgPSBpc0xvY2FsID8gInVucXVhbGlmaWVkIiA6ICJxdWFsaWZpZWQiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB9ICAgIAotICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIkNNRG9jdW1lbnQiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJlc3VsdCA9IGNtRG9jdW1lbnQ7ICAgICAgIAotICAgIH0gICAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgICAgICAgICAgICAgICAKLSAgLy8gaW1wbGVtZW50cyBDTUVsZW1lbnREZWNsYXJhdGlvbgotICAvLwotICBwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpCi0gIHsKLSAgICByZXR1cm4gYXR0cmlidXRlTWFwOwotICB9ICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkKLSAgewotICAgIHJldHVybiBjb250ZW50OwotICB9Ci0KLSAgcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gTUlYRUQ7Ci0gIH0gICAgICAgICAgICAKLQotICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgcHVibGljIENNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKQotICB7IAotICAgIHJldHVybiBkYXRhVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRMb2NhbEVsZW1lbnRzKCkKLSAgeyAKLSAgICByZXR1cm4gbG9jYWxFbGVtZW50TWFwOwotICB9IAotICAgIAotICAvLwotICAvLwotICBwdWJsaWMgdm9pZCBzZXRDb250ZW50KENNQ29udGVudCBjbUNvbnRlbnQpCi0gIHsKLSAgICBjb250ZW50ID0gY21Db250ZW50OwotICB9ICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBzZXREYXRhVHlwZShDTURhdGFUeXBlIGNtRGF0YVR5cGUpCi0gIHsKLSAgICBkYXRhVHlwZSA9IGNtRGF0YVR5cGU7Ci0gIH0KLQotICBwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsIGdldEF0dHJpYnV0ZU1hcCgpCi0gIHsKLSAgICByZXR1cm4gYXR0cmlidXRlTWFwOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TG9jYWwoYm9vbGVhbiBpc0xvY2FsKQotICB7Ci0gICAgdGhpcy5pc0xvY2FsID0gaXNMb2NhbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRW50aXR5RGVjbGFyYXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVkOTdmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVudGl0eURlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgQ01FbnRpdHlEZWNsYXJhdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlOwotCi0gIHB1YmxpYyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgewotICAgIHJldHVybiBFTlRJVFlfREVDTEFSQVRJT047Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0gCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci19ICAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Hcm91cEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUdyb3VwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWM0ZWNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUdyb3VwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgQ01Hcm91cEltcGwgZXh0ZW5kcyBDTUNvbnRlbnRJbXBsIGltcGxlbWVudHMgQ01Hcm91cAotewotICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdCBub2RlTGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBpbnQgb3BlcmF0b3I7ICAKLQotICBwdWJsaWMgQ01Hcm91cEltcGwoQ01Ob2RlTGlzdCBub2RlTGlzdCwgaW50IG9wZXJhdG9yKQotICB7Ci0gICAgdGhpcy5ub2RlTGlzdCA9IG5vZGVMaXN0OwotICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIEdST1VQOwotICB9Ci0gCi0gIHB1YmxpYyBDTU5vZGVMaXN0IGdldENoaWxkTm9kZXMoKQotICB7Ci0gICAgcmV0dXJuIG5vZGVMaXN0OwotICB9Ci0KLSAgcHVibGljIGludCBnZXRPcGVyYXRvcigpCi0gIHsKLSAgICByZXR1cm4gb3BlcmF0b3I7Ci0gIH0gCi19ICAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZTYzZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNTmFtZWROb2RlTWFwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBDTU5hbWVkTm9kZU1hcEltcGwgaW1wbGVtZW50cyBDTU5hbWVkTm9kZU1hcCAKLXsKLSAgcHVibGljIHN0YXRpYyBDTU5hbWVkTm9kZU1hcEltcGwgRU1QVFlfTkFNRURfTk9ERV9NQVAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0gIHByb3RlY3RlZCBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgLyoqCi0gICAqIENNTmFtZWROb2RlTWFwSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotICAgKi8KLSAgcHVibGljIENNTmFtZWROb2RlTWFwSW1wbCgpCi0gIHsKLSAgCXN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsKENNTmFtZWROb2RlTWFwIGluaXRpYWxDb250ZW50c01hcCkgewotCQlzdXBlcigpOwotCQlpZiAoaW5pdGlhbENvbnRlbnRzTWFwICE9IG51bGwpIHsKLQkJCWludCBsZW5ndGggPSBpbml0aWFsQ29udGVudHNNYXAuZ2V0TGVuZ3RoKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7Ci0JCQkJcHV0KGluaXRpYWxDb250ZW50c01hcC5pdGVtKGopKTsKLQkJCX0KLQkJfQotCX0KLSAgLyoqCi0gICAqIGdldExlbmd0aCBtZXRob2QKLSAgICogQHJldHVybiBpbnQKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkKLSAgewotICAJcmV0dXJuIHRhYmxlLnNpemUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBnZXROYW1lZEl0ZW0gbWV0aG9kCi0gICAqIEByZXR1cm4gQ01Ob2RlCi0gICAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLSAgICovCi0gIHB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKQotICB7Ci0gIAlyZXR1cm4gKENNTm9kZSl0YWJsZS5nZXQobmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogaXRlbSBtZXRob2QKLSAgICogQHJldHVybiBDTU5vZGUKLSAgICogQHBhcmFtIGluZGV4IGludAotICAgKi8KLSAgcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkKLSAgewotICAgIENNTm9kZSByZXN1bHQgPSBudWxsOwotICAgIGludCBzaXplID0gdGFibGUuc2l6ZSgpOwotICAgIGlmIChpbmRleCA8IHNpemUpCi0gICAgewotICAgICAgRW51bWVyYXRpb24gdmFsdWVzID0gdGFibGUuZWxlbWVudHMoKTsKLSAgICAgIGZvcihpbnQgaSA9IDA7IGkgPD0gaW5kZXg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKENNTm9kZSl2YWx1ZXMubmV4dEVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgcHVibGljIEhhc2h0YWJsZSBnZXRIYXNodGFibGUoKQotICB7Ci0gICAgICAgICAgcmV0dXJuIHRhYmxlOwotICB9Ci0gIAotICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKQotICB7Ci0gICAgICAgICAgcmV0dXJuIHRhYmxlLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gIH0gICAgICAgIAotICAKLSAgcHVibGljIHZvaWQgcHV0KENNTm9kZSBjbU5vZGUpCi0gIHsKLSAgICB0YWJsZS5wdXQoY21Ob2RlLmdldE5vZGVOYW1lKCksIGNtTm9kZSk7Ci0gIH0KLX0KLSAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Ob2RlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyZTJhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Ob2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIENNTm9kZQoteyAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0luZmVycmVkID0gZmFsc2U7Ci0gICAKLSAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgfQotIAotICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IAotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgeyAgICAgICAgICAgICAgCi0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKCJpc0luZmVycmVkIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJlc3VsdCA9IGlzSW5mZXJyZWQgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotCi0gIHB1YmxpYyB2b2lkIHNldEluZmVycmVkKGJvb2xlYW4gaXNJbmZlcnJlZCkKLSAgewotICAgIHRoaXMuaXNJbmZlcnJlZCA9IGlzSW5mZXJyZWQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTU5vZGVMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNTm9kZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiY2JhMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNTm9kZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYzsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgQ01Ob2RlTGlzdEltcGwgaW1wbGVtZW50cyBDTU5vZGVMaXN0IAotewotICBwdWJsaWMgc3RhdGljIENNTm9kZUxpc3RJbXBsIEVNUFRZX05PREVfTElTVCA9IG5ldyBDTU5vZGVMaXN0SW1wbChDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLSAgcHJvdGVjdGVkIExpc3QgbGlzdDsKLQotICBwdWJsaWMgQ01Ob2RlTGlzdEltcGwoKQotICB7Ci0gICAgdGhpcyhuZXcgVmVjdG9yKCkpOwotICB9Ci0KLSAgcHVibGljIENNTm9kZUxpc3RJbXBsKExpc3QgbGlzdCkKLSAgewotICAgIHRoaXMubGlzdCA9IGxpc3Q7Ci0gIH0KLQotICAvKioKLSAgICogZ2V0TGVuZ3RoIG1ldGhvZAotICAgKiBAcmV0dXJuIGludAotICAgKi8KLSAgcHVibGljIGludCBnZXRMZW5ndGgoKQotICB7Ci0gICAgcmV0dXJuIGxpc3Quc2l6ZSgpOwotICB9Ci0gIC8qKgotICAgKiBpdGVtIG1ldGhvZAotICAgKiBAcmV0dXJuIENNTm9kZQotICAgKiBAcGFyYW0gaW5kZXggaW50Ci0gICAqLwotICBwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KQotICB7Ci0gICAgcmV0dXJuIChDTU5vZGUpbGlzdC5nZXQoaW5kZXgpOwotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRMaXN0KCkKLSAgewotICAgIHJldHVybiBsaXN0OwotICB9Ci0gIAotICBwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKQotICB7Ci0gICAgcmV0dXJuIGxpc3QuaXRlcmF0b3IoKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIHJldHVybiBsaXN0LmNvbnRhaW5zKGNtTm9kZSk7Ci0gIH0gCi0gIAotICBwdWJsaWMgdm9pZCBhZGQoQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIGxpc3QuYWRkKGNtTm9kZSk7Ci0gIH0gIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvZmFjdG9yeS9DTURvY3VtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0YmU5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvZmFjdG9yeS9DTURvY3VtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuZmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLQotLy8gdGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBidWlsZCBhIGdyYW1tYXIgZG9jdW1lbnQgZ2l2ZW4gYSBsb2NhbCBmaWxlIG5hbWUKLS8vCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnRGYWN0b3J5Ci17ICAgCi0gIHB1YmxpYyBDTURvY3VtZW50IGNyZWF0ZUNNRG9jdW1lbnQoU3RyaW5nIHVyaSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvZmFjdG9yeS9DTURvY3VtZW50RmFjdG9yeURlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzM3YjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuZmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yCi17Ci0gIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZFbGVtZW50OwotICBwcml2YXRlIENNRG9jdW1lbnRGYWN0b3J5IGZhY3Rvcnk7Ci0KLSAgcHVibGljIENNRG9jdW1lbnRGYWN0b3J5RGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHRoaXMuZkVsZW1lbnQgPSBlbGVtZW50OwotICB9Ci0KLSAgcHVibGljIENNRG9jdW1lbnRGYWN0b3J5IGdldEZhY3RvcnkoKQotICB7Ci0gICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZmFjdG9yeSA9IChDTURvY3VtZW50RmFjdG9yeSkgZkVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gbG9hZGluZyBDTURvY3VtZW50RmFjdG9yeSIsZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhY3Rvcnk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY0MDNiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvZmFjdG9yeS9DTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5IAotewotCXByb3RlY3RlZCBzdGF0aWMgQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSBpbnN0YW5jZTsKLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9SRVNPVVJDRV9UWVBFID0gIioiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgTWFwIHJlc291cmNlVHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcm90ZWN0ZWQgVmVjdG9yIGRvY3VtZW50QnVpbGRlckxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLQlwdWJsaWMgQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSgpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwdXRGYWN0b3J5KFN0cmluZyByZXNvdXJjZVR5cGUsIENNRG9jdW1lbnRGYWN0b3J5RGVzY3JpcHRvciBmYWN0b3J5RGVzY3JpcHRvcikgewotCQlyZXNvdXJjZVR5cGVNYXAucHV0KHJlc291cmNlVHlwZSwgZmFjdG9yeURlc2NyaXB0b3IpOwotCX0KLQotCXB1YmxpYyBDTURvY3VtZW50RmFjdG9yeSBnZXRGYWN0b3J5KFN0cmluZyByZXNvdXJjZVR5cGUpIHsKLQkJQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yIGZhY3RvcnlEZXNjcmlwdG9yID0gbnVsbDsKLQkJaWYgKHJlc291cmNlVHlwZSAhPSBudWxsKSB7Ci0JCQlmYWN0b3J5RGVzY3JpcHRvciA9IChDTURvY3VtZW50RmFjdG9yeURlc2NyaXB0b3IpIHJlc291cmNlVHlwZU1hcC5nZXQocmVzb3VyY2VUeXBlKTsKLQkJfQotCQlpZiAoZmFjdG9yeURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJLy8gKGRtdykgaXNzdWU6IGEgZGVmYXVsdCB0eXBlIG9mICcqJyBtZWFucyB3aGF0PyByZWdpc3RlcmVkIGFzCi0JCQkvLyAnKicgaXMgdGhlIHdheSB0aGlzIHdvcmtzIG5vdy4gaXMgdGhhdCB0aGUgaW50ZW50PyBPciBzaG91bGQgaXQKLQkJCS8vIG1lYW4gcmVnaXN0ZXJlZCBhcyBhbnkgb3RoZXIgdHlwZT8KLQkJCWZhY3RvcnlEZXNjcmlwdG9yID0gKENNRG9jdW1lbnRGYWN0b3J5RGVzY3JpcHRvcikgcmVzb3VyY2VUeXBlTWFwLmdldChERUZBVUxUX1JFU09VUkNFX1RZUEUpOwotCQl9Ci0JCXJldHVybiBmYWN0b3J5RGVzY3JpcHRvciAhPSBudWxsID8gZmFjdG9yeURlc2NyaXB0b3IuZ2V0RmFjdG9yeSgpIDogbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvZmFjdG9yeS9DTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvZmFjdG9yeS9DTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOGIxOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuZmFjdG9yeTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLQotCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeVJlYWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiZG9jdW1lbnRGYWN0b3JpZXMiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19OQU1FID0gImZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1RZUEUgPSAidHlwZSI7ICAgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgU3RyaW5nIHBsdWdpbklkLCBleHRlbnNpb25Qb2ludElkOwotICAKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnk7Ci0gIAotICBwdWJsaWMgQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeVJlYWRlcihDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KQotICB7Ci0gIAl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKQotICB7Ci0gICAgU3RyaW5nIGJ1bmRsZWlkID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KGJ1bmRsZWlkLCBFWFRFTlNJT05fUE9JTlRfSUQpOwotICAgIGlmIChwb2ludCAhPSBudWxsKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICByZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19OQU1FKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgZmFjdG9yeUNsYXNzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKTsKLSAgICAgIFN0cmluZyBmaWxlbmFtZUV4dGVuc2lvbnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVFlQRSk7Ci0gICAgICBpZiAoZmFjdG9yeUNsYXNzICE9IG51bGwgJiYgZmlsZW5hbWVFeHRlbnNpb25zICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yKGVsZW1lbnQpOwotICAgICAgICAgIGZvciAoU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihmaWxlbmFtZUV4dGVuc2lvbnMsICIsIik7IHN0Lmhhc01vcmVUb2tlbnMoKTsgKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgewotICAgICAgICAgIAlTdHJpbmcgdG9rZW4gPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlyZWdpc3RyeS5wdXRGYWN0b3J5KHRva2VuLCBkZXNjcmlwdG9yKTsJCi0gICAgICAgICAgfSAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vQW5ub3RhdGlvbkZpbGVJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlhMzcyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb247Ci0KLS8qKgotICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYW5ub3RhdGlvbiBmaWxlcwotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkZpbGVJbmZvIHsKLQlwcml2YXRlIFN0cmluZyBmQW5ub3RhdGlvbkZpbGVMb2NhdGlvbjsKLQlwcml2YXRlIFN0cmluZyBmQnVuZGxlSWQ7Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbkZpbGVJbmZvKFN0cmluZyBhbm5vdGF0aW9uRmlsZUxvY2F0aW9uLCBTdHJpbmcgYnVuZGxlSWQpIHsKLQkJZkFubm90YXRpb25GaWxlTG9jYXRpb24gPSBhbm5vdGF0aW9uRmlsZUxvY2F0aW9uOwotCQlmQnVuZGxlSWQgPSBidW5kbGVJZDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBhbm5vdGF0aW9uIGZpbGUgYXMgb3JpZ2luYWxseSBzcGVjaWZpZWQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25GaWxlTG9jYXRpb24oKSB7Ci0JCXJldHVybiBmQW5ub3RhdGlvbkZpbGVMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGJ1bmRsZSBpZCB3aGVyZSB0aGUgYW5ub3RhdGlvbiBmaWxlIGlzIGxvY2F0ZWQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJ1bmRsZUlkKCkgewotCQlyZXR1cm4gZkJ1bmRsZUlkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDE5MTVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnR5UmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uLkFubm90YXRpb25NYXA7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkZpbGVQYXJzZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19JRF9BTk5PVEFUSU9OUyA9ICJhYnN0cmFjdEdyYW1tYXJBbm5vdGF0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfSURfQU5OT1RBVElPTiA9ICJhbm5vdGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19JRF9QUk9QRVJUWSA9ICJwcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBwYXJzZSBhbiBhbm5vdGF0aW9uIGZpbGUgYW5kIHN0b3JlIHRoZQotCSAqIGNvbnRlbnRzIGludG8gYW4gYW5ub3RhdGlvbk1hcAotCSAqLwotCXByaXZhdGUgdm9pZCBwYXJzZShBbm5vdGF0aW9uTWFwIGFubm90YXRpb25NYXAsIElucHV0U3RyZWFtIGlucHV0LCBBbm5vdGF0aW9uRmlsZUluZm8gZmlsZUluZm8pIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBtb3ZlIHRvIFhlcmNlcy0yLi4uLiBhZGQgJ2NvbnRleHRDbGFzc0xvYWRlcicgc3R1ZmYKLQkJQ2xhc3NMb2FkZXIgcHJldkNsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLQkJdHJ5IHsKLQkJCVNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCWZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCQlTQVhQYXJzZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQkJCXBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW5wdXQpLCBuZXcgQW5ub3RhdGlvbk1hcENvbnRlbnRIYW5kbGVyKGFubm90YXRpb25NYXAsIGZpbGVJbmZvKSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihwcmV2Q2xhc3NMb2FkZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHBhcnNlIGFuIGFubm90YXRpb24gZmlsZSBhbmQgc3RvcmUgdGhlCi0JICogY29udGVudHMgaW50byBhbiBhbm5vdGF0aW9uTWFwCi0JICovCi0JcHVibGljIHZvaWQgcGFyc2UoQW5ub3RhdGlvbk1hcCBtYXAsIEFubm90YXRpb25GaWxlSW5mbyBmaWxlSW5mbykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBQbGF0Zm9ybS5maW5kKFBsYXRmb3JtLmdldEJ1bmRsZShmaWxlSW5mby5nZXRCdW5kbGVJZCgpKSwgUGF0aC5mcm9tT1NTdHJpbmcoZmlsZUluZm8uZ2V0QW5ub3RhdGlvbkZpbGVMb2NhdGlvbigpKSk7Ci0JCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQlpbnB1dFN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQkJcGFyc2UobWFwLCBpbnB1dFN0cmVhbSwgZmlsZUluZm8pOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJdGhyb3cgKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgQW5ub3RhdGlvbk1hcENvbnRlbnRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCQlwcml2YXRlIEFubm90YXRpb25NYXAgYW5ub3RhdGlvbk1hcDsKLQkJcHJpdmF0ZSBBbm5vdGF0aW9uIGN1cnJlbnRBbm5vdGF0aW9uOwotCQlwcml2YXRlIFN0cmluZyBjdXJyZW50UHJvcGVydHlOYW1lOwotCQlwcml2YXRlIFN0cmluZ0J1ZmZlciBwcm9wZXJ0eVZhbHVlQnVmZmVyOwotCQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCQlwcml2YXRlIEFubm90YXRpb25GaWxlSW5mbyBmRmlsZUluZm87Ci0KLQkJcHVibGljIEFubm90YXRpb25NYXBDb250ZW50SGFuZGxlcihBbm5vdGF0aW9uTWFwIGFubm90YXRpb25NYXAsIEFubm90YXRpb25GaWxlSW5mbyBmaWxlSW5mbykgewotCQkJdGhpcy5hbm5vdGF0aW9uTWFwID0gYW5ub3RhdGlvbk1hcDsKLQkJCXRoaXMuZkZpbGVJbmZvID0gZmlsZUluZm87Ci0JCX0KLQotCQlwcml2YXRlIFVSTCBnZW5lcmF0ZVByb3BlcnRpZXNGaWxlVVJMKEFubm90YXRpb25GaWxlSW5mbyBmaWxlSW5mbywgU3RyaW5nIHByb3BlcnRpZXNMb2NhdGlvbikgewotCQkJVVJMIHByb3BlcnRpZXNVUkwgPSBudWxsOwotCi0JCQkvLyBwcmVwZW5kICRubCQgdmFyaWFibGUgdG8gbG9jYXRpb24KLQkJCUlQYXRoIGFubm90YXRpb25QYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcoIiRubCQvIiArIGZpbGVJbmZvLmdldEFubm90YXRpb25GaWxlTG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIHJlbW92ZSB0aGUgYW5ub3RhdGlvbi54bWwgZmlsZQotCQkJSVBhdGggYW5ub3RhdGlvbkZvbGRlciA9IGFubm90YXRpb25QYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJCS8vIGFwcGVuZCBsb2NhdGlvbiBvZiBwcm9wZXJ0aWxlcyBmaWxlCi0JCQlJUGF0aCBwcm9wZXJ0aWVzRmlsZSA9IGFubm90YXRpb25Gb2xkZXIuYXBwZW5kKHByb3BlcnRpZXNMb2NhdGlvbik7Ci0JCQkvLyBhcHBlbmQgLnByb3BlcnRpZXMgZXh0ZW5zaW9uIGlmIG5lZWRlZAotCQkJaWYgKHByb3BlcnRpZXNGaWxlLmdldEZpbGVFeHRlbnNpb24oKSA9PSBudWxsKQotCQkJCXByb3BlcnRpZXNGaWxlID0gcHJvcGVydGllc0ZpbGUuYWRkRmlsZUV4dGVuc2lvbigicHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCQkvLyBjcmVhdGUgYSBVUkwgb3V0IG9mIHRoZSBwcm9wZXJ0aWVzIGZpbGUgbG9jYXRpb24KLQkJCXByb3BlcnRpZXNVUkwgPSBQbGF0Zm9ybS5maW5kKFBsYXRmb3JtLmdldEJ1bmRsZShmaWxlSW5mby5nZXRCdW5kbGVJZCgpKSwgcHJvcGVydGllc0ZpbGUpOwotCQkJcmV0dXJuIHByb3BlcnRpZXNVUkw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJcHJvcGVydHlWYWx1ZUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWlmIChsb2NhbE5hbWUuZXF1YWxzKFRBR19JRF9BTk5PVEFUSU9OUykpIHsKLQkJCQlpbnQgYXR0cmlidXRlc0xlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzTGVuZ3RoOyBpKyspIHsKLQkJCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVzLmdldExvY2FsTmFtZShpKTsKLQkJCQkJU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShpKTsKLQkJCQkJaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKCJwcm9wZXJ0aWVzTG9jYXRpb24iKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl7Ci0JCQkJCQlVUkwgYnVuZGxlVVJMID0gZ2VuZXJhdGVQcm9wZXJ0aWVzRmlsZVVSTChmRmlsZUluZm8sIGF0dHJpYnV0ZVZhbHVlKTsKLQkJCQkJCWlmIChidW5kbGVVUkwgIT0gbnVsbCkgewotCQkJCQkJCUlucHV0U3RyZWFtIGJ1bmRsZVN0cmVhbSA9IG51bGw7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJYnVuZGxlU3RyZWFtID0gYnVuZGxlVVJMLm9wZW5TdHJlYW0oKTsKLQkJCQkJCQkJcmVzb3VyY2VCdW5kbGUgPSBuZXcgUHJvcGVydHlSZXNvdXJjZUJ1bmRsZShidW5kbGVTdHJlYW0pOwotCQkJCQkJCX0KLQkJCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJaWYgKGJ1bmRsZVN0cmVhbSAhPSBudWxsKQotCQkJCQkJCQkJCWJ1bmRsZVN0cmVhbS5jbG9zZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCB4LmdldE1lc3NhZ2UoKSwgeCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoImNhc2VTZW5zaXRpdmUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl7Ci0JCQkJCQlpZiAoYXR0cmlidXRlVmFsdWUudHJpbSgpLmVxdWFscygiZmFsc2UiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJewotCQkJCQkJCWFubm90YXRpb25NYXAuc2V0Q2FzZVNlbnNpdGl2ZShmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFRBR19JRF9BTk5PVEFUSU9OKSkgewotCQkJCWN1cnJlbnRBbm5vdGF0aW9uID0gbnVsbDsKLQkJCQlTdHJpbmcgc3BlY1ZhbHVlID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgic3BlYyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHNwZWNWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCWN1cnJlbnRBbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb24oKTsKLQkJCQkJY3VycmVudEFubm90YXRpb24uc2V0U3BlYyhzcGVjVmFsdWUpOwotCQkJCX0KLQkJCQlhbm5vdGF0aW9uTWFwLmFkZEFubm90YXRpb24oY3VycmVudEFubm90YXRpb24pOwotCQkJfQotCQkJZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhUQUdfSURfUFJPUEVSVFkpKSB7Ci0JCQkJaWYgKGN1cnJlbnRBbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQkJY3VycmVudFByb3BlcnR5TmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCWlmIChjdXJyZW50UHJvcGVydHlOYW1lICE9IG51bGwgJiYgY3VycmVudEFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCVN0cmluZyBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZUJ1ZmZlci50b1N0cmluZygpOwotCQkJCWlmIChwcm9wZXJ0eVZhbHVlICE9IG51bGwpIHsKLQkJCQkJaWYgKHByb3BlcnR5VmFsdWUuc3RhcnRzV2l0aCgiJSIpICYmIHJlc291cmNlQnVuZGxlICE9IG51bGwpIC8vJE5PTi1OTFMtMSQKLQkJCQkJewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlwcm9wZXJ0eVZhbHVlID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKHByb3BlcnR5VmFsdWUuc3Vic3RyaW5nKDEpKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIGlnbm9yZSBhbnkgZXhjZXB0aW9uIHRoYXQgb2NjdXJzIHdoaWxlIHRyeWluZwotCQkJCQkJCS8vIHRvIGZldGNoIGEgcmVzb3VyY2UKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljdXJyZW50QW5ub3RhdGlvbi5zZXRQcm9wZXJ0eShjdXJyZW50UHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChsb2NhbE5hbWUuZXF1YWxzKFRBR19JRF9BTk5PVEFUSU9OKSkgewotCQkJCWN1cnJlbnRBbm5vdGF0aW9uID0gbnVsbDsKLQkJCX0KLQkJCWVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoVEFHX0lEX1BST1BFUlRZKSkgewotCQkJCWN1cnJlbnRQcm9wZXJ0eU5hbWUgPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQkJaWYgKGN1cnJlbnRQcm9wZXJ0eU5hbWUgIT0gbnVsbCAmJiBjdXJyZW50QW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJcHJvcGVydHlWYWx1ZUJ1ZmZlci5hcHBlbmQoY2gsIHN0YXJ0LCBsZW5ndGgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vQW5ub3RhdGlvbkZpbGVSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vQW5ub3RhdGlvbkZpbGVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODk5MWZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGFzc29jaWF0ZSBvbmUgb3IgbW9yZSBhbm5vdGF0aW9uIGZpbGVzIHdpdGggYSBncmFtbWFyCi0gKiBmaWxlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5IHsKLQlwcml2YXRlIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIEFubm90YXRpb25GaWxlUmVnaXN0cnkoKSB7Ci0JCW5ldyBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5UmVhZGVyKHRoaXMpLnJlYWRSZWdpc3RyeSgpOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIExpc3QgZ2V0QW5ub3RhdGlvbkZpbGVzSW5mb3MoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCUxpc3QgdGhlTGlzdCA9IChMaXN0KSBtYXAuZ2V0KHB1YmxpY0lkKTsKLQkJcmV0dXJuIHRoZUxpc3QgIT0gbnVsbCA/IHRoZUxpc3QgOiBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCQkKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQW5ub3RhdGlvbkZpbGUoU3RyaW5nIHB1YmxpY0lkLCBBbm5vdGF0aW9uRmlsZUluZm8gZmlsZUluZm8pIHsKLQkJTGlzdCBmaWxlSW5mb3MgPSAoTGlzdCkgbWFwLmdldChwdWJsaWNJZCk7Ci0JCWlmIChmaWxlSW5mb3MgPT0gbnVsbCkgewotCQkJZmlsZUluZm9zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJbWFwLnB1dChwdWJsaWNJZCwgZmlsZUluZm9zKTsKLQkJfQotCQlmaWxlSW5mb3MuYWRkKGZpbGVJbmZvKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbkZpbGUoU3RyaW5nIHB1YmxpY0lkLCBBbm5vdGF0aW9uRmlsZUluZm8gZmlsZUluZm8pIHsKLQkJTGlzdCBmaWxlSW5mb3MgPSAoTGlzdCkgbWFwLmdldChwdWJsaWNJZCk7Ci0JCWlmIChmaWxlSW5mb3MgIT0gbnVsbCkgewotCQkJZmlsZUluZm9zLnJlbW92ZShmaWxlSW5mbyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjN2M0MjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vQW5ub3RhdGlvbkZpbGVSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyB0aGUgcGx1Z2luIG1hbmlmZXN0cyBhbmQgYWRkcyBlYWNoIHNwZWNpZmllZCBncmFtYW1yCi0gKiBhbm5vdGF0aW9uIGZpbGUgd2l0aCB0aGUgQW5ub3RhdGlvblByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5UmVhZGVyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiYW5ub3RhdGlvbkZpbGVzIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19OQU1FID0gImFubm90YXRpb25GaWxlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QVUJMSUNfSUQgPSAicHVibGljSWQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0xPQ0FUSU9OID0gImxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5IGFubm90YXRpb25GaWxlUmVnaXN0cnk7Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbkZpbGVSZWdpc3RyeVJlYWRlcihBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5IGFubm90YXRpb25GaWxlUmVnaXN0cnkpIHsKLQkJdGhpcy5hbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5ID0gYW5ub3RhdGlvbkZpbGVSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiByZWFkIGZyb20gcGx1Z2luIHJlZ2lzdHJ5IGFuZCBwYXJzZSBpdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCVN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KHBsdWdpbklkLCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlyZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZWFkRWxlbWVudCgpIC0gcGFyc2UgYW5kIGRlYWwgd2l0aCBhbiBleHRlbnNpb24gbGlrZToKLQkgKiAKLQkgKiA8ZXh0ZW5zaW9uCi0JICogcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbF9pbXBsZW1lbnRhdGlvbiI+Ci0JICogPHV0aWxfaW1wbGVtZW50YXRpb24gY2xhc3MgPQotCSAqIGNvcmcuZWNsaXBzZS53c3QuYmFzZXV0aWwuQ01VdGlsSW1wbGVtZW50YXRpb25JbXBsIC8+IDwvZXh0ZW5zaW9uPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKSB7Ci0JCQlTdHJpbmcgcHVibGljSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUFVCTElDX0lEKTsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9MT0NBVElPTik7Ci0JCQlpZiAocHVibGljSWQgIT0gbnVsbCAmJiBsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIGJ1bmRsZUlkID0gZWxlbWVudC5nZXROYW1lc3BhY2UoKTsKLQkJCQkJQW5ub3RhdGlvbkZpbGVJbmZvIGZpbGVJbmZvID0gbmV3IEFubm90YXRpb25GaWxlSW5mbyhsb2NhdGlvbiwgYnVuZGxlSWQpOwotCQkJCQlhbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5LmFkZEFubm90YXRpb25GaWxlKHB1YmxpY0lkLCBmaWxlSW5mbyk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJwcm9ibGVtIGFkZGluZyBhbm5vdGF0aW9uIGZpbGUgIiArIGxvY2F0aW9uLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25VdGlsaXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjEwODhhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25VdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Db250ZW50TW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWFwOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uVXRpbGl0eSB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIGxvYWRBbm5vdGF0aW9uc0ZvckdyYW1tYXIoU3RyaW5nIHB1YmxpY0lkLCBDTURvY3VtZW50IGNtRG9jdW1lbnQpIHsKLQkJTGlzdCBhbm5vdGF0aW9uRmlsZXMgPSBDb250ZW50TW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0QW5ub3RhdGlvbkZpbGVzSW5mb3MocHVibGljSWQpOwotCQlBbm5vdGF0aW9uTWFwIG1hcCA9IChBbm5vdGF0aW9uTWFwKSBjbURvY3VtZW50LmdldFByb3BlcnR5KCJhbm5vdGF0aW9uTWFwIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBhbm5vdGF0aW9uRmlsZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJQW5ub3RhdGlvbkZpbGVJbmZvIGFubm90YXRpb25GaWxlSW5mbyA9IChBbm5vdGF0aW9uRmlsZUluZm8pIGkubmV4dCgpOwotCQkJCQlBbm5vdGF0aW9uRmlsZVBhcnNlciBwYXJzZXIgPSBuZXcgQW5ub3RhdGlvbkZpbGVQYXJzZXIoKTsKLQkJCQkJcGFyc2VyLnBhcnNlKG1hcCwgYW5ub3RhdGlvbkZpbGVJbmZvKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vUmVzb3VyY2VCdW5kbGVIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL1Jlc291cmNlQnVuZGxlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZWViYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL2Fubm90YXRpb24vUmVzb3VyY2VCdW5kbGVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLQotcHVibGljIGNsYXNzIFJlc291cmNlQnVuZGxlSGVscGVyCi17Ci0gIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoU3RyaW5nIHJlc291cmNlVVJJLCBMb2NhbGUgdGFyZ2V0TG9jYWxlKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLQkgIC8vIHRyeSB0byBsb2FkIGJ1bmRsZSBmcm9tIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgaW4gdGhlIHJlc291cmNlVVJJCi0gICAgLy8gd2UgbWFrZSB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSByZXNvdXJjZVVSSSBwb2ludHMgdG8gdGhlIGxvY2FsIGZpbGUgc3lzdGVtCi0gICAgICAgICAKLSAgICBpbnQgaW5kZXggPSByZXNvdXJjZVVSSS5sYXN0SW5kZXhPZigiLyIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGluZGV4ID09IC0xKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkludmFsaWQgcmVzb3VyY2VVUkkiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAvLyBCZWxvdyB3ZSBzZXQgJ3Jlc291cmNlRGlyZWN0b3J5JyBzbyB0aGF0IGl0IGVuZHMgd2l0aCBhICcvJy4KLSAgICAvLyBIZXJlJ3MgYW4gZXhjZXJwdCBmcm9tIHRoZSBDbGFzc0xvYWRlciBKYXZhZG9jIC4uLgotICAgIC8vIEFueSBVUkwgdGhhdCBlbmRzIHdpdGggYSAnLycgaXMgYXNzdW1lZCB0byByZWZlciB0byBhIGRpcmVjdG9yeS4gT3RoZXJ3aXNlLCB0aGUgVVJMIGlzIGFzc3VtZWQKLSAgICAvLyB0byByZWZlciB0byBhIEpBUiBmaWxlIHdoaWNoIHdpbGwgYmUgb3BlbmVkIGFzIG5lZWRlZC4gCi0gICAgLy8KLSAgICBTdHJpbmcgcmVzb3VyY2VEaXJlY3RvcnkgPSByZXNvdXJjZVVSSS5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTsKLSAgICBTdHJpbmcgcmVzb3VyY2VCdW5kbGVOYW1lID0gcmVzb3VyY2VVUkkuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgCi0gICAgLy8gY3JlYXRlIGEgY2xhc3MgbG9hZGVyIHdpdGggYSBjbGFzcyBwYXRoIHRoYXQgcG9pbnRzIHRvIHRoZSByZXNvdXJjZSBidW5kbGUncyBsb2NhdGlvbgotICAgIC8vICAgICAgICAgCi0gICAgVVJMW10gY2xhc3NwYXRoID0gbmV3IFVSTFsxXTsKLSAgICBjbGFzc3BhdGhbMF0gPSBQbGF0Zm9ybS5yZXNvbHZlKG5ldyBVUkwocmVzb3VyY2VEaXJlY3RvcnkpKTsKLQkgIENsYXNzTG9hZGVyIHJlc291cmNlTG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKGNsYXNzcGF0aCwgbnVsbCk7IAotICAgICAgIAotICAJcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShyZXNvdXJjZUJ1bmRsZU5hbWUsIHRhcmdldExvY2FsZSwgcmVzb3VyY2VMb2FkZXIpOwotCX0gIAotCi0gIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoU3RyaW5nIHJlc291cmNlVVJJKSB0aHJvd3MgRXhjZXB0aW9uIAotICB7Ci0JICByZXR1cm4gZ2V0UmVzb3VyY2VCdW5kbGUocmVzb3VyY2VVUkksIExvY2FsZS5nZXREZWZhdWx0KCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvSW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL0luZmVycmVkR3JhbW1hckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlkODEzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvSW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLm1vZGVscXVlcnlpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNQW55RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5hbWVkTm9kZU1hcEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5vZGVMaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01EZXNjcmlwdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLQotIAotCi1wdWJsaWMgY2xhc3MgSW5mZXJyZWRHcmFtbWFyRmFjdG9yeQoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBJbmZlcnJlZEdyYW1tYXJGYWN0b3J5KCkKLSAgewotICB9Ci0KLSAgcHVibGljIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudChTdHJpbmcgdXJpKQotICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgIENNRG9jdW1lbnRJbXBsIGNtZG9jdW1lbnQgPW5ldyBDTURvY3VtZW50SW1wbCh1cmkpOwotICAgIGNtZG9jdW1lbnQuc2V0SW5mZXJyZWQodHJ1ZSk7Ci0gICAgcmV0dXJuIGNtZG9jdW1lbnQ7Ci0gIH0gICAgCi0gCi0gIHB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVDTUVsZW1lbnREZWNsYXJhdGlvbihDTURvY3VtZW50IGNtRG9jdW1lbnQsIEVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiBpc0xvY2FsKQotICB7Ci0gICAgU3RyaW5nIGxvY2FsTmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBDTURvY3VtZW50SW1wbCBjbURvY3VtZW50SW1wbCA9IChDTURvY3VtZW50SW1wbCljbURvY3VtZW50OwotCi0gICAgQ01OYW1lZE5vZGVNYXBJbXBsIGVsZW1lbnRNYXAgPSBpc0xvY2FsID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDTU5hbWVkTm9kZU1hcEltcGwpY21Eb2N1bWVudEltcGwuZ2V0TG9jYWxFbGVtZW50UG9vbCgpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDTU5hbWVkTm9kZU1hcEltcGwpY21Eb2N1bWVudEltcGwuZ2V0RWxlbWVudHMoKTsKLQotICAgIENNRWxlbWVudERlY2xhcmF0aW9uSW1wbCBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwpZWxlbWVudE1hcC5nZXROYW1lZEl0ZW0obG9jYWxOYW1lKTsKLSAgICBpZiAoZWQgPT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlIGVkICIgKyBsb2NhbE5hbWUpOwotICAgICAgZWQgPSBuZXcgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsKGNtRG9jdW1lbnQsIGxvY2FsTmFtZSk7Ci0gICAgICBlZC5zZXRJbmZlcnJlZCh0cnVlKTsKLSAgICAgIGVkLnNldExvY2FsKGlzTG9jYWwpOwotICAgICAgZWQuc2V0TWF4T2NjdXIoMSk7Ci0gICAgICBDTUdyb3VwSW1wbCBncm91cCA9IG5ldyBDTUdyb3VwSW1wbChuZXcgQ01Ob2RlTGlzdEltcGwoKSwgQ01Hcm91cC5DSE9JQ0UpOwotICAgICAgZ3JvdXAuc2V0SW5mZXJyZWQodHJ1ZSk7Ci0gICAgICBncm91cC5zZXRNaW5PY2N1cigwKTsKLSAgICAgIGdyb3VwLnNldE1heE9jY3VyKC0xKTsKLSAgICAgIGVkLnNldENvbnRlbnQoZ3JvdXApOyAgICAgICAgICAgIAotICAgICAgZWxlbWVudE1hcC5wdXQoZWQpOwotICAgIH0gCi0KLSAgICAvLyBsb29rdXAgb3IgY3JlYXRlIHRoZSBhdHRyaWJ1dGVzCi0gICAgLy8KLSAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlTWFwID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgaW50IGF0dHJpYnV0ZU1hcExlbmd0aCA9IGF0dHJpYnV0ZU1hcC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZU1hcExlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIEF0dHIgYXR0ciA9IChBdHRyKWF0dHJpYnV0ZU1hcC5pdGVtKGkpOwotICAgICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwgYWQgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwpZWQuZ2V0QXR0cmlidXRlTWFwKCkuZ2V0TmFtZWRJdGVtKGF0dHIuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICBpZiAoYWQgPT0gbnVsbCkKLSAgICAgIHsgICAgIAotICAgICAgICAvLyB0b2RvLi4uIHVzZSBhbiBhdHRyaWJ1dGUgcG9vbCB0byBiZSBtb3JlIGVmZmljaWVudD8KLSAgICAgICAgYWQgPSBuZXcgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwoYXR0ci5nZXROb2RlTmFtZSgpLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLSAgICAgICAgYWQuc2V0SW5mZXJyZWQodHJ1ZSk7Ci0gICAgICAgIGVkLmdldEF0dHJpYnV0ZU1hcCgpLnB1dChhZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlZDsKLSAgfSAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNNQ29udGVudChDTURvY3VtZW50IHBhcmVudENNRG9jdW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkLCBDTURvY3VtZW50IGNoaWxkQ01Eb2N1bWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gY2hpbGRFZCwgYm9vbGVhbiBpc0xvY2FsLCBTdHJpbmcgdXJpKQotICB7Ci0gICAgLy8gYWRkIGVsZW1lbnQgdG8gdGhlIHBhcmVudCdzIGNvbnRlbnQKLSAgICAvLyBjb25zaWRlciBhbGwgY29udGVudCB0byBiZSBvZiB0aGUgZm9ybSAoQSB8IEIgfCBDKSogICAgCi0gICAgLy8KLSAgICBDTUdyb3VwSW1wbCBncm91cCA9IChDTUdyb3VwSW1wbClwYXJlbnRFZC5nZXRDb250ZW50KCk7Ci0gICAgQ01Ob2RlTGlzdEltcGwgZ3JvdXBDaGlsZE5vZGVMaXN0ID0gKENNTm9kZUxpc3RJbXBsKWdyb3VwLmdldENoaWxkTm9kZXMoKTsKLQotICAgIGlmIChwYXJlbnRDTURvY3VtZW50ID09IGNoaWxkQ01Eb2N1bWVudCkKLSAgICB7Ci0gICAgICBpZiAoIWdyb3VwQ2hpbGROb2RlTGlzdC5jb250YWlucyhjaGlsZEVkKSkKLSAgICAgIHsKLSAgICAgICAgZ3JvdXBDaGlsZE5vZGVMaXN0LmFkZChjaGlsZEVkKTsKLSAgICAgIH0KLSAgICAgIGlmIChpc0xvY2FsKQotICAgICAgewotICAgICAgICBDTU5hbWVkTm9kZU1hcEltcGwgbG9jYWxFbGVtZW50TWFwID0gKENNTmFtZWROb2RlTWFwSW1wbClwYXJlbnRFZC5nZXRMb2NhbEVsZW1lbnRzKCk7Ci0gICAgICAgIGxvY2FsRWxlbWVudE1hcC5wdXQoY2hpbGRFZCk7Ci0gICAgICB9Ci0gICAgfSAgICAgCi0gICAgZWxzZQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBDTUFueUVsZW1lbnQgY21BbnlFbGVtZW50ID0gbG9va3VwT3JDcmVhdGVDTUFueUVsZW1lbnQoKENNRG9jdW1lbnRJbXBsKXBhcmVudENNRG9jdW1lbnQsIHVyaSk7Ci0gICAgICBpZiAoIWdyb3VwQ2hpbGROb2RlTGlzdC5jb250YWlucyhjbUFueUVsZW1lbnQpKQotICAgICAgewotICAgICAgICBncm91cENoaWxkTm9kZUxpc3QuYWRkKGNtQW55RWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfSAgICAgIAotICB9ICAgCi0KLSAgcHJvdGVjdGVkIENNQW55RWxlbWVudCBsb29rdXBPckNyZWF0ZUNNQW55RWxlbWVudChDTURvY3VtZW50SW1wbCBwYXJlbnRDTURvY3VtZW50LCBTdHJpbmcgdXJpKQotICB7Ci0gICAgQ01OYW1lZE5vZGVNYXBJbXBsIGFueUVsZW1lbnRNYXAgPSBwYXJlbnRDTURvY3VtZW50LmdldEFueUVsZW1lbnRzKCk7Ci0gICAgQ01BbnlFbGVtZW50SW1wbCBhbnlFbGVtZW50ID0gKENNQW55RWxlbWVudEltcGwpYW55RWxlbWVudE1hcC5nZXROYW1lZEl0ZW0oQ01BbnlFbGVtZW50SW1wbC5jb21wdXRlTm9kZU5hbWUodXJpKSk7Ci0gICAgaWYgKGFueUVsZW1lbnQgPT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZSBhbnlFbGVtZW50ICIgKyB1cmkpOwotICAgICAgYW55RWxlbWVudCA9IG5ldyBDTUFueUVsZW1lbnRJbXBsKHVyaSk7Ci0gICAgICBhbnlFbGVtZW50LnNldEluZmVycmVkKHRydWUpOwotICAgICAgYW55RWxlbWVudE1hcC5wdXQoYW55RWxlbWVudCk7Ci0gICAgfQotICAgIHJldHVybiBhbnlFbGVtZW50OwotICB9IAotICAgICAgCi0KLSAgcHVibGljIHZvaWQgZGVidWdQcmludChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWl0ZXIubmV4dCgpOyAKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjbURvY3VtZW50ICgiICsgY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpICsiKSIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIENNTmFtZWROb2RlTWFwSW1wbCBlbGVtZW50TWFwID0gKENNTmFtZWROb2RlTWFwSW1wbCljbURvY3VtZW50LmdldEVsZW1lbnRzKCk7Ci0gICAgICBpbnQgc2l6ZSA9IGVsZW1lbnRNYXAuZ2V0TGVuZ3RoKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pZWxlbWVudE1hcC5pdGVtKGkpOwotICAgICAgICBDTURlc2NyaXB0aW9uQnVpbGRlciBidWlsZGVyID0gbmV3IENNRGVzY3JpcHRpb25CdWlsZGVyKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBFTEVNRU5UICIgKyBlZC5nZXROb2RlTmFtZSgpICsgIiA9ICIgKyBidWlsZGVyLmJ1aWxkRGVzY3JpcHRpb24oZWQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICB9Ci0gICAgfQotICB9ICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9tb2RlbHF1ZXJ5aW1wbC9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZDk0OTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5tb2RlbHF1ZXJ5aW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbi5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uOwotCi0vKioKLSAqIERlc2NyaWJlcyBhbiBleHRlbnNpb24gdG8gdGhlIDxjb2RlPm1vZGVsUXVlcnlFeHRlbnNpb248L2NvZGU+IGV4dGVuc2lvbgotICogcG9pbnQuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlFeHRlbnNpb25EZXNjcmlwdG9yCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEVfQVRUUklCVVRFID0gImNvbnRlbnRUeXBlIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX0FUVFJJQlVURSA9ICJuYW1lc3BhY2UiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19BVFRSSUJVVEUgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb247Ci0gIHByaXZhdGUgU3RyaW5nIGNvbnRlbnRUeXBlSWQ7Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLSAgcHJpdmF0ZSBNb2RlbFF1ZXJ5RXh0ZW5zaW9uIGV4dGVuc2lvbjsKLQotICBwdWJsaWMgTW9kZWxRdWVyeUV4dGVuc2lvbkRlc2NyaXB0b3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBjb25maWd1cmF0aW9uID0gZWxlbWVudDsKLSAgfQotCi0gIHB1YmxpYyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uIGNyZWF0ZU1vZGVsUXVlcnlFeHRlbnNpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKGV4dGVuc2lvbiA9PSBudWxsKQotICAgIHsgIAotICAgICAgZXh0ZW5zaW9uID0gKE1vZGVsUXVlcnlFeHRlbnNpb24pIGNvbmZpZ3VyYXRpb24uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihDTEFTU19BVFRSSUJVVEUpOwotICAgIH0gIAotICAgIHJldHVybiBleHRlbnNpb247Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlSWQoKQotICB7Ci0gICAgaWYgKGNvbnRlbnRUeXBlSWQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb250ZW50VHlwZUlkID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoQ09OVEVOVF9UWVBFX0FUVFJJQlVURSk7Ci0gICAgfQotICAgIHJldHVybiBjb250ZW50VHlwZUlkOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKQotICB7Ci0gICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG5hbWVzcGFjZSA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKE5BTUVTUEFDRV9BVFRSSUJVVEUpOwotICAgIH0KLSAgICByZXR1cm4gbmFtZXNwYWNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYzI4ZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLm1vZGVscXVlcnlpbXBsOwotICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbi5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb24uTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlckltcGwgaW1wbGVtZW50cyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlcgoteyAgICAgICAgICAgCi0gIHByb3RlY3RlZCBNb2RlbFF1ZXJ5RXh0ZW5zaW9uUmVnaXN0cnkgbW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5ID0gbmV3IE1vZGVsUXVlcnlFeHRlbnNpb25SZWdpc3RyeSgpOwotCi0gIHB1YmxpYyBMaXN0IGdldERhdGFUeXBlVmFsdWVzKEVsZW1lbnQgZWxlbWVudCwgQ01Ob2RlIGNtTm9kZSkKLSAgeyAgICAKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7ICAgICAgCi0gICAgU3RyaW5nIGNvbnRlbnRUeXBlSWQgPSBnZXRDb250ZW50VHlwZUlkKGVsZW1lbnQpOwotICAgIFN0cmluZyBuYW1lc3BhY2UgPSBnZXROYW1lc3BhY2UoY21Ob2RlKTsKLSAgICBTdHJpbmcgbmFtZSA9IGNtTm9kZS5nZXROb2RlTmFtZSgpOwotICAgIAotICAgIGZvciAoSXRlcmF0b3IgaSA9IG1vZGVsUXVlcnlFeHRlbnNpb25SZWdpc3RyeS5nZXRBcHBsaWNhYmxlRXh0ZW5zaW9ucyhjb250ZW50VHlwZUlkLCBuYW1lc3BhY2UpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBNb2RlbFF1ZXJ5RXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChNb2RlbFF1ZXJ5RXh0ZW5zaW9uKWkubmV4dCgpOwotICAgICAgU3RyaW5nW10gdmFsdWVzID0gbnVsbDsKLSAgICAgIGlmIChjbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKQotICAgICAgeyAgCi0gICAgICAgIHZhbHVlcyA9IGV4dGVuc2lvbi5nZXRBdHRyaWJ1dGVWYWx1ZXMoZWxlbWVudCwgbmFtZXNwYWNlLCBuYW1lKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdmFsdWVzID0gZXh0ZW5zaW9uLmdldEVsZW1lbnRWYWx1ZXMoZWxlbWVudCwgbmFtZXNwYWNlLCBuYW1lKTsgICAgICAgIAotICAgICAgfQotICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBsaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KHZhbHVlcykpOwotICAgICAgfSAgCi0gICAgfSAgCi0gICAgcmV0dXJuIGxpc3Q7ICAKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBmaWx0ZXJBdmFpbGFibGVFbGVtZW50Q29udGVudChMaXN0IGNtbm9kZXMsIEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsKLQkgIGZpbHRlckF2YWlsYWJsZUVsZW1lbnRDb250ZW50KGNtbm9kZXMsIGVsZW1lbnQsIGVkLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQ0hJTERfTk9ERVMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZmlsdGVyQXZhaWxhYmxlRWxlbWVudENvbnRlbnQoTGlzdCBjbW5vZGVzLCBFbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5jbHVkZU9wdGlvbnMpCi0gIHsKLSAgICBTdHJpbmcgY29udGVudFR5cGVJZCA9IGdldENvbnRlbnRUeXBlSWQoZWxlbWVudCk7Ci0gICAgU3RyaW5nIHBhcmVudE5hbWVzcGFjZSA9IGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLQlMaXN0IG1vZGVsUXVlcnlFeHRlbnNpb25zID0gbW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5LmdldEFwcGxpY2FibGVFeHRlbnNpb25zKGNvbnRlbnRUeXBlSWQsIHBhcmVudE5hbWVzcGFjZSk7Ci0JaWYoKGluY2x1ZGVPcHRpb25zICYgTW9kZWxRdWVyeS5JTkNMVURFX0NISUxEX05PREVTKSA+IDApCi0JewotICAgICAgZm9yIChJdGVyYXRvciBqID0gY21ub2Rlcy5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBDTU5vZGUgY21Ob2RlID0gKENNTm9kZSlqLm5leHQoKTsgIAotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZ2V0TmFtZXNwYWNlKGNtTm9kZSk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gY21Ob2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgICAKLSAgICAgICAgYm9vbGVhbiBpbmNsdWRlID0gdHJ1ZTsKLSAgICAgICAgZm9yKGludCBrID0gMDsgayA8IG1vZGVsUXVlcnlFeHRlbnNpb25zLnNpemUoKSAmJiBpbmNsdWRlOyBrKyspIHsKLSAgICAgICAgewotICAgICAgICAgICAgTW9kZWxRdWVyeUV4dGVuc2lvbiBleHRlbnNpb24gPSAoTW9kZWxRdWVyeUV4dGVuc2lvbiltb2RlbFF1ZXJ5RXh0ZW5zaW9ucy5nZXQoayk7Ci0gICAgICAgICAgICBpbmNsdWRlID0gZXh0ZW5zaW9uLmlzQXBwbGljYWJsZUNoaWxkRWxlbWVudChlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUpOwotICAgICAgICAgICAgaWYgKCFpbmNsdWRlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIGNtTm9kZSBmcm9tIHRoZSBsaXN0Ci0gICAgICAgICAgICAgIGoucmVtb3ZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGFkZCBNUUUtcHJvdmlkZWQgY29udGVudAotICAgIGZvcihpbnQgayA9IDA7IGsgPCBtb2RlbFF1ZXJ5RXh0ZW5zaW9ucy5zaXplKCk7IGsrKykKLSAgICB7Ci0gICAgICAgIE1vZGVsUXVlcnlFeHRlbnNpb24gZXh0ZW5zaW9uID0gKE1vZGVsUXVlcnlFeHRlbnNpb24pbW9kZWxRdWVyeUV4dGVuc2lvbnMuZ2V0KGspOwotICAgICAgICBjbW5vZGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGV4dGVuc2lvbi5nZXRBdmFpbGFibGVFbGVtZW50Q29udGVudChlbGVtZW50LCBwYXJlbnROYW1lc3BhY2UsIGluY2x1ZGVPcHRpb25zKSkpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZXNwYWNlKENNTm9kZSBjbU5vZGUpCi0gIHsKLSAgICBTdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSAoQ01Eb2N1bWVudCljbU5vZGUuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpICAgICAgICAgIAotICAgIHsgICAgIAotICAgICAgbmFtZXNwYWNlID0gKFN0cmluZyljbURvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIik7ICAgIC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q29udGVudFR5cGVJZChOb2RlIG5vZGUpCi0gIHsKLSAgICBTdHJpbmcgY29udGVudFR5cGVJZCA9ICJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIjsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgSURPTU5vZGUgZG9tTm9kZSA9IChJRE9NTm9kZSkgbm9kZTsKLSAgICAgIGNvbnRlbnRUeXBlSWQgPSBkb21Ob2RlLmdldE1vZGVsKCkuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCk7Ci0gICAgfSAgIAotICAgIHJldHVybiBjb250ZW50VHlwZUlkOwotICB9IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25SZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzY2ZjQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9tb2RlbHF1ZXJ5aW1wbC9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLm1vZGVscXVlcnlpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb24uTW9kZWxRdWVyeUV4dGVuc2lvbjsKLQotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlFeHRlbnNpb25SZWdpc3RyeQotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAibW9kZWxRdWVyeUV4dGVuc2lvbnMiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19OQU1FID0gIm1vZGVsUXVlcnlFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgTGlzdCBkZXNjcmlwdG9yczsKLQotICBwdWJsaWMgTGlzdCBnZXRBcHBsaWNhYmxlRXh0ZW5zaW9ucyhTdHJpbmcgY29udGVudFR5cGVJZCwgU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoY29udGVudFR5cGVJZCAhPSBudWxsKQotICAgIHsKLSAgICAgIGVuc3VyZUV4dGVuc2lvbnNMb2FkZWQoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgTW9kZWxRdWVyeUV4dGVuc2lvbkRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChNb2RlbFF1ZXJ5RXh0ZW5zaW9uRGVzY3JpcHRvcikgaS5uZXh0KCk7Ci0gICAgICAgIGlmIChjb250ZW50VHlwZUlkLmVxdWFscyhkZXNjcmlwdG9yLmdldENvbnRlbnRUeXBlSWQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZGVzY3JpcHRvci5nZXROYW1lc3BhY2UoKSA9PSBudWxsIHx8ICBkZXNjcmlwdG9yLmdldE5hbWVzcGFjZSgpLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgICAgIHsgIAotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE1vZGVsUXVlcnlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZGVzY3JpcHRvci5jcmVhdGVNb2RlbFF1ZXJ5RXh0ZW5zaW9uKCk7Ci0gICAgICAgICAgICAgIGxpc3QuYWRkKGV4dGVuc2lvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigicHJvYmxlbSBjcmVhdGluZyBtb2RlbCBxdWVyeSBleHRlbnNpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgIH0gIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0gIAotICAvKgotICAgKiAgVE9ETyA6IGNvbnNpZGVyIHByb3ZpZGluZyBhIG5vbi1wbHVnaW4gbWVhbnMgYWRkL3JlbW92ZSBleHRlbnNpb25zCi0gICAqICAgCi0gIHB1YmxpYyB2b2lkIGFkZEV4dGVuc2lvbihNb2RlbFF1ZXJ5RXh0ZW5zaW9uIGV4dGVuc2lvbikKLSAgeyAgICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVFeHRlbnNpb24oTW9kZWxRdWVyeUV4dGVuc2lvbkRlcHJlY2F0ZWQgZXh0ZW5zaW9uKQotICB7Ci0gIH0qLwotCi0gIC8qKgotICAgKiBSZWFkcyBhbGwgZXh0ZW5zaW9ucy4KLSAgICogPHA+Ci0gICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgaW4gb3JkZXIgdG8gcmVsb2FkIGZyb20gYSBjaGFuZ2VkCi0gICAqIGV4dGVuc2lvbiByZWdpc3RyeS4KLSAgICogPC9wPgotICAgKi8KLSAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCByZWxvYWRFeHRlbnNpb25zKCkKLSAgewotICAgIGRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFN0cmluZyBidW5kbGVpZCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiOyAvLyROT04tTkxTLTEkICAgICAgCi0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihidW5kbGVpZCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIE1vZGVsUXVlcnlFeHRlbnNpb25EZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgTW9kZWxRdWVyeUV4dGVuc2lvbkRlc2NyaXB0b3IoZWxlbWVudHNbaV0pOwotICAgICAgZGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBFbnN1cmVzIHRoZSBleHRlbnNpb25zIGhhdmUgYmVlbiBsb2FkZWQgYXQgbGVhc3Qgb25jZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBlbnN1cmVFeHRlbnNpb25zTG9hZGVkKCkKLSAgewotICAgIGlmIChkZXNjcmlwdG9ycyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlbG9hZEV4dGVuc2lvbnMoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC91dGlsL0NNRGF0YVR5cGVWYWx1ZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvQ01EYXRhVHlwZVZhbHVlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwOWZhNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvQ01EYXRhVHlwZVZhbHVlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlVGFibGU7Ci0KLQotcHVibGljIGNsYXNzIENNRGF0YVR5cGVWYWx1ZUhlbHBlcgotewotICBwcm90ZWN0ZWQgaW50IGlkQ291bnQgPSAwOwotCi0KLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZShDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkLCBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSkKLSAgewotICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7Ci0gICAgICAgCi0gICAgaWYgKGlzWFNJVHlwZShhZCkpICAgICAgICAgCi0gICAgeyAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IGdldFF1YWxpZmllZFhTSVR5cGVzKGFkLCBuYW1lc3BhY2VUYWJsZSk7Ci0gICAgICB2YWx1ZSA9IGxpc3Quc2l6ZSgpID4gMCA/IChTdHJpbmcpbGlzdC5nZXQoMCkgOiBudWxsOwotICAgIH0gCi0KLSAgICAvLyBzaGFtZWxlc3MgaGFjawotICAgIC8vCi0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgaWYgKGFkLmdldEF0dHJOYW1lKCkuZXF1YWxzKCJ4bWw6bGFuZyIpKSAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICB2YWx1ZSA9ICJFTiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBDTURhdGFUeXBlIGRhdGFUeXBlID0gYWQuZ2V0QXR0clR5cGUoKTsKLSAgICAgIGlmIChkYXRhVHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICB2YWx1ZSA9IGdldFZhbHVlKGRhdGFUeXBlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLQotICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKENNRGF0YVR5cGUgZGF0YVR5cGUpCi0gIHsKLSAgICBTdHJpbmcgdmFsdWUgPSBudWxsOwotICAgIHZhbHVlID0gZGF0YVR5cGUuZ2V0SW1wbGllZFZhbHVlKCk7Ci0KLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBkYXRhVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0gICAgICBpZiAodmFsdWVzICE9IG51bGwgJiYgdmFsdWVzLmxlbmd0aCA+IDApCi0gICAgICB7Ci0gICAgICAgIHZhbHVlID0gdmFsdWVzWzBdOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHZhbHVlID0gZGF0YVR5cGUuZ2VuZXJhdGVJbnN0YW5jZVZhbHVlKCk7Ci0gICAgfSAgICAgICAgICAgICAgIAotCi0gICAgLy8gSGVyZSBpcyBhIHNwZWNpYWwgY2FzZSB3aGVyZSB3ZSBoYW5kbGUgRFREJ3MgSUQgcmVsYXRlZCBkYXRhdHlwZXMuCi0gICAgLy8gVGhlc2UgdmFsdWVzIG11c3QgYmUgZ2VuZXJhdGVkL3ZhbGlkYXRlIGJ5IGNvbnNpZGVyaW5nIHRoZSBlbnRpcmUgeG1sIGZpbGUKLSAgICAvLyBzbyB3ZSBjYW4ndCByZWx5IG9uIHRoZSAnZ2VuZXJhdGVJbnN0YW5jZVZhbHVlJyBtZXRob2QuCi0gICAgLy8KLSAgICAvLyB0b2RvLi4uIGZpbmQgYSBuaWNlciB3YXkgdG8gaGFuZGxlIHRoaXMgICAgCi0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGRhdGFUeXBlTmFtZSA9IGRhdGFUeXBlLmdldERhdGFUeXBlTmFtZSgpOwotICAgICAgaWYgKGRhdGFUeXBlTmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoZGF0YVR5cGVOYW1lLmVxdWFscygiSUQiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWUgPSAiaWR2YWx1ZSIgKyBpZENvdW50Kys7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChkYXRhVHlwZU5hbWUuZXF1YWxzKCJJRFJFRiIpIHx8IGRhdGFUeXBlTmFtZS5lcXVhbHMoIklEUkVGUyIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlID0gImlkdmFsdWUwIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAgCi0gICAgcmV0dXJuIHZhbHVlOwotICB9IAotICAgICAgCi0KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZEVtcHR5VmFsdWUoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkKLSAgeyAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0gICAgQ01EYXRhVHlwZSBkYXRhVHlwZSA9IGFkLmdldEF0dHJUeXBlKCk7Ci0gICAgaWYgKGRhdGFUeXBlICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFN0cmluZyBwcm9wZXJ0eVZhbHVlID0gKFN0cmluZylkYXRhVHlwZS5nZXRQcm9wZXJ0eSgiaXNWYWxpZEVtcHR5VmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKHByb3BlcnR5VmFsdWUgIT0gbnVsbCAmJiBwcm9wZXJ0eVZhbHVlLmVxdWFscygiZmFsc2UiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9ICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIGJvb2xlYW4gaXNYU0lUeXBlKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpCi0gIHsgICAgICAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIGlmIChhZC5nZXROb2RlTmFtZSgpLmVxdWFscygidHlwZSIpKSAgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWFkLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VOYW1lID0gKFN0cmluZyljbURvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKG5hbWVzcGFjZU5hbWUgIT0gbnVsbCAmJiBuYW1lc3BhY2VOYW1lLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7ICAgICAgICAgICAKLSAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAKLQotICBwdWJsaWMgTGlzdCBnZXRRdWFsaWZpZWRYU0lUeXBlcyhDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkLCBOYW1lc3BhY2VUYWJsZSB0YWJsZSkKLSAgeyAgICAgICAgICAKLSAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgTGlzdCB4c2lUeXBlcyA9IChMaXN0KWFkLmdldFByb3BlcnR5KCJYU0lUeXBlcyIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKHhzaVR5cGVzICE9IG51bGwgJiYgeHNpVHlwZXMuc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2lUeXBlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgeyAKLSAgICAgICAgU3RyaW5nIHVyaVF1YWxpZmllZE5hbWUgPSAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgICBTdHJpbmdbXSBjb21wb25lbnRzID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVSSVF1YWxpZmllZE5hbWVDb21wb25lbnRzKHVyaVF1YWxpZmllZE5hbWUpOyAgCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSB0YWJsZS5nZXRQcmVmaXhGb3JVUkkoY29tcG9uZW50c1swXSAhPSBudWxsID8gY29tcG9uZW50c1swXSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgPyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArICI6IiArIGNvbXBvbmVudHNbMV0gOiAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50c1sxXTsKLSAgICAgICAgbGlzdC5hZGQodHlwZU5hbWUpOwotICAgICAgfQotICAgIH0gICAgICAgICAgIAotICAgIHJldHVybiBsaXN0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9DTVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvQ01WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlNTM1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9DTVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01WaXNpdG9yOwotCi0KLQotcHVibGljIGNsYXNzIENNVmFsaWRhdG9yCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nRWxlbWVudENvbnRlbnRDb21wYXJhdG9yIHN0cmluZ0NvbnRlbnRDb21wYXJpdG9yID0gbmV3IFN0cmluZ0VsZW1lbnRDb250ZW50Q29tcGFyYXRvcigpOwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGdyYXBoTm9kZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gIC8qKgotICAgKiBHcmFwaE5vZGUKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgR3JhcGhOb2RlCi0gIHsKLSAgICBwdWJsaWMgU3RyaW5nIG5hbWU7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNUZXJtaW5hbDsKLSAgICBwdWJsaWMgVmVjdG9yIGFyY0xpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBwdWJsaWMgR3JhcGhOb2RlKFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQXJjKEFyYyBhcmMpCi0gICAgewotICAgICAgYXJjTGlzdC5hZGRFbGVtZW50KGFyYyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgcmV0dXJuICJbR3JhcGhOb2RlICIgKyBuYW1lICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBBcmMKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQXJjCi0gIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UICA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQRUFUICAgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElPTkFMID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVWX0lOICA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUX05FWFQgPSA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJTksgICAgID0gNjsKLQotICAgIHB1YmxpYyBpbnQga2luZDsKLSAgICBwdWJsaWMgU3RyaW5nIG5hbWU7Ci0gICAgcHVibGljIEdyYXBoTm9kZSBub2RlOwotICAgIHB1YmxpYyBDTU5vZGUgY21Ob2RlOwotCi0gICAgcHVibGljIEFyYyhpbnQga2luZCwgR3JhcGhOb2RlIG5vZGUsIENNTm9kZSBjbU5vZGUpCi0gICAgewotICAgICAgdGhpcyhraW5kLCAiIiwgbm9kZSwgY21Ob2RlKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHByb3RlY3RlZCBBcmMoaW50IGtpbmQsIFN0cmluZyBuYW1lLCBHcmFwaE5vZGUgbm9kZSwgQ01Ob2RlIGNtTm9kZSkKLSAgICB7Ci0gICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgdGhpcy5raW5kID0ga2luZDsKLSAgICAgIHRoaXMubm9kZSA9IG5vZGU7Ci0gICAgICB0aGlzLmNtTm9kZSA9IGNtTm9kZTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHcmFwaEdlbmVyYXRvcgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBHcmFwaEdlbmVyYXRvciBleHRlbmRzIENNVmlzaXRvcgotICB7Ci0gICAgcHVibGljIGludCBpbmRlbnQ7Ci0gICAgcHVibGljIGludCBjb3VudDsKLSAgICBwdWJsaWMgR3JhcGhOb2RlIHN0YXJ0R3JhcGhOb2RlOwotICAgIHB1YmxpYyBDb250ZXh0IGNvbnRleHQ7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIENvbnRleHQKLSAgICB7Ci0gICAgICBHcmFwaE5vZGUgZnJvbTsKLSAgICAgIEdyYXBoTm9kZSB0bzsKLQotICAgICAgQ29udGV4dChHcmFwaE5vZGUgZnJvbSwgR3JhcGhOb2RlIHRvKQotICAgICAgewotICAgICAgICB0aGlzLmZyb20gPSBmcm9tOwotICAgICAgICB0aGlzLnRvID0gdG87Ci0gICAgICB9Ci0KLSAgICAgIEdyYXBoTm9kZSBnZXRMYXN0R3JhcGhOb2RlKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICh0byAhPSBudWxsKSA/IHRvIDogZnJvbTsKLSAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCBHcmFwaEdlbmVyYXRvcigpCi0gICAgewotICAgICAgc3RhcnRHcmFwaE5vZGUgPSBuZXcgR3JhcGhOb2RlKGdldEdyYXBoTm9kZU5hbWUoKSk7Ci0gICAgICBjb250ZXh0ID0gbmV3IENvbnRleHQoc3RhcnRHcmFwaE5vZGUsIG51bGwpOwotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVHcmFwaChDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgICB7Ci0gICAgICBpbnQgY29udGVudFR5cGUgPSBlZC5nZXRDb250ZW50VHlwZSgpOwotCi0gICAgICBpZiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQgfHwKLSAgICAgICAgICBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UKQotICAgICAgewotICAgICAgICB2aXNpdENNTm9kZShlZC5nZXRDb250ZW50KCkpOwotICAgICAgfQotICAgICAgLy8gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBLi4uIG5vIGdyYXBoIHJlcXVpcmVkCi0gICAgICAvLyBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlkuLi4gbm8gZ3JhcGggcmVxdWlyZWQKLSAgICAgIGNvbnRleHQuZ2V0TGFzdEdyYXBoTm9kZSgpLmlzVGVybWluYWwgPSB0cnVlOwotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRHcmFwaE5vZGVOYW1lKCkKLSAgICB7Ci0gICAgICByZXR1cm4gIm4iICsgY291bnQrKzsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIEdyYXBoTm9kZSBnZXRTdGFydEdyYXBoTm9kZSgpCi0gICAgewotICAgICAgcmV0dXJuIHN0YXJ0R3JhcGhOb2RlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogICAgICAgICAgICAgICAgcmVwZWF0Ci0gICAgICogICAgICAgICAgICAgKy0tLS0jLS0tLS0rCi0gICAgICogICAgICAgICAgICAgfCAgICAgICAgICB8Ci0gICAgICogICAgICAgICAgICAgdiAgICAgICAgICB8Ci0gICAgICogIHByZXYgLS0jLT4gaW4gLS0neCctPiBvdXQgLS0jLT4gbmV4dAotICAgICAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KLSAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICogICstLS0tLS0tLS0tLS0tLS0tIy0tLS0tLS0tLS0tLS0tKwotICAgICAqICAgICAgICAgICAgICAgIG9wdGlvbmFsCi0gICAgICoKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBcmNzKEdyYXBoTm9kZSBpbiwgR3JhcGhOb2RlIG91dCwgQ01Db250ZW50IGNtQ29udGVudCkKLSAgICB7Ci0gICAgICBjcmVhdGVBcmNzKGluLCBvdXQsIGNtQ29udGVudCwgZmFsc2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFyY3MoR3JhcGhOb2RlIGluLCBHcmFwaE5vZGUgb3V0LCBDTUNvbnRlbnQgY21Db250ZW50LCBib29sZWFuIGlzQWxsR3JvdXApCi0gICAgewotICAgICAgLy9wcmludGxuKCIrY3JlYXRlQXJjcygpICIgKyBlZC5nZXREZXNjcmlwdGlvbigpICsgIiAiICsgZWQuZ2V0TWluT2NjdXIoKSk7Ci0gICAgICBHcmFwaE5vZGUgcHJldiA9IGNvbnRleHQuZnJvbTsKLSAgICAgIEdyYXBoTm9kZSBuZXh0ID0gbmV3IEdyYXBoTm9kZShnZXRHcmFwaE5vZGVOYW1lKCkpOwotCi0gICAgICBwcmV2LmFkZEFyYyhuZXcgQXJjKEFyYy5QUkVWX0lOLCBpbiwgY21Db250ZW50KSk7Ci0gICAgICBvdXQuYWRkQXJjKG5ldyBBcmMoQXJjLk9VVF9ORVhULCBuZXh0LCBjbUNvbnRlbnQpKTsKLQotICAgICAgaWYgKGNvbnRleHQudG8gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmV4dC5hZGRBcmMobmV3IEFyYyhBcmMuTElOSywgY29udGV4dC50bywgY21Db250ZW50KSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGNvbnRleHQuZnJvbSA9IG5leHQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChjbUNvbnRlbnQuZ2V0TWluT2NjdXIoKSA9PSAwKQotICAgICAgewotICAgICAgICAvLyB0b2RvLi4uIHNob3VsZCB3ZSBzZWUgaWYgYW4gb3B0aW9uYWwgYXJjIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQ/Ci0gICAgICAgIHByZXYuYWRkQXJjKG5ldyBBcmMoQXJjLk9QVElPTkFMLCBuZXh0LCBjbUNvbnRlbnQpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGNtQ29udGVudC5nZXRNYXhPY2N1cigpID09IC0xIHx8IGNtQ29udGVudC5nZXRNYXhPY2N1cigpID4gMSB8fCBpc0FsbEdyb3VwKQotICAgICAgewotICAgICAgICBvdXQuYWRkQXJjKG5ldyBBcmMoQXJjLlJFUEVBVCwgaW4sIGNtQ29udGVudCkpOwotICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUdyb3VwKENNR3JvdXAgZ3JvdXApCi0gICAgewotICAgICAgQ29udGV4dCBwcmV2Q29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICBHcmFwaE5vZGUgaW4gPSBuZXcgR3JhcGhOb2RlKCIoIiArIGdldEdyYXBoTm9kZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIEdyYXBoTm9kZSBvdXQgPSBuZXcgR3JhcGhOb2RlKCIpIiArIGdldEdyYXBoTm9kZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgaW50IGdyb3VwT3BlcmF0b3IgPSBncm91cC5nZXRPcGVyYXRvcigpOwotICAgICAgaWYgKGdyb3VwT3BlcmF0b3IgPT0gQ01Hcm91cC5TRVFVRU5DRSkKLSAgICAgIHsKLSAgICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0KGluLCBudWxsKTsKLSAgICAgICAgc3VwZXIudmlzaXRDTUdyb3VwKGdyb3VwKTsKLSAgICAgICAgY29udGV4dC5mcm9tLmFkZEFyYyhuZXcgQXJjKEFyYy5MSU5LLCBvdXQsIGdyb3VwKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChncm91cE9wZXJhdG9yID09IENNR3JvdXAuQ0hPSUNFIHx8Ci0gICAgICAgICAgICAgICBncm91cE9wZXJhdG9yID09IENNR3JvdXAuQUxMKQotICAgICAgewotICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHQoaW4sIG91dCk7Ci0gICAgICAgIHN1cGVyLnZpc2l0Q01Hcm91cChncm91cCk7Ci0gICAgICB9Ci0KLSAgICAgIGNvbnRleHQgPSBwcmV2Q29udGV4dDsKLSAgICAgIGNyZWF0ZUFyY3MoaW4sIG91dCwgZ3JvdXAsIGdyb3VwT3BlcmF0b3IgPT0gQ01Hcm91cC5BTEwpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgICB7Ci0gICAgICBHcmFwaE5vZGUgaW4gPSBuZXcgR3JhcGhOb2RlKGdldEdyYXBoTm9kZU5hbWUoKSk7Ci0gICAgICBHcmFwaE5vZGUgb3V0ID0gbmV3IEdyYXBoTm9kZShnZXRHcmFwaE5vZGVOYW1lKCkpOwotICAgICAgY3JlYXRlQXJjcyhpbiwgb3V0LCBlZCk7Ci0gICAgICBpbi5hZGRBcmMobmV3IEFyYyhBcmMuRUxFTUVOVCwgZWQuZ2V0RWxlbWVudE5hbWUoKSwgb3V0LCBlZCkpOwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01BbnlFbGVtZW50KENNQW55RWxlbWVudCBhbnlFbGVtZW50KQotICAgIHsKLSAgICAgIEdyYXBoTm9kZSBpbiA9IG5ldyBHcmFwaE5vZGUoZ2V0R3JhcGhOb2RlTmFtZSgpKTsKLSAgICAgIEdyYXBoTm9kZSBvdXQgPSBuZXcgR3JhcGhOb2RlKGdldEdyYXBoTm9kZU5hbWUoKSk7Ci0gICAgICBjcmVhdGVBcmNzKGluLCBvdXQsIGFueUVsZW1lbnQpOwotICAgICAgaW4uYWRkQXJjKG5ldyBBcmMoQXJjLkVMRU1FTlQsICJhbnkiLCBvdXQsIGFueUVsZW1lbnQpKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotCi0gIC8vIHRvZG8uLiBpbXBsZW1lbnQgY2FjaGUgc3RyYXRlZ3kgaG9vaywgaGFuZGxlIG5hbWUgc3BhY2VzLCBsb2NhbHMgZXRjLgotICAvLwotICBwdWJsaWMgR3JhcGhOb2RlIGxvb2t1cE9yQ3JlYXRlR3JhcGgoQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkKLSAgewotICAgIE9iamVjdCBrZXkgPSBlbGVtZW50OwotICAgIEdyYXBoTm9kZSBub2RlID0gKEdyYXBoTm9kZSlncmFwaE5vZGVUYWJsZS5nZXQoa2V5KTsKLSAgICBpZiAobm9kZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG5vZGUgPSBjcmVhdGVHcmFwaChlbGVtZW50KTsKLSAgICAgIGdyYXBoTm9kZVRhYmxlLnB1dChrZXksIG5vZGUpOwotICAgIH0KLSAgICByZXR1cm4gbm9kZTsKLSAgfQotCi0gIHB1YmxpYyBHcmFwaE5vZGUgY3JlYXRlR3JhcGgoQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkKLSAgewotICAgIEdyYXBoR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBHcmFwaEdlbmVyYXRvcigpOwotICAgIGdlbmVyYXRvci5nZW5lcmF0ZUdyYXBoKGVsZW1lbnQpOwotICAgIHJldHVybiBnZW5lcmF0b3IuZ2V0U3RhcnRHcmFwaE5vZGUoKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgcHJpbnRHcmFwaChHcmFwaE5vZGUgbm9kZSwgVmVjdG9yIG5hbWVkQXJjTGlzdCwgVmVjdG9yIHVuYW1lZEFyY0xpc3QsIGludCBpbmRlbnQpCi0gIHsKLSAgICAvL1N0cmluZyBkZWNvcmF0aW9uID0gbm9kZS5pc1Rlcm1pbmFsID8gIiAqIiA6ICIiOwotICAgIC8vcHJpbnRsbkluZGVudGVkKGluZGVudCwgIkdyYXBoTm9kZToiICsgbm9kZS5uYW1lICsgZGVjb3JhdGlvbik7Ci0KLSAgICBpbmRlbnQgKz0gMjsKLSAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBub2RlLmFyY0xpc3QuZWxlbWVudHMoKSA7IGUuaGFzTW9yZUVsZW1lbnRzKCkgOykKLSAgICB7Ci0gICAgICBBcmMgYXJjID0gKEFyYyllLm5leHRFbGVtZW50KCk7Ci0gICAgICAvL2Jvb2xlYW4gdmlzaXQgPSBmYWxzZTsKLSAgICAgIC8vcHJpbnRsbkluZGVudGVkKGluZGVudCwgIkFyYzoiICsgYXJjLm5hbWUgKyAiICgiICsgYXJjLmtpbmQgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgaWYgKGFyYy5raW5kID09IEFyYy5FTEVNRU5UKQotICAgICAgewotICAgICAgICAvL3RhYmxlLmFkZChjdXJyZW50R3JhbW1hck9iamVjdCwgYXJjLmdyYW1tYXJPYmplY3QpOwotICAgICAgICBpZiAoIW5hbWVkQXJjTGlzdC5jb250YWlucyhhcmMpKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZWRBcmNMaXN0LmFkZChhcmMpOwotICAgICAgICAgIHVuYW1lZEFyY0xpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgcHJpbnRHcmFwaChhcmMubm9kZSwgbmFtZWRBcmNMaXN0LCB1bmFtZWRBcmNMaXN0LCBpbmRlbnQgKyAyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIXVuYW1lZEFyY0xpc3QuY29udGFpbnMoYXJjKSkKLSAgICAgICAgewotICAgICAgICAgIHVuYW1lZEFyY0xpc3QuYWRkKGFyYyk7Ci0gICAgICAgICAgcHJpbnRHcmFwaChhcmMubm9kZSwgbmFtZWRBcmNMaXN0LCB1bmFtZWRBcmNMaXN0LCBpbmRlbnQgKyAyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByaW50R3JhcGgoR3JhcGhOb2RlIG5vZGUpCi0gIHsKLSAgICBwcmludEdyYXBoKG5vZGUsIG5ldyBWZWN0b3IoKSwgbmV3IFZlY3RvcigpLCAwKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgdmFsaWRhdGVFbGVtZW50TGlzdChFbGVtZW50TGlzdCBsaXN0LCBHcmFwaE5vZGUgbm9kZSwgRWxlbWVudENvbnRlbnRDb21wYXJhdG9yIGNvbXBhcmF0b3IsIFJlc3VsdCByZXN1bHQsIGJvb2xlYW4gbG9vcEZsYWcpCi0gIHsKLSAgICAvL3ByaW50bG4oIit2YWxpZGF0ZUVsZW1lbnRMaXN0ICIgKyBub2RlICsgIiAiICsgbGlzdCk7Ci0gICAgaWYgKGxpc3QgPT0gbnVsbCAmJiBub2RlLmlzVGVybWluYWwpCi0gICAgewotICAgICAgcmVzdWx0LmlzVmFsaWQgPSB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gbm9kZS5hcmNMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQXJjIGFyYyA9IChBcmMpaS5uZXh0KCk7Ci0gICAgICAgIGJvb2xlYW4gdHJhdmVyc2VBcmMgPSBmYWxzZTsKLSAgICAgICAgaWYgKGFyYy5raW5kID09IEFyYy5FTEVNRU5UKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCAmJiBjb21wYXJhdG9yLm1hdGNoZXMobGlzdC5oZWFkLCBhcmMuY21Ob2RlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsb29wRmxhZyA9IGZhbHNlOwotICAgICAgICAgICAgdHJhdmVyc2VBcmMgPSB0cnVlOwotICAgICAgICAgICAgbGlzdCA9IGxpc3QudGFpbDsgLy8gaW5jcmVtZW50IG91ciBwb3NpdGlvbiBpbiB0aGUgbGlzdAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhcmMua2luZCA9PSBBcmMuUkVQRUFUKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFsb29wRmxhZykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0cmF2ZXJzZUFyYyA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGxvb3BGbGFnID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB0cmF2ZXJzZUFyYyA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHJhdmVyc2VBcmMpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyB0ZXN0IHRvIHNlZSBpZiB3ZSBjYW4gcHVzaCB0aGlzIGFyYyBkdWUgdG8gZmFjZXQgY29uc3RyYWludHMKLSAgICAgICAgICAvLwotICAgICAgICAgIGlmIChyZXN1bHQuY2FuUHVzaChhcmMpKQotICAgICAgICAgIHsgICAgICAgICAgCi0gICAgICAgICAgICAvLyBzZWUgaWYgdGhpcyBhcmMgbGVhZHMgdG8gYSBjb3JyZWN0IHNvbHV0aW9uICAgICAgICAgIAotICAgICAgICAgICAgcmVzdWx0LnB1c2goYXJjKTsKLSAgICAgICAgICAgIHZhbGlkYXRlRWxlbWVudExpc3QobGlzdCwgYXJjLm5vZGUsIGNvbXBhcmF0b3IsIHJlc3VsdCwgbG9vcEZsYWcpOwotICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1ZhbGlkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3VsdC5wb3AoYXJjKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBFbGVtZW50TGlzdCBjcmVhdGVFbGVtZW50TGlzdChpbnQgY29udGVudFR5cGUsIExpc3QgdiwgRWxlbWVudENvbnRlbnRDb21wYXJhdG9yIGNvbXBhcmF0b3IsIFJlc3VsdCByZXN1bHQpCi0gIHsKLSAgICBFbGVtZW50TGlzdCBmaXJzdCA9IG51bGw7Ci0gICAgRWxlbWVudExpc3QgcHJldiA9IG51bGw7Ci0KLSAgICBpbnQgc2l6ZSA9IHYuc2l6ZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gdi5nZXQoaSk7Ci0gICAgICBpZiAobyAhPSBudWxsICYmICFjb21wYXJhdG9yLmlzSWdub3JhYmxlKG8pKQotICAgICAgewotICAgICAgICBpZiAoY29tcGFyYXRvci5pc0VsZW1lbnQobykpCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50TGlzdCBsaXN0ID0gbmV3IEVsZW1lbnRMaXN0KCk7Ci0gICAgICAgICAgbGlzdC5oZWFkID0gbzsKLQotICAgICAgICAgIGlmIChwcmV2ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJldi50YWlsID0gbGlzdDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZpcnN0ID0gbGlzdDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcHJldiA9IGxpc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5pc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgcmVzdWx0LmVycm9ySW5kZXggPSBpOwotICAgICAgICAgIHJlc3VsdC5lcnJvck1lc3NhZ2UgPSAiRWxlbWVudCBjYW4gbm90IGluY2x1ZGUgUENEQVRBIGNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZpcnN0OwotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgTGlzdCBlbGVtZW50Q29udGVudCwgRWxlbWVudENvbnRlbnRDb21wYXJhdG9yIGNvbXBhcmF0b3IsIFJlc3VsdCByZXN1bHQpCi0gIHsKLSAgICBpbnQgY29udGVudFR5cGUgPSBlZC5nZXRDb250ZW50VHlwZSgpOwotCi0gICAgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIHx8Ci0gICAgICAgIGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQpCi0gICAgewotICAgICAgRWxlbWVudExpc3QgZWxlbWVudExpc3QgPSBjcmVhdGVFbGVtZW50TGlzdChjb250ZW50VHlwZSwgZWxlbWVudENvbnRlbnQsIGNvbXBhcmF0b3IsIHJlc3VsdCk7Ci0gICAgICBpZiAocmVzdWx0LmlzVmFsaWQgPT0gdHJ1ZSkKLSAgICAgIHsgIAotICAgICAgICAvLyBkZWZlY3QgMjI2MjEzIC4uLiBlbGVtZW50cyB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mIGNoaWxkcmVuIHdpbGwgY2F1c2UgdGhlIHJlY3Vyc2lvbiBiYXNlZCB2YWxpZGF0aW9uCi0gICAgICAgIC8vIGFsZ29yaXRobSB0byBzdGFjayBvdmVyZmxvdyAuLi4gYXMgYSBxdWljayBmaXggYXNzdW1lIGFueSBlbGVtZW50IHdpdGggYSBsYXJnZSBudW1iZXIgb2YgY2hpbGRyZW4gaXMgdmFsaWQgICAgICAgIAotICAgICAgICBpZiAoZWxlbWVudENvbnRlbnQuc2l6ZSgpIDwgNTAwKQotICAgICAgICB7Ci0gICAgICAgICAgYm9vbGVhbiBpc0dyYXBoVmFsaWRhdGlvbk5lZWRlZCA9ICEoZWxlbWVudExpc3QgPT0gbnVsbCAmJiBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgLy8gZXhsaWNpdHkgaGFuZGxlICdBbGwnIGdyb3VwcwotICAgICAgICAgIC8vCi0gICAgICAgICAgQ01Db250ZW50IGNvbnRlbnQgPSBlZC5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgaWYgKGNvbnRlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuR1JPVVApCi0gICAgICAgICAgewotICAgICAgICAgICAgQ01Hcm91cCBncm91cCA9IChDTUdyb3VwKWNvbnRlbnQ7Ci0gICAgICAgICAgICBpZiAoZ3JvdXAuZ2V0T3BlcmF0b3IoKSA9PSBDTUdyb3VwLkFMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaXNHcmFwaFZhbGlkYXRpb25OZWVkZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgdmFsaWRhdEFsbEdyb3VwQ29udGVudChlbGVtZW50Q29udGVudCwgY29tcGFyYXRvciwgZ3JvdXAsIHJlc3VsdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfSAgICAgICAgICAgICAgCi0gICAgICAgICAgfSAgCi0gICAgICAgICAgCi0gICAgICAgICAgaWYgKGlzR3JhcGhWYWxpZGF0aW9uTmVlZGVkKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIHZhbGlkYXRlIHRoZSBlbGVtZW50TGlzdCB1c2luZyBhIGdyYXBoCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgcmVzdWx0LmlzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIEdyYXBoTm9kZSBub2RlID0gbG9va3VwT3JDcmVhdGVHcmFwaChlZCk7Ci0gICAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnRMaXN0KGVsZW1lbnRMaXN0LCBub2RlLCBjb21wYXJhdG9yLCByZXN1bHQsIGZhbHNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBKQotICAgIHsKLSAgICAgIGludCBzaXplID0gZWxlbWVudENvbnRlbnQuc2l6ZSgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvID0gZWxlbWVudENvbnRlbnQuZ2V0KGkpOwotICAgICAgICBpZiAoY29tcGFyYXRvci5pc0VsZW1lbnQobykpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQuaXNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIHJlc3VsdC5lcnJvckluZGV4ID0gaTsKLSAgICAgICAgICByZXN1bHQuZXJyb3JNZXNzYWdlID0gIkVsZW1lbnQgbWF5IG9ubHkgaW5jbHVkZSBQQ0RBVEEgY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkKLSAgICB7Ci0gICAgICBpbnQgc2l6ZSA9IGVsZW1lbnRDb250ZW50LnNpemUoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGVsZW1lbnRDb250ZW50LmdldChpKTsKLSAgICAgICAgaWYgKCFjb21wYXJhdG9yLmlzSWdub3JhYmxlKG8pKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0LmlzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICByZXN1bHQuZXJyb3JJbmRleCA9IGk7Ci0gICAgICAgICAgcmVzdWx0LmVycm9yTWVzc2FnZSA9ICJFbGVtZW50IG1heSBub3QgY29udGFpbiBQQ0RBVEEgb3IgRWxlbWVudCBjb250ZW50IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vZWxzZSBpZiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZKQotICAgIC8vIHsKLSAgICAvLyAgIGFzc3VtZSBlbGVtZW50Q29udGVudCB3aWxsIGFsd2F5cyBiZSB2YWxpZCBmb3IgdGhpcyBjb250ZW50IHR5cGUKLSAgICAvLyB9Ci0gIH0KLSAgICAKLSAgc3RhdGljIGNsYXNzIEl0ZW1Db3VudAotICB7Ci0gICAgaW50IGNvdW50ID0gMDsgICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB2YWxpZGF0QWxsR3JvdXBDb250ZW50KExpc3QgZWxlbWVudENvbnRlbnQsIEVsZW1lbnRDb250ZW50Q29tcGFyYXRvciBjb21wYXJhdG9yLCBDTUdyb3VwIGFsbEdyb3VwLCBSZXN1bHQgcmVzdWx0KSAKLSAgewotICAgIGJvb2xlYW4gaXNWYWxpZCA9IHRydWU7Ci0gICAgYm9vbGVhbiBpc1BhcnRpYWxseVZhbGlkID0gdHJ1ZTsKLSAgICBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgQ01Ob2RlTGlzdCBsaXN0ID0gYWxsR3JvdXAuZ2V0Q2hpbGROb2RlcygpOwotICAgIGZvciAoaW50IGogPSBsaXN0LmdldExlbmd0aCgpIC0gMTsgaiA+PSAwOyBqLS0pCi0gICAgewotICAgICAgQ01Ob2RlIG5vZGUgPSBsaXN0Lml0ZW0oaik7ICAgICAgCi0gICAgICBpZiAobWFwLmdldChub2RlKSA9PSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIG1hcC5wdXQobm9kZSwgbmV3IEl0ZW1Db3VudCgpKTsKLSAgICAgIH0gIAotICAgIH0gICAgCi0gICAgaW50IHZhbGlkaXRpb25Db3VudCA9IDA7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZWxlbWVudENvbnRlbnQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IHZhbGlkaXRpb25Db3VudCsrKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7ICAgICAgICAKLSAgICAgIGlmIChjb21wYXJhdG9yLmlzRWxlbWVudChvKSkKLSAgICAgIHsgICAgICAgICAgICAgIAotICAgICAgICAvLyB0ZXN0IHRvIHNlZSBpZiB0aGUgZWxlbWVudCBpcyBsaXN0ZWQgaW4gdGhlIGFsbCBncm91cAotICAgICAgICAvLwotICAgICAgICBDTU5vZGUgbWF0Y2hpbmdDTU5vZGUgPSBudWxsOwotICAgICAgICBmb3IgKGludCBqID0gbGlzdC5nZXRMZW5ndGgoKSAtIDE7IGogPj0gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgQ01Ob2RlIG5vZGUgPSBsaXN0Lml0ZW0oaik7Ci0gICAgICAgICAgaWYgKGNvbXBhcmF0b3IubWF0Y2hlcyhvLCBub2RlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXRjaGluZ0NNTm9kZSA9IG5vZGU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9ICAgICAgICAgICAgIAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChtYXRjaGluZ0NNTm9kZSA9PSBudWxsKQotICAgICAgICB7ICAgICAKLSAgICAgICAgICBpc1BhcnRpYWxseVZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeyAgCi0gICAgICAgICAgLy8gdGVzdCB0byBzZWUgdGhhdCB0aGUgZWxlbWVudCBvY2N1cnMgb25seSBvbmNlCi0gICAgICAgICAgLy8KLSAgICAgICAgICBJdGVtQ291bnQgaXRlbUNvdW50ID0gKEl0ZW1Db3VudCltYXAuZ2V0KG1hdGNoaW5nQ01Ob2RlKTsKLSAgICAgICAgICBpZiAoaXRlbUNvdW50ICE9IG51bGwpCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICBpZiAoaXRlbUNvdW50LmNvdW50ID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBhbGxvdyB0b28gbWFueSBlbGVtZW50cyEKLSAgICAgICAgICAgICAgLy8gd2UgY29uc2lkZXIgJ25vdCBlbm91Z2gnIHRvIGJlIHBhcnRpYWxseSB2YWxpZC4uLiBidXQgbm90ICd0b28gbWFueScKLSAgICAgICAgICAgICAgaXNQYXJ0aWFsbHlWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpdGVtQ291bnQuY291bnQrKzsKLSAgICAgICAgICAgIH0gIAotICAgICAgICAgIH0KLSAgICAgICAgfSAgCi0gICAgICB9ICAKLSAgICB9Ci0gICAgaWYgKGlzVmFsaWQpCi0gICAgeyAgCi0gICAgICBmb3IgKGludCBqID0gbGlzdC5nZXRMZW5ndGgoKSAtIDE7IGogPj0gMDsgai0tKQotICAgICAgewotICAgICAgICBDTU5vZGUgbm9kZSA9IGxpc3QuaXRlbShqKTsgICAgICAKLSAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikKLSAgICAgICAgeyAgCi0gICAgICAgICAgQ01Db250ZW50IGNvbnRlbnQgPSAoQ01Db250ZW50KW5vZGU7Ci0gICAgICAgICAgSXRlbUNvdW50IGl0ZW1Db3VudCA9IChJdGVtQ291bnQpbWFwLmdldChub2RlKTsKLS8vICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoImNvbnRlbnQgIiArIGNvbnRlbnQuZ2V0Tm9kZU5hbWUoKSArICIgIiArIGNvbnRlbnQuZ2V0TWluT2NjdXIoKSk7Ci0gICAgICAgICAgaWYgKGl0ZW1Db3VudC5jb3VudCA8IGNvbnRlbnQuZ2V0TWluT2NjdXIoKSkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gIAotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVsZW1lbnRQYXRoUmVjb3JkaW5nUmVzdWx0ICYmIGlzUGFydGlhbGx5VmFsaWQpCi0gICAgewotICAgICAgKChFbGVtZW50UGF0aFJlY29yZGluZ1Jlc3VsdClyZXN1bHQpLnNldFBhcnRpYWxWYWxpZGF0aW9uQ291bnQodmFsaWRpdGlvbkNvdW50KTsKLSAgICB9ICAKLSAgICByZXN1bHQuaXNWYWxpZCA9IGlzVmFsaWQ7Ci0gIH0gIAotICAKLSAgCi0gIHB1YmxpYyB2b2lkIGdldE9yaWdpbkFycmF5KENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IGVsZW1lbnRDb250ZW50LCBFbGVtZW50Q29udGVudENvbXBhcmF0b3IgY29tcGFyYXRvciwgRWxlbWVudFBhdGhSZWNvcmRpbmdSZXN1bHQgcmVzdWx0KQotICB7Ci0gICAgQ01Ob2RlW10gY21Ob2RlQXJyYXkgPSBudWxsOwotICAgIHZhbGlkYXRlKGVkLCBlbGVtZW50Q29udGVudCwgY29tcGFyYXRvciwgcmVzdWx0KTsKLSAgICBpZiAocmVzdWx0LmlzVmFsaWQpCi0gICAgewotICAgICAgQ01EYXRhVHlwZSBkYXRhVHlwZSA9IGVkLmdldERhdGFUeXBlKCk7Ci0gICAgICBpbnQgc2l6ZSA9IGVsZW1lbnRDb250ZW50LnNpemUoKTsKLSAgICAgIGNtTm9kZUFycmF5ID0gbmV3IENNTm9kZVtzaXplXTsKLSAgICAgIFZlY3RvciBvcmlnaW5MaXN0ID0gcmVzdWx0LmdldEVsZW1lbnRPcmlnaW5MaXN0KCk7Ci0gICAgICBpbnQgb3JpZ2luTGlzdFNpemUgPSBvcmlnaW5MaXN0LnNpemUoKTsgCi0gICAgICBpbnQgb3JpZ2luTGlzdEluZGV4ID0gMDsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGVsZW1lbnRDb250ZW50LmdldChpKTsKLSAgICAgICAgaWYgKGNvbXBhcmF0b3IuaXNFbGVtZW50KG8pKQotICAgICAgICB7ICAgICAKLSAgICAgICAgICBpZiAob3JpZ2luTGlzdEluZGV4IDwgb3JpZ2luTGlzdFNpemUpCi0gICAgICAgICAgewotICAgICAgICAgICAgY21Ob2RlQXJyYXlbaV0gPSAoQ01Ob2RlKW9yaWdpbkxpc3QuZ2V0KG9yaWdpbkxpc3RJbmRleCk7Ci0gICAgICAgICAgICBvcmlnaW5MaXN0SW5kZXgrKzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29tcGFyYXRvci5pc1BDRGF0YShvKSkKLSAgICAgICAgewotICAgICAgICAgIGNtTm9kZUFycmF5W2ldID0gZGF0YVR5cGU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZWxzZSB0aGUgQ01Ob2RlIGF0IHRoaXMgaW5kZXggaXMgbnVsbAotICAgICAgfQotICAgICAgcmVzdWx0LnNldE9yaWdpbkFycmF5KGNtTm9kZUFycmF5KTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBjb2xsZWN0TmFtZWRBcmNzKEdyYXBoTm9kZSBub2RlLCBMaXN0IG5hbWVkQXJjTGlzdCwgaW50IGluZGVudCkKLSAgewotICAgIC8vcHJpbnRsbkluZGVudGVkKGluZGVudCwgIkdyYXBoTm9kZToiICsgbm9kZS5uYW1lICsgZGVjb3JhdGlvbik7Ci0gICAgaW5kZW50ICs9IDI7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbm9kZS5hcmNMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpIDspCi0gICAgewotICAgICAgQXJjIGFyYyA9IChBcmMpaS5uZXh0KCk7Ci0gICAgICAvL3ByaW50bG5JbmRlbnRlZChpbmRlbnQsICJBcmM6IiArIGFyYy5uYW1lICsgIiAoIiArIGFyYy5raW5kICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIGlmIChhcmMua2luZCA9PSBBcmMuRUxFTUVOVCkKLSAgICAgIHsgCi0gICAgICAgIGlmICghbmFtZWRBcmNMaXN0LmNvbnRhaW5zKGFyYykpCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lZEFyY0xpc3QuYWRkKGFyYyk7Ci0gICAgICAgICAgY29sbGVjdE5hbWVkQXJjcyhhcmMubm9kZSwgbmFtZWRBcmNMaXN0LCBpbmRlbnQgKyAyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXJjLmtpbmQgIT0gQXJjLlJFUEVBVCAmJiBhcmMua2luZCAhPSBBcmMuT1BUSU9OQUwpCi0gICAgICB7Ci0gICAgICAgIGNvbGxlY3ROYW1lZEFyY3MoYXJjLm5vZGUsIG5hbWVkQXJjTGlzdCwgaW5kZW50ICsgMik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAKLSAgcHJpdmF0ZSBMaXN0IGdldE1hdGNoaW5nQXJjcyhDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgU3RyaW5nIGVsZW1lbnROYW1lKQotICB7Ci0gICAgTGlzdCBhcmNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIEdyYXBoTm9kZSBncmFwaE5vZGUgPSBsb29rdXBPckNyZWF0ZUdyYXBoKGVkKTsKLSAgICBpZiAoZWxlbWVudE5hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBoZXJlIHdlIGFkZCB0aGUgJ3Jvb3QnIGFyYwotICAgICAgZm9yIChJdGVyYXRvciBpID0gZ3JhcGhOb2RlLmFyY0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCkgOykKLSAgICAgIHsKLSAgICAgICAgQXJjIGFyYyA9IChBcmMpaS5uZXh0KCk7Ci0gICAgICAgIGlmIChhcmMua2luZCA9PSBBcmMuUFJFVl9JTikKLSAgICAgICAgewotICAgICAgICAgIGFyY0xpc3QuYWRkKGFyYyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gIAotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgeyAKLSAgICAgIExpc3QgbmFtZWRBcmNzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgY29sbGVjdE5hbWVkQXJjcyhncmFwaE5vZGUsIG5hbWVkQXJjcywgMCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuYW1lZEFyY3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgQXJjIGFyYyA9IChBcmMpaS5uZXh0KCk7Ci0gICAgICAgIGlmIChhcmMuY21Ob2RlICE9IG51bGwgJiYgZWxlbWVudE5hbWUuZXF1YWxzKGFyYy5jbU5vZGUuZ2V0Tm9kZU5hbWUoKSkpCi0gICAgICAgIHsgIAotICAgICAgICAgIGFyY0xpc3QuYWRkKGFyYyk7Ci0gICAgICAgIH0gIAotICAgICAgfSAgCi0gICAgfSAgICAgIAotICAgIHJldHVybiBhcmNMaXN0OwotICB9Ci0KLSAgCi0gIHByaXZhdGUgdm9pZCBjb2xsZWN0TmV4dFNpYmxpbmdzKEdyYXBoTm9kZSBub2RlLCBMaXN0IG5leHRTaWJsaW5nTGlzdCwgTGlzdCBuYW1lZEFyY0xpc3QsIExpc3QgdW5hbWVkQXJjTGlzdCwgaW50IGluZGVudCkKLSAgewotICAgIC8vcHJpbnRsbkluZGVudGVkKGluZGVudCwgIkdyYXBoTm9kZToiICsgbm9kZS5uYW1lICsgZGVjb3JhdGlvbik7Ci0gICAgaW5kZW50ICs9IDI7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbm9kZS5hcmNMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQXJjIGFyYyA9IChBcmMpaS5uZXh0KCk7Ci0gICAgICBpZiAoYXJjLmtpbmQgPT0gQXJjLkVMRU1FTlQpCi0gICAgICB7ICAgICAgIAotICAgICAgICBpZiAoIW5hbWVkQXJjTGlzdC5jb250YWlucyhhcmMpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGFyYy5jbU5vZGUgIT0gbnVsbCkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgIG5leHRTaWJsaW5nTGlzdC5hZGQoYXJjLmNtTm9kZSk7Ci0gICAgICAgICAgICBpZiAoYXJjLmNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIHx8Ci0gICAgICAgICAgICAgICAgYXJjLmNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BTllfRUxFTUVOVCkKLSAgICAgICAgICAgIHsgICAgICAgICAgICAgIAotICAgICAgICAgICAgICBuYW1lZEFyY0xpc3QuYWRkKGFyYyk7Ci0gICAgICAgICAgICAgIENNQ29udGVudCBjbU5vZGUgPSAoQ01Db250ZW50KWFyYy5jbU5vZGU7IAotICAgICAgICAgICAgICBpZiAoY21Ob2RlLmdldE1pbk9jY3VyKCkgPT0gMCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVuYW1lZEFyY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgY29sbGVjdE5leHRTaWJsaW5ncyhhcmMubm9kZSwgbmV4dFNpYmxpbmdMaXN0LCBuYW1lZEFyY0xpc3QsIHVuYW1lZEFyY0xpc3QsIGluZGVudCArIDIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9ICAKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCF1bmFtZWRBcmNMaXN0LmNvbnRhaW5zKGFyYykpCi0gICAgICAgIHsKLSAgICAgICAgICB1bmFtZWRBcmNMaXN0LmFkZChhcmMpOwotICAgICAgICAgIGNvbGxlY3ROZXh0U2libGluZ3MoYXJjLm5vZGUsIG5leHRTaWJsaW5nTGlzdCwgbmFtZWRBcmNMaXN0LCB1bmFtZWRBcmNMaXN0LCBpbmRlbnQgKyAyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gIAotICB9Ci0gICAgCi0gIHB1YmxpYyBDTU5vZGVbXSBnZXROZXh0U2libGluZ3MoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIFN0cmluZyBlbGVtZW50TmFtZSkKLSAgewotICAgIExpc3QgYXJjTGlzdCA9IGdldE1hdGNoaW5nQXJjcyhlZCwgZWxlbWVudE5hbWUpOwotICAgIExpc3QgbmV4dFNpYmxpbmdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGFyY0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBBcmMgYXJjID0gKEFyYylpLm5leHQoKTsKLSAgICAgIGNvbGxlY3ROZXh0U2libGluZ3MoYXJjLm5vZGUsIG5leHRTaWJsaW5nTGlzdCwgbmV3IEFycmF5TGlzdCgpLCBuZXcgQXJyYXlMaXN0KCksIDApOyAgICAgIAotICAgIH0gIAotICAgIENNTm9kZVtdIHJlc3VsdCA9IG5ldyBDTU5vZGVbbmV4dFNpYmxpbmdMaXN0LnNpemUoKV07Ci0gICAgbmV4dFNpYmxpbmdMaXN0LnRvQXJyYXkocmVzdWx0KTsgICAgCi0gICAgLy9TeXN0ZW0ub3V0LnByaW50KCJnZXROZXh0U2libGluZygiICtlbGVtZW50TmFtZSArICIpIik7Ci0gICAgLy9mb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykKLSAgICAvL3sKLSAgICAvLyAgU3lzdGVtLm91dC5wcmludCgiWyIgKyByZXN1bHRbaV0uZ2V0Tm9kZU5hbWUoKSArICJdIik7Ci0gICAgLy99ICAKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzdWx0Ci0gIHsKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkID0gdHJ1ZTsKLSAgICBwdWJsaWMgaW50IGVycm9ySW5kZXggPSAtMTsKLSAgICBwdWJsaWMgU3RyaW5nIGVycm9yTWVzc2FnZTsKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcGVhdFRyYXZlcnNlZDsgLy8gZGV0ZWN0cyBpZiBhIHJlcGVhdCBoYXMgYmVlbiB0cmF2ZXJzZWQKLQotICAgIHB1YmxpYyBib29sZWFuIGNhblB1c2goQXJjIGFyYykKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHVzaChBcmMgYXJjKQotICAgIHsKLSAgICAgIC8vIG92ZXJpZGUgdGhpcyBtZXRob2QgdG8gcmVjb3JkIHRyYXZlcnNlZCBub2RlcwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBwb3AoQXJjIGFyYykKLSAgICB7Ci0gICAgICAvLyBvdmVyaWRlIHRoaXMgbWV0aG9kIHRvIHJlY29yZCB0cmF2ZXJzZWQgbm9kZXMKLSAgICB9Ci0gICAgcHVibGljIENNTm9kZVtdIGdldE9yaWdpbkFycmF5KCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgRWxlbWVudFBhdGhSZWNvcmRpbmdSZXN1bHQgZXh0ZW5kcyBSZXN1bHQKLSAgeyAgCi0gICAgcHJvdGVjdGVkIExpc3QgYWN0aXZlSXRlbUNvdW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcm90ZWN0ZWQgTGlzdCBpbmFjdGl2ZUl0ZW1Db3VudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7ICAgIAotICAgIHByb3RlY3RlZCBWZWN0b3IgZWxlbWVudE9yaWdpblN0YWNrID0gbmV3IFZlY3RvcigpOwotICAgIHByb3RlY3RlZCBDTU5vZGVbXSBvcmlnaW5BcnJheSA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIGludCBwYXJ0aWFsVmFsaWRhdGlvbkNvdW50ID0gMDsKLQotICAgIAotICAgIC8vIHRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc3VwcG9ydCBmYWNldCBjb3VudHMKLSAgICAvLwotICAgIHB1YmxpYyBib29sZWFuIGNhblB1c2goQXJjIGFyYykKLSAgICB7ICAgICAKLSAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsgICAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7ICAgICAgICAKLSAgICAgICAgaWYgKGFyYy5raW5kID09IEFyYy5SRVBFQVQpCi0gICAgICAgIHsgICAgICAgICAgCi0gICAgICAgICAgaWYgKGFyYy5jbU5vZGUgaW5zdGFuY2VvZiBDTUNvbnRlbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgQ01Db250ZW50IGNvbnRlbnQgPSAoQ01Db250ZW50KWFyYy5jbU5vZGU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHdlIG9ubHkgbmVlZCB0byBkbyAnc3BlY2lhbCcgZmFjZXQgY2hlY2tpbmcgaWYgdGhlIG1heE9jY3VycyBpcyA+IDEKLSAgICAgICAgICAgIC8vIHZhbHVlcyBvZiAnMCcgYW5kICctMScgKHVuYm91bmRlZCkgd29yayAnZm9yIGZyZWUnIHdpdGhvdXQgYW55IHNwZWNpYWwgY2hlY2tpbmcKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBpZiAoY29udGVudC5nZXRNYXhPY2N1cigpID4gMSkKLSAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICBJdGVtQ291bnQgaXRlbUNvdW50ID0gKEl0ZW1Db3VudClhY3RpdmVJdGVtQ291bnRMaXN0LmdldChhY3RpdmVJdGVtQ291bnRMaXN0LnNpemUoKSAtIDEpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgLy8gaGVyZSB3ZSBuZWVkIHRvIGNvbXB1dGUgaWYgd2UgY2FuIGRvIGFub3RoZXIgcmVwZWF0Ci0gICAgICAgICAgICAgIC8vIGlmIHdlIGluY3JlYXNlIHRoZSByZXBlYXQgY291bnQgYnkgJzEnIHdpbGwgdGhpcyB2aW9sYXRlIHRoZSBtYXhPY2N1cnMKLSAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgaWYgKGl0ZW1Db3VudC5jb3VudCArIDEgPj0gY29udGVudC5nZXRNYXhPY2N1cigpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJjYW5QdXNoIFJFUEVBVCAoIiArIGl0ZW1Db3VudC5jb3VudCArICIpIiArIGNvbnRlbnQuZ2V0Tm9kZU5hbWUoKSArICIgcmVzdWx0PSAiICsgcmVzdWx0KTsgICAgICAgICAgICAKLSAgICAgICAgICB9IAotICAgICAgICB9ICAgICAgIAotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfQotICAgICAgLy9TeXN0ZW0ub3V0LmZsdXNoKCk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBwdXNoKEFyYyBhcmMpCi0gICAgewotICAgICAgaWYgKGFyYy5raW5kID09IEFyYy5FTEVNRU5UKQotICAgICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiW1hdcHVzaCgiICsgYXJjLmtpbmQgKyAiKSIgKyBhcmMuY21Ob2RlLmdldE5vZGVOYW1lKCkpOwotICAgICAgICBlbGVtZW50T3JpZ2luU3RhY2suYWRkKGFyYy5jbU5vZGUpOwotICAgICAgICBwYXJ0aWFsVmFsaWRhdGlvbkNvdW50ID0gTWF0aC5tYXgoZWxlbWVudE9yaWdpblN0YWNrLnNpemUoKSwgcGFydGlhbFZhbGlkYXRpb25Db3VudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhcmMua2luZCA9PSBBcmMuUFJFVl9JTikKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIltYXXB1c2goIiArIGFyYy5raW5kICsgIikiICsgYXJjLmNtTm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgYWN0aXZlSXRlbUNvdW50TGlzdC5hZGQobmV3IEl0ZW1Db3VudCgpKTsgICAKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGFyYy5raW5kID09IEFyYy5PVVRfTkVYVCkKLSAgICAgIHsgICAgICAgIAotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiW1hdcHVzaCgiICsgYXJjLmtpbmQgKyAiKSIgKyBhcmMuY21Ob2RlLmdldE5vZGVOYW1lKCkgKyAiWyIgKyBhcmMgKyAiXSIpOwotICAgICAgICBpbnQgc2l6ZSA9IGFjdGl2ZUl0ZW1Db3VudExpc3Quc2l6ZSgpOwotICAgICAgICBJdGVtQ291bnQgaXRlbUNvdW50ID0gKEl0ZW1Db3VudClhY3RpdmVJdGVtQ291bnRMaXN0LmdldChzaXplIC0gMSk7Ci0gICAgICAgIGFjdGl2ZUl0ZW1Db3VudExpc3QucmVtb3ZlKHNpemUgLSAxKTsKLSAgICAgICAgaW5hY3RpdmVJdGVtQ291bnRMaXN0LmFkZChpdGVtQ291bnQpOyAKLSAgICAgIH0gICAgICAKLSAgICAgIGVsc2UgaWYgKGFyYy5raW5kID09IEFyYy5SRVBFQVQpCi0gICAgICB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJbWF1wdXNoKCIgKyBhcmMua2luZCArICIpIiArIGFyYy5jbU5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIEl0ZW1Db3VudCBpdGVtQ291bnQgPSAoSXRlbUNvdW50KWFjdGl2ZUl0ZW1Db3VudExpc3QuZ2V0KGFjdGl2ZUl0ZW1Db3VudExpc3Quc2l6ZSgpIC0gMSk7Ci0gICAgICAgIGl0ZW1Db3VudC5jb3VudCsrOwotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigicmVwZWF0KCIgKyBpdGVtQ291bnQuY291bnQgKyAiKSIgKyBhcmMuY21Ob2RlLmdldE5vZGVOYW1lKCkpOwotICAgICAgfSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wKEFyYyBhcmMpCi0gICAgewotICAgICAgaWYgKGFyYy5raW5kID09IEFyYy5FTEVNRU5UKQotICAgICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiW1hdcG9wKCIgKyBhcmMua2luZCArICIpIiArIGFyYy5jbU5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIGludCBzaXplID0gZWxlbWVudE9yaWdpblN0YWNrLnNpemUoKTsKLSAgICAgICAgZWxlbWVudE9yaWdpblN0YWNrLnJlbW92ZShzaXplIC0gMSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhcmMua2luZCA9PSBBcmMuUFJFVl9JTikKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIltYXXBvcCgiICsgYXJjLmtpbmQgKyAiKSIgKyBhcmMuY21Ob2RlLmdldE5vZGVOYW1lKCkpOwotICAgICAgICBhY3RpdmVJdGVtQ291bnRMaXN0LnJlbW92ZShhY3RpdmVJdGVtQ291bnRMaXN0LnNpemUoKSAtIDEpOyAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhcmMua2luZCA9PSBBcmMuT1VUX05FWFQpCi0gICAgICB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJbWF1wb3AoIiArIGFyYy5raW5kICsgIikiICsgYXJjLmNtTm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgaW50IHNpemUgPSBpbmFjdGl2ZUl0ZW1Db3VudExpc3Quc2l6ZSgpOwotICAgICAgICBJdGVtQ291bnQgaXRlbUNvdW50ID0gKEl0ZW1Db3VudClpbmFjdGl2ZUl0ZW1Db3VudExpc3QuZ2V0KHNpemUgLSAxKTsKLSAgICAgICAgaW5hY3RpdmVJdGVtQ291bnRMaXN0LnJlbW92ZShzaXplIC0gMSk7Ci0gICAgICAgIGFjdGl2ZUl0ZW1Db3VudExpc3QuYWRkKGl0ZW1Db3VudCk7ICAgICAKLSAgICAgIH0gIAotICAgICAgZWxzZSBpZiAoYXJjLmtpbmQgPT0gQXJjLlJFUEVBVCkKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIltYXXBvcCgiICsgYXJjLmtpbmQgKyAiKSIgKyBhcmMuY21Ob2RlLmdldE5vZGVOYW1lKCkpOwotICAgICAgICBJdGVtQ291bnQgaXRlbUNvdW50ID0gKEl0ZW1Db3VudClhY3RpdmVJdGVtQ291bnRMaXN0LmdldChhY3RpdmVJdGVtQ291bnRMaXN0LnNpemUoKSAtIDEpOwotICAgICAgICBpdGVtQ291bnQuY291bnQtLTsKLSAgICAgIH0gICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBWZWN0b3IgZ2V0RWxlbWVudE9yaWdpbkxpc3QoKQotICAgIHsKLSAgICAgIHJldHVybiBlbGVtZW50T3JpZ2luU3RhY2s7Ci0gICAgfQotCi0gICAgcHVibGljIENNTm9kZVtdIGdldE9yaWdpbkFycmF5KCkKLSAgICB7Ci0gICAgICByZXR1cm4gb3JpZ2luQXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3JpZ2luQXJyYXkoQ01Ob2RlW10gb3JpZ2luQXJyYXkpCi0gICAgewotICAgICAgdGhpcy5vcmlnaW5BcnJheSA9IG9yaWdpbkFycmF5OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFBhcnRpYWxWYWxpZGF0aW9uQ291bnQoKQotICAgIHsKLSAgICAgIHJldHVybiBwYXJ0aWFsVmFsaWRhdGlvbkNvdW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcnRpYWxWYWxpZGF0aW9uQ291bnQoaW50IHBhcnRpYWxWYWxpZGF0aW9uQ291bnQpCi0gICAgewotICAgICAgdGhpcy5wYXJ0aWFsVmFsaWRhdGlvbkNvdW50ID0gcGFydGlhbFZhbGlkYXRpb25Db3VudDsKLSAgICB9Ci0gIH0gIAotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXRoUmVjb3JkaW5nUmVzdWx0IGV4dGVuZHMgUmVzdWx0Ci0gIHsKLSAgICBwcm90ZWN0ZWQgVmVjdG9yIGFyY0xpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXNoKEFyYyBhcmMpCi0gICAgewotICAgICAgYXJjTGlzdC5hZGQoYXJjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwb3AoQXJjIGFyYykKLSAgICB7Ci0gICAgICBpbnQgc2l6ZSA9IGFyY0xpc3Quc2l6ZSgpOwotICAgICAgYXJjTGlzdC5yZW1vdmUoc2l6ZSAtIDEpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldEFyY0xpc3QoKQotICAgIHsKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhcmNMaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBBcmMgYXJjID0gKEFyYylpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIGlmIChhcmMua2luZCA9PSBBcmMuRUxFTUVOVCkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGFyYyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBNYXRjaE1vZGVsTm9kZSBnZXRNYXRjaE1vZGVsKCkKLSAgICB7Ci0gICAgICBNYXRjaE1vZGVsTm9kZUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNYXRjaE1vZGVsTm9kZUJ1aWxkZXIoYXJjTGlzdCk7Ci0gICAgICBidWlsZGVyLmJ1aWxkTWF0Y2hNb2RlbCgpOwotICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0Um9vdCgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXRjaE1vZGVsTm9kZQotICB7Ci0gICAgcHVibGljIENNTm9kZSBjbU5vZGU7Ci0gICAgcHVibGljIExpc3QgY2hpbGRyZW4gPSBuZXcgVmVjdG9yKCk7Ci0gICAgcHVibGljIE9iamVjdCBkYXRhOwotCi0gICAgcHVibGljIE1hdGNoTW9kZWxOb2RlKE1hdGNoTW9kZWxOb2RlIHBhcmVudCwgQ01Ob2RlIGNtTm9kZSkKLSAgICB7Ci0gICAgICB0aGlzLmNtTm9kZSA9IGNtTm9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmludE1vZGVsKGludCBpbmRlbnQpCi0gICAgewotICAgICAgLy9TdHJpbmcgY21Ob2RlTmFtZSA9IGNtTm9kZSAhPSBudWxsID8gY21Ob2RlLmdldE5vZGVOYW1lKCkgOiAibnVsbCI7Ci0gICAgICAvL3ByaW50bG5JbmRlbnRlZChpbmRlbnQsICJNYXRjaE1vZGVsTm9kZSA6ICIgKyBjbU5vZGVOYW1lKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgTWF0Y2hNb2RlbE5vZGUgY2hpbGQgPSAoTWF0Y2hNb2RlbE5vZGUpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBjaGlsZC5wcmludE1vZGVsKGluZGVudCArIDIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWF0Y2hNb2RlbE5vZGVCdWlsZGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgTGlzdCBhcmNMaXN0OwotICAgIHByb3RlY3RlZCBMaXN0IHN0YWNrID0gbmV3IFZlY3RvcigpOwotICAgIHByb3RlY3RlZCBNYXRjaE1vZGVsTm9kZSByb290OwotICAgIHByb3RlY3RlZCBNYXRjaE1vZGVsTm9kZSBjdXJyZW50OwotCi0gICAgcHVibGljIE1hdGNoTW9kZWxOb2RlQnVpbGRlcihMaXN0IGFyY0xpc3QpCi0gICAgewotICAgICAgdGhpcy5hcmNMaXN0ID0gYXJjTGlzdDsKLSAgICAgIHJvb3QgPSBuZXcgTWF0Y2hNb2RlbE5vZGUobnVsbCwgbnVsbCk7Ci0gICAgICBwdXNoKHJvb3QpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHB1c2goTWF0Y2hNb2RlbE5vZGUgbm9kZSkKLSAgICB7Ci0gICAgICBjdXJyZW50ID0gbm9kZTsKLSAgICAgIHN0YWNrLmFkZChub2RlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3AoKQotICAgIHsKLSAgICAgIGludCBzaXplID0gc3RhY2suc2l6ZSgpOwotICAgICAgc3RhY2sucmVtb3ZlKHNpemUgLSAxKTsKLSAgICAgIGN1cnJlbnQgPSAoTWF0Y2hNb2RlbE5vZGUpc3RhY2suZ2V0KHNpemUgLSAyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NNR3JvdXAoQ01Ob2RlIGNtTm9kZSkKLSAgICB7Ci0gICAgICByZXR1cm4gY21Ob2RlICE9IG51bGwgJiYgY21Ob2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkdST1VQOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJ1aWxkTWF0Y2hNb2RlbCgpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFyY0xpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIEFyYyBhcmMgPSAoQXJjKWl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICBpZiAoYXJjLmtpbmQgPT0gQXJjLkVMRU1FTlQpCi0gICAgICAgIHsKLSAgICAgICAgICBjdXJyZW50LmNoaWxkcmVuLmFkZChuZXcgTWF0Y2hNb2RlbE5vZGUoY3VycmVudCwgYXJjLmNtTm9kZSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGFyYy5raW5kID09IEFyYy5QUkVWX0lOKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlzQ01Hcm91cChhcmMuY21Ob2RlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBNYXRjaE1vZGVsTm9kZSBuZXdNb2RlbE5vZGUgPSBuZXcgTWF0Y2hNb2RlbE5vZGUoY3VycmVudCwgYXJjLmNtTm9kZSk7Ci0gICAgICAgICAgICBjdXJyZW50LmNoaWxkcmVuLmFkZChuZXdNb2RlbE5vZGUpOwotICAgICAgICAgICAgcHVzaChuZXdNb2RlbE5vZGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhcmMua2luZCA9PSBBcmMuT1VUX05FWFQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNDTUdyb3VwKGFyYy5jbU5vZGUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBvcCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhcmMua2luZCA9PSBBcmMuUkVQRUFUKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlzQ01Hcm91cChhcmMuY21Ob2RlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwb3AoKTsKLSAgICAgICAgICAgIE1hdGNoTW9kZWxOb2RlIG5ld01vZGVsTm9kZSA9IG5ldyBNYXRjaE1vZGVsTm9kZShjdXJyZW50LCBhcmMuY21Ob2RlKTsKLSAgICAgICAgICAgIGN1cnJlbnQuY2hpbGRyZW4uYWRkKG5ld01vZGVsTm9kZSk7Ci0gICAgICAgICAgICBwdXNoKG5ld01vZGVsTm9kZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE1hdGNoTW9kZWxOb2RlIGdldFJvb3QoKQotICAgIHsKLSAgICAgIHJldHVybiByb290OwotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgaW50ZXJmYWNlIEVsZW1lbnRDb250ZW50Q29tcGFyYXRvcgotICB7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmFibGUoT2JqZWN0IG8pOwotICAgIHB1YmxpYyBib29sZWFuIGlzUENEYXRhKE9iamVjdCBvKTsKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnQoT2JqZWN0IG8pOwotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoT2JqZWN0IG8sIENNTm9kZSBjbU5vZGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgbGlua2VkIGxpc3QKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgRWxlbWVudExpc3QKLSAgewotICAgIHByb3RlY3RlZCBPYmplY3QgaGVhZDsKLSAgICBwcm90ZWN0ZWQgRWxlbWVudExpc3QgdGFpbDsKLQotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudExpc3QgY3JlYXRlKExpc3QgdikKLSAgICB7Ci0gICAgICBFbGVtZW50TGlzdCBmaXJzdCA9IG51bGw7Ci0gICAgICBFbGVtZW50TGlzdCBwcmV2ID0gbnVsbDsKLQotICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHYuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBpZiAobyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudExpc3QgbGlzdCA9IG5ldyBFbGVtZW50TGlzdCgpOwotICAgICAgICAgIGxpc3QuaGVhZCA9IG87Ci0KLSAgICAgICAgICBpZiAocHJldiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHByZXYudGFpbCA9IGxpc3Q7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmaXJzdCA9IGxpc3Q7Ci0gICAgICAgICAgfQotICAgICAgICAgIHByZXYgPSBsaXN0OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmlyc3Q7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyaW5nID0gIlsiICsgaGVhZCArICJdLCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgICBpZiAodGFpbCAhPSBudWxsKQotICAgICAgewotICAgICAgICBzdHJpbmcgKz0gdGFpbC50b1N0cmluZygpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gc3RyaW5nOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTdHJpbmdFbGVtZW50Q29udGVudENvbXBhcmF0b3IKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyaW5nRWxlbWVudENvbnRlbnRDb21wYXJhdG9yIGltcGxlbWVudHMgRWxlbWVudENvbnRlbnRDb21wYXJhdG9yCi0gIHsKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0lnbm9yYWJsZShPYmplY3QgbykKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyaW5nID0gby50b1N0cmluZygpOwotICAgICAgcmV0dXJuIHN0cmluZy5zdGFydHNXaXRoKCIhIikgfHwgc3RyaW5nLnN0YXJ0c1dpdGgoIj8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQQ0RhdGEoT2JqZWN0IG8pCi0gICAgewotICAgICAgU3RyaW5nIHN0cmluZyA9IG8udG9TdHJpbmcoKTsKLSAgICAgIHJldHVybiBzdHJpbmcuc3RhcnRzV2l0aCgiJyIpIHx8IHN0cmluZy5zdGFydHNXaXRoKCJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnQoT2JqZWN0IG8pCi0gICAgewotICAgICAgcmV0dXJuICFpc0lnbm9yYWJsZShvKSAmJiAhaXNQQ0RhdGEobyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhPYmplY3QgbywgQ01Ob2RlIGNtTm9kZSkKLSAgICB7Ci0gICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgaWYgKGNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotICAgICAgeyAKLSAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbiljbU5vZGU7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gby50b1N0cmluZygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpbnQgaW5kZXggPSBuYW1lLmluZGV4T2YoIl0iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgPSBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsgICAgICAgIAotCi0gICAgICAgIC8vIFRPRE8uLi4gaGVyZSdzIHdlIGNvbnNpZGVyIHN1YnN0aXR1dGlvbiBncm91cHMuLi4gcmV2aXNpdCB0byBzZWUgaWYgdGhpcyBzaG91bGQgYmUgbW92ZWQgaW50byB2YWxpZGF0b3IgY29kZQotICAgICAgICBpZiAoIXJlc3VsdCkKLSAgICAgICAgewotICAgICAgICAgIENNTm9kZUxpc3QgY21Ob2RlTGlzdCA9IChDTU5vZGVMaXN0KWVsZW1lbnQuZ2V0UHJvcGVydHkoIlN1YnN0aXR1dGlvbkdyb3VwIik7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChjbU5vZGVMaXN0ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW50IGNtTm9kZUxpc3RMZW5ndGggPSBjbU5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgICAgICAgICAgaWYgKGNtTm9kZUxpc3RMZW5ndGggPiAxKQotICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNtTm9kZUxpc3RMZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGFsdGVybmF0aXZlQ01FbGVtZW50RGVjbGFyYXRpb24gPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pY21Ob2RlTGlzdC5pdGVtKGkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBhbHROYW1lID0gYWx0ZXJuYXRpdmVDTUVsZW1lbnREZWNsYXJhdGlvbi5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5hbWUuZXF1YWxzSWdub3JlQ2FzZShhbHROYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgIAotICAgICAgfSAgIAotICAgICAgZWxzZSBpZiAoY21Ob2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFOWV9FTEVNRU5UKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFN0cmluZyBzdHJpbmcgPSBvLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmIChzdHJpbmcuZXF1YWxzKCIqIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgQ01BbnlFbGVtZW50IGFueUVsZW1lbnQgPSAoQ01BbnlFbGVtZW50KWNtTm9kZTsKLSAgICAgICAgICBTdHJpbmcgYW55RWxlbWVudFVSSSA9IGFueUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7ICAgIAotICAgICAgICAgIGlmIChhbnlFbGVtZW50VVJJICE9IG51bGwpCi0gICAgICAgICAgeyAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoYW55RWxlbWVudFVSSS5lcXVhbHMoIiMjYW55IikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChhbnlFbGVtZW50VVJJLmVxdWFscygiIyNvdGhlciIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB7ICAgICAKLSAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsgICAgCi0gICAgICAgICAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWFueUVsZW1lbnQuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZXhjbHVkZWRVUkkgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGlmIChleGNsdWRlZFVSSSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgICBTdHJpbmcgc3BlY2lmaWVkVVJJID0gZ2V0VVJJRm9yQ29udGVudFNwZWNpZmljYXRpb24oc3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgIGlmIChzcGVjaWZpZWRVUkkgIT0gbnVsbCAmJiBleGNsdWRlZFVSSS5lcXVhbHMoc3BlY2lmaWVkVVJJKSkKLSAgICAgICAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICBlbHNlIGlmIChhbnlFbGVtZW50VVJJLmVxdWFscygiIyN0YXJnZXROYW1lc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgICAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSAoQ01Eb2N1bWVudClhbnlFbGVtZW50LmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgICAgICAgICAgICB7ICAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlVVJJID0gKFN0cmluZyljbURvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3BlY2lmaWVkVVJJID0gZ2V0VVJJRm9yQ29udGVudFNwZWNpZmljYXRpb24oc3RyaW5nKTsKLSAgICAgICAgICAgICAgICBpZiAoc3BlY2lmaWVkVVJJICE9IG51bGwgJiYgIXRhcmdldE5hbWVzcGFjZVVSSS5lcXVhbHMoc3BlY2lmaWVkVVJJKSkKLSAgICAgICAgICAgICAgICB7IAotICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAgCi0gICAgICAgICAgICB7ICAgICAgICAKLSAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgU3RyaW5nIHNwZWNpZmllZFVSSSA9IGdldFVSSUZvckNvbnRlbnRTcGVjaWZpY2F0aW9uKHN0cmluZyk7Ci0gICAgICAgICAgICAgIGlmIChzcGVjaWZpZWRVUkkgIT0gbnVsbCAmJiAhYW55RWxlbWVudFVSSS5lcXVhbHMoc3BlY2lmaWVkVVJJKSkKLSAgICAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgfSAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgIH0gIAotICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgeyAgICAgICAgICAKLSAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgfSAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfSAgICAgCi0gICAgCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFVSSUZvckNvbnRlbnRTcGVjaWZpY2F0aW9uKFN0cmluZyBzcGVjaWZpY2F0aW9uKQotICAgIHsgICAgICAgICAgIAotICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgICBpbnQgaW5kZXggPSBzcGVjaWZpY2F0aW9uLmluZGV4T2YoIl0iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gc3BlY2lmaWNhdGlvbi5zdWJzdHJpbmcoMSwgaW5kZXgpOwotICAgICAgfSAKLSAgICAgIHJldHVybiByZXN1bHQ7ICAKLSAgICB9Ci0gIH0gICAgICAKLQotICBwdWJsaWMgc3RhdGljIExpc3QgY3JlYXRlU3RyaW5nTGlzdChTdHJpbmcgYXJnW10sIGludCBzdGFydEluZGV4KQotICB7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChpbnQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBhcmcubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgdi5hZGQoYXJnW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIHY7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC91dGlsL0RPTVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvRE9NVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMTFhMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvRE9NVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKiBBIHNwZWNpYWwgQ01WYWxpZGF0b3IgdGhhdCBrbm93cyBhYm91dCBET01zCi0gKi8KLXB1YmxpYyBjbGFzcyBET01WYWxpZGF0b3IgZXh0ZW5kcyBDTVZhbGlkYXRvcgoteyAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShOb2RlIG5vZGUpCi0gIHsgICAKLSAgICByZXR1cm4gRE9NTmFtZXNwYWNlSGVscGVyLmdldE5hbWVzcGFjZVVSSShub2RlKTsKLSAgICAvL3JldHVybiBub2RlLmdldE5hbWVzcGFjZVVSSSgpOwotICB9Ci0gICAgICAgICAgCi0KLSAgLy8KLSAgLy8gVGhpcyBpcyBhIHRlbXBvcmFyeSBoYWNrISEKLSAgLy8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRGYWxsYmFja05hbWVwYWNlVVJJKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7ICAgCi0gICAgU3RyaW5nIGZhbGxiYWNrTmFtZXBhY2VVUkkgPSBudWxsOwotICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWVkLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGZhbGxiYWNrTmFtZXBhY2VVUkkgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgICAvLyROT04tTkxTLTEkCi0gICAgfSAgCi0gICAgcmV0dXJuIGZhbGxiYWNrTmFtZXBhY2VVUkk7Ci0gIH0KLQotICAvKioKLSAgICogRW5jb2RlIHRoZSBFbGVtZW50J3MgTm9kZUxpc3QgYXMgYSBMaXN0IG9mIHN0cmluZ3MgdGhhdCB0aGUgdmFsaWRhdG9yIHJlY29nbml6ZXMKLSAgICovCi0gIHB1YmxpYyBMaXN0IGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChFbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBib29sZWFuIGlzTmFtZXNwYWNlQXdhcmUgPSBpc05hbWVzcGFjZUF3YXJlKGVkKTsKLSAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsgICAgICAgICAKLSAgICBmb3IgKE5vZGUgY2hpbGROb2RlID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkTm9kZSAhPSBudWxsOyBjaGlsZE5vZGUgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICB7IAotICAgICAgdi5hZGQoY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb24oY2hpbGROb2RlLCBpc05hbWVzcGFjZUF3YXJlLCBpc05hbWVzcGFjZUF3YXJlID8gZ2V0RmFsbGJhY2tOYW1lcGFjZVVSSShlZCkgOiBudWxsKSk7Ci0gICAgfQotICAgIHJldHVybiB2OwotICB9Ci0KLQotICBwdWJsaWMgTGlzdCBjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QoTGlzdCBub2RlTGlzdCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsgICAgICAgICAgICAgCi0gICAgYm9vbGVhbiBpc05hbWVzcGFjZUF3YXJlID0gaXNOYW1lc3BhY2VBd2FyZShlZCk7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7ICAgICAgICAgICAgCi0gCi0gICAgZm9yIChJdGVyYXRvciBpID0gbm9kZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSAoTm9kZSlpLm5leHQoKTsKLSAgICAgIHYuYWRkKGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uKG5vZGUsIGlzTmFtZXNwYWNlQXdhcmUsIGdldEZhbGxiYWNrTmFtZXBhY2VVUkkoZWQpKSk7Ci0gICAgfQotICAgIHJldHVybiB2OwotICB9Ci0KLQotICAvKioKLSAgICogRW5jb2RlIHRoZSBOb2RlIGFzIGEgc3RyaW5nIHRoYXQgdGhlIHZhbGlkYXRvciByZWNvZ25pemVzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uKE5vZGUgbm9kZSwgYm9vbGVhbiBpc05hbWVzcGFjZUF3YXJlLCBTdHJpbmcgZmFsbGJhY2tOYW1lcGFjZVVSSSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSAiISI7IC8vJE5PTi1OTFMtMSQKLSAgICBzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkKLSAgICB7Ci0gICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLSAgICAgIHsgIAotICAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7ICAKLSAgICAgICAgaWYgKG5vZGVOYW1lLnN0YXJ0c1dpdGgoImpzcDoiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7ICAKLSAgICAgICAgICByZXN1bHQgPSAiISI7IC8vIHRyZWF0IGl0IGFzIGEgY29tbWVudCBzbyB0aGF0IGl0J3MgaWdub3JlZCBieSB0aGUgdmFsaWRhdG9yIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNOYW1lc3BhY2VBd2FyZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0VW5wcmVmaXhlZE5hbWUobm9kZU5hbWUpOwotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IGdldE5hbWVzcGFjZVVSSShub2RlKTsKLSAgICAgICAgICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gIlsiICsgdXJpICsgIl0iICsgcmVzdWx0OyAgICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICBlbHNlIGlmIChmYWxsYmFja05hbWVwYWNlVVJJICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9ICJbIiArIGZhbGxiYWNrTmFtZXBhY2VVUkkgKyAiXSIgKyByZXN1bHQ7ICAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAgCi0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5vZGVOYW1lOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIC8vQ29udGVudE1vZGVsTWFuYWdlci5wcmludGxuKCJyZXN1bHQgIiArIHJlc3VsdCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9ICI/IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotICAgICAgewotICAgICAgICByZXN1bHQgPSAiISI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gIlwiIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5URVhUX05PREUgOgotICAgICAgewotICAgICAgICBTdHJpbmcgZGF0YSA9ICgoVGV4dClub2RlKS5nZXREYXRhKCk7Ci0gICAgICAgIC8vIGhlcmUgd2UgdGVzdCB0byBzZWUgaWYgdGhlIHRlc3Qgbm9kZSBpcyAnaWdub3JhYmxlJwotICAgICAgICBpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEudHJpbSgpLmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9ICJcIiIgKyBub2RlLmdldE5vZGVOYW1lKCkgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSAiISI7IC8vIHRvZG8uLi4gdXNlIGFub3RoZXIgc3ltYm9sPyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIExpc3QgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KENNTm9kZSBjbU5vZGUpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgc3dpdGNoIChjbU5vZGUuZ2V0Tm9kZVR5cGUoKSkKLSAgICB7Ci0gICAgICBjYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLSAgICAgIHsgICAgICAgICAKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25Gb3JDTUVsZW1lbnREZWNsYXJhdGlvbigoQ01FbGVtZW50RGVjbGFyYXRpb24pY21Ob2RlKSk7ICAgCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDTU5vZGUuREFUQV9UWVBFIDoKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoIlwiIiArIGNtTm9kZS5nZXROb2RlTmFtZSgpICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ01Ob2RlLkdST1VQIDoKLSAgICAgIHsKLSAgICAgICAgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0Rm9yQ01Hcm91cCgoQ01Hcm91cCljbU5vZGUsIGxpc3QpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ01Ob2RlLkFOWV9FTEVNRU5UIDoKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoIioiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGRlZmF1bHQgOgotICAgICAgewotICAgICAgICBsaXN0LmFkZCgiISIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0gICAgIAotCi0gIC8qKgotICAgKiAKLSAgICovICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkZvckNNRWxlbWVudERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7ICAKLSAgICBDTURvY3VtZW50IGRvY3VtZW50ID0gKENNRG9jdW1lbnQpZWQuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyB1cmkgPSBkb2N1bWVudCAhPSBudWxsID8gKFN0cmluZylkb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpIDogbnVsbDsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBzdHJpbmcgPSBlZC5nZXROb2RlTmFtZSgpOwotICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgCi0gICAgICBzdHJpbmcgPSAiWyIgKyB1cmkgKyAiXSIgKyBzdHJpbmc7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLSAgICByZXR1cm4gc3RyaW5nOwotICB9Ci0gIAotICAvKioKLSAgICoKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdEZvckNNR3JvdXAoQ01Hcm91cCBncm91cCwgTGlzdCBsaXN0KQotICB7ICAgICAgICAgCi0gICAgQ01Hcm91cENvbnRlbnRWaXNpdG9yIHZpc2l0b3IgPSBuZXcgQ01Hcm91cENvbnRlbnRWaXNpdG9yKGdyb3VwLCBsaXN0KTsKLSAgICB2aXNpdG9yLnZpc2l0Q01Ob2RlKGdyb3VwKTsKLSAgfSAKLSAgICAgCi0gIHByb3RlY3RlZCBjbGFzcyBDTUdyb3VwQ29udGVudFZpc2l0b3IgZXh0ZW5kcyBDTVZpc2l0b3IKLSAgeyAgCi0gICAgcHJvdGVjdGVkIENNR3JvdXAgcm9vdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGxpc3Q7Ci0KLSAgICBwdWJsaWMgQ01Hcm91cENvbnRlbnRWaXNpdG9yKENNR3JvdXAgcm9vdCwgTGlzdCBsaXN0KQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB0aGlzLnJvb3QgPSByb290OyAgICAgICAgCi0gICAgICB0aGlzLmxpc3QgPSBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gICAgeyAgICAgICAgICAgCi0gICAgICBpZiAoZWQuZ2V0TWluT2NjdXIoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uRm9yQ01FbGVtZW50RGVjbGFyYXRpb24oZWQpKTsKLSAgICAgIH0KLSAgICB9ICAgICAgIAotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUFueUVsZW1lbnQoQ01BbnlFbGVtZW50IGFueUVsZW1lbnQpCi0gICAgeyAgIAotICAgICAgbGlzdC5hZGQoIioiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01Hcm91cChDTUdyb3VwIGdyb3VwKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChncm91cCA9PSByb290IHx8IGdyb3VwLmdldE1pbk9jY3VyKCkgPiAwKQotICAgICAgewotICAgICAgICBpbnQgb3AgPSBncm91cC5nZXRPcGVyYXRvcigpOwotICAgICAgICBpZiAob3AgPT0gQ01Hcm91cC5TRVFVRU5DRSkKLSAgICAgICAgewotICAgICAgICAgIHN1cGVyLnZpc2l0Q01Hcm91cChncm91cCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAob3AgPT0gQ01Hcm91cC5DSE9JQ0UpCi0gICAgICAgIHsKLSAgICAgICAgICBDTU5vZGVMaXN0IG5vZGVMaXN0ID0gZ3JvdXAuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAgIGlmIChub2RlTGlzdC5nZXRMZW5ndGgoKSA+IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgdmlzaXRDTU5vZGUobm9kZUxpc3QuaXRlbSgwKSk7Ci0gICAgICAgICAgfSAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VBd2FyZShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgeyAKLSAgICByZXR1cm4gZWQgIT0gbnVsbCA/IGVkLmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvaXNOYW1lU3BhY2VBd2FyZSIpICE9IG51bGwgOiBmYWxzZTsgLy8kTk9OLU5MUy0xJAotICB9Ci0gICAgIAotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBDTU5vZGVbXSBnZXRPcmlnaW5BcnJheShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgRWxlbWVudFBhdGhSZWNvcmRpbmdSZXN1bHQgcmVzdWx0ID0gbmV3IEVsZW1lbnRQYXRoUmVjb3JkaW5nUmVzdWx0KCk7Ci0gICAgZ2V0T3JpZ2luQXJyYXkoZWQsIGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChlbGVtZW50LCBlZCksIHN0cmluZ0NvbnRlbnRDb21wYXJpdG9yLCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQuZ2V0T3JpZ2luQXJyYXkoKTsKLSAgfQotICAgICAgICAgICAgICAgICAgIAotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBNYXRjaE1vZGVsTm9kZSBnZXRNYXRjaE1vZGVsKENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBNYXRjaE1vZGVsTm9kZSBtYXRjaE1vZGVsTm9kZSA9IG51bGw7Ci0gICAgUGF0aFJlY29yZGluZ1Jlc3VsdCByZXN1bHQgPSBuZXcgUGF0aFJlY29yZGluZ1Jlc3VsdCgpOwotICAgIHZhbGlkYXRlKGVkLCBjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QoZWxlbWVudCwgZWQpLCBzdHJpbmdDb250ZW50Q29tcGFyaXRvciwgcmVzdWx0KTsKLSAgICBpZiAocmVzdWx0LmlzVmFsaWQpCi0gICAgewotICAgICAgbWF0Y2hNb2RlbE5vZGUgPSByZXN1bHQuZ2V0TWF0Y2hNb2RlbCgpOwotICAgIH0KLSAgICByZXR1cm4gbWF0Y2hNb2RlbE5vZGU7Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBMaXN0IGNsb25lKExpc3QgbGlzdCkKLSAgeyAgIAotICAgIExpc3QgcmVzdWx0ID0gbmV3IFZlY3RvcihsaXN0LnNpemUoKSk7Ci0gICAgcmVzdWx0LmFkZEFsbChsaXN0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gY2FuSW5zZXJ0KENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgaW50IGluc2VydEluZGV4LCBDTU5vZGUgY21Ob2RlKQotICB7ICAgICAgICAgICAKLSAgICBMaXN0IGNsb25lZExpc3QgPSBjbG9uZShjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpOwotICAgIGluc2VydChjbG9uZWRMaXN0LCBpbnNlcnRJbmRleCwgY21Ob2RlKTsKLSAgICBib29sZWFuIHJlc3VsdCA9IGlzUGFydGlhbGx5VmFsaWQoZWQsIGNsb25lZExpc3QpOyAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gIAotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gY2FuSW5zZXJ0KENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgaW50IGluc2VydEluZGV4LCBMaXN0IGNtTm9kZUxpc3QpCi0gIHsgICAgICAgICAgICAgIAotICAgIExpc3QgY2xvbmVkTGlzdCA9IGNsb25lKGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCk7Ci0gICAgaW5zZXJ0KGNsb25lZExpc3QsIGluc2VydEluZGV4LCBjbU5vZGVMaXN0KTsKLSAgICByZXR1cm4gaXNWYWxpZChlZCwgY2xvbmVkTGlzdCk7Ci0gIH0gIAotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gY2FuUmVtb3ZlKENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgaW50IHN0YXJ0UmVtb3ZlSW5kZXgpCi0gIHsKLSAgICByZXR1cm4gY2FuUmVtb3ZlKGVkLCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QsIHN0YXJ0UmVtb3ZlSW5kZXgsIHN0YXJ0UmVtb3ZlSW5kZXgpOwotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBjYW5SZW1vdmUoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0LCBpbnQgc3RhcnRSZW1vdmVJbmRleCwgaW50IGVuZFJlbW92ZUluZGV4KQotICB7Ci0gICAgTGlzdCBjbG9uZWRMaXN0ID0gY2xvbmUoY29udGVudFNwZWNpZmljYXRpb25MaXN0KTsKLSAgICByZW1vdmUoY2xvbmVkTGlzdCwgc3RhcnRSZW1vdmVJbmRleCwgZW5kUmVtb3ZlSW5kZXgpOwotICAgIHJldHVybiBpc1ZhbGlkKGVkLCBjbG9uZWRMaXN0KTsKLSAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gY2FuUmVwbGFjZShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QsIGludCBzdGFydFJlbW92ZUluZGV4LCBpbnQgZW5kUmVtb3ZlSW5kZXgsIENNTm9kZSBjbU5vZGUpCi0gIHsKLSAgICBMaXN0IGNsb25lZExpc3QgPSBjbG9uZShjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpOwotICAgIHJlbW92ZShjbG9uZWRMaXN0LCBzdGFydFJlbW92ZUluZGV4LCBlbmRSZW1vdmVJbmRleCk7IAotICAgIGluc2VydChjbG9uZWRMaXN0LCBzdGFydFJlbW92ZUluZGV4LCBjbU5vZGUpOwotICAgIHJldHVybiBpc1ZhbGlkKGVkLCBjbG9uZWRMaXN0KTsKLSAgfQotCi0gIC8qKgotICAgKgotICAgKi8gICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0KQotICB7Ci0gICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBSZXN1bHQoKTsKLSAgICB2YWxpZGF0ZShlZCwgY29udGVudFNwZWNpZmljYXRpb25MaXN0LCBzdHJpbmdDb250ZW50Q29tcGFyaXRvciwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0LmlzVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1BhcnRpYWxseVZhbGlkKENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCkKLSAgewotICAgIENNVmFsaWRhdG9yLkVsZW1lbnRQYXRoUmVjb3JkaW5nUmVzdWx0IHJlc3VsdCA9IG5ldyBDTVZhbGlkYXRvci5FbGVtZW50UGF0aFJlY29yZGluZ1Jlc3VsdCgpOwotICAgIHZhbGlkYXRlKGVkLCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QsIHN0cmluZ0NvbnRlbnRDb21wYXJpdG9yLCByZXN1bHQpOwotICAgIGludCBjb3VudCA9IGdldEVsZW1lbnRDb3VudChjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJlbGVtZW50T3JpZ2luTGlzdCAiICsgcmVzdWx0LmdldFBhcnRpYWxWYWxpZGF0aW9uQ291bnQoKSArICJ2cyIgKyBjb3VudCk7Ci0gICAgcmV0dXJuIHJlc3VsdC5nZXRQYXJ0aWFsVmFsaWRhdGlvbkNvdW50KCkgPj0gY291bnQ7Ci0gIH0gIAotICAKLSAgcHVibGljIGludCBnZXRFbGVtZW50Q291bnQoTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpCi0gIHsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIGlmIChzdHJpbmdDb250ZW50Q29tcGFyaXRvci5pc0VsZW1lbnQoaS5uZXh0KCkpKQotICAgICAgewotICAgICAgICBjb3VudCsrOwotICAgICAgfSAgCi0gICAgfSAgCi0gICAgcmV0dXJuIGNvdW50OwotICB9Ci0KLSAgcHJvdGVjdGVkIFJlc3VsdCB2YWxpZGF0ZShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBSZXN1bHQoKTsKLSAgICB2YWxpZGF0ZShlZCwgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGVsZW1lbnQsIGVkKSwgc3RyaW5nQ29udGVudENvbXBhcml0b3IsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKExpc3Qgc3RyaW5nTGlzdCwgaW50IHN0YXJ0UmVtb3ZlSW5kZXgsIGludCBlbmRSZW1vdmVJbmRleCkKLSAgewotICAgIGlmIChzdGFydFJlbW92ZUluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSBzdGFydFJlbW92ZUluZGV4OyBpIDw9IGVuZFJlbW92ZUluZGV4OyBpKyspCi0gICAgICB7Ci0gICAgICAgIHN0cmluZ0xpc3QucmVtb3ZlKGkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluc2VydChMaXN0IHN0cmluZ0xpc3QsIGludCBpbnNlcnRJbmRleCwgQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIGlmIChpbnNlcnRJbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICBzdHJpbmdMaXN0LmFkZEFsbChpbnNlcnRJbmRleCwgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGNtTm9kZSkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluc2VydChMaXN0IHN0cmluZ0xpc3QsIGludCBpbnNlcnRJbmRleCwgTGlzdCBjbU5vZGVMaXN0KQotICB7Ci0gICAgaWYgKGluc2VydEluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIGludCBpbnNlcnRMaXN0U2l6ZSA9IGNtTm9kZUxpc3Quc2l6ZSgpOwotICAgICAgZm9yIChpbnQgaSA9IGluc2VydExpc3RTaXplIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgICB7Ci0gICAgICAgIENNTm9kZSBjbU5vZGUgPSAoQ01Ob2RlKWNtTm9kZUxpc3QuZ2V0KGkpOwotICAgICAgICBzdHJpbmdMaXN0LmFkZEFsbChpbnNlcnRJbmRleCwgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGNtTm9kZSkpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYmVlMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci0KLQotLyoqCi0gKiBUaGUgQ01Eb2N1bWVudE1hbmFnZXIgY2FuIGJlIHZpc3VhbGl6ZWQgYXMgYSB0YWJsZSBvZiBDTURvY3VtZW50Ci0gKiByZWZlcmVuY2VzLCBlYWNoIHdpdGggYSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIGEgQ01Eb2N1bWVudCBjYWNoZS4gVGhlCi0gKiBDTURvY3VtZW50TWFuYWdlciBhbHNvIHBlcmZvcm1zIHRoZSB0YXNrIG9mIGxvYWRpbmcgQ01Eb2N1bWVudHMgcHJvdmlkaW5nCi0gKiBzdXBwb3J0IGZvciBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIGxvYWRpbmcuCi0gKiAKLSAqIHB1YmxpY0lkVGFibGUgQ01Eb2N1bWVudENhY2hlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgcHVibGljSWQgfCByZXNvbHZlZFVSSSB8IC0+IHwKLSAqIHJlc29sdmVkVVJJIHwgc3RhdHVzIHwgQ01Eb2N1bWVudCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgKG51bGwpIHwgZmlsZToveC5kdGQgfCB8Ci0gKiBmaWxlOi94LmR0ZCB8IGxvYWRpbmcgfCAobnVsbCkgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IGh0dHA6Ly4uLiB8IGZpbGU6L3kueHNkIHwgfAotICogZmlsZToveS54c2QgfCBsb2FkZWQgfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBDTURvY3VtZW50TWFuYWdlciB7Ci0JLyoqCi0JICogVGhpcyBwcm9wZXJ0eSBzcGVjaWZpZXMgV0hFTiBDTURvY3VtZW50cyBhcmUgbG9hZGVkLiBTZXR0aW5nIHRoaXMKLQkgKiBwcm9wZXJ0eSB0byB0cnVlIGFsbG93cyB0aGUgQ01Eb2N1bWVudE1hbmFnZXIgdG8gbG9hZCBDTURvY3VtZW50cyBvbgotCSAqIGRlbWFuZC4gU2V0dGluZ3MgdGhpcyBwcm9wZXJ0eSBhIGZhbHNlIHB1dHMgdGhlIG9udXMgb24gdGhlIGNsaWVudCB0bwotCSAqIGNhbGwgYWRkQ01Eb2N1bWVudFJlZmVyZW5jZSgpIHRvIGV4cGxpY2l0eSB0cmlnZ2VyIGEgbG9hZC4gVGhpcyBhbGxvd3MKLQkgKiB0aGUgY2xpZW50IHRvIGNvbnRyb2wgZXhhY3RseSB3aGVuIGxvYWRpbmcgc2hvdWxkIHRha2UgcGxhY2UuICkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9BVVRPX0xPQUQgPSAiYXV0b0xvYWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGlzIHByb3BlcnR5IHNwZWNpZmllcyBIT1cgQ01Eb2N1bWVudHMgYXJlIGxvYWRlZC4gV2hlbiBzZXQgdG8gZmFsc2UsCi0JICogdGhlIGdldENNRG9jdW1lbnQoKSBtZXRob2Qgd2lsbCBsb2FkIHRoZSBDTURvY3VtZW50IHN5bmNocm9ub3VzbHkgYW5kCi0JICogcmV0dXJuIGEgQ01Eb2N1bWVudCBvYmplY3Qgd2hlbiBsb2FkaW5nIGlzIHN1Y2Nlc3NmdWwuIFdoZW4gc2V0IHRvCi0JICogdHJ1ZSwgdGhlIGdldENNRG9jdW1lbnQoKSB3aWxsIGxvYWQgdGhlIENNRG9jdW1lbnQgYXN5bmNocm9ub3VzbHkgYW5kCi0JICogd2lsbCBpbW1lZGlhdGVseSByZXR1cm4gbnVsbC4gV2hlbiBsb2FkaW5nIGlzIGNvbXBsZXRlLCB0aGUKLQkgKiBDTURvY3VtZW50TWFuYWdlciB3aWxsIGluZm9ybSBpdHMgbGlzdGVuZXJzIHRoYXQgdGhlIENNRG9jdW1lbnQgaGFzCi0JICogYmVlbiBsb2FkZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQVNZTkNfTE9BRCA9ICJhc3luY0xvYWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9VU0VfQ0FDSEVEX1JFU09MVkVEX1VSSSA9ICJ1c2VDYWNoZWRSZXNvdmxlZFVSSSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM2Mzk5Ci0JICogQWxsb3dzIGEgY2xpZW50IHRvIGNvbnRyb2wgd2hldGhlciB0aGUgZG9jdW1lbnQgbWFuYWdlciBhdHRlbXB0cyB0byByZXNvbHZlIGEKLQkgKiBDTSBkb2N1bWVudCdzIFVSSS4gV2hlbiBzZXQgdG8gZmFsc2UsIHRoZSBDTSBzeXN0ZW1JRCB3aWxsIGJlIGFzc3VtZWQgdG8gcG9pbnQKLQkgKiB0byBhbiBhbHJlYWR5IHJlc29sdmVkIFVSSS4gQnkgZGVmYXVsdCB0aGlzIHByb3BlcnR5IGlzIHNldCB0byB0cnVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1BFUkZPUk1fVVJJX1JFU09MVVRJT04gPSAicGVyZm9ybVVSSVJlc29sdXRpb24iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogU2V0IHRoZSBlbmFibGVkIHN0YXRlIG9mIGEgcHJvcGVydHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGJvb2xlYW4gZW5hYmxlZCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFByb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lci4gTGlzdGVuZXJzIHNob3VsZCBleHBlY3QgdG8gcmVjZWl2ZSBjYWxsIGJhY2tzIG9uIGEKLQkgKiBzZWNvbmRhcnkgdGhyZWFkIHdoZW4gYXN5bmNocm9ub3VzbHkgbG9hZGluZyBpcyB1c2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogTG9va3VwIG9yIGNyZWF0ZSBhIENNRG9jdW1lbnQgKGRlcGVuZGluZyBvbiBQUk9QRVJUWV9BVVRPX0xPQUQpLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaWNJZAotCSAqIEBwYXJhbSBzeXN0ZW1JZAotCSAqIEBwYXJhbSB0eXBlIC0KLQkgKiAgICAgICAgICAgICdkdGQnLCAneHNkJywgJ3RsZCcsIGV0Yy4gaWYgbnVsbCBpcyBnaXZlbiBhcyB0aGUgdHlwZSwgdGhlbgotCSAqICAgICAgICAgICAgdGhlIHR5cGUgaXMgY2FsY3VsYXRlZCBhcyBsYXN0IHNlZ21lbnQgKGUuZy4gZmlsZSBleHRlbnNpb24pCi0JICogICAgICAgICAgICBvZiB0aGUgcmVzb2x2ZWQgVVJJCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIFN0cmluZyB0eXBlKTsKLQotCS8qKgotCSAqIExvb2t1cCBhIENNRG9jdW1lbnQuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChTdHJpbmcgcHVibGljSWQpOwotCi0JLyoqCi0JICogR2V0IHRoZSBzdGF0dXMgb2YgYSBDTURvY3VtZW50LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q01Eb2N1bWVudFN0YXR1cyhTdHJpbmcgcHVibGljSWQpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIENNRG9jdW1lbnQgYW5kIGFkZHMgdGhlIGFzc29jaWF0ZWQgQ01Eb2N1bWVudCByZWZlcmVuY2UKLQkgKiBpbmZvcm1hdGlvbiB0byB0aGUgdGFibGUuIENhbGxpbmcgdGhpcyBtZXRob2QgYWx3YXlzIHRyaWdnZXJzIGEKLQkgKiBDTURvY3VtZW50IGxvYWQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ01Eb2N1bWVudFJlZmVyZW5jZShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIHR5cGUpOwotCi0JLyoqCi0JICogQWRkIGFuIGV4aXN0aW5nQ01Eb2N1bWVudCBhbmQgdGhlIHJlZmVyZW5jZSBpbmZvcm1hdGlvbiB0byB0aGUgdGFibGUuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ01Eb2N1bWVudChTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIHJlc29sdmVkVVJJLCBTdHJpbmcgdHlwZSwgQ01Eb2N1bWVudCBjbURvY3VtZW50KTsKLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgZW50cmllcyBmcm9tIHRoZSB0YWJsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxSZWZlcmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIENNRG9jdW1lbnRDYWNoZSB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgbG9hZGVkIENNRG9jdW1lbnRzIGFuZAotCSAqIGFzc29jaWF0ZWQgc3RhdHVzLgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50Q2FjaGUgZ2V0Q01Eb2N1bWVudENhY2hlKCk7Ci0KLQkvKioKLQkgKiBCdWlsZHMgYSBDTURvY3VtZW50IGdpdmVuIGEgcmVzb3VsdmVkVVJJLiBOb3RlIHRoYXQgbm8gZW50cmllcyBhcmUKLQkgKiBhZGRlZCB0byB0aGUgdGFibGUuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgYnVpbGRDTURvY3VtZW50KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHJlc29sdmVkVVJJLCBTdHJpbmcgdHlwZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9DTURvY3VtZW50TWFuYWdlckxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9DTURvY3VtZW50TWFuYWdlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNjA3ZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGVMaXN0ZW5lcjsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgZXh0ZW5kcyBDTURvY3VtZW50Q2FjaGVMaXN0ZW5lcgoteyAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChDTURvY3VtZW50TWFuYWdlciBjbURvY3VtZW50TWFuYWdlciwgU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci19ICAgICAgIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudFJlZmVyZW5jZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDU3ZjQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnk7Ci0KLQotcHVibGljIGludGVyZmFjZSBDTURvY3VtZW50UmVmZXJlbmNlCi17Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKTsKLSAgcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9DTURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkYzhiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9DTURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0gCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgaXMgdXNlZCB0byBhYnN0cmFjdCB0aGUgdGFzayBvZiBjb21wdXRpbmcgdGhlIGRvY3VtZW50IHJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoIGEgRE9NCi0gKiBvciBhIHBhcnRpY3VsYXIgbm9kZSB3aXRoaW4gdGhlIERPTS4gIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlcgotewotICBMaXN0IGdldENNRG9jdW1lbnRSZWZlcmVuY2VzKE5vZGUgbm9kZSwgYm9vbGVhbiBkZWVwKTsKLSAgU3RyaW5nIHJlc29sdmVHcmFtbWFyVVJJKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQzMDBlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb24uTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgcGVyZm9ybWluZyBoaWdoZXIgbGV2ZWwgcXVlcmllcyBiYXNlZCBvbgotICogYSB4bWwgbW9kZWwgKERPTSkgYW5kIG9uZSBvciBtb3JlIGFzc29jaWF0ZWQgY29udGVudCBtb2RlbHMgKENNRG9jdW1lbnQpLgotICoKLSAqIFRoZSBxdWVyaWVzIHByb3ZpZGVkIGNhbiBiZSBvcmdhbml6ZWQgaW50byB0aHJlZSBncm91cHM6Ci0gKgotICogMSkgRE9NIE5vZGUgdG8gQ01Ob2RlIG1hcHBpbmcKLSAqICAgICAgR2l2ZW4gYSBncmFtbWF0aWNhbGx5IHZhbGlkIERPTSBOb2RlIHRoZSBjb3JyZXNwb25kaW5nIENNTm9kZSBjYW4gYmUgZGV0ZXJtaW5lZC4KLSAqICAgICAgKGkuZS4gRWxlbWVudCAtPiBDTUVsZW1lbnREZWNsYXJhdGlvbiwgQXR0ciAtPiBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLCBDaGFyYWN0ZXJEYXRhIC0+IENNRGF0YVR5cGUpCi0gKgotICogMikgRE9NIGVkaXRpbmcgdGVzdHMgKCJDYW4gSSBkbyB0aGlzPyIpCi0gKiAgICAgIFF1ZXN0aW9ucyBzdWNoIGFzIGNhbkluc2VydCwgY2FuUmVtb3ZlLCBjYW5SZXBsYWNlIGNhbiBhc3Npc3QgaW4gdGhlIGVkaXRpbmcgb2YgYSBET00uCi0gKgotICogICAgICBUaGUgdmFsaWRpdHlDaGVja2luZyBhcmd1bWVudCBkZXRlcm1pbmVzIHRoZSBzdHJpY3RuZXNzIG9mIHRoZSB2YWxpZGl0eSB0ZXN0aW5nIHRoYXQgb2NjdXJzLgotICoKLSAqICAgICAgLSBWQUxJRElUWV9OT05FICAgIDogVGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgRWxlbWVudCBpcyBpZ25vcmVkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IHRoZSBjb250ZW50IG1vZGVsIGlzIGNvbnNpZGVyZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgbW9zdCB1c2VmdWwgZm9yIGNvZGVhc3Npc3QgcmVsYXRlZCBxdWVyaWVzLgotICoKLSAqICAgICAgLSBWQUxJRElUWV9TVFJJQ1QgIDogVGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgRWxlbWVudCBpcyBjb25zaWRlcmVkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5zIHRydWUgb25seSBpZiB0aGUgb3BlcmF0aW9uIHByZXNlcnZlcyBjb250ZW50IHZhbGlkaXR5LgotICogICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHVzZWZ1bCB3aGVuIERPTSBlZGl0aW5nIG5lZWRzIHRvIGJlIGNvbnN0cmFpbmVkIHRvIG1haW50YWluIHZhbGlkaXR5LgotICoKLSAqICAgICAgLSBWQUxJRElUWV9QQVJUSUFMIDogU29tZSBvcHRpbWl6ZWQgY29tcHJvbWlzZSBiZXR3ZWVuIHRoZSB0d28gb3B0aW9ucyBhYm92ZS4KLSAqCi0gKiAzKSBET00gZWRpdGluZyBhY3Rpb25zICgiV2hhdCBjYW4gSSBkbyBoZXJlPyIpCi0gKiAgICAgIFRoZXNlIG1ldGhvZHMgcmV0dXJuIE1vZGVsUXVlcnlBY3Rpb25zIHRoYXQgYXJlIHJlbGV2YW50IGF0IHNvbWUgc3BlY2lmaWVkIERPTSBOb2RlLgotICogICAgICBUaGUgYWN0aW9ucyBpbmRpY2F0ZSB3aGF0IGtpbmRzIG9mIERPTSBOb2RlIGNhbiBiZSBpbnNlcnRlZCB3aGVyZSAoYXQgd2hhdCBpbmRleCkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxRdWVyeQotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxJRElUWV9OT05FID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMSURJVFlfUEFSVElBTCA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTElESVRZX1NUUklDVCA9IDI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DTFVERV9BTEwgPSAweEZGOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX0FUVFJJQlVURVMgPSAweDAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX0NISUxEX05PREVTID0gMHgwMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DTFVERV9TRVFVRU5DRV9HUk9VUFMgPSAweDA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX1RFWFRfTk9ERVMgPSAweDA4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX0VOQ0xPU0lOR19SRVBMQUNFX0FDVElPTlMgPSAweDEwOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVESVRfTU9ERV9VTkNPTlNUUkFJTkVEID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRURJVF9NT0RFX0NPTlNUUkFJTkVEX0xFTklFTlQ9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QgPSAyOwotCi0KLSAgdm9pZCBzZXRFZGl0TW9kZShpbnQgZWRpdE1vZGUpOwotCi0gIGludCAgZ2V0RWRpdE1vZGUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgQ01Eb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBET00gTm9kZS4KLSAgICogb3IgbnVsbCBpZiBubyBDTURvY3VtZW50IGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgRE9NIE5vZGUuCi0gICAqLwotICBDTURvY3VtZW50IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KE5vZGUgbm9kZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgQ01Ob2RlIGZvciB0aGUgRE9NIE5vZGUKLSAgICogb3IgbnVsbCBpZiBubyBDTU5vZGUgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBET00gTm9kZS4KLSAgICovCi0gIENNTm9kZSBnZXRDTU5vZGUoTm9kZSBub2RlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBDTUF0dHJpYnV0ZSBmb3IgdGhlIERPTSBOb2RlCi0gICAqIG9yIG51bGwgaWYgbm8gQ01Ob2RlIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgRE9NIE5vZGUuCi0gICAqLwotICBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oQXR0ciBhdHRyKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBDTUF0dHJpYnV0ZSBmb3IgdGhlIERPTSBOb2RlCi0gICAqIG9yIG51bGwgaWYgbm8gQ01Ob2RlIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgRE9NIE5vZGUuCi0gICAqLwotICBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgaXMgdmFsaWQKLSAgICovCi0gIGJvb2xlYW4gaXNDb250ZW50VmFsaWQoRWxlbWVudCBlbGVtZW50KTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgQ01Ob2RlIG9mIHRoZSBwYXJlbnQgZWxlbWVudCdzIGNvbnRlbnQgbW9kZWwKLSAgICogdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbm9kZQotICAgKi8KLSAgQ01Ob2RlIGdldE9yaWdpbihOb2RlIG5vZGUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIENNTm9kZXMgb2YgdGhlIHBhcmVudCBlbGVtZW50J3MgY29udGVudCBtb2RlbAotICAgKiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBub2RlCi0gICAqLwotICBDTU5vZGVbXSBnZXRPcmlnaW5BcnJheShFbGVtZW50IGVsZW1lbnQpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgQ01Ob2RlICdtZXRhIGRhdGEnIHRoYXQgbWF5IGJlIHBvdGVudGlhbGx5IGFkZGVkIHRvIHRoZSBlbGVtZW50LgotICAgKi8KLSAgTGlzdCBnZXRBdmFpbGFibGVDb250ZW50KEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmNsdWRlT3B0aW9ucyk7Ci0KLSAgLyoqCi0gICAqIENhbiBhIERPTSBOb2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIENNTm9kZSAnbWV0YSBkYXRhJyBiZSBhZGRlZCB0byB0aGUgcGFyZW50Ci0gICAqLwotICBib29sZWFuIGNhbkluc2VydChFbGVtZW50IHBhcmVudCwgQ01Ob2RlIGNtTm9kZSwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZyk7Ci0KLSAgLyoqCi0gICAqIENhbiBtdWx0aXBsZSBET00gTm9kZXMgY29ycmVzcG9uZGluZyB0byB0aGUgbGlzdCBvZiBDTU5vZGUgJ21ldGEgZGF0YScgYmUgYWRkZWQgdG8gdGhlIHBhcmVudAotICAgKi8KLSAgYm9vbGVhbiBjYW5JbnNlcnQoRWxlbWVudCBwYXJlbnQsIExpc3QgY21Ob2RlTGlzdCwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZyk7Ci0KLSAgLyoqCi0gICAqIENhbiB0aGUgRE9NIE5vZGUgYmUgcmVtb3ZlZAotICAgKi8KLSAgYm9vbGVhbiBjYW5SZW1vdmUoTm9kZSBub2RlLCBpbnQgdmFsaWRpdHlDaGVja2luZyk7Ci0KLSAgLyoqCi0gICAqIENhbiB0aGUgbGlzdCBvZiBET00gTm9kZXMgYmUgcmVtb3ZlZAotICAgKi8KLSAgYm9vbGVhbiBjYW5SZW1vdmUoTGlzdCBub2RlTGlzdCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpOwotCi0gIC8qKgotICAgKiBDYW4gdGhlIGNoaWxkcmVuIHdpdGhpbiB0aGUgaW5kaWNhdGVkIGluZGljZXMgYmUgcmVwbGFjZWQgd2l0aCBhIERPTSBOb2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIENNTm9kZSAnbWV0YSBkYXRhJwotICAgKi8KLSAgYm9vbGVhbiBjYW5SZXBsYWNlKEVsZW1lbnQgcGFyZW50LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBDTU5vZGUgY21Ob2RlLCBpbnQgdmFsaWRpdHlDaGVja2luZyk7Ci0KLSAgLyoqCi0gICAqIENhbiB0aGUgY2hpbGRyZW4gd2l0aGluIHRoZSBpbmRpY2F0ZWQgaW5kaWNlcyBiZSByZXBsYWNlZCB3aXRoIG11bHRpcGxlIERPTSBOb2RlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBsaXN0IG9mIENNTm9kZSAnbWV0YSBkYXRhJwotICAgKi8KLSAgYm9vbGVhbiBjYW5SZXBsYWNlKEVsZW1lbnQgcGFyZW50LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBMaXN0IGNtTm9kZUxpc3QsIGludCB2YWxpZGl0eUNoZWNraW5nKTsKLQotICAvKioKLSAgICoKLSAgICovCi0gIHZvaWQgZ2V0SW5zZXJ0QWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmRleCwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KTsKLQotICAvKioKLSAgICoKLSAgICovCi0gIHZvaWQgZ2V0SW5zZXJ0QWN0aW9ucyhEb2N1bWVudCBwYXJlbnQsIENNRG9jdW1lbnQgY21Eb2N1bWVudCwgaW50IGluZGV4LCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBsaXN0IG9mIHJlcGxhY2UgYWN0aW9ucyB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIHBhcmVudCdzIGNvbnRlbnQKLSAgICovCi0gIHZvaWQgZ2V0UmVwbGFjZUFjdGlvbnMoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBsaXN0IG9mIHJlcGxhY2UgYWN0aW9ucyB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIHNlbGVjdGVkIGNoaWxkcmVuIG9mIHRoYXQgcGFyZW50IAotICAgKi8KLSAgdm9pZCBnZXRSZXBsYWNlQWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3Qgc2VsZWN0ZWRDaGlsZHJlbiwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8qKiAKLSAgICogIEBkZXByZWNhdGVkIC0gdXNlIGdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMoKQotICAgKi8KLSAgTGlzdCBnZXREYXRhVHlwZVZhbHVlcyhFbGVtZW50IGVsZW1lbnQsIENNTm9kZSBjbU5vZGUpOwotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZHMgcmV0dXJuIGFuIGFycmF5IG9mIHBvc3NpYmxlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBkYXRhdHlwZSBvZiB0aGUgQ01Ob2RlIChlaXRoZXIgYW4gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBvciBhIENNRWxlbWVudERlY2xhcmF0aW9uKQotICAgKi8KLSAgU3RyaW5nW10gZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhFbGVtZW50IGVsZW1lbnQsIENNTm9kZSBjbU5vZGUpOwotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwgaWYgYSBDTURvY3VtZW50TWFuYWdlciBpcyBub3QgdXNlZCBieSB0aGUgTW9kZWxRdWVyeQotICAgKi8KLSAgQ01Eb2N1bWVudE1hbmFnZXIgZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsIHRoZSBNb2RlbFF1ZXJ5IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgdXNlIG9mIGV4dGVuc2lvbnMKLSAgICovCi0gIE1vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VyIGdldEV4dGVuc2lvbk1hbmFnZXIoKTsgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU5YzRmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsUXVlcnlBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5TRVJUICA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRSAgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBMQUNFID0gNDsKLQotICBwdWJsaWMgaW50IGdldEtpbmQoKTsKLSAgLyoqCi0gICAqIGlmIHN0YXJ0IGluZGV4ID09IC0xIHRoZW4gbm8gaW5zZXJ0IGlzIHBvc3NpYmxlCi0gICAqIGlmIHN0YXJ0IGluZGV4ICE9IC0xIGFuZCBlbmRJbmRleCA9PSAtMSB0aGVuIGFuIGluc2VydCBhdCBhbnkgcG9zaXRpb24gaXMgcG9zc2libGUKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U3RhcnRJbmRleCgpOwotICBwdWJsaWMgaW50IGdldEVuZEluZGV4KCk7Ci0gIHB1YmxpYyBOb2RlIGdldFBhcmVudCgpOwotICBwdWJsaWMgQ01Ob2RlIGdldENNTm9kZSgpOwotICBwdWJsaWMgT2JqZWN0IGdldFVzZXJEYXRhKCk7Ci0gIHB1YmxpYyB2b2lkIHNldFVzZXJEYXRhKE9iamVjdCBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3Nzc3NTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0vKioKLSAqIAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciBleHRlbmRzIE1vZGVsUXVlcnlDTVByb3ZpZGVyCi17Ci0gIHB1YmxpYyBDTU5vZGUgZ2V0Q01Ob2RlKE5vZGUgbm9kZSk7Ci0gIHB1YmxpYyBDTURhdGFUeXBlIGdldENNRGF0YVR5cGUoVGV4dCB0ZXh0KTsgCi0gIHB1YmxpYyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oQXR0ciBhdHRyKTsKLSAgcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvTW9kZWxRdWVyeUNNUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBmOTM3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsUXVlcnlDTVByb3ZpZGVyCi17Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBDTURvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIERPTSBOb2RlLgotICAgKiBvciBudWxsIGlmIG5vIENNRG9jdW1lbnQgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBET00gTm9kZS4KLSAgICovCi0gIENNRG9jdW1lbnQgZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoTm9kZSBub2RlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L2V4dGVuc2lvbi9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9leHRlbnNpb24vTW9kZWxRdWVyeUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDE3ZjU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L2V4dGVuc2lvbi9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZGVsUXVlcnlFeHRlbnNpb24KLXsgIAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX1NUUklOR19BUlJBWSA9IHt9OwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENNTm9kZVtdIEVNUFRZX0NNTk9ERV9BUlJBWSA9IHt9OwotICAKLSAgLyoqCi0gKiBAcGFyYW0gb3duZXJFbGVtZW50IC0gdGhlIG93bmVyIGVsZW1lbnQKLSAqIEBwYXJhbSBuYW1lc3BhY2UgLSB0aGUgYWN0aXZlIG5hbWVzcGFjZQotICogQHBhcmFtIG5hbWUgLSB0aGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgbm9kZQotICogQHJldHVybiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUKLSAqLwotcHVibGljIFN0cmluZ1tdIGdldEF0dHJpYnV0ZVZhbHVlcyhFbGVtZW50IG93bmVyRWxlbWVudCwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gRU1QVFlfU1RSSU5HX0FSUkFZOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0RWxlbWVudFZhbHVlcyhOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuIEVNUFRZX1NUUklOR19BUlJBWTsKLSAgfQotICAKLSAgLyoqCi0gKiBAcGFyYW0gcGFyZW50Tm9kZQotICogQHBhcmFtIG5hbWVzcGFjZQotICogQHBhcmFtIG5hbWUKLSAqIEByZXR1cm4gd2hldGhlciBhIGNoaWxkIGVsZW1lbnQgb2YgdGhlIGdpdmVuIHBhcmVudE5vZGUgaXMgdmFsaWQgZ2l2ZW4gdGhlIGFjdGl2ZSBuYW1lc3BhY2UKLSAqLwotcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlQ2hpbGRFbGVtZW50KE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgLyoqCi0gKiBAcGFyYW0gcGFyZW50RWxlbWVudCAtIHRoZSBwYXJlbnQgRWxlbWVudCB3aGVuIGFza2luZyBmb3IgY2hpbGRyZW4sIHRoZSBvd25lciBFbGVtZW50IHdoZW4gYXNraW5nIGZvciBhdHRyaWJ1dGVzIAotICogQHBhcmFtIG5hbWVzcGFjZSAtIHRoZSBhY3RpdmUgbmFtZXNwYWNlCi0gKiBAcGFyYW0gaW5jbHVkZU9wdGlvbnMgLSBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyBvciBNb2RlbFF1ZXJ5LklOQ0xVREVfQ0hJTERfTk9ERVMKLSAqIEByZXR1cm4gYWRkaXRpb25hbCB2YWxpZCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9ucyBvciBDTUVsZW1lbnREZWNsYXJhdGlvbnMgCi0gKi8KLXB1YmxpYyBDTU5vZGVbXSBnZXRBdmFpbGFibGVFbGVtZW50Q29udGVudChFbGVtZW50IHBhcmVudEVsZW1lbnQsIFN0cmluZyBuYW1lc3BhY2UsIGludCBpbmNsdWRlT3B0aW9ucykgCi0gIHsKLQkgIHJldHVybiBFTVBUWV9DTU5PREVfQVJSQVk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L2V4dGVuc2lvbi9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvZXh0ZW5zaW9uL01vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYzQ0MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvZXh0ZW5zaW9uL01vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLQotcHVibGljIGludGVyZmFjZSBNb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlcgotewotICBMaXN0IGdldERhdGFUeXBlVmFsdWVzKEVsZW1lbnQgZWxlbWVudCwgQ01Ob2RlIGNtTm9kZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICB2b2lkIGZpbHRlckF2YWlsYWJsZUVsZW1lbnRDb250ZW50KExpc3QgYXZhaWxhYmxlQ29udGVudCwgRWxlbWVudCBlbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCk7Ci0KLSAgdm9pZCBmaWx0ZXJBdmFpbGFibGVFbGVtZW50Q29udGVudChMaXN0IGF2YWlsYWJsZUNvbnRlbnQsIEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmNsdWRlT3B0aW9ucyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQmFzZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9CYXNlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDI0MmY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9CYXNlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUFzc29jaWF0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcgoteyAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBCYXNlQXNzb2NpYXRpb25Qcm92aWRlcigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBDTU5vZGUgZ2V0Q01Ob2RlKE5vZGUgbm9kZSkKLSAgewotICAgIENNTm9kZSByZXN1bHQgPSBudWxsOwotICAgIHN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKQotICAgIHsKLSAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oKEF0dHIpbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KW5vZGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldENNRGF0YVR5cGUoKFRleHQpbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgQ01EYXRhVHlwZSBnZXRDTURhdGFUeXBlKFRleHQgdGV4dCkKLSAgewotICAgIENNRGF0YVR5cGUgcmVzdWx0ID0gbnVsbDsKLSAgICBOb2RlIHBhcmVudE5vZGUgPSB0ZXh0LmdldFBhcmVudE5vZGUoKTsKLSAgICBpZiAocGFyZW50Tm9kZSAhPSBudWxsICYmIHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICB7Ci0gICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KXBhcmVudE5vZGUpOwotICAgICAgcmVzdWx0ID0gZWQuZ2V0RGF0YVR5cGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihBdHRyIGF0dHIpCi0gIHsKLSAgICBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgICBpZiAoZWQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pZWQuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0NNRG9jdW1lbnRMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkwNTk0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VUYWJsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudExvYWRlcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIERvY3VtZW50IGRvY3VtZW50OwotICBwcm90ZWN0ZWQgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5OwotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudE1hbmFnZXIgY21Eb2N1bWVudE1hbmFnZXI7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzSW5mZXJyZWRHcmFtbWFyRW5hYmxlZCA9IHRydWU7ICAKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnRMb2FkaW5nTmFtZXNwYWNlVGFibGUgbmFtZXNwYWNlVGFibGU7Ci0gIHByb3RlY3RlZCBpbnQgY291bnQgPSAwOwotICAgIAotICBwdWJsaWMgQ01Eb2N1bWVudExvYWRlcihEb2N1bWVudCBkb2N1bWVudCwgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzKGRvY3VtZW50LCBtb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCkpOwotICB9Ci0gIAotICBwdWJsaWMgQ01Eb2N1bWVudExvYWRlcihEb2N1bWVudCBkb2N1bWVudCwgQ01Eb2N1bWVudE1hbmFnZXIgY21Eb2N1bWVudE1hbmFnZXIpCi0gIHsgICAKLSAgICB0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5jbURvY3VtZW50TWFuYWdlciA9IGNtRG9jdW1lbnRNYW5hZ2VyOyAgCQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBsb2FkQ01Eb2N1bWVudHMoKQotICB7ICAgICAgICAgIAotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tbG9hZENNRG9jdW1lbnRzIC0tLS0tLS0tLS0tLSIpOyAgICAgICAgICAKLSAgICAvL2xvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgIAotICAgIGJvb2xlYW4gd2Fsa0RvY3VtZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICBjbURvY3VtZW50TWFuYWdlci5yZW1vdmVBbGxSZWZlcmVuY2VzKCk7Ci0gICAgICAKLSAgICBTdHJpbmdbXSBkb2N0eXBlSW5mbyA9IFhNTEFzc29jaWF0aW9uUHJvdmlkZXIuZ2V0RG9jdHlwZUluZm8oZG9jdW1lbnQpOwotICAgIGlmIChkb2N0eXBlSW5mbyAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIGxvYWQgdGhlIGRvY3R5cGUgaWYgcmVxdWlyZWQKLSAgICAgIHdhbGtEb2N1bWVudCA9IGhhbmRsZUdyYW1tYXIoZG9jdHlwZUluZm9bMF0sIGRvY3R5cGVJbmZvWzFdLCAiRFREIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBlbHNlCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgRWxlbWVudCBlbGVtZW50ID0gZ2V0Um9vdEVsZW1lbnQoZG9jdW1lbnQpOwotICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmFtZXNwYWNlVGFibGUgPSBuZXcgQ01Eb2N1bWVudExvYWRpbmdOYW1lc3BhY2VUYWJsZShkb2N1bWVudCk7ICAgCi0gICAgICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VUYWJsZS5pc05hbWVzcGFjZUVuY291bnRlcmVkKCkpCi0gICAgICAgIHsgICAKLSAgICAgICAgICB3YWxrRG9jdW1lbnQgPSB0cnVlOwotICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJpc05hbWVzcGFjZUF3YXJlIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZXNwYWNlVGFibGUgPSBudWxsOwotICAgICAgICAgIHdhbGtEb2N1bWVudCA9IGlzSW5mZXJyZWRHcmFtbWFyRW5hYmxlZDsKLSAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiaXMgTk9UIG5hbWVzcGFjZUF3YXJlIik7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfSAgCi0gICAgfSAKLQotICAgIGlmICh3YWxrRG9jdW1lbnQpCi0gICAgewotICAgICAgdmlzaXROb2RlKGRvY3VtZW50KTsgICAKLSAgICB9IAotCi0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIi0tLSBlbGFwc2VkIHRpbWUgKCIgKyBjb3VudCArICIpID0gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpKTsKLSAgfQotCi0KLSAgcHVibGljIGJvb2xlYW4gaGFuZGxlR3JhbW1hcihTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIHR5cGUpCi0gIHsgICAgICAgICAgIAotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgCi0gICAgaW50IHN0YXR1cyA9IGNtRG9jdW1lbnRNYW5hZ2VyLmdldENNRG9jdW1lbnRTdGF0dXMocHVibGljSWQpOwotICAgIGlmIChzdGF0dXMgPT0gQ01Eb2N1bWVudENhY2hlLlNUQVRVU19OT1RfTE9BREVEKQotICAgIHsKLSAgICAgIGNtRG9jdW1lbnRNYW5hZ2VyLmFkZENNRG9jdW1lbnRSZWZlcmVuY2UocHVibGljSWQsIHN5c3RlbUlkLCB0eXBlKTsKLSAgICB9ICAgICAgICAgICAgICAgICAKLSAgICBlbHNlIGlmIChzdGF0dXMgPT0gQ01Eb2N1bWVudENhY2hlLlNUQVRVU19FUlJPUikKLSAgICB7Ci0gICAgICByZXN1bHQgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotICAgIAotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7ICAKLSAgICB2aXNpdENoaWxkTm9kZXMoZWxlbWVudCk7Ci0gIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgaGFuZGxlRWxlbWVudE5TKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgdmlzaXRDaGlsZE5vZGVzKGVsZW1lbnQpOwotICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIHZvaWQgdmlzaXROb2RlKE5vZGUgbm9kZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotICAgIGlmIChub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICB7Ci0gICAgICBjb3VudCsrOyAgICAgICAKLQotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpbm9kZTsgICAgCi0gICAgICBpZiAobmFtZXNwYWNlVGFibGUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaGFuZGxlRWxlbWVudChlbGVtZW50KTsgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGhhbmRsZUVsZW1lbnROUyhlbGVtZW50KTsKLSAgICAgIH0gICAgICAgICAgICAKLSAgICB9Ci0gICAgZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKQotICAgIHsKLSAgICAgIHZpc2l0Q2hpbGROb2Rlcyhub2RlKTsKLSAgICB9Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0Q2hpbGROb2RlcyhOb2RlIG5vZGUpCi0gIHsgICAKLQkgIGZvciAoTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIAotICAgIHsKLQkgICAgdmlzaXROb2RlKGNoaWxkKTsKLSAgICB9Ci0JfSAgICAgICAgICAgICAKLQotCi0gIHByb3RlY3RlZCBjbGFzcyBDTURvY3VtZW50TG9hZGluZ05hbWVzcGFjZVRhYmxlIGV4dGVuZHMgTmFtZXNwYWNlVGFibGUKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBuZXdOYW1lc3BhY2VMaXN0OwotCi0gICAgcHVibGljIENNRG9jdW1lbnRMb2FkaW5nTmFtZXNwYWNlVGFibGUoRG9jdW1lbnQgZG9jdW1lbnQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHN1cGVyKGRvY3VtZW50KTsgICAgIAotICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgcHVibGljIHZvaWQgYWRkRWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIG5ld05hbWVzcGFjZUxpc3QgPSBudWxsOwotICAgICAgc3VwZXIuYWRkRWxlbWVudChlbGVtZW50KTsgIAotICAgICAgaWYgKG5ld05hbWVzcGFjZUxpc3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbmV3TmFtZXNwYWNlTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8paS5uZXh0KCk7Ci0gICAgICAgICAgaGFuZGxlR3JhbW1hcihpbmZvLnVyaSwgaW5mby5sb2NhdGlvbkhpbnQsICJYU0QiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAgCi0gICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGludGVybmFsQWRkTmFtZXNwYWNlSW5mbyhTdHJpbmcga2V5LCBOYW1lc3BhY2VJbmZvIGluZm8pCi0gICAgewotICAgICAgc3VwZXIuaW50ZXJuYWxBZGROYW1lc3BhY2VJbmZvKGtleSwgaW5mbyk7ICAgICAgICAgICAKLSAgICAgIGlmIChuZXdOYW1lc3BhY2VMaXN0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5ld05hbWVzcGFjZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICB9Ci0gICAgICBuZXdOYW1lc3BhY2VMaXN0LmFkZChpbmZvKTsgICAgCi0gICAgfSAgICAgICAgICAgICAgICAgICAgIAotICB9Ci0KLSAgCi0gIHByb3RlY3RlZCBFbGVtZW50IGdldFJvb3RFbGVtZW50KERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgRWxlbWVudCByZXN1bHQgPSBudWxsOwotICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG5vZGVMaXN0TGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgTm9kZSBub2RlID0gbm9kZUxpc3QuaXRlbShpKTsKLSAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IChFbGVtZW50KW5vZGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudE1hbmFnZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudE1hbmFnZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Y2JmYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0NNRG9jdW1lbnRNYW5hZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Db250ZW50TW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotCi0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIENNRG9jdW1lbnRNYW5hZ2VySW1wbCBpbXBsZW1lbnRzIENNRG9jdW1lbnRNYW5hZ2VyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnRDYWNoZSBjbURvY3VtZW50Q2FjaGU7Ci0gIHByb3RlY3RlZCBDTURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXIgY21Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyOwotICBwcm90ZWN0ZWQgTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgVmVjdG9yKCk7IAotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIHByb3RlY3RlZCBIYXNodGFibGUgcHVibGljSWRUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgICAgIAotICBwdWJsaWMgQ01Eb2N1bWVudE1hbmFnZXJJbXBsKENNRG9jdW1lbnRDYWNoZSBjbURvY3VtZW50Q2FjaGUsIENNRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlciBjbURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXIpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5jbURvY3VtZW50Q2FjaGUgPSBjbURvY3VtZW50Q2FjaGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMuY21Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyID0gY21Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyOwotICAgIHNldFByb3BlcnR5RW5hYmxlZChQUk9QRVJUWV9BVVRPX0xPQUQsIHRydWUpOwotICAgIHNldFByb3BlcnR5RW5hYmxlZChQUk9QRVJUWV9VU0VfQ0FDSEVEX1JFU09MVkVEX1VSSSwgZmFsc2UpOwotICAgIHNldFByb3BlcnR5RW5hYmxlZChQUk9QRVJUWV9QRVJGT1JNX1VSSV9SRVNPTFVUSU9OLCB0cnVlKTsKLSAgfSAgICAgICAgIAotCi0gICAgICAgCi0gIHB1YmxpYyBDTURvY3VtZW50Q2FjaGUgZ2V0Q01Eb2N1bWVudENhY2hlKCkKLSAgewotICAgIHJldHVybiBjbURvY3VtZW50Q2FjaGU7Ci0gIH0KLQotIAotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHByb3BlcnR5VGFibGUucHV0KHByb3BlcnR5TmFtZSwgdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdGVuZXJMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lciA9IChDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyKWkubmV4dCgpOwotICAgICAgbGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKHRoaXMsIHByb3BlcnR5TmFtZSk7Ci0gICAgfQotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgIAotICBwdWJsaWMgYm9vbGVhbiBnZXRQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgewotICAgIE9iamVjdCBvYmplY3QgPSBwcm9wZXJ0eVRhYmxlLmdldChwcm9wZXJ0eU5hbWUpOwotICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBvYmplY3QuZXF1YWxzKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotICAgIGNtRG9jdW1lbnRDYWNoZS5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICBjbURvY3VtZW50Q2FjaGUucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotICB9ICAgICAgICAgICAgICAgICAgICAgICAKLSAgIAotICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgU3RyaW5nIGxvb2t1cFJlc29sdmVkVVJJKFN0cmluZyBwdWJsaWNJZCkKLSAgewotICAgIFN0cmluZyBrZXkgPSBwdWJsaWNJZCAhPSBudWxsID8gcHVibGljSWQgOiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIHJldHVybiAoU3RyaW5nKXB1YmxpY0lkVGFibGUuZ2V0KGtleSk7Ci0gIH0KLSAgICAKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGxvb2t1cE9yQ3JlYXRlUmVzb2x2ZWRVUkkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsgICAgICAgICAgICAgICAgICAgIAotICAgIFN0cmluZyByZXNvbHZlZFVSSSA9IG51bGw7ICAgICAgICAgICAgICAgICAgCi0KLSAgICBTdHJpbmcga2V5ID0gcHVibGljSWQgIT0gbnVsbCA/IHB1YmxpY0lkIDogIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIGlmIChnZXRQcm9wZXJ0eUVuYWJsZWQoUFJPUEVSVFlfVVNFX0NBQ0hFRF9SRVNPTFZFRF9VUkkpKQotICAgIHsKLSAgICAgIHJlc29sdmVkVVJJID0gKFN0cmluZylwdWJsaWNJZFRhYmxlLmdldChrZXkpOwotICAgIH0gICAKLQotICAgIGlmIChyZXNvbHZlZFVSSSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc29sdmVkVVJJID0gY21Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyLnJlc29sdmVHcmFtbWFyVVJJKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gICAgICBpZiAocmVzb2x2ZWRVUkkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzb2x2ZWRVUkkgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgcHVibGljSWRUYWJsZS5wdXQoa2V5LCByZXNvbHZlZFVSSSk7ICAgICAKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAKLSAgCi0gICAgcmV0dXJuIHJlc29sdmVkVVJJOwotICB9Ci0KLQotICBwdWJsaWMgaW50IGdldENNRG9jdW1lbnRTdGF0dXMoU3RyaW5nIHB1YmxpY0lkKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGludCBzdGF0dXMgPSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX05PVF9MT0FERUQ7IAotICAgIFN0cmluZyByZXNvbHZlZFVSSSA9IGxvb2t1cFJlc29sdmVkVVJJKHB1YmxpY0lkKTsKLSAgICBpZiAocmVzb2x2ZWRVUkkgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgc3RhdHVzID0gY21Eb2N1bWVudENhY2hlLmdldFN0YXR1cyhyZXNvbHZlZFVSSSk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0gICAgCi0gICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIENNRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLSAgICBTdHJpbmcgcmVzb2x2ZWRVUkkgPSBsb29rdXBSZXNvbHZlZFVSSShwdWJsaWNJZCk7Ci0gICAgaWYgKHJlc29sdmVkVVJJICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHJlc3VsdCA9IGNtRG9jdW1lbnRDYWNoZS5nZXRDTURvY3VtZW50KHJlc29sdmVkVVJJKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAKLSAgCi0KLSAgLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXIjZ2V0Q01Eb2N1bWVudChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICovCi1wdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkLCBTdHJpbmcgdHlwZSkKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIFN0cmluZyByZXNvbHZlZFVSSSA9IG51bGw7Ci0KLSAgICBpZiAoZ2V0UHJvcGVydHlFbmFibGVkKFBST1BFUlRZX0FVVE9fTE9BRCkpCi0gICAgewotICAgICAgLy8gU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzYzOTkKLSAgICAgIAotICAgICAgaWYgKGdldFByb3BlcnR5RW5hYmxlZChQUk9QRVJUWV9QRVJGT1JNX1VSSV9SRVNPTFVUSU9OKSkKLSAgICAgIHsKLSAgICAgICAgcmVzb2x2ZWRVUkkgPSBsb29rdXBPckNyZWF0ZVJlc29sdmVkVVJJKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc29sdmVkVVJJID0gc3lzdGVtSWQ7Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzb2x2ZWRVUkkgPSBsb29rdXBSZXNvbHZlZFVSSShwdWJsaWNJZCk7Ci0gICAgfSAKLQotICAgIGlmIChyZXNvbHZlZFVSSSAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICBpbnQgc3RhdHVzID0gY21Eb2N1bWVudENhY2hlLmdldFN0YXR1cyhyZXNvbHZlZFVSSSk7Ci0gICAgICBpZiAoc3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTE9BREVEKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgY21Eb2N1bWVudCA9IGNtRG9jdW1lbnRDYWNoZS5nZXRDTURvY3VtZW50KHJlc29sdmVkVVJJKTsKLSAgICAgIH0gICAKLSAgICAgIGVsc2UgaWYgKHN0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX05PVF9MT0FERUQpCi0gICAgICB7ICAgICAKLSAgICAgICAgaWYgKGdldFByb3BlcnR5RW5hYmxlZChQUk9QRVJUWV9BVVRPX0xPQUQpKQotICAgICAgICB7Ci0gICAgICAgICAgY21Eb2N1bWVudCA9IGxvYWRDTURvY3VtZW50KHB1YmxpY0lkLCByZXNvbHZlZFVSSSwgdHlwZSwgZ2V0UHJvcGVydHlFbmFibGVkKFBST1BFUlRZX0FTWU5DX0xPQUQpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gY21Eb2N1bWVudDsgICAKLSAgfSAKLSAgCi0gIHB1YmxpYyB2b2lkIGFkZENNRG9jdW1lbnRSZWZlcmVuY2UoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIFN0cmluZyB0eXBlKQotICB7Ci0gICAgU3RyaW5nIHJlc29sdmVkVVJJID0gbG9va3VwT3JDcmVhdGVSZXNvbHZlZFVSSShwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgIGlmIChyZXNvbHZlZFVSSSAhPSBudWxsICYmIHJlc29sdmVkVVJJLmxlbmd0aCgpID4gMCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaW50IHN0YXR1cyA9IGNtRG9jdW1lbnRDYWNoZS5nZXRTdGF0dXMocmVzb2x2ZWRVUkkpOwotICAgICAgaWYgKHN0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX05PVF9MT0FERUQpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBsb2FkQ01Eb2N1bWVudChwdWJsaWNJZCwgcmVzb2x2ZWRVUkksIHR5cGUsIGdldFByb3BlcnR5RW5hYmxlZChQUk9QRVJUWV9BU1lOQ19MT0FEKSk7Ci0gICAgICB9ICAgICAgICAgCi0gICAgfSAKLSAgfQotICAgICAKLQotICBwdWJsaWMgdm9pZCBhZGRDTURvY3VtZW50KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkLCBTdHJpbmcgcmVzb2x2ZWRVUkksIFN0cmluZyB0eXBlLCBDTURvY3VtZW50IGNtRG9jdW1lbnQpCi0gIHsKLSAgICBTdHJpbmcga2V5ID0gcHVibGljSWQgIT0gbnVsbCA/IHB1YmxpY0lkIDogIiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWNJZFRhYmxlLnB1dChrZXksIHJlc29sdmVkVVJJKTsKLSAgICBjbURvY3VtZW50Q2FjaGUucHV0Q01Eb2N1bWVudChyZXNvbHZlZFVSSSwgY21Eb2N1bWVudCk7Ci0gIH0KLQotCi0gIHByb3RlY3RlZCBDTURvY3VtZW50IGxvYWRDTURvY3VtZW50KGZpbmFsIFN0cmluZyBwdWJsaWNJZCwgZmluYWwgU3RyaW5nIHJlc29sdmVkVVJJLCBmaW5hbCBTdHJpbmcgdHlwZSwgYm9vbGVhbiBhc3luYykKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIENNRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiYWJvdXQgdG8gYnVpbGQgQ01Eb2N1bWVudCgiICsgcHVibGljSWQgKyAiLCAiICsgdW5yZXNvbHZlZFVSSSArICIgPSAiICsgcmVzb2x2ZWRVUkkgKyAiKSIpOwotICAgIGlmIChhc3luYykKLSAgICB7ICAgICAKLSAgICAgIGNtRG9jdW1lbnRDYWNoZS5zZXRTdGF0dXMocmVzb2x2ZWRVUkksIENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTE9BRElORyk7Ci0gICAgICAvL1RocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBBc3luY0J1aWxkT3BlcmF0aW9uKHB1YmxpY0lkLCByZXNvbHZlZFVSSSwgdHlwZSkpOwotICAgICAgLy90aHJlYWQuc3RhcnQoKTsKLSAgICAgIEpvYiBqb2IgPSBuZXcgSm9iKFhNTENvcmVNZXNzYWdlcy5sb2FkaW5nICsgcmVzb2x2ZWRVUkkpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhPYmplY3QgZmFtaWx5KQotICAgICAgICB7Ci0gICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSAoZmFtaWx5ID09IENNRG9jdW1lbnRNYW5hZ2VyLmNsYXNzKTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAJICBidWlsZENNRG9jdW1lbnQocHVibGljSWQsIHJlc29sdmVkVVJJLCB0eXBlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgCSAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgICBqb2Iuc2NoZWR1bGUoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICByZXN1bHQgPSBidWlsZENNRG9jdW1lbnQocHVibGljSWQsIHJlc29sdmVkVVJJLCB0eXBlKTsKLSAgICB9ICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gCi0KLSAgICAKLQotICBwdWJsaWMgc3luY2hyb25pemVkIENNRG9jdW1lbnQgYnVpbGRDTURvY3VtZW50KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHJlc29sdmVkVVJJLCBTdHJpbmcgdHlwZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBjbURvY3VtZW50Q2FjaGUuc2V0U3RhdHVzKHJlc29sdmVkVVJJLCBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0xPQURJTkcpOwotICAKLSAgICBDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7ICAgICAgICAgCi0gICAgaWYgKHJlc29sdmVkVVJJICE9IG51bGwgJiYgcmVzb2x2ZWRVUkkubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIC8vIFRPRE8uLi4gcGFzcyB0aGUgVFlQRSB0aHJ1IHRvIHRoZSBDTURvY3VtZW50QnVpbGRlcgotICAgICAgcmVzdWx0ID0gQ29udGVudE1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNNRG9jdW1lbnQocmVzb2x2ZWRVUkksIHR5cGUpOwotICAgIH0KLSAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgeyAKLSAgICAgIC8vIGxvYWQgdGhlIGFubm90YXRpb24gZmlsZXMgZm9yIHRoZSBkb2N1bWVudCAKLSAgICAgIGlmIChwdWJsaWNJZCAhPSBudWxsKQotICAgICAgeyAgICAKLSAgICAgICAgQW5ub3RhdGlvblV0aWxpdHkubG9hZEFubm90YXRpb25zRm9yR3JhbW1hcihwdWJsaWNJZCwgcmVzdWx0KTsKLSAgICAgIH0KLSAgICAgIGNtRG9jdW1lbnRDYWNoZS5wdXRDTURvY3VtZW50KHJlc29sdmVkVVJJLCByZXN1bHQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY21Eb2N1bWVudENhY2hlLnNldFN0YXR1cyhyZXNvbHZlZFVSSSwgQ01Eb2N1bWVudENhY2hlLlNUQVRVU19FUlJPUik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gCi0KLSAgcHVibGljIHZvaWQgcmVtb3ZlQWxsUmVmZXJlbmNlcygpCi0gIHsKLSAgICAvLyBUT0RPLi4uIGluaXRpYXRlIGEgdGltZWQgcmVsZWFzZSBvZiB0aGUgZW50cmllcyBpbiB0aGUgQ01Eb2N1bWVudENhY2hlCi0gICAgcHVibGljSWRUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgfQotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudFJlZmVyZW5jZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9DTURvY3VtZW50UmVmZXJlbmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGVkYWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9DTURvY3VtZW50UmVmZXJlbmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudFJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIENNRG9jdW1lbnRSZWZlcmVuY2VJbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudFJlZmVyZW5jZQoteyAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgc3lzdGVtSWQ7Ci0gIHByb3RlY3RlZCBTdHJpbmcgcHVibGljSWQ7Ci0KLSAgcHVibGljIENNRG9jdW1lbnRSZWZlcmVuY2VJbXBsKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0gICAgdGhpcy5wdWJsaWNJZCA9IHB1YmxpY0lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMuc3lzdGVtSWQgPSBzeXN0ZW1JZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcHVibGljSWQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHN5c3RlbUlkOwotICB9ICAgICAgCi0gIAotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiAiWyIgKyBwdWJsaWNJZCArICIsICIgKyBzeXN0ZW1JZCArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0luZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0luZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTFlNzJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9JbmZlcnJlZEdyYW1tYXJCdWlsZGluZ0NNRG9jdW1lbnRMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwubW9kZWxxdWVyeWltcGwuSW5mZXJyZWRHcmFtbWFyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIEluZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlciBleHRlbmRzIENNRG9jdW1lbnRMb2FkZXIKLXsgICAgIAotICBwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gaW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbjsKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnQgaW5mZXJyZWRDTURvY3VtZW50OwotICBwcm90ZWN0ZWQgSW5mZXJyZWRHcmFtbWFyRmFjdG9yeSBpbmZlcnJlZEdyYW1tYXJGYWN0b3J5OwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGNyZWF0ZWRDTURvY3VtZW50VGFibGU7Ci0KLSAgcHVibGljIEluZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlcihEb2N1bWVudCBkb2N1bWVudCwgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzKGRvY3VtZW50LCBtb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCkpOwotICB9Ci0gIAotICBwdWJsaWMgSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyKERvY3VtZW50IGRvY3VtZW50LCBDTURvY3VtZW50TWFuYWdlciBjbURvY3VtZW50TWFuYWdlcikKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgc3VwZXIoZG9jdW1lbnQsIGNtRG9jdW1lbnRNYW5hZ2VyKTsKLSAgICBjcmVhdGVkQ01Eb2N1bWVudFRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOyAgICAgICAgICAgICAKLSAgICBpbmZlcnJlZEdyYW1tYXJGYWN0b3J5ID0gbmV3IEluZmVycmVkR3JhbW1hckZhY3RvcnkoKTsKLSAgfSAgICAgCi0KLSAgICAgCi0gIHB1YmxpYyB2b2lkIGxvYWRDTURvY3VtZW50cygpCi0gIHsgICAKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLWxvYWRDTURvY3VtZW50cyAtLS0tLS0tLS0tLS0iKTsgICAgICAgICAgCi0gICAgaWYgKGluZmVycmVkR3JhbW1hckZhY3RvcnkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvL2xvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgc3VwZXIubG9hZENNRG9jdW1lbnRzKCk7Ci0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiLS0tIGVsYXBzZWQgdGltZSAoIiArIGNvdW50ICsgIikgPSAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkpOwotICAgICAgLy9pbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmRlYnVnUHJpbnQoY3JlYXRlZENNRG9jdW1lbnRUYWJsZS52YWx1ZXMoKSk7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlRWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsgCi0gICAgQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50SW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiA9IGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgCi0gICAgaWYgKGluZmVycmVkQ01Eb2N1bWVudCA9PSBudWxsKQotICAgIHsgICAgIAotICAgICAgU3RyaW5nIGNhY2hlS2V5ID0gImluZmVycmVkLWRvY3VtZW50IjsgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgIGluZmVycmVkQ01Eb2N1bWVudCA9IGluZmVycmVkR3JhbW1hckZhY3RvcnkuY3JlYXRlQ01Eb2N1bWVudCgiIik7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgY21Eb2N1bWVudE1hbmFnZXIuYWRkQ01Eb2N1bWVudCgiIiwgIiIsIGNhY2hlS2V5LCAiRFREIiwgaW5mZXJyZWRDTURvY3VtZW50KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIGNyZWF0ZWRDTURvY3VtZW50VGFibGUucHV0KGNhY2hlS2V5LCBpbmZlcnJlZENNRG9jdW1lbnQpOwotICAgIH0gCi0KLSAgICBpbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uID0gaW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5jcmVhdGVDTUVsZW1lbnREZWNsYXJhdGlvbihpbmZlcnJlZENNRG9jdW1lbnQsIGVsZW1lbnQsIGZhbHNlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAKLSAgICBpZiAocGFyZW50SW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGluZmVycmVkR3JhbW1hckZhY3RvcnkuY3JlYXRlQ01Db250ZW50KGluZmVycmVkQ01Eb2N1bWVudCwgcGFyZW50SW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiwgaW5mZXJyZWRDTURvY3VtZW50LCBpbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uLCBmYWxzZSwgbnVsbCk7Ci0gICAgfSAgICAgCi0gICAgICAgCi0KLSAgICB2aXNpdENoaWxkTm9kZXMoZWxlbWVudCk7ICAgCi0gICAgICAgICAgIAotICAgIC8vIHJlc2V0IHRoZSAnY3VycmVudCcgc3RhdGUgdG8gaW5pdGFsIHZhbHVlcwotICAgIGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24gPSBwYXJlbnRJbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uOwotICB9Ci0gIAotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUVsZW1lbnROUyhFbGVtZW50IGVsZW1lbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIENNRG9jdW1lbnQgcGFyZW50SW5mZXJyZWRDTURvY3VtZW50ID0gaW5mZXJyZWRDTURvY3VtZW50OwotICAgIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24gPSBpbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uOwotICAgICAgICAKLSAgICBpbmZlcnJlZENNRG9jdW1lbnQgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24gPSBudWxsOwotCi0gICAgLy8gYnkgYWRkaW5nIHRoZSBlbGVtZW50IHRvIHRoZSBuYW1lc3BhY2VUYWJsZSwgaGFuZGxlR3JhbW1hcigpIHdpbGwgZ2V0IGNhbGxlZCBmb3IgYW55IHNjaGVtYSByZWZlcmVuY2VzCi0gICAgaWYgKGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpICE9IGRvY3VtZW50KQotICAgIHsKLSAgICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgfQotCi0gICAgU3RyaW5nIHByZWZpeCA9IGVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0gICAgU3RyaW5nIHVyaSA9IG5hbWVzcGFjZVRhYmxlLmdldFVSSUZvclByZWZpeChwcmVmaXgpOwotCi0gICAgaWYgKHVyaSA9PSBudWxsICYmIGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpID09IGRvY3VtZW50KQotICAgIHsKLSAgICAgIC8vIHdoZW4gdGhpcyBpcyB0aGUgcm9vdCBlbGVtZW50Ci0gICAgICAvLyB3ZSBuZWVkIHRvIGFkZCBhbiBpbXBsaWVkICJubyBuYW1lc3BhY2Ugc2NoZW1hIGxvY2F0aW9uIgotICAgICAgdXJpID0gIm9tbWl0dGVkLW5hbWVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIG5hbWVzcGFjZVRhYmxlLmFkZE5hbWVzcGFjZUluZm8ocHJlZml4LCB1cmksICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0gIAotCi0gICAgLy8gaGVyZSdzIHdoZXJlIHdlIHVwZGF0ZSB0aGUgaW5mZXJyZWQgZ3JhbW1hciBpZiByZXF1aXJlZAotICAgIC8vIAotICAgIGJvb2xlYW4gY3JlYXRlQ01FbGVtZW50RGVjbGFyYXRpb24gPSB0cnVlOwotICAgICAgICAgIAotICAgIGJvb2xlYW4gaXNMb2NhbCA9ICh1cmkgPT0gbnVsbCAmJiBwcmVmaXggPT0gbnVsbCk7ICAgICAgICAgCi0gICAgaWYgKGlzTG9jYWwpCi0gICAgeyAgICAgICAgICAKLSAgICAgIGlmIChwYXJlbnRJbmZlcnJlZENNRG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gdGhpcyBpcyBhIGxvY2FsIGVsZW1lbnQuLi4gYW5kIHRoZSBwYXJlbnQgaXMgbm90IGluZmVycmVkIChlLmcpIGl0IGhhcyBhIGtub3duIGdyYW1tYXIKLSAgICAgICAgLy8gc28gd2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiBmb3IgdGhpcyBlbGVtZW50Ci0gICAgICAgIGNyZWF0ZUNNRWxlbWVudERlY2xhcmF0aW9uID0gZmFsc2U7IAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHVyaSA9ICJvbW1pdHRlZC1uYW1lc3BhY2UiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoY3JlYXRlQ01FbGVtZW50RGVjbGFyYXRpb24pCi0gICAgeyAgICAgICAgICAgIAotICAgICAgaWYgKGlzTG9jYWwpCi0gICAgICB7Ci0gICAgICAgIGluZmVycmVkQ01Eb2N1bWVudCA9IHBhcmVudEluZmVycmVkQ01Eb2N1bWVudDsKLSAgICAgICAgaW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiA9IGluZmVycmVkR3JhbW1hckZhY3RvcnkuY3JlYXRlQ01FbGVtZW50RGVjbGFyYXRpb24oaW5mZXJyZWRDTURvY3VtZW50LCBlbGVtZW50LCB0cnVlKTsgICAgICAgCi0gICAgICB9ICAgICAgICAgIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBib29sZWFuIGNyZWF0ZUNNRG9jdW1lbnQgPSBmYWxzZTsKLQotICAgICAgICBTdHJpbmcgY2FjaGVLZXkgPSAiaW5mZXJyZWQtZG9jdW1lbnQiICsgdXJpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICBpbmZlcnJlZENNRG9jdW1lbnQgPSAoQ01Eb2N1bWVudCljcmVhdGVkQ01Eb2N1bWVudFRhYmxlLmdldChjYWNoZUtleSk7Ci0KLSAgICAgICAgaWYgKGluZmVycmVkQ01Eb2N1bWVudCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSBhbiBpbmZlcnJlZCBkb2N1bWVudCBmb3IgdGhpcyB1cmkgeWV0Li4uIGxldCdzIHNlZSBvZiB3ZSBuZWVkIG9uZQotICAgICAgICAgIGludCBzdGF0dXMgPSBjbURvY3VtZW50TWFuYWdlci5nZXRDTURvY3VtZW50U3RhdHVzKHVyaSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIGlmIChzdGF0dXMgPT0gQ01Eb2N1bWVudENhY2hlLlNUQVRVU19OT1RfTE9BREVEIHx8IHN0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0VSUk9SKQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHRoZSBjYWNoZSBkb2VzIG5vdCBjb250YWluIGEgJ3Byb3BlcicgQ01Eb2N1bWVudCBmb3IgdGhpcyB1cmkKLSAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gY3JlYXRlIGFuIGluZmVycmVkIG9uZQotICAgICAgICAgICAgY3JlYXRlQ01Eb2N1bWVudCA9IHRydWU7Ci0gICAgICAgICAgfSAKLSAgICAgICAgfSAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGNyZWF0ZUNNRG9jdW1lbnQpCi0gICAgICAgIHsgICAgICAgICAgIAotICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJlbmNvdW50ZXJlZCBlbGVtZW50IHsiICsgZWxlbWVudC5nZXROb2RlTmFtZSgpICsgIn0gLi4uIGNyZWF0aW5nIGluZmVycmVkIENNRG9jdW1lbnQgZm9yICIgKyB1cmkpOwotICAgICAgICAgIGluZmVycmVkQ01Eb2N1bWVudCA9IGluZmVycmVkR3JhbW1hckZhY3RvcnkuY3JlYXRlQ01Eb2N1bWVudCh1cmkpOwotICAgICAgICAgIGNtRG9jdW1lbnRNYW5hZ2VyLmFkZENNRG9jdW1lbnQodXJpLCAiIiwgY2FjaGVLZXksICJYU0QiLCBpbmZlcnJlZENNRG9jdW1lbnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICBjcmVhdGVkQ01Eb2N1bWVudFRhYmxlLnB1dChjYWNoZUtleSwgaW5mZXJyZWRDTURvY3VtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbmZlcnJlZENNRG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24gPSBpbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmNyZWF0ZUNNRWxlbWVudERlY2xhcmF0aW9uKGluZmVycmVkQ01Eb2N1bWVudCwgZWxlbWVudCwgZmFsc2UpOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB9Ci0KLSAgICAgIGlmIChwYXJlbnRJbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGluZmVycmVkR3JhbW1hckZhY3RvcnkuY3JlYXRlQ01Db250ZW50KHBhcmVudEluZmVycmVkQ01Eb2N1bWVudCwgcGFyZW50SW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiwgaW5mZXJyZWRDTURvY3VtZW50LCBpbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uLCBpc0xvY2FsLCB1cmkpOwotICAgICAgfSAKLSAgICB9ICAgICAgICAgICAgICAgCi0gICAgICAgICAgCi0gICAgdmlzaXRDaGlsZE5vZGVzKGVsZW1lbnQpOwotICAgICAgCi0gICAgLy8gcmVzZXQgdGhlICdjdXJyZW50JyBzdGF0ZSB0byBpbml0YWwgdmFsdWVzCi0gICAgaW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiA9IHBhcmVudEluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb247Ci0gICAgaW5mZXJyZWRDTURvY3VtZW50ID0gcGFyZW50SW5mZXJyZWRDTURvY3VtZW50OwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlBY3Rpb25IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9Nb2RlbFF1ZXJ5QWN0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NmEwZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlBY3Rpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbC5DTVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlBY3Rpb25IZWxwZXIKLXsKLSAgcHJvdGVjdGVkIE1vZGVsUXVlcnlJbXBsIG1vZGVsUXVlcnk7Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBBY3Rpb24gaW1wbGVtZW50cyBNb2RlbFF1ZXJ5QWN0aW9uCi0gIHsKLSAgICBwdWJsaWMgaW50IGtpbmQ7Ci0gICAgcHVibGljIGludCBzdGFydEluZGV4OwotICAgIHB1YmxpYyBpbnQgZW5kSW5kZXg7Ci0gICAgcHVibGljIE5vZGUgcGFyZW50OwotICAgIHB1YmxpYyBDTU5vZGUgY21Ob2RlOwotICAgIHB1YmxpYyBPYmplY3QgdXNlckRhdGE7Ci0KLSAgICBwdWJsaWMgQWN0aW9uKGludCBraW5kLCBOb2RlIHBhcmVudCwgQ01Ob2RlIGNtTm9kZSkKLSAgICB7Ci0gICAgICB0aGlzLmtpbmQgPSBraW5kOwotICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICB0aGlzLmNtTm9kZSA9IGNtTm9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWN0aW9uKGludCBraW5kLCBOb2RlIHBhcmVudCwgQ01Ob2RlIGNtTm9kZSwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkKLSAgICB7Ci0gICAgICB0aGlzLmtpbmQgPSBraW5kOwotICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICB0aGlzLmNtTm9kZSA9IGNtTm9kZTsKLSAgICAgIHRoaXMuc3RhcnRJbmRleCA9IHN0YXJ0SW5kZXg7Ci0gICAgICB0aGlzLmVuZEluZGV4ID0gZW5kSW5kZXg7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRLaW5kKCkKLSAgICB7Ci0gICAgICByZXR1cm4ga2luZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFN0YXJ0SW5kZXgoKQotICAgIHsKLSAgICAgIHJldHVybiBzdGFydEluZGV4OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0RW5kSW5kZXgoKQotICAgIHsKLSAgICAgIHJldHVybiBlbmRJbmRleDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9kZSBnZXRQYXJlbnQoKQotICAgIHsKLSAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIENNTm9kZSBnZXRDTU5vZGUoKQotICAgIHsKLSAgICAgIHJldHVybiBjbU5vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRVc2VyRGF0YSgpCi0gICAgewotICAgICAgcmV0dXJuIHVzZXJEYXRhOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVzZXJEYXRhKE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgdXNlckRhdGEgPSBvYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGVyZm9ybUFjdGlvbigpCi0gICAgewotICAgIH0KLSAgfQotCi0KLSAgcHVibGljIE1vZGVsUXVlcnlBY3Rpb25IZWxwZXIoTW9kZWxRdWVyeUltcGwgbW9kZWxRdWVyeSkKLSAgewotICAgIHRoaXMubW9kZWxRdWVyeSA9IG1vZGVsUXVlcnk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIGdldEFsbEFjdGlvbnMoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gIH0KLQotCi0gIC8vIGluc2VydCBhY3Rpb25zCi0gIC8vCi0gIHB1YmxpYyB2b2lkIGdldEluc2VydEFjdGlvbnMoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5kZXgsIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgewotICAgIGlmICgoaW5jbHVkZU9wdGlvbnMgJiBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUykgIT0gMCkKLSAgICB7Ci0gICAgICBnZXRJbnNlcnRBdHRyaWJ1dGVBY3Rpb25zKHBhcmVudCwgZWQsIHZhbGlkaXR5Q2hlY2tpbmcsIGFjdGlvbkxpc3QpOwotICAgIH0KLSAgICBpbmNsdWRlT3B0aW9ucyAmPSB+TW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVM7Ci0gICAgaWYgKChpbmNsdWRlT3B0aW9ucyAmIE1vZGVsUXVlcnkuSU5DTFVERV9DSElMRF9OT0RFUykgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIGdldEluc2VydENoaWxkTm9kZUFjdGlvbnNBdEluZGV4KHBhcmVudCwgZWQsIGluZGV4LCBpbmNsdWRlT3B0aW9ucywgdmFsaWRpdHlDaGVja2luZywgYWN0aW9uTGlzdCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGdldEluc2VydENoaWxkTm9kZUFjdGlvbnMocGFyZW50LCBlZCwgaW5jbHVkZU9wdGlvbnMsIHZhbGlkaXR5Q2hlY2tpbmcsIGFjdGlvbkxpc3QpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLQotICBwcm90ZWN0ZWQgdm9pZCBnZXRJbnNlcnRBdHRyaWJ1dGVBY3Rpb25zKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgewotICAgIC8vIGdldCBhY3Rpb25zIGZvciBlYWNoIGluc2VydGFibGUgYXR0cmlidXRlCi0gICAgLy8KLSAgICBMaXN0IGF2YWlsYWJsZUF0dHJpYnV0ZUxpc3QgPSBtb2RlbFF1ZXJ5LmdldEF2YWlsYWJsZUNvbnRlbnQocGFyZW50LCBlZCwgTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVMpOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gYXZhaWxhYmxlQXR0cmlidXRlTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbilpLm5leHQoKTsKLSAgICAgIGlmIChtb2RlbFF1ZXJ5LmNhbkluc2VydChwYXJlbnQsIGVkLCBhZCwgMCwgdmFsaWRpdHlDaGVja2luZykpCi0gICAgICB7Ci0gICAgICAgIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKE1vZGVsUXVlcnlBY3Rpb24uSU5TRVJULCBwYXJlbnQsIGFkKTsKLSAgICAgICAgYWN0aW9uTGlzdC5hZGQoYWN0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIGdldEluc2VydENoaWxkTm9kZUFjdGlvbnNBdEluZGV4KEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluZGV4LCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vIGdldCBhY3Rpb25zIGZvciBlYWNoIGluc2VydGFibGUgYXR0cmlidXRlCi0gICAgLy8KLSAgICBpbnQgc2l6ZSA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCk7Ci0gICAgaWYgKGluZGV4IDw9IHNpemUpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QgPSBtb2RlbFF1ZXJ5LmdldFZhbGlkYXRvcigpLmNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChwYXJlbnQsIGVkKTsgCi0gICAgICBMaXN0IGF2YWlsYWJsZUNoaWxkTm9kZUxpc3QgPSBtb2RlbFF1ZXJ5LmdldEF2YWlsYWJsZUNvbnRlbnQocGFyZW50LCBlZCwgaW5jbHVkZU9wdGlvbnMpOwotCi0gICAgICBib29sZWFuIGlzU2ltcGxlQ2hvaWNlID0gaXNTaW1wbGVDaG9pY2VHcm91cENvbnRlbnRNb2RlbChlZCk7Ci0gICAgIAotICAgICAgZm9yIChJdGVyYXRvciBpID0gYXZhaWxhYmxlQ2hpbGROb2RlTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBDTU5vZGUgY21Ob2RlID0gKENNTm9kZSlpLm5leHQoKTsgICAgICAKLSAgICAgICAgaWYgKGlzU2ltcGxlQ2hvaWNlIHx8IG1vZGVsUXVlcnkuY2FuSW5zZXJ0KHBhcmVudCwgZWQsIGNtTm9kZSwgaW5kZXgsIHZhbGlkaXR5Q2hlY2tpbmcsIGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCkpCi0gICAgICAgIHsKLSAgICAgICAgICBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbihNb2RlbFF1ZXJ5QWN0aW9uLklOU0VSVCwgcGFyZW50LCBjbU5vZGUsIGluZGV4LCBpbmRleCk7Ci0gICAgICAgICAgYWN0aW9uTGlzdC5hZGQoYWN0aW9uKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAgICAgICAgICAgICAgICAgCi0gCi0gIHByb3RlY3RlZCBib29sZWFuIGlzU2ltcGxlQ2hvaWNlR3JvdXBDb250ZW50TW9kZWwoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsgICAgICAgCi0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICBDTU5vZGUgY21Ob2RlID0gZWQuZ2V0Q29udGVudCgpOwotICAgIGlmIChjbU5vZGUgIT0gbnVsbCAmJiBjbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuR1JPVVApCi0gICAgewotICAgICAgQ01Hcm91cCBjbUdyb3VwID0gKENNR3JvdXApY21Ob2RlOwotICAgICAgaWYgKGNtR3JvdXAuZ2V0T3BlcmF0b3IoKSA9PSBDTUdyb3VwLkNIT0lDRSAmJiBjbUdyb3VwLmdldE1heE9jY3VyKCkgPT0gLTEpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICBDTU5vZGVMaXN0IGxpc3QgPSBjbUdyb3VwLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IGxpc3QuZ2V0TGVuZ3RoKCkgLSAxOyBpID49IDA7IGktLSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChsaXN0Lml0ZW0oaSkuZ2V0Tm9kZVR5cGUoKSAhPSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCBnZXRJbnNlcnRDaGlsZE5vZGVBY3Rpb25zKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gICAgaW50IHNpemUgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpOwotICAgIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0ID0gbW9kZWxRdWVyeS5nZXRWYWxpZGF0b3IoKS5jcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QocGFyZW50LCBlZCk7Ci0gICAgTGlzdCBhdmFpbGFibGVDaGlsZE5vZGVMaXN0ID0gbW9kZWxRdWVyeS5nZXRBdmFpbGFibGVDb250ZW50KHBhcmVudCwgZWQsIGluY2x1ZGVPcHRpb25zKTsKLQotICAgIGJvb2xlYW4gaXNTaW1wbGVDaG9pY2UgPSBpc1NpbXBsZUNob2ljZUdyb3VwQ29udGVudE1vZGVsKGVkKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhdmFpbGFibGVDaGlsZE5vZGVMaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIENNTm9kZSBjbU5vZGUgPSAoQ01Ob2RlKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGZvciAoaW50IGkgPSBzaXplOyBpID49IDA7IGktLSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGlzU2ltcGxlQ2hvaWNlIHx8IG1vZGVsUXVlcnkuY2FuSW5zZXJ0KHBhcmVudCwgZWQsIGNtTm9kZSwgaSwgdmFsaWRpdHlDaGVja2luZywgY29udGVudFNwZWNpZmljYXRpb25MaXN0KSkKLSAgICAgICAgewotICAgICAgICAgIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKE1vZGVsUXVlcnlBY3Rpb24uSU5TRVJULCBwYXJlbnQsIGNtTm9kZSwgaSwgaSk7Ci0gICAgICAgICAgYWN0aW9uTGlzdC5hZGQoYWN0aW9uKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdldEluc2VydEFjdGlvbnMoRG9jdW1lbnQgcGFyZW50LCBDTURvY3VtZW50IGNtRG9jdW1lbnQsIGludCBpbmRleCwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gICAgLy8gZ2V0IHRoZSByb290IGVsZW1lbnQgYW5kIGRvY3R5cGUgaW5kZXggKGlmIGFueSkKLSAgICAvLwotICAgIGludCBkb2N0eXBlSW5kZXggPSAtMTsKLSAgICBEb2N1bWVudFR5cGUgZG9jdHlwZSA9IG51bGw7Ci0gICAgRWxlbWVudCByb290RWxlbWVudCA9IG51bGw7Ci0gICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3RMZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIGNoaWxkTm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0gICAgICBpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0gICAgICAgIHJvb3RFbGVtZW50ID0gKEVsZW1lbnQpY2hpbGROb2RlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNoaWxkTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKQotICAgICAgewotICAgICAgICBkb2N0eXBlID0gKERvY3VtZW50VHlwZSljaGlsZE5vZGU7Ci0gICAgICAgIGRvY3R5cGVJbmRleCA9IGk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gbWFrZSBzdXJlIHRoYXQgcm9vdCBlbGVtZW50cyBhcmUgb25seSBhZGRlZCBhZnRlciB0aGUgZG9jdHlwZSAoaWYgYW55KQotICAgIGlmIChyb290RWxlbWVudCA9PSBudWxsICYmIGluZGV4ID4gZG9jdHlwZUluZGV4KQotICAgIHsKLSAgICAgIENNTmFtZWROb2RlTWFwIG1hcCA9IGNtRG9jdW1lbnQuZ2V0RWxlbWVudHMoKTsKLSAgICAgIGludCBtYXBMZW5ndGggPSBtYXAuZ2V0TGVuZ3RoKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcExlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBDTU5vZGUgY21Ob2RlID0gbWFwLml0ZW0oaSk7Ci0KLSAgICAgICAgYm9vbGVhbiBjYW5BZGQgPSB0cnVlOwotICAgICAgICBpZiAodmFsaWRpdHlDaGVja2luZyA9PSBNb2RlbFF1ZXJ5LlZBTElESVRZX1NUUklDVCkKLSAgICAgICAgewotICAgICAgICAgIGNhbkFkZCA9IGRvY3R5cGUgPT0gbnVsbCB8fCBkb2N0eXBlLmdldE5hbWUoKS5lcXVhbHMoY21Ob2RlLmdldE5vZGVOYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNhbkFkZCkKLSAgICAgICAgewotICAgICAgICAgIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKE1vZGVsUXVlcnlBY3Rpb24uSU5TRVJULCBwYXJlbnQsIGNtTm9kZSwgaW5kZXgsIGluZGV4KTsKLSAgICAgICAgICBhY3Rpb25MaXN0LmFkZChhY3Rpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotCi0gIHB1YmxpYyB2b2lkIGdldEluc2VydENoaWxkTm9kZUFjdGlvblRhYmxlKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIEhhc2h0YWJsZSBhY3Rpb25UYWJsZSkKLSAgewotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBnZXRSZXBsYWNlQWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgewotICAgIENNVmFsaWRhdG9yLk1hdGNoTW9kZWxOb2RlIG1hdGNoTW9kZWxOb2RlID0gbW9kZWxRdWVyeS5nZXRWYWxpZGF0b3IoKS5nZXRNYXRjaE1vZGVsKGVkLCBwYXJlbnQpOwotICAgIGlmIChtYXRjaE1vZGVsTm9kZSAhPSBudWxsKQotICAgIHsKLSAgICAgIE1hdGNoTW9kZWxWaXNpdG9yIHZpc2l0b3IgPSBuZXcgTWF0Y2hNb2RlbFZpc2l0b3IocGFyZW50LCBhY3Rpb25MaXN0KTsKLSAgICAgIHZpc2l0b3IudmlzaXRNYXRjaE1vZGVsTm9kZShtYXRjaE1vZGVsTm9kZSk7Ci0gICAgfSAgICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBnZXRSZXBsYWNlQWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3Qgc2VsZWN0ZWRDaGlsZHJlbiwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gICAgaW50W10gcmFuZ2UgPSBnZXRSYW5nZShwYXJlbnQsIHNlbGVjdGVkQ2hpbGRyZW4pOwotICAgIGlmIChyYW5nZSAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICBpZiAoaXNDb250aWd1b3VzKHBhcmVudCwgcmFuZ2UsIHNlbGVjdGVkQ2hpbGRyZW4pKQotICAgICAgewotICAgICAgICBMaXN0IHRlbXBMaXN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgICBnZXRSZXBsYWNlQWN0aW9ucyhwYXJlbnQsIGVkLCBpbmNsdWRlT3B0aW9ucywgdmFsaWRpdHlDaGVja2luZywgdGVtcExpc3QpOwotICAgICAgICBpZiAoKGluY2x1ZGVPcHRpb25zICYgTW9kZWxRdWVyeS5JTkNMVURFX0VOQ0xPU0lOR19SRVBMQUNFX0FDVElPTlMpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICByZW1vdmVBY3Rpb25zTm90Q29udGFpbmluZ1JhbmdlKHRlbXBMaXN0LCByYW5nZVswXSwgcmFuZ2VbMV0pOyAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlbW92ZUFjdGlvbnNOb3RNYXRjaGluZ1JhbmdlKHRlbXBMaXN0LCByYW5nZVswXSwgcmFuZ2VbMV0pOyAgICAKLSAgICAgICAgfQotICAgICAgICBhY3Rpb25MaXN0LmFkZEFsbCh0ZW1wTGlzdCk7Ci0gICAgICB9Ci0gICAgfSAgIAotICAgIAotICAgIGlmIChzZWxlY3RlZENoaWxkcmVuLnNpemUoKSA9PSAxKQotICAgIHsKLSAgICAgIE5vZGUgbm9kZSA9IChOb2RlKXNlbGVjdGVkQ2hpbGRyZW4uZ2V0KDApOwotICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsgICAgICAgIAotICAgICAgICBFbGVtZW50IGNoaWxkRWxlbWVudCA9IChFbGVtZW50KW5vZGU7ICAgICAgIAotICAgICAgICBDTU5vZGUgY2hpbGRFZCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oY2hpbGRFbGVtZW50KTsKLSAgICAgICAgaWYgKGNoaWxkRWQgIT0gbnVsbCkKLSAgICAgICAgeyAgICAgICAgIAotCi0gICAgICAgICAgQ01Ob2RlIGNoaWxkT3JpZ2luPSBtb2RlbFF1ZXJ5LmdldE9yaWdpbihjaGlsZEVsZW1lbnQpOwotCi0gICAgICAgICAgQ01Ob2RlTGlzdCBjbU5vZGVMaXN0ID0gY2hpbGRPcmlnaW4gIT0gbnVsbCA/IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENNTm9kZUxpc3QpY2hpbGRPcmlnaW4uZ2V0UHJvcGVydHkoIlN1YnN0aXR1dGlvbkdyb3VwIikgOiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ01Ob2RlTGlzdCljaGlsZEVkLmdldFByb3BlcnR5KCJTdWJzdGl0dXRpb25Hcm91cCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICBpZiAoY21Ob2RlTGlzdCAhPSBudWxsICYmIGNtTm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAxKQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgcmVwbGFjZUluZGV4ID0gZ2V0SW5kZXgocGFyZW50LCBjaGlsZEVsZW1lbnQpOwotICAgICAgICAgICAgU3RyaW5nIGNoaWxkRWROYW1lID0gY2hpbGRFZC5nZXROb2RlTmFtZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbU5vZGVMaXN0LmdldExlbmd0aCgpOyBpKyspCi0gICAgICAgICAgICB7ICAgICAgICAgCi0gICAgICAgICAgICAgIENNTm9kZSBzdWJzdGl0dXRpb24gPSBjbU5vZGVMaXN0Lml0ZW0oaSk7Ci0gICAgICAgICAgICAgIGlmICghc3Vic3RpdHV0aW9uLmdldE5vZGVOYW1lKCkuZXF1YWxzKGNoaWxkRWROYW1lKSAmJiAhQm9vbGVhbi5UUlVFLmVxdWFscyhzdWJzdGl0dXRpb24uZ2V0UHJvcGVydHkoIkFic3RyYWN0IikpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbihNb2RlbFF1ZXJ5QWN0aW9uLlJFUExBQ0UsIHBhcmVudCwgY21Ob2RlTGlzdC5pdGVtKGkpLCByZXBsYWNlSW5kZXgsIHJlcGxhY2VJbmRleCk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uTGlzdC5hZGQoYWN0aW9uKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSAgIAotICAgIH0KLSAgfSAgICAgCi0gICAgICAgICAgIAotICAKLSAgLy8gcmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RlZCBub2RlcyBhcmUgY29udGlndW91cwotICAvLyAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzQ29udGlndW91cyhFbGVtZW50IHBhcmVudCwgaW50W10gcmFuZ2UsIExpc3Qgc2VsZWN0ZWROb2RlTGlzdCkKLSAgeyAgICAgICAgIAotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICBOb2RlTGlzdCBub2RlTGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JLy8gaXNzdWU6IG5vZGVMaXN0TGVuZ3RoIHdhcyBuZXZlciByZWFkLCBidXQgaW4gdGhlb3J5LCAKLQkvLyBub2RlbExpc3QuZ2V0TGVuZ3RoKCkgbWlnaHQgY2F1c2Ugc29tZSBjbGVhcmluZyBvZiBjYWNoZWQgCi0JLy8gZGF0YSwgb3Igc29tZXRoaW5nLCBzbyBsZWF2aW5nIGluIGEgcG90ZW50aWFsIG1lYW5pbmdsZXNzIGNhbGwsIGZvciBub3cuCi0gICAgLy9pbnQgbm9kZUxpc3RMZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLQlub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gcmFuZ2VbMF07IGkgPCByYW5nZVsxXTsgaSsrKQotICAgIHsgICAgICAgCi0gICAgICBOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOyAgICAKLSAgICAgIGlmICghaXNXaGl0ZXNwYWNlTm9kZShub2RlKSAmJiAhc2VsZWN0ZWROb2RlTGlzdC5jb250YWlucyhub2RlKSkKLSAgICAgIHsgICAgICAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0gICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gCi0gCi0gIHByb3RlY3RlZCBpbnRbXSBnZXRSYW5nZShFbGVtZW50IHBhcmVudCwgTGlzdCBsaXN0KQotICB7Ci0gICAgaW50W10gcmVzdWx0ID0gbnVsbDsKLSAgICBpbnQgZmlyc3QgPSAtMTsKLSAgICBpbnQgbGFzdCA9IC0xOyAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3RMZW5ndGg7IGkrKykKLSAgICB7ICAgICAgIAotICAgICAgTm9kZSBub2RlID0gbm9kZUxpc3QuaXRlbShpKTsgICAgCi0gICAgICBpZiAobGlzdC5jb250YWlucyhub2RlKSkKLSAgICAgIHsgICAgICAgICAgICAgCi0gICAgICAgIGZpcnN0ID0gKGZpcnN0ID09IC0xKSA/IGkgOiBNYXRoLm1pbihmaXJzdCwgaSk7ICAgICAgICAKLSAgICAgICAgbGFzdCA9IE1hdGgubWF4KGxhc3QsIGkpOwotICAgICAgfSAgICAKLSAgICB9Ci0gICAKLSAgICBpZiAoZmlyc3QgIT0gLTEgJiYgbGFzdCE9IC0xKQotICAgIHsgICAgICAgICAgICAgCi0gICAgICByZXN1bHQgPSBuZXcgaW50WzJdOwotICAgICAgcmVzdWx0WzBdID0gZmlyc3Q7Ci0gICAgICByZXN1bHRbMV0gPSBsYXN0OwotICAgIH0gICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotCi0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNXaGl0ZXNwYWNlTm9kZShOb2RlIG5vZGUpCi0gIHsKLSAgICByZXR1cm4gbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmCi0gICAgICAgICAgIG5vZGUuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDA7Ci0gIH0gCi0KLQotICBwcm90ZWN0ZWQgaW50IGdldEluZGV4KE5vZGUgcGFyZW50Tm9kZSwgTm9kZSBjaGlsZCkKLSAgewotICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgaW50IGluZGV4ID0gLTE7Ci0gICAgaW50IHNpemUgPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICBpZiAobm9kZUxpc3QuaXRlbShpKSA9PSBjaGlsZCkKLSAgICAgIHsKLSAgICAgICAgaW5kZXggPSBpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGluZGV4OwotICB9ICAgICAgICAgICAgICAgICAgICAKLQotCi0gIHByb3RlY3RlZCBib29sZWFuIGlzQWN0aW9uQ29udGFpbmluZ1JhbmdlKE1vZGVsUXVlcnlBY3Rpb24gYWN0aW9uLCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KQotICB7Ci0gICAgaW50IGFjdGlvblN0YXJ0SW5kZXggPSBhY3Rpb24uZ2V0U3RhcnRJbmRleCgpOwotICAgIGludCBhY3Rpb25FbmRJbmRleCA9IGFjdGlvbi5nZXRFbmRJbmRleCgpOwotCi0gICAgcmV0dXJuIChhY3Rpb25TdGFydEluZGV4IDw9IHN0YXJ0SW5kZXggJiYKLSAgICAgICAgICAgIGFjdGlvbkVuZEluZGV4ID49IGVuZEluZGV4KTsKLSAgfSAKLSAgICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBY3Rpb25NYXRjaGluZ1JhbmdlKE1vZGVsUXVlcnlBY3Rpb24gYWN0aW9uLCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KQotICB7Ci0gICAgaW50IGFjdGlvblN0YXJ0SW5kZXggPSBhY3Rpb24uZ2V0U3RhcnRJbmRleCgpOwotICAgIGludCBhY3Rpb25FbmRJbmRleCA9IGFjdGlvbi5nZXRFbmRJbmRleCgpOwotICAgIHJldHVybiAoYWN0aW9uU3RhcnRJbmRleCA9PSBzdGFydEluZGV4ICYmICAgICAgICAKLSAgICAgICAgICAgIGFjdGlvbkVuZEluZGV4ID09IGVuZEluZGV4KTsKLSAgfSAKLSAgICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWN0aW9uc05vdENvbnRhaW5pbmdSYW5nZShMaXN0IGFjdGlvbkxpc3QsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpCi0gIHsKLSAgICBmb3IgKGludCBpID0gYWN0aW9uTGlzdC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkKLSAgICB7Ci0gICAgICBNb2RlbFF1ZXJ5QWN0aW9uIGFjdGlvbiA9IChNb2RlbFF1ZXJ5QWN0aW9uKWFjdGlvbkxpc3QuZ2V0KGkpOwotICAgICAgaWYgKCFpc0FjdGlvbkNvbnRhaW5pbmdSYW5nZShhY3Rpb24sIHN0YXJ0SW5kZXgsIGVuZEluZGV4KSkKLSAgICAgIHsKLSAgICAgICAgYWN0aW9uTGlzdC5yZW1vdmUoaSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVBY3Rpb25zTm90TWF0Y2hpbmdSYW5nZShMaXN0IGFjdGlvbkxpc3QsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpCi0gIHsKLSAgICBmb3IgKGludCBpID0gYWN0aW9uTGlzdC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkKLSAgICB7Ci0gICAgICBNb2RlbFF1ZXJ5QWN0aW9uIGFjdGlvbiA9IChNb2RlbFF1ZXJ5QWN0aW9uKWFjdGlvbkxpc3QuZ2V0KGkpOwotICAgICAgaWYgKCFpc0FjdGlvbk1hdGNoaW5nUmFuZ2UoYWN0aW9uLCBzdGFydEluZGV4LCBlbmRJbmRleCkpCi0gICAgICB7Ci0gICAgICAgIGFjdGlvbkxpc3QucmVtb3ZlKGkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXRjaE1vZGVsVmlzaXRvcgotICB7Ci0gICAgaW50IGluZGVudDsKLSAgICBpbnQgZWxlbWVudEluZGV4OwotICAgIE5vZGUgcGFyZW50OwotICAgIExpc3QgYWN0aW9uTGlzdDsKLQotICAgIHB1YmxpYyBNYXRjaE1vZGVsVmlzaXRvcihOb2RlIHBhcmVudCwgTGlzdCBhY3Rpb25MaXN0KQotICAgIHsKLSAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgdGhpcy5hY3Rpb25MaXN0ID0gYWN0aW9uTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGluZGV4T2ZOZXh0RWxlbWVudChpbnQgc3RhcnQpCi0gICAgewotICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgaW50IGxlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgICAgaW50IHJlc3VsdCA9IGxlbmd0aDsKLSAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotICAgICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gaTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdE1hdGNoTW9kZWxOb2RlKENNVmFsaWRhdG9yLk1hdGNoTW9kZWxOb2RlIG1hdGNoTW9kZWxOb2RlKQotICAgIHsKLSAgICAgIGludCBzdGFydEluZGV4ID0gaW5kZXhPZk5leHRFbGVtZW50KGVsZW1lbnRJbmRleCk7Ci0KLSAgICAgIC8vU3RyaW5nIGNtTm9kZU5hbWUgPSBtYXRjaE1vZGVsTm9kZS5jbU5vZGUgIT0gbnVsbCA/IG1hdGNoTW9kZWxOb2RlLmNtTm9kZS5nZXROb2RlTmFtZSgpIDogIm51bGwiOwotICAgICAgLy9wcmludEluZGVudGVkKGluZGVudCwgIitNYXRjaE1vZGVsTm9kZSA6ICIgKyBjbU5vZGVOYW1lICsgICIgIiArIHN0YXJ0SW5kZXgpOwotCi0gICAgICBpbmRlbnQgKz0gMjsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtYXRjaE1vZGVsTm9kZS5jaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgQ01WYWxpZGF0b3IuTWF0Y2hNb2RlbE5vZGUgY2hpbGQgPSAoQ01WYWxpZGF0b3IuTWF0Y2hNb2RlbE5vZGUpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICB2aXNpdE1hdGNoTW9kZWxOb2RlKGNoaWxkKTsKLSAgICAgIH0KLSAgICAgIGluZGVudCAtPSAyOwotCi0gICAgICBpZiAobWF0Y2hNb2RlbE5vZGUuY21Ob2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGludCBub2RlVHlwZSA9IG1hdGNoTW9kZWxOb2RlLmNtTm9kZS5nZXROb2RlVHlwZSgpOwotICAgICAgICBpZiAobm9kZVR5cGUgPT0gQ01Ob2RlLkdST1VQKQotICAgICAgICB7Ci0gICAgICAgICAgQ01Hcm91cCBncm91cCA9IChDTUdyb3VwKW1hdGNoTW9kZWxOb2RlLmNtTm9kZTsKLSAgICAgICAgICBpZiAoZ3JvdXAuZ2V0T3BlcmF0b3IoKSA9PSBDTUdyb3VwLkNIT0lDRSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhZGRSZXBsYWNlQWN0aW9ucyhtYXRjaE1vZGVsTm9kZSwgZ3JvdXAsIHN0YXJ0SW5kZXgsIGVsZW1lbnRJbmRleCAtIDEpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChub2RlVHlwZSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnRJbmRleCA9IHN0YXJ0SW5kZXggKyAxOwotICAgICAgICB9Ci0gICAgICAgIC8vcHJpbnRJbmRlbnRlZChpbmRlbnQsICItTWF0Y2hNb2RlbE5vZGUgOiAiICsgY21Ob2RlTmFtZSArICAiICIgKyAoZWxlbWVudEluZGV4IC0gMSkpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlcGxhY2VBY3Rpb25zKENNVmFsaWRhdG9yLk1hdGNoTW9kZWxOb2RlIG1hdGNoTW9kZWxOb2RlLCBDTUdyb3VwIGdyb3VwLCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KQotICAgIHsKLSAgICAgIENNTm9kZSBleGNsdWRlQ01Ob2RlID0gbnVsbDsKLSAgICAgIGlmIChtYXRjaE1vZGVsTm9kZS5jaGlsZHJlbi5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBDTVZhbGlkYXRvci5NYXRjaE1vZGVsTm9kZSBjaGlsZCA9IChDTVZhbGlkYXRvci5NYXRjaE1vZGVsTm9kZSltYXRjaE1vZGVsTm9kZS5jaGlsZHJlbi5nZXQoMCk7Ci0gICAgICAgIGV4Y2x1ZGVDTU5vZGUgPSBjaGlsZC5jbU5vZGU7Ci0gICAgICB9Ci0KLSAgICAgIENNTm9kZUxpc3Qgbm9kZUxpc3QgPSBncm91cC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBpbnQgc2l6ZSA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICB7Ci0gICAgICAgIENNTm9kZSBhbHRlcm5hdGl2ZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0gICAgICAgIGlmIChhbHRlcm5hdGl2ZSAhPSBleGNsdWRlQ01Ob2RlKQotICAgICAgICB7Ci0gICAgICAgICAgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oTW9kZWxRdWVyeUFjdGlvbi5SRVBMQUNFLCBwYXJlbnQsIGFsdGVybmF0aXZlLCBzdGFydEluZGV4LCBlbmRJbmRleCk7Ci0gICAgICAgICAgYWN0aW9uTGlzdC5hZGQoYWN0aW9uKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vcHVibGljIHN0YXRpYyB2b2lkIHByaW50SW5kZW50ZWQoaW50IGluZGVudCwgU3RyaW5nIHN0cmluZykKLSAgLy97Ci0gIC8vICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKQotICAvLyAgewotICAvLyAgICBTeXN0ZW0ub3V0LnByaW50KCIgIik7Ci0gIC8vICB9Ci0gIC8vICBTeXN0ZW0ub3V0LnByaW50bG4oc3RyaW5nKTsKLSAgLy99Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9Nb2RlbFF1ZXJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzZkOGZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9Nb2RlbFF1ZXJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BbnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwubW9kZWxxdWVyeWltcGwuTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbC5DTURhdGFUeXBlVmFsdWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsLkRPTVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb24uTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VUYWJsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgbGFyZ2UgcG9ydGlvbiBvZiB0aGUgTW9kZWxRdWVyeSBpbnRlcmZhY2VzLgotICogU29tZSB3b3JrIGlzIGRlbGVnYXRlZCB0byB0aGUgRE9NSGVscGVyLCBDTURvY3VtZW50TWFuYWdlciwgYW5kIERPTVZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlJbXBsIGltcGxlbWVudHMgTW9kZWxRdWVyeQotewotICBwcm90ZWN0ZWQgTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIgbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBNb2RlbFF1ZXJ5QWN0aW9uSGVscGVyIG1vZGVsUXVlcnlBY3Rpb25IZWxwZXI7Ci0gIHByb3RlY3RlZCBET01WYWxpZGF0b3IgdmFsaWRhdG9yOyAgIAotICBwcm90ZWN0ZWQgTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXJJbXBsIGV4dGVuc2lvbk1hbmFnZXI7ICAgCi0gIHByb3RlY3RlZCBDTURhdGFUeXBlVmFsdWVIZWxwZXIgdmFsdWVIZWxwZXI7Ci0gIHByb3RlY3RlZCBpbnQgZWRpdE1vZGUgPSBFRElUX01PREVfQ09OU1RSQUlORURfU1RSSUNUOwotCi0gIHB1YmxpYyBNb2RlbFF1ZXJ5SW1wbChNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciBtb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcikKLSAgewotICAgIHRoaXMubW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIgPSBtb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcjsKLSAgICBtb2RlbFF1ZXJ5QWN0aW9uSGVscGVyID0gY3JlYXRlTW9kZWxRdWVyeUFjdGlvbkhlbHBlcigpOwotICAgIHZhbGlkYXRvciA9IG5ldyBET01WYWxpZGF0b3IoKTsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgZXh0ZW5zaW9uTWFuYWdlciA9IG5ldyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlckltcGwoKTsKLSAgICB2YWx1ZUhlbHBlciA9IG5ldyBDTURhdGFUeXBlVmFsdWVIZWxwZXIoKTsKLSAgfQotICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgaW50IGdldEVkaXRNb2RlKCkKLSAgewotICAgIHJldHVybiBlZGl0TW9kZTsKLSAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgc2V0RWRpdE1vZGUoaW50IGVkaXRNb2RlKQotICB7Ci0gICAgdGhpcy5lZGl0TW9kZSA9ZWRpdE1vZGU7Ci0gIH0KLQotCi0gIC8vIGZhY3RvcnkgbWV0aG9kcwotICBwdWJsaWMgTW9kZWxRdWVyeUFjdGlvbkhlbHBlciBjcmVhdGVNb2RlbFF1ZXJ5QWN0aW9uSGVscGVyKCkKLSAgewotICAgIHJldHVybiBuZXcgTW9kZWxRdWVyeUFjdGlvbkhlbHBlcih0aGlzKTsKLSAgfSAKLQotICBwdWJsaWMgRE9NVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpCi0gIHsKLSAgICByZXR1cm4gdmFsaWRhdG9yOwotICB9Ci0KLSAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoTm9kZSBub2RlKQotICB7Ci0gICAgcmV0dXJuIG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KG5vZGUpOwotICB9Ci0KLSAgcHVibGljIENNTm9kZSBnZXRDTU5vZGUoTm9kZSBub2RlKQotICB7Ci0gICAgcmV0dXJuIG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNTm9kZShub2RlKTsKLSAgfQotCi0gIHB1YmxpYyBDTURhdGFUeXBlIGdldENNRGF0YVR5cGUoVGV4dCB0ZXh0KQotICB7Ci0gICAgcmV0dXJuIG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNRGF0YVR5cGUodGV4dCk7Ci0gIH0KLQotICBwdWJsaWMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKEF0dHIgYXR0cikKLSAgewotICAgIHJldHVybiBtb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5nZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpOwotICB9Ci0KLSAgcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHJldHVybiBtb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgfQotICAgCi0gIHB1YmxpYyBDTURvY3VtZW50TWFuYWdlciBnZXRDTURvY3VtZW50TWFuYWdlcigpCi0gIHsKLSAgICBDTURvY3VtZW50TWFuYWdlciByZXN1bHQgPSBudWxsOwotICAgIGlmIChtb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciBpbnN0YW5jZW9mIFhNTEFzc29jaWF0aW9uUHJvdmlkZXIpCi0gICAgeyAgICAgICAgICAgICAKLSAgICAgIFhNTEFzc29jaWF0aW9uUHJvdmlkZXIgeG1sQXNzb2NpYXRpb25Qcm92aWRlciA9IChYTUxBc3NvY2lhdGlvblByb3ZpZGVyKW1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyOwotICAgICAgcmVzdWx0ID0geG1sQXNzb2NpYXRpb25Qcm92aWRlci5nZXRDTURvY3VtZW50TWFuYWdlcigpOwotICAgIH0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAgICAgIAotCi0gIC8qKgotICAgKiBAZGVwcmVjdGVkIC0gdXNlIDMgYXJnIHZlcnNpb24gYmVsb3cKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldENNRG9jdW1lbnRMaXN0KEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHVyaSkKLSAgeyAgICAgICAgCi0gICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRDTURvY3VtZW50TGlzdChFbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBTdHJpbmcgdXJpKQotICB7ICAgICAgICAgICAgICAgIAotICAgIExpc3QgcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotICAgIGlmIChtb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciBpbnN0YW5jZW9mIFhNTEFzc29jaWF0aW9uUHJvdmlkZXIpCi0gICAgeyAgICAgICAgICAgICAgCi0gICAgICBYTUxBc3NvY2lhdGlvblByb3ZpZGVyIHhtbEFzc29jaWF0aW9uUHJvdmlkZXIgPSAoWE1MQXNzb2NpYXRpb25Qcm92aWRlciltb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcjsKLSAgICAgCi0gICAgICAvLyB0b2RvLi4uIHJldmlzdC4uLiBoYW5kbGUgZWFjaCAjI3RoaW5nIGV4cGxpY2l0bHkKLSAgICAgIC8vICAgICAgICAgIAotICAgICAgaWYgKHVyaSA9PSBudWxsKQotICAgICAgewotICAgICAgICB1cmkgPSAiIyNhbnkiOyAvLyROT04tTkxTLTEkCi0gICAgICB9ICAgICAgICAgICAgICAgCi0KLSAgICAgIGlmICh1cmkuZXF1YWxzKCIjI3RhcmdldE5hbWVzcGFjZSIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWVkLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgcmVzdWx0LmFkZChjbURvY3VtZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAodXJpLmVxdWFscygiIyNhbnkiKSB8fCB1cmkuZXF1YWxzKCIjI290aGVyIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU3RyaW5nIGV4Y2x1ZGVkVVJJID0gbnVsbDsKLSAgICAgICAgaWYgKHVyaS5lcXVhbHMoIiMjb3RoZXIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpZWQuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGV4Y2x1ZGVkVVJJID0gKFN0cmluZyljbURvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHdlIHNob3VsZCBjb25zaWRlciBhbGwgb2YgdGhlIHNjaGVtYSByZWxhdGVkIHRvIHRoaXMgZG9jdW1lbnQKLSAgICAgICAgLy8KLSAgICAgICAgTmFtZXNwYWNlVGFibGUgbmFtZXNwYWNlVGFibGUgPSBuZXcgTmFtZXNwYWNlVGFibGUoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgICBuYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50TGluZWFnZShlbGVtZW50KTsKLSAgICAgICAgTGlzdCBsaXN0ID0gbmFtZXNwYWNlVGFibGUuZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsKLSAgICAgICAgICBpZiAoaW5mby51cmkgIT0gbnVsbCAmJiAhaW5mby51cmkuZXF1YWxzKGV4Y2x1ZGVkVVJJKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDTURvY3VtZW50IGRvY3VtZW50ID0geG1sQXNzb2NpYXRpb25Qcm92aWRlci5nZXRDTURvY3VtZW50KGluZm8udXJpLCBpbmZvLmxvY2F0aW9uSGludCwgIlhTRCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0LmFkZChkb2N1bWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9ICAgCi0gICAgICBlbHNlCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgQ01Eb2N1bWVudCBkb2N1bWVudCA9IHhtbEFzc29jaWF0aW9uUHJvdmlkZXIuZ2V0Q01Eb2N1bWVudChlbGVtZW50LCB1cmkpOwotICAgICAgICBpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hZGQoZG9jdW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdXJpKQotICB7ICAgICAgICAgICAgICAgIAotCi0gICAgQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotICAgIGlmIChtb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciBpbnN0YW5jZW9mIFhNTEFzc29jaWF0aW9uUHJvdmlkZXIpCi0gICAgeyAgICAgICAgICAgICAKLSAgICAgIFhNTEFzc29jaWF0aW9uUHJvdmlkZXIgeG1sQXNzb2NpYXRpb25Qcm92aWRlciA9IChYTUxBc3NvY2lhdGlvblByb3ZpZGVyKW1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyOwotICAgICAgcmVzdWx0ID0geG1sQXNzb2NpYXRpb25Qcm92aWRlci5nZXRDTURvY3VtZW50KGVsZW1lbnQsIHVyaSk7Ci0gICAgfQotICAgIC8vQ29udGVudE1vZGVsTWFuYWdlci5wcmludGxuKCJNb2RlbFF1ZXJ5SW1wbC5nZXRDTURvY3VtZW50KCIgKyBlbGVtZW50LmdldE5vZGVOYW1lKCkgKyAiLCAiICsgdXJpICsgIikgPSAiICsgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNDb250ZW50VmFsaWQoRWxlbWVudCBlbGVtZW50KQotICB7ICAgICAgICAgICAgICAgCi0gICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICByZXR1cm4gaXNDb250ZW50VmFsaWQoZWQsIGVsZW1lbnQpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNDb250ZW50VmFsaWQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIEVsZW1lbnQgZWxlbWVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOyAgICAKLSAgICBpZiAoZWQgIT0gbnVsbCkKLSAgICB7IAotICAgICAgLy8gZmlyc3QgY2hlY2sgdG8gc2VlIGlmIGFsbCB0aGUgcmVxdWlyZWQgYXR0cmlidXRlcyBhcmUgcHJlc2VudAotICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIENNTmFtZWROb2RlTWFwIG1hcCA9IGVkLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgIGludCBtYXBMZW5ndGggPSBtYXAuZ2V0TGVuZ3RoKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcExlbmd0aDsgaSsrKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiltYXAuaXRlbShpKTsKLSAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuY29tcHV0ZU5hbWUoYWQsIGVsZW1lbnQsIG51bGwpOwotICAgICAgICBpZiAoYWQuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKQotICAgICAgICB7ICAgICAgICAgICAgICAgCi0gICAgICAgICAgIEF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShhdHRyaWJ1dGVOYW1lKTsKLSAgICAgICAgICAgaWYgKGF0dHIgPT0gbnVsbCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gbm93IGNoZWNrIHRvIHNlZSBvZiB0aGUgY2hpbGRyZW4gdmFsaWRhdGUgcHJvcGVybHkKLSAgICAgIC8vCi0gICAgICBpZiAocmVzdWx0KSAKLSAgICAgIHsKLSAgICAgICAgQ01Ob2RlW10gb3JpZ2luQXJyYXkgPSBnZXRPcmlnaW5BcnJheShlbGVtZW50KTsKLSAgICAgICAgcmVzdWx0ID0gb3JpZ2luQXJyYXkgIT0gbnVsbCAmJiBvcmlnaW5BcnJheS5sZW5ndGggPT0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBDTU5vZGUgZ2V0T3JpZ2luKE5vZGUgbm9kZSkKLSAgewotICAgIENNTm9kZSByZXN1bHQgPSBudWxsOwotICAgIC8vIHRvZG8uLi4gbWFrZSBzdXJlIHBhcmVudCBpcyByaWdodAotICAgIC8vCi0gICAgTm9kZSBwYXJlbnROb2RlID0gZ2V0UGFyZW50T3JPd25lck5vZGUobm9kZSk7Ci0gICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCAmJiBwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgewotICAgICAgRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gKEVsZW1lbnQpcGFyZW50Tm9kZTsKLSAgICAgIENNTm9kZVtdIGFycmF5ID0gZ2V0T3JpZ2luQXJyYXkocGFyZW50RWxlbWVudCk7Ci0gICAgICBpZiAoYXJyYXkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW50IGluZGV4ID0gZ2V0SW5kZXhPZk5vZGUocGFyZW50RWxlbWVudC5nZXRDaGlsZE5vZGVzKCksIG5vZGUpOwotICAgICAgICBpZiAoaW5kZXggPCBhcnJheS5sZW5ndGgpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBhcnJheVtpbmRleF07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBDTU5vZGVbXSBnZXRPcmlnaW5BcnJheShFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgIHJldHVybiAoZWQgIT0gbnVsbCkgPyBnZXRWYWxpZGF0b3IoKS5nZXRPcmlnaW5BcnJheShlZCwgZWxlbWVudCkgOiBudWxsOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRJbmRleE9mTm9kZShOb2RlTGlzdCBub2RlTGlzdCwgTm9kZSBub2RlKQotICB7Ci0gICAgaW50IHJlc3VsdCA9IC0xOwotICAgIGludCBzaXplID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgIGlmIChub2RlTGlzdC5pdGVtKGkpID09IG5vZGUpCi0gICAgICAgewotICAgICAgICAgcmVzdWx0ID0gaTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBDTU5vZGUgJ21ldGEgZGF0YScgdGhhdCBtYXkgYmUgcG90ZW50aWFsbHkgYWRkZWQgdG8gdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVDb250ZW50KEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmNsdWRlT3B0aW9ucykKLSAgewotICAgIEF2YWlsYWJsZUNvbnRlbnRDTVZpc2l0b3IgdmlzaXRvciA9IG5ldyBBdmFpbGFibGVDb250ZW50Q01WaXNpdG9yKGVsZW1lbnQsIGVkKTsKLSAgICBMaXN0IGxpc3QgPSB2aXNpdG9yLmNvbXB1dGVBdmFpbGFibGVDb250ZW50KGluY2x1ZGVPcHRpb25zKTsKLSAgICBpZiAoZXh0ZW5zaW9uTWFuYWdlciAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgIAotICAgICAgZXh0ZW5zaW9uTWFuYWdlci5maWx0ZXJBdmFpbGFibGVFbGVtZW50Q29udGVudChsaXN0LCBlbGVtZW50LCBlZCwgaW5jbHVkZU9wdGlvbnMpOwotICAgIH0gIAotICAgIHJldHVybiBsaXN0OwotICB9ICAKLQotCi0gIHB1YmxpYyBib29sZWFuIGNhbkluc2VydChFbGVtZW50IHBhcmVudCwgQ01Ob2RlIGNtTm9kZSwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZykKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudCk7Ci0gICAgaWYgKGVkICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gY2FuSW5zZXJ0KHBhcmVudCwgZWQsIGNtTm9kZSwgaW5kZXgsIHZhbGlkaXR5Q2hlY2tpbmcpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgYm9vbGVhbiBjYW5JbnNlcnQoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBDTU5vZGUgY21Ob2RlLCBpbnQgaW5kZXgsIGludCB2YWxpZGl0eUNoZWNraW5nKQotICB7Ci0gICAgcmV0dXJuIGNhbkluc2VydChwYXJlbnQsIGVkLCBjbU5vZGUsIGluZGV4LCB2YWxpZGl0eUNoZWNraW5nLCBudWxsKTsKLSAgfSAgICAgICAgIAotCi0gIHByb3RlY3RlZCBib29sZWFuIGNhbkluc2VydChFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIENNTm9kZSBjbU5vZGUsIGludCBpbmRleCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIE9iamVjdCByZXVzZWFibGVEYXRhKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgIHN3aXRjaCAoY21Ob2RlLmdldE5vZGVUeXBlKCkpCi0gICAgewotICAgICAgY2FzZSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OIDoKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuY29tcHV0ZU5hbWUoY21Ob2RlLCBwYXJlbnQsIG51bGwpOwotICAgICAgICByZXN1bHQgPSBwYXJlbnQuZ2V0QXR0cmlidXRlTm9kZShhdHRyaWJ1dGVOYW1lKSA9PSBudWxsOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04gOgotICAgICAgY2FzZSBDTU5vZGUuR1JPVVAgOgotICAgICAgewotICAgICAgICBpZiAodmFsaWRpdHlDaGVja2luZyA9PSBWQUxJRElUWV9TVFJJQ1QpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgLy8gY3JlYXRlIGxpc3QgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0ID0gbnVsbDsKLSAgICAgICAgICBpZiAocmV1c2VhYmxlRGF0YSAhPSBudWxsKQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QgPSAoTGlzdClyZXVzZWFibGVEYXRhOwotICAgICAgICAgIH0gICAgCi0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QgPSBnZXRWYWxpZGF0b3IoKS5jcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QocGFyZW50LCBlZCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJlc3VsdCA9IGdldFZhbGlkYXRvcigpLmNhbkluc2VydChlZCwgY29udGVudFNwZWNpZmljYXRpb25MaXN0LCBpbmRleCwgY21Ob2RlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ01Ob2RlLkRBVEFfVFlQRSA6Ci0gICAgICB7Ci0gICAgICAgIGludCBjb250ZW50VHlwZSA9IGVkLmdldENvbnRlbnRUeXBlKCk7Ci0gICAgICAgIHJlc3VsdCA9IChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCB8fAotICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBIHx8Ci0gICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGRlZmF1bHQgOgotICAgICAgewotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBjYW5JbnNlcnQoRWxlbWVudCBwYXJlbnQsIExpc3QgY21Ob2RlTGlzdCwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZykKLSAgewotICAgIC8vIHRvZG8KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0KLSAgcHVibGljIGJvb2xlYW4gY2FuUmVtb3ZlKE5vZGUgbm9kZSwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7ICAgICAgCi0gICAgaWYgKHZhbGlkaXR5Q2hlY2tpbmcgPT0gVkFMSURJVFlfU1RSSUNUKQotICAgIHsKLSAgICAgIGludCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLSAgICAgIHN3aXRjaCAobm9kZVR5cGUpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERToKLSAgICAgICAgewotICAgICAgICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQgPSBnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKChBdHRyKW5vZGUpOwotICAgICAgICAgIGlmIChhZCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IChhZC5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOgotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBwYXJlbnROb2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgaWYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBFbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudClwYXJlbnROb2RlOwotICAgICAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnRFbGVtZW50KTsKLSAgICAgICAgICAgIGlmIChlZCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCA9IGdldFZhbGlkYXRvcigpLmNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChwYXJlbnRFbGVtZW50LCBlZCk7Ci0gICAgICAgICAgICAgIGludCBpbmRleCA9IGdldEluZGV4T2ZOb2RlKHBhcmVudEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpLCBub2RlKTsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0VmFsaWRhdG9yKCkuY2FuUmVtb3ZlKGVkLCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QsIGluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIGJvb2xlYW4gY2FuUmVtb3ZlKExpc3Qgbm9kZUxpc3QsIGludCB2YWxpZGl0eUNoZWNraW5nKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCi0gICAgaWYgKHZhbGlkaXR5Q2hlY2tpbmcgPT0gVkFMSURJVFlfU1RSSUNUKQotICAgIHsKLSAgICAgIEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IG51bGw7Ci0gICAgICBMaXN0IGNoaWxkTGlzdCA9IG51bGw7Ci0KLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5vZGVMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKWkubmV4dCgpOwotCi0gICAgICAgIGlmIChwYXJlbnRFbGVtZW50ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBwYXJlbnRFbGVtZW50ID0gZ2V0UGFyZW50T3JPd25lckVsZW1lbnQobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFyZW50RWxlbWVudCAhPSBnZXRQYXJlbnRPck93bmVyRWxlbWVudChub2RlKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgcGFyZW50IGFyZSB0aGUgc2FtZQotICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0gICAgICAgIGlmIChub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFjYW5SZW1vdmUobm9kZSwgdmFsaWRpdHlDaGVja2luZykpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGNoaWxkTGlzdCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNoaWxkTGlzdCA9IG5vZGVMaXN0VG9MaXN0KHBhcmVudEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2hpbGRMaXN0LnJlbW92ZShub2RlKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAocmVzdWx0ICYmIGNoaWxkTGlzdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudEVsZW1lbnQpOwotICAgICAgICBpZiAoZWQgIT0gbnVsbCkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QgPSBnZXRWYWxpZGF0b3IoKS5jcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QoY2hpbGRMaXN0LCBlZCk7Ci0gICAgICAgICAgcmVzdWx0ID0gZ2V0VmFsaWRhdG9yKCkuaXNWYWxpZChlZCwgY29udGVudFNwZWNpZmljYXRpb25MaXN0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBjYW5SZXBsYWNlKEVsZW1lbnQgcGFyZW50LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBDTU5vZGUgY21Ob2RlLCBpbnQgdmFsaWRpdHlDaGVja2luZykKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gY2FuUmVwbGFjZShFbGVtZW50IHBhcmVudCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCwgTGlzdCBjbU5vZGVMaXN0LCBpbnQgdmFsaWRpdHlDaGVja2luZykKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9ICAgICAKLSAgIAotICAvKioKLSAgICogVGhpcyBtZXRob2QgaXMgZXhwZXJpbWVudGFsLi4uIHVzZSBhdCB5b3VyIG93biByaXNrCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBjYW5XcmFwKEVsZW1lbnQgY2hpbGRFbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiB3cmFwRWxlbWVudCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7ICAKLSAgICBOb2RlIHBhcmVudE5vZGUgPSBjaGlsZEVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOyAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgIHsgICAgICAgICAgIAotICAgICAgRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gKEVsZW1lbnQpcGFyZW50Tm9kZTsgICAgICAKLSAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50RWxlbWVudCk7Ci0gICAgICBpZiAocGFyZW50RWQgIT0gbnVsbCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAodmFsaWRpdHlDaGVja2luZyA9PSBWQUxJRElUWV9TVFJJQ1QpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgaW5kZXggPSBnZXRJbmRleE9mTm9kZShwYXJlbnRFbGVtZW50LmdldENoaWxkTm9kZXMoKSwgY2hpbGRFbGVtZW50KTsKLQotICAgICAgICAgIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0ID0gZ2V0VmFsaWRhdG9yKCkuY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KHBhcmVudEVsZW1lbnQsIHBhcmVudEVkKTsKLSAgICAgICAgICBMaXN0IHN1Ykxpc3QgPSBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3Quc3ViTGlzdChpbmRleCwgaW5kZXggKyAxKTsKLSAgICAgICAgICByZXN1bHQgPSBnZXRWYWxpZGF0b3IoKS5jYW5SZXBsYWNlKHBhcmVudEVkLCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QsIGluZGV4LCBpbmRleCwgd3JhcEVsZW1lbnQpOwotICAgICAgICAgIGlmIChyZXN1bHQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gZ2V0VmFsaWRhdG9yKCkuaXNWYWxpZCh3cmFwRWxlbWVudCwgc3ViTGlzdCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9ICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZXRJbnNlcnRBY3Rpb25zKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluZGV4LCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICBtb2RlbFF1ZXJ5QWN0aW9uSGVscGVyLmdldEluc2VydEFjdGlvbnMocGFyZW50LCBlZCwgaW5kZXgsIGluY2x1ZGVPcHRpb25zLCB2YWxpZGl0eUNoZWNraW5nLCBhY3Rpb25MaXN0KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdldEluc2VydEFjdGlvbnMoRG9jdW1lbnQgcGFyZW50LCBDTURvY3VtZW50IGNtRG9jdW1lbnQsIGludCBpbmRleCwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gICAgbW9kZWxRdWVyeUFjdGlvbkhlbHBlci5nZXRJbnNlcnRBY3Rpb25zKHBhcmVudCwgY21Eb2N1bWVudCwgaW5kZXgsIGluY2x1ZGVPcHRpb25zLCB2YWxpZGl0eUNoZWNraW5nLCBhY3Rpb25MaXN0KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdldFJlcGxhY2VBY3Rpb25zKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gICAgbW9kZWxRdWVyeUFjdGlvbkhlbHBlci5nZXRSZXBsYWNlQWN0aW9ucyhwYXJlbnQsIGVkLCBpbmNsdWRlT3B0aW9ucywgdmFsaWRpdHlDaGVja2luZywgYWN0aW9uTGlzdCk7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBnZXRSZXBsYWNlQWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3Qgc2VsZWN0ZWRDaGlsZHJlbiwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gICAgbW9kZWxRdWVyeUFjdGlvbkhlbHBlci5nZXRSZXBsYWNlQWN0aW9ucyhwYXJlbnQsIGVkLCBzZWxlY3RlZENoaWxkcmVuLCBpbmNsdWRlT3B0aW9ucywgdmFsaWRpdHlDaGVja2luZywgYWN0aW9uTGlzdCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZXRJbnNlcnRDaGlsZE5vZGVBY3Rpb25UYWJsZShFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCB2YWxpZGl0eUNoZWNraW5nLCBIYXNodGFibGUgYWN0aW9uVGFibGUpCi0gIHsKLSAgICBtb2RlbFF1ZXJ5QWN0aW9uSGVscGVyLmdldEluc2VydENoaWxkTm9kZUFjdGlvblRhYmxlKHBhcmVudCwgZWQsIHZhbGlkaXR5Q2hlY2tpbmcsIGFjdGlvblRhYmxlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdldEFjdGlvblRhYmxlKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZywgSGFzaHRhYmxlIGFjdGlvblRhYmxlKQotICB7Ci0gICAgLy9tb2RlbFF1ZXJ5QWN0aW9uSGVscGVyLmdldEFsbEFjdGlvbnMocGFyZW50LCBlZCwgdmFsaWRpdHlDaGVja2luZywgYWN0aW9uTGlzdCk7Ci0gIH0KLQotCi0gIC8vIHNvbWUgaGVscGVyIG1ldGhvZHMKLSAgLy8KLSAgcHJvdGVjdGVkIE5vZGUgZ2V0UGFyZW50T3JPd25lck5vZGUoTm9kZSBub2RlKQotICB7Ci0gICAgcmV0dXJuIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgPwotICAgICAgICAgICAoKEF0dHIpbm9kZSkuZ2V0T3duZXJFbGVtZW50KCkgOgotICAgICAgICAgICBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBFbGVtZW50IGdldFBhcmVudE9yT3duZXJFbGVtZW50KE5vZGUgbm9kZSkKLSAgewotICAgIE5vZGUgcGFyZW50ID0gZ2V0UGFyZW50T3JPd25lck5vZGUobm9kZSk7Ci0gICAgcmV0dXJuIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgPyAoRWxlbWVudClwYXJlbnQgOiBudWxsOwotICB9Ci0gICAgICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgTGlzdCBub2RlTGlzdFRvTGlzdChOb2RlTGlzdCBub2RlTGlzdCkKLSAgewotICAgIGludCBzaXplID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKHNpemUpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHYuYWRkKG5vZGVMaXN0Lml0ZW0oaSkpOwotICAgIH0KLSAgICByZXR1cm4gdjsKLSAgfSAgIAotICAgCi0gIC8qKgotICBwcm90ZWN0ZWQgTGlzdCBnZXRDTU5vZGVMaXN0KE5vZGVMaXN0IG5vZGVMaXN0KQotICB7Ci0gICAgaW50IHNpemUgPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3Ioc2l6ZSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgdi5hZGQoZ2V0Q01Ob2RlKG5vZGVMaXN0Lml0ZW0oaSkpOwotICAgIH0KLSAgICByZXR1cm4gdjsKLSAgfQotICAqLyAgCi0KLSAgcHVibGljIGNsYXNzIEF2YWlsYWJsZUNvbnRlbnRDTVZpc2l0b3IgZXh0ZW5kcyBDTVZpc2l0b3IKLSAgewotICAgIHB1YmxpYyBIYXNodGFibGUgY2hpbGROb2RlVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgcHVibGljIEhhc2h0YWJsZSBhdHRyaWJ1dGVUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBwdWJsaWMgRWxlbWVudCByb290RWxlbWVudDsKLSAgICBwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gcm9vdEVsZW1lbnREZWNsYXJhdGlvbjsgCi0gICAgcHVibGljIGJvb2xlYW4gaXNSb290VmlzaXRlZDsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbmNsdWRlU2VxdWVuY2VHcm91cHM7Ci0KLSAgICBwdWJsaWMgQXZhaWxhYmxlQ29udGVudENNVmlzaXRvcihFbGVtZW50IHJvb3RFbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiByb290RWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB0aGlzLnJvb3RFbGVtZW50ID0gcm9vdEVsZW1lbnQ7Ci0gICAgICB0aGlzLnJvb3RFbGVtZW50RGVjbGFyYXRpb24gPSByb290RWxlbWVudERlY2xhcmF0aW9uOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5KENNTm9kZSBjbU5vZGUpCi0gICAgewotICAgICAgU3RyaW5nIGtleSA9IGNtTm9kZS5nZXROb2RlTmFtZSgpOwotICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpY21Ob2RlLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gKFN0cmluZyljbURvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIik7ICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKQotICAgICAgICB7ICAgCi0gICAgICAgICAga2V5ID0gIlsiICsgbmFtZXNwYWNlVVJJICsgIl0iICsga2V5OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVG9UYWJsZShIYXNodGFibGUgdGFibGUsIENNTm9kZSBjbU5vZGUpCi0gICAgewotICAgICAgU3RyaW5nIG5vZGVOYW1lID0gY21Ob2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgICBpZiAobm9kZU5hbWUgIT0gbnVsbCAmJiBub2RlTmFtZS5sZW5ndGgoKSA+IDApCi0gICAgICB7ICAKLSAgICAgICAgdGFibGUucHV0KGdldEtleShjbU5vZGUpLCBjbU5vZGUpOwotICAgICAgfSAgCi0gICAgfQotCi0gICAgcHVibGljIExpc3QgY29tcHV0ZUF2YWlsYWJsZUNvbnRlbnQoaW50IGluY2x1ZGVPcHRpb25zKQotICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsgIAotCi0gICAgICBpbnQgY29udGVudFR5cGUgPSByb290RWxlbWVudERlY2xhcmF0aW9uLmdldENvbnRlbnRUeXBlKCk7Ci0gICAgICBpbmNsdWRlU2VxdWVuY2VHcm91cHMgPSAoKGluY2x1ZGVPcHRpb25zICYgSU5DTFVERV9TRVFVRU5DRV9HUk9VUFMpICE9IDApOwotICAgICAgdmlzaXRDTU5vZGUocm9vdEVsZW1lbnREZWNsYXJhdGlvbik7Ci0gICAgICAKLSAgICAgIGlmICgoaW5jbHVkZU9wdGlvbnMgJiBJTkNMVURFX0FUVFJJQlVURVMpICE9IDApCi0gICAgICB7Ci0gICAgICAgIHYuYWRkQWxsKGF0dHJpYnV0ZVRhYmxlLnZhbHVlcygpKTsKLSAgICAgICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBuaWxsYWJsZUF0dHJpYnV0ZSA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKXJvb3RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9uaWxsYWJsZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChuaWxsYWJsZUF0dHJpYnV0ZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdi5hZGQobmlsbGFibGVBdHRyaWJ1dGUpOwotICAgICAgICB9Ci0gICAgICB9ICAKLQotICAgICAgaWYgKChpbmNsdWRlT3B0aW9ucyAmIElOQ0xVREVfQ0hJTERfTk9ERVMpICE9IDApCi0gICAgICB7ICAgICAgCi0gICAgICAgIGlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCB8fAotICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCkKLSAgICAgICAgewotICAgICAgICAgIHYuYWRkQWxsKGNoaWxkTm9kZVRhYmxlLnZhbHVlcygpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlkpCi0gICAgICAgIHsgICAgICAKLSAgICAgICAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSAgKENNRG9jdW1lbnQpcm9vdEVsZW1lbnREZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDTU5hbWVkTm9kZU1hcCBlbGVtZW50cyA9IGNtRG9jdW1lbnQuZ2V0RWxlbWVudHMoKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHYuYWRkKGkubmV4dCgpKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICAgICAgIAotICAgICAgICBpZiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQgfHwKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQSB8fCAKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkFOWSkKLSAgICAgICAgewotICAgICAgICAgIENNRGF0YVR5cGUgZGF0YVR5cGUgPSByb290RWxlbWVudERlY2xhcmF0aW9uLmdldERhdGFUeXBlKCk7Ci0gICAgICAgICAgaWYgKGRhdGFUeXBlICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdi5hZGQoZGF0YVR5cGUpOwotICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHY7Ci0gICAgfSAgIAotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUFueUVsZW1lbnQoQ01BbnlFbGVtZW50IGFueUVsZW1lbnQpCi0gICAgeyAgICAgICAgICAgIAotICAgICAgU3RyaW5nIHVyaSA9IGFueUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IGdldENNRG9jdW1lbnRMaXN0KHJvb3RFbGVtZW50LCByb290RWxlbWVudERlY2xhcmF0aW9uLCB1cmkpOwotICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIENNRG9jdW1lbnQgY21kb2N1bWVudCA9IChDTURvY3VtZW50KWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgaWYgKGNtZG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgQ01OYW1lZE5vZGVNYXAgbWFwID0gY21kb2N1bWVudC5nZXRFbGVtZW50cygpOwotICAgICAgICAgIGludCBzaXplID0gbWFwLmdldExlbmd0aCgpOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgQ01Ob2RlIGVkID0gbWFwLml0ZW0oaSk7ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBhZGRUb1RhYmxlKGNoaWxkTm9kZVRhYmxlLGVkKTsKLSAgICAgICAgICB9ICAgICAgICAKLSAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdENNQXR0cmlidXRlRGVjbGFyYXRpb24oQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkKLSAgICB7Ci0gICAgICBzdXBlci52aXNpdENNQXR0cmlidXRlRGVjbGFyYXRpb24oYWQpOwotICAgICAgYXR0cmlidXRlVGFibGUucHV0KGFkLmdldE5vZGVOYW1lKCksIGFkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICAgIHsKLSAgICAgIGlmIChlZCA9PSByb290RWxlbWVudERlY2xhcmF0aW9uICYmICFpc1Jvb3RWaXNpdGVkKQotICAgICAgewotICAgICAgICBpc1Jvb3RWaXNpdGVkID0gdHJ1ZTsKLSAgICAgICAgc3VwZXIudmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihlZCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoIUJvb2xlYW4uVFJVRS5lcXVhbHMoZWQuZ2V0UHJvcGVydHkoIkFic3RyYWN0IikpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICBhZGRUb1RhYmxlKGNoaWxkTm9kZVRhYmxlLGVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIENNTm9kZUxpc3Qgc3Vic3RpdHV0aW9uR3JvdXAgPSAoQ01Ob2RlTGlzdCllZC5nZXRQcm9wZXJ0eSgiU3Vic3RpdHV0aW9uR3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoc3Vic3RpdHV0aW9uR3JvdXAgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGhhbmRsZVN1YnN0aXR1dGlvbkdyb3VwKHN1YnN0aXR1dGlvbkdyb3VwKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTdWJzdGl0dXRpb25Hcm91cChDTU5vZGVMaXN0IHN1YnN0aXR1dGlvbkdyb3VwKQotICAgIHsKLSAgICAgIGludCBzdWJzdGl0dXRpb25Hcm91cExlbmd0aCA9IHN1YnN0aXR1dGlvbkdyb3VwLmdldExlbmd0aCgpOwotICAgICAgaWYgKHN1YnN0aXR1dGlvbkdyb3VwTGVuZ3RoID4gMSkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJzdGl0dXRpb25Hcm91cExlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgQ01Ob2RlIGVkID0gc3Vic3RpdHV0aW9uR3JvdXAuaXRlbShpKTsKLSAgICAgICAgICBpZiAoIUJvb2xlYW4uVFJVRS5lcXVhbHMoZWQuZ2V0UHJvcGVydHkoIkFic3RyYWN0IikpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgewotICAgICAgICAgICAgYWRkVG9UYWJsZShjaGlsZE5vZGVUYWJsZSxlZCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUdyb3VwKENNR3JvdXAgZ3JvdXApCi0gICAgewotICAgICAgaWYgKGluY2x1ZGVTZXF1ZW5jZUdyb3VwcykKLSAgICAgIHsKLSAgICAgICAgaWYgKGdyb3VwLmdldE9wZXJhdG9yKCkgPT0gQ01Hcm91cC5TRVFVRU5DRSAmJgotICAgICAgICAgICAgZ3JvdXAuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpID4gMSAmJgotICAgICAgICAgICAgaW5jbHVkZXNSZXF1aXJlZENvbnRlbnQoZ3JvdXApKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIGNoaWxkTm9kZVRhYmxlLnB1dChncm91cCwgZ3JvdXApOwotICAgICAgICB9Ci0gICAgICB9ICAKLSAgICAgIHN1cGVyLnZpc2l0Q01Hcm91cChncm91cCk7Ci0gICAgfSAgIAotCi0gICAgcHVibGljIGJvb2xlYW4gaW5jbHVkZXNSZXF1aXJlZENvbnRlbnQoQ01Hcm91cCBncm91cCkKLSAgICB7Ci0gICAgICBMaXN0IGxpc3QgPSBnZXRWYWxpZGF0b3IoKS5jcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QoZ3JvdXApOwotICAgICAgcmV0dXJuIGxpc3Quc2l6ZSgpID4gMTsKLSAgICB9Ci0gIH0gICAgCi0KLSAKLSAgLyoqCi0gICAqIEBkZXByZWN0ZWQgLSB1c2UgZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcygpCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXREYXRhVHlwZVZhbHVlcyhFbGVtZW50IGVsZW1lbnQsIENNTm9kZSBjbU5vZGUpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBBcnJheXMuYXNMaXN0KGdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMoZWxlbWVudCwgY21Ob2RlKSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZHMgcmV0dXJuIGFuIGFycmF5IG9mIHBvc3NpYmxlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBkYXRhdHlwZSBvZiB0aGUgQ01Ob2RlIChlaXRoZXIgYW4gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBvciBhIENNRWxlbWVudERlY2xhcmF0aW9uKQotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMoRWxlbWVudCBlbGVtZW50LCBDTU5vZGUgY21Ob2RlKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAoY21Ob2RlICE9IG51bGwpCi0gICAgeyAgICAgICAKLSAgICAgIENNRGF0YVR5cGUgZGF0YVR5cGUgPSBudWxsOwotICAgICAgaWYgKGNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pCi0gICAgICB7Ci0gICAgICAgIGRhdGFUeXBlID0gKChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKWNtTm9kZSkuZ2V0QXR0clR5cGUoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotICAgICAgewotICAgICAgICBkYXRhVHlwZSA9ICgoQ01FbGVtZW50RGVjbGFyYXRpb24pY21Ob2RlKS5nZXREYXRhVHlwZSgpOwotICAgICAgfSAgICAgICAgIAotICAgICAKLSAgICAgIFN0cmluZ1tdIGVudW1lcmF0ZWRWYWx1ZXMgPSBkYXRhVHlwZSAhPSBudWxsID8gZGF0YVR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpIDogbnVsbDsgICAgICAKLSAgICAgIGlmIChlbnVtZXJhdGVkVmFsdWVzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bWVyYXRlZFZhbHVlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGVudW1lcmF0ZWRWYWx1ZXNbaV0pOwotICAgICAgICB9IAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBhZGRWYWx1ZXNGb3JYU0lUeXBlKGVsZW1lbnQsIGNtTm9kZSwgbGlzdCk7Ci0gICAgCi0gICAgaWYgKGV4dGVuc2lvbk1hbmFnZXIgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGxpc3QuYWRkQWxsKGV4dGVuc2lvbk1hbmFnZXIuZ2V0RGF0YVR5cGVWYWx1ZXMoZWxlbWVudCwgY21Ob2RlKSk7Ci0gICAgfSAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGludCBsaXN0U2l6ZSA9IGxpc3Quc2l6ZSgpOwotICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbbGlzdFNpemVdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFNpemU7IGkrKykKLSAgICB7Ci0gICAgICByZXN1bHRbaV0gPSAoU3RyaW5nKWxpc3QuZ2V0KGkpOwotICAgIH0gICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgCi0KLSAgICAgICAgICAgCi0gIHByb3RlY3RlZCB2b2lkIGFkZFZhbHVlc0ZvclhTSVR5cGUoRWxlbWVudCBlbGVtZW50LCBDTU5vZGUgY21Ob2RlLCBMaXN0IGxpc3QpCi0gIHsgICAgICAgICAgICAgICAKLSAgICBpZiAoY21Ob2RlICE9IG51bGwgJiYgY21Ob2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiljbU5vZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpZiAodmFsdWVIZWxwZXIuaXNYU0lUeXBlKGFkKSkKLSAgICAgIHsgICAgICAgICAgICAgCi0gICAgICAgIE5hbWVzcGFjZVRhYmxlIHRhYmxlID0gbmV3IE5hbWVzcGFjZVRhYmxlKGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgICAgICAgdGFibGUuYWRkRWxlbWVudExpbmVhZ2UoZWxlbWVudCk7Ci0gICAgICAgIGxpc3QuYWRkQWxsKHZhbHVlSGVscGVyLmdldFF1YWxpZmllZFhTSVR5cGVzKGFkLCB0YWJsZSkpOyAgICAgCi0gICAgICB9Ci0gICAgfQotICB9Ci0gICAgCi0KLSAgcHVibGljIE1vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VyIGdldEV4dGVuc2lvbk1hbmFnZXIoKQotICB7Ci0gICAgcmV0dXJuIGV4dGVuc2lvbk1hbmFnZXI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9TaW1wbGVBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTUyNDJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9TaW1wbGVBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5Q01Qcm92aWRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlciBleHRlbmRzIEJhc2VBc3NvY2lhdGlvblByb3ZpZGVyCi17Ci0gIHByb3RlY3RlZCBNb2RlbFF1ZXJ5Q01Qcm92aWRlciBtb2RlbFF1ZXJ5Q01Qcm92aWRlcjsKLSAgICAgICAgICAKLSAgcHVibGljIFNpbXBsZUFzc29jaWF0aW9uUHJvdmlkZXIoTW9kZWxRdWVyeUNNUHJvdmlkZXIgbW9kZWxRdWVyeUNNUHJvdmlkZXIpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5tb2RlbFF1ZXJ5Q01Qcm92aWRlciA9IG1vZGVsUXVlcnlDTVByb3ZpZGVyOwotICB9Ci0KLSAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoTm9kZSBub2RlKQotICB7Ci0gICAgcmV0dXJuIG1vZGVsUXVlcnlDTVByb3ZpZGVyLmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KG5vZGUpOwotICB9Ci0gIAotICBwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgQ01FbGVtZW50RGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChlbGVtZW50KTsKLSAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgIHsgICAgICAgIAotICAgICAgcmVzdWx0ID0gKENNRWxlbWVudERlY2xhcmF0aW9uKWNtRG9jdW1lbnQuZ2V0RWxlbWVudHMoKS5nZXROYW1lZEl0ZW0oZWxlbWVudC5nZXROb2RlTmFtZSgpKTsgICAgCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9YTUxBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvWE1MQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTIwYmU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9YTUxBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlVGFibGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFhNTEFzc29jaWF0aW9uUHJvdmlkZXIgZXh0ZW5kcyBCYXNlQXNzb2NpYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIENNRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlcgoteyAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBDTURvY3VtZW50Q2FjaGUgY21Eb2N1bWVudENhY2hlOyAKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnRNYW5hZ2VySW1wbCBkb2N1bWVudE1hbmFnZXI7Ci0KLSAgcHVibGljIFhNTEFzc29jaWF0aW9uUHJvdmlkZXIoQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZSkKLSAgewotICAgIHRoaXMuY21Eb2N1bWVudENhY2hlID0gY21Eb2N1bWVudENhY2hlOyAKLSAgICBkb2N1bWVudE1hbmFnZXIgPSBuZXcgQ01Eb2N1bWVudE1hbmFnZXJJbXBsKGNtRG9jdW1lbnRDYWNoZSwgdGhpcyk7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgQ01Eb2N1bWVudE1hbmFnZXIgZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKQotICB7Ci0gICAgcmV0dXJuIGRvY3VtZW50TWFuYWdlcjsKLSAgfQotIAotICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RG9jdHlwZUluZm8oRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsgICAKLSAgICBTdHJpbmdbXSByZXN1bHQgPSBudWxsOwotICAgIERvY3VtZW50VHlwZSBkb2N0eXBlID0gZG9jdW1lbnQuZ2V0RG9jdHlwZSgpOwotCi0gICAgLy8gZGVmZWN0IDIwNjgzMyAuLi4gaGVyZSB3ZSB0ZXN0IGZvciBEVERzIHRoYXQgYXJlIGRlY2xhcmVkIGlubGluZQotICAgIC8vIHNpbmNlIHdlIGN1cnJlbnRseSBoYXZlIG5vIHdheSBvZiBtYWtpbmcgdXNlIG9mIGlubGluZSBEVERzIHdlIGluZ29yZSB0aGVtCi0gICAgLy8gc28gdGhhdCB0aGUgaW1wbGljdCBEVEQgKGlmIGFueSkgY2FuIGJlIHVzZWQKLSAgICBpZiAoZG9jdHlwZSAhPSBudWxsICYmIChkb2N0eXBlLmdldFB1YmxpY0lkKCkgIT0gbnVsbCB8fCBkb2N0eXBlLmdldFN5c3RlbUlkKCkgIT0gbnVsbCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gbmV3IFN0cmluZ1syXTsKLSAgICAgIHJlc3VsdFswXSA9IGRvY3R5cGUuZ2V0UHVibGljSWQoKTsKLSAgICAgIHJlc3VsdFsxXSA9IGRvY3R5cGUuZ2V0U3lzdGVtSWQoKTsKLSAgICB9ICAgCi0gICAgZWxzZSBpZiAoZ2V0SW1wbGljdERvY3R5cGUoZG9jdW1lbnQpICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0SW1wbGljdERvY3R5cGUoZG9jdW1lbnQpOwotICAgIH0gICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgCi0KLQotICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdIGdldEltcGxpY3REb2N0eXBlKERvY3VtZW50IGRvY3VtZW50KQotICB7IAotICAgIFN0cmluZ1tdIHJlc3VsdCA9IG51bGw7Ci0gICAgLyoKLSAgICBET01FeHRlbnNpb24gZG9tRXh0ZW5zaW9uID0gRE9NRXh0ZW5zaW9uUHJvdmlkZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldERPTUV4dGVuc2lvbihkb2N1bWVudCk7Ci0gICAgaWYgKGRvbUV4dGVuc2lvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGRvbUV4dGVuc2lvbi5nZXRJbXBsaWNpdERvY3R5cGUoKTsKLSAgICB9Ki8KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoTm9kZSBub2RlKQotICB7ICAgICAgICAKLSAgICByZXR1cm4gZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQobm9kZSwgdHJ1ZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudCBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlIG5vZGUsIGJvb2xlYW4gZ2V0RG9jdW1lbnRGcm9tQ01Ob2RlKQotICB7ICAgICAgICAgICAgCi0gICAgQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSA/IChEb2N1bWVudClub2RlIDogbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAKLSAgICAgIFN0cmluZ1tdIGRvY3R5cGVJbmZvID0gZ2V0RG9jdHlwZUluZm8oZG9jdW1lbnQpOwotCi0gICAgICBpZiAoZG9jdHlwZUluZm8gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0Q01Eb2N1bWVudChkb2N0eXBlSW5mb1swXSwgZG9jdHlwZUluZm9bMV0sICJEVEQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgLy8gZGVmZWN0IDIxMTIzNiAuLi4gaW4gc29tZSBjYXNlcyBjYWxsaW5nIHRoaXMgbWV0aG9kIGNhbiByZXN1bHQgaW4gYSBjeWNsZQotICAgICAgLy8gd2UgdXNlIHRoZSBnZXREb2N1bWVudEZyb21DTU5vZGUgYXMgYSBmbGFnIHRvIGF2b2lkIHRoaXMgCi0gICAgICAvLyBUT0RPLi4uIHNlZSBpZiB0aGVyZSBpcyBhIHdheSB0byByZS1vcmdhbml6ZSB0byBhdm9pZCB0aGUgbmVlZCBmb3IgdGhpcyBmbGFnCi0gICAgICBlbHNlIGlmIChnZXREb2N1bWVudEZyb21DTU5vZGUpCi0gICAgICB7Ci0gICAgICAgIENNTm9kZSBjbU5vZGUgPSBnZXRDTU5vZGUobm9kZSk7Ci0gICAgICAgIGlmIChjbU5vZGUgIT0gbnVsbCkgICAgICAgCi0gICAgICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgLy8gdG9kby4uLiBhZGQgYSBnZXRDTURvY3VtZW50KCkgbWV0aG9kcyB0byBDTU5vZGUKLSAgICAgICAgICAvLyBmb3Igbm93IHVzZSB0aGUgZ2V0UHJvcGVydHkgaW50ZXJmYWNlCi0gICAgICAgICAgcmVzdWx0ID0gKENNRG9jdW1lbnQpY21Ob2RlLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXhjZXB0aW9uIGxvY2F0aW5nIENNRG9jdW1lbnQgZm9yICIgKyBub2RlLCBlKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotCi0gICAgICAKLSAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB1cmkpCi0gIHsKLSAgICBDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgTmFtZXNwYWNlVGFibGUgbmFtZXNwYWNlVGFibGUgPSBuZXcgTmFtZXNwYWNlVGFibGUoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnRMaW5lYWdlKGVsZW1lbnQpOwotICAgIE5hbWVzcGFjZUluZm8gbmFtZXNwYWNlSW5mbyA9IG5hbWVzcGFjZVRhYmxlLmdldE5hbWVzcGFjZUluZm9Gb3JVUkkodXJpKTsKLSAgICBpZiAobmFtZXNwYWNlSW5mbyAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldENNRG9jdW1lbnQobmFtZXNwYWNlSW5mby51cmksIG5hbWVzcGFjZUluZm8ubG9jYXRpb25IaW50LCAiWFNEIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgICAgIAotICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIFN0cmluZyB0eXBlKQotICB7ICAgICAgICAgICAgICAgICAgIAotICAgIC8vU3RyaW5nIHJlc29sdmVkR3JhbW1hclVSSSA9IHJlc29sdmVHcmFtbWFyVVJJKGRvY3VtZW50LCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgIHJldHVybiBkb2N1bWVudE1hbmFnZXIuZ2V0Q01Eb2N1bWVudChwdWJsaWNJZCwgc3lzdGVtSWQsIHR5cGUpOyAgCi0gIH0KLQotICAvL3B1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICAvL3sgICAgICAgICAgICAgICAgICAgCi0gIC8vICAvL1N0cmluZyByZXNvbHZlZEdyYW1tYXJVUkkgPSByZXNvbHZlR3JhbW1hclVSSShkb2N1bWVudCwgcHVibGljSWQsIHN5c3RlbUlkKTsKLSAgLy8gIHJldHVybiBkb2N1bWVudE1hbmFnZXIuZ2V0Q01Eb2N1bWVudChwdWJsaWNJZCwgc3lzdGVtSWQpOyAgCi0gIC8vfQotICAgCi0gIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZUdyYW1tYXJVUkkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICByZXR1cm4gcmVzb2x2ZUdyYW1tYXJVUkkobnVsbCwgcHVibGljSWQsIHN5c3RlbUlkKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBzcGVjaWFsaXplZCBpbiBvcmRlciB0byBpbXBsZW1lbnQgc3BlY2lhbGl6ZWQgdXJpIHJlc29sdXRpb24KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZUdyYW1tYXJVUkkoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0gICAgcmV0dXJuIHN5c3RlbUlkOwotICB9Ci0gIAotCi0gIHB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpCi0gIHsgCi0gICAgQ01FbGVtZW50RGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsgCi0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICBTdHJpbmdbXSBkb2N0eXBlSW5mbyA9IGdldERvY3R5cGVJbmZvKGRvY3VtZW50KTsKLSAgICBpZiAoZG9jdHlwZUluZm8gIT0gbnVsbCkKLSAgICB7ICAgCi0gICAgICAvLyB3ZSBoYXZlIGRldGVjdGVkIGRvY3R5cGUgaW5mb3JtYXRpb24gc28gd2UgYXNzdW1lIHRoYXQgd2UgY2FuIGxvY2F0ZSB0aGUgQ01FbGVtZW50RGVjbGFyYXRpb24gCi0gICAgICAvLyBpbiB0aGUgQ01Eb2N1bWVudCdzIHRhYmxlIG9mIGdsb2JhbCBlbGVtZW50cyAKLSAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KGVsZW1lbnQsIGZhbHNlKTsKLQotICAgICAgLy8gVE9ETy4uLiBjb25zaWRlciByZXBsYWNpbmcgYWJvdmUgd2l0aCAKLSAgICAgIC8vIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENNRG9jdW1lbnQoZG9jdW1lbnQsIGRvY3R5cGVJbmZvWzBdLCBkb2N0eXBlSW5mb1sxXSk7Ci0KLSAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gKENNRWxlbWVudERlY2xhcmF0aW9uKWNtRG9jdW1lbnQuZ2V0RWxlbWVudHMoKS5nZXROYW1lZEl0ZW0oZWxlbWVudC5nZXROb2RlTmFtZSgpKTsgICAgCi0gICAgICAgICAgICAgICAgIAotICAgICAgICAvLyB0aGlzIGlzIGEgaGFjayB0byBnZXQgb3VyIHhzbCBjb2RlIGFzc2lzdCB3b3JraW5nLi4uIHdlIG1pZ2h0IHdhbnQgdG8gaGFuZGxlIHNpbWlsYXIKLSAgICAgICAgLy8gZ3JhbW1hciBiZWhhdmlvdXIgdmlhIHNvbWUgZXN0YWJsaXNoZWQgbW9kZWwgcXVlcnkgc2V0dGluZyAKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsICYmIGdldEltcGxpY3REb2N0eXBlKGRvY3VtZW50KSAhPSBudWxsKQotICAgICAgICB7ICAgICAgICAgCi0gICAgICAgICAgTm9kZSBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpcGFyZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgIAotICAgIGVsc2UKLSAgICB7ICAKLSAgICAgIC8vIGhlcmUgd2UgdXNlIGEgbmFtZXNwYWNlVGFibGUgdG8gY29uc2lkZXIgaWYgdGhlIHJvb3QgZWxlbWVudCBoYXMgYW55IG5hbWVzcGFjZSBpbmZvcm1hdGlvbgotICAgICAgLy8KLSAgICAgIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlID0gbmV3IE5hbWVzcGFjZVRhYmxlKGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgICAgIExpc3QgbGlzdCA9IE5hbWVzcGFjZVRhYmxlLmdldEVsZW1lbnRMaW5lYWdlKGVsZW1lbnQpOwotICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IChFbGVtZW50KWxpc3QuZ2V0KDApOwotICAgICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudChyb290RWxlbWVudCk7Ci0gICAgICAgICAKLSAgICAgIGlmIChuYW1lc3BhY2VUYWJsZS5pc05hbWVzcGFjZUVuY291bnRlcmVkKCkpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gd2UgYXNzdW1lIHRoYXQgdGhpcyBpcyBhbiBYTUxTY2hlbWEgc3R5bGUgbmFtZXNwYWNlIGF3YXJlIGRvY3VtZW50Ci0gICAgICAgIHJlc3VsdCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQsIGxpc3QsIG5hbWVzcGFjZVRhYmxlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgCi0gICAgICAgIC8vIHdlIGFzc3VtZSB0aGF0IHRoaXMgaXMgYW4gaW5mZXJyZWQgQ01Eb2N1bWVudCBmb3IgYSBEVEQgc3R5bGUgJ25hbWVzcGFjZWxlc3MnIGRvY3VtZW50Ci0gICAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENNRG9jdW1lbnQoIiIsICIiLCAiRFREIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pY21Eb2N1bWVudC5nZXRFbGVtZW50cygpLmdldE5hbWVkSXRlbShlbGVtZW50LmdldE5vZGVOYW1lKCkpOyAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAKLSAgICAgCi0KLSAgcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgdGFyZ2V0RWxlbWVudCwgTGlzdCBsaXN0LCBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSkKLSAgeyAgICAgICAgIAotICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGN1cnJlbnRFRCA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgeyAgICAKLSAgICAgIGludCBsaXN0U2l6ZSA9IGxpc3Quc2l6ZSgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0U2l6ZTsgaSsrKQotICAgICAgewotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudClsaXN0LmdldChpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoaSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudChlbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBub2RlTmFtZSA9IGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHVucHJlZml4ZWROYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKG5vZGVOYW1lKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRQcmVmaXgobm9kZU5hbWUpOwotIAotICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG51bGw7Ci0gCi0gICAgICAgIC8vIHNlZSBpZiB0aGUgZWxlbWVudCBpcyBhIGxvY2FsIG9mIHRoZSBjdXJyZW50RUQKLSAgICAgICAgLy8gICAgICAgICAgICAgCi0gICAgICAgIGlmIChjdXJyZW50RUQgIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pY3VycmVudEVELmdldExvY2FsRWxlbWVudHMoKS5nZXROYW1lZEl0ZW0odW5wcmVmaXhlZE5hbWUpOwotICAgICAgICB9IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoZWQgPT0gbnVsbCkgCi0gICAgICAgIHsgICAgICAgICAgICAgICAKLSAgICAgICAgICBOYW1lc3BhY2VJbmZvIG5hbWVzcGFjZUluZm8gPSBuYW1lc3BhY2VUYWJsZS5nZXROYW1lc3BhY2VJbmZvRm9yUHJlZml4KHByZWZpeCk7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIGlmIChuYW1lc3BhY2VJbmZvICE9IG51bGwpIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENNRG9jdW1lbnQobmFtZXNwYWNlSW5mby51cmksIG5hbWVzcGFjZUluZm8ubG9jYXRpb25IaW50LCAiWFNEIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICAgICAgICB7IAotICAgICAgICAgICAgICBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbiljbURvY3VtZW50LmdldEVsZW1lbnRzKCkuZ2V0TmFtZWRJdGVtKHVucHJlZml4ZWROYW1lKTsgICAKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGN1cnJlbnRFRCA9IGVkOyAgICAgCi0KLSAgICAgICAgLy8gaGFuZGxlIFhTSVR5cGUgICAgIAotICAgICAgICBpZiAoY3VycmVudEVEICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBkZXJpdmVkRUQgPSBnZXREZXJpdmVkQ01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCwgY3VycmVudEVELCBuYW1lc3BhY2VUYWJsZSk7Ci0gICAgICAgICAgaWYgKGRlcml2ZWRFRCAhPSBudWxsKQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGN1cnJlbnRFRCA9IGRlcml2ZWRFRDsKLSAgICAgICAgICB9ICAgIAotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7IAotICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXhjZXB0aW9uIGxvY2F0aW5nIGVsZW1lbnQgZGVjbGFyYXRpb24gZm9yICIgKyB0YXJnZXRFbGVtZW50LCBlKTsgLy8kTk9OLU5MUy0xJAotICAgIH0gCi0gIAotICAgIHJldHVybiBjdXJyZW50RUQ7Ci0gIH0gIAotICAgICAgCi0KLSAgcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlcml2ZWRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotICAgIFN0cmluZyB4c2lQcmVmaXggPSBuYW1lc3BhY2VUYWJsZS5nZXRQcmVmaXhGb3JVUkkoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoeHNpUHJlZml4ICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHhzaVR5cGVWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKHhzaVByZWZpeCArICI6dHlwZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoeHNpVHlwZVZhbHVlICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgU3RyaW5nIHR5cGVQcmVmaXggPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0UHJlZml4KHhzaVR5cGVWYWx1ZSk7Ci0gICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZSh4c2lUeXBlVmFsdWUpOwotICAgICAgICBTdHJpbmcgdHlwZVVSSSA9IG5hbWVzcGFjZVRhYmxlLmdldFVSSUZvclByZWZpeCh0eXBlUHJlZml4KTsKLSAgICAgICAgU3RyaW5nIHVyaVF1YWxpZmllZFR5cGVOYW1lID0gdHlwZU5hbWU7Ci0gICAgICAgIGlmICh0eXBlVVJJICE9IG51bGwgJiYgdHlwZVVSSS5sZW5ndGgoKSA+IDApIAotICAgICAgICB7Ci0gICAgICAgICAgdXJpUXVhbGlmaWVkVHlwZU5hbWUgPSAiWyIgKyAgdHlwZVVSSSArICJdIiArIHR5cGVOYW1lOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pZWQuZ2V0UHJvcGVydHkoIkRlcml2ZWRFbGVtZW50RGVjbGFyYXRpb249IiArIHVyaVF1YWxpZmllZFR5cGVOYW1lKTsgICAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgCi0KLQotICBwdWJsaWMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKEF0dHIgYXR0cikKLSAgewotICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICAgIGlmIChlZCAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbillZC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHIuZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIC8vIHRyeSB0byBnZXQgdGhlIHVucHJlZml4ZWQgbmFtZSAgICAgICAgICAgICAKLSAgICAgICAgICBTdHJpbmcgbmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZShhdHRyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgcmVzdWx0ID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pZWQuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShuYW1lKTsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyB0b2RvLi4uIHBlcmhhcHMgdGhpcyBpcyBhIGdsb2JhbGx5IGRlZmluZWQgYXR0cmlidXRlLi4uIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgICAgICAgICAKLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgQ01Eb2N1bWVudFJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBub2RlIG9yIHN1YnRyZWUKLSAgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgTGlzdCBnZXRDTURvY3VtZW50UmVmZXJlbmNlcyhOb2RlIG5vZGUsIGJvb2xlYW4gZGVlcCkKLSAgeyAKLSAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsgIAotICAgIERvY3VtZW50IGRvY3VtZW50ID0gKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpID8gKERvY3VtZW50KW5vZGUgOiBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICBEb2N1bWVudFR5cGUgZG9jdHlwZSA9IGRvY3VtZW50LmdldERvY3R5cGUoKTsKLSAgICAvLyBkZWZlY3QgMjA2ODMzIC4uLiBoZXJlIHdlIHRlc3QgZm9yIERURHMgdGhhdCBhcmUgZGVjbGFyZWQgaW5saW5lCi0gICAgLy8gc2luY2Ugd2UgY3VycmVudGx5IGhhdmUgbm8gd2F5IG9mIG1ha2luZyB1c2Ugb2YgaW5saW5lIERURHMgd2UgaW5nb3JlIHRoZW0KLSAgICAvLyBzbyB0aGF0IHRoZSBpbXBsaWN0IERURCAoaWYgYW55KSBjYW4gYmUgdXNlZAotICAgIGlmIChkb2N0eXBlICE9IG51bGwgJiYgKGRvY3R5cGUuZ2V0UHVibGljSWQoKSAhPSBudWxsIHx8IGRvY3R5cGUuZ2V0U3lzdGVtSWQoKSAhPSBudWxsKSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgU3RyaW5nIHVyaSA9IHJlc29sdmVHcmFtbWFyVVJJKGRvY3VtZW50LCBkb2N0eXBlLmdldFB1YmxpY0lkKCksIGRvY3R5cGUuZ2V0U3lzdGVtSWQoKSk7Ci0gICAgICByZXN1bHQuYWRkKG5ldyBDTURvY3VtZW50UmVmZXJlbmNlSW1wbChkb2N0eXBlLmdldFB1YmxpY0lkKCksIHVyaSkpOwotICAgIH0gICAKLSAgICBlbHNlIGlmIChnZXRJbXBsaWN0RG9jdHlwZShkb2N1bWVudCkgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgCi0gICAgICBTdHJpbmdbXSBpbXBsaWNpdERvY3R5cGUgPSBnZXRJbXBsaWN0RG9jdHlwZShkb2N1bWVudCk7Ci0gICAgICBTdHJpbmcgdXJpID0gcmVzb2x2ZUdyYW1tYXJVUkkoZG9jdW1lbnQsIGltcGxpY2l0RG9jdHlwZVswXSwgaW1wbGljaXREb2N0eXBlWzFdKTsKLSAgICAgIHJlc3VsdC5hZGQobmV3IENNRG9jdW1lbnRSZWZlcmVuY2VJbXBsKGltcGxpY2l0RG9jdHlwZVswXSwgdXJpKSk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGVsc2UKLSAgICB7ICAgCi0gICAgICBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShkb2N1bWVudCk7Ci0gICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotCQkgICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudCgoRWxlbWVudClub2RlKTsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpZiAoZGVlcCkKLSAgICAgIHsKLSAgICAgICAgYWRkQ2hpbGRFbGVtZW50c1RvTmFtZXNwYWNlVGFibGUobm9kZSwgbmFtZXNwYWNlVGFibGUpOwotICAgICAgfQotCSAgICBMaXN0IGxpc3QgPSBuYW1lc3BhY2VUYWJsZS5nZXROYW1lc3BhY2VJbmZvTGlzdCgpOwotCQkgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSAKLSAgICAgIHsKLQkJCSAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOyAgICAKLSAgICAgICAgU3RyaW5nIHVyaSA9IHJlc29sdmVHcmFtbWFyVVJJKGRvY3VtZW50LCBpbmZvLnVyaSwgaW5mby5sb2NhdGlvbkhpbnQpOwotICAgICAgICByZXN1bHQuYWRkKG5ldyBDTURvY3VtZW50UmVmZXJlbmNlSW1wbChpbmZvLnVyaSwgdXJpKSk7Ci0JCSAgfQkKLSAgICB9IAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZEVsZW1lbnRzVG9OYW1lc3BhY2VUYWJsZShOb2RlIG5vZGUsIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlKQotICB7Ci0gICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkgIGlmIChub2RlTGlzdCAhPSBudWxsKSAKLSAgICB7Ci0JCSAgaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCSAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdExlbmd0aDsgaSsrKSAKLSAgICAgIHsKLQkJCSAgTm9kZSBjaGlsZE5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotICAgICAgICBpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgIHsgICAKLSAgICAgICAgICBuYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50KChFbGVtZW50KWNoaWxkTm9kZSk7Ci0gICAgICAgICAgYWRkQ2hpbGRFbGVtZW50c1RvTmFtZXNwYWNlVGFibGUoY2hpbGROb2RlLCBuYW1lc3BhY2VUYWJsZSk7Ci0gICAgICAgIH0KLQkJICB9Ci0JICB9Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01EZXNjcmlwdGlvbkJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNRGVzY3JpcHRpb25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YzlkYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01EZXNjcmlwdGlvbkJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIENNRGVzY3JpcHRpb25CdWlsZGVyIGV4dGVuZHMgQ01WaXNpdG9yCi17Ci0gIHByb3RlY3RlZCBTdHJpbmdCdWZmZXIgc2I7Ci0gIHByb3RlY3RlZCBDTU5vZGUgcm9vdDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSb290VmlzaXRlZDsKLQotICBwdWJsaWMgU3RyaW5nIGJ1aWxkRGVzY3JpcHRpb24oQ01Ob2RlIG5vZGUpCi0gIHsKLSAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICByb290ID0gbm9kZTsKLSAgICBpc1Jvb3RWaXNpdGVkID0gZmFsc2U7Ci0gICAgdmlzaXRDTU5vZGUobm9kZSk7Ci0gICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gIH0gICAgICAgCi0KLSAgcHVibGljIHZvaWQgdmlzaXRDTUFueUVsZW1lbnQoQ01BbnlFbGVtZW50IGFueUVsZW1lbnQpCi0gIHsKLSAgICBzYi5hcHBlbmQoIm5hbWVzcGFjZTp1cmk9XCIiICsgYW55RWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01EYXRhVHlwZShDTURhdGFUeXBlIGRhdGFUeXBlKQotICB7Ci0gICAgc2IuYXBwZW5kKCIjUENEQVRBIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01Eb2N1bWVudChDTURvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgQ01OYW1lZE5vZGVNYXAgbWFwID0gZG9jdW1lbnQuZ2V0RWxlbWVudHMoKTsKLSAgICBpbnQgc2l6ZSA9IG1hcC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICB2aXNpdENNTm9kZShtYXAuaXRlbShpKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTUdyb3VwKENNR3JvdXAgZ3JvdXApCi0gIHsKLSAgICBpbnQgb3AgPSBncm91cC5nZXRPcGVyYXRvcigpOwotICAgIGlmIChvcCA9PSBDTUdyb3VwLkFMTCkKLSAgICB7Ci0gICAgICBzYi5hcHBlbmQoImFsbCIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgc2IuYXBwZW5kKCIoIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIFN0cmluZyBzZXBhcmF0b3IgPSAiLCAiOyAvLyROT04tTkxTLTEkCi0KLSAgICBpZiAob3AgPT0gQ01Hcm91cC5DSE9JQ0UpCi0gICAgewotICAgICAgc2VwYXJhdG9yID0gIiB8ICI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBDTU5vZGVMaXN0IG5vZGVMaXN0ID0gZ3JvdXAuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBzaXplID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgdmlzaXRDTU5vZGUobm9kZUxpc3QuaXRlbShpKSk7Ci0gICAgICBpZiAoaSA8IHNpemUgLSAxKQotICAgICAgewotICAgICAgICBzYi5hcHBlbmQoc2VwYXJhdG9yKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc2IuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLSAgICBhZGRPY2N1cmVuY2VTeW1ib2woZ3JvdXApOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgewotICAgIGlmIChlZCA9PSByb290ICYmICFpc1Jvb3RWaXNpdGVkKQotICAgIHsKLSAgICAgIGlzUm9vdFZpc2l0ZWQgPSB0cnVlOwotICAgICAgQ01Db250ZW50IGNvbnRlbnQgPSBlZC5nZXRDb250ZW50KCk7Ci0gICAgICBpZiAoY29udGVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoY29udGVudC5nZXROb2RlVHlwZSgpICE9IENNTm9kZS5HUk9VUCkKLSAgICAgICAgewotICAgICAgICAgIHNiLmFwcGVuZCgiKCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgdmlzaXRDTU5vZGUoY29udGVudCk7Ci0gICAgICAgICAgc2IuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNTm9kZShjb250ZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2IuYXBwZW5kKGVkLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgYWRkT2NjdXJlbmNlU3ltYm9sKGVkKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRPY2N1cmVuY2VTeW1ib2woQ01Db250ZW50IGNvbnRlbnQpCi0gIHsKLSAgICBpbnQgbWluID0gY29udGVudC5nZXRNaW5PY2N1cigpOwotICAgIGludCBtYXggPSBjb250ZW50LmdldE1heE9jY3VyKCk7Ci0gICAgaWYgKG1pbiA9PSAwKQotICAgIHsKLSAgICAgIGlmIChtYXggPiAxIHx8IG1heCA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgc2IuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc2IuYXBwZW5kKCI/Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAobWF4ID4gMSB8fCBtYXggPT0gLTEpCi0gICAgewotICAgICAgc2IuYXBwZW5kKCIrIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNRG9jdW1lbnRDYWNoZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01Eb2N1bWVudENhY2hlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MGZmNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01Eb2N1bWVudENhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50Q2FjaGUKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19OT1RfTE9BREVEID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0xPQURJTkcgICAgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfTE9BREVEICAgICA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19FUlJPUiAgICAgID0gNDsKLQotICBwcm90ZWN0ZWQgY2xhc3MgRW50cnkKLSAgewotICAgIHB1YmxpYyBTdHJpbmcgdXJpOwotICAgIHB1YmxpYyBpbnQgc3RhdHVzID0gU1RBVFVTX05PVF9MT0FERUQ7Ci0gICAgcHVibGljIGZsb2F0IHByb2dyZXNzOwotICAgIHB1YmxpYyBDTURvY3VtZW50IGNtRG9jdW1lbnQ7Ci0KLSAgICBwdWJsaWMgRW50cnkoU3RyaW5nIHVyaSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgdGhpcy51cmkgPSB1cmk7ICAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIEVudHJ5KFN0cmluZyB1cmksIGludCBzdGF0dXMsIENNRG9jdW1lbnQgY21Eb2N1bWVudCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgdGhpcy51cmkgPSB1cmk7Ci0gICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsgICAgICAKLSAgICAgIHRoaXMuY21Eb2N1bWVudCA9IGNtRG9jdW1lbnQ7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBoYXNodGFibGU7Ci0gIHByb3RlY3RlZCBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotCi0gIC8qKgotICAgKiB0ZW1wb3JhcmlseSBwdWJsaWMgdW50aWwgY2FjaGluZyBwcm9ibGVtIGlzIHNvbHZlZAotICAgKi8KLSAgcHVibGljIENNRG9jdW1lbnRDYWNoZSgpCi0gIHsKLSAgICBoYXNodGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihDTURvY3VtZW50Q2FjaGVMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ01Eb2N1bWVudENhY2hlTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLSAgfSAgIAotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChTdHJpbmcgZ3JhbW1hclVSSSkKLSAgewotICAgIENNRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoZ3JhbW1hclVSSSAhPSBudWxsKQotICAgIHsgIAotICAgICAgRW50cnkgZW50cnkgPSAoRW50cnkpaGFzaHRhYmxlLmdldChncmFtbWFyVVJJKTsKLSAgICAgIGlmIChlbnRyeSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBlbnRyeS5jbURvY3VtZW50OwotICAgICAgfSAgIAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIGludCBnZXRTdGF0dXMoU3RyaW5nIGdyYW1tYXJVUkkpCi0gIHsKLSAgICBpbnQgcmVzdWx0ID0gU1RBVFVTX05PVF9MT0FERUQ7Ci0gICAgaWYgKGdyYW1tYXJVUkkgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KWhhc2h0YWJsZS5nZXQoZ3JhbW1hclVSSSk7Ci0gICAgICBpZiAoZW50cnkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZW50cnkuc3RhdHVzOwotICAgICAgfSAgICAgIAotICAgICAgCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAvKioKLSAgICoKLSAgICovCi0gIHByb3RlY3RlZCBFbnRyeSBsb29rdXBPckNyZWF0ZShTdHJpbmcgZ3JhbW1hclVSSSkKLSAgewotICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KWhhc2h0YWJsZS5nZXQoZ3JhbW1hclVSSSk7Ci0gICAgaWYgKGVudHJ5ID09IG51bGwpCi0gICAgewotICAgICAgZW50cnkgPSBuZXcgRW50cnkoZ3JhbW1hclVSSSk7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGhhc2h0YWJsZS5wdXQoZ3JhbW1hclVSSSwgZW50cnkpOwotICAgIH0KLSAgICByZXR1cm4gZW50cnk7Ci0gIH0KLQotICAgIAotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyB2b2lkIHB1dENNRG9jdW1lbnQoU3RyaW5nIGdyYW1tYXJVUkksIENNRG9jdW1lbnQgY21Eb2N1bWVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChncmFtbWFyVVJJICE9IG51bGwgJiYgY21Eb2N1bWVudCAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIEVudHJ5IGVudHJ5ID0gbG9va3VwT3JDcmVhdGUoZ3JhbW1hclVSSSk7Ci0gICAgICBpbnQgb2xkU3RhdHVzID0gZW50cnkuc3RhdHVzOwotICAgICAgZW50cnkuc3RhdHVzID0gU1RBVFVTX0xPQURFRDsKLSAgICAgIGVudHJ5LmNtRG9jdW1lbnQgPSBjbURvY3VtZW50OyAgCi0gICAgICBub3RpZnlDYWNoZVVwZGF0ZWQoZ3JhbW1hclVSSSwgb2xkU3RhdHVzLCBlbnRyeS5zdGF0dXMsIGVudHJ5LmNtRG9jdW1lbnQpOyAgCi0gICAgfQotICB9Ci0gICAgIAotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgZ3JhbW1hclVSSSwgaW50IHN0YXR1cykKLSAgewotICAgIGlmIChncmFtbWFyVVJJICE9IG51bGwpCi0gICAgewotICAgICAgRW50cnkgZW50cnkgPSBsb29rdXBPckNyZWF0ZShncmFtbWFyVVJJKTsKLSAgICAgIGludCBvbGRTdGF0dXMgPSBlbnRyeS5zdGF0dXM7Ci0gICAgICBlbnRyeS5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgICBub3RpZnlDYWNoZVVwZGF0ZWQoZ3JhbW1hclVSSSwgb2xkU3RhdHVzLCBlbnRyeS5zdGF0dXMsIGVudHJ5LmNtRG9jdW1lbnQpOyAgIAotICAgIH0KLSAgfQotICAgICAKLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgdm9pZCBjbGVhcigpCi0gIHsKLSAgICBoYXNodGFibGUuY2xlYXIoKTsKLSAgICBub3RpZnlDYWNoZUNsZWFyZWQoKTsKLSAgfSAgCi0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlDYWNoZVVwZGF0ZWQoU3RyaW5nIHVyaSwgaW50IG9sZFN0YXR1cywgaW50IG5ld1N0YXR1cywgQ01Eb2N1bWVudCBjbURvY3VtZW50KQotICB7ICAgICAgCi0gICAgTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotICAgIGxpc3QuYWRkQWxsKGxpc3RlbmVyTGlzdCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIENNRG9jdW1lbnRDYWNoZUxpc3RlbmVyIGxpc3RlbmVyID0gKENNRG9jdW1lbnRDYWNoZUxpc3RlbmVyKWkubmV4dCgpOwotICAgICAgbGlzdGVuZXIuY2FjaGVVcGRhdGVkKHRoaXMsIHVyaSwgb2xkU3RhdHVzLCBuZXdTdGF0dXMsIGNtRG9jdW1lbnQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5Q2FjaGVDbGVhcmVkKCkKLSAgeyAgICAgCi0gICAgTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotICAgIGxpc3QuYWRkQWxsKGxpc3RlbmVyTGlzdCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIENNRG9jdW1lbnRDYWNoZUxpc3RlbmVyIGxpc3RlbmVyID0gKENNRG9jdW1lbnRDYWNoZUxpc3RlbmVyKWkubmV4dCgpOwotICAgICAgbGlzdGVuZXIuY2FjaGVDbGVhcmVkKHRoaXMpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0Q01Eb2N1bWVudHMoKQotICB7Ci0gIAlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7ICAJCi0gIAlmb3IgKEl0ZXJhdG9yIGkgPSBoYXNodGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgCXsKLSAgCQlFbnRyeSBlbnRyeSA9IChFbnRyeSlpLm5leHQoKTsKLSAgCQlsaXN0LmFkZChlbnRyeS5jbURvY3VtZW50KTsKLSAgCX0KLSAgCXJldHVybiBsaXN0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9DTURvY3VtZW50Q2FjaGVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01Eb2N1bWVudENhY2hlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmNmRjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9DTURvY3VtZW50Q2FjaGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLQotCi0vKioKLSAqIHRvZG8uLi4gYWRkIG1vcmUgaW50ZXJmYWNlIG1ldGhvZHMKLSAqLwotcHVibGljIGludGVyZmFjZSBDTURvY3VtZW50Q2FjaGVMaXN0ZW5lcgotewotICAvKiogVGVsbHMgdGhlIGNsaWVudCB0aGF0IHRoZSBjYWNoZSBoYXMgYmVlbiBjbGVhcmVkLgotICAgKiAgVGhpcyBnaXZlcyBjbGllbnRzIGFuIG9wcG9ydHVuaXR5IHRvIGZsdXNoIGFueSBzdGF0ZSB0aGF0IGRlcGVuZHMgb24gdGhlIENNRG9jdW1lbnQKLSAgICogIHNpbmNlIHRoaXMgQ01Eb2N1bWVudCB3aWxsIGJlIHJlY29tcHV0ZWQgb24gYSBzdWJzZXF1ZW50ICdsb29rdXAnIHJlcXVlc3QKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNhY2hlQ2xlYXJlZChDTURvY3VtZW50Q2FjaGUgY2FjaGUpOyAKLQotICAvKiogCi0gICAqICBUZWxscyB0aGUgY2xpZW50IHRoYXQgdGhlIGNhY2hlIGhhcyBiZWVuIHVwZGF0ZWQuICAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNhY2hlVXBkYXRlZChDTURvY3VtZW50Q2FjaGUgY2FjaGUsIFN0cmluZyB1cmksIGludCBvbGRTdGF0dXMsIGludCBuZXdTdGF0dXMsIENNRG9jdW1lbnQgY21Eb2N1bWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9DTVZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzRmMzVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIENNVmlzaXRvcgotewotICBwcm90ZWN0ZWQgaW50IGluZGVudCA9IDA7Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTU5vZGUoQ01Ob2RlIG5vZGUpCi0gIHsKLSAgICBpZiAobm9kZSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vQ29udGVudE1vZGVsTWFuYWdlci5wcmludGxuSW5kZW50ZWQoInZpc2l0Q01Ob2RlIDogIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICIgIiArIG5vZGUpOwotICAgICAgaW5kZW50ICs9IDI7Ci0gICAgICBpbnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0gICAgICBzd2l0Y2ggKG5vZGVUeXBlKQotICAgICAgewotICAgICAgICBjYXNlIENNTm9kZS5BTllfRUxFTUVOVCA6Ci0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNQW55RWxlbWVudCgoQ01BbnlFbGVtZW50KW5vZGUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNQXR0cmlidXRlRGVjbGFyYXRpb24oKENNQXR0cmlidXRlRGVjbGFyYXRpb24pbm9kZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDTU5vZGUuREFUQV9UWVBFIDoKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0Q01EYXRhVHlwZSgoQ01EYXRhVHlwZSlub2RlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENNTm9kZS5ET0NVTUVOVCA6Ci0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNRG9jdW1lbnQoKENNRG9jdW1lbnQpbm9kZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKChDTUVsZW1lbnREZWNsYXJhdGlvbilub2RlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENNTm9kZS5HUk9VUCA6Ci0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNR3JvdXAoKENNR3JvdXApbm9kZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGluZGVudCAtPSAyOwotICAgIH0KLSAgfQotICAgICAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01BbnlFbGVtZW50KENNQW55RWxlbWVudCBhbnlFbGVtZW50KQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdENNQXR0cmlidXRlRGVjbGFyYXRpb24oQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTURhdGFUeXBlKENNRGF0YVR5cGUgZGF0YVR5cGUpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01Eb2N1bWVudChDTURvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgQ01OYW1lZE5vZGVNYXAgbWFwID0gZG9jdW1lbnQuZ2V0RWxlbWVudHMoKTsKLSAgICBpbnQgc2l6ZSA9IG1hcC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICB2aXNpdENNTm9kZShtYXAuaXRlbShpKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTUdyb3VwKENNR3JvdXAgZ3JvdXApCi0gIHsKLSAgICBDTU5vZGVMaXN0IG5vZGVMaXN0ID0gZ3JvdXAuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBzaXplID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgdmlzaXRDTU5vZGUobm9kZUxpc3QuaXRlbShpKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgewotICAgIENNTmFtZWROb2RlTWFwIG5vZGVNYXAgPSBlZC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgaW50IHNpemUgPSBub2RlTWFwLmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHZpc2l0Q01Ob2RlKG5vZGVNYXAuaXRlbShpKSk7Ci0gICAgfQotCi0gICAgdmlzaXRDTU5vZGUoZWQuZ2V0Q29udGVudCgpKTsKLQotICAgIHZpc2l0Q01EYXRhVHlwZShlZC5nZXREYXRhVHlwZSgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ29udGVudEJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NvbnRlbnRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZDAyYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ29udGVudEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BbnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci0KLSAgICAgICAgICAgICAgICAgICAKLS8qKgotICogVGhpcyBjbGFzcyBsZXRzIHlvdSB0cmF2ZXJzZSBhICdDTScgbW9kZWwgcHJvdmlkaW5nIGNhbGxiYWNrcyB0byBidWlsZCBjb250ZW50LgotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudEJ1aWxkZXIgZXh0ZW5kcyBDTVZpc2l0b3IKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlVJTERfQUxMX0NPTlRFTlQgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVUlMRF9PTkxZX1JFUVVJUkVEX0NPTlRFTlQgPSAyOwotICBwcm90ZWN0ZWQgaW50IGJ1aWxkUG9saWN5ID0gQlVJTERfQUxMX0NPTlRFTlQ7Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gYWx3YXlzVmlzaXQ7Ci0gIHByb3RlY3RlZCBWZWN0b3IgdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICBwdWJsaWMgQ29udGVudEJ1aWxkZXIoKQotICB7Ci0gIH0KLSAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgc2V0QnVpbGRQb2xpY3koaW50IGJ1aWxkUG9saWN5KQotICB7Ci0gICAgdGhpcy5idWlsZFBvbGljeSA9IGJ1aWxkUG9saWN5OwotICB9Ci0KLSAgcHVibGljIGludCBnZXRCdWlsZFBvbGljeSgpCi0gIHsKLSAgICByZXR1cm4gYnVpbGRQb2xpY3k7Ci0gIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBbnlFbGVtZW50Tm9kZShDTUFueUVsZW1lbnQgYW55RWxlbWVudCkKLSAgewotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWxlbWVudE5vZGVTdGFydChDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgeyAgICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWxlbWVudE5vZGVFbmQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVRleHROb2RlKENNRGF0YVR5cGUgZGF0YVR5cGUpCi0gIHsKLSAgfSAKLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVOb2RlKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlKQotICB7Ci0gIH0gCi0gCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsKLSAgICBpbnQgZm9yY2VkTWluID0gKGJ1aWxkUG9saWN5ID09IEJVSUxEX0FMTF9DT05URU5UIHx8IGFsd2F5c1Zpc2l0KSA/IDEgOiAwOwotICAgIGludCBtaW4gPSBNYXRoLm1heChlZC5nZXRNaW5PY2N1cigpLCBmb3JjZWRNaW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgYWx3YXlzVmlzaXQgPSBmYWxzZTsKLQotICAgIGlmIChtaW4gPiAwICYmICF2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LmNvbnRhaW5zKGVkKSkKLSAgICB7Ci0gICAgICB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LmFkZChlZCk7Ci0gICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtaW47IGkrKykKLSAgICAgIHsgICAgICAgCi0gICAgICAgIGNyZWF0ZUVsZW1lbnROb2RlU3RhcnQoZWQpOyAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vIGluc3RlYWQgb2YgY2FsbGluZyBzdXBlci52aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKCkKLSAgICAgICAgLy8gd2UgZHVwbGljYXRlIHRoZSBjb2RlIHdpdGggc29tZSBtaW5vciBtb2RpZmljYXRpb25zCi0gICAgICAgIENNTmFtZWROb2RlTWFwIG5vZGVNYXAgPSBlZC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGludCBzaXplID0gbm9kZU1hcC5nZXRMZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNTm9kZShub2RlTWFwLml0ZW0oaikpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ01Db250ZW50IGNvbnRlbnQgPSBlZC5nZXRDb250ZW50KCk7Ci0gICAgICAgIGlmIChjb250ZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNTm9kZShjb250ZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlZC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQSkKLSAgICAgICAgewotICAgICAgICAgIENNRGF0YVR5cGUgZGF0YVR5cGUgPSBlZC5nZXREYXRhVHlwZSgpOwotICAgICAgICAgIGlmIChkYXRhVHlwZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHZpc2l0Q01EYXRhVHlwZShkYXRhVHlwZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIGVuZCBkdXBsaWNhdGlvbgotICAgICAgICBjcmVhdGVFbGVtZW50Tm9kZUVuZChlZCk7ICAKLSAgICAgIH0KLSAgICAgIGludCBzaXplID0gdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5zaXplKCk7Ci0gICAgICB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LnJlbW92ZShzaXplIC0gMSk7Ci0gICAgfQotICB9Ci0gICAgCi0KLSAgcHVibGljIHZvaWQgdmlzaXRDTURhdGFUeXBlKENNRGF0YVR5cGUgZGF0YVR5cGUpCi0gIHsKLSAgICBjcmVhdGVUZXh0Tm9kZShkYXRhVHlwZSk7ICAgCi0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01Hcm91cChDTUdyb3VwIGUpCi0gIHsgCi0gICAgaW50IGZvcmNlZE1pbiA9IChidWlsZFBvbGljeSA9PSBCVUlMRF9BTExfQ09OVEVOVCB8fCBhbHdheXNWaXNpdCkgPyAxIDogMDsKLSAgICBpbnQgbWluID0gTWF0aC5tYXgoZS5nZXRNaW5PY2N1cigpLCBmb3JjZWRNaW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgYWx3YXlzVmlzaXQgPSBmYWxzZTsKLQotICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG1pbjsgaSsrKQotICAgIHsgICAKLSAgICAgIGlmIChlLmdldE9wZXJhdG9yKCkgPT0gQ01Hcm91cC5DSE9JQ0UpCi0gICAgICB7Ci0gICAgICAgIC8vIGFkZCBvbmx5IDEgZWxlbWVudCBmcm9tIHRoZSBncm91cAotICAgICAgICAvLyB0b2RvLi4uIHBlcmhhcHMgYWRkIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBmaXJzdCBvbmUgICAgICAgIAotICAgICAgICBDTU5vZGVMaXN0IG5vZGVMaXN0ID0gZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgIGlmIChub2RlTGlzdC5nZXRMZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNTm9kZShub2RlTGlzdC5pdGVtKDApKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSAvLyBTRVFVRU5DRSwgQUxMCi0gICAgICB7Ci0gICAgICAgIC8vIHZpc2l0IGFsbCBvZiB0aGUgY29udGVudAotICAgICAgICBzdXBlci52aXNpdENNR3JvdXAoZSk7Ci0gICAgICB9Ci0gICAgfQotICB9IAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKQotICB7Ci0gICAgaWYgKGFsd2F5c1Zpc2l0IHx8Ci0gICAgICAgIGJ1aWxkUG9saWN5ID09IEJVSUxEX0FMTF9DT05URU5UIHx8Ci0gICAgICAgIGFkLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkKLSAgICB7Ci0gICAgICBjcmVhdGVBdHRyaWJ1dGVOb2RlKGFkKTsgICAgICAKLSAgICB9Ci0gIH0gICAgICAgICAgICAgICAgICAgICAKLSAgCi0KLSAgcHVibGljIHZvaWQgdmlzaXRDTUFueUVsZW1lbnQoQ01BbnlFbGVtZW50IGFueUVsZW1lbnQpCi0gIHsgIAotICAgIGludCBmb3JjZWRNaW4gPSAoYnVpbGRQb2xpY3kgPT0gQlVJTERfQUxMX0NPTlRFTlQgfHwgYWx3YXlzVmlzaXQpID8gMSA6IDA7Ci0gICAgYWx3YXlzVmlzaXQgPSBmYWxzZTsgCi0gICAgaW50IG1pbiA9IE1hdGgubWF4KGFueUVsZW1lbnQuZ2V0TWluT2NjdXIoKSwgZm9yY2VkTWluKTsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG1pbjsgaSsrKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgY3JlYXRlQW55RWxlbWVudE5vZGUoYW55RWxlbWVudCk7Ci0gICAgfQotICB9ICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTUNvbnRlbnRCdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01Db250ZW50QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDIzNTc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTUNvbnRlbnRCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgRE9NQ29udGVudEJ1aWxkZXIKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlVJTERfT1BUSU9OQUxfQVRUUklCVVRFUyA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVSUxEX09QVElPTkFMX0VMRU1FTlRTID0gMTw8MTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlVJTERfRklSU1RfQ0hPSUNFID0gMTw8MjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlVJTERfVEVYVF9OT0RFUyA9IDE8PDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVSUxEX0ZJUlNUX1NVQlNUSVRVVElPTiA9IDE8PDQ7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCAKLSAgICBCVUlMRF9PTkxZX1JFUVVJUkVEX0NPTlRFTlQgPQotICAgICAgQlVJTERfRklSU1RfQ0hPSUNFCi0gICAgICB8IEJVSUxEX1RFWFRfTk9ERVM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IAotICAgIEJVSUxEX0FMTF9DT05URU5UID0gCi0gICAgICBCVUlMRF9PUFRJT05BTF9BVFRSSUJVVEVTIAotICAgICAgfCBCVUlMRF9PUFRJT05BTF9FTEVNRU5UUyAKLSAgICAgIHwgQlVJTERfRklSU1RfQ0hPSUNFCi0gICAgICB8IEJVSUxEX1RFWFRfTk9ERVM7Ci0gICAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQlVJTERfQkxBTktfVEVYVF9OT0RFUyA9ICJidWlsZEJsYW5rVGV4dE5vZGVzIjsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHVibGljIHZvaWQgc2V0QnVpbGRQb2xpY3koaW50IGJ1aWxkUG9saWN5KTsKLSAgcHVibGljIGludCAgZ2V0QnVpbGRQb2xpY3koKTsKLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHZhbHVlKTsKLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLSAgcHVibGljIExpc3QgZ2V0UmVzdWx0KCk7Ci0gIHB1YmxpYyB2b2lkIGJ1aWxkKE5vZGUgcGFyZW50LCBDTU5vZGUgY2hpbGQpOwotICBwdWJsaWMgdm9pZCBjcmVhdGVEZWZhdWx0Um9vdENvbnRlbnQoQ01Eb2N1bWVudCBjbURvY3VtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiByb290Q01FbGVtZW50RGVjbGFyYXRpb24pIHRocm93cyBFeGNlcHRpb247Ci0gIHB1YmxpYyB2b2lkIGNyZWF0ZURlZmF1bHRSb290Q29udGVudChDTURvY3VtZW50IGNtRG9jdW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHJvb3RDTUVsZW1lbnREZWNsYXJhdGlvbiwgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCkgdGhyb3dzIEV4Y2VwdGlvbjsKLSAgcHVibGljIHZvaWQgY3JlYXRlRGVmYXVsdENvbnRlbnQoTm9kZSBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkKSB0aHJvd3MgRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NQ29udGVudEJ1aWxkZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01Db250ZW50QnVpbGRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMyYTQ4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01Db250ZW50QnVpbGRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BbnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ29udGVudE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLnV0aWwuQ01EYXRhVHlwZVZhbHVlSGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0vKioKLSAqIHRvZG8uLi4gY29tbW9uIHVwIHRoaXMgY29kZSB3aXRoICdDb250ZW50QnVpbGRlcicKLSAqLwotcHVibGljIGNsYXNzIERPTUNvbnRlbnRCdWlsZGVySW1wbCBleHRlbmRzIENNVmlzaXRvciBpbXBsZW1lbnRzIERPTUNvbnRlbnRCdWlsZGVyIHsKLQlwcm90ZWN0ZWQgaW50IGJ1aWxkUG9saWN5ID0gQlVJTERfQUxMX0NPTlRFTlQ7Ci0JcHJvdGVjdGVkIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWx3YXlzVmlzaXQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgTGlzdCByZXN1bHRMaXN0OwotCXByb3RlY3RlZCBEb2N1bWVudCBkb2N1bWVudDsKLQlwcm90ZWN0ZWQgTm9kZSBjdXJyZW50UGFyZW50OwotCXByb3RlY3RlZCBOb2RlIHRvcFBhcmVudDsKLQlwcm90ZWN0ZWQgVmVjdG9yIHZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gYXR0YWNoTm9kZXNUb1BhcmVudCA9IHRydWU7Ci0JcHJvdGVjdGVkIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlOwotCi0JcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlSW5mb0xpc3Q7Ci0JcHJvdGVjdGVkIEVsZW1lbnQgcm9vdEVsZW1lbnQ7IC8vIHRoaXMgaXMgdXNlZCBvbmx5IHRlcG9yYXJpbHkgdmlhCi0JCQkJCQkJCQkvLyBjcmVhdGVEZWZhdWx0Um9vdENvbnRlbnQKLQlwcm90ZWN0ZWQgRXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydCBleHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0OwotCi0JcHVibGljIGJvb2xlYW4gc3VwcmVzc0NyZWF0aW9uT2ZEb2N0eXBlQW5kWE1MRGVjbGFyYXRpb247Ci0KLQlwcm90ZWN0ZWQgQ01EYXRhVHlwZVZhbHVlSGVscGVyIHZhbHVlSGVscGVyID0gbmV3IENNRGF0YVR5cGVWYWx1ZUhlbHBlcigpOwotCi0JcHJvdGVjdGVkIGludCBudW1PZlJlcGVhdGFibGVFbGVtZW50cyA9IDE7Ci0JcHJvdGVjdGVkIFN0YWNrIGNtR3JvdXBTdGFjayA9IG5ldyBTdGFjaygpOwotCi0JcHVibGljIGludGVyZmFjZSBFeHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0IHsKLQkJcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB1cmkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQoRXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydCBleHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0KSB7Ci0JCXRoaXMuZXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydCA9IGV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQ7Ci0JfQotCi0JcHVibGljIERPTUNvbnRlbnRCdWlsZGVySW1wbChEb2N1bWVudCBkb2N1bWVudCkgewotCQl0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCW5hbWVzcGFjZVRhYmxlID0gbmV3IE5hbWVzcGFjZVRhYmxlKGRvY3VtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCdWlsZFBvbGljeShpbnQgYnVpbGRQb2xpY3kpIHsKLQkJdGhpcy5idWlsZFBvbGljeSA9IGJ1aWxkUG9saWN5OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QnVpbGRQb2xpY3koKSB7Ci0JCXJldHVybiBidWlsZFBvbGljeTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZEFsbENvbnRlbnQoaW50IHBvbGljeSkgewotCQlyZXR1cm4gKHBvbGljeSAmIEJVSUxEX0FMTF9DT05URU5UKSA9PSBCVUlMRF9BTExfQ09OVEVOVDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZE9wdGlvbmFsRWxlbWVudHMoaW50IHBvbGljeSkgewotCQlyZXR1cm4gKHBvbGljeSAmIEJVSUxEX09QVElPTkFMX0VMRU1FTlRTKSA9PSBCVUlMRF9PUFRJT05BTF9FTEVNRU5UUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZE9wdGlvbmFsQXR0cmlidXRlcyhpbnQgcG9saWN5KSB7Ci0JCXJldHVybiAocG9saWN5ICYgQlVJTERfT1BUSU9OQUxfQVRUUklCVVRFUykgPT0gQlVJTERfT1BUSU9OQUxfQVRUUklCVVRFUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZEZpcnN0Q2hvaWNlKGludCBwb2xpY3kpIHsKLQkJcmV0dXJuIChwb2xpY3kgJiBCVUlMRF9GSVJTVF9DSE9JQ0UpID09IEJVSUxEX0ZJUlNUX0NIT0lDRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZFRleHROb2RlcyhpbnQgcG9saWN5KSB7Ci0JCXJldHVybiAocG9saWN5ICYgQlVJTERfVEVYVF9OT0RFUykgPT0gQlVJTERfVEVYVF9OT0RFUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZEZpcnN0U3Vic3RpdHV0aW9uKGludCBwb2xpY3kpIHsKLQkJcmV0dXJuIChwb2xpY3kgJiBCVUlMRF9GSVJTVF9TVUJTVElUVVRJT04pID09IEJVSUxEX0ZJUlNUX1NVQlNUSVRVVElPTjsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiByZXN1bHRMaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQlwcm9wZXJ0eVRhYmxlLnB1dChwcm9wZXJ0eU5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIHByb3BlcnR5VGFibGUuZ2V0KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYnVpbGQoTm9kZSBwYXJlbnQsIENNTm9kZSBjaGlsZCkgewotCQlyZXN1bHRMaXN0ID0gbmV3IFZlY3RvcigpOwotCQl0b3BQYXJlbnQgPSBwYXJlbnQ7Ci0JCWN1cnJlbnRQYXJlbnQgPSBwYXJlbnQ7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQluYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50TGluZWFnZSgoRWxlbWVudCkgcGFyZW50KTsKLQkJfQotCQlhdHRhY2hOb2Rlc1RvUGFyZW50ID0gZmFsc2U7Ci0JCWFsd2F5c1Zpc2l0ID0gdHJ1ZTsKLQkJdmlzaXRDTU5vZGUoY2hpbGQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZURlZmF1bHRSb290Q29udGVudChDTURvY3VtZW50IGNtRG9jdW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHJvb3RDTUVsZW1lbnREZWNsYXJhdGlvbiwgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMubmFtZXNwYWNlSW5mb0xpc3QgPSBuYW1lc3BhY2VJbmZvTGlzdDsKLQkJY3JlYXRlRGVmYXVsdFJvb3RDb250ZW50KGNtRG9jdW1lbnQsIHJvb3RDTUVsZW1lbnREZWNsYXJhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlRGVmYXVsdFJvb3RDb250ZW50KENNRG9jdW1lbnQgY21Eb2N1bWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcm9vdENNRWxlbWVudERlY2xhcmF0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGdyYW1tYXJGaWxlTmFtZSA9IGNtRG9jdW1lbnQuZ2V0Tm9kZU5hbWUoKTsKLQkJaWYgKCFzdXByZXNzQ3JlYXRpb25PZkRvY3R5cGVBbmRYTUxEZWNsYXJhdGlvbikgewotCQkJLy8gVE9ETyBjcy4uLiBpbnZlc3RpZ2F0ZSB0byBzZWUgaWYgdGhpcyBjb2RlIHBhdGggaXMgZXZlciB1c2VkLAotCQkJLy8gZG9lc24ndCBzZWVtIHRvIGJlCi0JCQkvLyBmb3Igbm93IEknbSBzZXR0aW5nIHRoZSBlbmNvZGluZyB0byBVVEYtOCBqdXN0IGluY2FzZSB0aGlzIGNvZGUKLQkJCS8vIHBhdGggaXMgdXNlZCBzb21ld2hlcmUKLQkJCS8vCi0JCQlTdHJpbmcgcGlWYWx1ZSA9ICJ2ZXJzaW9uPVwiMS4wXCIiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZW5jb2RpbmcgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCQlwaVZhbHVlICs9ICIgZW5jb2Rpbmc9XCIiICsgZW5jb2RpbmcgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgICAgICAKLQkJCVByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSA9IGRvY3VtZW50LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbigieG1sIiwgcGlWYWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRvY3VtZW50LmFwcGVuZENoaWxkKHBpKTsKLQotCQkJLy8gaWYgd2UgaGF2ZSBhICdkdGQnIHRoZW4gYWRkIGEgRE9DVFlQRSB0YWcKLQkJCS8vCi0JCQlpZiAoZ3JhbW1hckZpbGVOYW1lICE9IG51bGwgJiYgZ3JhbW1hckZpbGVOYW1lLmVuZHNXaXRoKCJkdGQiKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCURPTUltcGxlbWVudGF0aW9uIGRvbUltcGwgPSBkb2N1bWVudC5nZXRJbXBsZW1lbnRhdGlvbigpOwotCQkJCURvY3VtZW50VHlwZSBkb2N1bWVudFR5cGUgPSBkb21JbXBsLmNyZWF0ZURvY3VtZW50VHlwZShyb290Q01FbGVtZW50RGVjbGFyYXRpb24uZ2V0RWxlbWVudE5hbWUoKSwgZ3JhbW1hckZpbGVOYW1lLCBncmFtbWFyRmlsZU5hbWUpOwotCQkJCWRvY3VtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50VHlwZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiB3ZSBoYXZlIGEgc2NoZW1hIGFkZCBhbiB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlCi0JCS8vCi0JCWlmIChncmFtbWFyRmlsZU5hbWUgIT0gbnVsbCAmJiBncmFtbWFyRmlsZU5hbWUuZW5kc1dpdGgoInhzZCIpICYmIG5hbWVzcGFjZUluZm9MaXN0ICE9IG51bGwpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIgbWFuYWdlciA9IG5ldyBET01OYW1lc3BhY2VJbmZvTWFuYWdlcigpOwotCQkJU3RyaW5nIG5hbWUgPSByb290Q01FbGVtZW50RGVjbGFyYXRpb24uZ2V0Tm9kZU5hbWUoKTsKLQkJCWlmIChuYW1lc3BhY2VJbmZvTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIG5hbWVzcGFjZUluZm9MaXN0LmdldCgwKTsKLQkJCQlpZiAoaW5mby5wcmVmaXggIT0gbnVsbCAmJiBpbmZvLnByZWZpeC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJbmFtZSA9IGluZm8ucHJlZml4ICsgIjoiICsgbmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXJvb3RFbGVtZW50ID0gY3JlYXRlRWxlbWVudChyb290Q01FbGVtZW50RGVjbGFyYXRpb24sIG5hbWUsIGRvY3VtZW50KTsKLQkJCW1hbmFnZXIuYWRkTmFtZXNwYWNlSW5mbyhyb290RWxlbWVudCwgbmFtZXNwYWNlSW5mb0xpc3QsIHRydWUpOwotCQl9Ci0JCWNyZWF0ZURlZmF1bHRDb250ZW50KGRvY3VtZW50LCByb290Q01FbGVtZW50RGVjbGFyYXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZURlZmF1bHRDb250ZW50KE5vZGUgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkgewotCQljdXJyZW50UGFyZW50ID0gcGFyZW50OwotCQlhbHdheXNWaXNpdCA9IHRydWU7Ci0JCXZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oZWQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgY29tcHV0ZU5hbWUoQ01Ob2RlIGNtTm9kZSwgTm9kZSBwYXJlbnQpIHsKLQkJU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0JCXJldHVybiBET01OYW1lc3BhY2VIZWxwZXIuY29tcHV0ZU5hbWUoY21Ob2RlLCBwYXJlbnQsIHByZWZpeCwgbmFtZXNwYWNlVGFibGUpOwotCX0KLQotCS8vIG92ZXJpZGUgdGhlIGZvbGxvd2luZyAnY3JlYXRlJyBtZXRob2RzIHRvIGNvbnRyb2wgaG93IG5vZGVzIGFyZSBjcmVhdGVkCi0JLy8KLQlwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVFbGVtZW50KENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBTdHJpbmcgbmFtZSwgTm9kZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEF0dHIgY3JlYXRlQXR0cmlidXRlKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQsIFN0cmluZyBuYW1lLCBOb2RlIHBhcmVudCkgewotCQlyZXR1cm4gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHROb2RlKENNRGF0YVR5cGUgZGF0YVR5cGUsIFN0cmluZyB2YWx1ZSwgTm9kZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQdXNoUGFyZW50KEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVBvcFBhcmVudChFbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkKSB7Ci0JfQotCi0JLy8gVGhlIHJhbmdlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA5OS4KLQlwdWJsaWMgdm9pZCBzZXROdW1PZlJlcGVhdGFibGVFbGVtZW50cyhpbnQgaSkgewotCQludW1PZlJlcGVhdGFibGVFbGVtZW50cyA9IGk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXROdW1PZlJlcGVhdGFibGVFbGVtZW50cygpIHsKLQkJcmV0dXJuIG51bU9mUmVwZWF0YWJsZUVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpIHsKLQkJaW50IGZvcmNlZE1pbiA9IChidWlsZE9wdGlvbmFsRWxlbWVudHMoYnVpbGRQb2xpY3kpIHx8IGFsd2F5c1Zpc2l0KSA/IDEgOiAwOwotCQlpbnQgbWluID0gTWF0aC5tYXgoZWQuZ2V0TWluT2NjdXIoKSwgZm9yY2VkTWluKTsKLQotCQkvLyBDb3JyZWN0IHRoZSBtaW4gdmFsdWUgaWYgdGhlIGVsZW1lbnQgaXMgY29udGFpbmVkIGluCi0JCS8vIGEgZ3JvdXAuCi0JCWlmICghY21Hcm91cFN0YWNrLmlzRW1wdHkoKSkgewotCQkJQ01Hcm91cCBncm91cCA9IChDTUdyb3VwKSBjbUdyb3VwU3RhY2sucGVlaygpOwotCQkJaW50IGdtaW4gPSBncm91cC5nZXRNaW5PY2N1cigpOwotCQkJaWYgKGdtaW4gPT0gMCkKLQkJCQlpZiAoYnVpbGRPcHRpb25hbEVsZW1lbnRzKGJ1aWxkUG9saWN5KSkgeyAKLQkJCQkJLyogZG8gbm90aGluZzogbWluID0gbWluICovCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQltaW4gPSBtaW4gKiBnbWluOyAvLyBtaW4gPSAwCi0JCQkJfQotCQkJZWxzZSB7Ci0JCQkJbWluID0gbWluICogZ21pbjsKLQkJCX0KLQkJfQotCi0JCWludCBtYXggPSBNYXRoLm1pbihlZC5nZXRNYXhPY2N1cigpLCBnZXROdW1PZlJlcGVhdGFibGVFbGVtZW50cygpKTsKLQkJaWYgKG1heCA8IG1pbikKLQkJCW1heCA9IG1pbjsKLQotCQlhbHdheXNWaXNpdCA9IGZhbHNlOwotCi0JCS8vIE5vdGUgLSBlZCBtYXkgbm90IGJlIGFic3RyYWN0IGJ1dCBoYXMgc3Vic3RpdHV0aW9uR3JvdXBzCi0JCS8vIGludm9sdmVkLgotCQlpZiAoYnVpbGRGaXJzdFN1YnN0aXR1dGlvbihidWlsZFBvbGljeSkgfHwgaXNBYnN0cmFjdChlZCkpIC8vIGxlYXZlCi0JCQkJCQkJCQkJCQkJCQkJCS8vIHRoaXMKLQkJCQkJCQkJCQkJCQkJCQkJLy8gZm9yCi0JCQkJCQkJCQkJCQkJCQkJCS8vIGJhY2t3YXJkCi0JCQkJCQkJCQkJCQkJCQkJCS8vIGNvbXBhdGliaWxpdHkKLQkJCQkJCQkJCQkJCQkJCQkJLy8gZm9yIG5vdwotCQl7Ci0JCQkvLyBOb3RlIC0gVG8gY2hhbmdlIHNvIHRoYXQgaWYgZWQgaXMgb3B0aW9uYWwsIHdlIGRvIG5vdAotCQkJLy8gZ2VuZXJhdGUgYW55dGhpbmcgaGVyZS4KLQkJCWVkID0gZ2V0U3Vic3RpdHV0aW9uKGVkKTsKLQotCQkJLy8gTm90ZSAtIHRoZSByZXR1cm5lZCBlZCBtYXkgYmUgYW4gYWJzdHJhY3QgZWxlbWVudCBpbgotCQkJLy8gd2hpY2ggY2FzZSB0aGUgeG1sIHdpbGwgYmUgaW52YWxpZC4KLQkJfQotCi0JCWlmIChtaW4gPiAwICYmICF2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LmNvbnRhaW5zKGVkKSkgewotCQkJdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5hZGQoZWQpOwotCQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbWF4OyBpKyspIHsKLQkJCQkvLyBjcmVhdGUgYW4gRWxlbWVudCBmb3IgZWFjaAotCQkJCUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCQkJaWYgKHJvb3RFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudCA9IHJvb3RFbGVtZW50OwotCQkJCQlyb290RWxlbWVudCA9IG51bGw7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQllbGVtZW50ID0gY3JlYXRlRWxlbWVudChlZCwgY29tcHV0ZU5hbWUoZWQsIGN1cnJlbnRQYXJlbnQpLCBjdXJyZW50UGFyZW50KTsKLQkJCQl9Ci0KLQkJCQkvLyB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIEdyYW1tYXJFbGVtZW50Ci0JCQkJTm9kZSBvbGRQYXJlbnQgPSBjdXJyZW50UGFyZW50OwotCQkJCWN1cnJlbnRQYXJlbnQgPSBlbGVtZW50OwotCQkJCWhhbmRsZVB1c2hQYXJlbnQoZWxlbWVudCwgZWQpOwotCi0JCQkJbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudChlbGVtZW50KTsKLQotCQkJCWJvb2xlYW4gb2xkQXR0YWNoTm9kZXNUb1BhcmVudCA9IGF0dGFjaE5vZGVzVG9QYXJlbnQ7Ci0JCQkJYXR0YWNoTm9kZXNUb1BhcmVudCA9IHRydWU7Ci0KLQkJCQkvLyBpbnN0ZWFkIG9mIGNhbGxpbmcgc3VwZXIudmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbigpCi0JCQkJLy8gd2UgZHVwbGljYXRlIHRoZSBjb2RlIHdpdGggc29tZSBtaW5vciBtb2RpZmljYXRpb25zCi0JCQkJQ01OYW1lZE5vZGVNYXAgbm9kZU1hcCA9IGVkLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQlpbnQgc2l6ZSA9IG5vZGVNYXAuZ2V0TGVuZ3RoKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKLQkJCQkJdmlzaXRDTU5vZGUobm9kZU1hcC5pdGVtKGopKTsKLQkJCQl9Ci0KLQkJCQlDTUNvbnRlbnQgY29udGVudCA9IGVkLmdldENvbnRlbnQoKTsKLQkJCQlpZiAoY29udGVudCAhPSBudWxsKSB7Ci0JCQkJCXZpc2l0Q01Ob2RlKGNvbnRlbnQpOwotCQkJCX0KLQotCQkJCWlmIChlZC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQSkgewotCQkJCQlDTURhdGFUeXBlIGRhdGFUeXBlID0gZWQuZ2V0RGF0YVR5cGUoKTsKLQkJCQkJaWYgKGRhdGFUeXBlICE9IG51bGwpIHsKLQkJCQkJCXZpc2l0Q01EYXRhVHlwZShkYXRhVHlwZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gZW5kIGR1cGxpY2F0aW9uCi0JCQkJYXR0YWNoTm9kZXNUb1BhcmVudCA9IG9sZEF0dGFjaE5vZGVzVG9QYXJlbnQ7Ci0JCQkJaGFuZGxlUG9wUGFyZW50KGVsZW1lbnQsIGVkKTsKLQkJCQljdXJyZW50UGFyZW50ID0gb2xkUGFyZW50OwotCQkJCWxpbmtOb2RlKGVsZW1lbnQpOwotCQkJfQotCQkJaW50IHNpemUgPSB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LnNpemUoKTsKLQkJCXZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QucmVtb3ZlKHNpemUgLSAxKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgdmlzaXRDTURhdGFUeXBlKENNRGF0YVR5cGUgZGF0YVR5cGUpIHsKLQkJVGV4dCB0ZXh0ID0gbnVsbDsKLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQotCQkvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKLQkJLy8gUHJldmlvdXMgY29kZSB1c2VzIGEgcHJvcGVydHkgdmFsdWUgYnV0IG5ldyBvbmUgdXNlcwotCQkvLyBidWlsZFBvbGljeS4KLQkJaWYgKGdldFByb3BlcnR5KFBST1BFUlRZX0JVSUxEX0JMQU5LX1RFWFRfTk9ERVMpICE9IG51bGwgJiYgZ2V0UHJvcGVydHkoUFJPUEVSVFlfQlVJTERfQkxBTktfVEVYVF9OT0RFUykuZXF1YWxzKCJ0cnVlIikpIC8vJE5PTi1OTFMtMSQKLQkJCWJ1aWxkUG9saWN5ID0gYnVpbGRQb2xpY3kgXiBCVUlMRF9URVhUX05PREVTOwotCi0JCWlmIChidWlsZFRleHROb2RlcyhidWlsZFBvbGljeSkpIHsKLQkJCXZhbHVlID0gdmFsdWVIZWxwZXIuZ2V0VmFsdWUoZGF0YVR5cGUpOwotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQlpZiAoY3VycmVudFBhcmVudCAhPSBudWxsICYmIGN1cnJlbnRQYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQl2YWx1ZSA9IGN1cnJlbnRQYXJlbnQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXZhbHVlID0gInBjZGF0YSI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGV4dCA9IGNyZWF0ZVRleHROb2RlKGRhdGFUeXBlLCB2YWx1ZSwgY3VycmVudFBhcmVudCk7Ci0JCWxpbmtOb2RlKHRleHQpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdmlzaXRDTUdyb3VwKENNR3JvdXAgZSkgewotCQljbUdyb3VwU3RhY2sucHVzaChlKTsKLQotCQlpbnQgZm9yY2VkTWluID0gKGJ1aWxkT3B0aW9uYWxFbGVtZW50cyhidWlsZFBvbGljeSkgfHwgYWx3YXlzVmlzaXQpID8gMSA6IDA7Ci0JCWludCBtaW4gPSBNYXRoLm1heChlLmdldE1pbk9jY3VyKCksIGZvcmNlZE1pbik7Ci0KLQkJaW50IG1heCA9IDA7Ci0JCWlmIChlLmdldE1heE9jY3VyKCkgPT0gLTEpIC8vIHVuYm91bmRlZAotCQkJbWF4ID0gZ2V0TnVtT2ZSZXBlYXRhYmxlRWxlbWVudHMoKTsKLQkJZWxzZQotCQkJbWF4ID0gTWF0aC5taW4oZS5nZXRNYXhPY2N1cigpLCBnZXROdW1PZlJlcGVhdGFibGVFbGVtZW50cygpKTsKLQotCQlpZiAobWF4IDwgbWluKQotCQkJbWF4ID0gbWluOwotCi0JCWFsd2F5c1Zpc2l0ID0gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbWF4OyBpKyspIHsKLQkJCWlmIChlLmdldE9wZXJhdG9yKCkgPT0gQ01Hcm91cC5DSE9JQ0UgJiYgYnVpbGRGaXJzdENob2ljZShidWlsZFBvbGljeSkpIHsKLQkJCQlDTU5vZGUgaGludE5vZGUgPSBudWxsOwotCi0JCQkJLy8gdG9kby4uLiB0aGUgQ01Hcm91cCBzaG91bGQgc3BlY2lmeSB0aGUgaGludC4uLiBidXQgaXQgc2VlbXMKLQkJCQkvLyBhcyB0aG91Z2gKLQkJCQkvLyB0aGUgWWFtYXRvIGd1eXMgYXJlIG1ha2luZyB0aGUgQ01FbGVtZW50IHNwZWNpZnkgdGhlIGhpbnQuCi0JCQkJLy8gSSBkbyBpdCB0aGF0IHdheSBmb3Igbm93IHVudGlsLi4uIHdlIHNob3VsZCBmaXggdGhpcyBwb3N0Ci0JCQkJLy8gR0EKLQkJCQkvLyAgICAKLQkJCQlpbnQgbGlzdFNpemUgPSB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LnNpemUoKTsKLQkJCQlpZiAobGlzdFNpemUgPiAwKSB7Ci0JCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LmdldChsaXN0U2l6ZSAtIDEpOwotCQkJCQlPYmplY3QgY29udGVudEhpbnQgPSBlZC5nZXRQcm9wZXJ0eSgiY29udGVudEhpbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoY29udGVudEhpbnQgaW5zdGFuY2VvZiBDTU5vZGUpIHsKLQkJCQkJCWhpbnROb2RlID0gKENNTm9kZSkgY29udGVudEhpbnQ7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzZWUgaWYgdGhpcyBoaW50IGNvcnJlc3BvbmRzIHRvIGEgdmFsaWQgY2hvaWNlCi0JCQkJLy8KLQkJCQlDTU5vZGUgY21Ob2RlID0gbnVsbDsKLQotCQkJCWlmIChoaW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCUNNTm9kZUxpc3Qgbm9kZUxpc3QgPSBlLmdldENoaWxkTm9kZXMoKTsKLQkJCQkJaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbm9kZUxpc3RMZW5ndGg7IGorKykgewotCQkJCQkJaWYgKGhpbnROb2RlID09IG5vZGVMaXN0Lml0ZW0oaikpIHsKLQkJCQkJCQljbU5vZGUgPSBoaW50Tm9kZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIGlmIG5vIGNtTm9kZSBoYXMgYmVlbiBkZXRlcm1pbmVkIGZyb20gdGhlIGhpbnQsIGp1c3QgdXNlCi0JCQkJLy8gdGhlIGZpcnN0IGNob2ljZQotCQkJCS8vCi0JCQkJaWYgKGNtTm9kZSA9PSBudWxsKSB7Ci0JCQkJCUNNTm9kZUxpc3Qgbm9kZUxpc3QgPSBlLmdldENoaWxkTm9kZXMoKTsKLQkJCQkJaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkgewotCQkJCQkJY21Ob2RlID0gbm9kZUxpc3QuaXRlbSgwKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChjbU5vZGUgIT0gbnVsbCkgewotCQkJCQl2aXNpdENNTm9kZShjbU5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGUuZ2V0T3BlcmF0b3IoKSA9PSBDTUdyb3VwLkFMTCAvLyBBTEwKLQkJCQkJCXx8IGUuZ2V0T3BlcmF0b3IoKSA9PSBDTUdyb3VwLlNFUVVFTkNFKSAvLyBTRVFVRU5DRQotCQkJewotCQkJCS8vIHZpc2l0IGFsbCBvZiB0aGUgY29udGVudAotCQkJCXN1cGVyLnZpc2l0Q01Hcm91cChlKTsKLQkJCX0KLQkJfQotCi0JCWNtR3JvdXBTdGFjay5wb3AoKTsKLQl9Ci0KLQlzdGF0aWMgaW50IGNvdW50ID0gMDsKLQotCXB1YmxpYyB2b2lkIHZpc2l0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKSB7Ci0JCWlmIChhbHdheXNWaXNpdCB8fCBidWlsZE9wdGlvbmFsQXR0cmlidXRlcyhidWlsZFBvbGljeSkgfHwgYWQuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKSB7Ci0JCQlhbHdheXNWaXNpdCA9IGZhbHNlOwotCQkJU3RyaW5nIG5hbWUgPSBjb21wdXRlTmFtZShhZCwgY3VycmVudFBhcmVudCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSB2YWx1ZUhlbHBlci5nZXRWYWx1ZShhZCwgbmFtZXNwYWNlVGFibGUpOwotCQkJQXR0ciBhdHRyID0gY3JlYXRlQXR0cmlidXRlKGFkLCBuYW1lLCBjdXJyZW50UGFyZW50KTsKLQkJCWF0dHIuc2V0VmFsdWUodmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCQlsaW5rTm9kZShhdHRyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQWJzdHJhY3QoQ01Ob2RlIGVkKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChlZCAhPSBudWxsKSB7Ci0JCQlPYmplY3QgdmFsdWUgPSBlZC5nZXRQcm9wZXJ0eSgiQWJzdHJhY3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0ID0gKHZhbHVlID09IEJvb2xlYW4uVFJVRSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0U3Vic3RpdHV0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IGVkOwotCQlDTU5vZGVMaXN0IGwgPSAoQ01Ob2RlTGlzdCkgZWQuZ2V0UHJvcGVydHkoIlN1YnN0aXR1dGlvbkdyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGwgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlDTU5vZGUgY2FuZGlkYXRlID0gbC5pdGVtKGkpOwotCQkJCWlmICghaXNBYnN0cmFjdChjYW5kaWRhdGUpICYmIChjYW5kaWRhdGUgaW5zdGFuY2VvZiBDTUVsZW1lbnREZWNsYXJhdGlvbikpIHsKLQkJCQkJcmVzdWx0ID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBjYW5kaWRhdGU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRQYXJlbnRDTUVsZW1lbnREZWNsYXJhdGlvbigpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBudWxsOwotCQlpbnQgbGlzdFNpemUgPSB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LnNpemUoKTsKLQkJaWYgKGxpc3RTaXplID4gMCkgewotCQkJZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIHZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QuZ2V0KGxpc3RTaXplIC0gMSk7Ci0JCX0KLQkJcmV0dXJuIGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Q01BbnlFbGVtZW50KENNQW55RWxlbWVudCBhbnlFbGVtZW50KSB7Ci0JCS8vIGluZ25vcmUgYnVpbGRQb2xpY3kgZm9yIEFOWSBlbGVtZW50cy4uLiBvbmx5IGNyZWF0ZSBlbGVtZW50cyBpZgotCQkvLyBhYnNvbHV0ZWx5IG5lZWRlZAotCQkvLwotCQlpbnQgZm9yY2VkTWluID0gYWx3YXlzVmlzaXQgPyAxIDogMDsKLQkJaW50IG1pbiA9IE1hdGgubWF4KGFueUVsZW1lbnQuZ2V0TWluT2NjdXIoKSwgZm9yY2VkTWluKTsKLQkJYWx3YXlzVmlzaXQgPSBmYWxzZTsKLQotCQlTdHJpbmcgdXJpID0gYW55RWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLQkJU3RyaW5nIHRhcmdldE5TUHJvcGVydHkgPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSI7IC8vJE5PTi1OTFMtMSQKLQkJQ01Eb2N1bWVudCBwYXJlbnRDTURvY3VtZW50ID0gKENNRG9jdW1lbnQpIGFueUVsZW1lbnQuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG51bGw7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJwYXJlbnRDTURvY3VtZW50ID0gIiArIHBhcmVudENNRG9jdW1lbnQpOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCWlmIChwYXJlbnRDTURvY3VtZW50ICE9IG51bGwpIHsKLQkJCWlmICh1cmkgPT0gbnVsbCB8fCB1cmkuc3RhcnRzV2l0aCgiIyMiKSB8fCB1cmkuZXF1YWxzKHBhcmVudENNRG9jdW1lbnQuZ2V0UHJvcGVydHkodGFyZ2V0TlNQcm9wZXJ0eSkpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJZWQgPSBnZXRTdWl0YWJsZUVsZW1lbnQoZ2V0UGFyZW50Q01FbGVtZW50RGVjbGFyYXRpb24oKSwgcGFyZW50Q01Eb2N1bWVudCk7Ci0JCQl9Ci0JCX0KLQotCi0JCWlmIChlZCA9PSBudWxsICYmIGV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQgIT0gbnVsbCAmJiB1cmkgIT0gbnVsbCAmJiAhdXJpLnN0YXJ0c1dpdGgoIiMjIikgJiYgY3VycmVudFBhcmVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJQ01Eb2N1bWVudCBleHRlcm5hbENNRG9jdW1lbnQgPSBleHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0LmdldENNRG9jdW1lbnQoKEVsZW1lbnQpIGN1cnJlbnRQYXJlbnQsIHVyaSk7Ci0JCQlpZiAoZXh0ZXJuYWxDTURvY3VtZW50ICE9IG51bGwpIHsKLQkJCQllZCA9IGdldFN1aXRhYmxlRWxlbWVudChudWxsLCBleHRlcm5hbENNRG9jdW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbWluOyBpKyspIHsKLQkJCWlmIChlZCAhPSBudWxsKSB7Ci0JCQkJdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihlZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJBTlktRUxFTUVOVCIpOyAvLyROT04tTkxTLTEkCi0JCQkJbGlua05vZGUoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0U3VpdGFibGVFbGVtZW50KENNTmFtZWROb2RlTWFwIG5hbWVOb2RlTWFwKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0JCWludCBzaXplID0gbmFtZU5vZGVNYXAuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBjYW5kaWRhdGUgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIG5hbWVOb2RlTWFwLml0ZW0oaSk7Ci0JCQlpZiAoIXZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QuY29udGFpbnMoY2FuZGlkYXRlKSkgewotCQkJCXJlc3VsdCA9IGNhbmRpZGF0ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRTdWl0YWJsZUVsZW1lbnQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIENNRG9jdW1lbnQgY21Eb2N1bWVudCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotCi0JCWlmIChlZCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRTdWl0YWJsZUVsZW1lbnQoZWQuZ2V0TG9jYWxFbGVtZW50cygpKTsKLQkJfQotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCAmJiBjbURvY3VtZW50ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGdldFN1aXRhYmxlRWxlbWVudChjbURvY3VtZW50LmdldEVsZW1lbnRzKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGxpbmtOb2RlKE5vZGUgbm9kZSkgewotCQlpZiAoYXR0YWNoTm9kZXNUb1BhcmVudCAmJiBjdXJyZW50UGFyZW50ICE9IG51bGwpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCSgoRWxlbWVudCkgY3VycmVudFBhcmVudCkuc2V0QXR0cmlidXRlTm9kZSgoQXR0cikgbm9kZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljdXJyZW50UGFyZW50LmFwcGVuZENoaWxkKG5vZGUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHJlc3VsdExpc3QgIT0gbnVsbCkgewotCQkJcmVzdWx0TGlzdC5hZGQobm9kZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFBvcHVsYXRlRG9jdW1lbnRGcm9tR3JhbW1hckZpbGUoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBncmFtbWFyRmlsZU5hbWUsIFN0cmluZyByb290RWxlbWVudE5hbWUsIGJvb2xlYW4gaGFjaykgewotCQl0cnkgewotCQkJQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gQ29udGVudE1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNNRG9jdW1lbnQoZ3JhbW1hckZpbGVOYW1lLCBudWxsKTsKLQkJCUNNTmFtZWROb2RlTWFwIGVsZW1lbnRNYXAgPSBjbURvY3VtZW50LmdldEVsZW1lbnRzKCk7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50TWFwLmdldE5hbWVkSXRlbShyb290RWxlbWVudE5hbWUpOwotCi0JCQlET01Db250ZW50QnVpbGRlckltcGwgY29udGVudEJ1aWxkZXIgPSBuZXcgRE9NQ29udGVudEJ1aWxkZXJJbXBsKGRvY3VtZW50KTsKLQkJCWNvbnRlbnRCdWlsZGVyLnN1cHJlc3NDcmVhdGlvbk9mRG9jdHlwZUFuZFhNTERlY2xhcmF0aW9uID0gaGFjazsKLQkJCWNvbnRlbnRCdWlsZGVyLmNyZWF0ZURlZmF1bHRSb290Q29udGVudChjbURvY3VtZW50LCBlbGVtZW50KTsKLQotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJCURPTVdyaXRlciB3cml0ZXIgPSBuZXcgRE9NV3JpdGVyKCk7Ci0JCQlpZiAoaGFjaykgewotCQkJCXdyaXRlci5wcmludChkb2N1bWVudCwgZ3JhbW1hckZpbGVOYW1lKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXdyaXRlci5wcmludChkb2N1bWVudCk7Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6ICIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8vIHRlc3QKLQkvLwotCS8qCi0JICogcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ1tdKSB7IGlmIChhcmcubGVuZ3RoID49IDIpIHsgdHJ5IHsKLQkgKiBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkucmVnaXN0ZXJDTURvY3VtZW50QnVpbGRlcldpdGhDbGFzc05hbWUoIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9maW1wbC5DTURvY3VtZW50QnVpbGRlckltcGwiKTsKLQkgKiAKLQkgKiBTdHJpbmcgZ3JhbW1hckZpbGVOYW1lID0gYXJnWzBdOyBTdHJpbmcgcm9vdEVsZW1lbnROYW1lID0gYXJnWzFdOwotCSAqIAotCSAqIERvY3VtZW50IGRvY3VtZW50ID0KLQkgKiAoRG9jdW1lbnQpQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS54ZXJjZXMuZG9tLkRvY3VtZW50SW1wbCIpLm5ld0luc3RhbmNlKCk7Ci0JICogdGVzdFBvcHVsYXRlRG9jdW1lbnRGcm9tR3JhbW1hckZpbGUoZG9jdW1lbnQsIGdyYW1tYXJGaWxlTmFtZSwKLQkgKiByb290RWxlbWVudE5hbWUsIHRydWUpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCSAqIFN5c3RlbS5vdXQucHJpbnRsbigiRE9NQ29udGVudEJ1aWxkZXJJbXBsIGVycm9yIik7IGUucHJpbnRTdGFja1RyYWNlKCk7IH0gfQotCSAqIGVsc2UgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlIDogamF2YQotCSAqIG9yZy5lY2xpcHNlLndzdC54bWwudXRpbC5ET01Db250ZW50QnVpbGRpbmdDTVZpc2l0b3IgZ3JhbW1hckZpbGVOYW1lCi0JICogcm9vdEVsZW1lbnROYW1lIik7IH0gfQotCSAqLwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NTmFtZXNwYWNlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01OYW1lc3BhY2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5ZDQ0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01OYW1lc3BhY2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBET01OYW1lc3BhY2VIZWxwZXIKLXsgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFVSSUZvclByZWZpeChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwcmVmaXgpCi0gIHsgICAgICAgICAgICAgIAotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotCSAgU3RyaW5nIG5zQXR0ck5hbWUgPSBudWxsOwotCSAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApIAotICAgIHsKLQkJICBuc0F0dHJOYW1lID0gInhtbG5zOiIgKyBwcmVmaXg7IC8vJE5PTi1OTFMtMSQKLQkgIH0KLQkgIGVsc2UgCi0gICAgewotCQkgIG5zQXR0ck5hbWUgPSAieG1sbnMiOyAvLyROT04tTkxTLTEkCi0JICB9Ci0gICAgICAgICAgICAKLSAgICAvLyBhc3N1bWUgdGhlIG5vZGUgaXMgcXVhbGlmaWVkLi4uIGxvb2sgdXAgdGhlIFVSSSBiYXNlIG9uIHRoZSBwcmVmaXgKLSAgICAvLwotCSAgZm9yIChOb2RlIG5vZGUgPSBlbGVtZW50OyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKSkgCi0gICAgewotCSAgIAlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotICAgICAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSAoRWxlbWVudClub2RlOwotCQkgICAgQXR0ciBhdHRyID0gdGhlRWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKG5zQXR0ck5hbWUpOwotCQkgICAgaWYgKGF0dHIgIT0gbnVsbCkgCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBhdHRyLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgICAgICAgCi0gICAgLy8gc2VlIGlmIHdlIGNhbiBmaW5kIHNvbWUgaW5mbyBmcm9tIGFuICdpbXBsaWNpdCcgbmFtZXNwYWNlCi0gICAgLy8KLSAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBOYW1lc3BhY2VUYWJsZSB0YWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgICByZXN1bHQgPSB0YWJsZS5nZXRVUklGb3JQcmVmaXgocHJlZml4KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKE5vZGUgbm9kZSkKLSAgeyAgICAgICAgICAgIAotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgeyAgICAgICAgICAgICAgIAotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpbm9kZTsKLSAgICAgIFN0cmluZyBwcmVmaXggPSBlbGVtZW50LmdldFByZWZpeCgpOwotICAgICAgcmVzdWx0ID0gZ2V0VVJJRm9yUHJlZml4KGVsZW1lbnQsIHByZWZpeCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotICAgIHsgICAgICAKLSAgICAgIEF0dHIgYXR0ciA9IChBdHRyKW5vZGU7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gYXR0ci5nZXRQcmVmaXgoKTsKLSAgICAgIHJlc3VsdCA9IGdldFVSSUZvclByZWZpeChhdHRyLmdldE93bmVyRWxlbWVudCgpLCBwcmVmaXgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgICAgICAgICAgICAgICAKLQotICAvLyB0b2RvLi4uIHRoaXMgaXMgYW4gdWdseSBoYWNrLi4uIG5lZWRzIHRvIGJlIGZpeGVkCi0gIC8vCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXB1dGVQcmVmaXgoQ01Ob2RlIGNtTm9kZSwgTm9kZSBwYXJlbnROb2RlKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChOb2RlIG5vZGUgPSBwYXJlbnROb2RlOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKSkKLSAgICB7Ci0gICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXRQcmVmaXgobm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgICAgCi0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICBpbnQgaW5kZXggPSBuYW1lLmluZGV4T2YoIjoiKTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICBwcmVmaXggPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgfQotICAgIHJldHVybiBwcmVmaXg7Ci0gIH0KLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVucHJlZml4ZWROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgfQotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlTmFtZShDTU5vZGUgY21Ob2RlLCBOb2RlIHBhcmVudCwgU3RyaW5nIHByZWZpeCkKLSAgeyAgICAgCi0gICAgcmV0dXJuIGNvbXB1dGVOYW1lKGNtTm9kZSwgcGFyZW50LCBwcmVmaXgsIG51bGwpOwotICB9ICAgCi0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlTmFtZShDTU5vZGUgY21Ob2RlLCBOb2RlIHBhcmVudCwgU3RyaW5nIHByZWZpeCwgTmFtZXNwYWNlVGFibGUgbmFtZXNwYWNlVGFibGUpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gY21Ob2RlLmdldE5vZGVOYW1lKCk7Ci0KLSAgICAvLyBpZiB0aGUgY21Ob2RlIGhhcyBhIGhhcmQgY29kZWQgcHJlZml4IHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZwotICAgIC8vCi0gICAgaWYgKGdldFByZWZpeChyZXN1bHQpID09IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgCi0gICAgICBTdHJpbmcgcXVhbGlmaWNhdGlvbiA9IChTdHJpbmcpY21Ob2RlLmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvbnNQcmVmaXhRdWFsaWZpY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIC8vIHNlZSBpZiB3ZSBuZWVkIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgLy8KLSAgICAgIGlmIChxdWFsaWZpY2F0aW9uICE9IG51bGwgJiYgcXVhbGlmaWNhdGlvbi5lcXVhbHMoInF1YWxpZmllZCIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7ICAgICAgICAgICAgCi0gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgICAgICAgICAgICAgICAgIAotICAgICAgICB7Ci0gICAgICAgICAgLy8gdG9kby4uLiBhZGQgZ2V0Q01Eb2N1bWVudCgpIG1ldGhvZCB0byBDTU5vZGUKLSAgICAgICAgICAvLyBmb3Igbm93IHVzZSB0aGlzIGdldFByb3BlcnR5KCkgaGFjawotICAgICAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWNtTm9kZS5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkgICAgICAgICAgCi0gICAgICAgICAgeyAgICAgCi0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gKFN0cmluZyljbURvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIik7ICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsgICAKLSAgICAgICAgICAgICAgLy8gdXNlIHRoZSBOYW1lc3BhY2VUYWJsZSB0byBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IHByZWZpeCBmb3IgdGhpcyBuYW1lc3BhY2UgdXJpCi0gICAgICAgICAgICAgIC8vICAgICAgCi0gICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VUYWJsZSA9PSBudWxsKQotICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSA/IChEb2N1bWVudClwYXJlbnQgOiBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZVRhYmxlID0gbmV3IE5hbWVzcGFjZVRhYmxlKGRvY3VtZW50KTsKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBuYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50TGluZWFnZSgoRWxlbWVudClwYXJlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBwcmVmaXggPSBuYW1lc3BhY2VUYWJsZS5nZXRQcmVmaXhGb3JVUkkobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBwcmVmaXggKyAiOiIgKyByZXN1bHQ7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgfSAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgCi0gIAotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0VVJJUXVhbGlmaWVkTmFtZUNvbXBvbmVudHMoU3RyaW5nIHVyaVF1YWxpZmllZE5hbWUpCi0gIHsKLSAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nWzJdOwotICAgIGludCBmaXJzdEluZGV4ID0gdXJpUXVhbGlmaWVkTmFtZS5pbmRleE9mKCJbIik7IC8vJE5PTi1OTFMtMSQKLSAgICBpbnQgbGFzdEluZGV4ID0gdXJpUXVhbGlmaWVkTmFtZS5pbmRleE9mKCJdIik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoZmlyc3RJbmRleCAhPSAtMSAmJiBsYXN0SW5kZXggPiBmaXJzdEluZGV4KQotICAgIHsKLSAgICAgIHJlc3VsdFswXSA9IHVyaVF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKGZpcnN0SW5kZXggKyAxLCBsYXN0SW5kZXgpOwotICAgICAgcmVzdWx0WzFdID0gdXJpUXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcobGFzdEluZGV4ICsgMSk7Ci0gICAgfSAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdFsxXSA9IHVyaVF1YWxpZmllZE5hbWU7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTU5hbWVzcGFjZUluZm9NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01OYW1lc3BhY2VJbmZvTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDdlZmJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTU5hbWVzcGFjZUluZm9NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIgICAgICAgICAgCi0gKgotICoKLSAqLwotcHVibGljIGNsYXNzIERPTU5hbWVzcGFjZUluZm9NYW5hZ2VyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0lfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsgLy8kTk9OLU5MUy0xJAotCi0gIHB1YmxpYyBET01OYW1lc3BhY2VJbmZvTWFuYWdlcigpCi0gIHsKLSAgfSAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIExpc3QgZ2V0TmFtZXNwYWNlSW5mb0xpc3QoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgTmFtZXNwYWNlSW5mb1JlYWRlciByZWFkZXIgPSBuZXcgTmFtZXNwYWNlSW5mb1JlYWRlcigpOwotICAgIHJldHVybiByZWFkZXIuZ2V0TmFtZXNwYWNlSW5mb0xpc3QoZWxlbWVudCk7Ci0gIH0gICAgICAgICAgICAKLSAgIAotICBwdWJsaWMgdm9pZCByZW1vdmVOYW1lc3BhY2VJbmZvKEVsZW1lbnQgZWxlbWVudCkKLSAgeyAgICAgCi0gICAgTmFtZXNwYWNlSW5mb1JlbW92ZXIgcmVtb3ZlciA9IG5ldyBOYW1lc3BhY2VJbmZvUmVtb3ZlcigpOwotICAgIHJlbW92ZXIucmVtb3ZlTmFtZXNwYWNlSW5mbyhlbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZUluZm8oRWxlbWVudCBlbGVtZW50LCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0LCBib29sZWFuIG5lZWRzWFNJKQotICB7ICAKLSAgICAvLyBmaXJzdCB3ZSBjcmVhdGUgYW4geG1sbnMgYXR0cmlidXRlIGZvciBlYWNoIG5hbWVzcGFjZQotICAgIC8vICAgICAgICAgICAgICAgICAgIAotICAgIERvY3VtZW50IGRvY3VtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvblZhbHVlID0gIiI7ICAgICAgLy8kTk9OLU5MUy0xJAotCi0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5hbWVzcGFjZUluZm9MaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE5hbWVzcGFjZUluZm8gbnNJbmZvID0gKE5hbWVzcGFjZUluZm8paXRlcmF0b3IubmV4dCgpOwotICAgICAgbnNJbmZvLm5vcm1hbGl6ZSgpOwotICAgICAgICAgICAgICAgCi0gICAgICBpZiAobnNJbmZvLnVyaSAhPSBudWxsKSAKLSAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gbnNJbmZvLnByZWZpeCAhPSBudWxsID8gInhtbG5zOiIgKyBuc0luZm8ucHJlZml4IDogInhtbG5zIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIEF0dHIgbmFtZXNwYWNlQXR0ciA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShhdHRyTmFtZSk7ICAKLSAgICAgICAgbmFtZXNwYWNlQXR0ci5zZXRWYWx1ZShuc0luZm8udXJpKTsKLSAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKG5hbWVzcGFjZUF0dHIpOyAgIAotCi0gICAgICAgIC8vIGluIHRoaXMgY2FzZSB3ZSB1c2UgdGhlIGF0dHJpYnV0ZSAieHNpOnNjaGVtYUxvY2F0aW9uIgotICAgICAgICAvLyBoZXJlIHdlIGJ1aWxkIHVwIGl0cyB2YWx1ZQotICAgICAgICAvLwotICAgICAgICBpZiAobnNJbmZvLmxvY2F0aW9uSGludCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc2NoZW1hTG9jYXRpb25WYWx1ZSArPSBuc0luZm8udXJpOwotICAgICAgICAgIHNjaGVtYUxvY2F0aW9uVmFsdWUgKz0gIiAiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgc2NoZW1hTG9jYXRpb25WYWx1ZSArPSBuc0luZm8ubG9jYXRpb25IaW50OwotICAgICAgICAgIHNjaGVtYUxvY2F0aW9uVmFsdWUgKz0gIiAiOyAgICAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gICAKLQotICAgICAgICBpZiAobnNJbmZvLnVyaS5lcXVhbHMoWFNJX1VSSSkpCi0gICAgICAgIHsKLSAgICAgICAgICBuZWVkc1hTSSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9ICAgICAKLSAgICAgIGVsc2UgaWYgKG5zSW5mby5sb2NhdGlvbkhpbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHdlIHVzZSB0aGUgYXR0cmlidXRlICJ4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbiIKLSAgICAgICAgLy8KLSAgICAgICAgQXR0ciBhdHRyID0gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKCJ4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbiIpOyAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXR0ci5zZXRWYWx1ZShuc0luZm8ubG9jYXRpb25IaW50KTsKLSAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotICAgICAgfSAKLSAgICB9IAotCi0gICAgaWYgKG5lZWRzWFNJKQotICAgIHsKLSAgICAgIC8vIHdlIGFkZCBhbiB4bWxuczp4c2kgYXR0cmlidXRlIHRvIGRlZmluZSAneHNpOnNjaGVtYUxvY2F0aW9uJyBhdHRyaWJ1dGUKLSAgICAgIC8vICAgCi0gICAgICBBdHRyIGF0dHIgPSBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoInhtbG5zOnhzaSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBhdHRyLnNldFZhbHVlKFhTSV9VUkkpOwotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotICAgIH0KLQotICAgIGlmIChzY2hlbWFMb2NhdGlvblZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICAvLyBjcmVhdGUgdGhlICJ4c2k6c2NoZW1hTG9jYXRpb24iIGF0dHJpYnV0ZQotICAgICAgLy8KLSAgICAgIEF0dHIgYXR0ciA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZSgieHNpOnNjaGVtYUxvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGF0dHIuc2V0VmFsdWUoc2NoZW1hTG9jYXRpb25WYWx1ZSk7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0gCi0gICAgICAgCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBOYW1lc3BhY2VJbmZvUmVhZGVyIGV4dGVuZHMgTmFtZXNwYWNlQXR0cmlidXRlVmlzaXRvcgotICB7ICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAgIHB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZUluZm9MaXN0KEVsZW1lbnQgZWxlbWVudCkKLSAgICB7Ci0gICAgICB2aXNpdEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgICByZXR1cm4gbmFtZXNwYWNlSW5mb0xpc3Q7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNJTm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbkF0dHJpYnV0ZShBdHRyIGF0dHIsIFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSBjcmVhdGVOYW1lc3BhY2VJbmZvKCk7Ci0gICAgICBpbmZvLmxvY2F0aW9uSGludCA9IHZhbHVlOyAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhNTE5hbWVzcGFjZUF0dHJpYnV0ZShBdHRyIGF0dHIsIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpCi0gICAgeyAgICAgICAgICAgCi0gICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSBjcmVhdGVOYW1lc3BhY2VJbmZvKCk7Ci0gICAgICBpbmZvLnVyaSA9IHVyaTsKLSAgICAgIGluZm8ucHJlZml4ID0gcHJlZml4OyAgICAgIAotICAgICAgc3VwZXIudmlzaXRYTUxOYW1lc3BhY2VBdHRyaWJ1dGUoYXR0ciwgcHJlZml4LCB1cmkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNJU2NoZW1hTG9jYXRpb25WYWx1ZVBhaXIoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2F0aW9uSGludCkKLSAgICB7ICAgIAotICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gZ2V0TmFtZXNwYWNlSW5mb0ZvclVSSSh1cmkpOyAgICAgICAgICAgIAotICAgICAgaWYgKGluZm8gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW5mby5sb2NhdGlvbkhpbnQgPSBsb2NhdGlvbkhpbnQ7Ci0gICAgICB9IAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpbmZvID0gY3JlYXRlTmFtZXNwYWNlSW5mbygpOwotICAgICAgICBpbmZvLnVyaSA9IHVyaTsKLSAgICAgICAgaW5mby5sb2NhdGlvbkhpbnQgPSBsb2NhdGlvbkhpbnQ7Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBwcm90ZWN0ZWQgTmFtZXNwYWNlSW5mbyBnZXROYW1lc3BhY2VJbmZvRm9yVVJJKFN0cmluZyB1cmkpCi0gICAgeyAgICAKLSAgICAgIE5hbWVzcGFjZUluZm8gcmVzdWx0ID0gbnVsbDsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5hbWVzcGFjZUluZm9MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKWkubmV4dCgpOwotICAgICAgICBpZiAoaW5mby51cmkgIT0gbnVsbCAmJiBpbmZvLnVyaS5lcXVhbHModXJpKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGluZm87Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAgICAKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfSAgICAgCi0KLSAgICBwcm90ZWN0ZWQgTmFtZXNwYWNlSW5mbyBjcmVhdGVOYW1lc3BhY2VJbmZvKCkKLSAgICB7Ci0gICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotICAgICAgbmFtZXNwYWNlSW5mb0xpc3QuYWRkKGluZm8pOwotICAgICAgcmV0dXJuIGluZm87Ci0gICAgfQotICB9Ci0gICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBOYW1lc3BhY2VJbmZvUmVtb3ZlciBleHRlbmRzIE5hbWVzcGFjZUF0dHJpYnV0ZVZpc2l0b3IKLSAgeyAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBhdHRyaWJ1dGVzVG9SZW1vdmUgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVOYW1lc3BhY2VJbmZvKEVsZW1lbnQgZWxlbWVudCkKLSAgICB7ICAKLSAgICAgIHZpc2l0RWxlbWVudChlbGVtZW50KTsKLSAgICAgIHJlbW92ZUF0dHJpYnV0ZXMoKTsKLSAgICB9ICAgCi0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTSU5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb25BdHRyaWJ1dGUoQXR0ciBhdHRyLCBTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgYXR0cmlidXRlc1RvUmVtb3ZlLmFkZChhdHRyKTsKLSAgICB9ICAgICAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhNTE5hbWVzcGFjZUF0dHJpYnV0ZShBdHRyIGF0dHIsIFN0cmluZyBuYW1lc3BhY2VQcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gICAgeyAgIAotICAgICAgYXR0cmlidXRlc1RvUmVtb3ZlLmFkZChhdHRyKTsKLSAgICAgIHN1cGVyLnZpc2l0WE1MTmFtZXNwYWNlQXR0cmlidXRlKGF0dHIsIG5hbWVzcGFjZVByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0lTY2hlbWFMb2NhdGlvbkF0dHJpYnV0ZShBdHRyIGF0dHIsIFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICBhdHRyaWJ1dGVzVG9SZW1vdmUuYWRkKGF0dHIpOwotICAgIH0gICAKLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZXMoKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGF0dHJpYnV0ZXNUb1JlbW92ZS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBBdHRyIGF0dHIgPSAoQXR0cilpLm5leHQoKTsKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLSAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAKLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTVZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTVZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0MmY3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01WaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLS8vIHRvZG8uLiBtb3ZlIHRoaXMgY2xhc3MgdG8gYW5vdGhlciBwYWNrYWdlIChwZXJoYXBzIHhtbHV0aWxpdHkpCi0vLwotcHVibGljIGNsYXNzIERPTVZpc2l0b3IKLXsgICAgICAgICAKLSAgcHVibGljIHZvaWQgdmlzaXROb2RlKE5vZGUgbm9kZSkKLSAgewotICAgIHN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKQotICAgIHsKLSAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHZpc2l0QXR0cigoQXR0cilub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgdmlzaXRDREFUQVNlY3Rpb24oKENEQVRBU2VjdGlvbilub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgdmlzaXRDb21tZW50KChDb21tZW50KW5vZGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgdmlzaXREb2N1bWVudCgoRG9jdW1lbnQpbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHZpc2l0RG9jdW1lbnRUeXBlKChEb2N1bWVudFR5cGUpbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHZpc2l0RWxlbWVudCgoRWxlbWVudClub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgdmlzaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oKFByb2Nlc3NpbmdJbnN0cnVjdGlvbilub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgdmlzaXRUZXh0KChUZXh0KW5vZGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9ICAKLSAgfSAgICAKLSAgICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXREb2N1bWVudChEb2N1bWVudCBkb2N1bWVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAKLSAgICB2aXNpdENoaWxkTm9kZXNIZWxwZXIoZG9jdW1lbnQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXREb2N1bWVudFR5cGUoRG9jdW1lbnRUeXBlIGRvY3R5cGUpCi0gIHsgICAgICAgICAKLQotICB9ICAKLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7ICAgICAgICAKLSAgICB2aXNpdEF0dHJpYnV0ZXNIZWxwZXIoZWxlbWVudCk7Ci0gICAgdmlzaXRDaGlsZE5vZGVzSGVscGVyKGVsZW1lbnQpOwotICB9IAotIAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0QXR0cihBdHRyIGF0dHIpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFRleHQoVGV4dCB0ZXh0KQotICB7ICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRDREFUQVNlY3Rpb24oQ0RBVEFTZWN0aW9uIGNkYXRhU2VjdGlvbikKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0gICAgIAotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0Q29tbWVudChDb21tZW50IGNvbW1lbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgCi0gIH0gICAKLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbihQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkpCi0gIHsgICAgCi0gIH0KLSAKLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdENoaWxkTm9kZXNIZWxwZXIoTm9kZSBub2RlKQotICB7Ci0gICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCi0gICAgewotICAgICAgdmlzaXROb2RlKGNoaWxkcmVuLml0ZW0oaSkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QXR0cmlidXRlc0hlbHBlcihOb2RlIG5vZGUpCi0gIHsKLSAgICBOYW1lZE5vZGVNYXAgbWFwID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXAuZ2V0TGVuZ3RoKCk7IGkrKyApCi0gICAgewotICAgICAgdmlzaXROb2RlKG1hcC5pdGVtKGkpKTsKLSAgICB9Ci0gIH0gICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTVdyaXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YTExNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0vKioKLSAqIFRoaXMgaXMgYSBoYWNrZWQgdXAgZG9tIHdyaXRlciBzdG9sZW4gZnJvbSBhIFhlcmNlcyBzYW1wbGUuCi0gKiBJJ2QgbGlrZSB0byB1c2UgYW4gZXhpc2l0bmcgJ2dlbmVyaWMgRE9NJyB3cml0ZXIKLSAqIElmIGFueW9uZSBjYW4gZmluZCBzdWNoIGEgdGhpbmcgdGhlbiBwbGVhc2UgZ28gYWhlYWQgYW5kIGp1bmsgdGhpcy4KLSAqCi0gKiBAdmVyc2lvbgotICovCi1wdWJsaWMgY2xhc3MgRE9NV3JpdGVyCi17Ci0gIHByb3RlY3RlZCBib29sZWFuIGZvcm1hdHRpbmdFbmFibGVkID0gdHJ1ZTsKLSAgIHByb3RlY3RlZCBib29sZWFuIG91dHB1dERvY3R5cGVFbmFibGVkID0gdHJ1ZTsKLSAgIHByb3RlY3RlZCBQcmludFdyaXRlciBvdXQ7Ci0gICBwcm90ZWN0ZWQgaW50IGluZGVudCA9IDA7ICAKLQotICAgcHVibGljIERPTVdyaXRlcigpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICB7Ci0gICAgIHRoaXMoU3lzdGVtLm91dCk7Ci0gICB9Ci0KLSAgIHB1YmxpYyBET01Xcml0ZXIoT3V0cHV0U3RyZWFtIG91dHB1dFN0ZWFtKQotICAgewotICAgICBvdXQgPSBuZXcgUHJpbnRXcml0ZXIob3V0cHV0U3RlYW0pOwotICAgfQotCi0gICBwdWJsaWMgRE9NV3JpdGVyKFdyaXRlciB3cml0ZXIpCi0gICB7Ci0gICAgIG91dCA9IG5ldyBQcmludFdyaXRlcih3cml0ZXIpOwotICAgfQotCi0gICBwdWJsaWMgdm9pZCBzZXRGb3JtYXR0aW5nRW5hYmxlZChib29sZWFuIGVuYWJsZWQpCi0gICB7Ci0gICAgIGZvcm1hdHRpbmdFbmFibGVkID0gZW5hYmxlZDsKLSAgIH0KLQotICAgcHVibGljIGJvb2xlYW4gZ2V0Rm9ybWF0dGluZ0VuYWJsZWQoKQotICAgewotICAgICByZXR1cm4gZm9ybWF0dGluZ0VuYWJsZWQ7Ci0gICB9Ci0KLSAgIHB1YmxpYyB2b2lkIHNldE91dHB1dERvY3R5cGVFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkKLSAgIHsKLSAgICAgb3V0cHV0RG9jdHlwZUVuYWJsZWQgPSBlbmFibGVkOwotICAgfQotCi0gICBwdWJsaWMgY2xhc3MgWE1MVmlzaXRvcgotICAgewotICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjdXJyZW50RWxlbWVudEhhc0NoaWxkRWxlbWVudHMgPSBmYWxzZTsKLQotICAgICBwdWJsaWMgdm9pZCB2aXNpdE5vZGUoTm9kZSBub2RlKQotICAgICB7Ci0gICAgICAgc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpCi0gICAgICAgewotICAgICAgICAgY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXRBdHRyKChBdHRyKW5vZGUpOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotICAgICAgICAgewotICAgICAgICAgICB2aXNpdENEQVRBU2VjdGlvbigoQ0RBVEFTZWN0aW9uKW5vZGUpOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotICAgICAgICAgewotICAgICAgICAgICB2aXNpdENvbW1lbnQoKENvbW1lbnQpbm9kZSk7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX05PREUgOgotICAgICAgICAgewotICAgICAgICAgICB2aXNpdERvY3VtZW50KChEb2N1bWVudClub2RlKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXREb2N1bWVudFR5cGUoKERvY3VtZW50VHlwZSlub2RlKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXRFbGVtZW50KChFbGVtZW50KW5vZGUpOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotICAgICAgICAgewotICAgICAgICAgICB2aXNpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbigoUHJvY2Vzc2luZ0luc3RydWN0aW9uKW5vZGUpOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgTm9kZS5URVhUX05PREUgOgotICAgICAgICAgewotICAgICAgICAgICB2aXNpdFRleHQoKFRleHQpbm9kZSk7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0RG9jdW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQpCi0gICAgIHsKLSAgICAgICB2aXNpdENoaWxkTm9kZXNIZWxwZXIoZG9jdW1lbnQpOwotICAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXREb2N1bWVudFR5cGUoRG9jdW1lbnRUeXBlIGRvY3R5cGUpCi0gICAgIHsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIGlmIChvdXRwdXREb2N0eXBlRW5hYmxlZCkKLSAgICAgICB7Ci0gICAgICAgICBTdHJpbmcgZGF0YSA9IGdldERvY3VtZW50VHlwZURhdGEoZG9jdHlwZSk7Ci0gICAgICAgICBwcmludCgiPCFET0NUWVBFICIgKyBkYXRhICsgIj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgfQotICAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBpZiAoIWRvU2hvdyhlbGVtZW50KSkKLSAgICAgICAgIHJldHVybjsKLQotICAgICAgIGJvb2xlYW4gcGFyZW50RWxlbWVudEhhc0NoaWxkTm9kZXMgPSBjdXJyZW50RWxlbWVudEhhc0NoaWxkRWxlbWVudHM7Ci0gICAgICAgY3VycmVudEVsZW1lbnRIYXNDaGlsZEVsZW1lbnRzID0gaGFzQ2hpbGRFbGVtZW50cyhlbGVtZW50KTsKLQotICAgICAgIHByaW50SW5kZW50KCk7Ci0gICAgICAgcHJpbnQoIjwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIHByaW50KGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgdmlzaXRBdHRyaWJ1dGVzSGVscGVyKGVsZW1lbnQpOwotCi0gICAgICAgYm9vbGVhbiBoYXNDaGlsZE5vZGVzID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPiAwOyAgICAgICAgICAgICAgICAKLSAgICAgICBib29sZWFuIGlzUm9vdEVsZW1lbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERTsKLSAgICAgICBpZiAoaGFzQ2hpbGROb2RlcyB8fCBpc1Jvb3RFbGVtZW50KQotICAgICAgIHsKLSAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudEhhc0NoaWxkRWxlbWVudHMgfHwgaXNSb290RWxlbWVudCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgcHJpbnRsbigiPiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByaW50KCI+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgIH0KLSAgICAgICAgIGluZGVudCArPSAyOwotICAgICAgICAgdmlzaXRDaGlsZE5vZGVzSGVscGVyKGVsZW1lbnQpOwotICAgICAgICAgaW5kZW50IC09IDI7Ci0KLSAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudEhhc0NoaWxkRWxlbWVudHMgfHwgaXNSb290RWxlbWVudCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgcHJpbnRJbmRlbnQoKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHByaW50KCI8LyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICBwcmludChlbGVtZW50LmdldE5vZGVOYW1lKCkpOwotICAgICAgICAgcHJpbnRsbigiPiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgfQotICAgICAgIGVsc2UKLSAgICAgICB7Ci0gICAgICAgICBwcmludGxuKCIvPiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgfQotCi0gICAgICAgY3VycmVudEVsZW1lbnRIYXNDaGlsZEVsZW1lbnRzID0gcGFyZW50RWxlbWVudEhhc0NoaWxkTm9kZXM7Ci0gICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB2aXNpdEF0dHIoQXR0ciBhdHRyKQotICAgICB7Ci0gICAgICAgcHJpbnQoIiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIHByaW50KGF0dHIuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgcHJpbnQoIj1cIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgcHJpbnQoY3JlYXRlUHJpbnRhYmxlQ2hhcmFjdGVyRGF0YShhdHRyLmdldFZhbHVlKCkpKTsKLSAgICAgICBwcmludCgiXCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXRUZXh0KFRleHQgdGV4dCkKLSAgICAgewotICAgICAgIGlmIChjdXJyZW50RWxlbWVudEhhc0NoaWxkRWxlbWVudHMpCi0gICAgICAgewotICAgICAgICAgcHJpbnRJbmRlbnQoKTsKLSAgICAgICAgIHByaW50KGNyZWF0ZVByaW50YWJsZUNoYXJhY3RlckRhdGEodGV4dC5nZXROb2RlVmFsdWUoKSkpOwotICAgICAgICAgcHJpbnRsbigpOwotICAgICAgIH0KLSAgICAgICBlbHNlCi0gICAgICAgewotICAgICAgICAgcHJpbnQoY3JlYXRlUHJpbnRhYmxlQ2hhcmFjdGVyRGF0YSh0ZXh0LmdldE5vZGVWYWx1ZSgpKSk7Ci0gICAgICAgfQotICAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXRDREFUQVNlY3Rpb24oQ0RBVEFTZWN0aW9uIGNkYXRhU2VjdGlvbikKLSAgICAgewotICAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXRDb21tZW50KENvbW1lbnQgY29tbWVudCkKLSAgICAgewotICAgICAgIHByaW50SW5kZW50KCk7Ci0gICAgICAgcHJpbnQoIjwhLS0iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIHByaW50KGNvbW1lbnQuZ2V0Tm9kZVZhbHVlKCkpOwotICAgICAgIHByaW50bG4oIi0tPiIpOyAvLyROT04tTkxTLTEkCi0gICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB2aXNpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbihQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkpCi0gICAgIHsKLSAgICAgICBwcmludEluZGVudCgpOwotICAgICAgIHByaW50KCI8PyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgcHJpbnQocGkuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgcHJpbnQoIiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIHByaW50KHBpLmdldE5vZGVWYWx1ZSgpKTsKLSAgICAgICBwcmludGxuKCI/PiIpOyAvLyROT04tTkxTLTEkCi0gICAgIH0KLSAgICAgICAgICAgICAKLQotICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZEVsZW1lbnRzKE5vZGUgbm9kZSkKLSAgICAgewotICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCi0gICAgICAgewotICAgICAgICAgaWYgKGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB2aXNpdENoaWxkTm9kZXNIZWxwZXIoTm9kZSBub2RlKQotICAgICB7Ci0gICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCi0gICAgICAgewotICAgICAgICAgdmlzaXROb2RlKGNoaWxkcmVuLml0ZW0oaSkpOwotICAgICAgIH0KLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlc0hlbHBlcihOb2RlIG5vZGUpCi0gICAgIHsKLSAgICAgICBOYW1lZE5vZGVNYXAgbWFwID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXAuZ2V0TGVuZ3RoKCk7IGkrKyApCi0gICAgICAgewotICAgICAgICAgdmlzaXROb2RlKG1hcC5pdGVtKGkpKTsKLSAgICAgICB9Ci0gICAgIH0KLSAgIH0KLQotICAvKiogYW4gdWdseSBoYWNrIHVudGlsIEkgcmVzdHJ1Y3QgdGhpcyBjb2RlIGEgbGl0dGxlCi0gICAqICAKLSAgICovICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZG9TaG93KEVsZW1lbnQgZWxlbWVudCkgICAgCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgLyoqIGNvbnZlcnRzIERPTSB0ZXh0IHZhbHVlcyB0byAncHJpbnRhYmxlJyB2YWx1ZXMgCi0gICAqICAtIGNvbnZlcnRzICcmJyB0byAnJmFtcDsnCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZVByaW50YWJsZUNoYXJhY3RlckRhdGEoU3RyaW5nIHN0cmluZykKLSAgeyAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgaW50IGluZGV4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHdoaWxlICh0cnVlKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpbnQgYW1wZXJzYW5kSW5kZXggPSBzdHJpbmcuaW5kZXhPZigiJiIsIGluZGV4KTsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKGFtcGVyc2FuZEluZGV4ICE9IC0xKQotICAgICAgewotICAgICAgICByZXN1bHQgKz0gc3RyaW5nLnN1YnN0cmluZyhpbmRleCwgYW1wZXJzYW5kSW5kZXgpOwotICAgICAgICByZXN1bHQgKz0gIiZhbXA7IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpbmRleCA9IGFtcGVyc2FuZEluZGV4ICsgMTsgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gCi0gICAgcmVzdWx0ICs9IHN0cmluZy5zdWJzdHJpbmcoaW5kZXgpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qKiBQcmludHMgdGhlIHNwZWNpZmllZCBub2RlLCByZWN1cnNpdmVseS4gKi8KLSAgcHVibGljIHZvaWQgcHJpbnQoTm9kZSBub2RlKQotICB7Ci0gICAgLy8gaXMgdGhlcmUgYW55dGhpbmcgdG8gZG8/Ci0gICAgaWYgKG5vZGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYTUxWaXNpdG9yIHZpc2l0b3IgPSBuZXcgWE1MVmlzaXRvcigpOwotICAgICAgdmlzaXRvci52aXNpdE5vZGUobm9kZSk7Ci0gICAgfQotICAgIG91dC5mbHVzaCgpOwotICB9Ci0KLSAgLyoqIGEgdGVtcG9yYXJ5IGhhY2sgdG8gd29ya2Fyb3VuZCBvdXIgaW5hYmlsaXR5IHRvIGNyZWF0ZSBhIERvY3VtZW50VHlwZSB0YWcqLwotICBwdWJsaWMgdm9pZCBwcmludChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGdyYW1tYXJVUkwpCi0gIHsKLSAgICBTdHJpbmcgc3lzdGVtSWQgPSBudWxsOwotICAgIGlmIChncmFtbWFyVVJMLmVuZHNXaXRoKCJkdGQiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIGludCBsYXN0U2xhc2hJbmRleCA9IE1hdGgubWF4KGdyYW1tYXJVUkwubGFzdEluZGV4T2YoIi8iKSwgZ3JhbW1hclVSTC5sYXN0SW5kZXhPZigiXFwiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgaWYgKGxhc3RTbGFzaEluZGV4ICE9IC0xKQotICAgICAgewotICAgICAgICBzeXN0ZW1JZCA9IGdyYW1tYXJVUkwuc3Vic3RyaW5nKGxhc3RTbGFzaEluZGV4ICsgMSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHByaW50KGRvY3VtZW50LCAiVVRGLTgiLCBncmFtbWFyVVJMLCBudWxsLCBzeXN0ZW1JZCk7IC8vJE5PTi1OTFMtMSQKLQotICB9Ci0KLSAgLyoqIGEgdGVtcG9yYXJ5IGhhY2sgdG8gd29ya2Fyb3VuZCBvdXIgaW5hYmlsaXR5IHRvIGNyZWF0ZSBhIERvY3VtZW50VHlwZSB0YWcqLwotICBwdWJsaWMgdm9pZCBwcmludChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgZ3JhbW1hckZpbGVOYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgewotICAgIG91dC5wcmludGxuKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIiICsgIiBlbmNvZGluZz1cIiIgKyBlbmNvZGluZyArICJcIj8+Iik7ICAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICBpZiAoZ3JhbW1hckZpbGVOYW1lLmVuZHNXaXRoKCIuZHRkIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBTdHJpbmcgZG9jVHlwZUxpbmUgPSAiPCFET0NUWVBFICIgKyBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXROb2RlTmFtZSgpICsgIiAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIGlmIChwdWJsaWNJZCAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgZG9jVHlwZUxpbmUgKz0gIlBVQkxJQyBcIiIgKyBwdWJsaWNJZCArICJcIiAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgaWYgKHN5c3RlbUlkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBkb2NUeXBlTGluZSArPSAiXCIiICsgc3lzdGVtSWQgKyAiXCIgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIH0KLSAgICAgICAgZG9jVHlwZUxpbmUgKz0gIj4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG91dC5wcmludGxuKGRvY1R5cGVMaW5lKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHN5c3RlbUlkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGRvY1R5cGVMaW5lICs9ICJTWVNURU0gXCIiICsgc3lzdGVtSWQgKyAiXCIgPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBvdXQucHJpbnRsbihkb2NUeXBlTGluZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHByaW50KGRvY3VtZW50KTsKLSAgfSAgCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RG9jdW1lbnRUeXBlRGF0YShEb2N1bWVudFR5cGUgZG9jdHlwZSkKLSAgewotICAgIFN0cmluZyBkYXRhID0gZG9jdHlwZS5nZXROYW1lKCk7Ci0gICAgaWYgKGRvY3R5cGUuZ2V0UHVibGljSWQoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGRhdGEgKz0gIiBQVUJMSUMgXCIiICsgZG9jdHlwZS5nZXRQdWJsaWNJZCgpICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICBTdHJpbmcgc3lzdGVtSWQgPSBkb2N0eXBlLmdldFN5c3RlbUlkKCk7Ci0gICAgICBpZiAoc3lzdGVtSWQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc3lzdGVtSWQgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZGF0YSArPSAiIFwiIiArIHN5c3RlbUlkICsgIlwiIjsgICAgICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGRhdGEgKz0gIiBTWVNURU0gXCIiICsgZG9jdHlwZS5nZXRTeXN0ZW1JZCgpICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICAgIHJldHVybiBkYXRhOwotICB9ICAgICAKLQotICBwdWJsaWMgdm9pZCBwcmludGxuKCkKLSAgewotICAgIGlmIChmb3JtYXR0aW5nRW5hYmxlZCkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByaW50bG4oU3RyaW5nIHN0cmluZykKLSAgewotICAgIGlmIChmb3JtYXR0aW5nRW5hYmxlZCkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbihzdHJpbmcpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3V0LnByaW50KHN0cmluZyk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJpbnRJbmRlbnQoKQotICB7ICAgICAgICAgICAgIAotICAgIGlmIChmb3JtYXR0aW5nRW5hYmxlZCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKQotICAgICAgewotICAgICAgICBvdXQucHJpbnQoIiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLSAgfSAgICAgICAKLQotICBwdWJsaWMgdm9pZCBwcmludChTdHJpbmcgc3RyaW5nKQotICB7Ci0gICAgb3V0LnByaW50KHN0cmluZyk7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvSW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvSW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGEzYzQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0luZmVycmVkR3JhbW1hckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLy8gdGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBidWlsZCBhIGdyYW1tYXIgZG9jdW1lbnQgZ2l2ZW4gYSBsb2NhbCBmaWxlIG5hbWUKLS8vCi1wdWJsaWMgaW50ZXJmYWNlIEluZmVycmVkR3JhbW1hckZhY3RvcnkKLXsgICAKLSAgcHVibGljIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudChTdHJpbmcgdXJpKTsgCi0gIHB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVDTUVsZW1lbnREZWNsYXJhdGlvbihDTURvY3VtZW50IGNtRG9jdW1lbnQsIEVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiBpc0xvY2FsKTsKLSAgcHVibGljIHZvaWQgY3JlYXRlQ01Db250ZW50KENNRG9jdW1lbnQgcGFyZW50Q01Eb2N1bWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50RWQsIENNRG9jdW1lbnQgY2hpbGRDTURvY3VtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBjaGlsZEVkLCBib29sZWFuIGlzTG9jYWwsIFN0cmluZyB1cmkpOwotICBwdWJsaWMgdm9pZCBkZWJ1Z1ByaW50KENvbGxlY3Rpb24gY29sbGVjdGlvbik7IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvTmFtZXNwYWNlQXR0cmlidXRlVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvTmFtZXNwYWNlQXR0cmlidXRlVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGQxOTNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL05hbWVzcGFjZUF0dHJpYnV0ZVZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIGJ1ZyAxOTg4MDcgLSBhdHRyaWJ1dGUgb3JkZXIgZGVwZW5kYW5jeS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZUF0dHJpYnV0ZVZpc2l0b3IKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfU0NIRU1BX0lOU1RBTkNFX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyB4c2lQcmVmaXggPSAieHNpIjsgLy8kTk9OLU5MUy0xJAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0WE1MTmFtZXNwYWNlQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIG5hbWVzcGFjZVByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgeyAgIAotICAgIGlmIChuYW1lc3BhY2VVUkkuZXF1YWxzKFhNTF9TQ0hFTUFfSU5TVEFOQ0VfVVJJKSkKLSAgICB7Ci0gICAgICB4c2lQcmVmaXggPSBuYW1lc3BhY2VQcmVmaXg7Ci0gICAgfQotICB9IAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0WFNJTm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbkF0dHJpYnV0ZShBdHRyIGF0dHIsIFN0cmluZyB2YWx1ZSkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRYU0lTY2hlbWFMb2NhdGlvbkF0dHJpYnV0ZShBdHRyIGF0dHIsIFN0cmluZyB2YWx1ZSkKLSAgewotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUpOyAgICAgICAgICAKLSAgICB3aGlsZSAodHJ1ZSkKLSAgICB7Ci0gICAgICBTdHJpbmcgbnNVUkkgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7Ci0gICAgICBTdHJpbmcgbG9jYXRpb25IaW50ID0gc3QuaGFzTW9yZVRva2VucygpID8gc3QubmV4dFRva2VuKCkgOiBudWxsOyAgICAgICAgICAgIAotICAgICAgaWYgKG5zVVJJICE9IG51bGwgJiYgbG9jYXRpb25IaW50ICE9IG51bGwpCi0gICAgICB7ICAgIAotICAgICAgICB2aXNpdFhTSVNjaGVtYUxvY2F0aW9uVmFsdWVQYWlyKG5zVVJJLCBsb2NhdGlvbkhpbnQpOyAgICAgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9ICAgCi0KLSAgcHVibGljIHZvaWQgdmlzaXRYU0lTY2hlbWFMb2NhdGlvblZhbHVlUGFpcihTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYXRpb25IaW50KQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgTmFtZWROb2RlTWFwIG1hcCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotICAgIGludCBtYXBMZW5ndGggPSBtYXAuZ2V0TGVuZ3RoKCk7Ci0gICAgCi0gICAgLy8gRmlyc3QgcmV0cmlldmUgYWxsIHRoZSBuYW1lc3BhY2VzIHNvIHRoYXQgdGhleSBhcmUgbG9hZGVkIGJlZm9yZQotICAgIC8vIGRvaW5nIGFueSBzcGVjaWFsIHByZWZpeCBoYW5kbGluZy4gIFRoaXMgYWxsb3dzIHRoZSBhdHRyaWJ1dGVzIHRvIGJlCi0gICAgLy8gZGVmaW5lZCBpbiBhbnkgb3JkZXIsIGJ1dCB0aGUgbmFtZXNwYWNlcyBoYXZlIHRvIGJlIHJldHJpZXZlZCBmaXJzdC4KLSAgICAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcExlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIEF0dHIgYXR0ciA9IChBdHRyKW1hcC5pdGVtKGkpOwotICAgICAgU3RyaW5nIHByZWZpeCA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRQcmVmaXgoYXR0ci5nZXROYW1lKCkpOwotICAgICAgU3RyaW5nIHVucHJlZml4ZWROYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKGF0dHIuZ2V0TmFtZSgpKTsKLSAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiB1bnByZWZpeGVkTmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAocHJlZml4LmVxdWFscygieG1sbnMiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRYTUxOYW1lc3BhY2VBdHRyaWJ1dGUoYXR0ciwgdW5wcmVmaXhlZE5hbWUsIGF0dHIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHVucHJlZml4ZWROYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICh1bnByZWZpeGVkTmFtZS5lcXVhbHMoInhtbG5zIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0WE1MTmFtZXNwYWNlQXR0cmlidXRlKGF0dHIsICIiLCBhdHRyLmdldFZhbHVlKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0gICAgICAKLQotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwTGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgQXR0ciBhdHRyID0gKEF0dHIpbWFwLml0ZW0oaSk7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFByZWZpeChhdHRyLmdldE5hbWUoKSk7Ci0gICAgICBTdHJpbmcgdW5wcmVmaXhlZE5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0VW5wcmVmaXhlZE5hbWUoYXR0ci5nZXROYW1lKCkpOwotICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHVucHJlZml4ZWROYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgCWlmIChwcmVmaXguZXF1YWxzKHhzaVByZWZpeCkgJiYgdW5wcmVmaXhlZE5hbWUuZXF1YWxzKCJzY2hlbWFMb2NhdGlvbiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdFhTSVNjaGVtYUxvY2F0aW9uQXR0cmlidXRlKGF0dHIsIGF0dHIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocHJlZml4LmVxdWFscyh4c2lQcmVmaXgpICYmIHVucHJlZml4ZWROYW1lLmVxdWFscygibm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdFhTSU5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb25BdHRyaWJ1dGUoYXR0ciwgYXR0ci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvTmFtZXNwYWNlSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvTmFtZXNwYWNlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmFmOTFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL05hbWVzcGFjZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlSW5mbwoteyAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgU3RyaW5nIHVyaTsKLSAgcHVibGljIFN0cmluZyBwcmVmaXg7Ci0gIHB1YmxpYyBTdHJpbmcgbG9jYXRpb25IaW50OwotICBwdWJsaWMgYm9vbGVhbiBpc1ByZWZpeFJlcXVpcmVkOyAKLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBoYXNodGFibGU7Ci0KLSAgcHVibGljIE5hbWVzcGFjZUluZm8oKQotICB7Ci0gIH0KLQotICBwdWJsaWMgTmFtZXNwYWNlSW5mbyhTdHJpbmcgdXJpLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbG9jYXRpb25IaW50KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy51cmkgPSB1cmk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKLSAgICB0aGlzLmxvY2F0aW9uSGludCA9IGxvY2F0aW9uSGludDsKLSAgfSAgIAotCi0gIHB1YmxpYyBOYW1lc3BhY2VJbmZvKE5hbWVzcGFjZUluZm8gdGhhdCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy51cmkgPSB0aGF0LnVyaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMucHJlZml4ID0gdGhhdC5wcmVmaXg7Ci0gICAgdGhpcy5sb2NhdGlvbkhpbnQgPSB0aGF0LmxvY2F0aW9uSGludDsKLSAgICAvLyB0b2RvLi4uIHNlZSBpZiB3ZSBuZWVkIHRvIGNsb25lIHRoZSBoYXN0YWJsZSAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG5vcm1hbGl6ZSgpCi0gIHsKLSAgICB1cmkgPSBnZXROb3JtYWxpemVkVmFsdWUodXJpKTsKLSAgICBwcmVmaXggID0gZ2V0Tm9ybWFsaXplZFZhbHVlKHByZWZpeCk7Ci0gICAgbG9jYXRpb25IaW50PSBnZXROb3JtYWxpemVkVmFsdWUobG9jYXRpb25IaW50KTsKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9ybWFsaXplZFZhbHVlKFN0cmluZyBzdHJpbmcpCi0gIHsKLSAgICByZXR1cm4gKHN0cmluZyAhPSBudWxsICYmIHN0cmluZy50cmltKCkubGVuZ3RoKCkgPT0gMCkgPyBudWxsIDogc3RyaW5nOwotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgaWYgKGhhc2h0YWJsZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGhhc2h0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB9Ci0gICAgaGFzaHRhYmxlLnB1dChwcm9wZXJ0eSwgdmFsdWUpOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICByZXR1cm4gKGhhc2h0YWJsZSAhPSBudWxsKSA/IGhhc2h0YWJsZS5nZXQocHJvcGVydHkpIDogbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBjbG9uZU5hbWVzcGFjZUluZm9MaXN0KExpc3Qgb2xkTGlzdCkKLSAgeyAgCi0gICAgTGlzdCBuZXdMaXN0ID0gbmV3IFZlY3RvcihvbGRMaXN0LnNpemUoKSk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gb2xkTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE5hbWVzcGFjZUluZm8gb2xkSW5mbyA9IChOYW1lc3BhY2VJbmZvKWkubmV4dCgpOwotICAgICAgbmV3TGlzdC5hZGQobmV3IE5hbWVzcGFjZUluZm8ob2xkSW5mbykpOwotICAgIH0gICAgICAgICAgICAgICAKLSAgICByZXR1cm4gbmV3TGlzdDsKLSAgfQotfSAgICAgIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvTmFtZXNwYWNlVGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL05hbWVzcGFjZVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YTI1NDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvTmFtZXNwYWNlVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlVGFibGUgZXh0ZW5kcyBOYW1lc3BhY2VBdHRyaWJ1dGVWaXNpdG9yCi17ICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgSGFzaHRhYmxlIGhhc2h0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotICBwdWJsaWMgTmFtZXNwYWNlVGFibGUoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsgICAgICAgICAKLQkgIHRoaXMoKTsKLSAgICAvL0RPTUV4dGVuc2lvbiBkb21FeHRlbnNpb24gPSBET01FeHRlbnNpb25Qcm92aWRlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RE9NRXh0ZW5zaW9uKGRvY3VtZW50KTsKLSAgICAvL2lmIChkb21FeHRlbnNpb24gIT0gbnVsbCkKLSAgICAvL3sgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vICBhZGROYW1lc3BhY2VJbmZvTGlzdChkb21FeHRlbnNpb24uZ2V0SW1wbGljdE5hbWVzcGFjZUluZm9MaXN0KCksIHRydWUpOwotICAgIC8vIH0KLSAgfSAgIAotCi0gIHByaXZhdGUgTmFtZXNwYWNlVGFibGUoKQotICB7ICAgICAgIAotCSAgc3VwZXIoKTsKLSAgfSAgCi0KLSAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VFbmNvdW50ZXJlZCgpCi0gIHsKLSAgICByZXR1cm4gaGFzaHRhYmxlLnZhbHVlcygpLnNpemUoKSA+IDA7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeEZvclVSSShTdHJpbmcgdXJpKQotICB7ICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBOYW1lc3BhY2VJbmZvIGVudHJ5ID0gZ2V0TmFtZXNwYWNlSW5mb0ZvclVSSSh1cmksIHRydWUpOwotICAgIGlmIChlbnRyeSAhPSBudWxsKSAKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlbnRyeS5wcmVmaXg7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAgICAKLQotICBwdWJsaWMgU3RyaW5nIGdldFVSSUZvclByZWZpeChTdHJpbmcgcHJlZml4KQotICB7ICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSBnZXROYW1lc3BhY2VJbmZvRm9yUHJlZml4KHByZWZpeCk7Ci0gICAgaWYgKGluZm8gIT0gbnVsbCkgCi0gICAgewotICAgICAgcmVzdWx0ID0gaW5mby51cmk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotCi0gICAgICAgICAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzTWF0Y2hpbmdTdHJpbmcoU3RyaW5nIGEsIFN0cmluZyBiKQotICB7Ci0gICAgcmV0dXJuICgoYSA9PSBudWxsICYmIGIgPT0gbnVsbCkgfHwgKGEgIT0gbnVsbCAmJiBiICE9IG51bGwgJiYgYS5lcXVhbHMoYikpKTsKLSAgfQotICAgCi0KLSAgcHVibGljIE5hbWVzcGFjZUluZm8gZ2V0TmFtZXNwYWNlSW5mb0ZvclVSSShTdHJpbmcgdXJpKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gZ2V0TmFtZXNwYWNlSW5mb0ZvclVSSSh1cmksIGZhbHNlKTsKLSAgfQotCi0KLSAgcHVibGljIE5hbWVzcGFjZUluZm8gZ2V0TmFtZXNwYWNlSW5mb0ZvclVSSShTdHJpbmcgdXJpLCBib29sZWFuIHRlc3RJbXBsaWVkKQotICB7Ci0gICAgTmFtZXNwYWNlSW5mbyByZXN1bHQgPSBudWxsOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGhhc2h0YWJsZS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsgICAgICAgICAgICAgICAgICAgIAotICAgICAgTmFtZXNwYWNlSW5mbyBuc0luZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsgCi0gICAgICBpZiAoaXNNYXRjaGluZ1N0cmluZyhuc0luZm8udXJpLCB1cmkpKQotICAgICAgeyAgICAgICAgICAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IG5zSW5mbzsKLSAgICAgICAgaWYgKHRlc3RJbXBsaWVkICYmIG5zSW5mby5nZXRQcm9wZXJ0eSgiaXNJbXBsaWVkIikgIT0gbnVsbCkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgLy8gY29udGludWUKLSAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotCi0KLSAgcHVibGljIHZvaWQgc2V0TG9jYXRpb25IaW50Rm9yVVJJKFN0cmluZyB1cmksIFN0cmluZyBsb2NhdGlvbkhpbnQpCi0gIHsgICAgICAKLSAgIC8vIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBoYXNodGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgIE5hbWVzcGFjZUluZm8gbnNJbmZvID0gKE5hbWVzcGFjZUluZm8paS5uZXh0KCk7IAotICAgICAgaWYgKGlzTWF0Y2hpbmdTdHJpbmcobnNJbmZvLnVyaSwgdXJpKSkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBuc0luZm8ubG9jYXRpb25IaW50ID0gbG9jYXRpb25IaW50OwotICAgICAgfQotICAgIH0KLSAgfQotICAgIAotCi0gIHB1YmxpYyBOYW1lc3BhY2VJbmZvIGdldE5hbWVzcGFjZUluZm9Gb3JQcmVmaXgoU3RyaW5nIHByZWZpeCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJlZml4ID0gcHJlZml4ICE9IG51bGwgPyBwcmVmaXggOiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIHJldHVybiAoTmFtZXNwYWNlSW5mbyloYXNodGFibGUuZ2V0KHByZWZpeCk7Ci0gIH0gICAKLQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0WE1MTmFtZXNwYWNlQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIG5hbWVzcGFjZVByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE5hbWVzcGFjZUluZm8gbnNJbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsgICAgICAKLSAgICBuc0luZm8ucHJlZml4ID0gbmFtZXNwYWNlUHJlZml4OwotICAgIG5zSW5mby51cmkgPSBuYW1lc3BhY2VVUkk7ICAgICAgCi0gICAKLSAgICBOYW1lc3BhY2VJbmZvIG1hdGNoaW5nTmFtZXNwYWNlSW5mbyA9IGdldE5hbWVzcGFjZUluZm9Gb3JVUkkobmFtZXNwYWNlVVJJKTsKLSAgICBpZiAobWF0Y2hpbmdOYW1lc3BhY2VJbmZvICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgbnNJbmZvLmxvY2F0aW9uSGludCA9IG1hdGNoaW5nTmFtZXNwYWNlSW5mby5sb2NhdGlvbkhpbnQ7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBpbnRlcm5hbEFkZE5hbWVzcGFjZUluZm8obmFtZXNwYWNlUHJlZml4LCBuc0luZm8pOwotCi0gICAgc3VwZXIudmlzaXRYTUxOYW1lc3BhY2VBdHRyaWJ1dGUoYXR0ciwgbmFtZXNwYWNlUHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICB9IAotICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgdmlzaXRYU0lTY2hlbWFMb2NhdGlvblZhbHVlUGFpcihTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYXRpb25IaW50KQotICB7Ci0gICAgc2V0TG9jYXRpb25IaW50Rm9yVVJJKHVyaSwgbG9jYXRpb25IaW50KTsKLSAgfSAgIAotCi0gIHB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZUluZm8oTmFtZXNwYWNlSW5mbyBpbmZvKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIGtleSAgPSAoaW5mby5wcmVmaXggIT0gbnVsbCkgPyBpbmZvLnByZWZpeCA6ICIiOyAvLyROT04tTkxTLTEkCi0gICAgaW50ZXJuYWxBZGROYW1lc3BhY2VJbmZvKGtleSwgaW5mbyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbEFkZE5hbWVzcGFjZUluZm8oU3RyaW5nIGtleSwgTmFtZXNwYWNlSW5mbyBpbmZvKQotICB7Ci0gICAgaGFzaHRhYmxlLnB1dChrZXksIGluZm8pOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkTmFtZXNwYWNlSW5mb0xpc3QoTGlzdCBsaXN0LCBib29sZWFuIGlzSW1wbGllZCkKLSAgeyAgICAgICAKLSAgICBpZiAobGlzdCAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8paS5uZXh0KCk7Ci0gICAgICAgIE5hbWVzcGFjZUluZm8gY2xvbmUgPSBuZXcgTmFtZXNwYWNlSW5mbyhpbmZvKTsgICAgCi0gICAgICAgIGlmIChpc0ltcGxpZWQpCi0gICAgICAgIHsKLSAgICAgICAgICBjbG9uZS5zZXRQcm9wZXJ0eSgiaXNJbXBsaWVkIiwgInRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIH0KLSAgICAgICAgYWRkTmFtZXNwYWNlSW5mbyhjbG9uZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlSW5mb0xpc3QoTGlzdCBsaXN0KQotICB7ICAKLSAgICBhZGROYW1lc3BhY2VJbmZvTGlzdChsaXN0LCBmYWxzZSk7ICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0WFNJTm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbkF0dHJpYnV0ZShBdHRyIGF0dHIsIFN0cmluZyBsb2NhdGlvbkhpbnQpCi0gIHsKLSAgICBhZGROb05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uKGxvY2F0aW9uSGludCk7Ci0gIH0gCi0KLSAgcHVibGljIHZvaWQgYWRkTm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbihTdHJpbmcgbG9jYXRpb25IaW50KQotICB7Ci0gICAgTmFtZXNwYWNlSW5mbyBuc0luZm8gPSBuZXcgTmFtZXNwYWNlSW5mbygpOyAgICAgIAotICAgIG5zSW5mby5wcmVmaXggPSBudWxsOwotICAgIG5zSW5mby51cmkgPSAiIjsgICAgICAgLy8kTk9OLU5MUy0xJAotICAgIG5zSW5mby5sb2NhdGlvbkhpbnQgPSBsb2NhdGlvbkhpbnQ7ICAKLSAgICBpbnRlcm5hbEFkZE5hbWVzcGFjZUluZm8oIiIsIG5zSW5mbyk7IC8vJE5PTi1OTFMtMSQKLSAgfSAKLQotICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2VJbmZvKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmksIFN0cmluZyBsb2NhdGlvbkhpbnQpCi0gIHsKLSAgICBOYW1lc3BhY2VJbmZvIG5zSW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7ICAgICAgCi0gICAgbnNJbmZvLnByZWZpeCA9IHByZWZpeDsKLSAgICBuc0luZm8udXJpID0gdXJpOyAgICAgIAotICAgIG5zSW5mby5sb2NhdGlvbkhpbnQgPSBsb2NhdGlvbkhpbnQ7ICAKLSAgICBpbnRlcm5hbEFkZE5hbWVzcGFjZUluZm8ocHJlZml4ICE9IG51bGwgPyBwcmVmaXggOiAiIiwgbnNJbmZvKTsgLy8kTk9OLU5MUy0xJAotICB9IAotCi0gIHB1YmxpYyB2b2lkIGFkZEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7ICAgCi0gICAgdmlzaXRFbGVtZW50KGVsZW1lbnQpOyAgCi0gIH0gICAgICAKLSAgICAgICAgIAotICBwdWJsaWMgdm9pZCBhZGRFbGVtZW50TGluZWFnZShFbGVtZW50IHRhcmdldEVsZW1lbnQpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBOYW1lc3BhY2VUYWJsZS5nZXRFbGVtZW50TGluZWFnZSh0YXJnZXRFbGVtZW50KTsgICAgICAgICAgICAgICAgIAotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudClpLm5leHQoKTsKLSAgICAgIGFkZEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgfSAgICAgICAgICAgIAotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldEVsZW1lbnRMaW5lYWdlKEVsZW1lbnQgZWxlbWVudCkKLSAgeyAgICAgICAgICAKLSAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsgICAgICAgICAgICAgCi0gICAgZm9yIChOb2RlIG5vZGUgPSBlbGVtZW50OyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFkZCgwLCBub2RlKTsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgCi0KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0TmFtZXNwYWNlSW5mb0NvbGxlY3Rpb24oKQotICB7ICAgICAgICAgICAgICAKLSAgICByZXR1cm4gaGFzaHRhYmxlLnZhbHVlcygpOwotICB9IAotCi0gIHB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZUluZm9MaXN0KCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgbGlzdC5hZGRBbGwoaGFzaHRhYmxlLnZhbHVlcygpKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotfSAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1lbWZNb2RlbFN5bmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbWYyeG1sL0VNRjJET01TU0VBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtZW1mTW9kZWxTeW5jaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW1mMnhtbC9FTUYyRE9NU1NFQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2Q2ZjVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1lbWZNb2RlbFN5bmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbWYyeG1sL0VNRjJET01TU0VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW1mMnhtbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTUFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkVNRjJET01SZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5ET01VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGNsYXNzIEVNRjJET01TU0VBZGFwdGVyIGV4dGVuZHMgRU1GMkRPTUFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyIHsKLQlwdWJsaWMgRU1GMkRPTVNTRUFkYXB0ZXIoTm9kZSBub2RlLCBFTUYyRE9NUmVuZGVyZXIgcmVuZGVyZXIsIFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgewotCQlzdXBlcihub2RlLCByZW5kZXJlciwgdHJhbnNsYXRvcik7Ci0JfQotCi0JcHVibGljIEVNRjJET01TU0VBZGFwdGVyKE5vdGlmaWVyIG9iamVjdCwgTm9kZSBub2RlLCBFTUYyRE9NUmVuZGVyZXIgcmVuZGVyZXIsIFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgewotCQlzdXBlcihvYmplY3QsIG5vZGUsIHJlbmRlcmVyLCB0cmFuc2xhdG9yKTsKLQl9Ci0KLQlwdWJsaWMgRU1GMkRPTVNTRUFkYXB0ZXIoVHJhbnNsYXRvclJlc291cmNlIHJlc291cmNlLCBEb2N1bWVudCBkb2N1bWVudCwgRU1GMkRPTVJlbmRlcmVyIHJlbmRlcmVyLCBUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJc3VwZXIocmVzb3VyY2UsIGRvY3VtZW50LCByZW5kZXJlciwgdHJhbnNsYXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBjYWxjSW5kZW50U3RyaW5nKE5vZGUgbm9kZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUpOwotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCAiTm9kZSBtdXN0IGJlIGNvbm5lY3RlZCBpbnRvIHRoZSB0cmVlIik7IC8vJE5PTi1OTFMtMSQKLQotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCVN0cmluZyBpbmRlbnRTdHJpbmcgPSBnZXROZXdsaW5lU3RyaW5nKG5vZGUpOwotCi0JCS8vIEZpbmQgaW5kZW50YXRpb24gc3RyaW5nIGZvciB0aGlzIG5vZGUgYmFzZWQgb24gaXRzIHNpYmxpbmcgb3IKLQkJLy8gcGFyZW50Ci0JCU5vZGUgcHJldmlvdXNTaWJsaW5nID0gRE9NVXRpbGl0aWVzLmdldFByZXZpb3VzTm9kZVNpYmxpbmcobm9kZSk7Ci0JCWlmIChwcmV2aW91c1NpYmxpbmcgIT0gbnVsbCkgewotCQkJaW5kZW50U3RyaW5nID0gcHJpbUdldEluZGVudFN0cmluZyhwcmV2aW91c1NpYmxpbmcpOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIHBhcmVudEluZGVudFN0cmluZyA9IHByaW1HZXRJbmRlbnRTdHJpbmcocGFyZW50KTsKLQkJCWluZGVudFN0cmluZyA9IHBhcmVudEluZGVudFN0cmluZyArIERPTVV0aWxpdGllcy5JTkRFTlRfU1RSSU5HOwotCQl9Ci0JCXJldHVybiBpbmRlbnRTdHJpbmc7Ci0JfQotCi0JLyoKLQkgKiBQcmludHMgb3V0IGEgRE9NIG5vdGlmaWNhdGlvbiBmb3IgZGVidWdnaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlYnVnRE9NTm90aWZ5KElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJaWYgKGZEZWJ1ZykgewotCQkJU3RyaW5nIG5vdGlmVHlwZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlzd2l0Y2ggKGV2ZW50VHlwZSkgewotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5BREQgOgotCQkJCQlub3RpZlR5cGUgPSAiQUREIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElOb2RlTm90aWZpZXIuUkVNT1ZFIDoKLQkJCQkJbm90aWZUeXBlID0gIlJFTU9WRSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJTm9kZU5vdGlmaWVyLkNIQU5HRSA6Ci0JCQkJCW5vdGlmVHlwZSA9ICJDSEFOR0UiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5DT05URU5UX0NIQU5HRUQgOgotCQkJCQlub3RpZlR5cGUgPSAiQ09OVEVOVF9DSEFOR0VEIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQgOgotCQkJCQlub3RpZlR5cGUgPSAiU1RSVUNUVVJFX0NIQU5HRSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCAiRE9NIENoYW5nZTogIiArIG5vdGlmVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJcdG5vdGlmaWVyICAgICAgOiAiICsgbm90aWZpZXIpOyAvLyROT04tTkxTLTEkCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCAiXHRjaGFuZ2VkRmVhdHVyZTogIiArIGNoYW5nZWRGZWF0dXJlKTsgLy8kTk9OLU5MUy0xJAotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgIlx0b2xkVmFsdWUgICAgICA6ICIgKyBvbGRWYWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJcdG5ld1ZhbHVlICAgICAgOiAiICsgbmV3VmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNhYmxlVW5kb01hbmFnZW1lbnRJZk5lY2Vzc2FyeSgpIHsKLQkJSURPTU1vZGVsIG1vZGVsID0gZ2V0WE1MTW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuZ2V0VW5kb01hbmFnZXIoKSAhPSBudWxsKQotCQkJbW9kZWwuZGlzYWJsZVVuZG9NYW5hZ2VtZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlVW5kb01hbmFnZW1lbnQoKSB7Ci0JCUlET01Nb2RlbCBtb2RlbCA9IGdldFhNTE1vZGVsKCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmdldFVuZG9NYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCW1vZGVsLmVuYWJsZVVuZG9NYW5hZ2VtZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROZXdsaW5lU3RyaW5nKE5vZGUgbm9kZSkgewotCQkvKgotCQkgKiBXZSBzaG91bGQgYWx3YXlzIGhhdmUgSURPTU5vZGUsIGFuZCBJU3RydWN0dXJlZERvY3VtZW50LCBhbmQKLQkJICogY29uc3F1ZW50bHkgYSB2YWxpZCAicHJlZmVycmVkIiBsaW5lIGRlbGltaXRlciwgYnV0IGp1c3QgdG8gYmUKLQkJICogc2FmZSwgd2UnbGwgYXNzaWduIHNvbWV0aGluZyBieSBkZWZhdWx0LgotCQkgKi8KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJSURPTU5vZGUgeG1sTm9kZSA9IChJRE9NTm9kZSkgbm9kZTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQgPSB4bWxOb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcigpOwotCQkJfQotCQl9Ci0JCXJldHVybiBET01VdGlsaXRpZXMuTkVXTElORV9TVFJJTkc7Ci0JfQotCi0JcHJvdGVjdGVkIElET01Nb2RlbCBnZXRYTUxNb2RlbCgpIHsKLQkJaWYgKGdldE5vZGUoKSAhPSBudWxsKQotCQkJcmV0dXJuICgoSURPTU5vZGUpIGdldE5vZGUoKSkuZ2V0TW9kZWwoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElET01Ob2RlIGdldFhNTE5vZGUoKSB7Ci0JCXJldHVybiAoSURPTU5vZGUpIGdldE5vZGUoKTsKLQl9Ci0KLQkvKgotCSAqIERvIG5vdGhpbmcgZm9yIFNTRSwgd2Ugd2lsbCB0b2xlcmF0ZSBhbnl0aGluZyB0aGV5IGFkZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24oRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbiBleCkgewotCQkvLyBEbyBub3RoaW5nCi0JfQotCi0JLyoKLQkgKiBEbyBub3RoaW5nIGZvciBTU0UsIHdlIHdpbGwgdG9sZXJhdGUgYW55dGhpbmcgdGhleSBhZGQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVJbnZhbGlkTXVsdGlOb2RlcyhTdHJpbmcgbm9kZU5hbWUpIHsKLQkJLy8gRG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluZGVudChOb2RlIG5vZGUsIFRyYW5zbGF0b3IgbWFwKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobm9kZS5nZXRQYXJlbnROb2RlKCksICJOb2RlIG11c3QgYmUgY29ubmVjdGVkIGludG8gdGhlIHRyZWUiKTsgLy8kTk9OLU5MUy0xJAotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUpOwotCi0JCVN0cmluZyBpbmRlbnRTdHJpbmcgPSBjYWxjSW5kZW50U3RyaW5nKG5vZGUpOwotCi0JCS8vIEluZGVudCBiZWZvcmUgdGhlIHN0YXJ0IHRhZwotCQlpbmRlbnRTdGFydFRhZyhpbmRlbnRTdHJpbmcsIG5vZGUsIG1hcCk7Ci0KLQkJLy8gSW5kZW50IGJlZm9yZSB0aGUgZW5kIHRhZwotCQlpbmRlbnRFbmRUYWcoaW5kZW50U3RyaW5nLCBub2RlLCBtYXApOwotCX0KLQotCS8qKgotCSAqIEluZGVudCBiZWZvcmUgdGhlIGVuZCB0YWcgb2YgdGhlIDxub2RlPnBhc3NlZCBpbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbmRlbnRFbmRUYWcoU3RyaW5nIGluZGVudFN0cmluZywgTm9kZSBub2RlLCBUcmFuc2xhdG9yIG1hcCkgewotCQlpZiAoIW1hcC5zaG91bGRJbmRlbnRFbmRUYWcobm9kZSkpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBkb21QYXRoID0gbWFwLmdldERPTVBhdGgoKTsKLQotCQlpZiAoKCFtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSAmJiAhbWFwLmlzRE9NVGV4dFZhbHVlKCkpIHx8IChtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSAmJiBkb21QYXRoLmxlbmd0aCgpICE9IDApICYmIG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoZG9tUGF0aCkpIHsKLQkJCVRleHQgbmV3V1MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZShnZXROZXdsaW5lU3RyaW5nKG5vZGUpICsgaW5kZW50U3RyaW5nKTsgLy8kTk9OLU5MUy0xJAotCQkJRE9NVXRpbGl0aWVzLmluc2VydEJlZm9yZU5vZGUobm9kZSwgbmV3V1MsIG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5kZW50IGJlZm9yZSB0aGUgc3RhcnQgdGFnIG9mIHRoZSA8bm9kZT5wYXNzZWQgaW4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5kZW50U3RhcnRUYWcoU3RyaW5nIGluZGVudFN0cmluZywgTm9kZSBub2RlLCBUcmFuc2xhdG9yIG1hcCkgewotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlUZXh0IG5ld1dTID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoZ2V0TmV3bGluZVN0cmluZyhub2RlKSArIGluZGVudFN0cmluZyk7IC8vJE5PTi1OTFMtMSQKLQkJRE9NVXRpbGl0aWVzLmluc2VydEFmdGVyTm9kZShwYXJlbnQsIG5ld1dTLCBET01VdGlsaXRpZXMuZ2V0UHJldmlvdXNOb2RlU2libGluZyhub2RlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbXB0eVRhZyhFbGVtZW50IHBhcmVudCkgewotCQlyZXR1cm4gKChJRE9NRWxlbWVudCkgcGFyZW50KS5pc0VtcHR5VGFnKCk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgRE9NIG5vZGUgY2hhbmdlcy4gSXQgYXR0ZW1wdHMgdG8gdXBkYXRlCi0JICogTU9GIG9iamVjdCBiYXNlZCBvbiB0aGUgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQotCQlpZiAoIWlzTm90aWZpY2F0aW9uRW5hYmxlZCgpKQotCQkJcmV0dXJuOwotCi0JCWRlYnVnRE9NTm90aWZ5KG5vdGlmaWVyLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCi0JCWlmIChub3RpZmllciAhPSBnZXROb2RlKCkgJiYgZXZlbnRUeXBlICE9IElOb2RlTm90aWZpZXIuQ0hBTkdFKSB7Ci0JCQkvLyBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIHRoZSBub3RpZmljYXRpb24gd2FzIHNlbnQgZnJvbSBhCi0JCQkvLyBzdWIgbm9kZS4gVXNlIHRoZSBub3RpZmllcnMgbmFtZSB0byBkZXRlcm1pbmUgd2hpY2gKLQkJCS8vIE1PRiBmZWF0dXJlIHRvIHVwZGF0ZS4gTm90ZSB0aGF0IGlzIGlzIGFzc3VtZWQgdGhhdCBpZgotCQkJLy8gdGhlIGV2ZW50VHlwZSBpcyBDSEFOR0UgdGhlbiBpdCBhdHRyaWJ1dGUgb24gYSBwYXRoIG5vZGUKLQkJCS8vIGNoYW5naW5nLiBUaGlzIHdhcyBwdXQgaW4gZm9yIHRoZSBFR0wgZ3JvdXAuCi0JCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEIHx8IGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNPTlRFTlRfQ0hBTkdFRCB8fCBldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5DSEFOR0UpIHsKLQkJCQkJRWxlbWVudCBub3RpZnlpbmdOb2RlID0gKEVsZW1lbnQpIG5vdGlmaWVyOwotCQkJCQlUcmFuc2xhdG9yIG1hcCA9IGZpbmRUcmFuc2xhdG9yKG5vdGlmeWluZ05vZGUuZ2V0Tm9kZU5hbWUoKSwgZmFsc2UpOwotCQkJCQlpZiAobWFwICE9IG51bGwpCi0JCQkJCQl1cGRhdGVNT0ZGZWF0dXJlKG1hcCwgZ2V0Tm9kZSgpLCBnZXRFT2JqZWN0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIFVwZGF0ZSBldmVyeXRoaW5nIG9uIFNUUlVDVFVSRV9DSEFOR0Ugb3IgQ09OVEVOVF9DSEFOR0UuCi0JCQkvLyBPdGhlciBldmVudCB0eXBlcyBvY2N1ciB0b28gb2Z0ZW4uCi0JCQlpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQgfHwgZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VEKSB7Ci0JCQkJdXBkYXRlTU9GKCk7Ci0JCQl9Ci0JCQkvLyBVcGRhdGUganVzdCB0aGUgYXR0cmlidXRlIHRoYXQgY2hhbmdlZC4KLQkJCWVsc2UgaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNIQU5HRSkgewotCQkJCVRyYW5zbGF0b3IgbWFwID0gZmluZFRyYW5zbGF0b3IoY2hhbmdlZEZlYXR1cmUudG9TdHJpbmcoKSwgdHJ1ZSk7Ci0JCQkJaWYgKG1hcCAhPSBudWxsKQotCQkJCQl1cGRhdGVNT0ZGZWF0dXJlKG1hcCwgZ2V0Tm9kZSgpLCBnZXRFT2JqZWN0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9zdFVwZGF0ZURPTUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJZW5hYmxlVW5kb01hbmFnZW1lbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVVcGRhdGVET01GZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCXN1cGVyLnByZVVwZGF0ZURPTUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQlkaXNhYmxlVW5kb01hbmFnZW1lbnRJZk5lY2Vzc2FyeSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1BZGRET01BZGFwdGVyKE5vZGUgYU5vZGUsIEVNRjJET01BZGFwdGVyIGFuQWRhcHRlcikgewotCQkoKElET01Ob2RlKSBhTm9kZSkuYWRkQWRhcHRlcigoRU1GMkRPTVNTRUFkYXB0ZXIpIGFuQWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFkYXB0ZXIgZm9yIGEgY2hpbGQgRE9NIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgZm9yLgotCSAqLwotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBwcmltQ3JlYXRlQWRhcHRlcihFT2JqZWN0IG1vZk9iamVjdCwgVHJhbnNsYXRvciBjaGlsZE1hcCkgewotCQlFbGVtZW50IG5ld05vZGUgPSBjcmVhdGVOZXdOb2RlKG1vZk9iamVjdCwgY2hpbGRNYXApOwotCQlyZXR1cm4gbmV3IEVNRjJET01TU0VBZGFwdGVyKG1vZk9iamVjdCwgbmV3Tm9kZSwgZlJlbmRlcmVyLCBjaGlsZE1hcCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFkYXB0ZXIgZm9yIGEgY2hpbGQgRE9NIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgZm9yLgotCSAqLwotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBwcmltQ3JlYXRlQWRhcHRlcihOb2RlIG5vZGUsIFRyYW5zbGF0b3IgY2hpbGRNYXApIHsKLQkJcmV0dXJuIG5ldyBFTUYyRE9NU1NFQWRhcHRlcihub2RlLCBmUmVuZGVyZXIsIGNoaWxkTWFwKTsKLQl9Ci0JcHJvdGVjdGVkIEVNRjJET01BZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm9kZSBub2RlLCBUcmFuc2xhdG9yIGNoaWxkTWFwKSB7Ci0KLQkJLy9Bc3NlcnQuaXNOb3ROdWxsKGNoaWxkTWFwLmdldENoaWxkQWRhcHRlckNsYXNzKCkpOwotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUpOwotCi0JCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSBwcmltR2V0RXhpc3RpbmdBZGFwdGVyRm9yQ3JlYXRlKG5vZGUpOwotCi0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCWlmIChhZGFwdGVyLmlzTU9GUHJveHkoKSB8fCBhZGFwdGVyLmdldFRhcmdldCgpID09IG51bGwpIHsKLQkJCQlyZW1vdmVET01BZGFwdGVyKG5vZGUsIGFkYXB0ZXIpOwotCQkJCWlmIChhZGFwdGVyLmdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJCQkJYWRhcHRlci5nZXRUYXJnZXQoKS5lQWRhcHRlcnMoKS5yZW1vdmUoYWRhcHRlcik7Ci0JCQkJfQotCQkJCWFkYXB0ZXIgPSBudWxsOwotCQkJfQotCQl9IGVsc2UgewotCQkJYWRhcHRlciA9IHByaW1DcmVhdGVBZGFwdGVyKG5vZGUsIGNoaWxkTWFwKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgYWRkRE9NQWRhcHRlcihOb2RlIGNoaWxkTm9kZSkgewotCi0JCS8vIE9ubHkgYWRkIHRoZSBhZGFwdGVyIGlmIHRoaXMgaXMgYW4gY2hpbGQgbm9kZSB0aGF0IHdpbGwgbm90IGJlCi0JCS8vIGFkYXB0ZWQuIEZvciBpbnN0YW5jZSBhIHN1YnRyZWUgdGhhdCBtYXBzIHRvIGEgTU9GIGF0dHJpYnV0ZQotCQkvLyBzZXR0aW5nLgotCQlpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVNRjJET01BZGFwdGVyIGF0dHJBZGFwdGVyID0gcHJpbUdldEV4aXN0aW5nQWRhcHRlckZvckNyZWF0ZShjaGlsZE5vZGUpOwotCi0JCQlpZiAoYXR0ckFkYXB0ZXIgPT0gbnVsbCB8fCBhdHRyQWRhcHRlci5nZXROb2RlKCkgIT0gZ2V0Tm9kZSgpKSB7Ci0JCQkJLy8gSWYgdGhlIG5vZGUgaXMgYWRhcHRlZCwgYnV0IG5vdCBieSB0aGlzIGFkYXB0ZXIgdGhlbiByZW1vdmUKLQkJCQkvLyBpdC4gVGhpcyBoYXBwZW5zIHRvIG5vbi1vYmplY3QgY2hpbGRyZW4gd2hlbiB0aGUgcGFyZW50IHRhZwotCQkJCS8vIG5hbWUgaXMgY2hhbmdlZC4KLQkJCQlyZW1vdmVET01BZGFwdGVyKGNoaWxkTm9kZSwgYXR0ckFkYXB0ZXIpOwotCi0JCQkJaWYgKGZEZWJ1ZykgewotCQkJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdENISUxEOiBBZGRpbmcgRE9NIGFkYXB0ZXI6ICIgKyB0aGlzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJcdFx0dG86ICIgKyBjaGlsZE5vZGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXByaW1BZGRET01BZGFwdGVyKGNoaWxkTm9kZSwgdGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRU1GMkRPTUFkYXB0ZXIgcHJpbUdldEV4aXN0aW5nQWRhcHRlcihOb2RlIGFOb2RlKSB7Ci0JCUlOb2RlTm90aWZpZXIgc3NlTm9kZSA9IChJTm9kZU5vdGlmaWVyKSBhTm9kZTsKLQkJQ29sbGVjdGlvbiBhZGFwdGVycyA9IHNzZU5vZGUuZ2V0QWRhcHRlcnMoKTsKLQkJTGlzdCBzc2UyZG9tQWRhcHRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhZGFwdGVycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IChJTm9kZUFkYXB0ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCS8vIEZpcnN0IENoZWNrIGlmIGl0J3MgYW4gRU1GMkRPTUFkYXB0ZXIKLQkJCWlmIChhZGFwdGVyICE9IG51bGwgJiYgYWRhcHRlci5pc0FkYXB0ZXJGb3JUeXBlKEVNRjJET01BZGFwdGVyLkFEQVBURVJfQ0xBU1MpKSB7Ci0JCQkJLy8gQ2FzdCB0byBFTUYyRE9NQWRhcHRlcgotCQkJCUVNRjJET01BZGFwdGVyIGUyREFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIGFkYXB0ZXI7Ci0JCQkJLy8gQ2hlY2sgaWYgdGFyZ2V0cyBhcmUgdGhlIHJlc291cmNlcwotCQkJCWlmIChnZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIE5vdyBjaGVjayBpZiBpdCdzIHRoZSByaWdodCBvbmUgKE11bHRpcGxlIHJlc291cmNlcwotCQkJCQkgKiBjb3VsZCBiZSBhdHRhY2hlZCkKLQkJCQkJICovCi0JCQkJCWlmIChlMkRBZGFwdGVyLmdldFRhcmdldCgpID09IGdldFRhcmdldCgpKSB7Ci0JCQkJCQlyZXR1cm4gZTJEQWRhcHRlcjsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXNzZTJkb21BZGFwdGVycy5hZGQoZTJEQWRhcHRlcik7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIENoZWNrIGlmIHRhcmdldHMgYXJlIEVPYmplY3RzIHdpdGggdGhlIHNhbWUgcmVzb3VyY2VzCi0JCQkJCUVPYmplY3QgbXlUYXJnZXQgPSAoRU9iamVjdCkgZ2V0VGFyZ2V0KCk7Ci0JCQkJCUVPYmplY3QgYWRhcHRlclRhcmdldCA9IChFT2JqZWN0KSBlMkRBZGFwdGVyLmdldFRhcmdldCgpOwotCQkJCQkvKgotCQkJCQkgKiBOb3cgY2hlY2sgaWYgaXQncyB0aGUgcmlnaHQgb25lIChNdWx0aXBsZSByZXNvdXJjZXMgY291bGQKLQkJCQkJICogYmUgYXR0YWNoZWQpCi0JCQkJCSAqLwotCQkJCQlpZiAoYWRhcHRlclRhcmdldCAhPSBudWxsICYmIG15VGFyZ2V0ICE9IG51bGwgJiYgYWRhcHRlclRhcmdldC5lUmVzb3VyY2UoKSA9PSBteVRhcmdldC5lUmVzb3VyY2UoKSkgewotCQkJCQkJcmV0dXJuIGUyREFkYXB0ZXI7Ci0JCQkJCX0KLQkJCQkJc3NlMmRvbUFkYXB0ZXJzLmFkZChlMkRBZGFwdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHNzZTJkb21BZGFwdGVycy5zaXplKCkgPT0gMSkgewotCQkJcmV0dXJuIChFTUYyRE9NQWRhcHRlcikgc3NlMmRvbUFkYXB0ZXJzLmdldCgwKTsKLQkJfQotCQkJCi0JCS8vcmV0dXJuIChFTUYyRE9NQWRhcHRlcikgKChJRE9NTm9kZSkgYU5vZGUpLmdldEV4aXN0aW5nQWRhcHRlcihFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBwcmltR2V0RXhpc3RpbmdBZGFwdGVyRm9yQ3JlYXRlKE5vZGUgYU5vZGUpIHsKLQkJSU5vZGVOb3RpZmllciBzc2VOb2RlID0gKElOb2RlTm90aWZpZXIpIGFOb2RlOwotCQlDb2xsZWN0aW9uIGFkYXB0ZXJzID0gc3NlTm9kZS5nZXRBZGFwdGVycygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWRhcHRlcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU5vZGVBZGFwdGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkvLyBGaXJzdCBDaGVjayBpZiBpdCdzIGFuIEVNRjJET01BZGFwdGVyCi0JCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuaXNBZGFwdGVyRm9yVHlwZShFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKSkgewotCQkJCS8vIENhc3QgdG8gRU1GMkRPTUFkYXB0ZXIKLQkJCQlFTUYyRE9NQWRhcHRlciBlMkRBZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBhZGFwdGVyOwotCQkJCS8vIENoZWNrIGlmIHRhcmdldCBpcyBhbiBFTUYgcmVzb3VyY2UKLQkJCQlpZiAoZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBSZXNvdXJjZSkgewotCQkJCQkvKgotCQkJCQkgKiBOb3cgY2hlY2sgaWYgaXQncyB0aGUgcmlnaHQgb25lIChNdWx0aXBsZSByZXNvdXJjZXMKLQkJCQkJICogY291bGQgYmUgYXR0YWNoZWQpCi0JCQkJCSAqLwotCQkJCQlpZiAoZTJEQWRhcHRlci5nZXRUYXJnZXQoKSA9PSBnZXRUYXJnZXQoKSkgewotCQkJCQkJcmV0dXJuIGUyREFkYXB0ZXI7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCS8vIENoZWNrIGlmIHRhcmdldHMgYXJlIEVPYmplY3RzIHdpdGggdGhlIHNhbWUgcmVzb3VyY2VzCi0JCQkJRU9iamVjdCBteVRhcmdldCA9IChFT2JqZWN0KSBnZXRUYXJnZXQoKTsKLQkJCQlFT2JqZWN0IGFkYXB0ZXJUYXJnZXQgPSAoRU9iamVjdCkgZTJEQWRhcHRlci5nZXRUYXJnZXQoKTsKLQkJCQkvKgotCQkJCSAqIE5vdyBjaGVjayBpZiBpdCdzIHRoZSByaWdodCBvbmUgKE11bHRpcGxlIHJlc291cmNlcyBjb3VsZAotCQkJCSAqIGJlIGF0dGFjaGVkKQotCQkJCSAqLwotCQkJCWlmIChhZGFwdGVyVGFyZ2V0ICE9IG51bGwgJiYgbXlUYXJnZXQgIT0gbnVsbCAmJiBhZGFwdGVyVGFyZ2V0LmVSZXNvdXJjZSgpID09IG15VGFyZ2V0LmVSZXNvdXJjZSgpKSB7Ci0JCQkJCXJldHVybiBlMkRBZGFwdGVyOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByaW1HZXRJbmRlbnRTdHJpbmcoTm9kZSBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZmxhdE1vZGVsID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWludCBub2RlU3RhcnRPZmYgPSAoKElET01Ob2RlKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCi0JCWludCBzdGFydE9mZiA9IE1hdGgubWF4KDAsIG5vZGVTdGFydE9mZiAtIDEwMCk7Ci0JCWludCBlbmRPZmYgPSBub2RlU3RhcnRPZmY7Ci0KLQkJdHJ5IHsKLQkJCVN0cmluZyB0ZXh0ID0gZmxhdE1vZGVsLmdldChzdGFydE9mZiwgZW5kT2ZmIC0gc3RhcnRPZmYpOwotCi0JCQlpbnQgaW54ID0gdGV4dC5sZW5ndGgoKSAtIDE7Ci0JCQlpZiAoaW54ID49IDApIHsKLQkJCQlmb3IgKDsgaW54ID49IDA7IGlueC0tKSB7Ci0JCQkJCWNoYXIgY2ggPSB0ZXh0LmNoYXJBdChpbngpOwotCQkJCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCkgJiYgY2ggIT0gJ1xuJyAmJiBjaCAhPSAnXHInKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlpbngrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKGlueCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVET01BZGFwdGVyKE5vZGUgYU5vZGUsIEVNRjJET01BZGFwdGVyIGFuQWRhcHRlcikgewotCQkoKElET01Ob2RlKSBhTm9kZSkucmVtb3ZlQWRhcHRlcigoSU5vZGVBZGFwdGVyKSBhbkFkYXB0ZXIpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgcmVvcmRlckRPTUNoaWxkKE5vZGUgcGFyZW50Tm9kZSwgTm9kZSBjaGlsZE5vZGUsIE5vZGUgaW5zZXJ0QmVmb3JlTm9kZSwgVHJhbnNsYXRvciBtYXApIHsKLQkJc3VwZXIucmVvcmRlckRPTUNoaWxkKHBhcmVudE5vZGUsIGNoaWxkTm9kZSwgaW5zZXJ0QmVmb3JlTm9kZSwgbWFwKTsKLQkJLy8gU2luY2UgcmVvcmRlcmluZyBkZWxldGVzIGFsbCB0aGUgd2hpdGVzcGFjZSBiZWZvcmUgdGhlIG5vZGUsIHdlCi0JCS8vIG11c3QgaW5kZW50IC4KLQkJaWYgKGluc2VydEJlZm9yZU5vZGUgIT0gbnVsbCAmJiBpbnNlcnRCZWZvcmVOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlpbmRlbnRTdGFydFRhZyhjYWxjSW5kZW50U3RyaW5nKGluc2VydEJlZm9yZU5vZGUpLCBpbnNlcnRCZWZvcmVOb2RlLCBtYXApOwotCQllbHNlCi0JCQlpbmRlbnRTdGFydFRhZyhjYWxjSW5kZW50U3RyaW5nKGNoaWxkTm9kZSksIGNoaWxkTm9kZSwgbWFwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbXB0eVRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJKChFbGVtZW50SW1wbCkgZWxlbWVudCkuc2V0RW1wdHlUYWcodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRE9NKCkgewotCQlpZiAoIWlzTm90aWZpY2F0aW9uRW5hYmxlZCgpKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJZGlzYWJsZVVuZG9NYW5hZ2VtZW50SWZOZWNlc3NhcnkoKTsKLQkJCXByaW1VcGRhdGVET00oKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWVuYWJsZVVuZG9NYW5hZ2VtZW50KCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtZW1mTW9kZWxTeW5jaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW1mMnhtbC9FTUYyRE9NU1NFUmVuZGVyZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1lbWZNb2RlbFN5bmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbWYyeG1sL0VNRjJET01TU0VSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2Y4ZGU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1lbWZNb2RlbFN5bmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbWYyeG1sL0VNRjJET01TU0VSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmVtZjJ4bWw7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5ET01VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5Nb2RlbExpZmVjeWNsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50VHlwZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgRU1GMkRPTVNTRVJlbmRlcmVyIGV4dGVuZHMgRU1GMkRPTVJlbmRlcmVyIGltcGxlbWVudHMgSU1vZGVsU3RhdGVMaXN0ZW5lciwgSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIE9iamVjdCBhYm91dFRvQ2hhbmdlTm9kZSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0JhdGNoQ2hhbmdlcyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzU2F2aW5nID0gZmFsc2U7Ci0KLQlwcml2YXRlIElNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyOwotCi0JLyoqIFRoZSBYTUwgRE9NIG1vZGVsICovCi0JcHJvdGVjdGVkIElET01Nb2RlbCB4bWxNb2RlbDsKLQotCS8qKiBVc2VkIGludGVybmFsbHk7IHRoZSB1bmlxdWUgaWQgZm9yIHRoZSB4bWwgbW9kZWwgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHhtbE1vZGVsSWQ7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB4bWxNb2RlbFJldmVydGVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgRU1GMkRPTVNTRVJlbmRlcmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFjY2Vzc0ZvclJlYWQoKSB7Ci0JCWlmICghcmVzb3VyY2UuaXNOZXcoKSkgewotCQkJU3RyaW5nIGlkID0gZ2V0TW9kZWxNYW5hZ2VySWQoKTsKLQkJCWdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGlkKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFjY2Vzc0ZvcldyaXRlKCkgewotCQltb2RlbEFjY2Vzc0ZvcldyaXRlKCk7Ci0JfQotCi0JLyoqCi0JICogc2VlIGJhdGNoTW9kZWxFbmQKLQkgKiAKLQkgKi8KLQotCXB1YmxpYyB2b2lkIGJhdGNoTW9kZUVuZCgpIHsKLQkJZ2V0WE1MTW9kZWwoKS5jaGFuZ2VkTW9kZWwoKTsKLQkJc2V0Um9vdE5vZGVBZGFwdGVyTm90aWZpY2F0aW9uRW5hYmxlZCh0cnVlKTsKLQkJaXNCYXRjaENoYW5nZXMgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBiYXRjaE1vZGVTdGFydCBhbmQgYmF0Y2hNb2RlRW5kIGlzIGEgcGFpciB0aGF0IGNvbnRyb2xzIG5vdGlmaWNhdGlvbnMsCi0JICogYW5kIHRyZWFkIGFjY2Vzcy4gVGhleSBzaG91bGQgYWx3YXlzIGJlIGNhbGxlZCBpbiBhIHRyeS9maW5hbGx5IGJsb2NrLgotCSAqIAotCSAqIHNldEJhdGNoTW9kZWwgYmVnaW5zIHRoZSBwcm9jZXNzaW5nIHdoZXJlIG5vdGlmaWNhdGlvbnMgYXJlIG5vdCBzZW50Ci0JICogb3V0IG9uIGVhY2ggY2hhbmdlLCBidXQgc2F2ZWQgdXAgdW50aWwgdGhlIGVuZEJhdGNoTW9kZSBjYWxsZWQuCi0JICogCi0JICogVGhpcyBwYWlyIG9mIGNhbGxzIGNhbiBhbHNvLCBpbmRpcmVjdGx5LCAibG9jayIgdGhlIERPTSBNb2RlbCB0byBhY2Nlc3MKLQkgKiBmcm9tIG9ubHkgb25lIHRocmVhZCwgc28gaXQgc2hvdWxkIG5vdCBiZSBsb2NrZWQgZm9yIGxvbmcgcGVyaW9kcyBvZgotCSAqIHRpbWUuIFRoYXQncyBhbHNvIHdoeSBpdCBpcyBpbXBvcnRhbnQgdG8gaGF2ZSB0aGUgZW5kQmF0Y2hNb2RlIGluIGEKLQkgKiBmaW5hbGx5IGJsb2NrIHRvIGJlIHN1cmUgaXQgaXMgYWx3YXlzIGNhbGxlZCwgb3IgdGhlIERPTSB3aWxsIGJlIGxlZnQKLQkgKiBpbiBhIGxvY2tlZCwgdW51c2FibGUsIHN0YXRlIGFuZCBvbmx5IHNob3J0bHkgYXdheSBmcm9tIHNldmVyZXJlCi0JICogcHJvZ3JhbSBlcnJvci4KLQkgKiAKLQkgKiA8cHJlPjxjb2RlPgotCSAqIEV4YW1wbGUKLQkgKiA8L2NvZGU+Ci0JICogIAotCSAqICB0cnkgeyAKLQkgKiAgCQliYXRjaE1vZGVsU3RhcnQoKTsKLQkgKiAgCQkuLi5kbyBhIHNvbWUgd29yayAuLi4KLQkgKiAgCQl9Ci0JICogIAlmaW5hbGx5IHsKLQkgKiAgCQllbmRCYXRjaE1vZGUoKTsKLQkgKiAgCQl9Ci0JICogIAotCSAqICAKLQkgKiA8L3ByZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBiYXRjaE1vZGVTdGFydCgpIHsKLQkJaXNCYXRjaENoYW5nZXMgPSB0cnVlOwotCQlnZXRYTUxNb2RlbCgpLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQlzZXRSb290Tm9kZUFkYXB0ZXJOb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FjaGVTeW5jaHJvbml6YXRpb25TdGFtcCgpIHsKLQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzb3VyY2UpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCQl4bWxNb2RlbC5yZXNldFN5bmNocm9uaXphdGlvblN0YW1wKGZpbGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IERvY3VtZW50IGdpdmVuCi0JICogCi0JICogQGFSZXNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEb2N1bWVudCgpIHsKLQkJVHJhbnNsYXRvclJlc291cmNlIHJlcyA9IGdldFJlc291cmNlKCk7Ci0JCXJlcy5zZXREZWZhdWx0cygpOwotCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZXNvdXJjZSk7Ci0JCUlucHV0U3RyZWFtIGlzID0gRE9NVXRpbGl0aWVzLmNyZWF0ZUhlYWRlcklucHV0U3RyZWFtKHJlcy5nZXREb2N0eXBlKCksIHJlcy5nZXRQdWJsaWNJZCgpLCByZXMuZ2V0U3lzdGVtSWQoKSk7Ci0JCWlmIChpcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQlMaXN0IGZvbGRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBmaWxlLmdldFBhcmVudCgpOwotCQkJCXdoaWxlIChudWxsICE9IGNvbnRhaW5lciAmJiAhY29udGFpbmVyLmV4aXN0cygpICYmIGNvbnRhaW5lciBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQkJZm9sZGVycy5hZGQoY29udGFpbmVyKTsKLQkJCQkJY29udGFpbmVyID0gY29udGFpbmVyLmdldFBhcmVudCgpOwotCQkJCX0KLQkJCQlJRm9sZGVyIGZvbGRlciA9IG51bGw7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmb2xkZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCWZvbGRlciA9IChJRm9sZGVyKSBmb2xkZXJzLmdldChpKTsKLQkJCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQl9Ci0JCQkJZmlsZS5jcmVhdGUoaXMsIHRydWUsIG51bGwpOwotCQkJCWZpbGUuc2V0TG9jYWwodHJ1ZSwgMSwgbnVsbCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTEpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKG51bGwgIT0gaXMpIHsKLQkJCQkJaXMuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpbml0aWFsaXplWE1MTW9kZWwoZmlsZSwgdHJ1ZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIklXQUUwMDE3RSBVbmV4cGVjdGVkIElPIGV4Y2VwdGlvbiBvY2N1cnJlZCBjcmVhdGluZyB4bWwgZG9jdW1lbnQiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVET01UcmVlSWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChuZWVkc1RvQ3JlYXRlRE9NKQotCQkJY3JlYXRlRE9NVHJlZSgpOwotCX0KLQotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBjcmVhdGVSb290RE9NQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBFTUYyRE9NU1NFQWRhcHRlcihnZXRSZXNvdXJjZSgpLCBkb2N1bWVudCwgdGhpcywgZ2V0UmVzb3VyY2UoKS5nZXRSb290VHJhbnNsYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZVJlZ2lzdGVyQXNNb2RlbExpZmVjeWNsZUxpc3RlbmVyKCkgewotCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCXhtbE1vZGVsLnJlbW92ZU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVSZWdpc3RlckFzTW9kZWxTdGF0ZUxpc3RlbmVyKCkgewotCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCXhtbE1vZGVsLnJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVyZWdpc3RlckZyb21YTUxNb2RlbCgpIHsKLQkJCi0JCWRlUmVnaXN0ZXJBc01vZGVsU3RhdGVMaXN0ZW5lcigpOwotCQlkZVJlZ2lzdGVyQXNNb2RlbExpZmVjeWNsZUxpc3RlbmVyKCk7Ci0JCS8vIFRoaXMgdHJ5L2NhdGNoIGJsb2NrIGlzIGEgaGFjayB0byBmaXggZGVmZWN0IDIwNDExNC4gVGhpcyBvY2N1cnMKLQkJLy8gYmVjYXVzZQotCQkvLyB0aGUgbW9kZWwgbWFuYWdlciBwbHVnaW4gaXMgc2h1dCBkb3duIGFuZCB1bmxvYWRlZCBiZWZvcmUgdGhlIGoyZWUKLQkJLy8gcGx1Z2luLgotCQkvLyBDYWxsaW5nIGdldE1vZGVsTWFuYWdlcigpIGNhbiByZXN1bHQgaW4gYSBjbGFzcyBjYXN0IGV4Y2VwdGlvbiB0aGF0Ci0JCS8vIHNob3VsZAotCQkvLyBiZSBpZ25vcmVkLgotCQkvLyBNb2RlbE1hbmFnZXIgbWdyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWdldE1vZGVsTWFuYWdlcigpOwotCQl9Ci0JCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZXhjKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCWludCB3cml0ZUNvdW50ID0gcmVzb3VyY2UuZ2V0V3JpdGVDb3VudCgpOwotCQkJaW50IHJlYWRDb3VudCA9IHJlc291cmNlLmdldFJlYWRDb3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3cml0ZUNvdW50OyBpKyspCi0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgcmVhZENvdW50OyBpaSsrKQotCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRBZGFwdGVyKHJlc291cmNlLmVBZGFwdGVycygpLCBFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJYWRhcHRlci5yZW1vdmVBZGFwdGVycyhhZGFwdGVyLmdldE5vZGUoKSk7Ci0JCX0KLQkJeG1sTW9kZWwgPSBudWxsOwotCQl4bWxNb2RlbElkID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1NhdmUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJdHJ5IHsKLQkJCWlzU2F2aW5nID0gdHJ1ZTsKLQkJCWlmIChudWxsICE9IG91dHB1dFN0cmVhbSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNob3VsZCBub3QgdXNlIGFuIE91dHB1dFN0cmVhbSBmb3Igc2F2aW5nIik7fSAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVET01UcmVlSWZOZWNlc3NhcnkoKTsKLQkJCVJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIgPSAoUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyKSAoKFByb2plY3RSZXNvdXJjZVNldCkgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSkuZ2V0U3luY2hyb25pemVyKCk7Ci0JCQlJRmlsZSBhRmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzb3VyY2UpOwotCQkJdHJ5IHsKLQkJCQlzeW5jaHJvbml6ZXIucHJlU2F2ZShhRmlsZSwgcmVzb3VyY2UpOwotCQkJCXhtbE1vZGVsLnNhdmUoYUZpbGUpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQlzeW5jaHJvbml6ZXIucmVtb3ZlRnJvbVJlY2VudGx5U2F2ZWRMaXN0KGFGaWxlKTsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJCWNhY2hlU3luY2hyb25pemF0aW9uU3RhbXAoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlzU2F2aW5nID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRU1GMkRPTUFkYXB0ZXIgZ2V0RXhpc3RpbmdET01BZGFwdGVyKE5vZGUgbm9kZSkgewotCQkvL0lET01Ob2RlIHhOb2RlID0gKElET01Ob2RlKSBub2RlOwotCQkvL3JldHVybiAoRU1GMkRPTVNTRUFkYXB0ZXIpIHhOb2RlLmdldEFkYXB0ZXJGb3IoRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUyk7Ci0KLQkJSU5vZGVOb3RpZmllciBzc2VOb2RlID0gKElOb2RlTm90aWZpZXIpIG5vZGU7Ci0JCUxpc3Qgc3NlMmRvbUFkYXB0ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlDb2xsZWN0aW9uIGFkYXB0ZXJzID0gc3NlTm9kZS5nZXRBZGFwdGVycygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWRhcHRlcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU5vZGVBZGFwdGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkvLyBGaXJzdCBDaGVjayBpZiBpdCdzIGFuIEVNRjJET01BZGFwdGVyCi0JCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuaXNBZGFwdGVyRm9yVHlwZShFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKSkgewotCQkJCS8vIENhc3QgdG8gRU1GMkRPTUFkYXB0ZXIKLQkJCQlFTUYyRE9NQWRhcHRlciBlMkRBZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBhZGFwdGVyOwotCQkJCS8vIEZpcnN0IGNoZWNrIGlmIHRhcmdldHMgYXJlIHJlc291cmNlcwotCQkJCWlmIChlMkRBZGFwdGVyLmdldFRhcmdldCgpICE9IG51bGwgJiYgZTJEQWRhcHRlci5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIE5vdyBjaGVjayBpZiBpdCdzIHRoZSByaWdodCBvbmUgKE11bHRpcGxlIHJlc291cmNlcwotCQkJCQkgKiBjb3VsZCBiZSBhdHRhY2hlZCkKLQkJCQkJICovCi0JCQkJCWlmIChlMkRBZGFwdGVyLmdldFRhcmdldCgpID09IGdldFJlc291cmNlKCkpIHsKLQkJCQkJCXJldHVybiBlMkRBZGFwdGVyOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc3NlMmRvbUFkYXB0ZXJzLmFkZChlMkRBZGFwdGVyKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gQ2hlY2sgaWYgdGFyZ2V0cyBhcmUgRU9iamVjdHMgd2l0aCB0aGUgc2FtZSByZXNvdXJjZXMKLQkJCQkJVHJhbnNsYXRvclJlc291cmNlIG15VGFyZ2V0ID0gZ2V0UmVzb3VyY2UoKTsKLQkJCQkJRU9iamVjdCBhZGFwdGVyVGFyZ2V0ID0gKEVPYmplY3QpIGUyREFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0JCQkJCS8qCi0JCQkJCSAqIE5vdyBjaGVjayBpZiBpdCdzIHRoZSByaWdodCBvbmUgKE11bHRpcGxlIHJlc291cmNlcyBjb3VsZAotCQkJCQkgKiBiZSBhdHRhY2hlZCkKLQkJCQkJICovCi0JCQkJCWlmIChhZGFwdGVyVGFyZ2V0ICE9IG51bGwgJiYgbXlUYXJnZXQgIT0gbnVsbCAmJiBhZGFwdGVyVGFyZ2V0LmVSZXNvdXJjZSgpID09IG15VGFyZ2V0KSB7Ci0JCQkJCQlyZXR1cm4gZTJEQWRhcHRlcjsKLQkJCQkJfQotCQkJCQlzc2UyZG9tQWRhcHRlcnMuYWRkKGUyREFkYXB0ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoc3NlMmRvbUFkYXB0ZXJzLnNpemUoKSA9PSAxKSB7Ci0JCQlyZXR1cm4gKEVNRjJET01BZGFwdGVyKSBzc2UyZG9tQWRhcHRlcnMuZ2V0KDApOwotCQl9Ci0JCXJldHVybiBudWxsOwotCQotCX0KLQotCXByb3RlY3RlZCBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQkJaWYgKG1vZGVsTWFuYWdlciA9PSBudWxsKQotCQkJbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJcmV0dXJuIG1vZGVsTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gaWQgdXNlZCB0byBrZXkgdGhlIFhNTCByZXNvdXJjZSBpbiB0aGUgWE1MIE1vZGVsTWFuYWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZGVsTWFuYWdlcklkKCkgewotCQlpZiAoeG1sTW9kZWxJZCA9PSBudWxsKSB7Ci0JCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShnZXRSZXNvdXJjZSgpKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQl4bWxNb2RlbElkID0gZ2V0TW9kZWxNYW5hZ2VyKCkuY2FsY3VsYXRlSWQoZmlsZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl4bWxNb2RlbElkID0gcmVzb3VyY2UuZ2V0VVJJKCkgKyBMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4geG1sTW9kZWxJZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiByZXNvdXJjZSA9PSBudWxsID8gbnVsbCA6IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBET00gbW9kZWwgZm9yIHRoaXMgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIElET01Nb2RlbCBnZXRYTUxNb2RlbCgpIHsKLQkJcmV0dXJuIHhtbE1vZGVsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0WE1MTW9kZWxJZCgpIHsKLQkJcmV0dXJuIHhtbE1vZGVsSWQ7Ci0JfQkKLQkKLQlwcml2YXRlIElET01Nb2RlbCBpbml0aWFsaXplWE1MTW9kZWwoSUZpbGUgZmlsZSwgYm9vbGVhbiBmb3JXcml0ZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCB8fCAhZmlsZS5leGlzdHMoKSkKLQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oKGZpbGUgPT0gbnVsbCkgPyAibnVsbCIgOiBmaWxlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCQlTdHJpbmcgaWQgPSBtYW5hZ2VyLmNhbGN1bGF0ZUlkKGZpbGUpOwkJCQotCQkJaWYgKGZvcldyaXRlKSB7Ci0JCQkJSURPTU1vZGVsIG1vZCA9IChJRE9NTW9kZWwpbWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChpZCk7Ci0JCQkJaWYgKG1vZCA9PSBudWxsKQotCQkJCQlzZXRYTUxNb2RlbCgoSURPTU1vZGVsKSBtYW5hZ2VyLmdldE1vZGVsRm9yRWRpdChmaWxlKSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCXNldFhNTE1vZGVsKG1vZCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSURPTU1vZGVsIG1vZCA9IChJRE9NTW9kZWwpbWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChpZCk7Ci0JCQkJaWYgKG1vZCA9PSBudWxsKQotCQkJCQlzZXRYTUxNb2RlbCgoSURPTU1vZGVsKSBtYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChmaWxlKSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCXNldFhNTE1vZGVsKG1vZCk7Ci0JCQkJfQotCQkJfQotCQkJc2V0WE1MTW9kZWxJZChnZXRYTUxNb2RlbCgpLmdldElkKCkpOwotCQkJbmVlZHNUb0NyZWF0ZURPTSA9IGZhbHNlOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgaWQgPSBnZXRYTUxNb2RlbCgpLmdldElkKCk7Ci0JCXN5bmNSZWZlcmVuY2VDb3VudHMoaWQsIGZvcldyaXRlKTsKLQkJaWYgKHhtbE1vZGVsICE9IG51bGwpCi0JCQlkb2N1bWVudCA9IHhtbE1vZGVsLmdldERvY3VtZW50KCk7Ci0JCXJldHVybiB4bWxNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0JhdGNoTW9kZSgpIHsKLQkJcmV0dXJuIGlzQmF0Y2hDaGFuZ2VzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpZWQoKSB7Ci0JCXJldHVybiAoZ2V0WE1MTW9kZWwoKSAhPSBudWxsICYmIGdldFhNTE1vZGVsKCkuaXNEaXJ0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJaWYgKGdldFJlc291cmNlU2V0KCkgPT0gbnVsbCB8fCB4bWxNb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4geG1sTW9kZWwuaXNTaGFyZWQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZEZvcldyaXRlKCkgewotCQlpZiAoZ2V0UmVzb3VyY2VTZXQoKSA9PSBudWxsIHx8IHhtbE1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB4bWxNb2RlbC5pc1NoYXJlZEZvckVkaXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRG9jdW1lbnQoSW5wdXRTdHJlYW0gaW4sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAobnVsbCAhPSBpbikgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgc2hvdWxkIG5vdCB1c2UgYW4gSW5wdXRTdHJlYW0gZm9yIGxvYWRpbmciKTt9IC8vJE5PTi1OTFMtMSQKLQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzb3VyY2UpOwotCQlpbml0aWFsaXplWE1MTW9kZWwoZmlsZSwgKHJlc291cmNlLmdldFdyaXRlQ291bnQoKSAhPSAwKSk7Ci0JCWNhY2hlU3luY2hyb25pemF0aW9uU3RhbXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYW5hZ2VzRE9NQWRhcHRlcnMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgIT0gbnVsbCkKLQkJCWFib3V0VG9DaGFuZ2VOb2RlID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIG1vZGVsQWNjZXNzRm9yV3JpdGUoKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1vZGVsTWFuYWdlcklkKCk7Ci0JCWdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGlkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RlbENoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAoaXNCYXRjaENoYW5nZXMpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlpZiAoYWJvdXRUb0NoYW5nZU5vZGUgIT0gbnVsbCAmJiBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSAhPSBudWxsICYmIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gYWJvdXRUb0NoYW5nZU5vZGUpIHsKLQkJCQlTdHJpbmcgaWQgPSBnZXRNb2RlbE1hbmFnZXJJZCgpOwotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgdGVtcE1vZGVsID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQl0ZW1wTW9kZWwgPSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChpZCk7Ci0JCQkJCXhtbE1vZGVsUmV2ZXJ0ZWQgPSB0cnVlOwotCQkJCQlyZXNvdXJjZS51bmxvYWQoKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmICh0ZW1wTW9kZWwgIT0gbnVsbCkgewotCQkJCQkJdGVtcE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJYWJvdXRUb0NoYW5nZU5vZGUgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBib29sZWFuIGlzRGlydHkpIHsKLQkJaWYgKCFpc0RpcnR5ICYmIHJlc291cmNlLmlzTW9kaWZpZWQoKSkgeyAvLyBUaGUgWE1MTW9kZWwgd2FzIHNhdmVkCi0JCQlyZXNvdXJjZS5zZXRNb2RpZmllZChmYWxzZSk7Ci0JCQlsb25nIHN0YW1wID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKHJlc291cmNlKTsKLQkJCVdvcmtiZW5jaFJlc291cmNlSGVscGVyLnNldFN5bmhyb25pemF0aW9uU3RhbXAocmVzb3VyY2UsIHN0YW1wKTsKLQkJCUlQcm9qZWN0IHByb2ogPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRQcm9qZWN0KHJlc291cmNlKTsKLQkJCVJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIgPSAoUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyKSAoKFByb2plY3RSZXNvdXJjZVNldCkgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlU2V0KHByb2opKS5nZXRTeW5jaHJvbml6ZXIoKTsKLQkJCUlGaWxlIGFGaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZXNvdXJjZSk7Ci0JCQlzeW5jaHJvbml6ZXIucHJlU2F2ZShhRmlsZSwgcmVzb3VyY2UpOwotCQl9Ci0JCWlmIChpc0RpcnR5KQotCQkJcmVzb3VyY2Uuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VEZWxldGVkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJLy8gRG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCS8vIERvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQganVzdCBwcmlvciB0byBiZWluZyByZW1vdmVkIGZyb20gdGhlIFJlc291cmNlU2V0LgotCSAqIEVuc3VyZSB0aGF0IGFsbCByZWZlcmVuY2UgY291bnRzIHRvIHRoZSBYTUxNb2RlbCBhcmUgcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVEZWxldGUoKSB7Ci0JCWlmIChyZXNvdXJjZS5pc0xvYWRlZCgpKQotCQkJZGVyZWdpc3RlckZyb21YTUxNb2RlbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByZVVubG9hZCgpIHsKLQkJZGVyZWdpc3RlckZyb21YTUxNb2RlbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb2Nlc3NQb3N0TW9kZWxFdmVudChNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIHByb2Nlc3NQcmVNb2RlbEV2ZW50KE1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCFpc1NhdmluZykgewotCQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1NBVkVEKSB7Ci0JCQkJUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyIHN5bmNocm9uaXplciA9IChSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIpICgoUHJvamVjdFJlc291cmNlU2V0KSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKS5nZXRTeW5jaHJvbml6ZXIoKTsKLQkJCQlJRmlsZSBhRmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzb3VyY2UpOwotCQkJCXN5bmNocm9uaXplci5wcmVTYXZlKGFGaWxlLCByZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQXNNb2RlbExpZmVjeWNsZUxpc3RlbmVyKCkgewotCQl0aGlzLnhtbE1vZGVsLmFkZE1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOS83LzIwMDEgMTA6NDk6NTMKLQkgKiBBTSkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlckFzTW9kZWxTdGF0ZUxpc3RlbmVyKCkgewotCQl0aGlzLnhtbE1vZGVsLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVJlYWQoKSB7Ci0JCWlmICh4bWxNb2RlbCAhPSBudWxsKQotCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21Xcml0ZSgpIHsKLQkJaWYgKHhtbE1vZGVsICE9IG51bGwpCi0JCQl4bWxNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVET01BZGFwdGVyKE5vZGUgYU5vZGUsIEVNRjJET01BZGFwdGVyIGFuQWRhcHRlcikgewotCQkoKElET01Ob2RlKSBhTm9kZSkucmVtb3ZlQWRhcHRlcigoRU1GMkRPTVNTRUFkYXB0ZXIpIGFuQWRhcHRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwudXRpbC5lbWYueG1sLkVNRjJET01SZW5kZXJlciNyZXBsYWNlRG9jdW1lbnRUeXBlKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2VEb2N1bWVudFR5cGUoU3RyaW5nIGRvY1R5cGVOYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRG9jdW1lbnRUeXBlSW1wbCBkb2NUeXBlID0gKERvY3VtZW50VHlwZUltcGwpIGRvY3VtZW50LmdldERvY3R5cGUoKTsKLQkJaWYgKGRvY1R5cGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHB1YmxpY0lkID09IG51bGwgJiYgc3lzdGVtSWQgPT0gbnVsbCkKLQkJCWRvY3VtZW50LnJlbW92ZUNoaWxkKGRvY1R5cGUpOwotCQllbHNlIHsKLQkJCWRvY1R5cGUuc2V0UHVibGljSWQocHVibGljSWQpOwotCQkJZG9jVHlwZS5zZXRTeXN0ZW1JZChzeXN0ZW1JZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgYmF0Y2hNb2RlU3RhcnQgYW5kIEJhdGNoTW9kZUVuZCBpbnN0ZWFkIGV2ZW4gaWYgeW91IGRvCi0JICogICAgICAgICAgICAgbm90IHVzZSBiYXRjaE1vZGVsU3RhcnQvRW5kLCB5b3Ugc3RpbGwgbmVlZCB0byB1c2UgdGhlCi0JICogICAgICAgICAgICAgdHJ5L2ZpbmFsbHkgcGF0dGVybiBkb2N1bWVudGVkIHRoZXJlLgotCSAqLwotCi0JcHVibGljIHZvaWQgc2V0QmF0Y2hNb2RlKGJvb2xlYW4gaXNCYXRjaCkgewotCi0JCS8vIFRoaXMgaXMgc29tZSBleHRyYSBwcm9jZXNzaW5nIGZvciBjbGllbnRzIHRvIGtub3cgdGhleSBtYXkgYmUgdXNpbmcKLQkJLy8gaW5jb3JyZWN0bHkKLQkJaWYgKGlzQmF0Y2gpIHsKLQkJCWlmIChpc0JhdGNoQ2hhbmdlcykgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJzZXRCYXRjaCB3YXMgc2V0IHRvIHRydWUgd2hlbiBpdCB3YXMgYWxyZWFkeSB0cnVlLiBUaGlzIGNhbiBiZSBhbiBpbmRpY2F0aW9uIG9mIGludmFsaWQgY2FsbGluZyBvcmRlciIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCi0JCWlmIChpc0JhdGNoKSB7Ci0JCQliYXRjaE1vZGVTdGFydCgpOwotCQl9Ci0JCWVsc2UgewotCQkJYmF0Y2hNb2RlRW5kKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Um9vdE5vZGVBZGFwdGVyTm90aWZpY2F0aW9uRW5hYmxlZChib29sZWFuIGIpIHsKLQkJRU9iamVjdCByb290ID0gcmVzb3VyY2UuZ2V0Um9vdE9iamVjdCgpOwotCQlpZiAocm9vdCAhPSBudWxsKSB7Ci0JCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKHJvb3QsIEVNRjJET01BZGFwdGVyLkFEQVBURVJfQ0xBU1MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWFkYXB0ZXIuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChiKTsKLQkJCQlpZiAoYikKLQkJCQkJYWRhcHRlci51cGRhdGVET00oKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgRE9NIG1vZGVsIGZvciB0aGlzIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFhNTE1vZGVsKElET01Nb2RlbCB4bWxNb2RlbCkgewotCQlkZVJlZ2lzdGVyQXNNb2RlbFN0YXRlTGlzdGVuZXIoKTsKLQkJZGVSZWdpc3RlckFzTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcigpOwotCQl0aGlzLnhtbE1vZGVsID0geG1sTW9kZWw7Ci0JCXJlZ2lzdGVyQXNNb2RlbFN0YXRlTGlzdGVuZXIoKTsKLQkJcmVnaXN0ZXJBc01vZGVsTGlmZWN5Y2xlTGlzdGVuZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRYTUxNb2RlbElkKFN0cmluZyBpZCkgewotCQl4bWxNb2RlbElkID0gaWQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNSZWZlcmVuY2VDb3VudHMoU3RyaW5nIGlkLCBib29sZWFuIGZvcldyaXRlKSB7Ci0JCWludCBlZGl0SW5kZXggPSAwLCByZWFkSW5kZXggPSAwOwotCQlpZiAoZm9yV3JpdGUpCi0JCQllZGl0SW5kZXgrKzsKLQkJZWxzZQotCQkJcmVhZEluZGV4Kys7Ci0JCWludCB3cml0ZUNvdW50ID0gcmVzb3VyY2UuZ2V0V3JpdGVDb3VudCgpOwotCQlpbnQgcmVhZENvdW50ID0gcmVzb3VyY2UuZ2V0UmVhZENvdW50KCk7Ci0JCWZvciAoaW50IGkgPSB3cml0ZUNvdW50OyBpID4gZWRpdEluZGV4OyBpLS0pCi0JCQltb2RlbE1hbmFnZXIuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoaWQpOwotCQlmb3IgKGludCBpID0gcmVhZENvdW50OyBpID4gcmVhZEluZGV4OyBpLS0pCi0JCQltb2RlbE1hbmFnZXIuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoaWQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVzZVN0cmVhbXNGb3JJTygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHdhc1JldmVydGVkKCkgewotCQlyZXR1cm4geG1sTW9kZWxSZXZlcnRlZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1lbWZNb2RlbFN5bmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbWYyeG1sL0VNRjJET01TU0VSZW5kZXJlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1lbWZNb2RlbFN5bmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbWYyeG1sL0VNRjJET01TU0VSZW5kZXJlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI3OTEyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtZW1mTW9kZWxTeW5jaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW1mMnhtbC9FTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbWYyeG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIEVNRjJET01TU0VSZW5kZXJlckZhY3RvcnkgZXh0ZW5kcyBSZW5kZXJlckZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5IElOU1RBTkNFID0gbmV3IEVNRjJET01TU0VSZW5kZXJlckZhY3RvcnkoKTsKLQotCXB1YmxpYyBFTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5KCkgewotCQkvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JfQotCi0KLQlwdWJsaWMgUmVuZGVyZXIgY3JlYXRlUmVuZGVyZXIoKSB7Ci0JCXJldHVybiBuZXcgRU1GMkRPTVNTRVJlbmRlcmVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL0NvbXBvbmVudFNlYXJjaENvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvQ29tcG9uZW50U2VhcmNoQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMxZGNkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvQ29tcG9uZW50U2VhcmNoQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBvbmVudFNlYXJjaENvbnRyaWJ1dG9yICB7Ci0KLQlwcm90ZWN0ZWQgSGFzaE1hcCBkZWNsYXJhdGlvbnM7Ci0KLQlwcm90ZWN0ZWQgSGFzaE1hcCByZWZlcmVuY2VzOwotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIG5hbWVzcGFjZXM7Ci0KLQlwdWJsaWMgQ29tcG9uZW50U2VhcmNoQ29udHJpYnV0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFhNTFNlYXJjaFBhdHRlcm4gZ2V0RGVjbGFyYXRpb25QYXR0ZXJuKFF1YWxpZmllZE5hbWUgY29tcG9uZW50TmFtZSkgewotCQlyZXR1cm4gKFhNTFNlYXJjaFBhdHRlcm4pIGdldERlY2xhcmF0aW9ucygpLmdldChjb21wb25lbnROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIGdldERlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGRlY2xhcmF0aW9ucyA9PSBudWxsKSB7Ci0JCQlpbml0aWFsaXplRGVjbGFyYXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIGRlY2xhcmF0aW9uczsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIGdldFJlZmVyZW5jZXMoKSB7Ci0JCWlmIChyZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWluaXRpYWxpemVSZWZlcmVuY2VzKCk7Ci0JCX0KLQkJcmV0dXJuIHJlZmVyZW5jZXM7Ci0JfQotCi0JcHVibGljIFhNTFNlYXJjaFBhdHRlcm5bXSBnZXRSZWZlcmVuY2VzUGF0dGVybnMoUXVhbGlmaWVkTmFtZSBjb21wb25lbnROYW1lKSB7Ci0JCUxpc3QgcmVmZXJlbmNlcyA9IChMaXN0KSBnZXRSZWZlcmVuY2VzKCkuZ2V0KGNvbXBvbmVudE5hbWUpOwotCQlpZiAocmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKFhNTFNlYXJjaFBhdHRlcm5bXSkgcmVmZXJlbmNlcwotCQkJCQkudG9BcnJheShuZXcgWE1MU2VhcmNoUGF0dGVybltyZWZlcmVuY2VzLnNpemUoKV0pOwotCQl9Ci0JCXJldHVybiBuZXcgWE1MU2VhcmNoUGF0dGVyblswXTsKLQl9Ci0JCi0JCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoUXVhbGlmaWVkTmFtZSBjb21wb25lbnROYW1lKXsKLQkJcmV0dXJuIGdldFJlZmVyZW5jZXNQYXR0ZXJucyhjb21wb25lbnROYW1lKS5sZW5ndGggPiAwIHx8Ci0JCQlnZXREZWNsYXJhdGlvblBhdHRlcm4oY29tcG9uZW50TmFtZSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0U3VwcG9ydGVkTmFtZXNwYWNlcygpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZURlY2xhcmF0aW9ucygpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZVJlZmVyZW5jZXMoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVTdXBwb3J0ZWROYW1lc3BhY2VzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvVGFyZ2V0TmFtZXNwYWNlUmVmZXJlbmNlUGF0dGVybi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1RhcmdldE5hbWVzcGFjZVJlZmVyZW5jZVBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyMWI3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvVGFyZ2V0TmFtZXNwYWNlUmVmZXJlbmNlUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLQotcHVibGljIGNsYXNzIFRhcmdldE5hbWVzcGFjZVJlZmVyZW5jZVBhdHRlcm4gZXh0ZW5kcyBTZWFyY2hQYXR0ZXJuIHsKLQkKLQlTdHJpbmcgbmFtZXNwYWNlVVJJOwotCQotCXB1YmxpYyBUYXJnZXROYW1lc3BhY2VSZWZlcmVuY2VQYXR0ZXJuKGludCBtYXRjaFJ1bGUsIFN0cmluZyBuYW1lc3BhY2V1cmkpIHsKLQkJc3VwZXIobWF0Y2hSdWxlKTsKLQkJbmFtZXNwYWNlVVJJID0gbmFtZXNwYWNldXJpOwotCX0KLQkKLQlwdWJsaWMgVGFyZ2V0TmFtZXNwYWNlUmVmZXJlbmNlUGF0dGVybihTdHJpbmcgbmFtZXNwYWNldXJpKSB7Ci0JCXN1cGVyKCk7Ci0JCW5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZXVyaTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlmNDc1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotCi1wdWJsaWMgY2xhc3MgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuIGV4dGVuZHMgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybiB7Ci0KLQlwdWJsaWMgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuKFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLCBRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSwgaW50IG1hdGNoUnVsZSkgewotCQlzdXBlcihudWxsLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSwgbWF0Y2hSdWxlKTsKLQkJCi0JfQotCi0JcHVibGljIFhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybihJRmlsZSBmaWxlLCBRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwgUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUpIHsKLQkJc3VwZXIoZmlsZSwgZWxlbWVudFFOYW1lLCB0eXBlUU5hbWUpOwotCX0KLQkKLQlwdWJsaWMgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuKFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLCBRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSkgewotCQlzdXBlcihudWxsLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSk7Ci0JfQotCi0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY4YThhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLQotcHVibGljIGNsYXNzIFhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4gZXh0ZW5kcyBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuewotCi0JcHVibGljIFhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4oSUZpbGUgZmlsZSwgUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUsIFF1YWxpZmllZE5hbWUgdHlwZVFOYW1lLCBpbnQgbWF0Y2hSdWxlKSB7Ci0JCXN1cGVyKGZpbGUsIGVsZW1lbnRRTmFtZSwgdHlwZVFOYW1lLCBtYXRjaFJ1bGUpOwotCQkKLQl9Ci0KLQlwdWJsaWMgWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybihJRmlsZSBmaWxlLCBRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwgUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUpIHsKLQkJc3VwZXIoZmlsZSwgZWxlbWVudFFOYW1lLCB0eXBlUU5hbWUpOwotCQkKLQl9Ci0JCi0JcHVibGljIFhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4oUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUsIFF1YWxpZmllZE5hbWUgdHlwZVFOYW1lKSB7Ci0JCXN1cGVyKG51bGwsIGVsZW1lbnRRTmFtZSwgdHlwZVFOYW1lKTsKLQkJCi0JfQotCQotCQotCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZjMwNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLkNvbXBvbmVudFNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci0KLS8qKgotICogWE1MIGNvbXBvbmVudCBzZWFyY2ggcGF0dGVybiBpcyBhIGNvbXBvc2l0ZSBwYXR0ZXJuIHRoYXQgY29tYmluZXMgWE1MIGVsZW1lbnQgcGF0dGVybi4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuIGV4dGVuZHMgQ29tcG9uZW50U2VhcmNoUGF0dGVybiB7Ci0JCi0JLyoqCi0JICogQ29udGFpbmluZyBlbGVtZW50IHBhdHRlcm5zCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlYTUxTZWFyY2hQYXR0ZXJuW10gY2hpbGRyZW4gPSBuZXcgWE1MU2VhcmNoUGF0dGVyblswXTsKLQkKLQkvKioKLQkgKiBBIG1hcCBvZiBYTUxTZWFyY2hQYXR0ZXJuW10gYnkge0BsaW5rIFNlYXJjaFBhcnRpY2lwYW50IHNlYXJjaCBwYXJ0aWNpcGFudH0uCi0JICovCi0JcHJvdGVjdGVkIE1hcCBjaGlsZFBhdHRlcm5zQnlQYXJ0aWNpcGFudCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHVibGljIFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4oSUZpbGUgZmlsZSwgUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUsIFF1YWxpZmllZE5hbWUgdHlwZVFOYW1lLCBpbnQgbWF0Y2hSdWxlKSB7Ci0JCXN1cGVyKGZpbGUsIGVsZW1lbnRRTmFtZSwgdHlwZVFOYW1lLCBtYXRjaFJ1bGUpOwotCQkKLQl9Ci0KLQotCXB1YmxpYyBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuKElGaWxlIGZpbGUsIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLCBRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSkgewotCQlzdXBlcihmaWxlLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSk7Ci0JCQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldENoaWxkcmVuKFNlYXJjaFBhcnRpY2lwYW50KX0gaW5zdGVhZC4KLQkgKi8KLQlwdWJsaWMgWE1MU2VhcmNoUGF0dGVybltdIGdldENoaWxkcmVuKCl7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjYWRkQ2hpbGRyZW4oU2VhcmNoUGFydGljaXBhbnQsIFhNTFNlYXJjaFBhdHRlcm5bXSl9IGluc3RlYWQuCi0gICAgICovCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oWE1MU2VhcmNoUGF0dGVybltdIHBhdHRlcm5zKXsKLQkJY2hpbGRyZW4gPSBwYXR0ZXJuczsKLQkJCi0JfQotCQotCS8qKgotCSAqIFByb3ZpZGVzIHRoZSBjaGlsZCBwYXR0ZXJucyBjb250cmlidXRlZCBieSB0aGUgZ2l2ZW4gc2VhcmNoIHBhcnRpY2lwYW50LiAKLQkgKiBAcGFyYW0gc2VhcmNoUGFydGljaXBhbnQgdGhlIHtAbGluayBTZWFyY2hQYXJ0aWNpcGFudCBzZWFyY2ggcGFydGljaXBhbnR9IHRoYXQgY29udHJpYnV0ZWQgdGhlIHBhdHRlcm5zLgotICAgICAqIEBzZWUgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybiNhZGRDaGlsZHJlbihTZWFyY2hQYXJ0aWNpcGFudCwgWE1MU2VhcmNoUGF0dGVybltdKSBhZGRDaGlsZHJlbgotCSAqIEByZXR1cm4gYW4gYXJyYXkgd2l0aCB0aGUge0BsaW5rIFhNTFNlYXJjaFBhdHRlcm4gcGF0dGVybnN9IGNvbnRyaWJ1dGVkIGJ5IHRoZSB7QGxpbmsgU2VhcmNoUGFydGljaXBhbnQgc2VhcmNoIHBhcnRpY2lwYW50fS4KLQkgKi8KLQlwdWJsaWMgWE1MU2VhcmNoUGF0dGVybltdIGdldENoaWxkcmVuKFNlYXJjaFBhcnRpY2lwYW50IHNlYXJjaFBhcnRpY2lwYW50KXsKLQkgIFhNTFNlYXJjaFBhdHRlcm5bXSBjaGlsZFBhdHRlcm5zID0gZ2V0Q2hpbGRyZW4oKTsKLQkgIGlmIChzZWFyY2hQYXJ0aWNpcGFudCAhPSBudWxsKXsKLQkgICAgY2hpbGRQYXR0ZXJucyA9IChYTUxTZWFyY2hQYXR0ZXJuW10pY2hpbGRQYXR0ZXJuc0J5UGFydGljaXBhbnQuZ2V0KHNlYXJjaFBhcnRpY2lwYW50KTsKLQkgICAgaWYgKGNoaWxkUGF0dGVybnMgPT0gbnVsbCl7Ci0JICAgICAgY2hpbGRQYXR0ZXJucyA9IGdldENoaWxkcmVuKCk7Ci0JICAgIH0KLQkgIH0KLQkgIHJldHVybiBjaGlsZFBhdHRlcm5zOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBjaGlsZCBwYXR0ZXJucyBjb250cmlidXRlZCBieSB0aGUgZ2l2ZW4gc2VhcmNoIHBhcnRpY2lwYW50LgotCSAqIEBwYXJhbSBzZWFyY2hQYXJ0aWNpcGFudCB0aGUge0BsaW5rIFNlYXJjaFBhcnRpY2lwYW50IHNlYXJjaCBwYXJ0aWNpcGFudH0gdGhhdCBpcyBjb250cmlidXRpbmcgdGhlIGNoaWxkIHNlYXJjaCBwYXR0ZXJucy4KLQkgKiBAcGFyYW0gY2hpbGRQYXR0ZXJucyB0aGUgY2hpbGQgcGF0dGVybnMgY29udHJpYnV0ZWQgYnkgdGhlIHtAbGluayBTZWFyY2hQYXJ0aWNpcGFudCBzZWFyY2hQYXJ0aWNpcGFudCBzZWFyY2ggcGFydGljaXBhbnR9LgotCSAqIEBzZWUgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybiNnZXRDaGlsZHJlbihTZWFyY2hQYXJ0aWNpcGFudCkgZ2V0Q2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZHJlbihTZWFyY2hQYXJ0aWNpcGFudCBzZWFyY2hQYXJ0aWNpcGFudCwgWE1MU2VhcmNoUGF0dGVybltdIGNoaWxkUGF0dGVybnMpewotCSAgaWYgKHNlYXJjaFBhcnRpY2lwYW50ICE9IG51bGwgJiYgY2hpbGRQYXR0ZXJucyAhPSBudWxsKSB7Ci0JICAgIGNoaWxkUGF0dGVybnNCeVBhcnRpY2lwYW50LnB1dChzZWFyY2hQYXJ0aWNpcGFudCwgY2hpbGRQYXR0ZXJucyk7Ci0JICB9Ci0JICBlbHNlIHsKLQkgICAgY2hpbGRyZW4gPSBjaGlsZFBhdHRlcm5zOwotCSAgfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxTZWFyY2hQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTFNlYXJjaFBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MDlmNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTFNlYXJjaFBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuQ29tcG9uZW50RGVjbGFyYXRpb25FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuRmlsZVJlZmVyZW5jZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5TZWFyY2hEb2N1bWVudFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uQ29tcG9uZW50U2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uRmlsZVJlZmVyZW5jZVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5Db250ZW50VHlwZVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guaW1wbC5JWE1MU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guaW1wbC5YTUxTZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLm1hdGNoaW5nLlBhdHRlcm5NYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gubWF0Y2hpbmcuWE1MU2VhcmNoUGF0dGVybk1hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5xdWlja3NjYW4uWE1MUXVpY2tTY2FuOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWE1MU2VhcmNoUGFydGljaXBhbnQgZXh0ZW5kcyBTZWFyY2hQYXJ0aWNpcGFudCB7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnUGVyZiA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoL3BlcmYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHVibGljIFhNTFNlYXJjaFBhcnRpY2lwYW50KCkgewotCQlzdXBlcigpOwotCX0KLQotCQotCS8qCi0gcHVibGljICBib29sZWFuIGluaXRpYWxpemUoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBTdHJpbmdbXSBjb250ZW50VHlwZXMpewotCQkKLQkgICAgc3VwZXIuaW5pdGlhbGl6ZShwYXR0ZXJuLCBjb250ZW50VHlwZXMpOwotCQl0aGlzLnN1cHBvcnRlZENvbnRlbnRUeXBlcyA9IGNvbnRlbnRUeXBlczsKLQkJCi0JCWlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuKXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ki8KLQotCQotCi0JcHVibGljIFNlYXJjaERvY3VtZW50IGNyZWF0ZVNlYXJjaERvY3VtZW50KFN0cmluZyBkb2N1bWVudFBhdGgpIHsKLQotCQlyZXR1cm4gbmV3IFhNTFNlYXJjaERvY3VtZW50KGRvY3VtZW50UGF0aCwgdGhpcyk7Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIlhNTCBzZWFyY2ggcGFydGljaXBhbnQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQotCXByaXZhdGUgdm9pZCBsb2NhdGVNYXRjaGVzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQsCi0JCQlTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLCBNYXAgc2VhcmNoT3B0aW9ucywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLSAgICAgICAgLy8gVE9ETy4uLiB1dGlsaXplIHNlYXJjaCBvcHRpb25zICh0aGF0IHNob3VsZCBnZXQgcGFzc2VkIGRvd24gdmlhIHRoZSBTZWFyY2hFbmdpbmUpCi0gICAgICAgIC8vIHRvIHNwZWNpZnkgaWYgYWNjdXJhdGUgc291cmNlIGNvb3JkaW5hdGVzIGFyZSByZXEnZCBpZiBub3QsIHNpbXBseSB1c2UgdGhlIFNBWCByZXN1bHRzCi0gICAgICAgIC8vCi0gICAgICAgIGlmIChwYXR0ZXJuLmdldE1hdGNoUnVsZSgpID09IFNlYXJjaFBhdHRlcm4uUl9QQVRURVJOX01BVENIKQotICAgICAgICB7ICAgICAgICAgIAotICAgICAgICAgIElGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChkb2N1bWVudC5nZXRQYXRoKCkpKTsKLSAgICAgICAgICAvLyBUT0RPLi4gZG9uJ3QgYXNzdW1lIHRoZSBjYXRlZ29yeSBpcyBDT01QT05FTlRfREVDTC4uLiBoYW5kbGUgYW55IGFyYml0YXJ0eSBjYXRlZ29yeQotICAgICAgICAgIEVudHJ5W10gZW50cmllcyA9IGRvY3VtZW50LmdldEVudHJpZXMoSVhNTFNlYXJjaENvbnN0YW50cy5DT01QT05FTlRfREVDTCwgbnVsbCwgMCk7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE8uLiBkb24ndCBhc3N1bWUgdGhpcyBpcyBqdXN0IGEgY29tcG9uZW50IGRlY2xhcmF0aW9uIGVudHJ5ICAgICAgICAgICAgCi0gICAgICAgICAgICBDb21wb25lbnREZWNsYXJhdGlvbkVudHJ5IGVudHJ5ID0gKENvbXBvbmVudERlY2xhcmF0aW9uRW50cnkpZW50cmllc1tpXTsKLSAgICAgICAgICAgIFNlYXJjaE1hdGNoIHNlYXJjaE1hdGNoID0gbmV3IFNlYXJjaE1hdGNoKG51bGwsIDAsIDAsIGZpbGUpOwotICAgICAgICAgICAgc2VhcmNoTWF0Y2gubWFwLnB1dCgibmFtZSIsIGVudHJ5LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHNlYXJjaE1hdGNoLm1hcC5wdXQoIm1ldGFOYW1lIiwgZW50cnkuZ2V0TWV0YU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXF1ZXN0b3IuYWNjZXB0U2VhcmNoTWF0Y2goc2VhcmNoTWF0Y2gpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgeyAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSAKLSAgICAgICAgeyAgaWYgKGRvY3VtZW50LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCQlJRE9NRWxlbWVudCBjb250ZXh0Tm9kZSA9IChJRE9NRWxlbWVudCkgZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKQotCQkJCQkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQlET01WaXNpdG9yIHZpc2l0b3IgPSBuZXcgRE9NVmlzaXRvcihkb2N1bWVudC5nZXRQYXRoKCksIHBhdHRlcm4sCi0JCQkJCXJlcXVlc3Rvcik7Ci0JCQl2aXNpdG9yLnZpc2l0KGNvbnRleHROb2RlKTsKLQkJfQotICAgICAgICB9Ci0JfQotCQotCXByaXZhdGUgUGF0dGVybk1hdGNoZXIgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZiAoUGF0dGVybk1hdGNoZXIuY2xhc3MuZXF1YWxzKGFkYXB0ZXJUeXBlKSAmJgotCQkJCShhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBYTUxTZWFyY2hQYXR0ZXJuIHx8Ci0JCQkJYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybikgKSB7Ci0JCQlyZXR1cm4gbmV3IFhNTFNlYXJjaFBhdHRlcm5NYXRjaGVyKHRoaXMpOwotCQl9IAotCQlyZXR1cm4gbnVsbDsgCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBET01WaXNpdG9yIHsKLQotCQlTdHJpbmcgcGF0aDsKLQkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuOwotCQlTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yOwotCQlQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyOwotCi0JCQotCQlwcm90ZWN0ZWQgRE9NVmlzaXRvcihTdHJpbmcgcGF0aCwgU2VhcmNoUGF0dGVybiBwYXR0ZXJuLAotCQkJCVNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnBhdGggPSBwYXRoOwotCQkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLQkJCQotCQkJbWF0Y2hlciA9IChQYXR0ZXJuTWF0Y2hlcilwYXR0ZXJuLmdldEFkYXB0ZXIoUGF0dGVybk1hdGNoZXIuY2xhc3MpOwotCQkJaWYobWF0Y2hlciA9PSBudWxsKXsKLQkJCQltYXRjaGVyID0gZ2V0QWRhcHRlcihwYXR0ZXJuLCBQYXR0ZXJuTWF0Y2hlci5jbGFzcyk7Ci0JCQl9Ci0JCQl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB2aXNpdChOb2RlIG5vZGUpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQltYXRjaCgoRWxlbWVudClub2RlKTsKLQkJCQlOb2RlTGlzdCBub2RlTGlzdCA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlOb2RlIGFOb2RlID0gbm9kZUxpc3QuaXRlbShpKTsKLQkJCQkJdmlzaXQoYU5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBtYXRjaChFbGVtZW50IG5vZGUpIHsKLQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbigKLQkJCQkJbmV3IFBhdGgocGF0aCkpOwotCQkJaWYobWF0Y2hlciAhPSBudWxsKXsKLQkJCQltYXRjaGVyLmxvY2F0ZU1hdGNoZXMocGF0dGVybiwgZmlsZSwgbm9kZSwgcmVxdWVzdG9yKTsKLQkJCX0KLQotCQkJCi0JCX0KLQotCX0KLQotCXB1YmxpYyBTZWFyY2hTY29wZSBzZWxlY3REb2N1bWVudExvY2F0aW9ucyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNlYXJjaFNjb3BlIHNjb3BlLCBNYXAgc2VhcmNoT3B0aW9ucywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8qCi0JCSAqIGdhdGUgIzE6IHJlZHVjZSB0aGUgc2NvcGUgdG8gdGhlIGZpbGVzIHdpdGggdGhlIGNvbnRlbnQgdHlwZSB0aGF0Ci0JCSAqIGNvdWxkIGJlIHNlYXJjaGVkIHVzaW5nIHRoaXMgcGFydGljaXBhbnQKLQkJICovIAotCQlTdHJpbmdbXSBjb250ZW50VHlwZXMgPSBnZXRTdXBwb3J0ZWRDb250ZW50VHlwZXMoKTsJCi0JCWlmKGNvbnRlbnRUeXBlcyAhPSBudWxsICYmIGNvbnRlbnRUeXBlcy5sZW5ndGggPiAwKXsKLQkJCXNjb3BlID0gbmV3IENvbnRlbnRUeXBlU2VhcmNoU2NvcGUoc2NvcGUsIGNvbnRlbnRUeXBlcyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnNlbGVjdERvY3VtZW50TG9jYXRpb25zKHBhdHRlcm4sIHNjb3BlLCBzZWFyY2hPcHRpb25zLCBtb25pdG9yKTsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IENvbXBvbmVudFNlYXJjaENvbnRyaWJ1dG9yIGdldFNlYXJjaENvbnRyaWJ1dG9yKCk7Ci0KLQotCXB1YmxpYyB2b2lkIGJlZ2luU2VhcmNoaW5nKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgTWFwIHNlYXJjaE9wdGlvbnMpIHsKLQkJCi0JCXN1cGVyLmJlZ2luU2VhcmNoaW5nKHBhdHRlcm4sIHNlYXJjaE9wdGlvbnMpOwotCQlpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuKXsKLQkJCVhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybiBjb21wb25lbnRQYXR0ZXJuID0gKFhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybilwYXR0ZXJuOwotCQkJWE1MU2VhcmNoUGF0dGVybiBjaGlsZFBhdHRlcm4gPSBnZXRTZWFyY2hDb250cmlidXRvcigpLmdldERlY2xhcmF0aW9uUGF0dGVybihjb21wb25lbnRQYXR0ZXJuLmdldE1ldGFOYW1lKCkpOwotCQkJaWYoY2hpbGRQYXR0ZXJuICE9IG51bGwpewotCQkJCQljaGlsZFBhdHRlcm4uc2V0U2VhcmNoTmFtZShjb21wb25lbnRQYXR0ZXJuLmdldE5hbWUoKS5nZXRMb2NhbE5hbWUoKSk7Ci0JCQkJCWNoaWxkUGF0dGVybi5zZXRTZWFyY2hOYW1lc3BhY2UoY29tcG9uZW50UGF0dGVybi5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCSAgICAgCQkJY29tcG9uZW50UGF0dGVybi5hZGRDaGlsZHJlbih0aGlzLCBuZXcgWE1MU2VhcmNoUGF0dGVybltde2NoaWxkUGF0dGVybn0pOwotCQkJfQotCQkJCi0JCX0KLQkJZWxzZSBpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybil7Ci0JCQlYTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuIGNvbXBvbmVudFBhdHRlcm4gPSAoWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybilwYXR0ZXJuOwotCQkJWE1MU2VhcmNoUGF0dGVybltdIGNoaWxkUGF0dGVybnMgPSBnZXRTZWFyY2hDb250cmlidXRvcigpLmdldFJlZmVyZW5jZXNQYXR0ZXJucyhjb21wb25lbnRQYXR0ZXJuLmdldE1ldGFOYW1lKCkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZFBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJWE1MU2VhcmNoUGF0dGVybiBjaGlsZFBhdHRlcm4gPSBjaGlsZFBhdHRlcm5zW2ldOwotCQkJCWNoaWxkUGF0dGVybi5zZXRTZWFyY2hOYW1lKGNvbXBvbmVudFBhdHRlcm4uZ2V0TmFtZSgpLmdldExvY2FsTmFtZSgpKTsKLQkJCQljaGlsZFBhdHRlcm4uc2V0U2VhcmNoTmFtZXNwYWNlKGNvbXBvbmVudFBhdHRlcm4uZ2V0TmFtZSgpLmdldE5hbWVzcGFjZSgpKTsJCQkJCi0JCQl9Ci0JCQljb21wb25lbnRQYXR0ZXJuLmFkZENoaWxkcmVuKHRoaXMsIGNoaWxkUGF0dGVybnMpOwotCQkJCi0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogVGhlIGludGVuZCBvZiB0aGlzIG1ldGhvZCBpcyB0byBsaW1pdCB0aGUgc2VhcmNoIHRvIHRoZSBmaWxlcyB0aGF0IGhhdmUgY29udGVudCAKLQkgKiB3aGljaCBjYW4gYmUgc2VhcmNoZWQgZm9yIHRoZSBnaXZlbiBwYXR0ZXJuLiBJdCBpcyBjYWxsZWQgZnJvbSAKLQkgKiB7QGxpbmsgI3NlbGVjdERvY3VtZW50TG9jYXRpb25zKFNlYXJjaFBhdHRlcm4sIFNlYXJjaFNjb3BlLCBJUHJvZ3Jlc3NNb25pdG9yKX0KLQkgKiAKLQkgKiBAcGFyYW0gcGF0dGVybiB0aGUgc2VhcmNoIHBhdHRlcm4gdGhhdCBpcyBzZWFyY2hlZCBmb3IKLQkgKiBAcmV0dXJuIGNvbnRlbnQgdHlwZSdzIHVuaXF1ZSBpZGVudGlmaWVycyB0aGF0IGNvdWxkIGJlIHNlYXJjaGVkIGZvciB0aGUgZ2l2ZW4gcGF0dGVybi4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ29udGVudFR5cGVzKCk7Ci0KLQlwdWJsaWMgdm9pZCBwb3B1bGF0ZVNlYXJjaERvY3VtZW50KFNlYXJjaERvY3VtZW50IGRvY3VtZW50LCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pCi0JewotCQlQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyID0gKFBhdHRlcm5NYXRjaGVyKXBhdHRlcm4uZ2V0QWRhcHRlcihQYXR0ZXJuTWF0Y2hlci5jbGFzcyk7Ci0JCWlmKG1hdGNoZXIgPT0gbnVsbCl7Ci0JCQltYXRjaGVyID0gZ2V0QWRhcHRlcihwYXR0ZXJuLCBQYXR0ZXJuTWF0Y2hlci5jbGFzcyk7Ci0JCX0KLQkJWE1MUXVpY2tTY2FuLnBvcHVsYXRlU2VhcmNoRG9jdW1lbnQoZG9jdW1lbnQsIG1hdGNoZXIsIHBhdHRlcm4pOwkJCi0JfQotCi0JcHVibGljIHZvaWQgbG9jYXRlTWF0Y2hlcyhTZWFyY2hEb2N1bWVudFNldCBkb2N1bWVudFNldCwgU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgTWFwIHNlYXJjaE9wdGlvbnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkKLQkJLy8gVE9ETzogdXNlIHRoZSBmaWxlIHJlZmVyZW5jZSBlbnRyaWVzIGluIHRoZSBkb2N1bWVudHMgdG8gcmVkdWNlIHRoZSBzY29wZSB0byB0aGUgcmVmZXJlbmNlZCBmaWxlcyBvbmx5Ci0JCS8vIFNlYXJjaERvY3VtZW50W10gZG9jdW1lbnRzID0gZG9jdW1lbnRTZXQuZ2V0U2VhcmNoRG9jdW1lbnRzKGlkKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSBzZWFyY2ggcGF0dGVybiBpcyBxdWFsaWZpZWQgYnkgYSBmaWxlIGxvY2F0aW9uCi0gICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB3ZSBjYW4gdXNlIGZpbGUgc2NvcGluZyBydWxlcyB0byBwcnVuZSB0aGUgbWF0Y2hlcwotICAgICAgICBJRmlsZSB0YXJnZXRGaWxlID0gbnVsbDsKLSAgICAgICAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBDb21wb25lbnRTZWFyY2hQYXR0ZXJuKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50U2VhcmNoUGF0dGVybiBjb21wb25lbnRTZWFyY2hQYXR0ZXJuID0gKENvbXBvbmVudFNlYXJjaFBhdHRlcm4pcGF0dGVybjsKLSAgICAgICAgICB0YXJnZXRGaWxlID0gY29tcG9uZW50U2VhcmNoUGF0dGVybi5nZXRGaWxlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0JCQotICAgICAgICAKLQkJLy8gaGVyZSB3ZSBzaG91bGQgaGF2ZSBpbiBzY29wZSBvbmx5IHJlZmVyZW5jZWQgZmlsZXMKLQkJSUZpbGVbXSBmaWxlcyA9IHNjb3BlLmVuY2xvc2luZ0ZpbGVzKCk7ICAKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKLQkJewotCQkJSUZpbGUgZmlsZSA9IGZpbGVzW2ldOwotCQkJU3RyaW5nIHBhdGggPSBmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCVNlYXJjaERvY3VtZW50IGRvY3VtZW50ID0gZG9jdW1lbnRTZXQuZ2V0U2VhcmNoRG9jdW1lbnQocGF0aCwgaWQpOyAKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKQotCQkJeyAgICAgICAgICAgICAgCi0JCQlFbnRyeVtdIGVudHJpZXMgPSBkb2N1bWVudC5nZXRFbnRyaWVzKGdldFNlYXJjaEVudHJ5Q2F0ZWdvcnkocGF0dGVybiksIG51bGwsIDApOyAgICAgICAgICAgCi0JCQlpZiAoKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCA+IDApIHx8IChzZWFyY2hPcHRpb25zICE9IG51bGwgJiYgc2VhcmNoT3B0aW9ucy5nZXQoInNlYXJjaERpcnR5Q29udGVudCIpICE9IG51bGwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvL2ZvciAoaW50IGogPSAwOyBqIDwgZW50cmllcy5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAgIC8vICBFbnRyeSBlbnRyeSA9IGVudHJpZXNbal07Ci0gICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImVudHJ5ICIgKyBlbnRyeS5nZXRDYXRlZ29yeSgpICsgIiAiICsgZW50cnkuZ2V0S2V5KCkgKyAiICIgKyBlbnRyeS5nZXRDbGFzcygpLmdldE5hbWUoKSk7ICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgLy99ICAKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGJvb2xlYW4gaXNJblNjb3BlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgaWYgKHRhcmdldEZpbGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlzSW5TY29wZSA9IGlzTGlua2VkKGRvY3VtZW50U2V0LCAiZmlsZTovLy8iICsgcGF0aCwgImZpbGU6Ly8vIiArIHRhcmdldEZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgICAvL2lmIChwYXRoLmVuZHNXaXRoKCJDYW5jZWxTZWxlY3Rpb24ud3NkbCIpICAmJiBwYXRoLmluZGV4T2YoImNsb25lMSIpICE9IC0xKQotICAgICAgICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAgICAgICAvLyAgZmlsZVJlZmVyZW5jZVRhYmxlLmRlYnVnKHF1YWxpZmllZFBhdGgsIDAsIDUpOwotICAgICAgICAgICAgICAgICAgLy99ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBpZiAoaXNJblNjb3BlKQotICAgICAgICAgICAgICB7IAotCQkJICAgIHRoaXMubG9jYXRlTWF0Y2hlcyhwYXR0ZXJuLCBkb2N1bWVudCwgcmVxdWVzdG9yLCBzZWFyY2hPcHRpb25zLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICB9Ci0JCQl9Ci0JCX0KLQkJCi0JCQotCQlpZiAoZGVidWdQZXJmKQotCQl7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCIiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIGdldERlc2NyaXB0aW9uKCkKLQkJCQkJCQkrICI6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSArICJtcyBmb3IgbG9jYXRlTWF0Y2hlcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCQotCX0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNMaW5rZWQoU2VhcmNoRG9jdW1lbnRTZXQgc2V0LCBTdHJpbmcgc291cmNlLCBTdHJpbmcgdGFyZ2V0KQotICAgIHsKLSAgICAgIHJldHVybiBpc0xpbmtlZChzZXQsIHNvdXJjZSwgdGFyZ2V0LCBuZXcgSGFzaE1hcCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTGlua2VkKFNlYXJjaERvY3VtZW50U2V0IHNldCwgU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCwgSGFzaE1hcCB2aXNpdGVkKQotICAgIHsKLSAgICAgIGlmIChzb3VyY2UuZXF1YWxzKHRhcmdldCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgCi0gICAgICBTdHJpbmcgZmlsZVByb3RvY29sID0gImZpbGU6Ly8vIjsgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgCi0gICAgICAvLyBGaXggZm9yIGJ1ZyAyMDQxNzQgLSBCZWdpbgotICAgICAgaWYodGFyZ2V0LmNoYXJBdChmaWxlUHJvdG9jb2wubGVuZ3RoKCkpID09ICcvJykgIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgICB0YXJnZXQgPSBmaWxlUHJvdG9jb2wgKyB0YXJnZXQuc3Vic3RyaW5nKGZpbGVQcm90b2NvbC5sZW5ndGgoKSArIDEpOwotICAgICAgfQotICAgICAgLy8gRml4IGZvciBidWcgMjA0MTc0IC0gRW5kCi0gICAgICAgICAgICAKLSAgICAgIGlmIChzb3VyY2Uuc3RhcnRzV2l0aChmaWxlUHJvdG9jb2wpKQotICAgICAgeyAgICAKLSAgICAgICAgCi0gICAgICBTZWFyY2hEb2N1bWVudCBkb2N1bWVudCA9IHNldC5fdGVtcEdldFNlYXJjaERvY3VtZXRuKHNvdXJjZS5zdWJzdHJpbmcoZmlsZVByb3RvY29sLmxlbmd0aCgpKSk7ICAgICAgCi0gICAgICBpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgIHsgICAgICAgIAotICAgICAgICBVUklSZXNvbHZlciB1cmlSZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7ICAgICAgICAKLSAgICAgICAgRW50cnlbXSBlbnRyaWVzID0gZG9jdW1lbnQuZ2V0RW50cmllcyhJWE1MU2VhcmNoQ29uc3RhbnRzLlJFRiwgbnVsbCwgMCk7Ci0gICAgICAgIFN0cmluZ1tdIHJlc29sdmVFbnRyeSA9IG5ldyBTdHJpbmdbZW50cmllcy5sZW5ndGhdOyAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZW50cmllcy5sZW5ndGg7IGorKykKLSAgICAgICAgewotICAgICAgICAgIEVudHJ5IGVudHJ5ID0gZW50cmllc1tqXTsKLSAgICAgICAgICBpZiAoZW50cnkgaW5zdGFuY2VvZiBGaWxlUmVmZXJlbmNlRW50cnkpCi0gICAgICAgICAgewotICAgICAgICAgICAgRmlsZVJlZmVyZW5jZUVudHJ5IGZpbGVSZWZlcmVuY2VFbnRyeSA9IChGaWxlUmVmZXJlbmNlRW50cnkpZW50cnk7Ci0gICAgICAgICAgICAvLyBUT0RPLi4gcmVjb3JkIGFuIHV0aWxpemUgdGhlIHB1YmxpYyBpZCBmcm9tIHRoZSBmaWxlUmVmZXJlbmNlRW50cnkKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBpZiAoZmlsZVJlZmVyZW5jZUVudHJ5LmdldFJlbGF0aXZlRmlsZVBhdGgoKSAhPSBudWxsKQotICAgICAgICAgICAgeyAgCi0gICAgICAgICAgICAgIFN0cmluZyByZXNvbHZlZFVSSSA9IHVyaVJlc29sdmVyLnJlc29sdmUoc291cmNlLCBudWxsLCBmaWxlUmVmZXJlbmNlRW50cnkuZ2V0UmVsYXRpdmVGaWxlUGF0aCgpKTsKLSAgICAgICAgICAgICAgcmVzb2x2ZUVudHJ5W2pdID0gcmVzb2x2ZWRVUkk7Ci0gICAgICAgICAgICAgIGlmIChyZXNvbHZlZFVSSS5lcXVhbHModGFyZ2V0KSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICB9ICAgICAgICAgICAgIAotICAgICAgICAgICAgfSAgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIG5vdyBzZWUgaWYgdGhlcmUncyBhbiBpbmRpcmVjdCBsaW5rIGZyb20gdGhlIHNvdXJjZSB0byB0aGUgdGFyZ2V0Ci0gICAgICAgIC8vIHdlIGtlZXAgdHJhY2sgb2YgdGhlIG5vZGVzIHdlJ3ZlIGFscmVhZHkgdmlzaXRlZCB0byBhdm9pZCBjeWNsZXMKLSAgICAgICAgaWYgKHZpc2l0ZWQuZ2V0KHNvdXJjZSkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0ZWQucHV0KHNvdXJjZSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVudHJpZXMubGVuZ3RoOyBqKyspCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIHJlc29sdmVkVVJJID0gcmVzb2x2ZUVudHJ5W2pdOwotICAgICAgICAgICAgaWYgKHJlc29sdmVkVVJJICE9IG51bGwgJiYgaXNMaW5rZWQoc2V0LCByZXNvbHZlRW50cnlbal0sIHRhcmdldCwgdmlzaXRlZCkpICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAKLSAgICAgICAgICB9ICAgIAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgfSAgICAgICAgICAgIAotICAgICAgfSAKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAKLSAgICAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZWFyY2hFbnRyeUNhdGVnb3J5KFNlYXJjaFBhdHRlcm4gcGF0dGVybil7Ci0JCWlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4pewotCQkJcmV0dXJuIElYTUxTZWFyY2hDb25zdGFudHMuQ09NUE9ORU5UX0RFQ0w7Ci0JCX0KLQkJZWxzZSBpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybil7Ci0JCQlyZXR1cm4gSVhNTFNlYXJjaENvbnN0YW50cy5DT01QT05FTlRfUkVGOwotCQl9Ci0JCWVsc2UgaWYocGF0dGVybiBpbnN0YW5jZW9mIEZpbGVSZWZlcmVuY2VQYXR0ZXJuKXsKLQkJICAgcmV0dXJuIElYTUxTZWFyY2hDb25zdGFudHMuQ09NUE9ORU5UX1JFRjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9ICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MU2VhcmNoUGF0dGVybi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTFNlYXJjaFBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiNThlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MU2VhcmNoUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci0KLXB1YmxpYyBjbGFzcyBYTUxTZWFyY2hQYXR0ZXJuIGV4dGVuZHMgU2VhcmNoUGF0dGVybnsKLQkKLQlwcml2YXRlIFN0cmluZyBlbGVtZW50TmFtZXNwYWNlID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBlbGVtZW50TmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgc2VhcmNoTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgc2VhcmNoTmFtZXNwYWNlID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBwYXJlbnROYW1lID0gbnVsbDsKLSAgICBwcml2YXRlIGludCBkZXB0aCA9IC0xOwotCi0gICAgcHVibGljIFhNTFNlYXJjaFBhdHRlcm4oU3RyaW5nIGVsZW1lbnROYW1lc3BhY2UsIFN0cmluZyBwYXJlbnRFbGVtZW50TmFtZSxTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0gICAgCXRoaXMoZWxlbWVudE5hbWVzcGFjZSwgcGFyZW50RWxlbWVudE5hbWUsIGVsZW1lbnROYW1lLCBhdHRyaWJ1dGVOYW1lLCAtMSk7Ci0gICAgfQotCQotCXB1YmxpYyBYTUxTZWFyY2hQYXR0ZXJuKFN0cmluZyBlbGVtZW50TmFtZXNwYWNlLCBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0gICAgICAgdGhpcyhlbGVtZW50TmFtZXNwYWNlLCBudWxsLCBlbGVtZW50TmFtZSwgYXR0cmlidXRlTmFtZSwgLTEpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgWE1MU2VhcmNoUGF0dGVybihTdHJpbmcgZWxlbWVudE5hbWVzcGFjZSwgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgaW50IGRlcHRoKSB7Ci0gICAgCXRoaXMoZWxlbWVudE5hbWVzcGFjZSwgbnVsbCwgZWxlbWVudE5hbWUsIGF0dHJpYnV0ZU5hbWUsIGRlcHRoKTsgICAgICAgCi0gICAgfQotICAgICAgICAgICAKLSAgICBwcml2YXRlIFhNTFNlYXJjaFBhdHRlcm4oU3RyaW5nIGVsZW1lbnROYW1lc3BhY2UsIFN0cmluZyBwYXJlbnRFbGVtZW50TmFtZSwgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgaW50IGRlcHRoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7Ci0gICAgICAgIHRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKLSAgICAgICAgdGhpcy5wYXJlbnROYW1lID0gcGFyZW50RWxlbWVudE5hbWU7Ci0gICAgICAgIHRoaXMuZWxlbWVudE5hbWVzcGFjZSA9IGVsZW1lbnROYW1lc3BhY2U7Ci0gICAgICAgIHRoaXMuZGVwdGggPSBkZXB0aDsKLSAgICB9Ci0gICAgCi0JcHVibGljIFhNTFNlYXJjaFBhdHRlcm4oKXsKLQkJCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZU5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnROYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnROYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZWFyY2hOYW1lKCkgewotCQlyZXR1cm4gc2VhcmNoTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNlYXJjaE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHNlYXJjaE5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWFyY2hOYW1lKFN0cmluZyBzZWFyY2hOYW1lKSB7Ci0JCXRoaXMuc2VhcmNoTmFtZSA9IHNlYXJjaE5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VhcmNoTmFtZXNwYWNlKFN0cmluZyBzZWFyY2hOYW1lc3BhY2UpIHsKLQkJdGhpcy5zZWFyY2hOYW1lc3BhY2UgPSBzZWFyY2hOYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQl0aGlzLmF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnROYW1lKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQl0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudE5hbWVzcGFjZShTdHJpbmcgZWxlbWVudE5hbWVzcGFjZSkgewotCQl0aGlzLmVsZW1lbnROYW1lc3BhY2UgPSBlbGVtZW50TmFtZXNwYWNlOwotCX0KLQotICBwdWJsaWMgaW50IGdldERlcHRoKCkKLSAgewotICAgIHJldHVybiBkZXB0aDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlcHRoKGludCBkZXB0aCkKLSAgewotICAgIHRoaXMuZGVwdGggPSBkZXB0aDsKLSAgfQotCi1wdWJsaWMgU3RyaW5nIGdldFBhcmVudE5hbWUoKSB7Ci0JcmV0dXJuIHBhcmVudE5hbWU7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFBhcmVudE5hbWUoU3RyaW5nIHBhcmVudE5hbWUpIHsKLQl0aGlzLnBhcmVudE5hbWUgPSBwYXJlbnROYW1lOwotfQotCQotCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvSVhNTFNlYXJjaENvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvSVhNTFNlYXJjaENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTYwZDgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL0lYTUxTZWFyY2hDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLmltcGw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVhNTFNlYXJjaENvbnN0YW50cwotewotCQlTdHJpbmcgUkVGPSAib3V0TGluayI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIENPTVBPTkVOVF9ERUNMID0gImNvbXBvbmVudERlY2wiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBDT01QT05FTlRfUkVGID0gImNvbXBvbmVudERlY2wiOyAvLyROT04tTkxTLTEkCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhZTIyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guaW1wbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCQotCS8qKgotCSAqIEJpbmQgdGhlIGdpdmVuIG1lc3NhZ2UncyBzdWJzdGl0dXRpb24gbG9jYXRpb25zIHdpdGggdGhlIGdpdmVuIHN0cmluZyB2YWx1ZXMuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbWFuaXB1bGF0ZWQKLQkgKiBAcmV0dXJuIHRoZSBtYW5pcHVsYXRlZCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBiaW5kKG1lc3NhZ2UsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBCaW5kIHRoZSBnaXZlbiBtZXNzYWdlJ3Mgc3Vic3RpdHV0aW9uIGxvY2F0aW9ucyB3aXRoIHRoZSBnaXZlbiBzdHJpbmcgdmFsdWVzLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIG1hbmlwdWxhdGVkCi0JICogQHBhcmFtIGJpbmRpbmcgdGhlIG9iamVjdCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBtZXNzYWdlCi0JICogQHJldHVybiB0aGUgbWFuaXB1bGF0ZWQgU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGJpbmRpbmcpIHsKLQkJcmV0dXJuIGJpbmQobWVzc2FnZSwgbmV3IE9iamVjdFtdIHtiaW5kaW5nfSk7Ci0JfQotCi0JLyoqCi0JICogQmluZCB0aGUgZ2l2ZW4gbWVzc2FnZSdzIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBtYW5pcHVsYXRlZAotCSAqIEBwYXJhbSBiaW5kaW5nMSBBbiBvYmplY3QgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgbWVzc2FnZQotCSAqIEBwYXJhbSBiaW5kaW5nMiBBIHNlY29uZCBvYmplY3QgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgbWVzc2FnZQotCSAqIEByZXR1cm4gdGhlIG1hbmlwdWxhdGVkIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBiaW5kaW5nMSwgT2JqZWN0IGJpbmRpbmcyKSB7Ci0JCXJldHVybiBiaW5kKG1lc3NhZ2UsIG5ldyBPYmplY3RbXSB7YmluZGluZzEsIGJpbmRpbmcyfSk7Ci0JfQotCi0JLyoqCi0JICogQmluZCB0aGUgZ2l2ZW4gbWVzc2FnZSdzIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBtYW5pcHVsYXRlZAotCSAqIEBwYXJhbSBiaW5kaW5ncyBBbiBhcnJheSBvZiBvYmplY3RzIHRvIGJlIGluc2VydGVkIGludG8gdGhlIG1lc3NhZ2UKLQkgKiBAcmV0dXJuIHRoZSBtYW5pcHVsYXRlZCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBtZXNzYWdlLCBPYmplY3RbXSBiaW5kaW5ncykgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobWVzc2FnZSwgYmluZGluZ3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvWE1MU2VhcmNoRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL1hNTFNlYXJjaERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MDhhZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvWE1MU2VhcmNoRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MU2VhcmNoUGFydGljaXBhbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYTUxTZWFyY2hEb2N1bWVudCBleHRlbmRzIFNlYXJjaERvY3VtZW50IHsKLQkKLQlJRE9NTW9kZWwgbW9kZWw7Ci0JTWFwIGVudHJpZXMgPSBuZXcgSGFzaE1hcCgpOyAvLyBjYXRlZ29yeSAtPiBzZXQgKGVudHJ5KQkKLQotCXB1YmxpYyBYTUxTZWFyY2hEb2N1bWVudChTdHJpbmcgZG9jdW1lbnRQYXRoLCBYTUxTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCkgewotCQlzdXBlcihkb2N1bWVudFBhdGgsIHBhcnRpY2lwYW50KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsKCkgewotCQlpZihtb2RlbCA9PSBudWxsKXsKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGluZyBET00gZm9yICIgKyBnZXRQYXRoKCkpOwotCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKGdldFBhdGgoKSkpOwotCQkJaWYoZmlsZSAhPSBudWxsKXsKLQkJCQl0cnkgewotCQkJCQltb2RlbCA9IChJRE9NTW9kZWwpU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoZmlsZSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgRW50cnlbXSBnZXRFbnRyaWVzKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIGtleSwgaW50IG1hdGNoUnVsZSkKLQl7Ci0JCS8vIFRPRE8gdXNlIG1hdGNoUnVsZQotCQlTZXQgcmVzdWx0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmKGNhdGVnb3J5ICE9IG51bGwpewotCQkJU2V0IHZhbHVlcyA9IChTZXQpZW50cmllcy5nZXQoY2F0ZWdvcnkpOwotCQkJaWYodmFsdWVzID09IG51bGwpewotCQkJCXJldHVybiBuZXcgRW50cnlbMF07Ci0JCQl9Ci0JCQlpZihrZXkgPT0gbnVsbCB8fCAiIi5lcXVhbHMoa2V5KSB8fCAiKiIuZXF1YWxzKGtleSkpeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkvLyBlbnRyaWVzIHdpdGggYW55IGtleSBpbiB0aGUgZ2l2ZW4gY2F0ZWdvcnkKLQkJCQlyZXN1bHRzLmFkZEFsbCh2YWx1ZXMpOwotCQkJfQotCQkJZWxzZXsKLQkJCQkvLyBlbnRyaWVzIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgaW4gdGhlIGdpdmVuIGNhdGVnb3J5Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJCQl7Ci0JCQkJCUVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYoa2V5LmVxdWFscyhlbnRyeS5nZXRLZXkoKSkpewotCQkJCQkJcmVzdWx0cy5hZGQoZW50cnkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0KLQkJcmV0dXJuIChFbnRyeVtdKSByZXN1bHRzLnRvQXJyYXkobmV3IEVudHJ5W3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHV0RW50cnkoRW50cnkgZW50cnkpCi0JewotCQlpZihlbnRyeS5nZXRDYXRlZ29yeSgpICE9IG51bGwpewotCQkJU2V0IHZhbHVlcyA9IChTZXQpZW50cmllcy5nZXQoZW50cnkuZ2V0Q2F0ZWdvcnkoKSk7Ci0JCQlpZih2YWx1ZXMgPT0gbnVsbCl7Ci0JCQkJZW50cmllcy5wdXQoZW50cnkuZ2V0Q2F0ZWdvcnkoKSwgdmFsdWVzPW5ldyBIYXNoU2V0KCkpOwotCQkJfQotCQkJdmFsdWVzLmFkZChlbnRyeSk7Ci0JCX0KLQkJCi0JfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgeyAgICAgCi0gICAgICBpZiAobW9kZWwgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBtb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsgICAgICAgIAotICAgICAgfSAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYWVhOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9tYXRjaGluZy9QYXR0ZXJuTWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL21hdGNoaW5nL1BhdHRlcm5NYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNTE4ZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL21hdGNoaW5nL1BhdHRlcm5NYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5tYXRjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIG1hdGNoaW5nIGltcGxlbWVudGF0aW9uLiAgCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgb2YgdGhlIFBhdHRlcm5NYXRjaGVzIHNob3VsZCBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzcGVjaWZpYyBwYXR0ZXJuIG1hdGNoaW5nLgotICogPC9wPgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG9mIHRoZSBQYXR0ZXJuTWF0Y2hlcyBzaG91bGQgYmUgc2V0IGFzIGFkYXB0ZXJzIGZvciB0aGUgcGF0dGVybnMgdGhhdCB0aGV5IG1hdGNoLgotICogPC9wPgotICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQjc2VsZWN0RG9jdW1lbnRMb2NhdGlvbnMoKX0gd2lsbCBjYWxsIAotICogeyBAbGluayBQYXR0ZXJuTWF0Y2hlciNtYXRjaGVzKCkgfSBvbiB0aGUgYWRhcHRlciBvbiBwYXR0ZXJuIG1hdGNoZXIuCi0gKiAKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50I2xvY2F0ZU1hdGNoZXMoKX0gd2lsbCBjYWxsIAotICogeyBAbGluayBQYXR0ZXJuTWF0Y2hlciNsb2NhdGVNYXRjaGVzKCkgfSBvbiB0aGUgYWRhcHRlciBvbiBwYXR0ZXJuIG1hdGNoZXIuCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGF0dGVybk1hdGNoZXIgewotCQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGRvZXMgZGl2ZSBhY3R1YWwgbWF0Y2ggbG9jYXRpb24gdG8gdGhlIHJlcXVlc3RvciBpZiB0aGVyZSBhcmUgbWF0Y2hlcwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGxvY2F0ZU1hdGNoZXMoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBJRmlsZSBmaWxlLCBFbGVtZW50IGVsZW1lbnQsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgb25seSBhbnN3ZXJzIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgZWxlbWVudCwgaXQgZG9lcyBub3QgZ2l2ZSBhY3R1YWwgbWF0Y2ggbG9jYXRpb24KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBtYXRjaGVzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgT2JqZWN0IGVsZW1lbnQpOwotICAgIAotICAgIHByb3RlY3RlZCBTZWFyY2hNYXRjaCBjcmVhdGVTZWFyY2hNYXRjaChJRmlsZSBmaWxlLCBBdHRyIGF0dHJpYnV0ZU5vZGUpCi0gICAgewotICAgICAgICBpbnQgc3RhcnQgPSAwOwotICAgICAgICBpbnQgbGVuZ3RoID0gMDsKLSAgICAgICAgaWYoYXR0cmlidXRlTm9kZSBpbnN0YW5jZW9mIElET01BdHRyKXsKLSAgICAgICAgICAgIElET01BdHRyIGRvbUF0dHIgPSAoSURPTUF0dHIpYXR0cmlidXRlTm9kZTsKLSAgICAgICAgICAgIHN0YXJ0ID0gZG9tQXR0ci5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCk7Ci0gICAgICAgICAgICBsZW5ndGggPSBkb21BdHRyLmdldFZhbHVlUmVnaW9uVGV4dCgpLmxlbmd0aCgpOwotICAgICAgICB9Ci0gICAgICAgIFNlYXJjaE1hdGNoIG1hdGNoID0gbmV3IFNlYXJjaE1hdGNoKGF0dHJpYnV0ZU5vZGUsIHN0YXJ0LCBsZW5ndGgsIGZpbGUpOwotICAgICAgICByZXR1cm4gbWF0Y2g7Ci0gICAgfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE1hdGNoKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUZpbGUgZmlsZSwgQXR0ciBhdHRyaWJ1dGVOb2RlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJhZGRNYXRjaCAiICsgcGF0dGVybiArICIgIiArIGF0dHJpYnV0ZU5vZGUuZ2V0TmFtZSgpICsgIj0iICsgYXR0cmlidXRlTm9kZS5nZXRWYWx1ZSgpKTsKLQkJaWYgKGF0dHJpYnV0ZU5vZGUgIT0gbnVsbCkgewotCQkJCVNlYXJjaE1hdGNoIG1hdGNoID0gY3JlYXRlU2VhcmNoTWF0Y2goZmlsZSwgYXR0cmlidXRlTm9kZSk7ICAgICAgICAgICAgICAgIAotCQkJCWlmKHJlcXVlc3RvciAhPSBudWxsKXsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlcXVlc3Rvci5hY2NlcHRTZWFyY2hNYXRjaChtYXRjaCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJLy9kbyBub3RoaW5nCi0JCQkJCX0KLQkJCQl9Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL21hdGNoaW5nL1NBWFNlYXJjaEVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9tYXRjaGluZy9TQVhTZWFyY2hFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZWM0YTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL21hdGNoaW5nL1NBWFNlYXJjaEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLm1hdGNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotCi1wdWJsaWMgY2xhc3MgU0FYU2VhcmNoRWxlbWVudHsKLQlBdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7Ci0JU3RyaW5nIGVsZW1lbnROYW1lOwotCVN0cmluZyBlbGVtZW50TmFtZXNwYWNlOwotCU1hcCBuYW1lc3BhY2VNYXAgPSBuZXcgSGFzaE1hcCgpOyAvLyBNYXAgb2Ygc3RyaW5nIHByZWZpeCBrZXlzIGFuZCBuYW1lc3BhY2UKLQlTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgcGFyZW50TmFtZTsKLSAgICBpbnQgZGVwdGggPSAtMTsKLQkKLQlwdWJsaWMgU0FYU2VhcmNoRWxlbWVudCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JcHVibGljIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBlbGVtZW50TmFtZTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gZWxlbWVudE5hbWVzcGFjZTsKLQl9Ci0JcHVibGljIE1hcCBnZXROYW1lc3BhY2VNYXAoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2VNYXA7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQl0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50TmFtZShTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJdGhpcy5lbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50TmFtZXNwYWNlKFN0cmluZyBlbGVtZW50TmFtZXNwYWNlKSB7Ci0JCXRoaXMuZWxlbWVudE5hbWVzcGFjZSA9IGVsZW1lbnROYW1lc3BhY2U7Ci0JfQotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZU1hcChNYXAgbmFtZXNwYWNlTWFwKSB7Ci0JCXRoaXMubmFtZXNwYWNlTWFwID0gbmFtZXNwYWNlTWFwOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkgewotCQl0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLQl9Ci0gIHB1YmxpYyBpbnQgZ2V0RGVwdGgoKQotICB7Ci0gICAgcmV0dXJuIGRlcHRoOwotICB9Ci0gIHB1YmxpYyB2b2lkIHNldERlcHRoKGludCBkZXB0aCkKLSAgewotICAgIHRoaXMuZGVwdGggPSBkZXB0aDsKLSAgfQotcHVibGljIFN0cmluZyBnZXRQYXJlbnROYW1lKCkgewotCXJldHVybiBwYXJlbnROYW1lOwotfQotcHVibGljIHZvaWQgc2V0UGFyZW50TmFtZShTdHJpbmcgcGFyZW50TmFtZSkgewotCXRoaXMucGFyZW50TmFtZSA9IHBhcmVudE5hbWU7Ci19Ci0JCi0JCi0JCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL21hdGNoaW5nL1hNTFNlYXJjaFBhdHRlcm5NYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvbWF0Y2hpbmcvWE1MU2VhcmNoUGF0dGVybk1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVlZTYyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvbWF0Y2hpbmcvWE1MU2VhcmNoUGF0dGVybk1hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5tYXRjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLlhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5YTUxTZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBYTUxTZWFyY2hQYXR0ZXJuTWF0Y2hlciBleHRlbmRzIFBhdHRlcm5NYXRjaGVyewotCQotICAgLyoqCi0gICAgKiBUaGUgYWN0aXZlIHNlYXJjaCBwYXJ0aWNpcGFudC4KLSAgICAqLwotICAgIHByaXZhdGUgU2VhcmNoUGFydGljaXBhbnQgc2VhcmNoUGFydGljaXBhbnQ7Ci0gIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBwYXR0ZXJuIG1hdGNoZXIgZ2l2ZW4gYSBzZWFyY2ggcGFydGljaXBhbnQuCi0gICAgICogQHBhcmFtIHNlYXJjaFBhcnRpY2lwYW50IHRoZSBhY3RpdmUge0BsaW5rIFNlYXJjaFBhcnRpY2lwYW50IHNlYXJjaCBwYXJ0aWNpcGFudH0uCi0gICAgICovCi0gICAgcHVibGljIFhNTFNlYXJjaFBhdHRlcm5NYXRjaGVyKFNlYXJjaFBhcnRpY2lwYW50IHNlYXJjaFBhcnRpY2lwYW50KQotICAgIHsKLSAgICAgIHRoaXMuc2VhcmNoUGFydGljaXBhbnQgPSBzZWFyY2hQYXJ0aWNpcGFudDsKLSAgICB9Ci0gICAgCi0JcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlTmFtZXNwYWNlRm9yUHJlZml4KEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHByZWZpeCkKLQl7Ci0JICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkgIGZvciAoTm9kZSBub2RlID0gZWxlbWVudDsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpCi0JICB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCXsKLQkJICBFbGVtZW50IGUgPSAoRWxlbWVudClub2RlOwotCQkgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApID8gKCJ4bWxuczoiICsgcHJlZml4KSA6ICJ4bWxucyI7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICByZXN1bHQgPSBlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKLQkJICBpZiAocmVzdWx0ICE9IG51bGwpCi0JCSAgewotCQkJIGJyZWFrOyAgCi0JCSAgfQkgIAotCQl9CQotCSAgfQkgIAotCSAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFhNTFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgRWxlbWVudCBkb21FbGVtZW50KSB7Ci0JCi0JCQlwYXR0ZXJuLnNldEVsZW1lbnROYW1lKGRvbUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotCQkJcGF0dGVybi5zZXRFbGVtZW50TmFtZXNwYWNlKGRvbUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgLy8gVE9ETyAoY3MpIHNldCB0aGUgZGVwdGggYXR0cmlidXRlIG9uIHRoZSBwYXR0ZXJuCi0gICAgICAgICAgICAvLwotCQkJU3RyaW5nIGFjdHVhbFZhbHVlID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUocGF0dGVybi5nZXRBdHRyaWJ1dGVOYW1lKCkpOwotCQkJIGlmKGFjdHVhbFZhbHVlICE9IG51bGwpewotCQkJCQlpbnQgbiA9IGFjdHVhbFZhbHVlLmluZGV4T2YoIjoiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZihuID4gMCl7Ci0JCQkJCQlTdHJpbmcgcHJlZml4ID0gYWN0dWFsVmFsdWUuc3Vic3RyaW5nKDAsIG4pOwotCQkJCQkJcGF0dGVybi5zZXRTZWFyY2hOYW1lKGFjdHVhbFZhbHVlLnN1YnN0cmluZyhuKzEpKTsgICAgICAKLQkJCQkJCQotCQkJCQkJU3RyaW5nIG5hbWVzcGFjZSA9IGNvbXB1dGVOYW1lc3BhY2VGb3JQcmVmaXgoZG9tRWxlbWVudCwgcHJlZml4KTsKLQkJCQkJCXBhdHRlcm4uc2V0U2VhcmNoTmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0JCQkJCQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcGF0dGVybi5zZXRTZWFyY2hOYW1lKGFjdHVhbFZhbHVlKTsKLQkJCQkJCXBhdHRlcm4uc2V0U2VhcmNoTmFtZXNwYWNlKGRvbUVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpLmdldEF0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCSAgICB9Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFhNTFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgU0FYU2VhcmNoRWxlbWVudCBzYXhFbGVtZW50KSB7Ci0JCQotCQlwYXR0ZXJuLnNldEVsZW1lbnROYW1lKHNheEVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCXBhdHRlcm4uc2V0RWxlbWVudE5hbWVzcGFjZShzYXhFbGVtZW50LmdldEVsZW1lbnROYW1lc3BhY2UoKSk7Ci0gICAgICAgIHBhdHRlcm4uc2V0RGVwdGgoc2F4RWxlbWVudC5nZXREZXB0aCgpKTsKLSAgICAgICAgcGF0dGVybi5zZXRQYXJlbnROYW1lKHNheEVsZW1lbnQuZ2V0UGFyZW50TmFtZSgpKTsKLQkJU3RyaW5nIGFjdHVhbFZhbHVlID0gc2F4RWxlbWVudC5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmFsdWUocGF0dGVybi5nZXRBdHRyaWJ1dGVOYW1lKCkpOwotCQkgaWYoYWN0dWFsVmFsdWUgIT0gbnVsbCl7Ci0JCQkJaW50IG4gPSBhY3R1YWxWYWx1ZS5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZihuID4gMCl7Ci0JCQkJCVN0cmluZyBwcmVmaXggPSBhY3R1YWxWYWx1ZS5zdWJzdHJpbmcoMCwgbik7Ci0JCQkJCXBhdHRlcm4uc2V0U2VhcmNoTmFtZShhY3R1YWxWYWx1ZS5zdWJzdHJpbmcobisxKSk7Ci0JCQkJCXBhdHRlcm4uc2V0U2VhcmNoTmFtZXNwYWNlKChTdHJpbmcpc2F4RWxlbWVudC5nZXROYW1lc3BhY2VNYXAoKS5nZXQocHJlZml4KSk7Ci0JCQkJCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlwYXR0ZXJuLnNldFNlYXJjaE5hbWUoYWN0dWFsVmFsdWUpOwotCQkJCQlwYXR0ZXJuLnNldFNlYXJjaE5hbWVzcGFjZShzYXhFbGVtZW50LmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQkJCQl9Ci0JCSAgICB9Ci0JCi0JfQotCQotCVhNTFNlYXJjaFBhdHRlcm4gc2VhcmNoUGF0dGVybjsKLQkKLQlwdWJsaWMgWE1MU2VhcmNoUGF0dGVybk1hdGNoZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCQotCX0KLQotCQotCi0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZG9lcyBkaXZlIGFjdHVhbCBtYXRjaCBsb2NhdGlvbiB0byB0aGUgcmVxdWVzdG9yIGlmIHRoZXJlIGFyZSBtYXRjaGVzCi0JICovCi0JCi0JcHVibGljIHZvaWQgbG9jYXRlTWF0Y2hlcyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElGaWxlIGZpbGUsIEVsZW1lbnQgZWxlbWVudCwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCQlpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybil7Ci0JCQlYTUxTZWFyY2hQYXR0ZXJuW10gY2hpbGRQYXR0ZXJucyA9ICgoWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybilwYXR0ZXJuKS5nZXRDaGlsZHJlbihzZWFyY2hQYXJ0aWNpcGFudCk7Ci0JCQlpZiAoY2hpbGRQYXR0ZXJucyA9PSBudWxsKXsKLQkJCSAgcmV0dXJuOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZFBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUGF0dGVybk1hdGNoZXIgbWF0Y2hlciA9IChQYXR0ZXJuTWF0Y2hlciljaGlsZFBhdHRlcm5zW2ldLmdldEFkYXB0ZXIoUGF0dGVybk1hdGNoZXIuY2xhc3MpOwotCQkJCWlmKG1hdGNoZXIgPT0gbnVsbCl7Ci0JCQkJCW1hdGNoZXIgPSB0aGlzOwotCQkJCX0KLQkJCQlpZihtYXRjaGVyICE9IG51bGwpewotCQkJCQltYXRjaGVyLmxvY2F0ZU1hdGNoZXMoY2hpbGRQYXR0ZXJuc1tpXSwgZmlsZSwgZWxlbWVudCwgcmVxdWVzdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MU2VhcmNoUGF0dGVybil7Ci0JCQlpZihtYXRjaGVzKHBhdHRlcm4sIGVsZW1lbnQpKXsKLQkJCQlBdHRyIGF0dHJpYnV0ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZSgoKFhNTFNlYXJjaFBhdHRlcm4pcGF0dGVybikuZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJCQlhZGRNYXRjaChwYXR0ZXJuLCBmaWxlLCBhdHRyaWJ1dGUsIHJlcXVlc3Rvcik7Ci0JCQl9Ci0JCQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG9ubHkgYW5zd2VycyBpZiB0aGUgcGF0dGVybiBtYXRjaGVzIGVsZW1lbnQsIGl0IGRvZXMgbm90IGdpdmUgYWN0dWFsIG1hdGNoIGxvY2F0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIE9iamVjdCBlbGVtZW50KXsKLQkJaWYocGF0dGVybiBpbnN0YW5jZW9mIFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4pewotCQkJWE1MU2VhcmNoUGF0dGVybltdIGNoaWxkUGF0dGVybnMgPSAoKFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4pcGF0dGVybikuZ2V0Q2hpbGRyZW4oc2VhcmNoUGFydGljaXBhbnQpOwotICAgICAgICAgICAgaWYgKGNoaWxkUGF0dGVybnMgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRQYXR0ZXJucy5sZW5ndGg7IGkrKykgewotCQkJCVBhdHRlcm5NYXRjaGVyIG1hdGNoZXIgPSAoUGF0dGVybk1hdGNoZXIpY2hpbGRQYXR0ZXJuc1tpXS5nZXRBZGFwdGVyKFBhdHRlcm5NYXRjaGVyLmNsYXNzKTsKLQkJCQlpZihtYXRjaGVyID09IG51bGwpewotCQkJCQltYXRjaGVyID0gdGhpczsKLQkJCQl9Ci0JCQkJaWYobWF0Y2hlciAhPSBudWxsKXsKLQkJCQkJaWYobWF0Y2hlci5tYXRjaGVzKGNoaWxkUGF0dGVybnNbaV0sIGVsZW1lbnQpKXsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfQotCQl9Ci0JCWVsc2UgaWYocGF0dGVybiBpbnN0YW5jZW9mIFhNTFNlYXJjaFBhdHRlcm4pewotCQkJCi0JCQlYTUxTZWFyY2hQYXR0ZXJuIHBvc3NpYmxlTWF0Y2ggPSBuZXcgWE1MU2VhcmNoUGF0dGVybigpOwotCQkJcG9zc2libGVNYXRjaC5zZXRBdHRyaWJ1dGVOYW1lKCgoWE1MU2VhcmNoUGF0dGVybilwYXR0ZXJuKS5nZXRBdHRyaWJ1dGVOYW1lKCkpOwotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpewotCQkJCWluaXRpYWxpemUocG9zc2libGVNYXRjaCwgKEVsZW1lbnQpZWxlbWVudCk7Ci0JCQl9Ci0JCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBTQVhTZWFyY2hFbGVtZW50KXsKLQkJCQlpbml0aWFsaXplKHBvc3NpYmxlTWF0Y2gsIChTQVhTZWFyY2hFbGVtZW50KWVsZW1lbnQpOwotCQkJfQotCQkJc2VhcmNoUGF0dGVybiA9IChYTUxTZWFyY2hQYXR0ZXJuKXBhdHRlcm47Ci0JCQlyZXR1cm4gbWF0Y2hlc1BhdHRlcm4ocG9zc2libGVNYXRjaCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaGVzUGF0dGVybihTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pIHsKLQkJaWYoc2VhcmNoUGF0dGVybiAhPSBudWxsICYmIHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxTZWFyY2hQYXR0ZXJuKXsKLQkJCVhNTFNlYXJjaFBhdHRlcm4gZGVjb2RlZFBhdHRlcm4gPSAoWE1MU2VhcmNoUGF0dGVybilwYXR0ZXJuOwotICAgICAgICAgICAgaWYoc2VhcmNoUGF0dGVybi5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhkZWNvZGVkUGF0dGVybi5nZXRFbGVtZW50TmFtZSgpKSAmJiAgICAgICAgICAgICAgICAgICAgCi0JCQkJCXNlYXJjaFBhdHRlcm4uZ2V0RWxlbWVudE5hbWVzcGFjZSgpLmVxdWFscyhkZWNvZGVkUGF0dGVybi5nZXRFbGVtZW50TmFtZXNwYWNlKCkpKXsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoc2VhcmNoUGF0dGVybi5nZXRQYXJlbnROYW1lKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgIGRlY29kZWRQYXR0ZXJuLmdldFBhcmVudE5hbWUoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgIXNlYXJjaFBhdHRlcm4uZ2V0UGFyZW50TmFtZSgpLmVxdWFscyhkZWNvZGVkUGF0dGVybi5nZXRQYXJlbnROYW1lKCkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIAotICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgIGlmKHNlYXJjaFBhdHRlcm4uZ2V0U2VhcmNoTmFtZSgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgeyAgCi0gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCIqIi5lcXVhbHMoc2VhcmNoUGF0dGVybi5nZXRTZWFyY2hOYW1lKCkpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgZWxzZSBpZihzZWFyY2hQYXR0ZXJuLmdldFNlYXJjaE5hbWVzcGFjZSgpID09IG51bGwpewotCQkJCQlyZXR1cm4gc2VhcmNoUGF0dGVybi5nZXRTZWFyY2hOYW1lKCkuZXF1YWxzKGRlY29kZWRQYXR0ZXJuLmdldFNlYXJjaE5hbWUoKSk7Ci0JCQkJfQotCQkJCWVsc2V7Ci0JCQkJCXJldHVybiBzZWFyY2hQYXR0ZXJuLmdldFNlYXJjaE5hbWUoKS5lcXVhbHMoZGVjb2RlZFBhdHRlcm4uZ2V0U2VhcmNoTmFtZSgpKSAmJgotCQkJCQlzZWFyY2hQYXR0ZXJuLmdldFNlYXJjaE5hbWVzcGFjZSgpLmVxdWFscyhkZWNvZGVkUGF0dGVybi5nZXRTZWFyY2hOYW1lc3BhY2UoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotICAgIAotICAgIHByb3RlY3RlZCBTZWFyY2hNYXRjaCBjcmVhdGVTZWFyY2hNYXRjaChJRmlsZSBmaWxlLCBBdHRyIGF0dHJpYnV0ZU5vZGUpCi0gICAgewotICAgICAgU2VhcmNoTWF0Y2ggbWF0Y2ggPSBzdXBlci5jcmVhdGVTZWFyY2hNYXRjaChmaWxlLCBhdHRyaWJ1dGVOb2RlKTsKLSAgICAgIC8vIHRvZG8uLi4gcmVtb3ZlIHRoaXMgdWdseSBoYWNrISEKLSAgICAgIGlmICgibmFtZSIuZXF1YWxzKGF0dHJpYnV0ZU5vZGUuZ2V0TmFtZSgpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBRdWFsaWZpZWROYW1lIHF1YWxpZmllZE5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZSgidG9kby1jb21wdXRlLXRhcmdldE5hbWVzcGFjZSIsIGF0dHJpYnV0ZU5vZGUuZ2V0VmFsdWUoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbWF0Y2gubWFwLnB1dCgibmFtZSIsIHF1YWxpZmllZE5hbWUpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICAvL0VsZW1lbnQgZWxlbWVudCA9IGF0dHJpYnV0ZU5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgLy9pZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInRhcmdldE5hbWVzcGFjZSIpKQotICAgICAgLy97ICAgICAgICAKLSAgICAgIC8vfSAgCi0gICAgICByZXR1cm4gbWF0Y2g7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvcXVpY2tzY2FuL1hNTFF1aWNrU2Nhbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL3F1aWNrc2Nhbi9YTUxRdWlja1NjYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4YTE0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvcXVpY2tzY2FuL1hNTFF1aWNrU2Nhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLnF1aWNrc2NhbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5tYXRjaGluZy5QYXR0ZXJuTWF0Y2hlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFhNTFF1aWNrU2NhbgotewotICAgIC8qCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyBmdWxsRmlsZVBhdGgpCi0JewotCQlYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlciBoYW5kbGVyID0gbmV3IFhNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyKCk7Ci0JCXBhcnNlRmlsZShmdWxsRmlsZVBhdGgsIGhhbmRsZXIpOwotCQlyZXR1cm4gaGFuZGxlci5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQl9Ki8KLQkKLQkvKgotCSAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgbWF0Y2hlcyBlbmNvdW50ZXJlZCBiYXNlZCBvbiB0aGUgY3JpdGVyaWEKLQkgKiBwcm92aWRlZC4KLQkgKgotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNNYXRjaChTdHJpbmcgZnVsbEZpbGVQYXRoLCBQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyLCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pCi0JewotCQlYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlciBoYW5kbGVyID0gbmV3IFhNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyKG1hdGNoZXIsIHBhdHRlcm4pOwotCQlwYXJzZUZpbGUoZnVsbEZpbGVQYXRoLCBoYW5kbGVyKTsKLQkJcmV0dXJuIGhhbmRsZXIuaGFzTWF0Y2goKTsKLQl9Ki8KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcG9wdWxhdGVTZWFyY2hEb2N1bWVudChTZWFyY2hEb2N1bWVudCBkb2N1bWVudCwgUGF0dGVybk1hdGNoZXIgbWF0Y2hlciwgU2VhcmNoUGF0dGVybiBwYXR0ZXJuKQotCXsKLQkJWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIgaGFuZGxlciA9IG5ldyBYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlcihkb2N1bWVudCwgbWF0Y2hlciwgcGF0dGVybik7Ci0JCXBhcnNlRmlsZShkb2N1bWVudC5nZXRQYXRoKCksIGhhbmRsZXIpOwotCQlyZXR1cm4gaGFuZGxlci5oYXNNYXRjaCgpOwotCX0KLQotICAgIHByaXZhdGUgc3RhdGljIFhNTFJlYWRlciByZWFkZXI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgWE1MUmVhZGVyIGdldE9yQ3JlYXRlUmVhZGVyKCkKLSAgICB7Ci0gICAgICAgaWYgKHJlYWRlciA9PSBudWxsKQotICAgICAgIHsKLSAgICAgICAgIHRyeQotICAgICAgICAgewotICAgICAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3U0FYUGFyc2VyKCk7Ci0gICAgICAgICAgcmVhZGVyID0gcGFyc2VyLmdldFhNTFJlYWRlcigpOyAgCi0gICAgICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICByZWFkZXIuc2V0RXJyb3JIYW5kbGVyKG5ldyBJbnRlcm5hbEVycm9ySGFuZGxlcigpKTsgICAgICAgICAgCi0gICAgICAgICB9Ci0gICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICB7ICAgICAgICAgICAKLSAgICAgICAgIH0KLSAgICAgICB9IAotICAgICAgIHJldHVybiByZWFkZXI7Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyBjbGFzcyBJbnRlcm5hbEVycm9ySGFuZGxlciBpbXBsZW1lbnRzIEVycm9ySGFuZGxlcgotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgeyAgICAgICAgICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgIHsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICB7ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgcGFyc2VGaWxlKFN0cmluZyBmdWxsRmlsZVBhdGgsCi0JCQlYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlciBoYW5kbGVyKQotCXsKLQkJRmlsZUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5Ci0JCXsgICAgICAgICAgICAKLQkJCWlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShmdWxsRmlsZVBhdGgpKTsKLQkJCVhNTFJlYWRlciByZWFkZXIgPSBnZXRPckNyZWF0ZVJlYWRlcigpOwotICAgICAgICAgICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKGhhbmRsZXIpOwotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInBhcnNlRmlsZSIgKyByZWFkZXIgKyAiICgiICsgIGZ1bGxGaWxlUGF0aCArICIpIik7CQkJCi0JCQlyZWFkZXIucGFyc2UobmV3IElucHV0U291cmNlKGlucHV0U3RyZWFtKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQkvLyBza2lwIHRoZSBmaWxlCi0JCX0gCi0JCWZpbmFsbHl7Ci0JCQlpZihpbnB1dFN0cmVhbSAhPSBudWxsKXsKLQkJCQl0cnkgewotCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gY2FuIG5vdCBkbyBtdWNoIAotCQkJCX0KLQkJCX0KLQkJCQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL3F1aWNrc2Nhbi9YTUxRdWlja1NjYW5Db250ZW50SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL3F1aWNrc2Nhbi9YTUxRdWlja1NjYW5Db250ZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWQ4N2NkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9xdWlja3NjYW4vWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5xdWlja3NjYW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuQ29tcG9uZW50RGVjbGFyYXRpb25FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LkNvbXBvbmVudFJlZmVyZW5jZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuRmlsZVJlZmVyZW5jZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5YTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5YTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guaW1wbC5JWE1MU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gubWF0Y2hpbmcuUGF0dGVybk1hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5tYXRjaGluZy5TQVhTZWFyY2hFbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIFNBWCBjb250ZW50IGhhbmRsZXIsIGl0IHNob3VsZCBiZSByZWN5Y2xlZCBiZWZvcmUgc2Nhbm5pbmcgYSBmaWxlIGZvciB0aGUgbmV3IFNlYXJjaFBhdHRlcm4uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlcgotewotCXByaXZhdGUgTWFwIG5hbWVzcGFjZU1hcCA9IG5ldyBIYXNoTWFwKCk7IC8vIE1hcCBvZiBzdHJpbmcgcHJlZml4IGtleXMgYW5kIG5hbWVzcGFjZQotCXByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBTZWFyY2hQYXR0ZXJuIHBhdHRlcm47Ci0JcHJpdmF0ZSBTZWFyY2hEb2N1bWVudCBkb2N1bWVudDsgIC8vIHdlJ2xsIGFkZCB1c2VmdWwgZW50cmllcyBpbiB0aGUgc2VhcmNoIGRvY3VtZW50IGFzIHdlIHBhcnNpbmcKLQlwcml2YXRlIFNBWFNlYXJjaEVsZW1lbnQgc2VhcmNoRWxlbWVudCA9IG5ldyBTQVhTZWFyY2hFbGVtZW50KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWF0Y2ggPSBmYWxzZTsKLQlwcml2YXRlIFN0YWNrIGN1cnJlbnRQYXRoID0gbmV3IFN0YWNrKCk7Ci0JcHJpdmF0ZSBQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTFNDSEVNQV9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfTkFNRVNQQUNFID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIjsgLy8kTk9OLU5MUy0xJAotCi0JCi0JcHVibGljIFhNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyKFBhdHRlcm5NYXRjaGVyIG1hdGNoZXIsIFNlYXJjaFBhdHRlcm4gcGF0dGVybikgewotCQlzdXBlcigpOwotCQl0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOwotCQl0aGlzLm1hdGNoZXIgPSBtYXRjaGVyOwotCX0KLQkKLQlwdWJsaWMgWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIoU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQsIFBhdHRlcm5NYXRjaGVyIG1hdGNoZXIsIFNlYXJjaFBhdHRlcm4gcGF0dGVybikgewotCQlzdXBlcigpOwotCQl0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOwotCQl0aGlzLm1hdGNoZXIgPSBtYXRjaGVyOwotCQl0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JfQotCQotCXB1YmxpYyBYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLAotCQkJQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0JewkKLQkJLy8gU2VhcmNoIGZvciB0YXJnZXROYW1lc3BhY2UgaWYgd2UgaGF2ZW4ndCBlbmNvdW50ZXJlZCBpdCB5ZXQuCi0JCWlmICh0YXJnZXROYW1lc3BhY2UuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlpbnQgbkF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuQXR0cmlidXRlczsgaSsrKQotCQkJewotCQkJCWlmICgidGFyZ2V0TmFtZXNwYWNlIi5lcXVhbHMoYXR0cmlidXRlcy5nZXRRTmFtZShpKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCXRhcmdldE5hbWVzcGFjZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gY29sbGVjdCBsaW5rIGluZm8KLSAgICAKLSAgICAvLyBUT0RPIFRoaXMgY29kZSBzaG91bGQgYmUgcmVmYWN0b3JlZCB0byBkZWxlZ2F0ZSB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLSAgICAvLyBkZXRlY3QgbGlua3MgYmV0d2VlbiBmaWxlcyB0byB0aGUgc2VhcmNoIHByb3ZpZGVycy9jb250cmlidXRvcnMuCi0gICAgLy8gVGhlIGN1cnJlbnQgY29kZSBvbmx5IGhhbmRsZXMgdGhlIFhTRCBhbmQgV1NETCBjYXNlcy4gCi0gICAgCi0JCWlmKCJpbXBvcnQiLmVxdWFscyhsb2NhbE5hbWUpICYmIG5hbWVzcGFjZU1hdGNoZXModXJpKSl7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGVSZWZlcmVuY2VFbnRyeSBkb2N1bWVudEVudHJ5ID0gbmV3IEZpbGVSZWZlcmVuY2VFbnRyeSgpOwotCQkJZG9jdW1lbnRFbnRyeS5zZXRDYXRlZ29yeShJWE1MU2VhcmNoQ29uc3RhbnRzLlJFRik7Ci0JCQlkb2N1bWVudEVudHJ5LnNldEtleSgiaW1wb3J0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBuYW1lc3BhY2UgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJuYW1lc3BhY2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGxvY2F0aW9uID0gYXR0cmlidXRlcy5nZXRWYWx1ZShnZXRMb2NhdGlvbkF0dHJpYnV0ZU5hbWUodXJpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRvY3VtZW50RW50cnkuc2V0UHVibGljSWRlbnRpZmllcihuYW1lc3BhY2UpOwotCQkJZG9jdW1lbnRFbnRyeS5zZXRSZWxhdGl2ZUZpbGVQYXRoKGxvY2F0aW9uKTsgICAgICAgICAgICAKLQkJCWRvY3VtZW50LnB1dEVudHJ5KGRvY3VtZW50RW50cnkpOwotCQl9Ci0JCWlmKCgicmVkZWZpbmUiLmVxdWFscyhsb2NhbE5hbWUpfHwgImluY2x1ZGUiLmVxdWFscyhsb2NhbE5hbWUpKSAmJiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQluYW1lc3BhY2VNYXRjaGVzKHVyaSkpewotCQkJRmlsZVJlZmVyZW5jZUVudHJ5IGRvY3VtZW50RW50cnkgPSBuZXcgRmlsZVJlZmVyZW5jZUVudHJ5KCk7Ci0JCQlkb2N1bWVudEVudHJ5LnNldENhdGVnb3J5KElYTUxTZWFyY2hDb25zdGFudHMuUkVGKTsKLQkJCWRvY3VtZW50RW50cnkuc2V0S2V5KCJpbmNsdWRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBsb2NhdGlvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoZ2V0TG9jYXRpb25BdHRyaWJ1dGVOYW1lKHVyaSkpOyAvLyROT04tTkxTLTEkCi0JCQlkb2N1bWVudEVudHJ5LnNldFB1YmxpY0lkZW50aWZpZXIodXJpKTsKLQkJCWRvY3VtZW50RW50cnkuc2V0UmVsYXRpdmVGaWxlUGF0aChsb2NhdGlvbik7Ci0JCQlkb2N1bWVudC5wdXRFbnRyeShkb2N1bWVudEVudHJ5KTsKLQkJfQotCQkKLQkJCi0gICAgICAgIC8vIGlzc3VlIChjcykgeW91IG1heSB3YW50IHRvIHRyeSBwZXJmIG1lYXN1cmVtZW50cyB0byBjb21wYXRlIHJldXNpbmcgdGhlIHNhbWUKLSAgICAgICAgLy8gaW5zdGFuY2Ugb2YgYSBTQVhTZWFyY2hFbGVtZW50IGluc3RlYWQgb2YgbmV3aW5nIG9uZSBlYWNoIHRpbWUgCi0JCS8vWE1MU2VhcmNoUGF0dGVybi5TQVhTZWFyY2hFbGVtZW50IHNlYXJjaEVsZW1lbnQgPSBuZXcgWE1MU2VhcmNoUGF0dGVybi5TQVhTZWFyY2hFbGVtZW50KCk7Ci0JCXNlYXJjaEVsZW1lbnQuc2V0RWxlbWVudE5hbWUobG9jYWxOYW1lKTsKLQkJc2VhcmNoRWxlbWVudC5zZXRFbGVtZW50TmFtZXNwYWNlKHVyaSk7Ci0JCXNlYXJjaEVsZW1lbnQuc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLQkJc2VhcmNoRWxlbWVudC5zZXROYW1lc3BhY2VNYXAobmFtZXNwYWNlTWFwKTsKLQkJc2VhcmNoRWxlbWVudC5zZXRUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsKLQkJaWYgKGN1cnJlbnRQYXRoLnNpemUoKSA+IDApCi0JCXsKLQkJICBTdHJpbmcgcGFyZW50TmFtZSA9IChTdHJpbmcpY3VycmVudFBhdGgucGVlaygpOwotCQkgIHNlYXJjaEVsZW1lbnQuc2V0UGFyZW50TmFtZShwYXJlbnROYW1lKTsKLQkJfQkJCQotCQotCi0JCWlmKG1hdGNoZXIgIT0gbnVsbCl7Ci0JCQlpZihtYXRjaGVyLm1hdGNoZXMocGF0dGVybiwgc2VhcmNoRWxlbWVudCkpewotCQkJCWhhc01hdGNoID0gdHJ1ZTsKLQkJCQlpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybil7Ci0JCQkJCUNvbXBvbmVudFJlZmVyZW5jZUVudHJ5IGRvY3VtZW50RW50cnkgPSBuZXcgQ29tcG9uZW50UmVmZXJlbmNlRW50cnkoKTsKLQkJCQkJZG9jdW1lbnRFbnRyeS5zZXRDYXRlZ29yeShJWE1MU2VhcmNoQ29uc3RhbnRzLkNPTVBPTkVOVF9SRUYpOwotCQkJCQlRdWFsaWZpZWROYW1lIG5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZSh1cmksIGxvY2FsTmFtZSk7Ci0JCQkJCWRvY3VtZW50RW50cnkuc2V0S2V5KG5hbWUudG9TdHJpbmcoKSk7Ci0JCQkJCWRvY3VtZW50RW50cnkuc2V0TmFtZShuYW1lKTsKLQkJCQkJZG9jdW1lbnQucHV0RW50cnkoZG9jdW1lbnRFbnRyeSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYocGF0dGVybiBpbnN0YW5jZW9mIFhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybil7Ci0JCQkJCUNvbXBvbmVudERlY2xhcmF0aW9uRW50cnkgZG9jdW1lbnRFbnRyeSA9IG5ldyBDb21wb25lbnREZWNsYXJhdGlvbkVudHJ5KCk7Ci0JCQkJCWRvY3VtZW50RW50cnkuc2V0Q2F0ZWdvcnkoSVhNTFNlYXJjaENvbnN0YW50cy5DT01QT05FTlRfREVDTCk7Ci0gICAgICAgICAgICAgICAgICAgIFF1YWxpZmllZE5hbWUgbmFtZSA9IG5ldyBRdWFsaWZpZWROYW1lKHRhcmdldE5hbWVzcGFjZSwgYXR0cmlidXRlcy5nZXRWYWx1ZSgibmFtZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlRdWFsaWZpZWROYW1lIG1ldGFOYW1lID0gbmV3IFF1YWxpZmllZE5hbWUodXJpLCBsb2NhbE5hbWUpOyAgICAgICAgICAgICAgICAgICAgCi0JCQkJCWRvY3VtZW50RW50cnkuc2V0S2V5KG5hbWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50RW50cnkuc2V0TmFtZShuYW1lKTsKLQkJCQkJZG9jdW1lbnRFbnRyeS5zZXRNZXRhTmFtZShtZXRhTmFtZSk7Ci0JCQkJCWRvY3VtZW50LnB1dEVudHJ5KGRvY3VtZW50RW50cnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljdXJyZW50UGF0aC5wdXNoKGxvY2FsTmFtZSk7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQotICBwcml2YXRlIFN0cmluZyBnZXRMb2NhdGlvbkF0dHJpYnV0ZU5hbWUoU3RyaW5nIHVyaSkKLSAgewotICAgIGlmIChYTUxTQ0hFTUFfTkFNRVNQQUNFLmVxdWFscyh1cmkpKQotICAgIHsKLSAgICAgIHJldHVybiAic2NoZW1hTG9jYXRpb24iOwotICAgIH0KLSAgICAKLSAgICBlbHNlIGlmIChXU0RMX05BTUVTUEFDRS5lcXVhbHModXJpKSkKLSAgICB7Ci0gICAgICByZXR1cm4gImxvY2F0aW9uIjsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIG5hbWVzcGFjZU1hdGNoZXMoU3RyaW5nIHVyaSkKLSAgewotICAgIHJldHVybiBYTUxTQ0hFTUFfTkFNRVNQQUNFLmVxdWFscyh1cmkpIHx8Ci0gICAgICAgICAgV1NETF9OQU1FU1BBQ0UuZXF1YWxzKHVyaSk7Ci0gIH0KLQkKLQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkKLQkJCXRocm93cyBTQVhFeGNlcHRpb24KLQl7Ci0JCWN1cnJlbnRQYXRoLnBvcCgpOwotCX0KLQotCS8qKgotCSAqIENhbGxiYWNrIGZvciBTQVggcGFyc2VyCi0JICogCi0JICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNzdGFydFByZWZpeE1hcHBpbmcoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRQcmVmaXhNYXBwaW5nKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkKLQkJCXRocm93cyBTQVhFeGNlcHRpb24KLQl7Ci0JCWlmIChhcmcwICE9IG51bGwgJiYgYXJnMC5sZW5ndGgoKSA+IDApCi0JCXsKLQkJCXRoaXMubmFtZXNwYWNlTWFwLnB1dChhcmcwLCBhcmcxKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0JCXRoaXMudGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc01hdGNoKCkgewotCQlyZXR1cm4gaGFzTWF0Y2g7Ci0JfQotCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdG9ySGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0b3JIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZjNTc4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0b3JIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciB0aGUgWE1MIHZhbGlkYXRvci4KLSAqIAotICogQGF1dGhvciBDcmFpZyBTYWx0ZXIsIElCTQotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9ySGVscGVyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBMaXN0IG5hbWVzcGFjZVVSSUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzR3JhbW1hckVuY291bnRlcmVkID0gZmFsc2U7ICAgIAotICBwdWJsaWMgYm9vbGVhbiBpc0RUREVuY291bnRlcmVkID0gZmFsc2U7Ci0gIHB1YmxpYyBib29sZWFuIGlzTmFtZXNwYWNlRW5jb3VudGVyZWQgPSBmYWxzZTsKLSAgcHVibGljIFN0cmluZyBzY2hlbWFMb2NhdGlvblN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBpbnQgbnVtRFRERWxlbWVudHMgPSAwOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0b3JIZWxwZXIoKQotICB7Ci0gIH0KLSAKLSAgLyoqCi0gICAqIENyZWF0ZSBhbiBYTUwgUmVhZGVyLgotICAgKiAKLSAgICogQHJldHVybiBBbiBYTUwgUmVhZGVyIGlmIG9uZSBjYW4gYmUgY3JlYXRlZCBvciBudWxsLgotICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIFhNTFJlYWRlciBjcmVhdGVYTUxSZWFkZXIoU3RyaW5nIHVyaSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7ICAgICAKLSAgICBYTUxSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAKLSAgICByZWFkZXIgPSBuZXcgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIoKTsgICAgIAotICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvY29udGludWUtYWZ0ZXItZmF0YWwtZXJyb3IiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLSAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0gICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0gICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9ub252YWxpZGF0aW5nL2xvYWQtZXh0ZXJuYWwtZHRkIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0gICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKG5ldyBNeUNvbnRlbnRIYW5kbGVyKHVyaSkpOwotICAgIHJlYWRlci5zZXRFcnJvckhhbmRsZXIobmV3IEludGVybmFsRXJyb3JIYW5kbGVyKCkpOyAKLQotICAgIExleGljYWxIYW5kbGVyIGxleGljYWxIYW5kbGVyID0gbmV3IExleGljYWxIYW5kbGVyKCkKLSAgICB7ICAgICAgCi0gICAgICBwdWJsaWMgdm9pZCBzdGFydERURCAoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICAgICAgewotICAgICAgICBpc0dyYW1tYXJFbmNvdW50ZXJlZCA9IHRydWU7ICAgCi0gICAgICAgIGlzRFRERW5jb3VudGVyZWQgPSB0cnVlOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBlbmREVEQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICB7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50aXR5KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICB7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIGVuZEVudGl0eShTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgewotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBzdGFydENEQVRBKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgewotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBlbmRDREFUQSgpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgIHsKLSAgICAgIH0KLSAKLSAgICAgIHB1YmxpYyB2b2lkIGNvbW1lbnQgKGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfTsKLSAgICByZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2xleGljYWwtaGFuZGxlciIsIGxleGljYWxIYW5kbGVyKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHJldHVybiByZWFkZXI7Ci0gIH0gIAotCi0gIC8qKgotICAgKiBBbiBlcnJvciBoYW5kbGVyIHRvIHN1cHByZXNzIGVycm9yIGFuZCB3YXJuaW5nIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHJpdmF0ZSBjbGFzcyBJbnRlcm5hbEVycm9ySGFuZGxlciBpbXBsZW1lbnRzIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcgotICB7Ci0JcHVibGljIEludGVybmFsRXJyb3JIYW5kbGVyKCkKLQl7Ci0JICBzdXBlcigpOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotICB9Ci0KLSAKLSAgLyoqCi0gICAqIEZpZ3VyZXMgb3V0IHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIHZhbGlkYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSB1cmkgb2YgdGhlIGZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSB1cmlSZXNvbHZlciBBIGhlbHBlciB0byByZXNvbHZlIGxvY2F0aW9ucy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNvbXB1dGVWYWxpZGF0aW9uSW5mb3JtYXRpb24oU3RyaW5nIHVyaSwgUmVhZGVyIGNoYXJhY3RlclN0cmVhbSwgVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBYTUxSZWFkZXIgcmVhZGVyID0gY3JlYXRlWE1MUmVhZGVyKHVyaSk7ICAKLSAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHVyaSk7Ci0gICAgICBpbnB1dFNvdXJjZS5zZXRDaGFyYWN0ZXJTdHJlYW0oY2hhcmFjdGVyU3RyZWFtKTsKLSAgICAgIHJlYWRlci5wYXJzZShpbnB1dFNvdXJjZSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7ICAgICAKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgIH0KLSAgfQotICAKLSAKLQotICAvKioKLSAgICogSGFuZGxlIHRoZSBjb250ZW50IHdoaWxlIHBhcnNpbmcgdGhlIGZpbGUuCi0gICAqLwotICBjbGFzcyBNeUNvbnRlbnRIYW5kbGVyIGV4dGVuZHMgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcgotICB7ICAgICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2Vycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIGJvb2xlYW4gaXNSb290RWxlbWVudCA9IHRydWU7Ci0gICAgU3RyaW5nIGJhc2VVUkk7Ci0gICAgCi0gICAgTXlDb250ZW50SGFuZGxlcihTdHJpbmcgdXJpKQotICAgIHsKLSAgICAgIHRoaXMuYmFzZVVSSSA9IHVyaTsgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgIH0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZmF0YWxFcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciN3YXJuaW5nKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICBpbnQgaW5kZXggPSBuYW1lLmluZGV4T2YoIjoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgewotICAgICAgICBwcmVmaXggPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcHJlZml4OwotICAgIH0gICAgCi0gICAgICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5wcmVmaXhlZE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXhlZE5hbWUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgICB7Ci0gICAgICByZXR1cm4gcHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCA/IHByZWZpeCArICI6IiArIGxvY2FsTmFtZSA6IGxvY2FsTmFtZTsgICAgICAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyByYXdOYW1lLCBBdHRyaWJ1dGVzIGF0dHMpCi0gICAgeyAgICAgIAotICAgICAgLy9TdHJpbmcgZXhwbGljaXRMb2NhdGlvbiA9IG51bGw7Ci0gICAgICBpZiAoaXNSb290RWxlbWVudCkKLSAgICAgIHsgIAotICAgICAgICAKLSAgICAgICAgaXNSb290RWxlbWVudCA9IGZhbHNlOyAgCi0gICAgICAgIGludCBuQXR0cyA9IGF0dHMuZ2V0TGVuZ3RoKCk7ICAgIAotICAgICAgICBTdHJpbmcgc2NoZW1hSW5zdGFuY2VQcmVmaXggPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0wOyBpIDwgbkF0dHM7IGkrKykKLSAgICAgICAgeyAgICAgICAgICAgICAgCi0gICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRzLmdldFFOYW1lKGkpOyAgICAgICAKLSAgICAgICAgICBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoInhtbG5zIikgfHwgYXR0cmlidXRlTmFtZS5zdGFydHNXaXRoKCJ4bWxuczoiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBpc05hbWVzcGFjZUVuY291bnRlcmVkID0gdHJ1ZTsgICAgCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRzLmdldFZhbHVlKGkpOyAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgiaHR0cDovL3d3dy53My5vcmcvIikgJiYgdmFsdWUuZW5kc1dpdGgoIi9YTUxTY2hlbWEtaW5zdGFuY2UiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNjaGVtYUluc3RhbmNlUHJlZml4ID0gYXR0cmlidXRlTmFtZS5lcXVhbHMoInhtbG5zIikgPyAiIiA6IGdldFVucHJlZml4ZWROYW1lKGF0dHJpYnV0ZU5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgfSAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSBnZXRQcmVmaXgocmF3TmFtZSk7Ci0gICAgICAgIFN0cmluZyByb290RWxlbWVudE5hbWVzcGFjZURlY2xhcmF0aW9uTmFtZSA9IChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSA/ICJ4bWxuczoiICsgcHJlZml4IDogInhtbG5zIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIFN0cmluZyByb290RWxlbWVudE5hbWVzcGFjZSA9IHJvb3RFbGVtZW50TmFtZXNwYWNlRGVjbGFyYXRpb25OYW1lICE9IG51bGwgPyBhdHRzLmdldFZhbHVlKHJvb3RFbGVtZW50TmFtZXNwYWNlRGVjbGFyYXRpb25OYW1lKSA6IG51bGw7ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICAvLyBmaXJzdCB3ZSB1c2UgYW55ICd4c2k6c2NoZW1hTG9jYXRpb24nIG9yICd4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbicgYXR0cmlidXRlCi0gICAgICAgIC8vIHRvIGRldGVybWluZSBhIGxvY2F0aW9uCi0gICAgICAgIGlmIChzY2hlbWFJbnN0YW5jZVByZWZpeCAhPSBudWxsKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgbG9jYXRpb24gPSBhdHRzLmdldFZhbHVlKGdldFByZWZpeGVkTmFtZShzY2hlbWFJbnN0YW5jZVByZWZpeCwgIm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkKLSAgICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgIAlTdHJpbmcgc2NoZW1hTG9jID0gYXR0cy5nZXRWYWx1ZShnZXRQcmVmaXhlZE5hbWUoc2NoZW1hSW5zdGFuY2VQcmVmaXgsICJzY2hlbWFMb2NhdGlvbiIpKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGxvY2F0aW9uID0gZ2V0U2NoZW1hTG9jYXRpb25Gb3JOYW1lc3BhY2Uoc2NoZW1hTG9jLCByb290RWxlbWVudE5hbWVzcGFjZSk7Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0gIAotICAgICAgICBpZiAocm9vdEVsZW1lbnROYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJvb3RFbGVtZW50TmFtZXNwYWNlID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGxvY2F0aW9uID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKGJhc2VVUkksIHJvb3RFbGVtZW50TmFtZXNwYWNlLCBsb2NhdGlvbik7ICAgIAotICAgICAgICBsb2NhdGlvbiA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24oYmFzZVVSSSwgcm9vdEVsZW1lbnROYW1lc3BhY2UsIGxvY2F0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGxvY2F0aW9uID0gVVJJSGVscGVyLmFkZEltcGxpZWRGaWxlUHJvdG9jb2wobG9jYXRpb24pOwotICAgICAgICAKLSAgICAgICAgc2NoZW1hTG9jYXRpb25TdHJpbmcgPSBsb2NhdGlvbjsKLSAgICAgICAgCi0gICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKQotICAgICAgICB7ICAKLSAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwobG9jYXRpb24pOwotICAgICAgICAgICAgaXMgPSB1cmwub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgaXNHcmFtbWFyRW5jb3VudGVyZWQgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgIAkvLyBEbyBub3RoaW5nLgotICAgICAgICAgIH0KLSAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgewotICAgICAgICAJaWYoaXMgIT0gbnVsbCkKLSAgICAgICAgCXsKLSAgICAgICAgCSAgdHJ5Ci0gICAgICAgIAkgIHsKLSAgICAgICAgCSAgICBpcy5jbG9zZSgpOwotICAgICAgICAJICB9Ci0gICAgICAgIAkgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgICAgICAJICB7Ci0gICAgICAgIAkJLy8gRG8gbm90aGluZy4KLSAgICAgICAgCSAgfQotICAgICAgICAJfQotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgfSAgICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyI2VsZW1lbnREZWNsKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZWxlbWVudERlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBtb2RlbCkgCi0gICAgewotICAgICAgbnVtRFRERWxlbWVudHMrKzsKLSAgICB9Ci0gICAgCi0gICAgLy8gVGhlIHhzaVNjaGVtYUxvY2F0aW9uVmFsdWUgaXMgYSBsaXN0IG9mIG5hbWVzcGFjZS9sb2NhdGlvbiBwYWlycyB0aGF0IGFyZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSAKLSAgICAvLyB0aGlzIG1ldGhvZCB3YWxrcyB0aGUgbGlzdCBvZiBwYWlycyBsb29raW5nIGZvciB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZSBhbmQgcmV0dXJucyB0aGUgYXNzb2NpYXRlZAotICAgIC8vIGxvY2F0aW9uLgotICAgIC8vICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTY2hlbWFMb2NhdGlvbkZvck5hbWVzcGFjZShTdHJpbmcgeHNpU2NoZW1hTG9jYXRpb25WYWx1ZSwgU3RyaW5nIG5hbWVzcGFjZSkKLSAgICB7ICAgICAgCi0gICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICAgIGlmICh4c2lTY2hlbWFMb2NhdGlvblZhbHVlICE9IG51bGwgJiYgbmFtZXNwYWNlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHhzaVNjaGVtYUxvY2F0aW9uVmFsdWUpOwotICAgICAgICB3aGlsZShzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZihzdC5uZXh0VG9rZW4oKS5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZihzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYoc3QuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfSAgICAgICAgIAotICB9ICAgCi0gICAgICAgCi0gIAotICAvKioKLSAgICogUmVwbGFjZSBhbGwgaW5zdGFuY2VzIGluIHRoZSBzdHJpbmcgb2YgdGhlIG9sZCBwYXR0ZXJuIHdpdGggdGhlIG5ldyBwYXR0ZXJuLgotICAgKiAKLSAgICogQHBhcmFtIHN0cmluZyBUaGUgc3RyaW5nIHRvIHJlcGxhY2UgdGhlIHBhdHRlcm5zIGluLgotICAgKiBAcGFyYW0gb2xkUGF0dGVybiBUaGUgb2xkIHBhdHRlcm4gdG8gcmVwbGFjZS4KLSAgICogQHBhcmFtIG5ld1BhdHRlcm4gVGhlIHBhdHRlcm4gdXNlZCBmb3IgcmVwbGFjZW1lbnQuCi0gICAqIEByZXR1cm4gVGhlIG1vZGlmaWVkIHN0cmluZyB3aXRoIGFsbCBvY2N1cnJhbmNlcyBvZiBvbGRQYXR0ZXJuIHJlcGxhY2VkIGJ5IG5ldyBQYXR0ZXJuLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgcmVwbGFjZShTdHJpbmcgc3RyaW5nLCBTdHJpbmcgb2xkUGF0dGVybiwgU3RyaW5nIG5ld1BhdHRlcm4pCi0gIHsgICAgIAotICAgIGludCBpbmRleCA9IDA7Ci0gICAgd2hpbGUgKGluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIGluZGV4ID0gc3RyaW5nLmluZGV4T2Yob2xkUGF0dGVybiwgaW5kZXgpOwotICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgewotICAgICAgICBzdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KSArIG5ld1BhdHRlcm4gKyBzdHJpbmcuc3Vic3RyaW5nKGluZGV4ICsgb2xkUGF0dGVybi5sZW5ndGgoKSk7Ci0gICAgICAgIGluZGV4ID0gaW5kZXggKyBvbGRQYXR0ZXJuLmxlbmd0aCgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3RyaW5nOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwMWI4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLS8qKgotICogQW4gWE1MIHZhbGlkYXRpb24gY29uZmlndXJhdGlvbiBhbGxvd3Mgc2V0dGluZyBzcGVjaWZpYyBjb25maWd1cmF0aW9uCi0gKiBpbmZvcm1hdGlvbiBmb3IgYSBXVFAgWE1MIHZhbGlkYXRpb24gcnVuLiBBbnkgZmVhdHVyZXMgYW5kIHByb3BlcnRpZXMKLSAqIHNldCBvbiB0aGlzIGNvbmZpZ3VyYXRpb24gc2hvdWxkIG5vdCBiZSBjb25mdXNlZCB3aXRoIHRob3NlIGZyb20KLSAqIHBhcnNlcnMgc3VjaCBhcyBYZXJjZXMuIChUaGlzIG9iamVjdCBkb2VzIG5vdCBieSBkZWZhdWx0IHdyYXAgZmVhdHVyZXMKLSAqIGFuZCBwcm9wZXJ0aWVzIGZyb20gc3BlY2lmaWMgcGFyc2Vycy4pCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiAKLXsKLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBXQVJOX05PX0dSQU1NQVIgPSAiV0FSTl9OT19HUkFNTUFSIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTkRJQ0FURV9OT19HUkFNTUFSID0gIklORElDQVRFX05PX0dSQU1NQVIiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgYm9vbGVhbiB3YXJuX25vX2dyYW1tYXJfdmFsdWUgPSBmYWxzZTsKLSAgcHJpdmF0ZSBpbnQgaW5kaWNhdGVfbm9fZ3JhbW1hcl92YWx1ZSA9IDE7Ci0gIAotICAvKioKLSAgICogU2V0IGEgZmVhdHVyZSBvZiB0aGlzIGNvbmZpZ3VyYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gZmVhdHVyZQotICAgKiAJCVRoZSBmZWF0dXJlIHRvIHNldC4KLSAgICogQHBhcmFtIHZhbHVlCi0gICAqIAkJVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGZlYXR1cmUuCi0gICAqIEB0aHJvd3MgCi0gICAqIAkJQW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgZmVhdHVyZSBpcyBub3QgcmVjb2duaXplZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIGJvb2xlYW4gdmFsdWUpIHRocm93cyBFeGNlcHRpb24KLSAgewotCWlmKFdBUk5fTk9fR1JBTU1BUi5lcXVhbHMoZmVhdHVyZSkpCi0JICB3YXJuX25vX2dyYW1tYXJfdmFsdWUgPSB2YWx1ZTsKLQllbHNlCi0JICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJGZWF0dXJlIG5vdCByZWNvZ25pemVkLiIpOyAvLyROT04tTkxTLTEkCi0JCi0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgYSBmZWF0dXJlIG9mIHRoaXMgY29uZmlndXJhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBmZWF0dXJlCi0gICAqIAkJVGhlIGZlYXR1cmUgdG8gc2V0LgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogCQlUaGUgdmFsdWUgdG8gc2V0IGZvciB0aGUgZmVhdHVyZS4KLSAgICogQHRocm93cyAKLSAgICogCQlBbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBmZWF0dXJlIGlzIG5vdCByZWNvZ25pemVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgaW50IHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLQlpZihJTkRJQ0FURV9OT19HUkFNTUFSLmVxdWFscyhmZWF0dXJlKSkKLQkgIGluZGljYXRlX25vX2dyYW1tYXJfdmFsdWUgPSB2YWx1ZTsKLQllbHNlCi0JICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGZWF0dXJlIG5vdCByZWNvZ25pemVkLiIpOyAvLyROT04tTkxTLTEkCi0JCi0gIH0KLSAgCi0gIAotICAvKioKLSAgICogR2V0IHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBmZWF0dXJlLiBJZiB0aGUgZmVhdHVyZSBpcyBub3QgZGVmaW5lZAotICAgKiB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBmZWF0dXJlCi0gICAqIAkJVGhlIGZlYXR1cmUgZm9yIHdoaWNoIHRvIHJldHJpZXZlIHRoZSB2YWx1ZS4KLSAgICogQHJldHVybgotICAgKiAJCVRoZSBmZWF0dXJlJ3MgdmFsdWUsIHRydWUgb3IgZmFsc2UuCi0gICAqIEB0aHJvd3MgCi0gICAqIAkJQW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgZmVhdHVyZSBpcyBub3QgcmVjb2duaXplZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmUpIHRocm93cyBFeGNlcHRpb24KLSAgewotCWlmKFdBUk5fTk9fR1JBTU1BUi5lcXVhbHMoZmVhdHVyZSkpCi0JICByZXR1cm4gd2Fybl9ub19ncmFtbWFyX3ZhbHVlOwotCQotCXRocm93IG5ldyBFeGNlcHRpb24oIkZlYXR1cmUgbm90IHJlY29nbml6ZWQuIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHZhbHVlIGZvciBhIGdpdmVuIGZlYXR1cmUuIElmIHRoZSBmZWF0dXJlIGlzIG5vdCBkZWZpbmVkCi0gICAqIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGZlYXR1cmUKLSAgICogCQlUaGUgZmVhdHVyZSBmb3Igd2hpY2ggdG8gcmV0cmlldmUgdGhlIHZhbHVlLgotICAgKiBAcmV0dXJuCi0gICAqIAkJVGhlIGZlYXR1cmUncyB2YWx1ZSwgdHJ1ZSBvciBmYWxzZS4KLSAgICogQHRocm93cyAKLSAgICogCQlBbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBmZWF0dXJlIGlzIG5vdCByZWNvZ25pemVkLgotICAgKi8KLSAgcHVibGljIGludCBnZXRJbnRGZWF0dXJlKFN0cmluZyBmZWF0dXJlKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLQlpZihJTkRJQ0FURV9OT19HUkFNTUFSLmVxdWFscyhmZWF0dXJlKSkKLQkgIHJldHVybiBpbmRpY2F0ZV9ub19ncmFtbWFyX3ZhbHVlOwotCQotCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZlYXR1cmUgbm90IHJlY29nbml6ZWQuIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvbkluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg4YmM0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIFsyMDU5ODldIC0gW3ZhbGlkYXRpb25dIHZhbGlkYXRlIFhNTCBhZnRlciBYSW5jbHVkZSByZXNvbHV0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uLkVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXI7Ci0KLQotLyoqCi0gKiBBIHZhbGlkYXRpb24gaW5mb3JtYXRpb24gb2JqZWN0IHNwZWNpZmljIHRvIFhNTCB2YWxpZGF0b3JzLgotICovCi1wdWJsaWMgY2xhc3MgWE1MVmFsaWRhdGlvbkluZm8gZXh0ZW5kcyBWYWxpZGF0aW9uSW5mbyBpbXBsZW1lbnRzIFhNTFZhbGlkYXRpb25SZXBvcnQKLXsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZ3JhbW1hckVuY291bnRlcmVkID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBib29sZWFuIGR0ZEVuY291bnRlcmVkID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBib29sZWFuIG5hbWVzcGFjZUVuY291bnRlcmVkID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBpbnQgZWxlbWVudERlY2xDb3VudCA9IDA7Ci0gIHByb3RlY3RlZCBTdHJpbmcgY3VycmVudEVycm9yS2V5OwotICBwcm90ZWN0ZWQgT2JqZWN0IG1lc3NhZ2VBcmd1bWVudHNbXSA9IG51bGw7Ci0gIHByb3RlY3RlZCBYTUxMb2NhdG9yIGxvY2F0b3IgPSBudWxsOwotICBwcm90ZWN0ZWQgRXJyb3JDdXN0b21pemF0aW9uTWFuYWdlciBlcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyID0gbnVsbDsKLSAgCi0gIC8qKgotICAgKiBBIHN0YWNrIG9mIHN0YXJ0IHRhZyBsb2NhdGlvbnMsIHVzZWQgdG8gbW92ZSBlcnJvcnMKLSAgICogcmVwb3J0ZWQgYXQgdGhlIGNsb3NlIHRhZyB0byBiZSByZXBvcnRlZCBhdCB0aGUgc3RhcnQgdGFnLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0YWNrIHN0YXJ0RWxlbWVudExvY2F0aW9ucyA9IG5ldyBTdGFjaygpOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBmaWxlIHRoaXMgcmVwb3J0IGRlc2NyaWJlcy4KLSAgICovCi0gIHB1YmxpYyBYTUxWYWxpZGF0aW9uSW5mbyhTdHJpbmcgdXJpKQotICB7Ci0gICAgc3VwZXIodXJpKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNHcmFtbWFyRW5jb3VudGVyZWQoKQotICB7Ci0gICAgcmV0dXJuIGdyYW1tYXJFbmNvdW50ZXJlZDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB3aGV0aGVyIGEgZ3JhbW1hciBoYXMgYmVlbiBlbmNvdW50ZXJlZCBvciBub3QuCi0gICAqIAotICAgKiBAcGFyYW0gZ3JhbW1hckVuY291bnRlcmVkIFNldCB0cnVlIGlmIGEgZ3JhbW1hciBoYXMgYmVlbiBlbmNvdW50ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0R3JhbW1hckVuY291bnRlcmVkKGJvb2xlYW4gZ3JhbW1hckVuY291bnRlcmVkKQotICB7Ci0gICAgdGhpcy5ncmFtbWFyRW5jb3VudGVyZWQgPSBncmFtbWFyRW5jb3VudGVyZWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzRFREV2l0aG91dEVsZW1lbnREZWNsYXJhdGlvbkVuY291bnRlcmVkKCkKLSAgewotICAgIHJldHVybiBkdGRFbmNvdW50ZXJlZCAmJiBlbGVtZW50RGVjbENvdW50ID09IDA7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgd2hldGhlciBhIERURCB3aXRob3V0IGFuIGVsZW1lbnQgZGVjbGFyYXRpb24gd2FzIGVuY291bnRlcmVkLgotICAgKiAKLSAgICogQHBhcmFtIGR0ZFdpdGhvdXRFbGVtZW50RGVjbGFyYXRpb25FbmNvdW50ZXJlZCBTZXQgdHJ1ZSBpZiBhIERURCB3aXRob3V0IGFuCi0gICAqICAgICAgICAgZWxlbWVudCBkZWNsYXJhdGlvbiB3YXMgZW5jb3VudGVyZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERUREVuY291bnRlcmVkKGJvb2xlYW4gZHRkRW5jb3VudGVyZWQpCi0gIHsKLSAgICB0aGlzLmR0ZEVuY291bnRlcmVkID0gZHRkRW5jb3VudGVyZWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzTmFtZXNwYWNlRW5jb3VudGVyZWQoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZUVuY291bnRlcmVkOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHdoZXRoZXIgYSBuYW1lc3BhY2Ugd2FzIGVuY291bnRlcmVkLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZUVuY291bnRlcmVkIFNldCB0cnVlIGlmIGEgbmFtZXNwYWNlIHdhcyBlbmNvdW50ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlRW5jb3VudGVyZWQoYm9vbGVhbiBuYW1lc3BhY2VFbmNvdW50ZXJlZCkKLSAgewotICAgIHRoaXMubmFtZXNwYWNlRW5jb3VudGVyZWQgPSBuYW1lc3BhY2VFbmNvdW50ZXJlZDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEluY3JlYXNlIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGNvdW50IGZvciBEVEQgZWxlbWVudHMgYnkgb25lLgotICAgKi8KLSAgcHVibGljIHZvaWQgaW5jcmVhc2VFbGVtZW50RGVjbGFyYXRpb25Db3VudCgpCi0gIHsKLSAgICB0aGlzLmVsZW1lbnREZWNsQ291bnQrKzsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgbnVtYmVyIG9mIERURCBlbGVtZW50cyBlbmNvdW50ZXJlZC4KLSAgICogCi0gICAqIEBwYXJhbSBjb3VudCBUaGUgbnVtYmVyIG9mIERURCBlbGVtZW50cyBlbmNvdW50ZXJlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVsZW1lbnREZWNsYXJhdGlvbkNvdW50KGludCBjb3VudCkKLSAgewotICAJZWxlbWVudERlY2xDb3VudCA9IGNvdW50OwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBYTUwgbG9jYXRvciBpZiBvbmUgaGFzIGJlZW4gc3BlY2lmaWVkLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgWE1MIGxvY2F0b3IgaWYgb25lIGhhcyBiZWVuIHNwZWNpZmllZCBvciBudWxsLgotICAgKi8KLSAgcHVibGljIFhNTExvY2F0b3IgZ2V0WE1MTG9jYXRvcigpCi0gIHsKLSAgICByZXR1cm4gbG9jYXRvcjsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgWE1MTG9jYXRvci4KLSAgICogCi0gICAqIEBwYXJhbSBsb2NhdG9yIFRoZSBYTUxMb2NhdG9yIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFhNTExvY2F0b3IoWE1MTG9jYXRvciBsb2NhdG9yKQotICB7Ci0gICAgdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgY3VycmVudCBlcnJvciBrZXkuCi0gICAqIAotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN1cnJlbnRFcnJvcktleS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudEVycm9yS2V5KCkKLSAgewotICAgIHJldHVybiBjdXJyZW50RXJyb3JLZXk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIGN1cnJlbnQgZXJyb3Iga2V5LgotICAgKiAKLSAgICogQHBhcmFtIGN1cnJlbnRFcnJvcktleSBUaGUgY3VycmVudEVycm9yS2V5IHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRFcnJvcktleShTdHJpbmcgY3VycmVudEVycm9yS2V5KQotICB7Ci0gICAgdGhpcy5jdXJyZW50RXJyb3JLZXkgPSBjdXJyZW50RXJyb3JLZXk7Ci0gIH0KLQotcHVibGljIE9iamVjdFtdIGdldE1lc3NhZ2VBcmd1bWVudHMoKSB7Ci0JcmV0dXJuIG1lc3NhZ2VBcmd1bWVudHM7Ci19Ci0KLQotcHVibGljIHZvaWQgc2V0TWVzc2FnZUFyZ3VtZW50cyhPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKSB7Ci0JdGhpcy5tZXNzYWdlQXJndW1lbnRzID0gbWVzc2FnZUFyZ3VtZW50czsKLX0KLQotICAvKioKLSAgICogR2V0IHRoZSBzdGFydCBlbGVtZW50cyBsb2NhdGlvbnMuCi0gICAqIAotICAgKiBAcmV0dXJuIAotICAgKiAJCUEgc3RhY2sgY29udGFpbmluZyB0aGUgc3RhcnQgZWxlbWVudCBsb2NhdGlvbnMuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RhY2sgZ2V0U3RhcnRFbGVtZW50TG9jYXRpb25zKCkKLSAgewotICAgIHJldHVybiBzdGFydEVsZW1lbnRMb2NhdGlvbnM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGVycm9yIGN1c3RvbWl6YXRpb24gbWFuYWdlciBmb3IgdGhpcyB2YWxpZGF0aW9uIHJ1bi4KLSAgICogCi0gICAqIEByZXR1cm4KLSAgICogCVRoZSBlcnJvciBjdXN0b21pemF0aW9uIG1hbmFnZXIgZm9yIHRoaXMgdmFsaWRhdGlvbiBydW4uCi0gICAqLwotICBwcm90ZWN0ZWQgRXJyb3JDdXN0b21pemF0aW9uTWFuYWdlciBnZXRFcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyKCkKLSAgewotCSAgaWYoZXJyb3JDdXN0b21pemF0aW9uTWFuYWdlciA9PSBudWxsKQotCSAgewotCQkgIGVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIgPSBuZXcgRXJyb3JDdXN0b21pemF0aW9uTWFuYWdlcigpOwotCSAgfQotCSAgcmV0dXJuIGVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzVXNlWEluY2x1ZGUoKSB7Ci0JICByZXR1cm4gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVNFX1hJTkNMVURFKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZDA4ZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBYTUwgVmFsaWRhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgWE1MVmFsaWRhdGlvbk1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24ueG1sdmFsaWRhdGlvbiI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST0JMRU1TX1ZBTElEQVRJTkdfVU5LTk9XTl9IT1NUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9CTEVNU19WQUxJREFUSU5HX0ZJTEVfTk9UX0ZPVU5EOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9CTEVNU19DT05ORUNUSU9OX1JFRlVTRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JFRl9GSUxFX0VSUk9SX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1dBUk5fTk9fR1JBTU1BUjsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBYTUxWYWxpZGF0aW9uTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgWE1MVmFsaWRhdGlvbk1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25SZXBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25SZXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE0ZjFmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uUmVwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvblJlcG9ydDsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgcmVwcmVzZW50aW9uIGEgdmFsaWRhdGlvbiByZXBvcnQgZm9yIFhNTCB2YWxpZGF0aW9uLgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWE1MVmFsaWRhdGlvblJlcG9ydCBleHRlbmRzIFZhbGlkYXRpb25SZXBvcnQKLXsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBncmFtbWFyIHdhcyBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIHZhbGlkYXRpb24uCi0gICAqIAotICAgKiBAcmV0dXJuIFRydWUgaWYgYSBncmFtbWFyIHdhcyBlbmNvdW50ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNHcmFtbWFyRW5jb3VudGVyZWQoKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBuYW1lc3BhY2Ugd2FzIGVuY291bnRlcmVkLgotICAgKiAKLSAgICogQHJldHVybiBUcnVlIGlmIGEgbmFtZXNwYWNlIHdhcyBlbmNvdW50ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VFbmNvdW50ZXJlZCgpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciBhIERURCB3aXRob3V0IGVsZW1lbnQgZGVjbGFyYXRpb25zIHdhcyBlbmNvdW50ZXJlZC4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiBhIERURCB3aXRob3V0IGVsZW1lbnQgZGVjbGFyYXRpb25zIHdhcyBlbmNvdW50ZXJlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRFREV2l0aG91dEVsZW1lbnREZWNsYXJhdGlvbkVuY291bnRlcmVkKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTQ0ZmFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBTVEFSIC0gWzIwNTk4OV0gLSBbdmFsaWRhdGlvbl0gdmFsaWRhdGUgWE1MIGFmdGVyIFhJbmNsdWRlIHJlc29sdXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmltcGwuWE1MRXJyb3JSZXBvcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLm1zZy5YTUxNZXNzYWdlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuWEluY2x1ZGVBd2FyZVBhcnNlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLkF1Z21lbnRhdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxMb2NhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxSZXNvdXJjZUlkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhOSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5MYXp5VVJMSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcGVyZm9ybXMgdmFsaWRhdGlvbiB1c2luZyBhIHhlcmNlcyBzYXggcGFyc2VyLiAgCi0gKiBIZXJlJ3MgYSBxdWljayBvdmVydmlldyBvZiB0aGUgZGV0YWlscyA6IAotICogICAtIGFuIEVycm9ySGFuZGxlciBpcyB1c2VkIHRvIGNvbGxlY3QgZXJyb3JzIGludG8gYSBsaXN0IChzbyB0aGV5IG1heSBiZSBkaXNwbGF5ZWQgYnkgdGhlIFVJKQotICogICAtIGFuIEVudGl0eVJlc29sdmVyIGlzIHVzZWQgYWxvbmcgd2l0aCB0aGUgeGVyY2VzICJleHRlcm5hbC1zY2hlbWFMb2NhdGlvbiIgcHJvcGVydHkgdG8gaW1wbGVtZW50IFhNTCBDYXRhbG9nIHN1cHBvcnQKLSAqLwotcHVibGljIGNsYXNzIFhNTFZhbGlkYXRvcgotewotICBwcm90ZWN0ZWQgVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIgPSBudWxsOwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGluZ29yZWRFcnJvcktleVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICBwcm90ZWN0ZWQgU2V0IGFkanVzdExvY2F0aW9uRXJyb3JLZXlTZXQgPSBuZXcgVHJlZVNldCgpOwotCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElHTk9SRV9BTFdBWVMgPSAiSUdOT1JFX0FMV0FZUyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUdOT1JFX0lGX0RURF9XSVRIT1VUX0VMRU1FTlRfREVDTCA9ICJJR05PUkVfSUZfRFREX1dJVEhPVVRfRUxFTUVOVF9ERUNMIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVNQVRVUkVfRU9GID0gIlByZW1hdHVyZUVPRiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9FTEVNRU5UX1RZUEVfTVVTVF9NQVRDSF9ET0NUWVBFREVDTCA9ICJSb290RWxlbWVudFR5cGVNdXN0TWF0Y2hEb2N0eXBlZGVjbCI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX0VMRU1FTlRfTk9UX0RFQ0xBUkVEID0gIk1TR19FTEVNRU5UX05PVF9ERUNMQVJFRCI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIC8vIFdUUCBYTUwgdmFsaWRhdG9yIHNwZWNpZmljIGtleS4KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fR1JBTU1BUl9GT1VORCA9ICJOT19HUkFNTUFSX0ZPVU5EIjsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfTk9UX0ZPVU5EX0tFWSA9ICJGSUxFX05PVF9GT1VORCI7IC8vJE5PTi1OTFMtMSQKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgWE1MVmFsaWRhdG9yKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgLy8gSGVyZSB3ZSBhZGQgc29tZSBlcnJvciBrZXlzIHRoYXQgd2UgbmVlZCB0byBmaWx0ZXIgb3V0IHdoZW4gd2UncmUgdmFsaWRhdGlvbiAKLSAgICAvLyBhZ2FpbnN0IGEgRFREIHdpdGhvdXQgYW55IGVsZW1lbnQgZGVjbGFyYXRpb25zLiAgICAgICAKLSAgICBpbmdvcmVkRXJyb3JLZXlUYWJsZS5wdXQoUFJFTUFUVVJFX0VPRiwgSUdOT1JFX0FMV0FZUyk7Ci0gICAgaW5nb3JlZEVycm9yS2V5VGFibGUucHV0KFJPT1RfRUxFTUVOVF9UWVBFX01VU1RfTUFUQ0hfRE9DVFlQRURFQ0wsIElHTk9SRV9JRl9EVERfV0lUSE9VVF9FTEVNRU5UX0RFQ0wpOwotICAgIGluZ29yZWRFcnJvcktleVRhYmxlLnB1dChNU0dfRUxFTUVOVF9OT1RfREVDTEFSRUQsIElHTk9SRV9JRl9EVERfV0lUSE9VVF9FTEVNRU5UX0RFQ0wpOwotICAgIAotICAgIC8vIEhlcmUgd2UgYWRkIHNvbWUgZXJyb3Iga2V5cyB0aGF0IHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IuCi0gICAgLy8gVGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIHdpbGwgYmUgYWRqdXN0ZWQgdG8gcGxhY2UgdGhlIG1lc3NhZ2Ugb24gdGhlIGxpbmUgb2YgdGhlIHN0YXJ0aW5nCi0gICAgLy8gZWxlbWVudCBpbnN0ZWFkIG9mIG9uIHRoZSBsaW5lIG9mIHRoZSBjbG9zaW5nIGVsZW1lbnQuCi0gICAgYWRqdXN0TG9jYXRpb25FcnJvcktleVNldC5hZGQoIk1TR19DT05URU5UX0lOVkFMSUQiKTsKLSAgICBhZGp1c3RMb2NhdGlvbkVycm9yS2V5U2V0LmFkZCgiTVNHX0NPTlRFTlRfSU5DT01QTEVURSIpOwotICAgIGFkanVzdExvY2F0aW9uRXJyb3JLZXlTZXQuYWRkKCJjdmMtY29tcGxleC10eXBlLjIuNC5iIik7Ci0gICAgYWRqdXN0TG9jYXRpb25FcnJvcktleVNldC5hZGQoImN2Yy1jb21wbGV4LXR5cGUuMi4zIik7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBVUkkgUmVzb2x2ZXIgdG8gdXNlLgotICAgKiAKLSAgICogQHBhcmFtIHVyaVJlc29sdmVyIFRoZSBVUkkgUmVzb2x2ZXIgdG8gdXNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VVJJUmVzb2x2ZXIoVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIpCi0gIHsKLSAgICB0aGlzLnVyaVJlc29sdmVyID0gdXJpUmVzb2x2ZXI7Ci0gICAgLy9lbnRpdHlSZXNvbHZlciA9IG5ldyBNeUVudGl0eVJlc29sdmVyKHVyaVJlc29sdmVyKTsKLSAgfQotCi0gCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gWE1MIFJlYWRlci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgWE1MIHJlYWRlciBvciBudWxsIGlmIHVuc3VjY2Vzc2Z1bC4KLSAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBYTUxSZWFkZXIgY3JlYXRlWE1MUmVhZGVyKGZpbmFsIFhNTFZhbGlkYXRpb25JbmZvIHZhbGluZm8sIFhNTEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsgICAgIAotICAgIFhNTFJlYWRlciByZWFkZXIgPSBudWxsOwotICAgIC8vIG1vdmUgdG8gWGVyY2VzLTIuLi4gYWRkIHRoZSBjb250ZXh0Q2xhc3NMb2FkZXIgc3R1ZmYKLSAgICBDbGFzc0xvYWRlciBwcmV2Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgIHRyeQotICAgIHsKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICBNeVN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IE15U3RhbmRhcmRQYXJzZXJDb25maWd1cmF0aW9uKHZhbGluZm8pOwotICAgICAgcmVhZGVyID0gbmV3IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuU0FYUGFyc2VyKGNvbmZpZ3VyYXRpb24pCi0gICAgICB7Ci0gICAgCXByaXZhdGUgWE1MTG9jYXRvciBsb2NhdG9yID0gbnVsbDsKLSAgICAJCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLkFic3RyYWN0U0FYUGFyc2VyI3N0YXJ0RG9jdW1lbnQob3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTExvY2F0b3IsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5OYW1lc3BhY2VDb250ZXh0LCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuQXVnbWVudGF0aW9ucykKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQob3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTExvY2F0b3IgdGhlTG9jYXRvciwgamF2YS5sYW5nLlN0cmluZyBlbmNvZGluZywgTmFtZXNwYWNlQ29udGV4dCBuc2NvbnRleHQsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5BdWdtZW50YXRpb25zIGF1Z3MpIAotICAgICAgICB7Ci0gICAgICAgICAgbG9jYXRvciA9IHRoZUxvY2F0b3I7Ci0gICAgICAgICAgdmFsaW5mby5zZXRYTUxMb2NhdG9yKHRoZUxvY2F0b3IpOwotICAgICAgICAgIHN1cGVyLnN0YXJ0RG9jdW1lbnQodGhlTG9jYXRvciwgZW5jb2RpbmcsIG5zY29udGV4dCwgYXVncyk7IAotICAgICAgICB9Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuQWJzdHJhY3RTQVhQYXJzZXIjc3RhcnRFbGVtZW50KG9yZy5hcGFjaGUueGVyY2VzLnhuaS5RTmFtZSwgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTEF0dHJpYnV0ZXMsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5BdWdtZW50YXRpb25zKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFFOYW1lIGFyZzAsIFhNTEF0dHJpYnV0ZXMgYXJnMSwgQXVnbWVudGF0aW9ucyBhcmcyKSB0aHJvd3MgWE5JRXhjZXB0aW9uIAotICAgICAgICB7Ci0gICAgICAgICAgdmFsaW5mby5nZXRTdGFydEVsZW1lbnRMb2NhdGlvbnMoKS5wdXNoKG5ldyBMb2NhdGlvbkNvb3JkaW5hdGUobG9jYXRvci5nZXRMaW5lTnVtYmVyKCksIGxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCkpKTsKLQkJICBzdXBlci5zdGFydEVsZW1lbnQoYXJnMCwgYXJnMSwgYXJnMik7Ci0JCX0KLSAgICAgICAgCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLkFic3RyYWN0U0FYUGFyc2VyI2VuZEVsZW1lbnQob3JnLmFwYWNoZS54ZXJjZXMueG5pLlFOYW1lLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuQXVnbWVudGF0aW9ucykKLQkJICovCi0JCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoUU5hbWUgYXJnMCwgQXVnbWVudGF0aW9ucyBhcmcxKSB0aHJvd3MgWE5JRXhjZXB0aW9uIHsKLQkJCXN1cGVyLmVuZEVsZW1lbnQoYXJnMCwgYXJnMSk7Ci0JCQl2YWxpbmZvLmdldFN0YXJ0RWxlbWVudExvY2F0aW9ucygpLnBvcCgpOwotCQl9Ci0gICAgICB9OwotCi0gICAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2NvbnRpbnVlLWFmdGVyLWZhdGFsLWVycm9yIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0gICAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIsIHZhbGluZm8uaXNOYW1lc3BhY2VFbmNvdW50ZXJlZCgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiwgdmFsaW5mby5pc05hbWVzcGFjZUVuY291bnRlcmVkKCkpOyAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvdmFsaWRhdGlvbiIsIHZhbGluZm8uaXNHcmFtbWFyRW5jb3VudGVyZWQoKSk7ICAvLyROT04tTkxTLTEkCi0gICAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hIiwgdmFsaW5mby5pc0dyYW1tYXJFbmNvdW50ZXJlZCgpKTsgLy8kTk9OLU5MUy0xJAotICAgCSAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy94aW5jbHVkZSIsIHZhbGluZm8uaXNVc2VYSW5jbHVkZSgpKTsgLy8kTk9OLU5MUy0xJCAgICAgIAotICAgICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKG5ldyBEZWZhdWx0SGFuZGxlcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgdmFsaW5mby5nZXRFcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyKCkuc3RhcnRFbGVtZW50KHVyaSwgbG9jYWxOYW1lKTsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgdmFsaW5mby5nZXRFcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyKCkuZW5kRWxlbWVudCh1cmksIGxvY2FsTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0pOyAgICAgIAotICAgICAgCi0gICAgICAvLyBNSCBtYWtlIHN1cmUgdmFsaWRhdGlvbiB3b3JrcyBldmVuIHdoZW4gYSBjdXN0b21lciBlbnRpdHlSZXNvbHZlciBpcyBub3RlIHNldCAoaS5lLiB2aWEgc2V0VVJJUmVzb2x2ZXIoKSkKLSAgICAgIGlmIChlbnRpdHlSZXNvbHZlciAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIHJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL3Byb3BlcnRpZXMvaW50ZXJuYWwvZW50aXR5LXJlc29sdmVyIiwgZW50aXR5UmVzb2x2ZXIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9ICAKLSAgICAgIHJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvZGVjbGFyYXRpb24taGFuZGxlciIsIG5ldyBNeURlY2xIYW5kbGVyKCkpOyAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICB9IAotICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgIHsgCi0gICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgICAgLy9lLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIocHJldkNsYXNzTG9hZGVyKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlYWRlcjsKLSAgfSAgCi0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBmaWxlIGxvY2F0ZWQgYXQgdGhlIGdpdmVuIFVSSS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHJldHVybiBSZXR1cm5zIGFuIFhNTCB2YWxpZGF0aW9uIHJlcG9ydC4KLSAgICovCi0gIHB1YmxpYyBYTUxWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmkpCi0gIHsKLSAgICByZXR1cm4gdmFsaWRhdGUodXJpLCBudWxsLCBuZXcgWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24oKSk7ICAKLSAgfQotCi0gIGZpbmFsIFN0cmluZyBjcmVhdGVTdHJpbmdGb3JJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkKLSAgewotICAgIC8vIEhlcmUgd2UgYXJlIHJlYWRpbmcgdGhlIGZpbGUgYW5kIHN0b3JpbmcgdG8gYSBzdHJpbmdidWZmZXIuCi0gICAgU3RyaW5nQnVmZmVyIGZpbGVTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaW5wdXRSZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXRTdHJlYW0sICJVVEYtOCIpOwotICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlucHV0UmVhZGVyKTsKLSAgICAgIGNoYXJbXSBjaGFycyA9IG5ldyBjaGFyWzEwMjRdOwotICAgICAgaW50IG51bWJlclJlYWQgPSByZWFkZXIucmVhZChjaGFycyk7Ci0gICAgICB3aGlsZSAobnVtYmVyUmVhZCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgZmlsZVN0cmluZy5hcHBlbmQoY2hhcnMsIDAsIG51bWJlclJlYWQpOwotICAgICAgICBudW1iZXJSZWFkID0gcmVhZGVyLnJlYWQoY2hhcnMpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy9UT0RPOiBsb2cgZXJyb3IgbWVzc2FnZQotICAgICAgLy9lLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gZmlsZVN0cmluZy50b1N0cmluZygpOwotICB9Ci0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgaW5wdXRTdHJlYW0KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIHRoZSBpbnB1dFN0cmVhbSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZQotICAgKiBAcmV0dXJuIFJldHVybnMgYW4gWE1MIHZhbGlkYXRpb24gcmVwb3J0LgotICAgKi8KLSAgcHVibGljIFhNTFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCi0gIHsKLQlyZXR1cm4gdmFsaWRhdGUodXJpLCBpbnB1dFN0cmVhbSwgbmV3IFhNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uKCkpOwotICB9Ci0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgaW5wdXRTdHJlYW0KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgCi0gICAqIAkJVGhlIFVSSSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIGlucHV0c3RyZWFtCi0gICAqIAkJVGhlIGlucHV0U3RyZWFtIG9mIHRoZSBmaWxlIHRvIHZhbGlkYXRlCi0gICAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0gICAqIAkJQSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHZhbGlkYXRpb24gc2Vzc2lvbi4KLSAgICogQHJldHVybiAKLSAgICogCQlSZXR1cm5zIGFuIFhNTCB2YWxpZGF0aW9uIHJlcG9ydC4KLSAgICovCi0gIHB1YmxpYyBYTUxWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBYTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotICB7Ci0gICAgcmV0dXJuIHZhbGlkYXRlKHVyaSwgaW5wdXRTdHJlYW0sIGNvbmZpZ3VyYXRpb24sIG51bGwpOyAgCi0gIH0KLSAKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBpbnB1dFN0cmVhbQotICAgKiAKLSAgICogQHBhcmFtIHVyaSAKLSAgICogICAgVGhlIFVSSSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIGlucHV0c3RyZWFtCi0gICAqICAgIFRoZSBpbnB1dFN0cmVhbSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZQotICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotICAgKiAgICBBIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgdmFsaWRhdGlvbiBzZXNzaW9uLgotICAgKiBAcGFyYW0gcmVzdWx0Ci0gICAqICAgIFRoZSB2YWxpZGF0aW9uIHJlc3VsdAotICAgKiBAcmV0dXJuIAotICAgKiAgICBSZXR1cm5zIGFuIFhNTCB2YWxpZGF0aW9uIHJlcG9ydC4KLSAgICovCi0gIHB1YmxpYyBYTUxWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBYTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCkKLSAgewotICAgIFN0cmluZyBncmFtbWFyRmlsZSA9ICIiOwotICAgIFJlYWRlciByZWFkZXIxID0gbnVsbDsgLy8gVXNlZCBmb3IgdGhlIHByZXBhcnNlLgotICAgIFJlYWRlciByZWFkZXIyID0gbnVsbDsgLy8gVXNlZCBmb3IgdmFsaWRhdGlvbiBwYXJzZS4KLSAgICAKLSAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIFN0cmluZyBzdHJpbmcgPSBjcmVhdGVTdHJpbmdGb3JJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSk7Ci0gICAgICByZWFkZXIxID0gbmV3IFN0cmluZ1JlYWRlcihzdHJpbmcpOwotICAgICAgcmVhZGVyMiA9IG5ldyBTdHJpbmdSZWFkZXIoc3RyaW5nKTsKLSAgICB9IAotICAgICAgICAKLSAgICBYTUxWYWxpZGF0aW9uSW5mbyB2YWxpbmZvID0gbmV3IFhNTFZhbGlkYXRpb25JbmZvKHVyaSk7Ci0gICAgTXlFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlciA9IG5ldyBNeUVudGl0eVJlc29sdmVyKHVyaVJlc29sdmVyKTsgCi0gICAgVmFsaWRhdG9ySGVscGVyIGhlbHBlciA9IG5ldyBWYWxpZGF0b3JIZWxwZXIoKTsgCi0gICAgdHJ5Ci0gICAgeyAgCi0gICAgICAgIGhlbHBlci5jb21wdXRlVmFsaWRhdGlvbkluZm9ybWF0aW9uKHVyaSwgcmVhZGVyMSwgdXJpUmVzb2x2ZXIpOwotICAgICAgICB2YWxpbmZvLnNldERUREVuY291bnRlcmVkKGhlbHBlci5pc0RUREVuY291bnRlcmVkKTsKLSAgICAgICAgdmFsaW5mby5zZXRFbGVtZW50RGVjbGFyYXRpb25Db3VudChoZWxwZXIubnVtRFRERWxlbWVudHMpOwotICAgICAgICB2YWxpbmZvLnNldE5hbWVzcGFjZUVuY291bnRlcmVkKGhlbHBlci5pc05hbWVzcGFjZUVuY291bnRlcmVkKTsKLSAgICAgICAgdmFsaW5mby5zZXRHcmFtbWFyRW5jb3VudGVyZWQoaGVscGVyLmlzR3JhbW1hckVuY291bnRlcmVkKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFJlYWRlciByZWFkZXIgPSBjcmVhdGVYTUxSZWFkZXIodmFsaW5mbywgZW50aXR5UmVzb2x2ZXIpOwotICAgICAgICBYTUxFcnJvckhhbmRsZXIgZXJyb3JoYW5kbGVyID0gbmV3IFhNTEVycm9ySGFuZGxlcih2YWxpbmZvKTsKLSAgICAgICAgcmVhZGVyLnNldEVycm9ySGFuZGxlcihlcnJvcmhhbmRsZXIpOwotICAgICAgICAKLSAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UodXJpKTsKLSAgICAgICAgaW5wdXRTb3VyY2Uuc2V0Q2hhcmFjdGVyU3RyZWFtKHJlYWRlcjIpOwotICAgICAgICByZWFkZXIucGFyc2UoaW5wdXRTb3VyY2UpOyAgIAotICAgICAgICBpZihjb25maWd1cmF0aW9uLmdldEludEZlYXR1cmUoWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uSU5ESUNBVEVfTk9fR1JBTU1BUikgPiAwICYmIAotICAgICAgICAJCXZhbGluZm8uaXNWYWxpZCgpICYmICFoZWxwZXIuaXNHcmFtbWFyRW5jb3VudGVyZWQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZihjb25maWd1cmF0aW9uLmdldEludEZlYXR1cmUoWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uSU5ESUNBVEVfTk9fR1JBTU1BUikgPT0gMSkKLSAgICAgICAgICAgIHZhbGluZm8uYWRkV2FybmluZyhYTUxWYWxpZGF0aW9uTWVzc2FnZXMuX1dBUk5fTk9fR1JBTU1BUiwgMSwgMCwgdXJpLCBOT19HUkFNTUFSX0ZPVU5ELCBudWxsKTsKLSAgICAgICAgICBlbHNlIC8vIDIKLSAgICAgICAgICAgICAgdmFsaW5mby5hZGRFcnJvcihYTUxWYWxpZGF0aW9uTWVzc2FnZXMuX1dBUk5fTk9fR1JBTU1BUiwgMSwgMCwgdXJpLCBOT19HUkFNTUFSX0ZPVU5ELCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoZWxwZXIuaXNEVERFbmNvdW50ZXJlZCkKLSAgICAgICAgICBncmFtbWFyRmlsZSA9IGVudGl0eVJlc29sdmVyLmdldExvY2F0aW9uKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBncmFtbWFyRmlsZSA9IGhlbHBlci5zY2hlbWFMb2NhdGlvblN0cmluZzsKLSAgICB9Ci0gICAgY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIHNheFBhcnNlRXhjZXB0aW9uKQotICAgIHsKLSAgICAgIC8vIFRoZXNlIGVycm9ycyBhcmUgY2F1Z2h0IGJ5IHRoZSBlcnJvciBoYW5kbGVyLgotICAgICAgLy9hZGRWYWxpZGF0aW9uTWVzc2FnZSh2YWxpbmZvLCBzYXhQYXJzZUV4Y2VwdGlvbik7Ci0gICAgfSAgICAgICAgICAgICAgICAgCi0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvRXhjZXB0aW9uKQotICAgIHsKLSAgICAgIGFkZFZhbGlkYXRpb25NZXNzYWdlKHZhbGluZm8sIGlvRXhjZXB0aW9uKTsKLSAgICB9ICAgICAgICAgICAgICAgICAKLSAgICBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7ICAKLSAgICAJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBleGNlcHRpb24pOwotICAgIH0KLQotICAgIC8vIE5vdyBzZXQgdXAgdGhlIGRlcGVuZGVuY2llcwotICAgIC8vIFdyYXAgd2l0aCB0cnkgY2F0Y2ggc28gdGhhdCBpZiBzb21ldGhpbmcgd3JvbmcgaGFwcGVucywgdmFsaWRhdGlvbiBjYW4KLSAgICAvLyBzdGlsbCBwcm9jZWVkIGFzIGJlZm9yZQotICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0V29ya3NwYWNlRmlsZUZyb21Mb2NhdGlvbihncmFtbWFyRmlsZSk7Ci0gICAgICAgIEFycmF5TGlzdCByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKQotICAgICAgICAgIHJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotICAgICAgICByZXN1bHQuc2V0RGVwZW5kc09uKChJUmVzb3VyY2UgW10pcmVzb3VyY2VzLnRvQXJyYXkobmV3IElSZXNvdXJjZSBbMF0pKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiB2YWxpbmZvOwotICAgICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHZhbGlkYXRpb24gbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaW5mbyBUaGUgdmFsaWRhdGlvbiBpbmZvIG9iamVjdCB0byBhZGQgdGhlIGVycm9yIHRvLgotICAgKiBAcGFyYW0gZXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdGhhdCBjb250YWlucyB0aGUgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZFZhbGlkYXRpb25NZXNzYWdlKFhNTFZhbGlkYXRpb25JbmZvIHZhbGluZm8sIElPRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgeyAKLSAgICBTdHJpbmcgdmFsaWRhdGlvbk1lc3NhZ2VTdHIgPSBleGNlcHRpb24uZ2V0TWVzc2FnZSgpOwotCVRocm93YWJsZSBjYXVzZSA9IGV4Y2VwdGlvbi5nZXRDYXVzZSgpICE9IG51bGwgPyBleGNlcHRpb24uZ2V0Q2F1c2UoKSA6IGV4Y2VwdGlvbjsKLQl3aGlsZSh2YWxpZGF0aW9uTWVzc2FnZVN0ciA9PSBudWxsICYmIGNhdXNlICE9IG51bGwpewotCQlTdHJpbmcgbG9jYWxpemVkTWVzc2FnZSA9IGNhdXNlLmdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkgICAgY2F1c2UgPSBjYXVzZS5nZXRDYXVzZSgpOwotCSAgICBpZihjYXVzZSA9PSBudWxsICYmIGxvY2FsaXplZE1lc3NhZ2UgIT0gbnVsbCApCi0JICAgIHsKLQkgICAgICB2YWxpZGF0aW9uTWVzc2FnZVN0ciA9IGxvY2FsaXplZE1lc3NhZ2U7Ci0JICAgIH0KLQl9Ci0JCi0JaWYgKHZhbGlkYXRpb25NZXNzYWdlU3RyICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGNhdXNlIGluc3RhbmNlb2YgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKQotICAgICAgewotICAgICAgICB2YWxpZGF0aW9uTWVzc2FnZVN0ciA9IE5MUy5iaW5kKFhNTFZhbGlkYXRpb25NZXNzYWdlcy5fVUlfUFJPQkxFTVNfVkFMSURBVElOR19GSUxFX05PVF9GT1VORCwgbmV3IE9iamVjdCBbXSB7IHZhbGlkYXRpb25NZXNzYWdlU3RyIH0pOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY2F1c2UgaW5zdGFuY2VvZiBVbmtub3duSG9zdEV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAJdmFsaWRhdGlvbk1lc3NhZ2VTdHIgPSBOTFMuYmluZChYTUxWYWxpZGF0aW9uTWVzc2FnZXMuX1VJX1BST0JMRU1TX1ZBTElEQVRJTkdfVU5LTk9XTl9IT1NULCBuZXcgT2JqZWN0IFtdIHsgdmFsaWRhdGlvbk1lc3NhZ2VTdHIgfSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKGNhdXNlIGluc3RhbmNlb2YgQ29ubmVjdEV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAJdmFsaWRhdGlvbk1lc3NhZ2VTdHIgPSBYTUxWYWxpZGF0aW9uTWVzc2FnZXMuX1VJX1BST0JMRU1TX0NPTk5FQ1RJT05fUkVGVVNFRDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodmFsaWRhdGlvbk1lc3NhZ2VTdHIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYTUxMb2NhdG9yIGxvY2F0b3IgPSB2YWxpbmZvLmdldFhNTExvY2F0b3IoKTsKLSAgICAgIHZhbGluZm8uYWRkV2FybmluZyh2YWxpZGF0aW9uTWVzc2FnZVN0ciwgbG9jYXRvciAhPSBudWxsID8gbG9jYXRvci5nZXRMaW5lTnVtYmVyKCkgOiAxLCBsb2NhdG9yICE9IG51bGwgPyBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpIDogMCwgdmFsaW5mby5nZXRGaWxlVVJJKCksIEZJTEVfTk9UX0ZPVU5EX0tFWSwgbnVsbCk7Ci0gICAgfQotICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAvKioKLSAgICogQWRkIGEgdmFsaWRhdGlvbiBtZXNzYWdlIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpbmZvIFRoZSB2YWxpZGF0aW9uIGluZm8gb2JqZWN0IHRvIGFkZCB0aGUgZXJyb3IgdG8uCi0gICAqIEBwYXJhbSBleGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSB2YWxpZGF0aW9uIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoWE1MVmFsaWRhdGlvbkluZm8gdmFsaW5mbywgU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKQotICB7IAotICAgIGlmIChleGNlcHRpb24uZ2V0TWVzc2FnZSgpICE9IG51bGwpCi0gICAgeyAKLSAgICAgIHZhbGluZm8uYWRkRXJyb3IoZXhjZXB0aW9uLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZXhjZXB0aW9uLmdldExpbmVOdW1iZXIoKSwgZXhjZXB0aW9uLmdldENvbHVtbk51bWJlcigpLCBleGNlcHRpb24uZ2V0U3lzdGVtSWQoKSk7Ci0gICAgfQotICB9Ci0KLSAgCi0gIC8qKgotICAgKiBBIGN1c3RvbSBlbnRpdHkgcmVzb2x2ZXIgdGhhdCB1c2VzIHRoZSBVUkkgcmVzb2x2ZXIgc3BlY2lmaWVkIHRvIHJlc29sdmUgZW50aXRpZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgTXlFbnRpdHlSZXNvbHZlciBpbXBsZW1lbnRzIFhNTEVudGl0eVJlc29sdmVyIAotICB7Ci0gICAgcHJpdmF0ZSBVUklSZXNvbHZlciB1cmlSZXNvbHZlcjsKLSAgICBwcml2YXRlIFN0cmluZyByZXNvbHZlZERURExvY2F0aW9uOwotICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaVJlc29sdmVyIFRoZSBVUkkgcmVzb2x2ZXIgdG8gdXNlIHdpdGggdGhpcyBlbnRpdHkgcmVzb2x2ZXIuCi0gICAgICovCi0gICAgcHVibGljIE15RW50aXR5UmVzb2x2ZXIoVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIpCi0gICAgewotICAgICAgdGhpcy51cmlSZXNvbHZlciA9IHVyaVJlc29sdmVyOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyI3Jlc29sdmVFbnRpdHkob3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcikKLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShYTUxSZXNvdXJjZUlkZW50aWZpZXIgcmlkKSB0aHJvd3MgWE5JRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBYTUxJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IF9pbnRlcm5hbFJlc29sdmVFbnRpdHkodXJpUmVzb2x2ZXIsIHJpZCk7Ci0gICAgICAgIGlmIChpbnB1dFNvdXJjZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzb2x2ZWREVERMb2NhdGlvbiA9IGlucHV0U291cmNlLmdldFN5c3RlbUlkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlucHV0U291cmNlOwotICAgICAgfQotICAgICAgY2F0Y2goSU9FeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy9lLnByaW50U3RhY2tUcmFjZSgpOyAgIAotICAgICAgfSAgICAgIAotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIHJlc29sdmVkRFRETG9jYXRpb247Ci0gICAgfQotICB9Ci0gIAotICAvLyBjcyA6IEkndmUgcmVmYWN0b3JlZCB0aGUgY29tbW9uIFNBWCBiYXNlZCByZXNvbHV0aW9uIGNvZGUgaW50byB0aGlzIG1ldGhvZCBmb3IgdXNlIGJ5IG90aGVyIHZhbGlkYXRvcnMgCi0gIC8vIChpLmUuIFhNTCBTY2hlbWEsIFdTREwgZXRjKS4gICBUaGUgb3RoZXIgYXBwcm9hY2ggaXMgbWFpbnRhaW4gYSBjb3B5IGZvciBlYWNoIHZhbGlkYXRvciB0aGF0IGhhcwotICAvLyBpZGVudGljYWwgY29kZS4gIEluIGFueSBjYXNlIHdlIHNob3VsZCBzdHJpdmUgdG8gZW5zdXJlIHRoYXQgdGhlIHZhbGlkYXRvcnMgcGVyZm9ybSByZXNvbHV0aW9uIGNvbnNpc3RlbnRseS4gCi0gIHB1YmxpYyBzdGF0aWMgWE1MSW5wdXRTb3VyY2UgX2ludGVybmFsUmVzb2x2ZUVudGl0eShVUklSZXNvbHZlciB1cmlSZXNvbHZlciwgWE1MUmVzb3VyY2VJZGVudGlmaWVyIHJpZCkgdGhyb3dzICBJT0V4Y2VwdGlvbgotICB7Ci0gICAgWE1MSW5wdXRTb3VyY2UgaXMgPSBudWxsOwotICAgIAotICAgIGlmICh1cmlSZXNvbHZlciAhPSBudWxsKQotICAgIHsgICAgICAgICAKLSAgICAgIFN0cmluZyBpZCA9IHJpZC5nZXRQdWJsaWNJZCgpOwotICAgICAgaWYoaWQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWQgPSByaWQuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIFN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0gICAgICBpZiAoaWQgIT0gbnVsbCB8fCByaWQuZ2V0TGl0ZXJhbFN5c3RlbUlkKCkgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBsb2NhdGlvbiA9IHVyaVJlc29sdmVyLnJlc29sdmUocmlkLmdldEJhc2VTeXN0ZW1JZCgpLCBpZCwgcmlkLmdldExpdGVyYWxTeXN0ZW1JZCgpKTsKLSAgICAgIH0gIAotICAgICAgCi0gICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU3RyaW5nIHBoeXNpY2FsID0gdXJpUmVzb2x2ZXIucmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24ocmlkLmdldEJhc2VTeXN0ZW1JZCgpLCBpZCwgbG9jYXRpb24pOwotICAgICAgICBpcyA9IG5ldyBYTUxJbnB1dFNvdXJjZShyaWQuZ2V0UHVibGljSWQoKSwgbG9jYXRpb24sIGxvY2F0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoaXMgYmxvY2sgY2hlY2tzIHRoYXQgdGhlIGZpbGUgZXhpc3RzLiBJZiBpdCBkb2Vzbid0IHdlIG5lZWQgdG8gdGhyb3cKLSAgICAgICAgLy8gYW4gZXhjZXB0aW9uIHNvIFhlcmNlcyB3aWxsIHJlcG9ydCBhbiBlcnJvci4gbm90ZTogVGhpcyBtYXkgbm90IGJlCi0gICAgICAgIC8vIG5lY2Vzc2FyeSB3aXRoIGFsbCB2ZXJzaW9ucyBvZiBYZXJjZXMgYnV0IGhhcyBzcGVjaWZpY2FsbHkgYmVlbiAKLSAgICAgICAgLy8gZXhwZXJpZW5jZWQgd2l0aCB0aGUgdmVyc2lvbiBpbmNsdWRlZCBpbiBJQk0ncyAxLjQuMiBKREsuCi0gICAgICAgIElucHV0U3RyZWFtIGlzVGVtcCA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgaXNUZW1wID0gbmV3IFVSTChwaHlzaWNhbCkub3BlblN0cmVhbSgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGlmKGlzVGVtcCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzVGVtcC5jbG9zZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpcy5zZXRCeXRlU3RyZWFtKG5ldyBMYXp5VVJMSW5wdXRTdHJlYW0ocGh5c2ljYWwpKTsgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGlzOyAgICAKLSAgfSAgICAgIAotICAKLSAgLyoqCi0gICAqIEFuIGVycm9yIGhhbmRsZXIgdG8gY2F0Y2ggZXJyb3JzIGVuY291bnRlcmVkIHdoaWxlIHBhcnNpbmcgdGhlIFhNTCBkb2N1bWVudC4KLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBYTUxFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIKLSAgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgRVJST1IgPSAwOwotICAgIHByaXZhdGUgZmluYWwgaW50IFdBUk5JTkcgPSAxOwotICAgIHByaXZhdGUgWE1MVmFsaWRhdGlvbkluZm8gdmFsaW5mbzsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsaW5mbyBUaGUgWE1MIHZhbGlkYXRpb24gaW5mbyBvYmplY3QgdGhhdCB3aWxsIGhvbGQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAgICovCi0gICAgcHVibGljIFhNTEVycm9ySGFuZGxlcihYTUxWYWxpZGF0aW9uSW5mbyB2YWxpbmZvKQotICAgIHsKLSAgICAgIHRoaXMudmFsaW5mbyA9IHZhbGluZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgdmFsaWRhdGlvbiBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIHNldmVyaXR5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBleGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UuCi0gICAgICovCi0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uLCBpbnQgc2V2ZXJpdHkpCi0gICAgewotICAgICAgaWYoZXhjZXB0aW9uLmdldFN5c3RlbUlkKCkgIT0gbnVsbCkKLSAgICAgIHsgICAgICAgCQotICAgIAlpbnQgbGluZU51bWJlciA9IGV4Y2VwdGlvbi5nZXRMaW5lTnVtYmVyKCk7Ci0gICAgCWludCBjb2x1bW5OdW1iZXIgPSBleGNlcHRpb24uZ2V0Q29sdW1uTnVtYmVyKCk7Ci0gICAgCQotICAgIAkvLyBGb3IgdGhlIGZvbGxvd2luZyB0aHJlZSBlcnJvcnMgdGhlIGxpbmUgbnVtYmVyIHdpbGwgYmUgbW9kaWZpZWQgdG8gdXNlIHRoYXQgb2YgdGhlIHN0YXJ0Ci0gICAgCS8vIHRhZyBpbnN0ZWFkIG9mIHRoZSBlbmQgdGFnLgotICAgIAlTdHJpbmcgY3VycmVudEVycm9yS2V5ID0gdmFsaW5mby5jdXJyZW50RXJyb3JLZXk7Ci0gICAgCWlmIChjdXJyZW50RXJyb3JLZXkgIT0gbnVsbCAmJiBhZGp1c3RMb2NhdGlvbkVycm9yS2V5U2V0LmNvbnRhaW5zKGN1cnJlbnRFcnJvcktleSkpICAKLSAgICAJewotICAgIAkgIExvY2F0aW9uQ29vcmRpbmF0ZSBhZGp1c3RlZENvb3JkaW5hdGVzID0gKExvY2F0aW9uQ29vcmRpbmF0ZSl2YWxpbmZvLmdldFN0YXJ0RWxlbWVudExvY2F0aW9ucygpLnBlZWsoKTsKLSAgICAJICBsaW5lTnVtYmVyID0gYWRqdXN0ZWRDb29yZGluYXRlcy5nZXRMaW5lTnVtYmVyKCk7Ci0gICAgCSAgY29sdW1uTnVtYmVyID0gYWRqdXN0ZWRDb29yZGluYXRlcy5nZXRDb2x1bW5OdW1uZXIoKTsKLSAgICAJfQotICAgIAkKLSAgICAgICAgaWYoc2V2ZXJpdHkgPT0gV0FSTklORykKLSAgICAgICAgewotICAgICAgICAgIHZhbGluZm8uYWRkV2FybmluZyhleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBsaW5lTnVtYmVyLCBjb2x1bW5OdW1iZXIsIGV4Y2VwdGlvbi5nZXRTeXN0ZW1JZCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxpbmZvLmFkZEVycm9yKGV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGxpbmVOdW1iZXIsIGNvbHVtbk51bWJlciwgZXhjZXB0aW9uLmdldFN5c3RlbUlkKCksIHZhbGluZm8uZ2V0Q3VycmVudEVycm9yS2V5KCksIHZhbGluZm8uZ2V0TWVzc2FnZUFyZ3VtZW50cygpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNlcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICBhZGRWYWxpZGF0aW9uTWVzc2FnZShleGNlcHRpb24sIEVSUk9SKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZmF0YWxFcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGFkZFZhbGlkYXRpb25NZXNzYWdlKGV4Y2VwdGlvbiwgRVJST1IpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciN3YXJuaW5nKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoZXhjZXB0aW9uLCBXQVJOSU5HKTsKLSAgICB9Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8qKiAKLSAgICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNvdW50IHRoZSBlbGVtZW50RGVjbHMgdGhhdCBhcmUgZW5jb3VudGVyZWQgaW4gYSBEVEQuCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgTXlEZWNsSGFuZGxlciBpbXBsZW1lbnRzIERlY2xIYW5kbGVyIAotICB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbGluZm8gVGhlIFhNTFZhbGlkYXRpb25JbmZvIG9iamVjdCB0aGF0IHdpbGwgY291bnQgdGhlIGRlY2xhcmF0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXlEZWNsSGFuZGxlcigpCi0gICAgewotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjYXR0cmlidXRlRGVjbChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZURlY2woU3RyaW5nIGVOYW1lLCBTdHJpbmcgYU5hbWUsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWVEZWZhdWx0LCBTdHJpbmcgdmFsdWUpIAotICAgIHsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjZWxlbWVudERlY2woamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbGVtZW50RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG1vZGVsKSAKLSAgICB7Ci0gICAgICAvL3ZhbGluZm8uaW5jcmVhc2VFbGVtZW50RGVjbGFyYXRpb25Db3VudCgpOwotICAgIH0KLSAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyI2V4dGVybmFsRW50aXR5RGVjbChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4dGVybmFsRW50aXR5RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIAotICAgIHsKLSAgICB9ICAgICAgCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjaW50ZXJuYWxFbnRpdHlEZWNsKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW50ZXJuYWxFbnRpdHlEZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIAotICAgIHsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQSBYSW5jbHVkZUF3YXJlUGFyc2VyQ29uZmlndXJhdGlvbiB0aGF0IGNyZWF0ZXMgYW4gZXJyb3IgcmVwb3J0ZXIgd2hpY2ggY2FuIGlnbm9yZQotICAgKiBEVEQgZXJyb3IgbWVzc2FnZXMgZm9yIERURCdzIHdpdGggbm8gZWxlbWVudHMgZGVmaW5lZC4KLSAgICovCi0KLSAgcHJvdGVjdGVkIGNsYXNzIE15U3RhbmRhcmRQYXJzZXJDb25maWd1cmF0aW9uIGV4dGVuZHMgWEluY2x1ZGVBd2FyZVBhcnNlckNvbmZpZ3VyYXRpb24KLSAgewotICAJWE1MVmFsaWRhdGlvbkluZm8gdmFsaW5mbyA9IG51bGw7Ci0gICAgTGlzdCByZXBvcnRlZEV4Y2VwdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7IAotICAJCi0gIAkvKioKLSAgCSAqIENvbnN0cnVjdG9yLgotICAJICogCi0gIAkgKiBAcGFyYW0gdmFsaW5mbyBUaGUgWE1MVmFsaWRhdGlvbkluZm8gb2JqZWN0IHRvIHVzZS4KLSAgCSAqLwotICAJcHVibGljIE15U3RhbmRhcmRQYXJzZXJDb25maWd1cmF0aW9uKFhNTFZhbGlkYXRpb25JbmZvIHZhbGluZm8pCi0gIAl7Ci0gIAkgIHRoaXMudmFsaW5mbyA9IHZhbGluZm87Ci0gIAkgIAotICAJICBYTUxFcnJvclJlcG9ydGVyIGVycm9yUmVwb3J0ZXIgPSBjcmVhdGVFcnJvclJlcG9ydGVyKCk7Ci0gICAgICBpZiAoZXJyb3JSZXBvcnRlci5nZXRNZXNzYWdlRm9ybWF0dGVyKFhNTE1lc3NhZ2VGb3JtYXR0ZXIuWE1MX0RPTUFJTikgPT0gbnVsbCkgewotICAgICAgICAgIFhNTE1lc3NhZ2VGb3JtYXR0ZXIgeG1mdCA9IG5ldyBYTUxNZXNzYWdlRm9ybWF0dGVyKCk7Ci0gICAgICAgICAgZXJyb3JSZXBvcnRlci5wdXRNZXNzYWdlRm9ybWF0dGVyKFhNTE1lc3NhZ2VGb3JtYXR0ZXIuWE1MX0RPTUFJTiwgeG1mdCk7Ci0gICAgICAgICAgZXJyb3JSZXBvcnRlci5wdXRNZXNzYWdlRm9ybWF0dGVyKFhNTE1lc3NhZ2VGb3JtYXR0ZXIuWE1MTlNfRE9NQUlOLCB4bWZ0KTsKLSAgICAgIH0gIAkgIAotICAgICAgZkVycm9yUmVwb3J0ZXIgPSBlcnJvclJlcG9ydGVyOwotCSAgc2V0UHJvcGVydHkoRVJST1JfUkVQT1JURVIsIGVycm9yUmVwb3J0ZXIpOwotCSAgZkNvbW1vbkNvbXBvbmVudHMucmVtb3ZlKGZFcnJvclJlcG9ydGVyKTsKLQkgIGZDb21tb25Db21wb25lbnRzLmFkZChmRXJyb3JSZXBvcnRlcik7Ci0gIAl9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLkRURENvbmZpZ3VyYXRpb24jY3JlYXRlRXJyb3JSZXBvcnRlcigpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhNTEVycm9yUmVwb3J0ZXIgY3JlYXRlRXJyb3JSZXBvcnRlcigpIAotICAgIHsKLSAgICAJcmV0dXJuIG5ldyBYTUxFcnJvclJlcG9ydGVyKCkKLQkJewotICAgIAkJLyogKG5vbi1KYXZhZG9jKQotICAgIAkJICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVycm9yUmVwb3J0ZXIjcmVwb3J0RXJyb3IoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdLCBzaG9ydCkKLSAgICAJCSAqLwotICAgIAkJcHVibGljIHZvaWQgcmVwb3J0RXJyb3IoU3RyaW5nIGRvbWFpbiwgU3RyaW5nIGtleSwgT2JqZWN0W10gYXJndW1lbnRzLCBzaG9ydCBzZXZlcml0eSkgdGhyb3dzIFhOSUV4Y2VwdGlvbiAKLSAgICAJICAgIHsgICAgICAgICAgICAgICAgICAgIAotCQkgICAgICBib29sZWFuIHJlcG9ydEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgdmFsaW5mby5zZXRDdXJyZW50RXJyb3JLZXkoa2V5KTsgIAotCQkJICB2YWxpbmZvLnNldE1lc3NhZ2VBcmd1bWVudHMoYXJndW1lbnRzKTsKLQkJICAgICAgU3RyaW5nIGlnbm9yZUNvbmRpdGlvbiA9IChTdHJpbmcpaW5nb3JlZEVycm9yS2V5VGFibGUuZ2V0KGtleSk7Ci0JCSAgICAgIGlmIChpZ25vcmVDb25kaXRpb24gIT0gbnVsbCkKLQkJICAgICAgewotCQkgICAgICAgIGlmIChpZ25vcmVDb25kaXRpb24uZXF1YWxzKFhNTFZhbGlkYXRvci5JR05PUkVfSUZfRFREX1dJVEhPVVRfRUxFTUVOVF9ERUNMKSkKLQkJICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAKLQkJICAgICAgICAgIGJvb2xlYW4gaXNEVERXaXRob3V0RWxlbWVudERlY2xhcmF0aW9uRW5jb3VudGVyZWQgPSB2YWxpbmZvLmlzRFREV2l0aG91dEVsZW1lbnREZWNsYXJhdGlvbkVuY291bnRlcmVkKCk7IAotCQkgICAgICAgICAgcmVwb3J0RXJyb3IgPSAhaXNEVERXaXRob3V0RWxlbWVudERlY2xhcmF0aW9uRW5jb3VudGVyZWQ7ICAKLQkJICAgICAgICB9Ci0JCSAgICAgICAgZWxzZSAKLQkJICAgICAgICB7Ci0JCSAgICAgICAgICByZXBvcnRFcnJvciA9IGZhbHNlOwotCQkgICAgICAgIH0KLQkJICAgICAgfQotCQkgICAgICBpZiAoInNjaGVtYV9yZWZlcmVuY2UuNCIuZXF1YWxzKGtleSkgJiYgYXJndW1lbnRzLmxlbmd0aCA+IDApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9iamVjdCBsb2NhdGlvbiA9IGFyZ3VtZW50c1swXTsgIAotICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICAgICAgaWYocmVwb3J0ZWRFeGNlcHRpb25zLmNvbnRhaW5zKGxvY2F0aW9uKSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0RXJyb3IgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWRFeGNlcHRpb25zLmFkZChsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9ICAgICAgICAgIAotCQkgICAgICBpZiAocmVwb3J0RXJyb3IpCi0JCSAgICAgIHsKLQkJICAgICAgICBzdXBlci5yZXBvcnRFcnJvcihkb21haW4sIGtleSwgYXJndW1lbnRzLCBzZXZlcml0eSk7Ci0JCSAgICAgICAgdmFsaW5mby5nZXRFcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyKCkuY29uc2lkZXJSZXBvcnRlZEVycm9yKHZhbGluZm8sIGtleSwgYXJndW1lbnRzKTsKLQkJICAgICAgfQotCQkgICAgfQotCQl9OwotICAgIH0KLSAgfQotICAKLSAgLyoqIAotICAgKiBBIGxpbmUgYW5kIGNvbHVtbiBudW1iZXIgY29vcmRpbmF0ZS4KLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBMb2NhdGlvbkNvb3JkaW5hdGUKLSAgewkKLQlwcml2YXRlIGludCBsaW5lTm8gPSAtMTsKLSAgICBwcml2YXRlIGludCBjb2x1bW5ObyA9IC0xOwotICAgIAotICAgIHB1YmxpYyBMb2NhdGlvbkNvb3JkaW5hdGUoaW50IGxpbmVOdW1iZXIsIGludCBjb2x1bW5OdW1iZXIpCi0gICAgewotICAgICAgdGhpcy5saW5lTm8gPSBsaW5lTnVtYmVyOwotICAgICAgdGhpcy5jb2x1bW5ObyA9IGNvbHVtbk51bWJlcjsKLSAgICB9Ci0gICAgCQotICAgIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpCi0gICAgeyAKLSAgICAgIHJldHVybiB0aGlzLmxpbmVObzsKLSAgICB9Ci0gICAgCQotICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uTnVtbmVyKCkKLSAgICB7IAotICAgICAgcmV0dXJuIHRoaXMuY29sdW1uTm87Ci0gICAgfSAKLSAgfQotICAKLSAgcHJvdGVjdGVkIElSZXNvdXJjZSBnZXRXb3Jrc3BhY2VGaWxlRnJvbUxvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikKLSAgewotICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKSByZXR1cm4gbnVsbDsKLSAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAvLyBUbyBjYW5vbmljYWxpemUgdGhlIEVNRiBVUkkKLSAgICBJUGF0aCBjYW5vbmljYWxGb3JtID0gbmV3IFBhdGgobG9jYXRpb24pOwotICAgIC8vIE5lZWQgdG8gY29udmVydCB0byBhYnNvbHV0ZSBsb2NhdGlvbi4uLgotICAgIElQYXRoIHBhdGhMb2NhdGlvbiA9IG5ldyBQYXRoKFVSSUhlbHBlci5yZW1vdmVQcm90b2NvbChjYW5vbmljYWxGb3JtLnRvU3RyaW5nKCkpKTsKLSAgICAvLyAuLi50byBmaW5kIHRoZSByZXNvdXJjZSBmaWxlIHRoYXQgaXMgaW4gdGhlIHdvcmtzcGFjZQotICAgIElSZXNvdXJjZSByZXNvdXJjZUZpbGUgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihwYXRoTG9jYXRpb24pOwotICAgIC8vIElmIHRoZSByZXNvdXJjZSBpcyByZXNvbHZlZCB0byBhIGZpbGUgZnJvbSBodHRwLCBvciBhIGZpbGUgb3V0c2lkZQotICAgIC8vIHRoZSB3b3Jrc3BhY2UsIHRoZW4gd2Ugd2lsbCBqdXN0IGlnbm9yZSBpdC4KLSAgICByZXR1cm4gcmVzb3VyY2VGaWxlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL0Fic3RyYWN0TmVzdGVkVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL0Fic3RyYWN0TmVzdGVkVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNDg1NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9BYnN0cmFjdE5lc3RlZFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCB2YWxpZGF0b3IgdGhhdCBhc3Npc3RzIHZhbGlkYXRvcnMgaW4gcnVubmluZyBhbmQgY29udHJpYnV0aW5nCi0gKiBuZXN0ZWQgbWVzc2FnZXMgaW4gdGhlIHZhbGlkYXRpb24gcmVzdWx0cy4gCi0gKiAqbm90ZTogU3ViY2xhc3NlcyBkbyBub3QgbmVlZCB0byBjb250cmlidXRlIG5lc3RlZCBtZXNzYWdlcyBpbiBvcmRlciB0bwotICogYmVuZWZpdCBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBjbGFzcy4gVGhpcyBjbGFzcyB0YWtlcyBjYXJlIG9mIGl0ZXJhdGluZwotICogdGhyb3VnaCByZXN1bHRzIGZvciB2YWxpZGF0b3JzIHRoYXQgdXNlIHRoZSBzdGFuZGFyZCBjb250ZXh0LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdFZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3JKb2IgCi17Ci0gIC8vIExvY2FsbHkgdXNlZCwgbm9uLVVJIHN0cmluZ3MuCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VEX0ZJTEVfRVJST1JfT1BFTiA9ICJyZWZlcmVuY2VkRmlsZUVycm9yKCI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfRklMRV9FUlJPUl9DTE9TRSA9ICIpIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTF9OT19TTEFTSCA9ICJmaWxlOiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wgPSAiZmlsZTovLy8iOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEdFVF9GSUxFID0gImdldEZpbGUiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEdFVF9QUk9KRUNUX0ZJTEVTID0gImdldEFsbEZpbGVzIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBHRVRfSU5QVVRTVFJFQU0gPSAiaW5wdXRTdHJlYW0iOyAvLyROT04tTkxTLTEkCi0gIAotICAvLyBJbnRlcm5hbCBzdHJpbmdzLiBUaGVzZSBzdHJpbmdzIGFyZSBjb21tb24gYWRkaXRpb24gaW5mb3JtYXRpb24gdHlwZXMuCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OVU1CRVJfQVRUUklCVVRFID0gImNvbHVtbk51bWJlciI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1FVSUdHTEVfU0VMRUNUSU9OX1NUUkFURUdZX0FUVFJJQlVURSA9ICJzcXVpZ2dsZVNlbGVjdGlvblN0cmF0ZWd5IjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTUVVJR0dMRV9OQU1FX09SX1ZBTFVFX0FUVFJJQlVURSA9ICJzcXVpZ2dsZU5hbWVPclZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0gIC8qKgotICAgKiBQZXJmb3JtIHRoZSB2YWxpZGF0aW9uIHVzaW5nIHZlcnNpb24gMiBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JICBWYWxpZGF0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uUmVzdWx0KCk7ICAKLQkgIElSZXBvcnRlciByZXBvcnRlciA9IHJlc3VsdC5nZXRSZXBvcnRlcihtb25pdG9yKTsKLQkgIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgbmVzdGVkY29udGV4dCA9IG5ldyBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0KCk7Ci0JCXNldHVwVmFsaWRhdGlvbihuZXN0ZWRjb250ZXh0KTsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKWZpbGUgPSAoSUZpbGUpcmVzb3VyY2U7Ci0JCWlmIChmaWxlICE9IG51bGwpdmFsaWRhdGUoZmlsZSwgbnVsbCwgcmVzdWx0LCByZXBvcnRlciwgbmVzdGVkY29udGV4dCk7Ci0JCXRlYXJkb3duVmFsaWRhdGlvbihuZXN0ZWRjb250ZXh0KTsKLQkgICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotIAotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2IjdmFsaWRhdGVJbkpvYihvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIpCi0gICAqLwotICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKElWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0LCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIAotICB7Ci0JTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBuZXN0ZWRjb250ZXh0ID0gbmV3IE5lc3RlZFZhbGlkYXRvckNvbnRleHQoKTsKLQlzZXR1cFZhbGlkYXRpb24obmVzdGVkY29udGV4dCk7Ci0JU3RyaW5nW10gZmlsZVVSSXMgPSBjb250ZXh0LmdldFVSSXMoKTsKLQlpZiAoZmlsZVVSSXMgIT0gbnVsbCAmJiBmaWxlVVJJcy5sZW5ndGggPiAwKSAKLQl7Ci0JICBpbnQgbnVtRmlsZXMgPSBmaWxlVVJJcy5sZW5ndGg7Ci0JICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZpbGVzICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpOyBpKyspIAotCSAgewotCSAgICBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlVVJJc1tpXTsKLQkgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpCi0JICAgIHsgICAgICAgICAgCi0JICAgICAgT2JqZWN0IFtdcGFybXMgPSB7ZmlsZU5hbWV9OwotCi0JICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgY29udGV4dC5sb2FkTW9kZWwoR0VUX0ZJTEUsIHBhcm1zKTsKLQkgICAgICBpZiAoZmlsZSAhPSBudWxsICYmIHNob3VsZFZhbGlkYXRlKGZpbGUpKSAKLQkgICAgICB7IAotCSAgICAJLy8gVGhlIGhlbHBlciBtYXkgbm90IGhhdmUgYSBmaWxlIHN0b3JlZCBpbiBpdCBidXQgbWF5IGhhdmUgYW4gSW5wdXRTdHJlYW0gaWYgYmVpbmcKLQkgICAgCS8vIGNhbGxlZCBmcm9tIGEgc291cmNlIG90aGVyIHRoYW4gdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIHN1Y2ggYXMgYW4gZWRpdG9yLgotCSAgICAgICAgaWYgKGNvbnRleHQubG9hZE1vZGVsKEdFVF9JTlBVVFNUUkVBTSkgaW5zdGFuY2VvZiBJbnB1dFN0cmVhbSkgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgewotCSAgICAgICAgICB2YWxpZGF0ZShmaWxlLCAoSW5wdXRTdHJlYW0pY29udGV4dC5sb2FkTW9kZWwoR0VUX0lOUFVUU1RSRUFNKSwgbnVsbCwgcmVwb3J0ZXIsIG5lc3RlZGNvbnRleHQpOyAvL2RvIHdlIG5lZWQgdGhlIGZpbGVOYW1lPyAgd2hhdCBpcyBpbnQgcnVsZUdyb3VwPyAvLyROT04tTkxTLTEkCi0JICAgICAgICB9Ci0JICAgICAgICBlbHNlCi0JICAgICAgICB7Ci0JICAgIAkgIHZhbGlkYXRlKGZpbGUsIG51bGwsIG51bGwsIHJlcG9ydGVyLCBuZXN0ZWRjb250ZXh0KTsKLQkgICAgICAgIH0KLQkgICAgICB9Ci0JICAgIH0KLQkgIH0KLQl9Ci0JLy8gVE9ETzogSXMgdGhpcyBuZWVkZWQ/IFNob3VsZG4ndCB0aGUgZnJhbWV3b3JrIHBhc3MgdGhlIGNvbXBsZXRlIGxpc3Q/IAotCS8vIFNob3VsZCBJIGtub3cgdGhhdCBJJ20gdmFsaWRhdGluZyBhIHByb2plY3QgYXMgb3Bwb3NlZCB0byBmaWxlcz8KLQllbHNlIAotICAgIHsKLSAgICAgIE9iamVjdCBbXXBhcm1zID0ge2dldFZhbGlkYXRvcklEKCl9OwotICAgICAgQ29sbGVjdGlvbiBmaWxlcyA9IChDb2xsZWN0aW9uKSBjb250ZXh0LmxvYWRNb2RlbChHRVRfUFJPSkVDVF9GSUxFUywgcGFybXMpOwotICAgICAgSXRlcmF0b3IgaXRlciA9IGZpbGVzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIAotICAgICAgewotICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKSBpdGVyLm5leHQoKTsKLSAgICAgICAgaWYoc2hvdWxkVmFsaWRhdGUoZmlsZSkpCi0gICAgICAgIHsKLQkgICAgICB2YWxpZGF0ZShmaWxlLCBudWxsLCBudWxsLCByZXBvcnRlciwgbmVzdGVkY29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0JCi0JdGVhcmRvd25WYWxpZGF0aW9uKG5lc3RlZGNvbnRleHQpOwotCWlmKHJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpCi0JICByZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0gICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQcm92aWRlcyB0aGUgaWQgb2YgdGhpcyB2YWxpZGF0b3IuIFRoZSBJRCBpcyB1c2VkIGJ5IHRoZSB2YWxpZGF0aW9uCi0gICAqIGZyYW1ld29yay4gSXQgdXN1YWxseSBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNsYXNzCi0gICAqIGltcGxlbWVudGluZyB0aGUgSVZhbGlkYXRvciBpbnRlcmZhY2UuCi0gICAqIAotICAgKiBAcmV0dXJuIGEgU3RyaW5nIHdpdGggdGhlIElEIG9mIHRoaXMgdmFsaWRhdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0b3JJRCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFBlcmZvcm0gc2V0IHVwIGJlZm9yZSB2YWxpZGF0aW9uIHJ1bnMuIFN1YmNsYXNzZXMgbWF5IGltcGxlbWVudCB0aGlzCi0gICAqIG1ldGhvZCB0byBwZXJmb3JtIHZhbGlkYXRpb24gc3BlY2lmaWMgc2V0IHVwLgotICAgKiAKLSAgICogQHBhcmFtIGNvbnRleHQKLSAgICogCQlUaGUgY29udGV4dCBvZiB0aGUgY3VycmVudCB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0dXBWYWxpZGF0aW9uKE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkKLSAgewotCS8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgotICB9Ci0gIAotICAvKioKLSAgICogUGVyZm9ybSB0ZWFyIGRvd24gYWZ0ZXIgdmFsaWRhdGlvbiBydW5zLiBTdWJjbGFzc2VzIG1heSBpbXBsZW1lbnQgdGhpcwotICAgKiBtZXRob2QgdG8gcGVyZm9ybSB2YWxpZGF0aW9uIHNwZWNpZmljIHRlYXIgZG93bi4KLSAgICogCi0gICAqIEBwYXJhbSBjb250ZXh0Ci0gICAqIAkJVGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgdmFsaWRhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHRlYXJkb3duVmFsaWRhdGlvbihOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpCi0gIHsKLQkvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYiNnZXRTY2hlZHVsaW5nUnVsZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoSVZhbGlkYXRpb25Db250ZXh0IGFyZzApIAotICB7Ci0JLy8gVE9ETyByZXZpZXcgd2hldGhlciByZXR1cm5pbmcgYSBudWxsIHJ1bGUgaXMgY29ycmVjdC4gR2FyeSBoYWQgYSBzdWdnZXN0aW9uIGluIHRoZSBidWcgcmVwb3J0LgotCXJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciNjbGVhbnVwKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyKQotICAgKi8KLSAgcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgYXJnMCkgCi0gIHsKLSAgICAvLyBObyBjbGVhbnVwIHRvIHBlcmZvcm0uIFN1YmNsYXNzZXMgYXJlIGZyZWUgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvciN2YWxpZGF0ZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dCwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiAKLSAgeyAgCi0JdmFsaWRhdGVJbkpvYihjb250ZXh0LCByZXBvcnRlcik7Ci0gIH0KLQkKLQkKLSAgLyoqCi0gICAqIERldGVybWluZSBpZiBhIGdpdmVuIGZpbGUgc2hvdWxkIGJlIHZhbGlkYXRlZC4gCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0aGF0IG1heSBiZSB2YWxpZGF0ZWQuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZmlsZSBzaG91bGQgYmUgdmFsaWRhdGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNob3VsZFZhbGlkYXRlKElGaWxlIGZpbGUpIAotICB7Ci0JSVJlc291cmNlIHJlc291cmNlID0gZmlsZTsKLQlkbyAKLQl7Ci0JICBpZiAocmVzb3VyY2UuaXNEZXJpdmVkKCkgfHwgcmVzb3VyY2UuaXNUZWFtUHJpdmF0ZU1lbWJlcigpIHx8IAotCQkgICFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSB8fCByZXNvdXJjZS5nZXROYW1lKCkuY2hhckF0KDApID09ICcuJykgCi0JICB7Ci0JCXJldHVybiBmYWxzZTsKLQkgIH0KLQkgIHJlc291cmNlID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7Ci0JfXdoaWxlICgocmVzb3VyY2UuZ2V0VHlwZSgpICYgSVJlc291cmNlLlBST0pFQ1QpID09IDApOwotCQotCXJldHVybiB0cnVlOwotICB9Ci0gIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGdpdmVuIGZpbGUgYW5kIHVzZSB0aGUgcmVwb3J0ZXIgZm9yIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBwZXJmb3JtIHRoZSB2YWxpZGF0aW9uIGxvZ2ljIGJ1dCByYXRoZXIgZGVsZWdhdGVzCi0gICAqIHRvIHRoZSB2YWxpZGF0ZSBtZXRob2QgaW4gc3ViY2xhc3NlcyB0byB2YWxpZGF0ZS4gVGhpcyBtZXRob2QgaXMgcmVzcG9uc2libGUKLSAgICogZm9yIHJlcG9ydGluZyB0aGUgbWVzc2FnZXMgdGhhdCByZXN1bHQgZnJvbSB2YWxpZGF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGZpbGUgCi0gICAqIAkJQW4gSUZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBpbnB1dHN0cmVhbSAKLSAgICogCQlBbiBJbnB1dFN0cmVhbSB0aGF0IHJlcHJlc2VudHMgdGhlIGZpbGUuIFRoZSBJbnB1dFN0cmVhbSBtYXkgYmUgbnVsbAotICAgKiAJCWluIHdoaWNoIGNhc2UgdGhlIGZpbGVzIHNob3VsZCBiZSB2YWxpZGF0ZWQgZnJvbSB0aGUgSUZpbGUuCi0gICAqIEBwYXJhbSByZXN1bHQgLSBUaGUgdmFsaWRhdGlvbiByZXN1bHQKLSAgICogQHBhcmFtIHJlcG9ydGVyIAotICAgKiAJCVRoZSByZXBvcnRlciB3aXRoIHdoaWNoIHRvIHJlcG9ydCB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKiBAcGFyYW0gY29udGV4dAotICAgKiAJCVRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHZhbGlkYXRpb24uCi0gICAqLwotICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoSUZpbGUgZmlsZSwgSW5wdXRTdHJlYW0gaW5wdXRzdHJlYW0sIFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0LCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkKLSAgeyAgCi0JTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0gICAgcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sodGhpcywgbWVzc2FnZSk7Ci0gICAgCi0JU3RyaW5nIGxvY2F0aW9uU3RyaW5nID0gbnVsbDsJCQotCWlmIChmaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQlsb2NhdGlvblN0cmluZyA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCX0KLQlpZiAobG9jYXRpb25TdHJpbmcgPT0gbnVsbCAmJiBmaWxlLmdldExvY2F0aW9uVVJJKCkgIT0gbnVsbCkgewotCQlsb2NhdGlvblN0cmluZyA9IGZpbGUuZ2V0TG9jYXRpb25VUkkoKS50b1N0cmluZygpOwotCX0KLQlpZiAobG9jYXRpb25TdHJpbmcgPT0gbnVsbCkgewotCQlsb2NhdGlvblN0cmluZyA9IGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCX0KLQlTdHJpbmcgdXJpID0gY3JlYXRlVVJJRm9yRmlsZVBhdGgobG9jYXRpb25TdHJpbmcpOwotCi0JY2xlYXJNYXJrZXJzKGZpbGUsIHRoaXMsIHJlcG9ydGVyKTsKLQkKLQlWYWxpZGF0aW9uUmVwb3J0IHZhbHJlcG9ydCA9IG51bGw7Ci0JaWYgKHJlc3VsdCA9PSBudWxsKQotCSAgdmFscmVwb3J0ID0gdmFsaWRhdGUodXJpLCBpbnB1dHN0cmVhbSwgY29udGV4dCk7Ci0JZWxzZQotCSAgdmFscmVwb3J0ID0gdmFsaWRhdGUodXJpLCBpbnB1dHN0cmVhbSwgY29udGV4dCwgcmVzdWx0KTsKLQkKLQljcmVhdGVNYXJrZXJzKGZpbGUsIHZhbHJlcG9ydC5nZXRWYWxpZGF0aW9uTWVzc2FnZXMoKSwgcmVwb3J0ZXIpOwotCSAgICAgICAgCi0JdHJ5Ci0JewotCSAgZmlsZS5zZXRTZXNzaW9uUHJvcGVydHkoVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1JfTUVTU0FHRV9NQVBfUVVBTElGSUVEX05BTUUsIHZhbHJlcG9ydC5nZXROZXN0ZWRNZXNzYWdlcygpKTsKLQl9Ci0JY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKQotCXsKLQkgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIHNldCBuZXN0ZWQgbWVzc2FnZXMgcHJvcGVydHkuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0gIH0KLQkKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBnaXZlbiBmaWxlIGFuZCB1c2UgdGhlIHJlcG9ydGVyIGZvciB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICogQ2xpZW50cyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB3aXRoIHRoZWlyIHNwZWNpZmljIHZhbGlkYXRpb24gbG9naWMuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpCi0gICAqIAkJVGhlIFVSSSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIGlucHV0c3RyZWFtIAotICAgKiAJCUFuIElucHV0U3RyZWFtIHRoYXQgcmVwcmVzZW50cyB0aGUgZmlsZS4gVGhlIElucHV0U3RyZWFtIG1heSBiZSBudWxsCi0gICAqIAkJaW4gd2hpY2ggY2FzZSB0aGUgZmlsZXMgc2hvdWxkIGJlIHZhbGlkYXRlZCBmcm9tIHRoZSBJRmlsZS4KLSAgICogQHBhcmFtIGNvbnRleHQKLSAgICogCQlUaGUgY29udGV4dCBvZiB0aGUgY3VycmVudCB2YWxpZGF0aW9uLgotICAgKiBAcmV0dXJuCi0gICAqIAkJQSB2YWxpZGF0aW9uIHJlcG9ydCBzdW1tYXJpemluZyB0aGUgdmFsaWRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0c3RyZWFtLCBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpOwotICAKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBnaXZlbiBmaWxlIGFuZCB1c2UgdGhlIHJlcG9ydGVyIGZvciB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICogQ2xpZW50cyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgd2l0aCB0aGVpciBzcGVjaWZpYyB2YWxpZGF0aW9uIGxvZ2ljLgotICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm93IGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgYWJzdHJhY3QgdmVyc2lvbi4KLSAgICogRGVzaWduIGRlY2lzaW9uIHRvIG5vdCBtYWtlIHRoaXMgYWJzdHJhY3QuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpCi0gICAqIEBwYXJhbSBpbnB1dHN0cmVhbQotICAgKiBAcGFyYW0gY29udGV4dAotICAgKiBAcGFyYW0gcmVzdWx0Ci0gICAqIEByZXR1cm4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0c3RyZWFtLCBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQsIFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0KQotICB7Ci0gICAgcmV0dXJuIHZhbGlkYXRlKHVyaSwgaW5wdXRzdHJlYW0sIGNvbnRleHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGNsZWFycyBhbGwgdGhlIG1hcmtlcnMgb24gdGhlIGdpdmVuIElGaWxlIGZvciBhIHNwZWNpZmllZAotICAgKiB2YWxpZGF0b3IuCi0gICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHN1YmNsYXNzZXMuCi0gICAqIAotICAgKiBAcGFyYW0gaUZpbGUKLSAgICogCQlUaGUgSUZpbGUgZnJvbSB3aGljaCB0byBjbGVhciB0aGUgbWFya2Vycy4KLSAgICogQHBhcmFtIHZhbGlkYXRvcgotICAgKiAJCVRoZSB2YWxpZGF0b3IgZm9yIHdoaWNoIHRvIHJlbW92ZSB0aGUgbWFya2Vycy4KLSAgICogQHBhcmFtIHJlcG9ydGVyCi0gICAqIAkJVGhlIHJlcG9ydGVyIHRoYXQgY2FuIHJlbW92ZSB0aGUgbWFya2Vycy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBjbGVhck1hcmtlcnMoSUZpbGUgaUZpbGUsIElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpCi0gIHsKLQlpZiAoZmlsZUlzQWNjZXNzaWJsZShpRmlsZSkpCi0JewotCSAgcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModmFsaWRhdG9yLCBpRmlsZSk7Ci0JfQotICB9Ci0JICAKLSAgLyoqCi0gICAqIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gZmlsZSBpcyBhY2Nlc3NpYmxlIGFuZCBtYXkgYmUgdXNlZCBmb3IgdmFsaWRhdGlvbi4gQSBmaWxlIGlzIAotICAgKiBhdmFpbGFibGUgaWYgCi0gICAqIDEuIEl0IGlzIG5vdCBudWxsLgotICAgKiAyLiBJdCBleGlzdHMuIAotICAgKiAzLiBUaGUgcHJvamVjdCBjb250YWluaW5nIHRoZSBmaWxlIGlzIGFjY2Vzc2libGUuCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZSAKLSAgICogCQlUaGUgZmlsZSB0byBjaGVjayB0byBlbnN1cmUgaXQgaXMgYWNjZXNzaWJsZS4KLSAgICogQHJldHVybiAKLSAgICogCQlUcnVlIGlmIHRoZSBmaWxlIGlzIGFjY2Vzc2libGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBmaWxlSXNBY2Nlc3NpYmxlKElGaWxlIGZpbGUpCi0gIHsKLSAgICBpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpCi0JewotCSAgcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLSAgfQotCSAgCi0gIC8qKgotICAgKiBGb3JtYXQgYSBmaWxlIG5hbWUgaW50byBhIGNvcnJlY3QgVVJJLiAKLSAgICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCBmb3Igc3ViY2xhc3Nlcy4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlbmFtZSAKLSAgICogCQlUaGUgZmlsZSBuYW1lIHRvIGZvcm1hdC4KLSAgICogQHJldHVybiAKLSAgICogCQkKLSAgICogVGhlIGZvcm1hdHRlZCBVUkkuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBjcmVhdGVVUklGb3JGaWxlUGF0aChTdHJpbmcgZmlsZW5hbWUpCi0gIHsKLQlpZighZmlsZW5hbWUuc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MX05PX1NMQVNIKSkKLQl7Ci0JICB3aGlsZShmaWxlbmFtZS5zdGFydHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkgIHsKLQkgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMSk7Ci0JICB9Ci0JICBmaWxlbmFtZSA9IEZJTEVfUFJPVE9DT0wgKyBmaWxlbmFtZTsKLQl9Ci0JcmV0dXJuIGZpbGVuYW1lOwotICB9Ci0JICAKLSAgLyoqCi0gICAqIENyZWF0ZSBtYXJrZXJzIGZvciB0aGUgdmFsaWF0aW9uIG1lc3NhZ2VzIGdlbmVyYXRlZCBmcm9tIHRoZSB2YWxpZGF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGlGaWxlCi0gICAqICAgICAgICAgIFRoZSByZXNvdXJjZSB0byBjcmVhdGUgdGhlIG1hcmtlcnMgb24uCi0gICAqIEBwYXJhbSB2YWxtZXNzYWdlcwotICAgKiAgICAgICAgICBUaGUgYXJyYXkgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZU1hcmtlcnMoSUZpbGUgaUZpbGUsIFZhbGlkYXRpb25NZXNzYWdlW10gdmFsbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikKLSAgewotICAgIGlmICghZmlsZUlzQWNjZXNzaWJsZShpRmlsZSkpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgbnVtbWVzc2FnZXMgPSB2YWxtZXNzYWdlcy5sZW5ndGg7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1tZXNzYWdlczsgaSsrKQotICAgIHsKLSAgICAgIFZhbGlkYXRpb25NZXNzYWdlIHZhbGlkYXRpb25NZXNzYWdlID0gdmFsbWVzc2FnZXNbaV07Ci0gICAgICBTdHJpbmcgdXJpID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0VXJpKCk7Ci0KLSAgICAgIExvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZTsKLSAgICAgIGlmICh2YWxpZGF0aW9uTWVzc2FnZS5nZXRTZXZlcml0eSgpID09IFZhbGlkYXRpb25NZXNzYWdlLlNFVl9MT1cpCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIAotICAgICAgICAJCXZhbGlkYXRpb25NZXNzYWdlLmdldE1lc3NhZ2UoKSwgaUZpbGUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAKLSAgICAgICAgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIHZhbGlkYXRpb25NZXNzYWdlLmdldE1lc3NhZ2UoKSwgaUZpbGUpOwotICAgICAgfQotICAgICAgCi0gICAgICBtZXNzYWdlLnNldExpbmVObyh2YWxpZGF0aW9uTWVzc2FnZS5nZXRMaW5lTnVtYmVyKCkpOwotICAgICAgYWRkSW5mb1RvTWVzc2FnZSh2YWxpZGF0aW9uTWVzc2FnZSwgbWVzc2FnZSk7Ci0gICAgICAKLSAgICAgIExpc3QgbmVzdGVkZXJyb3JzID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0TmVzdGVkTWVzc2FnZXMoKTsKLSAgICAgIGlmIChuZXN0ZWRlcnJvcnMgIT0gbnVsbCAmJiAhbmVzdGVkZXJyb3JzLmlzRW1wdHkoKSkKLSAgICAgIHsKLSAgICAgICAgbWVzc2FnZS5zZXRHcm91cE5hbWUoUkVGRVJFTkNFRF9GSUxFX0VSUk9SX09QRU4gKyB1cmkgKyBSRUZFUkVOQ0VEX0ZJTEVfRVJST1JfQ0xPU0UpOwotICAgICAgfQotCi0gICAgICByZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCSAgICAgIAotICAgIH0KLSAgfQotCSAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgdGhlIGFkZGl0aW9uIG9mIGluZm9ybWF0aW9uIHRvIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UKLSAgICogQHBhcmFtIHZhbGlkYXRpb25tZXNzYWdlCi0gICAqIAkJVGhlIFZhbGlkYXRpb25NZXNzYWdlIHRvIHJldHJpZXZlIHRoZSBpbmZvcm1hdGlvbiBmcm9tLgotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiAJCVRoZSBJTWVzc2FnZSB0byBhZGQgdGhlIGluZm9ybWF0aW9uIHRvLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYWRkSW5mb1RvTWVzc2FnZSAoVmFsaWRhdGlvbk1lc3NhZ2UgdmFsaWRhdGlvbm1lc3NhZ2UsIElNZXNzYWdlIG1lc3NhZ2UpCi0gIHsgCi0JLy8gVGhpcyBtZXRob2QgbWF5IGJlIG92ZXJpZGRlbiBieSBzdWJjbGFzc2VzCi0gIH0KLQkgIAotICAvKioKLSAgICogQSBsb2NhbGl6ZWQgbWVzc2FnZSBpcyBhIHNwZWNpYWxpemVkIHR5cGUgb2YgSU1lc3NhZ2UgdGhhdCBhbGxvd3Mgc2V0dGluZwotICAgKiBhbmQgdXNpbmcgYSBsb2NhbGl6ZWQgbWVzc2FnZSBzdHJpbmcgZm9yIGEgbWVzc2FnZS4KLSAgICovCi0gIGNsYXNzIExvY2FsaXplZE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIAotICB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgX21lc3NhZ2UgPSBudWxsOwotCi0JcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQpIAotCXsKLQkgIHRoaXMoc2V2ZXJpdHksIG1lc3NhZ2VUZXh0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCwgSVJlc291cmNlIHRhcmdldE9iamVjdCkgCi0JewotCSAgdGhpcyhzZXZlcml0eSwgbWVzc2FnZVRleHQsIChPYmplY3QpIHRhcmdldE9iamVjdCk7Ci0JfQotCi0JcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQsIE9iamVjdCB0YXJnZXRPYmplY3QpIAotCXsKLQkgIHN1cGVyKG51bGwsIHNldmVyaXR5LCBudWxsKTsKLQkgIHNldExvY2FsaXplZE1lc3NhZ2UobWVzc2FnZVRleHQpOwotCSAgc2V0VGFyZ2V0T2JqZWN0KHRhcmdldE9iamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9jYWxpemVkTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgCi0JewotCSAgX21lc3NhZ2UgPSBtZXNzYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxpemVkTWVzc2FnZSgpIAotCXsKLQkgIHJldHVybiBfbWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSAKLQl7Ci0JICByZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChDbGFzc0xvYWRlciBjbCkgCi0JewotCSAgcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoTG9jYWxlIGwpIAotCXsKLQkgIHJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KExvY2FsZSBsLCBDbGFzc0xvYWRlciBjbCkgCi0JewotCSAgcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTQ5N2FmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVmFsaWRhdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciB2YWxpZGF0aW9uIGluIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqIAotICogQGF1dGhvciBFcm5lc3QgTWFoIChlcm5lc3RAY2EuaWJtLmNvbSkKLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotcHVibGljIGNsYXNzIEhlbHBlciBleHRlbmRzIFdvcmtiZW5jaENvbnRleHQKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX1BST0pFQ1RfRklMRVMgPSAiZ2V0QWxsRmlsZXMiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVF9GSUxFID0gImdldEZpbGUiOyAvLyROT04tTkxTLTEkCi0gIC8vZHcgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUNvbnRhaW5lcltdIE5PX0NPTlRBSU5FUlMgPSBuZXcgSUNvbnRhaW5lclswXTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NQVJLRVIgPSAib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24ucHJvYmxlbW1hcmtlciI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfT1dORVIgPSAib3duZXIiOyAgIC8vJE5PTi1OTFMtMSQKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgSGVscGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0KLSAgICAvLyB0aGUgZm9sbG93aW5nIHdpbGwgcmVnaXN0ZXIgdGhlIGhlbHBlcidzIHN5bWJvbGljIG1ldGhvZHMKLSAgICBDbGFzcyBbXSBhcmdzID0gbmV3IENsYXNzWzFdIDsKLSAgICBhcmdzWzBdID0gU3RyaW5nLmNsYXNzIDsgIC8vIGEgc3RyaW5nIGFyZ3VtZW50IGRlbm90aW5nIGEgc3BlY2lmaWMgSlNQLgotICAgIAotICAgIHJlZ2lzdGVyTW9kZWwoR0VUX0ZJTEUsICJnZXRGaWxlIiwgYXJncyk7Ly8kTk9OLU5MUy0xJAotICAgIHJlZ2lzdGVyTW9kZWwoR0VUX1BST0pFQ1RfRklMRVMsICJnZXRGaWxlcyIsIGFyZ3MpOy8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIElGaWxlIGZvciB0aGUgZ2l2ZW4gZmlsZW5hbWUuCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gcmV0cmlldmUuCi0gICAqIEByZXR1cm4gQW4gSUZpbGUgcmVwcmVzZW50aW5nIHRoZSBmaWxlIHNwZWNpZmllZCBvciBudWxsIGlmIGl0IGNhbid0IGJlIHJlc29sdmVkLgotICAgKi8KLSAgcHVibGljIElGaWxlIGdldEZpbGUoU3RyaW5nIGZpbGVuYW1lKQotICB7Ci0gICAgLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJmaWxlIG5hbWUgPSAiICsgZmlsZW5hbWUpOwotICAgIElSZXNvdXJjZSByZXMgPSBnZXRQcm9qZWN0KCkuZmluZE1lbWJlcihmaWxlbmFtZSwgdHJ1ZSk7IC8vIHRydWUgbWVhbnMgaW5jbHVkZSBwaGFudG9tIHJlc291cmNlcwotICAgIGlmIChyZXMgaW5zdGFuY2VvZiBJRmlsZSkgCi0gICAgewotICAgICAgcmV0dXJuIChJRmlsZSkgcmVzOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgY29sbGVjdGlvbiBvZiBmaWxlcyBmcm9tIHRoZSBwcm9qZWN0IHRoYXQgYXJlIHJlbGV2YW50IGZvciB0aGUKLSAgICogdmFsaWRhdG9yIHdpdGggdGhlIGdpdmVuIGNsYXNzIG5hbWUuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaWRhdG9yQ2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgY2xhc3MuCi0gICAqIEByZXR1cm4gVGhlIGNvbGxlY3Rpb24gb2YgZmlsZXMgcmVsZXZhbnQgZm9yIHRoZSB2YWxpZGF0b3IgY2xhc3Mgc3BlY2lmaWVkLgotICAgKi8KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0RmlsZXMoU3RyaW5nIHZhbGlkYXRvckNsYXNzTmFtZSkKLSAgewotICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0gICAgTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBnZXRGaWxlcyhmaWxlcywgcHJvamVjdCwgdmFsaWRhdG9yQ2xhc3NOYW1lKTsKLSAgICByZXR1cm4gZmlsZXM7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjb2xsZWN0aW9uIG9mIGZpbGVzIGZyb20gdGhlIHByb2plY3QgdGhhdCBhcmUgcmVsZXZhbnQgZm9yIHRoZQotICAgKiB2YWxpZGF0b3Igd2l0aCB0aGUgZ2l2ZW4gY2xhc3MgbmFtZS4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlcyBUaGUgZmlsZXMgcmVsZXZhbnQgZm9yIHRoZSBjbGFzcyBuYW1lLgotICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIHJlc291cmNlIHRvIGxvb2sgZm9yIGZpbGVzIGluLgotICAgKiBAcGFyYW0gdmFsaWRhdG9yQ2xhc3NOYW1lIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgY2xhc3MuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBnZXRGaWxlcyhDb2xsZWN0aW9uIGZpbGVzLCBJQ29udGFpbmVyIHJlc291cmNlLCBTdHJpbmcgdmFsaWRhdG9yQ2xhc3NOYW1lKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVJlc291cmNlIFtdIHJlc291cmNlQXJyYXkgPSByZXNvdXJjZS5tZW1iZXJzKGZhbHNlKTsKLSAgICAgIGZvciAoaW50IGk9MDsgaTxyZXNvdXJjZUFycmF5Lmxlbmd0aDsgaSsrKQotICAgICAgeyAgICAgICAKLSAgICAgICAgaWYgKFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmlzQXBwbGljYWJsZVRvKHZhbGlkYXRvckNsYXNzTmFtZSwgcmVzb3VyY2VBcnJheVtpXSkpIAotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHJlc291cmNlQXJyYXlbaV0gaW5zdGFuY2VvZiBJRmlsZSkgCi0gICAgICAgICAgewotICAgICAgICAgICAgZmlsZXMuYWRkKHJlc291cmNlQXJyYXlbaV0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocmVzb3VyY2VBcnJheVtpXS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikKLSAgICAgICAgIGdldEZpbGVzKGZpbGVzLChJQ29udGFpbmVyKXJlc291cmNlQXJyYXlbaV0sIHZhbGlkYXRvckNsYXNzTmFtZSkgOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gIH0KLQotICAKLS8qKgotICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSwgd2l0aG91dCB0aGUgcHJvamVjdC1zcGVjaWZpYyBpbmZvcm1hdGlvbiAKLSAqIGluIGZyb250LgotICoKLSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgVmFsaWRhdGlvbk9wZXJhdGlvbiB0byBjYWxjdWxhdGUgdGhlIG5vbi1lbnZpcm9ubWVudCAKLSAqIHNwZWNpZmljIG5hbWVzIG9mIHRoZSBmaWxlcy4gT25seSB0aGUgSVdvcmtiZW5jaENvbnRleHQgaW1wbGVtZW50YXRpb24ga25vd3MgaG93IAotICogbXVjaCBpbmZvcm1hdGlvbiB0byBzdHJpcCBvZmYgb2YgdGhlIElSZXNvdXJjZSBuYW1lLiBGb3IgZXhhbXBsZSwgaWYgdGhlcmUgaXMKLSAqIGFuIEVKQiBQcm9qZWN0IG5hbWVkICJNeUVKQlByb2plY3QiLCBhbmQgaXQgdXNlcyB0aGUgZGVmYXVsdCBuYW1lcyBmb3IgdGhlIAotICogc291cmNlIGFuZCBvdXRwdXQgZm9sZGVycywgInNvdXJjZSIgYW5kICJlamJNb2R1bGUiLCByZXNwZWN0aXZlbHksIHRoZW4gdGhlCi0gKiBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIEVKQiBIZWxwZXIga25vd3MgaG93IG11Y2ggb2YgdGhhdCBzdHJ1Y3R1cmUgaXMgCi0gKiBlY2xpcHNlLXNwZWNpZmljLiAKLSAqCi0gKiBTaW5jZSB0aGUgInNvdXJjZSIgZm9sZGVyIGNvbnRhaW5zIEphdmEgc291cmNlIGZpbGVzLCBhIHBvcnRhYmxlIG5hbWUgd291bGQKLSAqIGJlIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcywgd2l0aG91dCB0aGUgZWNsaXBzZS1zcGVjaWZpYwotICogcHJvamVjdCBhbmQgZm9sZGVyIG5hbWVzIGluIGZyb250IG9mIHRoZSBmaWxlIG5hbWUuIFRoZSBFSkJIZWxwZXIga25vd3MgdGhhdCAKLSAqIGV2ZXJ5dGhpbmcgdXAgdG8gdGhlICJzb3VyY2UiIGZvbGRlciwgZm9yIGV4YW1wbGUsIGNhbiBiZSByZW1vdmVkLCBiZWNhdXNlLCAKLSAqIGFjY29yZGluZyB0byB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgRUpCIFByb2plY3QsIGV2ZXJ5dGhpbmcgY29udGFpbmVkCi0gKiBpbiB0aGUgc291cmNlIGZvbGRlciBpcyBqYXZhIHNvdXJjZSBjb2RlLiBTbyBpZiB0aGVyZSBpcyBhbiBJUmVzb3VyY2UgaW4gYW4KLSAqIEVKQiBQcm9qZWN0IG5hbWVkICIvTXlFSkJQcm9qZWN0L3NvdXJjZS9jb20vaWJtL215Y2xhc3Nlcy9NeUphdmFGaWxlLmphdmEiLAotICogdGhpcyBtZXRob2Qgd291bGQgbWFrZSB0aGlzIG5hbWUgcG9ydGFibGUgYnkgc3RyaXBwaW5nIG9mZiB0aGUKLSAqICIvTXlFSkJQcm9qZWN0L3NvdXJjZSIsIGFuZCByZXR1cm5pbmcgImNvbS9pYm0vbXljbGFzc2VzL015SmF2YUZpbGUuamF2YSIuCi0gKgotICogVGhlIG91dHB1dCBvZiB0aGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSBWYWxpZGF0aW9uT3BlcmF0aW9uLCB3aGVuIGl0Ci0gKiBpcyBjYWxjdWxhdGluZyB0aGUgbGlzdCBvZiBhZGRlZC9jaGFuZ2VkL2RlbGV0ZWQgZmlsZSBuYW1lcyBmb3IgaW5jcmVtZW50YWwKLSAqIHZhbGlkYXRpb24uIElmIGdldFBvcnRhYmxlTmFtZShJUmVzb3VyY2UpIHJldHVybnMgbnVsbCwgdGhhdCBtZWFucwotICogdGhhdCB0aGUgSVdvcmtiZW5jaENvbnRleHQncyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoYXQgcGFydGljdWxhcgotICogdHlwZSBvZiByZXNvdXJjZSwgYW5kIHRoZSByZXNvdXJjZSBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBhcnJheSBvZgotICogSUZpbGVEZWx0YSBvYmplY3RzIGluIHRoZSBJVmFsaWRhdG9yJ3MgInZhbGlkYXRlIiBtZXRob2QuIAotICogCi0gKiBAcGFyYW0gcmVzb3VyY2UgVGhlIHJlc291cmNlIHRvIGdldCB0aGUgbmFtZSBmcm9tLgotICogQHJldHVybiBUaGUgcG9ydGFibGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0UG9ydGFibGVOYW1lKElSZXNvdXJjZSByZXNvdXJjZSkKLSAgewotICAgIC8vICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0IHBvcnRhYmxlbmFtZSBmb3IgIiArIHJlc291cmNlKTsKLSAgICByZXR1cm4gcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCk7Ci0gIH0KLQotLyoqCi0gKiBXaGVuIGFuIElWYWxpZGF0b3IgYXNzb2NpYXRlcyBhIHRhcmdldCBvYmplY3Qgd2l0aCBhbiBJTWVzc2FnZSwKLSAqIHRoZSBXb3JrYmVuY2hSZXBvcnRlciBldmVudHVhbGx5IHJlc29sdmVzIHRoYXQgdGFyZ2V0IG9iamVjdAotICogd2l0aCBhbiBJUmVzb3VyY2UuIFNvbWV0aW1lcyBtb3JlIHRoYW4gb25lIHRhcmdldCBvYmplY3QgcmVzb2x2ZXMKLSAqIHRvIHRoZSBzYW1lIElSZXNvdXJjZSAodXN1YWxseSB0aGUgSVByb2plY3QsIHdoaWNoIGlzIHRoZSBkZWZhdWx0Ci0gKiBJUmVzb3VyY2Ugd2hlbiBhbiBJRmlsZSBjYW5ub3QgYmUgZm91bmQpLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQsCi0gKiBieSB0aGUgV29ya2JlbmNoUmVwb3J0ZXIsIHNvIHRoYXQgdGhlIFdvcmtiZW5jaFJlcG9ydGVyIGNhbiAKLSAqIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIElNZXNzYWdlcyB3aGljaCBhcmUgb24gdGhlIHNhbWUgSVJlc291cmNlLCAKLSAqIGJ1dCByZWZlciB0byBkaWZmZXJlbnQgdGFyZ2V0IG9iamVjdHMuIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgCi0gKiByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yLCBPYmplY3QpIG1ldGhvZCwgc28gdGhhdCB3aGVuIG9uZQotICogdGFyZ2V0IG9iamVjdCByZW1vdmVzIGFsbCBvZiBpdHMgbWVzc2FnZXMsIHRoYXQgaXQgZG9lc24ndCByZW1vdmUKLSAqIGFub3RoZXIgdGFyZ2V0IG9iamVjdCdzIG1lc3NhZ2VzLgotICoKLSAqIFRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbCBvbmx5IGlmIG9iamVjdCBpcyBudWxsLiBPdGhlcndpc2UsIGFuCi0gKiBpZCB3aGljaCBjYW4gdW5pcXVlbHkgaWRlbnRpZnkgYSBwYXJ0aWN1bGFyIG9iamVjdCBtdXN0IGJlIHJldHVybmVkLgotICogVGhlIGlkIG5lZWRzIHRvIGJlIHVuaXF1ZSBvbmx5IHdpdGhpbiBvbmUgcGFydGljdWxhciBJVmFsaWRhdG9yLgotICogCi0gKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgZnJvbSB3aGljaCB0byBnZXQgdGhlIG5hbWUuCi0gKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgb3IgbnVsbCBpZiB0aGUgb2JqZWN0IGlzIG51bGwuCi0gKi8KLXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0T2JqZWN0TmFtZShPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgaWYgKG9iamVjdCA9PSBudWxsKSAKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXQgdGFyZ2V0bmFtZSBmb3IgIiArIG9iamVjdCk7Ci0gICAgcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwotICB9Ci0gIAotICAvKioKLSAgICogRGVsZXRlIHRoZSBtYXJrZXJzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBmcm9tIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCi0gICAqIAotICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIHJlc291cmNlIHRvIGRlbGV0ZSB0aGUgbWFya2VycyBmcm9tLgotICAgKiBAcGFyYW0gbWFya2VyVHlwZSBUaGUgdHlwZSBvZiBtYXJrZXJzIHRvIGRlbGV0ZSBmcm9tIHRoZSByZXNvdXJjZS4KLSAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB3aGljaCB0aGUgbWFya2VycyBtdXN0IGhhdmUgdG8gYmUgZGVsZXRlZC4KLSAgICogQHBhcmFtIGF0dHJpYnV0ZVZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGNvcnJlc3BvbmRpbmcgdG8gYXR0cmlidXRlTmFtZSB3aGljaCB0aGUgbWFya2VycyBtdXN0IGhhdmUgdG8gYmUgZGVsZXRlZC4KLSAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlTWFya2VycyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBtYXJrZXJUeXBlLCBmaW5hbCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgZmluYWwgT2JqZWN0IGF0dHJpYnV0ZVZhbHVlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7ICAgICAgICAgIAotICAgIGZpbmFsIElNYXJrZXJbXSB2NDAwTWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0gICAgZmluYWwgSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhtYXJrZXJUeXBlLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotICAgIElXb3Jrc3BhY2VSdW5uYWJsZSBvcCA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSAKLSAgICAgewotICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gCi0gICAgICAgeyAgICAKLSAgICAgICAgIC8vIHRoaXMgZml4ZXMgZGVmZWN0IDE5MzQwNgotICAgICAgICAgLy8gaGVyZSB3ZSByZW1vdmUgbWFya2VycyB0aGF0IG1heSBoYXZlIGJlZW4gYWRkZWQgYnkgdGhlIHY0MDAgY29kZQotICAgICAgICAgLy8gaG9wZWZ1bGx5IHRoZSAnLm1hcmtlcnMnIG1ldGFkYXRhIGZpbGVzIHdpbGwgYmUgcmVtb3ZlZCBmb3IgdGhlIFY1IGluc3RhbGwKLSAgICAgICAgIC8vIGFuZCB0aGlzIGtsdWRnZSB3aWxsIG5vdCBiZSBuZWVkZWQgdGhlcmUKLSAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdjQwME1hcmtlcnMubGVuZ3RoOyBpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgIElNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsgICAgICAgICAgIAotICAgICAgICAgICBtYXJrZXIuZGVsZXRlKCk7ICAgICAgICAgICAKLSAgICAgICAgIH0KLSAgICAKLSAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgCi0gICAgICAgICB7Ci0gICAgICAgICAgIElNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLSAgICAgICAgICAgCi0gICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7Ci0gICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICB2YWx1ZS5lcXVhbHMoYXR0cmlidXRlVmFsdWUpKSAKLSAgICAgICAgICAgewotICAgICAgICAgICAgIG1hcmtlci5kZWxldGUoKTsKLSAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKG9wLCBudWxsKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IH0KLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgc2V2ZXJpdHkgZm9yIHRoZSBnaXZlbiBzZXZlcml0eS4KLSAgICogCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgdG8gY29udmVydCB0byB2YWxpZGF0aW9uIGZyYW1ld29yayBzZXZlcml0eS4KLSAgICogQHJldHVybiBUaGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgc2V2ZXJpdHkgZm9yIHRoZSBnaXZlbiBzZXZlcml0eS4KLSAgICovCi0gIHN0YXRpYyBwdWJsaWMgaW50IGdldFZhbGlkYXRpb25GcmFtZXdvcmtTZXZlcml0eShpbnQgc2V2ZXJpdHkpCi0gIHsKLSAgICBzd2l0Y2ggKHNldmVyaXR5KQotICAgIHsKLSAgICAgIGNhc2UgSU1hcmtlci5TRVZFUklUWV9FUlJPUjoKLSAgICAgICAgcmV0dXJuIElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0gICAgICBjYXNlIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORzoKLSAgICAgICAgcmV0dXJuIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLSAgICAgIGNhc2UgSU1hcmtlci5TRVZFUklUWV9JTkZPOgotICAgICAgICByZXR1cm4gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOwotICAgIH0KLSAgICByZXR1cm4gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOyAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvTGF6eVVSTElucHV0U3RyZWFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL0xhenlVUkxJbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzRjYjBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvTGF6eVVSTElucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgYWxsb3dzIElucHV0U3RyZWFtcyB0byBiZSBjcmVhdGVkIGFuZCByZXR1cm5lZCB0byB4ZXJjZXMgd2l0aG91dAotICogYWN0dWFsbHkgb3BlbmluZyBmaWxlIGhhbmRsZXMgb3IgbmV0d29yayBjb25uZWN0aW9ucyB1bnRpbCBpdCBpcyBhYnNvbHV0ZWx5Ci0gKiBuZWNjZXNzYXJ5LgotICovCi1wdWJsaWMgY2xhc3MgTGF6eVVSTElucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0KLXsgIAotICBwcml2YXRlIHN0YXRpYyBpbnQgZGVidWdUb3RhbE9wZW5TdHJlYW1Db3VudCA9IDA7IAotICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gaW5uZXI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdXJsOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBlcnJvcjsKLSAgYm9vbGVhbiBoYXNNYXJrczsKLSAgYm9vbGVhbiBwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuOwotCi0gIHB1YmxpYyBMYXp5VVJMSW5wdXRTdHJlYW0oU3RyaW5nIHVybCkKLSAgewotICAgIHRoaXMudXJsID0gdXJsOwotCWlubmVyID0gbnVsbDsKLQlwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuID0gZmFsc2U7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoaW5uZXIgPT0gbnVsbCAmJiAhZXJyb3IpCi0gICAgewotICAgICAgZGVidWdUb3RhbE9wZW5TdHJlYW1Db3VudCsrOwotICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlubmVyID0gbmV3IFVSTCh1cmwpLm9wZW5TdHJlYW0oKTsKLQkJcHJldGVuZEZpbGVJc1N0aWxsT3BlbiA9IGZhbHNlOwotCQloYXNNYXJrcyA9IGZhbHNlOwotICAgICAgfQotICAgICAgZmluYWxseSAKLSAgICAgIHsKLSAgICAgICAgaWYgKGlubmVyID09IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xvc2VTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaW5uZXIgIT0gbnVsbCAmJiAhcHJldGVuZEZpbGVJc1N0aWxsT3BlbikgewotCQkJaW5uZXIuY2xvc2UoKTsKLQkJCXByZXRlbmRGaWxlSXNTdGlsbE9wZW4gPSB0cnVlOwotCQl9Ci0gIAl9Ci0KLSAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotCWlmIChwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSByZXR1cm4gMDsKLQljcmVhdGVJbm5lclN0cmVhbUlmUmVxdWlyZWQoKTsKLQlpZiAoaW5uZXIgPT0gbnVsbCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gbm90IGF2YWlsYWJsZSIpOyAvLyROT04tTkxTLTEkCi0JcmV0dXJuIGlubmVyLmF2YWlsYWJsZSgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotCWlmIChwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSB7Ci0JCS8vIFN0b3AgYmVoYXZpbmcgYXMgaWYgdGhlIHN0cmVhbSB3ZXJlIHN0aWxsIG9wZW4uCi0JCXByZXRlbmRGaWxlSXNTdGlsbE9wZW4gPSBmYWxzZTsKLQl9IGVsc2UgewotCQlpZiAoaW5uZXIgIT0gbnVsbCkgewotCQkJZGVidWdUb3RhbE9wZW5TdHJlYW1Db3VudC0tOwotCQkJaW5uZXIuY2xvc2UoKTsKLQkJfQotCX0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRsaW1pdCkKLSAgewotCWlmIChwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSByZXR1cm47Ci0JaGFzTWFya3MgPSB0cnVlOwotCXRyeSB7Ci0JCWNyZWF0ZUlubmVyU3RyZWFtSWZSZXF1aXJlZCgpOwotCQlpbm5lci5tYXJrKHJlYWRsaW1pdCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpCi0gIHsKLQlpZiAocHJldGVuZEZpbGVJc1N0aWxsT3BlbikgcmV0dXJuIGZhbHNlOwotCXRyeSB7Ci0JCWNyZWF0ZUlubmVyU3RyZWFtSWZSZXF1aXJlZCgpOwotCQlpZiAoaW5uZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaW5uZXIubWFya1N1cHBvcnRlZCgpOwotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotCWlmIChwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSByZXR1cm4gLTE7Ci0JY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JaWYgKGlubmVyID09IG51bGwpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIG5vdCBhdmFpbGFibGUiKTsgLy8kTk9OLU5MUy0xJAotCWludCBieXRlc1JlYWQgPSBpbm5lci5yZWFkKCk7Ci0JaWYgKGJ5dGVzUmVhZCA9PSAtMSAmJiAhaGFzTWFya3MpIGNsb3NlU3RyZWFtKCk7Ci0JcmV0dXJuIGJ5dGVzUmVhZDsKLSAgfQotCi0KLQlwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSByZXR1cm4gLTE7Ci0JCWNyZWF0ZUlubmVyU3RyZWFtSWZSZXF1aXJlZCgpOwotCQlpZiAoaW5uZXIgPT0gbnVsbCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gbm90IGF2YWlsYWJsZSIpOyAvLyROT04tTkxTLTEkCi0JCWludCBieXRlc1JlYWQgPSBpbm5lci5yZWFkKGIpOwotCQlpZiAoYnl0ZXNSZWFkID09IC0xICYmICFoYXNNYXJrcykgY2xvc2VTdHJlYW0oKTsKLQkJcmV0dXJuIGJ5dGVzUmVhZDsKLQl9Ci0KLSAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgeyAgICAKLQlpZiAocHJldGVuZEZpbGVJc1N0aWxsT3BlbikgcmV0dXJuIC0xOwotCWNyZWF0ZUlubmVyU3RyZWFtSWZSZXF1aXJlZCgpOwotCWlmIChpbm5lciA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBub3QgYXZhaWxhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQlpbnQgYnl0ZXNSZWFkID0gaW5uZXIucmVhZChiLCBvZmYsIGxlbik7Ci0JaWYgKGJ5dGVzUmVhZCA9PSAtMSAmJiAhaGFzTWFya3MpIGNsb3NlU3RyZWFtKCk7Ci0JcmV0dXJuIGJ5dGVzUmVhZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLQlpZiAocHJldGVuZEZpbGVJc1N0aWxsT3BlbikgcmV0dXJuOwotCWNyZWF0ZUlubmVyU3RyZWFtSWZSZXF1aXJlZCgpOwotCWlmIChpbm5lciA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBub3QgYXZhaWxhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQlpbm5lci5yZXNldCgpOwotICB9Ci0KLSAgcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbgotICB7ICAgCi0JaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHJldHVybiAwOwotCWNyZWF0ZUlubmVyU3RyZWFtSWZSZXF1aXJlZCgpOwotCWlmIChpbm5lciA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBub3QgYXZhaWxhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gaW5uZXIuc2tpcChuKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9OZXN0ZWRWYWxpZGF0b3JDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL05lc3RlZFZhbGlkYXRvckNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MyNzEwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL05lc3RlZFZhbGlkYXRvckNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlOwotCi0KLS8qKgotICogQSBjb250ZXh0IGNsYXNzIGZvciB2YWxpZGF0b3JzIHRvIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHRoZSBjb250ZXh0IG9mCi0gKiBnaXZlbiB2YWxpZGF0aW9uIHNlc3Npb24uIEN1cnJlbnRseSB0aGlzIGNsYXNzIGlzIG9ubHkgdXNlZCB0byBpZGVudGlmeQotICogdGhlIHVuaXF1ZSBjb250ZXh0LgotICovCi1wdWJsaWMgY2xhc3MgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCAKLXsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvVmFsaWRhdGlvbkluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvVmFsaWRhdGlvbkluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEyZTFhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL1ZhbGlkYXRpb25JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmU7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlhNTFZhbGlkYXRpb25NZXNzYWdlczsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhhbmRsZXMgbWVzc2FnZXMgZnJvbSBhIHZhbGlkYXRvci4gVGhpcyBjbGFzcyBjYW4gaGFuZGxlCi0gKiAKLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25JbmZvIGltcGxlbWVudHMgVmFsaWRhdGlvblJlcG9ydAotewotICBwcml2YXRlIGJvb2xlYW4gV1JBUFBFUl9FUlJPUl9TVVBQT1JUX0VOQUJMRUQgPSB0cnVlOwotICBwdWJsaWMgc3RhdGljIGludCBTRVZfRVJST1IgPSAwOwotICBwdWJsaWMgc3RhdGljIGludCBTRVZfV0FSTklORyA9IDE7Ci0gIAotICBwcml2YXRlIFN0cmluZyB2YWxpZGF0aW5nX2ZpbGVfdXJpID0gbnVsbDsKLSAgcHJpdmF0ZSBVUkwgdmFsaWRhdGluZ19maWxlX3VybCA9IG51bGw7Ci0gIHByaXZhdGUgYm9vbGVhbiB2YWxpZCA9IHRydWU7Ci0gIHByaXZhdGUgTGlzdCBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJpdmF0ZSBIYXNoTWFwIG5lc3RlZE1lc3NhZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpCi0gICAqICAgICAgICAgICAgVGhlIFVSSSBvZiB0aGUgZmlsZSBmb3IgdGhlIHZhbGlkYXRpb24uCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbkluZm8oU3RyaW5nIHVyaSkKLSAgewotICAgIGlmKHVyaSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRoaXMudmFsaWRhdGluZ19maWxlX3VyaSA9IHVyaTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICB0aGlzLnZhbGlkYXRpbmdfZmlsZV91cmwgPSBuZXcgVVJMKHVyaSk7Ci0gICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEZpbGVVUkkoKQotICB7Ci0gICAgcmV0dXJuIHZhbGlkYXRpbmdfZmlsZV91cmk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkKLSAgewotICAgIHJldHVybiB2YWxpZDsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYW4gZXJyb3IgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGFkZC4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmkpCi0gIHsKLSAgICBhZGRFcnJvcihtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSwgbnVsbCwgbnVsbCk7Ci0gIH0gIAotICAKLSAgLyoqCi0gICAqIAotICAgKiBBZGQgYW4gZXJyb3IgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGFkZC4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBtZXNzYWdlQXJndW1lbnRzIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmksIFN0cmluZyBrZXksIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpCi0gIHsgICAgCi0gICAgaWYoYWRkTWVzc2FnZShtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSwgU0VWX0VSUk9SLCBrZXksIG1lc3NhZ2VBcmd1bWVudHMpKQotICAgIHsKLSAgICAgIHZhbGlkID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHdhcm5pbmcgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBzdHJpbmcgbWVzc2FnZSBvZiB0aGUgd2FybmluZy4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIHdhcm5pbmcuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgd2FybmluZy4KLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIHdhcm5pbmcuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRXYXJuaW5nKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSkKLSAgewotICAgIGFkZFdhcm5pbmcobWVzc2FnZSwgbGluZSwgY29sdW1uLCB1cmksIG51bGwsIG51bGwpOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEFkZCBhbiBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYWRkLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIG1lc3NhZ2VBcmd1bWVudHMgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpLCBTdHJpbmcga2V5LCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKQotICB7ICAgIAotICAgIGFkZE1lc3NhZ2UobWVzc2FnZSwgbGluZSwgY29sdW1uLCB1cmksIFNFVl9XQVJOSU5HLCBrZXksIG1lc3NhZ2VBcmd1bWVudHMpOwotICB9Ci0gIAotICAvKioKLSAgICogQWRkIGEgbWVzc2FnZSB0byB0aGUgbGlzdC4gUmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYWRkIHRvIHRoZSBsaXN0LgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGtleSB0aGUgWGVyY2VzIGVycm9yIGtleSBmb3IgdGhpcyBlcnJvcgotICAgKiBAcGFyYW0gbWVzc2FnZUFyZ3VtZW50cyBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBlcnJvcgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG1lc3NhZ2Ugd2FzIHN1Y2Nlc3NmdWxseSBhZGRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGFkZE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpLCBpbnQgc2V2ZXJpdHksIFN0cmluZyBrZXksIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpCi0gIHsKLSAgICBib29sZWFuIHN1Y2Nlc3NmdWxseUFkZGVkID0gZmFsc2U7Ci0gICAgLy8gSWYgdGhlIG1lc3NhZ2UgaWYgbnVsbCB0aGVyZSBpcyBub3RoaW5nIHRvIGFkZC4KLSAgICBpZihtZXNzYWdlID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIHN1Y2Nlc3NmdWxseUFkZGVkOwotICAgIH0KLSAgICBTdHJpbmcgZXJyb3JVUkkgPSBub3JtYWxpemUodXJpKTsKLSAgICBVUkwgZXJyb3JVUkwgPSBudWxsOwotICAgIGlmIChlcnJvclVSSSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBlcnJvclVSTCA9IG5ldyBVUkwoZXJyb3JVUkkpOwotICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICAvL2Vycm9yVVJJID0gbm9ybWFsaXplVVJJKGVycm9yVVJJKTsKLSAgICB9Ci0gICAgLy9ib29sZWFuIGRvRGlhbG9nID0gdHJ1ZTsKLSAgICBpZiAoZXJyb3JVUkwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdWNjZXNzZnVsbHlBZGRlZCA9IHRydWU7Ci0gICAgICAvLyBBZGQgdG8gdGhlIGFwcHJvcHJpYXRlIGxpc3QgaWYgbmVzdGVkIGVycm9yIHN1cHBvcnQgaXMgb2ZmIG9yCi0gICAgICAvLyB0aGlzIG1lc3NhZ2UgaXMgZm9yIHRoZSBjdXJyZW50IGZpbGUuCi0gICAgICBpZiAoIVdSQVBQRVJfRVJST1JfU1VQUE9SVF9FTkFCTEVEIHx8IHZhbGlkYXRpbmdfZmlsZV91cmwuc2FtZUZpbGUoZXJyb3JVUkwpKQotICAgICAgewotCi0gICAgICAgIFZhbGlkYXRpb25NZXNzYWdlIHZhbG1lcyA9IG5ldyBWYWxpZGF0aW9uTWVzc2FnZShtZXNzYWdlLCBsaW5lLAotICAgICAgICAgICAgY29sdW1uLCB2YWxpZGF0aW5nX2ZpbGVfdXJpLCBrZXksIG1lc3NhZ2VBcmd1bWVudHMpOwotICAgICAgICBpZiAoc2V2ZXJpdHkgPT0gU0VWX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsbWVzLnNldFNldmVyaXR5KFZhbGlkYXRpb25NZXNzYWdlLlNFVl9OT1JNQUwpOwotICAgICAgICB9IGVsc2UgaWYgKHNldmVyaXR5ID09IFNFVl9XQVJOSU5HKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsbWVzLnNldFNldmVyaXR5KFZhbGlkYXRpb25NZXNzYWdlLlNFVl9MT1cpOwotICAgICAgICB9Ci0gICAgICAgIG1lc3NhZ2VzLmFkZCh2YWxtZXMpOwotICAgICAgfQotICAgICAgLy8gSWYgbmVzdGVkIGVycm9yIHN1cHBvcnQgaXMgZW5hYmxlZCBjcmVhdGUgYSBuZXN0ZWQgZXJyb3IuCi0gICAgICBlbHNlIGlmIChXUkFQUEVSX0VSUk9SX1NVUFBPUlRfRU5BQkxFRCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5lc3RlZHVyaSA9IGVycm9yVVJMLnRvRXh0ZXJuYWxGb3JtKCk7Ci0gICAgICAgIFZhbGlkYXRpb25NZXNzYWdlIG5lc3RlZG1lc3MgPSBuZXcgVmFsaWRhdGlvbk1lc3NhZ2UobWVzc2FnZSwgbGluZSwKLSAgICAgICAgICAgIGNvbHVtbiwgbmVzdGVkdXJpLCBrZXksIG1lc3NhZ2VBcmd1bWVudHMpOwotICAgICAgICBpZihzZXZlcml0eSA9PSBTRVZfV0FSTklORykKLSAgICAgICAgewotICAgICAgICAgIG5lc3RlZG1lc3Muc2V0U2V2ZXJpdHkoVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0xPVyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmVzdGVkbWVzcy5zZXRTZXZlcml0eShWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTk9STUFMKTsKLSAgICAgICAgfQotCi0gICAgICAgIFZhbGlkYXRpb25NZXNzYWdlIGNvbnRhaW5lciA9IChWYWxpZGF0aW9uTWVzc2FnZSkgbmVzdGVkTWVzc2FnZXMuZ2V0KG5lc3RlZHVyaSk7Ci0gICAgICAgIGlmKGNvbnRhaW5lciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgY29udGFpbmVyID0gbmV3IFZhbGlkYXRpb25NZXNzYWdlKE5MUy5iaW5kKFhNTFZhbGlkYXRpb25NZXNzYWdlcy5fVUlfUkVGX0ZJTEVfRVJST1JfTUVTU0FHRSwgbmV3IE9iamVjdCBbXSB7IG5lc3RlZHVyaSB9KSwgMSwgMCwgbmVzdGVkdXJpKTsKLSAgICAgICAKLSAgICAgICAgICAvLyBJbml0aWFsbHkgc2V0IHRoZSBuZXN0ZWQgZXJyb3IgdG8gYSB3YXJuaW5nLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBiZSBjaGFuZ2VkCi0gICAgICAgICAgLy8gdG8gYW4gZXJyb3IgaWYgYSBuZXN0ZWQgbWVzc2FnZSBoYXMgYSBzZXZlcml0eSBvZiBlcnJvci4KLSAgICAgICAgICBjb250YWluZXIuc2V0U2V2ZXJpdHkoVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0xPVyk7Ci0gICAgICAgICAgbmVzdGVkTWVzc2FnZXMucHV0KG5lc3RlZHVyaSwgY29udGFpbmVyKTsKLSAgICAgICAgICBtZXNzYWdlcy5hZGQoY29udGFpbmVyKTsKLSAgICAgICAgfQotICAgICAgICBjb250YWluZXIuYWRkTmVzdGVkTWVzc2FnZShuZXN0ZWRtZXNzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN1Y2Nlc3NmdWxseUFkZGVkOwotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIEFkZCBhIG5lc3RlZCBtZXNzYWdlIHRvIHRoZSB2YWxpZGF0aW9uIGluZm9ybWF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIHN0cmluZyBtZXNzYWdlIG9mIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBhZGROZXN0ZWRNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSwgaW50IHNldmVyaXR5KQotLy8gIHsKLS8vICAgIFZhbGlkYXRpb25NZXNzYWdlIG5lc3RlZG1lc3MgPSBuZXcgVmFsaWRhdGlvbk1lc3NhZ2UobWVzc2FnZSwgbGluZSwgY29sdW1uLCB1cmkpOwotLy8gICAgaWYoc2V2ZXJpdHkgPT0gU0VWX1dBUk5JTkcpCi0vLyAgICB7Ci0vLyAgICAgIG5lc3RlZG1lc3Muc2V0U2V2ZXJpdHkoVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0xPVyk7Ci0vLyAgICB9Ci0vLyAgICBlbHNlCi0vLyAgICB7Ci0vLyAgICAgIG5lc3RlZG1lc3Muc2V0U2V2ZXJpdHkoVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX05PUk1BTCk7Ci0vLyAgICB9Ci0vLyAgICBWYWxpZGF0aW9uTWVzc2FnZSBjb250YWluZXIgPSAoVmFsaWRhdGlvbk1lc3NhZ2UpbmVzdGVkTWVzc2FnZXMuZ2V0KHVyaSk7Ci0vLyAgICBpZihjb250YWluZXIgPT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgY29udGFpbmVyID0gbmV3IFZhbGlkYXRpb25NZXNzYWdlKFhNTENvcmVWYWxpZGF0aW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKF9VSV9SRUZfRklMRV9FUlJPUl9NRVNTQUdFLCB1cmkpLCAxLCAwLCB2YWxpZGF0aW5nX2ZpbGVfdXJpKTsKLS8vICAgICAgLy8gSW5pdGlhbGx5IHNldCB0aGUgbmVzdGVkIGVycm9yIHRvIGEgd2FybmluZy4gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2hhbmdlZAotLy8gICAgICAvLyB0byBhbiBlcnJvciBpZiBhIG5lc3RlZCBtZXNzYWdlIGhhcyBhIHNldmVyaXR5IG9mIGVycm9yLgotLy8gICAgICBjb250YWluZXIuc2V0U2V2ZXJpdHkoVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0xPVyk7Ci0vLyAgICAgIG5lc3RlZE1lc3NhZ2VzLnB1dCh1cmksIGNvbnRhaW5lcik7Ci0vLyAgICAgIG1lc3NhZ2VzLmFkZChjb250YWluZXIpOwotLy8gICAgfQotLy8gICAgY29udGFpbmVyLmFkZE5lc3RlZE1lc3NhZ2UobmVzdGVkbWVzcyk7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUuVmFsaWRhdGlvblJlcG9ydCNnZXRWYWxpZGF0aW9uTWVzc2FnZXMoKQotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25NZXNzYWdlW10gZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKCkKLSAgewotICAgIHJldHVybiAoVmFsaWRhdGlvbk1lc3NhZ2VbXSltZXNzYWdlcy50b0FycmF5KG5ldyBWYWxpZGF0aW9uTWVzc2FnZVttZXNzYWdlcy5zaXplKCldKTsKLSAgfQotCi0gIHB1YmxpYyBIYXNoTWFwIGdldE5lc3RlZE1lc3NhZ2VzKCkKLSAgewotICAgIHJldHVybiBuZXN0ZWRNZXNzYWdlczsKLSAgfQotICAKLSAgLyoqCi0gICAqIFB1dCB0aGUgVVJJIGluIGEgc3RhbmRhcmQgZm9ybWF0LgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIHRvIHB1dCBpbnRvIGEgc3RhbmRhcmQgZm9ybWF0LgotICAgKiBAcmV0dXJuIFRoZSBzdGFuZGFyZCBmb3JtYXQgb2YgdGhlIFVSSS4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgdXJpKQotICB7Ci0vLyAgICBpZih1cmkuc3RhcnRzV2l0aCgicGxhdGZvcm06IikpCi0vLyAgICB7Ci0vLyAgICAgIHRyeQotLy8gICAgICB7Ci0vLyAgICAgICAgdXJpID0gUGxhdGZvcm0ucmVzb2x2ZShuZXcgVVJMKHVyaSkpLnRvU3RyaW5nKCk7Ci0vLyAgICAgIH0KLS8vICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0vLyAgICAgIHsKLS8vICAgICAgfQotLy8gICAgfQotICAgIHVyaSA9IHVyaS5yZXBsYWNlQWxsKCIlMjAiLCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHVyaSA9IHVyaS5yZXBsYWNlQWxsKCIlNUUiLCAiXiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB1cmkgPSB1cmkucmVwbGFjZSgnXFwnLCcvJyk7Ci0gICAgCi0gICAgcmV0dXJuIHVyaTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvVmFsaWRhdGlvbk1lc3NhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvVmFsaWRhdGlvbk1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUxZGNmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL1ZhbGlkYXRpb25NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBBIGNsYXNzIGZvciBob2xkaW5nIHZhbGlkYXRpb24gbWVzc2FnZSBpbmZvcm1hdGlvbi4gSG9sZHMgdGhlIG1lc3NhZ2UgYW5kIHRoZQotICogbWVzc2FnZSBsb2NhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25NZXNzYWdlCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSBFUlJPUl9NRVNTQUdFX01BUF9RVUFMSUZJRURfTkFNRSA9IG5ldyBRdWFsaWZpZWROYW1lKCJvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24iLCAiZXJyb3JNZXNzYWdlTWFwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICBwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7Ci0gIHByb3RlY3RlZCBpbnQgbGluZU51bWJlcjsKLSAgcHJvdGVjdGVkIGludCBjb2x1bW5OdW1iZXI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdXJpOwotICBwcm90ZWN0ZWQgTGlzdCBuZXN0ZWRFcnJvcnM7Ci0gIHByb3RlY3RlZCBTdHJpbmcga2V5OwotICBwcm90ZWN0ZWQgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50czsKLSAgcHJvdGVjdGVkIGludCBzdGFydE9mZnNldDsKLSAgcHJvdGVjdGVkIGludCBzZXZlcml0eSA9IElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLSAgcHVibGljIHN0YXRpYyBpbnQgU0VWX0hJR0ggPSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotICBwdWJsaWMgc3RhdGljIGludCBTRVZfTk9STUFMID0gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotICBwdWJsaWMgc3RhdGljIGludCBTRVZfTE9XID0gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGZvciB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiBAcGFyYW0gbGluZU51bWJlciBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbk51bWJlciBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25NZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZU51bWJlciwgaW50IGNvbHVtbk51bWJlcikKLSAgewotICAgIHRoaXMobWVzc2FnZSwgbGluZU51bWJlciwgY29sdW1uTnVtYmVyLCBudWxsKTsKLSAgfQotCi0gIC8qKiAKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSBmb3IgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogQHBhcmFtIGxpbmVOdW1iZXIgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBjb2x1bW5OdW1iZXIgVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIHVyaSBUaGUgdXJpIG9mIHRoZSBmaWxlIHRoZSBtZXNzYWdlIGlzIGZvci4KLSAgICovCi0gICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBpbnQgY29sdW1uTnVtYmVyLCBTdHJpbmcgdXJpKQotICB7Ci0gICAgIHRoaXMobWVzc2FnZSwgbGluZU51bWJlciwgY29sdW1uTnVtYmVyLCB1cmksIG51bGwsIG51bGwpOwotICB9Ci0gICAKLSAgIC8qKiAKLSAgICAqIENvbnN0cnVjdG9yLgotICAgICogCi0gICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSBmb3IgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICAqIEBwYXJhbSBsaW5lTnVtYmVyIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgICogQHBhcmFtIGNvbHVtbk51bWJlciBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgICogQHBhcmFtIHVyaSBUaGUgdXJpIG9mIHRoZSBmaWxlIHRoZSBtZXNzYWdlIGlzIGZvci4KLSAgICAqIEBwYXJhbSBrZXkgYSB1bmlxdWUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXJyb3IKLSAgICAqIEBwYXJhbSBtZXNzYWdlQXJndW1lbnRzIHRoZSBhcmd1bWVudHMgWGVyY2VzIHVzZXMgdG8gY3JlYXRlIHRoZSBtZXNzYWdlCi0gICAgKi8KLSAgICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBpbnQgY29sdW1uTnVtYmVyLCBTdHJpbmcgdXJpLCBTdHJpbmcga2V5LCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKQotICAgewotICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgICB0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotICAgICB0aGlzLmNvbHVtbk51bWJlciA9IGNvbHVtbk51bWJlcjsKLSAgICAgdGhpcy51cmkgPSB1cmk7Ci0gICAgIHRoaXMua2V5ID0ga2V5OwotCSB0aGlzLm1lc3NhZ2VBcmd1bWVudHMgPSBtZXNzYWdlQXJndW1lbnRzOwotICAgICB0aGlzLnN0YXJ0T2Zmc2V0ID0gMDsgICAgCi0gICB9Ci0gICAKLQotICAvKioKLSAgICogR2V0IHRoZSBtZXNzYWdlIGZvciB0aGlzIHZhbGlhdGlvbiBtZXNzYWdlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbWVzc2FnZSBmb3IgdGhpcyB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjb2x1bW4gbG9jYXRpb24uCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBjb2x1bW4gbnVtYmVyLgotICAgKi8KLSAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKQotICB7Ci0gICAgcmV0dXJuIGNvbHVtbk51bWJlcjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGxpbmUgbG9jYXRpb24uCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsaW5lIG51bWJlci4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpCi0gIHsKLSAgICByZXR1cm4gbGluZU51bWJlcjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHVyaSBmb3IgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHVyaSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRVcmkoKQotICB7Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCBhIG5lc3RlZCB2YWxpZGF0aW9uIG1lc3NhZ2UgdG8gdGhpcyB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaWRhdGlvbk1lc3NhZ2UgVGhlIHZhbGlkYXRpb24gbWVzc2FnZSB0byBhZGQgYXMgYSBuZXN0ZWQgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZE5lc3RlZE1lc3NhZ2UoVmFsaWRhdGlvbk1lc3NhZ2UgdmFsaWRhdGlvbk1lc3NhZ2UpCi0gIHsKLSAgICBpZiAobmVzdGVkRXJyb3JzID09IG51bGwpCi0gICAgewotICAgICAgbmVzdGVkRXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLSAgICBuZXN0ZWRFcnJvcnMuYWRkKHZhbGlkYXRpb25NZXNzYWdlKTsKLSAgICBpbnQgdmFsaWRhaXRvbm1lc3NhZ2VTZXZlcml0eSA9IHZhbGlkYXRpb25NZXNzYWdlLmdldFNldmVyaXR5KCk7Ci0gICAgaWYodmFsaWRhaXRvbm1lc3NhZ2VTZXZlcml0eSA9PSBTRVZfTk9STUFMIHx8IHZhbGlkYWl0b25tZXNzYWdlU2V2ZXJpdHkgPT0gU0VWX0hJR0gpCi0gICAgewotICAgICAgc2V0U2V2ZXJpdHkoU0VWX05PUk1BTCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbGlzdCBvZiBuZXN0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgbmVzdGVkIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXROZXN0ZWRNZXNzYWdlcygpCi0gIHsKLSAgICByZXR1cm4gbmVzdGVkRXJyb3JzICE9IG51bGwgPyBuZXN0ZWRFcnJvcnMgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBzZXZlcml0eSBvZiB0aGUgZGVmZWN0LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgc2V2ZXJpdHkgb2YgdGhlIGRlZmVjdC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKQotICB7Ci0gIAlyZXR1cm4gc2V2ZXJpdHk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIHNldiBUaGUgc2V2ZXJpdHkgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2V2ZXJpdHkoaW50IHNldikKLSAgewotICAJc2V2ZXJpdHkgPSBzZXY7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCBvZmZzZXQpCi0gIHsKLSAgICB0aGlzLnN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OwotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBrZXkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gIHsKLSAgICByZXR1cm4ga2V5OwotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0W10gZ2V0TWVzc2FnZUFyZ3VtZW50cygpCi0gIHsKLQkgIHJldHVybiB0aGlzLm1lc3NhZ2VBcmd1bWVudHM7Ci0gIH0KLSAgCi0KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkKLSAgewotICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9WYWxpZGF0aW9uUmVwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL1ZhbGlkYXRpb25SZXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJiMTU3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL1ZhbGlkYXRpb25SZXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciBhIHZhbGlkYXRpb24gcmVwb3J0LgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvblJlcG9ydAotewotICAvKioKLSAgICogUmV0dXJucyB0aGUgVVJJIGZvciB0aGUgZmlsZSB0aGUgcmVwb3J0IHJlZmVycyB0by4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIFVSSSBmb3IgdGhlIGZpbGUgdGhlIHJlcG9ydCByZWZlcnMgdG8uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEZpbGVVUkkoKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGZpbGUgaXMgdmFsaWQuIFRoZSBmaWxlIG1heSBoYXZlIHdhcm5pbmdzIGFzc29jaWF0ZWQgd2l0aCBpdC4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZmlsZSBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqIAotICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2VbXSBnZXRWYWxpZGF0aW9uTWVzc2FnZXMoKTsKLSAgCi0gIHB1YmxpYyBIYXNoTWFwIGdldE5lc3RlZE1lc3NhZ2VzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9Db21tYW5kTGluZUxvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9sb2dnaW5nL0NvbW1hbmRMaW5lTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMzhmMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9sb2dnaW5nL0NvbW1hbmRMaW5lTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmxvZ2dpbmc7Ci0KLS8qKgotICogQSBsb2dnZXIgdGhhdCB3aWxsIHByaW50IGxvZyBpbmZvIHRvIFN5c3RlbS5vdXQuCi0gKiAKLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRMaW5lTG9nZ2VyIGltcGxlbWVudHMgSUxvZ2dlcgotewotICBwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgZXJyb3IsIFRocm93YWJsZSBleGNlcHRpb24pCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oZXJyb3IpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbihleGNlcHRpb24udG9TdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBsb2dXYXJuaW5nKFN0cmluZyB3YXJuaW5nLCBUaHJvd2FibGUgZXhjZXB0aW9uKQotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKHdhcm5pbmcpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbihleGNlcHRpb24udG9TdHJpbmcoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9FY2xpcHNlTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2xvZ2dpbmcvRWNsaXBzZUxvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzNjZjJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9FY2xpcHNlTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotCi0KLS8qKgotICogQSBsb2dnZXIgdGhhdCB3aWxsIGxvZyB0byB0aGUgbG9nIGZpbGUgaW4gdGhlIGVjbGlwc2UgbWV0YWRhdGEgZGlyZWN0b3J5LgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxvZ2dlciBpbXBsZW1lbnRzIElMb2dnZXIKLXsKLSAgCi0gIHB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvciwgVGhyb3dhYmxlIGV4Y2VwdGlvbikKLSAgewotICAgIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLkVSUk9SLCBlcnJvciwgZXhjZXB0aW9uKSk7Ci0gIH0KLSAKLSAgcHVibGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgd2FybmluZywgVGhyb3dhYmxlIGV4Y2VwdGlvbikKLSAgewotICAgIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuV0FSTklORywgd2FybmluZywgZXhjZXB0aW9uKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9JTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2xvZ2dpbmcvSUxvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODFhNDEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9JTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5sb2dnaW5nOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgc3RhbmRhcmQgbG9nZ2VyLiBBbGxvd3MgZm9yIGxvZ2dpbmcgZXJyb3JzIGFuZCB3YXJuaW5ncy4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMb2dnZXIKLXsKLSAgLyoqCi0gICAqIExvZyBhbiBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciBtZXNzYWdlIHRvIGxvZy4KLSAgICogQHBhcmFtIGV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvciwgVGhyb3dhYmxlIGV4Y2VwdGlvbik7Ci0KLSAgLyoqCi0gICAqIExvZyBhIHdhcm5pbmcgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSB3YXJuaW5nIFRoZSB3YXJuaW5nIG1lc3NhZ2UgdG8gbG9nLgotICAgKiBAcGFyYW0gZXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdG8gbG9nLgotICAgKi8KLSAgcHVibGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgd2FybmluZywgVGhyb3dhYmxlIGV4Y2VwdGlvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2xvZ2dpbmcvTG9nZ2VyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9sb2dnaW5nL0xvZ2dlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE1NDllMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2xvZ2dpbmcvTG9nZ2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmxvZ2dpbmc7Ci0KLS8qKgotICogVGhlIGxvZ2dlciBmYWN0b3J5IGFsbG93cyBmb3Igc2ltcGxlIHVzZSBvZiB3aGF0ZXZlciBsb2dnaW5nIG1lY2hhbmlzbSBpcyBpbgotICogcGxhY2UuIFRoZSB0b29sIGNhbiBzcGVjaWZ5IGEgY3VzdG9tIGxvZ2dpbmcgY2xhc3MgYW5kIGNhbiByZXF1ZXN0IHRoZQotICogbG9nZ2VyIGZyb20gdGhpcyBjbGFzcy4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICogCi0gKiBAZGVwcmVjYXRlZCAtIG5vdCB1c2VkIGluIFdUUCBvciBieSBhbnkgYWRvcHRlcnMgYXMgb2YgOS8xMi8yMDA3Ci0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXJGYWN0b3J5Ci17Ci0gIHByaXZhdGUgc3RhdGljIElMb2dnZXIgICAgICBsb2dnZXIgICAgICAgICAgICA9IG51bGw7Ci0gIHByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyICBjbGFzc2xvYWRlciAgICAgICA9IG51bGw7Ci0gIHByaXZhdGUgc3RhdGljIFN0cmluZyAgICAgICBsb2dnZXJDbGFzcyAgICAgICA9IG51bGw7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBjb21tYW5kbGluZWxvZ2dlciA9ICJvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5sb2dnaW5nLkNvbW1hbmRMaW5lTG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZWNsaXBzZWxvZ2dlciAgICAgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUubG9nZ2luZy5FY2xpcHNlTG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgICAgICAgZGVmYXVsdGxvZ2dlciAgICAgPSBjb21tYW5kbGluZWxvZ2dlcjsKLQotICAvKioKLSAgICogR2V0IHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIGxvZ2dlci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgbG9nZ2VyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJTG9nZ2VyIGdldExvZ2dlckluc3RhbmNlKCkKLSAgewotICAgIGlmKGxvZ2dlciA9PSBudWxsKQotICAgIHsKLSAgICAgIGlmKGxvZ2dlckNsYXNzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmKGNsYXNzbG9hZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyBsYyA9IGNsYXNzbG9hZGVyLmxvYWRDbGFzcyhsb2dnZXJDbGFzcyk7Ci0gICAgICAgICAgICBsb2dnZXIgPSAoSUxvZ2dlcikgbGMubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYobG9nZ2VyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyBsYyA9IExvZ2dlckZhY3RvcnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MobG9nZ2VyQ2xhc3MpOwotICAgICAgICAgICAgbG9nZ2VyID0gKElMb2dnZXIpIGxjLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZihsb2dnZXIgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBDbGFzcyBsYyA9IExvZ2dlckZhY3RvcnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoZGVmYXVsdGxvZ2dlcik7Ci0gICAgICAgICAgbG9nZ2VyID0gKElMb2dnZXIpIGxjLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxvZ2dlcjsKLSAgfQotCi0gIC8qKgotICAgKiBTcGVjaWZ5IHRoZSBsb2dnZXIgaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZC4KLSAgICogCi0gICAqIEBwYXJhbSBjbGFzc25hbWUKLSAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgbG9nZ2VyIGNsYXNzLgotICAgKiBAcGFyYW0gbG9nZ2VyY2xhc3Nsb2FkZXIKLSAgICogICAgICAgICAgICBUaGUgY2xhc3Nsb2FkZXIgdG8gdXNlIHRvIGxvYWQgdGhlIGxvZ2dlci4gSWYgbnVsbCwgdGhlIGRlZmF1bHQKLSAgICogICAgICAgICAgICBjbGFzc2xvYWRlciB3aWxsIGJlIHVzZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc3BlY2lmeUxvZ2dlcihTdHJpbmcgY2xhc3NuYW1lLCBDbGFzc0xvYWRlciBsb2dnZXJjbGFzc2xvYWRlcikKLSAgewotICAgIGxvZ2dlckNsYXNzID0gY2xhc3NuYW1lOwotICAgIGNsYXNzbG9hZGVyID0gbG9nZ2VyY2xhc3Nsb2FkZXI7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBkZWZhdWx0IGxvZ2dlciB0byB0aGUgZWNsaXBzZSBsb2dnZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgdXNlRWNsaXBzZUxvZ2dlcigpCi0gIHsKLSAgICBkZWZhdWx0bG9nZ2VyID0gZWNsaXBzZWxvZ2dlcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9FcnJvckN1c3RvbWl6YXRpb25QbHVnaW5SZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9FcnJvckN1c3RvbWl6YXRpb25QbHVnaW5SZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGE2NDgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvRXJyb3JDdXN0b21pemF0aW9uUGx1Z2luUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb24uRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uLkVycm9yTWVzc2FnZUN1c3RvbWl6ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIHRoZSBwbHVnLWluIG1hbmlmZXN0cyBhbmQgcmVnaXN0ZXJzIGVhY2ggZXh0ZW5zaW9uCi0gKiBlcnJvciBjdXN0b21pemVyIHdpdGggdGhlIEVycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5LgotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JDdXN0b21pemF0aW9uUGx1Z2luUmVnaXN0cnlSZWFkZXIgewotCQotCSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQkgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImVycm9yQ3VzdG9taXplciI7IC8vJE5PTi1OTFMtMSQKLQkgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIHRhZ05hbWUgPSBFWFRFTlNJT05fUE9JTlRfSUQ7Ci0KLQkgIC8qKgotCSAgICogUmVhZCBmcm9tIHBsdWdpbiByZWdpc3RyeSBmb3IgdGhlIGVycm9yY3VzdG9taXplciBleHRlbnNpb24uCi0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0JICB7Ci0JICAgIElFeHRlbnNpb25SZWdpc3RyeSBwbHVnaW5SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IHBsdWdpblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkgICAgaWYgKHBvaW50ICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0JICAgICAgewotCSAgICAgICAgcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCSAgICAgIH0KLQkgICAgfQotCSAgfQotCi0JICAvKioKLQkgICAqIHJlYWRFbGVtZW50KCkgLSBwYXJzZSBhbmQgZGVhbCB3aXRoIGFuIGV4dGVuc2lvbiBsaWtlOgotCSAgICoKLQkgICAqIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5lcnJvckN1c3RvbWl6ZXIiCi0JICAgKiAgICAgICAgICAgIGlkPSJzcGVjaWZpY0Vycm9yQ3VzdG9taXplciIKLQkgICAqICAgICAgICAgICAgbmFtZT0iU3BlY2lmaWMgRXJyb3IgQ3VzdG9taXplciI+Ci0JICAgKiAgIDxlcnJvckN1c3RvbWl6ZXIKLQkgICAqICAgCQkJbmFtZXNwYWNlPSJodHRwOi8vc3BlY2lmaWNuYW1lc3BhY2UiCi0JICAgKiAgIAkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuTXlTcGVjaWZpY0Vycm9yQ3VzdG9taXplci8+Ci0JICAgKiA8L2V4dGVuc2lvbj4KLQkgICAqLwotCSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0JICB7Ci0JICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHModGFnTmFtZSkpCi0JICAgIHsKLQkgICAgICBTdHJpbmcgZXJyb3JDdXN0b21pemVyQ2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTkFNRVNQQUNFKTsKLQotCSAgICAgIGlmIChlcnJvckN1c3RvbWl6ZXJDbGFzcyAhPSBudWxsKQotCSAgICAgIHsKLQkgICAgICAgIHRyeQotCSAgICAgICAgewotCSAgICAgICAgICBCdW5kbGUgcGx1Z2luQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkpOwotCSAgICAgICAgICBFcnJvck1lc3NhZ2VDdXN0b21pemVyRGVsZWdhdGUgZGVsZWdhdGUgPSBuZXcgRXJyb3JNZXNzYWdlQ3VzdG9taXplckRlbGVnYXRlKHBsdWdpbkJ1bmRsZSwgZXJyb3JDdXN0b21pemVyQ2xhc3MpOwotCSAgICAgICAgICBFcnJvckN1c3RvbWl6YXRpb25SZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmFkZEVycm9yTWVzc2FnZUN1c3RvbWl6ZXIobmFtZXNwYWNlLCBkZWxlZ2F0ZSk7Ci0JICAgICAgICB9Ci0JICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JICAgICAgICB7Ci0JICAgICAgICB9Ci0JICAgICAgfQotCSAgICB9Ci0JICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlhY2IzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlhNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlhNTFZhbGlkYXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLk5lc3RlZFZhbGlkYXRvckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25SZXBvcnQ7Ci0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdE5lc3RlZFZhbGlkYXRvcgotewotICBwcm90ZWN0ZWQgaW50IGluZGljYXRlTm9HcmFtbWFyID0gMDsKLSAgCi0gIC8qKgotICAgKiBTZXQgYW55IHByZWZlcmVuY2VzIGZvciBYTUwgdmFsaWRhdGlvbi4KLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvciNzZXR1cFZhbGlkYXRpb24ob3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0KQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0dXBWYWxpZGF0aW9uKE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgCi0gIHsKLQlzdXBlci5zZXR1cFZhbGlkYXRpb24oY29udGV4dCk7Ci0JaW5kaWNhdGVOb0dyYW1tYXIgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklORElDQVRFX05PX0dSQU1NQVIpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IjdmFsaWRhdGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5pby5JbnB1dFN0cmVhbSwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0KQotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW5wdXRzdHJlYW0sIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkKLSAgewotICAgIHJldHVybiB2YWxpZGF0ZSh1cmksIGlucHV0c3RyZWFtLCBjb250ZXh0LCBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0c3RyZWFtLCBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQsIFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0KQotICB7Ci0gICAgWE1MVmFsaWRhdG9yIHZhbGlkYXRvciA9IFhNTFZhbGlkYXRvci5nZXRJbnN0YW5jZSgpOwotCi0gICAgWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBYTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbigpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGNvbmZpZ3VyYXRpb24uc2V0RmVhdHVyZShYTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5JTkRJQ0FURV9OT19HUkFNTUFSLCBpbmRpY2F0ZU5vR3JhbW1hcik7Ci0gICAgfQotICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIFRPRE86IFVuYWJsZSB0byBzZXQgdGhlIHByZWZlcmVuY2UuIExvZyB0aGlzIHByb2JsZW0uCi0gICAgfQotICAgIAotICAgIFhNTFZhbGlkYXRpb25SZXBvcnQgdmFscmVwb3J0ID0gbnVsbDsKLSAgICBpZiAoaW5wdXRzdHJlYW0gIT0gbnVsbCkKLSAgICB7Ci0gICAgICB2YWxyZXBvcnQgPSB2YWxpZGF0b3IudmFsaWRhdGUodXJpLCBpbnB1dHN0cmVhbSwgY29uZmlndXJhdGlvbiwgcmVzdWx0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHZhbHJlcG9ydCA9IHZhbGlkYXRvci52YWxpZGF0ZSh1cmksIG51bGwsIGNvbmZpZ3VyYXRpb24sIHJlc3VsdCk7Ci0gICAgfQotICAgICAgICAgICAgICAKLSAgICByZXR1cm4gdmFscmVwb3J0OwotICB9Ci0JICAKLSAgLyoqCi0gICAqIFN0b3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIG1lc3NhZ2UgcGFyYW1ldGVycy4gRm9yIFhNTCB2YWxpZGF0aW9uIHRoZXJlCi0gICAqIGFyZSB0aHJlZSBhZGRpdGlvbmFsIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiB0byBzdG9yZToKLSAgICogcGFyYW1bMF0gPSB0aGUgY29sdW1uIG51bWJlciBvZiB0aGUgZXJyb3IKLSAgICogcGFyYW1bMV0gPSB0aGUgJ3NxdWlnZ2xlIHNlbGVjdGlvbiBzdHJhdGVneScgZm9yIHdoaWNoIERPTSBwYXJ0IHRvIHNxdWlnZ2xlCi0gICAqIHBhcmFtWzJdID0gdGhlIG5hbWUgb3IgdmFsdWUgb2Ygd2hhdCBpcyB0byBiZSBzcXVpZ2dsZWQKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvciNhZGRJbmZvVG9NZXNzYWdlKG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2UsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRJbmZvVG9NZXNzYWdlKFZhbGlkYXRpb25NZXNzYWdlIHZhbGlkYXRpb25NZXNzYWdlLCBJTWVzc2FnZSBtZXNzYWdlKQotICB7IAotCVN0cmluZyBrZXkgPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRLZXkoKTsKLQlpZihrZXkgIT0gbnVsbCkKLQl7Ci0gICAgICBYTUxNZXNzYWdlSW5mb0hlbHBlciBtZXNzYWdlSW5mb0hlbHBlciA9IG5ldyBYTUxNZXNzYWdlSW5mb0hlbHBlcigpOwotICAgICAgU3RyaW5nW10gbWVzc2FnZUluZm8gPSBtZXNzYWdlSW5mb0hlbHBlci5jcmVhdGVNZXNzYWdlSW5mbyhrZXksIHZhbGlkYXRpb25NZXNzYWdlLmdldE1lc3NhZ2VBcmd1bWVudHMoKSk7Ci0gICAgICAKLSAgICAgIG1lc3NhZ2Uuc2V0QXR0cmlidXRlKENPTFVNTl9OVU1CRVJfQVRUUklCVVRFLCBuZXcgSW50ZWdlcih2YWxpZGF0aW9uTWVzc2FnZS5nZXRDb2x1bW5OdW1iZXIoKSkpOwotICAgICAgbWVzc2FnZS5zZXRBdHRyaWJ1dGUoU1FVSUdHTEVfU0VMRUNUSU9OX1NUUkFURUdZX0FUVFJJQlVURSwgbWVzc2FnZUluZm9bMF0pOwotICAgICAgbWVzc2FnZS5zZXRBdHRyaWJ1dGUoU1FVSUdHTEVfTkFNRV9PUl9WQUxVRV9BVFRSSUJVVEUsIG1lc3NhZ2VJbmZvWzFdKTsKLQl9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWE1MTWVzc2FnZUluZm9IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWE1MTWVzc2FnZUluZm9IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU4MjUxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hNTE1lc3NhZ2VJbmZvSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotLyoqCi0gKiBUaGUgbWVzc2FnZSBpbmZvIGhlbHBlciBkZXRlcm1pbmVzIHRoZSBzZWxlY3Rpb24gc3RyYXRlZ3kgZm9yIGVsZW1lbnRzCi0gKiBpbiBhIFNTRSBlZGl0b3IuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgWE1MTWVzc2FnZUluZm9IZWxwZXIKLXsKLSAgcHVibGljIFhNTE1lc3NhZ2VJbmZvSGVscGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHNob3VsZCBiZSB1bmRlcmxpbmVkIHdpdGggdGhlIHJlZCAic3F1aWdnbGVzIgotICAgKiAgdXNpbmcgdGhlIGVycm9yS2V5LCBhbmQgdGhlIG1lc3NhZ2VBcmd1bWVudHMuCi0gICAqICA8YnI+UG9zaXRpb24gMCBvZiB0aGUgYXJyYXkgcmV0dXJuZWQgY29udGFpbnMgdGhlIHNlbGVjdGlvbiBTdHJhdGVneSwgb3Igd2hhdCBET00gRWxlbWVudCB0byB1bmRlcmxpbmUuICAKLSAgICogIEZvciBleGFtcGxlICJBVFRSSUJVVEVfTkFNRSIgIAotICAgKiAgPGJyPlBvc2l0aW9uIDEgY29udGFpbnMgdGhlIG5hbWUgb3IgdmFsdWUgdG8gc3F1aWdnbGUuCi0gICAqICA8cD5Gb3IgZXhhbXBsZSwgaWYgd2Ugd2FudGVkIHRvIHNxdWlnZ2xlIHRoZSBhdHRyaWJ1dGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgbmFtZQotICAgKiAgZm9vIHRoaXMgbWV0aG9kIHdvdWxkIHJldHVybiB7IkFUVFJJQlVURV9OQU1FIiwgImZvbyJ9Ci0gICAqICA8L3A+Ci0gICAqICBAcGFyYW0gZXJyb3JLZXkgCi0gICAqICAJCVRoZSBlcnJvciBrZXkgZ2l2ZW4gYnkgdGhlIFhlcmNlcyBwYXJzZXIuCi0gICAqICBAcGFyYW0gbWVzc2FnZUFyZ3VtZW50cyAKLSAgICogIAkJVGhlIGFyZ3VtZW50cyB1c2VkIGJ5IFhlcmNlcyB0byAiZmlsbCBpbiB0aGUgYmxhbmtzIiBvZiB0aGVpciBtZXNzYWdlcy4KLSAgICogIEByZXR1cm4gCi0gICAqICAJCUFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHNxdWlnZ2xlIGluZm9ybWF0aW9uLgotICAgKiAgQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvcgotICAgKiAgCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gY3JlYXRlTWVzc2FnZUluZm8oU3RyaW5nIGVycm9yS2V5LCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKQotICB7IAotICAgIFN0cmluZyBzZWxlY3Rpb25TdHJhdGVneSA9IG51bGw7Ci0gICAgU3RyaW5nIG5hbWVPclZhbHVlID0gbnVsbDsKLSAgICAKLSAgICBpZihlcnJvcktleSAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlcnJvcktleS5lcXVhbHMoImN2Yy1jb21wbGV4LXR5cGUuMi40LmEiKSB8fCBlcnJvcktleS5lcXVhbHMoImN2Yy1jb21wbGV4LXR5cGUuMi40LmQiKSB8fCBlcnJvcktleS5lcXVhbHMoImN2Yy1jb21wbGV4LXR5cGUuMi40LmIiKSB8fCBlcnJvcktleS5lcXVhbHMoIk1TR19DT05URU5UX0lOVkFMSUQiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0gICAgICAgIHwgZXJyb3JLZXkuZXF1YWxzKCJNU0dfQ09OVEVOVF9JTkNPTVBMRVRFIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJNU0dfUkVRVUlSRURfQVRUUklCVVRFX05PVF9TUEVDSUZJRUQiKSB8fCBlcnJvcktleS5lcXVhbHMoImN2Yy1jb21wbGV4LXR5cGUuNCIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgewotICAgICAgICBzZWxlY3Rpb25TdHJhdGVneSA9ICJTVEFSVF9UQUciOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoImN2Yy10eXBlLjMuMS4zIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uU3RyYXRlZ3kgPSAiVEVYVCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLWNvbXBsZXgtdHlwZS4yLjMiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgIAlzZWxlY3Rpb25TdHJhdGVneSA9ICJGSVJTVF9OT05fV0hJVEVTUEFDRV9URVhUIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtdHlwZS4zLjEuMSIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvblN0cmF0ZWd5ID0gIkFMTF9BVFRSSUJVVEVTIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjMuMi4yIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJNU0dfQVRUUklCVVRFX05PVF9ERUNMQVJFRCIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uU3RyYXRlZ3kgPSAiQVRUUklCVVRFX05BTUUiOyAvLyROT04tTkxTLTEkCi0JICAgIC8vaW4gdGhpcyBjYXNlIHdlIG5lZWQgbmFtZU9yVmFsdWUgdG8gYmUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byB1bmRlcmxpbmUKLQkgICAgbmFtZU9yVmFsdWUgPSAoU3RyaW5nKW1lc3NhZ2VBcmd1bWVudHNbMV07Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoImN2Yy1hdHRyaWJ1dGUuMyIpIHx8IGVycm9yS2V5LmVxdWFscygiTVNHX0FUVFJJQlVURV9WQUxVRV9OT1RfSU5fTElTVCIpIHx8IGVycm9yS2V5LmVxdWFscygiY3ZjLWNvbXBsZXgtdHlwZS4zLjEiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIHsJCi0gICAgCXNlbGVjdGlvblN0cmF0ZWd5ID0gIkFUVFJJQlVURV9WQUxVRSI7ICAgLy8kTk9OLU5MUy0xJAotCQkvL2luIHRoaXMgY2FzZSB3ZSBuZWVkIG5hbWVPclZhbHVlIHRvIGJlIHRoZSBuYW1lIG9mIHRoZSBBdHRyaWJ1dGUKLSAgICAJaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLWF0dHJpYnV0ZS4zIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjMuMSIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAJeyAKLSAgICAJICBuYW1lT3JWYWx1ZSA9IChTdHJpbmcpbWVzc2FnZUFyZ3VtZW50c1sxXTsKLSAgICAJfQotICAgIAllbHNlIGlmIChlcnJvcktleS5lcXVhbHMoIk1TR19BVFRSSUJVVEVfVkFMVUVfTk9UX0lOX0xJU1QiKSkgLy8kTk9OLU5MUy0xJAotICAgIAl7CQotICAgIAkgIG5hbWVPclZhbHVlID0gKFN0cmluZyltZXNzYWdlQXJndW1lbnRzWzBdOwotICAgIAl9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoImN2Yy1lbHQuNC4yIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsJCi0gICAgCXNlbGVjdGlvblN0cmF0ZWd5PSJWQUxVRV9PRl9BVFRSSUJVVEVfV0lUSF9HSVZFTl9WQUxVRSI7IC8vJE5PTi1OTFMtMSQKLQkJLy9pbiB0aGlzIGNhc2Ugd2UgbmVlZCBuYW1lT3JWYWx1ZSB0byBiZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSB3ZSB3YW50IHRvIHVuZXJsaW5lCi0gICAgCW5hbWVPclZhbHVlID0gKFN0cmluZyltZXNzYWdlQXJndW1lbnRzWzFdOwkKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiRW50aXR5Tm90RGVjbGFyZWQiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgeyAgCQotICAgIAlzZWxlY3Rpb25TdHJhdGVneT0iVEVYVF9FTlRJVFlfUkVGRVJFTkNFIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBuYW1lT3JWYWx1ZSA9IChTdHJpbmcpbWVzc2FnZUFyZ3VtZW50c1swXTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiRWxlbWVudFVudGVybWluYXRlZCIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvblN0cmF0ZWd5ID0gIkVOVElSRV9FTEVNRU5UIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJFVGFnVW50ZXJtaW5hdGVkIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJFVGFnUmVxdWlyZWQiKSkgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uU3RyYXRlZ3kgPSAiRU5EX1RBRyI7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLSAgICBTdHJpbmcgbWVzc2FnZUluZm9bXSA9IG5ldyBTdHJpbmdbMl07Ci0gICAgbWVzc2FnZUluZm9bMF0gPSBzZWxlY3Rpb25TdHJhdGVneSAhPSBudWxsPyBzZWxlY3Rpb25TdHJhdGVneTogIiI7IC8vJE5PTi1OTFMtMSQKLSAgICBtZXNzYWdlSW5mb1sxXSA9IG5hbWVPclZhbHVlOwotICAgIHJldHVybiBtZXNzYWdlSW5mbzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YTUxWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWE1MVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ODEwNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YTUxWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotCi0vKioKLSAqIEFuIFhNTCB2YWxpZGF0b3Igc3BlY2lmaWMgdG8gRWNsaXBzZS4gVGhpcyB2YWxpZGF0b3Igd2lsbCB3cmFwIHRoZSBpbnRlcm5hbAotICogWE1MIHZhbGlkYXRvciBhbmQgcHJvdmlkZSBhdXRvbWF0aWMgVVJJIHJlc29sdXRpb24gc3VwcG9ydC4gVGhpcyBjbGFzcyBhbHNvCi0gKiByZWFkcyBmcm9tIHRoZSBwbHVnLWluIHJlZ2lzdHJ5IGFuZCByZWdpc3RlcnMgYWxsIGVycm9yIGN1c3RvbWl6ZXJzIHdpdGggdGhlCi0gKiByZWdpc3RyeS4KLSAqLwotcHVibGljIGNsYXNzIFhNTFZhbGlkYXRvciBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlhNTFZhbGlkYXRvcgotewotICBwcml2YXRlIHN0YXRpYyBYTUxWYWxpZGF0b3IgaW5zdGFuY2UgPSBudWxsOwotICAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBYTUwgdmFsaWRhdG9yLiBUaGUgdmFsaWRhdG9yCi0gICAqIGNhbiBiZSByZXVzZWQgYW5kIGNhbm5vdCBiZSBjdXN0b21pemVkIHNvIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSBpbnN0YW5jZSBvZiBpdC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgWE1MIHZhbGlkYXRvci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgWE1MVmFsaWRhdG9yIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmKGluc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgaW5zdGFuY2UgPSBuZXcgWE1MVmFsaWRhdG9yKCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotICAvKioKLSAgICogQ29uc3RydWN0b3IuIENyZWF0ZSB0aGUgWE1MIHZhbGlkYXRvciwgc2V0IHRoZSBVUkkgcmVzb2x2ZXIgYW5kCi0gICAqIGdldCB0aGUgZXh0ZW5zaW9uIGVycm9yIGN1c3RvbWl6ZXJzIGZyb20gdGhlIHJlZ2lzdHJ5LgotICAgKi8KLSAgcHJvdGVjdGVkIFhNTFZhbGlkYXRvcigpCi0gIHsKLSAgICBzZXRVUklSZXNvbHZlcihVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpKTsKLSAgICBuZXcgRXJyb3JDdXN0b21pemF0aW9uUGx1Z2luUmVnaXN0cnlSZWFkZXIoKS5yZWFkUmVnaXN0cnkoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0VsZW1lbnRJbmZvcm1hdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0VsZW1lbnRJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDljOTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9FbGVtZW50SW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBBIHNpbXBsZSBjbGFzcyB0byBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCBhbiBYTUwgZWxlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRJbmZvcm1hdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIGxvY2FsTmFtZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2U7Ci0gIHByb3RlY3RlZCBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkKLSAgICogCQlUaGUgbmFtZXNwYWNlIFVSSSBvZiB0aGUgZWxlbWVudC4KLSAgICogQHBhcmFtIGxvY2FsTmFtZQotICAgKiAJCVRoZSBsb2NhbCBuYW1lIG9mIHRoZSBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIEVsZW1lbnRJbmZvcm1hdGlvbihTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0gICAgdGhpcy5uYW1lc3BhY2UgPSB1cmk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIG5hbWVzcGFjZSBvZiB0aGlzIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcmV0dXJuCi0gICAqIAkJVGhlIG5hbWVzcGFjZSBvZiB0aGlzIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpCi0gIHsKLQlyZXR1cm4gbmFtZXNwYWNlOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBsb2NhbCBuYW1lIG9mIHRoaXMgZWxlbWVudC4KLSAgICogCi0gICAqIEByZXR1cm4KLSAgICogCQlUaGUgbG9jYWwgbmFtZSBvZiB0aGlzIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvY2FsbmFtZSgpCi0gIHsKLQlyZXR1cm4gbG9jYWxOYW1lOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBsaXN0IG9mIGNoaWxkcmVuIG9mIHRoaXMgZWxlbWVudC4gVGhlIGxpc3QgY29udGFpbnMKLSAgICogRWxlbWVudEluZm9ybWF0aW9uIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBjaGlsZHJlbiBvZiB0aGlzIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcmV0dXJuCi0gICAqIAkJVGhlIGxpc3Qgb2YgY2hpbGRyZW4gb2YgdGhpcyBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKQotICB7Ci0JcmV0dXJuIGNoaWxkcmVuOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0Vycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9FcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NWFjYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0Vycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uTWVzc2FnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHRyYWNrcyB0aGUgY29udGV4dCBvZiB0aGUgcGFyc2VkIGRvY3VtZW50IHRvIGhlbHAgaWRlbnRpZnkgZXJyb3IKLSAqIGNvbmRpdGlvbnMKLSAqLwotcHVibGljIGNsYXNzIEVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIKLXsKLSAgcHJvdGVjdGVkIFN0YWNrIGVsZW1lbnRJbmZvcm1hdGlvblN0YWNrID0gbmV3IFN0YWNrKCk7Ci0gIHByb3RlY3RlZCBFcnJvck1lc3NhZ2VJbmZvcm1hdGlvbiBtZXNzYWdlRm9yQ29uc2lkZXJhdGlvbjsKLQotICAvKioKLSAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbiB0aGUgc3RhcnQgZWxlbWVudCBtZXRob2Qgb2YgdGhlIFhNTCB2YWxpZGF0b3IncwotICAgKiBjb250ZW50IGhhbmRsZXIuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpCi0gICAqIAkJVGhlIG5hbWVzcGFjZSBvZiB0aGUgZWxlbWVudC4KLSAgICogQHBhcmFtIGxvY2FsTmFtZQotICAgKiAJCVRoZSBsb2NhbCBuYW1lIG9mIHRoZSBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsgCi0gICAgRWxlbWVudEluZm9ybWF0aW9uIGVsZW1lbnRJbmZvcm1hdGlvbiA9IG5ldyBFbGVtZW50SW5mb3JtYXRpb24odXJpLCBsb2NhbE5hbWUpOwotICAgIGlmIChlbGVtZW50SW5mb3JtYXRpb25TdGFjay5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIEVsZW1lbnRJbmZvcm1hdGlvbiBwYXJlbnQgPSAoRWxlbWVudEluZm9ybWF0aW9uKSBlbGVtZW50SW5mb3JtYXRpb25TdGFjay5wZWVrKCk7Ci0gICAgICBwYXJlbnQuY2hpbGRyZW4uYWRkKGVsZW1lbnRJbmZvcm1hdGlvbik7Ci0gICAgfQotICAgIGVsZW1lbnRJbmZvcm1hdGlvblN0YWNrLnB1c2goZWxlbWVudEluZm9ybWF0aW9uKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGluIHRoZSBlbmQgZWxlbWVudCBtZXRob2Qgb2YgdGhlIFhNTCB2YWxpZGF0b3IncwotICAgKiBjb250ZW50IGhhbmRsZXIuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpCi0gICAqIAkJVGhlIG5hbWVzcGFjZSBvZiB0aGUgZWxlbWVudC4KLSAgICogQHBhcmFtIGxvY2FsTmFtZQotICAgKiAJCVRoZSBsb2NhbCBuYW1lIG9mIHRoZSBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7ICAgCi0gICAgaWYgKGVsZW1lbnRJbmZvcm1hdGlvblN0YWNrLnNpemUoKSA+IDApCi0gICAgewotICAgICAgRWxlbWVudEluZm9ybWF0aW9uIGVsZW1lbnRJbmZvcm1hdGlvbiA9IChFbGVtZW50SW5mb3JtYXRpb24pZWxlbWVudEluZm9ybWF0aW9uU3RhY2sucG9wKCk7Ci0gICAgICBpZiAobWVzc2FnZUZvckNvbnNpZGVyYXRpb24gIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBJRXJyb3JNZXNzYWdlQ3VzdG9taXplcltdIGN1c3RvbWl6ZXJzID0gRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDdXN0b21pemVycyhlbGVtZW50SW5mb3JtYXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBpbnQgbnVtQ3VzdG9taXplcnMgPSBjdXN0b21pemVycy5sZW5ndGg7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1DdXN0b21pemVyczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBjdXN0b21pemVyc1tpXS5jdXN0b21pemVNZXNzYWdlKGVsZW1lbnRJbmZvcm1hdGlvbiwgbWVzc2FnZUZvckNvbnNpZGVyYXRpb24ua2V5LCBtZXNzYWdlRm9yQ29uc2lkZXJhdGlvbi5hcmd1bWVudHMpOwotICAgICAgICAgIGlmKG1lc3NhZ2UgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgIAltZXNzYWdlRm9yQ29uc2lkZXJhdGlvbi5tZXNzYWdlLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgIAlicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gIAotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDb25zaWRlciB0aGUgcmVwb3J0ZWQgZXJyb3IgZm9yIGN1c3RvbWl6YXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gdmFsSW5mbwotICAgKiAJCVRoZSBjdXJyZW50IFZhbGlkYXRpb25JbmZvIG9iamVjdCBjb250YWluaW5nIHZhbGlkYXRpb24gc3BlY2lmaWMgaW5mb3JtYXRpb24uCi0gICAqIEBwYXJhbSBrZXkKLSAgICogCQlUaGUga2V5IHJlbGF0ZWQgdG8gdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBhcmd1bWVudHMKLSAgICogCQlBbnkgbWVzc2FnZSBhcmd1bWVudHMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBjb25zaWRlclJlcG9ydGVkRXJyb3IoVmFsaWRhdGlvbkluZm8gdmFsSW5mbywgU3RyaW5nIGtleSwgT2JqZWN0W10gYXJndW1lbnRzKQotICB7Ci0gICAgbWVzc2FnZUZvckNvbnNpZGVyYXRpb24gPSBudWxsOwotICAgIFZhbGlkYXRpb25NZXNzYWdlW10gbWVzc2FnZXMgPSB2YWxJbmZvLmdldFZhbGlkYXRpb25NZXNzYWdlcygpOwotICAgIGlmIChtZXNzYWdlcy5sZW5ndGggPiAwKQotICAgIHsgIAotICAgICAgbWVzc2FnZUZvckNvbnNpZGVyYXRpb24gPSBuZXcgRXJyb3JNZXNzYWdlSW5mb3JtYXRpb24oKTsKLSAgICAgIG1lc3NhZ2VGb3JDb25zaWRlcmF0aW9uLmtleSA9IGtleTsKLSAgICAgIG1lc3NhZ2VGb3JDb25zaWRlcmF0aW9uLmFyZ3VtZW50cyA9IGFyZ3VtZW50czsKLSAgICAgIG1lc3NhZ2VGb3JDb25zaWRlcmF0aW9uLm1lc3NhZ2UgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXTsgCi0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogQSBzaW1wbGUgY2xhc3MgdG8gaG9sZCBlcnJvciBtZXNzYWdlIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHVibGljIGNsYXNzIEVycm9yTWVzc2FnZUluZm9ybWF0aW9uCi0gIHsKLQlwdWJsaWMgU3RyaW5nIGtleSA9IG51bGw7Ci0JcHVibGljIE9iamVjdFtdIGFyZ3VtZW50cyA9IG51bGw7Ci0JcHVibGljIFZhbGlkYXRpb25NZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9FcnJvckN1c3RvbWl6YXRpb25SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDk0ODc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9FcnJvckN1c3RvbWl6YXRpb25SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhlIGVycm9yIGN1c3RvbWl6YXRpb24gcmVnc2l0cnkgbWFuYWdlcyBhbGwgcmVnaXN0ZXJlZAotICogSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXJzIGJ5IG5hbWVzcGFjZS4KLSAqLwotcHVibGljIGNsYXNzIEVycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5IAotewotICBwcm90ZWN0ZWQgc3RhdGljIEVycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbnVsbDsKLSAgcHJvdGVjdGVkIE1hcCBjdXN0b21pemVycyA9IG5ldyBIYXNoTWFwKCk7Ci0gIAotICAvKioKLSAgICogUmVzdHJpY3RlZCBjb25zdHJ1Y3RvciBpbiBrZWVwaW5nIHdpdGggdGhlIHNpbmdsZXRvbiBwYXR0ZXJuLgotICAgKi8KLSAgcHJvdGVjdGVkIEVycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5KCkKLSAgewotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIHJlZ2lzdHJ5LgotICAgKiAKLSAgICogQHJldHVybgotICAgKiAJCVRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIHJlZ2lzdHJ5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBFcnJvckN1c3RvbWl6YXRpb25SZWdpc3RyeSBnZXRJbnN0YW5jZSgpCi0gIHsKLQlpZihyZWdpc3RyeSA9PSBudWxsKQotCXsKLQkgIHJlZ2lzdHJ5ID0gbmV3IEVycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5KCk7Ci0JfQotCXJldHVybiByZWdpc3RyeTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCBhIGN1c3RvbWl6ZXIgdG8gdGhlIHJlZ2lzdHJ5LiAKLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UKLSAgICogCQlUaGUgbmFtZXNwYWNlIHRoZSBjdXN0b21pemVyIHdpbGwgYWN0IG9uLgotICAgKiBAcGFyYW0gY3VzdG9taXplcgotICAgKiAJCVRoZSBlcnJvciBjdXN0b21pemVyIHRvIHJlZ2lzdGVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRXJyb3JNZXNzYWdlQ3VzdG9taXplcihTdHJpbmcgbmFtZXNwYWNlLCBJRXJyb3JNZXNzYWdlQ3VzdG9taXplciBjdXN0b21pemVyKQotICB7Ci0JLy8gVG8gcmVnaXN0ZXIgYSBjdXN0b21pemVyIGZvciB0aGUgbm8gbmFtZXNwYWNlIHVzZSBhbiBlbXB0eSBzdHJpbmcuCi0JaWYobmFtZXNwYWNlID09IG51bGwpCi0JewotCSAgbmFtZXNwYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JTGlzdCBjdXN0b21pemVyc0Zvck5TID0gKExpc3QpY3VzdG9taXplcnMuZ2V0KG5hbWVzcGFjZSk7Ci0JaWYoY3VzdG9taXplcnNGb3JOUyA9PSBudWxsKQotCXsKLQkgIGN1c3RvbWl6ZXJzRm9yTlMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICBjdXN0b21pemVycy5wdXQobmFtZXNwYWNlLCBjdXN0b21pemVyc0Zvck5TKTsKLQl9Ci0JaWYoY3VzdG9taXplciAhPSBudWxsKQotCXsKLQkgIGN1c3RvbWl6ZXJzRm9yTlMuYWRkKGN1c3RvbWl6ZXIpOwotCX0KLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgZXJyb3IgY3VzdG9taXplcnMgZm9yIGEgZ2l2ZW4gbmFtZXNwYWNlLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZQotICAgKiAJCVRoZSBuYW1lc3BhY2UgZm9yIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBjdXN0b21pemVycy4KLSAgICogQHJldHVybgotICAgKiAJCUFuIGFycmF5IG9mIGN1c3RvbWl6ZXJzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgbmFtZXNwYWNlLgotICAgKi8KLSAgcHVibGljIElFcnJvck1lc3NhZ2VDdXN0b21pemVyW10gZ2V0Q3VzdG9taXplcnMoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotCWlmKG5hbWVzcGFjZSA9PSBudWxsKQotCXsKLQkgIG5hbWVzcGFjZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCUxpc3QgY3VzdG9taXplcnNGb3JOUyA9IChMaXN0KWN1c3RvbWl6ZXJzLmdldChuYW1lc3BhY2UpOwotCWlmKGN1c3RvbWl6ZXJzRm9yTlMgPT0gbnVsbCkKLQl7Ci0JICBjdXN0b21pemVyc0Zvck5TID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQlyZXR1cm4gKElFcnJvck1lc3NhZ2VDdXN0b21pemVyW10pY3VzdG9taXplcnNGb3JOUy50b0FycmF5KG5ldyBJRXJyb3JNZXNzYWdlQ3VzdG9taXplcltjdXN0b21pemVyc0Zvck5TLnNpemUoKV0pOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRXJyb3JNZXNzYWdlQ3VzdG9taXplckRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRXJyb3JNZXNzYWdlQ3VzdG9taXplckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MTQ3YzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0Vycm9yTWVzc2FnZUN1c3RvbWl6ZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQW4gZXJyb3IgbWVzc2FnZSBjdXN0b21pemVyIGRlbGVnYXRlIGlzIHVzZWQgdG8gYWxsb3cgZm9yCi0gKiBsYXp5IGxvYWRpbmcgb2YgZXJyb3IgY3VzdG9taXplcnMuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JNZXNzYWdlQ3VzdG9taXplckRlbGVnYXRlIGltcGxlbWVudHMgSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXIKLXsKLSAgcHJvdGVjdGVkIEJ1bmRsZSBidW5kbGUgPSBudWxsOwotICBwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzbmFtZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBJRXJyb3JNZXNzYWdlQ3VzdG9taXplciBjdXN0b21pemVyID0gbnVsbDsKLSAgCi0gIHB1YmxpYyBFcnJvck1lc3NhZ2VDdXN0b21pemVyRGVsZWdhdGUoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGNsYXNzbmFtZSkKLSAgewotCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCXRoaXMuY2xhc3NuYW1lID0gY2xhc3NuYW1lOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbi5JRXJyb3JNZXNzYWdlQ3VzdG9taXplciNjdXN0b21pemVNZXNzYWdlKG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbi5FbGVtZW50SW5mb3JtYXRpb24sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3RbXSkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgY3VzdG9taXplTWVzc2FnZShFbGVtZW50SW5mb3JtYXRpb24gZWxlbWVudEluZm8sIFN0cmluZyBlcnJvcktleSwgT2JqZWN0W10gYXJndW1lbnRzKSAKLSAgewotCWlmKGN1c3RvbWl6ZXIgPT0gbnVsbCkKLQl7Ci0JICBsb2FkQ3VzdG9taXplcigpOwotCX0KLQlpZihjdXN0b21pemVyID09IG51bGwpCi0JewotCSAgcmV0dXJuIG51bGw7Ci0JfQotCXJldHVybiBjdXN0b21pemVyLmN1c3RvbWl6ZU1lc3NhZ2UoZWxlbWVudEluZm8sIGVycm9yS2V5LCBhcmd1bWVudHMpOwotICB9Ci0gIAotICAvKioKLSAgICogTG9hZCB0aGUgY3VzdG9taXplciBjbGFzcy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGxvYWRDdXN0b21pemVyKCkKLSAgewotCXRyeQotCXsKLQkgIENsYXNzIGN1c3RvbWl6ZXJDbGFzcyA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NuYW1lKTsKLQkgIGN1c3RvbWl6ZXIgPSAoSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXIpY3VzdG9taXplckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0JfQotCWNhdGNoKEV4Y2VwdGlvbiBlKQotCXsKLQkgIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZygKLQkJCSAgbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIAotCQkJCQkgICAgIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAKLQkJCQkJICAgICBJU3RhdHVzLk9LLCAKLQkJCQkJICAgICAiVGhlIFhNTCB2YWxpZGF0b3IgZXJyb3IgY3VzdG9taXplciB3YXMgdW5hYmxlIHRvIGxvYWQgY2xhc3MgIiArIGNsYXNzbmFtZSwgZSkpOyAvLyROT04tTkxTLTEkCi0JfQotICB9Ci0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9JRXJyb3JNZXNzYWdlQ3VzdG9taXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0lFcnJvck1lc3NhZ2VDdXN0b21pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNmQxZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0lFcnJvck1lc3NhZ2VDdXN0b21pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbjsKLQotLyoqCi0gKiBBbiBlcnJvciBtZXNzYWdlIGN1c3RvbWl6ZXIgd2lsbCBiZSBjYWxsZWQgYnkgdGhlIFhNTCB2YWxpZGF0b3IgdG8gY3VzdG9taXplCi0gKiBYTUwgdmFsaWRhdGlvbiBlcnJvcnMgZm9yIGEgZ2l2ZW4gbmFtZXNwYWNlLiBUaGUgY3VzdG9taXplciBjYW4gYmUgdXNlZCB0byAKLSAqIGNyZWF0ZSBjbGVhcmVyIGVycm9ycyBmb3Igc3BlY2lmaWMgYXBwbGljYXRpb24gZG9tYWlucy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJRXJyb3JNZXNzYWdlQ3VzdG9taXplciAKLXsKLSAgLyoqCi0gICAqIFJldHVybiBhIGN1c3RvbWl6ZWQgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuIE51bGwgc2hvdWxkIGJlIHJldHVybmVkCi0gICAqIGlmIHRoZSBtZXNzYWdlIHNob3VsZCBub3QgYmUgY3VzdG9taXplZC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50SW5mb3JtYXRpb24KLSAgICogCQlUaGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGN1c3RvbWl6ZSB0aGUgZXJyb3IuCi0gICAqIEBwYXJhbSBlcnJvcktleQotICAgKiAJCVRoZSBrZXkgZm9yIHRoZSBlcnJvciBmb3Igd2hpY2ggdG8gcmVwbGFjZSB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGFyZ3VtZW50cwotICAgKiAJCUFyZ3VtZW50cyByZWxhdGVkIHRoZSB0aGUgZXJyb3IgbWVzc2FnZS4KLSAgICogQHJldHVybgotICAgKiAJCUEgY3VzdG9taXplZCBlcnJvciBtZXNzYWdlIG9yIG51bGwgaWYgdGhpcyBjdXN0b21pemVyIHdpbGwgbm90IGN1c3RvbWl6ZSB0aGUgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgY3VzdG9taXplTWVzc2FnZShFbGVtZW50SW5mb3JtYXRpb24gZWxlbWVudEluZm8sIFN0cmluZyBlcnJvcktleSwgT2JqZWN0W10gYXJndW1lbnRzKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL3htbHZhbGlkYXRpb24ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL3htbHZhbGlkYXRpb24ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmYzBjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi94bWx2YWxpZGF0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hLS0gQ29uc3RhbnRzIGZvciBzdHJpbmdzICAKLQotISBVc2FnZToKLSEgICB7MH0gcmVwbGFjZWQgd2l0aCB0aGUgaG9zdCBuYW1lCi0hCi1fVUlfUFJPQkxFTVNfVkFMSURBVElOR19VTktOT1dOX0hPU1QgICAgICAgICAgICAgPSBUaGUgZmlsZSBjYW5ub3QgYmUgdmFsaWRhdGVkIGFzIHRoZSBob3N0ICJ7MH0iIGlzIGN1cnJlbnRseSB1bnJlYWNoYWJsZS4KLQotISBVc2FnZToKLSEgICB7MH0gcmVwbGFjZWQgd2l0aCB0aGUgZmlsZSBuYW1lCi0hCi1fVUlfUFJPQkxFTVNfVkFMSURBVElOR19GSUxFX05PVF9GT1VORCAgICAgICAgICAgPSBUaGUgZmlsZSBjYW5ub3QgYmUgdmFsaWRhdGVkIGFzIHRoZSBYTUwgU2NoZW1hICJ7MH0iIHRoYXQgaXMgc3BlY2lmaWVkIGFzIGRlc2NyaWJpbmcgdGhlIHN5bnRheCBvZiB0aGUgZmlsZSBjYW5ub3QgYmUgbG9jYXRlZC4KLQotX1VJX1BST0JMRU1TX0NPTk5FQ1RJT05fUkVGVVNFRCAgICAgICAgICAgICAgICAgID0gVGhlIGZpbGUgY2Fubm90IGJlIHZhbGlkYXRlZCBhcyB0aGVyZSB3YXMgYSBjb25uZWN0aW9uIHByb2JsZW0uCi0KLSEKLSEgUmVmZXJlbmNlZCBGaWxlIERpYWxvZyBSZWxhdGVkIE1lc3NhZ2UKLSEKLV9VSV9SRUZfRklMRV9FUlJPUl9NRVNTQUdFICAgICAgICAgICAgICAgICAgICAgICA9IFJlZmVyZW5jZWQgZmlsZSBjb250YWlucyBlcnJvcnMgKHswfSkuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmlnaHQgY2xpY2sgb24gdGhlIG1lc3NhZ2UgYW5kIHNlbGVjdCAiU2hvdyBEZXRhaWxzLi4uIgotCi0jIFdhcm5pbmcgd2hlbiBubyBncmFtbWFyIGlzIGxvY2F0ZWQuCi1fV0FSTl9OT19HUkFNTUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBObyBncmFtbWFyIGNvbnN0cmFpbnRzIChEVEQgb3IgWE1MIHNjaGVtYSkgZGV0ZWN0ZWQgZm9yIHRoZSBkb2N1bWVudC4KLSAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMWMyOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1ub3RlYm9vay5qcGFnZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9EZWJ1Z0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0RlYnVnQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY2YjgwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0RlYnVnQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlByb3BhZ2F0aW5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLQotCi1wdWJsaWMgY2xhc3MgRGVidWdBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBEZWJ1Z0FkYXB0ZXJGYWN0b3J5LgotCSAqLwotCXB1YmxpYyBEZWJ1Z0FkYXB0ZXJGYWN0b3J5KCkgewotCQl0aGlzKElEZWJ1Z0FkYXB0ZXIuY2xhc3MsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yICBmb3IgRGVidWdBZGFwdGVyRmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gZkFkYXB0ZXJLZXkKLQkgKiBAcGFyYW0gcmVnaXN0ZXJBZGFwdGVycwotCSAqLwotCXByaXZhdGUgRGVidWdBZGFwdGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIGFkZENvbnRyaWJ1dGVkRmFjdG9yaWVzKElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQkvL25vbmUgZXhwZWN0ZWQKLQl9Ci0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gbmV3IERlYnVnQWRhcHRlckZhY3RvcnkoZ2V0QWRhcHRlcktleSgpLCBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJRXZlcnlOb2RlRGVidWdBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0JCXJlc3VsdCA9IEV2ZXJ5Tm9kZURlYnVnQWRhcHRlci5nZXRJbnN0YW5jZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSUFkYXB0ZXJGYWN0b3J5I2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0KLQkJcmV0dXJuIElEZWJ1Z0FkYXB0ZXIuY2xhc3MgPT0gdHlwZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5I3NldENvbnRyaWJ1dGVkRmFjdG9yaWVzKGphdmEudXRpbC5BcnJheUxpc3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udHJpYnV0ZWRGYWN0b3JpZXMoQXJyYXlMaXN0IGxpc3QpIHsKLQkJLy8gbm9uZSBleHBlY3RlZAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvRXZlcnlOb2RlRGVidWdBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0V2ZXJ5Tm9kZURlYnVnQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWE3MThjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvRXZlcnlOb2RlRGVidWdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuQWJvdXRUb0JlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTmV3RG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5vQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi0KLS8qKgotICogUHVyZWx5IGZvciB1c2UgaW4gZGVidWdnaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBFdmVyeU5vZGVEZWJ1Z0FkYXB0ZXIgaW1wbGVtZW50cyBJRGVidWdBZGFwdGVyIHsKLQotCXN0YXRpYyBjbGFzcyBJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRMaXN0ZW5lciB7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyI2RvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJRGVidWcucHJpbnRsbigiSWRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZDogIiArIGV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIjZG9jdW1lbnRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJJZG9jdW1lbnRDaGFuZ2VkOiAiICsgZXZlbnQpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JfQotCi0Jc3RhdGljIGNsYXNzIEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGltcGxlbWVudHMgSU1vZGVsU3RhdGVMaXN0ZW5lciB7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWwpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkJRGVidWcucHJpbnRsbigibW9kZWxBYm91dFRvQmVDaGFuZ2VkOiAiICsgbW9kZWwpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJCURlYnVnLnByaW50bG4oIm1vZGVsQ2hhbmdlZDogIiArIG1vZGVsKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsLAotCQkgKiAgICAgIGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNEaXJ0eSkgewotCQkJRGVidWcucHJpbnRsbigibW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZDogIiArIG1vZGVsKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsUmVzb3VyY2VEZWxldGVkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkJRGVidWcucHJpbnRsbigibW9kZWxSZXNvdXJjZURlbGV0ZWQ6ICIgKyBtb2RlbCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbFJlc291cmNlTW92ZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWwsCi0JCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklTdHJ1Y3R1cmVkTW9kZWwpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbFJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCwgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCkgewotCQkJRGVidWcucHJpbnRsbigibW9kZWxSZXNvdXJjZU1vdmVkOiAiICsgIm9sZE1vZGVsOiAiICsgb2xkTW9kZWwgKyAibmV3TW9kZWw6ICIgKyBuZXdNb2RlbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCURlYnVnLnByaW50bG4oIm1vZGVsQWJvdXRUb0JlUmVpbml0aWFsaXplZDogIiArICJzdHJ1Y3R1cmVkTW9kZWw6ICIgKyBzdHJ1Y3R1cmVkTW9kZWwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kZWxSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJtb2RlbFJlaW5pdGlhbGl6ZWQ6ICIgKyAic3RydWN0dXJlZE1vZGVsOiAiICsgc3RydWN0dXJlZE1vZGVsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJfQotCi0JfQotCi0Jc3RhdGljIGNsYXNzIEludGVybmFsU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZSBpbXBsZW1lbnRzIElNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciB7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciNtb2RlbEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5BYm91dFRvQmVDaGFuZ2VkRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoQWJvdXRUb0JlQ2hhbmdlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkOiAiICsgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JfQotCi0Jc3RhdGljIGNsYXNzIEludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgewotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIjbmV3TW9kZWwob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5OZXdEb2N1bWVudENvbnRlbnRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCURlYnVnLnByaW50bG4oInN0cnVjdHVyZWREb2N1bWVudENoYW5nZWQgLSBuZXdNb2RlbDogIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI25vQ2hhbmdlKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuTm9DaGFuZ2VFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCURlYnVnLnByaW50bG4oInN0cnVjdHVyZWREb2N1bWVudENoYW5nZWQgLSBub0NoYW5nZTogIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI25vZGVzUmVwbGFjZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCURlYnVnLnByaW50bG4oInN0cnVjdHVyZWREb2N1bWVudENoYW5nZWQgLSBub2Rlc1JlcGxhY2VkOiAiICsgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIjcmVnaW9uQ2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbkNoYW5nZWQoUmVnaW9uQ2hhbmdlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkIC0gcmVnaW9uQ2hhbmdlZDogIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI3JlZ2lvbnNSZXBsYWNlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVnaW9uc1JlcGxhY2VkKFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkIC0gcmVnaW9uc1JlcGxhY2VkOiAiICsgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRXZlcnlOb2RlRGVidWdBZGFwdGVyIHNpbmdsZXRvbkluc3RhbmNlOwotCi0JcHVibGljIHN0YXRpYyBFdmVyeU5vZGVEZWJ1Z0FkYXB0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChzaW5nbGV0b25JbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzaW5nbGV0b25JbnN0YW5jZSA9IG5ldyBFdmVyeU5vZGVEZWJ1Z0FkYXB0ZXIoKTsKLQkJfQotCQlyZXR1cm4gc2luZ2xldG9uSW5zdGFuY2U7Ci0JfQotCi0JSW50ZXJuYWxEb2N1bWVudExpc3RlbmVyIGZJbnRlcm5hbERvY3VtZW50TGlzdGVuZXI7Ci0JSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgZkludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyOwotCUludGVybmFsU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZSBmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlOwotCUludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci0JSVN0cnVjdHVyZWRNb2RlbCBmTW9kZWw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRXZlcnlOb2RlRGVidWdBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCQlmSW50ZXJuYWxEb2N1bWVudExpc3RlbmVyID0gbmV3IEludGVybmFsRG9jdW1lbnRMaXN0ZW5lcigpOwotCQlmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlID0gbmV3IEludGVybmFsU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZSgpOwotCQlmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyKCk7Ci0JCWZJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKi8KLQlwdWJsaWMgRXZlcnlOb2RlRGVidWdBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXRoaXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZUFkYXB0ZXIjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IElEZWJ1Z0FkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklOb2RlQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZU5vdGlmaWVyLAotCSAqICAgICAgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWlmIChub3RpZmllciBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlzZXRNb2RlbCgoKElET01Ob2RlKSBub3RpZmllcikuZ2V0TW9kZWwoKSk7Ci0JCX0KLQkJRGVidWcucHJpbnRsbigibm90aWZpZXI6ICIgKyBub3RpZmllciArICIgIiArIElOb2RlTm90aWZpZXIuRVZFTlRfVFlQRV9TVFJJTkdTW2V2ZW50VHlwZV0gKyAiIGNoYW5nZWRGZWF0dXJlOiAiICsgY2hhbmdlZEZlYXR1cmUgKyAiIG9sZFZhbHVlOiAiICsgb2xkVmFsdWUgKyAiIG5ld1ZhbHVlOiAiICsgbmV3VmFsdWUgKyAiIHBvczogIiArIHBvcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCi0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5JRGVidWdBZGFwdGVyI3NldERvY3VtZW50KG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWlmIChmTW9kZWwgPT0gc3RydWN0dXJlZE1vZGVsKQotCQkJcmV0dXJuOwotCi0JCWlmIChmTW9kZWwgIT0gbnVsbCkgewotCQkJZk1vZGVsLnJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcihmSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIpOwotCQkJLy8KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZk1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJc3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50TGlzdGVuZXIoZkludGVybmFsRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCQkJc3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKGZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2UpOwotCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQkJZk1vZGVsID0gc3RydWN0dXJlZE1vZGVsOwotCQlpZiAoZk1vZGVsICE9IG51bGwpIHsKLQotCQkJZk1vZGVsLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcihmSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIpOwotCQkJLy8KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZk1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJc3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50TGlzdGVuZXIoZkludGVybmFsRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCQkJc3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKGZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2UpOwotCQkJCXN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9JRGVidWdBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0lEZWJ1Z0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjNTcxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0lEZWJ1Z0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSURlYnVnQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk4YzliYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBFUlJPUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIElORk87Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgT0s7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgV0FSTklORzsKLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoT0ssIElORk8sIFdBUk5JTkcsIEVSUk9SLAotCSAqICAgICAgICAgICAgT0tfREVCVUcsIElORk9fREVCVUcsIFdBUk5JTkdfREVCVUcsIEVSUk9SX0RFQlVHKQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93bgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGxldmVsID09IE9LX0RFQlVHIHx8IGxldmVsID09IElORk9fREVCVUcgfHwgbGV2ZWwgPT0gV0FSTklOR19ERUJVRyB8fCBsZXZlbCA9PSBFUlJPUl9ERUJVRykgewotCQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JCXN3aXRjaCAobGV2ZWwpIHsKLQkJCWNhc2UgSU5GT19ERUJVRyA6Ci0JCQljYXNlIElORk8gOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXQVJOSU5HX0RFQlVHIDoKLQkJCWNhc2UgV0FSTklORyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLldBUk5JTkc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVSUk9SX0RFQlVHIDoKLQkJCWNhc2UgRVJST1IgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5FUlJPUjsKLQkJfQotCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgbWVzc2FnZSB0byBsb2cgaWYgY2F0ZWdvcnkgbWF0Y2hlcyAvZGVidWcvdHJhY2VmaWx0ZXIgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIHByaW50Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogICAgICAgICAgICBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aAotCSAqICAgICAgICAgICAgL2RlYnVnL3RyYWNlZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF90cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChpc1RyYWNpbmcoY2F0ZWdvcnkpKSB7Ci0JCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBpcyBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgY3VycmVudGx5IHRyYWNpbmcgYSBjYXRlZ29yeQotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFjaW5nIGNhdGVnb3J5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL1hNTENvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9YTUxDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwNWFkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL1hNTENvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgWE1MIENvcmUKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb3JlTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfY2hhcmFjdGVyX2x0X2ZvX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkX2NoYXJhY3Rlcl9ndF9mb19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZF9jaGFyYWN0ZXJfYW1wX2ZvX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkX2NoYXJhY3Rlcl9fZl9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ19lbnRyeV9rZXlfbm90X3NldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXRhbG9nX2VudHJ5X3VyaV9ub3Rfc2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhdGFsb2dfbmV4dF9jYXRhbG9nX2xvY2F0aW9uX3VyaV9ub3Rfc2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhdGFsb2dfcmVzb2x1dGlvbl9udWxsX2NhdGFsb2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ19yZXNvbHV0aW9uX21hbGZvcm1lZF91cmw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ19yZXNvbHV0aW9uX2lvX2V4Y2VwdGlvbjsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBYTUxDb3JlTWVzc2FnZXMuY2xhc3MpOwotCX0KLQkKLQlwcml2YXRlIFhNTENvcmVNZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL1hNTENvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvWE1MQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjE0OGEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvWE1MQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5DYXRhbG9nU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotCi0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFhNTENvcmVQbHVnaW4gcGx1Z2luOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfQ0FUQUxPR19JRCA9ICJ1c2VyX2NhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DQVRBTE9HX0lEID0gImRlZmF1bHRfY2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fQ0FUQUxPR19JRCA9ICJzeXN0ZW1fY2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIENhdGFsb2dTZXQgY2F0YWxvZ1NldCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdENhdGFsb2dGaWxlU3RhdGVMb2NhdGlvbjsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgWE1MQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkgZGlyZWN0bHkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgWE1MQ29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKFN0cmluZyBmaWxlTmFtZSkgewotCQlTdHJpbmcgbG9jYXRpb24gPSBnZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKGZpbGVOYW1lKS50b1N0cmluZygpOwotCQlTdHJpbmcgZmlsZV9wcm90b2NvbCA9ICJmaWxlOiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwgJiYgIWxvY2F0aW9uLnN0YXJ0c1dpdGgoZmlsZV9wcm90b2NvbCkpIHsKLQkJCWxvY2F0aW9uID0gZmlsZV9wcm90b2NvbCArIGxvY2F0aW9uOwotCQl9Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgSUNhdGFsb2cgZ2V0RGVmYXVsdFhNTENhdGFsb2coKSB7Ci0JCWlmIChjYXRhbG9nU2V0ID09IG51bGwpIHsKLQkJCWNhdGFsb2dTZXQgPSBuZXcgQ2F0YWxvZ1NldCgpOwotCi0JCQlkZWZhdWx0Q2F0YWxvZ0ZpbGVTdGF0ZUxvY2F0aW9uID0gZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbihDYXRhbG9nLkRFRkFVTFRfQ0FUQUxPR19GSUxFKTsKLQotCQkJY2F0YWxvZ1NldC5wdXRDYXRhbG9nUGVyc2lzdGVuY2VMb2NhdGlvbihERUZBVUxUX0NBVEFMT0dfSUQsIGRlZmF1bHRDYXRhbG9nRmlsZVN0YXRlTG9jYXRpb24pOwotCQkJY2F0YWxvZ1NldC5wdXRDYXRhbG9nUGVyc2lzdGVuY2VMb2NhdGlvbihTWVNURU1fQ0FUQUxPR19JRCwgZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbihDYXRhbG9nLlNZU1RFTV9DQVRBTE9HX0ZJTEUpKTsKLQkJCWNhdGFsb2dTZXQucHV0Q2F0YWxvZ1BlcnNpc3RlbmNlTG9jYXRpb24oVVNFUl9DQVRBTE9HX0lELCBnZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKENhdGFsb2cuVVNFUl9DQVRBTE9HX0ZJTEUpKTsKLQkJfQotCQlyZXR1cm4gY2F0YWxvZ1NldC5sb29rdXBPckNyZWF0ZUNhdGFsb2coREVGQVVMVF9DQVRBTE9HX0lELCBkZWZhdWx0Q2F0YWxvZ0ZpbGVTdGF0ZUxvY2F0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvWE1MQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9YTUxDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjMwYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9YTUxDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotSW52YWxpZF9jaGFyYWN0ZXJfbHRfZm9fRVJST1JfPUludmFsaWQgY2hhcmFjdGVyICgnPCcpIGZvdW5kCi1JbnZhbGlkX2NoYXJhY3Rlcl9ndF9mb19FUlJPUl89SW52YWxpZCBjaGFyYWN0ZXIgKCc+JykgZm91bmQKLUludmFsaWRfY2hhcmFjdGVyX2FtcF9mb19FUlJPUl89SW52YWxpZCBjaGFyYWN0ZXIgKCcmJykgZm91bmQKLUludmFsaWRfY2hhcmFjdGVyX19mX0VYQ189SW52YWxpZCBjaGFyYWN0ZXIgKCdcIicpIGZvdW5kCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGNvbnRlbnRtb2RlbCBzdHJpbmdzCi1sb2FkaW5nPWxvYWRpbmcgCi0jIGNhdGFsb2cgc3RyaW5ncwotQ2F0YWxvZ19lbnRyeV9rZXlfbm90X3NldD1DYXRhbG9nIGVudHJ5IGtleSBpcyBub3Qgc2V0Ci1DYXRhbG9nX2VudHJ5X3VyaV9ub3Rfc2V0PUNhdGFsb2cgZW50cnkgdXJpIGlzIG5vdCBzZXQKLUNhdGFsb2dfbmV4dF9jYXRhbG9nX2xvY2F0aW9uX3VyaV9ub3Rfc2V0PU5leHQgY2F0YWxvZyBsb2NhdGlvbiB1cmkgaXMgbm90IHNldAotQ2F0YWxvZ19yZXNvbHV0aW9uX251bGxfY2F0YWxvZz1DYXRhbG9nIHJlc29sdXRpb24gYXR0ZW1wdGVkIHdpdGggbnVsbCBjYXRhbG9nOyBpZ25vcmVkCi1DYXRhbG9nX3Jlc29sdXRpb25fbWFsZm9ybWVkX3VybD1NYWxmb3JtZWQgVVJMIGV4Y2VwdGlvbiB0cnlpbmcgdG8gcmVzb2x2ZQotQ2F0YWxvZ19yZXNvbHV0aW9uX2lvX2V4Y2VwdGlvbj1JL08gZXhjZXB0aW9uIHRyeWluZyB0byByZXNvbHZlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvQ2xlYW51cFByb2Nlc3NvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NsZWFudXBQcm9jZXNzb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYyZTk4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvQ2xlYW51cFByb2Nlc3NvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkFic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5TdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmZvcm1hdHRlci5YTUxGb3JtYXR0ZXJGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JYTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQ2xlYW51cFByb2Nlc3NvclhNTCBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgewotCXByb3RlY3RlZCBJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBmQ2xlYW51cFByZWZlcmVuY2VzID0gbnVsbDsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGdldENsZWFudXBIYW5kbGVyKE5vZGUgbm9kZSkgewotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBjbGVhbnVwSGFuZGxlciA9IG51bGw7Ci0JCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJY2xlYW51cEhhbmRsZXIgPSBuZXcgRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsKLQkJCQljbGVhbnVwSGFuZGxlciA9IG5ldyBOb2RlQ2xlYW51cEhhbmRsZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOiB7Ci0JCQkJY2xlYW51cEhhbmRsZXIgPSBuZXcgTm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpbml0IENsZWFudXBQcmVmZXJlbmNlcwotCQljbGVhbnVwSGFuZGxlci5zZXRDbGVhbnVwUHJlZmVyZW5jZXMoZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkpOwotCi0JCXJldHVybiBjbGVhbnVwSGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkgewotCQlpZiAoZkNsZWFudXBQcmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlmQ2xlYW51cFByZWZlcmVuY2VzID0gbmV3IFN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMoKTsKLQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEluc2VydFJlcXVpcmVkQXR0cnMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9SRVFVSVJFRF9BVFRSUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0SW5zZXJ0TWlzc2luZ1RhZ3MocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9NSVNTSU5HX1RBR1MpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldFF1b3RlQXR0clZhbHVlcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEZvcm1hdFNvdXJjZShwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSkpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Q29udmVydEVPTENvZGVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT05WRVJUX0VPTF9DT0RFUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0RU9MQ29kZShwcmVmZXJlbmNlcy5nZXRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZkNsZWFudXBQcmVmZXJlbmNlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ29udGVudFR5cGVJZEZvclhNTC5Db250ZW50VHlwZUlEX1hNTDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZ2V0Rm9ybWF0UHJvY2Vzc29yKCkgewotCQlyZXR1cm4gbmV3IFhNTEZvcm1hdHRlckZvcm1hdFByb2Nlc3NvcigpOwotCX0KLQotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ2xlYW51cFByZWZlcmVuY2VzKCkgewotCQlmQ2xlYW51cFByZWZlcmVuY2VzID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0VsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNmOWEyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkluc2VydEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSVNvdXJjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIEVsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIgZXh0ZW5kcyBOb2RlQ2xlYW51cEhhbmRsZXIgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBET1VCTEVfUVVPVEUgPSAnXCInOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFX1FVT1RFUyA9ICJcIlwiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1RBR19DTE9TRSA9ICIvPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfVEFHX09QRU4gPSAiPC8iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIFNJTkdMRV9RVU9URSA9ICdcJyc7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVfUVVPVEVTID0gIicnIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIE5vbi1OTFMgc3RyaW5ncyAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RBR19PUEVOID0gIjwiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NMT1NFID0gIj4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgTm9kZSBjbGVhbnVwKE5vZGUgbm9kZSkgewotCQlOb2RlIG5ld05vZGUgPSBjbGVhbnVwQ2hpbGRyZW4obm9kZSk7Ci0JCUlET01Ob2RlIHJlbmFtZWROb2RlID0gbmV3Tm9kZSBpbnN0YW5jZW9mIElET01Ob2RlID8gKElET01Ob2RlKSBuZXdOb2RlIDogbnVsbDsKLQotCQkvLyBjYWxsIHF1b3RlQXR0clZhbHVlKCkgZmlyc3Qgc28gaXQgd2lsbCBjbG9zZSBhbnkgdW5jbG9zZWQgYXR0cgotCQkvLyBxdW90ZUF0dHJWYWx1ZSgpIHdpbGwgcmV0dXJuIHRoZSBuZXcgc3RhcnQgdGFnIGlmIHRoZXJlIGlzIGEKLQkJLy8gc3RydWN0dXJlIGNoYW5nZQotCQlyZW5hbWVkTm9kZSA9IHF1b3RlQXR0clZhbHVlKHJlbmFtZWROb2RlKTsKLQotCQkvLyBpbnNlcnQgdGFnIGNsb3NlIGlmIG1pc3NpbmcKLQkJLy8gaWYgbm9kZSBpcyBub3QgY29tbWVudCB0YWcKLQkJLy8gYW5kIG5vdCBpbXBsaWNpdCB0YWcKLQkJaWYgKCFpc0NvbW1lbnRUYWcocmVuYW1lZE5vZGUpICYmICFpc0ltcGxpY2l0VGFnKHJlbmFtZWROb2RlKSkgewotCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IHJlbmFtZWROb2RlLmdldE1vZGVsKCk7Ci0KLQkJCS8vIHNhdmUgc3RhcnQgb2Zmc2V0IGJlZm9yZSBpbnNlcnRUYWdDbG9zZSgpCi0JCQkvLyBvciBlbHNlIHJlbmFtZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgd2lsbCBiZSB6ZXJvIGlmCi0JCQkvLyByZW5hbWVkTm9kZSByZXBsYWNlZCBieSBpbnNlcnRUYWdDbG9zZSgpCi0JCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IHJlbmFtZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJCS8vIGZvciBzdGFydCB0YWcKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSByZW5hbWVkTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaW5zZXJ0VGFnQ2xvc2Uoc3RydWN0dXJlZE1vZGVsLCBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJCS8vIHVwZGF0ZSByZW5hbWVkTm9kZSBhbmQgc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYWZ0ZXIKLQkJCS8vIGluc2VydFRhZ0Nsb3NlKCkKLQkJCXJlbmFtZWROb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsKLQkJCXN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gcmVuYW1lZE5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQkJLy8gZm9yIGVuZCB0YWcKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gcmVuYW1lZE5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCWluc2VydFRhZ0Nsb3NlKHN0cnVjdHVyZWRNb2RlbCwgZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJfQotCi0JCS8vIGNhbGwgaW5zZXJ0TWlzc2luZ1RhZ3MoKSBuZXh0LCBpdCB3aWxsIGdlbmVyYXRlIGltcGxpY2l0IHRhZ3MgaWYKLQkJLy8gdGhlcmUgYXJlIGFueQotCQkvLyBpbnNlcnRNaXNzaW5nVGFncygpIHdpbGwgcmV0dXJuIHRoZSBuZXcgbWlzc2luZyBzdGFydCB0YWcgaWYgb25lIGlzCi0JCS8vIG1pc3NpbmcKLQkJcmVuYW1lZE5vZGUgPSBpbnNlcnRNaXNzaW5nVGFncyhyZW5hbWVkTm9kZSk7Ci0KLQkJcmVuYW1lZE5vZGUgPSBjb21wcmVzc0VtcHR5RWxlbWVudFRhZyhyZW5hbWVkTm9kZSk7Ci0KLQkJcmVuYW1lZE5vZGUgPSBpbnNlcnRSZXF1aXJlZEF0dHJzKHJlbmFtZWROb2RlKTsKLQotCQlyZXR1cm4gcmVuYW1lZE5vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgY2xlYW51cENoaWxkcmVuKE5vZGUgbm9kZSkgewotCQlOb2RlIHBhcmVudE5vZGUgPSBub2RlOwotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCU5vZGUgY2hpbGROb2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAoY2hpbGROb2RlICE9IG51bGwpIHsKLQkJCQkvLyBnZXQgY2xlYW51cCBoYW5kbGVyCi0JCQkJSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBjbGVhbnVwSGFuZGxlciA9IGdldENsZWFudXBIYW5kbGVyKGNoaWxkTm9kZSk7Ci0KLQkJCQkvLyBjbGVhbnVwIGVhY2ggY2hpbGQKLQkJCQljaGlsZE5vZGUgPSBjbGVhbnVwSGFuZGxlci5jbGVhbnVwKGNoaWxkTm9kZSk7Ci0KLQkJCQkvLyBnZXQgbmV3IHBhcmVudCBub2RlCi0JCQkJcGFyZW50Tm9kZSA9IGNoaWxkTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQkvLyBnZXQgbmV4dCBjaGlsZCBub2RlCi0JCQkJY2hpbGROb2RlID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcGFyZW50Tm9kZTsKLQl9Ci0KLQlwcml2YXRlIElET01Ob2RlIGNvbXByZXNzRW1wdHlFbGVtZW50VGFnKElET01Ob2RlIG5vZGUpIHsKLQkJYm9vbGVhbiBjb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MgPSBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKS5nZXRDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MoKTsKLQkJSURPTU5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXdOb2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQlpZiAoY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzICYmIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAmJiBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQkJLy8gZm9ybWF0IGNoaWxkcmVuIGFuZCBlbmQgdGFnIGlmIG5vdCBlbXB0eSBlbGVtZW50IHRhZwotCQkJaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCQkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBuZXdOb2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCQlpZiAoY2hpbGROb2RlcyA9PSBudWxsIHx8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCB8fCAoY2hpbGROb2Rlcy5nZXRMZW5ndGgoKSA9PSAxICYmIChjaGlsZE5vZGVzLml0ZW0oMCkpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgKChjaGlsZE5vZGVzLml0ZW0oMCkpLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkpIHsKLQkJCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5ld05vZGUuZ2V0TW9kZWwoKTsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJCQkJaW50IHN0YXJ0VGFnU3RhcnRPZmZzZXQgPSBuZXdOb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWludCBvZmZzZXQgPSBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJaW50IGxlbmd0aCA9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsgLy8gc2F2ZQotCi0JCQkJCW9mZnNldCA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCkgKyBsYXN0UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgMCwgIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsgLy8gc2F2ZQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGdldENsZWFudXBIYW5kbGVyKE5vZGUgbm9kZSkgewotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBjbGVhbnVwSGFuZGxlciA9IG51bGw7Ci0JCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCWNhc2Ugb3JnLnczYy5kb20uTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJY2xlYW51cEhhbmRsZXIgPSBuZXcgRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBvcmcudzNjLmRvbS5Ob2RlLlRFWFRfTk9ERSA6IHsKLQkJCQljbGVhbnVwSGFuZGxlciA9IG5ldyBOb2RlQ2xlYW51cEhhbmRsZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOiB7Ci0JCQkJY2xlYW51cEhhbmRsZXIgPSBuZXcgTm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpbml0IENsZWFudXBQcmVmZXJlbmNlcwotCQljbGVhbnVwSGFuZGxlci5zZXRDbGVhbnVwUHJlZmVyZW5jZXMoZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkpOwotCi0JCXJldHVybiBjbGVhbnVwSGFuZGxlcjsKLQl9Ci0KLQotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlyZXR1cm4gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSgoRG9jdW1lbnQpIG5vZGUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UmVxdWlyZWRBdHRycyhOb2RlIG5vZGUpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gZ2V0TW9kZWxRdWVyeShub2RlKTsKLQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJCWlmIChlbGVtZW50RGVjbCAhPSBudWxsKSB7Ci0JCQkJQ01OYW1lZE5vZGVNYXAgYXR0ck1hcCA9IGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQlJdGVyYXRvciBpdCA9IGF0dHJNYXAuaXRlcmF0b3IoKTsKLQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBudWxsOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJYXR0ciA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChhdHRyLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgewotCQkJCQkJcmVzdWx0LmFkZChhdHRyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJRE9NTm9kZSBpbnNlcnRFbmRUYWcoSURPTU5vZGUgbm9kZSkgewotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpCi0JCQlyZXR1cm4gbm9kZTsgLy8gZG8gbm90aGluZwotCi0JCWludCBzdGFydFRhZ1N0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCi0JCWlmIChpc0VtcHR5RWxlbWVudChlbGVtZW50KSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGxhc3RSZWdpb24pLCBsYXN0UmVnaW9uLmdldExlbmd0aCgpLCBFTVBUWV9UQUdfQ0xPU0UpOwotCi0JCQlpZiAocmVnaW9ucy5zaXplKCkgPiAxKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uQmVmb3JlVGFnQ2xvc2UgPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEgLSAxKTsKLQotCQkJCS8vIGluc2VydCBhIHNwYWNlIHNlcGFyYXRvciBiZWZvcmUgdGFnIGNsb3NlIGlmIHRoZSBwcmV2aW91cwotCQkJCS8vIHJlZ2lvbiBkb2VzIG5vdCBoYXZlIGV4dHJhIHNwYWNlcwotCQkJCWlmIChyZWdpb25CZWZvcmVUYWdDbG9zZS5nZXRUZXh0TGVuZ3RoKCkgPT0gcmVnaW9uQmVmb3JlVGFnQ2xvc2UuZ2V0TGVuZ3RoKCkpCi0JCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGxhc3RSZWdpb24pLCAwLCAiICIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCVN0cmluZyBlbmRUYWcgPSBFTkRfVEFHX09QRU4uY29uY2F0KHRhZ05hbWUpLmNvbmNhdChUQUdfQ0xPU0UpOwotCi0JCQlJRE9NTm9kZSBsYXN0Q2hpbGQgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCQlpbnQgZW5kVGFnU3RhcnRPZmZzZXQgPSAwOwotCQkJaWYgKGxhc3RDaGlsZCAhPSBudWxsKQotCQkJCS8vIGlmIHRoaXMgbm9kZSBoYXMgY2hpbGRyZW4sIGluc2VydCB0aGUgZW5kIHRhZyBhZnRlciB0aGUKLQkJCQkvLyBsYXN0IGNoaWxkCi0JCQkJZW5kVGFnU3RhcnRPZmZzZXQgPSBsYXN0Q2hpbGQuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQllbHNlCi0JCQkJLy8gaWYgdGhpcyBub2RlIGRvZXMgbm90IGhhcyBjaGlsZHJlbiwgaW5zZXJ0IHRoZSBlbmQgdGFnCi0JCQkJLy8gYWZ0ZXIgdGhlIHN0YXJ0IHRhZwotCQkJCWVuZFRhZ1N0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRFbmRPZmZzZXQoKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBlbmRUYWdTdGFydE9mZnNldCwgMCwgZW5kVGFnKTsKLQkJfQotCi0JCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0JCS8vIG5ldwotCQkvLyBub2RlCi0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJRE9NTm9kZSBpbnNlcnRNaXNzaW5nVGFncyhJRE9NTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gaW5zZXJ0TWlzc2luZ1RhZ3MgPSBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKS5nZXRJbnNlcnRNaXNzaW5nVGFncygpOwotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQlpZiAoaW5zZXJ0TWlzc2luZ1RhZ3MpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCS8vIGltcGxpY2l0IHN0YXJ0IHRhZzsgZ2VuZXJhdGUgdGFnIGZvciBpdAotCQkJCW5ld05vZGUgPSBpbnNlcnRTdGFydFRhZyhub2RlKTsKLQkJCQlzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCX0KLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXdOb2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJSVRleHRSZWdpb25MaXN0IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uUmVnaW9ucyA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsICYmIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uUmVnaW9ucyAhPSBudWxsICYmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblJlZ2lvbnMuZ2V0KHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uUmVnaW9ucy5zaXplKCkgLSAxKSkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCi0JCQl9IGVsc2UgewotCQkJCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCS8vIHN0YXJ0IHRhZyBtaXNzaW5nCi0JCQkJCWlmIChpc1N0YXJ0VGFnUmVxdWlyZWQobmV3Tm9kZSkpCi0JCQkJCQluZXdOb2RlID0gaW5zZXJ0U3RhcnRUYWcobmV3Tm9kZSk7Ci0JCQkJfSBlbHNlIGlmIChlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCQkvLyBlbmQgdGFnIG1pc3NpbmcKLQkJCQkJaWYgKGlzRW5kVGFnUmVxdWlyZWQobmV3Tm9kZSkpCi0JCQkJCQluZXdOb2RlID0gaW5zZXJ0RW5kVGFnKG5ld05vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByaXZhdGUgSURPTU5vZGUgaW5zZXJ0UmVxdWlyZWRBdHRycyhJRE9NTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gaW5zZXJ0UmVxdWlyZWRBdHRycyA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldEluc2VydFJlcXVpcmVkQXR0cnMoKTsKLQkJSURPTU5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0KLQkJaWYgKGluc2VydFJlcXVpcmVkQXR0cnMpIHsKLQkJCUxpc3QgcmVxdWlyZWRBdHRycyA9IGdldFJlcXVpcmVkQXR0cnMobmV3Tm9kZSk7Ci0JCQlpZiAocmVxdWlyZWRBdHRycy5zaXplKCkgPiAwKSB7Ci0JCQkJTmFtZWROb2RlTWFwIGN1cnJlbnRBdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCUxpc3QgaW5zZXJ0QXR0cnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGN1cnJlbnRBdHRycy5nZXRMZW5ndGgoKSA9PSAwKQotCQkJCQlpbnNlcnRBdHRycy5hZGRBbGwocmVxdWlyZWRBdHRycyk7Ci0JCQkJZWxzZSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWlyZWRBdHRycy5zaXplKCk7IGkrKykgewotCQkJCQkJU3RyaW5nIHJlcXVpcmVkQXR0ck5hbWUgPSAoKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIHJlcXVpcmVkQXR0cnMuZ2V0KGkpKS5nZXRBdHRyTmFtZSgpOwotCQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjdXJyZW50QXR0cnMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJCVN0cmluZyBjdXJyZW50QXR0ck5hbWUgPSBjdXJyZW50QXR0cnMuaXRlbShqKS5nZXROb2RlTmFtZSgpOwotCQkJCQkJCWlmIChyZXF1aXJlZEF0dHJOYW1lLmNvbXBhcmVUb0lnbm9yZUNhc2UoY3VycmVudEF0dHJOYW1lKSA9PSAwKSB7Ci0JCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKCFmb3VuZCkKLQkJCQkJCQlpbnNlcnRBdHRycy5hZGQocmVxdWlyZWRBdHRycy5nZXQoaSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChpbnNlcnRBdHRycy5zaXplKCkgPiAwKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXdOb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCWludCBpbmRleCA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGFzdFJlZ2lvbigpOwotCQkJCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB7Ci0JCQkJCQlpbmRleC0tOwotCQkJCQkJbGFzdFJlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluZGV4IC0gMSk7Ci0JCQkJCX0gZWxzZSBpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJCQlpbmRleCA9IGluZGV4IC0gMjsKLQkJCQkJCWxhc3RSZWdpb24gPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbmRleCAtIDEpOwotCQkJCQl9Ci0JCQkJCU11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmb3IgKGludCBpID0gaW5zZXJ0QXR0cnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGluc2VydEF0dHJzLmdldChpKTsKLQkJCQkJCQlTdHJpbmcgcmVxdWlyZWRBdHRyaWJ1dGVOYW1lID0gYXR0ckRlY2wuZ2V0QXR0ck5hbWUoKTsKLQkJCQkJCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gYXR0ckRlY2wuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQkJCQkJaWYgKGRlZmF1bHRWYWx1ZSA9PSBudWxsKQotCQkJCQkJCQlkZWZhdWx0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBuYW1lQW5kRGVmYXVsdFZhbHVlID0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKGkgPT0gMCAmJiBsYXN0UmVnaW9uLmdldExlbmd0aCgpID4gbGFzdFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpCi0JCQkJCQkJCW5hbWVBbmREZWZhdWx0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW5hbWVBbmREZWZhdWx0VmFsdWUgKz0gcmVxdWlyZWRBdHRyaWJ1dGVOYW1lICsgIj1cIiIgKyBkZWZhdWx0VmFsdWUgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQltdWx0aVRleHRFZGl0LmFkZENoaWxkKG5ldyBJbnNlcnRFZGl0KGluZGV4LCBuYW1lQW5kRGVmYXVsdFZhbHVlKSk7Ci0JCQkJCQkJLy8gQlVHMzM4MTogTXVsdGlUZXh0RWRpdCBhcHBsaWVzIGFsbCBjaGlsZAotCQkJCQkJCS8vIFRleHRFZGl0J3MgYmFzaW5nIG9uIG9mZnNldHMKLQkJCQkJCQkvLyAgICAgICAgICBpbiB0aGUgZG9jdW1lbnQgYmVmb3JlIHRoZSBmaXJzdCBUZXh0RWRpdCwgbm90Ci0JCQkJCQkJLy8gYWZ0ZXIgZWFjaAotCQkJCQkJCS8vICAgICAgICAgIGNoaWxkIFRleHRFZGl0LiBUaGVyZWZvcmUsIGRvIG5vdCBuZWVkIHRvCi0JCQkJCQkJLy8gYWR2YW5jZSB0aGUgaW5kZXguCi0JCQkJCQkJLy9pbmRleCArPSBuYW1lQW5kRGVmYXVsdFZhbHVlLmxlbmd0aCgpOwotCQkJCQkJfQotCQkJCQkJbXVsdGlUZXh0RWRpdC5hcHBseShuZXdOb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByaXZhdGUgSURPTU5vZGUgaW5zZXJ0U3RhcnRUYWcoSURPTU5vZGUgbm9kZSkgewotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQlpZiAoaXNDb21tZW50VGFnKG5vZGUpKQotCQkJcmV0dXJuIG5vZGU7IC8vIGRvIG5vdGhpbmcKLQotCQlTdHJpbmcgdGFnTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJU3RyaW5nIHN0YXJ0VGFnID0gU1RBUlRfVEFHX09QRU4uY29uY2F0KHRhZ05hbWUpLmNvbmNhdChUQUdfQ0xPU0UpOwotCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnRUYWdTdGFydE9mZnNldCwgMCwgc3RhcnRUYWcpOwotCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsgLy8gc2F2ZQotCQkvLyBuZXcKLQkJLy8gbm9kZQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnNlcnRUYWdDbG9zZShJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgZmxhdG5vZGVSZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJaWYgKGZsYXRub2RlUmVnaW9ucyAhPSBudWxsKSB7Ci0JCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IGZsYXRub2RlUmVnaW9ucy5nZXQoZmxhdG5vZGVSZWdpb25zLnNpemUoKSAtIDEpOwotCQkJCWlmIChsYXN0UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBsYXN0UmVnaW9uLmdldFR5cGUoKTsKLQkJCQkJaWYgKChyZWdpb25UeXBlICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgJiYgKHJlZ2lvblR5cGUgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSkgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJCQkJCS8vIGluc2VydCAiPiIgYWZ0ZXIgbGFzdFJlZ2lvbiBvZiBmbGF0Tm9kZQotCQkJCQkJLy8gYXMgaW4gIjxhPC9hPiIgaWYgZmxhdE5vZGUgaXMgZm9yIHN0YXJ0IHRhZywgb3IgaW4KLQkJCQkJCS8vICI8YT48L2EiIGlmIGZsYXROb2RlIGlzIGZvciBlbmQgdGFnCi0JCQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBmbGF0Tm9kZS5nZXRUZXh0RW5kT2Zmc2V0KGxhc3RSZWdpb24pLCAwLCAiPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVuYW1lZE5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudFRhZyhOb2RlIHJlbmFtZWROb2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChyZW5hbWVkTm9kZSBpbnN0YW5jZW9mIElET01FbGVtZW50KSB7Ci0JCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSByZW5hbWVkTm9kZTsKLQkJCXJlc3VsdCA9IGVsZW1lbnQuaXNDb21tZW50VGFnKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eUVsZW1lbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlEb2N1bWVudCBkb2N1bWVudCA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCS8vIHVuZGVmaW5lZCB0YWcsIHJldHVybiBkZWZhdWx0Ci0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb2N1bWVudCk7Ci0JCWlmIChtb2RlbFF1ZXJ5ID09IG51bGwpCi0JCQkvLyB1bmRlZmluZWQgdGFnLCByZXR1cm4gZGVmYXVsdAotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJLy8gdW5kZWZpbmVkIHRhZywgcmV0dXJuIGRlZmF1bHQKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gKGRlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5kVGFnUmVxdWlyZWQoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gbm9kZS5pc0NvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIEEgdGFnIGlzIGltcGxpY2l0IGlmIGl0IGhhcyBub3QgY29ycmVzcG9uZGluZyByZWdpb24gaW4gZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlbmFtZWROb2RlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ltcGxpY2l0VGFnKElET01Ob2RlIHJlbmFtZWROb2RlKSB7Ci0JCXJldHVybiByZW5hbWVkTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIGVuZCB0YWdzIG9mIEhUTUwgRU1QVFkgY29udGVudCB0eXBlLCBzdWNoIGFzIElNRywgYW5kIEhUTUwKLQkgKiB1bmRlZmluZWQgdGFncyBhcmUgcGFyc2VkIHNlcGFyYXRlbHkgZnJvbSB0aGUgc3RhcnQgdGFncy4gU28gaW5zZXJ0aW5nCi0JICogdGhlIG1pc3Npbmcgc3RhcnQgdGFnIGlzIHVzZWxlc3MgYW5kIGV2ZW4gaGFybWZ1bC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNTdGFydFRhZ1JlcXVpcmVkKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG5vZGUuaXNDb250YWluZXIoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNYTUxUeXBlKElET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwgJiYgc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXREb2N1bWVudCgpOwotCi0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkb2N1bWVudC5pc1hNTFR5cGUoKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJRE9NTm9kZSBxdW90ZUF0dHJWYWx1ZShJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01Ob2RlIG5ld05vZGUgPSBub2RlOwotCQkvL1hNTEVsZW1lbnQgZWxlbWVudCA9IChYTUxFbGVtZW50KSBub2RlOwotCQlpZiAoaXNDb21tZW50VGFnKG5vZGUpKQotCQkJcmV0dXJuIG5vZGU7IC8vIGRvIG5vdGhpbmcKLQotCQlib29sZWFuIHF1b3RlQXR0clZhbHVlcyA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldFF1b3RlQXR0clZhbHVlcygpOwotCi0JCWlmIChxdW90ZUF0dHJWYWx1ZXMpIHsKLQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbmV3Tm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCQkJaW50IGF0dHJpYnV0ZXNMZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQkJCUlTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbm9kZS5nZXRNb2RlbCgpLmdldEdlbmVyYXRvcigpOwotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzTGVuZ3RoOyBpKyspIHsKLQkJCQkJYXR0cmlidXRlcyA9IG5ld05vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCQlhdHRyaWJ1dGVzTGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJCQkJSURPTUF0dHIgZWFjaEF0dHIgPSAoSURPTUF0dHIpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCQkJLy9JVGV4dFJlZ2lvbiBvbGRBdHRyVmFsdWVSZWdpb24gPQotCQkJCQkvLyBlYWNoQXR0ci5nZXRWYWx1ZVJlZ2lvbigpOwotCQkJCQlTdHJpbmcgb2xkQXR0clZhbHVlID0gZWFjaEF0dHIuZ2V0VmFsdWVSZWdpb25UZXh0KCk7Ci0JCQkJCWlmIChvbGRBdHRyVmFsdWUgPT0gbnVsbCkgewotCQkJCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJCQkJCWlmIChpc1hNTFR5cGUoc3RydWN0dXJlZE1vZGVsKSkgewotCQkJCQkJCVN0cmluZyBuZXdBdHRyVmFsdWUgPSAiXCIiICsgZWFjaEF0dHIuZ2V0TmFtZVJlZ2lvblRleHQoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCQkJaWYgKGVhY2hBdHRyLmdldEVxdWFsUmVnaW9uKCkgIT0gbnVsbCkKLQkJCQkJCQkJLy8gZXF1YWwgcmVnaW9uIGV4aXN0cwotCQkJCQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBlYWNoQXR0ci5nZXRFbmRPZmZzZXQoKSwgMCwgbmV3QXR0clZhbHVlKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCS8vIG5vIGVxdWFsIHJlZ2lvbgotCQkJCQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBlYWNoQXR0ci5nZXROYW1lUmVnaW9uVGV4dEVuZE9mZnNldCgpLCAwLCAiPSIuY29uY2F0KG5ld0F0dHJWYWx1ZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJbmV3Tm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24obm9kZS5nZXRTdGFydE9mZnNldCgpKTsgLy8gc2F2ZQotCQkJCQkJCS8vIG5ldwotCQkJCQkJCS8vIG5vZGUKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vU3RyaW5nIG9sZEF0dHJWYWx1ZSA9IG9sZEF0dHJWYWx1ZVJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQkJCQljaGFyIHF1b3RlID0gU3RyaW5nVXRpbHMuaXNRdW90ZWQob2xkQXR0clZhbHVlKSA/IG9sZEF0dHJWYWx1ZS5jaGFyQXQoMCkgOiBET1VCTEVfUVVPVEU7Ci0JCQkJCQlTdHJpbmcgbmV3QXR0clZhbHVlID0gZ2VuZXJhdG9yLmdlbmVyYXRlQXR0clZhbHVlKGVhY2hBdHRyLCBxdW90ZSk7Ci0KLQkJCQkJCS8vIFRoZXJlIGlzIGEgcHJvYmxlbSBpbgotCQkJCQkJLy8gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRBdHRyVmFsdWUoSVRleHRSZWdpb24pCi0JCQkJCQkvLyB3aGVuIHRoZSByZWdpb24gaXMgaW5zdGFuY2VvZiBDb250ZXh0UmVnaW9uLgotCQkJCQkJLy8gV29ya2Fyb3VuZCBmb3Igbm93Li4uCi0JCQkJCQlpZiAob2xkQXR0clZhbHVlLmxlbmd0aCgpID09IDEpIHsKLQkJCQkJCQljaGFyIGZpcnN0Q2hhciA9IG9sZEF0dHJWYWx1ZS5jaGFyQXQoMCk7Ci0JCQkJCQkJaWYgKGZpcnN0Q2hhciA9PSBTSU5HTEVfUVVPVEUpCi0JCQkJCQkJCW5ld0F0dHJWYWx1ZSA9IFNJTkdMRV9RVU9URVM7Ci0JCQkJCQkJZWxzZSBpZiAoZmlyc3RDaGFyID09IERPVUJMRV9RVU9URSkKLQkJCQkJCQkJbmV3QXR0clZhbHVlID0gRE9VQkxFX1FVT1RFUzsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKG5ld0F0dHJWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKG5ld0F0dHJWYWx1ZS5jb21wYXJlVG8ob2xkQXR0clZhbHVlKSAhPSAwKSB7Ci0JCQkJCQkJCWludCBhdHRyVmFsdWVTdGFydE9mZnNldCA9IGVhY2hBdHRyLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQkJCQkJCQkJaW50IGF0dHJWYWx1ZUxlbmd0aCA9IG9sZEF0dHJWYWx1ZS5sZW5ndGgoKTsKLQkJCQkJCQkJaW50IHN0YXJ0VGFnU3RhcnRPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJCQkJCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGF0dHJWYWx1ZVN0YXJ0T2Zmc2V0LCBhdHRyVmFsdWVMZW5ndGgsIG5ld0F0dHJWYWx1ZSk7Ci0JCQkJCQkJCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0JCQkJCQkJCS8vIG5ldwotCQkJCQkJCQkvLyBub2RlCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL05vZGVDbGVhbnVwSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL05vZGVDbGVhbnVwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWMyMDk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9Ob2RlQ2xlYW51cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLlN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgTm9kZUNsZWFudXBIYW5kbGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciB7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgZkNsZWFudXBQcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0KLQotCXB1YmxpYyBOb2RlIGNsZWFudXAoTm9kZSBub2RlKSB7Ci0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGdldENsZWFudXBQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGZDbGVhbnVwUHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkNsZWFudXBQcmVmZXJlbmNlcyA9IG5ldyBTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzKCk7Ci0KLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpOwotCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbXByZXNzRW1wdHlFbGVtZW50VGFncyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NUFJFU1NfRU1QVFlfRUxFTUVOVF9UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRJbnNlcnRSZXF1aXJlZEF0dHJzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEluc2VydE1pc3NpbmdUYWdzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRRdW90ZUF0dHJWYWx1ZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRGb3JtYXRTb3VyY2UocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbnZlcnRFT0xDb2RlcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEVPTENvZGUocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9FT0xfQ09ERSkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZDbGVhbnVwUHJlZmVyZW5jZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsZWFudXBQcmVmZXJlbmNlcyhJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBjbGVhbnVwUHJlZmVyZW5jZXMpIHsKLQotCQlmQ2xlYW51cFByZWZlcmVuY2VzID0gY2xlYW51cFByZWZlcmVuY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9YTUxDbGVhbnVwUHJlZmVyZW5jZXNJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvWE1MQ2xlYW51cFByZWZlcmVuY2VzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzNjNDg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9YTUxDbGVhbnVwUHJlZmVyZW5jZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JWE1MUHJlZmVyZW5jZU5hbWVzOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHJlbmFtZWQgdG8gU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcwotICogCi0gKiBUT0RPIHdpbGwgZGVsZXRlIGluIEM1Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDbGVhbnVwUHJlZmVyZW5jZXNJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIFhNTENsZWFudXBQcmVmZXJlbmNlc0ltcGwgZkluc3RhbmNlOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgWE1MQ2xlYW51cFByZWZlcmVuY2VzSW1wbCBnZXRJbnN0YW5jZSgpIHsKLQotCQkvLyBhZGRlZCBmb3Igb25lIG1ldGhvZCBpbiBDbGVhbnVwRGlhbG9nIC4uLiBtYXkgYmUgYmV0dGVyIHdheQotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBYTUxDbGVhbnVwUHJlZmVyZW5jZXNJbXBsKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIGludCBmQXR0ck5hbWVDYXNlOwotCXByaXZhdGUgYm9vbGVhbiBmQ29udmVydEVPTENvZGVzOwotCXByaXZhdGUgU3RyaW5nIGZFT0xDb2RlOwotCXByaXZhdGUgYm9vbGVhbiBmRm9ybWF0U291cmNlOwotCXByaXZhdGUgYm9vbGVhbiBmSW5zZXJ0TWlzc2luZ1RhZ3M7Ci0JLy8gcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGZQcmVmZXJlbmNlU3RvcmUgPSBudWxsOwotCXByaXZhdGUgUHJlZmVyZW5jZXMgZlByZWZlcmVuY2VzID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZlF1b3RlQXR0clZhbHVlczsKLQlwcml2YXRlIGludCBmVGFnTmFtZUNhc2U7Ci0KLQlwdWJsaWMgaW50IGdldEF0dHJOYW1lQ2FzZSgpIHsKLQotCQlyZXR1cm4gZkF0dHJOYW1lQ2FzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRDb252ZXJ0RU9MQ29kZXMoKSB7Ci0KLQkJcmV0dXJuIGZDb252ZXJ0RU9MQ29kZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFT0xDb2RlKCkgewotCi0JCXJldHVybiBmRU9MQ29kZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRGb3JtYXRTb3VyY2UoKSB7Ci0KLQkJcmV0dXJuIGZGb3JtYXRTb3VyY2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0SW5zZXJ0TWlzc2luZ1RhZ3MoKSB7Ci0KLQkJcmV0dXJuIGZJbnNlcnRNaXNzaW5nVGFnczsKLQl9Ci0KLQlwdWJsaWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSB7Ci0KLQkJaWYgKGZQcmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlmUHJlZmVyZW5jZXMgPSBTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQl9Ci0JCXJldHVybiBmUHJlZmVyZW5jZXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0UXVvdGVBdHRyVmFsdWVzKCkgewotCi0JCXJldHVybiBmUXVvdGVBdHRyVmFsdWVzOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGFnTmFtZUNhc2UoKSB7Ci0KLQkJcmV0dXJuIGZUYWdOYW1lQ2FzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyTmFtZUNhc2UoaW50IGF0dHJOYW1lQ2FzZSkgewotCi0JCWZBdHRyTmFtZUNhc2UgPSBhdHRyTmFtZUNhc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udmVydEVPTENvZGVzKGJvb2xlYW4gY29udmVydEVPTENvZGVzKSB7Ci0KLQkJZkNvbnZlcnRFT0xDb2RlcyA9IGNvbnZlcnRFT0xDb2RlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFT0xDb2RlKFN0cmluZyBFT0xDb2RlKSB7Ci0KLQkJZkVPTENvZGUgPSBFT0xDb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvcm1hdFNvdXJjZShib29sZWFuIGZvcm1hdFNvdXJjZSkgewotCi0JCWZGb3JtYXRTb3VyY2UgPSBmb3JtYXRTb3VyY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5zZXJ0TWlzc2luZ1RhZ3MoYm9vbGVhbiBpbnNlcnRNaXNzaW5nVGFncykgewotCi0JCWZJbnNlcnRNaXNzaW5nVGFncyA9IGluc2VydE1pc3NpbmdUYWdzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZWZlcmVuY2VzKFByZWZlcmVuY2VzIHByZWZzKSB7Ci0KLQkJZlByZWZlcmVuY2VzID0gcHJlZnM7Ci0JCXVwZGF0ZU9wdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRRdW90ZUF0dHJWYWx1ZXMoYm9vbGVhbiBxdW90ZUF0dHJWYWx1ZXMpIHsKLQotCQlmUXVvdGVBdHRyVmFsdWVzID0gcXVvdGVBdHRyVmFsdWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhZ05hbWVDYXNlKGludCB0YWdOYW1lQ2FzZSkgewotCi0JCWZUYWdOYW1lQ2FzZSA9IHRhZ05hbWVDYXNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU9wdGlvbnMoKSB7Ci0KLQkJUHJlZmVyZW5jZXMgcCA9IGdldFByZWZlcmVuY2VzKCk7Ci0JCWZUYWdOYW1lQ2FzZSA9IHAuZ2V0SW50KElYTUxQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9UQUdfTkFNRV9DQVNFKTsKLQkJZkF0dHJOYW1lQ2FzZSA9IHAuZ2V0SW50KElYTUxQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9BVFRSX05BTUVfQ0FTRSk7Ci0JCWZJbnNlcnRNaXNzaW5nVGFncyA9IHAuZ2V0Qm9vbGVhbihJWE1MUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9NSVNTSU5HX1RBR1MpOwotCQlmUXVvdGVBdHRyVmFsdWVzID0gcC5nZXRCb29sZWFuKElYTUxQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMpOwotCQlmRm9ybWF0U291cmNlID0gcC5nZXRCb29sZWFuKElYTUxQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSk7Ci0JCWZDb252ZXJ0RU9MQ29kZXMgPSBwLmdldEJvb2xlYW4oSVhNTFByZWZlcmVuY2VOYW1lcy5DT05WRVJUX0VPTF9DT0RFUyk7Ci0JCWZFT0xDb2RlID0gcC5nZXRTdHJpbmcoSVhNTFByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L0NvbW1lbnRFbGVtZW50QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9Db21tZW50RWxlbWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2YWY1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L0NvbW1lbnRFbGVtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmltcGwuQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5UYWdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIENvbW1lbnRFbGVtZW50QWRhcHRlciBpbXBsZW1lbnRzIFRhZ0FkYXB0ZXIgewotCXByaXZhdGUgQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uIGZDb25maWd1cmF0aW9uOwotCi0JcHJpdmF0ZSBib29sZWFuIGZFbmRUYWc7Ci0JcHJpdmF0ZSBDb21tZW50RWxlbWVudEhhbmRsZXIgZkhhbmRsZXI7Ci0KLQlwdWJsaWMgQ29tbWVudEVsZW1lbnRBZGFwdGVyKGJvb2xlYW4gaXNFbmRUYWcsIENvbW1lbnRFbGVtZW50SGFuZGxlciBoYW5kbGVyKSB7Ci0JCWZFbmRUYWcgPSBpc0VuZFRhZzsKLQkJZkhhbmRsZXIgPSBoYW5kbGVyOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdlbmVyYXRlQ29tbWVudENsb3NlKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChlbGVtZW50LmlzSlNQVGFnKCkpID8gIi0tJT4iIDogIi0tPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdlbmVyYXRlQ29tbWVudE9wZW4oSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gKGVsZW1lbnQuaXNKU1BUYWcoKSkgPyAiPCUtLSIgOiAiPCEtLSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXByaXZhdGUgQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBmQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuZFRhZyhJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBjb250ZW50ID0gZkhhbmRsZXIuZ2VuZXJhdGVFbmRUYWdDb250ZW50KGVsZW1lbnQpOwotCQlpZiAoY29udGVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWJ1ZmZlci5hcHBlbmQoZ2VuZXJhdGVDb21tZW50T3BlbihlbGVtZW50KSk7Ci0JCWJ1ZmZlci5hcHBlbmQoY29udGVudCk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2VuZXJhdGVDb21tZW50Q2xvc2UoZWxlbWVudCkpOwotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhhbmRsZXJJRCgpIHsKLQkJcmV0dXJuIGdldENvbmZpZ3VyYXRpb24oKS5nZXRIYW5kbGVySUQoKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eShuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXJ0VGFnKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGNvbnRlbnQgPSBmSGFuZGxlci5nZW5lcmF0ZVN0YXJ0VGFnQ29udGVudChlbGVtZW50KTsKLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlidWZmZXIuYXBwZW5kKGdlbmVyYXRlQ29tbWVudE9wZW4oZWxlbWVudCkpOwotCQlidWZmZXIuYXBwZW5kKGNvbnRlbnQpOwotCQlidWZmZXIuYXBwZW5kKGdlbmVyYXRlQ29tbWVudENsb3NlKGVsZW1lbnQpKTsKLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gQ29tbWVudEVsZW1lbnRBZGFwdGVyLmNsYXNzIHx8IHR5cGUgPT0gVGFnQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIoKSB7Ci0JCXJldHVybiAoIWZIYW5kbGVyLmlzRW1wdHkoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmRUYWcoKSB7Ci0JCXJldHVybiBmRW5kVGFnOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb24oQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJZkNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvQ29tbWVudEVsZW1lbnRIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L0NvbW1lbnRFbGVtZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2U4ZTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvQ29tbWVudEVsZW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tZW50RWxlbWVudEhhbmRsZXIgewotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwcmVmaXggb2YgdGhlIGNvbW1lbnQgY29udGVudCBtYXRjaGVzCi0JICogdGhlIHN0cmluZyBzcGVjaWZpZWQgaW4gJmx0O3N0YXJ0c3dpdGggcHJlZml4PSIiLyZndDsgaW4gcGx1Z2luCi0JICogZXh0ZW5zaW9uLiBDb21tZW50IGNvbnRlbnQgaXMgcGFyc2VkIGFuZCBuZXcgRE9NIGVsZW1lbnQgaXMgY3JlYXRlZCBpbgotCSAqIHRoaXMgbWV0aG9kLiBJbXBsZW1lbnRvciBoYXMgdG8gZG8gZm9sbG93aW5nOgotCSAqIDxsaT5Gb3Igc3RhcnQgdGFnIDoKLQkgKiA8dWw+Ci0JICogPGxpPnBhcnNlIGNvbW1lbnQgY29udGVudCBhbmQgY3JlYXRlIG5ldyBlbGVtZW50IGluc3RhbmNlLjwvbGk+Ci0JICogPC91bD4KLQkgKiA8L2xpPgotCSAqIDxsaT5Gb3IgZW5kIHRhZyA6Ci0JICogPHVsPgotCSAqIDxsaT5wYXJzZSBjb21tZW50IGNvbnRlbnQgYW5kIGNyZWF0ZSBuZXcgZWxlbWVudCBpbnN0YW5jZS48L2xpPgotCSAqIDxsaT5tYWtlIGlzRW5kVGFnIGZsYWcgdHJ1ZS48L2xpPgotCSAqIDxsaT5QYXJzZXIgZnJhbWV3b3JrIHNlYXJjaGVzIG1hY2hlZCBzdGFydCB0YWcgZWxlbWVudCBpbnN0YW5jZSBhZnRlcgotCSAqIHRoaXMgY3JlYXRlRWxlbWVudCBjYWxsLCBhbmQgbmV3IGluc3RhbmNlIGlzIGp1c3QgdGhyb3duIGF3YXkuPC9saT4KLQkgKiA8L3VsPgotCSAqIDwvbGk+Ci0JICogPGxpPkZvciBlbXB0eSB0YWcgOgotCSAqIDx1bD4KLQkgKiA8bGk+cGFyc2UgY29tbWVudCBjb250ZW50IGFuZCBjcmVhdGUgbmV3IGVsZW1lbnQgaW5zdGFuY2UuPC9saT4KLQkgKiA8bGk+bWFrZSBpc0VuZFRhZyBmbGFnIHRydWUuPC9saT4KLQkgKiA8L3VsPgotCSAqIDwvbGk+Ci0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICBwYXJlbnQgRE9NIGRvY3VtZW50Ci0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIGNvbW1lbnQgY29udGVudC4gY29tbWVudCBwcmVmaXggKCZsdDshLS0gb3IgJmx0OyUtLSksIHN1ZmZpeAotCSAqICAgICAgICAgICAgKC0tJmd0OyBvciAtLSUmZ3Q7KSwgYW5kIHN1cnJvdW5kaW5nIHNwYWNlcyBhcmUgdHJpbW1lZC4KLQkgKiBAcGFyYW0gaXNKU1BUYWcKLQkgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIGNvbW1lbnQgaXMgSlNQIHN0eWxlIGNvbW1lbnQuIFRoaXMgaW5mb3JtYXRpb24KLQkgKiAgICAgICAgICAgIG1heSBiZSByZXF1aXJlZCBieSBoYW5kbGVyIHdoZW4gdGhlIGhhbmRsZXIgYWNjZXB0cyBib3RoIFhNTAotCSAqICAgICAgICAgICAgc3R5bGUgYW5kIEpTUCBzdHlsZSBjb21tZW50IChuYW1lbHksCi0JICogICAgICAgICAgICBjb21tZW50dHlwZT0mcXVvdDtib3RoJnF1b3Q7IGluIHBsdWdpbi54bWwpLgotCSAqIEByZXR1cm4gY29tbWVudCBlbGVtZW50IGluc3RhbmNlIGlmIHRoZSBjb21tZW50IGNvbnRlbnQgaXMgcmlnaHRseQotCSAqICAgICAgICAgcGFyc2VkLiBpZiBwYXJzZSBmYWlsZWQsIHJldHVybnMgbnVsbC4KLQkgKi8KLQlFbGVtZW50IGNyZWF0ZUVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyB0aGUgc291cmNlIHRleHQgb2YgdGhlIGVuZCB0YWcgZm9yIHRoZSBwYXNzZWQKLQkgKiBlbGVtZW50LiBEbyBub3QgZ2VuZXJhdGUgY29tbWVudCBwcmVmaXggKCZsdDshLS0gb3IgJmx0OyUtLSkgYW5kIHN1ZmZpeAotCSAqICgtLSZndDsgb3IgLS0lJmd0OykuIFhNTEdlbmVyYXRvciB1c2VzIHRoaXMgbWV0aG9kIHRvIGdlbmVyYXRlIFhNTC9IVE1MCi0JICogc291cmNlIGZvciBhIGNvbW1lbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGNvbW1lbnQgZWxlbWVudAotCSAqIEByZXR1cm4gZ2VuZXJhdGVkIHRhZyBzdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVFbmRUYWdDb250ZW50KElET01FbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2VuZXJhdGVzIHRoZSBzb3VyY2UgdGV4dCBvZiB0aGUgc3RhcnQgdGFnIGZvciB0aGUgcGFzc2VkCi0JICogZWxlbWVudC4gRG8gbm90IGdlbmVyYXRlIGNvbW1lbnQgcHJlZml4ICgmbHQ7IS0tIG9yICZsdDslLS0pIGFuZCBzdWZmaXgKLQkgKiAoLS0mZ3Q7IG9yIC0tJSZndDspLiBYTUxHZW5lcmF0b3IgdXNlcyB0aGlzIG1ldGhvZCB0byBnZW5lcmF0ZSBYTUwvSFRNTAotCSAqIHNvdXJjZSBmb3IgYSBjb21tZW50IGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tZW50IGVsZW1lbnQKLQkgKiBAcmV0dXJuIGdlbmVyYXRlZCB0YWcgc3RyaW5nCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlU3RhcnRUYWdDb250ZW50KElET01FbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgY29tbWVudCBlbGVtZW50IG9yIG5vdAotCSAqLwotCWJvb2xlYW4gaXNDb21tZW50RWxlbWVudChJRE9NRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiB3aGV0aGVyIHRoaXMgZWxlbWVudCBjYW4gaGF2ZSBjaGlsZHJlbiBvciBub3QKLQkgKi8KLQlib29sZWFuIGlzRW1wdHkoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JLy8JU3RyaW5nIGdldEVsZW1lbnRQcmVmaXgoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaW1wbC9CYXNpY0NvbW1lbnRFbGVtZW50SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9pbXBsL0Jhc2ljQ29tbWVudEVsZW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZjYyMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9pbXBsL0Jhc2ljQ29tbWVudEVsZW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5pbXBsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LnV0aWwuQ29tbWVudEVsZW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC51dGlsLlRhZ1NjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSVNvdXJjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotCi0KLS8qKgotICovCi1jbGFzcyBCYXNpY0NvbW1lbnRFbGVtZW50SGFuZGxlciBpbXBsZW1lbnRzIENvbW1lbnRFbGVtZW50SGFuZGxlciB7Ci0KLQlwcml2YXRlIFN0cmluZyBlbGVtZW50TmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eTsKLQotCXB1YmxpYyBCYXNpY0NvbW1lbnRFbGVtZW50SGFuZGxlcihTdHJpbmcgZWxlbWVudE5hbWUsIGJvb2xlYW4gaXNFbXB0eSkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0JCXRoaXMuaXNFbXB0eSA9IGlzRW1wdHk7Ci0JfQotCi0KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgZGF0YSwgYm9vbGVhbiBpc0pTUFRhZykgewotCQlFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQlTdHJpbmcgc3RyID0gZGF0YS50cmltKCk7Ci0JCUNvbW1lbnRFbGVtZW50RmFjdG9yeSBmYWN0b3J5ID0gbmV3IENvbW1lbnRFbGVtZW50RmFjdG9yeShkb2N1bWVudCwgaXNKU1BUYWcsIHRoaXMpOwotCQlpZiAoc3RyLmNoYXJBdCgwKSA9PSAnLycpIHsgLy8gZW5kIHRhZwotCQkJVGFnU2Nhbm5lciBzY2FubmVyID0gbmV3IFRhZ1NjYW5uZXIoc3RyLCAxKTsgLy8gc2tpcCAnLycKLQkJCVN0cmluZyBuYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQkJaWYgKG5hbWUuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotCQkJCWVsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZShuYW1lLCBDb21tZW50RWxlbWVudEZhY3RvcnkuSVNfRU5EKTsKLQkJCX0KLQkJfSBlbHNlIHsgLy8gc3RhcnQgdGFnCi0JCQlUYWdTY2FubmVyIHNjYW5uZXIgPSBuZXcgVGFnU2Nhbm5lcihzdHIsIDApOwotCQkJU3RyaW5nIG5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCQlpZiAobmFtZS5lcXVhbHMoZWxlbWVudE5hbWUpKSB7Ci0JCQkJZWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlKG5hbWUsIChpc0VtcHR5KSA/IENvbW1lbnRFbGVtZW50RmFjdG9yeS5JU19FTVBUWSA6IENvbW1lbnRFbGVtZW50RmFjdG9yeS5JU19TVEFSVCk7Ci0JCQkJLy8gc2V0IGF0dHJpYnV0ZXMKLQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCQkJd2hpbGUgKGF0dHJOYW1lICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IHNjYW5uZXIubmV4dFZhbHVlKCk7Ci0JCQkJCUF0dHIgYXR0ciA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShhdHRyTmFtZSk7Ci0JCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCkKLQkJCQkJCQkoKElET01BdHRyKSBhdHRyKS5zZXRWYWx1ZVNvdXJjZShhdHRyVmFsdWUpOwotCQkJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQkJCQl9Ci0JCQkJCWF0dHJOYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVFbmRUYWdDb250ZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGlzRW1wdHkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gZWxlbWVudC5nZXRNb2RlbCgpLmdldEdlbmVyYXRvcigpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWJ1ZmZlci5hcHBlbmQoIiAvIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHRhZ05hbWUgPSBnZW5lcmF0b3IuZ2VuZXJhdGVUYWdOYW1lKGVsZW1lbnQpOwotCQlpZiAodGFnTmFtZSAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVN0YXJ0VGFnQ29udGVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gZWxlbWVudC5nZXRNb2RlbCgpLmdldEdlbmVyYXRvcigpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJU3RyaW5nIHRhZ05hbWUgPSBnZW5lcmF0b3IuZ2VuZXJhdGVUYWdOYW1lKGVsZW1lbnQpOwotCQlpZiAodGFnTmFtZSAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCQl9Ci0KLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJaW50IGxlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHIgYXR0ciA9IChBdHRyKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQlTdHJpbmcgYXR0ck5hbWUgPSBnZW5lcmF0b3IuZ2VuZXJhdGVBdHRyTmFtZShhdHRyKTsKLQkJCWlmIChhdHRyTmFtZSAhPSBudWxsKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChhdHRyTmFtZSk7Ci0JCQl9Ci0JCQlTdHJpbmcgYXR0clZhbHVlID0gZ2VuZXJhdG9yLmdlbmVyYXRlQXR0clZhbHVlKGF0dHIpOwotCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJLy8gYXR0ciBuYW1lIG9ubHkgZm9yIEhUTUwgYm9vbGVhbiBhbmQgSlNQCi0JCQkJYnVmZmVyLmFwcGVuZCgnPScpOwotCQkJCWJ1ZmZlci5hcHBlbmQoYXR0clZhbHVlKTsKLQkJCX0KLQkJfQotCi0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb21tZW50RWxlbWVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuZ2V0VGFnTmFtZSgpLmVxdWFscyhlbGVtZW50TmFtZSkpID8gdHJ1ZSA6IGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiBpc0VtcHR5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaW1wbC9Db21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaW1wbC9Db21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxMzNiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L2ltcGwvQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5pbXBsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LkNvbW1lbnRFbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uIHsKLQlwcml2YXRlIE1hcCBmQXR0cmlidXRlcyA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZDdXN0b207Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZkVsZW1lbnQgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGZFbXB0eTsKLQlwcml2YXRlIENvbW1lbnRFbGVtZW50SGFuZGxlciBmSGFuZGxlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZklEID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZkpTUENvbW1lbnQ7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBmUHJlZml4ID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZlhNTENvbW1lbnQ7Ci0KLQlDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCWZFbGVtZW50ID0gZWxlbWVudDsKLQkJZkN1c3RvbSA9IChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJoYW5kbGVyLWN1c3RvbSIpKSA/IHRydWUgOiBmYWxzZTsgLy8kTk9OLU5MUy0xJAotCi0JCWZpbGxBdHRyaWJ1dGVzKGVsZW1lbnQpOwotCi0JCWZYTUxDb21tZW50ID0gZkpTUENvbW1lbnQgPSBmYWxzZTsKLQkJU3RyaW5nIGNvbW1lbnRUeXBlID0gZ2V0UHJvcGVydHkoImNvbW1lbnR0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNvbW1lbnRUeXBlLmVxdWFsc0lnbm9yZUNhc2UoInhtbCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZYTUxDb21tZW50ID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChjb21tZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3AiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlmSlNQQ29tbWVudCA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoY29tbWVudFR5cGUuZXF1YWxzSWdub3JlQ2FzZSgiYm90aCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZYTUxDb21tZW50ID0gZkpTUENvbW1lbnQgPSB0cnVlOwotCQl9Ci0JCVN0cmluZyBlbXB0eSA9IGdldFByb3BlcnR5KCJpc2VtcHR5Iik7IC8vJE5PTi1OTFMtMSQKLQkJZkVtcHR5ID0gKGVtcHR5ICE9IG51bGwgJiYgIWVtcHR5LmVxdWFscygiZmFsc2UiKSkgPyB0cnVlIDogZmFsc2U7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRKU1BDb21tZW50KCkgewotCQlyZXR1cm4gZkpTUENvbW1lbnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0WE1MQ29tbWVudCgpIHsKLQkJcmV0dXJuIGZYTUxDb21tZW50OwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKSB7Ci0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIGdldEhhbmRsZXIoKS5jcmVhdGVFbGVtZW50KGRvY3VtZW50LCBkYXRhLCBpc0pTUFRhZyk7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCUNvbW1lbnRFbGVtZW50QWRhcHRlciBhZGFwdGVyID0gKENvbW1lbnRFbGVtZW50QWRhcHRlcikgZWxlbWVudC5nZXRBZGFwdGVyRm9yKENvbW1lbnRFbGVtZW50QWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlci5zZXRDb25maWd1cmF0aW9uKHRoaXMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBmaWxsQXR0cmlidXRlcyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZkF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJZkF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQl9IGVsc2UgewotCQkJZkF0dHJpYnV0ZXMuY2xlYXIoKTsKLQkJfQotCQlTdHJpbmdbXSBuYW1lcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTmFtZXMoKTsKLQkJaWYgKG5hbWVzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgbGVuZ3RoID0gbmFtZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IG5hbWVzW2ldOwotCQkJZkF0dHJpYnV0ZXMucHV0KG5hbWUudG9Mb3dlckNhc2UoKSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUobmFtZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIENvbW1lbnRFbGVtZW50SGFuZGxlciBnZXRIYW5kbGVyKCkgewotCQlpZiAoZkhhbmRsZXIgPT0gbnVsbCkgewotCQkJaWYgKGZFbGVtZW50ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoaXNDdXN0b20oKSkgewotCQkJCQkJZkhhbmRsZXIgPSAoQ29tbWVudEVsZW1lbnRIYW5kbGVyKSBmRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBnZXRQcm9wZXJ0eSgiZWxlbWVudG5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZkhhbmRsZXIgPSBuZXcgQmFzaWNDb21tZW50RWxlbWVudEhhbmRsZXIoZWxlbWVudE5hbWUsIGZFbXB0eSk7Ci0JCQkJCX0KLQkJCQkJLy8JCQkJCSgoQWJzdHJhY3RDb21tZW50RWxlbWVudEhhbmRsZXIpZkhhbmRsZXIpLnNldEVsZW1lbnRQcmVmaXgoZkVsZW1lbnQuZ2V0QXR0cmlidXRlKCJwcmVmaXgiKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gY2F0Y2ggYW5kIGxvZyAoYW5kIGlnbm9yZSkgQU5ZIGV4Y2VwdGlvbiBjcmVhdGVkCi0JCQkJCS8vIGJ5IGV4ZWN1dGFibGUgZXh0ZW5zaW9uLgotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQlmSGFuZGxlciA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZIYW5kbGVyID09IG51bGwpIHsKLQkJCQlmSGFuZGxlciA9IG5ldyBDb21tZW50RWxlbWVudEhhbmRsZXIoKSB7Ci0JCQkJCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVFbmRUYWdDb250ZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIFN0cmluZyBnZW5lcmF0ZVN0YXJ0VGFnQ29udGVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0vLyByZW1vdmVkIGluIFJDMiwgcm8gcmVtb3ZlZCAidW51c2VkIiBlcnJvci93YXJuaW5nCi0vLwkJCQkJcHVibGljIFN0cmluZyBnZXRFbGVtZW50UHJlZml4KCkgewotLy8JCQkJCQlyZXR1cm4gbnVsbDsKLS8vCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gaXNDb21tZW50RWxlbWVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkhhbmRsZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIYW5kbGVySUQoKSB7Ci0JCWlmIChmSUQgPT0gbnVsbCkgewotCQkJZklEID0gZ2V0UHJvcGVydHkoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChmSUQgPT0gbnVsbCkgewotCQkJCWlmIChpc0N1c3RvbSgpKSB7Ci0JCQkJCWZJRCA9IGdldFByb3BlcnR5KCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCQkJCQotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCWJ1Zi5hcHBlbmQoZkVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCkpOwotCQkJCQlidWYuYXBwZW5kKCcuJyk7Ci0JCQkJCWJ1Zi5hcHBlbmQoZ2V0UHJvcGVydHkoImVsZW1lbnRuYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCWZJRCA9IGJ1Zi50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZklEOwotCX0KLQotCi0JcHVibGljIFN0cmluZ1tdIGdldFByZWZpeCgpIHsKLQkJaWYgKGZQcmVmaXggPT0gbnVsbCkgewotCQkJaWYgKGZFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoaXNDdXN0b20oKSkgeyAvLyBjdXN0b20KLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcHJlZml4ZXMgPSBmRWxlbWVudC5nZXRDaGlsZHJlbigic3RhcnR3aXRoIik7IC8vJE5PTi1OTFMtMSQJCi0JCQkJCWlmIChwcmVmaXhlcyAhPSBudWxsKSB7Ci0JCQkJCQlmUHJlZml4ID0gbmV3IFN0cmluZ1twcmVmaXhlcy5sZW5ndGhdOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWZQcmVmaXhbaV0gPSBwcmVmaXhlc1tpXS5nZXRBdHRyaWJ1dGUoInByZWZpeCIpOyAvLyROT04tTkxTLTEkCQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsgLy8gYmFzaWMKLQkJCQkJU3RyaW5nIG5hbWUgPSBnZXRQcm9wZXJ0eSgiZWxlbWVudG5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoaXNFbXB0eSgpKSB7Ci0JCQkJCQkJZlByZWZpeCA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJCQkJZlByZWZpeFswXSA9IG5hbWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWZQcmVmaXggPSBuZXcgU3RyaW5nWzJdOwotCQkJCQkJCWZQcmVmaXhbMF0gPSBuYW1lOwotCQkJCQkJCWZQcmVmaXhbMV0gPSAnLycgKyBuYW1lOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChmUHJlZml4ID09IG51bGwpIHsKLQkJCWZQcmVmaXggPSBuZXcgU3RyaW5nWzFdOwotCQkJZlByZWZpeFswXSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZQcmVmaXg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKGZBdHRyaWJ1dGVzICE9IG51bGwpID8gKFN0cmluZykgZkF0dHJpYnV0ZXMuZ2V0KG5hbWUpIDogbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNDdXN0b20oKSB7Ci0JCXJldHVybiBmQ3VzdG9tOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gZkVtcHR5OwotCX0KLQotCXZvaWQgc2V0dXBDb21tZW50RWxlbWVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCWVsZW1lbnQuc2V0Q29tbWVudFRhZyh0cnVlKTsKLQkJQ29tbWVudEVsZW1lbnRBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgQ29tbWVudEVsZW1lbnRBZGFwdGVyKGZhbHNlLCBmSGFuZGxlcik7Ci0JCWFkYXB0ZXIuc2V0Q29uZmlndXJhdGlvbih0aGlzKTsKLQkJZWxlbWVudC5hZGRBZGFwdGVyKGFkYXB0ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaW1wbC9Db21tZW50RWxlbWVudFJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L2ltcGwvQ29tbWVudEVsZW1lbnRSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmQxZjY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaW1wbC9Db21tZW50RWxlbWVudFJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmltcGw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudEVsZW1lbnRSZWdpc3RyeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb21tZW50RWxlbWVudFJlZ2lzdHJ5IGZJbnN0YW5jZSA9IG51bGw7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDb21tZW50RWxlbWVudFJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDb21tZW50RWxlbWVudFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiY29tbWVudEVsZW1lbnRIYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uW10gZkNvbmZpZ3VyYXRpb25zID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ29tbWVudEVsZW1lbnRSZWdpc3RyeS4KLQkgKi8KLQlwcml2YXRlIENvbW1lbnRFbGVtZW50UmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbltdIGdldENvbmZpZ3VyYXRpb25zKCkgewotCQlpZiAoZkNvbmZpZ3VyYXRpb25zID09IG51bGwpIHsKLQkJCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZkNvbmZpZ3VyYXRpb25zID0gbmV3IENvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbltlbGVtZW50cy5sZW5ndGhdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZkNvbmZpZ3VyYXRpb25zW2ldID0gbmV3IENvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbihlbGVtZW50c1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZDb25maWd1cmF0aW9ucyA9PSBudWxsKSB7Ci0JCQkJZkNvbmZpZ3VyYXRpb25zID0gbmV3IENvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvblswXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkNvbmZpZ3VyYXRpb25zOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNldHVwQ29tbWVudEVsZW1lbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbnNbXSA9IGdldENvbmZpZ3VyYXRpb25zKCk7Ci0JCWludCBsZW5ndGggPSBjb25maWd1cmF0aW9ucy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUNvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbiBjb25mID0gY29uZmlndXJhdGlvbnNbaV07Ci0JCQlib29sZWFuIGlzSlNQID0gZWxlbWVudC5pc0pTUFRhZygpOwotCQkJaWYgKGlzSlNQICYmIGNvbmYuYWNjZXB0SlNQQ29tbWVudCgpIHx8ICFpc0pTUCAmJiBjb25mLmFjY2VwdFhNTENvbW1lbnQoKSkgewotCQkJCUNvbW1lbnRFbGVtZW50SGFuZGxlciBoYW5kbGVyID0gY29uZi5nZXRIYW5kbGVyKCk7Ci0JCQkJaWYgKGhhbmRsZXIuaXNDb21tZW50RWxlbWVudChlbGVtZW50KSkgewotCQkJCQljb25mLnNldHVwQ29tbWVudEVsZW1lbnQoZWxlbWVudCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC91dGlsL0NvbW1lbnRFbGVtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC91dGlsL0NvbW1lbnRFbGVtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWMyN2JhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvdXRpbC9Db21tZW50RWxlbWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQudXRpbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tZW50RWxlbWVudEZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElTX0VNUFRZID0gNDg2NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJU19FTkQgPSAxODA4OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVNfU1RBUlQgPSAyODAxMTsKLQotCXByaXZhdGUgRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgQ29tbWVudEVsZW1lbnRIYW5kbGVyIGZIYW5kbGVyOwotCXByaXZhdGUgYm9vbGVhbiBmSlNQVGFnOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENvbW1lbnRFbGVtZW50RmFjdG9yeS4KLQkgKi8KLQlwcml2YXRlIENvbW1lbnRFbGVtZW50RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbWVudEVsZW1lbnRGYWN0b3J5KERvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIGlzSlNQVGFnLCBDb21tZW50RWxlbWVudEhhbmRsZXIgaGFuZGxlcikgewotCQl0aGlzKCk7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmSlNQVGFnID0gaXNKU1BUYWc7Ci0JCWZIYW5kbGVyID0gaGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGUoU3RyaW5nIG5hbWUsIGludCBub2RlVHlwZSkgewotCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBmRG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQllbGVtZW50LnNldENvbW1lbnRUYWcodHJ1ZSk7Ci0JCWlmIChub2RlVHlwZSA9PSBJU19FTVBUWSkgewotCQkJZWxlbWVudC5zZXRFbXB0eVRhZyh0cnVlKTsKLQkJfQotCQllbGVtZW50LnNldEpTUFRhZyhmSlNQVGFnKTsKLQotCQlDb21tZW50RWxlbWVudEFkYXB0ZXIgYWRhcHRlciA9IG5ldyBDb21tZW50RWxlbWVudEFkYXB0ZXIoKG5vZGVUeXBlID09IElTX0VORCksIGZIYW5kbGVyKTsKLQkJZWxlbWVudC5hZGRBZGFwdGVyKGFkYXB0ZXIpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvdXRpbC9UYWdTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L3V0aWwvVGFnU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDBkNDA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvdXRpbC9UYWdTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC51dGlsOwotCi0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdTY2FubmVyIHsKLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFcXVhbChjaGFyIGMpIHsKLQkJcmV0dXJuIChjID09ICc9Jyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1F1b3RlKGNoYXIgYykgewotCQlyZXR1cm4gKGMgPT0gJyInIHx8IGMgPT0gJ1wnJyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NwYWNlKGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKTsKLQl9Ci0KLQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCXByaXZhdGUgaW50IG1lbU9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gMDsKLQlwcml2YXRlIGJvb2xlYW4gb25lTGluZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGFnID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBUYWdTY2FubmVyKFN0cmluZyB0YWcsIGludCBvZmZzZXQpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLnRhZyA9IHRhZzsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCXRoaXMubWVtT2Zmc2V0ID0gLTE7Ci0JCWlmICh0YWcgIT0gbnVsbCkKLQkJCXRoaXMubGVuZ3RoID0gdGFnLmxlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBUYWdTY2FubmVyKFN0cmluZyB0YWcsIGludCBvZmZzZXQsIGJvb2xlYW4gb25lTGluZSkgewotCQl0aGlzKHRhZywgb2Zmc2V0KTsKLQotCQl0aGlzLm9uZUxpbmUgPSBvbmVMaW5lOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TmV4dE9mZnNldCgpIHsKLQkJaW50IGk7Ci0JCWNoYXIgYzsKLQkJZm9yIChpID0gb2Zmc2V0OyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWMgPSB0YWcuY2hhckF0KGkpOwotCQkJaWYgKGlzRW5kKGMpKQotCQkJCWJyZWFrOwotCQkJaWYgKGlzUXVvdGUoYykpIHsKLQkJCQlpKys7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoIWlzU3BhY2UoYykgJiYgIWlzRXF1YWwoYykpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB0aGlzLm1lbU9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNFbmQoY2hhciBjKSB7Ci0JCXJldHVybiAodGhpcy5vbmVMaW5lICYmIChjID09ICdccicgfHwgYyA9PSAnXG4nKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXdMaW5lKCkgewotCQlpZiAob25lTGluZSkKLQkJCXJldHVybiBmYWxzZTsKLQkJY2hhciBjOwotCQlmb3IgKGludCBpID0gbWVtT2Zmc2V0IC0gMTsgMCA8PSBpOyBpLS0pIHsKLQkJCWMgPSB0YWcuY2hhckF0KGkpOwotCQkJaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAoIWlzU3BhY2UoYykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGNoYXIgbmV4dENoYXIoKSB7Ci0JCWZvciAoOyB0aGlzLm9mZnNldCA8IHRoaXMubGVuZ3RoOyB0aGlzLm9mZnNldCsrKSB7Ci0JCQljaGFyIGMgPSB0aGlzLnRhZy5jaGFyQXQodGhpcy5vZmZzZXQpOwotCQkJaWYgKGlzRW5kKGMpKQotCQkJCWJyZWFrOwotCQkJaWYgKCFpc1NwYWNlKGMpKQotCQkJCXJldHVybiBjOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgbmV4dE5hbWUoKSB7Ci0JCWlmICh0aGlzLnRhZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLm9mZnNldCA+PSB0aGlzLmxlbmd0aCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChuZXh0Q2hhcigpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgbmFtZU9mZnNldCA9IHRoaXMub2Zmc2V0OwotCQlmb3IgKDsgdGhpcy5vZmZzZXQgPCB0aGlzLmxlbmd0aDsgdGhpcy5vZmZzZXQrKykgewotCQkJY2hhciBjID0gdGhpcy50YWcuY2hhckF0KHRoaXMub2Zmc2V0KTsKLQkJCWlmIChpc0VuZChjKSB8fCBpc1NwYWNlKGMpKQotCQkJCWJyZWFrOwotCQkJaWYgKGlzRXF1YWwoYykgJiYgdGhpcy5vZmZzZXQgPiBuYW1lT2Zmc2V0KQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmICh0aGlzLm9mZnNldCA9PSBuYW1lT2Zmc2V0KQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJdGhpcy5tZW1PZmZzZXQgPSBuYW1lT2Zmc2V0OwotCQlyZXR1cm4gdGhpcy50YWcuc3Vic3RyaW5nKG5hbWVPZmZzZXQsIHRoaXMub2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIG5leHRWYWx1ZSgpIHsKLQkJaWYgKHRoaXMudGFnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMub2Zmc2V0ID49IHRoaXMubGVuZ3RoKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJY2hhciBzZXBlcmF0b3IgPSBuZXh0Q2hhcigpOwotCQlpZiAoIWlzRXF1YWwoc2VwZXJhdG9yKSkKLQkJCXJldHVybiBudWxsOwotCQl0aGlzLm9mZnNldCsrOyAvLyBza2lwICc9JwotCQljaGFyIHF1b3RlID0gbmV4dENoYXIoKTsKLQkJaWYgKHF1b3RlID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGlzUXVvdGUocXVvdGUpKQotCQkJdGhpcy5vZmZzZXQrKzsKLQkJZWxzZQotCQkJcXVvdGUgPSAwOwotCi0JCWludCB2YWx1ZU9mZnNldCA9IHRoaXMub2Zmc2V0OwotCQlmb3IgKDsgdGhpcy5vZmZzZXQgPCB0aGlzLmxlbmd0aDsgdGhpcy5vZmZzZXQrKykgewotCQkJY2hhciBjID0gdGhpcy50YWcuY2hhckF0KHRoaXMub2Zmc2V0KTsKLQkJCWlmIChpc0VuZChjKSkgewotCQkJCXF1b3RlID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChxdW90ZSA9PSAwKSB7Ci0JCQkJaWYgKGlzU3BhY2UoYykpCi0JCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoYyA9PSBxdW90ZSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaW50IHZhbHVlRW5kID0gdGhpcy5vZmZzZXQ7Ci0JCWlmIChxdW90ZSAhPSAwICYmIHRoaXMub2Zmc2V0IDwgdGhpcy5sZW5ndGgpCi0JCQl0aGlzLm9mZnNldCsrOwotCQlpZiAodmFsdWVFbmQgPT0gdmFsdWVPZmZzZXQpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQl0aGlzLm1lbU9mZnNldCA9IHZhbHVlT2Zmc2V0OwotCQlyZXR1cm4gdGhpcy50YWcuc3Vic3RyaW5nKHZhbHVlT2Zmc2V0LCB2YWx1ZUVuZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2JjYmVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LklsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciB7Ci0KLQlwcm90ZWN0ZWQgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudG87Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSGVhZGVyUGFyc2VkOwotCi0JcHJvdGVjdGVkIFJlYWRlciBmUmVhZGVyOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBvbmNlIHRoaXMgaW5zdGFuY2UgaXMgY3JlYXRlZCwgdHJhY2UgaW5mbyBzdGlsbCBuZWVkcyB0byBiZQotCSAqIGFwcGVuZGVkIGJ5IGNhbGxlciwgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IGl0cyBjcmVhdGVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJZkVuY29kaW5nTWVtZW50by5zZXRKYXZhQ2hhcnNldE5hbWUoZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChkZXRlY3RlZENoYXJzZXROYW1lKSk7Ci0JCWZFbmNvZGluZ01lbWVudG8uc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gVE9ETzogaWYgZGV0ZWN0ZWRDaGFyc2V0IGFuZCBzcGVjIGRlZmF1bHQgaXMKLQkJLy8gbnVsbCwgbmVlZCB0byB1c2UgIndvcmsKLQkJLy8gYmVuY2ggYmFzZWQiIGRlZmF1bHRzLgotCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIGNvbnZpZW5jZSBtZXRob2QgYWxsIHN1YmNsYXNzZXMgY2FuIHVzZSAoYnV0IG5vdCBvdmVycmlkZSkKLQkgKiAKLQkgKiBAcGFyYW0gZGV0ZWN0ZWRDaGFyc2V0TmFtZQotCSAqIEBwYXJhbSByZWFzb24KLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUsIFN0cmluZyByZWFzb24pIHsKLQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCX0KLQotCS8qKgotCSAqIGNvbnZpZW5jZSBtZXRob2QgYWxsIHN1YmNsYXNzZXMgY2FuIHVzZSAoYnV0IG5vdCBvdmVycmlkZSkKLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCBlbnN1cmVJbnB1dFNldCgpIHsKLQkJaWYgKGZSZWFkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5wdXQgbXVzdCBiZSBzZXQgYmVmb3JlIHVzZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gcmV0dXJuIG51bGwsIGlmIGludmFsaWQgY2hhcnNldCBuYW1lIChpbiB3aGljaCBjYXNlCi0JICogImFwcHJvcHJpYXRlRGVmYXVsdCIgc2hvdWxkIGJlIHVzZWQsIGlmIGEgbmFtZSBpcyByZWFsbHkgbmVlZCBmb3Igc29tZQotCSAqICJzYXZlIGFueXdheSIgY2FzZXMpLgotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIDEuIENoZWNrIGV4cGxpY2l0IG1hcHBpbmcgb3ZlcnJpZGVzIGZyb20KLQkJLy8gcHJvcGVydHkgZmlsZSAtLSBpdHMgaGVyZSB3ZSBwaWNrIHVwICJydWxlcyIgZm9yIGNhc2VzCi0JCS8vIHRoYXQgYXJlIG5vdCBldmVuIGluIEphdmEKLQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIDIuIFVzZSB0aGUgImNhbm9uaWNhbCIgbmFtZSBmcm9tIEpSRSBtYXBwaW5ncwotCQkvLyBOb3RlOiBzZWUgQ2hhcnNldCBKYXZhRG9jLCB0aGUgbmFtZSB5b3UgZ2V0IG9uZQotCQkvLyB3aXRoIGNhbiBiZSBhbGlhcywKLQkJLy8gdGhlIG5hbWUgeW91IGdldCBiYWNrIGlzICJzdGFuZGFyZCIgbmFtZS4KLQkJQ2hhcnNldCBqYXZhQ2hhcnNldCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlqYXZhQ2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9ubHkgc2V0IGludmFsaWQsIGlmIHJlc3VsdCBpcyBzYW1lIGFzIGRldGVjdGVkIC0tIHRoZXkgd29uJ3QKLQkJCS8vIGJlIGVxdWFsIGlmCi0JCQkvLyBvdmVycmlkZGVuCi0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmVxdWFscyhkZXRlY3RlZENoYXJzZXROYW1lKSkgewotCQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SW52YWxpZEVuY29kaW5nKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkJfQotCQl9IGNhdGNoIChJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gZSkgewotCQkJLy8gb25seSBzZXQgaW52YWxpZCwgaWYgcmVzdWx0IGlzIHNhbWUgYXMgZGV0ZWN0ZWQgLS0gdGhleSB3b24ndAotCQkJLy8gYmUgZXF1YWwgaWYKLQkJCS8vIG92ZXJyaWRkZW4KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldE5hbWUpKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50by5zZXRJbnZhbGlkRW5jb2RpbmcoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gZ2l2ZSBwcmlvcml0eSB0byBqYXZhIGNvbm9uaWNhbCBuYW1lLCBpZiBwcmVzZW50Ci0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBqYXZhQ2hhcnNldC5uYW1lKCk7Ci0JCQkvLyBidXQgc3RpbGwgYWxsb3cgb3ZlcnJpZGVzCi0JCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhyZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRFbmNvZGluZ01lbWVudG8oKS5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JfQotCi0JLy8gdG8gZW5zdXJlIGNvbnNpc3Qgb3ZlcmFsbCBydWxlcyB1c2VkLCB3ZSdsbCBtYXJrIGFzCi0JLy8gZmluYWwsCi0JLy8gYW5kIHJlcXVpcmUgc3ViY2xhc3NlcyB0byBwcm92aWRlIGNlcnRhaW4gcGllY2VzIG9mCi0JLy8gdGhlCi0JLy8gaW1wbGVtZW50YXRpb24KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWVuc3VyZUlucHV0U2V0KCk7Ci0JCWlmICghZkhlYWRlclBhcnNlZCkgewotCQkJcGFyc2VJbnB1dCgpOwotCQkJLy8gd2Uga2VlcCB0cmFjayBvZiBpZiBoZWFkZXIncyBhbHJlYWR5IGJlZW4KLQkJCS8vIHBhcnNlLCBzbyBjYW4gbWFrZQotCQkJLy8gbXVsdGlwbGUgJ2dldCcgY2FsbHMsIHdpdGhvdXQgY2F1c2luZwotCQkJLy8gcmVwYXJzaW5nLgotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCQkvLyBOb3RlOiB0aGVyZSBpcyBhICJoaWRkZW4gYXNzdW1wdGlvbiIgaGVyZQotCQkJLy8gdGhhdCBhbiBlbXB0eQotCQkJLy8gc3RyaW5nIGluIGNvbnRlbnQgc2hvdWxkIGJlIHRyZWF0ZWQgc2FtZSBhcwotCQkJLy8gbm90IHByZXNlbnQuCi0JCX0KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJaGFuZGxlU3BlY0RlZmF1bHQoKTsKLQkJfQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQkvLyBzYWZ0eSBuZXQKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgTnVsbE1lbWVudG8oKTsKLQkJfQotCQlyZXR1cm4gZkVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRvIHJldHVybiBhIGRlZmF1bHQgZW5jb2RpbmcgLS0gYXMgc3BlY2lmaWVkIGJ5IGFuIGluZHVzdHJ5Ci0JICogY29udGVudCB0eXBlIHNwZWMgLS0gd2hlbiBub3QgcHJlc2VudCBpbiB0aGUgc3RyZWFtLCBmb3IgZXhhbXBsZSwgWE1MCi0JICogc3BlY2lmaWVzIFVURi04LCBKU1Agc3BlY2lmaWVzIElTTy04ODU5LTEuIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4KLQkgKiBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggInNwZWMgZGVmYXVsdCIuCi0JICovCi0JYWJzdHJhY3QgcHVibGljIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldFNwZWNEZWZhdWx0RW5jb2RpbmdNZW1lbnRvKCkgewotCQlyZXNldEFsbCgpOwotCQlFbmNvZGluZ01lbWVudG8gcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIGVuYyA9IGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJaWYgKGVuYyAhPSBudWxsKSB7Ci0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVGQVVMVFNfQVNTVU1FRF9GT1JfRU1QVFlfSU5QVVQpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZW5jKTsKLQkJCXJlc3VsdCA9IGZFbmNvZGluZ01lbWVudG87Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU3BlY0RlZmF1bHQoKSB7Ci0JCVN0cmluZyBlbmNvZGluZ05hbWU7Ci0JCWVuY29kaW5nTmFtZSA9IGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJaWYgKGVuY29kaW5nTmFtZSAhPSBudWxsKSB7Ci0JCQkvL2NyZWF0ZUVuY29kaW5nTWVtZW50byhlbmNvZGluZ05hbWUsCi0JCQkvLyBFbmNvZGluZ01lbWVudG8uVVNFRF9DT05URU5UX1RZUEVfREVGQVVMVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRKYXZhQ2hhcnNldE5hbWUoZW5jb2RpbmdOYW1lKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGVuY29kaW5nTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFdmVyeSBzdWJjbGFzcyBtdXN0IHByb3ZpZGUgYSB3YXkgdG8gcGFyc2UgdGhlIGlucHV0LiBUaGlzIG1ldGhvZCBoYXMKLQkgKiBzZXZlcmFsIGNyaXRpY2FsIHJlc3BvbnNpYmlsaXRpZXM6Ci0JICogPGxpPnNldCB0aGUgZkVuY29kaW5nTWVtZW50byBmaWVsZCBhcHByb3ByaWF0ZWx5LCBhY2NvcmRpbmcgdG8gdGhlCi0JICogcmVzdWx0cyBvZiB0aGUgcGFyc2Ugb2YgZlJlYWRlci48L2xpPgotCSAqIDxsaT5zZXQgZkhhcmRlclBhcnNlZCB0byB0cnVlLCB0byBhdm9pZCB3YXN0ZWQgcmUtcGFyc2luZy48L2xpPgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRBbGwoKSB7Ci0JCWZSZWFkZXIgPSBudWxsOwotCQlmSGVhZGVyUGFyc2VkID0gZmFsc2U7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBudWxsOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJcmVzZXRBbGwoKTsKLQkJZlJlYWRlciA9IG5ldyBCeXRlUmVhZGVyKGlucHV0U3RyZWFtKTsKLQkJdHJ5IHsKLQkJCWZSZWFkZXIubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlLCBzaW5jZSB3ZSBrbm93IEJ5dGVSZWFkZXIKLQkJCS8vIHN1cHBvcnRzIG1hcmtpbmcKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSVN0b3JhZ2UgaVN0b3JhZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmVzZXRBbGwoKTsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBpU3RvcmFnZS5nZXRDb250ZW50cygpOwotCQlJbnB1dFN0cmVhbSByZXNldHRhYmxlU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0sIENvZGVkSU8uTUFYX0JVRl9TSVpFKTsKLQkJcmVzZXR0YWJsZVN0cmVhbS5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCXNldChyZXNldHRhYmxlU3RyZWFtKTsKLQkJLy8gVE9ETyB3ZSdsbCBuZWVkIHRvICJyZW1lbWJlciIgSUZpbGUsIG9yCi0JCS8vIGdldCBpdHMgKG9yIGl0cyBwcm9qZWN0J3MpIHNldHRpbmdzLCBpbiBjYXNlCi0JCS8vIHRob3NlIGFyZSBuZWVkZWQgdG8gaGFuZGxlIGNhc2VzIHdoZW4gdGhlCi0JCS8vIGVuY29kaW5nIGlzIG5vdCBpbiB0aGUgZmlsZSBzdHJlYW0uCi0JfQotCi0JLyoqCi0JICogTm90ZTogdGhpcyBpcyBub3QgcGFydCBvZiBpbnRlcmZhY2UgdG8gaGVscCBhdm9pZCBjb25mdXNpb24gLi4uIGl0Ci0JICogZXhwZWN0ZWQgdGhpcyBSZWFkZXIgaXMgYSB3ZWxsIGZvcm1lZCBjaGFyYWN0ZXIgcmVhZGVyIC4uLiB0aGF0IGlzLCBpdHMKLQkgKiBhbGwgcmVhZHkgYmVlbiBkZXRlcm1pbmVkIHRvIG5vdCBiZSBhIHVuaWNvZGUgbWFya2VkIGlucHV0IHN0cmVhbS4gQW5kLAotCSAqIGl0cyBhc3N1bWVkIHRvIGJlIGluIHRoZSBjb3JyZWN0IHBvc2l0aW9uLCBhdCBwb3NpdGlvbiB6ZXJvLCByZWFkeSB0bwotCSAqIHJlYWQgZmlyc3QgY2hhcmFjdGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldChSZWFkZXIgcmVhZGVyKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZSZWFkZXIgPSByZWFkZXI7Ci0JCWlmICghZlJlYWRlci5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCWZSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZlJlYWRlcik7Ci0JCX0KLQkJdHJ5IHsKLQkJCWZSZWFkZXIubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NibGUsIHNpbmNlIHdlIGp1c3QgY2hlY2tlZCBpZiBtYXJrYWJsZQotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0J5dGVSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q1MGIzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0J5dGVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci0KLS8qKgotICogVGhpcyBpcyBhbiAiYWRhcHRlciIgY2xhc3MsIHNpbXBseSB0byBnZXQgaW4gaW5wdXQgc3RyZWFtIHRvIGFjdCBsaWtlIGEKLSAqIHJlYWRlci4gV2UgY291bGQgbm90IHVzZSBJbnB1dFN0cmVhbVJlYWRlciBkaXJlY3RseSBiZWNhdXNlIGl0cyBpbnRlcm5hbAotICogYnVmZmVycyBhcmUgbm90IGNvbnRyb2xsYWJsZSwgYW5kIGl0IHNvbWV0aW1lcyBwdWxscyB0b28gbXVjaCBvdXQgb2YgaW5wdXQKLSAqIHN0cmVhbSAoZXZlbiB3aGVuIGl0IHdhc24ndCBuZWVkZWQgZm9yIG91ciBwdXJwb3NlcykuCi0gKiAKLSAqIFRoZSB1c2Ugb2YgdGhpcyBjbGFzcyBpcyBoaWdobHkgc3BlY2lhbGl6ZWQgYW5kIGJ5IG5vdCBtZWFucyBtZWFudCB0byBiZQotICogZ2VuZXJhbCBwdXJwb3NlLiBJdHMgdXNlIGlzIHJlc3RyaWN0ZWQgdG8gdGhvc2UgY2FzZXMgd2hlcmUgdGhlIGlucHV0Ci0gKiBzdHJlYW0gY2FuIGJlIHJlZ2FyZGVkIGFzIGFzY2lpIGp1c3QgbG9uZyBlbm91Z2ggdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIHJlYWwKLSAqIGVuY29kaW5nIHNob3VsZCBiZS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQnl0ZVJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gQ29kZWRJTy5NQVhfQlVGX1NJWkU7Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGZCdWZmZXI7Ci0KLQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZklucHV0U3RyZWFtOwotCi0JcHJvdGVjdGVkIEJ5dGVSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEJ5dGVSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJdGhpcyhpbnB1dFN0cmVhbSwgREVGQVVMVF9CVUZGRVJfU0laRSk7Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgQnl0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgaW50IHNpemUpIHsKLQkJZklucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZkJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOwotCi0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmSW5wdXRTdHJlYW0uY2xvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkQWhlYWRMaW1pdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZklucHV0U3RyZWFtLm1hcmsocmVhZEFoZWFkTGltaXQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBiMCA9IGZJbnB1dFN0cmVhbS5yZWFkKCk7Ci0JCXJldHVybiAoYjAgJiAweDAwRkYpOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZChjaGFyIGNoW10sIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChsZW5ndGggPiBmQnVmZmVyLmxlbmd0aCkgewotCQkJbGVuZ3RoID0gZkJ1ZmZlci5sZW5ndGg7Ci0JCX0KLQotCQlpbnQgY291bnQgPSBmSW5wdXRTdHJlYW0ucmVhZChmQnVmZmVyLCAwLCBsZW5ndGgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJaW50IGIwID0gZkJ1ZmZlcltpXTsKLQkJCS8vIHRoZSAweDAwRkYgaXMgdG8gImxvc2UiIHRoZSBuZWdhdGl2ZSBiaXRzIGZpbGxlZCBpbiB0aGUgYnl0ZSB0bwotCQkJLy8gaW50IGNvbnZlcnNpb24KLQkJCS8vIChhbmQgd2hpY2ggd291bGQgYmUgdGhlcmUgaWYgY2FzdCBkaXJlY3RseSBmcm9tIGJ5dGUgdG8gY2hhcikuCi0JCQljaGFyIGMwID0gKGNoYXIpIChiMCAmIDB4MDBGRik7Ci0JCQljaFtvZmZzZXQgKyBpXSA9IGMwOwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBmSW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkgPiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZklucHV0U3RyZWFtLnJlc2V0KCk7Ci0JfQotCi0JcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBmSW5wdXRTdHJlYW0uc2tpcChuKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ29udGVudERlc2NyaWJlckZvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNTZlNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZW50RGVzY3JpYmVyRm9yWE1MIGltcGxlbWVudHMgSVRleHRDb250ZW50RGVzY3JpYmVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lW10gU1VQUE9SVEVEX09QVElPTlMgPSB7SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVH07Ci0JLyoqCi0JICogPGNvZGU+cmVzdHJpY3RlZE1vZGU8L2NvZGU+IGlzIHVzZWQganVzdCBmb3IgdGVzdGluZy9leHBlcmltZW50cy4KLQkgKiAKLQkgKiBJZiBpbiByZXN0cmljdGVkTW9kZSwgb3VyICJjdXN0b20iIGNvbnRlbnRUeXBlIGlzIHNlZW4gYXMgdmFsaWQgb25seSBpbgotCSAqIGNhc2VzIHRoYXQgdGhlIHBsYXRmb3JtJ3Mgc3RhbmRhcmQgb25lIGRvZXMgbm90IGNvdmVyLgotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gcmVzdHJpY3RlZE1vZGUgPSB0cnVlOwotCXByaXZhdGUgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGdldERldGVjdG9yKCkgewotCQkJcmV0dXJuIG5ldyBYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpYmVyI2Rlc2NyaWJlKGphdmEuaW8uSW5wdXRTdHJlYW0sCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uKQotCSAqLwotCXB1YmxpYyBpbnQgZGVzY3JpYmUoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGZvciB0aGlzIHNwZWNpYWwgY2FzZSwgYWx3YXlzIGFzc3VtZSBpbnZhbGlkLCB1bmxlc3MKLQkJLy8gb3VyIHNwZWNpYWwgY2lyY3Vtc3RhbmNlcyBhcmUgbWV0LgotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5WQUxJRDsKLQotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJLy8gcHVyZWx5IHJlcXVlc3QgZm9yIHZhbGlkdHkKLQkJCXJlc3VsdCA9IGRldGVybWluZVZhbGlkaXR5KHJlc3VsdCwgY29udGVudHMpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhyZXN1bHQsIGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklUZXh0Q29udGVudERlc2NyaWJlciNkZXNjcmliZShqYXZhLmlvLlJlYWRlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGludCBkZXNjcmliZShSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGZvciB0aGlzIHNwZWNpYWwgY2FzZSwgYWx3YXlzIGFzc3VtZSBpbnZhbGlkLCB1bmxlc3MKLQkJLy8gb3VyIHNwZWNpYWwgY2lyY3Vtc3RhbmNlcyBhcmUgbWV0LgotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5WQUxJRDsKLQotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJLy8gcHVyZWx5IHJlcXVlc3QgZm9yIHZhbGlkdHkKLQkJCXJlc3VsdCA9IGRldGVybWluZVZhbGlkaXR5KHJlc3VsdCwgY29udGVudHMpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhyZXN1bHQsIGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpYmVyI2dldFN1cHBvcnRlZE9wdGlvbnMoKQotCSAqLwotCXB1YmxpYyBRdWFsaWZpZWROYW1lW10gZ2V0U3VwcG9ydGVkT3B0aW9ucygpIHsKLQotCQlyZXR1cm4gU1VQUE9SVEVEX09QVElPTlM7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhpbnQgcmVzdWx0LCBJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJldHVyblJlc3VsdCA9IHJlc3VsdDsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJY29udGVudHMucmVzZXQoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQlyZXR1cm5SZXN1bHQgPSBoYW5kbGVDYWxjdWxhdGlvbnMocmVzdWx0LCBkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQl9Ci0JCXJldHVybiByZXR1cm5SZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZGV0ZXJtaW5lVmFsaWRpdHkoaW50IHJlc3VsdCwgSW5wdXRTdHJlYW0gY29udGVudHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXR1cm5SZXN1bHQgPSByZXN1bHQ7Ci0JCUlSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciA9IGdldERldGVjdG9yKCk7Ci0JCWNvbnRlbnRzLnJlc2V0KCk7Ci0JCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCXJldHVyblJlc3VsdCA9IGRldGVybWluZVZhbGlkaXR5KGRldGVjdG9yLCByZXR1cm5SZXN1bHQpOwotCQlyZXR1cm4gcmV0dXJuUmVzdWx0OwotCX0KLQlwcml2YXRlIGludCBkZXRlcm1pbmVWYWxpZGl0eShpbnQgcmVzdWx0LCBSZWFkZXIgY29udGVudHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXR1cm5SZXN1bHQgPSByZXN1bHQ7Ci0JCUlSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciA9IGdldERldGVjdG9yKCk7Ci0JCWNvbnRlbnRzLnJlc2V0KCk7Ci0JCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCXJldHVyblJlc3VsdCA9IGRldGVybWluZVZhbGlkaXR5KGRldGVjdG9yLCByZXR1cm5SZXN1bHQpOwotCQlyZXR1cm4gcmV0dXJuUmVzdWx0OwotCX0KLQkvKioKLQkgKiBAcGFyYW0gY29udGVudHMKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBpbnQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhpbnQgcmVzdWx0LCBSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXR1cm5SZXN1bHQgPSByZXN1bHQ7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQlyZXR1cm5SZXN1bHQgPSBoYW5kbGVDYWxjdWxhdGlvbnMocmVzdWx0LCBkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQl9Ci0JCXJldHVybiByZXR1cm5SZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgT2JqZWN0IGRldGVjdGVkQ2hhcnNldCwgT2JqZWN0IGphdmFDaGFyc2V0KSB7Ci0JCS8vIHNpbmNlIGVxdWFsLCB3ZSBkb24ndCBuZWVkIHRvIGFkZCwgYnV0IGlmIG91ciBkZXRlY3RlZCB2ZXJzaW9uIGlzCi0JCS8vIGRpZmZlcmVudCB0aGFuCi0JCS8vIGphdmFDaGFyc2V0LCB0aGVuIHdlIHNob3VsZCBhZGQgaXQuIFRoaXMgd2lsbCBoYXBwZW4sIGZvciBleGFtcGxlLAotCQkvLyBpZiB0aGVyZSdzCi0JCS8vIGRpZmZlcmVuY2VzIGluIGNhc2UsIG9yIGRpZmZlcmVuY2VzIGR1ZSB0byBvdmVycmlkZSBwcm9wZXJ0aWVzCi0JCWlmIChkZXRlY3RlZENoYXJzZXQgIT0gbnVsbCkgewotCQkJLy8gaWYgKCFkZXRlY3RlZENoYXJzZXQuZXF1YWxzKGphdmFDaGFyc2V0KSkgewotCQkJLy8gZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsCi0JCQkvLyBkZXRlY3RlZENoYXJzZXQpOwotCQkJLy8gfQotCi0JCQkvLyBPbmNlIHdlIGRldGVjdGVkIGEgY2hhcnNldCwgd2Ugc2hvdWxkIHNldCB0aGUgcHJvcGVydHkgZXZlbgotCQkJLy8gdGhvdWdoIGl0J3MgdGhlIHNhbWUgYXMgamF2YUNoYXJzZXQKLQkJCS8vIGJlY2F1c2UgdGhlcmUgYXJlIGNsaWVudHMgdGhhdCByZWx5IG9uIHRoaXMgcHJvcGVydHkgdG8KLQkJCS8vIGRldGVybWluZSBpZiB0aGUgY2hhcnNldCBpcyBhY3R1YWxseSBkZXRlY3RlZCBpbiBmaWxlIG9yIG5vdC4KLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBkZXRlY3RlZENoYXJzZXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1JlbGV2ZW50KElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGRldGVjdG9yCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgaW50IGhhbmRsZUNhbGN1bGF0aW9ucyhpbnQgcmVzdWx0LCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXR1cm5SZXN1bHQgPSByZXN1bHQ7Ci0JCUVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8gPSAoKFhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgZGV0ZWN0b3IpLmdldEVuY29kaW5nTWVtZW50bygpOwotCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJLy8gVE9ETzogSSBuZWVkIHRvIHZlcmlmeSB0byBzZWUgaWYgdGhpcyBCT00gd29yayBpcyBhbHdheXMgZG9uZQotCQkJLy8gYnkgdGV4dCB0eXBlLgotCQkJT2JqZWN0IGRldGVjdGVkQnl0ZU9yZGVyTWFyayA9IGVuY29kaW5nTWVtZW50by5nZXRVbmljb2RlQk9NKCk7Ci0JCQlpZiAoZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrICE9IG51bGwpIHsKLQkJCQlPYmplY3QgZXhpc3RpbmdCeXRlT3JkZXJNYXJrID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspOwotCQkJCS8vIG5vdCBzdXJlIHdoeSB3b3VsZCBldmVyIGJlIGRpZmZlcmVudCwgc28gaWYgaXMgZGlmZmVyZW50LAotCQkJCS8vIG1heQotCQkJCS8vIG5lZWQgdG8gInB1c2giIHVwIGludG8gYmFzZS4KLQkJCQlpZiAoIWRldGVjdGVkQnl0ZU9yZGVyTWFyay5lcXVhbHMoZXhpc3RpbmdCeXRlT3JkZXJNYXJrKSkKLQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIGRldGVjdGVkQnl0ZU9yZGVyTWFyayk7Ci0JCQl9Ci0KLQotCQkJaWYgKCFlbmNvZGluZ01lbWVudG8uaXNWYWxpZCgpKSB7Ci0JCQkJLy8gbm90ZTogYWZ0ZXIgc2V0dGluZyBoZXJlLCBpdHMgdGhlIG1lcmUgcHJlc2VuY2Ugb2YKLQkJCQkvLyBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVAotCQkJCS8vIGluIHRoZSByZXNvdXJjZSdzIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lCi0JCQkJLy8gaWYgaW52YWxpZCBpbiB0aG9zZSBjYXNlcywgdGhlICJkZXRlY3RlZCIgcHJvcGVydHkgY29udGFpbnMKLQkJCQkvLyBhbiAiYXBwcm9wcmlhdGUgZGVmYXVsdCIgdG8gdXNlLgotCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBlbmNvZGluZ01lbWVudG8uZ2V0SW52YWxpZEVuY29kaW5nKCkpOwotCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxULCBlbmNvZGluZ01lbWVudG8uZ2V0QXBwcm9wcmlhdGVEZWZhdWx0KCkpOwotCQkJfQotCi0JCQlPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0ID0gZW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQkJCU9iamVjdCBqYXZhQ2hhcnNldCA9IGVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQotCQkJLy8gd2UgYWx3YXlzIGluY2x1ZGUgZGV0ZWN0ZWQsIGlmIGl0cyBkaWZmZXJlbnQgdGhhbiBqYXZhCi0JCQloYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKGRlc2NyaXB0aW9uLCBkZXRlY3RlZENoYXJzZXQsIGphdmFDaGFyc2V0KTsKLQotCQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCQlPYmplY3QgZXhpc3RpbmdDaGFyc2V0ID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKTsKLQkJCQlpZiAoamF2YUNoYXJzZXQuZXF1YWxzKGV4aXN0aW5nQ2hhcnNldCkpIHsKLQkJCQkJaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShkZXNjcmlwdGlvbiwgZGV0ZWN0ZWRDaGFyc2V0LCBqYXZhQ2hhcnNldCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyB3ZSBtYXkgbmVlZCB0byBhZGQgd2hhdCB3ZSBmb3VuZCwgYnV0IG9ubHkgbmVlZCB0byBhZGQKLQkJCQkJLy8gaWYgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQKLQkJCQkJT2JqZWN0IGRlZmF1bHRDaGFyc2V0ID0gZGV0ZWN0b3IuZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQkJCQlpZiAoZGVmYXVsdENoYXJzZXQgIT0gbnVsbCkgewotCQkJCQkJaWYgKCFkZWZhdWx0Q2hhcnNldC5lcXVhbHMoamF2YUNoYXJzZXQpKSB7Ci0JCQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBhc3N1bWluZyBpZiB0aGVyZSBpcyBubyBzcGVjIGRlZmF1bHQsIHdlIGFsd2F5cwotCQkJCQkJLy8gbmVlZCB0byBhZGQuCi0JCQkJCQkvLyBUT0RPOiB0aGlzIGlzIHByb2JhYmx5IGEgZGVhZCBicmFuY2ggaW4gY3VycmVudAotCQkJCQkJLy8gY29kZSwgc2hvdWxkIHJlLWV4YW1pbmUgZm9yIHJlbW92YWwuCi0JCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIGphdmFDaGFyc2V0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVyblJlc3VsdCA9IGRldGVybWluZVZhbGlkaXR5KGRldGVjdG9yLCByZXR1cm5SZXN1bHQpOwotCQlyZXR1cm4gcmV0dXJuUmVzdWx0OwotCX0KLQotCXByaXZhdGUgaW50IGRldGVybWluZVZhbGlkaXR5KElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciwgaW50IHJldHVyblJlc3VsdCkgewotCQkvLyB3ZSBhbHdheXMgZXhwZWN0IFhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciwgYnV0IGp1c3QgdG8gbWFrZSBzYWZlCi0JCS8vIGNhc3QuCi0JCWlmIChkZXRlY3RvciBpbnN0YW5jZW9mIFhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgewotCQkJWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIHhtbFJlc291cmNlRGV0ZWN0b3IgPSAoWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcjsKLQkJCWlmICh4bWxSZXNvdXJjZURldGVjdG9yLmlzRGVjbERldGVjdGVkKCkpIHsKLQkJCQlpZiAocmVzdHJpY3RlZE1vZGUpIHsKLQkJCQkJLy8gaWYgdGhlcmUgaXMgbm8gaW5pdGlhbCB3aGl0ZXNwYWNlLCB0aGVuIHBsYXRmb3JtJ3MKLQkJCQkJLy8gZGVmYXVsdCBvbmUgd2lsbCBkby4KLQkJCQkJaWYgKHhtbFJlc291cmNlRGV0ZWN0b3IuaGFzSW5pdGlhbFdoaXRlU3BhY2UoKSkgewotCQkJCQkJcmV0dXJuUmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuVkFMSUQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVyblJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLlZBTElEOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0dXJuUmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9FbmNvZGluZ1BhcnNlckNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9FbmNvZGluZ1BhcnNlckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDU0MmE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cyB7Ci0KLQlmaW5hbCBTdHJpbmcgRU9GID0gIkVPRiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZSA9ICJJbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBJbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlID0gIkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIE1BWF9DSEFSU19SRUFDSEVEID0gIk1BWF9DSEFSU19SRUFDSEVEIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBTdHJpbmdWYWx1ZSA9ICJzdHJ2YWwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIFVuRGVsaW1pdGVkU3RyaW5nVmFsdWUgPSAiVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgU3RyaW5nIFVURjE2QkUgPSAiVVRGMTZCRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgU3RyaW5nIFVURjE2TEUgPSAiVVRGMTZMRSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIGZpbmFsIFN0cmluZyBVVEY4M0J5dGVCT00gPSAiVVRGODNCeXRlQk9NIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IZWFkUGFyc2VyVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxNGI4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBIZWFkUGFyc2VyVG9rZW4gewotCXByaXZhdGUgaW50IGZTdGFydDsKLQotCXByaXZhdGUgU3RyaW5nIGZUZXh0OwotCXByaXZhdGUgU3RyaW5nIGZUeXBlOwotCi0JcHJvdGVjdGVkIEhlYWRQYXJzZXJUb2tlbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSGVhZFBhcnNlclRva2VuKFN0cmluZyB0eXBlLCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMoKTsKLQkJZlR5cGUgPSB0eXBlOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHQgPSB0ZXh0OwotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZlRleHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICgidGV4dDogIiArIGZUZXh0ICsgIiBvZmZzZXQ6ICIgKyBmU3RhcnQgKyAiIHR5cGU6ICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JbnRTdGFjay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JbnRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDEwNTJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi0vKgotICogCi0gKiBBIG5vbi1yZXNpemFibGUgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSBiZWhhdmlvciBvZiBqYXZhLnV0aWwuU3RhY2ssIGJ1dAotICogZGlyZWN0bHkgZm9yIHRoZSA8Y29kZT4gaW50ZWdlciA8L2NvZGU+IHByaW1pdGl2ZS4KLSAqLwotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSW50U3RhY2sgewotCXByaXZhdGUgaW50W10gbGlzdCA9IG51bGw7Ci0KLQlwcml2YXRlIGludCBzaXplID0gMDsKLQotCXB1YmxpYyBJbnRTdGFjaygpIHsKLQkJdGhpcygxMDApOwotCX0KLQotCXB1YmxpYyBJbnRTdGFjayhpbnQgbWF4ZGVwdGgpIHsKLQkJc3VwZXIoKTsKLQkJbGlzdCA9IG5ldyBpbnRbbWF4ZGVwdGhdOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbXB0eSgpIHsKLQkJcmV0dXJuIHNpemUgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldChpbnQgc2xvdCkgewotCQlyZXR1cm4gbGlzdFtzbG90XTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKQotCQkJbGlzdFtpXSA9IC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGludCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjayB3aXRob3V0IHJlbW92aW5nIGl0Ci0JICogCi0JICogQHJldHVybiBpbnQgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkuCi0JICovCi0JcHVibGljIGludCBwZWVrKCkgewotCQlpZiAoc2l6ZSA9PSAwKQotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJcmV0dXJuIGxpc3Rbc2l6ZSAtIDFdOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIGludCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjawotCSAqIAotCSAqIEByZXR1cm4gaW50IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5LgotCSAqLwotCXB1YmxpYyBpbnQgcG9wKCkgewotCQlpbnQgdmFsdWUgPSBwZWVrKCk7Ci0JCWxpc3Rbc2l6ZSAtIDFdID0gLTE7Ci0JCXNpemUtLTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFB1c2hlcyBhbiBpdGVtIG9udG8gdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZSAtCi0JICogICAgICAgICAgICB0aGUgaW50IHRvIGJlIHB1c2hlZCBvbnRvIHRoaXMgc3RhY2suCi0JICogQHJldHVybiB0aGUgPGNvZGU+bmV3VmFsdWU8L2NvZGU+IGFyZ3VtZW50LgotCSAqLwotCXB1YmxpYyBpbnQgcHVzaChpbnQgbmV3VmFsdWUpIHsKLQkJaWYgKHNpemUgPT0gbGlzdC5sZW5ndGgpIHsKLQkJCXRocm93IG5ldyBTdGFja092ZXJmbG93RXJyb3IoKTsKLQkJfQotCQlsaXN0W3NpemUrK10gPSBuZXdWYWx1ZTsKLQkJcmV0dXJuIG5ld1ZhbHVlOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGxpc3QubGVuZ3RoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvTnVsbE1lbWVudG8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvTnVsbE1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNmNzQ2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL051bGxNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlczsKLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiBhbiBFbmNvZGluZ01lbWVudG8gKGl0cyBzdXBlciBjbGFzcyksCi0gKiB3aGVuIHRoZXJlIGlzIG5vdCBpbiBmYWN0IEFOWSBlbmNvZGluZyBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsIHdoZW4gYQotICogc3RydWN0dXJlZERvY3VtZW50IGlzIGNyZWF0ZWQgZGlyZWN0bHkgZnJvbSBhIFN0cmluZwotICovCi1wdWJsaWMgY2xhc3MgTnVsbE1lbWVudG8gZXh0ZW5kcyBFbmNvZGluZ01lbWVudG8gewotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgTnVsbE1lbWVudG8oKSB7Ci0JCXN1cGVyKCk7Ci0JCVN0cmluZyBkZWZhdWx0Q2hhcnNldCA9IE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhudWxsKTsKLQkJc2V0SmF2YUNoYXJzZXROYW1lKGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShudWxsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MRGVjbERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTERlY2xEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGQwZmRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MRGVjbERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgWE1MRGVjbERldGVjdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0JVRl9TSVpFID0gMTAyNCAqIDg7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9NQVJLX1NJWkUgPSAxMDI0ICogODsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSGVhZGVyUGFyc2VkOwotCXByaXZhdGUgYm9vbGVhbiBmSXNYTUw7Ci0JcHJvdGVjdGVkIFJlYWRlciBmUmVhZGVyOwotCS8vcHJpdmF0ZSBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHJpdmF0ZSBYTUxIZWFkVG9rZW5pemVyIGZUb2tlbml6ZXI7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtKFN0cmluZyB0b2tlblR5cGUpIHsKLQkJYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSBmYWxzZTsKLQkJaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT00pIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQkvL2ZVbmljb2RlID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSB0cnVlOwotCQkJLy9mVW5pY29kZSA9ICJVVEYtMTZCRSI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCS8vZlVuaWNvZGUgPSAiVVRGLTE2IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW07Ci0JfQotCi0JZmluYWwgcHJpdmF0ZSB2b2lkIGVuc3VyZUlucHV0U2V0KCkgewotCQlpZiAoZlJlYWRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnB1dCBtdXN0IGJlIHNldCBiZWZvcmUgdXNlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8vcHJpdmF0ZSBTdHJpbmcgZlVuaWNvZGU7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRva2VuaXplci4KLQkgKi8KLQlwcml2YXRlIFhNTEhlYWRUb2tlbml6ZXIgZ2V0VG9rZW5pemVyKCkgewotCQlpZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCQlmVG9rZW5pemVyID0gbmV3IFhNTEhlYWRUb2tlbml6ZXIoKTsKLQkJfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzWE1MLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzWE1MKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCX0KLQkJcmV0dXJuIGZJc1hNTDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVhNTEhlYWRUb2tlbml6ZXIgdG9rZW5pemVyID0gZ2V0VG9rZW5pemVyKCk7Ci0JCXRva2VuaXplci5yZXNldChmUmVhZGVyKTsKLQkJSGVhZFBhcnNlclRva2VuIHRva2VuID0gbnVsbDsKLQkJU3RyaW5nIHRva2VuVHlwZSA9IG51bGw7Ci0JCWRvIHsKLQkJCXRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJdG9rZW5UeXBlID0gdG9rZW4uZ2V0VHlwZSgpOwotCQkJaWYgKGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSh0b2tlblR5cGUpKSB7Ci0JCQkJZlJlYWRlci5yZXNldCgpOwotCQkJCS8vIHRoaXMgaXMgKG9idmlvdXNseSkgbm90IGFsd2F5cyB0cnVlLgotCQkJCS8vIFRPRE86IG5lZWQgdG8gZml4IHNvIHdlICJyZW1lbWJlciIgb3JpZ2luYWwgaUZpbGUgb3IKLQkJCQkvLyBpbnB1dHN0cmVhbSwgYW5kCi0JCQkJLy8gY3JlYXRlIGFwcHJvcHJpYXRlIElucHV0U3RyZWFtUmVhZGVyLgotCQkJCS8vIEknbSBub3Qgc3VyZSB3aGF0IHRvIGRvIGZvciB0aGUgc2V0KHJlYWRlcikgY2FzZSAuLi4gaWYgaXRzCi0JCQkJLy8gZXZlbiByZWxldmVudC4KLQkJCQkvLyBwbHVzLCBlbnN1cmUgYWdhaW5zdCBpbmZpbml0ZSBsb29wcyEKLQkJCQlmSXNYTUwgPSB0cnVlOwotCQkJCS8vZlJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmUmVhZGVyLCBmVW5pY29kZSk7Ci0JCQkJLy8gcGFyc2VJbnB1dCgpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAodG9rZW5UeXBlID09IFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2RpbmcpIHsKLQkJCQkJZklzWE1MID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QWxsKCkgewotCQlmUmVhZGVyID0gbnVsbDsKLQkJZkhlYWRlclBhcnNlZCA9IGZhbHNlOwotCQlmSXNYTUwgPSBmYWxzZTsKLQkJLy9mVW5pY29kZSA9IG51bGw7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSUZpbGUgaUZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmVzZXRBbGwoKTsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBpRmlsZS5nZXRDb250ZW50cyh0cnVlKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBNQVhfQlVGX1NJWkUpOwotCQlyZXNldHRhYmxlU3RyZWFtLm1hcmsoTUFYX01BUktfU0laRSk7Ci0JCXNldChyZXNldHRhYmxlU3RyZWFtKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJcmVzZXRBbGwoKTsKLQkJZlJlYWRlciA9IG5ldyBCeXRlUmVhZGVyKGlucHV0U3RyZWFtKTsKLQkJdHJ5IHsKLQkJCWZSZWFkZXIubWFyayhNQVhfTUFSS19TSVpFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2Uga25vdyBCeXRlUmVhZGVyIHN1cHBvcnRzIG1hcmtpbmcKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWZSZWFkZXIubWFyayhNQVhfTUFSS19TSVpFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTEhlYWRUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MSGVhZFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWFiNjhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MSGVhZFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzMyArMCwwIEBACi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjQgb24gNy81LzA1IDE6MTkgQU0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsKLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5qZmxleC5kZS8iPkpGbGV4PC9hPiAxLjQKLSAqIG9uIDcvNS8wNSAxOjE5IEFNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PkQ6L2J1aWxkcy9Xb3Jrc3BhY2VzL1B1cmVIZWFkV1RQX003L29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyLmpGbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIFhNTEhlYWRUb2tlbml6ZXIgewotCi0gIC8qKiBUaGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBpbml0aWFsIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX0JVRkZFUlNJWkUgPSA4MTkyOwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZWUlOSVRJQUwgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVbkRlbGltaXRlZFN0cmluZyA9IDEwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEUV9TVFJJTkcgPSA2OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTUV9TVFJJTkcgPSA4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9YTUxEZWNsID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUXVvdGVkQXR0cmlidXRlVmFsdWUgPSA0OwotCi0gIC8qKgotICAgKiBaWl9MRVhTVEFURVtsXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiBaWl9MRVhTVEFURVtsKzFdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqICAgICAgICAgICAgICAgICAgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICogbCBpcyBvZiB0aGUgZm9ybSBsID0gMiprLCBrIGEgbm9uIG5lZ2F0aXZlIGludGVnZXIKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9MRVhTVEFURVtdID0geyAKLSAgICAgMCwgIDEsICAyLCAgMiwgIDMsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsIDYKLSAgfTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0NNQVBfUEFDS0VEID0gCi0gICAgIlwxMVwwXDFcNlwxXDExXDJcMFwxXDEwXDIyXDBcMVw2XDFcMFwxXDMyXDJcMCIrCi0gICAgIlwxXDM0XDFcMFwxXDMzXDI0XDBcMVwxMlwxXDdcMVwzMVwxXDEzXDNcMFwxXDI2IisKLSAgICAiXDFcMjdcMVwyMFwxXDBcMVwzMFwxXDBcMVwyM1wyXDBcMVwxNlwxXDE1XDFcMjUiKwotICAgICJcMVwyNFwyXDBcMVwyMVwxXDIyXDJcMFwxXDE3XDFcMFwxXDE0XDEyXDBcMVwyNiIrCi0gICAgIlwxXDI3XDFcMjBcMVwwXDFcMzBcMVwwXDFcMjNcMlwwXDFcMTZcMVwxNVwxXDI1IisKLSAgICAiXDFcMjRcMlwwXDFcMjFcMVwyMlwyXDBcMVwxN1wxXDBcMVwxNFwxMDJcMFwxXDQiKwotICAgICJcM1wwXDFcNVwxN1wwXDFcM1wxNlwwXDFcMVwyMFwwXDFcM1wxNlwwXDFcMSIrCi0gICAgIlwxXDJcMTcwXDBcMVwyXHVmZTg3XDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFtdIFpaX0NNQVAgPSB6elVucGFja0NNYXAoWlpfQ01BUF9QQUNLRUQpOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBERkEgc3RhdGVzIHRvIGFjdGlvbiBzd2l0Y2ggbGFiZWxzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX0FDVElPTiA9IHp6VW5wYWNrQWN0aW9uKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0FDVElPTl9QQUNLRURfMCA9Ci0gICAgIlw3XDBcMTFcMVwyXDJcMVwxXDFcM1wxXDRcMVw1XDFcNiIrCi0gICAgIlwxXDVcMVw3XDFcNVwxXDdcMVw1XDFcMTBcMlwxMVwxXDEyIisKLSAgICAiXDFcMTNcNFwwXDFcMTRcM1wwXDFcMTVcMVwwXDFcMTZcMVwxNyIrCi0gICAgIlwxMVwwXDFcMjBcNFwwXDFcMjFcMVwwXDFcMjIiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja0FjdGlvbigpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFs2Ml07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tBY3Rpb24oWlpfQUNUSU9OX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja0FjdGlvbihTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgICAgICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIHJlc3VsdFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9OT19NQVRDSCA9IDE7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9QVVNIQkFDS18yQklHID0gMjsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB6elJlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB6elN0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHp6QnVmZmVyW10gPSBuZXcgY2hhcltaWl9CVUZGRVJTSVpFXTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgenpNYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHp6UHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6ekN1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6elN0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHp6RW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0vLyAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLS8vICBwcml2YXRlIGludCB5eWNvbHVtbjsKLQotICAvKiogCi0gICAqIHp6QXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4genpBdEJPTCA9IHRydWU7Ci0KLSAgLyoqIHp6QXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgYXQgdGhlIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4genpBdEVPRjsKLQotICAvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIHByaXZhdGUgYm9vbGVhbiB6ekVPRkRvbmU7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotCi0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTW9yZSA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsKLQlTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsKLQotCi0JcHVibGljIFhNTEhlYWRUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JICBwdWJsaWMgdm9pZCByZXNldCAoUmVhZGVyIGluKSB7Ci0gICAgICAgICAgICAgICAgLyogdGhlIGlucHV0IGRldmljZSAqLwotICAgICAgICAgICAgICAgIHp6UmVhZGVyID0gaW47Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gICAgICAgICAgICAgICAgenpTdGF0ZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gICAgICAgICAgICAgICAgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICAgICAgICAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheXMuZmlsbCh6ekJ1ZmZlciwgKGNoYXIpMCk7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgIHp6TWFya2VkUG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gICAgICAgICAgICAgICAgenpQdXNoYmFja1BvcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICB6ekN1cnJlbnRQb3MgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgenpTdGFydFJlYWQgPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICAgICAgICAgICAgICogZnJvbSBpbnB1dAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHp6RW5kUmVhZCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLS8vICAgICAgICAgICAgICAgIHl5bGluZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgICAgICAgICAgICAgICB5eWNoYXIgPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgICAgICAgICAgICAgICAgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gICAgICAgICAgICAgICAgICovCi0vLyAgICAgICAgICAgICAgICB5eWNvbHVtbiA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZwotICAgICAgICAgICAgICAgICAqIG9mIGEgbGluZQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHp6QXRCT0wgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICAgICAgICAgICAgICAgIHp6QXRFT0YgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIC8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICAgICAgICAgICAgICAgIHp6RU9GRG9uZSA9IGZhbHNlOwotCi0KLSAgICAgICAgICAgICAgICBmU3RhdGVTdGFjay5jbGVhcigpOwotCi0gICAgICAgICAgICAgICAgaGFzTW9yZSA9IHRydWU7Ci0gIAkJCi0gIAl9Ci0KLQotCXB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRleHQgPSBudWxsOwotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQlIZWFkUGFyc2VyVG9rZW4gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHZhbHVlVGV4dCk7Ci0JCQl2YWx1ZVRleHQgPSBudWxsOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB5eXRleHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgewotCQlyZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHB1c2hDdXJyZW50U3RhdGUoKSB7Ci0JCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3BTdGF0ZSgpIHsKLQkJeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JfQotCQotCXByaXZhdGUgSGVhZFBhcnNlclRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBuZXcgSGVhZFBhcnNlclRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0KTsKLQl9CQotCi0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgWE1MSGVhZFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMuenpSZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTEhlYWRUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB6elVucGFja0NNYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTQ4KSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZWZpbGxzIHRoZSBpbnB1dCBidWZmZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICA8Y29kZT5mYWxzZTwvY29kZT4sIGlmZiB0aGVyZSB3YXMgbmV3IGlucHV0LgotICAgKiAKLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4genpSZWZpbGwoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh6elN0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIHp6U3RhcnRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlciwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgenpFbmRSZWFkLXp6U3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHp6RW5kUmVhZC09IHp6U3RhcnRSZWFkOwotICAgICAgenpDdXJyZW50UG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6ek1hcmtlZFBvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpQdXNoYmFja1Bvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpTdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoenpDdXJyZW50UG9zID49IHp6QnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbenpDdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh6ekJ1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB6ekJ1ZmZlci5sZW5ndGgpOwotICAgICAgenpCdWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB6elJlYWRlci5yZWFkKHp6QnVmZmVyLCB6ekVuZFJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHp6QnVmZmVyLmxlbmd0aC16ekVuZFJlYWQpOwotCi0gICAgaWYgKG51bVJlYWQgPCAwKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICB6ekVuZFJlYWQrPSBudW1SZWFkOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gICAgCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgenpBdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0KLSAgICBpZiAoenpSZWFkZXIgIT0gbnVsbCkKLSAgICAgIHp6UmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXNldHMgdGhlIHNjYW5uZXIgdG8gcmVhZCBmcm9tIGEgbmV3IGlucHV0IHN0cmVhbS4KLSAgICogRG9lcyBub3QgY2xvc2UgdGhlIG9sZCByZWFkZXIuCi0gICAqCi0gICAqIEFsbCBpbnRlcm5hbCB2YXJpYWJsZXMgYXJlIHJlc2V0LCB0aGUgb2xkIGlucHV0IHN0cmVhbSAKLSAgICogPGI+Y2Fubm90PC9iPiBiZSByZXVzZWQgKGludGVybmFsIGJ1ZmZlciBpcyBkaXNjYXJkZWQgYW5kIGxvc3QpLgotICAgKiBMZXhpY2FsIHN0YXRlIGlzIHNldCB0byA8dHQ+WlpfSU5JVElBTDwvdHQ+LgotICAgKgotICAgKiBAcGFyYW0gcmVhZGVyICAgdGhlIG5ldyBpbnB1dCBzdHJlYW0gCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB5eXJlc2V0KGphdmEuaW8uUmVhZGVyIHJlYWRlcikgewotICAgIHp6UmVhZGVyID0gcmVhZGVyOwotICAgIHp6QXRCT0wgID0gdHJ1ZTsKLSAgICB6ekF0RU9GICA9IGZhbHNlOwotICAgIHp6RW5kUmVhZCA9IHp6U3RhcnRSZWFkID0gMDsKLSAgICB6ekN1cnJlbnRQb3MgPSB6ek1hcmtlZFBvcyA9IHp6UHVzaGJhY2tQb3MgPSAwOwotICAgIHl5Y2hhciA9IDA7Ci0gICAgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBwdWJsaWMgZmluYWwgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHp6TGV4aWNhbFN0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB6ekxleGljYWxTdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB6ekJ1ZmZlciwgenpTdGFydFJlYWQsIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkICk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gPHR0PnBvczwvdHQ+IGZyb20gdGhlIAotICAgKiBtYXRjaGVkIHRleHQuIAotICAgKiAKLSAgICogSXQgaXMgZXF1aXZhbGVudCB0byB5eXRleHQoKS5jaGFyQXQocG9zKSwgYnV0IGZhc3RlcgotICAgKgotICAgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIHRvIGZldGNoLiAKLSAgICogICAgICAgICAgICBBIHZhbHVlIGZyb20gMCB0byB5eWxlbmd0aCgpLTEuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiBwb3MKLSAgICovCi0gIHB1YmxpYyBmaW5hbCBjaGFyIHl5Y2hhcmF0KGludCBwb3MpIHsKLSAgICByZXR1cm4genpCdWZmZXJbenpTdGFydFJlYWQrcG9zXTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEluIGEgd2VsbGZvcm1lZCBzY2FubmVyIChubyBvciBvbmx5IGNvcnJlY3QgdXNhZ2Ugb2YgCi0gICAqIHl5cHVzaGJhY2soaW50KSBhbmQgYSBtYXRjaC1hbGwgZmFsbGJhY2sgcnVsZSkgdGhpcyBtZXRob2QgCi0gICAqIHdpbGwgb25seSBiZSBjYWxsZWQgd2l0aCB0aGluZ3MgdGhhdCAiQ2FuJ3QgUG9zc2libHkgSGFwcGVuIi4KLSAgICogSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBzb21ldGhpbmcgaXMgc2VyaW91c2x5IHdyb25nCi0gICAqIChlLmcuIGEgSkZsZXggYnVnIHByb2R1Y2luZyBhIGZhdWx0eSBzY2FubmVyIGV0Yy4pLgotICAgKgotICAgKiBVc3VhbCBzeW50YXgvc2Nhbm5lciBsZXZlbCBlcnJvciBoYW5kbGluZyBzaG91bGQgYmUgZG9uZQotICAgKiBpbiBlcnJvciBmYWxsYmFjayBydWxlcy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB6elNjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgdHJ5IHsKLSAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbZXJyb3JDb2RlXTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBtZXNzYWdlID0gWlpfRVJST1JfTVNHW1paX1VOS05PV05fRVJST1JdOwotICAgIH0KLQotICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICBwdWJsaWMgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpICB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHp6U2NhbkVycm9yKFpaX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgenpNYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotICAvKioKLSAgICogQ29udGFpbnMgdXNlciBFT0YtY29kZSwgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsCi0gICAqIHdoZW4gdGhlIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLSAgICovCi0gIHByaXZhdGUgdm9pZCB6ekRvRU9GKCkgewotICAgIGlmICghenpFT0ZEb25lKSB7Ci0gICAgICB6ekVPRkRvbmUgPSB0cnVlOwotICAgIAloYXNNb3JlPWZhbHNlOwotCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHp6SW5wdXQ7Ci0gICAgaW50IHp6QWN0aW9uOwotCi0gICAgLy8gY2FjaGVkIGZpZWxkczoKLSAgICBpbnQgenpDdXJyZW50UG9zTDsKLSAgICBpbnQgenpNYXJrZWRQb3NMOwotICAgIGludCB6ekVuZFJlYWRMID0genpFbmRSZWFkOwotICAgIGNoYXIgW10genpCdWZmZXJMID0genpCdWZmZXI7Ci0gICAgY2hhciBbXSB6ekNNYXBMID0gWlpfQ01BUDsKLQotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHp6TWFya2VkUG9zTCA9IHp6TWFya2VkUG9zOwotCi0gICAgICB5eWNoYXIrPSB6ek1hcmtlZFBvc0wtenpTdGFydFJlYWQ7Ci0KLSAgICAgIGlmICh6ek1hcmtlZFBvc0wgPiB6elN0YXJ0UmVhZCkgewotICAgICAgICBzd2l0Y2ggKHp6QnVmZmVyTFt6ek1hcmtlZFBvc0wtMV0pIHsKLSAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICBjYXNlICdcdTAwMEInOgotICAgICAgICBjYXNlICdcdTAwMEMnOgotICAgICAgICBjYXNlICdcdTAwODUnOgotICAgICAgICBjYXNlICdcdTIwMjgnOgotICAgICAgICBjYXNlICdcdTIwMjknOgotICAgICAgICAgIHp6QXRCT0wgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdccic6IAotICAgICAgICAgIGlmICh6ek1hcmtlZFBvc0wgPCB6ekVuZFJlYWRMKQotICAgICAgICAgICAgenpBdEJPTCA9IHp6QnVmZmVyTFt6ek1hcmtlZFBvc0xdICE9ICdcbic7Ci0gICAgICAgICAgZWxzZSBpZiAoenpBdEVPRikKLSAgICAgICAgICAgIHp6QXRCT0wgPSBmYWxzZTsKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGJvb2xlYW4gZW9mID0genpSZWZpbGwoKTsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zTCA9IHp6TWFya2VkUG9zOwotICAgICAgICAgICAgenpCdWZmZXJMID0genpCdWZmZXI7Ci0gICAgICAgICAgICBpZiAoZW9mKSAKLSAgICAgICAgICAgICAgenpBdEJPTCA9IGZhbHNlOwotICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgenpBdEJPTCA9IHp6QnVmZmVyTFt6ek1hcmtlZFBvc0xdICE9ICdcbic7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHp6QXRCT0wgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgenpBY3Rpb24gPSAtMTsKLQotICAgICAgenpDdXJyZW50UG9zTCA9IHp6Q3VycmVudFBvcyA9IHp6U3RhcnRSZWFkID0genpNYXJrZWRQb3NMOwotICAKLSAgICAgIGlmICh6ekF0Qk9MKQotICAgICAgICB6elN0YXRlID0gWlpfTEVYU1RBVEVbenpMZXhpY2FsU3RhdGUrMV07Ci0gICAgICBlbHNlCi0gICAgICAgIHp6U3RhdGUgPSBaWl9MRVhTVEFURVt6ekxleGljYWxTdGF0ZV07Ci0KLQotICAgICAgenpGb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAKLSAgICAgICAgICBpZiAoenpDdXJyZW50UG9zTCA8IHp6RW5kUmVhZEwpCi0gICAgICAgICAgICB6eklucHV0ID0genpCdWZmZXJMW3p6Q3VycmVudFBvc0wrK107Ci0gICAgICAgICAgZWxzZSBpZiAoenpBdEVPRikgewotICAgICAgICAgICAgenpJbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb25zCi0gICAgICAgICAgICB6ekN1cnJlbnRQb3MgID0genpDdXJyZW50UG9zTDsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zICAgPSB6ek1hcmtlZFBvc0w7Ci0gICAgICAgICAgICBib29sZWFuIGVvZiA9IHp6UmVmaWxsKCk7Ci0gICAgICAgICAgICAvLyBnZXQgdHJhbnNsYXRlZCBwb3NpdGlvbnMgYW5kIHBvc3NpYmx5IG5ldyBidWZmZXIKLSAgICAgICAgICAgIHp6Q3VycmVudFBvc0wgID0genpDdXJyZW50UG9zOwotICAgICAgICAgICAgenpNYXJrZWRQb3NMICAgPSB6ek1hcmtlZFBvczsKLSAgICAgICAgICAgIHp6QnVmZmVyTCAgICAgID0genpCdWZmZXI7Ci0gICAgICAgICAgICB6ekVuZFJlYWRMICAgICA9IHp6RW5kUmVhZDsKLSAgICAgICAgICAgIGlmIChlb2YpIHsKLSAgICAgICAgICAgICAgenpJbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICB6eklucHV0ID0genpCdWZmZXJMW3p6Q3VycmVudFBvc0wrK107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHp6SW5wdXQgPSB6ekNNYXBMW3p6SW5wdXRdOwotCi0gICAgICAgICAgYm9vbGVhbiB6eklzRmluYWwgPSBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIHp6Tm9Mb29rQWhlYWQgPSBmYWxzZTsKLQotICAgICAgICAgIHp6Rm9yTmV4dDogeyBzd2l0Y2ggKHp6U3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDExOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDIwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAxNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDI0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDIxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDI4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAzMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDMyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OiB6elN0YXRlID0gMzM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6elN0YXRlID0gMzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6elN0YXRlID0gMzY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDM3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogenpTdGF0ZSA9IDM4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogenpTdGF0ZSA9IDM5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDQwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAxNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDQxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogenpTdGF0ZSA9IDQyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogenpTdGF0ZSA9IDQyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA0MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6U3RhdGUgPSA0MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA0NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSAzNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6U3RhdGUgPSAzNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6U3RhdGUgPSAzNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6U3RhdGUgPSA0NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSA0NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSA0NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDIyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogenpTdGF0ZSA9IDQ4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogenpTdGF0ZSA9IDQ5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpTdGF0ZSA9IDUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDUyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogenpTdGF0ZSA9IDUzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDU1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDU2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDU0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogenpTdGF0ZSA9IDU3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogenpTdGF0ZSA9IDU4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDU3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gNTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB6elN0YXRlID0gNjA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gNTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNjA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA2MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA2MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgZXZlciByZWFjaGVkLCB0aGVyZSBpcyBhIHNlcmlvdXMgYnVnIGluIEpGbGV4Ci0gICAgICAgICAgICAgIHp6U2NhbkVycm9yKFpaX1VOS05PV05fRVJST1IpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9IH0KLQotICAgICAgICAgIGlmICggenpJc0ZpbmFsICkgewotICAgICAgICAgICAgenpBY3Rpb24gPSB6elN0YXRlOwotICAgICAgICAgICAgenpNYXJrZWRQb3NMID0genpDdXJyZW50UG9zTDsKLSAgICAgICAgICAgIGlmICggenpOb0xvb2tBaGVhZCApIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9uCi0gICAgICB6ek1hcmtlZFBvcyA9IHp6TWFya2VkUG9zTDsKLQotICAgICAgc3dpdGNoICh6ekFjdGlvbiA8IDAgPyB6ekFjdGlvbiA6IFpaX0FDVElPTlt6ekFjdGlvbl0pIHsKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDE5OiBicmVhazsKLSAgICAgICAgY2FzZSAxNTogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NO30KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjA6IGJyZWFrOwotICAgICAgICBjYXNlIDQ6IAotICAgICAgICAgIHsgeXliZWdpbihTUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAyMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogCi0gICAgICAgICAgeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAyMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID4gTUFYX1RPX1NDQU4pIHtoYXNNb3JlPWZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuTUFYX0NIQVJTX1JFQUNIRUQ7fQotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAyMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7fQotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAyNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjU6IGJyZWFrOwotICAgICAgICBjYXNlIDg6IAotICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDI2OiBicmVhazsKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAyNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgeyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAyODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICAgIHsgeXlwdXNoYmFjaygyKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAyOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDMwOiBicmVhazsKLSAgICAgICAgY2FzZSAyOiAKLSAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDMyOiBicmVhazsKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsVmVyc2lvbjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzM6IGJyZWFrOwotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgICB7IHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzogCi0gICAgICAgICAgeyB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDM1OiBicmVhazsKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzY6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoenpJbnB1dCA9PSBZWUVPRiAmJiB6elN0YXJ0UmVhZCA9PSB6ekN1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHp6QXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgenpEb0VPRigpOwotICAgICAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjsgfQotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB6elNjYW5FcnJvcihaWl9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZjIzZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1wdWJsaWMgaW50ZXJmYWNlIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMgZXh0ZW5kcyBFbmNvZGluZ1BhcnNlckNvbnN0YW50cyB7Ci0KLQlmaW5hbCBTdHJpbmcgWE1MRGVjbEVuZCA9ICJYTUxEZWNsRW5kIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBYTUxEZWNsU3RhcnQgPSAiWE1MRGVjbFN0YXJ0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBYTUxEZWxFbmNvZGluZyA9ICJYTUxEZWxFbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgWE1MRGVjbFZlcnNpb24gPSAiWE1MRGVjbFZlcnNpb24iOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9YTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcyODc5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciB7Ci0JcHJpdmF0ZSBYTUxIZWFkVG9rZW5pemVyIGZUb2tlbml6ZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGZEZWNsRGV0ZWN0ZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkluaXRpYWxXaGl0ZVNwYWNlID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtKFN0cmluZyB0b2tlblR5cGUpIHsKLQkJYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSBmYWxzZTsKLQkJaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT00pIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRVVEY4M0J5dGVCT01Vc2VkKHRydWUpOwotCQl9Ci0KLQkJZWxzZSBpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkUpIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi0xNkJFIjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQl9Ci0JCWVsc2UgaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSB0cnVlOwotCQkJU3RyaW5nIGVuYyA9ICJVVEYtMTYiOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVURUNURURfU1RBTkRBUkRfVU5JQ09ERV9CWVRFUyk7Ci0JCX0KLQkJcmV0dXJuIGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIFVURi04IGFzIHBlciBYTUwgc3BlYwotCQlmaW5hbCBTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdG9rZW5pemVyLgotCSAqLwotCXByaXZhdGUgWE1MSGVhZFRva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCS8vIFRPRE86IG5lZWQgdG8gd29yayBvbiAncmVzZXQnIGluIHRva2VuaXplciwgc28gbmV3IGluc3RhbmNlIGlzbid0Ci0JCS8vIGFsd2F5cyBuZWVkZWQKLQkJLy8gaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQlmVG9rZW5pemVyID0gbmV3IFhNTEhlYWRUb2tlbml6ZXIoKTsKLQkJLy8gfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNMZWdhbFN0cmluZyhTdHJpbmcgdmFsdWVUb2tlblR5cGUpIHsKLQkJaWYgKHZhbHVlVG9rZW5UeXBlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UKLQkJCXJldHVybiB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlYTUxIZWFkVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2VuaXplcigpOwotCQl0b2tlbml6ZXIucmVzZXQoZlJlYWRlcik7Ci0JCUhlYWRQYXJzZXJUb2tlbiB0b2tlbiA9IG51bGw7Ci0JCVN0cmluZyB0b2tlblR5cGUgPSBudWxsOwotCQlkbyB7Ci0JCQl0b2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCXRva2VuVHlwZSA9IHRva2VuLmdldFR5cGUoKTsKLQotCQkJLy8gaGFuZGxlIHhtbCBjb250ZW50IHR5cGUgZGV0ZWN0aW9uCi0JCQlpZiAodG9rZW5UeXBlID09IFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0KSB7Ci0JCQkJZkRlY2xEZXRlY3RlZCA9IHRydWU7Ci0JCQkJU3RyaW5nIGRlY2xUZXh0ID0gdG9rZW4uZ2V0VGV4dCgpOwotCQkJCWlmIChkZWNsVGV4dC5zdGFydHNXaXRoKCI8PyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZkluaXRpYWxXaGl0ZVNwYWNlID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmSW5pdGlhbFdoaXRlU3BhY2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gaGFuZGxlIGVuY29kaW5nIGRldGVjdGlvbgotCQkJaWYgKGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSh0b2tlblR5cGUpKSB7Ci0JCQkJLy8gc2lkZSBlZmZlY3Qgb2YgY2FuSGFuZGxlIGlzIHRvIGNyZWF0ZSBhcHByb3ByaWF0ZSBtZW1lbnRvCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAodG9rZW5UeXBlID09IFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2RpbmcpIHsKLQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCXRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJCQkJdG9rZW5UeXBlID0gdG9rZW4uZ2V0VHlwZSgpOwotCQkJCQkJaWYgKGlzTGVnYWxTdHJpbmcodG9rZW5UeXBlKSkgewotCQkJCQkJCVN0cmluZyBlbmMgPSB0b2tlbi5nZXRUZXh0KCk7Ci0JCQkJCQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkZPVU5EX0VOQ09ESU5HX0lOX0NPTlRFTlQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlY2xEZXRlY3RlZCgpIHsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQl0cnkgewotCQkJCXBhcnNlSW5wdXQoKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZkRlY2xEZXRlY3RlZCA9IGZhbHNlOwotCQkJfQotCQkJLy8gd2Uga2VlcCB0cmFjayBvZiBpZiBoZWFkZXIncyBhbHJlYWR5IGJlZW4KLQkJCS8vIHBhcnNlLCBzbyBjYW4gbWFrZQotCQkJLy8gbXVsdGlwbGUgJ2dldCcgY2FsbHMsIHdpdGhvdXQgY2F1c2luZwotCQkJLy8gcmVwYXJzaW5nLgotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCX0KLQkJLy8gZkRlY2xEZXRlY3RlZCBpcyBzZXQgYXMgcGFydCBvZiBwYXJzaW5nLgotCQlyZXR1cm4gZkRlY2xEZXRlY3RlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNJbml0aWFsV2hpdGVTcGFjZSgpIHsKLQkJcmV0dXJuIGZJbml0aWFsV2hpdGVTcGFjZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNldEFsbCgpIHsKLQkgICAgc3VwZXIucmVzZXRBbGwoKTsKLQkJZkRlY2xEZXRlY3RlZCA9IGZhbHNlOwotCQlmSW5pdGlhbFdoaXRlU3BhY2UgPSBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0F0dHJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0F0dHJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMmU5NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9BdHRySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5hbWVkTm9kZU1hcEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklYTUxDaGFyRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JWE1MTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLQotLyoqCi0gKiBBdHRySW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgQXR0ckltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIElET01BdHRyIHsKLQlwcml2YXRlIElUZXh0UmVnaW9uIGVxdWFsUmVnaW9uID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotCXByaXZhdGUgSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLQlwcml2YXRlIEVsZW1lbnRJbXBsIG93bmVyRWxlbWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVTb3VyY2UgPSBudWxsOwotCi0JLyoqCi0JICogQXR0ckltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQXR0ckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQXR0ckltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgQXR0ckltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgQXR0ckltcGwoQXR0ckltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLm5hbWUgPSB0aGF0Lm5hbWU7Ci0JCQl0aGlzLnZhbHVlU291cmNlID0gdGhhdC5nZXRWYWx1ZVNvdXJjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQXR0ckltcGwgY2xvbmVkID0gbmV3IEF0dHJJbXBsKHRoaXMpOwotCQlub3RpZnlVc2VyRGF0YUhhbmRsZXJzKFVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRCwgY2xvbmVkKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXREZWNsYXJhdGlvbigpIHsKLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgZ2V0T3duZXJFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBlbGVtZW50LmdldERlY2xhcmF0aW9uKCk7Ci0JCWlmIChlbGVtZW50RGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNNTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50RGVjbC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCUNNTmFtZWROb2RlTWFwSW1wbCBhbGxBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbChhdHRyaWJ1dGVzKTsKLQkJTGlzdCBub2RlcyA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBdmFpbGFibGVDb250ZW50KGdldE93bmVyRWxlbWVudCgpLCBlbGVtZW50RGVjbCwgTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVMpOwotCQlmb3IgKGludCBrID0gMDsgayA8IG5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQlDTU5vZGUgY21ub2RlID0gKENNTm9kZSkgbm9kZXMuZ2V0KGspOwotCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pIHsKLQkJCQlhbGxBdHRyaWJ1dGVzLnB1dChjbW5vZGUpOwotCQkJfQotCQl9Ci0JCWF0dHJpYnV0ZXMgPSBhbGxBdHRyaWJ1dGVzOwotCQkKLQotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbmRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJaW50IG9mZnNldCA9IHRoaXMub3duZXJFbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWlmICh0aGlzLnZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCXJldHVybiAob2Zmc2V0ICsgdGhpcy52YWx1ZVJlZ2lvbi5nZXRFbmQoKSk7Ci0JCX0KLQkJaWYgKHRoaXMuZXF1YWxSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIChvZmZzZXQgKyB0aGlzLmVxdWFsUmVnaW9uLmdldEVuZCgpKTsKLQkJfQotCQlpZiAodGhpcy5uYW1lUmVnaW9uICE9IG51bGwpIHsKLQkJCXJldHVybiAob2Zmc2V0ICsgdGhpcy5uYW1lUmVnaW9uLmdldEVuZCgpKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRFcXVhbFJlZ2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZXF1YWxSZWdpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0JCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgaW5kZXggPSB0aGlzLm5hbWUuaW5kZXhPZignOicpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJcmV0dXJuIHRoaXMubmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKHRoaXMubmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lUmVnaW9uOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TmFtZVJlZ2lvbkVuZE9mZnNldCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJLy8gYXNzdW1pbmcgdGhlIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIHRoZSBvbmUgdGhhdCBjb250YWlucwotCQkvLyBhdHRyaWJ1dGVzCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSB0aGlzLm93bmVyRWxlbWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHRoaXMubmFtZVJlZ2lvbik7Ci0JfQotCi0JcHVibGljIGludCBnZXROYW1lUmVnaW9uU3RhcnRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCS8vIGFzc3VtaW5nIHRoZSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyB0aGUgb25lIHRoYXQgY29udGFpbnMKLQkJLy8gYXR0cmlidXRlcwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHRoaXMubmFtZVJlZ2lvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lUmVnaW9uVGV4dCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gYXNzdW1pbmcgdGhlIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIHRoZSBvbmUgdGhhdCBjb250YWlucwotCQkvLyBhdHRyaWJ1dGVzCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSB0aGlzLm93bmVyRWxlbWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dCh0aGlzLm5hbWVSZWdpb24pOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TmFtZVJlZ2lvblRleHRFbmRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCS8vIGFzc3VtaW5nIHRoZSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyB0aGUgb25lIHRoYXQgY29udGFpbnMKLQkJLy8gYXR0cmlidXRlcwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGZsYXROb2RlLmdldFRleHRFbmRPZmZzZXQodGhpcy5uYW1lUmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLQkJU3RyaW5nIG5zQXR0ck5hbWUgPSBudWxsOwotCQlTdHJpbmcgcHJlZml4ID0gZ2V0UHJlZml4KCk7Ci0JCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpZiAocHJlZml4LmVxdWFscyhJWE1MTmFtZXNwYWNlLlhNTE5TKSkgewotCQkJCS8vIGZpeGVkIFVSSQotCQkJCXJldHVybiBJWE1MTmFtZXNwYWNlLlhNTE5TX1VSSTsKLQkJCX0KLQkJCW5zQXR0ck5hbWUgPSBJWE1MTmFtZXNwYWNlLlhNTE5TX1BSRUZJWCArIHByZWZpeDsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmVxdWFscyhJWE1MTmFtZXNwYWNlLlhNTE5TKSkgewotCQkJCS8vIGZpeGVkIFVSSQotCQkJCXJldHVybiBJWE1MTmFtZXNwYWNlLlhNTE5TX1VSSTsKLQkJCX0KLQkJCS8vIGRvZXMgbm90IGluaGVyaXQgbmFtZXNwYWNlIGZyb20gb3duZXIgZWxlbWVudAotCQkJLy8gaWYgKHRoaXMub3duZXJFbGVtZW50ICE9IG51bGwpIHJldHVybgotCQkJLy8gdGhpcy5vd25lckVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2VVUkk7Ci0JCX0KLQotCQlmb3IgKE5vZGUgbm9kZSA9IHRoaXMub3duZXJFbGVtZW50OyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBFTEVNRU5UX05PREUpCi0JCQkJYnJlYWs7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShuc0F0dHJOYW1lKTsKLQkJCWlmIChhdHRyICE9IG51bGwpCi0JCQkJcmV0dXJuIGF0dHIuZ2V0VmFsdWUoKTsKLQkJfQotCi0JCXJldHVybiB0aGlzLm5hbWVzcGFjZVVSSTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBBVFRSSUJVVEVfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlVmFsdWUoKSB7Ci0JCXJldHVybiBnZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIGdldE93bmVyRWxlbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBnZXRPd25lckVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJaWYgKHRoaXMubmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBpbmRleCA9IHRoaXMubmFtZS5pbmRleE9mKCc6Jyk7Ci0JCWlmIChpbmRleCA8PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIGV4Y2x1ZGUgSlNQIHRhZyBpbiBuYW1lCi0JCWlmICh0aGlzLm5hbWUuY2hhckF0KDApID09ICc8JykKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gdGhpcy5uYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3BlY2lmaWVkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFNwZWNpZmllZCgpIHsKLQkJLy8gaWYgdGhlcmUgaXMgbm8gdW5kZXJseWluZyBkb2N1bWVudCByZWdpb24sIAotCQkvLyB0aGVuIHRoaXMgYXR0cmlidXRlcyB2YWx1ZSBoYXMgbm90IHJlYWxseSBiZSBzcGVjaWZpZWQKLQkJLy8geWV0IGluIHRoZSBkb2N1bWVudCwgYW5kIGFueSByZXR1cm5lZCB2YWx1ZXMsIHN1Y2ggYXMgCi0JCS8vIGFuIGVtcHR5IHN0cmluZyBvciBhIGRlZmF1bHQgdmFsdWUgYXJlIGJlaW5nIHN1cHBsaWVkCi0JCS8vIGFzIHBlciBzcGVjLCBub3QgcGVyIHdoYXQncyBpbiB0aGUgdXNlcnMgZG9jdW1lbnQuCi0JCXJldHVybiB0aGlzLnZhbHVlUmVnaW9uICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3RhcnRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlpbnQgb2Zmc2V0ID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaWYgKHRoaXMubmFtZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKG9mZnNldCArIHRoaXMubmFtZVJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJfQotCQlpZiAodGhpcy5lcXVhbFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKG9mZnNldCArIHRoaXMuZXF1YWxSZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCX0KLQkJaWYgKHRoaXMudmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIChvZmZzZXQgKyB0aGlzLnZhbHVlUmVnaW9uLmdldFN0YXJ0KCkpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIGdldFZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBnZXRWYWx1ZShnZXRWYWx1ZVNvdXJjZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHZhbHVlIGZvciB0aGUgc291cmNlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmFsdWUoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlpZiAoc291cmNlLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gc291cmNlOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWludCByZWYgPSBzb3VyY2UuaW5kZXhPZignJicpOwotCQl3aGlsZSAocmVmID49IDApIHsKLQkJCWludCBlbmQgPSBzb3VyY2UuaW5kZXhPZignOycsIHJlZiArIDEpOwotCQkJaWYgKGVuZCA+IHJlZiArIDEpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHNvdXJjZS5zdWJzdHJpbmcocmVmICsgMSwgZW5kKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSBnZXRDaGFyVmFsdWUobmFtZSk7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGgpOwotCQkJCQlpZiAocmVmID4gb2Zmc2V0KQotCQkJCQkJYnVmZmVyLmFwcGVuZChzb3VyY2Uuc3Vic3RyaW5nKG9mZnNldCwgcmVmKSk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQodmFsdWUpOwotCQkJCQlvZmZzZXQgPSBlbmQgKyAxOwotCQkJCQlyZWYgPSBlbmQ7Ci0JCQkJfQotCQkJfQotCQkJcmVmID0gc291cmNlLmluZGV4T2YoJyYnLCByZWYgKyAxKTsKLQkJfQotCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQlyZXR1cm4gc291cmNlOwotCQlpZiAobGVuZ3RoID4gb2Zmc2V0KQotCQkJYnVmZmVyLmFwcGVuZChzb3VyY2Uuc3Vic3RyaW5nKG9mZnNldCkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFZhbHVlUmVnaW9uKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZVJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBJU1NVRTogd2hhdCBzaG91bGQgYmVoYXZpb3IgYmUgaWYgdGhpcy52YWx1ZSA9PSBudWxsPyBJdCdzIGFuICJlcnJvciIKLQkgKiB0byBiZSBpbiB0aGF0IHN0YXRlLCBidXQgc2VlbXMgdG8gb2NjdXIgcmVsYXRpdmVseSBlYXNpbHkgLi4uIHByb2JhYmx5Ci0JICogZHVlIHRvIHRocmVhZGluZyBidWdzIC4uLiBidXQgdGhpcyBqdXN0IHNob3dzIGl0cyBuZWVkcyB0byBiZSBzcGVjJ2QuCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCkgewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQkvLyBhc3N1bWluZyB0aGUgZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgdGhlIG9uZSB0aGF0IGNvbnRhaW5zCi0JCS8vIHRoZSB2YWx1ZVJlZ2lvbiAtLSBzaG91bGQgbWFrZSBzbWFydGVyPwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRoaXMub3duZXJFbGVtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQkvLyBlbnN1cmUgd2UgbmV2ZXIgcGFzcyBudWxsIHRvIGdldFN0YXJ0T2Zmc2V0LgotCQlpZiAodGhpcy52YWx1ZVJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHRoaXMudmFsdWVSZWdpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVSZWdpb25UZXh0KCkgewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBhc3N1bWluZyB0aGUgZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgdGhlIG9uZSB0aGF0IGNvbnRhaW5zCi0JCS8vIGF0dHJpYnV0ZXMKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHRoaXMub3duZXJFbGVtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLnZhbHVlUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGZsYXROb2RlLmdldFRleHQodGhpcy52YWx1ZVJlZ2lvbik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVNvdXJjZSgpIHsKLQkJaWYgKHRoaXMudmFsdWVTb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiB0aGlzLnZhbHVlU291cmNlOwotCQkvLyBEVzogNC8xNi8yMDAzIGR1ZSB0byBjaGFuZ2UgaW4gc3RydWN0dXJlZERvY3VtZW50IC4uLiB3ZSBuZWVkIGEKLQkJLy8gZmxhdG5vZGUgdG8KLQkJLy8gZ2V0IGF0IHJlZ2lvbiB2YWx1ZXMuIEZvciBub3cgSSdsbCBhc3N1bWUgdGhpcyBpcyBhbHdheXMgdGhlIGZpcnN0Ci0JCS8vIGZsYXRub2RlIC4uIG1heSBuZWVkIHRvIG1ha2Ugc21hcnRlciBsYXRlciAoZS5nLiB0byBzZWFyY2ggZm9yCi0JCS8vIHRoZSBmbGF0bm9kZSB0aGF0IHRoaXMudmFsdWVSZWdpb24gYmVsb25ncyB0by4KLQkJLy8gRFc6IDQvMzAvMjAwMyBGb3Igc29tZSByZWFzb24sIHRoaXMgbWV0aG9kIGlzIGdldHRpbmcgY2FsbGVkIGEgbG90Ci0JCS8vIE5vdCBzdXJlIGlmIGl0cyBhIHRocmVhZGluZyBwcm9ibGVtLCBvciBhIGZ1bmRhbWVudGFsIGVycm9yCi0JCS8vIGVsc2V3aGVyZS4KLQkJLy8gSXQgbmVlZHMgbW9yZSBpbnZlc3RpZ2F0aW9uLCBidXQgaW4gdGhlIHVzZSBjYXNlcyBJJ3ZlIHNlZW4sCi0JCS8vIGRvZXNuJ3QKLQkJLy8gc2VlbSB0byBodXJ0IHRvIHNpbXBseSByZXR1cm4gbnVsbCBpbiB0aG9zZSBjYXNlcy4gSSBzYXcgdGhpcyBudWxsCi0JCS8vIGNhc2UsCi0JCS8vIHdoZW4gdHJ5aW50IGdvIGZvcm1hdCBhbiBYTUwgZmlsZS4KLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvd25lclJlZ2lvbiA9IHRoaXMub3duZXJFbGVtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChvd25lclJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLnZhbHVlUmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRBdHRyVmFsdWUob3duZXJSZWdpb24sIHRoaXMudmFsdWVSZWdpb24pOwotCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFZhbHVlU291cmNlKEVsZW1lbnRJbXBsIG93bmVyRWxlbWVudCkgewotCQlpZiAodGhpcy52YWx1ZVNvdXJjZSAhPSBudWxsKQotCQkJcmV0dXJuIHRoaXMudmFsdWVTb3VyY2U7Ci0JCS8vIERXOiA0LzE2LzIwMDMgZHVlIHRvIGNoYW5nZSBpbiBzdHJ1Y3R1cmVkRG9jdW1lbnQgLi4uIHdlIG5lZWQgYQotCQkvLyBmbGF0bm9kZSB0bwotCQkvLyBnZXQgYXQgcmVnaW9uIHZhbHVlcy4gRm9yIG5vdyBJJ2xsIGFzc3VtZSB0aGlzIGlzIGFsd2F5cyB0aGUgZmlyc3QKLQkJLy8gZmxhdG5vZGUgLi4gbWF5IG5lZWQgdG8gbWFrZSBzbWFydGVyIGxhdGVyIChlLmcuIHRvIHNlYXJjaCBmb3IKLQkJLy8gdGhlIGZsYXRub2RlIHRoYXQgdGhpcy52YWx1ZVJlZ2lvbiBiZWxvbmdzIHRvLgotCQlpZiAodGhpcy52YWx1ZVJlZ2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0QXR0clZhbHVlKG93bmVyRWxlbWVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgdGhpcy52YWx1ZVJlZ2lvbik7Ci0JCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmFsdWVTb3VyY2UoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIHZhbHVlOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLQkJaW50IGFtcCA9IHZhbHVlLmluZGV4T2YoJyYnKTsKLQkJd2hpbGUgKGFtcCA+PSAwKSB7Ci0JCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyA0KTsKLQkJCWlmIChhbXAgPiBvZmZzZXQpCi0JCQkJYnVmZmVyLmFwcGVuZCh2YWx1ZS5zdWJzdHJpbmcob2Zmc2V0LCBhbXApKTsKLQkJCWJ1ZmZlci5hcHBlbmQoSVhNTENoYXJFbnRpdHkuQU1QX1JFRik7Ci0JCQlvZmZzZXQgPSBhbXAgKyAxOwotCQkJYW1wID0gdmFsdWUuaW5kZXhPZignJicsIG9mZnNldCk7Ci0JCX0KLQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJcmV0dXJuIHZhbHVlOwotCQlpZiAobGVuZ3RoID4gb2Zmc2V0KQotCQkJYnVmZmVyLmFwcGVuZCh2YWx1ZS5zdWJzdHJpbmcob2Zmc2V0KSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiBBdHRyIGhhcyBKU1AgaW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXN0ZWRWYWx1ZSgpIHsKLQkJaWYgKHRoaXMudmFsdWVSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCEodGhpcy52YWx1ZVJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSB0aGlzLnZhbHVlUmVnaW9uKS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOIHx8IGlzTmVzdGVkTGFuZ3VhZ2VPcGVuaW5nKHJlZ2lvblR5cGUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiBBdHRyIGhhcyBvbmx5IG5hbWUgYnV0IG5vdCBlcXVhbCBzaWduIG5vciB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05hbWVPbmx5KCkgewotCQlyZXR1cm4gKHRoaXMubmFtZVJlZ2lvbiAhPSBudWxsICYmIHRoaXMuZXF1YWxSZWdpb24gPT0gbnVsbCAmJiB0aGlzLnZhbHVlUmVnaW9uID09IG51bGwpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGhhc1ByZWZpeCgpIHsKLQkJaWYgKHRoaXMubmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodGhpcy5uYW1lLmluZGV4T2YoJzonKSA8PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBleGNsdWRlIEpTUCB0YWcgaW4gbmFtZQotCQlpZiAodGhpcy5uYW1lLmNoYXJBdCgwKSA9PSAnPCcpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlnbm9yZUNhc2UoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5vd25lckVsZW1lbnQuaWdub3JlQ2FzZSgpKSB7Ci0JCQkJcmV0dXJuICFoYXNQcmVmaXgoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50Lmlnbm9yZUNhc2UoKSkgewotCQkJCS8vIGV2ZW4gaW4gY2FzZSBpbnNlbnNpdGl2ZSBkb2N1bWVudCwgaWYgaGF2aW5nIHByZWZpeCwgaXQncwotCQkJCS8vIGNhc2Ugc2Vuc2l0aXZlCi0JCQkJcmV0dXJuICFoYXNQcmVmaXgoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHbG9iYWxBdHRyKCkgewotCQlpZiAoaGFzUHJlZml4KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdGhpcy5vd25lckVsZW1lbnQuaXNHbG9iYWxUYWcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1hNTEF0dHIoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAoIXRoaXMub3duZXJFbGVtZW50LmlzWE1MVGFnKCkpIHsKLQkJCQlyZXR1cm4gaGFzUHJlZml4KCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiAhZG9jdW1lbnQuaXNYTUxUeXBlKCkpIHsKLQkJCQkvLyBldmVuIGluIG5vbi1YTUwgZG9jdW1lbnQsIGlmIGhhdmluZyBwcmVmaXgsIGl0J3MgWE1MIHRhZwotCQkJCXJldHVybiBoYXNQcmVmaXgoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBtYXRjaE5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiAodGhpcy5uYW1lID09IG51bGwpOwotCQlpZiAodGhpcy5uYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh0aGlzLm5hbWUubGVuZ3RoKCkgIT0gbmFtZS5sZW5ndGgoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHRoaXMubmFtZS5lcXVhbHMobmFtZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHRoaXMubmFtZS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpICYmIGlnbm9yZUNhc2UoKTsKLQl9Ci0KLQotCS8qKgotCSAqIG5vdGlmeVZhbHVlQ2hhbmdlZCBtZXRob2QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlOYW1lQ2hhbmdlZCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIHRoaXMub3duZXJFbGVtZW50LmdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwubmFtZUNoYW5nZWQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogbm90aWZ5VmFsdWVDaGFuZ2VkIG1ldGhvZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeVZhbHVlQ2hhbmdlZCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIHRoaXMub3duZXJFbGVtZW50LmdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwudmFsdWVDaGFuZ2VkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZVJlZ2lvbnMgbWV0aG9kCi0JICovCi0Jdm9pZCByZW1vdmVSZWdpb25zKCkgewotCQl0aGlzLm5hbWVSZWdpb24gPSBudWxsOwotCQl0aGlzLnZhbHVlUmVnaW9uID0gbnVsbDsKLQkJdGhpcy5lcXVhbFJlZ2lvbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZXNldFJlZ2lvbnMoKSB7Ci0JCXRoaXMudmFsdWVTb3VyY2UgPSBnZXRWYWx1ZVNvdXJjZSgpOwotCQlyZW1vdmVSZWdpb25zKCk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZXNldFJlZ2lvbnMoRWxlbWVudEltcGwgb3duZXJFbGVtZW50KSB7Ci0JCXRoaXMudmFsdWVTb3VyY2UgPSBnZXRWYWx1ZVNvdXJjZShvd25lckVsZW1lbnQpOwotCQlyZW1vdmVSZWdpb25zKCk7Ci0JfQotCi0Jdm9pZCBzZXRFcXVhbFJlZ2lvbihJVGV4dFJlZ2lvbiBlcXVhbFJlZ2lvbikgewotCQl0aGlzLmVxdWFsUmVnaW9uID0gZXF1YWxSZWdpb247Ci0JfQotCi0JLyoqCi0JICogc2V0TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ICE9IG51bGwpIHsKLQkJCXZhbHVlID0gZ2V0VmFsdWUoKTsKLQkJCXN0YXJ0T2Zmc2V0ID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCXRoaXMub3duZXJFbGVtZW50Lm5vdGlmeShDSEFOR0UsIHRoaXMsIHZhbHVlLCBudWxsLCBzdGFydE9mZnNldCk7Ci0JCX0KLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ICE9IG51bGwpIHsKLQkJCXRoaXMub3duZXJFbGVtZW50Lm5vdGlmeShDSEFOR0UsIHRoaXMsIG51bGwsIHZhbHVlLCBzdGFydE9mZnNldCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHNldE5hbWVSZWdpb24oSVRleHRSZWdpb24gbmFtZVJlZ2lvbikgewotCQl0aGlzLm5hbWVSZWdpb24gPSBuYW1lUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCXRoaXMubmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotCX0KLQotCS8qKgotCSAqIHNldE5vZGVWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZVZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9kZVZhbHVlKFN0cmluZyBub2RlVmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzZXRWYWx1ZShub2RlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIHNldE93bmVyRWxlbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3duZXJFbGVtZW50KEVsZW1lbnQgb3duZXJFbGVtZW50KSB7Ci0JCXRoaXMub3duZXJFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBvd25lckVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgIT0gbnVsbCAmJiAhdGhpcy5vd25lckVsZW1lbnQuaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWludCBwcmVmaXhMZW5ndGggPSAocHJlZml4ICE9IG51bGwgPyBwcmVmaXgubGVuZ3RoKCkgOiAwKTsKLQkJU3RyaW5nIGxvY2FsTmFtZSA9IGdldExvY2FsTmFtZSgpOwotCQlpZiAocHJlZml4TGVuZ3RoID09IDApIHsKLQkJCXNldE5hbWUobG9jYWxOYW1lKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobG9jYWxOYW1lID09IG51bGwpCi0JCQlsb2NhbE5hbWUgPSBuZXcgU3RyaW5nKCk7Ci0JCWludCBsb2NhbExlbmd0aCA9IGxvY2FsTmFtZS5sZW5ndGgoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIocHJlZml4TGVuZ3RoICsgMSArIGxvY2FsTGVuZ3RoKTsKLQkJYnVmZmVyLmFwcGVuZChwcmVmaXgpOwotCQlidWZmZXIuYXBwZW5kKCc6Jyk7Ci0JCWJ1ZmZlci5hcHBlbmQobG9jYWxOYW1lKTsKLQkJc2V0TmFtZShidWZmZXIudG9TdHJpbmcoKSk7Ci0KLQkJbm90aWZ5TmFtZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJLy8gUmVtZW1iZXI6IGFzIHdlIGFjY291bnQgZm9yICJmbG9hdGVycyIgaW4KLQkJLy8gZnV0dXJlLCByZW1lbWJlciB0aGF0IHNvbWUgYXJlIGNyZWF0ZWQKLQkJLy8gaW4gdGhlIG5hdHVyYWwgcHJvY2VzcyBvZiBpbXBsZW1lbnRpbmcKLQkJLy8gRE9NIGFwaXMuCi0JCS8vIHRoaXMgInNlbGYgbm90aWZpY2F0aW9uIiBvZiBhYm91dC9jaGFuZ2VkLAotCQkvLyBpcyBhZGRlZCBmb3IgdGhpcyBjYXNlLCBiZWNhdXNlIGl0IGtub3duIHRvCi0JCS8vIGJlIGNhbGxlZCBmcm9tIHByb3BlcnRpZXMgcGFnZXMuIFNob3VsZCBiZSBhCi0JCS8vIGFkZGVkIHRvIGFsbCBET00gTW9kaWZpeWluZyBBUElzIGV2ZW50dWFsbHkuCi0JCXRyeSB7Ci0JCQlnZXRNb2RlbCgpLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJc2V0VmFsdWVTb3VyY2UoZ2V0VmFsdWVTb3VyY2UodmFsdWUpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWdldE1vZGVsKCkuY2hhbmdlZE1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHNldFZhbHVlUmVnaW9uKElUZXh0UmVnaW9uIHZhbHVlUmVnaW9uKSB7Ci0JCXRoaXMudmFsdWVSZWdpb24gPSB2YWx1ZVJlZ2lvbjsKLQkJaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpCi0JCQl0aGlzLnZhbHVlU291cmNlID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZVNvdXJjZShTdHJpbmcgc291cmNlKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCAhPSBudWxsICYmICF0aGlzLm93bmVyRWxlbWVudC5pc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJdGhpcy52YWx1ZVNvdXJjZSA9IHNvdXJjZTsKLQotCQlub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUKLQkgKiAKLQkgKiBAcGFyYW0gcmVnaW9uVHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZExhbmd1YWdlT3BlbmluZyhTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ0RBVEFTZWN0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DREFUQVNlY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2M2VlZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DREFUQVNlY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICogICAgIEJhbGF6cyBCYW5mYWk6IEJ1ZyAxNTQ3MzcgZ2V0VXNlckRhdGEvc2V0VXNlckRhdGEgc3VwcG9ydCBmb3IgTm9kZQotICogICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ3MzcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi0KLS8qKgotICogQ0RBVEFTZWN0aW9uSW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgQ0RBVEFTZWN0aW9uSW1wbCBleHRlbmRzIFRleHRJbXBsIGltcGxlbWVudHMgQ0RBVEFTZWN0aW9uIHsKLQotCS8qKgotCSAqIENEQVRBU2VjdGlvbkltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQ0RBVEFTZWN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDREFUQVNlY3Rpb25JbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIENEQVRBU2VjdGlvbkltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgQ0RBVEFTZWN0aW9uSW1wbChDREFUQVNlY3Rpb25JbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDREFUQVNlY3Rpb25JbXBsIGNsb25lZCA9IG5ldyBDREFUQVNlY3Rpb25JbXBsKHRoaXMpOwotCQlub3RpZnlVc2VyRGF0YUhhbmRsZXJzKFVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRCwgY2xvbmVkKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBpbnN0ZWFkIG9mIHN1cGVyKFRleHRJbXBsKS5nZXREYXRhKCksIGNhbGwgZ2V0Q2hhcmFjdGVyRGF0YSgpCi0JCVN0cmluZyBkYXRhID0gZ2V0Q2hhcmFjdGVyRGF0YSgpOwotCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQlkYXRhID0gZ2V0RGF0YShnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJCWRhdGEgPSBuZXcgU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGRhdGE7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGF0YShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVRleHRSZWdpb24gY29udGVudFJlZ2lvbiA9IG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0UpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChjb250ZW50UmVnaW9uID09IG51bGwpIHsgLy8gZmlyc3QgY29udGVudAotCQkJCWNvbnRlbnRSZWdpb24gPSByZWdpb247Ci0JCQl9IGVsc2UgeyAvLyBtdWx0aXBsZSBjb250ZW50cwotCQkJCWlmIChidWZmZXIgPT0gbnVsbCkgewotCQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGZsYXROb2RlLmdldFRleHQoY29udGVudFJlZ2lvbikpOwotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQocmVnaW9uKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYnVmZmVyICE9IG51bGwpCi0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCWlmIChjb250ZW50UmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dChjb250ZW50UmVnaW9uKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuICIjY2RhdGEtc2VjdGlvbiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDREFUQV9TRUNUSU9OX05PREU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gd2lsbCBiZSBnZW5lcmF0ZWQKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJcmV0dXJuIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NNTm9kZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ01Ob2RlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTUzM2FiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ01Ob2RlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBDTU5vZGVVdGlsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihBdHRyIGF0dHIpIHsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKChBdHRySW1wbCkgYXR0cikuZ2V0RGVjbGFyYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldEVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKChFbGVtZW50SW1wbCkgZWxlbWVudCkuZ2V0RGVjbGFyYXRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NoYXJhY3RlckRhdGFJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NoYXJhY3RlckRhdGFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZjljNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DaGFyYWN0ZXJEYXRhSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5DaGFyYWN0ZXJEYXRhOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogQ2hhcmFjdGVyRGF0YUltcGwgY2xhc3MKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENoYXJhY3RlckRhdGFJbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBDaGFyYWN0ZXJEYXRhIHsKLQotCXByaXZhdGUgU3RyaW5nIGRhdGEgPSBudWxsOwotCi0JLyoqCi0JICogQ2hhcmFjdGVyRGF0YUltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhcmFjdGVyRGF0YUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hhcmFjdGVyRGF0YUltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgQ2hhcmFjdGVyRGF0YUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhcmFjdGVyRGF0YUltcGwoQ2hhcmFjdGVyRGF0YUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmRhdGEgPSB0aGF0LmdldERhdGEoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFwcGVuZERhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGFyZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZERhdGEoU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChhcmcgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCWRhdGEgPSBhcmc7Ci0JCWVsc2UKLQkJCWRhdGEgKz0gYXJnOwotCQlzZXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqIGRlbGV0ZURhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGNvdW50Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChjb3VudCA9PSAwKQotCQkJcmV0dXJuOwotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCWlmIChjb3VudCA8IDAgfHwgb2Zmc2V0IDwgMCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaW50IGxlbmd0aCA9IGRhdGEubGVuZ3RoKCk7Ci0JCWlmIChvZmZzZXQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWlmIChvZmZzZXQgPT0gMCkgewotCQkJaWYgKGNvdW50ID4gbGVuZ3RoKSB7Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCQl9Ci0JCQlpZiAoY291bnQgPT0gbGVuZ3RoKQotCQkJCWRhdGEgPSBuZXcgU3RyaW5nKCk7Ci0JCQllbHNlCi0JCQkJZGF0YSA9IGRhdGEuc3Vic3RyaW5nKGNvdW50KTsKLQkJfSBlbHNlIHsKLQkJCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQkJCWlmIChlbmQgPiBsZW5ndGgpIHsKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJCX0KLQkJCWlmIChlbmQgPT0gbGVuZ3RoKQotCQkJCWRhdGEgPSBkYXRhLnN1YnN0cmluZygwLCBvZmZzZXQpOwotCQkJZWxzZQotCQkJCWRhdGEgPSBkYXRhLnN1YnN0cmluZygwLCBvZmZzZXQpICsgZGF0YS5zdWJzdHJpbmcoZW5kKTsKLQkJfQotCQlzZXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0Q2hhcmFjdGVyRGF0YSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0Q2hhcmFjdGVyRGF0YSgpOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZGF0YS5sZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlVmFsdWUoKSB7Ci0JCXJldHVybiBnZXREYXRhKCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gYXJnCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0RGF0YShpbnQgb2Zmc2V0LCBTdHJpbmcgYXJnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGFyZyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIGRhdGEgPSBnZXREYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCWlmIChvZmZzZXQgPiAwKSB7Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCQl9Ci0JCQlkYXRhID0gYXJnOwotCQl9IGVsc2UgaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQlkYXRhID0gYXJnICsgZGF0YTsKLQkJfSBlbHNlIHsKLQkJCWludCBsZW5ndGggPSBkYXRhLmxlbmd0aCgpOwotCQkJaWYgKG9mZnNldCA+IGxlbmd0aCkgewotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQkJfQotCQkJaWYgKG9mZnNldCA9PSBsZW5ndGgpCi0JCQkJZGF0YSArPSBhcmc7Ci0JCQllbHNlCi0JCQkJZGF0YSA9IGRhdGEuc3Vic3RyaW5nKDAsIG9mZnNldCkgKyBhcmcgKyBkYXRhLnN1YnN0cmluZyhvZmZzZXQpOwotCQl9Ci0JCXNldERhdGEoZGF0YSk7Ci0JfQotCi0JLyoqCi0JICogaXNKU1BDb250ZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSlNQQ29udGVudCgpIHsKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQlyZXR1cm4gZWxlbWVudC5pc0pTUENvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIHJlcGxhY2VEYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBjb3VudAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGFyZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2VEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCwgU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaWYgKGFyZyA9PSBudWxsKSB7Ci0JCQlkZWxldGVEYXRhKG9mZnNldCwgY291bnQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChjb3VudCA9PSAwKSB7Ci0JCQlpbnNlcnREYXRhKG9mZnNldCwgYXJnKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIGRhdGEgPSBnZXREYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9IGVsc2UgaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJCWlmIChjb3VudCA+IGxlbmd0aCkgewotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQkJfQotCQkJaWYgKGNvdW50ID09IGxlbmd0aCkKLQkJCQlkYXRhID0gYXJnOwotCQkJZWxzZQotCQkJCWRhdGEgPSBhcmcgKyBkYXRhLnN1YnN0cmluZyhjb3VudCk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQkJCWlmIChlbmQgPiBsZW5ndGgpIHsKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJCX0KLQkJCWlmIChlbmQgPT0gbGVuZ3RoKQotCQkJCWRhdGEgPSBkYXRhLnN1YnN0cmluZygwLCBvZmZzZXQpICsgYXJnOwotCQkJZWxzZQotCQkJCWRhdGEgPSBkYXRhLnN1YnN0cmluZygwLCBvZmZzZXQpICsgYXJnICsgZGF0YS5zdWJzdHJpbmcoZW5kKTsKLQkJfQotCQlzZXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgcmVzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCkgewotCQl0aGlzLmRhdGEgPSBnZXREYXRhKCk7Ci0JCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5kYXRhID0gZGF0YTsKLQotCQlub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXROb2RlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGVWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShTdHJpbmcgbm9kZVZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc2V0RGF0YShub2RlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQl0aGlzLmRhdGEgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHN1YnN0cmluZ0RhdGEgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGNvdW50Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHN1YnN0cmluZ0RhdGEoaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGNvdW50ID09IDApCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIGRhdGEgPSBnZXREYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWludCBsZW5ndGggPSBkYXRhLmxlbmd0aCgpOwotCQlpZiAob2Zmc2V0ID09IDAgJiYgY291bnQgPT0gbGVuZ3RoKQotCQkJcmV0dXJuIGRhdGE7Ci0JCWlmIChvZmZzZXQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQkJaWYgKGVuZCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIGRhdGEuc3Vic3RyaW5nKG9mZnNldCwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiB0b1N0cmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKGdldE5vZGVOYW1lKCkpOwotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0RGF0YSgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCdAJyk7Ci0JCQlidWZmZXIuYXBwZW5kKGZsYXROb2RlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NvbW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NvbW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MzQ3NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Db21tZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLQotLyoqCi0gKiBDb21tZW50SW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudEltcGwgZXh0ZW5kcyBDaGFyYWN0ZXJEYXRhSW1wbCBpbXBsZW1lbnRzIENvbW1lbnQgewotCi0JcHJpdmF0ZSBib29sZWFuIGlzSlNQVGFnID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21tZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBDb21tZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb21tZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBDb21tZW50SW1wbAotCSAqLwotCXByb3RlY3RlZCBDb21tZW50SW1wbChDb21tZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMuaXNKU1BUYWcgPSB0aGF0LmlzSlNQVGFnOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDb21tZW50SW1wbCBjbG9uZWQgPSBuZXcgQ29tbWVudEltcGwodGhpcyk7Ci0JCW5vdGlmeVVzZXJEYXRhSGFuZGxlcnMoVXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVELCBjbG9uZWQpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIGdldERhdGEgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBkYXRhID0gZ2V0Q2hhcmFjdGVyRGF0YSgpOwotCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQlkYXRhID0gZ2V0RGF0YShnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJCWRhdGEgPSBuZXcgU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGRhdGE7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGF0YShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVRleHRSZWdpb24gY29udGVudFJlZ2lvbiA9IG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFIHx8IGlzTmVzdGVkQ29tbWVudE9wZW5DbG9zZShyZWdpb25UeXBlKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGNvbnRlbnRSZWdpb24gPT0gbnVsbCkgeyAvLyBmaXJzdCBjb250ZW50Ci0JCQkJY29udGVudFJlZ2lvbiA9IHJlZ2lvbjsKLQkJCX0KLQkJCWVsc2UgeyAvLyBtdWx0aXBsZSBjb250ZW50cwotCQkJCWlmIChidWZmZXIgPT0gbnVsbCkgewotCQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGZsYXROb2RlLmdldFRleHQoY29udGVudFJlZ2lvbikpOwotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQocmVnaW9uKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYnVmZmVyICE9IG51bGwpCi0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCWlmIChjb250ZW50UmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dChjb250ZW50UmVnaW9uKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuICIjY29tbWVudCI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDT01NRU5UX05PREU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gd2lsbCBiZSBnZW5lcmF0ZWQKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJcmV0dXJuIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UgfHwgaXNOZXN0ZWRDb21tZW50Q2xvc2UocmVnaW9uVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZQotCSAqIEBwYXJhbSByZWdpb25UeXBlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ29tbWVudENsb3NlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUKLQkgKiBAcGFyYW0gcmVnaW9uVHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENvbW1lbnRPcGVuQ2xvc2UoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCi0JcHVibGljIGJvb2xlYW4gaXNKU1BUYWcoKSB7Ci0JCXJldHVybiB0aGlzLmlzSlNQVGFnOwotCX0KLQotCS8qKgotCSAqIHNldEpTUFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gaXNKU1BUYWcKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKU1BUYWcoYm9vbGVhbiBpc0pTUFRhZykgewotCQlpZiAoaXNKU1BUYWcgPT0gdGhpcy5pc0pTUFRhZykKLQkJCXJldHVybjsKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGlzSlNQVGFnKSB7Ci0JCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCB8fCAhZG9jdW1lbnQuaXNKU1BUeXBlKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJdGhpcy5pc0pTUFRhZyA9IGlzSlNQVGFnOwotCi0JCWlmIChnZXRDb250YWluZXJEb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCS8vIGFscmVhZHkgaW4gdGhlIHRyZWUsIHVwZGF0ZSBJU3RydWN0dXJlZERvY3VtZW50Ci0JCQlzZXREYXRhKGdldERhdGEoKSk7IC8vIGNhbGxzIG5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9ET01Nb2RlbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NTW9kZWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMTQ5YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9ET01Nb2RlbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkFic3RyYWN0U3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTmV3RG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5vQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBYTUxNb2RlbEltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIERPTU1vZGVsSW1wbCBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZE1vZGVsIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLCBJRE9NTW9kZWwsIERPTUltcGxlbWVudGF0aW9uIHsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVFJBQ0VfUEFSU0VSX01BTkFHRU1FTlRfRVhDRVBUSU9OID0gInBhcnNlck1hbmFnZW1lbnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBPYmplY3QgYWN0aXZlID0gbnVsbDsKLQlwcml2YXRlIERvY3VtZW50SW1wbCBkb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBJU291cmNlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBYTUxNb2RlbE5vdGlmaWVyIG5vdGlmaWVyID0gbnVsbDsKLQlwcml2YXRlIFhNTE1vZGVsUGFyc2VyIHBhcnNlciA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIHJlZnJlc2ggPSBmYWxzZTsKLQlwcml2YXRlIFhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gbnVsbDsKLQotCS8qKgotCSAqIFhNTE1vZGVsSW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBET01Nb2RlbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBpbnRlcm5hbENyZWF0ZURvY3VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBBUEkgYWxsb3dzIGNsaWVudHMgdG8gZGVjbGFyZSB0aGF0IHRoZXkgYXJlIGFib3V0IHRvIG1ha2UgYQotCSAqICJsYXJnZSIgY2hhbmdlIHRvIHRoZSBtb2RlbC4gVGhpcyBjaGFuZ2UgbWlnaHQgYmUgaW4gdGVybXMgb2YgY29udGVudAotCSAqIG9yIGl0IG1pZ2h0IGJlIGluIHRlcm1zIG9mIHRoZSBtb2RlbCBpZCBvciBiYXNlIGxvY2F0aW9uLgotCSAqIAotCSAqIE5vdGUgdGhhdCBpbiB0aGUgY2FzZSBvZiBlbWJlZGRlZCBjYWxscywgbm90aWZpY2F0aW9uIHRvIGxpc3RuZXJzIGlzCi0JICogc2VudCBvbmx5IG9uY2UuCi0JICogCi0JICogTm90ZSB0aGF0IHRoZSBjbGllbnQgd2hvIGlzIG1ha2luZyB0aGVzZSBjaGFuZ2VzIGhhcyB0aGUgcmVzcG9uc2liaWxpdHkKLQkgKiB0byByZXN0b3JlIHRoZSBtb2RlbHMgc3RhdGUgb25jZSBmaW5pc2hlZCB3aXRoIHRoZSBjaGFuZ2VzLiBTZWUKLQkgKiBnZXRNZW1lbnRvIGFuZCByZXN0b3JlU3RhdGUuCi0JICogCi0JICogVGhlIG1ldGhvZCBpc01vZGVsU3RhdGVDaGFuZ2luZyBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkZXRlcm1pbmUgaWYKLQkgKiB0aGUgbW9kZWwgaXMgYWxyZWFkeSBpbiBhIGNoYW5nZSBzZXF1ZW5jZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhYm91dFRvQ2hhbmdlTW9kZWwoKSB7Ci0JCXN1cGVyLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkvLyB0ZWNobmljYWxseSwgbm8gbmVlZCB0byBjYWxsIGJlZ2luQ2hhbmdpbmcgc28gb2Z0ZW4sCi0JCS8vIHNpbmNlIGFib3V0VG9DaGFuZ2VNb2RlbCBjYW4gYmUgbmVzdGVkLgotCQkvLyBidXQgd2lsbCBsZWF2ZSBhcyBpcyBmb3IgdGhpcyByZWxlYXNlLgotCQkvLyBzZWUgbW9kZWxDaGFuZ2VkLCBhbmQgYmUgc3VyZSBzdGF5cyBjb29yZGluYXRlZCB0aGVyZS4KLQkJZ2V0TW9kZWxOb3RpZmllcigpLmJlZ2luQ2hhbmdpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhYm91dFRvUmVpbml0aWFsaXplTW9kZWwoKSB7Ci0JCVhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBnZXRNb2RlbE5vdGlmaWVyKCk7Ci0JCW5vdGlmaWVyLmNhbmNlbFBlbmRpbmcoKTsKLQkJc3VwZXIuYWJvdXRUb1JlaW5pdGlhbGl6ZU1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogYXR0clJlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICogQHBhcmFtIG5ld0F0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gb2xkQXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGF0dHJSZXBsYWNlZChFbGVtZW50IGVsZW1lbnQsIEF0dHIgbmV3QXR0ciwgQXR0ciBvbGRBdHRyKSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRBY3RpdmVQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldE1vZGVsVXBkYXRlcigpOwotCQkJc2V0QWN0aXZlKHVwZGF0ZXIpOwotCQkJdXBkYXRlci5pbml0aWFsaXplKCk7Ci0JCQl1cGRhdGVyLnJlcGxhY2VBdHRyKGVsZW1lbnQsIG5ld0F0dHIsIG9sZEF0dHIpOwotCQkJc2V0QWN0aXZlKG51bGwpOwotCQl9Ci0JCWdldE1vZGVsTm90aWZpZXIoKS5hdHRyUmVwbGFjZWQoZWxlbWVudCwgbmV3QXR0ciwgb2xkQXR0cik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBBUEkgYWxsb3dzIGEgY2xpZW50IGNvbnRyb2xsZWQgd2F5IG9mIG5vdGlmeWluZyBhbGwgTW9kZWxFdmVudAotCSAqIGxpc3RuZXJzIHRoYXQgdGhlIG1vZGVsIGhhcyBiZWVuIGNoYW5nZWQuIFRoaXMgbWV0aG9kIGlzIGEgbWF0Y2hlZCBwYWlyCi0JICogdG8gYWJvdXRUb0NoYW5nZU1vZGVsLCBhbmQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYWJvdXRUb0NoYW5nZU1vZGVsIC4uLgotCSAqIG9yIHNvbWUgbGlzdGVuZXJzIGNvdWxkIGJlIGxlZnQgd2FpdGluZyBpbmRlZmluaXRlbHkgZm9yIHRoZSBjaGFuZ2VkCi0JICogZXZlbnQuIFNvLCBpdHMgc3VnZ2VzdGVkIHRoYXQgY2hhbmdlZE1vZGVsIGFsd2F5cyBiZSBpbiBhIGZpbmFsbHkKLQkgKiBjbGF1c2UuIExpa2V3aXNlLCBhIGNsaWVudCBzaG91bGQgbmV2ZXIgY2FsbCBjaGFuZ2VkTW9kZWwgd2l0aG91dAotCSAqIGNhbGxpbmcgYWJvdXRUb0NoYW5nZU1vZGVsIGZpcnN0LgotCSAqIAotCSAqIEluIHRoZSBjYXNlIG9mIGVtYmVkZGVkIGNhbGxzLCB0aGUgbm90aWZpY2F0aW9uIGlzIGp1c3Qgc2VudCBvbmNlLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGNoYW5nZWRNb2RlbCgpIHsKLQkJLy8gTk9URTogdGhlIG9yZGVyIG9mICdjaGFuZ2VkTW9kZWwnIGFuZCAnZW5kQ2hhbmdpbmcnIGlzIHNpZ25pZmljYW50LgotCQkvLyBCeSBjYWxsaW5nIGNoYW5nZWRNb2RlbCBmaXJzdCwgdGhpcyBiYXNpY2FsbHkgZGVjcmVtZW50cyB0aGUKLQkJLy8gImlzQ2hhbmdpbmciIGNvdW50ZXIKLQkJLy8gaW4gc3VwZXIgY2xhc3MgYW5kIHdoZW4gemVybyBhbGwgbGlzdGVuZXJzIHRvIG1vZGVsIHN0YXRlIGV2ZW50cwotCQkvLyB3aWxsIGJlIG5vdGlmaWVkCi0JCS8vIHRoYXQgdGhlIG1vZGVsIGhhcyBiZWVuIGNoYW5nZWQuICdlbmRDaGFuZ2luZycgd2lsbCBub3RpZnkgYWxsCi0JCS8vIGRlZmVycmVkIGFkYXB0ZXJzLgotCQkvLyBTbywgdGhlIHNpZ25pZmljYW5jZSBvZiBvcmRlciBpcyB0aGF0IGFkYXB0ZXJzIChhbmQgbWV0aG9kcyB0aGV5Ci0JCS8vIGNhbGwpCi0JCS8vIGNhbiBjb3VudCBvbiB0aGUgc3RhdGUgb2YgbW9kZWwgImlzQ2hhbmdpbmciIHRvIGJlIGFjY3VyYXRlLgotCQkvLyBCdXQsIHJlbWVtYmVyLCB0aGF0IHRoaXMgbWVhbnMgdGhlICJtb2RlbENoYW5nZWQiIGV2ZW50IGNhbiBiZQotCQkvLyByZWNlaXZlZCBiZWZvcmUgYWxsCi0JCS8vIGFkYXB0ZXJzIGhhdmUgZmluaXNoZWQgdGhlaXIgcHJvY2Vzc2luZy4KLQkJLy8gTk9URSBOT1RFOiBUaGUgYWJvdmUgbm90ZSBpcyBvYnNvbGV0ZSBpbiBmYWN0ICh0aG91Z2ggc3RpbGwgc3RhdGVzCi0JCS8vIGlzc3VlIGNvcnJlY3RseSkuCi0JCS8vIER1ZSB0byBwb3B1bGFyIGRlbWFuZCwgdGhlIG9yZGVyIG9mIHRoZXNlIGNhbGxzIHdlcmUgcmV2ZXJzZWQgYW5kCi0JCS8vIGJlaGF2aW9yCi0JCS8vIGNoYW5nZWQgb24gMDcvMjIvMjAwNC4KLQkJLy8gCi0JCS8vIHNlZSBhbHNvCi0JCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00MzAyCi0JCS8vIGZvciBtb3RpdmF0aW9uIGZvciB0aGlzICdvbiB2ZXJnZSBvZicgY2FsbC4KLQkJLy8gdGhpcyBjb3VsZCBiZSBpbXByb3ZlZCBpbiBmdXR1cmUgaWYgbm90aWZpZXIgYWxzbyB1c2VkIGNvdW50aW5nCi0JCS8vIGZsYWcgdG8gYXZvaWQgbmVzdGVkIGNhbGxzLiBJZi93aGVuIGNoYW5nZWQgYmUgc3VyZSB0byBjaGVjayBpZgotCQkvLyBhYm91dFRvQ2hhbmdlTW9kZWwgbmVlZHMgYW55IGNoYW5nZXMgdG9vLgotCQlpZiAoaXNNb2RlbENoYW5nZVN0YXRlT25WZXJnZU9mRW5kaW5nKCkpIHsKLQkJCS8vIGVuZCBsb2NrIGJlZm9yZSBub3RpY2lhdGlvbiBsb29wLCBzaW5jZSBkaXJlY3RseSBvciBpbmRpcmVjdGx5Ci0JCQkvLyB3ZSBtYXkgYmUgImNhbGxlZCBmcm9tIGZvcmllZ24gY29kZSIgZHVyaW5nIG5vdGlmaWNhdGlvbi4KLQkJCWVuZExvY2soKTsKLQkJCS8vIHdlIG51bGwgb3V0IGhlcmUgdG8gYXZvaWQgc3B1cmlvdXMid2FybmluZyIgbWVzc2FnZSB3aGlsZSBkZWJ1ZwotCQkJLy8gdHJhY2luZyBpcyBlbmFibGVkCi0JCQlmTG9ja09iamVjdCA9IG51bGw7Ci0JCQkvLyB0aGUgbm90aWZpZXIgaXMgd2hhdCBjb250cm9scyBhZGFwZXIgbm90aWZpY2F0aW9uLCB3aGljaAotCQkJLy8gc2hvdWxkIGJlIHNlbnQgb3V0IGJlZm9yZSB0aGUgJ21vZGVsQ2hhbmdlZCcgZXZlbnQuCi0JCQlnZXRNb2RlbE5vdGlmaWVyKCkuZW5kQ2hhbmdpbmcoKTsKLQkJfQotCQkvLyBjaGFuZ2VkTW9kZWwgaGFuZGxlcyAnbmVzdGluZycsIHNvIG9ubHkgb25lIGV2ZW50IHNlbnQgb3V0Ci0JCS8vIHdoZW4gbXVsaXRwbGUgY2FsbHMgdG8gJ2Fib3V0VG9DaGFuZ2UvQ2hhbmdlZCcuCi0JCXN1cGVyLmNoYW5nZWRNb2RlbCgpOwotCQloYW5kbGVSZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogY2hpbGRSZXBsYWNlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBvbGRDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoaWxkUmVwbGFjZWQoTm9kZSBwYXJlbnROb2RlLCBOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKSB7Ci0JCWlmIChwYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRBY3RpdmVQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldE1vZGVsVXBkYXRlcigpOwotCQkJc2V0QWN0aXZlKHVwZGF0ZXIpOwotCQkJdXBkYXRlci5pbml0aWFsaXplKCk7Ci0JCQl1cGRhdGVyLnJlcGxhY2VDaGlsZChwYXJlbnROb2RlLCBuZXdDaGlsZCwgb2xkQ2hpbGQpOwotCQkJc2V0QWN0aXZlKG51bGwpOwotCQl9Ci0JCWdldE1vZGVsTm90aWZpZXIoKS5jaGlsZFJlcGxhY2VkKHBhcmVudE5vZGUsIG5ld0NoaWxkLCBvbGRDaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBYTUwgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG9iamVjdCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUKLQkgKiB3aXRoIGl0cyBkb2N1bWVudCBlbGVtZW50LiBIVE1MLW9ubHkgRE9NIGltcGxlbWVudGF0aW9ucyBkbyBub3QgbmVlZCB0bwotCSAqIGltcGxlbWVudCB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZXNwYWNlVVJJVGhlCi0JICogICAgICAgICAgICBuYW1lc3BhY2UgVVJJIG9mIHRoZSBkb2N1bWVudCBlbGVtZW50IHRvIGNyZWF0ZS4KLQkgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZVRoZQotCSAqICAgICAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGRvY3VtZW50IGVsZW1lbnQgdG8gYmUgY3JlYXRlZC4KLQkgKiBAcGFyYW0gZG9jdHlwZVRoZQotCSAqICAgICAgICAgICAgdHlwZSBvZiBkb2N1bWVudCB0byBiZSBjcmVhdGVkIG9yIDxjb2RlPm51bGw8L2NvZGU+LiBXaGVuCi0JICogICAgICAgICAgICA8Y29kZT5kb2N0eXBlPC9jb2RlPiBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4sIGl0cwotCSAqICAgICAgICAgICAgPGNvZGU+Tm9kZS5vd25lckRvY3VtZW50PC9jb2RlPiBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRoZQotCSAqICAgICAgICAgICAgZG9jdW1lbnQgYmVpbmcgY3JlYXRlZC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkRvY3VtZW50PC9jb2RlPiBvYmplY3QuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0NIQVJBQ1RFUl9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHF1YWxpZmllZAotCSAqICAgICAgICAgICAgICAgIG5hbWUgY29udGFpbnMgYW4gaWxsZWdhbCBjaGFyYWN0ZXIuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOQU1FU1BBQ0VfRVJSOiBSYWlzZWQgaWYgdGhlIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+Ci0JICogICAgICAgICAgICAgICAgaXMgbWFsZm9ybWVkLCBpZiB0aGUgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4gaGFzIGEKLQkgKiAgICAgICAgICAgICAgICBwcmVmaXggYW5kIHRoZSA8Y29kZT5uYW1lc3BhY2VVUkk8L2NvZGU+IGlzCi0JICogICAgICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4sIG9yIGlmIHRoZQotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+IGhhcyBhIHByZWZpeCB0aGF0IGlzICJ4bWwiCi0JICogICAgICAgICAgICAgICAgYW5kIHRoZSA8Y29kZT5uYW1lc3BhY2VVUkk8L2NvZGU+IGlzIGRpZmZlcmVudCBmcm9tICIKLQkgKiAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiIC48YnI+Ci0JICogICAgICAgICAgICAgICAgV1JPTkdfRE9DVU1FTlRfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZG9jdHlwZTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIHVzZWQgd2l0aCBhIGRpZmZlcmVudCBkb2N1bWVudCBvciB3YXMKLQkgKiAgICAgICAgICAgICAgICBjcmVhdGVkIGZyb20gYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uCi0JICogQHNlZSBET00gTGV2ZWwgMgotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBjcmVhdGVEb2N1bWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSwgRG9jdW1lbnRUeXBlIGRvY3R5cGUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVtcHR5IDxjb2RlPkRvY3VtZW50VHlwZTwvY29kZT4gbm9kZS4gRW50aXR5IGRlY2xhcmF0aW9ucwotCSAqIGFuZCBub3RhdGlvbnMgYXJlIG5vdCBtYWRlIGF2YWlsYWJsZS4gRW50aXR5IHJlZmVyZW5jZSBleHBhbnNpb25zIGFuZAotCSAqIGRlZmF1bHQgYXR0cmlidXRlIGFkZGl0aW9ucyBkbyBub3Qgb2NjdXIuIEl0IGlzIGV4cGVjdGVkIHRoYXQgYSBmdXR1cmUKLQkgKiB2ZXJzaW9uIG9mIHRoZSBET00gd2lsbCBwcm92aWRlIGEgd2F5IGZvciBwb3B1bGF0aW5nIGEKLQkgKiA8Y29kZT5Eb2N1bWVudFR5cGU8L2NvZGU+Ljxicj4KLQkgKiBIVE1MLW9ubHkgRE9NIGltcGxlbWVudGF0aW9ucyBkbyBub3QgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIHF1YWxpZmllZE5hbWVUaGUKLQkgKiAgICAgICAgICAgIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBkb2N1bWVudCB0eXBlIHRvIGJlIGNyZWF0ZWQuCi0JICogQHBhcmFtIHB1YmxpY0lkVGhlCi0JICogICAgICAgICAgICBleHRlcm5hbCBzdWJzZXQgcHVibGljIGlkZW50aWZpZXIuCi0JICogQHBhcmFtIHN5c3RlbUlkVGhlCi0JICogICAgICAgICAgICBleHRlcm5hbCBzdWJzZXQgc3lzdGVtIGlkZW50aWZpZXIuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Eb2N1bWVudFR5cGU8L2NvZGU+IG5vZGUgd2l0aAotCSAqICAgICAgICAgPGNvZGU+Tm9kZS5vd25lckRvY3VtZW50PC9jb2RlPiBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0NIQVJBQ1RFUl9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHF1YWxpZmllZAotCSAqICAgICAgICAgICAgICAgIG5hbWUgY29udGFpbnMgYW4gaWxsZWdhbCBjaGFyYWN0ZXIuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOQU1FU1BBQ0VfRVJSOiBSYWlzZWQgaWYgdGhlIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+Ci0JICogICAgICAgICAgICAgICAgaXMgbWFsZm9ybWVkLgotCSAqIEBzZWUgRE9NIExldmVsIDIKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRUeXBlIGNyZWF0ZURvY3VtZW50VHlwZShTdHJpbmcgcXVhbGlmaWVkTmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlEb2N1bWVudFR5cGVJbXBsIGRvY3VtZW50VHlwZSA9IG5ldyBEb2N1bWVudFR5cGVJbXBsKCk7Ci0JCWRvY3VtZW50VHlwZS5zZXROYW1lKHF1YWxpZmllZE5hbWUpOwotCQlkb2N1bWVudFR5cGUuc2V0UHVibGljSWQocHVibGljSWQpOwotCQlkb2N1bWVudFR5cGUuc2V0U3lzdGVtSWQoc3lzdGVtSWQpOwotCQlyZXR1cm4gZG9jdW1lbnRUeXBlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvY3VtZW50VHlwZUNoYW5nZWQoKSB7Ci0JCWlmICh0aGlzLnJlZnJlc2gpCi0JCQlyZXR1cm47Ci0JCS8vIHVubGlrZSAncmVzZnJlc2gnLCAncmVpbml0aWFsaXplJyBmaW5pc2hlcyBsb29wCi0JCS8vIGFuZCBmbHVzaGVzIHJlbWFpbmluZyBub3RpZmljYXRpb24gcXVlIGJlZm9yZQotCQkvLyBhY3R1YWxseSByZWluaXRpYWxpemluZy4KLQkJLy8gSVNTVUU6IHNob3VsZCByZWluaXQgYmUgdXNlZCBpbnN0ZWFkIG9mIGhhbmRsZXJlZnJlc2g/Ci0JCS8vIHRoaXMuc2V0UmVpbml0aWFsaXplTmVlZGVkKHRydWUpOwotCQlpZiAodGhpcy5hY3RpdmUgIT0gbnVsbCB8fCBnZXRNb2RlbE5vdGlmaWVyKCkuaXNDaGFuZ2luZygpKQotCQkJcmV0dXJuOyAvLyBkZWZlcgotCQloYW5kbGVSZWZyZXNoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZWRpdGFibGVDaGFuZ2VkKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlnZXRNb2RlbE5vdGlmaWVyKCkuZWRpdGFibGVDaGFuZ2VkKG5vZGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5kVGFnQ2hhbmdlZChFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldEFjdGl2ZVBhcnNlcigpID09IG51bGwpIHsKLQkJCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0TW9kZWxVcGRhdGVyKCk7Ci0JCQlzZXRBY3RpdmUodXBkYXRlcik7Ci0JCQl1cGRhdGVyLmluaXRpYWxpemUoKTsKLQkJCXVwZGF0ZXIuY2hhbmdlRW5kVGFnKGVsZW1lbnQpOwotCQkJc2V0QWN0aXZlKG51bGwpOwotCQl9Ci0JCWdldE1vZGVsTm90aWZpZXIoKS5lbmRUYWdDaGFuZ2VkKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgWE1MTW9kZWxQYXJzZXIgZ2V0QWN0aXZlUGFyc2VyKCkgewotCQlpZiAodGhpcy5wYXJzZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5wYXJzZXIgIT0gdGhpcy5hY3RpdmUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHRoaXMucGFyc2VyOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgWE1MTW9kZWxVcGRhdGVyIGdldEFjdGl2ZVVwZGF0ZXIoKSB7Ci0JCWlmICh0aGlzLnVwZGF0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy51cGRhdGVyICE9IHRoaXMuYWN0aXZlKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB0aGlzLnVwZGF0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoRG9jdW1lbnQuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQotCQkJcmV0dXJuIGdldERvY3VtZW50KCk7Ci0JCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIGdldERvY3VtZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gWE1MRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSURPTURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gdGhpcy5kb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSVNvdXJjZUdlbmVyYXRvciBnZXRHZW5lcmF0b3IoKSB7Ci0JCWlmICh0aGlzLmdlbmVyYXRvciA9PSBudWxsKSB7Ci0JCQl0aGlzLmdlbmVyYXRvciA9IFhNTEdlbmVyYXRvckltcGwuZ2V0SW5zdGFuY2UoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZW5lcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgSW5kZXhlZFJlZ2lvbiBnZXRJbmRleGVkUmVnaW9uKGludCBvZmZzZXQpIHsKLQkJaWYgKHRoaXMuZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBzZWFyY2ggaW4gZG9jdW1lbnQgY2hpbGRyZW4KLQkJSURPTU5vZGUgcGFyZW50ID0gbnVsbDsKLQkJaW50IGxlbmd0aCA9IHRoaXMuZG9jdW1lbnQuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChvZmZzZXQgKiAyIDwgbGVuZ3RoKSB7Ci0JCQkvLyBzZWFyY2ggZnJvbSB0aGUgZmlyc3QKLQkJCUlET01Ob2RlIGNoaWxkID0gKElET01Ob2RlKSB0aGlzLmRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNoaWxkLmdldEVuZE9mZnNldCgpIDw9IG9mZnNldCkgewotCQkJCQljaGlsZCA9IChJRE9NTm9kZSkgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChjaGlsZC5nZXRTdGFydE9mZnNldCgpID4gb2Zmc2V0KSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gY2hpbGQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCkgPiBvZmZzZXQpCi0JCQkJCQlyZXR1cm4gY2hpbGQ7Ci0JCQkJfQotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gY2hpbGQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSA8PSBvZmZzZXQpCi0JCQkJCQlyZXR1cm4gY2hpbGQ7Ci0JCQkJfQotCQkJCS8vIGRpZyBtb3JlCi0JCQkJcGFyZW50ID0gY2hpbGQ7Ci0JCQkJY2hpbGQgPSAoSURPTU5vZGUpIHBhcmVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBzZWFyY2ggZnJvbSB0aGUgbGFzdAotCQkJSURPTU5vZGUgY2hpbGQgPSAoSURPTU5vZGUpIHRoaXMuZG9jdW1lbnQuZ2V0TGFzdENoaWxkKCk7Ci0JCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJCWlmIChjaGlsZC5nZXRTdGFydE9mZnNldCgpID4gb2Zmc2V0KSB7Ci0JCQkJCWNoaWxkID0gKElET01Ob2RlKSBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChjaGlsZC5nZXRFbmRPZmZzZXQoKSA8PSBvZmZzZXQpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBjaGlsZC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKSA+IG9mZnNldCkKLQkJCQkJCXJldHVybiBjaGlsZDsKLQkJCQl9Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBjaGlsZC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpIDw9IG9mZnNldCkKLQkJCQkJCXJldHVybiBjaGlsZDsKLQkJCQl9Ci0JCQkJLy8gZGlnIG1vcmUKLQkJCQlwYXJlbnQgPSBjaGlsZDsKLQkJCQljaGlsZCA9IChJRE9NTm9kZSkgcGFyZW50LmdldExhc3RDaGlsZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFhNTE1vZGVsTm90aWZpZXIgZ2V0TW9kZWxOb3RpZmllcigpIHsKLQkJaWYgKHRoaXMubm90aWZpZXIgPT0gbnVsbCkgewotCQkJdGhpcy5ub3RpZmllciA9IG5ldyBYTUxNb2RlbE5vdGlmaWVySW1wbCgpOwotCQl9Ci0JCXJldHVybiB0aGlzLm5vdGlmaWVyOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgWE1MTW9kZWxQYXJzZXIgZ2V0TW9kZWxQYXJzZXIoKSB7Ci0JCWlmICh0aGlzLnBhcnNlciA9PSBudWxsKSB7Ci0JCQl0aGlzLnBhcnNlciA9IGNyZWF0ZU1vZGVsUGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucGFyc2VyOwotCX0KLQotCXByb3RlY3RlZCBYTUxNb2RlbFBhcnNlciBjcmVhdGVNb2RlbFBhcnNlcigpIHsKLQkJcmV0dXJuIG5ldyBYTUxNb2RlbFBhcnNlcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFhNTE1vZGVsVXBkYXRlciBnZXRNb2RlbFVwZGF0ZXIoKSB7Ci0JCWlmICh0aGlzLnVwZGF0ZXIgPT0gbnVsbCkgewotCQkJdGhpcy51cGRhdGVyID0gY3JlYXRlTW9kZWxVcGRhdGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMudXBkYXRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MTW9kZWxVcGRhdGVyIGNyZWF0ZU1vZGVsVXBkYXRlcigpIHsKLQkJcmV0dXJuIG5ldyBYTUxNb2RlbFVwZGF0ZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVJlZnJlc2goKSB7Ci0JCWlmICghdGhpcy5yZWZyZXNoKQotCQkJcmV0dXJuOwotCQlYTUxNb2RlbE5vdGlmaWVyIG5vdGlmaWVyID0gZ2V0TW9kZWxOb3RpZmllcigpOwotCQlib29sZWFuIGlzQ2hhbmdpbmcgPSBub3RpZmllci5pc0NoYW5naW5nKCk7Ci0JCWlmICghaXNDaGFuZ2luZykKLQkJCW5vdGlmaWVyLmJlZ2luQ2hhbmdpbmcodHJ1ZSk7Ci0JCVhNTE1vZGVsUGFyc2VyIHBhcnNlciA9IGdldE1vZGVsUGFyc2VyKCk7Ci0JCXNldEFjdGl2ZShwYXJzZXIpOwotCQl0aGlzLmRvY3VtZW50LnJlbW92ZUNoaWxkTm9kZXMoKTsKLQkJdHJ5IHsKLQkJCXBhcnNlci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25MaXN0KCksIG51bGwpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJaWYgKCFpc0NoYW5naW5nKQotCQkJCW5vdGlmaWVyLmVuZENoYW5naW5nKCk7Ci0JCQl0aGlzLnJlZnJlc2ggPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRlc3QgaWYgdGhlIERPTSBpbXBsZW1lbnRhdGlvbiBpbXBsZW1lbnRzIGEgc3BlY2lmaWMgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZVRoZQotCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgZmVhdHVyZSB0byB0ZXN0IChjYXNlLWluc2Vuc2l0aXZlKS4gVGhlIHZhbHVlcwotCSAqICAgICAgICAgICAgdXNlZCBieSBET00gZmVhdHVyZXMgYXJlIGRlZmluZWQgdGhyb3VnaG91dCB0aGUgRE9NIExldmVsIDIKLQkgKiAgICAgICAgICAgIHNwZWNpZmljYXRpb25zIGFuZCBsaXN0ZWQgaW4gdGhlIHNlY3Rpb24uIFRoZSBuYW1lIG11c3QgYmUKLQkgKiAgICAgICAgICAgIGFuIFhNTCBuYW1lLiBUbyBhdm9pZCBwb3NzaWJsZSBjb25mbGljdHMsIGFzIGEgY29udmVudGlvbiwKLQkgKiAgICAgICAgICAgIG5hbWVzIHJlZmVycmluZyB0byBmZWF0dXJlcyBkZWZpbmVkIG91dHNpZGUgdGhlIERPTQotCSAqICAgICAgICAgICAgc3BlY2lmaWNhdGlvbiBzaG91bGQgYmUgbWFkZSB1bmlxdWUgYnkgcmV2ZXJzaW5nIHRoZSBuYW1lIG9mCi0JICogICAgICAgICAgICB0aGUgSW50ZXJuZXQgZG9tYWluIG5hbWUgb2YgdGhlIHBlcnNvbiAob3IgdGhlIG9yZ2FuaXphdGlvbgotCSAqICAgICAgICAgICAgdGhhdCB0aGUgcGVyc29uIGJlbG9uZ3MgdG8pIHdobyBkZWZpbmVzIHRoZSBmZWF0dXJlLAotCSAqICAgICAgICAgICAgY29tcG9uZW50IGJ5IGNvbXBvbmVudCwgYW5kIHVzaW5nIHRoaXMgYXMgYSBwcmVmaXguIEZvcgotCSAqICAgICAgICAgICAgaW5zdGFuY2UsIHRoZSBXM0MgU1ZHIFdvcmtpbmcgR3JvdXAgZGVmaW5lcyB0aGUgZmVhdHVyZQotCSAqICAgICAgICAgICAgIm9yZy53M2MuZG9tLnN2ZyIuCi0JICogQHBhcmFtIHZlcnNpb25UaGlzCi0JICogICAgICAgICAgICBpcyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGZlYXR1cmUgdG8gdGVzdC4gSW4gTGV2ZWwgMiwKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgY2FuIGJlIGVpdGhlciAiMi4wIiBvciAiMS4wIi4gSWYgdGhlIHZlcnNpb24gaXMKLQkgKiAgICAgICAgICAgIG5vdCBzcGVjaWZpZWQsIHN1cHBvcnRpbmcgYW55IHZlcnNpb24gb2YgdGhlIGZlYXR1cmUgY2F1c2VzCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIHRvIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmZWF0dXJlIGlzIGltcGxlbWVudGVkIGluIHRoZQotCSAqICAgICAgICAgc3BlY2lmaWVkIHZlcnNpb24sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHZlcnNpb24gIT0gbnVsbCkgewotCQkJaWYgKCF2ZXJzaW9uLmVxdWFscygiMS4wIikgJiYgIXZlcnNpb24uZXF1YWxzKCIyLjAiKSkgeyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlpZiAoZmVhdHVyZS5lcXVhbHNJZ25vcmVDYXNlKCJDb3JlIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOyAvLyROT04tTkxTLTEkCi0JCWlmIChmZWF0dXJlLmVxdWFsc0lnbm9yZUNhc2UoIlhNTCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdHJ1ZTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlRG9jdW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudCBpbnRlcm5hbENyZWF0ZURvY3VtZW50KCkgewotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnRJbXBsKCk7Ci0JCWRvY3VtZW50LnNldE1vZGVsKHRoaXMpOwotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JYm9vbGVhbiBpc1JlcGFyc2luZygpIHsKLQkJcmV0dXJuIChhY3RpdmUgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogbmFtZUNoYW5nZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBuYW1lQ2hhbmdlZChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldEFjdGl2ZVBhcnNlcigpID09IG51bGwpIHsKLQkJCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0TW9kZWxVcGRhdGVyKCk7Ci0JCQlzZXRBY3RpdmUodXBkYXRlcik7Ci0JCQl1cGRhdGVyLmluaXRpYWxpemUoKTsKLQkJCXVwZGF0ZXIuY2hhbmdlTmFtZShub2RlKTsKLQkJCXNldEFjdGl2ZShudWxsKTsKLQkJfQotCQkvLyBub3RpZmljYXRpb24gaXMgYWxyZWFkeSBzZW50Ci0JfQotCi0JLyoqCi0JICogbmV3TW9kZWwgbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgbmV3TW9kZWwoTmV3RG9jdW1lbnRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLCBidXQgZm9yIHRoZSBjYXNlCi0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwgJiYgZlN0cnVjdHVyZWREb2N1bWVudCAhPSBzdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoc3RydWN0dXJlZERvY3VtZW50KTsKLQotCQlpbnRlcm5hbFNldE5ld0RvY3VtZW50KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsU2V0TmV3RG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBmbGF0Tm9kZXMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uTGlzdCgpOwotCQlpZiAoKGZsYXROb2RlcyA9PSBudWxsKSB8fCAoZmxhdE5vZGVzLmdldExlbmd0aCgpID09IDApKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRoaXMuZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYmVpbmcgY29uc3RydWN0ZWQKLQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRBY3RpdmVVcGRhdGVyKCk7Ci0JCWlmICh1cGRhdGVyICE9IG51bGwpIHsgLy8gYmVpbmcgdXBkYXRlZAotCQkJdHJ5IHsKLQkJCQl1cGRhdGVyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKGZsYXROb2RlcywgbnVsbCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQkJdGhpcy5yZWZyZXNoID0gdHJ1ZTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQl9Ci0JCQkvLyAvLyBmb3IgbmV3IG1vZGVsLCB3ZSBtaWdodCBuZWVkIHRvCi0JCQkvLyAvLyByZS1pbml0LCBlLmcuIGlmIHNvbWVvbmUgY2FsbHMgc2V0VGV4dAotCQkJLy8gLy8gb24gYW4gZXhpc3RpbmcgbW9kZWwKLQkJCS8vIGNoZWNrRm9yUmVpbml0KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJWE1MTW9kZWxOb3RpZmllciBub3RpZmllciA9IGdldE1vZGVsTm90aWZpZXIoKTsKLQkJYm9vbGVhbiBpc0NoYW5naW5nID0gbm90aWZpZXIuaXNDaGFuZ2luZygpOwotCQkvLyBjYWxsIGV2ZW4gaWYgY2hhbmdpbmcgdG8gbm90aWZ5IGRvaW5nIG5ldyBtb2RlbAotCQlnZXRNb2RlbE5vdGlmaWVyKCkuYmVnaW5DaGFuZ2luZyh0cnVlKTsKLQkJWE1MTW9kZWxQYXJzZXIgcGFyc2VyID0gZ2V0TW9kZWxQYXJzZXIoKTsKLQkJc2V0QWN0aXZlKHBhcnNlcik7Ci0JCXRoaXMuZG9jdW1lbnQucmVtb3ZlQ2hpbGROb2RlcygpOwotCQl0cnkgewotCQkJcGFyc2VyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKGZsYXROb2RlcywgbnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQkvLyBtZWFuaW5nbGVzcyB0byByZWZyZXNoLCBiZWNhdXNlIHRoZSByZXN1bHQgbWlnaHQgYmUgdGhlIHNhbWUKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXNldEFjdGl2ZShudWxsKTsKLQkJCWlmICghaXNDaGFuZ2luZykgewotCQkJCWdldE1vZGVsTm90aWZpZXIoKS5lbmRDaGFuZ2luZygpOwotCQkJfQotCQkJLy8gaWdub3JlIHJlZnJlc2gKLQkJCXRoaXMucmVmcmVzaCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBldmVudCkgewotCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldEFjdGl2ZVVwZGF0ZXIoKTsKLQkJaWYgKHVwZGF0ZXIgIT0gbnVsbCkgeyAvLyBiZWluZyB1cGRhdGVkCi0JCQkvLyBjbGVhbnVwIHVwZGF0ZXIgc3RhZmZzCi0JCQl0cnkgewotCQkJCXVwZGF0ZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMobnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQkJdGhpcy5yZWZyZXNoID0gdHJ1ZTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQl9Ci0JCQkvLyBJIGd1ZXNzIG5vIGNoYW5hZ2UgbWVhbnMgdGhlIG1vZGVsIGNvdWxkIG5vdCBuZWVkIHJlLWluaXQKLQkJCS8vIGNoZWNrRm9yUmVpbml0KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBub2Rlc1JlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPSBldmVudC5nZXRPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPSBldmVudC5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0QWN0aXZlVXBkYXRlcigpOwotCQlpZiAodXBkYXRlciAhPSBudWxsKSB7IC8vIGJlaW5nIHVwZGF0ZWQKLQkJCXRyeSB7Ci0JCQkJdXBkYXRlci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlpZiAoZXguZ2V0Q2xhc3MoKS5lcXVhbHMoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbi5jbGFzcykpIHsKLQkJCQkJTG9nZ2VyLnRyYWNlRXhjZXB0aW9uKFRSQUNFX1BBUlNFUl9NQU5BR0VNRU5UX0VYQ0VQVElPTiwgZXgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQkJfQotCQkJCXRoaXMucmVmcmVzaCA9IHRydWU7Ci0JCQkJaGFuZGxlUmVmcmVzaCgpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJfQotCQkJLy8gY2hlY2tGb3JSZWluaXQoKTsKLQkJCXJldHVybjsKLQkJfQotCQlYTUxNb2RlbE5vdGlmaWVyIG5vdGlmaWVyID0gZ2V0TW9kZWxOb3RpZmllcigpOwotCQlib29sZWFuIGlzQ2hhbmdpbmcgPSBub3RpZmllci5pc0NoYW5naW5nKCk7Ci0JCWlmICghaXNDaGFuZ2luZykKLQkJCW5vdGlmaWVyLmJlZ2luQ2hhbmdpbmcoKTsKLQkJWE1MTW9kZWxQYXJzZXIgcGFyc2VyID0gZ2V0TW9kZWxQYXJzZXIoKTsKLQkJc2V0QWN0aXZlKHBhcnNlcik7Ci0JCXRyeSB7Ci0JCQlwYXJzZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJaGFuZGxlUmVmcmVzaCgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJaWYgKCFpc0NoYW5naW5nKSB7Ci0JCQkJbm90aWZpZXIuZW5kQ2hhbmdpbmcoKTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHJlZ2lvbkNoYW5nZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBldmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGV2ZW50LmdldFJlZ2lvbigpOwotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0QWN0aXZlVXBkYXRlcigpOwotCQlpZiAodXBkYXRlciAhPSBudWxsKSB7IC8vIGJlaW5nIHVwZGF0ZWQKLQkJCXRyeSB7Ci0JCQkJdXBkYXRlci5jaGFuZ2VSZWdpb24oZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQkJdGhpcy5yZWZyZXNoID0gdHJ1ZTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQl9Ci0JCQkvLyBjaGVja0ZvclJlaW5pdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBnZXRNb2RlbE5vdGlmaWVyKCk7Ci0JCWJvb2xlYW4gaXNDaGFuZ2luZyA9IG5vdGlmaWVyLmlzQ2hhbmdpbmcoKTsKLQkJaWYgKCFpc0NoYW5naW5nKQotCQkJbm90aWZpZXIuYmVnaW5DaGFuZ2luZygpOwotCQlYTUxNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRNb2RlbFBhcnNlcigpOwotCQlzZXRBY3RpdmUocGFyc2VyKTsKLQkJdHJ5IHsKLQkJCXBhcnNlci5jaGFuZ2VSZWdpb24oZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJaGFuZGxlUmVmcmVzaCgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJaWYgKCFpc0NoYW5naW5nKSB7Ci0JCQkJbm90aWZpZXIuZW5kQ2hhbmdpbmcoKTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQkJLy8gY2hlY2tGb3JSZWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiByZWdpb25zUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVnaW9uc1JlcGxhY2VkKFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucyA9IGV2ZW50LmdldE9sZFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMgPSBldmVudC5nZXROZXdSZWdpb25zKCk7Ci0JCWlmIChvbGRSZWdpb25zID09IG51bGwgJiYgbmV3UmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldEFjdGl2ZVVwZGF0ZXIoKTsKLQkJaWYgKHVwZGF0ZXIgIT0gbnVsbCkgeyAvLyBiZWluZyB1cGRhdGVkCi0JCQl0cnkgewotCQkJCXVwZGF0ZXIucmVwbGFjZVJlZ2lvbnMoZmxhdE5vZGUsIG5ld1JlZ2lvbnMsIG9sZFJlZ2lvbnMpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJCXRoaXMucmVmcmVzaCA9IHRydWU7Ci0JCQkJaGFuZGxlUmVmcmVzaCgpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJfQotCQkJLy8gY2hlY2tGb3JSZWluaXQoKTsKLQkJCXJldHVybjsKLQkJfQotCQlYTUxNb2RlbE5vdGlmaWVyIG5vdGlmaWVyID0gZ2V0TW9kZWxOb3RpZmllcigpOwotCQlib29sZWFuIGlzQ2hhbmdpbmcgPSBub3RpZmllci5pc0NoYW5naW5nKCk7Ci0JCWlmICghaXNDaGFuZ2luZykKLQkJCW5vdGlmaWVyLmJlZ2luQ2hhbmdpbmcoKTsKLQkJWE1MTW9kZWxQYXJzZXIgcGFyc2VyID0gZ2V0TW9kZWxQYXJzZXIoKTsKLQkJc2V0QWN0aXZlKHBhcnNlcik7Ci0JCXRyeSB7Ci0JCQlwYXJzZXIucmVwbGFjZVJlZ2lvbnMoZmxhdE5vZGUsIG5ld1JlZ2lvbnMsIG9sZFJlZ2lvbnMpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJdGhpcy5yZWZyZXNoID0gdHJ1ZTsKLQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXNldEFjdGl2ZShudWxsKTsKLQkJCWlmICghaXNDaGFuZ2luZykgewotCQkJCW5vdGlmaWVyLmVuZENoYW5naW5nKCk7Ci0JCQkJaGFuZGxlUmVmcmVzaCgpOwotCQkJfQotCQl9Ci0JCS8vIGNoZWNrRm9yUmVpbml0KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21FZGl0KCkgewotCQlpZiAoIWlzU2hhcmVkKCkpIHsKLQkJCS8vIHRoaXMuZG9jdW1lbnQucmVsZWFzZVN0eWxlU2hlZXRzKCk7Ci0JCQkvLyB0aGlzLmRvY3VtZW50LnJlbGVhc2VEb2N1bWVudFR5cGUoKTsKLQkJfQotCQlzdXBlci5yZWxlYXNlRnJvbUVkaXQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVJlYWQoKSB7Ci0JCWlmICghaXNTaGFyZWQoKSkgewotCQkJLy8gdGhpcy5kb2N1bWVudC5yZWxlYXNlU3R5bGVTaGVldHMoKTsKLQkJCS8vIHRoaXMuZG9jdW1lbnQucmVsZWFzZURvY3VtZW50VHlwZSgpOwotCQl9Ci0JCXN1cGVyLnJlbGVhc2VGcm9tUmVhZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRBY3RpdmUoT2JqZWN0IGFjdGl2ZSkgewotCQl0aGlzLmFjdGl2ZSA9IGFjdGl2ZTsKLQkJLy8gc2lkZSBlZmZlY3QKLQkJLy8gd2hlbiBldmVyIGJlY29tZXMgYWN0aXZlLCBiZXN1cmUgdGFnTmFtZUNhY2hlIGlzIGNsZWFyZWQKLQkJLy8gKGFuZCBub3QgdXNlZCkKLQkJaWYgKGFjdGl2ZSA9PSBudWxsKSB7Ci0JCQlkb2N1bWVudC5hY3RpdmF0ZVRhZ05hbWVDYWNoZSh0cnVlKTsKLQkJfQotCQllbHNlIHsKLQkJCWRvY3VtZW50LmFjdGl2YXRlVGFnTmFtZUNhY2hlKGZhbHNlKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdG9yKElTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yKSB7Ci0JCXRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsTm90aWZpZXIoWE1MTW9kZWxOb3RpZmllciBub3RpZmllcikgewotCQl0aGlzLm5vdGlmaWVyID0gbm90aWZpZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWxQYXJzZXIoWE1MTW9kZWxQYXJzZXIgcGFyc2VyKSB7Ci0JCXRoaXMucGFyc2VyID0gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsVXBkYXRlcihYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlcikgewotCQl0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyOwotCX0KLQotCS8qKgotCSAqIHNldFN0cnVjdHVyZWREb2N1bWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgb2xkU3RydWN0dXJlZERvY3VtZW50ID0gc3VwZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50KQotCQkJcmV0dXJuOyAvLyBub3RoaW5nIHRvIGRvCi0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkKLQkJCW9sZFN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudENoYW5naW5nTGlzdGVuZXIodGhpcyk7Ci0JCXN1cGVyLnNldFN0cnVjdHVyZWREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCWludGVybmFsU2V0TmV3RG9jdW1lbnQoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5naW5nTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdGFydFRhZ0NoYW5nZWQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRBY3RpdmVQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldE1vZGVsVXBkYXRlcigpOwotCQkJc2V0QWN0aXZlKHVwZGF0ZXIpOwotCQkJdXBkYXRlci5pbml0aWFsaXplKCk7Ci0JCQl1cGRhdGVyLmNoYW5nZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJc2V0QWN0aXZlKG51bGwpOwotCQl9Ci0JCWdldE1vZGVsTm90aWZpZXIoKS5zdGFydFRhZ0NoYW5nZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogdmFsdWVDaGFuZ2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0QWN0aXZlUGFyc2VyKCkgPT0gbnVsbCkgewotCQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRNb2RlbFVwZGF0ZXIoKTsKLQkJCXNldEFjdGl2ZSh1cGRhdGVyKTsKLQkJCXVwZGF0ZXIuaW5pdGlhbGl6ZSgpOwotCQkJdXBkYXRlci5jaGFuZ2VWYWx1ZShub2RlKTsKLQkJCXNldEFjdGl2ZShudWxsKTsKLQkJfQotCQlnZXRNb2RlbE5vdGlmaWVyKCkudmFsdWVDaGFuZ2VkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSAzLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEZyYWdtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEZyYWdtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGU4ODJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRGcmFnbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLQotLyoqCi0gKiBEb2N1bWVudEZyYWdtZW50SW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRGcmFnbWVudEltcGwgZXh0ZW5kcyBOb2RlQ29udGFpbmVyIGltcGxlbWVudHMgRG9jdW1lbnRGcmFnbWVudCB7Ci0KLQkvKioKLQkgKiBEb2N1bWVudEZyYWdtZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudEZyYWdtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBEb2N1bWVudEZyYWdtZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBEb2N1bWVudEZyYWdtZW50SW1wbAotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudEZyYWdtZW50SW1wbChEb2N1bWVudEZyYWdtZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJRG9jdW1lbnRGcmFnbWVudEltcGwgY2xvbmVkID0gbmV3IERvY3VtZW50RnJhZ21lbnRJbXBsKHRoaXMpOwotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCQkKLQkJbm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsIGNsb25lZCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuICIjZG9jdW1lbnQtZnJhZ21lbnQiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gRE9DVU1FTlRfRlJBR01FTlRfTk9ERTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M4NjJkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKiAgICAgQmFsYXpzIEJhbmZhaTogQnVnIDE1NDczNyBnZXRVc2VyRGF0YS9zZXRVc2VyRGF0YSBzdXBwb3J0IGZvciBOb2RlCi0gKiAgICAgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDczNwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLS8vIGZvciBvcmcuYXBhY2hlLnhlcmNlcyAzLjIuMQotLy8gaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWxzLlhNTENoYXJhY3RlclByb3BlcnRpZXM7Ci0vLyBETVcgbW9kaWZpZWQgZm9yIFhNTDRKIDQuMC4xCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmRvbS5UcmVlV2Fsa2VySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5pbXBsLkNvbW1lbnRFbGVtZW50UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbnRpdHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JWE1MQ2hhckVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuTmFtZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm90YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLnJhbmdlcy5Eb2N1bWVudFJhbmdlOwotaW1wb3J0IG9yZy53M2MuZG9tLnJhbmdlcy5SYW5nZTsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuRG9jdW1lbnRUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuVHJlZVdhbGtlcjsKLQotCi0vKioKLSAqIERvY3VtZW50SW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRJbXBsIGV4dGVuZHMgTm9kZUNvbnRhaW5lciBpbXBsZW1lbnRzIElET01Eb2N1bWVudCwgRG9jdW1lbnRSYW5nZSwgRG9jdW1lbnRUcmF2ZXJzYWwgewotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IG1heERvY1R5cGVTZWFyY2ggPSA1MDA7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IG5vTWF4U2VhcmNoID0gLTE7Ci0JLyoqCi0JICogSW50ZXJuYWwtdXNlIG9ubHkgY2xhc3MuIFRoaXMgY2xhc3Mgd2FzIGFkZGVkIHRvIGJldHRlciBhYmxlIHRvIGhhbmRsZQotCSAqIHJlcGV0ZXRpdmUgcmVxdWVzdCBmb3IgZ2V0RWxlbWVudHNCeVRhZ05hbWUuIFRoZSBjYWNoZSBpcyBjbGVhcmVkIHdoZW4KLQkgKiBldmVyIHRoZSBkb2N1bWVudCBjaGFuZ2VzIGF0IGFsbCwgc28gc3RpbGwgbm90IHJlYWwgZWZmaWNpZW50LAotCSAqLwotCWNsYXNzIFRhZ05hbWVDYWNoZSB7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGFjdGl2ZSA9IHRydWU7Ci0KLQkJcHJpdmF0ZSBNYXAgY2FjaGU7Ci0KLQkJcHVibGljIFRhZ05hbWVDYWNoZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCQljYWNoZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGIKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFjdGl2YXRlKGJvb2xlYW4gYikgewotCQkJYWN0aXZlID0gYjsKLQkJCWlmICghYikKLQkJCQljbGVhcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkSXRlbShTdHJpbmcgdGFnbmFtZSwgTm9kZUxpc3RJbXBsIG5vZGVsaXN0KSB7Ci0JCQlpZiAodGFnbmFtZSA9PSBudWxsIHx8IG5vZGVsaXN0ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJY2FjaGUucHV0KHRhZ25hbWUsIG5vZGVsaXN0KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkJY2FjaGUuY2xlYXIoKTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlTGlzdEltcGwgZ2V0SXRlbShTdHJpbmcgdGFnTmFtZSkgewotCQkJTm9kZUxpc3RJbXBsIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAoYWN0aXZlKSB7Ci0JCQkJcmVzdWx0ID0gKE5vZGVMaXN0SW1wbCkgY2FjaGUuZ2V0KHRhZ05hbWUpOwotCQkJCS8vIGlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0RWxlbWVudHNCeVRhZ25hbWUgZnJvbSBjYWNoZTogIiArCi0JCQkJLy8gdGFnTmFtZSk7Ci0JCQkJLy8gfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JfQotCi0JLy8gdGhpcyBpcyBhIGNvbnN0YW50IGp1c3QgdG8gZ2l2ZSBjb21waWxlLXRpbWUgY29udHJvbCBvdmVyCi0JLy8gd2hldGhlciBvciBub3QgdG8gdXNlIHRoZSBjYWNoZS4gSWYsIGluIGZ1dHVyZSwgaXRzIGZvdW5kIHRoYXQKLQkvLyB0aGVyZSBhcmUgbm8gKG9yIGZldykgImR1cGxpY2F0ZSByZXF1ZXN0cyIgLi4uIHRoZW4gdGhpcyBjYWNoZQotCS8vIGlzIG5vdCBuZWVkZWQuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiB1c2V0YWduYW1lY2FjaGUgPSB0cnVlOwotCi0JLy8gcHJpdmF0ZSBEb2N1bWVudFR5cGVBZGFwdGVyIGRvY3VtZW50VHlwZUFkYXB0ZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBET01Nb2RlbEltcGwgbW9kZWwgPSBudWxsOwotCXByaXZhdGUgVGFnTmFtZUNhY2hlIHRhZ05hbWVDYWNoZTsKLQotCS8qKgotCSAqIERvY3VtZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICh1c2V0YWduYW1lY2FjaGUpIHsKLQkJCXRhZ05hbWVDYWNoZSA9IG5ldyBUYWdOYW1lQ2FjaGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERvY3VtZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBEb2N1bWVudEltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnRJbXBsKERvY3VtZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCQlpZiAodXNldGFnbmFtZWNhY2hlKSB7Ci0JCQl0YWdOYW1lQ2FjaGUgPSBuZXcgVGFnTmFtZUNhY2hlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYgotCSAqLwotCXZvaWQgYWN0aXZhdGVUYWdOYW1lQ2FjaGUoYm9vbGVhbiBiKSB7Ci0JCXRhZ05hbWVDYWNoZS5hY3RpdmF0ZShiKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQ2hhbmdlcyB0aGUgPGNvZGU+b3duZXJEb2N1bWVudDwvY29kZT4gb2YgYSBub2RlLCBpdHMgY2hpbGRyZW4sIGFzCi0JICogd2VsbCBhcyB0aGUgYXR0YWNoZWQgYXR0cmlidXRlIG5vZGVzIGlmIHRoZXJlIGFyZSBhbnkuIElmIHRoZSBub2RlIGhhcwotCSAqIGEgcGFyZW50IGl0IGlzIGZpcnN0IHJlbW92ZWQgZnJvbSBpdHMgcGFyZW50IGNoaWxkIGxpc3QuIFRoaXMKLQkgKiBlZmZlY3RpdmVseSBhbGxvd3MgbW92aW5nIGEgc3VidHJlZSBmcm9tIG9uZSBkb2N1bWVudCB0byBhbm90aGVyLiBUaGUKLQkgKiBmb2xsb3dpbmcgbGlzdCBkZXNjcmliZXMgdGhlIHNwZWNpZmljcyBmb3IgZWFjaCB0eXBlIG9mIG5vZGUuCi0JICogPGRsPgotCSAqIDxkdD5BVFRSSUJVVEVfTk9ERTwvZHQ+Ci0JICogPGRkPlRoZSA8Y29kZT5vd25lckVsZW1lbnQ8L2NvZGU+IGF0dHJpYnV0ZSBpcyBzZXQgdG8KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBhbmQgdGhlIDxjb2RlPnNwZWNpZmllZDwvY29kZT4gZmxhZyBpcyBzZXQgdG8KLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBvbiB0aGUgYWRvcHRlZCA8Y29kZT5BdHRyPC9jb2RlPi4gVGhlCi0JICogZGVzY2VuZGFudHMgb2YgdGhlIHNvdXJjZSA8Y29kZT5BdHRyPC9jb2RlPiBhcmUgcmVjdXJzaXZlbHkgYWRvcHRlZC4KLQkgKiA8L2RkPgotCSAqIDxkdD5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFPC9kdD4KLQkgKiA8ZGQ+VGhlIGRlc2NlbmRhbnRzIG9mIHRoZSBzb3VyY2Ugbm9kZSBhcmUgcmVjdXJzaXZlbHkgYWRvcHRlZC48L2RkPgotCSAqIDxkdD5ET0NVTUVOVF9OT0RFPC9kdD4KLQkgKiA8ZGQ+PGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG5vZGVzIGNhbm5vdCBiZSBhZG9wdGVkLjwvZGQ+Ci0JICogPGR0PkRPQ1VNRU5UX1RZUEVfTk9ERTwvZHQ+Ci0JICogPGRkPjxjb2RlPkRvY3VtZW50VHlwZTwvY29kZT4gbm9kZXMgY2Fubm90IGJlIGFkb3B0ZWQuPC9kZD4KLQkgKiA8ZHQ+RUxFTUVOVF9OT0RFPC9kdD4KLQkgKiA8ZGQ+U3BlY2lmaWVkIGF0dHJpYnV0ZSBub2RlcyBvZiB0aGUgc291cmNlIGVsZW1lbnQgYXJlIGFkb3B0ZWQsIGFuZAotCSAqIHRoZSBnZW5lcmF0ZWQgPGNvZGU+QXR0cjwvY29kZT4gbm9kZXMuIERlZmF1bHQgYXR0cmlidXRlcyBhcmUKLQkgKiBkaXNjYXJkZWQsIHRob3VnaCBpZiB0aGUgZG9jdW1lbnQgYmVpbmcgYWRvcHRlZCBpbnRvIGRlZmluZXMgZGVmYXVsdAotCSAqIGF0dHJpYnV0ZXMgZm9yIHRoaXMgZWxlbWVudCBuYW1lLCB0aG9zZSBhcmUgYXNzaWduZWQuIFRoZSBkZXNjZW5kYW50cwotCSAqIG9mIHRoZSBzb3VyY2UgZWxlbWVudCBhcmUgcmVjdXJzaXZlbHkgYWRvcHRlZC48L2RkPgotCSAqIDxkdD5FTlRJVFlfTk9ERTwvZHQ+Ci0JICogPGRkPjxjb2RlPkVudGl0eTwvY29kZT4gbm9kZXMgY2Fubm90IGJlIGFkb3B0ZWQuPC9kZD4KLQkgKiA8ZHQ+RU5USVRZX1JFRkVSRU5DRV9OT0RFPC9kdD4KLQkgKiA8ZGQ+T25seSB0aGUgPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPiBub2RlIGl0c2VsZiBpcyBhZG9wdGVkLAotCSAqIHRoZSBkZXNjZW5kYW50cyBhcmUgZGlzY2FyZGVkLCBzaW5jZSB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbgotCSAqIGRvY3VtZW50cyBtaWdodCBoYXZlIGRlZmluZWQgdGhlIGVudGl0eSBkaWZmZXJlbnRseS4gSWYgdGhlIGRvY3VtZW50Ci0JICogYmVpbmcgaW1wb3J0ZWQgaW50byBwcm92aWRlcyBhIGRlZmluaXRpb24gZm9yIHRoaXMgZW50aXR5IG5hbWUsIGl0cwotCSAqIHZhbHVlIGlzIGFzc2lnbmVkLjwvZGQ+Ci0JICogPGR0Pk5PVEFUSU9OX05PREU8L2R0PgotCSAqIDxkZD48Y29kZT5Ob3RhdGlvbjwvY29kZT4gbm9kZXMgY2Fubm90IGJlIGFkb3B0ZWQuPC9kZD4KLQkgKiA8ZHQ+UFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFLCBURVhUX05PREUsIENEQVRBX1NFQ1RJT05fTk9ERSwKLQkgKiBDT01NRU5UX05PREU8L2R0PgotCSAqIDxkZD5UaGVzZSBub2RlcyBjYW4gYWxsIGJlIGFkb3B0ZWQuIE5vIHNwZWNpZmljcy48L2RkPgotCSAqIFNob3VsZCB0aGlzIG1ldGhvZCBzaW1wbHkgcmV0dXJuIG51bGwgd2hlbiBpdCBmYWlscz8gSG93ICJleGNlcHRpb25hbCIKLQkgKiBpcyBmYWlsdXJlIGZvciB0aGlzIG1ldGhvZD9TdGljayB3aXRoIHJhaXNpbmcgZXhjZXB0aW9ucyBvbmx5IGluCi0JICogZXhjZXB0aW9uYWwgY2lyY3Vtc3RhbmNlcywgcmV0dXJuIG51bGwgb24gZmFpbHVyZSAoRjJGIDE5IEp1biAyMDAwKS5DYW4KLQkgKiBhbiBlbnRpdHkgbm9kZSByZWFsbHkgYmUgYWRvcHRlZD9ObywgbmVpdGhlciBjYW4gTm90YXRpb24gbm9kZXMgKFRlbGNvbgotCSAqIDEzIERlYyAyMDAwKS5Eb2VzIHRoaXMgYWZmZWN0IGtleXMgYW5kIGhhc2hDb2RlJ3Mgb2YgdGhlIGFkb3B0ZWQKLQkgKiBzdWJ0cmVlIG5vZGVzP0lmIHNvLCB3aGF0IGFib3V0IHJlYWRvbmx5LW5lc3Mgb2Yga2V5IGFuZCBoYXNoQ29kZT9pZgotCSAqIG5vdCwgd291bGQgYXBwZW5kQ2hpbGQgYWZmZWN0IGtleXMvaGFzaENvZGVzIG9yIHdvdWxkIGl0IGdlbmVyYXRlCi0JICogZXhjZXB0aW9ucyBpZiBrZXkncyBhcmUgZHVwbGljYXRlPyBVcGRhdGU6IEhhc2hjb2RlcyBoYXZlIGJlZW4gZHJvcHBlZC4KLQkgKiBHaXZlbiB0aGF0IHRoZSBrZXkgaXMgb25seSB1bmlxdWUgd2l0aGluIGEgZG9jdW1lbnQgYW4gYWRvcHRlZCBub2RlCi0JICogbmVlZHMgdG8gYmUgZ2l2ZW4gYSBuZXcga2V5LCBidXQgd2hhdCBkb2VzIGl0IG1lYW4gZm9yIHRoZSBhcHBsaWNhdGlvbj8KLQkgKiAKLQkgKiBUT0RPOiBOZWVkcyB0byBub3RpZnkgVXNlckRhdGFIYW5kbGVycyBmb3IgdGhlIG5vZGUgaWYgYW55Ci0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIG5vZGUgdG8gbW92ZSBpbnRvIHRoaXMgZG9jdW1lbnQuCi0JICogQHJldHVybiBUaGUgYWRvcHRlZCBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIG9wZXJhdGlvbgotCSAqICAgICAgICAgZmFpbHMsIHN1Y2ggYXMgd2hlbiB0aGUgc291cmNlIG5vZGUgY29tZXMgZnJvbSBhIGRpZmZlcmVudAotCSAqICAgICAgICAgaW1wbGVtZW50YXRpb24uCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBOT1RfU1VQUE9SVEVEX0VSUjogUmFpc2VkIGlmIHRoZSBzb3VyY2Ugbm9kZSBpcyBvZiB0eXBlCi0JICogICAgICAgICAgICAgICAgPGNvZGU+RE9DVU1FTlQ8L2NvZGU+LDxjb2RlPkRPQ1VNRU5UX1RZUEU8L2NvZGU+LgotCSAqICAgICAgICAgICAgICAgIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCB3aGVuIHRoZSBzb3VyY2Ugbm9kZQotCSAqICAgICAgICAgICAgICAgIGlzIHJlYWRvbmx5LgotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uTm9kZSBhZG9wdE5vZGUob3JnLnczYy5kb20uTm9kZSBzb3VyY2UpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoZWNrVGFnTmFtZVZhbGlkaXR5KFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmICghaXNWYWxpZE5hbWUodGFnTmFtZSkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQ0hBUkFDVEVSX0VSUiwgY3JlYXRlRE9NRXhjZXB0aW9uTWVzc2FnZShET01FeGNlcHRpb24uSU5WQUxJRF9DSEFSQUNURVJfRVJSLCB0YWdOYW1lKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCURvY3VtZW50SW1wbCBjbG9uZWQgPSBuZXcgRG9jdW1lbnRJbXBsKHRoaXMpOwotCQlpZiAoZGVlcCkKLQkJCWNsb25lZC5pbXBvcnRDaGlsZE5vZGVzKHRoaXMsIHRydWUpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUF0dHJpYnV0ZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBBdHRyIGNyZWF0ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCUF0dHJJbXBsIGF0dHIgPSBuZXcgQXR0ckltcGwoKTsKLQkJYXR0ci5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlhdHRyLnNldE5hbWUobmFtZSk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBBdHRyIGNyZWF0ZUF0dHJpYnV0ZU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJQXR0ckltcGwgYXR0ciA9IG5ldyBBdHRySW1wbCgpOwotCQlhdHRyLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWF0dHIuc2V0TmFtZShuYW1lKTsKLQkJYXR0ci5zZXROYW1lc3BhY2VVUkkodXJpKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlQ0RBVEFTZWN0aW9uIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ0RBVEFTZWN0aW9uIGNyZWF0ZUNEQVRBU2VjdGlvbihTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIGFsbG93IENEQVRBIHNlY3Rpb24KLQkJLy8gaWYgKCFpc1hNTFR5cGUoKSkgewotCQkvLyB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgbmV3Ci0JCS8vIFN0cmluZygpKTsKLQkJLy8gfQotCQlDREFUQVNlY3Rpb25JbXBsIGNkYXRhID0gbmV3IENEQVRBU2VjdGlvbkltcGwoKTsKLQkJY2RhdGEuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWNkYXRhLnNldERhdGEoZGF0YSk7Ci0JCXJldHVybiBjZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVDb21tZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uQ29tbWVudAotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENvbW1lbnQgY3JlYXRlQ29tbWVudChTdHJpbmcgZGF0YSkgewotCQlDb21tZW50SW1wbCBjb21tZW50ID0gbmV3IENvbW1lbnRJbXBsKCk7Ci0JCWNvbW1lbnQuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWNvbW1lbnQuc2V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbW1lbnQ7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlQ29tbWVudEVsZW1lbnQoU3RyaW5nIHRhZ05hbWUsIGJvb2xlYW4gaXNKU1BUYWcpIHRocm93cyBET01FeGNlcHRpb24gewotCQlFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0JCWlmICghaXNKU1BUeXBlKCkgJiYgaXNKU1BUYWcpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBjcmVhdGVFbGVtZW50KHRhZ05hbWUpOwotCQllbGVtZW50LnNldEpTUFRhZyhpc0pTUFRhZyk7Ci0JCUNvbW1lbnRFbGVtZW50UmVnaXN0cnkgcmVnaXN0cnkgPSBDb21tZW50RWxlbWVudFJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCWlmIChyZWdpc3RyeS5zZXR1cENvbW1lbnRFbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQlyZXN1bHQgPSBlbGVtZW50OwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9DSEFSQUNURVJfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlRG9jdHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIERvY3VtZW50VHlwZSBjcmVhdGVEb2N0eXBlKFN0cmluZyBuYW1lKSB7Ci0JCURvY3VtZW50VHlwZUltcGwgZG9jVHlwZSA9IG5ldyBEb2N1bWVudFR5cGVJbXBsKCk7Ci0JCWRvY1R5cGUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJZG9jVHlwZS5zZXROYW1lKG5hbWUpOwotCQlyZXR1cm4gZG9jVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVEb2N1bWVudEZyYWdtZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudAotCSAqLwotCXB1YmxpYyBEb2N1bWVudEZyYWdtZW50IGNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSB7Ci0JCURvY3VtZW50RnJhZ21lbnRJbXBsIGZyYWdtZW50ID0gbmV3IERvY3VtZW50RnJhZ21lbnRJbXBsKCk7Ci0JCWZyYWdtZW50LnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCXJldHVybiBmcmFnbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVFbGVtZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChTdHJpbmcgdGFnTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWNoZWNrVGFnTmFtZVZhbGlkaXR5KHRhZ05hbWUpOwotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSBuZXcgRWxlbWVudEltcGwoKTsKLQkJZWxlbWVudC5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQllbGVtZW50LnNldFRhZ05hbWUodGFnTmFtZSk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnROUyhTdHJpbmcgdXJpLCBTdHJpbmcgdGFnTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNWYWxpZE5hbWUodGFnTmFtZSkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQ0hBUkFDVEVSX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0JCWVsZW1lbnQuc2V0TmFtZXNwYWNlVVJJKHVyaSk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUVudGl0eSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVudGl0eQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEVudGl0eSBjcmVhdGVFbnRpdHkoU3RyaW5nIG5hbWUpIHsKLQkJRW50aXR5SW1wbCBlbnRpdHkgPSBuZXcgRW50aXR5SW1wbCgpOwotCQllbnRpdHkuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJZW50aXR5LnNldE5hbWUobmFtZSk7Ci0JCXJldHVybiBlbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlRW50aXR5UmVmZXJlbmNlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgRW50aXR5UmVmZXJlbmNlIGNyZWF0ZUVudGl0eVJlZmVyZW5jZShTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNYTUxUeXBlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJRW50aXR5UmVmZXJlbmNlSW1wbCByZWYgPSBuZXcgRW50aXR5UmVmZXJlbmNlSW1wbCgpOwotCQlyZWYuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJcmVmLnNldE5hbWUobmFtZSk7Ci0JCXJldHVybiByZWY7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIE5vZGVJdGVyYXRvciBjcmVhdGVOb2RlSXRlcmF0b3IoTm9kZSByb290LCBpbnQgd2hhdFRvU2hvdywgTm9kZUZpbHRlciBmaWx0ZXIsIGJvb2xlYW4gZW50aXR5UmVmZXJlbmNlRXhwYW5zaW9uKSB7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyb290ID0gdGhpczsKLQkJcmV0dXJuIG5ldyBOb2RlSXRlcmF0b3JJbXBsKHJvb3QsIHdoYXRUb1Nob3csIGZpbHRlcik7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlTm90YXRpb24gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob3RhdGlvbgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIE5vdGF0aW9uIGNyZWF0ZU5vdGF0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCU5vdGF0aW9uSW1wbCBub3RhdGlvbiA9IG5ldyBOb3RhdGlvbkltcGwoKTsKLQkJbm90YXRpb24uc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJbm90YXRpb24uc2V0TmFtZShuYW1lKTsKLQkJcmV0dXJuIG5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbiBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbgotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBwaSA9IG5ldyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKCk7Ci0JCXBpLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCXBpLnNldFRhcmdldCh0YXJnZXQpOwotCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJcGkuc2V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIHBpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBSYW5nZSBjcmVhdGVSYW5nZSgpIHsKLQkJcmV0dXJuIG5ldyBSYW5nZUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVUZXh0Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLlRleHQKLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBUZXh0IGNyZWF0ZVRleHROb2RlKFN0cmluZyBkYXRhKSB7Ci0JCVRleHRJbXBsIHRleHQgPSBuZXcgVGV4dEltcGwoKTsKLQkJdGV4dC5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQl0ZXh0LnNldERhdGEoZGF0YSk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiB0cmVlIHdhbGsKLQkgKi8KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Eb2N1bWVudFRyYXZlcnNhbCNjcmVhdGVUcmVlV2Fsa2VyKG9yZy53M2MuZG9tLk5vZGUsCi0JICogICAgICBpbnQsIG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBUcmVlV2Fsa2VyIGNyZWF0ZVRyZWVXYWxrZXIoTm9kZSByb290LCBpbnQgd2hhdFRvU2hvdywgTm9kZUZpbHRlciBmaWx0ZXIsIGJvb2xlYW4gZW50aXR5UmVmZXJlbmNlRXhwYW5zaW9uKSB7Ci0JCWlmIChyb290ID09IG51bGwpIHsKLQkJCVN0cmluZyBtc2cgPSAiUHJvZ3JhbSBFcnJvcjogcm9vdCBub2RlIGNhbiBub3QgYmUgbnVsbCBmb3IgVHJlZVdhbGtlciI7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgbXNnKTsKLQkJfQotCQkvLyBJU1NVRTogd2UganVzdCB1c2UgWGVyY2VzIGltcGxlbWVudGF0aW9uIGZvciBub3csIGJ1dCBsb25nZXIgdGVybSwKLQkJLy8gd2Ugc2hvdWxkIG1ha2UgYQotCQkvLyB0aHJlYWQvam9iIHNhZmUgdmVyc2lvbiAoYXMgd2VsbCBhcyBub3QgcmVseSBvbiBYZXJjZXMgImltcGwiCi0JCS8vIGNsYXNzLgotCQlyZXR1cm4gbmV3IFRyZWVXYWxrZXJJbXBsKHJvb3QsIHdoYXRUb1Nob3csIGZpbHRlciwgZW50aXR5UmVmZXJlbmNlRXhwYW5zaW9uKTsKLQotCX0KLQotCXByaXZhdGUgRG9jdW1lbnRUeXBlIGZpbmREb2N0eXBlKE5vZGUgbm9kZSkgewotCQkKLQkJaW50IGNvdW50U2VhcmNoID0gMDsKLQkJZm9yIChOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKGNvdW50U2VhcmNoKysgPiBtYXhEb2NUeXBlU2VhcmNoKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBET0NVTUVOVF9UWVBFX05PREUgJiYgY2hpbGQgaW5zdGFuY2VvZiBEb2N1bWVudFR5cGUpIHsKLQkJCQlyZXR1cm4gKERvY3VtZW50VHlwZSkgY2hpbGQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IEVMRU1FTlRfTk9ERSAmJiAoKElET01FbGVtZW50KSBjaGlsZCkuaXNDb21tZW50VGFnKCkpIHsKLQkJCQkvLyBzZWFyY2ggRE9DVFlQRSBpbnNpZGUgb2YgZ2VuZXJpYyBjb21tZW50IGVsZW1lbnQKLQkJCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGZpbmREb2N0eXBlKGNoaWxkKTsKLQkJCQlpZiAoZG9jVHlwZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBkb2NUeXBlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgRWxlbWVudCBmaW5kRG9jdW1lbnRFbGVtZW50KFN0cmluZyBkb2NOYW1lLCBOb2RlIG5vZGUsIE5vZGVbXSBmaXJzdEZvdW5kLCBpbnQgbWF4KSB7Ci0JCWludCBjb3VudFNlYXJjaCA9IDA7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQotCQkJLyogCi0JCQkgKiBtYXhEb2NUeXBlU2VhcmNoIGxpbWl0cyBhZGRlZCB2aWEgYnVnIDE1MTkyOQotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MTkyOQotCQkJICogYnV0LCBpbiBvdGhlciBjb250ZXh0cywgCi0JCQkgKiBpZiBub01heFNlYXJjaCBpcyBzcGVjaWZpZWQsIHRoZW4gZG8gbm90ICJicmVhayBvdXQiIG9mIGxvbmcgc2VhcmNoZXMgCi0JCQkgKiAqLwotCQkJaWYgKG1heCAhPSBub01heFNlYXJjaCAmJiBjb3VudFNlYXJjaCsrID4gbWF4KSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBFTEVNRU5UX05PREUpCi0JCQkJY29udGludWU7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBjaGlsZDsKLQkJCWlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCQkJRWxlbWVudCBkb2NFbGVtZW50ID0gZmluZERvY3VtZW50RWxlbWVudChkb2NOYW1lLCBlbGVtZW50LCBmaXJzdEZvdW5kLCBtYXgpOwotCQkJCWlmIChkb2NFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGRvY0VsZW1lbnQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBhZGRlZCAnZWxzZSBjb250aW51ZScgdG8gYmV0dGVyIGhhbmRsZSBjYXNlcyB3aGVyZQotCQkJCQkvLyB0aGVyZSBpcyAibW9yZSB0aGFuIG9uZSByb290IiBlbGVtZW50Ci0JCQkJCS8vIGVzcGVjaWFsbHkgY29tcGxpY2F0ZWQgYnkgQ29tbWVudEVsZW1lbnRzLCB3aGljaCBhcmUKLQkJCQkJLy8gc29tZXRpbWVzIHRyZWF0ZWQgYXMgZWxlbWVudHMsIGJ1dCBzaG91bGQKLQkJCQkJLy8gYmUgdHJlYXRlZCBhcyBjb21tZW50cyBpbiB0aGlzIGNvbnRleHQuCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCS8vIG5vdGU6IHRoZSAibmFtZSIgd29uJ3QgbWF0Y2ggaW4gdGhlIGV2ZW50IG9mIGEganNwIHRhZyAuLi4gYnV0Ci0JCQkvLyBpbmNhc2UKLQkJCS8vIHRoZSBuYW1lIGlzIG51bGwsIHdlIGRvIG5vdCB3YW50IHRoZSBqc3AgZWxlbWVudCByZXR1cm5lZCBhcwotCQkJLy8gZG9jdW1lbnRFbGVtZW50Ci0JCQlpZiAoZWxlbWVudC5pc0pTUFRhZygpKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGRvY05hbWUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCS8vIHVzZSBsb2NhbCBuYW1lIGZvciBuYW1lc3BhY2UKLQkJCVN0cmluZyBsb2NhbE5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotCQkJaWYgKGxvY2FsTmFtZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGlzWE1MVHlwZSgpKSB7Ci0JCQkJaWYgKGxvY2FsTmFtZS5lcXVhbHMoZG9jTmFtZSkpCi0JCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGxvY2FsTmFtZS5lcXVhbHNJZ25vcmVDYXNlKGRvY05hbWUpKQotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJCWlmIChmaXJzdEZvdW5kWzBdID09IG51bGwpCi0JCQkJZmlyc3RGb3VuZFswXSA9IGVsZW1lbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q2hhclZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDaGFyVmFsdWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgbGVuZ3RoID0gbmFtZS5sZW5ndGgoKTsKLQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKG5hbWUuY2hhckF0KDApID09ICcjJykgeyAvLyBjaGFyYWN0ZXIgcmVmZXJlbmNlCi0JCQlpZiAobGVuZ3RoID09IDEpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpbnQgcmFkaXggPSAxMDsKLQkJCVN0cmluZyBzID0gbnVsbDsKLQkJCS8vIG5vdyBhbGxvdyBoZXhhZGVjaW1hbCBhbHNvIGZvciBub24gWE1MIGRvY3VtZW50Ci0JCQlpZiAobmFtZS5jaGFyQXQoMSkgPT0gJ3gnKSB7IC8vIGhleGFkZWNpbWFsCi0JCQkJcmFkaXggPSAxNjsKLQkJCQlzID0gbmFtZS5zdWJzdHJpbmcoMik7Ci0JCQl9Ci0JCQllbHNlIHsgLy8gZGVjaW1hbAotCQkJCXMgPSBuYW1lLnN1YnN0cmluZygxKTsKLQkJCX0KLQkJCWlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKHMuY2hhckF0KDApID09ICctJykKLQkJCQlyZXR1cm4gbnVsbDsgLy8gbm8gbWludXMgYWNjZXB0ZWQKLQkJCWNoYXIgYyA9IDA7Ci0JCQl0cnkgewotCQkJCWMgPSAoY2hhcikgSW50ZWdlci5wYXJzZUludChzLCByYWRpeCk7Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7Ci0JCQl9Ci0JCQlpZiAoYyA9PSAwKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGMpOwotCQl9Ci0KLQkJLy8gaW1wbGljaXQgY2hhcmFjdGVyIGVudGl0aWVzIGZvciBYTUwKLQkJaWYgKG5hbWUuZXF1YWxzKElYTUxDaGFyRW50aXR5LkxUX05BTUUpKQotCQkJcmV0dXJuIElYTUxDaGFyRW50aXR5LkxUX1ZBTFVFOwotCQlpZiAobmFtZS5lcXVhbHMoSVhNTENoYXJFbnRpdHkuR1RfTkFNRSkpCi0JCQlyZXR1cm4gSVhNTENoYXJFbnRpdHkuR1RfVkFMVUU7Ci0JCWlmIChuYW1lLmVxdWFscyhJWE1MQ2hhckVudGl0eS5BTVBfTkFNRSkpCi0JCQlyZXR1cm4gSVhNTENoYXJFbnRpdHkuQU1QX1ZBTFVFOwotCQlpZiAobmFtZS5lcXVhbHMoSVhNTENoYXJFbnRpdHkuUVVPVF9OQU1FKSkKLQkJCXJldHVybiBJWE1MQ2hhckVudGl0eS5RVU9UX1ZBTFVFOwotCQlpZiAoaXNYTUxUeXBlKCkpIHsKLQkJCWlmIChuYW1lLmVxdWFscyhJWE1MQ2hhckVudGl0eS5BUE9TX05BTUUpKQotCQkJCXJldHVybiBJWE1MQ2hhckVudGl0eS5BUE9TX1ZBTFVFOwotCQl9Ci0KLQkJQ01Eb2N1bWVudCBjbSA9IGdldENNRG9jdW1lbnQoKTsKLQkJaWYgKGNtICE9IG51bGwpIHsKLQkJCUNNTmFtZWROb2RlTWFwIG1hcCA9IGNtLmdldEVudGl0aWVzKCk7Ci0JCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCQlDTUVudGl0eURlY2xhcmF0aW9uIGRlY2wgPSAoQ01FbnRpdHlEZWNsYXJhdGlvbikgbWFwLmdldE5hbWVkSXRlbShuYW1lKTsKLQkJCQlpZiAoZGVjbCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9IGRlY2wuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJaW50IHZhbHVlTGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0JCQkJCWlmICh2YWx1ZUxlbmd0aCA+IDEgJiYgdmFsdWUuY2hhckF0KDApID09ICcmJyAmJiB2YWx1ZS5jaGFyQXQoMSkgPT0gJyMnICYmIHZhbHVlLmNoYXJBdCh2YWx1ZUxlbmd0aCAtIDEpID09ICc7JykgewotCQkJCQkJLy8gY2hhcmFjdGVyIHJlZmVyZW5jZQotCQkJCQkJcmV0dXJuIGdldENoYXJWYWx1ZSh2YWx1ZS5zdWJzdHJpbmcoMSwgdmFsdWVMZW5ndGggLSAxKSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHZhbHVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkodGhpcyk7Ci0JCWlmIChtb2RlbFF1ZXJ5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG1vZGVsUXVlcnkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RG9jdHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZQotCSAqLwotCXB1YmxpYyBEb2N1bWVudFR5cGUgZ2V0RG9jdHlwZSgpIHsKLQkJcmV0dXJuIGZpbmREb2N0eXBlKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIGdldERvY3VtZW50RWxlbWVudAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudCBGcm9tIERPTSAyIFNwZWM6IGRvY3VtZW50RWxlbWVudCBvZiB0eXBlCi0JICogICAgICAgICBFbGVtZW50IFtwLjYyXSAsIHJlYWRvbmx5IFRoaXMgaXMgYSBjb252ZW5pZW5jZSBbcC4xMTldCi0JICogICAgICAgICBhdHRyaWJ1dGUgdGhhdCBhbGxvd3MgZGlyZWN0IGFjY2VzcyB0byB0aGUgY2hpbGQgbm9kZSB0aGF0IGlzCi0JICogICAgICAgICB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBkb2N1bWVudC4gRm9yIEhUTUwgZG9jdW1lbnRzLCB0aGlzIGlzCi0JICogICAgICAgICB0aGUgZWxlbWVudCB3aXRoIHRoZSB0YWdOYW1lICJIVE1MIi4gTm90ZTogd2UgZGlmZmVyIGZyb20gdGhpcwotCSAqICAgICAgICAgZGVmaW5pdGlvbiBhIGxpdHRsZSBpbiB0aGF0IHdlIGRvbid0IG5lY2Vzc2FyaWx5IHRha2UgdGhlIGZpcnN0Ci0JICogICAgICAgICBjaGlsZCBidXQgYWxzbyBsb29rIHRvIG1hdGNoIHRoZSBuYW1lLiBJbiBhIHdlbGwgZm9ybWVkCi0JICogICAgICAgICBkb2N1bWVudCwgb2YgY291cnNlLCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lLCBidXQgbm90Ci0JICogICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBpbiBhbiBpbGwtZm9ybWVkIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBFbGVtZW50IGdldERvY3VtZW50RWxlbWVudCgpIHsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGdldERvY3VtZW50VHlwZSgpOwotCQlpZiAoZG9jVHlwZSAhPSBudWxsKSB7Ci0JCQluYW1lID0gZG9jVHlwZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlFbGVtZW50IGZpcnN0W10gPSBuZXcgRWxlbWVudFsxXTsKLQkJRWxlbWVudCBkb2NFbGVtZW50ID0gZmluZERvY3VtZW50RWxlbWVudChuYW1lLCB0aGlzLCBmaXJzdCwgbm9NYXhTZWFyY2gpOwotCQlpZiAoZG9jRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlkb2NFbGVtZW50ID0gZmlyc3RbMF07Ci0JCX0KLQotCQlyZXR1cm4gZG9jRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnRUeXBlIGdldERvY3VtZW50VHlwZSgpIHsKLQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gKERvY3VtZW50VHlwZUFkYXB0ZXIpIGdldEFkYXB0ZXJGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gZ2V0RG9jdHlwZSgpOwotCQlyZXR1cm4gYWRhcHRlci5nZXREb2N1bWVudFR5cGUoKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRUeXBlSWQoKSB7Ci0JCURvY3VtZW50VHlwZSBkb2NUeXBlID0gZ2V0RG9jdW1lbnRUeXBlKCk7Ci0JCWlmIChkb2NUeXBlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIGlkID0gZG9jVHlwZS5nZXRQdWJsaWNJZCgpOwotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCWlkID0gZG9jVHlwZS5nZXRTeXN0ZW1JZCgpOwotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudEJ5SWQoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGVJdGVyYXRvciBpdCA9IGNyZWF0ZU5vZGVJdGVyYXRvcih0aGlzLCBOb2RlRmlsdGVyLlNIT1dfQUxMLCBudWxsLCBmYWxzZSk7Ci0JCWlmIChpdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZm9yIChOb2RlIG5vZGUgPSBpdC5uZXh0Tm9kZSgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBpdC5uZXh0Tm9kZSgpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IEVMRU1FTlRfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQlTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsvLyROT04tTkxTLTEkCi0JCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHMoaWQpKQotCQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0RWxlbWVudHNCeVRhZ05hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlTGlzdAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lKFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE5vZGVMaXN0SW1wbCgpOwotCi0JCU5vZGVMaXN0SW1wbCBlbGVtZW50cyA9IG51bGw7Ci0KLQkJaWYgKHVzZXRhZ25hbWVjYWNoZSkgewotCQkJZWxlbWVudHMgPSB0YWdOYW1lQ2FjaGUuZ2V0SXRlbSh0YWdOYW1lKTsKLQkJfQotCi0JCWlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQllbGVtZW50cyA9IGludGVybmFsR2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7Ci0KLQkJfQotCi0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhTdHJpbmcgdXJpLCBTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQotCQlOb2RlSXRlcmF0b3IgaXQgPSBjcmVhdGVOb2RlSXRlcmF0b3IodGhpcywgTm9kZUZpbHRlci5TSE9XX0FMTCwgbnVsbCwgZmFsc2UpOwotCQlpZiAoaXQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0JCU5vZGVMaXN0SW1wbCBlbGVtZW50cyA9IG5ldyBOb2RlTGlzdEltcGwoKTsKLQotCQlpZiAodXJpICE9IG51bGwgJiYgdXJpLmxlbmd0aCgpID09IDEgJiYgdXJpLmNoYXJBdCgwKSA9PSAnKicpIHsKLQkJCXVyaSA9IG51bGw7IC8vIGRvIG5vdCBjYXJlCi0JCX0KLQkJaWYgKHRhZ05hbWUubGVuZ3RoKCkgPT0gMSAmJiB0YWdOYW1lLmNoYXJBdCgwKSA9PSAnKicpIHsKLQkJCXRhZ05hbWUgPSBudWxsOyAvLyBkbyBub3QgY2FyZQotCQl9Ci0KLQkJZm9yIChOb2RlIG5vZGUgPSBpdC5uZXh0Tm9kZSgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBpdC5uZXh0Tm9kZSgpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IEVMRU1FTlRfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQlpZiAodGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0JCQkJaWYgKGxvY2FsTmFtZSA9PSBudWxsIHx8ICFsb2NhbE5hbWUuZXF1YWxzKHRhZ05hbWUpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCVN0cmluZyBuc1VSSSA9IGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQkJaWYgKG5zVVJJID09IG51bGwgfHwgIW5zVVJJLmVxdWFscyh1cmkpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsZW1lbnRzLmFwcGVuZE5vZGUoZWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSBYTUwgZGVjbGFyYXRpb24sIHRoZSBlbmNvZGluZwotCSAqIG9mIHRoaXMgZG9jdW1lbnQuIFRoaXMgaXMgPGNvZGU+bnVsbDwvY29kZT4gd2hlbiB1bnNwZWNpZmllZC4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBET01JbXBsZW1lbnRhdGlvbiBnZXRJbXBsZW1lbnRhdGlvbigpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIG90aGVyIG5vZGVzIHdpbGwgYmUgcmVmZXJyaW5nIHRvIHRoaXMgb25lIHRvIGdldCB0aGUgb3duaW5nIG1vZGVsCi0JICovCi0JcHVibGljIElET01Nb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiAiI2RvY3VtZW50IjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIERPQ1VNRU5UX05PREU7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSBYTUwgZGVjbGFyYXRpb24sIHdoZXRoZXIgdGhpcwotCSAqIGRvY3VtZW50IGlzIHN0YW5kYWxvbmUuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFN0YW5kYWxvbmUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcgd2hldGhlciBlcnJvcnMgY2hlY2tpbmcgaXMgZW5mb3JjZWQgb3Igbm90LgotCSAqIFdoZW4gc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgdG8gbm90Ci0JICogdGVzdCBldmVyeSBwb3NzaWJsZSBlcnJvciBjYXNlIG5vcm1hbGx5IGRlZmluZWQgb24gRE9NIG9wZXJhdGlvbnMsIGFuZAotCSAqIG5vdCByYWlzZSBhbnkgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPi4gSW4gY2FzZSBvZiBlcnJvciwgdGhlCi0JICogYmVoYXZpb3IgaXMgdW5kZWZpbmVkLiBUaGlzIGF0dHJpYnV0ZSBpcyA8Y29kZT50cnVlPC9jb2RlPiBieQotCSAqIGRlZmF1bHRzLgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRTdHJpY3RFcnJvckNoZWNraW5nKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSBYTUwgZGVjbGFyYXRpb24sIHRoZSB2ZXJzaW9uCi0JICogbnVtYmVyIG9mIHRoaXMgZG9jdW1lbnQuIFRoaXMgaXMgPGNvZGU+bnVsbDwvY29kZT4gd2hlbiB1bnNwZWNpZmllZC4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpZ25vcmVDYXNlKCkgewotCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcikgZ2V0QWRhcHRlckZvcihEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIChhZGFwdGVyLmdldFRhZ05hbWVDYXNlKCkgIT0gRG9jdW1lbnRUeXBlQWRhcHRlci5TVFJJQ1RfQ0FTRSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW1wb3J0Q2hpbGROb2RlcyhOb2RlIHBhcmVudCwgYm9vbGVhbiBkZWVwKSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlyZW1vdmVDaGlsZE5vZGVzKCk7Ci0KLQkJZm9yIChOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlOb2RlIGltcG9ydGVkID0gaW1wb3J0Tm9kZShjaGlsZCwgZGVlcCk7Ci0JCQlpZiAoaW1wb3J0ZWQgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWFwcGVuZENoaWxkKGltcG9ydGVkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBOb2RlIGltcG9ydE5vZGUoTm9kZSBub2RlLCBib29sZWFuIGRlZXApIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGVJbXBsIGltcG9ydGVkID0gKE5vZGVJbXBsKSBub2RlLmNsb25lTm9kZShkZWVwKTsKLQkJaWYgKGltcG9ydGVkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy9zdWNjZXNzZnVsIGltcG9ydCwgbm90aWZ5IFVzZXJEYXRhSGFuZGxlcnMgaWYgYW55Ci0JCU5vZGVJbXBsIG5vZGVUb05vdGlmeT0oTm9kZUltcGwpIG5vZGU7Ci0JCW5vZGVUb05vdGlmeS5ub3RpZnlVc2VyRGF0YUhhbmRsZXJzKFVzZXJEYXRhSGFuZGxlci5OT0RFX0lNUE9SVEVELCBudWxsKTsKLQkJaW1wb3J0ZWQuc2V0T3duZXJEb2N1bWVudCh0aGlzLCBkZWVwKTsKLQkJcmV0dXJuIGltcG9ydGVkOwotCX0KLQotCXByaXZhdGUgTm9kZUxpc3RJbXBsIGludGVybmFsR2V0RWxlbWVudHNCeVRhZ05hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJnZXRFbGVtZW50c0J5VGFnbmFtZTogIiArIHRhZ05hbWUpOwotCQlOb2RlSXRlcmF0b3IgaXQgPSBjcmVhdGVOb2RlSXRlcmF0b3IodGhpcywgTm9kZUZpbHRlci5TSE9XX0FMTCwgbnVsbCwgZmFsc2UpOwotCQlpZiAoaXQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0JCU5vZGVMaXN0SW1wbCBlbGVtZW50cyA9IG5ldyBOb2RlTGlzdEltcGwoKTsKLQotCQlpZiAodGFnTmFtZS5sZW5ndGgoKSA9PSAxICYmIHRhZ05hbWUuY2hhckF0KDApID09ICcqJykgewotCQkJdGFnTmFtZSA9IG51bGw7IC8vIGRvIG5vdCBjYXJlCi0JCX0KLQotCQlmb3IgKE5vZGUgbm9kZSA9IGl0Lm5leHROb2RlKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IGl0Lm5leHROb2RlKCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gRUxFTUVOVF9OT0RFKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkgewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQkJaWYgKCFlbGVtZW50Lm1hdGNoVGFnTmFtZSh0YWdOYW1lKSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbGVtZW50cy5hcHBlbmROb2RlKG5vZGUpOwotCQl9Ci0JCWlmICh1c2V0YWduYW1lY2FjaGUpIHsKLQkJCXRhZ05hbWVDYWNoZS5hZGRJdGVtKHRhZ05hbWUsIGVsZW1lbnRzKTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNKU1BEb2N1bWVudCgpIHsKLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFscyhKU1BUYWcuSlNQX1JPT1QpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSlNQVHlwZSgpIHsKLQkJaWYgKHRoaXMubW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gdGhpcy5tb2RlbC5nZXRNb2RlbEhhbmRsZXIoKTsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIGlkID0gaGFuZGxlci5nZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZCgpOwotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gSVNTVUU6IC0tIGF2b2lkIHRoaXMgaGFyZGNvZGVkIHN0cmluZwotCQlyZXR1cm4gaWQuZXF1YWxzKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gLy8gRE1XOiBtb2RpZmllZCBmb3IgWE1MNEogNC4wLjEKLQkJLy8gaWYgKFhNTENoYXIuaXNWYWxpZE5hbWUobmFtZSkpIHJldHVybiB0cnVlOwotCQlpZiAoTmFtZVZhbGlkYXRvci5pc1ZhbGlkKG5hbWUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCS8vIHNwZWNpYWwgZm9yIGludmFsaWQgZGVjbGFyYXRpb24KLQkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMSAmJiBuYW1lLmNoYXJBdCgwKSA9PSAnIScpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJLy8gc3BlY2lhbCBmb3IgSlNQIHRhZyBpbiB0YWcgbmFtZQotCQlpZiAobmFtZS5zdGFydHNXaXRoKEpTUFRhZy5UQUdfT1BFTikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzWE1MVHlwZSgpIHsKLQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gKERvY3VtZW50VHlwZUFkYXB0ZXIpIGdldEFkYXB0ZXJGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGFkYXB0ZXIuaXNYTUxUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgcmVsZWFzZURvY3VtZW50VHlwZSgpIHsKLQkvLyBpZiAodGhpcy5kb2N1bWVudFR5cGVBZGFwdGVyID09IG51bGwpCi0JLy8gcmV0dXJuOwotCS8vIHRoaXMuZG9jdW1lbnRUeXBlQWRhcHRlci5yZWxlYXNlKCk7Ci0JLy8gdGhpcy5kb2N1bWVudFR5cGVBZGFwdGVyID0gbnVsbDsKLQkvLyB9Ci0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSBYTUwgZGVjbGFyYXRpb24sIHRoZSBlbmNvZGluZwotCSAqIG9mIHRoaXMgZG9jdW1lbnQuIFRoaXMgaXMgPGNvZGU+bnVsbDwvY29kZT4gd2hlbiB1bnNwZWNpZmllZC4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoamF2YS5sYW5nLlN0cmluZyBlbmNvZGluZykgewotCX0KLQotCS8qKgotCSAqIHNldE1vZGVsIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgWE1MTW9kZWwKLQkgKi8KLQotCXByb3RlY3RlZCB2b2lkIHNldE1vZGVsKElET01Nb2RlbCBtb2RlbCkgewotCQl0aGlzLm1vZGVsID0gKERPTU1vZGVsSW1wbCkgbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSBYTUwgZGVjbGFyYXRpb24sIHdoZXRoZXIgdGhpcwotCSAqIGRvY3VtZW50IGlzIHN0YW5kYWxvbmUuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YW5kYWxvbmUoYm9vbGVhbiBzdGFuZGFsb25lKSB7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nIHdoZXRoZXIgZXJyb3JzIGNoZWNraW5nIGlzIGVuZm9yY2VkIG9yIG5vdC4KLQkgKiBXaGVuIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHRvIG5vdAotCSAqIHRlc3QgZXZlcnkgcG9zc2libGUgZXJyb3IgY2FzZSBub3JtYWxseSBkZWZpbmVkIG9uIERPTSBvcGVyYXRpb25zLCBhbmQKLQkgKiBub3QgcmFpc2UgYW55IDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4uIEluIGNhc2Ugb2YgZXJyb3IsIHRoZQotCSAqIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4gVGhpcyBhdHRyaWJ1dGUgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gYnkKLQkgKiBkZWZhdWx0cy4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RyaWN0RXJyb3JDaGVja2luZyhib29sZWFuIHN0cmljdEVycm9yQ2hlY2tpbmcpIHsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcsIGFzIHBhcnQgb2YgdGhlIFhNTCBkZWNsYXJhdGlvbiwgdGhlIHZlcnNpb24KLQkgKiBudW1iZXIgb2YgdGhpcyBkb2N1bWVudC4gVGhpcyBpcyA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIHVuc3BlY2lmaWVkLgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKGphdmEubGFuZy5TdHJpbmcgdmVyc2lvbikgewotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElucHV0RW5jb2RpbmcoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRYbWxFbmNvZGluZygpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbG1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRYbWxTdGFuZGFsb25lKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFhtbFN0YW5kYWxvbmUoYm9vbGVhbiB4bWxTdGFuZGFsb25lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbG1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFhtbFZlcnNpb24oKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0WG1sVmVyc2lvbihTdHJpbmcgeG1sVmVyc2lvbikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREb2N1bWVudFVSSSgpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbG1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudFVSSShTdHJpbmcgZG9jdW1lbnRVUkkpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbG1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgRE9NQ29uZmlndXJhdGlvbiBnZXREb21Db25maWcoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgbm9ybWFsaXplRG9jdW1lbnQoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIE5vZGUgcmVuYW1lTm9kZShOb2RlIG4sIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBxdWFsaWZpZWROYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbG1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFR5cGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMTY3MDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFR5cGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotCi0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50VHlwZUFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCXN0YXRpYyBmaW5hbCBpbnQgTE9XRVJfQ0FTRSA9IDI7Ci0Jc3RhdGljIGZpbmFsIGludCBTVFJJQ1RfQ0FTRSA9IDA7Ci0Jc3RhdGljIGZpbmFsIGludCBVUFBFUl9DQVNFID0gMTsKLQotCS8qKgotCSAqLwotCWludCBnZXRBdHRyTmFtZUNhc2UoKTsKLQotCS8qKgotCSAqLwotCURvY3VtZW50VHlwZSBnZXREb2N1bWVudFR5cGUoKTsKLQotCS8qKgotCSAqLwotCWludCBnZXRUYWdOYW1lQ2FzZSgpOwotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBoYXNGZWF0dXJlKFN0cmluZyBmZWF0dXJlKTsKLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaXNYTUxUeXBlKCk7Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlbGVhc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlQWRhcHRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljM2U5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50VHlwZUFkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRUeXBlQWRhcHRlckltcGwgaW1wbGVtZW50cyBEb2N1bWVudFR5cGVBZGFwdGVyIHsKLQotCXByaXZhdGUgSURPTURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIERvY3VtZW50VHlwZSBkb2N1bWVudFR5cGUgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50VHlwZUFkYXB0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudFR5cGVBZGFwdGVySW1wbChJRE9NRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJdGhpcy5kb2N1bWVudFR5cGUgPSBkb2N1bWVudC5nZXREb2N0eXBlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJOYW1lQ2FzZSgpIHsKLQkJcmV0dXJuIFNUUklDVF9DQVNFOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBJRE9NRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBEb2N1bWVudFR5cGUgZ2V0RG9jdW1lbnRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kb2N1bWVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRUYWdOYW1lQ2FzZSgpIHsKLQkJcmV0dXJuIFNUUklDVF9DQVNFOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzWE1MVHlwZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWlmIChldmVudFR5cGUgIT0gSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCkKLQkJCXJldHVybjsKLQkJaWYgKG5vdGlmaWVyID09IG51bGwgfHwgIShub3RpZmllciBpbnN0YW5jZW9mIElET01Eb2N1bWVudCkpCi0JCQlyZXR1cm47Ci0JCXRoaXMuZG9jdW1lbnRUeXBlID0gKChJRE9NRG9jdW1lbnQpIG5vdGlmaWVyKS5nZXREb2N0eXBlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5RG9jdW1lbnRUeXBlQ2hhbmdlZCgpIHsKLQkJaWYgKHRoaXMuZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSURPTU1vZGVsIG1vZGVsID0gdGhpcy5kb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJKChET01Nb2RlbEltcGwpIG1vZGVsKS5kb2N1bWVudFR5cGVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50VHlwZShEb2N1bWVudFR5cGUgZG9jdW1lbnRUeXBlKSB7Ci0JCXRoaXMuZG9jdW1lbnRUeXBlID0gZG9jdW1lbnRUeXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2OTU0M2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICogICAgIEJhbGF6cyBCYW5mYWk6IEJ1ZyAxNTQ3MzcgZ2V0VXNlckRhdGEvc2V0VXNlckRhdGEgc3VwcG9ydCBmb3IgTm9kZQotICogICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ3MzcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLQotLyoqCi0gKiBEb2N1bWVudFR5cGUgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50VHlwZUltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIElET01Eb2N1bWVudFR5cGUgewotCXByaXZhdGUgU3RyaW5nIGludGVybmFsU3Vic2V0ID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHB1YmxpY0lkID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBzeXN0ZW1JZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBEb2N1bWVudFR5cGVJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50VHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRG9jdW1lbnRUeXBlSW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBEb2N1bWVudFR5cGVJbXBsCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50VHlwZUltcGwoRG9jdW1lbnRUeXBlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMubmFtZSA9IHRoYXQubmFtZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJRG9jdW1lbnRUeXBlSW1wbCBjbG9uZWQgPSBuZXcgRG9jdW1lbnRUeXBlSW1wbCh0aGlzKTsKLQkJbm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsIGNsb25lZCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0RW50aXRpZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXAKLQkgKi8KLQlwdWJsaWMgTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEludGVybmFsU3Vic2V0KCkgewotCQlyZXR1cm4gdGhpcy5pbnRlcm5hbFN1YnNldDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKHRoaXMubmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZQotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIERPQ1VNRU5UX1RZUEVfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb3RhdGlvbnMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXAKLQkgKi8KLQlwdWJsaWMgTmFtZWROb2RlTWFwIGdldE5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHVibGljSWQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJcmV0dXJuIHRoaXMucHVibGljSWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3lzdGVtSWQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3lzdGVtSWQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gd2lsbCBiZSBnZW5lcmF0ZWQKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJcmV0dXJuIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfREVDTEFSQVRJT05fQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9DTE9TRSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW50ZXJuYWxTdWJzZXQoU3RyaW5nIGludGVybmFsU3Vic2V0KSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5pbnRlcm5hbFN1YnNldCA9IGludGVybmFsU3Vic2V0OwotCX0KLQotCS8qKgotCSAqIHNldE5hbWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogc2V0UHVibGljSWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSWQoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5wdWJsaWNJZCA9IHB1YmxpY0lkOwotCi0JCW5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIHNldFN5c3RlbUlkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBzeXN0ZW1JZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBzeXN0ZW1JZCkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCXRoaXMuc3lzdGVtSWQgPSBzeXN0ZW1JZDsKLQotCQlub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiB0b1N0cmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKGdldE5hbWUoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJygnKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRQdWJsaWNJZCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0U3lzdGVtSWQoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgnQCcpOwotCQkJYnVmZmVyLmFwcGVuZChmbGF0Tm9kZS50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbGVtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGI4MmYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgCi0gKiAgICAgVmFsZW50aW4gQmFjaXUgLSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM5NTUyCi0gKiAgICAgCi0gKiAgICAgQmFsYXpzIEJhbmZhaTogQnVnIDE1NDczNyBnZXRVc2VyRGF0YS9zZXRVc2VyRGF0YSBzdXBwb3J0IGZvciBOb2RlCi0gKiAgICAgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDczNwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5YTUxTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklYTUxOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLQotCi0vKioKLSAqIEVsZW1lbnRJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50SW1wbCBleHRlbmRzIE5vZGVDb250YWluZXIgaW1wbGVtZW50cyBJRE9NRWxlbWVudCB7Ci0KLQlwcml2YXRlIGNsYXNzIEF0dHJpYnV0ZXMgaW1wbGVtZW50cyBOYW1lZE5vZGVNYXAgewotCQlBdHRyaWJ1dGVzKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJaWYgKGF0dHJOb2RlcyA9PSBudWxsKQotCQkJCXJldHVybiAwOwotCQkJcmV0dXJuIGF0dHJOb2Rlcy5nZXRMZW5ndGgoKTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5vZGUobmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBnZXROYW1lZEl0ZW1OUyhTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU5vZGVOUyh1cmksIG5hbWUpOwotCQl9Ci0KLQkJcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCWlmIChhdHRyTm9kZXMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBhdHRyTm9kZXMuaXRlbShpbmRleCk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSByZW1vdmVOYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQkJcmV0dXJuIHJlbW92ZUF0dHJpYnV0ZU5vZGUobmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSByZW1vdmVOYW1lZEl0ZW1OUyhTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gcmVtb3ZlQXR0cmlidXRlTm9kZU5TKHVyaSwgbmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBzZXROYW1lZEl0ZW0oTm9kZSBhcmcpIHRocm93cyBET01FeGNlcHRpb24gewotCQkJcmV0dXJuIHNldEF0dHJpYnV0ZU5vZGUoKEF0dHJJbXBsKSBhcmcpOwotCQl9Ci0KLQkJcHVibGljIE5vZGUgc2V0TmFtZWRJdGVtTlMoTm9kZSBhcmcpIHRocm93cyBET01FeGNlcHRpb24gewotCQkJcmV0dXJuIHNldEF0dHJpYnV0ZU5vZGVOUygoQXR0ckltcGwpIGFyZyk7Ci0JCX0KLQl9Ci0KLQlOb2RlTGlzdEltcGwgYXR0ck5vZGVzID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gaXNDb21tZW50VGFnID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGlzRW1wdHlUYWcgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNKU1BUYWcgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGFnTmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBFbGVtZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBFbGVtZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBFbGVtZW50SW1wbAotCSAqLwotCXByb3RlY3RlZCBFbGVtZW50SW1wbChFbGVtZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMudGFnTmFtZSA9IHRoYXQudGFnTmFtZTsKLQkJCXRoaXMuaXNFbXB0eVRhZyA9IHRoYXQuaXNFbXB0eVRhZzsKLQkJCXRoaXMuaXNKU1BUYWcgPSB0aGF0LmlzSlNQVGFnOwotCQkJdGhpcy5pc0NvbW1lbnRUYWcgPSB0aGF0LmlzQ29tbWVudFRhZzsKLQotCQkJLy8gY2xvbmUgYXR0cmlidXRlcwotCQkJdGhhdC5jbG9uZUF0dHJpYnV0ZXModGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBhZGRFbmRUYWcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVuZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVuZFRhZyhFbGVtZW50IGVuZFRhZykgewotCQlpZiAoZW5kVGFnID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChoYXNFbmRUYWcoKSkKLQkJCXJldHVybjsKLQkJRWxlbWVudEltcGwgZW5kID0gKEVsZW1lbnRJbXBsKSBlbmRUYWc7Ci0KLQkJLy8gbW92ZSB0aGUgZW5kIGZsYXQgbm9kZSBmcm9tIHRoZSBlbmQgdGFnCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBlbmQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbmQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQlzZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCX0KLQotCS8qKgotCSAqIGFwcGVuZEF0dGlidXRlTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gbmV3QXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqLwotCXB1YmxpYyBBdHRyIGFwcGVuZEF0dHJpYnV0ZU5vZGUoQXR0ciBuZXdBdHRyKSB7Ci0JCWlmIChuZXdBdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgbmV3QXR0cjsKLQkJaWYgKGF0dHIuZ2V0T3duZXJFbGVtZW50KCkgIT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQl0aGlzLmF0dHJOb2RlcyA9IG5ldyBOb2RlTGlzdEltcGwoKTsKLQkJdGhpcy5hdHRyTm9kZXMuYXBwZW5kTm9kZShhdHRyKTsKLQkJYXR0ci5zZXRPd25lckVsZW1lbnQodGhpcyk7Ci0KLQkJbm90aWZ5QXR0clJlcGxhY2VkKGF0dHIsIG51bGwpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBjbG9uZUF0dHJpYnV0ZXMgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5ld093bmVyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xvbmVBdHRyaWJ1dGVzKEVsZW1lbnQgbmV3T3duZXIpIHsKLQkJaWYgKG5ld093bmVyID09IG51bGwgfHwgbmV3T3duZXIgPT0gdGhpcykKLQkJCXJldHVybjsKLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdPd25lcjsKLQkJZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGVzKCk7Ci0KLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaW50IGxlbmd0aCA9IHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSB0aGlzLmF0dHJOb2Rlcy5pdGVtKGkpOwotCQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCUF0dHIgY2xvbmVkID0gKEF0dHIpIG5vZGUuY2xvbmVOb2RlKGZhbHNlKTsKLQkJCWlmIChjbG9uZWQgIT0gbnVsbCkKLQkJCQllbGVtZW50LmFwcGVuZEF0dHJpYnV0ZU5vZGUoY2xvbmVkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJRWxlbWVudEltcGwgY2xvbmVkID0gbmV3IEVsZW1lbnRJbXBsKHRoaXMpOwotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCQkKLQkJbm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsIGNsb25lZCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0cmlidXRlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJQXR0ciBhdHRyID0gZ2V0QXR0cmlidXRlTm9kZShuYW1lKTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIGdldEF0dHJpYnV0ZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQXR0ciBnZXRBdHRyaWJ1dGVOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBwYXJhbWV0ZXIKLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm8gYXR0cmlidXRlCi0KLQkJaW50IGxlbmd0aCA9IHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSB0aGlzLmF0dHJOb2Rlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChhdHRyLm1hdGNoTmFtZShuYW1lKSkKLQkJCQlyZXR1cm4gYXR0cjsgLy8gZm91bmQKLQkJfQotCi0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQXR0ciBnZXRBdHRyaWJ1dGVOb2RlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBpbnZhbGlkIHBhcmFtZXRlcgotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBubyBhdHRyaWJ1dGUKLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGF0dHIuZ2V0TG9jYWxOYW1lKCk7Ci0JCQlpZiAobG9jYWxOYW1lID09IG51bGwgfHwgIWxvY2FsTmFtZS5lcXVhbHMobmFtZSkpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgbnNVUkkgPSBhdHRyLmdldE5hbWVzcGFjZVVSSSgpOwotCQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQkJaWYgKG5zVVJJICE9IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKG5zVVJJID09IG51bGwgfHwgIW5zVVJJLmVxdWFscyh1cmkpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gZm91bmQKLQkJCXJldHVybiBhdHRyOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7IC8vIG5vdCBmb3VuZAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUpIHsKLQkJQXR0ciBhdHRyID0gZ2V0QXR0cmlidXRlTm9kZU5TKHVyaSwgbmFtZSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGF0dHIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyaWJ1dGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTmFtZWROb2RlTWFwCi0JICovCi0JcHVibGljIE5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbmV3IEF0dHJpYnV0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsUXVlcnkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbGVtZW50c0J5VGFnTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGVMaXN0Ci0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNCeVRhZ05hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0JCU5vZGVJdGVyYXRvciBpdCA9IGRvY3VtZW50LmNyZWF0ZU5vZGVJdGVyYXRvcih0aGlzLCBOb2RlRmlsdGVyLlNIT1dfQUxMLCBudWxsLCBmYWxzZSk7Ci0JCWlmIChpdCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQkJTm9kZUxpc3RJbXBsIGVsZW1lbnRzID0gbmV3IE5vZGVMaXN0SW1wbCgpOwotCi0JCWlmICh0YWdOYW1lLmxlbmd0aCgpID09IDEgJiYgdGFnTmFtZS5jaGFyQXQoMCkgPT0gJyonKSB7Ci0JCQl0YWdOYW1lID0gbnVsbDsgLy8gZG8gbm90IGNhcmUKLQkJfQotCi0JCWZvciAoTm9kZSBub2RlID0gaXQubmV4dE5vZGUoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gaXQubmV4dE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBFTEVNRU5UX05PREUpCi0JCQkJY29udGludWU7Ci0JCQlpZiAodGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJCQlpZiAoIWVsZW1lbnQubWF0Y2hUYWdOYW1lKHRhZ05hbWUpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsZW1lbnRzLmFwcGVuZE5vZGUobm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoU3RyaW5nIHVyaSwgU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0JCU5vZGVJdGVyYXRvciBpdCA9IGRvY3VtZW50LmNyZWF0ZU5vZGVJdGVyYXRvcih0aGlzLCBOb2RlRmlsdGVyLlNIT1dfQUxMLCBudWxsLCBmYWxzZSk7Ci0JCWlmIChpdCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQkJTm9kZUxpc3RJbXBsIGVsZW1lbnRzID0gbmV3IE5vZGVMaXN0SW1wbCgpOwotCi0JCWlmICh1cmkgIT0gbnVsbCAmJiB1cmkubGVuZ3RoKCkgPT0gMSAmJiB1cmkuY2hhckF0KDApID09ICcqJykgewotCQkJdXJpID0gbnVsbDsgLy8gZG8gbm90IGNhcmUKLQkJfQotCQlpZiAodGFnTmFtZS5sZW5ndGgoKSA9PSAxICYmIHRhZ05hbWUuY2hhckF0KDApID09ICcqJykgewotCQkJdGFnTmFtZSA9IG51bGw7IC8vIGRvIG5vdCBjYXJlCi0JCX0KLQotCQlmb3IgKE5vZGUgbm9kZSA9IGl0Lm5leHROb2RlKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IGl0Lm5leHROb2RlKCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gRUxFTUVOVF9OT0RFKQotCQkJCWNvbnRpbnVlOwotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJCWlmICh0YWdOYW1lICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbG9jYWxOYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQkJCQlpZiAobG9jYWxOYW1lID09IG51bGwgfHwgIWxvY2FsTmFtZS5lcXVhbHModGFnTmFtZSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG5zVVJJID0gZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLQkJCQlpZiAobnNVUkkgPT0gbnVsbCB8fCAhbnNVUkkuZXF1YWxzKHVyaSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxlbWVudHMuYXBwZW5kTm9kZShlbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbmRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJaWYgKHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCk7Ci0JCXJldHVybiBzdXBlci5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbmRTdGFydE9mZnNldCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kU3RhcnRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCXJldHVybiBzdXBlci5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbmRUYWdOYW1lKCkgewotCQlpZiAodGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IGlzTmVzdGVkRW5kVGFnKHJlZ2lvblR5cGUpKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQocmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkRW5kVGFnKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCX0KLQotCS8qKgotCSAqIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJaWYgKHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotCQlpZiAodGhpcy50YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGluZGV4ID0gdGhpcy50YWdOYW1lLmluZGV4T2YoJzonKTsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybiB0aGlzLnRhZ05hbWU7Ci0JCXJldHVybiB0aGlzLnRhZ05hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0JCVN0cmluZyBuc0F0dHJOYW1lID0gbnVsbDsKLQkJU3RyaW5nIHByZWZpeCA9IGdldFByZWZpeCgpOwotCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgewotCQkJbnNBdHRyTmFtZSA9IElYTUxOYW1lc3BhY2UuWE1MTlNfUFJFRklYICsgcHJlZml4OwotCQl9Ci0JCWVsc2UgewotCQkJbnNBdHRyTmFtZSA9IElYTUxOYW1lc3BhY2UuWE1MTlM7Ci0JCX0KLQotCQlmb3IgKE5vZGUgbm9kZSA9IHRoaXM7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IEVMRU1FTlRfTk9ERSkKLQkJCQlicmVhazsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKG5zQXR0ck5hbWUpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlVVJJOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRUYWdOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIEVMRU1FTlRfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJaWYgKHRoaXMudGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBpbmRleCA9IHRoaXMudGFnTmFtZS5pbmRleE9mKCc6Jyk7Ci0JCWlmIChpbmRleCA8PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIGV4Y2x1ZGUgSlNQIHRhZyBpbiB0YWcgbmFtZQotCQlpZiAodGhpcy50YWdOYW1lLmNoYXJBdCgwKSA9PSAnPCcpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHRoaXMudGFnTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIGdldFN0YXJ0RW5kT2Zmc2V0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTdGFydEVuZE9mZnNldCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiBmbGF0Tm9kZS5nZXRFbmQoKTsKLQkJcmV0dXJuIHN1cGVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3RhcnRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlpZiAoZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsICYmIHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgIWhhc0NoaWxkTm9kZXMoKSkgewotCQkJcmV0dXJuIHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUYWdOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnTmFtZSgpIHsKLQkJaWYgKHRoaXMudGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJcmV0dXJuIHRoaXMudGFnTmFtZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChnZXRBdHRyaWJ1dGVOb2RlKG5hbWUpICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAoZ2V0QXR0cmlidXRlTm9kZU5TKHVyaSwgbmFtZSkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuICh0aGlzLmF0dHJOb2RlcyAhPSBudWxsICYmIHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpID4gMCk7Ci0JfQotCi0JLyoqCi0JICogaGFzRW5kVGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0VuZFRhZygpIHsKLQkJcmV0dXJuICh0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBoYXNQcmVmaXgoKSB7Ci0JCWlmICh0aGlzLnRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHRoaXMudGFnTmFtZS5pbmRleE9mKCc6JykgPD0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gZXhjbHVkZSBKU1AgdGFnIGluIHRhZyBuYW1lCi0JCWlmICh0aGlzLnRhZ05hbWUuY2hhckF0KDApID09ICc8JykKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogaGFzU3RhcnRUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzU3RhcnRUYWcoKSB7Ci0JCXJldHVybiAoZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaWdub3JlQ2FzZSgpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5pZ25vcmVDYXNlKCkpIHsKLQkJCS8vIGV2ZW4gaW4gY2FzZSBpbnNlbnNpdGl2ZSBkb2N1bWVudCwgaWYgaGF2aW5nIHByZWZpeCwgaXQncyBjYXNlCi0JCQkvLyBzZW5zaXRpdmUgdGFnCi0JCQlyZXR1cm4gIWhhc1ByZWZpeCgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQXR0ciBpbnNlcnRBdHRyaWJ1dGVOb2RlKEF0dHIgbmV3QXR0ciwgaW50IGluZGV4KSB7Ci0JCWlmIChuZXdBdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgbmV3QXR0cjsKLQkJaWYgKGF0dHIuZ2V0T3duZXJFbGVtZW50KCkgIT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICh0aGlzLmF0dHJOb2RlcyA9PSBudWxsKQotCQkJdGhpcy5hdHRyTm9kZXMgPSBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0JCXRoaXMuYXR0ck5vZGVzLmluc2VydE5vZGUoYXR0ciwgaW5kZXgpOwotCQlhdHRyLnNldE93bmVyRWxlbWVudCh0aGlzKTsKLQotCQlub3RpZnlBdHRyUmVwbGFjZWQoYXR0ciwgbnVsbCk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIGluc2VydEJlZm9yZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gcmVmQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBpbnNlcnRCZWZvcmUoTm9kZSBuZXdDaGlsZCwgTm9kZSByZWZDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIHNob3VsZCB0aHJvdyBET01FeGNlcHRpb24gaW5zdGVhZCBvZiByZXR1cm4gbnVsbD8KLQkJaWYgKG5ld0NoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCFpc0NvbnRhaW5lcigpKSB7IC8vIG5ldmVyIGJlIGNvbnRhaW5lcgotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWlmIChuZXdDaGlsZC5nZXROb2RlVHlwZSgpICE9IFRFWFRfTk9ERSkgewotCQkJaWYgKGlzSlNQQ29udGFpbmVyKCkgfHwgaXNDREFUQUNvbnRhaW5lcigpKSB7IC8vIGFjY2VwdHMgb25seQotCQkJCS8vIFRleHQKLQkJCQkvLyBjaGlsZAotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCByZWZDaGlsZCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDREFUQUNvbnRhaW5lcigpIHsKLQkJLy8gdXNlIEJsb2NrTWFrZXIgaW5zdGVhZCBvZiBDTUVsZW1lbnREZWNsYXJhdGlvbgotCQkvLyBiZWNhdXNlIDxzdHlsZT4gYW5kIDxzY3JpcHQ+IGluIFhIVE1MIGlzIG5vdCBDREFUQSBjb250ZW50IHR5cGUKLQkJSURPTU1vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7IC8vIGVycm9yCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsgLy8gZXJvcgotCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpOwotCQlpZiAocGFyc2VyID09IG51bGwgfHwgIShwYXJzZXIgaW5zdGFuY2VvZiBYTUxTb3VyY2VQYXJzZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKCgoWE1MU291cmNlUGFyc2VyKSBwYXJzZXIpLmdldEJsb2NrTWFya2VyKHRoaXMudGFnTmFtZSkgIT0gbnVsbCk7Ci0JCS8qCi0JCSAqIENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXREZWNsYXJhdGlvbigpOyBpZiAoZGVjbCA9PSBudWxsKQotCQkgKiByZXR1cm4gZmFsc2U7IGlmIChkZWNsIGluc3RhbmNlb2YgQ01Ob2RlV3JhcHBlcikgeyBkZWNsID0KLQkJICogKENNRWxlbWVudERlY2xhcmF0aW9uKSgoQ01Ob2RlV3JhcHBlcilkZWNsKS5nZXRPcmlnaW5Ob2RlKCk7IGlmCi0JCSAqIChkZWNsID09IG51bGwpIHJldHVybiBmYWxzZTsgfSBpZiAoZGVjbCBpbnN0YW5jZW9mCi0JCSAqIFRMREVsZW1lbnREZWNsYXJhdGlvbikgeyBTdHJpbmcgY29udGVudCA9Ci0JCSAqICgoVExERWxlbWVudERlY2xhcmF0aW9uKWRlY2wpLmdldEJvZHljb250ZW50KCk7IGlmIChjb250ZW50ID09Ci0JCSAqIG51bGwpIHJldHVybiBmYWxzZTsgcmV0dXJuCi0JCSAqIGNvbnRlbnQuZXF1YWxzKEpTUDExVExETmFtZXMuQ09OVEVOVF9UQUdERVBFTkRFTlQpOyB9IGlmCi0JCSAqICghaXNHbG9iYWxUYWcoKSkgcmV0dXJuIGZhbHNlOyByZXR1cm4gKGRlY2wuZ2V0Q29udGVudFR5cGUoKSA9PQotCQkgKiBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQSk7Ci0JCSAqLwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQkJaWYgKGlzRW1wdHlUYWcoKSB8fCAhaXNDb250YWluZXIoKSkgewotCQkJZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCXJldHVybiB0cnVlOyAvLyB3aWxsIGJlIGdlbmVyYXRlZAotCQl9Ci0JCWVsc2UgewotCQkJZmxhdE5vZGUgPSBnZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsgLy8gbXVzdCBiZSBnZW5lcmF0ZWQKLQkJfQotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0TGFzdFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQlpZiAoaXNDb21tZW50VGFnKCkpIHsKLQkJCXJldHVybiAoaXNOZXN0ZWRDbG9zZWRDb21tZW50KHJlZ2lvblR5cGUpIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRSk7Ci0JCX0KLQkJaWYgKGlzSlNQVGFnKCkpIHsKLQkJCXJldHVybiBpc05lc3RlZENsb3NlZChyZWdpb25UeXBlKTsKLQkJfQotCQlyZXR1cm4gKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ2xvc2VkKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDbG9zZWRDb21tZW50KFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDb21tZW50VGFnKCkgewotCQlyZXR1cm4gdGhpcy5pc0NvbW1lbnRUYWc7Ci0JfQotCi0JLyoqCi0JICogaXNDb250YWluZXIgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIoKSB7Ci0JCWlmIChpc0NvbW1lbnRUYWcoKSkgewotCQkJQ29tbWVudEVsZW1lbnRBZGFwdGVyIGFkYXB0ZXIgPSAoQ29tbWVudEVsZW1lbnRBZGFwdGVyKSBnZXRBZGFwdGVyRm9yKENvbW1lbnRFbGVtZW50QWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIChhZGFwdGVyLmlzQ29udGFpbmVyKCkpOwotCQkJfQotCQkJcmV0dXJuIChnZXREZWNsYXJhdGlvbigpID09IG51bGwpOwotCQl9Ci0JCWlmIChpc0pTUFRhZygpKSB7Ci0JCQkvLyBleGNsdWRlIEpTUCBkaXJlY3RpdmUKLQkJCXJldHVybiAobWF0Y2hUYWdOYW1lKEpTUFRhZy5KU1BfU0NSSVBUTEVUKSB8fCBtYXRjaFRhZ05hbWUoSlNQVGFnLkpTUF9ERUNMQVJBVElPTikgfHwgbWF0Y2hUYWdOYW1lKEpTUFRhZy5KU1BfRVhQUkVTU0lPTikpOwotCQl9Ci0JCWlmICghaXNYTUxUYWcoKSkgeyAvLyBub24tWE1MIHRhZwotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldERlY2xhcmF0aW9uKCk7Ci0JCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsgLy8gdW5kZWZpbmVkIHRhZwotCQkJcmV0dXJuIChkZWNsLmdldENvbnRlbnRUeXBlKCkgIT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGlzRW1wdHlUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eVRhZygpIHsKLQkJaWYgKGlzSlNQVGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChpc0NvbW1lbnRUYWcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFpc1hNTFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdGhpcy5pc0VtcHR5VGFnOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5kVGFnKCkgewotCQlyZXR1cm4gKGhhc0VuZFRhZygpICYmICFoYXNTdGFydFRhZygpICYmICFoYXNDaGlsZE5vZGVzKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2xvYmFsVGFnKCkgewotCQlyZXR1cm4gIWhhc1ByZWZpeCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW1wbGljaXRUYWcoKSB7Ci0JCWlmIChoYXNTdGFydFRhZygpIHx8IGhhc0VuZFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBtYWtlIHN1cmUgdGhpcyBpcyBpbiB0aGUgZG9jdW1lbnQgdHJlZQotCQkvLyBiZWNhdXNlIGlmIG5vdCBpbiB0aGUgZG9jdW1lbnQgdHJlZSwgbm8gdGFncyBhcmUgZ2VuZXJhdGVkIHlldAotCQlyZXR1cm4gKGdldENvbnRhaW5lckRvY3VtZW50KCkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNKU1BDb250YWluZXIoKSB7Ci0JCXJldHVybiAoaXNKU1BUYWcoKSAmJiAhaXNDb21tZW50VGFnKCkgJiYgaXNDb250YWluZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogaXNKU1BUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNKU1BUYWcoKSB7Ci0JCXJldHVybiB0aGlzLmlzSlNQVGFnOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RhcnRUYWdDbG9zZWQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gd2lsbCBiZSBnZW5lcmF0ZWQKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJaWYgKGlzQ29tbWVudFRhZygpKSB7Ci0JCQlyZXR1cm4gKGlzTmVzdGVkQ2xvc2VkQ29tbWVudChyZWdpb25UeXBlKSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UpOwotCQl9Ci0JCWlmIChpc0pTUFRhZygpKSB7Ci0JCQlpZiAoaXNDb250YWluZXIoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsgLy8gc3RhcnQgdGFnIGFsd2F5cyBoYXMgYSBzaW5nbGUgcmVnaW9uCi0JCQlyZXR1cm4gaXNDbG9zZWROZXN0ZWREaXJlY3RpdmUocmVnaW9uVHlwZSk7Ci0JCX0KLQkJcmV0dXJuIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nsb3NlZE5lc3RlZERpcmVjdGl2ZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzWE1MVGFnKCkgewotCQlpZiAoaXNKU1BUYWcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlzQ29tbWVudFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsICYmICFkb2N1bWVudC5pc1hNTFR5cGUoKSkgewotCQkJLy8gZXZlbiBpbiBub24tWE1MIGRvY3VtZW50LCBpZiBoYXZpbmcgcHJlZml4LCBpdCdzIFhNTCB0YWcKLQkJCXJldHVybiBoYXNQcmVmaXgoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaEVuZFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQkJaWYgKGlzSlNQVGFnKCkgJiYgIWlzQ29tbWVudFRhZygpKSB7Ci0JCQlyZXR1cm4gKGltcGwuaXNKU1BUYWcoKSAmJiAhaW1wbC5pc0NvbW1lbnRUYWcoKSk7Ci0JCX0KLQkJcmV0dXJuIG1hdGNoVGFnTmFtZShlbGVtZW50LmdldFRhZ05hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogbWF0Y2hUYWdOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hUYWdOYW1lKFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gKHRoaXMudGFnTmFtZSA9PSBudWxsKTsKLQkJaWYgKHRoaXMudGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWlnbm9yZUNhc2UoKSkKLQkJCXJldHVybiB0aGlzLnRhZ05hbWUuZXF1YWxzKHRhZ05hbWUpOwotCQlyZXR1cm4gdGhpcy50YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm90aWZ5QXR0clJlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuZXdBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG9sZEF0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlBdHRyUmVwbGFjZWQoQXR0ciBuZXdBdHRyLCBBdHRyIG9sZEF0dHIpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURPTU1vZGVsSW1wbCBtb2RlbCA9IChET01Nb2RlbEltcGwpIGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5hdHRyUmVwbGFjZWQodGhpcywgbmV3QXR0ciwgb2xkQXR0cik7Ci0JfQotCi0JLyoqCi0JICogbm90aWZ5VmFsdWVDaGFuZ2VkIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUVuZFRhZ0NoYW5nZWQoKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwuZW5kVGFnQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlTdGFydFRhZ0NoYW5nZWQoKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwuc3RhcnRUYWdDaGFuZ2VkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHByZWZlckVtcHR5VGFnKCkgewotCQlpZiAoaGFzQ2hpbGROb2RlcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoaXNKU1BUYWcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlzQ29tbWVudFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWlzWE1MVGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXREZWNsYXJhdGlvbigpOwotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKGRlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQXR0cmlidXRlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmVtb3ZlQXR0cmlidXRlTm9kZShuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVBdHRyaWJ1dGVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uQXR0cgotCSAqIEBwYXJhbSBvbGRBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICovCi0JcHVibGljIEF0dHIgcmVtb3ZlQXR0cmlidXRlTm9kZShBdHRyIG9sZEF0dHIpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAob2xkQXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGludmFsaWQgcGFyYW1ldGVyCi0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkgeyAvLyBubyBhdHRyaWJ1dGUKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9GT1VORF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciAhPSBvbGRBdHRyKQotCQkJCWNvbnRpbnVlOwotCi0JCQkvLyBmb3VuZAotCQkJdGhpcy5hdHRyTm9kZXMucmVtb3ZlTm9kZShpKTsKLQkJCWF0dHIuc2V0T3duZXJFbGVtZW50KG51bGwpOwotCi0JCQlub3RpZnlBdHRyUmVwbGFjZWQobnVsbCwgYXR0cik7Ci0JCQlyZXR1cm4gYXR0cjsKLQkJfQotCi0JCS8vIG5vdCBmb3VuZAotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfRk9VTkRfRVJSLCBuZXcgU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZUF0dHJpYnV0ZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQXR0ciByZW1vdmVBdHRyaWJ1dGVOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBwYXJhbWV0ZXIKLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm8gYXR0cmlidXRlCi0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKCFhdHRyLm1hdGNoTmFtZShuYW1lKSkKLQkJCQljb250aW51ZTsKLQotCQkJLy8gZm91bmQKLQkJCXRoaXMuYXR0ck5vZGVzLnJlbW92ZU5vZGUoaSk7Ci0JCQlhdHRyLnNldE93bmVyRWxlbWVudChudWxsKTsKLQotCQkJbm90aWZ5QXR0clJlcGxhY2VkKG51bGwsIGF0dHIpOwotCQkJcmV0dXJuIGF0dHI7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEF0dHIgcmVtb3ZlQXR0cmlidXRlTm9kZU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBwYXJhbWV0ZXIKLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm8gYXR0cmlidXRlCi0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGF0dHIuZ2V0TG9jYWxOYW1lKCk7Ci0JCQlpZiAobG9jYWxOYW1lID09IG51bGwgfHwgIWxvY2FsTmFtZS5lcXVhbHMobmFtZSkpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgbnNVUkkgPSBhdHRyLmdldE5hbWVzcGFjZVVSSSgpOwotCQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQkJaWYgKG5zVVJJICE9IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKG5zVVJJID09IG51bGwgfHwgIW5zVVJJLmVxdWFscyh1cmkpKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gZm91bmQKLQkJCXRoaXMuYXR0ck5vZGVzLnJlbW92ZU5vZGUoaSk7Ci0JCQlhdHRyLnNldE93bmVyRWxlbWVudChudWxsKTsKLQotCQkJbm90aWZ5QXR0clJlcGxhY2VkKG51bGwsIGF0dHIpOwotCQkJcmV0dXJuIGF0dHI7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZW1vdmVBdHRyaWJ1dGVOb2RlTlModXJpLCBuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVBdHRyaWJ1dGVzIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZXMoKSB7Ci0JCWlmICh0aGlzLmF0dHJOb2RlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaW50IGxlbmd0aCA9IHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSB0aGlzLmF0dHJOb2Rlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCWF0dHIuc2V0T3duZXJFbGVtZW50KG51bGwpOwotCQkJCW5vdGlmeUF0dHJSZXBsYWNlZChudWxsLCBhdHRyKTsKLQkJCX0KLQkJfQotCi0JCXRoaXMuYXR0ck5vZGVzID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVFbmRUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnQgcmVtb3ZlRW5kVGFnKCkgewotCQlpZiAoIWhhc0VuZFRhZygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGVMaXN0SW1wbCBhdHRyTm9kZXMgPSB0aGlzLmF0dHJOb2RlczsKLQkJdGhpcy5hdHRyTm9kZXMgPSBudWxsOyAvLyBub3QgdG8gY29weSBhdHRyaWJ1dGVzCi0JCUVsZW1lbnRJbXBsIGVuZCA9IChFbGVtZW50SW1wbCkgY2xvbmVOb2RlKGZhbHNlKTsKLQkJdGhpcy5hdHRyTm9kZXMgPSBhdHRyTm9kZXM7Ci0JCWlmIChlbmQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIG1vdmUgdGhlIGVuZCBmbGF0IG5vZGUgdG8gdGhlIGVuZCB0YWcKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlzZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCWVuZC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlyZXR1cm4gZW5kOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVN0YXJ0VGFnKCkgewotCQlyZW1vdmVBdHRyaWJ1dGVzKCk7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIGF0dHJpYnV0ZSB2YWx1ZXMgZnJvbSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLgotCSAqLwotCXZvaWQgcmVzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCkgewotCQlpZiAodGhpcy5hdHRyTm9kZXMgIT0gbnVsbCkgewotCQkJaW50IGxlbmd0aCA9IHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJYXR0ci5yZXNldFJlZ2lvbnMoKTsKLQkJCX0KLQkJfQotCi0JCXN1cGVyLnJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOyAvLyBmb3IgY2hpbGRyZW4KLQotCQl0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogc2V0QXR0cmlidXRlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJQXR0ciBhdHRyID0gZ2V0QXR0cmlidXRlTm9kZShuYW1lKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJYXR0ci5zZXRWYWx1ZSh2YWx1ZSk7IC8vIGNoYW5nZSB2YWx1ZQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gbmV3IGF0dHJpYnV0ZQotCQlEb2N1bWVudCBkb2MgPSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJYXR0ciA9IGRvYy5jcmVhdGVBdHRyaWJ1dGUobmFtZSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWF0dHIuc2V0VmFsdWUodmFsdWUpOwotCQlhcHBlbmRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCX0KLQotCS8qKgotCSAqIHNldEF0dHJpYnV0ZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG5ld0F0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQlwdWJsaWMgQXR0ciBzZXRBdHRyaWJ1dGVOb2RlKEF0dHIgbmV3QXR0cikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdBdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gbm90aGluZyB0byBkbwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgbmV3QXR0cjsKLQkJRWxlbWVudCBvd25lciA9IGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCWlmIChvd25lciAhPSBudWxsKSB7Ci0JCQlpZiAob3duZXIgPT0gdGhpcykKLQkJCQlyZXR1cm4gbnVsbDsgLy8gbm90aGluZyB0byBkbwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5VU0VfQVRUUklCVVRFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCUF0dHIgb2xkQXR0ciA9IHJlbW92ZUF0dHJpYnV0ZU5vZGUobmV3QXR0ci5nZXROYW1lKCkpOwotCQlhcHBlbmRBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQlyZXR1cm4gb2xkQXR0cjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQXR0ciBzZXRBdHRyaWJ1dGVOb2RlTlMoQXR0ciBuZXdBdHRyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld0F0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBub3RoaW5nIHRvIGRvCi0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBuZXdBdHRyOwotCQlFbGVtZW50IG93bmVyID0gYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJaWYgKG93bmVyICE9IG51bGwpIHsKLQkJCWlmIChvd25lciA9PSB0aGlzKQotCQkJCXJldHVybiBudWxsOyAvLyBub3RoaW5nIHRvIGRvCi0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlVTRV9BVFRSSUJVVEVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIG5hbWUgPSBuZXdBdHRyLmdldExvY2FsTmFtZSgpOwotCQlTdHJpbmcgdXJpID0gbmV3QXR0ci5nZXROYW1lc3BhY2VVUkkoKTsKLQkJQXR0ciBvbGRBdHRyID0gcmVtb3ZlQXR0cmlidXRlTm9kZU5TKHVyaSwgbmFtZSk7Ci0JCWFwcGVuZEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCXJldHVybiBvbGRBdHRyOwotCX0KLQotCS8qKgotCSAqIElTU1VFOiB3ZSBzaG91bGQgY2hlY2sgZm9yIGFuZCB0aHJvdyBOQU1FU1BBQ0VfRVJSLCBhY2NvcmRpbmcgdG8gc3BlYy4gCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIHF1YWxpZmllZE5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChxdWFsaWZpZWROYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzOTU1MgotCQkvLyBmaXggcHJvdmlkZWQgYnkgVmFsZW50aW4gQmFjaXUKLQkJaW50IGluZGV4ID0gcXVhbGlmaWVkTmFtZS5pbmRleE9mKCc6Jyk7Ci0JCVN0cmluZyBsb2NhbE5hbWUgPSBpbmRleCAhPSAtMSA/IHF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSkgOiBxdWFsaWZpZWROYW1lOwotCi0JCUF0dHIgYXR0ciA9IGdldEF0dHJpYnV0ZU5vZGVOUyh1cmksIGxvY2FsTmFtZSk7Ci0JCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCWF0dHIuc2V0VmFsdWUodmFsdWUpOyAvLyBjaGFuZ2UgdmFsdWUKLQkJfQotCQllbHNlIHsKLQotCQkJLy8gbmV3IGF0dHJpYnV0ZQotCQkJRG9jdW1lbnQgZG9jID0gZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQkJYXR0ciA9IGRvYy5jcmVhdGVBdHRyaWJ1dGVOUyh1cmksIHF1YWxpZmllZE5hbWUpOwotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCQkJCWFwcGVuZEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tbWVudFRhZyhib29sZWFuIGlzQ29tbWVudFRhZykgewotCQlJRE9NTm9kZSBwYXJlbnQgPSAoSURPTU5vZGUpIGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCXRoaXMuaXNDb21tZW50VGFnID0gaXNDb21tZW50VGFnOwotCX0KLQotCS8qKgotCSAqIHNldEVtcHR5VGFnIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBpc0VtcHR5VGFnCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW1wdHlUYWcoYm9vbGVhbiBpc0VtcHR5VGFnKSB7Ci0JCUlET01Ob2RlIHBhcmVudCA9IChJRE9NTm9kZSkgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5pc0NoaWxkRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5pc0VtcHR5VGFnID0gaXNFbXB0eVRhZzsKLQl9Ci0KLQkvKioKLQkgKiBzZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGZsYXROb2RlCi0JICovCi0Jdm9pZCBzZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQl0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGZsYXROb2RlOwotCi0JCU5vZGVDb250YWluZXIgcGFyZW50ID0gKE5vZGVDb250YWluZXIpIGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuc3luY0NoaWxkRWRpdGFibGVTdGF0ZSh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHNldEpTUFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gaXNKU1BUYWcKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKU1BUYWcoYm9vbGVhbiBpc0pTUFRhZykgewotCQlJRE9NTm9kZSBwYXJlbnQgPSAoSURPTU5vZGUpIGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCXRoaXMuaXNKU1BUYWcgPSBpc0pTUFRhZzsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotCQl0aGlzLm5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQsIGJvb2xlYW4gZGVlcCkgewotCQlzdXBlci5zZXRPd25lckRvY3VtZW50KG93bmVyRG9jdW1lbnQsIGRlZXApOwotCi0JCWlmICh0aGlzLmF0dHJOb2RlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWludCBsZW5ndGggPSB0aGlzLmF0dHJOb2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgdGhpcy5hdHRyTm9kZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlhdHRyLnNldE93bmVyRG9jdW1lbnQob3duZXJEb2N1bWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCUlET01Ob2RlIHBhcmVudCA9IChJRE9NTm9kZSkgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5pc0NoaWxkRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaW50IHByZWZpeExlbmd0aCA9IChwcmVmaXggIT0gbnVsbCA/IHByZWZpeC5sZW5ndGgoKSA6IDApOwotCQlTdHJpbmcgbG9jYWxOYW1lID0gZ2V0TG9jYWxOYW1lKCk7Ci0JCWlmIChwcmVmaXhMZW5ndGggPT0gMCkgewotCQkJaWYgKGxvY2FsTmFtZSA9PSBudWxsIHx8IGxvY2FsTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJLy8gaW52YWxpZCBsb2NhbCBuYW1lCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJc2V0VGFnTmFtZShsb2NhbE5hbWUpOwotCQl9Ci0JCWVsc2UgewotCQkJaW50IGxvY2FsTGVuZ3RoID0gKGxvY2FsTmFtZSAhPSBudWxsID8gbG9jYWxOYW1lLmxlbmd0aCgpIDogMCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihwcmVmaXhMZW5ndGggKyAxICsgbG9jYWxMZW5ndGgpOwotCQkJYnVmZmVyLmFwcGVuZChwcmVmaXgpOwotCQkJYnVmZmVyLmFwcGVuZCgnOicpOwotCQkJaWYgKGxvY2FsTmFtZSAhPSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQobG9jYWxOYW1lKTsKLQkJCXNldFRhZ05hbWUoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJYm9vbGVhbiBjaGFuZ2VFbmRUYWcgPSBoYXNFbmRUYWcoKTsKLQkJbm90aWZ5U3RhcnRUYWdDaGFuZ2VkKCk7Ci0JCWlmIChjaGFuZ2VFbmRUYWcpCi0JCQlub3RpZnlFbmRUYWdDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGZsYXROb2RlCi0JICovCi0Jdm9pZCBzZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogc2V0VGFnTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFRhZ05hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJdGhpcy50YWdOYW1lID0gdGFnTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiB0b1N0cmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgdGFnTmFtZSA9IGdldFRhZ05hbWUoKTsKLQkJaWYgKGhhc1N0YXJ0VGFnKCkpCi0JCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCQlpZiAoaXNFbXB0eVRhZygpKQotCQkJYnVmZmVyLmFwcGVuZCgnLycpOwotCQlpZiAoaGFzRW5kVGFnKCkpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJy8nKTsKLQkJCWJ1ZmZlci5hcHBlbmQodGFnTmFtZSk7Ci0JCX0KLQkJaWYgKGJ1ZmZlci5sZW5ndGgoKSA9PSAwKQotCQkJYnVmZmVyLmFwcGVuZCh0YWdOYW1lKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJ0AnKTsKLQkJCWJ1ZmZlci5hcHBlbmQoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24udG9TdHJpbmcoKSk7Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBnZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCdAJyk7Ci0JCQlidWZmZXIuYXBwZW5kKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkQXR0cmlidXRlKFN0cmluZyBuYW1lLCBib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGVOb2RlKEF0dHIgaWRBdHRyLCBib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VudGl0eUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRW50aXR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjQ1NDZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHk7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLS8qKgotICogRW50aXR5SW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5SW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgRW50aXR5IHsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIG5vdGF0aW9uTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgcHVibGljSWQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHN5c3RlbUlkID0gbnVsbDsKLQotCS8qKgotCSAqIEVudGl0eUltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRW50aXR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBFbnRpdHlJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIEVudGl0eUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgRW50aXR5SW1wbChFbnRpdHlJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5uYW1lID0gdGhhdC5uYW1lOwotCQkJdGhpcy5wdWJsaWNJZCA9IHRoYXQucHVibGljSWQ7Ci0JCQl0aGlzLnN5c3RlbUlkID0gdGhhdC5zeXN0ZW1JZDsKLQkJCXRoaXMubm90YXRpb25OYW1lID0gdGhhdC5ub3RhdGlvbk5hbWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUVudGl0eUltcGwgY2xvbmVkID0gbmV3IEVudGl0eUltcGwodGhpcyk7Ci0JCW5vdGlmeVVzZXJEYXRhSGFuZGxlcnMoVXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVELCBjbG9uZWQpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgdGV4dCBkZWNsYXJhdGlvbiwgdGhlIGVuY29kaW5nCi0JICogb2YgdGhpcyBlbnRpdHksIHdoZW4gaXQgaXMgYW4gZXh0ZXJuYWwgcGFyc2VkIGVudGl0eS4gVGhpcyBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIEVOVElUWV9OT0RFOwotCX0KLQotCS8qKgotCSAqIGdldE5vdGF0aW9uTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubm90YXRpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIGdldFB1YmxpY0lkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0JCXJldHVybiB0aGlzLnB1YmxpY0lkOwotCX0KLQotCS8qKgotCSAqIGdldFN5c3RlbUlkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0JCXJldHVybiB0aGlzLnN5c3RlbUlkOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgdGV4dCBkZWNsYXJhdGlvbiwgdGhlIHZlcnNpb24KLQkgKiBudW1iZXIgb2YgdGhpcyBlbnRpdHksIHdoZW4gaXQgaXMgYW4gZXh0ZXJuYWwgcGFyc2VkIGVudGl0eS4gVGhpcyBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSB0ZXh0IGRlY2xhcmF0aW9uLCB0aGUgZW5jb2RpbmcKLQkgKiBvZiB0aGlzIGVudGl0eSwgd2hlbiBpdCBpcyBhbiBleHRlcm5hbCBwYXJzZWQgZW50aXR5LiBUaGlzIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhqYXZhLmxhbmcuU3RyaW5nIGVuY29kaW5nKSB7Ci0JfQotCi0JLyoqCi0JICogc2V0TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBzZXROb3RhdGlvbk5hbWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vdGF0aW9uTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGF0aW9uTmFtZShTdHJpbmcgbm90YXRpb25OYW1lKSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5ub3RhdGlvbk5hbWUgPSBub3RhdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogc2V0UHVibGljSWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSWQoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5wdWJsaWNJZCA9IHB1YmxpY0lkOwotCX0KLQotCS8qKgotCSAqIHNldFN5c3RlbUlkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBzeXN0ZW1JZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBzeXN0ZW1JZCkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCXRoaXMuc3lzdGVtSWQgPSBzeXN0ZW1JZDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcsIGFzIHBhcnQgb2YgdGhlIHRleHQgZGVjbGFyYXRpb24sIHRoZSB2ZXJzaW9uCi0JICogbnVtYmVyIG9mIHRoaXMgZW50aXR5LCB3aGVuIGl0IGlzIGFuIGV4dGVybmFsIHBhcnNlZCBlbnRpdHkuIFRoaXMgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oamF2YS5sYW5nLlN0cmluZyB2ZXJzaW9uKSB7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbnB1dEVuY29kaW5nKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0WG1sRW5jb2RpbmcoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFhtbFZlcnNpb24oKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VudGl0eVJlZmVyZW5jZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRW50aXR5UmVmZXJlbmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGE4MDcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRW50aXR5UmVmZXJlbmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICogICAgIEJhbGF6cyBCYW5mYWk6IEJ1ZyAxNTQ3MzcgZ2V0VXNlckRhdGEvc2V0VXNlckRhdGEgc3VwcG9ydCBmb3IgTm9kZQotICogICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ3MzcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi0vKioKLSAqIEVudGl0eVJlZmVyZW5jZSBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5UmVmZXJlbmNlSW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgRW50aXR5UmVmZXJlbmNlIHsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotCi0JLyoqCi0JICogRW50aXR5UmVmZXJlbmNlSW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBFbnRpdHlSZWZlcmVuY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEVudGl0eVJlZmVyZW5jZUltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgRW50aXR5UmVmZXJlbmNlSW1wbAotCSAqLwotCXByb3RlY3RlZCBFbnRpdHlSZWZlcmVuY2VJbXBsKEVudGl0eVJlZmVyZW5jZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLm5hbWUgPSB0aGF0Lm5hbWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUVudGl0eVJlZmVyZW5jZUltcGwgY2xvbmVkID0gbmV3IEVudGl0eVJlZmVyZW5jZUltcGwodGhpcyk7Ci0JCW5vdGlmeVVzZXJEYXRhSGFuZGxlcnMoVXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVELCBjbG9uZWQpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIEVOVElUWV9SRUZFUkVOQ0VfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBzZXROYW1lIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhM2EwNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKiBUaHJvd24gYW4gaW52YWxpZCBjaGFyYWN0ZXIgaXMgc3BlY2lmaWVkIGluIDogWE1MTm9kZSNzZXRTb3VyY2UoU3RyaW5nKQotICovCi1wdWJsaWMgY2xhc3MgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBjaGFyIGludmFsaWRDaGFyID0gMDsKLQlwcml2YXRlIGludCBvZmZzZXQgPSAtMTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uKFN0cmluZyBzLCBjaGFyIGMpIHsKLQkJc3VwZXIocyk7Ci0JCXRoaXMuaW52YWxpZENoYXIgPSBjOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uKFN0cmluZyBzLCBjaGFyIGMsIGludCBvZmZzZXQpIHsKLQkJc3VwZXIocyk7Ci0JCXRoaXMuaW52YWxpZENoYXIgPSBjOwotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgY2hhciBnZXRJbnZhbGlkQ2hhcigpIHsKLQkJcmV0dXJuIHRoaXMuaW52YWxpZENoYXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB0aGlzLm9mZnNldDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUFRhZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9KU1BUYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyZGU0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLS8qKgotICogSlNQVGFnIGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTUFRhZyB7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0NMT1NFID0gIi0tJT4iOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfT1BFTiA9ICI8JS0tIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBERUNMQVJBVElPTl9UT0tFTiA9ICIhIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RJVkVfVE9LRU4gPSAiQCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTl9UT0tFTiA9ICI9IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfREVDTEFSQVRJT04gPSAianNwOmRlY2xhcmF0aW9uIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFID0gImpzcDpkaXJlY3RpdmUiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9FWFBSRVNTSU9OID0gImpzcDpleHByZXNzaW9uIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUk9PVCA9ICJqc3A6cm9vdCI7Ly8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfU0NSSVBUTEVUID0gImpzcDpzY3JpcHRsZXQiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DTE9TRSA9ICIlPiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX09QRU4gPSAiPCUiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTW9kZWxQYXJzZXJBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L01vZGVsUGFyc2VyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjdlMTNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTW9kZWxQYXJzZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBNb2RlbFBhcnNlckFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQmVJbXBsaWNpdFRhZyhFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQmVJbXBsaWNpdFRhZyhFbGVtZW50IGVsZW1lbnQsIE5vZGUgY2hpbGQpOwotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQ29udGFpbihFbGVtZW50IGVsZW1lbnQsIE5vZGUgY2hpbGQpOwotCi0JLyoqCi0JICovCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlQ29tbWVudEVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUltcGxpY2l0RWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpOwotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaW5kUm9vdE5hbWUoU3RyaW5nIHRhZ05hbWUpOwotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmRUYWcoSURPTUVsZW1lbnQgZWxlbWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vZGVDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjUzMTYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqIE5vZGVDb250YWluZXIgY2xhc3MKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5vZGVDb250YWluZXIgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIE5vZGUsIE5vZGVMaXN0IHsKLQotCS8qKgotCSAqLwotCXByaXZhdGUgY2xhc3MgQ2hpbGROb2Rlc0NhY2hlIGltcGxlbWVudHMgTm9kZUxpc3QgewotCQlwcml2YXRlIE5vZGUgY3VyQ2hpbGQgPSBudWxsOwotCQlwcml2YXRlIGludCBjdXJJbmRleCA9IC0xOwotCQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCi0JCUNoaWxkTm9kZXNDYWNoZSgpIHsKLQkJCWluaXRpYWxpemVDYWNoZSgpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQkvLyBhdG9taWMKLQkJCXJldHVybiB0aGlzLmxlbmd0aDsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQ2FjaGUoKSB7Ci0JCQkvLyBub3RlIHdlIHVzZSB0aGUgb3V0dGVyIG9iamVjdHMgbG9ja29iamVjdAotCQkJLy8gKHNpbmNlIHdlIGFyZSB1c2luZyB0aGVpciAiY2hpbGRyZW4iLgotCQkJc3luY2hyb25pemVkIChsb2NrT2JqZWN0KSB7Ci0JCQkJZm9yIChOb2RlIGNoaWxkID0gZmlyc3RDaGlsZDsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCXRoaXMubGVuZ3RoKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIE5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCXN5bmNocm9uaXplZCAobG9ja09iamVjdCkgewotCQkJCWlmICh0aGlzLmxlbmd0aCA9PSAwKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlpZiAoaW5kZXggPCAwKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlpZiAoaW5kZXggPj0gdGhpcy5sZW5ndGgpCi0JCQkJCXJldHVybiBudWxsOwotCi0JCQkJaWYgKHRoaXMuY3VySW5kZXggPCAwKSB7IC8vIGZpcnN0IHRpbWUKLQkJCQkJaWYgKGluZGV4ICogMiA+PSB0aGlzLmxlbmd0aCkgeyAvLyBzZWFyY2ggZnJvbSB0aGUgbGFzdAotCQkJCQkJdGhpcy5jdXJJbmRleCA9IHRoaXMubGVuZ3RoIC0gMTsKLQkJCQkJCXRoaXMuY3VyQ2hpbGQgPSBsYXN0Q2hpbGQ7Ci0JCQkJCX0gZWxzZSB7IC8vIHNlYXJjaCBmcm9tIHRoZSBmaXJzdAotCQkJCQkJdGhpcy5jdXJJbmRleCA9IDA7Ci0JCQkJCQl0aGlzLmN1ckNoaWxkID0gZmlyc3RDaGlsZDsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChpbmRleCA9PSB0aGlzLmN1ckluZGV4KQotCQkJCQlyZXR1cm4gdGhpcy5jdXJDaGlsZDsKLQotCQkJCWlmIChpbmRleCA+IHRoaXMuY3VySW5kZXgpIHsKLQkJCQkJd2hpbGUgKGluZGV4ID4gdGhpcy5jdXJJbmRleCkgewotCQkJCQkJdGhpcy5jdXJJbmRleCsrOwotCQkJCQkJdGhpcy5jdXJDaGlsZCA9IHRoaXMuY3VyQ2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7IC8vIGluZGV4IDwgdGhpcy5jdXJJbmRleAotCQkJCQl3aGlsZSAoaW5kZXggPCB0aGlzLmN1ckluZGV4KSB7Ci0JCQkJCQl0aGlzLmN1ckluZGV4LS07Ci0JCQkJCQl0aGlzLmN1ckNoaWxkID0gdGhpcy5jdXJDaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiB0aGlzLmN1ckNoaWxkOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBOb2RlTGlzdCBjaGlsZE5vZGVzQ2FjaGUgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGZDaGlsZEVkaXRhYmxlID0gdHJ1ZTsKLQlOb2RlSW1wbCBmaXJzdENoaWxkID0gbnVsbDsKLQlOb2RlSW1wbCBsYXN0Q2hpbGQgPSBudWxsOwotCi0JT2JqZWN0IGxvY2tPYmplY3QgPSBuZXcgYnl0ZVswXTsKLQotCS8qKgotCSAqIE5vZGVDb250YWluZXIgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUNvbnRhaW5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb2RlQ29udGFpbmVyIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIE5vZGVDb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUNvbnRhaW5lcihOb2RlQ29udGFpbmVyIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogYXBwZW5kQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgYXBwZW5kQ2hpbGQoTm9kZSBuZXdDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBpbnNlcnRCZWZvcmUobmV3Q2hpbGQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIGNsb25lQ2hpbGROb2RlcyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmVyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbG9uZUNoaWxkTm9kZXMoTm9kZSBuZXdQYXJlbnQsIGJvb2xlYW4gZGVlcCkgewotCQlpZiAobmV3UGFyZW50ID09IG51bGwgfHwgbmV3UGFyZW50ID09IHRoaXMpCi0JCQlyZXR1cm47Ci0JCWlmICghKG5ld1BhcmVudCBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIpKQotCQkJcmV0dXJuOwotCi0JCU5vZGVDb250YWluZXIgY29udGFpbmVyID0gKE5vZGVDb250YWluZXIpIG5ld1BhcmVudDsKLQkJY29udGFpbmVyLnJlbW92ZUNoaWxkTm9kZXMoKTsKLQotCQlmb3IgKE5vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJTm9kZSBjbG9uZWQgPSBjaGlsZC5jbG9uZU5vZGUoZGVlcCk7Ci0JCQlpZiAoY2xvbmVkICE9IG51bGwpCi0JCQkJY29udGFpbmVyLmFwcGVuZENoaWxkKGNsb25lZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXRDaGlsZE5vZGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZUxpc3QKLQkgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0Rmlyc3RDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRGaXJzdENoaWxkKCkgewotCQlyZXR1cm4gdGhpcy5maXJzdENoaWxkOwotCX0KLQotCS8qKgotCSAqIGdldExhc3RDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRMYXN0Q2hpbGQoKSB7Ci0JCXJldHVybiB0aGlzLmxhc3RDaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMZW5ndGggbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJaWYgKHRoaXMuZmlyc3RDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXN5bmNocm9uaXplZCAobG9ja09iamVjdCkgewotCQkJaWYgKHRoaXMuY2hpbGROb2Rlc0NhY2hlID09IG51bGwpCi0JCQkJdGhpcy5jaGlsZE5vZGVzQ2FjaGUgPSBuZXcgQ2hpbGROb2Rlc0NhY2hlKCk7Ci0JCQlyZXR1cm4gdGhpcy5jaGlsZE5vZGVzQ2FjaGUuZ2V0TGVuZ3RoKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyBzb3VyY2UgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZChzb3VyY2UpOwotCQl9Ci0KLQkJZm9yIChOb2RlSW1wbCBjaGlsZCA9IGZpcnN0Q2hpbGQ7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gKE5vZGVJbXBsKSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlTdHJpbmcgc291cmNlID0gY2hpbGQuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZChzb3VyY2UpOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBnZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc291cmNlID0gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQoKTsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKHNvdXJjZSk7Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogaGFzQ2hpbGROb2RlcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4gKHRoaXMuZmlyc3RDaGlsZCAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRCZWZvcmUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIHJlZkNoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgaW5zZXJ0QmVmb3JlKE5vZGUgbmV3Q2hpbGQsIE5vZGUgcmVmQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAobmV3Q2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBub3RoaW5nIHRvIGRvCi0JCWlmIChyZWZDaGlsZCAhPSBudWxsICYmIHJlZkNoaWxkLmdldFBhcmVudE5vZGUoKSAhPSB0aGlzKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfRk9VTkRfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWlmICghaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlpZiAobmV3Q2hpbGQgPT0gcmVmQ2hpbGQpCi0JCQlyZXR1cm4gbmV3Q2hpbGQ7IC8vIG5vdGhpbmcgdG8gZG8KLQotCQlpZiAobmV3Q2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFKSB7Ci0JCQkvLyBpbnNlcnQgY2hpbGQgbm9kZXMgaW5zdGVhZAotCQkJZm9yIChOb2RlIGNoaWxkID0gbmV3Q2hpbGQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IG5ld0NoaWxkLmdldEZpcnN0Q2hpbGQoKSkgewotCQkJCW5ld0NoaWxkLnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQlpbnNlcnRCZWZvcmUoY2hpbGQsIHJlZkNoaWxkKTsKLQkJCX0KLQkJCXJldHVybiBuZXdDaGlsZDsKLQkJfQotCQkvLyBzeW5jaHJvbml6ZWQgaW4gY2FzZSBhbm90aGVyIHRocmVhZCBpcyBnZXR0aW5nIGl0ZW0sIG9yIGxlbmd0aAotCQlzeW5jaHJvbml6ZWQgKGxvY2tPYmplY3QpIHsKLQkJCXRoaXMuY2hpbGROb2Rlc0NhY2hlID0gbnVsbDsgLy8gaW52YWxpZGF0ZSBjaGlsZCBub2RlcyBjYWNoZQotCQl9Ci0KLQkJTm9kZUltcGwgY2hpbGQgPSAoTm9kZUltcGwpIG5ld0NoaWxkOwotCQlOb2RlSW1wbCBuZXh0ID0gKE5vZGVJbXBsKSByZWZDaGlsZDsKLQkJTm9kZUltcGwgcHJldiA9IG51bGw7Ci0JCU5vZGUgb2xkUGFyZW50ID0gY2hpbGQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAob2xkUGFyZW50ICE9IG51bGwpCi0JCQlvbGRQYXJlbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQlpZiAobmV4dCA9PSBudWxsKSB7Ci0JCQlwcmV2ID0gdGhpcy5sYXN0Q2hpbGQ7Ci0JCQl0aGlzLmxhc3RDaGlsZCA9IGNoaWxkOwotCQl9IGVsc2UgewotCQkJcHJldiA9IChOb2RlSW1wbCkgbmV4dC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCW5leHQuc2V0UHJldmlvdXNTaWJsaW5nKGNoaWxkKTsKLQkJfQotCQlpZiAocHJldiA9PSBudWxsKQotCQkJdGhpcy5maXJzdENoaWxkID0gY2hpbGQ7Ci0JCWVsc2UKLQkJCXByZXYuc2V0TmV4dFNpYmxpbmcoY2hpbGQpOwotCQljaGlsZC5zZXRQcmV2aW91c1NpYmxpbmcocHJldik7Ci0JCWNoaWxkLnNldE5leHRTaWJsaW5nKG5leHQpOwotCQljaGlsZC5zZXRQYXJlbnROb2RlKHRoaXMpOwotCQkvLyBtYWtlIHN1cmUgaGF2aW5nIHRoZSBzYW1lIG93bmVyIGRvY3VtZW50Ci0JCWlmIChjaGlsZC5nZXRPd25lckRvY3VtZW50KCkgPT0gbnVsbCkgewotCQkJaWYgKGdldE5vZGVUeXBlKCkgPT0gRE9DVU1FTlRfTk9ERSkgewotCQkJCWNoaWxkLnNldE93bmVyRG9jdW1lbnQoKERvY3VtZW50KSB0aGlzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hpbGQuc2V0T3duZXJEb2N1bWVudChnZXRPd25lckRvY3VtZW50KCkpOwotCQkJfQotCQl9Ci0KLQkJbm90aWZ5Q2hpbGRSZXBsYWNlZChjaGlsZCwgbnVsbCk7Ci0KLQkJcmV0dXJuIGNoaWxkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRFZGl0YWJsZSgpIHsKLQkJaWYgKCFmQ2hpbGRFZGl0YWJsZSkgewotCQkJRE9NTW9kZWxJbXBsIG1vZGVsID0gKERPTU1vZGVsSW1wbCkgZ2V0TW9kZWwoKTsKLQkJCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmlzUmVwYXJzaW5nKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkNoaWxkRWRpdGFibGU7Ci0JfQotCi0JLyoqCi0JICogaXNDb250YWluZXIgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGl0ZW0gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlpZiAodGhpcy5maXJzdENoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJc3luY2hyb25pemVkIChsb2NrT2JqZWN0KSB7Ci0JCQlpZiAodGhpcy5jaGlsZE5vZGVzQ2FjaGUgPT0gbnVsbCkKLQkJCQl0aGlzLmNoaWxkTm9kZXNDYWNoZSA9IG5ldyBDaGlsZE5vZGVzQ2FjaGUoKTsKLQkJCXJldHVybiB0aGlzLmNoaWxkTm9kZXNDYWNoZS5pdGVtKGluZGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIG5vdGlmeUNoaWxkUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5Q2hpbGRSZXBsYWNlZChOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXN5bmNDaGlsZEVkaXRhYmxlU3RhdGUobmV3Q2hpbGQpOwotCi0JCURPTU1vZGVsSW1wbCBtb2RlbCA9IChET01Nb2RlbEltcGwpIGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5jaGlsZFJlcGxhY2VkKHRoaXMsIG5ld0NoaWxkLCBvbGRDaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgcmVtb3ZlQ2hpbGQoTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChvbGRDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChvbGRDaGlsZC5nZXRQYXJlbnROb2RlKCkgIT0gdGhpcykgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX0ZPVU5EX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCWlmICghaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCS8vIHN5bmNocm9uaXplZCBpbiBjYXNlIGFub3RoZXIgdGhyZWFkIGlzIGdldHRpbmcgaXRlbSwgb3IgbGVuZ3RoCi0JCXN5bmNocm9uaXplZCAobG9ja09iamVjdCkgewotCQkJdGhpcy5jaGlsZE5vZGVzQ2FjaGUgPSBudWxsOyAvLyBpbnZhbGlkYXRlIGNoaWxkIG5vZGVzIGNhY2hlCi0JCX0KLQotCQlOb2RlSW1wbCBjaGlsZCA9IChOb2RlSW1wbCkgb2xkQ2hpbGQ7Ci0JCU5vZGVJbXBsIHByZXYgPSAoTm9kZUltcGwpIGNoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQlOb2RlSW1wbCBuZXh0ID0gKE5vZGVJbXBsKSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCi0JCWNoaWxkLnNldEVkaXRhYmxlKHRydWUsIHRydWUpOyAvLyBjbGVhciBSZWFkT25seSBmbGFncwotCi0JCWlmIChwcmV2ID09IG51bGwpCi0JCQl0aGlzLmZpcnN0Q2hpbGQgPSBuZXh0OwotCQllbHNlCi0JCQlwcmV2LnNldE5leHRTaWJsaW5nKG5leHQpOwotCQlpZiAobmV4dCA9PSBudWxsKQotCQkJdGhpcy5sYXN0Q2hpbGQgPSBwcmV2OwotCQllbHNlCi0JCQluZXh0LnNldFByZXZpb3VzU2libGluZyhwcmV2KTsKLQkJY2hpbGQuc2V0UHJldmlvdXNTaWJsaW5nKG51bGwpOwotCQljaGlsZC5zZXROZXh0U2libGluZyhudWxsKTsKLQkJY2hpbGQuc2V0UGFyZW50Tm9kZShudWxsKTsKLQotCQlub3RpZnlDaGlsZFJlcGxhY2VkKG51bGwsIGNoaWxkKTsKLQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQ2hpbGROb2RlcyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZE5vZGVzKCkgewotCQlpZiAoIWlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlOb2RlIG5leHRDaGlsZCA9IG51bGw7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBuZXh0Q2hpbGQpIHsKLQkJCW5leHRDaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlyZW1vdmVDaGlsZChjaGlsZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVDaGlsZE5vZGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudAotCSAqIEBwYXJhbSBmaXJzdENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGxhc3RDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBEb2N1bWVudEZyYWdtZW50IHJlbW92ZUNoaWxkTm9kZXMoTm9kZSBmaXJzdENoaWxkLCBOb2RlIGxhc3RDaGlsZCkgewotCQlpZiAoIWhhc0NoaWxkTm9kZXMoKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIWlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCWlmIChnZXROb2RlVHlwZSgpID09IERPQ1VNRU5UX05PREUpCi0JCQlkb2N1bWVudCA9IChEb2N1bWVudCkgdGhpczsKLQkJZWxzZQotCQkJZG9jdW1lbnQgPSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCURvY3VtZW50RnJhZ21lbnQgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Ci0JCWlmIChmcmFnbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKGZpcnN0Q2hpbGQgPT0gbnVsbCkKLQkJCWZpcnN0Q2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChsYXN0Q2hpbGQgPT0gbnVsbCkKLQkJCWxhc3RDaGlsZCA9IGdldExhc3RDaGlsZCgpOwotCQlOb2RlIG5leHRDaGlsZCA9IG51bGw7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IGZpcnN0Q2hpbGQ7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gbmV4dENoaWxkKSB7Ci0JCQluZXh0Q2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJcmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJZnJhZ21lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJaWYgKGNoaWxkID09IGxhc3RDaGlsZCkKLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBmcmFnbWVudDsKLQl9Ci0KLQkvKioKLQkgKiByZXBsYWNlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgcmVwbGFjZUNoaWxkKE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoIWlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpZiAob2xkQ2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXdDaGlsZDsKLQkJaWYgKG5ld0NoaWxkICE9IG51bGwpCi0JCQlpbnNlcnRCZWZvcmUobmV3Q2hpbGQsIG9sZENoaWxkKTsKLQkJcmV0dXJuIHJlbW92ZUNoaWxkKG9sZENoaWxkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGlsZEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJaWYgKGZDaGlsZEVkaXRhYmxlID09IGVkaXRhYmxlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlSZWFkT25seUNvbnRyb2xsZXIgcm9jID0gUmVhZE9ubHlDb250cm9sbGVyLmdldEluc3RhbmNlKCk7Ci0JCU5vZGUgbm9kZTsKLQkJaWYgKGVkaXRhYmxlKSB7Ci0JCQlmb3IgKG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCXJvYy51bmxvY2tOb2RlKChJRE9NTm9kZSkgbm9kZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCXJvYy5sb2NrTm9kZSgoSURPTU5vZGUpIG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJZkNoaWxkRWRpdGFibGUgPSBlZGl0YWJsZTsKLQkJbm90aWZ5RWRpdGFibGVDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY0NoaWxkRWRpdGFibGVTdGF0ZShOb2RlIGNoaWxkKSB7Ci0JCVJlYWRPbmx5Q29udHJvbGxlciByb2MgPSBSZWFkT25seUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKTsKLQkJaWYgKGZDaGlsZEVkaXRhYmxlKSB7Ci0JCQlyb2MudW5sb2NrTm9kZSgoTm9kZUltcGwpIGNoaWxkKTsKLQkJfSBlbHNlIHsKLQkJCXJvYy5sb2NrTm9kZSgoTm9kZUltcGwpIGNoaWxkKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIxOWNmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3ROb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLlR5cGVJbmZvOwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLQotLyoqCi0gKiBOb2RlSW1wbCBjbGFzcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9kZUltcGwgZXh0ZW5kcyBBYnN0cmFjdE5vdGlmaWVyIGltcGxlbWVudHMgTm9kZSwgSURPTU5vZGUgewotCS8vIGRlZmluZSBvbmUgZW1wdHkgbm9kZWxpc3QsIGZvciByZXBlYXRlZCB1c2UKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBOb2RlTGlzdCBFTVBUWV9OT0RFX0xJU1QgPSBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkRhdGFFZGl0YWJsZSA9IHRydWU7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQlwcml2YXRlIE5vZGVJbXBsIG5leHRTaWJsaW5nID0gbnVsbDsKLQotCXByaXZhdGUgRG9jdW1lbnRJbXBsIG93bmVyRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgTm9kZUltcGwgcGFyZW50Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBOb2RlSW1wbCBwcmV2aW91c1NpYmxpbmcgPSBudWxsOwotCQotCXByaXZhdGUgSGFzaHRhYmxlIHVzZXJEYXRhVGFibGU9bnVsbDsKLQotCS8qKgotCSAqIE5vZGVJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIE5vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vZGVJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIE5vZGVJbXBsCi0JICovCi0JcHJvdGVjdGVkIE5vZGVJbXBsKE5vZGVJbXBsIHRoYXQpIHsKLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5vd25lckRvY3VtZW50ID0gdGhhdC5vd25lckRvY3VtZW50OwotCQl9Ci0JfQotCi0JLyoqCi0JICogYXBwZW5kQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgYXBwZW5kQ2hpbGQoTm9kZSBuZXdDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgbmV3IFN0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb250YWlucyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiAob2Zmc2V0ID49IGdldFN0YXJ0T2Zmc2V0KCkgJiYgb2Zmc2V0IDwgZ2V0RW5kT2Zmc2V0KCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzCi0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVET01FeGNlcHRpb25NZXNzYWdlKHNob3J0IHMsIFN0cmluZyB0YWdOYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyBUT0RPOiBTaG91bGQgbG9jYWxpemUgdGhlc2UgbWVzc2FnZXMsIGFuZCBwcm92aWRlIC91IGVzY2FwZWQKLQkJLy8gdmVyc2lvbiBvZiB0YWdOYW1lCi0JCXJlc3VsdCA9IGxvb2t1cE1lc3NhZ2UocykgKyAiICIgKyB0YWdOYW1lOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0cmlidXRlcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcAotCSAqLwotCXB1YmxpYyBOYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDaGFyVmFsdWUoU3RyaW5nIG5hbWUpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZG9jdW1lbnQuZ2V0Q2hhclZhbHVlKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIGdldENoaWxkTm9kZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlTGlzdAotCSAqLwotCXB1YmxpYyBOb2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotCQkvLyBBcyBwZXIgRE9NIHNwZWMsIGNvcnJlY3QgYmVoYXZpb3IgZm9yIGdldENoaWxkTm9kZXMgaXMgdG8gcmV0dXJuIGEKLQkJLy8gemVybyBsZW5ndGggTm9kZUxpc3QsIG5vdCBudWxsLCB3aGVuIHRoZXJlIGFyZSBubyBjaGlsZHJlbi4KLQkJLy8gV2UnbGwgdXNlIGEgY29tbW9uIGluc3RhbmNlIG9mIGFuIGVtcHR5IG5vZGUgbGlzdCwganVzdCB0byBwcmV2ZW50Ci0JCS8vIGNyZWF0aW5nIGEgdHJpdmFsIG9iamVjdCBtYW55IG1hbnkgdGltZXMuCi0KLQkJcmV0dXJuIEVNUFRZX05PREVfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDb21tb25BbmNlc3RvciBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldENvbW1vbkFuY2VzdG9yKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZm9yIChOb2RlIG5hID0gbm9kZTsgbmEgIT0gbnVsbDsgbmEgPSBuYS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWZvciAoTm9kZSB0YSA9IHRoaXM7IHRhICE9IG51bGw7IHRhID0gdGEuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQkJaWYgKHRhID09IG5hKQotCQkJCQlyZXR1cm4gdGE7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JLyoqCi0JICogZ2V0Q29udGFpbmVyRG9jdW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBnZXRDb250YWluZXJEb2N1bWVudCgpIHsKLQkJZm9yIChOb2RlIG5vZGUgPSB0aGlzOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQlyZXR1cm4gKERvY3VtZW50KSBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldEVuZE9mZnNldCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlOb2RlIG5vZGUgPSB0aGlzOwotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGVsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJCQlyZXR1cm4gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQkJfQotCi0JCQlOb2RlIGxhc3QgPSBub2RlLmdldExhc3RDaGlsZCgpOwotCQkJaWYgKGxhc3QgIT0gbnVsbCkgeyAvLyBkaWcgaW50byB0aGUgbGFzdAotCQkJCW5vZGUgPSBsYXN0OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpCi0JCQkJcmV0dXJuIGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCk7Ci0KLQkJCU5vZGUgcHJldiA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQlpZiAocHJldiAhPSBudWxsKSB7IC8vIG1vdmUgdG8gdGhlIHByZXZpb3VzCi0JCQkJbm9kZSA9IHByZXY7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlub2RlID0gbnVsbDsKLQkJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBlbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQkJCX0KLQkJCQlOb2RlIHBhcmVudFByZXYgPSBwYXJlbnQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJaWYgKHBhcmVudFByZXYgIT0gbnVsbCkgeyAvLyBtb3ZlIHRvIHRoZSBwcmV2aW91cwotCQkJCQlub2RlID0gcGFyZW50UHJldjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRmFjdG9yeVJlZ2lzdHJ5IGdldEZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJSURPTU1vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCUZhY3RvcnlSZWdpc3RyeSByZWcgPSBtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJCWlmIChyZWcgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVnOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldEZpcnN0Q2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Rmlyc3RDaGlsZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0aGlzLmZsYXROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOyAvLyBlcnJvcgotCQlpbnQgaW5kZXggPSAwOwotCQlmb3IgKE5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZCA9PSB0aGlzKQotCQkJCXJldHVybiBpbmRleDsKLQkJCWluZGV4Kys7Ci0JCX0KLQkJcmV0dXJuIC0xOyAvLyBlcnJvcgotCX0KLQotCS8qKgotCSAqIGdldExhc3RDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRMYXN0Q2hpbGQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHRoaXMuZmxhdE5vZGUpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYW4ganVzdCByZWZlciB0byB0aGUgb3duaW5nIGRvY3VtZW50Ci0JICovCi0JcHVibGljIElET01Nb2RlbCBnZXRNb2RlbCgpIHsKLQkJaWYgKHRoaXMub3duZXJEb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBhbGwgYnV0IGF0dHIgcmV0dXJuIG51bGwKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TmFtZVJlZ2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE5leHRTaWJsaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldE5leHRTaWJsaW5nKCkgewotCQlyZXR1cm4gdGhpcy5uZXh0U2libGluZzsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlQXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JTm9kZSBnZXROb2RlQXQoaW50IG9mZnNldCkgewotCQlJRE9NTm9kZSBwYXJlbnQgPSB0aGlzOwotCQlJRE9NTm9kZSBjaGlsZCA9IChJRE9NTm9kZSkgZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldEVuZE9mZnNldCgpIDw9IG9mZnNldCkgewotCQkJCWNoaWxkID0gKElET01Ob2RlKSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGNoaWxkLmdldFN0YXJ0T2Zmc2V0KCkgPiBvZmZzZXQpIHsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGNoaWxkLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKSA+IG9mZnNldCkKLQkJCQkJcmV0dXJuIGNoaWxkOwotCQkJfQotCi0JCQkvLyBkaWcgbW9yZQotCQkJcGFyZW50ID0gY2hpbGQ7Ci0JCQljaGlsZCA9IChJRE9NTm9kZSkgcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJfQotCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVZhbHVlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE93bmVyRG9jdW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCkgewotCQlyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIGdldFBhcmVudE5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgZ2V0UGFyZW50Tm9kZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJldmlvdXNTaWJsaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldFByZXZpb3VzU2libGluZygpIHsKLQkJcmV0dXJuIHRoaXMucHJldmlvdXNTaWJsaW5nOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotCQlpZiAodGhpcy5mbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJcmV0dXJuIHRoaXMuZmxhdE5vZGUuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIGdldFN0YXJ0T2Zmc2V0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJaWYgKHRoaXMuZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiB0aGlzLmZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCU5vZGVJbXBsIHByZXYgPSAoTm9kZUltcGwpIGdldFByZXZpb3VzU2libGluZygpOwotCQlpZiAocHJldiAhPSBudWxsKQotCQkJcmV0dXJuIHByZXYuZ2V0RW5kT2Zmc2V0KCk7Ci0JCU5vZGUgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCWlmIChlbGVtZW50Lmhhc1N0YXJ0VGFnKCkpCi0JCQkJcmV0dXJuIGVsZW1lbnQuZ2V0U3RhcnRFbmRPZmZzZXQoKTsKLQkJCXJldHVybiBlbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCX0KLQkJLy8gZmluYWwgZmFsbGJhY2sgdG8gbG9vayBpbnRvIGZpcnN0IGNoaWxkCi0JCU5vZGVJbXBsIGNoaWxkID0gKE5vZGVJbXBsKSBnZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNoaWxkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gY2hpbGQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoY2hpbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkKLQkJCQlyZXR1cm4gY2hpbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCWNoaWxkID0gKE5vZGVJbXBsKSBjaGlsZC5nZXRGaXJzdENoaWxkKCk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCX0KLQotCS8qKgotCSAqIEV2ZXJ5IG5vZGUgKGluZGlyZWN0bHkpIGtub3dzIGl0cyBzdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBnZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gdGhpcy5mbGF0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBhbGwgYnV0IGF0dHIgcmV0dXJuIG51bGwKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0VmFsdWVSZWdpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVTb3VyY2UoKSB7Ci0JCXJldHVybiBnZXROb2RlVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogaGFzQ2hpbGROb2RlcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogaGFzUHJvcGVydGllcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0QmVmb3JlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSByZWZDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGluc2VydEJlZm9yZShOb2RlIG5ld0NoaWxkLCBOb2RlIHJlZkNoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLCBuZXcgU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBpc0NvbnRhaW5lciBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lcigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGF0YUVkaXRhYmxlKCkgewotCQlpZiAoIWZEYXRhRWRpdGFibGUpIHsKLQkJCURPTU1vZGVsSW1wbCBtb2RlbCA9IChET01Nb2RlbEltcGwpIGdldE1vZGVsKCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5pc1JlcGFyc2luZygpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZEYXRhRWRpdGFibGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0ZWQoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCWlmICh0aGlzLm93bmVyRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJRE9NSW1wbGVtZW50YXRpb24gaW1wbCA9IHRoaXMub3duZXJEb2N1bWVudC5nZXRJbXBsZW1lbnRhdGlvbigpOwotCQlpZiAoaW1wbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaW1wbC5oYXNGZWF0dXJlKGZlYXR1cmUsIHZlcnNpb24pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGxvb2t1cE1lc3NhZ2Uoc2hvcnQgcykgewotCQkvLyBUT0RPOiBtYWtlIGxvY2FsaXplZCB2ZXJzaW9uCi0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlzd2l0Y2ggKHMpIHsKLQkJCWNhc2UgRE9NRXhjZXB0aW9uLklOVkFMSURfQ0hBUkFDVEVSX0VSUiA6Ci0JCQkJcmVzdWx0ID0gIklOVkFMSURfQ0hBUkFDVEVSX0VSUiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdCA6Ci0JCQkJcmVzdWx0ID0gbmV3IFN0cmluZygpOwotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogbm9ybWFsaXplIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vcm1hbGl6ZSgpIHsKLQkJVGV4dEltcGwgcHJldlRleHQgPSBudWxsOwotCQlmb3IgKE5vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJc3dpdGNoIChjaGlsZC5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJY2FzZSBURVhUX05PREUgOiB7Ci0JCQkJCWlmIChwcmV2VGV4dCA9PSBudWxsKSB7Ci0JCQkJCQlwcmV2VGV4dCA9IChUZXh0SW1wbCkgY2hpbGQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgY2hpbGQ7Ci0JCQkJCXJlbW92ZUNoaWxkKHRleHQpOwotCQkJCQlwcmV2VGV4dC5hcHBlbmRUZXh0KHRleHQpOwotCQkJCQljaGlsZCA9IHByZXZUZXh0OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBFTEVNRU5UX05PREUgOiB7Ci0JCQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBjaGlsZDsKLQkJCQkJZWxlbWVudC5ub3JtYWxpemUoKTsKLQkJCQkJcHJldlRleHQgPSBudWxsOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXByZXZUZXh0ID0gbnVsbDsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlFZGl0YWJsZUNoYW5nZWQoKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwuZWRpdGFibGVDaGFuZ2VkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIG5vdGlmeVZhbHVlQ2hhbmdlZCBtZXRob2QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlWYWx1ZUNoYW5nZWQoKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXN5bmNEYXRhRWRpdGFibGVTdGF0ZSgpOwotCi0JCURPTU1vZGVsSW1wbCBtb2RlbCA9IChET01Nb2RlbEltcGwpIGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC52YWx1ZUNoYW5nZWQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgcmVtb3ZlQ2hpbGQoTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9GT1VORF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQ2hpbGROb2RlcyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZE5vZGVzKCkgewotCX0KLQotCS8qKgotCSAqIHJlbW92ZUNoaWxkTm9kZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50Ci0JICogQHBhcmFtIGZpcnN0Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbGFzdENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIERvY3VtZW50RnJhZ21lbnQgcmVtb3ZlQ2hpbGROb2RlcyhOb2RlIGZpcnN0Q2hpbGQsIE5vZGUgbGFzdENoaWxkKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHJlcGxhY2VDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSByZXBsYWNlQ2hpbGQoTm9kZSBuZXdDaGlsZCwgTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgbmV3IFN0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldHMgY2hpbGRyZW4gdmFsdWVzIGZyb20gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi4KLQkgKi8KLQl2b2lkIHJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpIHsKLQkJZm9yIChOb2RlSW1wbCBjaGlsZCA9IChOb2RlSW1wbCkgZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IChOb2RlSW1wbCkgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJY2hpbGQucmVzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCX0KLQkJdGhpcy5mbGF0Tm9kZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKSB7Ci0JCS8vIG5vcAotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKSB7Ci0JCWlmIChmRGF0YUVkaXRhYmxlID09IGVkaXRhYmxlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlSZWFkT25seUNvbnRyb2xsZXIgcm9jID0gUmVhZE9ubHlDb250cm9sbGVyLmdldEluc3RhbmNlKCk7Ci0JCWlmIChlZGl0YWJsZSkgewotCQkJcm9jLnVubG9ja0RhdGEodGhpcyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyb2MubG9ja0RhdGEodGhpcyk7Ci0JCX0KLQotCQlmRGF0YUVkaXRhYmxlID0gZWRpdGFibGU7Ci0KLQkJbm90aWZ5RWRpdGFibGVDaGFuZ2VkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSwgYm9vbGVhbiBkZWVwKSB7Ci0JCWlmIChkZWVwKSB7Ci0JCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBnZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkJbm9kZS5zZXRFZGl0YWJsZShlZGl0YWJsZSwgZGVlcCk7Ci0JCQkJbm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXROZXh0U2libGluZygpOwotCQkJfQotCQl9Ci0JCXNldENoaWxkRWRpdGFibGUoZWRpdGFibGUpOwotCQlzZXREYXRhRWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCS8qKgotCSAqIHNldE5leHRTaWJsaW5nIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuZXh0U2libGluZwotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5leHRTaWJsaW5nKE5vZGUgbmV4dFNpYmxpbmcpIHsKLQkJdGhpcy5uZXh0U2libGluZyA9IChOb2RlSW1wbCkgbmV4dFNpYmxpbmc7Ci0JfQotCi0JLyoqCi0JICogc2V0Tm9kZVZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlVmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb2RlVmFsdWUoU3RyaW5nIG5vZGVWYWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqCi0JICogc2V0T3duZXJEb2N1bWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXJEb2N1bWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQpIHsKLQkJdGhpcy5vd25lckRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgb3duZXJEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQsIGJvb2xlYW4gZGVlcCkgewotCQl0aGlzLm93bmVyRG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBvd25lckRvY3VtZW50OwotCi0JCWlmIChkZWVwKSB7Ci0JCQlmb3IgKE5vZGVJbXBsIGNoaWxkID0gKE5vZGVJbXBsKSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gKE5vZGVJbXBsKSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJY2hpbGQuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50LCBkZWVwKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHNldFBhcmVudE5vZGUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQYXJlbnROb2RlKE5vZGUgcGFyZW50Tm9kZSkgewotCQl0aGlzLnBhcmVudE5vZGUgPSAoTm9kZUltcGwpIHBhcmVudE5vZGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHRocm93cyBET01FeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIHNldFByZXZpb3VzU2libGluZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcHJldmlvdXNTaWJsaW5nCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJldmlvdXNTaWJsaW5nKE5vZGUgcHJldmlvdXNTaWJsaW5nKSB7Ci0JCXRoaXMucHJldmlvdXNTaWJsaW5nID0gKE5vZGVJbXBsKSBwcmV2aW91c1NpYmxpbmc7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291cmNlKFN0cmluZyBzb3VyY2UpIHRocm93cyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJdGhpcy5mbGF0Tm9kZSA9IGZsYXROb2RlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlU291cmNlKFN0cmluZyBzb3VyY2UpIHsKLQkJc2V0Tm9kZVZhbHVlKHNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY0RhdGFFZGl0YWJsZVN0YXRlKCkgewotCQlSZWFkT25seUNvbnRyb2xsZXIgcm9jID0gUmVhZE9ubHlDb250cm9sbGVyLmdldEluc3RhbmNlKCk7Ci0JCWlmIChmRGF0YUVkaXRhYmxlKSB7Ci0JCQlyb2MudW5sb2NrRGF0YSh0aGlzKTsKLQkJfQotCQllbHNlIHsKLQkJCXJvYy5sb2NrRGF0YSh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHRvU3RyaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWludCBzdGFydCA9IGdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWlmIChzdGFydCA+PSAwKSB7Ci0JCQlpbnQgZW5kID0gZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlpZiAoZW5kID49IDApIHsKLQkJCQlyZXN1bHQgPSBlbmQgLSBzdGFydDsKLQkJCQlpZiAocmVzdWx0IDwgLTEpIHsKLQkJCQkJcmVzdWx0ID0gLTE7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgc2hvcnQgY29tcGFyZURvY3VtZW50UG9zaXRpb24oTm9kZSBvdGhlcikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYXNlVVJJKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHRDb250ZW50KCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VxdWFsTm9kZShOb2RlIGFyZykgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2FtZU5vZGUoTm9kZSBvdGhlcikgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9va3VwTmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvb2t1cFByZWZpeChTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dENvbnRlbnQoU3RyaW5nIHRleHRDb250ZW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgVHlwZUluZm8gZ2V0U2NoZW1hVHlwZUluZm8oKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJZCgpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgb2JqZWN0IGZvciBhIG5vZGUgYXNzb2NpYXRlZCB0byBhIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5IFRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBvYmplY3QuCi0JICogQHJldHVybiBvYmplY3QgVGhlIG9iamVjdCBmb3IgdGhpcyBub2RlLCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBwYXNzZWQKLQkgKiBvciBudWxsIGlmIHRoZXJlIHdhcyBub25lIHNldC4KLQkgKgotCSAqIEBzaW5jZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VXNlckRhdGEoU3RyaW5nIGtleSkgewotCQkKLQkJaWYgKGtleT09bnVsbCkgcmV0dXJuIG51bGw7Ci0JCQotCQlpZiAodXNlckRhdGFUYWJsZSE9bnVsbCkgewotCQkJVXNlckRhdGFBbmRIYW5kbGVyIHVzZXJEYXRhQW5kSGFuZGxlciA9IChVc2VyRGF0YUFuZEhhbmRsZXIpIHVzZXJEYXRhVGFibGUuZ2V0KGtleSk7Ci0JCQlpZiAodXNlckRhdGFBbmRIYW5kbGVyIT1udWxsKSB7Ci0JCQkJcmV0dXJuIHVzZXJEYXRhQW5kSGFuZGxlci5nZXREYXRhKCk7Ci0JCQl9IAotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdXNlciBkYXRhIGFuZCBoYW5kbGVyIGZvciBhIGtleQotCSAqIAotCSAqIEBwYXJhbSBrZXkgVGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdC4KLQkgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgZm9yIHRoaXMgbm9kZSwgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgcGFzc2VkLgotCSAqIE51bGwgcGFzc2VkIHJlbW92ZXMgdGhlIGV4aXN0aW5nIGFzc29jaWF0aW9uIHRvIHRoZSBrZXkuCi0JICogQHBhcmFtIGhhbmRsZXIgVXNlckRhdGFIYW5kbGVyIGZvciB0aGUgdXNlcmRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5Ci0JICogQHJldHVybiBPYmplY3QgVGhlIHByZXZpb3VzIHVzZXJkYXRhIG9iamVjdCBpZiBzZXQsIG51bGwgaWYgaXQgd2FzIG5vbmUuICAKLQkgKiAKLQkgKiBAc2luY2UgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHNldFVzZXJEYXRhKFN0cmluZyBrZXksIE9iamVjdCBkYXRhLCBVc2VyRGF0YUhhbmRsZXIgaGFuZGxlcikgewotCi0JCVVzZXJEYXRhQW5kSGFuZGxlciBwcmV2aW91c0RhdGFBbmRIYW5kbGVyPW51bGw7Ci0JCQotCQkvL3JldHVybiBpbW1lZGlhdGVseSBmb3IgbnVsbCBrZXlzCi0JCWlmIChrZXkgPT1udWxsKSByZXR1cm4gbnVsbDsKLQkJCi0JCS8vcmVtb3ZlIGFzc29jaWF0aW9uIGZvciB0aGUga2V5IGlmIGRhdGEgaXMgbnVsbAotCQlpZiAoZGF0YT09bnVsbCkgewotCQkJaWYgKHVzZXJEYXRhVGFibGU9PW51bGwpIHJldHVybiBudWxsOwotCQkJCi0JCQkvL3NlZSBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIHZhbHVlIHNldAotCQkJcHJldmlvdXNEYXRhQW5kSGFuZGxlciA9IChVc2VyRGF0YUFuZEhhbmRsZXIpIHVzZXJEYXRhVGFibGUuZ2V0KGtleSk7Ci0JCQlpZiAocHJldmlvdXNEYXRhQW5kSGFuZGxlciE9bnVsbCkgewotCQkJCXVzZXJEYXRhVGFibGUucmVtb3ZlKGtleSk7Ci0JCQkJcmV0dXJuIHByZXZpb3VzRGF0YUFuZEhhbmRsZXIuZ2V0RGF0YSgpOwotCQkJfQotCQkJLy90aGVyZSBpcyBubyBwcmV2aW91cyB2YWx1ZSBmb3VuZAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCS8vaWYgZGF0YSBwYXNzZWQgaXMgbm90IG51bGwKLQkJLy90aGUgZmlyc3QgZGF0YSBpbiB0aGUgaGFzaHRhYmxlCi0JCWlmICh1c2VyRGF0YVRhYmxlPT1udWxsKSB7Ci0JCQl1c2VyRGF0YVRhYmxlPW5ldyBIYXNodGFibGUoKTsKLQkJCVVzZXJEYXRhQW5kSGFuZGxlciB1c2VyRGF0YUFuZEhhbmRsZXI9bmV3IFVzZXJEYXRhQW5kSGFuZGxlcihkYXRhLGhhbmRsZXIpOwotCQkJdXNlckRhdGFUYWJsZS5wdXQoa2V5LHVzZXJEYXRhQW5kSGFuZGxlcik7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJCS8vdGhlcmUgaXMgYWxyZWFkeSBkYXRhIGluIHRoZSBoYXNodGFibGUKLQkJfSBlbHNlIHsKLQkJCVVzZXJEYXRhQW5kSGFuZGxlciB1c2VyRGF0YUFuZEhhbmRsZXI9bmV3IFVzZXJEYXRhQW5kSGFuZGxlcihkYXRhLGhhbmRsZXIpOwotCQkJcHJldmlvdXNEYXRhQW5kSGFuZGxlcj0oVXNlckRhdGFBbmRIYW5kbGVyKSB1c2VyRGF0YVRhYmxlLnB1dChrZXksdXNlckRhdGFBbmRIYW5kbGVyKTsKLQkJCQotCQkJLy9pZiB3ZSByZXBsYWNlIGEgdmFsdWUKLQkJCWlmIChwcmV2aW91c0RhdGFBbmRIYW5kbGVyIT1udWxsKQotCQkJCXJldHVybiBwcmV2aW91c0RhdGFBbmRIYW5kbGVyLmdldERhdGEoKTsKLQkJCWVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBVc2VyRGF0YUhhbmRsZXJzIG9mIHRoZSBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBvcGVyYXRpb24KLQkgKiBAcGFyYW0gZGVzdGluYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlVc2VyRGF0YUhhbmRsZXJzKHNob3J0IG9wZXJhdGlvbiwgTm9kZSBkZXN0aW5hdGlvbikgewotCQkKLQkJaWYgKG9wZXJhdGlvbiE9VXNlckRhdGFIYW5kbGVyLk5PREVfQURPUFRFRCAKLQkJCQkmIG9wZXJhdGlvbiE9VXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVECi0JCQkJJiBvcGVyYXRpb24hPVVzZXJEYXRhSGFuZGxlci5OT0RFX0RFTEVURUQKLQkJCQkmIG9wZXJhdGlvbiE9VXNlckRhdGFIYW5kbGVyLk5PREVfSU1QT1JURUQKLQkJCQkmIG9wZXJhdGlvbiE9VXNlckRhdGFIYW5kbGVyLk5PREVfUkVOQU1FRCkKLQkJCXJldHVybjsgCi0JCQkKLQkJaWYgKHVzZXJEYXRhVGFibGUhPW51bGwpIHsKLQkJCUVudW1lcmF0aW9uIGtleXM9dXNlckRhdGFUYWJsZS5rZXlzKCk7Ci0JCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCVN0cmluZyBrZXk9KFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpOyAvL3Nob3VsZCBhbHdheXMgYmUgYSBzdHJpbmcKLQkJCQlVc2VyRGF0YUFuZEhhbmRsZXIgZGF0YUFuZEhhbmRsZXIgPSAoVXNlckRhdGFBbmRIYW5kbGVyKSB1c2VyRGF0YVRhYmxlLmdldChrZXkpOwotCQkJCWlmIChkYXRhQW5kSGFuZGxlciE9bnVsbCkgewotCQkJCQlVc2VyRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXI9ZGF0YUFuZEhhbmRsZXIuZ2V0SGFuZGxlcigpOwotCQkJCQlpZiAoZGF0YUhhbmRsZXIhPW51bGwpIHsKLQkJCQkJCWRhdGFIYW5kbGVyLmhhbmRsZShvcGVyYXRpb24sIGtleSwgZGF0YUFuZEhhbmRsZXIuZ2V0RGF0YSgpLCB0aGlzLCBkZXN0aW5hdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQ2xhc3MgZm9yIHVzZXIgZGF0YSBhbmQgVXNlckRhdGFIYW5kbGVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFVzZXJEYXRhQW5kSGFuZGxlciBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLQkJLyoqCi0JCSAqIEdlbmVyYXRlZCBTZXJpYWwgSUQKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ4NjA1MjEyMzczMTU0NDQ4NDBMOwotCQkvKioKLQkJICogR2VuZXJhdGVkIHNlcmlhbGl6YXRpb24gdmVyc2lvbgotCQkgKi8KLQkJCi0JCXByaXZhdGUgT2JqZWN0IGRhdGE7Ci0JCXByaXZhdGUgVXNlckRhdGFIYW5kbGVyIGhhbmRsZXI7Ci0JCQotCQlwdWJsaWMgVXNlckRhdGFBbmRIYW5kbGVyKE9iamVjdCBkYXRhLCBVc2VyRGF0YUhhbmRsZXIgaGFuZGxlcikKLQkJewotCQkJdGhpcy5kYXRhPWRhdGE7Ci0JCQl0aGlzLmhhbmRsZXI9aGFuZGxlcjsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0RGF0YSgpIHsKLQkJCXJldHVybiBkYXRhOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0RGF0YShPYmplY3QgZGF0YSkgewotCQkJdGhpcy5kYXRhID0gZGF0YTsKLQkJfQotCi0JCXB1YmxpYyBVc2VyRGF0YUhhbmRsZXIgZ2V0SGFuZGxlcigpIHsKLQkJCXJldHVybiBoYW5kbGVyOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0SGFuZGxlcihVc2VyRGF0YUhhbmRsZXIgaGFuZGxlcikgewotCQkJdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUl0ZXJhdG9ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlSXRlcmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YTI3OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlSXRlcmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLQotLyoqCi0gKiBOb2RlSXRlcmF0b3JJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlSXRlcmF0b3JJbXBsIGltcGxlbWVudHMgTm9kZUl0ZXJhdG9yIHsKLQlwcml2YXRlIE5vZGVGaWx0ZXIgZmlsdGVyID0gbnVsbDsKLQlwcml2YXRlIE5vZGUgbmV4dE5vZGUgPSBudWxsOwotCi0JcHJpdmF0ZSBOb2RlIHJvb3ROb2RlID0gbnVsbDsKLQlwcml2YXRlIGludCB3aGF0VG9TaG93ID0gTm9kZUZpbHRlci5TSE9XX0FMTDsKLQotCS8qKgotCSAqIE5vZGVJdGVyYXRvckltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gcm9vdE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlOb2RlSXRlcmF0b3JJbXBsKE5vZGUgcm9vdE5vZGUsIGludCB3aGF0VG9TaG93LCBOb2RlRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLnJvb3ROb2RlID0gcm9vdE5vZGU7Ci0JCXRoaXMubmV4dE5vZGUgPSByb290Tm9kZTsKLQkJdGhpcy53aGF0VG9TaG93ID0gd2hhdFRvU2hvdzsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGFjY2VwdE5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmICh0aGlzLndoYXRUb1Nob3cgIT0gTm9kZUZpbHRlci5TSE9XX0FMTCkgewotCQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCXN3aXRjaCAodGhpcy53aGF0VG9TaG93KSB7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfQVRUUklCVVRFIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuQVRUUklCVVRFX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX1RFWFQgOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5URVhUX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0NEQVRBX1NFQ1RJT04gOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0VOVElUWV9SRUZFUkVOQ0UgOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0VOVElUWSA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkVOVElUWV9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGVGaWx0ZXIuU0hPV19QUk9DRVNTSU5HX0lOU1RSVUNUSU9OIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGVGaWx0ZXIuU0hPV19DT01NRU5UIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuQ09NTUVOVF9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGVGaWx0ZXIuU0hPV19ET0NVTUVOVCA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0RPQ1VNRU5UX1RZUEUgOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0RPQ1VNRU5UX0ZSQUdNRU5UIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfTk9UQVRJT04gOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5OT1RBVElPTl9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmICh0aGlzLmZpbHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKHRoaXMuZmlsdGVyLmFjY2VwdE5vZGUobm9kZSkgPT0gTm9kZUZpbHRlci5GSUxURVJfQUNDRVBUKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRhY2hlcyB0aGUgPGNvZGU+Tm9kZUl0ZXJhdG9yPC9jb2RlPiBmcm9tIHRoZSBzZXQgd2hpY2ggaXQgaXRlcmF0ZWQKLQkgKiBvdmVyLCByZWxlYXNpbmcgYW55IGNvbXB1dGF0aW9uYWwgcmVzb3VyY2VzIGFuZCBwbGFjaW5nIHRoZSBpdGVyYXRvciBpbgotCSAqIHRoZSBJTlZBTElEIHN0YXRlLiBBZnRlciA8Y29kZT5kZXRhY2g8L2NvZGU+IGhhcyBiZWVuIGludm9rZWQsIGNhbGxzCi0JICogdG8gPGNvZGU+bmV4dE5vZGU8L2NvZGU+IG9yIDxjb2RlPnByZXZpb3VzTm9kZTwvY29kZT4gd2lsbCByYWlzZQotCSAqIHRoZSBleGNlcHRpb24gSU5WQUxJRF9TVEFURV9FUlIuCi0JICovCi0JcHVibGljIHZvaWQgZGV0YWNoKCkgewotCQl0aGlzLnJvb3ROb2RlID0gbnVsbDsKLQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhpcyBmbGFnIGRldGVybWluZXMgd2hldGhlciB0aGUgY2hpbGRyZW4gb2YgZW50aXR5Ci0JICogcmVmZXJlbmNlIG5vZGVzIGFyZSB2aXNpYmxlIHRvIHRoZSBpdGVyYXRvci4gSWYgZmFsc2UsIHRoZXkgYW5kIHRoZWlyCi0JICogZGVzY2VuZGFudHMgd2lsbCBiZSByZWplY3RlZC4gTm90ZSB0aGF0IHRoaXMgcmVqZWN0aW9uIHRha2VzIHByZWNlZGVuY2UKLQkgKiBvdmVyIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGFuZCB0aGUgZmlsdGVyLiBBbHNvIG5vdGUgdGhhdCB0aGlzIGlzCi0JICogY3VycmVudGx5IHRoZSBvbmx5IHNpdHVhdGlvbiB3aGVyZSA8Y29kZT5Ob2RlSXRlcmF0b3JzPC9jb2RlPiBtYXkKLQkgKiByZWplY3QgYSBjb21wbGV0ZSBzdWJ0cmVlIHJhdGhlciB0aGFuIHNraXBwaW5nIGluZGl2aWR1YWwgbm9kZXMuIDxicj4KLQkgKiA8YnI+Ci0JICogVG8gcHJvZHVjZSBhIHZpZXcgb2YgdGhlIGRvY3VtZW50IHRoYXQgaGFzIGVudGl0eSByZWZlcmVuY2VzIGV4cGFuZGVkCi0JICogYW5kIGRvZXMgbm90IGV4cG9zZSB0aGUgZW50aXR5IHJlZmVyZW5jZSBub2RlIGl0c2VsZiwgdXNlIHRoZQotCSAqIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGZsYWdzIHRvIGhpZGUgdGhlIGVudGl0eSByZWZlcmVuY2Ugbm9kZSBhbmQKLQkgKiBzZXQgPGNvZGU+ZXhwYW5kRW50aXR5UmVmZXJlbmNlczwvY29kZT4gdG8gdHJ1ZSB3aGVuIGNyZWF0aW5nIHRoZQotCSAqIGl0ZXJhdG9yLiBUbyBwcm9kdWNlIGEgdmlldyBvZiB0aGUgZG9jdW1lbnQgdGhhdCBoYXMgZW50aXR5IHJlZmVyZW5jZQotCSAqIG5vZGVzIGJ1dCBubyBlbnRpdHkgZXhwYW5zaW9uLCB1c2UgdGhlIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGZsYWdzCi0JICogdG8gc2hvdyB0aGUgZW50aXR5IHJlZmVyZW5jZSBub2RlIGFuZCBzZXQKLQkgKiA8Y29kZT5leHBhbmRFbnRpdHlSZWZlcmVuY2VzPC9jb2RlPiB0byBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKCkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+Tm9kZUZpbHRlcjwvY29kZT4gdXNlZCB0byBzY3JlZW4gbm9kZXMuCi0JICovCi0JcHVibGljIE5vZGVGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gdGhpcy5maWx0ZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBOb2RlIGdldE5leHROb2RlKCkgewotCQlpZiAodGhpcy5uZXh0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGUgb2xkTmV4dCA9IHRoaXMubmV4dE5vZGU7Ci0JCU5vZGUgY2hpbGQgPSB0aGlzLm5leHROb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCXRoaXMubmV4dE5vZGUgPSBjaGlsZDsKLQkJCXJldHVybiBvbGROZXh0OwotCQl9Ci0JCWZvciAoTm9kZSBub2RlID0gdGhpcy5uZXh0Tm9kZTsgbm9kZSAhPSBudWxsICYmIG5vZGUgIT0gdGhpcy5yb290Tm9kZTsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlOb2RlIG5leHQgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5uZXh0Tm9kZSA9IG5leHQ7Ci0JCQkJcmV0dXJuIG9sZE5leHQ7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JCXJldHVybiBvbGROZXh0OwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgZmluYWwgTm9kZSBnZXRQcmV2aW91c05vZGUoKSB7Ci0JCWlmICh0aGlzLm5leHROb2RlID09IHRoaXMucm9vdE5vZGUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZSBwcmV2ID0gbnVsbDsKLQkJaWYgKHRoaXMubmV4dE5vZGUgPT0gbnVsbCkgewotCQkJcHJldiA9IHRoaXMucm9vdE5vZGU7IC8vIG5ldmVyIG51bGwKLQkJfSBlbHNlIHsKLQkJCXByZXYgPSB0aGlzLm5leHROb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJaWYgKHByZXYgPT0gbnVsbCkgewotCQkJCXRoaXMubmV4dE5vZGUgPSB0aGlzLm5leHROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlyZXR1cm4gdGhpcy5uZXh0Tm9kZTsKLQkJCX0KLQkJfQotCQlOb2RlIGxhc3QgPSBwcmV2LmdldExhc3RDaGlsZCgpOwotCQl3aGlsZSAobGFzdCAhPSBudWxsKSB7Ci0JCQlwcmV2ID0gbGFzdDsKLQkJCWxhc3QgPSBwcmV2LmdldExhc3RDaGlsZCgpOwotCQl9Ci0JCXRoaXMubmV4dE5vZGUgPSBwcmV2OwotCQlyZXR1cm4gdGhpcy5uZXh0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcm9vdCBub2RlIG9mIHRoZSA8Y29kZT5Ob2RlSXRlcmF0b3I8L2NvZGU+LCBhcyBzcGVjaWZpZWQgd2hlbiBpdAotCSAqIHdhcyBjcmVhdGVkLgotCSAqLwotCXB1YmxpYyBOb2RlIGdldFJvb3QoKSB7Ci0JCXJldHVybiB0aGlzLnJvb3ROb2RlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGRldGVybWluZXMgd2hpY2ggbm9kZSB0eXBlcyBhcmUgcHJlc2VudGVkIHZpYSB0aGUKLQkgKiBpdGVyYXRvci4gVGhlIGF2YWlsYWJsZSBzZXQgb2YgY29uc3RhbnRzIGlzIGRlZmluZWQgaW4gdGhlCi0JICogPGNvZGU+Tm9kZUZpbHRlcjwvY29kZT4gaW50ZXJmYWNlLiBOb2RlcyBub3QgYWNjZXB0ZWQgYnkKLQkgKiA8Y29kZT53aGF0VG9TaG93PC9jb2RlPiB3aWxsIGJlIHNraXBwZWQsIGJ1dCB0aGVpciBjaGlsZHJlbiBtYXkgc3RpbGwKLQkgKiBiZSBjb25zaWRlcmVkLiBOb3RlIHRoYXQgdGhpcyBza2lwIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgZmlsdGVyLCBpZgotCSAqIGFueS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFdoYXRUb1Nob3coKSB7Ci0JCXJldHVybiB0aGlzLndoYXRUb1Nob3c7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmV4dCBub2RlIGluIHRoZSBzZXQgYW5kIGFkdmFuY2VzIHRoZSBwb3NpdGlvbiBvZiB0aGUKLQkgKiBpdGVyYXRvciBpbiB0aGUgc2V0LiBBZnRlciBhIDxjb2RlPk5vZGVJdGVyYXRvcjwvY29kZT4gaXMgY3JlYXRlZCwKLQkgKiB0aGUgZmlyc3QgY2FsbCB0byA8Y29kZT5uZXh0Tm9kZSgpPC9jb2RlPiByZXR1cm5zIHRoZSBmaXJzdCBub2RlIGluCi0JICogdGhlIHNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuZXh0IDxjb2RlPk5vZGU8L2NvZGU+IGluIHRoZSBzZXQgYmVpbmcgaXRlcmF0ZWQgb3Zlciwgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBtb3JlIG1lbWJlcnMgaW4gdGhhdCBzZXQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlcgotCSAqICAgICAgICAgICAgICAgIHRoZSA8Y29kZT5kZXRhY2g8L2NvZGU+IG1ldGhvZCB3YXMgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgTm9kZSBuZXh0Tm9kZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlmb3IgKE5vZGUgbm9kZSA9IGdldE5leHROb2RlKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IGdldE5leHROb2RlKCkpIHsKLQkJCWlmIChhY2NlcHROb2RlKG5vZGUpKQotCQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByZXZpb3VzIG5vZGUgaW4gdGhlIHNldCBhbmQgbW92ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZQotCSAqIDxjb2RlPk5vZGVJdGVyYXRvcjwvY29kZT4gYmFja3dhcmRzIGluIHRoZSBzZXQuCi0JICogCi0JICogQHJldHVybiBUaGUgcHJldmlvdXMgPGNvZGU+Tm9kZTwvY29kZT4gaW4gdGhlIHNldCBiZWluZyBpdGVyYXRlZAotCSAqICAgICAgICAgb3Zlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIG1vcmUgbWVtYmVycyBpbgotCSAqICAgICAgICAgdGhhdCBzZXQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlcgotCSAqICAgICAgICAgICAgICAgIHRoZSA8Y29kZT5kZXRhY2g8L2NvZGU+IG1ldGhvZCB3YXMgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgTm9kZSBwcmV2aW91c05vZGUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJZm9yIChOb2RlIG5vZGUgPSBnZXRQcmV2aW91c05vZGUoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gZ2V0UHJldmlvdXNOb2RlKCkpIHsKLQkJCWlmIChhY2NlcHROb2RlKG5vZGUpKQotCQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vZGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmZlZDUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogTm9kZUxpc3RJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlTGlzdEltcGwgaW1wbGVtZW50cyBOb2RlTGlzdCB7Ci0KLQlPYmplY3QgbG9ja09iamVjdCA9IG5ldyBieXRlWzBdOwotCi0JcHJpdmF0ZSBWZWN0b3Igbm9kZXMgPSBudWxsOwotCi0JLyoqCi0JICogTm9kZUxpc3RJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIE5vZGVMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBhcHBlbmROb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgYXBwZW5kTm9kZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5ub2RlcyA9PSBudWxsKQotCQkJdGhpcy5ub2RlcyA9IG5ldyBWZWN0b3IoKTsKLQkJdGhpcy5ub2Rlcy5hZGRFbGVtZW50KG5vZGUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMZW5ndGggbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJc3luY2hyb25pemVkIChsb2NrT2JqZWN0KSB7Ci0JCQlpZiAodGhpcy5ub2RlcyA9PSBudWxsKQotCQkJCXJldHVybiAwOwotCQkJcmV0dXJuIHRoaXMubm9kZXMuc2l6ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgaW5zZXJ0Tm9kZShOb2RlIG5vZGUsIGludCBpbmRleCkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLm5vZGVzID09IG51bGwgfHwgaW5kZXggPj0gdGhpcy5ub2Rlcy5zaXplKCkpIHsKLQkJCXJldHVybiBhcHBlbmROb2RlKG5vZGUpOwotCQl9Ci0JCXRoaXMubm9kZXMuaW5zZXJ0RWxlbWVudEF0KG5vZGUsIGluZGV4KTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogaXRlbSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlzeW5jaHJvbml6ZWQgKGxvY2tPYmplY3QpIHsKLQkJCWlmICh0aGlzLm5vZGVzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMubm9kZXMuc2l6ZSgpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIChOb2RlKSB0aGlzLm5vZGVzLmVsZW1lbnRBdChpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHJvdGVjdGVkIE5vZGUgcmVtb3ZlTm9kZShpbnQgaW5kZXgpIHsKLQkJaWYgKHRoaXMubm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBubyBub2RlCi0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5ub2Rlcy5zaXplKCkpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBwYXJhbWV0ZXIKLQotCQlOb2RlIHJlbW92ZWQgPSAoTm9kZSkgdGhpcy5ub2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCQl0aGlzLm5vZGVzLnJlbW92ZUVsZW1lbnRBdChpbmRleCk7Ci0JCXJldHVybiByZW1vdmVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm90YXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vdGF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGJiZmUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm90YXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICogICAgIEJhbGF6cyBCYW5mYWk6IEJ1ZyAxNTQ3MzcgZ2V0VXNlckRhdGEvc2V0VXNlckRhdGEgc3VwcG9ydCBmb3IgTm9kZQotICogICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ3MzcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm90YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi0vKioKLSAqIE5vdGF0aW9uSW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgTm90YXRpb25JbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBOb3RhdGlvbiB7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBwdWJsaWNJZCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgc3lzdGVtSWQgPSBudWxsOwotCi0JLyoqCi0JICogTm90YXRpb25JbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIE5vdGF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RhdGlvbkltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgTm90YXRpb25JbXBsCi0JICovCi0JcHJvdGVjdGVkIE5vdGF0aW9uSW1wbChOb3RhdGlvbkltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLm5hbWUgPSB0aGF0Lm5hbWU7Ci0JCQl0aGlzLnB1YmxpY0lkID0gdGhhdC5wdWJsaWNJZDsKLQkJCXRoaXMuc3lzdGVtSWQgPSB0aGF0LnN5c3RlbUlkOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlOb3RhdGlvbkltcGwgY2xvbmVkID0gbmV3IE5vdGF0aW9uSW1wbCh0aGlzKTsKLQkJbm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsIGNsb25lZCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJaWYgKHRoaXMubmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gTk9UQVRJT05fTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQdWJsaWNJZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkgewotCQlyZXR1cm4gdGhpcy5wdWJsaWNJZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRTeXN0ZW1JZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotCQlyZXR1cm4gdGhpcy5zeXN0ZW1JZDsKLQl9Ci0KLQkvKioKLQkgKiBzZXROYW1lIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIHNldFB1YmxpY0lkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBwdWJsaWNJZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lkKFN0cmluZyBwdWJsaWNJZCkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQl0aGlzLnB1YmxpY0lkID0gcHVibGljSWQ7Ci0JfQotCi0JLyoqCi0JICogc2V0U3lzdGVtSWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHN5c3RlbUlkCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lzdGVtSWQoU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCXRoaXMuc3lzdGVtSWQgPSBzeXN0ZW1JZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTE0MjBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLQotCi0vKioKLSAqIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiB7Ci0JcHJpdmF0ZSBTdHJpbmcgZGF0YSA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyB0YXJnZXQgPSBudWxsOwotCi0JLyoqCi0JICogUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLnRhcmdldCA9IHRoYXQudGFyZ2V0OwotCQkJdGhpcy5kYXRhID0gdGhhdC5nZXREYXRhKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCVByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgY2xvbmVkID0gbmV3IFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwodGhpcyk7Ci0JCW5vdGlmeVVzZXJEYXRhSGFuZGxlcnMoVXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVELCBjbG9uZWQpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIGdldERhdGEgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREYXRhKCkgewotCQlpZiAodGhpcy5kYXRhICE9IG51bGwpCi0JCQlyZXR1cm4gdGhpcy5kYXRhOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQotCQlJVGV4dFJlZ2lvbiB0YXJnZXRSZWdpb24gPSBudWxsOwotCQlJVGV4dFJlZ2lvbiBkYXRhUmVnaW9uID0gbnVsbDsKLQkJSVRleHRSZWdpb24gY2xvc2VSZWdpb24gPSBudWxsOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ0xPU0UpIHsKLQkJCQljbG9zZVJlZ2lvbiA9IHJlZ2lvbjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICh0YXJnZXRSZWdpb24gPT0gbnVsbCkKLQkJCQkJdGFyZ2V0UmVnaW9uID0gcmVnaW9uOwotCQkJCWVsc2UgaWYgKGRhdGFSZWdpb24gPT0gbnVsbCkKLQkJCQkJZGF0YVJlZ2lvbiA9IHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlpZiAoZGF0YVJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJaW50IG9mZnNldCA9IGRhdGFSZWdpb24uZ2V0U3RhcnQoKTsKLQkJaW50IGVuZCA9IGZsYXROb2RlLmdldExlbmd0aCgpOwotCQlpZiAoY2xvc2VSZWdpb24gIT0gbnVsbCkKLQkJCWVuZCA9IGNsb3NlUmVnaW9uLmdldFN0YXJ0KCk7Ci0JCVN0cmluZyBzb3VyY2UgPSBmbGF0Tm9kZS5nZXRUZXh0KCk7Ci0JCXJldHVybiBzb3VyY2Uuc3Vic3RyaW5nKG9mZnNldCwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0VGFyZ2V0KCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlVmFsdWUoKSB7Ci0JCXJldHVybiBnZXREYXRhKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0VGFyZ2V0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0KCkgewotCQlpZiAodGhpcy50YXJnZXQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCXJldHVybiB0aGlzLnRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOyAvLyB3aWxsIGJlIGdlbmVyYXRlZAotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0TGFzdFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQlyZXR1cm4gKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ0xPU0UpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgcmVzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCkgewotCQl0aGlzLmRhdGEgPSBnZXREYXRhKCk7Ci0JCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5kYXRhID0gZGF0YTsKLQotCQlub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXROb2RlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGVWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShTdHJpbmcgbm9kZVZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc2V0RGF0YShub2RlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQl0aGlzLmRhdGEgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHNldFRhcmdldCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFyZ2V0KFN0cmluZyB0YXJnZXQpIHsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogdG9TdHJpbmcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRUYXJnZXQoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJygnKTsKLQkJYnVmZmVyLmFwcGVuZChnZXREYXRhKCkpOwotCQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JhbmdlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9SYW5nZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYwMzM2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JhbmdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5yYW5nZXMuUmFuZ2U7Ci1pbXBvcnQgb3JnLnczYy5kb20ucmFuZ2VzLlJhbmdlRXhjZXB0aW9uOwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgUmFuZ2VJbXBsIGltcGxlbWVudHMgUmFuZ2UgewotCXByaXZhdGUgTm9kZSBlbmRDb250YWluZXIgPSBudWxsOwotCXByaXZhdGUgaW50IGVuZE9mZnNldCA9IDA7Ci0KLQlwcml2YXRlIE5vZGUgc3RhcnRDb250YWluZXIgPSBudWxsOwotCXByaXZhdGUgaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBSYW5nZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFJhbmdlSW1wbChSYW5nZUltcGwgdGhhdCkgewotCQlzdXBlcigpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMuc3RhcnRDb250YWluZXIgPSB0aGF0LnN0YXJ0Q29udGFpbmVyOwotCQkJdGhpcy5zdGFydE9mZnNldCA9IHRoYXQuc3RhcnRPZmZzZXQ7Ci0JCQl0aGlzLmVuZENvbnRhaW5lciA9IHRoYXQuZW5kQ29udGFpbmVyOwotCQkJdGhpcy5lbmRPZmZzZXQgPSB0aGF0LmVuZE9mZnNldDsKLQkJfQotCX0KLQotCS8qKgotCSAqIER1cGxpY2F0ZXMgdGhlIGNvbnRlbnRzIG9mIGEgUmFuZ2UKLQkgKiAKLQkgKiBAcmV0dXJuIEEgRG9jdW1lbnRGcmFnbWVudCB0aGF0IGNvbnRhaW5zIGNvbnRlbnQgZXF1aXZhbGVudCB0byB0aGlzCi0JICogICAgICAgICBSYW5nZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIGEgRG9jdW1lbnRUeXBlIG5vZGUKLQkgKiAgICAgICAgICAgICAgICB3b3VsZCBiZSBleHRyYWN0ZWQgaW50byB0aGUgbmV3IERvY3VtZW50RnJhZ21lbnQuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRGcmFnbWVudCBjbG9uZUNvbnRlbnRzKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUHJvZHVjZXMgYSBuZXcgUmFuZ2Ugd2hvc2UgYm91bmRhcnktcG9pbnRzIGFyZSBlcXVhbCB0byB0aGUKLQkgKiBib3VuZGFyeS1wb2ludHMgb2YgdGhlIFJhbmdlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGR1cGxpY2F0ZWQgUmFuZ2UuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgUmFuZ2UgY2xvbmVSYW5nZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFJhbmdlSW1wbCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb2xsYXBzZSBhIFJhbmdlIG9udG8gb25lIG9mIGl0cyBib3VuZGFyeS1wb2ludHMKLQkgKiAKLQkgKiBAcGFyYW0gdG9TdGFydElmCi0JICogICAgICAgICAgICBUUlVFLCBjb2xsYXBzZXMgdGhlIFJhbmdlIG9udG8gaXRzIHN0YXJ0OyBpZiBGQUxTRSwKLQkgKiAgICAgICAgICAgIGNvbGxhcHNlcyBpdCBvbnRvIGl0cyBlbmQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb2xsYXBzZShib29sZWFuIHRvU3RhcnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAodG9TdGFydCkgewotCQkJdGhpcy5lbmRDb250YWluZXIgPSB0aGlzLnN0YXJ0Q29udGFpbmVyOwotCQkJdGhpcy5lbmRPZmZzZXQgPSB0aGlzLnN0YXJ0T2Zmc2V0OwotCQl9IGVsc2UgewotCQkJdGhpcy5zdGFydENvbnRhaW5lciA9IHRoaXMuZW5kQ29udGFpbmVyOwotCQkJdGhpcy5zdGFydE9mZnNldCA9IHRoaXMuZW5kT2Zmc2V0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tcGFyZSB0aGUgYm91bmRhcnktcG9pbnRzIG9mIHR3byBSYW5nZXMgaW4gYSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaG93QQotCSAqICAgICAgICAgICAgY29kZSByZXByZXNlbnRpbmcgdGhlIHR5cGUgb2YgY29tcGFyaXNvbiwgYXMgZGVmaW5lZCBhYm92ZS4KLQkgKiBAcGFyYW0gc291cmNlUmFuZ2VUaGUKLQkgKiAgICAgICAgICAgIDxjb2RlPlJhbmdlPC9jb2RlPiBvbiB3aGljaCB0aGlzIGN1cnJlbnQKLQkgKiAgICAgICAgICAgIDxjb2RlPlJhbmdlPC9jb2RlPiBpcyBjb21wYXJlZCB0by4KLQkgKiBAcmV0dXJuIC0xLCAwIG9yIDEgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcKLQkgKiAgICAgICAgIGJvdW5kYXJ5LXBvaW50IG9mIHRoZSBSYW5nZSBpcyByZXNwZWN0aXZlbHkgYmVmb3JlLCBlcXVhbCB0bywKLQkgKiAgICAgICAgIG9yIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIGJvdW5kYXJ5LXBvaW50IG9mCi0JICogICAgICAgICA8Y29kZT5zb3VyY2VSYW5nZTwvY29kZT4uCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBXUk9OR19ET0NVTUVOVF9FUlI6IFJhaXNlZCBpZiB0aGUgdHdvIFJhbmdlcyBhcmUgbm90IGluCi0JICogICAgICAgICAgICAgICAgdGhlIHNhbWUgRG9jdW1lbnQgb3IgRG9jdW1lbnRGcmFnbWVudC4gPGJyPgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzaG9ydCBjb21wYXJlQm91bmRhcnlQb2ludHMoc2hvcnQgaG93LCBSYW5nZSBzb3VyY2VSYW5nZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChzb3VyY2VSYW5nZSA9PSBudWxsKQotCQkJcmV0dXJuIChzaG9ydCkgMDsgLy8gZXJyb3IKLQotCQlOb2RlIGNvbnRhaW5lcjEgPSBudWxsOwotCQlpbnQgb2Zmc2V0MSA9IDA7Ci0JCU5vZGUgY29udGFpbmVyMiA9IG51bGw7Ci0JCWludCBvZmZzZXQyID0gMDsKLQotCQlzd2l0Y2ggKGhvdykgewotCQkJY2FzZSBTVEFSVF9UT19TVEFSVCA6Ci0JCQkJY29udGFpbmVyMSA9IHRoaXMuc3RhcnRDb250YWluZXI7Ci0JCQkJb2Zmc2V0MSA9IHRoaXMuc3RhcnRPZmZzZXQ7Ci0JCQkJY29udGFpbmVyMiA9IHNvdXJjZVJhbmdlLmdldFN0YXJ0Q29udGFpbmVyKCk7Ci0JCQkJb2Zmc2V0MiA9IHNvdXJjZVJhbmdlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNUQVJUX1RPX0VORCA6Ci0JCQkJY29udGFpbmVyMSA9IHRoaXMuc3RhcnRDb250YWluZXI7Ci0JCQkJb2Zmc2V0MSA9IHRoaXMuc3RhcnRPZmZzZXQ7Ci0JCQkJY29udGFpbmVyMiA9IHNvdXJjZVJhbmdlLmdldEVuZENvbnRhaW5lcigpOwotCQkJCW9mZnNldDIgPSBzb3VyY2VSYW5nZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRU5EX1RPX0VORCA6Ci0JCQkJY29udGFpbmVyMSA9IHRoaXMuZW5kQ29udGFpbmVyOwotCQkJCW9mZnNldDEgPSB0aGlzLmVuZE9mZnNldDsKLQkJCQljb250YWluZXIyID0gc291cmNlUmFuZ2UuZ2V0RW5kQ29udGFpbmVyKCk7Ci0JCQkJb2Zmc2V0MiA9IHNvdXJjZVJhbmdlLmdldEVuZE9mZnNldCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFTkRfVE9fU1RBUlQgOgotCQkJCWNvbnRhaW5lcjEgPSB0aGlzLmVuZENvbnRhaW5lcjsKLQkJCQlvZmZzZXQxID0gdGhpcy5lbmRPZmZzZXQ7Ci0JCQkJY29udGFpbmVyMiA9IHNvdXJjZVJhbmdlLmdldFN0YXJ0Q29udGFpbmVyKCk7Ci0JCQkJb2Zmc2V0MiA9IHNvdXJjZVJhbmdlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gKHNob3J0KSAwOyAvLyBlcnJvcgotCQl9Ci0KLQkJcmV0dXJuIGNvbXBhcmVQb2ludHMoY29udGFpbmVyMSwgb2Zmc2V0MSwgY29udGFpbmVyMiwgb2Zmc2V0Mik7Ci0JfQotCi0JLyoKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgY29tcGFyZVBvaW50cyhOb2RlIGNvbnRhaW5lcjEsIGludCBvZmZzZXQxLCBOb2RlIGNvbnRhaW5lcjIsIGludCBvZmZzZXQyKSB7Ci0JCWlmIChjb250YWluZXIxID09IG51bGwgfHwgY29udGFpbmVyMiA9PSBudWxsKQotCQkJcmV0dXJuIChzaG9ydCkgMDsgLy8gZXJyb3IKLQotCQlpZiAoY29udGFpbmVyMSA9PSBjb250YWluZXIyKSB7Ci0JCQlpZiAob2Zmc2V0MSA+IG9mZnNldDIpCi0JCQkJcmV0dXJuIChzaG9ydCkgMTsKLQkJCWlmIChvZmZzZXQxIDwgb2Zmc2V0MikKLQkJCQlyZXR1cm4gKHNob3J0KSAtMTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJLy8gZ2V0IG5vZGUgb2Zmc2V0cwotCQlJRE9NTm9kZSBub2RlMSA9IG51bGw7Ci0JCWlmIChjb250YWluZXIxLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJTm9kZSBjaGlsZCA9IGNvbnRhaW5lcjEuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvZmZzZXQxOyBpKyspIHsKLQkJCQlOb2RlIG5leHQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWlmIChuZXh0ID09IG51bGwpCi0JCQkJCWJyZWFrOwotCQkJCWNoaWxkID0gbmV4dDsKLQkJCX0KLQkJCW5vZGUxID0gKElET01Ob2RlKSBjaGlsZDsKLQkJCW9mZnNldDEgPSAwOwotCQl9IGVsc2UgewotCQkJbm9kZTEgPSAoSURPTU5vZGUpIGNvbnRhaW5lcjE7Ci0JCX0KLQkJaW50IG5vZGVPZmZzZXQxID0gbm9kZTEuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJSURPTU5vZGUgbm9kZTIgPSBudWxsOwotCQlpZiAoY29udGFpbmVyMi5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCU5vZGUgY2hpbGQgPSBjb250YWluZXIyLmdldEZpcnN0Q2hpbGQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0MjsgaSsrKSB7Ci0JCQkJTm9kZSBuZXh0ID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAobmV4dCA9PSBudWxsKQotCQkJCQlicmVhazsKLQkJCQljaGlsZCA9IG5leHQ7Ci0JCQl9Ci0JCQlub2RlMiA9IChJRE9NTm9kZSkgY2hpbGQ7Ci0JCQlvZmZzZXQyID0gMDsKLQkJfSBlbHNlIHsKLQkJCW5vZGUyID0gKElET01Ob2RlKSBjb250YWluZXIxOwotCQl9Ci0JCWludCBub2RlT2Zmc2V0MiA9IG5vZGUyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJaWYgKG5vZGVPZmZzZXQxID4gbm9kZU9mZnNldDIpCi0JCQlyZXR1cm4gKHNob3J0KSAxOwotCQlpZiAobm9kZU9mZnNldDEgPCBub2RlT2Zmc2V0MikKLQkJCXJldHVybiAoc2hvcnQpIC0xOwotCQlpZiAob2Zmc2V0MSA+IG9mZnNldDIpCi0JCQlyZXR1cm4gKHNob3J0KSAxOwotCQlpZiAob2Zmc2V0MSA8IG9mZnNldDIpCi0JCQlyZXR1cm4gKHNob3J0KSAtMTsKLQkJcmV0dXJuIChzaG9ydCkgMDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBjb250ZW50cyBvZiBhIFJhbmdlIGZyb20gdGhlIGNvbnRhaW5pbmcgZG9jdW1lbnQgb3IKLQkgKiBkb2N1bWVudCBmcmFnbWVudCB3aXRob3V0IHJldHVybmluZyBhIHJlZmVyZW5jZSB0byB0aGUgcmVtb3ZlZCBjb250ZW50LgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgYW55IHBvcnRpb24gb2YKLQkgKiAgICAgICAgICAgICAgICB0aGUgY29udGVudCBvZiB0aGUgUmFuZ2UgaXMgcmVhZC1vbmx5IG9yIGFueSBvZiB0aGUKLQkgKiAgICAgICAgICAgICAgICBub2RlcyB0aGF0IGNvbnRhaW4gYW55IG9mIHRoZSBjb250ZW50IG9mIHRoZSBSYW5nZSBhcmUKLQkgKiAgICAgICAgICAgICAgICByZWFkLW9ubHkuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVDb250ZW50cygpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIFJhbmdlIGlzIG5vIGxvbmdlciBpbiB1c2UgYW5kIHRoYXQgdGhlCi0JICogaW1wbGVtZW50YXRpb24gbWF5IHJlbGlucXVpc2ggYW55IHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBSYW5nZS4KLQkgKiBTdWJzZXF1ZW50IGNhbGxzIHRvIGFueSBtZXRob2RzIG9yIGF0dHJpYnV0ZSBnZXR0ZXJzIG9uIHRoaXMgUmFuZ2Ugd2lsbAotCSAqIHJlc3VsdCBpbiBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gYmVpbmcgdGhyb3duIHdpdGggYW4gZXJyb3IgY29kZQotCSAqIG9mIDxjb2RlPklOVkFMSURfU1RBVEVfRVJSPC9jb2RlPi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGRldGFjaCgpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aGlzLnN0YXJ0Q29udGFpbmVyID0gbnVsbDsKLQkJdGhpcy5zdGFydE9mZnNldCA9IDA7Ci0JCXRoaXMuZW5kQ29udGFpbmVyID0gbnVsbDsKLQkJdGhpcy5lbmRPZmZzZXQgPSAwOwotCX0KLQotCS8qKgotCSAqIE1vdmVzIHRoZSBjb250ZW50cyBvZiBhIFJhbmdlIGZyb20gdGhlIGNvbnRhaW5pbmcgZG9jdW1lbnQgb3IgZG9jdW1lbnQKLQkgKiBmcmFnbWVudCB0byBhIG5ldyBEb2N1bWVudEZyYWdtZW50LgotCSAqIAotCSAqIEByZXR1cm4gQSBEb2N1bWVudEZyYWdtZW50IGNvbnRhaW5pbmcgdGhlIGV4dHJhY3RlZCBjb250ZW50cy4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIGFueSBwb3J0aW9uIG9mCi0JICogICAgICAgICAgICAgICAgdGhlIGNvbnRlbnQgb2YgdGhlIFJhbmdlIGlzIHJlYWQtb25seSBvciBhbnkgb2YgdGhlCi0JICogICAgICAgICAgICAgICAgbm9kZXMgd2hpY2ggY29udGFpbiBhbnkgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIFJhbmdlIGFyZQotCSAqICAgICAgICAgICAgICAgIHJlYWQtb25seS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIGEgRG9jdW1lbnRUeXBlIG5vZGUKLQkgKiAgICAgICAgICAgICAgICB3b3VsZCBiZSBleHRyYWN0ZWQgaW50byB0aGUgbmV3IERvY3VtZW50RnJhZ21lbnQuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRGcmFnbWVudCBleHRyYWN0Q29udGVudHMoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUUlVFIGlmIHRoZSBSYW5nZSBpcyBjb2xsYXBzZWQKLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldENvbGxhcHNlZCgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAodGhpcy5zdGFydENvbnRhaW5lciA9PSB0aGlzLmVuZENvbnRhaW5lciAmJiB0aGlzLnN0YXJ0T2Zmc2V0ID09IHRoaXMuZW5kT2Zmc2V0KQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVlcGVzdCBjb21tb24gYW5jZXN0b3IgY29udGFpbmVyIG9mIHRoZSBSYW5nZSdzIHR3bwotCSAqIGJvdW5kYXJ5LXBvaW50cy4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBOb2RlIGdldENvbW1vbkFuY2VzdG9yQ29udGFpbmVyKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLnN0YXJ0Q29udGFpbmVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuICgoTm9kZUltcGwpIHRoaXMuc3RhcnRDb250YWluZXIpLmdldENvbW1vbkFuY2VzdG9yKHRoaXMuZW5kQ29udGFpbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBOb2RlIHdpdGhpbiB3aGljaCB0aGUgUmFuZ2UgZW5kcwotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIE5vZGUgZ2V0RW5kQ29udGFpbmVyKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmVuZENvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBPZmZzZXQgd2l0aGluIHRoZSBlbmRpbmcgbm9kZSBvZiB0aGUgUmFuZ2UuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5lbmRPZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogTm9kZSB3aXRoaW4gd2hpY2ggdGhlIFJhbmdlIGJlZ2lucwotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIE5vZGUgZ2V0U3RhcnRDb250YWluZXIoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuc3RhcnRDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogT2Zmc2V0IHdpdGhpbiB0aGUgc3RhcnRpbmcgbm9kZSBvZiB0aGUgUmFuZ2UuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLnN0YXJ0T2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIEluc2VydHMgYSBub2RlIGludG8gdGhlIERvY3VtZW50IG9yIERvY3VtZW50RnJhZ21lbnQgYXQgdGhlIHN0YXJ0IG9mCi0JICogdGhlIFJhbmdlLiBJZiB0aGUgY29udGFpbmVyIGlzIGEgVGV4dCBub2RlLCB0aGlzIHdpbGwgYmUgc3BsaXQgYXQgdGhlCi0JICogc3RhcnQgb2YgdGhlIFJhbmdlIChhcyBpZiB0aGUgVGV4dCBub2RlJ3Mgc3BsaXRUZXh0IG1ldGhvZCB3YXMKLQkgKiBwZXJmb3JtZWQgYXQgdGhlIGluc2VydGlvbiBwb2ludCkgYW5kIHRoZSBpbnNlcnRpb24gd2lsbCBvY2N1ciBiZXR3ZWVuCi0JICogdGhlIHR3byByZXN1bHRpbmcgVGV4dCBub2Rlcy4gQWRqYWNlbnQgVGV4dCBub2RlcyB3aWxsIG5vdCBiZQotCSAqIGF1dG9tYXRpY2FsbHkgbWVyZ2VkLiBJZiB0aGUgbm9kZSB0byBiZSBpbnNlcnRlZCBpcyBhIERvY3VtZW50RnJhZ21lbnQKLQkgKiBub2RlLCB0aGUgY2hpbGRyZW4gd2lsbCBiZSBpbnNlcnRlZCByYXRoZXIgdGhhbiB0aGUgRG9jdW1lbnRGcmFnbWVudAotCSAqIG5vZGUgaXRzZWxmLgotCSAqIAotCSAqIEBwYXJhbSBuZXdOb2RlVGhlCi0JICogICAgICAgICAgICBub2RlIHRvIGluc2VydCBhdCB0aGUgc3RhcnQgb2YgdGhlIFJhbmdlCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiBhbiBhbmNlc3RvcgotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW5lciBvZiB0aGUgc3RhcnQgb2YgdGhlIFJhbmdlIGlzIHJlYWQtb25seS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIFdST05HX0RPQ1VNRU5UX0VSUjogUmFpc2VkIGlmIDxjb2RlPm5ld05vZGU8L2NvZGU+IGFuZAotCSAqICAgICAgICAgICAgICAgIHRoZSBjb250YWluZXIgb2YgdGhlIHN0YXJ0IG9mIHRoZSBSYW5nZSB3ZXJlIG5vdCBjcmVhdGVkCi0JICogICAgICAgICAgICAgICAgZnJvbSB0aGUgc2FtZSBkb2N1bWVudC4gPGJyPgotCSAqICAgICAgICAgICAgICAgIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIHRoZSBjb250YWluZXIgb2YgdGhlCi0JICogICAgICAgICAgICAgICAgc3RhcnQgb2YgdGhlIFJhbmdlIGlzIG9mIGEgdHlwZSB0aGF0IGRvZXMgbm90IGFsbG93Ci0JICogICAgICAgICAgICAgICAgY2hpbGRyZW4gb2YgdGhlIHR5cGUgb2YgPGNvZGU+bmV3Tm9kZTwvY29kZT4gb3IgaWYKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5uZXdOb2RlPC9jb2RlPiBpcyBhbiBhbmNlc3RvciBvZiB0aGUgY29udGFpbmVyLgotCSAqICAgICAgICAgICAgICAgIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+bmV3Tm9kZTwvY29kZT4KLQkgKiAgICAgICAgICAgICAgICBpcyBhbiBBdHRyLCBFbnRpdHksIE5vdGF0aW9uLCBvciBEb2N1bWVudCBub2RlLgotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydE5vZGUoTm9kZSBuZXdOb2RlKSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3QgYSBub2RlIGFuZCBpdHMgY29udGVudHMKLQkgKiAKLQkgKiBAcGFyYW0gcmVmTm9kZVRoZQotCSAqICAgICAgICAgICAgbm9kZSB0byBzZWxlY3QuCi0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIGFuIGFuY2VzdG9yIG9mCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYW4gRW50aXR5LCBOb3RhdGlvbiBvcgotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50VHlwZSBub2RlIG9yIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudCwgRG9jdW1lbnRGcmFnbWVudCwgQXR0ciwgRW50aXR5LCBvciBOb3RhdGlvbgotCSAqICAgICAgICAgICAgICAgIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3ROb2RlKE5vZGUgcmVmTm9kZSkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb24gewotCQlpZiAocmVmTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIHBhcmVudCA9IHJlZk5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBpbmRleCA9ICgoTm9kZUltcGwpIHJlZk5vZGUpLmdldEluZGV4KCk7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm47Ci0JCXNldFN0YXJ0KHBhcmVudCwgaW5kZXgpOwotCQlzZXRFbmQocGFyZW50LCBpbmRleCArIDEpOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdCB0aGUgY29udGVudHMgd2l0aGluIGEgbm9kZQotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlTm9kZQotCSAqICAgICAgICAgICAgdG8gc2VsZWN0IGZyb20KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4KLQkgKiAgICAgICAgICAgICAgICBvciBhbiBhbmNlc3RvciBvZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhbiBFbnRpdHksCi0JICogICAgICAgICAgICAgICAgTm90YXRpb24gb3IgRG9jdW1lbnRUeXBlIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3ROb2RlQ29udGVudHMoTm9kZSByZWZOb2RlKSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChyZWZOb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChyZWZOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSByZWZOb2RlOwotCQkJc2V0U3RhcnQocmVmTm9kZSwgMCk7Ci0JCQlzZXRFbmQocmVmTm9kZSwgdGV4dC5nZXRMZW5ndGgoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlOb2RlTGlzdCBjaGlsZE5vZGVzID0gcmVmTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlpbnQgbGVuZ3RoID0gKGNoaWxkTm9kZXMgIT0gbnVsbCA/IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCkgOiAwKTsKLQkJCXNldFN0YXJ0KHJlZk5vZGUsIDApOwotCQkJc2V0RW5kKHJlZk5vZGUsIGxlbmd0aCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhdHRyaWJ1dGVzIGRlc2NyaWJpbmcgdGhlIGVuZCBvZiBhIFJhbmdlLgotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlVGhlCi0JICogICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiB2YWx1ZS4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZQotCSAqICAgICAgICAgICAgZGlmZmVyZW50IGZyb20gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIG9mZnNldFRoZQotCSAqICAgICAgICAgICAgPGNvZGU+ZW5kT2Zmc2V0PC9jb2RlPiB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4KLQkgKiAgICAgICAgICAgICAgICBvciBhbiBhbmNlc3RvciBvZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhbiBFbnRpdHksCi0JICogICAgICAgICAgICAgICAgTm90YXRpb24sIG9yIERvY3VtZW50VHlwZSBub2RlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5ERVhfU0laRV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5vZmZzZXQ8L2NvZGU+IGlzCi0JICogICAgICAgICAgICAgICAgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgY2hpbGQgdW5pdHMgaW4KLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPi4gQ2hpbGQgdW5pdHMgYXJlIDE2LWJpdCB1bml0cyBpZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEgdHlwZSBvZiBDaGFyYWN0ZXJEYXRhIG5vZGUKLQkgKiAgICAgICAgICAgICAgICAoZS5nLiwgYSBUZXh0IG9yIENvbW1lbnQgbm9kZSkgb3IgYQotCSAqICAgICAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBub2RlLiBDaGlsZCB1bml0cyBhcmUgTm9kZXMgaW4gYWxsCi0JICogICAgICAgICAgICAgICAgb3RoZXIgY2FzZXMuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmQoTm9kZSByZWZOb2RlLCBpbnQgb2Zmc2V0KSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCXRoaXMuZW5kQ29udGFpbmVyID0gcmVmTm9kZTsKLQkJdGhpcy5lbmRPZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZW5kIG9mIGEgUmFuZ2UgdG8gYmUgYWZ0ZXIgYSBub2RlCi0JICogCi0JICogQHBhcmFtIHJlZk5vZGVSYW5nZQotCSAqICAgICAgICAgICAgZW5kcyBhZnRlciA8Y29kZT5yZWZOb2RlPC9jb2RlPi4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgdGhlIHJvb3QgY29udGFpbmVyIG9mCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgbm90IGFuIEF0dHIsIERvY3VtZW50IG9yCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBub2RlIG9yIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudCwgRG9jdW1lbnRGcmFnbWVudCwgQXR0ciwgRW50aXR5LCBvciBOb3RhdGlvbgotCSAqICAgICAgICAgICAgICAgIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRBZnRlcihOb2RlIHJlZk5vZGUpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJlZk5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBwYXJlbnQgPSByZWZOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSAoKE5vZGVJbXBsKSByZWZOb2RlKS5nZXRJbmRleCgpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuOwotCQlzZXRFbmQocGFyZW50LCBpbmRleCArIDEpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGVuZCBwb3NpdGlvbiB0byBiZSBiZWZvcmUgYSBub2RlLgotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlUmFuZ2UKLQkgKiAgICAgICAgICAgIGVuZHMgYmVmb3JlIDxjb2RlPnJlZk5vZGU8L2NvZGU+Ci0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIHRoZSByb290IGNvbnRhaW5lciBvZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIG5vdCBhbiBBdHRyLCBEb2N1bWVudCwgb3IKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudEZyYWdtZW50IG5vZGUgb3IgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYQotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50LCBEb2N1bWVudEZyYWdtZW50LCBBdHRyLCBFbnRpdHksIG9yIE5vdGF0aW9uCi0JICogICAgICAgICAgICAgICAgbm9kZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZEJlZm9yZShOb2RlIHJlZk5vZGUpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJlZk5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBwYXJlbnQgPSByZWZOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSAoKE5vZGVJbXBsKSByZWZOb2RlKS5nZXRJbmRleCgpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuOwotCQlzZXRFbmQocGFyZW50LCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYXR0cmlidXRlcyBkZXNjcmliaW5nIHRoZSBzdGFydCBvZiB0aGUgUmFuZ2UuCi0JICogCi0JICogQHBhcmFtIHJlZk5vZGVUaGUKLQkgKiAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IHZhbHVlLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlCi0JICogICAgICAgICAgICBkaWZmZXJlbnQgZnJvbSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gb2Zmc2V0VGhlCi0JICogICAgICAgICAgICA8Y29kZT5zdGFydE9mZnNldDwvY29kZT4gdmFsdWUuCi0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+Ci0JICogICAgICAgICAgICAgICAgb3IgYW4gYW5jZXN0b3Igb2YgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYW4gRW50aXR5LAotCSAqICAgICAgICAgICAgICAgIE5vdGF0aW9uLCBvciBEb2N1bWVudFR5cGUgbm9kZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOREVYX1NJWkVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+b2Zmc2V0PC9jb2RlPiBpcwotCSAqICAgICAgICAgICAgICAgIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGNoaWxkIHVuaXRzIGluCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4uIENoaWxkIHVuaXRzIGFyZSAxNi1iaXQgdW5pdHMgaWYKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhIHR5cGUgb2YgQ2hhcmFjdGVyRGF0YSBub2RlCi0JICogICAgICAgICAgICAgICAgKGUuZy4sIGEgVGV4dCBvciBDb21tZW50IG5vZGUpIG9yIGEKLQkgKiAgICAgICAgICAgICAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gbm9kZS4gQ2hpbGQgdW5pdHMgYXJlIE5vZGVzIGluIGFsbAotCSAqICAgICAgICAgICAgICAgIG90aGVyIGNhc2VzLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoTm9kZSByZWZOb2RlLCBpbnQgb2Zmc2V0KSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCXRoaXMuc3RhcnRDb250YWluZXIgPSByZWZOb2RlOwotCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXJ0IHBvc2l0aW9uIHRvIGJlIGFmdGVyIGEgbm9kZQotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlUmFuZ2UKLQkgKiAgICAgICAgICAgIHN0YXJ0cyBhZnRlciA8Y29kZT5yZWZOb2RlPC9jb2RlPgotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiB0aGUgcm9vdCBjb250YWluZXIgb2YKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBub3QgYW4gQXR0ciwgRG9jdW1lbnQsIG9yCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBub2RlIG9yIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudCwgRG9jdW1lbnRGcmFnbWVudCwgQXR0ciwgRW50aXR5LCBvciBOb3RhdGlvbgotCSAqICAgICAgICAgICAgICAgIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydEFmdGVyKE5vZGUgcmVmTm9kZSkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb24gewotCQlpZiAocmVmTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIHBhcmVudCA9IHJlZk5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBpbmRleCA9ICgoTm9kZUltcGwpIHJlZk5vZGUpLmdldEluZGV4KCk7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm47Ci0JCXNldFN0YXJ0KHBhcmVudCwgaW5kZXggKyAxKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGFydCBwb3NpdGlvbiB0byBiZSBiZWZvcmUgYSBub2RlCi0JICogCi0JICogQHBhcmFtIHJlZk5vZGVSYW5nZQotCSAqICAgICAgICAgICAgc3RhcnRzIGJlZm9yZSA8Y29kZT5yZWZOb2RlPC9jb2RlPgotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiB0aGUgcm9vdCBjb250YWluZXIgb2YKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBub3QgYW4gQXR0ciwgRG9jdW1lbnQsIG9yCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBub2RlIG9yIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudCwgRG9jdW1lbnRGcmFnbWVudCwgQXR0ciwgRW50aXR5LCBvciBOb3RhdGlvbgotCSAqICAgICAgICAgICAgICAgIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydEJlZm9yZShOb2RlIHJlZk5vZGUpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJlZk5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBwYXJlbnQgPSByZWZOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSAoKE5vZGVJbXBsKSByZWZOb2RlKS5nZXRJbmRleCgpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuOwotCQlzZXRTdGFydChwYXJlbnQsIGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBhcmVudHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBSYW5nZSB0byB0aGUgZ2l2ZW4gbm9kZSBhbmQgaW5zZXJ0cyB0aGUKLQkgKiBub2RlIGF0IHRoZSBwb3NpdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIFJhbmdlLgotCSAqIAotCSAqIEBwYXJhbSBuZXdQYXJlbnRUaGUKLQkgKiAgICAgICAgICAgIG5vZGUgdG8gc3Vycm91bmQgdGhlIGNvbnRlbnRzIHdpdGguCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiBhbiBhbmNlc3RvcgotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW5lciBvZiBlaXRoZXIgYm91bmRhcnktcG9pbnQgb2YgdGhlIFJhbmdlIGlzCi0JICogICAgICAgICAgICAgICAgcmVhZC1vbmx5LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgV1JPTkdfRE9DVU1FTlRfRVJSOiBSYWlzZWQgaWYgPGNvZGU+IG5ld1BhcmVudDwvY29kZT4KLQkgKiAgICAgICAgICAgICAgICBhbmQgdGhlIGNvbnRhaW5lciBvZiB0aGUgc3RhcnQgb2YgdGhlIFJhbmdlIHdlcmUgbm90Ci0JICogICAgICAgICAgICAgICAgY3JlYXRlZCBmcm9tIHRoZSBzYW1lIGRvY3VtZW50LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSElFUkFSQ0hZX1JFUVVFU1RfRVJSOiBSYWlzZWQgaWYgdGhlIGNvbnRhaW5lciBvZiB0aGUKLQkgKiAgICAgICAgICAgICAgICBzdGFydCBvZiB0aGUgUmFuZ2UgaXMgb2YgYSB0eXBlIHRoYXQgZG9lcyBub3QgYWxsb3cKLQkgKiAgICAgICAgICAgICAgICBjaGlsZHJlbiBvZiB0aGUgdHlwZSBvZiA8Y29kZT5uZXdQYXJlbnQ8L2NvZGU+IG9yIGlmCi0JICogICAgICAgICAgICAgICAgPGNvZGU+bmV3UGFyZW50PC9jb2RlPiBpcyBhbiBhbmNlc3RvciBvZiB0aGUgY29udGFpbmVyCi0JICogICAgICAgICAgICAgICAgb3IgaWYgPGNvZGU+bm9kZTwvY29kZT4gd291bGQgZW5kIHVwIHdpdGggYSBjaGlsZCBub2RlCi0JICogICAgICAgICAgICAgICAgb2YgYSB0eXBlIG5vdCBhbGxvd2VkIGJ5IHRoZSB0eXBlIG9mIDxjb2RlPm5vZGU8L2NvZGU+LgotCSAqICAgICAgICAgICAgICAgIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgQkFEX0JPVU5EQVJZUE9JTlRTX0VSUjogUmFpc2VkIGlmIHRoZSBSYW5nZSBwYXJ0aWFsbHkKLQkgKiAgICAgICAgICAgICAgICBzZWxlY3RzIGEgbm9uLXRleHQgbm9kZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIDxjb2RlPiBub2RlPC9jb2RlPiBpcwotCSAqICAgICAgICAgICAgICAgIGFuIEF0dHIsIEVudGl0eSwgRG9jdW1lbnRUeXBlLCBOb3RhdGlvbiwgRG9jdW1lbnQsIG9yCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBub2RlLgotCSAqLwotCXB1YmxpYyB2b2lkIHN1cnJvdW5kQ29udGVudHMoTm9kZSBuZXdQYXJlbnQpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmVhZE9ubHlDb250cm9sbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JlYWRPbmx5Q29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODBlNzE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmVhZE9ubHlDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotY2xhc3MgUmVhZE9ubHlDb250cm9sbGVyIHsKLQotCWNsYXNzIFNwYW4gewotCQlpbnQgbGVuZ3RoOwotCQlpbnQgb2Zmc2V0OwotCi0JCVNwYW4oaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIFJlYWRPbmx5Q29udHJvbGxlciBmSW5zdGFuY2U7Ci0KLQlzdGF0aWMgc3luY2hyb25pemVkIFJlYWRPbmx5Q29udHJvbGxlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgUmVhZE9ubHlDb250cm9sbGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSB2b2lkIGxvY2soSVN0cnVjdHVyZWREb2N1bWVudCBkb2MsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gY2FuSW5zZXJ0QmVmb3JlLCBib29sZWFuIGNhbkluc2VydEFmdGVyKSB7Ci0JCWlmIChkb2MgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChkb2MgaW5zdGFuY2VvZiBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudClkb2MpLm1ha2VSZWFkT25seShvZmZzZXQsIGxlbmd0aCwgY2FuSW5zZXJ0QmVmb3JlLCBjYW5JbnNlcnRBZnRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlkb2MubWFrZVJlYWRPbmx5KG9mZnNldCwgbGVuZ3RoKTsKLQkJfQotCX0KLQotCXN0YXRpYyBwcml2YXRlIHZvaWQgbG9jayhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUsIGJvb2xlYW4gY2FuSW5zZXJ0QmVmb3JlLCBib29sZWFuIGNhbkluc2VydEFmdGVyKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IG5vZGUuZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGRvYyBpbnN0YW5jZW9mIEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KWRvYykubWFrZVJlYWRPbmx5KG5vZGUuZ2V0U3RhcnQoKSwgbm9kZS5nZXRMZW5ndGgoKSwgY2FuSW5zZXJ0QmVmb3JlLCBjYW5JbnNlcnRBZnRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlkb2MubWFrZVJlYWRPbmx5KG5vZGUuZ2V0U3RhcnQoKSwgbm9kZS5nZXRMZW5ndGgoKSk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSB2b2lkIHVubG9jayhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRQYXJlbnREb2N1bWVudCgpOwotCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlkb2MuY2xlYXJSZWFkT25seShub2RlLmdldFN0YXJ0KCksIG5vZGUuZ2V0TGVuZ3RoKCkpOwotCX0KLQotCXByaXZhdGUgUmVhZE9ubHlDb250cm9sbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgU3BhbiBnZXREYXRhU3BhbihJRE9NTm9kZSBub2RlKSB7Ci0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLQkJCQlyZXR1cm4gZ2V0RGF0YVNwYW5Gb3JFbGVtZW50KChJRE9NRWxlbWVudCkgbm9kZSk7Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCQlyZXR1cm4gZ2V0RGF0YVNwYW5Gb3JUZXh0KChJRE9NVGV4dCkgbm9kZSk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbmV3IFNwYW4oMCwgLTEpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTcGFuIGdldERhdGFTcGFuRm9yRWxlbWVudChJRE9NRWxlbWVudCBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jUmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZG9jUmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU3BhbigwLCAtMSk7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGRvY1JlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU3BhbigwLCAtMSk7Ci0JCX0KLQotCQlTdHJpbmcgc3RhcnRUeXBlOwotCQlTdHJpbmcgZW5kVHlwZTsKLQkJaWYgKG5vZGUuaXNDb21tZW50VGFnKCkpIHsKLQkJCXN0YXJ0VHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTjsKLQkJCWVuZFR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFOwotCQl9IGVsc2UgewotCQkJc3RhcnRUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUU7Ci0JCQllbmRUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFOwotCQl9Ci0KLQkJaW50IHN0YXJ0T2Zmc2V0ID0gLTE7Ci0JCWludCBlbmRPZmZzZXQgPSAtMTsKLQkJSVRleHRSZWdpb24gcHJldlJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlyZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IHN0YXJ0VHlwZSkgewotCQkJCXN0YXJ0T2Zmc2V0ID0gcmVnaW9uLmdldEVuZCgpOwotCQkJfSBlbHNlIGlmICh0eXBlID09IGVuZFR5cGUgJiYgcHJldlJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJZW5kT2Zmc2V0ID0gcHJldlJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCQl9Ci0JCQlwcmV2UmVnaW9uID0gcmVnaW9uOwotCQl9Ci0KLQkJaWYgKDAgPD0gc3RhcnRPZmZzZXQgJiYgMCA8PSBlbmRPZmZzZXQpIHsKLQkJCXJldHVybiBuZXcgU3BhbihzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG5ldyBTcGFuKDAsIC0xKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3BhbiBnZXREYXRhU3BhbkZvclRleHQoSURPTVRleHQgbm9kZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY1JlZ2lvbiA9ICgoTm9kZUltcGwpIG5vZGUpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZG9jUmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU3BhbigwLCAtMSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTcGFuKDAsIGRvY1JlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCBmcm9tIHBhcmVudCdzIHNldENoaWxkRWRpdGFibGUoKQotCSAqIAotCSAqIGNhc2UgMTo8cGFyZW50Pjxub2RlIGF0dHI9InZhbHVlIi8+IDxub2RlMj48L3BhcmVudD4KLQkgKiB4IyMjIyMjIyMjIyMjIyMjIyMjIyN4IGNhc2UgMjo8cGFyZW50Pjxub2RlIGF0dHI9InZhbHVlIj4gPGNoaWxkPgotCSAqIDwvY2hpbGQ+IDwvbm9kZT4gPC9wYXJlbnQ+IHgjIyMjIyMjIyMjIyMjIyMjIyMjPyA/IyMjIyMjI3ggKD8gOgotCSAqIGVkaXRhYmxlIGlmIG5vZGUuaXNFZGl0YWJsZSgpID09IHRydWUpCi0JICovCi0Jdm9pZCBsb2NrQm90aChJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGU7Ci0JCWJvb2xlYW4gY2FuSW5zZXJ0ID0gZmFsc2U7Ci0KLQkJLy8gZW5kIG5vZGUgKGVsZW1lbnQpCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWZsYXROb2RlID0gbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJY2FuSW5zZXJ0ID0gbm9kZS5pc0NoaWxkRWRpdGFibGUoKTsKLQkJCQlsb2NrKGZsYXROb2RlLCBjYW5JbnNlcnQsIGZhbHNlKTsKLQkJCX0KLQkJfQotCQkvLyBzdGFydCBub2RlCi0JCWZsYXROb2RlID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJbG9jayhmbGF0Tm9kZSwgZmFsc2UsIGNhbkluc2VydCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGxvY2tEYXRhKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3BhbiBzcGFuID0gZ2V0RGF0YVNwYW4obm9kZSk7Ci0JCWlmICgwIDw9IHNwYW4ubGVuZ3RoKSB7Ci0JCQlsb2NrKG5vZGUuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgbm9kZS5nZXRTdGFydE9mZnNldCgpICsgc3Bhbi5vZmZzZXQsIHNwYW4ubGVuZ3RoLCBmYWxzZSwgZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbG9jayBpdHNlbGYgYW5kIGFsbCBkZXNjZW5kYW50cwotCSAqLwotCXZvaWQgbG9ja0RlZXAoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgb2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gbm9kZS5nZXRFbmRPZmZzZXQoKSAtIG9mZnNldDsKLQotCQlib29sZWFuIGNhbkluc2VydCA9IHRydWU7Ci0JCUlET01Ob2RlIHBhcmVudCA9IChJRE9NTm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiAhcGFyZW50LmlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQljYW5JbnNlcnQgPSBmYWxzZTsKLQkJfQotCQlsb2NrKG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIG9mZnNldCwgbGVuZ3RoLCBjYW5JbnNlcnQsIGNhbkluc2VydCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCBmcm9tIHBhcmVudCdzIHNldENoaWxkRWRpdGFibGUoKQotCSAqIAotCSAqIGNhc2UgMTo8cGFyZW50Pjxub2RlIGF0dHI9InZhbHVlIi8+IDxub2RlMj48L3BhcmVudD4geCMjIyMjI3ggeCMjeAotCSAqIGNhc2UgMjo8cGFyZW50Pjxub2RlIGF0dHI9InZhbHVlIj4gPGNoaWxkPjwvY2hpbGQ+IDwvbm9kZT4gPC9wYXJlbnQ+Ci0JICogeCMjIyMjI3ggeCM/ID8jIyMjIyMjeCAoPyA6IGVkaXRhYmxlIGlmIG5vZGUuaXNFZGl0YWJsZSgpID09IHRydWUpCi0JICovCi0Jdm9pZCBsb2NrTm9kZShJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIW5vZGUuaXNEYXRhRWRpdGFibGUoKSkgewotCQkJbG9ja0JvdGgobm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlOwotCQlib29sZWFuIGNhbkluc2VydCA9IGZhbHNlOwotCi0JCS8vIGVuZCBub2RlIChlbGVtZW50KQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCWNhbkluc2VydCA9IG5vZGUuaXNDaGlsZEVkaXRhYmxlKCk7Ci0JCQkJbG9jayhmbGF0Tm9kZSwgY2FuSW5zZXJ0LCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gc3RhcnQgbm9kZQotCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCVNwYW4gc3BhbiA9IGdldERhdGFTcGFuKG5vZGUpOwotCQkJaWYgKDAgPD0gc3Bhbi5sZW5ndGgpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGZsYXROb2RlLmdldFBhcmVudERvY3VtZW50KCk7Ci0JCQkJaW50IG9mZnNldCwgbGVuZ3RoOwotCQkJCW9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCQkJbGVuZ3RoID0gc3Bhbi5vZmZzZXQ7Ci0JCQkJbG9jayhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoLCBmYWxzZSwgZmFsc2UpOwotCQkJCW9mZnNldCA9IG9mZnNldCArIHNwYW4ub2Zmc2V0ICsgc3Bhbi5sZW5ndGg7Ci0JCQkJbGVuZ3RoID0gZmxhdE5vZGUuZ2V0RW5kKCkgLSBvZmZzZXQ7Ci0JCQkJbG9jayhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoLCBjYW5JbnNlcnQsIGZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbG9jayhmbGF0Tm9kZSwgZmFsc2UsIGNhbkluc2VydCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5sb2NrKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmIChkb2MgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWRvYy5jbGVhclJlYWRPbmx5KG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQl2b2lkIHVubG9ja0JvdGgoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlOwotCQkvLyBzdGFydCBub2RlCi0JCWZsYXROb2RlID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJdW5sb2NrKGZsYXROb2RlKTsKLQkJfQotCQkvLyBlbmQgbm9kZQotCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQl1bmxvY2soZmxhdE5vZGUpOwotCQl9Ci0JfQotCi0Jdm9pZCB1bmxvY2tEYXRhKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3BhbiBzcGFuID0gZ2V0RGF0YVNwYW4obm9kZSk7Ci0JCWlmICgwIDw9IHNwYW4ubGVuZ3RoKSB7Ci0JCQl1bmxvY2sobm9kZS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBzcGFuLm9mZnNldCwgc3Bhbi5sZW5ndGgpOwotCQl9Ci0JfQotCi0Jdm9pZCB1bmxvY2tEZWVwKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IG9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aCA9IG5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBvZmZzZXQ7Ci0KLQkJdW5sb2NrKG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQl2b2lkIHVubG9ja05vZGUoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlOwotCQkvLyBlbmQgbm9kZQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCXVubG9jayhmbGF0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBzdGFydCBub2RlCi0JCWZsYXROb2RlID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUuaXNEYXRhRWRpdGFibGUoKSkgewotCQkJCXVubG9jayhmbGF0Tm9kZSk7Ci0JCQl9IGVsc2UgewotCQkJCVNwYW4gc3BhbiA9IGdldERhdGFTcGFuKG5vZGUpOwotCQkJCWlmIChzcGFuLmxlbmd0aCA8PSAwKSB7Ci0JCQkJCXVubG9jayhmbGF0Tm9kZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBmbGF0Tm9kZS5nZXRQYXJlbnREb2N1bWVudCgpOwotCQkJCQlpbnQgb2Zmc2V0LCBsZW5ndGg7Ci0JCQkJCW9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCQkJCWxlbmd0aCA9IHNwYW4ub2Zmc2V0IC0gb2Zmc2V0OwotCQkJCQl1bmxvY2soc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCW9mZnNldCA9IHNwYW4ub2Zmc2V0ICsgc3Bhbi5sZW5ndGg7Ci0JCQkJCWxlbmd0aCA9IGZsYXROb2RlLmdldEVuZCgpIC0gc3Bhbi5vZmZzZXQ7Ci0JCQkJCXVubG9jayhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1NvdXJjZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Tb3VyY2VWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkZDU2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1NvdXJjZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JWE1MQ2hhckVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBTb3VyY2VWYWxpZGF0b3IgewotCi0JcHJpdmF0ZSBOb2RlSW1wbCBub2RlID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBTb3VyY2VWYWxpZGF0b3IoTm9kZSBub2RlKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJdGhpcy5ub2RlID0gKE5vZGVJbXBsKSBub2RlOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U291cmNlKFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLm5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCi0JCS8vIHNldHVwIGNvbnZlcnNpb24gY29uZGl0aW9ucwotCQlib29sZWFuIGFjY2VwdFRhZyA9IGZhbHNlOwotCQlib29sZWFuIGFjY2VwdENsb3NlID0gZmFsc2U7Ci0JCWJvb2xlYW4gYWNjZXB0UXVvdGUgPSBmYWxzZTsKLQkJYm9vbGVhbiBhY2NlcHRBbXBlcnNhbmQgPSBmYWxzZTsKLQkJYm9vbGVhbiBhY2NlcHRFbnRpdHlSZWYgPSB0cnVlOwotCQlib29sZWFuIGFjY2VwdEpTUEVuZCA9IHRydWU7Ci0JCVN0cmluZyBlbmRUYWdOYW1lID0gbnVsbDsKLQkJaWYgKHRoaXMubm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IChJRE9NRG9jdW1lbnQpIHRoaXMubm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5pc0pTUFR5cGUoKSkKLQkJCQlhY2NlcHRUYWcgPSB0cnVlOwotCQkJaWYgKGFjY2VwdFRhZykgewotCQkJCUF0dHIgYXR0ciA9IChBdHRyKSB0aGlzLm5vZGU7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuaXNKU1BUYWcoKSkKLQkJCQkJYWNjZXB0VGFnID0gZmFsc2U7Ci0JCQl9Ci0JCQkvLyBpZiB0aGUgc291cmNlIGRvZXMgbm90IGluY2x1ZGUgc2luZ2xlIHF1b3RlLAotCQkJLy8gZG91YmxlIHF1b3RlIGlzIHZhbGlkCi0JCQlhY2NlcHRRdW90ZSA9IChzb3VyY2UuaW5kZXhPZignXCcnKSA8IDApOwotCQl9IGVsc2UgaWYgKHRoaXMubm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSB0aGlzLm5vZGU7Ci0JCQlpZiAodGV4dC5pc0pTUENvbnRlbnQoKSkgewotCQkJCWludCBpbmRleCA9IHNvdXJjZS5pbmRleE9mKEpTUFRhZy5UQUdfQ0xPU0UpOwotCQkJCWlmIChpbmRleCA8IDApCi0JCQkJCXJldHVybiBzb3VyY2U7Ci0JCQkJYWNjZXB0VGFnID0gdHJ1ZTsKLQkJCQlhY2NlcHRDbG9zZSA9IHRydWU7Ci0JCQkJYWNjZXB0UXVvdGUgPSB0cnVlOwotCQkJCWFjY2VwdEFtcGVyc2FuZCA9IHRydWU7Ci0JCQkJYWNjZXB0SlNQRW5kID0gZmFsc2U7Ci0JCQl9IGVsc2UgaWYgKHRleHQuaXNDREFUQUNvbnRlbnQoKSkgewotCQkJCWVuZFRhZ05hbWUgPSB0ZXh0LmdldFBhcmVudE5vZGUoKS5nZXROb2RlTmFtZSgpOwotCQkJCWlmIChlbmRUYWdOYW1lID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQkJCWFjY2VwdFRhZyA9IHRydWU7Ci0JCQkJYWNjZXB0Q2xvc2UgPSB0cnVlOwotCQkJCWFjY2VwdFF1b3RlID0gdHJ1ZTsKLQkJCQlhY2NlcHRBbXBlcnNhbmQgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJCWlmICh0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQlkb2N1bWVudCA9IChJRE9NRG9jdW1lbnQpIHRoaXMubm9kZTsKLQkJCX0gZWxzZSB7Ci0JCQkJZG9jdW1lbnQgPSAoSURPTURvY3VtZW50KSB0aGlzLm5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJfQotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuaXNKU1BUeXBlKCkpCi0JCQkJYWNjZXB0VGFnID0gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlpbnQgY29waWVkTGVuZ3RoID0gMDsKLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHJlZiA9IG51bGw7Ci0JCQljaGFyIGMgPSBzb3VyY2UuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjKSB7Ci0JCQkJY2FzZSAnPCcgOgotCQkJCQlpZiAoYWNjZXB0VGFnKSB7Ci0JCQkJCQlpZiAoZW5kVGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKCFtYXRjaEVuZFRhZyhzb3VyY2UsIGkgKyAxLCBlbmRUYWdOYW1lKSkKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWludCBza2lwID0gc2tpcFRhZyhzb3VyY2UsIGkgKyAxKTsKLQkJCQkJCQlpZiAoc2tpcCA+PSAwKSB7Ci0JCQkJCQkJCWkgKz0gc2tpcDsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLy8gaW52YWxpZCBKU1AgdGFnCi0JCQkJCX0KLQkJCQkJcmVmID0gSVhNTENoYXJFbnRpdHkuTFRfUkVGOwotCQkJCQlicmVhazsKLQkJCQljYXNlICc+JyA6Ci0JCQkJCWlmIChhY2NlcHRDbG9zZSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlyZWYgPSBJWE1MQ2hhckVudGl0eS5HVF9SRUY7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyYnIDoKLQkJCQkJaWYgKGFjY2VwdEFtcGVyc2FuZCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlpZiAoYWNjZXB0RW50aXR5UmVmKSB7Ci0JCQkJCQlpbnQgc2tpcCA9IHNraXBFbnRpdHlSZWYoc291cmNlLCBpICsgMSk7Ci0JCQkJCQlpZiAoc2tpcCA+PSAwKSB7Ci0JCQkJCQkJaSArPSBza2lwOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJlZiA9IElYTUxDaGFyRW50aXR5LkFNUF9SRUY7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyInIDoKLQkJCQkJaWYgKGFjY2VwdFF1b3RlKQotCQkJCQkJY29udGludWU7Ci0JCQkJCXJlZiA9IElYTUxDaGFyRW50aXR5LlFVT1RfUkVGOwotCQkJCQlicmVhazsKLQkJCQljYXNlICclJyA6Ci0JCQkJCWlmIChhY2NlcHRKU1BFbmQpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaWYgKHNvdXJjZS5jaGFyQXQoaSArIDEpICE9ICc+JykKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlpKys7Ci0JCQkJCXJlZiA9IElYTUxDaGFyRW50aXR5LkdUX1JFRjsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAocmVmICE9IG51bGwpIHsKLQkJCQlpZiAoYnVmZmVyID09IG51bGwpIHsKLQkJCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyA4KTsKLQkJCQl9Ci0JCQkJaWYgKGkgPiBjb3BpZWRMZW5ndGgpIHsKLQkJCQkJYnVmZmVyLmFwcGVuZChzb3VyY2Uuc3Vic3RyaW5nKGNvcGllZExlbmd0aCwgaSkpOwotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKHJlZik7Ci0JCQkJY29waWVkTGVuZ3RoID0gaSArIDE7IC8vIHNraXAgdGhpcyBjaGFyYWN0ZXIKLQkJCX0KLQkJfQotCi0JCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJaWYgKGNvcGllZExlbmd0aCA8IGxlbmd0aCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlLnN1YnN0cmluZyhjb3BpZWRMZW5ndGgsIGxlbmd0aCkpOwotCQkJfQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1hdGNoRW5kVGFnKFN0cmluZyBzb3VyY2UsIGludCBvZmZzZXQsIFN0cmluZyBlbmRUYWdOYW1lKSB7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCB8fCBlbmRUYWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSBsZW5ndGgpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChzb3VyY2UuY2hhckF0KG9mZnNldCkgIT0gJy8nKQotCQkJcmV0dXJuIGZhbHNlOwotCQlvZmZzZXQrKzsKLQkJaW50IGVuZCA9IG9mZnNldCArIGVuZFRhZ05hbWUubGVuZ3RoKCk7Ci0JCWlmIChlbmQgPiBsZW5ndGgpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBlbmRUYWdOYW1lLmVxdWFsc0lnbm9yZUNhc2Uoc291cmNlLnN1YnN0cmluZyhvZmZzZXQsIGVuZCkpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHNraXBFbnRpdHlSZWYoU3RyaW5nIHNvdXJjZSwgaW50IG9mZnNldCkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSBzb3VyY2UubGVuZ3RoKCkpCi0JCQlyZXR1cm4gLTE7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIHRoaXMubm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOyAvLyBlcnJvcgotCi0JCWludCBlbmQgPSBzb3VyY2UuaW5kZXhPZignOycsIG9mZnNldCk7Ci0JCWlmIChlbmQgPCAwIHx8IGVuZCA9PSBvZmZzZXQpCi0JCQlyZXR1cm4gLTE7Ci0JCVN0cmluZyBuYW1lID0gc291cmNlLnN1YnN0cmluZyhvZmZzZXQsIGVuZCk7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgZG9jdW1lbnQuZ2V0Q2hhclZhbHVlKG5hbWUpID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCXJldHVybiAoZW5kICsgMSAtIG9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgc2tpcFRhZyhTdHJpbmcgc291cmNlLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID49IHNvdXJjZS5sZW5ndGgoKSkKLQkJCXJldHVybiAtMTsKLQotCQlpbnQgZW5kID0gb2Zmc2V0OwotCQlpZiAoc291cmNlLmNoYXJBdChvZmZzZXQpID09ICclJykgewotCQkJLy8gSlNQIHRhZwotCQkJaW50IGZvdW5kID0gc291cmNlLmluZGV4T2YoSlNQVGFnLlRBR19DTE9TRSwgb2Zmc2V0ICsgMSk7Ci0JCQlpZiAoZm91bmQgPCAwKQotCQkJCXJldHVybiAtMTsgLy8gaW52YWxpZCBKU1AgdGFnCi0JCQllbmQgPSBmb3VuZCArIDI7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBub3JtYWwgdGFnCi0JCQlpbnQgZm91bmQgPSBzb3VyY2UuaW5kZXhPZignPicsIG9mZnNldCk7Ci0JCQlpZiAoZm91bmQgPCAwKQotCQkJCXJldHVybiAtMTsgLy8gaW52YWxpZCB0YWcKLQkJCWVuZCA9IGZvdW5kICsgMTsKLQkJfQotCQlyZXR1cm4gKGVuZCAtIG9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTb3VyY2UoU3RyaW5nIHNvdXJjZSkgdGhyb3dzIEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24gewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHRoaXMubm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOyAvLyBlcnJvcgotCQlTdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0KLQkJLy8gc2V0dXAgdmFsaWRhdGlvbiBjb25kaXRpb25zCi0JCWJvb2xlYW4gYWNjZXB0VGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gYWNjZXB0Q2xvc2UgPSBmYWxzZTsKLQkJYm9vbGVhbiBhY2NlcHRRdW90ZSA9IHRydWU7Ci0JCWJvb2xlYW4gYWNjZXB0RW50aXR5UmVmID0gdHJ1ZTsKLQkJU3RyaW5nIGVuZFRhZ05hbWUgPSBudWxsOwotCQlpZiAodGhpcy5ub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gKElET01Eb2N1bWVudCkgdGhpcy5ub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50LmlzSlNQVHlwZSgpKQotCQkJCWFjY2VwdFRhZyA9IHRydWU7Ci0JCQlpZiAoYWNjZXB0VGFnKSB7Ci0JCQkJQXR0ciBhdHRyID0gKEF0dHIpIHRoaXMubm9kZTsKLQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotCQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5pc0pTUFRhZygpKQotCQkJCQlhY2NlcHRUYWcgPSBmYWxzZTsKLQkJCX0KLQkJCS8vIGlmIHRoZSBzb3VyY2UgZG9lcyBub3QgaW5jbHVkZSBzaW5nbGUgcXVvdGUsCi0JCQkvLyBkb3VibGUgcXVvdGUgaXMgdmFsaWQKLQkJCWFjY2VwdFF1b3RlID0gKHNvdXJjZS5pbmRleE9mKCdcJycpIDwgMCk7Ci0JCX0gZWxzZSBpZiAodGhpcy5ub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIHRoaXMubm9kZTsKLQkJCWlmICh0ZXh0LmlzSlNQQ29udGVudCgpKSB7Ci0JCQkJaW50IGluZGV4ID0gc291cmNlLmluZGV4T2YoSlNQVGFnLlRBR19DTE9TRSk7Ci0JCQkJaWYgKGluZGV4IDwgMCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJbWVzc2FnZSA9IFhNTENvcmVNZXNzYWdlcy5JbnZhbGlkX2NoYXJhY3Rlcl9ndF9mb19FUlJPUl87Ci0JCQkJdGhyb3cgbmV3IEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24obWVzc2FnZSwgJz4nLCBpbmRleCArIDEpOwotCQkJfSBlbHNlIGlmICh0ZXh0LmlzQ0RBVEFDb250ZW50KCkpIHsKLQkJCQllbmRUYWdOYW1lID0gdGV4dC5nZXRQYXJlbnROb2RlKCkuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAoZW5kVGFnTmFtZSA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIGVycm9yCi0JCQkJYWNjZXB0VGFnID0gdHJ1ZTsKLQkJCQlhY2NlcHRDbG9zZSA9IHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQkJaWYgKHRoaXMubm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCWRvY3VtZW50ID0gKElET01Eb2N1bWVudCkgdGhpcy5ub2RlOwotCQkJfSBlbHNlIHsKLQkJCQlkb2N1bWVudCA9IChJRE9NRG9jdW1lbnQpIHRoaXMubm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQl9Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5pc0pTUFR5cGUoKSkKLQkJCQlhY2NlcHRUYWcgPSB0cnVlOwotCQl9Ci0KLQkJY2hhciBjID0gMDsKLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJYyA9IHNvdXJjZS5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCQljYXNlICc8JyA6Ci0JCQkJCWlmIChhY2NlcHRUYWcpIHsKLQkJCQkJCWlmIChlbmRUYWdOYW1lICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoIW1hdGNoRW5kVGFnKHNvdXJjZSwgaSArIDEsIGVuZFRhZ05hbWUpKQotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaW50IHNraXAgPSBza2lwVGFnKHNvdXJjZSwgaSArIDEpOwotCQkJCQkJCWlmIChza2lwID49IDApIHsKLQkJCQkJCQkJaSArPSBza2lwOwotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvLyBpbnZhbGlkIHRhZwotCQkJCQl9Ci0JCQkJCW1lc3NhZ2UgPSBYTUxDb3JlTWVzc2FnZXMuSW52YWxpZF9jaGFyYWN0ZXJfbHRfZm9fRVJST1JfOwotCQkJCQlicmVhazsKLQkJCQljYXNlICc+JyA6Ci0JCQkJCWlmIChhY2NlcHRDbG9zZSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQltZXNzYWdlID0gWE1MQ29yZU1lc3NhZ2VzLkludmFsaWRfY2hhcmFjdGVyX2d0X2ZvX0VSUk9SXzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnJicgOgotCQkJCQlpZiAoYWNjZXB0RW50aXR5UmVmKSB7Ci0JCQkJCQlpZiAoZW5kVGFnTmFtZSAhPSBudWxsKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJaW50IHNraXAgPSBza2lwRW50aXR5UmVmKHNvdXJjZSwgaSArIDEpOwotCQkJCQkJaWYgKHNraXAgPj0gMCkgewotCQkJCQkJCWkgKz0gc2tpcDsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCS8vIGludmFsaWQgZW50aXR5IHJlZmVyZW5jZQotCQkJCQl9Ci0JCQkJCW1lc3NhZ2UgPSBYTUxDb3JlTWVzc2FnZXMuSW52YWxpZF9jaGFyYWN0ZXJfYW1wX2ZvX0VSUk9SXzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnIicgOgotCQkJCQlpZiAoYWNjZXB0UXVvdGUpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJbWVzc2FnZSA9IFhNTENvcmVNZXNzYWdlcy5JbnZhbGlkX2NoYXJhY3Rlcl9fZl9FWENfOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbihtZXNzYWdlLCBjLCBpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ2hlY2tlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25DaGVja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0N2M4ZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25DaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIG9ubHkgZm9yIGRlYnVnIHB1cnBvc2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25DaGVja2VyIHsKLQlTdHJpbmcgRU9MID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGludCBvZmZzZXQgPSAwOwotCVdyaXRlciB0ZXN0V3JpdGVyID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25DaGVja2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25DaGVja2VyKFdyaXRlciB3cml0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGVzdFdyaXRlciA9IHdyaXRlcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tDaGlsZE5vZGVzKE5vZGUgbm9kZSkgewotCQlmb3IgKE5vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQljaGVja05vZGUoY2hpbGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tNb2RlbChJRE9NTW9kZWwgbW9kZWwpIHsKLQkJY2hlY2tDaGlsZE5vZGVzKG1vZGVsLmdldERvY3VtZW50KCkpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja05vZGUoTm9kZSBub2RlKSB7Ci0JCWNoZWNrU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCgoTm9kZUltcGwpIG5vZGUpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJY2hlY2tDaGlsZE5vZGVzKG5vZGUpOwotCQkJY2hlY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKChFbGVtZW50SW1wbCkgbm9kZSkuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQlpbnQgbiA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGMgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCWlmIChjID09IG51bGwpIHsKLQkJCQkJcmVwb3J0RXJyb3IoIm51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJY2hlY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oYyk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc3RhcnQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlpZiAoc3RhcnQgPCB0aGlzLm9mZnNldCkKLQkJCXJlcG9ydEVycm9yKCJvdmVyd3JhcCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzdGFydCA+IHRoaXMub2Zmc2V0KQotCQkJcmVwb3J0RXJyb3IoImdhcCIpOyAvLyROT04tTkxTLTEkCi0JCWludCBlbmQgPSBmbGF0Tm9kZS5nZXRFbmQoKTsKLQkJdGhpcy5vZmZzZXQgPSBlbmQ7Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBmbGF0Tm9kZTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcCA9IHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKHAgPT0gbnVsbCkgewotCQkJCXJlcG9ydEVycm9yKCJudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpbnQgcyA9IHAuZ2V0U3RhcnQoKTsKLQkJCWludCBlID0gcC5nZXRFbmQoKTsKLQkJCWlmIChzID4gc3RhcnQgfHwgZSA8IGVuZCkKLQkJCQlyZXBvcnRFcnJvcigib3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChzID09IHN0YXJ0ICYmIGUgPT0gZW5kKQotCQkJCXJlcG9ydFdhcm5pbmcoInZhaW4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlcG9ydEVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCVN0cmluZyBtc2cgPSAiU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ2hlY2tlciA6IGVycm9yIDogIiArIG1lc3NhZ2U7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRlc3RXcml0ZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl0ZXN0V3JpdGVyLndyaXRlKG1zZyArIEVPTCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQl9Ci0JCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlcG9ydFdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJU3RyaW5nIG1zZyA9ICJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25DaGVja2VyIDogd2FybmluZyA6ICIgKyBtZXNzYWdlOyAvLyROT04tTkxTLTEkCi0JCWlmICh0ZXN0V3JpdGVyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJdGVzdFdyaXRlci53cml0ZShtc2cgKyBFT0wpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTUzNzg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotCi0KLWNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gewotCi0JcHJpdmF0ZSBWZWN0b3IgZmxhdE5vZGVzID0gbmV3IFZlY3RvcigyKTsKLQotCS8qKgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkZFJlZ2lvbihJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3QoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJaWYgKGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpID4gMCkgewotCQkJCXRoaXMuZmxhdE5vZGVzLmFkZEFsbChjb250YWluZXIuZmxhdE5vZGVzKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuZmxhdE5vZGVzLmFkZEVsZW1lbnQoZmxhdE5vZGUpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChJVGV4dFJlZ2lvbiByZWdpb24sIGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldERlZXBlc3RSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdCA9IGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGxhc3QgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gbGFzdC5nZXRFbmQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldEVuZCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRGaXJzdFJlZ2lvbigpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlpZiAodGhpcy5mbGF0Tm9kZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgdGhpcy5mbGF0Tm9kZXMuZWxlbWVudEF0KDApOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoKSB7Ci0JCXJldHVybiBnZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dChJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dChTdHJpbmcgY29udGV4dCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRMYXN0UmVnaW9uKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJaW50IHNpemUgPSB0aGlzLmZsYXROb2Rlcy5zaXplKCk7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB0aGlzLmZsYXROb2Rlcy5lbGVtZW50QXQoc2l6ZSAtIDEpOwotCX0KLQotCS8qKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIChnZXRFbmQoKSAtIGdldFN0YXJ0KCkpOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldE5leHQoKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXROdW1iZXJPZlJlZ2lvbnMoKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uQ29udGFpbmVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0UGFyZW50RG9jdW1lbnQoKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0UHJldmlvdXMoKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb25MaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdCA9IGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmaXJzdCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBmaXJzdC5nZXRTdGFydCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0ID0gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZpcnN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGZpcnN0LmdldFBhcmVudERvY3VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5mbGF0Tm9kZXMuc2l6ZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgdGhpcy5mbGF0Tm9kZXMuZWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlpbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKSB7Ci0JCXJldHVybiB0aGlzLmZsYXROb2Rlcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlpbnQgc2l6ZSA9IHRoaXMuZmxhdE5vZGVzLnNpemUoKTsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHRoaXMuZmxhdE5vZGVzLmVsZW1lbnRBdChpKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJYnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KCkpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChTdHJpbmcgY29udGV4dCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGdldEVuZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldFRleHRFbmQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhlIHRleHQgbGVuZ3RoIGlzIGVxdWFsIHRvIGxlbmd0aCBpZiB0aGVyZSBpcyBubyB3aGl0ZSBzcGFjZSBhdCB0aGUKLQkgKiBlbmQgb2YgYSByZWdpb24uIE90aGVyd2lzZSBpdCBpcyBzbWFsbGVyIHRoYW4gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIChnZXRUZXh0RW5kKCkgLSBnZXRTdGFydCgpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiAiU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgaW50IGluZGV4KSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuOwotCQlpbnQgc2l6ZSA9IHRoaXMuZmxhdE5vZGVzLnNpemUoKTsKLQkJaWYgKGluZGV4ID4gc2l6ZSkKLQkJCXJldHVybjsKLQkJaWYgKGluZGV4ID09IHNpemUpIHsKLQkJCWFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5mbGF0Tm9kZXMuaW5zZXJ0RWxlbWVudEF0KGZsYXROb2RlLCBpbmRleCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmRlZCgpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmZsYXROb2Rlcy5zaXplKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB0aGlzLmZsYXROb2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCQl0aGlzLmZsYXROb2Rlcy5yZW1vdmVFbGVtZW50QXQoaW5kZXgpOwotCQlyZXR1cm4gZmxhdE5vZGU7Ci0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBzaXplID0gdGhpcy5mbGF0Tm9kZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB0aGlzLmZsYXROb2Rlcy5lbGVtZW50QXQoaSk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJdGhpcy5mbGF0Tm9kZXMucmVtb3ZlRWxlbWVudEF0KGkpOwotCQkJCXJldHVybiBmbGF0Tm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIGludCBpbmRleCkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaW5kZXgpOwotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuZmxhdE5vZGVzLnNpemUoKSkKLQkJCXJldHVybiBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB0aGlzLmZsYXROb2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCQl0aGlzLmZsYXROb2Rlcy5zZXRFbGVtZW50QXQoZmxhdE5vZGUsIGluZGV4KTsKLQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIGludCBzaGlmdCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJVGV4dFJlZ2lvbiByZWdpb24sIGludCBzaGlmdCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJVGV4dFJlZ2lvbiBvbGRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIG5ld1JlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5kZWQoYm9vbGVhbiBoYXNFbmQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IG5ld0xlbmd0aCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5leHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOZXh0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50RG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZXZpb3VzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3UHJldmlvdXMpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWdpb25zKElUZXh0UmVnaW9uTGlzdCBlbWJlZGRlZFJlZ2lvbnMpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChpbnQgbmV3U3RhcnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiB0b1N0cmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCd7Jyk7Ci0JCWludCBjb3VudCA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJaWYgKGkgIT0gMCkKLQkJCQlidWZmZXIuYXBwZW5kKCcsJyk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZCgibnVsbCIpOy8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlidWZmZXIuYXBwZW5kKGZsYXROb2RlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoJ30nKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0bm9kZSwgU3RyaW5nIGNoYW5nZXMsIGludCBzdGFydCwgaW50IGVuZCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKCkgewotCQkvLyBpZiBzb21lb25lICJnZXRzIiB0aGVzZSB0ZW1wIHJlZ2lvbnMgYnkKLQkJLy8gYWNjaWRlbnQsIHdlJ2xsIGFsd2F5cyByZXR1cm4gImRlbGV0ZWQiLgotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldERlbGV0ZWQoYm9vbGVhbiBkZWxldGVkKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZmVjYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIERlZmF1bHQgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24gY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoIklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWFuYWdlbWVudCBmYWlsZWQuIik7Ly8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QxMTQ0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci0KLQotY2xhc3MgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0KLQlwcml2YXRlIGludCBvZmZzZXQgPSAwOwotCi0JLyoqCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlzdXBlcigpOwotCi0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCQl0aGlzLmZsYXROb2RlID0gZmxhdE5vZGU7Ci0JCWlmICh0aGlzLmZsYXROb2RlICE9IG51bGwpCi0JCQl0aGlzLm9mZnNldCAtPSB0aGlzLmZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVnaW9uKElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdChpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChJVGV4dFJlZ2lvbiByZWdpb24sIGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldERlZXBlc3RSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCWludCBmbGF0Tm9kZU9mZnNldCA9IDA7Ci0JCWlmICh0aGlzLmZsYXROb2RlICE9IG51bGwpCi0JCQlmbGF0Tm9kZU9mZnNldCA9IHRoaXMuZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJcmV0dXJuIGZsYXROb2RlT2Zmc2V0ICsgdGhpcy5vZmZzZXQgKyB0aGlzLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldEVuZCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRGaXJzdFJlZ2lvbigpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KCkgewotCQlyZXR1cm4gZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoU3RyaW5nIGNvbnRleHQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TGFzdFJlZ2lvbigpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMubGVuZ3RoOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldE5leHQoKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXROdW1iZXJPZlJlZ2lvbnMoKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JaW50IGdldE9mZnNldCgpIHsKLQkJaW50IGZsYXROb2RlT2Zmc2V0ID0gMDsKLQkJaWYgKHRoaXMuZmxhdE5vZGUgIT0gbnVsbCkKLQkJCWZsYXROb2RlT2Zmc2V0ID0gdGhpcy5mbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlyZXR1cm4gZmxhdE5vZGVPZmZzZXQgKyB0aGlzLm9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb25Db250YWluZXIgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRQYXJlbnREb2N1bWVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JCS8vIHRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyCi0JCS8vIGJlIGNhbGxlZCIpOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFByZXZpb3VzKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uTGlzdCBnZXRSZWdpb25zKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCWludCBmbGF0Tm9kZU9mZnNldCA9IDA7Ci0JCWlmICh0aGlzLmZsYXROb2RlICE9IG51bGwpCi0JCQlmbGF0Tm9kZU9mZnNldCA9IHRoaXMuZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJcmV0dXJuIGZsYXROb2RlT2Zmc2V0ICsgdGhpcy5vZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqIAotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gdGhpcy5mbGF0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCWlmICh0aGlzLmZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlTdHJpbmcgdGV4dCA9IHRoaXMuZmxhdE5vZGUuZ2V0VGV4dCgpOwotCQlpZiAodGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJaW50IGVuZCA9IHRoaXMub2Zmc2V0ICsgdGhpcy5sZW5ndGg7Ci0JCXJldHVybiB0ZXh0LnN1YnN0cmluZyh0aGlzLm9mZnNldCwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChTdHJpbmcgY29udGV4dCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGdldEVuZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldFRleHRFbmQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhlIHRleHQgbGVuZ3RoIGlzIGVxdWFsIHRvIGxlbmd0aCBpZiB0aGVyZSBpcyBubyB3aGl0ZSBzcGFjZSBhdCB0aGUKLQkgKiBlbmQgb2YgYSByZWdpb24uIE90aGVyd2lzZSBpdCBpcyBzbWFsbGVyIHRoYW4gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGdldExlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuICJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZCgpIHsKLQkJLy8gSSdsbCBhc3N1bWUgbmV2ZXIgcmVhbGx5IG5lZWRlZCBoZXJlCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW5kZWQoKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSVRleHRSZWdpb24gb2xkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBuZXdSZWdpb24sIGludCBzaGlmdCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlbGV0ZWQoYm9vbGVhbiBkZWxldGVkKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5kZWQoYm9vbGVhbiBoYXNFbmQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBoYWQgdG8gbWFrZSBwdWJsaWMsIGR1ZSB0byBBUEkgdHJhbnNpdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IGxlbmd0aCkgewotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3TmV4dCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCWlmICh0aGlzLmZsYXROb2RlICE9IG51bGwpCi0JCQl0aGlzLm9mZnNldCAtPSB0aGlzLmZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50RG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZXZpb3VzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3UHJldmlvdXMpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWdpb25zKElUZXh0UmVnaW9uTGlzdCBlbWJlZGRlZFJlZ2lvbnMpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChpbnQgbmV3U3RhcnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmICh0aGlzLmZsYXROb2RlICE9IG51bGwpCi0JCQl0aGlzLm9mZnNldCArPSB0aGlzLmZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCXRoaXMuZmxhdE5vZGUgPSBmbGF0Tm9kZTsKLQkJaWYgKHRoaXMuZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXRoaXMub2Zmc2V0IC09IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogdG9TdHJpbmcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgnWycpOwotCQlidWZmZXIuYXBwZW5kKGdldFN0YXJ0KCkpOwotCQlidWZmZXIuYXBwZW5kKCcsJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0RW5kKCkpOwotCQlidWZmZXIuYXBwZW5kKCddJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoJygnKTsKLQkJaWYgKHRoaXMuZmxhdE5vZGUgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQodGhpcy5mbGF0Tm9kZS50b1N0cmluZygpKTsKLQkJZWxzZQotCQkJYnVmZmVyLmFwcGVuZCgibnVsbCIpOy8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXRub2RlLCBTdHJpbmcgY2hhbmdlcywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkOWI4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiBQcm92aWRlcyBjb252ZW5pZW50IGZ1bmN0aW9ucyB0byBoYW5kbGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmQKLSAqIElUZXh0UmVnaW9uLgotICovCi1jbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsIHsKLQotCS8qKgotCSAqIEV4dHJhY3RzIGNvbnRlbnRzIGVuY2xvc2VkIHdpdGggcXVvdGVzLiBRdW90ZXMgbWF5IGJlIGRvdWJsZSBvciBzaW5nbGUuCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRBdHRyVmFsdWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgdmFsdWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIHZhbHVlOwotCQljaGFyIGZpcnN0Q2hhciA9IHZhbHVlLmNoYXJBdCgwKTsKLQkJaWYgKGZpcnN0Q2hhciA9PSAnIicgfHwgZmlyc3RDaGFyID09ICdcJycpIHsKLQkJCWlmIChsZW5ndGggPT0gMSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmICh2YWx1ZS5jaGFyQXQobGVuZ3RoIC0gMSkgPT0gZmlyc3RDaGFyKQotCQkJCWxlbmd0aC0tOwotCQkJcmV0dXJuIHZhbHVlLnN1YnN0cmluZygxLCBsZW5ndGgpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRyYWN0cyB0aGUgbmFtZSB3aXRob3V0IGhlYWRpbmcgJyYnIGFuZCB0YWlsaW5nICc7Jy4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldEVudGl0eVJlZk5hbWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcmVmID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQlpbnQgbGVuZ3RoID0gcmVmLmxlbmd0aCgpOwotCQlpZiAobGVuZ3RoID09IDApCi0JCQlyZXR1cm4gcmVmOwotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJaWYgKHJlZi5jaGFyQXQoMCkgPT0gJyYnKQotCQkJb2Zmc2V0ID0gMTsKLQkJaWYgKHJlZi5jaGFyQXQobGVuZ3RoIC0gMSkgPT0gJzsnKQotCQkJbGVuZ3RoLS07Ci0JCWlmIChvZmZzZXQgPj0gbGVuZ3RoKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiByZWYuc3Vic3RyaW5nKG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCByZWdpb24uCi0JICovCi0Jc3RhdGljIElUZXh0UmVnaW9uIGdldEZpcnN0UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwgfHwgcmVnaW9ucy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcmVnaW9ucy5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZmlyc3QgcmVnaW9uLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0Rmlyc3RSZWdpb25UeXBlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQ7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQ7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDApOwotCQlyZXR1cm4gcmVnaW9uLmdldFR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJZmxhdE5vZGUgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGUpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCWZsYXROb2RlID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGUpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl9Ci0JCXJldHVybiBmbGF0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXN0IHJlZ2lvbi4KLQkgKi8KLQlzdGF0aWMgSVRleHRSZWdpb24gZ2V0TGFzdFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZmlyc3QgcmVnaW9uLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0TGFzdFJlZ2lvblR5cGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwgfHwgcmVnaW9ucy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJcmV0dXJuIHJlZ2lvbi5nZXRUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0Jc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJZmxhdE5vZGUgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGUpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJZmxhdE5vZGUgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBmbGF0Tm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGZsYXROb2RlOwotCX0KLQotCS8qKgotCSAqLwotCXN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlmbGF0Tm9kZSA9ICgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCQlyZXR1cm4gZmxhdE5vZGU7Ci0JfQotCi0JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RhZ0FkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGFnQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDlmZjdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGFnQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFnQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQkvKioKLQkgKi8KLQlTdHJpbmcgZ2V0RW5kVGFnKElET01FbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICovCi0JU3RyaW5nIGdldFN0YXJ0VGFnKElET01FbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBpc0VuZFRhZygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UZXh0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UZXh0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzg2OTEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGV4dEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICogICAgIEJhbGF6cyBCYW5mYWk6IEJ1ZyAxNTQ3MzcgZ2V0VXNlckRhdGEvc2V0VXNlckRhdGEgc3VwcG9ydCBmb3IgTm9kZQotICogICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ3MzcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSVNvdXJjZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi0KLS8qKgotICogVGV4dEltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIFRleHRJbXBsIGV4dGVuZHMgQ2hhcmFjdGVyRGF0YUltcGwgaW1wbGVtZW50cyBJRE9NVGV4dCB7Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFN0cmluZ1BhaXIgewotCQlwcml2YXRlIFN0cmluZyBmRmlyc3QgPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBmU2Vjb25kID0gbnVsbDsKLQotCQlTdHJpbmdQYWlyKFN0cmluZyBmaXJzdCwgU3RyaW5nIHNlY29uZCkgewotCQkJdGhpcy5mRmlyc3QgPSBmaXJzdDsKLQkJCXRoaXMuZlNlY29uZCA9IHNlY29uZDsKLQkJfQotCi0JCVN0cmluZyBnZXRGaXJzdCgpIHsKLQkJCXJldHVybiB0aGlzLmZGaXJzdDsKLQkJfQotCi0JCVN0cmluZyBnZXRTZWNvbmQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mU2Vjb25kOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZlNvdXJjZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUZXh0SW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBUZXh0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXh0SW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBUZXh0SW1wbAotCSAqLwotCXByb3RlY3RlZCBUZXh0SW1wbChUZXh0SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMuZlNvdXJjZSA9IHRoYXQuZ2V0U291cmNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBhcHBlbmREYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBhcmcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBlbmREYXRhKFN0cmluZyBhcmcpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoYXJnID09IG51bGwgfHwgYXJnLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlTdHJpbmcgbmV3U291cmNlID0gZ2V0U291cmNlKGFyZyk7Ci0JCWlmIChuZXdTb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQlzZXRUZXh0U291cmNlKHNvdXJjZSArIG5ld1NvdXJjZSk7Ci0JCWVsc2UKLQkJCXNldFRleHRTb3VyY2UobmV3U291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCXJldHVybiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKCk7Ci0JCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjb250YWluZXIpOwotCQl9Ci0KLQkJcmV0dXJuIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBhcHBlbmRUZXh0IG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5UZXh0Ci0JICovCi0JcHVibGljIHZvaWQgYXBwZW5kVGV4dChUZXh0IG5ld1RleHQpIHsKLQkJaWYgKG5ld1RleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG5ld1RleHQ7Ci0JCVN0cmluZyBuZXdTb3VyY2UgPSB0ZXh0LmdldFNvdXJjZSgpOwotCQlpZiAobmV3U291cmNlID09IG51bGwgfHwgbmV3U291cmNlLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBzb3VyY2UgPSBnZXRTb3VyY2UoKTsKLQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJc2V0VGV4dFNvdXJjZShzb3VyY2UgKyBuZXdTb3VyY2UpOwotCQllbHNlCi0JCQlzZXRUZXh0U291cmNlKG5ld1NvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlUZXh0SW1wbCBjbG9uZWQgPSBuZXcgVGV4dEltcGwodGhpcyk7Ci0JCW5vdGlmeVVzZXJEYXRhSGFuZGxlcnMoVXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVELCBjbG9uZWQpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIGRlbGV0ZURhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGNvdW50Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChjb3VudCA9PSAwKQotCQkJcmV0dXJuOwotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlpZiAoY291bnQgPCAwIHx8IG9mZnNldCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlID09IG51bGwgfHwgc291cmNlLmxlbmd0aCgpID09IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCVN0cmluZ1BhaXIgcGFpciA9IHN1YnN0cmluZ1NvdXJjZUV4Y2x1ZGVkKHNvdXJjZSwgb2Zmc2V0LCBjb3VudCk7Ci0JCWlmIChwYWlyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXNvdXJjZSA9IG51bGw7Ci0JCVN0cmluZyBmaXJzdCA9IHBhaXIuZ2V0Rmlyc3QoKTsKLQkJaWYgKGZpcnN0ICE9IG51bGwpCi0JCQlzb3VyY2UgPSBmaXJzdDsKLQkJU3RyaW5nIHNlY29uZCA9IHBhaXIuZ2V0U2Vjb25kKCk7Ci0JCWlmIChzZWNvbmQgIT0gbnVsbCkgewotCQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJCXNvdXJjZSArPSBzZWNvbmQ7Ci0JCQllbHNlCi0JCQkJc291cmNlID0gc2Vjb25kOwotCQl9Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXNvdXJjZSA9IG5ldyBTdHJpbmcoKTsgLy8gZGVsZXRlIGFsbAotCQlzZXRUZXh0U291cmNlKHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuZlNvdXJjZSAhPSBudWxsKQotCQkJcmV0dXJuIGdldERhdGEodGhpcy5mU291cmNlKTsKLQkJU3RyaW5nIGRhdGEgPSBzdXBlci5nZXREYXRhKCk7Ci0JCWlmIChkYXRhICE9IG51bGwpCi0JCQlyZXR1cm4gZGF0YTsKLQkJcmV0dXJuIGdldERhdGEoZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERhdGEoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQlpbnQgbGVuZ3RoID0gY29udGFpbmVyLmdldExlbmd0aCgpOwotCQkJaWYgKGxlbmd0aCA8IDE2KQotCQkJCWxlbmd0aCA9IDE2OyAvLyBkZWZhdWx0Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGgpOwotCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCVN0cmluZyBkYXRhID0gZ2V0RGF0YShjb250ZW50KTsKLQkJCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlidWZmZXIuYXBwZW5kKGRhdGEpOwotCQkJfQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCXJldHVybiBmbGF0Tm9kZS5nZXRUZXh0KCk7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEZpcnN0UmVnaW9uKGZsYXROb2RlKTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0RW50aXR5UmVmTmFtZShmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyB2YWx1ZSA9IGRvY3VtZW50LmdldENoYXJWYWx1ZShuYW1lKTsKLQkJCQkJCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJCQkJCXJldHVybiB2YWx1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmbGF0Tm9kZS5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBkYXRhIGZvciB0aGUgc291cmNlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGF0YShTdHJpbmcgc291cmNlKSB7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWludCByZWYgPSBzb3VyY2UuaW5kZXhPZignJicpOwotCQl3aGlsZSAocmVmID49IDApIHsKLQkJCWludCBlbmQgPSBzb3VyY2UuaW5kZXhPZignOycsIHJlZiArIDEpOwotCQkJaWYgKGVuZCA+IHJlZiArIDEpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHNvdXJjZS5zdWJzdHJpbmcocmVmICsgMSwgZW5kKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSBnZXRDaGFyVmFsdWUobmFtZSk7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGgpOwotCQkJCQlpZiAocmVmID4gb2Zmc2V0KQotCQkJCQkJYnVmZmVyLmFwcGVuZChzb3VyY2Uuc3Vic3RyaW5nKG9mZnNldCwgcmVmKSk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQodmFsdWUpOwotCQkJCQlvZmZzZXQgPSBlbmQgKyAxOwotCQkJCQlyZWYgPSBlbmQ7Ci0JCQkJfQotCQkJfQotCQkJcmVmID0gc291cmNlLmluZGV4T2YoJyYnLCByZWYgKyAxKTsKLQkJfQotCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQlyZXR1cm4gc291cmNlOwotCQlpZiAobGVuZ3RoID4gb2Zmc2V0KQotCQkJYnVmZmVyLmFwcGVuZChzb3VyY2Uuc3Vic3RyaW5nKG9mZnNldCkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1ldGhvZAotCSAqIAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiAiI3RleHQiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gVEVYVF9OT0RFOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotCQlpZiAodGhpcy5mU291cmNlICE9IG51bGwpCi0JCQlyZXR1cm4gdGhpcy5mU291cmNlOwotCQlTdHJpbmcgZGF0YSA9IHN1cGVyLmdldERhdGEoKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCgpID4gMCkgewotCQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZShkYXRhKTsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQlyZXR1cm4gc291cmNlOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRTb3VyY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHNvdXJjZSBmb3IgdGhlIGRhdGEKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRTb3VyY2UoU3RyaW5nIGRhdGEpIHsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJRE9NTW9kZWwgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQlJU291cmNlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG1vZGVsLmdldEdlbmVyYXRvcigpOwotCQlpZiAoZ2VuZXJhdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJcmV0dXJuIGdlbmVyYXRvci5nZW5lcmF0ZVRleHREYXRhKHRoaXMsIGRhdGEpOwotCX0KLQotCS8qKgotCSAqLwotCVN0cmluZyBnZXRUZXh0U291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5mU291cmNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVTb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2UoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlib29sZWFuIGhhc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFza2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChhc2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGZsYXROb2RlID09IGFza2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBmbGF0Tm9kZTsKLQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBhc2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChjb250ZW50ID09IGFza2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gYXNrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gYXJnCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0RGF0YShpbnQgb2Zmc2V0LCBTdHJpbmcgYXJnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGFyZyA9PSBudWxsIHx8IGFyZy5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuOwotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlpZiAob2Zmc2V0IDwgMCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlTdHJpbmcgc291cmNlID0gZ2V0U291cmNlKCk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCB8fCBzb3VyY2UubGVuZ3RoKCkgPT0gMCkgewotCQkJaWYgKG9mZnNldCA+IDApIHsKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJCX0KLQkJCXNvdXJjZSA9IGdldFNvdXJjZShhcmcpOwotCQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJCXNldFRleHRTb3VyY2Uoc291cmNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZ1BhaXIgcGFpciA9IHN1YnN0cmluZ1NvdXJjZUV4Y2x1ZGVkKHNvdXJjZSwgb2Zmc2V0LCAwKTsKLQkJaWYgKHBhaXIgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoc291cmNlLmxlbmd0aCgpICsgYXJnLmxlbmd0aCgpKTsKLQkJU3RyaW5nIGZpcnN0ID0gcGFpci5nZXRGaXJzdCgpOwotCQlpZiAoZmlyc3QgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoZmlyc3QpOwotCQlzb3VyY2UgPSBnZXRTb3VyY2UoYXJnKTsKLQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChzb3VyY2UpOwotCQlTdHJpbmcgc2Vjb25kID0gcGFpci5nZXRTZWNvbmQoKTsKLQkJaWYgKHNlY29uZCAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChzZWNvbmQpOwotCQlzZXRUZXh0U291cmNlKGJ1ZmZlci50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAobmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQotCQlpZiAoZmxhdE5vZGUgPT0gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoKTsKLQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGNvbnRhaW5lcik7Ci0JCQlyZXR1cm4gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQl9Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJaWYgKGNvbnRlbnQgPT0gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQljb250YWluZXIuaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaSk7Ci0JCQkJCXJldHVybiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRUZXh0IG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5UZXh0Ci0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0VGV4dChUZXh0IG5ld1RleHQsIGludCBvZmZzZXQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAobmV3VGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSBuZXdUZXh0OwotCQlTdHJpbmcgbmV3U291cmNlID0gdGV4dC5nZXRTb3VyY2UoKTsKLQkJaWYgKG5ld1NvdXJjZSA9PSBudWxsICYmIG5ld1NvdXJjZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuOwotCQlpZiAob2Zmc2V0IDwgMCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlTdHJpbmcgc291cmNlID0gZ2V0U291cmNlKCk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCB8fCBzb3VyY2UubGVuZ3RoKCkgPT0gMCkgewotCQkJaWYgKG9mZnNldCA+IDApIHsKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJCX0KLQkJCXNldFRleHRTb3VyY2UobmV3U291cmNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZ1BhaXIgcGFpciA9IHN1YnN0cmluZ1NvdXJjZUV4Y2x1ZGVkKHNvdXJjZSwgb2Zmc2V0LCAwKTsKLQkJaWYgKHBhaXIgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoc291cmNlLmxlbmd0aCgpICsgbmV3U291cmNlLmxlbmd0aCgpKTsKLQkJU3RyaW5nIGZpcnN0ID0gcGFpci5nZXRGaXJzdCgpOwotCQlpZiAoZmlyc3QgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoZmlyc3QpOwotCQlidWZmZXIuYXBwZW5kKG5ld1NvdXJjZSk7Ci0JCVN0cmluZyBzZWNvbmQgPSBwYWlyLmdldFNlY29uZCgpOwotCQlpZiAoc2Vjb25kICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHNlY29uZCk7Ci0JCXNldFRleHRTb3VyY2UoYnVmZmVyLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIGlzQ0RBVEFDb250ZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ0RBVEFDb250ZW50KCkgewotCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuIGZhbHNlOwotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCXJldHVybiBlbGVtZW50LmlzQ0RBVEFDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ludmFsaWQoKSB7Ci0JCXJldHVybiBpc0ludmFsaWQoZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ludmFsaWQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoaXNJbnZhbGlkKGNvbnRlbnQpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGU7Ci0JCQlyZXR1cm4gaXNJbnZhbGlkKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJfQotCi0JCVN0cmluZyByZWdpb25UeXBlID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRGaXJzdFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQlpZiAocmVnaW9uVHlwZSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UICYmIGlzTm90TmVzdGVkQ29udGVudChyZWdpb25UeXBlKSAmJiByZWdpb25UeXBlICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UgJiYgcmVnaW9uVHlwZSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSAmJiByZWdpb25UeXBlICE9IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCAmJiByZWdpb25UeXBlICE9IERPTVJlZ2lvbkNvbnRleHQuV0hJVEVfU1BBQ0UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTm90TmVzdGVkQ29udGVudChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBpc1NoYXJpbmdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKHNoYXJlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGZsYXROb2RlID09IHNoYXJlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlOwotCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IHNoYXJlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChjb250ZW50ID09IHNoYXJlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdGV4dCBub2RlIGNvbnRhaW5zIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwNC9SRUMteG1sLWluZm9zZXQtMjAwNDAyMDQjaW5mb2l0ZW0uY2hhcmFjdGVyJz4KLQkgKiBlbGVtZW50IGNvbnRlbnQgd2hpdGVzcGFjZTwvYT4sIG9mdGVuIGFidXNpdmVseSBjYWxsZWQgImlnbm9yYWJsZQotCSAqIHdoaXRlc3BhY2UiLiBUaGUgdGV4dCBub2RlIGlzIGRldGVybWluZWQgdG8gY29udGFpbiB3aGl0ZXNwYWNlIGluCi0JICogZWxlbWVudCBjb250ZW50IGR1cmluZyB0aGUgbG9hZCBvZiB0aGUgZG9jdW1lbnQgb3IgaWYgdmFsaWRhdGlvbiBvY2N1cnMKLQkgKiB3aGlsZSB1c2luZyA8Y29kZT5Eb2N1bWVudC5ub3JtYWxpemVEb2N1bWVudCgpPC9jb2RlPi4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbGVtZW50Q29udGVudFdoaXRlc3BhY2UoKSB7Ci0JCXJldHVybiBpc1doaXRlc3BhY2UoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1doaXRlc3BhY2UoKSB7Ci0JCVN0cmluZyBkYXRhID0gZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCWludCBsZW5ndGggPSBkYXRhLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoZGF0YS5jaGFyQXQoaSkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0KLQkJaWYgKGZsYXROb2RlID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGU7Ci0JCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJLy8gcmVtb3ZlZCB3aXRoIHByb3h5Ci0JCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQkJCXJldHVybiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCWlmIChjb250ZW50ID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQljb250YWluZXIucmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCQlpZiAoY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCkgPT0gMSkgewotCQkJCQkJLy8gZ2V0IGJhY2sgdG8gc2luZ2xlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKDApKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCX0KLQotCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJCS8vIHJlbW92ZWQgd2l0aCBwcm94eQotCQkJCQkJY29udGFpbmVyLnJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQkJCWlmIChjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKSA9PSAxKSB7Ci0JCQkJCQkJLy8gZ2V0IGJhY2sgdG8gc2luZ2xlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkJCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigwKSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQl9Ci0KLQkvKioKLQkgKiByZXBsYWNlRGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gY291bnQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBhcmcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBsYWNlRGF0YShpbnQgb2Zmc2V0LCBpbnQgY291bnQsIFN0cmluZyBhcmcpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlpZiAoYXJnID09IG51bGwgfHwgYXJnLmxlbmd0aCgpID09IDApIHsKLQkJCWRlbGV0ZURhdGEob2Zmc2V0LCBjb3VudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGNvdW50ID09IDApIHsKLQkJCWluc2VydERhdGEob2Zmc2V0LCBhcmcpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChvZmZzZXQgPCAwIHx8IGNvdW50IDwgMCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlTdHJpbmcgc291cmNlID0gZ2V0U291cmNlKCk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCB8fCBzb3VyY2UubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlTdHJpbmdQYWlyIHBhaXIgPSBzdWJzdHJpbmdTb3VyY2VFeGNsdWRlZChzb3VyY2UsIG9mZnNldCwgY291bnQpOwotCQlpZiAocGFpciA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzb3VyY2UubGVuZ3RoKCkgKyBhcmcubGVuZ3RoKCkpOwotCQlTdHJpbmcgZmlyc3QgPSBwYWlyLmdldEZpcnN0KCk7Ci0JCWlmIChmaXJzdCAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChmaXJzdCk7Ci0JCXNvdXJjZSA9IGdldFNvdXJjZShhcmcpOwotCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHNvdXJjZSk7Ci0JCVN0cmluZyBzZWNvbmQgPSBwYWlyLmdldFNlY29uZCgpOwotCQlpZiAoc2Vjb25kICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHNlY29uZCk7Ci0JCXNldFRleHRTb3VyY2UoYnVmZmVyLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0KLQkJaWYgKGZsYXROb2RlID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQlyZXR1cm4gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQl9Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBmbGF0Tm9kZTsKLQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJLy8gcHJveHkgbXVzdCBub3QgYmUgbmVzdGVkCi0JCQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJfQotCQkJCXJldHVybiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOyAvLyBlcnJvcgotCQkJCWlmIChjb250ZW50ID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQljb250YWluZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQlyZXR1cm4gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCX0KLQotCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQkJCS8vIHByb3h5IG11c3Qgbm90IGJlIG5lc3RlZAotCQkJCQkJCWNvbnRhaW5lci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlwcm94eS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJfQotCi0JCXJldHVybiBudWxsOyAvLyBlcnJvcgotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgcmVzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCkgewotCQlTdHJpbmcgc291cmNlID0gZ2V0U291cmNlKCk7Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UubGVuZ3RoKCkgPiAwKQotCQkJdGhpcy5mU291cmNlID0gc291cmNlOwotCQlzdXBlci5yZXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGEoU3RyaW5nIGRhdGEpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCXRoaXMuZlNvdXJjZSA9IG51bGw7Ci0JCXN1cGVyLnNldERhdGEoZGF0YSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291cmNlKFN0cmluZyBzb3VyY2UpIHRocm93cyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlTb3VyY2VWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IFNvdXJjZVZhbGlkYXRvcih0aGlzKTsKLQkJaWYgKHZhbGlkYXRvci52YWxpZGF0ZVNvdXJjZShzb3VyY2UpKQotCQkJc2V0VGV4dFNvdXJjZShzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQl0aGlzLmZTb3VyY2UgPSBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRTb3VyY2UoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCXRoaXMuZlNvdXJjZSA9IHNvdXJjZTsKLQotCQlub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZVNvdXJjZShTdHJpbmcgc291cmNlKSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU291cmNlVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBTb3VyY2VWYWxpZGF0b3IodGhpcyk7Ci0JCXNldFRleHRTb3VyY2UodmFsaWRhdG9yLmNvbnZlcnRTb3VyY2Uoc291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogc3BsaXRUZXh0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uVGV4dAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBUZXh0IHNwbGl0VGV4dChpbnQgb2Zmc2V0KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWludCBsZW5ndGggPSBnZXRMZW5ndGgoKTsKLQkJaWYgKG9mZnNldCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IG51bGw7Ci0JCWlmIChvZmZzZXQgPCBsZW5ndGgpIHsKLQkJCWludCBjb3VudCA9IGxlbmd0aCAtIG9mZnNldDsKLQkJCXNvdXJjZSA9IHN1YnN0cmluZ1NvdXJjZShvZmZzZXQsIGNvdW50KTsKLQkJCWRlbGV0ZURhdGEob2Zmc2V0LCBjb3VudCk7Ci0JCX0KLQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobnVsbCk7Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCXRleHQuc2V0VGV4dFNvdXJjZShzb3VyY2UpOwotCi0JCU5vZGUgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHRleHQsIGdldE5leHRTaWJsaW5nKCkpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqLwotCVRleHQgc3BsaXRUZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAobmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCB8fCAhKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCi0JCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCWludCBpbmRleCA9IDA7Ci0JCWZvciAoOyBpbmRleCA8IGNvdW50OyBpbmRleCsrKSB7Ci0JCQlpZiAoY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpbmRleCkgPT0gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoaW5kZXggPj0gY291bnQpIHsKLQkJCS8vIHRoaXMgaXMgdGhlIGNhc2UgbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyBhIG5ldwotCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJLy8gc2VhcmNoIGdhcCBieSBvZmZzZXQKLQkJCWludCBvZmZzZXQgPSBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaW5kZXgpOwotCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOyAvLyBlcnJvcgotCQkJCWlmIChjb250ZW50LmdldFN0YXJ0KCkgPj0gb2Zmc2V0KQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChpbmRleCA+PSBjb3VudCkKLQkJCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJfQotCQlpZiAoaW5kZXggPT0gMCkKLQkJCXJldHVybiB0aGlzOyAvLyBub3RoaW5nIHRvIGRvCi0KLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCU5vZGUgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJVGV4dEltcGwgbmV4dFRleHQgPSAoVGV4dEltcGwpIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG51bGwpOwotCQlpZiAobmV4dFRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCi0JCWZvciAoOyBpbmRleCA8IGNvdW50OyBjb3VudC0tKSB7Ci0JCQluZXh0VGV4dC5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGFpbmVyLnJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpbmRleCkpOwotCQl9Ci0KLQkJLy8gbm9ybWFsaXplIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJaWYgKGluZGV4ID09IDEpIHsKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKDApKTsKLQkJfQotCi0JCXBhcmVudC5pbnNlcnRCZWZvcmUobmV4dFRleHQsIGdldE5leHRTaWJsaW5nKCkpOwotCQlyZXR1cm4gbmV4dFRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0cnVucyBkYXRhIGZvciB0aGUgcmFuZ2UKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBzdWJzdHJpbmdEYXRhKFN0cmluZyBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBzdXJlIG9mZnNldCBhbmQgY291bnQgYXJlIG5vbi1uZWdhdGl2ZQotCQlpZiAoY291bnQgPT0gMCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWludCBsZW5ndGggPSBkYXRhLmxlbmd0aCgpOwotCQlpZiAob2Zmc2V0ID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlpbnQgZW5kID0gb2Zmc2V0ICsgY291bnQ7Ci0JCWlmIChlbmQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBkYXRhLnN1YnN0cmluZyhvZmZzZXQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBzb3VyY2UgZm9yIHRoZSByYW5nZSBzcGVjaWZpZWQgYnk6IG9mZnNldDogZGF0YSBvZmZzZXQgY291bnQ6Ci0JICogZGF0YSBjb3VudAotCSAqLwotCXByaXZhdGUgU3RyaW5nIHN1YnN0cmluZ1NvdXJjZShpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBzdXJlIG9mZnNldCBhbmQgY291bnQgYXJlIG5vbi1uZWdhdGl2ZQotCQlpZiAodGhpcy5mU291cmNlICE9IG51bGwpCi0JCQlyZXR1cm4gc3Vic3RyaW5nU291cmNlKHRoaXMuZlNvdXJjZSwgb2Zmc2V0LCBjb3VudCk7Ci0KLQkJU3RyaW5nIGRhdGEgPSBzdXBlci5nZXREYXRhKCk7Ci0JCWlmIChkYXRhICE9IG51bGwgJiYgZGF0YS5sZW5ndGgoKSA+IDApIHsKLQkJCWRhdGEgPSBzdWJzdHJpbmdEYXRhKGRhdGEsIG9mZnNldCwgY291bnQpOwotCQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZShkYXRhKTsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQlyZXR1cm4gc291cmNlOwotCQl9Ci0KLQkJcmV0dXJuIHN1YnN0cmluZ1NvdXJjZShnZXRTb3VyY2UoKSwgb2Zmc2V0LCBjb3VudCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBzb3VyY2UgZm9yIHRoZSByYW5nZSBzcGVjaWZpZWQgYnk6IG9mZnNldDogZGF0YSBvZmZzZXQgY291bnQ6Ci0JICogZGF0YSBjb3VudAotCSAqLwotCXByaXZhdGUgU3RyaW5nIHN1YnN0cmluZ1NvdXJjZShTdHJpbmcgc291cmNlLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBzdXJlIG9mZnNldCBhbmQgY291bnQgYXJlIG5vbi1uZWdhdGl2ZQotCQlpZiAoY291bnQgPT0gMCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlpbnQgZW5kID0gb2Zmc2V0ICsgY291bnQ7Ci0KLQkJLy8gZmluZCBjaGFyYWN0ZXIgcmVmZXJlbmNlCi0JCWludCByZWYgPSBzb3VyY2UuaW5kZXhPZignJicpOwotCQl3aGlsZSAocmVmID49IDApIHsKLQkJCWlmIChyZWYgPj0gZW5kKQotCQkJCWJyZWFrOwotCQkJaW50IHJlZkVuZCA9IHNvdXJjZS5pbmRleE9mKCc7JywgcmVmICsgMSk7Ci0JCQlpZiAocmVmRW5kID4gcmVmICsgMSkgewotCQkJCVN0cmluZyBuYW1lID0gc291cmNlLnN1YnN0cmluZyhyZWYgKyAxLCByZWZFbmQpOwotCQkJCWlmIChnZXRDaGFyVmFsdWUobmFtZSkgIT0gbnVsbCkgewotCQkJCQkvLyBmb3VuZCwgc2hpZnQgZm9yIHNvdXJjZSBvZmZzZXRzCi0JCQkJCWludCByZWZDb3VudCA9IHJlZkVuZCAtIHJlZjsKLQkJCQkJaWYgKHJlZiA8IG9mZnNldCkKLQkJCQkJCW9mZnNldCArPSByZWZDb3VudDsKLQkJCQkJaWYgKHJlZiA8IGVuZCkKLQkJCQkJCWVuZCArPSByZWZDb3VudDsKLQkJCQkJcmVmID0gcmVmRW5kOwotCQkJCX0KLQkJCX0KLQkJCXJlZiA9IHNvdXJjZS5pbmRleE9mKCcmJywgcmVmICsgMSk7Ci0JCX0KLQotCQlpZiAob2Zmc2V0ID4gbGVuZ3RoIHx8IGVuZCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlyZXR1cm4gc291cmNlLnN1YnN0cmluZyhvZmZzZXQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBzb3VyY2VzIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHJhbmdlIHNwZWNpZmllZCBieTogb2Zmc2V0OiBkYXRhCi0JICogb2Zmc2V0IGNvdW50OiBkYXRhIGNvdW50Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmdQYWlyIHN1YnN0cmluZ1NvdXJjZUV4Y2x1ZGVkKFN0cmluZyBzb3VyY2UsIGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIHN1cmUgb2Zmc2V0IGFuZCBjb3VudCBhcmUgbm9uLW5lZ2F0aXZlCi0JCWlmIChzb3VyY2UgPT0gbnVsbCkgewotCQkJaWYgKG9mZnNldCA9PSAwICYmIGNvdW50ID09IDApCi0JCQkJcmV0dXJuIG5ldyBTdHJpbmdQYWlyKG51bGwsIG51bGwpOwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlpbnQgZW5kID0gb2Zmc2V0ICsgY291bnQ7Ci0KLQkJLy8gZmluZCBjaGFyYWN0ZXIgcmVmZXJlbmNlCi0JCWludCByZWYgPSBzb3VyY2UuaW5kZXhPZignJicpOwotCQl3aGlsZSAocmVmID49IDApIHsKLQkJCWlmIChyZWYgPj0gZW5kKQotCQkJCWJyZWFrOwotCQkJaW50IHJlZkVuZCA9IHNvdXJjZS5pbmRleE9mKCc7JywgcmVmICsgMSk7Ci0JCQlpZiAocmVmRW5kID4gcmVmICsgMSkgewotCQkJCVN0cmluZyBuYW1lID0gc291cmNlLnN1YnN0cmluZyhyZWYgKyAxLCByZWZFbmQpOwotCQkJCWlmIChnZXRDaGFyVmFsdWUobmFtZSkgIT0gbnVsbCkgewotCQkJCQkvLyBmb3VuZCwgc2hpZnQgZm9yIHNvdXJjZSBvZmZzZXRzCi0JCQkJCWludCByZWZDb3VudCA9IHJlZkVuZCAtIHJlZjsKLQkJCQkJaWYgKHJlZiA8IG9mZnNldCkKLQkJCQkJCW9mZnNldCArPSByZWZDb3VudDsKLQkJCQkJaWYgKHJlZiA8IGVuZCkKLQkJCQkJCWVuZCArPSByZWZDb3VudDsKLQkJCQkJcmVmID0gcmVmRW5kOwotCQkJCX0KLQkJCX0KLQkJCXJlZiA9IHNvdXJjZS5pbmRleE9mKCcmJywgcmVmICsgMSk7Ci0JCX0KLQotCQlpZiAob2Zmc2V0ID4gbGVuZ3RoIHx8IGVuZCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlTdHJpbmcgZmlyc3QgPSAob2Zmc2V0ID4gMCA/IHNvdXJjZS5zdWJzdHJpbmcoMCwgb2Zmc2V0KSA6IG51bGwpOwotCQlTdHJpbmcgc2Vjb25kID0gKGVuZCA8IGxlbmd0aCA/IHNvdXJjZS5zdWJzdHJpbmcoZW5kLCBsZW5ndGgpIDogbnVsbCk7Ci0JCXJldHVybiBuZXcgU3RyaW5nUGFpcihmaXJzdCwgc2Vjb25kKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdob2xlVGV4dCgpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgSW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotICAgIC8qKgotCSAqIFJlcGxhY2VzIHRoZSB0ZXh0IG9mIHRoZSBjdXJyZW50IG5vZGUgYW5kIGFsbCBsb2dpY2FsbHktYWRqYWNlbnQgdGV4dAotCSAqIG5vZGVzIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0LiBBbGwgbG9naWNhbGx5LWFkamFjZW50IHRleHQgbm9kZXMgYXJlCi0JICogcmVtb3ZlZCBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgbm9kZSB1bmxlc3MgaXQgd2FzIHRoZSByZWNpcGllbnQgb2YgdGhlCi0JICogcmVwbGFjZW1lbnQgdGV4dC4gPGJyPgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5vZGUgd2hpY2ggcmVjZWl2ZWQgdGhlIHJlcGxhY2VtZW50IHRleHQuIFRoZQotCSAqIHJldHVybmVkIG5vZGUgaXM6Ci0JICogPHVsPgotCSAqIDxsaT48Y29kZT5udWxsPC9jb2RlPiwgd2hlbiB0aGUgcmVwbGFjZW1lbnQgdGV4dCBpcyB0aGUgZW1wdHkKLQkgKiBzdHJpbmc7IDwvbGk+Ci0JICogPGxpPnRoZSBjdXJyZW50IG5vZGUsIGV4Y2VwdCB3aGVuIHRoZSBjdXJyZW50IG5vZGUgaXMgcmVhZC1vbmx5OyA8L2xpPgotCSAqIDxsaT4gYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gbm9kZSBvZiB0aGUgc2FtZSB0eXBlICgKLQkgKiA8Y29kZT5UZXh0PC9jb2RlPiBvciA8Y29kZT5DREFUQVNlY3Rpb248L2NvZGU+KSBhcyB0aGUgY3VycmVudAotCSAqIG5vZGUgaW5zZXJ0ZWQgYXQgdGhlIGxvY2F0aW9uIG9mIHRoZSByZXBsYWNlbWVudC4gPC9saT4KLQkgKiA8L3VsPgotCSAqIDxicj4KLQkgKiBGb3IgaW5zdGFuY2UsIGluIHRoZSBhYm92ZSBleGFtcGxlIGNhbGxpbmcKLQkgKiA8Y29kZT5yZXBsYWNlV2hvbGVUZXh0PC9jb2RlPiBvbiB0aGUgPGNvZGU+VGV4dDwvY29kZT4gbm9kZSB0aGF0Ci0JICogY29udGFpbnMgImJhciIgd2l0aCAieW8iIGluIGFyZ3VtZW50IHJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZzogPGJyPgotCSAqIFdoZXJlIHRoZSBub2RlcyB0byBiZSByZW1vdmVkIGFyZSByZWFkLW9ubHkgZGVzY2VuZGFudHMgb2YgYW4KLQkgKiA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+LCB0aGUgPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPgotCSAqIG11c3QgYmUgcmVtb3ZlZCBpbnN0ZWFkIG9mIHRoZSByZWFkLW9ubHkgbm9kZXMuIElmIGFueQotCSAqIDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4gdG8gYmUgcmVtb3ZlZCBoYXMgZGVzY2VuZGFudHMgdGhhdCBhcmUKLQkgKiBub3QgPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPiwgPGNvZGU+VGV4dDwvY29kZT4sIG9yCi0JICogPGNvZGU+Q0RBVEFTZWN0aW9uPC9jb2RlPiBub2RlcywgdGhlIDxjb2RlPnJlcGxhY2VXaG9sZVRleHQ8L2NvZGU+Ci0JICogbWV0aG9kIG11c3QgZmFpbCBiZWZvcmUgcGVyZm9ybWluZyBhbnkgbW9kaWZpY2F0aW9uIG9mIHRoZSBkb2N1bWVudCwKLQkgKiByYWlzaW5nIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiB3aXRoIHRoZSBjb2RlCi0JICogPGNvZGU+Tk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSPC9jb2RlPi4gPGJyPgotCSAqIEZvciBpbnN0YW5jZSwgaW4gdGhlIGV4YW1wbGUgYmVsb3cgY2FsbGluZwotCSAqIDxjb2RlPnJlcGxhY2VXaG9sZVRleHQ8L2NvZGU+IG9uIHRoZSA8Y29kZT5UZXh0PC9jb2RlPiBub2RlIHRoYXQKLQkgKiBjb250YWlucyAiYmFyIiBmYWlscywgYmVjYXVzZSB0aGUgPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPiBub2RlCi0JICogImVudCIgY29udGFpbnMgYW4gPGNvZGU+RWxlbWVudDwvY29kZT4gbm9kZSB3aGljaCBjYW5ub3QgYmUgcmVtb3ZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudAotCSAqICAgICAgICAgICAgVGhlIGNvbnRlbnQgb2YgdGhlIHJlcGxhY2luZyA8Y29kZT5UZXh0PC9jb2RlPiBub2RlLgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUgY3JlYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiAgICAgICAgIGNvbnRlbnQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiBvbmUgb2YgdGhlCi0JICogICAgICAgICAgICAgICAgPGNvZGU+VGV4dDwvY29kZT4gbm9kZXMgYmVpbmcgcmVwbGFjZWQgaXMgcmVhZG9ubHkuCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotICAgIHB1YmxpYyBUZXh0IHJlcGxhY2VXaG9sZVRleHQoU3RyaW5nIGNvbnRlbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MR2VuZXJhdG9ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxHZW5lcmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YzdlYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxHZW5lcmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaW1wbC5Db21tZW50RWxlbWVudFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklYTUxDaGFyRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqIAotICovCi1wdWJsaWMgY2xhc3MgWE1MR2VuZXJhdG9ySW1wbCBpbXBsZW1lbnRzIElTb3VyY2VHZW5lcmF0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQV9DTE9TRSA9ICJdXT4iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEFfT1BFTiA9ICI8IVtDREFUQVsiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9DTE9TRSA9ICItLT4iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9PUEVOID0gIjwhLS0iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVFlQRV9PUEVOID0gIjwhRE9DVFlQRSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9DTE9TRSA9ICIgLz4iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX09QRU4gPSAiPC8iOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFhNTEdlbmVyYXRvckltcGwgaW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9DTE9TRSA9ICI/PiI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9PUEVOID0gIjw/IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19JRCA9ICJQVUJMSUMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX1BSRUZJWCA9ICJzc2kiOy8vJE5PTi1OTFMtMSQKLQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfRkVBVFVSRSA9ICJTU0kiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX1RPS0VOID0gIiMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNX0lEID0gIlNZU1RFTSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0xPU0UgPSAiPiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSVNvdXJjZUdlbmVyYXRvciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBYTUxHZW5lcmF0b3JJbXBsKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQkvL3ByaXZhdGUgYm9vbGVhbiBpc0NvbW1lbnRUYWcoWE1MRWxlbWVudCBlbGVtZW50KSB7Ci0JLy8JaWYgKGVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCS8vCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JLy8JaWYgKGRvY3VtZW50ID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkvLwlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSBkb2N1bWVudC5nZXREb2N1bWVudFR5cGVBZGFwdGVyKCk7Ci0JLy8JaWYgKGFkYXB0ZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCS8vCWlmICghYWRhcHRlci5oYXNGZWF0dXJlKFNTSV9GRUFUVVJFKSkgcmV0dXJuIGZhbHNlOwotCS8vCVN0cmluZyBwcmVmaXggPSBlbGVtZW50LmdldFByZWZpeCgpOwotCS8vCXJldHVybiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4LmVxdWFscyhTU0lfUFJFRklYKSk7Ci0JLy99Ci0JLyoqCi0JICogSGVscGVyIHRvIG1vZGlmeSB0aGUgdGFnIG5hbWUgaW4gc3ViLWNsYXNzZXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNldFRhZ05hbWUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJKChFbGVtZW50SW1wbCkgZWxlbWVudCkuc2V0VGFnTmFtZSh0YWdOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBYTUxNb2RlbEdlbmVyYXRvciBjb25zdHJ1Y3RvcgotCSAqLwotCXByaXZhdGUgWE1MR2VuZXJhdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlQXR0ck5hbWUoQXR0ciBhdHRyKSB7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0JCWlmIChhdHRyTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChhdHRyTmFtZS5zdGFydHNXaXRoKEpTUFRhZy5UQUdfT1BFTikpIHsKLQkJCWlmICghYXR0ck5hbWUuZW5kc1dpdGgoSlNQVGFnLlRBR19DTE9TRSkpIHsKLQkJCQkvLyBjbG9zZSBKU1AKLQkJCQlyZXR1cm4gKGF0dHJOYW1lICsgSlNQVGFnLlRBR19DTE9TRSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCgoSURPTUF0dHIpIGF0dHIpLmlzR2xvYmFsQXR0cigpICYmIENNTm9kZVV0aWwuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cikgIT0gbnVsbCkgewotCQkJc3dpdGNoIChnZXRBdHRyTmFtZUNhc2UoYXR0cikpIHsKLQkJCQljYXNlIERvY3VtZW50VHlwZUFkYXB0ZXIuVVBQRVJfQ0FTRSA6Ci0JCQkJCWF0dHJOYW1lID0gYXR0ck5hbWUudG9VcHBlckNhc2UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEb2N1bWVudFR5cGVBZGFwdGVyLkxPV0VSX0NBU0UgOgotCQkJCQlhdHRyTmFtZSA9IGF0dHJOYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQkvLyBBU0lTX0NBU0UKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGF0dHJOYW1lOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVBdHRyVmFsdWUoQXR0ciBhdHRyKSB7Ci0JCXJldHVybiBnZW5lcmF0ZUF0dHJWYWx1ZShhdHRyLCAoY2hhcikgMCk7IC8vIG5vIHF1b3RlIHByZWZlcmVuY2UKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlQXR0clZhbHVlKEF0dHIgYXR0ciwgY2hhciBxdW90ZSkgewotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBuYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0JCVNvdXJjZVZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgU291cmNlVmFsaWRhdG9yKGF0dHIpOwotCQlTdHJpbmcgdmFsdWUgPSB2YWxpZGF0b3IuY29udmVydFNvdXJjZSgoKElET01Ob2RlKSBhdHRyKS5nZXRWYWx1ZVNvdXJjZSgpKTsKLQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLnN0YXJ0c1dpdGgoSlNQVGFnLlRBR19PUEVOKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChpc0Jvb2xlYW5BdHRyKGF0dHIpKSB7Ci0JCQkJaWYgKCgoQXR0ckltcGwpIGF0dHIpLmlzWE1MQXR0cigpKSB7Ci0JCQkJCS8vIGdlbmVyYXRlIHRoZSBuYW1lIGFzIHZhbHVlCi0JCQkJCXZhbHVlID0gYXR0ci5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gbm90IHRvIGdlbmVyYXRlICc9JyBhbmQgdmFsdWUgZm9yIEhUTUwgYm9vbGVhbgotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdlbmVyYXRlQXR0clZhbHVlKHZhbHVlLCBxdW90ZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUF0dHJWYWx1ZShTdHJpbmcgdmFsdWUsIGNoYXIgcXVvdGUpIHsKLQkJLy8gYXNzdW1lIHRoZSB2YWxpZCBpcyBhbHJlYWR5IHZhbGlkYXRlZCBub3QgdG8gaW5jbHVkZSBib3RoIHF1b3RlcwotCQlpZiAocXVvdGUgPT0gJyInKSB7Ci0JCQlpZiAoKHZhbHVlICE9IG51bGwpICYmICh2YWx1ZS5pbmRleE9mKCciJykgPj0gMCkpCi0JCQkJcXVvdGUgPSAnXCcnOyAvLyBmb3JjZQotCQl9IGVsc2UgaWYgKHF1b3RlID09ICdcJycpIHsKLQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYgKHZhbHVlLmluZGV4T2YoJ1wnJykgPj0gMCkpCi0JCQkJcXVvdGUgPSAnIic7IC8vIGZvcmNlCi0JCX0gZWxzZSB7IC8vIG5vIHByZWZlcmVuY2UKLQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYgKHZhbHVlLmluZGV4T2YoJyInKSA8IDApKQotCQkJCXF1b3RlID0gJyInOwotCQkJZWxzZQotCQkJCXF1b3RlID0gJ1wnJzsKLQkJfQotCi0JCWludCBsZW5ndGggPSAodmFsdWUgPT0gbnVsbCA/IDAgOiB2YWx1ZS5sZW5ndGgoKSk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDIpOwotCQlidWZmZXIuYXBwZW5kKHF1b3RlKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHZhbHVlKTsKLQkJYnVmZmVyLmFwcGVuZChxdW90ZSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUNEQVRBU2VjdGlvbiBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUNEQVRBU2VjdGlvbihDREFUQVNlY3Rpb24gY2RhdGEpIHsKLQkJaWYgKGNkYXRhID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgZGF0YSA9IGNkYXRhLmdldERhdGEoKTsKLQkJaW50IGxlbmd0aCA9IChkYXRhICE9IG51bGwgPyBkYXRhLmxlbmd0aCgpIDogMCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDE2KTsKLQkJYnVmZmVyLmFwcGVuZChDREFUQV9PUEVOKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoZGF0YSk7Ci0JCWJ1ZmZlci5hcHBlbmQoQ0RBVEFfQ0xPU0UpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVDaGlsZChOb2RlIHBhcmVudE5vZGUpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIXBhcmVudE5vZGUuaGFzQ2hpbGROb2RlcygpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChOb2RlIGNoaWxkID0gcGFyZW50Tm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJU3RyaW5nIGNoaWxkU291cmNlID0gZ2VuZXJhdGVTb3VyY2UoY2hpbGQpOwotCQkJaWYgKGNoaWxkU291cmNlICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZChjaGlsZFNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVDbG9zZVRhZyhOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCQkJaWYgKGVsZW1lbnQuaXNKU1BUYWcoKSkKLQkJCQkJCXJldHVybiBKU1BUYWcuQ09NTUVOVF9DTE9TRTsKLQkJCQkJcmV0dXJuIENPTU1FTlRfQ0xPU0U7Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50LmlzSlNQVGFnKCkpCi0JCQkJCXJldHVybiBKU1BUYWcuVEFHX0NMT1NFOwotCQkJCWlmIChlbGVtZW50LmlzRW1wdHlUYWcoKSkKLQkJCQkJcmV0dXJuIEVNUFRZX0NMT1NFOwotCQkJCXJldHVybiBUQUdfQ0xPU0U7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCUNvbW1lbnRJbXBsIGNvbW1lbnQgPSAoQ29tbWVudEltcGwpIG5vZGU7Ci0JCQkJaWYgKGNvbW1lbnQuaXNKU1BUYWcoKSkKLQkJCQkJcmV0dXJuIEpTUFRhZy5DT01NRU5UX0NMT1NFOwotCQkJCXJldHVybiBDT01NRU5UX0NMT1NFOwotCQkJfQotCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6Ci0JCQkJcmV0dXJuIFRBR19DTE9TRTsKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotCQkJCXJldHVybiBQSV9DTE9TRTsKLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJCXJldHVybiBDREFUQV9DTE9TRTsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVDb21tZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb21tZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Db21tZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUNvbW1lbnQoQ29tbWVudCBjb21tZW50KSB7Ci0JCWlmIChjb21tZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgZGF0YSA9IGNvbW1lbnQuZ2V0RGF0YSgpOwotCQlpbnQgbGVuZ3RoID0gKGRhdGEgIT0gbnVsbCA/IGRhdGEubGVuZ3RoKCkgOiAwKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICsgOCk7Ci0JCUNvbW1lbnRJbXBsIGltcGwgPSAoQ29tbWVudEltcGwpIGNvbW1lbnQ7Ci0JCWlmICghaW1wbC5pc0pTUFRhZygpKQotCQkJYnVmZmVyLmFwcGVuZChDT01NRU5UX09QRU4pOwotCQllbHNlCi0JCQlidWZmZXIuYXBwZW5kKEpTUFRhZy5DT01NRU5UX09QRU4pOwotCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChkYXRhKTsKLQkJaWYgKCFpbXBsLmlzSlNQVGFnKCkpCi0JCQlidWZmZXIuYXBwZW5kKENPTU1FTlRfQ0xPU0UpOwotCQllbHNlCi0JCQlidWZmZXIuYXBwZW5kKEpTUFRhZy5DT01NRU5UX0NMT1NFKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlRG9jdHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZG9jVHlwZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZURvY3R5cGUoRG9jdW1lbnRUeXBlIGRvY1R5cGUpIHsKLQkJaWYgKGRvY1R5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBuYW1lID0gZG9jVHlwZS5nZXROYW1lKCk7Ci0JCWludCBsZW5ndGggPSAobmFtZSAhPSBudWxsID8gbmFtZS5sZW5ndGgoKSA6IDApOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyAxNik7Ci0JCWJ1ZmZlci5hcHBlbmQoRE9DVFlQRV9PUEVOKTsKLQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQlpZiAobmFtZSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChuYW1lKTsKLQkJRG9jdW1lbnRUeXBlSW1wbCBkdCA9IChEb2N1bWVudFR5cGVJbXBsKSBkb2NUeXBlOwotCQlTdHJpbmcgcHVibGljSUQgPSBkdC5nZXRQdWJsaWNJZCgpOwotCQlTdHJpbmcgc3lzdGVtSUQgPSBkdC5nZXRTeXN0ZW1JZCgpOwotCQlpZiAocHVibGljSUQgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJYnVmZmVyLmFwcGVuZChQVUJMSUNfSUQpOwotCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJYnVmZmVyLmFwcGVuZCgnIicpOwotCQkJYnVmZmVyLmFwcGVuZChwdWJsaWNJRCk7Ci0JCQlidWZmZXIuYXBwZW5kKCciJyk7Ci0JCQlpZiAoc3lzdGVtSUQgIT0gbnVsbCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCQlidWZmZXIuYXBwZW5kKCciJyk7Ci0JCQkJYnVmZmVyLmFwcGVuZChzeXN0ZW1JRCk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnIicpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHN5c3RlbUlEICE9IG51bGwpIHsKLQkJCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQkJYnVmZmVyLmFwcGVuZChTWVNURU1fSUQpOwotCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCQlidWZmZXIuYXBwZW5kKCciJyk7Ci0JCQkJYnVmZmVyLmFwcGVuZChzeXN0ZW1JRCk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnIicpOwotCQkJfQotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoJz4nKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlRWxlbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgRWxlbWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gaWYgZW1wdHkgdGFnIGlzIHByZWZlcnJhYmxlLCBnZW5lcmF0ZSBhcyBlbXB0eSB0YWcKLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQkJaWYgKGltcGwucHJlZmVyRW1wdHlUYWcoKSkKLQkJCWltcGwuc2V0RW1wdHlUYWcodHJ1ZSk7Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIHN0YXJ0VGFnID0gZ2VuZXJhdGVTdGFydFRhZyhlbGVtZW50KTsKLQkJaWYgKHN0YXJ0VGFnICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHN0YXJ0VGFnKTsKLQkJU3RyaW5nIGNoaWxkID0gZ2VuZXJhdGVDaGlsZChlbGVtZW50KTsKLQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGNoaWxkKTsKLQkJU3RyaW5nIGVuZFRhZyA9IGdlbmVyYXRlRW5kVGFnKGVsZW1lbnQpOwotCQlpZiAoZW5kVGFnICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGVuZFRhZyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUVuZFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVFbmRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlFbGVtZW50SW1wbCBpbXBsID0gKEVsZW1lbnRJbXBsKSBlbGVtZW50OwotCi0JCS8vIGZpcnN0IGNoZWNrIGlmIHRhZyBhZGFwdGVyIGV4aXN0cwotCQlUYWdBZGFwdGVyIGFkYXB0ZXIgPSAoVGFnQWRhcHRlcikgaW1wbC5nZXRFeGlzdGluZ0FkYXB0ZXIoVGFnQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZyBlbmRUYWcgPSBhZGFwdGVyLmdldEVuZFRhZyhpbXBsKTsKLQkJCWlmIChlbmRUYWcgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZW5kVGFnOwotCQl9Ci0KLQkJaWYgKGltcGwuaXNFbXB0eVRhZygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghaW1wbC5pc0NvbnRhaW5lcigpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChpbXBsLmlzSlNQVGFnKCkpCi0JCQlyZXR1cm4gSlNQVGFnLlRBR19DTE9TRTsKLQotCQlTdHJpbmcgdGFnTmFtZSA9IGdlbmVyYXRlVGFnTmFtZShlbGVtZW50KTsKLQkJaW50IGxlbmd0aCA9ICh0YWdOYW1lICE9IG51bGwgPyB0YWdOYW1lLmxlbmd0aCgpIDogMCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDQpOwotCQlidWZmZXIuYXBwZW5kKEVORF9PUEVOKTsKLQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQodGFnTmFtZSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJz4nKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlRW50aXR5UmVmIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlbnRpdHlSZWYKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVFbnRpdHlSZWYoRW50aXR5UmVmZXJlbmNlIGVudGl0eVJlZikgewotCQlpZiAoZW50aXR5UmVmID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgbmFtZSA9IGVudGl0eVJlZi5nZXROb2RlTmFtZSgpOwotCQlpbnQgbGVuZ3RoID0gKG5hbWUgIT0gbnVsbCA/IG5hbWUubGVuZ3RoKCkgOiAwKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICsgNCk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyYnKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQobmFtZSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJzsnKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlUEkgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBpCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlUEkoUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpKSB7Ci0JCWlmIChwaSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHRhcmdldCA9IHBpLmdldFRhcmdldCgpOwotCQlTdHJpbmcgZGF0YSA9IHBpLmdldERhdGEoKTsKLQkJaW50IGxlbmd0aCA9ICh0YXJnZXQgIT0gbnVsbCA/IHRhcmdldC5sZW5ndGgoKSA6IDApOwotCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJbGVuZ3RoICs9IGRhdGEubGVuZ3RoKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDgpOwotCQlidWZmZXIuYXBwZW5kKFBJX09QRU4pOwotCQlpZiAodGFyZ2V0ICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHRhcmdldCk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoZGF0YSk7Ci0JCWJ1ZmZlci5hcHBlbmQoUElfQ0xPU0UpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVTb3VyY2UgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlU291cmNlKE5vZGUgbm9kZSkgewotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlRWxlbWVudCgoRWxlbWVudCkgbm9kZSk7Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCQlyZXR1cm4gZ2VuZXJhdGVUZXh0KChUZXh0KSBub2RlKTsKLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotCQkJCXJldHVybiBnZW5lcmF0ZUNvbW1lbnQoKENvbW1lbnQpIG5vZGUpOwotCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlRG9jdHlwZSgoRG9jdW1lbnRUeXBlKSBub2RlKTsKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotCQkJCXJldHVybiBnZW5lcmF0ZVBJKChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIG5vZGUpOwotCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlQ0RBVEFTZWN0aW9uKChDREFUQVNlY3Rpb24pIG5vZGUpOwotCQkJY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSA6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlRW50aXR5UmVmKChFbnRpdHlSZWZlcmVuY2UpIG5vZGUpOwotCQkJZGVmYXVsdCA6Ci0JCQkJLy8gRE9DVU1FTlQKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gZ2VuZXJhdGVDaGlsZChub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZVN0YXJ0VGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBFbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVN0YXJ0VGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQotCQlpZiAoaW1wbC5pc0pTUFRhZygpKSB7Ci0JCQkvLyBjaGVjayBpZiBKU1AgY29udGVudCB0eXBlIGFuZCBKU1AgRG9jdW1lbnQKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IChJRE9NRG9jdW1lbnQpIGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuaXNKU1BUeXBlKCkpIHsKLQkJCQlpZiAoZG9jdW1lbnQuaXNKU1BEb2N1bWVudCgpICYmICFpbXBsLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlpbXBsLnNldEpTUFRhZyhmYWxzZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpbXBsLnNldEpTUFRhZyhmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGltcGwuaXNDb21tZW50VGFnKCkgJiYgaW1wbC5nZXRFeGlzdGluZ0FkYXB0ZXIoVGFnQWRhcHRlci5jbGFzcykgPT0gbnVsbCkgewotCQkJQ29tbWVudEVsZW1lbnRSZWdpc3RyeSByZWdpc3RyeSA9IENvbW1lbnRFbGVtZW50UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJCXJlZ2lzdHJ5LnNldHVwQ29tbWVudEVsZW1lbnQoaW1wbCk7Ci0JCX0KLQotCQkvLyBmaXJzdCBjaGVjayBpZiB0YWcgYWRhcHRlciBleGlzdHMKLQkJVGFnQWRhcHRlciBhZGFwdGVyID0gKFRhZ0FkYXB0ZXIpIGltcGwuZ2V0RXhpc3RpbmdBZGFwdGVyKFRhZ0FkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc3RhcnRUYWcgPSBhZGFwdGVyLmdldFN0YXJ0VGFnKGltcGwpOwotCQkJaWYgKHN0YXJ0VGFnICE9IG51bGwpCi0JCQkJcmV0dXJuIHN0YXJ0VGFnOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlpZiAoaW1wbC5pc0NvbW1lbnRUYWcoKSkgewotCQkJaWYgKGltcGwuaXNKU1BUYWcoKSkKLQkJCQlidWZmZXIuYXBwZW5kKEpTUFRhZy5DT01NRU5UX09QRU4pOwotCQkJZWxzZQotCQkJCWJ1ZmZlci5hcHBlbmQoQ09NTUVOVF9PUEVOKTsKLQkJCVN0cmluZyB0YWdOYW1lID0gZ2VuZXJhdGVUYWdOYW1lKGVsZW1lbnQpOwotCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCQl9IGVsc2UgaWYgKGltcGwuaXNKU1BUYWcoKSkgewotCQkJYnVmZmVyLmFwcGVuZChKU1BUYWcuVEFHX09QRU4pOwotCQkJU3RyaW5nIHRhZ05hbWUgPSBnZW5lcmF0ZVRhZ05hbWUoZWxlbWVudCk7Ci0JCQlpZiAodGFnTmFtZSAhPSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQodGFnTmFtZSk7Ci0JCQlpZiAoaW1wbC5pc0NvbnRhaW5lcigpKQotCQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsgLy8gSlNQIGNvbnRhaW5lcgotCQl9IGVsc2UgewotCQkJYnVmZmVyLmFwcGVuZCgnPCcpOwotCQkJU3RyaW5nIHRhZ05hbWUgPSBnZW5lcmF0ZVRhZ05hbWUoZWxlbWVudCk7Ci0JCQlpZiAodGFnTmFtZSAhPSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQodGFnTmFtZSk7Ci0JCX0KLQotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpbnQgbGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCVN0cmluZyBhdHRyTmFtZSA9IGdlbmVyYXRlQXR0ck5hbWUoYXR0cik7Ci0JCQlpZiAoYXR0ck5hbWUgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKGF0dHJOYW1lKTsKLQkJCVN0cmluZyBhdHRyVmFsdWUgPSBnZW5lcmF0ZUF0dHJWYWx1ZShhdHRyKTsKLQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCkgewotCQkJCS8vIGF0dHIgbmFtZSBvbmx5IGZvciBIVE1MIGJvb2xlYW4gYW5kIEpTUAotCQkJCWJ1ZmZlci5hcHBlbmQoJz0nKTsKLQkJCQlidWZmZXIuYXBwZW5kKGF0dHJWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgY2xvc2VUYWcgPSBnZW5lcmF0ZUNsb3NlVGFnKGVsZW1lbnQpOwotCQlpZiAoY2xvc2VUYWcgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoY2xvc2VUYWcpOwotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlVGFnTmFtZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJRE9NRWxlbWVudCB4ZSA9IChJRE9NRWxlbWVudCkgZWxlbWVudDsKLQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoeGUuaXNKU1BUYWcoKSkgewotCQkJaWYgKHRhZ05hbWUuZXF1YWxzKEpTUFRhZy5KU1BfRVhQUkVTU0lPTikpCi0JCQkJcmV0dXJuIEpTUFRhZy5FWFBSRVNTSU9OX1RPS0VOOwotCQkJaWYgKHRhZ05hbWUuZXF1YWxzKEpTUFRhZy5KU1BfREVDTEFSQVRJT04pKQotCQkJCXJldHVybiBKU1BUYWcuREVDTEFSQVRJT05fVE9LRU47Ci0JCQlpZiAodGFnTmFtZS5lcXVhbHMoSlNQVGFnLkpTUF9ESVJFQ1RJVkUpKQotCQkJCXJldHVybiBKU1BUYWcuRElSRUNUSVZFX1RPS0VOOwotCQkJaWYgKHRhZ05hbWUuc3RhcnRzV2l0aChKU1BUYWcuSlNQX0RJUkVDVElWRSkpIHsKLQkJCQlpbnQgb2Zmc2V0ID0gSlNQVGFnLkpTUF9ESVJFQ1RJVkUubGVuZ3RoKCkgKyAxOyAvLyBhZnRlciAnLicKLQkJCQlyZXR1cm4gKEpTUFRhZy5ESVJFQ1RJVkVfVE9LRU4gKyB0YWdOYW1lLnN1YnN0cmluZyhvZmZzZXQpKTsKLQkJCX0KLQkJCXJldHVybiAoeGUuaXNDb21tZW50VGFnKCkpID8gdGFnTmFtZSA6IG51bGw7Ci0JCX0gZWxzZSBpZiAodGFnTmFtZS5zdGFydHNXaXRoKEpTUFRhZy5UQUdfT1BFTikpIHsKLQkJCWlmICghdGFnTmFtZS5lbmRzV2l0aChKU1BUYWcuVEFHX0NMT1NFKSkgewotCQkJCS8vIGNsb3NlIEpTUAotCQkJCXJldHVybiAodGFnTmFtZSArIEpTUFRhZy5UQUdfQ0xPU0UpOwotCQkJfQotCQl9IGVsc2UgaWYgKHhlLmlzQ29tbWVudFRhZygpKSB7Ci0JCQlTdHJpbmcgcHJlZml4ID0gZWxlbWVudC5nZXRQcmVmaXgoKTsKLQkJCWlmIChwcmVmaXguZXF1YWxzKFNTSV9QUkVGSVgpKSB7Ci0JCQkJcmV0dXJuIChTU0lfVE9LRU4gKyBlbGVtZW50LmdldExvY2FsTmFtZSgpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgheGUuaXNKU1BUYWcoKSAmJiB4ZS5pc0dsb2JhbFRhZygpICYmIC8vIGdsb2JhbCB0YWcKLQkJCQkJCUNNTm9kZVV0aWwuZ2V0RWxlbWVudERlY2xhcmF0aW9uKHhlKSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG5ld05hbWUgPSB0YWdOYW1lOwotCQkJCXN3aXRjaCAoZ2V0VGFnTmFtZUNhc2UoeGUpKSB7Ci0JCQkJCWNhc2UgRG9jdW1lbnRUeXBlQWRhcHRlci5VUFBFUl9DQVNFIDoKLQkJCQkJCW5ld05hbWUgPSB0YWdOYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBEb2N1bWVudFR5cGVBZGFwdGVyLkxPV0VSX0NBU0UgOgotCQkJCQkJbmV3TmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAobmV3TmFtZSAhPSB0YWdOYW1lKSB7Ci0JCQkJCXRhZ05hbWUgPSBuZXdOYW1lOwotCQkJCQlzZXRUYWdOYW1lKGVsZW1lbnQsIHRhZ05hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdGFnTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZVRleHQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLlRleHQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlVGV4dChUZXh0IHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlUZXh0SW1wbCBpbXBsID0gKFRleHRJbXBsKSB0ZXh0OwotCQlTdHJpbmcgc291cmNlID0gaW1wbC5nZXRUZXh0U291cmNlKCk7Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiBzb3VyY2U7Ci0JCXJldHVybiBnZW5lcmF0ZVRleHREYXRhKHRleHQsIGltcGwuZ2V0RGF0YSgpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlVGV4dERhdGEoVGV4dCB0ZXh0LCBTdHJpbmcgZGF0YSkgewotCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJVGV4dEltcGwgaW1wbCA9IChUZXh0SW1wbCkgdGV4dDsKLQkJaWYgKGltcGwuaXNKU1BDb250ZW50KCkgfHwgaW1wbC5pc0NEQVRBQ29udGVudCgpKSB7Ci0JCQlyZXR1cm4gbmV3IFNvdXJjZVZhbGlkYXRvcihpbXBsKS5jb252ZXJ0U291cmNlKGRhdGEpOwotCQl9Ci0JCVN0cmluZyBzb3VyY2UgPSBkYXRhOwotCi0JCS8vIGNvbnZlcnQgc3BlY2lhbCBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBlbnRpdGllcwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSBkYXRhLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGdldENoYXJOYW1lKGRhdGEuY2hhckF0KGkpKTsKLQkJCWlmIChuYW1lID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyA4KTsKLQkJCWlmIChpID4gb2Zmc2V0KQotCQkJCWJ1ZmZlci5hcHBlbmQoZGF0YS5zdWJzdHJpbmcob2Zmc2V0LCBpKSk7Ci0JCQlidWZmZXIuYXBwZW5kKCcmJyk7Ci0JCQlidWZmZXIuYXBwZW5kKG5hbWUpOwotCQkJYnVmZmVyLmFwcGVuZCgnOycpOwotCQkJb2Zmc2V0ID0gaSArIDE7Ci0JCX0KLQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQlpZiAobGVuZ3RoID4gb2Zmc2V0KQotCQkJCWJ1ZmZlci5hcHBlbmQoZGF0YS5zdWJzdHJpbmcob2Zmc2V0KSk7Ci0JCQlzb3VyY2UgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JCWlmIChzb3VyY2UgPT0gbnVsbCB8fCBzb3VyY2UubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgaW50IGdldEF0dHJOYW1lQ2FzZShBdHRyIGF0dHIpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgYXR0ci5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIERvY3VtZW50VHlwZUFkYXB0ZXIuU1RSSUNUX0NBU0U7Ci0JCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSBkb2N1bWVudC5nZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIERvY3VtZW50VHlwZUFkYXB0ZXIuU1RSSUNUX0NBU0U7Ci0JCXJldHVybiBhZGFwdGVyLmdldEF0dHJOYW1lQ2FzZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldENoYXJOYW1lKGNoYXIgYykgewotCQlzd2l0Y2ggKGMpIHsKLQkJCWNhc2UgJzwnIDoKLQkJCQlyZXR1cm4gSVhNTENoYXJFbnRpdHkuTFRfTkFNRTsKLQkJCWNhc2UgJz4nIDoKLQkJCQlyZXR1cm4gSVhNTENoYXJFbnRpdHkuR1RfTkFNRTsKLQkJCWNhc2UgJyYnIDoKLQkJCQlyZXR1cm4gSVhNTENoYXJFbnRpdHkuQU1QX05BTUU7Ci0JCQljYXNlICciJyA6Ci0JCQkJcmV0dXJuIElYTUxDaGFyRW50aXR5LlFVT1RfTkFNRTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGludCBnZXRUYWdOYW1lQ2FzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIERvY3VtZW50VHlwZUFkYXB0ZXIuU1RSSUNUX0NBU0U7Ci0JCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSBkb2N1bWVudC5nZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIERvY3VtZW50VHlwZUFkYXB0ZXIuU1RSSUNUX0NBU0U7Ci0JCXJldHVybiBhZGFwdGVyLmdldFRhZ05hbWVDYXNlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQm9vbGVhbkF0dHIoQXR0ciBhdHRyKSB7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gZGVjbCA9IENNTm9kZVV0aWwuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNNRGF0YVR5cGUgdHlwZSA9IGRlY2wuZ2V0QXR0clR5cGUoKTsKLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIHZhbHVlc1tdID0gdHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0JCWlmICh2YWx1ZXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICh2YWx1ZXMubGVuZ3RoID09IDEgJiYgdmFsdWVzWzBdLmVxdWFscyhkZWNsLmdldEF0dHJOYW1lKCkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE3OTlmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0vKioKLSAqIFhNTE1vZGVsQ29udGV4dCBjbGFzcwotICovCi1jbGFzcyBYTUxNb2RlbENvbnRleHQgewotCXByaXZhdGUgTm9kZSBuZXh0Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBOb2RlIHBhcmVudE5vZGUgPSBudWxsOwotCi0JLy8JcHJpdmF0ZSBYTUxNb2RlbEltcGwgbW9kZWwgPSBudWxsOwotCXByaXZhdGUgTm9kZSByb290Tm9kZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBYTUxNb2RlbENvbnRleHQgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gcm9vdE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlYTUxNb2RlbENvbnRleHQoTm9kZSByb290Tm9kZSkgewotCQlzdXBlcigpOwotCi0JCXRoaXMucm9vdE5vZGUgPSByb290Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBmaW5kRW5kVGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JRWxlbWVudCBmaW5kRW5kVGFnKFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMucGFyZW50Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZm9yIChOb2RlIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJYnJlYWs7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQlpZiAoZWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCWlmIChlbGVtZW50Lm1hdGNoVGFnTmFtZSh0YWdOYW1lKSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQkJLy8gaWYgYW5jZXN0b3IgZWxlbWVudCBoYXMgZW5kIHRhZyBzdG9wIHNlYXJjaAotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKSAhPSBudWxsKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JVGV4dCBmaW5kTmV4dFRleHQoKSB7Ci0JCU5vZGUgbm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlICE9IHRoaXMubmV4dE5vZGUgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgbm9kZTsKLQkJCQkvLyBza2lwIGVtcHR5IHRleHQKLQkJCQlpZiAodGV4dC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKQotCQkJCQlyZXR1cm4gdGV4dDsKLQkJCX0KLQkJCU5vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJbm9kZSA9IGNoaWxkOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJCU5vZGUgbmV4dCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJCW5vZGUgPSBuZXh0OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGZpbmRQcmV2aW91c1RleHQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5UZXh0Ci0JICovCi0JVGV4dCBmaW5kUHJldmlvdXNUZXh0KCkgewotCQlpZiAodGhpcy5wYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZSBub2RlID0gbnVsbDsKLQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkKLQkJCW5vZGUgPSB0aGlzLm5leHROb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQllbHNlCi0JCQlub2RlID0gdGhpcy5wYXJlbnROb2RlLmdldExhc3RDaGlsZCgpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKFRleHQpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogZmluZFN0YXJ0VGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JRWxlbWVudCBmaW5kU3RhcnRUYWcoU3RyaW5nIHRhZ05hbWUsIFN0cmluZyByb290TmFtZSkgewotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gY2hlY2sgcHJldmlvdXMgZm9yIGVtcHR5IGNvbnRlbnQgZWxlbWVudAotCQlOb2RlIHByZXYgPSBudWxsOwotCQlpZiAodGhpcy5uZXh0Tm9kZSAhPSBudWxsKQotCQkJcHJldiA9IHRoaXMubmV4dE5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCWVsc2UgaWYgKHRoaXMucGFyZW50Tm9kZSAhPSBudWxsKQotCQkJcHJldiA9IHRoaXMucGFyZW50Tm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJaWYgKHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHByZXY7Ci0JCQlpZiAoIWVsZW1lbnQuaGFzRW5kVGFnKCkgJiYgIWVsZW1lbnQuaXNFbXB0eVRhZygpICYmIGVsZW1lbnQubWF0Y2hUYWdOYW1lKHRhZ05hbWUpKQotCQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0KLQkJZm9yIChOb2RlIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlicmVhazsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCWlmIChlbGVtZW50Lm1hdGNoVGFnTmFtZSh0YWdOYW1lKSkKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCWlmIChyb290TmFtZSAhPSBudWxsICYmIGVsZW1lbnQubWF0Y2hUYWdOYW1lKHJvb3ROYW1lKSkKLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE5leHROb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCU5vZGUgZ2V0TmV4dE5vZGUoKSB7Ci0JCXJldHVybiB0aGlzLm5leHROb2RlOwotCX0KLQotCS8qKgotCSAqIGdldFBhcmVudE5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JTm9kZSBnZXRQYXJlbnROb2RlKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnROb2RlOwotCX0KLQotCS8qKgotCSAqIGdldFJvb3ROb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCU5vZGUgZ2V0Um9vdE5vZGUoKSB7Ci0JCXJldHVybiB0aGlzLnJvb3ROb2RlOwotCX0KLQotCS8qKgotCSAqIHNldExhc3QgbWV0aG9kCi0JICovCi0Jdm9pZCBzZXRMYXN0KCkgewotCQlpZiAodGhpcy5wYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLm5leHROb2RlICE9IG51bGwpIHsKLQkJCU5vZGUgcHJldiA9IHRoaXMubmV4dE5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQlpZiAocHJldiA9PSBudWxsIHx8IHByZXYuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlyZXR1cm47Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwcmV2OwotCQkJaWYgKGVsZW1lbnQuaGFzRW5kVGFnKCkgfHwgIWVsZW1lbnQuaXNDb250YWluZXIoKSB8fCBlbGVtZW50LmlzRW1wdHlUYWcoKSkKLQkJCQlyZXR1cm47Ci0JCQlzZXRQYXJlbnROb2RlKHByZXYpOwotCQl9Ci0KLQkJLy8gZmluZCBsYXN0IG9wZW4gcGFyZW50Ci0JCU5vZGUgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwotCQlOb2RlIGxhc3QgPSBwYXJlbnQuZ2V0TGFzdENoaWxkKCk7Ci0JCXdoaWxlIChsYXN0ICE9IG51bGwpIHsKLQkJCWlmIChsYXN0LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJYnJlYWs7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBsYXN0OwotCQkJaWYgKGVsZW1lbnQuaGFzRW5kVGFnKCkgfHwgIWVsZW1lbnQuaXNDb250YWluZXIoKSB8fCBlbGVtZW50LmlzRW1wdHlUYWcoKSkKLQkJCQlicmVhazsKLQkJCXBhcmVudCA9IGVsZW1lbnQ7Ci0JCQlsYXN0ID0gcGFyZW50LmdldExhc3RDaGlsZCgpOwotCQl9Ci0JCWlmIChwYXJlbnQgIT0gdGhpcy5wYXJlbnROb2RlKQotCQkJc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIHNldE5leHROb2RlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuZXh0Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXZvaWQgc2V0TmV4dE5vZGUoTm9kZSBuZXh0Tm9kZSkgewotCQl0aGlzLm5leHROb2RlID0gbmV4dE5vZGU7Ci0JCWlmIChuZXh0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0aGlzLnBhcmVudE5vZGUgPSBuZXh0Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogc2V0UGFyZW50Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXZvaWQgc2V0UGFyZW50Tm9kZShOb2RlIHBhcmVudE5vZGUpIHsKLQkJdGhpcy5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTsKLQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbE5vdGlmaWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsTm90aWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEzZTI1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsTm90aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIAotICogWE1MTW9kZWxOb3RpZmllciBtYW5hZ2VzIHRoZSBub3RpZmljYXRpb24gcHJvY2Vzcy4gQ2xpZW50cyBzaG91bGQgbm90IHVzZQotICogZXh0ZW5kIG9yIHJlZmVyZW5jZS4KLSAqIAotICogSVNTVUU6IHNob3VsZCBiZSBpbnRlcm5hbGl6ZWQuCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBYTUxNb2RlbE5vdGlmaWVyIHsKLQotCS8qKgotCSAqIGF0dHJSZXBsYWNlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSBuZXdBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG9sZEF0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQl2b2lkIGF0dHJSZXBsYWNlZChFbGVtZW50IGVsZW1lbnQsIEF0dHIgbmV3QXR0ciwgQXR0ciBvbGRBdHRyKTsKLQotCS8qKgotCSAqIFNpZ25hbCB0aGF0IGNoYW5naW5nIGlzIHN0YXJ0aW5nLgotCSAqIAotCSAqLwotCXZvaWQgYmVnaW5DaGFuZ2luZygpOwotCi0JLyoqCi0JICogU2lnbmFsIHRoYXQgY2hhbmdpbmcgaXMgc3RhcnRpbmcgd2l0aCBhIGJyYW5kIG5ldyBtb2RlbC4KLQkgKiAKLQkgKi8KLQl2b2lkIGJlZ2luQ2hhbmdpbmcoYm9vbGVhbiBuZXdNb2RlbCk7Ci0KLQkvKioKLQkgKiBDYW5jZWwgcGVuZGluZyBub3RpZmljYXRpb25zLiBUaGlzIGlzIGNhbGxlZCBpbiB0aGUgY29udGV4dCBvZgotCSAqICJyZWluaXRpYWxpemF0aW9uIiBzbyBpcyBhc3N1bWVkIEFMTCBub3RpZmljYXRpb25zIGNhbiBiZSBzYWZlbHkKLQkgKiBjYW5jZWxlZCwgYXNzdW1pbmcgdGhhdCBvbmNlIGZhY3RvcmllcyBhbmQgYWRhcHRlcnMgYXJlIHJlLWluaXRpYWxpemVkCi0JICogdGhleSB3aWxsIGJlIHJlLW5vdGlmaWVkIGFzIHRleHQgaXMgc2V0IGluIG1vZGVsLCBpZiBzdGlsbCBhcHByb3ByaWF0ZS4KLQkgKi8KLQl2b2lkIGNhbmNlbFBlbmRpbmcoKTsKLQotCS8qKgotCSAqIGNoaWxkUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQl2b2lkIGNoaWxkUmVwbGFjZWQoTm9kZSBwYXJlbnROb2RlLCBOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKTsKLQotCS8qKgotCSAqIEVkaXRhYmxlIHN0YXRlIGNoYW5nZWQgZm9yIG5vZGUuCi0JICogCi0JICovCi0Jdm9pZCBlZGl0YWJsZUNoYW5nZWQoTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIFNpZ25hbCBjaGFuZ2luZyBpcyBmaW5pc2hlZC4KLQkgKiAKLQkgKi8KLQl2b2lkIGVuZENoYW5naW5nKCk7Ci0KLQkvKioKLQkgKiBTaWduYWwgZW5kIHRhZyBjaGFuZ2VkLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogCi0JICovCi0Jdm9pZCBlbmRUYWdDaGFuZ2VkKEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJlZmxlY3Qgc3RhdGUgb2YgbW9kZWwuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIG1vZGVsIGhhZCBjaGFuZ2VkLgotCSAqIAotCSAqLwotCWJvb2xlYW4gaGFzQ2hhbmdlZCgpOwotCi0JLyoqCi0JICogVXNlZCB0byByZWZsZWN0IHN0YXRlIG9mIHBhcnNpbmcgcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgbW9kZWwgaXMgY3VycmVudGx5IGNoYW5naW5nLgotCSAqLwotCWJvb2xlYW4gaXNDaGFuZ2luZygpOwotCi0JLyoqCi0JICogc2lnbmFsIHByb3BlcnR5IGNoYW5nZWQKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXZvaWQgcHJvcGVydHlDaGFuZ2VkKE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiBzaWduYWwgc3RhcnQgdGFnIGNoYW5nZWQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXZvaWQgc3RhcnRUYWdDaGFuZ2VkKEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBzaWduYWwgc3RydWN0dXJlZCBjaGFuZ2VkLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0Jdm9pZCBzdHJ1Y3R1cmVDaGFuZ2VkKE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiB2YWx1ZUNoYW5nZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQl2b2lkIHZhbHVlQ2hhbmdlZChOb2RlIG5vZGUpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsTm90aWZpZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsTm90aWZpZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MThmODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbE5vdGlmaWVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFhNTE1vZGVsTm90aWZpZXJJbXBsIGltcGxlbWVudHMgWE1MTW9kZWxOb3RpZmllciB7Ci0KLQkvKiBlbmQ6IGZvciBkZWJ1Z2dpbmcgb25seSAqLwotCXByaXZhdGUgY2xhc3MgTm90aWZ5RXZlbnQgewotCQlPYmplY3QgY2hhbmdlZEZlYXR1cmU7Ci0JCWJvb2xlYW4gZGlzY2FyZGVkOwotCQlPYmplY3QgbmV3VmFsdWU7Ci0JCS8vIG5vdGU6IGRvbid0IGluaXRpYWxpemUgaW5zdGFuY2UgdmFyaWFibGVzLCBzaW5jZQotCQkvLyB0aGF0IGNhdXNlcyBkb3VibGUgYXNzaWdubWVudHMsIGFuZCBsb3RzIG9mIHRoZXNlIGFyZSBjcmVhdGVkLgotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyOwotCQlPYmplY3Qgb2xkVmFsdWU7Ci0JCWludCBwb3M7Ci0JCVN0cmluZyByZWFzb247Ci0JCWludCB0eXBlOwotCQlpbnQgaW5kZXg7Ci0KLQkJTm90aWZ5RXZlbnQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IHR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJCXRoaXMubm90aWZpZXIgPSBub3RpZmllcjsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQl0aGlzLmNoYW5nZWRGZWF0dXJlID0gY2hhbmdlZEZlYXR1cmU7Ci0JCQl0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7Ci0JCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0JCQl0aGlzLnBvcyA9IHBvczsKLQkJCXRoaXMucmVhc29uID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBRERFRF9USEVOX1JFTU9WRUQgPSAiRGlzY2FyZDogQWRkZWQgdGhlbiByZW1vdmVkIHJ1bGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBmT3B0aW1pemVEZWZlcnJlZCA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBmT3B0aW1pemVEZWZlcnJlZEFjY29yZGluZ1RvUGFyZW50QWRkZWQgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZk9wdGltaXplRGVmZXJyZWRBY2NvcmRpbmdUb1BhcmVudFJlbW92ZWQgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQQVJFTlRfSVNfQURERUQgPSAiRGlzYXJkZWQ6IFBhcmVudCBoYXMganVzdCBiZWVuIGFkZGVkIjsgLy8kTk9OLU5MUy0xJAotCS8qIHN0YXJ0OiBmb3IgZGVidWdnaW5nIG9ubHkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSRU5UX0lTX1JFTU9WRURfVE9PID0gIkRpc2NhcmQ6IFBhcmVudCB3YXMgcmVtb3ZlZCB0b28iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBUkVOVF9JU19SRVBBUkVOVEVEID0gIk5vdCBEaXNjYXJkOiBQYXJlbnQgd2FzIHJlbW92ZWQgc28gdGhpcyBpbXBsaWVzIHJlcGFyZW50aW5nIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgTm9kZSBjaGFuZ2VkUm9vdCA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hhbmdpbmcgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZG9pbmdOZXdNb2RlbCA9IGZhbHNlOwotCXByaXZhdGUgVmVjdG9yIGV2ZW50cyA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZsdXNoaW5nID0gZmFsc2U7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgWE1MTW9kZWxOb3RpZmllckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogYXR0clJlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICogQHBhcmFtIG5ld0F0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gb2xkQXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqLwotCXB1YmxpYyB2b2lkIGF0dHJSZXBsYWNlZChFbGVtZW50IGVsZW1lbnQsIEF0dHIgbmV3QXR0ciwgQXR0ciBvbGRBdHRyKSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUF0dHIgYXR0ciA9IG51bGw7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IG51bGw7Ci0JCVN0cmluZyBuZXdWYWx1ZSA9IG51bGw7Ci0JCWlmIChvbGRBdHRyICE9IG51bGwpIHsKLQkJCWF0dHIgPSBvbGRBdHRyOwotCQkJb2xkVmFsdWUgPSBvbGRBdHRyLmdldFZhbHVlKCk7Ci0JCX0KLQkJaWYgKG5ld0F0dHIgIT0gbnVsbCkgewotCQkJYXR0ciA9IG5ld0F0dHI7Ci0JCQluZXdWYWx1ZSA9IG5ld0F0dHIuZ2V0VmFsdWUoKTsKLQkJfQotCQlJRE9NTm9kZSBub3RpZmllciA9IChJRE9NTm9kZSkgZWxlbWVudDsKLQkJaW50IG9mZnNldCA9IG5vdGlmaWVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCW5vdGlmeShub3RpZmllciwgSU5vZGVOb3RpZmllci5DSEFOR0UsIGF0dHIsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgb2Zmc2V0KTsKLQkJcHJvcGVydHlDaGFuZ2VkKG5vdGlmaWVyKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpbkNoYW5naW5nKCkgewotCQl0aGlzLmNoYW5naW5nID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpbkNoYW5naW5nKGJvb2xlYW4gbmV3TW9kZWwpIHsKLQkJYmVnaW5DaGFuZ2luZygpOwotCQl0aGlzLmRvaW5nTmV3TW9kZWwgPSBuZXdNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjYW5jZWxQZW5kaW5nKCkgewotCQkvLyB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGlzIGFycmF5LCBzaW5jZQotCQkvLyB0aGUgYXJyYXkgbWF5IGJlIGJlaW5nIHByb2Nlc3NlZCwgaW4gdGhlIGRlZmZlcnJlZCBub3RpZmljYXRpb24KLQkJLy8gbG9vcCwgYnV0IHdlIGNhbiBzaWduYWwgdGhhdCBhbGwKLQkJLy8gc2hvdWxkIGJlIGRpc2NhcmRlZCwgc28gYW55IHJlbWFpbmluZyBvbmVzIHdpbGwgYmUgaWdub3JlZC4KLQkJaWYgKHRoaXMuZXZlbnRzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGhpcy5ldmVudHMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlOb3RpZnlFdmVudCBldmVudCA9IChOb3RpZnlFdmVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWV2ZW50LmRpc2NhcmRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJLy8gdGhpcyBjYW5jZWwgaXMgcHJlc3VtYWJseSBiZWluZyBjYWxsZWQgYXMgYSBmdW5jdGlvbiBvZgotCQkvLyAicmVpbml0aWFpbGl6YXRpb24iIHNvIHdlIGNhbiBpZ25vcmUgY2hhbmdlcyB0byB0aGUKLQkJLy8gb2xkIHJvb3QsIGFuZCBjaGFuZ2VzIHRvIHRoZSBuZXcgb25lIHdpbGwgYmUgdHJpZ2dlcmVkIGR1cmluZwotCQkvLyByZWluaXRpYWxpemF0aW9uLgotCQljaGFuZ2VkUm9vdCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogY2hpbGRSZXBsYWNlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBvbGRDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIGNoaWxkUmVwbGFjZWQoTm9kZSBwYXJlbnROb2RlLCBOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKSB7Ci0JCWlmIChwYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01Ob2RlIG5vdGlmaWVyID0gKElET01Ob2RlKSBwYXJlbnROb2RlOwotCQlpbnQgdHlwZSA9IElOb2RlTm90aWZpZXIuQ0hBTkdFOwotCQlpZiAobmV3Q2hpbGQgPT0gbnVsbCkKLQkJCXR5cGUgPSBJTm9kZU5vdGlmaWVyLlJFTU9WRTsKLQkJZWxzZSBpZiAob2xkQ2hpbGQgPT0gbnVsbCkKLQkJCXR5cGUgPSBJTm9kZU5vdGlmaWVyLkFERDsKLQkJaW50IG9mZnNldCA9IG5vdGlmaWVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCW5vdGlmeShub3RpZmllciwgdHlwZSwgb2xkQ2hpbGQsIG9sZENoaWxkLCBuZXdDaGlsZCwgb2Zmc2V0KTsKLQkJc3RydWN0dXJlQ2hhbmdlZChub3RpZmllcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZWRpdGFibGVDaGFuZ2VkKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRE9NTm9kZSBub3RpZmllciA9IChJRE9NTm9kZSkgbm9kZTsKLQkJaW50IG9mZnNldCA9IG5vdGlmaWVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCW5vdGlmeShub3RpZmllciwgSU5vZGVOb3RpZmllci5DSEFOR0UsIG51bGwsIG51bGwsIG51bGwsIG9mZnNldCk7Ci0JCXByb3BlcnR5Q2hhbmdlZChub3RpZmllcik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgZW5kQ2hhbmdpbmcoKSB7Ci0JCXRoaXMuZG9pbmdOZXdNb2RlbCA9IGZhbHNlOwotCQlpZiAoIXRoaXMuY2hhbmdpbmcpCi0JCQlyZXR1cm47IC8vIGF2b2lkIG5lc3RpbmcgY2FsbHMKLQkJbm90aWZ5RGVmZXJyZWQoKTsKLQkJaWYgKHRoaXMuY2hhbmdlZFJvb3QgIT0gbnVsbCkgewotCQkJbm90aWZ5U3RydWN0dXJlQ2hhbmdlZCh0aGlzLmNoYW5nZWRSb290KTsKLQkJCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmeURlZmVycmVkKSB7Ci0JCQkJU3RyaW5nIHAgPSB0aGlzLmNoYW5nZWRSb290LmdldE5vZGVOYW1lKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJEZWZlcnJlZCBTVFJVQ1VUUkVfQ0hBTkdFRDogIiArIHApOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aGlzLmNoYW5nZWRSb290ID0gbnVsbDsKLQkJfQotCQl0aGlzLmNoYW5naW5nID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgZW5kVGFnQ2hhbmdlZChFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSURPTU5vZGUgbm90aWZpZXIgPSAoSURPTU5vZGUpIGVsZW1lbnQ7Ci0JCWludCBvZmZzZXQgPSBub3RpZmllci5nZXRTdGFydE9mZnNldCgpOwotCQlub3RpZnkobm90aWZpZXIsIElOb2RlTm90aWZpZXIuQ0hBTkdFLCBudWxsLCBudWxsLCBudWxsLCBvZmZzZXQpOwotCQlwcm9wZXJ0eUNoYW5nZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hhbmdlZCgpIHsKLQkJcmV0dXJuICh0aGlzLmV2ZW50cyAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NoYW5naW5nKCkgewotCQlyZXR1cm4gdGhpcy5jaGFuZ2luZzsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgbm90aWZ5KElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJaWYgKG5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLmNoYW5naW5nICYmICF0aGlzLmZsdXNoaW5nKSB7Ci0JCQkvLyBkZWZlciBub3RpZmljYXRpb24KLQkJCWlmICh0aGlzLmV2ZW50cyA9PSBudWxsKQotCQkJCXRoaXMuZXZlbnRzID0gbmV3IFZlY3RvcigpOwotCQkJLy8gd2UgZG8gbm90IGRlZmVyIGFueXRoaW5nIGlmIHdlIGFyZSBkb2luZyBhIG5ldyBNb2RlbCwKLQkJCS8vIGV4Y2VwdCBmb3IgdGhlIGRvY3VtZW50IGV2ZW50LCBzaW5jZSBhbGwgb3RoZXJzIGFyZQotCQkJLy8gdHJpdmlhbCBhbmQgbm90IG5lZWRlZCBhdCB0aGF0IGluaXRpYWwgcG9pbnQuCi0JCQkvLyBCdXQgZXZlbiBmb3IgdGhhdCBvbmUgZG9jdW1lbnQgZXZlbnQsIGluIHRoZSBuZXcgbW9kZWwgY2FzZSwKLQkJCS8vIGl0IGlzIHN0aWxsIGltcG9ydGFudCB0byBkZWZlciBpdC4KLQkJCWlmICgoIWRvaW5nTmV3TW9kZWwpIHx8ICgoKE5vZGUpIG5vdGlmaWVyKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkpIHsKLQkJCQl0aGlzLmV2ZW50cy5hZGRFbGVtZW50KG5ldyBOb3RpZnlFdmVudChub3RpZmllciwgZXZlbnRUeXBlLCBjaGFuZ2VkRmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBwb3MpKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJLy8gSXRzIGltcG9ydGFudCB0byAia2VlcCBnb2luZyIgaWYgZXhjZXB0aW9uIG9jY3Vycywgc2luY2UgdGhpcwotCQkJLy8gbm90aWZpY2F0aW9uCi0JCQkvLyBjb21lcyBpbiBiZXR3ZWVuICJhYm91dCB0byBjaGFuZ2UiIGFuZCAiY2hhbmdlZCIgZXZlbnRzLiBXZSBkbwotCQkJLy8gbG9nLCBob3dldmVyLAotCQkJLy8gc2luY2Ugd291bGQgaW5kaWNhdGUgYSBwcm9ncmFtIGVycm9yLgotCQkJbm90aWZpZXIubm90aWZ5KGV2ZW50VHlwZSwgY2hhbmdlZEZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgcG9zKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkEgc3RydWN0dXJlZCBtb2RlbCBjbGllbnQgdGhyZXcgZm9sbG93aW5nIGV4Y2VwdGlvbiBkdXJpbmcgYWRhcHRlciBub3RpZmljYXRpb24gKCIgKyBJTm9kZU5vdGlmaWVyLkVWRU5UX1RZUEVfU1RSSU5HU1tldmVudFR5cGVdICsgIiApIiwgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeURlZmVycmVkKCkgewotCQlpZiAodGhpcy5ldmVudHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMuZmx1c2hpbmcpCi0JCQlyZXR1cm47Ci0JCXRoaXMuZmx1c2hpbmcgPSB0cnVlOyAvLyBmb3JjZSBub3RpZmljYXRpb24KLQkJaW50IGNvdW50ID0gdGhpcy5ldmVudHMuc2l6ZSgpOwotCQlpZiAoIWRvaW5nTmV3TW9kZWwgJiYgZk9wdGltaXplRGVmZXJyZWQpIHsKLQkJCU1hcCB2YWx1ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJTm90aWZ5RXZlbnQgZXZlbnQgPSAoTm90aWZ5RXZlbnQpIHRoaXMuZXZlbnRzLmVsZW1lbnRBdChpKTsKLQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCQkJY29udGludWU7IC8vIGVycm9yCi0JCQkJZXZlbnQuaW5kZXggPSBpOwotCQkJCWlmKGV2ZW50LnR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUpIHsKLQkJCQkJYWRkVG9NYXAoZXZlbnQub2xkVmFsdWUsIGV2ZW50LCB2YWx1ZXMpOwotCQkJCX0KLQkJCQlpZihldmVudC50eXBlID09IElOb2RlTm90aWZpZXIuQUREKSB7Ci0JCQkJCWFkZFRvTWFwKGV2ZW50Lm5ld1ZhbHVlLCBldmVudCwgdmFsdWVzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlJdGVyYXRvciBpdCA9IHZhbHVlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IHZhbHVlID0gaXQubmV4dCgpOwotCQkJCU5vdGlmeUV2ZW50W10gZXMgPSAoTm90aWZ5RXZlbnRbXSl2YWx1ZXMuZ2V0KHZhbHVlKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVzLmxlbmd0aCAtIDE7IGkrKykgewotCQkJCQlOb3RpZnlFdmVudCBldmVudCA9IGVzW2ldOwotCQkJCQlpZihlc1tpXS5kaXNjYXJkZWQpIGNvbnRpbnVlOwotCQkJCQlOb3RpZnlFdmVudCBuZXh0ID0gZXNbaSArIDFdOwotCQkJCQlpZihlc1tpXS50eXBlID09IElOb2RlTm90aWZpZXIuQUREICYmIG5leHQudHlwZSA9PSBJTm9kZU5vdGlmaWVyLlJFTU9WRSkgewotCQkJCQkJLy8gQWRkZWQgdGhlbiByZW1vdmVkIGxhdGVyLCBkaXNjYXJkIGJvdGgKLQkJCQkJCWV2ZW50LmRpc2NhcmRlZCA9IHRydWU7Ci0JCQkJCQluZXh0LmRpc2NhcmRlZCA9IHRydWU7Ci0JCQkJCQlpZiAoRGVidWcuZGVidWdOb3RpZnlEZWZlcnJlZCkgewotCQkJCQkJCWV2ZW50LnJlYXNvbiA9IGV2ZW50LnJlYXNvbiArIEFEREVEX1RIRU5fUkVNT1ZFRCArICIoc2VlICIgKyBuZXh0LmluZGV4ICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQluZXh0LnJlYXNvbiA9IG5leHQucmVhc29uICsgQURERURfVEhFTl9SRU1PVkVEICsgIihzZWUgIiArIGV2ZW50LmluZGV4ICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCU5vdGlmeUV2ZW50IGV2ZW50ID0gKE5vdGlmeUV2ZW50KSB0aGlzLmV2ZW50cy5lbGVtZW50QXQoaSk7Ci0JCQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOyAvLyBlcnJvcgotCQkJCWlmKGV2ZW50LmRpc2NhcmRlZCkgY29udGludWU7Ci0JCQkJaWYgKGV2ZW50Lm5vdGlmaWVyICE9IG51bGwgJiYgZk9wdGltaXplRGVmZXJyZWRBY2NvcmRpbmdUb1BhcmVudEFkZGVkKSB7Ci0JCQkJCWlmIChldmVudC50eXBlID09IElOb2RlTm90aWZpZXIuQUREKSB7Ci0JCQkJCQlOb3RpZnlFdmVudFtdIGVzID0gKE5vdGlmeUV2ZW50W10pdmFsdWVzLmdldChldmVudC5ub3RpZmllcik7Ci0JCQkJCQlpZihlcyAhPSBudWxsKSBmb3IgKGludCBwID0gMDsgcCA8IGVzLmxlbmd0aCAmJiBlc1twXS5pbmRleCA8IGV2ZW50LmluZGV4OyBwKyspIHsKLQkJCQkJCQlOb3RpZnlFdmVudCBwcmV2ID0gZXNbcF07Ci0JCQkJCQkJaWYgKHByZXYudHlwZSA9PSBJTm9kZU5vdGlmaWVyLlJFTU9WRSAmJiBwcmV2Lm9sZFZhbHVlID09IGV2ZW50Lm5vdGlmaWVyKSB7Ci0JCQkJCQkJCS8vIHBhcmVudCBpcyByZXBhcmVudGVkLCBkbyBub3QgZGlzY2FyZAotCQkJCQkJCQlpZiAoRGVidWcuZGVidWdOb3RpZnlEZWZlcnJlZCkgewotCQkJCQkJCQkJZXZlbnQucmVhc29uID0gZXZlbnQucmVhc29uICsgUEFSRU5UX0lTX1JFUEFSRU5URUQgKyAiKHNlZSAiICsgcHJldi5pbmRleCArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCX0KLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfSBlbHNlIGlmIChwcmV2LnR5cGUgPT0gSU5vZGVOb3RpZmllci5BREQgJiYgcHJldi5uZXdWYWx1ZSA9PSBldmVudC5ub3RpZmllcikgewotCQkJCQkJCQkvLyBwYXJlbnQgaGFzIGJlZW4gYWRkZWQsIGRpc2NhcmQgdGhpcwotCQkJCQkJCQlldmVudC5kaXNjYXJkZWQgPSB0cnVlOwotCQkJCQkJCQlpZiAoRGVidWcuZGVidWdOb3RpZnlEZWZlcnJlZCkgewotCQkJCQkJCQkJZXZlbnQucmVhc29uID0gZXZlbnQucmVhc29uICsgUEFSRU5UX0lTX0FEREVEICsgIihzZWUgIiArIHByZXYuaW5kZXggKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0JCQkJCQkJCi0JCQkJCX0JCQkJCQkKLQkJCQl9Ci0JCQkJaWYoZXZlbnQuZGlzY2FyZGVkKSBjb250aW51ZTsKLQkJCQlpZiAoZXZlbnQubm90aWZpZXIgIT0gbnVsbCAmJiBmT3B0aW1pemVEZWZlcnJlZEFjY29yZGluZ1RvUGFyZW50UmVtb3ZlZCkgewotCQkJCQlpZiAoZXZlbnQudHlwZSA9PSBJTm9kZU5vdGlmaWVyLlJFTU9WRSkgewotCQkJCQkJTm90aWZ5RXZlbnRbXSBlcyA9IChOb3RpZnlFdmVudFtdKXZhbHVlcy5nZXQoZXZlbnQubm90aWZpZXIpOwotCQkJCQkJaWYoZXMgIT0gbnVsbCkgZm9yIChpbnQgbiA9IDA7IG4gPCBlcy5sZW5ndGg7IG4rKykgewotCQkJCQkJCU5vdGlmeUV2ZW50IG5leHQgPSBlc1tuXTsKLQkJCQkJCQlpZihuZXh0LmluZGV4ID4gZXZlbnQuaW5kZXggJiYgbmV4dC50eXBlID09IElOb2RlTm90aWZpZXIuUkVNT1ZFKSB7Ci0JCQkJCQkJCWlmIChuZXh0Lm9sZFZhbHVlID09IGV2ZW50Lm5vdGlmaWVyKSB7Ci0JCQkJCQkJCQkvLyBwYXJlbnQgd2lsbCBiZSByZW1vdmVkLCBkaXNjYXJkIHRoaXMKLQkJCQkJCQkJCWV2ZW50LmRpc2NhcmRlZCA9IHRydWU7Ci0JCQkJCQkJCQlpZiAoRGVidWcuZGVidWdOb3RpZnlEZWZlcnJlZCkgewotCQkJCQkJCQkJCWV2ZW50LnJlYXNvbiA9IGV2ZW50LnJlYXNvbiArIFBBUkVOVF9JU19SRU1PVkVEX1RPTyArICIoc2VlICIgKyBuZXh0LmluZGV4ICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9CQkJCQkJCi0JCQkJfQotCQkJCWlmKGV2ZW50LmRpc2NhcmRlZCkgY29udGludWU7Ci0JCQl9Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlOb3RpZnlFdmVudCBldmVudCA9IChOb3RpZnlFdmVudCkgdGhpcy5ldmVudHMuZWxlbWVudEF0KGkpOwotCQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQkJY29udGludWU7IC8vIGVycm9yCi0JCQlpZihldmVudC5kaXNjYXJkZWQpIGNvbnRpbnVlOwotCQkJbm90aWZ5KGV2ZW50Lm5vdGlmaWVyLCBldmVudC50eXBlLCBldmVudC5jaGFuZ2VkRmVhdHVyZSwgZXZlbnQub2xkVmFsdWUsIGV2ZW50Lm5ld1ZhbHVlLCBldmVudC5wb3MpOwotCQl9Ci0JCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmeURlZmVycmVkKSB7Ci0JCQlmb3IgKGludCBsID0gMDsgbCA8IGNvdW50OyBsKyspIHsKLQkJCQlOb3RpZnlFdmVudCBldmVudCA9IChOb3RpZnlFdmVudCkgdGhpcy5ldmVudHMuZWxlbWVudEF0KGwpOwotCQkJCU9iamVjdCBvID0gbnVsbDsKLQkJCQlTdHJpbmcgdCA9IG51bGw7Ci0JCQkJaWYgKGV2ZW50LnR5cGUgPT0gSU5vZGVOb3RpZmllci5BREQpIHsKLQkJCQkJbyA9IGV2ZW50Lm5ld1ZhbHVlOwotCQkJCQl0ID0gIiArICI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUpIHsKLQkJCQkJbyA9IGV2ZW50Lm9sZFZhbHVlOwotCQkJCQl0ID0gIiAtICI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJCVN0cmluZyBwID0gKChOb2RlKSBldmVudC5ub3RpZmllcikuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJU3RyaW5nIGMgPSAoKE5vZGUpIG8pLmdldE5vZGVOYW1lKCk7Ci0JCQkJCVN0cmluZyBkID0gKGV2ZW50LmRpc2NhcmRlZCA/ICIhICIgOiAiICAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihkICsgcCArIHQgKyBjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhpcy5mbHVzaGluZyA9IGZhbHNlOwotCQl0aGlzLmV2ZW50cyA9IG51bGw7Ci0JfQotCi0Jdm9pZCBhZGRUb01hcChPYmplY3QgbywgTm90aWZ5RXZlbnQgZXZlbnQsIE1hcCBtYXApIHsKLQkJaWYobyA9PSBudWxsKSByZXR1cm47Ci0JCU9iamVjdCB4ID0gbWFwLmdldChvKTsKLQkJaWYoeCA9PSBudWxsKSB7Ci0JCQltYXAucHV0KG8sIG5ldyBOb3RpZnlFdmVudFtde2V2ZW50fSk7Ci0JCX0gZWxzZSB7Ci0JCQlOb3RpZnlFdmVudFtdIGVzID0gKE5vdGlmeUV2ZW50W10peDsKLQkJCU5vdGlmeUV2ZW50W10gZXMyID0gbmV3IE5vdGlmeUV2ZW50W2VzLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShlcywgMCwgZXMyLCAwLCBlcy5sZW5ndGgpOwotCQkJZXMyW2VzLmxlbmd0aF0gPSBldmVudDsKLQkJCW1hcC5wdXQobywgZXMyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBub3RpZnlTdHJ1Y3R1cmVDaGFuZ2VkKE5vZGUgcm9vdCkgewotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIHJvb3Q7Ci0JCXRyeSB7Ci0JCQkvLyBJdHMgaW1wb3J0YW50IHRvICJrZWVwIGdvaW5nIiBpZiBleGNlcHRpb24gb2NjdXJzLCBzaW5jZSB0aGlzCi0JCQkvLyBub3RpZmljYXRpb24KLQkJCS8vIGNvbWVzIGluIGJldHdlZW4gImFib3V0IHRvIGNoYW5nZSIgYW5kICJjaGFuZ2VkIiBldmVudHMuIFdlIGRvCi0JCQkvLyBsb2csIGhvd2V2ZXIsCi0JCQkvLyBzaW5jZSB3b3VsZCBpbmRpY2F0ZSBhIHByb2dyYW0gZXJyb3IuCi0JCQlub3RpZmllci5ub3RpZnkoSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCwgbnVsbCwgbnVsbCwgbnVsbCwgLTEpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQSBzdHJ1Y3R1cmVkIG1vZGVsIGNsaWVudCB0aHJldyBmb2xsb3dpbmcgZXhjZXB0aW9uIGR1cmluZyBhZGFwdGVyIG5vdGlmaWNhdGlvbiAoIiArIElOb2RlTm90aWZpZXIuRVZFTlRfVFlQRV9TVFJJTkdTW0lOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRURdICsgIiApIiwgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoTm9kZSBub2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0Q29tbW9uUm9vdElmTmVlZGVkKE5vZGUgbm9kZSkgewotCQkvLyBkZWZlciBub3RpZmljYXRpb24KLQkJaWYgKHRoaXMuY2hhbmdlZFJvb3QgPT0gbnVsbCkgewotCQkJdGhpcy5jaGFuZ2VkUm9vdCA9IG5vZGU7Ci0JCX0gZWxzZSB7Ci0JCQkvLyB0aW55IG9wdGltaXphdGlvbjogaWYgcHJldmlvdXMgY29tbW9uQW5jZXN0b3IgKGNoYW5nZWRSb290KSBpcwotCQkJLy8gYWxyZWFkeSAnZG9jdW1lbnQnLAotCQkJLy8gb3IgaWYgYWxyZWFkeSBlcXVhbCB0byB0aGlzICdub2RlJywKLQkJCS8vIHRoZW4gbm8gbmVlZCB0byByZS1jYWxjdWxhdGUKLQkJCWlmIChjaGFuZ2VkUm9vdC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSAmJiBjaGFuZ2VkUm9vdCAhPSBub2RlKSB7Ci0JCQkJTm9kZSBjb21tb24gPSAoKE5vZGVJbXBsKSB0aGlzLmNoYW5nZWRSb290KS5nZXRDb21tb25BbmNlc3Rvcihub2RlKTsKLQkJCQlpZiAoY29tbW9uICE9IG51bGwpCi0JCQkJCXRoaXMuY2hhbmdlZFJvb3QgPSBjb21tb247Ci0JCQkJZWxzZQotCQkJCQl0aGlzLmNoYW5nZWRSb290ID0gbm9kZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0VGFnQ2hhbmdlZChFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSURPTU5vZGUgbm90aWZpZXIgPSAoSURPTU5vZGUpIGVsZW1lbnQ7Ci0JCWludCBvZmZzZXQgPSBub3RpZmllci5nZXRTdGFydE9mZnNldCgpOwotCQlub3RpZnkobm90aWZpZXIsIElOb2RlTm90aWZpZXIuQ0hBTkdFLCBudWxsLCBudWxsLCBudWxsLCBvZmZzZXQpOwotCQlwcm9wZXJ0eUNoYW5nZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc3RydWN0dXJlQ2hhbmdlZChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGlzQ2hhbmdpbmcoKSkgewotCQkJc2V0Q29tbW9uUm9vdElmTmVlZGVkKG5vZGUpOwotCQkJaWYgKERlYnVnLmRlYnVnTm90aWZ5RGVmZXJyZWQpIHsKLQkJCQlTdHJpbmcgcCA9IHRoaXMuY2hhbmdlZFJvb3QuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlcXVlc3RlZCBTVFJVQ1VUUkVfQ0hBTkdFRDogIiArIHApOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKERlYnVnLmRlYnVnTm90aWZ5RGVmZXJyZWQpIHsKLQkJCVN0cmluZyBwID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTVFJVQ1VUUkVfQ0hBTkdFRDogIiArIHApOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJbm90aWZ5U3RydWN0dXJlQ2hhbmdlZChub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiB2YWx1ZUNoYW5nZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01Ob2RlIG5vdGlmaWVyID0gbnVsbDsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQlBdHRyIGF0dHIgPSAoQXR0cikgbm9kZTsKLQkJCW5vdGlmaWVyID0gKElET01Ob2RlKSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotCQkJLy8gVE9ET19kbXc6IGV4cGVyaW1lbnRhbDogY2hhbmdlZCAwNi8yOS8yMDA0IHRvIHNlbmQgInN0cnVjdXR1cmUKLQkJCS8vIGNoYW5nZWQiIGV2ZW4gZm9yIGF0dHJpYnV0ZSB2YWx1ZSBjaGFuZ2VzCi0JCQkvLyB0aGVyZSBhcmUgcHJvcyBhbmQgY29ucyB0byBjb25zaWRlcmluZyBhdHRyaWJ1dGUgdmFsdWUKLQkJCS8vICJzdHJ1Y3R1cmUgY2hhbmdlZCIuIFdpbGwgKHJlKWNvbnNpZGVyCi0JCQkvLyBzZXRDb21tb25Sb290SWZOZWVkZWQobm90aWZpZXIpOwotCQkJaWYgKG5vdGlmaWVyID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJU3RyaW5nIHZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOwotCQkJaW50IG9mZnNldCA9IG5vdGlmaWVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlub3RpZnkobm90aWZpZXIsIElOb2RlTm90aWZpZXIuQ0hBTkdFLCBhdHRyLCBudWxsLCB2YWx1ZSwgb2Zmc2V0KTsKLQkJfSBlbHNlIHsKLQkJCS8vIG5vdGU6IHdlIGRvIG5vdCBzZW5kIHN0cnVjdHVyZWQgY2hhbmdlZCBldmVudCBmb3IgY29udGVudAotCQkJLy8gY2hhbmdlZAotCQkJbm90aWZpZXIgPSAoSURPTU5vZGUpIG5vZGU7Ci0JCQlTdHJpbmcgdmFsdWUgPSBub2RlLmdldE5vZGVWYWx1ZSgpOwotCQkJaW50IG9mZnNldCA9IG5vdGlmaWVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlub3RpZnkobm90aWZpZXIsIElOb2RlTm90aWZpZXIuQ0hBTkdFLCBudWxsLCBudWxsLCB2YWx1ZSwgb2Zmc2V0KTsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlJRE9NTm9kZSBwYXJlbnQgPSAoSURPTU5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlub3RpZnkocGFyZW50LCBJTm9kZU5vdGlmaWVyLkNPTlRFTlRfQ0hBTkdFRCwgbm9kZSwgbnVsbCwgdmFsdWUsIG9mZnNldCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXByb3BlcnR5Q2hhbmdlZChub3RpZmllcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbFBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmQyNWY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaW1wbC5Db21tZW50RWxlbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmltcGwuQ29tbWVudEVsZW1lbnRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0vKioKLSAqIFhNTE1vZGVsUGFyc2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxNb2RlbFBhcnNlciB7Ci0JcHJpdmF0ZSBYTUxNb2RlbENvbnRleHQgY29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBET01Nb2RlbEltcGwgbW9kZWwgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFhNTE1vZGVsUGFyc2VyKERPTU1vZGVsSW1wbCBtb2RlbCkgewotCQlzdXBlcigpOwotCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5CZUltcGxpY2l0VGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlNb2RlbFBhcnNlckFkYXB0ZXIgYWRhcHRlciA9IGdldFBhcnNlckFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuY2FuQmVJbXBsaWNpdFRhZyhlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuQmVJbXBsaWNpdFRhZyhFbGVtZW50IGVsZW1lbnQsIE5vZGUgY2hpbGQpIHsKLQkJTW9kZWxQYXJzZXJBZGFwdGVyIGFkYXB0ZXIgPSBnZXRQYXJzZXJBZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBhZGFwdGVyLmNhbkJlSW1wbGljaXRUYWcoZWxlbWVudCwgY2hpbGQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5Db250YWluKEVsZW1lbnQgZWxlbWVudCwgTm9kZSBjaGlsZCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUVsZW1lbnRJbXBsIGltcGwgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0JCWlmIChpbXBsLmlzRW5kVGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7IC8vIGludmFsaWQgKGZsb2F0aW5nKSBlbmQgdGFnCi0JCWlmICghaW1wbC5pc0NvbnRhaW5lcigpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkgewotCQkJaWYgKGltcGwuaXNKU1BDb250YWluZXIoKSB8fCBpbXBsLmlzQ0RBVEFDb250YWluZXIoKSkgewotCQkJCS8vIGFjY2VwdHMgb25seSBUZXh0IGNoaWxkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCU1vZGVsUGFyc2VyQWRhcHRlciBhZGFwdGVyID0gZ2V0UGFyc2VyQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5jYW5Db250YWluKGVsZW1lbnQsIGNoaWxkKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlQXR0ckVxdWFsKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpbnQgb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJaWYgKG9mZnNldCA8IDApCi0JCQlyZXR1cm47Ci0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMuY29udGV4dC5nZXRSb290Tm9kZSgpOwotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIG5vZGUgPSByb290LmdldE5vZGVBdChvZmZzZXQpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSB7Ci0JCQkJLy8ganVzdCBub3RpZnkgdGhlIGNoYW5nZSBpbnN0ZWFkIG9mIHNldHRpbmcgZGF0YQotCQkJCVByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgcGkgPSAoUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCkgbm9kZTsKLQkJCQlwaS5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkvLyBhY3R1YWxseSwgZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIGNoYW5nZUF0dHJOYW1lIG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VBdHRyTmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOwotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBub2RlID0gcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkgewotCQkJCS8vIGp1c3Qgbm90aWZ5IHRoZSBjaGFuZ2UgaW5zdGVhZCBvZiBzZXR0aW5nIGRhdGEKLQkJCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIHBpID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwpIG5vZGU7Ci0JCQkJcGkubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChhdHRyLmdldE5hbWVSZWdpb24oKSAhPSByZWdpb24pCi0JCQkJY29udGludWU7Ci0KLQkJCVN0cmluZyBuYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJYXR0ci5zZXROYW1lKG5hbWUpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjaGFuZ2VBdHRyVmFsdWUgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZUF0dHJWYWx1ZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOwotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBub2RlID0gcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkgewotCQkJCS8vIGp1c3Qgbm90aWZ5IHRoZSBjaGFuZ2UgaW5zdGVhZCBvZiBzZXR0aW5nIGRhdGEKLQkJCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIHBpID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwpIG5vZGU7Ci0JCQkJcGkubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChhdHRyLmdldFZhbHVlUmVnaW9uKCkgIT0gcmVnaW9uKQotCQkJCWNvbnRpbnVlOwotCQkJLy8ganVzdCBub3RpZnkgdGhlIGNoYW5nZSBpbnN0ZWFkIG9mIHNldHRpbmcgdmFsdWUKLQkJCWF0dHIubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNoYW5nZURhdGEgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZURhdGEoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWludCBvZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybjsKLQkJTm9kZUltcGwgcm9vdCA9IChOb2RlSW1wbCkgdGhpcy5jb250ZXh0LmdldFJvb3ROb2RlKCk7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgbm9kZSA9IHJvb3QuZ2V0Tm9kZUF0KG9mZnNldCk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG5vZGU7Ci0JCQkJaWYgKHRleHQuaXNTaGFyaW5nU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKSkgewotCQkJCQkvLyBoYXMgY29uc2VjdXRpdmUgdGV4dCBzaGFyaW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobm9kZSk7Ci0JCQkJY2xlYW51cFRleHQoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCS8vIGNvbW1lbnQgdGFnCi0JCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQlyZXR1cm47Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBqdXN0IG5vdGlmeSB0aGUgY2hhbmdlIGluc3RlYWQgb2Ygc2V0dGluZyBkYXRhCi0JCU5vZGVJbXBsIGltcGwgPSAoTm9kZUltcGwpIG5vZGU7Ci0JCWltcGwubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZUVuZFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucywgSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMpIHsKLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZSBub2RlID0gcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgY2hhbmdlIGlzIG9ubHkgZm9yIGNsb3NlIHRhZwotCQlpZiAobmV3UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlID0gbmV3UmVnaW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKQotCQkJCQljb250aW51ZTsKLQotCQkJCS8vIG90aGVyIHJlZ2lvbiBoYXMgY2hhbmdlZAotCQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWlmIChvbGRSZWdpb25zICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGUgPSBvbGRSZWdpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJLy8gb3RoZXIgcmVnaW9uIGhhcyBjaGFuZ2VkCi0JCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGFuZ2UgZm9yIGNsb3NlIHRhZyBoYXMgbm8gaW1wYWN0Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBjaGFuZ2VSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0Jdm9pZCBjaGFuZ2VSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsIHx8IHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRoaXMuY29udGV4dCA9IG5ldyBYTUxNb2RlbENvbnRleHQodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpKTsKLQotCQkvLyBvcHRpbWl6ZSB0eXBpY2FsIGNhc2VzCi0JCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQgfHwgaXNOZXN0ZWRDb250ZW50KHJlZ2lvblR5cGUpKSB7Ci0JCQljaGFuZ2VEYXRhKGZsYXROb2RlLCByZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQljaGFuZ2VBdHRyTmFtZShmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWNoYW5nZUF0dHJWYWx1ZShmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQljaGFuZ2VBdHRyRXF1YWwoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCBpc05lc3RlZFRhZ05hbWUocmVnaW9uVHlwZSkpIHsKLQkJCWNoYW5nZVRhZ05hbWUoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQl9Ci0JfQotCi0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VTdGFydFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucywgSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMpIHsKLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZSBub2RlID0gcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0KLQkJLy8gY2hlY2sgaWYgY2hhbmdlcyBhcmUgb25seSBmb3IgYXR0cmlidXRlcyBhbmQgY2xvc2UgdGFnCi0JCWJvb2xlYW4gdGFnTmFtZVVuY2hhbmdlZCA9IGZhbHNlOwotCQlpZiAobmV3UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlID0gbmV3UmVnaW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCQkJLy8gY2hhbmdlIGZyb20gZW1wdHkgdGFnIG1heSBoYXZlIGltcGFjdCBvbiBzdHJ1Y3R1cmUKLQkJCQkJaWYgKCFlbGVtZW50LmlzRW1wdHlUYWcoKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IGlzTmVzdGVkVGFnTmFtZShyZWdpb25UeXBlKSkgewotCQkJCQlTdHJpbmcgb2xkVGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJCQlTdHJpbmcgbmV3VGFnTmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJCQkJaWYgKG9sZFRhZ05hbWUgIT0gbnVsbCAmJiBuZXdUYWdOYW1lICE9IG51bGwgJiYgb2xkVGFnTmFtZS5lcXVhbHMobmV3VGFnTmFtZSkpIHsKLQkJCQkJCS8vIHRoZSB0YWcgbmFtZSBpcyB1bmNoYW5nZWQKLQkJCQkJCXRhZ05hbWVVbmNoYW5nZWQgPSB0cnVlOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBvdGhlciByZWdpb24gaGFzIGNoYW5nZWQKLQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlpZiAob2xkUmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlID0gb2xkUmVnaW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCQkJLy8gY2hhbmdlIGZyb20gZW1wdHkgdGFnIG1heSBoYXZlIGltcGFjdCBvbiBzdHJ1Y3R1cmUKLQkJCQkJaWYgKCFlbGVtZW50LmlzRW1wdHlUYWcoKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IGlzTmVzdGVkVGFnTmFtZShyZWdpb25UeXBlKSkgewotCQkJCQkvLyBpZiBuZXcgdGFnIG5hbWUgaXMgdW5jaGFuZ2VkLCBpdCdzIE9LCi0JCQkJCWlmICh0YWdOYW1lVW5jaGFuZ2VkKQotCQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJLy8gb3RoZXIgcmVnaW9uIGhhcyBjaGFuZ2VkCi0JCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyB1cGRhdGUgYXR0cmlidXRlcwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQkvLyBmaXJzdCByZW1vdmUgYXR0cmlidXRlcwotCQlpbnQgcmVnaW9uSW5kZXggPSAwOwotCQlpbnQgYXR0ckluZGV4ID0gMDsKLQkJQXR0ckltcGwgYXR0ciA9IG51bGw7Ci0JCXdoaWxlIChhdHRySW5kZXggPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpKSB7Ci0JCQlhdHRyID0gKEF0dHJJbXBsKSBhdHRyaWJ1dGVzLml0ZW0oYXR0ckluZGV4KTsKLQkJCWlmIChhdHRyID09IG51bGwpIHsgLy8gZXJyb3IKLQkJCQlhdHRySW5kZXgrKzsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBhdHRyLmdldE5hbWVSZWdpb24oKTsKLQkJCWlmIChuYW1lUmVnaW9uID09IG51bGwpIHsgLy8gZXJyb3IKLQkJCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gcmVnaW9uSW5kZXg7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJaWYgKHJlZ2lvbiA9PSBuYW1lUmVnaW9uKSB7Ci0JCQkJCXJlZ2lvbkluZGV4ID0gaSArIDE7IC8vIG5leHQgcmVnaW9uCi0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZvdW5kKSB7Ci0JCQkJYXR0ckluZGV4Kys7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpbnNlcnQgb3IgdXBkYXRlIGF0dHJpYnV0ZXMKLQkJYXR0ckluZGV4ID0gMDsgLy8gcmVzZXQgdG8gZmlyc3QKLQkJQXR0ckltcGwgbmV3QXR0ciA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIG9sZFZhbHVlUmVnaW9uID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJaWYgKG5ld0F0dHIgIT0gbnVsbCkgewotCQkJCQkvLyBpbnNlcnQgZGVmZXJyZWQgbmV3IGF0dHJpYnV0ZQotCQkJCQllbGVtZW50Lmluc2VydEF0dHJpYnV0ZU5vZGUobmV3QXR0ciwgYXR0ckluZGV4KyspOwotCQkJCQluZXdBdHRyID0gbnVsbDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoYXR0ciAhPSBudWxsICYmIG9sZFZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJLy8gbm90aWZ5IGV4aXN0aW5nIGF0dHJpYnV0ZSB2YWx1ZSByZW1vdmFsCi0JCQkJCWF0dHIubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQkJfQotCi0JCQkJb2xkVmFsdWVSZWdpb24gPSBudWxsOwotCQkJCWF0dHIgPSAoQXR0ckltcGwpIGF0dHJpYnV0ZXMuaXRlbShhdHRySW5kZXgpOwotCQkJCWlmIChhdHRyICE9IG51bGwgJiYgYXR0ci5nZXROYW1lUmVnaW9uKCkgPT0gcmVnaW9uKSB7Ci0JCQkJCS8vIGV4aXN0aW5nIGF0dHJpYnV0ZQotCQkJCQlhdHRySW5kZXgrKzsKLQkJCQkJLy8gY2xlYXIgb3RoZXIgcmVnaW9ucwotCQkJCQlvbGRWYWx1ZVJlZ2lvbiA9IGF0dHIuZ2V0VmFsdWVSZWdpb24oKTsKLQkJCQkJYXR0ci5zZXRFcXVhbFJlZ2lvbihudWxsKTsKLQkJCQkJYXR0ci5zZXRWYWx1ZVJlZ2lvbihudWxsKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJCQlhdHRyID0gKEF0dHJJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlQXR0cmlidXRlKG5hbWUpOwotCQkJCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJCQkJYXR0ci5zZXROYW1lUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCS8vIGRlZmVyIGluc2VydGlvbiBvZiBuZXcgYXR0cmlidXRlCi0JCQkJCW5ld0F0dHIgPSBhdHRyOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0RXF1YWxSZWdpb24ocmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0VmFsdWVSZWdpb24ocmVnaW9uKTsKLQkJCQkJaWYgKGF0dHIgIT0gbmV3QXR0ciAmJiBvbGRWYWx1ZVJlZ2lvbiAhPSByZWdpb24pIHsKLQkJCQkJCS8vIG5vdGlmeSBleGlzdGluZyBhdHRyaWJ1dGUgdmFsdWUgY2hhbmdlZAotCQkJCQkJYXR0ci5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCQkJfQotCQkJCQlvbGRWYWx1ZVJlZ2lvbiA9IG51bGw7Ci0JCQkJCWF0dHIgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChuZXdBdHRyICE9IG51bGwpIHsKLQkJCS8vIGluc2VydCBkZWZlcnJlZCBuZXcgYXR0cmlidXRlCi0JCQllbGVtZW50LmFwcGVuZEF0dHJpYnV0ZU5vZGUobmV3QXR0cik7Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ciAhPSBudWxsICYmIG9sZFZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIG5vdGlmeSBleGlzdGluZyBhdHRyaWJ1dGUgdmFsdWUgcmVtb3ZhbAotCQkJYXR0ci5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLm1vZGVsLmdldERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlzZXR1cENvbnRleHQoZmxhdE5vZGUpOwotCi0JCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGUgcGFyZW50IGlzIHNldCB0byBkZWVwZXN0IGxldmVsCi0JCS8vIHdoZW4gZW5kIHRhZyBoYXMgYmVlbiByZW1vdmVkCi0JCXRoaXMuY29udGV4dC5zZXRMYXN0KCk7Ci0JCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0KLQkJY2xlYW51cFRleHQoKTsKLQkJY2xlYW51cEVuZFRhZygpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VUYWdOYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpbnQgb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJaWYgKG9mZnNldCA8IDApCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMuY29udGV4dC5nZXRSb290Tm9kZSgpOwotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlIG5vZGUgPSByb290LmdldE5vZGVBdChvZmZzZXQpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQlTdHJpbmcgbmV3VGFnTmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJaWYgKG5ld1RhZ05hbWUgPT0gbnVsbCB8fCAhZWxlbWVudC5tYXRjaFRhZ05hbWUobmV3VGFnTmFtZSkpIHsKLQkJCS8vIHRoZSB0YWcgbmFtZSBpcyBjaGFuZ2VkCi0JCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gdGhlIHRhZyBuYW1lIGlzIHVuY2hhbmdlZAotCQkvLyB0aGlzIGhhcHBlbnMgd2hlbiB0eXBpbmcgc3BhY2VzIGFmdGVyIHRoZSB0YWcgbmFtZQotCQkvLyBkbyBub3RoaW5nLCBidXQuLi4KLQkJLy8gaWYgaXQncyBub3QgYSBjaGFuZ2UgaW4gdGhlIGVuZCB0YWcgb2YgYW4gZWxlbWVudCB3aXRoIHRoZSBzdGFydAotCQkvLyB0YWcsCi0JCS8vIGFuZCBjYXNlIGhhcyBiZWVuIGNoYW5nZWQsIHNldCB0byBlbGVtZW50IGFuZCBub3RpZnkKLQkJaWYgKCFlbGVtZW50Lmhhc1N0YXJ0VGFnKCkgfHwgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRGaXJzdFJlZ2lvblR5cGUoZmxhdE5vZGUpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCWlmICh0YWdOYW1lID09IG51bGwgfHwgIXRhZ05hbWUuZXF1YWxzKG5ld1RhZ05hbWUpKSB7Ci0JCQkJZWxlbWVudC5zZXRUYWdOYW1lKG5ld1RhZ05hbWUpOwotCQkJCWVsZW1lbnQubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbGVhbnVwQ29udGV4dCBtZXRob2QKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYW51cEVuZFRhZygpIHsKLQkJTm9kZSBwYXJlbnQgPSB0aGlzLmNvbnRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlOb2RlIG5leHQgPSB0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQl3aGlsZSAobmV4dCAhPSBudWxsKSB7Ci0JCQkJaWYgKG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXh0OwotCQkJCQlpZiAoZWxlbWVudC5pc0VuZFRhZygpKSB7Ci0JCQkJCQkvLyBmbG9hdGluZyBlbmQgdGFnCi0JCQkJCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJCQkJU3RyaW5nIHJvb3ROYW1lID0gZ2V0RmluZFJvb3ROYW1lKHRhZ05hbWUpOwotCQkJCQkJRWxlbWVudEltcGwgc3RhcnQgPSAoRWxlbWVudEltcGwpIHRoaXMuY29udGV4dC5maW5kU3RhcnRUYWcodGFnTmFtZSwgcm9vdE5hbWUpOwotCQkJCQkJaWYgKHN0YXJ0ICE9IG51bGwpIHsKLQkJCQkJCQlpbnNlcnRFbmRUYWcoc3RhcnQpOwotCQkJCQkJCS8vIG1vdmUgdGhlIGVuZCB0YWcgZnJvbSAnZWxlbWVudCcgdG8gJ3N0YXJ0JwotCQkJCQkJCXN0YXJ0LmFkZEVuZFRhZyhlbGVtZW50KTsKLQkJCQkJCQlyZW1vdmVOb2RlKGVsZW1lbnQpOwotCQkJCQkJCXBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQkJbmV4dCA9IHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJTm9kZSBmaXJzdCA9IG5leHQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChmaXJzdCAhPSBudWxsKSB7Ci0JCQkJCXBhcmVudCA9IG5leHQ7Ci0JCQkJCW5leHQgPSBmaXJzdDsKLQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQkJCWlmICghZWxlbWVudC5oYXNFbmRUYWcoKSAmJiBlbGVtZW50Lmhhc1N0YXJ0VGFnKCkgJiYgZWxlbWVudC5nZXROZXh0U2libGluZygpID09IG51bGwpIHsKLQkJCQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCQkJRWxlbWVudEltcGwgZW5kID0gKEVsZW1lbnRJbXBsKSB0aGlzLmNvbnRleHQuZmluZEVuZFRhZyh0YWdOYW1lKTsKLQkJCQkJaWYgKGVuZCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBtb3ZlIHRoZSBlbmQgdGFnIGZyb20gJ2VuZCcgdG8gJ2VsZW1lbnQnCi0JCQkJCQllbGVtZW50LmFkZEVuZFRhZyhlbmQpOwotCQkJCQkJcmVtb3ZlRW5kVGFnKGVuZCk7Ci0JCQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShwYXJlbnQpOyAvLyByZXNldCBjb250ZXh0Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJbmV4dCA9IHBhcmVudC5nZXROZXh0U2libGluZygpOwotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFudXBUZXh0KCkgewotCQlOb2RlIHBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZSBuZXh0ID0gdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCU5vZGUgcHJldiA9IChuZXh0ID09IG51bGwgPyBwYXJlbnQuZ2V0TGFzdENoaWxkKCkgOiBuZXh0LmdldFByZXZpb3VzU2libGluZygpKTsKLQotCQlUZXh0SW1wbCBuZXh0VGV4dCA9IG51bGw7Ci0JCVRleHRJbXBsIHByZXZUZXh0ID0gbnVsbDsKLQkJaWYgKG5leHQgIT0gbnVsbCAmJiBuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCW5leHRUZXh0ID0gKFRleHRJbXBsKSBuZXh0OwotCQl9Ci0JCWlmIChwcmV2ICE9IG51bGwgJiYgcHJldi5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlwcmV2VGV4dCA9IChUZXh0SW1wbCkgcHJldjsKLQkJfQotCQlpZiAobmV4dFRleHQgPT0gbnVsbCAmJiBwcmV2VGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobmV4dFRleHQgIT0gbnVsbCAmJiBwcmV2VGV4dCAhPSBudWxsKSB7Ci0JCQkvLyBjb25zZWN1dGl2ZSBUZXh0IG5vZGVzIGNyZWF0ZWQgYnkgc2V0dXBDb250ZXh0KCksCi0JCQkvLyBjb25jYXQgdGhlbQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5leHRUZXh0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQkJcHJldlRleHQuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCU5vZGUgbmV3TmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCXBhcmVudC5yZW1vdmVDaGlsZChuZXh0KTsKLQkJCW5leHQgPSBudWxsOwotCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5ld05leHQpOwotCQl9Ci0KLQkJVGV4dEltcGwgY2hpbGRUZXh0ID0gKHByZXZUZXh0ICE9IG51bGwgPyBwcmV2VGV4dCA6IG5leHRUZXh0KTsKLQkJaWYgKGNoaWxkVGV4dC5nZXROZXh0U2libGluZygpID09IG51bGwgJiYgY2hpbGRUZXh0LmdldFByZXZpb3VzU2libGluZygpID09IG51bGwpIHsKLQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCQlpZiAoIXBhcmVudEVsZW1lbnQuaGFzU3RhcnRUYWcoKSAmJiAhcGFyZW50RWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQlpZiAoY2hpbGRUZXh0LmlzV2hpdGVzcGFjZSgpIHx8IGNoaWxkVGV4dC5pc0ludmFsaWQoKSkgewotCQkJCQkJLy8gaW1wbGljaXQgcGFyZW50IGlzIG5vdCByZXF1aXJlZAotCQkJCQkJTm9kZSBuZXdQYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKG5ld1BhcmVudCAhPSBudWxsKSB7Ci0JCQkJCQkJTm9kZSBuZXdOZXh0ID0gcGFyZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJbmV3UGFyZW50LnJlbW92ZUNoaWxkKHBhcmVudCk7Ci0JCQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkVGV4dCk7Ci0JCQkJCQkJbmV3UGFyZW50Lmluc2VydEJlZm9yZShjaGlsZFRleHQsIG5ld05leHQpOwotCQkJCQkJCWlmIChjaGlsZFRleHQgPT0gbmV4dCkgewotCQkJCQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoY2hpbGRUZXh0KTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAobmV3TmV4dCAhPSBudWxsKSB7Ci0JCQkJCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXdOZXh0KTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKG5ld1BhcmVudCk7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIHRyeSBhZ2FpbgotCQkJCQkJCWNsZWFudXBUZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJvdXRpbmUgY3JlYXRlIGFuIEVsZW1lbnQgZnJvbSBjb21tZW50IGRhdGEgZm9yIGNvbW1lbnQgc3R5bGUKLQkgKiBlbGVtZW50cywgc3VjaCBhcyBTU0kgYW5kIE1FVEFEQVRBCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlQ29tbWVudEVsZW1lbnQoU3RyaW5nIGRhdGEsIGJvb2xlYW4gaXNKU1BUYWcpIHsKLQkJU3RyaW5nIHRyaW1tZWREYXRhID0gZGF0YS50cmltKCk7Ci0JCUNvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSBDb21tZW50RWxlbWVudFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29uZmlndXJhdGlvbnMoKTsKLQkJZm9yIChpbnQgaUNvbmZpZyA9IDA7IGlDb25maWcgPCBjb25maWdzLmxlbmd0aDsgaUNvbmZpZysrKSB7Ci0JCQlDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29uZmlnc1tpQ29uZmlnXTsKLQkJCWlmICgoaXNKU1BUYWcgJiYgIWNvbmZpZy5hY2NlcHRKU1BDb21tZW50KCkpIHx8ICghaXNKU1BUYWcgJiYgIWNvbmZpZy5hY2NlcHRYTUxDb21tZW50KCkpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmdbXSBwcmVmaXhlcyA9IGNvbmZpZy5nZXRQcmVmaXgoKTsKLQkJCWZvciAoaW50IGlQcmVmaXggPSAwOyBpUHJlZml4IDwgcHJlZml4ZXMubGVuZ3RoOyBpUHJlZml4KyspIHsKLQkJCQlpZiAodHJpbW1lZERhdGEuc3RhcnRzV2l0aChwcmVmaXhlc1tpUHJlZml4XSkpIHsKLQkJCQkJcmV0dXJuIGNvbmZpZy5jcmVhdGVFbGVtZW50KHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKSwgZGF0YSwgaXNKU1BUYWcpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlNb2RlbFBhcnNlckFkYXB0ZXIgYWRhcHRlciA9IGdldFBhcnNlckFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuY3JlYXRlQ29tbWVudEVsZW1lbnQodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLCBkYXRhLCBpc0pTUFRhZyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByb3V0aW5lIGNyZWF0ZSBhbiBpbXBsaWNpdCBFbGVtZW50IGZvciBnaXZlbiBwYXJlbnQgYW5kIGNoaWxkLAotCSAqIHN1Y2ggYXMgSFRNTCwgQk9EWSwgSEVBRCwgYW5kIFRCT0RZIGZvciBIVE1MIGRvY3VtZW50LgotCSAqLwotCXByb3RlY3RlZCBFbGVtZW50IGNyZWF0ZUltcGxpY2l0RWxlbWVudChOb2RlIHBhcmVudCwgTm9kZSBjaGlsZCkgewotCQlNb2RlbFBhcnNlckFkYXB0ZXIgYWRhcHRlciA9IGdldFBhcnNlckFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuY3JlYXRlSW1wbGljaXRFbGVtZW50KHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKSwgcGFyZW50LCBjaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlbW90ZU5vZGVzKE5vZGUgcm9vdCwgTm9kZSBuZXdQYXJlbnQsIE5vZGUgb2xkUGFyZW50LCBOb2RlIG5leHQpIHsKLQkJaWYgKG5ld1BhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuOwotCQlFbGVtZW50SW1wbCBuZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0KLQkJLy8gZmluZCBuZXh0Ci0JCXdoaWxlIChuZXh0ID09IG51bGwpIHsKLQkJCWlmIChvbGRQYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlyZXR1cm47Ci0JCQlFbGVtZW50SW1wbCBvbGRFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBvbGRQYXJlbnQ7Ci0JCQlpZiAob2xkRWxlbWVudC5oYXNFbmRUYWcoKSkKLQkJCQlyZXR1cm47Ci0JCQlvbGRQYXJlbnQgPSBvbGRFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChvbGRQYXJlbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIGVycm9yCi0JCQluZXh0ID0gb2xkRWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQl9Ci0KLQkJd2hpbGUgKG5leHQgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCQlpZiAobmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudEltcGwgbmV4dEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5leHQ7Ci0JCQkJaWYgKCFuZXh0RWxlbWVudC5oYXNTdGFydFRhZygpKSB7Ci0JCQkJCU5vZGUgbmV4dENoaWxkID0gbmV4dEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCQlpZiAobmV4dENoaWxkICE9IG51bGwpIHsKLQkJCQkJCS8vIGRlbW90ZSBjaGlsZHJlbgotCQkJCQkJbmV4dCA9IG5leHRDaGlsZDsKLQkJCQkJCW9sZFBhcmVudCA9IG5leHRFbGVtZW50OwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlpZiAobmV4dEVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQkJCWlmIChuZXh0RWxlbWVudC5tYXRjaEVuZFRhZyhuZXdFbGVtZW50KSkgewotCQkJCQkJCS8vIHN0b3AgYXQgdGhlIG1hdGNoZWQgaW52YWxpZCBlbmQgdGFnCi0JCQkJCQkJbmV4dCA9IG5leHRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJb2xkUGFyZW50LnJlbW92ZUNoaWxkKG5leHRFbGVtZW50KTsKLQkJCQkJCQluZXdFbGVtZW50LmFkZEVuZFRhZyhuZXh0RWxlbWVudCk7Ci0KLQkJCQkJCQlpZiAobmV3RWxlbWVudCA9PSByb290KQotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJTm9kZSBwID0gbmV3RWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQkJLy8gY2hlY2sgaWYgcmVhY2hlZCB0byB0b3AKLQkJCQkJCQlpZiAocCA9PSBudWxsIHx8IHAgPT0gb2xkUGFyZW50IHx8IHAuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIHA7Ci0JCQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyByZW1vdmUgaW1wbGljaXQgZWxlbWVudAotCQkJCQkJbmV4dCA9IG5leHRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQlvbGRQYXJlbnQucmVtb3ZlQ2hpbGQobmV4dEVsZW1lbnQpOwotCQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghZG9uZSkgewotCQkJCWlmICghY2FuQ29udGFpbihuZXdFbGVtZW50LCBuZXh0KSkgewotCQkJCQlpZiAobmV3RWxlbWVudCA9PSByb290KQotCQkJCQkJcmV0dXJuOwotCQkJCQlOb2RlIHAgPSBuZXdFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJLy8gY2hlY2sgaWYgcmVhY2hlZCB0byB0b3AKLQkJCQkJaWYgKHAgPT0gbnVsbCB8fCBwID09IG9sZFBhcmVudCB8fCBwLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIHA7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCU5vZGUgY2hpbGQgPSBuZXh0OwotCQkJCW5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJb2xkUGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQlpbnNlcnROb2RlKG5ld0VsZW1lbnQsIGNoaWxkLCBudWxsKTsKLQkJCQlOb2RlIGNoaWxkUGFyZW50ID0gY2hpbGQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChjaGlsZFBhcmVudCAhPSBuZXdFbGVtZW50KSB7Ci0JCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIGNoaWxkUGFyZW50OwotCQkJCX0KLQkJCX0KLQotCQkJLy8gZmluZCBuZXh0IHBhcmVudCBhbmQgc2libGluZwotCQkJd2hpbGUgKG5leHQgPT0gbnVsbCkgewotCQkJCWlmIChvbGRQYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJcmV0dXJuOwotCQkJCUVsZW1lbnRJbXBsIG9sZEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG9sZFBhcmVudDsKLQotCQkJCS8vIGR1ZyBwYXJlbnQgbXVzdCBub3QgaGF2ZSBjaGlsZHJlbiBhdCB0aGlzIHBvaW50Ci0JCQkJaWYgKCFvbGRFbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSAmJiAhb2xkRWxlbWVudC5oYXNTdGFydFRhZygpKSB7Ci0JCQkJCW9sZFBhcmVudCA9IG9sZEVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQlpZiAob2xkUGFyZW50ID09IG51bGwpCi0JCQkJCQlyZXR1cm47IC8vIGVycm9yCi0JCQkJCW5leHQgPSBvbGRFbGVtZW50OwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlpZiAob2xkRWxlbWVudC5oYXNFbmRUYWcoKSkKLQkJCQkJcmV0dXJuOwotCQkJCW9sZFBhcmVudCA9IG9sZEVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChvbGRQYXJlbnQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOyAvLyBlcnJvcgotCQkJCW5leHQgPSBvbGRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE1vZGVsUGFyc2VyQWRhcHRlciBnZXRQYXJzZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gKE1vZGVsUGFyc2VyQWRhcHRlcikgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmdldEFkYXB0ZXJGb3IoTW9kZWxQYXJzZXJBZGFwdGVyLmNsYXNzKTsKLQl9Ci0JCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaW5kUm9vdE5hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJTW9kZWxQYXJzZXJBZGFwdGVyIGFkYXB0ZXIgPSBnZXRQYXJzZXJBZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldEZpbmRSb290TmFtZSh0YWdOYW1lKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSURPTU1vZGVsIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5tb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRDREFUQVNlY3Rpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydENEQVRBU2VjdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUNEQVRBU2VjdGlvbkltcGwgY2RhdGEgPSBudWxsOwotCQl0cnkgewotCQkJY2RhdGEgPSAoQ0RBVEFTZWN0aW9uSW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZUNEQVRBU2VjdGlvbihudWxsKTsKLQkJfQotCQljYXRjaCAoRE9NRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJaWYgKGNkYXRhID09IG51bGwpIHsgLy8gQ0RBVEEgc2VjdGlvbiBtaWdodCBub3QgYmUgc3VwcG9ydGVkCi0JCQlpbnNlcnRJbnZhbGlkRGVjbChmbGF0Tm9kZSk7IC8vIHJlZ2FyZCBhcyBpbnZhbGlkIGRlY2wKLQkJCXJldHVybjsKLQkJfQotCi0JCWNkYXRhLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydE5vZGUoY2RhdGEpOwotCX0KLQotCS8qKgotCSAqIGluc2VydENvbW1lbnQgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydENvbW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgZGF0YSA9IG51bGw7Ci0JCWJvb2xlYW4gaXNKU1BUYWcgPSBmYWxzZTsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKGlzTmVzdGVkQ29tbWVudE9wZW4ocmVnaW9uVHlwZSkpIHsKLQkJCQlpc0pTUFRhZyA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCB8fCBpc05lc3RlZENvbW1lbnRUZXh0KHJlZ2lvblR5cGUpKSB7Ci0JCQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJCQlkYXRhID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGNyZWF0ZUNvbW1lbnRFbGVtZW50KGRhdGEsIGlzSlNQVGFnKTsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoIWlzRW5kVGFnKGVsZW1lbnQpKSB7Ci0JCQkJCWVsZW1lbnQuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCQlpbnNlcnRTdGFydFRhZyhlbGVtZW50KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIGVuZCB0YWcKLQkJCQllbGVtZW50LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0KLQkJCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJCVN0cmluZyByb290TmFtZSA9IGdldEZpbmRSb290TmFtZSh0YWdOYW1lKTsKLQkJCQlFbGVtZW50SW1wbCBzdGFydCA9IChFbGVtZW50SW1wbCkgdGhpcy5jb250ZXh0LmZpbmRTdGFydFRhZyh0YWdOYW1lLCByb290TmFtZSk7Ci0JCQkJaWYgKHN0YXJ0ICE9IG51bGwpIHsgLy8gc3RhcnQgdGFnIGZvdW5kCi0JCQkJCWluc2VydEVuZFRhZyhzdGFydCk7Ci0JCQkJCXN0YXJ0LmFkZEVuZFRhZyhlbGVtZW50KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIGludmFsaWQgZW5kIHRhZwotCQkJCWluc2VydE5vZGUoZWxlbWVudCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJQ29tbWVudEltcGwgY29tbWVudCA9IChDb21tZW50SW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZUNvbW1lbnQobnVsbCk7Ci0JCWlmIChjb21tZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChpc0pTUFRhZykKLQkJCWNvbW1lbnQuc2V0SlNQVGFnKHRydWUpOwotCQljb21tZW50LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydE5vZGUoY29tbWVudCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0RGVjbCBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0RGVjbChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWJvb2xlYW4gaXNEb2NUeXBlID0gZmFsc2U7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJU3RyaW5nIHB1YmxpY0lkID0gbnVsbDsKLQkJU3RyaW5nIHN5c3RlbUlkID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTikgewotCQkJCWlzRG9jVHlwZSA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfTkFNRSkgewotCQkJCWlmIChuYW1lID09IG51bGwpCi0JCQkJCW5hbWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGKSB7Ci0JCQkJaWYgKHB1YmxpY0lkID09IG51bGwpCi0JCQkJCXB1YmxpY0lkID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRBdHRyVmFsdWUoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGKSB7Ci0JCQkJaWYgKHN5c3RlbUlkID09IG51bGwpCi0JCQkJCXN5c3RlbUlkID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRBdHRyVmFsdWUoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpbnZhbGlkIGRlY2xhcmF0aW9uCi0JCWlmICghaXNEb2NUeXBlKSB7Ci0JCQlpbnNlcnRJbnZhbGlkRGVjbChmbGF0Tm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlEb2N1bWVudFR5cGVJbXBsIGRvY1R5cGUgPSAoRG9jdW1lbnRUeXBlSW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZURvY3R5cGUobmFtZSk7Ci0JCWlmIChkb2NUeXBlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChwdWJsaWNJZCAhPSBudWxsKQotCQkJZG9jVHlwZS5zZXRQdWJsaWNJZChwdWJsaWNJZCk7Ci0JCWlmIChzeXN0ZW1JZCAhPSBudWxsKQotCQkJZG9jVHlwZS5zZXRTeXN0ZW1JZChzeXN0ZW1JZCk7Ci0JCWRvY1R5cGUuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0Tm9kZShkb2NUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRFbmRUYWcgbWV0aG9kIGNhbiBiZSB1c2VkIGJ5IHN1YmNsYXNzZXMsIGJ1dCBub3Qgb3ZlcnJpZGVkLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0RW5kVGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCU5vZGUgbmV3UGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChuZXdQYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlpZiAoISgoRWxlbWVudEltcGwpIGVsZW1lbnQpLmlzQ29udGFpbmVyKCkpIHsKLQkJCS8vIGp1c3QgdXBkYXRlIGNvbnRleHQKLQkJCU5vZGUgZWxlbWVudE5leHQgPSBlbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpZiAoZWxlbWVudE5leHQgIT0gbnVsbCkKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoZWxlbWVudE5leHQpOwotCQkJZWxzZQotCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKG5ld1BhcmVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBwcm9tb3RlIGNoaWxkcmVuCi0JCU5vZGUgbmV3TmV4dCA9IGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJTm9kZSBvbGRQYXJlbnQgPSB0aGlzLmNvbnRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAob2xkUGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCU5vZGUgb2xkTmV4dCA9IHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQlwcm9tb3RlTm9kZXMoZWxlbWVudCwgbmV3UGFyZW50LCBuZXdOZXh0LCBvbGRQYXJlbnQsIG9sZE5leHQpOwotCi0JCS8vIHVwZGF0ZSBjb250ZXh0Ci0JCS8vIHJlLWNoZWNrIHRoZSBuZXh0IHNpYmxpbmcKLQkJbmV3TmV4dCA9IGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJaWYgKG5ld05leHQgIT0gbnVsbCkKLQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXdOZXh0KTsKLQkJZWxzZQotCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUobmV3UGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRFbmRUYWcgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydEVuZFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB0YWdOYW1lID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgaXNOZXN0ZWRUYWdOYW1lKHJlZ2lvblR5cGUpKSB7Ci0JCQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCQkJdGFnTmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCWlmICh0YWdOYW1lID09IG51bGwpIHsgLy8gaW52YWxpZCBlbmQgdGFnCi0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsgLy8gcmVnYXJkIGFzIGludmFsaWQgdGV4dAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIHJvb3ROYW1lID0gZ2V0RmluZFJvb3ROYW1lKHRhZ05hbWUpOwotCQlFbGVtZW50SW1wbCBzdGFydCA9IChFbGVtZW50SW1wbCkgdGhpcy5jb250ZXh0LmZpbmRTdGFydFRhZyh0YWdOYW1lLCByb290TmFtZSk7Ci0JCWlmIChzdGFydCAhPSBudWxsKSB7IC8vIHN0YXJ0IHRhZyBmb3VuZAotCQkJaW5zZXJ0RW5kVGFnKHN0YXJ0KTsKLQkJCXN0YXJ0LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBpbnZhbGlkIGVuZCB0YWcKLQkJRWxlbWVudEltcGwgZW5kID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVuZCA9IChFbGVtZW50SW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWlmIChlbmQgPT0gbnVsbCkgeyAvLyBpbnZhbGlkIGVuZCB0YWcKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOyAvLyByZWdhcmQgYXMgaW52YWxpZCB0ZXh0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZW5kLnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydE5vZGUoZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRFbnRpdHlSZWYgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydEVudGl0eVJlZihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFKSB7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCQkJbmFtZSA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0RW50aXR5UmVmTmFtZShmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCWlmIChuYW1lID09IG51bGwpIHsgLy8gaW52YWxpZCBlbnRpdHkKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gSVNTVUU6IGF2b2lkIHRoaXMgY2FzdAotCQlTdHJpbmcgdmFsdWUgPSAoKERvY3VtZW50SW1wbCl0aGlzLm1vZGVsLmdldERvY3VtZW50KCkpLmdldENoYXJWYWx1ZShuYW1lKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsgLy8gY2hhcmFjdGVyIGVudGl0eQotCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgdGhpcy5jb250ZXh0LmZpbmRQcmV2aW91c1RleHQoKTsKLQkJCWlmICh0ZXh0ICE9IG51bGwpIHsgLy8gZXhpc3RpbmcgdGV4dCBmb3VuZAotCQkJCS8vIGRvIG5vdCBhcHBlbmQgZGF0YQotCQkJCXRleHQuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQkvLyBub3RpZnkgdGhlIGNoYW5nZQotCQkJCXRleHQubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBuZXcgdGV4dAotCQkJdGV4dCA9IChUZXh0SW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKG51bGwpOwotCQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQl0ZXh0LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlpbnNlcnROb2RlKHRleHQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZ2VuZXJhbCBlbnRpdHkgcmVmZXJlbmNlCi0JCUVudGl0eVJlZmVyZW5jZUltcGwgcmVmID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZiA9IChFbnRpdHlSZWZlcmVuY2VJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlRW50aXR5UmVmZXJlbmNlKG5hbWUpOwotCQl9Ci0JCWNhdGNoIChET01FeGNlcHRpb24gZXgpIHsKLQkJfQotCQlpZiAocmVmID09IG51bGwpIHsgLy8gZW50aXR5IHJlZmVyZW5jZSBtaWdodCBub3QgYmUgc3VwcG9ydGVkCi0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsgLy8gcmVnYXJkIGFzIGludmFsaWQgdGV4dAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcmVmLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydE5vZGUocmVmKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRJbnZhbGlkRGVjbCBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0SW52YWxpZERlY2woSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCIhIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChET01FeGNlcHRpb24gZXgpIHsKLQkJfQotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7IC8vIGludmFsaWQgdGFnCi0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsgLy8gcmVnYXJkIGFzIGludmFsaWQgdGV4dAotCQkJcmV0dXJuOwotCQl9Ci0JCWVsZW1lbnQuc2V0RW1wdHlUYWcodHJ1ZSk7Ci0JCWVsZW1lbnQuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnROb2RlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIGluc2VydEpTUFRhZyBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0TmVzdGVkVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHRhZ05hbWUgPSBudWxsOwotCQlBdHRySW1wbCBhdHRyID0gbnVsbDsKLQkJVmVjdG9yIGF0dHJOb2RlcyA9IG51bGw7Ci0JCWJvb2xlYW4gaXNDbG9zZVRhZyA9IGZhbHNlOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAoaXNOZXN0ZWRUYWdPcGVuKHJlZ2lvblR5cGUpIHx8IGlzTmVzdGVkVGFnTmFtZShyZWdpb25UeXBlKSkgewotCQkJCXRhZ05hbWUgPSBjb21wdXRlTmVzdGVkVGFnKHJlZ2lvblR5cGUsIHRhZ05hbWUsIGZsYXROb2RlLCByZWdpb24pOwotCQkJfQotCQkJZWxzZSBpZiAoaXNOZXN0ZWRUYWdDbG9zZShyZWdpb25UeXBlKSkgewotCQkJCWlzQ2xvc2VUYWcgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJCQlhdHRyID0gKEF0dHJJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlQXR0cmlidXRlKG5hbWUpOwotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXROYW1lUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWlmIChhdHRyTm9kZXMgPT0gbnVsbCkKLQkJCQkJCWF0dHJOb2RlcyA9IG5ldyBWZWN0b3IoKTsKLQkJCQkJYXR0ck5vZGVzLmFkZEVsZW1lbnQoYXR0cik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXRFcXVhbFJlZ2lvbihyZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXRWYWx1ZVJlZ2lvbihyZWdpb24pOwotCQkJCQlhdHRyID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGFnTmFtZSA9PSBudWxsKSB7Ci0JCQlpZiAoaXNDbG9zZVRhZykgewotCQkJCS8vIGNsb3NlIEpTUCB0YWcKLQkJCQlOb2RlIHBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCUVsZW1lbnRJbXBsIHN0YXJ0ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQkJCWlmIChzdGFydC5pc0pTUENvbnRhaW5lcigpKSB7Ci0JCQkJCQlpbnNlcnRFbmRUYWcoc3RhcnQpOwotCQkJCQkJc3RhcnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIGludmFsaWQgSlNQIHRhZwotCQkJaW5zZXJ0VGV4dChmbGF0Tm9kZSk7IC8vIHJlZ2FyZCBhcyBpbnZhbGlkIHRleHQKLQkJCXJldHVybjsKLQkJfQotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsgLy8gaW52YWxpZCB0YWcKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOyAvLyByZWdhcmQgYXMgaW52YWxpZCB0ZXh0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGF0dHJOb2RlcyAhPSBudWxsKSB7Ci0JCQlFbnVtZXJhdGlvbiBhZSA9IGF0dHJOb2Rlcy5lbGVtZW50cygpOwotCQkJd2hpbGUgKGFlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJQXR0ciBhID0gKEF0dHIpIGFlLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYgKGEgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJZWxlbWVudC5hcHBlbmRBdHRyaWJ1dGVOb2RlKGEpOwotCQkJfQotCQl9Ci0JCWVsZW1lbnQuc2V0SlNQVGFnKHRydWUpOwotCQllbGVtZW50LnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0U3RhcnRUYWcoZWxlbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRUYWdDbG9zZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkVGFnT3BlbihTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZU5lc3RlZFRhZyhTdHJpbmcgcmVnaW9uVHlwZSwgU3RyaW5nIHRhZ05hbWUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIHRhZ05hbWU7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0Tm9kZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMuY29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCU5vZGUgcGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIG5leHQgPSB0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJd2hpbGUgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQlpZiAoY2FuQ29udGFpbihlbGVtZW50LCBub2RlKSkgewotCQkJCWlmICghZWxlbWVudC5oYXNTdGFydFRhZygpICYmIG5leHQgPT0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCkpIHsKLQkJCQkJLy8gZmlyc3QgY2hpbGQgb2YgaW1wbGljaXQgdGFnCi0JCQkJCS8vIGRlbGV0ZWdlIHRvIHRoZSBwYXJlbnQKLQkJCQkJcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQkJCQkJbmV4dCA9IGVsZW1lbnQ7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQkvLyBwcm9tb3RlIHNpYmxpbmdzCi0JCQlOb2RlIG5ld05leHQgPSBlbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQlOb2RlIGNoaWxkID0gbmV4dDsKLQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJTm9kZSBuZXh0Q2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIG5ld05leHQpOwotCQkJCWNoaWxkID0gbmV4dENoaWxkOwotCQkJfQotCi0JCQkvLyBsZWF2ZSB0aGUgb2xkIGVuZCB0YWcgd2hlcmUgaXQgaXMKLQkJCWlmIChlbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJRWxlbWVudCBlbmQgPSBlbGVtZW50LnJlbW92ZUVuZFRhZygpOwotCQkJCWlmIChlbmQgIT0gbnVsbCkgewotCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKGVuZCwgbmV3TmV4dCk7Ci0JCQkJCWlmIChuZXh0ID09IG51bGwpCi0JCQkJCQluZXh0ID0gZW5kOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZWxlbWVudC5oYXNTdGFydFRhZygpKSB7Ci0JCQkJLy8gaW1wbGljaXQgZWxlbWVudAotCQkJCWlmICghZWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gdXBkYXRlIGNvbnRleHQKLQkJCWlmIChuZXh0ID09IG51bGwpCi0JCQkJbmV4dCA9IG5ld05leHQ7Ci0JCQlpZiAobmV4dCAhPSBudWxsKQotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQkJCWVsc2UKLQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotCQl9Ci0KLQkJaW5zZXJ0Tm9kZShwYXJlbnQsIG5vZGUsIG5leHQpOwotCQluZXh0ID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQlpZiAobmV4dCAhPSBudWxsKQotCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQllbHNlCi0JCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShub2RlLmdldFBhcmVudE5vZGUoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydE5vZGUoTm9kZSBwYXJlbnQsIE5vZGUgbm9kZSwgTm9kZSBuZXh0KSB7Ci0JCXdoaWxlIChuZXh0ICE9IG51bGwgJiYgbmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50SW1wbCBuZXh0RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV4dDsKLQkJCWlmIChuZXh0RWxlbWVudC5oYXNTdGFydFRhZygpKQotCQkJCWJyZWFrOwotCQkJaWYgKCFjYW5CZUltcGxpY2l0VGFnKG5leHRFbGVtZW50LCBub2RlKSkKLQkJCQlicmVhazsKLQkJCXBhcmVudCA9IG5leHRFbGVtZW50OwotCQkJbmV4dCA9IG5leHRFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJfQotCQlFbGVtZW50IGltcGxpY2l0RWxlbWVudCA9IGNyZWF0ZUltcGxpY2l0RWxlbWVudChwYXJlbnQsIG5vZGUpOwotCQlpZiAoaW1wbGljaXRFbGVtZW50ICE9IG51bGwpCi0JCQlub2RlID0gaW1wbGljaXRFbGVtZW50OwotCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHQpOwotCX0KLQotCS8qKgotCSAqIGluc2VydFBJIG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRQSShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB0YXJnZXQgPSBudWxsOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ0xPU0UpCi0JCQkJY29udGludWU7Ci0JCQlpZiAodGFyZ2V0ID09IG51bGwpCi0JCQkJdGFyZ2V0ID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQl9Ci0KLQkJUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBwaSA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgbnVsbCk7Ci0JCWlmIChwaSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlwaS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnROb2RlKHBpKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRTdGFydFRhZyBtZXRob2QgY2FuIGJlIHVzZWQgYnkgc3ViY2xhc3NlcywgYnV0IG5vdCBvdmVycmlkZGVuLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0U3RhcnRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLmNvbnRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpbnNlcnROb2RlKGVsZW1lbnQpOwotCi0JCUVsZW1lbnRJbXBsIG5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0JCWlmIChuZXdFbGVtZW50LmlzRW1wdHlUYWcoKSB8fCAhbmV3RWxlbWVudC5pc0NvbnRhaW5lcigpKQotCQkJcmV0dXJuOwotCi0JCS8vIGRlbW90ZSBzaWJsaW5ncwotCQlOb2RlIHBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZSBuZXh0ID0gdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCWRlbW90ZU5vZGVzKGVsZW1lbnQsIGVsZW1lbnQsIHBhcmVudCwgbmV4dCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRleHQKLQkJTm9kZSBmaXJzdENoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChmaXJzdENoaWxkICE9IG51bGwpCi0JCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoZmlyc3RDaGlsZCk7Ci0JCWVsc2UKLQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIGluc2VydFN0YXJ0VGFnIG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRTdGFydFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB0YWdOYW1lID0gbnVsbDsKLQkJYm9vbGVhbiBpc0VtcHR5VGFnID0gZmFsc2U7Ci0JCUF0dHJJbXBsIGF0dHIgPSBudWxsOwotCQlWZWN0b3IgYXR0ck5vZGVzID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgaXNOZXN0ZWRUYWdOYW1lKHJlZ2lvblR5cGUpKSB7Ci0JCQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCQkJdGFnTmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJaXNFbXB0eVRhZyA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCVN0cmluZyBuYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJCWF0dHIgPSAoQXR0ckltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVBdHRyaWJ1dGUobmFtZSk7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldE5hbWVSZWdpb24ocmVnaW9uKTsKLQkJCQkJaWYgKGF0dHJOb2RlcyA9PSBudWxsKQotCQkJCQkJYXR0ck5vZGVzID0gbmV3IFZlY3RvcigpOwotCQkJCQlhdHRyTm9kZXMuYWRkRWxlbWVudChhdHRyKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldEVxdWFsUmVnaW9uKHJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldFZhbHVlUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWF0dHIgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICh0YWdOYW1lID09IG51bGwpIHsgLy8gaW52YWxpZCBzdGFydCB0YWcKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOyAvLyByZWdhcmQgYXMgaW52YWxpZCB0ZXh0Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KHRhZ05hbWUpOwotCQl9Ci0JCWNhdGNoIChET01FeGNlcHRpb24gZXgpIHsKLQkJCS8vIHR5cGljYWxseSBpbnZhbGlkIG5hbWUKLQkJfQotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7IC8vIGludmFsaWQgdGFnCi0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsgLy8gcmVnYXJkIGFzIGludmFsaWQgdGV4dAotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChhdHRyTm9kZXMgIT0gbnVsbCkgewotCQkJRW51bWVyYXRpb24gYWUgPSBhdHRyTm9kZXMuZWxlbWVudHMoKTsKLQkJCXdoaWxlIChhZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCUF0dHIgYSA9IChBdHRyKSBhZS5uZXh0RWxlbWVudCgpOwotCQkJCWlmIChhID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWVsZW1lbnQuYXBwZW5kQXR0cmlidXRlTm9kZShhKTsKLQkJCX0KLQkJfQotCQlpZiAoaXNFbXB0eVRhZykKLQkJCWVsZW1lbnQuc2V0RW1wdHlUYWcodHJ1ZSk7Ci0JCWVsZW1lbnQuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnRTdGFydFRhZyhlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEZpcnN0UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQlpbnNlcnRTdGFydFRhZyhmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCWluc2VydEVuZFRhZyhmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4gfHwgaXNOZXN0ZWRDb21tZW50T3BlbihyZWdpb25UeXBlKSkgewotCQkJaW5zZXJ0Q29tbWVudChmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UpIHsKLQkJCWluc2VydEVudGl0eVJlZihmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9PUEVOKSB7Ci0JCQlpbnNlcnREZWNsKGZsYXROb2RlKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pIHsKLQkJCWluc2VydFBJKGZsYXROb2RlKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4pIHsKLQkJCWluc2VydENEQVRBU2VjdGlvbihmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAoaXNOZXN0ZWRUYWcocmVnaW9uVHlwZSkpIHsKLQkJCWluc2VydE5lc3RlZFRhZyhmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkVGFnKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDb21tZW50VGV4dChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDb21tZW50T3BlbihTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkVGFnTmFtZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ29udGVudChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIGluc2VydFRleHQgbWV0aG9kIENhbiBiZSBjYWxsZWQgZnJvbSBzdWJjbGFzc2VzLCBub3QgdG8gYmUgb3ZlcnJpZGVkIG9yCi0JICogcmUtaW1wbGVtZW50ZWQuCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0VGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIHRoaXMuY29udGV4dC5maW5kUHJldmlvdXNUZXh0KCk7Ci0JCWlmICh0ZXh0ICE9IG51bGwpIHsgLy8gZXhpc3RpbmcgdGV4dCBmb3VuZAotCQkJdGV4dC5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJLy8gbm90aWZ5IHRoZSBjaGFuZ2UKLQkJCXRleHQubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBuZXcgdGV4dAotCQl0ZXh0ID0gKFRleHRJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUobnVsbCk7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0Tm9kZSh0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuZFRhZyhJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCU1vZGVsUGFyc2VyQWRhcHRlciBhZGFwdGVyID0gZ2V0UGFyc2VyQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5pc0VuZFRhZyhlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudC5pc0VuZFRhZygpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9tb3RlTm9kZXMoTm9kZSByb290LCBOb2RlIG5ld1BhcmVudCwgTm9kZSBuZXdOZXh0LCBOb2RlIG9sZFBhcmVudCwgTm9kZSBuZXh0KSB7Ci0JCUVsZW1lbnRJbXBsIG5ld0VsZW1lbnQgPSBudWxsOwotCQlpZiAobmV3UGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5ld1BhcmVudDsKLQkJfQotCi0JCU5vZGUgcm9vdFBhcmVudCA9IHJvb3QuZ2V0UGFyZW50Tm9kZSgpOwotCQl3aGlsZSAob2xkUGFyZW50ICE9IHJvb3RQYXJlbnQpIHsKLQkJCXdoaWxlIChuZXh0ICE9IG51bGwpIHsKLQkJCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJCQlib29sZWFuIGVuZFRhZyA9IGZhbHNlOwotCQkJCWlmIChuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJRWxlbWVudEltcGwgbmV4dEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5leHQ7Ci0JCQkJCWlmICghbmV4dEVsZW1lbnQuaGFzU3RhcnRUYWcoKSkgewotCQkJCQkJTm9kZSBuZXh0Q2hpbGQgPSBuZXh0RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJCQlpZiAobmV4dENoaWxkICE9IG51bGwpIHsKLQkJCQkJCQkvLyBwcm9tb3RlIGNoaWxkcmVuCi0JCQkJCQkJbmV4dCA9IG5leHRDaGlsZDsKLQkJCQkJCQlvbGRQYXJlbnQgPSBuZXh0RWxlbWVudDsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKG5leHRFbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJCQkJaWYgKG5leHRFbGVtZW50Lm1hdGNoRW5kVGFnKG5ld0VsZW1lbnQpKSB7Ci0JCQkJCQkJCWVuZFRhZyA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gcmVtb3ZlIGltcGxpY2l0IGVsZW1lbnQKLQkJCQkJCQluZXh0ID0gbmV4dEVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQlvbGRQYXJlbnQucmVtb3ZlQ2hpbGQobmV4dEVsZW1lbnQpOwotCQkJCQkJCWRvbmUgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKCFkb25lKSB7Ci0JCQkJCWlmICghZW5kVGFnICYmIG5ld0VsZW1lbnQgIT0gbnVsbCAmJiAhY2FuQ29udGFpbihuZXdFbGVtZW50LCBuZXh0KSkgewotCQkJCQkJbmV3UGFyZW50ID0gbmV3RWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQlpZiAobmV3UGFyZW50ID09IG51bGwpCi0JCQkJCQkJcmV0dXJuOyAvLyBlcnJvcgotCQkJCQkJTm9kZSBlbGVtZW50TmV4dCA9IG5ld0VsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCS8vIHByb21vdGUgc2libGluZ3MKLQkJCQkJCXByb21vdGVOb2RlcyhuZXdFbGVtZW50LCBuZXdQYXJlbnQsIGVsZW1lbnROZXh0LCBuZXdFbGVtZW50LCBuZXdOZXh0KTsKLQkJCQkJCW5ld05leHQgPSBuZXdFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQlpZiAobmV3UGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQluZXdFbGVtZW50ID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJTm9kZSBjaGlsZCA9IG5leHQ7Ci0JCQkJCW5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCW9sZFBhcmVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJCWluc2VydE5vZGUobmV3UGFyZW50LCBjaGlsZCwgbmV3TmV4dCk7Ci0JCQkJCU5vZGUgY2hpbGRQYXJlbnQgPSBjaGlsZC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCWlmIChjaGlsZFBhcmVudCAhPSBuZXdQYXJlbnQpIHsKLQkJCQkJCW5ld1BhcmVudCA9IGNoaWxkUGFyZW50OwotCQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV3UGFyZW50OwotCQkJCQkJbmV3TmV4dCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChvbGRQYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlyZXR1cm47Ci0JCQlFbGVtZW50SW1wbCBvbGRFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBvbGRQYXJlbnQ7Ci0JCQlvbGRQYXJlbnQgPSBvbGRFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChvbGRQYXJlbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIGVycm9yCi0JCQluZXh0ID0gb2xkRWxlbWVudC5nZXROZXh0U2libGluZygpOwotCi0JCQlpZiAob2xkRWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCUVsZW1lbnQgZW5kID0gbnVsbDsKLQkJCQlpZiAoIW9sZEVsZW1lbnQuaGFzQ2hpbGROb2RlcygpICYmICFvbGRFbGVtZW50Lmhhc1N0YXJ0VGFnKCkpIHsKLQkJCQkJb2xkUGFyZW50LnJlbW92ZUNoaWxkKG9sZEVsZW1lbnQpOwotCQkJCQllbmQgPSBvbGRFbGVtZW50OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZW5kID0gb2xkRWxlbWVudC5yZW1vdmVFbmRUYWcoKTsKLQkJCQl9Ci0JCQkJaWYgKGVuZCAhPSBudWxsKSB7Ci0JCQkJCWluc2VydE5vZGUobmV3UGFyZW50LCBlbmQsIG5ld05leHQpOwotCQkJCQlOb2RlIGVuZFBhcmVudCA9IGVuZC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCWlmIChlbmRQYXJlbnQgIT0gbmV3UGFyZW50KSB7Ci0JCQkJCQluZXdQYXJlbnQgPSBlbmRQYXJlbnQ7Ci0JCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCQkJCQluZXdOZXh0ID0gZW5kLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVFbmRUYWcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlRW5kVGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5jb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJTm9kZSBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWlmICghKChFbGVtZW50SW1wbCkgZWxlbWVudCkuaXNDb250YWluZXIoKSkgewotCQkJLy8ganVzdCB1cGRhdGUgY29udGV4dAotCQkJTm9kZSBlbGVtZW50TmV4dCA9IGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmIChlbGVtZW50TmV4dCAhPSBudWxsKQotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShlbGVtZW50TmV4dCk7Ci0JCQllbHNlCi0JCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUocGFyZW50KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGRlbW90ZSBzaWJsaW5ncwotCQlOb2RlIG5leHQgPSBlbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCUVsZW1lbnRJbXBsIG5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0JCS8vIGZpbmQgbmV3IHBhcmVudAotCQlmb3IgKE5vZGUgbGFzdCA9IG5ld0VsZW1lbnQuZ2V0TGFzdENoaWxkKCk7IGxhc3QgIT0gbnVsbDsgbGFzdCA9IGxhc3QuZ2V0TGFzdENoaWxkKCkpIHsKLQkJCWlmIChsYXN0LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJYnJlYWs7Ci0JCQlFbGVtZW50SW1wbCBsYXN0RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbGFzdDsKLQkJCWlmIChsYXN0RWxlbWVudC5oYXNFbmRUYWcoKSB8fCBsYXN0RWxlbWVudC5pc0VtcHR5VGFnKCkgfHwgIWxhc3RFbGVtZW50LmlzQ29udGFpbmVyKCkpCi0JCQkJYnJlYWs7Ci0JCQluZXdFbGVtZW50ID0gbGFzdEVsZW1lbnQ7Ci0JCX0KLQkJTm9kZSBsYXN0Q2hpbGQgPSBuZXdFbGVtZW50LmdldExhc3RDaGlsZCgpOwotCQlkZW1vdGVOb2RlcyhlbGVtZW50LCBuZXdFbGVtZW50LCBwYXJlbnQsIG5leHQpOwotCi0JCS8vIHVwZGF0ZSBjb250ZXh0Ci0JCU5vZGUgbmV3TmV4dCA9IG51bGw7Ci0JCWlmIChsYXN0Q2hpbGQgIT0gbnVsbCkKLQkJCW5ld05leHQgPSBsYXN0Q2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJZWxzZQotCQkJbmV3TmV4dCA9IG5ld0VsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAobmV3TmV4dCAhPSBudWxsKQotCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5ld05leHQpOwotCQllbHNlCi0JCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShuZXdFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBub2RlIGlmIGl0IGlzIG5vIGxvbmdlciByZXF1aXJlZCBpbXBsaWNpdCB0YWcgd2l0aAotCSAqIHJlbWFpbmluZyBjaGlsZCBub2RlcyBwcm9tb3RlZC4KLQkgKi8KLQlwcml2YXRlIEVsZW1lbnQgcmVtb3ZlSW1wbGljaXRFbGVtZW50KE5vZGUgcGFyZW50KSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQlpZiAoIWVsZW1lbnQuaXNJbXBsaWNpdFRhZygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChjYW5CZUltcGxpY2l0VGFnKGVsZW1lbnQpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTm9kZSBlbGVtZW50UGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChlbGVtZW50UGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJTm9kZSBmaXJzdENoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCU5vZGUgY2hpbGQgPSBmaXJzdENoaWxkOwotCQlOb2RlIGVsZW1lbnROZXh0ID0gZWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJTm9kZSBuZXh0Q2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJZWxlbWVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQllbGVtZW50UGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgZWxlbWVudE5leHQpOwotCQkJY2hpbGQgPSBuZXh0Q2hpbGQ7Ci0JCX0KLQotCQkvLyByZXNldCBjb250ZXh0Ci0JCWlmICh0aGlzLmNvbnRleHQuZ2V0UGFyZW50Tm9kZSgpID09IGVsZW1lbnQpIHsKLQkJCU5vZGUgb2xkTmV4dCA9IHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG9sZE5leHQgIT0gbnVsbCkgewotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShvbGROZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChlbGVtZW50TmV4dCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShlbGVtZW50TmV4dCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShlbGVtZW50UGFyZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5jb250ZXh0LmdldE5leHROb2RlKCkgPT0gZWxlbWVudCkgewotCQkJaWYgKGZpcnN0Q2hpbGQgIT0gbnVsbCkgewotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShmaXJzdENoaWxkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChlbGVtZW50TmV4dCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShlbGVtZW50TmV4dCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShlbGVtZW50UGFyZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZW1vdmVOb2RlKGVsZW1lbnQpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLmNvbnRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgbmV4dCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJTm9kZSBwcmV2ID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQotCQkvLyB1cGRhdGUgY29udGV4dAotCQlOb2RlIG9sZFBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChub2RlID09IG9sZFBhcmVudCkgewotCQkJaWYgKG5leHQgIT0gbnVsbCkKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0JCQllbHNlCi0JCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUocGFyZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCU5vZGUgb2xkTmV4dCA9IHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5vZGUgPT0gb2xkTmV4dCkgewotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQkJCX0KLQkJfQotCi0JCXBhcmVudC5yZW1vdmVDaGlsZChub2RlKTsKLQotCQlpZiAocmVtb3ZlSW1wbGljaXRFbGVtZW50KHBhcmVudCkgIT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBkZW1vdGUgc2libGluZwotCQlpZiAocHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJRWxlbWVudEltcGwgbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgcHJldjsKLQkJCWlmICghbmV3RWxlbWVudC5oYXNFbmRUYWcoKSAmJiAhbmV3RWxlbWVudC5pc0VtcHR5VGFnKCkgJiYgbmV3RWxlbWVudC5pc0NvbnRhaW5lcigpKSB7Ci0JCQkJLy8gZmluZCBuZXcgcGFyZW50Ci0JCQkJZm9yIChOb2RlIGxhc3QgPSBuZXdFbGVtZW50LmdldExhc3RDaGlsZCgpOyBsYXN0ICE9IG51bGw7IGxhc3QgPSBsYXN0LmdldExhc3RDaGlsZCgpKSB7Ci0JCQkJCWlmIChsYXN0LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCQlicmVhazsKLQkJCQkJRWxlbWVudEltcGwgbGFzdEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGxhc3Q7Ci0JCQkJCWlmIChsYXN0RWxlbWVudC5oYXNFbmRUYWcoKSB8fCBsYXN0RWxlbWVudC5pc0VtcHR5VGFnKCkgfHwgIWxhc3RFbGVtZW50LmlzQ29udGFpbmVyKCkpCi0JCQkJCQlicmVhazsKLQkJCQkJbmV3RWxlbWVudCA9IGxhc3RFbGVtZW50OwotCQkJCX0KLQkJCQlOb2RlIGxhc3RDaGlsZCA9IG5ld0VsZW1lbnQuZ2V0TGFzdENoaWxkKCk7Ci0JCQkJZGVtb3RlTm9kZXMocHJldiwgbmV3RWxlbWVudCwgcGFyZW50LCBuZXh0KTsKLQotCQkJCS8vIHVwZGF0ZSBjb250ZXh0Ci0JCQkJTm9kZSBuZXdOZXh0ID0gbnVsbDsKLQkJCQlpZiAobGFzdENoaWxkICE9IG51bGwpCi0JCQkJCW5ld05leHQgPSBsYXN0Q2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQllbHNlCi0JCQkJCW5ld05leHQgPSBuZXdFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCQlpZiAobmV3TmV4dCAhPSBudWxsKQotCQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV3TmV4dCk7Ci0JCQkJZWxzZQotCQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShuZXdFbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHJlbW92ZVN0YXJ0VGFnIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVN0YXJ0VGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5jb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZm9yIGltcGxpY2l0IHRhZwotCQlFbGVtZW50SW1wbCBvbGRFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBlbGVtZW50OwotCQlpZiAoY2FuQmVJbXBsaWNpdFRhZyhvbGRFbGVtZW50KSkgewotCQkJTm9kZSBuZXdQYXJlbnQgPSBudWxsOwotCQkJTm9kZSBwcmV2ID0gb2xkRWxlbWVudC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCWlmIChwcmV2ICE9IG51bGwgJiYgcHJldi5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudEltcGwgcHJldkVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHByZXY7Ci0JCQkJaWYgKCFwcmV2RWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQlpZiAocHJldkVsZW1lbnQuaGFzU3RhcnRUYWcoKSB8fCBwcmV2RWxlbWVudC5tYXRjaFRhZ05hbWUob2xkRWxlbWVudC5nZXRUYWdOYW1lKCkpKSB7Ci0JCQkJCQluZXdQYXJlbnQgPSBwcmV2RWxlbWVudDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChuZXdQYXJlbnQgPT0gbnVsbCkgewotCQkJCS8vIHRoaXMgZWxlbWVudCBzaG91bGQgc3RheSBhcyBpbXBsaWNpdCB0YWcKLQkJCQkvLyBqdXN0IHJlbW92ZSBhbGwgYXR0cmlidXRlcwotCQkJCW9sZEVsZW1lbnQucmVtb3ZlU3RhcnRUYWcoKTsKLQotCQkJCS8vIHVwZGF0ZSBjb250ZXh0Ci0JCQkJTm9kZSBjaGlsZCA9IG9sZEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShjaGlsZCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG9sZEVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUob2xkRWxlbWVudCk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkvLyBmb3IgY29tbWVudCB0YWcKLQkJaWYgKG9sZEVsZW1lbnQuaXNDb21tZW50VGFnKCkpCi0JCQlvbGRFbGVtZW50LnJlbW92ZVN0YXJ0VGFnKCk7Ci0KLQkJLy8gcHJvbW90ZSBjaGlsZHJlbgotCQlOb2RlIGVsZW1lbnRQYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJTm9kZSBwYXJlbnQgPSBlbGVtZW50UGFyZW50OwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgZmlyc3QgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJTm9kZSBmaXJzdEVsZW1lbnQgPSBudWxsOyAvLyBmb3IgdGhlIGNhc2UgZmlyc3QgaXMgcmVtb3ZlZCBhcyBlbmQKLQkJLy8gdGFnCi0JCWlmIChmaXJzdCAhPSBudWxsKSB7Ci0JCQkvLyBmaW5kIG5ldyBwYXJlbnQgZm9yIGNoaWxkcmVuCi0JCQlFbGVtZW50SW1wbCBuZXdFbGVtZW50ID0gbnVsbDsKLQkJCWZvciAoTm9kZSBsYXN0ID0gZWxlbWVudC5nZXRQcmV2aW91c1NpYmxpbmcoKTsgbGFzdCAhPSBudWxsOyBsYXN0ID0gbGFzdC5nZXRMYXN0Q2hpbGQoKSkgewotCQkJCWlmIChsYXN0LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCWJyZWFrOwotCQkJCUVsZW1lbnRJbXBsIGxhc3RFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBsYXN0OwotCQkJCWlmIChsYXN0RWxlbWVudC5oYXNFbmRUYWcoKSB8fCBsYXN0RWxlbWVudC5pc0VtcHR5VGFnKCkgfHwgIWxhc3RFbGVtZW50LmlzQ29udGFpbmVyKCkpCi0JCQkJCWJyZWFrOwotCQkJCW5ld0VsZW1lbnQgPSBsYXN0RWxlbWVudDsKLQkJCX0KLQkJCU5vZGUgbmV4dCA9IGZpcnN0OwotCQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJCXdoaWxlIChuZXh0ICE9IG51bGwpIHsKLQkJCQkJaWYgKCFuZXdFbGVtZW50Lmhhc0VuZFRhZygpICYmIG5ld0VsZW1lbnQuaGFzU3RhcnRUYWcoKSAmJiBuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCUVsZW1lbnRJbXBsIG5leHRFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXh0OwotCQkJCQkJaWYgKCFuZXh0RWxlbWVudC5oYXNTdGFydFRhZygpICYmIG5leHRFbGVtZW50Lmhhc0VuZFRhZygpICYmIG5leHRFbGVtZW50Lm1hdGNoRW5kVGFnKG5ld0VsZW1lbnQpKSB7Ci0JCQkJCQkJLy8gc3RvcCBhdCB0aGUgbWF0Y2hlZCBpbnZhbGlkIGVuZCB0YWcKLQkJCQkJCQlOb2RlIGVsZW1lbnRDaGlsZCA9IG5leHRFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCQkJCQl3aGlsZSAoZWxlbWVudENoaWxkICE9IG51bGwpIHsKLQkJCQkJCQkJTm9kZSBuZXh0Q2hpbGQgPSBlbGVtZW50Q2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQkJbmV4dEVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudENoaWxkKTsKLQkJCQkJCQkJbmV3RWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50Q2hpbGQpOwotCQkJCQkJCQllbGVtZW50Q2hpbGQgPSBuZXh0Q2hpbGQ7Ci0JCQkJCQkJfQotCi0JCQkJCQkJbmV4dCA9IG5leHRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJZWxlbWVudC5yZW1vdmVDaGlsZChuZXh0RWxlbWVudCk7Ci0JCQkJCQkJbmV3RWxlbWVudC5hZGRFbmRUYWcobmV4dEVsZW1lbnQpOwotCQkJCQkJCWlmIChuZXh0RWxlbWVudCA9PSBmaXJzdCkKLQkJCQkJCQkJZmlyc3RFbGVtZW50ID0gbmV3RWxlbWVudDsKLQotCQkJCQkJCU5vZGUgbmV3UGFyZW50ID0gbmV3RWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBwYXJlbnQpCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWlmIChuZXdQYXJlbnQgPT0gbnVsbCB8fCBuZXdQYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCQkJYnJlYWs7IC8vIGVycm9yCi0JCQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV3UGFyZW50OwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghY2FuQ29udGFpbihuZXdFbGVtZW50LCBuZXh0KSkgewotCQkJCQkJTm9kZSBuZXdQYXJlbnQgPSBuZXdFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWlmIChuZXdQYXJlbnQgPT0gcGFyZW50KQotCQkJCQkJCWJyZWFrOwotCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBudWxsIHx8IG5ld1BhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJCWJyZWFrOyAvLyBlcnJvcgotCQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV3UGFyZW50OwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJTm9kZSBjaGlsZCA9IG5leHQ7Ci0JCQkJCW5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCWVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCQluZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCQl9Ci0JCQkJbmV3RWxlbWVudCA9IG51bGw7Ci0JCQl9Ci0JCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQl9Ci0JCQl3aGlsZSAobmV4dCAhPSBudWxsKSB7Ci0JCQkJaWYgKG5ld0VsZW1lbnQgPT0gbnVsbCB8fCBjYW5Db250YWluKG5ld0VsZW1lbnQsIG5leHQpKSB7Ci0JCQkJCU5vZGUgY2hpbGQgPSBuZXh0OwotCQkJCQluZXh0ID0gbmV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQllbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQkJcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgZWxlbWVudCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCXBhcmVudCA9IG5ld0VsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCi0JCQkJLy8gcHJvbW90ZSBzaWJsaW5ncwotCQkJCU5vZGUgbmV3TmV4dCA9IG5ld0VsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlOb2RlIGNoaWxkID0gZWxlbWVudDsKLQkJCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJCQlOb2RlIG5leHRDaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCW5ld0VsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBuZXdOZXh0KTsKLQkJCQkJY2hpbGQgPSBuZXh0Q2hpbGQ7Ci0JCQkJfQotCi0JCQkJLy8gbGVhdmUgdGhlIG9sZCBlbmQgdGFnIHdoZXJlIGl0IGlzCi0JCQkJaWYgKG5ld0VsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQkJRWxlbWVudCBlbmQgPSBuZXdFbGVtZW50LnJlbW92ZUVuZFRhZygpOwotCQkJCQlpZiAoZW5kICE9IG51bGwpIHsKLQkJCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUoZW5kLCBuZXdOZXh0KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIW5ld0VsZW1lbnQuaGFzU3RhcnRUYWcoKSkgewotCQkJCQkvLyBpbXBsaWNpdCBlbGVtZW50Ci0JCQkJCWlmICghbmV3RWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJCXBhcmVudC5yZW1vdmVDaGlsZChuZXdFbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQluZXdFbGVtZW50ID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlOb2RlIG5ld05leHQgPSBlbGVtZW50OwotCQlOb2RlIHN0YXJ0RWxlbWVudCA9IG51bGw7IC8vIGZvciB0aGUgY2FzZSBlbGVtZW50IGlzIHJlbW92ZWQgYXMgZW5kCi0JCS8vIHRhZwotCQlpZiAob2xkRWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJLy8gZmluZCBuZXcgcGFyZW50IGZvciBpbnZhbGlkIGVuZCB0YWcgYW5kIHNpYmxpbmdzCi0JCQlFbGVtZW50SW1wbCBuZXdFbGVtZW50ID0gbnVsbDsKLQkJCWZvciAoTm9kZSBsYXN0ID0gZWxlbWVudC5nZXRQcmV2aW91c1NpYmxpbmcoKTsgbGFzdCAhPSBudWxsOyBsYXN0ID0gbGFzdC5nZXRMYXN0Q2hpbGQoKSkgewotCQkJCWlmIChsYXN0LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCWJyZWFrOwotCQkJCUVsZW1lbnRJbXBsIGxhc3RFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBsYXN0OwotCQkJCWlmIChsYXN0RWxlbWVudC5oYXNFbmRUYWcoKSB8fCBsYXN0RWxlbWVudC5pc0VtcHR5VGFnKCkgfHwgIWxhc3RFbGVtZW50LmlzQ29udGFpbmVyKCkpCi0JCQkJCWJyZWFrOwotCQkJCW5ld0VsZW1lbnQgPSBsYXN0RWxlbWVudDsKLQkJCX0KLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkvLyBkZW1vdGUgaW52YWxpZCBlbmQgdGFnIGFuZCBzaWJsaW5nCi0JCQkJTm9kZSBuZXh0ID0gZWxlbWVudDsKLQkJCQl3aGlsZSAobmV4dCAhPSBudWxsKSB7Ci0JCQkJCWlmICghbmV3RWxlbWVudC5oYXNFbmRUYWcoKSAmJiBuZXdFbGVtZW50Lmhhc1N0YXJ0VGFnKCkgJiYgbmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlFbGVtZW50SW1wbCBuZXh0RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV4dDsKLQkJCQkJCWlmICghbmV4dEVsZW1lbnQuaGFzU3RhcnRUYWcoKSAmJiBuZXh0RWxlbWVudC5oYXNFbmRUYWcoKSAmJiBuZXh0RWxlbWVudC5tYXRjaEVuZFRhZyhuZXdFbGVtZW50KSkgewotCQkJCQkJCS8vIHN0b3AgYXQgdGhlIG1hdGNoZWQgaW52YWxpZCBlbmQgdGFnCi0JCQkJCQkJTm9kZSBlbGVtZW50Q2hpbGQgPSBuZXh0RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJCQkJd2hpbGUgKGVsZW1lbnRDaGlsZCAhPSBudWxsKSB7Ci0JCQkJCQkJCU5vZGUgbmV4dENoaWxkID0gZWxlbWVudENoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJCW5leHRFbGVtZW50LnJlbW92ZUNoaWxkKGVsZW1lbnRDaGlsZCk7Ci0JCQkJCQkJCW5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudENoaWxkKTsKLQkJCQkJCQkJZWxlbWVudENoaWxkID0gbmV4dENoaWxkOwotCQkJCQkJCX0KLQotCQkJCQkJCW5leHQgPSBuZXh0RWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCXBhcmVudC5yZW1vdmVDaGlsZChuZXh0RWxlbWVudCk7Ci0JCQkJCQkJbmV3RWxlbWVudC5hZGRFbmRUYWcobmV4dEVsZW1lbnQpOwotCQkJCQkJCWlmIChuZXh0RWxlbWVudCA9PSBuZXdOZXh0KQotCQkJCQkJCQlzdGFydEVsZW1lbnQgPSBuZXdFbGVtZW50OwotCi0JCQkJCQkJTm9kZSBuZXdQYXJlbnQgPSBuZXdFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCQlpZiAobmV3UGFyZW50ID09IHBhcmVudCkKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBudWxsIHx8IG5ld1BhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJCQlicmVhazsgLy8gZXJyb3IKLQkJCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFjYW5Db250YWluKG5ld0VsZW1lbnQsIG5leHQpKSB7Ci0JCQkJCQlOb2RlIG5ld1BhcmVudCA9IG5ld0VsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBwYXJlbnQpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlpZiAobmV3UGFyZW50ID09IG51bGwgfHwgbmV3UGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCQkJYnJlYWs7IC8vIGVycm9yCi0JCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlOb2RlIGNoaWxkID0gbmV4dDsKLQkJCQkJbmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQkJaWYgKGNoaWxkID09IG9sZEVsZW1lbnQpIHsKLQkJCQkJCWlmICghb2xkRWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJCQkJCS8vIGNsb25lIChyZS1jcmVhdGUpIGVuZCB0YWcKLQkJCQkJCQlFbGVtZW50IGVuZCA9IG9sZEVsZW1lbnQucmVtb3ZlRW5kVGFnKCk7Ci0JCQkJCQkJaWYgKGVuZCAhPSBudWxsKSB7Ci0JCQkJCQkJCWNoaWxkID0gZW5kOwotCQkJCQkJCQluZXdOZXh0ID0gZW5kOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQluZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIW9sZEVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCQkJLy8gY2xvbmUgKHJlLWNyZWF0ZSkgZW5kIHRhZwotCQkJCQlFbGVtZW50IGVuZCA9IG9sZEVsZW1lbnQucmVtb3ZlRW5kVGFnKCk7Ci0JCQkJCWlmIChlbmQgIT0gbnVsbCkgewotCQkJCQkJcGFyZW50Lmluc2VydEJlZm9yZShlbmQsIG9sZEVsZW1lbnQpOwotCQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKG9sZEVsZW1lbnQpOwotCQkJCQkJbmV3TmV4dCA9IGVuZDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCW5ld05leHQgPSBvbGRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQlwYXJlbnQucmVtb3ZlQ2hpbGQob2xkRWxlbWVudCk7Ci0JCX0KLQotCQkvLyB1cGRhdGUgY29udGV4dAotCQlOb2RlIG9sZFBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCU5vZGUgb2xkTmV4dCA9IHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQlpZiAoZWxlbWVudCA9PSBvbGRQYXJlbnQpIHsKLQkJCWlmIChvbGROZXh0ICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUob2xkTmV4dCk7IC8vIHJlc2V0IGZvciBuZXcgcGFyZW50Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdOZXh0ICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV3TmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgPT0gb2xkTmV4dCkgewotCQkJaWYgKGZpcnN0RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUoZmlyc3RFbGVtZW50KTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZpcnN0ICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoZmlyc3QpOwotCQkJfQotCQkJZWxzZSBpZiAoc3RhcnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShzdGFydEVsZW1lbnQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5ld05leHQpOwotCQkJfQotCQl9Ci0KLQkJcmVtb3ZlSW1wbGljaXRFbGVtZW50KGVsZW1lbnRQYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCU5vZGVJbXBsIG5leHQgPSAoTm9kZUltcGwpIHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQlzaG9ydCBub2RlVHlwZSA9IG5leHQuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXh0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChmbGF0Tm9kZSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJcmVtb3ZlTm9kZShuZXh0KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCQkJLy8gdGhpcyBpcyB0aGUgY2FzZSBmb3IgZW1wdHkgVGV4dAotCQkJCQkvLyByZW1vdmUgYW5kIGNvbnRpbnVlCi0JCQkJCXJlbW92ZU5vZGUobmV4dCk7Ci0JCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG5leHQ7Ci0JCQkJYm9vbGVhbiBpc1NoYXJlZCA9IHRleHQuaXNTaGFyaW5nU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJaWYgKGlzU2hhcmVkKSB7Ci0JCQkJCS8vIG1ha2Ugc3VyZSB0aGVyZSBpcyBuZXh0IFRleHQgbm9kZSBzaGFyaW5nIHRoaXMKLQkJCQkJVGV4dEltcGwgbmV4dFRleHQgPSAoVGV4dEltcGwpIHRoaXMuY29udGV4dC5maW5kTmV4dFRleHQoKTsKLQkJCQkJaWYgKG5leHRUZXh0ID09IG51bGwgfHwgIW5leHRUZXh0Lmhhc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQkJCQlpc1NoYXJlZCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCW9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRleHQucmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCWlmICh0ZXh0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpIHsKLQkJCQkJLy8gdGhpcyBpcyB0aGUgY2FzZSBwYXJ0aWFsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMKLQkJCQkJLy8gcmVtb3ZlZAotCQkJCQlyZW1vdmVOb2RlKHRleHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gbm90aWZ5IHRoZSBjaGFuZ2UKLQkJCQkJdGV4dC5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCQl9Ci0JCQkJLy8gaWYgc2hhcmVkLCBjb250aW51ZSB0byByZW1vdmUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJCS8vIGZyb20gdGhlbQotCQkJCWlmIChpc1NoYXJlZCkKLQkJCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXh0OwotCQkJaWYgKGVsZW1lbnQuaGFzU3RhcnRUYWcoKSkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBlbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGZsYXROb2RlICE9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlpZiAoZWxlbWVudC5oYXNFbmRUYWcoKSB8fCBlbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllbGVtZW50LnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQkJCQlyZW1vdmVTdGFydFRhZyhlbGVtZW50KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlbW92ZU5vZGUoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJTm9kZSBjaGlsZCA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShjaGlsZCk7Ci0JCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKCFlbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJCS8vIGltcGxpY2l0IGVsZW1lbnQKLQkJCQkJcmVtb3ZlTm9kZShlbGVtZW50KTsKLQkJCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZWxlbWVudC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZmxhdE5vZGUgIT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCXJlbW92ZU5vZGUoZWxlbWVudCk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlOb2RlIHBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCUVsZW1lbnRJbXBsIGVuZCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQlpZiAoZW5kLmhhc0VuZFRhZygpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZW5kLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlICE9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoIWVuZC5oYXNTdGFydFRhZygpICYmICFlbmQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKGVuZCk7Ci0JCQkJcmVtb3ZlTm9kZShlbmQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZW5kLnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJCQlyZW1vdmVFbmRUYWcoZW5kKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCW5leHQgPSAoTm9kZUltcGwpIGVuZC5nZXROZXh0U2libGluZygpOwotCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0JCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXBhcmVudCA9IGVuZC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUocGFyZW50KTsKLQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVwbGFjZVJlZ2lvbnMgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5ld1JlZ2lvbnMKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IKLQkgKiBAcGFyYW0gb2xkUmVnaW9ucwotCSAqICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvcgotCSAqLwotCXZvaWQgcmVwbGFjZVJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMsIElUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRoaXMuY29udGV4dCA9IG5ldyBYTUxNb2RlbENvbnRleHQodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpKTsKLQotCQkvLyBvcHRpbWl6ZSB0eXBpY2FsIGNhc2VzCi0JCVN0cmluZyByZWdpb25UeXBlID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRGaXJzdFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgewotCQkJY2hhbmdlU3RhcnRUYWcoZmxhdE5vZGUsIG5ld1JlZ2lvbnMsIG9sZFJlZ2lvbnMpOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQljaGFuZ2VFbmRUYWcoZmxhdE5vZGUsIG5ld1JlZ2lvbnMsIG9sZFJlZ2lvbnMpOwotCQl9Ci0JCWVsc2UgewotCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIG1ldGhvZAotCSAqIAotCSAqLwotCXZvaWQgcmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucykgewotCQlpZiAodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRoaXMuY29udGV4dCA9IG5ldyBYTUxNb2RlbENvbnRleHQodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpKTsKLQotCQlpbnQgbmV3Q291bnQgPSAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsID8gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKSA6IDApOwotCQlpbnQgb2xkQ291bnQgPSAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsID8gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKSA6IDApOwotCi0JCWlmIChvbGRDb3VudCA+IDApIHsKLQkJCXNldHVwQ29udGV4dChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0oMCkpOwotCQkJLy8gTm9kZSBzdGFydFBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCUVudW1lcmF0aW9uIGUgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmVsZW1lbnRzKCk7Ci0JCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZS5uZXh0RWxlbWVudCgpOwotCQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKG5ld0NvdW50ID09IDApCi0JCQkJcmV0dXJuOwotCQkJc2V0dXBDb250ZXh0KG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbSgwKSk7Ci0JCX0KLQkJLy8gbWFrZSBzdXJlIHRoZSBwYXJlbnQgaXMgc2V0IHRvIGRlZXBlc3QgbGV2ZWwKLQkJLy8gd2hlbiBlbmQgdGFnIGhhcyBiZWVuIHJlbW92ZWQKLQkJdGhpcy5jb250ZXh0LnNldExhc3QoKTsKLQotCQlpZiAobmV3Q291bnQgPiAwKSB7Ci0JCQlFbnVtZXJhdGlvbiBlID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5lbGVtZW50cygpOwotCQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCX0KLQkJfQotCi0JCWNsZWFudXBUZXh0KCk7Ci0JCWNsZWFudXBFbmRUYWcoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXR1cENvbnRleHQgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldHVwQ29udGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWludCBvZmZzZXQgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQlpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybjsKLQkJTm9kZUltcGwgcm9vdCA9IChOb2RlSW1wbCkgdGhpcy5jb250ZXh0LmdldFJvb3ROb2RlKCk7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQkvLyBhdCB0aGUgYmVnZ2luaW5nIG9mIGRvY3VtZW50Ci0JCQlOb2RlIGNoaWxkID0gcm9vdC5nZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoY2hpbGQpOwotCQkJZWxzZQotCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKHJvb3QpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTm9kZUltcGwgbm9kZSA9IChOb2RlSW1wbCkgcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJLy8gbWlnaHQgYmUgYXQgdGhlIGVuZCBvZiBkb2N1bWVudAotCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUocm9vdCk7Ci0JCQl0aGlzLmNvbnRleHQuc2V0TGFzdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG9mZnNldCA9PSBub2RlLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShub2RlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG5vZGU7Ci0JCQlUZXh0IG5leHRUZXh0ID0gdGV4dC5zcGxpdFRleHQoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJLy8gbm90aWZ5IHRoZSBjaGFuZ2UKLQkJCXRleHQubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQlpZiAobmV4dFRleHQgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIGVycm9yCi0JCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV4dFRleHQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG9mZnNldCA+PSAoKE5vZGVJbXBsKSBjaGlsZCkuZ2V0RW5kT2Zmc2V0KCkpCi0JCQkJY29udGludWU7Ci0JCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoY2hpbGQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKG5vZGUpOwotCQl0aGlzLmNvbnRleHQuc2V0TGFzdCgpOwotCX0KLQotCXByb3RlY3RlZCBYTUxNb2RlbENvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsVXBkYXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbFVwZGF0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRlZmMyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0vKioKLSAqIFhNTE1vZGVsVXBkYXRlciBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgWE1MTW9kZWxVcGRhdGVyIHsKLQlwcml2YXRlIGludCBkaWZmID0gMDsKLQlwcml2YXRlIGludCBnYXBMZW5ndGggPSAwOwotCXByaXZhdGUgaW50IGdhcE9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJU291cmNlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBET01Nb2RlbEltcGwgbW9kZWwgPSBudWxsOwotCXByaXZhdGUgTm9kZUltcGwgbmV4dE5vZGUgPSBudWxsOwotCXByaXZhdGUgTm9kZUltcGwgcGFyZW50Tm9kZSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgWE1MTW9kZWxVcGRhdGVyKERPTU1vZGVsSW1wbCBtb2RlbCkgewotCQlzdXBlcigpOwotCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCQl0aGlzLmdlbmVyYXRvciA9IG1vZGVsLmdldEdlbmVyYXRvcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2hhbmdlQXR0clZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBhdHRyTm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VBdHRyTmFtZShBdHRyIGF0dHJOb2RlKSB7Ci0JCWlmIChhdHRyTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIGF0dHJOb2RlOwotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCQljaGFuZ2VTdGFydFRhZyhlbGVtZW50KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBvZmZzZXQgPSBlbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBzdGFydCA9IG9mZnNldDsKLQkJaW50IGVuZCA9IG9mZnNldDsKLQotCQlTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJbmFtZSA9IG5ldyBTdHJpbmcoKTsKLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGF0dHIuZ2V0TmFtZVJlZ2lvbigpOwotCQlpZiAobmFtZVJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlzdGFydCArPSBuYW1lUmVnaW9uLmdldFN0YXJ0KCk7Ci0JCS8vIHVzZSBnZXRUZXh0RW5kKCkgYmVjYXVzZSBnZXRFbmQoKSBtYXkgaW5jbHVkZSB0aGUgdGFpbGluZyBzcGFjZXMKLQkJZW5kICs9IG5hbWVSZWdpb24uZ2V0VGV4dEVuZCgpOwotCi0JCXJlcGxhY2VTb3VyY2UobmFtZSwgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogY2hhbmdlQXR0clZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBhdHRyTm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VBdHRyVmFsdWUoQXR0ciBhdHRyTm9kZSkgewotCQlpZiAoYXR0ck5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBhdHRyTm9kZTsKLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJY2hhbmdlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgb2Zmc2V0ID0gZWxlbWVudC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSBvZmZzZXQ7Ci0JCWludCBlbmQgPSBvZmZzZXQ7Ci0KLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBhdHRyLmdldFZhbHVlUmVnaW9uKCk7Ci0JCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQljaGFyIHF1b3RlID0gMDsgLy8gbm8gcXVvdGUgcHJlZmVyZW5jZQotCQkJLy8gRFc6IDQvMTYvMjAwMyBkdWUgdG8gY2hhbmdlIGluIHN0cnVjdHVyZWREb2N1bWVudCAuLi4gd2UgbmVlZCBhCi0JCQkvLyBmbGF0bm9kZSB0bwotCQkJLy8gZ2V0IGF0IHJlZ2lvbiB2YWx1ZXMuIEZvciBub3cgSSdsbCBhc3N1bWUgdGhpcyBpcyBhbHdheXMgdGhlCi0JCQkvLyBmaXJzdAotCQkJLy8gZmxhdG5vZGUgLi4gbWF5IG5lZWQgdG8gbWFrZSBzbWFydGVyIGxhdGVyIChlLmcuIHRvIHNlYXJjaCBmb3IKLQkJCS8vIHRoZSBmbGF0bm9kZSB0aGF0IHRoaXMudmFsdWVSZWdpb24gYmVsb25ncyB0by4KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBlbGVtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlTdHJpbmcgb2xkVmFsdWUgPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHZhbHVlUmVnaW9uKTsKLQkJCWlmIChvbGRWYWx1ZSAhPSBudWxsICYmIG9sZFZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCWNoYXIgZmlyc3RDaGFyID0gb2xkVmFsdWUuY2hhckF0KDApOwotCQkJCWlmIChmaXJzdENoYXIgPT0gJyInIHx8IGZpcnN0Q2hhciA9PSAnXCcnKSB7Ci0JCQkJCXF1b3RlID0gZmlyc3RDaGFyOwotCQkJCX0KLQkJCX0KLQotCQkJSVRleHRSZWdpb24gc3RhcnRSZWdpb24gPSB2YWx1ZVJlZ2lvbjsKLQotCQkJdmFsdWUgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUF0dHJWYWx1ZShhdHRyLCBxdW90ZSk7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCXZhbHVlID0gbmV3IFN0cmluZygpOwotCQkJCS8vIHJlbW92ZSBlcXVhbCB0b28KLQkJCQlJVGV4dFJlZ2lvbiBlcXVhbFJlZ2lvbiA9IGF0dHIuZ2V0RXF1YWxSZWdpb24oKTsKLQkJCQlpZiAoZXF1YWxSZWdpb24gIT0gbnVsbCkKLQkJCQkJc3RhcnRSZWdpb24gPSBlcXVhbFJlZ2lvbjsKLQkJCX0KLQkJCWF0dHIuc2V0VmFsdWVSZWdpb24odmFsdWVSZWdpb24pOyAvLyByZXNldCB2YWx1ZQotCi0JCQlzdGFydCArPSBzdGFydFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJLy8gdXNlIGdldFRleHRFbmQoKSBiZWNhdXNlIGdldEVuZCgpIG1heSBpbmNsdWRlIHRoZSB0YWlsaW5nCi0JCQkvLyBzcGFjZXMKLQkJCWVuZCArPSB2YWx1ZVJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJVGV4dFJlZ2lvbiBlcXVhbFJlZ2lvbiA9IGF0dHIuZ2V0RXF1YWxSZWdpb24oKTsKLQotCQkJdmFsdWUgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUF0dHJWYWx1ZShhdHRyKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJaWYgKGVxdWFsUmVnaW9uID09IG51bGwpCi0JCQkJCXJldHVybjsgLy8gbm90aG5nIHRvIGRvCi0JCQkJdmFsdWUgPSBuZXcgU3RyaW5nKCk7Ci0JCQkJLy8gcmVtb3ZlIGVxdWFsCi0JCQkJc3RhcnQgKz0gZXF1YWxSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQllbmQgKz0gZXF1YWxSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGVxdWFsUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJLy8gdXNlIGdldFRleHRFbmQoKSBiZWNhdXNlIGdldEVuZCgpIG1heSBpbmNsdWRlIHRoZQotCQkJCQkvLyB0YWlsaW5nIHNwYWNlcwotCQkJCQlzdGFydCArPSBlcXVhbFJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gYXR0ci5nZXROYW1lUmVnaW9uKCk7Ci0JCQkJCWlmIChuYW1lUmVnaW9uID09IG51bGwpCi0JCQkJCQlyZXR1cm47IC8vIG11c3QgbmV2ZXIgaGFwcGVuCi0JCQkJCS8vIHVzZSBnZXRUZXh0RW5kKCkgYmVjYXVzZSBnZXRFbmQoKSBtYXkgaW5jbHVkZSB0aGUKLQkJCQkJLy8gdGFpbGluZyBzcGFjZXMKLQkJCQkJc3RhcnQgKz0gbmFtZVJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCQkJCXZhbHVlID0gJz0nICsgdmFsdWU7Ci0JCQkJfQotCQkJCWVuZCA9IHN0YXJ0OwotCQkJfQotCQl9Ci0KLQkJcmVwbGFjZVNvdXJjZSh2YWx1ZSwgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBjaGFuZ2VFbmRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBzb3VyY2UgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUVuZFRhZyhlbGVtZW50KTsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlpZiAobGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0KLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQkJaW50IG9mZnNldCA9IGltcGwuZ2V0RW5kU3RhcnRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gb2Zmc2V0OwotCQlpbnQgZW5kID0gb2Zmc2V0OwotCQlpZiAoaW1wbC5oYXNFbmRUYWcoKSkgewotCQkJZW5kID0gaW1wbC5nZXRFbmRPZmZzZXQoKTsKLQkJCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gaW1wbC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWltcGwuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCkpOwotCQl9Ci0KLQkJcmVwbGFjZVNvdXJjZShzb3VyY2UsIHN0YXJ0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIGNoYW5nZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQl2b2lkIGNoYW5nZU5hbWUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIHN1cHBvcnQgY2hhbmdpbmcgbmFtZSBvZiBhdHRyaWJ1dGUgZm9yIHNldFByZWZpeCgpCi0JCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlpZiAobm9kZVR5cGUgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJY2hhbmdlQXR0ck5hbWUoKEF0dHIpIG5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gbm90IHN1cHBvcnRlZAotCQlyZXR1cm47Ci0JfQotCi0Jdm9pZCBjaGFuZ2VSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCS8vIGZ1dHVyZV9UT0RPOiBvcHRpbWl6ZQotCi0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJdGhpcy5wYXJlbnROb2RlID0gcm9vdDsKLQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgcm9vdC5nZXRGaXJzdENoaWxkKCk7Ci0KLQkJcmVtb3ZlR2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQmVmb3JlKGZsYXROb2RlLmdldFN0YXJ0KCkpOwotCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnRHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25BZnRlcihmbGF0Tm9kZS5nZXRFbmQoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBhIGZhbGxiYWNrIG1ldGhvZCB0byByZWdlbmVyYXRlIHRoZSBzdGFydCB0YWcuCi0JICovCi0Jdm9pZCBjaGFuZ2VTdGFydFRhZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQotCQlpZiAoIWltcGwuaGFzU3RhcnRUYWcoKSAmJiAhaW1wbC5oYXNFbmRUYWcoKSkgewotCQkJLy8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgdGFncwotCQkJTm9kZSBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCXJlcGxhY2VDaGlsZChwYXJlbnQsIGVsZW1lbnQsIGVsZW1lbnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8vIGVsc2UgZXJyb3IKLQkJfQotCi0JCVN0cmluZyBzb3VyY2UgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWlmIChsZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQotCQlpbnQgb2Zmc2V0ID0gaW1wbC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSBvZmZzZXQ7Ci0JCWludCBlbmQgPSBvZmZzZXQ7Ci0JCWlmIChpbXBsLmhhc1N0YXJ0VGFnKCkpIHsKLQkJCWVuZCA9IGltcGwuZ2V0U3RhcnRFbmRPZmZzZXQoKTsKLQkJCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gaW1wbC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl9Ci0JCWltcGwuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKSk7Ci0KLQkJcmVwbGFjZVNvdXJjZShzb3VyY2UsIHN0YXJ0LCBlbmQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlpZiAodGhpcy5wYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJaW50IG9sZE9mZnNldCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQlpbnQgb2xkRW5kID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQlib29sZWFuIGlzRW5kVGFnID0gZmFsc2U7Ci0KLQkJLy8gZmluZCBvd25lciBub2RlCi0JCU5vZGVJbXBsIG93bmVyTm9kZSA9IG51bGw7Ci0JCXdoaWxlICh0aGlzLnBhcmVudE5vZGUgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRoaXMubmV4dE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpZiAobmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJCW93bmVyTm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpbnQgbmV4dE9mZnNldCA9IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJaWYgKG5leHRPZmZzZXQgPT0gb2xkT2Zmc2V0KSB7IC8vIGZvdW5kCi0JCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKHRoaXMubmV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgdGhpcy5uZXh0Tm9kZTsKLQkJCQkJCWlmICh0ZXh0Lmhhc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQkJCQkJb3duZXJOb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWludCBuZXh0RW5kID0gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKTsKLQkJCQkJCWlmIChuZXh0T2Zmc2V0IDwgb2xkRW5kICYmIG5leHRFbmQgPiBvbGRPZmZzZXQpIHsKLQkJCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJTm9kZSBjaGlsZCA9IHRoaXMubmV4dE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMucGFyZW50Tm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIGNoaWxkOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAodGhpcy5uZXh0Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCXRoaXMucGFyZW50Tm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSBudWxsOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0aGlzLm5leHROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmICh0aGlzLnBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRoaXMucGFyZW50Tm9kZTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGVsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQlvd25lck5vZGUgPSB0aGlzLnBhcmVudE5vZGU7Ci0JCQkJCQlpc0VuZFRhZyA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpbnQgZW5kT2Zmc2V0ID0gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJCWlmIChlbmRPZmZzZXQgPT0gb2xkT2Zmc2V0KSB7IC8vIGZvdW5kCi0JCQkJCQlvd25lck5vZGUgPSB0aGlzLnBhcmVudE5vZGU7Ci0JCQkJCQlpc0VuZFRhZyA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGhpcy5wYXJlbnROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl0aGlzLnBhcmVudE5vZGUgPSAoTm9kZUltcGwpIHRoaXMucGFyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJaWYgKG93bmVyTm9kZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQotCQlzaG9ydCBub2RlVHlwZSA9IG93bmVyTm9kZS5nZXROb2RlVHlwZSgpOwotCQlpZiAobm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG93bmVyTm9kZTsKLQkJCWlmIChpc0VuZFRhZykgewotCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQllbGVtZW50LnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJdXBkYXRlQXR0clJlZ2lvbnMoZWxlbWVudCwgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgb3duZXJOb2RlOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gdGV4dC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQlpbnQgbmV3T2Zmc2V0ID0gb2xkT2Zmc2V0OwotCQkJCWludCBuZXdFbmQgPSBvbGRFbmQ7Ci0JCQkJaWYgKG9sZE9mZnNldCA9PSB0aGlzLmdhcE9mZnNldCkgewotCQkJCQluZXdPZmZzZXQgKz0gdGhpcy5kaWZmOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbmV3RW5kID0gdGhpcy5nYXBPZmZzZXQ7Ci0JCQkJfQotCQkJCWludCBuZXdMZW5ndGggPSBuZXdFbmQgLSBuZXdPZmZzZXQ7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkobmV3T2Zmc2V0LCBuZXdMZW5ndGgsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJdGV4dC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQkJCWlmIChvbGRFbmQgPiBuZXdFbmQpIHsKLQkJCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBmbGF0Tm9kZTsKLQkJCQlpbnQgb2Zmc2V0ID0gcHJveHkuZ2V0T2Zmc2V0KCk7Ci0JCQkJaW50IGVuZCA9IG9mZnNldCArIHByb3h5LmdldExlbmd0aCgpOwotCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSB7Ci0JCQkJCWlmIChvZmZzZXQgPT0gb2xkT2Zmc2V0ICYmIGVuZCA9PSBvbGRFbmQpIHsKLQkJCQkJCXRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoZW5kID4gb2xkRW5kKSB7Ci0JCQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoKTsKLQkJCQkJCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJcHJveHkuc2V0T2Zmc2V0KG9sZEVuZCk7Ci0JCQkJCQkJcHJveHkuc2V0TGVuZ3RoKGVuZCAtIG9sZEVuZCk7Ci0JCQkJCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihwcm94eSk7Ci0JCQkJCQkJdGV4dC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGFpbmVyKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXByb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCi0JCQkJCQkJaWYgKGVuZCA8IG9sZEVuZCkgeyAvLyB0byBiZSBzaGFyZWQKLQkJCQkJCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmIChvZmZzZXQgPj0gdGhpcy5nYXBPZmZzZXQpIHsKLQkJCQkJcHJveHkuc2V0T2Zmc2V0KG9mZnNldCArIHRoaXMuZGlmZik7Ci0JCQkJCWVuZCArPSB0aGlzLmRpZmY7Ci0JCQkJfQotCQkJCWlmIChlbmQgPCBvbGRFbmQpIHsgLy8gdG8gYmUgc2hhcmVkCi0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQkJCWNvbnRpbnVlOyAvLyBlcnJvcgotCQkJCQlpZiAoY29udGVudCA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJCWludCBuZXdPZmZzZXQgPSBvbGRPZmZzZXQ7Ci0JCQkJCQlpbnQgbmV3RW5kID0gb2xkRW5kOwotCQkJCQkJaWYgKG9sZE9mZnNldCA9PSB0aGlzLmdhcE9mZnNldCkgewotCQkJCQkJCW5ld09mZnNldCArPSB0aGlzLmRpZmY7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQluZXdFbmQgPSB0aGlzLmdhcE9mZnNldDsKLQkJCQkJCX0KLQkJCQkJCWludCBuZXdMZW5ndGggPSBuZXdFbmQgLSBuZXdPZmZzZXQ7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShuZXdPZmZzZXQsIG5ld0xlbmd0aCwgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCWNvbnRhaW5lci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaSk7Ci0KLQkJCQkJCWlmIChvbGRFbmQgPiBuZXdFbmQpIHsgLy8gdG8gYmUgc2hhcmVkCi0JCQkJCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCQlpbnQgb2Zmc2V0ID0gcHJveHkuZ2V0T2Zmc2V0KCk7Ci0JCQkJCQlpbnQgZW5kID0gb2Zmc2V0ICsgcHJveHkuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQlpZiAoZW5kIDw9IG9sZE9mZnNldCkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSB7Ci0JCQkJCQkJaWYgKG9mZnNldCA9PSBvbGRPZmZzZXQgJiYgZW5kID09IG9sZEVuZCkgewotCQkJCQkJCQljb250YWluZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJaWYgKGVuZCA+IG9sZEVuZCkgewotCQkJCQkJCQkJY29udGFpbmVyLmluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQkJCQkJcHJveHkuc2V0T2Zmc2V0KG9sZEVuZCk7Ci0JCQkJCQkJCQlwcm94eS5zZXRMZW5ndGgoZW5kIC0gb2xkRW5kKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCXByb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCi0JCQkJCQkJCQlpZiAoZW5kIDwgb2xkRW5kKSB7IC8vIHRvIGJlIHNoYXJlZAotCQkJCQkJCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChvZmZzZXQgPj0gdGhpcy5nYXBPZmZzZXQpIHsKLQkJCQkJCQlwcm94eS5zZXRPZmZzZXQob2Zmc2V0ICsgdGhpcy5kaWZmKTsKLQkJCQkJCQllbmQgKz0gdGhpcy5kaWZmOwotCQkJCQkJfQotCQkJCQkJaWYgKGVuZCA8IG9sZEVuZCkgeyAvLyB0byBiZSBzaGFyZWQKLQkJCQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0ZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCW93bmVyTm9kZS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VUZXh0RGF0YShUZXh0IHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgc291cmNlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVTb3VyY2UodGV4dCk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXNvdXJjZSA9IG5ldyBTdHJpbmcoKTsKLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQotCQlUZXh0SW1wbCBpbXBsID0gKFRleHRJbXBsKSB0ZXh0OwotCQlpbnQgc3RhcnQgPSBpbXBsLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSBpbXBsLmdldEVuZE9mZnNldCgpOwotCQlpbnQgb2Zmc2V0ID0gc3RhcnQ7Ci0KLQkJLy8gbWFrZSBzdXJlIHByZXZpb3VzIHRhZyBpcyBjbG9zZWQKLQkJTm9kZSBwcmV2ID0gdGV4dC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJaWYgKHByZXYgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByZVRhZyA9IGdldENsb3NlVGFnKChJRE9NTm9kZSkgcHJldik7Ci0JCQlpZiAocHJlVGFnICE9IG51bGwgJiYgcHJlVGFnLmxlbmd0aCgpID4gMCkgewotCQkJCW9mZnNldCArPSBwcmVUYWcubGVuZ3RoKCk7Ci0JCQkJc291cmNlID0gcHJlVGFnICsgc291cmNlOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJTm9kZSBwYXJlbnQgPSB0ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCQlTdHJpbmcgcHJlVGFnID0gZ2V0U3RhcnRDbG9zZVRhZyhlbGVtZW50KTsKLQkJCQlpZiAocHJlVGFnICE9IG51bGwgJiYgcHJlVGFnLmxlbmd0aCgpID4gMCkgewotCQkJCQlvZmZzZXQgKz0gcHJlVGFnLmxlbmd0aCgpOwotCQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlidWZmZXIuYXBwZW5kKHByZVRhZyk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlKTsKLQkJCQkJaWYgKHRleHQuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsICYmICFlbGVtZW50Lmhhc0VuZFRhZygpICYmIChlbGVtZW50LmlzSlNQQ29udGFpbmVyKCkgfHwgZWxlbWVudC5pc0NEQVRBQ29udGFpbmVyKCkpKSB7Ci0JCQkJCQkvLyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBlbmQgdGFnCi0JCQkJCQlTdHJpbmcgcG9zdFRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlRW5kVGFnKGVsZW1lbnQpOwotCQkJCQkJaWYgKHBvc3RUYWcgIT0gbnVsbCkgewotCQkJCQkJCWludCBwb3N0TGVuZ3RoID0gcG9zdFRhZy5sZW5ndGgoKTsKLQkJCQkJCQlpZiAocG9zdExlbmd0aCA+IDApIHsKLQkJCQkJCQkJYnVmZmVyLmFwcGVuZChwb3N0VGFnKTsKLQkJCQkJCQkJaW50IHBvc3RPZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7Ci0JCQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkocG9zdE9mZnNldCwgcG9zdExlbmd0aCk7Ci0JCQkJCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJc291cmNlID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBpbXBsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JCWlmIChsZW5ndGggPiAwKQotCQkJbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKTsKLQkJaW1wbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQlyZXBsYWNlU291cmNlKHNvdXJjZSwgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogY2hhbmdlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQl2b2lkIGNoYW5nZVZhbHVlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQljaGFuZ2VUZXh0RGF0YSgoVGV4dCkgbm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCWNoYW5nZUF0dHJWYWx1ZSgoQXR0cikgbm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQljaGFuZ2VTdGFydFRhZygoRWxlbWVudCkgbm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgc291cmNlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVTb3VyY2Uobm9kZSk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXNvdXJjZSA9IG5ldyBTdHJpbmcoKTsKLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQotCQlOb2RlSW1wbCBpbXBsID0gKE5vZGVJbXBsKSBub2RlOwotCQlpbnQgc3RhcnQgPSBpbXBsLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSBpbXBsLmdldEVuZE9mZnNldCgpOwotCi0JCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gaW1wbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCWlmIChsZW5ndGggPiAwKQotCQkJZmxhdE5vZGUgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkoc3RhcnQsIGxlbmd0aCk7Ci0JCWltcGwuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQotCQlyZXBsYWNlU291cmNlKHNvdXJjZSwgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXR0clZhbHVlQ2xvc2UoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRMYXN0UmVnaW9uKGZsYXROb2RlKTsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsIHx8IHJlZ2lvbi5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgdmFsdWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gY2hlY2sgb3BlbiBKU1AgdGFnCi0JCWJvb2xlYW4gY2xvc2VKU1BUYWcgPSBmYWxzZTsKLQkJaW50IG9mZnNldCA9IHZhbHVlLmluZGV4T2YoSlNQVGFnLlRBR19PUEVOKTsKLQkJd2hpbGUgKG9mZnNldCA+PSAwKSB7Ci0JCQlvZmZzZXQgPSB2YWx1ZS5pbmRleE9mKEpTUFRhZy5UQUdfQ0xPU0UsIG9mZnNldCArIDIpOwotCQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCQljbG9zZUpTUFRhZyA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlvZmZzZXQgPSB2YWx1ZS5pbmRleE9mKEpTUFRhZy5UQUdfT1BFTiwgb2Zmc2V0ICsgMik7Ci0JCX0KLQotCQkvLyBjaGVjayBxdW90ZQotCQlib29sZWFuIGNsb3NlUXVvdGUgPSBmYWxzZTsKLQkJY2hhciBmaXJzdENoYXIgPSB2YWx1ZS5jaGFyQXQoMCk7Ci0JCWlmIChmaXJzdENoYXIgPT0gJyInIHx8IGZpcnN0Q2hhciA9PSAnXCcnKSB7Ci0JCQlpZiAoY2xvc2VKU1BUYWcgfHwgbGVuZ3RoID09IDEgfHwgdmFsdWUuY2hhckF0KGxlbmd0aCAtIDEpICE9IGZpcnN0Q2hhcikgewotCQkJCWNsb3NlUXVvdGUgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFjbG9zZUpTUFRhZyAmJiAhY2xvc2VRdW90ZSkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChjbG9zZUpTUFRhZykKLQkJCWJ1ZmZlci5hcHBlbmQoSlNQVGFnLlRBR19DTE9TRSk7Ci0JCWlmIChjbG9zZVF1b3RlKQotCQkJYnVmZmVyLmFwcGVuZChmaXJzdENoYXIpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2F0aGVyIGNsb3NlIHRhZ3MgcmVjdXJzaXZlbHkuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xvc2VUYWcoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IG5vZGUuaXNDbG9zZWQoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCXJldHVybiB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUNsb3NlVGFnKG5vZGUpOwotCQl9Ci0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJaWYgKGVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCS8vIGVuZCB0YWcgaXMgbm90IGNsb3NlZAotCQkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlQ2xvc2VUYWcoZWxlbWVudCk7Ci0JCX0KLQotCQkvLyBubyBlbmQgdGFnCi0JCWludCBvZmZzZXQgPSBlbGVtZW50LmdldEVuZE9mZnNldCgpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCUlET01Ob2RlIGxhc3RDaGlsZCA9IChJRE9NTm9kZSkgZWxlbWVudC5nZXRMYXN0Q2hpbGQoKTsKLQkJaWYgKGxhc3RDaGlsZCA9PSBudWxsKSB7Ci0JCQlpZiAoIWVsZW1lbnQuaXNTdGFydFRhZ0Nsb3NlZCgpKSB7Ci0JCQkJaWYgKGVsZW1lbnQucHJlZmVyRW1wdHlUYWcoKSkKLQkJCQkJZWxlbWVudC5zZXRFbXB0eVRhZyh0cnVlKTsKLQkJCQlTdHJpbmcgY2xvc2VUYWcgPSBnZXRTdGFydENsb3NlVGFnKGVsZW1lbnQpOwotCQkJCWlmIChjbG9zZVRhZyAhPSBudWxsKSB7Ci0JCQkJCWludCBsZW5ndGggPSBjbG9zZVRhZy5sZW5ndGgoKTsKLQkJCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoY2xvc2VUYWcpOwotCQkJCQkJb2Zmc2V0ICs9IGxlbmd0aDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBjbG9zZVRhZyA9IGdldENsb3NlVGFnKGxhc3RDaGlsZCk7Ci0JCQlpZiAoY2xvc2VUYWcgIT0gbnVsbCkgewotCQkJCWludCBsZW5ndGggPSBjbG9zZVRhZy5sZW5ndGgoKTsKLQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQlidWZmZXIuYXBwZW5kKGNsb3NlVGFnKTsKLQkJCQkJb2Zmc2V0ICs9IGxlbmd0aDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgZW5kVGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVFbmRUYWcoZWxlbWVudCk7Ci0JCWlmIChlbmRUYWcgIT0gbnVsbCkgewotCQkJaW50IGxlbmd0aCA9IGVuZFRhZy5sZW5ndGgoKTsKLQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChlbmRUYWcpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkob2Zmc2V0LCBsZW5ndGgpOwotCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRTdGFydENsb3NlVGFnKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCBlbGVtZW50LmlzU3RhcnRUYWdDbG9zZWQoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBhdHRyVmFsdWVDbG9zZSA9IGdldEF0dHJWYWx1ZUNsb3NlKGVsZW1lbnQpOwotCQlpZiAoYXR0clZhbHVlQ2xvc2UgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoYXR0clZhbHVlQ2xvc2UpOwotCQlTdHJpbmcgY2xvc2VUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUNsb3NlVGFnKGVsZW1lbnQpOwotCQlpZiAoY2xvc2VUYWcgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoY2xvc2VUYWcpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCQl0aGlzLmdhcE9mZnNldCA9IDA7Ci0JCXRoaXMuZ2FwTGVuZ3RoID0gMDsKLQkJdGhpcy5kaWZmID0gMDsKLQkJdGhpcy5wYXJlbnROb2RlID0gbnVsbDsKLQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkFmdGVyKGludCBlbmRPZmZzZXQpIHsKLQkJaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY29udGVudC5nZXRTdGFydCgpIDwgZW5kT2Zmc2V0KQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gcHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjb250ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJlZm9yZShpbnQgc3RhcnRPZmZzZXQpIHsKLQkJaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY29udGVudC5nZXRTdGFydCgpID49IHN0YXJ0T2Zmc2V0KQotCQkJCQlyZXR1cm47Ci0JCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgY29udGVudDsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlpZiAodGhpcy5wYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJaW50IG5ld09mZnNldCA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQlpbnQgbmV3RW5kID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQlib29sZWFuIGlzRW5kVGFnID0gZmFsc2U7Ci0KLQkJLy8gZmluZCBvd25lciBub2RlCi0JCU5vZGVJbXBsIG93bmVyTm9kZSA9IG51bGw7Ci0JCXdoaWxlICh0aGlzLnBhcmVudE5vZGUgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRoaXMubmV4dE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpbnQgbmV4dE9mZnNldCA9IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJaWYgKG5leHRPZmZzZXQgPT0gbmV3T2Zmc2V0KSB7IC8vIGZvdW5kCi0JCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKHRoaXMubmV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJaW50IG5leHRFbmQgPSBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQkJCQkJaWYgKG5leHRPZmZzZXQgPCBuZXdFbmQgJiYgbmV4dEVuZCA+IG5ld09mZnNldCkgewotCQkJCQkJCW93bmVyTm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlOb2RlIGNoaWxkID0gdGhpcy5uZXh0Tm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJdGhpcy5wYXJlbnROb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgY2hpbGQ7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmICh0aGlzLm5leHROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJdGhpcy5wYXJlbnROb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRoaXMubmV4dE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAodGhpcy5uZXh0Tm9kZSAhPSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKHRoaXMucGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGhpcy5wYXJlbnROb2RlOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZWxlbWVudC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaW50IGVuZE9mZnNldCA9IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJCQlpZiAoZW5kT2Zmc2V0ID09IG5ld09mZnNldCkgeyAvLyBmb3VuZAotCQkJCQkJb3duZXJOb2RlID0gdGhpcy5wYXJlbnROb2RlOwotCQkJCQkJaXNFbmRUYWcgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRoaXMucGFyZW50Tm9kZS5nZXROZXh0U2libGluZygpOwotCQkJdGhpcy5wYXJlbnROb2RlID0gKE5vZGVJbXBsKSB0aGlzLnBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCWlmIChvd25lck5vZGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0KLQkJc2hvcnQgbm9kZVR5cGUgPSBvd25lck5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBvd25lck5vZGU7Ci0JCQlpZiAoaXNFbmRUYWcpIHsKLQkJCQllbGVtZW50LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZWxlbWVudC5zZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCXVwZGF0ZUF0dHJSZWdpb25zKGVsZW1lbnQsIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG93bmVyTm9kZTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gdGV4dC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpbnQgb2xkT2Zmc2V0ID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQlpbnQgb2xkRW5kID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQkJaWYgKG9sZE9mZnNldCA9PSBuZXdPZmZzZXQgJiYgb2xkRW5kID09IG5ld0VuZCkgewotCQkJCXRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCWlmIChvbGRFbmQgPiBuZXdFbmQpIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoKTsKLQkJCQkJaWYgKG9sZE9mZnNldCA9PSBuZXdPZmZzZXQpIHsKLQkJCQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IG5ld1Byb3h5ID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KCk7Ci0JCQkJCQluZXdQcm94eS5zZXRPZmZzZXQob2xkT2Zmc2V0KTsKLQkJCQkJCW5ld1Byb3h5LnNldExlbmd0aChuZXdFbmQgLSBvbGRPZmZzZXQpOwotCQkJCQkJbmV3UHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1Byb3h5KTsKLQkJCQkJfQotCQkJCQlwcm94eS5zZXRPZmZzZXQobmV3RW5kKTsKLQkJCQkJcHJveHkuc2V0TGVuZ3RoKG9sZEVuZCAtIG5ld0VuZCk7Ci0JCQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ocHJveHkpOwotCQkJCQl0ZXh0LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjb250YWluZXIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJCQkJaWYgKG9sZEVuZCA8IG5ld0VuZCkgeyAvLyB0byBiZSBzaGFyZWQKLQkJCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCQkJaW50IG9mZnNldCA9IGNvbnRlbnQuZ2V0U3RhcnQoKTsKLQkJCQkJaW50IGVuZCA9IGNvbnRlbnQuZ2V0RW5kKCk7Ci0JCQkJCWlmIChlbmQgPD0gbmV3T2Zmc2V0KQotCQkJCQkJY29udGludWU7Ci0JCQkJCWlmIChvZmZzZXQgPT0gbmV3T2Zmc2V0ICYmIGVuZCA9PSBuZXdFbmQpIHsKLQkJCQkJCWNvbnRhaW5lci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgY29udGVudDsKLQkJCQkJCWlmIChlbmQgPiBuZXdFbmQpIHsKLQkJCQkJCQlpZiAob2Zmc2V0ID09IG5ld09mZnNldCkgewotCQkJCQkJCQljb250YWluZXIuaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBuZXdQcm94eSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSgpOwotCQkJCQkJCQluZXdQcm94eS5zZXRPZmZzZXQob2Zmc2V0KTsKLQkJCQkJCQkJbmV3UHJveHkuc2V0TGVuZ3RoKG5ld0VuZCAtIG9mZnNldCk7Ci0JCQkJCQkJCW5ld1Byb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCQljb250YWluZXIuaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1Byb3h5LCBpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcHJveHkuc2V0T2Zmc2V0KG5ld0VuZCk7Ci0JCQkJCQkJcHJveHkuc2V0TGVuZ3RoKGVuZCAtIG5ld0VuZCk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJaWYgKGVuZCA9PSBuZXdFbmQpCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChvbGRFbmQgPCBuZXdFbmQpIHsgLy8gdG8gYmUgc2hhcmVkCi0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlvd25lck5vZGUuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlR2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gcHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQkJfQotCQllbHNlIGlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChjb250ZW50ID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQlpZiAoY291bnQgPiAxKQotCQkJCQkJY29udGFpbmVyLnJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQkJZWxzZQotCQkJCQkJdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJCWlmIChjb3VudCA+IDEpCi0JCQkJCQkJY29udGFpbmVyLnJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQl0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJaWYgKHRoaXMucGFyZW50Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWludCBnYXBFbmQgPSB0aGlzLmdhcE9mZnNldCArIHRoaXMuZ2FwTGVuZ3RoOwotCQlpbnQgb2xkT2Zmc2V0ID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWludCBvbGRFbmQgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCk7Ci0JCWlmIChvbGRPZmZzZXQgPj0gdGhpcy5nYXBPZmZzZXQgJiYgb2xkRW5kIDw9IGdhcEVuZCkKLQkJCXJldHVybjsgLy8gZG8gbm90aGluZwotCQlpbnQgb2xkTGVuZ3RoID0gb2xkRW5kIC0gb2xkT2Zmc2V0OwotCQlpZiAob2xkT2Zmc2V0ID49IGdhcEVuZCkKLQkJCW9sZE9mZnNldCArPSB0aGlzLmRpZmY7Ci0KLQkJLy8gZmluZCBvd25lciBub2RlCi0JCU5vZGVJbXBsIG93bmVyTm9kZSA9IG51bGw7Ci0JCUVsZW1lbnRJbXBsIG93bmVyRW5kVGFnID0gbnVsbDsKLQkJVGV4dEltcGwgb3duZXJUZXh0ID0gbnVsbDsKLQkJd2hpbGUgKHRoaXMucGFyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5uZXh0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHRoaXMubmV4dE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCW93bmVyTm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAodGhpcy5uZXh0Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIHRoaXMubmV4dE5vZGU7Ci0JCQkJCWlmICh0ZXh0Lmhhc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQkJb3duZXJUZXh0ID0gdGV4dDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJTm9kZSBjaGlsZCA9IHRoaXMubmV4dE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMucGFyZW50Tm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIGNoaWxkOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAodGhpcy5uZXh0Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCXRoaXMucGFyZW50Tm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSBudWxsOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0aGlzLm5leHROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmICh0aGlzLnBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRoaXMucGFyZW50Tm9kZTsKLQkJCQlpZiAoZWxlbWVudC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJb3duZXJOb2RlID0gdGhpcy5wYXJlbnROb2RlOwotCQkJCQlvd25lckVuZFRhZyA9IGVsZW1lbnQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGhpcy5wYXJlbnROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl0aGlzLnBhcmVudE5vZGUgPSAoTm9kZUltcGwpIHRoaXMucGFyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJaWYgKG93bmVyTm9kZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQotCQlpZiAob3duZXJUZXh0ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBvd25lclRleHQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkob2xkT2Zmc2V0LCBvbGRMZW5ndGgpOwotCQkJCW93bmVyVGV4dC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlOwotCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJaW50IG9mZnNldCA9IHByb3h5LmdldE9mZnNldCgpOwotCQkJCWludCBlbmQgPSBvZmZzZXQgKyBwcm94eS5nZXRMZW5ndGgoKTsKLQkJCQlpZiAob2Zmc2V0ID49IHRoaXMuZ2FwT2Zmc2V0KSB7Ci0JCQkJCXByb3h5LnNldE9mZnNldChvZmZzZXQgKyB0aGlzLmRpZmYpOwotCQkJCX0KLQkJCQlwcm94eS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCQkJaWYgKGVuZCA8IG9sZEVuZCAmJiAoZW5kIDwgdGhpcy5nYXBPZmZzZXQgfHwgb2xkRW5kID4gZ2FwRW5kKSkgeyAvLyBoYXMKLQkJCQkJLy8gc2hhcmVkCi0JCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCQkJaWYgKGNvbnRlbnQgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvbGRPZmZzZXQsIG9sZExlbmd0aCk7Ci0JCQkJCQljb250YWluZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQkJaW50IG9mZnNldCA9IHByb3h5LmdldE9mZnNldCgpOwotCQkJCQkJCWludCBlbmQgPSBvZmZzZXQgKyBwcm94eS5nZXRMZW5ndGgoKTsKLQkJCQkJCQlpZiAob2Zmc2V0ID49IHRoaXMuZ2FwT2Zmc2V0KSB7Ci0JCQkJCQkJCXByb3h5LnNldE9mZnNldChvZmZzZXQgKyB0aGlzLmRpZmYpOwotCQkJCQkJCX0KLQkJCQkJCQlwcm94eS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCQkJCQkJaWYgKGVuZCA8IG9sZEVuZCAmJiAoZW5kIDwgdGhpcy5nYXBPZmZzZXQgfHwgb2xkRW5kID4gZ2FwRW5kKSkgeyAvLyBoYXMKLQkJCQkJCQkJLy8gc2hhcmVkCi0JCQkJCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9sZE9mZnNldCwgb2xkTGVuZ3RoKTsKLQkJCWlmIChvd25lckVuZFRhZyAhPSBudWxsKSB7Ci0JCQkJb3duZXJFbmRUYWcuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlvd25lck5vZGUuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZXBsYWNlQXR0ciBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICogQHBhcmFtIG5ld0F0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gb2xkQXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqLwotCXZvaWQgcmVwbGFjZUF0dHIoRWxlbWVudCBvd25lckVsZW1lbnQsIEF0dHIgbmV3QXR0ciwgQXR0ciBvbGRBdHRyKSB7Ci0JCWlmIChvd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldFN0cnVjdHVyZWREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgb3duZXJFbGVtZW50OwotCQlpZiAoIWVsZW1lbnQuaGFzU3RhcnRUYWcoKSkgewotCQkJY2hhbmdlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCWNoYW5nZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IG9mZnNldCA9IGVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gb2Zmc2V0OwotCQlpbnQgZW5kID0gb2Zmc2V0OwotCi0JCWJvb2xlYW4gaW5zZXJ0U3BhY2UgPSBmYWxzZTsKLQkJU3RyaW5nIGF0dHJWYWx1ZUNsb3NlID0gbnVsbDsKLQkJaWYgKG9sZEF0dHIgIT0gbnVsbCkgewotCQkJQXR0ckltcGwgaW1wbCA9IChBdHRySW1wbCkgb2xkQXR0cjsKLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBpbXBsLmdldE5hbWVSZWdpb24oKTsKLQkJCWlmIChuYW1lUmVnaW9uID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBtdXN0IG5ldmVyIGhhcHBlbgotCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IGltcGwuZ2V0VmFsdWVSZWdpb24oKTsKLQkJCWlmIChsYXN0UmVnaW9uICE9IG51bGwpIHsKLQkJCQllbmQgKz0gbGFzdFJlZ2lvbi5nZXRFbmQoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWxhc3RSZWdpb24gPSBpbXBsLmdldEVxdWFsUmVnaW9uKCk7Ci0JCQkJaWYgKGxhc3RSZWdpb24gIT0gbnVsbCkgewotCQkJCQllbmQgKz0gbGFzdFJlZ2lvbi5nZXRFbmQoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWVuZCArPSBuYW1lUmVnaW9uLmdldEVuZCgpOwotCQkJCQlsYXN0UmVnaW9uID0gbmFtZVJlZ2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBjaGVjayB0aGVyZSBhcmUgZXh0cmEgc3BhY2UgYmVmb3JlIHRoZSBsYXN0IGF0dHJpYnV0ZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gbXVzdCBuZXZlciBoYXBwZW4KLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIG11c3QgbmV2ZXIgaGFwcGVuCi0JCQlJVGV4dFJlZ2lvbiBwcmV2UmVnaW9uID0gbnVsbDsKLQkJCUlUZXh0UmVnaW9uIG5leHRSZWdpb24gPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJaWYgKHJlZ2lvbiA9PSBuYW1lUmVnaW9uKSB7Ci0JCQkJCWlmIChpID4gMCkgewotCQkJCQkJcHJldlJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkgLSAxKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocmVnaW9uID09IGxhc3RSZWdpb24pIHsKLQkJCQkJaWYgKGkgKyAxIDwgcmVnaW9ucy5zaXplKCkpIHsKLQkJCQkJCW5leHRSZWdpb24gPSByZWdpb25zLmdldChpICsgMSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJYm9vbGVhbiBpc0xhc3RBdHRyID0gZmFsc2U7Ci0JCQlpZiAobmV4dFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBuZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UgfHwgaXNOZXN0ZWRUYWdDbG9zZShyZWdpb25UeXBlKSkgewotCQkJCQlpc0xhc3RBdHRyID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXNMYXN0QXR0ciAmJiBwcmV2UmVnaW9uICE9IG51bGwpIHsKLQkJCQlzdGFydCArPSBwcmV2UmVnaW9uLmdldFRleHRFbmQoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0YXJ0ICs9IG5hbWVSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCX0KLQotCQkJLy8gaW1wbC5yZXNldFJlZ2lvbnMob3duZXJFbGVtZW50KTsKLQkJCWltcGwucmVzZXRSZWdpb25zKGVsZW1lbnQpOwotCQl9Ci0JCWVsc2UgeyAvLyBhcHBlbmQgYXR0cmlidXRlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZWxlbWVudC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBtdXN0IG5ldmVyIGhhcHBlbgotCi0JCQlhdHRyVmFsdWVDbG9zZSA9IGdldEF0dHJWYWx1ZUNsb3NlKGVsZW1lbnQpOwotCQkJaWYgKGF0dHJWYWx1ZUNsb3NlICE9IG51bGwgJiYgYXR0clZhbHVlQ2xvc2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJaW5zZXJ0U3BhY2UgPSB0cnVlOwotCQkJCXN0YXJ0ID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJZW5kID0gc3RhcnQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJCQlyZXR1cm47IC8vIG11c3QgbmV2ZXIgaGFwcGVuCi0JCQkJaW50IGF0dHJTdGFydCA9IDA7Ci0JCQkJZm9yIChpbnQgaSA9IHJlZ2lvbnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFIHx8IGlzTmVzdGVkVGFnQ2xvc2UocmVnaW9uVHlwZSkpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaW50IHJlZ2lvbkVuZCA9IHJlZ2lvbi5nZXRFbmQoKTsKLQkJCQkJaWYgKHJlZ2lvbkVuZCA9PSByZWdpb24uZ2V0VGV4dEVuZCgpKQotCQkJCQkJaW5zZXJ0U3BhY2UgPSB0cnVlOwotCQkJCQlhdHRyU3RhcnQgPSByZWdpb25FbmQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoYXR0clN0YXJ0ID09IDApCi0JCQkJCXJldHVybjsgLy8gbm90IGZvdW5kLCBtdXN0IG5ldmVyIGhhcHBlbgotCQkJCXN0YXJ0ICs9IGF0dHJTdGFydDsKLQkJCQllbmQgPSBzdGFydDsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyBzb3VyY2UgPSBudWxsOwotCQlpZiAobmV3QXR0ciAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IDI7Ci0JCQlpZiAoYXR0clZhbHVlQ2xvc2UgIT0gbnVsbCkKLQkJCQlzaXplICs9IGF0dHJWYWx1ZUNsb3NlLmxlbmd0aCgpOwotCQkJU3RyaW5nIG5hbWUgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUF0dHJOYW1lKG5ld0F0dHIpOwotCQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJCQlzaXplICs9IG5hbWUubGVuZ3RoKCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUF0dHJWYWx1ZShuZXdBdHRyKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJCXNpemUgKz0gdmFsdWUubGVuZ3RoKCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzaXplKTsKLQkJCWlmIChhdHRyVmFsdWVDbG9zZSAhPSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQoYXR0clZhbHVlQ2xvc2UpOwotCQkJaWYgKGluc2VydFNwYWNlKQotCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCWJ1ZmZlci5hcHBlbmQobmFtZSk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoJz0nKTsKLQkJCQlidWZmZXIuYXBwZW5kKHZhbHVlKTsKLQkJCX0KLQkJCXNvdXJjZSA9IGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0KLQkJcmVwbGFjZVNvdXJjZShzb3VyY2UsIHN0YXJ0LCBlbmQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkVGFnQ2xvc2UoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiByZXBsYWNlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQl2b2lkIHJlcGxhY2VDaGlsZChOb2RlIHBhcmVudE5vZGUsIE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5ld0NoaWxkID09IG51bGwgJiYgb2xkQ2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldFN0cnVjdHVyZWREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaW50IHN0YXJ0ID0gMDsKLQkJaW50IGVuZCA9IDA7Ci0JCVN0cmluZyBwcmVUYWcgPSBudWxsOwotCQlTdHJpbmcgcG9zdFRhZyA9IG51bGw7Ci0JCUVsZW1lbnRJbXBsIHBvc3RFbGVtZW50ID0gbnVsbDsKLQkJaWYgKG9sZENoaWxkICE9IG51bGwpIHsKLQkJCU5vZGVJbXBsIG5vZGUgPSAoTm9kZUltcGwpIG9sZENoaWxkOwotCQkJc3RhcnQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQllbmQgPSBub2RlLmdldEVuZE9mZnNldCgpOwotCQkJaWYgKG9sZENoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQl0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQl9Ci0JCQlub2RlLnJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOyAvLyByZXNldCB2YWx1ZXMgZnJvbQotCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQl9Ci0JCWVsc2UgewotCQkJTm9kZUltcGwgcHJldiA9IChOb2RlSW1wbCkgbmV3Q2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQlpZiAocHJldiAhPSBudWxsKSB7Ci0JCQkJc3RhcnQgPSBwcmV2LmdldEVuZE9mZnNldCgpOwotCQkJCWVuZCA9IHN0YXJ0OwotCQkJCXByZVRhZyA9IGdldENsb3NlVGFnKHByZXYpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gZmlyc3QgY2hpbGQKLQkJCQlOb2RlSW1wbCBuZXh0ID0gKE5vZGVJbXBsKSBuZXdDaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQkJc3RhcnQgPSBuZXh0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWVuZCA9IHN0YXJ0OwotCQkJCQlpZiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlwcmVUYWcgPSBnZXRTdGFydENsb3NlVGFnKChJRE9NRWxlbWVudCkgcGFyZW50Tm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG5ld2x5IGhhdmluZyBhIGNoaWxkCi0JCQkJCWlmIChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudE5vZGU7Ci0JCQkJCQlpZiAoZWxlbWVudC5pc0VtcHR5VGFnKCkpIHsgLy8gZW1wdHkgdGFnIGZvcm1hdAotCQkJCQkJCS8vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIHRhZ3MKLQkJCQkJCQllbmQgPSBlbGVtZW50LmdldEVuZE9mZnNldCgpOwotCQkJCQkJCXN0YXJ0ID0gZW5kIC0gMjsgLy8gZm9yICIvPiIKLQkJCQkJCQllbGVtZW50LnNldEVtcHR5VGFnKGZhbHNlKTsKLQkJCQkJCQlwcmVUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUNsb3NlVGFnKGVsZW1lbnQpOwotCQkJCQkJCXBvc3RUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUVuZFRhZyhlbGVtZW50KTsKLQkJCQkJCQlwb3N0RWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmICghZWxlbWVudC5oYXNTdGFydFRhZygpKSB7Ci0JCQkJCQkJc3RhcnQgPSBlbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQkJZW5kID0gc3RhcnQ7Ci0JCQkJCQkJLy8gaW52YWxpZCBlbmQgdGFnIG9yIGltcGxpY2l0IHRhZwotCQkJCQkJCS8vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIHN0YXJ0IHRhZwotCQkJCQkJCXByZVRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCQkJCQkJaWYgKHByZVRhZyAhPSBudWxsKSB7Ci0JCQkJCQkJCWludCBsZW5ndGggPSBwcmVUYWcubGVuZ3RoKCk7Ci0JCQkJCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KHN0YXJ0LCBsZW5ndGgpOwotCQkJCQkJCQkJZWxlbWVudC5zZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKCFlbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJCQkJCS8vIGltcGxpY2l0IHRhZwotCQkJCQkJCQkvLyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBlbmQgdGFncwotCQkJCQkJCQlwb3N0VGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVFbmRUYWcoZWxlbWVudCk7Ci0JCQkJCQkJCXBvc3RFbGVtZW50ID0gZWxlbWVudDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlzdGFydCA9IGVsZW1lbnQuZ2V0U3RhcnRFbmRPZmZzZXQoKTsKLQkJCQkJCQllbmQgPSBzdGFydDsKLQkJCQkJCQlwcmVUYWcgPSBnZXRTdGFydENsb3NlVGFnKGVsZW1lbnQpOwotCQkJCQkJCWlmIChwcmVUYWcgIT0gbnVsbCAmJiBwcmVUYWcubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCWlmICghZWxlbWVudC5oYXNFbmRUYWcoKSAmJiAoZWxlbWVudC5pc0pTUENvbnRhaW5lcigpIHx8IGVsZW1lbnQuaXNDREFUQUNvbnRhaW5lcigpKSkgewotCQkJCQkJCQkJLy8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgZW5kIHRhZwotCQkJCQkJCQkJcG9zdFRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlRW5kVGFnKGVsZW1lbnQpOwotCQkJCQkJCQkJcG9zdEVsZW1lbnQgPSBlbGVtZW50OwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIGVsc2UgbWlnaHQgRE9DVU1FTlRfTk9ERSwgc3RhcnQgYW5kIGVuZCBhcmUgMAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCVN0cmluZyBzb3VyY2UgPSBudWxsOwotCQlpZiAobmV3Q2hpbGQgIT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWludCBvZmZzZXQgPSBzdGFydDsKLQkJCWlmIChwcmVUYWcgIT0gbnVsbCkgewotCQkJCWludCBsZW5ndGggPSBwcmVUYWcubGVuZ3RoKCk7Ci0JCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJb2Zmc2V0ICs9IGxlbmd0aDsKLQkJCQkJYnVmZmVyLmFwcGVuZChwcmVUYWcpOwotCQkJCX0KLQkJCX0KLQotCQkJTm9kZUltcGwgbm9kZSA9IChOb2RlSW1wbCkgbmV3Q2hpbGQ7Ci0JCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJCQlpZiAoZWxlbWVudC5wcmVmZXJFbXB0eVRhZygpKQotCQkJCQkJZWxlbWVudC5zZXRFbXB0eVRhZyh0cnVlKTsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCQkJCVN0cmluZyBzdGFydFRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCQkJCWlmIChzdGFydFRhZyAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgbGVuZ3RoID0gc3RhcnRUYWcubGVuZ3RoKCk7Ci0JCQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoc3RhcnRUYWcpOwotCQkJCQkJCWZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJCQlvZmZzZXQgKz0gbGVuZ3RoOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsZW1lbnQuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJU3RyaW5nIGNvbnRlbnQgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZVNvdXJjZShub2RlKTsKLQkJCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQkJCWNvbnRlbnQgPSBuZXcgU3RyaW5nKCk7Ci0JCQkJCWludCBsZW5ndGggPSBjb250ZW50Lmxlbmd0aCgpOwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQkJCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoY29udGVudCk7Ci0JCQkJCQlmbGF0Tm9kZSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCQlvZmZzZXQgKz0gbGVuZ3RoOwotCQkJCQl9Ci0JCQkJCW5vZGUuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9Ci0KLQkJCQlOb2RlSW1wbCBjaGlsZCA9IChOb2RlSW1wbCkgbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJbm9kZSA9IGNoaWxkOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQkJCQlTdHJpbmcgZW5kVGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVFbmRUYWcoZWxlbWVudCk7Ci0JCQkJCWlmIChlbmRUYWcgIT0gbnVsbCkgewotCQkJCQkJaW50IGxlbmd0aCA9IGVuZFRhZy5sZW5ndGgoKTsKLQkJCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZChlbmRUYWcpOwotCQkJCQkJCWZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJCQlvZmZzZXQgKz0gbGVuZ3RoOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9Ci0KLQkJCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChub2RlID09IG5ld0NoaWxkKSB7Ci0JCQkJCQlub2RlID0gbnVsbDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCU5vZGVJbXBsIG5leHQgPSAoTm9kZUltcGwpIG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCQkJbm9kZSA9IG5leHQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCi0JCQkJCW5vZGUgPSAoTm9kZUltcGwpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJY29udGludWU7Ci0JCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQkJCQlTdHJpbmcgZW5kVGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVFbmRUYWcoZWxlbWVudCk7Ci0JCQkJCWlmIChlbmRUYWcgIT0gbnVsbCkgewotCQkJCQkJaW50IGxlbmd0aCA9IGVuZFRhZy5sZW5ndGgoKTsKLQkJCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCQkJYnVmZmVyLmFwcGVuZChlbmRUYWcpOwotCQkJCQkJCWZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKTsKLQkJCQkJCQlvZmZzZXQgKz0gbGVuZ3RoOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChwb3N0VGFnICE9IG51bGwpIHsKLQkJCQlpbnQgbGVuZ3RoID0gcG9zdFRhZy5sZW5ndGgoKTsKLQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQlidWZmZXIuYXBwZW5kKHBvc3RUYWcpOwotCQkJCQlpZiAocG9zdEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCQlwb3N0RWxlbWVudC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc291cmNlID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlpZiAoc3RhcnQgPT0gZW5kICYmIChzb3VyY2UgPT0gbnVsbCB8fCBzb3VyY2UubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIG5vIHRoaW5nIGNoYW5nZWQKLQkJCXJldHVybjsKLQkJfQotCi0JCXJlcGxhY2VTb3VyY2Uoc291cmNlLCBzdGFydCwgZW5kKTsKLQl9Ci0KLQl2b2lkIHJlcGxhY2VSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zLCBJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucykgewotCQkvLyBmdXR1cmVfVE9ETzogb3B0aW1pemUKLQotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCk7Ci0JCXRoaXMucGFyZW50Tm9kZSA9IHJvb3Q7Ci0JCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHJvb3QuZ2V0Rmlyc3RDaGlsZCgpOwotCi0JCXJlbW92ZUdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJlZm9yZShmbGF0Tm9kZS5nZXRTdGFydCgpKTsKLQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQWZ0ZXIoZmxhdE5vZGUuZ2V0RW5kKCkpOwotCX0KLQotCS8qKgotCSAqIFdyYXBzIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ucmVwbGFjZVRleHQoKSBhbmQgc2V0cyBjb250ZXh0dWFsCi0JICogaW5mb3JtYXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlcGxhY2VTb3VyY2UoU3RyaW5nIHNvdXJjZSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWludCBpbnNlcnRlZCA9IDA7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXNvdXJjZSA9IG5ldyBTdHJpbmcoKTsKLQkJZWxzZQotCQkJaW5zZXJ0ZWQgPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWludCByZW1vdmVkID0gZW5kIC0gc3RhcnQ7Ci0JCWlmIChpbnNlcnRlZCA9PSAwICYmIHJlbW92ZWQgPT0gMCkKLQkJCXJldHVybjsKLQotCQl0aGlzLmdhcE9mZnNldCA9IHN0YXJ0OwotCQl0aGlzLmdhcExlbmd0aCA9IHJlbW92ZWQ7Ci0JCXRoaXMuZGlmZiA9IGluc2VydGVkIC0gcmVtb3ZlZDsKLQkJLy8gTm90ZTogZHVlIHRvIGJ1ZwotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzYxOQotCQkvLyBmb3Igbm93IGFzc3VtZSAiaWdub3JlIHJlYWRvbmx5IiByZWdpb24gaXMgb2sgLS0gYXNzdW1lIERPTSBpdHNlbGYKLQkJLy8gY2hlY2tzIGlmCi0JCS8vIG9rIHRvIGluc2VydCBvciBub3QuIEluIHJlYWxpdHksIHdlIG1heSBoYXZlIHRvIG1ha2Ugb3IgImNvbnRhaW5zIgotCQkvLyBtZXRob2QgbW9yZQotCQkvLyBiZXR0ZXIuIE9yLCB3ZSBtYXkgaGF2ZSB0byAicGVyY3VsYXRlIHVwIiB0aGUgcGFyYW1ldGVyIGZvciBjbGllbnRzCi0JCS8vIHRvIHRlbGwgdXMgcHJvZ3JhbWF0aWNhbGx5Ci0JCS8vIHRoYXQgaXRzIG9rIHRvIGluc2VydC9mb3JtYXQgaW4gYSByZWFkLW9ubHkgcmVnaW9uLgotCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLm1vZGVsLCB0aGlzLmdhcE9mZnNldCwgdGhpcy5nYXBMZW5ndGgsIHNvdXJjZSwgdHJ1ZSk7Ci0JfQotCi0Jdm9pZCByZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKSB7Ci0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudE5vZGUgPSByb290OwotCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgcm9vdC5nZXRGaXJzdENoaWxkKCk7Ci0KLQkJCUVudW1lcmF0aW9uIGUgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmVsZW1lbnRzKCk7Ci0JCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZS5uZXh0RWxlbWVudCgpOwotCQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCXJlbW92ZUdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudE5vZGUgPSByb290OwotCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgcm9vdC5nZXRGaXJzdENoaWxkKCk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JCQlFbnVtZXJhdGlvbiBlID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5lbGVtZW50cygpOwotCQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQmVmb3JlKGZsYXROb2RlLmdldFN0YXJ0KCkpOwotCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGZsYXROb2RlOwotCQkJfQotCQkJaWYgKGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkFmdGVyKGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQmVmb3JlKHRoaXMuZ2FwT2Zmc2V0KTsKLQkJCQkvLyBtYWtlIHN1cmUgdG8gcmVzdG9yZSBhbGwgYmFja3VwZWQgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCQkJCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkFmdGVyKHRoaXMuZ2FwT2Zmc2V0KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMucGFyZW50Tm9kZSA9IHJvb3Q7Ci0JCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSByb290LmdldEZpcnN0Q2hpbGQoKTsKLQotCQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQmVmb3JlKHRoaXMuZ2FwT2Zmc2V0KTsKLQkJCS8vIG1ha2Ugc3VyZSB0byByZXN0b3JlIGFsbCBiYWNrdXBlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zCi0JCQlpbnNlcnRHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25BZnRlcih0aGlzLmdhcE9mZnNldCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlQXR0clJlZ2lvbnMoRWxlbWVudCBlbGVtZW50LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0KLQkJLy8gdXBkYXRlIGF0dHJpYnV0ZXMKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBpbmRleCA9IC0xOwotCQlBdHRySW1wbCBhdHRyID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJYXR0ciA9IChBdHRySW1wbCkgYXR0cmlidXRlcy5pdGVtKCsraW5kZXgpOwotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXROYW1lUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCS8vIHJlc2V0IG90aGVyIHJlZ2lvbnMKLQkJCQkJYXR0ci5zZXRFcXVhbFJlZ2lvbihudWxsKTsKLQkJCQkJYXR0ci5zZXRWYWx1ZVJlZ2lvbihudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCQkJYXR0ci5zZXRFcXVhbFJlZ2lvbihyZWdpb24pOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldFZhbHVlUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWF0dHIgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3ZjY0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL1hNTERvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgYW5kIHBhcnNlcyBmaXJzdCBvZiBYTUwgZmlsZSB0byBnZXQgZW5jb2RpbmcuCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxEb2N1bWVudENoYXJzZXREZXRlY3RvciBleHRlbmRzIFhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElEb2N1bWVudENoYXJzZXREZXRlY3RvciB7Ci0KLQkvKioKLQkgKiBYTUxMb2FkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlzZXQobmV3IERvY3VtZW50UmVhZGVyKGRvY3VtZW50LCAwKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9YTUxEb2N1bWVudExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9YTUxEb2N1bWVudExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzE2YjM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvWE1MRG9jdW1lbnRMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5BYnN0cmFjdERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgYW4gWE1MIGZpbGUgYW5kIGNyZWF0ZXMgYW4gWE1MIFN0cnVjdHVyZWQgTW9kZWwuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFhNTERvY3VtZW50TG9hZGVyIGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudExvYWRlciB7Ci0KLQlwdWJsaWMgWE1MRG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJaWYgKGZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9IG5ldyBYTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCQl9Ci0JCXJldHVybiBmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlyZXR1cm4gbmV3IFhNTFNvdXJjZVBhcnNlcigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihJRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBkZWxpbWl0ZXIgPSBDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKTsKLQkJaWYgKGRlbGltaXRlciA9PSBudWxsKQotCQkJZGVsaW1pdGVyID0gc3VwZXIuZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihmaWxlKTsKLQkJcmV0dXJuIGRlbGltaXRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIFVURi04IGFzIHBlciBYTUwgc3BlYwotCQlmaW5hbCBTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCXByb3RlY3RlZCBJRW5jb2RlZERvY3VtZW50IG5ld0VuY29kZWREb2N1bWVudCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKGdldFBhcnNlcigpKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCBpbnN0YW5jZW9mIEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLnNldFJlUGFyc2VyKG5ldyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpKTsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgWE1MRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0RlZmF1bHRYTUxQYXJ0aXRpb25Gb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0RlZmF1bHRYTUxQYXJ0aXRpb25Gb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc3YjE2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9EZWZhdWx0WE1MUGFydGl0aW9uRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5EZWxldGVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuSW5zZXJ0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNTmFtZWROb2RlTWFwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0WE1MUGFydGl0aW9uRm9ybWF0dGVyIHsKLQkvKioKLQkgKiBKdXN0IGEgc21hbGwgY29udGFpbmVyIGNsYXNzIHRoYXQgaG9sZHMgYSBET01Ob2RlICYgZG9jdW1lbnRSZWdpb24gdGhhdAotCSAqIHNob3VsZCByZXByZXNlbnQgZWFjaCBvdGhlci4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgRE9NUmVnaW9uIHsKLQkJcHVibGljIElET01Ob2RlIGRvbU5vZGU7Ci0JCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uOwotCX0KLQotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBQUkVTRVJWRSA9ICJwcmVzZXJ2ZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBQUkVTRVJWRV9RVU9URUQgPSAiXCJwcmVzZXJ2ZVwiIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFhNTF9TUEFDRSA9ICJ4bWw6c3BhY2UiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgWFNMX05BTUVTUEFDRSA9ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFhTTF9BVFRSSUJVVEUgPSAiYXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBYU0xfVEVYVCA9ICJ0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBTUEFDRSA9ICIgIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBTVFJJTkcgPSAic3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMgZlByZWZlcmVuY2VzID0gbnVsbDsKLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvcjsKLQotCXByaXZhdGUgaW50IGNvbGxhcHNlU3BhY2VzKFRleHRFZGl0IHRleHRFZGl0LCBpbnQgc3BhY2VTdGFydE9mZnNldCwgaW50IGF2YWlsYWJsZUxpbmVXaWR0aCwgU3RyaW5nIHdoaXRlc3BhY2VSdW4pIHsKLQkJLy8gcHJlZmVyIHRvIHVzZSB1c2UgZXhpc3Rpbmcgd2hpdGVzcGFjZQotCQlpbnQgZXhpc3RpbmdXaGl0ZXNwYWNlT2Zmc2V0ID0gd2hpdGVzcGFjZVJ1bi5pbmRleE9mKCcgJyk7Ci0JCWlmIChleGlzdGluZ1doaXRlc3BhY2VPZmZzZXQgPiAtMSkgewotCQkJLy8gZGVsZXRlIHdoaXRlc3BhY2VzIGJlZm9yZSBhbmQgYWZ0ZXIgZXhpc3Rpbmcgd2hpdGVzcGFjZQotCQkJaWYgKGV4aXN0aW5nV2hpdGVzcGFjZU9mZnNldCA+IDApIHsKLQkJCQlEZWxldGVFZGl0IGRlbGV0ZUVkaXQgPSBuZXcgRGVsZXRlRWRpdChzcGFjZVN0YXJ0T2Zmc2V0LCBleGlzdGluZ1doaXRlc3BhY2VPZmZzZXQpOwotCQkJCXRleHRFZGl0LmFkZENoaWxkKGRlbGV0ZUVkaXQpOwotCQkJfQotCQkJaWYgKGV4aXN0aW5nV2hpdGVzcGFjZU9mZnNldCA8IHdoaXRlc3BhY2VSdW4ubGVuZ3RoKCkgLSAxKSB7Ci0JCQkJaW50IG5leHRPZmZzZXQgPSBleGlzdGluZ1doaXRlc3BhY2VPZmZzZXQgKyAxOwotCQkJCURlbGV0ZUVkaXQgZGVsZXRlRWRpdCA9IG5ldyBEZWxldGVFZGl0KHNwYWNlU3RhcnRPZmZzZXQgKyBuZXh0T2Zmc2V0LCB3aGl0ZXNwYWNlUnVuLmxlbmd0aCgpIC0gbmV4dE9mZnNldCk7Ci0JCQkJdGV4dEVkaXQuYWRkQ2hpbGQoZGVsZXRlRWRpdCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBkZWxldGUgYWxsIHdoaXRlc3BhY2UgYW5kIGluc2VydCBuZXcgb25lCi0JCQkvLyBjb2xsYXBzZSB3aGl0ZXNwYWNlIGJ5IGRlbGV0aW5nIHdoaXRlc3BhY2UKLQkJCURlbGV0ZUVkaXQgZGVsZXRlRWRpdCA9IG5ldyBEZWxldGVFZGl0KHNwYWNlU3RhcnRPZmZzZXQsIHdoaXRlc3BhY2VSdW4ubGVuZ3RoKCkpOwotCQkJdGV4dEVkaXQuYWRkQ2hpbGQoZGVsZXRlRWRpdCk7Ci0JCQkvLyB0aGVuIGluc2VydCBvbmUgc3BhY2UKLQkJCUluc2VydEVkaXQgaW5zZXJ0RWRpdCA9IG5ldyBJbnNlcnRFZGl0KHNwYWNlU3RhcnRPZmZzZXQsIFNQQUNFKTsKLQkJCXRleHRFZGl0LmFkZENoaWxkKGluc2VydEVkaXQpOwotCQl9Ci0JCS8vIHJlbWVtYmVyIHRvIGFjY291bnQgZm9yIHNwYWNlIGFkZGVkCi0JCS0tYXZhaWxhYmxlTGluZVdpZHRoOwotCQlyZXR1cm4gYXZhaWxhYmxlTGluZVdpZHRoOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWxldGVUcmFpbGluZ1NwYWNlcyhUZXh0RWRpdCB0ZXh0RWRpdCwgSVRleHRSZWdpb24gY3VycmVudFRleHRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudERvY3VtZW50UmVnaW9uKSB7Ci0JCWludCB0ZXh0RW5kID0gY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQlpbnQgdGV4dEVuZE9mZnNldCA9IGN1cnJlbnREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpICsgdGV4dEVuZDsKLQkJaW50IGRpZmZlcmVuY2UgPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRFbmQoKSAtIHRleHRFbmQ7Ci0JCURlbGV0ZUVkaXQgZGVsZXRlRWRpdCA9IG5ldyBEZWxldGVFZGl0KHRleHRFbmRPZmZzZXQsIGRpZmZlcmVuY2UpOwotCQl0ZXh0RWRpdC5hZGRDaGlsZChkZWxldGVFZGl0KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dEVkaXQgZm9ybWF0KElEb2N1bWVudCBkb2N1bWVudCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBmb3JtYXQoZG9jdW1lbnQsIHN0YXJ0LCBsZW5ndGgsIG5ldyBYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKSk7Ci0JfQotCi0JcHVibGljIFRleHRFZGl0IGZvcm1hdChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBzdGFydCwgaW50IGxlbmd0aCwgWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzIHByZWZlcmVuY2VzKSB7Ci0JCVRleHRFZGl0IGVkaXQgPSBudWxsOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZWRpdCA9IGZvcm1hdChtb2RlbCwgc3RhcnQsIGxlbmd0aCwgcHJlZmVyZW5jZXMpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlZGl0OwotCX0KLQotCXB1YmxpYyBUZXh0RWRpdCBmb3JtYXQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBmb3JtYXQobW9kZWwsIHN0YXJ0LCBsZW5ndGgsIG5ldyBYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKSk7Ci0JfQotCi0JcHVibGljIFRleHRFZGl0IGZvcm1hdChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBpbnQgc3RhcnQsIGludCBsZW5ndGgsIFhNTEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcykgewotCQlzZXRGb3JtYXR0aW5nUHJlZmVyZW5jZXMocHJlZmVyZW5jZXMpOwotCi0JCVRleHRFZGl0IGVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCS8vIGdldCBpbml0aWFsIGRvY3VtZW50IHJlZ2lvbgotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBkb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCk7Ci0JCWlmIChjdXJyZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCWludCBzdGFydE9mZnNldCA9IGN1cnJlbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQkJLy8gZ2V0IGluaXRpYWwgZG9tIG5vZGUKLQkJCUluZGV4ZWRSZWdpb24gY3VycmVudEluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0T2Zmc2V0KTsKLQkJCWlmIChjdXJyZW50SW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJLy8gc2V0IHVwIGRvbVJlZ2lvbiB3aGljaCB3aWxsIGNvbnRhaW4gY3VycmVudCByZWdpb24gdG8gYmUKLQkJCQkvLyBmb3JtYXR0ZWQKLQkJCQlJRE9NTm9kZSBjdXJyZW50RE9NTm9kZSA9IChJRE9NTm9kZSkgY3VycmVudEluZGV4ZWRSZWdpb247Ci0JCQkJRE9NUmVnaW9uIGRvbVJlZ2lvbiA9IG5ldyBET01SZWdpb24oKTsKLQkJCQlkb21SZWdpb24uZG9jdW1lbnRSZWdpb24gPSBjdXJyZW50UmVnaW9uOwotCQkJCWRvbVJlZ2lvbi5kb21Ob2RlID0gY3VycmVudERPTU5vZGU7Ci0JCQkJCi0JCQkJWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHBhcmVudENvbnN0cmFpbnRzID0gZ2V0UmVnaW9uQ29uc3RyYWludHMoY3VycmVudERPTU5vZGUpOwotCQkJCQotCQkJCS8qIGlmIHRoZSB3aGl0ZXNwYWNlIHN0cmF0ZWd5IGlzIGRlY2xhcmVkIGFzIGRlZmF1bHQsIGdldCBpdCBmcm9tIHRoZSBwcmVmZXJlbmNlcyAqLwotCQkJCWlmKHBhcmVudENvbnN0cmFpbnRzLmdldFdoaXRlc3BhY2VTdHJhdGVneSgpID09IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5ERUZBVUxUKQotCQkJCQlwYXJlbnRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3kocHJlZmVyZW5jZXMuZ2V0RWxlbWVudFdoaXRlc3BhY2VTdHJhdGVneSgpKTsKLQkJCQkKLQkJCQkvLyBUT0RPOiBpbml0aWFsaXplIGluZGVudExldmVsCi0JCQkJLy8gaW5pdGlhbGl6ZSBhdmFpbGFibGUgbGluZSB3aWR0aAotCQkJCWludCBsaW5lV2lkdGggPSBnZXRGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKS5nZXRNYXhMaW5lV2lkdGgoKTsKLQkJCQl0cnkgewotCQkJCQlJUmVnaW9uIGxpbmVJbmZvID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoc3RhcnRPZmZzZXQpOwotCQkJCQlsaW5lV2lkdGggPSBsaW5lV2lkdGggLSAoc3RhcnRPZmZzZXQgLSBsaW5lSW5mby5nZXRPZmZzZXQoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQkJcGFyZW50Q29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGxpbmVXaWR0aCk7Ci0KLQkJCQkvLyBmb3JtYXQgYWxsIHNpYmxpbmdzIChhbmQgdGhlaXIgY2hpbGRyZW4pIGFzIGxvbmcgdGhleQotCQkJCS8vIG92ZXJsYXAgd2l0aCBzdGFydC9sZW5ndGgKLQkJCQlQb3NpdGlvbiBmb3JtYXRSYW5nZSA9IG5ldyBQb3NpdGlvbihzdGFydCwgbGVuZ3RoKTsKLQkJCQlmb3JtYXRTaWJsaW5ncyhlZGl0LCBkb21SZWdpb24sIHBhcmVudENvbnN0cmFpbnRzLCBmb3JtYXRSYW5nZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVkaXQ7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB0aGUgZm9ybWF0dGluZyBjb25zdHJhaW50cyBmb3IgYSBzcGVjaWZpZWQgbm9kZSBiYXNlZCBvbgotCSAqIGl0cyBhbmNlc3RvcnMnIGZvcm1hdHRpbmcuIEluIHBhcnRpY3VsYXIsIGlmIGFueSBhbmNlc3RvciBub2RlIGVpdGhlcgotCSAqIGV4cGxpY2l0bHkgZGVmaW5lcyB3aGl0ZXNwYWNlIHByZXNlcnZhdGlvbiBvciBpZ25vcmFuY2UsIHRoYXQKLQkgKiB3aGl0ZXNwYWNlIHN0cmF0ZWd5IHNob3VsZCBiZSB1c2VkIGZvciA8Y29kZT5jdXJyZW50Tm9kZTwvY29kZT4gYW5kIAotCSAqIGFsbCBvZiBpdHMgZGVzY2VuZGFudHMuCi0JICogCi0JICogQHBhcmFtIGN1cnJlbnROb2RlIHRoZSBub2RlIHRvIGludmVzdGlnYXRlIHRoZSBhbmNlc3RyeSBvZiB0byBkZXRlcm1pbmUKLQkgKiBmb3JtYXR0aW5nIGNvbnN0cmFpbnRzCi0JICogCi0JICogQHJldHVybiBmb3JtYXR0aW5nIGNvbnN0cmFpbnRzIGRlZmluZWQgYnkgYW4gYW5jZXN0b3IKLQkgKi8KLQlwcml2YXRlIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBnZXRSZWdpb25Db25zdHJhaW50cyhJRE9NTm9kZSBjdXJyZW50Tm9kZSkgewotCQlJRE9NTm9kZSBpdGVyYXRvciA9IGN1cnJlbnROb2RlOwotCQlYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgcmVzdWx0ID0gbmV3IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cygpOwotCQlET01SZWdpb24gcmVnaW9uID0gbmV3IERPTVJlZ2lvbigpOwotCQlYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgcGFyZW50Q29uc3RyYWludHMgPSBuZXcgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzKCk7Ci0JCWJvb2xlYW4gcGFyZW50ID0gdHJ1ZTsKLQkJCi0JCS8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgYW5jZXN0cnkgdG8gZmluZCBpZiBhbnkgZXhwbGljaXQgd2hpdGVzcGFjZSBzdHJhdGVneSBoYXMKLQkJICogYmVlbiBkZWZpbmVkCi0JCSAqLwotCQl3aGlsZShpdGVyYXRvciAhPSBudWxsICYmIGl0ZXJhdG9yLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlpdGVyYXRvciA9IChJRE9NTm9kZSkgaXRlcmF0b3IuZ2V0UGFyZW50Tm9kZSgpOwotCQkJcmVnaW9uLmRvbU5vZGUgPSBpdGVyYXRvcjsKLQkJCXJlZ2lvbi5kb2N1bWVudFJlZ2lvbiA9IGl0ZXJhdG9yLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkKLQkJCXVwZGF0ZUZvcm1hdHRpbmdDb25zdHJhaW50cyhudWxsLCBudWxsLCByZXN1bHQsIHJlZ2lvbik7Ci0JCQkKLQkJCS8qIElmIHRoaXMgaXMgdGhlIHBhcmVudCBvZiB0aGUgY3VycmVudCBub2RlLCBrZWVwIHRoZSBjb25zdHJhaW50cwotCQkJICogaW4gY2FzZSBubyBvdGhlciBjb25zdHJhaW50cyBhcmUgaWRlbnRpZmllZAotCQkJICovCi0JCQlpZihwYXJlbnQpIHsKLQkJCQlwYXJlbnRDb25zdHJhaW50cy5jb3B5Q29uc3RyYWludHMocmVzdWx0KTsKLQkJCQlwYXJlbnQgPSBmYWxzZTsKLQkJCX0KLQkJCQotCQkJLyogQSBwYXJlbnQgd2hvIGhhcyBkZWZpbmVkIGEgc3BlY2lmaWMgd2hpdGVzcGFjZSBzdHJhdGVneSB3YXMgZm91bmQgKi8KLQkJCWlmKFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5QUkVTRVJWRSA9PSByZXN1bHQuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkgfHwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLkRFRkFVTFQgPT0gcmVzdWx0LmdldFdoaXRlc3BhY2VTdHJhdGVneSgpKQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXJldHVybiBwYXJlbnRDb25zdHJhaW50czsKLQl9Ci0vLwlwcml2YXRlIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBnZXRSZWdpb25Db25zdHJhaW50cyhJRE9NTm9kZSBjdXJyZW50Tm9kZSkgewotLy8JCUlET01Ob2RlIGl0ZXJhdG9yID0gKElET01Ob2RlKSBjdXJyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0vLwkJWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHJlc3VsdCA9IG5ldyBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMoKTsKLS8vCQlET01SZWdpb24gcmVnaW9uID0gbmV3IERPTVJlZ2lvbigpOwotLy8JCQotLy8JCS8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgYW5jZXN0cnkgdG8gZmluZCBpZiBhbnkgZXhwbGljaXQgd2hpdGVzcGFjZSBzdHJhdGVneSBoYXMKLS8vCQkgKiBiZWVuIGRlZmluZWQKLS8vCQkgKi8KLS8vCQl3aGlsZShpdGVyYXRvciAhPSBudWxsICYmIGl0ZXJhdG9yLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0KLS8vCQkJcmVnaW9uLmRvbU5vZGUgPSBpdGVyYXRvcjsKLS8vCQkJcmVnaW9uLmRvY3VtZW50UmVnaW9uID0gaXRlcmF0b3IuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLS8vCQkJCi0vLwkJCXVwZGF0ZUZvcm1hdHRpbmdDb25zdHJhaW50cyhudWxsLCBudWxsLCByZXN1bHQsIHJlZ2lvbik7Ci0vLwkJCQotLy8JCQkvKiBBIHBhcmVudCB3aG8gaGFzIGRlZmluZWQgYSBzcGVjaWZpYyB3aGl0ZXNwYWNlIHN0cmF0ZWd5IHdhcyBmb3VuZCAqLwotLy8JCQlpZihYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkUgPT0gcmVzdWx0LmdldFdoaXRlc3BhY2VTdHJhdGVneSgpIHx8IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5ERUZBVUxUID09IHJlc3VsdC5nZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKSkKLS8vCQkJCXJldHVybiByZXN1bHQ7Ci0vLwkJCQotLy8JCQlpdGVyYXRvciA9IChJRE9NTm9kZSkgaXRlcmF0b3IuZ2V0UGFyZW50Tm9kZSgpOwotLy8JCX0KLS8vCQkKLS8vCQlyZXR1cm4gbnVsbDsKLS8vCX0KLQkKLQkvKioKLQkgKiBGb3JtYXRzIHRoZSBnaXZlbiB4bWwgY29udGVudCByZWdpb24KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dEVkaXQKLQkgKiBAcGFyYW0gZm9ybWF0UmFuZ2UKLQkgKiBAcGFyYW0gcGFyZW50Q29uc3RyYWludHMKLQkgKiBAcGFyYW0gY3VycmVudERPTVJlZ2lvbgotCSAqIEBwYXJhbSBwcmV2aW91c1JlZ2lvbgotCSAqLwotCXByaXZhdGUgdm9pZCBmb3JtYXRDb250ZW50KFRleHRFZGl0IHRleHRFZGl0LCBQb3NpdGlvbiBmb3JtYXRSYW5nZSwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHBhcmVudENvbnN0cmFpbnRzLCBET01SZWdpb24gY3VycmVudERPTVJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c1JlZ2lvbikgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBjdXJyZW50RE9NUmVnaW9uLmRvY3VtZW50UmVnaW9uOwotCQlTdHJpbmcgZnVsbFRleHQgPSBjdXJyZW50UmVnaW9uLmdldEZ1bGxUZXh0KCk7Ci0KLQkJLy8gY2hlY2sgaWYgaW4gcHJlc2VydmUgc3BhY2UgbW9kZSwgaWYgc28sIGRvbid0IHRvdWNoIGFueXRoaW5nIGJ1dAotCQkvLyBtYWtlIHN1cmUgdG8gdXBkYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCVN0cmluZyB3aGl0ZXNwYWNlTW9kZSA9IHBhcmVudENvbnN0cmFpbnRzLmdldFdoaXRlc3BhY2VTdHJhdGVneSgpOwotCQlpZiAod2hpdGVzcGFjZU1vZGUgPT0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFKSB7Ci0JCQlpbnQgYXZhaWxhYmxlTGluZVdpZHRoID0gcGFyZW50Q29uc3RyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCk7Ci0JCQlhdmFpbGFibGVMaW5lV2lkdGggPSB1cGRhdGVMaW5lV2lkdGhXaXRoTGFzdExpbmUoZnVsbFRleHQsIGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci0KLQkJCS8vIHVwZGF0ZSBhdmFpbGFibGUgbGluZSB3aWR0aCBpbiBjb25zdHJhaW50cwotCQkJcGFyZW50Q29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBpZiBjb250ZW50IGlzIGp1c3Qgd2hpdGVzcGFjZSBhbmQgdGhlcmUncyBzb21ldGhpbmcgYWZ0ZXIgaXQKLQkJLy8ganVzdCBza2lwIG92ZXIgdGhpcyByZWdpb24gYmVjYXVzZSByZWdpb24gd2lsbCB0YWtlIGNhcmUgb2YgaXQKLQkJYm9vbGVhbiBpc0FsbFdoaXRlc3BhY2UgPSAoKElET01UZXh0KSBjdXJyZW50RE9NUmVnaW9uLmRvbU5vZGUpLmlzRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQkJaWYgKGlzQWxsV2hpdGVzcGFjZSkgewotCQkJcGFyZW50Q29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGZQcmVmZXJlbmNlcy5nZXRNYXhMaW5lV2lkdGgoKSk7Ci0JCQluZXh0RG9jdW1lbnRSZWdpb24gPSBjdXJyZW50UmVnaW9uLmdldE5leHQoKTsKLQkJCWlmIChuZXh0RG9jdW1lbnRSZWdpb24gIT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBzcGVjaWFsIGhhbmRsaW5nIGlmIHRleHQgZm9sbG93cyBhbiBlbnRpdHkgb3IgY2RhdGEgcmVnaW9uCi0JCWlmICh3aGl0ZXNwYWNlTW9kZSAhPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuQ09MTEFQU0UgJiYgcHJldmlvdXNSZWdpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIHByZXZpb3VSZWdpb25UeXBlID0gcHJldmlvdXNSZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHByZXZpb3VSZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UgfHwgcHJldmlvdVJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCkKLQkJCQl3aGl0ZXNwYWNlTW9kZSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5DT0xMQVBTRTsKLQkJfQotCQkvLyBhbHNvLCBzcGVjaWFsIGhhbmRsaW5nIGlmIHRleHQgaXMgYmVmb3JlIGFuIGVudGl0eSBvciBjZGF0YSByZWdpb24KLQkJaWYgKHdoaXRlc3BhY2VNb2RlICE9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5DT0xMQVBTRSkgewotCQkJLy8gZ2V0IG5leHQgZG9jdW1lbnQgcmVnaW9uIGlmIGRvbnQgYWxyZWFkeSBoYXZlIGl0Ci0JCQlpZiAobmV4dERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQkJbmV4dERvY3VtZW50UmVnaW9uID0gY3VycmVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCQlpZiAobmV4dERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmV4dFJlZ2lvblR5cGUgPSBuZXh0RG9jdW1lbnRSZWdpb24uZ2V0VHlwZSgpOwotCQkJCWlmIChuZXh0UmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFIHx8IG5leHRSZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQpCi0JCQkJCXdoaXRlc3BhY2VNb2RlID0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLkNPTExBUFNFOwotCQkJfQotCQl9Ci0JCWZvcm1hdFRleHRJbkNvbnRlbnQodGV4dEVkaXQsIHBhcmVudENvbnN0cmFpbnRzLCBjdXJyZW50UmVnaW9uLCBmdWxsVGV4dCwgd2hpdGVzcGFjZU1vZGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmb3JtYXRFbXB0eVN0YXJ0VGFnV2l0aE5vQXR0cihUZXh0RWRpdCB0ZXh0RWRpdCwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIGNvbnN0cmFpbnRzLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c0RvY3VtZW50UmVnaW9uLCBpbnQgYXZhaWxhYmxlTGluZVdpZHRoLCBTdHJpbmcgaW5kZW50U3RyYXRlZ3ksIFN0cmluZyB3aGl0ZXNwYWNlU3RyYXRlZ3ksIElUZXh0UmVnaW9uIGN1cnJlbnRUZXh0UmVnaW9uKSB7Ci0JCS8vIGdldCBwcmVmZXJlbmNlIGlmIHRoZXJlIHNob3VsZCBiZSBhIHNwYWNlIG9yIG5vdCBiZXR3ZWVuIHRhZwotCQkvLyBuYW1lIGFuZCBlbXB0eSB0YWcgY2xvc2UKLQkJLy8gPHRhZ05hbWUgLz4KLQkJYm9vbGVhbiBvbmVTcGFjZUluVGFnTmFtZSA9IGdldEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpLmdldFNwYWNlQmVmb3JlRW1wdHlDbG9zZVRhZygpOwotCi0JCS8vIGNhbGN1bGF0ZSBhdmFpbGFibGUgbGluZSB3aWR0aAotCQlpbnQgdGFnTmFtZUxpbmVXaWR0aCA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSArIDM7Ci0JCWlmIChvbmVTcGFjZUluVGFnTmFtZSkgewotCQkJLy8gYWRkIG9uZSBtb3JlIHRvIGFjY291bnQgZm9yIHNwYWNlIGJlZm9yZSBlbXB0eSB0YWcgY2xvc2UKLQkJCSsrdGFnTmFtZUxpbmVXaWR0aDsKLQkJfQotCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gdGFnTmFtZUxpbmVXaWR0aDsKLQotCQlpZiAoaW5kZW50U3RyYXRlZ3kgPT0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOTElORSkgewotCQkJLy8gaWYgd2FzIGlubGluaW5nLCBuZWVkIHRvIGNoZWNrIGlmIG91dCBvZiBhdmFpbGFibGUgbGluZQotCQkJLy8gd2lkdGgKLQkJCWlmIChhdmFpbGFibGVMaW5lV2lkdGggPCAwKSB7Ci0JCQkJLy8gbmVlZCB0byBpbmRlbnQgaWYgcG9zc2libGUKLQkJCQlpbnQgbGluZVdpZHRoID0gaW5kZW50SWZQb3NzaWJsZSh0ZXh0RWRpdCwgY29uc3RyYWludHMsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbiwgd2hpdGVzcGFjZVN0cmF0ZWd5LCBpbmRlbnRTdHJhdGVneSwgdHJ1ZSk7Ci0JCQkJLy8gdXBkYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCQkJaWYgKGxpbmVXaWR0aCA+IDApCi0JCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGxpbmVXaWR0aCAtIHRhZ05hbWVMaW5lV2lkdGg7Ci0JCQkJZWxzZQotCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gdGFnTmFtZUxpbmVXaWR0aDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG5vIG5lZWQgdG8gaW5kZW50Ci0JCQkJLy8ganVzdCBtYWtlIHN1cmUgdG8gZGVsZXRlIHByZXZpb3VzIHdoaXRlc3BhY2UgaWYKLQkJCQkvLyBuZWVkZWQKLQkJCQlpZiAoKHByZXZpb3VzRG9jdW1lbnRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpICYmIChwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldEZ1bGxUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGNvbGxhcHNlU3BhY2VzKHRleHRFZGl0LCBwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGF2YWlsYWJsZUxpbmVXaWR0aCwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRGdWxsVGV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBkZWxldGUgYW55IHRyYWlsIHNwYWNlcyBhZnRlciB0YWcgbmFtZQotCQlpbnQgdGV4dExlbmd0aCA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJaW50IHJlZ2lvbkxlbmd0aCA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldExlbmd0aCgpOwotCi0JCWJvb2xlYW4gdGhlcmVBcmVTcGFjZXMgPSB0ZXh0TGVuZ3RoIDwgcmVnaW9uTGVuZ3RoOwotCQlpZiAoIW9uZVNwYWNlSW5UYWdOYW1lICYmIHRoZXJlQXJlU3BhY2VzKSB7Ci0JCQlkZWxldGVUcmFpbGluZ1NwYWNlcyh0ZXh0RWRpdCwgY3VycmVudFRleHRSZWdpb24sIGN1cnJlbnREb2N1bWVudFJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZihvbmVTcGFjZUluVGFnTmFtZSkgewotCQkJaW5zZXJ0U3BhY2VBbmRDb2xsYXBzZSh0ZXh0RWRpdCwgY3VycmVudERvY3VtZW50UmVnaW9uLCBhdmFpbGFibGVMaW5lV2lkdGgsIGN1cnJlbnRUZXh0UmVnaW9uKTsKLQkJfQotCQljb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoYXZhaWxhYmxlTGluZVdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXRzIGFuIGVuZCB0YWcKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dEVkaXQKLQkgKiBAcGFyYW0gY3VycmVudFJlZ2lvbgotCSAqIEBwYXJhbSB0ZXh0UmVnaW9ucwotCSAqLwotCXByaXZhdGUgdm9pZCBmb3JtYXRFbmRUYWcoVGV4dEVkaXQgdGV4dEVkaXQsIFBvc2l0aW9uIGZvcm1hdFJhbmdlLCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgY29uc3RyYWludHMsIERPTVJlZ2lvbiBjdXJyZW50RE9NUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzRG9jdW1lbnRSZWdpb24pIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50RG9jdW1lbnRSZWdpb24gPSBjdXJyZW50RE9NUmVnaW9uLmRvY3VtZW50UmVnaW9uOwotCi0JCVN0cmluZyB3aGl0ZXNwYWNlU3RyYXRlZ3kgPSBjb25zdHJhaW50cy5nZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKTsKLQkJU3RyaW5nIGluZGVudFN0cmF0ZWd5ID0gY29uc3RyYWludHMuZ2V0SW5kZW50U3RyYXRlZ3koKTsKLQotCQkvLyBkbyBub3QgZm9ybWF0IHNwYWNlIGJlZm9yZSBzdGFydCB0YWcgaWYgcHJlc2VydmluZyBzcGFjZXMKLQkJaWYgKHdoaXRlc3BhY2VTdHJhdGVneSAhPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkUpIHsKLQkJCS8vIGZvcm1hdCBsaWtlIGluZGVudCBzdHJhdGVneSBzYXlzCi0JCQlpZiAoaW5kZW50U3RyYXRlZ3kgPT0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOREVOVCB8fCBpbmRlbnRTdHJhdGVneSA9PSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuTkVXX0xJTkUpIHsKLQkJCQlpbnQgYXZhaWxhYmxlTGluZVdpZHRoID0gaW5kZW50SWZQb3NzaWJsZSh0ZXh0RWRpdCwgY29uc3RyYWludHMsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbiwgd2hpdGVzcGFjZVN0cmF0ZWd5LCBpbmRlbnRTdHJhdGVneSwgZmFsc2UpOwotCQkJCWNvbnN0cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChhdmFpbGFibGVMaW5lV2lkdGgpOwotCQkJfQotCQl9Ci0JCS8vIGZvcm1hdCB0aGUgZW5kIHRhZyBpdHNlbGYKLQkJZm9ybWF0V2l0aGluRW5kVGFnKHRleHRFZGl0LCBjb25zdHJhaW50cywgY3VycmVudERvY3VtZW50UmVnaW9uLCBwcmV2aW91c0RvY3VtZW50UmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXRzIHRoZSBnaXZlbiByZWdpb24gKGFuZCBhbGwgaXRzIGNoaWxkcmVuKSBjb250YWluZWQgaW4gZG9tUmVnaW9uLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0Ci0JICogICAgICAgICAgICBlZGl0cyByZXF1aXJlZCB0byBmb3JtYXQKLQkgKiBAcGFyYW0gZm9ybWF0UmFuZ2UKLQkgKiAgICAgICAgICAgIGRvY3VtZW50IHJhbmdlIHRvIGZvcm1hdCAob25seSBmb3JtYXQgY29udGVudCB3aXRoaW4gdGhpcwotCSAqICAgICAgICAgICAgcmFuZ2UpCi0JICogQHBhcmFtIHBhcmVudENvbnN0cmFpbnRzCi0JICogQHBhcmFtIGRvbVJlZ2lvbgotCSAqICAgICAgICAgICAgYXNzdW1lcyBkb20gbm9kZSAmIHJlZ2lvbiBhcmUgbm90IG51bGwKLQkgKiBAcGFyYW0gcHJldmlvdXNSZWdpb24KLQkgKiAgICAgICAgICAgIGNvdWxkIGJlIG51bGwKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxhc3QgcmVnaW9uIGZvcm1hdHRlZAotCSAqLwotCXByaXZhdGUgRE9NUmVnaW9uIGZvcm1hdFJlZ2lvbihUZXh0RWRpdCBlZGl0LCBQb3NpdGlvbiBmb3JtYXRSYW5nZSwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHBhcmVudENvbnN0cmFpbnRzLCBET01SZWdpb24gZG9tUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzUmVnaW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudFJlZ2lvbiA9IGRvbVJlZ2lvbi5kb2N1bWVudFJlZ2lvbjsKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBjdXJyZW50UmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSBjdXJyZW50UmVnaW9uLmdldEZpcnN0UmVnaW9uKCk7Ci0JCQlTdHJpbmcgdGV4dFJlZ2lvblR5cGUgPSB0ZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0ZXh0UmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgewotCQkJCWRvbVJlZ2lvbiA9IGZvcm1hdFN0YXJ0VGFnKGVkaXQsIGZvcm1hdFJhbmdlLCBwYXJlbnRDb25zdHJhaW50cywgZG9tUmVnaW9uLCBwcmV2aW91c1JlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIGlmICh0ZXh0UmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQlmb3JtYXRFbmRUYWcoZWRpdCwgZm9ybWF0UmFuZ2UsIHBhcmVudENvbnN0cmFpbnRzLCBkb21SZWdpb24sIHByZXZpb3VzUmVnaW9uKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHsKLQkJCWZvcm1hdENvbnRlbnQoZWRpdCwgZm9ybWF0UmFuZ2UsIHBhcmVudENvbnN0cmFpbnRzLCBkb21SZWdpb24sIHByZXZpb3VzUmVnaW9uKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCkgewotCQkJZm9ybWF0Q29tbWVudChlZGl0LCBmb3JtYXRSYW5nZSwgcGFyZW50Q29uc3RyYWludHMsIGRvbVJlZ2lvbiwgcHJldmlvdXNSZWdpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gdW5rbm93biwgc28ganVzdCBsZWF2ZSBhbG9uZSBmb3Igbm93IGJ1dCBtYWtlIHN1cmUgdG8gdXBkYXRlCi0JCQkvLyBhdmFpbGFibGUgbGluZSB3aWR0aAotCQkJU3RyaW5nIGZ1bGxUZXh0ID0gY3VycmVudFJlZ2lvbi5nZXRGdWxsVGV4dCgpOwotCQkJaW50IHdpZHRoID0gdXBkYXRlTGluZVdpZHRoV2l0aExhc3RMaW5lKGZ1bGxUZXh0LCBwYXJlbnRDb25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKSk7Ci0JCQlwYXJlbnRDb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgod2lkdGgpOwotCQl9Ci0JCXJldHVybiBkb21SZWdpb247Ci0JfQotCi0JLyoqCi0JICogRm9ybWF0cyB0aGUgZG9tUmVnaW9uIGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuIGFuZCBzaWJsaW5ncwotCSAqIAotCSAqIEBwYXJhbSBlZGl0Ci0JICogQHBhcmFtIGRvbVJlZ2lvbgotCSAqIEBwYXJhbSBwYXJlbnRDb25zdHJhaW50cwotCSAqIEBwYXJhbSBmb3JtYXRSYW5nZQotCSAqLwotCXByaXZhdGUgdm9pZCBmb3JtYXRTaWJsaW5ncyhUZXh0RWRpdCBlZGl0LCBET01SZWdpb24gZG9tUmVnaW9uLCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgcGFyZW50Q29uc3RyYWludHMsIFBvc2l0aW9uIGZvcm1hdFJhbmdlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNSZWdpb24gPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBkb21SZWdpb24uZG9jdW1lbnRSZWdpb247Ci0JCUlET01Ob2RlIGN1cnJlbnRET01Ob2RlID0gZG9tUmVnaW9uLmRvbU5vZGU7Ci0JCXdoaWxlIChjdXJyZW50RE9NTm9kZSAhPSBudWxsICYmIGN1cnJlbnRSZWdpb24gIT0gbnVsbCAmJiBmb3JtYXRSYW5nZS5vdmVybGFwc1dpdGgoY3VycmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBjdXJyZW50UmVnaW9uLmdldExlbmd0aCgpKSAmJiAoZlByb2dyZXNzTW9uaXRvciA9PSBudWxsIHx8ICFmUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkpIHsKLQkJCWRvbVJlZ2lvbi5kb2N1bWVudFJlZ2lvbiA9IGN1cnJlbnRSZWdpb247Ci0JCQlkb21SZWdpb24uZG9tTm9kZSA9IGN1cnJlbnRET01Ob2RlOwotCi0JCQkvLyBuZWVkIHRvIG1ha2Ugc3VyZSBjdXJyZW50IGRvY3VtZW50IHJlZ2lvbiBhbmQgY3VycmVudAotCQkJLy8gZG9tIG5vZGUgbWF0Y2ggdXAKLQkJCWlmIChjdXJyZW50UmVnaW9uID09IGN1cnJlbnRET01Ob2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCQkvLyBmb3JtYXQgdGhpcyBkb2N1bWVudCByZWdpb24vbm9kZSwgZm9ybWF0UmVnaW9uIHdpbGwKLQkJCQkvLyByZXR1cm4gdGhlIGxhc3Qgbm9kZS9yZWdpb24gZm9ybWF0dGVkCi0JCQkJZG9tUmVnaW9uID0gZm9ybWF0UmVnaW9uKGVkaXQsIGZvcm1hdFJhbmdlLCBwYXJlbnRDb25zdHJhaW50cywgZG9tUmVnaW9uLCBwcmV2aW91c1JlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBUT0RPOiBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hhdCB0byBkbyBpZiB0aGV5IGRvbid0Ci0JCQkJLy8gbWF0Y2ggdXAKLQkJCX0KLQkJCXByZXZpb3VzUmVnaW9uID0gZG9tUmVnaW9uLmRvY3VtZW50UmVnaW9uOwotCQkJLy8gZ2V0IHRoZSBuZXh0IHNpYmxpbmcgaW5mb3JtYXRpb24KLQkJCWlmIChkb21SZWdpb24uZG9tTm9kZSAhPSBudWxsKQotCQkJCWN1cnJlbnRET01Ob2RlID0gKElET01Ob2RlKSBkb21SZWdpb24uZG9tTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJZWxzZQotCQkJCWN1cnJlbnRET01Ob2RlID0gbnVsbDsKLQkJCWN1cnJlbnRSZWdpb24gPSBwcmV2aW91c1JlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXRzIGEgc3RhcnQgdGFnCi0JICogCi0JICogQHBhcmFtIHRleHRFZGl0Ci0JICogQHBhcmFtIGN1cnJlbnRSZWdpb24KLQkgKiBAcGFyYW0gdGV4dFJlZ2lvbnMKLQkgKi8KLQlwcml2YXRlIERPTVJlZ2lvbiBmb3JtYXRTdGFydFRhZyhUZXh0RWRpdCB0ZXh0RWRpdCwgUG9zaXRpb24gZm9ybWF0UmFuZ2UsIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBwYXJlbnRDb25zdHJhaW50cywgRE9NUmVnaW9uIGN1cnJlbnRET01SZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNEb2N1bWVudFJlZ2lvbikgewotCQkvLyBkZXRlcm1pbmUgcHJvcGVyIGluZGVudCBieSByZWZlcnJpbmcgdG8gcGFyZW50IGNvbnN0cmFpbnRzLAotCQkvLyBwcmV2aW91cyBub2RlLCBhbmQgY3VycmVudCBub2RlCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudERvY3VtZW50UmVnaW9uID0gY3VycmVudERPTVJlZ2lvbi5kb2N1bWVudFJlZ2lvbjsKLQkJSURPTU5vZGUgY3VycmVudERPTU5vZGUgPSBjdXJyZW50RE9NUmVnaW9uLmRvbU5vZGU7Ci0KLQkJLy8gY3JlYXRlIGEgY29uc3RyYWludCBmb3IgdGhpcyB0YWcKLQkJWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHRoaXNDb25zdHJhaW50cyA9IG5ldyBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMoKTsKLQkJWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIGNoaWxkcmVuQ29uc3RyYWludHMgPSBuZXcgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzKCk7Ci0JCXVwZGF0ZUZvcm1hdHRpbmdDb25zdHJhaW50cyhwYXJlbnRDb25zdHJhaW50cywgdGhpc0NvbnN0cmFpbnRzLCBjaGlsZHJlbkNvbnN0cmFpbnRzLCBjdXJyZW50RE9NUmVnaW9uKTsKLQotCQlpZihjaGlsZHJlbkNvbnN0cmFpbnRzLmdldFdoaXRlc3BhY2VTdHJhdGVneSgpID09IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5ERUZBVUxUKQotCQkJY2hpbGRyZW5Db25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKG5ldyBYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKSkuZ2V0RWxlbWVudFdoaXRlc3BhY2VTdHJhdGVneSgpKTsKLQkJCQotCQlTdHJpbmcgd2hpdGVzcGFjZVN0cmF0ZWd5ID0gdGhpc0NvbnN0cmFpbnRzLmdldFdoaXRlc3BhY2VTdHJhdGVneSgpOwotCQlTdHJpbmcgaW5kZW50U3RyYXRlZ3kgPSB0aGlzQ29uc3RyYWludHMuZ2V0SW5kZW50U3RyYXRlZ3koKTsKLQkJaW50IGF2YWlsYWJsZUxpbmVXaWR0aCA9IHRoaXNDb25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKTsKLQotCQkvLyBmb3JtYXQgc3BhY2UgYmVmb3JlIHN0YXJ0IHRhZwotCQkvLyBkbyBub3QgZm9ybWF0IHNwYWNlIGJlZm9yZSBzdGFydCB0YWcgaWYgcHJlc2VydmluZyBzcGFjZXMKLQkJaWYgKHdoaXRlc3BhY2VTdHJhdGVneSAhPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkUpIHsKLQkJCS8vIGZvcm1hdCBsaWtlIGluZGVudCBzdHJhdGVneSBzYXlzCi0JCQlpZiAoaW5kZW50U3RyYXRlZ3kgPT0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOREVOVCB8fCBpbmRlbnRTdHJhdGVneSA9PSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuTkVXX0xJTkUpIHsKLQkJCQlhdmFpbGFibGVMaW5lV2lkdGggPSBpbmRlbnRJZlBvc3NpYmxlKHRleHRFZGl0LCB0aGlzQ29uc3RyYWludHMsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbiwgd2hpdGVzcGFjZVN0cmF0ZWd5LCBpbmRlbnRTdHJhdGVneSwgdHJ1ZSk7Ci0JCQkJaWYgKGF2YWlsYWJsZUxpbmVXaWR0aCA+IDApCi0JCQkJCXRoaXNDb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoYXZhaWxhYmxlTGluZVdpZHRoKTsKLQkJCX0KLQkJfQotCQkvLyBmb3JtYXQgdGhlIHN0YXJ0IHRhZyBpdHNlbGYKLQkJYm9vbGVhbiB0YWdFbmRlZCA9IGZvcm1hdFdpdGhpblRhZyh0ZXh0RWRpdCwgdGhpc0NvbnN0cmFpbnRzLCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIHByZXZpb3VzRG9jdW1lbnRSZWdpb24pOwotCi0JCS8vIGZvcm1hdCBjaGlsZHJlbgotCQlpZiAoIXRhZ0VuZGVkKSB7Ci0JCQkvLyB1cGRhdGUgY2hpbGRDb25zdHJhaW50cyB3aXRoIHRoaXNDb25zdHJhaW50J3MgaW5kZW50TGV2ZWwgJgotCQkJLy8gYXZhaWxhYmxlTGluZVdpZHRoCi0JCQljaGlsZHJlbkNvbnN0cmFpbnRzLnNldEluZGVudExldmVsKHRoaXNDb25zdHJhaW50cy5nZXRJbmRlbnRMZXZlbCgpKTsKLQkJCWNoaWxkcmVuQ29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKHRoaXNDb25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKSk7Ci0KLQkJCXByZXZpb3VzRG9jdW1lbnRSZWdpb24gPSBjdXJyZW50RG9jdW1lbnRSZWdpb247Ci0JCQlJRE9NTm9kZSBjaGlsZERPTU5vZGUgPSAoSURPTU5vZGUpIGN1cnJlbnRET01Ob2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dFJlZ2lvbiA9IGN1cnJlbnREb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCQlib29sZWFuIHBhc3NlZEZvcm1hdFJhbmdlID0gZmFsc2U7Ci0JCQkvLyBhcyBsb25nIGFzIHRoZXJlIGlzIG9uZSBjaGlsZAotCQkJaWYgKGNoaWxkRE9NTm9kZSAhPSBudWxsICYmIG5leHRSZWdpb24gIT0gbnVsbCkgewotCQkJCXdoaWxlIChjaGlsZERPTU5vZGUgIT0gbnVsbCAmJiBuZXh0UmVnaW9uICE9IG51bGwgJiYgIXBhc3NlZEZvcm1hdFJhbmdlICYmIChmUHJvZ3Jlc3NNb25pdG9yID09IG51bGwgfHwgIWZQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSkgewotCQkJCQlET01SZWdpb24gY2hpbGRET01SZWdpb24gPSBuZXcgRE9NUmVnaW9uKCk7Ci0JCQkJCWNoaWxkRE9NUmVnaW9uLmRvY3VtZW50UmVnaW9uID0gbmV4dFJlZ2lvbjsKLQkJCQkJY2hpbGRET01SZWdpb24uZG9tTm9kZSA9IGNoaWxkRE9NTm9kZTsKLQkJCQkJaWYgKG5leHRSZWdpb24gPT0gY2hpbGRET01Ob2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCQkJCS8vIGZvcm1hdCBjaGlsZHJlbi4gcGFzcyBpbiBjaGlsZCBjb25zdHJhaW50cwotCQkJCQkJY2hpbGRET01SZWdpb24gPSBmb3JtYXRSZWdpb24odGV4dEVkaXQsIGZvcm1hdFJhbmdlLCBjaGlsZHJlbkNvbnN0cmFpbnRzLCBjaGlsZERPTVJlZ2lvbiwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBUT0RPOiB3aGF0IGhhcHBlbnMgaWYgdGhleSBkb250IG1hdGNoIHVwPwotCQkJCQl9Ci0KLQkJCQkJLy8gdXBkYXRlIGNoaWxkRE9NUmVnaW9uIHdpdGggbmV4dCBkb20vcmVnaW9uIG5vZGUKLQkJCQkJaWYgKGNoaWxkRE9NUmVnaW9uLmRvbU5vZGUgIT0gbnVsbCkgewotCQkJCQkJY2hpbGRET01Ob2RlID0gKElET01Ob2RlKSBjaGlsZERPTVJlZ2lvbi5kb21Ob2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQljaGlsZERPTU5vZGUgPSBudWxsOwotCQkJCQl9Ci0JCQkJCXByZXZpb3VzRG9jdW1lbnRSZWdpb24gPSBjaGlsZERPTVJlZ2lvbi5kb2N1bWVudFJlZ2lvbjsKLQkJCQkJbmV4dFJlZ2lvbiA9IHByZXZpb3VzRG9jdW1lbnRSZWdpb24uZ2V0TmV4dCgpOwotCQkJCQlpZiAobmV4dFJlZ2lvbiAhPSBudWxsKQotCQkJCQkJcGFzc2VkRm9ybWF0UmFuZ2UgPSAhZm9ybWF0UmFuZ2Uub3ZlcmxhcHNXaXRoKG5leHRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgbmV4dFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gdGhlcmUgd2VyZSBubyBjaGlsZHJlbiwgc28ga2VlcCBlbmQgdGFnIGlubGluZWQKLQkJCQljaGlsZHJlbkNvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuQ09MTEFQU0UpOwotCQkJCWNoaWxkcmVuQ29uc3RyYWludHMuc2V0SW5kZW50U3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOTElORSk7Ci0JCQl9Ci0KLQkJCWlmICghcGFzc2VkRm9ybWF0UmFuZ2UpIHsKLQkJCQkvLyB1cGRhdGUgdGhlIGRvbSByZWdpb24gd2l0aCB0aGUgbGFzdCBmb3JtYXR0ZWQgcmVnaW9uL2RvbQotCQkJCS8vIG5vZGUgc2hvdWxkIGJlIGVuZCB0YWcgYW5kIHRoaXMgdGFnJ3MgRE9NTm9kZQotCQkJCWN1cnJlbnRET01SZWdpb24uZG9jdW1lbnRSZWdpb24gPSBuZXh0UmVnaW9uOwotCQkJCWN1cnJlbnRET01SZWdpb24uZG9tTm9kZSA9IGN1cnJlbnRET01Ob2RlOwotCi0JCQkJLy8gZW5kIHRhZydzIGluZGVudCBsZXZlbCBzaG91bGQgYmUgc2FtZSBhcyBzdGFydCB0YWcncwotCQkJCWNoaWxkcmVuQ29uc3RyYWludHMuc2V0SW5kZW50TGV2ZWwodGhpc0NvbnN0cmFpbnRzLmdldEluZGVudExldmVsKCkpOwotCQkJCS8vIGZvcm1hdCBlbmQgdGFnCi0JCQkJYm9vbGVhbiBmb3JtYXRFbmRUYWcgPSBmYWxzZTsKLQkJCQlpZiAobmV4dFJlZ2lvbiAhPSBudWxsICYmIGN1cnJlbnRET01Ob2RlICE9IG51bGwpIHsKLQkJCQkJSVRleHRSZWdpb25MaXN0IHJzID0gbmV4dFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQkJCWlmIChycy5zaXplKCkgPiAxKSB7Ci0JCQkJCQlJVGV4dFJlZ2lvbiByID0gcnMuZ2V0KDApOwotCQkJCQkJaWYgKHIgIT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQkJCQlyID0gcnMuZ2V0KDEpOwotCQkJCQkJCWlmIChyICE9IG51bGwgJiYgci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQkJCQkJU3RyaW5nIHRhZ05hbWUgPSBuZXh0UmVnaW9uLmdldFRleHQocik7Ci0JCQkJCQkJCWlmICh0YWdOYW1lICE9IG51bGwgJiYgdGFnTmFtZS5lcXVhbHMoY3VycmVudERPTU5vZGUuZ2V0Tm9kZU5hbWUoKSkpCi0JCQkJCQkJCQlmb3JtYXRFbmRUYWcgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChmb3JtYXRFbmRUYWcpCi0JCQkJCWZvcm1hdEVuZFRhZyh0ZXh0RWRpdCwgZm9ybWF0UmFuZ2UsIGNoaWxkcmVuQ29uc3RyYWludHMsIGN1cnJlbnRET01SZWdpb24sIHByZXZpb3VzRG9jdW1lbnRSZWdpb24pOwotCQkJCWVsc2UgewotCQkJCQkvLyBtaXNzaW5nIGVuZCB0YWcgc28gcmV0dXJuIGxhc3QgZm9ybWF0dGVkIGRvY3VtZW50Ci0JCQkJCS8vIHJlZ2lvbgotCQkJCQljdXJyZW50RE9NUmVnaW9uLmRvY3VtZW50UmVnaW9uID0gcHJldmlvdXNEb2N1bWVudFJlZ2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBwYXNzZWQgZm9ybWF0IHJhbmdlIGJlZm9yZSBjb3VsZCBmaW5pc2gsIHNvIHVwZGF0ZSBkb20KLQkJCQkvLyByZWdpb24gdG8gbGFzdCBrbm93biBmb3JtYXR0ZWQgcmVnaW9uCi0JCQkJY3VycmVudERPTVJlZ2lvbi5kb2N1bWVudFJlZ2lvbiA9IG5leHRSZWdpb247Ci0JCQkJY3VycmVudERPTVJlZ2lvbi5kb21Ob2RlID0gY2hpbGRET01Ob2RlOwotCQkJfQotCi0JCQkvLyB1cGRhdGUgcGFyZW50IGNvbnN0cmFpbnQgc2luY2UgdGhpcyBpcyB3aGF0IGlzIHBhc3NlZCBiYWNrCi0JCQlwYXJlbnRDb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoY2hpbGRyZW5Db25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB1cGRhdGUgYXZhaWxhYmxlIGxpbmUgd2lkdGgKLQkJCXBhcmVudENvbnN0cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aCh0aGlzQ29uc3RyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCkpOwotCQl9Ci0JCXJldHVybiBjdXJyZW50RE9NUmVnaW9uOwotCX0KLQotCXByaXZhdGUgdm9pZCBmb3JtYXRTdGFydFRhZ1dpdGhOb0F0dHIoVGV4dEVkaXQgdGV4dEVkaXQsIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBjb25zdHJhaW50cywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50RG9jdW1lbnRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNEb2N1bWVudFJlZ2lvbiwgaW50IGF2YWlsYWJsZUxpbmVXaWR0aCwgU3RyaW5nIGluZGVudFN0cmF0ZWd5LCBTdHJpbmcgd2hpdGVzcGFjZVN0cmF0ZWd5LCBJVGV4dFJlZ2lvbiBjdXJyZW50VGV4dFJlZ2lvbikgewotCQkvLyBjYWxjdWxhdGUgYXZhaWxhYmxlIGxpbmUgd2lkdGgKLQkJaW50IHRhZ05hbWVMaW5lV2lkdGggPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgKyAyOwotCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gdGFnTmFtZUxpbmVXaWR0aDsKLQotCQlpZiAoaW5kZW50U3RyYXRlZ3kgPT0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOTElORSkgewotCQkJLy8gaWYgd2FzIGlubGluaW5nLCBuZWVkIHRvIGNoZWNrIGlmIG91dCBvZiBhdmFpbGFibGUgbGluZQotCQkJLy8gd2lkdGgKLQkJCWlmIChhdmFpbGFibGVMaW5lV2lkdGggPCAwKSB7Ci0JCQkJLy8gbmVlZCB0byBpbmRlbnQgaWYgcG9zc2libGUKLQkJCQlpbnQgbGluZVdpZHRoID0gaW5kZW50SWZQb3NzaWJsZSh0ZXh0RWRpdCwgY29uc3RyYWludHMsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbiwgd2hpdGVzcGFjZVN0cmF0ZWd5LCBpbmRlbnRTdHJhdGVneSwgdHJ1ZSk7Ci0JCQkJLy8gdXBkYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCQkJaWYgKGxpbmVXaWR0aCA+IDApCi0JCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGxpbmVXaWR0aCAtIHRhZ05hbWVMaW5lV2lkdGg7Ci0JCQkJZWxzZQotCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gdGFnTmFtZUxpbmVXaWR0aDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG5vIG5lZWQgdG8gaW5kZW50Ci0JCQkJLy8ganVzdCBtYWtlIHN1cmUgdG8gZGVsZXRlIHByZXZpb3VzIHdoaXRlc3BhY2UgaWYKLQkJCQkvLyBuZWVkZWQKLQkJCQlpZiAocHJldmlvdXNEb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWlmIChwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB7Ci0JCQkJCQlTdHJpbmcgcHJldmlvdXNEb2N1bWVudFJlZ2lvblRleHQgPSBwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldEZ1bGxUZXh0KCk7Ci0JCQkJCQlpZiAocHJldmlvdXNEb2N1bWVudFJlZ2lvblRleHQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggPSBjb2xsYXBzZVNwYWNlcyh0ZXh0RWRpdCwgcHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBhdmFpbGFibGVMaW5lV2lkdGgsIHByZXZpb3VzRG9jdW1lbnRSZWdpb25UZXh0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGRlbGV0ZSBhbnkgdHJhaWwgc3BhY2VzIGFmdGVyIHRhZyBuYW1lCi0JCWlmIChjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgPCBjdXJyZW50VGV4dFJlZ2lvbi5nZXRMZW5ndGgoKSkgewotCQkJZGVsZXRlVHJhaWxpbmdTcGFjZXModGV4dEVkaXQsIGN1cnJlbnRUZXh0UmVnaW9uLCBjdXJyZW50RG9jdW1lbnRSZWdpb24pOwotCQl9Ci0JCWNvbnN0cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChhdmFpbGFibGVMaW5lV2lkdGgpOwotCX0KLQotCS8qKgotCSAqIEZvcm1hdCB0aGUgdGV4dCBpbiB4bWwgY29udGVudAotCSAqIAotCSAqIEBwYXJhbSB0ZXh0RWRpdAotCSAqIEBwYXJhbSBwYXJlbnRDb25zdHJhaW50cwotCSAqIEBwYXJhbSBjdXJyZW50UmVnaW9uCi0JICogQHBhcmFtIGZ1bGxUZXh0Ci0JICogQHBhcmFtIHdoaXRlc3BhY2VNb2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZvcm1hdFRleHRJbkNvbnRlbnQoVGV4dEVkaXQgdGV4dEVkaXQsIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBwYXJlbnRDb25zdHJhaW50cywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50UmVnaW9uLCBTdHJpbmcgZnVsbFRleHQsIFN0cmluZyB3aGl0ZXNwYWNlTW9kZSkgewotCQlpbnQgYXZhaWxhYmxlTGluZVdpZHRoID0gcGFyZW50Q29uc3RyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCk7Ci0KLQkJLy8gZGV0ZXJtaW5lIGluZGVudGF0aW9uCi0JCWJvb2xlYW4gZm9yY2VJbml0aWFsSW5kZW50ID0gZmFsc2U7Ci0JCWludCBpbmRlbnRMZXZlbCA9IHBhcmVudENvbnN0cmFpbnRzLmdldEluZGVudExldmVsKCkgKyAxOwotCQlTdHJpbmcgaW5kZW50TW9kZSA9IHBhcmVudENvbnN0cmFpbnRzLmdldEluZGVudFN0cmF0ZWd5KCk7Ci0JCWlmIChpbmRlbnRNb2RlID09IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JTkRFTlQpIHsKLQkJCWZvcmNlSW5pdGlhbEluZGVudCA9IHRydWU7Ci0JCX0KLQkJaWYgKGluZGVudE1vZGUgPT0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLk5FV19MSU5FKSB7Ci0JCQlpbmRlbnRMZXZlbCA9IHBhcmVudENvbnN0cmFpbnRzLmdldEluZGVudExldmVsKCk7Ci0JCQlmb3JjZUluaXRpYWxJbmRlbnQgPSB0cnVlOwotCQl9Ci0KLQkJaW50IGZ1bGxUZXh0T2Zmc2V0ID0gMDsKLQkJY2hhcltdIGZ1bGxUZXh0QXJyYXkgPSBmdWxsVGV4dC50b0NoYXJBcnJheSgpOwotCQl3aGlsZSAoZnVsbFRleHRPZmZzZXQgPCBmdWxsVGV4dEFycmF5Lmxlbmd0aCkgewotCQkJLy8gZ2F0aGVyIGFsbCB3aGl0ZXNwYWNlcwotCQkJU3RyaW5nIHdoaXRlc3BhY2VSdW4gPSBnZXRDaGFyYWN0ZXJSdW4oZnVsbFRleHRBcnJheSwgZnVsbFRleHRPZmZzZXQsIHRydWUpOwotCQkJaWYgKHdoaXRlc3BhY2VSdW4ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJLy8gb2Zmc2V0IHdoZXJlIHdoaXRlc3BhY2Ugc3RhcnRzCi0JCQkJaW50IHdoaXRlc3BhY2VTdGFydCA9IGZ1bGxUZXh0T2Zmc2V0OwotCQkJCS8vIHVwZGF0ZSBjdXJyZW50IG9mZnNldCBpbiBmdWxsVGV4dAotCQkJCWZ1bGxUZXh0T2Zmc2V0ICs9IHdoaXRlc3BhY2VSdW4ubGVuZ3RoKCk7Ci0KLQkJCQkvLyBnYXRoZXIgZm9sbG93aW5nIHdvcmQKLQkJCQlTdHJpbmcgY2hhcmFjdGVyUnVuID0gZ2V0Q2hhcmFjdGVyUnVuKGZ1bGxUZXh0QXJyYXksIGZ1bGxUZXh0T2Zmc2V0LCBmYWxzZSk7Ci0JCQkJaW50IGNoYXJhY3RlclJ1bkxlbmd0aCA9IGNoYXJhY3RlclJ1bi5sZW5ndGgoKTsKLQkJCQlpZiAoY2hhcmFjdGVyUnVuTGVuZ3RoID4gMCkgewotCQkJCQkvLyBpbmRlbnQgaWYgd29yZCBpcyB0b28gbG9uZyBvciBmb3JjaW5nIGluaXRpYWwKLQkJCQkJLy8gaW5kZW50Ci0JCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSBjaGFyYWN0ZXJSdW5MZW5ndGg7Ci0JCQkJCS8vIG9mZnNldCB3aGVyZSBpbmRlbnQvY29sbGFwc2Ugd2lsbCBoYXBwZW4KLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gY3VycmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpICsgd2hpdGVzcGFjZVN0YXJ0OwotCQkJCQlpZiAoZm9yY2VJbml0aWFsSW5kZW50IHx8IChhdmFpbGFibGVMaW5lV2lkdGggPD0gMCkpIHsKLQkJCQkJCS8vIGluZGVudCBpZiBub3QgYWxyZWFkeSBpbmRlbnRlZAotCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gaW5kZW50SWZOb3RBbHJlYWR5SW5kZW50ZWQodGV4dEVkaXQsIGN1cnJlbnRSZWdpb24sIGluZGVudExldmVsLCBzdGFydE9mZnNldCwgd2hpdGVzcGFjZVJ1bik7Ci0JCQkJCQkvLyByZW1lbWJlciB0byBzdWJ0cmFjdCB3b3JkIGxlbmd0aAotCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoIC09IGNoYXJhY3RlclJ1bkxlbmd0aDsKLQkJCQkJCWZvcmNlSW5pdGlhbEluZGVudCA9IGZhbHNlOyAvLyBpbml0aWFsIGluZGVudCBkb25lCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBqdXN0IGNvbGxhcHNlIHNwYWNlcwotCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gY29sbGFwc2VTcGFjZXModGV4dEVkaXQsIHN0YXJ0T2Zmc2V0LCBhdmFpbGFibGVMaW5lV2lkdGgsIHdoaXRlc3BhY2VSdW4pOwotCQkJCQl9Ci0KLQkJCQkJZnVsbFRleHRPZmZzZXQgKz0gY2hhcmFjdGVyUnVuTGVuZ3RoOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gaGFuZGxlIHRyYWlsaW5nIHdoaXRlc3BhY2UKLQkJCQkJaW50IHdoaXRlc3BhY2VPZmZzZXQgPSBjdXJyZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgKyB3aGl0ZXNwYWNlU3RhcnQ7Ci0JCQkJCWlmICh3aGl0ZXNwYWNlTW9kZSA9PSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSUdOT1JFKSB7Ci0JCQkJCQkvLyBpZiBpZ25vcmUsIHRyaW0KLQkJCQkJCURlbGV0ZUVkaXQgZGVsZXRlVHJhaWxpbmcgPSBuZXcgRGVsZXRlRWRpdCh3aGl0ZXNwYWNlT2Zmc2V0LCB3aGl0ZXNwYWNlUnVuLmxlbmd0aCgpKTsKLQkJCQkJCXRleHRFZGl0LmFkZENoaWxkKGRlbGV0ZVRyYWlsaW5nKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGlmIGNvbGxhcHNlLCBsZWF2ZSBhIHNwYWNlLiBidXQgd2hhdCBpZiBlbmQgdXAKLQkJCQkJCS8vIHdhbnRpbmcgdG8gYWRkIGluZGVudD8gdGhlbiBuZWVkIHRvIGRlbGV0ZSBzcGFjZQotCQkJCQkJLy8gYWRkZWQgYW5kIGFkZCBpbmRlbnQgaW5zdGVhZAotCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gY29sbGFwc2VTcGFjZXModGV4dEVkaXQsIHdoaXRlc3BhY2VPZmZzZXQsIGF2YWlsYWJsZUxpbmVXaWR0aCwgd2hpdGVzcGFjZVJ1bik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBnYXRoZXIgd29yZAotCQkJCVN0cmluZyBjaGFyYWN0ZXJSdW4gPSBnZXRDaGFyYWN0ZXJSdW4oZnVsbFRleHRBcnJheSwgZnVsbFRleHRPZmZzZXQsIGZhbHNlKTsKLQkJCQlpbnQgY2hhcmFjdGVyUnVuTGVuZ3RoID0gY2hhcmFjdGVyUnVuLmxlbmd0aCgpOwotCQkJCWlmIChjaGFyYWN0ZXJSdW5MZW5ndGggPiAwKSB7Ci0JCQkJCS8vIGluZGVudCBpZiB3b3JkIGlzIHRvbyBsb25nIG9yIGZvcmNpbmcgaW5pdGlhbAotCQkJCQkvLyBpbmRlbnQKLQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gYXZhaWxhYmxlTGluZVdpZHRoIC0gY2hhcmFjdGVyUnVuTGVuZ3RoOwotCQkJCQlpZiAod2hpdGVzcGFjZU1vZGUgPT0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklHTk9SRSAmJiAoZm9yY2VJbml0aWFsSW5kZW50IHx8IChhdmFpbGFibGVMaW5lV2lkdGggPD0gMCkpKSB7Ci0JCQkJCQkvLyBpbmRlbnQgaWYgbm90IGFscmVhZHkgaW5kZW50ZWQKLQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGluZGVudElmTm90QWxyZWFkeUluZGVudGVkKHRleHRFZGl0LCBjdXJyZW50UmVnaW9uLCBpbmRlbnRMZXZlbCwgY3VycmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCB3aGl0ZXNwYWNlUnVuKTsKLQkJCQkJCS8vIHJlbWVtYmVyIHRvIHN1YnRyYWN0IHdvcmQgbGVuZ3RoCi0JCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gY2hhcmFjdGVyUnVuTGVuZ3RoOwotCQkJCQkJZm9yY2VJbml0aWFsSW5kZW50ID0gZmFsc2U7IC8vIGluaXRpYWwgaW5kZW50IGRvbmUKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGp1c3QgY29sbGFwc2Ugc3BhY2VzCi0JCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gY2hhcmFjdGVyUnVuTGVuZ3RoOwotCQkJCQl9Ci0KLQkJCQkJZnVsbFRleHRPZmZzZXQgKz0gY2hhcmFjdGVyUnVuTGVuZ3RoOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyB1cGRhdGUgYXZhaWxhYmxlIGxpbmUgd2lkdGgKLQkJcGFyZW50Q29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZvcm1hdFdpdGhpbkVuZFRhZyhUZXh0RWRpdCB0ZXh0RWRpdCwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIGNvbnN0cmFpbnRzLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c0RvY3VtZW50UmVnaW9uKSB7Ci0JCVN0cmluZyBpbmRlbnRTdHJhdGVneSA9IGNvbnN0cmFpbnRzLmdldEluZGVudFN0cmF0ZWd5KCk7Ci0JCVN0cmluZyB3aGl0ZXNwYWNlU3RyYXRlZ3kgPSBjb25zdHJhaW50cy5nZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKTsKLQkJaW50IGF2YWlsYWJsZUxpbmVXaWR0aCA9IGNvbnN0cmFpbnRzLmdldEF2YWlsYWJsZUxpbmVXaWR0aCgpOwotCQlJVGV4dFJlZ2lvbkxpc3QgdGV4dFJlZ2lvbnMgPSBjdXJyZW50RG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlpbnQgY3VycmVudFRleHRSZWdpb25JbmRleCA9IDE7Ci0KLQkJSVRleHRSZWdpb24gY3VycmVudFRleHRSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoY3VycmVudFRleHRSZWdpb25JbmRleCk7Ci0JCVN0cmluZyBjdXJyZW50VHlwZSA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJLy8gdGFnIG5hbWUgc2hvdWxkIGFsd2F5cyBiZSB0aGUgZmlyc3QgdGV4dCByZWdpb24KLQkJaWYgKGN1cnJlbnRUeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQlJVGV4dFJlZ2lvbiBuZXh0VGV4dFJlZ2lvbiA9IHRleHRSZWdpb25zLmdldChjdXJyZW50VGV4dFJlZ2lvbkluZGV4ICsgMSk7Ci0JCQlTdHJpbmcgbmV4dFR5cGUgPSBuZXh0VGV4dFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAobmV4dFR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB7Ci0JCQkJLy8gY2FsY3VsYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCQkJaW50IHRhZ05hbWVMaW5lV2lkdGggPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgKyAzOwotCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSB0YWdOYW1lTGluZVdpZHRoOwotCi0JCQkJaWYgKGluZGVudFN0cmF0ZWd5ID09IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JTkxJTkUpIHsKLQkJCQkJLy8gaWYgd2FzIGlubGluaW5nLCBuZWVkIHRvIGNoZWNrIGlmIG91dCBvZiBhdmFpbGFibGUgbGluZQotCQkJCQkvLyB3aWR0aAotCQkJCQlpZiAoYXZhaWxhYmxlTGluZVdpZHRoIDwgMCkgewotCQkJCQkJLy8gbmVlZCB0byBkZWluZGVudCBpZiBwb3NzaWJsZQotCQkJCQkJaW50IGxpbmVXaWR0aCA9IGluZGVudElmUG9zc2libGUodGV4dEVkaXQsIGNvbnN0cmFpbnRzLCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIHByZXZpb3VzRG9jdW1lbnRSZWdpb24sIHdoaXRlc3BhY2VTdHJhdGVneSwgaW5kZW50U3RyYXRlZ3ksIGZhbHNlKTsKLQkJCQkJCS8vIHVwZGF0ZSBhdmFpbGFibGUgbGluZSB3aWR0aAotCQkJCQkJaWYgKGxpbmVXaWR0aCA+IDApCi0JCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gbGluZVdpZHRoIC0gdGFnTmFtZUxpbmVXaWR0aDsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIG5vIG5lZWQgdG8gaW5kZW50Ci0JCQkJCQkvLyBqdXN0IG1ha2Ugc3VyZSB0byBkZWxldGUgcHJldmlvdXMgd2hpdGVzcGFjZSBpZgotCQkJCQkJLy8gbmVlZGVkCi0JCQkJCQlpZiAocHJldmlvdXNEb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKHByZXZpb3VzRG9jdW1lbnRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHsKLQkJCQkJCQkJU3RyaW5nIHByZXZpb3VzRG9jdW1lbnRSZWdpb25UZXh0ID0gcHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRGdWxsVGV4dCgpOwotCQkJCQkJCQlpZiAocHJldmlvdXNEb2N1bWVudFJlZ2lvblRleHQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGNvbGxhcHNlU3BhY2VzKHRleHRFZGl0LCBwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGF2YWlsYWJsZUxpbmVXaWR0aCwgcHJldmlvdXNEb2N1bWVudFJlZ2lvblRleHQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIGRlbGV0ZSBhbnkgdHJhaWwgc3BhY2VzIGFmdGVyIHRhZyBuYW1lCi0JCQkJaWYgKGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSA8IGN1cnJlbnRUZXh0UmVnaW9uLmdldExlbmd0aCgpKSB7Ci0JCQkJCWRlbGV0ZVRyYWlsaW5nU3BhY2VzKHRleHRFZGl0LCBjdXJyZW50VGV4dFJlZ2lvbiwgY3VycmVudERvY3VtZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBlbmQgdGFnIGhhcyB1bmV4cGVjdGVkIHN0dWZmLCBzbyBqdXN0IGxlYXZlIGl0IGFsb25lCi0JCX0KLQkJY29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogRm9ybWF0cyB0aGUgY29udGVudHMgd2l0aGluIGEgdGFnIGxpa2UgdGFnIG5hbWUgYW5kIGF0dHJpYnV0ZXMKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dEVkaXQKLQkgKiBAcGFyYW0gY3VycmVudERvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIHRleHRSZWdpb25zCi0JICogICAgICAgICAgICBjb250YWlucyBhdCBsZWFzdCAzIHJlZ2lvbnMKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGFnIHdhcyBlbmRlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZvcm1hdFdpdGhpblRhZyhUZXh0RWRpdCB0ZXh0RWRpdCwgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIGNvbnN0cmFpbnRzLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c0RvY3VtZW50UmVnaW9uKSB7Ci0JCWludCBhdmFpbGFibGVMaW5lV2lkdGggPSBjb25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKTsKLQkJU3RyaW5nIGluZGVudFN0cmF0ZWd5ID0gY29uc3RyYWludHMuZ2V0SW5kZW50U3RyYXRlZ3koKTsKLQkJU3RyaW5nIHdoaXRlc3BhY2VTdHJhdGVneSA9IGNvbnN0cmFpbnRzLmdldFdoaXRlc3BhY2VTdHJhdGVneSgpOwotCQlpbnQgaW5kZW50TGV2ZWwgPSBjb25zdHJhaW50cy5nZXRJbmRlbnRMZXZlbCgpOwotCQlJVGV4dFJlZ2lvbkxpc3QgdGV4dFJlZ2lvbnMgPSBjdXJyZW50RG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlpbnQgY3VycmVudFRleHRSZWdpb25JbmRleCA9IDE7Ci0KLQkJSVRleHRSZWdpb24gY3VycmVudFRleHRSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoY3VycmVudFRleHRSZWdpb25JbmRleCk7Ci0JCVN0cmluZyBjdXJyZW50VHlwZSA9IGN1cnJlbnRUZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJLy8gdGFnIG5hbWUgc2hvdWxkIGFsd2F5cyBiZSB0aGUgZmlyc3QgdGV4dCByZWdpb24KLQkJaWYgKGN1cnJlbnRUeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQlJVGV4dFJlZ2lvbiBuZXh0VGV4dFJlZ2lvbiA9IHRleHRSZWdpb25zLmdldChjdXJyZW50VGV4dFJlZ2lvbkluZGV4ICsgMSk7Ci0JCQlTdHJpbmcgbmV4dFR5cGUgPSAobmV4dFRleHRSZWdpb24gIT0gbnVsbCkgPyBuZXh0VGV4dFJlZ2lvbi5nZXRUeXBlKCkgOiBudWxsOwotCQkJaWYgKG5leHRUeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgewotCQkJCS8vIGFscmVhZHkgYXQgdGFnIGNsb3NlCi0JCQkJZm9ybWF0U3RhcnRUYWdXaXRoTm9BdHRyKHRleHRFZGl0LCBjb25zdHJhaW50cywgY3VycmVudERvY3VtZW50UmVnaW9uLCBwcmV2aW91c0RvY3VtZW50UmVnaW9uLCBhdmFpbGFibGVMaW5lV2lkdGgsIGluZGVudFN0cmF0ZWd5LCB3aGl0ZXNwYWNlU3RyYXRlZ3ksIGN1cnJlbnRUZXh0UmVnaW9uKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXh0VHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQkvLyBhbHJlYWR5IGF0IGVtcHR5IHRhZyBjbG9zZQotCQkJCWZvcm1hdEVtcHR5U3RhcnRUYWdXaXRoTm9BdHRyKHRleHRFZGl0LCBjb25zdHJhaW50cywgY3VycmVudERvY3VtZW50UmVnaW9uLCBwcmV2aW91c0RvY3VtZW50UmVnaW9uLCBhdmFpbGFibGVMaW5lV2lkdGgsIGluZGVudFN0cmF0ZWd5LCB3aGl0ZXNwYWNlU3RyYXRlZ3ksIGN1cnJlbnRUZXh0UmVnaW9uKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSAoY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpICsgMik7Ci0JCQkJYm9vbGVhbiBhbGlnbkZpbmFsQnJhY2tldCA9IGdldEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpLmdldEFsaWduRmluYWxCcmFja2V0KCk7Ci0JCQkJYm9vbGVhbiBvbmVTcGFjZUluVGFnTmFtZSA9IGdldEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpLmdldFNwYWNlQmVmb3JlRW1wdHlDbG9zZVRhZygpOwotCQkJCWJvb2xlYW4gaW5kZW50TXVsdGlwbGVBdHRyaWJ1dGUgPSBnZXRGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKS5nZXRJbmRlbnRNdWx0aXBsZUF0dHJpYnV0ZXMoKTsKLQkJCQkvLyBpbmRpY2F0ZXMgaWYgdGFnIHNwYW5uZWQgbW9yZSB0aGFuIG9uZSBsaW5lCi0JCQkJYm9vbGVhbiBzcGFuTW9yZVRoYW4xTGluZSA9IGZhbHNlOwotCQkJCS8vIGluZGljYXRlcyBpZiBhbGwgYXR0cmlidXRlcyBzaG91bGQgYmUgaW5kZW50ZWQKLQkJCQlib29sZWFuIGluZGVudEFsbEF0dHJpYnV0ZXMgPSBmYWxzZTsKLQkJCQlpZiAoaW5kZW50TXVsdGlwbGVBdHRyaWJ1dGUpIHsKLQkJCQkJaW50IGF0dHJpYnV0ZXNDb3VudCA9IDA7Ci0JCQkJCWludCBpID0gMjsKLQkJCQkJd2hpbGUgKGkgPCB0ZXh0UmVnaW9ucy5zaXplKCkgJiYgYXR0cmlidXRlc0NvdW50IDwgMikgewotCQkJCQkJaWYgKHRleHRSZWdpb25zLmdldChpKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKQotCQkJCQkJCSsrYXR0cmlidXRlc0NvdW50OwotCQkJCQl9Ci0JCQkJCWluZGVudEFsbEF0dHJpYnV0ZXMgPSAoYXR0cmlidXRlc0NvdW50ID4gMSk7Ci0JCQkJfQotCi0JCQkJd2hpbGUgKChjdXJyZW50VGV4dFJlZ2lvbkluZGV4ICsgMSkgPCB0ZXh0UmVnaW9ucy5zaXplKCkpIHsKLQkJCQkJbmV4dFRleHRSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoY3VycmVudFRleHRSZWdpb25JbmRleCArIDEpOwotCQkJCQluZXh0VHlwZSA9IG5leHRUZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJCQkJaWYgKG5leHRUeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCQkJYm9vbGVhbiBpbmRlbnRBdHRyaWJ1dGUgPSBpbmRlbnRBbGxBdHRyaWJ1dGVzOwotCQkJCQkJaWYgKCFpbmRlbnRBdHRyaWJ1dGUpCi0JCQkJCQkJaW5kZW50QXR0cmlidXRlID0gc2hvdWxkSW5kZW50QmVmb3JlQXR0cmlidXRlKGNvbnN0cmFpbnRzLCB0ZXh0UmVnaW9ucywgYXZhaWxhYmxlTGluZVdpZHRoLCBjdXJyZW50VGV4dFJlZ2lvbkluZGV4LCBjdXJyZW50VGV4dFJlZ2lvbiwgbmV4dFRleHRSZWdpb24pOwotCQkJCQkJaWYgKGluZGVudEF0dHJpYnV0ZSkgewotCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGluZGVudElmTm90QWxyZWFkeUluZGVudGVkKHRleHRFZGl0LCBpbmRlbnRMZXZlbCArIDEsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgY3VycmVudFRleHRSZWdpb24pOwotCQkJCQkJCXNwYW5Nb3JlVGhhbjFMaW5lID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIG90aGVyd2lzZSwgaW5zZXJ0U3BhY2VBbmRDb2xsYXBzZQotCQkJCQkJCWluc2VydFNwYWNlQW5kQ29sbGFwc2UodGV4dEVkaXQsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgYXZhaWxhYmxlTGluZVdpZHRoLCBjdXJyZW50VGV4dFJlZ2lvbik7Ci0JCQkJCQkJLy8gdXBkYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoIC09IChjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgKyAxKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChuZXh0VHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCQkJCS8vIGlmIG5lZWQgdG8gYWxpZ24gYnJhY2tldCBvbiBuZXh0IGxpbmUsIGluZGVudAotCQkJCQkJaWYgKGFsaWduRmluYWxCcmFja2V0ICYmIHNwYW5Nb3JlVGhhbjFMaW5lKSB7Ci0JCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gaW5kZW50SWZOb3RBbHJlYWR5SW5kZW50ZWQodGV4dEVkaXQsIGluZGVudExldmVsLCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIGN1cnJlbnRUZXh0UmVnaW9uKTsKLQkJCQkJCQktLWF2YWlsYWJsZUxpbmVXaWR0aDsgLy8gZm9yIHRhZyBjbG9zZSBpdHNlbGYKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIG90aGVyd2lzZSwganVzdCBkZWxldGUgc3BhY2UgYmVmb3JlIHRhZyBjbG9zZQotCQkJCQkJCWlmIChjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgPCBjdXJyZW50VGV4dFJlZ2lvbi5nZXRMZW5ndGgoKSkgewotCQkJCQkJCQlkZWxldGVUcmFpbGluZ1NwYWNlcyh0ZXh0RWRpdCwgY3VycmVudFRleHRSZWdpb24sIGN1cnJlbnREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSAoY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpICsgMSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLy8gdXBkYXRlIGxpbmUgd2lkdGgKLQkJCQkJCWNvbnN0cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChhdmFpbGFibGVMaW5lV2lkdGgpOwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKG5leHRUeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCQkJCQkJaW50IHRleHRMZW5ndGggPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCQlpbnQgcmVnaW9uTGVuZ3RoID0gY3VycmVudFRleHRSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0KLQkJCQkJCWJvb2xlYW4gdGhlcmVBcmVTcGFjZXMgPSB0ZXh0TGVuZ3RoIDwgcmVnaW9uTGVuZ3RoOwotCQkJCQkJaWYgKCFvbmVTcGFjZUluVGFnTmFtZSAmJiB0aGVyZUFyZVNwYWNlcykgewotCQkJCQkJCS8vIGRlbGV0ZSBhbnkgdHJhaWwgc3BhY2VzIGFmdGVyIHRhZyBuYW1lCi0JCQkJCQkJZGVsZXRlVHJhaWxpbmdTcGFjZXModGV4dEVkaXQsIGN1cnJlbnRUZXh0UmVnaW9uLCBjdXJyZW50RG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSAoY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpICsgMik7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBpbnNlcnQgYSBzcGFjZSBhbmQgY29sbGFwc2UgT05MWSBJRiBpdCdzIHNwZWNpZmllZAotCQkJCQkJZWxzZSBpZiAob25lU3BhY2VJblRhZ05hbWUpIHsKLQkJCQkJCQlpbnNlcnRTcGFjZUFuZENvbGxhcHNlKHRleHRFZGl0LCBjdXJyZW50RG9jdW1lbnRSZWdpb24sIGF2YWlsYWJsZUxpbmVXaWR0aCwgY3VycmVudFRleHRSZWdpb24pOwotCQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSAoY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpICsgMyk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyB1cGRhdGUgbGluZSB3aWR0aAotCQkJCQkJY29uc3RyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChjdXJyZW50VHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUgJiYgbmV4dFR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQkJCQlpZiAoY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpIDwgY3VycmVudFRleHRSZWdpb24uZ2V0TGVuZ3RoKCkpIHsKLQkJCQkJCQkJZGVsZXRlVHJhaWxpbmdTcGFjZXModGV4dEVkaXQsIGN1cnJlbnRUZXh0UmVnaW9uLCBjdXJyZW50RG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCX0KLQkJCQkJCQkvLyB1cGRhdGUgYXZhaWxhYmxlIHdpZHRoCi0JCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoIC09IGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGN1cnJlbnRUeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTICYmIG5leHRUeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCQlpZiAoY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpIDwgY3VycmVudFRleHRSZWdpb24uZ2V0TGVuZ3RoKCkpIHsKLQkJCQkJCQkJZGVsZXRlVHJhaWxpbmdTcGFjZXModGV4dEVkaXQsIGN1cnJlbnRUZXh0UmVnaW9uLCBjdXJyZW50RG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCX0KLQkJCQkJCQkvLyB1cGRhdGUgYXZhaWxhYmxlIHdpZHRoCi0JCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoIC09IGN1cnJlbnRUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIG90aGVyd2lzZSwgaW5zZXJ0U3BhY2VBbmRDb2xsYXBzZQotCQkJCQkJCWluc2VydFNwYWNlQW5kQ29sbGFwc2UodGV4dEVkaXQsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgYXZhaWxhYmxlTGluZVdpZHRoLCBjdXJyZW50VGV4dFJlZ2lvbik7Ci0JCQkJCQkJLy8gdXBkYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoIC09IChjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgKyAxKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljdXJyZW50VGV4dFJlZ2lvbiA9IG5leHRUZXh0UmVnaW9uOwotCQkJCQljdXJyZW50VHlwZSA9IG5leHRUeXBlOwotCQkJCQkrK2N1cnJlbnRUZXh0UmVnaW9uSW5kZXg7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIHVwZGF0ZSBsaW5lIHdpZHRoCi0JCWNvbnN0cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChhdmFpbGFibGVMaW5lV2lkdGgpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEZvcm1hdCBhbiBYTUwgY29tbWVudCBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZm9ybWF0Q29tbWVudChUZXh0RWRpdCB0ZXh0RWRpdCwgUG9zaXRpb24gZm9ybWF0UmFuZ2UsIFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cyBwYXJlbnRDb25zdHJhaW50cywgRE9NUmVnaW9uIGN1cnJlbnRET01SZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNSZWdpb24pIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gY3VycmVudERPTVJlZ2lvbi5kb2N1bWVudFJlZ2lvbjsKLQkJaW50IGxpbmVXaWR0aCA9IHBhcmVudENvbnN0cmFpbnRzLmdldEF2YWlsYWJsZUxpbmVXaWR0aCgpIC0gY3VycmVudFJlZ2lvbi5nZXRGdWxsVGV4dCgpLmxlbmd0aCgpOwotCQkvLyBEb24ndCBmb3JtYXQgaWYgd2UncmUgbm90IGV4Y2VlZGluZyB0aGUgYXZhaWxhYmxlIGxpbmUgd2lkdGgsIG9yIGlmIHRoZSB3aGl0ZXNwYWNlCi0JCS8vIHN0cmF0ZWd5IGlzIHRvIHByZXNlcnZlIHdoaXRlc3BhY2UgLSBCdXQgdXBkYXRlIGxpbmUgd2lkdGguCi0JCWlmKGN1cnJlbnRSZWdpb24gPT0gbnVsbCB8fCAobGluZVdpZHRoID49IDApIHx8Ci0JCQkJcGFyZW50Q29uc3RyYWludHMuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkgPT0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFKSB7Ci0JCQlwYXJlbnRDb25zdHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgobGluZVdpZHRoKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSXRlcmF0b3IgaXQgPSBjdXJyZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkvLyBJdGVyYXRlIG92ZXIgZWFjaCB0ZXh0IHJlZ2lvbiBvZiB0aGUgY29tbWVudAotCQl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHRleHQgPSAoSVRleHRSZWdpb24pIGl0Lm5leHQoKTsKLQkJCWZvcm1hdENvbW1lbnRUYWcodGV4dEVkaXQsIHBhcmVudENvbnN0cmFpbnRzLCBjdXJyZW50UmVnaW9uLCB0ZXh0KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBIYW5kbGVzIGZvcm1hdHRpbmcgdmFyaW91cyBwb3J0aW9ucyBvZiBhbiBYTUwgY29tbWVudC4gQmVjYXVzZSB0aGUgWE1MCi0JICogQ29tbWVudCBpcyBjb25zaWRlcmVkIGl0cyBvd24gZG9jdW1lbnQgcmVnaW9uLCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUKLQkgKiB0aGUgcHJldmlvdXMgcmVnaW9uIG11c3QgYmUgcmVmZXJyZWQgdG8gZm9yIHByb3BlciBpbmRlbnRhdGlvbgotCSAqIGNvbnNpZGVyYXRpb24uIEJlY2F1c2Ugb2YgdGhpcywgbW9zdCBvZiB0aGUgc3BlY2lhbCBjYXNlcyBhcmUKLQkgKiBjYXRlcmluZyB0byB0aGUgb3BlbmluZyB0ZXh0IHJlZ2lvbiBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0RWRpdAotCSAqIEBwYXJhbSBwYXJlbnRDb25zdHJhaW50cwotCSAqIEBwYXJhbSBjdXJyZW50UmVnaW9uCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqLwotCXByaXZhdGUgdm9pZCBmb3JtYXRDb21tZW50VGFnKFRleHRFZGl0IHRleHRFZGl0LCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgcGFyZW50Q29uc3RyYWludHMsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudFJlZ2lvbiwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWludCBhdmFpbGFibGVMaW5lV2lkdGggPSBwYXJlbnRDb25zdHJhaW50cy5nZXRBdmFpbGFibGVMaW5lV2lkdGgoKTsKLQkJaW50IGluZGVudExldmVsID0gcGFyZW50Q29uc3RyYWludHMuZ2V0SW5kZW50TGV2ZWwoKSArIDE7Ci0JCWJvb2xlYW4gaW5pdGlhbEluZGVudCA9IGZhbHNlOwotCQkKLQkJLy8gSW5kZW50IHRoZSB0ZXh0IG9mIHRoZSBjb21tZW50IGFuIGFkZGl0aW9uYWwgbGV2ZWwKLQkJaWYocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQpIHsKLQkJCWluZGVudExldmVsKys7Ci0JCQlpbml0aWFsSW5kZW50ID0gdHJ1ZTsKLQkJfQotCQkKLQkJaW50IGZ1bGxUZXh0T2Zmc2V0ID0gMDsKLQkJY2hhcltdIGZ1bGxUZXh0QXJyYXkgPSBjdXJyZW50UmVnaW9uLmdldEZ1bGxUZXh0KHJlZ2lvbikudG9DaGFyQXJyYXkoKTsKLQkJd2hpbGUgKGZ1bGxUZXh0T2Zmc2V0IDwgZnVsbFRleHRBcnJheS5sZW5ndGgpIHsKLQkJCS8vIGdhdGhlciBhbGwgd2hpdGVzcGFjZXMKLQkJCVN0cmluZyB3aGl0ZXNwYWNlUnVuID0gbnVsbDsKLQkJCQotCQkJLy8gSWYgdGhlIHJlZ2lvbiBpcyBhIGNvbW1lbnQgb3BlbmluZywgdGhlIHdoaXRlc3BhY2Ugd291bGQgYWN0dWFsbHkgY29tZSBmcm9tIHRoZQotCQkJLy8gcHJldmlvdXMgZG9jdW1lbnQgcmVnaW9uCi0JCQlpZihyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTiAmJiBjdXJyZW50UmVnaW9uLmdldFByZXZpb3VzKCkgIT0gbnVsbCkKLQkJCQl3aGl0ZXNwYWNlUnVuID0gZ2V0Q2hhcmFjdGVyUnVuKGN1cnJlbnRSZWdpb24uZ2V0UHJldmlvdXMoKS5nZXRGdWxsVGV4dCgpLnRvQ2hhckFycmF5KCksIDAsIHRydWUpOwotCQkJZWxzZQotCQkJCXdoaXRlc3BhY2VSdW4gPSBnZXRDaGFyYWN0ZXJSdW4oZnVsbFRleHRBcnJheSwgZnVsbFRleHRPZmZzZXQsIHRydWUpOwotCQkJCi0JCQlpZiAod2hpdGVzcGFjZVJ1bi5sZW5ndGgoKSA+IDApIHsKLQkJCQkvLyBvZmZzZXQgd2hlcmUgd2hpdGVzcGFjZSBzdGFydHMKLQkJCQlpbnQgd2hpdGVzcGFjZVN0YXJ0ID0gZnVsbFRleHRPZmZzZXQ7Ci0JCQkJLy8gdXBkYXRlIGN1cnJlbnQgb2Zmc2V0IGluIGZ1bGxUZXh0IGZvciBub24gY29tbWVudC1vcGVuaW5nIHJlZ2lvbnMKLQkJCQlpZihyZWdpb24uZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTikKLQkJCQkJZnVsbFRleHRPZmZzZXQgKz0gd2hpdGVzcGFjZVJ1bi5sZW5ndGgoKTsKLQotCQkJCS8vIGdhdGhlciBmb2xsb3dpbmcgd29yZAotCQkJCVN0cmluZyBjaGFyYWN0ZXJSdW4gPSBnZXRDaGFyYWN0ZXJSdW4oZnVsbFRleHRBcnJheSwgZnVsbFRleHRPZmZzZXQsIGZhbHNlKTsKLQkJCQlpbnQgY2hhcmFjdGVyUnVuTGVuZ3RoID0gY2hhcmFjdGVyUnVuLmxlbmd0aCgpOwotCQkJCWlmIChjaGFyYWN0ZXJSdW5MZW5ndGggPiAwKSB7Ci0JCQkJCS8vIGluZGVudCBpZiB3b3JkIGlzIHRvbyBsb25nIG9yIGZvcmNpbmcgaW5pdGlhbAotCQkJCQkvLyBpbmRlbnQKLQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoIC09IGNoYXJhY3RlclJ1bkxlbmd0aDsKLQkJCQkJLy8gb2Zmc2V0IHdoZXJlIGluZGVudC9jb2xsYXBzZSB3aWxsIGhhcHBlbiAtIGZvciBjb21tZW50LW9wZW5pbmcgcmVnaW9ucywKLQkJCQkJLy8gdGhpcyBvY2N1cnMgaW4gdGhlIHByZXZpb3VzIGRvY3VtZW50IHJlZ2lvbgotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJCQlpZihyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTiAmJiBjdXJyZW50UmVnaW9uLmdldFByZXZpb3VzKCkgIT0gbnVsbCkKLQkJCQkJCXN0YXJ0T2Zmc2V0ID0gY3VycmVudFJlZ2lvbi5nZXRQcmV2aW91cygpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCWVsc2UKLQkJCQkJCXN0YXJ0T2Zmc2V0ID0gY3VycmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pICsgd2hpdGVzcGFjZVN0YXJ0OwotCQkJCQkKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOIHx8IGluaXRpYWxJbmRlbnQgfHwgKGF2YWlsYWJsZUxpbmVXaWR0aCA8PSAwKSkgewotCQkJCQkJLy8gaW5kZW50IGlmIG5vdCBhbHJlYWR5IGluZGVudGVkCi0JCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggPSBpbmRlbnRJZk5vdEFscmVhZHlJbmRlbnRlZCh0ZXh0RWRpdCwgY3VycmVudFJlZ2lvbiwgaW5kZW50TGV2ZWwsIHN0YXJ0T2Zmc2V0LCB3aGl0ZXNwYWNlUnVuKTsKLQkJCQkJCS8vIHJlbWVtYmVyIHRvIHN1YnRyYWN0IHdvcmQgbGVuZ3RoCi0JCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gY2hhcmFjdGVyUnVuTGVuZ3RoOwotCQkJCQkJLy8gSW5kZW50ZWQgdGhlIGZpcnN0IHdvcmQgb2YgdGhlIGNvbW1lbnQKLQkJCQkJCWlmKGluaXRpYWxJbmRlbnQpCi0JCQkJCQkJaW5pdGlhbEluZGVudCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8ganVzdCBjb2xsYXBzZSBzcGFjZXMKLQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCA9IGNvbGxhcHNlU3BhY2VzKHRleHRFZGl0LCBzdGFydE9mZnNldCwgYXZhaWxhYmxlTGluZVdpZHRoLCB3aGl0ZXNwYWNlUnVuKTsKLQkJCQkJfQotCi0JCQkJCWZ1bGxUZXh0T2Zmc2V0ICs9IGNoYXJhY3RlclJ1bkxlbmd0aDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGhhbmRsZSB0cmFpbGluZyB3aGl0ZXNwYWNlCi0JCQkJCWludCB3aGl0ZXNwYWNlT2Zmc2V0ID0gY3VycmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pICsgd2hpdGVzcGFjZVN0YXJ0OwotCQkJCQlEZWxldGVFZGl0IGRlbGV0ZVRyYWlsaW5nID0gbmV3IERlbGV0ZUVkaXQod2hpdGVzcGFjZU9mZnNldCwgd2hpdGVzcGFjZVJ1bi5sZW5ndGgoKSk7Ci0JCQkJCXRleHRFZGl0LmFkZENoaWxkKGRlbGV0ZVRyYWlsaW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBnYXRoZXIgd29yZAotCQkJCVN0cmluZyBjaGFyYWN0ZXJSdW4gPSBnZXRDaGFyYWN0ZXJSdW4oZnVsbFRleHRBcnJheSwgZnVsbFRleHRPZmZzZXQsIGZhbHNlKTsKLQkJCQlpbnQgY2hhcmFjdGVyUnVuTGVuZ3RoID0gY2hhcmFjdGVyUnVuLmxlbmd0aCgpOwotCQkJCWlmIChjaGFyYWN0ZXJSdW5MZW5ndGggPiAwKSB7Ci0JCQkJCS8vIGluZGVudCBpZiB3b3JkIGlzIHRvbyBsb25nIG9yIGZvcmNpbmcgaW5pdGlhbAotCQkJCQkvLyBpbmRlbnQKLQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gYXZhaWxhYmxlTGluZVdpZHRoIC0gY2hhcmFjdGVyUnVuTGVuZ3RoOwotCi0JCQkJCWlmICgocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOKSB8fCBpbml0aWFsSW5kZW50IHx8IChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCAmJiBhdmFpbGFibGVMaW5lV2lkdGggPD0gMCkpIHsKLQkJCQkJCS8vIGluZGVudCBpZiBub3QgYWxyZWFkeSBpbmRlbnRlZAotCQkJCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gaW5kZW50SWZOb3RBbHJlYWR5SW5kZW50ZWQodGV4dEVkaXQsIGN1cnJlbnRSZWdpb24sIGluZGVudExldmVsLCBjdXJyZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbiksIHdoaXRlc3BhY2VSdW4pOwotCQkJCQkJLy8gcmVtZW1iZXIgdG8gc3VidHJhY3Qgd29yZCBsZW5ndGgKLQkJCQkJCWF2YWlsYWJsZUxpbmVXaWR0aCAtPSBjaGFyYWN0ZXJSdW5MZW5ndGg7Ci0JCQkJCQlpZihpbml0aWFsSW5kZW50KQotCQkJCQkJCWluaXRpYWxJbmRlbnQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGp1c3QgY29sbGFwc2Ugc3BhY2VzCi0JCQkJCQlhdmFpbGFibGVMaW5lV2lkdGggLT0gY2hhcmFjdGVyUnVuTGVuZ3RoOwotCQkJCQl9Ci0JCQkJCWZ1bGxUZXh0T2Zmc2V0ICs9IGNoYXJhY3RlclJ1bkxlbmd0aDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gdXBkYXRlIGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCXBhcmVudENvbnN0cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChhdmFpbGFibGVMaW5lV2lkdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgZWl0aGVyIGEgU3RyaW5nIG9mIHdoaXRlc3BhY2Ugb3IgY2hhcmFjdGVycyBkZXBlbmRpbmcgb24KLQkgKiBmb3JXaGl0ZXNwYWNlCi0JICogCi0JICogQHBhcmFtIGZ1bGxUZXh0QXJyYXkKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGFycmF5IHRvIGxvb2sgaW4KLQkgKiBAcGFyYW0gdGV4dE9mZnNldAotCSAqICAgICAgICAgICAgdGhlIHN0YXJ0IG9mZnNldCB0byBzdGFydCBzZWFyY2hpbmcKLQkgKiBAcGFyYW0gZm9yV2hpdGVzcGFjZQotCSAqICAgICAgICAgICAgdHJ1ZSBpZiBzaG91bGQgcmV0dXJuIHdoaXRlc3BhY2VzLCBmYWxzZSBvdGhlcndpc2UKLQkgKiBAcmV0dXJuIGEgU3RyaW5nIG9mIGVpdGhlciBhbGwgd2hpdGVzcGFjZSBvciBhbGwgY2hhcmFjdGVycy4gTmV2ZXIKLQkgKiAgICAgICAgIHJldHVybnMgbnVsbAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldENoYXJhY3RlclJ1bihjaGFyW10gZnVsbFRleHRBcnJheSwgaW50IHRleHRPZmZzZXQsIGJvb2xlYW4gZm9yV2hpdGVzcGFjZSkgewotCQlTdHJpbmdCdWZmZXIgY2hhcmFjdGVyUnVuID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlib29sZWFuIG5vbkNoYXJhY3RlckZvdW5kID0gZmFsc2U7Ci0JCXdoaWxlICh0ZXh0T2Zmc2V0IDwgZnVsbFRleHRBcnJheS5sZW5ndGggJiYgIW5vbkNoYXJhY3RlckZvdW5kKSB7Ci0JCQljaGFyIGMgPSBmdWxsVGV4dEFycmF5W3RleHRPZmZzZXRdOwotCQkJYm9vbGVhbiBpc1doaXRlc3BhY2UgPSBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpOwotCQkJaWYgKChmb3JXaGl0ZXNwYWNlICYmIGlzV2hpdGVzcGFjZSkgfHwgKCFmb3JXaGl0ZXNwYWNlICYmICFpc1doaXRlc3BhY2UpKQotCQkJCWNoYXJhY3RlclJ1bi5hcHBlbmQoYyk7Ci0JCQllbHNlCi0JCQkJbm9uQ2hhcmFjdGVyRm91bmQgPSB0cnVlOwotCQkJKyt0ZXh0T2Zmc2V0OwotCQl9Ci0JCXJldHVybiBjaGFyYWN0ZXJSdW4udG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRJbmRlbnRTdHJpbmcoaW50IGluZGVudExldmVsKSB7Ci0JCVN0cmluZ0J1ZmZlciBpbmRlbnRTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBpbmRlbnQgPSBnZXRGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKS5nZXRPbmVJbmRlbnQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRMZXZlbDsgKytpKSB7Ci0JCQlpbmRlbnRTdHJpbmcuYXBwZW5kKGluZGVudCk7Ci0JCX0KLQkJcmV0dXJuIGluZGVudFN0cmluZy50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCBYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMgZ2V0Rm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkgewotCQlpZiAoZlByZWZlcmVuY2VzID09IG51bGwpCi0JCQlmUHJlZmVyZW5jZXMgPSBuZXcgWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBmUHJlZmVyZW5jZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9ybWF0dGluZ1ByZWZlcmVuY2VzKFhNTEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcykgewotCQlmUHJlZmVyZW5jZXMgPSBwcmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBJbmRlbnQgaWYgd2hpdGVzcGFjZVJ1biBkb2VzIG5vdCBhbHJlYWR5IGNvbnRhaW4gYW4gaW5kZW50Ci0JICogCi0JICogQHBhcmFtIHRleHRFZGl0Ci0JICogQHBhcmFtIGluZGVudExldmVsCi0JICogQHBhcmFtIGluZGVudFN0YXJ0T2Zmc2V0Ci0JICogQHBhcmFtIG1heEF2YWlsYWJsZUxpbmVXaWR0aAotCSAqIEBwYXJhbSB3aGl0ZXNwYWNlUnVuCi0JICogQHJldHVybiBuZXcgYXZhaWxhYmxlIGxpbmUgd2lkdGggdXAgdG8gd2hlcmUgaW5kZW50ZWQKLQkgKi8KLQlwcml2YXRlIGludCBpbmRlbnRJZk5vdEFscmVhZHlJbmRlbnRlZChUZXh0RWRpdCB0ZXh0RWRpdCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50UmVnaW9uLCBpbnQgaW5kZW50TGV2ZWwsIGludCBpbmRlbnRTdGFydE9mZnNldCwgU3RyaW5nIHdoaXRlc3BhY2VSdW4pIHsKLQkJaW50IG1heEF2YWlsYWJsZUxpbmVXaWR0aCA9IGdldEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpLmdldE1heExpbmVXaWR0aCgpOwotCi0JCWludCBhdmFpbGFibGVMaW5lV2lkdGg7Ci0JCVN0cmluZyBpbmRlbnRTdHJpbmcgPSBnZXRJbmRlbnRTdHJpbmcoaW5kZW50TGV2ZWwpOwotCQlTdHJpbmcgbmV3TGluZUFuZEluZGVudCA9IGdldExpbmVEZWxpbWl0ZXIoY3VycmVudFJlZ2lvbikgKyBpbmRlbnRTdHJpbmc7Ci0KLQkJLy8gaWYgbm90IGFscmVhZHkgY29ycmVjdGx5IGluZGVudGVkCi0JCWlmICghbmV3TGluZUFuZEluZGVudC5lcXVhbHMod2hpdGVzcGFjZVJ1bikpIHsKLQkJCWlmICh3aGl0ZXNwYWNlUnVuICE9IG51bGwpIHsKLQkJCQkvLyByZXBsYWNlIGV4aXN0aW5nIHdoaXRlc3BhY2UgcnVuCi0JCQkJUmVwbGFjZUVkaXQgcmVwbGFjZUVkaXQgPSBuZXcgUmVwbGFjZUVkaXQoaW5kZW50U3RhcnRPZmZzZXQsIHdoaXRlc3BhY2VSdW4ubGVuZ3RoKCksIG5ld0xpbmVBbmRJbmRlbnQpOwotCQkJCXRleHRFZGl0LmFkZENoaWxkKHJlcGxhY2VFZGl0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGp1c3QgaW5zZXJ0IGNvcnJlY3QgaW5kZW50Ci0JCQkJSW5zZXJ0RWRpdCBpbnNlcnRFZGl0ID0gbmV3IEluc2VydEVkaXQoaW5kZW50U3RhcnRPZmZzZXQsIG5ld0xpbmVBbmRJbmRlbnQpOwotCQkJCXRleHRFZGl0LmFkZENoaWxkKGluc2VydEVkaXQpOwotCQkJfQotCQl9Ci0JCS8vIHVwZGF0ZSBsaW5lIHdpZHRoCi0JCWF2YWlsYWJsZUxpbmVXaWR0aCA9IG1heEF2YWlsYWJsZUxpbmVXaWR0aCAtIGluZGVudFN0cmluZy5sZW5ndGgoKTsKLQkJcmV0dXJuIGF2YWlsYWJsZUxpbmVXaWR0aDsKLQl9Ci0KLQlwcml2YXRlIGludCBpbmRlbnRJZk5vdEFscmVhZHlJbmRlbnRlZChUZXh0RWRpdCB0ZXh0RWRpdCwgaW50IGluZGVudExldmVsLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gY3VycmVudFRleHRSZWdpb24pIHsKLQkJLy8gaW5kZW50IGlmIG5vdCBhbHJlYWR5IGluZGVudGVkCi0JCWludCB0ZXh0TGVuZ3RoID0gY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQlpbnQgcmVnaW9uTGVuZ3RoID0gY3VycmVudFRleHRSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWludCBpbmRlbnRTdGFydE9mZnNldCA9IGN1cnJlbnREb2N1bWVudFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KGN1cnJlbnRUZXh0UmVnaW9uKTsKLQkJU3RyaW5nIGZ1bGxUZXh0ID0gY3VycmVudERvY3VtZW50UmVnaW9uLmdldEZ1bGxUZXh0KGN1cnJlbnRUZXh0UmVnaW9uKTsKLQkJU3RyaW5nIHdoaXRlc3BhY2VSdW4gPSBmdWxsVGV4dC5zdWJzdHJpbmcodGV4dExlbmd0aCwgcmVnaW9uTGVuZ3RoKTsKLQotCQkvLyB1cGRhdGUgbGluZSB3aWR0aAotCQlpbnQgYXZhaWxhYmxlTGluZVdpZHRoID0gaW5kZW50SWZOb3RBbHJlYWR5SW5kZW50ZWQodGV4dEVkaXQsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgaW5kZW50TGV2ZWwsIGluZGVudFN0YXJ0T2Zmc2V0LCB3aGl0ZXNwYWNlUnVuKTsKLQkJcmV0dXJuIGF2YWlsYWJsZUxpbmVXaWR0aDsKLQl9Ci0KLQlwcml2YXRlIGludCBpbmRlbnRJZlBvc3NpYmxlKFRleHRFZGl0IHRleHRFZGl0LCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgdGhpc0NvbnN0cmFpbnRzLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c0RvY3VtZW50UmVnaW9uLCBTdHJpbmcgd2hpdGVzcGFjZVN0cmF0ZWd5LCBTdHJpbmcgaW5kZW50U3RyYXRlZ3ksIGJvb2xlYW4gYWRkSW5kZW50KSB7Ci0JCWludCBhdmFpbGFibGVMaW5lV2lkdGggPSAtMTsKLQkJLy8gaWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgZG9jdW1lbnQgcmVnaW9uLCB0aGVyZSBpcyBubyBuZWVkIHRvIGluZGVudAotCQkvLyBiZWNhdXNlIHdlJ3JlIGF0IGJlZ2lubmluZyBvZiBkb2N1bWVudAotCQlpZiAocHJldmlvdXNEb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGF2YWlsYWJsZUxpbmVXaWR0aDsKLQotCQkvLyBvbmx5IGluZGVudCBpZiBpZ25vcmluZyB3aGl0ZXNwYWNlIG9yIGlmIGNvbGxhcHNpbmcgYW5kCi0JCS8vIHRoZXJlIHdhcyBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGJlZm9yZSB0aGlzIHJlZ2lvbgotCQlib29sZWFuIGNhbkluZGVudCA9IGZhbHNlOwotCQlTdHJpbmcgcHJldmlvdXNSZWdpb25GdWxsVGV4dCA9IG51bGw7Ci0JCVN0cmluZyBwcmV2aW91c1JlZ2lvblR5cGUgPSBudWxsOwotCi0JCWlmICh3aGl0ZXNwYWNlU3RyYXRlZ3kgPT0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklHTk9SRSkgewotCQkJLy8gaWYgaWdub3JpbmcsIG5lZWQgdG8gY2hlY2sgaWYgcHJldmlvdXMgcmVnaW9uIHdhcyBjZGF0YQotCQkJcHJldmlvdXNSZWdpb25UeXBlID0gcHJldmlvdXNEb2N1bWVudFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocHJldmlvdXNSZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQpCi0JCQkJY2FuSW5kZW50ID0gZmFsc2U7Ci0JCQllbHNlCi0JCQkJY2FuSW5kZW50ID0gdHJ1ZTsKLQkJfQotCQllbHNlIGlmICh3aGl0ZXNwYWNlU3RyYXRlZ3kgPT0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLkNPTExBUFNFKSB7Ci0JCQkvLyBpZiBjb2xsYXBzaW5nLCBuZWVkIHRvIGNoZWNrIGlmIHByZXZpb3VzIHJlZ2lvbiBlbmRlZCBpbiBhCi0JCQkvLyB3aGl0ZXNwYWNlCi0JCQlwcmV2aW91c1JlZ2lvblR5cGUgPSBwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChwcmV2aW91c1JlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgewotCQkJCXByZXZpb3VzUmVnaW9uRnVsbFRleHQgPSBwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldEZ1bGxUZXh0KCk7Ci0JCQkJaW50IGxlbmd0aCA9IHByZXZpb3VzUmVnaW9uRnVsbFRleHQubGVuZ3RoKCk7Ci0JCQkJaWYgKGxlbmd0aCA+IDEpCi0JCQkJCWNhbkluZGVudCA9IENoYXJhY3Rlci5pc1doaXRlc3BhY2UocHJldmlvdXNSZWdpb25GdWxsVGV4dC5jaGFyQXQobGVuZ3RoIC0gMSkpOwotCQkJfQotCQl9Ci0JCWlmIChjYW5JbmRlbnQpIHsKLQkJCWludCBpbmRlbnRTdGFydE9mZnNldCA9IGN1cnJlbnREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJU3RyaW5nIHdoaXRlc3BhY2VSdW4gPSBudWxsOwotCi0JCQkvLyBnZXQgcHJldmlvdXMgcmVnaW9uIHR5cGUgaWYgaXQgd2FzIG5vdCBwcmV2aW91c2x5IHJldHJpZXZlZAotCQkJaWYgKHByZXZpb3VzUmVnaW9uVHlwZSA9PSBudWxsKQotCQkJCXByZXZpb3VzUmVnaW9uVHlwZSA9IHByZXZpb3VzRG9jdW1lbnRSZWdpb24uZ2V0VHlwZSgpOwotCi0JCQkvLyBnZXQgcHJldmlvdXMgcmVnaW9uJ3MgdGV4dCBpZiBpdCB3YXMgbm90IHByZXZpb3VzbHkgcmV0cmlldmVkCi0JCQlpZiAocHJldmlvdXNSZWdpb25GdWxsVGV4dCA9PSBudWxsICYmIHByZXZpb3VzUmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKQotCQkJCXByZXZpb3VzUmVnaW9uRnVsbFRleHQgPSBwcmV2aW91c0RvY3VtZW50UmVnaW9uLmdldEZ1bGxUZXh0KCk7Ci0KLQkJCS8vIGlmIHByZXZpb3VzIHJlZ2lvbiB3YXMgb25seSB3aGl0ZXNwYWNlLCB0aGlzIG1heQotCQkJLy8gYWxyZWFkeSBiZSBpbmRlbnRlZCwgc28gbmVlZCB0byBtYWtlIHN1cmUKLQkJCWlmICgocHJldmlvdXNSZWdpb25GdWxsVGV4dCAhPSBudWxsKSAmJiAocHJldmlvdXNSZWdpb25GdWxsVGV4dC50cmltKCkubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQlpbmRlbnRTdGFydE9mZnNldCA9IHByZXZpb3VzRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQl3aGl0ZXNwYWNlUnVuID0gcHJldmlvdXNSZWdpb25GdWxsVGV4dDsKLQkJCX0KLQotCQkJaW50IGluZGVudExldmVsID0gdGhpc0NvbnN0cmFpbnRzLmdldEluZGVudExldmVsKCk7Ci0JCQlpZiAoYWRkSW5kZW50ICYmIGluZGVudFN0cmF0ZWd5ID09IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JTkRFTlQpIHsKLQkJCQkrK2luZGVudExldmVsOwotCQkJCXRoaXNDb25zdHJhaW50cy5zZXRJbmRlbnRMZXZlbChpbmRlbnRMZXZlbCk7Ci0JCQl9Ci0KLQkJCS8vIGluZGVudCBpZiBub3QgYWxyZWFkeSBpbmRlbnRlZAotCQkJYXZhaWxhYmxlTGluZVdpZHRoID0gaW5kZW50SWZOb3RBbHJlYWR5SW5kZW50ZWQodGV4dEVkaXQsIGN1cnJlbnREb2N1bWVudFJlZ2lvbiwgaW5kZW50TGV2ZWwsIGluZGVudFN0YXJ0T2Zmc2V0LCB3aGl0ZXNwYWNlUnVuKTsKLQkJfQotCQlyZXR1cm4gYXZhaWxhYmxlTGluZVdpZHRoOwotCX0KLQotCS8qKgotCSAqIEFsbG93IGV4YWN0bHkgb25lIHdoaXRlc3BhY2UgaW4gY3VycmVudFRleHRSZWdpb24uIElmIHRoZXJlIGFyZSBtb3JlLAotCSAqIGNvbGxhcHNlIHRvIG9uZS4gSWYgdGhlcmUgYXJlIG5vbmUsIGluc2VydCBvbmUuCi0JICogCi0JICogQHBhcmFtIHRleHRFZGl0Ci0JICogQHBhcmFtIGN1cnJlbnREb2N1bWVudFJlZ2lvbgotCSAqIEBwYXJhbSBhdmFpbGFibGVMaW5lV2lkdGgKLQkgKiBAcGFyYW0gY3VycmVudFRleHRSZWdpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0U3BhY2VBbmRDb2xsYXBzZShUZXh0RWRpdCB0ZXh0RWRpdCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50RG9jdW1lbnRSZWdpb24sIGludCBhdmFpbGFibGVMaW5lV2lkdGgsIElUZXh0UmVnaW9uIGN1cnJlbnRUZXh0UmVnaW9uKSB7Ci0JCWludCB0ZXh0TGVuZ3RoID0gY3VycmVudFRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQlpbnQgcmVnaW9uTGVuZ3RoID0gY3VycmVudFRleHRSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWJvb2xlYW4gdGhlcmVBcmVTcGFjZXMgPSB0ZXh0TGVuZ3RoIDwgcmVnaW9uTGVuZ3RoOwotCQlpbnQgc3BhY2VzU3RhcnRPZmZzZXQgPSBjdXJyZW50RG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY3VycmVudFRleHRSZWdpb24pICsgdGV4dExlbmd0aDsKLQotCQlpZiAodGhlcmVBcmVTcGFjZXMpIHsKLQkJCVN0cmluZyBmdWxsVGFnTmFtZSA9IGN1cnJlbnREb2N1bWVudFJlZ2lvbi5nZXRGdWxsVGV4dChjdXJyZW50VGV4dFJlZ2lvbik7Ci0JCQlTdHJpbmcgd2hpdGVzcGFjZVJ1biA9IGZ1bGxUYWdOYW1lLnN1YnN0cmluZyh0ZXh0TGVuZ3RoLCByZWdpb25MZW5ndGgpOwotCQkJY29sbGFwc2VTcGFjZXModGV4dEVkaXQsIHNwYWNlc1N0YXJ0T2Zmc2V0LCBhdmFpbGFibGVMaW5lV2lkdGgsIHdoaXRlc3BhY2VSdW4pOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gaW5zZXJ0IGEgc3BhY2UKLQkJCUluc2VydEVkaXQgaW5zZXJ0RWRpdCA9IG5ldyBJbnNlcnRFZGl0KHNwYWNlc1N0YXJ0T2Zmc2V0LCBTUEFDRSk7Ci0JCQl0ZXh0RWRpdC5hZGRDaGlsZChpbnNlcnRFZGl0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRJbmRlbnRCZWZvcmVBdHRyaWJ1dGUoWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIGNvbnN0cmFpbnRzLCBJVGV4dFJlZ2lvbkxpc3QgdGV4dFJlZ2lvbnMsIGludCBhdmFpbGFibGVMaW5lV2lkdGgsIGludCBjdXJyZW50VGV4dFJlZ2lvbkluZGV4LCBJVGV4dFJlZ2lvbiBjdXJyZW50VGV4dFJlZ2lvbiwgSVRleHRSZWdpb24gbmV4dFRleHRSZWdpb24pIHsKLQkJYm9vbGVhbiBpbmRlbnRBdHRyaWJ1dGUgPSBmYWxzZTsKLQotCQkvLyBsb29rIGFoZWFkIHRvIHNlZSBpZiBnb2luZyB0byBoaXQgbWF4IGxpbmUgd2lkdGgKLQkJLy8gc29tZXRoaW5nIGF0dHJOYW1lCi0JCWludCBjdXJyZW50V2lkdGggPSBjdXJyZW50VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgKyBuZXh0VGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgKyAxOwotCQlpZiAoY3VycmVudFdpZHRoID4gYXZhaWxhYmxlTGluZVdpZHRoKQotCQkJaW5kZW50QXR0cmlidXRlID0gdHJ1ZTsKLQkJZWxzZSB7Ci0JCQlpZiAoKGN1cnJlbnRUZXh0UmVnaW9uSW5kZXggKyAyKSA8IHRleHRSZWdpb25zLnNpemUoKSkgewotCQkJCS8vIHN0aWxsIG9rYXksIHNvIHRyeSBuZXh0IHJlZ2lvbgotCQkJCS8vIHNvbWV0aGluZyBhdHRyTmFtZT0KLQkJCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGN1cnJlbnRUZXh0UmVnaW9uSW5kZXggKyAyKTsKLQkJCQlpZiAodGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQkJKytjdXJyZW50V2lkdGg7Ci0JCQkJCWlmIChjdXJyZW50V2lkdGggPiBhdmFpbGFibGVMaW5lV2lkdGgpCi0JCQkJCQlpbmRlbnRBdHRyaWJ1dGUgPSB0cnVlOwotCQkJCQllbHNlIHsKLQkJCQkJCWlmICgoY3VycmVudFRleHRSZWdpb25JbmRleCArIDMpIDwgdGV4dFJlZ2lvbnMuc2l6ZSgpKSB7Ci0JCQkJCQkJLy8gc3RpbGwgb2theSwgc28gdHJ5IG5leHQgcmVnaW9uCi0JCQkJCQkJLy8gc29tZXRoaW5nIGF0dHJOYW1lPWF0dHJWYWx1ZQotCQkJCQkJCXRleHRSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoY3VycmVudFRleHRSZWdpb25JbmRleCArIDMpOwotCQkJCQkJCWlmICh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQkJCWN1cnJlbnRXaWR0aCA9ICt0ZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJCQkJaWYgKGN1cnJlbnRXaWR0aCA+IGF2YWlsYWJsZUxpbmVXaWR0aCkKLQkJCQkJCQkJCWluZGVudEF0dHJpYnV0ZSA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbmRlbnRBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gdGhlIHByb3ZpZGVkIGluZm9ybWF0aW9uIChwYXJlbnRDb25zdHJhaW50cyAmIGN1cnJlbnRET01SZWdpb24pLAotCSAqIHVwZGF0ZSB0aGUgZm9ybWF0dGluZyBjb25zdHJhaW50cyAoZm9yIHRoaXMgJiBjaGlsZCkKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Q29uc3RyYWludHMKLQkgKiAgICAgICAgICAgIGNhbiBiZSBudWxsCi0JICogQHBhcmFtIHRoaXNDb25zdHJhaW50cwotCSAqICAgICAgICAgICAgY2FuIGJlIG51bGwKLQkgKiBAcGFyYW0gY2hpbGRDb25zdHJhaW50cwotCSAqICAgICAgICAgICAgY2FuIGJlIG51bGwKLQkgKiBAcGFyYW0gY3VycmVudERPTVJlZ2lvbgotCSAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVGb3JtYXR0aW5nQ29uc3RyYWludHMoWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHBhcmVudENvbnN0cmFpbnRzLCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgdGhpc0NvbnN0cmFpbnRzLCBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgY2hpbGRDb25zdHJhaW50cywgRE9NUmVnaW9uIGN1cnJlbnRET01SZWdpb24pIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gY3VycmVudERPTVJlZ2lvbi5kb2N1bWVudFJlZ2lvbjsKLQkJSURPTU5vZGUgY3VycmVudE5vZGUgPSBjdXJyZW50RE9NUmVnaW9uLmRvbU5vZGU7Ci0KLQkJLy8gZGVmYXVsdCB0byB3aGF0ZXZlciBwYXJlbnQncyBjb25zdHJhaW50IHNhaWQgdG8gZG8KLQkJaWYgKHBhcmVudENvbnN0cmFpbnRzICE9IG51bGwpIHsKLQkJCWlmICh0aGlzQ29uc3RyYWludHMgIT0gbnVsbCkgewotCQkJCXRoaXNDb25zdHJhaW50cy5jb3B5Q29uc3RyYWludHMocGFyZW50Q29uc3RyYWludHMpOwotCQkJfQotCQkJaWYgKGNoaWxkQ29uc3RyYWludHMgIT0gbnVsbCkgewotCQkJCWNoaWxkQ29uc3RyYWludHMuY29weUNvbnN0cmFpbnRzKHBhcmVudENvbnN0cmFpbnRzKTsKLQkJCQkvLyBpZiB3aGl0ZXNwYWNlIHN0cmF0ZWd5IHdhcyBvbmx5IGEgaGludCwgbnVsbCBpdCBvdXQgc28KLQkJCQkvLyBkZWZhdWx0cyBhcmUgdGFrZW4gaW5zdGVhZAotCQkJCWlmIChwYXJlbnRDb25zdHJhaW50cy5pc1doaXRlc3BhY2VTdHJhdGVneUFIaW50KCkpCi0JCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KG51bGwpOwotCQkJfQotCQl9Ci0KLQkJLy8gc2V0IHVwIGNvbnN0cmFpbnRzIGZvciBkaXJlY3QgY2hpbGRyZW4gb2YgZG9jdW1lbnQgcm9vdAotCQlOb2RlIHBhcmVudE5vZGUgPSBjdXJyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnROb2RlICE9IG51bGwgJiYgcGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJaWYgKHRoaXNDb25zdHJhaW50cyAhPSBudWxsKSB7Ci0JCQkJdGhpc0NvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSUdOT1JFKTsKLQkJCQl0aGlzQ29uc3RyYWludHMuc2V0SW5kZW50U3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLk5FV19MSU5FKTsKLQkJCQl0aGlzQ29uc3RyYWludHMuc2V0SW5kZW50TGV2ZWwoMCk7Ci0JCQl9Ci0JCQlpZiAoY2hpbGRDb25zdHJhaW50cyAhPSBudWxsKSB7Ci0JCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3kobnVsbCk7Ci0JCQkJY2hpbGRDb25zdHJhaW50cy5zZXRJbmRlbnRTdHJhdGVneShudWxsKTsKLQkJCQljaGlsZENvbnN0cmFpbnRzLnNldEluZGVudExldmVsKDApOwotCQkJfQotCQl9Ci0KLQkJLy8gb3RoZXIgY29uZGl0aW9ucyB0byBjaGVjayB3aGVuIHNldHRpbmcgdXAgY2hpbGQgY29uc3RyYWludHMKLQkJaWYgKGNoaWxkQ29uc3RyYWludHMgIT0gbnVsbCkgewotCQkJWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0Rm9ybWF0dGluZ1ByZWZlcmVuY2VzKCk7Ci0KLQkJCS8vIGlmIHdlJ3JlIGF0IGRvY3VtZW50IHJvb3QsIGNoaWxkIHRhZ3Mgc2hvdWxkIGFsd2F5cyBqdXN0IHN0YXJ0Ci0JCQkvLyBvbiBhIG5ldyBsaW5lIGFuZCBoYXZlIGFuIGluZGVudCBsZXZlbCBvZiAwCi0JCQlpZiAoY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSUdOT1JFKTsKLQkJCQljaGlsZENvbnN0cmFpbnRzLnNldEluZGVudFN0cmF0ZWd5KFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5ORVdfTElORSk7Ci0JCQkJY2hpbGRDb25zdHJhaW50cy5zZXRJbmRlbnRMZXZlbCgwKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIEJVRzEwODA3NCAmIEJVRzg0Njg4IC0gcHJlc2VydmUgd2hpdGVzcGFjZSBpbiB4c2w6dGV4dCAmCi0JCQkJLy8geHNsOmF0dHJpYnV0ZQotCQkJCVN0cmluZyBub2RlTmFtZXNwYWNlVVJJID0gY3VycmVudE5vZGUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQkJaWYgKFhTTF9OQU1FU1BBQ0UuZXF1YWxzKG5vZGVOYW1lc3BhY2VVUkkpKSB7Ci0JCQkJCVN0cmluZyBub2RlTmFtZSA9ICgoRWxlbWVudCkgY3VycmVudE5vZGUpLmdldExvY2FsTmFtZSgpOwotCQkJCQlpZiAoWFNMX0FUVFJJQlVURS5lcXVhbHMobm9kZU5hbWUpIHx8IFhTTF9URVhULmVxdWFscyhub2RlTmFtZSkpIHsKLQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5QUkVTRVJWRSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHNlYXJjaCB3aXRoaW4gY3VycmVudCB0YWcgZm9yIHhtbDpzcGFjZSBhdHRyaWJ1dGUKLQkJCQkJSVRleHRSZWdpb25MaXN0IHRleHRSZWdpb25zID0gY3VycmVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQkJCWludCBpID0gMDsKLQkJCQkJYm9vbGVhbiB4bWxTcGFjZUZvdW5kID0gZmFsc2U7Ci0JCQkJCWJvb2xlYW4gcHJlc2VydmVGb3VuZCA9IGZhbHNlOwotCQkJCQl3aGlsZSAoaSA8IHRleHRSZWdpb25zLnNpemUoKSAmJiAheG1sU3BhY2VGb3VuZCkgewotCQkJCQkJSVRleHRSZWdpb24gdGV4dFJlZ2lvbiA9IHRleHRSZWdpb25zLmdldChpKTsKLQkJCQkJCWlmICh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQkJCQlTdHJpbmcgcmVnaW9uVGV4dCA9IGN1cnJlbnRSZWdpb24uZ2V0VGV4dCh0ZXh0UmVnaW9uKTsKLQkJCQkJCQlpZiAoWE1MX1NQQUNFLmVxdWFscyhyZWdpb25UZXh0KSkgewotCQkJCQkJCQlpZiAoKGkgKyAxKSA8IHRleHRSZWdpb25zLnNpemUoKSkgewotCQkJCQkJCQkJKytpOwotCQkJCQkJCQkJdGV4dFJlZ2lvbiA9IHRleHRSZWdpb25zLmdldChpKTsKLQkJCQkJCQkJCWlmICh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUyAmJiAoKGkgKyAxKSA8IHRleHRSZWdpb25zLnNpemUoKSkpIHsKLQkJCQkJCQkJCQkrK2k7Ci0JCQkJCQkJCQkJdGV4dFJlZ2lvbiA9IHRleHRSZWdpb25zLmdldChpKTsKLQkJCQkJCQkJCQlyZWdpb25UZXh0ID0gY3VycmVudFJlZ2lvbi5nZXRUZXh0KHRleHRSZWdpb24pOwotCQkJCQkJCQkJCWlmIChQUkVTRVJWRS5lcXVhbHMocmVnaW9uVGV4dCkgfHwgUFJFU0VSVkVfUVVPVEVELmVxdWFscyhyZWdpb25UZXh0KSkgewotCQkJCQkJCQkJCQlwcmVzZXJ2ZUZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJeG1sU3BhY2VGb3VuZCA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJKytpOwotCQkJCQl9Ci0JCQkJCWlmICh4bWxTcGFjZUZvdW5kKSB7Ci0JCQkJCQlpZiAocHJlc2VydmVGb3VuZCkgewotCQkJCQkJCS8vIHByZXNlcnZlIHdhcyBmb3VuZCBzbyBzZXQgdGhlIHN0cmF0ZWd5Ci0JCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIHhtbDpzcGFjZSB3YXMgZm91bmQgYnV0IGl0IHdhcyBub3QgY29sbGFwc2UsIHNvCi0JCQkJCQkJLy8gdXNlIGRlZmF1bHQgd2hpdGVzcGFjZSBzdHJhdGVneQotCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5ERUZBVUxUKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGhvdyB0byBoYW5kZSBub2RlcyB0aGF0IGhhdmUgbm9ud2hpdGVzcGFjZSB0ZXh0Ci0JCQkJCQkvLyBjb250ZW50Ci0JCQkJCQlOb2RlTGlzdCBub2RlTGlzdCA9IGN1cnJlbnROb2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCQkJCWludCBsZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLQkJCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCQlib29sZWFuIHRleHROb2RlRm91bmQgPSBmYWxzZTsKLQkJCQkJCS8vIEJVRzIxNDUxNiAtIElmIHRoZSBwYXJlbnQgY29uc3RyYWludCBpcyB0byBwcmVzZXJ2ZSB3aGl0ZXNwYWNlLCBjaGlsZCBjb25zdHJhaW50cyBzaG91bGQKLQkJCQkJCS8vIHN0aWxsIHJlZmxlY3QgdGhlIHBhcmVudCBjb25zdHJhaW50cwotCQkJCQkJd2hpbGUgKGluZGV4IDwgbGVuZ3RoICYmICF0ZXh0Tm9kZUZvdW5kICYmIHBhcmVudENvbnN0cmFpbnRzICE9IG51bGwgJiYgIVhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5QUkVTRVJWRS5lcXVhbHMocGFyZW50Q29uc3RyYWludHMuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkpKSB7Ci0JCQkJCQkJTm9kZSBjaGlsZE5vZGUgPSBub2RlTGlzdC5pdGVtKGluZGV4KTsKLQkJCQkJCQlpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJCQkJdGV4dE5vZGVGb3VuZCA9ICEoKElET01UZXh0KSBjaGlsZE5vZGUpLmlzRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCSsraW5kZXg7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAodGV4dE5vZGVGb3VuZCkgewotCQkJCQkJCWlmIChsZW5ndGggPiAxKSB7Ci0JCQkJCQkJCS8vIG1vcmUgaW4gaGVyZSB0aGFuIGp1c3QgdGV4dCwgc28gY29uc2lkZXIKLQkJCQkJCQkJLy8gdGhpcyBtaXhlZCBjb250ZW50Ci0JCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KHByZWZlcmVuY2VzLmdldE1peGVkV2hpdGVzcGFjZVN0cmF0ZWd5KCkpOwotCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldEluZGVudFN0cmF0ZWd5KHByZWZlcmVuY2VzLmdldE1peGVkSW5kZW50U3RyYXRlZ3koKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQkvLyB0aGVyZSdzIG9ubHkgdGV4dAotCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShwcmVmZXJlbmNlcy5nZXRUZXh0V2hpdGVzcGFjZVN0cmF0ZWd5KCkpOwotCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldEluZGVudFN0cmF0ZWd5KHByZWZlcmVuY2VzLmdldFRleHRJbmRlbnRTdHJhdGVneSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRJc1doaXRlc3BhY2VTdHJhdGVneUFIaW50KHRydWUpOwotCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0SXNJbmRlbnRTdHJhdGVneUFIaW50KHRydWUpOwotCQkJCQkJfQotCi0JCQkJCQkvLyB0cnkgcmVmZXJyaW5nIHRvIGNvbnRlbnQgbW9kZWwgZm9yIGluZm9ybWF0aW9uIG9uCi0JCQkJCQkvLyB3aGl0ZXNwYWNlICYgaW5kZW50IHN0cmF0ZWd5Ci0JCQkJCQlNb2RlbFF1ZXJ5QWRhcHRlciBhZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKSAoKElET01Eb2N1bWVudCkgY3VycmVudE5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgYWRhcHRlci5nZXRNb2RlbFF1ZXJ5KCkuZ2V0Q01Ob2RlKGN1cnJlbnROb2RlKTsKLQkJCQkJCWlmIChlbGVtZW50RGVjbGFyYXRpb24gIT0gbnVsbCkgewotCQkJCQkJCS8vIGZvbGxvdyB3aGl0ZXNwYWNlIHN0cmF0ZWd5IHByZWZlcmVuY2UgZm9yCi0JCQkJCQkJLy8gcGNkYXRhIGNvbnRlbnQKLQkJCQkJCQlpbnQgY29udGVudFR5cGUgPSBlbGVtZW50RGVjbGFyYXRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCQkJCQlpZiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBICYmIHBhcmVudENvbnN0cmFpbnRzICE9IG51bGwgJiYgIVhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5QUkVTRVJWRS5lcXVhbHMocGFyZW50Q29uc3RyYWludHMuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkpKSB7Ci0JCQkJCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0V2hpdGVzcGFjZVN0cmF0ZWd5KHByZWZlcmVuY2VzLmdldFBDRGF0YVdoaXRlc3BhY2VTdHJhdGVneSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCAmJiBwYXJlbnRDb25zdHJhaW50cyAhPSBudWxsICYmICFYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkUuZXF1YWxzKHBhcmVudENvbnN0cmFpbnRzLmdldFdoaXRlc3BhY2VTdHJhdGVneSgpKSkgewotCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSUdOT1JFKTsKLQkJCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRJbmRlbnRTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSU5ERU5UKTsKLQkJCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRJc1doaXRlc3BhY2VTdHJhdGVneUFIaW50KHRydWUpOwotCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldElzSW5kZW50U3RyYXRlZ3lBSGludCh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCUNNRGF0YVR5cGUgZGF0YVR5cGUgPSBlbGVtZW50RGVjbGFyYXRpb24uZ2V0RGF0YVR5cGUoKTsKLQkJCQkJCQkJaWYgKGRhdGFUeXBlICE9IG51bGwgJiYgU1RSSU5HLmVxdWFscyhkYXRhVHlwZS5nZXREYXRhVHlwZU5hbWUoKSkpCi0JCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkUpOwotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCS8vIGxvb2sgZm9yIHhtbDpzcGFjZSBpbiBjb250ZW50IG1vZGVsCi0JCQkJCQkJCQlDTU5hbWVkTm9kZU1hcCBjbUF0dHJpYnV0ZXMgPSBlbGVtZW50RGVjbGFyYXRpb24uZ2V0QXR0cmlidXRlcygpOwotCi0JCQkJCQkJCQlDTU5hbWVkTm9kZU1hcEltcGwgYWxsQXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoY21BdHRyaWJ1dGVzKTsKLQkJCQkJCQkJCQlMaXN0IG5vZGVzID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShjdXJyZW50Tm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEF2YWlsYWJsZUNvbnRlbnQoKEVsZW1lbnQpIGN1cnJlbnROb2RlLCBlbGVtZW50RGVjbGFyYXRpb24sIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQkJCQkJCQkJCQlmb3IgKGludCBrID0gMDsgayA8IG5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQkJCQkJCQkJCUNNTm9kZSBjbW5vZGUgPSAoQ01Ob2RlKSBub2Rlcy5nZXQoayk7Ci0JCQkJCQkJCQkJCWlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCQkJCQkJCQlhbGxBdHRyaWJ1dGVzLnB1dChjbW5vZGUpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJY21BdHRyaWJ1dGVzID0gYWxsQXR0cmlidXRlczsKLQkJCQkJCQkJCQotCQkJCQkJCQkJLy8gQ2hlY2sgaW1wbGllZCB2YWx1ZXMgZnJvbSB0aGUgRFREIHdheS4KLQkJCQkJCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlRGVjbGFyYXRpb24gPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgY21BdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShYTUxfU1BBQ0UpOwotCQkJCQkJCQkJaWYgKGF0dHJpYnV0ZURlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCQkJCQkJCQkvLyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGZvdW5kLCBjaGVjawotCQkJCQkJCQkJCS8vIGl0Ci0JCQkJCQkJCQkJLy8gb3V0LgotCQkJCQkJCQkJCQotCQkJCQkJCQkJCS8vQlVHMjE0NTE2LzE5NjU0NCAtIEZpeGVkIE5QRSB0aGF0IHdhcyBjYXVzZWQgYnkgYW4gYXR0ciBoYXZpbmcKLQkJCQkJCQkJCQkvLyBhIG51bGwgYXR0ciB0eXBlCi0JCQkJCQkJCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IG51bGw7Ci0JCQkJCQkJCQkJQ01EYXRhVHlwZSBhdHRyVHlwZSA9IGF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldEF0dHJUeXBlKCk7Ci0JCQkJCQkJCQkJaWYoYXR0clR5cGUgIT0gbnVsbCkgewotCQkJCQkJCQkJCQlpZigoYXR0clR5cGUuZ2V0SW1wbGllZFZhbHVlS2luZCgpICE9IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9OT05FKSAmJiBhdHRyVHlwZS5nZXRJbXBsaWVkVmFsdWUoKSAhPSBudWxsKQotCQkJCQkJCQkJCQkJZGVmYXVsdFZhbHVlID0gYXR0clR5cGUuZ2V0SW1wbGllZFZhbHVlKCk7Ci0JCQkJCQkJCQkJCWVsc2UgaWYgKChhdHRyVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCkgIT0gbnVsbCkgJiYgKGF0dHJUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKS5sZW5ndGggPiAwKSkgewotCQkJCQkJCQkJCQkJZGVmYXVsdFZhbHVlID0gYXR0clR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpWzBdOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCQotCQkJCQkJCQkJCS8vIHhtbDpzcGFjZT0icHJlc2VydmUiIG1lYW5zIHByZXNlcnZlCi0JCQkJCQkJCQkJLy8gc3BhY2UsCi0JCQkJCQkJCQkJLy8gZXZlcnl0aGluZyBlbHNlIG1lYW5zIGJhY2sgdG8KLQkJCQkJCQkJCQkvLyBkZWZhdWx0LgotCQkJCQkJCQkJCWlmKFBSRVNFUlZFLmVxdWFscyhkZWZhdWx0VmFsdWUpKQotCQkJCQkJCQkJCQljaGlsZENvbnN0cmFpbnRzLnNldFdoaXRlc3BhY2VTdHJhdGVneShYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkUpOwotCQkJCQkJCQkJCWVsc2UKLQkJCQkJCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3koWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLkRFRkFVTFQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJLy8gSWYgdGhlIG5vZGUgaGFzIG5vIGF0dHJpYnV0ZXMsIGluaGVyaXQgdGhlIHBhcmVudHMgd2hpdGVzcGFjZSBzdHJhdGVneQotCQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkJaWYocGFyZW50Q29uc3RyYWludHMgIT0gbnVsbCkKLQkJCQkJCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3kocGFyZW50Q29uc3RyYWludHMuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkpOwotCQkJCQkJCQkJCWVsc2UKLQkJCQkJCQkJCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3kobnVsbCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyBzZXQgZGVmYXVsdCB2YWx1ZXMgYWNjb3JkaW5nIHRvIHByZWZlcmVuY2VzCi0JCQlpZiAoY2hpbGRDb25zdHJhaW50cy5nZXRXaGl0ZXNwYWNlU3RyYXRlZ3koKSA9PSBudWxsKSB7Ci0JCQkJY2hpbGRDb25zdHJhaW50cy5zZXRXaGl0ZXNwYWNlU3RyYXRlZ3kocHJlZmVyZW5jZXMuZ2V0RWxlbWVudFdoaXRlc3BhY2VTdHJhdGVneSgpKTsKLQkJCX0KLQkJCWlmIChjaGlsZENvbnN0cmFpbnRzLmdldEluZGVudFN0cmF0ZWd5KCkgPT0gbnVsbCkgewotCQkJCWNoaWxkQ29uc3RyYWludHMuc2V0SW5kZW50U3RyYXRlZ3kocHJlZmVyZW5jZXMuZ2V0RWxlbWVudEluZGVudFN0cmF0ZWd5KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlcyB0aGUgY3VycmVudCBhdmFpbGFibGUgbGluZSB3aWR0aCBnaXZlbiBmdWxsVGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gZnVsbFRleHQKLQkgKiBAcGFyYW0gYXZhaWxhYmxlTGluZVdpZHRoCi0JICogQHBhcmFtIG1heEF2YWlsYWJsZUxpbmVXaWR0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGludCB1cGRhdGVMaW5lV2lkdGhXaXRoTGFzdExpbmUoU3RyaW5nIGZ1bGxUZXh0LCBpbnQgYXZhaWxhYmxlTGluZVdpZHRoKSB7Ci0JCWludCBtYXhBdmFpbGFibGVMaW5lV2lkdGggPSBnZXRGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKS5nZXRNYXhMaW5lV2lkdGgoKTsKLQkJaW50IGxpbmVXaWR0aCA9IGF2YWlsYWJsZUxpbmVXaWR0aDsKLQkJaWYgKGZ1bGxUZXh0ICE9IG51bGwpIHsKLQkJCWludCB0ZXh0TGVuZ3RoID0gZnVsbFRleHQubGVuZ3RoKCk7Ci0JCQkvLyB1cGRhdGUgYXZhaWxhYmxlIGxpbmUgd2lkdGgKLQkJCS8vIGZpbmQgbGFzdCBuZXdsaW5lCi0JCQlpbnQgbGFzdExGT2Zmc2V0ID0gZnVsbFRleHQubGFzdEluZGV4T2YoJ1xuJyk7Ci0JCQlpbnQgbGFzdENST2Zmc2V0ID0gZnVsbFRleHQubGFzdEluZGV4T2YoJ1xyJyk7Ci0JCQkvLyBhbGwgdGV4dCB3YXMgb24gMSBsaW5lCi0JCQlpZiAobGFzdExGT2Zmc2V0ID09IC0xICYmIGxhc3RDUk9mZnNldCA9PSAtMSkgewotCQkJCS8vIGp1c3Qgc3VidHJhY3QgdGV4dCBsZW5ndGggZnJvbSBjdXJyZW50Ci0JCQkJLy8gYXZhaWxhYmxlIGxpbmUgd2lkdGgKLQkJCQlsaW5lV2lkdGggLT0gZnVsbFRleHQubGVuZ3RoKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBjYWxjdWxhdGUgYXZhaWxhYmxlIGxpbmUgd2lkdGggb2YgbGFzdCBsaW5lCi0JCQkJaW50IGxhc3ROZXdMaW5lID0gTWF0aC5tYXgobGFzdExGT2Zmc2V0LCBsYXN0Q1JPZmZzZXQpOwotCQkJCWxpbmVXaWR0aCA9IG1heEF2YWlsYWJsZUxpbmVXaWR0aCAtICh0ZXh0TGVuZ3RoIC0gbGFzdE5ld0xpbmUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaW5lV2lkdGg7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TGluZURlbGltaXRlcihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnRSZWdpb24pIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2MgPSBjdXJyZW50UmVnaW9uLmdldFBhcmVudERvY3VtZW50KCk7Ci0JCWludCBsaW5lID0gZG9jLmdldExpbmVPZk9mZnNldChjdXJyZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQlTdHJpbmcgbGluZURlbGltaXRlciA9IGRvYy5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCXRyeSB7Ci0JCQlpZiAobGluZSA+IDApIHsKLQkJCQlsaW5lRGVsaW1pdGVyID0gZG9jLmdldExpbmVEZWxpbWl0ZXIobGluZSAtIDEpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCS8vIEJVRzExNTcxNjogaWYgY2Fubm90IGdldCBsaW5lIGRlbGltaXRlciBmcm9tIGN1cnJlbnQgbGluZSwganVzdAotCQkvLyB1c2UgZGVmYXVsdCBsaW5lIGRlbGltaXRlcgotCQlpZiAobGluZURlbGltaXRlciA9PSBudWxsKQotCQkJbGluZURlbGltaXRlciA9IGRvYy5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCXJldHVybiBsaW5lRGVsaW1pdGVyOwotCX0KLQotCXZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmUHJvZ3Jlc3NNb25pdG9yID0gbW9uaXRvcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvWE1MRm9ybWF0dGVyRm9ybWF0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9YTUxGb3JtYXR0ZXJGb3JtYXRQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAyZWU3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9YTUxGb3JtYXR0ZXJGb3JtYXRQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb240OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVGhpcyBpcyBhIHdyYXBwZXIgZm9yIHRoZSBuZXcgeG1sIGZvcm1hdHRlciBzbyB0aGF0IGl0IGNhbiBiZSBzdGlsbAotICogY29uc2lkZXJlZCBhbiBJU3RydXR1cmVkRm9ybWF0UHJvY2Vzc29yCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxGb3JtYXR0ZXJGb3JtYXRQcm9jZXNzb3IgaW1wbGVtZW50cyBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBEZWZhdWx0WE1MUGFydGl0aW9uRm9ybWF0dGVyIGZGb3JtYXR0ZXIgPSBudWxsOwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBmUHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQotCXB1YmxpYyB2b2lkIGZvcm1hdERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9ybWF0TW9kZWwobW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0RmlsZShJRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJLy8gT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciBlZGl0LiBXaWxsIHNhdmUgbW9kZWwgaWYgbW9kZWwKLQkJCS8vIGNoYW5nZWQuCi0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChmaWxlKTsKLQotCQkJLy8gZm9ybWF0Ci0JCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJaWYgKCFzdHJ1Y3R1cmVkTW9kZWwuaXNTaGFyZWRGb3JFZGl0KCkgJiYgc3RydWN0dXJlZE1vZGVsLmlzU2F2ZU5lZWRlZCgpKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5zYXZlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBlbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWludCBzdGFydCA9IDA7Ci0JCWludCBsZW5ndGggPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0KLQkJZm9ybWF0TW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmKGZQcm9ncmVzc01vbml0b3IgIT0gbnVsbCkKLQkJCWZQcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKCIiLCAyKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCURvY3VtZW50UmV3cml0ZVNlc3Npb24gYWN0aXZlUmV3cml0ZVNlc3Npb24gPSAoKElEb2N1bWVudEV4dGVuc2lvbjQpIHN0cnVjdHVyZWREb2N1bWVudCkuZ2V0QWN0aXZlUmV3cml0ZVNlc3Npb24oKTsKLQkJYm9vbGVhbiBzdGFydGVkUmV3cml0ZVNlc3Npb24gPSBmYWxzZTsKLQkJaWYgKGFjdGl2ZVJld3JpdGVTZXNzaW9uID09IG51bGwpIHsKLQkJCWFjdGl2ZVJld3JpdGVTZXNzaW9uID0gKChJRG9jdW1lbnRFeHRlbnNpb240KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLnN0YXJ0UmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuVU5SRVNUUklDVEVEKTsKLQkJCXN0YXJ0ZWRSZXdyaXRlU2Vzc2lvbiA9IHRydWU7Ci0JCX0KLQkJZ2V0Rm9ybWF0dGVyKCkuc2V0UHJvZ3Jlc3NNb25pdG9yKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkgewotCQkJcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLQkJCQlyZXR1cm4gZlByb2dyZXNzTW9uaXRvciAhPSBudWxsICYmIGZQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOwotCQkJfQotCQl9KTsKLQkJVGV4dEVkaXQgZWRpdCA9IGdldEZvcm1hdHRlcigpLmZvcm1hdChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCQlpZihmUHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpCi0JCQlmUHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsKLQkJCi0JCXRyeSB7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQllZGl0LmFwcGx5KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQlpZihmUHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpCi0JCQkJZlByb2dyZXNzTW9uaXRvci53b3JrZWQoMSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoc3RhcnRlZFJld3JpdGVTZXNzaW9uICYmIGFjdGl2ZVJld3JpdGVTZXNzaW9uICE9IG51bGwpIHsKLQkJCQkoKElEb2N1bWVudEV4dGVuc2lvbjQpIHN0cnVjdHVyZWREb2N1bWVudCkuc3RvcFJld3JpdGVTZXNzaW9uKGFjdGl2ZVJld3JpdGVTZXNzaW9uKTsKLQkJCX0KLQkJCXN0cnVjdHVyZWRNb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCWlmKGZQcm9ncmVzc01vbml0b3IgIT0gbnVsbCkKLQkJCQlmUHJvZ3Jlc3NNb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdE5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlET01Ob2RlIGRvbU5vZGUgPSAoSURPTU5vZGUpIG5vZGU7Ci0JCQlmb3JtYXRNb2RlbChkb21Ob2RlLmdldE1vZGVsKCksIGRvbU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgZG9tTm9kZS5nZXRMZW5ndGgoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZQcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOwotCX0KLQotCXByaXZhdGUgRGVmYXVsdFhNTFBhcnRpdGlvbkZvcm1hdHRlciBnZXRGb3JtYXR0ZXIoKSB7Ci0JCWlmIChmRm9ybWF0dGVyID09IG51bGwpIHsKLQkJCWZGb3JtYXR0ZXIgPSBuZXcgRGVmYXVsdFhNTFBhcnRpdGlvbkZvcm1hdHRlcigpOwotCQl9Ci0JCXJldHVybiBmRm9ybWF0dGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9YTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJmMzc2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9YTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi1wdWJsaWMgY2xhc3MgWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUkVTRVJWRSA9ICJQUkVTRVJWRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0xMQVBTRSA9ICJDT0xMQVBTRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJR05PUkUgPSAiSUdOT1JFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFQgPSAiREVGQVVMVCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElOREVOVCA9ICJJTkRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkVXX0xJTkUgPSAiTkVXX0xJTkUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5MSU5FID0gIklOTElORSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgaW50IGZBdmFpbGFibGVMaW5lV2lkdGggPSAwOwotCXByaXZhdGUgaW50IGZJbmRlbnRMZXZlbCA9IDA7Ci0JcHJpdmF0ZSBTdHJpbmcgZkluZGVudFN0cmF0ZWd5OwotCXByaXZhdGUgU3RyaW5nIGZXaGl0ZXNwYWNlU3RyYXRlZ3k7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc0luZGVudFN0cmF0ZWd5QUhpbnQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZklzV2hpdGVzcGFjZVN0cmF0ZWd5QUhpbnQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB2YWx1ZXMgaW4gdGhpcyBmb3JtYXR0aW5nIGNvbnN0cmFpbnQgd2l0aCB2YWx1ZXMgZnJvbQotCSAqIGNvbnN0cmFpbnRzCi0JICogCi0JICogQHBhcmFtIGNvbnN0cmFpbnRzCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlDb25zdHJhaW50cyhYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMgY29uc3RyYWludHMpIHsKLQkJc2V0QXZhaWxhYmxlTGluZVdpZHRoKGNvbnN0cmFpbnRzLmdldEF2YWlsYWJsZUxpbmVXaWR0aCgpKTsKLQkJc2V0SW5kZW50TGV2ZWwoY29uc3RyYWludHMuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JCXNldEluZGVudFN0cmF0ZWd5KGNvbnN0cmFpbnRzLmdldEluZGVudFN0cmF0ZWd5KCkpOwotCQlzZXRXaGl0ZXNwYWNlU3RyYXRlZ3koY29uc3RyYWludHMuZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCkgewotCQlyZXR1cm4gZkF2YWlsYWJsZUxpbmVXaWR0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdmFpbGFibGVMaW5lV2lkdGgoaW50IGxpbmVXaWR0aCkgewotCQlmQXZhaWxhYmxlTGluZVdpZHRoID0gbGluZVdpZHRoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SW5kZW50TGV2ZWwoKSB7Ci0JCXJldHVybiBmSW5kZW50TGV2ZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5kZW50TGV2ZWwoaW50IGluZGVudExldmVsKSB7Ci0JCWZJbmRlbnRMZXZlbCA9IGluZGVudExldmVsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5kZW50U3RyYXRlZ3koKSB7Ci0JCXJldHVybiBmSW5kZW50U3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5kZW50U3RyYXRlZ3koU3RyaW5nIGluZGVudFN0cmF0ZWd5KSB7Ci0JCWZJbmRlbnRTdHJhdGVneSA9IGluZGVudFN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V2hpdGVzcGFjZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gZldoaXRlc3BhY2VTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXaGl0ZXNwYWNlU3RyYXRlZ3koU3RyaW5nIHdoaXRlc3BhY2VTdHJhdGVneSkgewotCQlmV2hpdGVzcGFjZVN0cmF0ZWd5ID0gd2hpdGVzcGFjZVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW5kZW50U3RyYXRlZ3lBSGludCgpIHsKLQkJcmV0dXJuIGZJc0luZGVudFN0cmF0ZWd5QUhpbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXNJbmRlbnRTdHJhdGVneUFIaW50KGJvb2xlYW4gaXNJbmRlbnRTdHJhdGVneUFIaW50KSB7Ci0JCWZJc0luZGVudFN0cmF0ZWd5QUhpbnQgPSBpc0luZGVudFN0cmF0ZWd5QUhpbnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNXaGl0ZXNwYWNlU3RyYXRlZ3lBSGludCgpIHsKLQkJcmV0dXJuIGZJc1doaXRlc3BhY2VTdHJhdGVneUFIaW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElzV2hpdGVzcGFjZVN0cmF0ZWd5QUhpbnQoYm9vbGVhbiBpc1doaXRlc3BhY2VTdHJhdGVneUFIaW50KSB7Ci0JCWZJc1doaXRlc3BhY2VTdHJhdGVneUFIaW50ID0gaXNXaGl0ZXNwYWNlU3RyYXRlZ3lBSGludDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9YTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNhMzg5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9YTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci0KLXB1YmxpYyBjbGFzcyBYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRVNFUlZFID0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLlBSRVNFUlZFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTExBUFNFID0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLkNPTExBUFNFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElHTk9SRSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JR05PUkU7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTkRFTlQgPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSU5ERU5UOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5FV19MSU5FID0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLk5FV19MSU5FOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElOTElORSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JTkxJTkU7Ci0KLQlwcml2YXRlIGludCBmTWF4TGluZVdpZHRoID0gNzI7Ci0JcHJpdmF0ZSBib29sZWFuIGZBbGlnbkZpbmFsQnJhY2tldCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmU3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gZkluZGVudE11bHRpcGxlQXR0cmlidXRlcyA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIGZQQ0RhdGFXaGl0ZXNwYWNlU3RyYXRlZ3kgPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuUFJFU0VSVkU7Ci0JcHJpdmF0ZSBTdHJpbmcgZlRleHRJbmRlbnRTdHJhdGVneSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JTkxJTkU7Ci0JcHJpdmF0ZSBTdHJpbmcgZlRleHRXaGl0ZXNwYWNlU3RyYXRlZ3kgPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuQ09MTEFQU0U7Ci0JcHJpdmF0ZSBTdHJpbmcgZkVsZW1lbnRJbmRlbnRTdHJhdGVneSA9IFhNTEZvcm1hdHRpbmdDb25zdHJhaW50cy5JTkRFTlQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZkVsZW1lbnRXaGl0ZXNwYWNlU3RyYXRlZ3kgPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSUdOT1JFOwotCXByaXZhdGUgU3RyaW5nIGZNaXhlZEluZGVudFN0cmF0ZWd5ID0gWE1MRm9ybWF0dGluZ0NvbnN0cmFpbnRzLklOREVOVDsKLQlwcml2YXRlIFN0cmluZyBmTWl4ZWRXaGl0ZXNwYWNlU3RyYXRlZ3kgPSBYTUxGb3JtYXR0aW5nQ29uc3RyYWludHMuSUdOT1JFOwotCXByaXZhdGUgU3RyaW5nIGZPbmVJbmRlbnQgPSAiXHQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgWE1MRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQlzZXRNYXhMaW5lV2lkdGgocHJlZmVyZW5jZXMuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpOwotCQkJc2V0SW5kZW50TXVsdGlwbGVBdHRyaWJ1dGVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUykpOwotCQkJc2V0QWxpZ25GaW5hbEJyYWNrZXQocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFMSUdOX0VORF9CUkFDS0VUKSk7Ci0JCQlzZXRTcGFjZUJlZm9yZUVtcHR5Q2xvc2VUYWcocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFX0JFRk9SRV9FTVBUWV9DTE9TRV9UQUcpKTsKLQkJCQotCQkJYm9vbGVhbiBwcmVzZXJ2ZXBjZGF0YSA9IHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5QUkVTRVJWRV9DREFUQUNPTlRFTlQpOwotCQkJaWYgKHByZXNlcnZlcGNkYXRhKQotCQkJCWZQQ0RhdGFXaGl0ZXNwYWNlU3RyYXRlZ3kgPSBYTUxGb3JtYXR0aW5nUHJlZmVyZW5jZXMuUFJFU0VSVkU7Ci0JCQllbHNlCi0JCQkJZlBDRGF0YVdoaXRlc3BhY2VTdHJhdGVneSA9IFhNTEZvcm1hdHRpbmdQcmVmZXJlbmNlcy5DT0xMQVBTRTsKLQotCQkJY2hhciBpbmRlbnRDaGFyID0gJyAnOwotCQkJU3RyaW5nIGluZGVudENoYXJQcmVmID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUik7Ci0JCQlpZiAoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIuZXF1YWxzKGluZGVudENoYXJQcmVmKSkgewotCQkJCWluZGVudENoYXIgPSAnXHQnOwotCQkJfQotCQkJaW50IGluZGVudGF0aW9uV2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQotCQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQkJaW5kZW50LmFwcGVuZChpbmRlbnRDaGFyKTsKLQkJCX0KLQkJCXNldE9uZUluZGVudChpbmRlbnQudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGdldE1heExpbmVXaWR0aCgpIHsKLQkJcmV0dXJuIGZNYXhMaW5lV2lkdGg7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0QWxpZ25GaW5hbEJyYWNrZXQoKSB7Ci0JCXJldHVybiBmQWxpZ25GaW5hbEJyYWNrZXQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0U3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnKCkgewotCQlyZXR1cm4gZlNwYWNlQmVmb3JlRW1wdHlDbG9zZVRhZzsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0SW5kZW50TXVsdGlwbGVBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gZkluZGVudE11bHRpcGxlQXR0cmlidXRlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBDRGF0YVdoaXRlc3BhY2VTdHJhdGVneSgpIHsKLQkJcmV0dXJuIGZQQ0RhdGFXaGl0ZXNwYWNlU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0SW5kZW50U3RyYXRlZ3koKSB7Ci0JCXJldHVybiBmVGV4dEluZGVudFN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dFdoaXRlc3BhY2VTdHJhdGVneSgpIHsKLQkJcmV0dXJuIGZUZXh0V2hpdGVzcGFjZVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudEluZGVudFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gZkVsZW1lbnRJbmRlbnRTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRXaGl0ZXNwYWNlU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBmRWxlbWVudFdoaXRlc3BhY2VTdHJhdGVneTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnKGJvb2xlYW4gc3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnKSB7Ci0JCWZTcGFjZUJlZm9yZUVtcHR5Q2xvc2VUYWcgPSBzcGFjZUJlZm9yZUVtcHR5Q2xvc2VUYWc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5kZW50TXVsdGlwbGVBdHRyaWJ1dGVzKGJvb2xlYW4gaW5kZW50TXVsdGlwbGVBdHRyaWJ1dGVzKSB7Ci0JCWZJbmRlbnRNdWx0aXBsZUF0dHJpYnV0ZXMgPSBpbmRlbnRNdWx0aXBsZUF0dHJpYnV0ZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UENEYXRhV2hpdGVzcGFjZVN0cmF0ZWd5KFN0cmluZyBkYXRhV2hpdGVzcGFjZVN0cmF0ZWd5KSB7Ci0JCWZQQ0RhdGFXaGl0ZXNwYWNlU3RyYXRlZ3kgPSBkYXRhV2hpdGVzcGFjZVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFsaWduRmluYWxCcmFja2V0KGJvb2xlYW4gYWxpZ25GaW5hbEJyYWNrZXQpIHsKLQkJZkFsaWduRmluYWxCcmFja2V0ID0gYWxpZ25GaW5hbEJyYWNrZXQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNaXhlZEluZGVudFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gZk1peGVkSW5kZW50U3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWl4ZWRJbmRlbnRTdHJhdGVneShTdHJpbmcgbWl4ZWRJbmRlbnRTdHJhdGVneSkgewotCQlmTWl4ZWRJbmRlbnRTdHJhdGVneSA9IG1peGVkSW5kZW50U3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNaXhlZFdoaXRlc3BhY2VTdHJhdGVneSgpIHsKLQkJcmV0dXJuIGZNaXhlZFdoaXRlc3BhY2VTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNaXhlZFdoaXRlc3BhY2VTdHJhdGVneShTdHJpbmcgbWl4ZWRXaGl0ZXNwYWNlU3RyYXRlZ3kpIHsKLQkJZk1peGVkV2hpdGVzcGFjZVN0cmF0ZWd5ID0gbWl4ZWRXaGl0ZXNwYWNlU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRPbmVJbmRlbnQoKSB7Ci0JCXJldHVybiBmT25lSW5kZW50OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE1heExpbmVXaWR0aChpbnQgbWF4TGluZVdpZHRoKSB7Ci0JCWZNYXhMaW5lV2lkdGggPSBtYXhMaW5lV2lkdGg7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T25lSW5kZW50KFN0cmluZyBvbmVJbmRlbnQpIHsKLQkJZk9uZUluZGVudCA9IG9uZUluZGVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2YjZlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5KU1BDYXBhYmxlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRYTUw7Ci0KLQotcHVibGljIGNsYXNzIEVtYmVkZGVkWE1MIGltcGxlbWVudHMgRW1iZWRkZWRUeXBlSGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0IHN1cHBvcnRlZE1pbWVUeXBlczsKLQlwdWJsaWMgU3RyaW5nIENvbnRlbnRUeXBlSURfRW1iZWRkZWRYTUwgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNvbnRlbnR0eXBlLkVtYmVkZGVkWE1MIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEVtYmVkZGVkWE1MLgotCSAqLwotCXB1YmxpYyBFbWJlZGRlZFhNTCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRW1iZWRkZWRDb250ZW50VHlwZSNnZXRBZGFwdGVyRmFjdG9yaWVzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkgewotCQlMaXN0IGZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRYTUwoKSk7Ci0JCS8vIGZhY3Rvcmllcy5hZGRBbGwoUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0RmFjdG9yaWVzKHRoaXMpKTsKLQkJcmV0dXJuIGZhY3RvcmllczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEVtYmVkZGVkQ29udGVudFR5cGUjZ2V0RmFtaWx5SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmFtaWx5SWQoKSB7Ci0JCXJldHVybiBNb2RlbEhhbmRsZXJGb3JYTUwuQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0U3VwcG9ydGVkTWltZVR5cGVzKCkgewotCQlpZiAoc3VwcG9ydGVkTWltZVR5cGVzID09IG51bGwpIHsKLQkJCXN1cHBvcnRlZE1pbWVUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXN1cHBvcnRlZE1pbWVUeXBlcy5hZGQoImFwcGxpY2F0aW9uL3htbCIpOyAvLyROT04tTkxTLTEkCi0JCQlzdXBwb3J0ZWRNaW1lVHlwZXMuYWRkKCJ0ZXh0L3htbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHN1cHBvcnRlZE1pbWVUeXBlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KEZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQkvL1RPRE86IGluaXRpYWxpemUKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRW1iZWRkZWRDb250ZW50VHlwZSNpbml0aWFsaXplUGFyc2VyKFJlZ2lvblBhcnNlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFyc2VyKEpTUENhcGFibGVQYXJzZXIgcGFyc2VyKSB7Ci0JCS8vIG5vdGhpbmcgdG8gaW5pdGlhbGl6ZSBmb3IgInB1cmUiIFhNTAotCQkvLyBjb21wYXJlIHdpdGggWEhUTUwKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgRW1iZWRkZWRUeXBlSGFuZGxlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBFbWJlZGRlZFhNTCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeShGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJLy8gVE9ETzogbmVlZCB0byB1bmRvIGFueXRoaW5nIHdlIGRpZCBpbiBpbml0aWFsaXplCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmluaXRpYWxpemVQYXJzZXIoSlNQQ2FwYWJsZVBhcnNlciBwYXJzZXIpIHsKLQkJLy8gbmVlZCB0byB1bmRvIGFueXRoaW5nIHdlIGRpZCBpbiBpbml0aWFsaXplCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7Ci0JCWJvb2xlYW4gY2FuSGFuZGxlID0gZ2V0U3VwcG9ydGVkTWltZVR5cGVzKCkuY29udGFpbnMobWltZVR5cGUpOwotCQlpZighY2FuSGFuZGxlKSB7Ci0JCQljYW5IYW5kbGUgPSBtaW1lVHlwZS5lbmRzV2l0aCgiK3htbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGNhbkhhbmRsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGJkZjNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuQWJzdHJhY3RNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5YTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuWE1MRG9jdW1lbnRMb2FkZXI7Ci0KLQotLyoqCi0gKiBQcm92aWRlcyBnZW5lcmljIFhNTCBtb2RlbCBoYW5kbGluZy4gSXQgaXMgYWxzbyBtYXJrZWQgYXMgdGhlIGRlZmF1bHQKLSAqIGNvbnRlbnQgdHlwZSBoYW5kbGVyLiBUaGVyZSBzaG91bGQgYmUgb25seSBvbmUgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gKiBkZWZhdWx0LgotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxIYW5kbGVyRm9yWE1MIGV4dGVuZHMgQWJzdHJhY3RNb2RlbEhhbmRsZXIgaW1wbGVtZW50cyBJTW9kZWxIYW5kbGVyIHsKLQkvKioKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4KLQkgKiBhdCBydW4gdGltZSB3aXRoIHdoYXQncyBpbiByZWdpc3RyeSEgKHNvIHNob3VsZCBuZXZlciBiZSAnZmluYWwnKQotCSAqLwotCXN0YXRpYyBTdHJpbmcgQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQgPSAib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4KLQkgKiBhdCBydW4gdGltZSB3aXRoIHdoYXQncyBpbiByZWdpc3RyeSEgKHNvIHNob3VsZCBuZXZlciBiZSAnZmluYWwnKQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNb2RlbEhhbmRsZXJJRCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUubW9kZWxoYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIE1vZGVsSGFuZGxlckZvclhNTCgpIHsKLQkJc3VwZXIoKTsJCi0JCXNldElkKE1vZGVsSGFuZGxlcklEKTsKLQkJc2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgWE1MRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldEVuY29kaW5nRGV0ZWN0b3IoKSB7Ci0JCXJldHVybiBuZXcgWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgSU1vZGVsTG9hZGVyIGdldE1vZGVsTG9hZGVyKCkgewotCQlyZXR1cm4gbmV3IFhNTE1vZGVsTG9hZGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9YTUxNb2RlbExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvWE1MTW9kZWxMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmOTIyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9YTUxNb2RlbExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlByb3BhZ2F0aW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkRlYnVnQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRPTU1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuWE1MRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm9wYWdhdGUuUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgYW4gWE1MIGZpbGUgYW5kIGNyZWF0ZXMgYW4gWE1MIFN0cnVjdHVyZWQgTW9kZWwuCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxNb2RlbExvYWRlciBleHRlbmRzIEFic3RyYWN0TW9kZWxMb2FkZXIgewotCi0JLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUl9FTkNPRElORyA9ICJlbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFhNTExvYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBYTUxNb2RlbExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJZmFjdG9yeSA9IG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJLy8gRG9lcyBYTUwgbmVlZCBwcm9wYWdhdGluZyBhZGFwdGVyPyBPciBqdXN0IEpTUD8KLQkJZmFjdG9yeSA9IG5ldyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbCgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCWlmIChkb2N1bWVudExvYWRlckluc3RhbmNlID09IG51bGwpIHsKLQkJCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBuZXcgWE1MRG9jdW1lbnRMb2FkZXIoKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnRMb2FkZXJJbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgSU1vZGVsTG9hZGVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IFhNTE1vZGVsTG9hZGVyKCk7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgRE9NTW9kZWxJbXBsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlTG9hZEFkYXB0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCXN1cGVyLnByZUxvYWRBZGFwdChzdHJ1Y3R1cmVkTW9kZWwpOwotCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWw7Ci0JCS8vIGlmIHRoZXJlIGlzIGEgbW9kZWwgaW4gdGhlIGFkYXB0ZXIsIHRoaXMgd2lsbCBhZGFwdCBpdCB0bwotCQkvLyBmaXJzdCBub2RlLiBBZnRlciB0aGF0IHRoZSBQcm9wYWdhdGluZ0FkYXRlciBzcHJlYWRzIG92ZXIgdGhlCi0JCS8vIGNoaWxkcmVuIGJlaW5nCi0JCS8vIGNyZWF0ZWQuIEVhY2ggdGltZSB0aGF0IGhhcHBlbmRzLCBhIHNpZGUgZWZmZWN0IGlzIHRvCi0JCS8vIGFsc28gInNwcmVhZCIgc3ByZWNpZmljIHJlZ2lzdGVyZWQgYWRhcHRlcnMsCi0JCS8vIHRoZXkgdHdvIGNhbiBwcm9waWdhdGUgaXMgbmVlZGVkLgotCQkoKElOb2RlTm90aWZpZXIpIGRvbU1vZGVsLmdldERvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQotCQlpZiAoRGVidWcuZGVidWdOb3RpZmljYXRpb25BbmRFdmVudHMpIHsKLQkJCVByb3BhZ2F0aW5nQWRhcHRlciBwcm9wYWdhdGluZ0FkYXB0ZXIgPSAoUHJvcGFnYXRpbmdBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvbU1vZGVsLmdldERvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJCXByb3BhZ2F0aW5nQWRhcHRlci5hZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeShuZXcgRGVidWdBZGFwdGVyRmFjdG9yeSgpKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDVhOWMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotCi0KLXB1YmxpYyBjbGFzcyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTCBleHRlbmRzIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTCB7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTC4KLQkgKi8KLQlwdWJsaWMgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRYTUwoKSB7Ci0JCXN1cGVyKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlRG9jdW1lbnRNYW5hZ2VyKENNRG9jdW1lbnRNYW5hZ2VyIG1ncikgewotCQlzdXBlci5jb25maWd1cmVEb2N1bWVudE1hbmFnZXIobWdyKTsKLQkJbWdyLnNldFByb3BlcnR5RW5hYmxlZChDTURvY3VtZW50TWFuYWdlci5QUk9QRVJUWV9BU1lOQ19MT0FELCB0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogSVNTVUU6IHRoaXMgImZvcmNlcyIgYSBuZXcgb25lIHRvIGFsd2F5cyBiZSBjcmVhdGVkL3JldHVybmVkLCAKLQkgKiBub3QgImNhY2hlZCIgb24gdGhlIG5vZGUuIFRoYXQgc2VlbXMgaW5jb3JyZWN0LiAKLQkgKiBTaW1wbHkgdXNpbmcgc2hvdWxkUmVnaXN0ZXJGYWxzZSBzaG91bGQgd29yaywgZXhjZXB0LCAKLQkgKiB0aGVyZSBtaWdodCBoYXZlIGJlZW4gb25lIHRoZXJlIHRoYXQgc29tZW9uZSBlbHNlIGFscmVhZHkgCi0JICogZXhwbGljaXRseSBwdXQgdGhlcmUsIHNvIHRoaXMgaXMgb25seSB3YXkgSSBrbm93IHRvIAotCSAqIG92ZXJyaWRlIHRoYXQuIEVzcGVjaWFsbHkgY29tcGxpY2F0ZWQgaGVyZSBzaW5jZSBhIG51bWJlcgotCSAqIG9mIGFkYXB0ZXJzIGFyZSBmb3IgTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MuCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG9iamVjdCkgewotCQlyZXR1cm4gYWRhcHROZXcob2JqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYjRhZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckltcGw7Ci0KLQotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTCBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgewotCi0JcHJvdGVjdGVkIE1vZGVsUXVlcnlBZGFwdGVySW1wbCBtb2RlbFF1ZXJ5QWRhcHRlckltcGw7Ci0JSVN0cnVjdHVyZWRNb2RlbCBzdGF0ZU5vdGlmaWVyID0gbnVsbDsKLQlwcml2YXRlIEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyOwotCi0JLyoqCi0JICogTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTCgpIHsKLQkJdGhpcyhNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJLZXkKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKiBAcGFyYW0gcmVnaXN0ZXJBZGFwdGVycwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwoT2JqZWN0IGFkYXB0ZXJLZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQljbGFzcyBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciBpbXBsZW1lbnRzIElNb2RlbFN0YXRlTGlzdGVuZXIgewotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxBYm91dFRvQmVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbENoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsRGlydHlTdGF0ZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCwKLQkJICogICAgICBib29sZWFuKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBib29sZWFuIGlzRGlydHkpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VEZWxldGVkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwsCi0JCSAqICAgICAgSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCQlzdGF0ZU5vdGlmaWVyLnJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJCXN0YXRlTm90aWZpZXIgPSBuZXdNb2RlbDsKLQkJCXVwZGF0ZVJlc29sdmVyKHN0YXRlTm90aWZpZXIpOwotCQkJc3RhdGVOb3RpZmllci5hZGRNb2RlbFN0YXRlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kZWxSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCQl1cGRhdGVSZXNvbHZlcihzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCX0KLQotCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXV0b0xvYWRDTSgpIHsKLQkJLy8gdW50aWwgdGhlIGV4aXN0ZW5jZSBvZiBhIENNRG9jdW1lbnRSZXF1ZXN0ZXJGYWN0b3J5IHRvIGNyZWF0ZSB0aGUKLQkJLy8gbG9hZCByZXF1ZXN0cywKLQkJLy8gcmV0dXJuIHRydWUKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlRG9jdW1lbnRNYW5hZ2VyKENNRG9jdW1lbnRNYW5hZ2VyIG1ncikgewotCQkvLyB0aGlzIGRlcGVuZHMgb24gdGhlcmUgYmVpbmcgYSBDTURvY3VtZW50UmVxdWVzdGVyRmFjdG9yeSBpbnN0YWxsZWQKLQkJbWdyLnNldFByb3BlcnR5RW5hYmxlZChDTURvY3VtZW50TWFuYWdlci5QUk9QRVJUWV9BVVRPX0xPQUQsIGF1dG9Mb2FkQ00oKSk7Ci0JfQotCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQotCQlyZXR1cm4gbmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTChnZXRBZGFwdGVyS2V5KCksIGlzU2hvdWxkUmVnaXN0ZXJBZGFwdGVyKCkpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUFkYXB0ZXIgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0KLQkJaWYgKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnLmRpc3BsYXlJbmZvKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLU1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTC5jcmVhdGVBZGFwdGVyIiArIHRhcmdldCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1vZGVsUXVlcnlBZGFwdGVySW1wbCA9PSBudWxsKSB7Ci0JCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQlJRE9NTm9kZSB4bWxOb2RlID0gKElET01Ob2RlKSB0YXJnZXQ7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IHhtbE5vZGUuZ2V0TW9kZWwoKTsKLQkJCQlzdGF0ZU5vdGlmaWVyID0geG1sTm9kZS5nZXRNb2RlbCgpOwotCQkJCXN0YXRlTm90aWZpZXIuYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKGdldEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCkpOwotCi0JCQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBtb2RlbC5nZXRSZXNvbHZlcigpOwotCQkJCWlmIChEZWJ1Zy5kaXNwbGF5SW5mbykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MLi4uIGJhc2VMb2NhdGlvbiA6ICIgKyByZXNvbHZlci5nZXRGaWxlQmFzZUxvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkvKioKLQkJCQkgKiBYTUxDYXRhbG9nSWRSZXNvbHZlciBjdXJyZW50bHkgcmVxdWlyZXMgYSBmaWxlc3lzdGVtCi0JCQkJICogbG9jYXRpb24gc3RyaW5nLiBDdXN0b21hcmlseSB0aGlzIHdpbGwgYmUgd2hhdCBpcyBpbiB0aGUKLQkJCQkgKiBkZXByZWNhdGVkIFNTRSBVUklSZXNvbHZlciBhbmQgcmVxdWlyZWQgYnkgdGhlIENvbW1vbiBVUkkKLQkJCQkgKiBSZXNvbHZlci4KLQkJCQkgKi8KLQkJCQlVUklSZXNvbHZlciBpZFJlc29sdmVyID0gbnVsbDsKLQkJCQlpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotCQkJCQlpZFJlc29sdmVyID0gbmV3IFhNTENhdGFsb2dJZFJlc29sdmVyKHJlc29sdmVyLmdldEZpbGVCYXNlTG9jYXRpb24oKSwgcmVzb2x2ZXIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLyoKLQkJCQkJICogMjAzNjQ5IC0gdGhpcyBibG9jayBtYXkgYmUgbmVjZXNzYXJ5IGR1ZSB0byBvcmRlcmluZyBvZgotCQkJCQkgKiBzZXR0aW5nIHRoZSByZXNvbHZlciBpbnRvIHRoZSBtb2RlbAotCQkJCQkgKi8KLQkJCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG51bGw7Ci0JCQkJCVN0cmluZyBtb2RlbHNCYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCQkJaWYgKG1vZGVsc0Jhc2VMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlGaWxlIGZpbGUgPSBuZXcgUGF0aChtb2RlbHNCYXNlTG9jYXRpb24pLnRvRmlsZSgpOwotCQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQliYXNlTG9jYXRpb24gPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJSVBhdGggYmFzZVBhdGggPSBuZXcgUGF0aChtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSk7Ci0JCQkJCQkJSVJlc291cmNlIGRlcml2ZWRSZXNvdXJjZSA9IG51bGw7Ci0JCQkJCQkJaWYgKGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkKLQkJCQkJCQkJZGVyaXZlZFJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGJhc2VQYXRoKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCWRlcml2ZWRSZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChiYXNlUGF0aC5zZWdtZW50KDApKTsKLQkJCQkJCQlJUGF0aCBkZXJpdmVkUGF0aCA9IGRlcml2ZWRSZXNvdXJjZS5nZXRMb2NhdGlvbigpOwotCQkJCQkJCWlmIChkZXJpdmVkUGF0aCAhPSBudWxsKSB7Ci0JCQkJCQkJCWJhc2VMb2NhdGlvbiA9IGRlcml2ZWRQYXRoLnRvU3RyaW5nKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlVUkkgdXJpID0gZGVyaXZlZFJlc291cmNlLmdldExvY2F0aW9uVVJJKCk7Ci0JCQkJCQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCQkJCQkJYmFzZUxvY2F0aW9uID0gdXJpLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZihiYXNlTG9jYXRpb24gPT0gbnVsbCkgewotCQkJCQkJCWJhc2VMb2NhdGlvbiA9IG1vZGVsc0Jhc2VMb2NhdGlvbjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZFJlc29sdmVyID0gbmV3IFhNTENhdGFsb2dJZFJlc29sdmVyKGJhc2VMb2NhdGlvbiwgbnVsbCk7Ci0JCQkJfQotCi0JCQkJQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZSA9IG5ldyBDTURvY3VtZW50Q2FjaGUoKTsKLQkJCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBuZXcgWE1MTW9kZWxRdWVyeUltcGwoY21Eb2N1bWVudENhY2hlLCBpZFJlc29sdmVyKTsKLQotCQkJCS8vIGNzIHRvZG8uLi4KLQkJCQkvLyBmb3Igbm93IHdlIGNyZWF0ZSBhIENNRG9jdW1lbnRDYWNoZSBvbiBhICdwZXIgZWRpdG9yJyBiYXNpcwotCQkJCS8vIGluIHRoZSBmdXR1cmUgd2UgbmVlZCB0byBzdXBwb3J0IGEgQ01Eb2N1bWVudENhY2hlIHRoYXQgaXMKLQkJCQkvLyBzaGFyZWQgYmV0d2VlbiBlZGl0b3JzCi0JCQkJLy8gbnNkIGNvbW1lbnQ6IG1heSBub3QgYmUgYXBwcm9wcmlhdGUgZGVwZW5kaW5nIG9uCi0JCQkJQ01Eb2N1bWVudE1hbmFnZXIgZG9jdW1lbnRNYW5hZ2VyID0gbW9kZWxRdWVyeS5nZXRDTURvY3VtZW50TWFuYWdlcigpOwotCQkJCWlmIChkb2N1bWVudE1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQljb25maWd1cmVEb2N1bWVudE1hbmFnZXIoZG9jdW1lbnRNYW5hZ2VyKTsKLQkJCQl9Ci0JCQkJbW9kZWxRdWVyeUFkYXB0ZXJJbXBsID0gbmV3IE1vZGVsUXVlcnlBZGFwdGVySW1wbChjbURvY3VtZW50Q2FjaGUsIG1vZGVsUXVlcnksIGlkUmVzb2x2ZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlckltcGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJc3VwZXIucmVsZWFzZSgpOwotCQlpZiAoc3RhdGVOb3RpZmllciAhPSBudWxsKQotCQkJc3RhdGVOb3RpZmllci5yZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIoZ2V0SW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKSk7Ci0JCXN0YXRlTm90aWZpZXIgPSBudWxsOwotCQlpZiAobW9kZWxRdWVyeUFkYXB0ZXJJbXBsICE9IG51bGwpCi0JCQltb2RlbFF1ZXJ5QWRhcHRlckltcGwucmVsZWFzZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVJlc29sdmVyKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQotCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCUlGaWxlIGJhc2VGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKG1vZGVsLmdldEJhc2VMb2NhdGlvbigpKSk7Ci0JCWlmIChiYXNlRmlsZSAhPSBudWxsKSB7Ci0JCQlpZiAoYmFzZUZpbGUuZ2V0TG9jYXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJYmFzZUxvY2F0aW9uID0gYmFzZUZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKGJhc2VMb2NhdGlvbiA9PSBudWxsICYmIGJhc2VGaWxlLmdldExvY2F0aW9uVVJJKCkgIT0gbnVsbCkgewotCQkJCWJhc2VMb2NhdGlvbiA9IGJhc2VGaWxlLmdldExvY2F0aW9uVVJJKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWlmIChiYXNlTG9jYXRpb24gPT0gbnVsbCkgewotCQkJCWJhc2VMb2NhdGlvbiA9IGJhc2VGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQl9Ci0JCW1vZGVsUXVlcnlBZGFwdGVySW1wbC5zZXRJZFJlc29sdmVyKG5ldyBYTUxDYXRhbG9nSWRSZXNvbHZlcihiYXNlTG9jYXRpb24sIG1vZGVsLmdldFJlc29sdmVyKCkpKTsKLQl9Ci0KLQlwcml2YXRlIGZpbmFsIEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGdldEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCkgewotCQlpZiAoaW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJaW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKTsKLQkJfQotCQlyZXR1cm4gaW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlM2U4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBhc3NvY2lhdGUgTW9kZWxRdWVyeSAoYW5kIHJlbGF0ZWQgZGF0YSkgd2l0aCBhCi0gKiBEb2N1bWVudCAob3IgSVN0cnVjdHVyZWRNb2RlbCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFF1ZXJ5VXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIENNRG9jdW1lbnRDYWNoZSBnZXRDTURvY3VtZW50Q2FjaGUoRG9jdW1lbnQgbm9kZSkgewotCQlNb2RlbFF1ZXJ5QWRhcHRlciBtb2RlbFF1ZXJ5QWRhcHRlciA9IGdldE1vZGVsUXVlcnlBZGFwdGVyKG5vZGUpOwotCQlyZXR1cm4gbW9kZWxRdWVyeUFkYXB0ZXIgIT0gbnVsbCA/IG1vZGVsUXVlcnlBZGFwdGVyLmdldENNRG9jdW1lbnRDYWNoZSgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSSVJlc29sdmVyIGdldElkUmVzb2x2ZXIoRG9jdW1lbnQgbm9kZSkgewotCQlNb2RlbFF1ZXJ5QWRhcHRlciBtb2RlbFF1ZXJ5QWRhcHRlciA9IGdldE1vZGVsUXVlcnlBZGFwdGVyKG5vZGUpOwotCQlyZXR1cm4gbW9kZWxRdWVyeUFkYXB0ZXIgIT0gbnVsbCA/IG1vZGVsUXVlcnlBZGFwdGVyLmdldElkUmVzb2x2ZXIoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoRG9jdW1lbnQgbm9kZSkgewotCQlNb2RlbFF1ZXJ5QWRhcHRlciBtb2RlbFF1ZXJ5QWRhcHRlciA9IGdldE1vZGVsUXVlcnlBZGFwdGVyKG5vZGUpOwotCQlyZXR1cm4gbW9kZWxRdWVyeUFkYXB0ZXIgIT0gbnVsbCA/IG1vZGVsUXVlcnlBZGFwdGVyLmdldE1vZGVsUXVlcnkoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAoKCEobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpKSB8fCBtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXRNb2RlbFF1ZXJ5KCgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNb2RlbFF1ZXJ5QWRhcHRlciBnZXRNb2RlbFF1ZXJ5QWRhcHRlcihEb2N1bWVudCBub2RlKSB7Ci0JCU1vZGVsUXVlcnlBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIG5vZGU7Ci0JCQlyZXN1bHQgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpIG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9YTUxDYXRhbG9nSWRSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTg1MmY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9YTUxDYXRhbG9nSWRSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotLy8gVE9ETyBjcyA6IHJlbW92ZSB0aGlzIGNsYXNzIGFuZCB1dGlsaXplIHRoZSBjb21tb24gVVJJUmVzb2x2ZXIgZGlyZWN0bHkKLS8vIFdlIG5lZWQgdG8gdXBkYXRlIHNvbWUgb2YgdGhlIE1vZGVsUXVlcnkgcmVsYXRlZCBjb2RlIHRvIHBhc3MgdGhlCi0vLyAnYmFzZUxvY2F0aW9uJyB0aHJ1Ci0vLyBhbmQgdGhlbiB0aGVyZSdsbCBiZSBub2RlIG5lZWQgZm9yIHRoaXMgY2xhc3MuCi0vLyAKLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nSWRSZXNvbHZlciBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXIgewotCXByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbjsKLQotCXByb3RlY3RlZCBVUklSZXNvbHZlciB1cmlyZXNvbHZlcjsKLQotCXByaXZhdGUgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBYTUxDYXRhbG9nSWRSZXNvbHZlcihTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbikgewotCQl0aGlzKCk7Ci0JCXRoaXMucmVzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0JfQotCi0JcHVibGljIFhNTENhdGFsb2dJZFJlc29sdmVyKFN0cmluZyByZXNvdXJjZUxvY2F0aW9uLCBVUklSZXNvbHZlciB1cmlyZXNvbHZlcikgewotCQl0aGlzKHJlc291cmNlTG9jYXRpb24pOwotLy8gdGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgbm90IGJlIGNhbGxlZCB3aXRoIHR3byBudWxsIGFyZ3VtZW50cy4KLS8vIElmIHNvLCBhbiBhc3NlcnQgd2lsbCBvY2N1ciBsYXRlciB3aGVuIHJlc29sdmUgaXMgY2FsbGVkLiAKLS8vIFNlZSAxMTgzNzEgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIjcmVzb2x2ZSB0aHJvd3MgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uCi0vLwotLy8gYnV0LCBJJ20gbm90IGVuYWJsaW5nIHRoaXMgY2hlY2sgbm93IGR1ZSB0byBsYXRlbmVzcyBpbiBjeWNsZS4gCQkKLS8vCQlpZiAocmVzb3VyY2VMb2NhdGlvbiA9PSBudWxsICYmIHVyaXJlc29sdmVyID09IG51bGwpIHsKLS8vCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYm90aCBsb2NhdGlvbiBhbmQgcmVzb2x2ZXIgY2FuIG5vdCBiZSBudWxsIik7Ci0vLwkJfQotCQl0aGlzLnVyaXJlc29sdmVyID0gdXJpcmVzb2x2ZXI7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXRzIHRoZSByZXNvdXJjZUxvY2F0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFJlc291cmNlTG9jYXRpb24oKSB7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQlpZiAodXJpcmVzb2x2ZXIgIT0gbnVsbCkKLQkJCQlsb2NhdGlvbiA9IHVyaXJlc29sdmVyLmdldEZpbGVCYXNlTG9jYXRpb24oKTsKLQkJfQotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmUoU3RyaW5nIGJhc2UsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0KLQkJU3RyaW5nIHJlc3VsdCA9IHN5c3RlbUlkOwotCQlpZiAoYmFzZSA9PSBudWxsKSB7Ci0JCQliYXNlID0gZ2V0UmVzb3VyY2VMb2NhdGlvbigpOwotCQkJLy8gYnVnIDExNzMyMCwgZW5zdXJlIGJhc2UgVVJJIGlzICdwcm90b2NhbCcgcXVhbGlmaWVkIGJlZm9yZQotCQkJLy8gcGFzc2luZyBpdCB0aHJ1IHRvIFVSSVJlc29sdmVyCi0JCQkvLyBidWcgMTE3NDI0LCB3ZSBzaG91bGQgYmUgYWJsZSB0byBhc3N1bWUgdGhhdCB0aGUgYmFzZSBsb2NhdGlvbgotCQkJLy8gaXMgbm9uLW51bGwKLQotCQkJLyoqCi0JCQkgKiBXZSBzaG91bGRuJ3QgYXNzZXJ0IGEgZmFpbHVyZSBiZWNhdXNlIHRoZSBjYXRhbG9nIGRvZXMgbm90Ci0JCQkgKiByZXF1aXJlIGEgYmFzZSBsb2NhdGlvbiB0byBvcGVyYXRlIGFuZCBpdCB3aWxsIGJlIGNhbGxlZCBmcm9tCi0JCQkgKiBub24tZmlsZS1iYXNlZCBzY2VuYXJpb3MuCi0JCQkgKiAKLQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDYxNzYKLQkJCSAqLwotCQkJLy8gQXNzZXJ0LmlzTm90TnVsbChiYXNlLCAiQmFzZSBsb2NhdGlvbiBpcyBleHBlY3RlZCB0byBiZSBub24gbnVsbC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCWJhc2UgPSBVUklIZWxwZXIuYWRkSW1wbGllZEZpbGVQcm90b2NvbChiYXNlKTsKLQkJCX0KLQkJfQotCQlyZXN1bHQgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoYmFzZSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVQaHlzaWNhbExvY2F0aW9uKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIGxvZ2ljYWxMb2NhdGlvbikgewotCQkvLyBUaGlzIGNsYXNzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgdG8gcGVyZm9ybSBwaHlzaWNhbCByZXNvbHV0aW9uIQotCQkvLyBJZiBpdCBkb2VzIHdlIHNob3VsZCBsb2cgaXQgYXMgYW4gZXJyb3IKLQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsICJYTUxDYXRhbG9nSURSZXNvbHZlci5yZXNvbHZlUGh5c2ljYWxMb2NhdGlvbigpIGNhbGxlZCB1bmV4cGVjdGVkbHkiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbG9naWNhbExvY2F0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9YTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZDE0YWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLlhNTEFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBYTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcgotICogCi0gKiBUaGlzIGFkZGVkIGFuZC9vciBtYWRlIHB1YmxpYyBzcGVjaWZpY2FsbHkgZm9yIGV4cGVyaW1lbnRhdGlvbi4gSXQgd2lsbAotICogY2hhbmdlIGFzIHRoaXMgZnVuY3Rpb25hbGl0eSBiZWNvbWVzIEFQSS4gU2VlCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE5MDg0Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGV4dGVuZHMgWE1MQXNzb2NpYXRpb25Qcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgVVJJUmVzb2x2ZXIgaWRSZXNvbHZlcjsKLQotCXB1YmxpYyBYTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcihDTURvY3VtZW50Q2FjaGUgY2FjaGUsIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXIpIHsKLQkJc3VwZXIoY2FjaGUpOwotCQl0aGlzLmlkUmVzb2x2ZXIgPSBpZFJlc29sdmVyOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZUdyYW1tYXJVUkkoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0KLQkJLy8gQ1MgOiBzcG9va3kgY29kZSBhbGVydCEKLQkJLy8gdGhpcyBsb29rIHJlYWxseSBzdHJhbmdlIGJlY2F1c2Ugd2UncmUgcGFzc2luZyBudWxsIGluIGFzIHRoZSBmaXJzdAotCQkvLyBhcmd1bWVudAotCQkvLyBob3dldmVyIHdlJ3JlIGFzc3VtaW5nIHRoZSB1c2Ugb2YgYSAnZnVkZ2VkJyBVUklSZXNvbHZlciB0aGF0IGtub3dzCi0JCS8vIHRoZQotCQkvLyBjb3JyZWN0IGJhc2VMb2NhdGlvbiBhbmQgd2lsbCBjYWxsIHRvIHRoZSBVUklSZXNvbHZlciBmcmFtZXdvcmsKLQkJLy8gcHJvcGVybHkKLQotCQkvLyBDUyA6IG5vdGUgdGhhdCB3ZSBzaG91bGQgbmV2ZXIgY2FsbCByZXNvbHZlUGh5c2ljYWwgYXQgdGhpcyBwb2ludC4KLQkJLy8gUGh5c2ljYWwgcmVzb2x1dGlvbiBzaG91bGQgb25seSBvY2N1ciB3aGVuIHdlJ3JlIGludGVyZXN0aW5nIHRvCi0JCS8vIG9wZW5pbmcgdGhlIGFjdHVhbCBzdHJlYW0uCi0JCS8vIFRoZSBDTURvY3VtZW50RmFjdG9yeSBpbXBsZW1lbnRhdGlvbiB3b3VsZCBiZSByZXNwb25zaWJsZSBmb3IKLQkJLy8gY2FsbGluZyByZXNvbHZlUGh5c2ljYWwuCi0JCS8vIEFsbCB3ZSBuZWVkIHRvIGRvIGhlcmUgaXMgcmV0dXJuIGEgJ2xvZ2ljYWwnIFVSSQotCi0JCWlmIChpZFJlc29sdmVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGlkUmVzb2x2ZXIucmVzb2x2ZShudWxsLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9YTUxNb2RlbFF1ZXJ5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hNTE1vZGVsUXVlcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZmEwMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hNTE1vZGVsUXVlcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLk1vZGVsUXVlcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW92YWJsZU1vZGVsUXVlcnk7Ci0KLQotcHVibGljIGNsYXNzIFhNTE1vZGVsUXVlcnlJbXBsIGV4dGVuZHMgTW9kZWxRdWVyeUltcGwgaW1wbGVtZW50cyBNb3ZhYmxlTW9kZWxRdWVyeSB7Ci0KLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudENhY2hlIGZDYWNoZSA9IG51bGw7Ci0KLQlwdWJsaWMgWE1MTW9kZWxRdWVyeUltcGwoQ01Eb2N1bWVudENhY2hlIGNhY2hlLCBVUklSZXNvbHZlciBpZFJlc29sdmVyKSB7Ci0JCXN1cGVyKG5ldyBYTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcihjYWNoZSwgaWRSZXNvbHZlcikpOwotCQlmQ2FjaGUgPSBjYWNoZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vdmFibGVNb2RlbFF1ZXJ5I3NldElkUmVzb2x2ZXIoVVJJUmVzb2x2ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRSZXNvbHZlcihVUklSZXNvbHZlciBuZXdJZFJlc29sdmVyKSB7Ci0JCW1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyID0gbmV3IFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKGZDYWNoZSwgbmV3SWRSZXNvbHZlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvQmxvY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0Jsb2NrU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NTRhODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvQmxvY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLklCbG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBCbG9ja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBleHRlbmRzIEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGltcGxlbWVudHMgSUJsb2NrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgcGFydGl0aW9uVHlwZTsKLQotCS8qKgotCSAqIEEgQmxvY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgbGlrZSBhIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sCi0JICogYnV0IGlzIHRoZSByZXN1bHQgb2YgYSAiYmxvY2sgc2NhbiIuCi0JICovCi0JcHVibGljIEJsb2NrU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZSgpIHsKLQkJaWYgKHBhcnRpdGlvblR5cGUgPT0gbnVsbCkgewotCQkJLy8gZXZlbnR1YWxseSBjYW4gbG9vayB1cCBzdXJyb3VuZGluZ1RhZyBuYW1lCi0JCQkvLyBidXQgdGhpcyBmaWVsZCBpcyBwcmltYXJpbHkgZW50ZW5kZWQgZm9yIGZ1dHVyZQotCQkJLy8gZXh0ZW5zaWJpbGl0eS4gVGhpcyBtYXkgY2hhbmdlLgotCQkJLy9wYXJ0aXRpb25UeXBlID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS4iICsgdGFnbmFtZTsKLQkJfQotCQlyZXR1cm4gcGFydGl0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0aXRpb25UeXBlKFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCXRoaXMucGFydGl0aW9uVHlwZSA9IHBhcnRpdGlvblR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ29udGV4dFJlZ2lvbkNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ29udGV4dFJlZ2lvbkNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTNmODE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NvbnRleHRSZWdpb25Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuVGV4dFJlZ2lvbkxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotcHVibGljIGNsYXNzIENvbnRleHRSZWdpb25Db250YWluZXIgaW1wbGVtZW50cyBJVGV4dFJlZ2lvbkNvbnRhaW5lciB7Ci0JcHJvdGVjdGVkIGludCBsZW5ndGg7Ci0JcHJvdGVjdGVkIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBwYXJlbnQ7Ci0JcHJvdGVjdGVkIElUZXh0UmVnaW9uTGlzdCByZWdpb25zOwotCXByb3RlY3RlZCBpbnQgc3RhcnQ7Ci0JcHJvdGVjdGVkIGludCB0ZXh0TGVuZ3RoOwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZTsKLQotCXB1YmxpYyBDb250ZXh0UmVnaW9uQ29udGFpbmVyKCkgewotCQlzdXBlcigpOwotCQlyZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbCgpOwotCi0JfQotCi0JLyoqCi0JICogdGhlc2UgImRlZXAiIHBhcmVudGluZyBpcyBub3Qgbm9ybWFsLCBidXQganVzdCBpbiBjYXNlLgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBfZ2V0UGFyZW50RG9jdW1lbnQoKSB7Ci0JCS8vIGdvIHVwIGVub3VnaCBwYXJlbnRzIHRvIGdldCB0byBkb2N1bWVudAotCQlJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcGFyZW50ID0gZ2V0UGFyZW50KCk7Ci0JCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQkvLyB3b3VsZCBiZSBhbiBlcnJvciBub3QgdG8gYmUgY29udGFpbmVyLCBidXQKLQkJCS8vIHdvbid0IGNoZWNrIGZvciBpdCBub3cKLQkJCXBhcmVudCA9ICgoSVRleHRSZWdpb25Db250YWluZXIpIHBhcmVudCkuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJcmV0dXJuICgoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgcGFyZW50KS5nZXRQYXJlbnREb2N1bWVudCgpOwotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0KGludCBpKSB7Ci0KLQkJc3RhcnQgKz0gaTsKLQkJLy8gSSBlcnJvbmVvdXNseSBhZGRlZCBsZW5ndGggYW5kIHRleHRMZW5ndGgKLQkJLy8gVE9ETzogbWF5IHdhbnQgdG8gcmVuYW1lIHRoaXMgbWV0aG9kIHRvIGFkanVzdFN0YXJ0Ci0JCS8vbGVuZ3RoICs9IGk7Ci0JCS8vdGV4dExlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWxlbmd0aCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCXN0YXJ0ICs9IGk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCXRleHRMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCBpKSB7Ci0KLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KCkgPD0gaSAmJiBpIDwgZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBnZXRTdGFydE9mZnNldChjb250YWluZWRSZWdpb24pIDw9IG9mZnNldCAmJiBvZmZzZXQgPCBnZXRFbmRPZmZzZXQoY29udGFpbmVkUmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBqdXN0IHRvIGVxdWF0ZSBwb3NpdGlvbnMuIGNsaWVudHMgbWF5ICh3aWxsIHByb2JhYmx5KQotCSAqIHN0aWxsIG5lZWQgdG8gbWFrZSBjYWxscyB0byBlcXVhdGUgcmVnaW9ucywgcGFyZW50LCBldGMuCi0JICovCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlzdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlsZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCXRleHRMZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gc3RhcnQgKyBsZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCS8vIG91ciBzdGFydE9mZnNldCB0YWtlIGludG8gYWNjb3VudCBvdXIgcGFyZW50LCBhbmQgb3VyIHN0YXJ0Ci0JCXJldHVybiBnZXRTdGFydE9mZnNldCgpICsgZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCXJldHVybiBnZXRTdGFydE9mZnNldChjb250YWluZWRSZWdpb24pICsgY29udGFpbmVkUmVnaW9uLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRGaXJzdFJlZ2lvbigpIHsKLQkJcmV0dXJuIGdldFJlZ2lvbnMoKS5nZXQoMCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dCgpIHsKLQkJcmV0dXJuIGdldFBhcmVudCgpLmdldEZ1bGxUZXh0KHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQkvLyBNdXN0IGJlIHByb3hpZWQgaGVyZSBzaW5jZSBhUmVnaW9uIHNob3VsZCBhbHdheXMgYmUgYSBjaGlsZCBvZgotCQkvLyAqdGhpcyogY29udGFpbmVyIGFuZCBpbmRleGVkIGZyb20KLQkJLy8gdGhpcyBjb250YWluZXIncyBvZmZzZXQKLQkJcmV0dXJuIHBhcmVudC5nZXRGdWxsVGV4dCgpLnN1YnN0cmluZyhzdGFydCArIGFSZWdpb24uZ2V0U3RhcnQoKSwgc3RhcnQgKyBhUmVnaW9uLmdldEVuZCgpKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TGFzdFJlZ2lvbigpIHsKLQkJcmV0dXJuIGdldFJlZ2lvbnMoKS5nZXQoZ2V0UmVnaW9ucygpLnNpemUoKSAtIDEpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gbGVuZ3RoOwotCX0KLQotCi0JcHVibGljIGludCBnZXROdW1iZXJPZlJlZ2lvbnMoKSB7Ci0JCXJldHVybiBnZXRSZWdpb25zKCkuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIFRoZSBwYXJhbWV0ZXIgb2Zmc2V0IHJlZmVycyB0byB0aGUgb3ZlcmFsbCBvZmZzZXQgaW4gdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCUlUZXh0UmVnaW9uIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChyZWdpb25zICE9IG51bGwpIHsKLQkJCS8vIHRyYW5zZm9ybSB0aGUgcmVxdWVzdGVkIG9mZnNldCB0byB0aGUgInNjYWxlIiB0aGF0Ci0JCQkvLyByZWdpb25zIGFyZSBzdG9yZWQgaW4sIHdoaWNoIGFyZSBhbGwgcmVsYXRpdmUgdG8gdGhlCi0JCQkvLyBzdGFydCBwb2ludC4KLQkJCS8vaW50IHRyYW5zZm9ybWVkT2Zmc2V0ID0gb2Zmc2V0IC0gZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCS8vCi0JCQlpbnQgbGVuZ3RoID0gZ2V0UmVnaW9ucygpLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRSZWdpb25zKCkuZ2V0KGkpOwotCQkJCWlmIChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlZ2lvbihzKSBpbiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOjpnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldDogIiArIHJlZ2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgcmVxdWVzdGVkIG9mZnNldDogIiArIG9mZnNldCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIiB0cmFuc2Zvcm1lZE9mZnNldDogIiArCi0JCQkJCS8vIHRyYW5zZm9ybWVkT2Zmc2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZWdpb24gc3RhcnQ6ICIgKyByZWdpb24uZ2V0U3RhcnQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgcmVnaW9uIGVuZDogIiArIHJlZ2lvbi5nZXRFbmQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgcmVnaW9uIHR5cGU6ICIgKyByZWdpb24uZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZWdpb24gY2xhc3M6ICIgKyByZWdpb24uZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCX0KLQkJCQlpZiAoKGdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgPD0gb2Zmc2V0KSAmJiAob2Zmc2V0IDwgZ2V0RW5kT2Zmc2V0KHJlZ2lvbikpKSB7Ci0JCQkJCXJlc3VsdCA9IHJlZ2lvbjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uTGlzdCBnZXRSZWdpb25zKCkgewotCQlyZXR1cm4gcmVnaW9uczsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldFBhcmVudCgpLmdldFN0YXJ0T2Zmc2V0KCkgKyBnZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCS8vIGl0IGlzIGFuIGVycm9yIHRvIHBhc3MgbnVsbCB0byB0aGlzIG1ldGhvZAotCQkvLyBJU1NVRTogbmVlZCBiZXR0ZXIgInNwZWMiIG9uIGVycm9yIGJlaGF2aW9yOiAKLQkJLy8gZm9yIG5vdyB3aWxsIHJldHVybiB6ZXJvIGFzIHRoaXMgd2lsbCByb3VnaGx5IAotCQkvLyB3b3JrIGZvciBzb21lIGNhc2VzIChhbmQgYXZvaWQgTlBFKS4KLQkJaWYgKGNvbnRhaW5lZFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKSArIGNvbnRhaW5lZFJlZ2lvbi5nZXRTdGFydCgpOwotCX0KLQotCS8qKgotCSAqIHNhbWUgYXMgZ2V0RnVsbFRleHQgZm9yIHRoaXMgcmVnaW9uIHR5cGUgLi4uIGRvIHdlIG5lZWQgdG8gdGFrZSB3aGl0ZQotCSAqIHNwYWNlIG9mZj8KLQkgKi8KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHBhcmVudERvY3VtZW50ID0gX2dldFBhcmVudERvY3VtZW50KCk7Ci0JCQlyZXN1bHQgPSBwYXJlbnREb2N1bWVudC5nZXQoc3RhcnQsIGxlbmd0aCk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oInByb2dyYW0gZXJyb3I6IHVucmVhY2hhYmxlIGV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQkvLyBNdXN0IGJlIHByb3hpZWQgaGVyZSBzaW5jZSBhUmVnaW9uIHNob3VsZCBhbHdheXMgYmUgYSBjaGlsZCBvZgotCQkvLyAqdGhpcyogY29udGFpbmVyIGFuZCBpbmRleGVkIGZyb20KLQkJLy8gdGhpcyBjb250YWluZXIncyBvZmZzZXQKLQkJcmV0dXJuIHBhcmVudC5nZXRUZXh0KCkuc3Vic3RyaW5nKHN0YXJ0ICsgYVJlZ2lvbi5nZXRTdGFydCgpLCBzdGFydCArIGFSZWdpb24uZ2V0VGV4dEVuZCgpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBzdGFydCArIHRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KCkgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQkvLyBvdXIgc3RhcnRPZmZzZXQgdGFrZSBpbnRvIGFjY291bnQgb3VyIHBhcmVudCwgYW5kIG91ciBzdGFydAotCQkvLyAocGEpIDEwLzQgY2hhbmdlZCB0byBiZSBiYXNlZCBvbiB0ZXh0IGVuZAotCQkvLyAgICAgICAgICAgaXQgdXNlZCB0byByZXR1cm4gaW5jb3JyZWN0IHZhbHVlIGZvciBlbWJlZGRlZCByZWdpb24gY29udGFpbmVycwotCQkvLwotCi0JCS8vIFRPRE8gQ1JJVElDQUwgLS0gbmVlZCB0byByZS13b3JrIHRoaXMgd29yayBhcm91bmQsIHNvIGRvZXNuJ3QKLQkJLy8gZGVwZW5kIG9uIFhNTFJlZ2lvbkNvbnRleHQKLQkJLy8JCS8vIHRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciAyMjY4MjMvLy8vLy8vLy8vLwotCQkvLwkJZm9yIChpbnQgaSA9IHJlZ2lvbnMuc2l6ZSgpIC0gMTsgaSA+PSAwICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0KLQkJLy8gWE1MUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRTsgaS0tKQotCQkvLwkJCXJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5nZXQoaSk7Ci0JCS8vCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKSArIHJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJaWYgKHJlZ2lvbnMgIT0gbnVsbCkgewotCQkJaW50IGxlbmd0aCA9IGdldFJlZ2lvbnMoKS5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZ2V0UmVnaW9ucygpLmdldChpKTsKLQkJCQlpZiAocmVnaW9uID09IGNvbnRhaW5lZFJlZ2lvbikgewotCQkJCQlyZXN1bHQgPSBnZXRTdGFydE9mZnNldChyZWdpb24pICsgcmVnaW9uLmdldFRleHRFbmQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgaSkgewotCQlsZW5ndGggPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcGFyZW50UmVnaW9uKSB7Ci0JCXBhcmVudCA9IHBhcmVudFJlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWdpb25zKElUZXh0UmVnaW9uTGlzdCBjb250YWluZWRSZWdpb25zKSB7Ci0JCXJlZ2lvbnMgPSBjb250YWluZWRSZWdpb25zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KGludCBpKSB7Ci0JCXN0YXJ0ID0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCXRleHRMZW5ndGggPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHN0cmluZykgewotCQl0eXBlID0gc3RyaW5nOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJU3RyaW5nIHNob3J0Q2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyByZXN1bHQgPSAiQ29udGFpbmVyISEhICIgKyBzaG9ydENsYXNzTmFtZSArICItLT4gIiArIGdldFR5cGUoKSArICI6ICIgKyBnZXRTdGFydCgpICsgIi0iICsgZ2V0VGV4dEVuZCgpICsgKGdldFRleHRFbmQoKSAhPSBnZXRFbmQoKSA/ICgiLyIgKyBnZXRFbmQoKSkgOiAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gRlVUVVJFX1RPX0RPOiBuZWVkIHRvIGltcGxlbWVudCByZWdpb24gbGV2ZWwgcGFyc2luZyBpbgotCQkvLyBJVGV4dFJlZ2lvbkNvbnRhaW5lcjo6dXBkYXRlTW9kZWwKLQkJLy8gbmV2ZXIgYmVpbmcgY2FsbGVkPwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvSW50U3RhY2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0ludFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NzE1NDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvSW50U3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotCi0KLS8qCi0gKiAKLSAqIEEgbm9uLXJlc2l6YWJsZSBjbGFzcyBpbXBsZW1lbnRpbmcgdGhlIGJlaGF2aW9yIG9mIGphdmEudXRpbC5TdGFjaywgYnV0Ci0gKiBkaXJlY3RseSBmb3IgdGhlIDxjb2RlPiBpbnRlZ2VyIDwvY29kZT4gcHJpbWl0aXZlLgotICovCi1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBJbnRTdGFjayB7Ci0JcHJpdmF0ZSBpbnRbXSBsaXN0ID0gbnVsbDsKLQotCXByaXZhdGUgaW50IHNpemUgPSAwOwotCi0JcHVibGljIEludFN0YWNrKCkgewotCQl0aGlzKDEwMCk7Ci0JfQotCi0JcHVibGljIEludFN0YWNrKGludCBtYXhkZXB0aCkgewotCQlzdXBlcigpOwotCQlsaXN0ID0gbmV3IGludFttYXhkZXB0aF07Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbXB0eSgpIHsKLQkJcmV0dXJuIHNpemUgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldChpbnQgc2xvdCkgewotCQlyZXR1cm4gbGlzdFtzbG90XTsKLQl9Ci0KLQl2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKLQkJCWxpc3RbaV0gPSAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgd2l0aG91dCByZW1vdmluZyBpdAotCSAqIAotCSAqIEByZXR1cm4gaW50IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5LgotCSAqLwotCXB1YmxpYyBpbnQgcGVlaygpIHsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCXJldHVybiBsaXN0W3NpemUgLSAxXTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFuZCByZXR1cm5zIHRoZSBpbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogQGV4Y2VwdGlvbiBFbXB0eVN0YWNrRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgd2hlbiBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgaW50IHBvcCgpIHsKLQkJaW50IHZhbHVlID0gcGVlaygpOwotCQlsaXN0W3NpemUgLSAxXSA9IC0xOwotCQlzaXplLS07Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQdXNoZXMgYW4gaXRlbSBvbnRvIHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VmFsdWUgLQotCSAqICAgICAgICAgICAgdGhlIGludCB0byBiZSBwdXNoZWQgb250byB0aGlzIHN0YWNrLgotCSAqIEByZXR1cm4gdGhlIDxjb2RlPm5ld1ZhbHVlPC9jb2RlPiBhcmd1bWVudC4KLQkgKi8KLQlwdWJsaWMgaW50IHB1c2goaW50IG5ld1ZhbHVlKSB7Ci0JCWlmIChzaXplID09IGxpc3QubGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgU3RhY2tPdmVyZmxvd0Vycm9yKCk7Ci0JCX0KLQkJbGlzdFtzaXplKytdID0gbmV3VmFsdWU7Ci0JCXJldHVybiBuZXdWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBsaXN0Lmxlbmd0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9SZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9SZWdpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMTVhNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvUmVnaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Db250ZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotCi0KLXB1YmxpYyBjbGFzcyBSZWdpb25GYWN0b3J5IHsKLQotCXB1YmxpYyBSZWdpb25GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihJVGV4dFJlZ2lvbkNvbnRhaW5lciBwYXJlbnQsIFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRva2VuKHBhcmVudCwgY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKElUZXh0UmVnaW9uQ29udGFpbmVyIHBhcmVudCwgU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgsIFN0cmluZyBsYW5nLCBTdHJpbmcgc3Vycm91bmRpbmdUYWcpIHsKLQkJSVRleHRSZWdpb24gbmV3UmVnaW9uID0gY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCS8vbmV3UmVnaW9uLnNldFBhcmVudChwYXJlbnQpOwotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgsIFN0cmluZyBsYW5nLCBTdHJpbmcgc3Vycm91bmRpbmdUYWcpIHsKLQkJSVRleHRSZWdpb24gbmV3UmVnaW9uID0gbmV3IENvbnRleHRSZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCXJldHVybiBuZXdSZWdpb247Ci0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTDEwTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTDEwTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY5MWM2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUwxME5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTUgKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS40IG9uIDIvMjUvMDggMTA6MjUgQU0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwyMDA4IElCTSBDb3Jwb3JhdGlvbiwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIGtiLmh1YW5nICAtIEJ1ZyAyMTQ0MTYgIERvdCBjaGFyIGlzIG5vdCBlc2NhcGVkIGluIFhNTDEwTmFtZXMuakZsZXgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuamZsZXguZGUvIj5KRmxleDwvYT4gMS40Ci0gKiBvbiAyLzI1LzA4IDEwOjI1IEFNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PlhNTDEwTmFtZXMuamZsZXg8L3R0PgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MMTBOYW1lcyB7Ci0KLSAgLyoqIFRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBpbml0aWFsIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX0JVRkZFUlNJWkUgPSAyMDQ4OwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWVlJTklUSUFMID0gMDsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0NNQVBfUEFDS0VEID0gCi0gICAgIlwxMlwwXDFcM1w0MlwwXDFcMlwxXDJcMVwwXDEyXDJcMVwxXDZcMFwzMlwxIisKLSAgICAiXDRcMFwxXDFcMVwwXDMyXDFcNzRcMFwxXDJcMTBcMFwyN1wxXDFcMFwzN1wxIisKLSAgICAiXDFcMFw3MlwxXDJcMFwxM1wxXDJcMFwxMFwxXDFcMFw2NVwxXDFcMFwxMDRcMSIrCi0gICAgIlwxMVwwXDQ0XDFcM1wwXDJcMVw0XDBcMzZcMVw3MFwwXDEzMVwxXDIyXDBcN1wxIisKLSAgICAiXDE2XDBcMlwyXDU2XDBcMTA2XDJcMzJcMFwyXDJcNDRcMFwxXDFcMVwyXDNcMSIrCi0gICAgIlwxXDBcMVwxXDFcMFwyNFwxXDFcMFw1NFwxXDFcMFw3XDFcM1wwXDFcMSIrCi0gICAgIlwxXDBcMVwxXDFcMFwxXDFcMVwwXDFcMVwxXDBcMjJcMVwxNVwwXDE0XDEiKwotICAgICJcMVwwXDEwMlwxXDFcMFwxNFwxXDFcMFw0NFwxXDFcMFw0XDJcMTFcMFw2NVwxIisKLSAgICAiXDJcMFwyXDFcMlwwXDJcMVwzXDBcMzRcMVwyXDBcMTBcMVwyXDBcMlwxIisKLSAgICAiXDY3XDBcNDZcMVwyXDBcMVwxXDdcMFw0NlwxXDEyXDBcMjFcMlwxXDBcMjdcMiIrCi0gICAgIlwxXDBcM1wyXDFcMFwxXDJcMVwwXDJcMlwxXDBcMVwyXDEzXDBcMzNcMSIrCi0gICAgIlw1XDBcM1wxXDU2XDBcMzJcMVw1XDBcMVwyXDEyXDFcMTBcMlwxNVwwXDEyXDIiKwotICAgICJcNlwwXDFcMlwxMDdcMVwyXDBcNVwxXDFcMFwxN1wxXDFcMFw0XDFcMVwwIisKLSAgICAiXDFcMVwxN1wyXDJcMVwyXDJcMVwwXDRcMlwyXDBcMTJcMlx1MDIwN1wwXDNcMiIrCi0gICAgIlwxXDBcNjVcMVwyXDBcMVwyXDFcMVwyMFwyXDNcMFw0XDJcM1wwXDEyXDEiKwotICAgICJcMlwyXDJcMFwxMlwyXDIxXDBcM1wyXDFcMFwxMFwxXDJcMFwyXDFcMlwwIisKLSAgICAiXDI2XDFcMVwwXDdcMVwxXDBcMVwxXDNcMFw0XDFcMlwwXDFcMlwxXDAiKwotICAgICJcN1wyXDJcMFwyXDJcMlwwXDNcMlwxMVwwXDFcMlw0XDBcMlwxXDFcMCIrCi0gICAgIlwzXDFcMlwyXDJcMFwxMlwyXDJcMVwyMFwwXDFcMlwyXDBcNlwxXDRcMCIrCi0gICAgIlwyXDFcMlwwXDI2XDFcMVwwXDdcMVwxXDBcMlwxXDFcMFwyXDFcMVwwIisKLSAgICAiXDJcMVwyXDBcMVwyXDFcMFw1XDJcNFwwXDJcMlwyXDBcM1wyXDEzXDAiKwotICAgICJcNFwxXDFcMFwxXDFcN1wwXDEyXDJcMlwyXDNcMVwxNFwwXDNcMlwxXDAiKwotICAgICJcN1wxXDFcMFwxXDFcMVwwXDNcMVwxXDBcMjZcMVwxXDBcN1wxXDFcMCIrCi0gICAgIlwyXDFcMVwwXDVcMVwyXDBcMVwyXDFcMVwxMFwyXDFcMFwzXDJcMVwwIisKLSAgICAiXDNcMlwyMlwwXDFcMVw1XDBcMTJcMlwyMVwwXDNcMlwxXDBcMTBcMVwyXDAiKwotICAgICJcMlwxXDJcMFwyNlwxXDFcMFw3XDFcMVwwXDJcMVwyXDBcNFwxXDJcMCIrCi0gICAgIlwxXDJcMVwxXDZcMlwzXDBcMlwyXDJcMFwzXDJcMTBcMFwyXDJcNFwwIisKLSAgICAiXDJcMVwxXDBcM1wxXDRcMFwxMlwyXDIyXDBcMlwyXDFcMFw2XDFcM1wwIisKLSAgICAiXDNcMVwxXDBcNFwxXDNcMFwyXDFcMVwwXDFcMVwxXDBcMlwxXDNcMCIrCi0gICAgIlwyXDFcM1wwXDNcMVwzXDBcMTBcMVwxXDBcM1wxXDRcMFw1XDJcM1wwIisKLSAgICAiXDNcMlwxXDBcNFwyXDExXDBcMVwyXDE3XDBcMTFcMlwyMVwwXDNcMlwxXDAiKwotICAgICJcMTBcMVwxXDBcM1wxXDFcMFwyN1wxXDFcMFwxMlwxXDFcMFw1XDFcNFwwIisKLSAgICAiXDdcMlwxXDBcM1wyXDFcMFw0XDJcN1wwXDJcMlwxMVwwXDJcMVw0XDAiKwotICAgICJcMTJcMlwyMlwwXDJcMlwxXDBcMTBcMVwxXDBcM1wxXDFcMFwyN1wxXDFcMCIrCi0gICAgIlwxMlwxXDFcMFw1XDFcNFwwXDdcMlwxXDBcM1wyXDFcMFw0XDJcN1wwIisKLSAgICAiXDJcMlw3XDBcMVwxXDFcMFwyXDFcNFwwXDEyXDJcMjJcMFwyXDJcMVwwIisKLSAgICAiXDEwXDFcMVwwXDNcMVwxXDBcMjdcMVwxXDBcMjBcMVw0XDBcNlwyXDJcMCIrCi0gICAgIlwzXDJcMVwwXDRcMlwxMVwwXDFcMlwxMFwwXDJcMVw0XDBcMTJcMlwyMjFcMCIrCi0gICAgIlw1NlwxXDFcMFwxXDFcMVwyXDJcMVw3XDJcNVwwXDZcMVwxXDJcMTBcMiIrCi0gICAgIlwxXDBcMTJcMlw0N1wwXDJcMVwxXDBcMVwxXDJcMFwyXDFcMVwwXDFcMSIrCi0gICAgIlwyXDBcMVwxXDZcMFw0XDFcMVwwXDdcMVwxXDBcM1wxXDFcMFwxXDEiKwotICAgICJcMVwwXDFcMVwyXDBcMlwxXDFcMFwyXDFcMVwwXDFcMVwxXDJcMlwxIisKLSAgICAiXDZcMlwxXDBcMlwyXDFcMVwyXDBcNVwxXDFcMFwxXDJcMVwwXDZcMiIrCi0gICAgIlwyXDBcMTJcMlw3NlwwXDJcMlw2XDBcMTJcMlwxM1wwXDFcMlwxXDBcMVwyIisKLSAgICAiXDFcMFwxXDJcNFwwXDJcMlwxMFwxXDFcMFw0MVwxXDdcMFwyNFwyXDFcMCIrCi0gICAgIlw2XDJcNFwwXDZcMlwxXDBcMVwyXDFcMFwyNVwyXDNcMFw3XDJcMVwwIisKLSAgICAiXDFcMlwzNDZcMFw0NlwxXDEyXDBcNDdcMVwxMVwwXDFcMVwxXDBcMlwxXDFcMCIrCi0gICAgIlwzXDFcMVwwXDFcMVwxXDBcMlwxXDFcMFw1XDFcNTFcMFwxXDFcMVwwIisKLSAgICAiXDFcMVwxXDBcMVwxXDEzXDBcMVwxXDFcMFwxXDFcMVwwXDFcMVwzXDAiKwotICAgICJcMlwxXDNcMFwxXDFcNVwwXDNcMVwxXDBcMVwxXDFcMFwxXDFcMVwwIisKLSAgICAiXDFcMVwxXDBcMVwxXDNcMFwyXDFcM1wwXDJcMVwxXDBcMVwxXDUwXDAiKwotICAgICJcMVwxXDExXDBcMVwxXDJcMFwxXDFcMlwwXDJcMVw3XDBcMlwxXDFcMCIrCi0gICAgIlwxXDFcMVwwXDdcMVw1MFwwXDFcMVw0XDBcMVwxXDEwXDBcMVwxXHUwYzA2XDAiKwotICAgICJcMjM0XDFcNFwwXDEzMlwxXDZcMFwyNlwxXDJcMFw2XDFcMlwwXDQ2XDFcMlwwIisKLSAgICAiXDZcMVwyXDBcMTBcMVwxXDBcMVwxXDFcMFwxXDFcMVwwXDFcMVwxXDAiKwotICAgICJcMzdcMVwyXDBcNjVcMVwxXDBcN1wxXDFcMFwxXDFcM1wwXDNcMVwxXDAiKwotICAgICJcN1wxXDNcMFw0XDFcMlwwXDZcMVw0XDBcMTVcMVw1XDBcM1wxXDFcMCIrCi0gICAgIlw3XDFcMzIzXDBcMTVcMlw0XDBcMVwyXDEwNFwwXDFcMVwzXDBcMlwxXDJcMCIrCi0gICAgIlwxXDFcMTIxXDBcM1wxXHUwZTgyXDBcMVwyXDFcMFwxXDFcMzFcMFwxMVwxXDZcMiIrCi0gICAgIlwxXDBcNVwyXDEzXDBcMTI0XDFcNFwwXDJcMlwyXDBcMlwyXDJcMFwxMzJcMSIrCi0gICAgIlwxXDBcM1wyXDZcMFw1MFwxXHUxY2QzXDBcdTUxYTZcMVx1MGM1YVwwXHUyYmE0XDFcdTI4NWNcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgW10gWlpfQ01BUCA9IHp6VW5wYWNrQ01hcChaWl9DTUFQX1BBQ0tFRCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIERGQSBzdGF0ZXMgdG8gYWN0aW9uIHN3aXRjaCBsYWJlbHMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfQUNUSU9OID0genpVbnBhY2tBY3Rpb24oKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQUNUSU9OX1BBQ0tFRF8wID0KLSAgICAiXDFcMFwxXDFcMVwyXDFcMyI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrQWN0aW9uKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzRdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrQWN0aW9uKFpaX0FDVElPTl9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tBY3Rpb24oU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyByZXN1bHRbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9ST1dNQVAgPSB6elVucGFja1Jvd01hcCgpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9ST1dNQVBfUEFDS0VEXzAgPQotICAgICJcMFwwXDBcNFwwXDEwXDBcMTQiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja1Jvd01hcCgpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFs0XTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja1Jvd01hcChaWl9ST1dNQVBfUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrUm93TWFwKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBoaWdoID0gcGFja2VkLmNoYXJBdChpKyspIDw8IDE2OwotICAgICAgcmVzdWx0W2orK10gPSBoaWdoIHwgcGFja2VkLmNoYXJBdChpKyspOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0gIC8qKiAKLSAgICogVGhlIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1RSQU5TIFtdID0gewotICAgIDEsIDIsIDEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMywgMiwgCi0gICAgMiwgLTEsIDMsIDMsIDMsIC0xCi0gIH07Ci0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1VOS05PV05fRVJST1IgPSAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfTk9fTUFUQ0ggPSAxOwotLy8gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9QVVNIQkFDS18yQklHID0gMjsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqCi0gICAqIFpaX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9BVFRSSUJVVEUgPSB6elVucGFja0F0dHJpYnV0ZSgpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9BVFRSSUJVVEVfUEFDS0VEXzAgPQotICAgICJcMVwwXDFcMTFcMlwxIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tBdHRyaWJ1dGUoKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbNF07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tBdHRyaWJ1dGUoWlpfQVRUUklCVVRFX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja0F0dHJpYnV0ZShTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgICAgICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIHJlc3VsdFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB6elJlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB6elN0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHp6QnVmZmVyW10gPSBuZXcgY2hhcltaWl9CVUZGRVJTSVpFXTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgenpNYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHp6UHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6ekN1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6elN0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHp6RW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0vLyAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLS8vICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotLy8gIHByaXZhdGUgaW50IHl5Y29sdW1uOwotCi0gIC8qKiAKLSAgICogenpBdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0vLyAgcHJpdmF0ZSBib29sZWFuIHp6QXRCT0wgPSB0cnVlOwotCi0gIC8qKiB6ekF0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGF0IHRoZSBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6QXRFT0Y7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotICAgICAgICBib29sZWFuIHJlc3VsdDsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFhNTDEwTmFtZXMoKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy56elJlYWRlciA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkWE1MMTBOYW1lKFN0cmluZyBzdHJpbmdUb0NoZWNrKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB5eXJlc2V0KG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcihzdHJpbmdUb0NoZWNrKSk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGlzVmFsaWRYTUwxME5hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGltcG9zc2libGUgd2l0aCBzdHJpbmdzLCBidXQgaWYgb2NjdXJzLCBqdXN0IG1lYW5zCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAibm90IgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTDEwTmFtZXMoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnp6UmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUwxME5hbWVzKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10genpVbnBhY2tDTWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDEyMTgpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlZmlsbHMgdGhlIGlucHV0IGJ1ZmZlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgaWZmIHRoZXJlIHdhcyBuZXcgaW5wdXQuCi0gICAqIAotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB6elJlZmlsbCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHp6U3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh6ekJ1ZmZlciwgenpTdGFydFJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgIHp6QnVmZmVyLCAwLAotICAgICAgICAgICAgICAgICAgICAgICB6ekVuZFJlYWQtenpTdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgenpFbmRSZWFkLT0genpTdGFydFJlYWQ7Ci0gICAgICB6ekN1cnJlbnRQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6TWFya2VkUG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6elB1c2hiYWNrUG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6elN0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh6ekN1cnJlbnRQb3MgPj0genpCdWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt6ekN1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHp6QnVmZmVyLmxlbmd0aCk7Ci0gICAgICB6ekJ1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHp6UmVhZGVyLnJlYWQoenpCdWZmZXIsIHp6RW5kUmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenpCdWZmZXIubGVuZ3RoLXp6RW5kUmVhZCk7Ci0KLSAgICBpZiAobnVtUmVhZCA8IDApIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHp6RW5kUmVhZCs9IG51bVJlYWQ7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLS8vICBwcml2YXRlIGZpbmFsIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLS8vICAgIHp6QXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0vLyAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0vLwotLy8gICAgaWYgKHp6UmVhZGVyICE9IG51bGwpCi0vLyAgICAgIHp6UmVhZGVyLmNsb3NlKCk7Ci0vLyAgfQotCi0KLSAgLyoqCi0gICAqIFJlc2V0cyB0aGUgc2Nhbm5lciB0byByZWFkIGZyb20gYSBuZXcgaW5wdXQgc3RyZWFtLgotICAgKiBEb2VzIG5vdCBjbG9zZSB0aGUgb2xkIHJlYWRlci4KLSAgICoKLSAgICogQWxsIGludGVybmFsIHZhcmlhYmxlcyBhcmUgcmVzZXQsIHRoZSBvbGQgaW5wdXQgc3RyZWFtIAotICAgKiA8Yj5jYW5ub3Q8L2I+IGJlIHJldXNlZCAoaW50ZXJuYWwgYnVmZmVyIGlzIGRpc2NhcmRlZCBhbmQgbG9zdCkuCi0gICAqIExleGljYWwgc3RhdGUgaXMgc2V0IHRvIDx0dD5aWl9JTklUSUFMPC90dD4uCi0gICAqCi0gICAqIEBwYXJhbSByZWFkZXIgICB0aGUgbmV3IGlucHV0IHN0cmVhbSAKLSAgICovCi0gIHByaXZhdGUgZmluYWwgdm9pZCB5eXJlc2V0KGphdmEuaW8uUmVhZGVyIHJlYWRlcikgewotICAgIHp6UmVhZGVyID0gcmVhZGVyOwotLy8gICAgenpBdEJPTCAgPSB0cnVlOwotICAgIHp6QXRFT0YgID0gZmFsc2U7Ci0gICAgenpFbmRSZWFkID0genpTdGFydFJlYWQgPSAwOwotICAgIHp6Q3VycmVudFBvcyA9IHp6TWFya2VkUG9zID0genpQdXNoYmFja1BvcyA9IDA7Ci0vLyAgICB5eWxpbmUgPSB5eWNoYXIgPSB5eWNvbHVtbiA9IDA7Ci0gICAgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotLy8gIHByaXZhdGUgZmluYWwgaW50IHl5c3RhdGUoKSB7Ci0vLyAgICByZXR1cm4genpMZXhpY2FsU3RhdGU7Ci0vLyAgfQotCi0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0vLyAgcHJpdmF0ZSBmaW5hbCB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0vLyAgICB6ekxleGljYWxTdGF0ZSA9IG5ld1N0YXRlOwotLy8gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLS8vICBwcml2YXRlIGZpbmFsIFN0cmluZyB5eXRleHQoKSB7Ci0vLyAgICByZXR1cm4gbmV3IFN0cmluZyggenpCdWZmZXIsIHp6U3RhcnRSZWFkLCB6ek1hcmtlZFBvcy16elN0YXJ0UmVhZCApOwotLy8gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gPHR0PnBvczwvdHQ+IGZyb20gdGhlIAotICAgKiBtYXRjaGVkIHRleHQuIAotICAgKiAKLSAgICogSXQgaXMgZXF1aXZhbGVudCB0byB5eXRleHQoKS5jaGFyQXQocG9zKSwgYnV0IGZhc3RlcgotICAgKgotICAgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIHRvIGZldGNoLiAKLSAgICogICAgICAgICAgICBBIHZhbHVlIGZyb20gMCB0byB5eWxlbmd0aCgpLTEuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiBwb3MKLSAgICovCi0vLyAgcHJpdmF0ZSBmaW5hbCBjaGFyIHl5Y2hhcmF0KGludCBwb3MpIHsKLS8vICAgIHJldHVybiB6ekJ1ZmZlclt6elN0YXJ0UmVhZCtwb3NdOwotLy8gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotLy8gIHByaXZhdGUgZmluYWwgaW50IHl5bGVuZ3RoKCkgewotLy8gICAgcmV0dXJuIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkOwotLy8gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogSW4gYSB3ZWxsZm9ybWVkIHNjYW5uZXIgKG5vIG9yIG9ubHkgY29ycmVjdCB1c2FnZSBvZiAKLSAgICogeXlwdXNoYmFjayhpbnQpIGFuZCBhIG1hdGNoLWFsbCBmYWxsYmFjayBydWxlKSB0aGlzIG1ldGhvZCAKLSAgICogd2lsbCBvbmx5IGJlIGNhbGxlZCB3aXRoIHRoaW5ncyB0aGF0ICJDYW4ndCBQb3NzaWJseSBIYXBwZW4iLgotICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHNvbWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcKLSAgICogKGUuZy4gYSBKRmxleCBidWcgcHJvZHVjaW5nIGEgZmF1bHR5IHNjYW5uZXIgZXRjLikuCi0gICAqCi0gICAqIFVzdWFsIHN5bnRheC9zY2FubmVyIGxldmVsIGVycm9yIGhhbmRsaW5nIHNob3VsZCBiZSBkb25lCi0gICAqIGluIGVycm9yIGZhbGxiYWNrIHJ1bGVzLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHp6U2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICB0cnkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1tlcnJvckNvZGVdOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbWlpfVU5LTk9XTl9FUlJPUl07Ci0gICAgfQotCi0gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0vLyAgcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgIHsKLS8vICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0vLyAgICAgIHp6U2NhbkVycm9yKFpaX1BVU0hCQUNLXzJCSUcpOwotLy8KLS8vICAgIHp6TWFya2VkUG9zIC09IG51bWJlcjsKLS8vICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFhNTDEwTmFtZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgenpJbnB1dDsKLSAgICBpbnQgenpBY3Rpb247Ci0KLSAgICAvLyBjYWNoZWQgZmllbGRzOgotICAgIGludCB6ekN1cnJlbnRQb3NMOwotICAgIGludCB6ek1hcmtlZFBvc0w7Ci0gICAgaW50IHp6RW5kUmVhZEwgPSB6ekVuZFJlYWQ7Ci0gICAgY2hhciBbXSB6ekJ1ZmZlckwgPSB6ekJ1ZmZlcjsKLSAgICBjaGFyIFtdIHp6Q01hcEwgPSBaWl9DTUFQOwotCi0gICAgaW50IFtdIHp6VHJhbnNMID0gWlpfVFJBTlM7Ci0gICAgaW50IFtdIHp6Um93TWFwTCA9IFpaX1JPV01BUDsKLSAgICBpbnQgW10genpBdHRyTCA9IFpaX0FUVFJJQlVURTsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLQotICAgICAgenpBY3Rpb24gPSAtMTsKLQotICAgICAgenpDdXJyZW50UG9zTCA9IHp6Q3VycmVudFBvcyA9IHp6U3RhcnRSZWFkID0genpNYXJrZWRQb3NMOwotICAKLSAgICAgIHp6U3RhdGUgPSB6ekxleGljYWxTdGF0ZTsKLQotCi0gICAgICB6ekZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgIAotICAgICAgICAgIGlmICh6ekN1cnJlbnRQb3NMIDwgenpFbmRSZWFkTCkKLSAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICBlbHNlIGlmICh6ekF0RU9GKSB7Ci0gICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbnMKLSAgICAgICAgICAgIHp6Q3VycmVudFBvcyAgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgenpNYXJrZWRQb3MgICA9IHp6TWFya2VkUG9zTDsKLSAgICAgICAgICAgIGJvb2xlYW4gZW9mID0genpSZWZpbGwoKTsKLSAgICAgICAgICAgIC8vIGdldCB0cmFuc2xhdGVkIHBvc2l0aW9ucyBhbmQgcG9zc2libHkgbmV3IGJ1ZmZlcgotICAgICAgICAgICAgenpDdXJyZW50UG9zTCAgPSB6ekN1cnJlbnRQb3M7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgICA9IHp6TWFya2VkUG9zOwotICAgICAgICAgICAgenpCdWZmZXJMICAgICAgPSB6ekJ1ZmZlcjsKLSAgICAgICAgICAgIHp6RW5kUmVhZEwgICAgID0genpFbmRSZWFkOwotICAgICAgICAgICAgaWYgKGVvZikgewotICAgICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICAgIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaW50IHp6TmV4dCA9IHp6VHJhbnNMWyB6elJvd01hcExbenpTdGF0ZV0gKyB6ekNNYXBMW3p6SW5wdXRdIF07Ci0gICAgICAgICAgaWYgKHp6TmV4dCA9PSAtMSkgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgenpTdGF0ZSA9IHp6TmV4dDsKLQotICAgICAgICAgIGludCB6ekF0dHJpYnV0ZXMgPSB6ekF0dHJMW3p6U3RhdGVdOwotICAgICAgICAgIGlmICggKHp6QXR0cmlidXRlcyAmIDEpID09IDEgKSB7Ci0gICAgICAgICAgICB6ekFjdGlvbiA9IHp6U3RhdGU7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgaWYgKCAoenpBdHRyaWJ1dGVzICYgOCkgPT0gOCApIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9uCi0gICAgICB6ek1hcmtlZFBvcyA9IHp6TWFya2VkUG9zTDsKLQotICAgICAgc3dpdGNoICh6ekFjdGlvbiA8IDAgPyB6ekFjdGlvbiA6IFpaX0FDVElPTlt6ekFjdGlvbl0pIHsKLSAgICAgICAgY2FzZSAxOiAKLSAgICAgICAgICB7IHJldHVybiBmYWxzZTsgLyogbWF0Y2hlZCB3aWxkICovCi0gICAgICAgICAgfQotICAgICAgICBjYXNlIDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDI6IAotICAgICAgICAgIHsgcmV0dXJuIHRydWU7IC8qIGV4YWN0IG5hbWUgKi8KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzogCi0gICAgICAgICAgeyByZXR1cm4gZmFsc2U7IC8qIG1vcmUgdGhhbiBuYW1lICovCi0gICAgICAgICAgfQotICAgICAgICBjYXNlIDY6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoenpJbnB1dCA9PSBZWUVPRiAmJiB6elN0YXJ0UmVhZCA9PSB6ekN1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHp6QXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgICB7IHtyZXR1cm4gZmFsc2U7IC8qIGhpdCBlbmQgd2l0aCBubyBtYXRjaCAqL30gfQotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB6elNjYW5FcnJvcihaWl9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFNvdXJjZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU291cmNlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZGE4MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU291cmNlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVGFnUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQ2hhclNlcXVlbmNlUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LklSZWdpb25Db21wYXJpYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi0vKioKLSAqIFRha2VzIGlucHV0IGZyb20gdGhlIEhUTUxUb2tlbml6ZXIgYW5kIGNyZWF0ZXMgYSB0YWcgbGlzdAotICovCi0KLXB1YmxpYyBjbGFzcyBYTUxTb3VyY2VQYXJzZXIgaW1wbGVtZW50cyBSZWdpb25QYXJzZXIsIEJsb2NrVGFnUGFyc2VyLCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIsIElSZWdpb25Db21wYXJpYmxlLCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXJFeHRlbnNpb24gewotCS8vIG1hZGUgcHVibGljIHRvIGFpZCBhY2Nlc3MgZnJvbSBpbm5lciBjbGFzc2VzIGluIGhpZXJhcmNoeS4KLQkvLyBUT0RPOiBpbiBmdXR1cmUsIGZpZ3VyZSBvdXQgaG93IHRvIHNvbHZlIHdpdGhvdXQgZXhwb3NpbmcgZGF0YS4KLQlwdWJsaWMgQ2hhclNlcXVlbmNlIGZDaGFyU2VxdWVuY2VTb3VyY2UgPSBudWxsOwotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudElucHV0OwotCXByb3RlY3RlZCBpbnQgZk9mZnNldCA9IDA7Ci0JLy8gRE1XOiAyLzEyLzAzLiBSZW1vdmVkIHNvbWUgc3RhdGUgZGF0YSwgc2luY2Ugbm90IHJlYWxseSBuZWVkZWQsCi0JLy8gYW5kIHNpbmNlIGl0IGFkZGVkIGEgbG90IHRvIG92ZXJoZWFkIChzaW5jZSBzbyBtYW55IHJlZ2lvbnMgYXJlCi0JLy8gY3JlYXRlZC4KLQkvLyBwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmQ3VycmVudE5vZGUgPSBudWxsOwotCS8vIHByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZOb2RlcyA9IG51bGw7Ci0JLy8gcHJvdGVjdGVkIExpc3QgZlJlZ2lvbnMgPSBudWxsOwotCS8vIHByb3RlY3RlZCBPYmplY3QgZklucHV0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZTdHJpbmdJbnB1dCA9IG51bGw7Ci0JcHJvdGVjdGVkIExpc3QgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzOwotCi0JcHJvdGVjdGVkIEJsb2NrVG9rZW5pemVyIGZUb2tlbml6ZXIgPSBudWxsOwotCXByb3RlY3RlZCBsb25nIHN0YXJ0VGltZTsKLQlwcm90ZWN0ZWQgbG9uZyBzdG9wVGltZTsKLQotCS8qKgotCSAqIEhUTUxTb3VyY2VQYXJzZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWE1MU291cmNlUGFyc2VyKCkgewotCQlzdXBlcigpOwotCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBhIHNpbXBsZSB1dGlsaXR5IHRvIGNvdW50IG5vZGVzLiBVc2VkIG9ubHkgZm9yIGRlYnVnCi0JICogc3RhdGVtZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IF9jb3VudE5vZGVzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZXMpIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY291bnROb2RlID0gbm9kZXM7Ci0JCXdoaWxlIChjb3VudE5vZGUgIT0gbnVsbCkgewotCQkJcmVzdWx0Kys7Ci0JCQljb3VudE5vZGUgPSBjb3VudE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JCWdldFRva2VuaXplcigpLmFkZEJsb2NrTWFya2VyKG1hcmtlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIGhhbmRsZXIpIHsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyA9PSBudWxsKQotCQkJZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMuYWRkKGhhbmRsZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luQmxvY2tTY2FuKFN0cmluZyBuZXdUYWdOYW1lKSB7Ci0JCWdldFRva2VuaXplcigpLmJlZ2luQmxvY2tUYWdTY2FuKG5ld1RhZ05hbWUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqLwotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihTdHJpbmcgdHlwZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05vZGUgPSBudWxsOwotCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpCi0JCQluZXdOb2RlID0gWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuY3JlYXRlUmVnaW9uKFhNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5LlhNTF9CTE9DSyk7Ci0JCWVsc2UKLQkJCW5ld05vZGUgPSBYTUxTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5jcmVhdGVSZWdpb24oWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuWE1MKTsKLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZU5vZGVQYXJzZWQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmQ3VycmVudE5vZGUpIHsKLQkJLyoKLQkJICogTmV2ZXIgbGV0IGFuIEV4Y2VwdGlvbnMgZnJvbSBmb3JlaWduIGNvZGUgaW50ZXJmZXJlIHdpdGggY29tcGxldGlvbgotCQkgKiBvZiBwYXJzaW5nLiBUbyBnZXQgYW4gZXhjZXB0aW9uIGhlcmUgaXMgZGVmaW5pdGVseSBhIHByb2dyYW0gZXJyb3IKLQkJICogc29tZXdoZXJlLCBidXQgd2UgY2FuJ3QgYWZmb3JkIHRvIGludGVycnVwdCB0aGUgZmxvdyBvZiBjb250cm9sLiBvcgotCQkgKiBiYWNrd2FyZHMgdHlwaW5nIGNhbiByZXN1bHQhCi0JCSAqIAotCQkgKiBQcm90ZWN0IHRoZSB1c2VyJ3MgZGF0YSBhYm92ZSBldmVyeXRoaW5nLgotCQkgKi8KLQkJdHJ5IHsKLQkJCWlmIChmQ3VycmVudE5vZGUgIT0gbnVsbCAmJiBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCSgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcikgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzLmdldChpKSkubm9kZVBhcnNlZChmQ3VycmVudE5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiRXJyb3Igb2NjdXJyZWQgd2hpbGUgZmlyaW5nIE5vZGUgUGFyc2VkIGV2ZW50IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBCbG9ja01hcmtlciBnZXRCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgewotCQlMaXN0IG1hcmtlcnMgPSBnZXRUb2tlbml6ZXIoKS5nZXRCbG9ja01hcmtlcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpIG1hcmtlcnMuZ2V0KGkpOwotCQkJaWYgKG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJCWlmIChtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWdOYW1lKSkKLQkJCQkJcmV0dXJuIG1hcmtlcjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSkpCi0JCQkJCXJldHVybiBtYXJrZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QmxvY2tNYXJrZXJzKCkgewotCQlyZXR1cm4gZ2V0VG9rZW5pemVyKCkuZ2V0QmxvY2tNYXJrZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RG9jdW1lbnRSZWdpb25zKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWRub2RlID0gbnVsbDsKLQkJaWYgKGhlYWRub2RlID09IG51bGwpIHsKLQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCkgewotCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQkJaGVhZG5vZGUgPSBwYXJzZU5vZGVzKCk7Ci0JCQlpZiAoRGVidWcucGVyZlRlc3QpIHsKLQkJCQlzdG9wVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIC0tIGNyZWF0aW5nIG5vZGVzIG9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQgLS0gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiBUaW1lIHBhcnNlIGFuZCBpbml0IGFsbCByZWdpb25zOiAiICsgKHN0b3BUaW1lIC0gc3RhcnRUaW1lKSArICIgKG1zZWNzKSIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGZvciAiICsgZlJlZ2lvbnMuc2l6ZSgpICsgIgotCQkJCS8vIFJlZ2lvbnMiKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgYW5kICIgKyBfY291bnROb2RlcyhoZWFkbm9kZSkgKyAiIE5vZGVzIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGhlYWRub2RlOwotCX0KLQotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiBnZXROZXh0UmVnaW9uKCkgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQl0cnkgewotCQkJcmVnaW9uID0gZ2V0VG9rZW5pemVyKCkuZ2V0TmV4dFRva2VuKCk7Ci0JCQkvLyBETVc6IDIvMTIvMDMgUmVtb3ZlZCBzdGF0ZQotCQkJLy8gaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBmUmVnaW9ucy5hZGQocmVnaW9uKTsKLQkJCS8vIH0KLQkJCXJldHVybiByZWdpb247Ci0JCX0KLQkJY2F0Y2ggKFN0YWNrT3ZlcmZsb3dFcnJvciBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogaW5wdXQgY291bGQgbm90IGJlIHBhcnNlZCBjb3JyZWN0bHkgYXQgcG9zaXRpb24gIiArIGdldFRva2VuaXplcigpLmdldE9mZnNldCgpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgZTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiBpbnB1dCBjb3VsZCBub3QgYmUgcGFyc2VkIGNvcnJlY3RseSBhdCBwb3NpdGlvbiAiICsgZ2V0VG9rZW5pemVyKCkuZ2V0T2Zmc2V0KCkgKyAiICgiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkgKyAiKSIsIGUpOyAvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGwgbGlzdCBvZiBrbm93biByZWdpb25zLiBUeXBpY2FsbHkgZ2V0Tm9kZXMgc2hvdWxkIGJlCi0JICogdXNlZCBpbnN0ZWFkIG9mIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUgPSBudWxsOwotCQlpZiAoIWdldFRva2VuaXplcigpLmlzRU9GKCkpIHsKLQkJCWhlYWROb2RlID0gZ2V0RG9jdW1lbnRSZWdpb25zKCk7Ci0JCQkvLyB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwYXJzaW5nIGhhcyBub3QgZmluaXNoZWQiKTsKLQkJfQotCQkvLyBmb3IgbWVtb3J5IHJlY292ZXJ5LCB3ZSBhc3N1bWUgaWYgc29tZW9uZQotCQkvLyByZXF1ZXN0cyBhbGwgcmVnaW9ucywgd2UgY2FuIHJlc2V0IG91ciBiaWcKLQkJLy8gbWVtb3J5IGNvbnN1bWluZyBvYmplY3RzCi0JCS8vIGJ1dCB0aGUgbmV3ICJnZXRSZWdpb25zIiBtZXRob2QgaXMgdGhlbiBtb3JlIGV4cGVuc2l2ZS4KLQkJLy8gSSBkb24ndCB0aGluayBpdHMgdXNlZCBtdWNoLCB0aG91Z2guCi0JCUxpc3QgbG9jYWxSZWdpb25zTGlzdCA9IGdldFJlZ2lvbnMoaGVhZE5vZGUpOwotCQlwcmltUmVzZXQoKTsKLQkJcmV0dXJuIGxvY2FsUmVnaW9uc0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldFJlZ2lvbnMuCi0JICogCi0JICogQHBhcmFtIGhlYWROb2RlCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlKSB7Ci0JCUxpc3QgYWxsUmVnaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSA9IGhlYWROb2RlOwotCQl3aGlsZSAoY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zID0gY3VycmVudE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlUmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCWFsbFJlZ2lvbnMuYWRkKG5vZGVSZWdpb25zLmdldChpKSk7Ci0JCQl9Ci0JCQljdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gYWxsUmVnaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSB0aGUgYWRkL3JlbW92ZSBtZXRob2RzIGluc3RlYWQKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMoKSB7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgPT0gbnVsbCkgewotCQkJZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJfQotCQlyZXR1cm4gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGV4dCBmcm9tIHRoZSBjdXJyZW50IGlucHV0LiBUZXh0IGlzIG9ubHkgdmFsaWQgYmVmb3JlCi0JICogZ2V0Tm9kZXMoKSBoYXMgYmVlbiBjYWxsZWQgYW5kIG9ubHkgd2hlbiBhIHJhdyBTdHJpbmcgb3IgRG9jdW1lbnRSZWFkZXIKLQkgKiBpcyBnaXZlbiBhcyB0aGUgaW5wdXQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZkNoYXJTZXF1ZW5jZVNvdXJjZSAhPSBudWxsKSB7Ci0JCQlpbnQgc3RhcnQgPSBmT2Zmc2V0ICsgb2Zmc2V0OwotCQkJaW50IGVuZCA9IHN0YXJ0ICsgbGVuZ3RoOwotCQkJdGV4dCA9IGZDaGFyU2VxdWVuY2VTb3VyY2Uuc3ViU2VxdWVuY2Uoc3RhcnQsIGVuZCkudG9TdHJpbmcoKTsKLQkJfQotCQllbHNlIGlmIChmRG9jdW1lbnRJbnB1dCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXRleHQgPSBmRG9jdW1lbnRJbnB1dC5nZXQob2Zmc2V0LCBsZW5ndGgpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQl0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChmU3RyaW5nSW5wdXQgPT0gbnVsbCB8fCBmU3RyaW5nSW5wdXQubGVuZ3RoKCkgPT0gMCB8fCBvZmZzZXQgKyBsZW5ndGggPiBmU3RyaW5nSW5wdXQubGVuZ3RoKCkgfHwgb2Zmc2V0IDwgMCkgewotCQkJCXRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gb2Zmc2V0IGlzIGVudGlyZWx5IHZhbGlkIGR1cmluZyBwYXJzaW5nIGFzIHRoZSBwYXJzZQotCQkJCS8vIG51bWJlcnMgaGF2ZW4ndCBiZWVuIGFkanVzdGVkLgotCQkJCXRleHQgPSBmU3RyaW5nSW5wdXQuc3Vic3RyaW5nKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQmxvY2tUb2tlbml6ZXIgZ2V0VG9rZW5pemVyKCkgewotCQlpZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCQlmVG9rZW5pemVyID0gbmV3IFhNTFRva2VuaXplcigpOwotCQl9Ci0JCXJldHVybiBmVG9rZW5pemVyOwotCX0KLQotCi0JcHVibGljIFJlZ2lvblBhcnNlciBuZXdJbnN0YW5jZSgpIHsKLQkJWE1MU291cmNlUGFyc2VyIG5ld0luc3RhbmNlID0gbmV3IFhNTFNvdXJjZVBhcnNlcigpOwotCQluZXdJbnN0YW5jZS5zZXRUb2tlbml6ZXIoZ2V0VG9rZW5pemVyKCkubmV3SW5zdGFuY2UoKSk7Ci0JCXJldHVybiBuZXdJbnN0YW5jZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJzZU5vZGVzKCkgewotCQkvLyByZWdpb25zIGFyZSBpbml0aWFsbHkgcmVwb3J0ZWQgYXMgY29tcGxldGUgb2Zmc2V0cyB3aXRoaW4gdGhlCi0JCS8vIHNjYW5uZWQgaW5wdXQKLQkJLy8gdGhleSBhcmUgYWRqdXN0ZWQgaGVyZSB0byBiZSBpbmRleGVzIGZyb20gdGhlIGN1cnJlbnROb2RlJ3Mgc3RhcnQKLQkJLy8gb2Zmc2V0Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gbnVsbDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSA9IG51bGw7Ci0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQotCQl3aGlsZSAoKHJlZ2lvbiA9IGdldE5leHRSZWdpb24oKSkgIT0gbnVsbCkgewotCQkJdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkvLyB0aGVzZSB0eXBlcyAobWlnaHQpIGRlbWFuZCBhIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm9yIGVhY2gKLQkJCS8vIG9mIHRoZW0KLQkJCWlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsICYmIGN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQkJCS8vIG11bHRpcGxlIGJsb2NrIHRleHRzIGluZGljYXRlZCBlbWJlZGRlZCBjb250YWluZXJzOyBubwotCQkJCQkvLyBuZXcgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCS8vIERXIDQvMTYvMjAwMyByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBub3QgY29udGludWluZyBhIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQkJCS8vIGVuc3VyZSB0aGF0IGFueSBleGlzdGluZyBub2RlIGlzIGF0IGxlYXN0Ci0JCQkJCQkvLyB0ZXJtaW5hdGVkCi0JCQkJCQlpZiAoIWN1cnJlbnROb2RlLmlzRW5kZWQoKSkgewotCQkJCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkJCS8vIGZDdXJyZW50Tm9kZS5zZXRUZXh0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpIC0KLQkJCQkJCQkvLyBmQ3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlsYXN0Tm9kZSA9IGN1cnJlbnROb2RlOwotCQkJCQl9Ci0JCQkJCWZpcmVOb2RlUGFyc2VkKGN1cnJlbnROb2RlKTsKLQkJCQkJY3VycmVudE5vZGUgPSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odHlwZSk7Ci0JCQkJCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlsYXN0Tm9kZS5zZXROZXh0KGN1cnJlbnROb2RlKTsKLQkJCQkJfQotCQkJCQljdXJyZW50Tm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldFN0YXJ0KHJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQkJLy8gRFcgNC8xNi8yMDAzIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyB0aGUgZm9sbG93aW5nIGNvbnRleHRzIE9QRU4gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMKLQkJCWVsc2UgaWYgKChjdXJyZW50Tm9kZSAhPSBudWxsICYmIGN1cnJlbnROb2RlLmlzRW5kZWQoKSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fT1BFTikpIHsKLQkJCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCQkvLyBlbnN1cmUgdGhhdCBhbnkgZXhpc3Rpbmcgbm9kZSBpcyBhdCBsZWFzdCB0ZXJtaW5hdGVkCi0JCQkJCWlmICghY3VycmVudE5vZGUuaXNFbmRlZCgpKSB7Ci0JCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJCS8vIGZDdXJyZW50Tm9kZS5zZXRUZXh0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpIC0KLQkJCQkJCS8vIGZDdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJfQotCQkJCQlsYXN0Tm9kZSA9IGN1cnJlbnROb2RlOwotCQkJCX0KLQkJCQlmaXJlTm9kZVBhcnNlZChjdXJyZW50Tm9kZSk7Ci0JCQkJY3VycmVudE5vZGUgPSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odHlwZSk7Ci0JCQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCQkJbGFzdE5vZGUuc2V0TmV4dChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJCWN1cnJlbnROb2RlLnNldFByZXZpb3VzKGxhc3ROb2RlKTsKLQkJCQljdXJyZW50Tm9kZS5zZXRTdGFydChyZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQl9Ci0JCQkvLyB0aGUgZm9sbG93aW5nIGNvbnRleHRzIG5laXRoZXIgb3BlbiBub3IgY2xvc2UKLQkJCS8vIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnM7IGp1c3QgYWRkIHRvIHRoZW0KLQkJCWVsc2UgaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NPTlRFTlQpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUKSkgewotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcgNC8xNi8yMDAzIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJfQotCQkJLy8gdGhlIGZvbGxvd2luZyBjb250ZXh0cyBjbG9zZSBvZmYgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCQkJLy8gY2xlYW5seQotCQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0UpKSB7Ci0JCQkJY3VycmVudE5vZGUuc2V0RW5kZWQodHJ1ZSk7Ci0JCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQl9Ci0JCQkvLyB0aGlzIGlzIGV4dHJlbWVseSByYXJlLCBidXQgdmFsaWQKLQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRSkgewotCQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSBjdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCk7Ci0JCQkJLy8gcGFjayB0aGUgZW1iZWRkZWQgY29udGFpbmVyIHdpdGggdGhpcyByZWdpb24KLQkJCQlpZiAobGFzdFJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCUlUZXh0UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgbGFzdFJlZ2lvbjsKLQkJCQkJY29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQocmVnaW9uKTsKLQkJCQkJLy8gY29udGFpbmVycyBtdXN0IGhhdmUgcGFyZW50IHNldCAuLi4KLQkJCQkJLy8gc2V0dGluZyBmb3IgRUFDSCBzdWJyZWdpb24gaXMgcmVkdW5kZW50LCBidXQgbm90IHN1cmUKLQkJCQkJLy8gd2hlcmUgZWxzZSB0byBkbywgc28gd2lsbCBkbyBoZXJlIGZvciBub3cuCi0JCQkJCWNvbnRhaW5lci5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY29udGFpbmVyKTsKLQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KGNvbnRhaW5lci5nZXRMZW5ndGgoKSAtIHJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCQl9Ci0JCQkJY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpLmFkanVzdExlbmd0aChyZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWN1cnJlbnROb2RlLmFkanVzdExlbmd0aChyZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCAmJiBjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJLy8gc2tpcCBvbiBhIHZlcnktZmlyc3QgcmVnaW9uIHNpdHVhdGlvbiBhcyB0aGUgZGVmYXVsdAotCQkJCS8vIGJlaGF2aW9yIGlzIGdvb2QgZW5vdWdoCi0JCQkJLy8gY29tYmluZSB3aXRoIHByZXZpb3VzIGlmIGFsc28gdW5kZWZpbmVkCi0JCQkJaWYgKGN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKSAhPSBudWxsICYmIGN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQpIHsKLQkJCQkJY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpLmFkanVzdExlbmd0aChyZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQljdXJyZW50Tm9kZS5hZGp1c3RMZW5ndGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQl9Ci0JCQkJLy8gcHJldmlvdXMgd2Fzbid0IHVuZGVmaW5lZAotCQkJCWVsc2UgewotCQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gaWYgYW4gdW5rbm93biB0eXBlIGlzIHRoZSBmaXJzdCByZWdpb24gaW4gdGhlIGRvY3VtZW50LAotCQkJCS8vIGVuc3VyZSB0aGF0IGEgbm9kZSBleGlzdHMKLQkJCQlpZiAoY3VycmVudE5vZGUgPT0gbnVsbCkgewotCQkJCQljdXJyZW50Tm9kZSA9IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0eXBlKTsKLQkJCQkJY3VycmVudE5vZGUuc2V0U3RhcnQocmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJCX0KLQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCS8vIERXIDQvMTYvMjAwMyByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZm91bmQgcmVnaW9uIG9mIG5vdCBzcGVjaWZpY2FsbHkgaGFuZGxlZCB0eXBlICIgKyByZWdpb24uZ2V0VHlwZSgpICsgIiBAICIgKyByZWdpb24uZ2V0U3RhcnQoKSArICJbIiArIHJlZ2lvbi5nZXRMZW5ndGgoKSArICJdIik7IC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJLy8gdGhlc2UgcmVnaW9ucyBhbHNvIGdldCB0aGVpciBvd24gbm9kZSwgc28gY2xvc2UgdGhlbSBjbGVhbmx5Ci0JCQkvLyBOT1RFOiB0aGVzZSByZWdpb25zIGhhdmUgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgY3JlYXRlZAotCQkJLy8gZm9yIHRoZW0gYWJvdmU7IGl0IG1heQotCQkJLy8gYmUgbW9yZSByZWFkYWJsZSBpZiB0aGF0IGlzIGhhbmRsZWQgaGVyZSBhcyB3ZWxsLCBidXQgdGhlCi0JCQkvLyBjdXJyZW50IGxheW91dAotCQkJLy8gZW5zdXJlcyB0aGF0IHRoZXkgb3BlbiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIHRoZSBzYW1lIHdheQotCQkJaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFKSkgewotCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJfQotCQkJaWYgKGhlYWROb2RlID09IG51bGwgJiYgY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCWhlYWROb2RlID0gY3VycmVudE5vZGU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCWZpcmVOb2RlUGFyc2VkKGN1cnJlbnROb2RlKTsKLQkJCWN1cnJlbnROb2RlLnNldFByZXZpb3VzKGxhc3ROb2RlKTsKLQkJfQotCQkvLyBmU3RyaW5nSW5wdXQgPSBudWxsOwotCQlwcmltUmVzZXQoKTsKLQkJcmV0dXJuIGhlYWROb2RlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1SZXNldCgpIHsKLQkJLy8gZk5vZGVzID0gbnVsbDsKLQkJLy8gZlJlZ2lvbnMgPSBudWxsOwotCQkvLyBmSW5wdXQgPSBudWxsOwotCQlmU3RyaW5nSW5wdXQgPSBudWxsOwotCQlmQ2hhclNlcXVlbmNlU291cmNlID0gbnVsbDsKLQkJZkRvY3VtZW50SW5wdXQgPSBudWxsOwotCQlmT2Zmc2V0ID0gMDsKLQkJLy8gZkN1cnJlbnROb2RlID0gbnVsbDsKLQkJLy8gRE1XOiBhbHNvIHJlc2V0IHRva2VuaXplciBzbyBpdCBkb2Vzbid0IGhvbGQgb24KLQkJLy8gdG8gbGFyZ2UgYXJyYXlzCi0JCWdldFRva2VuaXplcigpLnJlc2V0KG5ldyBjaGFyWzBdKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LklSZWdpb25Db21wYXJpYmxlI3JlZ2lvbk1hdGNoZXMoaW50LAotCSAqICAgICAgaW50LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZ2lvbk1hdGNoZXMoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQkvLyBieSBkZWZpbml0aW9uCi0JCWlmIChzdHJpbmdUb0NvbXBhcmUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZkNoYXJTZXF1ZW5jZVNvdXJjZSAhPSBudWxsICYmIGZDaGFyU2VxdWVuY2VTb3VyY2UgaW5zdGFuY2VvZiBJUmVnaW9uQ29tcGFyaWJsZSkgewotCQkJcmVzdWx0ID0gKChJUmVnaW9uQ29tcGFyaWJsZSkgZkNoYXJTZXF1ZW5jZVNvdXJjZSkucmVnaW9uTWF0Y2hlcyhvZmZzZXQsIGxlbmd0aCwgc3RyaW5nVG9Db21wYXJlKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIG9sZCBmYXNoaW9uZWQgd2F5cwotCQkJU3RyaW5nIHRlc3QgPSBudWxsOwotCQkJaWYgKGZDaGFyU2VxdWVuY2VTb3VyY2UgIT0gbnVsbCkgewotCQkJCXRlc3QgPSBmQ2hhclNlcXVlbmNlU291cmNlLnN1YlNlcXVlbmNlKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKS50b1N0cmluZygpOwotCQkJfQotCQkJZWxzZSBpZiAoZlN0cmluZ0lucHV0ICE9IG51bGwpIHsKLQkJCQl0ZXN0ID0gZlN0cmluZ0lucHV0LnN1YnN0cmluZyhvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7Ci0JCQl9Ci0JCQlyZXN1bHQgPSBzdHJpbmdUb0NvbXBhcmUuZXF1YWxzKHRlc3QpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQkvLyBieSBkZWZpbml0aW9uCi0JCWlmIChzdHJpbmdUb0NvbXBhcmUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZkNoYXJTZXF1ZW5jZVNvdXJjZSAhPSBudWxsICYmIGZDaGFyU2VxdWVuY2VTb3VyY2UgaW5zdGFuY2VvZiBJUmVnaW9uQ29tcGFyaWJsZSkgewotCQkJcmVzdWx0ID0gKChJUmVnaW9uQ29tcGFyaWJsZSkgZkNoYXJTZXF1ZW5jZVNvdXJjZSkucmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2Uob2Zmc2V0LCBsZW5ndGgsIHN0cmluZ1RvQ29tcGFyZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBvbGQgZmFzaGlvbmVkIHdheXMKLQkJCVN0cmluZyB0ZXN0ID0gbnVsbDsKLQkJCWlmIChmQ2hhclNlcXVlbmNlU291cmNlICE9IG51bGwpIHsKLQkJCQl0ZXN0ID0gZkNoYXJTZXF1ZW5jZVNvdXJjZS5zdWJTZXF1ZW5jZShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZTdHJpbmdJbnB1dCAhPSBudWxsKSB7Ci0JCQkJdGVzdCA9IGZTdHJpbmdJbnB1dC5zdWJzdHJpbmcob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpOwotCQkJfQotCQkJcmVzdWx0ID0gc3RyaW5nVG9Db21wYXJlLmVxdWFsc0lnbm9yZUNhc2UodGVzdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQkJZ2V0VG9rZW5pemVyKCkucmVtb3ZlQmxvY2tNYXJrZXIobWFya2VyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgewotCQlnZXRUb2tlbml6ZXIoKS5yZW1vdmVCbG9ja01hcmtlcih0YWdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgaGFuZGxlcikgewotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMuY29udGFpbnMoaGFuZGxlcikpCi0JCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMucmVtb3ZlKGhhbmRsZXIpOwotCX0KLQotCS8qKgotCSAqIFJlc2V0cyB0aGUgaW5wdXQuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5GaWxlSW5wdXRTdHJlYW0gaW5zdHJlYW0pIHsKLQkJcHJpbVJlc2V0KCk7Ci0JCS8vIGZJbnB1dCA9IGluc3RyZWFtOwotCQlnZXRUb2tlbml6ZXIoKS5yZXNldChpbnN0cmVhbSk7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIHRoZSBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciByZWFkZXIpIHsKLQkJcmVzZXQocmVhZGVyLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldHMgdGhlIGlucHV0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIHJlYWRlciwgaW50IHBvc2l0aW9uKSB7Ci0JCXByaW1SZXNldCgpOwotCQlmT2Zmc2V0ID0gcG9zaXRpb247Ci0JCWdldFRva2VuaXplcigpLnJlc2V0KHJlYWRlciwgcG9zaXRpb24pOwotCQlpZiAocmVhZGVyIGluc3RhbmNlb2YgRG9jdW1lbnRSZWFkZXIpIHsKLQkJCUlEb2N1bWVudCBkb2MgPSAoKERvY3VtZW50UmVhZGVyKSByZWFkZXIpLmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jIGluc3RhbmNlb2YgQ2hhclNlcXVlbmNlKSB7Ci0JCQkJZkNoYXJTZXF1ZW5jZVNvdXJjZSA9IChDaGFyU2VxdWVuY2UpIGRvYzsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG9sZCBmYXNoaW9uZWQgSURvY3VtZW50Ci0JCQkJZkRvY3VtZW50SW5wdXQgPSAoKERvY3VtZW50UmVhZGVyKSByZWFkZXIpLmdldERvY3VtZW50KCk7Ci0JCQl9Ci0KLQkJfQotCQllbHNlIGlmIChyZWFkZXIgaW5zdGFuY2VvZiBDaGFyU2VxdWVuY2VSZWFkZXIpIHsKLQkJCWZDaGFyU2VxdWVuY2VTb3VyY2UgPSAoKENoYXJTZXF1ZW5jZVJlYWRlcikgcmVhZGVyKS5nZXRPcmlnaW5hbFNvdXJjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIHRoZSBpbnB1dC4gVXNlIHRoaXMgdmVyc2lvbiB0byBhbGxvdyB0ZXh0IHRvIGJlIHJldHJpZXZlZAotCSAqIDxlbT5kdXJpbmc8L2VtPiBwYXJzaW5nLCBzdWNoIGFzIGJ5IHRoZQotCSAqIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIHNvdXJjZVN0cmluZykgewotCQlyZXNldChuZXcgU3RyaW5nUmVhZGVyKHNvdXJjZVN0cmluZykpOwotCQlmU3RyaW5nSW5wdXQgPSBzb3VyY2VTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIHRoZSBpbnB1dC4gVXNlIHRoaXMgdmVyc2lvbiB0byBhbGxvdyB0ZXh0IHRvIGJlIHJldHJpZXZlZAotCSAqIDxlbT5kdXJpbmc8L2VtPiBwYXJzaW5nLCBzdWNoIGFzIGJ5IHRoZQotCSAqIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIHNvdXJjZVN0cmluZywgaW50IHBvc2l0aW9uKSB7Ci0JCVN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHNvdXJjZVN0cmluZyk7Ci0JCXJlc2V0KHJlYWRlciwgcG9zaXRpb24pOwotCQlmU3RyaW5nSW5wdXQgPSBzb3VyY2VTdHJpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXRIYW5kbGVycygpIHsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLQkJCQkoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIpIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycy5nZXQoaSkpLnJlc2V0Tm9kZXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBMaXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMoTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycykgewotCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUb2tlbml6ZXIoQmxvY2tUb2tlbml6ZXIgbmV3VG9rZW5pemVyKSB7Ci0JCS8vIERNVzogY2hhbmdlZCBmcm9tIHByaXZhdGUgdG8gcHJvdGVjdGVkLCBzbyBzdWJjbGFzcyBjb3VsZCB1c2UgaW4KLQkJLy8gY3JlYXRpb24gb2YgJ25ld0luc3RhbmNlJy4KLQkJZlRva2VuaXplciA9IG5ld1Rva2VuaXplcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NTUyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFRleHRSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIHsKLQotCXB1YmxpYyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kRGlydHlFbmQoaW50IGVuZCkgewotCQkvLyBDYXV0aW9uOiBoZXJlJ3Mgb25lIHBsYWNlIHdlIGhhdmUgdG8gY2FzdAotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlc3VsdCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZW5kKTsKLQkJLy8gaWYgbm90IHdlbGwgZm9ybWVkLCBnZXQgb25lIHBhc3QsIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0aGVyZQotCQlpZiAoKHJlc3VsdCAhPSBudWxsKSAmJiAoIXJlc3VsdC5pc0VuZGVkKCkpKSB7Ci0JCQlpZiAocmVzdWx0LmdldE5leHQoKSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcmVzdWx0LmdldE5leHQoKTsKLQkJCX0KLQkJfQotCQkvLyBhbHNvLCBnZXQgb25lIHBhc3QgaWYgZXhhY3RseSBlcXVhbCB0byB0aGUgZW5kICh0aGlzIHdhcyBuZWVkZWQKLQkJLy8gYXMgYSBzaW1wbGUgZml4IHRvIHdoZW4gYSB3aG9sZSBleGFjdCByZWdpb24gaXMgZGVsZXRlZC4KLQkJLy8gdGhlcmUncyBwcm9iYWJseSBhIGJldHRlciB3YXkuCi0JCWlmICgocmVzdWx0ICE9IG51bGwpICYmIChlbmQgPT0gcmVzdWx0LmdldEVuZCgpKSkgewotCQkJaWYgKHJlc3VsdC5nZXROZXh0KCkgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHJlc3VsdC5nZXROZXh0KCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyAxMi82LzIwMDEgLSBTaW5jZSB3ZSd2ZSBjaGFuZ2VkIHRoZSBwYXJzZXIvc2Nhbm5lciB0byBhbGxvdyBhIGxvbmUKLQkJLy8gJzwnIHdpdGhvdXQKLQkJLy8gYWx3YXlzIGludGVycHJldHRpbmcgaXQgYXMgc3RhcnQgb2YgYSB0YWcgbmFtZSwgd2UgbmVlZCB0byBiZSBhCi0JCS8vIGxpdHRsZSBmYW5jaWVyLCBpbiBvcmRlcgotCQkvLyB0byAic2tpcCIgb3ZlciBhbnkgcGxhaW4gJ29sIGNvbnRlbnQgYmV0d2VlbiB0aGUgbG9uZSAnPCcgYW5kIGFueQotCQkvLyBwb3RlbnRpYWwgbWVhdGluZwotCQkvLyByZWdpb25zIHBhc3QgcGxhaW4gJ29sIGNvbnRlbnQuCi0JCWlmIChpc0xvbmVPcGVuRm9sbG93ZWRCeUNvbnRlbnQocmVzdWx0KSAmJiAocmVzdWx0LmdldE5leHQoKSAhPSBudWxsKSkgewotCQkJcmVzdWx0ID0gcmVzdWx0LmdldE5leHQoKTsKLQkJfQotCi0JCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24ocmVzdWx0KTsKLQkJZGlydHlFbmQgPSByZXN1bHQ7Ci0KLQkJcmV0dXJuIGRpcnR5RW5kOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpbmREaXJ0eVN0YXJ0KGludCBzdGFydCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlc3VsdCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQpOwotCQkvLyBoZXVyaXN0aWM6IGlmIHRoZSBwb3N0aW9uIGlzIGV4YWN0bHkgZXF1YWwgdG8gdGhlIHN0YXJ0LCB0aGVuCi0JCS8vIGdvIGJhY2sgb25lIG1vcmUsIGlmIGl0IGV4aXN0cy4gVGhpcyBwcmV2ZW50cyBwcm9ibGVtcyB3aXRoCi0JCS8vIGluc2VydGlvbnMKLQkJLy8gb2YgdGV4dCB0aGF0IHNob3VsZCBiZSBtZXJnZWQgd2l0aCB0aGUgcHJldmlvdXMgbm9kZSBpbnN0ZWFkIG9mCi0JCS8vIHNpbXBseSBodW5nCi0JCS8vIG9mZiBvZiBpdCBhcyBhIHNlcGFyYXRlIG5vZGUgKGV4LjogWE1MIGNvbnRlbnQgaW5zZXJ0ZWQgcmlnaHQKLQkJLy8gYmVmb3JlIGFuIG9wZW4KLQkJLy8gYnJhY2tldCBzaG91bGQgYmVjb21lIHBhcnQgb2YgdGhlIHByZXZpb3VzIGNvbnRlbnQgbm9kZSkKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzID0gcmVzdWx0LmdldFByZXZpb3VzKCk7Ci0JCQlpZiAoKHByZXZpb3VzICE9IG51bGwpICYmICgoIShwcmV2aW91cy5pc0VuZGVkKCkpKSB8fCAoc3RhcnQgPT0gcmVzdWx0LmdldFN0YXJ0KCkpKSkgewotCQkJCXJlc3VsdCA9IHByZXZpb3VzOwotCQkJfQotCQkJLy8gSWYgd2UgYXJlIG5vdyBhdCB0aGUgZW5kIG9mIGEgInRhZyBkZXBlbmRlbnQiIGNvbnRlbnQgYXJlYSAob3IKLQkJCS8vIEpTUCBhcmVhKQotCQkJLy8gdGhlbiB3ZSBuZWVkIHRvIGJhY2sgdXAgYWxsIHRoZSB3YXkgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGF0LgotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwb3RlbnRpYWwgPSByZXN1bHQ7Ci0JCQl3aGlsZSAoaXNQYXJ0T2ZCbG9ja1JlZ2lvbihwb3RlbnRpYWwpKSB7Ci0JCQkJcG90ZW50aWFsID0gcG90ZW50aWFsLmdldFByZXZpb3VzKCk7Ci0JCQl9Ci0JCQlpZiAocG90ZW50aWFsICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBwb3RlbnRpYWw7Ci0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRDYWNoZWREb2N1bWVudFJlZ2lvbihyZXN1bHQpOwotCQkJfQotCQl9Ci0JCWRpcnR5U3RhcnQgPSByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIHJ1bGUgaXMsIHRoYXQgaXMgd2UgYXJlIGNvbnRlbnQsIHByZWNlZGVkIGJ5IGxvbmUgPCwgdGhlbiB3ZSBuZWVkCi0JICogdG8gYWR2YW5jZSBvbmUgbW9yZSBmb3IgZGlydHkgZW5kLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTG9uZU9wZW5Gb2xsb3dlZEJ5Q29udGVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCVN0cmluZyB0eXBlID0gZmxhdE5vZGUuZ2V0VHlwZSgpOwotCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzID0gZmxhdE5vZGUuZ2V0UHJldmlvdXMoKTsKLQkJCVN0cmluZyBwcmV2aW91c1R5cGUgPSBudWxsOwotCQkJaWYgKHByZXZpb3VzICE9IG51bGwpIHsKLQkJCQlwcmV2aW91c1R5cGUgPSBwcmV2aW91cy5nZXRUeXBlKCk7Ci0JCQl9Ci0JCQlpZiAocHJldmlvdXNUeXBlICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSAocHJldmlvdXNUeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUGFydE9mQmxvY2tSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlTdHJpbmcgdHlwZSA9IGZsYXROb2RlLmdldFR5cGUoKTsKLQkJcmVzdWx0ID0gKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTk4ZGMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQuWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLS8qKgotICogQSBzaW1wbGUgY2xhc3MgdG8gZ2VuZXJhdGUgaW5zdGFuY2VzIG9mIFN0cnVjdHVyZWRSZWdpb25zLgotICovCi1wdWJsaWMgY2xhc3MgWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEpTUF9ESVJFQ1RJVkUgPSAxMDAzOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFhNTCA9IDEwMDE7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgWE1MX0JMT0NLID0gMTAwMjsKLQotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjcmVhdGVSZWdpb24oaW50IHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZSA9IG51bGw7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBYTUwgOgotCQkJCWluc3RhbmNlID0gbmV3IFhNTFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBYTUxfQkxPQ0sgOgotCQkJCWluc3RhbmNlID0gbmV3IEJsb2NrU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBYnN0cmFjdFJlZ2lvbjo6Y3JlYXRlUmVnaW9uLiBJbnZhbGlkIHR5cGUuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDYwN2EyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzNyArMCwwIEBACi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjIuMiBvbiAxMC8xNy8wNyA0OjI3IEFNICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9ucy5YTUxQYXJzZXJSZWdpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUvfmtsZWluZy9qZmxleC8iPkpGbGV4PC9hPiAxLjIuMgotICogb24gMTAvMTcvMDcgNDoyNyBBTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9lY2xpcHNlLnd0cC93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvWE1MVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIFhNTFRva2VuaXplciBpbXBsZW1lbnRzIEJsb2NrVG9rZW5pemVyLCBET01SZWdpb25Db250ZXh0IHsKLQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQgPSAyMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCA9IDI3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSA9IDEyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfVEFHX0NMT1NFID0gMTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSA9IDIxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0VRVUFMUyA9IDEzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfVEFHX05BTUUgPSAxNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSA9IDE5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUgPSAxNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNID0gMjU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSA9IDE3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTiA9IDI2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiA9IDIyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTiA9IDI4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQ09NTUVOVF9FTkQgPSA0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9DREFUQV9URVhUID0gMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfVEFHX0NMT1NFID0gMTU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9DT01NRU5UID0gMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUElfQ09OVEVOVCA9IDc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJX1dTID0gNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0RBVEFfRU5EID0gMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVCA9IDI5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9CTE9DS19UQUdfU0NBTiA9IDMwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfRVFVQUxTID0gOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RFQ0xBUkFUSU9OID0gMjA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyA9IDI0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRVFVQUxTID0gMTg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJID0gNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FID0gODsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDExXDBcMVw1XDFcMjJcMlwwXDFcMTRcMjJcMFwxXDE0XDFcMjFcMVwxMVwxXDU1IisKLSAgICAiXDFcMTZcMVwxN1wxXDEyXDFcMTNcMVwxNlwxXDE2XDFcMTZcMVwxNlwxXDE2XDFcNyIrCi0gICAgIlwxXDZcMVwzXDEyXDE1XDFcMTBcMVw2MVwxXDFcMVw0NVwxXDJcMVw0XDFcMTYiKwotICAgICJcMVwzNFwxXDYyXDFcMzJcMVwzM1wxXDUwXDFcNTdcMVwzNlwxXDM2XDFcNDJcMVwzNiIrCi0gICAgIlwxXDM2XDFcMjdcMVwyNVwxXDQ0XDFcNDNcMVw0N1wxXDM2XDFcNDBcMVw1NlwxXDM1IisKLSAgICAiXDFcNjBcMlwzNlwxXDIzXDFcNDZcMVwzNlwxXDMxXDFcMFwxXDIwXDFcMFwxXDEwIisKLSAgICAiXDFcMFwxXDUyXDFcNjJcMVw2M1wxXDUzXDFcMzdcMVw1N1wxXDM2XDFcNjZcMVw0MiIrCi0gICAgIlwyXDM2XDFcMzBcMVwyNlwxXDQ0XDFcNDNcMVw0N1wxXDM2XDFcNDBcMVw0MVwxXDUxIisKLSAgICAiXDFcNjBcMVwzNlwxXDM2XDFcMjRcMVw1NFwxXDM2XDFcMFwxXDBcNzJcMFwxXDY1IisKLSAgICAiXDEwXDBcMjdcNjRcMVwwXDM3XDY0XDFcMFw3Mlw2NFwyXDBcMTNcNjRcMlwwXDEwXDY0IisKLSAgICAiXDFcMFw2NVw2NFwxXDBcMTA0XDY0XDExXDBcNDRcNjRcM1wwXDJcNjRcNFwwXDM2XDY0IisKLSAgICAiXDcwXDBcMTMxXDY0XDIyXDBcN1w2NFwxNlwwXDJcNjVcNTZcMFwxMDZcNjVcMzJcMFwyXDY1IisKLSAgICAiXDQ0XDBcMVw2NFwxXDY1XDNcNjRcMVwwXDFcNjRcMVwwXDI0XDY0XDFcMFw1NFw2NCIrCi0gICAgIlwxXDBcN1w2NFwzXDBcMVw2NFwxXDBcMVw2NFwxXDBcMVw2NFwxXDBcMVw2NCIrCi0gICAgIlwxXDBcMjJcNjRcMTVcMFwxNFw2NFwxXDBcMTAyXDY0XDFcMFwxNFw2NFwxXDBcNDRcNjQiKwotICAgICJcMVwwXDRcNjVcMTFcMFw2NVw2NFwyXDBcMlw2NFwyXDBcMlw2NFwzXDBcMzRcNjQiKwotICAgICJcMlwwXDEwXDY0XDJcMFwyXDY0XDY3XDBcNDZcNjRcMlwwXDFcNjRcN1wwXDQ2XDY0IisKLSAgICAiXDEyXDBcMjFcNjVcMVwwXDI3XDY1XDFcMFwzXDY1XDFcMFwxXDY1XDFcMFwyXDY1IisKLSAgICAiXDFcMFwxXDY1XDEzXDBcMzNcNjRcNVwwXDNcNjRcNTZcMFwzMlw2NFw1XDBcMVw2NSIrCi0gICAgIlwxMlw2NFwxMFw2NVwxNVwwXDEyXDY1XDZcMFwxXDY1XDEwN1w2NFwyXDBcNVw2NFwxXDAiKwotICAgICJcMTdcNjRcMVwwXDRcNjRcMVwwXDFcNjRcMTdcNjVcMlw2NFwyXDY1XDFcMFw0XDY1IisKLSAgICAiXDJcMFwxMlw2NVx1MDIwN1wwXDNcNjVcMVwwXDY1XDY0XDJcMFwxXDY1XDFcNjRcMjBcNjUiKwotICAgICJcM1wwXDRcNjVcM1wwXDEyXDY0XDJcNjVcMlwwXDEyXDY1XDIxXDBcM1w2NVwxXDAiKwotICAgICJcMTBcNjRcMlwwXDJcNjRcMlwwXDI2XDY0XDFcMFw3XDY0XDFcMFwxXDY0XDNcMCIrCi0gICAgIlw0XDY0XDJcMFwxXDY1XDFcMFw3XDY1XDJcMFwyXDY1XDJcMFwzXDY1XDExXDAiKwotICAgICJcMVw2NVw0XDBcMlw2NFwxXDBcM1w2NFwyXDY1XDJcMFwxMlw2NVwyXDY0XDIwXDAiKwotICAgICJcMVw2NVwyXDBcNlw2NFw0XDBcMlw2NFwyXDBcMjZcNjRcMVwwXDdcNjRcMVwwIisKLSAgICAiXDJcNjRcMVwwXDJcNjRcMVwwXDJcNjRcMlwwXDFcNjVcMVwwXDVcNjVcNFwwIisKLSAgICAiXDJcNjVcMlwwXDNcNjVcMTNcMFw0XDY0XDFcMFwxXDY0XDdcMFwxMlw2NVwyXDY1IisKLSAgICAiXDNcNjRcMTRcMFwzXDY1XDFcMFw3XDY0XDFcMFwxXDY0XDFcMFwzXDY0XDFcMCIrCi0gICAgIlwyNlw2NFwxXDBcN1w2NFwxXDBcMlw2NFwxXDBcNVw2NFwyXDBcMVw2NVwxXDY0IisKLSAgICAiXDEwXDY1XDFcMFwzXDY1XDFcMFwzXDY1XDIyXDBcMVw2NFw1XDBcMTJcNjVcMjFcMCIrCi0gICAgIlwzXDY1XDFcMFwxMFw2NFwyXDBcMlw2NFwyXDBcMjZcNjRcMVwwXDdcNjRcMVwwIisKLSAgICAiXDJcNjRcMlwwXDRcNjRcMlwwXDFcNjVcMVw2NFw2XDY1XDNcMFwyXDY1XDJcMCIrCi0gICAgIlwzXDY1XDEwXDBcMlw2NVw0XDBcMlw2NFwxXDBcM1w2NFw0XDBcMTJcNjVcMjJcMCIrCi0gICAgIlwyXDY1XDFcMFw2XDY0XDNcMFwzXDY0XDFcMFw0XDY0XDNcMFwyXDY0XDFcMCIrCi0gICAgIlwxXDY0XDFcMFwyXDY0XDNcMFwyXDY0XDNcMFwzXDY0XDNcMFwxMFw2NFwxXDAiKwotICAgICJcM1w2NFw0XDBcNVw2NVwzXDBcM1w2NVwxXDBcNFw2NVwxMVwwXDFcNjVcMTdcMCIrCi0gICAgIlwxMVw2NVwyMVwwXDNcNjVcMVwwXDEwXDY0XDFcMFwzXDY0XDFcMFwyN1w2NFwxXDAiKwotICAgICJcMTJcNjRcMVwwXDVcNjRcNFwwXDdcNjVcMVwwXDNcNjVcMVwwXDRcNjVcN1wwIisKLSAgICAiXDJcNjVcMTFcMFwyXDY0XDRcMFwxMlw2NVwyMlwwXDJcNjVcMVwwXDEwXDY0XDFcMCIrCi0gICAgIlwzXDY0XDFcMFwyN1w2NFwxXDBcMTJcNjRcMVwwXDVcNjRcNFwwXDdcNjVcMVwwIisKLSAgICAiXDNcNjVcMVwwXDRcNjVcN1wwXDJcNjVcN1wwXDFcNjRcMVwwXDJcNjRcNFwwIisKLSAgICAiXDEyXDY1XDIyXDBcMlw2NVwxXDBcMTBcNjRcMVwwXDNcNjRcMVwwXDI3XDY0XDFcMCIrCi0gICAgIlwyMFw2NFw0XDBcNlw2NVwyXDBcM1w2NVwxXDBcNFw2NVwxMVwwXDFcNjVcMTBcMCIrCi0gICAgIlwyXDY0XDRcMFwxMlw2NVwyMjFcMFw1Nlw2NFwxXDBcMVw2NFwxXDY1XDJcNjRcN1w2NSIrCi0gICAgIlw1XDBcNlw2NFwxXDY1XDEwXDY1XDFcMFwxMlw2NVw0N1wwXDJcNjRcMVwwXDFcNjQiKwotICAgICJcMlwwXDJcNjRcMVwwXDFcNjRcMlwwXDFcNjRcNlwwXDRcNjRcMVwwXDdcNjQiKwotICAgICJcMVwwXDNcNjRcMVwwXDFcNjRcMVwwXDFcNjRcMlwwXDJcNjRcMVwwXDJcNjQiKwotICAgICJcMVwwXDFcNjRcMVw2NVwyXDY0XDZcNjVcMVwwXDJcNjVcMVw2NFwyXDBcNVw2NCIrCi0gICAgIlwxXDBcMVw2NVwxXDBcNlw2NVwyXDBcMTJcNjVcNzZcMFwyXDY1XDZcMFwxMlw2NSIrCi0gICAgIlwxM1wwXDFcNjVcMVwwXDFcNjVcMVwwXDFcNjVcNFwwXDJcNjVcMTBcNjRcMVwwIisKLSAgICAiXDQxXDY0XDdcMFwyNFw2NVwxXDBcNlw2NVw0XDBcNlw2NVwxXDBcMVw2NVwxXDAiKwotICAgICJcMjVcNjVcM1wwXDdcNjVcMVwwXDFcNjVcMzQ2XDBcNDZcNjRcMTJcMFw0N1w2NFwxMVwwIisKLSAgICAiXDFcNjRcMVwwXDJcNjRcMVwwXDNcNjRcMVwwXDFcNjRcMVwwXDJcNjRcMVwwIisKLSAgICAiXDVcNjRcNTFcMFwxXDY0XDFcMFwxXDY0XDFcMFwxXDY0XDEzXDBcMVw2NFwxXDAiKwotICAgICJcMVw2NFwxXDBcMVw2NFwzXDBcMlw2NFwzXDBcMVw2NFw1XDBcM1w2NFwxXDAiKwotICAgICJcMVw2NFwxXDBcMVw2NFwxXDBcMVw2NFwxXDBcMVw2NFwzXDBcMlw2NFwzXDAiKwotICAgICJcMlw2NFwxXDBcMVw2NFw1MFwwXDFcNjRcMTFcMFwxXDY0XDJcMFwxXDY0XDJcMCIrCi0gICAgIlwyXDY0XDdcMFwyXDY0XDFcMFwxXDY0XDFcMFw3XDY0XDUwXDBcMVw2NFw0XDAiKwotICAgICJcMVw2NFwxMFwwXDFcNjRcdTBjMDZcMFwyMzRcNjRcNFwwXDEzMlw2NFw2XDBcMjZcNjRcMlwwIisKLSAgICAiXDZcNjRcMlwwXDQ2XDY0XDJcMFw2XDY0XDJcMFwxMFw2NFwxXDBcMVw2NFwxXDAiKwotICAgICJcMVw2NFwxXDBcMVw2NFwxXDBcMzdcNjRcMlwwXDY1XDY0XDFcMFw3XDY0XDFcMCIrCi0gICAgIlwxXDY0XDNcMFwzXDY0XDFcMFw3XDY0XDNcMFw0XDY0XDJcMFw2XDY0XDRcMCIrCi0gICAgIlwxNVw2NFw1XDBcM1w2NFwxXDBcN1w2NFwzMjNcMFwxNVw2NVw0XDBcMVw2NVwxMDRcMCIrCi0gICAgIlwxXDY0XDNcMFwyXDY0XDJcMFwxXDY0XDEyMVwwXDNcNjRcdTBlODJcMFwxXDY1XDFcMCIrCi0gICAgIlwxXDY0XDMxXDBcMTFcNjRcNlw2NVwxXDBcNVw2NVwxM1wwXDEyNFw2NFw0XDBcMlw2NSIrCi0gICAgIlwyXDBcMlw2NVwyXDBcMTMyXDY0XDFcMFwzXDY1XDZcMFw1MFw2NFx1MWNkM1wwXHU1MWE2XDY0IisKLSAgICAiXHUwYzVhXDBcdTJiYTRcNjRcMTM0XDBcdTA4MDBcMFx1MWZmZVwwXDJcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eV9yb3dNYXAgW10gPSB7IAotICAgICAgICAwLCAgICA1NSwgICAxMTAsICAgMTY1LCAgIDIyMCwgICAyNzUsICAgMzMwLCAgIDM4NSwgICA0NDAsICAgNDk1LCAKLSAgICAgIDU1MCwgICA2MDUsICAgNjYwLCAgIDcxNSwgICA3NzAsICAgODI1LCAgIDg4MCwgICA5MzUsICAgOTkwLCAgMTA0NSwgCi0gICAgIDExMDAsICAxMTU1LCAgMTIxMCwgIDEyNjUsICAxMzIwLCAgMTM3NSwgIDE0MzAsICAxNDg1LCAgMTU0MCwgIDE1OTUsIAotICAgICAxNjUwLCAgMTcwNSwgIDE3NjAsICAxODE1LCAgMTg3MCwgIDE5MjUsICAxOTgwLCAgMTkyNSwgIDE5ODAsICAyMDM1LCAKLSAgICAgMTkyNSwgIDE5MjUsICAxOTgwLCAgMjA5MCwgIDIxNDUsICAyMjAwLCAgMjI1NSwgIDIzMTAsICAyMzY1LCAgMjQyMCwgCi0gICAgIDI0NzUsICAxOTI1LCAgMTk4MCwgIDI1MzAsICAyNTg1LCAgMjY0MCwgIDE5MjUsICAyNjk1LCAgMjY5NSwgIDI3NTAsIAotICAgICAyODA1LCAgMjg2MCwgIDI1MzAsICAxOTI1LCAgMjkxNSwgIDI5NzAsICAxOTI1LCAgMzAyNSwgIDMwODAsICAzMTM1LCAKLSAgICAgMzE5MCwgIDMyNDUsICAzMzAwLCAgMTkyNSwgIDMzNTUsICAzNDEwLCAgMzQ2NSwgIDM1MjAsICAxOTI1LCAgMzU3NSwgCi0gICAgIDM2MzAsICAzNjg1LCAgMzc0MCwgIDM3OTUsICAxOTI1LCAgMzg1MCwgIDM5MDUsICAzOTYwLCAgNDAxNSwgIDQwNzAsIAotICAgICA0MTI1LCAgNDE4MCwgIDQyMzUsICA0MjM1LCAgNDI5MCwgIDQzNDUsICA0NDAwLCAgNDQ1NSwgIDQ0NTUsICA0NTEwLCAKLSAgICAgNDU2NSwgIDQ2MjAsICA0Njc1LCAgNDY3NSwgIDQ3MzAsICA0Nzg1LCAgNDg0MCwgIDQ4OTUsICAxOTI1LCAgNDk1MCwgCi0gICAgIDQ5NTAsICA1MDA1LCAgNTA2MCwgIDUxMTUsICA1MTcwLCAgMTkyNSwgIDE5MjUsICAxOTgwLCAgMTkyNSwgIDE5MjUsIAotICAgICA1MjI1LCAgNTI4MCwgIDUzMzUsICA1MzkwLCAgNTQ0NSwgIDU1MDAsICA1NTU1LCAgNTYxMCwgIDE5MjUsICA1NjY1LCAKLSAgICAgNTcyMCwgIDU3NzUsICAxOTI1LCAgMTkyNSwgIDI2OTUsICA1ODMwLCAgMjgwNSwgIDE5MjUsICA1ODg1LCAgMjg2MCwgCi0gICAgIDI5MTUsICAzMDI1LCAgMzA4MCwgIDU5NDAsICAzMTM1LCAgMTkyNSwgIDU5OTUsICAzMTkwLCAgMTkyNSwgIDM1NzUsIAotICAgICA2MDUwLCAgMzY4NSwgIDE5MjUsICA2MTA1LCAgMzc0MCwgIDUyMjUsICA2MTYwLCAgNjIxNSwgIDYyNzAsICA0MDE1LCAKLSAgICAgMTkyNSwgIDYzMjUsICA2MzgwLCAgNDIzNSwgIDY0MzUsICA0MjkwLCAgMTkyNSwgIDY0OTAsICA2NTQ1LCAgNjYwMCwgCi0gICAgIDY2MDAsICA2NjU1LCAgNjcxMCwgIDQ0MDAsICA0MjM1LCAgNDQ1NSwgIDY3NjUsICA0NTEwLCAgMTkyNSwgIDY4MjAsIAotICAgICA0NTY1LCAgNDYyMCwgIDQ0NTUsICA0Njc1LCAgNjg3NSwgIDQ3MzAsICAxOTI1LCAgNjkzMCwgIDY5ODUsICA3MDQwLCAKLSAgICAgNzA0MCwgIDcwOTUsICA3MTUwLCAgNzIwNSwgIDQ5NTAsICA3MjYwLCAgNTAwNSwgIDE5MjUsICA3MzE1LCAgNzM3MCwgCi0gICAgIDc0MjUsICA3NDI1LCAgNzQ4MCwgIDc1MzUsICA3NTkwLCAgNzY0NSwgIDc3MDAsICA3NzU1LCAgNzgxMCwgIDE5MjUsIAotICAgICA3ODY1LCAgNzkyMCwgIDE5MjUsICAxOTI1LCAgMTkyNSwgIDIyNTUsICA3OTc1LCAgODAzMCwgIDgwODUsICA4MTQwLCAKLSAgICAgODE5NSwgIDgyNTAsICA4MzA1LCAgNjQ5MCwgIDgzNjAsICA4MzYwLCAgNjkzMCwgIDg0MTUsICA4NDE1LCAgODQ3MCwgCi0gICAgIDczMTUsICA4NTI1LCAgODUyNSwgIDg1ODAsICAxOTI1LCAgODYzNSwgIDg2OTAsICAxOTI1LCAgODc0NSwgIDg4MDAsIAotICAgICA4ODU1LCAgODkxMCwgIDg5NjUsICA5MDIwLCAgOTA3NSwgIDkxMzAsICA2NjU1LCAgNzA5NSwgIDkxODUsICA3NDgwLCAKLSAgICAgOTI0MCwgIDkyOTUsICA5MzUwLCAgOTQwNSwgIDk0NjAsICA5NTE1LCAgOTU3MCwgIDk2MjUsICA5NjgwLCAgOTczNSwgCi0gICAgIDk3OTAsICA5ODQ1LCAgOTkwMCwgIDk5NTUsIDEwMDEwLCAxMDA2NSwgMTAxMjAsICAxOTI1LCAgMTkyNSwgMTAxNzUsIAotICAgIDEwMjMwLCAxMDI4NSwgMTAzNDAsIDEwMzk1LCAgMTkyNSwgIDE5MjUsICAxOTI1LCAxMDQ1MCwgMTA1MDUsIDEwNTYwLCAKLSAgICAxMDYxNSwgMTA2NzAsIDEwNzI1LCAgMTkyNSwgMTA3ODAsICA0ODQwLCAgNTExNSwgMTA4MzUsIDEwODkwLCAxMDk0NSwgCi0gICAgMTEwMDAsICAyMjU1Ci0gIH07Ci0KLSAgLyoqIAotICAgKiBUaGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5X3BhY2tlZCA9IAotICAgICJcMVw0MFwxXDQxXDEwXDQwXDFcNDJcNFw0MFwxXDQzXDQ3XDQwXDFcNDQiKwotICAgICJcMVw0NVw2NVw0NFwxXDQ2XDFcNDdcMTZcNDZcMVw1MFwxXDQ2XDFcNTEiKwotICAgICJcNDRcNDZcMVw1MlwxXDUzXDY1XDUyXDFcNDZcMVw0N1w1XDQ2XDFcNTQiKwotICAgICJcMTJcNDZcMVw1MVw0NVw0NlwxXDQ3XDJcNDZcMVw1NVwxXDU2XDJcNDYiKwotICAgICJcMVw1N1wzXDQ2XDFcNTZcNVw0NlwxXDU2XDFcNjBcMVw2MVw0XDU3IisKLSAgICAiXDFcNDZcMTBcNTdcMVw2MlwyXDU3XDFcNDZcN1w1N1wxXDQ2XDNcNTciKwotICAgICJcMVw0NlwzXDU3XDFcNDZcMVw1N1wxXDQ2XDFcNDdcMlw0NlwxXDU1IisKLSAgICAiXDFcNjNcNlw0NlwxXDYzXDVcNDZcMVw2M1w0NFw0NlwxXDY0XDFcNjUiKwotICAgICJcMlw2NFwxXDY2XDE1XDY0XDFcNTFcNDRcNjRcMVw0NlwxXDQ3XDJcNDYiKwotICAgICJcMVw2N1wxXDU2XDJcNDZcMVw3MFwzXDQ2XDFcNTZcNVw0NlwxXDU2IisKLSAgICAiXDZcNzBcMVw0NlwxM1w3MFwxXDQ2XDdcNzBcMVw0NlwzXDcwXDFcNDYiKwotICAgICJcM1w3MFwxXDQ2XDFcNzBcMVw0NlwxXDQ3XDJcNDZcMVw2N1wxXDU2IisKLSAgICAiXDJcNDZcMVw3MFwzXDQ2XDFcNTZcNVw0NlwxXDU2XDZcNzBcMVw0NiIrCi0gICAgIlwxM1w3MFwxXDcxXDdcNzBcMVw0NlwzXDcwXDFcNDZcM1w3MFwxXDQ2IisKLSAgICAiXDFcNzBcMVw3MlwxXDQ3XDFcNDZcMVw3M1wxXDc0XDFcNTZcM1w3MiIrCi0gICAgIlwxXDc1XDFcNzJcMVw3NlwxXDU2XDVcNzJcMVw1Nlw0NFw3MlwxXDQ2IisKLSAgICAiXDFcNDdcMlw0NlwxXDc3XDE1XDQ2XDFcNTFcNDVcNDZcMVw0N1wxXDEwMCIrCi0gICAgIlwxXDEwMVwxXDQ2XDFcNTZcMlw0NlwxXDEwMlwzXDQ2XDFcNTZcNVw0NiIrCi0gICAgIlwxXDU2XDZcMTAyXDFcNDZcMTNcMTAyXDFcNDZcN1wxMDJcMVw0NlwzXDEwMiIrCi0gICAgIlwxXDQ2XDNcMTAyXDFcNDZcMVwxMDJcMVw0NlwxXDQ3XDFcMTAwXDFcMTAxIisKLSAgICAiXDFcNDZcMVw1NlwyXDQ2XDFcMTAyXDNcNDZcMVw1Nlw1XDQ2XDFcNTYiKwotICAgICJcNlwxMDJcMVw0NlwxM1wxMDJcMVwxMDNcN1wxMDJcMVw0NlwzXDEwMlwxXDQ2IisKLSAgICAiXDNcMTAyXDFcNDZcMVwxMDJcMVwxMDRcMVw0N1wxXDEwMFwxXDEwNVwxXDEwNCIrCi0gICAgIlwxXDU2XDNcMTA0XDFcMTA2XDFcMTA0XDFcMTA3XDFcNTZcNVwxMDRcMVw1NiIrCi0gICAgIlw0NFwxMDRcMVw0NlwxXDQ3XDNcNDZcMVw1Nlw2XDQ2XDFcNTZcNVw0NiIrCi0gICAgIlwxXDU2XDQ0XDQ2XDFcMTEwXDFcMTExXDFcMTEyXDFcMTEzXDRcMTEwXDFcMTE0IisKLSAgICAiXDEyXDExMFw2XDExNVwxXDExMFwxM1wxMTVcMVwxMTBcN1wxMTVcMVwxMTBcM1wxMTUiKwotICAgICJcMVwxMTBcM1wxMTVcMVwxMTBcMVwxMTVcMVw0NlwxXDExMVwxXDExMlwxXDExMyIrCi0gICAgIlwxXDQ2XDFcNTZcMlw0NlwxXDExNlwzXDQ2XDFcNTZcNVw0NlwxXDU2IisKLSAgICAiXDZcMTE2XDFcNDZcMTNcMTE2XDFcNDZcN1wxMTZcMVw0NlwzXDExNlwxXDQ2IisKLSAgICAiXDNcMTE2XDFcNDZcMVwxMTZcMVw0NlwxXDExMVwxXDExMlwxXDExM1wxXDQ2IisKLSAgICAiXDFcNTZcMlw0NlwxXDExNlwzXDQ2XDFcNTZcNVw0NlwxXDU2XDZcMTE2IisKLSAgICAiXDFcNDZcMTNcMTE2XDFcMTE3XDdcMTE2XDFcNDZcM1wxMTZcMVw0NlwzXDExNiIrCi0gICAgIlwxXDQ2XDFcMTE2XDFcMTIwXDFcMTExXDFcMTEyXDFcMTIxXDFcMTIwXDFcNTYiKwotICAgICJcM1wxMjBcMVwxMjJcMVwxMjBcMVwxMjNcMVw1Nlw1XDEyMFwxXDU2XDQ0XDEyMCIrCi0gICAgIlwxXDQ2XDFcMTI0XDFcMTI1XDJcNDZcMVw1Nlw2XDQ2XDFcNTZcNVw0NiIrCi0gICAgIlwxXDU2XDEwXDQ2XDFcMTI2XDFcMTI3XDJcNDZcMVwxMzBcMTBcNDZcMVwxMzAiKwotICAgICJcMVw0NlwxXDEyN1wxXDEyNlwxNFw0NlwxXDQ3XDFcMTI1XDJcNDZcMVw1NiIrCi0gICAgIlw2XDQ2XDFcNTZcNVw0NlwxXDU2XDZcNDZcMVwxMzFcMzZcNDZcMVw0NyIrCi0gICAgIlwxXDEyNVwyXDQ2XDFcNTZcMlw0NlwxXDEzMlwzXDQ2XDFcNTZcNVw0NiIrCi0gICAgIlwxXDU2XDZcMTMyXDFcMTMxXDEzXDEzMlwxXDQ2XDdcMTMyXDFcNDZcM1wxMzIiKwotICAgICJcMVw0NlwzXDEzMlwxXDQ2XDFcMTMyXDFcNDZcMVw0N1wxXDEyNVwyXDQ2IisKLSAgICAiXDFcNTZcNlw0NlwxXDU2XDVcNDZcMVw1Nlw2XDQ2XDFcMTMxXDdcNDYiKwotICAgICJcMVwxMzNcNVw0NlwxXDEzNFw2XDQ2XDFcMTMzXDEwXDQ2XDFcMTM1XDFcNDciKwotICAgICJcMVwxMjVcMVwxMzZcMVwxMzVcMVw1NlwzXDEzNVwxXDEzN1wxXDEzNVwxXDE0MCIrCi0gICAgIlwxXDU2XDVcMTM1XDFcNTZcNlwxMzVcMVwxNDFcMzVcMTM1XDFcMTQyXDFcNDciKwotICAgICJcMVwxMjVcMVwxNDNcMVwxNDJcMVw1NlwzXDE0MlwxXDE0NFwxXDE0MlwxXDE0NSIrCi0gICAgIlwxXDU2XDVcMTQyXDFcNTZcNlwxNDJcMVwxNDZcMzVcMTQyXDFcMTQ3XDFcNDciKwotICAgICJcMVwxMjVcMVwxNTBcMVwxNDdcMVw1NlwzXDE0N1wxXDE1MVwxXDE0N1wxXDE1MiIrCi0gICAgIlwxXDU2XDVcMTQ3XDFcNTZcNDRcMTQ3XDFcMTUzXDFcMTU0XDFcMTU1XDY0XDE1MyIrCi0gICAgIlwxXDE1NlwxXDQ3XDFcMTI1XDFcMTU3XDFcMTU2XDFcNTZcM1wxNTZcMVwxNjAiKwotICAgICJcMVwxNTZcMVwxNjFcMVw1Nlw1XDE1NlwxXDU2XDQ0XDE1NlwxXDE2MlwxXDE2MyIrCi0gICAgIlwxXDE2NFw2NFwxNjJcMVwxNjVcMVwxNjZcNjVcMTY1XDFcNDBcMVwwXDEwXDQwIisKLSAgICAiXDFcMFw0XDQwXDFcMFw0N1w0MFwzXDBcMVwxNjdcMVwxNzBcMTRcMCIrCi0gICAgIlwxXDE3MVw1MlwwXDFcMTcyXDJcMFwxXDE3M1wzXDBcMVwxNzJcNVwwIisKLSAgICAiXDFcMTcyXDZcMTczXDFcMFwxM1wxNzNcMVwwXDdcMTczXDFcMTc0XDNcMTczIisKLSAgICAiXDFcMFwzXDE3M1wxXDBcMVwxNzNcNVwwXDFcMTcyXDJcMFwxXDE3NSIrCi0gICAgIlwzXDBcMVwxNzJcNVwwXDFcMTcyXDZcMTc1XDFcMFwxM1wxNzVcMVwwIisKLSAgICAiXDdcMTc1XDFcMFwzXDE3NVwxXDBcM1wxNzVcMVwwXDFcMTc1XDExMFwwIisKLSAgICAiXDFcMTc2XDY1XDBcMVwxNzdcNTVcMFwxXDIwMFw2MVwwXDFcMjAxXDcxXDAiKwotICAgICJcMVw1Nlw2XDBcMVw1Nlw1XDBcMVw1Nlw1MlwwXDNcNTdcNFwwIisKLSAgICAiXDFcNTdcNVwwXDZcNTdcMVwwXDEzXDU3XDFcMFw3XDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcMFw1XDU3XDZcMFwzXDU3XDRcMFwxXDU3XDVcMCIrCi0gICAgIlwyXDU3XDJcMjAyXDJcNTdcMVwwXDEzXDU3XDFcMFw3XDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcMFw1XDU3XDZcMFwzXDU3XDRcMFwxXDU3XDVcMCIrCi0gICAgIlwyXDU3XDFcMjAyXDFcMjAzXDJcNTdcMVwwXDEzXDU3XDFcMFw3XDU3IisKLSAgICAiXDFcMFwzXDU3XDFcMFw1XDU3XDZcMFwzXDU3XDRcMFwxXDU3IisKLSAgICAiXDVcMFwyXDU3XDJcMjA0XDJcNTdcMVwwXDEzXDU3XDFcMFw3XDU3IisKLSAgICAiXDFcMFwzXDU3XDFcMFw1XDU3XDVcMFwxXDYzXDZcMFwxXDYzIisKLSAgICAiXDVcMFwxXDYzXDQ2XDBcMVwyMDVcNjZcMFwxXDIwNlw3MlwwXDNcNzAiKwotICAgICJcNFwwXDFcNzBcNVwwXDZcNzBcMVwwXDEzXDcwXDFcMFw3XDcwIisKLSAgICAiXDFcMFwzXDcwXDFcMFw1XDcwXDFcNzJcMlwwXDFcMjA3XDFcNzIiKwotICAgICJcMVwwXDNcNzJcMVwwXDFcNzJcMlwwXDVcNzJcMVwwXDQ1XDcyIisKLSAgICAiXDFcMFwxXDIwNlwxXDIwN1wxXDcyXDFcMFwzXDcyXDFcMFwxXDcyIisKLSAgICAiXDJcMFw1XDcyXDFcMFw0NFw3MlwxXDc1XDFcMFwxXDIxMFwxXDIxMSIrCi0gICAgIlwxXDc1XDFcMjEwXDNcNzVcMVwyMTJcMVw3NVwyXDIxMFw1XDc1XDFcMjEwIisKLSAgICAiXDQ0XDc1XDFcNzZcMVwwXDFcMjEzXDFcMjE0XDFcNzZcMVwyMTNcM1w3NiIrCi0gICAgIlwxXDIxM1wxXDc2XDFcMjEyXDFcMjEzXDVcNzZcMVwyMTNcNDRcNzZcMlwwIisKLSAgICAiXDFcMTAwXDFcMjE1XDcxXDBcM1wxMDJcNFwwXDFcMTAyXDVcMFw2XDEwMiIrCi0gICAgIlwxXDBcMTNcMTAyXDFcMFw3XDEwMlwxXDBcM1wxMDJcMVwwXDVcMTAyIisKLSAgICAiXDFcMTA0XDJcMFwxXDIxNlwxXDEwNFwxXDBcM1wxMDRcMVwwXDFcMTA0IisKLSAgICAiXDJcMFw1XDEwNFwxXDBcNDVcMTA0XDFcMFwxXDEwMFwxXDIxN1wxXDEwNCIrCi0gICAgIlwxXDBcM1wxMDRcMVwwXDFcMTA0XDJcMFw1XDEwNFwxXDBcNDRcMTA0IisKLSAgICAiXDFcMTA2XDFcMFwxXDIyMFwxXDIyMVwxXDEwNlwxXDIyMFwzXDEwNlwxXDIyMiIrCi0gICAgIlwxXDEwNlwyXDIyMFw1XDEwNlwxXDIyMFw0NFwxMDZcMVwxMDdcMVwwXDFcMjIzIisKLSAgICAiXDFcMjI0XDFcMTA3XDFcMjIzXDNcMTA3XDFcMjIzXDFcMTA3XDFcMjIyXDFcMjIzIisKLSAgICAiXDVcMTA3XDFcMjIzXDQ0XDEwN1wxXDExMFwzXDBcMTdcMTEwXDZcMFwxXDExMCIrCi0gICAgIlwxM1wwXDFcMTEwXDdcMFwxXDExMFwzXDBcMVwxMTBcM1wwXDFcMTEwIisKLSAgICAiXDRcMFwxXDE2N1wxNVwwXDFcMTcxXDQ3XDBcMVwyMjVcNjRcMFwxXDExMCIrCi0gICAgIlwzXDBcMlwxMTBcM1wxMTRcNFwxMTBcMVwxMTRcNVwxMTBcNlwxMTVcMVwxMTAiKwotICAgICJcMTNcMTE1XDFcMTEwXDdcMTE1XDFcMTEwXDNcMTE1XDFcMTEwXDNcMTE1XDFcMTE0IisKLSAgICAiXDFcMTE1XDZcMFwzXDExNVw0XDBcMVwxMTVcNVwwXDZcMTE1XDFcMCIrCi0gICAgIlwxM1wxMTVcMVwwXDdcMTE1XDFcMFwzXDExNVwxXDBcNVwxMTVcNlwwIisKLSAgICAiXDNcMTE2XDRcMFwxXDExNlw1XDBcNlwxMTZcMVwwXDEzXDExNlwxXDAiKwotICAgICJcN1wxMTZcMVwwXDNcMTE2XDFcMFw1XDExNlwxXDEyMFwyXDBcMVwyMjYiKwotICAgICJcMVwxMjBcMVwwXDNcMTIwXDFcMFwxXDEyMFwyXDBcNVwxMjBcMVwwIisKLSAgICAiXDQ1XDEyMFwxXDBcMVwyMjVcMVwyMjZcMVwxMjBcMVwwXDNcMTIwXDFcMCIrCi0gICAgIlwxXDEyMFwyXDBcNVwxMjBcMVwwXDQ0XDEyMFwxXDEyMlwxXDBcMVwyMjciKwotICAgICJcMVwyMzBcMVwxMjJcMVwyMjdcM1wxMjJcMVwyMzFcMVwxMjJcMlwyMjdcNVwxMjIiKwotICAgICJcMVwyMjdcNDRcMTIyXDFcMTIzXDFcMFwxXDIzMlwxXDIzM1wxXDEyM1wxXDIzMiIrCi0gICAgIlwzXDEyM1wxXDIzMlwxXDEyM1wxXDIzMVwxXDIzMlw1XDEyM1wxXDIzMlw0NFwxMjMiKwotICAgICJcM1wwXDFcMTY3XDE1XDBcMVwyMzRcMTEwXDBcMVwyMzVcNjBcMFwxXDIzNiIrCi0gICAgIlwxM1wwXDFcMjM2XDQ0XDBcMlwyMzdcMzZcMFwyMFwyNDBcMVwyNDFcNDZcMjQwIisKLSAgICAiXDZcMFwzXDEzMlw0XDBcMVwxMzJcNVwwXDZcMTMyXDFcMFwxM1wxMzIiKwotICAgICJcMVwwXDdcMTMyXDFcMFwzXDEzMlwxXDBcNVwxMzJcNDZcMFwxXDI0MiIrCi0gICAgIlw1XDBcMVwyNDJcNzJcMFwxXDI0M1w2XDBcMVwxMzVcMlwwXDFcMjQ0IisKLSAgICAiXDFcMTM1XDFcMFwzXDEzNVwxXDBcMVwxMzVcMlwwXDVcMTM1XDFcMCIrCi0gICAgIlw0NFwxMzVcMVwxMzdcMVwwXDFcMjQ1XDFcMjQ2XDFcMTM3XDFcMjQ1XDNcMTM3IisKLSAgICAiXDFcMjQ3XDFcMTM3XDJcMjQ1XDVcMTM3XDFcMjQ1XDQ0XDEzN1wxXDI1MFwxXDAiKwotICAgICJcMVwyNTFcMVwyNTJcMVwyNTNcMVwyNTFcM1wyNTNcMVwyNTFcMVwyNTBcMVwyNTQiKwotICAgICJcMVwyNTVcM1wyNTNcMVwyNTBcMVwyNTNcMVwyNTVcNlwyNTNcMVwyNTBcMzJcMjUzIisKLSAgICAiXDJcMjUwXDFcMjUzXDFcMTQxXDJcMjQwXDFcMjU2XDFcMTQxXDFcMjQwXDNcMTQxIisKLSAgICAiXDFcMjQwXDFcMTQxXDJcMjQwXDNcMTQxXDFcMjU3XDFcMTQxXDFcMjQwXDQ0XDE0MSIrCi0gICAgIlwxXDE0MlwyXDBcMVwyNjBcMVwxNDJcMVwwXDNcMTQyXDFcMFwxXDE0MiIrCi0gICAgIlwyXDBcNVwxNDJcMVwwXDQ0XDE0MlwxXDE0NFwyXDI2MVwxXDI2MlwxXDE0NCIrCi0gICAgIlwxXDI2MVwzXDE0NFwxXDI2M1wxXDE0NFwyXDI2MVw1XDE0NFwxXDI2MVw0NFwxNDQiKwotICAgICJcMVwxNDVcMlwyNjRcMVwyNjVcMVwxNDVcMVwyNjRcM1wxNDVcMVwyNjRcMVwxNDUiKwotICAgICJcMVwyNjNcMVwyNjRcNVwxNDVcMVwyNjRcNDRcMTQ1XDFcMTQ2XDJcMjQwXDFcMjY2IisKLSAgICAiXDFcMTQ2XDFcMjQwXDNcMTQ2XDFcMjQwXDFcMTQ2XDJcMjQwXDNcMTQ2XDFcMjY3IisKLSAgICAiXDFcMTQ2XDFcMjQwXDQ0XDE0NlwxXDE0N1wyXDBcMVwyNzBcMVwxNDdcMVwwIisKLSAgICAiXDNcMTQ3XDFcMFwxXDE0N1wyXDBcNVwxNDdcMVwwXDQ0XDE0N1wxXDE1MSIrCi0gICAgIlwxXDBcMVwyNzFcMVwyNzJcMVwxNTFcMVwyNzFcM1wxNTFcMVwyNzNcMVwxNTEiKwotICAgICJcMlwyNzFcNVwxNTFcMVwyNzFcNDRcMTUxXDFcMjc0XDFcMFwxXDI3NVwxXDI3NiIrCi0gICAgIlwxXDI3N1wxXDI3NVwzXDI3N1wxXDI3NVwxXDI3NFwxXDMwMFwxXDMwMVwzXDI3NyIrCi0gICAgIlwxXDI3NFwxXDI3N1wxXDMwMVw2XDI3N1wxXDI3NFwzMlwyNzdcMlwyNzRcMVwyNzciKwotICAgICJcMlwxNTNcMVwwXDY2XDE1M1wxXDBcMTZcMTUzXDFcMzAyXDQ1XDE1M1wxXDE1NiIrCi0gICAgIlwyXDBcMVwzMDNcMVwxNTZcMVwwXDNcMTU2XDFcMFwxXDE1NlwyXDAiKwotICAgICJcNVwxNTZcMVwwXDQ0XDE1NlwxXDE2MFwxXDBcMVwzMDRcMVwzMDVcMVwxNjAiKwotICAgICJcMVwzMDRcM1wxNjBcMVwzMDZcMVwxNjBcMlwzMDRcNVwxNjBcMVwzMDRcNDRcMTYwIisKLSAgICAiXDFcMzA3XDFcMFwxXDMxMFwxXDMxMVwxXDMxMlwxXDMxMFwzXDMxMlwxXDMxMCIrCi0gICAgIlwxXDMwN1wxXDMxM1wxXDMxNFwzXDMxMlwxXDMwN1wxXDMxMlwxXDMxNFw2XDMxMiIrCi0gICAgIlwxXDMwN1wzMlwzMTJcMlwzMDdcMVwzMTJcMlwxNjJcMVwwXDY2XDE2MlwxXDAiKwotICAgICJcMTZcMTYyXDFcMzE1XDQ1XDE2Mlw3XDBcMVwzMTZcMjFcMFwxXDMxN1w0MlwwIisKLSAgICAiXDFcMTcyXDJcMFwxXDQwXDNcMFwxXDE3Mlw1XDBcMVwxNzJcNlw0MCIrCi0gICAgIlwxXDBcMTNcNDBcMVwwXDdcNDBcMVwwXDNcNDBcMVwwXDNcNDAiKwotICAgICJcMVwwXDFcNDBcMVwzMjBcMVwwXDNcMzIwXDFcMzIxXDNcMTczXDFcMzIwIisKLSAgICAiXDFcMFwxXDMyMFwxXDMyMVwxXDE3M1wxXDMyMFwxXDBcMlwzMjBcMVwzMjEiKwotICAgICJcNlwxNzNcMVwzMjBcMTNcMTczXDFcMzIwXDdcMTczXDFcMzIwXDNcMTczXDFcMzIyIisKLSAgICAiXDVcMTczXDE1XDBcMVwzMjNcNlwwXDFcMzI0XDQyXDBcMVwzMjBcMVwwIisKLSAgICAiXDNcMzIwXDFcMzIxXDNcMTc1XDFcMzIwXDFcMFwxXDMyMFwxXDMyMVwxXDE3NSIrCi0gICAgIlwxXDMyMFwxXDBcMlwzMjBcMVwzMjFcNlwxNzVcMVwzMjBcMTNcMTc1XDFcMzIwIisKLSAgICAiXDdcMTc1XDFcMzIwXDNcMTc1XDFcMzI1XDVcMTc1XDMxXDBcMVwzMTdcMzdcMCIrCi0gICAgIlwxXDMyNlw2NlwwXDFcMzI3XDcyXDBcM1w1N1w0XDBcMVw1N1w1XDAiKwotICAgICJcNFw1N1wyXDMzMFwxXDBcMTNcNTdcMVwwXDdcNTdcMVwwXDNcNTciKwotICAgICJcMVwwXDVcNTdcNlwwXDNcNTdcNFwwXDFcNTdcNVwwXDRcNTciKwotICAgICJcMVwzMzBcMVwzMzFcMVwwXDEzXDU3XDFcMFw3XDU3XDFcMFwzXDU3IisKLSAgICAiXDFcMFw1XDU3XDZcMFwzXDU3XDRcMFwxXDU3XDVcMFw2XDU3IisKLSAgICAiXDFcMFwxM1w1N1wxXDBcMVw1N1wxXDMzMlw1XDU3XDFcMFwzXDU3IisKLSAgICAiXDFcMFw1XDU3XDFcMjEwXDFcMFw3XDIxMFwxXDIxMlw1NVwyMTBcMVwyMTMiKwotICAgICJcMVwwXDExXDIxM1wxXDIxMlw1M1wyMTNcMVwyMjBcMVwwXDdcMjIwXDFcMjIyIisKLSAgICAiXDU1XDIyMFwxXDIyM1wxXDBcMTFcMjIzXDFcMjIyXDUzXDIyM1wxXDIyN1wxXDAiKwotICAgICJcN1wyMjdcMVwyMzFcNTVcMjI3XDFcMjMyXDFcMFwxMVwyMzJcMVwyMzFcNTNcMjMyIisKLSAgICAiXDMyXDBcMVwzMzNcMzBcMFwxXDMzM1w0MFwwXDFcMzM0XDEzXDBcMVwzMzQiKwotICAgICJcNTRcMFwxXDMzNVwxMFwwXDFcMzM1XDU3XDBcMVwzMzZcMTRcMFwxXDMzNiIrCi0gICAgIlw3MlwwXDFcMzM3XDRcMFwxXDI0NVwxXDBcN1wyNDVcMVwyNDdcNTVcMjQ1IisKLSAgICAiXDFcMjUwXDFcMFwxXDI1MVwxXDM0MFwxXDI1MFwxXDI1MVwzXDI1MFwxXDI1MSIrCi0gICAgIlwxXDI1MFwxXDI0N1wxXDI1MVw1XDI1MFwxXDI1MVw0NFwyNTBcMVwyNTFcMVwwIisKLSAgICAiXDExXDI1MVwxXDI0N1w1M1wyNTFcMVwyNTBcMVwwXDFcMjUxXDFcMzQwXDFcMjUwIisKLSAgICAiXDFcMjUxXDNcMjUwXDFcMjUxXDFcMjUwXDFcMzQxXDFcMjUxXDVcMjUwXDFcMjUxIisKLSAgICAiXDQ0XDI1MFwxM1wwXDFcMzQyXDUzXDBcMVwyNTFcMVwwXDExXDI1MVwxXDM0MSIrCi0gICAgIlw1M1wyNTFcMTFcMjYxXDFcMjYzXDU1XDI2MVwxM1wyNjRcMVwyNjNcNTNcMjY0XDFcMjcxIisKLSAgICAiXDFcMFw3XDI3MVwxXDI3M1w1NVwyNzFcMVwyNzRcMVwwXDFcMjc1XDFcMzQzIisKLSAgICAiXDFcMjc0XDFcMjc1XDNcMjc0XDFcMjc1XDFcMjc0XDFcMjczXDFcMjc1XDVcMjc0IisKLSAgICAiXDFcMjc1XDQ0XDI3NFwxXDI3NVwxXDBcMTFcMjc1XDFcMjczXDUzXDI3NVwxXDI3NCIrCi0gICAgIlwxXDBcMVwyNzVcMVwzNDNcMVwyNzRcMVwyNzVcM1wyNzRcMVwyNzVcMVwyNzQiKwotICAgICJcMVwzNDRcMVwyNzVcNVwyNzRcMVwyNzVcNDRcMjc0XDEzXDBcMVwzNDVcNTNcMCIrCi0gICAgIlwxXDI3NVwxXDBcMTFcMjc1XDFcMzQ0XDUzXDI3NVwyXDE1M1wxXDBcMjZcMTUzIisKLSAgICAiXDFcMzQ2XDM1XDE1M1wxXDMwNFwxXDBcN1wzMDRcMVwzMDZcNTVcMzA0XDFcMzA3IisKLSAgICAiXDFcMFwxXDMxMFwxXDM0N1wxXDMwN1wxXDMxMFwzXDMwN1wxXDMxMFwxXDMwNyIrCi0gICAgIlwxXDMwNlwxXDMxMFw1XDMwN1wxXDMxMFw0NFwzMDdcMVwzMTBcMVwwXDExXDMxMCIrCi0gICAgIlwxXDMwNlw1M1wzMTBcMVwzMDdcMVwwXDFcMzEwXDFcMzQ3XDFcMzA3XDFcMzEwIisKLSAgICAiXDNcMzA3XDFcMzEwXDFcMzA3XDFcMzUwXDFcMzEwXDVcMzA3XDFcMzEwXDQ0XDMwNyIrCi0gICAgIlwxM1wwXDFcMzUxXDUzXDBcMVwzMTBcMVwwXDExXDMxMFwxXDM1MFw1M1wzMTAiKwotICAgICJcMlwxNjJcMVwwXDI2XDE2MlwxXDM1MlwzNVwxNjJcN1wwXDFcMzUzXDExMVwwIisKLSAgICAiXDFcMzU0XDM0XDBcMVwzMjBcMVwwXDEwXDMyMFwxXDBcNFwzMjBcMVwwIisKLSAgICAiXDQxXDMyMFwxXDBcNlwzMjBcMVwwXDNcMzIwXDFcMzIxXDRcMzIwXDFcMCIrCi0gICAgIlwxXDMyMFwxXDMyMVwyXDMyMFwxXDBcMlwzMjBcMVwzMjFcMzZcMzIwXDFcMzU1IisKLSAgICAiXDVcMzIwXDE1XDBcMVwzMjNcNDNcMFwxXDM1NlwyMlwwXDFcMzU3XDE0XDAiKwotICAgICJcM1wzNTdcMlwwXDFcMzU3XDEwXDBcMVwzNTdcMVwwXDJcMzU3XDNcMCIrCi0gICAgIlwxXDM1N1wyXDBcMlwzNTdcMTFcMFwxXDU3XDFcMzYwXDFcNTdcNFwwIisKLSAgICAiXDFcNTdcNVwwXDZcNTdcMVwwXDEzXDU3XDFcMFw3XDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcMFw1XDU3XDZcMFwzXDU3XDRcMFwxXDU3XDVcMCIrCi0gICAgIlw2XDU3XDFcMFwxMVw1N1wxXDM2MVwxXDU3XDFcMFw3XDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcMFw1XDU3XDM1XDBcMVwzNjJcMTNcMFwxXDM2Mlw0NFwwIisKLSAgICAiXDJcMzYzXDYzXDBcMlwzNjRcNzVcMFwxXDM2NVwxM1wwXDFcMzY1XDQ0XDAiKwotICAgICJcMlwzNjZcNDFcMFwyXDM2N1wxXDBcM1wzNjdcMlwwXDFcMjU0XDRcMzY3IisKLSAgICAiXDFcMFwxMFwzNjdcMVwwXDMyXDM2N1wyXDBcMVwzNjdcM1wwXDJcMzcwIisKLSAgICAiXDFcMFwzXDM3MFwyXDBcMVwzMDBcNFwzNzBcMVwwXDEwXDM3MFwxXDAiKwotICAgICJcMzJcMzcwXDJcMFwxXDM3MFwyXDE1M1wxXDBcMjdcMTUzXDFcMzcxXDM0XDE1MyIrCi0gICAgIlwzXDBcMlwzNzJcMVwwXDNcMzcyXDJcMFwxXDMxM1w0XDM3MlwxXDAiKwotICAgICJcMTBcMzcyXDFcMFwzMlwzNzJcMlwwXDFcMzcyXDJcMTYyXDFcMFwyN1wxNjIiKwotICAgICJcMVwzNzNcMzRcMTYyXDMzXDBcMVwzNzRcMTE0XDBcMVwzNTVcMjJcMFwxXDM1NyIrCi0gICAgIlwxNFwwXDNcMzU3XDJcMFwxXDM1N1wxMFwwXDFcMzU3XDFcMFwyXDM1NyIrCi0gICAgIlwzXDBcMVwzNTdcMVwwXDFcMzU2XDJcMzU3XDExXDBcM1w1N1w0XDAiKwotICAgICJcMVw1N1w1XDBcNlw1N1wxXDBcN1w1N1wxXDM3NVwzXDU3XDFcMCIrCi0gICAgIlw3XDU3XDFcMFwzXDU3XDFcMFw1XDU3XDZcMFwzXDU3XDRcMCIrCi0gICAgIlwxXDU3XDVcMFw2XDU3XDFcMFw2XDU3XDFcMzc2XDRcNTdcMVwwIisKLSAgICAiXDdcNTdcMVwwXDNcNTdcMVwwXDVcNTdcNDZcMFwxXDM3N1w1XDAiKwotICAgICJcMVwzNzdcNTRcMFwxXHUwMTAwXDYzXDBcMVx1MDEwMVwxMFwwXDFcdTAxMDFcNTVcMCIrCi0gICAgIlwxXHUwMTAyXDEwXDBcMVx1MDEwMlw2MFwwXDFcdTAxMDNcMjRcMFwyXDE1M1wxXDAiKwotICAgICJcMzBcMTUzXDFcdTAxMDRcMzNcMTUzXDJcMTYyXDFcMFwzMFwxNjJcMVx1MDEwNVwzM1wxNjIiKwotICAgICJcMzRcMFwxXHUwMTA2XDQwXDBcM1w1N1w0XDBcMVw1N1w1XDBcNlw1NyIrCi0gICAgIlwxXDBcMTNcNTdcMVwwXDNcNTdcMVx1MDEwN1wzXDU3XDFcMFwzXDU3IisKLSAgICAiXDFcMFw1XDU3XDZcMFwzXDU3XDRcMFwxXDU3XDVcMFw2XDU3IisKLSAgICAiXDFcMFwzXDU3XDFcdTAxMDhcN1w1N1wxXDBcM1w1N1wxXHUwMTA4XDNcNTciKwotICAgICJcMVwwXDNcNTdcMVwwXDVcNTdcNDdcMFwxXHUwMTA5XDYwXDBcMVx1MDEwYSIrCi0gICAgIlwxNFwwXDFcdTAxMGFcNTRcMFwxXHUwMTBiXDQ3XDBcMlx1MDEwY1w3MlwwXDFcdTAxMGQiKwotICAgICJcMzBcMFwxXHUwMTBkXDNcMFwyXDE1M1wxXDBcMzFcMTUzXDFcdTAxMGVcMzJcMTUzIisKLSAgICAiXDJcMTYyXDFcMFwzMVwxNjJcMVx1MDEwZlwzMlwxNjJcMzVcMFwxXHUwMTEwXDM3XDAiKwotICAgICJcM1w1N1w0XDBcMVw1N1w1XDBcNlw1N1wxXDBcMTNcNTdcMVwwIisKLSAgICAiXDZcNTdcMVx1MDExMVwxXDBcM1w1N1wxXDBcNVw1N1w1XDBcMVx1MDExMiIrCi0gICAgIlwzXDU3XDNcMFwxXHUwMTEyXDFcNTdcNFwwXDFcdTAxMTJcNlw1N1wxXDAiKwotICAgICJcMTNcNTdcMVwwXDdcNTdcMVwwXDNcNTdcMVwwXDVcNTdcMzdcMCIrCi0gICAgIlwxXHUwMTEzXDEwXDBcMVx1MDExM1w1M1wwXDFcdTAxMTRcMTNcMFwxXHUwMTE0XDUyXDAiKwotICAgICJcMVx1MDExNVwxM1wwXDFcdTAxMTVcMTVcMFwyXDE1M1wxXDBcMzJcMTUzXDFcdTAxMTYiKwotICAgICJcMzFcMTUzXDJcMTYyXDFcMFwzMlwxNjJcMVx1MDExN1wzMVwxNjJcMzRcMFwxXHUwMTE4IisKLSAgICAiXDQwXDBcM1w1N1w0XDBcMVw1N1w1XDBcNVw1N1wxXHUwMTE5XDFcMCIrCi0gICAgIlwxM1w1N1wxXDBcN1w1N1wxXDBcM1w1N1wxXDBcNVw1N1w1XDAiKwotICAgICJcMVx1MDExMlw2XDBcMVx1MDExMlw1XDBcMVx1MDExMlw0NFwwXDJcMTUzXDFcMCIrCi0gICAgIlwzMVwxNTNcMVx1MDExYVwzMlwxNTNcMlwxNjJcMVwwXDMxXDE2MlwxXHUwMTFiXDMyXDE2MiIrCi0gICAgIlwzMVwwXDFcdTAxMWNcNDNcMFwzXDU3XDRcMFwxXDU3XDVcMFw2XDU3IisKLSAgICAiXDFcMFw1XDU3XDFcdTAxMWRcNVw1N1wxXDBcN1w1N1wxXDBcM1w1NyIrCi0gICAgIlwxXDBcNVw1N1wyXDE1M1wxXDBcMjZcMTUzXDFcdTAxMWVcMzVcMTUzXDJcMTYyIisKLSAgICAiXDFcMFwyNlwxNjJcMVx1MDExZlwzNVwxNjJcNlwwXDNcNTdcNFwwXDFcNTciKwotICAgICJcNVwwXDZcNTdcMVwwXDdcNTdcMVx1MDEyMFwzXDU3XDFcMFw3XDU3IisKLSAgICAiXDFcMFwzXDU3XDFcMFw1XDU3XDZcMFwzXDU3XDRcMFwxXDU3IisKLSAgICAiXDVcMFw2XDU3XDFcMFwxM1w1N1wxXDBcN1w1N1wxXDBcM1w1NyIrCi0gICAgIlwxXDBcNFw1N1wxXHUwMTIxXDZcMFwzXDU3XDRcMFwxXDU3XDVcMCIrCi0gICAgIlw2XDU3XDFcMFw1XDU3XDFcdTAxMjJcNVw1N1wxXDBcN1w1N1wxXDAiKwotICAgICJcM1w1N1wxXDBcNVw1N1w2XDBcM1w1N1w0XDBcMVw1N1w1XDAiKwotICAgICJcNlw1N1wxXDBcNVw1N1wxXHUwMTIzXDVcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDNcNTdcMVwwXDVcNTdcNlwwXDNcNTdcNFwwXDFcNTdcNVwwIisKLSAgICAiXDZcNTdcMVwwXDEzXDU3XDFcMFwzXDU3XDFcdTAxMjRcM1w1N1wxXDAiKwotICAgICJcM1w1N1wxXDBcNVw1NyI7Ci0KLSAgLyoqIAotICAgKiBUaGUgdHJhbnNpdGlvbiB0YWJsZSBvZiB0aGUgREZBCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXl0cmFucyBbXSA9IHl5X3VucGFjayh5eV9wYWNrZWQpOwotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOwotICAvLyBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAkJLy8kTk9OLU5MUy0xJAotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCQkvLyROT04tTkxTLTEkCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAkJLy8kTk9OLU5MUy0xJAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIJLy8kTk9OLU5MUy0xJAotICB9OwotCi0gIC8qKgotICAgKiBZWV9BVFRSSUJVVEVbYVN0YXRlXSBjb250YWlucyB0aGUgYXR0cmlidXRlcyBvZiBzdGF0ZSA8Y29kZT5hU3RhdGU8L2NvZGU+Ci0gICAqLwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFlZX0FUVFJJQlVURVtdID0gewotICAgICAxLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDksICAxLCAgOSwgIDEsICAxLCAgOSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAKLSAgICAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAgOSwgIDksICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAwLCAgMCwgCi0gICAgIDksICAxLCAgMSwgIDEsICA5LCAgOSwgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIAotICAgICAwLCAgOSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgOSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMCwgIDAsICAxLCAgMCwgCi0gICAgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICA5LCAgMSwgIDAsICAwLCAgMSwgIDEsIAotICAgICAwLCAgMSwgIDAsICAwLCAgMCwgIDksICAxLCAgMCwgIDAsICAxLCAgMSwgIDAsICAxLCAgMCwgIDAsICAxLCAKLSAgICAgMSwgIDksICAwLCAgMCwgIDksICA5LCAgOSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgCi0gICAgIDEsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICA5LCAgMCwgIDEsICA5LCAgMCwgIDEsIAotICAgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMSwgIDAsICAwLCAKLSAgICAgMCwgIDAsICAwLCAgMSwgIDEsICAwLCAgMSwgIDEsICAwLCAgMCwgIDAsICA5LCAgOSwgIDEsICAxLCAgMCwgCi0gICAgIDEsICAxLCAgOSwgIDksICA5LCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgLy8gcHJpdmF0ZSBpbnQgeXljb2x1bW47IAotCi0gIC8qKiAKLSAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICAvLyBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2VvZl9kb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQlwcml2YXRlIGludCBmVG9rZW5Db3VudCA9IDA7Ci0gCi0JLy8gcmVxdWlyZWQgaG9sZGVycyBmb3Igd2hpdGUtc3BhY2UgY29tcGFjdGluZwotCXByaXZhdGUgYm9vbGVhbiBmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQgPSAxOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBTdHJpbmcgZl9jb250ZXh0ID0gbnVsbDsKLQotCS8vIHN0YXRlIHN0YWNrIGZvciBoYW5kbGluZyBlbWJlZGRlZCByZWdpb25zCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCi0JcHJpdmF0ZSBTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgc3RhcnQgPSAwOwotCXByaXZhdGUgaW50IHRleHRMZW5ndGggPSAwOwotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0KLQkvLyBvZmZzZXQgZm9yIHRyYWNraW5nIHBvc2l0aW9uIHNwZWNpZmljIGJsb2NrIHRhZ3MKLQlwcml2YXRlIGludCBmT2Zmc2V0ID0gMDsKLQkKLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgYmVpbmcgb3BlbmVkCi0JcHJpdmF0ZSBTdHJpbmcgZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQotCS8vIHRoZSBsaXN0IG9mIHRhZyBuYW1lIEJsb2NrTWFya2VycwotCXByaXZhdGUgTGlzdCBmQmxvY2tNYXJrZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gcmVxdWlyZWQgdG8gbm90IHNlZWsgdGV4dCBibG9ja3Mgb24gYW4gZW5kIHRhZwotCXByaXZhdGUgYm9vbGVhbiBmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gdHJ1ZTsKLQotCXByaXZhdGUgWE1MUGFyc2VyUmVnaW9uRmFjdG9yeSBmUmVnaW9uRmFjdG9yeSA9IG5ldyBYTUxQYXJzZXJSZWdpb25GYWN0b3J5KCk7Ci0vKioKLSAqIHVzZXIgbWV0aG9kIAotICovCi1wdWJsaWMgZmluYWwgdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQlpZihjb250YWluc1RhZ05hbWUobWFya2VyLmdldFRhZ05hbWUoKSkpCi0JCXJldHVybjsKLQlmQmxvY2tNYXJrZXJzLmFkZChtYXJrZXIpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JZkJsb2NrTWFya2Vycy5yZW1vdmUobWFya2VyKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QgCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKFN0cmluZyB0YWduYW1lKSB7Ci0JaWYgKGZCbG9ja01hcmtlcnMgIT0gbnVsbCkgewotCQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChibG9ja3MuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoKChCbG9ja01hcmtlcikgYmxvY2tzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWduYW1lKSkKLQkJCQlibG9ja3MucmVtb3ZlKCk7Ci0JCX0KLQl9Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoKSB7Ci0JcmV0dXJuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZzsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoYm9vbGVhbiBuZXdWYWx1ZSkgewotCWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IG5ld1ZhbHVlOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCkgewotICAgICAgICByZXR1cm4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoZkN1cnJlbnRUYWdOYW1lKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShTdHJpbmcgbmFtZSkgewotCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7Ci0JCWlmKGNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQkJZWxzZSBpZighY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0JCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoKSB7Ci0JcmV0dXJuIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBTdHJpbmcgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KFN0cmluZyBuYW1lKSB7Ci0JSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0Jd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7Ci0JCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJcmV0dXJuIG1hcmtlci5nZXRDb250ZXh0KCk7Ci0JfQotCXJldHVybiBCTE9DS19URVhUOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsKLQlyZXR1cm4gZkJsb2NrTWFya2VyczsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsKLQlyZXR1cm4gZk9mZnNldCArIHl5Y2hhcjsKLX0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKCkgewotCXJldHVybiBpc0Jsb2NrTWFya2VyKGZDdXJyZW50VGFnTmFtZSk7Ci19Ci1wcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgewotCWlmICghZklzQmxvY2tpbmdFbmFibGVkKQotCQlyZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIGNvbnRhaW5zVGFnTmFtZSh0YWdOYW1lKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja1RhZ1NjYW4oU3RyaW5nIG5ld1RhZ05hbWUpIHsKLQliZWdpbkJsb2NrTWFya2VyU2NhbihuZXdUYWdOYW1lLCBCTE9DS19URVhUKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqCi0gKiBTcGVjaWFsIHRva2VuaXplciBzZXR1cC4gIEFsbG93cyB0b2tlbml6YXRpb24gdG8gYmUgaW5pdGlhdGVkIGF0IHRoZQotICogc3RhcnQgb2YgYSB0ZXh0IGJsb2NrIHdpdGhpbiBhICJuZXdUYWdOYW1lIiB0YWcuCi0gKgotICogRXhhbXBsZTogCi0gKglUb2tlbml6ZXIgdG9rZXIgPSBuZXcgVG9rZW5pemVyKCk7Ci0gKgl0b2tlci5zZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoZmFsc2UpOwotICoJdG9rZXIucmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKCJhZml1aHF3a2VqaHRhc2loZ2Fsa3dodHE8L3NjcmlwdGVyPjwvc2NyPjwvc2NyaXB0PmFzZ2Rhc2dhIikpOwotICoJdG9rZXIuYmVnaW5CbG9ja01hcmtlclNjYW4oInNjcmlwdCIsIEJMT0NLX1RFWFQpOwotICoJdG9rZXIuZ2V0UmVnaW9ucygpOyAKLSAqCi0gKiBSZXR1cm5zOgotICoJQkxPQ0tfVEVYVDogMC00MAotICoJWE1MX0VORF9UQUdfT1BFTjogNDEtNDIKLSAqCVhNTF9UQUdfTkFNRTogNDMtNDgKLSAqCVhNTF9UQUdfQ0xPU0U6IDQ5LTQ5Ci0gKglYTUxfQ09OVEVOVDogNTAtNTcKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tNYXJrZXJTY2FuKFN0cmluZyBuZXdUYWdOYW1lLCBTdHJpbmcgYmxvY2tjb250ZXh0KSB7Ci0JeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JZkN1cnJlbnRUYWdOYW1lID0gbmV3VGFnTmFtZTsKLX0KLS8qKgotICogTWV0aG9kIGRvU2Nhbi4KLSAqIAotICogUmV0dXJucyBhIGNvbnRleHQgcmVnaW9uIGZvciBhbGwgb2YgdGhlIHRleHQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiB1cHRvIHRoZSBlbmQgb2YgaW5wdXQgb3IKLSAqIHRvIHJpZ2h0ICpiZWZvcmUqIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2Ygc2VhcmNoU3RyaW5nCi0gKiAKLSAqIEBwYXJhbSBzZWFyY2hTdHJpbmcgLSB0YXJnZXQgc3RyaW5nIHRvIHNlYXJjaCBmb3IgZXguOiAiLS0+IiwgIjwvdGFnbmFtZSIKLSAqIEBwYXJhbSByZXF1aXJlVGFpbFNlcGFyYXRvciAtIHdoZXRoZXIgdGhlIHRhcmdldCBtdXN0IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2Ugb3IgJz4nCi0gKiBAcGFyYW0gY29udGV4dCAtIHRoZSBjb250ZXh0IG9mIHRoZSBzY2FubmVkIHJlZ2lvbiBpZiBub24temVybyBsZW5ndGgKLSAqIEBwYXJhbSBleGl0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHJlZ2lvbiB3YXMgb2Ygbm9uLXplcm8gbGVuZ3RoCi0gKiBAcGFyYW0gYWJvcnRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgc2VhcmNoU3RyaW5nIHdhcyBmb3VuZCBpbW1lZGlhdGVseQotICogQHJldHVybiBTdHJpbmcgLSB0aGUgY29udGV4dCBmb3VuZDogdGhlIGRlc2lyZWQgY29udGV4dCBvbiBhIG5vbi16ZXJvIGxlbmd0aCBtYXRjaCwgdGhlIGFib3J0Q29udGV4dCBvbiBpbW1lZGlhdGUgc3VjY2VzcwotICogQHRocm93cyBJT0V4Y2VwdGlvbgotICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb1NjYW4oU3RyaW5nIHNlYXJjaFN0cmluZywgYm9vbGVhbiByZXF1aXJlVGFpbFNlcGFyYXRvciwgU3RyaW5nIHNlYXJjaENvbnRleHQsIGludCBleGl0U3RhdGUsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWJvb2xlYW4gc3RpbGxTZWFyY2hpbmcgPSB0cnVlOwotCS8vIERpc2FibGUgZnVydGhlciBibG9jayAocHJvYmFibHkpCi0JZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JaW50IHNlYXJjaFN0cmluZ0xlbmd0aCA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsKLQlpbnQgbiA9IDA7Ci0JY2hhciBsYXN0Q2hlY2tDaGFyOwotCWludCBpOwotCWJvb2xlYW4gc2FtZSA9IGZhbHNlOwotCXdoaWxlIChzdGlsbFNlYXJjaGluZykgewotCQluID0gMDsKLQkJLy8gRW5zdXJlIHRoYXQgZW5vdWdoIGRhdGEgZnJvbSB0aGUgaW5wdXQgZXhpc3RzIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgc2VhcmNoIFN0cmluZy4KLQkJbiA9IHl5X2FkdmFuY2UoKTsKLQkJd2hpbGUobiAhPSBZWUVPRiAmJiB5eV9jdXJyZW50UG9zIDwgc2VhcmNoU3RyaW5nTGVuZ3RoKQotCQkJbiA9IHl5X2FkdmFuY2UoKTsKLQkJLy8gSWYgdGhlIGlucHV0IHdhcyB0b28gc2hvcnQgb3Igd2UndmUgZXhoYXVzdGVkIHRoZSBpbnB1dCwgc3RvcCBpbW1lZGlhdGVseS4KLQkJaWYgKG4gPT0gWVlFT0YpIHsKLQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzYW1lID0gdHJ1ZTsKLQkJCS8vIEVuc3VyZSB0aGF0IHdlJ3ZlIG5vdCBlbmNvdW50ZXJlZCBhIGNvbXBsZXRlIGJsb2NrICg8JSU+KSB0aGF0IHdhcyAqc2hvcnRlciogdGhhbiB0aGUgY2xvc2VUYWdTdHJpbmcgYW5kCi0JCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uCi0JCQkvLyBDaGVjayB0aGUgY2hhcmFjdGVycyBpbiB0aGUgdGFyZ2V0IHZlcnN1cyB0aGUgbGFzdCB0YXJnZXRMZW5ndGggY2hhcmFjdGVycyByZWFkIGZyb20gdGhlIGJ1ZmZlcgotCQkJLy8gYW5kIHNlZSBpZiBpdCBtYXRjaGVzCi0JCQkKLQkJCS8vIHNhZmV0eSBjaGVjayBmb3IgYXJyYXkgYWNjZXNzZXMgKHl5X2N1cnJlbnRQb3MgaXMgdGhlICpsYXN0KiBjaGFyYWN0ZXIgd2UgY2FuIGNoZWNrIGFnYWluc3QpCi0JCQlpZih5eV9jdXJyZW50UG9zID49IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zIDw9IHl5X2J1ZmZlci5sZW5ndGgpIHsKLQkJCQlmb3IoaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdMZW5ndGg7IGkrKykgewotCQkJCQlpZihzYW1lICYmIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykKLQkJCQkJCXNhbWUgPSB5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdID09IHNlYXJjaFN0cmluZy5jaGFyQXQoaSk7Ci0JCQkJCWVsc2UgaWYoc2FtZSAmJiAhZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQotCQkJCQkJc2FtZSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc2VhcmNoU3RyaW5nLmNoYXJBdChpKSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gc2FmZXR5IGNoZWNrIGZhaWxlZDsgbm8gbWF0Y2ggaXMgcG9zc2libGUgcmlnaHQgbm93Ci0JCQllbHNlIHsKLQkJCQlzYW1lID0gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoc2FtZSAmJiByZXF1aXJlVGFpbFNlcGFyYXRvciAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCkgewotCQkJCS8vIEFkZGl0aW9uYWwgY2hlY2sgZm9yIGNsb3NlIHRhZ3MgdG8gZW5zdXJlIHRoYXQgdGFyZ2V0U3RyaW5nPSI8L3NjcmlwdCIgZG9lc24ndCBtYXRjaAotCQkJCS8vICI8L3NjcmlwdFMiCi0JCQkJbGFzdENoZWNrQ2hhciA9IHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXTsKLQkJCQkvLyBTdWNjZWVkIG9uICI8L3NjcmlwdD4iIGFuZCAiPC9zY3JpcHQgIgotCQkJCWlmKGxhc3RDaGVja0NoYXIgPT0gJz4nIHx8IENoYXJhY3Rlci5pc1doaXRlc3BhY2UobGFzdENoZWNrQ2hhcikpCi0JCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdGlsbFNlYXJjaGluZyA9ICFzYW1lIHx8ICh5eV9jdXJyZW50UG9zIDwgeXlfc3RhcnRSZWFkICsgc2VhcmNoU3RyaW5nTGVuZ3RoKTsKLQkJCX0KLQkJfQotCX0KLQlpZiAobiAhPSBZWUVPRiB8fCBzYW1lKSB7Ci0JCS8vIFdlJ3ZlIHN0b3BwZWQgc2hvcnQgb2YgdGhlIGVuZCBvciBkZWZpbml0ZWx5IGZvdW5kIGEgbWF0Y2gKLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsKLQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCS8vIElmIHRoZSBzZWFyY2hTdHJpbmcgb2NjdXJzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB3aGF0IHdvdWxkIGhhdmUKLQkJLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkKLQkJaWYgKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCXl5YmVnaW4oaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSk7Ci0JCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOwotCQl9Ci0JfQotCWVsc2UgewotCQkvLyBXZSByYW4gdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQKLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsKLQkJeXlfY3VycmVudFBvcysrOwotCX0KLQl5eWJlZ2luKGV4aXRTdGF0ZSk7Ci0JLy8gSWYgdGhlIGVuZGluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQotCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5Ci0JaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkKLQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsKLQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqCi0gKiBBIGdlbmVyaWMgbG9va2FoZWFkLWxpa2Ugb3BlcmF0aW9uCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvQmxvY2tTY2FuKFN0cmluZyB0YXJnZXQsIFN0cmluZyB0YXJnZXRDb250ZXh0LCBpbnQgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlyZXR1cm4gZG9TY2FuKHRhcmdldCwgZmFsc2UsIHRhcmdldENvbnRleHQsIGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUsIGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqIGRvZXMgYSBsb29rYWhlYWQgZm9yIHRoZSBjdXJyZW50IHRhZyBuYW1lCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvQmxvY2tUYWdTY2FuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKTsKLQlyZXR1cm4gZG9TY2FuKCI8LyIgKyBmQ3VycmVudFRhZ05hbWUsIHRydWUsIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpLCBZWUlOSVRJQUwsIFlZSU5JVElBTCk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kCi0gKgotICogQ29udmVydHMgdGhlIHJhdyBjb250ZXh0IFN0cmluZyByZXR1cm5lZCBieSB0aGUgcHJpbUdldE5leHRUb2tlbigpCi0gKiBtZXRob2QgaW50byBhIGZ1bGwgSVRleHRSZWdpb24gYnkgcHVsbGluZyBpbiB2YWx1ZXMgZm9yIHRoZQotICogY3VycmVudCBvZmZzZXQgd2l0aGluIHRoZSBzY2FubmluZyB0ZXh0LgotICoKLSAqIFJldHVybnMgbnVsbCB3aGVuIEVPRiBpcyBlbmNvdW50ZXJlZCBhbmQgYXR0YWNoZXMgaW50ZXJtaXR0ZW50bHkKLSAqIGRpc2NvdmVyZWQgd2hpdGVzcGFjZSBvbnRvIHRoZSBlbmQgb2YgdXNlZnVsIHJlZ2lvbnMuCi0gKgotICogTm90ZSB0aGF0IHRoaXMgYWxnb3JpdGhtIGNhY2hlcyB0aGUgdG9rZW4gZm9sbG93aW5nIHRoZSBvbmUgYmVpbmcgcmV0dXJuZWQKLSAqIHNvIHRoYXQgd2hpdGVzcGFjZSBjYW4gYmUgY29sbGFwc2VkLgotICovCi1wdWJsaWMgZmluYWwgSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkvLyBsb2FkIHRoZSBzdGFydGluZyBub24td2hpdGVzcGFjZSB0b2tlbiAoYXNzdW1lIHRoYXQgaXQgaXMgc28pCi0JaWYgKGZTaG91bGRMb2FkQnVmZmVyZWQpIHsKLQkJY29udGV4dCA9IGZCdWZmZXJlZENvbnRleHQ7Ci0JCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7Ci0JCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7Ci0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQl9Ci0JZWxzZSB7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCWlmIChjb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgewotCQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkKLQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsKLQkJCWVsc2UKLQkJCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7Ci0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JCX0KLQkJc3RhcnQgPSB5eWNoYXI7Ci0JCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOwotCQlpZiAoeXlfYXRFT0YpIHsKLQkJCWZUb2tlbkNvdW50Kys7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkvLyBzdG9yZSB0aGUgbmV4dCB0b2tlbgotCWZfY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQlpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgewotCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQotCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7Ci0JCWVsc2UKLQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0JfQotCWVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsKLQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsKLQl9Ci0JZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JfQotCWZCdWZmZXJlZENvbnRleHQgPSBmX2NvbnRleHQ7Ci0JZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7Ci0JZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsKLQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gdHJ1ZTsKLQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCA9PSBXSElURV9TUEFDRSkgewotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCWxlbmd0aCArPSBmQnVmZmVyZWRMZW5ndGg7Ci0JfQotCWlmIChjb250ZXh0ID09IG51bGwpIHsKLQkJLy8gRU9GCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkaXNjb3ZlcmVkICIgKyBmVG9rZW5Db3VudCArICIgdG9rZW5zLiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlmVG9rZW5Db3VudCsrOwotCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBmQ3VycmVudFRhZ05hbWUpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBYTUxUb2tlbml6ZXIoKXsKLQlzdXBlcigpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBYTUxUb2tlbml6ZXIoY2hhcltdIGNoYXJBcnJheSl7Ci0JCXRoaXMobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7Ci0JcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5LCBpbnQgbmV3T2Zmc2V0KSB7Ci0JcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCBuZXdPZmZzZXQpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIDApOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4sIGludCBuZXdPZmZzZXQpIHsKLQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIG5ld09mZnNldCk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4pIHsKLQlyZXNldChpbiwgMCk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kICoKLSAqCi0gKiBSZXNldCBpbnRlcm5hbCBjb3VudGVycyBhbmQgdmFycyB0byAibmV3bHkgY3JlYXRlZCIgdmFsdWVzLCBpbiB0aGUgaG9wZXMKLSAqIHRoYXQgcmVzZXR0aW5nIGEgcHJlLWV4aXN0aW5nIHRva2VuaXplciBpcyBmYXN0ZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmUuCi0gKgotICogVGhpcyBtZXRob2QgY29udGFpbnMgY29kZSBibG9ja3MgdGhhdCB3ZXJlIGVzc2VudGlhbGx5IGR1cGxpY2F0ZWQgZnJvbSB0aGUKLSAqIDxlbT5nZW5lcmF0ZWQ8L2VtPiBvdXRwdXQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGJlZm9yZSB0aGlzIG1ldGhvZCB3YXMKLSAqIGFkZGVkLiAgVGhvc2UgY29kZSBibG9ja3Mgd2VyZSB1bmRlciB0aGUgYWJvdmUgY29weXJpZ2h0LgotICovCi1wdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgewotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlc2V0dGluZyB0b2tlbml6ZXIiKTsvLyROT04tTkxTLTEkCi0JfQotCWZPZmZzZXQgPSBuZXdPZmZzZXQ7Ci0KLQkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JeXlfcmVhZGVyID0gaW47Ci0KLQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JeXlfc3RhdGUgPSAwOwotCi0JLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0JdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0JamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0KLQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCXl5X21hcmtlZFBvcyA9IDA7Ci0KLQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0JLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0JeXlfc3RhcnRSZWFkID0gMDsKLQotCS8qKiAKLQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLQkgKiBmcm9tIGlucHV0IAotCSAqLwotCXl5X2VuZFJlYWQgPSAwOwotCi0JLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JeXlsaW5lID0gMDsKLQotCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCXl5Y2hhciA9IDA7Ci0KLQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JeXlfYXRFT0YgPSBmYWxzZTsKLQotCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotCS8qIHVzZXIgdmFyczogKi8KLQlmVG9rZW5Db3VudCA9IDA7Ci0gCi0JZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCWZCdWZmZXJlZFN0YXJ0ID0gMTsKLQlmQnVmZmVyZWRMZW5ndGggPSAwOwotCWZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0KLQljb250ZXh0ID0gbnVsbDsKLQlzdGFydCA9IDA7Ci0JdGV4dExlbmd0aCA9IDA7Ci0JbGVuZ3RoID0gMDsKLX0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICoKLQkgKi8KLQlwdWJsaWMgQmxvY2tUb2tlbml6ZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCVhNTFRva2VuaXplciBuZXdJbnN0YW5jZSA9IG5ldyBYTUxUb2tlbml6ZXIoKTsKLQkJLy8gZ2xvYmFsIHRhZ21hcmtlcnMgY2FuIGJlIHNoYXJlZDsgdGhleSBoYXZlIG5vIHN0YXRlIGFuZCAKLQkJLy8gYXJlIG5ldmVyIGRlc3Ryb3llZCAoZS5nLiAncmVsZWFzZScpCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBmQmxvY2tNYXJrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlCbG9ja01hcmtlciBibG9ja01hcmtlciA9IChCbG9ja01hcmtlcikgZkJsb2NrTWFya2Vycy5nZXQoaSk7Ci0JCQlpZihibG9ja01hcmtlci5pc0dsb2JhbCgpKQotCQkJCW5ld0luc3RhbmNlLmFkZEJsb2NrTWFya2VyKGJsb2NrTWFya2VyKTsKLQkJfQotCQlyZXR1cm4gbmV3SW5zdGFuY2U7Ci0JfQotLyogdXNlciBtZXRob2QgKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIHNjYW5YTUxDb21tZW50VGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8gU2NhbiBmb3IgJy0tPicgYW5kIHJldHVybiB0aGUgdGV4dCB1cCB0byB0aGF0IHBvaW50IGFzCi0JLy8gICBYTUxfQ09NTUVOVF9URVhUIHVubGVzcyB0aGUgc3RyaW5nIG9jY3VycyBJTU1FRElBVEVMWSwgaW4gd2hpY2gKLQkvLyAgY2FzZSBjaGFuZ2UgdG8gdGhlIFNUX1hNTF9DT01NRU5UX0VORCBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXh0Ci0JLy8gIGNvbnRleHQgYXMgdXN1YWwuCi0JcmV0dXJuIGRvU2NhbigiLS0+IiwgZmFsc2UsIFhNTF9DT01NRU5UX1RFWFQsIFNUX1hNTF9DT01NRU5UX0VORCwgU1RfWE1MX0NPTU1FTlRfRU5EKTsKLX0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUxUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnl5X3JlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgWE1MVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgREZBIHRyYW5zaXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBpbnQgW10geXlfdW5wYWNrKFN0cmluZyBwYWNrZWQpIHsKLSAgICBpbnQgW10gdHJhbnMgPSBuZXcgaW50WzExMDU1XTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAzNzM0KSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICB2YWx1ZS0tOwotICAgICAgZG8gdHJhbnNbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gdHJhbnM7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTM3MikgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotICAgIC8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8gCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICAvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsKLQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOwotCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLSAgICB5eV9yZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgLSBmcm9tIHRoZSBTRUQgSkZsZXggc2tlbGV0b24KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIHRyeSB7Ci0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotICAgIH0KLSAgICAvLyBETyBOT1QgRVhJVCB0aGUgVk0gb24gYW4gZXJyb3IKLSAgICAvLyBTeXN0ZW0uZXhpdCgxKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNvbnRhaW5zVGFnTmFtZShjaGFyW10gbWFya2VyVGFnTmFtZSwgaW50IG9mZnNldCwgaW50IHRhZ25hbWVMZW5ndGgpIHsKLQkJZm9yKGludCBqID0gMDsgaiA8IGZCbG9ja01hcmtlcnMuc2l6ZSgpOyBqKyspIHsKLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilmQmxvY2tNYXJrZXJzLmdldChqKTsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkubGVuZ3RoKCkgPT0gdGFnbmFtZUxlbmd0aCkgewotCQkJCWJvb2xlYW4gbWF0Y2hlc1NvRmFyID0gdHJ1ZTsKLQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgdGFnbmFtZUxlbmd0aCAmJiBtYXRjaGVzU29GYXI7IGkrKykgewotCQkJCQlpZihtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuY2hhckF0KGkpICE9IG1hcmtlclRhZ05hbWVbaSArIG9mZnNldF0pCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZihDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkpICE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXJUYWdOYW1lW2kgKyBvZmZzZXRdKSkKLQkJCQkJCQltYXRjaGVzU29GYXIgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihtYXRjaGVzU29GYXIpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqCi0JICogUmV0dXJuIEFMTCBvZiB0aGUgcmVnaW9ucyBzY2FubmFibGUgd2l0aGluIHRoZSByZW1haW5pbmcgdGV4dAotCSAqIE5vdGU6IGZvciB2ZXJpZmljYXRpb24gdXNlCi0JICovCi0JcHVibGljIGZpbmFsIExpc3QgZ2V0UmVnaW9ucygpIHsKLQkJTGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsKLQkJCXdoaWxlKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCXRva2Vucy5hZGQocmVnaW9uKTsKLQkJCQl9Ci0JCQkJcmVnaW9uID0gZ2V0TmV4dFRva2VuKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFN0YWNrT3ZlcmZsb3dFcnJvciBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpKyI6IGlucHV0IGNvdWxkIG5vdCBiZSB0b2tlbml6ZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRPZmZzZXQoKSwgZSk7Ly8kTk9OLU5MUy0xJAotCQkJdGhyb3cgZTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFNpbmNlIHRoaXMgaXMgY29udmVuaWVuY2UgbWV0aG9kIGFuZCBOT1QgdGhlIHJlY29tbWVuZGVkIAotCQkJLy8gd2F5IG9mIGdldHRpbmcgdG9rZW5zLCBtYW55IGVycm9ycyBhcmUgc2ltcGx5IGhpZGRlbgotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIG5vdCBoYW5kbGVkIHJldHJpZXZpbmcgcmVnaW9uczogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRva2VuczsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgZHVtcChTdHJpbmcgcykgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzICsgIiAoIiArIHl5Y2hhciArICItIiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJKHl5bGVuZ3RoKCkgKyB5eWNoYXIpICsgIik6XCciICsvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1V0aWxzLmVzY2FwZSh5eXRleHQoKSkgKyAiXCciKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JLyogdXNlciBtZXRob2QgIC0gc2tlbGV0b24uc2VkICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFT0YoKSB7Ci0JCXJldHVybiB5eV9hdEVPRjsKLQl9Ci0vKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZCAqLwotcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29udGFpbnNUYWdOYW1lKFN0cmluZyBtYXJrZXJUYWdOYW1lKSB7Ci0JSXRlcmF0b3IgYmxvY2tzID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCXdoaWxlKGJsb2Nrcy5oYXNOZXh0KCkpIHsKLQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWJsb2Nrcy5uZXh0KCk7Ci0JCWlmKG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobWFya2VyVGFnTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobWFya2VyVGFnTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0gIC8qKgotICAgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwKLSAgICogd2hlbiB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X2RvX2VvZigpIHsKLSAgICBpZiAoIXl5X2VvZl9kb25lKSB7Ci0gICAgICB5eV9lb2ZfZG9uZSA9IHRydWU7Ci0gICAgLy8gZG8gbm90aGluZywgdGhpcyBpcyB0aGUgZG93bnN0cmVhbSBwYXJzZXIncyBqb2IKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotCi0gICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgeXljaGFyKz0geXlsZW5ndGgoKTsKLQotICAgICAgYm9vbGVhbiB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICBmb3IgKHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQ7IHl5X2N1cnJlbnRQb3MgPCB5eV9tYXJrZWRQb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9jdXJyZW50UG9zKyspIHsKLSAgICAgICAgc3dpdGNoICh5eV9idWZmZXJbeXlfY3VycmVudFBvc10pIHsKLSAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIHl5X2NvdW50ZWQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgaWYgKHl5X2NvdW50ZWQpCi0gICAgICAgICAgICB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eWxpbmUrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgeXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh5eV9jb3VudGVkKSB7Ci0gICAgICAgIGlmICggeXlfYWR2YW5jZSgpID09ICdcbicgKSB5eWxpbmUtLTsKLSAgICAgICAgaWYgKCAheXlfYXRFT0YgKSB5eV9jdXJyZW50UG9zLS07Ci0gICAgICB9Ci0KLSAgICAgIHl5X2FjdGlvbiA9IC0xOwotCi0gICAgICB5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOwotCi0gICAgICB5eV9zdGF0ZSA9IHl5X2xleGljYWxfc3RhdGU7Ci0KLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0gICAgICAgICAgaW50IHl5X25leHQgPSB5eXRyYW5zWyB5eV9yb3dNYXBbeXlfc3RhdGVdICsgeXljbWFwW3l5X2lucHV0XSBdOwotICAgICAgICAgIGlmICh5eV9uZXh0ID09IC0xKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgeXlfc3RhdGUgPSB5eV9uZXh0OwotCi0gICAgICAgICAgaW50IHl5X2F0dHJpYnV0ZXMgPSBZWV9BVFRSSUJVVEVbeXlfc3RhdGVdOwotICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiAxKSA+IDAgKSB7Ci0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOyAKLSAgICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiA4KSA+IDAgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgeyAgICAKLQotICAgICAgICBjYXNlIDI5MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWFNMIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDI5MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjgzOiAKLSAgICAgICAgY2FzZSAyODU6IAotICAgICAgICBjYXNlIDI4NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5DREFUQSBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JeXliZWdpbihTVF9DREFUQV9URVhUKTsKLQlyZXR1cm4gWE1MX0NEQVRBX09QRU47Ci0gfQotICAgICAgICBjYXNlIDI5NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjc2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgMjk1OiBicmVhazsKLSAgICAgICAgY2FzZSAyNzU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSAyOTY6IGJyZWFrOwotICAgICAgICBjYXNlIDI3NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDI5NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDOwotIH0KLSAgICAgICAgY2FzZSAyOTg6IGJyZWFrOwotICAgICAgICBjYXNlIDI2NzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1RFTTsKLSB9Ci0gICAgICAgIGNhc2UgMjk5OiBicmVhazsKLSAgICAgICAgY2FzZSAyNjM6IAotICAgICAgICBjYXNlIDI3MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMDA6IGJyZWFrOwotICAgICAgICBjYXNlIDIzNzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5DaGFyUmVmIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQ0hBUl9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDMwMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjM0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfQ09NTUVOVCk7Ci0JcmV0dXJuIFhNTF9DT01NRU5UX09QRU47Ci0gfQotICAgICAgICBjYXNlIDMwMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE1OiAKLSAgICAgICAgY2FzZSAyMTY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMDM6IGJyZWFrOwotICAgICAgICBjYXNlIDIxNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiY29tbWVudCBlbmQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihZWUlOSVRJQUwpOwotCXJldHVybiBYTUxfQ09NTUVOVF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzA0OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkNEQVRBIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0NEQVRBX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMDU6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5QRVJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX1BFX1JFRkVSRU5DRTsKLSB9Ci0gICAgICAgIGNhc2UgMzA2OiBicmVhazsKLSAgICAgICAgY2FzZSAyMDk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuRW50aXR5UmVmIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfRU5USVRZX1JFRkVSRU5DRTsKLSB9Ci0gICAgICAgIGNhc2UgMzA3OiBicmVhazsKLSAgICAgICAgY2FzZSAxNjA6IAotICAgICAgICBjYXNlIDE3NDogCi0gICAgICAgIGNhc2UgMTgyOiAKLSAgICAgICAgICB7IAotCXJldHVybiBYTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQ7Ci0gfQotICAgICAgICBjYXNlIDMwODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ4OiAKLSAgICAgICAgICB7IAotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVtcHR5IHRhZyBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIFhNTF9FTVBUWV9UQUdfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMwOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTMzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzEwOiBicmVhazsKLSAgICAgICAgY2FzZSAxMzI6IAotICAgICAgICAgIHsgCi0JCS8vIGVuZGVkIHdpdGggbm90aGluZyBpbnNpZGUKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMTE6IGJyZWFrOwotICAgICAgICBjYXNlIDEyODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgicHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzEyOiBicmVhazsKLSAgICAgICAgY2FzZSAxMjA6IAotICAgICAgICAgIHsgCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9PUEVOOwotIH0KLSAgICAgICAgY2FzZSAzMTM6IGJyZWFrOwotICAgICAgICBjYXNlIDExOTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5wcm9jZXNzaW5nIGluc3RydWN0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfUEkpOwotICAgICAgICByZXR1cm4gWE1MX1BJX09QRU47Ci0gfQotICAgICAgICBjYXNlIDMxNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMxNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTc6IAotICAgICAgICBjYXNlIDU5OiAKLSAgICAgICAgY2FzZSA2MDogCi0gICAgICAgIGNhc2UgNjE6IAotICAgICAgICBjYXNlIDEzNzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgMzE2OiBicmVhazsKLSAgICAgICAgY2FzZSA1NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSAzMTc6IGJyZWFrOwotICAgICAgICBjYXNlIDU1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMxODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTE6IAotICAgICAgICBjYXNlIDUyOiAKLSAgICAgICAgY2FzZSA1MzogCi0gICAgICAgICAgeyAKLQkvLyBibG9jayBzY2FuIHVudGlsIGNsb3NlIGlzIGZvdW5kCi0JcmV0dXJuIGRvU2NhbigiPz4iLCBmYWxzZSwgWE1MX1BJX0NPTlRFTlQsIFNUX1hNTF9QSV9UQUdfQ0xPU0UsIFNUX1hNTF9QSV9UQUdfQ0xPU0UpOwotIH0KLSAgICAgICAgY2FzZSAzMTk6IGJyZWFrOwotICAgICAgICBjYXNlIDUwOiAKLSAgICAgICAgICB7IAotICAgICAgICB5eWJlZ2luKFNUX1BJX0NPTlRFTlQpOwotICAgICAgICByZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDMyMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDY6IAotICAgICAgICBjYXNlIDQ3OiAKLSAgICAgICAgY2FzZSA0ODogCi0gICAgICAgIGNhc2UgNDk6IAotICAgICAgICBjYXNlIDEyOTogCi0gICAgICAgIGNhc2UgMTMwOiAKLSAgICAgICAgY2FzZSAxMzE6IAotICAgICAgICBjYXNlIDIxNzogCi0gICAgICAgIGNhc2UgMjM5OiAKLSAgICAgICAgY2FzZSAyNDA6IAotICAgICAgICBjYXNlIDI1MjogCi0gICAgICAgIGNhc2UgMjUzOiAKLSAgICAgICAgY2FzZSAyNjI6IAotICAgICAgICBjYXNlIDI3MjogCi0gICAgICAgIGNhc2UgMjgwOiAKLSAgICAgICAgY2FzZSAyODQ6IAotICAgICAgICBjYXNlIDI4NzogCi0gICAgICAgIGNhc2UgMjg4OiAKLSAgICAgICAgY2FzZSAyODk6IAotICAgICAgICBjYXNlIDI5MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgicHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfUElfV1MpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMjE6IGJyZWFrOwotICAgICAgICBjYXNlIDQxOiAKLSAgICAgICAgY2FzZSA0MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiY29tbWVudCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLSB9Ci0gICAgICAgIGNhc2UgMzIyOiBicmVhazsKLSAgICAgICAgY2FzZSA0MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiTElORSBGRUVEIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgMzIzOiBicmVhazsKLSAgICAgICAgY2FzZSAwOiAKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgIGNhc2UgMTIyOiAKLSAgICAgICAgY2FzZSAxMjQ6IAotICAgICAgICBjYXNlIDIwNzogCi0gICAgICAgIGNhc2UgMjA4OiAKLSAgICAgICAgY2FzZSAyMzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuWE1MIGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSAzMjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDU6IAotICAgICAgICBjYXNlIDg6IAotICAgICAgICBjYXNlIDk6IAotICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgY2FzZSAxMjogCi0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgY2FzZSAxNTogCi0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICBjYXNlIDE4OiAKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgIGNhc2UgMjA6IAotICAgICAgICBjYXNlIDIxOiAKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgY2FzZSA0NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgid2hpdGUgc3BhY2UiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgMzI1OiBicmVhazsKLSAgICAgICAgY2FzZSAxNjogCi0gICAgICAgIGNhc2UgNzE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImluYXBwcm9wcmlhdGUgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDMyNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICBjYXNlIDEwNjogCi0gICAgICAgIGNhc2UgMTA3OiAKLSAgICAgICAgY2FzZSAxOTM6IAotICAgICAgICBjYXNlIDIyOTogCi0gICAgICAgIGNhc2UgMjQ4OiAKLSAgICAgICAgY2FzZSAyNTk6IAotICAgICAgICBjYXNlIDI2OTogCi0gICAgICAgIGNhc2UgMjc3OiAKLSAgICAgICAgY2FzZSAyODE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDMyNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICBjYXNlIDExMzogCi0gICAgICAgIGNhc2UgMTE0OiAKLSAgICAgICAgY2FzZSAyMDQ6IAotICAgICAgICBjYXNlIDIzMzogCi0gICAgICAgIGNhc2UgMjUwOiAKLSAgICAgICAgY2FzZSAyNjA6IAotICAgICAgICBjYXNlIDI3MDogCi0gICAgICAgIGNhc2UgMjc4OiAKLSAgICAgICAgY2FzZSAyODI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgMzI4OiBicmVhazsKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgIGNhc2UgNzI6IAotICAgICAgICBjYXNlIDgzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbnN0YXJ0IHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX09QRU47Ci0gfQotICAgICAgICBjYXNlIDMyOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM6IAotICAgICAgICBjYXNlIDM0OiAKLSAgICAgICAgY2FzZSAzNzogCi0gICAgICAgIGNhc2UgMzg6IAotICAgICAgICBjYXNlIDM5OiAKLSAgICAgICAgY2FzZSA0MzogCi0gICAgICAgIGNhc2UgNDQ6IAotICAgICAgICBjYXNlIDU0OiAKLSAgICAgICAgY2FzZSA1ODogCi0gICAgICAgIGNhc2UgNjI6IAotICAgICAgICBjYXNlIDY0OiAKLSAgICAgICAgY2FzZSA2ODogCi0gICAgICAgIGNhc2UgNzQ6IAotICAgICAgICBjYXNlIDgwOiAKLSAgICAgICAgY2FzZSA4NTogCi0gICAgICAgIGNhc2UgODY6IAotICAgICAgICBjYXNlIDg3OiAKLSAgICAgICAgY2FzZSA4ODogCi0gICAgICAgIGNhc2UgOTA6IAotICAgICAgICBjYXNlIDkxOiAKLSAgICAgICAgY2FzZSA5MzogCi0gICAgICAgIGNhc2UgOTg6IAotICAgICAgICBjYXNlIDEwMzogCi0gICAgICAgIGNhc2UgMTEwOiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJU3lzdGVtLm91dC5wcmludGxuKCIhISF1bmV4cGVjdGVkISEhOiBcIiIgKyB5eXRleHQoKSArICJcIjoiICsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCXl5Y2hhciArICItIiArICh5eWNoYXIgKyB5eWxlbmd0aCgpKSk7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBVTkRFRklORUQ7Ci0gfQotICAgICAgICBjYXNlIDMzMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzU6IAotICAgICAgICBjYXNlIDM2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJDREFUQSB0ZXh0Iik7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBibG9ja0NvbnRleHQgPSBkb0Jsb2NrU2NhbigiXV0+IiwgWE1MX0NEQVRBX1RFWFQsIFNUX0NEQVRBX0VORCk7Ly8kTk9OLU5MUy0xJAotCWlmKGJsb2NrQ29udGV4dCA9PSBYTUxfQ0RBVEFfVEVYVCkKLQkJeXliZWdpbihTVF9DREFUQV9FTkQpOwotCXJldHVybiBibG9ja0NvbnRleHQ7Ci0gfQotICAgICAgICBjYXNlIDMzMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMzMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDMzMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjc6IAotICAgICAgICBjYXNlIDY5OiAKLSAgICAgICAgY2FzZSA3MDogCi0gICAgICAgIGNhc2UgMTQ1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgMzM0OiBicmVhazsKLSAgICAgICAgY2FzZSA3MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWlmKGlzQmxvY2tNYXJrZXIoKSkgewotICAgICAgICAJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JfQotCWVsc2UKLSAgICAgICAgCXl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMzNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzU6IAotICAgICAgICBjYXNlIDc2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMzY6IGJyZWFrOwotICAgICAgICBjYXNlIDc3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMzc6IGJyZWFrOwotICAgICAgICBjYXNlIDc4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlcXVhbHMiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDMzODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzk6IAotICAgICAgICBjYXNlIDgxOiAKLSAgICAgICAgY2FzZSA4MjogCi0gICAgICAgIGNhc2UgMTUyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgMzM5OiBicmVhazsKLSAgICAgICAgY2FzZSA4NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZGVjbGFyYXRpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzQwOiBicmVhazsKLSAgICAgICAgY2FzZSA4OTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSB0eXBlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQpOwotCXJldHVybiBYTUxfRE9DVFlQRV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzNDE6IGJyZWFrOwotICAgICAgICBjYXNlIDkyOiAKLSAgICAgICAgY2FzZSA5NDogCi0gICAgICAgIGNhc2UgOTU6IAotICAgICAgICBjYXNlIDk2OiAKLSAgICAgICAgY2FzZSAxNjY6IAotICAgICAgICBjYXNlIDE2NzogCi0gICAgICAgIGNhc2UgMTcwOiAKLSAgICAgICAgY2FzZSAxNzE6IAotICAgICAgICBjYXNlIDIyNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBwdWJsaWMgcmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGOwotIH0KLSAgICAgICAgY2FzZSAzNDI6IGJyZWFrOwotICAgICAgICBjYXNlIDk3OiAKLSAgICAgICAgY2FzZSA5OTogCi0gICAgICAgIGNhc2UgMTAwOiAKLSAgICAgICAgY2FzZSAxMDE6IAotICAgICAgICBjYXNlIDE3ODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBzeXN0ZW0gcmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGOwotIH0KLSAgICAgICAgY2FzZSAzNDM6IGJyZWFrOwotICAgICAgICBjYXNlIDEwMjogCi0gICAgICAgIGNhc2UgMTA0OiAKLSAgICAgICAgY2FzZSAxMDU6IAotICAgICAgICBjYXNlIDE4NjogCi0gICAgICAgIGNhc2UgMTg3OiAKLSAgICAgICAgY2FzZSAxOTA6IAotICAgICAgICBjYXNlIDE5MTogCi0gICAgICAgIGNhc2UgMjI3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCk7Ci0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzQ0OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzQ1OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDk6IAotICAgICAgICBjYXNlIDExMTogCi0gICAgICAgIGNhc2UgMTEyOiAKLSAgICAgICAgY2FzZSAxOTc6IAotICAgICAgICBjYXNlIDE5ODogCi0gICAgICAgIGNhc2UgMjAxOiAKLSAgICAgICAgY2FzZSAyMDI6IAotICAgICAgICBjYXNlIDIzMTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVCk7Ci0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzQ2OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzNDc6IGJyZWFrOwotICAgICAgICBjYXNlIDExODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5lbmQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9FTkRfVEFHX09QRU47Ci0gfQotICAgICAgICBjYXNlIDM0ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE2OiAKLSAgICAgICAgY2FzZSAxMTc6IAotICAgICAgICAgIHsgCi0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCSB9Ci0gICAgICAgIGNhc2UgMzQ5OiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICB5eV9kb19lb2YoKTsKLSAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0F0dHJpYnV0ZUVxdWFsc1JlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9BdHRyaWJ1dGVFcXVhbHNSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM2ZGQ0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0F0dHJpYnV0ZUVxdWFsc1JlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZUVxdWFsc1JlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBieXRlIGZUZXh0TGVuZ3RoID0gMTsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLQlwcml2YXRlIHNob3J0IGZMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCi0KLQlwdWJsaWMgQXR0cmlidXRlRXF1YWxzUmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBdHRyaWJ1dGVFcXVhbHNSZWdpb24oaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQl0aGlzKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmTGVuZ3RoID0gKHNob3J0KSBsZW5ndGg7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSAoc2hvcnQpIHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0F0dHJpYnV0ZU5hbWVSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlTmFtZVJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmM0MTU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlTmFtZVJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZU5hbWVSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0JLy8gc3BlY2lmeSBjb3JyZWN0IHR5cGUKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0JcHJpdmF0ZSBpbnQgZlRleHRMZW5ndGg7Ci0KLQlwdWJsaWMgQXR0cmlidXRlTmFtZVJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQXR0cmlidXRlTmFtZVJlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZUZXh0TGVuZ3RoID0gdGV4dExlbmd0aDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCWZUZXh0TGVuZ3RoICs9IDE7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCQlmVGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBSZWdpb25Ub1N0cmluZ1V0aWwudG9TdHJpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJUmVnaW9uQ2hhbmdlZEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCS8vIGlmIHRoZSByZWdpb24gaXMgYW4gZWFzeSB0eXBlIChlLmcuIGF0dHJpYnV0ZSB2YWx1ZSksCi0JCS8vIGFuZCB0aGUgcmVxdWVzdGVkIGNoYW5nZXMgYXJlIGFsbAotCQkvLyBhbHBoYW51bWVyaWMsIHRoZW4gbWFrZSB0aGUgY2hhbmdlIGhlcmUgbG9jYWxseS4KLQkJLy8gKFRoaXMgY2FuIG9idmlvdXNseSBiZSBtYWRlIG1vcmUgc29waGlzdGljYXRlZCBhcyB0aGUgbmVlZCBhcmlzZXMsCi0JCS8vIGJ1dCBzaG91bGQKLQkJLy8gYWx3YXlzIGZvbGxvdyB0aGlzIHBhdHRlcm4uKQotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdENvbnRleHRSZWdpb246OnVwZGF0ZU1vZGVsIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdFx0cmVnaW9uIHR5cGUgaXMgIiArIGZUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gY2FuSGFuZGxlID0gZmFsc2U7Ci0JCS8vIG5vdGU6IHdlJ2xsIGFsd2F5cyBoYW5kbGUgZGVsZXRlcyBmcm9tIHRoZXNlCi0JCS8vIHJlZ2lvbnMgLi4uIGlmIGl0cyBhbHJlYWR5IHRoYXQgcmVnaW9uLAotCQkvLyBkZWxldGluZyBzb21ldGhpbmcgZnJvbSBpdCB3b24ndCBjaGFuZ2UgaXRzCi0JCS8vIHR5cGUuIChyZW1lbWJlciwgdGhlIGNhbGxpbmcgcHJvZ3JhbSBuZWVkcwotCQkvLyB0byBpbnN1cmUgd2UgYXJlIG5vdCBjYWxsZWQsIGlmIG5vdCBhbGwgY29udGFpbmVkCi0JCS8vIG9uIG9uZSByZWdpb24uCi0JCWlmICgoY2hhbmdlcyA9PSBudWxsKSB8fCAoY2hhbmdlcy5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gZGVsZXRlIGNhc2UKLQkJCS8vIFdlIGNhbiBub3QgZG8gdGhlIHF1aWNrIGRlbGV0ZSwgaWYKLQkJCS8vIGlmIGFsbCB0aGUgdGV4dCBpbiBhIHJlZ2lvbiBpcyB0byBiZSBkZWxldGVkLgotCQkJLy8gT3IsIGlmIHRoZSBkZWxldGUgc3RhcnRzIGluIHRoZSB3aGl0ZSBzcGFjZSByZWdpb24uCi0JCQkvLyBJbiB0aGVzZSBjYXNlcywgYSByZXBhcnNlIGlzIG5lZWRlZC4KLQkJCS8vIE1pbm9yIG5vdGUsIHdlIHVzZSB0ZXh0RW5kLXN0YXJ0IHNpbmNlIGl0IGFsd2F5cwotCQkJLy8gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGVuZC1zdGFydC4gVGhpcyBtaWdodAotCQkJLy8gY2F1c2UgdXMgdG8gbWlzcyBhIGZldyBjYXNlcyB3ZSBjb3VsZCBoYXZlIGhhbmRsZWQsCi0JCQkvLyBidXQgd2lsbCBwcmV2ZW50IHVzIGZyb20gdHJ5aW5nIHRvIGhhbmRsZSBmdW5uaW5nIGNhc2VzCi0JCQkvLyBpbnZvbHZpbmcgd2hpdGVzcGFjZS4KLQkJCWlmICgoZlN0YXJ0ID49IGdldFRleHRFbmQoKSkgfHwgKE1hdGguYWJzKGxlbmd0aFRvUmVwbGFjZSkgPj0gZ2V0VGV4dEVuZCgpIC0gZ2V0U3RhcnQoKSkpIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgoUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHx8IFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNMZXR0ZXJPckRpZ2l0KHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9Ci0KLQkJfQotCQlpZiAoY2FuSGFuZGxlKSB7Ci0JCQkvLyBhdCB0aGlzIHBvaW50LCB3ZSBzdGlsbCBoYXZlIHRoZSBvbGQgcmVnaW9uLiBXZSB3b24ndCBjcmVhdGUgYQotCQkJLy8gbmV3IGluc3RhbmNlLCB3ZSdsbCBqdXN0IHVwZGF0ZSB0aGUgb25lIHdlIGhhdmUsIGJ5IGNoYW5naW5nCi0JCQkvLyBpdHMgZW5kIHBvc3Rpb24sCi0JCQkvLyBUaGUgcGFyZW50IGZsYXRub2RlLCB1cG9uIHJldHVybiwgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IgdXBkYXRpbmcgc2libGluZyByZWdpb25zLgotCQkJLy8gYW5kIGluIHR1cm4sIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXRzZWxmIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yCi0JCQkvLyB1cGRhdGluZyB0aGUgdGV4dCBzdG9yZSBhbmQgZG93biBzdHJlYW0gZmxhdG5vZGVzLgotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2UgaGFuZGxlZCBieSByZWdpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaW50IGxlbmd0aERpZmZlcmVuY2UgPSBVdGlsaXRpZXMuY2FsY3VsYXRlTGVuZ3RoRGlmZmVyZW5jZShjaGFuZ2VzLCBsZW5ndGhUb1JlcGxhY2UpOwotCQkJLy8gTm90ZTogd2UgYWRqdXN0IGJvdGggZW5kIGFuZCB0ZXh0IGVuZCwgYmVjYXVzZSBmb3IgYW55IGNoYW5nZQotCQkJLy8gdGhhdCBpcyBpbiBvbmx5IHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlIHJlZ2lvbiwgd2Ugc2hvdWxkIG5vdAotCQkJLy8gZG8gYSBxdWljayBjaGFuZ2UsCi0JCQkvLyBzbyAnY2FuSGFuZGxlJyBzaG91bGQgaGF2ZSBiZWVuIGZhbHNlIGZvciB0aG9zZSBjYXNlLgotCQkJLy8gVE9fRE9fRlVUVVJFOiBjYWNoZSB2YWx1ZSBvZiBjYW5IYW5kbGVBc1doaXRlU3BhY2UgZnJvbSBhYm92ZQotCQkJLy8gSWYgd2UgYXJlIGhhbmRsaW5nIGFzIHdoaXRlc3BhY2UsIHRoZXJlIGlzIG5vIG5lZWQgdG8gaW5jcmVhc2UKLQkJCS8vIHRoZSB0ZXh0IGxlbmd0aCwgb25seQotCQkJLy8gdGhlIHRvdGFsIGxlbmd0aCBpcyBjaGFuZ2luZy4KLQkJCWlmICghUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc1doaXRlU3BhY2UodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCQlmVGV4dExlbmd0aCArPSBsZW5ndGhEaWZmZXJlbmNlOwotCQkJfQotCQkJZkxlbmd0aCArPSBsZW5ndGhEaWZmZXJlbmNlOwotCQkJcmVzdWx0ID0gbmV3IFJlZ2lvbkNoYW5nZWRFdmVudChwYXJlbnQuZ2V0UGFyZW50RG9jdW1lbnQoKSwgcmVxdWVzdGVyLCBwYXJlbnQsIHRoaXMsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0F0dHJpYnV0ZVZhbHVlUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0F0dHJpYnV0ZVZhbHVlUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYmJiYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9BdHRyaWJ1dGVWYWx1ZVJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZVZhbHVlUmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCS8vIHNwZWNpZnkgY29ycmVjdCB0eXBlCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIGZUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlwcml2YXRlIGludCBmVGV4dExlbmd0aDsKLQotCXB1YmxpYyBBdHRyaWJ1dGVWYWx1ZVJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQXR0cmlidXRlVmFsdWVSZWdpb24oaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQl0aGlzKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmVGV4dExlbmd0aCA9IHRleHRMZW5ndGg7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCWZUZXh0TGVuZ3RoICs9IDE7Ci0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJZlRleHRMZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCVJlZ2lvbkNoYW5nZWRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBpZiB0aGUgcmVnaW9uIGlzIGFuIGVhc3kgdHlwZSAoZS5nLiBhdHRyaWJ1dGUgdmFsdWUpLAotCQkvLyBhbmQgdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIGFyZSBhbGwKLQkJLy8gYWxwaGFudW1lcmljLCB0aGVuIG1ha2UgdGhlIGNoYW5nZSBoZXJlIGxvY2FsbHkuCi0JCS8vIChUaGlzIGNhbiBvYnZpb3VzbHkgYmUgbWFkZSBtb3JlIHNvcGhpc3RpY2F0ZWQgYXMgdGhlIG5lZWQgYXJpc2VzLAotCQkvLyBidXQgc2hvdWxkCi0JCS8vIGFsd2F5cyBmb2xsb3cgdGhpcyBwYXR0ZXJuLikKLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRDb250ZXh0UmVnaW9uOjp1cGRhdGVNb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRcdHJlZ2lvbiB0eXBlIGlzICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIGNhbkhhbmRsZSA9IGZhbHNlOwotCQkvLyBub3RlOiB3ZSdsbCBhbHdheXMgaGFuZGxlIGRlbGV0ZXMgZnJvbSB0aGVzZQotCQkvLyByZWdpb25zIC4uLiBpZiBpdHMgYWxyZWFkeSB0aGF0IHJlZ2lvbiwKLQkJLy8gZGVsZXRpbmcgc29tZXRoaW5nIGZyb20gaXQgd29uJ3QgY2hhbmdlIGl0cwotCQkvLyB0eXBlLiAocmVtZW1iZXIsIHRoZSBjYWxsaW5nIHByb2dyYW0gbmVlZHMKLQkJLy8gdG8gaW5zdXJlIHdlIGFyZSBub3QgY2FsbGVkLCBpZiBub3QgYWxsIGNvbnRhaW5lZAotCQkvLyBvbiBvbmUgcmVnaW9uLgotCQlpZiAoKGNoYW5nZXMgPT0gbnVsbCkgfHwgKGNoYW5nZXMubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGRlbGV0ZSBjYXNlCi0JCQkvLyBXZSBjYW4gbm90IGRvIHRoZSBxdWljayBkZWxldGUsIGlmCi0JCQkvLyBpZiBhbGwgdGhlIHRleHQgaW4gYSByZWdpb24gaXMgdG8gYmUgZGVsZXRlZC4KLQkJCS8vIE9yLCBpZiB0aGUgZGVsZXRlIHN0YXJ0cyBpbiB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uLgotCQkJLy8gSW4gdGhlc2UgY2FzZXMsIGEgcmVwYXJzZSBpcyBuZWVkZWQuCi0JCQkvLyBNaW5vciBub3RlLCB3ZSB1c2UgdGV4dEVuZC1zdGFydCBzaW5jZSBpdCBhbHdheXMKLQkJCS8vIGxlc3MgdGhhbiBvciBlcXVhbCB0byBlbmQtc3RhcnQuIFRoaXMgbWlnaHQKLQkJCS8vIGNhdXNlIHVzIHRvIG1pc3MgYSBmZXcgY2FzZXMgd2UgY291bGQgaGF2ZSBoYW5kbGVkLAotCQkJLy8gYnV0IHdpbGwgcHJldmVudCB1cyBmcm9tIHRyeWluZyB0byBoYW5kbGUgZnVubmluZyBjYXNlcwotCQkJLy8gaW52b2x2aW5nIHdoaXRlc3BhY2UuCi0JCQlpZiAoKGZTdGFydCA+PSBnZXRUZXh0RW5kKCkpIHx8IChNYXRoLmFicyhsZW5ndGhUb1JlcGxhY2UpID49IGdldFRleHRFbmQoKSAtIGdldFN0YXJ0KCkpKSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB8fCBSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzTGV0dGVyT3JEaWdpdCh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmIChjYW5IYW5kbGUpIHsKLQkJCS8vIGF0IHRoaXMgcG9pbnQsIHdlIHN0aWxsIGhhdmUgdGhlIG9sZCByZWdpb24uIFdlIHdvbid0IGNyZWF0ZSBhCi0JCQkvLyBuZXcgaW5zdGFuY2UsIHdlJ2xsIGp1c3QgdXBkYXRlIHRoZSBvbmUgd2UgaGF2ZSwgYnkgY2hhbmdpbmcKLQkJCS8vIGl0cyBlbmQgcG9zdGlvbiwKLQkJCS8vIFRoZSBwYXJlbnQgZmxhdG5vZGUsIHVwb24gcmV0dXJuLCBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvciB1cGRhdGluZyBzaWJsaW5nIHJlZ2lvbnMuCi0JCQkvLyBhbmQgaW4gdHVybiwgdGhlIHN0cnVjdHVyZWREb2N1bWVudCBpdHNlbGYgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IKLQkJCS8vIHVwZGF0aW5nIHRoZSB0ZXh0IHN0b3JlIGFuZCBkb3duIHN0cmVhbSBmbGF0bm9kZXMuCi0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZSBoYW5kbGVkIGJ5IHJlZ2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgbGVuZ3RoRGlmZmVyZW5jZSA9IFV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGNoYW5nZXMsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkvLyBOb3RlOiB3ZSBhZGp1c3QgYm90aCBlbmQgYW5kIHRleHQgZW5kLCBiZWNhdXNlIGZvciBhbnkgY2hhbmdlCi0JCQkvLyB0aGF0IGlzIGluIG9ubHkgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVnaW9uLCB3ZSBzaG91bGQgbm90Ci0JCQkvLyBkbyBhIHF1aWNrIGNoYW5nZSwKLQkJCS8vIHNvICdjYW5IYW5kbGUnIHNob3VsZCBoYXZlIGJlZW4gZmFsc2UgZm9yIHRob3NlIGNhc2UuCi0JCQkvLyBUT19ET19GVVRVUkU6IGNhY2hlIHZhbHVlIG9mIGNhbkhhbmRsZUFzV2hpdGVTcGFjZSBmcm9tIGFib3ZlCi0JCQkvLyBJZiB3ZSBhcmUgaGFuZGxpbmcgYXMgd2hpdGVzcGFjZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBpbmNyZWFzZQotCQkJLy8gdGhlIHRleHQgbGVuZ3RoLCBvbmx5Ci0JCQkvLyB0aGUgdG90YWwgbGVuZ3RoIGlzIGNoYW5naW5nLgotCQkJaWYgKCFSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWZUZXh0TGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQl9Ci0JCQkvLyB1cGRhdGUgbGVuZ3RoIChhbmQgZW5kKSBhZnRlciBhYm92ZSBjaGVjayBmb3Igd2hpdGUgc3BhY2UsCi0JCQkvLyBzaW5jZQotCQkJLy8gaXQgbG9va3MgdG8gZGV0ZXJtaW5lIGlmIGF0IGVuZCBvZiByZWdpb24uCi0JCQlmTGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQlyZXN1bHQgPSBuZXcgUmVnaW9uQ2hhbmdlZEV2ZW50KHBhcmVudC5nZXRQYXJlbnREb2N1bWVudCgpLCByZXF1ZXN0ZXIsIHBhcmVudCwgdGhpcywgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9FbXB0eVRhZ0Nsb3NlUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0VtcHR5VGFnQ2xvc2VSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM5ZDY5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0VtcHR5VGFnQ2xvc2VSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgRW1wdHlUYWdDbG9zZVJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlwcml2YXRlIGludCBmTGVuZ3RoID0gMjsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBieXRlIGZUZXh0TGVuZ3RoID0gMjsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0U7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCi0KLQlwdWJsaWMgRW1wdHlUYWdDbG9zZVJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRW1wdHlUYWdDbG9zZVJlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCQlpZiAoZlRleHRMZW5ndGggIT0gdGV4dExlbmd0aCkKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGZvciB0aGlzIHJlZ2lvbiB0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaW52YWxpZCBmb3IgdGhpcyByZWdpb24gdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvRW5kVGFnT3BlblJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9FbmRUYWdPcGVuUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZDU1NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9FbmRUYWdPcGVuUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBFbmRUYWdPcGVuUmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTjsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBieXRlIGZUZXh0TGVuZ3RoID0gMjsKLQotCi0JcHVibGljIEVuZFRhZ09wZW5SZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEVuZFRhZ09wZW5SZWdpb24oaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQl0aGlzKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlpZiAoZlRleHRMZW5ndGggIT0gdGV4dExlbmd0aCkKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGZvciB0aGlzIHJlZ2lvbiB0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgRW5kVGFnT3BlblJlZ2lvbihpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLS8vCQlmVGV4dExlbmd0aCArPSAxOwotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaW52YWxpZCBmb3IgdGhpcyByZWdpb24gdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLS8vCQlmVGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBSZWdpb25Ub1N0cmluZ1V0aWwudG9TdHJpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gY2FuIG5ldmVyIGJlIHVwZGF0ZWQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0dlbmVyaWNUZW1wbGF0ZVJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9HZW5lcmljVGVtcGxhdGVSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYwNjRiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0dlbmVyaWNUZW1wbGF0ZVJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi0vKioKLSAqIAotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCwgaXRzIGp1c3QgcHJlc2VudCB0byBzZXJ2ZXIgYXMgYQotICogZ2VuZXJpYyBzdGFydGluZyBwb2ludCBmb3IgYWRkaW5nIG5ldyBzcGVjaWZpYyByZWdpb24gdHlwZXMuCi0gKiAKLSAqLwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1RlbXBsYXRlUmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCS8vIHNwZWNpZnkgY29ycmVjdCB0eXBlCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIGZUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQ7Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0JcHJpdmF0ZSBpbnQgZlRleHRMZW5ndGg7Ci0KLQotCXB1YmxpYyBHZW5lcmljVGVtcGxhdGVSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEdlbmVyaWNUZW1wbGF0ZVJlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZUZXh0TGVuZ3RoID0gdGV4dExlbmd0aDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWZUZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvUmVnaW9uVG9TdHJpbmdVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1JlZ2lvblRvU3RyaW5nVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjc4M2Y2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvUmVnaW9uVG9TdHJpbmdVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIFJlZ2lvblRvU3RyaW5nVXRpbCB7Ci0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSByZWdpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCVN0cmluZyBzaG9ydENsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcmVzdWx0ID0gc2hvcnRDbGFzc05hbWUgKyAiLS0+ICIgKyByZWdpb24uZ2V0VHlwZSgpICsgIjogIiArIHJlZ2lvbi5nZXRTdGFydCgpICsgIi0iICsgcmVnaW9uLmdldFRleHRFbmQoKSArIChyZWdpb24uZ2V0VGV4dEVuZCgpICE9IHJlZ2lvbi5nZXRFbmQoKSA/ICgiLyIgKyByZWdpb24uZ2V0RW5kKCkpIDogIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJLy8gTk9URTogaWYgdGhlIGRvY3VtZW50IGhlbGQgYnkgYW55IHJlZ2lvbiBoYXMgYmVlbiB1cGRhdGVkIGFuZCB0aGUKLQkJLy8gcmVnaW9uIG9mZnNldHMgaGF2ZSBub3QKLQkJLy8geWV0IGJlZW4gdXBkYXRlZCwgdGhlIG91dHB1dCBmcm9tIHRoaXMgbWV0aG9kIGludmFsaWQuCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1JlZ2lvblVwZGF0ZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvUmVnaW9uVXBkYXRlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDNhZmVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvUmVnaW9uVXBkYXRlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotCi0KLS8qKgotICogCi0gKiBUaGlzIGlzIGEgdXRpbGl0eSBjbGFzcyB0byBjZW50cmFsaXplICdyZWdpb24nIHVwZGF0ZS4gTm90ZTogY2FyZSBtdXN0IGJlCi0gKiB0YWtlbiB0aGF0IGlzIGlzIG5vdCB1c2VkIGZvciBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBvciBjb250YWluZXIKLSAqIHJlZ2lvbnMsIGl0cyBvbmx5IGZvciAidG9rZW4gcmVnaW9ucyIKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFJlZ2lvblVwZGF0ZVJ1bGUgewotCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGFsbExldHRlck9yRGlnaXQoU3RyaW5nIGNoYW5nZXMpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoKCk7IGkrKykgewotCQkJLy8gVE9fRE9fRlVUVVJFOiBjaGVjayB0aGF0IGEgSmF2YSBMZXR0ZXIgb3IgRGlnaXQgaXMKLQkJCS8vIHRoZSBzYW1lIHRoaW5nIGFzIGFuIFhNTCBsZXR0ZXIgb3IgZGlnaXQKLQkJCWlmICghKENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoY2hhbmdlcy5jaGFyQXQoaSkpKSkgewotCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGFsbFdoaXRlU3BhY2UoU3RyaW5nIGNoYW5nZXMpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoYW5nZXMuY2hhckF0KGkpKSkgewotCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGNhbkhhbmRsZUFzTGV0dGVyT3JEaWdpdChJVGV4dFJlZ2lvbiByZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gY2FuSGFuZGxlQXNMZXR0ZXJPckRpZ2l0KHJlZ2lvbiwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBNYWtlIHN1cmUgd2UgYXJlIGluIGEgbm9uLXdoaXRlIHNwYWNlIGFyZWEKLQkJaWYgKChyZXF1ZXN0U3RhcnQgPD0gKHBhcmVudC5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbikpKSAmJiAoYWxsTGV0dGVyT3JEaWdpdChjaGFuZ2VzKSkpIHsKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlQXNMZXR0ZXJPckRpZ2l0KElUZXh0UmVnaW9uIHJlZ2lvbiwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gTWFrZSBzdXJlIHdlIGFyZSBpbiBhIG5vbi13aGl0ZSBzcGFjZSBhcmVhCi0JCWlmICgocmVxdWVzdFN0YXJ0IDw9IChyZWdpb24uZ2V0VGV4dEVuZCgpKSkgJiYgKGFsbExldHRlck9yRGlnaXQoY2hhbmdlcykpKSB7Ci0JCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGNhbkhhbmRsZUFzV2hpdGVTcGFjZShJVGV4dFJlZ2lvbiByZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyB3ZSBkb24ndCBleHBsZWN0IGEgbnVsbCBwYXJlbnQsIGJ1dCBqdXN0IGluIGNhc2UhCi0JCS8vIChpbiB3aGljaCBjYXNlLCB3ZSBtdXN0IGJlIGRlYWxpbmcgd2l0aCByZWdpb25zIHRoYXQgYXJlCi0JCS8vIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpLgotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHJlZ2lvbiwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBpZiB3ZSBhcmUgaW4gdGhlICJ3aGl0ZSBzcGFjZSIgYXJlYSBvZiBhIHJlZ2lvbiwgdGhlbgotCQkvLyB3ZSBkb24ndCB3YW50IHRvIGhhbmRsZSwgYSByZXBhcnNlIGlzIG5lZWRlZC4KLQkJLy8gdGhlIHdoaXRlIHNwYWNlIHJlZ2lvbiBpcyBjb25zaWRlciBhbnl3aGVyZSB0aGF0IHdvdWxkCi0JCS8vIGxlYXZlIHdoaXRlc3BhY2UgYmV0d2VlbiB0aGlzIGNoYXJhY3RlciBhbmQgdGhlIHRleHQgcGFydC4KLQkJLy8gYW5kIG9mIGNvdXJzZSwgd2UgY2FuIGluc2VydCB3aGl0ZXNwYWNlIGluIHdoaXRlc3BhY2UgcmVnaW9uCi0JCS8vCi0JCS8vIGlmIHRoZXJlIGlzIG5vIHdoaXRlc3BhY2UgaW4gdGhpcyByZWdpb24sIG5vIG5lZWQgdG8gbG9vayBmdXJ0aGVyCi0JCWlmIChyZWdpb24uZ2V0RW5kKCkgPiByZWdpb24uZ2V0VGV4dEVuZCgpKSB7Ci0JCQkvLyBubyBuZWVkIHRvIGFkZCBvbmUgdG8gZW5kIG9mIHRleHQsIGFzIHdlIHVzZWQgdG8sIHNpbmNlIHdlCi0JCQkvLyBjaGFuZ2UgZGVmaW5pdGlvbiBvZiBsZW5ndGggdG8gZXF1YXRlIHRvIG9mZnNldCBwbHVzIG9uZS4KLQkJCWlmIChyZXF1ZXN0U3RhcnQgPiBwYXJlbnQuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pKSB7Ci0JCQkJLy8gb2ssIHdlIGFyZSBpbiB0aGUgd2hpdGVzcGFjZSByZWdpb24sIHNvIHdlIGNhbid0IGhhbmRsZSwKLQkJCQkvLyB1bmxlc3MKLQkJCQkvLyB3ZSBhcmUganVzdCBpbnNlcnRpbmcgd2hpdGVzcGFjZS4KLQkJCQlpZiAoYWxsV2hpdGVTcGFjZShjaGFuZ2VzKSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBjYW5IYW5kbGVBc1doaXRlU3BhY2UoSVRleHRSZWdpb24gcmVnaW9uLCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBpZiB3ZSBhcmUgaW4gdGhlICJ3aGl0ZSBzcGFjZSIgYXJlYSBvZiBhIHJlZ2lvbiwgdGhlbgotCQkvLyB3ZSBkb24ndCB3YW50IHRvIGhhbmRsZSwgYSByZXBhcnNlIGlzIG5lZWRlZC4KLQkJLy8gdGhlIHdoaXRlIHNwYWNlIHJlZ2lvbiBpcyBjb25zaWRlciBhbnl3aGVyZSB0aGF0IHdvdWxkCi0JCS8vIGxlYXZlIHdoaXRlc3BhY2UgYmV0d2VlbiB0aGlzIGNoYXJhY3RlciBhbmQgdGhlIHRleHQgcGFydC4KLQkJLy8gYW5kIG9mIGNvdXJzZSwgd2UgY2FuIGluc2VydCB3aGl0ZXNwYWNlIGluIHdoaXRlc3BhY2UgcmVnaW9uCi0JCS8vCi0JCS8vIGlmIHRoZXJlIGlzIG5vIHdoaXRlc3BhY2UgaW4gdGhpcyByZWdpb24sIG5vIG5lZWQgdG8gbG9vayBmdXJ0aGVyCi0JCWlmIChyZWdpb24uZ2V0RW5kKCkgPiByZWdpb24uZ2V0VGV4dEVuZCgpKSB7Ci0JCQkvLyBubyBuZWVkIHRvIGFkZCBvbmUgdG8gZW5kIG9mIHRleHQsIGFzIHdlIHVzZWQgdG8sIHNpbmNlIHdlCi0JCQkvLyBjaGFuZ2UgZGVmaW5pdGlvbiBvZiBsZW5ndGggdG8gZXF1YXRlIHRvIG9mZnNldCBwbHVzIG9uZS4KLQkJCWlmIChyZXF1ZXN0U3RhcnQgPiByZWdpb24uZ2V0VGV4dEVuZCgpKSB7Ci0JCQkJLy8gb2ssIHdlIGFyZSBpbiB0aGUgd2hpdGVzcGFjZSByZWdpb24sIHNvIHdlIGNhbid0IGhhbmRsZSwKLQkJCQkvLyB1bmxlc3MKLQkJCQkvLyB3ZSBhcmUganVzdCBpbnNlcnRpbmcgd2hpdGVzcGFjZS4KLQkJCQlpZiAoYWxsV2hpdGVTcGFjZShjaGFuZ2VzKSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vIG5lZWQgYW4gYWRqdXN0IHRleHQgbGVuZ3RoIEFQSSBiZWZvcmUgdGhpcyBjYW4gYmUgdXNlZAotCXN0YXRpYyBwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlTW9kZWwoSVRleHRSZWdpb24gcmVnaW9uLCBPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJUmVnaW9uQ2hhbmdlZEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCS8vIGlmIHRoZSByZWdpb24gaXMgYW4gZWFzeSB0eXBlIChlLmcuIGF0dHJpYnV0ZSB2YWx1ZSksCi0JCS8vIGFuZCB0aGUgcmVxdWVzdGVkIGNoYW5nZXMgYXJlIGFsbAotCQkvLyBhbHBoYW51bWVyaWMsIHRoZW4gbWFrZSB0aGUgY2hhbmdlIGhlcmUgbG9jYWxseS4KLQkJLy8gKFRoaXMgY2FuIG9idmlvdXNseSBiZSBtYWRlIG1vcmUgc29waGlzdGljYXRlZCBhcyB0aGUgbmVlZCBhcmlzZXMsCi0JCS8vIGJ1dCBzaG91bGQKLQkJLy8gYWx3YXlzIGZvbGxvdyB0aGlzIHBhdHRlcm4uKQotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdENvbnRleHRSZWdpb246OnVwZGF0ZU1vZGVsIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRcdFx0cmVnaW9uIHR5cGUgaXMgIiArIHJlZ2lvbi5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiBjYW5IYW5kbGUgPSBmYWxzZTsKLQkJLy8gbm90ZTogd2UnbGwgYWx3YXlzIGhhbmRsZSBkZWxldGVzIGZyb20gdGhlc2UKLQkJLy8gcmVnaW9ucyAuLi4gaWYgaXRzIGFscmVhZHkgdGhhdCByZWdpb24sCi0JCS8vIGRlbGV0aW5nIHNvbWV0aGluZyBmcm9tIGl0IHdvbid0IGNoYW5nZSBpdHMKLQkJLy8gdHlwZS4gKHJlbWVtYmVyLCB0aGUgY2FsbGluZyBwcm9ncmFtIG5lZWRzCi0JCS8vIHRvIGluc3VyZSB3ZSBhcmUgbm90IGNhbGxlZCwgaWYgbm90IGFsbCBjb250YWluZWQKLQkJLy8gb24gb25lIHJlZ2lvbi4KLQkJaWYgKChjaGFuZ2VzID09IG51bGwpIHx8IChjaGFuZ2VzLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBkZWxldGUgY2FzZQotCQkJLy8gV2UgY2FuIG5vdCBkbyB0aGUgcXVpY2sgZGVsZXRlLCBpZgotCQkJLy8gaWYgYWxsIHRoZSB0ZXh0IGluIGEgcmVnaW9uIGlzIHRvIGJlIGRlbGV0ZWQuCi0JCQkvLyBPciwgaWYgdGhlIGRlbGV0ZSBzdGFydHMgaW4gdGhlIHdoaXRlIHNwYWNlIHJlZ2lvbi4KLQkJCS8vIEluIHRoZXNlIGNhc2VzLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkJLy8gTWlub3Igbm90ZSwgd2UgdXNlIHRleHRFbmQtc3RhcnQgc2luY2UgaXQgYWx3YXlzCi0JCQkvLyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gZW5kLXN0YXJ0LiBUaGlzIG1pZ2h0Ci0JCQkvLyBjYXVzZSB1cyB0byBtaXNzIGEgZmV3IGNhc2VzIHdlIGNvdWxkIGhhdmUgaGFuZGxlZCwKLQkJCS8vIGJ1dCB3aWxsIHByZXZlbnQgdXMgZnJvbSB0cnlpbmcgdG8gaGFuZGxlIGZ1bm5pbmcgY2FzZXMKLQkJCS8vIGludm9sdmluZyB3aGl0ZXNwYWNlLgotCQkJaWYgKChyZWdpb24uZ2V0U3RhcnQoKSA+PSByZWdpb24uZ2V0VGV4dEVuZCgpKSB8fCAoTWF0aC5hYnMobGVuZ3RoVG9SZXBsYWNlKSA+PSByZWdpb24uZ2V0VGV4dEVuZCgpIC0gcmVnaW9uLmdldFN0YXJ0KCkpKSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHJlZ2lvbiwgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHx8IFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNMZXR0ZXJPckRpZ2l0KHJlZ2lvbiwgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQlpZiAoY2FuSGFuZGxlKSB7Ci0JCQkvLyBhdCB0aGlzIHBvaW50LCB3ZSBzdGlsbCBoYXZlIHRoZSBvbGQgcmVnaW9uLiBXZSB3b24ndCBjcmVhdGUgYQotCQkJLy8gbmV3IGluc3RhbmNlLCB3ZSdsbCBqdXN0IHVwZGF0ZSB0aGUgb25lIHdlIGhhdmUsIGJ5IGNoYW5naW5nCi0JCQkvLyBpdHMgZW5kIHBvc3Rpb24sCi0JCQkvLyBUaGUgcGFyZW50IGZsYXRub2RlLCB1cG9uIHJldHVybiwgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IgdXBkYXRpbmcgc2libGluZyByZWdpb25zLgotCQkJLy8gYW5kIGluIHR1cm4sIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXRzZWxmIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yCi0JCQkvLyB1cGRhdGluZyB0aGUgdGV4dCBzdG9yZSBhbmQgZG93biBzdHJlYW0gZmxhdG5vZGVzLgotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJjaGFuZ2UgaGFuZGxlZCBieSByZWdpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaW50IGxlbmd0aERpZmZlcmVuY2UgPSBVdGlsaXRpZXMuY2FsY3VsYXRlTGVuZ3RoRGlmZmVyZW5jZShjaGFuZ2VzLCBsZW5ndGhUb1JlcGxhY2UpOwotCQkJLy8gTm90ZTogd2UgYWRqdXN0IGJvdGggZW5kIGFuZCB0ZXh0IGVuZCwgYmVjYXVzZSBmb3IgYW55IGNoYW5nZQotCQkJLy8gdGhhdCBpcyBpbiBvbmx5IHRoZSB0cmFpbGluZyB3aGl0ZXNwYWNlIHJlZ2lvbiwgd2Ugc2hvdWxkIG5vdAotCQkJLy8gZG8gYSBxdWljayBjaGFuZ2UsCi0JCQkvLyBzbyAnY2FuSGFuZGxlJyBzaG91bGQgaGF2ZSBiZWVuIGZhbHNlIGZvciB0aG9zZSBjYXNlLgotCQkJcmVnaW9uLmFkanVzdExlbmd0aChsZW5ndGhEaWZmZXJlbmNlKTsKLQkJCS8vIFRPX0RPX0ZVVFVSRTogY2FjaGUgdmFsdWUgb2YgY2FuSGFuZGxlQXNXaGl0ZVNwYWNlIGZyb20gYWJvdmUKLQkJCS8vIElmIHdlIGFyZSBoYW5kbGluZyBhcyB3aGl0ZXNwYWNlLCB0aGVyZSBpcyBubyBuZWVkIHRvIGluY3JlYXNlCi0JCQkvLyB0aGUgdGV4dCBsZW5ndGgsIG9ubHkKLQkJCS8vIHRoZSB0b3RhbCBsZW5ndGggaXMgY2hhbmdpbmcuCi0JCQlpZiAoIVJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHJlZ2lvbiwgcGFyZW50LCBjaGFuZ2VzLCByZWdpb24uZ2V0U3RhcnQoKSwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCS8vCQkJCXJlZ2lvbi5hZGp1c3RUZXh0TGVuZ3RoKGxlbmd0aERpZmZlcmVuY2UpOwotCQkJfQotCQkJcmVzdWx0ID0gbmV3IFJlZ2lvbkNoYW5nZWRFdmVudChwYXJlbnQuZ2V0UGFyZW50RG9jdW1lbnQoKSwgcmVxdWVzdGVyLCBwYXJlbnQsIHJlZ2lvbiwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdDbG9zZVJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdDbG9zZVJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjdhZTRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvVGFnQ2xvc2VSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgVGFnQ2xvc2VSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgYnl0ZSBmTGVuZ3RoID0gMTsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBieXRlIGZUZXh0TGVuZ3RoID0gMTsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0U7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCi0KLQlwdWJsaWMgVGFnQ2xvc2VSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFRhZ0Nsb3NlUmVnaW9uKGludCBzdGFydCkgewotCQl0aGlzKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaW52YWxpZCBmb3IgdGhpcyByZWdpb24gdHlwZSIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCi0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvVGFnTmFtZVJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdOYW1lUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YjU5YzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdOYW1lUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFRhZ05hbWVSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIGZUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUU7Ci0JcHJpdmF0ZSBzaG9ydCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlwcml2YXRlIHNob3J0IGZUZXh0TGVuZ3RoOwotCi0KLQlwdWJsaWMgVGFnTmFtZVJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGFnTmFtZVJlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZUZXh0TGVuZ3RoID0gKHNob3J0KSB0ZXh0TGVuZ3RoOwotCQlmTGVuZ3RoID0gKHNob3J0KSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCWZUZXh0TGVuZ3RoICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IChzaG9ydCkgcmVnaW9uLmdldExlbmd0aCgpOwotCQlmVGV4dExlbmd0aCA9IChzaG9ydCkgcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvVGFnT3BlblJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdPcGVuUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4Y2I4NWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdPcGVuUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFRhZ09wZW5SZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIGZUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU47Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgYnl0ZSBmVGV4dExlbmd0aCA9IDE7Ci0KLQotCXB1YmxpYyBUYWdPcGVuUmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUYWdPcGVuUmVnaW9uKGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJdGhpcyhzdGFydCwgbGVuZ3RoKTsKLQkJaWYgKGZUZXh0TGVuZ3RoICE9IHRleHRMZW5ndGgpCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaW52YWxpZCBmb3IgdGhpcyByZWdpb24gdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFRhZ09wZW5SZWdpb24oaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0vLwkJZlRleHRMZW5ndGggKz0gMTsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImludmFsaWQgZm9yIHRoaXMgcmVnaW9uIHR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBSZWdpb25Ub1N0cmluZ1V0aWwudG9TdHJpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gY2FuIG5ldmVyIGJlIHVwZGF0ZWQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1doaXRlU3BhY2VPbmx5UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1doaXRlU3BhY2VPbmx5UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMGJjYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9XaGl0ZVNwYWNlT25seVJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBXaGl0ZVNwYWNlT25seVJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBieXRlIGZUZXh0TGVuZ3RoID0gMDsKLQotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuV0hJVEVfU1BBQ0U7Ci0JcHJvdGVjdGVkIGludCBmTGVuZ3RoOwotCXByb3RlY3RlZCBpbnQgZlN0YXJ0OwotCi0JcHVibGljIFdoaXRlU3BhY2VPbmx5UmVnaW9uKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlzdXBlcigpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3QoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHBvc2l0aW9uKSB7Ci0KLQkJcmV0dXJuIGZTdGFydCA8PSBwb3NpdGlvbiAmJiBwb3NpdGlvbiA8IGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCA9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dExlbmd0aChzaG9ydCBpKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGNhbGwiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHN0cmluZykgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaW52YWxpZCBjYWxsIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEZvciB0aGlzIElUZXh0UmVnaW9uIHR5cGUsIHRoZSBzdGFydCBtdXN0IGluIHRlcm1zIG9mIHdoYXQgdGhlIHJlZ2lvbgotCSAqIGV4cGVjdHMgLi4uIHRoYXQgaXMsIGl0cyBub3QgZG9jdW1lbnQgb2Zmc2V0LCBidXQgc3RhcnQgcmVsYXRpdmUgdG8KLQkgKiB3aGF0IGV2ZXIgY29udGFpbnMgaXQuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gaWYgdGhlIHJlZ2lvbiBpcyBhbiBlYXN5IHR5cGUgKGUuZy4gYXR0cmlidXRlIHZhbHVlKSwKLQkJLy8gYW5kIHRoZSByZXF1ZXN0ZWQgY2hhbmdlcyBhcmUgYWxsCi0JCS8vIGFscGhhbnVtZXJpYywgdGhlbiBtYWtlIHRoZSBjaGFuZ2UgaGVyZSBsb2NhbGx5LgotCQkvLyAoVGhpcyBjYW4gb2J2aW91c2x5IGJlIG1hZGUgbW9yZSBzb3BoaXN0aWNhdGVkIGFzIHRoZSBuZWVkIGFyaXNlcywKLQkJLy8gYnV0IHNob3VsZAotCQkvLyBhbHdheXMgZm9sbG93IHRoaXMgcGF0dGVybi4pCi0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0Q29udGV4dFJlZ2lvbjo6dXBkYXRlTW9kZWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHRyZWdpb24gdHlwZSBpcyAiICsgZlR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiBjYW5IYW5kbGUgPSBmYWxzZTsKLQkJLy8gbm90ZTogd2UnbGwgYWx3YXlzIGhhbmRsZSBkZWxldGVzIGZyb20gdGhlc2UKLQkJLy8gcmVnaW9ucyAuLi4gaWYgaXRzIGFscmVhZHkgdGhhdCByZWdpb24sCi0JCS8vIGRlbGV0aW5nIHNvbWV0aGluZyBmcm9tIGl0IHdvbid0IGNoYW5nZSBpdHMKLQkJLy8gdHlwZS4gKHJlbWVtYmVyLCB0aGUgY2FsbGluZyBwcm9ncmFtIG5lZWRzCi0JCS8vIHRvIGluc3VyZSB3ZSBhcmUgbm90IGNhbGxlZCwgaWYgbm90IGFsbCBjb250YWluZWQKLQkJLy8gb24gb25lIHJlZ2lvbi4KLQkJaWYgKChjaGFuZ2VzID09IG51bGwpIHx8IChjaGFuZ2VzLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBkZWxldGUgY2FzZQotCQkJLy8gV2UgY2FuIG5vdCBkbyB0aGUgcXVpY2sgZGVsZXRlLCBpZgotCQkJLy8gaWYgYWxsIHRoZSB0ZXh0IGluIGEgcmVnaW9uIGlzIHRvIGJlIGRlbGV0ZWQuCi0JCQkvLyBPciwgaWYgdGhlIGRlbGV0ZSBzdGFydHMgaW4gdGhlIHdoaXRlIHNwYWNlIHJlZ2lvbi4KLQkJCS8vIEluIHRoZXNlIGNhc2VzLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkJLy8gTWlub3Igbm90ZSwgd2UgdXNlIHRleHRFbmQtc3RhcnQgc2luY2UgaXQgYWx3YXlzCi0JCQkvLyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gZW5kLXN0YXJ0LiBUaGlzIG1pZ2h0Ci0JCQkvLyBjYXVzZSB1cyB0byBtaXNzIGEgZmV3IGNhc2VzIHdlIGNvdWxkIGhhdmUgaGFuZGxlZCwKLQkJCS8vIGJ1dCB3aWxsIHByZXZlbnQgdXMgZnJvbSB0cnlpbmcgdG8gaGFuZGxlIGZ1bm5pbmcgY2FzZXMKLQkJCS8vIGludm9sdmluZyB3aGl0ZXNwYWNlLgotCQkJaWYgKChmU3RhcnQgPj0gZ2V0VGV4dEVuZCgpKSB8fCAoTWF0aC5hYnMobGVuZ3RoVG9SZXBsYWNlKSA+PSBnZXRUZXh0RW5kKCkgLSBnZXRTdGFydCgpKSkgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0KLQotCQl9Ci0JCVJlZ2lvbkNoYW5nZWRFdmVudCByZXN1bHQgPSBudWxsOwotCi0JCWlmIChjYW5IYW5kbGUpIHsKLQkJCS8vIGF0IHRoaXMgcG9pbnQsIHdlIHN0aWxsIGhhdmUgdGhlIG9sZCByZWdpb24uIFdlIHdvbid0IGNyZWF0ZSBhCi0JCQkvLyBuZXcgaW5zdGFuY2UsIHdlJ2xsIGp1c3QgdXBkYXRlIHRoZSBvbmUgd2UgaGF2ZSwgYnkgY2hhbmdpbmcKLQkJCS8vIGl0cyBlbmQgcG9zdGlvbiwKLQkJCS8vIFRoZSBwYXJlbnQgZmxhdG5vZGUsIHVwb24gcmV0dXJuLCBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvciB1cGRhdGluZyBzaWJsaW5nIHJlZ2lvbnMuCi0JCQkvLyBhbmQgaW4gdHVybiwgdGhlIHN0cnVjdHVyZWREb2N1bWVudCBpdHNlbGYgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IKLQkJCS8vIHVwZGF0aW5nIHRoZSB0ZXh0IHN0b3JlIGFuZCBkb3duIHN0cmVhbSBmbGF0bm9kZXMuCi0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZSBoYW5kbGVkIGJ5IHJlZ2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgbGVuZ3RoRGlmZmVyZW5jZSA9IFV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGNoYW5nZXMsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkvLyBOb3RlOiB3ZSBhZGp1c3QgYm90aCBlbmQgYW5kIHRleHQgZW5kLCBiZWNhdXNlIGZvciBhbnkgY2hhbmdlCi0JCQkvLyB0aGF0IGlzIGluIG9ubHkgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVnaW9uLCB3ZSBzaG91bGQgbm90Ci0JCQkvLyBkbyBhIHF1aWNrIGNoYW5nZSwKLQkJCS8vIHNvICdjYW5IYW5kbGUnIHNob3VsZCBoYXZlIGJlZW4gZmFsc2UgZm9yIHRob3NlIGNhc2UuCi0JCQlmTGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0KLQkJCXJlc3VsdCA9IG5ldyBSZWdpb25DaGFuZ2VkRXZlbnQocGFyZW50LmdldFBhcmVudERvY3VtZW50KCksIHJlcXVlc3RlciwgcGFyZW50LCB0aGlzLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxDRGF0YVRleHRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MQ0RhdGFUZXh0UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZGE5ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxDRGF0YVRleHRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBYTUxDRGF0YVRleHRSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIGZUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVDsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlwcml2YXRlIGludCBmVGV4dExlbmd0aDsKLQotCi0JcHVibGljIFhNTENEYXRhVGV4dFJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgWE1MQ0RhdGFUZXh0UmVnaW9uKGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHRMZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQlmVGV4dExlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJZlRleHRMZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJLy8gVE9ETzogc2hvdWxkbid0IGNkYXRhIGJlIGxpa2UgWE1MIENvbnRlbnQgLi4uIGxlbmd0aCBhbmQgdGV4dAotCQkvLyBsZW5ndGgKLQkJLy8gYWx3YXlzIGJlIHRoZSBzYW1lLCByZWdhcmRsZXNzIG9mIHdoaXRlc3BhY2U/Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIFRPRE86IHRoaXMgaXMgYSBwcmV0dHkgbGFtZSBtZXRob2QsIHNpbmNlIFhNTCBDRGF0YSByZWdpb24gY2FuIGhhdmUKLQkJLy8gYSBtdWNoCi0JCS8vIGJldHRlciBydWxlIGZvciByZWdpb24gdXBkYXRlLCBidXQgdGhpcyBpcyB3aGF0IHByZXZpb3VzCi0JCS8vICh1bmZhY3RvcmVkKQotCQkvLyB2ZXJzaW9uIGhhZCwgc28gSSdsbCBjYXJyeSBpdCBvdmVyLCBvZiBub3cuCi0JCVJlZ2lvbkNoYW5nZWRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBpZiB0aGUgcmVnaW9uIGlzIGFuIGVhc3kgdHlwZSAoZS5nLiBhdHRyaWJ1dGUgdmFsdWUpLAotCQkvLyBhbmQgdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIGFyZSBhbGwKLQkJLy8gYWxwaGFudW1lcmljLCB0aGVuIG1ha2UgdGhlIGNoYW5nZSBoZXJlIGxvY2FsbHkuCi0JCS8vIChUaGlzIGNhbiBvYnZpb3VzbHkgYmUgbWFkZSBtb3JlIHNvcGhpc3RpY2F0ZWQgYXMgdGhlIG5lZWQgYXJpc2VzLAotCQkvLyBidXQgc2hvdWxkCi0JCS8vIGFsd2F5cyBmb2xsb3cgdGhpcyBwYXR0ZXJuLikKLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRDb250ZXh0UmVnaW9uOjp1cGRhdGVNb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRcdHJlZ2lvbiB0eXBlIGlzICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIGNhbkhhbmRsZSA9IGZhbHNlOwotCQkvLyBub3RlOiB3ZSdsbCBhbHdheXMgaGFuZGxlIGRlbGV0ZXMgZnJvbSB0aGVzZQotCQkvLyByZWdpb25zIC4uLiBpZiBpdHMgYWxyZWFkeSB0aGF0IHJlZ2lvbiwKLQkJLy8gZGVsZXRpbmcgc29tZXRoaW5nIGZyb20gaXQgd29uJ3QgY2hhbmdlIGl0cwotCQkvLyB0eXBlLiAocmVtZW1iZXIsIHRoZSBjYWxsaW5nIHByb2dyYW0gbmVlZHMKLQkJLy8gdG8gaW5zdXJlIHdlIGFyZSBub3QgY2FsbGVkLCBpZiBub3QgYWxsIGNvbnRhaW5lZAotCQkvLyBvbiBvbmUgcmVnaW9uLgotCQlpZiAoKGNoYW5nZXMgPT0gbnVsbCkgfHwgKGNoYW5nZXMubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGRlbGV0ZSBjYXNlCi0JCQkvLyBXZSBjYW4gbm90IGRvIHRoZSBxdWljayBkZWxldGUsIGlmCi0JCQkvLyBpZiBhbGwgdGhlIHRleHQgaW4gYSByZWdpb24gaXMgdG8gYmUgZGVsZXRlZC4KLQkJCS8vIE9yLCBpZiB0aGUgZGVsZXRlIHN0YXJ0cyBpbiB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uLgotCQkJLy8gSW4gdGhlc2UgY2FzZXMsIGEgcmVwYXJzZSBpcyBuZWVkZWQuCi0JCQkvLyBNaW5vciBub3RlLCB3ZSB1c2UgdGV4dEVuZC1zdGFydCBzaW5jZSBpdCBhbHdheXMKLQkJCS8vIGxlc3MgdGhhbiBvciBlcXVhbCB0byBlbmQtc3RhcnQuIFRoaXMgbWlnaHQKLQkJCS8vIGNhdXNlIHVzIHRvIG1pc3MgYSBmZXcgY2FzZXMgd2UgY291bGQgaGF2ZSBoYW5kbGVkLAotCQkJLy8gYnV0IHdpbGwgcHJldmVudCB1cyBmcm9tIHRyeWluZyB0byBoYW5kbGUgZnVubmluZyBjYXNlcwotCQkJLy8gaW52b2x2aW5nIHdoaXRlc3BhY2UuCi0JCQlpZiAoKGZTdGFydCA+PSBnZXRUZXh0RW5kKCkpIHx8IChNYXRoLmFicyhsZW5ndGhUb1JlcGxhY2UpID49IGdldFRleHRFbmQoKSAtIGdldFN0YXJ0KCkpKSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB8fCBSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzTGV0dGVyT3JEaWdpdCh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfQotCi0JCX0KLQkJaWYgKGNhbkhhbmRsZSkgewotCQkJLy8gYXQgdGhpcyBwb2ludCwgd2Ugc3RpbGwgaGF2ZSB0aGUgb2xkIHJlZ2lvbi4gV2Ugd29uJ3QgY3JlYXRlIGEKLQkJCS8vIG5ldyBpbnN0YW5jZSwgd2UnbGwganVzdCB1cGRhdGUgdGhlIG9uZSB3ZSBoYXZlLCBieSBjaGFuZ2luZwotCQkJLy8gaXRzIGVuZCBwb3N0aW9uLAotCQkJLy8gVGhlIHBhcmVudCBmbGF0bm9kZSwgdXBvbiByZXR1cm4sIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yIHVwZGF0aW5nIHNpYmxpbmcgcmVnaW9ucy4KLQkJCS8vIGFuZCBpbiB0dXJuLCB0aGUgc3RydWN0dXJlZERvY3VtZW50IGl0c2VsZiBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvcgotCQkJLy8gdXBkYXRpbmcgdGhlIHRleHQgc3RvcmUgYW5kIGRvd24gc3RyZWFtIGZsYXRub2Rlcy4KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlIGhhbmRsZWQgYnkgcmVnaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBsZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoY2hhbmdlcywgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJCS8vIE5vdGU6IHdlIGFkanVzdCBib3RoIGVuZCBhbmQgdGV4dCBlbmQsIGJlY2F1c2UgZm9yIGFueSBjaGFuZ2UKLQkJCS8vIHRoYXQgaXMgaW4gb25seSB0aGUgdHJhaWxpbmcgd2hpdGVzcGFjZSByZWdpb24sIHdlIHNob3VsZCBub3QKLQkJCS8vIGRvIGEgcXVpY2sgY2hhbmdlLAotCQkJLy8gc28gJ2NhbkhhbmRsZScgc2hvdWxkIGhhdmUgYmVlbiBmYWxzZSBmb3IgdGhvc2UgY2FzZS4KLQkJCS8vIFRPX0RPX0ZVVFVSRTogY2FjaGUgdmFsdWUgb2YgY2FuSGFuZGxlQXNXaGl0ZVNwYWNlIGZyb20gYWJvdmUKLQkJCS8vIElmIHdlIGFyZSBoYW5kbGluZyBhcyB3aGl0ZXNwYWNlLCB0aGVyZSBpcyBubyBuZWVkIHRvIGluY3JlYXNlCi0JCQkvLyB0aGUgdGV4dCBsZW5ndGgsIG9ubHkKLQkJCS8vIHRoZSB0b3RhbCBsZW5ndGggaXMgY2hhbmdpbmcuCi0JCQlpZiAoIVJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJZlRleHRMZW5ndGggKz0gbGVuZ3RoRGlmZmVyZW5jZTsKLQkJCX0KLQkJCWZMZW5ndGggKz0gbGVuZ3RoRGlmZmVyZW5jZTsKLQkJCXJlc3VsdCA9IG5ldyBSZWdpb25DaGFuZ2VkRXZlbnQocGFyZW50LmdldFBhcmVudERvY3VtZW50KCksIHJlcXVlc3RlciwgcGFyZW50LCB0aGlzLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxDb250ZW50UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTENvbnRlbnRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkwODhkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTENvbnRlbnRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLQotcHVibGljIGNsYXNzIFhNTENvbnRlbnRSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIGZUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVDsKLQkvLyBsZW5ndGggYW5kIHRleHRMZW5ndGggYXJlIGFsd2F5cyB0aGUgc2FtZSBmb3IgY29udGVudCByZWdpb24KLQkvL3ByaXZhdGUgaW50IGZUZXh0TGVuZ3RoOwotCXByaXZhdGUgaW50IGZMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCi0KLQlwdWJsaWMgWE1MQ29udGVudFJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgWE1MQ29udGVudFJlZ2lvbihpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIFRPRE86IHRoaXMgaXMgYSBwcmV0dHkgbGFtZSBtZXRob2QsIHNpbmNlIFhNTCBDb250ZW50IGNhbiBoYXZlIGEKLQkJLy8gbXVjaAotCQkvLyBiZXR0ZXIgcnVsZSBmb3IgcmVnaW9uIHVwZGF0ZSwgYnV0IHRoaXMgaXMgd2hhdCBwcmV2aW91cwotCQkvLyAodW5mYWN0b3JlZCkKLQkJLy8gdmVyc2lvbiBoYWQsIHNvIEknbGwgY2FycnkgaXQgb3Zlciwgb2Ygbm93LgotCQlSZWdpb25DaGFuZ2VkRXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgdGhlIHJlZ2lvbiBpcyBhbiBlYXN5IHR5cGUgKGUuZy4gYXR0cmlidXRlIHZhbHVlKSwKLQkJLy8gYW5kIHRoZSByZXF1ZXN0ZWQgY2hhbmdlcyBhcmUgYWxsCi0JCS8vIGFscGhhbnVtZXJpYywgdGhlbiBtYWtlIHRoZSBjaGFuZ2UgaGVyZSBsb2NhbGx5LgotCQkvLyAoVGhpcyBjYW4gb2J2aW91c2x5IGJlIG1hZGUgbW9yZSBzb3BoaXN0aWNhdGVkIGFzIHRoZSBuZWVkIGFyaXNlcywKLQkJLy8gYnV0IHNob3VsZAotCQkvLyBhbHdheXMgZm9sbG93IHRoaXMgcGF0dGVybi4pCi0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0Q29udGV4dFJlZ2lvbjo6dXBkYXRlTW9kZWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHRyZWdpb24gdHlwZSBpcyAiICsgZlR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiBjYW5IYW5kbGUgPSBmYWxzZTsKLQkJLy8gbm90ZTogd2UnbGwgYWx3YXlzIGhhbmRsZSBkZWxldGVzIGZyb20gdGhlc2UKLQkJLy8gcmVnaW9ucyAuLi4gaWYgaXRzIGFscmVhZHkgdGhhdCByZWdpb24sCi0JCS8vIGRlbGV0aW5nIHNvbWV0aGluZyBmcm9tIGl0IHdvbid0IGNoYW5nZSBpdHMKLQkJLy8gdHlwZS4gKHJlbWVtYmVyLCB0aGUgY2FsbGluZyBwcm9ncmFtIG5lZWRzCi0JCS8vIHRvIGluc3VyZSB3ZSBhcmUgbm90IGNhbGxlZCwgaWYgbm90IGFsbCBjb250YWluZWQKLQkJLy8gb24gb25lIHJlZ2lvbi4KLQkJaWYgKChjaGFuZ2VzID09IG51bGwpIHx8IChjaGFuZ2VzLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBkZWxldGUgY2FzZQotCQkJLy8gV2UgY2FuIG5vdCBkbyB0aGUgcXVpY2sgZGVsZXRlLCBpZgotCQkJLy8gaWYgYWxsIHRoZSB0ZXh0IGluIGEgcmVnaW9uIGlzIHRvIGJlIGRlbGV0ZWQuCi0JCQkvLyBPciwgaWYgdGhlIGRlbGV0ZSBzdGFydHMgaW4gdGhlIHdoaXRlIHNwYWNlIHJlZ2lvbi4KLQkJCS8vIEluIHRoZXNlIGNhc2VzLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkJLy8gTWlub3Igbm90ZSwgd2UgdXNlIHRleHRFbmQtc3RhcnQgc2luY2UgaXQgYWx3YXlzCi0JCQkvLyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gZW5kLXN0YXJ0LiBUaGlzIG1pZ2h0Ci0JCQkvLyBjYXVzZSB1cyB0byBtaXNzIGEgZmV3IGNhc2VzIHdlIGNvdWxkIGhhdmUgaGFuZGxlZCwKLQkJCS8vIGJ1dCB3aWxsIHByZXZlbnQgdXMgZnJvbSB0cnlpbmcgdG8gaGFuZGxlIGZ1bm5pbmcgY2FzZXMKLQkJCS8vIGludm9sdmluZyB3aGl0ZXNwYWNlLgotCQkJaWYgKChmU3RhcnQgPj0gZ2V0VGV4dEVuZCgpKSB8fCAoTWF0aC5hYnMobGVuZ3RoVG9SZXBsYWNlKSA+PSBnZXRUZXh0RW5kKCkgLSBnZXRTdGFydCgpKSkgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKChSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgfHwgUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc0xldHRlck9yRGlnaXQodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0KLQotCQl9Ci0JCWlmIChjYW5IYW5kbGUpIHsKLQkJCS8vIGF0IHRoaXMgcG9pbnQsIHdlIHN0aWxsIGhhdmUgdGhlIG9sZCByZWdpb24uIFdlIHdvbid0IGNyZWF0ZSBhCi0JCQkvLyBuZXcgaW5zdGFuY2UsIHdlJ2xsIGp1c3QgdXBkYXRlIHRoZSBvbmUgd2UgaGF2ZSwgYnkgY2hhbmdpbmcKLQkJCS8vIGl0cyBlbmQgcG9zdGlvbiwKLQkJCS8vIFRoZSBwYXJlbnQgZmxhdG5vZGUsIHVwb24gcmV0dXJuLCBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvciB1cGRhdGluZyBzaWJsaW5nIHJlZ2lvbnMuCi0JCQkvLyBhbmQgaW4gdHVybiwgdGhlIHN0cnVjdHVyZWREb2N1bWVudCBpdHNlbGYgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IKLQkJCS8vIHVwZGF0aW5nIHRoZSB0ZXh0IHN0b3JlIGFuZCBkb3duIHN0cmVhbSBmbGF0bm9kZXMuCi0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZSBoYW5kbGVkIGJ5IHJlZ2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgbGVuZ3RoRGlmZmVyZW5jZSA9IFV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGNoYW5nZXMsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkvLyBOb3RlOiB3ZSBhZGp1c3QgYm90aCBlbmQgYW5kIHRleHQgZW5kLCBiZWNhdXNlIGZvciBhbnkgY2hhbmdlCi0JCQkvLyB0aGF0IGlzIGluIG9ubHkgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVnaW9uLCB3ZSBzaG91bGQgbm90Ci0JCQkvLyBkbyBhIHF1aWNrIGNoYW5nZSwKLQkJCS8vIHNvICdjYW5IYW5kbGUnIHNob3VsZCBoYXZlIGJlZW4gZmFsc2UgZm9yIHRob3NlIGNhc2UuCi0JCQlmTGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQkvLyBUT19ET19GVVRVUkU6IGNhY2hlIHZhbHVlIG9mIGNhbkhhbmRsZUFzV2hpdGVTcGFjZSBmcm9tIGFib3ZlCi0JCQkvLyBJZiB3ZSBhcmUgaGFuZGxpbmcgYXMgd2hpdGVzcGFjZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBpbmNyZWFzZQotCQkJLy8gdGhlIHRleHQgbGVuZ3RoLCBvbmx5Ci0JCQkvLyB0aGUgdG90YWwgbGVuZ3RoIGlzIGNoYW5naW5nLgotCQkJLy8gZG9uJ3QgbmVlZCBmb3IgY29udGVudCByZWdpb24KLQkJCS8vCQkJaWYgKCFSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBjaGFuZ2VzLAotCQkJLy8gZlN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkvLwkJCQlmVGV4dExlbmd0aCArPSBsZW5ndGhEaWZmZXJlbmNlOwotCQkJLy8JCQl9Ci0JCQlyZXN1bHQgPSBuZXcgUmVnaW9uQ2hhbmdlZEV2ZW50KHBhcmVudC5nZXRQYXJlbnREb2N1bWVudCgpLCByZXF1ZXN0ZXIsIHBhcmVudCwgdGhpcywgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MSGVhZFBhcnNlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MSGVhZFBhcnNlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhkZjNlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTEhlYWRQYXJzZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLXB1YmxpYyBjbGFzcyBYTUxIZWFkUGFyc2VyRmFjdG9yeSB7Ci0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQlJVGV4dFJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQkvLwkJaWYgKGNvbnRleHQgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCkgewotCQluZXdSZWdpb24gPSBuZXcgWE1MSGVhZFBhcnNlclJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCB0ZXh0KTsKLQkJLy8JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTEhlYWRQYXJzZXJSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MSGVhZFBhcnNlclJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzkxN2I2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MSGVhZFBhcnNlclJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi0vKioKLSAqIAotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCwgaXRzIGp1c3QgcHJlc2VudCB0byBzZXJ2ZXIgYXMgYQotICogZ2VuZXJpYyBzdGFydGluZyBwb2ludCBmb3IgYWRkaW5nIG5ldyBzcGVjaWZpYyByZWdpb24gdHlwZXMuCi0gKi8KLQotcHVibGljIGNsYXNzIFhNTEhlYWRQYXJzZXJSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZlRleHQ7Ci0JcHJpdmF0ZSBpbnQgZlRleHRMZW5ndGg7Ci0JLy8gc3BlY2lmeSBjb3JyZWN0IHR5cGUKLQlwcml2YXRlIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEOwotCi0JcHVibGljIFhNTEhlYWRQYXJzZXJSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFhNTEhlYWRQYXJzZXJSZWdpb24oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgsIFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMoKTsKLQkJZlR5cGUgPSBjb250ZXh0OwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHRMZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCQlmVGV4dCA9IHRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCWZUZXh0TGVuZ3RoICs9IDE7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCQlmVGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIGZUZXh0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBSZWdpb25Ub1N0cmluZ1V0aWwudG9TdHJpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gY2FuIG5ldmVyIGJlIHVwZGF0ZWQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTFBhcnNlclJlZ2lvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MUGFyc2VyUmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODFmNDQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MUGFyc2VyUmVnaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Db250ZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXIuRm9yZWlnblJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogCi0gKiBUaGlzIHJlZ2lvbiBmYWN0b3J5IGlzIHZlcnkgc3BlY2lmaWMgdG8gdGhlIHBhcnNlciBvdXRwdXQsIGFuZCB0aGUgc3BlY2lmaWMKLSAqIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgZm9yIHZhcmlvdXMgcmVnaW9ucy4KLSAqLwotCi1wdWJsaWMgY2xhc3MgWE1MUGFyc2VyUmVnaW9uRmFjdG9yeSB7Ci0KLQlwdWJsaWMgWE1MUGFyc2VyUmVnaW9uRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlVG9rZW4oSVRleHRSZWdpb25Db250YWluZXIgcGFyZW50LCBTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUb2tlbihwYXJlbnQsIGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihJVGV4dFJlZ2lvbkNvbnRhaW5lciBwYXJlbnQsIFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoLCBTdHJpbmcgbGFuZywgU3RyaW5nIHN1cnJvdW5kaW5nVGFnKSB7Ci0JCUlUZXh0UmVnaW9uIG5ld1JlZ2lvbiA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkvLyBuZXdSZWdpb24uc2V0UGFyZW50KHBhcmVudCk7Ci0JCXJldHVybiBuZXdSZWdpb247Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCwgU3RyaW5nIGxhbmcsIFN0cmluZyBzdXJyb3VuZGluZ1RhZykgewotCQlJVGV4dFJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQlpZiAoY29udGV4dCA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgWE1MQ0RhdGFUZXh0UmVnaW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgewotCQkJbmV3UmVnaW9uID0gbmV3IFhNTENvbnRlbnRSZWdpb24oc3RhcnQsIGxlbmd0aCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJbmV3UmVnaW9uID0gbmV3IFRhZ05hbWVSZWdpb24oc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBBdHRyaWJ1dGVOYW1lUmVnaW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBBdHRyaWJ1dGVFcXVhbHNSZWdpb24oc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgQXR0cmlidXRlVmFsdWVSZWdpb24oc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgewotCQkJbmV3UmVnaW9uID0gbmV3IFRhZ09wZW5SZWdpb24oc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBFbmRUYWdPcGVuUmVnaW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgVGFnQ2xvc2VSZWdpb24oc3RhcnQpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgRW1wdHlUYWdDbG9zZVJlZ2lvbihzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuV0hJVEVfU1BBQ0UpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBXaGl0ZVNwYWNlT25seVJlZ2lvbihzdGFydCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlCi0JCS8vIHJlbW92ZWQgdGhpcyBjb25kaXRpb24gZHVyaW5nIHRyYW5zaXRpb24sIGFuZCBpbXBsZW1lbnRlZCBpbgotCQkvLyBzdWJjbGFzcwotCQkvLyBpZiAoY29udGV4dCA9PSBYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCkgewotCQkvLyBuZXdSZWdpb24gPSBuZXcgSlNQQ29kZVJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJLy8gfSBlbHNlCi0JCWlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJbmV3UmVnaW9uID0gbmV3IEZvcmVpZ25SZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCQkoKEZvcmVpZ25SZWdpb24pIG5ld1JlZ2lvbikuc2V0U3Vycm91bmRpbmdUYWcoc3Vycm91bmRpbmdUYWcpOwotCQl9Ci0JCWVsc2UgewotCQkJbmV3UmVnaW9uID0gbmV3IENvbnRleHRSZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2YzU5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIFsyMDU5ODldIC0gW3ZhbGlkYXRpb25dIHZhbGlkYXRlIFhNTCBhZnRlciBYSW5jbHVkZSByZXNvbHV0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotCi0vKioKLSAqIFNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIFhNTCBDb3JlIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBub2RlID0gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkpOwotCi0JCS8vIGZvcm1hdHRpbmcgcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRILCA3Mik7Ci0JCW5vZGUucHV0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUywgZmFsc2UpOwotCQlub2RlLnB1dChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIsIFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFCKTsKLQkJbm9kZS5wdXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFLCAxKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BMSVRfTVVMVElfQVRUUlMsIGZhbHNlKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQUxJR05fRU5EX0JSQUNLRVQsIGZhbHNlKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuUFJFU0VSVkVfQ0RBVEFDT05URU5ULCBmYWxzZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFX0JFRk9SRV9FTVBUWV9DTE9TRV9UQUcsIHRydWUpOwotCQkKLQkJLy8gY2xlYW51cCBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTLCB0cnVlKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFLCB0cnVlKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMsIGZhbHNlKTsKLQotCQlub2RlLnB1dChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5JTlBVVF9DT0RFU0VULCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZS5wdXQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQsICJVVEYtOCIpOy8vJE5PTi1OTFMtMSQKLQkJbm9kZS5wdXQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuRU5EX09GX0xJTkVfQ09ERSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gdGhpcyBjb3VsZCBiZSBtYWRlIHNtYXJ0ZXIgYnkgYWN0dWFsbHkgbG9va2luZyB1cCB0aGUgY29udGVudAotCQkvLyB0eXBlJ3MgdmFsaWQgZXh0ZW5zaW9ucwotCQlub2RlLnB1dChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OLCAieG1sIik7IC8vJE5PTi1OTFMtMSQKLQotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5XQVJOX05PX0dSQU1NQVIsIHRydWUpOwotCQlub2RlLnB1dEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklORElDQVRFX05PX0dSQU1NQVIsIDEpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VU0VfWElOQ0xVREUsIGZhbHNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTcyYWY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyIC0gU1RBUiAtIFsyMDU5ODldIC0gW3ZhbGlkYXRpb25dIHZhbGlkYXRlIFhNTCBhZnRlciBYSW5jbHVkZSByZXNvbHV0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogQ29tbW9uIHByZWZlcmVuY2Uga2V5cyB1c2VkIGJ5IFhNTCBjb3JlCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1MQ29yZVByZWZlcmVuY2VOYW1lcyB7Ci0JcHJpdmF0ZSBYTUxDb3JlUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBlbXB0eSBwcml2YXRlIGNvbnN0cnVjdG9yIHNvIHVzZXJzIGNhbm5vdCBpbnN0YW50aWF0ZSBjbGFzcwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGV4dGVuc2lvbiB0byB1c2Ugd2hlbiBub25lIGlzIHNwZWNpZmllZCBpbiB0aGUgTmV3IEZpbGUKLQkgKiBXaXphcmQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VYVEVOU0lPTiA9ICJkZWZhdWx0RXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKiBUaGUgbWF4aW11bSB3aWR0aCBvZiBhIGxpbmUgYmVmb3JlIGEgbGluZSBzcGxpdCBpcyBuZWVkZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9XSURUSCA9ICJsaW5lV2lkdGgiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiBhbGwgYmxhbmtzIGxpbmVzIHNob3VsZCBiZSBjbGVhcmVkIGR1cmluZyBmb3JtYXR0aW5nLgotCSAqIEJsYW5rIGxpbmVzIHdpbGwgYmUga2VwdCB3aGVuIGZhbHNlLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSX0FMTF9CTEFOS19MSU5FUyA9ICJjbGVhckFsbEJsYW5rTGluZXMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgI0lOREVOVEFUSU9OX0NIQVIgZm9yIDEgaW5kZW50YXRpb24uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERU5UQVRJT05fU0laRSA9ICJpbmRlbnRhdGlvblNpemUiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjaGFyYWN0ZXIgdXNlZCBmb3IgaW5kZW50YXRpb24uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge1RBQiwgU1BBQ0V9Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVEFUSU9OX0NIQVIgPSAiaW5kZW50YXRpb25DaGFyIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UgI0lOREVOVEFUSU9OX0NIQVIuIEluZGljYXRlcyB0byB1c2UKLQkgKiB0YWIgY2hhcmFjdGVyIHdoZW4gZm9ybWF0dGluZy4KLQkgKiAKLQkgKiBAc2VlICNTUEFDRQotCSAqIEBzZWUgI0lOREVOVEFUSU9OX0NIQVIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUIgPSAidGFiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlICNJTkRFTlRBVElPTl9DSEFSLiBJbmRpY2F0ZXMgdG8gdXNlCi0JICogc3BhY2UgY2hhcmFjdGVyIHdoZW4gZm9ybWF0dGluZy4KLQkgKiAKLQkgKiBAc2VlICNUQUIKLQkgKiBAc2VlICNJTkRFTlRBVElPTl9DSEFSCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBQ0UgPSAic3BhY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgdGFncyB3aXRoIG11bHRpcGxlIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZAotCSAqIChzcGxpdHRpbmcgZWFjaCBhdHRyIG9uIGEgbmV3IGxpbmUpLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQTElUX01VTFRJX0FUVFJTID0gInNwbGl0TXVsdGlBdHRycyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGNsZWFudXAgcHJvY2Vzc29yIHNob3VsZCBmb3JtYXQgc291cmNlLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9TT1VSQ0UgPSAiZm9ybWF0U291cmNlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgZW1wdHkgZWxlbWVudHMgc2hvdWxkIGJlIGNvbXByZXNzZWQgZHVyaW5nCi0JICogY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MgPSAiY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gaW5zZXJ0IHJlcXVpcmVkIGF0dHJpYnV0ZXMgZHVyaW5nIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TRVJUX1JFUVVJUkVEX0FUVFJTID0gImluc2VydFJlcXVpcmVkQXR0cnMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBpbnNlcnQgbWlzc2luZyB0YWdzIGR1cmluZyBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVF9NSVNTSU5HX1RBR1MgPSAiaW5zZXJ0TWlzc2luZ1RhZ3MiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBxdW90ZSBhbGwgYXR0cmlidXRlIHZhbHVlcyBkdXJpbmcgY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVU9URV9BVFRSX1ZBTFVFUyA9ICJxdW90ZUF0dHJWYWx1ZXMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBjb252ZXJ0IGFsbCBsaW5lIGRlbGltaXRlcnMgZHVyaW5nIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogQGRlcHJlY2F0ZWQgLSBubyBsb25nZXIgdXNlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRfRU9MX0NPREVTID0gImNvbnZlcnRFT0xDb2RlcyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoZSBsaW5lIGRlbGltaXRlciB0byB1c2UgZHVyaW5nIGNsZWFudXAgaWYgY29udmVydGluZyBsaW5lCi0JICogZGVsaW1pdGVycy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7Q1IsIENSTEYsIExGLCBOT19UUkFOU0xBVElPTn0KLQkgKiA8L3A+Ci0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9FT0xfQ09ERSA9ICJjbGVhbnVwRU9MQ29kZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGEgd2FybmluZyBzaG91bGQgYmUgcHJvZHVjZWQgd2hlbiB2YWxpZGF0aW5nIGEKLQkgKiBmaWxlIHRoYXQgc3BlY2lmaWVzIG5vdCBncmFtbWFyLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7VFJVRSwgRkFMU0V9Ci0JICogPC9wPgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSTl9OT19HUkFNTUFSID0gIndhcm5Ob0dyYW1tYXIiOy8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgYSBtZXNzYWdlIHNob3VsZCBiZSBwcm9kdWNlZCB3aGVuIHZhbGlkYXRpbmcgYQotCSAqIGZpbGUgdGhhdCBzcGVjaWZpZXMgbm90IGdyYW1tYXIuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5pbnRlZ2VyPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHswLCAxLCAyfSAobm9uZSwgd2FybmluZywgZXJyb3IpCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElORElDQVRFX05PX0dSQU1NQVIgPSAiaW5kaWNhdGVOb0dyYW1tYXIiOy8vJE5PTi1OTFMtMSQKLQotIAkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgeGluY2x1ZGVzIHNob3VsZCBiZSBwcm9jZXNzZWQgYmVmb3JlCi0JICogdmFsaWRhdGlvbi4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge1RSVUUsIEZBTFNFfQotCSAqIDwvcD4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfWElOQ0xVREUgPSAieGluY2x1ZGUiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiBhbGwgd2hpdGVzcGFjZSBpbiB0YWdzIHdpdGggQ0RBVEEgY29udGVudCBzaG91bGQgYmUKLQkgKiBwcmVzZXJ2ZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFU0VSVkVfQ0RBVEFDT05URU5UID0gInByZXNlcnZlQ0RBVEFDb250ZW50IjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgZW5kIGJyYWNrZXRzIG9mIHN0YXJ0IHRhZ3Mgc2hvdWxkIGJlIHBsYWNlZCBvbiBhIG5ldyBsaW5lCi0JICogaWYgdGhlIHN0YXJ0IHRhZyBzcGFucyBtb3JlIHRoYW4gb25lIGxpbmUuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fRU5EX0JSQUNLRVQgPSAiYWxpZ25FbmRCcmFja2V0IjsvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIGFuIGVtcHR5IGNsb3NlIHRhZyBzaG91bGQgaGF2ZSBhIHNwYWNlIGluc2VydGVkIGJlZm9yZQotCSAqIGNsb3NpbmcuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRV9CRUZPUkVfRU1QVFlfQ0xPU0VfVEFHID0gInNwYWNlQmVmb3JlRW1wdHlDbG9zZVRhZyI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm9wYWdhdGUvUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvcGFnYXRlL1Byb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNzZkNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm9wYWdhdGUvUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci0KLQotLyoqCi0gKiBUaGUgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeSBpcyBwYXJ0IG9mIHRoZSAiYWRhcHQgb24gY3JlYXRlIiBtZWNoYW5pc20uIEEKLSAqIFByb3BhZ2F0aW5nQWRhcHRlciwgb25jZSBhZGRlZCB0byBhIG5vZGUsIHdpbGwgY2F1c2UgcHJvYWdhdGluZyBhZGFwdGVycyB0bwotICogYmUgY3JlYXRlZCBmb3IgYWxsIGNoaWxkIG5vZGVzLiBBIHNpZGUgZWZmZWN0IG9mIGNyZWF0aW5nIGEKLSAqIFByb3BhZ2F0aW5nQWRhcHRlciBmb3IgYSBub2RlIGlzIHRoYXQgaXMgaXMgYWxzbyBjcmVhdGVzIGFkYXB0ZXJzIGZvciBhbmQKLSAqIGFkYXB0cyB0aGUgTm9kZSBmb3IgYWxsIG90aGVyIHJlZ2lzdGVyZWQgJ2NyZWF0ZSBvbiBhZGFwdCcgQWRhcHRlcnMuIFRoaXMKLSAqIG90aGVyIGFkYXB0ZXJzIGFyZSByZWdpc3RlcmVkIGJ5IHJlZ2lzdGVyaW5nIHRoZWlyIGZhY3RvcmllcyB2aWEgcGx1Z2luCi0gKiBleHRlbnNpb24gcG9pbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbCBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IHsKLQotCXByaXZhdGUgUHJvcGFnYXRpbmdBZGFwdGVyIGZBZGFwdGVySW5zdGFuY2U7Ci0JcHJpdmF0ZSBMaXN0IGZDb250cmlidXRlZEZhY3RvcmllcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKCkgewotCQl0aGlzKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsgLy8gLAotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDb250cmlidXRlZEZhY3RvcmllcyhJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJaWYgKGZDb250cmlidXRlZEZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQlmQ29udHJpYnV0ZWRGYWN0b3JpZXMuYWRkKGZhY3RvcnkpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVBZGFwdGVyIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQkvLyBldmVyeSBub3RpZmllciBnZXQncyBvbmUgb2YgdGhlc2UKLQkJLy8gKGFuZCB0aGUgc2FtZSBpbnN0YW5jZSBvZiBpdCkKLQkJcmV0dXJuIGdldEFkYXB0ZXJJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0ZXJJbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBQcm9wYWdhdGluZ0FkYXB0ZXIKLQkgKi8KLQlwcml2YXRlIFByb3BhZ2F0aW5nQWRhcHRlciBnZXRBZGFwdGVySW5zdGFuY2UoKSB7Ci0JCWlmIChmQWRhcHRlckluc3RhbmNlID09IG51bGwpIHsKLQkJCWZBZGFwdGVySW5zdGFuY2UgPSBuZXcgUHJvcGFnYXRpbmdBZGFwdGVySW1wbCgpOwotCQkJaWYgKGZDb250cmlidXRlZEZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmQ29udHJpYnV0ZWRGYWN0b3JpZXMuc2l6ZSgpOyBpKyspCi0JCQkJCWZBZGFwdGVySW5zdGFuY2UuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkoKFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnkpIGZDb250cmlidXRlZEZhY3Rvcmllcy5nZXQoaSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmQWRhcHRlckluc3RhbmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIGdpdmUgdGhlIGFkYXB0ZXIgaW5zdGFuY2UgYSBjaGFuY2UgdG8gcmVsZWFzZSBpdHMgZmFjdG9yaWVzCi0JCWdldEFkYXB0ZXJJbnN0YW5jZSgpLnJlbGVhc2UoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRyaWJ1dGVkRmFjdG9yaWVzKEFycmF5TGlzdCBsaXN0KSB7Ci0JCWZDb250cmlidXRlZEZhY3RvcmllcyA9IGxpc3Q7Ci0KLQl9Ci0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IGNsb25lZEluc3RhbmNlID0gbmV3IFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKGdldEFkYXB0ZXJLZXkoKSwgaXNTaG91bGRSZWdpc3RlckFkYXB0ZXIoKSk7Ci0JCS8vIGNsb25lIHRoaXMgYWRhcHRlcnMgc3BlY2lmaWMgbGlzdCBvZiBhZGFwdGVyIGZhY3RvcmllcyB0b28KLQkJaWYgKGZDb250cmlidXRlZEZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQkKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkNvbnRyaWJ1dGVkRmFjdG9yaWVzLml0ZXJhdG9yKCk7Ci0JCQljbG9uZWRJbnN0YW5jZS5zZXRDb250cmlidXRlZEZhY3RvcmllcyhuZXcgQXJyYXlMaXN0KCkpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZXhpc3RpbmdGYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQljbG9uZWRJbnN0YW5jZS5hZGRDb250cmlidXRlZEZhY3RvcmllcyhleGlzdGluZ0ZhY3RvcnkuY29weSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2xvbmVkSW5zdGFuY2U7Ci0JfQotCi0JCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvcGFnYXRlL1Byb3BhZ2F0aW5nQWRhcHRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvcGFnYXRlL1Byb3BhZ2F0aW5nQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4MTU5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3BhZ2F0ZS9Qcm9wYWdhdGluZ0FkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvcGFnYXRlOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBQcm9wYWdhdGluZ0FkYXB0ZXJJbXBsIGltcGxlbWVudHMgUHJvcGFnYXRpbmdBZGFwdGVyIHsKLQotCXByaXZhdGUgTGlzdCBhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzID0gbnVsbDsKLQotCS8qKgotCSAqIEFic3RyYWN0UHJvcGFnYXRpbmdBZGFwdGVySW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBQcm9wYWdhdGluZ0FkYXB0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGFwdE9uQ3JlYXRlKElET01Ob2RlIG5vZGUpIHsKLQkJLy8gZ2l2ZSBlYWNoIG9mIHRoZSBmYWN0b3JpZXMgYSBjaGFuY2UgdG8gYWRhcHQgdGhlIG5vZGUsIGlmIGl0Ci0JCS8vIGNob29zZXMgdG8KLQkJaWYgKGFkYXB0T25DcmVhdGVGYWN0b3JpZXMgIT0gbnVsbCkgewotCi0KLQkJCXN5bmNocm9uaXplZCAoYWRhcHRPbkNyZWF0ZUZhY3RvcmllcykgewotCQkJCWludCBsZW5ndGggPSBhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzLmdldChpKTsKLQkJCQkJZmFjdG9yeS5hZGFwdChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZWNoYW5pc20gY2FuIGJlIG1hZGUgImVhc2llciB0byB1c2UiIGxhdGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFkYXB0T25DcmVhdGVGYWN0b3J5KElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQlnZXRBZGFwdE9uQ3JlYXRlRmFjdG9yaWVzKCkuYWRkKGZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0T25DcmVhdGVGYWN0b3JpZXMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0T25DcmVhdGVGYWN0b3JpZXMoKSB7Ci0JCWlmIChhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzID09IG51bGwpCi0JCQlhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gYWRhcHRPbkNyZWF0ZUZhY3RvcmllczsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgUHJvcGFnYXRpbmdBZGFwdGVyI2luaXRpYWxpemVGb3JGYWN0b3J5KElOb2RlQWRhcHRlckZhY3RvcnksCi0JICogICAgICBJTm9kZU5vdGlmaWVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGb3JGYWN0b3J5KElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgSU5vZGVOb3RpZmllciBub2RlKSB7Ci0JCS8vIElTU1VFOiB3ZSBhcmUgYSBET00gc3BlY2lmaWMgaW1wbGltZW50YXRpb24sIAotCQkvLyB3ZSBzaG91bGQgbm90IGJlLgotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlJRE9NTm9kZSB4bWxOb2RlID0gKElET01Ob2RlKSBub2RlOwotCQkJcHJvcGFnYXRlVG8oeG1sTm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUuZXF1YWxzKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSW50ZXJlc3RpbmcoT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXJldHVybiAobmV3VmFsdWUgIT0gbnVsbCAmJiAobmV3VmFsdWUgaW5zdGFuY2VvZiBFbGVtZW50IHx8IG5ld1ZhbHVlIGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgbmV3VmFsdWUgaW5zdGFuY2VvZiBEb2N1bWVudFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJLy8gSXNzdWU6IFdlIG9ubHkgcHJvcGFnYXRlIHRvIEVsZW1lbnRzIC4uLgotCQkvLyBub3QgYXR0cmlidXRlcyB0b28hIFdlIHNob3VsZCBjYXJlZnVsIGNvbnNpZGVyIGRvbmluZyBhbGwgd2hlbgotCQkvLyB3aGVuIHdlIGltcHJvdmUgImFkYXB0IG9uIGNyZWF0ZSIgZGVzaWduLgotCQlpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQUREICYmIGlzSW50ZXJlc3RpbmcobmV3VmFsdWUpKSB7Ci0JCQlwcm9wYWdhdGVUbygoSURPTU5vZGUpIG5ld1ZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9wYWdhdGVUbyhJRE9NTm9kZSBub2RlKSB7Ci0JCS8vIGdldCBhZGFwdGVyIHRvIGVuc3VyZSBpdHMgY3JlYXRlZAotCQlub2RlLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJYWRhcHRPbkNyZWF0ZShub2RlKTsKLQkJcHJvcGFnYXRlVG9DaGlsZHJlbihub2RlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvcGFnYXRlVG9DaGlsZHJlbihJRE9NTm9kZSBwYXJlbnQpIHsKLQkJZm9yIChOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlwcm9wYWdhdGVUbygoSURPTU5vZGUpIGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgUHJvcGFnYXRpbmdBZGFwdGVyI3JlbGVhc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzICE9IG51bGwpIHsKLQotCQkJc3luY2hyb25pemVkIChhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzKSB7Ci0JCQkJaW50IGxlbmd0aCA9IGFkYXB0T25DcmVhdGVGYWN0b3JpZXMuc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGFkYXB0T25DcmVhdGVGYWN0b3JpZXMuZ2V0KGkpOwotCQkJCQlmYWN0b3J5LnJlbGVhc2UoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JWE1MQ2hhckVudGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JWE1MQ2hhckVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWZiNDgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVhNTENoYXJFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLQotCi0vKioKLSAqIFhNTCBOYW1lc3BhY2UgY29uc3RhbnRzCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElYTUxDaGFyRW50aXR5IHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFNUF9OQU1FID0gImFtcCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQU1QX1JFRiA9ICImYW1wOyI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQU1QX1ZBTFVFID0gIiYiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFQT1NfTkFNRSA9ICJhcG9zIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBUE9TX1JFRiA9ICImYXBvczsiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFQT1NfVkFMVUUgPSAiJyI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgR1RfTkFNRSA9ICJndCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgR1RfUkVGID0gIiZndDsiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEdUX1ZBTFVFID0gIj4iOy8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTFRfTkFNRSA9ICJsdCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTFRfUkVGID0gIiZsdDsiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIExUX1ZBTFVFID0gIjwiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFFVT1RfTkFNRSA9ICJxdW90IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBRVU9UX1JFRiA9ICImcXVvdDsiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFFVT1RfVkFMVUUgPSAiXCIiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVhNTE5hbWVzcGFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JWE1MTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYjIyNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JWE1MTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi0KLQotLyoqCi0gKiBYTUwgTmFtZXNwYWNlIGNvbnN0YW50cwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJWE1MTmFtZXNwYWNlIHsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlMgPSAieG1sbnMiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFhNTE5TX1BSRUZJWCA9ICJ4bWxuczoiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFhNTE5TX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyI7Ly8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JWE1MUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lYTUxQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0OWQ0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lYTUxQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLS8qKgotICogS2V5cyB0byB1c2UgZm9yIHByZWZlcmVuY2Ugc2V0dGluZ3MuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVhNTFByZWZlcmVuY2VOYW1lcyB7Ci0JU3RyaW5nIENMRUFOVVBfQVRUUl9OQU1FX0NBU0UgPSAiY2xlYW51cEF0dHJOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDTEVBTlVQX0VPTF9DT0RFID0gImNsZWFudXBFT0xDb2RlIjsvLyROT04tTkxTLTEkCi0JLy8gY2xlYW51cCBwcmVmZXJlbmNlIG5hbWVzCi0JU3RyaW5nIENMRUFOVVBfVEFHX05BTUVfQ0FTRSA9ICJjbGVhbnVwVGFnTmFtZUNhc2UiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ09OVkVSVF9FT0xfQ09ERVMgPSAiY29udmVydEVPTENvZGVzIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZPUk1BVF9TT1VSQ0UgPSAiZm9ybWF0U291cmNlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIElOU0VSVF9NSVNTSU5HX1RBR1MgPSAiaW5zZXJ0TWlzc2luZ1RhZ3MiOy8vJE5PTi1OTFMtMSQKLQotCS8vIG90aGVycwotCVN0cmluZyBMQVNUX0FDVElWRV9QQUdFID0gImxhc3RBY3RpdmVQYWdlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFFVT1RFX0FUVFJfVkFMVUVTID0gInF1b3RlQXR0clZhbHVlcyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBub3QgdXNlZCBmb3Igbm93IC8vIGhpZ2hsaWdodGluZyB0eXBlcyBTdHJpbmcgQ09NTUVOVF9CT1JERVIgPQotCSAqICJjb21tZW50Qm9yZGVyIjsvLyROT04tTkxTLTEkIFN0cmluZyBDT01NRU5UX1RFWFQgPQotCSAqICJjb21tZW50VGV4dCI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgQ0RBVEFfQk9SREVSID0KLQkgKiAiY2RhdGFCb3JkZXIiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIENEQVRBX1RFWFQgPQotCSAqICJjZGF0YVRleHQiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIFBJX0JPUkRFUiA9ICJwaUJvcmRlciI7Ly8kTk9OLU5MUy0xJAotCSAqIFN0cmluZyBQSV9DT05URU5UID0gInBpQ29udGVudCI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgVEFHX0JPUkRFUiA9Ci0JICogInRhZ0JvcmRlciI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgVEFHX05BTUUgPSAidGFnTmFtZSI7Ly8kTk9OLU5MUy0xJAotCSAqIFN0cmluZyBUQUdfQVRUUklCVVRFX05BTUUgPSAidGFnQXR0cmlidXRlTmFtZSI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcKLQkgKiBUQUdfQVRUUklCVVRFX1ZBTFVFID0gInRhZ0F0dHJpYnV0ZVZhbHVlIjsvLyROT04tTkxTLTEkIFN0cmluZwotCSAqIERFQ0xfQk9SREVSID0gImRlY2xCb2RlciI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgRE9DVFlQRV9OQU1FID0KLQkgKiAiZG9jdHlwZU5hbWUiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIERPQ1RZUEVfRVhURVJOQUxfSUQgPQotCSAqICJkb2N0eXBlRXh0ZXJuYWxJZCI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYgPQotCSAqICJkb2N0eXBlRXh0ZXJuYWxQdWJyZWYiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIERPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGID0KLQkgKiAiZG9jdHlwZUV4dHJlbmFsU3lzcmVmIjsvLyROT04tTkxTLTEkIFN0cmluZyBYTUxfQ09OVEVOVCA9Ci0JICogInhtbENvbnRlbnQiOy8vJE5PTi1OTFMtMSQgLy8gaGlnaGxpZ2h0aW5nIHByZWZlcmVuY2VzIFN0cmluZyBDT01NQSA9Ci0JICogIiwiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIENPTE9SID0gImNvbG9yIjsvLyROT04tTkxTLTEkIFN0cmluZyBOQU1FID0KLQkgKiAibmFtZSI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgRk9SRUdST1VORCA9ICJmb3JlZ3JvdW5kIjsvLyROT04tTkxTLTEkCi0JICogU3RyaW5nIEJBQ0tHUk9VTkQgPSAiYmFja2dyb3VuZCI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgQk9MRCA9Ci0JICogImJvbGQiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIElUQUxJQyA9ICJpdGFsaWMiOy8vJE5PTi1OTFMtMSQKLQkgKi8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvTmFtZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9OYW1lVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NmJlYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9OYW1lVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTDEwTmFtZXM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBjb25zaXN0ZW50IHdheSB0byBwcmUtY2hlY2sgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBYTUwKLSAqIG5hbWUsIGJlZm9yZSwgZm9yIGV4YW1wbGUsIHRyeWluZyB0byBhY3R1YWxseSBjcmVhdGUgYW4gRWxlbWVudCB3aXRoIGl0LgotICogQXR0ZW1wdGluZyB0byBjcmVhdGUgYW4gRWxlbWVudCB3aXRoIGFuIGludmFsaWQgbmFtZSB3aWxsIHRocm93IHRoZSBhcHByb3ByaWF0ZQotICogRE9NIEV4Y2VwdGlvbiwgYnV0IG9mdGVuIGNsaWVudHMgd2FudCB0byBjaGVjayB0aGUgdmFsaWRpdGluZyBvZiBhIG5hbWUKLSAqIHN1Y2ggYXMgYmFzZWQgb24gc29tZSB1c2VyIGlucHV0LCBsb25nIGluIGFkdmFuY2Ugb2YgYWN0dWFsbHkgbWFraW5nIAotICogdGhlIERPTSBjYWxsLiBBbmQsIG5hdHVhbGx5LCB3YW50IHRvIGdpdmUgdGhlIHVzZXIgZmVlZGJhY2sgaW4gYSBtb3JlIAotICogdGltZWx5IGZhc2hpb24uCi0gKiAKLSAqIElTU1VFOiBpcyAiZW5kbnM6IiByZWFsbHkgdmFsaWQgeG1sIG5hbWU/IEkgdGhpbmsgbm90LCBidXQgdGhpcyBtZXRob2QKLSAqIChjdXJyZW50bHkpIHNheXMgaXQgaXMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTmFtZVZhbGlkYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBYTUwxME5hbWVzIHhtbDEwY2hhckNoZWNrZXIgPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIDxjb2RlPm5hbWU8L2NvZGU+IGlzIHZhbGlkIFhNTCBuYW1lIGFjY29yZGluZyB0byBYTUwKLQkgKiAxLjAgcnVsZXMsIGZhbHNlIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgbmFtZSBpcyB0aGUgc3RyaW5nIHRvIHRlc3QKLQkgKiBAcmV0dXJuIHRydWUgaWYgdmFsaWQgbmFtZSBhY2NvcmRpbmcgdG8gWE1MIDEuMCBydWxlcywgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgbmFtZSkgewotCi0JCWlmICh4bWwxMGNoYXJDaGVja2VyID09IG51bGwpIHsKLQkJCXhtbDEwY2hhckNoZWNrZXIgPSBpbml0aXRhaWxpemVYTUwxME5hbWVzKCk7Ci0JCX0KLQkJcmV0dXJuIHhtbDEwY2hhckNoZWNrZXIuaXNWYWxpZFhNTDEwTmFtZShuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBYTUwxME5hbWVzIGluaXRpdGFpbGl6ZVhNTDEwTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgWE1MMTBOYW1lcygoUmVhZGVyKSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3QgaW50ZW50ZWRlZCB0byBiZSBpbnN0YW50aWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBOYW1lVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NNRG9jVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ01Eb2NUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhM2Q5NWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ01Eb2NUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jVHlwZSB7Ci0JLyoqCi0JICogQ0hUTUwgZmlsZXMKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDSFRNTF9ET0NfVFlQRSA9ICJDSFRNTCI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEhUTUwgZmlsZXMKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBIVE1MX0RPQ19UWVBFID0gIkhUTUwiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBKU1AgMS4xIGZpbGVzIChjdXJyZW50bHkgaW5jbHVkZXMgMS4yIGVsZW1lbnRzIGZvciBiYWNrd2FyZCBiZWhhdmlvcmFsIGNvbXBhdGliaWxpdHkpCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSlNQMTFfRE9DX1RZUEUgPSAiSlNQMTEiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBKU1AgMS4yIGZpbGVzCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSlNQMTJfRE9DX1RZUEUgPSAiSlNQMTIiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBKU1AgMi4wIEpTUCBmaWxlcwotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpTUDIwX0RPQ19UWVBFID0gIkpTUDIwIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogSlNQIDIuMCBUYWcgZmlsZXMKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUQUcyMF9ET0NfVFlQRSA9ICJKU1AyMC5UQUciOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnRUcmFja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50VHJhY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWJhYTU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnRUcmFja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLQotCi0vKioKLSAqIFBvc2l0aW9uIGRlcGVuZGVudCBDTURvY3VtZW50IHRyYWNrZXIuIEEgdHJhY2tlciBtYXRjaGVzIGEKLSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gd2l0aCBhIENNRG9jdW1lbnQgdGhhdCBpdCBlbmFibGVzIGFsbG93aW5nIGZvcgotICogcG9zaXRpb24tZGVwZW5kZW50IGNvbnRlbnQgbW9kZWxzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2N1bWVudFRyYWNrZXIgewotCi0JQ01Eb2N1bWVudCBnZXREb2N1bWVudCgpOwotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ01Ob2RlV3JhcHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ01Ob2RlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmU3NWQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NNTm9kZVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi1wdWJsaWMgaW50ZXJmYWNlIENNTm9kZVdyYXBwZXIgZXh0ZW5kcyBDTU5vZGUgewotCUNNTm9kZSBnZXRPcmlnaW5Ob2RlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9Db250ZW50TW9kZWxBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9Db250ZW50TW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NjgxMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvQ29udGVudE1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIENvbnRlbnRNb2RlbEFkYXB0ZXIgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudE1vZGVsQWRhcHRlciBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXIgewotCi0JLyoqCi0JICogZ2V0Q01Eb2N1bWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIENNRG9jdW1lbnQKLQkgKiBAcGFyYW0gbm90aWZlcgotCSAqIAotCSAqIFJldHVybnMgQ01Eb2N1bWVudCBhc3NvY2lhdGVkIHRvIHRoZSBhZGFwdGluZyBub2RlLiBGb3IgZXhhbXBsIDogSFRNTAotCSAqIENNRG9jdW1lbnQgaXMgYXNzb2NpYXRlZCB0byBIVE1MIERvY3VtZW50IG5vZGUsIERURCBDTURvY3VtZW50IGlzCi0JICogYXNzb2NpYXRlZCB0byBEb2N1bWVudFR5cGUgbm9kZSwgRFREL1NjaGVtYSBDTURvY3VtZW50IGlzIGFzc29jaWF0ZWQgdG8KLQkgKiBFbGVtZW50IG5vZGUgKHNvbWV0aW1lIHdpdGggbmFtZXNwYWNlKSwgYW5kIHRhZ2xpYiBDTURvY3VtZW50IGlzCi0JICogYXNzb2NpYXRlZCB0byB0YWdsaWIgZGlyZWN0aXZlIEVsZW1lbnQgbm9kZS4KLQkgKiAKLQkgKiBJTm9kZU5vdGlmaWVyIGlzIHBhc3NlZCBmb3Igc3RhdGVsZXNzIChzaW5nbGV0b24pIElOb2RlQWRhcHRlcgotCSAqIGltcGxlbWVudGF0aW9uLgotCSAqLwotCUNNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllciBub3RpZmllcik7Ci0KLQkvKioKLQkgKiBnZXREZWNsYXJhdGlvbiBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIENNTm9kZQotCSAqIEBwYXJhbSBub3RpZmVyCi0JICogCi0JICogUmV0dXJucyBFbGVtZW50RGVmaW5pdGlvbiBvciBBdHRyaWJ1dGVEZWZpbml0aW9uIGZvciB0aGUgYWRhcHRpbmcgbm9kZS4KLQkgKiAKLQkgKiBJTm9kZU5vdGlmaWVyIGlzIHBhc3NlZCBmb3Igc3RhdGVsZXNzIChzaW5nbGV0b24pIElOb2RlQWRhcHRlcgotCSAqIGltcGxlbWVudGF0aW9uLgotCSAqLwotCUNNTm9kZSBnZXREZWNsYXJhdGlvbihvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllciBub3RpZmllcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9OdWxsQ29udGVudE1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9OdWxsQ29udGVudE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMmVlNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvTnVsbENvbnRlbnRNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gaW50aWFsaXplIHNwZWNpZmljIHZhcmlhYmxlcyB0aGF0IG5lZWQgYSBjb250ZW50Ci0gKiBtb2RlbCwgdW50aWwgdGhlIHRydWUgY29udGVudCBtb2RlbCBpcyBhdmFpbGFibGUuIFRoaXMgcHJldmVudHMgaGF2aW5nIHRvCi0gKiBkbyBsb3RzIG9mIG51bGwgY2hlY2tzLgotICovCi1wdWJsaWMgY2xhc3MgTnVsbENvbnRlbnRNb2RlbCBpbXBsZW1lbnRzIENNRG9jdW1lbnQgewotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTnVsbENNTmFtZWROb2RlTWFwIGltcGxlbWVudHMgQ01OYW1lZE5vZGVNYXAgewotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCQlyZXR1cm4gbmV3IE51bGxJdGVyYXRvcigpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOdWxsSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0JCXB1YmxpYyBOdWxsSXRlcmF0b3IoKSB7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCByZW1vdmUgcmVnaW9ucyB2aWEgaXRlcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCX0KLQotCXB1YmxpYyBOdWxsQ29udGVudE1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpIHsKLQkJcmV0dXJuIG5ldyBOdWxsQ01OYW1lZE5vZGVNYXAoKTsKLQl9Ci0KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCXJldHVybiBuZXcgTnVsbENNTmFtZWROb2RlTWFwKCk7Ci0JfQotCi0JcHVibGljIENNTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdjM2E5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcywgd2l0aCBpdHMgZmV3IGZpZWxkLCBpcyBhIGNvbnZpZW5jZSB0byBwcm92aWRlIGNvbXBpbGUtdGltZQotICogc2FmZXR5IHdoZW4gcmVmZXJpbmcgdG8gYSBjb250ZW50VHlwZSBJRC4gVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZAotICogZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbiBwbHVnaW4ueG1sIGZpbGUuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1maW5hbCBwdWJsaWMgY2xhc3MgQ29udGVudFR5cGVJZEZvclhNTCB7Ci0JLyoqCi0JICogVGhpcyBjb250ZW50IHR5cGUgaXMgYWN0dWFsbHkgc3VwcGxpZWQgYnkgYmFzZSBFY2xpcHNlLiBJdHMgZ2l2ZW4gaGVyZQotCSAqIGp1c3QgYXMgZG9jdW1lbnRhdGlvbiBmb3IgV1RQIGJhc2VkIGNsaWVudHMuIFR5cGljYWxseSwgY2xpZW50cyBzaG91bGQKLQkgKiB1c2UgdGhlIHZhbHVlcy9jb25zdGFudHMgc3VwcGxpZWQgYnkgYmFzZSBFY2xpcHNlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENvbnRlbnRUeXBlSURfWE1MID0gZ2V0Q29uc3RhbnRTdHJpbmcyKCk7Ci0JLyoqCi0JICogVGhpcyB2YWx1ZSBpcyBwdWJsaWMgb25seSBmb3IgdGVzdGluZyBhbmQgc3BlY2lhbCBpbmZyYXN0cnVjdHVyZS4gVGhlCi0JICogY29uc3RhbnQgbm9yIGlzIHZhbHVlIHNob3VsZCBub3QgYmUgcmVmZXJlbmNlZCBieSBjbGllbnRzLgotCSAqIAotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQgZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbgotCSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBzZXQgd2l0aCBkZWZhdWx0Ci0JICogcHJvdGVjdGVkIG1ldGhvZCBzbyBpdCB3aWxsIG5vdCBiZSBpbmxpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENvbnRlbnRUeXBlSURfU1NFWE1MID0gZ2V0Q29uc3RhbnRTdHJpbmcoKTsKLQotCS8qKgotCSAqIERvbid0IGFsbG93IGluc3RhbnRpYXRpb24uCi0JICovCi0JcHJpdmF0ZSBDb250ZW50VHlwZUlkRm9yWE1MKCkgewotCQlzdXBlcigpOwotCX0KLQotCXN0YXRpYyBTdHJpbmcgZ2V0Q29uc3RhbnRTdHJpbmcoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgU3RyaW5nIGdldENvbnN0YW50U3RyaW5nMigpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NQXR0ci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NQXR0ci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTE2ZTE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUF0dHIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBleHRlbnNpb25zIHRvIGNvcnJlc3BvbmRpbmcgRE9NIGludGVyZmFjZSB0byBlbmFibGUKLSAqIGZ1bmN0aW9ucyBmb3Igc291cmNlIGVkaXRpbmcgYW5kIGluY3JlbWVudGFsIHBhcnNpbmcuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURPTUF0dHIgZXh0ZW5kcyBJRE9NTm9kZSwgQXR0ciB7Ci0KLQkvKioKLQkgKiBHZXQncyB0aGUgcmVnaW9uIGluIGF0dHJpYnV0ZSByZXByZXNlbnRpbmcgdGhlICc9JyBzaWduLiBNYXkgb3IgbWF5IG5vdAotCSAqIGhhdmUgd2hpdGVzcGFjZSBzdXJyb3VuZGluZyBpdC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtIAotCSAqIElTU1VFOiBuZWVkIHRvIGNoYW5nZS9yZW1vdmUgdG8gYXZvaWQgZXhwb3NpbmcgJ0lUZXh0UmVnaW9uJwotCSAqIGNoYW5nZSB0byBvZmZzZXQgcGF0dGVybiwgYXMgb3RoZXJzLgotCSAqIAotCSAqIEByZXR1cm4gSVRleHRSZWdpb24gLSB0aGUgcmVnaW9uIHJlcHJlc2VudGluZyB0aGUgZXF1YWxzIHNpZ24sIG9yIG51bGwKLQkgKiAgICAgICAgIGlmIHRoZWlyIGlzIG5vIGVxdWFscyBzaWduLgotCSAqLwotCUlUZXh0UmVnaW9uIGdldEVxdWFsUmVnaW9uKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgYXR0cmlidXRlIG5hbWUsIGluY2x1ZGluZwotCSAqIHdoaXRlc3BhY2UuCi0JICogCi0JICogQHJldHVybiBpbnQgLSB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lLAotCSAqICAgICAgICAgaW5jbHVkaW5nIHdoaXRlc3BhY2UuCi0JICovCi0JaW50IGdldE5hbWVSZWdpb25FbmRPZmZzZXQoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gaW50IC0gdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lLgotCSAqLwotCWludCBnZXROYW1lUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIGF0dHJpYnV0ZSBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhdHRyaWJ1dGUgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZVJlZ2lvblRleHQoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBhdHRyaWJ1dGUgbmFtZSwgZXhjbHVkaW5nCi0JICogd2hpdGVzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludCAtIHJldHVybnMgdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBhdHRyaWJ1dGUKLQkgKiAgICAgICAgIG5hbWUsIGV4Y2x1ZGluZyB3aGl0ZXNwYWNlLgotCSAqLwotCWludCBnZXROYW1lUmVnaW9uVGV4dEVuZE9mZnNldCgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgYXR0cmlidXRlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gaW50IC0gcmV0dXJucyB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgYXR0cmlidXRlCi0JICogICAgICAgICB2YWx1ZS4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byBiZXR0ZXIgc3BlYyBpbnRlcmFjdGlvbiB3aXRoIHF1b3RlIG1hcmtzCi0JICovCi0JaW50IGdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgLSByZXR1cm5zIHRoZSB0ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYXR0cmlidXRlIHZhbHVlLgotCSAqLwotCVN0cmluZyBnZXRWYWx1ZVJlZ2lvblRleHQoKTsKLQotCS8qKgotCSAqIENoZWNrIGlmIEF0dHIgaGFzIGEgbmVzdGVkIHZhbHVlIChzdWNoIGFzIGEgSlNQIGV4cHJlc3Npb24pLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBjb250YWlucyBhIG5lc3RlZCB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCWJvb2xlYW4gaGFzTmVzdGVkVmFsdWUoKTsKLQotCS8qKgotCSAqIENoZWNrIGlmIEF0dHIgaGFzIG9ubHkgbmFtZSBidXQgbm90IGVxdWFsIHNpZ24gbm9yIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBoYXMgb25seSBuYW1lIGJ1dCBub3QgZXF1YWwgc2lnbiBub3IgdmFsdWUuCi0JICovCi0JYm9vbGVhbiBoYXNOYW1lT25seSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGF0dHJpYnV0ZSBpcyBkZWZpbmVkIGdsb2JhbGx5IGZvciBkb2N1bWVudC4gUmV0dXJucwotCSAqIGZhbHNlIGlmIGF0dHJpYnV0ZSBpcyBwcmVjZWVkZWQgYnkgYSBwcmVmaXggKHdoZXRoZXIgdmFsaWQgbmFtZSBzcGFjZQotCSAqIG9yIG5vdCkuIFJldHVybnMgdHJ1ZSBpZiBpdHMgb3duaW5nIGVsZW1lbnQgaXMgYSBnbG9iYWwgZWxlbWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgYXR0cmlidXRlIGlzIGRlZmluZWQgZ2xvYmFsbHkgZm9yIGRvY3VtZW50LiBSZXR1cm5zCi0JICogICAgICAgICBmYWxzZSBpZiBhdHRyaWJ1dGUgaXMgcHJlY2VlZGVkIGJ5IGEgcHJlZml4ICh3aGV0aGVyIHZhbGlkIG5hbWUKLQkgKiAgICAgICAgIHNwYWNlIG9yIG5vdCkuIFJldHVybnMgdHJ1ZSBpZiBpdHMgb3duaW5nIGVsZW1lbnQgaXMgYSBnbG9iYWwKLQkgKiAgICAgICAgIGVsZW1lbnQuCi0JICovCi0JYm9vbGVhbiBpc0dsb2JhbEF0dHIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBpcyB4bWwgYXR0cgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIHNwZWNpZnkgdGhpcyBvbmUgaW4gYSBtZWFuaW5nZnVsIHdheS4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gLSByZXR1cm5zIHRydWUgaWYgaXMgeG1sIGF0dHIKLQkgKi8KLQlib29sZWFuIGlzWE1MQXR0cigpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Eb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ2OWU1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Eb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZW5hYmxlcyBjcmVhdGlvbiBvZiBET0NUWVBFIGRlY2xhcmF0aW9uIGFuZCBzb21lIERPTSBMZXZlbCAyCi0gKiBpbnRlcmZhY2VzLiBNYXkgYmUgcmVmZXJlbmNlZCBidXQgbm90IGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElET01Eb2N1bWVudCBleHRlbmRzIE5vZGUsIERvY3VtZW50LCBJRE9NTm9kZSB7Ci0KLQkvKioKLQkgKiBjcmVhdGUgY29tbWVudCBlbGVtZW50LiB0YWdOYW1lIG11c3QgYmUgcmVnaXN0ZXJlZCBhcyBjb21tZW50IGVsZW1lbnQKLQkgKiBuYW1lIGluIHBsdWdpbi54bWwKLQkgKiAKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgbmFtZQotCSAqIEBwYXJhbSBpc0pTUFRhZwotCSAqICAgICAgICAgICAgdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBKU1Agc3R5bGUgY29tbWVudCAoJmx0OyUtLSAuLi4KLQkgKiAgICAgICAgICAgIC0tJSZndDspCi0JICogQHJldHVybiBFbGVtZW50IGVsZW1lbnQgaW5zdGFuY2UKLQkgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIHRocm93biBpZiB0aGUgZWxlbWVudCBuYW1lIGlzIHJlZ2lzdGVyZWQgYXMgY29tbWVudCBlbGVtZW50Ci0JICovCi0JRWxlbWVudCBjcmVhdGVDb21tZW50RWxlbWVudChTdHJpbmcgdGFnTmFtZSwgYm9vbGVhbiBpc0pTUFRhZykgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBEb2N1bWVudFR5cGUgbm9kZQotCSAqIAotCSAqIElTU1VFOiBJIGJlbGlldmUgdGhpcyAnbmFtZScgaXMgdGhlIG9uZSBzcGVjaWZpYyBpbiBkb2N0eXBlIGV4dGVuc2lvbiwKLQkgKiBuZWVkIHRvIHZlcmlmeS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSAtCi0JICogICAgICAgICAgICBuYW1lIG9mIHRoZSBkb2N0eXBlCi0JICogQHJldHVybiBEb2N1bWVudFR5cGUgLSByZXR1cm5zIGEgZG9jdW1lbnQgdHlwZSBub2RlLgotCSAqLwotCURvY3VtZW50VHlwZSBjcmVhdGVEb2N0eXBlKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIERvY3VtZW50VHlwZSBJRC4gVW5saWtlIHRoZSBzdGFuZGFyZCBET00gYXBwcm9hY2ggb2YKLQkgKiAiZ2V0RG9jdW1lbnRUeXBlKCkuZ2V0UHVibGljSWQoKSIsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGlkIGV2ZW4gaWYKLQkgKiBpbXBsaWNpdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBEb2N1bWVudFR5cGUgSUQKLQkgKi8KLQlTdHJpbmcgZ2V0RG9jdW1lbnRUeXBlSWQoKTsKLQotCS8qKgotCSAqIE5PVCBBUEkgLi4uIG5lZWRzIHRvIGJlIHJlbW92ZWQvY2hhbmdlZAotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHNwZWNpZnkKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBpcyBKU1BEb2N1bWVudAotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNKU1BEb2N1bWVudCgpOwotCi0JLyoqCi0JICogTk9UIEFQSSAuLi4gbmVlZHMgdG8gYmUgcmVtb3ZlZC9jaGFuZ2VkCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gc3BlY2lmeQotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICogCi0JICovCi0JYm9vbGVhbiBpc0pTUFR5cGUoKTsKLQotCS8qKgotCSAqIE5PVCBBUEkgLi4uIG1heSByZW1vdmVkL2NoYW5nZWQKLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byBzcGVjaWZ5IC0tIGN1cnJlbnRseSB1c2VkIHRvIGRlbm90ZSBhbiBIVE1MIERPTSBkb2N1bWVudAotCSAqIGlzIFhIVE1MCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKiAKLQkgKi8KLQlib29sZWFuIGlzWE1MVHlwZSgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Eb2N1bWVudFR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTURvY3VtZW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDJjNjVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTURvY3VtZW50VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZW5hYmxlcyBzZXR0aW5nIG9mIFB1YmxpYyBhbmQgU3lzdGVtIElEIGZvciBET0NUWVBFCi0gKiBkZWNsYXJhdGlvbi4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURPTURvY3VtZW50VHlwZSBleHRlbmRzIElET01Ob2RlLCBEb2N1bWVudFR5cGUgewotCi0KLQkvKioKLQkgKiBTZXRzIGRvY3VtZW50IHR5cGUncyBwdWJsaWMgaWQsIGFzIHNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gU3RyaW5nIC0KLQkgKiAgICAgICAgICAgIHRoZSBwdWJsaWNJZAotCSAqLwotCXZvaWQgc2V0UHVibGljSWQoU3RyaW5nIHB1YmxpY0lkKTsKLQotCS8qKgotCSAqIFNldHMgZG9jbWVudCB0eXBlJ3Mgc3lzdGVtIGlkLCBhcyBzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIFN0cmluZyAtCi0JICogICAgICAgICAgICB0aGUgc3lzdGVtSWQKLQkgKi8KLQl2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBzeXN0ZW1JZCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01FbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZDc3NjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBleHRlbnNpb25zIHRvIGNvcnJlc3BvbmRpbmcgRE9NIGludGVyZmFjZSB0byBlbmFibGUKLSAqIGZ1bmN0aW9ucyBmb3Igc291cmNlIGVkaXRpbmcgYW5kIGluY3JlbWVudGFsIHBhcnNpbmcuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURPTUVsZW1lbnQgZXh0ZW5kcyBJRE9NTm9kZSwgRWxlbWVudCB7Ci0KLQkvKioKLQkgKiBSZXR1bnMgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgZW5kIHRhZy4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byBzb3J0IG91dCBuZWVkIGZvciB0aGlzCi0JICogCi0JICogQHJldHVybiBpbnQgLSB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBlbmQgdGFnLgotCSAqLwotCWludCBnZXRFbmRTdGFydE9mZnNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5kIG9mZnNldCBvZiB0aGUKLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byBzb3J0IG91dCBuZWVkIGZvciB0aGlzCi0JICogCi0JICogQHJldHVybiBpbnQgLSB0aGUgZW5kIG9mZnNldCBvZiB0aGUgc3RhcnQgdGFnLgotCSAqLwotCWludCBnZXRTdGFydEVuZE9mZnNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGhhcyBhbiBlbmQgdGFnLgotCSAqIAotCSAqIEluIG91ciBzb3VyY2Utb3JpZW50ZWQgRE9NLCBzb21ldGltZXMgRWxlbWVudHMgYXJlICJlbmRlZCIsIGV2ZW4KLQkgKiB3aXRob3V0IGFuIGV4cGxpY2l0IGVuZCB0YWcgaW4gdGhlIHNvdXJjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgaGFzIGFuIGVuZCB0YWcuCi0JICovCi0JYm9vbGVhbiBoYXNFbmRUYWcoKTsKLQotCS8qKgotCSAqIHJldHVybnMgdHJ1ZSBpZiBoYXMgYSBzdGFydCB0YWcuCi0JICogCi0JICogSW4gb3VyIHNvdXJjZS1vcmllbnRlZCBET00sIGEgbG9uZSBlbmQgdGFnIHdpbGwgY2F1c2UgYSBub2RlIHRvIGJlCi0JICogY3JlYXRlZCBpbiB0aGUgdHJlZSwgdW5saWtlIHdlbGwtZm9ybWVkLW9ubHkgRE9Ncy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgaGFzIGEgc3RhcnQgdGFnLgotCSAqLwotCWJvb2xlYW4gaGFzU3RhcnRUYWcoKTsKLQotCS8qKgotCSAqIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgaXMgYSBjb21tZW50IGVsZW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBlbGVtZW50IGlzIGEgY29tbWVudCBlbGVtZW50Ci0JICovCi0JYm9vbGVhbiBpc0NvbW1lbnRUYWcoKTsKLQotCS8qKgotCSAqIGlzRW1wdHlUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuIC0gdHJ1ZSBpZiBpcyBlbXB0eSB0YWcsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCWJvb2xlYW4gaXNFbXB0eVRhZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGZsb2F0aW5nIGVuZCB0YWcuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGZsb2F0aW5nIGVuZCB0YWcuCi0JICovCi0JYm9vbGVhbiBpc0VuZFRhZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGZvciAiZ2xvYmFsIHRhZyIgKGJhc2ljYWxseSwgd2l0aG91dCBwcmVmaXgpCi0JICogCi0JICogQHJldHVybiB0cnVlIGZvciAiZ2xvYmFsIHRhZyIgKGJhc2ljYWxseSwgd2l0aG91dCBwcmVmaXgpCi0JICovCi0JYm9vbGVhbiBpc0dsb2JhbFRhZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGZvciBubyBzdGFydCBhbmQgdGhlIGVuZCB0YWdzIGluIHNvdXJjZS4KLQkgKiAKLQkgKiBQcm92aWRlZCBmb3Igc29tZSB2ZXJ5IHNwZWNpYWwgY2FzZXMgd2hlbiwgZm9yIGV4YW1wbGUsIGFuZCBIVE1MIHRhZyBpcwotCSAqIGFzc3VtZWQgaW4gYW4gSFRNTCBkb2N1bWVudCB0aGF0IGRvZXMgbm90IGhhdmUgYSBsaXRlcmFsIEhUTUwgdGFnLgotCSAqIAotCSAqIElTU1VFOiBjaGVjayB3aXRoIGNsaWVudHMgdG8gc2VlIGlmIHN0aWxsIG5lZWRlZAotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBvciBubyBzdGFydCBhbmQgdGhlIGVuZCB0YWdzIGluIHNvdXJjZS4KLQkgKi8KLQlib29sZWFuIGlzSW1wbGljaXRUYWcoKTsKLQotCS8qKgotCSAqIGlzSlNQVGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIAotCSAqIElTU1VFOiBjaGFuZ2UgdG8gaXNDb250YWluZXJMYW5ndWFnZVRhZyhTdHJpbmcgdHlwZSk7Ci0JICovCi0JYm9vbGVhbiBpc0pTUFRhZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHN0YXJ0IHRhZyBpcyBjbG9zZWQuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHN0YXJ0IHRhZyBpcyBjbG9zZWQuCi0JICovCi0JYm9vbGVhbiBpc1N0YXJ0VGFnQ2xvc2VkKCk7Ci0KLQkvKioKLQkgKiByZXR1cm5zIHRydWUgaWYgaXMgeG1sIHRhZwotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHNwZWMgdGhpcyBiZXR0ZXIuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGlzIHhtbCB0YWcKLQkgKi8KLQlib29sZWFuIGlzWE1MVGFnKCk7Ci0KLQkvKioKLQkgKiBOT1QgQ0xJRU5UIEFQSQotCSAqIAotCSAqIG5vdGlmeUVuZFRhZ0NoYW5nZWQKLQkgKiAKLQkgKi8KLQl2b2lkIG5vdGlmeUVuZFRhZ0NoYW5nZWQoKTsKLQotCS8qKgotCSAqIE5PVCBDTElFTlQgQVBJCi0JICogCi0JICogbm90aWZ5U3RhcnRUYWdDaGFuZ2VkCi0JICogCi0JICovCi0Jdm9pZCBub3RpZnlTdGFydFRhZ0NoYW5nZWQoKTsKLQotCS8qKgotCSAqIE5PVCBDTElFTlQgQVBJCi0JICogCi0JICogU2lnbmlmeSB0aGF0IHRoaXMgdGFnIGlzIGEgY29tbWVudAotCSAqIAotCSAqIEZvciB1c2Ugb25seSBieSBwYXJzZXJzLgotCSAqIAotCSAqLwotCXZvaWQgc2V0Q29tbWVudFRhZyhib29sZWFuIGlzQ29tbWVudFRhZyk7Ci0KLQkvKioKLQkgKiBOT1QgQ0xJRU5UIEFQSQotCSAqIAotCSAqIFNpZ25pZnkgdGhhdCB0aGlzIHRhZyBpcyBhbiBlbXB0eSB0YWcKLQkgKiAKLQkgKiBGb3IgdXNlIG9ubHkgYnkgcGFyc2VycwotCSAqLwotCXZvaWQgc2V0RW1wdHlUYWcoYm9vbGVhbiBpc0VtcHR5VGFnKTsKLQotCS8qKgotCSAqIE5PVCBDTElFTlQgQVBJCi0JICogCi0JICogU2lnbmlmeSB0aGF0IHRoaXMgdGFnIGlzIGEgSlNQIHRhZwotCSAqIAotCSAqIEZvciB1c2Ugb25seSBieSBwYXJzZXJzCi0JICogCi0JICogSVNTVUU6IEkgaGF2ZSBoYWQgb25lIG5vbi1wYXJzaW5nIGNsaWVudCB3aG8gaGFzIGhhZCB0byB1c2UgdGhpcyAuLi4KLQkgKiBuZWVkIHRvIGNoZWNrCi0JICogCi0JICovCi0Jdm9pZCBzZXRKU1BUYWcoYm9vbGVhbiBpc0pTUFRhZyk7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNJZCk7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBib29sZWFuIGlzSWQpOwotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkQXR0cmlidXRlTm9kZShBdHRyIGlkQXR0ciwgYm9vbGVhbiBpc0lkKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01FbnRpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTIyZWMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5OwotCi1wdWJsaWMgaW50ZXJmYWNlIElET01FbnRpdHkgZXh0ZW5kcyBFbnRpdHkgewotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIDMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbnB1dEVuY29kaW5nKCk7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gMy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFhtbEVuY29kaW5nKCk7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gMy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFhtbFZlcnNpb24oKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUltcGxlbWVudGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01JbXBsZW1lbnRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTczZTI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUltcGxlbWVudGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURPTUltcGxlbWVudGF0aW9uIHsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gVGhpcyBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIDMuCi0JICogCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHNwZWNpYWxpemVkIG9iamVjdCB3aGljaCBpbXBsZW1lbnRzIHRoZQotCSAqIHNwZWNpYWxpemVkIEFQSXMgb2YgdGhlIHNwZWNpZmllZCBmZWF0dXJlIGFuZCB2ZXJzaW9uLCBhcyBzcGVjaWZpZWQgaW4gLgotCSAqIFRoZSBzcGVjaWFsaXplZCBvYmplY3QgbWF5IGFsc28gYmUgb2J0YWluZWQgYnkgdXNpbmcgYmluZGluZy1zcGVjaWZpYwotCSAqIGNhc3RpbmcgbWV0aG9kcyBidXQgaXMgbm90IG5lY2Vzc2FyaWx5IGV4cGVjdGVkIHRvLCBhcyBkaXNjdXNzZWQgaW4gLgotCSAqIFRoaXMgbWV0aG9kIGFsc28gYWxsb3cgdGhlIGltcGxlbWVudGF0aW9uIHRvIHByb3ZpZGUgc3BlY2lhbGl6ZWQKLQkgKiBvYmplY3RzIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHRoZSA8Y29kZT5ET01JbXBsZW1lbnRhdGlvbjwvY29kZT4KLQkgKiBpbnRlcmZhY2UuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlIHJlcXVlc3RlZC4gTm90ZSB0aGF0IGFueSBwbHVzIHNpZ24KLQkgKiAgICAgICAgICAgICIrIiBwcmVwZW5kZWQgdG8gdGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUgd2lsbCBiZSBpZ25vcmVkCi0JICogICAgICAgICAgICBzaW5jZSBpdCBpcyBub3Qgc2lnbmlmaWNhbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhpcyBtZXRob2QuCi0JICogQHBhcmFtIHZlcnNpb24KLQkgKiAgICAgICAgICAgIFRoaXMgaXMgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBmZWF0dXJlIHRvIHRlc3QuCi0JICogQHJldHVybiBSZXR1cm5zIGFuIG9iamVjdCB3aGljaCBpbXBsZW1lbnRzIHRoZSBzcGVjaWFsaXplZCBBUElzIG9mIHRoZQotCSAqICAgICAgICAgc3BlY2lmaWVkIGZlYXR1cmUgYW5kIHZlcnNpb24sIGlmIGFueSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgIGlmIHRoZXJlIGlzIG5vIG9iamVjdCB3aGljaCBpbXBsZW1lbnRzIGludGVyZmFjZXMgYXNzb2NpYXRlZAotCSAqICAgICAgICAgd2l0aCB0aGF0IGZlYXR1cmUuIElmIHRoZSA8Y29kZT5ET01PYmplY3Q8L2NvZGU+IHJldHVybmVkIGJ5Ci0JICogICAgICAgICB0aGlzIG1ldGhvZCBpbXBsZW1lbnRzIHRoZSA8Y29kZT5ET01JbXBsZW1lbnRhdGlvbjwvY29kZT4KLQkgKiAgICAgICAgIGludGVyZmFjZSwgaXQgbXVzdCBkZWxlZ2F0ZSB0byB0aGUgcHJpbWFyeSBjb3JlCi0JICogICAgICAgICA8Y29kZT5ET01JbXBsZW1lbnRhdGlvbjwvY29kZT4gYW5kIG5vdCByZXR1cm4gcmVzdWx0cwotCSAqICAgICAgICAgaW5jb25zaXN0ZW50IHdpdGggdGhlIHByaW1hcnkgY29yZQotCSAqICAgICAgICAgPGNvZGU+RE9NSW1wbGVtZW50YXRpb248L2NvZGU+IHN1Y2ggYXMKLQkgKiAgICAgICAgIDxjb2RlPmhhc0ZlYXR1cmU8L2NvZGU+LCA8Y29kZT5nZXRGZWF0dXJlPC9jb2RlPiwgZXRjLgotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZmZjN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuWE1MTW9kZWxOb3RpZmllcjsKLQotLyoqCi0gKiBQcm92aWRlcyBtZWFucyB0byBnZXQgdGhlIFhNTE1vZGVsIGZvcm0gb2YgSVN0cnVjdXRyZWRNb2RlbC4gTm90IHRvIGJlCi0gKiBpbXBsZW1lbnRlZCBvciBleHRlbmRlZCBieSBjbGllbnRzLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE9NTW9kZWwgZXh0ZW5kcyBJU3RydWN0dXJlZE1vZGVsIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIERPTSBEb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBET00gRG9jdW1lbnQuCi0JICovCi0JSURPTURvY3VtZW50IGdldERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBSZXR1cm5zIGFuIHNvdXJjZSBnZW5lcmF0b3IgYXBwcm9wcmlhdGUgZm9yIHRoaXMgbW9kZWwuCi0JICogCi0JICogQHJldHVybiB0aGUgc291cmNlIGdlbmVyYXRvcgotCSAqLwotCUlTb3VyY2VHZW5lcmF0b3IgZ2V0R2VuZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBOT1QgQ0xJRU5UIEFQSQotCSAqIAotCSAqIFJldHVybnMgYW4gWE1MTW9kZWxOb3RpZmllci4gQ2xpZW50cyBzaG91bGQgbm90IHVzZS4KLQkgKiAKLQkgKiBJU1NVRTogc2hvdWxkIGJlICJpbnRlcm5hbGl6ZWQiLgotCSAqIAotCSAqLwotCVhNTE1vZGVsTm90aWZpZXIgZ2V0TW9kZWxOb3RpZmllcigpOwotCi0JLyoqCi0JICogTk9UIENMSUVOVCBBUEkKLQkgKgotCSAqIFNldHMgdGhlIG1vZGVsIG5vdGlmaWVyIENsaWVudHMgc2hvdWxkIG5vdCB1c2UuCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gcmV2aWV3IHdpdGggbGVnYWN5IGNsaWVudHMuCi0JICovCi0Jdm9pZCBzZXRNb2RlbE5vdGlmaWVyKFhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDg4NzVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBkZXNjcmliZXMgdGhlIGV4dGVuZGVkIGZ1bmN0aW9uYWxpdHkgb2Ygb3VyIHNvdXJjZS1vcmllbnRlZAotICogRE9NLiBGaXJzdCwgb3VyIG5vZGVzIGV4dGVuZCB0aGUgdzNjIE5vZGUgaW50ZXJmYWNlLCBJbmRleGVkUmVnaW9uLCBhbmQKLSAqIElOb2RlTm90aWZpZXIuIFBsdXMsIGhhcyB0aGUgZXh0cmEgbWV0aG9kcyBjYWxsZWQgb3V0IGhlcmUuCi0gKiAKLSAqIElTU1VFOiB0aGUgJ3JlYWQtb25seScgQVBJIHNob3VsZCBiZSBicm9rZW4gb3V0IGluIHRoZWlyIG93biBpbnRlcmZhY2UKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE9NTm9kZSBleHRlbmRzIEluZGV4ZWRSZWdpb24sIElOb2RlTm90aWZpZXIsIE5vZGUgewotCi0JLyoqCi0JICogR2V0cyB0aGUgbGFzdCBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiBvZiB0aGlzIG5vZGUuCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gcmVzb2x2ZSBnZXRFbmQvZ2V0TGFzdCBjb25mdXNpb24uCi0JICogCi0JICogQHJldHVybiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIC0gcmV0dXJucyB0aGUgbGFzdCBzdHJ1Y3R1cmVkCi0JICogICAgICAgICBkb2N1bWVudCByZWdpb24gYXNzb2NpYXRlZCB3aXRoCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGZpcnN0IHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9uIG9mIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byByZXNvbHZlIGdldEZpcnN0L2dldFN0YXJ0IGNvbmZ1c2lvbgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZpcnN0IHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9uIG9mIHRoaXMgbm9kZS4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsYXN0IHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9uIG9mIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byByZXNvbHZlIGdldEVuZC9nZXRMYXN0IGNvbmZ1c2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gLSByZXR1cm5zIHRoZSBsYXN0IHN0cnVjdHVyZWQKLQkgKiAgICAgICAgIGRvY3VtZW50IHJlZ2lvbiBhc3NvY2lhdGVkIHdpdGgKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuIFJldHVybnMgbnVsbCBpZiBub3QgcGFydAotCSAqIG9mIGFuIGFjdGl2ZSBtb2RlbC4KLQkgKiAKLQkgKiBAcmV0dXJuIElET01Nb2RlbCAtIHJldHVybnMgdGhlIElET01Nb2RlbCB0aGlzIG5vZGUgaXMgcGFydCBvZi4KLQkgKi8KLQlJRE9NTW9kZWwgZ2V0TW9kZWwoKTsKLQotCS8qKgotCSAqIEdldCdzIHRoZSByZWdpb24gcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIHRoaXMgbm9kZQotCSAqIAotCSAqIElTU1VFOiBvbmx5IGltcGxlbWVudGVkL3VzZWQgYXQgYXR0cmlidXRlIGFuZCBEVEROb2RlcyAtLSBzaG91bGQgbW92ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIElUZXh0UmVnaW9uIC0gcmV0dXJucyB0aGUgSVRleHRSZWdpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMKLQkgKiAgICAgICAgIE5vZGUuCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHNvdXJjZSByZXByZXNlbnRpbmcgdGhpcyBub2RlIGluIHNvdXJjZSBkb2N1bWVudC4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byBmaXggaW1wbGVtZW50YXRpb24gdG8gbWF0Y2guCi0JICogCi0JICogQHJldHVybiB0aGUgbGl0ZXJhbCBzb3VyY2UgcmVwcmVzZW50aW5nIHRoaXMgbm9kZSBpbiBzb3VyY2UgZG9jdW1lbnQuCi0JICovCi0JU3RyaW5nIGdldFNvdXJjZSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgZmlyc3Qgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24gb2YgdGhpcyBub2RlLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHJlc29sdmUgZ2V0Rmlyc3QvZ2V0U3RhcnQgY29uZnVzaW9uCi0JICogCi0JICogQHJldHVybiB0aGUgZmlyc3Qgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24gb2YgdGhpcyBub2RlLgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cnVjdHVyZWQgZG9jdW1lbnQgdGhhdCB1bmRlcmxpZXMgdGhpcyBub2RlJ3MgbW9kZWwuCi0JICogCi0JICogUmV0dXJucyBudWxsIGlmIHRoaXMgbm9kZSBpcyBub3QgYWN0aXZlbHkgcGFydCBvZiBhIHNvdXJjZSBkb2N1bWVudC4gSW4KLQkgKiBjb250cmFzdCwgaW4gdGhlIHB1cmUgRE9NIHdvcmxkLCAib3duaW5nIGRvY3VtZW50IiBpcyBub3QgbnVsbCBldmVuCi0JICogYWZ0ZXIgYSBub2RlIGlzIGRlbGV0ZWQgZnJvbSB0aGUgRE9NLgotCSAqIAotCSAqIElTU1VFOiB3ZSBuZWVkIHRvIGZpeCBvdXIgaW1wbGVtZW50YXRpb24gdG8gbWF0Y2ggdGhpcyBzcGVjLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHN0cnVjdHVyZWQgZG9jdW1lbnQuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIEdldCdzIHRoZSByZWdpb24gcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGlzIG5vZGUgaWYgb25seSBvbmUKLQkgKiBJVGV4dFJlZ2lvbiwgbnVsbCBvdGhlcndpc2UuCi0JICogCi0JICogSVNTVUU6IG9ubHkgaW1wbGVtZW50ZWQvdXNlZCBhdCBhdHRyaWJ1dGUgbGV2ZWwsIG1vdmUgImRvd24iLgotCSAqIAotCSAqIEByZXR1cm4gSVRleHRSZWdpb24gLSByZXR1cm5zIHRoZSBJVGV4dFJlZ2lvbiBhc3NvY2lhdGVkIHdpdGggdGhpcwotCSAqICAgICAgICAgTm9kZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCUlUZXh0UmVnaW9uIGdldFZhbHVlUmVnaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc291cmNlIG9mIHRoaXMgbm9kZSwgYnV0IHdpdGgKLQkgKiBjaGFyYWN0ZXIgZW50aWVzIGNvbnZlcnRlZCAoZS5nLiAmbHQ7IGlzIGNvbnZlcnRlZCB0byAnPCcpLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIGJldHRlciBzcGVjIGV4dGVudCBvZiB0aGlzIGNvbnZlcnNpb24sIHdlIG1heSBub3Qga25vdwotCSAqIGFsbCBjaGFyYWN0ZXIgZW50aXRpZXMuCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gZml4IGltcGxlbWVudGF0aW9uIHRvIG1hdGNoIHNwZWMuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgLSBnZXQncyB0aGUgc291cmNlIG9mIHRoaXMgTm9kZS4KLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWVTb3VyY2UoKTsKLQotCS8qKgotCSAqIFVzZWQgdG8ga25vdyByZWFkLW9ubHkgc3RhdGUgb2YgY2hpbGRyZW4uCi0JICogCi0JICogQHJldHVybiBib29sZWFuIFdoZXRoZXIgY2hpbGRyZW4gb2YgdGhlIGVsZW1lbnQgY2FuIGJlIGFwcGVuZGVkIG9yCi0JICogICAgICAgICByZW1vdmVkLgotCSAqLwotCWJvb2xlYW4gaXNDaGlsZEVkaXRhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGFnIGlzIGNsb3NlZCBpbiBzb3VyY2UuCi0JICogCi0JICogSW4gb3VyIHNvdXJjZSBvcmllbnQgRE9NIHdlIHNvbWV0aW1lcyBlbmQgYSBOb2RlIHdpdGhvdXQgaXQgYmVpbmcKLQkgKiBleHBsaWNpdGx5IGNsb3NlZCBpbiBzb3VyY2UuCi0JICogCi0JICogQHJldHVybiBib29sZWFuIC0gdHJ1ZSBpZiBub2RlIGlzIGNsb3NlZAotCSAqLwotCWJvb2xlYW4gaXNDbG9zZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG5vZGUgY2FuIGNvbnRhaW4gY2hpbGRyZW4uCi0JICogCi0JICogQHJldHVybiBib29sZWFuIC0gdHJ1ZSBpZiB0aGlzIG5vZGUgY2FuIGNvbnRhaW4gY2hpbGRyZW4uCi0JICovCi0JYm9vbGVhbiBpc0NvbnRhaW5lcigpOwotCi0JLyoqCi0JICogVXNlZCB0byBrbm93IHJlYWQtb25seSBzdGF0ZSBvZiBkYXRhLgotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNEYXRhRWRpdGFibGUoKTsKLQotCS8qKgotCSAqIFNldCdzIHJlYWRvbmx5IHN0YXRlIG9mIGNoaWxkcmVuCi0JICogCi0JICovCi0Jdm9pZCBzZXRDaGlsZEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpOwotCi0JLyoqCi0JICogU2V0J3MgcmVhZG9ubHkgc3RhdGUgb2YgZGF0YQotCSAqIAotCSAqLwotCXZvaWQgc2V0RGF0YUVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpOwotCi0JLyoqCi0JICogU2V0cyByZWFkb25seSBzdGF0ZSBvZiBkYXRhCi0JICogCi0JICogZmFzdGVyIGFwcHJvYWNoIHRvIHNldCByZWFkLW9ubHkgc3RhdGUuCi0JICovCi0Jdm9pZCBzZXRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlLCBib29sZWFuIGRlZXApOwotCi0JLyoqCi0JICogU2V0cyB0aGUgc3BlY2lmaWVkIHJhdyBzb3VyY2UgdG8gdGhlIFRleHQgbm9kZS4gVGhyb3dzCi0JICogSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbiB3aGVuIHRoZSBzcGVjaWZpZWQgcmF3IHNvdXJjZSBpbmNsdWRlcwotCSAqIGludmFsaWQgY2hhcmFjdGVycywgc3VjaCBhcywgJyA8JywgJz4nIGFuZCAnJicuIFZhbGlkIGNoYXJhY3RlcgotCSAqIGVudGl0aWVzLCBzdWNoIGFzLCAiJmFtcDtsdDsiLCBhcmUgYWNjZXB0ZWQuCi0JICovCi0Jdm9pZCBzZXRTb3VyY2UoU3RyaW5nIHNvdXJjZSkgdGhyb3dzIEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzcGVjaWZpZWQgcmF3IHNvdXJjZSB0byB0aGUgVGV4dCBvciBBdHRyIG5vZGUncyB2YWx1ZS4gV2hlbgotCSAqIHRoZSBzcGVjaWZpZWQgcmF3IHNvdXJjZSBpbmNsdWRlcyBpbnZhbGlkIGNoYXJhY3RlcnMsIHN1Y2ggYXMsICcgPCcsCi0JICogJz4nIGFuZCAnJicsIGNvbnZlcnRzIHRoZW0uIFZhbGlkIGNoYXJhY3RlciBlbnRpdGllcywgc3VjaCBhcywKLQkgKiAiJmFtcDtsdDsiLCBhcmUgYWNjZXB0ZWQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZVNvdXJjZShTdHJpbmcgc291cmNlKTsKLQkKLQkKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHNob3J0IGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKE5vZGUgb3RoZXIpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZVVSSSgpOwotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0Q29udGVudCgpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VXNlckRhdGEoU3RyaW5nIGtleSk7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlVVJJKTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFcXVhbE5vZGUoTm9kZSBhcmcpOwotCQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYW1lTm9kZShOb2RlIG90aGVyKTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFN0cmluZyBsb29rdXBOYW1lc3BhY2VVUkkoU3RyaW5nIHByZWZpeCk7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9va3VwUHJlZml4KFN0cmluZyBuYW1lc3BhY2VVUkkpOwotCQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dENvbnRlbnQoU3RyaW5nIHRleHRDb250ZW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCQotCQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NVGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmIzYTVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTVRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGV4dGVuc2lvbnMgdG8gY29ycmVzcG9uZGluZyBET00gaW50ZXJmYWNlIHRvIGVuYWJsZQotICogZnVuY3Rpb25zIGZvciBzb3VyY2UgZWRpdGluZyBhbmQgaW5jcmVtZW50YWwgcGFyc2luZy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE9NVGV4dCBleHRlbmRzIElET01Ob2RlLCBUZXh0IHsKLQotCS8qKgotCSAqIE5PVCBBUEkgLSBjYW4gYmUgZWxpbWluYXRlZCBvciBtb3ZlZCB0byBsdGsgbGV2ZWwKLQkgKiAKLQkgKiBBcHBlbmRzIHRoZSBjb250ZW50IG9mIHRoZSB0ZXh0IG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dCAtCi0JICogICAgICAgICAgICB0aGUgVGV4dCB0byBhcHBlbmQuCi0JICovCi0Jdm9pZCBhcHBlbmRUZXh0KFRleHQgdGV4dCk7Ci0KLQkvKioKLQkgKiBOT1QgQVBJIC0gY2FuIGJlIGVsaW1pbmF0ZWQgb3IgbW92ZWQgdG8gbHRrIGxldmVsCi0JICogCi0JICogUmV0dXJucyB0cnVlIGlmIGlzIG5vdCB2YWxpZC4KLQkgKi8KLQlib29sZWFuIGlzSW52YWxpZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGlzIGVudGlyZWx5IHdoaXRlIHNwYWNlLgotCSAqIAotCSAqIFRoaXMgaXMgaW50ZW5lZCB0byBiZSBiZXR0ZXIgcGVyZm9ybWluZyB0aGF0IGFsbCBjbGllbnRzIGdldHRpbmcgdGhlCi0JICogc291cmNlLCBhbmQgY2hlY2tpbmcgdGhlbXNlbHZlcy4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byBjbGFyaWZ5IGlmIGltcGxlbWVudGF0aW9uIGlzIHB1cmUgdG8gIndoaXRlIHNwYWNlIiBhcwotCSAqIHBlciBET00gc3BlYz8gSGVyZSBpcyB0aGUgRE9NIHNwZWM6Ci0JICogCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgdGV4dCBub2RlIGNvbnRhaW5zIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwNC9SRUMteG1sLWluZm9zZXQtMjAwNDAyMDQjaW5mb2l0ZW0uY2hhcmFjdGVyJz4KLQkgKiBlbGVtZW50IGNvbnRlbnQgd2hpdGVzcGFjZTwvYT4sIG9mdGVuIGFidXNpdmVseSBjYWxsZWQgImlnbm9yYWJsZQotCSAqIHdoaXRlc3BhY2UiLiBUaGUgdGV4dCBub2RlIGlzIGRldGVybWluZWQgdG8gY29udGFpbiB3aGl0ZXNwYWNlIGluCi0JICogZWxlbWVudCBjb250ZW50IGR1cmluZyB0aGUgbG9hZCBvZiB0aGUgZG9jdW1lbnQgb3IgaWYgdmFsaWRhdGlvbiBvY2N1cnMKLQkgKiB3aGlsZSB1c2luZyA8Y29kZT5Eb2N1bWVudC5ub3JtYWxpemVEb2N1bWVudCgpPC9jb2RlPi4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGlzIGVudGlyZWx5IHdoaXRlIHNwYWNlLgotCSAqLwotCi0JcHVibGljIGJvb2xlYW4gaXNFbGVtZW50Q29udGVudFdoaXRlc3BhY2UoKTsKLQotCS8qKgotCSAqIE5PVCBZRVQgSU1QTEVNVEVOVEVEIGJ1dCBleGlzdHMgaGVyZSBpbnRlcmZhY2UgaW4gcHJlcGFyYXRpb24gZm9yIERPTTMKLQkgKiAKLQkgKiBSZXR1cm5zIGFsbCB0ZXh0IG9mIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGVzIGxvZ2ljYWxseS1hZGphY2VudCB0ZXh0Ci0JICogbm9kZXMgdG8gdGhpcyBub2RlLCBjb25jYXRlbmF0ZWQgaW4gZG9jdW1lbnQgb3JkZXIuIDxicj4KLQkgKiBGb3IgaW5zdGFuY2UsIGluIHRoZSBleGFtcGxlIGJlbG93IDxjb2RlPndob2xlVGV4dDwvY29kZT4gb24gdGhlCi0JICogPGNvZGU+VGV4dDwvY29kZT4gbm9kZSB0aGF0IGNvbnRhaW5zICJiYXIiIHJldHVybnMgImJhcmZvbyIsIHdoaWxlIG9uCi0JICogdGhlIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUgdGhhdCBjb250YWlucyAiZm9vIiBpdCByZXR1cm5zICJiYXJmb28iLgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdob2xlVGV4dCgpOwotCi0JLyoqCi0JICogTk9UIFlFVCBJTVBMRU1URU5URUQgYnV0IGV4aXN0cyBoZXJlIGludGVyZmFjZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NMwotCSAqIAotCSAqIFJlcGxhY2VzIHRoZSB0ZXh0IG9mIHRoZSBjdXJyZW50IG5vZGUgYW5kIGFsbCBsb2dpY2FsbHktYWRqYWNlbnQgdGV4dAotCSAqIG5vZGVzIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0LiBBbGwgbG9naWNhbGx5LWFkamFjZW50IHRleHQgbm9kZXMgYXJlCi0JICogcmVtb3ZlZCBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgbm9kZSB1bmxlc3MgaXQgd2FzIHRoZSByZWNpcGllbnQgb2YgdGhlCi0JICogcmVwbGFjZW1lbnQgdGV4dC4gPGJyPgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5vZGUgd2hpY2ggcmVjZWl2ZWQgdGhlIHJlcGxhY2VtZW50IHRleHQuIFRoZQotCSAqIHJldHVybmVkIG5vZGUgaXM6Ci0JICogPHVsPgotCSAqIDxsaT48Y29kZT5udWxsPC9jb2RlPiwgd2hlbiB0aGUgcmVwbGFjZW1lbnQgdGV4dCBpcyB0aGUgZW1wdHkKLQkgKiBzdHJpbmc7IDwvbGk+Ci0JICogPGxpPnRoZSBjdXJyZW50IG5vZGUsIGV4Y2VwdCB3aGVuIHRoZSBjdXJyZW50IG5vZGUgaXMgcmVhZC1vbmx5OyA8L2xpPgotCSAqIDxsaT4gYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gbm9kZSBvZiB0aGUgc2FtZSB0eXBlICgKLQkgKiA8Y29kZT5UZXh0PC9jb2RlPiBvciA8Y29kZT5DREFUQVNlY3Rpb248L2NvZGU+KSBhcyB0aGUgY3VycmVudAotCSAqIG5vZGUgaW5zZXJ0ZWQgYXQgdGhlIGxvY2F0aW9uIG9mIHRoZSByZXBsYWNlbWVudC4gPC9saT4KLQkgKiA8L3VsPgotCSAqIDxicj4KLQkgKiBGb3IgaW5zdGFuY2UsIGluIHRoZSBhYm92ZSBleGFtcGxlIGNhbGxpbmcKLQkgKiA8Y29kZT5yZXBsYWNlV2hvbGVUZXh0PC9jb2RlPiBvbiB0aGUgPGNvZGU+VGV4dDwvY29kZT4gbm9kZSB0aGF0Ci0JICogY29udGFpbnMgImJhciIgd2l0aCAieW8iIGluIGFyZ3VtZW50IHJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZzogPGJyPgotCSAqIFdoZXJlIHRoZSBub2RlcyB0byBiZSByZW1vdmVkIGFyZSByZWFkLW9ubHkgZGVzY2VuZGFudHMgb2YgYW4KLQkgKiA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+LCB0aGUgPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPgotCSAqIG11c3QgYmUgcmVtb3ZlZCBpbnN0ZWFkIG9mIHRoZSByZWFkLW9ubHkgbm9kZXMuIElmIGFueQotCSAqIDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4gdG8gYmUgcmVtb3ZlZCBoYXMgZGVzY2VuZGFudHMgdGhhdCBhcmUKLQkgKiBub3QgPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPiwgPGNvZGU+VGV4dDwvY29kZT4sIG9yCi0JICogPGNvZGU+Q0RBVEFTZWN0aW9uPC9jb2RlPiBub2RlcywgdGhlIDxjb2RlPnJlcGxhY2VXaG9sZVRleHQ8L2NvZGU+Ci0JICogbWV0aG9kIG11c3QgZmFpbCBiZWZvcmUgcGVyZm9ybWluZyBhbnkgbW9kaWZpY2F0aW9uIG9mIHRoZSBkb2N1bWVudCwKLQkgKiByYWlzaW5nIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiB3aXRoIHRoZSBjb2RlCi0JICogPGNvZGU+Tk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSPC9jb2RlPi4gPGJyPgotCSAqIEZvciBpbnN0YW5jZSwgaW4gdGhlIGV4YW1wbGUgYmVsb3cgY2FsbGluZwotCSAqIDxjb2RlPnJlcGxhY2VXaG9sZVRleHQ8L2NvZGU+IG9uIHRoZSA8Y29kZT5UZXh0PC9jb2RlPiBub2RlIHRoYXQKLQkgKiBjb250YWlucyAiYmFyIiBmYWlscywgYmVjYXVzZSB0aGUgPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPiBub2RlCi0JICogImVudCIgY29udGFpbnMgYW4gPGNvZGU+RWxlbWVudDwvY29kZT4gbm9kZSB3aGljaCBjYW5ub3QgYmUgcmVtb3ZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudAotCSAqICAgICAgICAgICAgVGhlIGNvbnRlbnQgb2YgdGhlIHJlcGxhY2luZyA8Y29kZT5UZXh0PC9jb2RlPiBub2RlLgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUgY3JlYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiAgICAgICAgIGNvbnRlbnQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiBvbmUgb2YgdGhlCi0JICogICAgICAgICAgICAgICAgPGNvZGU+VGV4dDwvY29kZT4gbm9kZXMgYmVpbmcgcmVwbGFjZWQgaXMgcmVhZG9ubHkuCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBUZXh0IHJlcGxhY2VXaG9sZVRleHQoU3RyaW5nIGNvbnRlbnQpIHRocm93cyBET01FeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSVNvdXJjZUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JU291cmNlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MzA0OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JU291cmNlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLS8qKgotICogCi0gKiBJU291cmNlR2VuZXJhdG9yIGFsbG93cyBET00gbW9kZWxzIHRvIGdlbmVyYXRlIHNvdXJjZSBhcHByb3ByaWF0ZSBmb3IgdGhlaXIKLSAqIHBhcmFtZXRlciwgcmVsYXRpdmUgdG8gdGhlIG1vZGVsIHRoYXQgcHJvdmlkZXMgdGhlIHNvdXJjZSBnZW5lcmF0b3IuCi0gKiAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElTb3VyY2VHZW5lcmF0b3IgewotCi0JLyoqCi0JICogR2VuZXJhdGUgYXR0cmlidXRlIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGF0dHIgLQotCSAqICAgICAgICAgICAgdGhlIEF0dHIKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlQXR0ck5hbWUoQXR0ciBhdHRyKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlQXR0clZhbHVlCi0JICogCi0JICogQHBhcmFtIGF0dHIgLQotCSAqICAgICAgICAgICAgdGhlIEF0dHIKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlQXR0clZhbHVlKEF0dHIgYXR0cik7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUF0dHJWYWx1ZQotCSAqIAotCSAqIEBwYXJhbSBhdHRyIC0KLQkgKiAgICAgICAgICAgIHRoZSBBdHRyCi0JICogQHBhcmFtIGNoYXIgLQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgcXVvdGUgZGVzaXJlZCAoJyBvciAiKS4KLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlQXR0clZhbHVlKEF0dHIgYXR0ciwgY2hhciBxdW90ZSk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUF0dHJWYWx1ZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIFN0cmluZyB2YWx1ZQotCSAqIEBwYXJhbSBjaGFyIC0KLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHF1b3RlIGRlc2lyZWQgKCcgb3IgIikuCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUF0dHJWYWx1ZShTdHJpbmcgdmFsdWUsIGNoYXIgcXVvdGUpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVDREFUQVNlY3Rpb24gbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGNvbW1lbnQKLQkgKiAgICAgICAgICAgIENEQVRBU2VjdGlvbgotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVDREFUQVNlY3Rpb24oQ0RBVEFTZWN0aW9uIGNkYXRhKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKiBAcGFyYW0gTm9kZQotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVDaGlsZChOb2RlIHBhcmVudE5vZGUpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVDbG9zZVRhZwotCSAqIAotCSAqIEBwYXJhbSBub2RlIC0KLQkgKiAgICAgICAgICAgIHRoZSBOb2RlCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUNsb3NlVGFnKE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUNvbW1lbnQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGNvbW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkNvbW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlQ29tbWVudChDb21tZW50IGNvbW1lbnQpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVEb2N0eXBlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBkb2NUeXBlCi0JICogICAgICAgICAgICBEb2N1bWVudFR5cGUKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlRG9jdHlwZShEb2N1bWVudFR5cGUgZG9jVHlwZSk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUVsZW1lbnQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgLQotCSAqICAgICAgICAgICAgRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVFbGVtZW50KEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUVuZFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCAtCi0JICogICAgICAgICAgICBFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUVuZFRhZyhFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVFbnRpdHlSZWYgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVudGl0eVJlZgotCSAqICAgICAgICAgICAgRW50aXR5UmVmZXJlbmNlCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUVudGl0eVJlZihFbnRpdHlSZWZlcmVuY2UgZW50aXR5UmVmKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlUEkgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHBpIC0KLQkgKiAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbgotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVQSShQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVTb3VyY2UgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUgLQotCSAqICAgICAgICAgICAgdGhlIE5vZGUKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlU291cmNlKE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZVN0YXJ0VGFnIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZVN0YXJ0VGFnKEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSB0YWcgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCAtCi0JICogICAgICAgICAgICBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZVRhZ05hbWUoRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIGdlbmVyYXRlVGV4dCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dCAtCi0JICogICAgICAgICAgICB0aGUgVGV4dAotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVUZXh0KFRleHQgdGV4dCk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZSB0ZXh0IGRhdGEKLQkgKiAKLQkgKiBAcGFyYW0gdGV4dCAtCi0JICogICAgICAgICAgICB0aGUgVGV4dAotCSAqIEBwYXJhbSBkYXRhIC0KLQkgKiAgICAgICAgICAgIHRoZSBkYXRhCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZVRleHREYXRhKFRleHQgdGV4dCwgU3RyaW5nIGRhdGEpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvQ29tbWVudE5vZGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L0NvbW1lbnROb2RlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMGVkM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvQ29tbWVudE5vZGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIENvbW1lbnROb2RlRm9ybWF0dGVyIGV4dGVuZHMgTm9kZUZvcm1hdHRlciB7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIENSID0gIlxyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBMRiA9ICJcbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBTdHJpbmcgYWRqdXN0SW5kZW50YXRpb25zKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgbGluZUluZGVudCwgU3RyaW5nIHNpbmdsZUluZGVudCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbmV3IFN0cmluZygpOwotCi0JCWludCBpbmRleE9mTGluZURlbGltaXRlciA9IFN0cmluZ1V0aWxzLmluZGV4T2ZMaW5lRGVsaW1pdGVyKGFTdHJpbmcpOwotCQlyZXN1bHQgPSBhU3RyaW5nLnN1YnN0cmluZygwLCBpbmRleE9mTGluZURlbGltaXRlcik7Ci0JCXdoaWxlIChpbmRleE9mTGluZURlbGltaXRlciAhPSAtMSkgewotCQkJLy8gQmVmb3JlIGZpbmQgdGhlIG5leHQgTGluZURlbGltaXRlciwgd2UgaGF2ZSB0byBmaWd1cmUgb3V0IHRoZQotCQkJLy8gc2l6ZSBvZiB0aGUgY3VycmVudCBMaW5lRGVsaW1pdGVyCi0JCQkvLyBzbyB3ZSBjYW4gZmlndXJlIG91dCBob3cgbWFueSBieXRlcyB0byBza2lwIGJlZm9yZSBmaW5kaW5nIHRoZQotCQkJLy8gbmV4dCBMaW5lRGVsaW1pdGVyLgotCQkJLy8gT3RoZXJ3aXNlLCB3ZSBtYXkgdHJlYXQgdGhlIExGIGluIENSTEYgYXMgdGhlIG5leHQKLQkJCS8vIExpbmVEZWxpbWl0ZXIuCi0JCQlpbnQgbGluZURlbGltaXRlclNpemUgPSAxOwotCQkJaWYgKGFTdHJpbmcubGVuZ3RoKCkgPj0gaW5kZXhPZkxpbmVEZWxpbWl0ZXIgKyAyICYmIGFTdHJpbmcuc3Vic3RyaW5nKGluZGV4T2ZMaW5lRGVsaW1pdGVyLCBpbmRleE9mTGluZURlbGltaXRlciArIDEpLmNvbXBhcmVUbyhDUikgPT0gMCAmJiBhU3RyaW5nLnN1YnN0cmluZyhpbmRleE9mTGluZURlbGltaXRlciArIDEsIGluZGV4T2ZMaW5lRGVsaW1pdGVyICsgMikuY29tcGFyZVRvKExGKSA9PSAwKQotCQkJCWxpbmVEZWxpbWl0ZXJTaXplID0gMjsKLQotCQkJaW50IGluZGV4T2ZOZXh0TGluZURlbGltaXRlciA9IFN0cmluZ1V0aWxzLmluZGV4T2ZMaW5lRGVsaW1pdGVyKGFTdHJpbmcsIGluZGV4T2ZMaW5lRGVsaW1pdGVyICsgbGluZURlbGltaXRlclNpemUpOwotCQkJaW50IGluZGV4T2ZOb25ibGFuayA9IFN0cmluZ1V0aWxzLmluZGV4T2ZOb25ibGFuayhhU3RyaW5nLCBpbmRleE9mTGluZURlbGltaXRlcik7Ci0KLQkJCWlmIChpbmRleE9mTm9uYmxhbmsgIT0gLTEpIHsKLQkJCQlpZiAoaW5kZXhPZk5leHRMaW5lRGVsaW1pdGVyID09IC0xKSB7Ci0JCQkJCS8vIGxhc3QgbGluZTsgY29weSB0aWxsIHRoZSBlbmQKLQkJCQkJcmVzdWx0ICs9IGxpbmVJbmRlbnQgKyBzaW5nbGVJbmRlbnQgKyBhU3RyaW5nLnN1YnN0cmluZyhpbmRleE9mTm9uYmxhbmspOwotCQkJCX0gZWxzZSBpZiAoaW5kZXhPZk5leHRMaW5lRGVsaW1pdGVyICE9IC0xICYmIGluZGV4T2ZOZXh0TGluZURlbGltaXRlciA8IGluZGV4T2ZOb25ibGFuaykgewotCQkJCQkvLyBibGFuayBsaW5lOyBqdXN0IGFkZCBhIGluZGVudAotCQkJCQlyZXN1bHQgKz0gbGluZUluZGVudCArIHNpbmdsZUluZGVudDsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBjb3B5IGFsbCB0ZXh0IGJldHdlZW4gaW5kZXhPZk5vbmJsYW5rIGFuZAotCQkJCQkvLyBpbmRleE9mTmV4dExpbmVEZWxpbWl0ZXIKLQkJCQkJcmVzdWx0ICs9IGxpbmVJbmRlbnQgKyBzaW5nbGVJbmRlbnQgKyBhU3RyaW5nLnN1YnN0cmluZyhpbmRleE9mTm9uYmxhbmssIGluZGV4T2ZOZXh0TGluZURlbGltaXRlcik7Ci0JCQkJfQotCi0JCQkJaW5kZXhPZkxpbmVEZWxpbWl0ZXIgPSBpbmRleE9mTmV4dExpbmVEZWxpbWl0ZXI7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChpbmRleE9mTmV4dExpbmVEZWxpbWl0ZXIgPT0gLTEpIHsKLQkJCQkJcmVzdWx0ICs9IGxpbmVJbmRlbnQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gYmxhbmsgbGluZTsganVzdCBhZGQgYSBpbmRlbnQKLQkJCQkJcmVzdWx0ICs9IGxpbmVJbmRlbnQgKyBzaW5nbGVJbmRlbnQ7Ci0JCQkJfQotCi0JCQkJaW5kZXhPZkxpbmVEZWxpbWl0ZXIgPSBpbmRleE9mTmV4dExpbmVEZWxpbWl0ZXI7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdE5vZGUoSURPTU5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJLy8gbGluZURlbGltaXRlckZvdW5kIG1lYW5zIG11bHRpIGxpbmUgY29tbWVudAotCQkJU3RyaW5nIG5vZGVWYWx1ZSA9IG5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQlib29sZWFuIGxpbmVEZWxpbWl0ZXJGb3VuZEluQ29tbWVudCA9IFN0cmluZ1V0aWxzLmNvbnRhaW5zTGluZURlbGltaXRlcihub2RlVmFsdWUpOwotCi0JCQlpZiAobGluZURlbGltaXRlckZvdW5kSW5Db21tZW50KSB7Ci0JCQkJLy8gZm9ybWF0IGluZGVudGF0aW9uIGJlZm9yZSBub2RlCi0JCQkJZm9ybWF0SW5kZW50YXRpb25CZWZvcmVOb2RlKG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCi0JCQkJLy8gYWRqdXN0IGluZGVudGF0aW9ucyBpbiBtdWx0aSBsaW5lIGNvbW1lbnQKLQkJCQlTdHJpbmcgbGluZURlbGltaXRlciA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCQkJU3RyaW5nIGxpbmVJbmRlbnQgPSBmb3JtYXRDb250cmFpbnRzLmdldEN1cnJlbnRJbmRlbnQoKTsKLQkJCQlTdHJpbmcgc2luZ2xlSW5kZW50ID0gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRJbmRlbnQoKTsKLQkJCQlTdHJpbmcgbmV3Tm9kZXZhbHVlID0gYWRqdXN0SW5kZW50YXRpb25zKG5vZGVWYWx1ZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQsIHNpbmdsZUluZGVudCk7Ci0JCQkJaWYgKG5vZGVWYWx1ZS5jb21wYXJlVG8obmV3Tm9kZXZhbHVlKSAhPSAwKQotCQkJCQlub2RlLnNldE5vZGVWYWx1ZShuZXdOb2RldmFsdWUpOwotCQkJfQotCi0JCQlpZiAoIW5vZGVIYXNTaWJsaW5ncyhub2RlKSB8fCAobm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKSAhPSBudWxsICYmIG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiAhU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkuZ2V0Tm9kZVZhbHVlKCkpICYmIG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsKSkgewotCQkJCS8vIHNpbmdsZSBjaGlsZAotCQkJCS8vIG9yIGlubGluZSBjb21tZW50IGFmdGVyIHRleHQKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9IGVsc2UKLQkJCQkvLyBmb3JtYXQgaW5kZW50YXRpb24gYWZ0ZXIgbm9kZQotCQkJCWZvcm1hdEluZGVudGF0aW9uQWZ0ZXJOb2RlKG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvRG9jdW1lbnROb2RlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Eb2N1bWVudE5vZGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk3ZGYyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Eb2N1bWVudE5vZGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBKZXNwZXIgU3RlZW4gTfhsbGVyIC0geG1sOnNwYWNlPSdwcmVzZXJ2ZScgc3VwcG9ydAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnROb2RlRm9ybWF0dGVyIGV4dGVuZHMgTm9kZUZvcm1hdHRlciB7Ci0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Q2hpbGRyZW4oSURPTU5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJU3RyaW5nIHNpbmdsZUluZGVudCA9IGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0SW5kZW50KCk7Ci0JCVN0cmluZyBsaW5lSW5kZW50ID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0KLQkJaWYgKG5vZGUgIT0gbnVsbCAmJiAoZlByb2dyZXNzTW9uaXRvciA9PSBudWxsIHx8ICFmUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkpIHsKLQkJCS8vIG5vcm1hbGl6ZSBub2RlIGZpcnN0IHRvIGNvbWJpbmUgYWRqYWNlbnQgdGV4dCBub2RlcwotCQkJbm9kZS5ub3JtYWxpemUoKTsKLQotCQkJSURPTU5vZGUgbmV4dENoaWxkID0gKElET01Ob2RlKSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChuZXh0Q2hpbGQgIT0gbnVsbCkgewotCQkJCUlET01Ob2RlIGVhY2hDaGlsZE5vZGUgPSBuZXh0Q2hpbGQ7Ci0JCQkJbmV4dENoaWxkID0gKElET01Ob2RlKSBlYWNoQ2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gZ2V0Rm9ybWF0dGVyKGVhY2hDaGlsZE5vZGUpOwotCQkJCUlTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBjaGlsZEZvcm1hdENvbnRyYWludHMgPSBmb3JtYXR0ZXIuZ2V0Rm9ybWF0Q29udHJhaW50cygpOwotCQkJCVN0cmluZyBjaGlsZEluZGVudCA9IGxpbmVJbmRlbnQgKyBzaW5nbGVJbmRlbnQ7Ci0JCQkJY2hpbGRGb3JtYXRDb250cmFpbnRzLnNldEN1cnJlbnRJbmRlbnQoY2hpbGRJbmRlbnQpOwotCQkJCWNoaWxkRm9ybWF0Q29udHJhaW50cy5zZXRDbGVhckFsbEJsYW5rTGluZXMoZm9ybWF0Q29udHJhaW50cy5nZXRDbGVhckFsbEJsYW5rTGluZXMoKSk7Ci0JCQkJY2hpbGRGb3JtYXRDb250cmFpbnRzLnNldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoZm9ybWF0Q29udHJhaW50cy5nZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KCkpOwotCi0JCQkJLy8gZm9ybWF0IGVhY2ggY2hpbGQKLQkJCQlmb3JtYXR0ZXIuZm9ybWF0KGVhY2hDaGlsZE5vZGUsIGNoaWxkRm9ybWF0Q29udHJhaW50cyk7Ci0KLQkJCQlpZiAobmV4dENoaWxkICE9IG51bGwgJiYgbmV4dENoaWxkLmdldFBhcmVudE5vZGUoKSA9PSBudWxsKQotCQkJCQkvLyBuZXh0Tm9kZSBpcyBkZWxldGVkIGR1cmluZyBmb3JtYXQKLQkJCQkJbmV4dENoaWxkID0gKElET01Ob2RlKSBlYWNoQ2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXROb2RlKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlmb3JtYXRDaGlsZHJlbihub2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9FbGVtZW50Tm9kZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvRWxlbWVudE5vZGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVlZDhmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9FbGVtZW50Tm9kZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIHhtbDpzcGFjZT0ncHJlc2VydmUnIHN1cHBvcnQKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkF0dHJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBFbGVtZW50Tm9kZUZvcm1hdHRlciBleHRlbmRzIERvY3VtZW50Tm9kZUZvcm1hdHRlciB7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgY2hhciBET1VCTEVfUVVPVEUgPSAnIic7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBET1VCTEVfUVVPVEVTID0gIlwiXCIiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBjaGFyIEVRVUFMX0NIQVIgPSAnPSc7IC8vIGVxdWFsIHNpZ24kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBQUkVTRVJWRSA9ICJwcmVzZXJ2ZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBQUkVTRVJWRV9RVU9URUQgPSAiXCJwcmVzZXJ2ZVwiIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgY2hhciBTSU5HTEVfUVVPVEUgPSAnXCcnOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgWE1MX1NQQUNFID0gInhtbDpzcGFjZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGNoYXIgU1BBQ0VfQ0hBUiA9ICcgJzsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBYU0xfTkFNRVNQQUNFID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgWFNMX0FUVFJJQlVURSA9ICJhdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFhTTF9URVhUID0gInRleHQiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRFbmRUYWcoSURPTU5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJaWYgKCFpc0VuZFRhZ01pc3Npbmcobm9kZSkpIHsKLQkJCS8vIGVuZCB0YWcgZXhpc3RzCi0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcigpOwotCQkJU3RyaW5nIG5vZGVJbmRlbnRhdGlvbiA9IGdldE5vZGVJbmRlbnQobm9kZSk7Ci0JCQlJRE9NTm9kZSBsYXN0Q2hpbGQgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCQlpZiAobGFzdENoaWxkICE9IG51bGwgJiYgbGFzdENoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQlpZiAoaXNFbmRUYWdNaXNzaW5nKGxhc3RDaGlsZCkpIHsKLQkJCQkJLy8gZmluZCBkZWVwZXN0IGNoaWxkCi0JCQkJCUlET01Ob2RlIGRlZXBlc3RDaGlsZCA9IChJRE9NTm9kZSkgbGFzdENoaWxkLmdldExhc3RDaGlsZCgpOwotCQkJCQl3aGlsZSAoZGVlcGVzdENoaWxkICE9IG51bGwgJiYgZGVlcGVzdENoaWxkLmdldExhc3RDaGlsZCgpICE9IG51bGwgJiYgaXNFbmRUYWdNaXNzaW5nKGRlZXBlc3RDaGlsZCkpIHsKLQkJCQkJCWxhc3RDaGlsZCA9IGRlZXBlc3RDaGlsZDsKLQkJCQkJCWRlZXBlc3RDaGlsZCA9IChJRE9NTm9kZSkgZGVlcGVzdENoaWxkLmdldExhc3RDaGlsZCgpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGRlZXBlc3RDaGlsZCAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoZGVlcGVzdENoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJCQkvLyBTcGVjaWFsIGluZGVudGF0aW9uIGhhbmRsaW5nIGlmIGxhc3RDaGlsZCdzIGVuZAotCQkJCQkJCS8vIHRhZyBpcyBtaXNzaW5nIGFuZCBkZWVwZXN0Q2hpbGQgaXMgYSB0ZXh0IG5vZGUuCi0JCQkJCQkJU3RyaW5nIG5vZGVUZXh0ID0gZGVlcGVzdENoaWxkLmdldE5vZGVWYWx1ZSgpOwotCi0JCQkJCQkJaWYgKCFub2RlVGV4dC5lbmRzV2l0aChsaW5lRGVsaW1pdGVyICsgbm9kZUluZGVudGF0aW9uKSkgewotCQkJCQkJCQlub2RlVGV4dCA9IFN0cmluZ1V0aWxzLmFwcGVuZElmTm90RW5kV2l0aChub2RlVGV4dCwgbGluZURlbGltaXRlcik7Ci0JCQkJCQkJCW5vZGVUZXh0ID0gU3RyaW5nVXRpbHMuYXBwZW5kSWZOb3RFbmRXaXRoKG5vZGVUZXh0LCBub2RlSW5kZW50YXRpb24pOwotCQkJCQkJCX0KLQotCQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUoZGVlcGVzdENoaWxkLCBub2RlVGV4dCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKGxhc3RDaGlsZCwgbGluZURlbGltaXRlciArIG5vZGVJbmRlbnRhdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQkvLyBpbmRlbnQgZW5kIHRhZwotCQkJCQlpbnNlcnRBZnRlck5vZGUobGFzdENoaWxkLCBsaW5lRGVsaW1pdGVyICsgbm9kZUluZGVudGF0aW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGxhc3RDaGlsZCA9PSBudWxsICYmIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbnNMaW5lRGVsaW1pdGVycyhub2RlKSkgewotCQkJCS8vIEJVRzE3NDI0MyBkbyBub3QgaW5kZW50IGVuZCB0YWcgaWYgbm9kZSBoYXMgZW1wdHkgY29udGVudAotCQkJCS8vIChvdGhlcndpc2UgbmV3IHRleHQgbm9kZSB3b3VsZCBiZSBpbnRyb2R1Y2VkKQotCQkJCU1vZGVsUXVlcnlBZGFwdGVyIGFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpICgoSURPTURvY3VtZW50KSBub2RlLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2xhcmF0aW9uID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBhZGFwdGVyLmdldE1vZGVsUXVlcnkoKS5nZXRDTU5vZGUobm9kZSk7Ci0JCQkJaWYgKChlbGVtZW50RGVjbGFyYXRpb24gPT0gbnVsbCkgfHwgKGVsZW1lbnREZWNsYXJhdGlvbi5nZXRDb250ZW50VHlwZSgpICE9IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKSkgewotCQkJCQkvLyBpbmRlbnQgZW5kIHRhZwotCQkJCQlyZXBsYWNlKHN0cnVjdHVyZWREb2N1bWVudCwgbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCgpLCAwLCBsaW5lRGVsaW1pdGVyICsgbm9kZUluZGVudGF0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGZvcm1hdCBlbmQgdGFnIG5hbWUKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5zaXplKCkgPj0gMykgewotCQkJCUlUZXh0UmVnaW9uIGVuZFRhZ05hbWVSZWdpb24gPSBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCQlyZW1vdmVSZWdpb25TcGFjZXMobm9kZSwgZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBlbmRUYWdOYW1lUmVnaW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdE5vZGUoSURPTU5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJLy8gZm9ybWF0IGluZGVudGF0aW9uIGJlZm9yZSBub2RlCi0JCQlmb3JtYXRJbmRlbnRhdGlvbkJlZm9yZU5vZGUobm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0KLQkJCS8vIGZvcm1hdCBzdGFydCB0YWcKLQkJCUlET01Ob2RlIG5ld05vZGUgPSBub2RlOwotCQkJaW50IHN0YXJ0VGFnU3RhcnRPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCi0JCQlib29sZWFuIGN1cnJlbnRseUluWG1sU3BhY2VQcmVzZXJ2ZSA9IGZvcm1hdENvbnRyYWludHMuZ2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCgpOwotCQkJZm9ybWF0U3RhcnRUYWcobm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JCQkvLyBzYXZlIG5ldyBub2RlCi0JCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5ld05vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCQkJLy8gZm9ybWF0IGNoaWxkcmVuIGFuZCBlbmQgdGFnIGlmIG5vdCBlbXB0eSBzdGFydCB0YWcKLQkJCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJCS8vIGZvcm1hdCBjaGlsZHJlbgotCQkJCQlmb3JtYXRDaGlsZHJlbihuZXdOb2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQotCQkJCQkvLyBzYXZlIG5ldyBub2RlCi0JCQkJCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOwotCi0JCQkJCS8vIGZvcm1hdCBlbmQgdGFnCi0JCQkJCWZvcm1hdEVuZFRhZyhuZXdOb2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWZvcm1hdENvbnRyYWludHMuc2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudChjdXJyZW50bHlJblhtbFNwYWNlUHJlc2VydmUpOwotCQkJLy8gb25seSBpbmRlbnQgaWYgbm90IGF0IGxhc3Qgbm9kZQotCQkJaWYgKG5ld05vZGUgIT0gbnVsbCAmJiBuZXdOb2RlLmdldE5leHRTaWJsaW5nKCkgIT0gbnVsbCkKLQkJCQkvLyBmb3JtYXQgaW5kZW50YXRpb24gYWZ0ZXIgbm9kZQotCQkJCWZvcm1hdEluZGVudGF0aW9uQWZ0ZXJOb2RlKG5ld05vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZm9ybWF0cyB0aGUgc3RhcnQgdGFnIG5hbWUsIGFuZCBmb3JtYXRzIHRoZSBhdHRyaWJ1dGVzIGlmCi0JICogYXZhaWxhYmxlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFN0YXJ0VGFnKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCBwcmVmZXJlbmNlcyA9IChTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwpIGdldEZvcm1hdFByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBzaW5nbGVJbmRlbnQgPSBwcmVmZXJlbmNlcy5nZXRJbmRlbnQoKTsKLQkJU3RyaW5nIGxpbmVJbmRlbnQgPSBmb3JtYXRDb250cmFpbnRzLmdldEN1cnJlbnRJbmRlbnQoKTsKLQkJU3RyaW5nIGF0dHJJbmRlbnQgPSBsaW5lSW5kZW50ICsgc2luZ2xlSW5kZW50OwotCQlib29sZWFuIHNwbGl0TXVsdGlBdHRycyA9IHByZWZlcmVuY2VzLmdldFNwbGl0TXVsdGlBdHRycygpOwotCQlib29sZWFuIGFsaWduRW5kQnJhY2tldCA9IHByZWZlcmVuY2VzLmlzQWxpZ25FbmRCcmFja2V0KCk7Ci0JCWJvb2xlYW4gc2F3WG1sU3BhY2UgPSBmYWxzZTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCi0JCS8vIE5vdGU6IGF0dHJpYnV0ZXMgc2hvdWxkIG5vdCBiZSBudWxsIGV2ZW4gaWYgdGhlIG5vZGUgaGFzIG5vCi0JCS8vIGF0dHJpYnV0ZXMuIEhvd2V2ZXIsIGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCkgd2lsbCBiZSAwLiBCdXQsIGNoZWNrCi0JCS8vIGZvciBudWxsIGp1c3QgaW4gY2FzZS4KLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJLy8gY29tcHV0ZSBjdXJyZW50IGF2YWlsYWJsZSBsaW5lIHdpZHRoCi0JCQlpbnQgY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA9IDA7Ci0JCQl0cnkgewotCQkJCS8vIDEgaXMgZm9yICI8IgotCQkJCWludCBub2RlTmFtZU9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSArIDEgKyBub2RlLmdldE5vZGVOYW1lKCkubGVuZ3RoKCk7Ci0JCQkJaW50IGxpbmVPZmZzZXQgPSBub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KG5vZGVOYW1lT2Zmc2V0KS5nZXRPZmZzZXQoKTsKLQkJCQlTdHJpbmcgdGV4dCA9IG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0KGxpbmVPZmZzZXQsIG5vZGVOYW1lT2Zmc2V0IC0gbGluZU9mZnNldCk7Ci0JCQkJaW50IHVzZWRXaWR0aCA9IGdldEluZGVudGF0aW9uTGVuZ3RoKHRleHQpOwotCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggPSBwcmVmZXJlbmNlcy5nZXRMaW5lV2lkdGgoKSAtIHVzZWRXaWR0aDsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0KLQkJCVN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlTdHJpbmcgbGluZURlbGltaXRlciA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCQlpbnQgYXR0ckxlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCQlpbnQgbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCA9IDA7Ci0JCQlib29sZWFuIHN0YXJ0VGFnU3BhbnNPdmVyMUxpbmUgPSBmYWxzZTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyTGVuZ3RoOyBpKyspIHsKLQkJCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0JCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGF0dHIuZ2V0TmFtZVJlZ2lvbigpOwotCQkJCUlUZXh0UmVnaW9uIGVxdWFsUmVnaW9uID0gYXR0ci5nZXRFcXVhbFJlZ2lvbigpOwotCQkJCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gYXR0ci5nZXRWYWx1ZVJlZ2lvbigpOwotCi0JCQkJLy8gYXBwZW5kIHVuZGVmaW5lZCByZWdpb25zCi0JCQkJU3RyaW5nIHVuZGVmaW5lZFJlZ2lvbiA9IGdldFVuZGVmaW5lZFJlZ2lvbnMobm9kZSwgbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCwgYXR0ci5nZXRTdGFydE9mZnNldCgpIC0gbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCk7Ci0JCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCh1bmRlZmluZWRSZWdpb24pOwotCQkJCWxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQgPSBhdHRyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJCQkvLyBjaGVjayBmb3IgeG1sOnNwYWNlIGF0dHJpYnV0ZQotCQkJCWlmIChmbGF0Tm9kZS5nZXRUZXh0KG5hbWVSZWdpb24pLmNvbXBhcmVUbyhYTUxfU1BBQ0UpID09IDApIHsKLQkJCQkJaWYgKHZhbHVlUmVnaW9uID09IG51bGwpIHsKLQkJCQkJCS8vIFsxMTE2NzRdIElmIG5vdGhpbmcgaGFzIGJlZW4gd3JpdHRlbiB5ZXQsIHRyZWF0IGFzCi0JCQkJCQkvLyBwcmVzZXJ2ZSwgYnV0IG9ubHkgYXMgaGludAotCQkJCQkJZm9ybWF0Q29udHJhaW50cy5zZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KHRydWUpOwotCQkJCQkJLy8gTm90ZSB3ZSBkb24ndCBzZXQgJ3Nhd1htbFNwYWNlJywgc28gdGhhdCBkZWZhdWx0IG9yCi0JCQkJCQkvLyBmaXhlZCBEVEQvWFNEIHZhbHVlcyBtYXkgb3ZlcnJpZGUuCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlJU291cmNlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRHZW5lcmF0b3IoKTsKLQkJCQkJCVN0cmluZyBuZXdBdHRyVmFsdWUgPSBnZW5lcmF0b3IuZ2VuZXJhdGVBdHRyVmFsdWUoYXR0cik7Ci0KLQkJCQkJCS8vIFRoZXJlIGlzIGEgcHJvYmxlbSBpbgotCQkJCQkJLy8gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRBdHRyVmFsdWUoSVRleHRSZWdpb24pCi0JCQkJCQkvLyB3aGVuIHRoZSByZWdpb24gaXMgaW5zdGFuY2VvZiBDb250ZXh0UmVnaW9uLgotCQkJCQkJLy8gV29ya2Fyb3VuZCBmb3Igbm93LgotCQkJCQkJaWYgKGZsYXROb2RlLmdldFRleHQodmFsdWVSZWdpb24pLmxlbmd0aCgpID09IDEpIHsKLQkJCQkJCQljaGFyIGZpcnN0Q2hhciA9IGZsYXROb2RlLmdldFRleHQodmFsdWVSZWdpb24pLmNoYXJBdCgwKTsKLQkJCQkJCQlpZiAoKGZpcnN0Q2hhciA9PSBET1VCTEVfUVVPVEUpIHx8IChmaXJzdENoYXIgPT0gU0lOR0xFX1FVT1RFKSkKLQkJCQkJCQkJbmV3QXR0clZhbHVlID0gRE9VQkxFX1FVT1RFUzsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKG5ld0F0dHJWYWx1ZS5jb21wYXJlVG8oUFJFU0VSVkVfUVVPVEVEKSA9PSAwKQotCQkJCQkJCWZvcm1hdENvbnRyYWludHMuc2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCh0cnVlKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlmb3JtYXRDb250cmFpbnRzLnNldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoZmFsc2UpOwotCQkJCQkJc2F3WG1sU3BhY2UgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKHNwbGl0TXVsdGlBdHRycyAmJiBhdHRyTGVuZ3RoID4gMSkgewotCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGxpbmVEZWxpbWl0ZXIgKyBhdHRySW5kZW50KTsKLQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KG5hbWVSZWdpb24pKTsKLQkJCQkJc3RhcnRUYWdTcGFuc092ZXIxTGluZSA9IHRydWU7Ci0JCQkJCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkvLyBhcHBlbmQgdW5kZWZpbmVkIHJlZ2lvbnMKLQkJCQkJCXVuZGVmaW5lZFJlZ2lvbiA9IGdldFVuZGVmaW5lZFJlZ2lvbnMobm9kZSwgbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCwgZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoZXF1YWxSZWdpb24pIC0gbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCk7Ci0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKHVuZGVmaW5lZFJlZ2lvbik7Ci0JCQkJCQlsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoZXF1YWxSZWdpb24pOwotCi0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKEVRVUFMX0NIQVIpOwotCi0JCQkJCQkvLyBhcHBlbmQgdW5kZWZpbmVkIHJlZ2lvbnMKLQkJCQkJCXVuZGVmaW5lZFJlZ2lvbiA9IGdldFVuZGVmaW5lZFJlZ2lvbnMobm9kZSwgbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCwgZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQodmFsdWVSZWdpb24pIC0gbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCk7Ci0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKHVuZGVmaW5lZFJlZ2lvbik7Ci0JCQkJCQlsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQodmFsdWVSZWdpb24pOwotCi0JCQkJCQkvLyBOb3RlOiB0cmltKCkgc2hvdWxkIG5vdCBiZSBuZWVkZWQgZm9yCi0JCQkJCQkvLyB2YWx1ZVJlZ2lvbi5nZXRUZXh0KCkuIEp1c3QgYSB3b3JrYXJvdW5kIGZvciBhCi0JCQkJCQkvLyBwcm9ibGVtIGZvdW5kIGluIHZhbHVlUmVnaW9uIGZvciBub3cuCi0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQodmFsdWVSZWdpb24pLnRyaW0oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgdGV4dExlbmd0aCA9IDEgKyBmbGF0Tm9kZS5nZXRUZXh0KG5hbWVSZWdpb24pLmxlbmd0aCgpICsgMSArIGZsYXROb2RlLmdldFRleHQodmFsdWVSZWdpb24pLmxlbmd0aCgpOwotCQkJCQkJaWYgKGkgPT0gYXR0ckxlbmd0aCAtIDEpIHsKLQkJCQkJCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCQkJCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCQkJCQkJCWlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpCi0JCQkJCQkJCQkvLyAzIGlzIGZvciAiIC8+IgotCQkJCQkJCQkJdGV4dExlbmd0aCArPSAzOwotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQkvLyAxIGlzIGZvciAiPiIKLQkJCQkJCQkJCXRleHRMZW5ndGgrKzsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChjdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID49IHRleHRMZW5ndGgpIHsKLQkJCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKFNQQUNFX0NIQVIpOwotCQkJCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGgtLTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQobGluZURlbGltaXRlciArIGF0dHJJbmRlbnQpOwotCQkJCQkJCXN0YXJ0VGFnU3BhbnNPdmVyMUxpbmUgPSB0cnVlOwotCQkJCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggPSBwcmVmZXJlbmNlcy5nZXRMaW5lV2lkdGgoKSAtIGF0dHJJbmRlbnQubGVuZ3RoKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoZmxhdE5vZGUuZ2V0VGV4dChuYW1lUmVnaW9uKSk7Ci0KLQkJCQkJCS8vIGFwcGVuZCB1bmRlZmluZWQgcmVnaW9ucwotCQkJCQkJdW5kZWZpbmVkUmVnaW9uID0gZ2V0VW5kZWZpbmVkUmVnaW9ucyhub2RlLCBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0LCBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChlcXVhbFJlZ2lvbikgLSBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0KTsKLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQodW5kZWZpbmVkUmVnaW9uKTsKLQkJCQkJCWxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChlcXVhbFJlZ2lvbik7Ci0KLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoRVFVQUxfQ0hBUik7Ci0KLQkJCQkJCS8vIGFwcGVuZCB1bmRlZmluZWQgcmVnaW9ucwotCQkJCQkJdW5kZWZpbmVkUmVnaW9uID0gZ2V0VW5kZWZpbmVkUmVnaW9ucyhub2RlLCBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0LCBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCh2YWx1ZVJlZ2lvbikgLSBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0KTsKLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQodW5kZWZpbmVkUmVnaW9uKTsKLQkJCQkJCWxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCh2YWx1ZVJlZ2lvbik7Ci0KLQkJCQkJCS8vIE5vdGU6IHRyaW0oKSBzaG91bGQgbm90IGJlIG5lZWRlZCBmb3IKLQkJCQkJCS8vIHZhbHVlUmVnaW9uLmdldFRleHQoKS4gSnVzdCBhIHdvcmthcm91bmQgZm9yIGEKLQkJCQkJCS8vIHByb2JsZW0gZm91bmQgaW4gdmFsdWVSZWdpb24gZm9yIG5vdy4KLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoZmxhdE5vZGUuZ2V0VGV4dCh2YWx1ZVJlZ2lvbikudHJpbSgpKTsKLQotCQkJCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCAtPSBmbGF0Tm9kZS5nZXRUZXh0KG5hbWVSZWdpb24pLmxlbmd0aCgpOwotCQkJCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aC0tOwotCQkJCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCAtPSBmbGF0Tm9kZS5nZXRUZXh0KHZhbHVlUmVnaW9uKS50cmltKCkubGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA+PSAxICsgZmxhdE5vZGUuZ2V0VGV4dChuYW1lUmVnaW9uKS5sZW5ndGgoKSkgewotCQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoU1BBQ0VfQ0hBUik7Ci0JCQkJCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aC0tOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChsaW5lRGVsaW1pdGVyICsgYXR0ckluZGVudCk7Ci0JCQkJCQkJc3RhcnRUYWdTcGFuc092ZXIxTGluZSA9IHRydWU7Ci0JCQkJCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA9IHByZWZlcmVuY2VzLmdldExpbmVXaWR0aCgpIC0gYXR0ckluZGVudC5sZW5ndGgoKTsKLQkJCQkJCX0KLQotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KG5hbWVSZWdpb24pKTsKLQotCQkJCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCAtPSBmbGF0Tm9kZS5nZXRUZXh0KG5hbWVSZWdpb24pLmxlbmd0aCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBhcHBlbmQgdW5kZWZpbmVkIHJlZ2lvbnMKLQkJCVN0cmluZyB1bmRlZmluZWRSZWdpb24gPSBnZXRVbmRlZmluZWRSZWdpb25zKG5vZGUsIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQsIG5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0KTsKLQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQodW5kZWZpbmVkUmVnaW9uKTsKLQotCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJLy8gMSBpcyBmb3IgIjwiCi0JCQlpbnQgb2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpICsgMSArIG5vZGUuZ2V0Tm9kZU5hbWUoKS5sZW5ndGgoKTsKLQkJCS8vIDEgaXMgZm9yICI8IgotCQkJaW50IGxlbmd0aCA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0TGVuZ3RoKCkgLSAxIC0gbm9kZS5nZXROb2RlTmFtZSgpLmxlbmd0aCgpOwotCi0JCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJCUlUZXh0UmVnaW9uIGZpcnN0UmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0KLQkJCQlpZiAoZmlyc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikKLQkJCQkJLy8gc2tpcCBmb3JtYXR0aW5nIGZvciBlbmQgdGFncyBpbiB0aGlzIGZvcm1hdDogPC90YWdOYW1lPgotCQkJCQlyZXR1cm47Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UgfHwgbGFzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKQotCQkJCQkJbGVuZ3RoID0gbGVuZ3RoIC0gbGFzdFJlZ2lvbi5nZXRMZW5ndGgoKTsKLQotCQkJCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJCQkvLyBsZWF2ZSBzcGFjZSBiZWZvcmUgWE1MX0VNUFRZX1RBR19DTE9TRTogPHRhZ05hbWUgLz4KLQkJCQkJCS8vIHVubGVzcyBhbHJlYWR5IGdvaW5nIHRvIG1vdmUgZW5kIGJyYWNrZXQKLQkJCQkJCWlmICghc3RhcnRUYWdTcGFuc092ZXIxTGluZSB8fCAhYWxpZ25FbmRCcmFja2V0KQotCQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoU1BBQ0VfQ0hBUik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChzdGFydFRhZ1NwYW5zT3ZlcjFMaW5lICYmIGFsaWduRW5kQnJhY2tldCkgewotCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQobGluZURlbGltaXRlcikuYXBwZW5kKGxpbmVJbmRlbnQpOwotCQkJfQotCi0JCQlyZXBsYWNlKHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgsIHN0cmluZ0J1ZmZlci50b1N0cmluZygpKTsKLQotCQkJLy8gQlVHMTA4MDc0ICYgQlVHODQ2ODggLSBwcmVzZXJ2ZSB3aGl0ZXNwYWNlIGluIHhzbDp0ZXh0ICYKLQkJCS8vIHhzbDphdHRyaWJ1dGUKLQkJCVN0cmluZyBub2RlTmFtZXNwYWNlVVJJID0gbm9kZS5nZXROYW1lc3BhY2VVUkkoKTsKLQkJCWlmIChYU0xfTkFNRVNQQUNFLmVxdWFscyhub2RlTmFtZXNwYWNlVVJJKSkgewotCQkJCVN0cmluZyBub2RlTmFtZSA9ICgoRWxlbWVudCkgbm9kZSkuZ2V0TG9jYWxOYW1lKCk7Ci0JCQkJaWYgKFhTTF9BVFRSSUJVVEUuZXF1YWxzKG5vZGVOYW1lKSB8fCBYU0xfVEVYVC5lcXVhbHMobm9kZU5hbWUpKSB7Ci0JCQkJCXNhd1htbFNwYWNlID0gdHJ1ZTsKLQkJCQkJZm9ybWF0Q29udHJhaW50cy5zZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KHRydWUpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gSWYgd2UgZGlkbid0IHNlZSBhIHhtbDpzcGFjZSBhdHRyaWJ1dGUgYWJvdmUsIHdlJ2xsIGxvb2sgZm9yCi0JCQkvLyBvbmUgaW4gdGhlIERURC4KLQkJCS8vIFdlIGRvIG5vdCBjaGVjayBmb3IgYSBjb25mbGljdCBiZXR3ZWVuIGEgRFREJ3MgJ2ZpeGVkJyB2YWx1ZQotCQkJLy8gYW5kIHRoZSBhdHRyaWJ1dGUgdmFsdWUgZm91bmQgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50LCB3ZQotCQkJLy8gbGVhdmUgdGhhdCB0byB0aGUgdmFsaWRhdG9yLgotCQkJaWYgKCFzYXdYbWxTcGFjZSkgewotCQkJCU1vZGVsUXVlcnlBZGFwdGVyIGFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpICgoSURPTURvY3VtZW50KSBub2RlLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2xhcmF0aW9uID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBhZGFwdGVyLmdldE1vZGVsUXVlcnkoKS5nZXRDTU5vZGUobm9kZSk7Ci0JCQkJaWYgKGVsZW1lbnREZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCWludCBjb250ZW50VHlwZSA9IGVsZW1lbnREZWNsYXJhdGlvbi5nZXRDb250ZW50VHlwZSgpOwotCQkJCQlpZiAocHJlZmVyZW5jZXMuaXNQcmVzZXJ2ZVBDREFUQUNvbnRlbnQoKSAmJiBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEpIHsKLQkJCQkJCWZvcm1hdENvbnRyYWludHMuc2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCh0cnVlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUNNTmFtZWROb2RlTWFwIGNtQXR0cmlidXRlcyA9IGVsZW1lbnREZWNsYXJhdGlvbi5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCQkvLyBDaGVjayBpbXBsaWVkIHZhbHVlcyBmcm9tIHRoZSBEVEQgd2F5LgotCQkJCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGVEZWNsYXJhdGlvbiA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbUF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKFhNTF9TUEFDRSk7Ci0JCQkJCQlpZiAoYXR0cmlidXRlRGVjbGFyYXRpb24gIT0gbnVsbCkgewotCQkJCQkJCS8vIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZm91bmQsIGNoZWNrIGl0IG91dC4KLQkJCQkJCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gYXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0QXR0clR5cGUoKS5nZXRJbXBsaWVkVmFsdWUoKTsKLQotCQkJCQkJCS8vIHhtbDpzcGFjZT0icHJlc2VydmUiIG1lYW5zIHByZXNlcnZlIHNwYWNlLAotCQkJCQkJCS8vIGV2ZXJ5dGhpbmcgZWxzZSBtZWFucyBiYWNrIHRvIGRlZmF1bHQuCi0JCQkJCQkJaWYgKFBSRVNFUlZFLmNvbXBhcmVUbyhkZWZhdWx0VmFsdWUpID09IDApCi0JCQkJCQkJCWZvcm1hdENvbnRyYWludHMuc2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCh0cnVlKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCWZvcm1hdENvbnRyYWludHMuc2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudChmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVuZGVmaW5lZFJlZ2lvbnMoSURPTU5vZGUgbm9kZSwgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBuZXcgU3RyaW5nKCk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpbnQgcmVnaW9uU3RhcnRPZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCi0JCQlpZiAocmVnaW9uVHlwZS5jb21wYXJlVG8oRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQpID09IDAgJiYgcmVnaW9uU3RhcnRPZmZzZXQgPj0gc3RhcnRPZmZzZXQgJiYgcmVnaW9uU3RhcnRPZmZzZXQgPCBzdGFydE9mZnNldCArIGxlbmd0aCkKLQkJCQlyZXN1bHQgPSByZXN1bHQgKyBmbGF0Tm9kZS5nZXRGdWxsVGV4dChyZWdpb24pOwotCQl9Ci0KLQkJaWYgKHJlc3VsdC5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gU1BBQ0VfQ0hBUiArIHJlc3VsdC50cmltKCk7Ci0JCWVsc2UKLQkJCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvRm9ybWF0UHJvY2Vzc29yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Gb3JtYXRQcm9jZXNzb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc5OGRiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Gb3JtYXRQcm9jZXNzb3JYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5BYnN0cmFjdFN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEZvcm1hdFByb2Nlc3NvclhNTCBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciB7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZkZvcm1hdFByZWZlcmVuY2VzID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuICJ4bWwiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChmRm9ybWF0UHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkZvcm1hdFByZWZlcmVuY2VzID0gbmV3IFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCgpOwotCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldExpbmVXaWR0aChwcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCQkJKChTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwpIGZGb3JtYXRQcmVmZXJlbmNlcykuc2V0U3BsaXRNdWx0aUF0dHJzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUykpOwotCQkJCSgoU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKSBmRm9ybWF0UHJlZmVyZW5jZXMpLnNldEFsaWduRW5kQnJhY2tldChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQUxJR05fRU5EX0JSQUNLRVQpKTsKLQkJCQkoKFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZkZvcm1hdFByZWZlcmVuY2VzKS5zZXRQcmVzZXJ2ZVBDREFUQUNvbnRlbnQocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlBSRVNFUlZFX0NEQVRBQ09OVEVOVCkpOwotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRDbGVhckFsbEJsYW5rTGluZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUykpOwotCi0JCQkJY2hhciBpbmRlbnRDaGFyID0gJyAnOwotCQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQkJCWlmIChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJCWluZGVudENoYXIgPSAnXHQnOwotCQkJCX0KLQkJCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCQlpbmRlbnQuYXBwZW5kKGluZGVudENoYXIpOwotCQkJCX0KLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0SW5kZW50KGluZGVudC50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmRm9ybWF0UHJlZmVyZW5jZXM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0dGVyIGdldEZvcm1hdHRlcihOb2RlIG5vZGUpIHsKLQkJLy8gMjYyMTM1IC0gTlBFIGR1cmluZyBmb3JtYXQgb2YgZW1wdHkgZG9jdW1lbnQKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBudWxsOwotCQlzd2l0Y2ggKG5vZGVUeXBlKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBFbGVtZW50Tm9kZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgVGV4dE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IE5vTW92ZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgQ29tbWVudE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBEb2N1bWVudE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IE5vTW92ZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZGVmYXVsdCA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgTm9kZUZvcm1hdHRlcigpOwotCQkJfQotCQl9Ci0KLQkJLy8gaW5pdCBmb21hdHRlcgotCQlmb3JtYXR0ZXIuc2V0Rm9ybWF0UHJlZmVyZW5jZXMoZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSk7Ci0JCWZvcm1hdHRlci5zZXRQcm9ncmVzc01vbml0b3IoZlByb2dyZXNzTW9uaXRvcik7Ci0KLQkJcmV0dXJuIGZvcm1hdHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvcm1hdFByZWZlcmVuY2VzKCkgewotCQlmRm9ybWF0UHJlZmVyZW5jZXMgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L05vTW92ZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvTm9Nb3ZlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNjhlY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvTm9Nb3ZlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLS8qKgotICogRm9ybWF0cyBlbnRpdGllcyB3aGljaCByZWFsbHkgbmVlZCBubyBmb3JtYXR0aW5nLiBUaGV5IGFyZSBqdXN0IGxpa2UgdGV4dAotICogbm9kZXMuCi0gKi8KLWNsYXNzIE5vTW92ZUZvcm1hdHRlciBleHRlbmRzIE5vZGVGb3JtYXR0ZXIgewotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEluZGVudGF0aW9uQmVmb3JlTm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQkvLyBub2RlIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRJbmRlbnRhdGlvbkFmdGVyTm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQkvLyBzdGlsbCBkbyBub3RoaW5nCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvTm9kZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvTm9kZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhlZDE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L05vZGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEplc3BlciBTdGVlbiBN+GxsZXIgLSB4bWw6c3BhY2U9J3ByZXNlcnZlJyBzdXBwb3J0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Db250ZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNEQVRBU2VjdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNoYXJhY3RlckRhdGFJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Db21tZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuVGFnTmFtZVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBOb2RlRm9ybWF0dGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRGb3JtYXR0ZXIgewotCXN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgY2hhciBTUEFDRV9DSEFSID0gJyAnOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgY2hhciBUQUJfQ0hBUiA9ICdcdCc7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFCID0gIlx0IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZkZvcm1hdENvbnRyYWludHMgPSBudWxsOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGZGb3JtYXRQcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5zTGluZURlbGltaXRlcnMoSURPTU5vZGUgbm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCVN0cmluZyBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblRleHQgPSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KCk7Ci0JCQkJcmVzdWx0ID0gU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVGV4dCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdChOb2RlIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMgPSBnZXRGb3JtYXRDb250cmFpbnRzKCk7Ci0KLQkJZm9ybWF0KG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdChOb2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCWlmIChmb3JtYXRDb250cmFpbnRzLmdldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KCkpCi0JCQlmb3JtYXRDb250cmFpbnRzLnNldEN1cnJlbnRJbmRlbnQoZ2V0U2libGluZ0luZGVudChub2RlKSk7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLQkJCWZvcm1hdE5vZGUoKElET01Ob2RlKSBub2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRJbmRlbnRhdGlvbkFmdGVyTm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQkvLyBbMTExNjc0XSBJZiBpbnNpZGUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZWxlbWVudCwgd2UgYmFpbAotCQlpZiAoZm9ybWF0Q29udHJhaW50cy5nZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KCkpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCUlET01Ob2RlIG5leHRTaWJsaW5nID0gKElET01Ob2RlKSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gZ2V0TGluZURlbGltaXRlcihub2RlLCBkb2MpOwotCi0JCQlpZiAobm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkgewotCQkJCWlmIChub2RlLmdldFBhcmVudE5vZGUoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkKLQkJCQkJaWYgKG5leHRTaWJsaW5nICE9IG51bGwpCi0JCQkJCQlpZiAobmV4dFNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkJCQlnZXRGb3JtYXR0ZXIobmV4dFNpYmxpbmcpLmZvcm1hdChuZXh0U2libGluZywgZm9ybWF0Q29udHJhaW50cyk7Ci0JCQkJCQllbHNlIGlmIChuZXh0U2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuQ09NTUVOVF9OT0RFKSB7Ci0JCQkJCQkJLy8gZG8gbm90aGluZwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJU3RyaW5nIGxpbmVJbmRlbnQgPSBmb3JtYXRDb250cmFpbnRzLmdldEN1cnJlbnRJbmRlbnQoKTsKLQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJfQotCi0JCQkJZWxzZSBpZiAobmV4dFNpYmxpbmcgIT0gbnVsbCkKLQkJCQkJaWYgKG5leHRTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQkJCQlnZXRGb3JtYXR0ZXIobmV4dFNpYmxpbmcpLmZvcm1hdChuZXh0U2libGluZywgZm9ybWF0Q29udHJhaW50cyk7Ci0JCQkJCWVsc2UgaWYgKG5leHRTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUpIHsKLQkJCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCVN0cmluZyBsaW5lSW5kZW50ID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0JCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUlET01Ob2RlIGluZGVudE5vZGUgPSBnZXRQYXJlbnRJbmRlbnROb2RlKG5vZGUpOwotCQkJCQlTdHJpbmcgbGluZUluZGVudCA9IGdldE5vZGVJbmRlbnQoaW5kZW50Tm9kZSk7Ci0JCQkJCUlET01Ob2RlIGxhc3RDaGlsZCA9IGdldERlZXBlc3RDaGlsZE5vZGUobm9kZSk7Ci0JCQkJCWJvb2xlYW4gY2xlYXJBbGxCbGFua0xpbmVzID0gZm9ybWF0Q29udHJhaW50cy5nZXRDbGVhckFsbEJsYW5rTGluZXMoKTsKLQotCQkJCQlpZiAobGFzdENoaWxkICE9IG51bGwpIHsKLQkJCQkJCWlmICgobGFzdENoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChsYXN0Q2hpbGQuZ2V0Tm9kZVZhbHVlKCkuZW5kc1dpdGgobGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpKSkgewotCQkJCQkJCS8vIHRoaXMgdGV4dCBub2RlIGFscmVhZHkgZW5kcyB3aXRoIHRoZSByZXF1ZXN0ZWQKLQkJCQkJCQkvLyBpbmRlbnRhdGlvbgotCQkJCQkJfQotCi0JCQkJCQllbHNlIGlmICgobGFzdENoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChsYXN0Q2hpbGQuZ2V0Tm9kZVZhbHVlKCkgIT0gbnVsbCAmJiBsYXN0Q2hpbGQuZ2V0Tm9kZVZhbHVlKCkuZW5kc1dpdGgobGluZURlbGltaXRlcikpKQotCQkJCQkJCWlmIChjbGVhckFsbEJsYW5rTGluZXMpIHsKLQkJCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShsYXN0Q2hpbGQsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobGFzdENoaWxkLCBsaW5lSW5kZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChsYXN0Q2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkJCQlpZiAobGFzdENoaWxkLmdldE5vZGVWYWx1ZSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQkJLy8gcmVwbGFjZQotCQkJCQkJCQlyZXBsYWNlTm9kZVZhbHVlKGxhc3RDaGlsZCwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQkJCWluc2VydEFmdGVyTm9kZShsYXN0Q2hpbGQsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBhcyBsb25nIGFzIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudAotCQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kUmVnaW9uID0gbm9kZS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCQkJaWYgKGVuZFJlZ2lvbiAhPSBudWxsICYmIGVuZFJlZ2lvbi5nZXROZXh0KCkgIT0gbnVsbCkKLQkJCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQkJCWluc2VydEFmdGVyTm9kZShsYXN0Q2hpbGQsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEluZGVudGF0aW9uQmVmb3JlTm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQkvLyBbMTExNjc0XSBJZiBpbnNpZGUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZWxlbWVudCwgd2UgYmFpbAotCQlpZiAoZm9ybWF0Q29udHJhaW50cy5nZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KCkpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCUlET01Ob2RlIHByZXZpb3VzU2libGluZyA9IChJRE9NTm9kZSkgbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUsIGRvYyk7Ci0KLQkJCVN0cmluZyBsaW5lSW5kZW50ID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0KLQkJCWlmIChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJCWlmIChwcmV2aW91c1NpYmxpbmcgIT0gbnVsbCkKLQkJCQkJCWlmIChwcmV2aW91c1NpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkJCQlnZXRGb3JtYXR0ZXIocHJldmlvdXNTaWJsaW5nKS5mb3JtYXQocHJldmlvdXNTaWJsaW5nLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJCQkJCWVsc2UgewotCQkJCQkJCWluc2VydEJlZm9yZU5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKHByZXZpb3VzU2libGluZyA9PSBudWxsIHx8IHByZXZpb3VzU2libGluZy5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCQkvLyAyNjE5NjggLSBmb3JtYXR0aW5nIHRhZyB3aXRob3V0IGNsb3NpbmcgYnJhY2tldDoKLQkJCQkJCS8vIDx0MT48dDEKLQkJCQkJCS8vIDI2NTY3MyAtIE51bGwgcHRyIGluIGZvcm1hdEluZGVudGF0aW9uQmVmb3JlTm9kZQotCQkJCQkJaW50IHByZXZFbmROb2RlT2Zmc2V0ID0gLTE7Ci0JCQkJCQlpbnQgcHJldkVuZFJlZ2lvbk9mZnNldCA9IC0xOwotCQkJCQkJaWYgKHByZXZpb3VzU2libGluZyAhPSBudWxsKSB7Ci0JCQkJCQkJcHJldkVuZE5vZGVPZmZzZXQgPSBwcmV2aW91c1NpYmxpbmcuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRSZWdpb24gPSBwcmV2aW91c1NpYmxpbmcuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCQkJaWYgKGVuZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCXByZXZFbmRSZWdpb25PZmZzZXQgPSBlbmRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmICgocHJldmlvdXNTaWJsaW5nID09IG51bGwpIHx8IChwcmV2RW5kTm9kZU9mZnNldCAhPSAtMSAmJiBwcmV2RW5kTm9kZU9mZnNldCA9PSBwcmV2RW5kUmVnaW9uT2Zmc2V0KSkgewotCQkJCQkJCWluc2VydEJlZm9yZU5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAocHJldmlvdXNTaWJsaW5nLmdldE5vZGVWYWx1ZSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQkvLyByZXBsYWNlCi0JCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShwcmV2aW91c1NpYmxpbmcsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJCWlmICghcHJldmlvdXNTaWJsaW5nLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KSkgewotCQkJCQkJCQlpZiAocHJldmlvdXNTaWJsaW5nLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIpKSB7Ci0JCQkJCQkJCQlpbnNlcnRBZnRlck5vZGUocHJldmlvdXNTaWJsaW5nLCBsaW5lSW5kZW50KTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQlnZXRGb3JtYXR0ZXIocHJldmlvdXNTaWJsaW5nKS5mb3JtYXQocHJldmlvdXNTaWJsaW5nLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jKSB7Ci0JCWludCBsaW5lID0gZG9jLmdldExpbmVPZk9mZnNldChub2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQlTdHJpbmcgbGluZURlbGltaXRlciA9IGRvYy5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCXRyeSB7Ci0JCQlpZiAobGluZSA+IDApIHsKLQkJCQlsaW5lRGVsaW1pdGVyID0gZG9jLmdldExpbmVEZWxpbWl0ZXIobGluZSAtIDEpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCS8vIEJVRzExNTcxNjogaWYgY2Fubm90IGdldCBsaW5lIGRlbGltaXRlciBmcm9tIGN1cnJlbnQgbGluZSwganVzdAotCQkvLyB1c2UgZGVmYXVsdCBsaW5lIGRlbGltaXRlcgotCQlpZiAobGluZURlbGltaXRlciA9PSBudWxsKQotCQkJbGluZURlbGltaXRlciA9IGRvYy5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCXJldHVybiBsaW5lRGVsaW1pdGVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdE5vZGUoSURPTU5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCAmJiAoZlByb2dyZXNzTW9uaXRvciA9PSBudWxsIHx8ICFmUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkpIHsKLQkJCS8vIGZvcm1hdCBpbmRlbnRhdGlvbiBiZWZvcmUgbm9kZQotCQkJZm9ybWF0SW5kZW50YXRpb25CZWZvcmVOb2RlKG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCi0JCQkvLyBmb3JtYXQgaW5kZW50YXRpb24gYWZ0ZXIgbm9kZQotCQkJZm9ybWF0SW5kZW50YXRpb25BZnRlck5vZGUobm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGNvbXB1dGUgdGhlIGNvcnJlY3QgaW5kZW50YXRpb24gYWZ0ZXIgdGhpcyBub2RlCi0JICogZGVwZW5kaW5nIG9uIHRoZSBpbmRlbnRhdGlvbnMgb2YgaXRzIHNpYmxpbmcgbm9kZXMgYW5kIHBhcmVudCBub2RlLiBOb3QKLQkgKiBuZWVkZWQgYW55bW9yZT8KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRUcmFpbGluZ1RleHQoSURPTU5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJLy8gWzExMTY3NF0gSWYgaW5zaWRlIHhtbDpzcGFjZT0icHJlc2VydmUiIGVsZW1lbnQsIHdlIGJhaWwKLQkJaWYgKGZvcm1hdENvbnRyYWludHMuZ2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCgpKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gbm9kZS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJU3RyaW5nIGxpbmVJbmRlbnQgPSBmb3JtYXRDb250cmFpbnRzLmdldEN1cnJlbnRJbmRlbnQoKTsKLQkJU3RyaW5nIHBhcmVudExpbmVJbmRlbnQgPSBnZXROb2RlSW5kZW50KG5vZGUuZ2V0UGFyZW50Tm9kZSgpKTsKLQkJYm9vbGVhbiBjbGVhckFsbEJsYW5rTGluZXMgPSBmb3JtYXRDb250cmFpbnRzLmdldENsZWFyQWxsQmxhbmtMaW5lcygpOwotCi0JCWlmICgobm9kZSAhPSBudWxsKSAmJiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkpIHsKLQkJCUlET01Ob2RlIG5leHRTaWJsaW5nID0gKElET01Ob2RlKSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpZiAoKG5leHRTaWJsaW5nICE9IG51bGwpICYmIChuZXh0U2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSkgewotCQkJCVN0cmluZyBuZXh0U2libGluZ1RleHQgPSBuZXh0U2libGluZy5nZXROb2RlVmFsdWUoKTsKLQkJCQlpZiAobmV4dFNpYmxpbmcuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsKQotCQkJCQlpZiAoKG5leHRTaWJsaW5nLmdldFBhcmVudE5vZGUoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgKG5leHRTaWJsaW5nVGV4dC50cmltKCkubGVuZ3RoKCkgPT0gMCkpCi0JCQkJCQkvLyBkZWxldGUgc3BhY2VzIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50Ci0JCQkJCQlyZXBsYWNlTm9kZVZhbHVlKG5leHRTaWJsaW5nLCBFTVBUWV9TVFJJTkcpOwotCQkJCQllbHNlCi0JCQkJCQkvLyByZXBsYWNlIHRoZSB0ZXh0IG5vZGUgd2l0aCBwYXJlbnQgaW5kZW50YXRpb24KLQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobmV4dFNpYmxpbmcsIGxpbmVEZWxpbWl0ZXIgKyBwYXJlbnRMaW5lSW5kZW50KTsKLQkJCQllbHNlCi0JCQkJCS8vIHJlcGxhY2UgdGhlIHRleHQgbm9kZSB3aXRoIGluZGVudGF0aW9uCi0JCQkJCXJlcGxhY2VOb2RlVmFsdWUobmV4dFNpYmxpbmcsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChuZXh0U2libGluZyA9PSBudWxsKSB7Ci0JCQkJCWxpbmVJbmRlbnQgPSBwYXJlbnRMaW5lSW5kZW50OwotCi0JCQkJCWlmIChub2RlLmdldFBhcmVudE5vZGUoKS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkKLQkJCQkJCWlmICgobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAobm9kZS5nZXROb2RlVmFsdWUoKS5lbmRzV2l0aChsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCkpKSB7Ci0JCQkJCQkJLy8gdGhpcyB0ZXh0IG5vZGUgYWxyZWFkeSBlbmRzIHdpdGggdGhlIHJlcXVlc3RlZAotCQkJCQkJCS8vIGluZGVudGF0aW9uCi0JCQkJCQl9Ci0KLQkJCQkJCWVsc2UgaWYgKChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChub2RlLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIpKSkKLQkJCQkJCQlpZiAoY2xlYXJBbGxCbGFua0xpbmVzKQotCQkJCQkJCQlyZXBsYWNlTm9kZVZhbHVlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZUluZGVudCk7Ci0JCQkJCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkubGVuZ3RoKCkgPT0gMCkKLQkJCQkJCQkJLy8gcmVwbGFjZQotCQkJCQkJCQlyZXBsYWNlTm9kZVZhbHVlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQkJaWYgKCFub2RlLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KSkKLQkJCQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkuZW5kc1dpdGgobGluZURlbGltaXRlcikpCi0JCQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZUluZGVudCk7Ci0JCQkJCQkJCWVsc2UKLQkJCQkJCQkJCWluc2VydEFmdGVyTm9kZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlyZXBsYWNlTm9kZVZhbHVlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmICgobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAobm9kZS5nZXROb2RlVmFsdWUoKS5lbmRzV2l0aChsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCkpKSB7Ci0JCQkJCQkvLyB0aGlzIHRleHQgbm9kZSBhbHJlYWR5IGVuZHMgd2l0aCB0aGUgcmVxdWVzdGVkCi0JCQkJCQkvLyBpbmRlbnRhdGlvbgotCQkJCQl9Ci0KLQkJCQkJZWxzZSBpZiAoKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkuZW5kc1dpdGgobGluZURlbGltaXRlcikpKQotCQkJCQkJaWYgKGNsZWFyQWxsQmxhbmtMaW5lcykKLQkJCQkJCQlyZXBsYWNlTm9kZVZhbHVlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCWVsc2UKLQkJCQkJCQkvLyBhcHBlbmQgaW5kZW50YXRpb24KLQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZUluZGVudCk7Ci0JCQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkJCWlmIChub2RlLmdldE5vZGVWYWx1ZSgpLmxlbmd0aCgpID09IDApCi0JCQkJCQkJLy8gcmVwbGFjZQotCQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJZWxzZQotCQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJCWluc2VydEFmdGVyTm9kZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCWVsc2UKLQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSURPTU5vZGUgZ2V0RGVlcGVzdENoaWxkTm9kZShJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01Ob2RlIHJlc3VsdCA9IG51bGw7Ci0JCUlET01Ob2RlIGxhc3RDaGlsZCA9IChJRE9NTm9kZSkgbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQotCQlpZiAobGFzdENoaWxkID09IG51bGwpCi0JCQlyZXN1bHQgPSBub2RlOwotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGdldERlZXBlc3RDaGlsZE5vZGUobGFzdENoaWxkKTsKLQotCQkJaWYgKChyZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSB8fCByZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSkgJiYgIWlzRW5kVGFnTWlzc2luZyhub2RlKSkKLQkJCQlyZXN1bHQgPSBub2RlOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGdldEZvcm1hdENvbnRyYWludHMoKSB7Ci0JCWlmIChmRm9ybWF0Q29udHJhaW50cyA9PSBudWxsKSB7Ci0JCQlmRm9ybWF0Q29udHJhaW50cyA9IG5ldyBTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cygpOwotCi0JCQlmRm9ybWF0Q29udHJhaW50cy5zZXRDbGVhckFsbEJsYW5rTGluZXMoZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRDbGVhckFsbEJsYW5rTGluZXMoKSk7Ci0JCX0KLQotCQlyZXR1cm4gZkZvcm1hdENvbnRyYWludHM7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChmRm9ybWF0UHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkZvcm1hdFByZWZlcmVuY2VzID0gbmV3IFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCgpOwotCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldExpbmVXaWR0aChwcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCQkJKChTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwpIGZGb3JtYXRQcmVmZXJlbmNlcykuc2V0U3BsaXRNdWx0aUF0dHJzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUykpOwotCQkJCSgoU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKSBmRm9ybWF0UHJlZmVyZW5jZXMpLnNldEFsaWduRW5kQnJhY2tldChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQUxJR05fRU5EX0JSQUNLRVQpKTsKLQkJCQkoKFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZkZvcm1hdFByZWZlcmVuY2VzKS5zZXRQcmVzZXJ2ZVBDREFUQUNvbnRlbnQocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlBSRVNFUlZFX0NEQVRBQ09OVEVOVCkpOwotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRDbGVhckFsbEJsYW5rTGluZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUykpOwotCi0JCQkJY2hhciBpbmRlbnRDaGFyID0gJyAnOwotCQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQkJCWlmIChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJCWluZGVudENoYXIgPSAnXHQnOwotCQkJCX0KLQkJCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCQlpbmRlbnQuYXBwZW5kKGluZGVudENoYXIpOwotCQkJCX0KLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0SW5kZW50KGluZGVudC50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmRm9ybWF0UHJlZmVyZW5jZXM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0dGVyIGdldEZvcm1hdHRlcihJRE9NTm9kZSBub2RlKSB7Ci0JCS8vIDI2MjEzNSAtIE5QRSBkdXJpbmcgZm9ybWF0IG9mIGVtcHR5IGRvY3VtZW50Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlzaG9ydCBub2RlVHlwZSA9ICgoTm9kZSkgbm9kZSkuZ2V0Tm9kZVR5cGUoKTsKLQkJSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gbnVsbDsKLQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgRWxlbWVudE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IFRleHROb2RlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBOb01vdmVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IENvbW1lbnROb2RlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBOb2RlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuRE9DVU1FTlRfTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgRG9jdW1lbnROb2RlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBOb01vdmVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IE5vZGVGb3JtYXR0ZXIoKTsKLQkJCX0KLQkJfQotCi0JCS8vIGluaXQgZm9tYXR0ZXIKLQkJZm9ybWF0dGVyLnNldEZvcm1hdFByZWZlcmVuY2VzKGdldEZvcm1hdFByZWZlcmVuY2VzKCkpOwotCQlmb3JtYXR0ZXIuc2V0UHJvZ3Jlc3NNb25pdG9yKGZQcm9ncmVzc01vbml0b3IpOwotCi0JCXJldHVybiBmb3JtYXR0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRJbmRlbnRhdGlvbkxlbmd0aChTdHJpbmcgaW5kZW50KSB7Ci0JCS8vIFRPRE8gS2l0IDogVGhlIGNhbGN1bGF0aW9uIG9mIEluZGVudGF0aW9uTGVuZ3RoIGlzIG5vdCBjb3JyZWN0Ci0JCS8vIGhlcmUuCi0JCS8vIG5vZGVJbmRlbnRhdGlvbiBtYXkgY29udGFpbiB0YWJzLiBNdWx0aXBseSBieSA0IHRlbXBvcmFyaWx5IHRvIGdldAotCQkvLyBhcHByb3guIHdpZHRoLgotCQkvLyBOZWVkIHRvIHJlLXdvcmsuCi0KLQkJaW50IGluZGVudGF0aW9uTGVuZ3RoID0gMDsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudC5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoaW5kZW50LnN1YnN0cmluZyhpLCBpICsgMSkuY29tcGFyZVRvKFRBQikgPT0gMCkKLQkJCQlpbmRlbnRhdGlvbkxlbmd0aCArPSA0OwotCQkJZWxzZQotCQkJCWluZGVudGF0aW9uTGVuZ3RoKys7Ci0JCX0KLQotCQlyZXR1cm4gaW5kZW50YXRpb25MZW5ndGg7Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgZmluZCB0aGUgaW5kZW50YXRpb24gZm9yIHRoaXMgbm9kZS4gSXQgd2lsbCBzZWFyY2gKLQkgKiBiYWNrd2FyZHMgc3RhcnRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBub2RlIHVudGlsIGEgY2hhcmFjdGVyCi0JICogb3RoZXIgdGhhbiBhIHNwYWNlIG9yIGEgdGFiIGlzIGZvdW5kLiBJZiB0aGlzIG5vZGUgaXMgbnVsbCBvciBpdCdzIGEKLQkgKiBkb2N1bWVudCBub2RlIG9yIGl0J3MgYSBmaXJzdCBsZXZlbCBub2RlIChub2RlJ3MgcGFyZW50IGlzIGEgZG9jdW1lbnQKLQkgKiBub2RlKSB0aGUgZGVmYXVsdCBlbXB0eSBzdHJpbmcgd2lsbCBiZSByZXR1cm5lZCBhcyB0aGUgaW5kZW50YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROb2RlSW5kZW50KE5vZGUgbm9kZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gRU1QVFlfU1RSSU5HOwotCi0JCWlmICgobm9kZSAhPSBudWxsKSAmJiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpICYmIChub2RlLmdldFBhcmVudE5vZGUoKS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkpIHsKLQkJCUlET01Ob2RlIHNpYmxpbmdUZXh0Tm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCWlmICgoc2libGluZ1RleHROb2RlICE9IG51bGwpICYmIChzaWJsaW5nVGV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkpIHsKLQkJCQkvLyBmaW5kIHRoZSBpbmRlbnRhdGlvbgotCQkJCVN0cmluZyBzaWJsaW5nVGV4dCA9IHNpYmxpbmdUZXh0Tm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJCQlpbnQgc2libGluZ1RleHRMZW5ndGggPSBzaWJsaW5nVGV4dC5sZW5ndGgoKTsKLQkJCQlpZiAoKHNpYmxpbmdUZXh0ICE9IG51bGwpICYmIChzaWJsaW5nVGV4dExlbmd0aCA+IDApICYmICgoc2libGluZ1RleHQuY2hhckF0KHNpYmxpbmdUZXh0TGVuZ3RoIC0gMSkgPT0gU1BBQ0VfQ0hBUikgfHwgKHNpYmxpbmdUZXh0LmNoYXJBdChzaWJsaW5nVGV4dExlbmd0aCAtIDEpID09IFRBQl9DSEFSKSkpIHsKLQkJCQkJaW50IHNlYXJjaEluZGV4ID0gc2libGluZ1RleHRMZW5ndGggLSAxOwotCQkJCQl3aGlsZSAoKHNlYXJjaEluZGV4ID49IDApICYmICgoc2libGluZ1RleHQuY2hhckF0KHNlYXJjaEluZGV4KSA9PSBTUEFDRV9DSEFSKSB8fCAoc2libGluZ1RleHQuY2hhckF0KHNlYXJjaEluZGV4KSA9PSBUQUJfQ0hBUikpKQotCQkJCQkJc2VhcmNoSW5kZXgtLTsKLQotCQkJCQlpZiAoc2VhcmNoSW5kZXggPCBzaWJsaW5nVGV4dExlbmd0aCkKLQkJCQkJCXJlc3VsdCA9IHNpYmxpbmdUZXh0LnN1YnN0cmluZyhzZWFyY2hJbmRleCArIDEsIHNpYmxpbmdUZXh0TGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9kZU5hbWUoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gbm9kZS5nZXROb2RlTmFtZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9kZVRleHQoSURPTU5vZGUgbm9kZSkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0KLQkJaWYgKChub2RlIGluc3RhbmNlb2YgQ2hhcmFjdGVyRGF0YUltcGwpICYmICEobm9kZSBpbnN0YW5jZW9mIENvbW1lbnRJbXBsKSAmJiAhKG5vZGUgaW5zdGFuY2VvZiBDREFUQVNlY3Rpb25JbXBsKSAmJiAhaXNKU1BUYWcobm9kZSkpCi0JCQl0ZXh0ID0gKChDaGFyYWN0ZXJEYXRhSW1wbCkgbm9kZSkuZ2V0U291cmNlKCk7Ci0JCWVsc2UKLQkJCXRleHQgPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCXByb3RlY3RlZCBJRE9NTm9kZSBnZXRQYXJlbnRJbmRlbnROb2RlKElET01Ob2RlIG5vZGUpIHsKLQkJSURPTU5vZGUgcmVzdWx0ID0gbnVsbDsKLQkJSURPTU5vZGUgcGFyZW50Tm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJaWYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQlyZXN1bHQgPSBwYXJlbnROb2RlOwotCQllbHNlIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHBhcmVudE5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEZpcnN0UmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pCi0JCQkJcmVzdWx0ID0gcGFyZW50Tm9kZTsKLQkJCWVsc2UKLQkJCQlyZXN1bHQgPSBnZXRQYXJlbnRJbmRlbnROb2RlKHBhcmVudE5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGZpbmQgdGhlIGluZGVudGF0aW9uIGZvciBhIG5vZGUgc2libGluZyB0byB0aGlzIG5vZGUuCi0JICogSXQgd2lsbCB0cnkgdG8gZmluZCBhIHNpYmxpbmcgbm9kZSBiZWZvcmUgdGhpcyBub2RlIGZpcnN0LiBJZiB0aGVyZSBpcwotCSAqIG5vIHNpYmxpbmcgbm9kZSBiZWZvcmUgdGhpcyBub2RlLCBpdCB3aWxsIHRyeSB0byBmaW5kIGEgc2libGluZyBub2RlCi0JICogYWZ0ZXIgdGhpcyBub2RlLiBJZiBzdGlsbCBub3QgZm91bmQsIHdlIHdpbGwgY2hlY2sgaWYgdGhpcyBub2RlIGlzCi0JICogYWxyZWFkeSBpbmRlbnRlZCBmcm9tIGl0cyBwYXJlbnQuIElmIHllcywgdGhpcyBub2RlJ3MgaW5kZW50YXRpb24gd2lsbAotCSAqIGJlIHVzZWQuIE90aGVyd2lzZSwgdGhlIHBhcmVudCBub2RlJ3MgaW5kZW50YXRpb24gcGx1cyBvbmUgaW5kZW50YXRpb24KLQkgKiB3aWxsIGJlIHVzZWQuIElmIHRoaXMgbm9kZSBpcyBudWxsIG9yIGl0J3MgYSBkb2N1bWVudCBub2RlIG9yIGl0J3MgYQotCSAqIGZpcnN0IGxldmVsIG5vZGUgKG5vZGUncyBwYXJlbnQgaXMgYSBkb2N1bWVudCBub2RlKSB0aGUgZGVmYXVsdCBlbXB0eQotCSAqIHN0cmluZyB3aWxsIGJlIHJldHVybmVkIGFzIHRoZSBpbmRlbnRhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNpYmxpbmdJbmRlbnQoTm9kZSBub2RlKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBFTVBUWV9TVFJJTkc7Ci0KLQkJaWYgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAobm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSkgewotCQkJLy8gZmluZCB0aGUgdGV4dCBub2RlIGJlZm9yZSB0aGUgcHJldmlvdXMgbm9uLXRleHQgc2libGluZwotCQkJLy8gaWYgdGhhdCdzIG5vdCBmb3VuZCwgd2Ugd2lsbCB0cnkgdGhlIHRleHQgbm9kZSBiZWZvcmUgdGhlIG5leHQKLQkJCS8vIG5vbi10ZXh0IHNpYmxpbmcKLQkJCUlET01Ob2RlIHNpYmxpbmcgPSAoSURPTU5vZGUpIG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQl3aGlsZSAoKHNpYmxpbmcgIT0gbnVsbCkgJiYgKHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSB8fCBzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUpKSB7Ci0JCQkJaWYgKHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSAmJiBzaWJsaW5nLmdldFByZXZpb3VzU2libGluZygpICE9IG51bGwgJiYgc2libGluZy5nZXRQcmV2aW91c1NpYmxpbmcoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIFN0cmluZ1V0aWxzLmNvbnRhaW5zTGluZURlbGltaXRlcihzaWJsaW5nLmdldFByZXZpb3VzU2libGluZygpLmdldE5vZGVWYWx1ZSgpKSkKLQkJCQkJYnJlYWs7Ci0JCQkJc2libGluZyA9IChJRE9NTm9kZSkgc2libGluZy5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCX0KLQkJCWlmIChzaWJsaW5nID09IG51bGwpIHsKLQkJCQlzaWJsaW5nID0gKElET01Ob2RlKSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJd2hpbGUgKChzaWJsaW5nICE9IG51bGwpICYmIChzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpKQotCQkJCQlzaWJsaW5nID0gKElET01Ob2RlKSBzaWJsaW5nLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCQlTdHJpbmcgc2luZ2xlSW5kZW50ID0gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRJbmRlbnQoKTsKLQkJCVN0cmluZyBwYXJlbnRMaW5lSW5kZW50ID0gZ2V0Tm9kZUluZGVudChub2RlLmdldFBhcmVudE5vZGUoKSk7Ci0KLQkJCWlmIChzaWJsaW5nICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgc2libGluZ0luZGVudCA9IGdldE5vZGVJbmRlbnQoc2libGluZyk7Ci0JCQkJaWYgKHNpYmxpbmdJbmRlbnQubGVuZ3RoKCkgPiAwKQotCQkJCQlyZXN1bHQgPSBzaWJsaW5nSW5kZW50OwotCQkJCWVsc2UgewotCQkJCQlTdHJpbmcgbm9kZUluZGVudCA9IGdldE5vZGVJbmRlbnQobm9kZSk7Ci0JCQkJCWlmIChub2RlSW5kZW50Lmxlbmd0aCgpID4gcGFyZW50TGluZUluZGVudC5sZW5ndGgoKSkKLQkJCQkJCS8vIHRoaXMgbm9kZSBpcyBpbmRlbnRlZCBmcm9tIGl0cyBwYXJlbnQsIGl0cwotCQkJCQkJLy8gaW5kZW50YXRpb24gd2lsbCBiZSB1c2VkCi0JCQkJCQlyZXN1bHQgPSBub2RlSW5kZW50OwotCQkJCQllbHNlCi0JCQkJCQlyZXN1bHQgPSBwYXJlbnRMaW5lSW5kZW50ICsgc2luZ2xlSW5kZW50OwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCVN0cmluZyBub2RlSW5kZW50ID0gZ2V0Tm9kZUluZGVudChub2RlKTsKLQkJCQlpZiAobm9kZUluZGVudC5sZW5ndGgoKSA+IHBhcmVudExpbmVJbmRlbnQubGVuZ3RoKCkpCi0JCQkJCS8vIHRoaXMgbm9kZSBpcyBpbmRlbnRlZCBmcm9tIGl0cyBwYXJlbnQsIGl0cyBpbmRlbnRhdGlvbgotCQkJCQkvLyB3aWxsIGJlIHVzZWQKLQkJCQkJcmVzdWx0ID0gbm9kZUluZGVudDsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdCA9IHBhcmVudExpbmVJbmRlbnQgKyBzaW5nbGVJbmRlbnQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluc2VydEFmdGVyTm9kZShJRE9NTm9kZSBub2RlLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCWludCBvZmZzZXQgPSBub2RlLmdldEVuZE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gMDsKLQotCQkvLyAyNjE5NjggLSBmb3JtYXR0aW5nIHRhZyB3aXRob3V0IGNsb3NpbmcgYnJhY2tldDogPHQxPjx0MQotCQlpZiAobm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQlvZmZzZXQgPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHRFbmRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IG5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBvZmZzZXQ7Ci0JCX0KLQkJcmVwbGFjZShzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoLCBzdHJpbmcpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluc2VydEJlZm9yZU5vZGUoSURPTU5vZGUgbm9kZSwgU3RyaW5nIHN0cmluZykgewotCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlyZXBsYWNlKHN0cnVjdHVyZWREb2N1bWVudCwgbm9kZS5nZXRTdGFydE9mZnNldCgpLCAwLCBzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZSBhbGxvd3MgaXQKLQkgKiB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZS5lcXVhbHMoSVN0cnVjdHVyZWRGb3JtYXR0ZXIuY2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRW5kVGFnTWlzc2luZyhJRE9NTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJaWYgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAhaXNKU1BUYWcobm9kZSkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCQlJVGV4dFJlZ2lvbiBzdGFydFRhZ05hbWVSZWdpb24gPSBudWxsOwotCQkJaWYgKHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5zaXplKCkgPiAxKQotCQkJCXN0YXJ0VGFnTmFtZVJlZ2lvbiA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQlJVGV4dFJlZ2lvbiBlbmRUYWdOYW1lUmVnaW9uID0gbnVsbDsKLQkJCWlmIChlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA+IDEpCi0JCQkJZW5kVGFnTmFtZVJlZ2lvbiA9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCi0JCQlJVGV4dFJlZ2lvbkxpc3Qgc3RhcnRUYWdSZWdpb25zID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJaWYgKHN0YXJ0VGFnTmFtZVJlZ2lvbiA9PSBlbmRUYWdOYW1lUmVnaW9uICYmIHN0YXJ0VGFnTmFtZVJlZ2lvbiAhPSBudWxsICYmIChzdGFydFRhZ1JlZ2lvbnMuZ2V0KDApKS5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOICYmIChzdGFydFRhZ1JlZ2lvbnMuZ2V0KHN0YXJ0VGFnUmVnaW9ucy5zaXplKCkgLSAxKS5nZXRUeXBlKCkpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkKLQkJCQkvLyBlbmQgdGFnIG1pc3NpbmcKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBub2RlSGFzU2libGluZ3MoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkgIT0gbnVsbCkgfHwgKG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBOb2RlIGNoYW5nZWQuIE5vIGZvcm1hdCBzaG91bGQgYmUgcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkuCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlZ2lvblNwYWNlcyhJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKChyZWdpb24gIT0gbnVsbCkgJiYgKHJlZ2lvbiBpbnN0YW5jZW9mIENvbnRleHRSZWdpb24gfHwgcmVnaW9uIGluc3RhbmNlb2YgVGFnTmFtZVJlZ2lvbikgJiYgKGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pID4gZmxhdE5vZGUuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pKSkgewotCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCQlyZXBsYWNlKHN0cnVjdHVyZWREb2N1bWVudCwgZmxhdE5vZGUuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pLCBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKSAtIGZsYXROb2RlLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKSwgRU1QVFlfU1RSSU5HKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmVwbGFjZSB0aGUgc3RyaW5nIGF0IG9mZnNldCBhbmQgbGVuZ3RoIHdpdGggYSBuZXcKLQkgKiBzdHJpbmcuIElmIHRoZSBzdHJpbmcgdG8gYmUgcmVwbGFjZWQgaXMgdGhlIHNhbWUgYXMgdGhlIG5ldyBzdHJpbmcsIHRoZQotCSAqIHN0cmluZyB3aWxsIG5vdCBiZSByZXBsYWNlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlKElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc3RydWN0dXJlZERvY3VtZW50U3RyaW5nID0gc3RydWN0dXJlZERvY3VtZW50LmdldChvZmZzZXQsIGxlbmd0aCk7Ci0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50U3RyaW5nLmNvbXBhcmVUbyhzdHJpbmcpICE9IDApCi0JCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgsIHN0cmluZyk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJlcGxhY2UgdGhlIG5vZGUgdmFsdWUgd2l0aCBhIG5ldyBzdHJpbmcuIElmIHRoZSBub2RlCi0JICogdmFsdWUgdG8gYmUgcmVwbGFjZWQgaXMgdGhlIHNhbWUgYXMgdGhlIG5ldyBzdHJpbmcsIHRoZSBub2RlIHZhbHVlIHdpbGwKLQkgKiBub3QgYmUgcmVwbGFjZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVwbGFjZU5vZGVWYWx1ZShJRE9NTm9kZSBub2RlLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpbnQgb2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gbm9kZS5nZXRFbmRPZmZzZXQoKSAtIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQl0cnkgewotCQkJU3RyaW5nIHN0cnVjdHVyZWREb2N1bWVudFN0cmluZyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXQob2Zmc2V0LCBsZW5ndGgpOwotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFN0cmluZy5jb21wYXJlVG8oc3RyaW5nKSAhPSAwKQotCQkJCXJlcGxhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgc3RyaW5nKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvcm1hdFByZWZlcmVuY2VzKElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZm9ybWF0UHJlZmVyZW5jZXMpIHsKLQkJZkZvcm1hdFByZWZlcmVuY2VzID0gZm9ybWF0UHJlZmVyZW5jZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0dGVyI3NldFByb2dyZXNzTW9uaXRvcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZQcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOwotCX0KLQotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNKU1BUYWcoTm9kZSBub2RlKSB7Ci0KLQkJZmluYWwgU3RyaW5nIEpTUF9DTE9TRSA9ICJKU1BfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JCS8vIGZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9DTE9TRSA9ICJKU1BfQ09NTUVOVF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfT1BFTiA9ICJKU1BfQ09NTUVOVF9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfVEVYVCA9ICJKU1BfQ09NTUVOVF9URVhUIjsgLy8kTk9OLU5MUy0xJAotCi0JCWZpbmFsIFN0cmluZyBKU1BfQ09OVEVOVCA9ICJKU1BfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIEpTUF9ERUNMQVJBVElPTl9PUEVOID0gIkpTUF9ERUNMQVJBVElPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9DTE9TRSA9ICJKU1BfRElSRUNUSVZFX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9OQU1FID0gIkpTUF9ESVJFQ1RJVkVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCQlmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9PUEVOID0gIkpTUF9ESVJFQ1RJVkVfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIEpTUF9FWFBSRVNTSU9OX09QRU4gPSAiSlNQX0VYUFJFU1NJT05fT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBmaW5hbCBTdHJpbmcgSlNQX1JPT1RfVEFHX05BTUUgPSAiSlNQX1JPT1RfVEFHX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQkJZmluYWwgU3RyaW5nIEpTUF9TQ1JJUFRMRVRfT1BFTiA9ICJKU1BfU0NSSVBUTEVUX09QRU4iOyAvLyROT04tTkxTLTEkCi0KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCS8vIGluIHNvbWUgY2FzZXMsIHRoZSBub2RlcyBleGlzdHMsIGJ1dCBoYXNuJ3QgYmVlbiBhc3NvY2lhdGVkCi0JCQkvLyB3aXRoCi0JCQkvLyBhIGZsYXRub2RlIHlldCAodGhlIHNjcmVlbiB1cGRhdGVzIGNhbiBiZSBpbml0aWF0ZWQgb24gYQotCQkJLy8gZGlmZmVyZW50IHRocmVhZCwKLQkJCS8vIHNvIHRoZSByZXF1ZXN0IGZvciBhIGZsYXRub2RlIGNhbiBjb21lIGluIGJlZm9yZSB0aGUgbm9kZSBpcwotCQkJLy8gZnVsbHkgZm9ybWVkLgotCQkJLy8gaWYgdGhlIGZsYXRub2RlIGlzIG51bGwsIHdlJ2xsIGp1c3QgYWxsb3cgdGhlIGRlZmF1bHRzIHRvCi0JCQkvLyBhcHBseS4KLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGZsYXROb2RlVHlwZSA9IGZsYXROb2RlLmdldFR5cGUoKTsKLQkJCQkvLyBzaG91bGQgbm90IGJlIG51bGwsIGJ1dCBqdXN0IHRvIGJlIHN1cmUKLQkJCQlpZiAoZmxhdE5vZGVUeXBlICE9IG51bGwpIHsKLQkJCQkJaWYgKChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9DT05URU5UKSkgfHwgKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX0VYUFJFU1NJT05fT1BFTikpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9TQ1JJUFRMRVRfT1BFTikpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9ERUNMQVJBVElPTl9PUEVOKSkgfHwgKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX0RJUkVDVElWRV9DTE9TRSkpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9ESVJFQ1RJVkVfTkFNRSkpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9ESVJFQ1RJVkVfT1BFTikpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9DTE9TRSkpKSB7Ci0JCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzAyNGViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXM7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwgZXh0ZW5kcyBTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgewotCXByaXZhdGUgYm9vbGVhbiBmU3BsaXRNdWx0aUF0dHJzID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZQcmVzZXJ2ZVBDREFUQUNvbnRlbnQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkFsaWduRW5kQnJhY2tldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVHJ1ZSBpZiBmb3JtYXR0ZXIgc2hvdWxkIHNwbGl0IGVsZW1lbnRzIHdpdGggbXVsdGlwbGUgYXR0cmlidXRlcyBvbnRvCi0JICogbmV3IGxpbmVzLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFNwbGl0TXVsdGlBdHRycygpIHsKLQkJcmV0dXJuIGZTcGxpdE11bHRpQXR0cnM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB3aGV0aGVyIG9yIG5vdCBmb3JtYXR0ZXIgc2hvdWxkIHNwbGl0IGVsZW1lbnRzIHdpdGggbXVsdGlwbGUKLQkgKiBhdHRyaWJ1dGVzIG9udG8gbmV3IGxpbmVzLgotCSAqIAotCSAqIEBwYXJhbSBzcGxpdE11bHRpQXR0cnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGxpdE11bHRpQXR0cnMoYm9vbGVhbiBzcGxpdE11bHRpQXR0cnMpIHsKLQkJZlNwbGl0TXVsdGlBdHRycyA9IHNwbGl0TXVsdGlBdHRyczsKLQl9Ci0KLQkvKioKLQkgKiBUcnVlIGlmIHRhZ3Mgd2l0aCBQQ0RBVEEgY29udGVudCBzaG91bGQgbm90IGhhdmUgdGhlaXIgd2hpdGVzcGFjZQotCSAqIG1lc3NlZCB3aXRoIHdoZW4gZm9ybWF0dGluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ByZXNlcnZlUENEQVRBQ29udGVudCgpIHsKLQkJcmV0dXJuIGZQcmVzZXJ2ZVBDREFUQUNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB3aGV0aGVyIG9yIG5vdCBmb3JtYXR0ZXIgc2hvdWxkIHByZXNlcnZlIHdoaXRlc3BhY2UgaW4gdGFncyB3aXRoCi0JICogUENEQVRBIGNvbnRlbnQuCi0JICogCi0JICogQHBhcmFtIHByZXNlcnZlUENEQVRBQ29udGVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlcnZlUENEQVRBQ29udGVudChib29sZWFuIHByZXNlcnZlUENEQVRBQ29udGVudCkgewotCQlmUHJlc2VydmVQQ0RBVEFDb250ZW50ID0gcHJlc2VydmVQQ0RBVEFDb250ZW50OwotCX0KLQotCS8qKgotCSAqIFRydWUgaWYgZW5kIGJyYWNrZXRzIG9mIHN0YXJ0IHRhZ3Mgc2hvdWxkIGJlIHBsYWNlZCBvbiBhIG5ldyBsaW5lIGlmCi0JICogdGhlIHN0YXJ0IHRhZyBzcGFucyBtb3JlIHRoYW4gb25lIGxpbmUuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWxpZ25FbmRCcmFja2V0KCkgewotCQlyZXR1cm4gZkFsaWduRW5kQnJhY2tldDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgb3Igbm90IGZvcm1hdHRlciBzaG91bGQgYWxpZ24gdGhlIGVuZCBicmFja2V0IG9mIGEgc3RhcnQKLQkgKiB0YWcgb24gYSBuZXcgbGluZSBpZiB0aGUgc3RhcnQgdGFnIHNwYW5zIG1vcmUgdGhhbiBvbmUgbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWxpZ25FbmRCcmFja2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QWxpZ25FbmRCcmFja2V0KGJvb2xlYW4gYWxpZ25FbmRCcmFja2V0KSB7Ci0JCWZBbGlnbkVuZEJyYWNrZXQgPSBhbGlnbkVuZEJyYWNrZXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvVGV4dE5vZGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L1RleHROb2RlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3M2FiNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvVGV4dE5vZGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEplc3BlciBTdGVlbiBN+GxsZXIgLSB4bWw6c3BhY2U9J3ByZXNlcnZlJyBzdXBwb3J0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFRleHROb2RlRm9ybWF0dGVyIGV4dGVuZHMgTm9kZUZvcm1hdHRlciB7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIENSID0gIlxyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBERUxJTUlURVJTID0gIiBcdFxuXHJcZiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRkYgPSAiXGYiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIExGID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBTUEFDRSA9ICIgIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBUQUIgPSAiXHQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBjb21wcmVzc1NwYWNlcyhTdHJpbmcgc3RyaW5nLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQkvKgotCQkgKiBOb3RlIHRoYXQgdGhlIFN0cnVjdHVyZWRUZXh0RWRpdG9yIHN1cHBvcnRzIG1peGVkIG5ldyBsaW5lCi0JCSAqIGNoYXJhY3RlcnMgKENSLCBMRiwgQ1JMRikgaW4gb25lIGZpbGUuIFdlIGhhdmUgdG8gaGFuZGxlIHRoYXQgd2hlbgotCQkgKiB3ZSB0cnkgdG8gcHJlc2VydmUgYmxhbmsgbGluZXMuCi0JCSAqLwotCQlTdHJpbmdbXSBzdHJpbmdBcnJheSA9IG51bGw7Ci0JCWJvb2xlYW4gY2xlYXJBbGxCbGFua0xpbmVzID0gZm9ybWF0Q29udHJhaW50cy5nZXRDbGVhckFsbEJsYW5rTGluZXMoKTsKLQotCQlpZiAoY2xlYXJBbGxCbGFua0xpbmVzKQotCQkJc3RyaW5nQXJyYXkgPSBTdHJpbmdVdGlscy5hc0FycmF5KHN0cmluZyk7Ci0JCWVsc2UKLQkJCXN0cmluZ0FycmF5ID0gU3RyaW5nVXRpbHMuYXNBcnJheShzdHJpbmcsIERFTElNSVRFUlMsIHRydWUpOwotCi0JCVN0cmluZ0J1ZmZlciBjb21wcmVzc2VkU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAoc3RyaW5nQXJyYXkubGVuZ3RoID4gMCkgewotCQkJYm9vbGVhbiBjciA9IGZhbHNlLCBsZiA9IGZhbHNlLCBjcjIgPSBmYWxzZSwgbm9uU3BhY2UgPSB0cnVlOwotCi0JCQlpZiAoc3RyaW5nQXJyYXlbMF0uY29tcGFyZVRvKENSKSA9PSAwKQotCQkJCWNyID0gdHJ1ZTsKLQkJCWVsc2UgaWYgKHN0cmluZ0FycmF5WzBdLmNvbXBhcmVUbyhMRikgPT0gMCkKLQkJCQlsZiA9IHRydWU7Ci0JCQllbHNlIGlmICgoc3RyaW5nQXJyYXlbMF0uY29tcGFyZVRvKFNQQUNFKSAhPSAwKSAmJiAoc3RyaW5nQXJyYXlbMF0uY29tcGFyZVRvKFRBQikgIT0gMCkgJiYgKHN0cmluZ0FycmF5WzBdLmNvbXBhcmVUbyhGRikgIT0gMCkpIHsKLQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChzdHJpbmdBcnJheVswXSk7Ci0JCQkJbm9uU3BhY2UgPSB0cnVlOwotCQkJfQotCi0JCQlmb3IgKGludCBpID0gMTsgaSA8IHN0cmluZ0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHN0cmluZ0FycmF5W2ldLmNvbXBhcmVUbyhDUikgPT0gMCkgewotCQkJCQlpZiAoY3IgJiYgbGYpIHsKLQkJCQkJCWlmIChub25TcGFjZSkgewotCQkJCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKENSICsgTEYpOwotCQkJCQkJCW5vblNwYWNlID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChzdHJpbmdBcnJheVtpXSk7Ci0JCQkJCQljcjIgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNyKSB7Ci0JCQkJCQlpZiAobm9uU3BhY2UpIHsKLQkJCQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChDUik7Ci0JCQkJCQkJbm9uU3BhY2UgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKHN0cmluZ0FycmF5W2ldKTsKLQkJCQkJCWNyMiA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJY3IgPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlIGlmIChzdHJpbmdBcnJheVtpXS5jb21wYXJlVG8oTEYpID09IDApIHsKLQkJCQkJaWYgKGNyICYmIGxmICYmIGNyMikgewotCQkJCQkJY29tcHJlc3NlZFN0cmluZy5hcHBlbmQoc3RyaW5nQXJyYXlbaV0pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGxmKSB7Ci0JCQkJCQlpZiAobm9uU3BhY2UpIHsKLQkJCQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChMRik7Ci0JCQkJCQkJbm9uU3BhY2UgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKHN0cmluZ0FycmF5W2ldKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQlsZiA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChzdHJpbmdBcnJheVtpXS5jb21wYXJlVG8oU1BBQ0UpICE9IDApICYmIChzdHJpbmdBcnJheVtpXS5jb21wYXJlVG8oVEFCKSAhPSAwKSAmJiAoc3RyaW5nQXJyYXlbaV0uY29tcGFyZVRvKEZGKSAhPSAwKSkgewotCQkJCQlpZiAoY29tcHJlc3NlZFN0cmluZy5sZW5ndGgoKSA+IDApCi0JCQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChTUEFDRSk7Ci0JCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKHN0cmluZ0FycmF5W2ldKTsKLQotCQkJCQljciA9IGZhbHNlOwotCQkJCQlsZiA9IGZhbHNlOwotCQkJCQljcjIgPSBmYWxzZTsKLQkJCQkJbm9uU3BhY2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjb21wcmVzc2VkU3RyaW5nLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Tm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQkvLyBbMTExNjc0XSBJZiBpbnNpZGUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZWxlbWVudCwgd2UgYmFpbAotCQlpZiAoZm9ybWF0Q29udHJhaW50cy5nZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KCkpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQkJaW50IGxpbmVXaWR0aCA9IGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0TGluZVdpZHRoKCk7Ci0JCQlpbnQgY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA9IGNvbXB1dGVBdmFpbGFibGVMaW5lV2lkdGgoZG9jLCBub2RlLmdldFN0YXJ0T2Zmc2V0KCksIGxpbmVXaWR0aCk7Ci0KLQkJCVN0cmluZyBub2RlVGV4dCA9IGdldE5vZGVUZXh0KG5vZGUpOwotCQkJU3RyaW5nIGNvbXByZXNzZWRUZXh0ID0gY29tcHJlc3NTcGFjZXMobm9kZVRleHQsIGZvcm1hdENvbnRyYWludHMpOwotCi0JCQlJRE9NTm9kZSBwYXJlbnROb2RlID0gKElET01Ob2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJaWYgKCgoZW5vdWdoU3BhY2UocGFyZW50Tm9kZSwgY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCwgY29tcHJlc3NlZFRleHQpKSAmJiAobm9TaWJsaW5nc0FuZE5vRm9sbG93aW5nQ29tbWVudChub2RlKSkgJiYgIWZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbnNMaW5lRGVsaW1pdGVycyhwYXJlbnROb2RlKSkgfHwgbm9kZS5nZXRTdGFydE9mZnNldCgpID09IDApIHsKLQkJCQloYW5kbGVOb1JlZmxvdyhub2RlLCBkb2MsIGNvbXByZXNzZWRUZXh0LCBwYXJlbnROb2RlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG5vdCBlbm91Z2ggc3BhY2UsIG5lZWQgdG8gcmVmbG93IHRleHQKLQkJCQlTdHJpbmcgbm9kZUluZGVudGF0aW9uID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0JCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA9IGxpbmVXaWR0aCAtIGdldEluZGVudGF0aW9uTGVuZ3RoKG5vZGVJbmRlbnRhdGlvbik7Ci0JCQkJTGlzdCB2ZWN0b3IgPSByZWZsb3dUZXh0KGNvbXByZXNzZWRUZXh0LCBjdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoKTsKLQkJCQlpbnQgdmVjdG9yU2l6ZSA9IHZlY3Rvci5zaXplKCk7Ci0JCQkJU3RyaW5nQnVmZmVyIHJlZmxvd2VkVGV4dEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlTdHJpbmcgbGluZURlbGltaXRlciA9IGdldExpbmVEZWxpbWl0ZXIoZG9jLCBub2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCS8vIGhhbmRsZSBmaXJzdCBsaW5lIHNwZWNpYWxseSB0byBjaGVjayBmb3IgYWxsb3dXaGl0ZXNwYWNlCi0JCQkJaWYgKHZlY3RvclNpemUgPiAwKSB7Ci0JCQkJCS8vIGRldGVybWluZXMgd2hldGhlciBvciBub3QgdG8gYWxsb3cgd2hpdGVzcGFjZSBpZiB0aGVyZQotCQkJCQkvLyBpcyBhbiBlbnRpdHkgb3IgY2RhdGEgYmVmb3JlIGl0Ci0JCQkJCWJvb2xlYW4gYWxsb3dXaGl0ZXNwYWNlID0gdHJ1ZTsKLQkJCQkJLy8gWzIwNjA3Ml0gU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotCQkJCQlpZiAobm9kZVRleHQubGVuZ3RoKCkgPT0gMCB8fCAhQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShub2RlVGV4dC5jaGFyQXQoMCkpKSB7Ci0JCQkJCQlOb2RlIHByZXZpb3VzU2libGluZyA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJCQlpZiAocHJldmlvdXNTaWJsaW5nICE9IG51bGwgJiYgKHByZXZpb3VzU2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIHx8IHByZXZpb3VzU2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFKSkKLQkJCQkJCQlhbGxvd1doaXRlc3BhY2UgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQlTdHJpbmcgdGhlU3RyaW5nID0gKFN0cmluZykgdmVjdG9yLmdldCgwKTsKLQkJCQkJaWYgKGFsbG93V2hpdGVzcGFjZSkgewotCQkJCQkJcmVmbG93ZWRUZXh0QnVmZmVyLmFwcGVuZChsaW5lRGVsaW1pdGVyKTsKLQkJCQkJCWlmICh0aGVTdHJpbmcudHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJCQkJCQlyZWZsb3dlZFRleHRCdWZmZXIuYXBwZW5kKG5vZGVJbmRlbnRhdGlvbikuYXBwZW5kKHRoZVN0cmluZyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZWZsb3dlZFRleHRCdWZmZXIuYXBwZW5kKHRoZVN0cmluZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gZG8gdGhlIHJlc3Qgb2YgdGhlIGxpbmVzCi0JCQkJZm9yIChpbnQgaSA9IDE7IGkgPCB2ZWN0b3JTaXplOyBpKyspIHsKLQkJCQkJU3RyaW5nIHRoZVN0cmluZyA9IChTdHJpbmcpIHZlY3Rvci5nZXQoaSk7Ci0JCQkJCWlmICh0aGVTdHJpbmcudHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJCQkJCXJlZmxvd2VkVGV4dEJ1ZmZlci5hcHBlbmQobGluZURlbGltaXRlcikuYXBwZW5kKG5vZGVJbmRlbnRhdGlvbikuYXBwZW5kKHRoZVN0cmluZyk7Ci0JCQkJCWVsc2UKLQkJCQkJCXJlZmxvd2VkVGV4dEJ1ZmZlci5hcHBlbmQobGluZURlbGltaXRlcik7Ci0JCQkJfQotCQkJCVN0cmluZyByZWZsb3dlZFRleHQgPSByZWZsb3dlZFRleHRCdWZmZXIudG9TdHJpbmcoKTsKLQkJCQlpZiAobm9kZS5nZXROZXh0U2libGluZygpID09IG51bGwpIHsKLQkJCQkJaWYgKGlzRW5kVGFnTWlzc2luZyhwYXJlbnROb2RlKSkgewotCQkJCQkJLy8gZG9uJ3QgYWRkIGluZGVudGF0aW9uIHRvIGVuZCBpZiBwYXJlbnQgZW5kIHRhZyBpcwotCQkJCQkJLy8gbWlzc2luZwotCQkJCQl9Ci0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBhZGQgcGFyZW50J3MgaW5kZW50YXRpb24gdG8gZW5kCi0JCQkJCQlub2RlSW5kZW50YXRpb24gPSBnZXROb2RlSW5kZW50KHBhcmVudE5vZGUpOwotCQkJCQkJaWYgKCFyZWZsb3dlZFRleHQuZW5kc1dpdGgobGluZURlbGltaXRlciArIG5vZGVJbmRlbnRhdGlvbikpIHsKLQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBsaW5lRGVsaW1pdGVyKTsKLQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBub2RlSW5kZW50YXRpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoIXJlZmxvd2VkVGV4dC5lbmRzV2l0aChsaW5lRGVsaW1pdGVyICsgbm9kZUluZGVudGF0aW9uKSkgewotCQkJCQkJLy8gbm90IGFscmVhZHkgZW5kZWQgd2l0aCB0aGUgZXhwZWN0ZWQgaW5kZW50YXRpb24KLQkJCQkJCU5vZGUgbmV4dFNpYmxpbmcgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQlpZiAobmV4dFNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSkgewotCQkJCQkJCS8vIGFkZCBpbmRlbnRhdGlvbiB0byBlbmQgaWYKLQkJCQkJCQkvLyBjdXJyZW50VGV4dEVuZHNXaXRoTGluZURlbGltaXRlcgotCQkJCQkJCS8vIG9yIGZvbGxvd2VkIGJ5IG11bHRpTGluZUNvbW1lbnQKLQotCQkJCQkJCWludCBpbmRleE9mTGFzdExpbmVEZWxpbWl0ZXIgPSBTdHJpbmdVdGlscy5pbmRleE9mTGFzdExpbmVEZWxpbWl0ZXIobm9kZVRleHQpOwotCQkJCQkJCWJvb2xlYW4gY3VycmVudFRleHRFbmRzV2l0aExpbmVEZWxpbWl0ZXIgPSBpbmRleE9mTGFzdExpbmVEZWxpbWl0ZXIgIT0gLTE7Ci0JCQkJCQkJaWYgKGN1cnJlbnRUZXh0RW5kc1dpdGhMaW5lRGVsaW1pdGVyKSB7Ci0JCQkJCQkJCS8vIG5vIG1vcmUgbm9uIGJsYW5rIGNoYXJhY3RlciBhZnRlciB0aGUgbGFzdAotCQkJCQkJCQkvLyBsaW5lIGRlbGltaXRlcgotCQkJCQkJCQljdXJyZW50VGV4dEVuZHNXaXRoTGluZURlbGltaXRlciA9IFN0cmluZ1V0aWxzLmluZGV4T2ZOb25ibGFuayhub2RlVGV4dCwgaW5kZXhPZkxhc3RMaW5lRGVsaW1pdGVyKSA9PSAtMTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlTdHJpbmcgbm9kZVZhbHVlID0gbmV4dFNpYmxpbmcuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQkJYm9vbGVhbiBtdWx0aUxpbmVDb21tZW50ID0gU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKG5vZGVWYWx1ZSk7Ci0KLQkJCQkJCQlpZiAoY3VycmVudFRleHRFbmRzV2l0aExpbmVEZWxpbWl0ZXIgfHwgbXVsdGlMaW5lQ29tbWVudCkgewotCQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBsaW5lRGVsaW1pdGVyKTsKLQkJCQkJCQkJcmVmbG93ZWRUZXh0ID0gU3RyaW5nVXRpbHMuYXBwZW5kSWZOb3RFbmRXaXRoKHJlZmxvd2VkVGV4dCwgbm9kZUluZGVudGF0aW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChuZXh0U2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIHx8IG5leHRTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUpIHsKLQkJCQkJCQlpbnQgdGV4dExlbmd0aCA9IG5vZGVUZXh0Lmxlbmd0aCgpOwotCQkJCQkJCWlmICh0ZXh0TGVuZ3RoID4gMCAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG5vZGVUZXh0LmNoYXJBdCh0ZXh0TGVuZ3RoIC0gMSkpKSB7Ci0JCQkJCQkJCXJlZmxvd2VkVGV4dCA9IFN0cmluZ1V0aWxzLmFwcGVuZElmTm90RW5kV2l0aChyZWZsb3dlZFRleHQsIGxpbmVEZWxpbWl0ZXIpOwotCQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBub2RlSW5kZW50YXRpb24pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIG5vdCBhIGNvbW1lbnQsIGp1c3QgYWRkIGFkZCBpbmRlbnRhdGlvbiB0byBlbmQKLQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBsaW5lRGVsaW1pdGVyKTsKLQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBub2RlSW5kZW50YXRpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmVwbGFjZU5vZGVWYWx1ZShub2RlLCByZWZsb3dlZFRleHQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogS2VlcHMgdGV4dCBpbmxpbmUgd2l0aCBpdHMgcGFyZW50IChubyByZWZsb3cgbmVjZXNzYXJ5KQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGRvYwotCSAqIEBwYXJhbSBjb21wcmVzc2VkVGV4dAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZU5vUmVmbG93KElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jLCBTdHJpbmcgY29tcHJlc3NlZFRleHQsIElET01Ob2RlIHBhcmVudE5vZGUpIHsKLQkJU3RyaW5nIG5vZGVJbmRlbnRhdGlvbjsKLQkJLy8gZW5vdWdoIHNwYWNlIGFuZCB0ZXh0IGhhcyBubyBsaW5lIGRlbGltaXRlcnMgYW5kIChub2RlIGhhcyBubwotCQkvLyBzaWJsaW5ncyBvciBmb2xsb3dlZCBieSBpbmxpbmUgY29tbWVudCkgYW5kCi0JCS8vIHBhcmVudEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbnNMaW5lRGVsaW1pdGVycwotCi0JCWlmIChpc0VuZFRhZ01pc3NpbmcocGFyZW50Tm9kZSkpIHsKLQkJCXBhcmVudE5vZGUgPSAoSURPTU5vZGUpIHBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJd2hpbGUgKGlzRW5kVGFnTWlzc2luZyhwYXJlbnROb2RlKSkKLQkJCQlwYXJlbnROb2RlID0gKElET01Ob2RlKSBwYXJlbnROb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJLy8gYWRkIHBhcmVudCdzIGluZGVudGF0aW9uIHRvIGVuZAotCQkJbm9kZUluZGVudGF0aW9uID0gZ2V0Tm9kZUluZGVudChwYXJlbnROb2RlKTsKLQkJCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gZ2V0TGluZURlbGltaXRlcihkb2MsIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlpZiAoIWNvbXByZXNzZWRUZXh0LmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBub2RlSW5kZW50YXRpb24pKSB7Ci0JCQkJY29tcHJlc3NlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgoY29tcHJlc3NlZFRleHQsIGxpbmVEZWxpbWl0ZXIpOwotCQkJCWNvbXByZXNzZWRUZXh0ID0gU3RyaW5nVXRpbHMuYXBwZW5kSWZOb3RFbmRXaXRoKGNvbXByZXNzZWRUZXh0LCBub2RlSW5kZW50YXRpb24pOwotCQkJfQotCQl9Ci0KLQkJaWYgKChwYXJlbnROb2RlICE9IG51bGwpICYmIChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAobm9kZS5nZXROb2RlVmFsdWUoKS5sZW5ndGgoKSA+IDApICYmIChub2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSAmJiAoKG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkgPT0gbnVsbCkgfHwgKG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsKSkpCi0JCQkvLyBkZWxldGUgc3BhY2VzIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kIG9mIHRoZSBkb2N1bWVudAotCQkJY29tcHJlc3NlZFRleHQgPSBFTVBUWV9TVFJJTkc7Ci0KLQkJcmVwbGFjZU5vZGVWYWx1ZShub2RlLCBjb21wcmVzc2VkVGV4dCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG5vU2libGluZ3NBbmROb0ZvbGxvd2luZ0NvbW1lbnQoSURPTU5vZGUgbm9kZSkgewotCQlJRE9NTm9kZSBuZXh0U2libGluZyA9IChJRE9NTm9kZSkgbm9kZS5nZXROZXh0U2libGluZygpOwotCQlyZXR1cm4gIW5vZGVIYXNTaWJsaW5ncyhub2RlKSB8fCAobm9MaW5lRGVsaW1pdGVyKG5vZGUpICYmIGlzQ29tbWVudChuZXh0U2libGluZykgJiYgbm9MaW5lRGVsaW1pdGVyKG5leHRTaWJsaW5nKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudChJRE9NTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBub0xpbmVEZWxpbWl0ZXIoSURPTU5vZGUgbm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAhU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlcyBpZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2Ugb24gdGhlIGN1cnJlbnQgbGluZSBmb3IKLQkgKiBjb21wcmVzc2VkVGV4dCAoYW5kIGZvciBpdHMgcGFyZW50IGVuZCB0YWcpCi0JICogCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiBAcGFyYW0gY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aAotCSAqIEBwYXJhbSBjb21wcmVzc2VkVGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZW5vdWdoU3BhY2UoSURPTU5vZGUgcGFyZW50Tm9kZSwgaW50IGN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGgsIFN0cmluZyBjb21wcmVzc2VkVGV4dCkgewotCQlpbnQgcGFyZW50RW5kVGFnTGVuZ3RoID0gcGFyZW50Tm9kZS5nZXROb2RlTmFtZSgpLmxlbmd0aCgpICsgMzsKLQkJcmV0dXJuIGNvbXByZXNzZWRUZXh0Lmxlbmd0aCgpIDw9IChjdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoIC0gcGFyZW50RW5kVGFnTGVuZ3RoKSAmJiAhU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKGNvbXByZXNzZWRUZXh0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVmVjdG9yIHJlZmxvd1RleHQoU3RyaW5nIHRleHQsIGludCBhdmFpbGFibGVXaWR0aCkgewotCQlTdHJpbmdbXSBzdHJpbmdBcnJheSA9IG51bGw7Ci0JCWJvb2xlYW4gY2xlYXJBbGxCbGFua0xpbmVzID0gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRDbGVhckFsbEJsYW5rTGluZXMoKTsKLQotCQlpZiAoY2xlYXJBbGxCbGFua0xpbmVzKQotCQkJc3RyaW5nQXJyYXkgPSBTdHJpbmdVdGlscy5hc0FycmF5KHRleHQpOwotCQllbHNlCi0JCQlzdHJpbmdBcnJheSA9IFN0cmluZ1V0aWxzLmFzQXJyYXkodGV4dCwgREVMSU1JVEVSUywgdHJ1ZSk7Ci0KLQkJVmVjdG9yIG91dHB1dCA9IG5ldyBWZWN0b3IoKTsKLQkJaWYgKChzdHJpbmdBcnJheSAhPSBudWxsKSAmJiAoc3RyaW5nQXJyYXkubGVuZ3RoID4gMCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpZiAoc3RyaW5nQXJyYXlbMF0uY29tcGFyZVRvKENSKSAhPSAwKQotCQkJCWJ1ZmZlci5hcHBlbmQoc3RyaW5nQXJyYXlbMF0pOwotCQkJaW50IGJ1ZmZlckxlbmd0aCA9IHN0cmluZ0FycmF5WzBdLnRvU3RyaW5nKCkubGVuZ3RoKCk7Ci0JCQlib29sZWFuIGNyID0gc3RyaW5nQXJyYXlbMF0uY29tcGFyZVRvKENSKSA9PSAwOwotCi0JCQlmb3IgKGludCBpID0gMTsgaSA8IHN0cmluZ0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIGVhY2hTdHJpbmcgPSBzdHJpbmdBcnJheVtpXTsKLQkJCQlpZiAoKGVhY2hTdHJpbmcuY29tcGFyZVRvKFNQQUNFKSAhPSAwKSAmJiAoZWFjaFN0cmluZy5jb21wYXJlVG8oVEFCKSAhPSAwKSAmJiAoZWFjaFN0cmluZy5jb21wYXJlVG8oRkYpICE9IDApKSB7Ci0JCQkJCWlmICgoYnVmZmVyTGVuZ3RoICsgMSArIGVhY2hTdHJpbmcubGVuZ3RoKCkgPiBhdmFpbGFibGVXaWR0aCkgfHwgKGVhY2hTdHJpbmcuY29tcGFyZVRvKENSKSA9PSAwKSB8fCAoZWFjaFN0cmluZy5jb21wYXJlVG8oTEYpID09IDApKSB7Ci0JCQkJCQlpZiAoKGVhY2hTdHJpbmcuY29tcGFyZVRvKExGKSA9PSAwKSAmJiBjcikgewotCQkJCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCW91dHB1dC5hZGQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCQlidWZmZXJMZW5ndGggPSAwOwotCQkJCQkJfQotCQkJCQkJY3IgPSBlYWNoU3RyaW5nLmNvbXBhcmVUbyhDUikgPT0gMDsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChidWZmZXIudG9TdHJpbmcoKS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKFNQQUNFKTsKLQkJCQkJCWJ1ZmZlckxlbmd0aCsrOwotCQkJCQl9Ci0JCQkJCWlmICgoZWFjaFN0cmluZy5jb21wYXJlVG8oQ1IpICE9IDApICYmIChlYWNoU3RyaW5nLmNvbXBhcmVUbyhMRikgIT0gMCkpIHsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoZWFjaFN0cmluZyk7Ci0JCQkJCQlidWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGggKyBlYWNoU3RyaW5nLmxlbmd0aCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJb3V0cHV0LmFkZChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0KLQkJZWxzZQotCQkJb3V0cHV0LmFkZCh0ZXh0KTsKLQotCQlyZXR1cm4gb3V0cHV0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoSVN0cnVjdHVyZWREb2N1bWVudCBkb2MsIGludCBub2RlT2Zmc2V0KSB7Ci0JCWludCBsaW5lID0gZG9jLmdldExpbmVPZk9mZnNldChub2RlT2Zmc2V0KTsKLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBkb2MuZ2V0TGluZURlbGltaXRlcigpOwotCQl0cnkgewotCQkJaWYgKGxpbmUgPiAwKSB7Ci0JCQkJbGluZURlbGltaXRlciA9IGRvYy5nZXRMaW5lRGVsaW1pdGVyKGxpbmUgLSAxKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQkvLyBCVUcxMTU3MTY6IGlmIGNhbm5vdCBnZXQgbGluZSBkZWxpbWl0ZXIgZnJvbSBjdXJyZW50IGxpbmUsIGp1c3QKLQkJLy8gdXNlIGRlZmF1bHQgbGluZSBkZWxpbWl0ZXIKLQkJaWYgKGxpbmVEZWxpbWl0ZXIgPT0gbnVsbCkKLQkJCWxpbmVEZWxpbWl0ZXIgPSBkb2MuZ2V0TGluZURlbGltaXRlcigpOwotCQlyZXR1cm4gbGluZURlbGltaXRlcjsKLQl9Ci0KLQlwcml2YXRlIGludCBjb21wdXRlQXZhaWxhYmxlTGluZVdpZHRoKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jLCBpbnQgbm9kZU9mZnNldCwgaW50IGxpbmVXaWR0aCkgewotCQkvLyBjb21wdXRlIGN1cnJlbnQgYXZhaWxhYmxlIGxpbmUgd2lkdGgKLQkJaW50IGN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggPSAwOwotCQl0cnkgewotCQkJaW50IGxpbmVPZmZzZXQgPSBkb2MuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQobm9kZU9mZnNldCkuZ2V0T2Zmc2V0KCk7Ci0JCQlTdHJpbmcgdGV4dCA9IGRvYy5nZXQobGluZU9mZnNldCwgbm9kZU9mZnNldCAtIGxpbmVPZmZzZXQpOwotCQkJaW50IHVzZWRXaWR0aCA9IGdldEluZGVudGF0aW9uTGVuZ3RoKHRleHQpOwotCQkJY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCA9IGxpbmVXaWR0aCAtIHVzZWRXaWR0aDsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JWE1MUGFydGl0aW9ucy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lYTUxQYXJ0aXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMzY3NTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lYTUxQYXJ0aXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4KLSAqIEl0IGRlZmluZXMgdGhlIHBhcnRpdGlvbiB0eXBlcyBmb3IgWE1MLgotICogQ2xpZW50cyBzaG91bGQgcmVmZXJlbmNlIHRoZSBwYXJ0aXRpb24gdHlwZSBTdHJpbmdzIGRlZmluZWQgaGVyZSBkaXJlY3RseS4KLSAqIAotICogQGRlcHJlY2F0ZWQgdXNlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVhNTFBhcnRpdGlvbnMgewotCQotCVN0cmluZyBYTUxfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUZBVUxUIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUxfQ0RBVEEgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfQ0RBVEEiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9QSSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9QSSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWE1MX0RFQ0xBUkFUSU9OID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFQ0wiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9DT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0NPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoKLQkgKiBUaGlzIHZhbHVlIGlzIHVzZWQgYXMgYSBwcmVmaXggdG8gYW55IHVua25vd24gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMKLQkgKiB3ZSBmaW5kLiBUaGUgcHJvY2Vzc29yIHRhcmdldCBuYW1lIGlzIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UgYW5kCi0JICogYXBwZW5kZWQgdG8gdGhlIHByZWZpeCB0byBjcmVhdGUgYSB1bmlxdWUgcGFydGl0aW9uIHR5cGUuCi0JICovCi0JU3RyaW5nIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fUFJFRklYID0gIm9yZy5lY2xpcHNlLndzdC54bWwuUFJPQ0VTU0lOR19JTlNUUlVDVElPTjoiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTaG91bGQgbWF0Y2gKLQkgKiBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZHRkLnBhcnRpdGlvbmluZy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yRFRELlNUX0RURF9TVUJTRVQKLQkgKi8KLQlTdHJpbmcgRFREX1NVQlNFVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmR0ZC5pbnRlcm5hbF9zdWJzZXQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3JlZ2lvbnMvRE9NUmVnaW9uQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9yZWdpb25zL0RPTVJlZ2lvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE3M2Q4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3JlZ2lvbnMvRE9NUmVnaW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zOwotCi1wdWJsaWMgaW50ZXJmYWNlIERPTVJlZ2lvbkNvbnRleHQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxPQ0tfVEVYVCA9ICJCTE9DS19URVhUIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ERUZJTkVEID0gIlVOREVGSU5FRCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdISVRFX1NQQUNFID0gIldISVRFX1NQQUNFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9BVFRMSVNUX0RFQ0xfQ0xPU0UgPSAiWE1MX0FUVExJU1RfREVDTF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQVRUTElTVF9ERUNMX0NPTlRFTlQgPSAiWE1MX0FUVExJU1RfREVDTF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9BVFRMSVNUX0RFQ0xfTkFNRSA9ICJYTUxfQVRUTElTVF9ERUNMX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQVRUTElTVF9ERUNMQVJBVElPTiA9ICJYTUxfQVRUTElTVF9ERUNMQVJBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ0RBVEFfQ0xPU0UgPSAiWE1MX0NEQVRBX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DREFUQV9PUEVOID0gIlhNTF9DREFUQV9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DREFUQV9URVhUID0gIlhNTF9DREFUQV9URVhUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DSEFSX1JFRkVSRU5DRSA9ICJYTUxfQ0hBUl9SRUZFUkVOQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NPTU1FTlRfQ0xPU0UgPSAiWE1MX0NPTU1FTlRfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ09NTUVOVF9PUEVOID0gIlhNTF9DT01NRU5UX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NPTU1FTlRfVEVYVCA9ICJYTUxfQ09NTUVOVF9URVhUIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NPTlRFTlQgPSAiWE1MX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RFQ0xBUkFUSU9OX0NMT1NFID0gIlhNTF9ERUNMQVJBVElPTl9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ERUNMQVJBVElPTl9PUEVOID0gIlhNTF9ERUNMQVJBVElPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04gPSAiWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1RZUEVfREVDTEFSQVRJT05fQ0xPU0UgPSAiWE1MX0RPQ1RZUEVfREVDTEFSQVRJT05fQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDID0gIlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQkxJQyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYgPSAiWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRiA9ICJYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNID0gIlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1RFTSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQgPSAiWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ET0NUWVBFX05BTUUgPSAiWE1MX0RPQ1RZUEVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9ERUNMX0NMT1NFID0gIlhNTF9FTEVNRU5UX0RFQ0xfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfREVDTF9DT05URU5UID0gIlhNTF9FTEVNRU5UX0RFQ0xfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9ERUNMX05BTUUgPSAiWE1MX0VMRU1FTlRfREVDTF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfREVDTEFSQVRJT04gPSAiWE1MX0VMRU1FTlRfREVDTEFSQVRJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VNUFRZX1RBR19DTE9TRSA9ICJYTUxfRU1QVFlfVEFHX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTkRfVEFHX09QRU4gPSAiWE1MX0VORF9UQUdfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRU5USVRZX1JFRkVSRU5DRSA9ICJYTUxfRU5USVRZX1JFRkVSRU5DRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QRV9SRUZFUkVOQ0UgPSAiWE1MX1BFX1JFRkVSRU5DRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfUElfQ0xPU0UgPSAiWE1MX1BJX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QSV9DT05URU5UID0gIlhNTF9QSV9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QSV9PUEVOID0gIlhNTF9QSV9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUyA9ICJYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RBR19BVFRSSUJVVEVfTkFNRSA9ICJYTUxfVEFHX0FUVFJJQlVURV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFID0gIlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UQUdfQ0xPU0UgPSAiWE1MX1RBR19DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVEFHX05BTUUgPSAiWE1MX1RBR19OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RBR19PUEVOID0gIlhNTF9UQUdfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc3NlbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YWQyYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLQotcHVibGljIGludGVyZmFjZSBNb2RlbFF1ZXJ5QWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQlwdWJsaWMgQ01Eb2N1bWVudENhY2hlIGdldENNRG9jdW1lbnRDYWNoZSgpOwotCi0JcHVibGljIFVSSVJlc29sdmVyIGdldElkUmVzb2x2ZXIoKTsKLQotCXB1YmxpYyBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoKTsKLQotCXZvaWQgcmVsZWFzZSgpOwotCi0Jdm9pZCBzZXRJZFJlc29sdmVyKFVSSVJlc29sdmVyIG5ld0lkUmVzb2x2ZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjhlNjcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc3NlbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci0KLQotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlBZGFwdGVySW1wbCBpbXBsZW1lbnRzIE1vZGVsUXVlcnlBZGFwdGVyIHsKLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZTsKLQlwcm90ZWN0ZWQgVVJJUmVzb2x2ZXIgaWRSZXNvbHZlcjsKLQotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnk7Ci0KLQlwdWJsaWMgTW9kZWxRdWVyeUFkYXB0ZXJJbXBsKENNRG9jdW1lbnRDYWNoZSBjbURvY3VtZW50Q2FjaGUsIE1vZGVsUXVlcnkgbW9kZWxRdWVyeSwgVVJJUmVzb2x2ZXIgaWRSZXNvbHZlcikgewotCQl0aGlzLmNtRG9jdW1lbnRDYWNoZSA9IGNtRG9jdW1lbnRDYWNoZTsKLQkJdGhpcy5tb2RlbFF1ZXJ5ID0gbW9kZWxRdWVyeTsKLQkJdGhpcy5pZFJlc29sdmVyID0gaWRSZXNvbHZlcjsKLQl9Ci0KLQlwdWJsaWMgQ01Eb2N1bWVudENhY2hlIGdldENNRG9jdW1lbnRDYWNoZSgpIHsKLQkJcmV0dXJuIGNtRG9jdW1lbnRDYWNoZTsKLQl9Ci0KLQlwdWJsaWMgVVJJUmVzb2x2ZXIgZ2V0SWRSZXNvbHZlcigpIHsKLQkJcmV0dXJuIGlkUmVzb2x2ZXI7Ci0JfQotCi0JcHVibGljIE1vZGVsUXVlcnkgZ2V0TW9kZWxRdWVyeSgpIHsKLQkJcmV0dXJuIG1vZGVsUXVlcnk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlIGFsbG93cyBpdAotCSAqIHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlLmVxdWFscyhNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vZGVsUXVlcnlBZGFwdGVyI3JlbGVhc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBNb2RlbFF1ZXJ5QWRhcHRlciNzZXRJZFJlc29sdmVyKFVSSVJlc29sdmVyKQotCSAqLwotCi0JcHVibGljIHZvaWQgc2V0SWRSZXNvbHZlcihVUklSZXNvbHZlciBuZXdJZFJlc29sdmVyKSB7Ci0JCWlkUmVzb2x2ZXIgPSBuZXdJZFJlc29sdmVyOwotCQlpZiAobW9kZWxRdWVyeSBpbnN0YW5jZW9mIE1vdmFibGVNb2RlbFF1ZXJ5KQotCQkJKChNb3ZhYmxlTW9kZWxRdWVyeSkgbW9kZWxRdWVyeSkuc2V0SWRSZXNvbHZlcihuZXdJZFJlc29sdmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NzZW1vZGVscXVlcnkvTW92YWJsZU1vZGVsUXVlcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc3NlbW9kZWxxdWVyeS9Nb3ZhYmxlTW9kZWxRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWQ3MzM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc3NlbW9kZWxxdWVyeS9Nb3ZhYmxlTW9kZWxRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgTW92YWJsZU1vZGVsUXVlcnkgZXh0ZW5kcyBNb2RlbFF1ZXJ5IHsKLQotCXZvaWQgc2V0SWRSZXNvbHZlcihVUklSZXNvbHZlciBuZXdVUklSZXNvbHZlcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Rhc2tzL1hNTEZpbGVUYXNrU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC90YXNrcy9YTUxGaWxlVGFza1NjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRiODE1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Rhc2tzL1hNTEZpbGVUYXNrU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLlN0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIFhNTEZpbGVUYXNrU2Nhbm5lciBleHRlbmRzIFN0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXIgewotCXB1YmxpYyBYTUxGaWxlVGFza1NjYW5uZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21tZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uKSB7Ci0JCXJldHVybiB0ZXh0UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3RleHQvWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3RleHQvWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNmJmMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC90ZXh0L1hNTFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZXh0ZW5kcyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gewotCi0JcHVibGljIFhNTFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBzdXBlci5nZXRUeXBlKCk7Ci0JCS8vIG5vcm1hbGx5LCB3ZSB3YW50IHRoZSBzZWNvbmQgcmVnaW9uIGFzIHRoZSBmbGF0bm9kZSB0eXBlIC4uLiBzaW5jZQotCQkvLyB0aGUKLQkJLy8gZmlyc3Qgb25lIGlzIHVzdWFsbHkganVzdCAib3BlbiB0YWciLgotCQlpZiAoKHJlc3VsdCAhPSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOKSAmJiAoZ2V0UmVnaW9ucygpLnNpemUoKSA+IDEpKSB7Ci0JCQlyZXN1bHQgPSBnZXRSZWdpb25zKCkuZ2V0KDEpLmdldFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjczODY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Gb3JlaWduUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBjb25maWd1cmVkQ29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tde0lYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxULCBJWE1MUGFydGl0aW9ucy5YTUxfQ0RBVEEsIElYTUxQYXJ0aXRpb25zLlhNTF9QSSwgSVhNTFBhcnRpdGlvbnMuWE1MX0RFQ0xBUkFUSU9OLCBJWE1MUGFydGl0aW9ucy5YTUxfQ09NTUVOVCwgSVhNTFBhcnRpdGlvbnMuRFREX1NVQlNFVH07Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbFBhcnRpdGlvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdHlwZSkgewotCQlzdXBlci5zZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIGxlbmd0aCwgdHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdExlZ2FsQ29udGVudFR5cGVzKCkgewotCQlmU3VwcG9ydGVkVHlwZXMgPSBjb25maWd1cmVkQ29udGVudFR5cGVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJVGV4dFJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCkKLQkJCXJlc3VsdCA9IElYTUxQYXJ0aXRpb25zLlhNTF9DT01NRU5UOwotCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQpCi0JCQlyZXN1bHQgPSBJWE1MUGFydGl0aW9ucy5YTUxfQ0RBVEE7Ci0JCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ09OVEVOVCkgewotCQkJLyoqCi0JCQkgKiBHcmFtbWF0aWNhbGx5LCBpdCdzIGltcG9zc2libGUgdG8gZ2V0IGEgUElfQ09OVEVOVCByZWdpb24KLQkJCSAqIHdpdGhvdXQgYSBwcmVjZWRpbmcgWE1MX1RBR19OQU1FIHJlZ2lvbi4gUmVseWluZyBvbiB0aGlzLAotCQkJICogZXh0cmFjdCB0aGUgdGFyZ2V0IHByb2Nlc3NvciBuYW1lIGFuZCBjcmVhdGUgYSBwYXJ0aXRpb24gdHlwZQotCQkJICogZHluYW1pY2FsbHkuCi0JCQkgKi8KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jUmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJSVRleHRSZWdpb24gbmFtZSA9IGRvY1JlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2NSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSArIHJlZ2lvbi5nZXRTdGFydCgpIC0gMSk7Ci0JCQlyZXN1bHQgPSBJWE1MUGFydGl0aW9ucy5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX1BSRUZJWCArIGRvY1JlZ2lvbi5nZXRUZXh0KG5hbWUpLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pCi0JCQlyZXN1bHQgPSBJWE1MUGFydGl0aW9ucy5YTUxfUEk7Ci0JCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTikKLQkJCXJlc3VsdCA9IElYTUxQYXJ0aXRpb25zLlhNTF9ERUNMQVJBVElPTjsKLQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVCkKLQkJCXJlc3VsdCA9IElYTUxQYXJ0aXRpb25zLkRURF9TVUJTRVQ7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IHN1cGVyLmdldFBhcnRpdGlvblR5cGUocmVnaW9uLCBvZmZzZXQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShGb3JlaWduUmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQkvLyB0ZW1wIGFkZGVkIGp1c3QgdG8gZGlzLWFtYmlndWF0ZSBjYWxsIGZyb20gc3ViY2xhc3MKLQkJcmV0dXJuIHN1cGVyLmdldFBhcnRpdGlvblR5cGUocmVnaW9uLCBvZmZzZXQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZUJldHdlZW4oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c05vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dE5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKHByZXZpb3VzTm9kZSwgbmV4dE5vZGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKSB7Ci0JCXJldHVybiBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVDsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwgaW5zdGFuY2UgPSBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcygpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25Gcm9tQmxvY2tlZFRleHQoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0LCBTdHJpbmcgcmVzdWx0KSB7Ci0JCS8vIHdhcyBtb3ZlZCB0byBzdWJjbGFzcyBmb3IgcXVpY2sgdHJhbnNpdGlvbgotCQlTdHJpbmcgbmV3UmVzdWx0ID0gcmVzdWx0OwotCQkvLyBuc2RfVE9ETzogRGF2aWQgYW5kIEkgbmVlZCB0byBkaXNjdXNzLCBkZXNpZ24sIGFuZCBpbXBsZW1lbnQgdGhpcwotCQkvLyBmb3IgYWxsIGJsb2NrIHRhZ3MgYW5kIGNvbW1lbnRzCi0JCS8vIGFuZCBtYWtlIHN1cmUgaXMgcGFydCBvZiAiZXh0ZW5zaWJsZSIgZGVzaWduIG9mIGJsb2NrIHRhZ3MKLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQkvLyBmb3IgY29kZSBzYWZldHksIHdlJ2xsIGFsd2F5cyBjaGVjayBpbnN0YW5jZW9mLCBidXQgSSB0aGluawotCQkJLy8gYWx3YXlzIHRydWUuCi0JCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgRm9yZWlnblJlZ2lvbikgewotCQkJCS8vIHN1cGVyIGlzIHVzZWQgYmVsb3cgc28gd29uJ3QgYmUgYW1iaWd1b3VzCi0JCQkJbmV3UmVzdWx0ID0gZ2V0UGFydGl0aW9uVHlwZSgoRm9yZWlnblJlZ2lvbikgcmVnaW9uLCBvZmZzZXQpOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uIGluc3RhbmNlb2YgRm9yZWlnblJlZ2lvbikgewotCQkJCW5ld1Jlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUoKEZvcmVpZ25SZWdpb24pIHJlZ2lvbiwgb2Zmc2V0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5ld1Jlc3VsdCA9IGdldFVua25vd24oKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3UmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGRvUGFyc2VyU3BlY2lmaWNDaGVjayhpbnQgb2Zmc2V0LCBib29sZWFuIHBhcnRpdGlvbkZvdW5kLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBuZXh0LCBJVGV4dFJlZ2lvbiBwcmV2aW91c1N0YXJ0KSB7Ci0JCS8vIHRoaXMgd2FzIG1vdmVkIGRvd24gdG8gc3ViY2xhc3Mgb2YgU3RydWN0dXJlZFRleHRQYXJ0aW9uZXIKLQkJLy8gZm9yIHF1aWNrIGZpeCB0byB0cmFuc2l0aW9uIHByb2JsZW1zLiBIZWlyYXJjaHkgbmVlZHMgbG90cyBvZgotCQkvLyBjbGVhbnVwLgotCQlpZiAocHJldmlvdXNTdGFydCAhPSBudWxsICYmIHByZXZpb3VzU3RhcnQuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOICYmIG5leHQuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJSVRleHRSZWdpb24gcHJldmlvdXNOYW1lID0gcHJldmlvdXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocHJldmlvdXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KHByZXZpb3VzU3RhcnQpKTsKLQkJCUlUZXh0UmVnaW9uIG5leHROYW1lID0gc2RSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc2RSZWdpb24uZ2V0RW5kT2Zmc2V0KG5leHQpKTsKLQkJCWlmIChwcmV2aW91c05hbWUgIT0gbnVsbCAmJiBuZXh0TmFtZSAhPSBudWxsICYmIHByZXZpb3VzTmFtZS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgJiYgbmV4dE5hbWUuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJc2V0SW50ZXJuYWxQYXJ0aXRpb24ob2Zmc2V0LCAwLCBnZXRQYXJ0aXRpb25UeXBlQmV0d2VlbihwcmV2aW91c1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgc2RSZWdpb24pKTsKLQkJCQlwYXJ0aXRpb25Gb3VuZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcnRpdGlvbkZvdW5kOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9BYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZGRkYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9BYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdGlvbkNvbXBvbmVudCB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvci4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVmFsaWRhdGlvbkNvbXBvbmVudCBnZXRQcm9wYWdhdGVlKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVmFsaWRhdGlvbkFkYXB0ZXIgZ2V0VmFsaWRhdG9yKCk7Ci0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKEluZGV4ZWRSZWdpb24gbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXRWYWxpZGF0b3IoKS52YWxpZGF0ZShub2RlKTsKLQotCQlwcm9wYWdhdGVUb0NoaWxkRWxlbWVudHMoZ2V0UHJvcGFnYXRlZSgpLCAoTm9kZSkgbm9kZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb3BhZ2F0ZVRvQ2hpbGRFbGVtZW50cyhWYWxpZGF0aW9uQ29tcG9uZW50IHZhbGlkYXRvciwgTm9kZSBwYXJlbnQpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDbGFzcyBjbGF6eiA9IHZhbGlkYXRvci5nZXRDbGFzcygpOwotCi0JCU5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGNoaWxkOwotCQkJCVZhbGlkYXRpb25BZGFwdGVyIHZhID0gKFZhbGlkYXRpb25BZGFwdGVyKSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoY2xhenopOwotCQkJCWlmICh2YSA9PSBudWxsKSB7Ci0JCQkJCW5vdGlmaWVyLmFkZEFkYXB0ZXIodmFsaWRhdG9yKTsKLQkJCQkJdmEgPSB2YWxpZGF0b3I7Ci0JCQkJfQotCQkJCS8vIGJ1ZyAxNDMyMTMgLSBDYW4ndCBiYXRjaCB2YWxpZGF0ZSBvcGVuIEhUTUwgZmlsZXMgd2hlbgotCQkJCS8vIGFzLXlvdS10eXBlIHZhbGlkYXRpb24gaXMgZW5hYmxlZAotCQkJCXZhLnNldFJlcG9ydGVyKHZhbGlkYXRvci5nZXRSZXBvcnRlcigpKTsKLQkJCQl2YS52YWxpZGF0ZSgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpOwotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1Byb3BhZ2F0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvUHJvcGFnYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2U2NTY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvUHJvcGFnYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBzaW5jZSAyLjAgTTUgLSBpZiBwcm9wb2dhdGVUb0NoaWxkRWxlbWVudCBpcyBuZWVkZWQsIGp1c3QgY29weQotICogICAgICAgICAgICAgbWV0aG9kIHRvIHlvdXIgb3duIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wYWdhdG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcm9wYWdhdGVUb0NoaWxkRWxlbWVudHMoVmFsaWRhdGlvbkNvbXBvbmVudCB2YWxpZGF0b3IsIE5vZGUgcGFyZW50KSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ2xhc3MgY2xhenogPSB2YWxpZGF0b3IuZ2V0Q2xhc3MoKTsKLQotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGQgPT0gbnVsbCB8fCBjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCWNvbnRpbnVlOwotCi0JCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGNoaWxkOwotCQkJVmFsaWRhdGlvbkFkYXB0ZXIgdmEgPSAoVmFsaWRhdGlvbkFkYXB0ZXIpIG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihjbGF6eik7Ci0JCQlpZiAodmEgPT0gbnVsbCkgewotCQkJCW5vdGlmaWVyLmFkZEFkYXB0ZXIodmFsaWRhdG9yKTsKLQkJCQl2YSA9IHZhbGlkYXRvcjsKLQkJCX0KLQkJCXZhLnZhbGlkYXRlKChJbmRleGVkUmVnaW9uKSBjaGlsZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm9wYWdhdG9yIGlzIGp1c3QgYSBwbGFjZWhvbGRlciBvZiB1dGlsaXRpZXMuIERvbid0IGluc3RhbnRpYXRlLgotCSAqLwotCXByaXZhdGUgUHJvcGFnYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1ZhbGlkYXRpb25Db21wb25lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbkNvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmQ5MjFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbkNvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0ZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYWxpZGF0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgVmFsaWRhdGlvbkFkYXB0ZXIgewotCi0JcHJvdGVjdGVkIFZhbGlkYXRpb25SZXBvcnRlciByZXBvcnRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBWYWxpZGF0aW9uQ29tcG9uZW50IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25Db21wb25lbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlIGFsbG93cyBpdAotCSAqIHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBWYWxpZGF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkvLyBUaGlzIG1ldGhvZCB3aWxsIGJlIGltcGxlbWVudGVkIGluIHRoZSBWMi4KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXBvcnRlcihWYWxpZGF0aW9uUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJdGhpcy5yZXBvcnRlciA9IHJlcG9ydGVyOwotCX0KLQotCVZhbGlkYXRpb25SZXBvcnRlciBnZXRSZXBvcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMucmVwb3J0ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS90ZXh0L0lYTUxQYXJ0aXRpb25zLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL3RleHQvSVhNTFBhcnRpdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkYTc4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL3RleHQvSVhNTFBhcnRpdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dDsKLQotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgotICogSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uIHR5cGVzIGZvciBYTUwuCi0gKiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVhNTFBhcnRpdGlvbnMgewotCQotCVN0cmluZyBYTUxfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUZBVUxUIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUxfQ0RBVEEgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfQ0RBVEEiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9QSSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9QSSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWE1MX0RFQ0xBUkFUSU9OID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFQ0wiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9DT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0NPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoKLQkgKiBUaGlzIHZhbHVlIGlzIHVzZWQgYXMgYSBwcmVmaXggdG8gYW55IHVua25vd24gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMKLQkgKiB3ZSBmaW5kLiBUaGUgcHJvY2Vzc29yIHRhcmdldCBuYW1lIGlzIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UgYW5kCi0JICogYXBwZW5kZWQgdG8gdGhlIHByZWZpeCB0byBjcmVhdGUgYSB1bmlxdWUgcGFydGl0aW9uIHR5cGUuCi0JICovCi0JU3RyaW5nIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fUFJFRklYID0gIm9yZy5lY2xpcHNlLndzdC54bWwuUFJPQ0VTU0lOR19JTlNUUlVDVElPTjoiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTaG91bGQgbWF0Y2gKLQkgKiBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZHRkLnBhcnRpdGlvbmluZy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yRFRELlNUX0RURF9TVUJTRVQKLQkgKi8KLQlTdHJpbmcgRFREX1NVQlNFVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmR0ZC5pbnRlcm5hbF9zdWJzZXQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDAzYzIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIiAvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy12YWxpZGF0aW9uIiAvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1tdWx0aXBhZ2UiIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLXdpemFyZHMiIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWNhdGFsb2ciIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIKLQkJcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIgotCQlwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvVmFsaWRhdGlvbkV4Y2VwdGlvbiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Mb2NhbGl6ZWRNZXNzYWdlLyIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JTWVzc2FnZSIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvY29yZS9NZXNzYWdlIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9wcm92aXNpb25hbC9jb3JlL0lSZXBvcnRlciIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdGlvbkNvbnRleHQiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVZhbGlkYXRvciIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZCIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdFNpbmdsZUZpbGVEaWFsb2ciIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2NvcmUvSU1lc3NhZ2VBY2Nlc3MiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dCIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29yZS9JVmFsaWRhdG9ySm9iIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VsZWN0U2luZ2xlRmlsZVZpZXciIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL0RyYWdBbmREcm9wQ29tbWFuZCIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvRHJhZ0FuZERyb3BNYW5hZ2VyIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL2RuZC9PYmplY3RUcmFuc2ZlciIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS9pbnRlcm5hbC9kbmQvVmlld2VyRHJhZ0FkYXB0ZXIiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vdWkvaW50ZXJuYWwvZG5kL1ZpZXdlckRyb3BBZGFwdGVyIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db25maWd1cmF0aW9uTWFuYWdlciIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUHJvamVjdENvbmZpZ3VyYXRpb24iIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25SZWdpc3RyeVJlYWRlciIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yTWV0YURhdGEiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL1ZhbGlkYXRpb25GYWN0b3J5IiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uL3VpL2ludGVybmFsL3ZpZXdlcnMvKiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24iIC8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iIC8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMWMyODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLXhtbGVkaXRvci5qYXIKLW9yZy5lY2xpcHNlLndzdC54bWwudWlfMS4wLjAuamFyCi1vcmcuZWNsaXBzZS53c3QueG1sLnVpXzEuMC4wLnppcAoteG1sZWRpdG9yc3JjLnppcAotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWNhZThmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC54bWwudWkvcHJvamVjdGlvbnBlcmY9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBkYzRhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueG1sLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+PC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MTJkYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSNTYXQgTWFyIDI0IDAyOjU5OjQ5IEVEVCAyMDA3DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVjZTdiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSNXZWQgTm92IDIyIDIzOjIzOjAxIEVTVCAyMDA2Ci1jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKLWNsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz1mYWxzZQotY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLWNsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLWNsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCi1jbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1jbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKLWNsZWFudXAuZm9ybWF0X2NvbW1lbnQ9dHJ1ZQotY2xlYW51cC5mb3JtYXRfamF2YWRvYz10cnVlCi1jbGVhbnVwLmZvcm1hdF9tdWx0aV9saW5lX2NvbW1lbnQ9dHJ1ZQotY2xlYW51cC5mb3JtYXRfc2luZ2xlX2xpbmVfY29tbWVudD10cnVlCi1jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9dHJ1ZQotY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKLWNsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCi1jbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPWZhbHNlCi1jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLWNsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKLWNsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9dHJ1ZQotY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1jbGVhbnVwLnVzZV9ibG9ja3M9dHJ1ZQotY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLWNsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLWNsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLWNsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1jbGVhbnVwX3Byb2ZpbGU9X1NTRSBUZWFtIFN0eWxlcwotY2xlYW51cF9zZXR0aW5nc192ZXJzaW9uPTIKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNGE4YmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jV2VkIEp1biAwNCAyMDowNzo0NyBFRFQgMjAwOAotY29tcGlsZXJzLmYudW5yZXNvbHZlZC1mZWF0dXJlcz0xCi1jb21waWxlcnMuZi51bnJlc29sdmVkLXBsdWdpbnM9MQotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmRpc2NvdXJhZ2VkLWNsYXNzPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLmludGVybmFsPTEKLWNvbXBpbGVycy5wLm1pc3NpbmctcGFja2FnZXM9MQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24taWRlbnRpZmllcj0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucy5jcmVhdGUtZG9jcz1mYWxzZQotY29tcGlsZXJzLnMuZG9jLWZvbGRlcj1kb2MKLWNvbXBpbGVycy5zLm9wZW4tdGFncz0xCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VhMDRlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhtbC51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjQwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC54bWwudWksCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYXV0b2VkaXQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2cuaWNvbnMuZXRvb2w1MDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZy5pY29ucy5vYmoxNjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZy5pY29ucy5vdnIxNjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRuZDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZG91YmxlY2xpY2s7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluazt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvcGVydGllczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnJlZ2lzdHJ5O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWFyY2g7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFnaW5mbzt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZXh0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuZXJyb3JpbmZvO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS52aWV3cy5jb250ZW50b3V0bGluZSwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLnByb3BlcnRpZXMKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMSwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMSwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuOC4xLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucztidW5kbGUtdmVyc2lvbj0iWzMuMy4wLDQuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5OyBleGNsdWRlOj0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuZXJyb3JpbmZvIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWUxNWViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHRlbXBsYXRlcy8sXAotICAgICAgICAgICAgICAgZXhhbXBsZXMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICBzcmMtbXVsdGlwYWdlLyxcCi0gICAgICAgICAgIHNyYy13aXphcmRzLyxcCi0gICAgICAgICAgIHNyYy1jYXRhbG9nLyxcCi0gICAgICAgICAgIHNyYy12YWxpZGF0aW9uCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvZXhhbXBsZXMvRWRpdGluZ0FuZFZhbGlkYXRpbmdYTUwuemlwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2V4YW1wbGVzL0VkaXRpbmdBbmRWYWxpZGF0aW5nWE1MLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI1Nzc2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvZXhhbXBsZXMvRWRpdGluZ0FuZFZhbGlkYXRpbmdYTUwuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL1hNTEZpbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL1hNTEZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGViMWJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9YTUxGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvY29sbGFwc2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb2xsYXBzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzQ3MjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb2xsYXBzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbGxhcHNlX2FsbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbGxhcHNlX2FsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYzBkZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb2xsYXBzZV9hbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb25zdHJhaW5vZmYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb25zdHJhaW5vZmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmRjZWI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvY29uc3RyYWlub2ZmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvY29uc3RyYWlub24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb25zdHJhaW5vbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MjNkNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb25zdHJhaW5vbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2V4cGFuZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2V4cGFuZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMzdiN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9leHBhbmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9leHBhbmRfYWxsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvZXhwYW5kX2FsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MmMxNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9leHBhbmRfYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X3htbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld194bWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWNmZGY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X3htbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3JsZGdybXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9ybGRncm1yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkzMjVkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3JsZGdybXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi92YWxpZGF0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3ZhbGlkYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYxZDE0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3ZhbGlkYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvY29sbGFwc2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jb2xsYXBzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NWJjMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jb2xsYXBzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbGxhcHNlX2FsbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbGxhcHNlX2FsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZDgwYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jb2xsYXBzZV9hbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jb25zdHJhaW5vZmYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jb25zdHJhaW5vZmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWFiMDRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvY29uc3RyYWlub2ZmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvY29uc3RyYWlub24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jb25zdHJhaW5vbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MmY5YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jb25zdHJhaW5vbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2V4cGFuZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2V4cGFuZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZjQ1MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9leHBhbmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9leHBhbmRfYWxsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvZXhwYW5kX2FsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMDViMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9leHBhbmRfYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3X3htbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld194bWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGZiNjJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3X3htbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3JsZGdybXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9ybGRncm1yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5Y2FjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3JsZGdybXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi92YWxpZGF0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3ZhbGlkYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzNDdhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3ZhbGlkYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L1hTREZpbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvWFNERmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMGVlYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvWFNERmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9hZGRfY29ycmVjdGlvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9hZGRfY29ycmVjdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MmQ3ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvYWRkX2NvcnJlY3Rpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXR0X3JlcV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXR0X3JlcV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGM2NmQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2F0dF9yZXFfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDQ5ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9jZGF0YXNlY3Rpb24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2RhdGFzZWN0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwODcyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9jZGF0YXNlY3Rpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2hvaWNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2Nob2ljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxM2JhMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2hvaWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2NvbW1lbnRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2NvbW1lbnRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhjMmNjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9jb21tZW50X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9jb3JyZWN0aW9uX2NoYW5nZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9jb3JyZWN0aW9uX2NoYW5nZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmODNjNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvY29ycmVjdGlvbl9jaGFuZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZG9jdHlwZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9kb2N0eXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwMGY4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9kb2N0eXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2R0ZGZpbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZHRkZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMGFjYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZHRkZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Njc4MTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2VudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZmQzZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2VudGl0eV9yZWZlcmVuY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5X3JlZmVyZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZjkxNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5X3JlZmVyZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lbnVtLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2VudW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzBhNDgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2VudW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZXJyb3Itb3ZlcmxheS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lcnJvci1vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5ZGNjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lcnJvci1vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2xvY2FsdmFyaWFibGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2xvY2FsdmFyaWFibGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI0NGIyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9sb2NhbHZhcmlhYmxlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9ub3RhdGlvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9ub3RhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YWQwODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvbm90YXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvb2NjdXJvbmVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L29jY3Vyb25lX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYjY1YzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvb2NjdXJvbmVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3Byb2luc3Rfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3Byb2luc3Rfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ0MzZkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm9pbnN0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZjUxNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLW1hY3JvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1tYWNyby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMWY4MWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLW1hY3JvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZ19nZW5lcmljX2RlZW1waGFzaXplZF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnX2dlbmVyaWNfZGVlbXBoYXNpemVkX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhY2I0MDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnX2dlbmVyaWNfZGVlbXBoYXNpemVkX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWdfZ2VuZXJpY19lbXBoYXNpemVkX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWdfZ2VuZXJpY19lbXBoYXNpemVkX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YzFkYjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnX2dlbmVyaWNfZW1waGFzaXplZF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGV4dC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90ZXh0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhN2EzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90ZXh0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3R4dGV4dC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90eHRleHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjI2ZTQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3R4dGV4dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi93YXJuaW5nX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi93YXJuaW5nX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNWY1ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2FybmluZ19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3ZyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL292cjE2L2Vycm9yX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOWRjY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL292cjE2L3N0YWxlX2Vycm9yX292ci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vdnIxNi9zdGFsZV9lcnJvcl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjA0NzFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL292cjE2L3N0YWxlX2Vycm9yX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vdnIxNi93YXJuX292ci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vdnIxNi93YXJuX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTA3MDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb3ZyMTYvd2Fybl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvdmlldzE2L2F0dGlidXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL3ZpZXcxNi9hdHRpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDQ5ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvdmlldzE2L2F0dGlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL3dpemJhbi9nZW5lcmF0ZXhtbF93aXoucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2dlbmVyYXRleG1sX3dpei5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxN2U0OGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2dlbmVyYXRleG1sX3dpei5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvbmV3U2FtcGxlUHJvamVjdF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL25ld1NhbXBsZVByb2plY3Rfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM5NmIxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvbmV3U2FtcGxlUHJvamVjdF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL25ld1NhbXBsZVByb2plY3Rfd2l6YmFubmVyLnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9uZXdTYW1wbGVQcm9qZWN0X3dpemJhbm5lci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNzE0NzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL25ld1NhbXBsZVByb2plY3Rfd2l6YmFubmVyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9zb3VyY2VFZGl0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL3NvdXJjZUVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZWJkYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL3NvdXJjZUVkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMveG1sZG9jLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy94bWxkb2MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGViMWJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy94bWxkb2MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTJhMzJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICBEYXZpZCBDYXJ2ZXIgLyBTVEFSIFN0YW5kYXJkcyAtIGFkZGVkIFhNTCBDYXRhbG9nIEltcG9ydC9FeHBvcnQgV2l6YXJkCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZyAxOTI1NjgKLSMgICAgIERhdmlkIENhcnZlciAvIFNUQVIgU3RhbmRhcmRzIC0gYnVnIDIxMjMzMCAtIG1pZ3JhdGUgdG8gb3JnLmVjbGlwc2UudWkubWVudXMgCQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVhNTCBVSSBQbHVnaW4KLVhNTC5uYW1lPVhNTAotWE1MX0ZpbGVzLm5hbWU9WE1MIEZpbGVzCi1YTUxfU291cmNlLm5hbWU9RWRpdG9yCi1YTUxfVGVtcGxhdGVzLm5hbWU9VGVtcGxhdGVzCi1YTUxfU3R5bGVzLm5hbWU9U3R5bGVzCi1YTUxfU3ludGF4X0NvbG9yaW5nPVN5bnRheCBDb2xvcmluZwotWE1MX1R5cGluZz1UeXBpbmcKLVhNTF9FZGl0b3IubmFtZT1YTUwgRWRpdG9yCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1fVUlfV0laQVJEX05FV19YTUw9WE1MCi1fVUlfV0laQVJEX1hNTF9DQVRFR09SWT1YTUwKLWdlbk1lbnVMYWJlbD0mR2VuZXJhdGUKLV9VSV9BQ1RJT05fQ1JFQVRFX1hNTD0mWE1MIEZpbGUuLi4KLV9VSV9DUkVBVEVfTkVXX1hNTF9GSUxFPUNyZWF0ZSBhIG5ldyBYTUwgZmlsZQotX1VJX1dJWkFSRF9JTVBPUlRfRVhQT1JUX1hNTENBVEFMT0c9WE1MIENhdGFsb2cKLV9VSV9JTVBPUlRfWE1MX0NBVEFMT0dfRklMRT1JbXBvcnQgYW4gZXhpc3RpbmcgWE1MIENhdGFsb2cuCi1fVUlfRVhQT1JUX1hNTF9DQVRBTE9HX0ZJTEU9RXhwb3J0IGFuIFhNTCBDYXRhbG9nLgotWE1MRXhhbXBsZS5uYW1lPUVkaXRpbmcgYW5kIHZhbGlkYXRpbmcgWE1MIGZpbGVzCi1YTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmRlc2NyaXB0aW9uPUNyZWF0ZSBhIHByb2plY3QgY29udGFpbmluZyBYTUwgc2FtcGxlIGZpbGVzCi1YTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLnByb2plY3RuYW1lPVhNTEV4YW1wbGVzCi1YTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLnBhZ2V0aXRsZT1YTUwgc2FtcGxlIGZpbGVzIGZvciBlZGl0aW5nIGFuZCB2YWxpZGF0aW5nCi1YTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLnBhZ2VkZXNjcmlwdGlvbj1DcmVhdGUgYSBwcm9qZWN0IGNvbnRhaW5pbmcgWE1MIHNhbXBsZSBmaWxlcy4KLVhNTEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQubGFiZWw9JlByb2plY3QgTmFtZToKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUFsbF9YTUxfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9QWxsIFhNTAotWE1MX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1OZXcgWE1MCi1YTUxfVGFnX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPVhNTCBUYWcKLVhNTF9BdHRyaWJ1dGVfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9WE1MIEF0dHJpYnV0ZQotWE1MX0F0dHJpYnV0ZV92YWx1ZV9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1YTUwgQXR0cmlidXRlIHZhbHVlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1BZGRUYXNrLmxhYmVsPUFkZCAmVGFzay4uLgotQWRkVGFzay50b29sdGlwPUFkZCBUYXNrLi4uCi1BZGRCb29rbWFyay5sYWJlbD1BZGQgQm9vJmttYXJrLi4uCi1BZGRCb29rbWFyay50b29sdGlwPUFkZCBCb29rbWFyay4uLgotU2VsZWN0UnVsZXIubGFiZWw9U2VsZWN0IFJ1bGVyCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1YTUxfQ2F0YWxvZ19GaWxlX1R5cGVfRXh0ZW5zaW9uX1BvaW50Lm5hbWU9WE1MIENhdGFsb2cgZmlsZSB0eXBlIGV4dGVuc2lvbiBwb2ludAotX1VJX1BSRUZfWE1MX0NBVEFMT0c9WE1MIENhdGFsb2cKLV9VSV9QUkVGX0RURF9GSUxFUz1EVEQgRmlsZXMKLV9VSV9QUkVGX1hTRF9GSUxFUz1YU0QgRmlsZXMKLV9VSV9QUkVGX1RBR0xJQl9ERUZfRklMRVM9VGFnbGliIERlZmluaXRpb24gRmlsZXMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLV9VSV9YTUxfVkFMSURBVE9SICAgICAgICAgICAgICAgICAgID0gWE1MIFZhbGlkYXRvcgotX1VJX1JFRl9GSUxFX1NIT1dfREVUQUlMUyAgICAgICAgICAgPSBTaG93IERldGFpbHMuLi4KLV9VSV9NRU5VX1ZBTElEQVRFX1hNTCAgICAgICAgICAgICAgID0gVmFsaWRhdGUgWE1MIEZpbGUKLSMjCi1DbGVhbnVwRG9jdW1lbnRfbGFiZWw9Q2xlYW51cCBEb2N1bWVudC4uLgotQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA9Q2xlYW51cCBEb2N1bWVudAotVG9nZ2xlQ29tbWVudF9sYWJlbD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF90b29sdGlwPVRvZ2dsZSBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfbGFiZWw9QWRkIEJsb2NrIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF90b29sdGlwPUFkZCBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwPVJlbW92ZSBCbG9jayBDb21tZW50Ci1GaW5kT2NjdXJyZW5jZXNfbGFiZWw9T2NjdXJyZW5jZXMgaW4gRmlsZQotIyMKLXByZWZlcmVuY2VLZXl3b3Jkcy5maWxlcz1lZGl0b3IgeG1sIGNyZWF0aW5nIHNhdmluZyBmaWxlcyBzdWZmaXggc3BlY2lmaWVkIGVuY29kaW5nIGlhbmEKLXByZWZlcmVuY2VLZXl3b3Jkcy5zb3VyY2U9ZWRpdG9yIHhtbCBzb3VyY2UgZm9ybWF0dGluZyBsaW5lIHdpZHRoIHNwbGl0IG11bHRpcGxlIGF0dHJpYnV0ZXMgbmV3IGNsZWFyIGJsYW5rIGluZGVudCB0YWJzIHNwYWNlcyBzaXplIGNvbnRlbnQgYXNzaXN0IGF1dG9tYXRpY2FsbHkgc3VnZ2VzdGlvbnMgcHJvbXB0IGNoYXJhY3RlcnMgaW5zZXJ0ZWQgc3RyYXRlZ3kgbGF4IHN0cmljdCBncmFtbWFyIGNvbnN0cmFpbnRzIGluZmVycmVkIGFic2VuY2UgZHRkIHNjaGVtYQotcHJlZmVyZW5jZUtleXdvcmRzLnRlbXBsYXRlcz1lZGl0b3IgeG1sIHRlbXBsYXRlcyBzbmlwcGV0IG1hY3JvcwotcHJlZmVyZW5jZUtleXdvcmRzLnN0eWxlcz1lZGl0b3IgeG1sIHN0eWxlIGN1c3RvbWl6ZSBzeW50YXggaGlnaGxpZ2h0aW5nIHR5cGUgdGV4dCBjb250ZW50IGZvcmVncm91bmQgYmFja2dyb3VuZCBib2xkIGNvbG9yCi1wcmVmZXJlbmNlS2V5d29yZHMueG1sY2F0YWxvZz14bWwgY2F0YWxvZyBlbnRyaWVzCi1wcmVmZXJlbmNlS2V5d29yZHMuc2V2ZXJpdGllcz14bWwgZ3JhbW1hciBlcnJvcnMgd2FybmluZ3MgaWdub3JlIG9wdGlvbnMgc2V2ZXJpdHkgc2V2ZXJpdGllcyBzdXBwcmVzcyBwcm9qZWN0IHNwZWNpZmljIHByb2plY3RzcGVjaWZpYwotCi0jIwotWE1MX1NvdXJjZV90YXJnZXRfbmFtZT1YTUwgU291cmNlCi1YTUxfaHlwZXJsaW5rPVRhZ3MgQW5kIEF0dHJpYnV0ZXMKLSMjCi1EZXNpZ25NZW51X25hbWU9JkRlc2lnbgotUmVsb2FkRGVwZW5kZW5jaWVzX25hbWU9UmVsb2FkIERlcGVuZGVuY2llcwotUmVsb2FkRGVwZW5kZW5jaWVzX2Rlc2NyaXB0aW9uPVJlbG9hZCBEZXBlbmRlbmNpZXMKLVJlbG9hZERlcGVuZGVuY2llc19tbmVtb25pYz1SCi1Db25zdHJhaW50c19uYW1lPVR1cm4gb2ZmIEdyYW1tYXIgQ29uc3RyYWludHMKLUNvbnN0cmFpbnRzX2Rlc2NyaXB0aW9uPVR1cm4gb2ZmIGdyYW1tYXIgQ29uc3RyYWludHMKLUNvbnN0cmFpbnRzX21uZW1vbmljPVQKLUV4cGFuZEFsbF9uYW1lPUV4cGFuZCBBbGwKLUNvbGxhcHNlQWxsX25hbWU9Q29sbGFwc2UgQWxsCi1BY3Rpb25EZWZpbml0aW9uLm5leHRTaWJsaW5nLm5hbWU9TmV4dCBTaWJsaW5nCi1BY3Rpb25EZWZpbml0aW9uLm5leHRTaWJsaW5nLmRlc2NyaXB0aW9uPUdvIHRvIE5leHQgU2libGluZwotQWN0aW9uRGVmaW5pdGlvbi5wcmV2aW91c1NpYmxpbmcubmFtZT1QcmV2aW91cyBTaWJsaW5nCi1BY3Rpb25EZWZpbml0aW9uLnByZXZpb3VzU2libGluZy5kZXNjcmlwdGlvbj1HbyB0byBQcmV2aW91cyBTaWJsaW5nCi1BY3Rpb25EZWZpbml0aW9uLmdvdG9NYXRjaGluZ1RhZy5uYW1lPU1hdGNoaW5nIFRhZwotQWN0aW9uRGVmaW5pdGlvbi5nb3RvTWF0Y2hpbmdUYWcuZGVzY3JpcHRpb249R28gdG8gTWF0Y2hpbmcgVGFnCi1NYXRjaGluZ1RhZ1ByZWZlcmVuY2UubGFiZWw9TWF0Y2hpbmcgVGFncwotCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5uYW1lPUVkaXRpbmcgWE1MIFNvdXJjZQotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuZGVzY3JpcHRpb249RWRpdGluZyBYTUwgU291cmNlCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5uYXZpZ2F0aW9uLm5hbWU9WE1MIFNvdXJjZSBOYXZpZ2F0aW9uCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5uYXZpZ2F0aW9uLmRlc2NyaXB0aW9uPVhNTCBTb3VyY2UgTmF2aWdhdGlvbgotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuY2xlYW51cC5uYW1lPVhNTCBTb3VyY2UgQ2xlYW51cAotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuY2xlYW51cC5kZXNjcmlwdGlvbj1YTUwgU291cmNlIENsZWFudXAKLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLmNvbW1lbnRzLm5hbWU9WE1MIFNvdXJjZSBDb21tZW50cwotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuY29tbWVudHMuZGVzY3JpcHRpb249WE1MIFNvdXJjZSBDb21tZW50cwotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuc2VsZWN0aW9uLm5hbWU9WE1MIFNvdXJjZSBTZWxlY3Rpb24KLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLnNlbGVjdGlvbi5kZXNjcmlwdGlvbj1YTUwgU291cmNlIFNlbGVjdGlvbgotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuZGVwZW5kZW5jaWVzLm5hbWU9WE1MIFNvdXJjZSBEZXBlbmRlbmNpZXMKLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLmRlcGVuZGVuY2llcy5kZXNjcmlwdGlvbj1YTUwgU291cmNlIERlcGVuZGVuY2llcwotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuZ3JhbW1hci5uYW1lPVhNTCBTb3VyY2UgR3JhbW1hcgotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuZ3JhbW1hci5kZXNjcmlwdGlvbj1YTUwgU291cmNlIEdyYW1tYXIKLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLmV4cGFuZC5uYW1lPVhNTCBTb3VyY2UgRXhwYW5kL0NvbGxhcHNlCi1zY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5leHBhbmQuZGVzY3JpcHRpb249WE1MIFNvdXJjZSBFeHBhbmQvQ29sbGFwc2UKLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLm9jY3VycmVuY2VzLm5hbWU9WE1MIFNvdXJjZSBPY2N1cnJlbmNlcwotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwub2NjdXJyZW5jZXMuZGVzY3JpcHRpb249WE1MIFNvdXJjZSBPY2N1cnJlbmNlcwotCi1Db2xvcnMudGFnQXR0cmlidXRlTmFtZT1UYWcgQXR0cmlidXRlIE5hbWUKLUNvbG9ycy50YWdBdHRyaWJ1dGVWYWx1ZT1UYWcgQXR0cmlidXRlIFZhbHVlCi1Db2xvcnMuY29tbWVudEJvcmRlcj1Db21tZW50IEJvcmRlcgotQ29sb3JzLmNvbW1lbnRUZXh0PUNvbW1lbnQgVGV4dAotQ29sb3JzLmRlY2xCb3JkZXI9RGVjbGFyYXRpb24gQm9yZGVyCi1Db2xvcnMuZG9jdHlwZU5hbWU9RG9jdHlwZSBOYW1lCi1Db2xvcnMuZG9jdHlwZUV4dGVybmFsUHVicmVmPURvY3R5cGUgRXh0ZXJuYWwgUHVibGljIFJlZmVyZW5jZQotQ29sb3JzLmRvY3R5cGVFeHRlcm5hbElkPURvY3R5cGUgRXh0ZXJuYWwgSWQKLUNvbG9ycy5kb2N0eXBlRXh0cmVuYWxTeXNyZWY9RG9jdHlwZSBFeHRlcm5hbCBTeXN0ZW0gUmVmZXJlbmNlCi1Db2xvcnMudGFnQm9yZGVyPVRhZyBCb3JkZXIKLUNvbG9ycy50YWdOYW1lPVRhZyBOYW1lCi1Db2xvcnMucGlCb3JkZXI9UHJvY2Vzc2luZyBJbnN0cnVjdGlvbiBCb3JkZXIKLUNvbG9ycy5jZGF0YUJvcmRlcj1DREFUQSBCb3JkZXIKLUNvbG9ycy5jZGF0YVRleHQ9Q0RBVEEgVGV4dAotQ29sb3JzLmVudGl0eVJlZmVyZW5jZT1FbnRpdHkgUmVmZXJlbmNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzA1M2EyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMyI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24tcG9pbnQgaWQ9ImNhdGFsb2dGaWxlVHlwZSIgbmFtZT0iJVhNTF9DYXRhbG9nX0ZpbGVfVHlwZV9FeHRlbnNpb25fUG9pbnQubmFtZSIgc2NoZW1hPSJzY2hlbWEvY2F0YWxvZ0ZpbGVUeXBlLmV4c2QiLz4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuY2F0YWxvZ0ZpbGVUeXBlIj4KLQkJPGZpbGVUeXBlCi0JCQlleHRlbnNpb25zPSJkdGQsIGVudCwgbW9kIgotCQkJZGVzY3JpcHRpb249IiVfVUlfUFJFRl9EVERfRklMRVMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnVpLmNhdGFsb2dGaWxlVHlwZS5kdGQiPgotCQk8L2ZpbGVUeXBlPgotCQk8ZmlsZVR5cGUKLQkJCWV4dGVuc2lvbnM9InhzZCIKLQkJCWRlc2NyaXB0aW9uPSIlX1VJX1BSRUZfWFNEX0ZJTEVTIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS51aS5jYXRhbG9nRmlsZVR5cGUueHNkIj4KLQkJPC9maWxlVHlwZT4KLQkJPGZpbGVUeXBlCi0JCQlleHRlbnNpb25zPSJ0bGQiCi0JCQlkZXNjcmlwdGlvbj0iJV9VSV9QUkVGX1RBR0xJQl9ERUZfRklMRVMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnVpLmNhdGFsb2dGaWxlVHlwZS50bGQiPgotCQk8L2ZpbGVUeXBlPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLVRoZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIGNvbnRlbnQgdHlwZSBpcyBvbmx5IGZvcgotCQloYW5kbGluZyBzb21lIHNwZWNpYWwgY2FzZXMgb2YgaWxsLWZvcm1lZCB4bWwgaW4gYSByZWFzb25hYmxlCi0JCW1hbm5lciwgYW5kIHNob3VsZCBub3QgYmUgZW11bGF0ZWQgYnkgY2xpZW50cy4gVGhlIHR3byBjb250ZW50Ci0JCXR5cGVzIGFyZSBvZnRlbiB1c2VkIGludGVyY2hhbmdlYWJseSBieSB0aGUgWE1MIGNvbXBvbmVudCwgYnV0Ci0JCXBsZWFzZSB1c2Ugb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCBpbnN0ZWFkLiAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXRvckNvbmZpZ3VyYXRpb24iPgotCQk8c291cmNlVmlld2VyQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotCQk8Y29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS52aWV3cy5jb250ZW50b3V0bGluZS5YTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwsIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiIC8+Ci0JCTxwcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MucHJvcGVydGllcy5YTUxQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIgLz4KLQkJPGRvY3VtZW50YXRpb25UZXh0SG92ZXIKLSAgICAgICAgCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhZ2luZm8uWE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yIgotICAgICAgICAJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUZBVUxUIj4KLSAgCQk8L2RvY3VtZW50YXRpb25UZXh0SG92ZXI+Ci0gIAkJPGRvdWJsZUNsaWNrU3RyYXRlZ3kKLSAgICAgICAgCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRvdWJsZWNsaWNrLlhNTERvdWJsZUNsaWNrU3RyYXRlZ3kiCi0gICAgICAgIAl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQiPgotICAJCTwvZG91YmxlQ2xpY2tTdHJhdGVneT4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0ic291cmNlZWRpdGluZ3RleHR0b29scyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLlhNTFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwsIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImNoYXJhY3RlcnBhaXJtYXRjaGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGV4dC5YTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJzdHJ1Y3R1cmVkdGV4dGZvbGRpbmdwcm92aWRlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb24uU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJYTUwiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwsIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQucXVpY2thc3Npc3QuSVF1aWNrQXNzaXN0UHJvY2Vzc29yIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5YTUxRdWlja0Fzc2lzdFByb2Nlc3NvciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0iYXV0b2VkaXRzdHJhdGVneSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmF1dG9lZGl0LlN0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5WE1MIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUZBVUxUIiAvPgotCQk8cHJvdmlzaW9uYWxEZWZpbml0aW9uCi0JCQl0eXBlPSJwcmVmZXJlbmNlcGFnZXMiCi0JCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcmVmZXJlbmNlcy54bWwueG1sLCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbC5zb3VyY2UsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sLnRlbXBsYXRlcywgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy54bWwuY29sb3JzIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxEZWZpbml0aW9uCi0JCQl0eXBlPSJzcGVsbGluZ3JlZ2lvbnMiCi0JCQl2YWx1ZT0iWE1MX0NPTU1FTlRfVEVYVCwgWE1MX0NPTlRFTlQsIFhNTF9ERUZBVUxUIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxEZWZpbml0aW9uCi0JCQl0eXBlPSJhY3RpdmVjb250ZXh0cyIKLQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLCBvcmcuZWNsaXBzZS53c3QueG1sLm5hdmlnYXRpb24sIG9yZy5lY2xpcHNlLndzdC54bWwuY2xlYW51cCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb21tZW50cywgb3JnLmVjbGlwc2Uud3N0LnhtbC5zZWxlY3Rpb24sIG9yZy5lY2xpcHNlLndzdC54bWwuZGVwZW5kZW5jaWVzLCBvcmcuZWNsaXBzZS53c3QueG1sLmdyYW1tYXIsIG9yZy5lY2xpcHNlLndzdC54bWwuZXhwYW5kLCBvcmcuZWNsaXBzZS53c3QueG1sLm9jY3VycmVuY2VzIgotICAgICAgICAJdGFyZ2V0PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIiAvPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzIj4KLQkJPGNvbnRleHQKLQkJCW5hbWU9IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5uYW1lIgotCQkJcGFyZW50SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWRlc2NyaXB0aW9uPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuZGVzY3JpcHRpb24iCi0JCQlpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCI+Ci0JCTwvY29udGV4dD4KLQkJPGNvbnRleHQKLQkJCW5hbWU9IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5uYXZpZ2F0aW9uLm5hbWUiCi0JCQlwYXJlbnRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJZGVzY3JpcHRpb249IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5uYXZpZ2F0aW9uLmRlc2NyaXB0aW9uIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwubmF2aWdhdGlvbiI+Ci0JCTwvY29udGV4dD4KLQkJPGNvbnRleHQKLQkJCW5hbWU9IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5jbGVhbnVwLm5hbWUiCi0JCQlwYXJlbnRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJZGVzY3JpcHRpb249IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5jbGVhbnVwLmRlc2NyaXB0aW9uIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY2xlYW51cCI+Ci0JCTwvY29udGV4dD4KLQkJPGNvbnRleHQKLQkJCW5hbWU9IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5jb21tZW50cy5uYW1lIgotCQkJcGFyZW50SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWRlc2NyaXB0aW9uPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwuY29tbWVudHMuZGVzY3JpcHRpb24iCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb21tZW50cyI+Ci0JCTwvY29udGV4dD4KLQkJPGNvbnRleHQKLQkJCW5hbWU9IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5zZWxlY3Rpb24ubmFtZSIKLQkJCXBhcmVudElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQlkZXNjcmlwdGlvbj0iJXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLnNlbGVjdGlvbi5kZXNjcmlwdGlvbiIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnNlbGVjdGlvbiI+Ci0JCTwvY29udGV4dD4KLQkJPGNvbnRleHQKLQkJCW5hbWU9IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5kZXBlbmRlbmNpZXMubmFtZSIKLQkJCXBhcmVudElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQlkZXNjcmlwdGlvbj0iJXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLmRlcGVuZGVuY2llcy5kZXNjcmlwdGlvbiIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmRlcGVuZGVuY2llcyI+Ci0JCTwvY29udGV4dD4KLQkJPGNvbnRleHQKLQkJCW5hbWU9IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5ncmFtbWFyLm5hbWUiCi0JCQlwYXJlbnRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJZGVzY3JpcHRpb249IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5ncmFtbWFyLmRlc2NyaXB0aW9uIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuZ3JhbW1hciI+Ci0JCTwvY29udGV4dD4KLQkJPGNvbnRleHQKLQkJCW5hbWU9IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5leHBhbmQubmFtZSIKLQkJCXBhcmVudElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQlkZXNjcmlwdGlvbj0iJXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IueG1sLmV4cGFuZC5kZXNjcmlwdGlvbiIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmV4cGFuZCI+Ci0JCTwvY29udGV4dD4KLQkJPGNvbnRleHQKLQkJCW5hbWU9IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLnhtbC5vY2N1cnJlbmNlcy5uYW1lIgotCQkJcGFyZW50SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWRlc2NyaXB0aW9uPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci54bWwub2NjdXJyZW5jZXMuZGVzY3JpcHRpb24iCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5vY2N1cnJlbmNlcyI+Ci0JCTwvY29udGV4dD4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmFubm90YXRpb25Nb2RlbENyZWF0aW9uIj4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWxGYWN0b3J5IiAvPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uIj4KLQkJPGFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JYTUwiPgotCQkJPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIiAvPgotCQkJPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotCQk8L2FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLQkJPCEtLSBUaGUgInRvcC1sZXZlbCIgWE1MIGNhdGVnb3J5IC0tPgotCQk8cGFnZQotCQkJbmFtZT0iJVhNTC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcmVmZXJlbmNlcy54bWwiPgotCQk8L3BhZ2U+Ci0JCTwhLS0gVGhlICJsb3dlciBsZXZlbCIgWE1MIEZpbGVzIGNhdGVnb3J5L3BhZ2UgLS0+Ci0JCTxwYWdlCi0JCQluYW1lPSIlWE1MX0ZpbGVzLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcmVmZXJlbmNlcy54bWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxGaWxlc1ByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucHJlZmVyZW5jZXMueG1sLnhtbCI+Ci0gICAgICAgICAJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZmlsZXMiLz4KLSAgICAgICAgIAk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5zZXZlcml0aWVzIi8+Ci0gICAgICAgIDwvcGFnZT4KLQkJPCEtLSBYTUwgUFJFRkVSRU5DRSBQQUdFUyAtLT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVYTUxfU291cmNlLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcmVmZXJlbmNlcy54bWwueG1sIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MU291cmNlUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy54bWwuc291cmNlIj4KLSAgICAgICAgIAk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5zb3VyY2UiLz4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJVhNTF9UZW1wbGF0ZXMubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbC5zb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sLnRlbXBsYXRlcyI+Ci0gICAgICAgICAJPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkudGVtcGxhdGVzIi8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVYTUxfU3ludGF4X0NvbG9yaW5nIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sLnNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTFN5bnRheENvbG9yaW5nUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbC5jb2xvcnMiPgotICAgICAgICAgCTxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnN0eWxlcyIvPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlX1VJX1BSRUZfWE1MX0NBVEFMT0ciCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcmVmZXJlbmNlcy54bWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nLlhNTENhdGFsb2dQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudWkuWE1MQ2F0YWxvZ1ByZWZlcmVuY2VQYWdlIj4KLSAgICAgICAgIAk8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS54bWxjYXRhbG9nIi8+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVYTUxfVHlwaW5nIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sLnNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTFR5cGluZ1ByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sLnR5cGluZyI+Ci0JCTwvcGFnZT4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIEtleXdvcmRzIGZvciBwcmVmZXJlbmNlIGFuZCBwcm9wZXJ0aWVzIHBhZ2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmtleXdvcmRzIj4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLmZpbGVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZmlsZXMiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLnNvdXJjZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnNvdXJjZSIvPgotCQk8a2V5d29yZAotCQkJbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMudGVtcGxhdGVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkudGVtcGxhdGVzIi8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy5zdHlsZXMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5zdHlsZXMiLz4KLQkJPGtleXdvcmQKLQkJCWxhYmVsPSIlcHJlZmVyZW5jZUtleXdvcmRzLnhtbGNhdGFsb2ciCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS54bWxjYXRhbG9nIi8+Ci0JCTxrZXl3b3JkCi0JCQlsYWJlbD0iJXByZWZlcmVuY2VLZXl3b3Jkcy5zZXZlcml0aWVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuc2V2ZXJpdGllcyIvPgotICAgIDwvZXh0ZW5zaW9uPgotCQotCTwhLS0gRWRpdG9yIGFjdGlvbnNldHMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0UGFydEFzc29jaWF0aW9ucyI+Ci0JCTxhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5lZGl0LnRleHQuYWN0aW9uU2V0LmFubm90YXRpb25OYXZpZ2F0aW9uIj4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZSI+PC9wYXJ0PgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwuc291cmNlMiI+PC9wYXJ0PgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLk5hdmlnYXRlQWN0aW9uU2V0Ij4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZSI+PC9wYXJ0PgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwuc291cmNlMiI+PC9wYXJ0PgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gVGVtcGxhdGVzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGVtcGxhdGVzIj4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlQWxsX1hNTF9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlWE1MIgotCQkJaWQ9InhtbF9hbGwiPgotCQk8L2NvbnRleHRUeXBlPgotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVYTUxfTmV3X2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVYTUwiCi0JCQlpZD0ieG1sX25ldyI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJVhNTF9UYWdfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZVhNTCIKLQkJCWlkPSJ4bWxfdGFnIj4KLQkJPC9jb250ZXh0VHlwZT4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlWE1MX0F0dHJpYnV0ZV9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlWE1MIgotCQkJaWQ9InhtbF9hdHRyaWJ1dGUiPgotCQk8L2NvbnRleHRUeXBlPgotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVYTUxfQXR0cmlidXRlX3ZhbHVlX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVYTUwiCi0JCQlpZD0ieG1sX2F0dHJpYnV0ZV92YWx1ZSI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxpbmNsdWRlCi0JCQlmaWxlPSJ0ZW1wbGF0ZXMveG1sZGVmYXVsdC10ZW1wbGF0ZXMueG1sIgotCQkJdHJhbnNsYXRpb25zPSIkbmwkL3RlbXBsYXRlcy94bWxkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzIj4KLQkJPC9pbmNsdWRlPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0JCTxlZGl0b3IKLQkJCW5hbWU9IiVYTUxfRWRpdG9yLm5hbWUiCi0JCQlpY29uPSIkbmwkL2ljb25zL3htbGRvYy5naWYiCi0JCQljb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5YTUxNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5YTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTE11bHRpUGFnZUVkaXRvclBhcnQiPgotCQkJPGNvbnRlbnRUeXBlQmluZGluZwotCQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiIC8+Ci0JCQk8Y29udGVudFR5cGVCaW5kaW5nCi0JCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIgLz4KLQotCQk8L2VkaXRvcj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gRWRpdG9yIGFjdGlvbnNldHMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0UGFydEFzc29jaWF0aW9ucyI+Ci0JCTxhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5lZGl0LnRleHQuYWN0aW9uU2V0LmFubm90YXRpb25OYXZpZ2F0aW9uIj4KLQkJCTxwYXJ0Ci0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTE11bHRpUGFnZUVkaXRvclBhcnQiPgotCQkJPC9wYXJ0PgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLk5hdmlnYXRlQWN0aW9uU2V0Ij4KLQkJCTxwYXJ0Ci0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTE11bHRpUGFnZUVkaXRvclBhcnQiPgotCQkJPC9wYXJ0PgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCi0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gQ29udHJpYnV0ZSBhICdOZXcgV2l6YXJkJyBmb3IgWE1MIGZpbGVzICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLQkJPGNhdGVnb3J5Ci0JCQluYW1lPSIlX1VJX1dJWkFSRF9YTUxfQ0FURUdPUlkiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LlhNTENhdGVnb3J5Ij4KLQkJPC9jYXRlZ29yeT4KLQkJPHdpemFyZAotCQkJbmFtZT0iJV9VSV9XSVpBUkRfTkVXX1hNTCIKLQkJCWljb249IiRubCQvaWNvbnMvWE1MRmlsZS5naWYiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LlhNTENhdGVnb3J5IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdYTUxXaXphcmQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzLk5ld1hNTFdpemFyZCI+Ci0JCQk8ZGVzY3JpcHRpb24+JV9VSV9DUkVBVEVfTkVXX1hNTF9GSUxFPC9kZXNjcmlwdGlvbj4KLQkJCTxzZWxlY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0JCQk8L3NlbGVjdGlvbj4KLQkJPC93aXphcmQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBBbGxvdyB0aGUgJ05ldyBYTUwnIHdpemFyZCB0byBiZSBhY2Nlc3NlZCB2aWEgdGhlICdHZW5lcmF0ZScgbWVudSBvbiBhIFhTRCBmaWxlIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQkJPG9iamVjdENvbnRyaWJ1dGlvbgotCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJbmFtZUZpbHRlcj0iKi54c2QiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbHdpemFyZC5jcmVhdGVYTUxGcm9tWFNEIj4KLQkJCTxtZW51Ci0JCQkJbGFiZWw9IiVnZW5NZW51TGFiZWwiCi0JCQkJcGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJnZW5lcmF0ZVhNTEFydGlmYWN0cyI+Ci0JCQkJPHNlcGFyYXRvciBuYW1lPSJ4bWwiIC8+Ci0JCQk8L21lbnU+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVfVUlfQUNUSU9OX0NSRUFURV9YTUwiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5YTUxJbXBvcnRBY3Rpb25EZWxlZ2F0ZSIKLQkJCQltZW51YmFyUGF0aD0iZ2VuZXJhdGVYTUxBcnRpZmFjdHMveG1sIgotCQkJCWVuYWJsZXNGb3I9IjEiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWx3aXphcmQuY3JlYXRlWE1MRnJvbVhTREFjdGlvbiI+Ci0JCQk8L2FjdGlvbj4KLQkJPC9vYmplY3RDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0tLT4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIEFsbG93IHRoZSAnTmV3IFhNTCcgd2l6YXJkIHRvIGJlIGFjY2Vzc2VkIHZpYSB0aGUgJ0dlbmVyYXRlJyBtZW51IG9uIGEgRFREIGZpbGUgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQkJPG9iamVjdENvbnRyaWJ1dGlvbgotCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJbmFtZUZpbHRlcj0iKi5kdGQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbHdpemFyZC5jcmVhdGVYTUxGcm9tRFREIj4KLQkJCTxtZW51Ci0JCQkJbGFiZWw9IiVnZW5NZW51TGFiZWwiCi0JCQkJcGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJnZW5lcmF0ZVhNTEFydGlmYWN0cyI+Ci0JCQkJPHNlcGFyYXRvciBuYW1lPSJ4bWwiIC8+Ci0JCQk8L21lbnU+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVfVUlfQUNUSU9OX0NSRUFURV9YTUwiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5YTUxJbXBvcnRBY3Rpb25EZWxlZ2F0ZSIKLQkJCQltZW51YmFyUGF0aD0iZ2VuZXJhdGVYTUxBcnRpZmFjdHMveG1sIgotCQkJCWVuYWJsZXNGb3I9IjEiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWx3aXphcmQuY3JlYXRlWE1MRnJvbURUREFjdGlvbiI+Ci0JCQk8L2FjdGlvbj4KLQkJPC9vYmplY3RDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0tLT4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIENvbnRyaWJ1dGUgYSBOZXctPkV4YW1wbGUuLi4gZW50cnkgZm9yIEVkaXRpbmcgYW5kIFZhbGlkYXRpbmcgWE1MIGZpbGVzICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0JPCEtLSBkZWZpbmUgdGhlIFhNTFNhbXBsZXMgcHJvamVjdCB3aXphcmQgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0JCTxjYXRlZ29yeQotCQkJbmFtZT0iJV9VSV9XSVpBUkRfTkVXX1hNTCIKLQkJCXBhcmVudENhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5FeGFtcGxlcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmV4YW1wbGVzIj4KLQkJPC9jYXRlZ29yeT4KLQkJPHdpemFyZAotCQkJbmFtZT0iJVhNTEV4YW1wbGUubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHMuRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5FeGFtcGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmV4YW1wbGVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCIKLQkJCXByb2plY3Q9InRydWUiCi0JCQlpY29uPSIkbmwkL2ljb25zL25ld1NhbXBsZVByb2plY3Rfd2l6LmdpZiI+Ci0JCQk8ZGVzY3JpcHRpb24+Ci0JCQkJJVhNTEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQuZGVzY3JpcHRpb24KLQkJCTwvZGVzY3JpcHRpb24+Ci0JCTwvd2l6YXJkPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBjb25maWd1cmUgdGhlIFhNTFNhbXBsZXMgcHJvamVjdCB3aXphcmQgLS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5leGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkIgotCQlpZD0iWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZEV4dGVuc2lvbiI+Ci0JCTx3aXphcmQKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLlhNTEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQiCi0JCQliYW5uZXI9Imljb25zL25ld1NhbXBsZVByb2plY3Rfd2l6YmFubmVyLnBuZyI+Ci0JCQk8cHJvamVjdHNldHVwCi0JCQkJcGFnZXRpdGxlPSIlWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5wYWdldGl0bGUiCi0JCQkJbmFtZT0iJVhNTEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQucHJvamVjdG5hbWUiCi0JCQkJbGFiZWw9IiVYTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmxhYmVsIgotCQkJCXBhZ2VkZXNjcmlwdGlvbj0iJVhNTEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQucGFnZWRlc2NyaXB0aW9uIgotCQkJCW9wZW49InJlYWRtZS5odG1sIj4KLQkJCQk8aW1wb3J0Ci0JCQkJCWRlc3Q9IiIKLQkJCQkJc3JjPSJleGFtcGxlcy9FZGl0aW5nQW5kVmFsaWRhdGluZ1hNTC56aXAiIC8+Ci0JCQk8L3Byb2plY3RzZXR1cD4KLQkJPC93aXphcmQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIGluaXRpYWxpemUgeG1sIHVpIHByZWZlcmVuY2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0idG90YWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYTUwiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYTUwiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllciBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5TVF9ERUZBVUxUIi8+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUZBVUxUIi8+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuU1RfREVGQVVMVCIvPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCTwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbiI+Ci0JCTx2YWxpZGF0b3IKLQkJCXNjb3BlPSJwYXJ0aWFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5NYXJrdXBWYWxpZGF0b3IiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLm1hcmt1cHZhbGlkYXRvciI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5TVF9ERUZBVUxUIi8+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQiLz4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllciBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFRkFVTFQiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5TVF9ERUZBVUxUIi8+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLmFubm90YXRpb25UeXBlcyI+Ci0gICAgICA8dHlwZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLm1hdGNoaW5nLnRhZyIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLm1hcmtlckFubm90YXRpb25TcGVjaWZpY2F0aW9uIj4KLSAgICAgIDxzcGVjaWZpY2F0aW9uCi0gICAgICAJCWluY2x1ZGVPblByZWZlcmVuY2VQYWdlPSJ0cnVlIgotICAgICAgICAgICAgY29sb3JQcmVmZXJlbmNlVmFsdWU9IjIxMiwyMTIsMjEyIgotICAgICAgICAgICAgYW5ub3RhdGlvblR5cGU9Im9yZy5lY2xpcHNlLndzdC54bWwudWkubWF0Y2hpbmcudGFnIgotICAgICAgICAgICAgY29sb3JQcmVmZXJlbmNlS2V5PSJtYXRjaGluZ1RhZ0luZGljYXRpb25Db2xvciIKLSAgICAgICAgICAgIHByZXNlbnRhdGlvbkxheWVyPSI0IgotICAgICAgICAgICAgbGFiZWw9IiVNYXRjaGluZ1RhZ1ByZWZlcmVuY2UubGFiZWwiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLmdpZiIKLSAgICAgICAgICAgIHRleHRQcmVmZXJlbmNlVmFsdWU9ImZhbHNlIgotICAgICAgICAgICAgdGV4dFByZWZlcmVuY2VLZXk9Im1hdGNoaW5nVGFnSW5kaWNhdGlvbiIKLSAgICAgICAgICAgIGhpZ2hsaWdodFByZWZlcmVuY2VLZXk9Im1hdGNoaW5nVGFnSGlnaGxpZ2h0IgotICAgICAgICAgICAgaGlnaGxpZ2h0UHJlZmVyZW5jZVZhbHVlPSJ0cnVlIgotICAgICAgICAgICAgdmVydGljYWxSdWxlclByZWZlcmVuY2VLZXk9Im1hdGNoaW5nVGFnVmVydGljYWxSdWxlciIKLSAgICAgICAgICAgIHZlcnRpY2FsUnVsZXJQcmVmZXJlbmNlVmFsdWU9ImZhbHNlIgotICAgICAgICAgICAgb3ZlcnZpZXdSdWxlclByZWZlcmVuY2VLZXk9Im1hdGNoaW5nVGFnSW5kaWNhdGlvbkluT3ZlcnZpZXdSdWxlciIKLSAgICAgICAgICAgIG92ZXJ2aWV3UnVsZXJQcmVmZXJlbmNlVmFsdWU9InRydWUiCi0gICAgICAgICAgICB0ZXh0U3R5bGVQcmVmZXJlbmNlS2V5PSJtYXRjaGluZ1RhZ1RleHRTdHlsZSIKLQkJCXRleHRTdHlsZVByZWZlcmVuY2VWYWx1ZT0iTk9ORSI+Ci0gICAgICA8L3NwZWNpZmljYXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gRG9jdW1lbnQgcHJvdmlkZXIgZm9yIEV4dGVybmFsRmlsZUVkaXRvcklucHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMuZG9jdW1lbnRQcm92aWRlcnMiPgotCQk8cHJvdmlkZXIKLQkJCWlucHV0VHlwZXM9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rLkV4dGVybmFsRmlsZUVkaXRvcklucHV0IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RmlsZURvY3VtZW50UHJvdmlkZXIiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5FeHRlcm5hbEZpbGVEb2N1bWVudFByb3ZpZGVyIj4KLQkJPC9wcm92aWRlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gVG8gRG86IG1pZ3JhdGUgdGhpcyB0byB0aGUgb3JnLmVjbGlwc2UudWkubWVudXMgcG9wdXA6IGZvcm1hdCAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQkJPHZpZXdlckNvbnRyaWJ1dGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwuc291cmNlLlJ1bGVyQ29udGV4dCIKLQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnJ1bGVyLmNvbnRleHQuYWN0aW9ucyI+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRUYXNrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLkFkZFRhc2tfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRUYXNrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRCb29rbWFyay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiI+Ci0JCQk8L2FjdGlvbj4KLQkJPC92aWV3ZXJDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIFBvcC11cCBtZW51IGFuZCBhc3NvY2lhdGVkIGNvbW1hbmQvaGFuZGxlciBmb3IgbmVzdGVkIHZhbGlkYXRpb24gbWVzc2FnZXMuICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KLSAgICAgIDxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJwb3B1cDpvcmcuZWNsaXBzZS51aS5pZGUuTWFya2Vyc1ZpZXciPgotICAgICAgICAgIDxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5yZWZlcmVuY2VkRmlsZUVycm9ycyI+Ci0gICAgICAgICAgICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnJlZmVyZW5jZWRGaWxlRXJyb3JzIiAvPgotICAgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+Ci0gICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICA8L21lbnVDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotCQk8Y29tbWFuZAotCQkJZGVzY3JpcHRpb249IiVfVUlfUkVGX0ZJTEVfU0hPV19ERVRBSUxTIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucmVmZXJlbmNlZEZpbGVFcnJvcnMiIAotCQkJbmFtZT0iJV9VSV9SRUZfRklMRV9TSE9XX0RFVEFJTFMiIC8+Ci0JPC9leHRlbnNpb24+Ci0JCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmVycm9yaW5mby5SZWZlcmVuY2VkRmlsZUVycm9yc0hhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnJlZmVyZW5jZWRGaWxlRXJyb3JzIj4KLSAgICAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0JCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucmVmZXJlbmNlZEZpbGVFcnJvcnMiIC8+Ci0gICAgICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgICA8L2hhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5wcm9wZXJ0eVRlc3RlcnMiPgotCSAgIDxwcm9wZXJ0eVRlc3RlcgotCSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5lcnJvcmluZm8uR3JvdXBOYW1lUHJvcGVydHlUZXN0ZXIiCi0JICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkubWFya2VyR3JvdXBOYW1lUHJvcGVydHlUZXN0ZXIiCi0JICAgICAgICAgbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpIgotCSAgICAgICAgIHByb3BlcnRpZXM9Imdyb3VwTmFtZVByZWZpeCIKLQkgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyIj4KLQkgICA8L3Byb3BlcnR5VGVzdGVyPgotCTwvZXh0ZW5zaW9uPgotCSAKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucmVmZXJlbmNlZEZpbGVFcnJvcnMiPgotICAgICAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAgICAgICAgPGNvdW50IHZhbHVlPSIxIiAvPgotICAgICAgICAgICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgICAgICAgIAkJPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLSAgICAgICAgICAgICAgICAgICAgICAJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZ3JvdXBOYW1lUHJlZml4IiB2YWx1ZT0icmVmZXJlbmNlZEZpbGVFcnJvciIgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIiAvPgotICAgICAgICAgICAgICAgICAgICAgIAkJPC9hZGFwdD4KLSAgICAgICAgICAgICAgICAgICAJCTwvaXRlcmF0ZT4KLSAgICAgICAgICAgICAgICAJPC93aXRoPgotICAgICAgICAgICAgICAgIDwvYW5kPgotCQk8L2RlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+CSAKLQotPCEtLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JBY3Rpb25zIj4KLQkJPGVkaXRvckNvbnRyaWJ1dGlvbgotCQkJaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwuc291cmNlLmVkaXRvckFjdGlvbnMiCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UiPgotCQkJPGFjdGlvbgotCQkJCWlkPSJDbGVhbnVwRG9jdW1lbnQiCi0JCQkJbGFiZWw9IiVDbGVhbnVwRG9jdW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNsZWFudXAuZG9jdW1lbnQiCi0JCQkJdG9vbHRpcD0iJUNsZWFudXBEb2N1bWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuQ2xlYW51cEFjdGlvblhNTERlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJDbGVhbnVwRG9jdW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlRvZ2dsZUNvbW1lbnQiCi0JCQkJbGFiZWw9IiVUb2dnbGVDb21tZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50b2dnbGUuY29tbWVudCIKLQkJCQl0b29sdGlwPSIlVG9nZ2xlQ29tbWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuVG9nZ2xlQ29tbWVudEFjdGlvblhNTERlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJUb2dnbGVDb21tZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJBZGRCbG9ja0NvbW1lbnQiCi0JCQkJbGFiZWw9IiVBZGRCbG9ja0NvbW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkZC5ibG9jay5jb21tZW50IgotCQkJCXRvb2x0aXA9IiVBZGRCbG9ja0NvbW1lbnRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLkFkZEJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJBZGRCbG9ja0NvbW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlJlbW92ZUJsb2NrQ29tbWVudCIKLQkJCQlsYWJlbD0iJVJlbW92ZUJsb2NrQ29tbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucmVtb3ZlLmJsb2NrLmNvbW1lbnQiCi0JCQkJdG9vbHRpcD0iJVJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuUmVtb3ZlQmxvY2tDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlJlbW92ZUJsb2NrQ29tbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iRmluZE9jY3VycmVuY2VzIgotCQkJCWxhYmVsPSIlRmluZE9jY3VycmVuY2VzX2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zZWFyY2guZmluZC5vY2N1cnJlbmNlcyIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWFyY2guWE1MRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkZpbmRPY2N1cnJlbmNlcyI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nIgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LmVuY2xvc2luZyIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3ROZXh0IgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5uZXh0IgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3ROZXh0WE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdE5leHQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzIgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QucHJldmlvdXMiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RQcmV2aW91c1hNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91cyI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0SGlzdG9yeSIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubGFzdCIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0SGlzdG9yeUFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5Ij4KLQkJCTwvYWN0aW9uPgotCQk8L2VkaXRvckNvbnRyaWJ1dGlvbj4KLSAgICAgICAgPGVkaXRvckNvbnRyaWJ1dGlvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwuc291cmNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwuc291cmNlLnJ1bGVyLmFjdGlvbnMiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmJvb2ttYXJrX2FjdGlvbl9jb250ZXh0IgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckRvdWJsZUNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIvPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVTZWxlY3RSdWxlci5sYWJlbCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIgotICAgICAgICAgICAgICAgYWN0aW9uSUQ9IlJ1bGVyQ2xpY2siCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIvPgotICAgICAgICA8L2VkaXRvckNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLS0tPgotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IuaHlwZXJsaW5rRGV0ZWN0b3JUYXJnZXRzIj4KLQkJPHRhcmdldAotCQkJaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0JCQluYW1lPSIlWE1MX1NvdXJjZV90YXJnZXRfbmFtZSI+Ci0JCTwvdGFyZ2V0PgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmh5cGVybGlua0RldGVjdG9ycyI+Ci0JCTxoeXBlcmxpbmtEZXRlY3RvcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rLlhNTEh5cGVybGlua0RldGVjdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rLlhNTEh5cGVybGlua0RldGVjdG9yIgotCQkJbmFtZT0iJVhNTF9oeXBlcmxpbmsiCi0JCQl0YXJnZXRJZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCI+Ci0JCTwvaHlwZXJsaW5rRGV0ZWN0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSA8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmltcG9ydFdpemFyZHMiPgotICAgIDxjYXRlZ29yeQotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuWE1MQ2F0ZWdvcnkiCi0gICAgICAgICAgbmFtZT0iJV9VSV9XSVpBUkRfTkVXX1hNTCI+Ci0gICAgPC9jYXRlZ29yeT4KLSAgICA8d2l6YXJkCi0gICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5YTUxDYXRlZ29yeSIKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzLkltcG9ydFhNTENhdGFsb2dXaXphcmQiCi0gICAgICAgICAgaWNvbj0iaWNvbnMveG1sZG9jLmdpZiIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzLkltcG9ydFhNTENhdGFsb2dXaXphcmQiCi0gICAgICAgICAgbmFtZT0iJV9VSV9XSVpBUkRfSU1QT1JUX0VYUE9SVF9YTUxDQVRBTE9HIj4KLSAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgJV9VSV9JTVBPUlRfWE1MX0NBVEFMT0dfRklMRQotICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPC93aXphcmQ+Ci0gPC9leHRlbnNpb24+Ci0gPGV4dGVuc2lvbgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5leHBvcnRXaXphcmRzIj4KLSAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LlhNTENhdGVnb3J5IgotICAgICAgICAgIG5hbWU9IiVfVUlfV0laQVJEX05FV19YTUwiPgotICAgIDwvY2F0ZWdvcnk+Ci0gICAgPHdpemFyZAotICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuWE1MQ2F0ZWdvcnkiCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5FeHBvcnRYTUxDYXRhbG9nV2l6YXJkIgotICAgICAgICAgIGljb249Imljb25zL3htbGRvYy5naWYiCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5FeHBvcnRYTUxDYXRhbG9nV2l6YXJkIgotICAgICAgICAgIG5hbWU9IiVfVUlfV0laQVJEX0lNUE9SVF9FWFBPUlRfWE1MQ0FUQUxPRyI+Ci0gICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICVfVUlfRVhQT1JUX1hNTF9DQVRBTE9HX0ZJTEUKLSAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvd2l6YXJkPgotIDwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotCQk8IS0tIE5hdmlnYXRlIGNvbW1hbmRzIC0tPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJUFjdGlvbkRlZmluaXRpb24ubmV4dFNpYmxpbmcubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlQWN0aW9uRGVmaW5pdGlvbi5uZXh0U2libGluZy5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5uZXh0U2libGluZyI+Ci0JCTwvY29tbWFuZD4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVBY3Rpb25EZWZpbml0aW9uLnByZXZpb3VzU2libGluZy5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVBY3Rpb25EZWZpbml0aW9uLnByZXZpb3VzU2libGluZy5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcmV2aW91c1NpYmxpbmciPgotCQk8L2NvbW1hbmQ+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlQWN0aW9uRGVmaW5pdGlvbi5nb3RvTWF0Y2hpbmdUYWcubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlQWN0aW9uRGVmaW5pdGlvbi5nb3RvTWF0Y2hpbmdUYWcuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZ290b01hdGNoaW5nVGFnIj4KLQkJPC9jb21tYW5kPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYmluZGluZ3MiPgotICAgICAgPCEtLSAgd2luMzI6ICBNMT1DVFJMLCAgICBNMj1TSElGVCwgTTM9QUxULCBNND0tCi0gICAgICAgICAgICBjYXJib246IE0xPUNPTU1BTkQsIE0yPVNISUZULCBNMz1BTFQsIE00PUNUUkwKLSAgICAgICAgICAgIGd0azogPyAKLSAgICAgIC0tPgotICAgICAgPCEtLSBOYXZpZ2F0ZSBjb21tYW5kcyAtLT4KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0xK00yK0FSUk9XX1VQIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucHJldmlvdXNTaWJsaW5nIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iLz4KLQkJPGtleQotCQkJcGxhdGZvcm09ImNhcmJvbiIKLQkJCXNlcXVlbmNlPSJDVFJMK1NISUZUK0FSUk9XX1VQIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucHJldmlvdXNTaWJsaW5nIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iLz4KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0xK00yK0FSUk9XX0RPV04iCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5uZXh0U2libGluZyIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIi8+Ci0JCTxrZXkKLQkJCXBsYXRmb3JtPSJjYXJib24iCi0JCQlzZXF1ZW5jZT0iQ1RSTCtTSElGVCtBUlJPV19ET1dOIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkubmV4dFNpYmxpbmciCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIvPgotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTErTTIrJmd0OyIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmdvdG9NYXRjaGluZ1RhZyIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIi8+Ci0JCTxrZXkKLQkJCXBsYXRmb3JtPSJjYXJib24iCi0JCQlzZXF1ZW5jZT0iQ1RSTCtTSElGVCsuIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZ290b01hdGNoaW5nVGFnIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iLz4KLQkJCQotCTwvZXh0ZW5zaW9uPgotCQotPCEtLQotICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBuZXcgb3JnLmVjbGlwc2UudWkubWVudXMgZXh0aW9ucyBwb2ludHMgYW5kIGNvbW1hbmQgaGFuZGxlcgotICAgZGVmaW5pdGlvbnMuCi0gLS0+Ci0gCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgotCQk8IS0tIFVuYWJsZSB0byBjb250cmlidXRlIHRvIFNlYXJjaCBtZW51IGF0IHRoZSBtb21lbnQgZHVlIHRvIGJ1ZyAyMTMzODUgLS0+Ci08IS0tCi0JCTxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJtZW51Om9yZy5lY2xpcHNlLnNlYXJjaC5tZW51Ij4KLS0tPgotCSAgICA8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0ibWVudTpnb1RvP2FmdGVyPW1hdGNoaW5nRW5kIj4KLTwhLS0JCQotCSAgICAgICA8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZ290b01hdGNoaW5nVGFnIiBpZD0iR29Ub01hdGNoaW5nVGFnIiBsYWJlbD0iJUdvVG9NYXRjaGluZ1RhZ19sYWJlbCIgc3R5bGU9InB1c2giPgotCQkJICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCSAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNzZUFjdGl2ZUNvbnRleHQuZGVmaW5pdGlvbiI+PC9yZWZlcmVuY2U+Ci0JCQkgICA8L3Zpc2libGVXaGVuPgotCSAgICAgICA8L2NvbW1hbmQ+Ci0tLT4JCQotCSAgICAgICA8c2VwYXJhdG9yIG5hbWU9ImdvVG9TaWJsaW5nc0JlZ2luIiB2aXNpYmxlPSJ0cnVlIj48L3NlcGFyYXRvcj4KLQkgICAgICAgPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLm5leHRTaWJsaW5nIiBpZD0iR29Ub05leHRTaWJsaW5nIiBsYWJlbD0iJUFjdGlvbkRlZmluaXRpb24ubmV4dFNpYmxpbmcubmFtZSIgc3R5bGU9InB1c2giPgotCQkJICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5uYXZpZ2F0aW9uIj48L3JlZmVyZW5jZT4KLQkJCQk8L3Zpc2libGVXaGVuPgotCSAgICAgICA8L2NvbW1hbmQ+Ci0JICAgICAgIDxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5wcmV2aW91c1NpYmxpbmciIGlkPSJHb1RvUHJldmlvdXNTaWJsaW5nIiBsYWJlbD0iJUFjdGlvbkRlZmluaXRpb24ucHJldmlvdXNTaWJsaW5nLm5hbWUiIHN0eWxlPSJwdXNoIj4KLQkJCSAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkubmF2aWdhdGlvbiI+PC9yZWZlcmVuY2U+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkgICAgICAgPC9jb21tYW5kPgotCSAgICAgICA8c2VwYXJhdG9yIG5hbWU9ImdvVG9TaWJsaW5nc0VuZCIgdmlzaWJsZT0iZmFsc2UiPjwvc2VwYXJhdG9yPgotCQk8L21lbnVDb250cmlidXRpb24+Ci0gICAgICAgPG1lbnVDb250cmlidXRpb24KLSAgICAgICAgICAgbG9jYXRpb25VUkk9Im1lbnU6b3JnLmVjbGlwc2UudWkubWFpbi5tZW51P2JlZm9yZT13aW5kb3ciPgotICAgICAgICA8bWVudQotICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5kZXNpZ25NZW51SWQiCi0gICAgICAgICAgICAgIGxhYmVsPSIlRGVzaWduTWVudV9uYW1lIj4KLSAgICAgICAgICAgPHNlcGFyYXRvcgotICAgICAgICAgICAgICAgICBuYW1lPSJkZXNpZ25TdGFydCI+Ci0gICAgICAgICAgIDwvc2VwYXJhdG9yPgotICAgICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZGlzYWJsZS5ncmFtbWFyLmNvbnN0cmFpbnRzIgotICAgICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvY29uc3RyYWlub24uZ2lmIgotICAgICAgICAgICAgICAgICBpZD0iVG9nZ2xlR3JhbW1hckNvbnN0cmFpbnRzIgotICAgICAgICAgICAgICAgICBtbmVtb25pYz0iJUNvbnN0cmFpbnRzX21uZW1vbmljIgotICAgICAgICAgICAgICAgICBzdHlsZT0icHVzaCI+Ci0gICAgICAgICAgICAgICAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLSAgICAgICAgICAgICAgICAJIDxhbmQ+Ci0gICAgICAgICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmdyYW1tYXIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgPG5vdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zc2VBY3RpdmVDb250ZXh0LmRlZmluaXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgPC9ub3Q+Ci0gICAgICAgICAgICAgICAgICAgIDwvYW5kPgotICAgICAgICAgICAgICAgICA8L3Zpc2libGVXaGVuPgotICAgICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5yZWxvYWQuZGVwZW5kZWNpZXMiCi0gICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi9ybGRncm1yLmdpZiIKLSAgICAgICAgICAgICAgICAgaWQ9IlJlbG9hZERlcGVuZGVuY2llcyIKLSAgICAgICAgICAgICAgICAgbW5lbW9uaWM9IiVSZWxvYWREZXBlbmRlbmNpZXNfbW5lbW9uaWMiCi0gICAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIj4KLSAgICAgICAgICAgICAgICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotICAgICAgICAgICAgICAgIAk8YW5kPgotICAgICAgICAgICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5kZXBlbmRlbmNpZXMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgPG5vdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zc2VBY3RpdmVDb250ZXh0LmRlZmluaXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgPC9ub3Q+Ci0gICAgICAgICAgICAgICAgICAgIDwvYW5kPgotICAgICAgICAgICAgICAgICA8L3Zpc2libGVXaGVuPgotICAgICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICAgICAgIDxzZXBhcmF0b3IKLSAgICAgICAgICAgICAgICAgbmFtZT0iZXhwYW5kIgotICAgICAgICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj4KLSAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgICAgIAotICAgICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICAgICBjb21tYW5kSWQ9InNlZC50YWJsZXRyZWUuZXhwYW5kQWxsIgotICAgICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvZXhwYW5kX2FsbC5naWYiCi0gICAgICAgICAgICAgICAgIGlkPSJFeHBhbmRBbGwiCi0gICAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIj4KLSAgICAgICAgICAgICAgICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotICAgICAgICAgICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5leHBhbmQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgPG5vdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zc2VBY3RpdmVDb250ZXh0LmRlZmluaXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgPC9ub3Q+Ci0gICAgICAgICAgICAgICAgICAgIDwvYW5kPgotICAgICAgICAgICAgICAgICA8L3Zpc2libGVXaGVuPgotICAgICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ic2VkLnRhYmxldHJlZS5jb2xsYXBzZUFsbCIKLSAgICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L2NvbGxhcHNlX2FsbC5naWYiCi0gICAgICAgICAgICAgICAgIGlkPSJDb2xsYXBzZUFsbCIKLSAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giPgotICAgICAgICAgICAgICAgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmV4cGFuZCIvPgotICAgICAgICAgICAgICAgICAgICAgICA8bm90PgotICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNzZUFjdGl2ZUNvbnRleHQuZGVmaW5pdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICAgICA8L25vdD4KLSAgICAgICAgICAgICAgICAgICAgPC9hbmQ+Ci0gICAgICAgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+Ci0gICAgICAgICAgIDwvY29tbWFuZD4KLSAgICAgICAgICAgCi0gICAgICAgICAgIDxzZXBhcmF0b3IKLSAgICAgICAgICAgICAgICAgbmFtZT0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj4KLSAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgICAgIDxzZXBhcmF0b3IKLSAgICAgICAgICAgICAgICAgbmFtZT0iZGVzaWduRW5kIgotICAgICAgICAgICAgICAgICB2aXNpYmxlPSJmYWxzZSI+Ci0gICAgICAgICAgIDwvc2VwYXJhdG9yPgotICAgICAgICA8L21lbnU+Ci0gICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KLSAgICAgPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9Im1lbnU6ZWRpdD9hZnRlcj1hZGRpdGlvbnMiPgotCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5jb250ZW50QXNzaXN0LnByb3Bvc2FscyIgaWQ9IlhNTENvbnRlbnRBc3Npc3QiIHN0eWxlPSJwdXNoIj4KLQkJICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnhtbFNvdXJjZUNvbnRyaWJ1dGlvbnMuZGVmaW5pdGlvbiI+PC9yZWZlcmVuY2U+Ci0JCQk8L3Zpc2libGVXaGVuPgotCQk8L2NvbW1hbmQ+Ci0JPC9tZW51Q29udHJpYnV0aW9uPgkJCi0gICAgIDxtZW51Q29udHJpYnV0aW9uCi0gICAgICAgICAgIGxvY2F0aW9uVVJJPSJwb3B1cDpvcmcuZWNsaXBzZS51aS5wb3B1cC5hbnk/YWZ0ZXI9YWRkaXRpb25zIj4KLSAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgaWQ9ImdlbmVyYXRlTWVudUlkIgotICAgICAgICAgICAgICBsYWJlbD0iJWdlbk1lbnVMYWJlbCI+Ci0JICAgICAgICA8Y29tbWFuZAotCSAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmdlbmVyYXRlLnhtbCIKLQkgICAgICAgICAgICAgIGlkPSJHZW5lcmF0ZVhNTCIKLQkgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIj4KLQkgICAgICAgICAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkgICAgICAgICAgICAgIDxvcj4KLQkJCQkJPGl0ZXJhdGUgaWZFbXB0eT0iZmFsc2UiPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotCQkJCQkJCTx0ZXN0Ci0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0gICAgICAgICAgICAgICAgICAgIAkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUueHNkc291cmNlIj4KLQkJCQkJCQk8L3Rlc3Q+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2l0ZXJhdGU+Ci0JCQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLQkJCQkJCQk8dGVzdAotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnJlc291cmNlcy5jb250ZW50VHlwZUlkIgotICAgICAgICAgICAgICAgICAgICAJCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSI+Ci0JCQkJCQkJPC90ZXN0PgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9pdGVyYXRlPgotCQkJCSA8L29yPgkKLQkgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+Ci0JICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICAgIDwvbWVudT4KLSAgICAgPC9tZW51Q29udHJpYnV0aW9uPgotICAgICAKLSAgICAgPG1lbnVDb250cmlidXRpb24KLSAgICAgICAgICAgbG9jYXRpb25VUkk9InRvb2xiYXI6b3JnLmVjbGlwc2UudWkubWFpbi50b29sYmFyP2FmdGVyPWFkZGl0aW9ucyI+Ci0gICAgICAgIDx0b29sYmFyCi0gICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmRlc2lnbi5EZXNpZ25Ub29sQmFyIj4KLSAgICAgICAgICAgPHNlcGFyYXRvcgotICAgICAgICAgICAgICAgICBuYW1lPSJzZWQudGFibGV0cmVlLnNlcGFyYXRvci4xIgotICAgICAgICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj4KLSAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5kaXNhYmxlLmdyYW1tYXIuY29uc3RyYWludHMiCi0gICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi9jb25zdHJhaW5vbi5naWYiCi0gICAgICAgICAgICAgICAgIGlkPSJUb2dnbGVHcmFtbWFyQ29uc3RyYWludHMiCi0gICAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgICB0b29sdGlwPSIlQ29uc3RyYWludHNfbmFtZSI+Ci0JICAgICAgICAgICA8dmlzaWJsZVdoZW4KLQkgICAgICAgICAgICAgICAgIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgotCSAgICAgICAgICAgICAgPHJlZmVyZW5jZQotCSAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmdyYW1tYXIiPgotCSAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+Ci0JICAgICAgICAgICA8L3Zpc2libGVXaGVuPgotICAgICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5yZWxvYWQuZGVwZW5kZWNpZXMiCi0gICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi9ybGRncm1yLmdpZiIKLSAgICAgICAgICAgICAgICAgaWQ9IlJlbG9hZERlcGVuZGVuY2llcyIKLSAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giPgotCSAgICAgICAgICAgPHZpc2libGVXaGVuCi0JICAgICAgICAgICAgICAgICBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkgICAgICAgICAgICAgIDxyZWZlcmVuY2UKLQkgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5kZXBlbmRlbmNpZXMiPgotCSAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+Ci0JICAgICAgICAgICA8L3Zpc2libGVXaGVuPgotICAgICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICAgICAgIDxzZXBhcmF0b3IKLSAgICAgICAgICAgICAgICAgbmFtZT0ic2VkLnRhYmxldHJlZS5zZXBhcmF0b3IuMiIKLSAgICAgICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSI+Ci0gICAgICAgICAgIDwvc2VwYXJhdG9yPgotICAgICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICAgICBjb21tYW5kSWQ9InNlZC50YWJsZXRyZWUuZXhwYW5kQWxsIgotICAgICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvZXhwYW5kX2FsbC5naWYiCi0gICAgICAgICAgICAgICAgIGlkPSJFeHBhbmRBbGwiCi0gICAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIj4KLQkgICAgICAgICAgIDx2aXNpYmxlV2hlbgotCSAgICAgICAgICAgICAgICAgY2hlY2tFbmFibGVkPSJmYWxzZSI+Ci0JICAgICAgICAgICAgICA8cmVmZXJlbmNlCi0JICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZXhwYW5kIj4KLQkgICAgICAgICAgICAgIDwvcmVmZXJlbmNlPgotCSAgICAgICAgICAgPC92aXNpYmxlV2hlbj4KLSAgICAgICAgICAgPC9jb21tYW5kPgotICAgICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICAgICBjb21tYW5kSWQ9InNlZC50YWJsZXRyZWUuY29sbGFwc2VBbGwiCi0gICAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi9jb2xsYXBzZV9hbGwuZ2lmIgotICAgICAgICAgICAgICAgICBpZD0iQ29sbGFwc2VBbGwiCi0gICAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIj4KLQkgICAgICAgICAgICAgPHZpc2libGVXaGVuCi0JICAgICAgICAgICAgICAgICBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkgICAgICAgICAgICAgIDxyZWZlcmVuY2UKLQkgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5leHBhbmQiPgotCSAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+Ci0JICAgICAgICAgICA8L3Zpc2libGVXaGVuPgotICAgICAgICAgICA8L2NvbW1hbmQ+Ci0gICAgICAgIDwvdG9vbGJhcj4KLSAgICAgPC9tZW51Q29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotCQk8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS54bWxTb3VyY2VDb250cmlidXRpb25zLmRlZmluaXRpb24iPgotICAgICAgICAgICAgPHdpdGggdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLQkgICAgICAgICAgIDxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JICAgICAgICAgICAgICA8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIi8+Ci0JICAgICAgICAgICA8L2l0ZXJhdGU+Ci0gICAgICAgICAgICA8L3dpdGg+Ci0JCTwvZGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuY29yZSI+Ci0JCQk8d2l0aCB2YXJpYWJsZT0iYWN0aXZlQ29udGV4dHMiPgotCQkJCTxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiLz4KLQkJCQk8L2l0ZXJhdGU+Ci0JCQk8L3dpdGg+Ci0JCTwvZGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkub2NjdXJyZW5jZXMiPgotICAgICAgICAgICAgPHdpdGggdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLQkgICAgICAgICAgIDxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JICAgICAgICAgICAgICA8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueG1sLm9jY3VycmVuY2VzIi8+Ci0JICAgICAgICAgICA8L2l0ZXJhdGU+Ci0gICAgICAgICAgICA8L3dpdGg+Ci0JCTwvZGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuY29tbWVudHMiPgotCQkJPHdpdGggdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvbW1lbnRzIi8+Ci0JCQkJPC9pdGVyYXRlPgotCQkJPC93aXRoPgotCQk8L2RlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9ucyI+Ci0JCTxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmNsZWFudXAiPgotCQkJPHdpdGggdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNsZWFudXAiLz4KLQkJCQk8L2l0ZXJhdGU+Ci0JCQk8L3dpdGg+Ci0JCTwvZGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkubmF2aWdhdGlvbiI+Ci0JCQk8d2l0aCB2YXJpYWJsZT0iYWN0aXZlQ29udGV4dHMiPgotCQkJCTxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54bWwubmF2aWdhdGlvbiIvPgotCQkJCTwvaXRlcmF0ZT4KLQkJCTwvd2l0aD4KLQkJPC9kZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotCQk8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5zZWxlY3Rpb24iPgotCQkJPHdpdGggdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueG1sLnNlbGVjdGlvbiIvPgotCQkJCTwvaXRlcmF0ZT4KLQkJCTwvd2l0aD4KLQkJPC9kZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotCQk8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5kZXBlbmRlbmNpZXMiPgotCQkJPG9yPgotCQkJCTx3aXRoIHZhcmlhYmxlPSJhY3RpdmVFZGl0b3JJZCI+Ci0JCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTE11bHRpUGFnZUVkaXRvclBhcnQiPjwvZXF1YWxzPgotCQkJCTwvd2l0aD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iYWN0aXZlQ29udGV4dHMiPgotCQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5kZXBlbmRlbmNpZXMiLz4KLQkJCQkJPC9pdGVyYXRlPgotCQkJCTwvd2l0aD4KLQkJCTwvb3I+Ci0JCTwvZGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZ3JhbW1hciI+Ci0JCQk8b3I+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImFjdGl2ZUVkaXRvcklkIj4KLQkJCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuWE1MTXVsdGlQYWdlRWRpdG9yUGFydCI+PC9lcXVhbHM+Ci0JCQkJPC93aXRoPgotCQkJCTx3aXRoIHZhcmlhYmxlPSJhY3RpdmVDb250ZXh0cyI+Ci0JCQkJCTxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueG1sLmdyYW1tYXIiLz4KLQkJCQkJPC9pdGVyYXRlPgotCQkJCTwvd2l0aD4KLQkJCTwvb3I+Ci0JCTwvZGVmaW5pdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KLQkJPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZXhwYW5kIj4KLQkJCTxvcj4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iYWN0aXZlRWRpdG9ySWQiPgotCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5YTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0Ij48L2VxdWFscz4KLQkJCQk8L3dpdGg+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImFjdGl2ZUNvbnRleHRzIj4KLQkJCQkJPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkJCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54bWwuZXhwYW5kIi8+Ci0JCQkJCTwvaXRlcmF0ZT4KLQkJCQk8L3dpdGg+Ci0JCQk8L29yPgotCQk8L2RlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0gICAgPGV4dGVuc2lvbgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVycy5DbGVhbnVwZG9jdW1lbnRIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jbGVhbnVwLmRvY3VtZW50Ij4KLSAgICAgICAgICA8YWN0aXZlV2hlbj4KLQkJCSA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jbGVhbnVwIi8+Ci0gICAgICAgICAgPC9hY3RpdmVXaGVuPgotICAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jbGVhbnVwIi8+Ci0gICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVycy5Ub2dnbGVDb21tZW50SGFuZGxlciIKLSAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudG9nZ2xlLmNvbW1lbnQiPgotICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jb21tZW50cyIvPgotICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmNvbW1lbnRzIi8+Ci0gICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVycy5BZGRCbG9ja0NvbW1lbnRIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGQuYmxvY2suY29tbWVudCI+Ci0gICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmNvbW1lbnRzIi8+Ci0gICAgICAgICAgPC9hY3RpdmVXaGVuPgotICAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuY29tbWVudHMiLz4KLSAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICA8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzLlJlbW92ZUJsb2NrQ29tbWVudEhhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnJlbW92ZS5ibG9jay5jb21tZW50Ij4KLSAgICAgICAgICA8YWN0aXZlV2hlbj4KLSAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuY29tbWVudHMiLz4KLSAgICAgICAgICA8L2FjdGl2ZVdoZW4+Ci0gICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jb21tZW50cyIvPgotICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnMuU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEhhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QuZW5jbG9zaW5nIj4KLSAgICAgICAgICA8YWN0aXZlV2hlbj4KLSAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuc2VsZWN0aW9uIi8+Ci0gICAgICAgICAgPC9hY3RpdmVXaGVuPgotICAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuc2VsZWN0aW9uIi8+Ci0gICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVycy5TdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEhhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubmV4dCI+Ci0gICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnNlbGVjdGlvbiIvPgotICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnNlbGVjdGlvbiIvPgotICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnMuU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MSGFuZGxlciIKLSAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5wcmV2aW91cyI+Ci0gICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnNlbGVjdGlvbiIvPgotICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnNlbGVjdGlvbiIvPgotICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuaGFuZGxlcnMuU3RydWN0dXJlZFNlbGVjdEhpc3RvcnlIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lmxhc3QiPgotICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5zZWxlY3Rpb24iLz4KLSAgICAgICAgICA8L2FjdGl2ZVdoZW4+Ci0gICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5zZWxlY3Rpb24iLz4KLSAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICA8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzLlhNTEZpbmRPY2N1cmVuY2VzSGFuZGxlciIKLSAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMiPgotICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5vY2N1cnJlbmNlcyIvPgotICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLm9jY3VycmVuY2VzIi8+Ci0gICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgICA8L2hhbmRsZXI+Ci08IS0tCi0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVycy5Hb1RvTWF0Y2hpbmdUYWdIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5nb3RvTWF0Y2hpbmdUYWciPgotICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5uYXZpZ2F0aW9uIi8+Ci0gICAgICAgICAgPC9hY3RpdmVXaGVuPgotICAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkubmF2aWdhdGlvbiIvPgotICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotLS0+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVycy5OZXh0U2libGluZ05hdmlnYXRpb25IYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5uZXh0U2libGluZyI+Ci0gICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLm5hdmlnYXRpb24iLz4KLSAgICAgICAgICA8L2FjdGl2ZVdoZW4+Ci0gICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5uYXZpZ2F0aW9uIi8+Ci0gICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgPGhhbmRsZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVycy5QcmV2aW91c1NpYmxpbmdOYXZpZ2F0aW9uSGFuZGxlciIKLSAgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkucHJldmlvdXNTaWJsaW5nIj4KLSAgICAgICAgICA8YWN0aXZlV2hlbj4KLSAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkubmF2aWdhdGlvbiIvPgotICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLm5hdmlnYXRpb24iLz4KLSAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICA8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzLlJlbG9hZERlcGVuZGVuY2llc0hhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnJlbG9hZC5kZXBlbmRlY2llcyI+Ci0gICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmRlcGVuZGVuY2llcyIvPgotICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmRlcGVuZGVuY2llcyIvPgotICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnMuVG9nZ2xlRWRpdE1vZGVIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5kaXNhYmxlLmdyYW1tYXIuY29uc3RyYWludHMiPgotICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5ncmFtbWFyIi8+Ci0gICAgICAgICAgPC9hY3RpdmVXaGVuPgotICAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuZ3JhbW1hciIvPgotICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICAgPC9oYW5kbGVyPgotICAgICAgIDxoYW5kbGVyCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdYTUxIYW5kbGVyIgotICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5nZW5lcmF0ZS54bWwiPgotICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICA8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzLkV4cGFuZEFsbEhhbmRsZXIiCi0gICAgICAgICAgICAgY29tbWFuZElkPSJzZWQudGFibGV0cmVlLmV4cGFuZEFsbCI+Ci0gICAgICAgICAgICAgPGFjdGl2ZVdoZW4+Ci0gICAgICAgICAgICAgICAgIDxub3Q+Ci0JCSAgICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJhY3RpdmVDb250ZXh0cyI+Ci0JCQkgICAgICAgICAgIDxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JCQkgICAgICAgICAgICAgIDxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIvPgotCQkJICAgICAgICAgICA8L2l0ZXJhdGU+Ci0JCSAgICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgICAgICAgICAgPC9ub3Q+Ci0gICAgICAgICAgICAgPC9hY3RpdmVXaGVuPgotICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICA8aGFuZGxlcgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzLkNvbGxhcHNlQWxsSGFuZGxlciIKLSAgICAgICAgICAgICBjb21tYW5kSWQ9InNlZC50YWJsZXRyZWUuY29sbGFwc2VBbGwiPgotICAgICAgICAgICAgIDxhY3RpdmVXaGVuPgotICAgICAgICAgICAgICAgICA8bm90PgotCQkgICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0iYWN0aXZlQ29udGV4dHMiPgotCQkJICAgICAgICAgICA8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJICAgICAgICAgICAgICA8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiLz4KLQkJCSAgICAgICAgICAgPC9pdGVyYXRlPgotCQkgICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICAgICAgICAgIDwvbm90PgotICAgICAgICAgICAgIDwvYWN0aXZlV2hlbj4KLSAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9leHRlbnNpb24+Ci0gICAgCi0gICAgPGV4dGVuc2lvbgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+Ci0JICAgIDxjb21tYW5kCi0JICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmdlbmVyYXRlLnhtbCIKLQkgICAgICAgICAgbmFtZT0iJV9VSV9BQ1RJT05fQ1JFQVRFX1hNTCI+Ci0JICAgIDwvY29tbWFuZD4KLQkgICAgPGNvbW1hbmQKLQkgICAgICAgICAgZGVzY3JpcHRpb249IiVSZWxvYWREZXBlbmRlbmNpZXNfZGVzY3JpcHRpb24iCi0JICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnJlbG9hZC5kZXBlbmRlY2llcyIKLQkgICAgICAgICAgbmFtZT0iJVJlbG9hZERlcGVuZGVuY2llc19uYW1lIj4KLQkgICAgPC9jb21tYW5kPgotCSAgICA8Y29tbWFuZAotCSAgICAgICAgICBkZXNjcmlwdGlvbj0iJUNvbnN0cmFpbnRzX2Rlc2NyaXB0aW9uIgotCSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5kaXNhYmxlLmdyYW1tYXIuY29uc3RyYWludHMiCi0JICAgICAgICAgIG5hbWU9IiVDb25zdHJhaW50c19uYW1lIj4KLQkgICAgPC9jb21tYW5kPgotCSAgICA8Y29tbWFuZAotCSAgICAgICAgICBpZD0ic2VkLnRhYmxldHJlZS5leHBhbmRBbGwiCi0JICAgICAgICAgIG5hbWU9IiVFeHBhbmRBbGxfbmFtZSI+Ci0JICAgIDwvY29tbWFuZD4KLQkgICAgPGNvbW1hbmQKLQkgICAgICAgICAgaWQ9InNlZC50YWJsZXRyZWUuY29sbGFwc2VBbGwiCi0JICAgICAgICAgIG5hbWU9IiVDb2xsYXBzZUFsbF9uYW1lIj4KLQkgICAgPC9jb21tYW5kPgotCTwvZXh0ZW5zaW9uPiAKLQkKLQk8IS0tIERlZmluZSB0aGVtZSAtLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS50aGVtZXMiPgotCQk8dGhlbWUKLQkJCWlkPSJvcmcuZWNsaXBzZS51aS5pZGUuc3lzdGVtRGVmYXVsdCI+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJ0YWdBdHRyaWJ1dGVOYW1lIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0idGFnQXR0cmlidXRlVmFsdWUiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJjb21tZW50Qm9yZGVyIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX1NFTEVDVElPTiI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJjb21tZW50VGV4dCIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9TRUxFQ1RJT04iPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iZGVjbEJvZGVyIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iZG9jdHlwZU5hbWUiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJkb2N0eXBlRXh0ZXJuYWxQdWJyZWYiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJkb2N0eXBlRXh0ZXJuYWxJZCIKLQkJCQl2YWx1ZT0iQ09MT1JfV0lER0VUX05PUk1BTF9TSEFET1ciPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iZG9jdHlwZUV4dHJlbmFsU3lzcmVmIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0idGFnQm9yZGVyIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0idGFnTmFtZSIKLQkJCQl2YWx1ZT0iQ09MT1JfTElTVF9GT1JFR1JPVU5EIj4KLQkJCTwvY29sb3JPdmVycmlkZT4KLQkJCTxjb2xvck92ZXJyaWRlCi0JCQkJaWQ9InBpQm9yZGVyIgotCQkJCXZhbHVlPSJDT0xPUl9MSVNUX0ZPUkVHUk9VTkQiPgotCQkJPC9jb2xvck92ZXJyaWRlPgotCQkJPGNvbG9yT3ZlcnJpZGUKLQkJCQlpZD0iY2RhdGFCb3JkZXIiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJjZGF0YVRleHQiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCQk8Y29sb3JPdmVycmlkZQotCQkJCWlkPSJlbnRpdHlSZWZlcmVuY2UiCi0JCQkJdmFsdWU9IkNPTE9SX0xJU1RfRk9SRUdST1VORCI+Ci0JCQk8L2NvbG9yT3ZlcnJpZGU+Ci0JCTwvdGhlbWU+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJ0YWdBdHRyaWJ1dGVOYW1lIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy50YWdBdHRyaWJ1dGVOYW1lIgotCQkJdmFsdWU9IjEyNywgMCwgMTI3Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJ0YWdBdHRyaWJ1dGVWYWx1ZSIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMudGFnQXR0cmlidXRlVmFsdWUiCi0JCQl2YWx1ZT0iNDIsIDAsIDI1NSI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iY29tbWVudEJvcmRlciIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMuY29tbWVudEJvcmRlciIKLQkJCXZhbHVlPSI2MywgOTUsIDE5MSI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iY29tbWVudFRleHQiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmNvbW1lbnRUZXh0IgotCQkJdmFsdWU9IjYzLCA5NSwgMTkxIj4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJkZWNsQm9kZXIiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmRlY2xCb3JkZXIiCi0JCQl2YWx1ZT0iMCwgMTI4LCAxMjgiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImRvY3R5cGVOYW1lIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5kb2N0eXBlTmFtZSIKLQkJCXZhbHVlPSIwLCAxMjgsIDEyOCI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iZG9jdHlwZUV4dGVybmFsUHVicmVmIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5kb2N0eXBlRXh0ZXJuYWxQdWJyZWYiCi0JCQl2YWx1ZT0iMCwgMTI4LCAxMjgiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImRvY3R5cGVFeHRlcm5hbElkIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5kb2N0eXBlRXh0ZXJuYWxJZCIKLQkJCXZhbHVlPSIxMjgsIDEyOCwgMTI4Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJkb2N0eXBlRXh0cmVuYWxTeXNyZWYiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLmRvY3R5cGVFeHRyZW5hbFN5c3JlZiIKLQkJCXZhbHVlPSI2MywgMTI3LCA5NSI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0idGFnQm9yZGVyIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy50YWdCb3JkZXIiCi0JCQl2YWx1ZT0iMCwgMTI4LCAxMjgiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9InRhZ05hbWUiCi0JCQlpc0VkaXRhYmxlPSJmYWxzZSIKLQkJCWxhYmVsPSIlQ29sb3JzLnRhZ05hbWUiCi0JCQl2YWx1ZT0iNjMsIDEyNywgMTI3Ij4KLQkJPC9jb2xvckRlZmluaXRpb24+Ci0JCTxjb2xvckRlZmluaXRpb24KLQkJCWlkPSJwaUJvcmRlciIKLQkJCWlzRWRpdGFibGU9ImZhbHNlIgotCQkJbGFiZWw9IiVDb2xvcnMucGlCb3JkZXIiCi0JCQl2YWx1ZT0iMCwgMTI4LCAxMjgiPgotCQk8L2NvbG9yRGVmaW5pdGlvbj4KLQkJPGNvbG9yRGVmaW5pdGlvbgotCQkJaWQ9ImNkYXRhQm9yZGVyIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5jZGF0YUJvcmRlciIKLQkJCXZhbHVlPSIwLCAxMjgsIDEyOCI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iY2RhdGFUZXh0IgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5jZGF0YVRleHQiCi0JCQl2YWx1ZT0iMCwgMCwgMCI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCQk8Y29sb3JEZWZpbml0aW9uCi0JCQlpZD0iZW50aXR5UmVmZXJlbmNlIgotCQkJaXNFZGl0YWJsZT0iZmFsc2UiCi0JCQlsYWJlbD0iJUNvbG9ycy5lbnRpdHlSZWZlcmVuY2UiCi0JCQl2YWx1ZT0iNDIsIDAsIDI1NSI+Ci0JCTwvY29sb3JEZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBFbmFibGUgdGhlIEZvcm1hdEhhbmRsZXIgZm9yIFhNTCBDb250ZW50IFR5cGUgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgotCQk8aGFuZGxlciAKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmhhbmRsZXJzLkZvcm1hdEhhbmRsZXIiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZm9ybWF0Ij4KLQkJCTxhY3RpdmVXaGVuPgotCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnhtbENvbnRlbnRUeXBlLmRlZmluaXRpb24iPjwvcmVmZXJlbmNlPgotCQkJPC9hY3RpdmVXaGVuPgotCQkJPGVuYWJsZWRXaGVuPgotCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnhtbENvbnRlbnRUeXBlLmRlZmluaXRpb24iPjwvcmVmZXJlbmNlPgotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9oYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gU2V0IHVwIGEgZGVmaW5pdGlvbiBmb3IgWE1MIENvbnRlbnQgVHlwZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9ucyI+Ci0JCTxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnhtbENvbnRlbnRUeXBlLmRlZmluaXRpb24iPgotCQkJPG9yPgotICAgICAgICAgICAgCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiIAotCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIi8+Ci0JCQkJCTwvYWRhcHQ+Ci0JCQkJPC9pdGVyYXRlPgotCQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0JCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiLz4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L2l0ZXJhdGU+Ci0JCQk8L29yPgotCQk8L2RlZmluaXRpb24+Ci0JPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zY2hlbWEvY2F0YWxvZ0ZpbGVUeXBlLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc2NoZW1hL2NhdGFsb2dGaWxlVHlwZS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjI5NjU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zY2hlbWEvY2F0YWxvZ0ZpbGVUeXBlLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aSIgaWQ9ImNhdGFsb2dGaWxlVHlwZSIgbmFtZT0iWE1MIENhdGFsb2cgZmlsZSB0eXBlIGV4dGVuc2lvbiBwb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmlsZVR5cGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmlsZVR5cGUiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHRlbnNpb25zIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0FkdmFuY2VkT3B0aW9uc0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9BZHZhbmNlZE9wdGlvbnNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMxZGVjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0FkdmFuY2VkT3B0aW9uc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2F2ZUFzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZGlhbG9ncy5TZWxlY3RTaW5nbGVGaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLkNhdGFsb2dTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIEFkdmFuY2VkT3B0aW9uc0RpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIElDYXRhbG9nIHdvcmtpbmdVc2VyQ2F0YWxvZzsKLQotCXB1YmxpYyBBZHZhbmNlZE9wdGlvbnNEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElDYXRhbG9nIHdvcmtpbmdVc2VyQ2F0YWxvZykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCXRoaXMud29ya2luZ1VzZXJDYXRhbG9nID0gd29ya2luZ1VzZXJDYXRhbG9nOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCX0KLQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkvLyBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGlhbG9nQXJlYSwgbmV3Ci0JCS8vIENvbnRyb2xDb250ZXh0Q29tcHV0ZXIoZGlhbG9nQXJlYSwKLQkJLy8gWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MUF9QUk9KRUNUX0RJQUxPRykpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ESUFMT0dfREVTQ1JJUFRJT04pOwotCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQ29tcG9zaXRlIHBsYWNlSG9sZGVyID0gbmV3IENvbXBvc2l0ZShidXR0b25Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcGxhY2VIb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkdyb3VwID0gbmV3IENvbXBvc2l0ZShidXR0b25Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJYnV0dG9uR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlidXR0b25Hcm91cC5zZXRMYXlvdXREYXRhKGNyZWF0ZUdyaWREYXRhKCkpOwotCi0JCUJ1dHRvbiBpbXBvcnRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkdyb3VwLCBTV1QuUFVTSCB8IFNXVC5DRU5URVIpOwotCQlpbXBvcnRCdXR0b24uc2V0VGV4dCgiICAiICsgWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0JVVFRPTl9JTVBPUlQgKyAiICAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJQnV0dG9uIGV4cG9ydEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uR3JvdXAsIFNXVC5QVVNIIHwgU1dULkNFTlRFUik7Ci0JCWV4cG9ydEJ1dHRvbi5zZXRUZXh0KCIgICIgKyBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfQlVUVE9OX0VYUE9SVCArICIgICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlwbGFjZUhvbGRlciA9IG5ldyBDb21wb3NpdGUoYnV0dG9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXBsYWNlSG9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCS8vIGFkZCBpbXBvcnRCdXR0b24gbGlzdGVuZXIKLQkJU2VsZWN0aW9uTGlzdGVuZXIgaW1wb3J0QnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpbnZva2VJbXBvcnREaWFsb2coKTsKLQkJCX0KLQkJfTsKLQkJaW1wb3J0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGltcG9ydEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQkvLyBhZGQgZXhwb3J0QnV0dG9uIGxpc3RlbmVyCi0JCVNlbGVjdGlvbkxpc3RlbmVyIGV4cG9ydEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaW52b2tlRXhwb3J0RGlhbG9nKCk7Ci0JCQl9Ci0JCX07Ci0JCWV4cG9ydEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihleHBvcnRCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCi0JcHJvdGVjdGVkIEdyaWREYXRhIGNyZWF0ZUdyaWREYXRhKCkgewotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5DRU5URVIpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVI7Ci0JCWdkLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSOwotCQlyZXR1cm4gZ2Q7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBpbnZva2VJbXBvcnREaWFsb2coKSB7Ci0JCVNlbGVjdFNpbmdsZUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IFNlbGVjdFNpbmdsZUZpbGVEaWFsb2coZ2V0U2hlbGwoKSwgbnVsbCwgdHJ1ZSk7Ci0JCVN0cmluZ1tdIGV4dGVuc2lvbnMgPSB7Ii54bWxjYXRhbG9nIiwgIi54bWwifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWRpYWxvZy5hZGRGaWx0ZXJFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfVElUTEUpOwotCQlkaWFsb2cuc2V0VGl0bGUoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfSEVBRElORyk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9JTVBPUlRfRElBTE9HX01FU1NBR0UpOwotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWludCByYyA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChyYyA9PSBXaW5kb3cuT0spIHsKLQkJCUlGaWxlIGZpbGUgPSBkaWFsb2cuZ2V0RmlsZSgpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS50b1VSSSgpLnRvU3RyaW5nKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJQ2F0YWxvZ1NldCB0ZW1wUmVzb3VyY2VTZXQgPSBuZXcgQ2F0YWxvZ1NldCgpOwotCQkJCQlJQ2F0YWxvZyBuZXdDYXRhbG9nID0gdGVtcFJlc291cmNlU2V0Lmxvb2t1cE9yQ3JlYXRlQ2F0YWxvZygidGVtcCIsIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl3b3JraW5nVXNlckNhdGFsb2cuYWRkRW50cmllc0Zyb21DYXRhbG9nKG5ld0NhdGFsb2cpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gVE9ETy4uLiBnaXZlIGVycm9yIG1lc3NhZ2UKLQkJCQl9Ci0JCQl9Ci0JCQljbG9zZSgpOwotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBpbnZva2VFeHBvcnREaWFsb2coKSB7Ci0JCUlQYXRoIG9yaWdpbmFsRmlsZVBhdGggPSBudWxsOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQlpZiAocHJvamVjdHMubGVuZ3RoID4gMCkgewotCQkJb3JpZ2luYWxGaWxlUGF0aCA9IHByb2plY3RzWzBdLmdldEZ1bGxQYXRoKCkuYXBwZW5kKCIueG1sY2F0YWxvZyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTYXZlQXNEaWFsb2cgZGlhbG9nID0gbmV3IFNhdmVBc0RpYWxvZyhnZXRTaGVsbCgpKTsKLQkJaWYgKG9yaWdpbmFsRmlsZVBhdGggIT0gbnVsbCkgewotCQkJSUZpbGUgb3JpZ2luYWxGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG9yaWdpbmFsRmlsZVBhdGgpOwotCQkJZGlhbG9nLnNldE9yaWdpbmFsRmlsZShvcmlnaW5hbEZpbGUpOwotCQl9Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9FWFBPUlRfRElBTE9HX1RJVExFKTsKLQkJZGlhbG9nLnNldFRpdGxlKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9FWFBPUlRfRElBTE9HX0hFQURJTkcpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfRVhQT1JUX0RJQUxPR19NRVNTQUdFKTsKLQotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWludCByYyA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChyYyA9PSBXaW5kb3cuT0spIHsKLQkJCUlQYXRoIHBhdGggPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkudG9VUkkoKS50b1N0cmluZygpOwotCi0JCQkJLy8gaGVyZSB3ZSBzYXZlIHRoZSBjYXRhbG9nIGVudHJpZXMgdG8gdGhlIHNlbGVjdGVkIGZpbGUKLQkJCQl0cnkgewotCQkJCQljcmVhdGVGaWxlSWZSZXF1aXJlZChmaWxlKTsKLQkJCQkJd29ya2luZ1VzZXJDYXRhbG9nLnNldExvY2F0aW9uKGZpbGVOYW1lKTsKLQkJCQkJd29ya2luZ1VzZXJDYXRhbG9nLnNhdmUoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIHRpdGxlID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0NBVEFMT0dfU0FWRV9FUlJPUjsKLQkJCQkJCVN0cmluZyBicmllZk1lc3NhZ2UgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfQ0FUQUxPR19DT1VMRF9OT1RfQkVfU0FWRUQ7Ci0JCQkJCQlTdHJpbmcgcmVhc29uID0gZmlsZS5pc1JlYWRPbmx5KCkgPyBOTFMuYmluZChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfRklMRV9JU19SRUFEX09OTFksIGZpbGVOYW1lKSA6IE5MUy5iaW5kKFhNTENhdGFsb2dNZXNzYWdlcy5FUlJPUl9TQVZJTkdfRklMRSwgZmlsZU5hbWUpOwotCQkJCQkJU3RyaW5nIGRldGFpbHMgPSBOTFMuYmluZChYTUxDYXRhbG9nTWVzc2FnZXMuRVJST1JfU0FWSU5HX0ZJTEUsIGZpbGVOYW1lKTsKLQotCQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHRpdGxlLCBicmllZk1lc3NhZ2UsIGNyZWF0ZVN0YXR1cyhyZWFzb24sIGRldGFpbHMpKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4MikgewotCQkJCQl9Ci0JCQkJfQotCQkJCWNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBUT0RPLi4uIFRoaXMgd2FzIGNvcGllZCBmcm9tIFdpbmRvd1V0aWxpdHkuIElzIHRoZXJlIGFuIGVhc2llciB3YXkgdG8KLQkvLyBjcmVhdGUgYSBzdGF0dXMgb2JqZWN0PwotCS8vIElmIG5vdCwgd2Ugc2hvdWxkIG9wZW4gYW4gZWNsaXBzZSBidWcgb3IgYWRkIGEgc2ltaWxhciB1dGlsaXR5IHRvCi0JLy8gYmFzZUV4dGVuc2lvbnNVSS4KLQkvLwotCXByaXZhdGUgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKFN0cmluZyByZWFzb24sIFN0cmluZyBtc2cpIHsKLQkJU3RyaW5nIHBsdWdpbklkID0gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhwbHVnaW5JZCwgMCwgcmVhc29uLCBudWxsKTsKLQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgcGx1Z2luSWQsIDAsIG1zZywgbnVsbCk7Ci0JCW11bHRpU3RhdHVzLmFkZChzdGF0dXMpOwotCQlyZXR1cm4gbXVsdGlTdGF0dXM7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWxlSWZSZXF1aXJlZChJRmlsZSBmaWxlKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoKGZpbGUgIT0gbnVsbCkgJiYgIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSk7Ci0JCQkJZmlsZS5jcmVhdGUoaW5wdXRTdHJlYW0sIHRydWUsIG51bGwpOwotCQkJCS8vIGNyZWF0ZUVtcHR5WE1MQ2F0YWxvZyhmaWxlKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0ZpbGVUeXBlUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0ZpbGVUeXBlUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2NTMxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dGaWxlVHlwZVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIENhdGFsb2dGaWxlVHlwZVJlZ2lzdHJ5UmVhZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBDYXRhbG9nRmlsZVR5cGVSZWdpc3RyeVJlYWRlciBfaW5zdGFuY2U7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0VYVEVOU0lPTlMgPSAiZXh0ZW5zaW9ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lDT04gPSAiaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiY2F0YWxvZ0ZpbGVUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJmaWxlVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIENhdGFsb2dGaWxlVHlwZVJlZ2lzdHJ5UmVhZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoX2luc3RhbmNlID09IG51bGwpIHsKLQkJCV9pbnN0YW5jZSA9IG5ldyBDYXRhbG9nRmlsZVR5cGVSZWdpc3RyeVJlYWRlcigpOwotCQl9Ci0JCXJldHVybiBfaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldFhNTENhdGFsb2dGaWxlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpLmhhc2hNYXAudmFsdWVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBIYXNoTWFwIGhhc2hNYXA7Ci0KLQlwdWJsaWMgQ2F0YWxvZ0ZpbGVUeXBlUmVnaXN0cnlSZWFkZXIoKSB7Ci0JCXRoaXMuaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJlYWRSZWdpc3RyeSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19OQU1FKSkgewotCQkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJCWlmIChpZCAhPSBudWxsKSB7Ci0JCQkJWE1MQ2F0YWxvZ0ZpbGVUeXBlIGZpbGVUeXBlID0gKFhNTENhdGFsb2dGaWxlVHlwZSkgaGFzaE1hcC5nZXQoaWQpOwotCQkJCWlmIChmaWxlVHlwZSA9PSBudWxsKSB7Ci0JCQkJCWZpbGVUeXBlID0gbmV3IFhNTENhdGFsb2dGaWxlVHlwZSgpOwotCQkJCQloYXNoTWFwLnB1dChpZCwgZmlsZVR5cGUpOwotCQkJCX0KLQotCQkJCWlmIChmaWxlVHlwZS5kZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9ERVNDUklQVElPTik7Ci0JCQkJCWZpbGVUeXBlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCQkJfQotCi0JCQkJZmlsZVR5cGUuYWRkRXh0ZW5zaW9ucyhlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfRVhURU5TSU9OUykpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRSZWdpc3RyeSgpIHsKLQkJcmVhZFJlZ2lzdHJ5KEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRSZWdpc3RyeShTdHJpbmcgZXh0ZW5zaW9uUG9pbnRJZCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBwbHVnaW5SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChYTUxVSVBsdWdpbi5JRCwgZXh0ZW5zaW9uUG9pbnRJZCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCXJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvRWRpdENhdGFsb2dFbnRyeURpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9FZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMmMyOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9FZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRpYWxvZ3MuU2VsZWN0U2luZ2xlRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLQotcHVibGljIGNsYXNzIEVkaXRDYXRhbG9nRW50cnlEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgYm9yd3NlSW1hZ2UgPSBJbWFnZUZhY3RvcnkuSU5TVEFOQ0UuZ2V0SW1hZ2UoImljb25zL29iajE2L2ZpbGVfZXhwYW5kLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBjYXRhbG9nRW50cnlUb29sQmFySW1hZ2UgPSBJbWFnZUZhY3RvcnkuSU5TVEFOQ0UuZ2V0SW1hZ2UoImljb25zL2V0b29sNTAvY2F0YWxvZ0VudHJ5LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBuZXh0Q2F0YWxvZ1Rvb2xCYXJJbWFnZSA9IEltYWdlRmFjdG9yeS5JTlNUQU5DRS5nZXRJbWFnZSgiaWNvbnMvZXRvb2w1MC9uZXh0Q2F0YWxvZy5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGNsYXNzIENhdGFsb2dFbnRyeVBhZ2UgZXh0ZW5kcyBDYXRhbG9nRWxlbWVudFBhZ2UgewotCi0JCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0JCXByb3RlY3RlZCBJQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeTsKLQotCQlwcm90ZWN0ZWQgQnV0dG9uIGNoZWNrYm94QnV0dG9uOwotCi0JCXByb3RlY3RlZCBMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbDsKLQotCQlwcm90ZWN0ZWQgVGV4dCBrZXlGaWVsZDsKLQotCQlwcm90ZWN0ZWQgQ29tYm8ga2V5VHlwZUNvbWJvOwotCi0JCXByb3RlY3RlZCBUZXh0IHJlc291cmNlTG9jYXRpb25GaWVsZDsKLQotCQlwcm90ZWN0ZWQgQ29tYm8gcmVzb3VyY2VUeXBlQ29tYm87Ci0KLQkJcHJvdGVjdGVkIFRleHQgd2ViQWRkcmVzc0ZpZWxkOwotCQkKLQkJcHJvdGVjdGVkIFN0cmluZyBrZXk7Ci0JCQotCQlwcm90ZWN0ZWQgaW50IHR5cGU7Ci0KLQkJcHJvdGVjdGVkIHZvaWQgY29tcHV0ZUVycm9yTWVzc2FnZSgpIHsKLQkJCWVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCQl3YXJuaW5nTWVzc2FnZSA9IG51bGw7Ci0KLQkJCWlmIChlcnJvck1lc3NhZ2UgPT0gbnVsbCkgewotCQkJCVN0cmluZyBmaWxlTmFtZSA9IHJlc291cmNlTG9jYXRpb25GaWVsZC5nZXRUZXh0KCk7Ci0JCQkJaWYgKGZpbGVOYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJaWYgKChmaWxlTmFtZS5pbmRleE9mKCIuLiIpICE9IC0xKSB8fCAoZmlsZU5hbWUuaW5kZXhPZigiLi8iKSAhPSAtMSkgfHwgKGZpbGVOYW1lLmluZGV4T2YoIi8uIikgIT0gLTEpIHx8IChmaWxlTmFtZS5pbmRleE9mKCIuXFwiKSAhPSAtMSkgfHwgKGZpbGVOYW1lLmluZGV4T2YoIlxcLiIpICE9IC0xKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCQkJCWVycm9yTWVzc2FnZSA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9XQVJOSU5HX1VSSV9NVVNUX05PVF9IQVZFX0RPVFM7Ci0JCQkJCX0KLQotCQkJCQlTdHJpbmcgdXJpID0gZmlsZU5hbWU7Ci0JCQkJCWlmICghVVJJSGVscGVyLmhhc1Byb3RvY29sKHVyaSkpIHsKLQkJCQkJCVVSSUhlbHBlci5pc0Fic29sdXRlKHVyaSk7Ci0JCQkJCQl1cmkgPSAoVVJJSGVscGVyLmlzQWJzb2x1dGUodXJpKSkgPyBVUklIZWxwZXIucHJlcGVuZEZpbGVQcm90b2NvbCh1cmkpIDogVVJJSGVscGVyLnByZXBlbmRQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2wodXJpKTsKLQkJCQkJfQotCi0JCQkJCWlmICgoZXJyb3JNZXNzYWdlID09IG51bGwpICYmICFVUklIZWxwZXIuaXNSZWFkYWJsZVVSSSh1cmksIGZhbHNlKSkgewotCQkJCQkJZXJyb3JNZXNzYWdlID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX1dBUk5JTkdfVVJJX05PVF9GT1VORF9DT0xPTiArIGZpbGVOYW1lOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyB0aGlzIGFuIGVycm9yIHRoYXQgaXMgbm90IGFjdGF1bGx5Ci0JCQkJCS8vIHJlcG9ydGVkIC4uLiBPSyBpcyBqdXN0IGRpc2FibGVkCi0JCQkJCWVycm9yTWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQkJLy8gTWFrZSBzdXJlIHRoZSBrZXkgaXMgYSBmdWxseSBxdWFsaWZpZWQgVVJJIGluIHRoZSBjYXNlcwotCQkJCS8vIHdoZXJlIHRoZSBrZXkgdHlwZSBpcyAiU3lzdGVtIElEIiBvciAiU2NoZW1hIGxvY2F0aW9uIgotCQkJCWlmICgoa2V5RmllbGQuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCkgJiYgKGdldEtleVR5cGUoKSA9PSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfU1lTVEVNKSkgewotCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShrZXlGaWVsZC5nZXRUZXh0KCkpOwotCQkJCQlpZiAodXJpLnNjaGVtZSgpID09IG51bGwpIHsKLQkJCQkJCXdhcm5pbmdNZXNzYWdlID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX1dBUk5JTkdfU0hPVUxEX0JFX0ZVTExZX1FVQUxJRklFRF9VUkk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICgoZXJyb3JNZXNzYWdlID09IG51bGwpICYmIGNoZWNrYm94QnV0dG9uLmdldFNlbGVjdGlvbigpICYmICh3ZWJBZGRyZXNzRmllbGQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCS8vIHRoaXMgYW4gZXJyb3IgdGhhdCBpcyBub3QgYWN0YXVsbHkKLQkJCQkvLyByZXBvcnRlZCAuLi4gT0sgaXMganVzdCBkaXNhYmxlZAotCQkJCWVycm9yTWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmICgoZXJyb3JNZXNzYWdlID09IG51bGwpICYmIChrZXlGaWVsZC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJLy8gdGhpcyBhbiBlcnJvciB0aGF0IGlzIG5vdCBhY3RhdWxseQotCQkJCS8vIHJlcG9ydGVkIC4uLiBPSyBpcyBqdXN0IGRpc2FibGVkCi0JCQkJZXJyb3JNZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNhdGFsb2dFbnRyeVBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCWlmIChlLndpZGdldCA9PSByZXNvdXJjZUxvY2F0aW9uRmllbGQpIHsKLQkJCQkJCWlmIChrZXlGaWVsZC5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCVN0cmluZyB1cmkgPSByZXNvdXJjZUxvY2F0aW9uRmllbGQuZ2V0VGV4dCgpOwotCQkJCQkJCWlmICh1cmkuZW5kc1dpdGgoInhzZCIpICYmICFVUklIZWxwZXIuaGFzUHJvdG9jb2wodXJpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXVyaSA9IFVSSUhlbHBlci5pc0Fic29sdXRlKHVyaSkgPyBVUklIZWxwZXIucHJlcGVuZEZpbGVQcm90b2NvbCh1cmkpIDogVVJJSGVscGVyLnByZXBlbmRQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2wodXJpKTsKLQkJCQkJCQkJU3RyaW5nIG5hbWVzcGFjZVVSSSA9IFhNTFF1aWNrU2Nhbi5nZXRUYXJnZXROYW1lc3BhY2VVUklGb3JTY2hlbWEodXJpKTsKLQkJCQkJCQkJaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlrZXlGaWVsZC5zZXRUZXh0KG5hbWVzcGFjZVVSSSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJdXBkYXRlV2lkZ2V0cyhlLndpZGdldCk7Ci0JCQkJfQotCQkJfTsKLQotCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkJQ29tcG9zaXRlIGdyb3VwID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotCQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJCUxhYmVsIHJlc291cmNlTG9jYXRpb25MYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQkJcmVzb3VyY2VMb2NhdGlvbkxhYmVsLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0xPQ0FUSU9OX0NPTE9OKTsKLQotCQkJcmVzb3VyY2VMb2NhdGlvbkZpZWxkID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJCXJlc291cmNlTG9jYXRpb25GaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkJcmVzb3VyY2VMb2NhdGlvbkZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKFVSSVV0aWxzLmNvbnZlcnRVUklUb0xvY2F0aW9uKGdldEVudHJ5KCkuZ2V0VVJJKCkpKSk7Ci0KLQkJCS8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscChyZXNvdXJjZUxvY2F0aW9uRmllbGQsCi0JCQkvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX0VOVFJZX1VSSSk7Ci0JCQlyZXNvdXJjZUxvY2F0aW9uRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCi0KLQkJCWJyb3dzZUJ1dHRvbiA9IGNyZWF0ZUJyb3dzZUJ1dHRvbihncm91cCk7Ci0JCQkvLyBXb3JrYmVuY2hIZWxwLnNldEhlbHAoYnJvd3NlQnV0dG9uLAotCQkJLy8gWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MUF9FTlRSWV9CUk9XU0UpOwotCQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBEcm9wRG93blNlbGVjdGlvbkxpc3RlbmVyKHJlc291cmNlTG9jYXRpb25GaWVsZCkpOwotCi0JCQkvLyBLZXkgVHlwZQotCQkJLy8KLQkJCUxhYmVsIGtleVR5cGVMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQkJa2V5VHlwZUxhYmVsLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0NPTE9OKTsKLQotCQkJa2V5VHlwZUNvbWJvID0gbmV3IENvbWJvKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCQlrZXlUeXBlQ29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQl1cGRhdGVLZXlUeXBlQ29tYm8oZ2V0RW50cnkoKS5nZXRFbnRyeVR5cGUoKSk7Ci0JCQlrZXlUeXBlQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKGtleVR5cGVDb21ibywKLQkJCS8vIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfRU5UUllfS0VZX1RZUEUpOwotCi0JCQkvLyBhIHBsYWNlaG9sZGVyIHRvIGZpbGwgdGhlIDNyZCBjb2x1bW4KLQkJCUJ1dHRvbiBwbGFjZUhvbGRlciA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5OT05FKTsKLQkJCXBsYWNlSG9sZGVyLnNldFZpc2libGUoZmFsc2UpOwotCi0JCQkvLyBLZXkKLQkJCS8vIAotCQkJTGFiZWwga2V5VmFsdWVMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQkJa2V5VmFsdWVMYWJlbC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9LRVlfQ09MT04pOwotCQkJa2V5RmllbGQgPSBuZXcgVGV4dChncm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKGtleUZpZWxkLAotCQkJLy8gWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MUF9FTlRSWV9LRVkpOwotCQkJa2V5RmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlrZXlGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShnZXRFbnRyeSgpLmdldEtleSgpKSk7Ci0JCQlrZXlGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCUNvbXBvc2l0ZSBncm91cDIgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyb3VwMi5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWdyb3VwMi5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkJLy8gY2hlY2tib3ggLS0gbm90ZSBwYXJlbnQgaXMgZGlhbG9nQXJlYQotCQkJLy8KLQkJCWNoZWNrYm94QnV0dG9uID0gbmV3IEJ1dHRvbihncm91cDIsIFNXVC5DSEVDSyk7Ci0JCQkvLyBXb3JrYmVuY2hIZWxwLnNldEhlbHAoY2hlY2tib3hCdXR0b24sCi0JCQkvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX0VOVFJZX1NQRUNJRllfQUxURVJOQVRJVkUpOwotCQkJY2hlY2tib3hCdXR0b24uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfU1BFQ0lGWV9BTFRFUk5BVElWRV9XRUJfVVJMKTsKLQkJCWNoZWNrYm94QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkJY2hlY2tib3hCdXR0b24uc2V0U2VsZWN0aW9uKGdldEVudHJ5KCkuZ2V0QXR0cmlidXRlVmFsdWUoSUNhdGFsb2dFbnRyeS5BVFRSX1dFQl9VUkwpICE9IG51bGwpOwotCQkJU2VsZWN0aW9uTGlzdGVuZXIgYnV0dG9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCS8vIG5vIGltcGwKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlpZiAoZXZlbnQud2lkZ2V0ID09IGNoZWNrYm94QnV0dG9uKSB7Ci0JCQkJCQl1cGRhdGVXaWRnZXRzKGNoZWNrYm94QnV0dG9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQljaGVja2JveEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihidXR0b25MaXN0ZW5lcik7Ci0KLQkJCS8vIFdlYiBBZGRyZXNzIGZpZWxkCi0JCQkvLwotCi0JCQlNb2RpZnlMaXN0ZW5lciB3ZWJBZGRyZXNzRmllbGRMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJY29tcHV0ZUVycm9yTWVzc2FnZSgpOwotCQkJCQl1cGRhdGVFcnJvck1lc3NhZ2VMYWJlbChlcnJvck1lc3NhZ2VMYWJlbCk7Ci0JCQkJCXVwZGF0ZU9LQnV0dG9uU3RhdGUoKTsKLQkJCQl9Ci0JCQl9OwotCi0JCQl3ZWJBZGRyZXNzRmllbGQgPSBuZXcgVGV4dChncm91cDIsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCS8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscCh3ZWJBZGRyZXNzRmllbGQsCi0JCQkvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX0VOVFJZX1dFQl9BRERSRVNTKTsKLQkJCXdlYkFkZHJlc3NGaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCXdlYkFkZHJlc3NGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShnZXRFbnRyeSgpLmdldEF0dHJpYnV0ZVZhbHVlKElDYXRhbG9nRW50cnkuQVRUUl9XRUJfVVJMKSkpOwotCQkJd2ViQWRkcmVzc0ZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJd2ViQWRkcmVzc0ZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKHdlYkFkZHJlc3NGaWVsZExpc3RlbmVyKTsKLQotCi0JCQllcnJvck1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChncm91cDIsIFNXVC5OT05FKTsKLQkJCWVycm9yTWVzc2FnZUxhYmVsLnNldEZvcmVncm91bmQoY29sb3IpOwotCQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCXVwZGF0ZVdpZGdldHMobnVsbCk7Ci0JCQkKLQkJCWtleSA9IGdldEVudHJ5KCkuZ2V0S2V5KCk7Ci0JCQl0eXBlID0gZ2V0RW50cnkoKS5nZXRFbnRyeVR5cGUoKTsKLQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCi0JCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQlmQ29udHJvbCA9IGNyZWF0ZUNhdGFsb2dFbnRyeVBhbmVsKHBhcmVudCk7Ci0KLQkJCXJldHVybiBmQ29udHJvbDsKLQkJfQotCi0KLQkJcHVibGljIElDYXRhbG9nRWxlbWVudCBnZXREYXRhKCkgewotCQkJcmV0dXJuIGdldEVudHJ5KCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSUNhdGFsb2dFbnRyeSBnZXRFbnRyeSgpIHsKLQkJCWlmIChjYXRhbG9nRW50cnkgPT0gbnVsbCkgewotCQkJCWlmICgoZkNhdGFsb2dFbGVtZW50ICE9IG51bGwpICYmIChmQ2F0YWxvZ0VsZW1lbnQuZ2V0VHlwZSgpID09IElDYXRhbG9nRWxlbWVudC5UWVBFX0VOVFJZKSkgewotCQkJCQljYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgZkNhdGFsb2dFbGVtZW50OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkgewotCQkJCQkJY2F0YWxvZ0VudHJ5ID0gKElDYXRhbG9nRW50cnkpIGNhdGFsb2cuY3JlYXRlQ2F0YWxvZ0VsZW1lbnQoSUNhdGFsb2dFbGVtZW50LlRZUEVfRU5UUlkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNhdGFsb2dFbnRyeTsKLQkJfQotCi0JCXByb3RlY3RlZCBpbnQgZ2V0S2V5VHlwZSgpIHsKLQkJCXN3aXRjaCAoa2V5VHlwZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpIHsKLQkJCQljYXNlIDAgOgotCQkJCQlpZiAoInNjaGVtYSIuZXF1YWxzKGtleVR5cGVDb21iby5nZXREYXRhKCJrZXlUeXBlIikpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJcmV0dXJuIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkk7IC8vIHhzZAotCQkJCQkJCQkJCQkJCQkJCS8vIG5hbWVzcGFjZQotCQkJCQkJCQkJCQkJCQkJCS8vIGlzIFVSSSB0eXBlCi0JCQkJCQkJCQkJCQkJCQkJLy8ga2V5Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUM7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJcmV0dXJuIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9TWVNURU07Ci0JCQkJY2FzZSAyIDoKLQkJCQkJcmV0dXJuIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2F2ZURhdGEoKSB7Ci0JCQlpZiAodmFsaWRhdGVEYXRhKCkpIHsKLQkJCQlnZXRFbnRyeSgpLnNldFVSSShVUklVdGlscy5jb252ZXJ0TG9jYXRpb25Ub1VSSShyZXNvdXJjZUxvY2F0aW9uRmllbGQuZ2V0VGV4dCgpKSk7Ci0JCQkJZ2V0RW50cnkoKS5zZXRLZXkoa2V5RmllbGQuZ2V0VGV4dCgpKTsKLQkJCQlnZXRFbnRyeSgpLnNldEVudHJ5VHlwZShnZXRLZXlUeXBlKCkpOwotCQkJCWdldEVudHJ5KCkuc2V0QXR0cmlidXRlVmFsdWUoSUNhdGFsb2dFbnRyeS5BVFRSX1dFQl9VUkwsIGNoZWNrYm94QnV0dG9uLmdldFNlbGVjdGlvbigpID8gd2ViQWRkcmVzc0ZpZWxkLmdldFRleHQoKSA6IG51bGwpOwotCQkJCWRhdGFTYXZlZCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQllcnJvck1lc3NhZ2UgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfV0FSTklOR19EVVBMSUNBVEVfRU5UUlk7Ci0JCQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChlcnJvck1lc3NhZ2UpOwotCQkJCXVwZGF0ZU9LQnV0dG9uU3RhdGUoKTsKLQkJCQlkYXRhU2F2ZWQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQkKLQkJLyoqCi0JCSAqIFZhbGlkYXRlcyB0aGF0IHRoZSBkYXRhIGVudGVyZWQgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCBhbiBleGlzdGluZyBlbnRyeSBpbiBlaXRoZXIgY2F0YWxvZy4KLQkJICogQHJldHVybiBUcnVlIGlmIHZhbGlkYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVEYXRhKCkgewotCQkKLQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkJaWYgKGtleSA9PSBudWxsIHx8ICFrZXkuZXF1YWxzKGtleUZpZWxkLmdldFRleHQoKSkgfHwgdHlwZSAhPSBnZXRLZXlUeXBlKCkpCi0JCQl7Ci0JCQkJLy8gZ2V0IHN5c3RlbSBjYXRhbG9nCi0JCQkJSUNhdGFsb2cgc3lzdGVtQ2F0YWxvZyA9IG51bGw7CQkJCi0JCQkJSUNhdGFsb2cgZGVmYXVsdENhdGFsb2cgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotCQkJCUlOZXh0Q2F0YWxvZ1tdIG5leHRDYXRhbG9ncyA9IGRlZmF1bHRDYXRhbG9nLmdldE5leHRDYXRhbG9ncygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlOZXh0Q2F0YWxvZyBjYXRhbG9nID0gbmV4dENhdGFsb2dzW2ldOwotCQkJCQlJQ2F0YWxvZyByZWZlcmVuY2VkQ2F0YWxvZyA9IGNhdGFsb2cuZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLQkJCQkJaWYgKHJlZmVyZW5jZWRDYXRhbG9nICE9IG51bGwpIHsKLQkJCQkJCWlmIChYTUxDb3JlUGx1Z2luLlNZU1RFTV9DQVRBTE9HX0lELmVxdWFscyhyZWZlcmVuY2VkQ2F0YWxvZy5nZXRJZCgpKSkgewotCQkJCQkJCXN5c3RlbUNhdGFsb2cgPSByZWZlcmVuY2VkQ2F0YWxvZzsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQl0cnkgewotCQkJCQlzd2l0Y2goIGdldEtleVR5cGUoKSApCi0JCQkJCXsKLQkJCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDOgotCQkJCQkJcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlUHVibGljKGtleUZpZWxkLmdldFRleHQoKSwgbnVsbCk7CQkKLQkJCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQkJCXJlc3VsdCA9IHN5c3RlbUNhdGFsb2cucmVzb2x2ZVB1YmxpYyhrZXlGaWVsZC5nZXRUZXh0KCksIG51bGwpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTToKLQkJCQkJCXJlc3VsdCA9IGNhdGFsb2cucmVzb2x2ZVN5c3RlbShrZXlGaWVsZC5nZXRUZXh0KCkpOwotCQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCQkJcmVzdWx0ID0gc3lzdGVtQ2F0YWxvZy5yZXNvbHZlU3lzdGVtKGtleUZpZWxkLmdldFRleHQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJOgotCQkJCQkJcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlVVJJKGtleUZpZWxkLmdldFRleHQoKSk7Ci0JCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJCQlyZXN1bHQgPSBzeXN0ZW1DYXRhbG9nLnJlc29sdmVVUkkoa2V5RmllbGQuZ2V0VGV4dCgpKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCQotCQkJcmV0dXJuIChyZXN1bHQgPT0gbnVsbCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVLZXlUeXBlQ29tYm8oaW50IHR5cGUpIHsKLQkJCWtleVR5cGVDb21iby5yZW1vdmVBbGwoKTsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IENhdGFsb2dGaWxlVHlwZVJlZ2lzdHJ5UmVhZGVyLmdldFhNTENhdGFsb2dGaWxlVHlwZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlYTUxDYXRhbG9nRmlsZVR5cGUgdGhlRmlsZVR5cGUgPSAoWE1MQ2F0YWxvZ0ZpbGVUeXBlKSBpLm5leHQoKTsKLQkJCQlpZiAodGhlRmlsZVR5cGUuZXh0ZW5zaW9ucyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaiA9IHRoZUZpbGVUeXBlLmV4dGVuc2lvbnMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gKFN0cmluZykgai5uZXh0KCk7Ci0JCQkJCQlpZiAocmVzb3VyY2VMb2NhdGlvbkZpZWxkLmdldFRleHQoKS5lbmRzV2l0aChleHRlbnNpb24pKSB7Ci0JCQkJCQkJaWYgKHRoZUZpbGVUeXBlLmRlc2NyaXB0aW9uLmVxdWFscygiWFNEIEZpbGVzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlrZXlUeXBlQ29tYm8uYWRkKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9YU0RfUFVCTElDKTsKLQkJCQkJCQkJa2V5VHlwZUNvbWJvLmFkZChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fWFNEX1NZU1RFTSk7Ci0JCQkJCQkJCWtleVR5cGVDb21iby5zZXREYXRhKCJrZXlUeXBlIiwgInNjaGVtYSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAodGhlRmlsZVR5cGUuZGVzY3JpcHRpb24uZXF1YWxzKCJEVEQgRmlsZXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCWtleVR5cGVDb21iby5hZGQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9QVUJMSUMpOwotCQkJCQkJCQlrZXlUeXBlQ29tYm8uYWRkKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9EVERfU1lTVEVNKTsKLQkJCQkJCQkJa2V5VHlwZUNvbWJvLmFkZChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fVVJJKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWtleVR5cGVDb21iby5hZGQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1VSSSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQkJCWlmIChrZXlUeXBlQ29tYm8uZ2V0SXRlbUNvdW50KCkgPT0gMCkgewotCQkJCWtleVR5cGVDb21iby5hZGQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9QVUJMSUMpOwotCQkJCWtleVR5cGVDb21iby5hZGQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9TWVNURU0pOwotCQkJCWtleVR5cGVDb21iby5hZGQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1VSSSk7Ci0JCQl9Ci0KLQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQyA6Ci0JCQkJCWtleVR5cGVDb21iby5zZWxlY3QoMCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTSA6Ci0JCQkJCWtleVR5cGVDb21iby5zZWxlY3QoMSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1VSSSA6IC8vIGhhbmRsZSBYTUwgU2NoZW1hLAotCQkJCQkJCQkJCQkJCS8vIHdoZXJlIG5hbWVzcGFjZSBuYW1lIGlzCi0JCQkJCQkJCQkJCQkJLy8gbWFwcGVkIHRvIFVSSSBzaXR1YXRpb24KLQkJCQkJaWYgKCJzY2hlbWEiLmVxdWFscyhrZXlUeXBlQ29tYm8uZ2V0RGF0YSgia2V5VHlwZSIpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWtleVR5cGVDb21iby5zZWxlY3QoMCk7IC8vIG5hbWVzcGFjZSBuYW1lIGFzIFVSSSBrZXkKLQkJCQkJCQkJCQkJCS8vIHR5cGUKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWtleVR5cGVDb21iby5zZWxlY3QoMik7IC8vIFVSSSBrZXkgdHlwZQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlpZiAoa2V5VHlwZUNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCkgewotCQkJCQkJa2V5VHlwZUNvbWJvLnNlbGVjdCgwKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCX0KLQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgdXBkYXRlV2ViQWRkcmVzc1dpZGdldHMoaW50IGtleVR5cGUpIHsKLQkJCWJvb2xlYW4gaXNQdWJsaWNLZXlUeXBlID0gKGtleVR5cGUgPT0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQyk7Ci0JCQljaGVja2JveEJ1dHRvbi5zZXRFbmFibGVkKGlzUHVibGljS2V5VHlwZSk7Ci0JCQl3ZWJBZGRyZXNzRmllbGQuc2V0RW5hYmxlZChpc1B1YmxpY0tleVR5cGUgJiYgY2hlY2tib3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgdXBkYXRlV2lkZ2V0cyhXaWRnZXQgd2lkZ2V0KSB7Ci0JCQlpZiAod2lkZ2V0ICE9IGtleVR5cGVDb21ibykgewotCQkJCXVwZGF0ZUtleVR5cGVDb21ibyhnZXRLZXlUeXBlKCkpOwotCQkJfQotCQkJdXBkYXRlV2ViQWRkcmVzc1dpZGdldHMoZ2V0S2V5VHlwZSgpKTsKLQkJCWNvbXB1dGVFcnJvck1lc3NhZ2UoKTsKLQkJCXVwZGF0ZUVycm9yTWVzc2FnZUxhYmVsKGVycm9yTWVzc2FnZUxhYmVsKTsKLQkJCXVwZGF0ZU9LQnV0dG9uU3RhdGUoKTsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIENhdGFsb2dFbGVtZW50UGFnZSB7Ci0KLQkJQ29udHJvbCBmQ29udHJvbDsKLQotCQlwdWJsaWMgQ2F0YWxvZ0VsZW1lbnRQYWdlKCkgewotCQkJc3VwZXIoKTsKLQotCQl9Ci0KLQkJcHVibGljIGFic3RyYWN0IENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KTsKLQotCQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQkJcmV0dXJuIGZDb250cm9sOwotCQl9Ci0KLQkJcHVibGljIGFic3RyYWN0IElDYXRhbG9nRWxlbWVudCBnZXREYXRhKCk7Ci0KLQkJcHVibGljIGFic3RyYWN0IHZvaWQgc2F2ZURhdGEoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRmlsdGVyYWJsZVNlbGVjdFNpbmdsZUZpbGVEaWFsb2cgZXh0ZW5kcyBTZWxlY3RTaW5nbGVGaWxlRGlhbG9nIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgQ29tYm8gZmlsdGVyQ29udHJvbDsKLQotCQlwdWJsaWMgRmlsdGVyYWJsZVNlbGVjdFNpbmdsZUZpbGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJCXN1cGVyKHBhcmVudFNoZWxsLCBudWxsLCB0cnVlKTsKLQkJCXNldEZpbHRlcnMobnVsbCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjcmVhdGVBbmRPcGVuKCkgewotCQkJdGhpcy5jcmVhdGUoKTsKLQkJCXNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9GSUxFX1NFTEVDVElPTik7Ci0JCQl0aGlzLnNldFRpdGxlKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9TRUxFQ1RfRklMRSk7Ci0JCQl0aGlzLnNldE1lc3NhZ2UoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0NIT09TRV9GSUxFX1RPX0FERF9UT19DQVRBTE9HKTsKLQkJCW9wZW4oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZUZpbHRlckNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9TRUxFQ1RfRklMRV9GSUxURVJfQ09OVFJPTCk7Ci0KLQkJCWZpbHRlckNvbnRyb2wgPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZmlsdGVyQ29udHJvbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkJZmlsdGVyQ29udHJvbC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9URVhUX1NFTEVDVF9GSUxFX0ZJTFRFUl9DT05UUk9MKTsKLQkJCWZpbHRlckNvbnRyb2wuYWRkKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9URVhUX1NFTEVDVF9GSUxFX0ZJTFRFUl9DT05UUk9MKTsKLQotCQkJZm9yIChJdGVyYXRvciBpID0gQ2F0YWxvZ0ZpbGVUeXBlUmVnaXN0cnlSZWFkZXIuZ2V0WE1MQ2F0YWxvZ0ZpbGVUeXBlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVhNTENhdGFsb2dGaWxlVHlwZSBmaWxlVHlwZSA9IChYTUxDYXRhbG9nRmlsZVR5cGUpIGkubmV4dCgpOwotCQkJCWlmIChmaWxlVHlwZS5kZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCWZpbHRlckNvbnRyb2wuYWRkKGZpbGVUeXBlLmRlc2NyaXB0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWZpbHRlckNvbnRyb2wuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRGaWx0ZXJzKFhNTENhdGFsb2dGaWxlVHlwZSBmaWxlVHlwZSkgewotCQkJaWYgKGZpbGVUeXBlID09IG51bGwpIHsKLQkJCQkvLyBjb21wdXRlIGFsbCB0aGUgc3VwcG9ydGVkIGZpbGUgZXh0ZW5zaW9ucwotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBDYXRhbG9nRmlsZVR5cGVSZWdpc3RyeVJlYWRlci5nZXRYTUxDYXRhbG9nRmlsZVR5cGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVhNTENhdGFsb2dGaWxlVHlwZSB0aGVGaWxlVHlwZSA9IChYTUxDYXRhbG9nRmlsZVR5cGUpIGkubmV4dCgpOwotCQkJCQlpZiAodGhlRmlsZVR5cGUuZXh0ZW5zaW9ucyAhPSBudWxsKSB7Ci0JCQkJCQlsaXN0LmFkZEFsbCh0aGVGaWxlVHlwZS5leHRlbnNpb25zKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBBbnkgZmlsZXMgYXJlIG5vdyBzdXBwb3J0ZWQgd2l0aCBSZXNvdXJjZSBVUkkKLQkJCQkvLyBzZWxlY3RTaW5nbGVGaWxlVmlldy5zZXRGaWx0ZXJFeHRlbnNpb25zKGNyZWF0ZVN0cmluZ0FycmF5KGxpc3QpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChmaWxlVHlwZS5leHRlbnNpb25zICE9IG51bGwpIHsKLQkJCQkJc2VsZWN0U2luZ2xlRmlsZVZpZXcuc2V0RmlsdGVyRXh0ZW5zaW9ucyhjcmVhdGVTdHJpbmdBcnJheShmaWxlVHlwZS5leHRlbnNpb25zKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyB0ZXh0ID0gZmlsdGVyQ29udHJvbC5nZXRUZXh0KCk7Ci0JCQlYTUxDYXRhbG9nRmlsZVR5cGUgZmlsZVR5cGUgPSBnZXRNYXRjaGluZ0ZpbGVUeXBlKHRleHQpOwotCQkJc2V0RmlsdGVycyhmaWxlVHlwZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgTmV4dENhdGFsb2dQYWdlIGV4dGVuZHMgQ2F0YWxvZ0VsZW1lbnRQYWdlIHsKLQkJcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQkJcHJvdGVjdGVkIFRleHQgY2F0YWxvZ0xvY2F0aW9uRmllbGQ7Ci0KLQkJcHJvdGVjdGVkIElOZXh0Q2F0YWxvZyBuZXh0Q2F0YWxvZzsKLQotCQlwcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWw7Ci0KLQkJcHJvdGVjdGVkIHZvaWQgY29tcHV0ZUVycm9yTWVzc2FnZSgpIHsKLQkJCWVycm9yTWVzc2FnZSA9IG51bGw7Ci0KLQkJCWlmIChlcnJvck1lc3NhZ2UgPT0gbnVsbCkgewotCQkJCVN0cmluZyBmaWxlTmFtZSA9IGNhdGFsb2dMb2NhdGlvbkZpZWxkLmdldFRleHQoKTsKLQkJCQlpZiAoZmlsZU5hbWUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQlpZiAoKGZpbGVOYW1lLmluZGV4T2YoIi4uIikgIT0gLTEpIHx8IChmaWxlTmFtZS5pbmRleE9mKCIuLyIpICE9IC0xKSB8fCAoZmlsZU5hbWUuaW5kZXhPZigiLy4iKSAhPSAtMSkgfHwgKGZpbGVOYW1lLmluZGV4T2YoIi5cXCIpICE9IC0xKSB8fCAoZmlsZU5hbWUuaW5kZXhPZigiXFwuIikgIT0gLTEpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJCQkJZXJyb3JNZXNzYWdlID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX1dBUk5JTkdfVVJJX01VU1RfTk9UX0hBVkVfRE9UUzsKLQkJCQkJfQotCi0JCQkJCVN0cmluZyB1cmkgPSBmaWxlTmFtZTsKLQkJCQkJaWYgKCFVUklIZWxwZXIuaGFzUHJvdG9jb2wodXJpKSkgewotCQkJCQkJdXJpID0gVVJJSGVscGVyLmlzQWJzb2x1dGUodXJpKSA/IFVSSUhlbHBlci5wcmVwZW5kRmlsZVByb3RvY29sKHVyaSkgOiBVUklIZWxwZXIucHJlcGVuZFBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbCh1cmkpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKChlcnJvck1lc3NhZ2UgPT0gbnVsbCkgJiYgIVVSSUhlbHBlci5pc1JlYWRhYmxlVVJJKHVyaSwgZmFsc2UpKSB7Ci0JCQkJCQllcnJvck1lc3NhZ2UgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfV0FSTklOR19VUklfTk9UX0ZPVU5EX0NPTE9OICsgZmlsZU5hbWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRoaXMgYW4gZXJyb3IgdGhhdCBpcyBub3QgYWN0dWFsbHkKLQkJCQkJLy8gcmVwb3J0ZWQgLi4uIE9LIGlzIGp1c3QgZGlzYWJsZWQKLQkJCQkJZXJyb3JNZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJZkNvbnRyb2wgPSBjcmVhdGVOZXh0Q2F0YWxvZ1BhbmVsKHBhcmVudCk7Ci0JCQlyZXR1cm4gZkNvbnRyb2w7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVOZXh0Q2F0YWxvZ1BhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCU1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQl1cGRhdGVXaWRnZXRzKGUud2lkZ2V0KTsKLQkJCQl9Ci0JCQl9OwotCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkJQ29tcG9zaXRlIGdyb3VwID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJCUxhYmVsIHJlc291cmNlTG9jYXRpb25MYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQkJcmVzb3VyY2VMb2NhdGlvbkxhYmVsLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0NBVEFMT0dfVVJJX0NPTE9OKTsKLQotCQkJLy8gZmlsbGVyCi0JCQluZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLQotCQkJY2F0YWxvZ0xvY2F0aW9uRmllbGQgPSBuZXcgVGV4dChncm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJY2F0YWxvZ0xvY2F0aW9uRmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQljYXRhbG9nTG9jYXRpb25GaWVsZC5zZXRUZXh0KFVSSVV0aWxzLmNvbnZlcnRVUklUb0xvY2F0aW9uKGdldERpc3BsYXlWYWx1ZShnZXROZXh0Q2F0YWxvZygpLmdldENhdGFsb2dMb2NhdGlvbigpKSkpOwotCQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKHJlc291cmNlTG9jYXRpb25GaWVsZCwKLQkJCS8vIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfRU5UUllfVVJJKTsKLQkJCWNhdGFsb2dMb2NhdGlvbkZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCQkJYnJvd3NlQnV0dG9uID0gY3JlYXRlQnJvd3NlQnV0dG9uKGdyb3VwKTsKLQkJCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgRHJvcERvd25TZWxlY3Rpb25MaXN0ZW5lcihjYXRhbG9nTG9jYXRpb25GaWVsZCkpOwotCi0JCQllcnJvck1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCXVwZGF0ZVdpZGdldHMobnVsbCk7Ci0JCQlyZXR1cm4gY29tcG9zaXRlOwotCQl9Ci0KLQkJcHVibGljIElDYXRhbG9nRWxlbWVudCBnZXREYXRhKCkgewotCQkJcmV0dXJuIGdldE5leHRDYXRhbG9nKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSU5leHRDYXRhbG9nIGdldE5leHRDYXRhbG9nKCkgewotCQkJaWYgKG5leHRDYXRhbG9nID09IG51bGwpIHsKLQkJCQlpZiAoKGZDYXRhbG9nRWxlbWVudCAhPSBudWxsKSAmJiAoZkNhdGFsb2dFbGVtZW50LmdldFR5cGUoKSA9PSBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9ORVhUX0NBVEFMT0cpKSB7Ci0JCQkJCW5leHRDYXRhbG9nID0gKElOZXh0Q2F0YWxvZykgZkNhdGFsb2dFbGVtZW50OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkgewotCQkJCQkJbmV4dENhdGFsb2cgPSAoSU5leHRDYXRhbG9nKSBjYXRhbG9nLmNyZWF0ZUNhdGFsb2dFbGVtZW50KElDYXRhbG9nRWxlbWVudC5UWVBFX05FWFRfQ0FUQUxPRyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV4dENhdGFsb2c7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzYXZlRGF0YSgpIHsKLQkJCWdldE5leHRDYXRhbG9nKCkuc2V0Q2F0YWxvZ0xvY2F0aW9uKFVSSVV0aWxzLmNvbnZlcnRMb2NhdGlvblRvVVJJKGNhdGFsb2dMb2NhdGlvbkZpZWxkLmdldFRleHQoKSkpOwotCQkJZGF0YVNhdmVkID0gdHJ1ZTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVdpZGdldHMoV2lkZ2V0IHdpZGdldCkgewotCQkJY29tcHV0ZUVycm9yTWVzc2FnZSgpOwotCQkJdXBkYXRlRXJyb3JNZXNzYWdlTGFiZWwoZXJyb3JNZXNzYWdlTGFiZWwpOwotCQkJdXBkYXRlT0tCdXR0b25TdGF0ZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFRvb2xCYXJJdGVtU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCU9iamVjdCBzZWxlY3Rpb24gPSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFRvb2xJdGVtKSB7Ci0JCQkJaWYgKCFzaG93UGFnZSgoQ2F0YWxvZ0VsZW1lbnRQYWdlKSAoKFRvb2xJdGVtKSBzZWxlY3Rpb24pLmdldERhdGEoKSkpIHsKLQkJCQkJLy8gUGFnZSBmbGlwcGluZyB3YXNuJ3Qgc3VjY2Vzc2Z1bAotCQkJCQkvLyBoYW5kbGVFcnJvcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBjcmVhdGVTdHJpbmdBcnJheShMaXN0IGxpc3QpIHsKLQkJU3RyaW5nW10gc3RyaW5nQXJyYXkgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdBcnJheS5sZW5ndGg7IGkrKykgewotCQkJc3RyaW5nQXJyYXlbaV0gPSAoU3RyaW5nKSBsaXN0LmdldChpKTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nQXJyYXk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlTGVhZGluZ1NsYXNoKFN0cmluZyB1cmkpIHsKLQkJLy8gcmVtb3ZlIGxlYWRpbmcgc2xhc2ggZnJvbSB0aGUgdmFsdWUgdG8gYXZvaWQgdGhlIHdob2xlIGxlYWRpbmcKLQkJLy8gc2xhc2gKLQkJLy8gYW1iaWd1aXR5IHByb2JsZW0KLQkJLy8gICAgICAgCi0JCWlmICh1cmkgIT0gbnVsbCkgewotCQkJd2hpbGUgKHVyaS5zdGFydHNXaXRoKCIvIikgfHwgdXJpLnN0YXJ0c1dpdGgoIlxcIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJdXJpID0gdXJpLnN1YnN0cmluZygxKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdXJpOwotCX0KLQotCXByb3RlY3RlZCBJQ2F0YWxvZyBjYXRhbG9nOwotCi0JcHJvdGVjdGVkIElDYXRhbG9nRWxlbWVudCBmQ2F0YWxvZ0VsZW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTWVzc2FnZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgd2FybmluZ01lc3NhZ2U7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCi0JcHJvdGVjdGVkIFBhZ2VCb29rIHBhZ2VDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgQ2F0YWxvZ0VsZW1lbnRQYWdlIHNlbGVjdGVkUGFnZTsKLQotCS8vIHByb3RlY3RlZCBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgVG9vbEJhciB0b29sQmFyOwotCi0JcHJvdGVjdGVkIENvbG9yIGNvbG9yOwotCXByb3RlY3RlZCBib29sZWFuIGRhdGFTYXZlZDsKLQotCXB1YmxpYyBFZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJQ2F0YWxvZyBhQ2F0YWxvZykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCXRoaXMuY2F0YWxvZyA9IGFDYXRhbG9nOwotCX0KLQotCXB1YmxpYyBFZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJQ2F0YWxvZ0VsZW1lbnQgY2F0YWxvZ0VsZW1lbnQsIElDYXRhbG9nIGFDYXRhbG9nKSB7Ci0JCXRoaXMocGFyZW50U2hlbGwsIGFDYXRhbG9nKTsKLQkJdGhpcy5mQ2F0YWxvZ0VsZW1lbnQgPSBjYXRhbG9nRWxlbWVudDsKLQkJLy8gVE9ETyBFQjogZml4IGhpcwotCQkvLyBlbnRyeS5zZXRVUkkoVVJJSGVscGVyLnJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChlbnRyeS5nZXRVUkkoKSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQlzZWxlY3RlZFBhZ2Uuc2F2ZURhdGEoKTsKLQkJCWlmICghZGF0YVNhdmVkKSB7CQkJCQotCQkJCS8vIGRvIG5vdCBleGl0IGVkaXQgZGlhbG9nCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCQl1cGRhdGVPS0J1dHRvblN0YXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2F0YWxvZ0VudHJ5QnV0dG9uKCkgewotCQlDYXRhbG9nRWxlbWVudFBhZ2UgcGFnZSA9IG5ldyBDYXRhbG9nRW50cnlQYWdlKCk7Ci0JCXBhZ2UuY3JlYXRlQ29udHJvbChwYWdlQ29udGFpbmVyKTsKLQkJVG9vbEl0ZW0gdG9vbEl0ZW0gPSBuZXcgVG9vbEl0ZW0odG9vbEJhciwgU1dULlBVU0gpOwotCQl0b29sSXRlbS5zZXRJbWFnZShjYXRhbG9nRW50cnlUb29sQmFySW1hZ2UpOwotCQl0b29sSXRlbS5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5FZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nX2NhdGFsb2dFbnRyeUxhYmVsKTsKLQkJdG9vbEl0ZW0uc2V0RGF0YShwYWdlKTsKLQkJdG9vbEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFRvb2xCYXJJdGVtU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhQ29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQljb2xvciA9IG5ldyBDb2xvcihkaWFsb2dBcmVhQ29tcG9zaXRlLmdldERpc3BsYXkoKSwgMjAwLCAwLCAwKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJZGlhbG9nQXJlYUNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2Qud2lkdGhIaW50ID0gNTAwOwotCQlnZC5oZWlnaHRIaW50ID0gMjUwOwotCQlkaWFsb2dBcmVhQ29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCQljcmVhdGVNYWluQ29tcG9uZW50KGRpYWxvZ0FyZWFDb21wb3NpdGUpOwotCQlyZXR1cm4gdGhpcy5kaWFsb2dBcmVhOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQlpZiAoY29sb3IgIT0gbnVsbCkgewotCQkJY29sb3IuZGlzcG9zZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlTWFpbkNvbXBvbmVudChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWlmIChmQ2F0YWxvZ0VsZW1lbnQgIT0gbnVsbCkgLy8gImVkaXQiIGFjdGlvbgotCQl7Ci0JCQlDb21wb3NpdGUgY29tcG9zaXRlMSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQljb21wb3NpdGUxLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQljb21wb3NpdGUxLnNldExheW91dChsYXlvdXQpOwotCi0JCQlwYWdlQ29udGFpbmVyID0gbmV3IFBhZ2VCb29rKGNvbXBvc2l0ZTEsIFNXVC5OT05FKTsKLQkJCXBhZ2VDb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJCWlmIChmQ2F0YWxvZ0VsZW1lbnQuZ2V0VHlwZSgpID09IElDYXRhbG9nRWxlbWVudC5UWVBFX0VOVFJZKSB7Ci0JCQkJQ2F0YWxvZ0VsZW1lbnRQYWdlIGVudHJ5UGFnZSA9IG5ldyBDYXRhbG9nRW50cnlQYWdlKCk7Ci0JCQkJZW50cnlQYWdlLmNyZWF0ZUNvbnRyb2wocGFnZUNvbnRhaW5lcik7Ci0JCQkJc2hvd1BhZ2UoZW50cnlQYWdlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZDYXRhbG9nRWxlbWVudC5nZXRUeXBlKCkgPT0gSUNhdGFsb2dFbGVtZW50LlRZUEVfTkVYVF9DQVRBTE9HKSB7Ci0JCQkJQ2F0YWxvZ0VsZW1lbnRQYWdlIG5leHRDYXRhbG9nUGFnZSA9IG5ldyBOZXh0Q2F0YWxvZ1BhZ2UoKTsKLQkJCQluZXh0Q2F0YWxvZ1BhZ2UuY3JlYXRlQ29udHJvbChwYWdlQ29udGFpbmVyKTsKLQkJCQlzaG93UGFnZShuZXh0Q2F0YWxvZ1BhZ2UpOwotCQkJfQotCi0JCQlyZXR1cm4gY29tcG9zaXRlMTsKLQkJfQotCQlyZXR1cm4gY3JlYXRlTWFpbkNvbXBvbmVudFdpdGhUb29sYmFyKGNvbXBvc2l0ZSk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZU1haW5Db21wb25lbnRXaXRoVG9vbGJhcihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0KLQkJRm9ybUxheW91dCBmb3JtTGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKLQkJZm9ybUxheW91dC5tYXJnaW5IZWlnaHQgPSA1OwotCQlmb3JtTGF5b3V0Lm1hcmdpbldpZHRoID0gNTsKLQkJY29tcG9zaXRlLnNldExheW91dChmb3JtTGF5b3V0KTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJdG9vbEJhciA9IG5ldyBUb29sQmFyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5GTEFUIHwgU1dULlZFUlRJQ0FMKTsKLQotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGxhYmVsLCAwKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQkvLyBkYXRhLmhlaWdodCA9IDI1MDsKLQkJLy8gZGF0YS53aWR0aCA9IDUwOwotCQl0b29sQmFyLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZTEgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobGFiZWwsIDApOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodG9vbEJhciwgMCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWNvbXBvc2l0ZTEuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlMS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBjcmVhdGVQYWdlQm9va1BhbmVsKGNvbXBvc2l0ZTEpOwotCQlwYWdlQ29udGFpbmVyID0gbmV3IFBhZ2VCb29rKGNvbXBvc2l0ZTEsIFNXVC5OT05FKTsKLQkJcGFnZUNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBhZGQgcGFnZXMgZm9yIGVhY2ggdHlwZSBvZiBjYXRhbG9nIGVsZW1lbnQKLQkJY3JlYXRlQ2F0YWxvZ0VudHJ5QnV0dG9uKCk7Ci0JCWNyZWF0ZU5leHRDYXRhbG9nQnV0dG9uKCk7Ci0JCWlmICh0b29sQmFyLmdldEl0ZW1Db3VudCgpID4gMCkgewotCQkJVG9vbEl0ZW0gaXRlbSA9IHRvb2xCYXIuZ2V0SXRlbSgwKTsKLQkJCXNob3dQYWdlKChDYXRhbG9nRWxlbWVudFBhZ2UpIChpdGVtLmdldERhdGEoKSkpOwotCQl9Ci0JCXJldHVybiBjb21wb3NpdGUxOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU5leHRDYXRhbG9nQnV0dG9uKCkgewotCQlDYXRhbG9nRWxlbWVudFBhZ2UgcGFnZSA9IG5ldyBOZXh0Q2F0YWxvZ1BhZ2UoKTsKLQkJcGFnZS5jcmVhdGVDb250cm9sKHBhZ2VDb250YWluZXIpOwotCQlUb29sSXRlbSB0b29sSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCXRvb2xJdGVtLnNldEltYWdlKG5leHRDYXRhbG9nVG9vbEJhckltYWdlKTsKLQkJdG9vbEl0ZW0uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuRWRpdENhdGFsb2dFbnRyeURpYWxvZ19uZXh0Q2F0YWxvZ0xhYmVsKTsKLQkJdG9vbEl0ZW0uc2V0RGF0YShwYWdlKTsKLQkJdG9vbEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFRvb2xCYXJJdGVtU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUNhdGFsb2dFbGVtZW50IGdldENhdGFsb2dFbGVtZW50KCkgewotCQlyZXR1cm4gZkNhdGFsb2dFbGVtZW50OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlzcGxheVZhbHVlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZyAhPSBudWxsID8gc3RyaW5nIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MQ2F0YWxvZ0ZpbGVUeXBlIGdldE1hdGNoaW5nRmlsZVR5cGUoU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCVhNTENhdGFsb2dGaWxlVHlwZSBmaWxlVHlwZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IENhdGFsb2dGaWxlVHlwZVJlZ2lzdHJ5UmVhZGVyLmdldFhNTENhdGFsb2dGaWxlVHlwZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCVhNTENhdGFsb2dGaWxlVHlwZSB0aGVGaWxlVHlwZSA9IChYTUxDYXRhbG9nRmlsZVR5cGUpIGkubmV4dCgpOwotCQkJaWYgKCh0aGVGaWxlVHlwZS5kZXNjcmlwdGlvbiAhPSBudWxsKSAmJiB0aGVGaWxlVHlwZS5kZXNjcmlwdGlvbi5lcXVhbHMoZGVzY3JpcHRpb24pKSB7Ci0JCQkJZmlsZVR5cGUgPSB0aGVGaWxlVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZVR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd1BhZ2UoQ2F0YWxvZ0VsZW1lbnRQYWdlIHBhZ2UpIHsKLQkJaWYgKHBhZ2VDb250YWluZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJc2VsZWN0ZWRQYWdlID0gcGFnZTsKLQkJcGFnZUNvbnRhaW5lci5zZXRWaXNpYmxlKHRydWUpOwotCQlwYWdlQ29udGFpbmVyLnNob3dQYWdlKHNlbGVjdGVkUGFnZS5nZXRDb250cm9sKCkpOwotCQlmQ2F0YWxvZ0VsZW1lbnQgPSBzZWxlY3RlZFBhZ2UuZ2V0RGF0YSgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFcnJvck1lc3NhZ2VMYWJlbChMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbCkgewotCQlpZiAoZXJyb3JNZXNzYWdlICE9IG51bGwpIHsKLQkJCWVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoZXJyb3JNZXNzYWdlKTsKLQkJfQotCQllbHNlIGlmICh3YXJuaW5nTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KHdhcm5pbmdNZXNzYWdlKTsKLQkJfQotCQllbHNlIHsKLQkJCWVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoIiIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlT0tCdXR0b25TdGF0ZSgpIHsKLQkJaWYgKG9rQnV0dG9uICE9IG51bGwpIHsKLQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZXJyb3JNZXNzYWdlID09IG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVCcm93c2VCdXR0b24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlCdXR0b24gYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5GTEFUKTsKLQkJLy8gYnJvd3NlQnV0dG9uLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLgotCQkvLyBVSV9CVVRUT05fQlJPV1NFIikpOwotCQlicm93c2VCdXR0b24uc2V0SW1hZ2UoYm9yd3NlSW1hZ2UpOwotCQlSZWN0YW5nbGUgciA9IGJvcndzZUltYWdlLmdldEJvdW5kcygpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlpbnQgSU1BR0VfV0lEVEhfTUFSR0lOID0gNjsKLQkJaW50IElNQUdFX0hFSUdIVF9NQVJHSU4gPSA2OwotCQlnZC5oZWlnaHRIaW50ID0gci5oZWlnaHQgKyBJTUFHRV9IRUlHSFRfTUFSR0lOOwotCQlnZC53aWR0aEhpbnQgPSByLndpZHRoICsgSU1BR0VfV0lEVEhfTUFSR0lOOwotCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJcmV0dXJuIGJyb3dzZUJ1dHRvbjsKLQotCX0KLQotCWNsYXNzIERyb3BEb3duU2VsZWN0aW9uTGlzdGVuZXIgZXh0ZW5kcyBTZWxlY3Rpb25BZGFwdGVyIHsKLQkJcHJpdmF0ZSBNZW51IG1lbnUgPSBudWxsOwotCQlwcml2YXRlIENvbnRyb2wgY29udHJvbDsKLQotCQlwdWJsaWMgRHJvcERvd25TZWxlY3Rpb25MaXN0ZW5lcihDb250cm9sIGFDb250cm9sKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jb250cm9sID0gYUNvbnRyb2w7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJLy8gQ3JlYXRlIHRoZSBtZW51IGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGNyZWF0ZWQKLQkJCWlmIChtZW51ID09IG51bGwpIHsKLQkJCQkvLyBMYXp5IGNyZWF0ZSB0aGUgbWVudS4KLQkJCQltZW51ID0gbmV3IE1lbnUoZ2V0U2hlbGwoKSk7Ci0JCQkJTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCQkJCW1lbnVJdGVtLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0JVVFRPTl9NRU5VX0JST1dTRV9XT1JLU1BBQ0UpOwotCQkJCS8qCi0JCQkJICogQWRkIGEgbWVudSBzZWxlY3Rpb24gbGlzdGVuZXIgc28gdGhhdCB0aGUgbWVudSBpcyBoaWRkZW4KLQkJCQkgKiB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gaXRlbSBmcm9tIHRoZSBkcm9wIGRvd24gbWVudS4KLQkJCQkgKi8KLQkJCQltZW51SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJc2V0TWVudVZpc2libGUoZmFsc2UpOwotCQkJCQkJaW52b2tlV29ya3NwYWNlRmlsZVNlbGVjdGlvbkRpYWxvZygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQltZW51SXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuTk9ORSk7Ci0JCQkJbWVudUl0ZW0uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfQlVUVE9OX01FTlVfQlJPV1NFX0ZJTEVfU1lTVEVNKTsKLQkJCQkvKgotCQkJCSAqIEFkZCBhIG1lbnUgc2VsZWN0aW9uIGxpc3RlbmVyIHNvIHRoYXQgdGhlIG1lbnUgaXMgaGlkZGVuCi0JCQkJICogd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIGl0ZW0gZnJvbSB0aGUgZHJvcCBkb3duIG1lbnUuCi0JCQkJICovCi0JCQkJbWVudUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCXNldE1lbnVWaXNpYmxlKGZhbHNlKTsKLQkJCQkJCWludm9rZUZpbGVTZWxlY3Rpb25EaWFsb2coKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCQl9Ci0KLQkJCS8vIFBvc2l0aW9uIHRoZSBtZW51IGJlbG93IGFuZCB2ZXJ0aWNhbGx5IGFsaWduZWQgd2l0aCB0aGUgdGhlCi0JCQkvLyBkcm9wIGRvd24gdG9vbCBidXR0b24uCi0JCQlCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZXZlbnQud2lkZ2V0OwotCi0JCQkvLyBzZXQgbG9jYXRpb24KLQkJCVBvaW50IHB0QnJvd3NlID0gYnV0dG9uLmdldExvY2F0aW9uKCk7Ci0JCQlSZWN0YW5nbGUgcmNCcm93c2UgPSBidXR0b24uZ2V0Qm91bmRzKCk7Ci0JCQlwdEJyb3dzZS55ICs9IHJjQnJvd3NlLmhlaWdodDsKLQkJCXB0QnJvd3NlID0gYnV0dG9uLmdldFBhcmVudCgpLnRvRGlzcGxheShwdEJyb3dzZSk7Ci0JCQltZW51LnNldExvY2F0aW9uKHB0QnJvd3NlLngsIHB0QnJvd3NlLnkpOwotCi0JCQlzZXRNZW51VmlzaWJsZSh0cnVlKTsKLQotCQl9Ci0KLQkJdm9pZCBzZXRNZW51VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJCW1lbnUuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJCS8vIHRoaXMudmlzaWJsZSA9IHZpc2libGU7Ci0JCX0KLQotCQl2b2lkIGludm9rZVdvcmtzcGFjZUZpbGVTZWxlY3Rpb25EaWFsb2coKSB7Ci0JCQlGaWx0ZXJhYmxlU2VsZWN0U2luZ2xlRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsdGVyYWJsZVNlbGVjdFNpbmdsZUZpbGVEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCQlkaWFsb2cuY3JlYXRlQW5kT3BlbigpOwotCi0JCQlJRmlsZSBmaWxlID0gZGlhbG9nLmdldEZpbGUoKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkvLyByZW1vdmUgbGVhZGluZyBzbGFzaCBmcm9tIHRoZSB2YWx1ZSB0byBhdm9pZCB0aGUKLQkJCQkvLyB3aG9sZSBsZWFkaW5nIHNsYXNoIGFtYmlndWl0eSBwcm9ibGVtCi0JCQkJLy8gICAgICAgICAgICAgICAgICAgIAotCQkJCVN0cmluZyB1cmkgPSBmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQl3aGlsZSAodXJpLnN0YXJ0c1dpdGgoIi8iKSB8fCB1cmkuc3RhcnRzV2l0aCgiXFwiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJdXJpID0gdXJpLnN1YnN0cmluZygxKTsKLQkJCQl9Ci0JCQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJCSgoVGV4dCkgY29udHJvbCkuc2V0VGV4dCh1cmkpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0KLQkJdm9pZCBpbnZva2VGaWxlU2VsZWN0aW9uRGlhbG9nKCkgewotCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhnZXRTaGVsbCgpLCBTV1QuU0lOR0xFKTsKLQkJCVN0cmluZyBmaWxlID0gZGlhbG9nLm9wZW4oKTsKLQkJCWlmICgoY29udHJvbCBpbnN0YW5jZW9mIFRleHQpICYmIChmaWxlICE9IG51bGwpKSB7Ci0JCQkJKChUZXh0KSBjb250cm9sKS5zZXRUZXh0KGZpbGUpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0VsZW1lbnROb2RlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9FbGVtZW50Tm9kZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVjNjFlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0VsZW1lbnROb2RlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWxlbWVudE5vZGVQYWdlIHsKLQotCUNvbnRyb2wgZkNvbnRyb2w7Ci0KLQlwdWJsaWMgRWxlbWVudE5vZGVQYWdlKCkgewotCQlzdXBlcigpOwotCi0JfQotCi0JcHVibGljIGFic3RyYWN0IENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KTsKLQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBmQ29udHJvbDsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzYXZlRGF0YSgpOwotCi0JcHVibGljIGFic3RyYWN0IElDYXRhbG9nRWxlbWVudCBnZXREYXRhKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0ltYWdlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9JbWFnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzOGE3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0ltYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgSW1hZ2VGYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT1BfTEVGVCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9QX1JJR0hUID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1RUT01fTEVGVCA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9UVE9NX1JJR0hUID0gNDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W11bXSBPVkVSTEFZX0NPT1JESU5BVEUgPSB7ezAsIDB9LCB7MCwgMn0sIHsyLCAwfSwgezIsIDJ9fTsKLQotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2VGYWN0b3J5IElOU1RBTkNFID0gbmV3IEltYWdlRmFjdG9yeSgpOwotCi0JcHJvdGVjdGVkIEhhc2h0YWJsZSBjb21wb3NpdGVJbWFnZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JcHVibGljIEltYWdlRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGljb25OYW1lKSB7Ci0JCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0KLQkJaWYgKGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpOwotCQl9Ci0JCWVsc2UgewotCQkJaW1hZ2VSZWdpc3RyeS5wdXQoaWNvbk5hbWUsIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShnZXRDbGFzcygpLCBpY29uTmFtZSkpOwotCQkJcmV0dXJuIGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJbWFnZSBjcmVhdGVDb21wb3NpdGVJbWFnZShJbWFnZSBiYXNlLCBJbWFnZSBvdmVybGF5LCBpbnQgb3ZlcmxheVBvc2l0aW9uKSB7Ci0JCVN0cmluZyBrZXkgPSBiYXNlICsgIioiICsgb3ZlcmxheSArICIqIiArIG92ZXJsYXlQb3NpdGlvbjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUltYWdlIHJlc3VsdCA9IChJbWFnZSkgY29tcG9zaXRlSW1hZ2VUYWJsZS5nZXQoa2V5KTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3Igb3ZlcmxheXNbXVtdID0gbmV3IEltYWdlRGVzY3JpcHRvclszXVszXTsKLQkJCWludFtdIGNvb3JkID0gT1ZFUkxBWV9DT09SRElOQVRFW292ZXJsYXlQb3NpdGlvbl07Ci0JCQlvdmVybGF5c1tjb29yZFsxXV1bY29vcmRbMF1dID0gbmV3IEltYWdlQmFzZWRJbWFnZURlc2NyaXB0b3Iob3ZlcmxheSk7Ci0JCQlPdmVybGF5SWNvbiBpY29uID0gbmV3IE92ZXJsYXlJY29uKG5ldyBJbWFnZUJhc2VkSW1hZ2VEZXNjcmlwdG9yKGJhc2UpLCBvdmVybGF5cywgbmV3IFBvaW50KDE2LCAxNikpOwotCQkJcmVzdWx0ID0gaWNvbi5jcmVhdGVJbWFnZSgpOwotCQkJY29tcG9zaXRlSW1hZ2VUYWJsZS5wdXQoa2V5LCByZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3JXcmFwcGVyKEltYWdlIGltYWdlKSB7Ci0JCXJldHVybiBuZXcgSW1hZ2VCYXNlZEltYWdlRGVzY3JpcHRvcihpbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogQW4gT3ZlcmxheUljb24gY29uc2lzdHMgb2YgYSBtYWluIGljb24gYW5kIHNldmVyYWwgYWRvcm5tZW50cy4KLQkgKi8KLQljbGFzcyBPdmVybGF5SWNvbiBleHRlbmRzIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciB7Ci0KLQkJc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dJRFRIID0gMjI7Ci0KLQkJc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0hFSUdIVCA9IDE2OwotCi0JCXByaXZhdGUgUG9pbnQgZlNpemUgPSBudWxsOwotCi0JCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGZCYXNlOwotCi0JCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGZPdmVybGF5c1tdW107Ci0KLQkJcHVibGljIE92ZXJsYXlJY29uKEltYWdlRGVzY3JpcHRvciBiYXNlLCBJbWFnZURlc2NyaXB0b3JbXVtdIG92ZXJsYXlzLCBQb2ludCBzaXplKSB7Ci0JCQlmQmFzZSA9IGJhc2U7Ci0JCQlmT3ZlcmxheXMgPSBvdmVybGF5czsKLQkJCWZTaXplID0gc2l6ZTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGRyYXdCb3R0b21MZWZ0KEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzKSB7Ci0JCQlpZiAob3ZlcmxheXMgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0JCQlpbnQgeCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJCWlmICgoaSA8IGxlbmd0aCkgJiYgKG92ZXJsYXlzW2ldICE9IG51bGwpKSB7Ci0JCQkJCUltYWdlRGF0YSBpZCA9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOwotCQkJCQlkcmF3SW1hZ2UoaWQsIHgsIGdldFNpemUoKS55IC0gaWQuaGVpZ2h0KTsKLQkJCQkJeCArPSBpZC53aWR0aDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBkcmF3Qm90dG9tUmlnaHQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJCWlmIChvdmVybGF5cyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaW50IGxlbmd0aCA9IG92ZXJsYXlzLmxlbmd0aDsKLQkJCWludCB4ID0gZ2V0U2l6ZSgpLng7Ci0JCQlmb3IgKGludCBpID0gMjsgaSA+PSAwOyBpLS0pIHsKLQkJCQlpZiAoKGkgPCBsZW5ndGgpICYmIChvdmVybGF5c1tpXSAhPSBudWxsKSkgewotCQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQkJeCAtPSBpZC53aWR0aDsKLQkJCQkJZHJhd0ltYWdlKGlkLCB4LCBnZXRTaXplKCkueSAtIGlkLmhlaWdodCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yI2RyYXdDb21wb3NpdGVJbWFnZShpbnQsIGludCkKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJCUltYWdlRGF0YSBiZzsKLQkJCWlmICgoZkJhc2UgPT0gbnVsbCkgfHwgKChiZyA9IGZCYXNlLmdldEltYWdlRGF0YSgpKSA9PSBudWxsKSkgewotCQkJCWJnID0gREVGQVVMVF9JTUFHRV9EQVRBOwotCQkJfQotCQkJZHJhd0ltYWdlKGJnLCAwLCAwKTsKLQotCQkJaWYgKGZPdmVybGF5cyAhPSBudWxsKSB7Ci0JCQkJaWYgKGZPdmVybGF5cy5sZW5ndGggPiAwKSB7Ci0JCQkJCWRyYXdUb3BSaWdodChmT3ZlcmxheXNbMF0pOwotCQkJCX0KLQotCQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMSkgewotCQkJCQlkcmF3Qm90dG9tUmlnaHQoZk92ZXJsYXlzWzFdKTsKLQkJCQl9Ci0KLQkJCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDIpIHsKLQkJCQkJZHJhd0JvdHRvbUxlZnQoZk92ZXJsYXlzWzJdKTsKLQkJCQl9Ci0KLQkJCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDMpIHsKLQkJCQkJZHJhd1RvcExlZnQoZk92ZXJsYXlzWzNdKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBkcmF3VG9wTGVmdChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgewotCQkJaWYgKG92ZXJsYXlzID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpbnQgbGVuZ3RoID0gb3ZlcmxheXMubGVuZ3RoOwotCQkJaW50IHggPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCQlpZiAoKGkgPCBsZW5ndGgpICYmIChvdmVybGF5c1tpXSAhPSBudWxsKSkgewotCQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQkJZHJhd0ltYWdlKGlkLCB4LCAwKTsKLQkJCQkJeCArPSBpZC53aWR0aDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBkcmF3VG9wUmlnaHQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJCWlmIChvdmVybGF5cyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaW50IGxlbmd0aCA9IG92ZXJsYXlzLmxlbmd0aDsKLQkJCWludCB4ID0gZ2V0U2l6ZSgpLng7Ci0JCQlmb3IgKGludCBpID0gMjsgaSA+PSAwOyBpLS0pIHsKLQkJCQlpZiAoKGkgPCBsZW5ndGgpICYmIChvdmVybGF5c1tpXSAhPSBudWxsKSkgewotCQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQkJeCAtPSBpZC53aWR0aDsKLQkJCQkJZHJhd0ltYWdlKGlkLCB4LCAwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IjZ2V0U2l6ZSgpCi0JCSAqLwotCQlwcm90ZWN0ZWQgUG9pbnQgZ2V0U2l6ZSgpIHsKLQkJCXJldHVybiBmU2l6ZTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBJbWFnZUJhc2VkSW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgSW1hZ2VEZXNjcmlwdG9yIHsKLQkJcHJvdGVjdGVkIEltYWdlIGltYWdlOwotCi0JCXB1YmxpYyBJbWFnZUJhc2VkSW1hZ2VEZXNjcmlwdG9yKEltYWdlIGltYWdlKSB7Ci0JCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2VEYXRhIGdldEltYWdlRGF0YSgpIHsKLQkJCXJldHVybiBpbWFnZS5nZXRJbWFnZURhdGEoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvVVJJVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvVVJJVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEwYzJiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1VSSVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLQotcHVibGljIGNsYXNzIFVSSVV0aWxzIHsKLQkKLQkgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9UT0NPTF9QQVRURVJOID0gIjoiOyAKLQkgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MID0gImZpbGU6IjsKLQkgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9SRVNPVVJDRV9QUk9UT0NPTCA9ICJwbGF0Zm9ybTovcmVzb3VyY2UvIjsKLQkgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9GSUxFX1BST1RPQ09MX0ZPUldBUkRfU0xBU0ggPSAiXFxcXFxcIjsKLQkgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9GSUxFX1BST1RPQ09MX0JBQ0tfU0xBU0ggPSAiLy8vIjsKLQkgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgICBQQVRIX1NFUEFSQVRPUl9GT1JXQVJEX1NMQVNIID0gJy8nOwotCSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciAgIFBBVEhfU0VQQVJBVE9SX0JBQ0tfU0xBU0ggPSAnXFwnOwotCSAgCi0JICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VVJJVG9Mb2NhdGlvbihTdHJpbmcgdXJpKSB7Ci0JCQlTdHJpbmcgbG9jYXRpb24gPSB1cmk7Ci0JCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQlpZiAodXJpLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCkpIHsKLQkJCQkJbG9jYXRpb24gPSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLlVSSS5jcmVhdGVVUkkodXJpKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQkJaWYgKGxvY2F0aW9uICE9IG51bGwgJiYgKGxvY2F0aW9uLnN0YXJ0c1dpdGgoTE9DQUxfRklMRV9QUk9UT0NPTF9CQUNLX1NMQVNIKQotCQkJCQkJCXx8IGxvY2F0aW9uLnN0YXJ0c1dpdGgoTE9DQUxfRklMRV9QUk9UT0NPTF9GT1JXQVJEX1NMQVNIKSkpIHsKLQkJCQkJCWxvY2F0aW9uID0gbG9jYXRpb24uc3Vic3RyaW5nKExPQ0FMX0ZJTEVfUFJPVE9DT0xfQkFDS19TTEFTSC5sZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHVyaS5zdGFydHNXaXRoKFBMQVRGT1JNX1JFU09VUkNFX1BST1RPQ09MKSkgewotCQkJCQlsb2NhdGlvbiA9IHVyaS5zdWJzdHJpbmcoUExBVEZPUk1fUkVTT1VSQ0VfUFJPVE9DT0wubGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0KLQkJcmV0dXJuIGxvY2F0aW9uOwotCSAgfQotCSAgCi0JICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0TG9jYXRpb25Ub1VSSShTdHJpbmcgbG9jYXRpb24pIHsKLQkJICBTdHJpbmcgdXJpID0gbG9jYXRpb247Ci0JCQlpZiAoIVVSSUhlbHBlci5oYXNQcm90b2NvbChsb2NhdGlvbikpIHsKLQkJCQl1cmkgPSBVUklIZWxwZXIuaXNBYnNvbHV0ZShsb2NhdGlvbik/IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwuVVJJLmNyZWF0ZUZpbGVVUkkobG9jYXRpb24pLnRvU3RyaW5nKCkKLQkJCQkJCTogVVJJSGVscGVyLnByZXBlbmRQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2wobG9jYXRpb24pOwotCQkJfQotCQkJaWYgKHVyaS5zdGFydHNXaXRoKEZJTEVfUFJPVE9DT0wpICYmIHVyaS5pbmRleE9mKFBST1RPQ09MX1BBVFRFUk4sIEZJTEVfUFJPVE9DT0wubGVuZ3RoKCkpICE9IC0xKSB7Ci0JCQkJdXJpID0gVVJJSGVscGVyLmVuc3VyZUZpbGVVUklQcm90b2NvbEZvcm1hdCh1cmkpOwotCQkJfQotCQkJdXJpID0gdXJpLnJlcGxhY2UoUEFUSF9TRVBBUkFUT1JfQkFDS19TTEFTSCwgUEFUSF9TRVBBUkFUT1JfRk9SV0FSRF9TTEFTSCk7Ci0JCQlyZXR1cm4gdXJpOwotCSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dFbnRyaWVzVmlldy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nRW50cmllc1ZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJmOGJiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dFbnRyaWVzVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cuQ2F0YWxvZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLQotCi1wdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZ0VudHJpZXNWaWV3IGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgQnV0dG9uIG5ld0J1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGVkaXRCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZWxldGVCdXR0b247Ci0JcHJvdGVjdGVkIFhNTENhdGFsb2dUcmVlVmlld2VyIHRhYmxlVmlld2VyOwotCXByb3RlY3RlZCBJQ2F0YWxvZyB3b3JraW5nVXNlckNhdGFsb2c7Ci0JcHJvdGVjdGVkIElDYXRhbG9nIHN5c3RlbUNhdGFsb2c7Ci0KLQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhZ2VFbmFibGVkID0gdHJ1ZTsKLQotCXB1YmxpYyBYTUxDYXRhbG9nRW50cmllc1ZpZXcoQ29tcG9zaXRlIHBhcmVudCwgSUNhdGFsb2cgd29ya2luZ1VzZXJDYXRhbG9nLCBJQ2F0YWxvZyBzeXN0ZW1DYXRhbG9nKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLndvcmtpbmdVc2VyQ2F0YWxvZyA9IHdvcmtpbmdVc2VyQ2F0YWxvZzsKLQkJdGhpcy5zeXN0ZW1DYXRhbG9nID0gc3lzdGVtQ2F0YWxvZzsKLQotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQl0aGlzLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQl0YWJsZVZpZXdlciA9IGNyZWF0ZVRhYmxlVmlld2VyKHRoaXMpOwotCQl0YWJsZVZpZXdlci5zZXRJbnB1dCgiZHVtbXkiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMjY5MgotCQkvLyBzcGVjaWZpY2FsbHkgc2V0IHNpemUgb2YgdHJlZSBiZWZvcmUgZXhwYW5kaW5nIGl0Ci0JCVBvaW50IGluaXRpYWxTaXplID0gdGFibGVWaWV3ZXIuZ2V0VHJlZSgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IGluaXRpYWxTaXplLng7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBpbml0aWFsU2l6ZS55OwotCQl0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQl0YWJsZVZpZXdlci5leHBhbmRUb0xldmVsKDIpOwotCQl0YWJsZVZpZXdlci5yZXZlYWwoWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIuVVNFUl9TUEVDSUZJRURfRU5UUklFU19PQkpFQ1QpOwotCQkKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVXaWRnZXRFbmFibGVkU3RhdGUoKTsKLQkJCX0KLQkJfTsKLQkJdGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQljcmVhdGVCdXR0b25zKHRoaXMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUxlYWRpbmdTbGFzaChTdHJpbmcgdXJpKSB7Ci0JCS8vIHJlbW92ZSBsZWFkaW5nIHNsYXNoIGZyb20gdGhlIHZhbHVlIHRvIGF2b2lkIHRoZSB3aG9sZSBsZWFkaW5nCi0JCS8vIHNsYXNoIGFtYmlndWl0eSBwcm9ibGVtCi0JCS8vICAgICAgIAotCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCXdoaWxlICh1cmkuc3RhcnRzV2l0aCgiLyIpIHx8IHVyaS5zdGFydHNXaXRoKCJcXCIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXsKLQkJCQl1cmkgPSB1cmkuc3Vic3RyaW5nKDEpOwotCQkJfQotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JcHJvdGVjdGVkIFhNTENhdGFsb2dUcmVlVmlld2VyIGNyZWF0ZVRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RyaW5nIGhlYWRpbmdzW10gPSBuZXcgU3RyaW5nWzJdOwotCQloZWFkaW5nc1swXSA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9LRVk7Ci0JCWhlYWRpbmdzWzFdID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX1VSSTsKLQotCQlYTUxDYXRhbG9nVHJlZVZpZXdlciB0aGVUYWJsZVZpZXdlciA9IG5ldyBYTUxDYXRhbG9nVHJlZVZpZXdlcihwYXJlbnQsIHdvcmtpbmdVc2VyQ2F0YWxvZywgc3lzdGVtQ2F0YWxvZyk7Ci0JCXJldHVybiB0aGVUYWJsZVZpZXdlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWdyaWRMYXlvdXQubWFyZ2luTGVmdCA9IDM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgPT0gbmV3QnV0dG9uKSB7Ci0JCQkJCXBlcmZvcm1OZXcoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZS53aWRnZXQgPT0gZWRpdEJ1dHRvbikgewotCQkJCQlwZXJmb3JtRWRpdCgpOwotCQkJCX0KLQkJCQllbHNlIGlmIChlLndpZGdldCA9PSBkZWxldGVCdXR0b24pIHsKLQkJCQkJcGVyZm9ybURlbGV0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQkvLyBhZGQgdGhlICJOZXcuLi4iIGJ1dHRvbgotCQkvLwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0KLQkJbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbmV3QnV0dG9uLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0JVVFRPTl9ORVcpOwotCQkvLyBXb3JrYmVuY2hIZWxwLnNldEhlbHAobmV3QnV0dG9uLAotCQkvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX01BUFBJTkdfTkVXKTsKLQkJbmV3QnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQluZXdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCS8vIGFkZCB0aGUgIkVkaXQuLi4iIGJ1dHRvbgotCQkvLwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWVkaXRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQllZGl0QnV0dG9uLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0JVVFRPTl9FRElUKTsKLQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKGVkaXRCdXR0b24sCi0JCS8vIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfTUFQUElOR19FRElUKTsKLQkJZWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJLy8gYWRkIHRoZSAiRGVsZXRlIiBidXR0b24KLQkJLy8KLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlkZWxldGVCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlkZWxldGVCdXR0b24uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfQlVUVE9OX1JFTU9WRSk7Ci0JCS8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscChkZWxldGVCdXR0b24sCi0JCS8vIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfTUFQUElOR19ERUxFVEUpOwotCQlkZWxldGVCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWRlbGV0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCQotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gNDsKLQotCQlCdXR0b24gaGlkZGVuQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJaGlkZGVuQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQloaWRkZW5CdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCWhpZGRlbkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkvLyBhIGNydWRkeSBoYWNrIHNvIHRoYXQgdGhlIFByZWZlcmVuY2VEaWFsb2cgZG9lc24ndCBjbG9zZSBldmVyeSB0aW1lCi0JCS8vIHdlIHByZXNzICdlbnRlcicKLQkJLy8KLQkJZ2V0U2hlbGwoKS5zZXREZWZhdWx0QnV0dG9uKGhpZGRlbkJ1dHRvbik7Ci0JCXVwZGF0ZVdpZGdldEVuYWJsZWRTdGF0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRhYmxlVmlld2VyLnJlZnJlc2goKTsvLyBYTUxDYXRhbG9nVHJlZVZpZXdlci5VU0VSX1NQRUNJRklFRF9FTlRSSUVTX09CSkVDVCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXRDYXRhbG9nRW50cnlEaWFsb2cgaW52b2tlRGlhbG9nKFN0cmluZyB0aXRsZSwgSUNhdGFsb2dFbGVtZW50IGVudHJ5LCBJQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCVNoZWxsIHNoZWxsID0gWE1MVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQlFZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nIGRpYWxvZyA9IGVudHJ5ICE9IG51bGwgPyBuZXcgRWRpdENhdGFsb2dFbnRyeURpYWxvZyhzaGVsbCwgZW50cnksIGNhdGFsb2cpIDogbmV3IEVkaXRDYXRhbG9nRW50cnlEaWFsb2coc2hlbGwsIGNhdGFsb2cpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQodGl0bGUpOwotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybiBkaWFsb2c7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXRDYXRhbG9nRW50cnlEaWFsb2cgaW52b2tlRGlhbG9nKFN0cmluZyB0aXRsZSwgSUNhdGFsb2cgY2F0YWxvZykgewotCQlyZXR1cm4gaW52b2tlRGlhbG9nKHRpdGxlLCBudWxsLCBjYXRhbG9nKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1OZXcoKSB7Ci0KLQkJLy8gSUNhdGFsb2dFbnRyeSBuZXdFbnRyeSA9Ci0JCS8vIChJQ2F0YWxvZ0VudHJ5KXdvcmtpbmdVc2VyQ2F0YWxvZy5jcmVhdGVDYXRhbG9nRWxlbWVudChJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9FTlRSWSk7Ci0JCUVkaXRDYXRhbG9nRW50cnlEaWFsb2cgZGlhbG9nID0gaW52b2tlRGlhbG9nKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ORVdfRElBTE9HX1RJVExFLCB3b3JraW5nVXNlckNhdGFsb2cpOwotCQlJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCA9IGRpYWxvZy5nZXRDYXRhbG9nRWxlbWVudCgpOwotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCXdvcmtpbmdVc2VyQ2F0YWxvZy5hZGRDYXRhbG9nRWxlbWVudChlbGVtZW50KTsKLQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlbGVtZW50KSwgdHJ1ZSk7Ci0JCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRWRpdCgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSA/ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkgOiBudWxsOwotCi0JCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElDYXRhbG9nRWxlbWVudCkgewotCQkJSUNhdGFsb2dFbGVtZW50IG9sZEVudHJ5ID0gKElDYXRhbG9nRWxlbWVudCkgc2VsZWN0ZWRPYmplY3Q7Ci0JCQlJQ2F0YWxvZ0VsZW1lbnQgbmV3RW50cnkgPSAoSUNhdGFsb2dFbGVtZW50KSAoKENhdGFsb2dFbGVtZW50KSBvbGRFbnRyeSkuY2xvbmUoKTsKLQotCQkJRWRpdENhdGFsb2dFbnRyeURpYWxvZyBkaWFsb2cgPSBpbnZva2VEaWFsb2coWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0VESVRfRElBTE9HX1RJVExFLCBuZXdFbnRyeSwgd29ya2luZ1VzZXJDYXRhbG9nKTsKLQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJCS8vIGRlbGV0ZSB0aGUgb2xkIHZhbHVlIGlmIHRoZSAnbWFwRnJvbScgaGFzIGNoYW5nZWQKLQkJCQkvLwotCQkJCXdvcmtpbmdVc2VyQ2F0YWxvZy5yZW1vdmVDYXRhbG9nRWxlbWVudChvbGRFbnRyeSk7Ci0KLQkJCQkvLyB1cGRhdGUgdGhlIG5ldyBtYXBwaW5nCi0JCQkJLy8KLQkJCQl3b3JraW5nVXNlckNhdGFsb2cuYWRkQ2F0YWxvZ0VsZW1lbnQobmV3RW50cnkpOwotCQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXdFbnRyeSkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlbGV0ZSgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbGVtZW50KSB7Ci0JCQkJCUlDYXRhbG9nRWxlbWVudCBjYXRhbG9nRWxlbWVudCA9IChJQ2F0YWxvZ0VsZW1lbnQpIHNlbGVjdGVkT2JqZWN0OwotCQkJCQl3b3JraW5nVXNlckNhdGFsb2cucmVtb3ZlQ2F0YWxvZ0VsZW1lbnQoY2F0YWxvZ0VsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVdpZGdldEVuYWJsZWRTdGF0ZSgpIHsKLQkJYm9vbGVhbiBpc0VkaXRhYmxlID0gZmFsc2U7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWJvb2xlYW4gbXVsdGlwbGVTZWxlY3Rpb24gPSBmYWxzZTsKLQkJaWYoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotCQkJaWYoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJbXVsdGlwbGVTZWxlY3Rpb24gPSB0cnVlOwotCQkJfQotCQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElDYXRhbG9nRWxlbWVudCkgewotCQkJCUlDYXRhbG9nRWxlbWVudFtdIGVsZW1lbnRzID0gKChDYXRhbG9nKSB3b3JraW5nVXNlckNhdGFsb2cpLmdldENhdGFsb2dFbGVtZW50cygpOwotCQkJCS8vIGR3IExpc3QgZW50cmllc0xpc3QgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnRzLmxlbmd0aCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCQlpc0VkaXRhYmxlID0gc2VsZWN0ZWRPYmplY3QuZXF1YWxzKGVsZW1lbnQpOwotCQkJCQlpZiAoaXNFZGl0YWJsZSkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiAoaXNQYWdlRW5hYmxlZCkKLQkJewotCQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGlzRWRpdGFibGUgJiAhbXVsdGlwbGVTZWxlY3Rpb24pOwotCQkJZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoaXNFZGl0YWJsZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIHB1YmxpYyB2b2lkIHNldFBhZ2VFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgeyBpc1BhZ2VFbmFibGVkID0gZW5hYmxlZDsKLQkgKiAKLQkgKiB0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChpc1BhZ2VFbmFibGVkKTsKLQkgKiAKLQkgKiBuZXdCdXR0b24uc2V0RW5hYmxlZChpc1BhZ2VFbmFibGVkKTsKLQkgKiBlZGl0QnV0dG9uLnNldEVuYWJsZWQoaXNQYWdlRW5hYmxlZCk7Ci0JICogZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoaXNQYWdlRW5hYmxlZCk7IH0KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVQYWdlKCkgewotCQlyZWZyZXNoKCk7Ci0JCXVwZGF0ZVdpZGdldEVuYWJsZWRTdGF0ZSgpOwotCX0KLQotCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gdGFibGVWaWV3ZXI7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ0VudHJ5RGV0YWlsc1ZpZXcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ0VudHJ5RGV0YWlsc1ZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU5N2ExYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dFbnRyeURldGFpbHNWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZzsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2Nyb2xsQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLQotCi0KLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nRW50cnlEZXRhaWxzVmlldyB7Ci0JcHJvdGVjdGVkIFRleHQgZGV0YWlsc1RleHQ7Ci0JcHJvdGVjdGVkIFNjcm9sbEJhciB2ZXJ0aWNhbFNjcm9sbCwgaG9yaXpvbnRhbFNjcm9sbDsKLQotCXB1YmxpYyBYTUxDYXRhbG9nRW50cnlEZXRhaWxzVmlldyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbG9yIGNvbG9yID0gcGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKTsKLQotCQlkZXRhaWxzVGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhlaWdodEhpbnQgPSA4NTsKLQkJZGV0YWlsc1RleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl2ZXJ0aWNhbFNjcm9sbCA9IGRldGFpbHNUZXh0LmdldFZlcnRpY2FsQmFyKCk7Ci0JCS8vIHZlcnRpY2FsU2Nyb2xsLnNldFZpc2libGUoZmFsc2UpOwotCQlob3Jpem9udGFsU2Nyb2xsID0gZGV0YWlsc1RleHQuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQlkZXRhaWxzVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWRldGFpbHNUZXh0LnNldEJhY2tncm91bmQoY29sb3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhdGFsb2dFbGVtZW50KElDYXRhbG9nRW50cnkgZW50cnkpIHsKLQkJaWYgKGVudHJ5ID09IG51bGwpIHsKLQkJCWRldGFpbHNUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgdmFsdWUgPSBnZXREaXNwbGF5VmFsdWUoZW50cnkgIT0gbnVsbCA/IGVudHJ5LmdldFVSSSgpIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBsaW5lMSA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ERVRBSUxTX1VSSV9DT0xPTiArICJcdFx0IiArIHZhbHVlOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIGxpbmUwOwotCQlpZiAodmFsdWUuc3RhcnRzV2l0aCgiamFyOmZpbGU6IikpIHsKLQkJCVN0cmluZyBqYXJGaWxlID0gVVJJVXRpbHMuY29udmVydFVSSVRvTG9jYXRpb24oVVJJSGVscGVyLmVuc3VyZVVSSVByb3RvY29sRm9ybWF0KHZhbHVlLnN1YnN0cmluZygiamFyOiIubGVuZ3RoKCksIHZhbHVlLmluZGV4T2YoJyEnKSkpKTsKLQkJCVN0cmluZyBpbnRlcm5hbEZpbGUgPSBVUklVdGlscy5jb252ZXJ0VVJJVG9Mb2NhdGlvbihVUklIZWxwZXIuZW5zdXJlVVJJUHJvdG9jb2xGb3JtYXQoImZpbGU6Ly8iICsgdmFsdWUuc3Vic3RyaW5nKHZhbHVlLmluZGV4T2YoJyEnKSArIDEpKSk7Ci0JCQlsaW5lMCA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ERVRBSUxTX1VSSV9MT0NBVElPTiArICJcdCIgKyBpbnRlcm5hbEZpbGUgKyAiICIgKyBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfREVUQUlMU19JTl9KQVJfRklMRSArICIgIiArIGphckZpbGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWx1ZSA9IFVSSVV0aWxzLmNvbnZlcnRVUklUb0xvY2F0aW9uKHZhbHVlKTsKLQkJCWxpbmUwID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0RFVEFJTFNfVVJJX0xPQ0FUSU9OICsgIlx0IiArIHZhbHVlOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JCXZhbHVlID0gZW50cnkgIT0gbnVsbCA/IGdldEtleVR5cGVWYWx1ZShlbnRyeSkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbGluZTIgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVUQUlMU19DT0xPTiArICJcdCIgKyB2YWx1ZTsgLy8kTk9OLU5MUy0xJAotCi0JCXZhbHVlID0gZ2V0RGlzcGxheVZhbHVlKGVudHJ5ICE9IG51bGwgPyBlbnRyeS5nZXRLZXkoKSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbGluZTMgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfREVUQUlMU19LRVlfQ09MT04gKyAiXHRcdCIgKyB2YWx1ZTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBlbnRpcmVTdHJpbmcgPSAiXG4iICsgbGluZTAgKyAiXG4iICsgbGluZTEgKyAiXG4iICsgbGluZTIgKyAiXG4iICsgbGluZTM7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCWRldGFpbHNUZXh0LnNldFRleHQoZW50aXJlU3RyaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nRWxlbWVudChJTmV4dENhdGFsb2cgbmV4dENhdGFsb2cpIHsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0RGlzcGxheVZhbHVlKG5leHRDYXRhbG9nICE9IG51bGwgPyBuZXh0Q2F0YWxvZy5nZXRDYXRhbG9nTG9jYXRpb24oKSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbGluZTEgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfREVUQUlMU19VUklfQ09MT04gKyAiXHRcdCIgKyB2YWx1ZTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBsaW5lMCA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ERVRBSUxTX1VSSV9MT0NBVElPTiArICJcdCIgKyBVUklVdGlscy5jb252ZXJ0VVJJVG9Mb2NhdGlvbih2YWx1ZSk7Ci0KLQkJU3RyaW5nIGVudGlyZVN0cmluZyA9ICJcbiIgKyBsaW5lMCArICJcbiIgKyBsaW5lMTsgLy8kTk9OLU5MUy0xJAotCQlkZXRhaWxzVGV4dC5zZXRUZXh0KGVudGlyZVN0cmluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaXNwbGF5VmFsdWUoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nICE9IG51bGwgPyBzdHJpbmcgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5VHlwZVZhbHVlKElDYXRhbG9nRW50cnkgZW50cnkpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmICgoZW50cnkuZ2V0VVJJKCkgIT0gbnVsbCkgJiYgZW50cnkuZ2V0VVJJKCkuZW5kc1dpdGgoInhzZCIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCXJlc3VsdCA9IChlbnRyeS5nZXRFbnRyeVR5cGUoKSA9PSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJKSA/IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9YU0RfUFVCTElDIDogWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1hTRF9TWVNURU07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzd2l0Y2ggKGVudHJ5LmdldEVudHJ5VHlwZSgpKSB7Ci0JCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDIDoKLQkJCQkJcmVzdWx0ID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9QVUJMSUM7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTSA6Ci0JCQkJCXJlc3VsdCA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9EVERfU1lTVEVNOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmVzdWx0ID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1VSSTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ0ZpbGVUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dGaWxlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWRiNzY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ0ZpbGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotcHVibGljIGNsYXNzIFhNTENhdGFsb2dGaWxlVHlwZSB7Ci0JcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbjsKLQlwdWJsaWMgTGlzdCBleHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCXB1YmxpYyBTdHJpbmcgaWNvbkZpbGVOYW1lOwotCXB1YmxpYyBJbWFnZSBpY29uOwotCi0JcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9ucyhTdHJpbmcgY29udHJpYnV0ZWRFeHRlbnNpb25zKSB7Ci0JCUxpc3QgbGlzdCA9IHBhcnNlRXh0ZW5zaW9ucyhjb250cmlidXRlZEV4dGVuc2lvbnMpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGV4dGVuc2lvbiA9IChTdHJpbmcpIGkubmV4dCgpOwotCQkJaWYgKCFleHRlbnNpb25zLmNvbnRhaW5zKGV4dGVuc2lvbikpIHsKLQkJCQlleHRlbnNpb25zLmFkZChleHRlbnNpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgcGFyc2VFeHRlbnNpb25zKFN0cmluZyBzdHJpbmcpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyaW5nLCAiLCAiKTsgc3QuaGFzTW9yZVRva2VucygpOykgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlTdHJpbmcgdG9rZW4gPSBzdC5uZXh0VG9rZW4oKTsKLQkJCWlmICh0b2tlbiAhPSBudWxsKSB7Ci0JCQkJbGlzdC5hZGQodG9rZW4pOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzdjMTk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgWE1MIEVkaXRvcgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNTENhdGFsb2dNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZy5YTUxDYXRhbG9nUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9XSVpBUkRfU0NIRU1BX0FORF9OQU1FX1NQQUNFX0lORk87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfTkFNRV9TUEFDRV9QUkVGSVg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfTkFNRV9TUEFDRV9VUkk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfWFNEX0xPQ0FUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0RPQ1RZUEVfSU5GT1JNQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU1lTVEVNX0lEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1BVQkxJQ19JRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9TRUxFQ1RfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9LRVk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfS0VZX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0RFVEFJTFNfS0VZX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0RFVEFJTFNfSU5fSkFSX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfVVJJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0xPQ0FUSU9OX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0NBVEFMT0dfVVJJX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0RFVEFJTFNfVVJJX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0RFVEFJTFNfVVJJX0xPQ0FUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0tFWV9UWVBFX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0tFWV9UWVBFX0RFVEFJTFNfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fWFNEX1BVQkxJQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9LRVlfVFlQRV9ERVNDUklQVElPTl9YU0RfU1lTVEVNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9QVUJMSUM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fRFREX1NZU1RFTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9LRVlfVFlQRV9ERVNDUklQVElPTl9VUkk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU1BFQ0lGWV9BTFRFUk5BVElWRV9XRUJfVVJMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfVVJJX01VU1RfTk9UX0hBVkVfRE9UUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9GSUxFX1NFTEVDVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9DSE9PU0VfRklMRV9UT19BRERfVE9fQ0FUQUxPRzsKLQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfV0FSTklOR19VUklfTk9UX0ZPVU5EX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfVVJJX05PVF9GT1VORF9MT05HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfSU5WQUxJRF9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfSU5WQUxJRF9GSUxFX0xPTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfV0FSTklOR19OT19FTEVNRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfTk9fRUxFTUVOVF9EVERfTE9ORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9XQVJOSU5HX05PX0VMRU1FTlRfWFNEX0xPTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfV0FSTklOR19TSE9VTERfQkVfRlVMTFlfUVVBTElGSUVEX1VSSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9XQVJOSU5HX0RVUExJQ0FURV9FTlRSWTsKLQotCi0JLy8gTmV3TW9kZWxXaXphcmQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9JTlZBTElEX0dSQU1NQVJfRVJST1I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfQlVUVE9OX0JST1dTRTsKLQotCS8vIFhNTENhdGFsb2dJZE1hcHBpbmdQYWdlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfTUFQX1RPOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX01BUF9GUk9NOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0JVVFRPTl9ORVc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfQlVUVE9OX0VESVQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfQlVUVE9OX0RFTEVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9CVVRUT05fUkVNT1ZFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX05FV19ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfRURJVF9ESUFMT0dfVElUTEU7Ci0KLQotCS8vIFhNTENhdGFsb2dQcmVmZXJlbmNlUGFnZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1VTRVJfRU5UUklFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9VU0VSX0VOVFJJRVNfVE9PTF9USVA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU1lTVEVNX0VOVFJJRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU1lTVEVNX0VOVFJJRVNfVE9PTF9USVA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfQlVUVE9OX0NIQU5HRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9TRUxFQ1RfUFJPSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9TUEVDSUZZX1BST0pFQ1RfREVTQ1JJUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfV0FSTklOR19OT19QUk9KRUNUU19DUkVBVEVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfUFJPSkVDVF9OT1RfU1BFQ0lGSUVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfUFJPSkVDVF9ET0VTX05PVF9FWElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9QUk9KRUNUX1RPX1VTRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9DQVRBTE9HX1NBVkVfRVJST1I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfQ0FUQUxPR19DT1VMRF9OT1RfQkVfU0FWRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfQURWQU5DRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfQURWQU5DRURfWE1MX0NBVEFMT0dfUFJFRlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU1BFQ0lGWV9QRVJTSVNURU5DRV9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1NBVkVfQ0FUQUxPR19ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU0FWRV9DQVRBTE9HX0RJQUxPR19ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0JST1dTRV9DQVRBTE9HX0ZJTEVfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfQlJPV1NFX0NBVEFMT0dfRklMRV9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0RFVEFJTFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfVVNFUl9TUEVDSUZJRURfRU5UUklFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9QTFVHSU5fU1BFQ0lGSUVEX0VOVFJJRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfUExBVEZPUk1fUkVTT1VSQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfRklMRV9TWVNURU1fUkVTT1VSQ0U7Ci0JLy8gQWR2YW5jZWRPcHRpb25zRGlhbG9nCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfQlVUVE9OX0lNUE9SVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9CVVRUT05fRVhQT1JUOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfSU1QT1JUX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9JTVBPUlRfRElBTE9HX0hFQURJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfSU1QT1JUX0RJQUxPR19NRVNTQUdFOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfRVhQT1JUX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9FWFBPUlRfRElBTE9HX0hFQURJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfRVhQT1JUX0RJQUxPR19NRVNTQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX1NBVklOR19GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0ZJTEVfSVNfUkVBRF9PTkxZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0RJQUxPR19ERVNDUklQVElPTjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRDYXRhbG9nRW50cnlEaWFsb2dfY2F0YWxvZ0VudHJ5TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdENhdGFsb2dFbnRyeURpYWxvZ19uZXh0Q2F0YWxvZ0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0JVVFRPTl9NRU5VX0JST1dTRV9XT1JLU1BBQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfQlVUVE9OX01FTlVfQlJPV1NFX0ZJTEVfU1lTVEVNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1NFTEVDVF9GSUxFX0ZJTFRFUl9DT05UUk9MOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1RFWFRfU0VMRUNUX0ZJTEVfRklMVEVSX0NPTlRST0w7Ci0KLQotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFhNTENhdGFsb2dNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBYTUxDYXRhbG9nTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMTZlMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgRGF2aWQgQ2FydmVyL1NUQVIgU3RhbmRhcmQgLSBkX2FfY2FydmVyQHlhaG9vLmNvbSAtIGJ1ZyAxOTI1NjgKLSAqICAgICAgICAgICAgUmVtb3ZlZCBBZHZhbmNlZCBidXR0b24gLSBGdW5jdGlvbmFsaXR5IGlzIG5vdyBpbiB0aGUKLSAqICAgICAgICAgICAgSW1wb3J0L0V4cG9ydCBYTUwgQ2F0YWxvZyBXaXphcmRzLiAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLkNhdGFsb2dTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotCi1wdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZ1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIElDYXRhbG9nTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIFhNTENhdGFsb2dFbnRyaWVzVmlldyBjYXRhbG9nRW50cmllc1ZpZXc7Ci0KLQlwcm90ZWN0ZWQgSUNhdGFsb2cgd29ya2luZ1VzZXJDYXRhbG9nOwotCi0JcHJvdGVjdGVkIElDYXRhbG9nIHN5c3RlbUNhdGFsb2c7Ci0KLQlwcm90ZWN0ZWQgSUNhdGFsb2cgdXNlckNhdGFsb2c7Ci0KLQlwcm90ZWN0ZWQgSUNhdGFsb2cgZGVmYXVsdENhdGFsb2c7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGFkdmFuY2VkQnV0dG9uOwotCi0JcHVibGljIFhNTENhdGFsb2dQcmVmZXJlbmNlUGFnZSgpIHsKLQkJZGVmYXVsdENhdGFsb2cgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotCQlJTmV4dENhdGFsb2dbXSBuZXh0Q2F0YWxvZ3MgPSBkZWZhdWx0Q2F0YWxvZy5nZXROZXh0Q2F0YWxvZ3MoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0Q2F0YWxvZ3MubGVuZ3RoOyBpKyspIHsKLQkJCUlOZXh0Q2F0YWxvZyBjYXRhbG9nID0gbmV4dENhdGFsb2dzW2ldOwotCQkJSUNhdGFsb2cgcmVmZXJlbmNlZENhdGFsb2cgPSBjYXRhbG9nLmdldFJlZmVyZW5jZWRDYXRhbG9nKCk7Ci0JCQlpZiAocmVmZXJlbmNlZENhdGFsb2cgIT0gbnVsbCkgewotCQkJCWlmIChYTUxDb3JlUGx1Z2luLlNZU1RFTV9DQVRBTE9HX0lELmVxdWFscyhyZWZlcmVuY2VkQ2F0YWxvZy5nZXRJZCgpKSkgewotCQkJCQlzeXN0ZW1DYXRhbG9nID0gcmVmZXJlbmNlZENhdGFsb2c7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKFhNTENvcmVQbHVnaW4uVVNFUl9DQVRBTE9HX0lELmVxdWFscyhyZWZlcmVuY2VkQ2F0YWxvZy5nZXRJZCgpKSkgewotCQkJCQl1c2VyQ2F0YWxvZyA9IHJlZmVyZW5jZWRDYXRhbG9nOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJd29ya2luZ1VzZXJDYXRhbG9nLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2ggdGhlIHZpZXcgaW4gcmVzcG9uY2UgdG8gYW4gZXZlbnQgc2VudCBieSB0aGUgQ2F0YWxvZwotCSAqLwotCXB1YmxpYyB2b2lkIGNhdGFsb2dDaGFuZ2VkKElDYXRhbG9nRXZlbnQgZXZlbnQpIHsKLQkJY2F0YWxvZ0VudHJpZXNWaWV3LnVwZGF0ZVBhZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHByZWZlcmVuY2UgcGFnZSBjb250cm9scyBvbiBkZW1hbmQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBmb3IgdGhlIHByZWZlcmVuY2UgcGFnZQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gd2UgY3JlYXRlIGEgd29ya2luZyBjb3B5IG9mIHRoZSAnVXNlciBTZXR0aW5ncycgZm9yIHRoZSBDYXRhbG9nCi0JCS8vIHRoYXQgd2UgY2FuIG1vZGlmeQotCQlDYXRhbG9nU2V0IHRlbXBDYXRhbG9nU2V0ID0gbmV3IENhdGFsb2dTZXQoKTsKLQkJd29ya2luZ1VzZXJDYXRhbG9nID0gdGVtcENhdGFsb2dTZXQubG9va3VwT3JDcmVhdGVDYXRhbG9nKCJ3b3JraW5nIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkvLyBUT0RPOiBhZGQgZW50cmllcyBmcm9tIHRoZSBuZXN0ZWQgY2F0YWxvZ3MgYXMgd2VsbAotCQl3b3JraW5nVXNlckNhdGFsb2cuYWRkRW50cmllc0Zyb21DYXRhbG9nKHVzZXJDYXRhbG9nKTsKLQkJd29ya2luZ1VzZXJDYXRhbG9nLmFkZExpc3RlbmVyKHRoaXMpOwotCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKGNvbXBvc2l0ZSwgbmV3Ci0JCS8vIENvbnRyb2xDb250ZXh0Q29tcHV0ZXIoY29tcG9zaXRlLAotCQkvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX0NBVEFMT0dfUEFHRSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNyZWF0ZUNhdGFsb2dFbnRyaWVzVmlldyhjb21wb3NpdGUpOwotCQljcmVhdGVDYXRhbG9nRGV0YWlsc1ZpZXcoY29tcG9zaXRlKTsKLQkJLy9jcmVhdGVBZHZhbmNlZEJ1dHRvbihjb21wb3NpdGUpOwotCQkvLyBjYXRhbG9nRW50cmllc1ZpZXcudXBkYXRlUGFnZSgpOwotCQlhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFkdmFuY2VkQnV0dG9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJcGFuZWwuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJLy8gVE9ETy4uLiBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZXhwYW5kIHRoZSBwYWdlIHdpZHRoPwotCQkvLyBUaGlzIGludmlzaWJsZSBsYWJlbCBpcyBjcmVhdGVkIHRvIGZvcmNlIHRoZSB3aWR0aCBvZiB0aGUgcGFnZSB0bwotCQkvLyBiZQotCQkvLyB3aWRlIGVub3VnaCB0byBzaG93Ci0JCS8vIHRoZSByYXRoZXIgbG9uZyB1cmkgYW5kIGtleSBmaWVsZHMgb2YgYSBjYXRhbG9nIGVudHJ5LgotCQlMYWJlbCB3aWR0aEZ1ZGdlciA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5PTkUpOwotCQlTdHJpbmcgd2lkdGhGdWRnZXJTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IDU1OyBpKyspIHsKLQkJCXdpZHRoRnVkZ2VyU3RyaW5nICs9ICJ4IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXdpZHRoRnVkZ2VyLnNldFRleHQod2lkdGhGdWRnZXJTdHJpbmcpOwotCQl3aWR0aEZ1ZGdlci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJQ29tcG9zaXRlIHBsYWNlSG9sZGVyID0gbmV3IENvbXBvc2l0ZShwYW5lbCwgU1dULk5PTkUpOwotCQlwbGFjZUhvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJYWR2YW5jZWRCdXR0b24gPSBuZXcgQnV0dG9uKHBhbmVsLCBTV1QuTk9ORSk7Ci0JCWFkdmFuY2VkQnV0dG9uLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0FEVkFOQ0VEKTsKLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlBZHZhbmNlZE9wdGlvbnNEaWFsb2cgZGlhbG9nID0gbmV3IEFkdmFuY2VkT3B0aW9uc0RpYWxvZyhnZXRTaGVsbCgpLCB3b3JraW5nVXNlckNhdGFsb2cpOwotCQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9BRFZBTkNFRF9YTUxfQ0FUQUxPR19QUkVGUyk7Ci0JCQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQl9Ci0JCX07Ci0JCWFkdmFuY2VkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NhbWVGaWxlTmFtZShTdHJpbmcgYSwgU3RyaW5nIGIpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKChhID09IG51bGwpICYmIChiID09IG51bGwpKSB7Ci0JCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKChhICE9IG51bGwpICYmIChiICE9IG51bGwpKSB7Ci0JCQlyZXN1bHQgPSBhLmVxdWFscyhiKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNhdGFsb2dFbnRyaWVzVmlldyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlncm91cC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9VU0VSX0VOVFJJRVMpOwotCQlncm91cC5zZXRUb29sVGlwVGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfVVNFUl9FTlRSSUVTX1RPT0xfVElQKTsKLQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKHVzZXJFbnRyaWVzR3JvdXAsIG5ldwotCQkvLyBDb250cm9sQ29udGV4dENvbXB1dGVyKHVzZXJFbnRyaWVzR3JvdXAsCi0JCS8vIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfQ0FUQUxPR19VU0VSX0dST1VQKSk7Ci0JCWNhdGFsb2dFbnRyaWVzVmlldyA9IG5ldyBYTUxDYXRhbG9nRW50cmllc1ZpZXcoZ3JvdXAsIHdvcmtpbmdVc2VyQ2F0YWxvZywgc3lzdGVtQ2F0YWxvZyk7Ci0JCWNhdGFsb2dFbnRyaWVzVmlldy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDYXRhbG9nRGV0YWlsc1ZpZXcoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBkZXRhaWxzR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWRldGFpbHNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZGV0YWlsc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJZGV0YWlsc0dyb3VwLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0RFVEFJTFMpOwotCQlmaW5hbCBYTUxDYXRhbG9nRW50cnlEZXRhaWxzVmlldyBkZXRhaWxzVmlldyA9IG5ldyBYTUxDYXRhbG9nRW50cnlEZXRhaWxzVmlldyhkZXRhaWxzR3JvdXApOwotCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSAmJiAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnNpemUoKSA9PSAxID8gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKSA6IG51bGw7Ci0JCQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJCQlJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gKElDYXRhbG9nRW50cnkpIHNlbGVjdGVkT2JqZWN0OwotCQkJCQlkZXRhaWxzVmlldy5zZXRDYXRhbG9nRWxlbWVudChlbnRyeSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSU5leHRDYXRhbG9nKSB7Ci0JCQkJCUlOZXh0Q2F0YWxvZyBlbnRyeSA9IChJTmV4dENhdGFsb2cpIHNlbGVjdGVkT2JqZWN0OwotCQkJCQlkZXRhaWxzVmlldy5zZXRDYXRhbG9nRWxlbWVudChlbnRyeSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlkZXRhaWxzVmlldy5zZXRDYXRhbG9nRWxlbWVudCgoSUNhdGFsb2dFbnRyeSkgbnVsbCk7Ci0JCQkJfQotCi0JCQl9Ci0JCX07Ci0JCWNhdGFsb2dFbnRyaWVzVmlldy5nZXRWaWV3ZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIERvIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBPSyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgaXQgaXMgb2theSB0byBjbG9zZSB0aGUgcHJlZmVyZW5jZSBwYWdlCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlyZXR1cm4gc3RvcmVWYWx1ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0KLQkvKioKLQkgKiBTdG9yZXMgdGhlIHZhbHVlcyBvZiB0aGUgY29udHJvbHMgYmFjayB0byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc3RvcmVWYWx1ZXMoKSB7Ci0JCS8vIGR3IE9iamVjdCBmaWxlT2JqZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHVwZGF0ZSB0aGUgdXNlckNhdGFsb2cgc28gdGhhdCBpdHMgdGhlIHNhbWUgYXMgdGhlIHdvcmtpbmcKLQkJCS8vIGNhdGFsb2cKLQkJCXVzZXJDYXRhbG9nLmNsZWFyKCk7Ci0JCQkvLyBUT0RPIGFkZCBlbnRyaWVzIGZyb20gdGhlIG5lc3RlZCBjYXRhbG9ncz8KLQkJCXVzZXJDYXRhbG9nLmFkZEVudHJpZXNGcm9tQ2F0YWxvZyh3b3JraW5nVXNlckNhdGFsb2cpOwotCQkJLy8gbm93IHNhdmUgdGhlIHVzZXJDYXRhbG9nCi0JCQl1c2VyQ2F0YWxvZy5zYXZlKCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MTBkNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgRGF2aWQgQ2FydmVyL1NUQVIgU3RhbmRhcmQsIGRfYV9jYXJ2ZXJAeWFob28uY29tLCBidWcgMTkyNTY4Ci0jICAgICAgICAtIEZpeGVkIGdyYW1tYXIgaW4gWE1MIENhdGFsb2cgSW1wb3J0IGRpYWxvZy4KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVVJX1dJWkFSRF9TQ0hFTUFfQU5EX05BTUVfU1BBQ0VfSU5GTyA9IFNjaGVtYSBhbmQgTmFtZXNwYWNlIEluZm9ybWF0aW9uCi1VSV9MQUJFTF9OQU1FX1NQQUNFX1BSRUZJWCAgICAgICAgICAgPSBOYW1lc3BhY2UgcHJlZml4OgotVUlfTEFCRUxfTkFNRV9TUEFDRV9VUkkgICAgICAgICAgICAgID0gTmFtZXNwYWNlIFVSSToKLVVJX0xBQkVMX1hTRF9MT0NBVElPTiAgICAgICAgICAgICAgICA9IFNjaGVtYSBsb2NhdGlvbjoKLVVJX0xBQkVMX0RPQ1RZUEVfSU5GT1JNQVRJT04gICAgICAgICA9IERvY3VtZW50IHR5cGUgaW5mb3JtYXRpb24KLVVJX0xBQkVMX1NZU1RFTV9JRCAgICAgICAgICAgICAgICAgICA9ICZTeXN0ZW0gSUQ6Ci1VSV9MQUJFTF9QVUJMSUNfSUQgICAgICAgICAgICAgICAgICAgPSAmUHVibGljIElEOgotVUlfTEFCRUxfU0VMRUNUX0ZJTEUgICAgICAgICAgICAgICAgID0gU2VsZWN0IEZpbGUKLVVJX0xBQkVMX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICA9IEtleQotVUlfTEFCRUxfS0VZX0NPTE9OICAgICAgICAgICAgICAgICAgID0gJktleToKLVVJX0xBQkVMX0RFVEFJTFNfS0VZX0NPTE9OICAgICAgICAgICA9IEtleToKLVVJX0xBQkVMX0RFVEFJTFNfSU5fSkFSX0ZJTEUJCSA9IGluIGphciBmaWxlCi1VSV9MQUJFTF9VUkkgICAgICAgICAgICAgICAgICAgICAgICAgPSBVUkkKLVVJX0xBQkVMX0xPQ0FUSU9OX0NPTE9OICAgICAgICAgICAgICA9ICZMb2NhdGlvbjogIAotVUlfTEFCRUxfQ0FUQUxPR19VUklfQ09MT04JCSAgICAgID0gTG9jYXRpb24gb2YgYW5vdGhlciBYTUwgQ2F0YWxvZyBmaWxlOgotVUlfTEFCRUxfREVUQUlMU19VUklfQ09MT04gICAgICAgICAgID0gVVJJOiAgIAotVUlfS0VZX1RZUEVfQ09MT04gICAgICAgICAgICAgICAgICAgID0gS2V5ICZUeXBlOgotVUlfS0VZX1RZUEVfREVUQUlMU19DT0xPTiAgICAgICAgICAgID0gS2V5IFR5cGU6Ci1VSV9MQUJFTF9ERVRBSUxTX1VSSV9MT0NBVElPTiAgICAgICAgPSBMb2NhdGlvbjoKLVVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1hTRF9QVUJMSUMgICA9IE5hbWVzcGFjZSBOYW1lCi1VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9YU0RfU1lTVEVNICAgPSBTY2hlbWEgTG9jYXRpb24KLVVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9QVUJMSUMgICA9IFB1YmxpYyBJRAotVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fRFREX1NZU1RFTSAgID0gU3lzdGVtIElECi1VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9VUkkgICAJCSAgPSBVUkkKLVVJX0xBQkVMX1NQRUNJRllfQUxURVJOQVRJVkVfV0VCX1VSTCA9IFNwZWNpZnkgJmFsdGVybmF0aXZlIHdlYiBhZGRyZXNzCi1VSV9XQVJOSU5HX1VSSV9NVVNUX05PVF9IQVZFX0RPVFMgICAgPSBVUkkgbXVzdCBub3QgaW5jbHVkZWQgJy4nIG9yICcuLicKLVVJX0xBQkVMX1BMQVRGT1JNX1JFU09VUkNFIAkJIAkgPSBXb3Jrc3BhY2UKLVVJX0xBQkVMX0ZJTEVfU1lTVEVNX1JFU09VUkNFCQkgPSBGaWxlIFN5c3RlbQotCi1VSV9XQVJOSU5HX1VSSV9OT1RfRk9VTkRfQ09MT04gICAgICAgPSBUaGUgc3BlY2lmaWVkIHJlc291cmNlIGNhbid0IGJlIGxvY2F0ZWQgOgotVUlfV0FSTklOR19TSE9VTERfQkVfRlVMTFlfUVVBTElGSUVEX1VSSSA9IFdhcm5pbmc6IHRoZSBrZXkgdmFsdWUgc2hvdWxkIGJlIGEgZnVsbHkgcXVhbGlmaWVkIFVSSQotVUlfV0FSTklOR19VUklfTk9UX0ZPVU5EX0xPTkcgICAgICAgID0gVGhlIHNwZWNpZmllZCBmaWxlIGNhbm5vdCBiZSBmb3VuZC4gSXQgbWF5IGhhdmUgYmVlbiBtb3ZlZCB0byBhIGRpZmZlcmVudCBsb2NhdGlvbi4gSWYgdGhlIGZpbGUgaXMgbG9jYXRlZCByZW1vdGVseSwgYSBuZXR3b3JrIGNvbm5lY3Rpb24gY2Fubm90IGJlIGVzdGFibGlzaGVkIHRvIHRoZSByZW1vdGUgbG9jYXRpb24uIAotVUlfV0FSTklOR19JTlZBTElEX0ZJTEUgICAgICAgICAgICAgID0gVGhlIHNwZWNpZmllZCBmaWxlIGlzIGludmFsaWQuCi1VSV9XQVJOSU5HX0lOVkFMSURfRklMRV9MT05HICAgICAgICAgPSBUaGUgc3BlY2lmaWVkIGZpbGUgaXMgaW52YWxpZC4gQSBwcm9wZXIgWE1MIGZpbGUgY2Fubm90IGJlIGdlbmVyYXRlZCBmcm9tIGl0LiBPcGVuIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLCBlZGl0IGl0IGFzIG5lY2Vzc2FyeSwgdmFsaWRhdGUgaXQgYW5kIHRyeSBhZ2Fpbi4KLVVJX1dBUk5JTkdfTk9fRUxFTUVOVCAgICAgICAgICAgICAgICA9IFRoZSBzcGVjaWZpZWQgZmlsZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGVsZW1lbnQgZGVjbGFyYXRpb24uCi1VSV9XQVJOSU5HX05PX0VMRU1FTlRfRFREX0xPTkcgICAgICAgPSBUaGUgc3BlY2lmaWVkIGZpbGUgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBlbGVtZW50IGRlY2xhcmF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgdGhlIHJvb3QgZWxlbWVudCBpbiB0aGUgZ2VuZXJhdGVkIFhNTCBmaWxlLgotVUlfV0FSTklOR19OT19FTEVNRU5UX1hTRF9MT05HICAgICAgID0gVGhlIHNwZWNpZmllZCBmaWxlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZ2xvYmFsIGVsZW1lbnQgZGVjbGFyYXRpb24gdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgcm9vdCBlbGVtZW50IGluIHRoZSBnZW5lcmF0ZWQgWE1MIGZpbGUuCi1VSV9XQVJOSU5HX0RVUExJQ0FURV9FTlRSWQkJCSA9IFRoZSBzcGVjaWZpZWQgZW50cnkgaXMgaW52YWxpZC4gQW4gZXhpc3RpbmcgZW50cnkgaGFzIHRoZSBzYW1lIGtleSBhbmQga2V5IHR5cGUuCi0KLQotIU5ld01vZGVsV2l6YXJkCi1VSV9JTlZBTElEX0dSQU1NQVJfRVJST1IgICAgICAgICAgICAgPSBJbnZhbGlkIEdyYW1tYXIKLVVJX0JVVFRPTl9CUk9XU0UgICAgICAgICAgICAgICAgICAgICA9ICZCcm93c2UuLi4KLQotIVhNTENhdGFsb2dJZE1hcHBpbmdQYWdlCi1VSV9MQUJFTF9NQVBfVE8gICAgICAgICAgICAgICAgICAgICAgPSBNYXAgdG86Ci1VSV9MQUJFTF9NQVBfRlJPTSAgICAgICAgICAgICAgICAgICAgPSBNYXAgZnJvbToKLVVJX0JVVFRPTl9ORVcgICAgICAgICAgICAgICAgICAgICAgICA9ICZBZGQuLi4KLVVJX0JVVFRPTl9FRElUICAgICAgICAgICAgICAgICAgICAgICA9ICZFZGl0Li4uCi1VSV9CVVRUT05fREVMRVRFICAgICAgICAgICAgICAgICAgICAgPSAmRGVsZXRlCi1VSV9CVVRUT05fUkVNT1ZFICAgICAgICAgICAgICAgICAgICAgPSAmUmVtb3ZlCi1VSV9MQUJFTF9ORVdfRElBTE9HX1RJVExFICAgICAgICAgICAgPSBBZGQgWE1MIENhdGFsb2cgRW50cnkKLVVJX0xBQkVMX0VESVRfRElBTE9HX1RJVExFICAgICAgICAgICA9IEVkaXQgWE1MIENhdGFsb2cgRW50cnkKLQotCi0hWE1MQ2F0YWxvZ1ByZWZlcmVuY2VQYWdlCi1VSV9MQUJFTF9VU0VSX0VOVFJJRVMgICAgICAgICAgICAgICAgPSBYTUwgQ2F0YWxvZyBFbnRyaWVzCi1VSV9MQUJFTF9VU0VSX0VOVFJJRVNfVE9PTF9USVAgICAgICAgPSBYTUwgQ2F0YWxvZyBlbnRyaWVzIHRoYXQgaGF2ZSBiZWVuIHNwZWNpZmllZCBieSB0aGUgdXNlcgotVUlfTEFCRUxfU1lTVEVNX0VOVFJJRVMgICAgICAgICAgICAgID0gUGx1Zy1pbiBzcGVjaWZpZWQgZW50cmllcwotVUlfTEFCRUxfU1lTVEVNX0VOVFJJRVNfVE9PTF9USVAgICAgID0gWE1MIENhdGFsb2cgZW50cmllcyB0aGF0IGhhdmUgYmVlbiBzcGVjaWZpZWQgYnkgYSBwbHVnLWluCi1VSV9CVVRUT05fQ0hBTkdFICAgICAgICAgICAgICAgICAgICAgPSBDaGFuZ2UuLi4KLVVJX0xBQkVMX1NFTEVDVF9QUk9KRUNUICAgICAgICAgICAgICA9IFNlbGVjdCBQcm9qZWN0Ci1VSV9MQUJFTF9TUEVDSUZZX1BST0pFQ1RfREVTQ1JJUFRJT04gPSBTcGVjaWZ5IHRoZSBwcm9qZWN0IHRvIHBlcnNpc3QgdGhlIFhNTCBDYXRhbG9nIGluZm9ybWF0aW9uCi1VSV9XQVJOSU5HX05PX1BST0pFQ1RTX0NSRUFURUQgICAgICAgPSBObyBwcm9qZWN0cyBoYXZlIGJlZW4gY3JlYXRlZCB5ZXQuCi1VSV9XQVJOSU5HX1BST0pFQ1RfTk9UX1NQRUNJRklFRCAgICAgPSBBIHByb2plY3QgbmFtZSBoYXMgbm90IGJlZW4gc3BlY2lmaWVkLgotVUlfV0FSTklOR19QUk9KRUNUX0RPRVNfTk9UX0VYSVNUICAgID0gVGhlIHNwZWNpZmllZCBwcm9qZWN0IGRvZXMgbm90IGV4aXN0LgotVUlfTEFCRUxfUFJPSkVDVF9UT19VU0UgICAgICAgICAgICAgID0gUHJvamVjdCB0byB1c2UgdG8gcGVyc2lzdCBYTUwgQ2F0YWxvZyBVc2VyIEVudHJpZXM6IAotVUlfTEFCRUxfQ0FUQUxPR19TQVZFX0VSUk9SICAgICAgICAgID0gWE1MIENhdGFsb2cgU2F2ZSBFcnJvcgotVUlfTEFCRUxfQ0FUQUxPR19DT1VMRF9OT1RfQkVfU0FWRUQgID0gVGhlIFhNTCBDYXRhbG9nIGVudHJ5IGNvdWxkIG5vdCBiZSBzYXZlZC4KLVVJX0xBQkVMX0FEVkFOQ0VEICAgICAgICAgICAgICAgICAgICA9ICZBZHZhbmNlZC4uLgotVUlfTEFCRUxfQURWQU5DRURfWE1MX0NBVEFMT0dfUFJFRlMgID0gQWR2YW5jZWQgWE1MIENhdGFsb2cgUHJlZmVyZW5jZXMgICAKLVVJX0xBQkVMX1NQRUNJRllfUEVSU0lTVEVOQ0VfRklMRSAgICA9ICZTcGVjaWZ5IGEgZmlsZSB0byB1c2UgdG8gcGVyc2lzdCB0aGUgWE1MIENhdGFsb2cgaW5mb3JtYXRpb24uCi1VSV9MQUJFTF9TQVZFX0NBVEFMT0dfRElBTE9HX1RJVExFICAgPSBTYXZlIENoYW5nZXMKLVVJX0xBQkVMX1NBVkVfQ0FUQUxPR19ESUFMT0dfREVTQyAgICA9IFlvdSBoYXZlIG1hZGUgdW5zYXZlZCBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IFhNTCBDYXRhbG9nIHNldHRpbmdzLiBEbyB5b3Ugd2lzaCB0byBzYXZlIHlvdXIgY2hhbmdlcyBiZWZvcmUgbG9hZGluZyB0aGUgbmV3IFhNTCBDYXRhbG9nIHNldHRpbmdzPyAgIAotVUlfTEFCRUxfQlJPV1NFX0NBVEFMT0dfRklMRV9USVRMRSAgID0gU2VsZWN0IEZvbGRlcgotVUlfTEFCRUxfQlJPV1NFX0NBVEFMT0dfRklMRV9ERVNDICAgID0gU2VsZWN0IHRoZSBmb2xkZXIgdGhhdCBjb250YWlucyB0aGUgJy54bWxjYXRhbG9nJyBmaWxlLiAgIAotVUlfTEFCRUxfREVUQUlMUyAgICAgICAgICAgICAgICAgICAgID0gRGV0YWlscwotVUlfTEFCRUxfVVNFUl9TUEVDSUZJRURfRU5UUklFUyAgICAgID0gVXNlciBTcGVjaWZpZWQgRW50cmllcwotVUlfTEFCRUxfUExVR0lOX1NQRUNJRklFRF9FTlRSSUVTICAgID0gUGx1Z2luIFNwZWNpZmllZCBFbnRyaWVzCi1VSV9MQUJFTF9GSUxFX1NFTEVDVElPTgkJCQkgPSBGaWxlIFNlbGVjdGlvbgotVUlfTEFCRUxfQ0hPT1NFX0ZJTEVfVE9fQUREX1RPX0NBVEFMT0cJCQkJID0gQ2hvb3NlIGEgZmlsZSB0byBhZGQgdG8gdGhlIFhNTCBDYXRhbG9nCi0gCi0hQWR2YW5jZWRPcHRpb25zRGlhbG9nCi1VSV9MQUJFTF9ESUFMT0dfREVTQ1JJUFRJT04gICAgICAgICAgPSBVc2UgdGhlIGJ1dHRvbnMgYmVsb3cgdG8gaW1wb3J0IG9yIGV4cG9ydCBYTUwgQ2F0YWxvZyBzZXR0aW5ncy4KLVVJX0JVVFRPTl9JTVBPUlQgICAgICAgICAgICAgICAgICAgICA9IEltcG9ydC4uLgotVUlfQlVUVE9OX0VYUE9SVCAgICAgICAgICAgICAgICAgICAgID0gRXhwb3J0Li4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotVUlfTEFCRUxfSU1QT1JUX0RJQUxPR19USVRMRSAgICAgICAgID0gSW1wb3J0IFhNTCBDYXRhbG9nIFNldHRpbmdzCi1VSV9MQUJFTF9JTVBPUlRfRElBTE9HX0hFQURJTkcgICAgICAgPSBTcGVjaWZ5IFhNTCBDYXRhbG9nIEZpbGUKLVVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfTUVTU0FHRSAgICAgICA9IFNwZWNpZnkgdGhlIGZpbGUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gbG9hZCB0aGUgWE1MIENhdGFsb2cgU2V0dGluZ3MKLQotVUlfTEFCRUxfRVhQT1JUX0RJQUxPR19USVRMRSAgICAgICAgID0gRXhwb3J0IFhNTCBDYXRhbG9nIFNldHRpbmdzCi1VSV9MQUJFTF9FWFBPUlRfRElBTE9HX0hFQURJTkcgICAgICAgPSBTcGVjaWZ5IFhNTCBDYXRhbG9nIEZpbGUKLVVJX0xBQkVMX0VYUE9SVF9ESUFMT0dfTUVTU0FHRSAgICAgICA9IFNwZWNpZnkgdGhlIGZpbGUgdGhhdCB3aWxsIHVzZWQgdG8gc2F2ZSB0aGUgWE1MIENhdGFsb2cgU2V0dGluZwotRVJST1JfU0FWSU5HX0ZJTEUJCQkJCSA9IEVycm9yIHNhdmluZyBmaWxlICUxCi1VSV9MQUJFTF9GSUxFX0lTX1JFQURfT05MWSAgICAgICAgICAgPSBGaWxlICUxIGlzIHJlYWQgb25seQotCi1FZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nX2NhdGFsb2dFbnRyeUxhYmVsPUNhdGFsb2cgRW50cnkKLUVkaXRDYXRhbG9nRW50cnlEaWFsb2dfbmV4dENhdGFsb2dMYWJlbD1OZXh0IENhdGFsb2cKLVVJX0JVVFRPTl9NRU5VX0JST1dTRV9XT1JLU1BBQ0U9V29ya3NwYWNlLi4uCi1VSV9CVVRUT05fTUVOVV9CUk9XU0VfRklMRV9TWVNURU09RmlsZSBTeXN0ZW0uLi4KLVVJX0xBQkVMX1NFTEVDVF9GSUxFX0ZJTFRFUl9DT05UUk9MPUZpbGVzIG9mIHR5cGU6Ci1VSV9URVhUX1NFTEVDVF9GSUxFX0ZJTFRFUl9DT05UUk9MPUFsbCBTdXBwb3J0ZWQgRmlsZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBkNDk1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dUcmVlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLQotCi1wdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIgZXh0ZW5kcyBUcmVlVmlld2VyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIHhtbENhdGFsb2dJbWFnZSA9IEltYWdlRmFjdG9yeS5JTlNUQU5DRS5nZXRJbWFnZSgiaWNvbnMvb2JqMTYveG1sY2F0YWxvZ19vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGVycm9ySW1hZ2UgPSBJbWFnZUZhY3RvcnkuSU5TVEFOQ0UuZ2V0SW1hZ2UoImljb25zL292cjE2L2Vycm9yLW92ZXJsYXkuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGVudHJ5SW1hZ2UgPSBJbWFnZUZhY3RvcnkuSU5TVEFOQ0UuZ2V0SW1hZ2UoImljb25zL29iajE2L2VudHJ5X29iai5wbmciKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgbmV4dENhdGFsb2dJbWFnZSA9IEltYWdlRmFjdG9yeS5JTlNUQU5DRS5nZXRJbWFnZSgiaWNvbnMvb2JqMTYvbmV4dENhdGFsb2dfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBFUlJPUl9TVEFURV9LRVkgPSAiZXJyb3JzdGF0ZWtleSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBJQ2F0YWxvZyBmV29ya2luZ1VzZXJDYXRhbG9nOwotCXByb3RlY3RlZCBJQ2F0YWxvZyBmU3lzdGVtQ2F0YWxvZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVTRVJfU1BFQ0lGSUVEX0VOVFJJRVNfT0JKRUNUID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX1VTRVJfU1BFQ0lGSUVEX0VOVFJJRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUExVR0lOX1NQRUNJRklFRF9FTlRSSUVTX09CSkVDVCA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9QTFVHSU5fU1BFQ0lGSUVEX0VOVFJJRVM7Ci0KLQlwdWJsaWMgWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUNhdGFsb2cgd29ya2luZ1VzZXJDYXRhbG9nLCBJQ2F0YWxvZyBzeXN0ZW1DYXRhbG9nKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JCXRoaXMuZldvcmtpbmdVc2VyQ2F0YWxvZyA9IHdvcmtpbmdVc2VyQ2F0YWxvZzsKLQkJdGhpcy5mU3lzdGVtQ2F0YWxvZyA9IHN5c3RlbUNhdGFsb2c7Ci0KLQkJc2V0Q29udGVudFByb3ZpZGVyKG5ldyBDYXRhbG9nRW50cnlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXNldExhYmVsUHJvdmlkZXIobmV3IENhdGFsb2dFbnRyeUxhYmVsUHJvdmlkZXIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBleHRlbnNpb25zKSB7Ci0JCXJlc2V0RmlsdGVycygpOwotCQlhZGRGaWx0ZXIobmV3IFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlcihleHRlbnNpb25zKSk7Ci0JfQotCi0JcHVibGljIGNsYXNzIENhdGFsb2dFbnRyeUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJcHJvdGVjdGVkIEhhc2hNYXAgaW1hZ2VUYWJsZSA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpIHsKLQkJCQlJQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeSA9IChJQ2F0YWxvZ0VudHJ5KSBvYmplY3Q7Ci0JCQkJcmVzdWx0ID0gY2F0YWxvZ0VudHJ5LmdldEtleSgpOwotCQkJCS8vIHJlc3VsdCA9IFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2wocmVzdWx0KTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElOZXh0Q2F0YWxvZykgewotCQkJCUlOZXh0Q2F0YWxvZyBuZXh0Q2F0YWxvZyA9IChJTmV4dENhdGFsb2cpIG9iamVjdDsKLQkJCQkvLyByZXN1bHQgPSBuZXh0Q2F0YWxvZy5nZXRDYXRhbG9nTG9jYXRpb24oKTsKLQkJCQlyZXN1bHQgPSBVUklVdGlscy5jb252ZXJ0VVJJVG9Mb2NhdGlvbihuZXh0Q2F0YWxvZy5nZXRDYXRhbG9nTG9jYXRpb24oKSk7Ci0JCQkJaWYgKG5leHRDYXRhbG9nLmdldENhdGFsb2dMb2NhdGlvbigpLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsKLQkJCQkJcmVzdWx0ICs9ICIgKCIgKyBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfRklMRV9TWVNURU1fUkVTT1VSQ0UgKyAiKSI7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5leHRDYXRhbG9nLmdldENhdGFsb2dMb2NhdGlvbigpLnN0YXJ0c1dpdGgoInBsYXRmb3JtOiIpKSB7Ci0JCQkJCXJlc3VsdCArPSAiICgiICsgWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX1BMQVRGT1JNX1JFU09VUkNFICsgIikiOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6IG9iamVjdC50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJCUltYWdlIHJlc3VsdCA9IG51bGw7Ci0JCQlJbWFnZSBiYXNlID0gbnVsbDsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlyZXN1bHQgPSB4bWxDYXRhbG9nSW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQkJSUNhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgb2JqZWN0OwotCQkJCVN0cmluZyB1cmkgPSBjYXRhbG9nRW50cnkuZ2V0VVJJKCk7Ci0JCQkJSUVkaXRvclJlZ2lzdHJ5IGVyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRFZGl0b3JSZWdpc3RyeSgpOwotCQkJCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBlci5nZXRJbWFnZURlc2NyaXB0b3IodXJpKTsKLQkJCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgaW1hZ2VUYWJsZS5nZXQoaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQlpbWFnZSA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCQkJCQlpbWFnZVRhYmxlLnB1dChpbWFnZURlc2NyaXB0b3IsIGltYWdlKTsKLQkJCQl9Ci0JCQkJYmFzZSA9IGltYWdlOwotCi0JCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCQlpZiAoVVJJSGVscGVyLmlzUmVhZGFibGVVUkkodXJpLCB0cnVlKSkgewotCQkJCQkJcmVzdWx0ID0gYmFzZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlc3VsdCA9IEltYWdlRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVDb21wb3NpdGVJbWFnZShiYXNlLCBlcnJvckltYWdlLCBJbWFnZUZhY3RvcnkuQk9UVE9NX0xFRlQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSU5leHRDYXRhbG9nKSB7Ci0JCQkJLy8gVE9ETzogYWRkIGltYWdlIHRvIHRoZSBpbWFnZVRhYmxlIGFuZCBhZGQgZXJyb3Igb3ZlcmxheSBpZgotCQkJCS8vIG5leHQgY2F0YWxvZyBVUkkgaXMgbm90IHJlYWRhYmxlCi0JCQkJcmVzdWx0ID0gbmV4dENhdGFsb2dJbWFnZTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGltYWdlVGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCSgoSW1hZ2UpIGl0Lm5leHQoKSkuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwdWJsaWMgY2xhc3MgQ2F0YWxvZ0VudHJ5Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCQlwcm90ZWN0ZWQgT2JqZWN0W10gcm9vdHM7Ci0KLQkJcHVibGljIENhdGFsb2dFbnRyeUNvbnRlbnRQcm92aWRlcigpIHsKLQkJCXJvb3RzID0gbmV3IE9iamVjdFsyXTsKLQkJCXJvb3RzWzBdID0gVVNFUl9TUEVDSUZJRURfRU5UUklFU19PQkpFQ1Q7Ci0JCQlyb290c1sxXSA9IFBMVUdJTl9TUEVDSUZJRURfRU5UUklFU19PQkpFQ1Q7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1Jvb3QoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIChvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHx8IChvYmplY3QgaW5zdGFuY2VvZiBJTmV4dENhdGFsb2cpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gcm9vdHM7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCU9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbMF07Ci0JCQlpZiAocGFyZW50RWxlbWVudCA9PSByb290c1swXSkgewotCQkJCXJlc3VsdCA9IGdldENoaWxkcmVuSGVscGVyKGZXb3JraW5nVXNlckNhdGFsb2cpOwotCQkJfQotCQkJZWxzZSBpZiAocGFyZW50RWxlbWVudCA9PSByb290c1sxXSkgewotCQkJCXJlc3VsdCA9IGdldENoaWxkcmVuSGVscGVyKGZTeXN0ZW1DYXRhbG9nKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJTmV4dENhdGFsb2cpIHsKLQkJCQlJQ2F0YWxvZyBuZXh0Q2F0YWxvZyA9ICgoSU5leHRDYXRhbG9nKSBwYXJlbnRFbGVtZW50KS5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotCQkJCXJlc3VsdCA9IGdldENoaWxkcmVuSGVscGVyKG5leHRDYXRhbG9nKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0Q2hpbGRyZW5IZWxwZXIoSUNhdGFsb2cgY2F0YWxvZykgewotCQkJLy8gVE9ETyBhZGQgZW50cmllcyBmcm9tIHRoZSBuZXN0ZWQgY2F0YWxvZ3MKLQotCQkJSUNhdGFsb2dFbnRyeVtdIGVudHJpZXMgPSBjYXRhbG9nLmdldENhdGFsb2dFbnRyaWVzKCk7Ci0JCQlpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7Ci0JCQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCQkJaW50IHJlc3VsdCA9IDA7Ci0JCQkJCQlpZiAoKG8xIGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgJiYgKG8yIGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkpIHsKLQkJCQkJCQlJQ2F0YWxvZ0VudHJ5IGVudHJ5MSA9IChJQ2F0YWxvZ0VudHJ5KSBvMTsKLQkJCQkJCQlJQ2F0YWxvZ0VudHJ5IGVudHJ5MiA9IChJQ2F0YWxvZ0VudHJ5KSBvMjsKLQkJCQkJCQlyZXN1bHQgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoZW50cnkxLmdldEtleSgpLCBlbnRyeTIuZ2V0S2V5KCkpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkJfQotCQkJCX07Ci0JCQkJQXJyYXlzLnNvcnQoZW50cmllcywgY29tcGFyYXRvcik7Ci0JCQl9Ci0JCQlWZWN0b3IgcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KGVudHJpZXMpKTsKLQkJCUlOZXh0Q2F0YWxvZ1tdIG5leHRDYXRhbG9ncyA9IGNhdGFsb2cuZ2V0TmV4dENhdGFsb2dzKCk7Ci0JCQlMaXN0IG5leHRDYXRhbG9nc0xpc3QgPSBBcnJheXMuYXNMaXN0KG5leHRDYXRhbG9ncyk7Ci0JCQlyZXN1bHQuYWRkQWxsKG5leHRDYXRhbG9nc0xpc3QpOwotCi0JCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IElDYXRhbG9nRWxlbWVudFtyZXN1bHQuc2l6ZSgpXSk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgU3RyaW5nKSA/IG51bGwgOiBVU0VSX1NQRUNJRklFRF9FTlRSSUVTX09CSkVDVDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gaXNSb290KGVsZW1lbnQpID8gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMCA6IGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCS8vIG5vdGhpbmcgdG8gZGlzcG9zZQotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGQsIE9iamVjdCBuZXdvYmopIHsKLQkJCS8vIElTU1VFOiBzZWVtcyB3ZSBzaG91bGQgZG8gc29tZXRoaW5nIGhlcmUKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImhlbGxvIikgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJydW4hIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQkJbWVudU1hbmFnZXIuYWRkKGFjdGlvbik7Ci0JfQotCi0KLQljbGFzcyBYTUxDYXRhbG9nVGFibGVWaWV3ZXJGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotCQlwcm90ZWN0ZWQgU3RyaW5nW10gZXh0ZW5zaW9uczsKLQotCQlwdWJsaWMgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyRmlsdGVyKFN0cmluZ1tdIGV4dGVuc2lvbnMxKSB7Ci0JCQl0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zMTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRmlsdGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBwcm9wZXJ0eSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQkJSUNhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgZWxlbWVudDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGNhdGFsb2dFbnRyeS5nZXRVUkkoKS5lbmRzV2l0aChleHRlbnNpb25zW2ldKSkgewotCQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoZWxlbWVudC5lcXVhbHMoWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIuUExVR0lOX1NQRUNJRklFRF9FTlRSSUVTX09CSkVDVCkgfHwgZWxlbWVudC5lcXVhbHMoWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIuVVNFUl9TUEVDSUZJRURfRU5UUklFU19PQkpFQ1QpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MUXVpY2tTY2FuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTFF1aWNrU2Nhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjM1MzlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MUXVpY2tTY2FuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFhNTFF1aWNrU2NhbiB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJRm9yU2NoZW1hKFN0cmluZyB1cmkpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTCh1cmkpOwotCQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSB1cmwub3BlblN0cmVhbSgpOwotCQkJcmVzdWx0ID0gWE1MUXVpY2tTY2FuLmdldFRhcmdldE5hbWVzcGFjZVVSSUZvclNjaGVtYShpbnB1dFN0cmVhbSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2VVUklGb3JTY2hlbWEoSW5wdXRTdHJlYW0gaW5wdXQpIHsKLQkJVGFyZ2V0TmFtZXNwYWNlVVJJQ29udGVudEhhbmRsZXIgaGFuZGxlciA9IG5ldyBUYXJnZXROYW1lc3BhY2VVUklDb250ZW50SGFuZGxlcigpOwotCQlDbGFzc0xvYWRlciBwcmV2Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCQl0cnkgewotCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoWE1MUXVpY2tTY2FuLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotCQkJU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQkJCVNBWFBhcnNlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotCQkJcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbnB1dCksIGhhbmRsZXIpOwotCQl9Ci0JCWNhdGNoIChTdG9wUGFyc2VFeGNlcHRpb24gZSkgewotCQkJLy8gdGhpcyBpcyBhIG5vcm1hbCBleGNlcHRpb24gdG8gc3RvcCBwYXJzaW5nIGVhcmx5LAotCQkJLy8gd2hlbiBpbmZvIGlzIGZvdW5kLCBzbyB3ZSBjYW4gc2FmZWx5IGlnbm9yZQotCQl9Ci0JCWNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIocHJldkNsYXNzTG9hZGVyKTsKLQkJfQotCQlyZXR1cm4gaGFuZGxlci50YXJnZXROYW1lc3BhY2VVUkk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9wIHBhcnNpbmcgd2hlbiByZXF1aXJlZAotCSAqIGluZm9ybWF0aW9uIGlzIGZvdW5kLgotCSAqLwotCXN0YXRpYyBjbGFzcyBTdG9wUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gewotCQlzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdG9yIFN0b3BQYXJzZUV4Y2VwdGlvbi4KLQkJICovCi0JCVN0b3BQYXJzZUV4Y2VwdGlvbigpIHsKLQkJCXN1cGVyKCJ0YXJnZXRuYW1lc3BhY2UgZm91bmQsIG5vIG5lZWQgdG8gY29udGludWUgdGhlIHBhcnNlIik7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVGFyZ2V0TmFtZXNwYWNlVVJJQ29udGVudEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7Ci0JCXB1YmxpYyBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlVVJJOwotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlpZiAobG9jYWxOYW1lLmVxdWFscygic2NoZW1hIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlpbnQgbkF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbkF0dHJpYnV0ZXM7IGkrKykgewotCQkJCQlpZiAoYXR0cmlidXRlcy5nZXRMb2NhbE5hbWUoaSkuZXF1YWxzKCJ0YXJnZXROYW1lc3BhY2UiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl7Ci0JCQkJCQl0YXJnZXROYW1lc3BhY2VVUkkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgU3RvcFBhcnNlRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL2V0b29sNTAvY2F0YWxvZ0VudHJ5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvZXRvb2w1MC9jYXRhbG9nRW50cnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjViMjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvZXRvb2w1MC9jYXRhbG9nRW50cnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9ldG9vbDUwL25leHRDYXRhbG9nLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvZXRvb2w1MC9uZXh0Q2F0YWxvZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOTM0YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9ldG9vbDUwL25leHRDYXRhbG9nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvZW50cnlfb2JqLnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvZW50cnlfb2JqLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU3MTQ3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L2VudHJ5X29iai5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L2ZpbGVfZXhwYW5kLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvZmlsZV9leHBhbmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWY5YmFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvZmlsZV9leHBhbmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vYmoxNi9maWxlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L2ZpbGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYxMTYxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L2ZpbGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvbmV4dENhdGFsb2dfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvbmV4dENhdGFsb2dfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRiZmU3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L25leHRDYXRhbG9nX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L3htbGNhdGFsb2dfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYveG1sY2F0YWxvZ19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjE0NDFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYveG1sY2F0YWxvZ19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vdnIxNi9lcnJvci1vdmVybGF5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb3ZyMTYvZXJyb3Itb3ZlcmxheS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOWRjY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vdnIxNi9lcnJvci1vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL0RPTVByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL0RPTVByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJlYmI3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9ET01Qcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgRE9NUHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeSB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIQUNLID0gImhhY2siOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgRE9NUHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeSgpIHsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVBdHRyaWJ1dGVQcm9wZXJ0eURlc2NyaXB0b3IoQXR0ciBhdHRyKSB7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3IgcmVzdWx0ID0gbnVsbDsKLQotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCi0JCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGF0dHIuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQotCQlpZiAobXEgIT0gbnVsbCkgewotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCA9IG1xLmdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0JCQlpZiAoYWQgIT0gbnVsbCkgewotCQkJCVN0cmluZ1tdIHZhbHVlc0FycmF5ID0gbXEuZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhhdHRyLmdldE93bmVyRWxlbWVudCgpLCBhZCk7Ci0JCQkJaWYgKCh2YWx1ZXNBcnJheSAhPSBudWxsKSAmJiAodmFsdWVzQXJyYXkubGVuZ3RoID4gMCkpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IEVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3IoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZSwgdmFsdWVzQXJyYXkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihhdHRyaWJ1dGVOYW1lKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZUNEQVRBU2VjdGlvblByb3BlcnR5RGVzY3JpcHRvcihDREFUQVNlY3Rpb24gY2RhdGFTZWN0aW9uKSB7Ci0JCXJldHVybiBjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKEhBQ0spOwotCX0KLQotCXB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZUNvbW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoQ29tbWVudCBjb21tZW50KSB7Ci0JCXJldHVybiBjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKEhBQ0spOwotCX0KLQotCXByb3RlY3RlZCBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJVGV4dFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZSk7Ci0JCXJldHVybiBkZXNjcmlwdG9yOwotCX0KLQotCXB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZURvY3VtZW50VHlwZVByb3BlcnR5RGVzY3JpcHRvcihEb2N1bWVudFR5cGUgZG9jdW1lbnRUeXBlKSB7Ci0JCXJldHVybiBudWxsOyAvLyBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcihIQUNLLCBIQUNLKTsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVFbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihIQUNLKTsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVFbnRpdHlSZWZlcmVuY2VQcm9wZXJ0eURlc2NyaXB0b3IoRW50aXR5UmVmZXJlbmNlIGVudGl0eVJlZmVyZW5jZSkgewotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihIQUNLKTsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25Qcm9wZXJ0eURlc2NyaXB0b3IoUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpKSB7Ci0JCXJldHVybiBjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKEhBQ0spOwotCX0KLQotCXB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3IgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0JCQlpbnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCQlzd2l0Y2ggKG5vZGVUeXBlKSB7Ci0JCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDogewotCQkJCQlyZXN1bHQgPSBjcmVhdGVBdHRyaWJ1dGVQcm9wZXJ0eURlc2NyaXB0b3IoKEF0dHIpIG5vZGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6IHsKLQkJCQkJcmVzdWx0ID0gY3JlYXRlQ0RBVEFTZWN0aW9uUHJvcGVydHlEZXNjcmlwdG9yKChDREFUQVNlY3Rpb24pIG5vZGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQkJcmVzdWx0ID0gY3JlYXRlQ29tbWVudFByb3BlcnR5RGVzY3JpcHRvcigoQ29tbWVudCkgbm9kZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFIDogewotCQkJCQlyZXN1bHQgPSBjcmVhdGVEb2N1bWVudFR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoKERvY3VtZW50VHlwZSkgbm9kZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCQlyZXN1bHQgPSBjcmVhdGVFbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKChFbGVtZW50KSBub2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOiB7Ci0JCQkJCXJlc3VsdCA9IGNyZWF0ZUVudGl0eVJlZmVyZW5jZVByb3BlcnR5RGVzY3JpcHRvcigoRW50aXR5UmVmZXJlbmNlKSBub2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJCXJlc3VsdCA9IGNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvblByb3BlcnR5RGVzY3JpcHRvcigoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBub2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJCXJlc3VsdCA9IGNyZWF0ZVRleHRQcm9wZXJ0eURlc2NyaXB0b3IoKFRleHQpIG5vZGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVUZXh0UHJvcGVydHlEZXNjcmlwdG9yKFRleHQgdGV4dCkgewotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihIQUNLKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9JRGVzaWduVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9JRGVzaWduVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYmU5N2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvSURlc2lnblZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotcHVibGljIGludGVyZmFjZSBJRGVzaWduVmlld2VyIHsKLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCk7Ci0KLQlTdHJpbmcgZ2V0VGl0bGUoKTsKLQotCXZvaWQgc2V0RG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50KTsKLQotCUlTZWxlY3Rpb25Qcm92aWRlciBnZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9JRGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDExYTNmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9JRGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzIElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciB7Ci0JcHVibGljIHZvaWQgaW5pdFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9ucyhJQWN0aW9uQmFycyBiYXJzKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1NvdXJjZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9Tb3VyY2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTlmZmNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1NvdXJjZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5FeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JRXh0ZW5kZWRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgU291cmNlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBpbXBsZW1lbnRzIElFeHRlbmRlZENvbnRyaWJ1dG9yIHsKLQotCXByb3RlY3RlZCBJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgPSBudWxsOwotCXByb3RlY3RlZCBJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3Igc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgPSBudWxsOwotCXByb3RlY3RlZCBNdWx0aVBhZ2VFZGl0b3JQYXJ0IG11bHRpUGFnZUVkaXRvciA9IG51bGw7Ci0KLQkvLyBFZGl0b3JFeHRlbnNpb24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkuWE1MTXVsdGlQYWdlRWRpdG9yUGFydCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElFeHRlbmRlZENvbnRyaWJ1dG9yIGV4dGVuZGVkQ29udHJpYnV0b3I7Ci0KLQlwdWJsaWMgU291cmNlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgPSBuZXcgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yKCk7Ci0KLQkJLy8gUmVhZCBhY3Rpb24gZXh0ZW5zaW9ucy4KLQkJRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyKCk7Ci0JCWV4dGVuZGVkQ29udHJpYnV0b3IgPSBidWlsZGVyLnJlYWRBY3Rpb25FeHRlbnNpb25zKEVESVRPUl9JRCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCXN1cGVyLmluaXQoYWN0aW9uQmFycyk7Ci0KLQkJaWYgKGFjdGlvbkJhcnMgIT0gbnVsbCkgewotCQkJaW5pdERlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKGFjdGlvbkJhcnMpOwotCQkJaW5pdFNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yKGFjdGlvbkJhcnMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJaWYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmluaXQoYWN0aW9uQmFycywgZ2V0UGFnZSgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRTb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcihJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCWlmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsKSB7Ci0JCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5pbml0KGFjdGlvbkJhcnMsIGdldFBhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJaWYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmRpc3Bvc2UoKTsKLQkJfQotCi0JCWlmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsKSB7Ci0JCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5kaXNwb3NlKCk7Ci0JCX0KLQotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKSB7Ci0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb01lbnUobWVudSk7Ci0KLQkJLy9hZGRUb01lbnUobWVudSk7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkgewotCQkJZXh0ZW5kZWRDb250cmlidXRvci5jb250cmlidXRlVG9NZW51KG1lbnUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRXh0ZW5kZWRDb250cmlidXRvciNjb250cmlidXRlVG9Qb3B1cE1lbnUoSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbnRyaWJ1dGVUb1BvcHVwTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCi0JCWFkZFRvUG9wdXBNZW51KG1lbnUpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuY29udHJpYnV0ZVRvUG9wdXBNZW51KG1lbnUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9Qb3B1cE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvVG9vbEJhcih0b29sQmFyTWFuYWdlcik7Ci0KLQkJYWRkVG9Ub29sQmFyKHRvb2xCYXJNYW5hZ2VyKTsKLQotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKSB7Ci0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmNvbnRyaWJ1dGVUb1Rvb2xCYXIodG9vbEJhck1hbmFnZXIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9TdGF0dXNMaW5lKElTdGF0dXNMaW5lTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjb250cmlidXRlVG9TdGF0dXNMaW5lKElTdGF0dXNMaW5lTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb1N0YXR1c0xpbmUobWFuYWdlcik7Ci0KLQkJYWRkVG9TdGF0dXNMaW5lKG1hbmFnZXIpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuY29udHJpYnV0ZVRvU3RhdHVzTGluZShtYW5hZ2VyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvU3RhdHVzTGluZShJU3RhdHVzTGluZU1hbmFnZXIgbWFuYWdlcikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgSUV4dGVuZGVkQ29udHJpYnV0b3IjdXBkYXRlVG9vbGJhckFjdGlvbnMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVRvb2xiYXJBY3Rpb25zKCkgewotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKSB7Ci0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLnVwZGF0ZVRvb2xiYXJBY3Rpb25zKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCS8vIHNhdmUgbXVsdGlQYWdlRWRpdG9yIGJlZm9yZSBjYWxsaW5nCi0JCS8vIHN1cGVyLnNldEFjdGl2ZUVkaXRvcih0YXJnZXRFZGl0b3IpCi0JCS8vIHN1cGVyLnNldEFjdGl2ZUVkaXRvciB3aWxsIGNhbGwgc2V0QWN0aXZlUGFnZShJRWRpdG9yUGFydAotCQkvLyBhY3RpdmVFZGl0b3IpCi0JCS8vIG11bHRpUGFnZUVkaXRvciBpcyBuZWVkZWQgaW4gc2V0QWN0aXZlUGFnZShJRWRpdG9yUGFydAotCQkvLyBhY3RpdmVFZGl0b3IpCi0JCWlmICh0YXJnZXRFZGl0b3IgaW5zdGFuY2VvZiBNdWx0aVBhZ2VFZGl0b3JQYXJ0KSB7Ci0JCQltdWx0aVBhZ2VFZGl0b3IgPSAoTXVsdGlQYWdlRWRpdG9yUGFydCkgdGFyZ2V0RWRpdG9yOwotCQl9Ci0KLQkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHRhcmdldEVkaXRvcik7Ci0KLQkJdXBkYXRlVG9vbGJhckFjdGlvbnMoKTsKLQotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKSB7Ci0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcih0YXJnZXRFZGl0b3IpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFnZShJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJLy8gVGhpcyBjb250cmlidXRvciBpcyBkZXNpZ25lZCBmb3IgU3RydWN0dXJlZFRleHRNdWx0aVBhZ2VFZGl0b3JQYXJ0LgotCQkvLyBUbyBzYWZlLWd1YXJkIHRoaXMgZnJvbSBwcm9ibGVtcyBjYXVzZWQgYnkgdW5leHBlY3RlZCB1c2FnZSBieQotCQkvLyBvdGhlciBlZGl0b3JzLCB0aGUgZm9sbG93aW5nCi0JCS8vIGNoZWNrIGlzIGFkZGVkLgotCQlpZiAobXVsdGlQYWdlRWRpdG9yICE9IG51bGwpIHsKLQkJCWlmICgoYWN0aXZlRWRpdG9yICE9IG51bGwpICYmIChhY3RpdmVFZGl0b3IgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dEVkaXRvcikpIHsKLQkJCQlhY3RpdmF0ZVNvdXJjZVBhZ2UoYWN0aXZlRWRpdG9yKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWFjdGl2YXRlRGVzaWduUGFnZShhY3RpdmVFZGl0b3IpOwotCQkJfQotCQl9Ci0KLQkJdXBkYXRlVG9vbGJhckFjdGlvbnMoKTsKLQotCQlJQWN0aW9uQmFycyBhY3Rpb25CYXJzID0gZ2V0QWN0aW9uQmFycygpOwotCQlpZiAoYWN0aW9uQmFycyAhPSBudWxsKSB7Ci0JCQkvLyB1cGRhdGUgbWVudSBiYXIgYW5kIHRvb2wgYmFyCi0JCQlhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFjdGl2YXRlRGVzaWduUGFnZShJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJaWYgKChkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciAhPSBudWxsKSAmJiAoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBJRGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpKSB7Ci0JCQlkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IobXVsdGlQYWdlRWRpdG9yKTsKLQkJfQotCi0JCWlmICgoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgIT0gbnVsbCkgJiYgKHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSkgewotCQkJLy8gaWYgZGVzaWduIHBhZ2UgaXMgbm90IHJlYWxseSBhbiBJRWRpdG9yUGFydCwgYWN0aXZlRWRpdG9yID09Ci0JCQkvLyBudWxsLCBzbyBwYXNzIGluIG11bHRpUGFnZUVkaXRvciBpbnN0ZWFkIChkMjgyNDE0KQotCQkJaWYgKGFjdGl2ZUVkaXRvciA9PSBudWxsKSB7Ci0JCQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKG11bHRpUGFnZUVkaXRvcik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQkJCX0KLQkJCSgoSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcikuc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZVNvdXJjZVBhZ2UoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKSB7Ci0JCWlmICgoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgIT0gbnVsbCkgJiYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSkgewotCQkJZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKG11bHRpUGFnZUVkaXRvcik7Ci0JCX0KLQotCQlpZiAoKHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yICE9IG51bGwpICYmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciBpbnN0YW5jZW9mIElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikpIHsKLQkJCXNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcihhY3RpdmVFZGl0b3IpOwotCQkJKChJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yKS5zZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKHRydWUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9Tb3VyY2VQYWdlQWN0aW9uQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1NvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDFlMjUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1NvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5BY3Rpb25Db250cmlidXRvclhNTDsKLQotCi0vKioKLSAqIFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvcgotICogCi0gKiBUaGlzIGNsYXNzIGlzIGZvciBtdWx0aSBwYWdlIGVkaXRvcidzIHNvdXJjZSBwYWdlIGNvbnRyaWJ1dG9yLgotICogCi0gKiBVc2UgWE1MRWRpdG9yQWN0aW9uQ29udHJpYnV0b3IgZm9yIHNpbmdsZSBwYWdlIGVkaXRvci4KLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvciBleHRlbmRzIEFjdGlvbkNvbnRyaWJ1dG9yWE1MIHsKLQotCXByaXZhdGUgSUFjdGlvbkJhcnMgZkJhcnM7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYWxsczoKLQkgKiA8dWw+Ci0JICogPGxpPjxjb2RlPmNvbnRyaWJ1dGVUb01lbnU8L2NvZGU+IHdpdGggPGNvZGU+YmFyczwvY29kZT4nIG1lbnUKLQkgKiBtYW5hZ2VyPC9saT4KLQkgKiA8bGk+PGNvZGU+Y29udHJpYnV0ZVRvVG9vbEJhcjwvY29kZT4gd2l0aCA8Y29kZT5iYXJzPC9jb2RlPicgdG9vbAotCSAqIGJhciBtYW5hZ2VyPC9saT4KLQkgKiA8bGk+PGNvZGU+Y29udHJpYnV0ZVRvU3RhdHVzTGluZTwvY29kZT4gd2l0aCA8Y29kZT5iYXJzPC9jb2RlPicKLQkgKiBzdGF0dXMgbGluZSBtYW5hZ2VyPC9saT4KLQkgKiA8L3VsPgotCSAqIFRoZSBnaXZlbiBhY3Rpb24gYmFycyBhcmUgYWxzbyByZW1lbWJlcmVkIGFuZCBtYWRlIGFjY2Vzc2libGUgdmlhCi0JICogPGNvZGU+Z2V0QWN0aW9uQmFyczwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGJhcnMKLQkgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gYmFycwotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYmFycykgewotCQlmQmFycyA9IGJhcnM7Ci0JCWNvbnRyaWJ1dGVUb01lbnUoYmFycy5nZXRNZW51TWFuYWdlcigpKTsKLQkJY29udHJpYnV0ZVRvVG9vbEJhcihiYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCkpOwotCQljb250cmlidXRlVG9TdGF0dXNMaW5lKGJhcnMuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIGNvbnRyaWJ1dG9yJ3MgYWN0aW9uIGJhcnMuCi0JICogCi0JICogQHJldHVybiB0aGUgYWN0aW9uIGJhcnMKLQkgKi8KLQlwdWJsaWMgSUFjdGlvbkJhcnMgZ2V0QWN0aW9uQmFycygpIHsKLQkJcmV0dXJuIGZCYXJzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1RyZWVDb250ZW50SGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9UcmVlQ29udGVudEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWE0ZGQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1RyZWVDb250ZW50SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKgotICogVGhpcyBwZXJmb3JtcyB0aGUgd29yayBvZiB0YWtpbmcgYSBET00gdHJlZSBhbmQgY29udmVydGluZyBpdCB0byBhCi0gKiBkaXNwbGF5YWJsZSAnVUknIHRyZWUuCi0gKiAKLSAqIEZvciBleGFtcGxlIDogLSB3aGl0ZSBzcGFjZSB0ZXh0IG5vZGVzIGFyZSBvbW1pdGVkIGZyb20gdGhlICdVSScgdHJlZSAtCi0gKiBhZGphY2VudCBUZXh0IGFuZCBFbnRpdHlSZWZlcmVuY2Ugbm9kZXMgYXJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgJ1VJJwotICogbm9kZSAtIEVsZW1lbnRzIHdpdGggJ3RleHQgb25seScgY2hpbGRyZW4gYXJlIGRpcGxheWVkIHdpdGhvdXQgY2hpbGRyZW4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVHJlZUNvbnRlbnRIZWxwZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElERV9XSElURV9TUEFDRV9URVhUX05PREVTID0gODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01CSU5FX0FESkFDRU5UX1RFWFRfQU5EX0VOVElUWV9SRUZFUkVOQ0VTID0gMTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElERV9FTEVNRU5UX0NISUxEX1RFWFRfTk9ERVMgPSAzMjsKLQotCXByb3RlY3RlZCBpbnQgc3R5bGUgPSBISURFX1dISVRFX1NQQUNFX1RFWFRfTk9ERVMgfCBDT01CSU5FX0FESkFDRU5UX1RFWFRfQU5EX0VOVElUWV9SRUZFUkVOQ0VTIHwgSElERV9FTEVNRU5UX0NISUxEX1RFWFRfTk9ERVM7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNTdHlsZUZsYWcoaW50IGZsYWcpIHsKLQkJcmV0dXJuIChzdHlsZSAmIGZsYWcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IG51bGw7Ci0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgZWxlbWVudDsKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWJvb2xlYW4gdGV4dENvbnRlbnRPbmx5ID0gdHJ1ZTsKLQotCQkJTmFtZWROb2RlTWFwIG1hcCA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQkJaW50IGxlbmd0aCA9IG1hcC5nZXRMZW5ndGgoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCWxpc3QuYWRkKG1hcC5pdGVtKGkpKTsKLQkJCQkJdGV4dENvbnRlbnRPbmx5ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQlOb2RlIHByZXZJbmNsdWRlZE5vZGUgPSBudWxsOwotCQkJZm9yIChOb2RlIGNoaWxkTm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZE5vZGUgIT0gbnVsbDsgY2hpbGROb2RlID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQlpbnQgY2hpbGROb2RlVHlwZSA9IGNoaWxkTm9kZS5nZXROb2RlVHlwZSgpOwotCQkJCWJvb2xlYW4gaW5jbHVkZU5vZGUgPSB0cnVlOwotCi0JCQkJaWYgKGluY2x1ZGVOb2RlICYmIGhhc1N0eWxlRmxhZyhISURFX1dISVRFX1NQQUNFX1RFWFRfTk9ERVMpKSB7Ci0JCQkJCWlmIChpc0lnbm9yYWJsZVRleHQoY2hpbGROb2RlKSkgewotCQkJCQkJLy8gZmlsdGVyIG91dCB0aGUgaWdub3JhYmxlIHRleHQgbm9kZQotCQkJCQkJaW5jbHVkZU5vZGUgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChpbmNsdWRlTm9kZSAmJiBoYXNTdHlsZUZsYWcoQ09NQklORV9BREpBQ0VOVF9URVhUX0FORF9FTlRJVFlfUkVGRVJFTkNFUykpIHsKLQkJCQkJaWYgKGlzVGV4dE9yRW50aXR5UmVmZXJlbmNlTm9kZShjaGlsZE5vZGUpICYmIChwcmV2SW5jbHVkZWROb2RlICE9IG51bGwpICYmIGlzVGV4dE9yRW50aXR5UmVmZXJlbmNlTm9kZShwcmV2SW5jbHVkZWROb2RlKSkgewotCQkJCQkJLy8gd2Ugb25seSBzaG93IHRoZSBmaXJzdCBvZiBhIGxpc3Qgb2YgYWRqYWNlbnQgdGV4dAotCQkJCQkJLy8gb3IgZW50aXR5IHJlZmVyZW5jZSBub2RlIGluIHRoZSB0cmVlCi0JCQkJCQkvLyBzbyB3ZSBmaWx0ZXIgb3V0IHRoaXMgc3Vic2VxdWVudCBvbmUKLQkJCQkJCWluY2x1ZGVOb2RlID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoaGFzU3R5bGVGbGFnKEhJREVfRUxFTUVOVF9DSElMRF9URVhUX05PREVTKSkgewotCQkJCQlpZiAoKGNoaWxkTm9kZVR5cGUgIT0gTm9kZS5URVhUX05PREUpICYmIChjaGlsZE5vZGVUeXBlICE9IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFKSkgewotCQkJCQkJdGV4dENvbnRlbnRPbmx5ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoaW5jbHVkZU5vZGUpIHsKLQkJCQkJbGlzdC5hZGQoY2hpbGROb2RlKTsKLQkJCQkJcHJldkluY2x1ZGVkTm9kZSA9IGNoaWxkTm9kZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChoYXNTdHlsZUZsYWcoSElERV9FTEVNRU5UX0NISUxEX1RFWFRfTk9ERVMpICYmIHRleHRDb250ZW50T25seSkgewotCQkJCXJlc3VsdCA9IG5ldyBPYmplY3RbMF07Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHQgPSBsaXN0LnRvQXJyYXkoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVGV4dE9yRW50aXR5UmVmZXJlbmNlTm9kZShOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHx8IChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSWdub3JhYmxlVGV4dChOb2RlIG5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJU3RyaW5nIGRhdGEgPSAoKFRleHQpIG5vZGUpLmdldERhdGEoKTsKLQkJCXJlc3VsdCA9ICgoZGF0YSA9PSBudWxsKSB8fCAoZGF0YS50cmltKCkubGVuZ3RoKCkgPT0gMCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb21iaW5lZFRleHROb2RlKE5vZGUgbm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlOb2RlIG5leHROb2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQkJaWYgKG5leHROb2RlICE9IG51bGwpIHsKLQkJCQlpZiAobmV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpIHsKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDb21iaW5lZFRleHROb2RlTGlzdChOb2RlIHRoZU5vZGUpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotCQlib29sZWFuIHByZXZJc0VudGl0eSA9IGZhbHNlOwotCQlmb3IgKE5vZGUgbm9kZSA9IHRoZU5vZGU7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFKSB7Ci0JCQkJcHJldklzRW50aXR5ID0gdHJ1ZTsKLQkJCQlsaXN0LmFkZChub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKChub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKHByZXZJc0VudGl0eSB8fCAobm9kZSA9PSB0aGVOb2RlKSkpIHsKLQkJCQlwcmV2SXNFbnRpdHkgPSBmYWxzZTsKLQkJCQlsaXN0LmFkZChub2RlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFRleHRWYWx1ZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJTGlzdCBsaXN0ID0gX2dldEVsZW1lbnRUZXh0Q29udGVudChlbGVtZW50KTsKLQkJcmV0dXJuIGxpc3QgIT0gbnVsbCA/IGdldFZhbHVlRm9yVGV4dENvbnRlbnQobGlzdCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRUZXh0VmFsdWUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdmFsdWUpIHsKLQkJc2V0RWxlbWVudE5vZGVWYWx1ZShlbGVtZW50LCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IF9nZXRFbGVtZW50VGV4dENvbnRlbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCUxpc3QgcmVzdWx0ID0gbnVsbDsKLQotCQlmb3IgKE5vZGUgbm9kZSA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmICgobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB8fCAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFKSkgewotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgVmVjdG9yKCk7Ci0JCQkJfQotCQkJCXJlc3VsdC5hZGQobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHQgPSBudWxsOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIGVsZW1lbnQgaXMgaGFzICd0ZXh0IG9ubHknIGNvbnRlbnQgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlCi0JICogbGlzdCBvZiBlbGVtZW50cyB0aGF0IGNvbXBvc2UgdGhlIHRleHQgb25seSBjb250ZW50Ci0JICovCi0JcHVibGljIExpc3QgZ2V0RWxlbWVudFRleHRDb250ZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlMaXN0IHJlc3VsdCA9IG51bGw7Ci0JCWlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGVzKCkpIHsKLQkJCXJlc3VsdCA9IF9nZXRFbGVtZW50VGV4dENvbnRlbnQoZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVZhbHVlKE5vZGUgbm9kZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlzd2l0Y2ggKG5vZGVUeXBlKSB7Ci0JCQljYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOiB7Ci0JCQkJcmVzdWx0ID0gKChBdHRyKSBub2RlKS5nZXRWYWx1ZSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0JCQkJLy8gZHJvcCB0aHJ1Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCXJlc3VsdCA9ICgoQ2hhcmFjdGVyRGF0YSkgbm9kZSkuZ2V0RGF0YSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6IHsKLQkJCQlyZXN1bHQgPSBnZXREb2N1bWVudFR5cGVWYWx1ZSgoRG9jdW1lbnRUeXBlKSBub2RlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJcmVzdWx0ID0gZ2V0RWxlbWVudE5vZGVWYWx1ZSgoRWxlbWVudCkgbm9kZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIDoKLQkJCQkvLyBkcm9wIHRocnUKLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJcmVzdWx0ID0gZ2V0VGV4dE5vZGVWYWx1ZShub2RlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJcmVzdWx0ID0gKChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIG5vZGUpLmdldERhdGEoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShOb2RlIG5vZGUsIFN0cmluZyB2YWx1ZSkgewotCQlpbnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCXRyeSB7Ci0JCQlzd2l0Y2ggKG5vZGVUeXBlKSB7Ci0JCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDogewotCQkJCQkoKEF0dHIpIG5vZGUpLnNldFZhbHVlKHZhbHVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJCQkvLyBkcm9wIHRocnUKLQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCQkoKENoYXJhY3RlckRhdGEpIG5vZGUpLnNldERhdGEodmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQkJc2V0RWxlbWVudE5vZGVWYWx1ZSgoRWxlbWVudCkgbm9kZSwgdmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSA6Ci0JCQkJCS8vIGRyb3AgdGhydQotCQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJCXNldFRleHROb2RlVmFsdWUobm9kZSwgdmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQkJKChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIG5vZGUpLnNldERhdGEodmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBlKSB7Ci0JCQlEaXNwbGF5IGQgPSBnZXREaXNwbGF5KCk7Ci0JCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQkJZC5iZWVwKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCk7Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERvY3VtZW50VHlwZVZhbHVlKERvY3VtZW50VHlwZSBkb2N1bWVudFR5cGUpIHsKLQkJcmV0dXJuIERPTVdyaXRlci5nZXREb2N1bWVudFR5cGVEYXRhKGRvY3VtZW50VHlwZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFbGVtZW50Tm9kZVZhbHVlKEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJTGlzdCBsaXN0ID0gZ2V0RWxlbWVudFRleHRDb250ZW50KGVsZW1lbnQpOwotCQlpZiAobGlzdCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRWYWx1ZUZvclRleHRDb250ZW50KGxpc3QpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RWxlbWVudE5vZGVWYWx1ZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB2YWx1ZSkgewotCQlMaXN0IGxpc3QgPSBnZXRFbGVtZW50VGV4dENvbnRlbnQoZWxlbWVudCk7Ci0JCWlmIChsaXN0ICE9IG51bGwpIHsKLQkJCXNldFZhbHVlRm9yVGV4dENvbnRlbnQobGlzdCwgdmFsdWUpOwotCQl9Ci0JCWVsc2UgewotCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCVRleHQgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhbHVlKTsKLQkJCWVsZW1lbnQuYXBwZW5kQ2hpbGQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRleHROb2RlVmFsdWUoTm9kZSBub2RlKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlMaXN0IGxpc3QgPSBudWxsOwotCQlpZiAoaXNDb21iaW5lZFRleHROb2RlKG5vZGUpKSB7Ci0JCQlsaXN0ID0gZ2V0Q29tYmluZWRUZXh0Tm9kZUxpc3Qobm9kZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlsaXN0ID0gbmV3IFZlY3RvcigpOwotCQkJbGlzdC5hZGQobm9kZSk7Ci0JCX0KLQkJcmVzdWx0ID0gZ2V0VmFsdWVGb3JUZXh0Q29udGVudChsaXN0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUZXh0Tm9kZVZhbHVlKE5vZGUgbm9kZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCUxpc3QgbGlzdCA9IG51bGw7Ci0JCWlmIChpc0NvbWJpbmVkVGV4dE5vZGUobm9kZSkpIHsKLQkJCWxpc3QgPSBnZXRDb21iaW5lZFRleHROb2RlTGlzdChub2RlKTsKLQkJfQotCQllbHNlIHsKLQkJCWxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCQlsaXN0LmFkZChub2RlKTsKLQkJfQotCQlzZXRWYWx1ZUZvclRleHRDb250ZW50KGxpc3QsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dCBnZXRFZmZlY3RpdmVUZXh0Tm9kZUZvckNvbWJpbmVkTm9kZUxpc3QoTGlzdCBsaXN0KSB7Ci0JCVRleHQgcmVzdWx0ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpLm5leHQoKTsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQlyZXN1bHQgPSAoVGV4dCkgbm9kZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWVGb3JUZXh0Q29udGVudChMaXN0IGxpc3QpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChsaXN0LnNpemUoKSA+IDApIHsKLQkJCUlET01Ob2RlIGZpcnN0ID0gKElET01Ob2RlKSBsaXN0LmdldCgwKTsKLQkJCUlET01Ob2RlIGxhc3QgPSAoSURPTU5vZGUpIGxpc3QuZ2V0KGxpc3Quc2l6ZSgpIC0gMSk7Ci0JCQlJRE9NTW9kZWwgbW9kZWwgPSBmaXJzdC5nZXRNb2RlbCgpOwotCQkJaW50IHN0YXJ0ID0gZmlyc3QuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWludCBlbmQgPSBsYXN0LmdldEVuZE9mZnNldCgpOwotCQkJdHJ5IHsKLQkJCQlyZXN1bHQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXQoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0KLQkJLy8gd2UgdHJpbSB0aGUgY29udGVudCBzbyB0aGF0IGl0IGxvb2tzIG5pY2Ugd2hlbiB2aWV3ZWQKLQkJLy8gd2UgbmVlZCB0byBiZSBjYXJmdWxsIHRvIHByZXNlcnZlIHRoZSAndHJpbW1lZCcgdGV4dCB3aGVuIHRoZSB2YWx1ZQotCQkvLyBpcyBzZXQgKHNlZSBzZXRWYWx1ZUZvclRleHRDb250ZW50KQotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHJlc3VsdC50cmltKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZUZvclRleHRDb250ZW50KExpc3QgbGlzdCwgU3RyaW5nIHZhbHVlKSB7Ci0JCS8vIFN0cmluZyBvbGRWYWx1ZSA9IGdldFZhbHVlRm9yVGV4dENvbnRlbnQoKTsKLQkJLy8gd2Ugd29ycnkgYWJvdXQgcHJlc2VydmluZyB0cmltbWVkIHRleHQKLQkJaWYgKGxpc3Quc2l6ZSgpID4gMCkgewotCQkJSURPTU5vZGUgZmlyc3QgPSAoSURPTU5vZGUpIGxpc3QuZ2V0KDApOwotCQkJSURPTU5vZGUgbGFzdCA9IChJRE9NTm9kZSkgbGlzdC5nZXQobGlzdC5zaXplKCkgLSAxKTsKLQkJCWludCBzdGFydCA9IGZpcnN0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpbnQgZW5kID0gbGFzdC5nZXRFbmRPZmZzZXQoKTsKLQkJCWZpcnN0LmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQodGhpcywgc3RhcnQsIGVuZCAtIHN0YXJ0LCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VkaXRhYmxlKE5vZGUgbm9kZSkgewotCQlpbnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCWNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6Ci0JCQkJLy8gZHJvcCB0aHJ1Ci0JCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLQkJCQkvLyBkcm9wIHRocnUKLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotCQkJCS8vIGRyb3AgdGhydQotCQkJY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSA6Ci0JCQkJLy8gZHJvcCB0aHJ1Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCQkvLyBkcm9wIHRocnUKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJcmVzdWx0ID0gKGdldEVsZW1lbnRUZXh0Q29udGVudCgoRWxlbWVudCkgbm9kZSkgIT0gbnVsbCkgfHwgKG5vZGUuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpID09IDApOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1RyZWVFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1RyZWVFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk4MzJjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9UcmVlRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VNb3ZlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2Nyb2xsQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLXB1YmxpYyBjbGFzcyBUcmVlRXh0ZW5zaW9uIGltcGxlbWVudHMgUGFpbnRMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgVHJlZSBmVHJlZTsKLQlwcm90ZWN0ZWQgRWRpdE1hbmFnZXIgZWRpdE1hbmFnZXI7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIGZDb2x1bW5Qcm9wZXJ0aWVzOwotCXByb3RlY3RlZCBJQ2VsbE1vZGlmaWVyIGNlbGxNb2RpZmllcjsKLQlwcm90ZWN0ZWQgaW50IGNvbHVtblBvc2l0aW9uID0gMzAwOwotCXByb3RlY3RlZCBpbnQgY29sdW1uSGl0V2lkdGggPSA1OwotCXByb3RlY3RlZCBDb2xvciB0YWJsZUxpbmVDb2xvcjsKLQlwcm90ZWN0ZWQgaW50IGNvbnRyb2xXaWR0aDsKLQlwcm90ZWN0ZWQgRGVsYXllZERyYXdUaW1lciBkZWxheWVkRHJhd1RpbWVyOwotCXByaXZhdGUgYm9vbGVhbiBmaXNVbnN1cHBvcnRlZElucHV0ID0gZmFsc2U7Ci0KLQlwdWJsaWMgVHJlZUV4dGVuc2lvbihUcmVlIHRyZWUpIHsKLQkJdGhpcy5mVHJlZSA9IHRyZWU7Ci0JCUludGVybmFsTW91c2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJbnRlcm5hbE1vdXNlTGlzdGVuZXIoKTsKLQkJdHJlZS5hZGRNb3VzZU1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRyZWUuYWRkTW91c2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRyZWUuYWRkUGFpbnRMaXN0ZW5lcih0aGlzKTsKLQkJZWRpdE1hbmFnZXIgPSBuZXcgRWRpdE1hbmFnZXIodHJlZSk7Ci0JCWRlbGF5ZWREcmF3VGltZXIgPSBuZXcgRGVsYXllZERyYXdUaW1lcih0cmVlKTsKLQotCQl0YWJsZUxpbmVDb2xvciA9IHRyZWUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfTElHSFRfU0hBRE9XKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0YWJsZUxpbmVDb2xvci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2VsbE1vZGlmaWVyKElDZWxsTW9kaWZpZXIgbW9kaWZpZXIpIHsKLQkJY2VsbE1vZGlmaWVyID0gbW9kaWZpZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXRDYWNoZWREYXRhKCkgewotCQkvLyB0b2RvOiBzdXJlIHNlZW1zIHdlIHNob3VsZCByZXNldCBzb21ldGhpbmc/Ci0JfQotCi0JcHVibGljIElDZWxsTW9kaWZpZXIgZ2V0Q2VsbE1vZGlmaWVyKCkgewotCQlyZXR1cm4gY2VsbE1vZGlmaWVyOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEl0ZW1MaXN0KCkgewotCQlMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCWdldEl0ZW1MaXN0SGVscGVyKGZUcmVlLmdldEl0ZW1zKCksIGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZXRJdGVtTGlzdEhlbHBlcihUcmVlSXRlbVtdIGl0ZW1zLCBMaXN0IGxpc3QpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJVHJlZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQkJbGlzdC5hZGQoaXRlbSk7Ci0JCQlnZXRJdGVtTGlzdEhlbHBlcihpdGVtLmdldEl0ZW1zKCksIGxpc3QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFRyZWVJdGVtIGdldFRyZWVJdGVtT25Sb3coaW50IHB4LCBpbnQgcHkpIHsKLQkJVHJlZUl0ZW0gcmVzdWx0ID0gbnVsbDsKLQkJTGlzdCBsaXN0ID0gZ2V0SXRlbUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIGkubmV4dCgpOwotCQkJUmVjdGFuZ2xlIHIgPSBpdGVtLmdldEJvdW5kcygpOwotCQkJaWYgKChyICE9IG51bGwpICYmIChweCA+PSByLngpICYmIChweSA+PSByLnkpICYmIChweSA8PSByLnkgKyByLmhlaWdodCkpIHsKLQkJCQlyZXN1bHQgPSBpdGVtOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEludGVybmFsTW91c2VMaXN0ZW5lciBleHRlbmRzIE1vdXNlQWRhcHRlciBpbXBsZW1lbnRzIE1vdXNlTW92ZUxpc3RlbmVyIHsKLQkJcHJvdGVjdGVkIGludCBjb2x1bW5EcmFnZ2VkID0gLTE7Ci0JCXByb3RlY3RlZCBib29sZWFuIGlzRG93biA9IGZhbHNlOwotCQlwcm90ZWN0ZWQgaW50IHByZXZYID0gLTE7Ci0JCXByb3RlY3RlZCBDdXJzb3IgY3Vyc29yID0gbnVsbDsKLQotCQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBlKSB7Ci0JCQlpZiAoKGUueCA+IGNvbHVtblBvc2l0aW9uIC0gY29sdW1uSGl0V2lkdGgpICYmIChlLnggPCBjb2x1bW5Qb3NpdGlvbiArIGNvbHVtbkhpdFdpZHRoKSkgewotCQkJCWlmIChjdXJzb3IgPT0gbnVsbCkgewotCQkJCQljdXJzb3IgPSBuZXcgQ3Vyc29yKGZUcmVlLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9TSVpFV0UpOwotCQkJCQlmVHJlZS5zZXRDdXJzb3IoY3Vyc29yKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoY3Vyc29yICE9IG51bGwpIHsKLQkJCQkJZlRyZWUuc2V0Q3Vyc29yKG51bGwpOwotCQkJCQljdXJzb3IuZGlzcG9zZSgpOwotCQkJCQljdXJzb3IgPSBudWxsOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGNvbHVtbkRyYWdnZWQgIT0gLTEpIHsKLQkJCQkvLyB1c2luZyB0aGUgZGVsYXkgdGltZXIgd2lsbCBtYWtlIHJlZHJhd3MgbGVzcyBmbGlja2VyeQotCQkJCWlmIChlLnggPiAyMCkgewotCQkJCQljb2x1bW5Qb3NpdGlvbiA9IGUueDsKLQkJCQkJZGVsYXllZERyYXdUaW1lci5yZXNldCgyMCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJLy8gaGVyZSB3ZSBoYW5kbGUgdGhlIGNvbHVtbiByZXNpemluZyBieSBkZXRlY3QgaWYgdGhlIHVzZXIgaGFzCi0JCQkvLyBjbGljayBvbiBhIGNvbHVtbiBzZXBhcmF0b3IKLQkJCS8vCi0JCQljb2x1bW5EcmFnZ2VkID0gLTE7Ci0JCQllZGl0TWFuYWdlci5kZWFjdGl2YXRlQ2VsbEVkaXRvcigpOwotCi0JCQlpZiAoKGUueCA+IGNvbHVtblBvc2l0aW9uIC0gY29sdW1uSGl0V2lkdGgpICYmIChlLnggPCBjb2x1bW5Qb3NpdGlvbiArIGNvbHVtbkhpdFdpZHRoKSkgewotCQkJCWNvbHVtbkRyYWdnZWQgPSAwOwotCQkJfQotCi0JCQkvLyBoZXJlIHdlIGhhbmRsZSBzZWxlY3RpbmcgdHJlZSBpdGVtcyB3aGVuIGFueSB0aGluZyBvbiB0aGUgJ3JvdycKLQkJCS8vIGlzIGNsaWNrZWQKLQkJCS8vCi0JCQlUcmVlSXRlbSBpdGVtID0gZlRyZWUuZ2V0SXRlbShuZXcgUG9pbnQoZS54LCBlLnkpKTsKLQkJCWlmIChpdGVtID09IG51bGwpIHsKLQkJCQlpdGVtID0gZ2V0VHJlZUl0ZW1PblJvdyhlLngsIGUueSk7Ci0JCQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJCQlUcmVlSXRlbVtdIGl0ZW1zID0gbmV3IFRyZWVJdGVtWzFdOwotCQkJCQlpdGVtc1swXSA9IGl0ZW07Ci0JCQkJCWZUcmVlLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJCWNvbHVtbkRyYWdnZWQgPSAtMTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb2x1bW5Qcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gZkNvbHVtblByb3BlcnRpZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uUHJvcGVydGllcyhTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzKSB7Ci0JCXRoaXMuZkNvbHVtblByb3BlcnRpZXMgPSBjb2x1bW5Qcm9wZXJ0aWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCVJlY3RhbmdsZSB0cmVlQm91bmRzID0gZlRyZWUuZ2V0Qm91bmRzKCk7Ci0KLQkJY29udHJvbFdpZHRoID0gdHJlZUJvdW5kcy53aWR0aDsKLQkJQ29sb3IgYmcgPSBmVHJlZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0JCUNvbG9yIGJnMiA9IGZUcmVlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT04pOwotCi0JCWdjLnNldEJhY2tncm91bmQoYmcyKTsKLQotCQkvLyAvLyBUaGlzIG5leHQgcGFydCBjYXVzZXMgcHJvYmxlbXMgb24gTElOVVgsIHNvIGxldCdzIG5vdCBkbyBpdAotCQkvLyB0aGVyZQotCQkvLyBpZiAoQjJCSGFja3MuSVNfVU5JWCA9PSBmYWxzZSkgewotCQkvLyBUcmVlSXRlbVtdIHNlbGVjdGVkSXRlbXMgPSB0cmVlLmdldFNlbGVjdGlvbigpOwotCQkvLyBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7Ci0JCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRJdGVtcy5sZW5ndGg7IGkrKykgewotCQkvLyBUcmVlSXRlbSBpdGVtID0gc2VsZWN0ZWRJdGVtc1tpXTsKLQkJLy8gUmVjdGFuZ2xlIGJvdW5kcyA9IGl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCS8vIGlmIChib3VuZHMgIT0gbnVsbCkgewotCQkvLyBnYy5maWxsUmVjdGFuZ2xlKGJvdW5kcy54ICsgYm91bmRzLndpZHRoLCBib3VuZHMueSwgY29udHJvbFdpZHRoLAotCQkvLyBib3VuZHMuaGVpZ2h0KTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLwotCQlpZiAoIWZpc1Vuc3VwcG9ydGVkSW5wdXQpIHsKLQkJCVRyZWVJdGVtW10gaXRlbXMgPSBmVHJlZS5nZXRJdGVtcygpOwotCQkJaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKHRhYmxlTGluZUNvbG9yKTsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGJnKTsKLQotCQkJCWdjLmZpbGxSZWN0YW5nbGUoY29sdW1uUG9zaXRpb24sIHRyZWVCb3VuZHMueCwgdHJlZUJvdW5kcy53aWR0aCwgdHJlZUJvdW5kcy5oZWlnaHQpOwotCi0JCQkJUmVjdGFuZ2xlIGl0ZW1Cb3VuZHMgPSBpdGVtc1swXS5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgaGVpZ2h0ID0gY29tcHV0ZVRyZWVJdGVtSGVpZ2h0KCk7Ci0KLQkJCQlpZiAoaXRlbUJvdW5kcyAhPSBudWxsKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIEJvdW5kcyB3aWxsIGJlIGZvciB0aGUgZmlyc3QgaXRlbSwgd2hpY2ggd2lsbCBlaXRoZXIgYmUKLQkJCQkJICogdmlzaWJsZSBhdCB0aGUgdG9wIG9mIHRoZSBUcmVlLCBvciBzY3JvbGxlZCBvZmYgd2l0aAotCQkJCQkgKiBuZWdhdGl2ZSB2YWx1ZXMKLQkJCQkJICovCi0JCQkJCWludCBzdGFydFkgPSBpdGVtQm91bmRzLnk7Ci0KLQkJCQkJLyogT25seSBkcmF3IGxpbmVzIHdpdGhpbiB0aGUgVHJlZSBib3VuZGFyaWVzICovCi0JCQkJCWZvciAoaW50IGkgPSBzdGFydFk7IGkgPCB0cmVlQm91bmRzLmhlaWdodDsgaSArPSBoZWlnaHQpIHsKLQkJCQkJCWlmIChpID49IHRyZWVCb3VuZHMueSkgewotCQkJCQkJCWdjLmRyYXdMaW5lKDAsIGksIHRyZWVCb3VuZHMud2lkdGgsIGkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWdjLmRyYXdMaW5lKGNvbHVtblBvc2l0aW9uLCAwLCBjb2x1bW5Qb3NpdGlvbiwgdHJlZUJvdW5kcy5oZWlnaHQpOwotCQkJCXBhaW50SXRlbXMoZ2MsIGl0ZW1zLCB0cmVlQm91bmRzKTsKLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWRkRW1wdHlUcmVlTWVzc2FnZShnYyk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhZGRVbmFibGVUb1BvcHVsYXRlVHJlZU1lc3NhZ2UoZ2MpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGludCBjb21wdXRlVHJlZUl0ZW1IZWlnaHQoKSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQotCQkvKgotCQkgKiBPbiBHVEsgdHJlZS5nZXRJdGVtSGVpZ2h0KCkgc2VlbXMgdG8gbGllIHRvIHVzLiBJdCByZXBvcnRzIHRoYXQgdGhlCi0JCSAqIHRyZWUgaXRlbSBvY2N1cGllcyBhIGZldyBwaXhsZXMgbGVzcyB2ZXJ0aWNhbCBzcGFjZSB0aGFuIGl0IHNob3VsZAotCQkgKiAocG9zc2libHkgYmVjYXVzZSBvZiB0aGUgaW1hZ2UgaGVpZ2h0IHZzLiB0aGUgdGV4dCBoZWlnaHQ/KS4gVGhpcwotCQkgKiBmb2lscyBvdXIgY29kZSB0aGF0IGRyYXdzIHRoZSAncm93JyBsaW5lcyBzaW5jZSB3ZSBhc3N1bWUgdGhhdAotCQkgKiBsaW5lcyBzaG91bGQgYmUgZHJhd24gYXQgJ2l0ZW1IZWlnaHQnIGluY3JlbWVudHMuIERvbid0IHRydXN0Ci0JCSAqIGdldEl0ZW1IZWlnaHQoKSB0byBjb21wdXRlIHRoZSBpbmNyZW1lbnQuLi4gaW5zdGVhZCBjb21wdXRlIHRoZQotCQkgKiB2YWx1ZSBiYXNlZCBvbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBUcmVlSXRlbXMsIGFuZCB0aGVuIHVzZSB0aGUKLQkJICogbGFyZ2VyIHZhbHVlLgotCQkgKiAKLQkJICogVGhpcyBzdHJhdGVneSBvbmx5IHdvcmtzIG9uIHRyZWVzIHdoZXJlIHRoZSBpdGVtcyBhcmUgb2YgZXZlbgotCQkgKiBoZWlnaHQsIGhvd2V2ZXIgYnVnCi0JCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTcyMDEgaW5kaWNhdGVzIHRoYXQKLQkJICogdGhpcyBpcyBubyBsb25nZXIgcHJvbWlzZWQsIGF0IGxlYXN0IG9uIHdpbjMyIGFuZCBsaWtlbHkgb24gb3RoZXIKLQkJICogcGxhdGZvcm1zIHNvb24uCi0JCSAqLwotCQlpZiAoZlRyZWUuZ2V0SXRlbUNvdW50KCkgPiAwKSB7Ci0JCQlUcmVlSXRlbVtdIGl0ZW1zID0gZlRyZWUuZ2V0SXRlbXMoKTsKLQkJCVJlY3RhbmdsZSBpdGVtQm91bmRzID0gaXRlbXNbMF0uZ2V0Qm91bmRzKCk7Ci0KLQkJCWlmIChpdGVtc1swXS5nZXRFeHBhbmRlZCgpKSB7Ci0JCQkJVHJlZUl0ZW1bXSBjaGlsZHJlbiA9IGl0ZW1zWzBdLmdldEl0ZW1zKCk7Ci0JCQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHsKLQkJCQkJcmVzdWx0ID0gY2hpbGRyZW5bMF0uZ2V0Qm91bmRzKCkueSAtIGl0ZW1Cb3VuZHMueTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChpdGVtcy5sZW5ndGggPiAxKSB7Ci0JCQkJcmVzdWx0ID0gaXRlbXNbMV0uZ2V0Qm91bmRzKCkueSAtIGl0ZW1Cb3VuZHMueTsKLQkJCX0KLQkJfQotCi0JCXJlc3VsdCA9IE1hdGgubWF4KGZUcmVlLmdldEl0ZW1IZWlnaHQoKSwgcmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbXB0eVRyZWVNZXNzYWdlKEdDIGdjKSB7Ci0JCS8vIG5vdGhpbmcgdG8gYWRkIGhlcmUKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVW5hYmxlVG9Qb3B1bGF0ZVRyZWVNZXNzYWdlKEdDIGdjKSB7Ci0JCS8vIGhlcmUgd2UgcHJpbnQgYSBtZXNzYWdlIHdoZW4gdGhlIGRvY3VtZW50IGNhbm5vdCBiZSBkaXNwbGF5ZWQganVzdAotCQkvLyB0byBnaXZlIHRoZQotCQkvLyB1c2VyIGEgdmlzdWFsIGN1ZQotCQkvLyBzbyB0aGF0IHRoZXkga25vdyBob3cgdG8gcHJvY2VlZCB0byBlZGl0IHRoZSBibGFuayB2aWV3Ci0JCWdjLnNldEZvcmVncm91bmQoZlRyZWUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGZUcmVlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7Ci0JCWdjLmRyYXdTdHJpbmcoWE1MRWRpdG9yTWVzc2FnZXMuVHJlZUV4dGVuc2lvbl8wLCAxMCwgMTApOwotCX0KLQotCXZvaWQgc2V0SXNVbnN1cHBvcnRlZElucHV0KGJvb2xlYW4gaXNVbnN1cHBvcnRlZCkgewotCQlmaXNVbnN1cHBvcnRlZElucHV0ID0gaXNVbnN1cHBvcnRlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwYWludEl0ZW1zKEdDIGdjLCBUcmVlSXRlbVtdIGl0ZW1zLCBSZWN0YW5nbGUgdHJlZUJvdW5kcykgewotCQlpZiAoaXRlbXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCVRyZWVJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLQkJCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBpdGVtLmdldEJvdW5kcygpOwotCQkJCQlpZiAoYm91bmRzICE9IG51bGwpIHsKLQkJCQkJCWlmICh0cmVlQm91bmRzLmludGVyc2VjdHMoYm91bmRzKSkgewotCQkJCQkJCXBhaW50SXRlbShnYywgaXRlbSwgYm91bmRzKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIGRlZmVjdCAyNDEwMzkKLQkJCQkJLy8KLQkJCQkJaWYgKGl0ZW0uZ2V0RXhwYW5kZWQoKSkgewotCQkJCQkJcGFpbnRJdGVtcyhnYywgaXRlbS5nZXRJdGVtcygpLCB0cmVlQm91bmRzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhaW50SXRlbShHQyBnYywgVHJlZUl0ZW0gaXRlbSwgUmVjdGFuZ2xlIGJvdW5kcykgewotCQkvLyBub3RoaW5nIHRvIHBhaW50Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBJQ2VsbEVkaXRvclByb3ZpZGVyIHsKLQkJQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKE9iamVjdCBvLCBpbnQgY29sKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaW1wcm92ZSBkcmF3aW5nIGR1cmluZyBhIGNvbHVtbiByZXNpemUuCi0JICovCi0JcHVibGljIGNsYXNzIERlbGF5ZWREcmF3VGltZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXByb3RlY3RlZCBDb250cm9sIGNvbnRyb2w7Ci0KLQkJcHVibGljIERlbGF5ZWREcmF3VGltZXIoQ29udHJvbCBjb250cm9sMSkgewotCQkJdGhpcy5jb250cm9sID0gY29udHJvbDE7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZXNldChpbnQgbWlsbGlzZWNvbmRzKSB7Ci0JCQlnZXREaXNwbGF5KCkudGltZXJFeGVjKG1pbGxpc2Vjb25kcywgdGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQljb250cm9sLnJlZHJhdygpOwotCQl9Ci0JfQotCi0JRGlzcGxheSBnZXREaXNwbGF5KCkgewotCi0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBFZGl0TWFuYWdlcgotCSAqLwotCXB1YmxpYyBjbGFzcyBFZGl0TWFuYWdlciB7Ci0JCXByb3RlY3RlZCBUcmVlIGZUcmVlMTsKLQkJcHJvdGVjdGVkIENvbnRyb2wgY2VsbEVkaXRvckhvbGRlcjsKLQkJcHJvdGVjdGVkIENlbGxFZGl0b3JTdGF0ZSBjZWxsRWRpdG9yU3RhdGU7Ci0KLQkJcHVibGljIEVkaXRNYW5hZ2VyKFRyZWUgdHJlZSkgewotCQkJdGhpcy5mVHJlZTEgPSB0cmVlOwotCQkJdGhpcy5jZWxsRWRpdG9ySG9sZGVyID0gbmV3IENvbXBvc2l0ZSh0cmVlLCBTV1QuTk9ORSk7Ci0KLQkJCWZpbmFsIFRyZWUgdGhlVHJlZSA9IHRyZWU7Ci0KLQkJCU1vdXNlQWRhcHRlciB0aGVNb3VzZUFkYXB0ZXIgPSBuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCQkJZGVhY3RpdmF0ZUNlbGxFZGl0b3IoKTsKLQotCQkJCQlpZiAoZS54ID4gY29sdW1uUG9zaXRpb24gKyBjb2x1bW5IaXRXaWR0aCkgewotCQkJCQkJVHJlZUl0ZW1bXSBpdGVtcyA9IHRoZVRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkvLyBObyBlZGl0IGlmIG1vcmUgdGhhbiBvbmUgcm93IGlzIHNlbGVjdGVkLgotCQkJCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGl0ZW1zWzBdLmdldEJvdW5kcygpOwotCQkJCQkJCWlmICgoYm91bmRzICE9IG51bGwpICYmIChlLnkgPj0gYm91bmRzLnkpICYmIChlLnkgPD0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0KSkgewotCQkJCQkJCQlpbnQgY29sdW1uVG9FZGl0ID0gMTsKLQkJCQkJCQkJYWN0aXZhdGVDZWxsRWRpdG9yKGl0ZW1zWzBdLCBjb2x1bW5Ub0VkaXQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0KLQkJCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWFwcGx5Q2VsbEVkaXRvclZhbHVlKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlhcHBseUNlbGxFZGl0b3JWYWx1ZSgpOwotCQkJCX0KLQkJCX07Ci0KLQkJCUtleUxpc3RlbmVyIGtleUxpc3RlbmVyID0gbmV3IEtleUFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJCWlmIChlLmNoYXJhY3RlciA9PSBTV1QuQ1IpIHsKLQkJCQkJCWRlYWN0aXZhdGVDZWxsRWRpdG9yKCk7Ci0JCQkJCQlUcmVlSXRlbVtdIGl0ZW1zID0gdGhlVHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChpdGVtcy5sZW5ndGggPT0gMSkgewotCQkJCQkJCWFjdGl2YXRlQ2VsbEVkaXRvcihpdGVtc1swXSwgMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCi0JCQl0cmVlLmFkZE1vdXNlTGlzdGVuZXIodGhlTW91c2VBZGFwdGVyKTsKLQkJCXRyZWUuYWRkS2V5TGlzdGVuZXIoa2V5TGlzdGVuZXIpOwotCQkJU2Nyb2xsQmFyIGhCYXIgPSB0cmVlLmdldEhvcml6b250YWxCYXIoKTsKLQkJCWlmIChoQmFyICE9IG51bGwpIHsKLQkJCQloQmFyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJCX0KLQkJCVNjcm9sbEJhciB2QmFyID0gdHJlZS5nZXRWZXJ0aWNhbEJhcigpOwotCQkJaWYgKHZCYXIgIT0gbnVsbCkgewotCQkJCXZCYXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNDZWxsRWRpdG9yQWN0aXZlKCkgewotCQkJcmV0dXJuIGNlbGxFZGl0b3JTdGF0ZSAhPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYXBwbHlDZWxsRWRpdG9yVmFsdWUoKSB7Ci0JCQlpZiAoKGNlbGxFZGl0b3JTdGF0ZSAhPSBudWxsKSAmJiAoY2VsbE1vZGlmaWVyICE9IG51bGwpKSB7Ci0JCQkJVHJlZUl0ZW0gdHJlZUl0ZW0gPSBjZWxsRWRpdG9yU3RhdGUuZlRyZWVJdGVtOwotCi0JCQkJLy8gVGhlIGFyZWEgYmVsb3cgdGhlIGNlbGwgZWRpdG9yIG5lZWRzIHRvIGJlIGV4cGxpY2l0eQotCQkJCS8vIHJlcGFpbnRlZCBvbiBMaW51eAotCQkJCS8vCi0JCQkJLy8gUmVjdGFuZ2xlIHIgPSBCMkJIYWNrcy5JU19VTklYID8gdHJlZUl0ZW0uZ2V0Qm91bmRzKCkgOgotCQkJCS8vIG51bGw7Ci0KLQkJCQlPYmplY3QgdmFsdWUgPSBjZWxsRWRpdG9yU3RhdGUuZkNlbGxFZGl0b3IuZ2V0VmFsdWUoKTsKLQkJCQlTdHJpbmcgcHJvcGVydHkgPSBjZWxsRWRpdG9yU3RhdGUuZlByb3BlcnR5OwotCi0JCQkJZGVhY3RpdmF0ZUNlbGxFZGl0b3IoKTsKLQotCQkJCWNlbGxNb2RpZmllci5tb2RpZnkodHJlZUl0ZW0sIHByb3BlcnR5LCB2YWx1ZSk7Ci0KLQkJCQkvLyBpZiAociAhPSBudWxsKSB7Ci0JCQkJLy8gdHJlZS5yZWRyYXcoci54LCByLnksIHRyZWUuZ2V0Qm91bmRzKCkud2lkdGgsIHIuaGVpZ2h0LAotCQkJCS8vIGZhbHNlKTsKLQkJCQkvLyB9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlQ2VsbEVkaXRvcigpIHsKLQkJCS8vIENsZWFuIHVwIGFueSBwcmV2aW91cyBlZGl0b3IgY29udHJvbAotCQkJaWYgKGNlbGxFZGl0b3JTdGF0ZSAhPSBudWxsKSB7Ci0JCQkJY2VsbEVkaXRvclN0YXRlLmRlYWN0aXZhdGUoKTsKLQkJCQljZWxsRWRpdG9yU3RhdGUgPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWN0aXZhdGVDZWxsRWRpdG9yKFRyZWVJdGVtIHRyZWVJdGVtLCBpbnQgY29sdW1uKSB7Ci0JCQlpZiAoY2VsbE1vZGlmaWVyIGluc3RhbmNlb2YgSUNlbGxFZGl0b3JQcm92aWRlcikgewotCQkJCUlDZWxsRWRpdG9yUHJvdmlkZXIgY2VsbEVkaXRvclByb3ZpZGVyID0gKElDZWxsRWRpdG9yUHJvdmlkZXIpIGNlbGxNb2RpZmllcjsKLQkJCQlPYmplY3QgZGF0YSA9IHRyZWVJdGVtLmdldERhdGEoKTsKLQkJCQlpZiAoZkNvbHVtblByb3BlcnRpZXMubGVuZ3RoID4gY29sdW1uKSB7Ci0JCQkJCVN0cmluZyBwcm9wZXJ0eSA9IGZDb2x1bW5Qcm9wZXJ0aWVzW2NvbHVtbl07Ci0JCQkJCWlmIChjZWxsTW9kaWZpZXIuY2FuTW9kaWZ5KGRhdGEsIHByb3BlcnR5KSkgewotCQkJCQkJQ2VsbEVkaXRvciBuZXdDZWxsRWRpdG9yID0gY2VsbEVkaXRvclByb3ZpZGVyLmdldENlbGxFZGl0b3IoZGF0YSwgY29sdW1uKTsKLQkJCQkJCWlmIChuZXdDZWxsRWRpdG9yICE9IG51bGwpIHsKLQkJCQkJCQkvLyBUaGUgY29udHJvbCB0aGF0IHdpbGwgYmUgdGhlIGVkaXRvciBtdXN0IGJlIGEKLQkJCQkJCQkvLyBjaGlsZCBvZiB0aGUgY29sdW1uUG9zaXRpb24KLQkJCQkJCQlDb250cm9sIGNvbnRyb2wgPSBuZXdDZWxsRWRpdG9yLmdldENvbnRyb2woKTsKLQkJCQkJCQlpZiAoY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCQkJCWNlbGxFZGl0b3JTdGF0ZSA9IG5ldyBDZWxsRWRpdG9yU3RhdGUobmV3Q2VsbEVkaXRvciwgY29udHJvbCwgdHJlZUl0ZW0sIGNvbHVtbiwgcHJvcGVydHkpOwotCQkJCQkJCQljZWxsRWRpdG9yU3RhdGUuYWN0aXZhdGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogdGhpcyBjbGFzcyBob2xkcyB0aGUgc3RhdGUgdGhhdCBpcyBuZWVkIG9uIGEgcGVyIGNlbGwgZWRpdG9yCi0JCSAqIGludm9jYXRpb24gYmFzaXMKLQkJICovCi0JCXB1YmxpYyBjbGFzcyBDZWxsRWRpdG9yU3RhdGUgaW1wbGVtZW50cyBJQ2VsbEVkaXRvckxpc3RlbmVyLCBGb2N1c0xpc3RlbmVyIHsKLQkJCXB1YmxpYyBDZWxsRWRpdG9yIGZDZWxsRWRpdG9yOwotCQkJcHVibGljIENvbnRyb2wgZkNvbnRyb2w7Ci0JCQlwdWJsaWMgVHJlZUl0ZW0gZlRyZWVJdGVtOwotCQkJcHVibGljIGludCBmQ29sdW1uTnVtYmVyOwotCQkJcHVibGljIFN0cmluZyBmUHJvcGVydHk7Ci0KLQkJCXB1YmxpYyBDZWxsRWRpdG9yU3RhdGUoQ2VsbEVkaXRvciBjZWxsRWRpdG9yLCBDb250cm9sIGNvbnRyb2wsIFRyZWVJdGVtIHRyZWVJdGVtLCBpbnQgY29sdW1uTnVtYmVyLCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQl0aGlzLmZDZWxsRWRpdG9yID0gY2VsbEVkaXRvcjsKLQkJCQl0aGlzLmZDb250cm9sID0gY29udHJvbDsKLQkJCQl0aGlzLmZUcmVlSXRlbSA9IHRyZWVJdGVtOwotCQkJCXRoaXMuZkNvbHVtbk51bWJlciA9IGNvbHVtbk51bWJlcjsKLQkJCQl0aGlzLmZQcm9wZXJ0eSA9IHByb3BlcnR5OwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGZUcmVlSXRlbS5nZXREYXRhKCk7Ci0JCQkJU3RyaW5nIHZhbHVlID0gY2VsbE1vZGlmaWVyLmdldFZhbHVlKGVsZW1lbnQsIGZQcm9wZXJ0eSkudG9TdHJpbmcoKTsKLQkJCQlpZiAoZkNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJCVRleHQgdGV4dCA9IChUZXh0KSBmQ29udHJvbDsKLQkJCQkJaW50IHJlcXVpcmVkU2l6ZSA9IHZhbHVlLmxlbmd0aCgpICsgMTAwOwotCQkJCQlpZiAodGV4dC5nZXRUZXh0TGltaXQoKSA8IHJlcXVpcmVkU2l6ZSkgewotCQkJCQkJdGV4dC5zZXRUZXh0TGltaXQocmVxdWlyZWRTaXplKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlSZWN0YW5nbGUgciA9IGZUcmVlSXRlbS5nZXRCb3VuZHMoKTsKLQkJCQlpZiAociAhPSBudWxsKSB7Ci0JCQkJCWZDb250cm9sLnNldEJvdW5kcyhjb2x1bW5Qb3NpdGlvbiArIDUsIHIueSArIDEsIGZUcmVlMS5nZXRDbGllbnRBcmVhKCkud2lkdGggLSAoY29sdW1uUG9zaXRpb24gKyA1KSwgci5oZWlnaHQgLSAxKTsKLQkJCQkJZkNvbnRyb2wuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJZkNlbGxFZGl0b3Iuc2V0VmFsdWUodmFsdWUpOwotCQkJCQlmQ2VsbEVkaXRvci5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJCQkJZkNlbGxFZGl0b3Iuc2V0Rm9jdXMoKTsKLQkJCQkJZkNvbnRyb2wuYWRkRm9jdXNMaXN0ZW5lcih0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCQkJZkNlbGxFZGl0b3IucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJZkNvbnRyb2wucmVtb3ZlRm9jdXNMaXN0ZW5lcih0aGlzKTsKLQkJCQlmQ2VsbEVkaXRvci5kZWFjdGl2YXRlKCk7Ci0JCQkJZlRyZWUxLmZvcmNlRm9jdXMoKTsKLQkJCX0KLQotCQkJLy8gSUNlbGxFZGl0b3JMaXN0ZW5lciBtZXRob2RzCi0JCQkvLwotCQkJcHVibGljIHZvaWQgYXBwbHlFZGl0b3JWYWx1ZSgpIHsKLQkJCQlhcHBseUNlbGxFZGl0b3JWYWx1ZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjYW5jZWxFZGl0b3IoKSB7Ci0JCQkJZGVhY3RpdmF0ZUNlbGxFZGl0b3IoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZWRpdG9yVmFsdWVDaGFuZ2VkKGJvb2xlYW4gb2xkVmFsaWRTdGF0ZSwgYm9vbGVhbiBuZXdWYWxpZFN0YXRlKSB7Ci0JCQkJLy8gbm90aGluZywgZm9yIG5vdwotCQkJfQotCi0JCQkvLyBGb2N1c0xpc3RlbmVyIG1ldGhvZHMKLQkJCS8vCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlhcHBseUNlbGxFZGl0b3JWYWx1ZSgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1ZpZXdlckV4cGFuZENvbGxhcHNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZmQyM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFZpZXdlckV4cGFuZENvbGxhcHNlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzRXhwYW5kQWN0aW9uOwotCXByb3RlY3RlZCBBYnN0cmFjdFRyZWVWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQotCXB1YmxpYyBWaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbihib29sZWFuIGlzRXhwYW5kQWN0aW9uKSB7Ci0JCXRoaXMuaXNFeHBhbmRBY3Rpb24gPSBpc0V4cGFuZEFjdGlvbjsKLQkJaWYgKGlzRXhwYW5kQWN0aW9uKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgZV9pbWFnZURlc2NyaXB0b3IgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VUT09MX0VYUEFOREFMTCk7Ci0JCQlJbWFnZURlc2NyaXB0b3IgZF9pbWFnZURlc2NyaXB0b3IgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0VYUEFOREFMTCk7Ci0KLQkJCXNldEltYWdlRGVzY3JpcHRvcihlX2ltYWdlRGVzY3JpcHRvcik7Ci0JCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihkX2ltYWdlRGVzY3JpcHRvcik7Ci0JCQlzZXRUb29sVGlwVGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9JTkZPX0VYUEFORF9BTEwpOwotCQl9Ci0JCWVsc2UgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGVfaW1hZ2VEZXNjcmlwdG9yID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FVE9PTF9DT0xMQVBTRUFMTCk7Ci0JCQlJbWFnZURlc2NyaXB0b3IgZF9pbWFnZURlc2NyaXB0b3IgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0NPTExBUFNFQUxMKTsKLQotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGVfaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKGRfaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCXNldFRvb2xUaXBUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0lORk9fQ09MTEFQU0VfQUxMKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpZXdlcihBYnN0cmFjdFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCXRoaXMudmlld2VyID0gdmlld2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkvLyB0ZW1wb3JhcmlseSBzZXQgdGhlIHZpc2liaWxpdHkgdG8gZmFsc2UKLQkJCS8vIHRoaXMgaGFzIGEgSFVHRSBwZXJmb3JtYW5jZSBiZW5lZml0Ci0JCQlib29sZWFuIGlzVmlzaWJsZSA9IHZpZXdlci5nZXRDb250cm9sKCkuZ2V0VmlzaWJsZSgpOwotCQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQkJaWYgKGlzRXhwYW5kQWN0aW9uKSB7Ci0JCQkJdmlld2VyLmV4cGFuZEFsbCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdmlld2VyLmNvbGxhcHNlQWxsKCk7Ci0JCQl9Ci0KLQkJCS8vIHJlc3RvcmUgdGhlIHByZXZpb3VzIHZpc2liaWxpdHkgc3RhdGUKLQkJCS8vIAotCQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRWaXNpYmxlKGlzVmlzaWJsZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMzgwY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi0KLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBkZWZpbml0aW9ucyBpZHMgZm9yIHRoZSBYTUwgZWRpdG9yIGFjdGlvbnMuCi0gKiAKLSAqIEBkZXByZWNhdGVkIFVzZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudXRpbC5BY3Rpb25EZWZpbml0aW9uSWRzCi0gKiAgICAgICAgICAgICBpbnN0ZWFkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWE1MRWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcyB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xFQU5VUF9ET0NVTUVOVCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudWkuY2xlYW51cC5kb2N1bWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZPUk1BVF9ET0NVTUVOVCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudWkuZm9ybWF0LmRvY3VtZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk9STUFUX0FDVElWRV9FTEVNRU5UUyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudWkuZm9ybWF0LmFjdGl2ZS5lbGVtZW50cyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE9QRU5fRklMRSA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudWkub3Blbi5maWxlLmZyb20uc291cmNlIjsvLyROT04tTkxTLTEkCi0JLy8gcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5GT1JNQVRJT04gPQotCS8vICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudWkuc2hvdy50b29sdGlwLmluZm9ybWF0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5GT1JNQVRJT04gPSAib3JnLmVjbGlwc2UuamR0LnVpLmVkaXQudGV4dC5qYXZhLnNob3cuamF2YWRvYyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9CUkVBS1BPSU5UUyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudWkuYWRkLmJyZWFrcG9pbnRzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUFOQUdFX0JSRUFLUE9JTlRTID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51aS5tYW5hZ2UuYnJlYWtwb2ludHMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFTkFCTEVfQlJFQUtQT0lOVFMgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0LnVpLmVuYWJsZS5icmVha3BvaW50cyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJU0FCTEVfQlJFQUtQT0lOVFMgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0LnVpLmRpc2FibGUuYnJlYWtwb2ludHMiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvck1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDQ3MWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvck1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IFhNTCBFZGl0b3IKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxFZGl0b3JNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTEVkaXRvclJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVGFibGVUcmVlVmlld2VyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MTXVsdGlQYWdlRWRpdG9yUGFydF8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRyZWVFeHRlbnNpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUcmVlRXh0ZW5zaW9uXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVHJlZUV4dGVuc2lvbl8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRyZWVFeHRlbnNpb25fNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbl9lcnJvcl9oYXNfb2NjdXJyZWRfd2hlbjFfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlX19kb2VzX25vdF9leGlzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfY291bGRfbm90X2JlX29wZW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHJlZUV4dGVuc2lvbl8wOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFhNTEVkaXRvck1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFhNTEVkaXRvck1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvclBsdWdpbkhPTERfT0xELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JQbHVnaW5IT0xEX09MRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDNhY2MwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvclBsdWdpbkhPTERfT0xELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGw7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgVGhpcyBwbHVnaW4gaGFzIGNvbWJpbmVkIHdpdGggdGhlIG9yZy5lY2xpcHNlLndzdC54bWwudWkKLSAqICAgICAgICAgICAgIHBsdWdpbi4gVXNlIFhNTFVJUGx1Z2luIGluc3RlYWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxFZGl0b3JQbHVnaW5IT0xEX09MRCBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MRWRpdG9yUGx1Z2luSE9MRF9PTEQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBYTUxFZGl0b3JQbHVnaW5IT0xEX09MRCBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBYTUxVSVBsdWdpbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBYTUxFZGl0b3JQbHVnaW5IT0xEX09MRCgpIHsKLQkJc3VwZXIoKTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCi0JCS8vIHJlZmVyZW5jZSB0aGUgcHJlZmVyZW5jZSBzdG9yZSBzbwotCQkvLyBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKElQcmVmZXJlbmNlU3RvcmUgcHJlZmVyZW5jZVN0b3JlKSBpcwotCQkvLyBjYWxsZWQKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBYTUxFZGl0b3JQbHVnaW5IT0xEX09MRCBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgWE1MRWRpdG9yUGx1Z2luSE9MRF9PTEQgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSBnZXRBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGwuZ2V0SW5zdGFuY2UoKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGQxMWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIGltYWdlcyBwcm92aWRlZCBieSB0aGlzIHBsdWctaW4uCi0gKiAKLSAqIE5PVEU6IEZvciBpbnRlcm5hbCB1c2Ugb25seS4gRm9yIGltYWdlcyB1c2VkIGV4dGVybmFsbHksIHBsZWFzZSB1c2UgdGhlCi0gKiBTaGFyZWQqKipJbWFnZUhlbHBlciBjbGFzcyBpbnN0ZWFkLgotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUExVR0lOSUQgPSBYTUxVSVBsdWdpbi5JRDsKLQlwcml2YXRlIHN0YXRpYyBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvLyBzYXZlIGEgZGVzY3JpcHRvciBmb3IgZWFjaCBpbWFnZQotCXByaXZhdGUgSGFzaE1hcCBmSW1hZ2VEZXNjUmVnaXN0cnkgPSBudWxsOwotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqIElmIHRoZSBpbWFnZSBjYW5ub3QgYmUgcmV0cmlldmVkLCBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGF0Ci0JICogdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2UgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBvciBudWxsIGlmIG9uZSBjb3VsZAotCSAqICAgICAgICAgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGFuIGltYWdlCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZQotCSAqIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGNhbm5vdCBiZSByZXRyaWV2ZWQsCi0JICogYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQKLQkgKiBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NhdGVkIHdpdGggcmVzb3VyY2Ugb3IKLQkgKiAgICAgICAgIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIG9uZSBjb3VsZCBub3QgYmUKLQkgKiAgICAgICAgIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlPYmplY3QgbyA9IGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGEgZGVzY3JpcHRvcgotCQkJaW1hZ2VEZXNjcmlwdG9yID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IChJbWFnZURlc2NyaXB0b3IpIG87Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEhhc2hNYXAgLSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJaWYgKGZJbWFnZURlc2NSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlmSW1hZ2VEZXNjUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXJldHVybiBmSW1hZ2VEZXNjUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSW1hZ2VSZWdpc3RyeSAtIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIGFkZHMgdGhlIGltYWdlIHRvIHRoZQotCSAqIGltYWdlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gSW1hZ2UKLQkgKi8KLQlwcml2YXRlIEltYWdlIGNyZWF0ZUltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IGdldEltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQotCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJCS8vIGRvbnQgYWRkIHRoZSBtaXNzaW5nIGltYWdlIGRlc2NyaXB0b3IgaW1hZ2UgdG8gdGhlIGltYWdlCi0JCQkvLyByZWdpc3RyeQotCQkJaWYgKCFkZXNjLmVxdWFscyhJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKSkgewotCQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQocmVzb3VyY2UsIGltYWdlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZyb20gdGhlIGdpdmVuIGltYWdlRmlsZVBhdGggYW5kIGFkZHMgdGhlCi0JICogaW1hZ2UgZGVzY3JpcHRvciB0byB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgYW4gaW1hZ2UKLQkgKiBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBjcmVhdGVkLCB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvcgotCSAqIGlzIHJldHVybmVkIGJ1dCBub3QgYWRkZWQgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIGltYWdlRmlsZVBhdGgKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvciBpbWFnZSBkZXNjcmlwdG9yIGZvciBpbWFnZUZpbGVQYXRoIG9yIGRlZmF1bHQKLQkgKiAgICAgICAgICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqLwotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZUltYWdlRGVzY3JpcHRvcihTdHJpbmcgaW1hZ2VGaWxlUGF0aCkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTklELCBpbWFnZUZpbGVQYXRoKTsKLQkJaWYgKGltYWdlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQlnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLnB1dChpbWFnZUZpbGVQYXRoLCBpbWFnZURlc2NyaXB0b3IpOwotCQl9Ci0JCWVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJfQotCi0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JQbHVnaW5JbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM1ZjAwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JQbHVnaW5JbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotLyoqCi0gKiBCdW5kbGUgb2YgbW9zdCBpbWFnZXMgdXNlZCBieSB0aGUgWE1MIEVkaXRvciBwbHVnLWluLgotICovCi1wdWJsaWMgY2xhc3MgWE1MRWRpdG9yUGx1Z2luSW1hZ2VzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfQ09MTEFQU0UgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L2NvbGxhcHNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfQ09MTEFQU0UgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L2NvbGxhcHNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfQ09MTEFQU0VBTEwgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L2NvbGxhcHNlX2FsbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0NPTExBUFNFQUxMID0gImljb25zL2Z1bGwvZXRvb2wxNi9jb2xsYXBzZV9hbGwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9FWFBBTkQgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L2V4cGFuZC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0VYUEFORCA9ICJpY29ucy9mdWxsL2V0b29sMTYvZXhwYW5kLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfRVhQQU5EQUxMID0gImljb25zL2Z1bGwvZHRvb2wxNi9leHBhbmRfYWxsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfRVhQQU5EQUxMID0gImljb25zL2Z1bGwvZXRvb2wxNi9leHBhbmRfYWxsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfTkVXX1hNTCA9ICJpY29ucy9mdWxsL2R0b29sMTYvbmV3X3htbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX05FV19YTUwgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L25ld194bWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JSZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZjMTczNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JSZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVhNTFRhYmxlVHJlZVZpZXdlcl8wPURlc2lnbgotWE1MTXVsdGlQYWdlRWRpdG9yUGFydF8wPVNvdXJjZQotWE1MVHJlZUV4dGVuc2lvbl8wPVN0cnVjdHVyZQotWE1MVHJlZUV4dGVuc2lvbl8xPVZhbHVlCi1YTUxUcmVlRXh0ZW5zaW9uXzM9VGhlIGRvY3VtZW50IGlzIGVtcHR5LgotWE1MVHJlZUV4dGVuc2lvbl80PVJpZ2h0IG1vdXNlIGNsaWNrIGhlcmUgdG8gaW5zZXJ0IGNvbnRlbnQuCi1YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8wPSZYTUwKLVhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzE9JkV4cGFuZCBBbGwKLVhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzI9JkNvbGxhcHNlIEFsbAotWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfMz1UdXJuIEdyYW1tYXIgQ29uc3RyYWludHMgT2ZmCi1YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl80PSZUdXJuIEdyYW1tYXIgQ29uc3RyYWludHMgT2ZmCi1YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl81PVR1cm4gR3JhbW1hciBDb25zdHJhaW50cyBPbgotWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfNj0mVHVybiBHcmFtbWFyIENvbnN0cmFpbnRzIE9uCi1YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl83PVJlbG9hZCBEZXBlbmRlbmNpZXMKLVhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzg9JlJlbG9hZCBEZXBlbmRlbmNpZXMKLSMjCi1Bbl9lcnJvcl9oYXNfb2NjdXJyZWRfd2hlbjFfRVJST1JfPUFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGVuIGluaXRpYWxpemluZyB0aGUgaW5wdXQgZm9yIHRoZSB0aGUgZWRpdG9yJ3Mgc291cmNlIHBhZ2UuCi1SZXNvdXJjZV9fZG9lc19ub3RfZXhpc3Q9UmVzb3VyY2UgezB9IGRvZXMgbm90IGV4aXN0LgotRWRpdG9yX2NvdWxkX25vdF9iZV9vcGVuPUVkaXRvciBjb3VsZCBub3QgYmUgb3BlbiBvbiB7MH0KLVRyZWVFeHRlbnNpb25fMD1DYW5ub3QgZGlzcGxheSBkb2N1bWVudCBjb250ZW50cy4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDRlZTRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci0KLQotcHVibGljIGNsYXNzIFhNTE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMgU291cmNlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgewotCi0JcHJpdmF0ZSBib29sZWFuIG5lZWRzTXVsdGlJbml0ID0gdHJ1ZTsKLQotCXB1YmxpYyBYTUxNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlzdXBlci5pbml0RGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IoYWN0aW9uQmFycyk7Ci0KLQkJaWYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWlmIChkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciBpbnN0YW5jZW9mIElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgewotCQkJCSgoSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikuaW5pdFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9ucyhhY3Rpb25CYXJzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFjdGl2YXRlRGVzaWduUGFnZShJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJaWYgKChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsKSAmJiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpKSB7Ci0JCQkvLyBpZiBkZXNpZ24gcGFnZSBpcyBub3QgcmVhbGx5IGFuIElFZGl0b3JQYXJ0LCBhY3RpdmVFZGl0b3IgPT0KLQkJCS8vIG51bGwsIHNvIHBhc3MgaW4gbXVsdGlQYWdlRWRpdG9yIGluc3RlYWQgKGQyODI0MTQpCi0JCQlpZiAoYWN0aXZlRWRpdG9yID09IG51bGwpIHsKLQkJCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IobXVsdGlQYWdlRWRpdG9yKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcihhY3RpdmVFZGl0b3IpOwotCQkJfQotCQkJKChJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yKS5zZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JCWlmICgoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgIT0gbnVsbCkgJiYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSkgewotCQkJZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKG11bHRpUGFnZUVkaXRvcik7Ci0JCQkoKElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZVNvdXJjZVBhZ2UoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKSB7Ci0JCWlmICgoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgIT0gbnVsbCkgJiYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSkgewotCQkJZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKG11bHRpUGFnZUVkaXRvcik7Ci0JCQkoKElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQkJaWYgKChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsKSAmJiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpKSB7Ci0JCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQkJCSgoSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcikuc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZCh0cnVlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNpbml0KG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlzdXBlci5pbml0KGFjdGlvbkJhcnMpOwotCQluZWVkc011bHRpSW5pdCA9IHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3Ijc2V0QWN0aXZlRWRpdG9yKG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJaWYgKG5lZWRzTXVsdGlJbml0KSB7Ci0JCQlkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciA9IG5ldyBYTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcigpOwotCQkJaW5pdERlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKGdldEFjdGlvbkJhcnMoKSk7Ci0JCQluZWVkc011bHRpSW5pdCA9IGZhbHNlOwotCQl9Ci0JCXN1cGVyLnNldEFjdGl2ZUVkaXRvcih0YXJnZXRFZGl0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MTXVsdGlQYWdlRWRpdG9yUGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MTXVsdGlQYWdlRWRpdG9yUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODJlZGZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTE11bHRpUGFnZUVkaXRvclBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVBvc3RTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JWE1MUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0IGV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yUGFydCB7Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCBwYXJ0IGFjdGl2YXRpb24gbGlzdGVuZXIsIGNvcGllZCBmcm9tIEFic3RyYWN0VGV4dEVkaXRvcgotCSAqLwotCWNsYXNzIEFjdGl2YXRpb25MaXN0ZW5lciBpbXBsZW1lbnRzIElQYXJ0TGlzdGVuZXIsIElXaW5kb3dMaXN0ZW5lciB7Ci0KLQkJLyoqIENhY2hlIG9mIHRoZSBhY3RpdmUgd29ya2JlbmNoIHBhcnQuICovCi0JCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgZkFjdGl2ZVBhcnQ7Ci0JCS8qKiBJbmRpY2F0ZXMgd2hldGhlciBhY3RpdmF0aW9uIGhhbmRsaW5nIGlzIGN1cnJlbnRseSBiZSBkb25lLiAqLwotCQlwcml2YXRlIGJvb2xlYW4gZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gZmFsc2U7Ci0JCS8qKgotCQkgKiBUaGUgcGFydCBzZXJ2aWNlLgotCQkgKiAKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHJpdmF0ZSBJUGFydFNlcnZpY2UgZlBhcnRTZXJ2aWNlOwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIHRoaXMgYWN0aXZhdGlvbiBsaXN0ZW5lci4KLQkJICogCi0JCSAqIEBwYXJhbSBwYXJ0U2VydmljZQotCQkgKiAgICAgICAgICAgIHRoZSBwYXJ0IHNlcnZpY2Ugb24gd2hpY2ggdG8gYWRkIHRoZSBwYXJ0IGxpc3RlbmVyCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyBBY3RpdmF0aW9uTGlzdGVuZXIoSVBhcnRTZXJ2aWNlIHBhcnRTZXJ2aWNlKSB7Ci0JCQlmUGFydFNlcnZpY2UgPSBwYXJ0U2VydmljZTsKLQkJCWZQYXJ0U2VydmljZS5hZGRQYXJ0TGlzdGVuZXIodGhpcyk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmFkZFdpbmRvd0xpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIERpc3Bvc2VzIHRoaXMgYWN0aXZhdGlvbiBsaXN0ZW5lci4KLQkJICogCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlmUGFydFNlcnZpY2UucmVtb3ZlUGFydExpc3RlbmVyKHRoaXMpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5yZW1vdmVXaW5kb3dMaXN0ZW5lcih0aGlzKTsKLQkJCWZQYXJ0U2VydmljZSA9IG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydEFjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJZkFjdGl2ZVBhcnQgPSBwYXJ0OwotCQkJaGFuZGxlQWN0aXZhdGlvbigpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRCcm91Z2h0VG9Ub3Aob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0Q2xvc2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydERlYWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWZBY3RpdmVQYXJ0ID0gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0T3BlbmVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKioKLQkJICogSGFuZGxlcyB0aGUgYWN0aXZhdGlvbiB0cmlnZ2VyaW5nIGEgZWxlbWVudCBzdGF0ZSBjaGVjayBpbiB0aGUKLQkJICogZWRpdG9yLgotCQkgKi8KLQkJdm9pZCBoYW5kbGVBY3RpdmF0aW9uKCkgewotCQkJaWYgKGZJc0hhbmRsaW5nQWN0aXZhdGlvbiB8fCAoZ2V0VGV4dEVkaXRvcigpID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAoZkFjdGl2ZVBhcnQgPT0gWE1MTXVsdGlQYWdlRWRpdG9yUGFydC50aGlzKSB7Ci0JCQkJZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gdHJ1ZTsKLQkJCQl0cnkgewotCQkJCQlnZXRUZXh0RWRpdG9yKCkuc2FmZWx5U2FuaXR5Q2hlY2tTdGF0ZShnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWZJc0hhbmRsaW5nQWN0aXZhdGlvbiA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyI3dpbmRvd0FjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aW5kb3dBY3RpdmF0ZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJCWlmICh3aW5kb3cgPT0gZ2V0RWRpdG9yU2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpKSB7Ci0JCQkJLyoKLQkJCQkgKiBXb3JrYXJvdW5kIGZvciBwcm9ibGVtIGRlc2NyaWJlZCBpbgotCQkJCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3MzEgV2lsbCBiZQotCQkJCSAqIHJlbW92ZWQgd2hlbiBTV1QgaGFzIHNvbHZlZCB0aGUgcHJvYmxlbS4KLQkJCQkgKi8KLQkJCQl3aW5kb3cuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaGFuZGxlQWN0aXZhdGlvbigpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lciN3aW5kb3dEZWFjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aW5kb3dEZWFjdGl2YXRlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93Q2xvc2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93T3BlbmVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpbmRvd09wZW5lZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdGVucyBmb3Igc2VsZWN0aW9uIGZyb20gdGhlIHNvdXJjZSBwYWdlLCBhcHBseWluZyBpdCB0byB0aGUgZGVzaWduCi0JICogdmlld2VyLgotCSAqLwotCXByaXZhdGUgY2xhc3MgVGV4dEVkaXRvclBvc3RTZWxlY3Rpb25BZGFwdGVyIGV4dGVuZHMgVUlKb2IgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQkJYm9vbGVhbiBmb3JjZVBvc3RTZWxlY3Rpb24gPSBmYWxzZTsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotCi0JCXB1YmxpYyBUZXh0RWRpdG9yUG9zdFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlzdXBlcihnZXRUaXRsZSgpKTsKLQkJCXNldFVzZXIodHJ1ZSk7Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQkJZkRlc2lnblZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJaWYgKChmRGVzaWduVmlld2VyICE9IG51bGwpICYmICgoZ2V0QWN0aXZlUGFnZSgpICE9IGZEZXNpZ25QYWdlSW5kZXgpIHx8ICFYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0LnRoaXMuZXF1YWxzKGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlUGFydCgpKSkpIHsKLQkJCQlpZiAoZm9yY2VQb3N0U2VsZWN0aW9uKSB7Ci0JCQkJCXNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCQlzY2hlZHVsZSgyMDApOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZkRlc2lnblZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwgSVByb3BlcnR5TGlzdGVuZXIKLQkgKi8KLQljbGFzcyBQcm9wZXJ0eUxpc3RlbmVyIGltcGxlbWVudHMgSVByb3BlcnR5TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IHNvdXJjZSwgaW50IHByb3BJZCkgewotCQkJc3dpdGNoIChwcm9wSWQpIHsKLQkJCQkvLyBoYWQgdG8gaW1wbGVtZW50IGlucHV0IGNoYW5nZWQgImxpc3RlbmVyIiBzbyB0aGF0Ci0JCQkJLy8gU3RydWN0dXJlZFRleHRFZGl0b3IgY291bGQgdGVsbCBpdCBjb250YWluaW5nIGVkaXRvciB0aGF0Ci0JCQkJLy8gdGhlIGlucHV0IGhhcyBjaGFuZ2UsIHdoZW4gYSAncmVzb3VyY2UgbW92ZWQnIGV2ZW50IGlzCi0JCQkJLy8gZm91bmQuCi0JCQkJY2FzZSBJRWRpdG9yUGFydC5QUk9QX0lOUFVUIDogewotCQkJCSAgaWYgKHNvdXJjZSA9PSBnZXRUZXh0RWRpdG9yKCkgJiYgZkRlc2lnblZpZXdlciBpbnN0YW5jZW9mIFhNTFRhYmxlVHJlZVZpZXdlcikgewotCQkJCSAgICBJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLQkJCQkgICAgdHJ5IHsKLQkJCQkgICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQkgICAgICAgIElET01Eb2N1bWVudCBtb2RlbERvY3VtZW50ID0gKChJRE9NTW9kZWwpbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JICAgICAgICAgICAgICAgICAgICBPYmplY3QgZGVzaWduSW5wdXQgPSAoKFhNTFRhYmxlVHJlZVZpZXdlcilmRGVzaWduVmlld2VyKS5nZXRJbnB1dCgpOwotCQkJCSAgICAgICAgaWYgKG1vZGVsRG9jdW1lbnQgIT0gZGVzaWduSW5wdXQpCi0JCQkJICAgICAgICAgIHNldElucHV0KGdldFRleHRFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQkgICAgICB9Ci0JCQkJICAgIH0gZmluYWxseSB7Ci0JCQkJICAgICAgaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJICAgICAgICBtb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQkgICAgfQotCQkJCSAgfQotCQkJCX0KLQkJCQljYXNlIElFZGl0b3JQYXJ0LlBST1BfRElSVFkgOiB7Ci0JCQkJCWlmIChzb3VyY2UgPT0gZ2V0VGV4dEVkaXRvcigpKSB7Ci0JCQkJCQlpZiAoZ2V0VGV4dEVkaXRvcigpLmdldEVkaXRvcklucHV0KCkgIT0gZ2V0RWRpdG9ySW5wdXQoKSkgewotCQkJCQkJCXNldElucHV0KGdldFRleHRFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQkJCQkvKgotCQkJCQkJCSAqIHRpdGxlIHNob3VsZCBhbHdheXMgY2hhbmdlIHdoZW4gaW5wdXQgY2hhbmdlcy4KLQkJCQkJCQkgKiBjcmVhdGUgcnVubmFibGUgZm9yIGZvbGxvd2luZyBwb3N0IGNhbGwKLQkJCQkJCQkgKi8KLQkJCQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJX2ZpcmVQcm9wZXJ0eUNoYW5nZShJV29ya2JlbmNoUGFydC5QUk9QX1RJVExFKTsKLQkJCQkJCQkJfQotCQkJCQkJCX07Ci0JCQkJCQkJLyoKLQkJCQkJCQkgKiBVcGRhdGUgaXMganVzdCB0byBwb3N0IHRoaW5ncyBvbiB0aGUgZGlzcGxheQotCQkJCQkJCSAqIHF1ZXVlICh0aHJlYWQpLiBXZSBoYXZlIHRvIGRvIHRoaXMgdG8gZ2V0IHRoZQotCQkJCQkJCSAqIGRpcnR5IHByb3BlcnR5IHRvIGdldCB1cGRhdGVkIGFmdGVyIG90aGVyCi0JCQkJCQkJICogdGhpbmdzIG9uIHRoZSBxdWV1ZSBhcmUgZXhlY3V0ZWQuCi0JCQkJCQkJICovCi0JCQkJCQkJKChDb250cm9sKSBnZXRUZXh0RWRpdG9yKCkuZ2V0QWRhcHRlcihDb250cm9sLmNsYXNzKSkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgSVdvcmtiZW5jaFBhcnQuUFJPUF9USVRMRSA6IHsKLQkJCQkJLy8gdXBkYXRlIHRoZSBpbnB1dCBpZiB0aGUgdGl0bGUgaXMgY2hhbmdlZAotCQkJCQlpZiAoc291cmNlID09IGdldFRleHRFZGl0b3IoKSkgewotCQkJCQkJaWYgKGdldFRleHRFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpICE9IGdldEVkaXRvcklucHV0KCkpIHsKLQkJCQkJCQlzZXRJbnB1dChnZXRUZXh0RWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWRlZmF1bHQgOiB7Ci0JCQkJCS8vIHByb3BhZ2F0ZSBjaGFuZ2VzLiBJcyB0aGlzIG5lZWRlZD8gQW5zd2VyOiBZZXMuCi0JCQkJCWlmIChzb3VyY2UgPT0gZ2V0VGV4dEVkaXRvcigpKSB7Ci0JCQkJCQlfZmlyZVByb3BlcnR5Q2hhbmdlKHByb3BJZCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQl9Ci0KLQljbGFzcyBUZXh0SW5wdXRMaXN0ZW5lciBpbXBsZW1lbnRzIElUZXh0SW5wdXRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dERvY3VtZW50Q2hhbmdlZChJRG9jdW1lbnQgb2xkSW5wdXQsIElEb2N1bWVudCBuZXdJbnB1dCkgewotCQkJaWYgKChmRGVzaWduVmlld2VyICE9IG51bGwpICYmIChuZXdJbnB1dCAhPSBudWxsKSkgewotCQkJCWZEZXNpZ25WaWV3ZXIuc2V0RG9jdW1lbnQobmV3SW5wdXQpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgU3RhdHVzTGluZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBKRmFjZU5vZGVMYWJlbFByb3ZpZGVyIHsKLQkJcHVibGljIFN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyKCkgewotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCi0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgZWxlbWVudDsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCXJldHVybiBnZXRUZXh0KCgoQXR0cikgbm9kZSkuZ2V0T3duZXJFbGVtZW50KCkpOwotCQkJfQotCi0JCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiBub2RlIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIG5vZGU7Ci0JCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJCQlJSkZhY2VOb2RlQWRhcHRlciBhZGFwdGVyID0gKElKRmFjZU5vZGVBZGFwdGVyKSBub3RpZmllci5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCQlzLmluc2VydCgwLCBhZGFwdGVyLmdldExhYmVsVGV4dChub2RlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQkJCQlzLmluc2VydCgwLCBJUGF0aC5TRVBBUkFUT1IpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBlbGVtZW50OwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkJcmV0dXJuIGdldEltYWdlKCgoQXR0cikgbm9kZSkuZ2V0T3duZXJFbGVtZW50KCkpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqIFRoZSBkZXNpZ24gcGFnZSBpbmRleC4gKi8KLQlwcml2YXRlIGludCBmRGVzaWduUGFnZUluZGV4OwotCi0JLyoqIFRoZSBkZXNpZ24gdmlld2VyICovCi0JSURlc2lnblZpZXdlciBmRGVzaWduVmlld2VyOwotCi0JcHJpdmF0ZSBBY3RpdmF0aW9uTGlzdGVuZXIgZkFjdGl2YXRpb25MaXN0ZW5lcjsKLQotCUlQcm9wZXJ0eUxpc3RlbmVyIGZQcm9wZXJ0eUxpc3RlbmVyID0gbnVsbDsKLQotCS8qKiBUaGUgc291cmNlIHBhZ2UgaW5kZXguICovCi0JaW50IGZTb3VyY2VQYWdlSW5kZXg7Ci0KLQkvKiogVGhlIHRleHQgZWRpdG9yLiAqLwotCXByaXZhdGUgU3RydWN0dXJlZFRleHRFZGl0b3IgZlRleHRFZGl0b3I7Ci0KLQlwcml2YXRlIFRleHRFZGl0b3JQb3N0U2VsZWN0aW9uQWRhcHRlciBmVGV4dEVkaXRvclNlbGVjdGlvbkxpc3RlbmVyOwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBmU3RhdHVzTGluZUxhYmVsUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dE11bHRpUGFnZUVkaXRvclBhcnQgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWE1MTXVsdGlQYWdlRWRpdG9yUGFydCgpIHsKLQkJc3VwZXIoKTsKLQkJZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyID0gbmV3IFN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIG1ldGhvZCBpcyBqdXN0IHRvIG1ha2UgZmlyZVByb3BlcnR5Q2hhbmdlZCBhY2Nlc3NpYmxlIGZyb20gc29tZQotCSAqIChhbm9ub21vdXMpIGlubmVyIGNsYXNzZXMuCi0JICovCi0Jdm9pZCBfZmlyZVByb3BlcnR5Q2hhbmdlKGludCBwcm9wZXJ0eSkgewotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UocHJvcGVydHkpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIHNvdXJjZSBwYWdlIG9mIHRoZSBtdWx0aS1wYWdlIGVkaXRvci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkU291cmNlUGFnZSgpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCWZTb3VyY2VQYWdlSW5kZXggPSBhZGRQYWdlKGZUZXh0RWRpdG9yLCBnZXRFZGl0b3JJbnB1dCgpKTsKLQkJc2V0UGFnZVRleHQoZlNvdXJjZVBhZ2VJbmRleCwgWE1MRWRpdG9yTWVzc2FnZXMuWE1MTXVsdGlQYWdlRWRpdG9yUGFydF8wKTsKLQotCQlmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9USVRMRSk7Ci0KLQkJLy8gQ2hhbmdlcyB0byB0aGUgVGV4dCBWaWV3ZXIncyBkb2N1bWVudCBpbnN0YW5jZSBzaG91bGQgYWxzbwotCQkvLyBmb3JjZSBhbgotCQkvLyBpbnB1dCByZWZyZXNoCi0JCWZUZXh0RWRpdG9yLmdldFRleHRWaWV3ZXIoKS5hZGRUZXh0SW5wdXRMaXN0ZW5lcihuZXcgVGV4dElucHV0TGlzdGVuZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29ubmVjdHMgdGhlIGRlc2lnbiB2aWV3ZXIgd2l0aCB0aGUgdmlld2VyIHNlbGVjdGlvbiBtYW5hZ2VyLiBTaG91bGQgYmUKLQkgKiBkb25lIGFmdGVyIGNyZWF0ZVNvdXJjZVBhZ2UoKSBpcyBkb25lIGJlY2F1c2Ugd2UgbmVlZCB0byBnZXQgdGhlCi0JICogVmlld2VyU2VsZWN0aW9uTWFuYWdlciBmcm9tIHRoZSBUZXh0RWRpdG9yLiBzZXRNb2RlbCBpcyBhbHNvIGRvbmUgaGVyZQotCSAqIGJlY2F1c2UgZ2V0TW9kZWwoKSBuZWVkcyB0byByZWZlcmVuY2UgdGhlIFRleHRFZGl0b3IuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbm5lY3REZXNpZ25QYWdlKCkgewotCQlpZiAoZkRlc2lnblZpZXdlciAhPSBudWxsKSB7Ci0JCQlmRGVzaWduVmlld2VyLnNldERvY3VtZW50KGdldERvY3VtZW50KCkpOwotCQl9Ci0KLQkJLyoKLQkJICogQ29ubmVjdCBzZWxlY3Rpb24gZnJvbSB0aGUgRGVzaWduIHBhZ2UgdG8gdGhlIHNlbGVjdGlvbiBwcm92aWRlcgotCQkgKiBmb3IgdGhlIFhNTE11bHRpUGFnZUVkaXRvclBhcnQgc28gdGhhdCBzZWxlY3Rpb24gY2hhbmdlcyBpbiB0aGUKLQkJICogRGVzaWduIHBhZ2Ugd2lsbCBwcm9wb2dhdGUgYWNyb3NzIHRoZSB3b3JrYmVuY2gKLQkJICovCi0JCWlmIChmRGVzaWduVmlld2VyLmdldFNlbGVjdGlvblByb3ZpZGVyKCkgaW5zdGFuY2VvZiBJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSB7Ci0JCQkoKElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIGZEZXNpZ25WaWV3ZXIuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSkuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkoKE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyKSBnZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSkuZmlyZVBvc3RTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlmRGVzaWduVmlld2VyLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkoKE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyKSBnZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSkuZmlyZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9KTsKLQotCQkvKgotCQkgKiBDb25uZWN0IHNlbGVjdGlvbiBmcm9tIHRoZSBEZXNpZ24gcGFnZSB0byB0aGUgc2VsZWN0aW9uIHByb3ZpZGVyIG9mCi0JCSAqIHRoZSBTb3VyY2UgcGFnZSBzbyB0aGF0IHNlbGVjdGlvbiBpbiB0aGUgRGVzaWduIHBhZ2Ugd2lsbCBkcml2ZQotCQkgKiBzZWxlY3Rpb24gaW4gdGhlIFNvdXJjZSBwYWdlLiBQcmVmZXIgcG9zdCBzZWxlY3Rpb24uCi0JCSAqLwotCQlpZiAoZkRlc2lnblZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpIGluc3RhbmNlb2YgSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgewotCQkJKChJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSBmRGVzaWduVmlld2VyLmdldFNlbGVjdGlvblByb3ZpZGVyKCkpLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChmaW5hbCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJLyoKLQkJCQkJICogT25seSBmb3JjZSBzZWxlY3Rpb24gdXBkYXRlIGlmIHNvdXJjZSBwYWdlIGlzIG5vdAotCQkJCQkgKiBhY3RpdmUKLQkJCQkJICovCi0JCQkJCWlmIChnZXRBY3RpdmVQYWdlKCkgIT0gZlNvdXJjZVBhZ2VJbmRleCkgewotCQkJCQkJZ2V0VGV4dEVkaXRvcigpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuc2V0U2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWVsc2UgewotCQkJZkRlc2lnblZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkvKgotCQkJCQkgKiBPbmx5IGZvcmNlIHNlbGVjdGlvbiB1cGRhdGUgaWYgc291cmNlIHBhZ2UgaXMgbm90Ci0JCQkJCSAqIGFjdGl2ZQotCQkJCQkgKi8KLQkJCQkJaWYgKGdldEFjdGl2ZVBhZ2UoKSAhPSBmU291cmNlUGFnZUluZGV4KSB7Ci0JCQkJCQlnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5zZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQl9Ci0JCQkJCS8qIEJ1ZyAyMTA0ODEgLSBSZW1vdmVkIGNhbGwgdG8gdXBkYXRlU3RhdHVzTGluZSBiZWNhdXNlIHRoaXMgaXMgYWxyZWFkeQotCQkJCQkgKiBoYW5kbGVkIGJ5IHRoZSBzZWxlY3Rpb24gaW4gdGhlIHNvdXJjZSBwYWdlICovCi0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQkvKgotCQkgKiBIYW5kbGUgZG91YmxlLWNsaWNrIGluIHRoZSBEZXNpZ24gcGFnZSBieSBzZWxlY3RpbmcgdGhlCi0JCSAqIGNvcnJlc3BvbmRpbmcgYW1vdW50IG9mIHRleHQgaW4gdGhlIFNvdXJjZSBwYWdlLgotCQkgKi8KLQkJZkRlc2lnblZpZXdlci5nZXRDb250cm9sKCkuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG91YmxlQ2xpY2ssIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBmRGVzaWduVmlld2VyLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaW50IHN0YXJ0ID0gLTE7Ci0JCQkJaW50IGxlbmd0aCA9IC0xOwotCQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQkvKgotCQkJCQkgKiBzZWxlY3Rpb24gZ29lcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlyc3Qgb2JqZWN0IHRvCi0JCQkJCSAqIHRoZSBlbmQgb2YgdGhlIGxhc3QKLQkJCQkJICovCi0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQkJT2JqZWN0IG8gPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlPYmplY3QgbzIgPSBudWxsOwotCQkJCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJCQlvMiA9IHN0cnVjdHVyZWRTZWxlY3Rpb24udG9BcnJheSgpW3N0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpIC0gMV07Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlvMiA9IG87Ci0JCQkJCX0KLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQlzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbykuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCWxlbmd0aCA9ICgoSW5kZXhlZFJlZ2lvbikgbzIpLmdldEVuZE9mZnNldCgpIC0gc3RhcnQ7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAobzIgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbikgewotCQkJCQkJc3RhcnQgPSAoKElUZXh0UmVnaW9uKSBvKS5nZXRTdGFydCgpOwotCQkJCQkJbGVuZ3RoID0gKChJVGV4dFJlZ2lvbikgbzIpLmdldEVuZCgpIC0gc3RhcnQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCQkJc3RhcnQgPSAoKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldE9mZnNldCgpOwotCQkJCQlsZW5ndGggPSAoKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldExlbmd0aCgpOwotCQkJCX0KLQkJCQlpZiAoKHN0YXJ0ID4gLTEpICYmIChsZW5ndGggPiAtMSkpIHsKLQkJCQkJZ2V0VGV4dEVkaXRvcigpLnNlbGVjdEFuZFJldmVhbChzdGFydCwgbGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8qCi0JCSAqIENvbm5lY3Qgc2VsZWN0aW9uIGZyb20gdGhlIFNvdXJjZSBwYWdlIHRvIHRoZSBzZWxlY3Rpb24gcHJvdmlkZXIgb2YKLQkJICogdGhlIERlc2lnbiBwYWdlIHNvIHRoYXQgc2VsZWN0aW9uIGluIHRoZSBTb3VyY2UgcGFnZSB3aWxsIGRyaXZlCi0JCSAqIHNlbGVjdGlvbiBpbiB0aGUgRGVzaWduIHBhZ2UuIFByZWZlciBwb3N0IHNlbGVjdGlvbi4KLQkJICovCi0JCUlTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IGdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlpZiAoZlRleHRFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmVGV4dEVkaXRvclNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFRleHRFZGl0b3JQb3N0U2VsZWN0aW9uQWRhcHRlcigpOwotCQl9Ci0JCWlmIChwcm92aWRlciBpbnN0YW5jZW9mIElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIHsKLQkJCWZUZXh0RWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIuZm9yY2VQb3N0U2VsZWN0aW9uID0gZmFsc2U7Ci0JCQkoKElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIHByb3ZpZGVyKS5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZUZXh0RWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JCWVsc2UgewotCQkJZlRleHRFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lci5mb3JjZVBvc3RTZWxlY3Rpb24gPSB0cnVlOwotCQkJcHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZUZXh0RWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuZCBBZGQgdGhlIERlc2lnbiBQYWdlIHVzaW5nIGEgcmVnaXN0ZXJlZCBmYWN0b3J5Ci0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFuZEFkZERlc2lnblBhZ2UoKSB7Ci0JCUlEZXNpZ25WaWV3ZXIgZGVzaWduVmlld2VyID0gY3JlYXRlRGVzaWduUGFnZSgpOwotCi0JCWZEZXNpZ25WaWV3ZXIgPSBkZXNpZ25WaWV3ZXI7Ci0JCS8vIG5vdGU6IEJ5IGFkZGluZyB0aGUgZGVzaWduIHBhZ2UgYXMgYSBDb250cm9sIGluc3RlYWQgb2YgYW4KLQkJLy8gSUVkaXRvclBhcnQsIHBhZ2Ugc3dpdGNoZXMgd2lsbCBpbmRpY2F0ZQotCQkvLyBhICJudWxsIiBhY3RpdmUgZWRpdG9yIHdoZW4gdGhlIGRlc2lnbiBwYWdlIGlzIG1hZGUgYWN0aXZlCi0JCWZEZXNpZ25QYWdlSW5kZXggPSBhZGRQYWdlKGRlc2lnblZpZXdlci5nZXRDb250cm9sKCkpOwotCQlzZXRQYWdlVGV4dChmRGVzaWduUGFnZUluZGV4LCBkZXNpZ25WaWV3ZXIuZ2V0VGl0bGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElEZXNpZ25WaWV3ZXIgY3JlYXRlRGVzaWduUGFnZSgpIHsKLQkJWE1MVGFibGVUcmVlVmlld2VyIHRhYmxlVHJlZVZpZXdlciA9IG5ldyBYTUxUYWJsZVRyZWVWaWV3ZXIoZ2V0Q29udGFpbmVyKCkpOwotCQkvLyBTZXQgdGhlIGRlZmF1bHQgaW5mb3BvcCBmb3IgWE1MIGRlc2lnbiB2aWV3ZXIuCi0JCVhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGFibGVUcmVlVmlld2VyLmdldENvbnRyb2woKSwgWE1MVGFibGVUcmVlSGVscENvbnRleHRJZHMuWE1MX0RFU0lHTl9WSUVXX0hFTFBJRCk7Ci0JCXJldHVybiB0YWJsZVRyZWVWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgcGFnZXMgb2YgdGhpcyBtdWx0aS1wYWdlIGVkaXRvci4KLQkgKiA8cD4KLQkgKiBTdWJjbGFzc2VzIG9mIDxjb2RlPk11bHRpUGFnZUVkaXRvcjwvY29kZT4gbXVzdCBpbXBsZW1lbnQgdGhpcwotCSAqIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUGFnZXMoKSB7Ci0JCXRyeSB7Ci0JCQkvLyBzb3VyY2UgcGFnZSBNVVNUIGJlIGNyZWF0ZWQgYmVmb3JlIGRlc2lnbiBwYWdlLCBub3cKLQkJCWNyZWF0ZVNvdXJjZVBhZ2UoKTsKLQotCQkJY3JlYXRlQW5kQWRkRGVzaWduUGFnZSgpOwotCQkJYWRkU291cmNlUGFnZSgpOwotCQkJY29ubmVjdERlc2lnblBhZ2UoKTsKLQotCQkJLy8gc2V0IHRoZSBhY3RpdmUgZWRpdG9yIGluIHRoZSBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yIGZpcnN0Ci0JCQkvLyBiZWZvcmUgc2V0YWN0aXZlcGFnZSBjYWxscyBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yJ3MKLQkJCS8vIHNldGFjdGl2ZXBhZ2UgKGJ1ZzE0MTAxMyAtIHJlbW92ZSB3aGVuIGJ1ZzE1MTQ4OCBpcyBmaXhlZCkKLQkJCUlFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBjb250cmlidXRvciA9IGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotCQkJaWYgKGNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpIHsKLQkJCQkoKE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBjb250cmlidXRvcikuc2V0QWN0aXZlRWRpdG9yKHRoaXMpOwotCQkJfQotCi0JCQlpbnQgYWN0aXZlUGFnZUluZGV4ID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0SW50KElYTUxQcmVmZXJlbmNlTmFtZXMuTEFTVF9BQ1RJVkVfUEFHRSk7Ci0JCQlpZiAoKGFjdGl2ZVBhZ2VJbmRleCA+PSAwKSAmJiAoYWN0aXZlUGFnZUluZGV4IDwgZ2V0UGFnZUNvdW50KCkpKSB7Ci0JCQkJc2V0QWN0aXZlUGFnZShhY3RpdmVQYWdlSW5kZXgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0QWN0aXZlUGFnZShmU291cmNlUGFnZUluZGV4KTsKLQkJCX0KLQkJfQotCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQjY3JlYXRlU2l0ZShvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUVkaXRvclNpdGUgY3JlYXRlU2l0ZShJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJSUVkaXRvclNpdGUgc2l0ZSA9IG51bGw7Ci0JCWlmIChlZGl0b3IgPT0gZlRleHRFZGl0b3IpIHsKLQkJCXNpdGUgPSBuZXcgTXVsdGlQYWdlRWRpdG9yU2l0ZSh0aGlzLCBlZGl0b3IpIHsKLQkJCQkvKioKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yU2l0ZSNnZXRBY3Rpb25CYXJDb250cmlidXRvcigpCi0JCQkJICovCi0JCQkJcHVibGljIElFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQkJCQkJSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yID0gc3VwZXIuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLQkJCQkJSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIG11bHRpQ29udHJpYnV0b3IgPSBYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0LnRoaXMuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0JCQkJCWlmIChtdWx0aUNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgWE1MTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpIHsKLQkJCQkJCWNvbnRyaWJ1dG9yID0gKChYTUxNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcikgbXVsdGlDb250cmlidXRvcikuc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3I7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGNvbnRyaWJ1dG9yOwotCQkJCX0KLQotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJCS8vIHNldHMgdGhpcyBpZCBzbyBuZXN0ZWQgZWRpdG9yIGlzIGNvbnNpZGVyZWQgeG1sIHNvdXJjZQotCQkJCQkvLyBwYWdlCi0JCQkJCXJldHVybiBDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MICsgIi5zb3VyY2UiOyAvLyROT04tTkxTLTEkOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzaXRlID0gc3VwZXIuY3JlYXRlU2l0ZShlZGl0b3IpOwotCQl9Ci0JCXJldHVybiBzaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHNvdXJjZSBwYWdlIG9mIHRoZSBtdWx0aS1wYWdlIGVkaXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTb3VyY2VQYWdlKCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJZlRleHRFZGl0b3IgPSBjcmVhdGVUZXh0RWRpdG9yKCk7Ci0JCWZUZXh0RWRpdG9yLnNldEVkaXRvclBhcnQodGhpcyk7Ci0KLQkJaWYgKGZQcm9wZXJ0eUxpc3RlbmVyID09IG51bGwpIHsKLQkJCWZQcm9wZXJ0eUxpc3RlbmVyID0gbmV3IFByb3BlcnR5TGlzdGVuZXIoKTsKLQkJfQotCQlmVGV4dEVkaXRvci5hZGRQcm9wZXJ0eUxpc3RlbmVyKGZQcm9wZXJ0eUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgY3JlYXRlVGV4dEVkaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cnVjdHVyZWRUZXh0RWRpdG9yCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBjcmVhdGVUZXh0RWRpdG9yKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0RWRpdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc2Nvbm5lY3REZXNpZ25QYWdlKCkgewotCQlpZiAoZkRlc2lnblZpZXdlciAhPSBudWxsKSB7Ci0JCQlmRGVzaWduVmlld2VyLnNldERvY3VtZW50KG51bGwpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJTG9nZ2VyLnRyYWNlKCJTb3VyY2UgRWRpdG9yIiwgIlhNTE11bHRpUGFnZUVkaXRvclBhcnQ6OmRpc3Bvc2UgZW50cnkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJZGlzY29ubmVjdERlc2lnblBhZ2UoKTsKLQotCQlpZiAoZkFjdGl2YXRpb25MaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlmQWN0aXZhdGlvbkxpc3RlbmVyLmRpc3Bvc2UoKTsKLQkJCWZBY3RpdmF0aW9uTGlzdGVuZXIgPSBudWxsOwotCQl9Ci0KLQkJaWYgKChmVGV4dEVkaXRvciAhPSBudWxsKSAmJiAoZlByb3BlcnR5TGlzdGVuZXIgIT0gbnVsbCkpIHsKLQkJCWZUZXh0RWRpdG9yLnJlbW92ZVByb3BlcnR5TGlzdGVuZXIoZlByb3BlcnR5TGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gbW92ZWQgdG8gbGFzdCB3aGVuIGFkZGVkIHdpbmRvdyAuLi4gc2VlbXMgbGlrZQotCQkvLyB3ZSdkIGJlIGluIGRhbmdlciBvZiBsb3Npbmcgc29tZSBkYXRhLCBsaWtlIHNpdGUsCi0JCS8vIG9yIHNvbWV0aGluZy4KLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCUxvZ2dlci50cmFjZSgiU291cmNlIEVkaXRvciIsICJTdHJ1Y3R1cmVkVGV4dE11bHRpUGFnZUVkaXRvclBhcnQ6OmRpc3Bvc2UgZXhpdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNkb1NhdmUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmVGV4dEVkaXRvci5kb1NhdmUobW9uaXRvcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZUFzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQkJZlRleHRFZGl0b3IuZG9TYXZlQXMoKTsKLQkJLyoKLQkJICogVXBkYXRlIHRoZSBkZXNpZ24gdmlld2VyIHNpbmNlIHRoZSBlZGl0b3IgaW5wdXQgd291bGQgaGF2ZSBjaGFuZ2VkCi0JCSAqIHRvIHRoZSBuZXcgZmlsZS4KLQkJICovCi0JCWlmIChmRGVzaWduVmlld2VyICE9IG51bGwpIHsKLQkJCWZEZXNpZ25WaWV3ZXIuc2V0RG9jdW1lbnQoZ2V0RG9jdW1lbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsKLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0KLQkJLy8gd2UgZXh0ZW5kIHN1cGVyY2xhc3MsIG5vdCBvdmVycmlkZSBpdCwgc28gYWxsb3cgaXQgZmlyc3QKLQkJLy8gY2hhbmNlIHRvIHNhdGlzZnkgcmVxdWVzdC4KLQkJcmVzdWx0ID0gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOwotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJaWYgKGtleSA9PSBJRGVzaWduVmlld2VyLmNsYXNzKSB7Ci0JCQkJcmVzdWx0ID0gZkRlc2lnblZpZXdlcjsKLQotCQkJfQotCQkJZWxzZSBpZiAoa2V5LmVxdWFscyhJR290b01hcmtlci5jbGFzcykpIHsKLQkJCQlyZXN1bHQgPSBuZXcgSUdvdG9NYXJrZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkJCQkJCVhNTE11bHRpUGFnZUVkaXRvclBhcnQudGhpcy5nb3RvTWFya2VyKG1hcmtlcik7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyoKLQkJCQkgKiBETVc6IEknbSBidWxsZXQtcHJvb2ZpbmcgdGhpcyBiZWNhdXNlIGl0cyBiZWVuIHJlcG9ydGVkIChvbgotCQkJCSAqIHZlcnkgZWFybHkgdmVyc2lvbnMpIGEgbnVsbCBwb2ludGVyIHNvbWV0aW1lcyBoYXBwZW5zIGhlcmUKLQkJCQkgKiBvbiBzdGFydHVwLCB3aGVuIGFuIGVkaXRvciBoYXMgYmVlbiBsZWZ0IG9wZW4gd2hlbgotCQkJCSAqIHdvcmtiZW5jaCBzaHV0ZG93bi4KLQkJCQkgKi8KLQkJCQlpZiAoZlRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBmVGV4dEVkaXRvci5nZXRBZGFwdGVyKGtleSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCWlmIChmVGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JCQlkb2N1bWVudCA9IGZUZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlTdHJ1Y3R1cmVkVGV4dEVkaXRvciBnZXRUZXh0RWRpdG9yKCkgewotCQlyZXR1cm4gZlRleHRFZGl0b3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCNnZXRUaXRsZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJU3RyaW5nIHRpdGxlID0gbnVsbDsKLQkJaWYgKGdldFRleHRFZGl0b3IoKSA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0RWRpdG9ySW5wdXQoKSAhPSBudWxsKSB7Ci0JCQkJdGl0bGUgPSBnZXRFZGl0b3JJbnB1dCgpLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRpdGxlID0gZ2V0VGV4dEVkaXRvcigpLmdldFRpdGxlKCk7Ci0JCX0KLQkJaWYgKHRpdGxlID09IG51bGwpIHsKLQkJCXRpdGxlID0gZ2V0UGFydE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0Jdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0JCXNldEFjdGl2ZVBhZ2UoZlNvdXJjZVBhZ2VJbmRleCk7Ci0JCUlERS5nb3RvTWFya2VyKGZUZXh0RWRpdG9yLCBtYXJrZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQkJLy8gd2Ugd2FudCB0byBsaXN0ZW4gZm9yIG91ciBvd24gYWN0aXZhdGlvbgotCQkJZkFjdGl2YXRpb25MaXN0ZW5lciA9IG5ldyBBY3RpdmF0aW9uTGlzdGVuZXIoc2l0ZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImV4Y2VwdGlvbiBpbml0aWFsaXppbmcgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNldFBhcnROYW1lKGlucHV0LmdldE5hbWUoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2lzU2F2ZUFzQWxsb3dlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQlyZXR1cm4gKGZUZXh0RWRpdG9yICE9IG51bGwpICYmIGZUZXh0RWRpdG9yLmlzU2F2ZUFzQWxsb3dlZCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc1NhdmVPbkNsb3NlTmVlZGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVPbkNsb3NlTmVlZGVkKCkgewotCQkvLyBvdmVycmlkaW5nIHN1cGVyIGNsYXNzIHNpbmNlIGl0IGRvZXMgYSBsb3dseSBpc0RpcnR5IQotCQlpZiAoZlRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZUZXh0RWRpdG9yLmlzU2F2ZU9uQ2xvc2VOZWVkZWQoKTsKLQkJfQotCQlyZXR1cm4gaXNEaXJ0eSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I3BhZ2VDaGFuZ2UoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IG5ld1BhZ2VJbmRleCkgewotCQlzdXBlci5wYWdlQ2hhbmdlKG5ld1BhZ2VJbmRleCk7Ci0JCXNhdmVMYXN0QWN0aXZlUGFnZUluZGV4KG5ld1BhZ2VJbmRleCk7Ci0KLQkJaWYgKG5ld1BhZ2VJbmRleCA9PSBmRGVzaWduUGFnZUluZGV4KSB7Ci0JCQkvLyBkZXNpZ24gcGFnZSBpc24ndCBhbiBJRWRpdG9yUGFydCwgdGhlcmVmb3JlIHdlIGhhdmUgdG8gc2VuZAotCQkJLy8gc2VsZWN0aW9uIGNoYW5nZXMgb3Vyc2VsdmVzCi0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSBmRGVzaWduVmlld2VyLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCVNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKTsKLQkJCQkoKE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyKSBnZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSkuZmlyZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCSgoTXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXIpIGdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKS5maXJlUG9zdFNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVMYXN0QWN0aXZlUGFnZUluZGV4KGludCBuZXdQYWdlSW5kZXgpIHsKLQkJLy8gc2F2ZSB0aGUgbGFzdCBhY3RpdmUgcGFnZSBpbmRleCB0byBwcmVmZXJlbmNlIG1hbmFnZXIKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSVhNTFByZWZlcmVuY2VOYW1lcy5MQVNUX0FDVElWRV9QQUdFLCBuZXdQYWdlSW5kZXgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I3NldElucHV0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJLyoKLQkJICogSWYgZHJpdmVuIGZyb20gdGhlIFNvdXJjZSBwYWdlLCBpdCdzICJtb2RlbCIgbWF5IG5vdCBiZSB1cCB0byBkYXRlCi0JCSAqIHdpdGggKG9yIGV2ZW4gZXhpc3QgZm9yKSB0aGUgaW5wdXQganVzdCB5ZXQuIExhdGVyIG5vdGlmaWNhdGlvbgotCQkgKiBmcm9tIHRoZSBUZXh0Vmlld2VyIGNvdWxkIHNldCB1cyBzdHJhaWdodCwgYWx0aG91Z2ggaXQncyBub3QKLQkJICogZ3VhcmFudGVlZCB0byBoYXBwZW4gYWZ0ZXIgdGhlIG1vZGVsIGhhcyBiZWVuIGNyZWF0ZWQuCi0JCSAqLwotCQlzdXBlci5zZXRJbnB1dChpbnB1dCk7Ci0JCWlmIChmRGVzaWduVmlld2VyICE9IG51bGwpIHsKLQkJCWZEZXNpZ25WaWV3ZXIuc2V0RG9jdW1lbnQoZ2V0RG9jdW1lbnQoKSk7Ci0JCX0KLQkJc2V0UGFydE5hbWUoaW5wdXQuZ2V0TmFtZSgpKTsKLQl9Ci0KLQl2b2lkIHVwZGF0ZVN0YXR1c0xpbmUoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyID0gZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCQlpZiAoZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyICE9IG51bGwgJiYgc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJT2JqZWN0IGZpcnN0RWxlbWVudCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKGZpcnN0RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCXRleHQgPSBmU3RhdHVzTGluZUxhYmVsUHJvdmlkZXIuZ2V0VGV4dChmaXJzdEVsZW1lbnQpOwotCQkJCQlpbWFnZSA9IGZTdGF0dXNMaW5lTGFiZWxQcm92aWRlci5nZXRJbWFnZSgoZmlyc3RFbGVtZW50KSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKHRleHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShpbWFnZSwgdGV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYTFmZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyIC0gYnVnIDIxMjMzMCAtIG1pZ3JhdGUgdG8gb3JnLmVjbGlwc2UudWkubWVudXMgZXh0ZW5zaW9uIHBvaW50Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5DTURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3IgaW1wbGVtZW50cyBJRGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgewotCi0JcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVTSUdOX1ZJRVdFUl9TRVBBUkFUT1JfMV9JRCA9ICJzZWQudGFibGV0cmVlLnNlcGFyYXRvci4xIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIERFU0lHTl9WSUVXRVJfU0VQQVJBVE9SXzJfSUQgPSAic2VkLnRhYmxldHJlZS5zZXBhcmF0b3IuMiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBWQUxJREFURV9YTUxfSUQgPSAic2VkLnRhYmxldHJlZS52YWxpZGF0ZVhNTCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBSRUxPQURfR1JBTU1BUl9JRCA9ICJzZWQudGFibGV0cmVlLnJlbG9hZEdyYW1tYXIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgVE9HR0xFX0VESVRfTU9ERV9JRCA9ICJzZWQudGFibGV0cmVlLnRvZ2dsZUVkaXRNb2RlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYUEFORF9BTExfSUQgPSAic2VkLnRhYmxldHJlZS5leHBhbmRBbGwiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09MTEFQU0VfQUxMX0lEID0gInNlZC50YWJsZXRyZWUuY29sbGFwc2VBbGwiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgVG9nZ2xlRWRpdE1vZGVBY3Rpb24gdG9nZ2xlQWN0aW9uOwotCXByb3RlY3RlZCBSZWxvYWRHcmFtbWFyQWN0aW9uIHJlbG9hZEdyYW1tYXJBY3Rpb247Ci0JLy8gcHJvdGVjdGVkIFZhbGlkYXRlWE1MQWN0aW9uIHZhbGlkYXRlWE1MQWN0aW9uOwotCXByb3RlY3RlZCBWaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbiBleHBhbmRBY3Rpb247Ci0JcHJvdGVjdGVkIFZpZXdlckV4cGFuZENvbGxhcHNlQWN0aW9uIGNvbGxhcHNlQWN0aW9uOwotCXByb3RlY3RlZCBWaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbiB4bWxNZW51RXhwYW5kQWN0aW9uOwotCXByb3RlY3RlZCBWaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbiB4bWxNZW51Q29sbGFwc2VBY3Rpb247Ci0KLQlwdWJsaWMgWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ29udHJpYnV0aW9ucyhJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyKSB7Ci0vKgkJdHJ5IHsKLQkJCWRvUmVtb3ZlKG1hbmFnZXIsIERFU0lHTl9WSUVXRVJfU0VQQVJBVE9SXzFfSUQpOwotCQkJZG9SZW1vdmUobWFuYWdlciwgREVTSUdOX1ZJRVdFUl9TRVBBUkFUT1JfMl9JRCk7Ci0JCQlkb1JlbW92ZShtYW5hZ2VyLCBWQUxJREFURV9YTUxfSUQpOwotCQkJZG9SZW1vdmUobWFuYWdlciwgUkVMT0FEX0dSQU1NQVJfSUQpOwotCQkJZG9SZW1vdmUobWFuYWdlciwgVE9HR0xFX0VESVRfTU9ERV9JRCk7Ci0JCQlkb1JlbW92ZShtYW5hZ2VyLCBFWFBBTkRfQUxMX0lEKTsKLQkJCWRvUmVtb3ZlKG1hbmFnZXIsIENPTExBUFNFX0FMTF9JRCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLSovCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1JlbW92ZShJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLCBTdHJpbmcgaWQpIHsKLS8qCQl0cnkgewotCQkJaWYgKG1hbmFnZXIuZmluZChpZCkgIT0gbnVsbCkgewotCQkJCW1hbmFnZXIucmVtb3ZlKGlkKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotKi8JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBiYXJzLCBJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0JCWluaXQoYmFycyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBiYXJzKSB7Ci0vLwkJSVRvb2xCYXJNYW5hZ2VyIHRibSA9IGJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQotLyoJCUlNZW51TWFuYWdlciB4bWxNZW51ID0gYmFycy5nZXRNZW51TWFuYWdlcigpLmZpbmRNZW51VXNpbmdQYXRoKCJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLmRlc2lnbi54bWxtZW51Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoeG1sTWVudSA9PSBudWxsKSB7Ci0JCQl4bWxNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzAsICJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLmRlc2lnbi54bWxtZW51Iik7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIEZvciBSQ1AgdXNhZ2UKLQkJCWlmIChiYXJzLmdldE1lbnVNYW5hZ2VyKCkuZmluZChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fV0lORE9XKSAhPSBudWxsKSB7Ci0JCQkJYmFycy5nZXRNZW51TWFuYWdlcigpLmluc2VydEJlZm9yZShJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fV0lORE9XLCB4bWxNZW51KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXJlbW92ZUNvbnRyaWJ1dGlvbnMoeG1sTWVudSk7Ci0JCX0KLQotCQl0Ym0uYWRkKG5ldyBTZXBhcmF0b3IoIkRFU0lHTl9WSUVXRVJfU0VQQVJBVE9SXzFfSUQiKSk7IC8vJE5PTi1OTFMtMSQKLSovCi0JCS8vIFRvZ2dsZUVkaXRNb2RlQWN0aW9uCi0JCS8vICAgICAgICAgICAKLS8qCQl0b2dnbGVBY3Rpb24gPSBuZXcgVG9nZ2xlRWRpdE1vZGVBY3Rpb24oKTsKLQkJdG9nZ2xlQWN0aW9uLnNldElkKFRPR0dMRV9FRElUX01PREVfSUQpOwotCQl4bWxNZW51LmFkZCh0b2dnbGVBY3Rpb24pOwotCQl0Ym0uYWRkKHRvZ2dsZUFjdGlvbik7Ci0qLwotCQkvLyBSZWxvYWRHcmFtbWFyQWN0aW9uCi0JCS8vCi0vKgkJcmVsb2FkR3JhbW1hckFjdGlvbiA9IG5ldyBSZWxvYWRHcmFtbWFyQWN0aW9uKCk7Ci0JCXJlbG9hZEdyYW1tYXJBY3Rpb24uc2V0SWQoUkVMT0FEX0dSQU1NQVJfSUQpOwotCQl0Ym0uYWRkKHJlbG9hZEdyYW1tYXJBY3Rpb24pOwotCQl4bWxNZW51LmFkZChyZWxvYWRHcmFtbWFyQWN0aW9uKTsKLQotCQl4bWxNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotKi8KLQkJLy8gRXhwYW5kQ29sbGFwc2VBY3Rpb24KLQkJLy8KLS8qCQl4bWxNZW51RXhwYW5kQWN0aW9uID0gbmV3IFZpZXdlckV4cGFuZENvbGxhcHNlQWN0aW9uKHRydWUpOwotCQl4bWxNZW51RXhwYW5kQWN0aW9uLnNldElkKEVYUEFORF9BTExfSUQpOwotCQl4bWxNZW51RXhwYW5kQWN0aW9uLnNldFRleHQoWE1MRWRpdG9yTWVzc2FnZXMuWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfMSk7Ci0JCXhtbE1lbnUuYWRkKHhtbE1lbnVFeHBhbmRBY3Rpb24pOwotCi0JCXhtbE1lbnVDb2xsYXBzZUFjdGlvbiA9IG5ldyBWaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbihmYWxzZSk7Ci0JCXhtbE1lbnVDb2xsYXBzZUFjdGlvbi5zZXRJZChDT0xMQVBTRV9BTExfSUQpOwotCQl4bWxNZW51Q29sbGFwc2VBY3Rpb24uc2V0SWQoRVhQQU5EX0FMTF9JRCk7Ci0JCXhtbE1lbnVDb2xsYXBzZUFjdGlvbi5zZXRUZXh0KFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzIpOwotCQl4bWxNZW51LmFkZCh4bWxNZW51Q29sbGFwc2VBY3Rpb24pOwotKi8JCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEFjdGlvbldpdGhJZChJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsIEFjdGlvbiBhY3Rpb24sIFN0cmluZyBpZCkgewotCQlhY3Rpb24uc2V0SWQoaWQpOwotCQltZW51TWFuYWdlci5hZGQoYWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zKElBY3Rpb25CYXJzIGJhcnMpIHsKLS8qCQlJVG9vbEJhck1hbmFnZXIgdGJtID0gYmFycy5nZXRUb29sQmFyTWFuYWdlcigpOwotCQl0Ym0uYWRkKG5ldyBTZXBhcmF0b3IoREVTSUdOX1ZJRVdFUl9TRVBBUkFUT1JfMl9JRCkpOwotCi0JCWV4cGFuZEFjdGlvbiA9IG5ldyBWaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbih0cnVlKTsKLQkJZXhwYW5kQWN0aW9uLnNldElkKEVYUEFORF9BTExfSUQpOwotCQl0Ym0uYWRkKGV4cGFuZEFjdGlvbik7Ci0KLQkJY29sbGFwc2VBY3Rpb24gPSBuZXcgVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24oZmFsc2UpOwotCQljb2xsYXBzZUFjdGlvbi5zZXRJZChDT0xMQVBTRV9BTExfSUQpOwotCQl0Ym0uYWRkKGNvbGxhcHNlQWN0aW9uKTsKLSovCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotLyoJCWlmIChleHBhbmRBY3Rpb24gIT0gbnVsbCkgewotCQkJZXhwYW5kQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQl4bWxNZW51RXhwYW5kQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQotCQlpZiAoY29sbGFwc2VBY3Rpb24gIT0gbnVsbCkgewotCQkJY29sbGFwc2VBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCXhtbE1lbnVDb2xsYXBzZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0qLwkJCi0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQllZGl0b3JQYXJ0ID0gdGFyZ2V0RWRpdG9yOwotCi0vLwkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IGdldE1vZGVsRm9yRWRpdG9yUGFydCh0YXJnZXRFZGl0b3IpOwotLyoJCXJlbG9hZEdyYW1tYXJBY3Rpb24uc2V0TW9kZWwobW9kZWwpOwotCQl0b2dnbGVBY3Rpb24uc2V0TW9kZWxRdWVyeShNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG1vZGVsKSk7Ci0KLQkJWE1MVGFibGVUcmVlVmlld2VyIHRhYmxlVHJlZVZpZXdlciA9IGdldFRhYmxlVHJlZVZpZXdlckZvckVkaXRvclBhcnQoZWRpdG9yUGFydCk7Ci0JCWlmICh0YWJsZVRyZWVWaWV3ZXIgIT0gbnVsbCkgewotCQkJZXhwYW5kQWN0aW9uLnNldFZpZXdlcih0YWJsZVRyZWVWaWV3ZXIpOwotCQkJY29sbGFwc2VBY3Rpb24uc2V0Vmlld2VyKHRhYmxlVHJlZVZpZXdlcik7Ci0KLQkJCXhtbE1lbnVFeHBhbmRBY3Rpb24uc2V0Vmlld2VyKHRhYmxlVHJlZVZpZXdlcik7Ci0JCQl4bWxNZW51Q29sbGFwc2VBY3Rpb24uc2V0Vmlld2VyKHRhYmxlVHJlZVZpZXdlcik7Ci0JCX0KLSovCi0JCWlmIChlZGl0b3JQYXJ0IGluc3RhbmNlb2YgWE1MTXVsdGlQYWdlRWRpdG9yUGFydCkgewotCQkJSVdvcmtiZW5jaFBhcnRTaXRlIHNpdGUgPSBlZGl0b3JQYXJ0LmdldFNpdGUoKTsKLQkJCWlmIChzaXRlIGluc3RhbmNlb2YgSUVkaXRvclNpdGUpIHsKLQkJCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKChYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0KSBlZGl0b3JQYXJ0KS5nZXRUZXh0RWRpdG9yKCk7Ci0JCQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9ICgoSUVkaXRvclNpdGUpIHNpdGUpLmdldEFjdGlvbkJhcnMoKTsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ETywgZ2V0QWN0aW9uKHRleHRFZGl0b3IsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVORE8pKTsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUkVETywgZ2V0QWN0aW9uKHRleHRFZGl0b3IsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJFRE8pKTsKLQkJCX0KLQkJfQotCi0JCS8vIFRPRE8uLi4gdW5jb21tZW50IHRoaXMgYW5kIGludmVzdGlnYXRlIE5QRQotCQkvLwotCQkvLyBhZGQgdGhlIGN1dC9jb3B5L3Bhc3RlIGZvciB0ZXh0IGZpZWxkcwotCQkvLyBBY3Rpb25IYW5kbGVyUGx1Z2luLmNvbm5lY3RQYXJ0KGVkaXRvclBhcnQpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBJQWN0aW9uIGdldEFjdGlvbihJVGV4dEVkaXRvciBlZGl0b3IsIFN0cmluZyBhY3Rpb25JZCkgewotCQlyZXR1cm4gKGVkaXRvciA9PSBudWxsID8gbnVsbCA6IGVkaXRvci5nZXRBY3Rpb24oYWN0aW9uSWQpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXRvclBhcnQoSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0KSB7Ci0JCQlTdHJ1Y3R1cmVkVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKChYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0KSB0YXJnZXRFZGl0b3IpLmdldFRleHRFZGl0b3IoKTsKLQkJCXJlc3VsdCA9ICh0ZXh0RWRpdG9yICE9IG51bGwpID8gdGV4dEVkaXRvci5nZXRNb2RlbCgpIDogbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBYTUxUYWJsZVRyZWVWaWV3ZXIgZ2V0VGFibGVUcmVlVmlld2VyRm9yRWRpdG9yUGFydChJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJWE1MVGFibGVUcmVlVmlld2VyIHJlc3VsdCA9IG51bGw7Ci0JCU9iamVjdCBvYmplY3QgPSB0YXJnZXRFZGl0b3IuZ2V0QWRhcHRlcihJRGVzaWduVmlld2VyLmNsYXNzKTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhNTFRhYmxlVHJlZVZpZXdlcikgewotCQkJcmVzdWx0ID0gKFhNTFRhYmxlVHJlZVZpZXdlcikgb2JqZWN0OwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGNsYXNzIFRvZ2dsZUVkaXRNb2RlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQkJcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBvbkltYWdlID0gU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2VEZXNjcmlwdG9yKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19FVE9PTF9DT05TVFJBSU5PTik7Ci0JCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3Igb2ZmSW1hZ2UgPSBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbWFnZURlc2NyaXB0b3IoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX0VUT09MX0NPTlNUUkFJTk9GRik7Ci0JCXByb3RlY3RlZCBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnk7Ci0KLQkJcHVibGljIFRvZ2dsZUVkaXRNb2RlQWN0aW9uKCkgewotCQkJc2V0QXBwZWFyYW5jZUZvckVkaXRNb2RlKE1vZGVsUXVlcnkuRURJVF9NT0RFX0NPTlNUUkFJTkVEX1NUUklDVCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQkJaW50IG5ld1N0YXRlID0gZ2V0TmV4dFN0YXRlKG1vZGVsUXVlcnkuZ2V0RWRpdE1vZGUoKSk7Ci0JCQkJbW9kZWxRdWVyeS5zZXRFZGl0TW9kZShuZXdTdGF0ZSk7Ci0JCQkJc2V0QXBwZWFyYW5jZUZvckVkaXRNb2RlKG5ld1N0YXRlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldE1vZGVsUXVlcnkoTW9kZWxRdWVyeSBuZXdNb2RlbFF1ZXJ5KSB7Ci0JCQltb2RlbFF1ZXJ5ID0gbmV3TW9kZWxRdWVyeTsKLQkJCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCQlzZXRBcHBlYXJhbmNlRm9yRWRpdE1vZGUobW9kZWxRdWVyeS5nZXRFZGl0TW9kZSgpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEFwcGVhcmFuY2VGb3JFZGl0TW9kZShpbnQgZWRpdE1vZGUpIHsKLQkJCWlmIChlZGl0TW9kZSA9PSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpIHsKLQkJCQlzZXRUb29sVGlwVGV4dChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8zKTsKLQkJCQlzZXRUZXh0KFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzQpOwotCQkJCXNldEltYWdlRGVzY3JpcHRvcihvbkltYWdlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNldFRvb2xUaXBUZXh0KFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzUpOwotCQkJCXNldFRleHQoWE1MRWRpdG9yTWVzc2FnZXMuWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfNik7Ci0JCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKG9mZkltYWdlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TmV4dFN0YXRlKGludCBlZGl0TW9kZSkgewotCQkJaW50IHJlc3VsdCA9IC0xOwotCQkJaWYgKGVkaXRNb2RlID09IE1vZGVsUXVlcnkuRURJVF9NT0RFX0NPTlNUUkFJTkVEX1NUUklDVCkgewotCQkJCXJlc3VsdCA9IE1vZGVsUXVlcnkuRURJVF9NT0RFX1VOQ09OU1RSQUlORUQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHQgPSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1Q7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGNsYXNzIFJlbG9hZEdyYW1tYXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbDsKLQotCQlwdWJsaWMgUmVsb2FkR3JhbW1hckFjdGlvbigpIHsKLQkJCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlRGVzY3JpcHRvcihTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfRFRPT0xfUkxER1JNUikpOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlRGVzY3JpcHRvcihTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfRVRPT0xfUkxER1JNUikpOwotCQkJc2V0VG9vbFRpcFRleHQoWE1MRWRpdG9yTWVzc2FnZXMuWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfNyk7Ci0JCQlzZXRUZXh0KFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0TW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCkgewotCQkJdGhpcy5tb2RlbCA9IG5ld01vZGVsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG1vZGVsKTsKLQkJCQlEb2N1bWVudCBkb2N1bWVudCA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQlpZiAoKG1vZGVsUXVlcnkgIT0gbnVsbCkgJiYgKG1vZGVsUXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKSAhPSBudWxsKSkgewotCQkJCQltb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCkuZ2V0Q01Eb2N1bWVudENhY2hlKCkuY2xlYXIoKTsKLQkJCQkJLy8gVE9ETy4uLiBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGFjY2VzcyB0aGUKLQkJCQkJLy8gRE9NT2JzZXJ2ZXIgdmlhIE1vZGVsUXVlcnkKLQkJCQkJLy8gLi4ud2h5PwotCQkJCQlDTURvY3VtZW50TG9hZGVyIGxvYWRlciA9IG5ldyBJbmZlcnJlZEdyYW1tYXJCdWlsZGluZ0NNRG9jdW1lbnRMb2FkZXIoZG9jdW1lbnQsIG1vZGVsUXVlcnkpOwotCQkJCQlsb2FkZXIubG9hZENNRG9jdW1lbnRzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzEzMzIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWwuU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFhNTFRhYmxlVHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyLCBJVGFibGVMYWJlbFByb3ZpZGVyLCBJTGFiZWxQcm92aWRlciwgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudE1hbmFnZXIgZG9jdW1lbnRNYW5hZ2VyOwotCi0JU3RydWN0dXJlZFZpZXdlciBmVmlld2VyID0gbnVsbDsKLQotCXByaXZhdGUgVHJlZUNvbnRlbnRIZWxwZXIgdHJlZUNvbnRlbnRIZWxwZXIgPSBuZXcgVHJlZUNvbnRlbnRIZWxwZXIoKTsKLQotCXB1YmxpYyBYTUxUYWJsZVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLy8KLQkvLyBJTGFiZWxQcm92aWRlciBzdHVmZgotCS8vCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBzaW5jZSB3ZSBhbHdheXMgcmV0dXJuICdmYWxzZScgZm9yICJpc0xhYmVsUHJvcGVydHkiLAotCQkvLyBub3QgbmVlZCB0byBsaXN0ZW4uIE1heWJlIHRoYXQgc2hvdWxkIGNoYW5nZSBzb21lIGRheT8KLQl9Ci0KLQkvLyBDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyCi0JLy8KLQlwdWJsaWMgdm9pZCBjYWNoZUNsZWFyZWQoQ01Eb2N1bWVudENhY2hlIGNhY2hlKSB7Ci0JCWRvRGVsYXllZFJlZnJlc2hGb3JWaWV3ZXJzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2FjaGVVcGRhdGVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSwgZmluYWwgU3RyaW5nIHVyaSwgaW50IG9sZFN0YXR1cywgaW50IG5ld1N0YXR1cywgQ01Eb2N1bWVudCBjbURvY3VtZW50KSB7Ci0JCWlmICgobmV3U3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTE9BREVEKSB8fCAobmV3U3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfRVJST1IpKSB7Ci0JCQlkb0RlbGF5ZWRSZWZyZXNoRm9yVmlld2VycygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9EZWxheWVkUmVmcmVzaEZvclZpZXdlcnMoKSB7Ci0JCWlmICgoZlZpZXdlciAhPSBudWxsKSAmJiAhZlZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlmVmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmICgoZlZpZXdlciAhPSBudWxsKSAmJiAhZlZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlmVmlld2VyLnJlZnJlc2godHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCSgoSU5vZGVOb3RpZmllcikgZWxlbWVudCkuZ2V0QWRhcHRlckZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIHRyZWVDb250ZW50SGVscGVyLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIChjb2x1bW5JbmRleCA9PSAwKSA/IGdldEltYWdlKG9iamVjdCkgOiBudWxsOwotCX0KLQotCS8vCi0JLy8gSVRhYmxlTGFiZWxQcm92aWRlciBzdHVmZgotCS8vCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW4pIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChjb2x1bW4gPT0gMCkgewotCQkJcmVzdWx0ID0gZ2V0VGV4dChvYmplY3QpOwotCQl9Ci0JCWVsc2UgaWYgKChjb2x1bW4gPT0gMSkgJiYgKG9iamVjdCBpbnN0YW5jZW9mIE5vZGUpKSB7Ci0JCQlyZXN1bHQgPSB0cmVlQ29udGVudEhlbHBlci5nZXROb2RlVmFsdWUoKE5vZGUpIG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQkoKElOb2RlTm90aWZpZXIpIG9iamVjdCkuZ2V0QWRhcHRlckZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCX0KLQotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCQljYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOiB7Ci0JCQkJCWltYWdlID0gU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2UoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX09CSl9BVFRSSUJVVEUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6IHsKLQkJCQkJaW1hZ2UgPSBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbWFnZShTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfT0JKX0NEQVRBU0VDVElPTik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCQlpbWFnZSA9IFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19PQkpfQ09NTUVOVCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFIDogewotCQkJCQlpbWFnZSA9IFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19PQkpfRE9DVFlQRSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCQlpbWFnZSA9IFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19PQkpfRUxFTUVOVCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDogewotCQkJCQlpbWFnZSA9IFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19PQkpfUFJPQ0VTU0lOR0lOU1RSVUNUSU9OKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJCWltYWdlID0gU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2UoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX09CSl9UWFRFWFQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSA6IHsKLQkJCQkJaW1hZ2UgPSBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbWFnZShTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfT0JKX0VOVElUWV9SRUZFUkVOQ0UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkvLyBJbWFnZSBtYXJrZXJPdmVybGF5SW1hZ2UgPQotCQkJLy8gb3ZlcmxheUljb25NYW5hZ2VyLmdldE92ZXJsYXlJbWFnZUZvck9iamVjdChub2RlKTsKLQkJCS8vIGlmIChtYXJrZXJPdmVybGF5SW1hZ2UgIT0gbnVsbCkgewotCQkJLy8gaW1hZ2UgPSBpbWFnZUZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlSW1hZ2UoaW1hZ2UsCi0JCQkvLyBtYXJrZXJPdmVybGF5SW1hZ2UsIEltYWdlRmFjdG9yeS5CT1RUT01fTEVGVCk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJKChJTm9kZU5vdGlmaWVyKSBvKS5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJfQotCi0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlpZiAobyBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvOwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkJcmVzdWx0ID0gKChBdHRyKSBub2RlKS5nZXRPd25lckVsZW1lbnQoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlc3VsdCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgZ2V0Um9vdEVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJRWxlbWVudCByb290RWxlbWVudCA9IG51bGw7Ci0KLQkJZm9yIChOb2RlIGNoaWxkTm9kZSA9IGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGROb2RlICE9IG51bGw7IGNoaWxkTm9kZSA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlyb290RWxlbWVudCA9IChFbGVtZW50KSBjaGlsZE5vZGU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJvb3RFbGVtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQkoKElOb2RlTm90aWZpZXIpIG9iamVjdCkuZ2V0QWRhcHRlckZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCX0KLQotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0JCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJCWNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6IHsKLQkJCQkJcmVzdWx0ID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6IHsKLQkJCQkJcmVzdWx0ID0gIkRPQ1RZUEUiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCQlyZXN1bHQgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDogewotCQkJCQlyZXN1bHQgPSAoKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgbm9kZSkuZ2V0VGFyZ2V0KCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkvLyByZW1vdmUgb3VyIGxpc3RlbmVycyB0byB0aGUgb2xkIHN0YXRlCi0JCWlmIChvbGRJbnB1dCAhPSBudWxsKSB7Ci0JCQlEb2N1bWVudCBkb21Eb2MgPSAoRG9jdW1lbnQpIG9sZElucHV0OwotCQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9tRG9jKTsKLQkJCWlmIChtcSAhPSBudWxsKSB7Ci0JCQkJZG9jdW1lbnRNYW5hZ2VyID0gbXEuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKTsKLQkJCQlpZiAoZG9jdW1lbnRNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJZG9jdW1lbnRNYW5hZ2VyLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICgob2xkSW5wdXQgIT0gbnVsbCkgJiYgKG9sZElucHV0IGluc3RhbmNlb2YgSURPTU5vZGUpKSB7Ci0JCQlJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkpICgoSURPTU5vZGUpIG9sZElucHV0KS5nZXRNb2RlbCgpLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkucmVtb3ZlTGlzdGVuZXIodmlld2VyKTsKLQkJCX0KLQkJfQotCi0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVmlld2VyKSB7Ci0JCQlmVmlld2VyID0gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCWZWaWV3ZXIgPSAoU3RydWN0dXJlZFZpZXdlcikgdmlld2VyOwotCQl9Ci0KLQkJaWYgKChuZXdJbnB1dCAhPSBudWxsKSAmJiAobmV3SW5wdXQgaW5zdGFuY2VvZiBJRE9NTm9kZSkpIHsKLQkJCUlKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKElKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSkgKChJRE9NTm9kZSkgbmV3SW5wdXQpLmdldE1vZGVsKCkuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeUZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJZmFjdG9yeS5hZGRMaXN0ZW5lcih2aWV3ZXIpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG5ld0lucHV0ICE9IG51bGwpIHsKLQkJCURvY3VtZW50IGRvbURvYyA9IChEb2N1bWVudCkgbmV3SW5wdXQ7Ci0JCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb21Eb2MpOwotCi0JCQlpZiAobXEgIT0gbnVsbCkgewotCQkJCWRvY3VtZW50TWFuYWdlciA9IG1xLmdldENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0JCQkJaWYgKGRvY3VtZW50TWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCWRvY3VtZW50TWFuYWdlci5zZXRQcm9wZXJ0eUVuYWJsZWQoQ01Eb2N1bWVudE1hbmFnZXIuUFJPUEVSVFlfQVNZTkNfTE9BRCwgdHJ1ZSk7Ci0JCQkJCWRvY3VtZW50TWFuYWdlci5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbDsKLQl9Ci0KLQkvLyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgaGFuZGxlIGZpbHRlcmluZyBhc3BlY3RzIG9mIHRoZSB2aWV3ZXIKLQkvLwotCS8vCi0JcHVibGljIGJvb2xlYW4gaXNJZ25vcmFibGVUZXh0KE5vZGUgbm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQl0cnkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCVN0cmluZyBkYXRhID0gKChUZXh0KSBub2RlKS5nZXREYXRhKCk7Ci0JCQkJcmVzdWx0ID0gKChkYXRhID09IG51bGwpIHx8IChkYXRhLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKENNRG9jdW1lbnRNYW5hZ2VyIGNtRG9jdW1lbnRNYW5hZ2VyLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChjbURvY3VtZW50TWFuYWdlci5nZXRQcm9wZXJ0eUVuYWJsZWQoQ01Eb2N1bWVudE1hbmFnZXIuUFJPUEVSVFlfQVVUT19MT0FEKSkgewotCQkJZG9EZWxheWVkUmVmcmVzaEZvclZpZXdlcnMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gc2luY2Ugd2UgYWx3YXlzIHJldHVybiAnZmFsc2UnIGZvciAiaXNMYWJlbFByb3BlcnR5IiwKLQkJLy8gbm90IG5lZWQgdG8gbGlzdGVuLiBNYXliZSB0aGF0IHNob3VsZCBjaGFuZ2Ugc29tZSBkYXk/Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVGFibGVUcmVlSGVscENvbnRleHRJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZUhlbHBDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYmM0ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVGFibGVUcmVlSGVscENvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLQotCi0vKioKLSAqIEhlbHAgY29udGV4dCBpZHMgZm9yIHRoZSBUYWJsZVRyZWUgdmlldy4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZQotICogaW1wbGVtZW50ZWQgb3IgZXh0ZW5kZWQuCi0gKiA8L3A+Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBYTUxUYWJsZVRyZWVIZWxwQ29udGV4dElkcyB7Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBYTUxVSVBsdWdpbi5JRCArICIuIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gWE1MIERlc2lnbiBWaWV3Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RFU0lHTl9WSUVXX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxtMzAwMCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZVByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZVByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkyOWI0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVQcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3BlcnRpZXMuRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBYTUxUYWJsZVRyZWVQcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5IGV4dGVuZHMgRE9NUHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeSB7Ci0KLQlwcm90ZWN0ZWQgVHJlZUNvbnRlbnRIZWxwZXIgdHJlZUNvbnRlbnRIZWxwZXIgPSBuZXcgVHJlZUNvbnRlbnRIZWxwZXIoKTsKLQotCXB1YmxpYyBYTUxUYWJsZVRyZWVQcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvckhlbHBlcihTdHJpbmcgbmFtZSwgRWxlbWVudCBlbGVtZW50LCBDTU5vZGUgY21Ob2RlKSB7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3IgcmVzdWx0ID0gbnVsbDsKLQotCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCVN0cmluZ1tdIHZhbHVlc0FycmF5ID0gbnVsbDsKLQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCXZhbHVlc0FycmF5ID0gbXEuZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhlbGVtZW50LCBjbU5vZGUpOwotCQl9Ci0JCWlmICgodmFsdWVzQXJyYXkgIT0gbnVsbCkgJiYgKHZhbHVlc0FycmF5Lmxlbmd0aCA+IDApKSB7Ci0JCQlyZXN1bHQgPSBuZXcgRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBuYW1lLCB2YWx1ZXNBcnJheSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKG5hbWUpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVUZXh0UHJvcGVydHlEZXNjcmlwdG9yKFRleHQgdGV4dCkgewotCQlJUHJvcGVydHlEZXNjcmlwdG9yIHJlc3VsdCA9IG51bGw7Ci0JCU5vZGUgcGFyZW50Tm9kZSA9IHRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAoKHBhcmVudE5vZGUgIT0gbnVsbCkgJiYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkpIHsKLQkJCUVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChFbGVtZW50KSBwYXJlbnROb2RlOwotCQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkodGV4dC5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBudWxsOwotCQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCQllZCA9IG1xLmdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3JIZWxwZXIoSEFDSywgcGFyZW50RWxlbWVudCwgZWQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzdWx0ID0gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihwYXJlbnRFbGVtZW50LmdldE5vZGVOYW1lKCkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcihIQUNLLCBIQUNLKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlQXR0cmlidXRlUHJvcGVydHlEZXNjcmlwdG9yKEF0dHIgYXR0cikgewotCQlJUHJvcGVydHlEZXNjcmlwdG9yIHJlc3VsdCA9IG51bGw7Ci0KLQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoYXR0ci5nZXRPd25lckRvY3VtZW50KCkpOwotCi0JCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQgPSBudWxsOwotCQlpZiAobXEgIT0gbnVsbCkgewotCQkJYWQgPSBtcS5nZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpOwotCQl9Ci0JCWlmIChhZCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3JIZWxwZXIoYXR0cmlidXRlTmFtZSwgYXR0ci5nZXRPd25lckVsZW1lbnQoKSwgYWQpOwotCQl9Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcihhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVOYW1lKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihFbGVtZW50IGVsZW1lbnQpIHsKLQkJSVByb3BlcnR5RGVzY3JpcHRvciByZXN1bHQgPSBudWxsOwotCQlMaXN0IGxpc3QgPSB0cmVlQ29udGVudEhlbHBlci5nZXRFbGVtZW50VGV4dENvbnRlbnQoZWxlbWVudCk7Ci0JCWlmIChsaXN0ICE9IG51bGwpIHsKLQkJCVRleHQgdGV4dCA9IHRyZWVDb250ZW50SGVscGVyLmdldEVmZmVjdGl2ZVRleHROb2RlRm9yQ29tYmluZWROb2RlTGlzdChsaXN0KTsKLQkJCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBjcmVhdGVUZXh0UHJvcGVydHlEZXNjcmlwdG9yKHRleHQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcihIQUNLLCBIQUNLKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVGFibGVUcmVlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMWYyZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVGFibGVUcmVlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Mb2NhbFNlbGVjdGlvblRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklQb3N0U2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLk5vZGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5YTUxOb2RlQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRuZC5EcmFnTm9kZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBYTUxUYWJsZVRyZWVWaWV3ZXIgZXh0ZW5kcyBUcmVlVmlld2VyIGltcGxlbWVudHMgSURlc2lnblZpZXdlciB7Ci0KLQljbGFzcyBOb2RlQWN0aW9uTWVudUxpc3RlbmVyIGltcGxlbWVudHMgSU1lbnVMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJCS8vIHVzZWQgdG8gZGlzYWJsZSBOb2RlU2VsZWN0aW9uIGxpc3RlbmluZyB3aGlsZSBydW5uaW5nCi0JCQkvLyBOb2RlQWN0aW9uCi0JCQlYTUxOb2RlQWN0aW9uTWFuYWdlciBub2RlQWN0aW9uTWFuYWdlciA9IG5ldyBYTUxOb2RlQWN0aW9uTWFuYWdlcigoKElET01Eb2N1bWVudCkgZ2V0SW5wdXQoKSkuZ2V0TW9kZWwoKSwgWE1MVGFibGVUcmVlVmlld2VyLnRoaXMpIHsKLQkJCQlwdWJsaWMgdm9pZCBiZWdpbk5vZGVBY3Rpb24oTm9kZUFjdGlvbiBhY3Rpb24pIHsKLQkJCQkJc3VwZXIuYmVnaW5Ob2RlQWN0aW9uKGFjdGlvbik7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZW5kTm9kZUFjdGlvbihOb2RlQWN0aW9uIGFjdGlvbikgewotCQkJCQlzdXBlci5lbmROb2RlQWN0aW9uKGFjdGlvbik7Ci0JCQkJfQotCQkJfTsKLQkJCW5vZGVBY3Rpb25NYW5hZ2VyLmZpbGxDb250ZXh0TWVudShtZW51TWFuYWdlciwgZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgU2VsZWN0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJUG9zdFNlbGVjdGlvblByb3ZpZGVyIHsKLQotCQlwdWJsaWMgdm9pZCBhZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCVhNTFRhYmxlVHJlZVZpZXdlci50aGlzLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlYTUxUYWJsZVRyZWVWaWV3ZXIudGhpcy5yZW1vdmVQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlYTUxUYWJsZVRyZWVWaWV3ZXIudGhpcy5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQkJcmV0dXJuIFhNTFRhYmxlVHJlZVZpZXdlci50aGlzLmdldFNlbGVjdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCVhNTFRhYmxlVHJlZVZpZXdlci50aGlzLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCWJvb2xlYW4gc2VsZWN0aW9uU2V0ID0gZmFsc2U7Ci0JCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQkJCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQkJCi0JCQkJCWlmIChzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJCQkJSURPTU5vZGUgZG9tTm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZG9tTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCUlUZXh0UmVnaW9uIG1hdGNoaW5nUmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQodGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJCQkJCWludCBhbGxvd2VkSXRlcmF0aW9ucyA9IDQwOwotCQkJCQkJCQl3aGlsZSAobWF0Y2hpbmdSZWdpb24gIT0gbnVsbCAmJiAhbWF0Y2hpbmdSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpICYmIGFsbG93ZWRJdGVyYXRpb25zID4gMCkgewotCQkJCQkJCQkJbWF0Y2hpbmdSZWdpb24gPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChtYXRjaGluZ1JlZ2lvbikgLSAxKTsKLQkJCQkJCQkJCWFsbG93ZWRJdGVyYXRpb25zLS07Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKG1hdGNoaW5nUmVnaW9uICE9IG51bGwgJiYgbWF0Y2hpbmdSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpKSB7Ci0JCQkJCQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KG1hdGNoaW5nUmVnaW9uKTsKLQkJCQkJCQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZG9tTm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCQkJCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsICYmIGF0dHJOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQkJCU5vZGUgYXR0ciA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJCQkJCQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCXNlbGVjdGlvblNldCA9IHRydWU7Ci0JCQkJCQkJCQkJCVhNTFRhYmxlVHJlZVZpZXdlci50aGlzLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihhdHRyKSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFzZWxlY3Rpb25TZXQpIHsKLQkJCQlYTUxUYWJsZVRyZWVWaWV3ZXIudGhpcy5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBDZWxsRWRpdG9yIGNlbGxFZGl0b3I7Ci0KLQlwcm90ZWN0ZWQgWE1MVHJlZUV4dGVuc2lvbiB0cmVlRXh0ZW5zaW9uOwotCQotCXByaXZhdGUgSVNlbGVjdGlvblByb3ZpZGVyIGZTZWxlY3Rpb25Qcm92aWRlciA9IG5ldyBTZWxlY3Rpb25Qcm92aWRlcigpOwotCi0JcHVibGljIFhNTFRhYmxlVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQotCQkvLyBzZXQgdXAgcHJvdmlkZXJzCi0JCXRoaXMudHJlZUV4dGVuc2lvbiA9IG5ldyBYTUxUcmVlRXh0ZW5zaW9uKGdldFRyZWUoKSk7Ci0KLQkJWE1MVGFibGVUcmVlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IFhNTFRhYmxlVHJlZUNvbnRlbnRQcm92aWRlcigpOwotCQlzZXRDb250ZW50UHJvdmlkZXIocHJvdmlkZXIpOwotCQlzZXRMYWJlbFByb3ZpZGVyKHByb3ZpZGVyKTsKLQotCQljcmVhdGVDb250ZXh0TWVudSgpOwotCi0JCURyYWdTb3VyY2UgZHJhZ1NvdXJjZSA9IG5ldyBEcmFnU291cmNlKGdldENvbnRyb2woKSwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUpOwotCQlkcmFnU291cmNlLmFkZERyYWdMaXN0ZW5lcihjcmVhdGVEcmFnU291cmNlTGlzdGVuZXIoKSk7Ci0JCWRyYWdTb3VyY2Uuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge0xvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKX0pOwotCQlEcm9wVGFyZ2V0IGRyb3BUYXJnZXQgPSBuZXcgRHJvcFRhcmdldChnZXRDb250cm9sKCksIERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFKTsKLQkJZHJvcFRhcmdldC5hZGREcm9wTGlzdGVuZXIoY3JlYXRlRHJvcFRhcmdldExpc3RlbmVyKCkpOwotCQlkcm9wVGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlcltdIHtMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCl9KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYSBjb250ZXh0IG1lbnUgZm9yIHRoZSB2aWV3ZXIgYW5kIGFkZHMgYSBsaXN0ZW5lciBhcyB3ZWxsCi0JICogcmVnaXN0ZXJpbmcgdGhlIG1lbnUgZm9yIGV4dGVuc2lvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZXh0TWVudSgpIHsKLQkJTWVudU1hbmFnZXIgY29udGV4dE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3BVcCIpOyAvLyROT04tTkxTLTEkCi0JCWNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY29udGV4dE1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotCQljb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE5vZGVBY3Rpb25NZW51TGlzdGVuZXIoKSk7Ci0JCU1lbnUgbWVudSA9IGNvbnRleHRNZW51LmNyZWF0ZUNvbnRleHRNZW51KGdldENvbnRyb2woKSk7Ci0JCWdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotCX0KLQotCXByaXZhdGUgRHJhZ1NvdXJjZUxpc3RlbmVyIGNyZWF0ZURyYWdTb3VyY2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBEcmFnU291cmNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkcmFnRmluaXNoZWQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLnNldFNlbGVjdGlvbihudWxsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCQlMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIERyb3BUYXJnZXRMaXN0ZW5lciBjcmVhdGVEcm9wVGFyZ2V0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRHJvcFRhcmdldExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkcmFnTGVhdmUoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5vcGVyYXRpb25zICE9IERORC5EUk9QX05PTkUgJiYgTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQkJZHJhZ092ZXIoZXZlbnQpOwotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIGV2ZW50Lml0ZW0gIT0gbnVsbCAmJiBldmVudC5pdGVtLmdldERhdGEoKSAhPSBudWxsKSB7Ci0JCQkJCQkvKgotCQkJCQkJICogdGhlIGNvbW1hbmQgdXNlcyB0aGVzZSBudW1iZXJzIGluc3RlYWQgb2YgdGhlCi0JCQkJCQkgKiBmZWVkYmFjayBjb25zdGFudHMgKGV2ZW4gdGhvdWdoIGl0IGNvbnZlcnRzIGluCi0JCQkJCQkgKiB0aGUgb3RoZXIgZGlyZWN0aW9uIGFzIHdlbGwpCi0JCQkJCQkgKi8KLQkJCQkJCWZsb2F0IGZlZWRiYWNrRmxvYXQgPSBnZXRIZWlnaHRJbkl0ZW0oZXZlbnQpOwotCi0JCQkJCQlmaW5hbCBEcmFnTm9kZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBEcmFnTm9kZUNvbW1hbmQoZXZlbnQuaXRlbS5nZXREYXRhKCksIGZlZWRiYWNrRmxvYXQsIGV2ZW50Lm9wZXJhdGlvbnMsIGV2ZW50LmRldGFpbCwgc2VsZWN0aW9uLnRvTGlzdCgpLCBYTUxUYWJsZVRyZWVWaWV3ZXIudGhpcyk7Ci0JCQkJCQlpZiAoY29tbWFuZCAhPSBudWxsICYmIGNvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQkJCQkJU2FmZVJ1bm5hYmxlLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJCQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRyb3BBY2NlcHQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRyYWdPdmVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCWV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX1NFTEVDVDsKLQkJCQlmbG9hdCBmZWVkYmFja0Zsb2F0ID0gZ2V0SGVpZ2h0SW5JdGVtKGV2ZW50KTsKLQkJCQlpZiAoZmVlZGJhY2tGbG9hdCA+IDAuNzUpIHsKLQkJCQkJZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfSU5TRVJUX0FGVEVSOwotCQkJCX0KLQkJCQllbHNlIGlmIChmZWVkYmFja0Zsb2F0IDwgMC4yNSkgewotCQkJCQlldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19JTlNFUlRfQkVGT1JFOwotCQkJCX0KLQkJCQlldmVudC5mZWVkYmFjayB8PSBETkQuRkVFREJBQ0tfRVhQQU5EIHwgRE5ELkZFRURCQUNLX1NDUk9MTDsKLQkJCX0KLQotCQkJcHJpdmF0ZSBmbG9hdCBnZXRIZWlnaHRJbkl0ZW0oRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYoZXZlbnQuaXRlbSA9PSBudWxsKSByZXR1cm4gLjVmOwotCQkJCWlmIChldmVudC5pdGVtIGluc3RhbmNlb2YgVHJlZUl0ZW0pIHsKLQkJCQkJVHJlZUl0ZW0gdHJlZUl0ZW0gPSAoVHJlZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQkJCUNvbnRyb2wgY29udHJvbCA9IHRyZWVJdGVtLmdldFBhcmVudCgpOwotCQkJCQlQb2ludCBwb2ludCA9IGNvbnRyb2wudG9Db250cm9sKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0JCQkJCVJlY3RhbmdsZSBib3VuZHMgPSB0cmVlSXRlbS5nZXRCb3VuZHMoKTsKLQkJCQkJcmV0dXJuIChmbG9hdCkgKHBvaW50LnkgLSBib3VuZHMueSkgLyAoZmxvYXQpIGJvdW5kcy5oZWlnaHQ7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGV2ZW50Lml0ZW0gaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKLQkJCQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IChUYWJsZUl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQkJCUNvbnRyb2wgY29udHJvbCA9IHRhYmxlSXRlbS5nZXRQYXJlbnQoKTsKLQkJCQkJUG9pbnQgcG9pbnQgPSBjb250cm9sLnRvQ29udHJvbChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gdGFibGVJdGVtLmdldEJvdW5kcygwKTsKLQkJCQkJcmV0dXJuIChmbG9hdCkgKHBvaW50LnkgLSBib3VuZHMueSkgLyAoZmxvYXQpIGJvdW5kcy5oZWlnaHQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gMC4wRjsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRvUmVmcmVzaChPYmplY3QgbywgYm9vbGVhbiBmcm9tRGVsYXllZCkgewotCQl0cmVlRXh0ZW5zaW9uLnJlc2V0Q2FjaGVkRGF0YSgpOwotCQlzdXBlci5yZWZyZXNoKG8pOwotCX0KLQotCXB1YmxpYyBJU2VsZWN0aW9uUHJvdmlkZXIgZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBmU2VsZWN0aW9uUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRhYmxlVHJlZVZpZXdlcl8wOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURpc3Bvc2UoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmhhbmRsZURpc3Bvc2UoZXZlbnQpOwotCQl0cmVlRXh0ZW5zaW9uLmRpc3Bvc2UoKTsKLQkJc2V0RG9jdW1lbnQobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJlZUV4dGVuc2lvbi5yZXNldENhY2hlZERhdGEoKTsKLQkJc3VwZXIucmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2goT2JqZWN0IG8pIHsKLQkJdHJlZUV4dGVuc2lvbi5yZXNldENhY2hlZERhdGEoKTsKLQkJc3VwZXIucmVmcmVzaChvKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoKGJvb2xlYW4gdXBkYXRlTGFiZWxzKSB7Ci0JCXRyZWVFeHRlbnNpb24ucmVzZXRDYWNoZWREYXRhKCk7Ci0JCXN1cGVyLnJlZnJlc2godXBkYXRlTGFiZWxzKTsKLQkJZ2V0Q29udHJvbCgpLnJlZHJhdygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2goT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gdXBkYXRlTGFiZWxzKSB7Ci0JCXRyZWVFeHRlbnNpb24ucmVzZXRDYWNoZWREYXRhKCk7Ci0JCXN1cGVyLnJlZnJlc2goZWxlbWVudCwgdXBkYXRlTGFiZWxzKTsKLQkJZ2V0Q29udHJvbCgpLnJlZHJhdygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvKgotCQkgKiBsZXQgdGhlIHRleHQgZWRpdG9yIHRvIGJlIHRoZSBvbmUgdGhhdCBtYW5hZ2VzIHRoZSBtb2RlbCdzIGxpZmV0aW1lCi0JCSAqLwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0KLQkJCWlmICgobW9kZWwgIT0gbnVsbCkgJiYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSkgewotCQkJCURvY3VtZW50IGRvbURvYyA9IG51bGw7Ci0JCQkJZG9tRG9jID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCXNldElucHV0KGRvbURvYyk7Ci0JCQkJdHJlZUV4dGVuc2lvbi5zZXRJc1Vuc3VwcG9ydGVkSW5wdXQoZmFsc2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdHJlZUV4dGVuc2lvbi5zZXRJc1Vuc3VwcG9ydGVkSW5wdXQodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUcmVlRXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUcmVlRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmY2ZjNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVHJlZUV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01EZXNjcmlwdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWE1MVHJlZUV4dGVuc2lvbiBleHRlbmRzIFRyZWVFeHRlbnNpb24gewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSVUNUVVJFX1BST1BFUlRZID0gWE1MRWRpdG9yTWVzc2FnZXMuWE1MVHJlZUV4dGVuc2lvbl8wOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gWE1MRWRpdG9yTWVzc2FnZXMuWE1MVHJlZUV4dGVuc2lvbl8xOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjb250cm9sOwotCXByb3RlY3RlZCBNeUNlbGxNb2RpZmllciBtb2RpZmllcjsKLQlwcm90ZWN0ZWQgWE1MVGFibGVUcmVlUHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeSBwcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5OwotCXByb3RlY3RlZCBDTURlc2NyaXB0aW9uQnVpbGRlciBkZWNyaXB0aW9uQnVpbGRlciA9IG5ldyBDTURlc2NyaXB0aW9uQnVpbGRlcigpOwotCXByb3RlY3RlZCBUcmVlQ29udGVudEhlbHBlciB0cmVlQ29udGVudEhlbHBlciA9IG5ldyBUcmVlQ29udGVudEhlbHBlcigpOwotCi0JcHJvdGVjdGVkIENvbG9yIGYxLCBmMiwgYjEsIGIyOwotCXByb3RlY3RlZCBib29sZWFuIGNhY2hlZERhdGFJc1ZhbGlkID0gdHJ1ZTsKLQotCXB1YmxpYyBYTUxUcmVlRXh0ZW5zaW9uKFRyZWUgdHJlZSkgewotCQlzdXBlcih0cmVlKTsKLQkJY29udHJvbCA9IHRyZWU7Ci0JCW1vZGlmaWVyID0gbmV3IE15Q2VsbE1vZGlmaWVyKCk7Ci0JCXNldENlbGxNb2RpZmllcihtb2RpZmllcik7Ci0JCVN0cmluZ1tdIHByb3BlcnRpZXMgPSB7U1RSVUNUVVJFX1BST1BFUlRZLCBWQUxVRV9QUk9QRVJUWX07Ci0JCXNldENvbHVtblByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0KLQkJLyogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4NTg1MSAtIFVzZWQgdG8gYmUgaGFyZGNvZGVkIGFzIENPTE9SX0JMQUNLICovCi0JCWYxID0gdHJlZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCk7Ci0JCUNvbG9yIGJhY2tncm91bmQgPSB0cmVlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKTsKLQotCQlpbnQgciA9IE1hdGguYWJzKGJhY2tncm91bmQuZ2V0UmVkKCkgLSAxMjUpOwotCQlpbnQgZyA9IE1hdGguYWJzKGJhY2tncm91bmQuZ2V0R3JlZW4oKSAtIDg1KTsKLQkJaW50IGIgPSBNYXRoLmFicyhiYWNrZ3JvdW5kLmdldEJsdWUoKSAtIDEwNSk7Ci0KLQkJZjIgPSBuZXcgQ29sb3IodHJlZS5nZXREaXNwbGF5KCksIHIsIGcsIGIpOwotCQliMSA9IHRyZWUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTik7Ci0JCWIyID0gYmFja2dyb3VuZDsKLQotCQlwcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5ID0gbmV3IFhNTFRhYmxlVHJlZVByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWYyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldENhY2hlZERhdGEoKSB7Ci0JCWNhY2hlZERhdGFJc1ZhbGlkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcGFpbnRJdGVtcyhHQyBnYywgVHJlZUl0ZW1bXSBpdGVtcywgUmVjdGFuZ2xlIHRyZWVCb3VuZHMpIHsKLQkJc3VwZXIucGFpbnRJdGVtcyhnYywgaXRlbXMsIHRyZWVCb3VuZHMpOwotCQljYWNoZWREYXRhSXNWYWxpZCA9IHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdFtdIGNvbXB1dGVUcmVlRXh0ZW5zaW9uRGF0YShPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbG9yIGNvbG9yID0gZjE7Ci0JCVN0cmluZyBzdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCXN0cmluZyA9IChTdHJpbmcpIG1vZGlmaWVyLmdldFZhbHVlKG9iamVjdCwgVkFMVUVfUFJPUEVSVFkpOwotCQkJY29sb3IgPSBmMTsKLQkJfQotCQlpZiAoKHN0cmluZy5sZW5ndGgoKSA9PSAwKSAmJiAob2JqZWN0IGluc3RhbmNlb2YgRWxlbWVudCkpIHsKLQkJCXN0cmluZyA9IGdldEVsZW1lbnRWYWx1ZUhlbHBlcigoRWxlbWVudCkgb2JqZWN0KTsKLQkJCWNvbG9yID0gZjI7Ci0JCX0KLQkJT2JqZWN0W10gZGF0YSA9IG5ldyBPYmplY3RbMl07Ci0JCWRhdGFbMF0gPSBzdHJpbmc7Ci0JCWRhdGFbMV0gPSBjb2xvcjsKLQkJcmV0dXJuIGRhdGE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnRJdGVtKEdDIGdjLCBUcmVlSXRlbSBpdGVtLCBSZWN0YW5nbGUgYm91bmRzKSB7Ci0JCXN1cGVyLnBhaW50SXRlbShnYywgaXRlbSwgYm91bmRzKTsKLQkJT2JqZWN0W10gZGF0YSA9IGNvbXB1dGVUcmVlRXh0ZW5zaW9uRGF0YShpdGVtLmdldERhdGEoKSk7Ci0JCWlmICgoZGF0YSAhPSBudWxsKSAmJiAoZGF0YS5sZW5ndGggPT0gMikpIHsKLQkJCWdjLnNldENsaXBwaW5nKGNvbHVtblBvc2l0aW9uLCBib3VuZHMueSArIDEsIGNvbnRyb2xXaWR0aCwgYm91bmRzLmhlaWdodCk7Ci0JCQlnYy5zZXRGb3JlZ3JvdW5kKChDb2xvcikgZGF0YVsxXSk7Ci0JCQlnYy5kcmF3U3RyaW5nKChTdHJpbmcpIGRhdGFbMF0sIGNvbHVtblBvc2l0aW9uICsgNSwgYm91bmRzLnkgKyAxKTsKLQkJCWdjLnNldENsaXBwaW5nKChSZWN0YW5nbGUpIG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW1wdHlUcmVlTWVzc2FnZShHQyBnYykgewotCQkvLyBoZXJlIHdlIHByaW50IGEgbWVzc2FnZSB3aGVuIHRoZSBkb2N1bWVudCBpcyBlbXB0eSBqdXN0IHRvIGdpdmUgdGhlCi0JCS8vIHVzZXIgYSB2aXN1YWwgY3VlCi0JCS8vIHNvIHRoYXQgdGhleSBrbm93IGhvdyB0byBwcm9jZWVkIHRvIGVkaXQgdGhlIGJsYW5rIHZpZXcKLQkJZ2Muc2V0Rm9yZWdyb3VuZChmVHJlZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0JCWdjLnNldEJhY2tncm91bmQoZlRyZWUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpKTsKLQkJZ2MuZHJhd1N0cmluZyhYTUxFZGl0b3JNZXNzYWdlcy5YTUxUcmVlRXh0ZW5zaW9uXzMsIDEwLCAxMCk7Ci0JCWdjLmRyYXdTdHJpbmcoWE1MRWRpdG9yTWVzc2FnZXMuWE1MVHJlZUV4dGVuc2lvbl80LCAxMCwgMTAgKyBnYy5nZXRGb250TWV0cmljcygpLmdldEhlaWdodCgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRWYWx1ZUhlbHBlcihFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0KLQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQlpZiAoKHJlc3VsdCA9PSBudWxsKSAmJiAobXEgIT0gbnVsbCkpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbXEuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCQlpZiAoKGVkICE9IG51bGwpICYmICFCb29sZWFuLlRSVUUuZXF1YWxzKGVkLmdldFByb3BlcnR5KCJpc0luZmVycmVkIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQgPSBkZWNyaXB0aW9uQnVpbGRlci5idWlsZERlc2NyaXB0aW9uKGVkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBjbGFzcyBNeUNlbGxNb2RpZmllciBpbXBsZW1lbnRzIElDZWxsTW9kaWZpZXIsIFRyZWVFeHRlbnNpb24uSUNlbGxFZGl0b3JQcm92aWRlciB7Ci0JCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIGVsZW1lbnQ7Ci0JCQkJcmVzdWx0ID0gKHByb3BlcnR5ID09IFZBTFVFX1BST1BFUlRZKSAmJiB0cmVlQ29udGVudEhlbHBlci5pc0VkaXRhYmxlKG5vZGUpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJcmVzdWx0ID0gdHJlZUNvbnRlbnRIZWxwZXIuZ2V0Tm9kZVZhbHVlKChOb2RlKSBvYmplY3QpOwotCQkJfQotCQkJcmV0dXJuIChyZXN1bHQgIT0gbnVsbCkgPyByZXN1bHQgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgewotCQkJLy8gZW5hYmxlTm9kZVNlbGVjdGlvbkxpc3RlbmVyKGZhbHNlKTsKLQkJCUl0ZW0gaXRlbSA9IChJdGVtKSBlbGVtZW50OwotCQkJU3RyaW5nIG9sZFZhbHVlID0gdHJlZUNvbnRlbnRIZWxwZXIuZ2V0Tm9kZVZhbHVlKChOb2RlKSBpdGVtLmdldERhdGEoKSk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSB2YWx1ZS50b1N0cmluZygpOwotCQkJaWYgKChuZXdWYWx1ZSAhPSBudWxsKSAmJiAhbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCXRyZWVDb250ZW50SGVscGVyLnNldE5vZGVWYWx1ZSgoTm9kZSkgaXRlbS5nZXREYXRhKCksIHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJLy8gZW5hYmxlTm9kZVNlbGVjdGlvbkxpc3RlbmVyKHRydWUpOwotCQl9Ci0KLQkJcHVibGljIENlbGxFZGl0b3IgZ2V0Q2VsbEVkaXRvcihPYmplY3QgbywgaW50IGNvbCkgewotCQkJSVByb3BlcnR5RGVzY3JpcHRvciBwZCA9IHByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkuY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKG8pOwotCQkJcmV0dXJuIHBkICE9IG51bGwgPyBwZC5jcmVhdGVQcm9wZXJ0eUVkaXRvcihjb250cm9sKSA6IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25VSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25VSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmM2JlYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IFhNTCBWYWxpZGF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxWYWxpZGF0aW9uVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi54bWx2YWxpZGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBYTUxWYWxpZGF0aW9uVUlNZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci0KLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBYTUxWYWxpZGF0aW9uVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SRUZfRklMRV9FUlJPUl9ERVNDUklQVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkVGX0ZJTEVfRVJST1JfTUVTU0FHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkVGX0ZJTEVfRVJST1JfREVUQUlMUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfREVUQUlMU19JTkZPUk1BVElPTl9VTkFWQUlMQUJMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfREVUQUlMU19JTkZPX1JFVkFMSURBVEVfVE9fUkVHRU5FUkFURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU0FWRV9ESVJUWV9GSUxFX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NBVkVfRElSVFlfRklMRV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdFRhYmxlVmlld2VyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3RUYWJsZVZpZXdlcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0VGFibGVWaWV3ZXJfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdFRhYmxlVmlld2VyXzM7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvZXJyb3JpbmZvL0dyb3VwTmFtZVByb3BlcnR5VGVzdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvZXJyb3JpbmZvL0dyb3VwTmFtZVByb3BlcnR5VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjM2U5YmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9Hcm91cE5hbWVQcm9wZXJ0eVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuZXJyb3JpbmZvOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLlByb3BlcnR5VGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci0KLQotLyoqCi0gKiBDdXN0b20gcHJvcGVydHkgdGVzdGVyIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBncm91cE5hbWUgYXR0cmlidXRlIGlzCi0gKiBwcmVzZW50IG9uIGEgbWFya2VyIGFuZCB0aGF0IGl0cyB2YWx1ZSBzdGFydHMgd2l0aCBhIGdpdmVuIGV4cGVjdGVkIHZhbHVlLgotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBOYW1lUHJvcGVydHlUZXN0ZXIgZXh0ZW5kcyBQcm9wZXJ0eVRlc3RlcgotewotICAvKioKLSAgICogVGhlIGdyb3VwIG5hbWUgcHJlZml4IHByb3BlcnR5IG5hbWUuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfTkFNRV9QUkVGSVggPSAiZ3JvdXBOYW1lUHJlZml4IjsgLy8kTk9OLU5MUy0xJCAgCi0KLSAgLyoqCi0gICAqIFRoZSBncm91cCBuYW1lIG1hcmtlciBhdHRyaWJ1dGUuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfTkFNRSA9ICJncm91cE5hbWUiOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0W10gYXJncywgT2JqZWN0IGV4cGVjdGVkVmFsdWUpCi0gIHsKLSAgICBpZiAoR1JPVVBfTkFNRV9QUkVGSVguZXF1YWxzKHByb3BlcnR5KSkKLSAgICB7Ci0gICAgICBpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBJTWFya2VyKQotICAgICAgewotICAgICAgICBJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKXJlY2VpdmVyOwotCi0gICAgICAgIFN0cmluZyBncm91cE5hbWUgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKEdST1VQX05BTUUsIG51bGwpOwotCi0gICAgICAgIGJvb2xlYW4gdGVzdFZhbHVlID0gZ3JvdXBOYW1lICE9IG51bGwgJiYgZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZyAmJiBncm91cE5hbWUuc3RhcnRzV2l0aCgoU3RyaW5nKWV4cGVjdGVkVmFsdWUpOwotICAgICAgICByZXR1cm4gdGVzdFZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9SZWZlcmVuY2VkRmlsZUVycm9yRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvZXJyb3JpbmZvL1JlZmVyZW5jZWRGaWxlRXJyb3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNjOWYyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvZXJyb3JpbmZvL1JlZmVyZW5jZWRGaWxlRXJyb3JEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuZXJyb3JpbmZvOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZU1vdmVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5YTUxWYWxpZGF0aW9uVUlNZXNzYWdlczsKLQotCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlZEZpbGVFcnJvckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIFRhc2tMaXN0VGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0JcHJvdGVjdGVkIExpc3QgZXJyb3JMaXN0OwotCXByb3RlY3RlZCBTdHJpbmcgbWFya2VkVXBEZXRhaWxzTWVzc2FnZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnRleHRGaWxlOwotCXByb3RlY3RlZCBTdHJpbmcgcmVmZXJlbmNlZEZpbGU7Ci0JcHJvdGVjdGVkIFN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQlwcm90ZWN0ZWQgVGV4dCBmdWxsRmlsZU5hbWVGaWVsZDsKLQotCXB1YmxpYyBSZWZlcmVuY2VkRmlsZUVycm9yRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBMaXN0IGVycm9yTGlzdCwgU3RyaW5nIGNvbnRleHRGaWxlLCBTdHJpbmcgcmVmZXJlbmNlZEZpbGUpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCi0JCWludCBzdHlsZUJpdHMgPSBnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFOwotCQlzdHlsZUJpdHMgJj0gflNXVC5BUFBMSUNBVElPTl9NT0RBTDsKLQotCQlzZXRTaGVsbFN0eWxlKHN0eWxlQml0cyk7Ci0JCXRoaXMuZXJyb3JMaXN0ID0gZXJyb3JMaXN0OwotCi0JCXRoaXMucmVmZXJlbmNlZEZpbGUgPSByZWZlcmVuY2VkRmlsZTsKLQkJdGhpcy5jb250ZXh0RmlsZSA9IGNvbnRleHRGaWxlOwotCQl0aGlzLm1hcmtlZFVwRGV0YWlsc01lc3NhZ2UgPSBnZXRNYXJrZWRVcERldGFpbHNNZXNzYWdlKCk7Ci0JfQotCi0JcHVibGljIGludCBjcmVhdGVBbmRPcGVuKCkgewotCQljcmVhdGUoKTsKLQkJZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTFZhbGlkYXRpb25VSU1lc3NhZ2VzLl9VSV9SRUZfRklMRV9FUlJPUl9ERVRBSUxTKTsKLQotCQlzZXRCbG9ja09uT3BlbihmYWxzZSk7Ci0JCXJldHVybiBvcGVuKCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJZnVsbEZpbGVOYW1lRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZnVsbEZpbGVOYW1lRmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWZ1bGxGaWxlTmFtZUZpZWxkLnNldEJhY2tncm91bmQocGFyZW50LmdldEJhY2tncm91bmQoKSk7Ci0JCWZ1bGxGaWxlTmFtZUZpZWxkLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotCQlzdXBlci5jcmVhdGVCdXR0b25CYXIoY29tcG9zaXRlKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJZGlhbG9nQXJlYS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJYy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWMuc2V0TGF5b3V0RGF0YShjcmVhdGVHcmlkRGF0YSh0cnVlLCAtMSwgMjAwKSk7Ci0KLQkJc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KGMsIFNXVC5NVUxUSSB8IFNXVC5XUkFQKTsKLQkJc3R5bGVkVGV4dC5zZXRCYWNrZ3JvdW5kKGMuZ2V0QmFja2dyb3VuZCgpKTsKLQkJc2V0U3R5bGVkVGV4dChzdHlsZWRUZXh0LCBtYXJrZWRVcERldGFpbHNNZXNzYWdlKTsKLQkJc3R5bGVkVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCXN0eWxlZFRleHQuc2V0TGF5b3V0RGF0YShjcmVhdGVHcmlkRGF0YShmYWxzZSwgNjUwLCAtMSkpOwotCi0JCU1vdXNlTGlzdGVuZXIgbW91c2VMaXN0ZW5lciA9IG5ldyBNb3VzZUxpc3RlbmVyKCk7Ci0JCXN0eWxlZFRleHQuYWRkTW91c2VNb3ZlTGlzdGVuZXIobW91c2VMaXN0ZW5lcik7Ci0KLQkJdGFibGVWaWV3ZXIgPSBuZXcgVGFza0xpc3RUYWJsZVZpZXdlcihjLCAxMCk7Ci0JCXRhYmxlVmlld2VyLnNldElucHV0KGVycm9yTGlzdCk7Ci0JCXRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSW50ZXJuYWxTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJdGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoY3JlYXRlR3JpZERhdGEodHJ1ZSwgNzAwLCAtMSkpOwotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQl9Ci0KLQlTdHJpbmcgZ2V0RnVsbFVSSShpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyB1cmkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgaW5kZXggPSBnZXRJbmRleChvZmZzZXQpOwotCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCWlmICgoaW5kZXggPT0gMCkgfHwgKGluZGV4ID09IDIpIHx8IChpbmRleCA9PSAzKSkgewotCQkJCXVyaSA9IHJlZmVyZW5jZWRGaWxlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdXJpID0gY29udGV4dEZpbGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRJbmRleChpbnQgb2Zmc2V0KSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJU3R5bGVSYW5nZVtdIHJhbmdlID0gc3R5bGVkVGV4dC5nZXRTdHlsZVJhbmdlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJhbmdlLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgbCA9IHJhbmdlW2ldLnN0YXJ0OwotCQkJaW50IHIgPSBsICsgcmFuZ2VbaV0ubGVuZ3RoOwotCQkJaWYgKChsIDw9IG9mZnNldCkgJiYgKHIgPj0gb2Zmc2V0KSkgewotCQkJCXJlc3VsdCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQljbGFzcyBNb3VzZUxpc3RlbmVyIGltcGxlbWVudHMgTW91c2VNb3ZlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBldmVudCkgewotCQkJU3RyaW5nIHRvb2xUaXBUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0KLQkJCQlpbnQgb2Zmc2V0ID0gc3R5bGVkVGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0JCQkJdG9vbFRpcFRleHQgPSBnZXRGdWxsVVJJKG9mZnNldCk7Ci0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIERvIG5vdGhpbmcuCi0JCQl9Ci0JCQlzdHlsZWRUZXh0LnNldFRvb2xUaXBUZXh0KHRvb2xUaXBUZXh0KTsKLQkJCWlmICgodG9vbFRpcFRleHQgIT0gbnVsbCkgJiYgKHRvb2xUaXBUZXh0Lmxlbmd0aCgpID4gMCkpIHsKLQkJCQlmdWxsRmlsZU5hbWVGaWVsZC5zZXRUZXh0KHRvb2xUaXBUZXh0KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE1hcmtlZFVwRGV0YWlsc01lc3NhZ2UoKSB7Ci0JCVN0cmluZyBkZXRhaWxzTWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vIFRPRE8uLi4gbmVlZCB0byBtb3ZlICdfVUlfUkVGX0ZJTEVfRVJST1JfREVTQ1JJUFRJT04nIHRvIHRoaXMKLQkJLy8gcGx1Z2luJ3MgcHJvcGVydGllcyBmaWxlCi0JCS8vCQkJCi0JCVN0cmluZyBzdHJpbmcgPSBYTUxWYWxpZGF0aW9uVUlNZXNzYWdlcy5fVUlfUkVGX0ZJTEVfRVJST1JfREVTQ1JJUFRJT047Ci0JCS8vIFRPRE8uLi4gbmVlZCB0byBlZGl0IHRoZSBwcm9wZXJ0aWVzIGZpbGUgdG8gcmVtb3ZlICInIiBjaGFyYWN0ZXJzCi0JCS8vIGZyb20gdGhlIHN0cmluZwotCQkvLyBJJ20gdXNpbmcgdGhlc2UgY2hhcmFjdGVycyB0byBtYXJrdXAgdGhlIGJvbGQgZm9udC4gSXQncyBzYWZlciBpZiBJCi0JCS8vIGFkZCB0aGVzZSBwcm9ncmFtdGljYWxseS4KLQkJLy8KLQkJc3RyaW5nID0gcmVtb3ZlUGF0dGVybihzdHJpbmcsICInIik7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgYyA9ICInIiArIGdldExhc3RTZWdtZW50KGNvbnRleHRGaWxlKSArICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN0cmluZyByID0gIiciICsgZ2V0TGFzdFNlZ21lbnQocmVmZXJlbmNlZEZpbGUpICsgIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlkZXRhaWxzTWVzc2FnZSA9IE5MUy5iaW5kKHN0cmluZywgbmV3IE9iamVjdFtde3IsIGMsIHIsIGN9KTsKLQkJcmV0dXJuIGRldGFpbHNNZXNzYWdlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHJlbW92ZVBhdHRlcm4oU3RyaW5nIHN0cmluZywgU3RyaW5nIHBhdHRlcm4pIHsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWludCBpbmRleCA9IHN0cmluZy5pbmRleE9mKHBhdHRlcm4pOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCkgKyBzdHJpbmcuc3Vic3RyaW5nKGluZGV4ICsgcGF0dGVybi5sZW5ndGgoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RyaW5nOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTdHlsZWRUZXh0KFN0eWxlZFRleHQgc3R5bGVkVGV4dCwgU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nIHZpc2libGVNZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG1hcmtlZFVwRGV0YWlsc01lc3NhZ2UsICInIiwgZmFsc2UpOyBzdC5oYXNNb3JlVG9rZW5zKCk7KSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCVN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpOwotCQkJdmlzaWJsZU1lc3NhZ2UgKz0gdG9rZW47Ci0JCX0KLQotCQlzdHlsZWRUZXh0LnNldFRleHQodmlzaWJsZU1lc3NhZ2UpOwotCQkvLyBkdyBGb250IGZvbnQgPSBzdHlsZWRUZXh0LmdldEZvbnQoKTsKLQotCQlib29sZWFuIGluUXVvdGUgPSBmYWxzZTsKLQkJaW50IHBvc2l0aW9uID0gMDsKLQkJZm9yIChTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG1hcmtlZFVwRGV0YWlsc01lc3NhZ2UsICInIiwgdHJ1ZSk7IHN0Lmhhc01vcmVUb2tlbnMoKTspIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJU3RyaW5nIHRva2VuID0gc3QubmV4dFRva2VuKCk7Ci0KLQkJCWlmICh0b2tlbi5lcXVhbHMoIiciKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCWluUXVvdGUgPSAhaW5RdW90ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChpblF1b3RlKSB7Ci0JCQkJCXRyeSB7Ci0KLQkJCQkJCVN0eWxlUmFuZ2Ugc3R5bGUgPSBuZXcgU3R5bGVSYW5nZShwb3NpdGlvbiwgdG9rZW4ubGVuZ3RoKCksIHN0eWxlZFRleHQuZ2V0Rm9yZWdyb3VuZCgpLCBzdHlsZWRUZXh0LmdldEJhY2tncm91bmQoKSwgU1dULkJPTEQpOwotCQkJCQkJc3R5bGVkVGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcG9zaXRpb24gPSBwb3NpdGlvbiArIHRva2VuLmxlbmd0aCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgR3JpZERhdGEgY3JlYXRlR3JpZERhdGEoYm9vbGVhbiBmaWxsQm90aCwgaW50IHcsIGludCBoKSB7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKGZpbGxCb3RoID8gR3JpZERhdGEuRklMTF9CT1RIIDogR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2Qud2lkdGhIaW50ID0gdzsKLQkJZ2QuaGVpZ2h0SGludCA9IGg7Ci0JCXJldHVybiBnZDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TGFzdFNlZ21lbnQoU3RyaW5nIHVyaSkgewotCQlTdHJpbmcgcmVzdWx0ID0gdXJpOwotCQlpbnQgaW5kZXggPSBNYXRoLm1heCh1cmkubGFzdEluZGV4T2YoIi8iKSwgdXJpLmxhc3RJbmRleE9mKCJcXCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmIChpbmRleCAhPSAtMSkgewotCQkJcmVzdWx0ID0gdXJpLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEludGVybmFsU2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCVZhbGlkYXRpb25NZXNzYWdlIHZhbGlkYXRpb25NZXNzYWdlID0gKFZhbGlkYXRpb25NZXNzYWdlKSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKHZhbGlkYXRpb25NZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHVyaXN0cmluZyA9IHZhbGlkYXRpb25NZXNzYWdlLmdldFVyaSgpOwotCQkJCQlSZWZlcmVuY2VkRmlsZUVycm9yVXRpbGl0eS5vcGVuRWRpdG9yQW5kR290b0Vycm9yKHVyaXN0cmluZywgdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0TGluZU51bWJlcigpLCB2YWxpZGF0aW9uTWVzc2FnZS5nZXRDb2x1bW5OdW1iZXIoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9SZWZlcmVuY2VkRmlsZUVycm9yVXRpbGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9SZWZlcmVuY2VkRmlsZUVycm9yVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzhlZTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9lcnJvcmluZm8vUmVmZXJlbmNlZEZpbGVFcnJvclV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuZXJyb3JpbmZvOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUubG9nZ2luZy5Mb2dnZXJGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VkRmlsZUVycm9yVXRpbGl0eSB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5FZGl0b3JBbmRHb3RvRXJyb3IoU3RyaW5nIHVyaXN0cmluZywgZmluYWwgaW50IGxpbmUsIGZpbmFsIGludCBjb2x1bW4pIHsKLQkJaWYgKHVyaXN0cmluZyAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVVSTCB1cmkgPSBuZXcgVVJMKHVyaXN0cmluZyk7Ci0JCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJCWlmICgiZmlsZSIuZXF1YWxzKHVyaS5nZXRQcm90b2NvbCgpKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl7Ci0JCQkJCQlTdHJpbmcgcGF0aFN0cmluZyA9IHVyaS5nZXRQYXRoKCk7Ci0JCQkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgocGF0aFN0cmluZyk7Ci0JCQkJCQlTdHJpbmcgZGV2aWNlID0gcGF0aC5nZXREZXZpY2UoKTsKLQkJCQkJCWlmICgoZGV2aWNlICE9IG51bGwpICYmIGRldmljZS5zdGFydHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXsKLQkJCQkJCQlwYXRoID0gcGF0aC5zZXREZXZpY2UoZGV2aWNlLnN1YnN0cmluZygxKSk7Ci0JCQkJCQl9Ci0JCQkJCQlmaW5hbCBJRmlsZSBpRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQkJCQkJaWYgKChpRmlsZSAhPSBudWxsKSAmJiBpRmlsZS5leGlzdHMoKSkgewotCQkJCQkJCS8vIE9wZW4gdGhlIGVkaXRvciBmb3IgdGhpcyBmaWxlLgotCQkJCQkJCWZpbmFsIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJCQkJCQlmaW5hbCBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQotCQkJCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gaUZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkuZ2V0Q29udGVudFR5cGUoKTsKLQkJCQkJCQkJCQlJRWRpdG9yUmVnaXN0cnkgZWRpdG9yUmVnaXN0cnkgPSB3b3JrYmVuY2guZ2V0RWRpdG9yUmVnaXN0cnkoKTsKLQkJCQkJCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBpRmlsZS5nZXROYW1lKCk7Ci0JCQkJCQkJCQkJSUVkaXRvckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGVkaXRvclJlZ2lzdHJ5LmdldERlZmF1bHRFZGl0b3IoZmlsZU5hbWUsIGNvbnRlbnRUeXBlKTsKLQkJCQkJCQkJCQlTdHJpbmcgZWRpdG9ySWQ7Ci0JCQkJCQkJCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQkJCQkJCQllZGl0b3JJZCA9IGRlc2NyaXB0b3IuZ2V0SWQoKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkJCWRlc2NyaXB0b3IgPSBlZGl0b3JSZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKGZpbGVOYW1lICsgIi50eHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQllZGl0b3JJZCA9IGRlc2NyaXB0b3IuZ2V0SWQoKTsgCi0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCQotCQkJCQkJCQkJCWlmIChlZGl0b3JJZCAhPSBudWxsKQotCQkJCQkJCQkJCXsKLQkJCQkJCQkJCQkgIEZpbGVFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG5ldyBGaWxlRWRpdG9ySW5wdXQoaUZpbGUpOwotCQkJCQkJCQkJCSAgSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCQkJCQkJICBhY3RpdmVQYWdlLm9wZW5FZGl0b3IoZWRpdG9ySW5wdXQsIGVkaXRvcklkKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCQkJTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXJJbnN0YW5jZSgpLmxvZ0Vycm9yKCJFeGNlcHRpb24gZW5jb3VudGVyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIG9wZW4gZmlsZTogIiArIGlGaWxlICsgIlxuXG4iLCBleCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfSk7Ci0KLQkJCQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJCQkJCQlnb3RvRXJyb3IoZWRpdG9yUGFydCwgbGluZSwgY29sdW1uKTsKLQkJCQkJCQkJfQotCQkJCQkJCX07Ci0JCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIERvIG5vdGhpbmcuCi0JCQl9Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgdm9pZCBnb3RvRXJyb3IoSUVkaXRvclBhcnQgZWRpdG9yUGFydCwgaW50IGxpbmUsIGludCBjb2x1bW4pIHsKLQkJaWYgKGVkaXRvclBhcnQgIT0gbnVsbCkgewotCQkJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKFRleHRFZGl0b3IpIGVkaXRvclBhcnQuZ2V0QWRhcHRlcihUZXh0RWRpdG9yLmNsYXNzKTsKLQkJCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlJRG9jdW1lbnRQcm92aWRlciBkcCA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSAoZHAgIT0gbnVsbCkgPyBkcC5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpIDogbnVsbDsKLQkJCQkJdGV4dEVkaXRvci5zZWxlY3RBbmRSZXZlYWwoZG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lIC0gMSkgKyBjb2x1bW4gLSAxLCAwKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQkJLy8gbWFya2VyIHJlZmVycyB0byBpbnZhbGlkIHRleHQgcG9zaXRpb24gLT4gZG8gbm90aGluZwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9lcnJvcmluZm8vUmVmZXJlbmNlZEZpbGVFcnJvcnNIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvZXJyb3JpbmZvL1JlZmVyZW5jZWRGaWxlRXJyb3JzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGI2MjQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9lcnJvcmluZm8vUmVmZXJlbmNlZEZpbGVFcnJvcnNIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuZXJyb3JpbmZvOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuTWFya2VyVmlld0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uWE1MVmFsaWRhdGlvblVJTWVzc2FnZXM7Ci0KLQotLyoqCi0gKiBIYW5kbGVyIGZvciB0aGUgcmVmZXJlbmNlZCBmaWxlIGVycm9ycyBjb21tYW5kLiBUaGlzIGNsYXNzIHJlcGxhY2VzIHRoZSBvbGQKLSAqIFJlZmVyZW5jZWRGaWxlRXJyb3JBY3Rpb25EZWxlZ2F0ZS4KLSAqLwotcHVibGljIGNsYXNzIFJlZmVyZW5jZWRGaWxlRXJyb3JzSGFuZGxlciBleHRlbmRzIE1hcmtlclZpZXdIYW5kbGVyCi17Ci0gIHB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgZmluYWwgSU1hcmtlcltdIHNlbGVjdGVkTWFya2VycyA9IGdldFNlbGVjdGVkTWFya2VycyhldmVudCk7Ci0KLSAgICBJTWFya2VyIHNlbGVjdGVkTWFya2VyID0gc2VsZWN0ZWRNYXJrZXJzWzBdOwotCi0gICAgaWYgKHNlbGVjdGVkTWFya2VyICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0KLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gc2VsZWN0ZWRNYXJrZXIuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgTWFwIG1hcCA9IChNYXApcmVzb3VyY2UuZ2V0U2Vzc2lvblByb3BlcnR5KFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SX01FU1NBR0VfTUFQX1FVQUxJRklFRF9OQU1FKTsKLSAgICAgICAgaWYgKG1hcCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGluZm9VbmF2YWlsYWJsZSA9IFhNTFZhbGlkYXRpb25VSU1lc3NhZ2VzLl9VSV9ERVRBSUxTX0lORk9STUFUSU9OX1VOQVZBSUxBQkxFOwotICAgICAgICAgIFN0cmluZyByZXZhbGlkYXRlVG9SZWdlbmVyYXRlRXJyb3JzID0gWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMuX1VJX0RFVEFJTFNfSU5GT19SRVZBTElEQVRFX1RPX1JFR0VORVJBVEU7Ci0gICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgaW5mb1VuYXZhaWxhYmxlLCByZXZhbGlkYXRlVG9SZWdlbmVyYXRlRXJyb3JzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgdXJpID0gbnVsbDsKLQotICAgICAgICAgIFN0cmluZyBncm91cE5hbWUgPSAoU3RyaW5nKXNlbGVjdGVkTWFya2VyLmdldEF0dHJpYnV0ZSgiZ3JvdXBOYW1lIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAoZ3JvdXBOYW1lLnN0YXJ0c1dpdGgoInJlZmVyZW5jZWRGaWxlRXJyb3IiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBpbmRleDEgPSBncm91cE5hbWUuaW5kZXhPZigiKCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpbnQgaW5kZXgyID0gZ3JvdXBOYW1lLmxhc3RJbmRleE9mKCIpIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmICgoaW5kZXgxICE9IC0xKSAmJiAoaW5kZXgyID4gaW5kZXgxKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdXJpID0gZ3JvdXBOYW1lLnN1YnN0cmluZyhpbmRleDEgKyAxLCBpbmRleDIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0IGxpc3QgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCi0gICAgICAgICAgICBWYWxpZGF0aW9uTWVzc2FnZSBtZXNzYWdlID0gKFZhbGlkYXRpb25NZXNzYWdlKW1hcC5nZXQodXJpKTsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGxpc3QgPSBtZXNzYWdlLmdldE5lc3RlZE1lc3NhZ2VzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIElQYXRoIHJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZS5nZXRMb2NhdGlvbigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocmVzb3VyY2VMb2NhdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgdmFsaWRhdGVkRmlsZVVSSSA9IHJlc291cmNlTG9jYXRpb24udG9PU1N0cmluZygpOwotICAgICAgICAgICAgICB2YWxpZGF0ZWRGaWxlVVJJID0gImZpbGU6LyIgKyB2YWxpZGF0ZWRGaWxlVVJJOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgICAgUmVmZXJlbmNlZEZpbGVFcnJvckRpYWxvZyBkaWFsb2cgPSBuZXcgUmVmZXJlbmNlZEZpbGVFcnJvckRpYWxvZygKLSAgICAgICAgICAgICAgICBIYW5kbGVyVXRpbC5nZXRBY3RpdmVTaGVsbChldmVudCksCi0gICAgICAgICAgICAgICAgbGlzdCwKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZWRGaWxlVVJJLAotICAgICAgICAgICAgICAgIHVyaSk7Ci0gICAgICAgICAgICAgIGRpYWxvZy5jcmVhdGVBbmRPcGVuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBEbyBub3RoaW5nLgotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0aGlzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9UYXNrTGlzdFRhYmxlVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvZXJyb3JpbmZvL1Rhc2tMaXN0VGFibGVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzZWRmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvZXJyb3JpbmZvL1Rhc2tMaXN0VGFibGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuZXJyb3JpbmZvOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5YTUxWYWxpZGF0aW9uVUlNZXNzYWdlczsKLQotCi0KLXB1YmxpYyBjbGFzcyBUYXNrTGlzdFRhYmxlVmlld2VyIGV4dGVuZHMgVGFibGVWaWV3ZXIgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9JQ09OID0gMDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fREVTQ1JJUFRJT04gPSAxOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9SRVNPVVJDRSA9IDM7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0xPQ0FUSU9OID0gMjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX0lDT04gPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX0RFU0NSSVBUSU9OID0gWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMuVGFza0xpc3RUYWJsZVZpZXdlcl8wOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX1JFU09VUkNFID0gWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMuVGFza0xpc3RUYWJsZVZpZXdlcl8xOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX0xPQ0FUSU9OID0gWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMuVGFza0xpc3RUYWJsZVZpZXdlcl8yOwotCi0JcHJvdGVjdGVkIGludCB2aXNpYmxlUm93cyA9IC0xOwotCi0JcHJvdGVjdGVkIGludCBnZXRDb2x1bW5XaWR0aChpbnQgY29sdW1uKSB7Ci0JCWludCByZXN1bHQgPSAwOwotCQlzd2l0Y2ggKGNvbHVtbikgewotCQkJY2FzZSBDT0xVTU5fSUNPTiA6IHsKLQkJCQlyZXN1bHQgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBDT0xVTU5fREVTQ1JJUFRJT04gOiB7Ci0JCQkJcmVzdWx0ID0gMjA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIENPTFVNTl9SRVNPVVJDRSA6IHsKLQkJCQlyZXN1bHQgPSAzOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBDT0xVTU5fTE9DQVRJT04gOiB7Ci0JCQkJcmVzdWx0ID0gMzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBUYXNrTGlzdFRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCB2aXNpYmxlUm93cykgewotCQl0aGlzKHBhcmVudCwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiwgdmlzaWJsZVJvd3MpOwotCX0KLQotCXB1YmxpYyBUYXNrTGlzdFRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgaW50IHZpc2libGVSb3dzKSB7Ci0JCXN1cGVyKG5ldyBUYWJsZShwYXJlbnQsIHN0eWxlKSk7Ci0JCWdldFRhYmxlKCkuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0JCVByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IFByb3ZpZGVyKCk7Ci0JCXNldENvbnRlbnRQcm92aWRlcihwcm92aWRlcik7Ci0JCXNldExhYmVsUHJvdmlkZXIocHJvdmlkZXIpOwotCi0JCVN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXNBcnJheSA9IHtMQUJFTF9JQ09OLCBMQUJFTF9ERVNDUklQVElPTiwgTEFCRUxfTE9DQVRJT059OwotCQlzZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXNBcnJheSk7Ci0KLQkJVGFibGUgdGFibGUgPSBnZXRUYWJsZSgpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtblByb3BlcnRpZXNBcnJheS5sZW5ndGg7IGkrKykgewotCQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBpKTsKLQkJCWNvbHVtbi5zZXRUZXh0KGNvbHVtblByb3BlcnRpZXNBcnJheVtpXSk7Ci0JCQljb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQkJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKGdldENvbHVtbldpZHRoKGkpLCB0cnVlKSk7Ci0JCX0KLQotCQl0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQl0aGlzLnZpc2libGVSb3dzID0gdmlzaWJsZVJvd3M7Ci0JfQotCi0JLyoqCi0JICogTmFtZXNwYWNlSW5mb1RhYmxlTGFiZWxQcm92aWRlcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyLCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCVZpZXdlciB2aWV3ZXI7Ci0JCUltYWdlIGVycm9ySW1hZ2U7Ci0JCUltYWdlIHdhcm5JbWFnZTsKLQotCQlwdWJsaWMgUHJvdmlkZXIoKSB7Ci0JCQllcnJvckltYWdlID0gWE1MVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0VSUk9SX1RTSyk7Ci0KLQkJCXdhcm5JbWFnZSA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19XQVJOX1RTSyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCXRoaXMudmlld2VyID0gdmlld2VyOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCUxpc3QgbGlzdCA9IChMaXN0KSB2aWV3ZXIuZ2V0SW5wdXQoKTsKLQkJCXJldHVybiBsaXN0ICE9IG51bGwgPyBsaXN0LnRvQXJyYXkoKSA6IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlWYWxpZGF0aW9uTWVzc2FnZSB2YWxpZGF0aW9uTWVzc2FnZSA9IChWYWxpZGF0aW9uTWVzc2FnZSkgb2JqZWN0OwotCQkJSW1hZ2UgcmVzdWx0ID0gbnVsbDsKLQkJCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQkJaW50IHNldmVyaXR5ID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKTsKLQkJCQlpZiAoKHNldmVyaXR5ID09IElNZXNzYWdlLkhJR0hfU0VWRVJJVFkpIHx8IChzZXZlcml0eSA9PSBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFkpKSB7Ci0JCQkJCXJlc3VsdCA9IGVycm9ySW1hZ2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSB3YXJuSW1hZ2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uKSB7Ci0JCQlWYWxpZGF0aW9uTWVzc2FnZSBlcnJvck1lc3NhZ2UgPSAoVmFsaWRhdGlvbk1lc3NhZ2UpIG9iamVjdDsKLQkJCVN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJc3dpdGNoIChjb2x1bW4pIHsKLQkJCQljYXNlIENPTFVNTl9ERVNDUklQVElPTiA6IHsKLQkJCQkJcmVzdWx0ID0gZXJyb3JNZXNzYWdlLmdldE1lc3NhZ2UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgQ09MVU1OX0xPQ0FUSU9OIDogewotCQkJCQlyZXN1bHQgPSBYTUxWYWxpZGF0aW9uVUlNZXNzYWdlcy5UYXNrTGlzdFRhYmxlVmlld2VyXzMgKyBlcnJvck1lc3NhZ2UuZ2V0TGluZU51bWJlcigpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi94bWx2YWxpZGF0aW9uLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL3htbHZhbGlkYXRpb24ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1Yzg0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL3htbHZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIyBDb25zdGFudHMgZm9yIHN0cmluZ3MgIAotCi0jCi0jIFJlZmVyZW5jZWQgRmlsZSBEaWFsb2cgUmVsYXRlZCBNZXNzYWdlCi0jCi1fVUlfUkVGX0ZJTEVfRVJST1JfREVTQ1JJUFRJT04gICAgICA9IFRoZSBlcnJvcnMgYmVsb3cgd2VyZSBkZXRlY3RlZCB3aGVuIHZhbGlkYXRpbmcgdGhlIGZpbGUgInswfSIgdmlhIHRoZSBmaWxlICJ7MX0iLiAgSW4gbW9zdCBjYXNlcyB0aGVzZSBlcnJvcnMgY2FuIGJlIGRldGVjdGVkIGJ5IHZhbGlkYXRpbmcgInsyfSIgZGlyZWN0bHkuICBIb3dldmVyIGl0IGlzIHBvc3NpYmxlIHRoYXQgZXJyb3JzIHdpbGwgb25seSBvY2N1ciB3aGVuIHsyfSBpcyB2YWxpZGF0ZWQgaW4gdGhlIGNvbnRleHQgb2YgezN9LgotX1VJX1JFRl9GSUxFX0VSUk9SX01FU1NBR0UgICAgICAgICAgPSBSZWZlcmVuY2VkIGZpbGUgY29udGFpbnMgZXJyb3JzICh7MH0pLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJpZ2h0IGNsaWNrIG9uIHRoZSBtZXNzYWdlIGFuZCBzZWxlY3QgIlNob3cgRGV0YWlscy4uLiIKLV9VSV9SRUZfRklMRV9FUlJPUl9ERVRBSUxTICAgICAgICAgID0gUmVmZXJlbmNlZCBGaWxlIEVycm9yIERldGFpbHMKLQotX1VJX0RFVEFJTFNfSU5GT1JNQVRJT05fVU5BVkFJTEFCTEUgICAgICAgPSBEZXRhaWxzIEluZm9ybWF0aW9uIFVuYXZhaWxhYmxlCi1fVUlfREVUQUlMU19JTkZPX1JFVkFMSURBVEVfVE9fUkVHRU5FUkFURSA9IERldGFpbHMgaW5mb3JtYXRpb24gY3VycmVudGx5IHVuYXZhaWxhYmxlLiAgUGxlYXNlIHJldmFsaWRhdGUgdGhlIGZpbGUgdG8gcmVnZW5lcmF0ZSB0aGUgZXJyb3IgZGV0YWlscy4KLQotIwotIyBEaXJ0eSBGaWxlIERpYWxvZyBSZWxhdGVkIE1lc3NhZ2VzCi0jCi1UYXNrTGlzdFRhYmxlVmlld2VyXzA9RGVzY3JpcHRpb24KLVRhc2tMaXN0VGFibGVWaWV3ZXJfMT1SZXNvdXJjZQotVGFza0xpc3RUYWJsZVZpZXdlcl8yPUxvY2F0aW9uCi1UYXNrTGlzdFRhYmxlVmlld2VyXzM9bGluZSAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9FeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkODA5YzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9FeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSU92ZXJ3cml0ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLkltcG9ydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5aaXBGaWxlU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbiBpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0KLQlwcml2YXRlIElSZXNvdXJjZSBlbGVtZW50VG9PcGVuOwotCi0JcHJpdmF0ZSBJT3ZlcndyaXRlUXVlcnkgb3ZlcndyaXRlUXVlcnk7Ci0KLQlwcml2YXRlIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlW10gcGFnZXM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBFeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uKEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlW10gbXlQYWdlcywgSU92ZXJ3cml0ZVF1ZXJ5IG15T3ZlcndyaXRlUXVlcnkpIHsKLQkJZWxlbWVudFRvT3BlbiA9IG51bGw7Ci0JCXBhZ2VzID0gbXlQYWdlczsKLQkJb3ZlcndyaXRlUXVlcnkgPSBteU92ZXJ3cml0ZVF1ZXJ5OwotCX0KLQotCXByaXZhdGUgSVByb2plY3QgY29uZmlnTmV3UHJvamVjdChJV29ya3NwYWNlUm9vdCByb290LCBTdHJpbmcgbmFtZSwgU3RyaW5nW10gbmF0dXJlSWRzLCBJUHJvamVjdFtdIHJlZmVyZW5jZWRQcm9qZWN0cywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KG5hbWUpOwotCQkJaWYgKCFwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJcHJvamVjdC5jcmVhdGUobnVsbCk7Ci0JCQl9Ci0JCQlpZiAoIXByb2plY3QuaXNPcGVuKCkpIHsKLQkJCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCQl9Ci0JCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCQlkZXNjLnNldExvY2F0aW9uKG51bGwpOwotCQkJZGVzYy5zZXROYXR1cmVJZHMobmF0dXJlSWRzKTsKLQkJCWRlc2Muc2V0UmVmZXJlbmNlZFByb2plY3RzKHJlZmVyZW5jZWRQcm9qZWN0cyk7Ci0KLQkJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzYywgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0KLQkJCXJldHVybiBwcm9qZWN0OwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3QoSVdvcmtzcGFjZVJvb3Qgcm9vdCwgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UgcGFnZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZGVzYyA9IHBhZ2UuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKTsKLQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBpbXBvcnRzID0gZGVzYy5nZXRDaGlsZHJlbigiaW1wb3J0Iik7IC8vJE5PTi1OTFMtMSQKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gbmF0dXJlcyA9IGRlc2MuZ2V0Q2hpbGRyZW4oIm5hdHVyZSIpOyAvLyROT04tTkxTLTEkCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHJlZmVyZW5jZXMgPSBkZXNjLmdldENoaWxkcmVuKCJyZWZlcmVuY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IG5JbXBvcnRzID0gKGltcG9ydHMgPT0gbnVsbCkgPyAwIDogaW1wb3J0cy5sZW5ndGg7Ci0JCWludCBuTmF0dXJlcyA9IChuYXR1cmVzID09IG51bGwpID8gMCA6IG5hdHVyZXMubGVuZ3RoOwotCQlpbnQgblJlZmVyZW5jZXMgPSAocmVmZXJlbmNlcyA9PSBudWxsKSA/IDAgOiByZWZlcmVuY2VzLmxlbmd0aDsKLQotCQltb25pdG9yLmJlZ2luVGFzayhYTUxXaXphcmRzTWVzc2FnZXMuRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbl9vcF9kZXNjX3Byb2osIG5JbXBvcnRzICsgMSk7Ci0KLQkJU3RyaW5nIG5hbWUgPSBwYWdlLmdldFByb2plY3ROYW1lKCk7Ci0KLQkJU3RyaW5nW10gbmF0dXJlSWRzID0gbmV3IFN0cmluZ1tuTmF0dXJlc107Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbk5hdHVyZXM7IGkrKykgewotCQkJbmF0dXJlSWRzW2ldID0gbmF0dXJlc1tpXS5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJUHJvamVjdFtdIHJlZmVyZW5jZWRQcm9qZWN0cyA9IG5ldyBJUHJvamVjdFtuUmVmZXJlbmNlc107Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgblJlZmVyZW5jZXM7IGkrKykgewotCQkJcmVmZXJlbmNlZFByb2plY3RzW2ldID0gcm9vdC5nZXRQcm9qZWN0KHJlZmVyZW5jZXNbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJSVByb2plY3QgcHJvaiA9IGNvbmZpZ05ld1Byb2plY3Qocm9vdCwgbmFtZSwgbmF0dXJlSWRzLCByZWZlcmVuY2VkUHJvamVjdHMsIG1vbml0b3IpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkltcG9ydHM7IGkrKykgewotCQkJZG9JbXBvcnRzKHByb2osIGltcG9ydHNbaV0sIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQl9Ci0KLQkJU3RyaW5nIG9wZW4gPSBkZXNjLmdldEF0dHJpYnV0ZSgib3BlbiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICgob3BlbiAhPSBudWxsKSAmJiAob3Blbi5sZW5ndGgoKSA+IDApKSB7Ci0JCQlJUmVzb3VyY2UgZmlsZVRvT3BlbiA9IHByb2ouZmluZE1lbWJlcihuZXcgUGF0aChvcGVuKSk7Ci0JCQlpZiAoZmlsZVRvT3BlbiAhPSBudWxsKSB7Ci0JCQkJZWxlbWVudFRvT3BlbiA9IGZpbGVUb09wZW47Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBkb0ltcG9ydHMoSVByb2plY3QgcHJvamVjdCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGN1cnIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUlQYXRoIGRlc3RQYXRoOwotCQkJU3RyaW5nIG5hbWUgPSBjdXJyLmdldEF0dHJpYnV0ZSgiZGVzdCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoKG5hbWUgPT0gbnVsbCkgfHwgKG5hbWUubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQlkZXN0UGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlGb2xkZXIgZm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIobmFtZSk7Ci0JCQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQl9Ci0JCQkJZGVzdFBhdGggPSBmb2xkZXIuZ2V0RnVsbFBhdGgoKTsKLQkJCX0KLQkJCVN0cmluZyBpbXBvcnRQYXRoID0gY3Vyci5nZXRBdHRyaWJ1dGUoInNyYyIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW1wb3J0UGF0aCA9PSBudWxsKSB7Ci0JCQkJaW1wb3J0UGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJwcm9qZWN0c2V0dXAgZGVzY3JpcHRvcjogaW1wb3J0IG1pc3NpbmciKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJWmlwRmlsZSB6aXBGaWxlID0gZ2V0WmlwRmlsZUZyb21QbHVnaW5EaXIoaW1wb3J0UGF0aCwgZ2V0Q29udHJpYnV0aW5nUGx1Z2luKGN1cnIpKTsKLQkJCWltcG9ydEZpbGVzRnJvbVppcCh6aXBGaWxlLCBkZXN0UGF0aCwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRDb250cmlidXRpbmdQbHVnaW4oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50KSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBjb25maWd1cmF0aW9uRWxlbWVudDsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSUV4dGVuc2lvbikgewotCQkJCXJldHVybiAoKElFeHRlbnNpb24pIHBhcmVudCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCQl9Ci0JCQlwYXJlbnQgPSAoKElDb25maWd1cmF0aW9uRWxlbWVudCkgcGFyZW50KS5nZXRQYXJlbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSVJlc291cmNlIGdldEVsZW1lbnRUb09wZW4oKSB7Ci0JCXJldHVybiBlbGVtZW50VG9PcGVuOwotCX0KLQotCXByaXZhdGUgWmlwRmlsZSBnZXRaaXBGaWxlRnJvbVBsdWdpbkRpcihTdHJpbmcgcGx1Z2luUmVsYXRpdmVQYXRoLCBTdHJpbmcgc3ltYm9saWNOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHN5bWJvbGljTmFtZSk7Ci0JCQlVUkwgc3RhcnRlclVSTCA9IG5ldyBVUkwoYnVuZGxlLmdldEVudHJ5KCIvIiksIHBsdWdpblJlbGF0aXZlUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgWmlwRmlsZShQbGF0Zm9ybS5hc0xvY2FsVVJMKHN0YXJ0ZXJVUkwpLmdldEZpbGUoKSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gcGx1Z2luUmVsYXRpdmVQYXRoICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpOyAvLyROT04tTkxTLTEkCi0JCQlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBYTUxVSVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgZSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGltcG9ydEZpbGVzRnJvbVppcChaaXBGaWxlIHNyY1ppcEZpbGUsIElQYXRoIGRlc3RQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCVppcEZpbGVTdHJ1Y3R1cmVQcm92aWRlciBzdHJ1Y3R1cmVQcm92aWRlciA9IG5ldyBaaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIoc3JjWmlwRmlsZSk7Ci0JCUltcG9ydE9wZXJhdGlvbiBvcCA9IG5ldyBJbXBvcnRPcGVyYXRpb24oZGVzdFBhdGgsIHN0cnVjdHVyZVByb3ZpZGVyLmdldFJvb3QoKSwgc3RydWN0dXJlUHJvdmlkZXIsIG92ZXJ3cml0ZVF1ZXJ5KTsKLQkJb3AucnVuKG1vbml0b3IpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUnVubmFibGVXaXRoUHJvZ3Jlc3MjcnVuKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKFhNTFdpemFyZHNNZXNzYWdlcy5FeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uX29wX2Rlc2MsIHBhZ2VzLmxlbmd0aCk7Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCWNyZWF0ZVByb2plY3Qocm9vdCwgcGFnZXNbaV0sIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0V4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTY4YzkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlEZWxlZ2F0aW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSU92ZXJ3cml0ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZS5CYXNpY05ld1Byb2plY3RSZXNvdXJjZVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ld3Jlc291cmNlLkJhc2ljTmV3UmVzb3VyY2VXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkLCBJRXhlY3V0YWJsZUV4dGVuc2lvbiB7Ci0KLQlwcml2YXRlIGNsYXNzIEltcG9ydE92ZXJ3cml0ZVF1ZXJ5IGltcGxlbWVudHMgSU92ZXJ3cml0ZVF1ZXJ5IHsKLQotCQlwcml2YXRlIGludCBvcGVuRGlhbG9nKGZpbmFsIFN0cmluZyBmaWxlKSB7Ci0JCQlmaW5hbCBpbnRbXSByZXN1bHQgPSB7SURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUR9OwotCQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJU3RyaW5nIHRpdGxlID0gWE1MV2l6YXJkc01lc3NhZ2VzLkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfb3ZlcndyaXRlcXVlcnlfdGl0bGU7Ci0JCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChYTUxXaXphcmRzTWVzc2FnZXMuRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vdmVyd3JpdGVxdWVyeV9tZXNzYWdlLCBmaWxlKTsKLQkJCQkJU3RyaW5nW10gb3B0aW9ucyA9IHtJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTH07Ci0JCQkJCU1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coZ2V0U2hlbGwoKSwgdGl0bGUsIG51bGwsIG1zZywgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgb3B0aW9ucywgMCk7Ci0JCQkJCXJlc3VsdFswXSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlyZXR1cm4gcmVzdWx0WzBdOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBxdWVyeU92ZXJ3cml0ZShTdHJpbmcgZmlsZSkgewotCQkJU3RyaW5nW10gcmV0dXJuQ29kZXMgPSB7WUVTLCBOTywgQUxMLCBDQU5DRUx9OwotCQkJaW50IHJldHVyblZhbCA9IG9wZW5EaWFsb2coZmlsZSk7Ci0JCQlyZXR1cm4gcmV0dXJuVmFsIDwgMCA/IENBTkNFTCA6IHJldHVybkNvZGVzW3JldHVyblZhbF07Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCB3aXphcmRDb25maWdFbGVtZW50OwotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGV4YW1wbGVDb25maWdFbGVtZW50OwotCi0JcHJpdmF0ZSBTdHJpbmcgRVhBTVBMRV9XSVpBUkRfWFBfSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5leGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZVtdIHBhZ2VzOwotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgV0VCX0JST1dTRVJfSUQgPSAib3JnLmVjbGlwc2UudWkuYnJvd3Nlci5lZGl0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0RGlhbG9nU2V0dGluZ3MoWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCkpOwotCQlzZXRXaW5kb3dUaXRsZShYTUxXaXphcmRzTWVzc2FnZXMuRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF90aXRsZSk7Ci0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBXaXphcmQjYWRkUGFnZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJc3VwZXIuYWRkUGFnZXMoKTsKLQotCQlpZiAoZXhhbXBsZUNvbmZpZ0VsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNoaWxkcmVuID0gZXhhbXBsZUNvbmZpZ0VsZW1lbnQuZ2V0Q2hpbGRyZW4oInByb2plY3RzZXR1cCIpOyAvLyROT04tTkxTLTEkCi0JCWlmICgoY2hpbGRyZW4gPT0gbnVsbCkgfHwgKGNoaWxkcmVuLmxlbmd0aCA9PSAwKSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJkZXNjcmlwdG9yIG11c3QgY29udGFpbiBvbmUgb3JlIG1vcmUgcHJvamVjdHNldHVwIHRhZ3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcGFnZXMgPSBuZXcgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2VbY2hpbGRyZW4ubGVuZ3RoXTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYWdlc1tpXSA9IG5ldyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZShpLCBjaGlsZHJlbltpXSk7Ci0JCQlhZGRQYWdlKHBhZ2VzW2ldKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24pIHsKLQkJaWYgKGV4YW1wbGVDb25maWdFbGVtZW50ICE9IG51bGwpIHsKLQkJCVN0cmluZyBiYW5uZXIgPSBleGFtcGxlQ29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImJhbm5lciIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYmFubmVyICE9IG51bGwpIHsKLQkJCQlVUkwgaW1hZ2VVUkwgPSBQbGF0Zm9ybS5maW5kKFBsYXRmb3JtLmdldEJ1bmRsZShleGFtcGxlQ29uZmlnRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKSksIG5ldyBQYXRoKGJhbm5lcikpOwotCQkJCUltYWdlRGVzY3JpcHRvciBkZXNjID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaW1hZ2VVUkwpOwotCQkJCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKGRlc2MpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGdldEV4dGVuZGVkQ29uZmlndXJhdGlvbkVsZW1lbnRzKCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXhhbXBsZVdpemFyZFhQID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoRVhBTVBMRV9XSVpBUkRfWFBfSUQpOwotCQlpZiAoZXhhbXBsZVdpemFyZFhQID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50WzBdOwotCQl9Ci0JCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXhhbXBsZVdpemFyZFhQLmdldEV4dGVuc2lvbihnZXRXaXphcmRFeHRlbnNpb25JZCgpKTsKLQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQl9Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGV4YW1wbGVXaXphcmRDRXMgPSBleGFtcGxlV2l6YXJkWFAuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCXJldHVybiBleGFtcGxlV2l6YXJkQ0VzOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIHRhcmdldCkgewotCQlTdHJpbmcgdGl0bGUgPSBYTUxXaXphcmRzTWVzc2FnZXMuRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vcF9lcnJvcl90aXRsZTsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBYTUxXaXphcmRzTWVzc2FnZXMuRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vcF9lcnJvcl9tZXNzYWdlOwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJSVN0YXR1cyBzdGF0dXMgPSAoKENvcmVFeGNlcHRpb24pIHRhcmdldCkuZ2V0U3RhdHVzKCk7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UsIHN0YXR1cyk7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKHN0YXR1cy5nZXRNZXNzYWdlKCksIHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCB0aXRsZSwgdGFyZ2V0LmdldE1lc3NhZ2UoKSk7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKHRhcmdldCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlblJlc291cmNlKGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmaW5hbCBJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCk7Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJSURFLm9wZW5FZGl0b3IoYWN0aXZlUGFnZSwgKElGaWxlKSByZXNvdXJjZSwgV0VCX0JST1dTRVJfSUQsIHRydWUpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQlCYXNpY05ld1Jlc291cmNlV2l6YXJkLnNlbGVjdEFuZFJldmVhbChyZXNvdXJjZSwgYWN0aXZlUGFnZS5nZXRXb3JrYmVuY2hXaW5kb3coKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgV2l6YXJkI3BlcmZvcm1GaW5pc2gKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlFeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uIHJ1bm5hYmxlID0gbmV3IEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24ocGFnZXMsIG5ldyBJbXBvcnRPdmVyd3JpdGVRdWVyeSgpKTsKLQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgV29ya3NwYWNlTW9kaWZ5RGVsZWdhdGluZ09wZXJhdGlvbihydW5uYWJsZSk7Ci0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIHRydWUsIG9wKTsKLQkJfQotCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlCYXNpY05ld1Byb2plY3RSZXNvdXJjZVdpemFyZC51cGRhdGVQZXJzcGVjdGl2ZSh3aXphcmRDb25maWdFbGVtZW50KTsKLQkJSVJlc291cmNlIHJlcyA9IHJ1bm5hYmxlLmdldEVsZW1lbnRUb09wZW4oKTsKLQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQlvcGVuUmVzb3VyY2UocmVzKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9yZXMgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBmb3IgdGhlIHdpemFyZC4gVGhlIGNvbmZpZyBlbGVtZW50Ci0JICogd2lsbCBiZSB1c2VkIGluIDxjb2RlPnBlcmZvcm1GaW5pc2g8L2NvZGU+IHRvIHNldCB0aGUgcmVzdWx0Ci0JICogcGVyc3BlY3RpdmUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjZmlnLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZGF0YSkgewotCQl3aXphcmRDb25maWdFbGVtZW50ID0gY2ZpZzsKLQkJU3RyaW5nIHRpdGxlID0gd2l6YXJkQ29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGl0bGUgIT0gbnVsbCkgewotCQkJc2V0V2luZG93VGl0bGUodGl0bGUpOwotCQl9Ci0JCVN0cmluZyB3aXphcmRJZCA9IGdldFdpemFyZEV4dGVuc2lvbklkKCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGV4YW1wbGVXaXphcmRDRXMgPSBnZXRFeHRlbmRlZENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4YW1wbGVXaXphcmRDRXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZXhhbXBsZVdpemFyZENFc1tpXTsKLQkJCVN0cmluZyBleHRXaXphcmRJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoKHdpemFyZElkICE9IG51bGwpICYmIChleHRXaXphcmRJZCAhPSBudWxsKSAmJiB3aXphcmRJZC5lcXVhbHMoZXh0V2l6YXJkSWQpKSB7Ci0JCQkJZXhhbXBsZUNvbmZpZ0VsZW1lbnQgPSBlbGVtZW50OwotCQkJfQotCQl9Ci0JCS8vIGluaXRpYWxpemVEZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V2l6YXJkRXh0ZW5zaW9uSWQoKSB7Ci0JCXJldHVybiB3aXphcmRDb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjEzYjMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlOwotCi1wdWJsaWMgY2xhc3MgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlIHsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50OwotCi0JcHVibGljIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlKGludCBwYWdlTnVtYmVyLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSkgewotCi0JCXN1cGVyKCJwYWdlIiArIHBhZ2VOdW1iZXIpOyAvLyROT04tTkxTLTEkCi0JCWNvbmZpZ3VyYXRpb25FbGVtZW50ID0gZWxlbTsKLQotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShlbGVtLCAibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCXNldEluaXRpYWxQcm9qZWN0TmFtZShjYWxjdWxhdGVJbml0aWFsUHJvamVjdE5hbWUobmFtZSkpOwotCi0JCXNldERlc2NyaXB0aW9uKGdldEF0dHJpYnV0ZShjb25maWd1cmF0aW9uRWxlbWVudCwgInBhZ2VkZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUaXRsZShnZXRBdHRyaWJ1dGUoY29uZmlndXJhdGlvbkVsZW1lbnQsICJwYWdldGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCS8qCi0JICogU2V0IHRoZSBkZWZhdWx0IHByb2plY3QgbmFtZSB0aGF0IGlzIHRvIGFwcGVhciBvbiB0aGUgaW5pdGlhbFBhZ2UgcGFnZQotCSAqIG9mIHRoaXMgd2l6YXJkLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2FsY3VsYXRlSW5pdGlhbFByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkgewotCQlJUHJvamVjdCBwcm9qZWN0SGFuZGxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJaWYgKCFwcm9qZWN0SGFuZGxlLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gcHJvamVjdE5hbWU7Ci0JCX0KLQkJLy8gQ2hhbmdlIHRoZSBuYW1lIHVudGlsIGl0IGRvZXNuJ3QgZXhpc3RzLiBUcnkgOSB0aW1lcyBhbmQgdGhlbgotCQkvLyBnaXZlIHVwLgotCQlmb3IgKGludCBpID0gMTsgaSA8IDEwOyBpKyspIHsKLQkJCXByb2plY3RIYW5kbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUgKyBpKTsKLQkJCWlmICghcHJvamVjdEhhbmRsZS5leGlzdHMoKSkgewotCQkJCXJldHVybiBwcm9qZWN0TmFtZSArIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2plY3ROYW1lICsgIjkiOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRBdHRyaWJ1dGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0sIFN0cmluZyB0YWcpIHsKLQkJU3RyaW5nIHJlcyA9IGVsZW0uZ2V0QXR0cmlidXRlKHRhZyk7Ci0JCWlmIChyZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuICchJyArIHRhZyArICchJzsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgb2YgdGhpcyBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIElDb25maWd1cmF0aW9uRWxlbWVudAotCSAqLwotCXB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKSB7Ci0JCXJldHVybiBjb25maWd1cmF0aW9uRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZSN2YWxpZGF0ZVBhZ2UoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJaWYgKCFzdXBlci52YWxpZGF0ZVBhZ2UoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIHByb2plY3ROYW1lID0gZ2V0UHJvamVjdE5hbWUoKTsKLQkJaWYgKHByb2plY3ROYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUlXaXphcmQgd2l6YXJkID0gZ2V0V2l6YXJkKCk7Ci0JCWlmICh3aXphcmQgaW5zdGFuY2VvZiBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkKSB7Ci0JCQlJV2l6YXJkUGFnZVtdIHBhZ2VzID0gd2l6YXJkLmdldFBhZ2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKChwYWdlc1tpXSAhPSB0aGlzKSAmJiAocGFnZXNbaV0gaW5zdGFuY2VvZiBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZSkpIHsKLQkJCQkJaWYgKHByb2plY3ROYW1lLmVxdWFscygoKEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlKSBwYWdlc1tpXSkuZ2V0UHJvamVjdE5hbWUoKSkpIHsKLQkJCQkJCXNldEVycm9yTWVzc2FnZShYTUxXaXphcmRzTWVzc2FnZXMuRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2VfZXJyb3JfYWxyZWFkeWV4aXN0cyk7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0V4cG9ydFhNTENhdGFsb2dXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvRXhwb3J0WE1MQ2F0YWxvZ1dpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDc5NjgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvRXhwb3J0WE1MQ2F0YWxvZ1dpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgKFNUQVIpIGFuZAotICogb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIvU1RBUiAtIGRjYXJ2ZXJAc3RhcnN0YW5kYXJkLm9yZy9kX2FfY2FydmVyQHlhaG9vLmNvbSAtIGJ1ZyAxOTI1NjgKLSAqICAgICAgICAgICAgSW5pdGlhbCBBUEkgLSBUaGlzIGltcGxlbWVudHMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlCi0gKiAgICAgICAgICAgIG9sZCBFeHBvcnQgRGlhbG9nIGZvciB0aGUgWE1MIENhdGFsb2cuIAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ld3Jlc291cmNlLkJhc2ljTmV3RmlsZVJlc291cmNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLkNhdGFsb2dTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBFeHBvcnRYTUxDYXRhbG9nV2l6YXJkIGV4dGVuZHMgQmFzaWNOZXdGaWxlUmVzb3VyY2VXaXphcmQgaW1wbGVtZW50cyBJRXhwb3J0V2l6YXJkIHsKLQotCXByb3RlY3RlZCBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIGV4cG9ydFBhZ2UgPSBudWxsOwotCXByb3RlY3RlZCBJQ2F0YWxvZyB3b3JraW5nVXNlckNhdGFsb2cgPSBudWxsOwotCXByb3RlY3RlZCBJQ2F0YWxvZyB1c2VyQ2F0YWxvZyA9IG51bGw7Ci0JCi0JcHVibGljIEV4cG9ydFhNTENhdGFsb2dXaXphcmQoKSB7Ci0JCXNldFdpbmRvd1RpdGxlKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfRElBTE9HX1hNTENBVEFMT0dfRVhQT1JUX1RJVExFKTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX1dJWkJBTl9HRU5FUkFURVhNTCk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCQlJQ2F0YWxvZyBkZWZhdWx0Q2F0YWxvZyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0JCUlOZXh0Q2F0YWxvZ1tdIG5leHRDYXRhbG9ncyA9IGRlZmF1bHRDYXRhbG9nLmdldE5leHRDYXRhbG9ncygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5leHRDYXRhbG9ncy5sZW5ndGg7IGkrKykgewotCQkJSU5leHRDYXRhbG9nIGNhdGFsb2cgPSBuZXh0Q2F0YWxvZ3NbaV07Ci0JCQlJQ2F0YWxvZyByZWZlcmVuY2VkQ2F0YWxvZyA9IGNhdGFsb2cuZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLQkJCWlmIChyZWZlcmVuY2VkQ2F0YWxvZyAhPSBudWxsKSB7Ci0JCQkJaWYgKFhNTENvcmVQbHVnaW4uVVNFUl9DQVRBTE9HX0lELmVxdWFscyhyZWZlcmVuY2VkQ2F0YWxvZy5nZXRJZCgpKSkgewotCQkJCQl1c2VyQ2F0YWxvZyA9IHJlZmVyZW5jZWRDYXRhbG9nOwotCQkJCX0KLQkJCX0KLQkJfQotCQlDYXRhbG9nU2V0IHRlbXBDYXRhbG9nU2V0ID0gbmV3IENhdGFsb2dTZXQoKTsKLQkJd29ya2luZ1VzZXJDYXRhbG9nID0gdGVtcENhdGFsb2dTZXQubG9va3VwT3JDcmVhdGVDYXRhbG9nKCJ3b3JraW5nIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJd29ya2luZ1VzZXJDYXRhbG9nLmFkZEVudHJpZXNGcm9tQ2F0YWxvZyh1c2VyQ2F0YWxvZyk7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IHdvcmtzcGFjZS5nZXRSb290KCk7Ci0JCVN0cmluZyB3b3Jrc3BhY2VQYXRoID0gd29ya3NwYWNlUm9vdC5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJU3RyaW5nIGZ1bGxQYXRoID0gd29ya3NwYWNlUGF0aCArIGV4cG9ydFBhZ2UuZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS50b09TU3RyaW5nKCk7Ci0JCVN0cmluZyByZXF1aXJlZFN0cmluZz1mdWxsUGF0aCArIEZpbGUuc2VwYXJhdG9yICsgZXhwb3J0UGFnZS5nZXRGaWxlTmFtZSgpOwotCQl0cnkgewotCQkJZXhwb3J0UGFnZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCQl3b3JraW5nVXNlckNhdGFsb2cuc2V0TG9jYXRpb24ocmVxdWlyZWRTdHJpbmcpOwotCQkJd29ya2luZ1VzZXJDYXRhbG9nLnNhdmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlleHBvcnRQYWdlID0gbmV3IFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UoIlhNTCBDYXRhbG9nIEV4cG9ydCIsICBnZXRTZWxlY3Rpb24oKSk7Ci0JCWV4cG9ydFBhZ2Uuc2V0VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9ESUFMT0dfWE1MQ0FUQUxPR19FWFBPUlRfVElUTEUpOwotCQlleHBvcnRQYWdlLnNldERlc2NyaXB0aW9uKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfRElBTE9HX1hNTENBVEFMT0dfRVhQT1JUX0RFU0NSSVBUSU9OKTsKLQkJYWRkUGFnZShleHBvcnRQYWdlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbikgewotCQlzdXBlci5pbml0KHdvcmtiZW5jaCwgY3VycmVudFNlbGVjdGlvbik7Ci0JCXNldFdpbmRvd1RpdGxlKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfRElBTE9HX1hNTENBVEFMT0dfRVhQT1JUX1RJVExFKTsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX1dJWkJBTl9HRU5FUkFURVhNTCk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0lYTUxXaXphcmRIZWxwQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzQyZWZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIHhtbCB3aXphcmQuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUKLSAqIGltcGxlbWVudGVkLgotICogPC9wPgotICovCi1pbnRlcmZhY2UgSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzIHsKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IFhNTFVJUGx1Z2luLklEICsgIi4iOyAvLyROT04tTkxTLTEkCi0JLy8gQ3JlYXRlIFhNTCBmaWxlIGZyb20gYSBEVEQgZmlsZSByYWRpbwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfQ1JFQVRFWE1MMV9IRUxQSUQgPSBQUkVGSVggKyAieG1sYzAxMDEiOyAvLyROT04tTkxTLTEkCi0JLy8gQ3JlYXRlIFhNTCBmaWxlIGZyb20gYW4gWE1MIHNjaGVtYSBmaWxlIHJhZGlvIGJ1dHRvbgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfQ1JFQVRFWE1MMl9IRUxQSUQgPSBQUkVGSVggKyAieG1sYzAxMDIiOyAvLyROT04tTkxTLTEkCi0JLy8gQ3JlYXRlIFhNTCBmaWxlIGZyb20gc2NyYXRjaCByYWRpbyBidXR0b24KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTkVXV0laQVJEX0NSRUFURVhNTDNfSEVMUElEID0gUFJFRklYICsgInhtbGMwMTAzIjsgLy8kTk9OLU5MUy0xJAotCS8vIFNlbGVjdCBTb3VyY2UgZmlsZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX05FV1dJWkFSRF9TRUxFQ1RTT1VSQ0VfSEVMUElEID0gUFJFRklYICsgInhtbGMwNTAwIjsgLy8kTk9OLU5MUy0xJAotCS8vIFJvb3QgZWxlbWVudCBmb3IgYm90aCBEVEQgYW5kIFhNTCBzY2hlbWEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTkVXV0laQVJEX1NFTEVDVFJPT1RFTEVNRU5UX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDQxMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBDcmVhdGUgT3B0aW9uYWwgQXR0cmlidXRlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQxX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDQ0MSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBDcmVhdGUgT3B0aW9uYWwgRWxlbWVudHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTkVXV0laQVJEX1NFTEVDVFJPT1RFTEVNRU5UMl9IRUxQSUQgPSBQUkVGSVggKyAieG1sYzA0NDIiOyAvLyROT04tTkxTLTEkCi0JLy8gQ3JlYXRlIGZpcnN0IGNob2ljZSBvZiByZXF1aXJlZCBjaG9pY2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTkVXV0laQVJEX1NFTEVDVFJPT1RFTEVNRU5UM19IRUxQSUQgPSBQUkVGSVggKyAieG1sYzA0NDMiOyAvLyROT04tTkxTLTEkCi0JLy8gRmlsbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlIHdpdGggZGF0YQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQ0X0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDQ0NCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBTeXN0ZW0gSUQgZm9yIERURAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQ1X0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDIxMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBQdWJsaWMgSUQgZm9yIERURAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQ2X0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDIyMCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvSW1wb3J0WE1MQ2F0YWxvZ1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvSW1wb3J0WE1MQ2F0YWxvZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhlMzQ0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0ltcG9ydFhNTENhdGFsb2dQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCAoU1RBUikgYW5kCi0gKiBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlci9TVEFSIC0gZGNhcnZlckBzdGFyc3RhbmRhcmQub3JnL2RfYV9jYXJ2ZXJAeWFob28uY29tIC0gYnVnIDE5MjU2OAotICogICAgICAgICAgICBJbml0aWFsIEFQSSAtIFRoaXMgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUKLSAqICAgICAgICAgICAgb2xkIEltcG9ydCBEaWFsb2cgZm9yIHRoZSBYTUwgQ2F0YWxvZy4gCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2Vycy5TZWxlY3RTaW5nbGVGaWxlVmlldzsKLQotcHVibGljIGNsYXNzIEltcG9ydFhNTENhdGFsb2dQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0U2luZ2xlRmlsZVZpZXcgc2VsZWN0U2luZ2xlRmlsZVZpZXc7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQkKLQotCXB1YmxpYyBJbXBvcnRYTUxDYXRhbG9nUGFnZSgpIHsKLQkJc3VwZXIoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9ESUFMT0dfWE1MQ0FUQUxPR19JTVBPUlRfVElUTEUpOwotCQlzZXRUaXRsZShYTUxXaXphcmRzTWVzc2FnZXMuX1VJX0RJQUxPR19YTUxDQVRBTE9HX0lNUE9SVF9USVRMRSk7Ci0JCXNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3ID0gbmV3IFNlbGVjdFNpbmdsZUZpbGVWaWV3KHNlbGVjdGlvbiwgZmFsc2UpIHsKLQkJCXB1YmxpYyB2b2lkIGNyZWF0ZUZpbHRlckNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJCUltcG9ydFhNTENhdGFsb2dQYWdlLnRoaXMuY3JlYXRlRmlsdGVyQ29udHJvbChjb21wb3NpdGUpOwotCQkJfQotCQl9OwotCi0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC53aWR0aEhpbnQgPSAzNTA7Ci0JCWdkLmhlaWdodEhpbnQgPSAzNTA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJU3RyaW5nW10gZXh0ZW5zaW9ucyA9IHsgIi54bWxjYXRhbG9nIiwgIi54bWwiIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzZWxlY3RTaW5nbGVGaWxlVmlldy5hZGRGaWx0ZXJFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQlzZWxlY3RTaW5nbGVGaWxlVmlldy5jcmVhdGVDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3LnNldFZpc2libGVIZWxwZXIodHJ1ZSk7Ci0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3LmFkZFNlbGVjdGlvbkNoYW5nZWRUcmVlTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSW1wb3J0WE1MQ2F0YWxvZ1BhZ2UudGhpcy5zZXRQYWdlQ29tcGxldGUoc2VsZWN0U2luZ2xlRmlsZVZpZXcuZ2V0RmlsZSgpICE9IG51bGwpOwotCQkJfQotCQl9KTsKLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUZpbHRlckNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gc2VsZWN0U2luZ2xlRmlsZVZpZXcuZ2V0RmlsZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvSW1wb3J0WE1MQ2F0YWxvZ1dpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9JbXBvcnRYTUxDYXRhbG9nV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMjAwYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9JbXBvcnRYTUxDYXRhbG9nV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCAoU1RBUikgYW5kCi0gKiBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlci9TVEFSIC0gZGNhcnZlckBzdGFyc3RhbmRhcmQub3JnL2RfYV9jYXJ2ZXJAeWFob28uY29tIC0gYnVnIDE5MjU2OAotICogICAgICAgICAgICBJbml0aWFsIEFQSSAtIFRoaXMgaW1wbGVtZW50cyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUKLSAqICAgICAgICAgICAgb2xkIEltcG9ydCBEaWFsb2cgZm9yIHRoZSBYTUwgQ2F0YWxvZy4gCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cuQ2F0YWxvZ1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nLlhNTENhdGFsb2dNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLXB1YmxpYyBjbGFzcyBJbXBvcnRYTUxDYXRhbG9nV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7Ci0KLQlwcm90ZWN0ZWQgSW1wb3J0WE1MQ2F0YWxvZ1BhZ2UgaW1wb3J0UGFnZSA9IG51bGw7Ci0JcHJvdGVjdGVkIElDYXRhbG9nIHdvcmtpbmdVc2VyQ2F0YWxvZyA9IG51bGw7Ci0JcHJvdGVjdGVkIElDYXRhbG9nIHVzZXJDYXRhbG9nID0gbnVsbDsKLQkKLQlwdWJsaWMgSW1wb3J0WE1MQ2F0YWxvZ1dpemFyZCgpIHsKLQkJc2V0V2luZG93VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9ESUFMT0dfWE1MQ0FUQUxPR19JTVBPUlRfVElUTEUpOwotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfV0laQkFOX0dFTkVSQVRFWE1MKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JCUlDYXRhbG9nIGRlZmF1bHRDYXRhbG9nID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLQkJSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gZGVmYXVsdENhdGFsb2cuZ2V0TmV4dENhdGFsb2dzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJTmV4dENhdGFsb2cgY2F0YWxvZyA9IG5leHRDYXRhbG9nc1tpXTsKLQkJCUlDYXRhbG9nIHJlZmVyZW5jZWRDYXRhbG9nID0gY2F0YWxvZy5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotCQkJaWYgKHJlZmVyZW5jZWRDYXRhbG9nICE9IG51bGwpIHsKLQkJCQlpZiAoWE1MQ29yZVBsdWdpbi5VU0VSX0NBVEFMT0dfSUQuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKSB7Ci0JCQkJCXVzZXJDYXRhbG9nID0gcmVmZXJlbmNlZENhdGFsb2c7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJQ2F0YWxvZ1NldCB0ZW1wQ2F0YWxvZ1NldCA9IG5ldyBDYXRhbG9nU2V0KCk7Ci0JCXdvcmtpbmdVc2VyQ2F0YWxvZyA9IHRlbXBDYXRhbG9nU2V0Lmxvb2t1cE9yQ3JlYXRlQ2F0YWxvZygid29ya2luZyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXdvcmtpbmdVc2VyQ2F0YWxvZy5hZGRFbnRyaWVzRnJvbUNhdGFsb2codXNlckNhdGFsb2cpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCXJldHVybiBpbXBvcnRQYWdlLmlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJSUZpbGUgZmlsZSA9IGltcG9ydFBhZ2UuZ2V0RmlsZSgpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkudG9VUkkoKS50b1N0cmluZygpOwotCQkJdHJ5IHsKLQkJCQlDYXRhbG9nU2V0IHRlbXBSZXNvdXJjZVNldCA9IG5ldyBDYXRhbG9nU2V0KCk7Ci0JCQkJSUNhdGFsb2cgbmV3Q2F0YWxvZyA9IHRlbXBSZXNvdXJjZVNldC5sb29rdXBPckNyZWF0ZUNhdGFsb2coInRlbXAiLCBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJCQl3b3JraW5nVXNlckNhdGFsb2cuYWRkRW50cmllc0Zyb21DYXRhbG9nKG5ld0NhdGFsb2cpOwotCQkJCXVzZXJDYXRhbG9nLmNsZWFyKCk7Ci0JCQkJdXNlckNhdGFsb2cuYWRkRW50cmllc0Zyb21DYXRhbG9nKHdvcmtpbmdVc2VyQ2F0YWxvZyk7Ci0JCQkJdXNlckNhdGFsb2cuc2F2ZSgpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlpbXBvcnRQYWdlID0gbmV3IEltcG9ydFhNTENhdGFsb2dQYWdlKCk7Ci0JCWltcG9ydFBhZ2Uuc2V0VGl0bGUoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfSEVBRElORyk7Ci0JCWltcG9ydFBhZ2Uuc2V0RGVzY3JpcHRpb24oWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9ESUFMT0dfWE1MQ0FUQUxPR19JTVBPUlRfREVTQ1JJUFRJT04pOwotCQlpbXBvcnRQYWdlLnNldE1lc3NhZ2UoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfTUVTU0FHRSk7Ci0JCWFkZFBhZ2UoaW1wb3J0UGFnZSk7Ci0JCWltcG9ydFBhZ2Uuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OYW1lc3BhY2VJbmZvQ29udGVudEJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmFtZXNwYWNlSW5mb0NvbnRlbnRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZWVkODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OYW1lc3BhY2VJbmZvQ29udGVudEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5Db250ZW50QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZUluZm9Db250ZW50QnVpbGRlciBleHRlbmRzIENvbnRlbnRCdWlsZGVyIHsKLQlwcm90ZWN0ZWQgaW50IGNvdW50ID0gMTsKLQlwdWJsaWMgTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotCXByb3RlY3RlZCBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlwdWJsaWMgTmFtZXNwYWNlSW5mb0NvbnRlbnRCdWlsZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpIHsKLQkJaWYgKGVkLmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvZGVmaW5pdGlvbkluZm8iKSAhPSBudWxsKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCXN1cGVyLnZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oZWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQW55RWxlbWVudE5vZGUoQ01BbnlFbGVtZW50IGFueUVsZW1lbnQpIHsKLQkJU3RyaW5nIHVyaSA9IGFueUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCWlmICgodXJpICE9IG51bGwpICYmICF1cmkuc3RhcnRzV2l0aCgiIyMiKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlpZiAodGFibGUuZ2V0KHVyaSkgPT0gbnVsbCkgewotCQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0JCQkJaW5mby51cmkgPSB1cmk7Ci0JCQkJaW5mby5wcmVmaXggPSAicCIgKyBjb3VudCsrOyAvLyROT04tTkxTLTEkCi0JCQkJdGFibGUucHV0KHVyaSwgaW5mbyk7Ci0JCQkJbGlzdC5hZGQoaW5mbyk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld01vZGVsV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld01vZGVsV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZmNkMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdNb2RlbFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgkgICBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvclhNTDsKLQotcHVibGljIGNsYXNzIE5ld01vZGVsV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZlNlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaCBmV29ya2JlbmNoOwotCXByb3RlY3RlZCBTdHJpbmcgZkN1cnJlbnREaXJlY3Rvcnk7Ci0KLQlwdWJsaWMgTmV3TW9kZWxXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMuZldvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLQkJdGhpcy5mU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJV2l6YXJkUGFnZSBjdXJyZW50UGFnZSA9IChXaXphcmRQYWdlKSBnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpOwotCQlpZiAoY3VycmVudFBhZ2UgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3VycmVudFBhZ2UuaXNQYWdlQ29tcGxldGUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIHNob3dGaWxlRGlhbG9nCi0JICovCi0JcHVibGljIEZpbGVEaWFsb2cgc2hvd0ZpbGVEaWFsb2coU2hlbGwgc2hlbGwsIFN0cmluZyBkZWZhdWx0RGlyZWN0b3J5LCBTdHJpbmcgZGVmYXVsdEZpbGUsIFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMpIHsKLQkJRmlsZURpYWxvZyBmaWxlRGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwsIFNXVC5PUEVOKTsKLQotCQkvLyBHZXQgdGhlIGxhc3QgdmlzaXQgZGlyZWN0b3J5IGlmIHdlIGhhdmVuJ3QgZGVmaW5lZCBhIHBhcnRpY3VsYXIgb25lCi0JCS8vIGhlcmUuCi0JCWlmICgoZGVmYXVsdERpcmVjdG9yeSA9PSBudWxsKSB8fCAoZGVmYXVsdERpcmVjdG9yeS5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gZGVmYXVsdERpcmVjdG9yeSA9Ci0JCQkvLyBMb2NhdGUuaW5zdGFuY2UodGhpcykuZ2V0TGFzdFNlbGVjdGVkRGlyZWN0b3J5KGdldFJlc291cmNlUGF0aCgpKTsKLQkJfQotCi0JCWlmICgoZGVmYXVsdERpcmVjdG9yeSAhPSBudWxsKSAmJiAoZGVmYXVsdERpcmVjdG9yeS5sZW5ndGgoKSAhPSAwKSkgewotCQkJZmlsZURpYWxvZy5zZXRGaWx0ZXJQYXRoKGRlZmF1bHREaXJlY3RvcnkpOwotCQl9Ci0KLQkJZmlsZURpYWxvZy5zZXRGaWxlTmFtZShkZWZhdWx0RmlsZSk7Ci0JCWZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJFeHRlbnNpb25zKTsKLQotCQlmaWxlRGlhbG9nLm9wZW4oKTsKLQotCQlyZXR1cm4gZmlsZURpYWxvZzsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnREaXJlY3RvcnkoU3RyaW5nIGN1cnJlbnREaXJlY3RvcnkxKSB7Ci0JCXRoaXMuZkN1cnJlbnREaXJlY3RvcnkgPSBjdXJyZW50RGlyZWN0b3J5MTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVdvcmtiZW5jaFJlc291cmNlKElDb250YWluZXIgY29udGFpbmVyLCBTdHJpbmcgZmlsZU5hbWUpIHsKLQkJSVBhdGggcGF0aCA9IGNvbnRhaW5lci5nZXRGdWxsUGF0aCgpOwotCQlwYXRoID0gcGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotCQlJRmlsZSBmaWxlID0gY29udGFpbmVyLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJZmlsZS5jcmVhdGUobnVsbCwgdHJ1ZSwgbnVsbCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gWE1MQnVpbGRlclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZSgiRW5jb3VudGVyZWQKLQkJCQkvLyBleGNlcHRpb24gY3JlYXRpbmcgZmlsZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFN0YXJ0UGFnZQotCSAqLwotCXB1YmxpYyBjbGFzcyBTdGFydFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgTGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgaW50IHNlbGVjdGVkQnV0dG9uOwotCQlwcm90ZWN0ZWQgU3RyaW5nW10gcmFkaW9CdXR0b25MYWJlbDsKLQkJcHJvdGVjdGVkIEJ1dHRvbltdIHJhZGlvQnV0dG9uOwotCi0JCXB1YmxpYyBTdGFydFBhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmdbXSByYWRpb0J1dHRvbkxhYmVsKSB7Ci0JCQlzdXBlcihwYWdlTmFtZSk7Ci0JCQl0aGlzLnJhZGlvQnV0dG9uTGFiZWwgPSByYWRpb0J1dHRvbkxhYmVsOwotCQkJcmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uW3JhZGlvQnV0dG9uTGFiZWwubGVuZ3RoXTsKLQkJfQotCi0JCXB1YmxpYyBCdXR0b24gZ2V0UmFkaW9CdXR0b25BdEluZGV4KGludCBpKSB7Ci0JCQlCdXR0b24gcmVzdWx0ID0gbnVsbDsKLQkJCWlmICgoaSA+PSAwKSAmJiAoaSA8IHJhZGlvQnV0dG9uLmxlbmd0aCkpIHsKLQkJCQlyZXN1bHQgPSByYWRpb0J1dHRvbltpXTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldFNlbGVjdGVkUmFkaW9CdXR0b25JbmRleCgpIHsKLQkJCWludCByZXN1bHQgPSAtMTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmFkaW9CdXR0b24ubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAocmFkaW9CdXR0b25baV0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJcmVzdWx0ID0gaTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlDb21wb3NpdGUgYmFzZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQliYXNlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQkJLy8gcmFkaW8gYnV0dG9ucycgY29udGFpbmVyCi0JCQlDb21wb3NpdGUgcmFkaW9CdXR0b25zR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGJhc2UsIFNXVC5OT05FKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQotCQkJcmFkaW9CdXR0b25zR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ2QuaGVpZ2h0SGludCA9IDMwMDsKLQkJCWdkLndpZHRoSGludCA9IDQwMDsKLQkJCXJhZGlvQnV0dG9uc0dyb3VwLnNldExheW91dERhdGEoZ2QpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJhZGlvQnV0dG9uTGFiZWwubGVuZ3RoOyBpKyspIHsKLQkJCQlyYWRpb0J1dHRvbltpXSA9IG5ldyBCdXR0b24ocmFkaW9CdXR0b25zR3JvdXAsIFNXVC5SQURJTyk7Ci0JCQkJcmFkaW9CdXR0b25baV0uc2V0VGV4dChyYWRpb0J1dHRvbkxhYmVsW2ldKTsKLQkJCQlyYWRpb0J1dHRvbltpXS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCQkvLyByYWRpb0J1dHRvbltpXS5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQkJCX0KLQkJCXNldENvbnRyb2woYmFzZSk7Ci0JCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LnR5cGUgPT0gU1dULk1vZGlmeSkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogTmV3RmlsZVBhZ2UKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTmV3RmlsZVBhZ2UgZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIHsKLQkJcHVibGljIFN0cmluZyBkZWZhdWx0TmFtZSA9ICJOZXdGaWxlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRGaWxlRXh0ZW5zaW9uID0gIi50eHQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zID0geyIqLnR4dCJ9OyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgTGlzdCBmVmFsaWRFeHRlbnNpb25zID0gbnVsbDsKLQotCQlwdWJsaWMgTmV3RmlsZVBhZ2UoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlzdXBlcigiIiwgc2VsZWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlRGVmYXVsdEZpbGVOYW1lKCkgewotCQkJaW50IGNvdW50ID0gMDsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IGRlZmF1bHROYW1lICsgZGVmYXVsdEZpbGVFeHRlbnNpb247Ci0JCQlJUGF0aCBjb250YWluZXJGdWxsUGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0JCQlpZiAoY29udGFpbmVyRnVsbFBhdGggIT0gbnVsbCkgewotCQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCUlQYXRoIHBhdGggPSBjb250YWluZXJGdWxsUGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotCQkJCQlpZiAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5leGlzdHMocGF0aCkpIHsKLQkJCQkJCWNvdW50Kys7Ci0JCQkJCQlmaWxlTmFtZSA9IGRlZmF1bHROYW1lICsgY291bnQgKyBkZWZhdWx0RmlsZUV4dGVuc2lvbjsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZpbGVOYW1lOwotCQl9Ci0KLQkJLy8gcmV0dXJucyB0cnVlIGlmIGZpbGUgb2Ygc3BlY2lmaWVkIG5hbWUgZXhpc3RzIGluIGFueSBjYXNlIGZvcgotCQkvLyBzZWxlY3RlZCBjb250YWluZXIKLQkJcHJvdGVjdGVkIFN0cmluZyBleGlzdHNGaWxlQW55Q2FzZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJCWlmICgoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSAhPSBudWxsKSAmJiAoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS5pc0VtcHR5KCkgPT0gZmFsc2UpICYmIChmaWxlTmFtZS5jb21wYXJlVG8oIiIpICE9IDApKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJLy8gbG9vayB0aHJvdWdoIGFsbCByZXNvdXJjZXMgYXQgdGhlIHNwZWNpZmllZCBjb250YWluZXIgLQotCQkJCS8vIGNvbXBhcmUgaW4gdXBwZXIgY2FzZQotCQkJCUlSZXNvdXJjZSBwYXJlbnQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSk7Ci0JCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgcGFyZW50OwotCQkJCQl0cnkgewotCQkJCQkJSVJlc291cmNlW10gbWVtYmVycyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0JCQkJCQlTdHJpbmcgZW50ZXJlZEZpbGVVcHBlciA9IGZpbGVOYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlTdHJpbmcgcmVzb3VyY2VVcHBlck5hbWUgPSBtZW1iZXJzW2ldLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpOwotCQkJCQkJCWlmIChyZXNvdXJjZVVwcGVyTmFtZS5lcXVhbHMoZW50ZXJlZEZpbGVVcHBlcikpIHsKLQkJCQkJCQkJcmV0dXJuIG1lbWJlcnNbaV0uZ2V0TmFtZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQkJU3RyaW5nIGZ1bGxGaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0JCQlpZiAoIWV4dGVuc2lvblZhbGlkRm9yQ29udGVudFR5cGUoZnVsbEZpbGVOYW1lKSkgewotCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChYTUxXaXphcmRzTWVzc2FnZXMuX0VSUk9SX0JBRF9GSUxFTkFNRV9FWFRFTlNJT04sIGdldFZhbGlkRXh0ZW5zaW9ucygpLnRvU3RyaW5nKCkpKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkvLyBubyBmaWxlRXh0ZW5zaW9uLCBsZXQncyBjaGVjayBmb3IgdGhpcyBmaWxlIHdpdGggZGVmYXVsdCBmaWxlCi0JCQkvLyBleHRlbnNpb24KLQkJCWZ1bGxGaWxlTmFtZSArPSBkZWZhdWx0RmlsZUV4dGVuc2lvbjsKLQkJCWlmICgoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSAhPSBudWxsKSAmJiAoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS5pc0VtcHR5KCkgPT0gZmFsc2UpICYmIChnZXRGaWxlTmFtZSgpLmNvbXBhcmVUbygiIikgIT0gMCkpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlQYXRoIGZ1bGxQYXRoID0gbmV3IFBhdGgoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS50b1N0cmluZygpICsgJy8nICsgZnVsbEZpbGVOYW1lKTsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZnVsbFBhdGgpOwotCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShYTUxXaXphcmRzTWVzc2FnZXMuX0VSUk9SX0ZJTEVfQUxSRUFEWV9FWElTVFMpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBjaGVjayBmb3IgZmlsZSBzaG91bGQgYmUgY2FzZSBpbnNlbnNpdGl2ZQotCQkJU3RyaW5nIHNhbWVOYW1lID0gZXhpc3RzRmlsZUFueUNhc2UoZnVsbEZpbGVOYW1lKTsKLQkJCWlmIChzYW1lTmFtZSAhPSBudWxsKSB7Ci0JCQkJLy8gSVNTVUU6IGlzIHF1YWxpdGlmZWRGaWxlTmFtZSBub3QgbmVlZGVkLCBvciBpcyBpdCBzdXBwb3NlZAotCQkJCS8vIHRvIGJlIHVzZWQgaW4gZXJyb3IgbWVzc2FnZT8KLQkJCQkvLyBTdHJpbmcgcXVhbGlmaWVkRmlsZU5hbWUgPQotCQkJCS8vIGdldENvbnRhaW5lckZ1bGxQYXRoKCkudG9TdHJpbmcoKSArICcvJyArIGZ1bGxGaWxlTmFtZTsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoWE1MV2l6YXJkc01lc3NhZ2VzLl9FUlJPUl9GSUxFX0FMUkVBRFlfRVhJU1RTICsgIiAiICsgc2FtZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlyZXR1cm4gc3VwZXIudmFsaWRhdGVQYWdlKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCS8vIGluaGVyaXQgZGVmYXVsdCBjb250YWluZXIgYW5kIG5hbWUgc3BlY2lmaWNhdGlvbiB3aWRnZXRzCi0JCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCQl0aGlzLnNldEZpbGVOYW1lKGNvbXB1dGVEZWZhdWx0RmlsZU5hbWUoKSk7Ci0JCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldCBsaXN0IG9mIHZhbGlkIGV4dGVuc2lvbnMgZm9yIFhNTCBDb250ZW50IHR5cGUKLQkJICogCi0JCSAqIEByZXR1cm4gTGlzdAotCQkgKi8KLQkJTGlzdCBnZXRWYWxpZEV4dGVuc2lvbnMoKSB7Ci0JCQlpZiAoZlZhbGlkRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKTsKLQkJCQlmVmFsaWRFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RmlsZVNwZWNzKElDb250ZW50VHlwZS5GSUxFX0VYVEVOU0lPTl9TUEVDKSkpOwotCQkJfQotCQkJcmV0dXJuIGZWYWxpZEV4dGVuc2lvbnM7Ci0JCX0KLQotCQkvKioKLQkJICogVmVyaWZpZXMgaWYgZmlsZU5hbWUgaXMgdmFsaWQgbmFtZSBmb3IgY29udGVudCB0eXBlLiBUYWtlcyBiYXNlCi0JCSAqIGNvbnRlbnQgdHlwZSBpbnRvIGNvbnNpZGVyYXRpb24uCi0JCSAqIAotCQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkJICogQHJldHVybiB0cnVlIGlmIGV4dGVuc2lvbiBpcyB2YWxpZCBmb3IgdGhpcyBjb250ZW50IHR5cGUKLQkJICovCi0JCWJvb2xlYW4gZXh0ZW5zaW9uVmFsaWRGb3JDb250ZW50VHlwZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJCWJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQotCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKTsKLQkJCS8vIHRoZXJlIGlzIGN1cnJlbnRseSBhbiBleHRlbnNpb24KLQkJCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICE9IC0xKSB7Ci0JCQkJLy8gY2hlY2sgd2hhdCBjb250ZW50IHR5cGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggY3VycmVudAotCQkJCS8vIGV4dGVuc2lvbgotCQkJCUlDb250ZW50VHlwZVtdIHR5cGVzID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlc0ZvcihmaWxlTmFtZSk7Ci0JCQkJaW50IGkgPSAwOwotCQkJCXdoaWxlICgoaSA8IHR5cGVzLmxlbmd0aCkgJiYgIXZhbGlkKSB7Ci0JCQkJCXZhbGlkID0gdHlwZXNbaV0uaXNLaW5kT2YodHlwZSk7Ci0JCQkJCSsraTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2YWxpZCA9IHRydWU7IC8vIG5vIGV4dGVuc2lvbiBzbyB2YWxpZAotCQkJfQotCQkJcmV0dXJuIHZhbGlkOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYTUxHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WE1MR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNmE0MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYTUxHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNvbnRlbnRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNvbnRlbnRCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01Db250ZW50QnVpbGRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgTmV3WE1MR2VuZXJhdG9yIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgZ3JhbW1hclVSSTsKLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudCBjbURvY3VtZW50OwotCXByb3RlY3RlZCBpbnQgYnVpbGRQb2xpY3k7Ci0JcHJvdGVjdGVkIFN0cmluZyByb290RWxlbWVudE5hbWU7Ci0KLQlwcm90ZWN0ZWQgSUNhdGFsb2dFbnRyeSB4bWxDYXRhbG9nRW50cnk7Ci0KLQkvLyBpbmZvIGZvciBkdGQKLQlwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY0lkOwotCXByb3RlY3RlZCBTdHJpbmcgc3lzdGVtSWQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0U3lzdGVtSWQ7Ci0KLQkvLyBpbmZvIGZvciB4c2QKLQlwdWJsaWMgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdDsKLQotCXB1YmxpYyBOZXdYTUxHZW5lcmF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE5ld1hNTEdlbmVyYXRvcihTdHJpbmcgZ3JhbW1hclVSSSwgQ01Eb2N1bWVudCBjbURvY3VtZW50KSB7Ci0JCXRoaXMuZ3JhbW1hclVSSSA9IGdyYW1tYXJVUkk7Ci0JCXRoaXMuY21Eb2N1bWVudCA9IGNtRG9jdW1lbnQ7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudChTdHJpbmcgdXJpLCBTdHJpbmdbXSBlcnJvckluZm8pIHsKLQkJU3RyaW5nIHRpdGxlID0gbnVsbDsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotCQlMaXN0IGVycm9yTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gbnVsbDsKLQotCQlpZiAoVVJJSGVscGVyLmlzUmVhZGFibGVVUkkodXJpLCB0cnVlKSkgewotCQkJLy8gKGNzKSBhc3N1bWUgdGhlIHVyaSBoYXMgYmVlbiBwcm92aWRlZCBpbiBhIG5vcm1hbGl6ZWQgZm9ybQotCQkJY21Eb2N1bWVudCA9IENvbnRlbnRNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDTURvY3VtZW50KHVyaSwgbnVsbCk7Ci0KLQkJCWlmICh1cmkuZW5kc1dpdGgoIi5kdGQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGVycm9yTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJCXRpdGxlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9JTlZBTElEX0dSQU1NQVJfRVJST1I7Ci0JCQkJCW1lc3NhZ2UgPSBYTUxXaXphcmRzTWVzc2FnZXMuX1VJX0xBQkVMX0VSUk9SX0RURF9JTlZBTElEX0lORk87Ci0JCQkJfQotCQkJfQotCQkJZWxzZSAvLyAiLnhzZCIKLQkJCXsKLQkJCQkvLyBUbyBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHNjaGVtYSBlZGl0b3IgdmFsaWRhdGlvbgotCQkJCVhNTFNjaGVtYVZhbGlkYXRpb25DaGVja2VyIHZhbGlkYXRvciA9IG5ldyBYTUxTY2hlbWFWYWxpZGF0aW9uQ2hlY2tlcigpOwotCQkJCWlmICghdmFsaWRhdG9yLmlzVmFsaWQodXJpKSkgewotCQkJCQl0aXRsZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfSU5WQUxJRF9HUkFNTUFSX0VSUk9SOwotCQkJCQltZXNzYWdlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9MQUJFTF9FUlJPUl9TQ0hFTUFfSU5WQUxJRF9JTkZPOwotCQkJCX0KLQkJCQllbHNlIGlmIChjbURvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJaW50IGdsb2JhbEVsZW1lbnRDb3VudCA9IGNtRG9jdW1lbnQuZ2V0RWxlbWVudHMoKS5nZXRMZW5ndGgoKTsKLQkJCQkJaWYgKGdsb2JhbEVsZW1lbnRDb3VudCA9PSAwKSB7Ci0JCQkJCQl0aXRsZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0FSTklOR19USVRMRV9OT19ST09UX0VMRU1FTlRTOwotCQkJCQkJbWVzc2FnZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0FSTklOR19NU0dfTk9fUk9PVF9FTEVNRU5UUzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRpdGxlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XQVJOSU5HX1RJVExFX05PX1JPT1RfRUxFTUVOVFM7Ci0JCQltZXNzYWdlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XQVJOSU5HX1VSSV9OT1RfRk9VTkRfQ09MT04gKyAiICIgKyB1cmk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllcnJvckluZm9bMF0gPSB0aXRsZTsKLQkJZXJyb3JJbmZvWzFdID0gbWVzc2FnZTsKLQotCQlyZXR1cm4gY21Eb2N1bWVudDsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYXBwbHlMaW5lRGVsaW1pdGVyKElGaWxlIGZpbGUsIFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0U3RyaW5nKFBsYXRmb3JtLlBJX1JVTlRJTUUsIFBsYXRmb3JtLlBSRUZfTElORV9TRVBBUkFUT1IsIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSwgbmV3IElTY29wZUNvbnRleHRbXSB7bmV3IFByb2plY3RTY29wZShmaWxlLmdldFByb2plY3QoKSksIG5ldyBJbnN0YW5jZVNjb3BlKCkgfSk7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY29udmVydGVkVGV4dCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UodGV4dCwgIlxyXG4iLCAiXG4iKTsKLQkJY29udmVydGVkVGV4dCA9IFN0cmluZ1V0aWxzLnJlcGxhY2UoY29udmVydGVkVGV4dCwgIlxyIiwgIlxuIik7Ci0JCWNvbnZlcnRlZFRleHQgPSBTdHJpbmdVdGlscy5yZXBsYWNlKGNvbnZlcnRlZFRleHQsICJcbiIsIGxpbmVEZWxpbWl0ZXIpOwotCQlyZXR1cm4gY29udmVydGVkVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgY3JlYXRlVGVtcGxhdGVYTUxEb2N1bWVudChJRmlsZSwgU3RyaW5nKSBpbnN0ZWFkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlRW1wdHlYTUxEb2N1bWVudChJRmlsZSBuZXdGaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNoYXJTZXQgPSBnZXRVc2VyUHJlZmVycmVkQ2hhcnNldCgpOwotCQlTdHJpbmcgY29udGVudHMgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiIiArIGNoYXJTZXQgKyAiXCI/PiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQljcmVhdGVUZW1wbGF0ZVhNTERvY3VtZW50KG5ld0ZpbGUsIGNvbnRlbnRzKTsKLQl9Ci0JCi0Jdm9pZCBjcmVhdGVUZW1wbGF0ZVhNTERvY3VtZW50KElGaWxlIG5ld0ZpbGUsIFN0cmluZyBjb250ZW50cykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY2hhclNldCA9IGdldFVzZXJQcmVmZXJyZWRDaGFyc2V0KCk7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQotCQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtLCBjaGFyU2V0KSk7Ci0JCQljb250ZW50cyA9IGFwcGx5TGluZURlbGltaXRlcihuZXdGaWxlLCBjb250ZW50cyk7Ci0JCQl3cml0ZXIucHJpbnRsbihjb250ZW50cyk7Ci0JCQl3cml0ZXIuZmx1c2goKTsKLQkJCW91dHB1dFN0cmVhbS5jbG9zZSgpOwotCQotCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkpOwotCQkJbmV3RmlsZS5zZXRDb250ZW50cyhpbnB1dFN0cmVhbSwgdHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VXNlclByZWZlcnJlZENoYXJzZXQoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2UgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTdHJpbmcgY2hhclNldCA9IHByZWZlcmVuY2UuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQkJcmV0dXJuIGNoYXJTZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlWE1MRG9jdW1lbnQoU3RyaW5nIHhtbEZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKHhtbEZpbGVOYW1lKTsKLQkJU3RyaW5nIGNoYXJzZXQgPSBudWxsOwotCQlpZiAoY29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJY2hhcnNldCA9IGNvbnRlbnRUeXBlLmdldERlZmF1bHRDaGFyc2V0KCk7Ci0JCX0KLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IGNyZWF0ZVhNTERvY3VtZW50KHhtbEZpbGVOYW1lLCBjaGFyc2V0KTsKLQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh4bWxGaWxlTmFtZSk7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0JCW91dHB1dFN0cmVhbS53cml0ZVRvKGZvcyk7Ci0JCWZvcy5jbG9zZSgpOwotCX0KLQotCi0JcHVibGljIHZvaWQgY3JlYXRlWE1MRG9jdW1lbnQoSUZpbGUgbmV3RmlsZSwgU3RyaW5nIHhtbEZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNoYXJzZXQgPSBuZXdGaWxlLmdldENoYXJzZXQoKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IGNyZWF0ZVhNTERvY3VtZW50KHhtbEZpbGVOYW1lLCBjaGFyc2V0KTsKLQotCQlTdHJpbmcgY29udGVudHMgPSBvdXRwdXRTdHJlYW0udG9TdHJpbmcoY2hhcnNldCk7Ci0JCWNvbnRlbnRzID0gYXBwbHlMaW5lRGVsaW1pdGVyKG5ld0ZpbGUsIGNvbnRlbnRzKTsKLQotCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50cy5nZXRCeXRlcyhjaGFyc2V0KSk7Ci0JCW5ld0ZpbGUuc2V0Q29udGVudHMoaW5wdXRTdHJlYW0sIHRydWUsIHRydWUsIG51bGwpOwotCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCX0KLQotCi0JcHVibGljIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBjcmVhdGVYTUxEb2N1bWVudChTdHJpbmcgeG1sRmlsZU5hbWUsIFN0cmluZyBjaGFyc2V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGNoYXJzZXQgPT0gbnVsbCkgewotCQkJY2hhcnNldCA9IGdldFVzZXJQcmVmZXJyZWRDaGFyc2V0KCk7Ci0JCQlpZiAoY2hhcnNldCA9PSBudWxsKSB7Ci0JCQkJY2hhcnNldCA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBnZXRDTURvY3VtZW50KCk7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChjbURvY3VtZW50KTsKLQkJQXNzZXJ0LmlzTm90TnVsbChnZXRSb290RWxlbWVudE5hbWUoKSk7Ci0KLQkJLy8gY3JlYXRlIHRoZSB4bWwgbW9kZWwKLQkJQ01OYW1lZE5vZGVNYXAgbmFtZU5vZGVNYXAgPSBjbURvY3VtZW50LmdldEVsZW1lbnRzKCk7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGNtRWxlbWVudERlY2xhcmF0aW9uID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBuYW1lTm9kZU1hcC5nZXROYW1lZEl0ZW0oZ2V0Um9vdEVsZW1lbnROYW1lKCkpOwotCi0JCURvY3VtZW50IHhtbERvY3VtZW50ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0JCURPTUNvbnRlbnRCdWlsZGVySW1wbCBjb250ZW50QnVpbGRlciA9IG5ldyBET01Db250ZW50QnVpbGRlckltcGwoeG1sRG9jdW1lbnQpOwotCi0JCS8vIHRoaXMgJ3VnbHlUZW1wSGFjaycgZmxhZyBpcyByZXF1aXJlZCBpbiBvcmRlciB0byBzdXByZXNzIHRoZQotCQkvLyBjcmVhdGlvbiBhIGRlZmF1bHQgZW5jb2RpbmcKLQkJLy8gd2UnbGwgaGFuZGxlIHRoaXMgbGF0ZXIgaW4gdGhlIGRvbVdyaXRlci5wcmludCgpIG1ldGhvZCB1c2VkIGJlbG93Ci0JCS8vCi0JCWNvbnRlbnRCdWlsZGVyLnN1cHJlc3NDcmVhdGlvbk9mRG9jdHlwZUFuZFhNTERlY2xhcmF0aW9uID0gdHJ1ZTsKLQkJY29udGVudEJ1aWxkZXIuc2V0QnVpbGRQb2xpY3koYnVpbGRQb2xpY3kpOwotCQljb250ZW50QnVpbGRlci5zZXRFeHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0KG5ldyBNeUV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQobmFtZXNwYWNlSW5mb0xpc3QsIHhtbEZpbGVOYW1lKSk7Ci0JCWNvbnRlbnRCdWlsZGVyLmNyZWF0ZURlZmF1bHRSb290Q29udGVudChjbURvY3VtZW50LCBjbUVsZW1lbnREZWNsYXJhdGlvbiwgbmFtZXNwYWNlSW5mb0xpc3QpOwotCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCU91dHB1dFN0cmVhbVdyaXRlciBvdXRwdXRTdHJlYW1Xcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSwgY2hhcnNldCk7Ci0KLQkJRE9NV3JpdGVyIGRvbVdyaXRlciA9IG5ldyBET01Xcml0ZXIob3V0cHV0U3RyZWFtV3JpdGVyKTsKLQotCQkvLyBUT0RPLi4uIGluc3RlYWQgb2YgcmVseWluZyBvbiBmaWxlIGV4dGVuc2lvbnMsIHdlIG5lZWQgdG8ga2VlcAotCQkvLyB0cmFjayBvZiB0aGUgZ3JhbW1hciB0eXBlCi0JCS8vIGJldHRlciB5ZXQgd2Ugc2hvdWxkIHJlYXRlIGFuIFNTRSBkb2N1bWVudCBzbyB0aGF0IHdlIGNhbiBmb3JtYXQgaXQKLQkJLy8gbmljZWx5IGJlZm9yZSBzYXZpbmcKLQkJLy8gdGhlbiB3ZSB3b24ndCBuZWVkIHRoZSBET01Xcml0ZXIgYXQgYWxsCi0JCS8vCi0JCWRvbVdyaXRlci5wcmludCh4bWxEb2N1bWVudCwgY2hhcnNldCwgY21Eb2N1bWVudC5nZXROb2RlTmFtZSgpLCBnZXROb25XaGl0ZXNwYWNlU3RyaW5nKGdldFB1YmxpY0lkKCkpLCBnZXROb25XaGl0ZXNwYWNlU3RyaW5nKGdldFN5c3RlbUlkKCkpKTsKLQkJb3V0cHV0U3RyZWFtLmZsdXNoKCk7Ci0JCW91dHB1dFN0cmVhbS5jbG9zZSgpOwotCi0JCXJldHVybiBvdXRwdXRTdHJlYW07Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBjcmVhdGVOYW1lc3BhY2VJbmZvTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgVmVjdG9yKCk7Ci0JCWlmIChjbURvY3VtZW50ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IChMaXN0KSBjbURvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvY29tcGxldGVOYW1lc3BhY2VJbmZvIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gcmVzdWx0LnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgcmVzdWx0LmdldChpKTsKLQkJCQkJaWYgKGkgPT0gMCkgewotCQkJCQkJU3RyaW5nIGxvY2F0aW9uSW5mbyA9IG51bGw7Ci0JCQkJCQlpZiAoeG1sQ2F0YWxvZ0VudHJ5ICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoeG1sQ2F0YWxvZ0VudHJ5LmdldEVudHJ5VHlwZSgpID09IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUMpIHsKLQkJCQkJCQkJbG9jYXRpb25JbmZvID0geG1sQ2F0YWxvZ0VudHJ5LmdldEF0dHJpYnV0ZVZhbHVlKElDYXRhbG9nRW50cnkuQVRUUl9XRUJfVVJMKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWxvY2F0aW9uSW5mbyA9IHhtbENhdGFsb2dFbnRyeS5nZXRLZXkoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobG9jYXRpb25JbmZvID09IG51bGwpIHsKLQkJCQkJCQlsb2NhdGlvbkluZm8gPSBkZWZhdWx0U3lzdGVtSWQ7Ci0JCQkJCQl9Ci0JCQkJCQlpbmZvLmxvY2F0aW9uSGludCA9IGxvY2F0aW9uSW5mbzsKLQkJCQkJCWluZm8uc2V0UHJvcGVydHkoImxvY2F0aW9uSGludC1yZWFkT25seSIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJaW5mby5zZXRQcm9wZXJ0eSgidXJpLXJlYWRPbmx5IiwgInRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlpbmZvLnNldFByb3BlcnR5KCJ1bnJlbW92YWJsZSIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9IGVsc2UgewotCQkJCQkJaW5mby5sb2NhdGlvbkhpbnQgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlOYW1lc3BhY2VJbmZvQ29udGVudEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBOYW1lc3BhY2VJbmZvQ29udGVudEJ1aWxkZXIoKTsKLQkJCWJ1aWxkZXIuc2V0QnVpbGRQb2xpY3koQ29udGVudEJ1aWxkZXIuQlVJTERfT05MWV9SRVFVSVJFRF9DT05URU5UKTsKLQkJCWJ1aWxkZXIudmlzaXRDTU5vZGUoY21Eb2N1bWVudCk7Ci0JCQlyZXN1bHQuYWRkQWxsKGJ1aWxkZXIubGlzdCk7Ci0JCX0KLQkJbmFtZXNwYWNlSW5mb0xpc3QgPSByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBpc01pc3NpbmdOYW1lc3BhY2VMb2NhdGlvbigpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvciBpID0gbmFtZXNwYWNlSW5mb0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0JCQlpZiAoaW5mby5sb2NhdGlvbkhpbnQgPT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXROYW1lc3BhY2VJbmZvRXJyb3JzKCkgewotCQlTdHJpbmdbXSBlcnJvckxpc3QgPSBudWxsOwotCi0vLyBObyB3YXJuaW5ncyBzaG91bGQgYmUgZ2l2ZW4gd2hlbiBuYW1lc3BhY2VzIGVudHJpZXMgaGF2ZSBtaXNzaW5nIGxvY2F0aW9uIGhpbnRzCi0vLyBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNTEyOAkJCi0vLwkJaWYgKChuYW1lc3BhY2VJbmZvTGlzdCAhPSBudWxsKSAmJiBpc01pc3NpbmdOYW1lc3BhY2VMb2NhdGlvbigpKSB7Ci0vLwkJCVN0cmluZyB0aXRsZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfTEFCRUxfTk9fTE9DQVRJT05fSElOVDsKLS8vCQkJU3RyaW5nIG1lc3NhZ2UgPSBYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dBUk5JTkdfTVNHX05PX0xPQ0FUSU9OX0hJTlRfMSArICIgIiArIFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0FSTklOR19NU0dfTk9fTE9DQVRJT05fSElOVF8yICsgIlxuXG4iICsgWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XQVJOSU5HX01TR19OT19MT0NBVElPTl9ISU5UXzM7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotLy8KLS8vCQkJZXJyb3JMaXN0ID0gbmV3IFN0cmluZ1syXTsKLS8vCQkJZXJyb3JMaXN0WzBdID0gdGl0bGU7Ci0vLwkJCWVycm9yTGlzdFsxXSA9IG1lc3NhZ2U7Ci0vLwkJfQotCQlyZXR1cm4gZXJyb3JMaXN0OwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0WE1MQ2F0YWxvZ0VudHJ5KElDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5KSB7Ci0JCXhtbENhdGFsb2dFbnRyeSA9IGNhdGFsb2dFbnRyeTsKLQl9Ci0KLQlwdWJsaWMgSUNhdGFsb2dFbnRyeSBnZXRYTUxDYXRhbG9nRW50cnkoKSB7Ci0JCXJldHVybiB4bWxDYXRhbG9nRW50cnk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRCdWlsZFBvbGljeShpbnQgcG9saWN5KSB7Ci0JCWJ1aWxkUG9saWN5ID0gcG9saWN5OwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFN5c3RlbUlkKFN0cmluZyBzeXNJZCkgewotCQlkZWZhdWx0U3lzdGVtSWQgPSBzeXNJZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRTeXN0ZW1JZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JZChTdHJpbmcgc3lzSWQpIHsKLQkJc3lzdGVtSWQgPSBzeXNJZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotCQlyZXR1cm4gc3lzdGVtSWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHVibGljSWQoU3RyaW5nIHB1YklkKSB7Ci0JCXB1YmxpY0lkID0gcHViSWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJcmV0dXJuIHB1YmxpY0lkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdyYW1tYXJVUkkoU3RyaW5nIGdyYW1VUkkpIHsKLQkJZ3JhbW1hclVSSSA9IGdyYW1VUkk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRHcmFtbWFyVVJJKCkgewotCQlyZXR1cm4gZ3JhbW1hclVSSTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDTURvY3VtZW50KENNRG9jdW1lbnQgY21Eb2MpIHsKLQkJY21Eb2N1bWVudCA9IGNtRG9jOwotCX0KLQotCXB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBjbURvY3VtZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJvb3RFbGVtZW50TmFtZShTdHJpbmcgcm9vdE5hbWUpIHsKLQkJcm9vdEVsZW1lbnROYW1lID0gcm9vdE5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSb290RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiByb290RWxlbWVudE5hbWU7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgY2xhc3MgTXlFeHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0IGltcGxlbWVudHMgRE9NQ29udGVudEJ1aWxkZXJJbXBsLkV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQgewotCQlwcm90ZWN0ZWQgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdDE7Ci0JCXByb3RlY3RlZCBVUklSZXNvbHZlciBpZFJlc29sdmVyOwotCQlwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlTG9jYXRpb247Ci0KLQkJcHJvdGVjdGVkIE15RXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydChMaXN0IG5hbWVzcGFjZUluZm9MaXN0UGFyYW0sIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uKSB7Ci0JCQl0aGlzLm5hbWVzcGFjZUluZm9MaXN0MSA9IG5hbWVzcGFjZUluZm9MaXN0UGFyYW07Ci0JCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCQkJaWRSZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotCQkJQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQkJaWYgKChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVVSSS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotCQkJCVN0cmluZyBsb2NhdGlvbkhpbnQgPSBudWxsOwotCQkJCWZvciAoSXRlcmF0b3IgaSA9IG5hbWVzcGFjZUluZm9MaXN0MS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotCQkJCQlpZiAobmFtZXNwYWNlVVJJLmVxdWFscyhpbmZvLnVyaSkpIHsKLQkJCQkJCWxvY2F0aW9uSGludCA9IGluZm8ubG9jYXRpb25IaW50OwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGxvY2F0aW9uSGludCAhPSBudWxsKSB7Ci0JCQkJCWdyYW1tYXJVUkkgPSBpZFJlc29sdmVyLnJlc29sdmUocmVzb3VyY2VMb2NhdGlvbiwgbG9jYXRpb25IaW50LCBsb2NhdGlvbkhpbnQpOwotCQkJCQlyZXN1bHQgPSBDb250ZW50TW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlQ01Eb2N1bWVudChnZXRHcmFtbWFyVVJJKCksIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlc3VsdCA9IGNtRG9jdW1lbnQ7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Tm9uV2hpdGVzcGFjZVN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAoc3RyaW5nICE9IG51bGwpIHsKLQkJCWlmIChzdHJpbmcudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCXJlc3VsdCA9IHN0cmluZzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WE1MSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYTUxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YzI2NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYTUxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uLCBidWcgMjEyMzMwCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBOZXdYTUxIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSUhhbmRsZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIE5ld1hNTEhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXIjZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gCUhhbmRsZXJVdGlsLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdyhldmVudCk7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gd29ya2JlbmNoV2luZG93LmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gZ2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0KLQkJaWYgKChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElGaWxlKSAmJiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKSB7Ci0JCQlJRmlsZSBmaWxlID0gKElGaWxlKSBzZWxlY3RlZE9iamVjdDsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCXRyeSB7Ci0JCQkJTmV3WE1MV2l6YXJkLnNob3dEaWFsb2cod29ya2JlbmNoV2luZG93LmdldFNoZWxsKCksIGZpbGUsIHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IAotCi0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIGVzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlJdGVyYXRvciBpID0gZXMuaXRlcmF0b3IoKTsKLQkJCWlmIChpLmhhc05leHQoKSkgewotCQkJCXJlc3VsdCA9IGkubmV4dCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI5YTAxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTDsKLQotLyoqCi0gKiBUZW1wbGF0ZXMgcGFnZSBpbiBuZXcgZmlsZSB3aXphcmQuIEFsbG93cyB1c2VycyB0byBzZWxlY3QgYSBuZXcgZmlsZQotICogdGVtcGxhdGUgdG8gYmUgYXBwbGllZCBpbiBuZXcgZmlsZS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogQ29udGVudCBwcm92aWRlciBmb3IgdGVtcGxhdGVzCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUZW1wbGF0ZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQkJLyoqIFRoZSB0ZW1wbGF0ZSBzdG9yZS4gKi8KLQkJcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZTdG9yZTsKLQotCQkvKgotCQkgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJZlN0b3JlID0gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dCkgewotCQkJcmV0dXJuIGZTdG9yZS5nZXRUZW1wbGF0ZXMoVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5ORVcpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQlmU3RvcmUgPSAoVGVtcGxhdGVTdG9yZSkgbmV3SW5wdXQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMYWJlbCBwcm92aWRlciBmb3IgdGVtcGxhdGVzLgotCSAqLwotCXByaXZhdGUgY2xhc3MgVGVtcGxhdGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgaW50KQotCQkgKi8KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGludCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IChUZW1wbGF0ZSkgZWxlbWVudDsKLQotCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCXJldHVybiB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJcmV0dXJuIHRlbXBsYXRlLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqIExhc3Qgc2VsZWN0ZWQgdGVtcGxhdGUgbmFtZSAqLwotCXByaXZhdGUgU3RyaW5nIGZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWU7Ci0JLyoqIFRoZSB2aWV3ZXIgZGlzcGxheXMgdGhlIHBhdHRlcm4gb2Ygc2VsZWN0ZWQgdGVtcGxhdGUuICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgZlBhdHRlcm5WaWV3ZXI7Ci0JLyoqIFRoZSB0YWJsZSBwcmVzZW50aW5nIHRoZSB0ZW1wbGF0ZXMuICovCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBmVGFibGVWaWV3ZXI7Ci0JLyoqIFRlbXBsYXRlIHN0b3JlIHVzZWQgYnkgdGhpcyB3aXphcmQgcGFnZSAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQkvKiogQ2hlY2tib3ggZm9yIHVzaW5nIHRlbXBsYXRlcy4gKi8KLQlwcml2YXRlIEJ1dHRvbiBmVXNlVGVtcGxhdGVCdXR0b247Ci0KLQlwdWJsaWMgTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZSgpIHsKLQkJc3VwZXIoIk5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2UiLCBYTUxXaXphcmRzTWVzc2FnZXMuTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8wLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihYTUxXaXphcmRzTWVzc2FnZXMuTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8xKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3JyZWN0bHkgcmVzaXplcyB0aGUgdGFibGUgc28gbm8gcGhhbnRvbSBjb2x1bW5zIGFwcGVhcgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBidXR0b25zCi0JICogICAgICAgICAgICB0aGUgYnV0dG9ucwotCSAqIEBwYXJhbSB0YWJsZQotCSAqICAgICAgICAgICAgdGhlIHRhYmxlCi0JICogQHBhcmFtIGNvbHVtbjEKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMgotCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMwotCSAqICAgICAgICAgICAgdGhlIHRoaXJkIGNvbHVtbgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmVUYWJsZVJlc2l6aW5nKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFRhYmxlIHRhYmxlLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yKSB7Ci0JCXBhcmVudC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlSZWN0YW5nbGUgYXJlYSA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJUG9pbnQgcHJlZmVycmVkU2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJaW50IHdpZHRoID0gYXJlYS53aWR0aCAtIDIgKiB0YWJsZS5nZXRCb3JkZXJXaWR0aCgpOwotCQkJCWlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCkgewotCQkJCQkvLyBTdWJ0cmFjdCB0aGUgc2Nyb2xsYmFyIHdpZHRoIGZyb20gdGhlIHRvdGFsIGNvbHVtbgotCQkJCQkvLyB3aWR0aAotCQkJCQkvLyBpZiBhIHZlcnRpY2FsIHNjcm9sbGJhciB3aWxsIGJlIHJlcXVpcmVkCi0JCQkJCVBvaW50IHZCYXJTaXplID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCk7Ci0JCQkJCXdpZHRoIC09IHZCYXJTaXplLng7Ci0JCQkJfQotCi0JCQkJUG9pbnQgb2xkU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCQlpZiAob2xkU2l6ZS54ID4gd2lkdGgpIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBzbWFsbGVyIHNvIG1ha2UgdGhlIGNvbHVtbnMKLQkJCQkJLy8gc21hbGxlciBmaXJzdCBhbmQgdGhlbiByZXNpemUgdGhlIHRhYmxlIHRvCi0JCQkJCS8vIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJdGFibGUuc2V0U2l6ZSh3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBiaWdnZXIgc28gbWFrZSB0aGUgdGFibGUKLQkJCQkJLy8gYmlnZ2VyIGZpcnN0IGFuZCB0aGVuIG1ha2UgdGhlIGNvbHVtbnMgd2lkZXIKLQkJCQkJLy8gdG8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCXRhYmxlLnNldFNpemUod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShhbmNlc3RvciwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIGNyZWF0ZSBjaGVja2JveCBmb3IgdXNlciB0byB1c2UgWE1MIFRlbXBsYXRlCi0JCWZVc2VUZW1wbGF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV80KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllbmFibGVUZW1wbGF0ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIGNvbXBvc2l0ZSBmb3IgVGVtcGxhdGVzIHRhYmxlCi0JCUNvbXBvc2l0ZSBpbm5lclBhcmVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgaW5uZXJMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlpbm5lckxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJaW5uZXJMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJaW5uZXJMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlpbm5lclBhcmVudC5zZXRMYXlvdXQoaW5uZXJMYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpOwotCQlpbm5lclBhcmVudC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkvLyBDcmVhdGUgbGlua2VkIHRleHQgdG8ganVzdCB0byB0ZW1wbGF0ZXMgcHJlZmVyZW5jZSBwYWdlCi0JCUxpbmsgbGluayA9IG5ldyBMaW5rKGlubmVyUGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxpbmsuc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV82KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWxpbmtDbGlja2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSB0aGF0IGRpc3BsYXlzIHRlbXBsYXRlcwotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShpbm5lclBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxMCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4xLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLk5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMik7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4yLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLk5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMyk7Ci0KLQkJZlRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJZlRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFRlbXBsYXRlTGFiZWxQcm92aWRlcigpKTsKLQkJZlRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGVtcGxhdGVDb250ZW50UHJvdmlkZXIoKSk7Ci0KLQkJZlRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MikgewotCQkJCWlmICgob2JqZWN0MSBpbnN0YW5jZW9mIFRlbXBsYXRlKSAmJiAob2JqZWN0MiBpbnN0YW5jZW9mIFRlbXBsYXRlKSkgewotCQkJCQlUZW1wbGF0ZSBsZWZ0ID0gKFRlbXBsYXRlKSBvYmplY3QxOwotCQkJCQlUZW1wbGF0ZSByaWdodCA9IChUZW1wbGF0ZSkgb2JqZWN0MjsKLQkJCQkJaW50IHJlc3VsdCA9IGxlZnQuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQl9Ci0JCQkJCXJldHVybiBsZWZ0LmdldERlc2NyaXB0aW9uKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBvYmplY3QxLCBvYmplY3QyKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNTb3J0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0pOwotCi0JCWZUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJdXBkYXRlVmlld2VySW5wdXQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIHZpZXdlciB0aGF0IGRpc3BsYXlzIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZSdzIGNvbnRlbnRzCi0JCWZQYXR0ZXJuVmlld2VyID0gZG9DcmVhdGVWaWV3ZXIocGFyZW50KTsKLQotCQlmVGVtcGxhdGVTdG9yZSA9IFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWZUYWJsZVZpZXdlci5zZXRJbnB1dChmVGVtcGxhdGVTdG9yZSk7Ci0KLQkJY29uZmlndXJlVGFibGVSZXNpemluZyhpbm5lclBhcmVudCwgdGFibGUsIGNvbHVtbjEsIGNvbHVtbjIpOwotCQlsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSUhlbHBDb250ZXh0SWRzLlhNTF9ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlzZXRDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcywgY29uZmlndXJlcyBhbmQgcmV0dXJucyBhIHNvdXJjZSB2aWV3ZXIgdG8gcHJlc2VudCB0aGUgdGVtcGxhdGUKLQkgKiBwYXR0ZXJuIG9uIHRoZSBwcmVmZXJlbmNlIHBhZ2UuIENsaWVudHMgbWF5IG92ZXJyaWRlIHRvIHByb3ZpZGUgYQotCSAqIGN1c3RvbSBzb3VyY2Ugdmlld2VyIGZlYXR1cmluZyBlLmcuIHN5bnRheCBjb2xvcmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgY29uZmlndXJlZCBzb3VyY2Ugdmlld2VyCi0JICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwoKTsKLQotCQkJcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQkJfQotCQl9OwotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIpLmdldFRleHRXaWRnZXQoKS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnQoIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWRNb2RlbCBzY3JhdGNoTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gc2NyYXRjaE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQl2aWV3ZXIuY29uZmlndXJlKHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24pOwotCQl2aWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCXByaXZhdGUgU291cmNlVmlld2VyIGRvQ3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLk5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJU291cmNlVmlld2VyIHZpZXdlciA9IGNyZWF0ZVZpZXdlcihwYXJlbnQpOwotCQl2aWV3ZXIuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0JCUNvbnRyb2wgY29udHJvbCA9IHZpZXdlci5nZXRDb250cm9sKCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoNSk7Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZS9kaXNhYmxlIGNvbnRyb2xzIGluIHBhZ2UgYmFzZWQgb24gZlVzZVRlbXBsYXRlQnV0dG9uJ3MgY3VycmVudAotCSAqIHN0YXRlLgotCSAqLwotCXZvaWQgZW5hYmxlVGVtcGxhdGVzKCkgewotCQlib29sZWFuIGVuYWJsZWQgPSBmVXNlVGVtcGxhdGVCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJaWYgKCFlbmFibGVkKSB7Ci0JCQkvLyBzYXZlIGxhc3Qgc2VsZWN0ZWQgdGVtcGxhdGUKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWZUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obnVsbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRTZWxlY3RlZFRlbXBsYXRlKGZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUpOwotCQl9Ci0KLQkJZlRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmUGF0dGVyblZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRlbXBsYXRlIHByZWZlcmVuY2UgcGFnZSBpZAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlkKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sLnRlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZSBnZXRTZWxlY3RlZFRlbXBsYXRlKCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCXRlbXBsYXRlID0gKFRlbXBsYXRlKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHRlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGVtcGxhdGUgc3RyaW5nIHRvIGluc2VydC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0byBpbnNlcnQgb3IgbnVsbCBpZiBub25lIGlzIHRvIGJlIGluc2VydGVkCi0JICovCi0JU3RyaW5nIGdldFRlbXBsYXRlU3RyaW5nKCkgewotCQlTdHJpbmcgdGVtcGxhdGVTdHJpbmcgPSBudWxsOwotCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJVGVtcGxhdGVDb250ZXh0VHlwZSBjb250ZXh0VHlwZSA9IFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpLmdldENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuTkVXKTsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpOwotCQkJVGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBuZXcgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCAwLCAwKTsKLQkJCXRyeSB7Ci0JCQkJVGVtcGxhdGVCdWZmZXIgYnVmZmVyID0gY29udGV4dC5ldmFsdWF0ZSh0ZW1wbGF0ZSk7Ci0JCQkJdGVtcGxhdGVTdHJpbmcgPSBidWZmZXIuZ2V0U3RyaW5nKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wbGF0ZSBmb3IgbmV3IHhtbCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdGVtcGxhdGVTdHJpbmc7Ci0JfQotCi0Jdm9pZCBsaW5rQ2xpY2tlZCgpIHsKLQkJU3RyaW5nIHBhZ2VJZCA9IGdldFByZWZlcmVuY2VQYWdlSWQoKTsKLQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIHBhZ2VJZCwgbmV3IFN0cmluZ1tde3BhZ2VJZH0sIG51bGwpOwotCQlkaWFsb2cub3BlbigpOwotCQlmVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIGxhc3QgdGVtcGxhdGUgbmFtZSB1c2VkIGluIE5ldyBYTUwgRmlsZSB3aXphcmQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRMYXN0U2F2ZWRQcmVmZXJlbmNlcygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9IFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSk7Ci0JCWlmICgodGVtcGxhdGVOYW1lID09IG51bGwpIHx8ICh0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lOwotCQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQllbmFibGVUZW1wbGF0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRlbXBsYXRlIG5hbWUgdXNlZCBmb3IgbmV4dCBjYWxsIHRvIE5ldyBYTUwgRmlsZSB3aXphcmQuCi0JICovCi0Jdm9pZCBzYXZlTGFzdFNhdmVkUHJlZmVyZW5jZXMoKSB7Ci0JCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJdGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhNTFVJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUsIHRlbXBsYXRlTmFtZSk7Ci0JCVhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3QgYSB0ZW1wbGF0ZSBpbiB0aGUgdGFibGUgdmlld2VyIGdpdmVuIHRoZSB0ZW1wbGF0ZSBuYW1lLiBJZgotCSAqIHRlbXBsYXRlIG5hbWUgY2Fubm90IGJlIGZvdW5kIG9yIHRlbXBsYXRlTmFtZSBpcyBudWxsLCBqdXN0IHNlbGVjdAotCSAqIGZpcnN0IGl0ZW0gaW4gdGFibGUuIElmIG5vIGl0ZW1zIGluIHRhYmxlIHNlbGVjdCBub3RoaW5nLgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wbGF0ZU5hbWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWRUZW1wbGF0ZShTdHJpbmcgdGVtcGxhdGVOYW1lKSB7Ci0JCU9iamVjdCB0ZW1wbGF0ZSA9IG51bGw7Ci0KLQkJaWYgKCh0ZW1wbGF0ZU5hbWUgIT0gbnVsbCkgJiYgKHRlbXBsYXRlTmFtZS5sZW5ndGgoKSA+IDApKSB7Ci0JCQkvLyBwaWNrIHRoZSBsYXN0IHVzZWQgdGVtcGxhdGUKLQkJCXRlbXBsYXRlID0gZlRlbXBsYXRlU3RvcmUuZmluZFRlbXBsYXRlKHRlbXBsYXRlTmFtZSwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5ORVcpOwotCQl9Ci0KLQkJLy8gbm8gcmVjb3JkIG9mIGxhc3QgdXNlZCB0ZW1wbGF0ZSBzbyBqdXN0IHBpY2sgZmlyc3QgZWxlbWVudAotCQlpZiAodGVtcGxhdGUgPT0gbnVsbCkgewotCQkJLy8ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJCXRlbXBsYXRlID0gZlRhYmxlVmlld2VyLmdldEVsZW1lbnRBdCgwKTsKLQkJfQotCi0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0ZW1wbGF0ZSk7Ci0JCQlmVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBwYXR0ZXJuIHZpZXdlci4KLQkgKi8KLQl2b2lkIHVwZGF0ZVZpZXdlcklucHV0KCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCWZQYXR0ZXJuVmlld2VyLmdldERvY3VtZW50KCkuc2V0KHRlbXBsYXRlLmdldFBhdHRlcm4oKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WE1MV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hNTFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTFmODE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WE1MV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCSAgIERhdmlkIFNjaG5laWRlciwgZGF2aWQuc2NobmVpZGVyQHVuaXN5cy5jb20gLSBbMTQyNTAwXSBXVFAgcHJvcGVydGllcyBwYWdlcyBmb250cyBkb24ndCBmb2xsb3cgRWNsaXBzZSBwcmVmZXJlbmNlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZS5CYXNpY05ld1Jlc291cmNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01Db250ZW50QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MuTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9ncy5TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5uc2VkaXQuQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2c7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi1wdWJsaWMgY2xhc3MgTmV3WE1MV2l6YXJkIGV4dGVuZHMgTmV3TW9kZWxXaXphcmQgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENSRUFURV9GUk9NX0RURCA9IDA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ1JFQVRFX0ZST01fWFNEID0gMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDUkVBVEVfRlJPTV9TQ1JBVENIID0gMjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gY3JlYXRlRnJvbVJhZGlvQnV0dG9uTGFiZWwgPSB7WE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9SQURJT19YTUxfRlJPTV9EVEQsIFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfUkFESU9fWE1MX0ZST01fU0NIRU1BLCBYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1JBRElPX1hNTF9GUk9NX1NDUkFUQ0h9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBmaWxlUGFnZUZpbHRlckV4dGVuc2lvbnMgPSB7Ii54bWwifTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gYnJvd3NlWFNERmlsdGVyRXh0ZW5zaW9ucyA9IHsiLnhzZCJ9OyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBicm93c2VEVERGaWx0ZXJFeHRlbnNpb25zID0geyIuZHRkIn07IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBOZXdGaWxlUGFnZSBuZXdGaWxlUGFnZTsKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBjbGllbnRzIHNob3VsZCBub3QgYmUgYWxsb3dlZCB0byBjaGFuZ2Ugc3RhcnQgcGFnZQotCSAqLwotCXByb3RlY3RlZCBTdGFydFBhZ2Ugc3RhcnRQYWdlOwotCXByaXZhdGUgU3RhcnRQYWdlIGZDcmVhdGVYTUxGcm9tV2l6YXJkUGFnZTsKLQlwcm90ZWN0ZWQgU2VsZWN0R3JhbW1hckZpbGVQYWdlIHNlbGVjdEdyYW1tYXJGaWxlUGFnZTsKLQlwcm90ZWN0ZWQgU2VsZWN0Um9vdEVsZW1lbnRQYWdlIHNlbGVjdFJvb3RFbGVtZW50UGFnZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgY21Eb2N1bWVudEVycm9yTWVzc2FnZTsKLQotCXByb3RlY3RlZCBOZXdYTUxHZW5lcmF0b3IgZ2VuZXJhdG9yOwotCXByaXZhdGUgTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZSBmTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZTsKLQotCi0JcHVibGljIE5ld1hNTFdpemFyZCgpIHsKLQkJc2V0V2luZG93VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XSVpBUkRfQ1JFQVRFX05FV19USVRMRSk7Ci0JCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19XSVpCQU5fR0VORVJBVEVYTUwpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQkJZ2VuZXJhdG9yID0gbmV3IE5ld1hNTEdlbmVyYXRvcigpOwotCX0KLQotCi0JcHVibGljIE5ld1hNTFdpemFyZChJRmlsZSBmaWxlLCBDTURvY3VtZW50IGNtRG9jdW1lbnQpIHsKLQkJdGhpcygpOwotCi0JCWdlbmVyYXRvci5zZXRHcmFtbWFyVVJJKFVSSUhlbHBlci5nZXRQbGF0Zm9ybVVSSShmaWxlKSk7Ci0JCWdlbmVyYXRvci5zZXRDTURvY3VtZW50KGNtRG9jdW1lbnQpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNob3dEaWFsb2coU2hlbGwgc2hlbGwsIElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJU3RyaW5nW10gZXJyb3JJbmZvID0gbmV3IFN0cmluZ1syXTsKLQkJLy8gKGNzKSB0aGUgVVJJIGFyZ3VtZW50IHRvIGNyZWF0ZUNNRG9jdW1lbnQgbmVlZHMgdG8gYmUgYSBmdWxseQotCQkvLyBxdWFsaWZpZWQgVVJJCi0JCS8vCi0JCUNNRG9jdW1lbnQgY21Eb2N1bWVudCA9IE5ld1hNTEdlbmVyYXRvci5jcmVhdGVDTURvY3VtZW50KFVSSUhlbHBlci5nZXRQbGF0Zm9ybVVSSShmaWxlKSwgZXJyb3JJbmZvKTsKLQkJaWYgKGVycm9ySW5mb1swXSA9PSBudWxsKSB7Ci0JCQlOZXdYTUxXaXphcmQgd2l6YXJkID0gbmV3IE5ld1hNTFdpemFyZChmaWxlLCBjbURvY3VtZW50KTsKLQkJCXdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQkJd2l6YXJkLnNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfRElBTE9HX05FV19USVRMRSk7Ci0JCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQl9Ci0JCWVsc2UgewotCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oc2hlbGwsIGVycm9ySW5mb1swXSwgZXJyb3JJbmZvWzFdKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlTdHJpbmcgZ3JhbW1hclVSSSA9IGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCk7Ci0JCQotCQkvLyBuZXcgZmlsZSBwYWdlCi0JCW5ld0ZpbGVQYWdlID0gbmV3IE5ld0ZpbGVQYWdlKGZTZWxlY3Rpb24pOwotCQluZXdGaWxlUGFnZS5zZXRUaXRsZShYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0ZJTEVfSEVBRElORyk7Ci0JCW5ld0ZpbGVQYWdlLnNldERlc2NyaXB0aW9uKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0NSRUFURV9YTUxfRklMRV9FWFBMKTsKLQkJbmV3RmlsZVBhZ2UuZGVmYXVsdE5hbWUgPSAoZ3JhbW1hclVSSSAhPSBudWxsKSA/IFVSSUhlbHBlci5yZW1vdmVGaWxlRXh0ZW5zaW9uKFVSSUhlbHBlci5nZXRMYXN0U2VnbWVudChncmFtbWFyVVJJKSkgOiAiTmV3RmlsZSI7IC8vJE5PTi1OTFMtMSQKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBleHQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQkJbmV3RmlsZVBhZ2UuZGVmYXVsdEZpbGVFeHRlbnNpb24gPSAiLiIgKyBleHQ7IC8vJE5PTi1OTFMtMSQKLQkJbmV3RmlsZVBhZ2UuZmlsdGVyRXh0ZW5zaW9ucyA9IGZpbGVQYWdlRmlsdGVyRXh0ZW5zaW9uczsKLQkJYWRkUGFnZShuZXdGaWxlUGFnZSk7Ci0KLQkJaWYgKGdyYW1tYXJVUkkgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIHhtbCBmcm9tIHBhZ2UKLQkJCWZDcmVhdGVYTUxGcm9tV2l6YXJkUGFnZSA9IG5ldyBTdGFydFBhZ2UoIlN0YXJ0UGFnZSIsIGNyZWF0ZUZyb21SYWRpb0J1dHRvbkxhYmVsKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQkJCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQkJCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQkJCQlnZXRSYWRpb0J1dHRvbkF0SW5kZXgoZ2V0Q3JlYXRlTW9kZSgpKS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJCWdldFJhZGlvQnV0dG9uQXRJbmRleChnZXRDcmVhdGVNb2RlKCkpLnNldEZvY3VzKCk7Ci0KLQkJCQkJLy8gU2V0IHRoZSBoZWxwIGNvbnRleHQgZm9yIGVhY2ggYnV0dG9uCi0JCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZkNyZWF0ZVhNTEZyb21XaXphcmRQYWdlLmdldFJhZGlvQnV0dG9uQXRJbmRleCgwKSwgSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLlhNTF9ORVdXSVpBUkRfQ1JFQVRFWE1MMV9IRUxQSUQpOwotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGZDcmVhdGVYTUxGcm9tV2l6YXJkUGFnZS5nZXRSYWRpb0J1dHRvbkF0SW5kZXgoMSksIElYTUxXaXphcmRIZWxwQ29udGV4dElkcy5YTUxfTkVXV0laQVJEX0NSRUFURVhNTDJfSEVMUElEKTsKLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChmQ3JlYXRlWE1MRnJvbVdpemFyZFBhZ2UuZ2V0UmFkaW9CdXR0b25BdEluZGV4KDIpLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9DUkVBVEVYTUwzX0hFTFBJRCk7Ci0JCQkJfQotCQkJfTsKLQotCi0JCQlmQ3JlYXRlWE1MRnJvbVdpemFyZFBhZ2Uuc2V0VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XSVpBUkRfQ1JFQVRFX1hNTF9IRUFESU5HKTsKLQkJCWZDcmVhdGVYTUxGcm9tV2l6YXJkUGFnZS5zZXREZXNjcmlwdGlvbihYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0VYUEwpOwotCQkJYWRkUGFnZShmQ3JlYXRlWE1MRnJvbVdpemFyZFBhZ2UpOwotCQl9Ci0KLQkJLy8gc2VsZWN0R3JhbW1hckZpbGVQYWdlCi0JCXNlbGVjdEdyYW1tYXJGaWxlUGFnZSA9IG5ldyBTZWxlY3RHcmFtbWFyRmlsZVBhZ2UoKTsKLQkJYWRkUGFnZShzZWxlY3RHcmFtbWFyRmlsZVBhZ2UpOwotCi0JCS8vIHNlbGVjdCByb290IGVsZW1lbnQgcGFnZQotCQlzZWxlY3RSb290RWxlbWVudFBhZ2UgPSBuZXcgU2VsZWN0Um9vdEVsZW1lbnRQYWdlKCk7Ci0JCXNlbGVjdFJvb3RFbGVtZW50UGFnZS5zZXRUaXRsZShYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dJWkFSRF9TRUxFQ1RfUk9PVF9IRUFESU5HKTsKLQkJc2VsZWN0Um9vdEVsZW1lbnRQYWdlLnNldERlc2NyaXB0aW9uKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX1NFTEVDVF9ST09UX0VYUEwpOwotCQlhZGRQYWdlKHNlbGVjdFJvb3RFbGVtZW50UGFnZSk7Ci0KLQkJLy8gZnJvbSAic2NyYXRjaCIKLQkJZk5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2UgPSBuZXcgTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZSgpOwotCQlhZGRQYWdlKGZOZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlKTsKLQl9Ci0KLQotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRTdGFydGluZ1BhZ2UoKSB7Ci0JCVdpemFyZFBhZ2UgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHN0YXJ0UGFnZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBzdGFydFBhZ2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBuZXdGaWxlUGFnZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIGludCBnZXRDcmVhdGVNb2RlKCkgewotCQlTdHJpbmcgZ3JhbW1hclVSSSA9IGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCk7Ci0KLQkJaW50IHJlc3VsdCA9IENSRUFURV9GUk9NX1NDUkFUQ0g7Ci0JCWlmIChncmFtbWFyVVJJICE9IG51bGwpIHsKLQkJCWlmIChncmFtbWFyVVJJLmVuZHNXaXRoKCIuZHRkIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlyZXN1bHQgPSBDUkVBVEVfRlJPTV9EVEQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChncmFtbWFyVVJJLmVuZHNXaXRoKCIueHNkIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlyZXN1bHQgPSBDUkVBVEVfRlJPTV9YU0Q7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZkNyZWF0ZVhNTEZyb21XaXphcmRQYWdlICE9IG51bGwpIHsKLQkJCWludCBzZWxlY3RlZEluZGV4ID0gZkNyZWF0ZVhNTEZyb21XaXphcmRQYWdlLmdldFNlbGVjdGVkUmFkaW9CdXR0b25JbmRleCgpOwotCQkJaWYgKHNlbGVjdGVkSW5kZXggIT0gLTEpIHsKLQkJCQlyZXN1bHQgPSBzZWxlY3RlZEluZGV4OwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoSVdpemFyZFBhZ2UgY3VycmVudFBhZ2UpIHsKLQkJV2l6YXJkUGFnZSBuZXh0UGFnZSA9IG51bGw7Ci0JCWlmIChjdXJyZW50UGFnZSA9PSBzdGFydFBhZ2UpIHsKLQkJCW5leHRQYWdlID0gbmV3RmlsZVBhZ2U7Ci0JCX0KLQkJZWxzZSBpZiAoY3VycmVudFBhZ2UgPT0gbmV3RmlsZVBhZ2UpIHsKLQkJCWlmIChnZW5lcmF0b3IuZ2V0R3JhbW1hclVSSSgpID09IG51bGwpCi0JCQkJbmV4dFBhZ2UgPSBmQ3JlYXRlWE1MRnJvbVdpemFyZFBhZ2U7Ci0JCQllbHNlCi0JCQkJbmV4dFBhZ2UgPSBzZWxlY3RSb290RWxlbWVudFBhZ2U7Ci0JCX0KLQkJZWxzZSBpZiAoY3VycmVudFBhZ2UgPT0gZkNyZWF0ZVhNTEZyb21XaXphcmRQYWdlKSB7Ci0JCQlpZiAoZ2V0Q3JlYXRlTW9kZSgpID09IENSRUFURV9GUk9NX1NDUkFUQ0gpIHsKLQkJCQluZXh0UGFnZSA9IGZOZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlOwotCQkJfQotCQkJZWxzZSBpZiAoZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKSA9PSBudWxsKSB7Ci0JCQkJbmV4dFBhZ2UgPSBzZWxlY3RHcmFtbWFyRmlsZVBhZ2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQluZXh0UGFnZSA9IHNlbGVjdFJvb3RFbGVtZW50UGFnZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChjdXJyZW50UGFnZSA9PSBzZWxlY3RHcmFtbWFyRmlsZVBhZ2UpIHsKLQkJCW5leHRQYWdlID0gc2VsZWN0Um9vdEVsZW1lbnRQYWdlOwotCQl9Ci0JCXJldHVybiBuZXh0UGFnZTsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlJV2l6YXJkUGFnZSBjdXJyZW50UGFnZSA9IGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCk7Ci0JCS8vIGNhbiBmaW5pc2ggb246IG5ldyBmaWxlIHBhZ2UsIGNyZWF0ZSBmcm9tICYgdGVtcGxhdGUgcGFnZSBpZiBjcmVhdGluZyBmcm9tIHNjcmF0Y2gsIHNlbGVjdCByb290IGVsZW1lbnQgcGFnZQotCQlpZiAoKGN1cnJlbnRQYWdlID09IG5ld0ZpbGVQYWdlICYmIGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCkgPT0gbnVsbCkgfHwgKGZDcmVhdGVYTUxGcm9tV2l6YXJkUGFnZSAhPSBudWxsICYmIGZDcmVhdGVYTUxGcm9tV2l6YXJkUGFnZS5nZXRTZWxlY3RlZFJhZGlvQnV0dG9uSW5kZXgoKSA9PSBDUkVBVEVfRlJPTV9TQ1JBVENIKSB8fCAoY3VycmVudFBhZ2UgPT0gc2VsZWN0Um9vdEVsZW1lbnRQYWdlKSkgewotCQkJcmVzdWx0ID0gY3VycmVudFBhZ2UuaXNQYWdlQ29tcGxldGUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtRmluaXNoKCk7Ci0JCS8vIHNhdmUgdXNlciBvcHRpb25zIGZvciBuZXh0IHVzZQotCQlmTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZS5zYXZlTGFzdFNhdmVkUHJlZmVyZW5jZXMoKTsKLQkJCi0JCVN0cmluZyBmaWxlTmFtZSA9IG51bGw7Ci0JCXRyeSB7Ci0KLQkJCVN0cmluZ1tdIG5hbWVzcGFjZUVycm9ycyA9IGdlbmVyYXRvci5nZXROYW1lc3BhY2VJbmZvRXJyb3JzKCk7Ci0JCQlpZiAobmFtZXNwYWNlRXJyb3JzICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBuYW1lc3BhY2VFcnJvcnNbMF07Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBuYW1lc3BhY2VFcnJvcnNbMV07Ci0JCQkJcmVzdWx0ID0gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oZ2V0U2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwotCQkJfQotCi0JCQlpZiAocmVzdWx0KSB7Ci0JCQkJZmlsZU5hbWUgPSBuZXdGaWxlUGFnZS5nZXRGaWxlTmFtZSgpOwotCQkJCWlmICgobmV3IFBhdGgoZmlsZU5hbWUpKS5nZXRGaWxlRXh0ZW5zaW9uKCkgPT0gbnVsbCkgewotCQkJCQluZXdGaWxlUGFnZS5zZXRGaWxlTmFtZShmaWxlTmFtZS5jb25jYXQobmV3RmlsZVBhZ2UuZGVmYXVsdEZpbGVFeHRlbnNpb24pKTsKLQkJCQl9Ci0KLQkJCQlJRmlsZSBuZXdGaWxlID0gbmV3RmlsZVBhZ2UuY3JlYXRlTmV3RmlsZSgpOwotCQkJCVN0cmluZyB4bWxGaWxlTmFtZSA9IG5ld0ZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0KLQkJCQlpZiAoZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBzZWxlY3RSb290RWxlbWVudFBhZ2UpIHsKLQotCQkJCQlnZW5lcmF0b3IuY3JlYXRlWE1MRG9jdW1lbnQobmV3RmlsZSwgeG1sRmlsZU5hbWUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gcHV0IHRlbXBsYXRlIGNvbnRlbnRzIGludG8gZmlsZQotCQkJCQlTdHJpbmcgdGVtcGxhdGVTdHJpbmcgPSBmTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZS5nZXRUZW1wbGF0ZVN0cmluZygpOwotCQkJCQlnZW5lcmF0b3IuY3JlYXRlVGVtcGxhdGVYTUxEb2N1bWVudChuZXdGaWxlLCB0ZW1wbGF0ZVN0cmluZyk7Ci0JCQkJfQotCi0JCQkJbmV3RmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7Ci0KLQkJCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJQmFzaWNOZXdSZXNvdXJjZVdpemFyZC5zZWxlY3RBbmRSZXZlYWwobmV3RmlsZSwgd29ya2JlbmNoV2luZG93KTsKLQkJCQlvcGVuRWRpdG9yKG5ld0ZpbGUpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIGNvbXBsZXRpbmcgTmV3IFhNTCB3aXphcmQgIiArIGZpbGVOYW1lLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbkVkaXRvcihJRmlsZSBmaWxlKSB7Ci0JCS8vIE9wZW4gZWRpdG9yIG9uIG5ldyBmaWxlLgotCQlTdHJpbmcgZWRpdG9ySWQgPSBudWxsOwotCQl0cnkgewotCQkJSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRFZGl0b3JSZWdpc3RyeSgpLmdldERlZmF1bHRFZGl0b3IoZmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSwgZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKS5nZXRDb250ZW50VHlwZSgpKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCWVkaXRvcklkID0gZWRpdG9yLmdldElkKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLQkJCS8vIGVkaXRvciBpZCBjb3VsZCBub3QgYmUgcmV0cmlldmVkLCBzbyB3ZSBjYW4gbm90IG9wZW4gZWRpdG9yCi0JCQlyZXR1cm47Ci0JCX0KLQkJSVdvcmtiZW5jaFdpbmRvdyBkdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCXRyeSB7Ci0JCQlpZiAoZHcgIT0gbnVsbCkgewotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBkdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCQlwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSwgZWRpdG9ySWQsIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJLy8gZWRpdG9yIGNhbiBub3Qgb3BlbiBmb3Igc29tZSByZWFzb24KLQkJCXJldHVybjsKLQkJfQotCi0JfQotCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRTeXN0ZW1JZCgpIHsKLQkJU3RyaW5nIHJlbGF0aXZlUGF0aCA9ICJwbGF0Zm9ybTovcmVzb3VyY2UvIiArIG5ld0ZpbGVQYWdlLmdldENvbnRhaW5lckZ1bGxQYXRoKCkudG9TdHJpbmcoKSArICIvZHVtbXkiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmV0dXJuIFVSSUhlbHBlci5nZXRSZWxhdGl2ZVVSSShnZW5lcmF0b3IuZ2V0R3JhbW1hclVSSSgpLCByZWxhdGl2ZVBhdGgpOwotCX0KLQotCi0JLyoqCi0JICogU2VsZWN0R3JhbW1hckZpbGVQYWdlCi0JICovCi0JY2xhc3MgU2VsZWN0R3JhbW1hckZpbGVQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0JCXByb3RlY3RlZCBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbCBwYW5lbDsKLQotCQlTZWxlY3RHcmFtbWFyRmlsZVBhZ2UoKSB7Ci0JCQlzdXBlcigiU2VsZWN0R3JhbW1hckZpbGVQYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLlhNTF9ORVdXSVpBUkRfU0VMRUNUU09VUkNFX0hFTFBJRCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCi0JCQlwYW5lbCA9IG5ldyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbChjb21wb3NpdGUpOwotCQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJCVNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsLkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsLkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRpb25TdGF0ZUNoYW5nZWQoKSB7Ci0JCQkJCXVwZGF0ZUVycm9yTWVzc2FnZSgpOwotCQkJCX0KLQkJCX07Ci0JCQlwYW5lbC5zZXRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJCWlmICh2aXNpYmxlKSB7Ci0JCQkJaWYgKGdldENyZWF0ZU1vZGUoKSA9PSBDUkVBVEVfRlJPTV9EVEQpIHsKLQkJCQkJc2V0VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XSVpBUkRfU0VMRUNUX0RURF9GSUxFX1RJVExFKTsKLQkJCQkJc2V0RGVzY3JpcHRpb24oWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XSVpBUkRfU0VMRUNUX0RURF9GSUxFX0RFU0MpOwotCQkJCQlwYW5lbC5zZXRGaWx0ZXJFeHRlbnNpb25zKGJyb3dzZURUREZpbHRlckV4dGVuc2lvbnMpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc2V0VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XSVpBUkRfU0VMRUNUX1hTRF9GSUxFX1RJVExFKTsKLQkJCQkJc2V0RGVzY3JpcHRpb24oWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XSVpBUkRfU0VMRUNUX1hTRF9GSUxFX0RFU0MpOwotCQkJCQlwYW5lbC5zZXRGaWx0ZXJFeHRlbnNpb25zKGJyb3dzZVhTREZpbHRlckV4dGVuc2lvbnMpOwotCQkJCX0KLQkJCQlnZW5lcmF0b3Iuc2V0R3JhbW1hclVSSShudWxsKTsKLQkJCQlnZW5lcmF0b3Iuc2V0Q01Eb2N1bWVudChudWxsKTsKLQkJCQljbURvY3VtZW50RXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJCX0KLQkJCXBhbmVsLnNldFZpc2libGVIZWxwZXIodmlzaWJsZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJCVN0cmluZyB1cmkgPSBwYW5lbC5nZXRYTUxDYXRhbG9nVVJJKCk7Ci0JCQlpZiAodXJpID09IG51bGwpIHsKLQkJCQlJRmlsZSBmaWxlID0gcGFuZWwuZ2V0RmlsZSgpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJdXJpID0gVVJJSGVscGVyLmdldFBsYXRmb3JtVVJJKGZpbGUpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB1cmk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJCXJldHVybiAoZ2V0VVJJKCkgIT0gbnVsbCkgJiYgKGdldEVycm9yTWVzc2FnZSgpID09IG51bGwpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRYTUxDYXRhbG9nSWQoKSB7Ci0JCQlyZXR1cm4gcGFuZWwuZ2V0WE1MQ2F0YWxvZ0lkKCk7Ci0JCX0KLQotCQlwdWJsaWMgSUNhdGFsb2dFbnRyeSBnZXRYTUxDYXRhbG9nRW50cnkoKSB7Ci0JCQlyZXR1cm4gcGFuZWwuZ2V0WE1MQ2F0YWxvZ0VudHJ5KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGNvbXB1dGVFcnJvck1lc3NhZ2UoKSB7Ci0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJCVN0cmluZyB1cmkgPSBnZXRVUkkoKTsKLQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCWlmICghVVJJSGVscGVyLmlzUmVhZGFibGVVUkkodXJpLCBmYWxzZSkpIHsKLQkJCQkJZXJyb3JNZXNzYWdlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9MQUJFTF9FUlJPUl9DQVRBTE9HX0VOVFJZX0lOVkFMSUQ7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQkJfQotCi0KLQkJcHVibGljIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKCkgewotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IGNvbXB1dGVFcnJvck1lc3NhZ2UoKTsKLQkJCXNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBTZWxlY3RSb290RWxlbWVudFBhZ2UKLQkgKi8KLQljbGFzcyBTZWxlY3RSb290RWxlbWVudFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgQ29tYm8gY29tYm87Ci0JCXByb3RlY3RlZCBCdXR0b25bXSByYWRpb0J1dHRvbjsKLQkJcHJvdGVjdGVkIFBhZ2VCb29rIHBhZ2VCb29rOwotCQlwcm90ZWN0ZWQgWFNET3B0aW9uc1BhbmVsIHhzZE9wdGlvbnNQYW5lbDsKLQkJcHJvdGVjdGVkIERURE9wdGlvbnNQYW5lbCBkdGRPcHRpb25zUGFuZWw7Ci0KLQotCQlTZWxlY3RSb290RWxlbWVudFBhZ2UoKSB7Ci0JCQlzdXBlcigiU2VsZWN0Um9vdEVsZW1lbnRQYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJLy8gY29udGFpbmVyIGdyb3VwCi0JCQlDb21wb3NpdGUgY29udGFpbmVyR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb250YWluZXJHcm91cCwgSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLlhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlRfSEVMUElEKTsKLQkJCWNvbnRhaW5lckdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWNvbnRhaW5lckdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJc2V0Q29udHJvbChjb250YWluZXJHcm91cCk7Ci0KLQkJCS8vIHNlbGVjdCByb290IGVsZW1lbnQKLQkJCUxhYmVsIGNvbnRhaW5lckxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lckdyb3VwLCBTV1QuTk9ORSk7Ci0JCQljb250YWluZXJMYWJlbC5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfTEFCRUxfUk9PVF9FTEVNRU5UKTsKLQkJCWNvbWJvID0gbmV3IENvbWJvKGNvbnRhaW5lckdyb3VwLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0JCQljb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCQkvLyBPcHRpb25zCi0JCQl7Ci0JCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29udGFpbmVyR3JvdXAsIFNXVC5OT05FKTsKLQkJCQlncm91cC5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0NPTlRFTlRfT1BUSU9OUyk7Ci0KLQkJCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQkJCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCQlyYWRpb0J1dHRvbiA9IG5ldyBCdXR0b25bNF07Ci0KLQkJCQlyYWRpb0J1dHRvblswXSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0JCQkJcmFkaW9CdXR0b25bMF0uc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dJWkFSRF9DUkVBVEVfT1BUSU9OQUxfQVRUUklCVVRFUyk7Ci0JCQkJcmFkaW9CdXR0b25bMF0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQkJcmFkaW9CdXR0b25bMF0uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJhZGlvQnV0dG9uWzBdLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDFfSEVMUElEKTsKLQotCQkJCXJhZGlvQnV0dG9uWzFdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJCQlyYWRpb0J1dHRvblsxXS5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0NSRUFURV9PUFRJT05BTF9FTEVNRU5UUyk7Ci0JCQkJcmFkaW9CdXR0b25bMV0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQkJcmFkaW9CdXR0b25bMV0uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJhZGlvQnV0dG9uWzFdLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDJfSEVMUElEKTsKLQotCQkJCXJhZGlvQnV0dG9uWzJdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJCQlyYWRpb0J1dHRvblsyXS5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0NSRUFURV9GSVJTVF9DSE9JQ0UpOwotCQkJCXJhZGlvQnV0dG9uWzJdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJCXJhZGlvQnV0dG9uWzJdLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJhZGlvQnV0dG9uWzJdLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDNfSEVMUElEKTsKLQotCQkJCXJhZGlvQnV0dG9uWzNdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJCQlyYWRpb0J1dHRvblszXS5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0ZJTExfRUxFTUVOVFNfQU5EX0FUVFJJQlVURVMpOwotCQkJCXJhZGlvQnV0dG9uWzNdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJCXJhZGlvQnV0dG9uWzNdLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJhZGlvQnV0dG9uWzNdLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDRfSEVMUElEKTsKLQkJCQkvKgotCQkJCSAqIHJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvblsyXTsKLQkJCQkgKiAKLQkJCQkgKiByYWRpb0J1dHRvblswXSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCQkJICogcmFkaW9CdXR0b25bMF0uc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuZ2V0U3RyaW5nKCJfVUlfV0laQVJEX0NSRUFURV9SRVFVSVJFRCIpKTsKLQkJCQkgKiByYWRpb0J1dHRvblswXS5zZXRMYXlvdXREYXRhKG5ldwotCQkJCSAqIEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJCSAqIHJhZGlvQnV0dG9uWzBdLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQkgKiBXb3JrYmVuY2hIZWxwLnNldEhlbHAocmFkaW9CdXR0b25bMF0sCi0JCQkJICogWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MQ19DUkVBVEVfUkVRVUlSRURfT05MWSk7Ci0JCQkJICogCi0JCQkJICogcmFkaW9CdXR0b25bMV0gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotCQkJCSAqIHJhZGlvQnV0dG9uWzFdLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLmdldFN0cmluZygiX1VJX1dJWkFSRF9DUkVBVEVfT1BUSU9OQUwiKSk7Ci0JCQkJICogcmFkaW9CdXR0b25bMV0uc2V0TGF5b3V0RGF0YShuZXcKLQkJCQkgKiBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCQkgKiBXb3JrYmVuY2hIZWxwLnNldEhlbHAocmFkaW9CdXR0b25bMV0sCi0JCQkJICogWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MQ19DUkVBVEVfUkVRVUlSRURfQU5EX09QVElPTik7Ci0JCQkJICovCi0JCQl9Ci0KLQkJCS8vIGFkZCB0aGUgZ3JhbW1hciBzcGVjaWZpYyBnZW5lcmF0aW9uIG9wdGlvbnMKLQkJCS8vCi0JCQl7Ci0JCQkJcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2soY29udGFpbmVyR3JvdXAsIFNXVC5OT05FKTsKLQkJCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCQl4c2RPcHRpb25zUGFuZWwgPSBuZXcgWFNET3B0aW9uc1BhbmVsKHRoaXMsIHBhZ2VCb29rKTsKLQkJCQlkdGRPcHRpb25zUGFuZWwgPSBuZXcgRFRET3B0aW9uc1BhbmVsKHRoaXMsIHBhZ2VCb29rKTsKLQkJCQlwYWdlQm9vay5zaG93UGFnZSh4c2RPcHRpb25zUGFuZWwpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCWludCBpbmRleCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQlTdHJpbmcgcm9vdEVsZW1lbnROYW1lID0gKGluZGV4ICE9IC0xKSA/IGNvbWJvLmdldEl0ZW0oaW5kZXgpIDogbnVsbDsKLQkJCWdlbmVyYXRvci5zZXRSb290RWxlbWVudE5hbWUocm9vdEVsZW1lbnROYW1lKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0KLQkJCWlmICh2aXNpYmxlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCkgPT0gbnVsbCkgewotCQkJCQkJZ2VuZXJhdG9yLnNldEdyYW1tYXJVUkkoc2VsZWN0R3JhbW1hckZpbGVQYWdlLmdldFVSSSgpKTsKLQkJCQkJCWdlbmVyYXRvci5zZXRYTUxDYXRhbG9nRW50cnkoc2VsZWN0R3JhbW1hckZpbGVQYWdlLmdldFhNTENhdGFsb2dFbnRyeSgpKTsKLQkJCQkJfQotCQkJCQlBc3NlcnQuaXNOb3ROdWxsKGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCkpOwotCi0JCQkJCWlmIChnZW5lcmF0b3IuZ2V0Q01Eb2N1bWVudCgpID09IG51bGwpIHsKLQkJCQkJCWZpbmFsIFN0cmluZ1tdIGVycm9ySW5mbyA9IG5ldyBTdHJpbmdbMl07Ci0JCQkJCQlmaW5hbCBDTURvY3VtZW50W10gY21kb2NzID0gbmV3IENNRG9jdW1lbnRbMV07Ci0JCQkJCQlSdW5uYWJsZSByID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJY21kb2NzWzBdID0gTmV3WE1MR2VuZXJhdG9yLmNyZWF0ZUNNRG9jdW1lbnQoZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKSwgZXJyb3JJbmZvKTsKLQkJCQkJCQl9Ci0JCQkJCQl9OwotCQkJCQkJb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgcik7Ci0KLQkJCQkJCWdlbmVyYXRvci5zZXRDTURvY3VtZW50KGNtZG9jc1swXSk7Ci0JCQkJCQljbURvY3VtZW50RXJyb3JNZXNzYWdlID0gZXJyb3JJbmZvWzFdOwotCQkJCQl9Ci0KLQkJCQkJY29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkJCWlmICgoZ2VuZXJhdG9yLmdldENNRG9jdW1lbnQoKSAhPSBudWxsKSAmJiAoY21Eb2N1bWVudEVycm9yTWVzc2FnZSA9PSBudWxsKSkgewotCQkJCQkJQ01OYW1lZE5vZGVNYXAgbmFtZU5vZGVNYXAgPSBnZW5lcmF0b3IuZ2V0Q01Eb2N1bWVudCgpLmdldEVsZW1lbnRzKCk7Ci0JCQkJCQlWZWN0b3IgbmFtZU5vZGVWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZU5vZGVNYXAuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGNtRWxlbWVudERlY2xhcmF0aW9uID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBuYW1lTm9kZU1hcC5pdGVtKGkpOwotCQkJCQkJCU9iamVjdCB2YWx1ZSA9IGNtRWxlbWVudERlY2xhcmF0aW9uLmdldFByb3BlcnR5KCJBYnN0cmFjdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKHZhbHVlICE9IEJvb2xlYW4uVFJVRSkgewotCQkJCQkJCQluYW1lTm9kZVZlY3Rvci5hZGQoY21FbGVtZW50RGVjbGFyYXRpb24uZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlPYmplY3RbXSBuYW1lTm9kZUFycmF5ID0gbmFtZU5vZGVWZWN0b3IudG9BcnJheSgpOwotCQkJCQkJaWYgKG5hbWVOb2RlQXJyYXkubGVuZ3RoID4gMCkgewotCQkJCQkJCUFycmF5cy5zb3J0KG5hbWVOb2RlQXJyYXksIENvbGxhdG9yLmdldEluc3RhbmNlKCkpOwotCQkJCQkJfQotCi0JCQkJCQlTdHJpbmcgZGVmYXVsdFJvb3ROYW1lID0gKFN0cmluZykgKGdlbmVyYXRvci5nZXRDTURvY3VtZW50KCkpLmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvZGVmYXVsdFJvb3ROYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWludCBkZWZhdWx0Um9vdEluZGV4ID0gLTE7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVOb2RlQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSAoU3RyaW5nKSBuYW1lTm9kZUFycmF5W2ldOwotCi0JCQkJCQkJY29tYm8uYWRkKGVsZW1lbnROYW1lKTsKLQkJCQkJCQlpZiAoKGRlZmF1bHRSb290TmFtZSAhPSBudWxsKSAmJiBkZWZhdWx0Um9vdE5hbWUuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotCQkJCQkJCQlkZWZhdWx0Um9vdEluZGV4ID0gaTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChuYW1lTm9kZUFycmF5Lmxlbmd0aCA+IDApIHsKLQkJCQkJCQlkZWZhdWx0Um9vdEluZGV4ID0gZGVmYXVsdFJvb3RJbmRleCAhPSAtMSA/IGRlZmF1bHRSb290SW5kZXggOiAwOwotCQkJCQkJCWNvbWJvLnNlbGVjdChkZWZhdWx0Um9vdEluZGV4KTsKLQkJCQkJCQlnZW5lcmF0b3Iuc2V0Um9vdEVsZW1lbnROYW1lKGNvbWJvLmdldEl0ZW0oZGVmYXVsdFJvb3RJbmRleCkpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCkuZW5kc1dpdGgoInhzZCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXsKLQkJCQkJCXBhZ2VCb29rLnNob3dQYWdlKHhzZE9wdGlvbnNQYW5lbCk7Ci0JCQkJCQlnZW5lcmF0b3Iuc2V0RGVmYXVsdFN5c3RlbUlkKGdldERlZmF1bHRTeXN0ZW1JZCgpKTsKLQkJCQkJCWdlbmVyYXRvci5jcmVhdGVOYW1lc3BhY2VJbmZvTGlzdCgpOwotCi0JCQkJCQkvLyBQcm92aWRlIGRlZmF1bHQgbmFtZXNwYWNlIHByZWZpeCBpZiBub25lCi0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGdlbmVyYXRvci5uYW1lc3BhY2VJbmZvTGlzdC5zaXplKCk7IGkrKykgewotCQkJCQkJCU5hbWVzcGFjZUluZm8gbnNpbmZvID0gKE5hbWVzcGFjZUluZm8pIGdlbmVyYXRvci5uYW1lc3BhY2VJbmZvTGlzdC5nZXQoaSk7Ci0JCQkJCQkJaWYgKCgobnNpbmZvLnByZWZpeCA9PSBudWxsKSB8fCAobnNpbmZvLnByZWZpeC50cmltKCkubGVuZ3RoKCkgPT0gMCkpICYmICgobnNpbmZvLnVyaSAhPSBudWxsKSAmJiAobnNpbmZvLnVyaS50cmltKCkubGVuZ3RoKCkgIT0gMCkpKSB7Ci0JCQkJCQkJCW5zaW5mby5wcmVmaXggPSBnZXREZWZhdWx0UHJlZml4KGdlbmVyYXRvci5uYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJeHNkT3B0aW9uc1BhbmVsLnNldE5hbWVzcGFjZUluZm9MaXN0KGdlbmVyYXRvci5uYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKS5lbmRzV2l0aCgiZHRkIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJewotCQkJCQkJcGFnZUJvb2suc2hvd1BhZ2UoZHRkT3B0aW9uc1BhbmVsKTsKLQkJCQkJCWR0ZE9wdGlvbnNQYW5lbC51cGRhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gWE1MQnVpbGRlclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZUN1cnJlbnRUaHJlYWQoKTsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBjb21wdXRlRXJyb3JNZXNzYWdlKCk7IGlmCi0JCQkJICogKGVycm9yTWVzc2FnZSA9PSBudWxsKSBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQkJCSAqLwotCi0JCQkJdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0UHJlZml4KExpc3QgbnNJbmZvTGlzdCkgewotCQkJU3RyaW5nIGRlZmF1bHRQcmVmaXggPSAicCI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChuc0luZm9MaXN0ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZGVmYXVsdFByZWZpeDsKLQkJCX0KLQotCQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5zSW5mb0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlOYW1lc3BhY2VJbmZvIG5zaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBuc0luZm9MaXN0LmdldChpKTsKLQkJCQlpZiAobnNpbmZvLnByZWZpeCAhPSBudWxsKSB7Ci0JCQkJCXYuYWRkRWxlbWVudChuc2luZm8ucHJlZml4KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICh2LmNvbnRhaW5zKGRlZmF1bHRQcmVmaXgpKSB7Ci0JCQkJU3RyaW5nIHMgPSBkZWZhdWx0UHJlZml4OwotCQkJCWZvciAoaW50IGogPSAwOyB2LmNvbnRhaW5zKHMpOyBqKyspIHsKLQkJCQkJcyA9IGRlZmF1bHRQcmVmaXggKyBJbnRlZ2VyLnRvU3RyaW5nKGopOwotCQkJCX0KLQkJCQlyZXR1cm4gczsKLQkJCX0KLQkJCXJldHVybiBkZWZhdWx0UHJlZml4OwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCQlib29sZWFuIGNvbXBsZXRlID0gKChnZW5lcmF0b3IuZ2V0Um9vdEVsZW1lbnROYW1lKCkgIT0gbnVsbCkgJiYgKGdlbmVyYXRvci5nZXRSb290RWxlbWVudE5hbWUoKS5sZW5ndGgoKSA+IDApKSAmJiAoZ2V0RXJyb3JNZXNzYWdlKCkgPT0gbnVsbCk7Ci0KLQkJCWlmIChjb21wbGV0ZSkgewotCQkJCS8qCi0JCQkJICogaW50IGJ1aWxkUG9saWN5ID0gcmFkaW9CdXR0b25bMF0uZ2V0U2VsZWN0aW9uKCkgPwotCQkJCSAqIERPTUNvbnRlbnRCdWlsZGVyLkJVSUxEX09OTFlfUkVRVUlSRURfQ09OVEVOVCA6Ci0JCQkJICogRE9NQ29udGVudEJ1aWxkZXIuQlVJTERfQUxMX0NPTlRFTlQ7Ci0JCQkJICovCi0JCQkJaW50IGJ1aWxkUG9saWN5ID0gMDsKLQkJCQlpZiAocmFkaW9CdXR0b25bMF0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJYnVpbGRQb2xpY3kgPSBidWlsZFBvbGljeSB8IERPTUNvbnRlbnRCdWlsZGVyLkJVSUxEX09QVElPTkFMX0FUVFJJQlVURVM7Ci0JCQkJfQotCQkJCWlmIChyYWRpb0J1dHRvblsxXS5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlidWlsZFBvbGljeSA9IGJ1aWxkUG9saWN5IHwgRE9NQ29udGVudEJ1aWxkZXIuQlVJTERfT1BUSU9OQUxfRUxFTUVOVFM7Ci0JCQkJfQotCQkJCWlmIChyYWRpb0J1dHRvblsyXS5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlidWlsZFBvbGljeSA9IGJ1aWxkUG9saWN5IHwgRE9NQ29udGVudEJ1aWxkZXIuQlVJTERfRklSU1RfQ0hPSUNFIHwgRE9NQ29udGVudEJ1aWxkZXIuQlVJTERfRklSU1RfU1VCU1RJVFVUSU9OOwotCQkJCX0KLQkJCQlpZiAocmFkaW9CdXR0b25bM10uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJYnVpbGRQb2xpY3kgPSBidWlsZFBvbGljeSB8IERPTUNvbnRlbnRCdWlsZGVyLkJVSUxEX1RFWFRfTk9ERVM7Ci0JCQkJfQotCi0JCQkJZ2VuZXJhdG9yLnNldEJ1aWxkUG9saWN5KGJ1aWxkUG9saWN5KTsKLQkJCX0KLQotCQkJcmV0dXJuIGNvbXBsZXRlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBjb21wdXRlRXJyb3JNZXNzYWdlKCkgewotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0KLQkJCWlmIChjbURvY3VtZW50RXJyb3JNZXNzYWdlICE9IG51bGwpIHsKLQkJCQllcnJvck1lc3NhZ2UgPSBjbURvY3VtZW50RXJyb3JNZXNzYWdlOwotCQkJfQotCQkJZWxzZSBpZiAoKGdlbmVyYXRvci5nZXRSb290RWxlbWVudE5hbWUoKSA9PSBudWxsKSB8fCAoZ2VuZXJhdG9yLmdldFJvb3RFbGVtZW50TmFtZSgpLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJZXJyb3JNZXNzYWdlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9FUlJPUl9ST09UX0VMRU1FTlRfTVVTVF9CRV9TUEVDSUZJRUQ7Ci0JCQl9Ci0KLQkJCXJldHVybiBlcnJvck1lc3NhZ2U7Ci0JCX0KLQotCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZUVycm9yTWVzc2FnZSgpIHsKLQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBjb21wdXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQlpZiAoZXJyb3JNZXNzYWdlID09IG51bGwpIHsKLQkJCQlpZiAoeHNkT3B0aW9uc1BhbmVsLmlzVmlzaWJsZSgpKSB7Ci0KLQkJCQkJZXJyb3JNZXNzYWdlID0geHNkT3B0aW9uc1BhbmVsLmNvbXB1dGVFcnJvck1lc3NhZ2UoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZHRkT3B0aW9uc1BhbmVsLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCWVycm9yTWVzc2FnZSA9IGR0ZE9wdGlvbnNQYW5lbC5jb21wdXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQkJfQotCQkJfQotCQkJc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0JCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCX0KLQl9Ci0KLQkvLyAvLy8vLy8vLy8vLy8vL0VuZCBTZWxlY3RSb290RWxlbWVudFBhZ2UKLQotCi0KLQlwdWJsaWMgc3RhdGljIEdyaWRMYXlvdXQgY3JlYXRlT3B0aW9uc1BhbmVsTGF5b3V0KCkgewotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJZ3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCXJldHVybiBncmlkTGF5b3V0OwotCX0KLQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQljbGFzcyBYU0RPcHRpb25zUGFuZWwgZXh0ZW5kcyBDb21wb3NpdGUgewotCQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCXByb3RlY3RlZCBTZWxlY3RSb290RWxlbWVudFBhZ2UgcGFyZW50UGFnZTsKLQkJcHJvdGVjdGVkIENvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nIGVkaXROYW1lc3BhY2VzOwotCQlwcml2YXRlIElQYXRoIGN1cnJlbnRQYXRoID0gbnVsbDsKLQotCQlwdWJsaWMgWFNET3B0aW9uc1BhbmVsKFNlbGVjdFJvb3RFbGVtZW50UGFnZSBwYXJlbnRQYWdlLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJCXRoaXMucGFyZW50UGFnZSA9IHBhcmVudFBhZ2U7Ci0KLQkJCXNldExheW91dChjcmVhdGVPcHRpb25zUGFuZWxMYXlvdXQoKSk7Ci0JCQlzZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyBnZXRFZGl0TmFtZXNwYWNlcygpIHsKLQkJCWlmIChlZGl0TmFtZXNwYWNlcyA9PSBudWxsKSB7Ci0JCQkJQ29tcG9zaXRlIGNvID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0JCQkJY28uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJCVN0cmluZyB0YWJsZVRpdGxlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FU1BBQ0VfSU5GT1JNQVRJT047Ci0JCQkJZWRpdE5hbWVzcGFjZXMgPSBuZXcgQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2coY28sIG51bGwsIHRhYmxlVGl0bGUsIHRydWUsIHRydWUpOwotCQkJCXRoaXMubGF5b3V0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZWRpdE5hbWVzcGFjZXM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VJbmZvTGlzdChMaXN0IGxpc3QpIHsKLQkJCUNvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nIGVkaXREaWFsb2cgPSBnZXRFZGl0TmFtZXNwYWNlcygpOwotCQkJCi0JCSAgICBpZiAobmV3RmlsZVBhZ2UgIT0gbnVsbCkgewotCQkgICAgICBJUGF0aCBuZXdQYXRoID0gbmV3RmlsZVBhZ2UuZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQkJICAgICAgaWYgKG5ld1BhdGggIT0gbnVsbCkgewotCQkgICAgICAgIGlmICghbmV3UGF0aC5lcXVhbHMoY3VycmVudFBhdGgpKSB7Ci0JICAgICAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZVVSSSA9ICJwbGF0Zm9ybTovcmVzb3VyY2UiICsgbmV3UGF0aC50b1N0cmluZygpICsgIi9kdW1teSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb2x2ZWRQYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZShyZXNvdXJjZVVSSSwgbnVsbCwgbnVsbCk7Ci0JICAgICAgICAgICAgICAgIHJlc29sdmVkUGF0aCA9IFVSSUhlbHBlci5yZW1vdmVQcm90b2NvbChyZXNvbHZlZFBhdGgpOwotCSAgICAgICAgICAgICAgICAKLQkgICAgICAgICAgICAgICAgY3VycmVudFBhdGggPSBuZXcgUGF0aChyZXNvbHZlZFBhdGgpOwotCSAgICAgICAgICAgICAgICBlZGl0RGlhbG9nLnNldFJlc291cmNlUGF0aChjdXJyZW50UGF0aCk7Ci0JCSAgICAgICAgfQotCQkgICAgICB9Ci0JCSAgICB9Ci0JCSAgICBlZGl0RGlhbG9nLnNldE5hbWVzcGFjZUluZm9MaXN0KGxpc3QpOwotCQkgICAgZWRpdERpYWxvZy51cGRhdGVFcnJvck1lc3NhZ2UobGlzdCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB1cGRhdGVFcnJvck1lc3NhZ2UoTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCkgewotCQkJTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyIGhlbHBlciA9IG5ldyBOYW1lc3BhY2VJbmZvRXJyb3JIZWxwZXIoKTsKLQkJCWVycm9yTWVzc2FnZSA9IGhlbHBlci5jb21wdXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0LCBudWxsKTsKLQkJCXBhcmVudFBhZ2UudXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0JCX0KLQotCi0JCXB1YmxpYyBTdHJpbmcgY29tcHV0ZUVycm9yTWVzc2FnZSgpIHsKLQkJCXJldHVybiBlcnJvck1lc3NhZ2U7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBjbGFzcyBEVERPcHRpb25zUGFuZWwgZXh0ZW5kcyBDb21wb3NpdGUgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0JCXByb3RlY3RlZCBHcm91cCBncm91cDsKLQkJcHJvdGVjdGVkIFRleHQgc3lzdGVtSWRGaWVsZDsKLQkJcHJvdGVjdGVkIFRleHQgcHVibGljSWRGaWVsZDsKLQkJcHJvdGVjdGVkIFNlbGVjdFJvb3RFbGVtZW50UGFnZSBwYXJlbnRQYWdlOwotCi0JCXB1YmxpYyBEVERPcHRpb25zUGFuZWwoU2VsZWN0Um9vdEVsZW1lbnRQYWdlIHBhcmVudFBhZ2UsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQkJdGhpcy5wYXJlbnRQYWdlID0gcGFyZW50UGFnZTsKLQkJCXNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCQlzZXRMYXlvdXQoY3JlYXRlT3B0aW9uc1BhbmVsTGF5b3V0KCkpOwotCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULk5PTkUpOwotCQkJZ3JvdXAuc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuX1VJX0xBQkVMX0RPQ1RZUEVfSU5GT1JNQVRJT04pOwotCi0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCQlMYWJlbCBwdWJsaWNJZExhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlwdWJsaWNJZExhYmVsLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9MQUJFTF9QVUJMSUNfSUQpOwotCQkJcHVibGljSWRGaWVsZCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlwdWJsaWNJZEZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJcHVibGljSWRGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocHVibGljSWRGaWVsZCwgSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLlhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQ1X0hFTFBJRCk7Ci0KLQkJCUxhYmVsIHN5c3RlbUlkTGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLQkJCXN5c3RlbUlkTGFiZWwuc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuX1VJX0xBQkVMX1NZU1RFTV9JRCk7Ci0JCQlzeXN0ZW1JZEZpZWxkID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCXN5c3RlbUlkRmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQlzeXN0ZW1JZEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzeXN0ZW1JZEZpZWxkLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDZfSEVMUElEKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJCVN0cmluZyB0aGVQdWJsaWNJZCA9IG51bGw7Ci0JCQlTdHJpbmcgdGhlU3lzdGVtSWQgPSBudWxsOwotCQkJSUNhdGFsb2dFbnRyeSB4bWxDYXRhbG9nRW50cnkgPSBnZW5lcmF0b3IuZ2V0WE1MQ2F0YWxvZ0VudHJ5KCk7Ci0KLQkJCWlmICh4bWxDYXRhbG9nRW50cnkgIT0gbnVsbCkgewotCQkJCWlmICh4bWxDYXRhbG9nRW50cnkuZ2V0RW50cnlUeXBlKCkgPT0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQykgewotCQkJCQl0aGVQdWJsaWNJZCA9IHhtbENhdGFsb2dFbnRyeS5nZXRLZXkoKTsKLQkJCQkJdGhlU3lzdGVtSWQgPSB4bWxDYXRhbG9nRW50cnkuZ2V0QXR0cmlidXRlVmFsdWUoSUNhdGFsb2dFbnRyeS5BVFRSX1dFQl9VUkwpOwotCQkJCQlpZiAodGhlU3lzdGVtSWQgPT0gbnVsbCkgewotCQkJCQkJdGhlU3lzdGVtSWQgPSBnZW5lcmF0b3IuZ2V0R3JhbW1hclVSSSgpLnN0YXJ0c1dpdGgoImh0dHA6IikgPyBnZW5lcmF0b3IuZ2V0R3JhbW1hclVSSSgpIDogVVJJSGVscGVyLmdldExhc3RTZWdtZW50KGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRoZVN5c3RlbUlkID0geG1sQ2F0YWxvZ0VudHJ5LmdldEtleSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoZVN5c3RlbUlkID0gZ2V0RGVmYXVsdFN5c3RlbUlkKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpY0lkRmllbGQuc2V0VGV4dCh0aGVQdWJsaWNJZCAhPSBudWxsID8gdGhlUHVibGljSWQgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXN5c3RlbUlkRmllbGQuc2V0VGV4dCh0aGVTeXN0ZW1JZCAhPSBudWxsID8gdGhlU3lzdGVtSWQgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJZ2VuZXJhdG9yLnNldFN5c3RlbUlkKHN5c3RlbUlkRmllbGQuZ2V0VGV4dCgpKTsKLQkJCWdlbmVyYXRvci5zZXRQdWJsaWNJZChwdWJsaWNJZEZpZWxkLmdldFRleHQoKSk7Ci0JCQlwYXJlbnRQYWdlLnVwZGF0ZUVycm9yTWVzc2FnZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBjb21wdXRlRXJyb3JNZXNzYWdlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9YTUxJbXBvcnRBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9YTUxJbXBvcnRBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjkyM2M0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvWE1MSW1wb3J0QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLy8gVE9ETyBjcy4uLiByZW5hbWUgdGhpcyBjbGFzcyBOZXdYTUxBY3Rpb25EZWxlZ2F0ZQotLy8gd2UgbmVlZCB0byByZS1hZGQgcHJlLXZhbGlkYXRpb24gdXNpbmcgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIEFQSSdzCi0vLyBzaW5jZSB3ZSBhbHNvIG5lZWQgdG8gYWRkIHZhbGlkYXRpb24gdG8gdGhlICdOZXcgWE1MJyBjYXNlLCB0aGlzCi0vLyBwcmV2YWxpZGF0aW9uCi0vLyBmdW5jdGlvbiBzaG91bGQgcmVhbGx5IGdvIGludG8gdGhlIE5ld1dpemFyZCBzb21ld2hlcmUKLS8vCi1wdWJsaWMgY2xhc3MgWE1MSW1wb3J0QWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUgewotCS8qKgotCSAqIENoZWNrcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gYW5kIHJ1bnMgdGhlIHNlcGFyYXRlIGJyb3dzZXIgdG8gc2hvdyB0aGUKLQkgKiBjb250ZW50IG9mIHRoZSBSZWFkbWUgZmlsZS4gVGhpcyBjb2RlIHNob3dzIGhvdyB0byBsYXVuY2ggc2VwYXJhdGUKLQkgKiBicm93c2VycyB0aGF0IGFyZSBub3QgVkEvQmFzZSBkZXNrdG9wIHBhcnRzLgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gdGhhdCB3YXMgcGVyZm9ybWVkCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB3b3JrYmVuY2hXaW5kb3cuZ2V0U2VsZWN0aW9uU2VydmljZSgpLmdldFNlbGVjdGlvbigpOwotCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBnZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQotCQlpZiAoKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUZpbGUpICYmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpIHsKLQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHNlbGVjdGVkT2JqZWN0OwotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJdHJ5IHsKLQkJCQlOZXdYTUxXaXphcmQuc2hvd0RpYWxvZyh3b3JrYmVuY2hXaW5kb3cuZ2V0U2hlbGwoKSwgZmlsZSwgc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHVudXNlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIHVudXNlZAotCX0KLQotCS8vIHNjYW1tZWQgZnJvbSBXaW5kb3dVdGlsaXR5Ci0JLy8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBlcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJSXRlcmF0b3IgaSA9IGVzLml0ZXJhdG9yKCk7Ci0JCQlpZiAoaS5oYXNOZXh0KCkpIHsKLQkJCQlyZXN1bHQgPSBpLm5leHQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvWE1MU2NoZW1hVmFsaWRhdGlvbkNoZWNrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvWE1MU2NoZW1hVmFsaWRhdGlvbkNoZWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU2YTNkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL1hNTFNjaGVtYVZhbGlkYXRpb25DaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgWE1MU2NoZW1hVmFsaWRhdGlvbkNoZWNrZXIgewotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoSUZpbGUgaWZpbGUpIHsKLQkJU3RyaW5nIHhzZEZpbGVOYW1lID0gaWZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQlyZXR1cm4gaXNWYWxpZCh4c2RGaWxlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2hvdWxkIHRoaXMgYmUgaW1wbGVtZW50ZWQgYXMgYSBWYWxpZGF0b3IgYW5kIHNpbXBseSBjYWxsZWQgYXMgc3VjaAotCSAqIHdpdGggYSByZXBvcnRlciB0aGF0IG9ubHkgY2hlY2tzIHRoZSByZXN1bHRzIGZvciBzZXZlcml0eSA9IGVycm9yPyBPcgotCSAqIHNob3VsZCB0aGUgWGVyY2VzIHJlcXVpcmVtZW50IGJlIGJyb2tlbiB1c2luZyBhIHBsdWctaW4gZXh0ZW5zaW9uPwotCSAqLwotCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgeHNkRmlsZU5hbWUpIHsKLQkJLy8gRE9NQVNCdWlsZGVySW1wbCBidWlsZGVyID0gbmV3IERPTUFTQnVpbGRlckltcGwoKTsKLQkJLy8gRE9NRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciA9IG5ldyBET01FcnJvckhhbmRsZXIoKTsKLQkJLy8gYnVpbGRlci5zZXRFcnJvckhhbmRsZXIoZXJyb3JIYW5kbGVyKTsKLQkJdHJ5IHsKLQkJCS8vIFN0cmluZyB1cmkgPQotCQkJVVJJSGVscGVyLmdldFVSSUZvckZpbGVQYXRoKHhzZEZpbGVOYW1lKTsKLQkJCS8vIEFTTW9kZWwgbW9kZWwgPSBidWlsZGVyLnBhcnNlQVNVUkkodXJpKTsKLQkJCS8vIGlmIChlcnJvckhhbmRsZXIuaGFzRXJyb3IoKSkKLQkJCS8vIHJldHVybiBmYWxzZTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIC8vIGludmFsaWQgc2NoZW1hCi0JCXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vIGlubmVyIGNsYXNzCi0JY2xhc3MgRE9NRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyIHsKLQkJcHJpdmF0ZSBib29sZWFuIGhhc0Vycm9yID0gZmFsc2U7Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzRXJyb3IoKSB7Ci0JCQlyZXR1cm4gaGFzRXJyb3I7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlcnIpIHsKLQkJCWhhc0Vycm9yID0gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCWhhc0Vycm9yID0gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIG5vdCBhbiBlcnJvcgotCQl9Ci0JfSAvLyBlbmQgRE9NRXJyb3JIYW5kbGVySW1wbAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL1hNTFdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9YTUxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlYTVkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL1hNTFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotCi1wdWJsaWMgY2xhc3MgWE1MV2l6YXJkIHsKLQlwcm90ZWN0ZWQgc3RhdGljIFhNTFdpemFyZCBpbnN0YW5jZSA9IG5ldyBYTUxXaXphcmQoKTsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFhNTFdpemFyZCBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBYTUxXaXphcmQoKSB7Ci0JCWluc3RhbmNlID0gdGhpczsKLQotCX0KLQotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTChQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLndzdC54bWwudWkiKS5nZXRFbnRyeSgiLyIpLCBuYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9YTUxXaXphcmRzTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvWE1MV2l6YXJkc01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZTAxYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9YTUxXaXphcmRzTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogRGF2aWQgQ2FydmVyL1NUQVIgU3RhbmRhcmQgLSBkX2FfY2FydmVyQHlhaG9vLmNvbSAtIGJ1ZyAxOTI1NjgKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBYTUwgV2l6YXJkcwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNTFdpemFyZHNNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy53aXphcmRSZXNvdXJjZSI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19ORVdfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19USVRMRV9JTlZBTElEX0dSQU1NQVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19NRVNTQUdFX0lOVkFMSURfR1JBTU1BUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX0NSRUFURV9ORVdfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JBRElPX1hNTF9GUk9NX0RURDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkFESU9fWE1MX0ZST01fU0NIRU1BOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SQURJT19YTUxfRlJPTV9TQ1JBVENIOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfQ1JFQVRFX1hNTF9IRUFESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfQ1JFQVRFX1hNTF9FWFBMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfQ1JFQVRFX1hNTF9GSUxFX0hFQURJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0ZJTEVfRVhQTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX1NFTEVDVF9EVERfRklMRV9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfU0VMRUNUX0RURF9GSUxFX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfU0VMRUNUX1hTRF9GSUxFX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9TRUxFQ1RfWFNEX0ZJTEVfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9TRUxFQ1RfUk9PVF9IRUFESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfU0VMRUNUX1JPT1RfRVhQTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUk9PVF9FTEVNRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX1RJVExFX05PX1JPT1RfRUxFTUVOVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfTVNHX05PX1JPT1RfRUxFTUVOVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05PX0xPQ0FUSU9OX0hJTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfTVNHX05PX0xPQ0FUSU9OX0hJTlRfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0FSTklOR19NU0dfTk9fTE9DQVRJT05fSElOVF8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX01TR19OT19MT0NBVElPTl9ISU5UXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DT05URU5UX09QVElPTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DUkVBVEVfUkVRVUlSRUQ7Ly8gY29tbWVudGVkIG91dAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfQ1JFQVRFX09QVElPTkFMOy8vIGNvbW1lbnRlZCBvdXQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX0NSRUFURV9PUFRJT05BTF9BVFRSSUJVVEVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfQ1JFQVRFX09QVElPTkFMX0VMRU1FTlRTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfQ1JFQVRFX0ZJUlNUX0NIT0lDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX0ZJTExfRUxFTUVOVFNfQU5EX0FUVFJJQlVURVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RPQ1RZUEVfSU5GT1JNQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NZU1RFTV9JRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUFVCTElDX0lEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX1VSSV9OT1RfRk9VTkRfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0lOVkFMSURfR1JBTU1BUl9FUlJPUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfQkFEX0ZJTEVOQU1FX0VYVEVOU0lPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfRklMRV9BTFJFQURZX0VYSVNUUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfUk9PVF9FTEVNRU5UX01VU1RfQkVfU1BFQ0lGSUVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FUlJPUl9TQ0hFTUFfSU5WQUxJRF9JTkZPOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FUlJPUl9EVERfSU5WQUxJRF9JTkZPOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FUlJPUl9DQVRBTE9HX0VOVFJZX0lOVkFMSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05BTUVTUEFDRV9JTkZPUk1BVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uX1BsdWdpbnNfVW5hdmFpbGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRhdGlvbl9jYW5ub3RfYmVfcGVyZm9ybWVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25fb3BfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uX29wX2Rlc2NfcHJvajsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfb3BfZXJyb3JfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vcF9lcnJvcl9tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfb3ZlcndyaXRlcXVlcnlfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vdmVyd3JpdGVxdWVyeV9tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlX2Vycm9yX2FscmVhZHlleGlzdHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzY7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19YTUxDQVRBTE9HX0lNUE9SVF9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRElBTE9HX1hNTENBVEFMT0dfRVhQT1JUX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9ESUFMT0dfWE1MQ0FUQUxPR19FWFBPUlRfREVTQ1JJUFRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19YTUxDQVRBTE9HX0lNUE9SVF9ERVNDUklQVElPTjsKLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgWE1MV2l6YXJkc01lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFhNTFdpemFyZHNNZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL3dpemFyZFJlc291cmNlLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL3dpemFyZFJlc291cmNlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZDdiYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy93aXphcmRSZXNvdXJjZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgRGF2aWQgQ2FydmVyL1NUQVIgU3RhbmRhcmQgLSBkX2FfY2FydmVyQHlhaG9vLmNvbSAtIGJ1ZyAxOTI1NjgKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEgUHJvcGVydGllcyBmaWxlIGZvciBjb21wb25lbnQ6IFhNTCBUb29scyAtICBOZXcgWE1MIFdpemFyZAotISBQYWNrYWdlZCBmb3IgdHJhbnNsYXRpb24gaW46ICB4bWwuemlwCi0KLSFYTUxJbXBvcnRBY3Rpb25EZWxlZ2F0ZQotX1VJX0RJQUxPR19ORVdfVElUTEUgICAgICAgID0gTmV3IFhNTCBGaWxlCi1fVUlfRElBTE9HX1RJVExFX0lOVkFMSURfR1JBTU1BUiA9IEludmFsaWQgR3JhbW1hcgotX1VJX0RJQUxPR19NRVNTQUdFX0lOVkFMSURfR1JBTU1BUiA9IFRoZSBncmFtbWFyIGZpbGUgY29udGFpbnMgZXJyb3JzLiBJZiB5b3UgcHJvY2VlZCwgYW4gaW5jb3JyZWN0IHJlc3VsdCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLQotIU5ld1hNTEJXaXphcmQKLV9VSV9XSVpBUkRfQ1JFQVRFX05FV19USVRMRSAgICAgICAgICAgPSBOZXcgWE1MIEZpbGUKLV9VSV9SQURJT19YTUxfRlJPTV9EVEQgICAgICAgICAgICAgICAgPSBDcmVhdGUgWE1MIGZpbGUgZnJvbSBhICZEVEQgZmlsZQotX1VJX1JBRElPX1hNTF9GUk9NX1NDSEVNQSAgICAgICAgICAgICA9IENyZWF0ZSBYTUwgZmlsZSBmcm9tIGFuICZYTUwgc2NoZW1hIGZpbGUKLV9VSV9SQURJT19YTUxfRlJPTV9TQ1JBVENIICAgICAgICAgICAgPSBDcmVhdGUgWE1MIGZpbGUgZnJvbSBhbiBYTUwgJnRlbXBsYXRlCi1fVUlfV0laQVJEX0NSRUFURV9YTUxfSEVBRElORyAgICAgICAgID0gQ3JlYXRlIFhNTCBGaWxlIEZyb20KLV9VSV9XSVpBUkRfQ1JFQVRFX1hNTF9FWFBMICAgICAgICAgICAgPSBTZWxlY3QgaG93IHlvdSB3b3VsZCBsaWtlIHRvIGNyZWF0ZSB5b3VyIFhNTCBmaWxlLgotX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0ZJTEVfSEVBRElORyAgICA9IFhNTCBGaWxlCi1fVUlfV0laQVJEX0NSRUFURV9YTUxfRklMRV9FWFBMICAgICAgID0gQ3JlYXRlIGEgbmV3IFhNTCBmaWxlLgotX1VJX1dJWkFSRF9TRUxFQ1RfRFREX0ZJTEVfREVTQyAgICAgICA9IFNlbGVjdCB0aGUgRFREIGZpbGUgdG8gY3JlYXRlIHRoZSBYTUwgZmlsZS4KLV9VSV9XSVpBUkRfU0VMRUNUX0RURF9GSUxFX1RJVExFICAgICAgPSBTZWxlY3QgRFREIEZpbGUKLV9VSV9XSVpBUkRfU0VMRUNUX1hTRF9GSUxFX0RFU0MgICAgICAgPSBTZWxlY3QgdGhlIHNjaGVtYSBmaWxlIHRvIGNyZWF0ZSB0aGUgWE1MIGZpbGUuCi1fVUlfV0laQVJEX1NFTEVDVF9YU0RfRklMRV9USVRMRSAgICAgID0gU2VsZWN0IFhNTCBTY2hlbWEgRmlsZQotX1VJX1dJWkFSRF9TRUxFQ1RfUk9PVF9IRUFESU5HICAgICAgICA9IFNlbGVjdCBSb290IEVsZW1lbnQKLV9VSV9XSVpBUkRfU0VMRUNUX1JPT1RfRVhQTCAgICAgICAgICAgPSBTZWxlY3QgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgWE1MIGZpbGUuCi1fVUlfTEFCRUxfUk9PVF9FTEVNRU5UICAgICAgICAgICAgICAgID0gUm9vdCBlbGVtZW50OgotX1VJX1dBUk5JTkdfVElUTEVfTk9fUk9PVF9FTEVNRU5UUyAgICA9IE5vIFJvb3QgRWxlbWVudHMKLV9VSV9XQVJOSU5HX01TR19OT19ST09UX0VMRU1FTlRTICAgICAgPSBObyByb290IGVsZW1lbnQgZXhpc3RzIHNpbmNlIHRoZSBzY2hlbWEgcHJvdmlkZWQgaGFzIG5vIGdsb2JhbCBlbGVtZW50cy4KLV9VSV9MQUJFTF9OT19MT0NBVElPTl9ISU5UICAgICAgICAgICAgPSBVbnNwZWNpZmllZCBOYW1lc3BhY2UgTG9jYXRpb24KLV9VSV9XQVJOSU5HX01TR19OT19MT0NBVElPTl9ISU5UXzEgICAgPSBZb3UgaGF2ZSBub3Qgc3BlY2lmaWVkIGEgbG9jYXRpb24gaGludCBmb3Igb25lIG9yIG1vcmUgbmFtZXNwYWNlIGVudHJpZXMuCi1fVUlfV0FSTklOR19NU0dfTk9fTE9DQVRJT05fSElOVF8yICAgID0gRWxlbWVudHMgZnJvbSB0aGVzZSBuYW1lc3BhY2VzIHdpbGwgbm90IGJlIGdlbmVyYXRlZC4gVGhpcyBtYXkgbGVhZCB0byBhbiBpbnZhbGlkIGdlbmVyYXRlZCBkb2N1bWVudC4KLV9VSV9XQVJOSU5HX01TR19OT19MT0NBVElPTl9ISU5UXzMgICAgPSBDbGljayBZZXMgdG8gY29udGludWUsIENsaWNrIE5vIHRvIGdvIGJhY2sgYW5kIHNwZWNpZnkgdGhlIGxvY2F0aW9uIGhpbnRzLgotX1VJX1dJWkFSRF9DT05URU5UX09QVElPTlMgICAgICAgICAgICA9IENvbnRlbnQgb3B0aW9ucwotCi1fVUlfV0laQVJEX0NSRUFURV9SRVFVSVJFRCAgICAgICAgICAgID0gJkNyZWF0ZSByZXF1aXJlZCBjb250ZW50IG9ubHkKLV9VSV9XSVpBUkRfQ1JFQVRFX09QVElPTkFMICAgICAgICAgICAgPSBDcmVhdGUgcmVxdWlyZWQgYW5kICZvcHRpb25hbCBjb250ZW50Ci0KLV9VSV9XSVpBUkRfQ1JFQVRFX09QVElPTkFMX0FUVFJJQlVURVMgPSBDcmVhdGUgb3B0aW9uYWwgJmF0dHJpYnV0ZXMKLV9VSV9XSVpBUkRfQ1JFQVRFX09QVElPTkFMX0VMRU1FTlRTICAgPSBDcmVhdGUgb3B0aW9uYWwgZSZsZW1lbnRzCi1fVUlfV0laQVJEX0NSRUFURV9GSVJTVF9DSE9JQ0UgICAgICAgID0gQ3JlYXRlIGZpcnN0IGNob2ljZSBvZiByZXF1aXJlZCAmY2hvaWNlCi1fVUlfV0laQVJEX0ZJTExfRUxFTUVOVFNfQU5EX0FUVFJJQlVURVMgPSBGaWxsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIHdpdGggJmRhdGEKLQotX1VJX0xBQkVMX0RPQ1RZUEVfSU5GT1JNQVRJT04gICAgICAgICA9IERvY3VtZW50IHR5cGUgaW5mb3JtYXRpb24KLV9VSV9MQUJFTF9TWVNURU1fSUQgICAgICAgICAgICAgICAgICAgPSAmU3lzdGVtIElEOgotX1VJX0xBQkVMX1BVQkxJQ19JRCAgICAgICAgICAgICAgICAgICA9ICZQdWJsaWMgSUQ6Ci0KLV9VSV9XQVJOSU5HX1VSSV9OT1RfRk9VTkRfQ09MT04gICAgICAgPSBUaGUgc3BlY2lmaWVkIHJlc291cmNlIGNhbm5vdCBiZSBsb2NhdGVkIDoKLQotIU5ld01vZGVsV2l6YXJkCi1fVUlfSU5WQUxJRF9HUkFNTUFSX0VSUk9SICAgICAgICAgICAgID0gSW52YWxpZCBHcmFtbWFyCi0KLSFOZXdNb2RlbFdpemFyZAotX0VSUk9SX0JBRF9GSUxFTkFNRV9FWFRFTlNJT04gICAgICAgICA9IFRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9ucyB7MH0uCi1fRVJST1JfRklMRV9BTFJFQURZX0VYSVNUUyAgICAgICAgICAgID0gVGhlIHNhbWUgZmlsZSBhbHJlYWR5IGV4aXN0cy4KLV9FUlJPUl9ST09UX0VMRU1FTlRfTVVTVF9CRV9TUEVDSUZJRUQgPSBBIHJvb3QgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZC4KLV9VSV9MQUJFTF9FUlJPUl9TQ0hFTUFfSU5WQUxJRF9JTkZPICAgPSBUaGUgc2NoZW1hIGZpbGUgY29udGFpbnMgZXJyb3JzLiBPcGVuIGl0IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciBmb3IgZGV0YWlscy4KLV9VSV9MQUJFTF9FUlJPUl9EVERfSU5WQUxJRF9JTkZPICAgICAgPSBUaGUgRFREIGZpbGUgY29udGFpbnMgZXJyb3JzLiBPcGVuIGl0IGluIHRoZSBEVEQgZWRpdG9yIGZvciBkZXRhaWxzLgotCi1fVUlfTEFCRUxfRVJST1JfQ0FUQUxPR19FTlRSWV9JTlZBTElEID0gVGhlIHNlbGVjdGVkIGNhdGFsb2cgZW50cnkgc3BlY2lmaWVzIGEgVVJJIHRoYXQgY2FuIG5vdCBiZSBsb2NhdGVkLgotCi1fVUlfTEFCRUxfTkFNRVNQQUNFX0lORk9STUFUSU9OPU5hbWVzcGFjZSBJbmZvcm1hdGlvbgotCi1WYWxpZGF0aW9uX1BsdWdpbnNfVW5hdmFpbGFibGU9VmFsaWRhdGlvbiBQbHVnaW5zIFVuYXZhaWxhYmxlCi1WYWxpZGF0aW9uX2Nhbm5vdF9iZV9wZXJmb3JtZWQ9VmFsaWRhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGJlY2F1c2UgdGhlIHZhbGlkYXRpb24gcGx1Z2lucyB3ZXJlIGRpc2FibGVkIG9yIG5vdCBmb3VuZC4gIFRoZSBnZW5lcmF0ZWQgZmlsZSBtYXkgYmUgaW52YWxpZC4gIERvIHlvdSB3aXNoIHRvIGNvbnRpbnVlPwotCi0hSW1wb3J0WE1MQ2F0YWxvZ1dpemFyZAotX1VJX0RJQUxPR19YTUxDQVRBTE9HX0lNUE9SVF9USVRMRSAgICA9IEltcG9ydCBYTUwgQ2F0YWxvZwotX1VJX0RJQUxPR19YTUxDQVRBTE9HX0lNUE9SVF9ERVNDUklQVElPTiA9IEltcG9ydCBhbGwgZW50cmllcyBmcm9tIGFuIGV4aXN0aW5nIFhNTCBDYXRhbG9nIGludG8gdGhlIFVzZXIgQ2F0YWxvZy4KLQotIUV4cG9ydFhNTENhdGFsb2dXaXphcmQKLV9VSV9ESUFMT0dfWE1MQ0FUQUxPR19FWFBPUlRfVElUTEUgICAgPSBFeHBvcnQgRXhpc3RpbmcgWE1MIENhdGFsb2cKLV9VSV9ESUFMT0dfWE1MQ0FUQUxPR19FWFBPUlRfREVTQ1JJUFRJT04gPSBFeHBvcnQgYWxsIGV4aXN0aW5nIFVzZXIgQ2F0YWxvZyBlbnRyaWVzLgotIwotIyBFeGFtcGxlUHJvamVjdAotRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbl9vcF9kZXNjPUNyZWF0aW5nIGV4YW1wbGUgcHJvamVjdHMuLi4KLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25fb3BfZGVzY19wcm9qPUNvbmZpZ3VyaW5nIHByb2plY3QuLi4KLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfdGl0bGU9TmV3IEV4YW1wbGUgUHJvamVjdAotRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vcF9lcnJvcl90aXRsZT1Qcm9qZWN0IENyZWF0aW9uIEZhaWxlZAotRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vcF9lcnJvcl9tZXNzYWdlPVByb2plY3QgY291bGQgbm90IGJlIGNyZWF0ZWQuCi1FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkX292ZXJ3cml0ZXF1ZXJ5X3RpdGxlPU92ZXJ3cml0ZQotRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vdmVyd3JpdGVxdWVyeV9tZXNzYWdlPURvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSB7MH0/Ci1FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZV9lcnJvcl9hbHJlYWR5ZXhpc3RzPVByb2plY3QgYWxyZWFkeSBleGlzdHMuCi0KLU5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMD1TZWxlY3QgWE1MIFRlbXBsYXRlCi1OZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzE9U2VsZWN0IGEgdGVtcGxhdGUgYXMgaW5pdGlhbCBjb250ZW50IGluIHRoZSBYTUwgcGFnZS4KLU5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMj1OYW1lCi1OZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzM9RGVzY3JpcHRpb24KLU5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfND1Vc2UgWE1MIFRlbXBsYXRlCi1OZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzU9UHJldmlldzoKLU5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNj1UZW1wbGF0ZXMgYXJlICdOZXcgWE1MJyB0ZW1wbGF0ZXMgZm91bmQgaW4gdGhlIDxhPlhNTCBUZW1wbGF0ZXM8L2E+IHByZWZlcmVuY2UgcGFnZS4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNkZDVhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklDb250ZW50Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLk11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxGb3JtYXR0aW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hdXRvZWRpdC5BdXRvRWRpdFN0cmF0ZWd5Rm9yVGFiczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyRm9yWE1MOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQ29uZmlndXJhdGlvbiBmb3IgYSBzb3VyY2Ugdmlld2VyIHdoaWNoIHNob3dzIFhNTCBjb250ZW50LgotICogPHA+Ci0gKiBDbGllbnRzIGNhbiBzdWJjbGFzcyBhbmQgb3ZlcnJpZGUganVzdCB0aG9zZSBtZXRob2RzIHdoaWNoIG11c3QgYmUgc3BlY2lmaWMKLSAqIHRvIHRoZWlyIG5lZWRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gewotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uIGJlY2F1c2Ugbm90IHNvdXJjZXZpZXdlci1zcGVjaWZpYyBhbmQKLQkgKiBpdCdzIGEgU3RyaW5nIGFycmF5Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBmQ29uZmlndXJlZENvbnRlbnRUeXBlczsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZkxpbmVTdHlsZVByb3ZpZGVyRm9yWE1MOwotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJQXV0b0VkaXRTdHJhdGVneVtdIGdldEF1dG9FZGl0U3RyYXRlZ2llcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCUxpc3QgYWxsU3RyYXRlZ2llcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0KLQkJSUF1dG9FZGl0U3RyYXRlZ3lbXSBzdXBlclN0cmF0ZWdpZXMgPSBzdXBlci5nZXRBdXRvRWRpdFN0cmF0ZWdpZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJTdHJhdGVnaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhbGxTdHJhdGVnaWVzLmFkZChzdXBlclN0cmF0ZWdpZXNbaV0pOwotCQl9Ci0KLQkJLy8gYmUgc3VyZSB0aGlzIGlzIGxhc3QsIHNvIGl0IGNhbiBtb2RpZnkgYW55IHJlc3VsdHMgZm9ybSBwcmV2aW91cwotCQkvLyBjb21tYW5kcyB0aGF0IG1pZ2h0IG9uIG9uIHNhbWUgcGFydGlpb24gdHlwZS4KLQkJLy8gYWRkIGF1dG8gZWRpdCBzdHJhdGVneSB0aGF0IGhhbmRsZXMgd2hlbiB0YWIga2V5IGlzIHByZXNzZWQKLQkJYWxsU3RyYXRlZ2llcy5hZGQobmV3IEF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzKCkpOwotCi0JCXJldHVybiAoSUF1dG9FZGl0U3RyYXRlZ3lbXSkgYWxsU3RyYXRlZ2llcy50b0FycmF5KG5ldyBJQXV0b0VkaXRTdHJhdGVneVthbGxTdHJhdGVnaWVzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0KLQkJaWYgKGZDb25maWd1cmVkQ29udGVudFR5cGVzID09IG51bGwpIHsKLQkJCVN0cmluZ1tdIHhtbFR5cGVzID0gU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTC5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCk7Ci0JCQlmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbeG1sVHlwZXMubGVuZ3RoICsgMl07Ci0JCQlmQ29uZmlndXJlZENvbnRlbnRUeXBlc1swXSA9IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTjsKLQkJCWZDb25maWd1cmVkQ29udGVudFR5cGVzWzFdID0gSVN0cnVjdHVyZWRQYXJ0aXRpb25zLlVOS05PV05fUEFSVElUSU9OOwotCQkJaW50IGluZGV4ID0gMDsKLQkJCVN5c3RlbS5hcnJheWNvcHkoeG1sVHlwZXMsIDAsIGZDb25maWd1cmVkQ29udGVudFR5cGVzLCBpbmRleCArPSAyLCB4bWxUeXBlcy5sZW5ndGgpOwotCQl9Ci0JCXJldHVybiBmQ29uZmlndXJlZENvbnRlbnRUeXBlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBwcm9jZXNzb3JzID0gbnVsbDsKLQotCQlpZiAoKHBhcnRpdGlvblR5cGUgPT0gSVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OKSB8fCAocGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCkpIHsKLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXXtuZXcgWE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcigpfTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTikgewotCQkJcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde25ldyBOb1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKX07Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc29yczsKLQl9Ci0KLQlwdWJsaWMgSUNvbnRlbnRGb3JtYXR0ZXIgZ2V0Q29udGVudEZvcm1hdHRlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlJQ29udGVudEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBzdXBlci5nZXRDb250ZW50Rm9ybWF0dGVyKHNvdXJjZVZpZXdlcik7Ci0JCS8vIHN1cGVyIHdhcyB1bmFibGUgdG8gY3JlYXRlIGEgZm9ybWF0dGVyLCBwcm9iYWJseSBiZWNhdXNlCi0JCS8vIHNvdXJjZVZpZXdlciBkb2VzIG5vdCBoYXZlIGRvY3VtZW50IHNldCB5ZXQsIHNvIGp1c3QgY3JlYXRlIGEKLQkJLy8gZ2VuZXJpYyBvbmUKLQkJaWYgKCEoZm9ybWF0dGVyIGluc3RhbmNlb2YgTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcikpCi0JCQlmb3JtYXR0ZXIgPSBuZXcgTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcihnZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcoc291cmNlVmlld2VyKSwgSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQpOwotCQkoKE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIpIGZvcm1hdHRlcikuc2V0TWFzdGVyU3RyYXRlZ3kobmV3IFhNTEZvcm1hdHRpbmdTdHJhdGVneSgpKTsJCQotLy8JCSgoTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcikgZm9ybWF0dGVyKS5zZXRNYXN0ZXJTdHJhdGVneShuZXcgU3RydWN0dXJlZEZvcm1hdHRpbmdTdHJhdGVneShuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCkpKTsKLQotCQlyZXR1cm4gZm9ybWF0dGVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRJbmRlbnRQcmVmaXhlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCVZlY3RvciB2ZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJLy8gcHJlZml4WzBdIGlzIGVpdGhlciAnXHQnIG9yICcgJyB4IHRhYldpZHRoLCBkZXBlbmRpbmcgb24gcHJlZmVyZW5jZQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0JCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQlib29sZWFuIHVzZVNwYWNlcyA9IFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0UuZXF1YWxzKGluZGVudENoYXJQcmVmKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8PSBpbmRlbnRhdGlvbldpZHRoOyBpKyspIHsKLQkJCVN0cmluZ0J1ZmZlciBwcmVmaXggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlib29sZWFuIGFwcGVuZFRhYiA9IGZhbHNlOwotCi0JCQlpZiAodXNlU3BhY2VzKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogKyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaisrKSB7Ci0JCQkJCXByZWZpeC5hcHBlbmQoJyAnKTsKLQkJCQl9Ci0KLQkJCQlpZiAoaSAhPSAwKSB7Ci0JCQkJCWFwcGVuZFRhYiA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKLQkJCQkJcHJlZml4LmFwcGVuZCgnICcpOwotCQkJCX0KLQotCQkJCWlmIChpICE9IGluZGVudGF0aW9uV2lkdGgpIHsKLQkJCQkJYXBwZW5kVGFiID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChhcHBlbmRUYWIpIHsKLQkJCQlwcmVmaXguYXBwZW5kKCdcdCcpOwotCQkJCXZlY3Rvci5hZGQocHJlZml4LnRvU3RyaW5nKCkpOwotCQkJCS8vIHJlbW92ZSB0aGUgdGFiIHNvIHRoYXQgaW5kZW50YXRpb24gLSB0YWIgaXMgYWxzbyBhbiBpbmRlbnQKLQkJCQkvLyBwcmVmaXgKLQkJCQlwcmVmaXguZGVsZXRlQ2hhckF0KHByZWZpeC5sZW5ndGgoKSAtIDEpOwotCQkJfQotCQkJdmVjdG9yLmFkZChwcmVmaXgudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQl2ZWN0b3IuYWRkKCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiAoU3RyaW5nW10pIHZlY3Rvci50b0FycmF5KG5ldyBTdHJpbmdbdmVjdG9yLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJTGluZVN0eWxlUHJvdmlkZXJbXSBwcm92aWRlcnMgPSBudWxsOwotCi0JCWlmICgocGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0NEQVRBKSB8fCAocGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfQ09NTUVOVCkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0RFQ0xBUkFUSU9OKSB8fCAocGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfUEkpKSB7Ci0JCQlwcm92aWRlcnMgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJbXXtnZXRMaW5lU3R5bGVQcm92aWRlckZvclhNTCgpfTsKLQkJfQotCi0JCXJldHVybiBwcm92aWRlcnM7Ci0JfQotCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBnZXRMaW5lU3R5bGVQcm92aWRlckZvclhNTCgpIHsKLQkJaWYgKGZMaW5lU3R5bGVQcm92aWRlckZvclhNTCA9PSBudWxsKSB7Ci0JCQlmTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwoKTsKLQkJfQotCQlyZXR1cm4gZkxpbmVTdHlsZVByb3ZpZGVyRm9yWE1MOwotCX0KLQotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRTdGF0dXNMaW5lTGFiZWxQcm92aWRlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlpZiAoZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZTdGF0dXNMaW5lTGFiZWxQcm92aWRlciA9IG5ldyBKRmFjZU5vZGVMYWJlbFByb3ZpZGVyKCkgewotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJCQkJcmV0dXJuIG51bGw7Ci0KLQkJCQkJU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBlbGVtZW50OwotCQkJCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCQkJCXMuaW5zZXJ0KDAsIHN1cGVyLmdldFRleHQobm9kZSkpOwotCQkJCQkJfQotCQkJCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJCQkJcy5pbnNlcnQoMCwgSVBhdGguU0VQQVJBVE9SKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gcy50b1N0cmluZygpOwotCQkJCX0KLQotCQkJfTsKLQkJfQotCQlyZXR1cm4gZlN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyOwotCX0KLQotCXByb3RlY3RlZCBNYXAgZ2V0SHlwZXJsaW5rRGV0ZWN0b3JUYXJnZXRzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCU1hcCB0YXJnZXRzID0gc3VwZXIuZ2V0SHlwZXJsaW5rRGV0ZWN0b3JUYXJnZXRzKHNvdXJjZVZpZXdlcik7Ci0JCXRhcmdldHMucHV0KENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwsIG51bGwpOwotCQlyZXR1cm4gdGFyZ2V0czsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvRE9NT2JzZXJ2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9ET01PYnNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzk5YTZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9ET01PYnNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5DTURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBvYnNlcnZlIGNoYW5nZXMgaW4gdGhlIERPTSBhbmQgcGVyZm9ybQotICogb2NjYXNpb25hbCdzY2FucycgdG8gZGVkdWNlIGluZm9ybWF0aW9uLiBXZSB1c2UgYSBkZWxheSB0aW1lciBtZWNoYW5pc20gdG8KLSAqIGVuc3VyZSBzY2FucyBhcmUgbWFkZSBldmVyeSBjb3VwbGUgb2Ygc2Vjb25kcyB0byBhdm9pZCBwZXJmb3JtYW5jZQotICogcHJvYmxlbXMuIEN1cnJlbnRseSB0aGlzIGNsYXNzIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiByZWZlcmVuY2VkIGdyYW1tYXIKLSAqIHVyaSdzIHdpdGhpbiB0aGUgZG9jdW1lbnQgZW5zdXJlIHRoYXQgdGhleSBhcmUgbG9hZGVkIGJ5IHRoZQotICogQ01Eb2N1bWVudE1hbmFnZXIuIFdlIG1pZ2h0IHdhbnQgdG8gZ2VuZXJhbGl6ZSB0aGlzIGNsYXNzIHRvIHBlcmZvcm0gb3RoZXIKLSAqIHN1cGxpbWVudGFsIGluZm9ybWF0aW9uIGdhdGhlcmluZyB0aGF0IGlzIHN1aXRhYmxlIGZvciAndGltZSBkZWxheWVkJwotICogY29tcHV0YXRpb24gKGVycm9yIGhpbnRzIGV0Yy4pLgotICovCi0vLyBUT0RPOiBXaGVyZSBzaG91bGQgdGhpcyBjbGFzcyBnbz8KLXB1YmxpYyBjbGFzcyBET01PYnNlcnZlciB7Ci0KLQotCS8vIEFuIGFic3RyYWN0IGFkYXB0ZXIgdGhhdCBlbnN1cmVzIHRoYXQgdGhlIGNoaWxkcmVuIG9mIGEgbmV3IE5vZGUgYXJlCi0JLy8gYWxzbyBhZGFwdGVkCi0JLy8KLQlhYnN0cmFjdCBjbGFzcyBEb2N1bWVudEFkYXB0ZXIgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIgewotCQlwdWJsaWMgRG9jdW1lbnRBZGFwdGVyKCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29ubmVjdChEb2N1bWVudCBkb2N1bWVudCkgewotCQkJKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuYWRkQWRhcHRlcih0aGlzKTsKLQkJCWFkYXB0KGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpY2Nvbm5lY3QoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJCSgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLnJlbW92ZUFkYXB0ZXIodGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGFwdChFbGVtZW50IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoKChJTm9kZU5vdGlmaWVyKSBlbGVtZW50KS5nZXRFeGlzdGluZ0FkYXB0ZXIodGhpcykgPT0gbnVsbCkgewotCQkJCQkoKElOb2RlTm90aWZpZXIpIGVsZW1lbnQpLmFkZEFkYXB0ZXIodGhpcyk7Ci0KLQkJCQkJZm9yIChOb2RlIGNoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCQlhZGFwdCgoRWxlbWVudCkgY2hpbGQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQkJcmV0dXJuIHR5cGUgPT0gdGhpczsKLQkJfQotCi0JCWFic3RyYWN0IHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY2xhc3MgbGlzdGVucyB0byB0aGUgY2hhbmdlcyBpbiB0aGUgQ01Eb2N1bWVudCBhbmQgdHJpZ2dlcnMgYQotCSAqIENNRG9jdW1lbnQgbG9hZAotCSAqLwotCWNsYXNzIE15RG9jdW1lbnRBZGFwdGVyIGV4dGVuZHMgRG9jdW1lbnRBZGFwdGVyIHsKLQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50VHlwZSkgewotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5BREQgOiB7Ci0JCQkJCWlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQUREICh0byAiICsKLQkJCQkJCS8vICgoTm9kZSlub3RpZmllcikuZ2V0Tm9kZU5hbWUoKSArICIpICIgKwotCQkJCQkJLy8gKChFbGVtZW50KW5ld1ZhbHVlKS5nZXROb2RlTmFtZSgpICsgIiBvbGQgIiArCi0JCQkJCQkvLyBvbGRWYWx1ZSk7Ci0JCQkJCQlhZGFwdCgoRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkJLy8gY2FzZSBJTm9kZU5vdGlmaWVyLlJFTU9WRToKLQkJCQljYXNlIElOb2RlTm90aWZpZXIuQ0hBTkdFIDoKLQkJCQljYXNlIElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQgOgotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5DT05URU5UX0NIQU5HRUQgOiB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBub3RpZmllcjsKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJc3dpdGNoIChldmVudFR5cGUpIHsKLQkJCQkJCQljYXNlIElOb2RlTm90aWZpZXIuQ0hBTkdFIDoKLQkJCQkJCQljYXNlIElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQgOiB7Ci0JCQkJCQkJCS8vIHN0cnVjdHVyZSBjaGFuZ2UKLQkJCQkJCQkJaW52b2tlRGVsYXllZENNRG9jdW1lbnRMb2FkKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCQljYXNlIElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VEIDogewotCQkJCQkJCQkvLyBzb21lIGNvbnRlbnQgY2hhbmdlZAotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCQkJaW52b2tlRGVsYXllZENNRG9jdW1lbnRMb2FkKCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW50ZW50aW9uYWxseSBsZWZ0IHZpc2libGUgdG8gdGhlIHVzZXIKLQkgKi8KLQljbGFzcyBUaW1lckpvYiBleHRlbmRzIEpvYiB7Ci0JCXB1YmxpYyBUaW1lckpvYigpIHsKLQkJCXN1cGVyKFNTRVVJTWVzc2FnZXMuTG9hZGluZ1JlZmVyZW5jZWRHcmFtbWFycyk7Ci0JCQlzZXRQcmlvcml0eShKb2IuU0hPUlQpOwotCQl9Ci0KLQkJcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLQkJCWludm9rZUNNRG9jdW1lbnRMb2FkKCk7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBKb2IgdGltZXIgPSBuZXcgVGltZXJKb2IoKTsKLQlwcm90ZWN0ZWQgRG9jdW1lbnQgZkRvY3VtZW50OwotCXByb3RlY3RlZCBib29sZWFuIGlzR3JhbW1hckluZmVyZW5jZUVuYWJsZWQ7Ci0KLQlwdWJsaWMgRE9NT2JzZXJ2ZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlmRG9jdW1lbnQgPSAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpID8gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpIDogbnVsbDsKLQotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCS8vIGhlcmUgd2UgY3JlYXRlIGFuZCBpbml0IGFuIGFkYXB0ZXIgdGhhdCB3aWxsIGxpc3RlbiB0bwotCQkJLy8gY2hhbmdlcyB0byB0aGUgZG9jdW1lbnQgYW5kIGNvbnRhaW5lZCBlbGVtZW50cwotCQkJTXlEb2N1bWVudEFkYXB0ZXIgYWRhcHRlciA9IG5ldyBNeURvY3VtZW50QWRhcHRlcigpOwotCQkJYWRhcHRlci5jb25uZWN0KGZEb2N1bWVudCk7Ci0KLQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZkRvY3VtZW50KTsKLQkJCWlmICgobW9kZWxRdWVyeSAhPSBudWxsKSAmJiAobW9kZWxRdWVyeS5nZXRDTURvY3VtZW50TWFuYWdlcigpICE9IG51bGwpKSB7Ci0JCQkJQ01Eb2N1bWVudE1hbmFnZXIgY21Eb2N1bWVudE1hbmFnZXIgPSBtb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0JCQkJY21Eb2N1bWVudE1hbmFnZXIuc2V0UHJvcGVydHlFbmFibGVkKENNRG9jdW1lbnRNYW5hZ2VyLlBST1BFUlRZX0FVVE9fTE9BRCwgZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJLy8gQ1M6IHdlIHNlZW0gdG8gZXhwb3NlIGFuIFhTRCBpbml0aWFsaXphdGlvbiBwcm9ibGVtIHdoZW4gd2UgZG8gdGhpcwotCQkvLyBpbW1lZGlhdGVseQotCQkvLyB2ZXJ5IG5hc3R5Li4uIEkgbmVlZCB0byByZXZpc3QgdGhpcyBwcm9ibGVtIHdpdGggRWQgTWVya3MKLQkJLy8KLQkJLy8gaW52b2tlQ01Eb2N1bWVudExvYWQoKTsKLQkJaW52b2tlRGVsYXllZENNRG9jdW1lbnRMb2FkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW52b2tlQ01Eb2N1bWVudExvYWQoKSB7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZkRvY3VtZW50KTsKLQkJaWYgKChtb2RlbFF1ZXJ5ICE9IG51bGwpICYmIChtb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCkgIT0gbnVsbCkpIHsKLQkJCUNNRG9jdW1lbnRMb2FkZXIgbG9hZGVyID0gaXNHcmFtbWFySW5mZXJlbmNlRW5hYmxlZCA/IG5ldyBJbmZlcnJlZEdyYW1tYXJCdWlsZGluZ0NNRG9jdW1lbnRMb2FkZXIoZkRvY3VtZW50LCBtb2RlbFF1ZXJ5KSA6IG5ldyBDTURvY3VtZW50TG9hZGVyKGZEb2N1bWVudCwgbW9kZWxRdWVyeSk7Ci0JCQlsb2FkZXIubG9hZENNRG9jdW1lbnRzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnZva2VEZWxheWVkQ01Eb2N1bWVudExvYWQoKSB7Ci0JCXRpbWVyLnNjaGVkdWxlKDIwMDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdyYW1tYXJJbmZlcmVuY2VFbmFibGVkKGJvb2xlYW4gaXNFbmFibGVkKSB7Ci0JCWlzR3JhbW1hckluZmVyZW5jZUVuYWJsZWQgPSBpc0VuYWJsZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOThlN2FiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBFUlJPUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIElORk87Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgT0s7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgV0FSTklORzsKLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoT0ssIElORk8sIFdBUk5JTkcsIEVSUk9SLAotCSAqICAgICAgICAgICAgT0tfREVCVUcsIElORk9fREVCVUcsIFdBUk5JTkdfREVCVUcsIEVSUk9SX0RFQlVHKQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93bgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKChsZXZlbCA9PSBPS19ERUJVRykgfHwgKGxldmVsID09IElORk9fREVCVUcpIHx8IChsZXZlbCA9PSBXQVJOSU5HX0RFQlVHKSB8fCAobGV2ZWwgPT0gRVJST1JfREVCVUcpKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvWE1MRm9ybWF0dGluZ1N0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvWE1MRm9ybWF0dGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NDMyZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL1hNTEZvcm1hdHRpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UeXBlZFBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Gb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUZvcm1hdHRpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklGb3JtYXR0aW5nU3RyYXRlZ3lFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuRGVmYXVsdFhNTFBhcnRpdGlvbkZvcm1hdHRlcjsKLQotcHVibGljIGNsYXNzIFhNTEZvcm1hdHRpbmdTdHJhdGVneSBleHRlbmRzIENvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSBpbXBsZW1lbnRzIElGb3JtYXR0aW5nU3RyYXRlZ3lFeHRlbnNpb24gewotCi0JLyoqIERvY3VtZW50cyB0byBiZSBmb3JtYXR0ZWQgYnkgdGhpcyBzdHJhdGVneSAqLwotCXByaXZhdGUgZmluYWwgTGlua2VkTGlzdCBmRG9jdW1lbnRzID0gbmV3IExpbmtlZExpc3QoKTsKLQkvKiogUGFydGl0aW9ucyB0byBiZSBmb3JtYXR0ZWQgYnkgdGhpcyBzdHJhdGVneSAqLwotCXByaXZhdGUgZmluYWwgTGlua2VkTGlzdCBmUGFydGl0aW9ucyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JcHJpdmF0ZSBJUmVnaW9uIGZSZWdpb247Ci0JcHJpdmF0ZSBEZWZhdWx0WE1MUGFydGl0aW9uRm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBEZWZhdWx0WE1MUGFydGl0aW9uRm9ybWF0dGVyKCk7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZm9ybWF0UHJvY2Vzc29yCi0JICovCi0JcHVibGljIFhNTEZvcm1hdHRpbmdTdHJhdGVneSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5I2Zvcm1hdCgpCi0JICovCi0JcHVibGljIHZvaWQgZm9ybWF0KCkgewotCQlzdXBlci5mb3JtYXQoKTsKLQotCQlmaW5hbCBJRG9jdW1lbnQgZG9jdW1lbnQgPSAoSURvY3VtZW50KSBmRG9jdW1lbnRzLnJlbW92ZUZpcnN0KCk7Ci0JCWZpbmFsIFR5cGVkUG9zaXRpb24gcGFydGl0aW9uID0gKFR5cGVkUG9zaXRpb24pIGZQYXJ0aXRpb25zLnJlbW92ZUZpcnN0KCk7Ci0KLQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgcGFydGl0aW9uICE9IG51bGwgJiYgZlJlZ2lvbiAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCk7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCVRleHRFZGl0IGVkaXQgPSBmb3JtYXR0ZXIuZm9ybWF0KG1vZGVsLCBmUmVnaW9uLmdldE9mZnNldCgpLCBmUmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJCQkJCQkJCWVkaXQuYXBwbHkoZG9jdW1lbnQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5I2Zvcm1hdHRlclN0YXJ0cyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JRm9ybWF0dGluZ0NvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgZm9ybWF0dGVyU3RhcnRzKGZpbmFsIElGb3JtYXR0aW5nQ29udGV4dCBjb250ZXh0KSB7Ci0JCXN1cGVyLmZvcm1hdHRlclN0YXJ0cyhjb250ZXh0KTsKLQotCQlmUGFydGl0aW9ucy5hZGRMYXN0KGNvbnRleHQuZ2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfUEFSVElUSU9OKSk7Ci0JCWZEb2N1bWVudHMuYWRkTGFzdChjb250ZXh0LmdldFByb3BlcnR5KEZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllcy5DT05URVhUX01FRElVTSkpOwotCQlmUmVnaW9uID0gKElSZWdpb24pIGNvbnRleHQuZ2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfUkVHSU9OKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5I2Zvcm1hdHRlclN0b3BzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXR0ZXJTdG9wcygpIHsKLQkJc3VwZXIuZm9ybWF0dGVyU3RvcHMoKTsKLQotCQlmUGFydGl0aW9ucy5jbGVhcigpOwotCQlmRG9jdW1lbnRzLmNsZWFyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL1hNTFVJTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9YTUxVSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NjBmNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL1hNTFVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIEJlbmphbWluIE11c2thbGxhLCBiLm11c2thbGxhQGdteC5uZXQgLSBbMTU4NjYwXSBjaGFyYWN0ZXIgZW50aXRpZXMgc2hvdWxkIGhhdmUgdGhlaXIgb3duIHN5bnRheCBoaWdobGlnaHRpbmcgcHJlZmVyZW5jZQotICogRGF2aWQgQ2FydmVyIC0gU1RBUiAtIFsyMDU5ODldIC0gW3ZhbGlkYXRpb25dIHZhbGlkYXRlIFhNTCBhZnRlciBYSW5jbHVkZSByZXNvbHV0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgWE1MIFVJCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1MVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmUmVzb3VyY2VCdW5kbGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYW1wbGVfWE1MX2RvYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tZW50X0RlbGltaXRlcnNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1lbnRfQ29udGVudF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnX0RlbGltaXRlcnNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ19OYW1lc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX05hbWVzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfVmFsdWVzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWNsYXJhdGlvbl9EZWxpbWl0ZXJzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDREFUQV9EZWxpbWl0ZXJzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDREFUQV9Db250ZW50X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzaW5nX0luc3RydWN0aW9uX0RlbF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc2luZ19JbnN0cnVjdGlvbl9Db25fVUlfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBET0NUWVBFX05hbWVfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERPQ1RZUEVfU1lTVEVNX1BVQkxJQ19LZXl3X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBET0NUWVBFX1B1YmxpY19SZWZlcmVuY2VfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERPQ1RZUEVfU3lzdGVtX1JlZmVyZW5jZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5X1JlZmVyZW5jZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERF9BRlRFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9BRERfQVRUUklCVVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERF9CRUZPUkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQUREX0NISUxEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1JFTU9WRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9SRVBMQUNFX1dJVEg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfRURJVF9ET0NUWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9VTkRPX1JFUExBQ0VfREVTQ1JJUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VESVRfRE9DVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSU5GT19FWFBBTkRfQUxMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9JTkZPX0NPTExBUFNFX0FMTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9BRERfRFREX0lORk9STUFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERF9TQ0hFTUFfSU5GT1JNQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfRURJVF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0VESVRfTkFNRVNQQUNFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9BRERfRFREX0lORk9STUFUSU9OX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0VESVRfUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9FRElUX1NDSEVNQV9JTkZPUk1BVElPTl9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9ORVdfQVRUUklCVVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX05FV19BVFRSSUJVVEVfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfRURJVF9BVFRSSUJVVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfRURJVF9BVFRSSUJVVEVfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfTkVXX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfTkVXX0VMRU1FTlRfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfUkVOQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1JFTkFNRV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRUxFTUVOVF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERF9DT01NRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERF9DREFUQV9TRUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERF9QQ0RBVEE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQ09NTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0NEQVRBX1NFQ1RJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfUENEQVRBOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ09NTUVOVF9WQUxVRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUElfVEFSR0VUX1ZBTFVFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QSV9EQVRBX1ZBTFVFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9ST09UX0VMRU1FTlRfVkFMVUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1RBUkdFVF9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfREFUQV9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUk9PVF9FTEVNRU5UX05BTUVfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1BVQkxJQ19JRF9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU1lTVEVNX0lEX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9CUk9XU0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NFTEVDVF9YTUxfQ0FUQUxPR19FTlRSWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU1BFQ0lGWV9TWVNURU1fSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NFTEVDVF9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9LRVk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1VSSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfWE1MX0NBVEFMT0dfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05BTUVTUEFDRV9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9MT0NBVElPTl9ISU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9QUkVGSVg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05BTUVTUEFDRV9OQU1FX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9MT0NBVElPTl9ISU5UX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9QUkVGSVhfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX05PX05BTUVTUEFDRV9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9OT19QUkVGSVg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1hNTF9TQ0hFTUFfSU5GT1JNQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05BTUVfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1ZBTFVFX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9CVVRUT05fREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9CVVRUT05fTkVXOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9CVVRUT05fRURJVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTkVXX05BTUVTUEFDRV9JTkZPUk1BVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkFESU9fQlVUVE9OX1NFTEVDVF9GUk9NX1dPUktTUEFDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkFESU9fQlVUVE9OX1NFTEVDVF9GUk9NX0NBVEFMT0c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIT1VUX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIT1VUX1BSRUZJWDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0FSTklOR19NT1JFX1RIQU5fT05FX05TX1dJVEhfUFJFRklYOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX1NDSEVNQV9DQU5fTk9UX0JFX0xPQ0FURUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfTE9DQVRJT05fSElOVF9OT1RfU1BFQ0lGSUVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX05BTUVTUEFDRV9OQU1FX05PVF9TUEVDSUZJRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfUFJFRklYX05PVF9TUEVDSUZJRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfUk9PVF9FTEVNRU5UX01VU1RfQkVfU1BFQ0lGSUVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX1NZU1RFTV9JRF9NVVNUX0JFX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSU5WQUxJRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FTlRFUl9SRVFfUFJFRklYX0FORF9OQU1FU1BBQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NFTEVDVF9SRUdJU1RFUkVEX05BTUVTUEFDRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NQRUNJRllfTkVXX05BTUVTUEFDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU0VMRUNUX05BTUVTUEFDRV9UT19BREQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FERF9OQU1FU1BBQ0VfREVDTEFSQVRJT05TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9OQU1FU1BBQ0VfREVDTEFSQVRJT05TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9UQVJHRVRfTkFNRVNQQUNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9YTUxfQVRUUklCVVRFX0FMUkVBRFlfRVhJU1RTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yX21lc3NhZ2VfZ29lc19oZXJlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWxfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lSW5GaWxlUXVpY2tBc3Npc3RQcm9wb3NhbF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zZXJ0UmVxdWlyZWRBdHRyc1F1aWNrQXNzaXN0UHJvcG9zYWxfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmNvZGluZ1NldHRpbmdzXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5jb2RpbmdTZXR0aW5nc18xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERyYWdOb2RlQ29tbWFuZF8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERyYWdOb2RlQ29tbWFuZF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkZhY2VOb2RlQWRhcHRlcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF84OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MUHJvcGVydHlTb3VyY2VBZGFwdGVyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2JlbmNoRGVmYXVsdEVuY29kaW5nU2V0dGluZ3NfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZyZXNob3V0bGluZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0aW5nX2ZpbGVzX2VuY29kaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZF90YWdfaGFzX2F0dHJpYnV0ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX19pc19taXNzaW5nX2FfdmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX19oYXNfbm9fdmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlzc2luZ19lbmRfdGFnXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWNvbmNpbGVTdGVwRm9yTWFya3VwXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVjb25jaWxlU3RlcEZvck1hcmt1cF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWNvbmNpbGVTdGVwRm9yTWFya3VwXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVjb25jaWxlU3RlcEZvck1hcmt1cF80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWNvbmNpbGVTdGVwRm9yTWFya3VwXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kX3dpdGhfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFVkVSRV9pbnRlcm5hbF9lcnJvcl9vY2N1X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb19rbm93bl9hdHRyaWJ1dGVfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50X0Fzc2lzdF9ub3RfYXZhaWxhYl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudF9faXNfdW5rbm93bjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tZW50X187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xvc2Vfd2l0aF9fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZF93aXRoX187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xvc2Vfd2l0aF9fXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbG9zZV93aXRoX19fXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfSGFzX25vX2F2YWlsYWJsZV9jaGlsZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb19rbm93bl9jaGlsZF90YWc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX19IYXNfbm9fa25vd25fY2hpbGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fa25vd25fY2hpbGRfdGFnX25hbWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRoZV9kb2N1bWVudF9lbGVtZW50X187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fZGVmaW5pdGlvbl9mb3JfaW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fZGVmaW5pdGlvbl9mb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fY29udGVudF9tb2RlbF9mb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fY29udGVudF9tb2RlbF9mb3VuZF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcHJlc3NfZW1wdHlfZWxlbWVudF90YWdzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnNlcnRfcmVxdWlyZWRfYXR0cmlidXRlc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zZXJ0X21pc3NpbmdfdGFnc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVvdGVfYXR0cmlidXRlX3ZhbHVlc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0X3NvdXJjZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udmVydF9FT0xfY29kZXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVPTF9XaW5kb3dzX1VJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVPTF9Vbml4X1VJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVPTF9NYWNfVUk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRpbmdfZmlsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5jb2RpbmdfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmNvZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGluZ19vcl9zYXZpbmdfZmlsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kX29mX2xpbmVfY29kZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZF9vZl9saW5lX2NvZGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU9MX1dpbmRvd3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU9MX1VuaXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU9MX01hYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFT0xfTm9UcmFuc2xhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxGaWxlc1ByZWZlcmVuY2VQYWdlX0V4dGVuc2lvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudF9hc3Npc3RfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY2FsbHlfbWFrZV9zdWdnZXN0X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9tcHRfd2hlbl90aGVzZV9jaGFyYWN0ZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0dGluZ19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGluZV93aWR0aF9fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNwbGl0X211bHRpcGxlX2F0dHJpYnV0ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWxpZ25fZmluYWxfYnJhY2tldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVzZXJ2ZV9QQ0RBVEFfQ29udGVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTcGFjZV9iZWZvcmVfZW1wdHlfY2xvc2VfdGFnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluZGVudF91c2luZ190YWJzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluZGVudF91c2luZ19zcGFjZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kZW50YXRpb25fc2l6ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmRlbnRhdGlvbl9zaXplX3RpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhcl9hbGxfYmxhbmtfbGluZXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdyYW1tYXJfQ29uc3RyYWludHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlX2luZmVycmVkX2dyYW1tYXJfaW5fYWJzZW5jZV9vZjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdWdnZXN0aW9uX1N0cmF0ZWd5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN1Z2dlc3Rpb25fU3RyYXRlZ3lfTGF4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN1Z2dlc3Rpb25fU3RyYXRlZ3lfU3RyaWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRfX19fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50X01vZGVsX19fXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX19fXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YV9UeXBlX19fXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW51bWVyYXRlZF9WYWx1ZXNfX19fNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3VyY2VNZW51X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1lbnRfbGFiZWw7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1lbnRfdG9vbHRpcDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbWVudF9kZXNjcmlwdGlvbjsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5jb21tZW50X2xhYmVsOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmNvbW1lbnRfdG9vbHRpcDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5jb21tZW50X2Rlc2NyaXB0aW9uOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X2xhYmVsOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X3Rvb2x0aXA7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfZGVzY3JpcHRpb247IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF9sYWJlbDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X3Rvb2x0aXA7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbjsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfbGFiZWw7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF90b29sdGlwOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb247IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbmRPY2N1cnJlbmNlc19sYWJlbDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkZpbGVGcm9tU291cmNlX2xhYmVsOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuRmlsZUZyb21Tb3VyY2VfdG9vbHRpcDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkZpbGVGcm9tU291cmNlX2Rlc2NyaXB0aW9uOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUeXBpbmdfQXV0b19Db21wbGV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUeXBpbmdfQXV0b19SZW1vdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVHlwaW5nX0NvbXBsZXRlX0NvbW1lbnRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFR5cGluZ19Db21wbGV0ZV9FbmRfVGFnczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUeXBpbmdfUmVtb3ZlX0VuZF9UYWdzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0TmV4dF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfWE1MX1ZBTElEQVRJT05fTUVTU0FHRV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kaWNhdGVfbm9fZ3JhbW1hcl9zcGVjaWZpZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kaWNhdGVfbm9fZ3JhbW1hcl9zcGVjaWZpZWRfc2V2ZXJpdGllczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW5nX2ZpbGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN5bnRheENvbG9yaW5nUGFnZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVtcHR5RmlsZVByZWZlcmVuY2VQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NUUlVDVFVSRURfVEVYVF9FRElUT1JfUFJFRlNfTElOSzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnb3RvTWF0Y2hpbmdUYWdfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ290b01hdGNoaW5nVGFnX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5leHRTaWJsaW5nX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5leHRTaWJsaW5nX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXZpb3VzU2libGluZ19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmV2aW91c1NpYmxpbmdfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlX1hJbmNsdWRlOwotCi0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgWE1MVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBYTUxVSU1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZlJlc291cmNlQnVuZGxlID09IG51bGwpIHsKLQkJCQlmUmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJZlJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZlJlc291cmNlQnVuZGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9YTUxVSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL1hNTFVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOGYxNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL1hNTFVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQudGVtcGxhdGVzLkNvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFhNTFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC51aSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgWE1MVUlQbHVnaW4gaW5zdGFuY2UgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBYTUxVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgWE1MVUlQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUgeG1sIGVkaXRvci4KLQkgKi8KLQlwcml2YXRlIENvbnRleHRUeXBlUmVnaXN0cnkgZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0KLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSB4bWwgZWRpdG9yLgotCSAqIAotCSAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQotCXB1YmxpYyBYTUxVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5IGdldEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSB4bWwgZWRpdG9yIHRlbXBsYXRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIHhtbCBlZGl0b3IgdGVtcGxhdGVzCi0JICovCi0JcHVibGljIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpIHsKLQkJaWYgKGZUZW1wbGF0ZVN0b3JlID09IG51bGwpIHsKLQkJCWZUZW1wbGF0ZVN0b3JlID0gbmV3IENvbnRyaWJ1dGlvblRlbXBsYXRlU3RvcmUoZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSwgZ2V0UHJlZmVyZW5jZVN0b3JlKCksIFhNTFVJUHJlZmVyZW5jZU5hbWVzLlRFTVBMQVRFU19LRVkpOwotCi0JCQl0cnkgewotCQkJCWZUZW1wbGF0ZVN0b3JlLmxvYWQoKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlRlbXBsYXRlU3RvcmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUgeG1sIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSB4bWwgcGx1Z2luCi0JICovCi0JcHVibGljIENvbnRleHRUeXBlUmVnaXN0cnkgZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSB7Ci0JCWlmIChmQ29udGV4dFR5cGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbmV3IENvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkoKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuQUxMKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuTkVXKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuVEFHKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuQVRUUklCVVRFKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuQVRUUklCVVRFX1ZBTFVFKTsKLQotCQkJZkNvbnRleHRUeXBlUmVnaXN0cnkgPSByZWdpc3RyeTsKLQkJfQotCi0JCXJldHVybiBmQ29udGV4dFR5cGVSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYW4gaW1hZ2UgZnJvbSB0aGUgcmVnaXN0cnkuCi0JICogCi0JICogKlRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIHJlZmVyZW5jaW5nZmlsZSBkaWFsb2cgYW5kIHNob3VsZCBiZQotCSAqIHJlbW92ZWQgd2hlbiB0aGUgZGlhbG9nIGlzIG1vdmVkIHRvIGFub3RoZXJjb21wb25lbnQuCi0JICogCi0JICogQHBhcmFtIGltYWdlTmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGltYWdlLgotCSAqIEByZXR1cm4gVGhlIGltYWdlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBuYW1lLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgaW1hZ2VOYW1lKSB7Ci0JCXJldHVybiBnZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShpbWFnZU5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9YTUxVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL1hNTFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NGQ5YWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL1hNTFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICBCZW5qYW1pbiBNdXNrYWxsYSwgYi5tdXNrYWxsYUBnbXgubmV0IC0gWzE1ODY2MF0gY2hhcmFjdGVyIGVudGl0aWVzIHNob3VsZCBoYXZlIHRoZWlyIG93biBzeW50YXggaGlnaGxpZ2h0aW5nIHByZWZlcmVuY2UKLSMgICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBbMjA1OTg5XSAtIFt2YWxpZGF0aW9uXSB2YWxpZGF0ZSBYTUwgYWZ0ZXIgWEluY2x1ZGUgcmVzb2x1dGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMgVGhlIGZvbGxvd2luZyBsaW5lIGlzIGEgc2FtcGxlIFhNTCBkb2N1bWVudC4gIFBsZWFzZSB0cmFuc2xhdGUgb25seSB0aGUgZm9sbG93aW5nIHBhcnRzOgotIyMgYmVnaW4gY29sb3IgZGVmaW5pdGlvbnMKLSMjIE5vcm1hbCB0ZXh0IGNvbnRlbnQuCi1TYW1wbGVfWE1MX2RvYz08P3htbCB2ZXJzaW9uPVwiMS4wXCI/PlxuPD9jdXN0b21Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25cblx0WE1MIHByb2Nlc3NvciBzcGVjaWZpY1xuXHRjb250ZW50ID8+XG48IURPQ1RZUEUgY29sb3JzXG5cdFBVQkxJQyBcIi8vSUJNL1hNTC9DT0xPUlMvXCIgXCJjb2xvcnMuZHRkXCI+XG48Y29sb3JzPlxuXHQ8IS0tIGJlZ2luIGNvbG9yIGRlZmluaXRpb25zIC0tPlxuXHQ8Y29sb3IgbmFtZT1cInBsYWludGV4dFwiIGZvcmVncm91bmQ9XCIjMDAwMDAwXCJcblx0XHRiYWNrZ3JvdW5kPVwiI0Q0RDBDOFwiIC8+XG5cdDxjb2xvciBuYW1lPVwiYm9sZFwiIGZvcmVncm91bmQ9XCIjMDAwMDAwXCJcblx0XHRiYWNrZ3JvdW5kPVwiI0IzQUNBMFwiIC8+XG5cdDwhW0NEQVRBWzwxMjM0NTY3ODk+XV0+XG5cdE5vcm1hbCB0ZXh0IGNvbnRlbnQuXG5cdD09PSZndDtsb29rIGF0IG1lISZsdDs9PT1cblx0PGNvbG9yIG5hbWU9XCJpbnZlcnNlXCIgZm9yZWdyb3VuZD1cIiNGMEYwRjBcIlxuXHRcdGJhY2tncm91bmQ9XCIjRDREMEM4XCIgLz5cblxuPC9jb2xvcnM+XG4KLUNvbW1lbnRfRGVsaW1pdGVyc19VSV89Q29tbWVudCBEZWxpbWl0ZXJzCi1Db21tZW50X0NvbnRlbnRfVUlfPUNvbW1lbnQgQ29udGVudAotVGFnX0RlbGltaXRlcnNfVUlfPVRhZyBEZWxpbWl0ZXJzCi1UYWdfTmFtZXNfVUlfPVRhZyBOYW1lcwotQXR0cmlidXRlX05hbWVzX1VJXz1BdHRyaWJ1dGUgTmFtZXMKLUF0dHJpYnV0ZV9WYWx1ZXNfVUlfPUF0dHJpYnV0ZSBWYWx1ZXMKLURlY2xhcmF0aW9uX0RlbGltaXRlcnNfVUlfPURlY2xhcmF0aW9uIERlbGltaXRlcnMKLUNvbnRlbnRfVUlfPUNvbnRlbnQKLUVudGl0eV9SZWZlcmVuY2VfVUlfPUVudGl0eSBSZWZlcmVuY2VzCi0jIyBvbiB0aGUgZm9sbG93aW5nIDIgbGluZXMsIGRvIG5vdCB0cmFuc2xhdGUgQ0RBVEEKLUNEQVRBX0RlbGltaXRlcnNfVUlfPUNEQVRBIERlbGltaXRlcnMKLUNEQVRBX0NvbnRlbnRfVUlfPUNEQVRBIENvbnRlbnQKLVByb2Nlc3NpbmdfSW5zdHJ1Y3Rpb25fRGVsX1VJXz1Qcm9jZXNzaW5nIEluc3RydWN0aW9uIERlbGltaXRlcnMKLVByb2Nlc3NpbmdfSW5zdHJ1Y3Rpb25fQ29uX1VJX19VSV89UHJvY2Vzc2luZyBJbnN0cnVjdGlvbiBDb250ZW50Ci0jIyBvbiB0aGUgZm9sbG93aW5nIGxpbmUgc29sZWx5IHRyYW5zbGF0ZTogIE5hbWUKLURPQ1RZUEVfTmFtZV9VSV89RE9DVFlQRSBOYW1lCi0jIyBvbiB0aGUgZm9sbG93aW5nIGxpbmUgc29sZWx5IHRyYW5zbGF0ZTogIEtleXdvcmQKLURPQ1RZUEVfU1lTVEVNX1BVQkxJQ19LZXl3X1VJXz1ET0NUWVBFIFNZU1RFTS9QVUJMSUMgS2V5d29yZAotIyMgb24gdGhlIGZvbGxvd2luZyBsaW5lIHNvbGVseSB0cmFuc2xhdGU6ICBQdWJsaWMgUmVmZXJlbmNlCi1ET0NUWVBFX1B1YmxpY19SZWZlcmVuY2VfVUlfPURPQ1RZUEUgUHVibGljIFJlZmVyZW5jZQotIyMgb24gdGhlIGZvbGxvd2luZyBsaW5lIHNvbGVseSB0cmFuc2xhdGU6ICBTeXN0ZW0gUmVmZXJlbmNlCi1ET0NUWVBFX1N5c3RlbV9SZWZlcmVuY2VfVUlfPURPQ1RZUEUgU3lzdGVtIFJlZmVyZW5jZQotIyBYTUwgQ29tbW9uIFVJCi0jIENvbnN0YW50cyBmb3Igc3RyaW5ncwotCi1ERUxFVEU9UmVtb3ZlCi1BRERfUFJPQ0VTU0lOR19JTlNUUlVDVElPTj1BZGQgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbgotCi1fVUlfTUVOVV9BRERfQUZURVI9QWRkICZBZnRlcgotX1VJX01FTlVfQUREX0FUVFJJQlVURT1BZGQgQSZ0dHJpYnV0ZQotX1VJX01FTlVfQUREX0JFRk9SRT1BZGQgJkJlZm9yZQotX1VJX01FTlVfQUREX0NISUxEPUFkZCAmQ2hpbGQKLV9VSV9NRU5VX1JFTU9WRT1SZSZtb3ZlCi1fVUlfTUVOVV9SRVBMQUNFX1dJVEg9UmUmcGxhY2UgV2l0aAotX1VJX01FTlVfRURJVF9ET0NUWVBFPUVkaXQgRE9DVFlQRS4uLgotX1VJX0xBQkVMX1VORE9fUkVQTEFDRV9ERVNDUklQVElPTj1SZXBsYWNlCi1fVUlfTEFCRUxfRURJVF9ET0NUWVBFPUVkaXQgRE9DVFlQRQotX1VJX0lORk9fRVhQQU5EX0FMTD1FeHBhbmQgQWxsCi1fVUlfSU5GT19DT0xMQVBTRV9BTEw9Q29sbGFwc2UgQWxsCi0KLV9VSV9NRU5VX0FERF9EVERfSU5GT1JNQVRJT049QWRkIERURCBJbmZvcm1hdGlvbi4uLgotX1VJX01FTlVfQUREX1NDSEVNQV9JTkZPUk1BVElPTj1BZGQgU2NoZW1hIEluZm9ybWF0aW9uLi4uCi1fVUlfTUVOVV9FRElUX1BST0NFU1NJTkdfSU5TVFJVQ1RJT049RWRpdCBQcm9jZXNzJmluZyBJbnN0cnVjdGlvbi4uLgotX1VJX01FTlVfRURJVF9OQU1FU1BBQ0VTPUVkaXQgJk5hbWVzcGFjZXMuLi4KLQotX1VJX01FTlVfQUREX0RURF9JTkZPUk1BVElPTl9USVRMRT1BZGQgRFREIEluZm9ybWF0aW9uCi1fVUlfTUVOVV9FRElUX1BST0NFU1NJTkdfSU5TVFJVQ1RJT05fVElUTEU9RWRpdCBQcm9jZXNzaW5nIEluc3RydWN0aW9uCi1fVUlfTUVOVV9FRElUX1NDSEVNQV9JTkZPUk1BVElPTl9USVRMRT1FZGl0IFNjaGVtYSBJbmZvcm1hdGlvbgotCi1fVUlfTUVOVV9ORVdfQVRUUklCVVRFPSZOZXcgQXR0cmlidXRlLi4uCi1fVUlfTUVOVV9ORVdfQVRUUklCVVRFX1RJVExFPU5ldyBBdHRyaWJ1dGUKLV9VSV9NRU5VX0VESVRfQVRUUklCVVRFPUVkaXQgQXR0cmlidXRlLi4uCi1fVUlfTUVOVV9FRElUX0FUVFJJQlVURV9USVRMRT1FZGl0IEF0dHJpYnV0ZQotX1VJX01FTlVfTkVXX0VMRU1FTlQ9TmV3ICZFbGVtZW50Li4uCi1fVUlfTUVOVV9ORVdfRUxFTUVOVF9USVRMRT1OZXcgRWxlbWVudAotX1VJX01FTlVfUkVOQU1FPVImZW5hbWUKLV9VSV9NRU5VX1JFTkFNRV9USVRMRT1SZW5hbWUKLV9VSV9MQUJFTF9FTEVNRU5UX05BTUU9RWxlbWVudCBuYW1lOgotCi1fVUlfTUVOVV9BRERfQ09NTUVOVD1BZGQgQ29tbWVudAotX1VJX01FTlVfQUREX1BST0NFU1NJTkdfSU5TVFJVQ1RJT049QWRkIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24KLV9VSV9NRU5VX0FERF9DREFUQV9TRUNUSU9OPUFkZCBDREFUQSBTZWN0aW9uCi1fVUlfTUVOVV9BRERfUENEQVRBPUFkZCAjUENEQVRBOwotCi1fVUlfTUVOVV9DT01NRU5UPUMmb21tZW50Ci1fVUlfTUVOVV9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OPVAmcm9jZXNzaW5nIEluc3RydWN0aW9uCi1fVUlfTUVOVV9DREFUQV9TRUNUSU9OPUNEQVRBIFNlY3Rpb24KLV9VSV9NRU5VX1BDREFUQT0jUEMmREFUQTsKLQotX1VJX01FTlVfQUREPUFkZAotCi1fVUlfQ09NTUVOVF9WQUxVRT1jb21tZW50Ci1fVUlfUElfVEFSR0VUX1ZBTFVFPXRhcmdldAotX1VJX1BJX0RBVEFfVkFMVUU9ZGF0YQotX1VJX0xBQkVMX1JPT1RfRUxFTUVOVF9WQUxVRT1Sb290RWxlbWVudAotCi1fVUlfTEFCRUxfVEFSR0VUX0NPTE9OPVRhcmdldDoKLV9VSV9MQUJFTF9EQVRBX0NPTE9OPURhdGE6Ci1fVUlfTEFCRUxfUk9PVF9FTEVNRU5UX05BTUVfQ09MT049Um9vdCBlbGVtZW50IG5hbWU6Ci1fVUlfTEFCRUxfUFVCTElDX0lEX0NPTE9OPVB1YmxpYyBJRDoKLV9VSV9MQUJFTF9TWVNURU1fSURfQ09MT049U3lzdGVtIElEOgotX1VJX0xBQkVMX0JST1dTRT1Ccm93c2UuLi4KLV9VSV9MQUJFTF9TRUxFQ1RfWE1MX0NBVEFMT0dfRU5UUlk9U2VsZWN0IFhNTCBDYXRhbG9nIEVudHJ5Ci1fVUlfTEFCRUxfU1BFQ0lGWV9TWVNURU1fSUQ9U3BlY2lmeSBTeXN0ZW0gSUQKLV9VSV9MQUJFTF9TRUxFQ1RfRklMRT1TZWxlY3QgRmlsZQotCi1fVUlfTEFCRUxfS0VZPUtleQotX1VJX0xBQkVMX1VSST1VUkk6Ci1fVUlfTEFCRUxfWE1MX0NBVEFMT0dfQ09MT049WE1MIENhdGFsb2cKLV9VSV9MQUJFTF9OQU1FU1BBQ0VfTkFNRT1OYW1lc3BhY2UgTmFtZQotX1VJX0xBQkVMX0xPQ0FUSU9OX0hJTlQ9TG9jYXRpb24gSGludAotX1VJX0xBQkVMX1BSRUZJWD1QcmVmaXgKLV9VSV9MQUJFTF9OQU1FU1BBQ0VfTkFNRV9DT0xPTj1OYW1lc3BhY2UgTmFtZToKLV9VSV9MQUJFTF9MT0NBVElPTl9ISU5UX0NPTE9OPUxvY2F0aW9uIEhpbnQ6Ci1fVUlfTEFCRUxfUFJFRklYX0NPTE9OPVByZWZpeDoKLV9VSV9OT19OQU1FU1BBQ0VfTkFNRT08bm8gbmFtZXNwYWNlIG5hbWU+Ci1fVUlfTk9fUFJFRklYPTxubyBwcmVmaXg+Ci0KLV9VSV9MQUJFTF9YTUxfU0NIRU1BX0lORk9STUFUSU9OPVhNTCBTY2hlbWEgSW5mb3JtYXRpb24KLQotX1VJX0xBQkVMX05BTUVfQ09MT049TmFtZToKLV9VSV9MQUJFTF9WQUxVRV9DT0xPTj1WYWx1ZToKLQotX1VJX0JVVFRPTl9ERUxFVEU9RGVsZXRlCi1fVUlfQlVUVE9OX05FVz1OZXcuLi4KLV9VSV9CVVRUT05fRURJVD1FZGl0Li4uCi0KLV9VSV9MQUJFTF9ORVdfTkFNRVNQQUNFX0lORk9STUFUSU9OPU5ldyBOYW1lc3BhY2UgSW5mb3JtYXRpb24KLQotIyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5qYXZhCi0KLV9VSV9SQURJT19CVVRUT05fU0VMRUNUX0ZST01fV09SS1NQQUNFPVNlbGVjdCBmaWxlIGZyb20gV29ya3NwYWNlCi1fVUlfUkFESU9fQlVUVE9OX1NFTEVDVF9GUk9NX0NBVEFMT0c9U2VsZWN0IFhNTCBDYXRhbG9nIGVudHJ5Ci0KLV9VSV9XQVJOSU5HX01PUkVfVEhBTl9PTkVfTlNfV0lUSF9OQU1FPU1vcmUgdGhhbiBvbmUgbmFtZXNwYWNlIGhhcyBiZWVuIHNwZWNpZmllZCB3aXRoIHRoZSBuYW1lc3BhY2UgbmFtZSA6Ci1fVUlfV0FSTklOR19NT1JFX1RIQU5fT05FX05TX1dJVEhPVVRfTkFNRT1Nb3JlIHRoYW4gb25lIHNjaGVtYSBoYXMgYmVlbiBzcGVjaWZpZWQgd2l0aG91dCBhIG5hbWVzcGFjZSBuYW1lCi1fVUlfV0FSTklOR19NT1JFX1RIQU5fT05FX05TX1dJVEhPVVRfUFJFRklYPU1vcmUgdGhhbiBvbmUgbmFtZXNwYWNlIGhhcyBiZWVuIHNwZWNpZmljZWQgd2l0aG91dCBhIHByZWZpeAotX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIX1BSRUZJWD1Nb3JlIHRoYW4gb25lIG5hbWVzcGFjZSBoYXMgYmVlbiBzcGVjaWZpZWQgd2l0aCB0aGUgcHJlZml4IDoKLV9VSV9XQVJOSU5HX1NDSEVNQV9DQU5fTk9UX0JFX0xPQ0FURUQ9VGhlIHNwZWNpZmllZCBzY2hlbWEgY2FuIG5vdCBiZSBsb2NhdGVkIDoKLV9VSV9XQVJOSU5HX0xPQ0FUSU9OX0hJTlRfTk9UX1NQRUNJRklFRD1BIGxvY2F0aW9uIGhpbnQgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCBmb3IgdGhlIG5hbWVzcGFjZSB3aXRoIG5hbWUKLV9VSV9XQVJOSU5HX05BTUVTUEFDRV9OQU1FX05PVF9TUEVDSUZJRUQ9QSBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIGZvciB0aGUgbmFtZXNwYWNlIHdpdGggcHJlZml4IDoKLV9VSV9XQVJOSU5HX1BSRUZJWF9OT1RfU1BFQ0lGSUVEPUEgcHJlZml4IG11c3QgYmUgc3BlY2lmaWVkIGZvciB0aGUgbmFtZXNwYWNlIG5hbWVkIDoKLV9VSV9XQVJOSU5HX1JPT1RfRUxFTUVOVF9NVVNUX0JFX1NQRUNJRklFRD1BIHJvb3QgZWxlbWVudCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLgotX1VJX1dBUk5JTkdfU1lTVEVNX0lEX01VU1RfQkVfU1BFQ0lGSUVEPUEgc3lzdGVtIElEIG11c3QgYmUgc3BlY2lmaWVkLgotCi1fVUlfSU5WQUxJRF9OQU1FPUludmFsaWQgbmFtZQotCi0jIFN0cmluZyB1c2VkIGZvciBlZGl0aW5nIG5hbWVzcGFjZXMgKG9yZy5lY2xpcHNlLndzdC54bWwudWkubnNlZGl0KQotX1VJX0VOVEVSX1JFUV9QUkVGSVhfQU5EX05BTUVTUEFDRT1FbnRlciB0aGUgcmVxdWlyZWQgcHJlZml4IGFuZCBuYW1lc3BhY2UgVVJJIGZvciB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9uLgotX1VJX1NFTEVDVF9SRUdJU1RFUkVEX05BTUVTUEFDRVM9U2VsZWN0IEZyb20gUmVnaXN0ZXJlZCBOYW1lc3BhY2VzCi1fVUlfU1BFQ0lGWV9ORVdfTkFNRVNQQUNFPVNwZWNpZnkgTmV3IE5hbWVzcGFjZQotX1VJX1NFTEVDVF9OQU1FU1BBQ0VfVE9fQUREPVNlbGVjdCB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyB0byBhZGQuCi1fVUlfQUREX05BTUVTUEFDRV9ERUNMQVJBVElPTlM9QWRkIE5hbWVzcGFjZSBEZWNsYXJhdGlvbnMKLV9VSV9OQU1FU1BBQ0VfREVDTEFSQVRJT05TPU5hbWVzcGFjZSBEZWNsYXJhdGlvbnMKLV9VSV9UQVJHRVRfTkFNRVNQQUNFPVRhcmdldCBOYW1lc3BhY2UKLQotX0VSUk9SX1hNTF9BVFRSSUJVVEVfQUxSRUFEWV9FWElTVFM9VGhlIGVsZW1lbnQgYWxyZWFkeSBoYXMgYW4gYXR0cmlidXRlIHdpdGggdGhpcyBuYW1lLgotCi0jCi1lcnJvcl9tZXNzYWdlX2dvZXNfaGVyZT1lcnJvciBtZXNzYWdlIGdvZXMgaGVyZQotU3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWxfMD1TdXJyb3VuZCB3aXRoIG5ldyBlbGVtZW50Ci1TdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbF8xPVN1cnJvdW5kIHdpdGggbmV3IGVsZW1lbnQKLVJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWxfMD1MaW5rIGFsbCByZWZlcmVuY2VzIGZvciBhIHJlbmFtZSBpbiBmaWxlIChkb2VzIG5vdCBjaGFuZ2UgcmVmZXJlbmNlcyBpbiBvdGhlciBmaWxlcykKLVJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWxfMT1SZW5hbWUgaW4gZmlsZQotSW5zZXJ0UmVxdWlyZWRBdHRyc1F1aWNrQXNzaXN0UHJvcG9zYWxfMD1JbnNlcnQgcmVxdWlyZWQgYXR0cmlidXRlcwotSW5zZXJ0UmVxdWlyZWRBdHRyc1F1aWNrQXNzaXN0UHJvcG9zYWxfMT1JbnNlcnQgcmVxdWlyZWQgYXR0cmlidXRlcwotRW5jb2RpbmdTZXR0aW5nc18wPUlBTkE6Ci1FbmNvZGluZ1NldHRpbmdzXzE9RW5jb2Rpbmc6Ci1EcmFnTm9kZUNvbW1hbmRfMD1Nb3ZlCi1EcmFnTm9kZUNvbW1hbmRfMT1Db3B5Ci1Db21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZ18wPUFkZC4uLgotSkZhY2VOb2RlQWRhcHRlcl8xPVJlZnJlc2ggUHJvcGVydHkgU2hlZXQKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzA9UmVtb3ZlIGVtcHR5IHRhZwotUXVpY2tGaXhQcm9jZXNzb3JYTUxfMT1DaGFuZ2UgdG8gZW1wdHktZWxlbWVudCB0YWcKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzI9UmVtb3ZlIHRoaXMgdGFnCi1RdWlja0ZpeFByb2Nlc3NvclhNTF8zPUluc2VydCBlbmQgdGFnIGJlZm9yZSBmaXJzdCBjaGlsZCBlbGVtZW50Ci1RdWlja0ZpeFByb2Nlc3NvclhNTF80PUluc2VydCBlbmQgdGFnIGF0IGVuZCBvZiBlbGVtZW50Ci1RdWlja0ZpeFByb2Nlc3NvclhNTF81PVJlbW92ZSBhdHRyaWJ1dGVzIGluIGVuZCB0YWcKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzY9SW5zZXJ0IGRlZmF1bHQgYXR0cmlidXRlIHZhbHVlCi1RdWlja0ZpeFByb2Nlc3NvclhNTF83PVJlbW92ZSB0aGlzIGF0dHJpYnV0ZQotUXVpY2tGaXhQcm9jZXNzb3JYTUxfOD1SZW1vdmUgc3BhY2VzIGJlZm9yZSB0YWcgbmFtZQotUXVpY2tGaXhQcm9jZXNzb3JYTUxfOT1SZW1vdmUgc3BhY2VzIGJlZm9yZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uCi1RdWlja0ZpeFByb2Nlc3NvclhNTF8xMD1SZW1vdmUgbmFtZXNwYWNlIGluIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KLVF1aWNrRml4UHJvY2Vzc29yWE1MXzExPVJlbW92ZSB0aGlzIGVsZW1lbnQKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzEyPVJlbW92ZSB0aGlzIGF0dHJpYnV0ZSB2YWx1ZQotUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTM9SW5zZXJ0IHJlcXVpcmVkIGF0dHJpYnV0ZQotUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTQ9UXVvdGUgYXR0cmlidXRlIHZhbHVlCi1RdWlja0ZpeFByb2Nlc3NvclhNTF8xNT1JbnNlcnQgY2xvc2luZyBicmFja2V0Ci1YTUxQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMD1BdHRyaWJ1dGVzCi0KLVdvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzXzA9VXNlIHdvcmtzcGFjZSBlbmNvZGluZwotcmVmcmVzaG91dGxpbmVfMD1SZWZyZXNoaW5nIE91dGxpbmUKLUNyZWF0aW5nX2ZpbGVzX2VuY29kaW5nPUNyZWF0aW5nIGZpbGVzIGVuY29kaW5nIHByZWZlcmVuY2UKLSMgUmVjb25jaWxlU3RlcEZvck1hcmt1cAotRW5kX3RhZ19oYXNfYXR0cmlidXRlcz1FbmQgdGFnIGhhcyBhdHRyaWJ1dGVzCi1BdHRyaWJ1dGVfX2lzX21pc3NpbmdfYV92YWx1ZT1BdHRyaWJ1dGUgXCJ7MH1cIiBpcyBtaXNzaW5nIGEgdmFsdWUKLUF0dHJpYnV0ZV9faGFzX25vX3ZhbHVlPUF0dHJpYnV0ZSBcInswfVwiICBoYXMgbm8gdmFsdWUKLU1pc3NpbmdfZW5kX3RhZ189TWlzc2luZyBlbmQgdGFnIFwiezB9XCIKLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMD1NaXNzaW5nIGNsb3NpbmcgcXVvdGUKLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMT1NaXNzaW5nIHF1b3RlcyBmb3IgYXR0cmlidXRlIHZhbHVlCi1SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzI9QSB0YWduYW1lIGNhbm5vdCBzdGFydCB3aXRoIGEgc3BhY2UKLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMz1FbXB0eSB0YWdzIGFyZSBub3QgYWxsb3dlZAotUmVjb25jaWxlU3RlcEZvck1hcmt1cF80PU5hbWVzcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGluIGEgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbiB0YXJnZXQKLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfNT1TcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGJlZm9yZSBhIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24KLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfNj1UYWcgbWlzc2luZyBjbG9zaW5nIGJyYWNrZXQgJz4nCi0jIENvbnRlbnQgQXNzaXN0Ci1FbmRfd2l0aF89RW5kIHdpdGggezB9PgotU0VWRVJFX2ludGVybmFsX2Vycm9yX29jY3VfVUlfPVNFVkVSRSBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZAotTm9fa25vd25fYXR0cmlidXRlX19VSV89Tm8ga25vd24gYXR0cmlidXRlCi1Db250ZW50X0Fzc2lzdF9ub3RfYXZhaWxhYl9VSV89Q29udGVudCBBc3Npc3Qgbm90IGF2YWlsYWJsZSBhdCB0aGUgY3VycmVudCBsb2NhdGlvbgotRWxlbWVudF9faXNfdW5rbm93bj1FbGVtZW50IDx7MH0+IGlzIHVua25vd24uCi1Db21tZW50X189Y29tbWVudCB7MH0KLUNsb3NlX3dpdGhfXz1DbG9zZSB3aXRoIHswfQotRW5kX3dpdGhfXz1FbmQgd2l0aCBcIjwvezB9PlwiCi1DbG9zZV93aXRoX19fPUNsb3NlIHdpdGggXCJ7MH1cIgotQ2xvc2Vfd2l0aF9fX189Q2xvc2Ugd2l0aCBcIj48L3swfT5cIgotX0hhc19ub19hdmFpbGFibGVfY2hpbGQ9ezB9IGhhcyBubyBhdmFpbGFibGUgY2hpbGQgdGFncy4KLU5vX2tub3duX2NoaWxkX3RhZz1ObyBrbm93biBjaGlsZCB0YWcgbmFtZXMgb2YgPHswfT4gYmVnaW4gd2l0aCBcInsxfVwiLgotX19IYXNfbm9fa25vd25fY2hpbGQ9PHswfT4gaGFzIG5vIGtub3duIGNoaWxkIHRhZ3MuCi1Ob19rbm93bl9jaGlsZF90YWdfbmFtZXM9Tm8ga25vd24gY2hpbGQgdGFnIG5hbWVzIG9mIDx7MH0+IGJlZ2luIHdpdGggXCJ7MX1cIgotVGhlX2RvY3VtZW50X2VsZW1lbnRfXz1UaGUgZG9jdW1lbnQgZWxlbWVudCA8ezB9PiBpcyBhbHJlYWR5IHByZXNlbnQuCi1Ob19kZWZpbml0aW9uX2Zvcl9pbj1ObyBkZWZpbml0aW9uIHdhcyBmb3VuZCBmb3IgZWxlbWVudCA8ezB9PiBpbiB7MX0KLU5vX2RlZmluaXRpb25fZm9yPU5vIGRlZmluaXRpb24gd2FzIGZvdW5kIGZvciBlbGVtZW50IDx7MH0+Ci1Ob19jb250ZW50X21vZGVsX2Zvcj1ObyBjb250ZW50IG1vZGVsIGZvdW5kIGZvciB7MH0uCi1Ob19jb250ZW50X21vZGVsX2ZvdW5kX1VJXz1ObyBjb250ZW50IG1vZGVsIGZvdW5kCi0jIyBUaGUgZm9sbG93aW5nIHN0cmluZ3MgYXJlIGZvciB0aGUgWE1MIENsZWFudXAgZGlhbG9nCi1DbGVhbnVwX1VJXz1DbGVhbnVwCi1Db21wcmVzc19lbXB0eV9lbGVtZW50X3RhZ3NfVUlfPSZDb21wcmVzcyBlbXB0eSBlbGVtZW50IHRhZ3MKLUluc2VydF9yZXF1aXJlZF9hdHRyaWJ1dGVzX1VJXz1JbnNlcnQgJnJlcXVpcmVkIGF0dHJpYnV0ZXMKLUluc2VydF9taXNzaW5nX3RhZ3NfVUlfPSZJbnNlcnQgbWlzc2luZyB0YWdzCi1RdW90ZV9hdHRyaWJ1dGVfdmFsdWVzX1VJXz0mUXVvdGUgYXR0cmlidXRlIHZhbHVlcwotRm9ybWF0X3NvdXJjZV9VSV89JkZvcm1hdCBzb3VyY2UKLUNvbnZlcnRfRU9MX2NvZGVzX1VJXz1Db252ZXJ0IGxpbmUgJmRlbGltaXRlcnMgdG8KLUVPTF9XaW5kb3dzX1VJPSZXaW5kb3dzCi1FT0xfVW5peF9VST1VJk5JWAotRU9MX01hY19VST0mTWFjCi0jIyBYTUwgRmlsZXMgcHJlZmVyZW5jZSBwYWdlCi1DcmVhdGluZ19maWxlcz1DcmVhdGluZyBmaWxlcwotRW5jb2RpbmdfZGVzYz1UaGUgZm9sbG93aW5nIGVuY29kaW5nIHdpbGwgYXBwbHk6Ci1FbmNvZGluZz1FbiZjb2Rpbmc6Ci1DcmVhdGluZ19vcl9zYXZpbmdfZmlsZXM9Q3JlYXRpbmcgb3Igc2F2aW5nIGZpbGVzCi1FbmRfb2ZfbGluZV9jb2RlX2Rlc2M9VGhlIGZvbGxvd2luZyBsaW5lIGRlbGltaXRlciB3aWxsIGFwcGx5OgotRW5kX29mX2xpbmVfY29kZT0mTGluZSBkZWxpbWl0ZXI6Ci1FT0xfV2luZG93cz1XaW5kb3dzCi1FT0xfVW5peD1VTklYCi1FT0xfTWFjPU1hYwotRU9MX05vVHJhbnNsYXRpb249Tm8gdHJhbnNsYXRpb24KLVZhbGlkYXRpbmdfZmlsZXM9VmFsaWRhdGluZyBmaWxlcwotSW5kaWNhdGVfbm9fZ3JhbW1hcl9zcGVjaWZpZWQ9SW5kaWNhdGUgd2hlbiBubyBncmFtbWFyIGlzIHNwZWNpZmllZDoKLUluZGljYXRlX25vX2dyYW1tYXJfc3BlY2lmaWVkX3NldmVyaXRpZXM9RXJyb3IsV2FybmluZyxJZ25vcmUKLVhNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uTGFiZWw9QWRkIHRoaXMgc3VmZml4IChpZiBub3Qgc3BlY2lmaWVkKToKLVhNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uRXJyb3I9U3VmZml4IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgezB9LgotIyMgWE1MIFNvdXJjZSBwcmVmZXJlbmNlIHBhZ2UKLUNvbnRlbnRfYXNzaXN0X1VJXz1Db250ZW50IGFzc2lzdAotQXV0b21hdGljYWxseV9tYWtlX3N1Z2dlc3RfVUlfPUF1dG9tYXRpY2FsbHkgbWEma2Ugc3VnZ2VzdGlvbnMKLVByb21wdF93aGVuX3RoZXNlX2NoYXJhY3RlX1VJXz1QJnJvbXB0IHdoZW4gdGhlc2UgY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQ6Ci1Gb3JtYXR0aW5nX1VJXz1Gb3JtYXR0aW5nCi1MaW5lX3dpZHRoX19VSV89TGluZSAmd2lkdGg6Ci1TcGxpdF9tdWx0aXBsZV9hdHRyaWJ1dGVzPVNwbGl0ICZtdWx0aXBsZSBhdHRyaWJ1dGVzIGVhY2ggb24gYSBuZXcgbGluZQotQWxpZ25fZmluYWxfYnJhY2tldD0mQWxpZ24gZmluYWwgYnJhY2tldCBpbiBtdWx0aS1saW5lIGVsZW1lbnQgdGFncwotUHJlc2VydmVfUENEQVRBX0NvbnRlbnQ9JlByZXNlcnZlIHdoaXRlc3BhY2UgaW4gdGFncyB3aXRoIFBDREFUQSBjb250ZW50Ci1TcGFjZV9iZWZvcmVfZW1wdHlfY2xvc2VfdGFnPUlucyZlcnQgd2hpdGVzcGFjZSBiZWZvcmUgY2xvc2luZyBlbXB0eSBlbmQtdGFncwotSW5kZW50X3VzaW5nX3RhYnM9JkluZGVudCB1c2luZyB0YWJzCi1JbmRlbnRfdXNpbmdfc3BhY2VzPUkmbmRlbnQgdXNpbmcgc3BhY2VzCi1JbmRlbnRhdGlvbl9zaXplPUluJmRlbnRhdGlvbiBzaXplOgotSW5kZW50YXRpb25fc2l6ZV90aXA9SW5kZW50YXRpb24gc2l6ZQotQ2xlYXJfYWxsX2JsYW5rX2xpbmVzX1VJXz1DbGVhciBhbGwgJmJsYW5rIGxpbmVzCi1HcmFtbWFyX0NvbnN0cmFpbnRzPUdyYW1tYXIgQ29uc3RyYWludHMKLVVzZV9pbmZlcnJlZF9ncmFtbWFyX2luX2Fic2VuY2Vfb2Y9JlVzZSBpbmZlcnJlZCBncmFtbWFyIGluIGFic2VuY2Ugb2YgRFREL1NjaGVtYQotU3VnZ2VzdGlvbl9TdHJhdGVneT0mU3VnZ2VzdGlvbiBzdHJhdGVneToKLVN1Z2dlc3Rpb25fU3RyYXRlZ3lfTGF4PUxheAotU3VnZ2VzdGlvbl9TdHJhdGVneV9TdHJpY3Q9U3RyaWN0Ci0jIyB0YWcgaW5mbwotRWxlbWVudF9fX18xPUVsZW1lbnQgOgotQ29udGVudF9Nb2RlbF9fX18yPUNvbnRlbnQgTW9kZWwgOgotQXR0cmlidXRlX19fXzM9QXR0cmlidXRlIDoKLURhdGFfVHlwZV9fX180PURhdGEgVHlwZSA6Ci1FbnVtZXJhdGVkX1ZhbHVlc19fX181PUVudW1lcmF0ZWQgVmFsdWVzIDoKLSMjIGNvcGllZCBmcm9tIHNzZS51aQotU291cmNlTWVudV9sYWJlbD0mU291cmNlCi1Db21tZW50X2xhYmVsPUNvJm1tZW50Ci1Db21tZW50X3Rvb2x0aXA9Q29tbWVudAotQ29tbWVudF9kZXNjcmlwdGlvbj1Db21tZW50Ci1VbmNvbW1lbnRfbGFiZWw9JlVuY29tbWVudAotVW5jb21tZW50X3Rvb2x0aXA9VW5jb21tZW50Ci1VbmNvbW1lbnRfZGVzY3JpcHRpb249VW5jb21tZW50Ci1Ub2dnbGVDb21tZW50X2xhYmVsPVRvZ2dsZSBDb21tZW50Ci1Ub2dnbGVDb21tZW50X3Rvb2x0aXA9VG9nZ2xlIENvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfZGVzY3JpcHRpb249VG9nZ2xlIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF9sYWJlbD1BZGQgQmxvY2sgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X3Rvb2x0aXA9QWRkIEJsb2NrIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbj1BZGQgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsPVJlbW92ZSBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcD1SZW1vdmUgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uPVJlbW92ZSBCbG9jayBDb21tZW50Ci1DbGVhbnVwRG9jdW1lbnRfbGFiZWw9Q2xlYW51cCBEb2N1bWVudC4uLgotQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA9Q2xlYW51cCBEb2N1bWVudAotQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uPUNsZWFudXAgRG9jdW1lbnQKLUZpbmRPY2N1cnJlbmNlc19sYWJlbD1PY2N1cnJlbmNlcyBpbiBGaWxlCi1PcGVuRmlsZUZyb21Tb3VyY2VfbGFiZWw9T3AmZW4gU2VsZWN0aW9uCi1PcGVuRmlsZUZyb21Tb3VyY2VfdG9vbHRpcD1PcGVuIGFuIGVkaXRvciBvbiB0aGUgc2VsZWN0ZWQgbGluawotT3BlbkZpbGVGcm9tU291cmNlX2Rlc2NyaXB0aW9uPU9wZW4gYW4gZWRpdG9yIG9uIHRoZSBzZWxlY3RlZCBsaW5rCi1YTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb25fMD1TaG93IEF0dHJpYnV0ZXMKLVhNTFR5cGluZ19BdXRvX0NvbXBsZXRlPUF1dG9tYXRpY2FsbHkgY2xvc2UKLVhNTFR5cGluZ19BdXRvX1JlbW92ZT1BdXRvbWF0aWNhbGx5IHJlbW92ZQotWE1MVHlwaW5nX0NvbXBsZXRlX0NvbW1lbnRzPSZDb21tZW50cwotWE1MVHlwaW5nX0NvbXBsZXRlX0VuZF9UYWdzPSZFbmQgdGFncwotWE1MVHlwaW5nX1JlbW92ZV9FbmRfVGFncz1FJm5kIHRhZ3Mgd2hlbiBjcmVhdGluZyBlbXB0eSBzZWxmLWNsb3NpbmcgdGFncwotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsPUVuY2xvc2luZyBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgZW5jbG9zaW5nIGVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19kZXNjcmlwdGlvbj1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgZW5jbG9zaW5nIGVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWw9TmV4dCBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIG5leHQgc2libGluZwotU3RydWN0dXJlU2VsZWN0TmV4dF9kZXNjcmlwdGlvbj1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgbmV4dCBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbD1QcmV2aW91cyBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBwcmV2aW91cyBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19kZXNjcmlwdGlvbj1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgcHJldmlvdXMgc2libGluZwotTUVTU0FHRV9YTUxfVkFMSURBVElPTl9NRVNTQUdFX1VJXz1YTUwgVmFsaWRhdG9yIHZhbGlkYXRpbmcgezB9Ci1TeW50YXhDb2xvcmluZ1BhZ2VfMD1TeW50YXggRWxlbWVudDoKLVN5bnRheENvbG9yaW5nUGFnZV8yPUVuYWJsZQotU3ludGF4Q29sb3JpbmdQYWdlXzM9JkJvbGQKLVN5bnRheENvbG9yaW5nUGFnZV80PSZJdGFsaWMKLVN5bnRheENvbG9yaW5nUGFnZV81PSZTdHJpa2UtdGhyb3VnaAotU3ludGF4Q29sb3JpbmdQYWdlXzY9JlVuZGVybGluZQotRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2VfMD1FeHBhbmQgdGhlIHRyZWUgdG8gZWRpdCBwcmVmZXJlbmNlcyBmb3IgYSBzcGVjaWZpYyBmZWF0dXJlLgotX1VJX1NUUlVDVFVSRURfVEVYVF9FRElUT1JfUFJFRlNfTElOSz1YTUwgZWRpdGluZyBwcmVmZXJlbmNlcy4gIE5vdGUgdGhhdCBzb21lIHByZWZlcmVuY2VzIG1heSBiZSBzZXQgb24gdGhlIDxhPnswfTwvYT4gcHJlZmVyZW5jZSBwYWdlLgotVXNlX1hJbmNsdWRlPVByb2Nlc3MgWE1MIEluY2x1c2lvbnMKLW5leHRTaWJsaW5nX2xhYmVsPU5leHQgU2libGluZwotbmV4dFNpYmxpbmdfZGVzY3JpcHRpb249R28gdG8gTmV4dCBTaWJsaW5nCi1wcmV2aW91c1NpYmxpbmdfbGFiZWw9UHJldmlvdXMgU2libGluZwotcHJldmlvdXNTaWJsaW5nX2Rlc2NyaXB0aW9uPUdvIHRvIFByZXZpb3VzIFNpYmxpbmcKLWdvdG9NYXRjaGluZ1RhZ19sYWJlbD1NYXRjaGluZyBUYWcKLWdvdG9NYXRjaGluZ1RhZ19kZXNjcmlwdGlvbj1HbyBUbyBNYXRjaGluZyBUYWcKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0Q29tbWVudEFjdGlvblhNTERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMGIyOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIEFic3RyYWN0IGNvbW1lbnQgYWN0aW9uIGRlbGVnYXRlIGZvciBYTUwgZWRpdG9ycwotICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWJzdHJhY3RDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUgaW1wbGVtZW50cyBJRWRpdG9yQWN0aW9uRGVsZWdhdGUsIElBY3Rpb25EZWxlZ2F0ZTIsIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPU0VfQ09NTUVOVCA9ICItLT4iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX0NPTU1FTlQgPSAiPCEtLSI7IC8vJE5PTi1OTFMtMSQKLQotCUlFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG51bGxpbmcgb3V0IGp1c3QgaW4gY2FzZQotCQlmRWRpdG9yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bihhY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoZkVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBmRWRpdG9yOwotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24KLQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gZ2V0Q3VycmVudFNlbGVjdGlvbigpOwotCQkJCWlmICh0ZXh0U2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJcHJvY2Vzc0FjdGlvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJpdmF0ZSBJVGV4dFNlbGVjdGlvbiBnZXRDdXJyZW50U2VsZWN0aW9uKCkgewotCQlpZiAoZkVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSAoKElUZXh0RWRpdG9yKSBmRWRpdG9yKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJCQlyZXR1cm4gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBUZXh0U2VsZWN0aW9uLmVtcHR5U2VsZWN0aW9uKCk7Ci0JfQotCi0JYWJzdHJhY3Qgdm9pZCBwcm9jZXNzQWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbik7Ci0KLQl2b2lkIHJlbW92ZU9wZW5DbG9zZUNvbW1lbnRzKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQl0cnkgewotCQkJaW50IGFkanVzdGVkX2xlbmd0aCA9IGxlbmd0aDsKLQotCQkJLy8gcmVtb3ZlIG9wZW4gY29tbWVudHMKLQkJCVN0cmluZyBzdHJpbmcgPSBkb2N1bWVudC5nZXQob2Zmc2V0LCBsZW5ndGgpOwotCQkJaW50IGluZGV4ID0gc3RyaW5nLmxhc3RJbmRleE9mKE9QRU5fQ09NTUVOVCk7Ci0JCQl3aGlsZSAoaW5kZXggIT0gLTEpIHsKLQkJCQlkb2N1bWVudC5yZXBsYWNlKG9mZnNldCArIGluZGV4LCBPUEVOX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWluZGV4ID0gc3RyaW5nLmxhc3RJbmRleE9mKE9QRU5fQ09NTUVOVCwgaW5kZXggLSAxKTsKLQkJCQlhZGp1c3RlZF9sZW5ndGggLT0gT1BFTl9DT01NRU5ULmxlbmd0aCgpOwotCQkJfQotCi0JCQkvLyByZW1vdmUgY2xvc2UgY29tbWVudHMKLQkJCXN0cmluZyA9IGRvY3VtZW50LmdldChvZmZzZXQsIGFkanVzdGVkX2xlbmd0aCk7Ci0JCQlpbmRleCA9IHN0cmluZy5sYXN0SW5kZXhPZihDTE9TRV9DT01NRU5UKTsKLQkJCXdoaWxlIChpbmRleCAhPSAtMSkgewotCQkJCWRvY3VtZW50LnJlcGxhY2Uob2Zmc2V0ICsgaW5kZXgsIENMT1NFX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWluZGV4ID0gc3RyaW5nLmxhc3RJbmRleE9mKENMT1NFX0NPTU1FTlQsIGluZGV4IC0gMSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI4ZDU3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRGVzY3JpcHRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01Db250ZW50QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NQ29udGVudEJ1aWxkZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuQ01JbWFnZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIGV4dGVuZHMgQmFzZU5vZGVBY3Rpb25NYW5hZ2VyIHsKLQotCi0JLyoqCi0JICogQWRkTm9kZUFjdGlvbgotCSAqLwotCXB1YmxpYyBjbGFzcyBBZGROb2RlQWN0aW9uIGV4dGVuZHMgTm9kZUFjdGlvbiB7Ci0JCXByb3RlY3RlZCBDTU5vZGUgY21ub2RlOwotCQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uOwotCQlwcm90ZWN0ZWQgaW50IGluZGV4OwotCQlwcm90ZWN0ZWQgaW50IG5vZGVUeXBlOwotCQlwcm90ZWN0ZWQgTm9kZSBwYXJlbnQ7Ci0JCXByb3RlY3RlZCBTdHJpbmcgdW5kb0Rlc2NyaXB0aW9uOwotCi0KLQkJcHVibGljIEFkZE5vZGVBY3Rpb24oQ01Ob2RlIGNtbm9kZSwgTm9kZSBwYXJlbnQsIGludCBpbmRleCkgewotCQkJdGhpcy5jbW5vZGUgPSBjbW5vZGU7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJCXRoaXMuaW5kZXggPSBpbmRleDsKLQotCQkJU3RyaW5nIHRleHQgPSBnZXRMYWJlbChwYXJlbnQsIGNtbm9kZSk7Ci0JCQlzZXRUZXh0KHRleHQpOwotCQkJZGVzY3JpcHRpb24gPSB0ZXh0OwotCQkJdW5kb0Rlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9BREQgKyAiICIgKyB0ZXh0OyAvLyROT04tTkxTLTEkIAotCQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBDTUltYWdlVXRpbC5nZXRJbWFnZURlc2NyaXB0b3IoY21ub2RlKTsKLQkJCWlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCQlkZXNjcmlwdG9yID0gaW1hZ2VEZXNjcmlwdG9yQ2FjaGUuZ2V0SW1hZ2VEZXNjcmlwdG9yKGNtbm9kZSk7Ci0JCQl9Ci0JCQlzZXRJbWFnZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JCX0KLQotCi0JCXB1YmxpYyBBZGROb2RlQWN0aW9uKGludCBub2RlVHlwZSwgTm9kZSBwYXJlbnQsIGludCBpbmRleCkgewotCQkJdGhpcy5ub2RlVHlwZSA9IG5vZGVUeXBlOwotCQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0KLQkJCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCQlkZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQ09NTUVOVDsKLQkJCQkJdW5kb0Rlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9BRERfQ09NTUVOVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJCWRlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOwotCQkJCQl1bmRvRGVzY3JpcHRpb24gPSBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6IHsKLQkJCQkJZGVzY3JpcHRpb24gPSBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0NEQVRBX1NFQ1RJT047Ci0JCQkJCXVuZG9EZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX0NEQVRBX1NFQ1RJT047Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCQlkZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfUENEQVRBOwotCQkJCQl1bmRvRGVzY3JpcHRpb24gPSBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9QQ0RBVEE7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXNldFRleHQoZGVzY3JpcHRpb24pOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvckNhY2hlLmdldEltYWdlRGVzY3JpcHRvcihuZXcgSW50ZWdlcihub2RlVHlwZSkpKTsKLQkJfQotCi0KLQkJcHJvdGVjdGVkIHZvaWQgYWRkTm9kZUZvckNNTm9kZSgpIHsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCWluc2VydChwYXJlbnQsIGNtbm9kZSwgaW5kZXgpOwotCQkJfQotCQl9Ci0KLQotCQlwcm90ZWN0ZWQgdm9pZCBhZGROb2RlRm9yTm9kZVR5cGUoKSB7Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSA/IChEb2N1bWVudCkgcGFyZW50IDogcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCU5vZGUgbmV3Q2hpbGROb2RlID0gbnVsbDsKLQkJCWJvb2xlYW4gZm9ybWF0ID0gdHJ1ZTsKLQkJCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCQluZXdDaGlsZE5vZGUgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KFhNTFVJTWVzc2FnZXMuX1VJX0NPTU1FTlRfVkFMVUUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQkJbmV3Q2hpbGROb2RlID0gZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFhNTFVJTWVzc2FnZXMuX1VJX1BJX1RBUkdFVF9WQUxVRSwgWE1MVUlNZXNzYWdlcy5fVUlfUElfREFUQV9WQUxVRSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDogewotCQkJCQluZXdDaGlsZE5vZGUgPSBkb2N1bWVudC5jcmVhdGVDREFUQVNlY3Rpb24oIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCQlmb3JtYXQgPSBmYWxzZTsKLQkJCQkJbmV3Q2hpbGROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocGFyZW50LmdldE5vZGVOYW1lKCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChuZXdDaGlsZE5vZGUgIT0gbnVsbCkgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBWZWN0b3IoMSk7Ci0JCQkJbGlzdC5hZGQobmV3Q2hpbGROb2RlKTsKLQkJCQlpbnNlcnROb2Rlc0F0SW5kZXgocGFyZW50LCBsaXN0LCBpbmRleCwgZm9ybWF0KTsKLQkJCX0KLQkJfQotCi0KLQkJcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gdW5kb0Rlc2NyaXB0aW9uOwotCQl9Ci0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQliZWdpbk5vZGVBY3Rpb24odGhpcyk7Ci0JCQlpZiAoY21ub2RlICE9IG51bGwpIHsKLQkJCQlhZGROb2RlRm9yQ01Ob2RlKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhZGROb2RlRm9yTm9kZVR5cGUoKTsKLQkJCX0KLQkJCWVuZE5vZGVBY3Rpb24odGhpcyk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIERlbGV0ZUFjdGlvbgotCSAqLwotCXB1YmxpYyBjbGFzcyBEZWxldGVBY3Rpb24gZXh0ZW5kcyBOb2RlQWN0aW9uIHsKLQkJcHJvdGVjdGVkIExpc3QgbGlzdDsKLQotCQlwdWJsaWMgRGVsZXRlQWN0aW9uKExpc3QgbGlzdCkgewotCQkJc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX1JFTU9WRSk7Ci0JCQl0aGlzLmxpc3QgPSBsaXN0OwotCQl9Ci0KLQkJcHVibGljIERlbGV0ZUFjdGlvbihOb2RlIG5vZGUpIHsKLQkJCXNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9SRU1PVkUpOwotCQkJbGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJCWxpc3QuYWRkKG5vZGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gWE1MVUlNZXNzYWdlcy5ERUxFVEU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQliZWdpbk5vZGVBY3Rpb24odGhpcyk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIGkubmV4dCgpOwotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCQlBdHRyIGF0dHIgPSAoQXR0cikgbm9kZTsKLQkJCQkJYXR0ci5nZXRPd25lckVsZW1lbnQoKS5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJCQlOb2RlIHByZXZpb3VzU2libGluZyA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJCQlpZiAoKHByZXZpb3VzU2libGluZyAhPSBudWxsKSAmJiBpc1doaXRlc3BhY2VUZXh0Tm9kZShwcmV2aW91c1NpYmxpbmcpKSB7Ci0JCQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKHByZXZpb3VzU2libGluZyk7Ci0JCQkJCQl9Ci0JCQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWVuZE5vZGVBY3Rpb24odGhpcyk7Ci0JCX0KLQl9Ci0KLQotCWNsYXNzIEltYWdlRGVzY3JpcHRvckNhY2hlIHsKLQkJcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBhdHRyaWJ1dGVJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVFJJQlVURSk7Ci0JCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgYXR0cmlidXRlUmVxSW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRfUkVRX09CSik7Ci0JCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgY2RhdGFTZWN0aW9uSW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DREFUQVNFQ1RJT04pOwotCQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGNvbW1lbnRJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NPTU1FTlQpOwotCQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGVsZW1lbnRJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0VMRU1FTlQpOwotCQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIHBpSW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9QUk9DRVNTSU5HSU5TVFJVQ1RJT04pOwotCQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIHRleHRJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RYVEVYVCk7Ci0KLQkJcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ01Ob2RlKSB7Ci0JCQkJQ01Ob2RlIGNtbm9kZSA9IChDTU5vZGUpIG9iamVjdDsKLQkJCQlzd2l0Y2ggKGNtbm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJCWNhc2UgQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTiA6IHsKLQkJCQkJCXJlc3VsdCA9IENNSW1hZ2VVdGlsLmdldEltYWdlRGVzY3JpcHRvcihjbW5vZGUpOwotCQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCQkJaWYgKCgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgY21ub2RlKS5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpIHsKLQkJCQkJCQkJcmVzdWx0ID0gYXR0cmlidXRlUmVxSW1hZ2U7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlyZXN1bHQgPSBhdHRyaWJ1dGVJbWFnZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIENNTm9kZS5EQVRBX1RZUEUgOiB7Ci0JCQkJCQlyZXN1bHQgPSB0ZXh0SW1hZ2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDogewotCQkJCQkJcmVzdWx0ID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2VEZXNjcmlwdG9yKGNtbm9kZSk7Ci0JCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJCQlyZXN1bHQgPSBlbGVtZW50SW1hZ2U7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIENNTm9kZS5HUk9VUCA6IHsKLQkJCQkJCXJlc3VsdCA9IGVsZW1lbnRJbWFnZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJCUludGVnZXIgaW50ZWdlciA9IChJbnRlZ2VyKSBvYmplY3Q7Ci0JCQkJc3dpdGNoIChpbnRlZ2VyLmludFZhbHVlKCkpIHsKLQkJCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQkJCXJlc3VsdCA9IGNvbW1lbnRJbWFnZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJCQlyZXN1bHQgPSBwaUltYWdlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6IHsKLQkJCQkJCXJlc3VsdCA9IGNkYXRhU2VjdGlvbkltYWdlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsKLQkJCQkJCXJlc3VsdCA9IHRleHRJbWFnZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCS8vIFRPRE8uLi4gcmVtb3ZlIHRoaXMgY2xhc3MuIEknbSBwcmV0dHkgc3VyZSBpdCBpcyBubyBsb25nZXIgdXNlZCBieQotCS8vIGFueW9uZS4KLQkvKioKLQkgKiBAZGVwcmFjYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBJbnNlcnRBY3Rpb24gZXh0ZW5kcyBOb2RlQWN0aW9uIHsKLQkJcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbjsKLQkJcHJvdGVjdGVkIGludCBpbmRleDsKLQkJcHJvdGVjdGVkIGludCBub2RlVHlwZTsKLQkJcHJvdGVjdGVkIE5vZGUgcGFyZW50OwotCi0JCXB1YmxpYyBJbnNlcnRBY3Rpb24oaW50IG5vZGVUeXBlLCBOb2RlIHBhcmVudCwgaW50IGluZGV4KSB7Ci0JCQl0aGlzLm5vZGVUeXBlID0gbm9kZVR5cGU7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCQlkZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQ09NTUVOVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJCWRlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6IHsKLQkJCQkJZGVzY3JpcHRpb24gPSBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0NEQVRBX1NFQ1RJT047Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCQlkZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfUENEQVRBOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlzZXRUZXh0KGRlc2NyaXB0aW9uKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihpbWFnZURlc2NyaXB0b3JDYWNoZS5nZXRJbWFnZURlc2NyaXB0b3IobmV3IEludGVnZXIobm9kZVR5cGUpKSk7Ci0JCX0KLQotCQlwdWJsaWMgSW5zZXJ0QWN0aW9uKGludCBub2RlVHlwZSwgTm9kZSBwYXJlbnQsIGludCBpbmRleCwgU3RyaW5nIHRpdGxlKSB7Ci0JCQl0aGlzLm5vZGVUeXBlID0gbm9kZVR5cGU7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJCWRlc2NyaXB0aW9uID0gdGl0bGU7Ci0JCQlzZXRUZXh0KGRlc2NyaXB0aW9uKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihpbWFnZURlc2NyaXB0b3JDYWNoZS5nZXRJbWFnZURlc2NyaXB0b3IobmV3IEludGVnZXIobm9kZVR5cGUpKSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpIHsKLQkJCXJldHVybiBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERCArICIgIiArIGRlc2NyaXB0aW9uOyAvLyROT04tTkxTLTEkIAotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJYmVnaW5Ob2RlQWN0aW9uKHRoaXMpOwotCi0JCQlEb2N1bWVudCBkb2N1bWVudCA9IHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSA/IChEb2N1bWVudCkgcGFyZW50IDogcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCU5vZGUgbmV3Q2hpbGROb2RlID0gbnVsbDsKLQkJCWJvb2xlYW4gZm9ybWF0ID0gdHJ1ZTsKLQkJCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCQluZXdDaGlsZE5vZGUgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KFhNTFVJTWVzc2FnZXMuX1VJX0NPTU1FTlRfVkFMVUUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQkJbmV3Q2hpbGROb2RlID0gZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFhNTFVJTWVzc2FnZXMuX1VJX1BJX1RBUkdFVF9WQUxVRSwgWE1MVUlNZXNzYWdlcy5fVUlfUElfREFUQV9WQUxVRSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDogewotCQkJCQluZXdDaGlsZE5vZGUgPSBkb2N1bWVudC5jcmVhdGVDREFUQVNlY3Rpb24oIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCQlmb3JtYXQgPSBmYWxzZTsKLQkJCQkJbmV3Q2hpbGROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocGFyZW50LmdldE5vZGVOYW1lKCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChuZXdDaGlsZE5vZGUgIT0gbnVsbCkgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBWZWN0b3IoMSk7Ci0JCQkJbGlzdC5hZGQobmV3Q2hpbGROb2RlKTsKLQkJCQlpbnNlcnROb2Rlc0F0SW5kZXgocGFyZW50LCBsaXN0LCBpbmRleCwgZm9ybWF0KTsKLQkJCX0KLQotCQkJZW5kTm9kZUFjdGlvbih0aGlzKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogUmVwbGFjZU5vZGVBY3Rpb24KLQkgKi8KLQlwdWJsaWMgY2xhc3MgUmVwbGFjZU5vZGVBY3Rpb24gZXh0ZW5kcyBOb2RlQWN0aW9uIHsKLQkJcHJvdGVjdGVkIENNTm9kZSBjbW5vZGU7Ci0JCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb247Ci0JCXByb3RlY3RlZCBpbnQgZW5kSW5kZXg7Ci0JCXByb3RlY3RlZCBOb2RlIHBhcmVudDsKLQkJcHJvdGVjdGVkIGludCBzdGFydEluZGV4OwotCi0KLQkJcHVibGljIFJlcGxhY2VOb2RlQWN0aW9uKE5vZGUgcGFyZW50LCBDTU5vZGUgY21ub2RlLCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KSB7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJCXRoaXMuY21ub2RlID0gY21ub2RlOwotCQkJdGhpcy5zdGFydEluZGV4ID0gc3RhcnRJbmRleDsKLQkJCXRoaXMuZW5kSW5kZXggPSBlbmRJbmRleDsKLQotCQkJc2V0VGV4dChnZXRMYWJlbChwYXJlbnQsIGNtbm9kZSkpOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvckNhY2hlLmdldEltYWdlRGVzY3JpcHRvcihjbW5vZGUpKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCQkJU3RyaW5nIHJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1VORE9fUkVQTEFDRV9ERVNDUklQVElPTjsKLQkJCXJlc3VsdCArPSAiICIgKyBnZXRMYWJlbChwYXJlbnQsIGNtbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQliZWdpbk5vZGVBY3Rpb24odGhpcyk7Ci0KLQkJCWlmICgocGFyZW50ICE9IG51bGwpICYmIChjbW5vZGUgIT0gbnVsbCkpIHsKLQkJCQlyZW1vdmUocGFyZW50LCBzdGFydEluZGV4LCBlbmRJbmRleCk7Ci0JCQkJaW5zZXJ0KHBhcmVudCwgY21ub2RlLCBzdGFydEluZGV4KTsKLQkJCX0KLQkJCWVuZE5vZGVBY3Rpb24odGhpcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yQ2FjaGUgaW1hZ2VEZXNjcmlwdG9yQ2FjaGUgPSBuZXcgSW1hZ2VEZXNjcmlwdG9yQ2FjaGUoKTsKLQlwcm90ZWN0ZWQgVmlld2VyIGZWaWV3ZXI7Ci0KLQlwdWJsaWMgQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnksIFZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIobW9kZWwsIG1vZGVsUXVlcnkpOwotCQl0aGlzLmZWaWV3ZXIgPSB2aWV3ZXI7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBiZWdpbk5vZGVBY3Rpb24oTm9kZUFjdGlvbiBhY3Rpb24pIHsKLQkJZk1vZGVsLmJlZ2luUmVjb3JkaW5nKGFjdGlvbiwgYWN0aW9uLmdldFVuZG9EZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkQXR0cmlidXRlQWN0aW9uKEVsZW1lbnQgcGFyZW50LCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBudWxsOwotCQlpZiAoYWQgPT0gbnVsbCkgewotCQkJYWN0aW9uID0gbmV3IEVkaXRBdHRyaWJ1dGVBY3Rpb24odGhpcywgcGFyZW50LCBudWxsLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX05FV19BVFRSSUJVVEUsIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfTkVXX0FUVFJJQlVURV9USVRMRSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhY3Rpb24gPSBuZXcgQWRkTm9kZUFjdGlvbihhZCwgcGFyZW50LCAtMSk7Ci0JCX0KLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkQ0RhdGFTZWN0aW9uQWN0aW9uKE5vZGUgcGFyZW50LCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBBZGROb2RlQWN0aW9uKE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFLCBwYXJlbnQsIGluZGV4KTsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkQ29tbWVudEFjdGlvbihOb2RlIHBhcmVudCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgQWRkTm9kZUFjdGlvbihOb2RlLkNPTU1FTlRfTk9ERSwgcGFyZW50LCBpbmRleCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZERvY3R5cGVBY3Rpb24oRG9jdW1lbnQgZG9jdW1lbnQsIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IEVkaXREb2N0eXBlQWN0aW9uKGZNb2RlbCwgZG9jdW1lbnQsIGZNb2RlbC5nZXRCYXNlTG9jYXRpb24oKSwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9BRERfRFREX0lORk9STUFUSU9OKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkRWxlbWVudEFjdGlvbihOb2RlIHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmRleCkgewotCQlBY3Rpb24gYWN0aW9uID0gbnVsbDsKLQkJaWYgKGVkID09IG51bGwpIHsKLQkJCWFjdGlvbiA9IG5ldyBFZGl0RWxlbWVudEFjdGlvbih0aGlzLCBwYXJlbnQsIGluZGV4LCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX05FV19FTEVNRU5ULCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX05FV19FTEVNRU5UX1RJVExFKTsKLQkJfQotCQllbHNlIHsKLQkJCWFjdGlvbiA9IG5ldyBBZGROb2RlQWN0aW9uKGVkLCBwYXJlbnQsIGluZGV4KTsKLQkJfQotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRQQ0RhdGFBY3Rpb24oTm9kZSBwYXJlbnQsIENNRGF0YVR5cGUgZGF0YVR5cGUsIGludCBpbmRleCkgewotCQlBY3Rpb24gYWN0aW9uID0gbnVsbDsKLQkJaWYgKGRhdGFUeXBlID09IG51bGwpIHsKLQkJCWFjdGlvbiA9IG5ldyBBZGROb2RlQWN0aW9uKE5vZGUuVEVYVF9OT0RFLCBwYXJlbnQsIGluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCWFjdGlvbiA9IG5ldyBBZGROb2RlQWN0aW9uKGRhdGFUeXBlLCBwYXJlbnQsIGluZGV4KTsKLQkJfQotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24oTm9kZSBwYXJlbnQsIGludCBpbmRleCkgewotCQlOb2RlIHJlZkNoaWxkID0gZ2V0UmVmQ2hpbGROb2RlQXRJbmRleChwYXJlbnQsIGluZGV4KTsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uKHRoaXMsIHBhcmVudCwgcmVmQ2hpbGQsIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX1BST0NFU1NJTkdfSU5TVFJVQ1RJT04sIFhNTFVJTWVzc2FnZXMuQUREX1BST0NFU1NJTkdfSU5TVFJVQ1RJT04pOwotCQlhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvckNhY2hlLmdldEltYWdlRGVzY3JpcHRvcihuZXcgSW50ZWdlcihOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkpKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkU2NoZW1hSW5mb0FjdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBFZGl0U2NoZW1hSW5mb0FjdGlvbih0aGlzLCBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSwgZk1vZGVsLmdldEJhc2VMb2NhdGlvbigpLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9TQ0hFTUFfSU5GT1JNQVRJT04pOwotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVEZWxldGVBY3Rpb24oTGlzdCBzZWxlY3Rpb24pIHsKLQkJRGVsZXRlQWN0aW9uIGRlbGV0ZUFjdGlvbiA9IG5ldyBEZWxldGVBY3Rpb24oc2VsZWN0aW9uKTsKLQkJZGVsZXRlQWN0aW9uLnNldEVuYWJsZWQoc2VsZWN0aW9uLnNpemUoKSA+IDApOwotCQlyZXR1cm4gZGVsZXRlQWN0aW9uOwotCX0KLQotCi0JcHVibGljIERPTUNvbnRlbnRCdWlsZGVyIGNyZWF0ZURPTUNvbnRlbnRCdWlsZGVyKERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCURPTUNvbnRlbnRCdWlsZGVySW1wbCBidWlsZGVyID0gbmV3IERPTUNvbnRlbnRCdWlsZGVySW1wbChkb2N1bWVudCk7Ci0JCXJldHVybiBidWlsZGVyOwotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVFZGl0QXR0cmlidXRlQWN0aW9uKEF0dHIgYXR0ciwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkgewotCQlyZXR1cm4gbmV3IEVkaXRBdHRyaWJ1dGVBY3Rpb24odGhpcywgYXR0ci5nZXRPd25lckVsZW1lbnQoKSwgYXR0ciwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9FRElUX0FUVFJJQlVURSwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9FRElUX0FUVFJJQlVURV9USVRMRSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUVkaXREb2N0eXBlQWN0aW9uKERvY3VtZW50VHlwZSBkb2N0eXBlKSB7Ci0JCXJldHVybiBuZXcgRWRpdERvY3R5cGVBY3Rpb24oZk1vZGVsLCBkb2N0eXBlLCBmTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCksIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfRURJVF9ET0NUWVBFKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbihQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkpIHsKLQkJcmV0dXJuIG5ldyBFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uKHRoaXMsIHBpLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0VESVRfUFJPQ0VTU0lOR19JTlNUUlVDVElPTiwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9FRElUX1BST0NFU1NJTkdfSU5TVFJVQ1RJT05fVElUTEUpOwotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVFZGl0U2NoZW1hSW5mb0FjdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBFZGl0U2NoZW1hSW5mb0FjdGlvbih0aGlzLCBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSwgZk1vZGVsLmdldEJhc2VMb2NhdGlvbigpLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0VESVRfTkFNRVNQQUNFUyk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZVJlbmFtZUFjdGlvbihOb2RlIG5vZGUpIHsKLQkJQWN0aW9uIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJcmVzdWx0ID0gbmV3IEVkaXRFbGVtZW50QWN0aW9uKHRoaXMsIChFbGVtZW50KSBub2RlLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX1JFTkFNRSwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9SRU5BTUVfVElUTEUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZVJlcGxhY2VBY3Rpb24oTm9kZSBwYXJlbnQsIENNTm9kZSBjbW5vZGUsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBSZXBsYWNlTm9kZUFjdGlvbihwYXJlbnQsIGNtbm9kZSwgc3RhcnRJbmRleCwgZW5kSW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZE5vZGVBY3Rpb24oTm9kZUFjdGlvbiBhY3Rpb24pIHsKLQkJZk1vZGVsLmVuZFJlY29yZGluZyhhY3Rpb24pOwotCX0KLQotCi0KLQlwdWJsaWMgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0cnkgewotCQkJTGlzdCBzZWxlY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gZXMgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJc2VsZWN0aW9uTGlzdC5hZGQoaS5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQotCQkJY29udHJpYnV0ZUFjdGlvbnMobWVudU1hbmFnZXIsIHNlbGVjdGlvbkxpc3QpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoTm9kZSBwYXJlbnQsIENNTm9kZSBjbW5vZGUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICI/IiArIGNtbm9kZSArICI/IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmIChjbW5vZGUgIT0gbnVsbCkgewotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NTgwMAotCQkJcmVzdWx0ID0gY21ub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQlpZihyZXN1bHQgPT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IChTdHJpbmcpIGNtbm9kZS5nZXRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5HUk9VUCkgewotCQkJCQlDTURlc2NyaXB0aW9uQnVpbGRlciBkZXNjcmlwdGlvbkJ1aWxkZXIgPSBuZXcgQ01EZXNjcmlwdGlvbkJ1aWxkZXIoKTsKLQkJCQkJcmVzdWx0ID0gZGVzY3JpcHRpb25CdWlsZGVyLmJ1aWxkRGVzY3JpcHRpb24oY21ub2RlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShjbW5vZGUsIHBhcmVudCwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIGZNb2RlbDsKLQl9Ci0KLQotCXB1YmxpYyBTaGVsbCBnZXRXb3JrYmVuY2hXaW5kb3dTaGVsbCgpIHsKLQkJcmV0dXJuIFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGluc2VydChOb2RlIHBhcmVudCwgQ01Ob2RlIGNtbm9kZSwgaW50IGluZGV4KSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFID8gKERvY3VtZW50KSBwYXJlbnQgOiBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlET01Db250ZW50QnVpbGRlciBidWlsZGVyID0gY3JlYXRlRE9NQ29udGVudEJ1aWxkZXIoZG9jdW1lbnQpOwotCQlidWlsZGVyLnNldEJ1aWxkUG9saWN5KERPTUNvbnRlbnRCdWlsZGVyLkJVSUxEX09OTFlfUkVRVUlSRURfQ09OVEVOVCk7Ci0JCWJ1aWxkZXIuYnVpbGQocGFyZW50LCBjbW5vZGUpOwotCQlpbnNlcnROb2Rlc0F0SW5kZXgocGFyZW50LCBidWlsZGVyLmdldFJlc3VsdCgpLCBpbmRleCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBpbnNlcnROb2Rlc0F0SW5kZXgoTm9kZSBwYXJlbnQsIExpc3QgbGlzdCwgaW50IGluZGV4KSB7Ci0JCWluc2VydE5vZGVzQXRJbmRleChwYXJlbnQsIGxpc3QsIGluZGV4LCB0cnVlKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGluc2VydE5vZGVzQXRJbmRleChOb2RlIHBhcmVudCwgTGlzdCBsaXN0LCBpbnQgaW5kZXgsIGJvb2xlYW4gZm9ybWF0KSB7Ci0JCU5vZGVMaXN0IG5vZGVMaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlpbmRleCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQl9Ci0JCU5vZGUgcmVmQ2hpbGQgPSAoaW5kZXggPCBub2RlTGlzdC5nZXRMZW5ndGgoKSkgPyBub2RlTGlzdC5pdGVtKGluZGV4KSA6IG51bGw7Ci0KLQkJLy8gaGVyZSB3ZSBjb25zaWRlciB0aGUgY2FzZSB3aGVyZSB0aGUgcHJldmlvdXMgbm9kZSBpcyBhICd3aGl0ZQotCQkvLyBzcGFjZScgVGV4dCBub2RlCi0JCS8vIHdlIHNob3VsZCByZWFsbHkgZG8gdGhlIGluc2VydCBiZWZvcmUgdGhpcyBub2RlCi0JCS8vCi0JCWludCBwcmV2SW5kZXggPSBpbmRleCAtIDE7Ci0JCU5vZGUgcHJldkNoaWxkID0gKHByZXZJbmRleCA8IG5vZGVMaXN0LmdldExlbmd0aCgpKSA/IG5vZGVMaXN0Lml0ZW0ocHJldkluZGV4KSA6IG51bGw7Ci0JCWlmIChpc1doaXRlc3BhY2VUZXh0Tm9kZShwcmV2Q2hpbGQpKSB7Ci0JCQlyZWZDaGlsZCA9IHByZXZDaGlsZDsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5ld05vZGUgPSAoTm9kZSkgaS5uZXh0KCk7Ci0KLQkJCWlmIChuZXdOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCUVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChFbGVtZW50KSBwYXJlbnQ7Ci0JCQkJcGFyZW50RWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKChBdHRyKSBuZXdOb2RlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgcmVmQ2hpbGQpOwotCQkJfQotCQl9Ci0KLQkJYm9vbGVhbiBmb3JtYXREZWVwID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5ld05vZGUgPSAoTm9kZSkgaS5uZXh0KCk7Ci0JCQlpZiAobmV3Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJZm9ybWF0RGVlcCA9IHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChmb3JtYXQpIHsKLQkJCQlyZWZvcm1hdChuZXdOb2RlLCBmb3JtYXREZWVwKTsKLQkJCX0KLQkJfQotCi0JCXNldFZpZXdlclNlbGVjdGlvbihsaXN0KTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGFic3RyYWN0IHNpbmNlIGN1cnJlbnRseSwgdGhlIHNlZCBlZGl0b3IgaXMgcmVxdWlyZWQgdG8KLQkgKiBwZXJmb3JtIGZvcm1hdGluZyBhbmQgd2UgZG9uJ3Qgd2FudCB0byBjcmVhdGUgYSBkZXBlbmRlbmN5IG9uIHRoZSBzZWQKLQkgKiBlZGl0b3IuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcmVmb3JtYXQoTm9kZSBwYXJlbnQsIGJvb2xlYW4gZGVlcCk7Ci0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZShOb2RlIHBhcmVudCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkgewotCQlOb2RlTGlzdCBub2RlTGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSBlbmRJbmRleDsgaSA+PSBzdGFydEluZGV4OyBpLS0pIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJcGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXJTZWxlY3Rpb24oTGlzdCBsaXN0KSB7Ci0JCWlmIChmVmlld2VyICE9IG51bGwpIHsKLQkJCWZWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGxpc3QpLCB0cnVlKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyU2VsZWN0aW9uKE5vZGUgbm9kZSkgewotCQlpZiAoZlZpZXdlciAhPSBudWxsKSB7Ci0JCQlmVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihub2RlKSwgdHJ1ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3Rpb25Db250cmlidXRvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQWN0aW9uQ29udHJpYnV0b3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRmODI4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3Rpb25Db250cmlidXRvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnMuQWN0aW9uQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLkFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLlN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotLyoqCi0gKiBYTUxFZGl0b3JBY3Rpb25Db250cmlidXRvcgotICogCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgdXNlZCBpbnNpZGUgbXVsdGkgcGFnZSBlZGl0b3IncwotICogQWN0aW9uQmFyQ29udHJpYnV0b3IsIHNpbmNlIGNhc2NhZGVkIGluaXQoKSBjYWxsIGZyb20gdGhlCi0gKiBBY3Rpb25CYXJDb250cmlidXRvciB3aWxsIGNhdXNlcyBleGNlcHRpb24gYW5kIGl0IGxlYWRzIHRvIGxvc2Ugd2hvbGUKLSAqIHRvb2xiYXJzLgotICogCi0gKiBJbnN0ZWFkLCB1c2UgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yIGZvciBzb3VyY2UgcGFnZSBjb250cmlidXRvciBvZgotICogbXVsdGkgcGFnZSBlZGl0b3IuCi0gKiAKLSAqIE5vdGUgdGhhdCB0aGlzIGNsYXNzIGlzIHN0aWxsIHZhbGlkIGZvciBzaW5nbGUgcGFnZSBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25Db250cmlidXRvclhNTCBleHRlbmRzIEFjdGlvbkNvbnRyaWJ1dG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFRElUT1JfSURTID0geyJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZSIsICJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZTIiLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHT19UT19NQVRDSElOR19UQUdfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5nb3RvTWF0Y2hpbmdUYWciOyAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmQ2xlYW51cERvY3VtZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZDb21tZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZDb250ZW50QXNzaXN0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZGaW5kT2NjdXJyZW5jZXMgPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZkZvcm1hdEFjdGl2ZUVsZW1lbnRzID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZGb3JtYXREb2N1bWVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmT3BlbkZpbGVBY3Rpb24gPSBudWxsOyAvLyBvcGVuIGZpbGUKLQotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZlVuY29tbWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBHb1RvTWF0Y2hpbmdUYWdBY3Rpb24gZkdvVG9NYXRjaGluZ1RhZ0FjdGlvbjsKLQotCXB1YmxpYyBBY3Rpb25Db250cmlidXRvclhNTCgpIHsKLQkJc3VwZXIoKTsKLQotCQlSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IFhNTFVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQotCQlmQ29udGVudEFzc2lzdCA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlmQ29udGVudEFzc2lzdC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLkNPTlRFTlRfQVNTSVNUX1BST1BPU0FMUyk7Ci0KLQkJLy8gc291cmNlIGNvbW1hbmRzCi0JCWZDbGVhbnVwRG9jdW1lbnQgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZkNsZWFudXBEb2N1bWVudC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5DTEVBTlVQX0RPQ1VNRU5UKTsKLQotCQlmRm9ybWF0RG9jdW1lbnQgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZkZvcm1hdERvY3VtZW50LnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLkZPUk1BVF9ET0NVTUVOVCk7Ci0KLQkJZkZvcm1hdEFjdGl2ZUVsZW1lbnRzID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWZGb3JtYXRBY3RpdmVFbGVtZW50cy5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5GT1JNQVRfQUNUSVZFX0VMRU1FTlRTKTsKLQotCQkvLyBuYXZpZ2F0ZSBjb21tYW5kcwotCQlmT3BlbkZpbGVBY3Rpb24gPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZk9wZW5GaWxlQWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLk9QRU5fRklMRSk7Ci0KLQkJZkZpbmRPY2N1cnJlbmNlcyA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlmRmluZE9jY3VycmVuY2VzLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLkZJTkRfT0NDVVJSRU5DRVMpOwotCi0JCWZHb1RvTWF0Y2hpbmdUYWdBY3Rpb24gPSBuZXcgR29Ub01hdGNoaW5nVGFnQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiZ290b01hdGNoaW5nVGFnXyIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWZHb1RvTWF0Y2hpbmdUYWdBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKEdPX1RPX01BVENISU5HX1RBR19JRCk7Ci0JCWZHb1RvTWF0Y2hpbmdUYWdBY3Rpb24uc2V0SWQoR09fVE9fTUFUQ0hJTkdfVEFHX0lEKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJLy8gbmF2aWdhdGUgY29tbWFuZHMKLQkJSU1lbnVNYW5hZ2VyIG5hdmlnYXRlTWVudSA9IG1lbnUuZmluZE1lbnVVc2luZ1BhdGgoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX05BVklHQVRFKTsKLQkJaWYgKG5hdmlnYXRlTWVudSAhPSBudWxsKSB7Ci0JCQluYXZpZ2F0ZU1lbnUuYXBwZW5kVG9Hcm91cChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk9QRU5fRVhULCBmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJbmF2aWdhdGVNZW51LmFwcGVuZFRvR3JvdXAoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5PUEVOX0VYVCwgZk9wZW5GaWxlQWN0aW9uKTsKLQotCQkJSU1lbnVNYW5hZ2VyIGdvdG9Hcm91cCA9IG5hdmlnYXRlTWVudS5maW5kTWVudVVzaW5nUGF0aChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkdPX1RPKTsKLQkJCWlmIChnb3RvR3JvdXAgIT0gbnVsbCkgewotCQkJCWdvdG9Hcm91cC5hcHBlbmRUb0dyb3VwKCJtYXRjaGluZ0JlZ2luIiwgZkdvVG9NYXRjaGluZ1RhZ0FjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlzdXBlci5jb250cmlidXRlVG9NZW51KG1lbnUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotLyoKLQkJLy8gZWRpdCBjb21tYW5kcwotCQlJTWVudU1hbmFnZXIgZWRpdE1lbnUgPSBtZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElUKTsKLQkJaWYgKGVkaXRNZW51ICE9IG51bGwpIHsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZUb2dnbGVJbnNlcnRNb2RlQWN0aW9uKTsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZFeHBhbmRTZWxlY3Rpb25Ub01lbnUpOwotCQkJZWRpdE1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQllZGl0TWVudS5hZGQoZkNvbnRlbnRBc3Npc3QpOwotCQkJZWRpdE1lbnUuYWRkKGZNZW51QWRkaXRpb25zR3JvdXBNYXJrZXIpOwotCQl9Ci0KLQkJLy8gc291cmNlIGNvbW1hbmRzCi0JCVN0cmluZyBzb3VyY2VNZW51TGFiZWwgPSBYTUxVSU1lc3NhZ2VzLlNvdXJjZU1lbnVfbGFiZWw7Ci0JCVN0cmluZyBzb3VyY2VNZW51SWQgPSAic291cmNlTWVudUlkIjsgLy8kTk9OLU5MUy0xJAotCQlJTWVudU1hbmFnZXIgc291cmNlTWVudSA9IG5ldyBNZW51TWFuYWdlcihzb3VyY2VNZW51TGFiZWwsIHNvdXJjZU1lbnVJZCk7Ci0JCW1lbnUuaW5zZXJ0QWZ0ZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0VESVQsIHNvdXJjZU1lbnUpOwotCQlpZiAoc291cmNlTWVudSAhPSBudWxsKSB7Ci0JCQlzb3VyY2VNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJc291cmNlTWVudS5hZGQoZlRvZ2dsZUNvbW1lbnQpOwotCQkJc291cmNlTWVudS5hZGQoZkFkZEJsb2NrQ29tbWVudCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmUmVtb3ZlQmxvY2tDb21tZW50KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZTaGlmdFJpZ2h0KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZTaGlmdExlZnQpOwotCQkJc291cmNlTWVudS5hZGQoZkNsZWFudXBEb2N1bWVudCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmRm9ybWF0RG9jdW1lbnQpOwotCQkJc291cmNlTWVudS5hZGQoZkZvcm1hdEFjdGl2ZUVsZW1lbnRzKTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQlzb3VyY2VNZW51LmFkZChmRmluZE9jY3VycmVuY2VzKTsKLQkJfQotCi0JCS8vIG5hdmlnYXRlIGNvbW1hbmRzCi0JCUlNZW51TWFuYWdlciBuYXZpZ2F0ZU1lbnUgPSBtZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9OQVZJR0FURSk7Ci0JCWlmIChuYXZpZ2F0ZU1lbnUgIT0gbnVsbCkgewotCQkJbmF2aWdhdGVNZW51LmFwcGVuZFRvR3JvdXAoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5PUEVOX0VYVCwgZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCW5hdmlnYXRlTWVudS5hcHBlbmRUb0dyb3VwKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuT1BFTl9FWFQsIGZPcGVuRmlsZUFjdGlvbik7Ci0KLQkJCUlNZW51TWFuYWdlciBnb3RvR3JvdXAgPSBuYXZpZ2F0ZU1lbnUuZmluZE1lbnVVc2luZ1BhdGgoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5HT19UTyk7Ci0JCQlpZiAoZ290b0dyb3VwICE9IG51bGwpIHsKLQkJCQlnb3RvR3JvdXAuYWRkKGZHb3RvTWF0Y2hpbmdCcmFja2V0QWN0aW9uKTsKLQkJCQlnb3RvR3JvdXAuYWRkKGZHb1RvTWF0Y2hpbmdUYWdBY3Rpb24pOwotCQkJCWdvdG9Hcm91cC5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCX0KLQkJfQotKi8KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51dGlsLkFjdGlvbkNvbnRyaWJ1dG9yI2dldEV4dGVuc2lvbklEcygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEV4dGVuc2lvbklEcygpIHsKLQkJcmV0dXJuIEVESVRPUl9JRFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3Ijc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJaWYgKGdldEFjdGl2ZUVkaXRvclBhcnQoKSA9PSBhY3RpdmVFZGl0b3IpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQotCQlJQWN0aW9uQmFycyBhY3Rpb25CYXJzID0gZ2V0QWN0aW9uQmFycygpOwotCQlpZiAoYWN0aW9uQmFycyAhPSBudWxsKSB7Ci0JCQlJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIgPSBhY3Rpb25CYXJzLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0JCQlpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkgewotCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UobnVsbCk7Ci0JCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJfQotCQl9Ci0KLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IGdldFRleHRFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQotCQlmQ29udGVudEFzc2lzdC5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0NPTlRFTlRBU1NJU1RfUFJPUE9TQUxTKSk7Ci0KLQkJZkNsZWFudXBEb2N1bWVudC5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0NMRUFOVVBfRE9DVU1FTlQpKTsKLQkJZkZvcm1hdERvY3VtZW50LnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfRk9STUFUX0RPQ1VNRU5UKSk7Ci0JCWZGb3JtYXRBY3RpdmVFbGVtZW50cy5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9BQ1RJVkVfRUxFTUVOVFMpKTsKLQkJZkNsZWFudXBEb2N1bWVudC5zZXRFbmFibGVkKCh0ZXh0RWRpdG9yICE9IG51bGwpICYmIHRleHRFZGl0b3IuaXNFZGl0YWJsZSgpKTsKLQkJZkZvcm1hdERvY3VtZW50LnNldEVuYWJsZWQoKHRleHRFZGl0b3IgIT0gbnVsbCkgJiYgdGV4dEVkaXRvci5pc0VkaXRhYmxlKCkpOwotCQlmRm9ybWF0QWN0aXZlRWxlbWVudHMuc2V0RW5hYmxlZCgodGV4dEVkaXRvciAhPSBudWxsKSAmJiB0ZXh0RWRpdG9yLmlzRWRpdGFibGUoKSk7Ci0KLQkJZk9wZW5GaWxlQWN0aW9uLnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfT1BFTl9GSUxFKSk7Ci0KLQkJZkZpbmRPY2N1cnJlbmNlcy5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZJTkRfT0NDVVJSRU5DRVMpKTsKLQotCQlmR29Ub01hdGNoaW5nVGFnQWN0aW9uLnNldEVkaXRvcih0ZXh0RWRpdG9yKTsKLQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJdGV4dEVkaXRvci5zZXRBY3Rpb24oR09fVE9fTUFUQ0hJTkdfVEFHX0lELCBmR29Ub01hdGNoaW5nVGFnQWN0aW9uKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5JU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3Ijc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJZkNvbnRlbnRBc3Npc3Quc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJLy8gY2xlYW51cCBhbmQgZm9ybWF0IGRvY3VtZW50IGFjdGlvbnMgZG8gbm90IHJlbHkgb24gc291cmNlIHZpZXdlcgotCQkvLyBiZWluZyBlbmFibGVkCi0JCS8vIGZDbGVhbnVwRG9jdW1lbnQuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJLy8gZkZvcm1hdERvY3VtZW50LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJZkZvcm1hdEFjdGl2ZUVsZW1lbnRzLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWZPcGVuRmlsZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmRmluZE9jY3VycmVuY2VzLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJZkdvVG9NYXRjaGluZ1RhZ0FjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmR290b01hdGNoaW5nQnJhY2tldEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZEJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDM4Mzc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZEJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNvbW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotLyoqCi0gKiBBZGQgYmxvY2sgY29tbWVudCBhY3Rpb24gZGVsZWdhdGUgZm9yIFhNTCBlZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIEFkZEJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlIGV4dGVuZHMgQWJzdHJhY3RDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUgewotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuQWRkQmxvY2tDb21tZW50X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChYTUxVSU1lc3NhZ2VzLkFkZEJsb2NrQ29tbWVudF90b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihYTUxVSU1lc3NhZ2VzLkFkZEJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci0KLQl2b2lkIHByb2Nlc3NBY3Rpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBzZWxlY3Rpb25TdGFydEluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCUluZGV4ZWRSZWdpb24gc2VsZWN0aW9uRW5kSW5kZXhlZFJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCi0JCQkJaWYgKHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKChzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uID09IG51bGwpICYmICh0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpID4gMCkpIHsKLQkJCQkJc2VsZWN0aW9uRW5kSW5kZXhlZFJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJCQl9Ci0JCQkJaWYgKHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24gPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaW50IG9wZW5Db21tZW50T2Zmc2V0ID0gc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGNsb3NlQ29tbWVudE9mZnNldCA9IHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgKyBPUEVOX0NPTU1FTlQubGVuZ3RoKCk7Ci0KLQotCQkJCWlmICgodGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSA9PSAwKSAmJiAoc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgQ29tbWVudEltcGwpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBYTUxVSU1lc3NhZ2VzLkFkZEJsb2NrQ29tbWVudF90b29sdGlwKTsKLQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCXRyeSB7Ci0JCQkJCWRvY3VtZW50LnJlcGxhY2Uob3BlbkNvbW1lbnRPZmZzZXQsIDAsIE9QRU5fQ09NTUVOVCk7Ci0JCQkJCWRvY3VtZW50LnJlcGxhY2UoY2xvc2VDb21tZW50T2Zmc2V0LCAwLCBDTE9TRV9DT01NRU5UKTsKLQkJCQkJcmVtb3ZlT3BlbkNsb3NlQ29tbWVudHMoZG9jdW1lbnQsIG9wZW5Db21tZW50T2Zmc2V0ICsgT1BFTl9DT01NRU5ULmxlbmd0aCgpLCBjbG9zZUNvbW1lbnRPZmZzZXQgLSBvcGVuQ29tbWVudE9mZnNldCAtIENMT1NFX0NPTU1FTlQubGVuZ3RoKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQmFzZU5vZGVBY3Rpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9CYXNlTm9kZUFjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYyOWEyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9CYXNlTm9kZUFjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VOb2RlQWN0aW9uTWFuYWdlciB7Ci0KLQotCS8qKgotCSAqIE15TWVudU1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE15TWVudU1hbmFnZXIgZXh0ZW5kcyBNZW51TWFuYWdlciB7Ci0JCXByb3RlY3RlZCBTdHJpbmcgdGl0bGU7Ci0KLQkJcHVibGljIE15TWVudU1hbmFnZXIoU3RyaW5nIHMpIHsKLQkJCXN1cGVyKHMpOwotCQkJdGl0bGUgPSBzOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJcmV0dXJuICFpc0VtcHR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRpdGxlOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudFR5cGUgZ2V0RG9jdHlwZShOb2RlIG5vZGUpIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgPyAoRG9jdW1lbnQpIG5vZGUgOiBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJcmV0dXJuIGRvY3VtZW50LmdldERvY3R5cGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWVudUJ1aWxkZXIgbWVudUJ1aWxkZXIgPSBuZXcgTWVudUJ1aWxkZXIoKTsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBmTW9kZWw7Ci0JcHJvdGVjdGVkIE1vZGVsUXVlcnkgbW9kZWxRdWVyeTsKLQotCXByb3RlY3RlZCBCYXNlTm9kZUFjdGlvbk1hbmFnZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5KSB7Ci0JCXRoaXMuZk1vZGVsID0gbW9kZWw7Ci0JCXRoaXMubW9kZWxRdWVyeSA9IG1vZGVsUXVlcnk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBY3Rpb25IZWxwZXIoSU1lbnVNYW5hZ2VyIG1lbnUsIExpc3QgbW9kZWxRdWVyeUFjdGlvbkxpc3QpIHsKLQkJTGlzdCBhY3Rpb25MaXN0ID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBtb2RlbFF1ZXJ5QWN0aW9uTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU1vZGVsUXVlcnlBY3Rpb24gYWN0aW9uID0gKE1vZGVsUXVlcnlBY3Rpb24pIGkubmV4dCgpOwotCQkJaWYgKGFjdGlvbi5nZXRDTU5vZGUoKSAhPSBudWxsKSB7Ci0JCQkJaW50IGNtTm9kZVR5cGUgPSBhY3Rpb24uZ2V0Q01Ob2RlKCkuZ2V0Tm9kZVR5cGUoKTsKLQkJCQlpZiAoYWN0aW9uLmdldEtpbmQoKSA9PSBNb2RlbFF1ZXJ5QWN0aW9uLklOU0VSVCkgewotCQkJCQlzd2l0Y2ggKGNtTm9kZVR5cGUpIHsKLQkJCQkJCWNhc2UgQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTiA6IHsKLQkJCQkJCQlhY3Rpb25MaXN0LmFkZChjcmVhdGVBZGRBdHRyaWJ1dGVBY3Rpb24oKEVsZW1lbnQpIGFjdGlvbi5nZXRQYXJlbnQoKSwgKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGFjdGlvbi5nZXRDTU5vZGUoKSkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJY2FzZSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiA6IHsKLQkJCQkJCQlhY3Rpb25MaXN0LmFkZChjcmVhdGVBZGRFbGVtZW50QWN0aW9uKGFjdGlvbi5nZXRQYXJlbnQoKSwgKENNRWxlbWVudERlY2xhcmF0aW9uKSBhY3Rpb24uZ2V0Q01Ob2RlKCksIGFjdGlvbi5nZXRTdGFydEluZGV4KCkpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChhY3Rpb24uZ2V0S2luZCgpID09IE1vZGVsUXVlcnlBY3Rpb24uUkVQTEFDRSkgewotCQkJCQlpZiAoKGFjdGlvbi5nZXRQYXJlbnQoKSAhPSBudWxsKSAmJiAoYWN0aW9uLmdldENNTm9kZSgpICE9IG51bGwpKSB7Ci0JCQkJCQlhY3Rpb25MaXN0LmFkZChjcmVhdGVSZXBsYWNlQWN0aW9uKGFjdGlvbi5nZXRQYXJlbnQoKSwgYWN0aW9uLmdldENNTm9kZSgpLCBhY3Rpb24uZ2V0U3RhcnRJbmRleCgpLCBhY3Rpb24uZ2V0RW5kSW5kZXgoKSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCW1lbnVCdWlsZGVyLnBvcHVsYXRlTWVudShtZW51LCBhY3Rpb25MaXN0LCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZUFjdGlvbihJTWVudU1hbmFnZXIgbWVudSwgQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCW1lbnUuYWRkKGFjdGlvbik7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBMaXN0IHNlbGVjdGlvbikgewotCQlpbnQgZWRpdE1vZGUgPSBtb2RlbFF1ZXJ5LmdldEVkaXRNb2RlKCk7Ci0JCWludCBpYyA9IE1vZGVsUXVlcnkuSU5DTFVERV9DSElMRF9OT0RFUzsKLQkJaW50IHZjID0gKGVkaXRNb2RlID09IE1vZGVsUXVlcnkuRURJVF9NT0RFX0NPTlNUUkFJTkVEX1NUUklDVCkgPyBNb2RlbFF1ZXJ5LlZBTElESVRZX1NUUklDVCA6IE1vZGVsUXVlcnkuVkFMSURJVFlfTk9ORTsKLQotCQlMaXN0IGltcGxpY2l0bHlTZWxlY3RlZE5vZGVMaXN0ID0gbnVsbDsKLQotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCWltcGxpY2l0bHlTZWxlY3RlZE5vZGVMaXN0ID0gZ2V0U2VsZWN0ZWROb2RlcyhzZWxlY3Rpb24sIHRydWUpOwotCi0JCQkvLyBjb250cmlidXRlIGRlbGV0ZSBhY3Rpb25zCi0JCQljb250cmlidXRlRGVsZXRlQWN0aW9ucyhtZW51LCBpbXBsaWNpdGx5U2VsZWN0ZWROb2RlTGlzdCwgaWMsIHZjKTsKLQkJfQotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBzZWxlY3Rpb24uZ2V0KDApOwotCi0JCQkvLyBjb250cmlidXRlIGVkaXQgYWN0aW9ucwotCQkJY29udHJpYnV0ZUVkaXRBY3Rpb25zKG1lbnUsIG5vZGUpOwotCi0JCQkvLyBjb250cmlidXRlIGFkZCBjaGlsZCBhY3Rpb25zCi0JCQljb250cmlidXRlQWRkQ2hpbGRBY3Rpb25zKG1lbnUsIG5vZGUsIGljLCB2Yyk7Ci0KLQkJCS8vIGNvbnRyaWJ1dGUgYWRkIGJlZm9yZSBhY3Rpb25zCi0JCQljb250cmlidXRlQWRkU2libGluZ0FjdGlvbnMobWVudSwgbm9kZSwgaWMsIHZjKTsKLQkJfQotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJLy8gY29udHJpYnV0ZSByZXBsYWNlIGFjdGlvbnMKLQkJCWNvbnRyaWJ1dGVSZXBsYWNlQWN0aW9ucyhtZW51LCBpbXBsaWNpdGx5U2VsZWN0ZWROb2RlTGlzdCwgaWMsIHZjKTsKLQkJfQotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDApIHsKLQkJCURvY3VtZW50IGRvY3VtZW50ID0gKChJRE9NTW9kZWwpIGZNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCWNvbnRyaWJ1dGVBZGREb2N1bWVudENoaWxkQWN0aW9ucyhtZW51LCBkb2N1bWVudCwgaWMsIHZjKTsKLQkJCWNvbnRyaWJ1dGVFZGl0R3JhbW1hckluZm9ybWF0aW9uQWN0aW9ucyhtZW51LCBkb2N1bWVudCk7Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVBZGRDaGlsZEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIE5vZGUgbm9kZSwgaW50IGljLCBpbnQgdmMpIHsKLQkJaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCi0JCWlmIChub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJLy8gJ0FkZCBDaGlsZC4uLicgYW5kICdBZGQgQXR0cmlidXRlLi4uJyBhY3Rpb25zCi0JCQkvLwotCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0KLQkJCUlNZW51TWFuYWdlciBhZGRBdHRyaWJ1dGVNZW51ID0gbmV3IE15TWVudU1hbmFnZXIoWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9BRERfQVRUUklCVVRFKTsKLQkJCUlNZW51TWFuYWdlciBhZGRDaGlsZE1lbnUgPSBuZXcgTXlNZW51TWFuYWdlcihYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9DSElMRCk7Ci0JCQltZW51LmFkZChhZGRBdHRyaWJ1dGVNZW51KTsKLQkJCW1lbnUuYWRkKGFkZENoaWxkTWVudSk7Ci0KLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJCWlmIChlZCAhPSBudWxsKSB7Ci0JCQkJLy8gYWRkIGluc2VydCBhdHRyaWJ1dGUgYWN0aW9ucwotCQkJCS8vCi0JCQkJTGlzdCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb2RlbFF1ZXJ5LmdldEluc2VydEFjdGlvbnMoZWxlbWVudCwgZWQsIC0xLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUywgdmMsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLQkJCQlhZGRBY3Rpb25IZWxwZXIoYWRkQXR0cmlidXRlTWVudSwgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotCi0JCQkJLy8gYWRkIGluc2VydCBjaGlsZCBub2RlIGFjdGlvbnMKLQkJCQkvLwotCQkJCW1vZGVsUXVlcnlBY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vZGVsUXVlcnkuZ2V0SW5zZXJ0QWN0aW9ucyhlbGVtZW50LCBlZCwgLTEsIGljLCB2YywgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotCQkJCWFkZEFjdGlvbkhlbHBlcihhZGRDaGlsZE1lbnUsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLQkJCX0KLQotCQkJLy8gYWRkIFBJIGFuZCBDT01NRU5UCi0JCQljb250cmlidXRlUElBbmRDb21tZW50QWN0aW9ucyhhZGRDaGlsZE1lbnUsIGVsZW1lbnQsIGVkLCAtMSk7Ci0KLQkJCS8vIGFkZCBQQ0RBVEEsIENEQVRBX1NFQ1RJT04KLQkJCWNvbnRyaWJ1dGVUZXh0Tm9kZUFjdGlvbnMoYWRkQ2hpbGRNZW51LCBlbGVtZW50LCBlZCwgLTEpOwotCi0JCQkvLyBhZGQgTkVXIEVMRU1FTlQKLQkJCWNvbnRyaWJ1dGVVbmNvbnN0cmFpbmVkQWRkRWxlbWVudEFjdGlvbihhZGRDaGlsZE1lbnUsIGVsZW1lbnQsIGVkLCAtMSk7Ci0KLQkJCS8vIGFkZCBBVFRSSUJVVEUKLQkJCWNvbnRyaWJ1dGVVbmNvbnN0cmFpbmVkQXR0cmlidXRlQWN0aW9ucyhhZGRBdHRyaWJ1dGVNZW51LCBlbGVtZW50LCBlZCk7Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVBZGREb2N1bWVudENoaWxkQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgRG9jdW1lbnQgZG9jdW1lbnQsIGludCBpYywgaW50IHZjKSB7Ci0JCUlNZW51TWFuYWdlciBhZGRDaGlsZE1lbnUgPSBuZXcgTXlNZW51TWFuYWdlcihYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9DSElMRCk7Ci0JCW1lbnUuYWRkKGFkZENoaWxkTWVudSk7Ci0KLQkJLy8gYWRkIFBJIGFuZCBDT01NRU5UCi0JCWNvbnRyaWJ1dGVQSUFuZENvbW1lbnRBY3Rpb25zKGFkZENoaWxkTWVudSwgZG9jdW1lbnQsIC0xKTsKLQotCQkvLyBhZGQgTkVXIEVMRU1FTlQKLQkJY29udHJpYnV0ZVVuY29uc3RyYWluZWRBZGRFbGVtZW50QWN0aW9uKGFkZENoaWxkTWVudSwgZG9jdW1lbnQsIC0xKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVBZGRTaWJsaW5nQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgTm9kZSBub2RlLCBpbnQgaWMsIGludCB2YykgewotCQlJTWVudU1hbmFnZXIgYWRkQmVmb3JlTWVudSA9IG5ldyBNeU1lbnVNYW5hZ2VyKFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX0JFRk9SRSk7Ci0JCUlNZW51TWFuYWdlciBhZGRBZnRlck1lbnUgPSBuZXcgTXlNZW51TWFuYWdlcihYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9BRlRFUik7Ci0JCW1lbnUuYWRkKGFkZEJlZm9yZU1lbnUpOwotCQltZW51LmFkZChhZGRBZnRlck1lbnUpOwotCi0JCU5vZGUgcGFyZW50Tm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBnZXRJbmRleChwYXJlbnROb2RlLCBub2RlKTsKLQkJCWlmIChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlFbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudCkgcGFyZW50Tm9kZTsKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFRCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50RWxlbWVudCk7Ci0JCQkJaWYgKHBhcmVudEVEICE9IG51bGwpIHsKLQkJCQkJLy8gJ0FkZCBCZWZvcmUuLi4nIGFuZCAnQWRkIEFmdGVyLi4uJyBhY3Rpb25zCi0JCQkJCS8vCi0JCQkJCUxpc3QgbW9kZWxRdWVyeUFjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCW1vZGVsUXVlcnkuZ2V0SW5zZXJ0QWN0aW9ucyhwYXJlbnRFbGVtZW50LCBwYXJlbnRFRCwgaW5kZXgsIGljLCB2YywgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotCQkJCQlhZGRBY3Rpb25IZWxwZXIoYWRkQmVmb3JlTWVudSwgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotCi0JCQkJCW1vZGVsUXVlcnlBY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQltb2RlbFF1ZXJ5LmdldEluc2VydEFjdGlvbnMocGFyZW50RWxlbWVudCwgcGFyZW50RUQsIGluZGV4ICsgMSwgaWMsIHZjLCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCk7Ci0JCQkJCWFkZEFjdGlvbkhlbHBlcihhZGRBZnRlck1lbnUsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLQkJCQl9Ci0KLQkJCQkvLyBhZGQgQ09NTUVOVCBhbmQgUEkgYmVmb3JlIGFuZCBhZnRlcgotCQkJCWNvbnRyaWJ1dGVQSUFuZENvbW1lbnRBY3Rpb25zKGFkZEJlZm9yZU1lbnUsIHBhcmVudEVsZW1lbnQsIHBhcmVudEVELCBpbmRleCk7Ci0JCQkJY29udHJpYnV0ZVBJQW5kQ29tbWVudEFjdGlvbnMoYWRkQWZ0ZXJNZW51LCBwYXJlbnRFbGVtZW50LCBwYXJlbnRFRCwgaW5kZXggKyAxKTsKLQotCQkJCS8vIGFkZCBQQ0RBVEEsIENEQVRBX1NFQ1RJT04gYmVmb3JlIGFuZCBhZnRlcgotCQkJCWNvbnRyaWJ1dGVUZXh0Tm9kZUFjdGlvbnMoYWRkQmVmb3JlTWVudSwgcGFyZW50RWxlbWVudCwgcGFyZW50RUQsIGluZGV4KTsKLQkJCQljb250cmlidXRlVGV4dE5vZGVBY3Rpb25zKGFkZEFmdGVyTWVudSwgcGFyZW50RWxlbWVudCwgcGFyZW50RUQsIGluZGV4ICsgMSk7Ci0KLQkJCQkvLyBhZGQgTkVXIEVMRU1FTlQgYmVmb3JlIGFuZCBhZnRlcgotCQkJCWNvbnRyaWJ1dGVVbmNvbnN0cmFpbmVkQWRkRWxlbWVudEFjdGlvbihhZGRCZWZvcmVNZW51LCBwYXJlbnRFbGVtZW50LCBwYXJlbnRFRCwgaW5kZXgpOwotCQkJCWNvbnRyaWJ1dGVVbmNvbnN0cmFpbmVkQWRkRWxlbWVudEFjdGlvbihhZGRBZnRlck1lbnUsIHBhcmVudEVsZW1lbnQsIHBhcmVudEVELCBpbmRleCArIDEpOwotCQkJfQotCQkJZWxzZSBpZiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCURvY3VtZW50IGRvY3VtZW50ID0gKERvY3VtZW50KSBwYXJlbnROb2RlOwotCQkJCUNNRG9jdW1lbnQgY21Eb2N1bWVudCA9IG1vZGVsUXVlcnkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQocGFyZW50Tm9kZSk7Ci0JCQkJaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQkvLyBhZGQgcG9zc2libGUgcm9vdCBlbGVtZW50IGluc2VydGlvbnMKLQkJCQkJLy8gICAgICAgIAotCQkJCQlMaXN0IG1vZGVsUXVlcnlBY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQltb2RlbFF1ZXJ5LmdldEluc2VydEFjdGlvbnMoZG9jdW1lbnQsIGNtRG9jdW1lbnQsIGluZGV4LCBpYywgdmMsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLQkJCQkJYWRkQWN0aW9uSGVscGVyKGFkZEFmdGVyTWVudSwgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotCi0JCQkJCW1vZGVsUXVlcnlBY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQltb2RlbFF1ZXJ5LmdldEluc2VydEFjdGlvbnMoZG9jdW1lbnQsIGNtRG9jdW1lbnQsIGluZGV4ICsgMSwgaWMsIHZjLCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCk7Ci0JCQkJCWFkZEFjdGlvbkhlbHBlcihhZGRBZnRlck1lbnUsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLQkJCQl9Ci0KLQkJCQkvLyBhZGQgQ09NTUVOVCBhbmQgUEkgYmVmb3JlIGFuZCBhZnRlcgotCQkJCWNvbnRyaWJ1dGVQSUFuZENvbW1lbnRBY3Rpb25zKGFkZEJlZm9yZU1lbnUsIGRvY3VtZW50LCBpbmRleCk7Ci0JCQkJY29udHJpYnV0ZVBJQW5kQ29tbWVudEFjdGlvbnMoYWRkQWZ0ZXJNZW51LCBkb2N1bWVudCwgaW5kZXggKyAxKTsKLQotCQkJCS8vIGFkZCBFTEVNRU5UIGJlZm9yZSBhbmQgYWZ0ZXIKLQkJCQljb250cmlidXRlVW5jb25zdHJhaW5lZEFkZEVsZW1lbnRBY3Rpb24oYWRkQmVmb3JlTWVudSwgZG9jdW1lbnQsIGluZGV4KTsKLQkJCQljb250cmlidXRlVW5jb25zdHJhaW5lZEFkZEVsZW1lbnRBY3Rpb24oYWRkQWZ0ZXJNZW51LCBkb2N1bWVudCwgaW5kZXggKyAxKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVEZWxldGVBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBMaXN0IGxpc3QsIGludCBpYywgaW50IHZjKSB7Ci0JCWJvb2xlYW4gY2FuUmVtb3ZlID0gbW9kZWxRdWVyeS5jYW5SZW1vdmUobGlzdCwgdmMpOwotCi0KLQkJLy8gYSBkZWxldGUgYWN0aW9uIHdpdGggYW4gZW1wdHkgbGlzdCB3aWxsIHByb2R1Y2UgYSBkaXNhYmxlZCBtZW51Ci0JCS8vIGl0ZW0KLQkJLy8KLQkJTGlzdCByZXN1bHRMaXN0ID0gY2FuUmVtb3ZlID8gbGlzdCA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlRGVsZXRlQWN0aW9uKHJlc3VsdExpc3QpKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVFZGl0QWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgTm9kZSBub2RlKSB7Ci0JCWNvbnRyaWJ1dGVFZGl0R3JhbW1hckluZm9ybWF0aW9uQWN0aW9ucyhtZW51LCBub2RlKTsKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSB7Ci0JCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24oKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgbm9kZSkpOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUVkaXRBdHRyaWJ1dGVBY3Rpb24oKEF0dHIpIG5vZGUsIG51bGwpKTsKLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZUVkaXRHcmFtbWFySW5mb3JtYXRpb25BY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBOb2RlIG5vZGUpIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFID8gKERvY3VtZW50KSBub2RlIDogbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0KLQkJRG9jdW1lbnRUeXBlIGRvY3R5cGUgPSBnZXREb2N0eXBlKG5vZGUpOwotCQlpZiAoZG9jdHlwZSA9PSBudWxsKSB7Ci0JCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUFkZERvY3R5cGVBY3Rpb24oZG9jdW1lbnQsIC0xKSk7Ci0JCX0KLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUVkaXREb2N0eXBlQWN0aW9uKChEb2N1bWVudFR5cGUpIG5vZGUpKTsKLQkJfQotCi0JCWlmICgoZG9jdHlwZSA9PSBudWxsKSAmJiAoZ2V0Um9vdEVsZW1lbnQoZG9jdW1lbnQpICE9IG51bGwpKSB7Ci0JCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUVkaXRTY2hlbWFJbmZvQWN0aW9uKGdldFJvb3RFbGVtZW50KGRvY3VtZW50KSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVBJQW5kQ29tbWVudEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIERvY3VtZW50IGRvY3VtZW50LCBpbnQgaW5kZXgpIHsKLQkJLy8gdGVzdCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgaW5kZXggaXNuJ3QgYmVmb3JlIHRoZSBYTUwgZGVjbGFyYXRpb24KLQkJLy8gCi0JCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlQWRkQ29tbWVudEFjdGlvbihkb2N1bWVudCwgaW5kZXgpKTsKLQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVBZGRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24oZG9jdW1lbnQsIGluZGV4KSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlUElBbmRDb21tZW50QWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgRWxlbWVudCBwYXJlbnRFbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFZCwgaW50IGluZGV4KSB7Ci0JCWlmICgocGFyZW50RWQgPT0gbnVsbCkgfHwgaXNDb21tZW50QWxsb3dlZChwYXJlbnRFZCkpIHsKLQkJCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlQWRkQ29tbWVudEFjdGlvbihwYXJlbnRFbGVtZW50LCBpbmRleCkpOwotCQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVBZGRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24ocGFyZW50RWxlbWVudCwgaW5kZXgpKTsKLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVJlcGxhY2VBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBMaXN0IHNlbGVjdGVkTm9kZUxpc3QsIGludCBpYywgaW50IHZjKSB7Ci0JCS8vICdSZXBsYWNlIFdpdGguLi4nIGFjdGlvbnMKLQkJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCUlNZW51TWFuYWdlciByZXBsYWNlV2l0aE1lbnUgPSBuZXcgTXlNZW51TWFuYWdlcihYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX1JFUExBQ0VfV0lUSCk7Ci0JCW1lbnUuYWRkKHJlcGxhY2VXaXRoTWVudSk7Ci0KLQkJaWYgKChtb2RlbFF1ZXJ5LmdldEVkaXRNb2RlKCkgPT0gTW9kZWxRdWVyeS5FRElUX01PREVfQ09OU1RSQUlORURfU1RSSUNUKSAmJiAoc2VsZWN0ZWROb2RlTGlzdC5zaXplKCkgPiAwKSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIHNlbGVjdGVkTm9kZUxpc3QuZ2V0KDApOwotCQkJTm9kZSBwYXJlbnROb2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAoKHBhcmVudE5vZGUgIT0gbnVsbCkgJiYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkpIHsKLQkJCQlFbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudCkgcGFyZW50Tm9kZTsKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFRCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50RWxlbWVudCk7Ci0JCQkJaWYgKHBhcmVudEVEICE9IG51bGwpIHsKLQkJCQkJTGlzdCByZXBsYWNlQWN0aW9uTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJCQkJbW9kZWxRdWVyeS5nZXRSZXBsYWNlQWN0aW9ucyhwYXJlbnRFbGVtZW50LCBwYXJlbnRFRCwgc2VsZWN0ZWROb2RlTGlzdCwgaWMsIHZjLCByZXBsYWNlQWN0aW9uTGlzdCk7Ci0JCQkJCWFkZEFjdGlvbkhlbHBlcihyZXBsYWNlV2l0aE1lbnUsIHJlcGxhY2VBY3Rpb25MaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlVGV4dE5vZGVBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBFbGVtZW50IHBhcmVudEVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkLCBpbnQgaW5kZXgpIHsKLQkJaWYgKChwYXJlbnRFZCA9PSBudWxsKSB8fCBpc1RleHRBbGxvd2VkKHBhcmVudEVkKSkgewotCQkJQ01EYXRhVHlwZSBkYXRhVHlwZSA9IHBhcmVudEVkICE9IG51bGwgPyBwYXJlbnRFZC5nZXREYXRhVHlwZSgpIDogbnVsbDsKLQkJCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlQWRkUENEYXRhQWN0aW9uKHBhcmVudEVsZW1lbnQsIGRhdGFUeXBlLCBpbmRleCkpOwotCQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVBZGRDRGF0YVNlY3Rpb25BY3Rpb24ocGFyZW50RWxlbWVudCwgaW5kZXgpKTsKLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVVuY29uc3RyYWluZWRBZGRFbGVtZW50QWN0aW9uKElNZW51TWFuYWdlciBtZW51LCBEb2N1bWVudCBkb2N1bWVudCwgaW50IGluZGV4KSB7Ci0JCWlmIChpc1VuY29uc3RyYWluZWRBY3Rpb25BbGxvd2VkKCkpIHsKLQkJCWlmIChnZXRSb290RWxlbWVudChkb2N1bWVudCkgPT0gbnVsbCkgewotCQkJCWludCB4bWxEZWNsYXJhdGlvbkluZGV4ID0gLTE7Ci0JCQkJaW50IGRvY3R5cGVJbmRleCA9IC0xOwotCQkJCU5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQkJCWludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3RMZW5ndGg7IGkrKykgewotCQkJCQlOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotCQkJCQlpbnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCQkJCWlmIChub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJCQkJZG9jdHlwZUluZGV4ID0gaTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKG5vZGVUeXBlID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSB7Ci0JCQkJCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkgPSAoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBub2RlOwotCQkJCQkJaWYgKHBpLmdldFRhcmdldCgpLmVxdWFsc0lnbm9yZUNhc2UoInhtbCIpICYmICh4bWxEZWNsYXJhdGlvbkluZGV4ID09IC0xKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJeG1sRGVjbGFyYXRpb25JbmRleCA9IGk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoKCh4bWxEZWNsYXJhdGlvbkluZGV4ID09IC0xKSB8fCAoaW5kZXggPiB4bWxEZWNsYXJhdGlvbkluZGV4KSkgJiYgKChkb2N0eXBlSW5kZXggPT0gLTEpIHx8IChpbmRleCA+IGRvY3R5cGVJbmRleCkpKSB7Ci0JCQkJCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlQWRkRWxlbWVudEFjdGlvbihkb2N1bWVudCwgbnVsbCwgaW5kZXgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVVbmNvbnN0cmFpbmVkQWRkRWxlbWVudEFjdGlvbihJTWVudU1hbmFnZXIgbWVudSwgRWxlbWVudCBwYXJlbnRFbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFZCwgaW50IGluZGV4KSB7Ci0JCWlmIChpc1VuY29uc3RyYWluZWRBY3Rpb25BbGxvd2VkKCkpIHsKLQkJCWlmICgocGFyZW50RWQgPT0gbnVsbCkgfHwgKHBhcmVudEVkLmdldFByb3BlcnR5KCJpc0luZmVycmVkIikgPT0gQm9vbGVhbi5UUlVFKSB8fCAoKG1vZGVsUXVlcnkuZ2V0RWRpdE1vZGUoKSAhPSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpICYmIGlzRWxlbWVudEFsbG93ZWQocGFyZW50RWQpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVBZGRFbGVtZW50QWN0aW9uKHBhcmVudEVsZW1lbnQsIG51bGwsIGluZGV4KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVVbmNvbnN0cmFpbmVkQXR0cmlidXRlQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgRWxlbWVudCBwYXJlbnRFbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFZCkgewotCQlpZiAoaXNVbmNvbnN0cmFpbmVkQWN0aW9uQWxsb3dlZCgpKSB7Ci0JCQlpZiAoKHBhcmVudEVkID09IG51bGwpIHx8IChwYXJlbnRFZC5nZXRQcm9wZXJ0eSgiaXNJbmZlcnJlZCIpID09IEJvb2xlYW4uVFJVRSkgfHwgKG1vZGVsUXVlcnkuZ2V0RWRpdE1vZGUoKSAhPSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUFkZEF0dHJpYnV0ZUFjdGlvbihwYXJlbnRFbGVtZW50LCBudWxsKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZEF0dHJpYnV0ZUFjdGlvbihFbGVtZW50IHBhcmVudCwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZENEYXRhU2VjdGlvbkFjdGlvbihOb2RlIHBhcmVudCwgaW50IGluZGV4KTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkQ29tbWVudEFjdGlvbihOb2RlIHBhcmVudCwgaW50IGluZGV4KTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkRG9jdHlwZUFjdGlvbihEb2N1bWVudCBwYXJlbnQsIGludCBpbmRleCk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZEVsZW1lbnRBY3Rpb24oTm9kZSBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5kZXgpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRQQ0RhdGFBY3Rpb24oTm9kZSBwYXJlbnQsIENNRGF0YVR5cGUgZGF0YVR5cGUsIGludCBpbmRleCk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbihOb2RlIHBhcmVudCwgaW50IGluZGV4KTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkU2NoZW1hSW5mb0FjdGlvbihFbGVtZW50IGVsZW1lbnQpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVEZWxldGVBY3Rpb24oTGlzdCBzZWxlY3Rpb24pOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVFZGl0QXR0cmlidXRlQWN0aW9uKEF0dHIgYXR0cmlidXRlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlRWRpdERvY3R5cGVBY3Rpb24oRG9jdW1lbnRUeXBlIGRvY3R5cGUpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uKFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUVkaXRTY2hlbWFJbmZvQWN0aW9uKEVsZW1lbnQgZWxlbWVudCk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZVJlbmFtZUFjdGlvbihOb2RlIG5vZGUpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVSZXBsYWNlQWN0aW9uKE5vZGUgcGFyZW50LCBDTU5vZGUgY21ub2RlLCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KTsKLQotCi0JcHVibGljIGludCBnZXRJbmRleChOb2RlIHBhcmVudE5vZGUsIE5vZGUgY2hpbGQpIHsKLQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZXMoKTsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCWludCBzaXplID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAobm9kZUxpc3QuaXRlbShpKSA9PSBjaGlsZCkgewotCQkJCWluZGV4ID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0KLQlwdWJsaWMgTm9kZSBnZXRSZWZDaGlsZE5vZGVBdEluZGV4KE5vZGUgcGFyZW50LCBpbnQgaW5kZXgpIHsKLQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlOb2RlIHJlZkNoaWxkID0gKChpbmRleCA+PSAwKSAmJiAoaW5kZXggPCBub2RlTGlzdC5nZXRMZW5ndGgoKSkpID8gbm9kZUxpc3QuaXRlbShpbmRleCkgOiBudWxsOwotCQlyZXR1cm4gcmVmQ2hpbGQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgRWxlbWVudCBnZXRSb290RWxlbWVudChEb2N1bWVudCBkb2N1bWVudCkgewotCQlFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0JCU5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgbm9kZUxpc3RMZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdExlbmd0aDsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCXJlc3VsdCA9IChFbGVtZW50KSBub2RlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZWxlY3RlZE5vZGVzKExpc3QgbGlzdCwgYm9vbGVhbiBpbmNsdWRlVGV4dE5vZGVzKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpLm5leHQoKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCWlmIChpbmNsdWRlVGV4dE5vZGVzKSB7Ci0JCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdC5hZGQobm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbW1lbnRBbGxvd2VkKENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkKSB7Ci0JCWludCBjb250ZW50VHlwZSA9IHBhcmVudEVkLmdldENvbnRlbnRUeXBlKCk7Ci0JCXJldHVybiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCkgfHwgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEKSB8fCAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBKSB8fCAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRWxlbWVudEFsbG93ZWQoQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50RWQpIHsKLQkJaW50IGNvbnRlbnRUeXBlID0gcGFyZW50RWQuZ2V0Q29udGVudFR5cGUoKTsKLQkJcmV0dXJuIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UKSB8fCAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQpIHx8IChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlkpOwotCX0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNUZXh0QWxsb3dlZChDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFZCkgewotCQlpbnQgY29udGVudFR5cGUgPSBwYXJlbnRFZC5nZXRDb250ZW50VHlwZSgpOwotCQlyZXR1cm4gKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEKSB8fCAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBKSB8fCAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzVW5jb25zdHJhaW5lZEFjdGlvbkFsbG93ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXaGl0ZXNwYWNlVGV4dE5vZGUoTm9kZSBub2RlKSB7Ci0JCXJldHVybiAobm9kZSAhPSBudWxsKSAmJiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAobm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQ2xlYW51cEFjdGlvblhNTERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9DbGVhbnVwQWN0aW9uWE1MRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxYTgxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9DbGVhbnVwQWN0aW9uWE1MRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNsZWFudXAuQ2xlYW51cFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLS8qKgotICogQ2xlYW51cCBhY3Rpb24gZGVsZWdhdGUgZm9yIENTUyBlZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIENsZWFudXBBY3Rpb25YTUxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZSwgSUFjdGlvbkRlbGVnYXRlMiwgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yOwotCXByaXZhdGUgSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGZDbGVhbnVwUHJvY2Vzc29yOwotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJZkVkaXRvciA9IHRhcmdldEVkaXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBudWxsaW5nIG91dCBqdXN0IGluIGNhc2UKLQkJZkVkaXRvciA9IG51bGw7Ci0JCWZDbGVhbnVwUHJvY2Vzc29yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5DbGVhbnVwRG9jdW1lbnRfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KFhNTFVJTWVzc2FnZXMuQ2xlYW51cERvY3VtZW50X3Rvb2x0aXApOwotCQkJYWN0aW9uLnNldERlc2NyaXB0aW9uKFhNTFVJTWVzc2FnZXMuQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsKLQkJcnVuKGFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChmRWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCWZpbmFsIElUZXh0RWRpdG9yIGVkaXRvciA9IChJVGV4dEVkaXRvcikgZkVkaXRvcjsKLQkJCURpYWxvZyBjbGVhbnVwRGlhbG9nID0gbmV3IENsZWFudXBEaWFsb2dYTUwoZWRpdG9yLmdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCWlmIChjbGVhbnVwRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQkvLyBzZXR1cCBydW5uYWJsZQotCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgY2xlYW51cFByb2Nlc3NvciA9IGdldENsZWFudXBQcm9jZXNzb3IoKTsKLQkJCQkJCWlmIChjbGVhbnVwUHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkpOwotCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJCQkJY2xlYW51cFByb2Nlc3Nvci5jbGVhbnVwTW9kZWwobW9kZWwpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCi0JCQkJLy8gVE9ETzogbWFrZSBpbmRlcGVuZGVudCBvZiAnbW9kZWwnLgotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChlZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKSk7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBiZWdpbiByZWNvcmRpbmcKLQkJCQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgZWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBTU0VVSU1lc3NhZ2VzLkNsZWFudXBfRG9jdW1lbnRfVUlfLCBTU0VVSU1lc3NhZ2VzLkNsZWFudXBfRG9jdW1lbnRfVUlfLCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0KLQkJCQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcKLQkJCQkJCS8vIG1vZGVsIGNoYW5nZQotCQkJCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQkJCS8vIHJ1bgotCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZkVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIHJ1bm5hYmxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnCi0JCQkJCQkvLyBtb2RlbAotCQkJCQkJLy8gY2hhbmdlCi0JCQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQotCQkJCQkJLy8gZW5kIHJlY29yZGluZwotCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCW1vZGVsLmVuZFJlY29yZGluZyh0aGlzLCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZ2V0Q2xlYW51cFByb2Nlc3NvcigpIHsKLQkJaWYgKGZDbGVhbnVwUHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZDbGVhbnVwUHJvY2Vzc29yID0gbmV3IENsZWFudXBQcm9jZXNzb3JYTUwoKTsKLQkJfQotCi0JCXJldHVybiBmQ2xlYW51cFByb2Nlc3NvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9DbGVhbnVwRGlhbG9nWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9DbGVhbnVwRGlhbG9nWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YjcxOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQ2xlYW51cERpYWxvZ1hNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotCi1wdWJsaWMgY2xhc3MgQ2xlYW51cERpYWxvZ1hNTCBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDaGVja0JveENvbXByZXNzRW1wdHlFbGVtZW50VGFnczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDaGVja0JveENvbnZlcnRFT0xDb2RlczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDaGVja0JveEZvcm1hdFNvdXJjZTsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDaGVja0JveEluc2VydE1pc3NpbmdUYWdzOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRyczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDaGVja0JveFF1b3RlQXR0clZhbHVlczsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBmTW9kZWwgPSBudWxsOwotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBmUHJlZmVyZW5jZXMgPSBudWxsOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlQXNpczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlVXBwZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXg7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93czsKLQotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VBc2lzOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VMb3dlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlVXBwZXI7Ci0KLQlwdWJsaWMgQ2xlYW51cERpYWxvZ1hNTChTaGVsbCBzaGVsbCkgewotCi0JCXN1cGVyKHNoZWxsKTsKLQl9Ci0KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlnZXRTaGVsbCgpLnNldFRleHQoWE1MVUlNZXNzYWdlcy5DbGVhbnVwX1VJXyk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljcmVhdGVEaWFsb2dBcmVhSW5Db21wb3NpdGUoY29tcG9zaXRlKTsKLQkJaW5pdGlhbGl6ZU9wdGlvbnMoKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEaWFsb2dBcmVhSW5Db21wb3NpdGUoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuQ0xFQU5VUF9YTUxfSEVMUElEKTsgLy8gdXNlCi0JCS8vIFhNTAotCQkvLyBzcGVjaWZpYwotCQkvLyBoZWxwCi0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gQ29tcHJlc3MgZW1wdHkgZWxlbWVudCB0YWdzCi0JCWZDaGVja0JveENvbXByZXNzRW1wdHlFbGVtZW50VGFncyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmQ2hlY2tCb3hDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3Muc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkNvbXByZXNzX2VtcHR5X2VsZW1lbnRfdGFnc19VSV8pOwotCQlmQ2hlY2tCb3hDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gSW5zZXJ0IG1pc3NpbmcgcmVxdWlyZWQgYXR0cnMKLQkJZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzLnNldFRleHQoWE1MVUlNZXNzYWdlcy5JbnNlcnRfcmVxdWlyZWRfYXR0cmlidXRlc19VSV8pOwotCQlmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIEluc2VydCBtaXNzaW5nIGJlZ2luL2VuZCB0YWdzCi0JCWZDaGVja0JveEluc2VydE1pc3NpbmdUYWdzID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZDaGVja0JveEluc2VydE1pc3NpbmdUYWdzLnNldFRleHQoWE1MVUlNZXNzYWdlcy5JbnNlcnRfbWlzc2luZ190YWdzX1VJXyk7Ci0JCWZDaGVja0JveEluc2VydE1pc3NpbmdUYWdzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIFF1b3RlIGF0dHJpYnV0ZSB2YWx1ZXMKLQkJZkNoZWNrQm94UXVvdGVBdHRyVmFsdWVzID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZDaGVja0JveFF1b3RlQXR0clZhbHVlcy5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuUXVvdGVfYXR0cmlidXRlX3ZhbHVlc19VSV8pOwotCQlmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gRm9ybWF0IHNvdXJjZQotCQlmQ2hlY2tCb3hGb3JtYXRTb3VyY2UgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZkNoZWNrQm94Rm9ybWF0U291cmNlLnNldFRleHQoWE1MVUlNZXNzYWdlcy5Gb3JtYXRfc291cmNlX1VJXyk7Ci0JCWZDaGVja0JveEZvcm1hdFNvdXJjZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQkvLyBDb252ZXJ0IEVPTCBjb2RlCi0JCWZDaGVja0JveENvbnZlcnRFT0xDb2RlcyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkNvbnZlcnRfRU9MX2NvZGVzX1VJXyk7Ci0JCWZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJQ29tcG9zaXRlIEVPTENvZGVzID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBoTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJaExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJRU9MQ29kZXMuc2V0TGF5b3V0KGhMYXlvdXQpOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cyA9IG5ldyBCdXR0b24oRU9MQ29kZXMsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLnNldFRleHQoWE1MVUlNZXNzYWdlcy5FT0xfV2luZG93c19VSSk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peCA9IG5ldyBCdXR0b24oRU9MQ29kZXMsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LnNldFRleHQoWE1MVUlNZXNzYWdlcy5FT0xfVW5peF9VSSk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjID0gbmV3IEJ1dHRvbihFT0xDb2RlcywgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuRU9MX01hY19VSSk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlRU9MQ29kZVJhZGlvcyhib29sZWFuIGVuYWJsZSkgewotCi0JCWlmICgoZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3MgIT0gbnVsbCkgJiYgKGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4ICE9IG51bGwpICYmIChmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjICE9IG51bGwpKSB7Ci0JCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peC5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCWlmICghZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3MuZ2V0U2VsZWN0aW9uKCkgJiYgIWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LmdldFNlbGVjdGlvbigpICYmICFmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3Muc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPcHRpb25zKCkgewotCi0JCWZDaGVja0JveENvbXByZXNzRW1wdHlFbGVtZW50VGFncy5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MpKTsKLQkJZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycy5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMpKTsKLQkJZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3Muc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX01JU1NJTkdfVEFHUykpOwotCQlmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMpKTsKLQkJZkNoZWNrQm94Rm9ybWF0U291cmNlLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UpKTsKLQkJZkNoZWNrQm94Q29udmVydEVPTENvZGVzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTlZFUlRfRU9MX0NPREVTKSk7Ci0JCVN0cmluZyBFT0xDb2RlID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUpOwotCQlpZiAoRU9MQ29kZS5jb21wYXJlVG8oQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuTEYpID09IDApIHsKLQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQllbHNlIGlmIChFT0xDb2RlLmNvbXBhcmVUbyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUikgPT0gMCkgewotCQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJZW5hYmxlRU9MQ29kZVJhZGlvcyhmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQotCQlzdG9yZU9wdGlvbnMoKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCi0JCWZNb2RlbCA9IG1vZGVsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlT3B0aW9ucygpIHsKLQotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MsIGZDaGVja0JveENvbXByZXNzRW1wdHlFbGVtZW50VGFncy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9SRVFVSVJFRF9BVFRSUywgZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9NSVNTSU5HX1RBR1MsIGZDaGVja0JveEluc2VydE1pc3NpbmdUYWdzLmdldFNlbGVjdGlvbigpKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMsIGZDaGVja0JveFF1b3RlQXR0clZhbHVlcy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UsIGZDaGVja0JveEZvcm1hdFNvdXJjZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTlZFUlRfRU9MX0NPREVTLCBmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuZ2V0U2VsZWN0aW9uKCkpOwotCQlpZiAoZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkxGKTsKLQkJfQotCQllbHNlIGlmIChmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUkxGKTsKLQkJfQotCQkvLyBleHBsaWNpdGx5IHNhdmUgcGx1Z2luIHByZWZlcmVuY2VzIHNvIHZhbHVlcyBhcmUgc3RvcmVkCi0JCVhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0KLQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCi0JCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZCgoKGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXIgIT0gbnVsbCkgJiYgKGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkgfHwgZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkpIHx8ICgoZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlTG93ZXIgIT0gbnVsbCkgJiYgKGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyLmdldFNlbGVjdGlvbigpIHx8IGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZVVwcGVyLmdldFNlbGVjdGlvbigpKSkgfHwgZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3MuZ2V0U2VsZWN0aW9uKCkgfHwgZkNoZWNrQm94UXVvdGVBdHRyVmFsdWVzLmdldFNlbGVjdGlvbigpIHx8IGZDaGVja0JveEZvcm1hdFNvdXJjZS5nZXRTZWxlY3Rpb24oKSB8fCBmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuZ2V0U2VsZWN0aW9uKCkgfHwgKChmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peCAhPSBudWxsKSAmJiAoZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguZ2V0U2VsZWN0aW9uKCkgfHwgZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5nZXRTZWxlY3Rpb24oKSB8fCBmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5nZXRTZWxlY3Rpb24oKSkpKTsKLQkJaWYgKGUud2lkZ2V0ID09IGZDaGVja0JveENvbnZlcnRFT0xDb2RlcykgewotCQkJZW5hYmxlRU9MQ29kZVJhZGlvcyhmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdEF0dHJpYnV0ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdEF0dHJpYnV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGE4YWE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0VkaXRBdHRyaWJ1dGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9ncy5FZGl0QXR0cmlidXRlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0QXR0cmlidXRlQWN0aW9uIGV4dGVuZHMgTm9kZUFjdGlvbiB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yOwotCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVFJJQlVURSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXR0ciBhdHRyOwotCXByb3RlY3RlZCBBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXI7Ci0JcHJvdGVjdGVkIEVsZW1lbnQgb3duZXJFbGVtZW50OwotCXByb3RlY3RlZCBTdHJpbmcgdGl0bGU7Ci0KLQlwdWJsaWMgRWRpdEF0dHJpYnV0ZUFjdGlvbihBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXIsIEVsZW1lbnQgb3duZXJFbGVtZW50LCBBdHRyIGF0dHIsIFN0cmluZyBhY3Rpb25MYWJlbCwgU3RyaW5nIHRpdGxlKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCXRoaXMub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50OwotCQl0aGlzLmF0dHIgPSBhdHRyOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXNldFRleHQoYWN0aW9uTGFiZWwpOwotCQkvLyBhc3N1bWUgaWYgYXR0ciBpcyBudWxsIHRoZW4gdGhpcyBpcyBhbiAnQWRkJyB0aGF0IHJlcXVpcmVzIGFjdGlvbgotCQkvLyBhbiBpY29ucy4uLiBvdGhlcndpc2UgdGhpcyBpcyBhbiBlZGl0Ci0JCWlmIChhdHRyID09IG51bGwpIHsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihjcmVhdGVJbWFnZURlc2NyaXB0b3IoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJbWFuYWdlci5iZWdpbk5vZGVBY3Rpb24odGhpcyk7Ci0JCVNoZWxsIHNoZWxsID0gWE1MVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQlFZGl0QXR0cmlidXRlRGlhbG9nIGRpYWxvZyA9IG5ldyBFZGl0QXR0cmlidXRlRGlhbG9nKHNoZWxsLCBvd25lckVsZW1lbnQsIGF0dHIpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQodGl0bGUpOwotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0KLQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJb3duZXJFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQl9Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IG93bmVyRWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlBdHRyIG5ld0F0dHJpYnV0ZSA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShkaWFsb2cuZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJCW5ld0F0dHJpYnV0ZS5zZXRWYWx1ZShkaWFsb2cuZ2V0QXR0cmlidXRlVmFsdWUoKSk7Ci0JCQlvd25lckVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShuZXdBdHRyaWJ1dGUpOwotCQkJbWFuYWdlci5zZXRWaWV3ZXJTZWxlY3Rpb24obmV3QXR0cmlidXRlKTsKLQkJfQotCQltYW5hZ2VyLmVuZE5vZGVBY3Rpb24odGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdERvY3R5cGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0VkaXREb2N0eXBlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMzAwNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdERvY3R5cGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9ncy5FZGl0RG9jdHlwZURpYWxvZzsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEVkaXREb2N0eXBlQWN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0RG9jdHlwZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JcHJvdGVjdGVkIERvY3VtZW50VHlwZSBkb2N0eXBlOwotCXByb3RlY3RlZCBEb2N1bWVudCBkb2N1bWVudDsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlTG9jYXRpb247Ci0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgZG9jdHlwZS4KLQkgKi8KLQlwdWJsaWMgRWRpdERvY3R5cGVBY3Rpb24oSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uLCBTdHJpbmcgdGl0bGUpIHsKLQkJc2V0VGV4dCh0aXRsZSk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIHRvIGVkaXQgYW4gZXhpc2l0bmcgZG9jdHlwZS4KLQkgKi8KLQlwdWJsaWMgRWRpdERvY3R5cGVBY3Rpb24oSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgRG9jdW1lbnRUeXBlIGRvY3R5cGUsIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uLCBTdHJpbmcgdGl0bGUpIHsKLQkJc2V0VGV4dCh0aXRsZSk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5kb2N0eXBlID0gZG9jdHlwZTsKLQkJdGhpcy5yZXNvdXJjZUxvY2F0aW9uID0gcmVzb3VyY2VMb2NhdGlvbjsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCX0KLQotCi0JcHJvdGVjdGVkIERvY3VtZW50VHlwZSBjcmVhdGVEb2N0eXBlKEVkaXREb2N0eXBlRGlhbG9nIGRpYWxvZywgRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJRG9jdW1lbnRUeXBlIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIERvY3VtZW50SW1wbCkgewotCQkJSURPTURvY3VtZW50IGRvY3VtZW50SW1wbCA9IChJRE9NRG9jdW1lbnQpIGRvY3VtZW50OwotCQkJSURPTURvY3VtZW50VHlwZSBkb2N0eXBlSW1wbCA9IChJRE9NRG9jdW1lbnRUeXBlKSBkb2N1bWVudEltcGwuY3JlYXRlRG9jdHlwZShkaWFsb2cuZ2V0TmFtZSgpKTsKLQkJCWRvY3R5cGVJbXBsLnNldFB1YmxpY0lkKGRpYWxvZy5nZXRQdWJsaWNJZCgpKTsKLQkJCWRvY3R5cGVJbXBsLnNldFN5c3RlbUlkKGRpYWxvZy5nZXRTeXN0ZW1JZCgpKTsKLQkJCXJlc3VsdCA9IGRvY3R5cGVJbXBsOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0KLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSb290RWxlbWVudE5hbWUoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJRWxlbWVudCByb290RWxlbWVudCA9IG51bGw7Ci0JCU5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgbm9kZUxpc3RMZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdExlbmd0aDsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkTm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlyb290RWxlbWVudCA9IChFbGVtZW50KSBjaGlsZE5vZGU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJvb3RFbGVtZW50ICE9IG51bGwgPyByb290RWxlbWVudC5nZXROb2RlTmFtZSgpIDogWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfUk9PVF9FTEVNRU5UX1ZBTFVFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnREb2N0eXBlKERvY3VtZW50VHlwZSBkb2N0eXBlLCBEb2N1bWVudCBkb2N1bWVudCkgewotCQlOb2RlIHJlZkNoaWxkID0gbnVsbDsKLQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0TGVuZ3RoOyBpKyspIHsKLQkJCU5vZGUgY2hpbGROb2RlID0gbm9kZUxpc3QuaXRlbShpKTsKLQkJCWlmICgoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpIHx8IChjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSkpIHsKLQkJCQkvLyBjb250aW51ZSBvbiB0byB0aGUgbmV4dE5vZGUKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlZkNoaWxkID0gY2hpbGROb2RlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJZG9jdW1lbnQuaW5zZXJ0QmVmb3JlKGRvY3R5cGUsIHJlZkNoaWxkKTsKLQkJLy8gbWFuYWdlci5yZWZvcm1hdChkb2N0eXBlLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBnZXRVbmRvRGVzY3JpcHRpb24oKSk7Ci0JCS8vIFNoZWxsIHNoZWxsID0KLQkJLy8gWE1MQ29tbW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQlTaGVsbCBzaGVsbCA9IGdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQlFZGl0RG9jdHlwZURpYWxvZyBkaWFsb2cgPSBzaG93RWRpdERvY3R5cGVEaWFsb2coc2hlbGwpOwotCi0JCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJaWYgKGRvY3R5cGUgIT0gbnVsbCkgewotCQkJCXVwZGF0ZURvY3R5cGUoZGlhbG9nLCBkb2N0eXBlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlEb2N1bWVudFR5cGUgZG9jdHlwZSA9IGNyZWF0ZURvY3R5cGUoZGlhbG9nLCBkb2N1bWVudCk7Ci0JCQkJaWYgKGRvY3R5cGUgIT0gbnVsbCkgewotCQkJCQlpbnNlcnREb2N0eXBlKGRvY3R5cGUsIGRvY3VtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBFZGl0RG9jdHlwZURpYWxvZyBzaG93RWRpdERvY3R5cGVEaWFsb2coU2hlbGwgc2hlbGwpIHsKLQkJRWRpdERvY3R5cGVEaWFsb2cgZGlhbG9nID0gbnVsbDsKLQotCQlpZiAoZG9jdHlwZSAhPSBudWxsKSB7Ci0JCQlkaWFsb2cgPSBuZXcgRWRpdERvY3R5cGVEaWFsb2coc2hlbGwsIGRvY3R5cGUpOwotCQkJaWYgKHRpdGxlID09IG51bGwpIHsKLQkJCQl0aXRsZSA9IFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0VESVRfRE9DVFlQRTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcm9vdEVsZW1lbnROYW1lID0gZ2V0Um9vdEVsZW1lbnROYW1lKGRvY3VtZW50KTsKLQkJCWRpYWxvZyA9IG5ldyBFZGl0RG9jdHlwZURpYWxvZyhzaGVsbCwgcm9vdEVsZW1lbnROYW1lLCAiIiwgcm9vdEVsZW1lbnROYW1lICsgIi5kdGQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpZiAodGl0bGUgPT0gbnVsbCkgewotCQkJCXRpdGxlID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9BRERfRFREX0lORk9STUFUSU9OX1RJVExFOwotCQkJfQotCQl9Ci0KLQkJZGlhbG9nLnNldENvbXB1dGVTeXN0ZW1JZCgoZG9jdHlwZSA9PSBudWxsKSB8fCAoZG9jdHlwZS5nZXRTeXN0ZW1JZCgpID09IG51bGwpIHx8IChkb2N0eXBlLmdldFN5c3RlbUlkKCkudHJpbSgpLmxlbmd0aCgpID09IDApKTsKLQotCQlkaWFsb2cuc2V0RXJyb3JDaGVja2luZyhmYWxzZSk7Ly8gIW1vZGVsLmdldFR5cGUoKS5lcXVhbHMoSVN0cnVjdHVyZWRNb2RlbC5IVE1MKSk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLnNldFJlc291cmNlTG9jYXRpb24obmV3IFBhdGgocmVzb3VyY2VMb2NhdGlvbikpOwotCQlkaWFsb2cub3BlbigpOwotCi0JCXJldHVybiBkaWFsb2c7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEb2N0eXBlKEVkaXREb2N0eXBlRGlhbG9nIGRpYWxvZywgRG9jdW1lbnRUeXBlIGRvY3R5cGUpIHsKLQkJaWYgKGRvY3R5cGUgaW5zdGFuY2VvZiBJRE9NRG9jdW1lbnRUeXBlKSB7Ci0JCQlJRE9NRG9jdW1lbnRUeXBlIGRvY3R5cGVJbXBsID0gKElET01Eb2N1bWVudFR5cGUpIGRvY3R5cGU7Ci0JCQlpZiAoZG9jdHlwZUltcGwuZ2V0TmFtZSgpLmVxdWFscyhkaWFsb2cuZ2V0TmFtZSgpKSkgewotCQkJCWRvY3R5cGVJbXBsLnNldFB1YmxpY0lkKGRpYWxvZy5nZXRQdWJsaWNJZCgpKTsKLQkJCQlkb2N0eXBlSW1wbC5zZXRTeXN0ZW1JZChkaWFsb2cuZ2V0U3lzdGVtSWQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBvbmUgYW5kIHJlbW92ZSB0aGUgb2xkCi0JCQkJLy8gICAgICAgICAgICAgICAgICAKLQkJCQlEb2N1bWVudCBkb2N1bWVudCA9IGRvY3R5cGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJCURvY3VtZW50VHlwZSBuZXdEb2N0eXBlID0gY3JlYXRlRG9jdHlwZShkaWFsb2csIGRvY3VtZW50KTsKLQkJCQlkb2N1bWVudC5pbnNlcnRCZWZvcmUobmV3RG9jdHlwZSwgZG9jdHlwZSk7Ci0JCQkJZG9jdW1lbnQucmVtb3ZlQ2hpbGQoZG9jdHlwZSk7Ci0JCQkJLy8gbWFuYWdlci5yZWZvcm1hdChuZXdEb2N0eXBlLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0RWxlbWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdEVsZW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk0NDI2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0RWxlbWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLkVkaXRFbGVtZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0RWxlbWVudEFjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24gewotCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yOwotCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0VMRU1FTlQpOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIEVsZW1lbnQgZWxlbWVudDsKLQlwcm90ZWN0ZWQgaW50IGluc2VydGlvbkluZGV4ID0gLTE7Ci0JcHJvdGVjdGVkIEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlcjsKLQlwcm90ZWN0ZWQgTm9kZSBwYXJlbnQ7Ci0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLQotCXB1YmxpYyBFZGl0RWxlbWVudEFjdGlvbihBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXIsIEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGFjdGlvbkxhYmVsLCBTdHJpbmcgZGlhbG9nVGl0bGUpIHsKLQkJdGhpcyhtYW5hZ2VyLCBlbGVtZW50LmdldFBhcmVudE5vZGUoKSwgLTEsIGVsZW1lbnQsIGFjdGlvbkxhYmVsLCBkaWFsb2dUaXRsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXRFbGVtZW50QWN0aW9uKEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlciwgTm9kZSBwYXJlbnQsIGludCBpbmRleCwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYWN0aW9uTGFiZWwsIFN0cmluZyB0aXRsZSkgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy5pbnNlcnRpb25JbmRleCA9IGluZGV4OwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXNldFRleHQoYWN0aW9uTGFiZWwpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlzZXRJbWFnZURlc2NyaXB0b3IoY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIEVkaXRFbGVtZW50QWN0aW9uKEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlciwgTm9kZSBwYXJlbnQsIGludCBpbmRleCwgU3RyaW5nIGFjdGlvbkxhYmVsLCBTdHJpbmcgdGl0bGUpIHsKLQkJdGhpcyhtYW5hZ2VyLCBwYXJlbnQsIGluZGV4LCBudWxsLCBhY3Rpb25MYWJlbCwgdGl0bGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQltYW5hZ2VyLmJlZ2luTm9kZUFjdGlvbih0aGlzKTsKLQkJU2hlbGwgc2hlbGwgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCUVkaXRFbGVtZW50RGlhbG9nIGRpYWxvZyA9IG5ldyBFZGl0RWxlbWVudERpYWxvZyhzaGVsbCwgZWxlbWVudCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCURvY3VtZW50IGRvY3VtZW50ID0gcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFID8gKERvY3VtZW50KSBwYXJlbnQgOiBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCS8vIGhlcmUgd2UgbmVlZCB0byBkbyBhIHJlbmFtZS4uLiB3aGljaCBzZWVtcyB0byBiZSBxdWl0ZSBoYXJkCi0JCQkJLy8gdG8gZG8gOi0oCi0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCkgewotCQkJCQlJRE9NRWxlbWVudCBlbGVtZW50SW1wbCA9IChJRE9NRWxlbWVudCkgZWxlbWVudDsKLQkJCQkJSURPTU1vZGVsIG1vZGVsID0gZWxlbWVudEltcGwuZ2V0TW9kZWwoKTsKLQkJCQkJU3RyaW5nIG9sZE5hbWUgPSBlbGVtZW50SW1wbC5nZXROb2RlTmFtZSgpOwotCQkJCQlTdHJpbmcgbmV3TmFtZSA9IGRpYWxvZy5nZXRFbGVtZW50TmFtZSgpOwotCQkJCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbGVtZW50TmFtZShtb2RlbCwgZWxlbWVudEltcGwuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JCQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVsZW1lbnROYW1lKG1vZGVsLCBlbGVtZW50SW1wbC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJRWxlbWVudCBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChkaWFsb2cuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCQkJCWludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQkJCU5vZGUgcmVmQ2hpbGQgPSAoaW5zZXJ0aW9uSW5kZXggPCBub2RlTGlzdExlbmd0aCkgJiYgKGluc2VydGlvbkluZGV4ID49IDApID8gbm9kZUxpc3QuaXRlbShpbnNlcnRpb25JbmRleCkgOiBudWxsOwotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUobmV3RWxlbWVudCwgcmVmQ2hpbGQpOwotCQkJCW1hbmFnZXIucmVmb3JtYXQobmV3RWxlbWVudCwgZmFsc2UpOwotCQkJCW1hbmFnZXIuc2V0Vmlld2VyU2VsZWN0aW9uKG5ld0VsZW1lbnQpOwotCQkJfQotCQl9Ci0JCW1hbmFnZXIuZW5kTm9kZUFjdGlvbih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbGVtZW50TmFtZShJRE9NTW9kZWwgbW9kZWwsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHN0cmluZyA9IGZsYXROb2RlLmdldFRleHQoKTsKLQkJCWludCBpbmRleCA9IHN0cmluZy5pbmRleE9mKG9sZE5hbWUpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJaW5kZXggKz0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJCQltb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLCBpbmRleCwgb2xkTmFtZS5sZW5ndGgoKSwgbmV3TmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZWMzMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLkVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci0KLS8qKgotICogRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24gewotCXByb3RlY3RlZCBOb2RlIGNoaWxkUmVmOwotCXByb3RlY3RlZCBBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXI7Ci0JcHJvdGVjdGVkIE5vZGUgcGFyZW50OwotCXByb3RlY3RlZCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGk7Ci0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0byBhZGQgYSBuZXcgUHJvY2Vzc2luZ0luc3RydWN0aW9uCi0JICovCi0JcHVibGljIEVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24oQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlciBtYW5hZ2VyLCBOb2RlIHBhcmVudCwgTm9kZSBjaGlsZFJlZiwgU3RyaW5nIGFjdGlvbkxhYmVsLCBTdHJpbmcgdGl0bGUpIHsKLQkJc2V0VGV4dChhY3Rpb25MYWJlbCk7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLmNoaWxkUmVmID0gY2hpbGRSZWY7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gZWRpdCBhIFByb2Nlc3NpbmdJbnN0cnVjdGlvbgotCSAqLwotCXB1YmxpYyBFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uKEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlciwgUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpLCBTdHJpbmcgYWN0aW9uTGFiZWwsIFN0cmluZyB0aXRsZSkgewotCQlzZXRUZXh0KGFjdGlvbkxhYmVsKTsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQkJdGhpcy5waSA9IHBpOwotCQl0aGlzLnBhcmVudCA9IHBpLmdldFBhcmVudE5vZGUoKTsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQltYW5hZ2VyLmJlZ2luTm9kZUFjdGlvbih0aGlzKTsKLQkJU2hlbGwgc2hlbGwgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0KLQkJRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkRpYWxvZyBkaWFsb2cgPSBudWxsOwotCQlpZiAocGkgIT0gbnVsbCkgewotCQkJZGlhbG9nID0gbmV3IEVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EaWFsb2coc2hlbGwsIHBpKTsKLQkJfQotCQllbHNlIHsKLQkJCWRpYWxvZyA9IG5ldyBFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uRGlhbG9nKHNoZWxsLCBYTUxVSU1lc3NhZ2VzLl9VSV9QSV9UQVJHRVRfVkFMVUUsIFhNTFVJTWVzc2FnZXMuX1VJX1BJX0RBVEFfVkFMVUUpOwotCQl9Ci0KLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cub3BlbigpOwotCi0JCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJaWYgKHBpICE9IG51bGwpIHsKLQkJCQljaGlsZFJlZiA9IHBpOwotCQkJfQotCi0JCQlEb2N1bWVudCBkb2N1bWVudCA9IHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSA/IChEb2N1bWVudCkgcGFyZW50IDogcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCU5vZGUgbmV3Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihkaWFsb2cuZ2V0VGFyZ2V0KCksIGRpYWxvZy5nZXREYXRhKCkpOwotCQkJcGFyZW50Lmluc2VydEJlZm9yZShuZXdOb2RlLCBjaGlsZFJlZik7Ci0KLQkJCWlmIChwaSAhPSBudWxsKSB7Ci0JCQkJcGFyZW50LnJlbW92ZUNoaWxkKHBpKTsKLQkJCX0KLQotCQkJbWFuYWdlci5yZWZvcm1hdChuZXdOb2RlLCBmYWxzZSk7Ci0JCQltYW5hZ2VyLnNldFZpZXdlclNlbGVjdGlvbihuZXdOb2RlKTsKLQkJfQotCQltYW5hZ2VyLmVuZE5vZGVBY3Rpb24odGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdFNjaGVtYUluZm9BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0VkaXRTY2hlbWFJbmZvQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OTQ5MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdFNjaGVtYUluZm9BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUluZm9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9ncy5FZGl0U2NoZW1hSW5mb0RpYWxvZzsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogRWRpdERvY3R5cGVBY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIEVkaXRTY2hlbWFJbmZvQWN0aW9uIGV4dGVuZHMgTm9kZUFjdGlvbiB7Ci0JcHJvdGVjdGVkIEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlcjsKLQlwcm90ZWN0ZWQgRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIgbmFtZXNwYWNlSW5mb01hbmFnZXIgPSBuZXcgRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIoKTsKLQlwcm90ZWN0ZWQgTm9kZSBub2RlOwotCXByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotCi0JcHVibGljIEVkaXRTY2hlbWFJbmZvQWN0aW9uKEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlciwgTm9kZSBub2RlLCBTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbiwgU3RyaW5nIHRpdGxlKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCXRoaXMubm9kZSA9IG5vZGU7Ci0JCXNldFRleHQodGl0bGUpOwotCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBjcmVhdGVQcmVmaXhNYXBwaW5nKExpc3Qgb2xkTGlzdCwgTGlzdCBuZXdMaXN0KSB7Ci0JCU1hcCBtYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJSGFzaHRhYmxlIG9sZFVSSVRvUHJlZml4VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG9sZExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOYW1lc3BhY2VJbmZvIG9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0JCQlvbGRVUklUb1ByZWZpeFRhYmxlLnB1dChvbGRJbmZvLnVyaSwgb2xkSW5mbyk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGkgPSBuZXdMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTmFtZXNwYWNlSW5mbyBuZXdJbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotCQkJTmFtZXNwYWNlSW5mbyBvbGRJbmZvID0gKE5hbWVzcGFjZUluZm8pIG9sZFVSSVRvUHJlZml4VGFibGUuZ2V0KG5ld0luZm8udXJpICE9IG51bGwgPyBuZXdJbmZvLnVyaSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCi0KLQkJCS8vIGlmIG9sZEluZm8gaXMgbm9uIG51bGwgLi4uIHRoZXJlJ3MgYSBtYXRjaGluZyBVUkkgaW4gdGhlIG9sZAotCQkJLy8gc2V0Ci0JCQkvLyB3ZSBjYW4gdXNlIGl0cyBwcmVmaXggdG8gZGV0ZW1pbmUgb3V0IG1hcHBpbmcKLQkJCS8vCi0JCQkvLyBpZiBvbGRJbmZvIGlzIG51bGwgLi4uIHdlIHVzZSB0aGUgJ29sZENvcHknIHdlIHN0YXNoZWQgYXdheQotCQkJLy8gYXNzdW1pbmcgdGhhdCB0aGUgdXNlciBjaGFuZ2VkIHRoZSBVUkkgYW5kIHRoZSBwcmVmaXgKLQkJCWlmIChvbGRJbmZvID09IG51bGwpIHsKLQkJCQlvbGRJbmZvID0gKE5hbWVzcGFjZUluZm8pIG5ld0luZm8uZ2V0UHJvcGVydHkoIm9sZENvcHkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAob2xkSW5mbyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG5ld1ByZWZpeCA9IG5ld0luZm8ucHJlZml4ICE9IG51bGwgPyBuZXdJbmZvLnByZWZpeCA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIG9sZFByZWZpeCA9IG9sZEluZm8ucHJlZml4ICE9IG51bGwgPyBvbGRJbmZvLnByZWZpeCA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKCFvbGRQcmVmaXguZXF1YWxzKG5ld1ByZWZpeCkpIHsKLQkJCQkJbWFwLnB1dChvbGRQcmVmaXgsIG5ld1ByZWZpeCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudChOb2RlIG5vZGUpIHsKLQkJRWxlbWVudCByZXN1bHQgPSBudWxsOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlyZXN1bHQgPSAoRWxlbWVudCkgbm9kZTsKLQkJfQotCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlyZXN1bHQgPSBnZXRSb290RWxlbWVudCgoRG9jdW1lbnQpIG5vZGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgRWxlbWVudCBnZXRSb290RWxlbWVudChEb2N1bWVudCBkb2N1bWVudCkgewotCQlFbGVtZW50IHJvb3RFbGVtZW50ID0gbnVsbDsKLQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0TGVuZ3RoOyBpKyspIHsKLQkJCU5vZGUgY2hpbGROb2RlID0gbm9kZUxpc3QuaXRlbShpKTsKLQkJCWlmIChjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCXJvb3RFbGVtZW50ID0gKEVsZW1lbnQpIGNoaWxkTm9kZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcm9vdEVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiB0aXRsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCW1hbmFnZXIuYmVnaW5Ob2RlQWN0aW9uKHRoaXMpOwotCi0JCS8vIHRvZG8uLi4gY2hhbmdlIGNvbnN0cnVjdG9yIHRvIHRha2UgYW4gZWxlbWVudAotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KG5vZGUpOwotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlTaGVsbCBzaGVsbCA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJCUVkaXRTY2hlbWFJbmZvRGlhbG9nIGRpYWxvZyA9IG5ldyBFZGl0U2NoZW1hSW5mb0RpYWxvZyhzaGVsbCwgbmV3IFBhdGgocmVzb3VyY2VMb2NhdGlvbikpOwotCi0JCQlMaXN0IG5hbWVzcGFjZUluZm9MaXN0ID0gbmFtZXNwYWNlSW5mb01hbmFnZXIuZ2V0TmFtZXNwYWNlSW5mb0xpc3QoZWxlbWVudCk7Ci0JCQlMaXN0IG9sZE5hbWVzcGFjZUluZm9MaXN0ID0gTmFtZXNwYWNlSW5mby5jbG9uZU5hbWVzcGFjZUluZm9MaXN0KG5hbWVzcGFjZUluZm9MaXN0KTsKLQotCQkJLy8gaGVyZSB3ZSBzdG9yZSBhIGNvcHkgb2YgdGhlIG9sZCBpbmZvIGZvciBlYWNoIE5hbWVzcGFjZUluZm8KLQkJCS8vIHRoaXMgaW5mbyB3aWxsIGJlIHVzZWQgaW4gY3JlYXRlUHJlZml4TWFwcGluZygpIHRvIGZpZ3VyZSBvdXQKLQkJCS8vIGhvdyB0byB1cGRhdGUgdGhlIGRvY3VtZW50Ci0JCQkvLyBpbiByZXNwb25zZSB0byB0aGVzZSBjaGFuZ2VzCi0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBuYW1lc3BhY2VJbmZvTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0JCQkJTmFtZXNwYWNlSW5mbyBvbGRDb3B5ID0gbmV3IE5hbWVzcGFjZUluZm8oaW5mbyk7Ci0JCQkJaW5mby5zZXRQcm9wZXJ0eSgib2xkQ29weSIsIG9sZENvcHkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWRpYWxvZy5zZXROYW1lc3BhY2VJbmZvTGlzdChuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQkvLyBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKDUwMCwgMzAwKTsKLQkJCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9FRElUX1NDSEVNQV9JTkZPUk1BVElPTl9USVRMRSk7Ci0JCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCi0JCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlMaXN0IG5ld0luZm9MaXN0ID0gZGlhbG9nLmdldE5hbWVzcGFjZUluZm9MaXN0KCk7Ci0JCQkJbmFtZXNwYWNlSW5mb01hbmFnZXIucmVtb3ZlTmFtZXNwYWNlSW5mbyhlbGVtZW50KTsKLQkJCQluYW1lc3BhY2VJbmZvTWFuYWdlci5hZGROYW1lc3BhY2VJbmZvKGVsZW1lbnQsIG5ld0luZm9MaXN0LCB0cnVlKTsKLQotCQkJCS8vIHNlZSBpZiB3ZSBuZWVkIHRvIHJlbmFtZSBhbnkgcHJlZml4ZXMKLQkJCQlNYXAgcHJlZml4TWFwcGluZyA9IGNyZWF0ZVByZWZpeE1hcHBpbmcob2xkTmFtZXNwYWNlSW5mb0xpc3QsIG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJCQlpZiAocHJlZml4TWFwcGluZy5zaXplKCkgPiAwKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltYW5hZ2VyLmdldE1vZGVsKCkuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQkJCQlSZXBsYWNlUHJlZml4QWN0aW9uIHJlcGxhY2VQcmVmaXhBY3Rpb24gPSBuZXcgUmVwbGFjZVByZWZpeEFjdGlvbihtYW5hZ2VyLCBlbGVtZW50LCBwcmVmaXhNYXBwaW5nKTsKLQkJCQkJCXJlcGxhY2VQcmVmaXhBY3Rpb24ucnVuKCk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQltYW5hZ2VyLmdldE1vZGVsKCkuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJbWFuYWdlci5lbmROb2RlQWN0aW9uKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0dvVG9NYXRjaGluZ1RhZ0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvR29Ub01hdGNoaW5nVGFnQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyM2NkNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvR29Ub01hdGNoaW5nVGFnQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklQb3N0U2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRFZGl0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIGVuZCB0YWcgaWYgaXQgaXMgaW4gYSBzdGFydCB0YWcsIGFuZCB2aWNlIHZlcnNhLgotICogQWxzbyB1cGRhdGVzIHRoZSBtYXRjaGluZyB0YWcgYW5ub3RhdGlvbiBpbiB0aGUgYWN0aXZlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBuaXRpbgotICogCi0gKi8KLWNsYXNzIEdvVG9NYXRjaGluZ1RhZ0FjdGlvbiBleHRlbmRzIFRleHRFZGl0b3JBY3Rpb24gewotCi0JcHJpdmF0ZSBjbGFzcyBVcGRhdGVMaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJdXBkYXRlRm9yKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX1RZUEUgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5tYXRjaGluZy50YWciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGZVcGRhdGVMaXN0ZW5lciA9IG51bGw7Ci0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotCS8qKgotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiBAcGFyYW0gcHJlZml4Ci0JICogQHBhcmFtIGVkaXRvcgotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCUdvVG9NYXRjaGluZ1RhZ0FjdGlvbihSZXNvdXJjZUJ1bmRsZSBidW5kbGUsIFN0cmluZyBwcmVmaXgsIElUZXh0RWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihidW5kbGUsIHByZWZpeCwgZWRpdG9yKTsKLQkJZlVwZGF0ZUxpc3RlbmVyID0gbmV3IFVwZGF0ZUxpc3RlbmVyKCk7Ci0JfQotCi0Jdm9pZCByZW1vdmVBbm5vdGF0aW9uKGJvb2xlYW4gYWxsTWF0Y2hpbmcpIHsKLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IGdldFRleHRFZGl0b3IoKTsKLQkJaWYgKHRleHRFZGl0b3IgPT0gbnVsbCkgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJubyBlZGl0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCUlEb2N1bWVudFByb3ZpZGVyIGRvY3VtZW50UHJvdmlkZXIgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJaWYgKGRvY3VtZW50UHJvdmlkZXIgPT0gbnVsbCkgewotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJubyBkb2N1bWVudCBwcm92aWRlciIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSUFubm90YXRpb25Nb2RlbCBhbm5vdGF0aW9uTW9kZWwgPSBkb2N1bWVudFByb3ZpZGVyLmdldEFubm90YXRpb25Nb2RlbCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQlpZiAoYW5ub3RhdGlvbk1vZGVsID09IG51bGwpIHsKLQkJCWlmIChERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibm8gYW5ub3RhdGlvbiBtb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJdGVyYXRvciBhbm5vdGF0aW9uSXRlcmF0b3IgPSBhbm5vdGF0aW9uTW9kZWwuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKCk7Ci0JCUxpc3Qgb2xkQW5ub3RhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChhbm5vdGF0aW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQW5ub3RhdGlvbikgYW5ub3RhdGlvbkl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChBTk5PVEFUSU9OX1RZUEUuZXF1YWxzKGFubm90YXRpb24uZ2V0VHlwZSgpKSkgewotCQkJCWFubm90YXRpb24ubWFya0RlbGV0ZWQodHJ1ZSk7Ci0JCQkJLyoqCi0JCQkJICogU29tZXRpbWVzIGl0IGlzIHN1cHBvcnRlZCwgc29tZXRpbWUncyBpdCBpcyBub3QuIENvbmZ1c2luZy4KLQkJCQkgKi8KLQkJCQl0cnkgewotCQkJCQlhbm5vdGF0aW9uSXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCW9sZEFubm90YXRpb25zLmFkZChhbm5vdGF0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVtb3ZlZCAiICsgYW5ub3RhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKCFhbGxNYXRjaGluZykKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFvbGRBbm5vdGF0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCWludCBzaXplID0gb2xkQW5ub3RhdGlvbnMuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlhbm5vdGF0aW9uTW9kZWwucmVtb3ZlQW5ub3RhdGlvbigoQW5ub3RhdGlvbikgb2xkQW5ub3RhdGlvbnMuZ2V0KGkpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW5XaXRoRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLnJ1bldpdGhFdmVudChldmVudCk7Ci0JCWlmIChnZXRUZXh0RWRpdG9yKCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQlpbnQgb2Zmc2V0ID0gKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRPZmZzZXQoKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1hdGNoUmVnaW9uID0gbnVsbDsKLQkJCQlpZiAoKChOb2RlKSBvKS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCQkJbyA9ICgoQXR0cikgbykuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQkJfQotCi0JCQkJaW50IHRhcmdldE9mZnNldCA9IC0xOwotCQkJCWlmIChvIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgbzsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uY29udGFpbnNPZmZzZXQob2Zmc2V0KSkgewotCQkJCQkJbWF0Y2hSZWdpb24gPSAoKElET01Ob2RlKSBvKS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJCWlmIChtYXRjaFJlZ2lvbiAhPSBudWxsKQotCQkJCQkJCXRhcmdldE9mZnNldCA9IG1hdGNoUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgKyAyOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsICYmIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQkJCQkJbWF0Y2hSZWdpb24gPSAoKElET01Ob2RlKSBvKS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQkJCWlmIChtYXRjaFJlZ2lvbiAhPSBudWxsKQotCQkJCQkJCQl0YXJnZXRPZmZzZXQgPSBtYXRjaFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpICsgMTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICh0YXJnZXRPZmZzZXQgPj0gMCkgewotCQkJCQlnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5zZXRTZWxlY3Rpb24obmV3IFRleHRTZWxlY3Rpb24odGFyZ2V0T2Zmc2V0LCAwKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRFZGl0b3JBY3Rpb24jc2V0RWRpdG9yKG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdG9yKElUZXh0RWRpdG9yIGVkaXRvcikgewotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gZ2V0VGV4dEVkaXRvcigpOwotCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JCQlyZW1vdmVBbm5vdGF0aW9uKHRydWUpOwotCi0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgaW5zdGFuY2VvZiBJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSB7Ci0JCQkJKChJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSBzZWxlY3Rpb25Qcm92aWRlcikucmVtb3ZlUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmVXBkYXRlTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JCXN1cGVyLnNldEVkaXRvcihlZGl0b3IpOwotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyIGluc3RhbmNlb2YgSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgewotCQkJCSgoSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgc2VsZWN0aW9uUHJvdmlkZXIpLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZlVwZGF0ZUxpc3RlbmVyKTsKLQkJCX0KLQotCQkJdXBkYXRlRm9yKHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQotCX0KLQotCXZvaWQgdXBkYXRlRm9yKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBnZXRUZXh0RWRpdG9yKCk7Ci0JCWlmICh0ZXh0RWRpdG9yID09IG51bGwpIHsKLQkJCWlmIChERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibm8gZWRpdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlJRG9jdW1lbnRQcm92aWRlciBkb2N1bWVudFByb3ZpZGVyID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCWlmIChkb2N1bWVudFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWlmIChERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibm8gZG9jdW1lbnQgcHJvdmlkZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZG9jdW1lbnRQcm92aWRlci5nZXRBbm5vdGF0aW9uTW9kZWwodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJaWYgKGFubm90YXRpb25Nb2RlbCA9PSBudWxsIHx8ICEoYW5ub3RhdGlvbk1vZGVsIGluc3RhbmNlb2YgSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbikpIHsKLQkJCWlmIChERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibm8gYW5ub3RhdGlvbiBtb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IG9sZEFubm90YXRpb25zID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJSXRlcmF0b3IgYW5ub3RhdGlvbkl0ZXJhdG9yID0gYW5ub3RhdGlvbk1vZGVsLmdldEFubm90YXRpb25JdGVyYXRvcigpOwotCQl3aGlsZSAoYW5ub3RhdGlvbkl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEFubm90YXRpb24pIGFubm90YXRpb25JdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoQU5OT1RBVElPTl9UWVBFLmVxdWFscyhhbm5vdGF0aW9uLmdldFR5cGUoKSkpIHsKLQkJCQlhbm5vdGF0aW9uLm1hcmtEZWxldGVkKHRydWUpOwotCQkJCWlmIChERUJVRykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlbW92aW5nICIgKyBhbm5vdGF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlvbGRBbm5vdGF0aW9ucy5hZGQoYW5ub3RhdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQlNYXAgbmV3QW5ub3RhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQlpbnQgb2Zmc2V0ID0gKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRPZmZzZXQoKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1hdGNoUmVnaW9uID0gbnVsbDsKLQkJCQlpZiAoKChOb2RlKSBvKS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCQkJbyA9ICgoQXR0cikgbykuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQkJfQotCi0JCQkJUG9zaXRpb24gcFN0YXJ0ID0gbnVsbDsKLQkJCQlQb3NpdGlvbiBwRW5kID0gbnVsbDsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIG87Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsICYmIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDEpIHsKLQkJCQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCQkJCQlwU3RhcnQgPSBuZXcgUG9zaXRpb24oc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZVJlZ2lvbiksIG5hbWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQkJCX0KLQkJCQkJCW1hdGNoUmVnaW9uID0gKChJRE9NTm9kZSkgbykuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCQlpZiAobWF0Y2hSZWdpb24gIT0gbnVsbCAmJiBtYXRjaFJlZ2lvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDEpIHsKLQkJCQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gbWF0Y2hSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCQkJCQlwRW5kID0gbmV3IFBvc2l0aW9uKG1hdGNoUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWVSZWdpb24pLCBuYW1lUmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldE51bWJlck9mUmVnaW9ucygpID4gMSkgewotCQkJCQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQkJCQkJCXBFbmQgPSBuZXcgUG9zaXRpb24oZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWVSZWdpb24pLCBuYW1lUmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCW1hdGNoUmVnaW9uID0gKChJRE9NTm9kZSkgbykuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJCQlpZiAobWF0Y2hSZWdpb24gIT0gbnVsbCAmJiBtYXRjaFJlZ2lvbi5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDEpIHsKLQkJCQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG1hdGNoUmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQkJCQkJCXBTdGFydCA9IG5ldyBQb3NpdGlvbihtYXRjaFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKSwgbmFtZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocFN0YXJ0ICE9IG51bGwgJiYgcEVuZCAhPSBudWxsKSB7Ci0JCQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uKGZhbHNlKTsKLQkJCQkJYW5ub3RhdGlvbi5zZXRUeXBlKEFOTk9UQVRJT05fVFlQRSk7Ci0JCQkJCW5ld0Fubm90YXRpb25zLnB1dChhbm5vdGF0aW9uLCBwU3RhcnQpOwotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWRkaW5nICIgKyBhbm5vdGF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJYW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uKGZhbHNlKTsKLQkJCQkJYW5ub3RhdGlvbi5zZXRUeXBlKEFOTk9UQVRJT05fVFlQRSk7Ci0JCQkJCW5ld0Fubm90YXRpb25zLnB1dChhbm5vdGF0aW9uLCBwRW5kKTsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFkZGluZyAiICsgYW5ub3RhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkoKElBbm5vdGF0aW9uTW9kZWxFeHRlbnNpb24pIGFubm90YXRpb25Nb2RlbCkucmVwbGFjZUFubm90YXRpb25zKChBbm5vdGF0aW9uW10pIG9sZEFubm90YXRpb25zLnRvQXJyYXkobmV3IEFubm90YXRpb25bb2xkQW5ub3RhdGlvbnMuc2l6ZSgpXSksIG5ld0Fubm90YXRpb25zKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9NZW51QnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvTWVudUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhmM2NlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9NZW51QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLQotCi1wdWJsaWMgY2xhc3MgTWVudUJ1aWxkZXIgewotCi0KLQlwcm90ZWN0ZWQgQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKGdldFNvcnRLZXkobzEpLCBnZXRTb3J0S2V5KG8yKSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNvcnRLZXkoT2JqZWN0IG8pIHsKLQkJCVN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG8gaW5zdGFuY2VvZiBJQWN0aW9uKSB7Ci0JCQkJSUFjdGlvbiBhY3Rpb24gPSAoSUFjdGlvbikgbzsKLQkJCQlyZXN1bHQgPSBhY3Rpb24uZ2V0VGV4dCgpOwotCQkJfQotCQkJLy8gZWxzZSBpZiAobyBpbnN0YW5jZW9mIE1lbnVEYXRhKQotCQkJLy8gewotCQkJLy8gcmVzdWx0ID0gInoiICsgKChNZW51RGF0YSlvKS5uYW1lOwotCQkJLy8gfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX07Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFscGhlYmV0aWNhbEdyb3VwaW5nKElNZW51TWFuYWdlciBtZW51LCBMaXN0IGFjdGlvbkxpc3QpIHsKLQkJT2JqZWN0W10gYXJyYXkgPSBhY3Rpb25MaXN0LnRvQXJyYXkoKTsKLQkJaWYgKGFycmF5Lmxlbmd0aCA+IDApIHsKLQkJCUFycmF5cy5zb3J0KGFycmF5LCBjb21wYXJhdG9yKTsKLQkJfQotCi0JCWludCBncm91cFNpemUgPSAxNTsKLQkJaW50IG1pbkdyb3VwU2l6ZSA9IDU7Ci0JCWludCBudW1iZXJPZkdyb3VwcyA9IChhcnJheS5sZW5ndGggLyBncm91cFNpemUpICsgKChhcnJheS5sZW5ndGggJSBncm91cFNpemUgPiBtaW5Hcm91cFNpemUpID8gMSA6IDApOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZHcm91cHM7IGkrKykgewotCQkJYm9vbGVhbiBpc0xhc3RHcm91cCA9IChpID09IChudW1iZXJPZkdyb3VwcyAtIDEpKTsKLQkJCWludCBmaXJzdEluZGV4ID0gaSAqIGdyb3VwU2l6ZTsKLQkJCWludCBsYXN0SW5kZXggPSBpc0xhc3RHcm91cCA/IGFycmF5Lmxlbmd0aCAtIDEgOiBpICogZ3JvdXBTaXplICsgZ3JvdXBTaXplIC0gMTsKLQkJCUFjdGlvbiBmaXJzdEFjdGlvbiA9IChBY3Rpb24pIGFycmF5W2ZpcnN0SW5kZXhdOwotCQkJQWN0aW9uIGxhc3RBY3Rpb24gPSAoQWN0aW9uKSBhcnJheVtsYXN0SW5kZXhdOwotCQkJTWVudU1hbmFnZXIgc3VibWVudSA9IG5ldyBNZW51TWFuYWdlcihmaXJzdEFjdGlvbi5nZXRUZXh0KCkgKyAiIC0gIiArIGxhc3RBY3Rpb24uZ2V0VGV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJbWVudS5hZGQoc3VibWVudSk7Ci0JCQlmb3IgKGludCBqID0gZmlyc3RJbmRleDsgaiA8PSBsYXN0SW5kZXg7IGorKykgewotCQkJCXN1Ym1lbnUuYWRkKChBY3Rpb24pIGFycmF5W2pdKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgcG9wdWxhdGVNZW51KElNZW51TWFuYWdlciBtZW51LCBMaXN0IGFjdGlvbkxpc3QsIGJvb2xlYW4gY3JlYXRlVGllcmVkKSB7Ci0JCS8vIHNvcnQgdGhlIGFjdGlvbnMKLQkJaWYgKGFjdGlvbkxpc3Quc2l6ZSgpIDwgMjUpIHsKLQkJCU9iamVjdFtdIGFycmF5ID0gYWN0aW9uTGlzdC50b0FycmF5KCk7Ci0JCQlpZiAoYXJyYXkubGVuZ3RoID4gMCkgewotCQkJCUFycmF5cy5zb3J0KGFycmF5LCBjb21wYXJhdG9yKTsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQltZW51LmFkZCgoQWN0aW9uKSBhcnJheVtpXSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQljcmVhdGVBbHBoZWJldGljYWxHcm91cGluZyhtZW51LCBhY3Rpb25MaXN0KTsKLQkJfQotCX0KLQotCS8qCi0JICogcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvcGVydHlHcm91cGluZyhJTWVudU1hbmFnZXIgbWVudSwgTGlzdAotCSAqIGFjdGlvbkxpc3QpIHsgTWVudURhdGFUYWJsZSBtZW51RGF0YVRhYmxlID0gbmV3IE1lbnVEYXRhVGFibGUoKTsKLQkgKiAKLQkgKiBmb3IgKEl0ZXJhdG9yIGkgPSBhY3Rpb25MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsgU3RyaW5nCi0JICogZ3JvdXBOYW1lID0gbnVsbDsgQWN0aW9uIGFjdGlvbiA9IChBY3Rpb24paS5uZXh0KCk7IGlmIChhY3Rpb24KLQkgKiBpbnN0YW5jZW9mIE5vZGVBY3Rpb24pIHsgZ3JvdXBOYW1lID0KLQkgKiAoKE5vZGVBY3Rpb24pYWN0aW9uKS5nZXRHcm91cE5hbWUoKTsgfSBpZiAoZ3JvdXBOYW1lID09IG51bGwpIHsKLQkgKiBncm91cE5hbWUgPSAiIjsgfSBNZW51RGF0YSBtZW51RGF0YSA9Ci0JICogbWVudURhdGFUYWJsZS5sb29rdXBPckNyZWF0ZShncm91cE5hbWUsICIiKTsKLQkgKiBtZW51RGF0YS5jaGlsZExpc3QuYWRkKGFjdGlvbik7IH0gcG9wdWxhdGVNZW51KG1lbnUsCi0JICogbWVudURhdGFUYWJsZS5nZXRSb290KCkpOyB9Ci0JICogCi0JICogCi0JICogcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVNZW51KE1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBNZW51RGF0YSBtZW51RGF0YSkgewotCSAqIGZvciAoSXRlcmF0b3IgaSA9IG1lbnVEYXRhLmNoaWxkTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JICogT2JqZWN0IG8gPSBpLm5leHQoKTsgaWYgKG8gaW5zdGFuY2VvZiBBY3Rpb24pIHsKLQkgKiBtZW51TWFuYWdlci5hZGQoKEFjdGlvbilvKTsgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgTWVudURhdGEpIHsKLQkgKiBNZW51RGF0YSBjaGlsZE1lbnVEYXRhID0gKE1lbnVEYXRhKW87IE1lbnVNYW5hZ2VyIGNoaWxkTWVudU1hbmFnZXIgPQotCSAqIG5ldyBNZW51TWFuYWdlcihjaGlsZE1lbnVEYXRhLm5hbWUpOyBtZW51TWFuYWdlci5hZGQoY2hpbGRNZW51TWFuYWdlcik7Ci0JICogcG9wdWxhdGVNZW51KGNoaWxkTWVudU1hbmFnZXIsIGNoaWxkTWVudURhdGEpOyB9IH0gfQotCSAqIAotCSAqIAotCSAqIHB1YmxpYyBNZW51RGF0YVRhYmxlIHsgcHJvdGVjdGVkIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQkgKiBwcm90ZWN0ZWQgTWVudURhdGEgcm9vdDsKLQkgKiAKLQkgKiBwdWJsaWMgTWVudURhdGFUYWJsZSgpIHsgcm9vdCA9IGxvb2t1cE9yQ3JlYXRlTWVudURhdGEobnVsbCwgbnVsbCk7IH0KLQkgKiAKLQkgKiBwcm90ZWN0ZWQgTWVudURhdGEgbG9va3VwTWVudURhdGEoU3RyaW5nIG5hbWUpIHsgU3RyaW5nIGtleSA9IG5hbWUgIT0KLQkgKiBudWxsID8gbmFtZSA6ICIiOyByZXR1cm4gKE1lbnVEYXRhKW1lbnVEYXRhVGFibGUuZ2V0KGtleSk7IH0KLQkgKiAKLQkgKiBwcm90ZWN0ZWQgTWVudURhdGEgbG9va3VwT3JDcmVhdGVNZW51RGF0YShTdHJpbmcgbmFtZSwgU3RyaW5nCi0JICogcGFyZW50TmFtZSkgeyBTdHJpbmcga2V5ID0gbmFtZSAhPSBudWxsID8gbmFtZSA6ICIiOyBNZW51RGF0YSBtZW51RGF0YSA9Ci0JICogKE1lbnVEYXRhKW1lbnVEYXRhVGFibGUuZ2V0KGtleSk7IGlmIChtZW51RGF0YSA9PSBudWxsKSB7IG1lbnVEYXRhID0KLQkgKiBuZXcgTWVudURhdGEobmFtZSwgcGFyZW50TmFtZSk7IG1lbnVEYXRhVGFibGUucHV0KGtleSwgbWVudURhdGEpOyB9Ci0JICogcmV0dXJuIG1lbnVEYXRhOyB9Ci0JICogCi0JICogcHVibGljIE1lbnVEYXRhIGdldFJvb3QoKSB7IHJldHVybiByb290OyB9IH0KLQkgKiAKLQkgKiAKLQkgKiBwcm90ZWN0ZWQgY2xhc3MgTWVudURhdGEgeyBwdWJsaWMgU3RyaW5nIG5hbWU7IHB1YmxpYyBTdHJpbmcKLQkgKiBwYXJlbnROYW1lOyBwdWJsaWMgTGlzdCBjaGlsZExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JICogCi0JICogTWVudURhdGEoU3RyaW5nIG5hbWUsIFN0cmluZyBwYXJlbnROYW1lKSB7IHRoaXMubmFtZSA9IG5hbWU7Ci0JICogdGhpcy5wYXJlbnROYW1lID0gcGFyZW50TmFtZTsgfQotCSAqIAotCSAqIHByb3RlY3RlZCB2b2lkIHNvcnQoKSB7IE9iamVjdFtdIGFycmF5ID0gY2hpbGRMaXN0LnRvQXJyYXkoKTsgaWYKLQkgKiAoYXJyYXkubGVuZ3RoID4gMCApIHsgQXJyYXlzLnNvcnQoYXJyYXksIGNvbXBhcmF0b3IpOyB9IGNoaWxkTGlzdCA9Ci0JICogQXJyYXlzLmFzTGlzdChhcnJheSk7Ci0JICogCi0JICogZm9yIChJdGVyYXRvciBpID0gY2hpbGRMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsgT2JqZWN0IG8gPQotCSAqIGkubmV4dCgpOyBpZiAobyBpbnN0YW5jZW9mIE1lbnVEYXRhKSB7ICgoTWVudURhdGEpbykuc29ydCgpOyB9IH0gfSB9Ci0JICovCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Ob2RlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Ob2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NzRlOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvTm9kZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9kZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNvcnRLZXkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZW1vdmVCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvUmVtb3ZlQmxvY2tDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczZTVmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZW1vdmVCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Db21tZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLS8qKgotICogUmVtb3ZlIGJsb2NrIGNvbW1lbnQgYWN0aW9uIGRlbGVnYXRlIGZvciBYTUwgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSBleHRlbmRzIEFic3RyYWN0Q29tbWVudEFjdGlvblhNTERlbGVnYXRlIHsKLQotCXZvaWQgcHJvY2Vzc0FjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jdW1lbnQpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJbmRleGVkUmVnaW9uIHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0KLQkJCQlpZiAoKHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbiA9PSBudWxsKSB8fCAoc2VsZWN0aW9uRW5kSW5kZXhlZFJlZ2lvbiA9PSBudWxsKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaW50IG9wZW5Db21tZW50T2Zmc2V0ID0gc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGNsb3NlQ29tbWVudE9mZnNldCA9IHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBPUEVOX0NPTU1FTlQubGVuZ3RoKCkgLSBDTE9TRV9DT01NRU5ULmxlbmd0aCgpOwotCi0JCQkJbW9kZWwuYmVnaW5SZWNvcmRpbmcodGhpcywgWE1MVUlNZXNzYWdlcy5SZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcCk7Ci0JCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQl0cnkgewotCQkJCQlpZiAodGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgQ29tbWVudEltcGwpIHsKLQkJCQkJCQlkb2N1bWVudC5yZXBsYWNlKG9wZW5Db21tZW50T2Zmc2V0LCBPUEVOX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWRvY3VtZW50LnJlcGxhY2UoY2xvc2VDb21tZW50T2Zmc2V0LCBDTE9TRV9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChzZWxlY3Rpb25TdGFydEluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBDb21tZW50SW1wbCkgewotCQkJCQkJCWRvY3VtZW50LnJlcGxhY2Uob3BlbkNvbW1lbnRPZmZzZXQsIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0KLQkJCQkJCWlmIChzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgQ29tbWVudEltcGwpIHsKLQkJCQkJCQlkb2N1bWVudC5yZXBsYWNlKGNsb3NlQ29tbWVudE9mZnNldCwgQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmVtb3ZlT3BlbkNsb3NlQ29tbWVudHMoZG9jdW1lbnQsIG9wZW5Db21tZW50T2Zmc2V0ICsgT1BFTl9DT01NRU5ULmxlbmd0aCgpLCBjbG9zZUNvbW1lbnRPZmZzZXQgLSBvcGVuQ29tbWVudE9mZnNldCAtIENMT1NFX0NPTU1FTlQubGVuZ3RoKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChYTUxVSU1lc3NhZ2VzLlJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihYTUxVSU1lc3NhZ2VzLlJlbW92ZUJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZXBsYWNlUHJlZml4QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZXBsYWNlUHJlZml4QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NzE5YTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvUmVwbGFjZVByZWZpeEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTVZpc2l0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotCi1wdWJsaWMgY2xhc3MgUmVwbGFjZVByZWZpeEFjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24gewotCi0JY2xhc3MgTm9kZUNvbGxlY3RpbmdET01WaXNpdG9yIGV4dGVuZHMgRE9NVmlzaXRvciB7Ci0JCXB1YmxpYyBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNQcmVmaXhDaGFuZ2VkTmVlZGVkKE5vZGUgbm9kZSkgewotCQkJU3RyaW5nIGtleSA9IG5vZGUuZ2V0UHJlZml4KCkgIT0gbnVsbCA/IG5vZGUuZ2V0UHJlZml4KCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHByZWZpeE1hcHBpbmcuZ2V0KGtleSkgIT0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHZpc2l0QXR0cihBdHRyIGF0dHIpIHsKLQkJCS8qCi0JCQkgKiBpZiAoaXNQcmVmaXhDaGFuZ2VkTmVlZGVkKGVsZW1lbnQpKSB7IGxpc3QuYWRkKGF0dHIpOyB9Ci0JCQkgKi8KLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHZpc2l0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJCXN1cGVyLnZpc2l0RWxlbWVudChlbGVtZW50KTsKLQkJCWlmIChpc1ByZWZpeENoYW5nZWROZWVkZWQoZWxlbWVudCkpIHsKLQkJCQlsaXN0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvcjsKLQlwcm90ZWN0ZWQgRWxlbWVudCBlbGVtZW50OwotCXByb3RlY3RlZCBBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXI7Ci0JcHJvdGVjdGVkIE1hcCBwcmVmaXhNYXBwaW5nOwotCi0JcHVibGljIFJlcGxhY2VQcmVmaXhBY3Rpb24oQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlciBtYW5hZ2VyLCBFbGVtZW50IGVsZW1lbnQsIE1hcCBwcmVmaXhNYXBwaW5nKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMucHJlZml4TWFwcGluZyA9IHByZWZpeE1hcHBpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJTm9kZUNvbGxlY3RpbmdET01WaXNpdG9yIHZpc2l0b3IgPSBuZXcgTm9kZUNvbGxlY3RpbmdET01WaXNpdG9yKCk7Ci0JCXZpc2l0b3IudmlzaXROb2RlKGVsZW1lbnQpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSB2aXNpdG9yLmxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaS5uZXh0KCk7Ci0JCQlTdHJpbmcga2V5ID0gbm9kZS5nZXRQcmVmaXgoKSAhPSBudWxsID8gbm9kZS5nZXRQcmVmaXgoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbmV3UHJlZml4ID0gKFN0cmluZykgcHJlZml4TWFwcGluZy5nZXQoa2V5KTsKLQkJCWlmIChuZXdQcmVmaXggIT0gbnVsbCkgewotCQkJCW5vZGUuc2V0UHJlZml4KG5ld1ByZWZpeCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9TaWJsaW5nTmF2aWdhdGlvbkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvU2libGluZ05hdmlnYXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4YjQ0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9TaWJsaW5nTmF2aWdhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRFZGl0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFByb3ZpZGVzIG5hdmlnYXRpb24gdG8gbmV4dC9wcmV2aW91cyBET00gc2libGluZyBOb2RlcwotICogCi0gKiBAYXV0aG9yIG5pdGluCi0gKiAKLSAqLwotY2xhc3MgU2libGluZ05hdmlnYXRpb25BY3Rpb24gZXh0ZW5kcyBUZXh0RWRpdG9yQWN0aW9uIHsKLQotCXByaXZhdGUgYm9vbGVhbiBmRm9yd2FyZDsKLQotCS8qKgotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiBAcGFyYW0gcHJlZml4Ci0JICogQHBhcmFtIGVkaXRvcgotCSAqLwotCVNpYmxpbmdOYXZpZ2F0aW9uQWN0aW9uKFJlc291cmNlQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIHByZWZpeCwgSVRleHRFZGl0b3IgZWRpdG9yLCBib29sZWFuIGZvcndhcmQpIHsKLQkJc3VwZXIoYnVuZGxlLCBwcmVmaXgsIGVkaXRvcik7Ci0JCWZGb3J3YXJkID0gZm9yd2FyZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuV2l0aEV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChFdmVudCBldmVudCkgewotCQlzdXBlci5ydW5XaXRoRXZlbnQoZXZlbnQpOwotCQlpZiAoZ2V0VGV4dEVkaXRvcigpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQlOb2RlIHNpYmxpbmcgPSBudWxsOwotCi0JCQkJaWYgKCgoTm9kZSkgbykuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkJCW8gPSAoKEF0dHIpIG8pLmdldE93bmVyRWxlbWVudCgpOwotCQkJCX0KLQkJCQlpZiAoZkZvcndhcmQpIHsKLQkJCQkJc2libGluZyA9ICgoTm9kZSkgbykuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJd2hpbGUgKHNpYmxpbmcgIT0gbnVsbCAmJiBzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgc2libGluZy5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJc2libGluZyA9IHNpYmxpbmcuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJfQotCQkJCQlpZiAoc2libGluZyA9PSBudWxsKSB7Ci0JCQkJCQlzaWJsaW5nID0gKChOb2RlKSBvKS5nZXRQYXJlbnROb2RlKCkuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCQkJd2hpbGUgKHNpYmxpbmcgIT0gbnVsbCAmJiBzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgc2libGluZy5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXNpYmxpbmcgPSBzaWJsaW5nLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNpYmxpbmcgPSAoKE5vZGUpIG8pLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCQl3aGlsZSAoc2libGluZyAhPSBudWxsICYmIHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBzaWJsaW5nLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlzaWJsaW5nID0gc2libGluZy5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCQkJfQotCQkJCQlpZiAoc2libGluZyA9PSBudWxsKSB7Ci0JCQkJCQlzaWJsaW5nID0gKChOb2RlKSBvKS5nZXRQYXJlbnROb2RlKCkuZ2V0TGFzdENoaWxkKCk7Ci0JCQkJCQl3aGlsZSAoc2libGluZyAhPSBudWxsICYmIHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBzaWJsaW5nLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJc2libGluZyA9IHNpYmxpbmcuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBUaGUgb25seSBjaGlsZCBpcyBhIFRleHQgTm9kZSwgZ28gdG8gdGhlIHBhcmVudCBOb2RlCi0JCQkJaWYgKCgoTm9kZSkgbykuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBvLmVxdWFscyhzaWJsaW5nKSkgewotCQkJCQlzaWJsaW5nID0gKChOb2RlKSBvKS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJfQotCi0KLQkJCQlpZiAoc2libGluZyAhPSBudWxsKSB7Ci0JCQkJCWdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzaWJsaW5nKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRFZGl0b3JBY3Rpb24jdXBkYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Ub2dnbGVDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL1RvZ2dsZUNvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWQ4MWQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL1RvZ2dsZUNvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLS8qKgotICogVG9nZ2xlIGNvbW1lbnQgYWN0aW9uIGRlbGVnYXRlIGZvciBYTUwgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUb2dnbGVDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUgZXh0ZW5kcyBBYnN0cmFjdENvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSB7Ci0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuVG9nZ2xlQ29tbWVudF9sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoWE1MVUlNZXNzYWdlcy5Ub2dnbGVDb21tZW50X3Rvb2x0aXApOwotCQkJYWN0aW9uLnNldERlc2NyaXB0aW9uKFhNTFVJTWVzc2FnZXMuVG9nZ2xlQ29tbWVudF9kZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci0KLQl2b2lkIHByb2Nlc3NBY3Rpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCS8vIGdldCB0ZXh0IHNlbGVjdGlvbiBsaW5lcyBpbmZvCi0JCWludCBzZWxlY3Rpb25TdGFydExpbmUgPSB0ZXh0U2VsZWN0aW9uLmdldFN0YXJ0TGluZSgpOwotCQlpbnQgc2VsZWN0aW9uRW5kTGluZSA9IHRleHRTZWxlY3Rpb24uZ2V0RW5kTGluZSgpOwotCQl0cnkgewotCQkJaW50IHNlbGVjdGlvbkVuZExpbmVPZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KHNlbGVjdGlvbkVuZExpbmUpOwotCQkJaW50IHNlbGVjdGlvbkVuZE9mZnNldCA9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpOwotCi0JCQkvLyBhZGp1c3Qgc2VsZWN0aW9uIGVuZCBsaW5lCi0JCQlpZiAoKHNlbGVjdGlvbkVuZExpbmUgPiBzZWxlY3Rpb25TdGFydExpbmUpICYmIChzZWxlY3Rpb25FbmRMaW5lT2Zmc2V0ID09IHNlbGVjdGlvbkVuZE9mZnNldCkpIHsKLQkJCQlzZWxlY3Rpb25FbmRMaW5lLS07Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0KLQkJLy8gc2F2ZSB0aGUgc2VsZWN0aW9uIHBvc2l0aW9uIHNpbmNlIGl0IHdpbGwgYmUgY2hhbmdpbmcKLQkJUG9zaXRpb24gc2VsZWN0aW9uUG9zaXRpb24gPSBudWxsOwotCQlib29sZWFuIHVwZGF0ZVN0YXJ0T2Zmc2V0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzZWxlY3Rpb25Qb3NpdGlvbiA9IG5ldyBQb3NpdGlvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCWRvY3VtZW50LmFkZFBvc2l0aW9uKHNlbGVjdGlvblBvc2l0aW9uKTsKLQotCQkJLy8gZXh0cmEgY2hlY2sgaWYgY29tbWVudGluZyBmcm9tIGJlZ2lubmluZyBvZiBsaW5lCi0JCQlpbnQgc2VsZWN0aW9uU3RhcnRMaW5lT2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChzZWxlY3Rpb25TdGFydExpbmUpOwotCQkJaWYgKCh0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpID4gMCkgJiYgKHNlbGVjdGlvblN0YXJ0TGluZU9mZnNldCA9PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKSAmJiAhaXNDb21tZW50TGluZShkb2N1bWVudCwgc2VsZWN0aW9uU3RhcnRMaW5lKSkgewotCQkJCXVwZGF0ZVN0YXJ0T2Zmc2V0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0KLQkJcHJvY2Vzc0FjdGlvbihkb2N1bWVudCwgc2VsZWN0aW9uU3RhcnRMaW5lLCBzZWxlY3Rpb25FbmRMaW5lKTsKLQotCQl1cGRhdGVDdXJyZW50U2VsZWN0aW9uKHNlbGVjdGlvblBvc2l0aW9uLCBkb2N1bWVudCwgdXBkYXRlU3RhcnRPZmZzZXQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzQWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgaW50IHNlbGVjdGlvblN0YXJ0TGluZSwgaW50IHNlbGVjdGlvbkVuZExpbmUpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jdW1lbnQpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBYTUxVSU1lc3NhZ2VzLlRvZ2dsZUNvbW1lbnRfdG9vbHRpcCk7Ci0JCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQlmb3IgKGludCBpID0gc2VsZWN0aW9uU3RhcnRMaW5lOyBpIDw9IHNlbGVjdGlvbkVuZExpbmU7IGkrKykgewotCQkJCQl0cnkgewotCQkJCQkJaWYgKGRvY3VtZW50LmdldExpbmVMZW5ndGgoaSkgPiAwKSB7Ci0JCQkJCQkJaWYgKGlzQ29tbWVudExpbmUoZG9jdW1lbnQsIGkpKSB7Ci0JCQkJCQkJCWludCBsaW5lT2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChpKTsKLQkJCQkJCQkJSVJlZ2lvbiByZWdpb24gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb24oaSk7Ci0JCQkJCQkJCVN0cmluZyBzdHJpbmcgPSBkb2N1bWVudC5nZXQocmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJCQlpbnQgb3BlbkNvbW1lbnRPZmZzZXQgPSBsaW5lT2Zmc2V0ICsgc3RyaW5nLmluZGV4T2YoT1BFTl9DT01NRU5UKTsKLQkJCQkJCQkJaW50IGNsb3NlQ29tbWVudE9mZnNldCA9IGxpbmVPZmZzZXQgKyBzdHJpbmcuaW5kZXhPZihDTE9TRV9DT01NRU5UKSAtIE9QRU5fQ09NTUVOVC5sZW5ndGgoKTsKLQkJCQkJCQkJdW5jb21tZW50KGRvY3VtZW50LCBvcGVuQ29tbWVudE9mZnNldCwgY2xvc2VDb21tZW50T2Zmc2V0KTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWludCBvcGVuQ29tbWVudE9mZnNldCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQoaSk7Ci0JCQkJCQkJCWludCBsaW5lRGVsaW1pdGVyTGVuZ3RoID0gZG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcihpKSA9PSBudWxsID8gMCA6IGRvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIoaSkubGVuZ3RoKCk7Ci0JCQkJCQkJCWludCBjbG9zZUNvbW1lbnRPZmZzZXQgPSBvcGVuQ29tbWVudE9mZnNldCArIGRvY3VtZW50LmdldExpbmVMZW5ndGgoaSkgLSBsaW5lRGVsaW1pdGVyTGVuZ3RoICsgT1BFTl9DT01NRU5ULmxlbmd0aCgpOwotCQkJCQkJCQljb21tZW50KGRvY3VtZW50LCBvcGVuQ29tbWVudE9mZnNldCwgY2xvc2VDb21tZW50T2Zmc2V0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCW1vZGVsLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0NvbW1lbnRMaW5lKElEb2N1bWVudCBkb2N1bWVudCwgaW50IGxpbmUpIHsKLQkJYm9vbGVhbiBpc0NvbW1lbnQgPSBmYWxzZTsKLQotCQl0cnkgewotCQkJSVJlZ2lvbiByZWdpb24gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb24obGluZSk7Ci0JCQlTdHJpbmcgc3RyaW5nID0gZG9jdW1lbnQuZ2V0KHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpKS50cmltKCk7Ci0JCQlpc0NvbW1lbnQgPSAoc3RyaW5nLmxlbmd0aCgpID49IE9QRU5fQ09NTUVOVC5sZW5ndGgoKSArIENMT1NFX0NPTU1FTlQubGVuZ3RoKCkpICYmIHN0cmluZy5zdGFydHNXaXRoKE9QRU5fQ09NTUVOVCkgJiYgc3RyaW5nLmVuZHNXaXRoKENMT1NFX0NPTU1FTlQpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIGlzQ29tbWVudDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tbWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvcGVuQ29tbWVudE9mZnNldCwgaW50IGNsb3NlQ29tbWVudE9mZnNldCkgewotCQl0cnkgewotCQkJZG9jdW1lbnQucmVwbGFjZShvcGVuQ29tbWVudE9mZnNldCwgMCwgT1BFTl9DT01NRU5UKTsKLQkJCWRvY3VtZW50LnJlcGxhY2UoY2xvc2VDb21tZW50T2Zmc2V0LCAwLCBDTE9TRV9DT01NRU5UKTsKLQkJCXJlbW92ZU9wZW5DbG9zZUNvbW1lbnRzKGRvY3VtZW50LCBvcGVuQ29tbWVudE9mZnNldCArIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgY2xvc2VDb21tZW50T2Zmc2V0IC0gb3BlbkNvbW1lbnRPZmZzZXQgLSBDTE9TRV9DT01NRU5ULmxlbmd0aCgpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVuY29tbWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvcGVuQ29tbWVudE9mZnNldCwgaW50IGNsb3NlQ29tbWVudE9mZnNldCkgewotCQl0cnkgewotCQkJZG9jdW1lbnQucmVwbGFjZShvcGVuQ29tbWVudE9mZnNldCwgT1BFTl9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWRvY3VtZW50LnJlcGxhY2UoY2xvc2VDb21tZW50T2Zmc2V0LCBDTE9TRV9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUN1cnJlbnRTZWxlY3Rpb24oUG9zaXRpb24gc2VsZWN0aW9uUG9zaXRpb24sIElEb2N1bWVudCBkb2N1bWVudCwgYm9vbGVhbiB1cGRhdGVTdGFydE9mZnNldCkgewotCQlpZiAoZkVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQkvLyB1cGRhdGUgdGhlIHNlbGVjdGlvbiBpZiB0ZXh0IHNlbGVjdGlvbiBjaGFuZ2VkCi0JCQlpZiAoc2VsZWN0aW9uUG9zaXRpb24gIT0gbnVsbCkgewotCQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0JCQkJaWYgKHVwZGF0ZVN0YXJ0T2Zmc2V0KSB7Ci0JCQkJCXNlbGVjdGlvbiA9IG5ldyBUZXh0U2VsZWN0aW9uKGRvY3VtZW50LCBzZWxlY3Rpb25Qb3NpdGlvbi5nZXRPZmZzZXQoKSAtIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgc2VsZWN0aW9uUG9zaXRpb24uZ2V0TGVuZ3RoKCkgKyBPUEVOX0NPTU1FTlQubGVuZ3RoKCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc2VsZWN0aW9uID0gbmV3IFRleHRTZWxlY3Rpb24oZG9jdW1lbnQsIHNlbGVjdGlvblBvc2l0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb25Qb3NpdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJCUlTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9ICgoSVRleHRFZGl0b3IpIGZFZGl0b3IpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJcHJvdmlkZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQkJfQotCQkJCWRvY3VtZW50LnJlbW92ZVBvc2l0aW9uKHNlbGVjdGlvblBvc2l0aW9uKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hdXRvZWRpdC9BdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNDE2Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYXV0b2VkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkNvbmZpZ3VyYWJsZUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JTGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBBdXRvRWRpdFN0cmF0ZWd5IHRvIGhhbmRsZSBjaGFyYWN0ZXJzIGluc2VydGVkIHdoZW4gVGFiIGtleSBpcyBwcmVzc2VkCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicyBpbXBsZW1lbnRzIElBdXRvRWRpdFN0cmF0ZWd5IHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBUQUJfQ0hBUkFDVEVSID0gIlx0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHZvaWQgY3VzdG9taXplRG9jdW1lbnRDb21tYW5kKElEb2N1bWVudCBkb2N1bWVudCwgRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJLy8gaWYgbm90IGluIHNtYXJ0IGluc2VydCBtb2RlIGp1c3QgaWdub3JlCi0JCWlmICghaXNTbWFydEluc2VydE1vZGUoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gc3BhY2VzIGZvciB0YWIgY2hhcmFjdGVyCi0JCWlmICgoY29tbWFuZC5sZW5ndGggPT0gMCkgJiYgKGNvbW1hbmQudGV4dCAhPSBudWxsKSAmJiAoY29tbWFuZC50ZXh0Lmxlbmd0aCgpID4gMCkgJiYgKGNvbW1hbmQudGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIpICE9IC0xKSkgewotCQkJc21hcnRJbnNlcnRGb3JUYWIoY29tbWFuZCwgZG9jdW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHNwYWNlcyBmb3IgdGFicwotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNtYXJ0SW5zZXJ0Rm9yVGFiKERvY3VtZW50Q29tbWFuZCBjb21tYW5kLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gdGFiIGtleSB3YXMgcHJlc3NlZC4gbm93IGNoZWNrIHByZWZlcmVuY2VzIHRvIHNlZSBpZiBuZWVkIHRvIGluc2VydAotCQkvLyBzcGFjZXMgaW5zdGVhZCBvZiB0YWIKLQkJaW50IGluZGVudGF0aW9uV2lkdGggPSBnZXRJbmRlbnRhdGlvbldpZHRoKCk7Ci0JCWlmIChpbmRlbnRhdGlvbldpZHRoID4gLTEpIHsKLQkJCVN0cmluZyBvcmlnaW5hbFRleHQgPSBjb21tYW5kLnRleHQ7Ci0JCQlTdHJpbmdCdWZmZXIgbmV3VGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIob3JpZ2luYWxUZXh0KTsKLQotCQkJLy8gZGV0ZXJtaW5lIHdoZXJlIGluIGxpbmUgdGhpcyBjb21tYW5kIGJlZ2lucwotCQkJaW50IGxpbmVPZmZzZXQgPSAtMTsKLQkJCXRyeSB7Ci0JCQkJSVJlZ2lvbiBsaW5lSW5mbyA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGNvbW1hbmQub2Zmc2V0KTsKLQkJCQlsaW5lT2Zmc2V0ID0gY29tbWFuZC5vZmZzZXQgLSBsaW5lSW5mby5nZXRPZmZzZXQoKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCi0JCQlJTGluZVRyYWNrZXIgbGluZVRyYWNrZXIgPSBnZXRMaW5lVHJhY2tlcihkb2N1bWVudCwgb3JpZ2luYWxUZXh0KTsKLQotCQkJaW50IHN0YXJ0SW5kZXggPSAwOwotCQkJaW50IGluZGV4ID0gbmV3VGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIpOwotCQkJd2hpbGUgKGluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGluZGVudCA9IGdldEluZGVudFN0cmluZyhpbmRlbnRhdGlvbldpZHRoLCBsaW5lT2Zmc2V0LCBsaW5lVHJhY2tlciwgaW5kZXgpOwotCi0JCQkJLy8gcmVwbGFjZSBcdCBjaGFyYWN0ZXIgd2l0aCBzcGFjZXMKLQkJCQluZXdUZXh0LnJlcGxhY2UoaW5kZXgsIGluZGV4ICsgMSwgaW5kZW50KTsKLQkJCQlpZiAobGluZVRyYWNrZXIgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJbGluZVRyYWNrZXIucmVwbGFjZShpbmRleCwgMSwgaW5kZW50KTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJLy8gaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCByZXBsYWNpbmcgdGV4dCwganVzdAotCQkJCQkJLy8gcmVzZXQgdG8gY3VycmVudCBzdHJpbmcKLQkJCQkJCWxpbmVUcmFja2VyLnNldChuZXdUZXh0LnRvU3RyaW5nKCkpOwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJc3RhcnRJbmRleCA9IGluZGV4ICsgaW5kZW50Lmxlbmd0aCgpOwotCQkJCWluZGV4ID0gbmV3VGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIsIHN0YXJ0SW5kZXgpOwotCQkJfQotCQkJY29tbWFuZC50ZXh0ID0gbmV3VGV4dC50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIG51bWJlciBvZiBzcGFjZXMgZm9yIG5leHQgdGFiIHN0b3AKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRJbmRlbnRTdHJpbmcoaW50IGluZGVudGF0aW9uV2lkdGgsIGludCBsaW5lT2Zmc2V0LCBJTGluZVRyYWNrZXIgbGluZVRyYWNrZXIsIGludCBpbmRleCkgewotCQlpbnQgaW5kZW50U2l6ZSA9IGluZGVudGF0aW9uV2lkdGg7Ci0JCWludCBvZmZzZXRJbkxpbmUgPSAtMTsKLQkJaWYgKGxpbmVUcmFja2VyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSVJlZ2lvbiBsaW5lSW5mbyA9IGxpbmVUcmFja2VyLmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGluZGV4KTsKLQkJCQlpZiAoKGxpbmVJbmZvLmdldE9mZnNldCgpID09IDApICYmIChsaW5lT2Zmc2V0ID4gLTEpKSB7Ci0JCQkJCW9mZnNldEluTGluZSA9IGxpbmVPZmZzZXQgKyBpbmRleDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW9mZnNldEluTGluZSA9IGluZGV4IC0gbGluZUluZm8uZ2V0T2Zmc2V0KCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAobGluZU9mZnNldCA+IC0xKSB7Ci0JCQkJb2Zmc2V0SW5MaW5lID0gbGluZU9mZnNldCArIGluZGV4OwotCQkJfQotCQl9Ci0JCWlmICgob2Zmc2V0SW5MaW5lID4gLTEpICYmIChpbmRlbnRhdGlvbldpZHRoID4gMCkpIHsKLQkJCWludCByZW1haW5kZXIgPSBvZmZzZXRJbkxpbmUgJSBpbmRlbnRhdGlvbldpZHRoOwotCQkJaW5kZW50U2l6ZSA9IGluZGVudGF0aW9uV2lkdGggLSByZW1haW5kZXI7Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudFNpemU7IGkrKykgewotCQkJaW5kZW50LmFwcGVuZCgnICcpOwotCQl9Ci0JCXJldHVybiBpbmRlbnQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdXAgYSBsaW5lIHRyYWNrZXIgZm9yIHRleHQgd2l0aGluIGNvbW1hbmQgaWYgdGV4dCBpcyBtdWx0aS1saW5lCi0JICovCi0JcHJpdmF0ZSBJTGluZVRyYWNrZXIgZ2V0TGluZVRyYWNrZXIoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgb3JpZ2luYWxUZXh0KSB7Ci0JCUNvbmZpZ3VyYWJsZUxpbmVUcmFja2VyIGxpbmVUcmFja2VyID0gbnVsbDsKLQkJaW50W10gZGVsaW1zID0gVGV4dFV0aWxpdGllcy5pbmRleE9mKGRvY3VtZW50LmdldExlZ2FsTGluZURlbGltaXRlcnMoKSwgb3JpZ2luYWxUZXh0LCAwKTsKLQkJaWYgKChkZWxpbXNbMF0gIT0gLTEpIHx8IChkZWxpbXNbMV0gIT0gLTEpKSB7Ci0JCQlsaW5lVHJhY2tlciA9IG5ldyBDb25maWd1cmFibGVMaW5lVHJhY2tlcihkb2N1bWVudC5nZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCkpOwotCQkJbGluZVRyYWNrZXIuc2V0KG9yaWdpbmFsVGV4dCk7Ci0JCX0KLQkJcmV0dXJuIGxpbmVUcmFja2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGFjdGl2ZSBlZGl0b3IgaXMgaW4gc21hcnQgaW5zZXJ0IG1vZGUsIGZhbHNlIG90aGVyd2lzZQotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1NtYXJ0SW5zZXJ0TW9kZSgpIHsKLQkJYm9vbGVhbiBpc1NtYXJ0SW5zZXJ0TW9kZSA9IGZhbHNlOwotCi0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3I7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBpZiBzbWFydCBpbnNlcnQgbW9kZQotCQlpZiAoKHRleHRFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvckV4dGVuc2lvbjMpICYmICgoKElUZXh0RWRpdG9yRXh0ZW5zaW9uMykgdGV4dEVkaXRvcikuZ2V0SW5zZXJ0TW9kZSgpID09IElUZXh0RWRpdG9yRXh0ZW5zaW9uMy5TTUFSVF9JTlNFUlQpKSB7Ci0JCQlpc1NtYXJ0SW5zZXJ0TW9kZSA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGlzU21hcnRJbnNlcnRNb2RlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgaW5kZW50YXRpb24gd2lkdGggaWYgdXNpbmcgc3BhY2VzIGZvciBpbmRlbnRhdGlvbiwgLTEgb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwcml2YXRlIGludCBnZXRJbmRlbnRhdGlvbldpZHRoKCkgewotCQlpbnQgd2lkdGggPSAtMTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFLmVxdWFscyhwcmVmZXJlbmNlcy5nZXRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKSkpIHsKLQkJCXdpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0JCX0KLQotCQlyZXR1cm4gd2lkdGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L1N0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5WE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY2MTllNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hdXRvZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQXV0b21hdGljYWxseSBpbnNlcnRzIGNsb3NpbmcgY29tbWVudCB0YWcgb3IgZW5kIHRhZyB3aGVuIGFwcHJvcHJpYXRlLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lYTUwgaW1wbGVtZW50cyBJQXV0b0VkaXRTdHJhdGVneSB7Ci0JLyoKLQkgKiBOT1RFOiBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdHMgaW4KLQkgKiBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmF1dG9lZGl0Ci0JICogb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuYXV0b2VkaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjdXN0b21pemVEb2N1bWVudENvbW1hbmQoSURvY3VtZW50IGRvY3VtZW50LCBEb2N1bWVudENvbW1hbmQgY29tbWFuZCkgewotCQlPYmplY3QgdGV4dEVkaXRvciA9IGdldEFjdGl2ZVRleHRFZGl0b3IoKTsKLQkJaWYgKCEoKHRleHRFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvckV4dGVuc2lvbjMpICYmICgoKElUZXh0RWRpdG9yRXh0ZW5zaW9uMykgdGV4dEVkaXRvcikuZ2V0SW5zZXJ0TW9kZSgpID09IElUZXh0RWRpdG9yRXh0ZW5zaW9uMy5TTUFSVF9JTlNFUlQpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlpZiAoY29tbWFuZC50ZXh0ICE9IG51bGwpIHsKLQkJCQkJc21hcnRJbnNlcnRGb3JDb21tZW50KGNvbW1hbmQsIGRvY3VtZW50LCBtb2RlbCk7Ci0JCQkJCXNtYXJ0SW5zZXJ0Rm9yRW5kVGFnKGNvbW1hbmQsIGRvY3VtZW50LCBtb2RlbCk7Ci0JCQkJCXNtYXJ0UmVtb3ZlRW5kVGFnKGNvbW1hbmQsIGRvY3VtZW50LCBtb2RlbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNQcmVmZXJlbmNlRW5hYmxlZChTdHJpbmcga2V5KSB7Ci0JCXJldHVybiAoa2V5ICE9IG51bGwgJiYgWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oa2V5KSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudE5vZGUoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gKChub2RlICE9IG51bGwpICYmIChub2RlIGluc3RhbmNlb2YgSURPTUVsZW1lbnQpICYmICgoSURPTUVsZW1lbnQpIG5vZGUpLmlzQ29tbWVudFRhZygpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEb2N1bWVudE5vZGUoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSk7Ci0JfQotCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gY2xlYW4gdXAgYW4gZW5kLXRhZyBpZiBhIHN0YXJ0LXRhZyBpcyBjb252ZXJ0ZWQgaW50byBhbiBlbXB0eS1lbGVtZW50Ci0JICogdGFnIChlLmcuLCA8bm9kZSAvPikgYW5kIHRoZSBvcmlnaW5hbCBlbGVtZW50IHdhcyBlbXB0eS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZCB0aGUgZG9jdW1lbnQgY29tbWFuZCBkZXNjcmliaW5nIHRoZSBjaGFuZ2UKLQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IHRoYXQgd2lsbCBiZSBjaGFuZ2VkCi0JICogQHBhcmFtIG1vZGVsIHRoZSBtb2RlbCBiYXNlZCBvbiB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc21hcnRSZW1vdmVFbmRUYWcoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQl0cnkgewotCQkJLy8gQW4gb3BlbmluZyB0YWcgaXMgbm93IGEgc2VsZi10ZXJtaW5hdGVkIGVuZC10YWcKLQkJCWlmICgiLyIuZXF1YWxzKGNvbW1hbmQudGV4dCkgJiYgIj4iLmVxdWFscyhkb2N1bWVudC5nZXQoY29tbWFuZC5vZmZzZXQsIDEpKSAmJiBpc1ByZWZlcmVuY2VFbmFibGVkKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19SRU1PVkVfRU5EX1RBR1MpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIG1vZGVsLmdldEluZGV4ZWRSZWdpb24oY29tbWFuZC5vZmZzZXQpOwotCQkJCWlmIChub2RlICE9IG51bGwgJiYgIW5vZGUuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQkJCQlpZiAocmVnaW9uICE9IG51bGwgJiYgcmVnaW9uLmlzRW5kZWQoKSkKLQkJCQkJCWRvY3VtZW50LnJlcGxhY2UocmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNtYXJ0SW5zZXJ0Rm9yQ29tbWVudChEb2N1bWVudENvbW1hbmQgY29tbWFuZCwgSURvY3VtZW50IGRvY3VtZW50LCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoY29tbWFuZC50ZXh0LmVxdWFscygiLSIpICYmIChkb2N1bWVudC5nZXRMZW5ndGgoKSA+PSAzKSAmJiBkb2N1bWVudC5nZXQoY29tbWFuZC5vZmZzZXQgLSAzLCAzKS5lcXVhbHMoIjwhLSIpICYmIGlzUHJlZmVyZW5jZUVuYWJsZWQoWE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0NPTU1FTlRTKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQljb21tYW5kLnRleHQgKz0gIiAgLS0+IjsgLy8kTk9OLU5MUy0xJAotCQkJCWNvbW1hbmQuc2hpZnRzQ2FyZXQgPSBmYWxzZTsKLQkJCQljb21tYW5kLmNhcmV0T2Zmc2V0ID0gY29tbWFuZC5vZmZzZXQgKyAyOwotCQkJCWNvbW1hbmQuZG9pdCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc21hcnRJbnNlcnRGb3JFbmRUYWcoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQl0cnkgewotCQkJaWYgKGNvbW1hbmQudGV4dC5lcXVhbHMoIi8iKSAmJiAoZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPj0gMSkgJiYgZG9jdW1lbnQuZ2V0KGNvbW1hbmQub2Zmc2V0IC0gMSwgMSkuZXF1YWxzKCI8IikgJiYgaXNQcmVmZXJlbmNlRW5hYmxlZChYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfRU5EX1RBR1MpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUlET01Ob2RlIHBhcmVudE5vZGUgPSAoSURPTU5vZGUpICgoSURPTU5vZGUpIG1vZGVsLmdldEluZGV4ZWRSZWdpb24oY29tbWFuZC5vZmZzZXQgLSAxKSkuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChpc0NvbW1lbnROb2RlKHBhcmVudE5vZGUpKSB7Ci0JCQkJCS8vIGxvb3AgYW5kIGZpbmQgbm9uIGNvbW1lbnQgbm9kZSBwYXJlbnQKLQkJCQkJd2hpbGUgKChwYXJlbnROb2RlICE9IG51bGwpICYmIGlzQ29tbWVudE5vZGUocGFyZW50Tm9kZSkpIHsKLQkJCQkJCXBhcmVudE5vZGUgPSAoSURPTU5vZGUpIHBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKCFpc0RvY3VtZW50Tm9kZShwYXJlbnROb2RlKSkgewotCQkJCQkvLyBvbmx5IGFkZCBlbmQgdGFnIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IG9yIGlmCi0JCQkJCS8vIGFkZCAnLycgZG9lcyBub3QgY3JlYXRlIG9uZSBhbHJlYWR5Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gcGFyZW50Tm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJaWYgKGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgdG9BZGQgPSBuZXcgU3RyaW5nQnVmZmVyKHBhcmVudE5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJCQlpZiAodG9BZGQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJdG9BZGQuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgc3VmZml4ID0gdG9BZGQudG9TdHJpbmcoKTsKLQkJCQkJCQlpZiAoKGRvY3VtZW50LmdldExlbmd0aCgpIDwgY29tbWFuZC5vZmZzZXQgKyBzdWZmaXgubGVuZ3RoKCkpIHx8ICghc3VmZml4LmVxdWFscyhkb2N1bWVudC5nZXQoY29tbWFuZC5vZmZzZXQsIHN1ZmZpeC5sZW5ndGgoKSkpKSkgewotCQkJCQkJCQljb21tYW5kLnRleHQgKz0gc3VmZml4OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWN0aXZlIHRleHQgZWRpdG9yIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgdGhlIGFjdGl2ZSBlZGl0b3IKLQkgKiBwYXJ0LgotCSAqIAotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0QWN0aXZlVGV4dEVkaXRvcigpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJCQkJcmV0dXJuIGVkaXRvcjsKLQkJCQkJfQotCQkJCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQkJCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiB0ZXh0RWRpdG9yOwotCQkJCQl9Ci0JCQkJCXJldHVybiBlZGl0b3I7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0Fic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYWViZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRW50aXR5RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01OYW1lZE5vZGVNYXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkF0dHJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuQ01JbWFnZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWdpbmZvLk1hcmt1cFRhZ0luZm9Qcm92aWRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yIGltcGxlbWVudHMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IsIElSZWxlYXNhYmxlIHsKLQkvKioKLQkgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0JICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24KLQkgKiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5IHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9DTE9TRSA9ICJKU1BfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9DTE9TRSA9ICJKU1BfQ09NTUVOVF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfT1BFTiA9ICJKU1BfQ09NTUVOVF9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RFQ0xBUkFUSU9OX09QRU4gPSAiSlNQX0RFQ0xBUkFUSU9OX09QRU4iOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX0NMT1NFID0gIkpTUF9ESVJFQ1RJVkVfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX05BTUUgPSAiSlNQX0RJUkVDVElWRV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX09QRU4gPSAiSlNQX0RJUkVDVElWRV9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VYUFJFU1NJT05fT1BFTiA9ICJKU1BfRVhQUkVTU0lPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUk9PVF9UQUdfTkFNRSA9ICJKU1BfUk9PVF9UQUdfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1NDUklQVExFVF9PUEVOID0gIkpTUF9TQ1JJUFRMRVRfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSTkFMRVJST1IgPSBYTUxVSU1lc3NhZ2VzLlNFVkVSRV9pbnRlcm5hbF9lcnJvcl9vY2N1X1VJXzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX0FUVFIgPSBYTUxVSU1lc3NhZ2VzLk5vX2tub3duX2F0dHJpYnV0ZV9fVUlfOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVOS05PV05fQ09OVEVYVCA9IFhNTFVJTWVzc2FnZXMuQ29udGVudF9Bc3Npc3Rfbm90X2F2YWlsYWJfVUlfOwotCXByb3RlY3RlZCBjaGFyIGNvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyc1tdID0gbnVsbDsKLQlwcm90ZWN0ZWQgY2hhciBjb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnNbXSA9IG51bGw7Ci0JcHJpdmF0ZSBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25Qcm92aWRlciBmQXR0cmlidXRlSW5mb1Byb3ZpZGVyID0gbnVsbDsKLQlwcml2YXRlIEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlciBmQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgZkVycm9yTWVzc2FnZSA9IG51bGw7Ci0JcHJvdGVjdGVkIFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvciBmR2VuZXJhdG9yOwotCS8vIHByb3RlY3RlZCBJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCXByb3RlY3RlZCBNYXJrdXBUYWdJbmZvUHJvdmlkZXIgZkluZm9Qcm92aWRlciA9IG51bGw7Ci0JcHJvdGVjdGVkIElUZXh0Vmlld2VyIGZUZXh0Vmlld2VyID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBzaG93VmFsdWVzID0gdHJ1ZTsKLQotCXB1YmxpYyBBYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCWluaXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCS8vIHJldHJpZXZlIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihub2RlKTsKLQkJaWYgKGVsZW1lbnREZWNsICE9IG51bGwpIHsKLQkJCUNNTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50RGVjbC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkKLQkJCUNNTmFtZWROb2RlTWFwSW1wbCBhbGxBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbChhdHRyaWJ1dGVzKTsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlMaXN0IG5vZGVzID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShub2RlLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QXZhaWxhYmxlQ29udGVudCgoRWxlbWVudCkgbm9kZSwgZWxlbWVudERlY2wsIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IG5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQkJCUNNTm9kZSBjbW5vZGUgPSAoQ01Ob2RlKSBub2Rlcy5nZXQoayk7Ci0JCQkJCWlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCQlhbGxBdHRyaWJ1dGVzLnB1dChjbW5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJYXR0cmlidXRlcyA9IGFsbEF0dHJpYnV0ZXM7Ci0KLQkJCVN0cmluZyBtYXRjaFN0cmluZyA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCk7Ci0KLQkJCS8vIGNoZWNrIHdoZXRoZXIgYW4gYXR0cmlidXRlIHJlYWxseSBleGlzdHMgZm9yIHRoZSByZXBsYWNlbWVudAotCQkJLy8gb2Zmc2V0cyBBTkQgaWYgaXQgcG9zc2Vzc2VzIGEgdmFsdWUKLQkJCWJvb2xlYW4gYXR0ckF0TG9jYXRpb25IYXNWYWx1ZSA9IGZhbHNlOwotCQkJTmFtZWROb2RlTWFwIGF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlBdHRySW1wbCBleGlzdGluZ0F0dHIgPSAoQXR0ckltcGwpIGF0dHJzLml0ZW0oaSk7Ci0JCQkJSVRleHRSZWdpb24gbmFtZSA9IGV4aXN0aW5nQXR0ci5nZXROYW1lUmVnaW9uKCk7Ci0KLQkJCQlpZiAoKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWUpIDw9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpKSAmJiAoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZSkgKyBuYW1lLmdldExlbmd0aCgpID49IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpICsgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSkgJiYgKGV4aXN0aW5nQXR0ci5nZXRWYWx1ZVJlZ2lvbigpICE9IG51bGwpKSB7Ci0JCQkJCWF0dHJBdExvY2F0aW9uSGFzVmFsdWUgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG9ubHkgYWRkIHByb3Bvc2FscyBmb3IgdGhlIGF0dHJpYnV0ZXMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aAotCQkJLy8gdGhlIG1hdGNoc3RyaW5nCi0JCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0KLQkJCQkJaW50IGlzUmVxdWlyZWQgPSAwOwotCQkJCQlpZiAoYXR0ckRlY2wuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKSB7Ci0JCQkJCQlpc1JlcXVpcmVkID0gWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfUkVRVUlSRUQ7Ci0JCQkJCX0KLQotCQkJCQlib29sZWFuIHNob3dBdHRyaWJ1dGUgPSB0cnVlOwotCQkJCQlzaG93QXR0cmlidXRlID0gc2hvd0F0dHJpYnV0ZSAmJiBiZWdpbnNXaXRoKGdldFJlcXVpcmVkTmFtZShub2RlLCBhdHRyRGVjbCksIG1hdGNoU3RyaW5nLnRyaW0oKSk7Ci0JCQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShnZXRSZXF1aXJlZE5hbWUobm9kZSwgYXR0ckRlY2wpKTsKLQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGF0dHIgIT0gbnVsbCA/IGF0dHIuZ2V0TmFtZVJlZ2lvbigpIDogbnVsbDsKLQkJCQkJLy8gbmFtZVJlZ2lvbi5nZXRFbmRPZmZzZXQoKSArIDEgaXMgcmVxdWlyZWQgdG8gYWxsb3cgZm9yCi0JCQkJCS8vIG1hdGNoZXMgYWdhaW5zdCB0aGUgZnVsbCBuYW1lIG9mIGFuIGV4aXN0aW5nIEF0dHIKLQkJCQkJc2hvd0F0dHJpYnV0ZSA9IHNob3dBdHRyaWJ1dGUgJiYgKChhdHRyID09IG51bGwpIHx8ICgobmFtZVJlZ2lvbiAhPSBudWxsKSAmJiAoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZVJlZ2lvbikgPD0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkpICYmIChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKSArIG5hbWVSZWdpb24uZ2V0TGVuZ3RoKCkgPj0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkgKyBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpKSkpOwotCQkJCQlpZiAoc2hvd0F0dHJpYnV0ZSkgewotCQkJCQkJSW1hZ2UgYXR0ckltYWdlID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2UoYXR0ckRlY2wpOwotCQkJCQkJaWYgKGF0dHJJbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQkJaWYgKGlzUmVxdWlyZWQgPiAwKSB7Ci0JCQkJCQkJCWF0dHJJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQVRUX1JFUV9PQkopOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJYXR0ckltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRSSUJVVEUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9IG51bGw7Ci0JCQkJCQlTdHJpbmcgcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8oZWxlbWVudERlY2wsIGF0dHJEZWNsKTsKLQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG51bGw7Ci0JCQkJCQkvLyBhdHRyaWJ1dGUgaXMgYXQgdGhpcyBsb2NhdGlvbiBhbmQgYWxyZWFkeSBleGlzdHMKLQkJCQkJCWlmIChhdHRyQXRMb2NhdGlvbkhhc1ZhbHVlKSB7Ci0JCQkJCQkJLy8gb25seSBwcm9wb3NlIHRoZSBuYW1lCi0JCQkJCQkJcHJvcG9zZWRUZXh0ID0gZ2V0UmVxdWlyZWROYW1lKG5vZGUsIGF0dHJEZWNsKTsKLQkJCQkJCQlwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgcHJvcG9zZWRUZXh0Lmxlbmd0aCgpLCBhdHRySW1hZ2UsIHByb3Bvc2VkVGV4dCwgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9YTUxfQVRUUklCVVRFX05BTUUgKyBpc1JlcXVpcmVkLCB0cnVlKTsKLQkJCQkJCX0KLQkJCQkJCS8vIG5vIGF0dHJpYnV0ZSBleGlzdHMgb3IgaXMgZWxzZXdoZXJlLCBnZW5lcmF0ZQotCQkJCQkJLy8gbWluaW1hbGx5Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlBdHRyIGV4aXN0aW5nQXR0ck5vZGUgPSAoQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGdldFJlcXVpcmVkTmFtZShub2RlLCBhdHRyRGVjbCkpOwotCQkJCQkJCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCQkJCQkJaWYgKGV4aXN0aW5nQXR0ck5vZGUgIT0gbnVsbCkgewotCQkJCQkJCQl2YWx1ZSA9IGV4aXN0aW5nQXR0ck5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYgKHZhbHVlLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCQkJcHJvcG9zZWRUZXh0ID0gZ2V0UmVxdWlyZWROYW1lKG5vZGUsIGF0dHJEZWNsKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCXByb3Bvc2VkVGV4dCA9IGdldFJlcXVpcmVkVGV4dChub2RlLCBhdHRyRGVjbCk7Ci0JCQkJCQkJfQotCQkJCQkJCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBhdHRyRGVjbC5nZXROb2RlTmFtZSgpLmxlbmd0aCgpICsgMiwgYXR0ckltYWdlLAotCQkJCQkJCS8vIGlmIHRoZSB2YWx1ZSBpc24ndCBlbXB0eSAobm8gZW1wdHkgc2V0IG9mCi0JCQkJCQkJCQkJLy8gcXVvdGVzKSwgc2hvdyBpdAotCQkJCQkJCS8vIEJVRyAyMDM0OTQsIGNvbnRlbnQgc3RyaW5ncyBtYXkgaGF2ZSAiIiwgYnV0IG5vdCBiZSBlbXB0eQotCQkJCQkJCS8vIEFuIGVtcHR5IHN0cmluZyBpcyB3aGVuIHRoZXJlJ3Mgbm8gY29udGVudCBiZXR3ZWVuIGRvdWJsZSBxdW90ZXMKLQkJCQkJCQkvLyBhbmQgdGhlcmUgaXMgbm8gc2luZ2xlIHF1b3RlIHRoYXQgbWF5IGJlIGVuY2FzaW5nIGEgZG91YmxlIHF1b3RlCi0JCQkJCQkJCQkJKHNob3dWYWx1ZXMgJiYgKHByb3Bvc2VkVGV4dC5sYXN0SW5kZXhPZignXCInKSAtIHByb3Bvc2VkVGV4dC5pbmRleE9mKCdcIicpID09ICAxICYmIHByb3Bvc2VkVGV4dC5pbmRleE9mKCdcJycpID09IC0xKSkgPyBnZXRSZXF1aXJlZE5hbWUobm9kZSwgYXR0ckRlY2wpIDogcHJvcG9zZWRUZXh0LAotCQkJCQkJCQkJCW51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfWE1MX0FUVFJJQlVURV9OQU1FICsgaXNSZXF1aXJlZCk7Ci0JCQkJCQl9Ci0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5FbGVtZW50X19pc191bmtub3duLCAobmV3IE9iamVjdFtde25vZGUuZ2V0Tm9kZU5hbWUoKX0pKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCi0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKTsKLQotCQkvLyBGaW5kIHRoZSBhdHRyaWJ1dGUgcmVnaW9uIGFuZCBuYW1lIGZvciB3aGljaCB0aGlzIHBvc2l0aW9uIHNob3VsZAotCQkvLyBoYXZlIGEgdmFsdWUgcHJvcG9zZWQKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvcGVuID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJVGV4dFJlZ2lvbkxpc3Qgb3BlblJlZ2lvbnMgPSBvcGVuLmdldFJlZ2lvbnMoKTsKLQkJaW50IGkgPSBvcGVuUmVnaW9ucy5pbmRleE9mKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpKTsKLQkJaWYgKGkgPCAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChpID49IDApIHsKLQkJCW5hbWVSZWdpb24gPSBvcGVuUmVnaW9ucy5nZXQoaS0tKTsKLQkJCWlmIChuYW1lUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8vIHRoZSBuYW1lIHJlZ2lvbiBpcyBSRVFVSVJFRCB0byBkbyBhbnl0aGluZyB1c2VmdWwKLQkJaWYgKG5hbWVSZWdpb24gIT0gbnVsbCkgewotCQkJLy8gUmV0cmlldmUgdGhlIGRlY2xhcmF0aW9uCi0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKG5vZGUpOwotCi0JCQkvLyBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IG5hbWVSZWdpb24uZ2V0VGV4dCgpOwotCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBvcGVuLmdldFRleHQobmFtZVJlZ2lvbik7Ci0KLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSBudWxsOwotCi0JCQkvLyBObyBDTUVsZW1lbnREZWNsYXJhdGlvbiBtZWFucyBubyBhdHRyaWJ1dGUgbWV0YWRhdGEsIGJ1dAotCQkJLy8gcmV0cmlldmUgdGhlCi0JCQkvLyBkZWNsYXJhdGlvbiBmb3IgdGhlIGF0dHJpYnV0ZSBvdGhlcndpc2UKLQkJCWlmIChlbGVtZW50RGVjbCAhPSBudWxsKSB7Ci0JCQkJQ01OYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkJCUNNTmFtZWROb2RlTWFwSW1wbCBhbGxBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbChhdHRyaWJ1dGVzKSB7Ci0JCQkJCXByaXZhdGUgTWFwIGNhc2VJbnNlbnNpdGl2ZTsKLQkJCQkJCi0JCQkJCXByaXZhdGUgTWFwIGdldENhc2VJbnNlbnNpdGl2ZU1hcCgpIHsKLQkJCQkJCWlmKGNhc2VJbnNlbnNpdGl2ZSA9PSBudWxsKQotCQkJCQkJCWNhc2VJbnNlbnNpdGl2ZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCQlyZXR1cm4gY2FzZUluc2Vuc2l0aXZlOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJCQkJCUNNTm9kZSBub2RlID0gc3VwZXIuZ2V0TmFtZWRJdGVtKG5hbWUpOwotCQkJCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCQkJCW5vZGUgPSAoQ01Ob2RlKSBnZXRDYXNlSW5zZW5zaXRpdmVNYXAoKS5nZXQobmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBub2RlOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgcHV0KENNTm9kZSBjbU5vZGUpIHsKLQkJCQkJCXN1cGVyLnB1dChjbU5vZGUpOwotCQkJCQkJZ2V0Q2FzZUluc2Vuc2l0aXZlTWFwKCkucHV0KGNtTm9kZS5nZXROb2RlTmFtZSgpLnRvTG93ZXJDYXNlKExvY2FsZS5VUyksIGNtTm9kZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJTGlzdCBub2RlcyA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEF2YWlsYWJsZUNvbnRlbnQoKEVsZW1lbnQpIG5vZGUsIGVsZW1lbnREZWNsLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbm9kZXMuc2l6ZSgpOyBrKyspIHsKLQkJCQkJCUNNTm9kZSBjbW5vZGUgPSAoQ01Ob2RlKSBub2Rlcy5nZXQoayk7Ci0JCQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCQkJCWFsbEF0dHJpYnV0ZXMucHV0KGNtbm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYXR0cmlidXRlcyA9IGFsbEF0dHJpYnV0ZXM7Ci0KLQkJCQlTdHJpbmcgbm9wcmVmaXhOYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKGF0dHJpYnV0ZU5hbWUpOwotCQkJCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCQkJYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0obm9wcmVmaXhOYW1lKTsKLQkJCQkJaWYgKGF0dHJEZWNsID09IG51bGwpIHsKLQkJCQkJCWF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChhdHRyRGVjbCA9PSBudWxsKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShVTktOT1dOX0FUVFIsIGF0dHJpYnV0ZU5hbWUpOwotCQkJCX0KLQkJCX0KLQotCQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyaWJ1dGVOYW1lKS5nZXROb2RlVmFsdWUoKTsKLQkJCVN0cmluZyBwcm9wb3NlZEluZm8gPSBudWxsOwotCQkJSW1hZ2UgaW1hZ2UgPSBDTUltYWdlVXRpbC5nZXRJbWFnZShhdHRyRGVjbCk7Ci0JCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCWlmICgoYXR0ckRlY2wgIT0gbnVsbCkgJiYgKGF0dHJEZWNsLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkpIHsKLQkJCQkJaW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVF9SRVFfT0JKKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRSSUJVVEUpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKChhdHRyRGVjbCAhPSBudWxsKSAmJiAoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKSAhPSBudWxsKSkgewotCQkJCS8vIGF0dHJpYnV0ZSBpcyBrbm93biwgcHJvbXB0IHdpdGggdmFsdWVzIGZyb20gdGhlIGRlY2xhcmF0aW9uCi0JCQkJcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8oZWxlbWVudERlY2wsIGF0dHJEZWNsKTsKLQkJCQlMaXN0IHBvc3NpYmxlVmFsdWVzID0gZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhub2RlLCBhdHRyRGVjbCk7Ci0JCQkJaWYgKHBvc3NpYmxlVmFsdWVzLnNpemUoKSA+IDApIHsKLQkJCQkJLy8gRU5VTUVSQVRFRCBWQUxVRVMKLQkJCQkJU3RyaW5nIG1hdGNoU3RyaW5nID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKTsKLQkJCQkJaWYgKG1hdGNoU3RyaW5nID09IG51bGwpIHsKLQkJCQkJCW1hdGNoU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlpZiAoKG1hdGNoU3RyaW5nLmxlbmd0aCgpID4gMCkgJiYgKG1hdGNoU3RyaW5nLnN0YXJ0c1dpdGgoIlwiIikgfHwgbWF0Y2hTdHJpbmcuc3RhcnRzV2l0aCgiJyIpKSkgewotCQkJCQkJbWF0Y2hTdHJpbmcgPSBtYXRjaFN0cmluZy5zdWJzdHJpbmcoMSk7Ci0JCQkJCX0KLQkJCQkJYm9vbGVhbiBjdXJyZW50VmFsaWQgPSBmYWxzZTsKLQotCQkJCQkvLyBkMjEwODU4LCBpZiB0aGUgcmVnaW9uJ3MgYSBjb250YWluZXIsIGRvbid0IHN1Z2dlc3QgdGhlCi0JCQkJCS8vIGVudW1lcmF0ZWQgdmFsdWVzIGFzIHRoZXkgcHJvYmFibHkgd29uJ3QgaGVscAotCQkJCQlib29sZWFuIGV4aXN0aW5nQ29tcGxpY2F0ZWRWYWx1ZSA9IChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSAhPSBudWxsKSAmJiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcik7Ci0JCQkJCWlmICghZXhpc3RpbmdDb21wbGljYXRlZFZhbHVlKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGogPSBwb3NzaWJsZVZhbHVlcy5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspIHsKLQkJCQkJCQlTdHJpbmcgcG9zc2libGVWYWx1ZSA9IChTdHJpbmcpIGoubmV4dCgpOwotCQkJCQkJCWN1cnJlbnRWYWxpZCA9IGN1cnJlbnRWYWxpZCB8fCBwb3NzaWJsZVZhbHVlLmVxdWFscyhjdXJyZW50VmFsdWUpOwotCQkJCQkJCWlmICgobWF0Y2hTdHJpbmcubGVuZ3RoKCkgPT0gMCkgfHwgcG9zc2libGVWYWx1ZS5zdGFydHNXaXRoKG1hdGNoU3RyaW5nKSkgewotCi0JCQkJCQkJCVN0cmluZyByU3RyaW5nID0gIlwiIiArIHBvc3NpYmxlVmFsdWUgKyAiXCIiOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlpbnQgck9mZnNldCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpOwotCQkJCQkJCQlpbnQgckxlbmd0aCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCk7Ci0JCQkJCQkJCWludCBjdXJzb3JBZnRlciA9IHBvc3NpYmxlVmFsdWUubGVuZ3RoKCkgKyAxOwotCQkJCQkJCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9ICJcIiIgKyBwb3NzaWJsZVZhbHVlICsgIlwiIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQotCQkJCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHJTdHJpbmcsIHJPZmZzZXQsIHJMZW5ndGgsIGN1cnNvckFmdGVyLCBpbWFnZSwgZGlzcGxheVN0cmluZywgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICgoKGF0dHJEZWNsLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5GSVhFRCkgfHwgKGF0dHJEZWNsLmdldEF0dHJUeXBlKCkuZ2V0SW1wbGllZFZhbHVlS2luZCgpID09IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9GSVhFRCkpICYmIChhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldEltcGxpZWRWYWx1ZSgpICE9IG51bGwpKSB7Ci0JCQkJCS8vIEZJWEVEIHZhbHVlcwotCQkJCQlTdHJpbmcgdmFsdWUgPSBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldEltcGxpZWRWYWx1ZSgpOwotCQkJCQlpZiAoKHZhbHVlICE9IG51bGwpICYmICh2YWx1ZS5sZW5ndGgoKSA+IDApKSB7Ci0JCQkJCQlTdHJpbmcgclZhbHVlID0gIlwiIiArIHZhbHVlICsgIlwiIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChyVmFsdWUsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCByVmFsdWUubGVuZ3RoKCkgKyAxLCBpbWFnZSwgclZhbHVlLCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1hNTF9BVFRSSUJVVEVfVkFMVUUpOwotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJaWYgKChjdXJyZW50VmFsdWUubGVuZ3RoKCkgPiAwKSAmJiAhdmFsdWUuZXF1YWxzKGN1cnJlbnRWYWx1ZSkpIHsKLQkJCQkJCQlyVmFsdWUgPSAiXCIiICsgY3VycmVudFZhbHVlICsgIlwiIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoclZhbHVlLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgclZhbHVlLmxlbmd0aCgpICsgMSwgaW1hZ2UsIHJWYWx1ZSwgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB1bmtub3duIGF0dHJpYnV0ZSwgc28gc3VwcGx5IG5pY2UgZW1wdHkgdmFsdWVzCi0JCQkJcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8obnVsbCwgZWxlbWVudERlY2wpOwotCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG51bGw7Ci0JCQkJaWYgKChjdXJyZW50VmFsdWUgIT0gbnVsbCkgJiYgKGN1cnJlbnRWYWx1ZS5sZW5ndGgoKSA+IDApKSB7Ci0JCQkJCVN0cmluZyByVmFsdWUgPSAiXCIiICsgY3VycmVudFZhbHVlICsgIlwiIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHJWYWx1ZSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIDEsIGltYWdlLCByVmFsdWUsIG51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfWE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoVU5LTk9XTl9DT05URVhUKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENvbW1lbnRQcm9wb3NhbChDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCI8IS0tICAtLT4iLCAvLyROT04tTkxTLTEkCi0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCA1LCBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NPTU1FTlQpLCBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkNvbW1lbnRfXywgKG5ldyBPYmplY3RbXXsiIDwhLS0gIC0tPiJ9KSksIC8vJE5PTi1OTFMtMSQKLQkJCQkJbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfQ09NTUVOVCkpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgb2YgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGludCB0aGUgQ01Db250ZW50IG9iamVjdCBpbnRvIG9uZQotCSAqIGJpZyBsaXN0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRlbnQoTGlzdCBjb250ZW50TGlzdCwgQ01Db250ZW50IGNvbnRlbnQpIHsKLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgQ01Hcm91cCkgewotCQkJQ01Ob2RlTGlzdCBjaGlsZHJlbiA9ICgoQ01Hcm91cCkgY29udGVudCkuZ2V0Q2hpbGROb2RlcygpOwotCQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlDTU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCWNvbnRlbnRMaXN0LmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuR1JPVVApIHsKLQkJCQkJCWFkZENvbnRlbnQoY29udGVudExpc3QsIChDTUNvbnRlbnQpIGNoaWxkKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gY29udGVudCBjaGlsZDogIiArIGNoaWxkKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJY29udGVudExpc3QuYWRkKGNvbnRlbnQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRG9jVHlwZVByb3Bvc2FsKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCS8vIGlmIGEgRG9jdW1lbnRFbGVtZW50IGV4aXN0cywgdXNlIHRoYXQgZm9yIHRoZSByb290IEVsZW1lbnQgbmFtZQotCQlTdHJpbmcgcm9vdG5hbWUgPSAidW5zcGVjaWZpZWQiOyAvLyROT04tTkxTLTEkCi0JCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCkuZ2V0T3duZXJEb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpICE9IG51bGwpIHsKLQkJCXJvb3RuYW1lID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpLmdldE93bmVyRG9jdW1lbnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXROb2RlTmFtZSgpOwotCQl9Ci0KLQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9ICI8IURPQ1RZUEUgIiArIHJvb3RuYW1lICsgIiBQVUJMSUMgXCIvL1VOS05PV04vXCIgXCJ1bmtub3duLmR0ZFwiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCAxMCwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9ET0NUWVBFKSwgIjwhRE9DVFlQRSAuLi4gPiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfRE9DVFlQRSk7Ci0JCS8vIFRPRE8gcHJvdmlkZSBzcGVjaWFsIGRvY3VtZW50YXRpb24gb24gZG9jIHR5cGUKLQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgcHJvcG9zYWxzIGZvciBhIGNvbXBsZXRlbHkgZW1wdHkgZG9jdW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCS8vIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHByb3Bvc2FscyBmb3IgdGhlIG5hbWUgaW4gYW4gZW5kIHRhZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVuZFRhZ05hbWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQotCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0U3RhcnRPZmZzZXQoKSArIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpLmdldFRleHRMZW5ndGgoKSA8IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpKSB7Ci0JCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCI+IiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIDEsIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpLCBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkNsb3NlX3dpdGhfXywgKG5ldyBPYmplY3RbXXsiICc+JyJ9KSksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCW51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0VORF9UQUdfTkFNRSk7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCk7Ci0JCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCU5vZGUgYU5vZGUgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCk7Ci0JCQlTdHJpbmcgbWF0Y2hTdHJpbmcgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpOwotCQkJaWYgKG1hdGNoU3RyaW5nLnN0YXJ0c1dpdGgoIjwvIikpIHsKLQkJCQltYXRjaFN0cmluZyA9IG1hdGNoU3RyaW5nLnN1YnN0cmluZygyKTsKLQkJCX0KLQkJCXdoaWxlIChhTm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGFOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJaWYgKGFOb2RlLmdldE5vZGVOYW1lKCkuc3RhcnRzV2l0aChtYXRjaFN0cmluZykpIHsKLQkJCQkJCUlET01Ob2RlIGFYTUxOb2RlID0gKElET01Ob2RlKSBhTm9kZTsKLQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgYU5vZGUpOwotCQkJCQkJaWYgKChhWE1MTm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSAmJiAoKGVkID09IG51bGwpIHx8IChlZC5nZXRDb250ZW50VHlwZSgpICE9IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKSkpIHsKLQkJCQkJCQlTdHJpbmcgcHJvcG9zZWRUZXh0ID0gYU5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJCQlTdHJpbmcgcHJvcG9zZWRJbmZvID0gKGVkICE9IG51bGwpID8gZ2V0QWRkaXRpb25hbEluZm8obnVsbCwgZWQpIDogbnVsbDsKLQkJCQkJCQlpZiAoKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgIWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldERvY3VtZW50UmVnaW9uKCkuaXNFbmRlZCgpKSB7Ci0JCQkJCQkJCXByb3Bvc2VkVGV4dCArPSAiPiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbnVsbDsKLQkJCQkJCQkvLyBkb3VibGUgY2hlY2sgdG8gc2VlIGlmIHRoZSByZWdpb24gYWN0ZWQgdXBvbiBpcwotCQkJCQkJCS8vIGEgdGFnIG5hbWU7IHJlcGxhY2UgaXQgaWYgc28KLQkJCQkJCQlJbWFnZSBpbWFnZSA9IENNSW1hZ2VVdGlsLmdldEltYWdlKGVkKTsKLQkJCQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJCQlpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJCQkJCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFN0YXJ0T2Zmc2V0KCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpLmdldFRleHRMZW5ndGgoKSwgcHJvcG9zZWRUZXh0Lmxlbmd0aCgpLCBpbWFnZSwgcHJvcG9zZWRUZXh0LCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0VORF9UQUdfTkFNRSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgcHJvcG9zZWRUZXh0Lmxlbmd0aCgpLCBpbWFnZSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5DbG9zZV93aXRoX18sIChuZXcgT2JqZWN0W117IiciICsgcHJvcG9zZWRUZXh0ICsgIicifSkpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9FTkRfVEFHX05BTUUpOwotCQkJCQkJCX0KLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYU5vZGUgPSBhTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm9tcHQgZm9yIGVuZCB0YWdzIHRvIGEgbm9uLWVtcHR5IE5vZGUgdGhhdCBoYXNuJ3QgZW5kZWQgSGFuZGxlcyB0aGVzZQotCSAqIGNhc2VzOiA8YnI+Ci0JICogPHRhZ09wZW4+fCA8YnI+Ci0JICogPHRhZ09wZW4+PCB8PGJyPgotCSAqIDx0YWdPcGVuPjwvIHwKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbmRUYWdQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UGFyZW50KCk7Ci0KLQkJaWYgKGlzQ29tbWVudE5vZGUobm9kZSkpIHsKLQkJCS8vIGxvb3AgYW5kIGZpbmQgbm9uIGNvbW1lbnQgbm9kZSBwYXJlbnQKLQkJCXdoaWxlICgobm9kZSAhPSBudWxsKSAmJiBpc0NvbW1lbnROb2RlKG5vZGUpKSB7Ci0JCQkJbm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBub2RlIGlzIGFscmVhZHkgY2xvc2VkCi0JCWlmIChub2RlLmlzQ2xvc2VkKCkpIHsKLQkJCS8vIGxvb3AgYW5kIGZpbmQgbm9uIGNvbW1lbnQgdW5jbG9zZSBub2RlIHBhcmVudAotCQkJd2hpbGUgKChub2RlICE9IG51bGwpICYmIG5vZGUuaXNDbG9zZWQoKSkgewotCQkJCW5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0JCS8vIHRoZXJlIHdlcmUgbm8gdW5jbG9zZWQgdGFncwotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBkYXRhIHRvIGNyZWF0ZSBhIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbAotCQlTdHJpbmcgcmVwbGFjZVRleHQgPSBub2RlLmdldE5vZGVOYW1lKCkgKyAiPiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IHJlcGxhY2VCZWdpbiA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpOwotCQlpbnQgcmVwbGFjZUxlbmd0aCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCk7Ci0JCWludCBjdXJzb3JPZmZzZXQgPSBub2RlLmdldE5vZGVOYW1lKCkubGVuZ3RoKCkgKyAxOwotCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBwcm9wb3NlZEluZm8gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlJbWFnZSBpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpOwotCi0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJYm9vbGVhbiBhZGRQcm9wb3NhbCA9IGZhbHNlOwotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzRG9jID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZUZXh0Vmlld2VyLmdldERvY3VtZW50KCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHhtbEVuZFRhZ09wZW4gPSBzRG9jLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpKTsKLQkJCS8vIHNraXAgYmFja3dhcmQgdG8gIjwiLCAiPC8iLCBvciB0aGUgKHVuY2xvc2VkKSBzdGFydCB0YWcsIG51bGwKLQkJCS8vIGlmIG5vdCBmb3VuZAotCQkJU3RyaW5nIHR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKCh4bWxFbmRUYWdPcGVuICE9IG51bGwpICYmICgodHlwZSA9IHhtbEVuZFRhZ09wZW4uZ2V0VHlwZSgpKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pICYmICh0eXBlICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgJiYgIW5lZWRzRW5kVGFnKHhtbEVuZFRhZ09wZW4pICYmICh0eXBlICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSkgewotCQkJCXhtbEVuZFRhZ09wZW4gPSB4bWxFbmRUYWdPcGVuLmdldFByZXZpb3VzKCk7Ci0JCQl9Ci0KLQkJCWlmICh4bWxFbmRUYWdPcGVuID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCW5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TW9kZWwoKS5nZXRJbmRleGVkUmVnaW9uKHhtbEVuZFRhZ09wZW4uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlub2RlID0gKElET01Ob2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJaWYgKGlzU3RhcnRUYWcoeG1sRW5kVGFnT3BlbikpIHsKLQkJCQkvLyB0aGlzIGlzIHRoZSBjYXNlIGZvciBhIHN0YXJ0IHRhZyB3L291dCBlbmQgdGFnCi0JCQkJLy8gZWc6Ci0JCQkJLy8gPHA+Ci0JCQkJLy8gPCUgU3RyaW5nIHRlc3QgPSAidGVzdCI7ICU+Ci0JCQkJLy8gfAotCQkJCWlmIChuZWVkc0VuZFRhZyh4bWxFbmRUYWdPcGVuKSkgewotCQkJCQlTdHJpbmcgdGFnTmFtZSA9IGdldFRhZ05hbWUoeG1sRW5kVGFnT3Blbik7Ci0JCQkJCXhtbEVuZFRhZ09wZW4uZ2V0VGV4dEVuZE9mZnNldCgpOwotCQkJCQlyZXBsYWNlTGVuZ3RoID0gMDsKLQkJCQkJcmVwbGFjZVRleHQgPSAiPC8iICsgdGFnTmFtZSArICI+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkICROT04tTkxTLTIkCi0JCQkJCS8vIHJlcGxhY2VUZXh0ID0gIjwvIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICI+IjsKLQkJCQkJLy8gLy8kTk9OLU5MUy0xJCAkTk9OLU5MUy0yJAotCQkJCQljdXJzb3JPZmZzZXQgPSB0YWdOYW1lLmxlbmd0aCgpICsgMzsKLQkJCQkJZGlzcGxheVN0cmluZyA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuRW5kX3dpdGhfXywgKG5ldyBPYmplY3RbXXt0YWdOYW1lfSkpOwotCQkJCQlhZGRQcm9wb3NhbCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQkvLyB0aGlzIGlzIHRoZSBjYXNlIGZvcjogPHRhZz4gPC8gfAotCQkJCS8vIHBvc3NpYmx5IDx0YWc+IDwvIHw8YW5vdGhlclRhZz4KLQkJCQkvLyBzaG91bGQgb25seSBiZSByZXBsYWNpbmcgd2hpdGUgc3BhY2UuLi4KLQkJCQlyZXBsYWNlTGVuZ3RoID0gKHJlcGxhY2VCZWdpbiA+IHhtbEVuZFRhZ09wZW4uZ2V0VGV4dEVuZE9mZnNldCgpKSA/IHJlcGxhY2VCZWdpbiAtIHhtbEVuZFRhZ09wZW4uZ2V0VGV4dEVuZE9mZnNldCgpIDogMDsKLQkJCQlyZXBsYWNlVGV4dCA9IG5vZGUuZ2V0Tm9kZU5hbWUoKSArICI+IjsgLy8kTk9OLU5MUy0xJAotCQkJCWN1cnNvck9mZnNldCA9IHJlcGxhY2VUZXh0Lmxlbmd0aCgpOwotCQkJCXJlcGxhY2VCZWdpbiA9IHhtbEVuZFRhZ09wZW4uZ2V0VGV4dEVuZE9mZnNldCgpOwotCQkJCWRpc3BsYXlTdHJpbmcgPSBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkVuZF93aXRoXywgKG5ldyBPYmplY3RbXXtub2RlLmdldE5vZGVOYW1lKCl9KSk7Ci0JCQkJYWRkUHJvcG9zYWwgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgewotCQkJCS8vIHRoaXMgaXMgdGhlIGNhc2UgZm9yOiA8dGFnPiA8IHwKLQkJCQlyZXBsYWNlVGV4dCA9ICIvIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICI+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkICROT04tTkxTLTIkCi0JCQkJY3Vyc29yT2Zmc2V0ID0gcmVwbGFjZVRleHQubGVuZ3RoKCk7Ci0JCQkJLy8gcmVwbGFjZVRleHQgPSAiLyIgKyBub2RlLmdldE5vZGVOYW1lKCkgKyAiPiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyAkTk9OLU5MUy0yJAotCQkJCS8vIHNob3VsZCBvbmx5IGJlIHJlcGxhY2luZyB3aGl0ZSBzcGFjZS4uLgotCQkJCXJlcGxhY2VMZW5ndGggPSAocmVwbGFjZUJlZ2luID4geG1sRW5kVGFnT3Blbi5nZXRUZXh0RW5kT2Zmc2V0KCkpID8gcmVwbGFjZUJlZ2luIC0geG1sRW5kVGFnT3Blbi5nZXRUZXh0RW5kT2Zmc2V0KCkgOiAwOwotCQkJCXJlcGxhY2VCZWdpbiA9IHhtbEVuZFRhZ09wZW4uZ2V0VGV4dEVuZE9mZnNldCgpOwotCQkJCWRpc3BsYXlTdHJpbmcgPSBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkVuZF93aXRoXywgKG5ldyBPYmplY3RbXXsiLyIgKyBub2RlLmdldE5vZGVOYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlhZGRQcm9wb3NhbCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCS8vIHNvbWV0aW1lcyB0aGUgbm9kZSBpcyBub3QgbnVsbCwgYnV0Ci0JCS8vIGdldE5vZGVWYWx1ZSgpIGlzIG51bGwsIHB1dCBpbiBhIG51bGwgY2hlY2sKLQkJZWxzZSBpZiAoKG5vZGUuZ2V0Tm9kZVZhbHVlKCkgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkuaW5kZXhPZigiPC8iKSAhPSAtMSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gdGhlIGNhc2Ugd2hlcmUgIjwvIiBpcyBzdGFydGVkLCBidXQgdGhlIG5vZGVzIGNvbWVzIGluIGFzIGEKLQkJCS8vIHRleHQgbm9kZSAoaW5zdGVhZCBvZiBlbGVtZW50KQotCQkJLy8gbGlrZSB0aGlzOiA8dGFnPiA8L3wKLQkJCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSkgewotCQkJCXJlcGxhY2VUZXh0ID0gcGFyZW50LmdldE5vZGVOYW1lKCkgKyAiPiI7IC8vJE5PTi1OTFMtMSQKLQkJCQljdXJzb3JPZmZzZXQgPSByZXBsYWNlVGV4dC5sZW5ndGgoKTsKLQkJCQlkaXNwbGF5U3RyaW5nID0gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5FbmRfd2l0aF9fLCAobmV3IE9iamVjdFtde3BhcmVudC5nZXROb2RlTmFtZSgpfSkpOwotCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQlhZGRQcm9wb3NhbCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCXNldEVycm9yTWVzc2FnZShVTktOT1dOX0NPTlRFWFQpOwotCQl9Ci0JCWlmIChhZGRQcm9wb3NhbCA9PSB0cnVlKSB7Ci0JCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHJlcGxhY2VUZXh0LCByZXBsYWNlQmVnaW4sIHJlcGxhY2VMZW5ndGgsIGN1cnNvck9mZnNldCwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIG51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfRU5EX1RBRyk7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbnRpdHlQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIGludCBkb2N1bWVudFBvc2l0aW9uLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSB0cmVlTm9kZSkgewotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gZXBzID0gY29tcHV0ZUVudGl0eVJlZmVyZW5jZVByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSk7Ci0JCWZvciAoaW50IGkgPSAwOyAoZXBzICE9IG51bGwpICYmIChpIDwgZXBzLmxlbmd0aCk7IGkrKykgewotCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwoZXBzW2ldKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVudGl0eVByb3Bvc2FscyhWZWN0b3IgcHJvcG9zYWxzLCBQcm9wZXJ0aWVzIG1hcCwgU3RyaW5nIGtleSwgaW50IG5vZGVPZmZzZXQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24sIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24pIHsKLQkJaWYgKG1hcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIGVudGl0eU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZW50aXR5VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlJbWFnZSBlbnRpdHlJY29uID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9FTlRJVFlfUkVGRVJFTkNFKTsKLQkJU3RyaW5nIHJlcGxhY2VtZW50VGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkaXNwbGF5U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJRW51bWVyYXRpb24ga2V5cyA9IG1hcC5rZXlzKCk7Ci0KLQkJd2hpbGUgKChrZXlzICE9IG51bGwpICYmIGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCWVudGl0eU5hbWUgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0JCQllbnRpdHlWYWx1ZSA9IG1hcC5nZXRQcm9wZXJ0eShlbnRpdHlOYW1lKTsKLQkJCS8vIGZpbHRlciBiYXNlZCBvbiBwYXJ0aWFsIGVudGl0eSBzdHJpbmcuLi4KLQkJCWlmIChlbnRpdHlOYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChrZXkudG9Mb3dlckNhc2UoKSkgfHwga2V5LnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJLy8gZmlndXJlIG91dCBzZWxlY3Rpb24uLi5pZiB0ZXh0IGlzIHNlbGVjdGVkLCBhZGQgaXQgdG8KLQkJCQkvLyBzZWxlY3Rpb24gbGVuZ3RoCi0JCQkJaW50IHNlbGVjdGlvbkxlbmd0aCA9IG5vZGVPZmZzZXQ7Ci0JCQkJaWYgKGZUZXh0Vmlld2VyICE9IG51bGwpIHsKLQkJCQkJc2VsZWN0aW9uTGVuZ3RoICs9IGZUZXh0Vmlld2VyLmdldFNlbGVjdGVkUmFuZ2UoKS55OwotCQkJCX0KLQkJCQkvLyBjcmVhdGUgYSBuZXcgcHJvcG9zYWwgZm9yIGVudGl0eSBzdHJpbmcuLi4KLQkJCQlyZXBsYWNlbWVudFRleHQgPSAiJiIgKyBlbnRpdHlOYW1lICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJZGlzcGxheVN0cmluZyA9ICImIiArIGVudGl0eU5hbWUgKyAiOyAoIiArIGVudGl0eVZhbHVlICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWwgY3AgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHJlcGxhY2VtZW50VGV4dCwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbiksIHNlbGVjdGlvbkxlbmd0aCwgcmVwbGFjZW1lbnRUZXh0Lmxlbmd0aCgpLCBlbnRpdHlJY29uLCBkaXNwbGF5U3RyaW5nLCBudWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9FTlRJVFkpOwotCQkJCWlmIChjcCAhPSBudWxsKSB7Ci0JCQkJCXByb3Bvc2Fscy5hZGQoY3ApOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFBDREFUQVByb3Bvc2FsKFN0cmluZyBub2RlTmFtZSwgQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiPCFbQ0RBVEFbXV0+IiwgLy8kTk9OLU5MUy0xJAotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgOSwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DREFUQVNFQ1RJT04pLCAiQ0RBVEEgU2VjdGlvbiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfQ0RBVEEpOwotCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0KLQkJcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKG5vZGVOYW1lLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgbm9kZU5hbWUubGVuZ3RoKCksIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVFhURVhUKSwgIiNQQ0RBVEEiLCAvLyROT04tTkxTLTEkCi0JCQkJCW51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0NEQVRBKTsKLQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJTm9kZSBhTm9kZSA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKTsKLQkJYm9vbGVhbiB4bWxwaUZvdW5kID0gZmFsc2U7Ci0JCURvY3VtZW50IG93bmluZ0RvY3VtZW50ID0gYU5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkvLyA9PT4gLy8gaW50IHhtbHBpTm9kZVBvc2l0aW9uID0gLTE7Ci0KLQkJLy8gbWFrZSBzdXJlIHhtbHBpIGlzIHJvb3QgZWxlbWVudAotCQkvLyBkb24ndCB3YW50IGRvY3R5cGUgcHJvcG9zYWwgaWYgWE1MUEkgaXNuJ3QgZmlyc3QgZWxlbWVudC4uLgotCQlOb2RlIGZpcnN0ID0gb3duaW5nRG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQlib29sZWFuIHhtbHBpSXNGaXJzdEVsZW1lbnQgPSAoKGZpcnN0ICE9IG51bGwpICYmIChmaXJzdC5nZXROb2RlVHlwZSgpID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSk7Ci0JCWJvb2xlYW4gaW5zZXJ0RG9jdHlwZSA9IHhtbHBpSXNGaXJzdEVsZW1lbnQ7Ci0KLQkJZm9yIChOb2RlIGNoaWxkID0gb3duaW5nRG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWJvb2xlYW4geG1scGkgPSAoKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpICYmIGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJ4bWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXhtbHBpRm91bmQgPSB4bWxwaUZvdW5kIHx8IHhtbHBpOwotCQkJaWYgKHhtbHBpRm91bmQpIHsKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCQkvLyA9PT4gLy8gaW50IHhtbHBpTm9kZVBvc2l0aW9uID0KLQkJCQkJLy8gKChYTUxOb2RlKWNoaWxkKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQl9Ci0JCQkJLy8gc2tpcCB3aGl0ZSBzcGFjZSBhbmQgdGV4dAotCQkJCXdoaWxlICgoKGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgIT0gbnVsbCkgJiYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpKSB7Ci0JCQkJCS8vIGp1c3Qgc2tpcHBpbmcKLQkJCQl9Ci0JCQkJLy8gY2hlY2sgaWYgdGhlcmVzIGEgbm9kZSBpbmJldHdlZW4gWE1MUEkgYW5kIGN1cnNvciBwb3NpdGlvbgotCQkJCWlmICgoY2hpbGQgIT0gbnVsbCkgJiYgKGNoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpKSB7Ci0JCQkJCWlmICgoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkgPj0gKChJRE9NTm9kZSkgY2hpbGQpLmdldEVuZE9mZnNldCgpKSB8fCAheG1scGlJc0ZpcnN0RWxlbWVudCkgewotCQkJCQkJaW5zZXJ0RG9jdHlwZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKHhtbHBpRm91bmQgJiYgKG93bmluZ0RvY3VtZW50LmdldERvY3R5cGUoKSA9PSBudWxsKSAmJiBpc0N1cnNvckFmdGVyWE1MUEkoY29udGVudEFzc2lzdFJlcXVlc3QpICYmIGluc2VydERvY3R5cGUpIHsKLQkJCWFkZERvY1R5cGVQcm9wb3NhbChjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDbG9zZSBhbiB1bmNsb3NlZCBzdGFydCB0YWcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdDbG9zZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRQYXJlbnQoKTsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCi0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKG5vZGUpOwotCQkJU3RyaW5nIHByb3Bvc2VkSW5mbyA9IChlbGVtZW50RGVjbCAhPSBudWxsKSA/IGdldEFkZGl0aW9uYWxJbmZvKG51bGwsIGVsZW1lbnREZWNsKSA6IG51bGw7Ci0JCQlpbnQgY29udGVudFR5cGUgPSAoZWxlbWVudERlY2wgIT0gbnVsbCkgPyBlbGVtZW50RGVjbC5nZXRDb250ZW50VHlwZSgpIDogQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZOwotCQkJLy8gaWYgaXQncyBYTUwgYW5kIGNvbnRlbnQgZG9lc24ndCBIQVZFIHRvIGJlIGVsZW1lbnQsIGFkZCAiLz4iCi0JCQkvLyBwcm9wb3NhbC4KLQkJCWJvb2xlYW4gZW5kV2l0aFNsYXNoQnJhY2tldCA9IChnZXRYTUwobm9kZSkgJiYgKGNvbnRlbnRUeXBlICE9IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQpKTsKLQotCQkJSW1hZ2UgaW1hZ2UgPSBDTUltYWdlVXRpbC5nZXRJbWFnZShlbGVtZW50RGVjbCk7Ci0JCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCWltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyk7Ci0JCQl9Ci0KLQkJCS8vIGlzIHRoZSBzdGFydCB0YWcgZW5kZWQgcHJvcGVybHk/Ci0JCQlpZiAoKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldERvY3VtZW50UmVnaW9uKCkgPT0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKSAmJiAhKG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSkuaXNFbmRlZCgpKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCS8vIElzIHRoaXMgc3VwcG9zZWQgdG8gYmUgYW4gZW1wdHkgdGFnPyBOb3RlIHRoYXQgaWYgd2UgY2FuJ3QKLQkJCQkvLyB0ZWxsLCB3ZSBhc3N1bWUgaXQncyBub3QuCi0JCQkJaWYgKChlbGVtZW50RGVjbCAhPSBudWxsKSAmJiAoZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkpIHsKLQkJCQkJLy8gcHJvbXB0IHdpdGggYSBzZWxmLWNsb3NpbmcgZW5kIGNoYXJhY3RlciBpZiBuZWVkZWQKLQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2V0U3RhcnRUYWdDbG9zZShub2RlLCBlbGVtZW50RGVjbCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLAotCQkJCQkvLyB0aGlzIGlzIG9uZSBvZiB0aGUgZmV3IHRpbWVzIHRvIGlnbm9yZSB0aGUgbGVuZ3RoIC0tCi0JCQkJCQkJCS8vIGFsd2F5cyBpbnNlcnQKLQkJCQkJCQkJLy8gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwKLQkJCQkJCQkJMCwgZ2V0Q29udGVudEdlbmVyYXRvcigpLmdldFN0YXJ0VGFnQ2xvc2Uobm9kZSwgZWxlbWVudERlY2wpLmxlbmd0aCgpLCBpbWFnZSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5DbG9zZV93aXRoX19fLCAobmV3IE9iamVjdFtde2dldENvbnRlbnRHZW5lcmF0b3IoKS5nZXRTdGFydFRhZ0Nsb3NlKG5vZGUsIGVsZW1lbnREZWNsKX0pKSwgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9DTE9TRV9UQUcpOwotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBwcm9tcHQgd2l0aCBhIGNsb3NlIGZvciB0aGUgc3RhcnQgdGFnCi0JCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIj4iLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLAotCQkJCQkJCQkvLyB0aGlzIGlzIG9uZSBvZiB0aGUgZmV3IHRpbWVzIHRvIGlnbm9yZSB0aGUKLQkJCQkJCQkJLy8gbGVuZ3RoIC0tIGFsd2F5cyBpbnNlcnQKLQkJCQkJCQkJLy8gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwKLQkJCQkJCQkJMCwgMSwgaW1hZ2UsIE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuQ2xvc2Vfd2l0aF9fLCAobmV3IE9iamVjdFtdeyIgJz4nIn0pKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQludWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0NMT1NFX1RBRyk7Ci0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQotCQkJCQkvLyBwcm9tcHQgd2l0aCB0aGUgY2xvc2VyIGZvciB0aGUgc3RhcnQgdGFnIGFuZCBhbiBlbmQgdGFnCi0JCQkJCS8vIGlmIG9uZSBpcyBub3QgcHJlc2VudAotCQkJCQlpZiAobm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSB7Ci0JCQkJCQkvLyBtYWtlIHN1cmUgdGFnIG5hbWUgaXMgYWN0dWFsbHkgd2hhdCBpdCB0aGlua3MgaXQKLQkJCQkJCS8vIGlzLi4uKGVnLiA8JUAgdnMuIDxqc3A6ZGlyZWN0aXZlKQotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZHIgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXREb2N1bWVudFJlZ2lvbigpOwotCQkJCQkJU3RyaW5nIG9wZW5pbmdUYWdUZXh0ID0gKHNkciAhPSBudWxsKSA/IHNkci5nZXRGdWxsVGV4dCgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmICgob3BlbmluZ1RhZ1RleHQgIT0gbnVsbCkgJiYgKG9wZW5pbmdUYWdUZXh0LmluZGV4T2Yobm9kZS5nZXROb2RlTmFtZSgpKSAhPSAtMSkpIHsKLQkJCQkJCQlwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIj48LyIgKyBub2RlLmdldE5vZGVOYW1lKCkgKyAiPiIsIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksCi0JCQkJCQkJCQkJLy8gdGhpcyBpcyBvbmUgb2YgdGhlIGZldyB0aW1lcyB0bwotCQkJCQkJCQkJCS8vIGlnbm9yZSB0aGUgbGVuZ3RoIC0tIGFsd2F5cyBpbnNlcnQKLQkJCQkJCQkJCQkvLyBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLAotCQkJCQkJCQkJCTAsIDEsIGltYWdlLCBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkNsb3NlX3dpdGhfX19fLCAobmV3IE9iamVjdFtde25vZGUuZ2V0Tm9kZU5hbWUoKX0pKSwgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9DTE9TRV9UQUcpOwotCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBwcm9tcHQgd2l0aCBzbGFzaCBicmFja2V0ICIvPiIgaW5jYXNlIGlmIGl0J3MgYSBzZWxmCi0JCQkJCS8vIGVuZGluZyB0YWcKLQkJCQkJaWYgKGVuZFdpdGhTbGFzaEJyYWNrZXQpIHsKLQkJCQkJCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiLz4iLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwKLQkJCQkJCQkJCS8vIHRoaXMgaXMgb25lIG9mIHRoZSBmZXcgdGltZXMgdG8gaWdub3JlCi0JCQkJCQkJCQkvLyB0aGUgbGVuZ3RoIC0tIGFsd2F5cyBpbnNlcnQKLQkJCQkJCQkJCS8vIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksCi0JCQkJCQkJCQkwLCAyLCBpbWFnZSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5DbG9zZV93aXRoX18sIChuZXcgT2JqZWN0W117IiBcIi8+XCIifSkpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQludWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0NMT1NFX1RBRyArIDEpOyAvLyArMQotCQkJCQkJLy8gdG8KLQkJCQkJCS8vIGJyaW5nCi0JCQkJCQkvLyB0bwotCQkJCQkJLy8gdG9wCi0JCQkJCQkvLyBvZgotCQkJCQkJLy8gbGlzdAotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldERvY3VtZW50UmVnaW9uKCkgPT0gbm9kZS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpICYmICFub2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5pc0VuZGVkKCkpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJLy8gcHJvbXB0IHdpdGggYSBjbG9zaW5nIGVuZCBjaGFyYWN0ZXIgZm9yIHRoZSBlbmQgdGFnCi0JCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiPiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwKLQkJCQkJCQkvLyB0aGlzIGlzIG9uZSBvZiB0aGUgZmV3IHRpbWVzIHRvIGlnbm9yZSB0aGUKLQkJCQkJCQkvLyBsZW5ndGggLS0gYWx3YXlzIGluc2VydAotCQkJCQkJCS8vIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksCi0JCQkJCQkJMCwgMSwgaW1hZ2UsIE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuQ2xvc2Vfd2l0aF9fLCAobmV3IE9iamVjdFtdeyIgJz4nIn0pKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfQ0xPU0VfVEFHKTsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKFVOS05PV05fQ09OVEVYVCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0JCUxpc3QgY21ub2RlcyA9IG51bGw7Ci0JCU5vZGUgcGFyZW50ID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UGFyZW50KCk7Ci0JCVN0cmluZyBlcnJvciA9IG51bGw7Ci0KLQkJLy8gKG5zZCkgVGhpcyBpcyBvbmx5IHZhbGlkIGF0IHRoZSBkb2N1bWVudCBlbGVtZW50IGxldmVsCi0JCS8vIG9ubHkgdmFsaWQgaWYgaXQncyBYTUwgKGNoZWNrIGFkZGVkIDIvMTcvMjAwNCkKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgKChJRE9NRG9jdW1lbnQpIHBhcmVudCkuaXNYTUxUeXBlKCkgJiYgIWlzQ3Vyc29yQWZ0ZXJYTUxQSShjb250ZW50QXNzaXN0UmVxdWVzdCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBvbmx5IHdhbnQgcHJvcG9zYWxzIGlmIGN1cnNvciBpcyBhZnRlciBkb2N0eXBlLi4uCi0JCWlmICghaXNDdXJzb3JBZnRlckRvY3R5cGUoY29udGVudEFzc2lzdFJlcXVlc3QpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBmaXggZm9yIG1ldGEtaW5mbyBjb21tZW50IG5vZGVzLi4gdGhleSBjdXJyZW50bHkgImhpZGUiIG90aGVyCi0JCS8vIHByb3Bvc2FscyBiZWNhdXNlIHRoZSBkb24ndAotCQkvLyBoYXZlIGEgY29udGVudCBtb2RlbCAoc28gY2FuJ3QgcHJvcG9zZSBhbnkgY2hpbGRyZW4uLikKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIElET01Ob2RlKSAmJiBpc0NvbW1lbnROb2RlKChJRE9NTm9kZSkgcGFyZW50KSkgewotCQkJLy8gbG9vcCBhbmQgZmluZCBub24gY29tbWVudCBub2RlPwotCQkJd2hpbGUgKChwYXJlbnQgIT0gbnVsbCkgJiYgaXNDb21tZW50Tm9kZSgoSURPTU5vZGUpIHBhcmVudCkpIHsKLQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnREZWNsID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50KTsKLQkJCWlmIChwYXJlbnREZWNsICE9IG51bGwpIHsKLQkJCQkvLyBYU0Qtc3BlY2lmaWMgYWJpbGl0eSAtIG5vIGZpbHRlcmluZwotCQkJCUNNRGF0YVR5cGUgY2hpbGRUeXBlID0gcGFyZW50RGVjbC5nZXREYXRhVHlwZSgpOwotCQkJCWlmIChjaGlsZFR5cGUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmdbXSBjaGlsZFN0cmluZ3MgPSBjaGlsZFR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCQkJCQlpZiAoY2hpbGRTdHJpbmdzICE9IG51bGwpIHsKLQkJCQkJCS8vIHRoZSBjb250ZW50IHN0cmluZyBpcyB0aGUgc29sZSB2YWxpZCBjaGlsZC4uLnNvCi0JCQkJCQkvLyByZXBsYWNlIHRoZSByZXN0Ci0JCQkJCQlpbnQgYmVnaW4gPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKTsKLQkJCQkJCWludCBsZW5ndGggPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpOwotCQkJCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJCQkJaWYgKCgoSURPTU5vZGUpIHBhcmVudCkuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9ICgoSURPTU5vZGUpIHBhcmVudCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSkgewotCQkJCQkJCQliZWdpbiA9ICgoSURPTU5vZGUpIHBhcmVudCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCQkJbGVuZ3RoID0gKChJRE9NTm9kZSkgcGFyZW50KS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKSAtIGJlZ2luOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBwcm9wb3NlZEluZm8gPSBnZXRBZGRpdGlvbmFsSW5mbyhwYXJlbnREZWNsLCBjaGlsZFR5cGUpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgdGV4dFByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChjaGlsZFN0cmluZ3NbaV0sIGJlZ2luLCBsZW5ndGgsIGNoaWxkU3RyaW5nc1tpXS5sZW5ndGgoKSwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9FTlVNKSwgY2hpbGRTdHJpbmdzW2ldLCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1RBR19JTlNFUlRJT04pOwotCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHRleHRQcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoKHBhcmVudERlY2wgIT0gbnVsbCkgJiYgKHBhcmVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEpKSB7Ci0JCQkJYWRkUENEQVRBUHJvcG9zYWwocGFyZW50RGVjbC5nZXROb2RlTmFtZSgpLCBjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyByZXRyaWV2ZSB0aGUgbGlzdCBvZiBhbGwgcG9zc2libGUgY2hpbGRyZW4gd2l0aGluIHRoaXMKLQkJCQkvLyBwYXJlbnQgY29udGV4dAotCQkJCWNtbm9kZXMgPSBnZXRBdmFpbGFibGVDaGlsZEVsZW1lbnREZWNsYXJhdGlvbnMoKEVsZW1lbnQpIHBhcmVudCwgY2hpbGRQb3NpdGlvbiwgTW9kZWxRdWVyeUFjdGlvbi5JTlNFUlQpOwotCi0JCQkJLy8gcmV0cmlldmUgdGhlIGxpc3Qgb2YgdGhlIHBvc3NpYmxlIGNoaWxkcmVuIHdpdGhpbiB0aGlzCi0JCQkJLy8gcGFyZW50IGNvbnRleHQgYW5kIGF0IHRoaXMgaW5kZXgKLQkJCQlMaXN0IHN0cmljdENNTm9kZVN1Z2dlc3Rpb25zID0gbnVsbDsKLQkJCQlpZiAoWE1MVUlQcmVmZXJlbmNlTmFtZXMuU1VHR0VTVElPTl9TVFJBVEVHWV9WQUxVRV9TVFJJQ1QuZXF1YWxzKFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlNVR0dFU1RJT05fU1RSQVRFR1kpKSkgewotCQkJCQlzdHJpY3RDTU5vZGVTdWdnZXN0aW9ucyA9IGdldFZhbGlkQ2hpbGRFbGVtZW50RGVjbGFyYXRpb25zKChFbGVtZW50KSBwYXJlbnQsIGNoaWxkUG9zaXRpb24sIE1vZGVsUXVlcnlBY3Rpb24uSU5TRVJUKTsKLQkJCQl9Ci0JCQkJSXRlcmF0b3Igbm9kZUl0ZXJhdG9yID0gY21ub2Rlcy5pdGVyYXRvcigpOwotCQkJCWlmICghbm9kZUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlpZiAoZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50KSAhPSBudWxsKSB7Ci0JCQkJCQllcnJvciA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuX0hhc19ub19hdmFpbGFibGVfY2hpbGQsIChuZXcgT2JqZWN0W117cGFyZW50LmdldE5vZGVOYW1lKCl9KSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQllcnJvciA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuRWxlbWVudF9faXNfdW5rbm93biwgKG5ldyBPYmplY3RbXXtwYXJlbnQuZ2V0Tm9kZU5hbWUoKX0pKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlTdHJpbmcgbWF0Y2hTdHJpbmcgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpOwotCQkJCS8vIGNob3Agb2ZmIGFueSBsZWFkaW5nIDwncyBhbmQgd2hpdGVzcGFjZSBmcm9tIHRoZQotCQkJCS8vIG1hdGNoc3RyaW5nCi0JCQkJd2hpbGUgKChtYXRjaFN0cmluZy5sZW5ndGgoKSA+IDApICYmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG1hdGNoU3RyaW5nLmNoYXJBdCgwKSkgfHwgYmVnaW5zV2l0aChtYXRjaFN0cmluZywgIjwiKSkpIHsKLQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCQltYXRjaFN0cmluZyA9IG1hdGNoU3RyaW5nLnN1YnN0cmluZygxKTsKLQkJCQl9Ci0JCQkJd2hpbGUgKG5vZGVJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IG8gPSBub2RlSXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIENNRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgbzsKLQkJCQkJCS8vIG9ubHkgYWRkIHByb3Bvc2FscyBmb3IgdGhlIGNoaWxkIGVsZW1lbnQncyB0aGF0Ci0JCQkJCQkvLyBiZWdpbiB3aXRoIHRoZSBtYXRjaHN0cmluZwotCQkJCQkJU3RyaW5nIHRhZ25hbWUgPSBnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBlbGVtZW50RGVjbCk7Ci0JCQkJCQlib29sZWFuIGlzU3RyaWN0Q01Ob2RlU3VnZ2VzdGlvbiA9IHN0cmljdENNTm9kZVN1Z2dlc3Rpb25zICE9IG51bGwgPyBzdHJpY3RDTU5vZGVTdWdnZXN0aW9ucy5jb250YWlucyhlbGVtZW50RGVjbCkgOiBmYWxzZTsKLQotCQkJCQkJSW1hZ2UgaW1hZ2UgPSBDTUltYWdlVXRpbC5nZXRJbWFnZShlbGVtZW50RGVjbCk7Ci0KLQkJCQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQkJaWYgKHN0cmljdENNTm9kZVN1Z2dlc3Rpb25zICE9IG51bGwpIHsKLQkJCQkJCQkJaW1hZ2UgPSBpc1N0cmljdENNTm9kZVN1Z2dlc3Rpb24gPyBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDX0VNUEhBU0laRUQpIDogWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQ19ERUVNUEhBU0laRUQpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJaW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCX0KLQotCQkJCQkJLy8gaW50IG1hcmt1cEFkanVzdG1lbnQgPQotCQkJCQkJLy8gZ2V0Q29udGVudEdlbmVyYXRvcigpLmdldE1pbmltYWxTdGFydFRhZ0xlbmd0aChwYXJlbnQsCi0JCQkJCQkvLyBlbGVtZW50RGVjbCk7Ci0JCQkJCQlpZiAoYmVnaW5zV2l0aCh0YWduYW1lLCBtYXRjaFN0cmluZykpIHsKLQkJCQkJCQlTdHJpbmcgcHJvcG9zZWRUZXh0ID0gZ2V0UmVxdWlyZWRUZXh0KHBhcmVudCwgZWxlbWVudERlY2wpOwotCi0JCQkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg5ODExCi0JCQkJCQkJLy8gcGxhY2UgY3Vyc29yIGluIGZpcnN0IGVtcHR5IHF1b3RlcwotCQkJCQkJCWludCBtYXJrdXBBZGp1c3RtZW50ID0gZ2V0Q3Vyc29yUG9zaXRpb25Gb3JQcm9wb3NlZFRleHQocHJvcG9zZWRUZXh0KTsKLQotCQkJCQkJCVN0cmluZyBwcm9wb3NlZEluZm8gPSBnZXRBZGRpdGlvbmFsSW5mbyhwYXJlbnREZWNsLCBlbGVtZW50RGVjbCk7Ci0JCQkJCQkJaW50IHJlbGV2YW5jZSA9IGlzU3RyaWN0Q01Ob2RlU3VnZ2VzdGlvbiA/IFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1NUUklDVExZX1ZBTElEX1RBR19JTlNFUlRJT04gOiBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9UQUdfSU5TRVJUSU9OOwotCQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgbWFya3VwQWRqdXN0bWVudCwgaW1hZ2UsIHRhZ25hbWUsIG51bGwsIHByb3Bvc2VkSW5mbywgcmVsZXZhbmNlKTsKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFByb3Bvc2FscygpLnNpemUoKSA9PSAwKSB7Ci0JCQkJCWlmIChlcnJvciAhPSBudWxsKSB7Ci0JCQkJCQlzZXRFcnJvck1lc3NhZ2UoZXJyb3IpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpICE9IG51bGwpICYmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChYTUxVSU1lc3NhZ2VzLk5vX2tub3duX2NoaWxkX3RhZywgKG5ldyBPYmplY3RbXXtwYXJlbnQuZ2V0Tm9kZU5hbWUoKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKX0pKSk7Ci0JCQkJCQkvLyROT04tTkxTLTEkID0gIk5vIGtub3duIGNoaWxkIHRhZyBuYW1lcyBvZiA8ezB9PiBiZWdpbiB3aXRoIFwiezF9XCIuIgotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuX19IYXNfbm9fa25vd25fY2hpbGQsIChuZXcgT2JqZWN0W117cGFyZW50LmdldE5vZGVOYW1lKCl9KSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJLy8gQ2FuIG9ubHkgcHJvbXB0IHdpdGggZWxlbWVudHMgaWYgdGhlIGN1cnNvciBwb3NpdGlvbiBpcyBwYXN0Ci0JCQkvLyB0aGUgWE1MIHByb2Nlc3NpbmcKLQkJCS8vIGluc3RydWN0aW9uIGFuZCBET0NUWVBFIGRlY2xhcmF0aW9uCi0JCQlib29sZWFuIHhtbHBpRm91bmQgPSBmYWxzZTsKLQkJCWJvb2xlYW4gZG9jdHlwZUZvdW5kID0gZmFsc2U7Ci0JCQlpbnQgbWluaW11bU9mZnNldCA9IC0xOwotCi0JCQlmb3IgKE5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQotCQkJCWJvb2xlYW4geG1scGkgPSAoKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpICYmIGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJ4bWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlib29sZWFuIGRvY3R5cGUgPSBjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFOwotCQkJCWlmICh4bWxwaSB8fCAoZG9jdHlwZSAmJiAobWluaW11bU9mZnNldCA8IDApKSkgewotCQkJCQltaW5pbXVtT2Zmc2V0ID0gKChJRE9NTm9kZSkgY2hpbGQpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKSArICgoSURPTU5vZGUpIGNoaWxkKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHRMZW5ndGgoKTsKLQkJCQl9Ci0JCQkJeG1scGlGb3VuZCA9IHhtbHBpRm91bmQgfHwgeG1scGk7Ci0JCQkJZG9jdHlwZUZvdW5kID0gZG9jdHlwZUZvdW5kIHx8IGRvY3R5cGU7Ci0JCQl9Ci0KLQkJCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSA+PSBtaW5pbXVtT2Zmc2V0KSB7Ci0JCQkJTGlzdCBjaGlsZERlY2xzID0gZ2V0QXZhaWxhYmxlUm9vdENoaWxkcmVuKChEb2N1bWVudCkgcGFyZW50LCBjaGlsZFBvc2l0aW9uKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkRGVjbHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNoaWxkRGVjbHMuZ2V0KGkpOwotCQkJCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJCQkJSW1hZ2UgaW1hZ2UgPSBDTUltYWdlVXRpbC5nZXRJbWFnZShlZCk7Ci0JCQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJCWltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyk7Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgcHJvcG9zZWRUZXh0ID0gZ2V0UmVxdWlyZWRUZXh0KHBhcmVudCwgZWQpOwotCQkJCQkJU3RyaW5nIHRhZ25hbWUgPSBnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBlZCk7Ci0JCQkJCQkvLyBhY2NvdW50IGZvciB0aGUgJmx0OyBhbmQgJmd0OwotCQkJCQkJaW50IG1hcmt1cEFkanVzdG1lbnQgPSBnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2V0TWluaW1hbFN0YXJ0VGFnTGVuZ3RoKHBhcmVudCwgZWQpOwotCQkJCQkJU3RyaW5nIHByb3Bvc2VkSW5mbyA9IGdldEFkZGl0aW9uYWxJbmZvKG51bGwsIGVkKTsKLQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgbWFya3VwQWRqdXN0bWVudCwgaW1hZ2UsIHRhZ25hbWUsIG51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfVEFHX0lOU0VSVElPTik7Ci0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgY2hpbGRQb3NpdGlvbikgewotCQlMaXN0IGNtbm9kZXMgPSBudWxsOwotCQlOb2RlIHBhcmVudCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFBhcmVudCgpOwotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCk7Ci0JCVN0cmluZyBlcnJvciA9IG51bGw7Ci0JCVN0cmluZyBtYXRjaFN0cmluZyA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCk7Ci0JCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJLy8gcmV0cmlldmUgdGhlIGxpc3Qgb2YgY2hpbGRyZW4KLQkJCS8vIHZhbGlkQWN0aW9ucyA9IGdldEF2YWlsYWJsZUNoaWxkcmVuQXRJbmRleCgoRWxlbWVudCkgcGFyZW50LAotCQkJLy8gY2hpbGRQb3NpdGlvbik7Ci0JCQljbW5vZGVzID0gZ2V0QXZhaWxhYmxlQ2hpbGRFbGVtZW50RGVjbGFyYXRpb25zKChFbGVtZW50KSBwYXJlbnQsIGNoaWxkUG9zaXRpb24sIE1vZGVsUXVlcnlBY3Rpb24uSU5TRVJUKTsKLQkJCUl0ZXJhdG9yIG5vZGVJdGVyYXRvciA9IGNtbm9kZXMuaXRlcmF0b3IoKTsKLQkJCS8vIGNob3Agb2ZmIGFueSBsZWFkaW5nIDwncyBhbmQgd2hpdGVzcGFjZSBmcm9tIHRoZSBtYXRjaHN0cmluZwotCQkJd2hpbGUgKChtYXRjaFN0cmluZy5sZW5ndGgoKSA+IDApICYmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG1hdGNoU3RyaW5nLmNoYXJBdCgwKSkgfHwgYmVnaW5zV2l0aChtYXRjaFN0cmluZywgIjwiKSkpIHsKLQkJCQkvLyROT04tTkxTLTEkCi0JCQkJbWF0Y2hTdHJpbmcgPSBtYXRjaFN0cmluZy5zdWJzdHJpbmcoMSk7Ci0JCQl9Ci0JCQlpZiAoIW5vZGVJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQllcnJvciA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuX19IYXNfbm9fa25vd25fY2hpbGQsIChuZXcgT2JqZWN0W117cGFyZW50LmdldE5vZGVOYW1lKCl9KSk7Ci0JCQl9Ci0JCQl3aGlsZSAobm9kZUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUNNTm9kZSBlbGVtZW50RGVjbCA9IChDTU5vZGUpIG5vZGVJdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnREZWNsICE9IG51bGwpIHsKLQkJCQkJLy8gb25seSBhZGQgcHJvcG9zYWxzIGZvciB0aGUgY2hpbGQgZWxlbWVudCdzIHRoYXQgYmVnaW4KLQkJCQkJLy8gd2l0aCB0aGUgbWF0Y2hzdHJpbmcKLQkJCQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9IG51bGw7Ci0JCQkJCWludCBjdXJzb3JBZGp1c3RtZW50ID0gMDsKLQotCQkJCQkvLyBkbyBhIGNoZWNrIHRvIHNlZSBpZiBwYXJ0aWFsIGF0dHJpYnV0ZXMgb2YgcGFydGlhbCB0YWcKLQkJCQkJLy8gbmFtZXMgYXJlIGluIGxpc3QKLQkJCQkJaWYgKCgobm9kZSAhPSBudWxsKSAmJiAobm9kZS5nZXRBdHRyaWJ1dGVzKCkgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldExlbmd0aCgpID4gMCkgJiYgYXR0cmlidXRlSW5MaXN0KG5vZGUsIHBhcmVudCwgZWxlbWVudERlY2wpKSB8fCAoKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkgJiYgbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmlzRW5kZWQoKSkpIHsKLQotCQkJCQkJcHJvcG9zZWRUZXh0ID0gZ2V0UmVxdWlyZWROYW1lKHBhcmVudCwgZWxlbWVudERlY2wpOwotCQkJCQkJY3Vyc29yQWRqdXN0bWVudCA9IHByb3Bvc2VkVGV4dC5sZW5ndGgoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXByb3Bvc2VkVGV4dCA9IGdldFJlcXVpcmVkTmFtZShwYXJlbnQsIGVsZW1lbnREZWNsKTsKLQkJCQkJCWN1cnNvckFkanVzdG1lbnQgPSBwcm9wb3NlZFRleHQubGVuZ3RoKCk7Ci0JCQkJCQlpZiAoZWxlbWVudERlY2wgaW5zdGFuY2VvZiBDTUVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50RGVjbDsKLQkJCQkJCQlpZiAoZWQuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkgewotCQkJCQkJCQlwcm9wb3NlZFRleHQgKz0gZ2V0Q29udGVudEdlbmVyYXRvcigpLmdldFN0YXJ0VGFnQ2xvc2UocGFyZW50LCBlZCk7Ci0JCQkJCQkJCWN1cnNvckFkanVzdG1lbnQgPSBwcm9wb3NlZFRleHQubGVuZ3RoKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODk4MTEKLQkJCQkJCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJCQlnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2VuZXJhdGVUYWcocGFyZW50LCBlZCwgc2IpOwotCQkJCQkJCQkvLyBzaW5jZSBpdCdzIGEgbmFtZSBwcm9wb3NhbCwgYXNzdW1lICc8JyBpcwotCQkJCQkJCQkvLyBhbHJlYWR5IHRoZXJlCi0JCQkJCQkJCS8vIG9ubHkgcmV0dXJuIHRoZSByZXN0IG9mIHRoZSB0YWcKLQkJCQkJCQkJcHJvcG9zZWRUZXh0ID0gc2IudG9TdHJpbmcoKS5zdWJzdHJpbmcoMSk7Ci0JCQkJCQkJCWN1cnNvckFkanVzdG1lbnQgPSBnZXRDdXJzb3JQb3NpdGlvbkZvclByb3Bvc2VkVGV4dChwcm9wb3NlZFRleHQpOwotCi0JCQkJCQkJCS8vIGN1cnNvckFkanVzdG1lbnQgPSBwcm9wb3NlZFRleHQubGVuZ3RoKCkgKwotCQkJCQkJCQkvLyAxOwotCQkJCQkJCQkvLyBwcm9wb3NlZFRleHQgKz0gIj48LyIgKwotCQkJCQkJCQkvLyBnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBlbGVtZW50RGVjbCkgKyAiPiI7Ci0JCQkJCQkJCS8vIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChiZWdpbnNXaXRoKHByb3Bvc2VkVGV4dCwgbWF0Y2hTdHJpbmcpKSB7Ci0JCQkJCQlJbWFnZSBpbWFnZSA9IENNSW1hZ2VVdGlsLmdldEltYWdlKGVsZW1lbnREZWNsKTsKLQkJCQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQkJaW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDKTsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBwcm9wb3NlZEluZm8gPSBnZXRBZGRpdGlvbmFsSW5mbyhnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnQpLCBlbGVtZW50RGVjbCk7Ci0JCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2VkVGV4dCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIGN1cnNvckFkanVzdG1lbnQsIGltYWdlLCBnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBlbGVtZW50RGVjbCksIG51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfVEFHX05BTUUpOwotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFByb3Bvc2FscygpLnNpemUoKSA9PSAwKSB7Ci0JCQkJaWYgKGVycm9yICE9IG51bGwpIHsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKGVycm9yKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkgIT0gbnVsbCkgJiYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSkgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5Ob19rbm93bl9jaGlsZF90YWdfbmFtZXMsIChuZXcgT2JqZWN0W117cGFyZW50LmdldE5vZGVOYW1lKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCl9KSkpOwotCQkJCQkvLyROT04tTkxTLTEkID0gIk5vIGtub3duIGNoaWxkIHRhZyBuYW1lcyBvZiA8ezB9PiBiZWdpbiB3aXRoIFwiezF9XCIiCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5fX0hhc19ub19rbm93bl9jaGlsZCwgKG5ldyBPYmplY3RbXXtwYXJlbnQuZ2V0Tm9kZU5hbWUoKX0pKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJTGlzdCBjaGlsZEVsZW1lbnRzID0gZ2V0QXZhaWxhYmxlUm9vdENoaWxkcmVuKChEb2N1bWVudCkgcGFyZW50LCBjaGlsZFBvc2l0aW9uKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCUNNTm9kZSBlZCA9IChDTU5vZGUpIGNoaWxkRWxlbWVudHMuZ2V0KGkpOwotCQkJCWlmIChlZCA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlTdHJpbmcgcHJvcG9zZWRUZXh0ID0gbnVsbDsKLQkJCQlpbnQgY3Vyc29yQWRqdXN0bWVudCA9IDA7Ci0JCQkJaWYgKGVkIGluc3RhbmNlb2YgQ01FbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCQkJLy8gcHJvcG9zZWRUZXh0ID0gZ2V0UmVxdWlyZWROYW1lKHBhcmVudCwgZWQpOwotCQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCWdldENvbnRlbnRHZW5lcmF0b3IoKS5nZW5lcmF0ZVRhZyhwYXJlbnQsIChDTUVsZW1lbnREZWNsYXJhdGlvbikgZWQsIHNiKTsKLQkJCQkJLy8gdGFnIHN0YXJ0cyB3LyAnPCcsIGJ1dCB3ZSB3YW50IHRvIGNvbXBhcmUgdG8gbmFtZQotCQkJCQlwcm9wb3NlZFRleHQgPSBzYi50b1N0cmluZygpLnN1YnN0cmluZygxKTsKLQotCQkJCQlpZiAoIWJlZ2luc1dpdGgocHJvcG9zZWRUZXh0LCBtYXRjaFN0cmluZykpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJY3Vyc29yQWRqdXN0bWVudCA9IGdldEN1cnNvclBvc2l0aW9uRm9yUHJvcG9zZWRUZXh0KHByb3Bvc2VkVGV4dCk7Ci0KLQkJCQkJaWYgKGVkIGluc3RhbmNlb2YgQ01FbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBlZDsKLQkJCQkJCWlmIChlbGVtZW50RGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKSB7Ci0JCQkJCQkJcHJvcG9zZWRUZXh0ICs9IGdldENvbnRlbnRHZW5lcmF0b3IoKS5nZXRTdGFydFRhZ0Nsb3NlKHBhcmVudCwgZWxlbWVudERlY2wpOwotCQkJCQkJCWN1cnNvckFkanVzdG1lbnQgPSBwcm9wb3NlZFRleHQubGVuZ3RoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlTdHJpbmcgcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8obnVsbCwgZWQpOwotCQkJCQlJbWFnZSBpbWFnZSA9IENNSW1hZ2VVdGlsLmdldEltYWdlKGVkKTsKLQkJCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkJCWltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyk7Ci0JCQkJCX0KLQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBjdXJzb3JBZGp1c3RtZW50LCBpbWFnZSwgZ2V0UmVxdWlyZWROYW1lKHBhcmVudCwgZWQpLCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1RBR19OQU1FKTsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHRoaXMgaXMgdGhlIHBvc2l0aW9uIHRoZSBjdXJzb3Igc2hvdWxkIGJlIGluIGFmdGVyIHRoZSBwcm9wb3NhbCBpcwotCSAqIGFwcGxpZWQKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcG9zZWRUZXh0Ci0JICogQHJldHVybiB0aGUgcG9zaXRpb24gdGhlIGN1cnNvciBzaG91bGQgYmUgaW4gYWZ0ZXIgdGhlIHByb3Bvc2FsIGlzCi0JICogICAgICAgICBhcHBsaWVkCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0Q3Vyc29yUG9zaXRpb25Gb3JQcm9wb3NlZFRleHQoU3RyaW5nIHByb3Bvc2VkVGV4dCkgewotCQlpbnQgY3Vyc29yQWRqdXN0bWVudDsKLQkJY3Vyc29yQWRqdXN0bWVudCA9IHByb3Bvc2VkVGV4dC5pbmRleE9mKCJcIlwiIikgKyAxOyAvLyROT04tTkxTLTEkCi0JCS8vIG90aGVyd2lzZSwgYWZ0ZXIgdGhlIGZpcnN0IHRhZwotCQlpZiAoY3Vyc29yQWRqdXN0bWVudCA9PSAwKSB7Ci0JCQljdXJzb3JBZGp1c3RtZW50ID0gcHJvcG9zZWRUZXh0LmluZGV4T2YoJz4nKSArIDE7Ci0JCX0KLQkJaWYgKGN1cnNvckFkanVzdG1lbnQgPT0gMCkgewotCQkJY3Vyc29yQWRqdXN0bWVudCA9IHByb3Bvc2VkVGV4dC5sZW5ndGgoKSArIDE7Ci0JCX0KLQotCQlyZXR1cm4gY3Vyc29yQWRqdXN0bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBYTUwgcHJvcG9zYWwgaXMgYWRkZWQgdmlhIHhtbCBkZWNsYXJhdGlvbiB0ZW1wbGF0ZSBpbnN0ZWFkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkWE1MUHJvcG9zYWwoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCIiICsgQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLmdldFVzZXJQcmVmZXJyZWRDaGFyc2V0TmFtZShDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKSArICJcIj8+IjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgcHJvcG9zZWRUZXh0Lmxlbmd0aCgpLCBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1BST0NFU1NJTkdJTlNUUlVDVElPTiksIHByb3Bvc2VkVGV4dCwgbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfWE1MX0RFQ0xBUkFUSU9OKTsKLQkJLy8gVE9ETyBhZGQgc3BlY2lhbCBYTUwgcHJvcG9zYWwgaW5mbwotCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZGV0ZXJtaW5lcyBpZiBhbnkgb2YgdGhlIGF0dHJpYnV0ZXMgaW4gdGhlIHByb3Bvc2VkIFhNTE5vZGUKLQkgKiBub2RlLCBhcmUgcG9zc2libGUgdmFsdWVzIG9mIGF0dHJpYnV0ZXMgZnJvbSBwb3NzaWJsZSBFbGVtZW50cyBhdCB0aGlzCi0JICogcG9pbnQgaW4gdGhlIGRvY3VtZW50IGFjY29yZGluZyB0byB0aGUgQ29udGVudCBNb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgd2l0aCBhdHRyaWJ1dGVzIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gdGVzdCBpZgotCSAqICAgICAgICAgICAgYXJlIHBvc3NpYmxlIGZvciBwb3NzaWJsZSBFbGVtZW50cyBhdCB0aGlzIHBvaW50Ci0JICogQHBhcmFtIGNtbm9kZQotCSAqICAgICAgICAgICAgcG9zc2libGUgZWxlbWVudCBhdCB0aGlzIHBvaW50IGluIHRoZSBkb2N1bWVudCAoZGVwZW5kaW5nIG9uCi0JICogICAgICAgICAgICB3aGF0ICdub2RlJyBpcykgdHJ1ZSBpZiBhbnkgYXR0cmlidXRlcyBvZiAnbm9kZScgbWF0Y2ggYW55Ci0JICogICAgICAgICAgICBwb3NzaWJsZSBhdHRyaWJ1dGVzIGZyb20gJ2Ntbm9kZXMnIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXR0cmlidXRlSW5MaXN0KElET01Ob2RlIG5vZGUsIE5vZGUgcGFyZW50LCBDTU5vZGUgY21ub2RlKSB7Ci0JCWlmICgobm9kZSA9PSBudWxsKSB8fCAocGFyZW50ID09IG51bGwpIHx8IChjbW5vZGUgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgZWxlbWVudE1hdGNoU3RyaW5nID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQlTdHJpbmcgY21ub2RlTmFtZSA9IGdldFJlcXVpcmVkTmFtZShwYXJlbnQsIGNtbm9kZSk7Ly8gY21ub2RlLmdldE5vZGVOYW1lKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJTmFtZWROb2RlTWFwIG1hcCA9ICgoRWxlbWVudCkgbm9kZSkuZ2V0QXR0cmlidXRlcygpOwotCQkJU3RyaW5nIGF0dHJNYXRjaFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlDTU5hbWVkTm9kZU1hcCBjbWF0dHJNYXAgPSBudWxsOwotCQkJLy8gaXRlcmF0ZSBhdHRyaWJ1dGUgcG9zc2liaWxpdGllcyBmb3IgcGFydGlhbGx5IHN0YXJ0ZWQgbm9kZQotCQkJZm9yIChpbnQgaSA9IDA7IChtYXAgIT0gbnVsbCkgJiYgKGkgPCBtYXAuZ2V0TGVuZ3RoKCkpOyBpKyspIHsKLQkJCQlhdHRyTWF0Y2hTdHJpbmcgPSBtYXAuaXRlbShpKS5nZXROb2RlTmFtZSgpOwotCQkJCS8vIGZpbHRlciBvbiB3aGF0ZXZlciB1c2VyIHR5cGVkIGZvciBlbGVtZW50IG5hbWUgYWxyZWFkeQotCQkJCWlmIChiZWdpbnNXaXRoKGNtbm9kZU5hbWUsIGVsZW1lbnRNYXRjaFN0cmluZykpIHsKLQkJCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCQljbWF0dHJNYXAgPSAoKENNRWxlbWVudERlY2xhcmF0aW9uKSBjbW5vZGUpLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkJCQkJQ01OYW1lZE5vZGVNYXBJbXBsIGFsbEF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKGNtYXR0ck1hcCk7Ci0JCQkJCQlMaXN0IG5vZGVzID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShub2RlLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QXZhaWxhYmxlQ29udGVudCgoRWxlbWVudCkgbm9kZSwgKENNRWxlbWVudERlY2xhcmF0aW9uKSBjbW5vZGUsIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbm9kZXMuc2l6ZSgpOyBrKyspIHsKLQkJCQkJCQlDTU5vZGUgYWRub2RlID0gKENNTm9kZSkgbm9kZXMuZ2V0KGspOwotCQkJCQkJCWlmIChhZG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCQkJCWFsbEF0dHJpYnV0ZXMucHV0KGFkbm9kZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY21hdHRyTWFwID0gYWxsQXR0cmlidXRlczsKLQkJCQkJCQotCQkJCQkJLy8gaXRlcmF0ZSBwb3NzaWJsZSBhdHRyaWJ1dGVzIGZyb20gYSBjbW5vZGUgaW4KLQkJCQkJCS8vIHByb3Bvc2FsIGxpc3QKLQkJCQkJCWZvciAoaW50IGsgPSAwOyAoY21hdHRyTWFwICE9IG51bGwpICYmIChrIDwgY21hdHRyTWFwLmdldExlbmd0aCgpKTsgaysrKSB7Ci0JCQkJCQkJLy8gY2hlY2sgaWYgbmFtZSBtYXRjaGVzCi0JCQkJCQkJaWYgKGNtYXR0ck1hcC5pdGVtKGspLmdldE5vZGVOYW1lKCkuZXF1YWxzKGF0dHJNYXRjaFN0cmluZykpIHsKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiZWdpbnNXaXRoKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgcHJlZml4KSB7Ci0JCWlmICgoYVN0cmluZyA9PSBudWxsKSB8fCAocHJlZml4ID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyAocGEpIG1hdGNoaW5nIGluZGVwZW5kZW50IG9mIGNhc2UgdG8gYmUgY29uc2lzdGFudCB3aXRoIEphdmEKLQkJLy8gZWRpdG9yIENBCi0JCXJldHVybiBhU3RyaW5nLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChwcmVmaXgudG9Mb3dlckNhc2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVBdHRyaWJ1dGVQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkgewotCQkJLy8gc2V0dXAgdG8gaW5zZXJ0IG5ldyBhdHRyaWJ1dGVzCi0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIFNldHVwIHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgYXR0cmlidXRlIG5hbWUKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbiksIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCX0KLQkJYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LnNldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJY29udGVudEFzc2lzdFJlcXVlc3Quc2V0UmVwbGFjZW1lbnRMZW5ndGgoMCk7Ci0JCWlmICgobm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpICYmICghbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmlzRW5kZWQoKSkpIHsKLQkJCWFkZFRhZ0Nsb3NlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJfQotCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQlpZiAoKGRvY3VtZW50UG9zaXRpb24gPiBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpKSAmJiAoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKyBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSAhPSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArIGNvbXBsZXRpb25SZWdpb24uZ2V0TGVuZ3RoKCkpKSB7Ci0JCQkvLyBzZXR1cCB0byBhZGQgYSBuZXcgYXR0cmlidXRlIGF0IHRoZSBkb2N1bWVudFBvc2l0aW9uCi0JCQlJRE9NTm9kZSBhY3R1YWxOb2RlID0gKElET01Ob2RlKSBub2RlLmdldE1vZGVsKCkuZ2V0SW5kZXhlZFJlZ2lvbihzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSk7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KGFjdHVhbE5vZGUsIGFjdHVhbE5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQlhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCWlmICgoYWN0dWFsTm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpICYmICFhY3R1YWxOb2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuaXNFbmRlZCgpKSB7Ci0JCQkJYWRkVGFnQ2xvc2VQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gc2V0dXAgdG8gcmVwbGFjZSB0aGUgZXhpc3RpbmcgdmFsdWUKLQkJCWlmICghbm9kZUF0T2Zmc2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuaXNFbmRlZCgpICYmIChkb2N1bWVudFBvc2l0aW9uIDwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpKSB7Ci0JCQkJLy8gaWYgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXNuJ3QgY2xvc2VkIGFuZCB0aGUKLQkJCQkvLyBjdXJzb3IgaXMgaW4gZnJvbnQgb2YgdGhlIHZhbHVlLCBhZGQKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCQlhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbiksIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCQkJYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgdHJlZU5vZGUsIElET01Ob2RlIHhtbG5vZGUpIHsKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCi0JCS8vIEhhbmRsZSB0aGUgbW9zdCBjb21tb24gYW5kIGJlc3Qgc3VwcG9ydGVkIGNhc2VzCi0JCWlmICgoeG1sbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB8fCAoeG1sbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkpIHsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlVGFnT3BlblByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gY29tcHV0ZVRhZ05hbWVQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlQXR0cmlidXRlUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlRXF1YWxzUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmICgocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSAmJiAoZG9jdW1lbnRQb3NpdGlvbiA9PSBzZFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KCkpICYmIChzZFJlZ2lvbi5nZXRUZXh0KGNvbXBsZXRpb25SZWdpb24pLmVuZHNXaXRoKCJcIiIpIHx8IHNkUmVnaW9uLmdldFRleHQoY29tcGxldGlvblJlZ2lvbikuZW5kc1dpdGgoIlwnIikpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXsKLQkJCQkvLyB0aGlzIGlzIGZvciB3aGVuIHRoZSBjdXJzb3IgaXMgYXQgdGhlIGVuZCBvZiB0aGUgY2xvc2luZwotCQkJCS8vIHF1b3RlIGZvciBhbiBhdHRyaWJ1dGUuLgotCQkJCUlET01Ob2RlIGFjdHVhbE5vZGUgPSAoSURPTU5vZGUpIHhtbG5vZGUuZ2V0TW9kZWwoKS5nZXRJbmRleGVkUmVnaW9uKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKTsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KGFjdHVhbE5vZGUsIGFjdHVhbE5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQkJYWRkVGFnQ2xvc2VQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB8fCAocmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfRElSRUNUSVZFX0NMT1NFKSkpIHsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IGNvbXB1dGVUYWdDbG9zZVByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IGNvbXB1dGVFbmRUYWdPcGVuUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmICgocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB8fCAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSkgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSkgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUEVfUkVGRVJFTkNFKSkgewotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gY29tcHV0ZUNvbnRlbnRQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJCX0KLQotCQkJLy8gVGhlc2UgSVRleHRSZWdpb24gdHlwZXMgYmVnaW4gRE9NIEVsZW1lbnRzIGFzIHdlbGwgYW5kIGFsdGhvdWdoCi0JCQkvLyBpbnRlcm5hbGx5IGhhcmRlciB0byBhc3Npc3QsCi0JCQkvLyB0ZXh0IGluc2VydGlvbnMgZGlyZWN0bHkgYmVmb3JlIHRoZW0gY2FuIGJlIG1hZGUKLQkJCWVsc2UgaWYgKChkb2N1bWVudFBvc2l0aW9uID09IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKSAmJiAocmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfQ09NTUVOVF9PUEVOKSB8fCByZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9ERUNMQVJBVElPTl9PUEVOKSB8fCByZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9ESVJFQ1RJVkVfT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfRVhQUkVTU0lPTl9PUEVOKSB8fCByZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9TQ1JJUFRMRVRfT1BFTikgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fT1BFTikgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTikgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOKSB8fCAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOKSkpIHsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KHRyZWVOb2RlLCB4bWxub2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCQlhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbkZvck1vZGVsUXVlcnkodHJlZU5vZGUpKTsKLQkJCQlhZGRTdGFydERvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCX0KLQkJfQotCQkvLyBOb3QgYSBEb2N1bWVudCBvciBFbGVtZW50PyAob2RkIGNhc2VzIGdvIGhlcmUgZm9yIG5vdykKLQkJZWxzZSBpZiAoaXNDbG9zZVJlZ2lvbihjb21wbGV0aW9uUmVnaW9uKSkgewotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdCh0cmVlTm9kZSwgeG1sbm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArIGNvbXBsZXRpb25SZWdpb24uZ2V0TGVuZ3RoKCksIDAsIG1hdGNoU3RyaW5nKTsKLQkJCWFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPj0gc2RSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkgewotCQkJCWFkZFRhZ0luc2VydGlvblByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgZ2V0RWxlbWVudFBvc2l0aW9uRm9yTW9kZWxRdWVyeSh0cmVlTm9kZSkgKyAxKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICgoZG9jdW1lbnRQb3NpdGlvbiA9PSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkgJiYgKHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0NPTU1FTlRfT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfREVDTEFSQVRJT05fT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfRElSRUNUSVZFX09QRU4pIHx8IHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0VYUFJFU1NJT05fT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfU0NSSVBUTEVUX09QRU4pIHx8IChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4pIHx8IChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pIHx8IChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTikgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTikpKSB7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KHRyZWVOb2RlLCB4bWxub2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCWFkZFRhZ0luc2VydGlvblByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgZ2V0RWxlbWVudFBvc2l0aW9uRm9yTW9kZWxRdWVyeSh0cmVlTm9kZSkpOwotCQkJYWRkU3RhcnREb2N1bWVudFByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCX0KLQotCS8qKgotCSAqIENPTlRFTlQgQVNTSVNUIFNUQVJUUyBIRVJFCi0JICogCi0JICogUmV0dXJuIGEgbGlzdCBvZiBwcm9wb3NlZCBjb2RlIGNvbXBsZXRpb25zIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQKLQkgKiBsb2NhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgY3Vyc29yCi0JICogcG9zaXRpb24gd2l0aGluIHRoZSB0ZXh0LWVkaXRvciBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Vmlld2VyCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24gLQotCSAqICAgICAgICAgICAgdGhlIGN1cnNvciBsb2NhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50Ci0JICogCi0JICogYW4gYXJyYXkgb2YgSUNvbXBsZXRpb25Qcm9wb3NhbHMKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0KLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0JCWZUZXh0Vmlld2VyID0gdGV4dFZpZXdlcjsKLQotCQlJbmRleGVkUmVnaW9uIHRyZWVOb2RlID0gQ29udGVudEFzc2lzdFV0aWxzLmdldE5vZGVBdCh0ZXh0Vmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQotCQlOb2RlIG5vZGUgPSAoTm9kZSkgdHJlZU5vZGU7Ci0JCXdoaWxlICgobm9kZSAhPSBudWxsKSAmJiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAobm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkpIHsKLQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlJRE9NTm9kZSB4bWxub2RlID0gKElET01Ob2RlKSBub2RlOwotCi0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQlJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uID0gZ2V0Q29tcGxldGlvblJlZ2lvbihkb2N1bWVudFBvc2l0aW9uLCBub2RlKTsKLQotCQlTdHJpbmcgbWF0Y2hTdHJpbmcgPSBnZXRNYXRjaFN0cmluZyhzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbik7Ci0KLQkJLy8gSGFuZGxlIGVtcHR5IERvY3VtZW50cwotCQlpZiAoY29tcGxldGlvblJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlpZiAoKCh0cmVlTm9kZSA9PSBudWxsKSB8fCAoKChOb2RlKSB0cmVlTm9kZSkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpKSAmJiAoY29tcGxldGlvblJlZ2lvbiA9PSBudWxsKSAmJiAoKHhtbG5vZGUgPT0gbnVsbCkgfHwgKHhtbG5vZGUuZ2V0Q2hpbGROb2RlcygpID09IG51bGwpIHx8ICh4bWxub2RlLmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSA9PSAwKSkpIHsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQodGV4dFZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJCQl0cnkgewotCQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJCUlET01Eb2N1bWVudCBkb2NOb2RlID0gKChJRE9NTW9kZWwpIHNNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3QoZG9jTm9kZSwgZG9jTm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG51bGwpOwotCQkJCQkJYWRkRW1wdHlEb2N1bWVudFByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdCA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicHJvYmxlbSBnZXR0aW5nIG1vZGVsIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldENvbXBsZXRpb25Qcm9wb3NhbHMoKTsKLQkJCX0KLQkJCS8vIE1BU1NJVkUgRVJST1IgQ09ORElUSU9OCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNvbXBsZXRpb24gcmVnaW9uIHdhcyBudWxsIikpOyAvLyROT04tTkxTLTEkCi0JCQlzZXRFcnJvck1lc3NhZ2UoSU5URVJOQUxFUlJPUik7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KChOb2RlKSB0cmVlTm9kZSwgbm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRDb21wbGV0aW9uUHJvcG9zYWxzKCk7Ci0JCX0KLQotCi0JCS8vIGNhdGNoIGRvY3VtZW50cyB3aGVyZSBubyByZWdpb24gY2FuIGJlIGRldGVybWluZWQKLQkJaWYgKCh4bWxub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAoKGNvbXBsZXRpb25SZWdpb24gPT0gbnVsbCkgfHwgKHhtbG5vZGUuZ2V0Q2hpbGROb2RlcygpID09IG51bGwpIHx8ICh4bWxub2RlLmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSA9PSAwKSkpIHsKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gY29tcHV0ZVN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIChJRE9NTm9kZSkgdHJlZU5vZGUsIHhtbG5vZGUpOwotCQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldENvbXBsZXRpb25Qcm9wb3NhbHMoKTsKLQkJfQotCi0JCS8vIGNvbXB1dGUgbm9ybWFsIHByb3Bvc2FscwotCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCAoSURPTU5vZGUpIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID09IG51bGwpIHsKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3QoKE5vZGUpIHRyZWVOb2RlLCBub2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihVTktOT1dOX0NPTlRFWFQgKyAiICIgKyBjb21wbGV0aW9uUmVnaW9uLmdldFR5cGUoKSArICJAIiArIGRvY3VtZW50UG9zaXRpb24pOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJc2V0RXJyb3JNZXNzYWdlKFVOS05PV05fQ09OVEVYVCk7Ci0JCX0KLQotCQkvKiAKLQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMzg5MgotCQkgKiBPbmx5IHNldCB0aGlzIGVycm9yIG1lc3NhZ2UgaWYgbm90aGluZyBlbHNlIHdhcyBhbHJlYWR5IHNldCAKLQkJICoqLwotCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UHJvcG9zYWxzKCkuc2l6ZSgpID09IDAgJiYgZ2V0RXJyb3JNZXNzYWdlKCkgPT0gbnVsbCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKFVOS05PV05fQ09OVEVYVCk7Ci0JCX0KLQotCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Q29tcGxldGlvblByb3Bvc2FscygpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQ29udGVudFByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCi0JCS8vIHNldHVwIHRvIGFkZCBjaGlsZHJlbiBhdCB0aGUgY29udGVudCBub2RlJ3MgcG9zaXRpb24KLQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUsIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKSwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQlpZiAoKG5vZGUgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpICYmICgoKERvY3VtZW50KSBub2RlKS5nZXREb2N0eXBlKCkgPT0gbnVsbCkpIHsKLQkJCWFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQl9Ci0JCWFkZFRhZ0luc2VydGlvblByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgZ2V0RWxlbWVudFBvc2l0aW9uRm9yTW9kZWxRdWVyeShub2RlQXRPZmZzZXQpKTsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCWFkZEVuZFRhZ1Byb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCX0KLQkJLy8gZW50aXRpZXM/Ci0JCWFkZEVudGl0eVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgZG9jdW1lbnRQb3NpdGlvbiwgY29tcGxldGlvblJlZ2lvbiwgbm9kZSk7Ci0JCS8vIGFkZEVudGl0eVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHBvc3NpYmxlIGNvbnRleHRzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQKLQkgKiBsb2NhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgY3Vyc29yCi0JICogcG9zaXRpb24gd2l0aGluIHRoZSB0ZXh0IHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdmlld2VyIHdob3NlIGRvY3VtZW50IGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgcG9zc2libGUKLQkgKiAgICAgICAgICAgIGNvbnRleHRzIGFuIGFycmF5IG9mIGNvbnRleHQgaW5mb3JtYXRpb24gb2JqZWN0cyBvcgotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gY29udGV4dCBjb3VsZCBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uW10gY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlpZiAoZkF0dHJpYnV0ZUluZm9Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmQXR0cmlidXRlSW5mb1Byb3ZpZGVyID0gbmV3IEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByb3ZpZGVyKChJU3RydWN0dXJlZERvY3VtZW50KSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKSwgKEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlcikgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkpOwotCQl9Ci0JCXJldHVybiBmQXR0cmlidXRlSW5mb1Byb3ZpZGVyLmdldEF0dHJpYnV0ZUluZm9ybWF0aW9uKGRvY3VtZW50T2Zmc2V0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUVuZFRhZ09wZW5Qcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJaW50IGNvbXBsZXRpb25SZWdpb25TdGFydCA9IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pOwotCQlpbnQgY29tcGxldGlvblJlZ2lvbkxlbmd0aCA9IGNvbXBsZXRpb25SZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb25BdENvbXBsZXRpb25PZmZzZXQgPSBub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGNvbXBsZXRpb25SZWdpb25TdGFydCArIGNvbXBsZXRpb25SZWdpb25MZW5ndGgpOwotCQlJVGV4dFJlZ2lvbiByZWdpb25BdEVuZE9mQ29tcGxldGlvbiA9IHNkUmVnaW9uQXRDb21wbGV0aW9uT2Zmc2V0LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGNvbXBsZXRpb25SZWdpb25TdGFydCArIGNvbXBsZXRpb25SZWdpb25MZW5ndGgpOwotCi0JCWlmICgoZG9jdW1lbnRQb3NpdGlvbiAhPSBjb21wbGV0aW9uUmVnaW9uU3RhcnQpICYmIChyZWdpb25BdEVuZE9mQ29tcGxldGlvbiAhPSBudWxsKSAmJiAocmVnaW9uQXRFbmRPZkNvbXBsZXRpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSkgewotCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IHJlZ2lvbkF0RW5kT2ZDb21wbGV0aW9uOwotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGVBdE9mZnNldC5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKSwgbmFtZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIG1hdGNoU3RyaW5nKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChub2RlQXRPZmZzZXQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBzZFJlZ2lvbikgewotCQkJCS8vIGFibm9ybWFsIGNhc2UsIHRoaXMgdW5tYXRjaGVkIGVuZCB0YWcgd2lsbCBiZSBhIHNpYmxpbmcKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZUF0T2Zmc2V0LmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG5vcm1hbCBjYXNlLCB0aGlzIGVuZCB0YWcgaXMgdGhlIHBhcmVudAotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlQXRPZmZzZXQsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgKGRvY3VtZW50UG9zaXRpb24gPj0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKwotCQkvLyBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSkKLQkJYWRkRW5kVGFnUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJLy8gZWxzZQotCQlpZiAoY29tcGxldGlvblJlZ2lvblN0YXJ0ID09IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJCS8vIHBvc2l0aW9uZWQgYXQgc3RhcnQgb2YgZW5kIHRhZwotCQkJYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBub2RlLmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCX0KLQotCS8qKgotCSAqIHJldHVybiBhbGwgcG9zc2libGUgRW50aXR5UmVmZXJlbmNlUHJvcG9zYWxzIChhY2NvcmRpbmcgdG8gY3VycmVudAotCSAqIHBvc2l0aW9uIGluIGRvYykKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVFbnRpdHlSZWZlcmVuY2VQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIHRyZWVOb2RlKSB7Ci0JCS8vIG9ubHkgaGFuZGxlIFhNTCBjb250ZW50IGZvciBub3cKLQkJVmVjdG9yIHByb3Bvc2FscyA9IG5ldyBWZWN0b3IoKTsgLy8gSUNvbXBsZXRpb25Qcm9wb3NhbHMKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJaWYgKChjb21wbGV0aW9uUmVnaW9uICE9IG51bGwpICYmIChjb21wbGV0aW9uUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSkgewotCQkJaW50IG5vZGVPZmZzZXQgPSBkb2N1bWVudFBvc2l0aW9uIC0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbik7Ci0JCQlTdHJpbmcgcmVnaW9uVGV4dCA9IHNkUmVnaW9uLmdldEZ1bGxUZXh0KGNvbXBsZXRpb25SZWdpb24pOwotCi0JCQkvLyBpZiBkaXJlY3RseSB0byB0aGUgcmlnaHQgb2YgYSAmLCByZWdpb24gd2lsbCBiZSBudWxsLCBuZWVkIHRvCi0JCQkvLyBtb3ZlIHRvCi0JCQkvLyB0aGUgcHJldmlvdXMgcmVnaW9uLi4udGhlcmUgbWlnaHQgYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMKLQkJCWlmICgocmVnaW9uVGV4dCAhPSBudWxsKSAmJiByZWdpb25UZXh0LnRyaW0oKS5lcXVhbHMoIiIpICYmIChkb2N1bWVudFBvc2l0aW9uID4gMCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldiA9IHRyZWVOb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24gLSAxKTsKLQkJCQlpZiAoKHByZXYgIT0gbnVsbCkgJiYgcHJldi5nZXRUZXh0KCkuZXF1YWxzKCImIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA2NjgwCi0JCQkJCS8vIGV4YW1pbmUgcHJldmlvdXMgcmVnaW9uCi0JCQkJCXNkUmVnaW9uID0gcHJldjsKLQkJCQkJY29tcGxldGlvblJlZ2lvbiA9IHByZXYuZ2V0TGFzdFJlZ2lvbigpOwotCQkJCQlyZWdpb25UZXh0ID0gcHJldi5nZXRGdWxsVGV4dCgpOwotCQkJCQlub2RlT2Zmc2V0ID0gMTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHN0cmluZyBtdXN0IHN0YXJ0IHcvICYKLQkJCWlmICgocmVnaW9uVGV4dCAhPSBudWxsKSAmJiByZWdpb25UZXh0LnN0YXJ0c1dpdGgoIiYiKSkgeyAvLyROT04tTkxTLTEkCQkJCQkJIAkJCi0JCQkJU3RyaW5nIGtleSA9IChub2RlT2Zmc2V0ID4gMCkgPyByZWdpb25UZXh0LnN1YnN0cmluZygxLCBub2RlT2Zmc2V0KSA6ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCQkvLyBnZXQgZW50aXR5IHByb3Bvc2FscywgcGFzc2luZyBpbiB0aGUgYXBwcm9wcmlhdGUgc3RhcnQKLQkJCQkvLyBzdHJpbmcKLQkJCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSgoKE5vZGUpIHRyZWVOb2RlKS5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJCWlmIChtcSAhPSBudWxsKSB7Ci0JCQkJCUNNRG9jdW1lbnQgeG1sRG9jID0gbXEuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQodHJlZU5vZGUpOwotCQkJCQlDTU5hbWVkTm9kZU1hcCBjbW1hcCA9IG51bGw7Ci0JCQkJCVByb3BlcnRpZXMgZW50aXRpZXMgPSBudWxsOwotCQkJCQlpZiAoeG1sRG9jICE9IG51bGwpIHsKLQkJCQkJCWNtbWFwID0geG1sRG9jLmdldEVudGl0aWVzKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGNtbWFwICE9IG51bGwpIHsKLQkJCQkJCWVudGl0aWVzID0gbWFwVG9Qcm9wZXJ0aWVzKGNtbWFwKTsKLQkJCQkJfQotCQkJCQllbHNlIC8vIDIyNDc4NyBpbiBhYnNlbmNlIG9mIGNvbnRlbnQgbW9kZWwsIGp1c3QgdXNlCi0JCQkJCS8vIG1pbmltYWwgNSBlbnRpdGllcwotCQkJCQl7Ci0JCQkJCQllbnRpdGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQkJCQllbnRpdGllcy5wdXQoInF1b3QiLCAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQllbnRpdGllcy5wdXQoImFwb3MiLCAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWVudGl0aWVzLnB1dCgiYW1wIiwgIiYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQllbnRpdGllcy5wdXQoImx0IiwgIjwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQllbnRpdGllcy5wdXQoImd0IiwgIj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCQkJCQkJZW50aXRpZXMucHV0KCJuYnNwIiwgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQkJCQkJCQkJCi0JCQkJCX0KLQkJCQkJYWRkRW50aXR5UHJvcG9zYWxzKHByb3Bvc2FscywgZW50aXRpZXMsIGtleSwgbm9kZU9mZnNldCwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgKChwcm9wb3NhbHMuc2l6ZSgpID4gMCkgPyBwcm9wb3NhbHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtwcm9wb3NhbHMuc2l6ZSgpXSkgOiBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUVxdWFsc1Byb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArIGNvbXBsZXRpb25SZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQlpZiAoKHZhbHVlUmVnaW9uICE9IG51bGwpICYmICh2YWx1ZVJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgJiYgKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKSA8PSBkb2N1bWVudFBvc2l0aW9uKSkgewotCQkJLy8gcmVwbGFjZSB0aGUgYWRqYWNlbnQgYXR0cmlidXRlIHZhbHVlCi0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgc2RSZWdpb24sIHZhbHVlUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldCh2YWx1ZVJlZ2lvbiksIHZhbHVlUmVnaW9uLmdldFRleHRMZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gYXBwZW5kIGFuIGF0dHJpYnV0ZSB2YWx1ZSBhZnRlciB0aGUgJz0nCi0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJfQotCQlhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZVN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCS8vIHNldHVwIGZvciBhIG5vbi1lbXB0eSBkb2N1bWVudCwgYnV0IG9uZSB0aGF0IGhhc24ndCBiZWVuIGZvcm1hbGx5Ci0JCS8vIHN0YXJ0ZWQKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCWFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVUYWdDbG9zZVByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCi0JCWlmICgobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgfHwgKGRvY3VtZW50UG9zaXRpb24gPj0gc2RSZWdpb24uZ2V0RW5kT2Zmc2V0KCkpKSB7Ci0JCQkvLyB0aGlzIGlzIGEgY29udGVudCByZXF1ZXN0IGFzIHRoZSBkb2N1bWVudFBvc2l0aW9uIGlzIEFGVEVSIHRoZQotCQkJLy8gZW5kIG9mIHRoZSBjbG9zaW5nIHJlZ2lvbgotCQkJaWYgKChub2RlID09IG5vZGVBdE9mZnNldCkgJiYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpKSB7Ci0JCQkJbm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCWFkZFRhZ0luc2VydGlvblByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgZ2V0RWxlbWVudFBvc2l0aW9uRm9yTW9kZWxRdWVyeShub2RlQXRPZmZzZXQpKTsKLQkJCWlmICgobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgKG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkpIHsKLQkJCQlhZGRFbmRUYWdQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gYXQgdGhlIHN0YXJ0IG9mIHRoZSB0YWcncyBjbG9zZSBvciB3aXRoaW4gaXQKLQkJCUlUZXh0UmVnaW9uIGNsb3NlUmVnaW9uID0gc2RSZWdpb24uZ2V0TGFzdFJlZ2lvbigpOwotCQkJYm9vbGVhbiBpbnNpZGVUYWcgPSAhc2RSZWdpb24uaXNFbmRlZCgpIHx8IChkb2N1bWVudFBvc2l0aW9uIDw9IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNsb3NlUmVnaW9uKSk7Ci0JCQlpZiAoaW5zaWRlVGFnKSB7Ci0JCQkJLy8gdGhpcyBpcyBhIHJlcXVlc3QgZm9yIGNvbXBsZXRpb25zIHdpdGhpbiBhIHRhZwotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJCWlmICgobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgKG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkpIHsKLQkJCQkJYWRkVGFnQ2xvc2VQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCX0KLQkJCQlpZiAoc2RSZWdpb24gPT0gbm9kZUF0T2Zmc2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3Quc2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5zZXRSZXBsYWNlbWVudExlbmd0aCgwKTsKLQkJCQkJYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZVRhZ05hbWVQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQotCQlpZiAoc2RSZWdpb24gIT0gbm9kZUF0T2Zmc2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCS8vIGNvbXBsZXRpbmcgdGhlICpmaXJzdCogdGFnIGluICI8dGFnbmFtZTEgfDx0YWduYW1lMiIKLQkJCUlET01Ob2RlIGFjdHVhbE5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TW9kZWwoKS5nZXRJbmRleGVkUmVnaW9uKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKTsKLQkJCWlmIChhY3R1YWxOb2RlICE9IG51bGwpIHsKLQkJCQlpZiAoYWN0dWFsTm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IHNkUmVnaW9uKSB7Ci0JCQkJCS8vIHN0YXJ0IHRhZwotCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pICsgY29tcGxldGlvblJlZ2lvbi5nZXRMZW5ndGgoKSkgewotCQkJCQkJLy8gaXQncyBhdHRyaWJ1dGVzCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KGFjdHVhbE5vZGUsIGFjdHVhbE5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uIC0gbWF0Y2hTdHJpbmcubGVuZ3RoKCksIG1hdGNoU3RyaW5nLmxlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCQkJCQlpZiAobm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSAtIDEpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pIC0gMSkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQkJCQkJYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJCQl9Ci0JCQkJCQlhZGRUYWdDbG9zZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBpdCdzIG5hbWUKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3QoYWN0dWFsTm9kZSwgYWN0dWFsTm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uIC0gbWF0Y2hTdHJpbmcubGVuZ3RoKCksIG1hdGNoU3RyaW5nLmxlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCQkJCQlhZGRUYWdOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBnZXRFbGVtZW50UG9zaXRpb25Gb3JNb2RlbFF1ZXJ5KGFjdHVhbE5vZGUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPj0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKyBjb21wbGV0aW9uUmVnaW9uLmdldExlbmd0aCgpKSB7Ci0JCQkJCQkvLyBpbnNlcnQgbmFtZQotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIHJlcGxhY2UgbmFtZQotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pLCBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQkJCQl9Ci0JCQkJCWFkZEVuZFRhZ05hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID4gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKyBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSkgewotCQkJCS8vIHVuY2xvc2VkIHRhZyB3aXRoIG9ubHkgYSBuYW1lOyBzaG91bGQgcHJvbXB0IGZvciBhdHRyaWJ1dGVzCi0JCQkJLy8gYW5kIGEgY2xvc2UgaW5zdGVhZAotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiAtIG1hdGNoU3RyaW5nLmxlbmd0aCgpLCBtYXRjaFN0cmluZy5sZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQkJCWFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCWFkZFRhZ0Nsb3NlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChzZFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDApLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQkJaW50IHJlcGxhY2VMZW5ndGggPSBkb2N1bWVudFBvc2l0aW9uIC0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbik7Ci0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZSwgbm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSwgcmVwbGFjZUxlbmd0aCwgbWF0Y2hTdHJpbmcpOwotCQkJCQlhZGRUYWdOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBnZXRFbGVtZW50UG9zaXRpb25Gb3JNb2RlbFF1ZXJ5KG5vZGVBdE9mZnNldCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJSURPTU5vZGUgYWN0dWFsTm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCWlmIChhY3R1YWxOb2RlICE9IG51bGwpIHsKLQkJCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID49IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pICsgY29tcGxldGlvblJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpIHsKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KGFjdHVhbE5vZGUsIGFjdHVhbE5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pLCBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQkJCQkJfQotCQkJCQkJYWRkRW5kVGFnTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlVGFnT3BlblByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQlpZiAoc2RSZWdpb24gIT0gbm9kZUF0T2Zmc2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCS8vIGNvbXBsZXRpbmcgdGhlICpmaXJzdCogWE1MX1RBR19PUEVOIGluICI8PHRhZ25hbWUiCi0JCQlJRE9NTm9kZSBhY3R1YWxOb2RlID0gKElET01Ob2RlKSBub2RlLmdldE1vZGVsKCkuZ2V0SW5kZXhlZFJlZ2lvbihzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSk7Ci0JCQlpZiAoYWN0dWFsTm9kZSAhPSBudWxsKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCQlhZGRUYWdOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBnZXRFbGVtZW50UG9zaXRpb25Gb3JNb2RlbFF1ZXJ5KGFjdHVhbE5vZGUpKTsKLQkJCQlhZGRFbmRUYWdQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOyAvLyAocGEpIDIyMDg1MAotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPT0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpIHsKLQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCS8vIGF0IHRoZSBzdGFydCBvZiBhbiBleGlzdGluZyB0YWcsIHJpZ2h0IGJlZm9yZSB0aGUgJzwnCi0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCQkJYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBnZXRFbGVtZW50UG9zaXRpb25Gb3JNb2RlbFF1ZXJ5KG5vZGVBdE9mZnNldCkpOwotCQkJCQlhZGRFbmRUYWdQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJCS8vIGF0IHRoZSBvcGVuaW5nIG9mIHRoZSBWRVJZIGZpcnN0IHRhZyB3aXRoIGEgJzwnCi0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pLCBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQkJCQlhZGRTdGFydERvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3aXRoaW4gdGhlIHdoaXRlIHNwYWNlCi0JCQkJSVRleHRSZWdpb24gbmFtZSA9IGdldE5hbWVSZWdpb24obm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJCQkvLyAocGEpIElUZXh0UmVnaW9uIHJlZmFjdG9yCi0JCQkJLy8gaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmNvbnRhaW5zT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pKQotCQkJCS8vIHsKLQkJCQlpZiAoKG5hbWUgIT0gbnVsbCkgJiYgKChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lKSA8PSBkb2N1bWVudFBvc2l0aW9uKSAmJiAoc2RSZWdpb24uZ2V0RW5kT2Zmc2V0KG5hbWUpID49IGRvY3VtZW50UG9zaXRpb24pKSkgewotCQkJCQkvLyByZXBsYWNlIHRoZSBleGlzdGluZyBuYW1lCi0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZSwgbm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lKSwgbmFtZS5nZXRUZXh0TGVuZ3RoKCksIG1hdGNoU3RyaW5nKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGluc2VydCBhIHZhbGlkIG5ldyBuYW1lLCBvciBwb3NzaWJseSBhbiBlbmQgdGFnCi0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCAoKE5vZGUpIG5vZGVBdE9mZnNldCkuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJCQlhZGRFbmRUYWdQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5zZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LnNldFJlcGxhY2VtZW50TGVuZ3RoKDApOwotCQkJCX0KLQkJCQlhZGRUYWdOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBnZXRFbGVtZW50UG9zaXRpb25Gb3JNb2RlbFF1ZXJ5KG5vZGVBdE9mZnNldCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyZWl2ZXMgY21ub2RlJ3MgZG9jdW1lbnRhdGlvbiB0byBkaXNwbGF5IGluIHRoZSBjb21wbGV0aW9uCi0JICogcHJvcG9zYWwncyBhZGRpdGlvbmFsIGluZm8uIElmIG5vIGRvY3VtZW50YXRpb24gZXhpc3RzIGZvciBjbW5vZGUsIHRyeQotCSAqIGRpc3BsYXlpbmcgcGFyZW50T3JPd25lcidzIGRvY3VtZW50YXRpb24KLQkgKiAKLQkgKiBTdHJpbmcgYW55IGRvY3VtZW50YXRpb24gaW5mb3JtYXRpb24gdG8gZGlzcGxheSBmb3IgY21ub2RlLgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gZGlzcGxheS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFkZGl0aW9uYWxJbmZvKENNTm9kZSBwYXJlbnRPck93bmVyLCBDTU5vZGUgY21ub2RlKSB7Ci0JCVN0cmluZyBhZGRsSW5mbyA9IG51bGw7Ci0KLQkJaWYgKGNtbm9kZSA9PSBudWxsKSB7Ci0JCQlpZiAoRGVidWcuZGlzcGxheVdhcm5pbmdzKSB7Ci0JCQkJbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVsbCBkZWNsYXJhdGlvbiEiKS5wcmludFN0YWNrVHJhY2UoKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlhZGRsSW5mbyA9IGdldEluZm9Qcm92aWRlcigpLmdldEluZm8oY21ub2RlKTsKLQkJaWYgKChhZGRsSW5mbyA9PSBudWxsKSAmJiAocGFyZW50T3JPd25lciAhPSBudWxsKSkgewotCQkJYWRkbEluZm8gPSBnZXRJbmZvUHJvdmlkZXIoKS5nZXRJbmZvKHBhcmVudE9yT3duZXIpOwotCQl9Ci0JCXJldHVybiBhZGRsSW5mbzsKLQl9Ci0KLQkvLyByZXR1cm5zIGEgbGlzdCBvZiBNb2RlbFF1ZXJ5QWN0aW9ucwotCXByb3RlY3RlZCBMaXN0IGdldEF2YWlsYWJsZUNoaWxkcmVuQXRJbmRleChFbGVtZW50IHBhcmVudCwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZykgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudERlY2wgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnQpOwotCQlpZiAocGFyZW50RGVjbCAhPSBudWxsKSB7Ci0JCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJLy8gdGFrZW4gZnJvbSBBY3Rpb25NYW5hZ2VycwotCQkJLy8gaW50IGVkaXRNb2RlID0gbW9kZWxRdWVyeS5nZXRFZGl0TW9kZSgpOwotCQkJaW50IGVkaXRNb2RlID0gTW9kZWxRdWVyeS5FRElUX01PREVfVU5DT05TVFJBSU5FRDsKLQkJCWludCBpYyA9IChlZGl0TW9kZSA9PSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpID8gTW9kZWxRdWVyeS5JTkNMVURFX0NISUxEX05PREVTIHwgTW9kZWxRdWVyeS5JTkNMVURFX1NFUVVFTkNFX0dST1VQUyA6IE1vZGVsUXVlcnkuSU5DTFVERV9DSElMRF9OT0RFUzsKLQkJCW1vZGVsUXVlcnkuZ2V0SW5zZXJ0QWN0aW9ucyhwYXJlbnQsIHBhcmVudERlY2wsIGluZGV4LCBpYywgdmFsaWRpdHlDaGVja2luZywgbGlzdCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLy8gcmV0dXJucyBhIGxpc3Qgb2YgQ01FbGVtZW50RGVjbGFyYXRpb25zCi0JcHJvdGVjdGVkIExpc3QgZ2V0QXZhaWxhYmxlUm9vdENoaWxkcmVuKERvY3VtZW50IGRvY3VtZW50LCBpbnQgY2hpbGRJbmRleCkgewotCQlMaXN0IGxpc3QgPSBudWxsOwotCi0JCS8vIGV4dHJhY3QgdGhlIHZhbGlkICdyb290JyBub2RlIG5hbWUgZnJvbSB0aGUgRG9jdW1lbnRUeXBlIE5vZGUKLQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSBkb2N1bWVudC5nZXREb2N0eXBlKCk7Ci0JCVN0cmluZyByb290TmFtZSA9IG51bGw7Ci0JCWlmIChkb2NUeXBlICE9IG51bGwpIHsKLQkJCXJvb3ROYW1lID0gZG9jVHlwZS5nZXROb2RlTmFtZSgpOwotCQl9Ci0JCWlmIChyb290TmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgwKTsKLQkJfQotCi0JCWZvciAoTm9kZSBjaGlsZCA9IGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkvLyBtYWtlIHN1cmUgdGhlICJyb290IiBFbGVtZW50IGlzbid0IGFscmVhZHkgcHJlc2VudAotCQkJLy8gaXMgaXQgcmVxdWlyZWQgdG8gYmUgYW4gRWxlbWVudD8KLQkJCWlmICgoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgJiYgc3RyaW5nc0VxdWFsKGNoaWxkLmdldE5vZGVOYW1lKCksIHJvb3ROYW1lKSkgewotCQkJCS8vIGlmIHRoZSBub2RlIGlzIG1pc3NpbmcgZWl0aGVyIHRoZSBzdGFydCBvciBlbmQgdGFnLCBkb24ndAotCQkJCS8vIGNvdW50IGl0IGFzIHByZXNlbnQKLQkJCQlpZiAoKGNoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpICYmICgoKChJRE9NTm9kZSkgY2hpbGQpLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkgfHwgKCgoSURPTU5vZGUpIGNoaWxkKS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChEZWJ1Zy5kaXNwbGF5SW5mbykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ocm9vdE5hbWUgKyAiIGFscmVhZHkgcHJlc2VudCEiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5UaGVfZG9jdW1lbnRfZWxlbWVudF9fLCAobmV3IE9iamVjdFtde3Jvb3ROYW1lfSkpKTsKLQkJCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgwKTsKLQkJCX0KLQkJfQotCi0JCWxpc3QgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJQ01Eb2N1bWVudCBjbWRvYyA9IG1vZGVsUXVlcnkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoZG9jdW1lbnQpOwotCQkJaWYgKGNtZG9jICE9IG51bGwpIHsKLQkJCQlpZiAocm9vdE5hbWUgIT0gbnVsbCkgewotCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiByb290RGVjbCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgY21kb2MuZ2V0RWxlbWVudHMoKS5nZXROYW1lZEl0ZW0ocm9vdE5hbWUpOwotCQkJCQlpZiAocm9vdERlY2wgIT0gbnVsbCkgewotCQkJCQkJbGlzdC5hZGQocm9vdERlY2wpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gc3VwcGx5IHRoZSBnaXZlbiBkb2N1bWVudCBuYW1lIGFueXdheSwgZXZlbiBpZiBpdAotCQkJCQkJLy8gaXMgYW4gZXJyb3IKLQkJCQkJCWxpc3QuYWRkKG5ldyBTaW1wbGVDTUVsZW1lbnREZWNsYXJhdGlvbihyb290TmFtZSkpOwotCQkJCQkJaWYgKERlYnVnLmRpc3BsYXlJbmZvIHx8IERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm8gZGVmaW5pdGlvbiBmb3VuZCBmb3IgIiArIHJvb3ROYW1lICsgIiBpbiAiICsgZG9jVHlwZS5nZXRQdWJsaWNJZCgpICsgIi8iICsgZG9jVHlwZS5nZXRTeXN0ZW1JZCgpKTsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgbG9jYXRpb24gPSAiIiArIChkb2NUeXBlLmdldFB1YmxpY0lkKCkgIT0gbnVsbCA/IGRvY1R5cGUuZ2V0UHVibGljSWQoKSArICIvIiA6ICIiKSArIChkb2NUeXBlLmdldFN5c3RlbUlkKCkgIT0gbnVsbCA/IGRvY1R5cGUuZ2V0U3lzdGVtSWQoKSA6ICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCQkJLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKGxvY2F0aW9uLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChYTUxVSU1lc3NhZ2VzLk5vX2RlZmluaXRpb25fZm9yX2luLCAobmV3IE9iamVjdFtde3Jvb3ROYW1lLCBsb2NhdGlvbn0pKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5Ob19kZWZpbml0aW9uX2ZvciwgKG5ldyBPYmplY3RbXXtyb290TmFtZX0pKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoRGVidWcuZGlzcGxheUluZm8gfHwgRGVidWcuZGlzcGxheVdhcm5pbmdzKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm8gY29udGVudCBtb2RlbCBmb3VuZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQkvLyROT04tTkxTLTEkCi0JCQkJLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBsb2NhdGlvbiA9ICIiICsgKGRvY1R5cGUuZ2V0UHVibGljSWQoKSAhPSBudWxsID8gZG9jVHlwZS5nZXRQdWJsaWNJZCgpICsgIi8iIDogIiIpICsgKGRvY1R5cGUuZ2V0U3lzdGVtSWQoKSAhPSBudWxsID8gZG9jVHlwZS5nZXRTeXN0ZW1JZCgpIDogIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCS8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobG9jYXRpb24ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChYTUxVSU1lc3NhZ2VzLk5vX2NvbnRlbnRfbW9kZWxfZm9yLCAobmV3IE9iamVjdFtde2xvY2F0aW9ufSkpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShYTUxVSU1lc3NhZ2VzLk5vX2NvbnRlbnRfbW9kZWxfZm91bmRfVUlfKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oTm9kZSBub2RlKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIG5vZGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hhcmFjdGVycyB3aGljaCB3aGVuIGVudGVyZWQgYnkgdGhlIHVzZXIgc2hvdWxkCi0JICogYXV0b21hdGljYWxseSB0cmlnZ2VyIHRoZSBwcmVzZW50YXRpb24gb2YgcG9zc2libGUgY29tcGxldGlvbnMuCi0JICogCi0JICogdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBjb21wbGV0aW9uIHByb3Bvc2FsIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYXV0byBhY3RpdmF0aW9uIGlzIGRlc2lyZWQKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIGNvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0Q29tcGxldGlvblJlZ2lvbihpbnQgb2Zmc2V0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHNkUmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSA9PSBvZmZzZXQpIHsKLQkJCS8vIFRoZSBvZmZzZXQgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVnaW9uCi0JCQlpZiAoKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgPT0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSkgJiYgKHNkUmVnaW9uLmdldFByZXZpb3VzKCkgIT0gbnVsbCkgJiYgKCFzZFJlZ2lvbi5nZXRQcmV2aW91cygpLmlzRW5kZWQoKSkpIHsKLQkJCQkvLyBJcyB0aGUgcmVnaW9uIGFsc28gdGhlIHN0YXJ0IG9mIHRoZSBub2RlPyBJZiBzbywgdGhlCi0JCQkJLy8gcHJldmlvdXMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcwotCQkJCS8vIHdoZXJlIHRvIGxvb2sgZm9yIGEgdXNlZnVsIHJlZ2lvbi4KLQkJCQlyZWdpb24gPSBzZFJlZ2lvbi5nZXRQcmV2aW91cygpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCAtIDEpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gSXMgdGhlcmUgbm8gc2VwYXJhdGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIHByZXZpb3VzIHJlZ2lvbj8KLQkJCQkvLyBJZiBub3QsCi0JCQkJLy8gdGhlbiB0aGF0IHJlZ2lvbiBpcyB0aGUgaW1wb3J0YW50IG9uZQotCQkJCUlUZXh0UmVnaW9uIHByZXZpb3VzUmVnaW9uID0gc2RSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0IC0gMSk7Ci0JCQkJaWYgKChwcmV2aW91c1JlZ2lvbiAhPSBudWxsKSAmJiAocHJldmlvdXNSZWdpb24gIT0gcmVnaW9uKSAmJiAocHJldmlvdXNSZWdpb24uZ2V0VGV4dExlbmd0aCgpID09IHByZXZpb3VzUmVnaW9uLmdldExlbmd0aCgpKSkgewotCQkJCQlyZWdpb24gPSBwcmV2aW91c1JlZ2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBUaGUgb2Zmc2V0IGlzIE5PVCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZWdpb24KLQkJCWlmIChvZmZzZXQgPiBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pICsgcmVnaW9uLmdldFRleHRMZW5ndGgoKSkgewotCQkJCS8vIElzIHRoZSBvZmZzZXQgd2l0aGluIHRoZSB3aGl0ZXNwYWNlIGFmdGVyIHRoZSB0ZXh0IGluIHRoaXMKLQkJCQkvLyByZWdpb24/Ci0JCQkJLy8gSWYgc28sIHVzZSB0aGUgbmV4dCByZWdpb24KLQkJCQlJVGV4dFJlZ2lvbiBuZXh0UmVnaW9uID0gc2RSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJaWYgKG5leHRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlyZWdpb24gPSBuZXh0UmVnaW9uOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIElzIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBpbXBvcnRhbnQgdGV4dCBmb3IgdGhpcyByZWdpb24/Ci0JCQkJLy8gSWYgc28sIHRoZW4gd2UndmUgYWxyZWFkeSBnb3QgdGhlIHJpZ2h0IG9uZS4KLQkJCX0KLQkJfQotCi0JCS8vIHZhbGlkIFdISVRFX1NQQUNFIHJlZ2lvbiBoYW5kbGVyICgjMTc5OTI0KQotCQlpZiAoKHJlZ2lvbiAhPSBudWxsKSAmJiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LldISVRFX1NQQUNFKSkgewotCQkJSVRleHRSZWdpb24gcHJldmlvdXNSZWdpb24gPSBzZFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pIC0gMSk7Ci0JCQlpZiAocHJldmlvdXNSZWdpb24gIT0gbnVsbCkgewotCQkJCXJlZ2lvbiA9IHByZXZpb3VzUmVnaW9uOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlZ2lvbiB3aG9zZSBjb250ZW50J3MgcmVxdWlyZSBjb21wbGV0aW9uLiBUaGlzIGlzIHNvbWV0aGluZwotCSAqIG9mIGEgbWlzbm9tZXIgYXMgc29tZXRpbWVzIHRoZSB1c2VyIHdhbnRzIHRvIGJlIHByb21wdGVkIGZvciBjb250ZW50cwotCSAqIG9mIGEgbm9uLWV4aXN0YW50IElUZXh0UmVnaW9uLCBzdWNoIGFzIGZvciBlbnVtZXJhdGVkIGF0dHJpYnV0ZSB2YWx1ZXMKLQkgKiBmb2xsb3dpbmcgYW4gJz0nIHNpZ24uCi0JICovCi0JcHJvdGVjdGVkIElUZXh0UmVnaW9uIGdldENvbXBsZXRpb25SZWdpb24oaW50IGRvY3VtZW50UG9zaXRpb24sIE5vZGUgZG9tbm9kZSkgewotCQlpZiAoZG9tbm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCWludCBvZmZzZXQgPSBkb2N1bWVudFBvc2l0aW9uOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgZG9tbm9kZTsKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJaWYgKG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJSVRleHRSZWdpb24gcmVzdWx0ID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQl3aGlsZSAocmVzdWx0ID09IG51bGwpIHsKLQkJCQlvZmZzZXQtLTsKLQkJCQlyZXN1bHQgPSBub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZyA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkJLy8gRGV0ZXJtaW5lIGlmIHRoZSBvZmZzZXQgaXMgd2l0aGluIHRoZSBzdGFydAotCQkvLyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBlbmQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgb3IKLQkJLy8gc29tZXdoZXJlIHdpdGhpbiB0aGUgTm9kZSdzIFhNTCBjb250ZW50LgotCQlpZiAoKHN0YXJ0VGFnICE9IG51bGwpICYmIChzdGFydFRhZy5nZXRTdGFydE9mZnNldCgpIDw9IG9mZnNldCkgJiYgKG9mZnNldCA8IHN0YXJ0VGFnLmdldFN0YXJ0T2Zmc2V0KCkgKyBzdGFydFRhZy5nZXRMZW5ndGgoKSkpIHsKLQkJCWZsYXROb2RlID0gc3RhcnRUYWc7Ci0JCX0KLQkJZWxzZSBpZiAoKGVuZFRhZyAhPSBudWxsKSAmJiAoZW5kVGFnLmdldFN0YXJ0T2Zmc2V0KCkgPD0gb2Zmc2V0KSAmJiAob2Zmc2V0IDwgZW5kVGFnLmdldFN0YXJ0T2Zmc2V0KCkgKyBlbmRUYWcuZ2V0TGVuZ3RoKCkpKSB7Ci0JCQlmbGF0Tm9kZSA9IGVuZFRhZzsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkvLyB0aGUgb2Zmc2V0IGlzIGRlZmluaXRlbHkgd2l0aGluIHRoZSBzdGFydCBvciBlbmQgdGFnLCBjb250aW51ZQotCQkJLy8gb24gYW5kIGZpbmQgdGhlIHJlZ2lvbgotCQkJcmVnaW9uID0gZ2V0Q29tcGxldGlvblJlZ2lvbihvZmZzZXQsIGZsYXROb2RlKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHRoZSBkb2NQb3NpdGlvbiBpcyBuZWl0aGVyIHdpdGhpbiB0aGUgc3RhcnQgbm9yIHRoZSBlbmQsIHNvIGl0Ci0JCQkvLyBtdXN0IGJlIGNvbnRlbnQKLQkJCWZsYXROb2RlID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJLy8gKHBhKSBJVGV4dFJlZ2lvbiByZWZhY3RvcgotCQkJLy8gaWYgKGZsYXROb2RlLmNvbnRhaW5zKGRvY3VtZW50UG9zaXRpb24pKSB7Ci0JCQlpZiAoKGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgPD0gZG9jdW1lbnRQb3NpdGlvbikgJiYgKGZsYXROb2RlLmdldEVuZE9mZnNldCgpID49IGRvY3VtZW50UG9zaXRpb24pKSB7Ci0JCQkJLy8gd2UncmUgaW50ZXJlc3RpbmcgaW4gY29tcGxldGluZy9leHRlbmRpbmcgdGhlIHByZXZpb3VzCi0JCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpZiB0aGUgY3VycmVudAotCQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXNuJ3QgcGxhaW4gY29udGVudCBvciBpZiBpdCdzCi0JCQkJLy8gcHJlY2VkZWQgYnkgYW4gb3JwaGFuICc8JwotCQkJCWlmICgob2Zmc2V0ID09IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpICYmIChmbGF0Tm9kZS5nZXRQcmV2aW91cygpICE9IG51bGwpICYmICgoKGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pICE9IG51bGwpICYmIChmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2N1bWVudFBvc2l0aW9uKS5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkpIHx8IChmbGF0Tm9kZS5nZXRQcmV2aW91cygpLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHx8IChmbGF0Tm9kZS5nZXRQcmV2aW91cygpLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSkpIHsKLQkJCQkJLy8gSXMgdGhlIHJlZ2lvbiBhbHNvIHRoZSBzdGFydCBvZiB0aGUgbm9kZT8gSWYgc28sIHRoZQotCQkJCQkvLyBwcmV2aW91cyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzCi0JCQkJCS8vIHdoZXJlIHRvIGxvb2sgZm9yIGEgdXNlZnVsIHJlZ2lvbi4KLQkJCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0UHJldmlvdXMoKS5nZXRMYXN0UmVnaW9uKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGZsYXROb2RlLmdldEVuZE9mZnNldCgpID09IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0TGFzdFJlZ2lvbigpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0Rmlyc3RSZWdpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBjYXRjaCBlbmQgb2YgZG9jdW1lbnQgcG9zaXRpb25zIHdoZXJlIHRoZSBkb2NQb3NpdGlvbiBpc24ndAotCQkJCS8vIGluIGEgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJCXJlZ2lvbiA9IGZsYXROb2RlLmdldExhc3RSZWdpb24oKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZWdpb247Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZWQgYnkgZGVmYXVsdC4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgd2l0aCB0aGVpciBvd24KLQkgKiBpbXBsZW1lbnRhdGlvbnMuCi0JICogCi0JICogQHNlZSBBYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29udGVudEdlbmVyYXRvcigpCi0JICovCi0JcHVibGljIFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvciBnZXRDb250ZW50R2VuZXJhdG9yKCkgewotCQlpZiAoZkdlbmVyYXRvciA9PSBudWxsKSB7Ci0JCQlmR2VuZXJhdG9yID0gbmV3IFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvcigpOwotCQl9Ci0JCXJldHVybiBmR2VuZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBlbnRlcmVkIGJ5IHRoZSB1c2VyIHNob3VsZAotCSAqIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgcHJlc2VudGF0aW9uIG9mIGNvbnRleHQgaW5mb3JtYXRpb24uCi0JICogCi0JICogdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBwcmVzZW50aW5nIGNvbnRleHQgaW5mb3JtYXRpb24gb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBhdXRvIGFjdGl2YXRpb24gaXMgZGVzaXJlZAotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gY29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB2YWxpZGF0b3IgdXNlZCB0byBkZXRlcm1pbmUgd2hlbiBkaXNwbGF5ZWQgY29udGV4dAotCSAqIGluZm9ybWF0aW9uIHNob3VsZCBiZSBkaXNtaXNzZWQuIE1heSBvbmx5IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoZSBwcm9jZXNzb3IgaXMgaW5jYXBhYmxlIG9mIGNvbXB1dGluZyBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIGEgY29udGV4dCBpbmZvcm1hdGlvbiB2YWxpZGF0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotCSAqIHByb2Nlc3NvciBpcyBpbmNhcGFibGUgb2YgY29tcHV0aW5nIGNvbnRleHQgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSB7Ci0JCWlmIChmQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyID09IG51bGwpIHsKLQkJCWZDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIgPSBuZXcgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRFbGVtZW50UG9zaXRpb24oTm9kZSBjaGlsZCkgewotCQlOb2RlIHBhcmVudCA9IGNoaWxkLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCU5vZGVMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWludCBjb3VudCA9IDA7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoY2hpbGRyZW4uaXRlbShpKSA9PSBjaGlsZCkgewotCQkJCXJldHVybiBjb3VudDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGlmIChjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJY291bnQrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRFbGVtZW50UG9zaXRpb25Gb3JNb2RlbFF1ZXJ5KE5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRQb3NpdGlvbihjaGlsZCk7Ci0JCS8vIHJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlYXNvbiB3aHkgY29tcHV0ZVByb3Bvc2FscyB3YXMgbm90IGFibGUgdG8gZmluZCBhbnkKLQkgKiBjb21wbGV0aW9ucy4KLQkgKiAKLQkgKiBhbiBlcnJvciBtZXNzYWdlIG9yIG51bGwgaWYgbm8gZXJyb3Igb2NjdXJyZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGZFcnJvck1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlSZXNvdXJjZQotCSAqLwotCS8vIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVJlc291cmNlIGlSZXNvdXJjZSkgewotCS8vIHRoaXMucmVzb3VyY2UgPSBpUmVzb3VyY2U7Ci0JLy8gfQotCS8qKgotCSAqIEdldHMgdGhlIGluZm9Qcm92aWRlci4KLQkgKiAKLQkgKiBmSW5mb1Byb3ZpZGVyIGFuZCBpZiBmSW5mb1Byb3ZpZGVyIHdhcyA8Y29kZT5udWxsPC9jb2RlPiBjcmVhdGUgYSBuZXcKLQkgKiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBNYXJrdXBUYWdJbmZvUHJvdmlkZXIgZ2V0SW5mb1Byb3ZpZGVyKCkgewotCQlpZiAoZkluZm9Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmSW5mb1Byb3ZpZGVyID0gbmV3IE1hcmt1cFRhZ0luZm9Qcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBmSW5mb1Byb3ZpZGVyOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWF0Y2hTdHJpbmcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIElUZXh0UmVnaW9uIGFSZWdpb24sIGludCBvZmZzZXQpIHsKLQkJaWYgKChhUmVnaW9uID09IG51bGwpIHx8IGlzQ2xvc2VSZWdpb24oYVJlZ2lvbikpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZyBtYXRjaFN0cmluZyA9IG51bGw7Ci0JCVN0cmluZyByZWdpb25UeXBlID0gYVJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmICgocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHx8IChvZmZzZXQgPiBwYXJlbnQuZ2V0U3RhcnRPZmZzZXQoYVJlZ2lvbikgKyBhUmVnaW9uLmdldFRleHRMZW5ndGgoKSkpIHsKLQkJCW1hdGNoU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHsKLQkJCW1hdGNoU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCWlmICgocGFyZW50LmdldFRleHQoYVJlZ2lvbikubGVuZ3RoKCkgPiAwKSAmJiAocGFyZW50LmdldFN0YXJ0T2Zmc2V0KGFSZWdpb24pIDwgb2Zmc2V0KSkgewotCQkJCW1hdGNoU3RyaW5nID0gcGFyZW50LmdldFRleHQoYVJlZ2lvbikuc3Vic3RyaW5nKDAsIG9mZnNldCAtIHBhcmVudC5nZXRTdGFydE9mZnNldChhUmVnaW9uKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltYXRjaFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1hdGNoU3RyaW5nOwotCX0KLQotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUl0ZXJhdG9yIHJlZ2lvbkxpc3QgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHJlZ2lvbkxpc3QuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbkxpc3QubmV4dCgpOwotCQkJaWYgKGlzTmFtZVJlZ2lvbihyZWdpb24pKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgYWxsIG9mIHRoZSBwb3NzaWJsZSB2YWxpZCB2YWx1ZXMgZm9yIHRoaXMgYXR0cmlidXRlCi0JICogZGVjbGFyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKE5vZGUgbm9kZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkgewotCQlMaXN0IGxpc3QgPSBudWxsOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCVN0cmluZ1tdIGRhdGFUeXBlVmFsdWVzID0gbnVsbDsKLQkJCS8vIFRoZSBNb2RlbFF1ZXJ5IG1heSBub3QgYmUgYXZhaWxhYmxlIGlmIHRoZSBjb3JyZXNwb25kaW5nCi0JCQkvLyBhZGFwdGVyCi0JCQkvLyBpcyBhYnNlbnQKLQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJCWRhdGFUeXBlVmFsdWVzID0gbW9kZWxRdWVyeS5nZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKGVsZW1lbnQsIGFkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChhZC5nZXRBdHRyVHlwZSgpICE9IG51bGwpIHsKLQkJCQkJZGF0YVR5cGVWYWx1ZXMgPSBhZC5nZXRBdHRyVHlwZSgpLmdldEVudW1lcmF0ZWRWYWx1ZXMoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZGF0YVR5cGVWYWx1ZXMgIT0gbnVsbCkgewotCQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KGRhdGFUeXBlVmFsdWVzLmxlbmd0aCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhVHlwZVZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJCQlsaXN0LmFkZChkYXRhVHlwZVZhbHVlc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KDApOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVxdWlyZWROYW1lKE5vZGUgcGFyZW50T3JPd25lciwgQ01Ob2RlIGNtbm9kZSkgewotCQlpZiAoKGNtbm9kZSA9PSBudWxsKSB8fCAocGFyZW50T3JPd25lciA9PSBudWxsKSkgewotCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCW5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bGwgZGVjbGFyYXRpb24hIikucHJpbnRTdGFja1RyYWNlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2V0UmVxdWlyZWROYW1lKHBhcmVudE9yT3duZXIsIGNtbm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXF1aXJlZFRleHQoTm9kZSBwYXJlbnRPck93bmVyLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsKSB7Ci0JCWlmIChhdHRyRGVjbCA9PSBudWxsKSB7Ci0JCQlpZiAoRGVidWcuZGlzcGxheVdhcm5pbmdzKSB7Ci0JCQkJbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVsbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb24hIikucHJpbnRTdGFja1RyYWNlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2VuZXJhdGVSZXF1aXJlZEF0dHJpYnV0ZShwYXJlbnRPck93bmVyLCBhdHRyRGVjbCwgYnVmZik7Ci0JCXJldHVybiBidWZmLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXF1aXJlZFRleHQoTm9kZSBwYXJlbnRPck93bmVyLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCkgewotCQlpZiAoZWxlbWVudERlY2wgPT0gbnVsbCkgewotCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCW5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bGwgYXR0cmlidXRlIGRlY2xhcmF0aW9uISIpLnByaW50U3RhY2tUcmFjZSgpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZ2V0Q29udGVudEdlbmVyYXRvcigpLmdlbmVyYXRlVGFnKHBhcmVudE9yT3duZXIsIGVsZW1lbnREZWNsLCBidWZmKTsKLQkJcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBtdXN0IGJlIHNldCBiZWZvcmUgdXNpbmcgdGhpcy4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaW50IHBvcykgewotCQkvLyAocGEpIElUZXh0UmVnaW9uIHJlZmFjdG9yIGRlZmVjdCAyNDUxOTAKLQkJLy8gcmV0dXJuCi0JCS8vIChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKUNvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKWZUZXh0Vmlld2VyLAotCQkvLyBwb3MpOwotCQlyZXR1cm4gQ29udGVudEFzc2lzdFV0aWxzLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmVGV4dFZpZXdlciwgcG9zKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRUYWdOYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlyZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJbmFtZSA9IHNkUmVnaW9uLmdldFRleHQocmVnaW9uKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvLyByZXR1cm5zIGEgbGlzdCBvZiBDTU5vZGVzIHRoYXQgYXJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBwYXJlbnQgY29udGV4dAotCS8vIEdpdmVuIHRoZSBncmFtbWFyIHNob3duIGJlbG93IGFuZCBhIHNuaXBwZXQgb2YgWE1MIGNvZGUgKHdoZXJlIHRoZSAnfCcKLQkvLyBpbmRpY2F0ZWQgdGhlIGN1cnNvciBwb3NpdGlvbikKLQkvLyB0aGUgbGlzdCB3b3VsZCByZXR1cm4gYWxsIG9mIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9ucyB0aGF0IGFyZQotCS8vIHBvdGVudGlhbCBjaGlsZCBlbGVtZW50cyBvZiBGb28uCi0JLy8KLQkvLyBncmFtbWFyIDogRm9vIC0+IChBLCBCLCBDKQotCS8vIHNuaXBwZXQgOiA8Rm9vPjxBPnwKLQkvLyByZXN1bHQgOiB7QSwgQiwgQ30KLQkvLyAKLQkvLyBUT0RPIGNzLi4uIGRvIHdlIG5lZWQgdG8gcGFzcyBpbiB0aGUgJ2tpbmRPZkFjdGlvbic/IFNlZW1zIHRvIG1lIHdlCi0JLy8gY291bGQgYXNzdW1lIGl0J3MgYWx3YXlzIGFuIGluc2VydC4KLQlwcm90ZWN0ZWQgTGlzdCBnZXRBdmFpbGFibGVDaGlsZEVsZW1lbnREZWNsYXJhdGlvbnMoRWxlbWVudCBwYXJlbnQsIGludCBjaGlsZFBvc2l0aW9uLCBpbnQga2luZE9mQWN0aW9uKSB7Ci0JCUxpc3QgbW9kZWxRdWVyeUFjdGlvbnMgPSBnZXRBdmFpbGFibGVDaGlsZHJlbkF0SW5kZXgocGFyZW50LCBjaGlsZFBvc2l0aW9uLCBNb2RlbFF1ZXJ5LlZBTElESVRZX05PTkUpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1vZGVsUXVlcnlBY3Rpb25zLml0ZXJhdG9yKCk7Ci0JCUxpc3QgY21ub2RlcyA9IG5ldyBWZWN0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTW9kZWxRdWVyeUFjdGlvbiBhY3Rpb24gPSAoTW9kZWxRdWVyeUFjdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKChjaGlsZFBvc2l0aW9uIDwgMCkgfHwgKCgoYWN0aW9uLmdldFN0YXJ0SW5kZXgoKSA8PSBjaGlsZFBvc2l0aW9uKSAmJiAoY2hpbGRQb3NpdGlvbiA8PSBhY3Rpb24uZ2V0RW5kSW5kZXgoKSkpICYmIChhY3Rpb24uZ2V0S2luZCgpID09IGtpbmRPZkFjdGlvbikpKSB7Ci0JCQkJQ01Ob2RlIGFjdGlvbkNNTm9kZSA9IGFjdGlvbi5nZXRDTU5vZGUoKTsKLQkJCQlpZiAoKGFjdGlvbkNNTm9kZSAhPSBudWxsKSAmJiAhY21ub2Rlcy5jb250YWlucyhhY3Rpb25DTU5vZGUpKSB7Ci0JCQkJCWNtbm9kZXMuYWRkKGFjdGlvbkNNTm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjbW5vZGVzOwotCX0KLQotCS8vIHJldHVybnMgYSBsaXN0IG9mIENNTm9kZXMgdGhhdCBjYW4gYmUgdmFsaWRseSBpbnNlcnRlZCBhdCB0aGlzCi0JLy8gY2hpbGRQb3NpdGlvbgotCS8vIEdpdmVuIHRoZSBncmFtbWFyIHNob3duIGJlbG93IGFuZCBhIHNuaXBwZXQgb2YgWE1MIGNvZGUgKHdoZXJlIHRoZSAnfCcKLQkvLyBpbmRpY2F0ZWQgdGhlIGN1cnNvciBwb3NpdGlvbikKLQkvLyB0aGUgbGlzdCB3b3VsZCByZXR1cm4gb25seSB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgY2FuIGJlIGluc2VydGVkCi0JLy8gd2hpbGUgbWFpbnRhaW5nIHZhbGlkaXR5IG9mIHRoZSBjb250ZW50LgotCS8vCi0JLy8gZ3JhbW1hciA6IEZvbyAtPiAoQSwgQiwgQykKLQkvLyBzbmlwcGV0IDogPEZvbz48QT58Ci0JLy8gcmVzdWx0IDoge0J9Ci0JLy8gICAgCi0JcHJvdGVjdGVkIExpc3QgZ2V0VmFsaWRDaGlsZEVsZW1lbnREZWNsYXJhdGlvbnMoRWxlbWVudCBwYXJlbnQsIGludCBjaGlsZFBvc2l0aW9uLCBpbnQga2luZE9mQWN0aW9uKSB7Ci0JCUxpc3QgbW9kZWxRdWVyeUFjdGlvbnMgPSBnZXRBdmFpbGFibGVDaGlsZHJlbkF0SW5kZXgocGFyZW50LCBjaGlsZFBvc2l0aW9uLCBNb2RlbFF1ZXJ5LlZBTElESVRZX1NUUklDVCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kZWxRdWVyeUFjdGlvbnMuaXRlcmF0b3IoKTsKLQkJTGlzdCBjbW5vZGVzID0gbmV3IFZlY3RvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlNb2RlbFF1ZXJ5QWN0aW9uIGFjdGlvbiA9IChNb2RlbFF1ZXJ5QWN0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoKGNoaWxkUG9zaXRpb24gPCAwKSB8fCAoKChhY3Rpb24uZ2V0U3RhcnRJbmRleCgpIDw9IGNoaWxkUG9zaXRpb24pICYmIChjaGlsZFBvc2l0aW9uIDw9IGFjdGlvbi5nZXRFbmRJbmRleCgpKSkgJiYgKGFjdGlvbi5nZXRLaW5kKCkgPT0ga2luZE9mQWN0aW9uKSkpIHsKLQkJCQlDTU5vZGUgYWN0aW9uQ01Ob2RlID0gYWN0aW9uLmdldENNTm9kZSgpOwotCQkJCWlmICgoYWN0aW9uQ01Ob2RlICE9IG51bGwpICYmICFjbW5vZGVzLmNvbnRhaW5zKGFjdGlvbkNNTm9kZSkpIHsKLQkJCQkJY21ub2Rlcy5hZGQoYWN0aW9uQ01Ob2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNtbm9kZXM7Ci0JfQotCi0JLyoqCi0JICogU2ltaWxhciB0byB0aGUgY2FsbCBpbiBIVE1MQ29udGVudEFzc2lzdFByb2Nlc3Nvci4gUGFzcyBpbiBhIG5vZGUsIGl0Ci0JICogdGVsbHMgeW91IGlmIHRoZSBkb2N1bWVudCBpcyBYTUwgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldFhNTChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJZG9jID0gKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpID8gbm9kZS5nZXRPd25lckRvY3VtZW50KCkgOiAoKERvY3VtZW50KSBub2RlKTsKLQotCQlyZXR1cm4gKGRvYyBpbnN0YW5jZW9mIElET01Eb2N1bWVudCkgJiYgKChJRE9NRG9jdW1lbnQpIGRvYykuaXNYTUxUeXBlKCk7Ci0JfQotCi0JLy8gSW5pdGlhbGl6ZSBsb2NhbCBzZXR0aW5ncwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCS8vIGltcGxlbWVudCBpbiBzdWJjbGFzc2VzCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDbG9zZVJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlyZXR1cm4gKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0FUVExJU1RfREVDTF9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRUxFTUVOVF9ERUNMX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OX0NMT1NFKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfQ09NTUVOVF9DTE9TRSkgfHwgKHR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0RJUkVDVElWRV9DTE9TRSkpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKSk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIGlzIHRvIGRldGVybWluZSBpZiBhIHRhZyBpcyBhIHNwZWNpYWwgbWV0YS1pbmZvIGNvbW1lbnQgdGFnIHRoYXQKLQkgKiBzaG93cyB1cCBhcyBhbiBFTEVNRU5UCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudE5vZGUoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gKChub2RlICE9IG51bGwpICYmIChub2RlIGluc3RhbmNlb2YgSURPTUVsZW1lbnQpICYmICgoSURPTUVsZW1lbnQpIG5vZGUpLmlzQ29tbWVudFRhZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgY3Vyc29yIHBvc2l0aW9uIGlzIGFmdGVyIGRvY3R5cGUgdGFnLi4uCi0JICogCi0JICogQHBhcmFtIGNhcgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ3Vyc29yQWZ0ZXJEb2N0eXBlKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNhcikgewotCQlOb2RlIGFOb2RlID0gY2FyLmdldE5vZGUoKTsKLQkJRG9jdW1lbnQgcGFyZW50ID0gYU5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpbnQgeG1sZG9jdHlwZU5vZGVQb3NpdGlvbiA9IC0xOwotCQlib29sZWFuIGlzQWZ0ZXJEb2N0eXBlID0gdHJ1ZTsKLQotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOyAvLyBibGFuayBkb2N1bWVudCBjYXNlCi0JCX0KLQotCQlmb3IgKE5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpIHsKLQkJCQkJeG1sZG9jdHlwZU5vZGVQb3NpdGlvbiA9ICgoSURPTU5vZGUpIGNoaWxkKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJaXNBZnRlckRvY3R5cGUgPSAoY2FyLmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpID49IHhtbGRvY3R5cGVOb2RlUG9zaXRpb24pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlzQWZ0ZXJEb2N0eXBlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiBjaGVjayBpZiB0aGUgY3Vyc29yIGlzIGFmdGVyIHRoZSBYTUxQSQotCSAqIAotCSAqIEBwYXJhbSBjYXIKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0N1cnNvckFmdGVyWE1MUEkoQ29udGVudEFzc2lzdFJlcXVlc3QgY2FyKSB7Ci0JCU5vZGUgYU5vZGUgPSBjYXIuZ2V0Tm9kZSgpOwotCQlib29sZWFuIHhtbHBpRm91bmQgPSBmYWxzZTsKLQkJRG9jdW1lbnQgcGFyZW50ID0gYU5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpbnQgeG1scGlOb2RlUG9zaXRpb24gPSAtMTsKLQkJYm9vbGVhbiBpc0FmdGVyWE1MUEkgPSBmYWxzZTsKLQotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOyAvLyBibGFuayBkb2N1bWVudCBjYXNlCi0JCX0KLQotCQlmb3IgKE5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWJvb2xlYW4geG1scGkgPSAoKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpICYmIGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJ4bWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXhtbHBpRm91bmQgPSB4bWxwaUZvdW5kIHx8IHhtbHBpOwotCQkJaWYgKHhtbHBpRm91bmQpIHsKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCQl4bWxwaU5vZGVQb3NpdGlvbiA9ICgoSURPTU5vZGUpIGNoaWxkKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJaXNBZnRlclhNTFBJID0gKGNhci5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSA+PSB4bWxwaU5vZGVQb3NpdGlvbik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBpc0FmdGVyWE1MUEk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOYW1lUmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCXJldHVybiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0RJUkVDVElWRV9OQU1FKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTEVNRU5UX0RFQ0xfTkFNRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9OQU1FKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9BVFRMSVNUX0RFQ0xfTkFNRSkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfUk9PVF9UQUdfTkFNRSkgfHwgdHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfRElSRUNUSVZFX05BTUUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1F1b3RlKFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nIHRyaW1tZWQgPSBzdHJpbmcudHJpbSgpOwotCQlpZiAodHJpbW1lZC5sZW5ndGgoKSA+IDApIHsKLQkJCXJldHVybiAodHJpbW1lZC5jaGFyQXQoMCkgPT0gJ1wnJykgfHwgKHRyaW1tZWQuY2hhckF0KDApID09ICciJyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1NlbGZDbG9zZWQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZykgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0YXJ0VGFnLmdldFJlZ2lvbnMoKTsKLQkJcmV0dXJuIHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTdGFydFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChzZFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpID4gMCkgewotCQkJSVRleHRSZWdpb24gciA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMCk7Ci0JCQlyZXN1bHQgPSAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pICYmIHNkUmVnaW9uLmlzRW5kZWQoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0aWVzIG1hcFRvUHJvcGVydGllcyhDTU5hbWVkTm9kZU1hcCBtYXApIHsKLQkJUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXAuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJQ01FbnRpdHlEZWNsYXJhdGlvbiBkZWNsID0gKENNRW50aXR5RGVjbGFyYXRpb24pIG1hcC5pdGVtKGkpOwotCQkJcC5wdXQoZGVjbC5nZXROYW1lKCksIGRlY2wuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHA7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29ycmVzcG9uZGluZyBYTUxOb2RlLCBhbmQgY2hlY2tzIGlmIGl0J3MgY2xvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBzdGFydFRhZwotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBuZWVkc0VuZFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmVGV4dFZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJdHJ5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCUlET01Ob2RlIHhtbE5vZGUgPSAoSURPTU5vZGUpIHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnLmdldFN0YXJ0KCkpOwotCQkJCWlmICghaXNTdGFydFRhZyhzdGFydFRhZykpIHsKLQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGlzU2VsZkNsb3NlZChzdGFydFRhZykpIHsKLQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCF4bWxOb2RlLmlzQ29udGFpbmVyKCkpIHsKLQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSB4bWxOb2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KE5vZGUgbm9kZSwgTm9kZSBwb3NzaWJsZVBhcmVudCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgaW50IGJlZ2luLCBpbnQgbGVuZ3RoLCBTdHJpbmcgZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgQ29udGVudEFzc2lzdFJlcXVlc3Qobm9kZSwgcG9zc2libGVQYXJlbnQsIGRvY3VtZW50UmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBiZWdpbiwgbGVuZ3RoLCBmaWx0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWZHZW5lcmF0b3IgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgcmVhc29uIHdoeSBjb21wdXRlUHJvcG9zYWxzIHdhcyBub3QgYWJsZSB0byBmaW5kIGFueQotCSAqIGNvbXBsZXRpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0JCWZFcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSByZWFzb24gd2h5IGNvbXB1dGVQcm9wb3NhbHMgd2FzIG5vdCBhYmxlIHRvIGZpbmQgYW55Ci0JICogY29tcGxldGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBlcnJvck1lc3NhZ2UsIFN0cmluZyBhcHBlbmQpIHsKLQkJc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSArIGFwcGVuZCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSByZWFzb24gd2h5IGNvbXB1dGVQcm9wb3NhbHMgd2FzIG5vdCBhYmxlIHRvIGZpbmQgYW55Ci0JICogY29tcGxldGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBlcnJvck1lc3NhZ2UsIFN0cmluZyBwcmVwZW5kLCBTdHJpbmcgYXBwZW5kKSB7Ci0JCXNldEVycm9yTWVzc2FnZShwcmVwZW5kICsgZXJyb3JNZXNzYWdlICsgYXBwZW5kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdHJpbmdzRXF1YWwoU3RyaW5nIGEsIFN0cmluZyBiKSB7Ci0JCS8vIChwYSkgMjIxMTkwIG1hdGNoaW5nIGluZGVwZW5kZW50IG9mIGNhc2UgdG8gYmUgY29uc2lzdGFudCB3aXRoIEphdmEKLQkJLy8gZWRpdG9yIENBCi0JCXJldHVybiBhLmVxdWFsc0lnbm9yZUNhc2UoYik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0Fic3RyYWN0Q29udGVudE1vZGVsR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ODQ0ODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb250ZW50TW9kZWxHZW5lcmF0b3IgewotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdlbmVyYXRlQ2hpbGRyZW4gPSBmYWxzZTsKLQotCXB1YmxpYyBBYnN0cmFjdENvbnRlbnRNb2RlbEdlbmVyYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBnZW5lcmF0ZUF0dHJpYnV0ZShDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsLCBTdHJpbmdCdWZmZXIgYnVmZmVyKTsKLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlQXR0cmlidXRlcyhDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlDTU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudERlY2wuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWdlbmVyYXRlQXR0cmlidXRlKChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyaWJ1dGVzLml0ZW0oaSksIGJ1ZmZlcik7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGdlbmVyYXRlRW5kVGFnKFN0cmluZyB0YWdOYW1lLCBOb2RlIHBhcmVudE5vZGUsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsLCBTdHJpbmdCdWZmZXIgYnVmZmVyKTsKLQotCXB1YmxpYyB2b2lkIGdlbmVyYXRlUmVxdWlyZWRDaGlsZHJlbihOb2RlIHBhcmVudE5vZGUsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCWlmIChnZW5lcmF0ZUNoaWxkcmVuKSB7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGdlbmVyYXRlU3RhcnRUYWcoU3RyaW5nIHRhZ05hbWUsIE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wsIFN0cmluZ0J1ZmZlciBidWZmZXIpOwotCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVUYWcoTm9kZSBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCWlmICgoZWxlbWVudERlY2wgPT0gbnVsbCkgfHwgKGJ1ZmZlciA9PSBudWxsKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIHRhZ05hbWUgPSBnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBlbGVtZW50RGVjbCk7Ci0KLQkJZ2VuZXJhdGVTdGFydFRhZyh0YWdOYW1lLCBwYXJlbnQsIGVsZW1lbnREZWNsLCBidWZmZXIpOwotCQlnZW5lcmF0ZVJlcXVpcmVkQ2hpbGRyZW4ocGFyZW50LCBlbGVtZW50RGVjbCwgYnVmZmVyKTsKLQkJZ2VuZXJhdGVFbmRUYWcodGFnTmFtZSwgcGFyZW50LCBlbGVtZW50RGVjbCwgYnVmZmVyKTsKLQkJcmV0dXJuOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TWluaW1hbFN0YXJ0VGFnTGVuZ3RoKE5vZGUgbm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wpOwotCi0JcHVibGljIFN0cmluZyBnZXRSZXF1aXJlZE5hbWUoTm9kZSBvd25lck5vZGUsIENNTm9kZSBjbW5vZGUpIHsKLQkJaWYgKG93bmVyTm9kZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gRE9NTmFtZXNwYWNlSGVscGVyLmNvbXB1dGVOYW1lKGNtbm9kZSwgb3duZXJOb2RlLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gY21ub2RlLmdldE5vZGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTdGFydFRhZ0Nsb3NlKE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWlyZXNBdHRyaWJ1dGVzKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKSB7Ci0JCUNNTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlZC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKCgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlcy5pdGVtKGkpKS5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZlNTE0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbkV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIElDb250ZXh0SW5mb3JtYXRpb24uIEFkZHMga25vd2xlZGdlIGFib3V0IHRoZSBpbmZvcm1hdGlvbgotICogZGlzcGxheSBzdHJpbmcgc3VjaCBhcyByZXF1aXJlZCBhdHRyaWJ1dGVzIGZvciB0aGlzIGNvbnRleHQuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb24gaW1wbGVtZW50cyBJQ29udGV4dEluZm9ybWF0aW9uLCBJQ29udGV4dEluZm9ybWF0aW9uRXh0ZW5zaW9uIHsKLQlwcml2YXRlIEhhc2hNYXAgZkF0dHIyUmFuZ2VNYXA7Ci0JLyoqIFRoZSBuYW1lIG9mIHRoZSBjb250ZXh0ICovCi0JcHJpdmF0ZSBTdHJpbmcgZkNvbnRleHREaXNwbGF5U3RyaW5nOwotCS8qKiBUaGUgaW1hZ2UgdG8gYmUgZGlzcGxheWVkICovCi0JcHJpdmF0ZSBJbWFnZSBmSW1hZ2U7Ci0JLyoqIFRoZSBpbmZvcm1hdGlvbiB0byBiZSBkaXNwbGF5ZWQgKi8KLQlwcml2YXRlIFN0cmluZyBmSW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nOwotCXByaXZhdGUgaW50IGZQb3NpdGlvbiA9IC0xOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250ZXh0IGluZm9ybWF0aW9uIHdpdGggYW4gaW1hZ2UuCi0JICogCi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgdG8gZGlzcGxheSB3aGVuIHByZXNlbnRpbmcgdGhlIGNvbnRleHQgaW5mb3JtYXRpb24KLQkgKiBAcGFyYW0gY29udGV4dERpc3BsYXlTdHJpbmcKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYmUgdXNlZCB3aGVuIHByZXNlbnRpbmcgdGhlIGNvbnRleHQKLQkgKiBAcGFyYW0gaW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZCB3aGVuIHByZXNlbnRpbmcgdGhlIGNvbnRleHQKLQkgKiAgICAgICAgICAgIGluZm9ybWF0aW9uLCBtYXkgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvbihJbWFnZSBpbWFnZSwgU3RyaW5nIGNvbnRleHREaXNwbGF5U3RyaW5nLCBTdHJpbmcgaW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nLCBIYXNoTWFwIGF0dHIyUmFuZ2VNYXApIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcsICJpbGxlZ2FsIGFyZ3VtZW50OiBpbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQotCQlmSW1hZ2UgPSBpbWFnZTsKLQkJZkNvbnRleHREaXNwbGF5U3RyaW5nID0gY29udGV4dERpc3BsYXlTdHJpbmc7Ci0JCWZJbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcgPSBpbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmc7Ci0JCWZBdHRyMlJhbmdlTWFwID0gYXR0cjJSYW5nZU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRleHQgaW5mb3JtYXRpb24gd2l0aG91dCBhbiBpbWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGV4dERpc3BsYXlTdHJpbmcKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gYmUgdXNlZCB3aGVuIHByZXNlbnRpbmcgdGhlIGNvbnRleHQKLQkgKiBAcGFyYW0gaW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZCB3aGVuIHByZXNlbnRpbmcgdGhlIGNvbnRleHQKLQkgKiAgICAgICAgICAgIGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvbihTdHJpbmcgY29udGV4dERpc3BsYXlTdHJpbmcsIFN0cmluZyBpbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcsIEhhc2hNYXAgYXR0cjJSYW5nZU1hcCkgewotCQl0aGlzKG51bGwsIGNvbnRleHREaXNwbGF5U3RyaW5nLCBpbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcsIGF0dHIyUmFuZ2VNYXApOwotCX0KLQotCS8qKgotCSAqIE1hcHMgKFN0cmluZyAtPiBQb3NpdGlvbikuIFRoZSBhdHRyaWJ1dGUgbmFtZSB0byB0aGUgVGV4dCBwb3NpdGlvbi4KLQkgKiAKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSGFzaE1hcCBnZXRBdHRyMlJhbmdlTWFwKCkgewotCQlyZXR1cm4gZkF0dHIyUmFuZ2VNYXA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbiNnZXRDb250ZXh0RGlzcGxheVN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZXh0RGlzcGxheVN0cmluZygpIHsKLQkJaWYgKGZDb250ZXh0RGlzcGxheVN0cmluZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZkNvbnRleHREaXNwbGF5U3RyaW5nOwotCQl9Ci0JCXJldHVybiBmSW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25FeHRlbnNpb24jZ2V0Q29udGV4dEluZm9ybWF0aW9uUG9zaXRpb24oKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGV4dEluZm9ybWF0aW9uUG9zaXRpb24oKSB7Ci0JCXJldHVybiBmUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbiNnZXRJbWFnZSgpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gZkltYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb24jZ2V0SW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uRGlzcGxheVN0cmluZygpIHsKLQkJcmV0dXJuIGZJbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dEluZm9ybWF0aW9uUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7Ci0JCWZQb3NpdGlvbiA9IHBvc2l0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0F0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZDY2MGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogUmVzcG9uc2libGUgZm9yIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIGNvbnRleHQgaW5mbyBwb3B1cC4gVGhpcyBpbmNsdWRlcwotICogdGV4dCBzdHlsZSwgYW5kIHdoZW4gdGhlIHdpbmRvdyBzaG91bGQgY2xvc2UuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIgaW1wbGVtZW50cyBJQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyLCBJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIHsKLQlwcml2YXRlIGludCBmRG9jdW1lbnRQb3NpdGlvbiA9IC0xOwotCi0JcHJpdmF0ZSBJQ29udGV4dEluZm9ybWF0aW9uIGZJbmZvID0gbnVsbDsKLQlwcml2YXRlIENvbnRleHRJbmZvTW9kZWxVdGlsIGZNb2RlbFV0aWwgPSBudWxsOwotCXByaXZhdGUgSVRleHRWaWV3ZXIgZlZpZXdlciA9IG51bGw7Ci0KLQlwdWJsaWMgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IjaW5zdGFsbChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKElDb250ZXh0SW5mb3JtYXRpb24gaW5mbywgSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlmSW5mbyA9IGluZm87Ci0JCWZWaWV3ZXIgPSB2aWV3ZXI7Ci0JCWZEb2N1bWVudFBvc2l0aW9uID0gZG9jdW1lbnRQb3NpdGlvbjsKLQkJZk1vZGVsVXRpbCA9IG5ldyBDb250ZXh0SW5mb01vZGVsVXRpbCgoSVN0cnVjdHVyZWREb2N1bWVudCkgZlZpZXdlci5nZXREb2N1bWVudCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yI2lzQ29udGV4dEluZm9ybWF0aW9uVmFsaWQoaW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29udGV4dEluZm9ybWF0aW9uVmFsaWQoaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJLy8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoaXMgY29udGV4dCBpbmZvIHNob3VsZCBzdGlsbCBiZQotCQkvLyBzaG93aW5nLi4uCi0JCS8vIGlmIGN1cnNvciBzdGlsbCB3aXRoaW4gdGhlIGVsZW1lbnQgaXQncyB2YWxpZC4uLgotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZk1vZGVsVXRpbCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0UmVnaW9uID0gZk1vZGVsVXRpbC5nZXRYTUxOb2RlKGZEb2N1bWVudFBvc2l0aW9uKS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaW50IHN0YXJ0ID0gc3RhcnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWludCBlbmQgPSBzdGFydFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJCXJlc3VsdCA9IChkb2N1bWVudFBvc2l0aW9uIDwgZW5kKSAmJiAoZG9jdW1lbnRQb3NpdGlvbiA+IHN0YXJ0ICsgMSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyI3VwZGF0ZVByZXNlbnRhdGlvbihpbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRQcmVzZW50YXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlUHJlc2VudGF0aW9uKGludCBkb2N1bWVudFBvc2l0aW9uLCBUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbikgewotCQlwcmVzZW50YXRpb24uY2xlYXIoKTsKLQotCQlpZiAoIShmSW5mbyBpbnN0YW5jZW9mIEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvbikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGl0ZXJhdGUgZXhpc3RpbmcgYXR0cmlidXRlcyBmcm9tIGN1cnJlbnQgbm9kZQotCQlJRE9NTm9kZSB4bWxOb2RlID0gZk1vZGVsVXRpbC5nZXRYTUxOb2RlKGRvY3VtZW50UG9zaXRpb24pOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0geG1sTm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCVN0cmluZyBhdHRyTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCU9iamVjdCB0ZW1wID0gbnVsbDsKLQkJUG9zaXRpb24gcCA9IG51bGw7Ci0JCUhhc2hNYXAgbWFwID0gKChBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb24pIGZJbmZvKS5nZXRBdHRyMlJhbmdlTWFwKCk7Ci0KLQkJLy8gc28gd2UgY2FuIGFkZCByYW5nZXMgaW4gb3JkZXIKLQkJU3R5bGVSYW5nZVtdIHNvcnRlZCA9IG5ldyBTdHlsZVJhbmdlW2ZJbmZvLmdldEluZm9ybWF0aW9uRGlzcGxheVN0cmluZygpLmxlbmd0aCgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJYXR0ck5hbWUgPSBzZFJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJCXRlbXAgPSBtYXAuZ2V0KGF0dHJOYW1lKTsKLQkJCQlpZiAodGVtcCAhPSBudWxsKSB7Ci0JCQkJCXAgPSAoUG9zaXRpb24pIHRlbXA7Ci0JCQkJCXNvcnRlZFtwLm9mZnNldF0gPSBuZXcgU3R5bGVSYW5nZShwLm9mZnNldCwgcC5sZW5ndGgsIG51bGwsIG51bGwsIFNXVC5CT0xEKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gc3R5bGUgcmFuZ2VzIG5lZWQgdG8gYmUgYWRkZWQgaW4gb3JkZXIKLQkJU3R5bGVSYW5nZSBzciA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc29ydGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlzciA9IHNvcnRlZFtpXTsKLQkJCWlmIChzciAhPSBudWxsKSB7Ci0JCQkJcHJlc2VudGF0aW9uLmFkZFN0eWxlUmFuZ2Uoc3IpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0F0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGU5MDUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0F0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01OYW1lZE5vZGVNYXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIENhbGN1bGF0ZXMgYXR0cmlidXRlIGNvbnRleHQgaW5mb3JtYXRpb24gYmFzZWQgb24gYSBTdHJ1Y3R1ZWREb2N1bWVudCBhbmQKLSAqIGRvY3VtZW50IHBvc2l0aW9uLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1jbGFzcyBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25Qcm92aWRlciB7Ci0JcHJpdmF0ZSBmaW5hbCBJQ29udGV4dEluZm9ybWF0aW9uW10gRU1QVFlfQ09OVEVYVF9JTkZPID0gbmV3IElDb250ZXh0SW5mb3JtYXRpb25bMF07Ci0JcHJpdmF0ZSBDb21wYXJhdG9yIGZDb21wYXJhdG9yOwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZEb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBDb250ZXh0SW5mb01vZGVsVXRpbCBmTW9kZWxVdGlsID0gbnVsbDsKLQotCXB1YmxpYyBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25Qcm92aWRlcihJU3RydWN0dXJlZERvY3VtZW50IGRvYywgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyIHByZXNlbnRlcikgewotCQlmRG9jdW1lbnQgPSBkb2M7Ci0JCWZNb2RlbFV0aWwgPSBuZXcgQ29udGV4dEluZm9Nb2RlbFV0aWwoZkRvY3VtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2RSZWdpb24KLQkgKiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2FuUHJvcG9zZUluZm8oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlpZiAoKHNkUmVnaW9uICE9IG51bGwpICYmIGlzRW5kVGFnKHNkUmVnaW9uKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbltdIGdldEF0dHJpYnV0ZUluZm9ybWF0aW9uKGludCBvZmZzZXQpIHsKLQkJLyoKLQkJICogbmVlZCB0byB0YWtlIGNhcmUgb2Ygc3BlY2lhbCBjYXNlcyB3LyBhbWJpZ3VvdXMgcmVnaW9ucyA8dGFnPnwKLQkJICogPC90YWc+IGFsc28gZW5kIHRhZ3MuLgotCQkgKi8KLQkJSUNvbnRleHRJbmZvcm1hdGlvbltdIHJlc3VsdHMgPSBFTVBUWV9DT05URVhUX0lORk87Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGZNb2RlbFV0aWwuZ2V0RG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQlpZiAoIWNhblByb3Bvc2VJbmZvKHNkUmVnaW9uKSkgewotCQkJcmV0dXJuIEVNUFRZX0NPTlRFWFRfSU5GTzsKLQkJfQotCi0JCUlET01Ob2RlIG5vZGUgPSBmTW9kZWxVdGlsLmdldFhNTE5vZGUob2Zmc2V0KTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLQkJCQkJcmVzdWx0cyA9IGdldEluZm9Gb3JFbGVtZW50KG5vZGUpOwotCQkJCQlicmVhazsKLQkJCQkvLyBmdXR1cmUuLi4KLQkJCQkvLyBjYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCQkvLyByZXN1bHRzID0gZ2V0SW5mb0ZvclRleHQobm9kZSk7Ci0JCQkJLy8gYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbXBhcmF0b3IgdGhhdCBjb21wYXJlcyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIG5hbWVzLgotCSAqIAotCSAqIHRoZSBjb21wYXJhdG9yCi0JICovCi0JcHJpdmF0ZSBDb21wYXJhdG9yIGdldENNQXR0cmlidXRlQ29tcGFyYXRvcigpIHsKLQkJaWYgKGZDb21wYXJhdG9yID09IG51bGwpIHsKLQkJCWZDb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQkJCXJldHVybiAoKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIG8xKS5nZXRBdHRyTmFtZSgpLmNvbXBhcmVUbygoKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIG8yKS5nZXRBdHRyTmFtZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBmQ29tcGFyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbm9kZQotCSAqIAotCSAqLwotCXByaXZhdGUgSUNvbnRleHRJbmZvcm1hdGlvbltdIGdldEluZm9Gb3JFbGVtZW50KElET01Ob2RlIG5vZGUpIHsKLQkJSUNvbnRleHRJbmZvcm1hdGlvbltdIHJlc3VsdHMgPSBFTVBUWV9DT05URVhUX0lORk87Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBmTW9kZWxVdGlsLmdldE1vZGVsUXVlcnkoKS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgbm9kZSk7Ci0JCWlmIChkZWNsICE9IG51bGwpIHsKLQkJCUNNTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBkZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkJQ01OYW1lZE5vZGVNYXBJbXBsIGFsbEF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKGF0dHJpYnV0ZXMpOwotCQkJTGlzdCBub2RlcyA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEF2YWlsYWJsZUNvbnRlbnQoKEVsZW1lbnQpIG5vZGUsIGRlY2wsIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbm9kZXMuc2l6ZSgpOyBrKyspIHsKLQkJCQlDTU5vZGUgY21ub2RlID0gKENNTm9kZSkgbm9kZXMuZ2V0KGspOwotCQkJCWlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCWFsbEF0dHJpYnV0ZXMucHV0KGNtbm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJYXR0cmlidXRlcyA9IGFsbEF0dHJpYnV0ZXM7Ci0JCQkKLQkJCVN0cmluZyBhdHRyQ29udGV4dFN0cmluZyA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCVN0cmluZ0J1ZmZlciBhdHRySW5mbyA9IG5ldyBTdHJpbmdCdWZmZXIoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJSGFzaE1hcCBhdHRyUG9zTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWludCBwb3MgPSAwOwotCQkJaW50IGxlbmd0aCA9IDA7Ci0JCQlpbnQgbnVtUGVyTGluZSA9IDg7Ci0KLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb25bXSBzb3J0ZWRBdHRycyA9IGdldFNvcnRlZEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc29ydGVkQXR0cnMubGVuZ3RoOyBpKyspIHsKLQkJCQluYW1lID0gc29ydGVkQXR0cnNbaV0uZ2V0QXR0ck5hbWUoKTsKLQkJCQlsZW5ndGggPSBuYW1lLmxlbmd0aCgpOwotCQkJCXBvcyA9IGF0dHJJbmZvLmxlbmd0aCgpOwotCi0JCQkJYXR0ckluZm8uYXBwZW5kKG5hbWUpOwotCi0JCQkJaWYgKHNvcnRlZEF0dHJzW2ldLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgewotCQkJCQlhdHRySW5mby5hcHBlbmQoIioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlsZW5ndGgrKzsKLQkJCQl9Ci0JCQkJaWYgKGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpIC0gMSkgewotCQkJCQlhdHRySW5mby5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoKGkgIT0gMCkgJiYgKGkgJSBudW1QZXJMaW5lID09IDApKSB7Ci0JCQkJCQlhdHRySW5mby5hcHBlbmQoIlxuICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJYXR0clBvc01hcC5wdXQobmFtZSwgbmV3IFBvc2l0aW9uKHBvcywgbGVuZ3RoKSk7Ci0JCQl9Ci0JCQlpZiAoIWF0dHJJbmZvLnRvU3RyaW5nKCkudHJpbSgpLmVxdWFscygiIikpIHsKLQkJCQlyZXR1cm4gbmV3IElDb250ZXh0SW5mb3JtYXRpb25bXXtuZXcgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uKGF0dHJDb250ZXh0U3RyaW5nLCBhdHRySW5mby50b1N0cmluZygpLCBhdHRyUG9zTWFwKX07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5vZGUKLQkgKiAKLQkgKi8KLQlJQ29udGV4dEluZm9ybWF0aW9uW10gZ2V0SW5mb0ZvclRleHQoSURPTU5vZGUgbm9kZSkgewotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlTdHJpbmcgY29udGV4dFN0cmluZyA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJU3RyaW5nQnVmZmVyIGluZm8gPSBuZXcgU3RyaW5nQnVmZmVyKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGZNb2RlbFV0aWwuZ2V0TW9kZWxRdWVyeSgpLmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBwYXJlbnQpOwotCQkJQ01Db250ZW50IGNvbnRlbnQgPSBkZWNsLmdldENvbnRlbnQoKTsKLQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgQ01Hcm91cCkgewotCQkJCUNNR3JvdXAgY21Hcm91cCA9IChDTUdyb3VwKSBjb250ZW50OwotCQkJCUNNTm9kZUxpc3QgY2hpbGRyZW4gPSBjbUdyb3VwLmdldENoaWxkTm9kZXMoKTsKLQkJCQlDTU5vZGUgY21Ob2RlID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJY21Ob2RlID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCQkJY29udGV4dFN0cmluZyA9IGNtTm9kZS5nZXROb2RlTmFtZSgpOwotCQkJCQlpZiAoY29udGV4dFN0cmluZyAhPSBudWxsKSB7Ci0JCQkJCQlpbmZvLmFwcGVuZCgiPCIgKyBjbU5vZGUuZ2V0Tm9kZU5hbWUoKSArICI+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJaWYgKGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKSAtIDEpIHsKLQkJCQkJCQlpbmZvLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCFpbmZvLnRvU3RyaW5nKCkudHJpbSgpLmVxdWFscygiIikpIHsKLQkJCXJldHVybiBuZXcgSUNvbnRleHRJbmZvcm1hdGlvbltde25ldyBDb250ZXh0SW5mb3JtYXRpb24oY29udGV4dFN0cmluZywgaW5mby50b1N0cmluZygpKX07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gRU1QVFlfQ09OVEVYVF9JTkZPOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBzb3J0ZWQgYXJyYXkgb2YgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGF0dHJpYnV0ZXMKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENNQXR0cmlidXRlRGVjbGFyYXRpb25bXSBnZXRTb3J0ZWRBdHRyaWJ1dGVzKENNTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMpIHsKLQkJTGlzdCBzb3J0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlzb3J0ZWQuYWRkKGF0dHJpYnV0ZXMuaXRlbShpKSk7Ci0JCX0KLQkJQ29sbGVjdGlvbnMuc29ydChzb3J0ZWQsIGdldENNQXR0cmlidXRlQ29tcGFyYXRvcigpKTsKLQkJcmV0dXJuIChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uW10pIHNvcnRlZC50b0FycmF5KG5ldyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uW3NvcnRlZC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2RSZWdpb24KLQkgKiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmRUYWcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJcmV0dXJuIHJlZ2lvbnMuZ2V0KDApLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29udGVudEFzc2lzdFJlcXVlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbnRlbnRBc3Npc3RSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMWQzYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29udGVudEFzc2lzdFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIENvbnRlbnRBc3Npc3RSZXF1ZXN0IHsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIExpc3QgbWFjcm9zID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBTdHJpbmcgbWF0Y2hTdHJpbmc7Ci0JcHJvdGVjdGVkIE5vZGUgbm9kZSA9IG51bGw7Ci0JcHJvdGVjdGVkIE5vZGUgcGFyZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgTGlzdCBwcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIElUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIGludCByZXBsYWNlbWVudEJlZ2luUG9zaXRpb247Ci0JcHJvdGVjdGVkIGludCByZXBsYWNlbWVudExlbmd0aDsKLQotCS8vIHByaXZhdGUgQm9vbGVhbiBzZXBhcmF0ZSA9IG51bGw7IC8vIChwYSkgbm90IHVzZWQKLQkvLyBwcml2YXRlIEJvb2xlYW4gc29ydCA9IG51bGw7IC8vIChwYSkgbm90IHVzZWQKLQkvKioKLQkgKiBYTUxDb250ZW50QXNzaXN0UmVxdWVzdCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDb250ZW50QXNzaXN0UmVxdWVzdChOb2RlIG5vZGUsIE5vZGUgcGFyZW50LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBpbnQgYmVnaW4sIGludCBsZW5ndGgsIFN0cmluZyBmaWx0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJc2V0Tm9kZShub2RlKTsKLQkJc2V0UGFyZW50KHBhcmVudCk7Ci0JCXNldERvY3VtZW50UmVnaW9uKGRvY3VtZW50UmVnaW9uKTsKLQkJc2V0UmVnaW9uKGNvbXBsZXRpb25SZWdpb24pOwotCQlzZXRNYXRjaFN0cmluZyhmaWx0ZXIpOwotCQlzZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oYmVnaW4pOwotCQlzZXRSZXBsYWNlbWVudExlbmd0aChsZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE1hY3JvKElDb21wbGV0aW9uUHJvcG9zYWwgbmV3UHJvcG9zYWwpIHsKLQkJbWFjcm9zLmFkZChuZXdQcm9wb3NhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUHJvcG9zYWwoSUNvbXBsZXRpb25Qcm9wb3NhbCBuZXdQcm9wb3NhbCkgewotCQlwcm9wb3NhbHMuYWRkKG5ld1Byb3Bvc2FsKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldENvbXBsZXRpb25Qcm9wb3NhbHMoKSB7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWwgcmVzdWx0c1tdID0gbnVsbDsKLQkJaWYgKChnZXRQcm9wb3NhbHMoKS5zaXplKCkgPiAwKSB8fCAoZ2V0TWFjcm9zKCkuc2l6ZSgpID4gMCkpIHsKLQkJCUxpc3QgYWxsUHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKCFzaG91bGRTZXBhcmF0ZSgpKSB7Ci0JCQkJYWxsUHJvcG9zYWxzLmFkZEFsbChnZXRQcm9wb3NhbHMoKSk7Ci0JCQkJLy8gc2hvdWxkIGJlIGVtcHR5LCBhcyBhbGwgbWFjcm9zIHNob3VsZCBoYXZlIGdvbmUgaW50byB0aGUKLQkJCQkvLyBwcm9wb3NhbCBsaXN0Ci0JCQkJYWxsUHJvcG9zYWxzLmFkZEFsbChnZXRNYWNyb3MoKSk7Ci0JCQkJYWxsUHJvcG9zYWxzID0gc29ydFByb3Bvc2FscyhhbGxQcm9wb3NhbHMpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWxsUHJvcG9zYWxzLmFkZEFsbChzb3J0UHJvcG9zYWxzKGdldFByb3Bvc2FscygpKSk7Ci0JCQkJYWxsUHJvcG9zYWxzLmFkZEFsbChzb3J0UHJvcG9zYWxzKGdldE1hY3JvcygpKSk7Ci0JCQl9Ci0KLQkJCXJlc3VsdHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFthbGxQcm9wb3NhbHMuc2l6ZSgpXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsUHJvcG9zYWxzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVzdWx0c1tpXSA9IChJQ29tcGxldGlvblByb3Bvc2FsKSBhbGxQcm9wb3NhbHMuZ2V0KGkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBkb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldE1hY3JvcygpIHsKLQkJcmV0dXJuIG1hY3JvczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRNYXRjaFN0cmluZygpIHsKLQkJcmV0dXJuIG1hdGNoU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldE5vZGUoKSB7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIGphdmEudXRpbC5MaXN0IGdldFByb3Bvc2FscygpIHsKLQkJcmV0dXJuIHByb3Bvc2FsczsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0UmVnaW9uKCkgewotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSB7Ci0JCXJldHVybiByZXBsYWNlbWVudEJlZ2luUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlcGxhY2VtZW50TGVuZ3RoKCkgewotCQlyZXR1cm4gcmVwbGFjZW1lbnRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJaWYgKChnZXREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpICYmIChnZXRSZWdpb24oKSAhPSBudWxsKSkgewotCQkJcmV0dXJuICgoSVRleHRSZWdpb25Db2xsZWN0aW9uKSBnZXREb2N1bWVudFJlZ2lvbigpKS5nZXRTdGFydE9mZnNldChnZXRSZWdpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJaWYgKChnZXREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpICYmIChnZXRSZWdpb24oKSAhPSBudWxsKSkgewotCQkJcmV0dXJuICgoSVRleHRSZWdpb25Db2xsZWN0aW9uKSBnZXREb2N1bWVudFJlZ2lvbigpKS5nZXRUZXh0KGdldFJlZ2lvbigpKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoKSB7Ci0JCWlmICgoZ2V0RG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSAmJiAoZ2V0UmVnaW9uKCkgIT0gbnVsbCkpIHsKLQkJCXJldHVybiAoKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgZ2V0RG9jdW1lbnRSZWdpb24oKSkuZ2V0VGV4dEVuZE9mZnNldChnZXRSZWdpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZWdpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlkb2N1bWVudFJlZ2lvbiA9IHJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3TWF0Y2hTdHJpbmcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXRjaFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIG5ld01hdGNoU3RyaW5nKSB7Ci0JCW1hdGNoU3RyaW5nID0gbmV3TWF0Y2hTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld05vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb2RlKG9yZy53M2MuZG9tLk5vZGUgbmV3Tm9kZSkgewotCQlub2RlID0gbmV3Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3UGFyZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KG9yZy53M2MuZG9tLk5vZGUgbmV3UGFyZW50KSB7Ci0JCXBhcmVudCA9IG5ld1BhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3UmVnaW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVnaW9uKElUZXh0UmVnaW9uIG5ld1JlZ2lvbikgewotCQlyZWdpb24gPSBuZXdSZWdpb247Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1JlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbgotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKGludCBuZXdSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24pIHsKLQkJcmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uID0gbmV3UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0UmVwbGFjZW1lbnRMZW5ndGgoaW50IG5ld1JlcGxhY2VtZW50TGVuZ3RoKSB7Ci0JCXJlcGxhY2VtZW50TGVuZ3RoID0gbmV3UmVwbGFjZW1lbnRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkU2VwYXJhdGUoKSB7Ci0JCS8qCi0JCSAqIGlmIChzZXBhcmF0ZSA9PSBudWxsKSB7IFByZWZlcmVuY2VNYW5hZ2VyIG1hbmFnZXIgPQotCQkgKiBnZXRQcmVmZXJlbmNlTWFuYWdlcigpOyBpZihtYW5hZ2VyID09IG51bGwpIHsgc2VwYXJhdGUgPQotCQkgKiBCb29sZWFuLkZBTFNFOyB9IGVsc2UgeyBFbGVtZW50IGNhU2V0dGluZ3MgPQotCQkgKiBtYW5hZ2VyLmdldEVsZW1lbnQoUHJlZmVyZW5jZU5hbWVzLkNPTlRFTlRfQVNTSVNUKTsgc2VwYXJhdGUgPSBuZXcKLQkJICogQm9vbGVhbihjYVNldHRpbmdzLmdldEF0dHJpYnV0ZShQcmVmZXJlbmNlTmFtZXMuU0VQQVJBVEUpLmVxdWFscyhQcmVmZXJlbmNlTmFtZXMuVFJVRSkpOyB9IH0KLQkJICogcmV0dXJuIHNlcGFyYXRlLmJvb2xlYW5WYWx1ZSgpOwotCQkgKi8KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IHNvcnRQcm9wb3NhbHMoTGlzdCBwcm9wb3NhbHNJbikgewotCQlDb2xsZWN0aW9ucy5zb3J0KHByb3Bvc2Fsc0luLCBuZXcgUHJvcG9zYWxDb21wYXJhdG9yKCkpOwotCQlyZXR1cm4gcHJvcG9zYWxzSW47Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJOb2RlOiAiICsgZ2V0Tm9kZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiXG5QYXJlbnQ6ICIgKyBnZXRQYXJlbnQoKSAvLyROT04tTkxTLTEkCi0JCQkJCSsgIlxuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOiAiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldERvY3VtZW50UmVnaW9uKCkudG9TdHJpbmcoKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkrICJcblJlZ2lvbjogIiArIGdldFJlZ2lvbigpIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiXG5NYXRjaCBzdHJpbmc6ICciICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldE1hdGNoU3RyaW5nKCkpICsgIiciIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCSsgIlxuT2Zmc2V0czogWyIgKyBnZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSArICItIiArIChnZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSArIGdldFJlcGxhY2VtZW50TGVuZ3RoKCkpICsgIl1cbiI7IC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29udGV4dEluZm9Nb2RlbFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbnRleHRJbmZvTW9kZWxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OGU3NTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29udGV4dEluZm9Nb2RlbFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZXh0SW5mb01vZGVsVXRpbCB7Ci0JSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCi0JQ29udGV4dEluZm9Nb2RlbFV0aWwoSVN0cnVjdHVyZWREb2N1bWVudCBkb2MpIHsKLQkJZkRvY3VtZW50ID0gZG9jOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoKSB7Ci0JCU1vZGVsUXVlcnkgbXEgPSBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJeG1sTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGdldERvY3VtZW50KCkpOwotCQkJbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KHhtbE1vZGVsKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1xOwotCX0KLQotCXB1YmxpYyBJRE9NTm9kZSBnZXRYTUxOb2RlKGludCBvZmZzZXQpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCB4bWxNb2RlbCA9IG51bGw7Ci0JCUlET01Ob2RlIHhtbE5vZGUgPSBudWxsOwotCQl0cnkgewotCQkJeG1sTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGdldERvY3VtZW50KCkpOwotCQkJeG1sTm9kZSA9IChJRE9NTm9kZSkgeG1sTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpCi0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIHhtbE5vZGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTlkZDkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbVRlbXBsYXRlUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbDsKLQotLyoqCi0gKiBQdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gbWFrZSB0aGUgYWRkaXRpb25hbCBwcm9wb3NhbCBpbmZvIGludG8gY29udGVudAotICogZml0IGZvciBhbiBIVE1MIHZpZXdlciAoYnkgZXNjYXBpbmcgY2hhcmFjdGVycykKLSAqLwotY2xhc3MgQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbCBleHRlbmRzIFRlbXBsYXRlUHJvcG9zYWwgaW1wbGVtZW50cyBJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Ci0KLQlwdWJsaWMgQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbChUZW1wbGF0ZSB0ZW1wbGF0ZSwgVGVtcGxhdGVDb250ZXh0IGNvbnRleHQsIElSZWdpb24gcmVnaW9uLCBJbWFnZSBpbWFnZSwgaW50IHJlbGV2YW5jZSkgewotCQlzdXBlcih0ZW1wbGF0ZSwgY29udGV4dCwgcmVnaW9uLCBpbWFnZSwgcmVsZXZhbmNlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCVN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IHN1cGVyLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLQkJcmV0dXJuIFN0cmluZ1V0aWxzLmNvbnZlcnRUb0hUTUxDb250ZW50KGFkZGl0aW9uYWxJbmZvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Ob1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzc0NGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnM7Ci0KLQotLyoqCi0gKiBDb250ZW50QXNzaXN0UHJvY2Vzc29yIHRvIGhhbmRsZSBzcGVjaWFsIGNhc2VzIGluIGNvbnRlbnQgYXNzaXN0IHdoZXJlIHRoZQotICogcGFydGl0aW9uZXIgY2Fubm90IGRldGVybWluZSBhIHBhcnRpdGlvbiB0eXBlIGF0IHRoZSBjdXJyZW50IGN1cnNvcgotICogcG9zaXRpb24gKHVzdWFsbHkgYXQgRU9GKS4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIE5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElDb250ZW50QXNzaXN0UHJvY2Vzc29yLCBJUmVsZWFzYWJsZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGNoYXIgY29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzW10gPSBudWxsOwotCXByb3RlY3RlZCBjaGFyIGNvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyc1tdID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIEVNUFRZX1BST1BPU0FMX1NFVCA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCXByb3RlY3RlZCBTdHJpbmcgZkVycm9yTWVzc2FnZSA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZOYW1lVG9Qcm9jZXNzb3JNYXAgPSBudWxsOwotCXByaXZhdGUgSGFzaE1hcCBmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAgPSBudWxsOwotCi0JcHVibGljIE5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoU3RyaW5nIGtleSwgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yKSB7Ci0JCWFkZFByb2Nlc3NvcihnZXRQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpLCBrZXksIHByb2Nlc3Nvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmFtZVByb2Nlc3NvcihTdHJpbmcga2V5LCBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IpIHsKLQkJYWRkUHJvY2Vzc29yKGdldE5hbWVUb1Byb2Nlc3Nvck1hcCgpLCBrZXksIHByb2Nlc3Nvcik7Ci0JfQotCi0JcHJvdGVjdGVkIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldFBhcnRpdGlvblByb2Nlc3NvcihTdHJpbmcga2V5KSB7Ci0JCXJldHVybiAoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGdldFBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCkuZ2V0KGtleSk7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlcyByZWxlYXNlIGlmIGl0J3MgYSBkdXBsaWNhdGUgcGFydGl0aW9uIHR5cGUuCi0JICogCi0JICogQHBhcmFtIG1hcAotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcGFyYW0gcHJvY2Vzc29yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFByb2Nlc3NvcihIYXNoTWFwIG1hcCwgU3RyaW5nIGtleSwgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yKSB7Ci0JCU9iamVjdCBvID0gbWFwLnJlbW92ZShrZXkpOwotCQlpZiAobyAhPSBudWxsKSB7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIElSZWxlYXNhYmxlKSB7Ci0JCQkJKChJUmVsZWFzYWJsZSkgbykucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0JCW1hcC5wdXQoa2V5LCBwcm9jZXNzb3IpOwotCX0KLQotCS8qKgotCSAqIEZpZ3VyZXMgb3V0IHdoYXQgdGhlIGNvcnJlY3QgSUNvbXBsZXRpb25Qcm9wb3NhbFByb2Nlc3NvciBpcyBhbmQKLQkgKiBjb21wdXRlc0NvbXBsZXRpb25Qcm9wb3NhbHMgb24gdGhhdC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IG51bGw7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSByZXN1bHRzID0gRU1QVFlfUFJPUE9TQUxfU0VUOwotCi0JCXAgPSBndWVzc0NvbnRlbnRBc3Npc3RQcm9jZXNzb3Iodmlld2VyLCBkb2N1bWVudE9mZnNldCk7Ci0JCWlmIChwICE9IG51bGwpIHsKLQkJCXJlc3VsdHMgPSBwLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRPZmZzZXQpOwotCQl9Ci0KLQkJcmV0dXJuIChyZXN1bHRzICE9IG51bGwpID8gcmVzdWx0cyA6IEVNUFRZX1BST1BPU0FMX1NFVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCS8vIGdldCBjb250ZXh0IGluZm8gZnJvbSBwcm9jZXNzb3IgdGhhdCB3ZSBlbmQgdXAgdXNpbmcuLi4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIGNvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKQotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gY29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgewotCQkvLyByZXR1cm4gdGhlIHZhbGlkYXRvciBmb3IgdGhlIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvciB0aGF0IHdlCi0JCS8vIHVzZWQuLi4KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0RXJyb3JNZXNzYWdlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGZFcnJvck1lc3NhZ2U7Ci0JfQotCQotCXByaXZhdGUgSGFzaE1hcCBnZXROYW1lVG9Qcm9jZXNzb3JNYXAoKSB7Ci0JCWlmIChmTmFtZVRvUHJvY2Vzc29yTWFwID09IG51bGwpIHsKLQkJCWZOYW1lVG9Qcm9jZXNzb3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJaW5pdE5hbWVUb1Byb2Nlc3Nvck1hcCgpOwotCQl9Ci0JCXJldHVybiBmTmFtZVRvUHJvY2Vzc29yTWFwOwotCX0KLQkKLQlwcml2YXRlIEhhc2hNYXAgZ2V0UGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKSB7Ci0JCWlmIChmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAgPT0gbnVsbCkgewotCQkJZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWluaXRQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpOwotCQl9Ci0JCXJldHVybiBmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXA7Ci0JfQotCi0JLyoqCi0JICogR2l2ZXMgeW91IHRoZSBkb2N1bWVudCBwYXJ0aXRpb24gdHlwZSAoU3RyaW5nKSBmb3IgdGhlIGdpdmVuCi0JICogU3RydWN0dXJlZFRleHRWaWV3ZXIgYW5kIGRvY3VtZW50UG9zaXRpb24uCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoU3RydWN0dXJlZFRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJU3RyaW5nIHBhcnRpdGlvblR5cGUgPSBudWxsOwotCQlJVHlwZWRSZWdpb24gcGFydGl0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBhcnRpdGlvbiA9IGRvY3VtZW50LmdldFBhcnRpdGlvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJCXBhcnRpdGlvblR5cGUgPSBwYXJ0aXRpb24uZ2V0VHlwZSgpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlwYXJ0aXRpb25UeXBlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcGFydGl0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBHdWVzc2VzIGEgQ29udGVudEFzc2lzdFByb2Nlc3NvciBiYXNlZCBvbiB0aGUgVGV4dFZpZXdlciBhbmQKLQkgKiBkb2N1bWVudE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogQHBhcmFtIGRvY3VtZW50T2Zmc2V0Ci0JICovCi0JcHJvdGVjdGVkIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGd1ZXNzQ29udGVudEFzc2lzdFByb2Nlc3NvcihJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQkvLyBtYXBwaW5nIGxvZ2ljIGhlcmUuLi4KLQkJLy8gbG9vayBAIHByZXZpb3VzIHJlZ2lvbgotCQkvLyBsb29rIEAgcHJldmlvdXMgZG9jIHBhcnRpdGlvbiB0eXBlCi0JCS8vIGxvb2sgQCBwYWdlIGxhbmd1YWdlCi0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gQ29udGVudEFzc2lzdFV0aWxzLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KTsKLQkJaWYgKHNkUmVnaW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyBjdXJyZW50UmVnaW9uVHlwZSA9IHNkUmVnaW9uLmdldFR5cGUoKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY3VycmVudCByZWdpb24gdHlwZSBpcyA+PiAiICsKLQkJCS8vIGN1cnJlbnRSZWdpb25UeXBlKTsKLQkJCWlmIChjdXJyZW50UmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RQcmV2ID0gc2RSZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJCQlpZiAoc2RQcmV2ICE9IG51bGwpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTdHJpbmcgcHJldlJlZ2lvblR5cGUgPSBzZFByZXYuZ2V0VHlwZSgpOwotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJwcmV2aW91cyByZWdpb24gdHlwZSBpcyA+PiAiICsgcHJldlJlZ2lvblR5cGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gd29ya2luZyB3LyB2aWV3ZXIgJiBkb2N1bWVudCBwYXJ0aXRpb24KLQkJaWYgKChwID09IG51bGwpICYmICh2aWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKSA+IDApKSB7Ci0JCQlTdHJpbmcgcHJldlBhcnRpdGlvblR5cGUgPSBnZXRQYXJ0aXRpb25UeXBlKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyLCBkb2N1bWVudE9mZnNldCAtIDEpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJwcmV2aW91cyBwYXJ0aXRpb24gdHlwZSBpcyA+ICIgKwotCQkJLy8gcHJldlBhcnRpdGlvblR5cGUpOwotCQkJcCA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgZ2V0UGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKS5nZXQocHJldlBhcnRpdGlvblR5cGUpOwotCQl9Ci0JCXJldHVybiBwOwotCX0KLQotCS8qKgotCSAqIEluaXRzIG1hcCBmb3IgZXh0cmEgQ29udGVudEFzc2lzdFByb2Nlc3NvcnMgKHVzZUJlYW4sIGdldC9zZXRQcm9wZXJ0eSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0TmFtZVRvUHJvY2Vzc29yTWFwKCkgewotCQkvLyBub3RoaW5nIHRvIGRvIGluIHRoaXMgY2FzZQotCX0KLQotCS8qKgotCSAqIEFkZHMgYWxsIHJlbGV2ZW50IENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzIHRvIHRoZSBwYXJ0aXRpb24gdG8gcHJvY2Vzc29yCi0JICogbWFwIChqdXN0IFhNTCBoZXJlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpIHsKLQkJWE1MQ29udGVudEFzc2lzdFByb2Nlc3NvciB4bWxQcm9jZXNzb3IgPSBuZXcgWE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQlhZGRQcm9jZXNzb3IoZ2V0UGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKSwgSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQsIHhtbFByb2Nlc3Nvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJcmVsZWFzZVBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCk7Ci0JCXJlbGVhc2VOYW1lVG9Qcm9jZXNzb3JNYXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlTWFwKEhhc2hNYXAgbWFwKSB7Ci0JCWlmICgobWFwICE9IG51bGwpICYmICFtYXAuaXNFbXB0eSgpKSB7Ci0JCQlJdGVyYXRvciBpdCA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJT2JqZWN0IGtleSA9IG51bGw7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJa2V5ID0gaXQubmV4dCgpOwotCQkJCWlmIChtYXAuZ2V0KGtleSkgaW5zdGFuY2VvZiBJUmVsZWFzYWJsZSkgewotCQkJCQkoKElSZWxlYXNhYmxlKSBtYXAuZ2V0KGtleSkpLnJlbGVhc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQltYXAuY2xlYXIoKTsKLQkJCW1hcCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlTmFtZVRvUHJvY2Vzc29yTWFwKCkgewotCQlyZWxlYXNlTWFwKGZOYW1lVG9Qcm9jZXNzb3JNYXApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpIHsKLQkJcmVsZWFzZU1hcChmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vblZhbGlkYXRpbmdNb2RlbFF1ZXJ5QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Ob25WYWxpZGF0aW5nTW9kZWxRdWVyeUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGEzOTdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vblZhbGlkYXRpbmdNb2RlbFF1ZXJ5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGNsYXNzIE5vblZhbGlkYXRpbmdNb2RlbFF1ZXJ5QWN0aW9uIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBY3Rpb24gewotCi0JcHJvdGVjdGVkIENNTm9kZSBjbW5vZGUgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgZW5kSW5kZXggPSAwOwotCXByb3RlY3RlZCBpbnQga2luZCA9IElOU0VSVDsKLQlwcm90ZWN0ZWQgaW50IHN0YXJ0SW5kZXggPSAwOwotCXByb3RlY3RlZCBPYmplY3QgdXNlckRhdGEgPSBudWxsOwotCi0JLyoqCi0JICogTm9uVmFsaWRhdGluZ01vZGVsUXVlcnlBY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9uVmFsaWRhdGluZ01vZGVsUXVlcnlBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTm9uVmFsaWRhdGluZ01vZGVsUXVlcnlBY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTm9uVmFsaWRhdGluZ01vZGVsUXVlcnlBY3Rpb24oQ01Ob2RlIG5ld0NoaWxkLCBpbnQgbmV3S2luZCwgaW50IG5ld1N0YXJ0LCBpbnQgbmV3RW5kLCBPYmplY3QgbmV3VXNlckRhdGEpIHsKLQkJc3VwZXIoKTsKLQkJY21ub2RlID0gbmV3Q2hpbGQ7Ci0JCWtpbmQgPSBuZXdLaW5kOwotCQlzdGFydEluZGV4ID0gbmV3U3RhcnQ7Ci0JCWVuZEluZGV4ID0gbmV3RW5kOwotCQl1c2VyRGF0YSA9IG5ld1VzZXJEYXRhOwotCX0KLQotCS8qKgotCSAqIGdldENNTm9kZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUgZ2V0Q01Ob2RlKCkgewotCQlyZXR1cm4gY21ub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFbmRJbmRleCgpIHsKLQkJcmV0dXJuIGVuZEluZGV4OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4ga2luZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQYXJlbnQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLk5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRJbmRleCgpIHsKLQkJcmV0dXJuIHN0YXJ0SW5kZXg7Ci0JfQotCi0JLyoqCi0JICogZ2V0VXNlckRhdGEgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRVc2VyRGF0YSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogcGVyZm9ybUFjdGlvbiBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQWN0aW9uKCkgewotCX0KLQotCS8qKgotCSAqIHNldENNTm9kZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDTU5vZGUob3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUgbmV3Tm9kZSkgewotCQljbW5vZGUgPSBuZXdOb2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdFbmRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW5kSW5kZXgoaW50IG5ld0VuZEluZGV4KSB7Ci0JCWVuZEluZGV4ID0gbmV3RW5kSW5kZXg7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0tpbmQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEtpbmQoaW50IG5ld0tpbmQpIHsKLQkJa2luZCA9IG5ld0tpbmQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1N0YXJ0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFN0YXJ0SW5kZXgoaW50IG5ld1N0YXJ0SW5kZXgpIHsKLQkJc3RhcnRJbmRleCA9IG5ld1N0YXJ0SW5kZXg7Ci0JfQotCi0JLyoqCi0JICogc2V0VXNlckRhdGEgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlckRhdGEoT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyBhY3Rpb25OYW1lID0gbnVsbDsKLQkJc3dpdGNoIChraW5kKSB7Ci0JCQljYXNlIElOU0VSVCA6Ci0JCQkJYWN0aW9uTmFtZSA9ICJJTlNFUlQiOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVNT1ZFIDoKLQkJCQlhY3Rpb25OYW1lID0gIlJFTU9WRSI7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBSRVBMQUNFIDoKLQkJCQlhY3Rpb25OYW1lID0gIlJFUExBQ0UiOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWFjdGlvbk5hbWUgPSAiVU5LTk9XTiBBQ1RJT04gIjsvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nIG5vZGVOYW1lID0gKGNtbm9kZSAhPSBudWxsKSA/IGdldENNTm9kZSgpLmdldE5vZGVOYW1lKCkgOiAiKHVua25vd24pIjsvLyROT04tTkxTLTEkCi0JCXJldHVybiBhY3Rpb25OYW1lICsgIj0iICsgbm9kZU5hbWUgKyAiKCIgKyBzdGFydEluZGV4ICsgIi4uLiIgKyBlbmRJbmRleCArICIpIjsvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUHJvcG9zYWxDb21wYXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Qcm9wb3NhbENvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2ZThlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Qcm9wb3NhbENvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbDsKLQotCi1wdWJsaWMgY2xhc3MgUHJvcG9zYWxDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0KLQotCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQlpbnQgcmVsZXZhbmNlID0gMDsKLQkJaWYgKChvMSBpbnN0YW5jZW9mIElSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwpICYmIChvMiBpbnN0YW5jZW9mIElSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwpKSB7Ci0JCQkvLyBzb3J0IGJhc2VkIG9uIHJlbGV2YW5jZQotCQkJSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCBjcDEgPSAoSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCkgbzE7Ci0JCQlJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsIGNwMiA9IChJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsKSBvMjsKLQotCQkJcmVsZXZhbmNlID0gY3AyLmdldFJlbGV2YW5jZSgpIC0gY3AxLmdldFJlbGV2YW5jZSgpOwotCi0JCQkvLyBpZiBzYW1lIHJlbGV2YW5jZSwgc2Vjb25kYXJ5IHNvcnQgKGxleGlncmFwaGljYWxseSkKLQkJCWlmICgocmVsZXZhbmNlID09IDApICYmIChvMSBpbnN0YW5jZW9mIElDb21wbGV0aW9uUHJvcG9zYWwpICYmIChvMiBpbnN0YW5jZW9mIElDb21wbGV0aW9uUHJvcG9zYWwpKSB7Ci0JCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcxID0gKChJQ29tcGxldGlvblByb3Bvc2FsKSBvMSkuZ2V0RGlzcGxheVN0cmluZygpOwotCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nMiA9ICgoSUNvbXBsZXRpb25Qcm9wb3NhbCkgbzIpLmdldERpc3BsYXlTdHJpbmcoKTsKLQkJCQlpZiAoKGRpc3BsYXlTdHJpbmcxICE9IG51bGwpICYmIChkaXNwbGF5U3RyaW5nMiAhPSBudWxsKSkgewotCQkJCQkvLyByZWxldmFuY2UgPSBkaXNwbGF5U3RyaW5nMS5jb21wYXJlVG8oZGlzcGxheVN0cmluZzIpOwotCQkJCQkvLyAvLyB0aGlzIGRpZG4ndCBtaXggY2FwcyB3LyBsb3dlcmNhc2UKLQkJCQkJcmVsZXZhbmNlID0gY29tLmlibS5pY3UudGV4dC5Db2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoZGlzcGxheVN0cmluZzEsIGRpc3BsYXlTdHJpbmcyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gb3RoZXJ3aXNlIGlmIGl0J3Mgbm90IElTRURSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwsIGRvbid0IHNvcnQKLQkJcmV0dXJuIHJlbGV2YW5jZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9SZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM3MTQ5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9SZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkRvY3VtZW50VGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVFeGNlcHRpb247Ci0KLS8qKgotICogSnVzdCBsaWtlIERvY3VtZW50VGVtcGxhdGVDb250ZXh0IGV4Y2VwdCBpZiBhbiBpbnNlcnQgb2Zmc2V0IGlzIHBhc3NlZCBpbiwKLSAqIGR1cmluZyBldmFsdWF0aW9uLCB0aGUgInByZWZpeCIgYmVmb3JlIHRoZSB0ZW1wbGF0ZSB3aWxsIGJlIGNoZWNrZWQgdG8gc2VlCi0gKiBpZiBpdCBtYXRjaGVzIHRoZSB0ZW1wbGF0ZSBuYW1lLiBJZiBzbywgb3ZlcndyaXRlIHRoZSB0ZW1wbGF0ZSBuYW1lLgotICogT3RoZXJ3aXNlLCBqdXN0IGluc2VydCB0aGUgdGVtcGxhdGUgYXQgdGhlIGluc2VydCBvZmZzZXQgbG9jYXRpb24gKGJ5IG5vdAotICogb3ZlcndyaXRpbmcgdGhlIHByZWZpeCB0ZXh0KQotICovCi1wdWJsaWMgY2xhc3MgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQgZXh0ZW5kcyBEb2N1bWVudFRlbXBsYXRlQ29udGV4dCB7Ci0JcHJpdmF0ZSBpbnQgZkluc2VydE9mZnNldCA9IC0xOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRvY3VtZW50IHRlbXBsYXRlIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IHR5cGUKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCB0aGlzIGNvbnRleHQgYXBwbGllcyB0bwotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGRvY3VtZW50IHJlZ2lvbgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRvY3VtZW50IHJlZ2lvbgotCSAqLwotCXB1YmxpYyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dChUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUsIElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQl0aGlzKHR5cGUsIGRvY3VtZW50LCBuZXcgUG9zaXRpb24ob2Zmc2V0LCBsZW5ndGgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZG9jdW1lbnQgdGVtcGxhdGUgY29udGV4dC4gVGhlIHN1cHBsaWVkIDxjb2RlPlBvc2l0aW9uPC9jb2RlPgotCSAqIHdpbGwgYmUgcXVlcmllZCB0byBjb21wdXRlIHRoZSA8Y29kZT5nZXRTdGFydDwvY29kZT4gYW5kCi0JICogPGNvZGU+Z2V0RW5kPC9jb2RlPiBtZXRob2RzLCB3aGljaCB3aWxsIHRoZXJlZm9yZSBhbnN3ZXIgdXBkYXRlZAotCSAqIHBvc2l0aW9uIGRhdGEgaWYgaXQgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgdHlwZQotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHRoaXMgY29udGV4dCBhcHBsaWVzIHRvCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgcG9zaXRpb24gZGVzY3JpYmluZyB0aGUgYXJlYSBvZiB0aGUgZG9jdW1lbnQgd2hpY2ggZm9ybXMKLQkgKiAgICAgICAgICAgIHRoZSB0ZW1wbGF0ZSBjb250ZXh0Ci0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dChUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUsIElEb2N1bWVudCBkb2N1bWVudCwgUG9zaXRpb24gcG9zaXRpb24pIHsKLQkJc3VwZXIodHlwZSwgZG9jdW1lbnQsIHBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZG9jdW1lbnQgdGVtcGxhdGUgY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgdHlwZQotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHRoaXMgY29udGV4dCBhcHBsaWVzIHRvCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uCi0JICogQHBhcmFtIGluc2VydE9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uIHdoZXJlIGluc2VydCB3YXMKLQkgKiAgICAgICAgICAgIG9yaWdpbmFsbHkgcmVxdWVzdGVkCi0JICovCi0JcHVibGljIFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0KFRlbXBsYXRlQ29udGV4dFR5cGUgdHlwZSwgSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgaW5zZXJ0T2Zmc2V0KSB7Ci0JCXRoaXModHlwZSwgZG9jdW1lbnQsIG5ldyBQb3NpdGlvbihvZmZzZXQsIGxlbmd0aCkpOwotCQlmSW5zZXJ0T2Zmc2V0ID0gaW5zZXJ0T2Zmc2V0OwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQjZXZhbHVhdGUob3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGUpCi0JICovCi0JcHVibGljIFRlbXBsYXRlQnVmZmVyIGV2YWx1YXRlKFRlbXBsYXRlIHRlbXBsYXRlKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIFRlbXBsYXRlRXhjZXB0aW9uIHsKLQkJVGVtcGxhdGVCdWZmZXIgYnVmZmVyID0gc3VwZXIuZXZhbHVhdGUodGVtcGxhdGUpOwotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCWlmICgoZkluc2VydE9mZnNldCA+IC0xKSAmJiAoZkluc2VydE9mZnNldCA+IGdldFN0YXJ0KCkpKSB7Ci0JCQkJU3RyaW5nIHByZWZpeCA9IGdldERvY3VtZW50KCkuZ2V0KGdldFN0YXJ0KCksIGZJbnNlcnRPZmZzZXQgLSBnZXRTdGFydCgpKTsKLQkJCQlpZiAoIXRlbXBsYXRlLmdldE5hbWUoKS5zdGFydHNXaXRoKHByZWZpeCkpIHsKLQkJCQkJLy8gZ2VuZXJhdGUgYSBuZXcgYnVmZmVyIHRoYXQgYWN0dWFsbHkgY29udGFpbnMgdGhlCi0JCQkJCS8vIHRleHQgdGhhdCB3YXMgZ29pbmcgdG8gYmUgb3ZlcndyaXR0ZW4KLQkJCQkJYnVmZmVyID0gbmV3IFRlbXBsYXRlQnVmZmVyKHByZWZpeCArIGJ1ZmZlci5nZXRTdHJpbmcoKSwgYnVmZmVyLmdldFZhcmlhYmxlcygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9TaW1wbGVDTUVsZW1lbnREZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvU2ltcGxlQ01FbGVtZW50RGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFhNjA3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9TaW1wbGVDTUVsZW1lbnREZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ01FbGVtZW50RGVjbGFyYXRpb24gaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uIHsKLQotCVN0cmluZyBmTm9kZU5hbWU7Ci0KLQkvKioKLQkgKiBTaW1wbGVDTUVMZW1lbnREZWNsYXJhdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTaW1wbGVDTUVsZW1lbnREZWNsYXJhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlQ01FbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldE5vZGVOYW1lKG5vZGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyaWJ1dGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKiAKLQkgKiBSZXR1cm5zIENNTmFtZWROb2RlTWFwIG9mIEF0dHJpYnV0ZURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q01Db250ZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01Db250ZW50Ci0JICogCi0JICogUmV0dXJucyB0aGUgcm9vdCBub2RlIG9mIHRoaXMgZWxlbWVudCdzIGNvbnRlbnQgbW9kZWwuIFRoaXMgY2FuIGJlIGFuCi0JICogQ01FbGVtZW50RGVjbGFyYXRpb24gb3IgYSBDTUdyb3VwCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldENvbnRlbnRUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogCi0JICogUmV0dXJucyBvbmUgb2YgOiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlIGdldERhdGFUeXBlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbGVtZW50TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMb2NhbEVsZW1lbnRzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKiAKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBsb2NhbGx5IGRlZmluZWQgZWxlbWVudHMuCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXAgZ2V0TG9jYWxFbGVtZW50cygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWF4T2NjdXIgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiAKLQkgKiBJZiAtMSwgaXQncyBVTkJPVU5ERUQuCi0JICovCi0JcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWluT2NjdXIgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiAKLQkgKiBJZiAwLCBpdCdzIE9QVElPTkFMLiBJZiAxLCBpdCdzIFJFUVVJUkVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gZk5vZGVOYW1lOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIGdldFByb3BlcnR5IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqIAotCSAqIFJldHVybnMgdGhlIG9iamVjdCBwcm9wZXJ0eSBkZXNjaXBlZCBieSB0aGUgcHJvcGVydHlOYW1lCi0JICogCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdOb2RlTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vZGVOYW1lKGphdmEubGFuZy5TdHJpbmcgbmV3Tm9kZU5hbWUpIHsKLQkJZk5vZGVOYW1lID0gbmV3Tm9kZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogc3VwcG9ydHMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBDTU5vZGUgc3VwcG9ydHMgYSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Tb3VyY2VFZGl0b3JJbWFnZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvU291cmNlRWRpdG9ySW1hZ2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUxNjc3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Tb3VyY2VFZGl0b3JJbWFnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIHVzZSBpbnRlcm5hbCBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBvciBleHRlcm5hbAotICogICAgICAgICAgICAgU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgaW5zdGVhZAotICovCi1wdWJsaWMgY2xhc3MgU291cmNlRWRpdG9ySW1hZ2VIZWxwZXIgewotCi0JcHVibGljIFNvdXJjZUVkaXRvckltYWdlSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBjcmVhdGVJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oWE1MVUlQbHVnaW4uSUQsIHJlc291cmNlKTsKLQkJSW1hZ2UgaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCUpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKS5wdXQocmVzb3VyY2UsIGltYWdlKTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTJjMDRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUw7Ci0KLXB1YmxpYyBjbGFzcyBYTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZlByZWZlcmVuY2VTdG9yZSA9IG51bGw7Ci0JcHJvdGVjdGVkIElSZXNvdXJjZSBmUmVzb3VyY2UgPSBudWxsOwotCXByaXZhdGUgWE1MVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yIGZUZW1wbGF0ZVByb2Nlc3NvciA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZUZW1wbGF0ZUNvbnRleHRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIFhNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlTmFtZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuQVRUUklCVVRFKTsKLQkJc3VwZXIuYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLkFUVFJJQlVURV9WQUxVRSk7Ci0JCXN1cGVyLmFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5ORVcpOwotCQlzdXBlci5hZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5UQUcpOwotCQlzdXBlci5hZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNoaWxkUG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGVtcGxhdGVzIHRvIHRoZSBsaXN0IG9mIHByb3Bvc2FscwotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50QXNzaXN0UmVxdWVzdAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRlbXBsYXRlcyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgU3RyaW5nIGNvbnRleHQpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjb250ZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0ZW1wbGF0ZXMgdG8gdGhlIGxpc3Qgb2YgcHJvcG9zYWxzCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRBc3Npc3RSZXF1ZXN0Ci0JICogQHBhcmFtIGNvbnRleHQKLQkgKiBAcGFyYW0gc3RhcnRPZmZzZXQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVGVtcGxhdGVzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0T2Zmc2V0KSB7Ci0JCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBpZiBhbHJlYWR5IGFkZGluZyB0ZW1wbGF0ZSBwcm9wb3NhbHMgZm9yIGEgY2VydGFpbiBjb250ZXh0IHR5cGUsIGRvCi0JCS8vIG5vdCBhZGQgYWdhaW4KLQkJaWYgKCFmVGVtcGxhdGVDb250ZXh0cy5jb250YWlucyhjb250ZXh0KSkgewotCQkJZlRlbXBsYXRlQ29udGV4dHMuYWRkKGNvbnRleHQpOwotCQkJYm9vbGVhbiB1c2VQcm9wb3NhbExpc3QgPSAhY29udGVudEFzc2lzdFJlcXVlc3Quc2hvdWxkU2VwYXJhdGUoKTsKLQotCQkJaWYgKGdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpICE9IG51bGwpIHsKLQkJCQlnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5zZXRDb250ZXh0VHlwZShjb250ZXh0KTsKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoZlRleHRWaWV3ZXIsIHN0YXJ0T2Zmc2V0KTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3Bvc2Fscy5sZW5ndGg7ICsraSkgewotCQkJCQlpZiAodXNlUHJvcG9zYWxMaXN0KSB7Ci0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbHNbaV0pOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkTWFjcm8ocHJvcG9zYWxzW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSB0cmVlTm9kZSwgSURPTU5vZGUgeG1sbm9kZSkgewotCQlDb250ZW50QXNzaXN0UmVxdWVzdCByZXF1ZXN0ID0gc3VwZXIuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJLy8gYnVnMTE1OTI3IHVzZSBvcmlnaW5hbCBkb2N1bWVudCBwb3NpdGlvbiBmb3IgYWxsL2FueSByZWdpb24KLQkJLy8gdGVtcGxhdGVzCi0JCWFkZFRlbXBsYXRlcyhyZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLkFMTCwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCXJldHVybiByZXF1ZXN0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jb250ZW50YXNzaXN0LkFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJZlRlbXBsYXRlQ29udGV4dHMuY2xlYXIoKTsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHRleHRWaWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJaWYgKGZQcmVmZXJlbmNlU3RvcmUgPT0gbnVsbCkgewotCQkJZlByZWZlcmVuY2VTdG9yZSA9IFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJfQotCQlyZXR1cm4gZlByZWZlcmVuY2VTdG9yZTsKLQl9Ci0KLQlwcml2YXRlIFhNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChmVGVtcGxhdGVQcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJZlRlbXBsYXRlUHJvY2Vzc29yID0gbmV3IFhNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpOwotCQl9Ci0JCXJldHVybiBmVGVtcGxhdGVQcm9jZXNzb3I7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJcmVpbml0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgcHJvcGVydHkgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCi0JCWlmICgocHJvcGVydHkuY29tcGFyZVRvKFhNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRSkgPT0gMCkgfHwgKHByb3BlcnR5LmNvbXBhcmVUbyhYTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0VfQ09ERSkgPT0gMCkpIHsKLQkJCXJlaW5pdCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVpbml0KCkgewotCQlTdHJpbmcga2V5ID0gWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFOwotCQlib29sZWFuIGRvQXV0byA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oa2V5KTsKLQkJaWYgKGRvQXV0bykgewotCQkJa2V5ID0gWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFX0NPREU7Ci0JCQljb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoa2V5KS50b0NoYXJBcnJheSgpOwotCQl9Ci0JCWVsc2UgewotCQkJY29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTRiMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuU2NyaXB0TGFuZ3VhZ2VLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzIGV4dGVuZHMgQ29udGVudEFzc2lzdFV0aWxzIHsKLQotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NMT1NFID0gIkpTUF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ERUNMQVJBVElPTl9PUEVOID0gIkpTUF9ERUNMQVJBVElPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1NDUklQVExFVF9PUEVOID0gIkpTUF9TQ1JJUFRMRVRfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9FWFBSRVNTSU9OX09QRU4gPSAiSlNQX0VYUFJFU1NJT05fT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVCA9ICJDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfU0NSSVBUX1RZUEUgPSAiQ29udGVudC1TY3JpcHQtVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFEID0gIkhFQUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTCA9ICJIVE1MIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfRVFVSVYgPSAiSFRUUC1FUVVJViI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBID0gIk1FVEEiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgY2xvc2luZyBwcm9wb3NhbCBnaXZlbiB0aGUKLQkgKiBjb250ZW50cyAoSW5kZXhlZFJlZ2lvbikgb2YgYSB0YWcgdGhhdCBpcyBzdGFydGVkLCBidXQgcG9zc2libHkgbm90Ci0JICogZW5kZWQKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdGV4dCB2aWV3ZXIKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgdmlld2VyCi0JICogQHBhcmFtIGluZGV4ZWROb2RlCi0JICogICAgICAgICAgICB0aGUgY29udGVudHMgb2YgdGhlIHRhZyB0aGF0IGlzIHN0YXJ0ZWQgYnV0IHBvc3NpYmx5IG5vdAotCSAqICAgICAgICAgICAgZW5kZWQKLQkgKiBAcGFyYW0gcGFyZW50VGFnTmFtZQotCSAqICAgICAgICAgICAgdGhlIHRhZyBvbiB3aGljaCB5b3UgYXJlIGNoZWNraW4gZm9yIGFuIGVuZGluZyB0YWcKLQkgKiBAcGFyYW0gaW1hZ2VQYXRoCi0JICogICAgICAgICAgICBjb250ZW50IGFzc2lzdCBpbWFnZSByZWxhdGl2ZSBwYXRoCi0JICogQHJldHVybiBJQ29tcGxldGlvblByb3Bvc2FsCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29tcGxldGlvblByb3Bvc2FsIGNvbXB1dGVKU1BFbmRUYWdQcm9wb3NhbChJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uLCBJbmRleGVkUmVnaW9uIGluZGV4ZWROb2RlLCBTdHJpbmcgcGFyZW50VGFnTmFtZSwgU3RyaW5nIGltYWdlUGF0aCkgewotCQlJQ29tcGxldGlvblByb3Bvc2FsIHAgPSBudWxsOwotCi0JCS8vIGNoZWNrIGlmIHRhZyBpcyBjbG9zZWQKLQkJYm9vbGVhbiBoYXNFbmRUYWcgPSB0cnVlOwotCQlib29sZWFuIGlzSlNQVGFnID0gZmFsc2U7Ci0JCUlET01Ob2RlIHhub2RlID0gbnVsbDsKLQkJU3RyaW5nIHRhZ05hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5kZXhlZE5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJeG5vZGUgPSAoKElET01Ob2RlKSBpbmRleGVkTm9kZSk7Ci0JCQkvLyBpdCdzIGVuZGVkIGFscmVhZHkuLi4KLQkJCWlmICh4bm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlJRE9NTm9kZSBvcGVuTm9kZSA9IG51bGw7Ci0JCQlpZiAoIXhub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShwYXJlbnRUYWdOYW1lKSkgewotCQkJCW9wZW5Ob2RlID0gKElET01Ob2RlKSB4bm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCQlpZiAob3Blbk5vZGUgIT0gbnVsbCkgewotCQkJCWlmIChvcGVuTm9kZSBpbnN0YW5jZW9mIElET01FbGVtZW50KSB7Ci0JCQkJCWlzSlNQVGFnID0gKChJRE9NRWxlbWVudCkgb3Blbk5vZGUpLmlzSlNQVGFnKCk7Ci0JCQkJfQotCQkJCXRhZ05hbWUgPSBvcGVuTm9kZS5nZXROb2RlTmFtZSgpOwotCQkJCWhhc0VuZFRhZyA9IChvcGVuTm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKTsKLQkJCX0KLQkJfQotCi0JCS8vIGl0J3MgY2xvc2VkLCBkb24ndCBhZGQgY2xvc2UgdGFnIHByb3Bvc2FsCi0JCWlmICghaGFzRW5kVGFnICYmICFpc0pTUFRhZykgewotCi0JCQkvLyBjcmVhdGUgYXBwcm9wcmlhdGUgY2xvc2UgdGFnIHRleHQKLQkJCVN0cmluZyBwcm9wb3NlZFRleHQgPSAiPC8iICsgdGFnTmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHZpZXdlclRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldFRleHQoKTsKLQkJCWlmICgodmlld2VyVGV4dC5sZW5ndGgoKSA+PSBkb2N1bWVudFBvc2l0aW9uKSAmJiAodmlld2VyVGV4dC5sZW5ndGgoKSA+PSAyKSAmJiAoZG9jdW1lbnRQb3NpdGlvbiA+PSAyKSkgewotCQkJCVN0cmluZyBsYXN0MmNoYXJzID0gdmlld2VyVGV4dC5zdWJzdHJpbmcoZG9jdW1lbnRQb3NpdGlvbiAtIDIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCWlmIChsYXN0MmNoYXJzLmVuZHNXaXRoKCI8LyIpKSB7Ci0JCQkJCXByb3Bvc2VkVGV4dCA9IHRhZ05hbWU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGxhc3QyY2hhcnMuZW5kc1dpdGgoIjwiKSkgewotCQkJCQlwcm9wb3NlZFRleHQgPSAiLyIgKyB0YWdOYW1lOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCQkvLyBjcmVhdGUgcHJvcG9zYWwKLQkJCXAgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2VkVGV4dCArICI+IiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZG9jdW1lbnRQb3NpdGlvbiwgMCwgcHJvcG9zZWRUZXh0Lmxlbmd0aCgpICsgMSwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShpbWFnZVBhdGgpLCBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkVuZF93aXRoXywgKG5ldyBPYmplY3RbXXtwcm9wb3NlZFRleHR9KSksIG51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0VORF9UQUcpOwotCQl9Ci0JCWVsc2UgaWYgKCFoYXNFbmRUYWcgJiYgaXNKU1BUYWcpIHsKLQotCQkJLy8gY3JlYXRlIGFwcHJvcHJpYXRlIGNsb3NlIHRhZyB0ZXh0Ci0JCQlTdHJpbmcgcHJvcG9zZWRUZXh0ID0gIiUiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdmlld2VyVGV4dCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuZ2V0VGV4dCgpOwotCi0JCQkvLyBUT0RPIChwYSkgbWFrZSBpdCBzbWFydGVyIHRvIGFkZCAiJT4iIG9yIGp1c3QgIj4iIGlmICUgaXMKLQkJCS8vIGFscmVhZHkgdGhlcmUuLi4KLQkJCWlmICgodmlld2VyVGV4dC5sZW5ndGgoKSA+PSBkb2N1bWVudFBvc2l0aW9uKSAmJiAodmlld2VyVGV4dC5sZW5ndGgoKSA+PSAyKSkgewotCQkJCVN0cmluZyBsYXN0MmNoYXJzID0gdmlld2VyVGV4dC5zdWJzdHJpbmcoZG9jdW1lbnRQb3NpdGlvbiAtIDIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCVN0cmluZyBsYXN0Y2hhciA9IHZpZXdlclRleHQuc3Vic3RyaW5nKGRvY3VtZW50UG9zaXRpb24gLSAxLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQlpZiAobGFzdGNoYXIuZXF1YWxzKCIlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCWlmIChsYXN0MmNoYXJzLmVuZHNXaXRoKCI8JSIpKSB7Ci0JCQkJCQlwcm9wb3NlZFRleHQgPSAiJSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXByb3Bvc2VkVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGNyZWF0ZSBwcm9wb3NhbAotCQkJcCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0ICsgIj4iLCAvLyROT04tTkxTLTEkCi0JCQkJCQlkb2N1bWVudFBvc2l0aW9uLCAwLCBwcm9wb3NlZFRleHQubGVuZ3RoKCkgKyAxLCBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKGltYWdlUGF0aCksIE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuRW5kX3dpdGhfLCAobmV3IE9iamVjdFtde3Byb3Bvc2VkVGV4dH0pKSwgbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfRU5EX1RBRyk7Ci0JCX0KLQotCQlyZXR1cm4gcDsKLQl9Ci0KLQotCS8qKgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBnZXR0aW5nIHRoZSBjbG9zaW5nIHByb3Bvc2FsIGdpdmVuIHRoZQotCSAqIGNvbnRlbnRzIChJbmRleGVkUmVnaW9uKSBvZiBhIHRhZyB0aGF0IGlzIHN0YXJ0ZWQsIGJ1dCBwb3NzaWJseSBub3QKLQkgKiBlbmRlZAotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHZpZXdlcgotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSB2aWV3ZXIKLQkgKiBAcGFyYW0gaW5kZXhlZE5vZGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50cyBvZiB0aGUgdGFnIHRoYXQgaXMgc3RhcnRlZCBidXQgcG9zc2libHkgbm90Ci0JICogICAgICAgICAgICBlbmRlZAotCSAqIEBwYXJhbSBwYXJlbnRUYWdOYW1lCi0JICogICAgICAgICAgICB0aGUgdGFnIG9uIHdoaWNoIHlvdSBhcmUgY2hlY2tpbiBmb3IgYW4gZW5kaW5nIHRhZwotCSAqIEBwYXJhbSBpbWFnZVBhdGgKLQkgKiAgICAgICAgICAgIGNvbnRlbnQgYXNzaXN0IHJlbGF0aXZlIGltYWdlIHBhdGgKLQkgKiBAcmV0dXJuIElDb21wbGV0aW9uUHJvcG9zYWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDb21wbGV0aW9uUHJvcG9zYWwgY29tcHV0ZVhNTEVuZFRhZ1Byb3Bvc2FsKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24sIEluZGV4ZWRSZWdpb24gaW5kZXhlZE5vZGUsIFN0cmluZyBwYXJlbnRUYWdOYW1lLCBTdHJpbmcgaW1hZ2VQYXRoKSB7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWwgcCA9IG51bGw7Ci0KLQkJLy8gY2hlY2sgaWYgdGFnIGlzIGNsb3NlZAotCQlib29sZWFuIGhhc0VuZFRhZyA9IHRydWU7Ci0JCUlET01Ob2RlIHhub2RlID0gbnVsbDsKLQkJU3RyaW5nIHRhZ05hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5kZXhlZE5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJeG5vZGUgPSAoKElET01Ob2RlKSBpbmRleGVkTm9kZSk7Ci0JCQkvLyBpdCdzIGVuZGVkIGFscmVhZHkuLi4KLQkJCWlmICh4bm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlJRE9NTm9kZSBzdHlsZU5vZGUgPSBudWxsOwotCQkJaWYgKCF4bm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UocGFyZW50VGFnTmFtZSkpIHsKLQkJCQlzdHlsZU5vZGUgPSAoSURPTU5vZGUpIHhub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCWlmIChzdHlsZU5vZGUgIT0gbnVsbCkgewotCQkJCXRhZ05hbWUgPSBzdHlsZU5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCQloYXNFbmRUYWcgPSAoc3R5bGVOb2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpOwotCQkJfQotCQl9Ci0KLQkJLy8gaXQncyBjbG9zZWQsIGRvbid0IGFkZCBjbG9zZSB0YWcgcHJvcG9zYWwKLQkJaWYgKCFoYXNFbmRUYWcpIHsKLQotCQkJLy8gY3JlYXRlIGFwcHJvcHJpYXRlIGNsb3NlIHRhZyB0ZXh0Ci0JCQlTdHJpbmcgcHJvcG9zZWRUZXh0ID0gIjwvIiArIHRhZ05hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyB2aWV3ZXJUZXh0ID0gdmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXRUZXh0KCk7Ci0JCQlpZiAoKHZpZXdlclRleHQubGVuZ3RoKCkgPj0gZG9jdW1lbnRQb3NpdGlvbikgJiYgKHZpZXdlclRleHQubGVuZ3RoKCkgPj0gMikgJiYgKGRvY3VtZW50UG9zaXRpb24gPj0gMikpIHsKLQkJCQlTdHJpbmcgbGFzdDJjaGFycyA9IHZpZXdlclRleHQuc3Vic3RyaW5nKGRvY3VtZW50UG9zaXRpb24gLSAyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQlpZiAobGFzdDJjaGFycy5lbmRzV2l0aCgiPC8iKSkgewotCQkJCQlwcm9wb3NlZFRleHQgPSB0YWdOYW1lOwotCQkJCX0KLQkJCQllbHNlIGlmIChsYXN0MmNoYXJzLmVuZHNXaXRoKCI8IikpIHsKLQkJCQkJcHJvcG9zZWRUZXh0ID0gIi8iICsgdGFnTmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQkJLy8gY3JlYXRlIHByb3Bvc2FsCi0JCQlwID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQgKyAiPiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWRvY3VtZW50UG9zaXRpb24sIDAsIHByb3Bvc2VkVGV4dC5sZW5ndGgoKSArIDEsIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoaW1hZ2VQYXRoKSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5FbmRfd2l0aF8sIChuZXcgT2JqZWN0W117cHJvcG9zZWRUZXh0fSkpLCBudWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9FTkRfVEFHKTsKLQkJfQotCQlyZXR1cm4gcDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TWV0YVNjcmlwdFR5cGUoRG9jdW1lbnQgZG9jKSB7Ci0JCS8vIENhbiBub3QganVzdCBkbyBhIERvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFN0cmluZykgYXMgdGhpcwotCQkvLyBuZWVkcwotCQkvLyB0byBiZSByZWxhdGl2ZWx5IGZhc3QuCi0JCUxpc3QgbWV0YXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIGNoZWNrIGZvciBNRVRBIHRhZ3MgdW5kZXIgdGhlIERvY3VtZW50Ci0JCU5vZGUgaHRtbCA9IG51bGw7Ci0JCU5vZGUgaGVhZCA9IG51bGw7Ci0JCU5vZGUgY2hpbGQgPSBudWxsOwotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vIChwYSkgMjAwMjEyMTcKLQkJLy8gY212YyBkZWZlY3QgMjM1NTU0Ci0JCS8vIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50OiB1c2luZyBjaGlsZC5nZXROZXh0U2libGluZygpIHJhdGhlciB0aGFuCi0JCS8vIG5vZGVMaXN0KGl0ZW0pIGZvciBPKG4pIHZzLiBPKG4qbikKLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JCWZvciAoY2hpbGQgPSBkb2MuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKE1FVEEpKSB7Ci0JCQkJbWV0YXMuYWRkKGNoaWxkKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShIVE1MKSkgewotCQkJCWh0bWwgPSBjaGlsZDsKLQkJCX0KLQkJfQotCQkvLyBOb2RlTGlzdCBjaGlsZHJlbiA9IGRvYy5nZXRDaGlsZE5vZGVzKCk7Ci0JCS8vIGZvcihpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCS8vIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJLy8gaWYoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJLy8gY29udGludWU7Ci0JCS8vIGlmKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShNRVRBKSkKLQkJLy8gbWV0YXMuYWRkKGNoaWxkKTsKLQkJLy8gZWxzZSBpZihjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoSFRNTCkpCi0JCS8vIGh0bWwgPSBjaGlsZDsKLQkJLy8gfQotCi0JCS8vIGNoZWNrIGZvciBNRVRBIHRhZ3MgdW5kZXIgSEVBRAotCQlpZiAoaHRtbCAhPSBudWxsKSB7Ci0JCQlmb3IgKGNoaWxkID0gaHRtbC5nZXRGaXJzdENoaWxkKCk7IChjaGlsZCAhPSBudWxsKSAmJiAoaGVhZCA9PSBudWxsKTsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoSEVBRCkpIHsKLQkJCQkJaGVhZCA9IGNoaWxkOwotCQkJCX0KLQkJCX0KLQkJCS8vIGNoaWxkcmVuID0gaHRtbC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkvLyBmb3IoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCkgJiYgaGVhZCA9PSBudWxsOyBpKyspIHsKLQkJCS8vIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCS8vIGlmKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkvLyBjb250aW51ZTsKLQkJCS8vIGlmKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShIRUFEKSkKLQkJCS8vIGhlYWQgPSBjaGlsZDsKLQkJCS8vIH0KLQkJfQotCi0JCWlmIChoZWFkICE9IG51bGwpIHsKLQkJCWZvciAoaGVhZC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKE1FVEEpKSB7Ci0JCQkJCW1ldGFzLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQkJLy8gY2hpbGRyZW4gPSBoZWFkLmdldENoaWxkTm9kZXMoKTsKLQkJCS8vIGZvcihpbnQgaSA9IDAgOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJLy8gY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJLy8gaWYoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCS8vIGNvbnRpbnVlOwotCQkJLy8gaWYoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKE1FVEEpKQotCQkJLy8gbWV0YXMuYWRkKGNoaWxkKTsKLQkJCS8vIH0KLQkJfQotCi0JCXJldHVybiBnZXRNZXRhU2NyaXB0VHlwZShtZXRhcyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE1ldGFTY3JpcHRUeXBlKExpc3QgbWV0YU5vZGVMaXN0KSB7Ci0JCU5vZGUgbWV0YSA9IG51bGw7Ci0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbnVsbDsKLQkJYm9vbGVhbiBodHRwRXF1aXYgPSBmYWxzZTsKLQkJU3RyaW5nIGNvbnRlbnRTY3JpcHRUeXBlID0gbnVsbDsKLQotCQlmb3IgKGludCBpID0gbWV0YU5vZGVMaXN0LnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQltZXRhID0gKE5vZGUpIG1ldGFOb2RlTGlzdC5nZXQoaSk7Ci0JCQlhdHRyaWJ1dGVzID0gbWV0YS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlodHRwRXF1aXYgPSBmYWxzZTsKLQkJCWNvbnRlbnRTY3JpcHRUeXBlID0gbnVsbDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJaWYgKGF0dHJpYnV0ZXMuaXRlbShqKS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoSFRUUF9FUVVJVikpIHsKLQkJCQkJaHR0cEVxdWl2ID0gYXR0cmlidXRlcy5pdGVtKGopLmdldE5vZGVWYWx1ZSgpLmVxdWFsc0lnbm9yZUNhc2UoQ09OVEVOVF9TQ1JJUFRfVFlQRSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGF0dHJpYnV0ZXMuaXRlbShqKS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoQ09OVEVOVCkpIHsKLQkJCQkJY29udGVudFNjcmlwdFR5cGUgPSBhdHRyaWJ1dGVzLml0ZW0oaikuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGh0dHBFcXVpdiAmJiAoY29udGVudFNjcmlwdFR5cGUgIT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gY29udGVudFNjcmlwdFR5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIHRoZSBzY3JpcHROb2RlIGlzIGluIEN1cnJlbnRseSByZXR1cm5zCi0JICogamF2YXNjcmlwdCB1bmxlc3Mgc29tZSB1bmtub3duIHR5cGUgb3IgbGFuZ3VhZ2UgaXMgc3BlY2lmaWVkLiBUaGVuIHRoZQotCSAqIHVua25vd24gdHlwZS9sYW5ndWFnZSBpcyByZXR1cm5lZAotCSAqIAotCSAqIEBwYXJhbSBzY3JpcHROb2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2NyaXB0TGFuZ3VhZ2UoTm9kZSBzY3JpcHROb2RlKSB7Ci0JCU5vZGUgYXR0ciA9IG51bGw7Ci0KLQkJYm9vbGVhbiBzcGVjaWZpZWQgPSBmYWxzZTsKLQkJLy8gdHJ5IHRvIGZpbmQgYSBzY3JpcHRpbmcgYWRhcHRlciBmb3IgJ3R5cGUnCi0JCWlmICgoc2NyaXB0Tm9kZSA9PSBudWxsKSB8fCAoc2NyaXB0Tm9kZS5nZXRBdHRyaWJ1dGVzKCkgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJYXR0ciA9IHNjcmlwdE5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbSgidHlwZSIpOy8vJE5PTi1OTFMtMSQKLQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJc3BlY2lmaWVkID0gdHJ1ZTsKLQkJCVN0cmluZyB0eXBlID0gYXR0ci5nZXROb2RlVmFsdWUoKTsKLQkJCXJldHVybiBsb29rdXBTY3JpcHRUeXBlKHR5cGUpOwotCQl9Ci0JCS8vIG5vdyB0cnkgdG8gZmluZCBhIHNjcmlwdGluZyBhZGFwdGVyIGZvciAnbGFuZ3VhZ2UnIChkZXByZWNhdGVkIGJ5Ci0JCS8vIEhUTUwgc3BlY2lmaWNhdGlvbnMpCi0JCWF0dHIgPSBzY3JpcHROb2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oImxhbmd1YWdlIik7Ly8kTk9OLU5MUy0xJAotCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQlzcGVjaWZpZWQgPSB0cnVlOwotCQkJU3RyaW5nIGxhbmd1YWdlID0gYXR0ci5nZXROb2RlVmFsdWUoKTsKLQkJCXJldHVybiBsb29rdXBTY3JpcHRMYW5ndWFnZShsYW5ndWFnZSk7Ci0JCX0KLQkJLy8gY2hlY2sgaWYgb25lIGlzIHNwZWNpZmllZCBieSBhIE1FVEEgdGFnIGF0IHRoZSByb290IGxldmVsIG9yIGluc2lkZQotCQkvLyBvZiBIRUFECi0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQkJaWYgKCFzcGVjaWZpZWQpIHsKLQkJCXR5cGUgPSBnZXRNZXRhU2NyaXB0VHlwZShzY3JpcHROb2RlLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCX0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJc3BlY2lmaWVkID0gdHJ1ZTsKLQkJCXJldHVybiBsb29rdXBTY3JpcHRUeXBlKHR5cGUpOwotCQl9Ci0JCS8vIHJldHVybiBkZWZhdWx0Ci0JCWlmICghc3BlY2lmaWVkKSB7Ci0JCQlyZXR1cm4gU2NyaXB0TGFuZ3VhZ2VLZXlzLkpBVkFTQ1JJUFQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGVsbHMgeW91IGlmIHRoZSBmbGF0bm9kZSBpcyB0aGUgJT4gZGVsaW1pdGVyCi0JICogCi0JICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotCSAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uCi0JICogIm5lc3RlZENvbnRleHQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0pTUENsb3NlRGVsaW1pdGVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm4pIHsKLQkJaWYgKGZuID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gaXNKU1BDbG9zZURlbGltaXRlcihmbi5nZXRUeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKU1BDbG9zZURlbGltaXRlcihTdHJpbmcgdHlwZSkgewotCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuICh0eXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9DTE9TRSkgfHwgdHlwZS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSk7Ci0JfQotCi0JLyoqCi0JICogVGVsbHMgeW91IGlmIHRoZSBmbGF0bm9kZSBpcyB0aGUgSlNQIHJlZ2lvbiA8JSU+LCA8JT0lPiwgPCUhJT4KLQkgKiAKLQkgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0JICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24KLQkgKiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSlNQRGVsaW1pdGVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm4pIHsKLQkJYm9vbGVhbiBpc0RlbGltaXRlciA9IGZhbHNlOwotCQlTdHJpbmcgdHlwZSA9IGZuLmdldFR5cGUoKTsKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJaXNEZWxpbWl0ZXIgPSBpc0pTUERlbGltaXRlcih0eXBlKTsKLQkJfQotCQlyZXR1cm4gaXNEZWxpbWl0ZXI7Ci0JfQotCi0JLyoqCi0JICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotCSAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uCi0JICogIm5lc3RlZENvbnRleHQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0pTUERlbGltaXRlcihTdHJpbmcgdHlwZSkgewotCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIChpc0pTUE9wZW5EZWxpbWl0ZXIodHlwZSkgfHwgaXNKU1BDbG9zZURlbGltaXRlcih0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogVGVsbHMgeW91IGlmIHRoZSBmbGF0bm9kZSBpcyA8JSwgPCU9LCBvciA8JSEgSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YKLQkgKiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzIHdheSBmb3IgZXhwZWRlbmN5LgotCSAqIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24gIm5lc3RlZENvbnRleHQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0pTUE9wZW5EZWxpbWl0ZXIoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbikgewotCQlpZiAoZm4gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBpc0pTUE9wZW5EZWxpbWl0ZXIoZm4uZ2V0VHlwZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0JICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24KLQkgKiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSlNQT3BlbkRlbGltaXRlcihTdHJpbmcgdHlwZSkgewotCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuICh0eXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9TQ1JJUFRMRVRfT1BFTikgfHwgdHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfREVDTEFSQVRJT05fT1BFTikgfHwgdHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfRVhQUkVTU0lPTl9PUEVOKSk7Ci0JfQotCi0JLyoqCi0JICogVGVsbHMgeW91IGlmIHRoZSBmbGF0bm9kZSBpcyB0aGUgPGpzcDpzY3JpcHRsZXQ+LCA8anNwOmV4cHJlc3Npb24+LCBvcgotCSAqIDxqc3A6ZGVjbGFyYXRpb24+dGFnCi0JICogCi0JICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotCSAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uCi0JICogIm5lc3RlZENvbnRleHQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1hNTEpTUERlbGltaXRlcihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZuKSB7Ci0JCWJvb2xlYW4gaXNEZWxpbWl0ZXIgPSBmYWxzZTsKLQkJaWYgKChmbiAhPSBudWxsKSAmJiAoZm4gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCU9iamVjdFtdIHJlZ2lvbnMgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBmbikuZ2V0UmVnaW9ucygpLnRvQXJyYXkoKTsKLQkJCUlUZXh0UmVnaW9uIHRlbXAgPSBudWxsOwotCQkJU3RyaW5nIHJlZ2lvblRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdGVtcCA9IChJVGV4dFJlZ2lvbikgcmVnaW9uc1tpXTsKLQkJCQlpZiAodGVtcC5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQkJcmVnaW9uVGV4dCA9IGZuLmdldFRleHQodGVtcCk7Ci0JCQkJCWlmIChyZWdpb25UZXh0LmVxdWFsc0lnbm9yZUNhc2UoImpzcDpzY3JpcHRsZXQiKSB8fCByZWdpb25UZXh0LmVxdWFsc0lnbm9yZUNhc2UoImpzcDpleHByZXNzaW9uIikgfHwgcmVnaW9uVGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZGVjbGFyYXRpb24iKSkgewotCQkJCQkJaXNEZWxpbWl0ZXIgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpc0RlbGltaXRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zICJqYXZhc2NyaXB0IiBpZiBsYW5ndWFnZSBhdHRyaWJ1dGUgaXMgc29tZSBmb3JtIG9mIGphdmFzY3JpcHQsCi0JICogImphdmEiIGlmIGxhbmd1YWdlIGF0dHJpYnV0ZSBpcyBzb21lIGZvcm0gb2YgamF2YS4gT3RoZXJ3aXNlLCBqdXN0Ci0JICogcmV0dXJucyB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBsYW5ndWFnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvb2t1cFNjcmlwdExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBU0NSSVBUX0xBTkdVQUdFX0tFWVMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChTY3JpcHRMYW5ndWFnZUtleXMuSkFWQVNDUklQVF9MQU5HVUFHRV9LRVlTW2ldLmVxdWFsc0lnbm9yZUNhc2UobGFuZ3VhZ2UpKSB7Ci0JCQkJcmV0dXJuIFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBU0NSSVBUOwotCQkJfQotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgU2NyaXB0TGFuZ3VhZ2VLZXlzLkpBVkFfTEFOR1VBR0VfS0VZUy5sZW5ndGg7IGkrKykgewotCQkJaWYgKFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBX0xBTkdVQUdFX0tFWVNbaV0uZXF1YWxzSWdub3JlQ2FzZShsYW5ndWFnZSkpIHsKLQkJCQlyZXR1cm4gU2NyaXB0TGFuZ3VhZ2VLZXlzLkpBVkE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxhbmd1YWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgImphdmFzY3JpcHQiIGlmIHR5cGUgKHVzZWQgaW4gPHNjcmlwdCB0eXBlPSJ4eHgiPiBpcyBhY3R1YWxseQotCSAqIGphdmFzY3JpcHQgdHlwZS4gT3RoZXJ3aXNlLCBqdXN0IHJldHVybnMgdHlwZQotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9va3VwU2NyaXB0VHlwZShTdHJpbmcgdHlwZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBU0NSSVBUX01JTUVfVFlQRV9LRVlTLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoU2NyaXB0TGFuZ3VhZ2VLZXlzLkpBVkFTQ1JJUFRfTUlNRV9UWVBFX0tFWVNbaV0uZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgewotCQkJCXJldHVybiBTY3JpcHRMYW5ndWFnZUtleXMuSkFWQVNDUklQVDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hNTENvbnRlbnRNb2RlbEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODk2NDMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hNTENvbnRlbnRNb2RlbEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0Q29udGVudE1vZGVsR2VuZXJhdG9yIHsKLQotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9PUEVOID0gIkpTUF9ESVJFQ1RJVkVfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBYTUxDb250ZW50TW9kZWxHZW5lcmF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGdlbmVyYXRlQXR0cmlidXRlKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJaWYgKChhdHRyRGVjbCA9PSBudWxsKSB8fCAoYnVmZmVyID09IG51bGwpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IHVzYWdlID0gYXR0ckRlY2wuZ2V0VXNhZ2UoKTsKLQkJaWYgKHVzYWdlID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJZ2VuZXJhdGVSZXF1aXJlZEF0dHJpYnV0ZShudWxsLCBhdHRyRGVjbCwgYnVmZmVyKTsgLy8gdG9kbyBwYXNzCi0JCQkvLyBvd25lck5vZGUgYXMKLQkJCS8vIDFzdCBwYXJhbQotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUVuZFRhZyhTdHJpbmcgdGFnTmFtZSwgTm9kZSBwYXJlbnROb2RlLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlpZiAoZWxlbWVudERlY2wgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChlbGVtZW50RGVjbC5nZXRDb250ZW50VHlwZSgpICE9IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCI8LyIgKyB0YWdOYW1lICsgIj4iKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZVJlcXVpcmVkQXR0cmlidXRlKE5vZGUgb3duZXJOb2RlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCWlmICgoYXR0ckRlY2wgPT0gbnVsbCkgfHwgKGJ1ZmZlciA9PSBudWxsKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gYXR0cmlidXRlIG5hbWUKLQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBnZXRSZXF1aXJlZE5hbWUob3duZXJOb2RlLCBhdHRyRGVjbCk7Ci0JCUNNRGF0YVR5cGUgYXR0clR5cGUgPSBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpOwotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gbnVsbDsKLQkJLy8gPSBzaWduCi0JCWJ1ZmZlci5hcHBlbmQoYXR0cmlidXRlTmFtZSArICI9Iik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gYXR0cmlidXRlIHZhbHVlCi0JCWlmIChhdHRyVHlwZSAhPSBudWxsKSB7Ci0JCQkvLyBpbnNlcnQgYW55IHZhbHVlIHRoYXQgaXMgaW1wbGllZAotCQkJaWYgKChhdHRyVHlwZS5nZXRJbXBsaWVkVmFsdWVLaW5kKCkgIT0gQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX05PTkUpICYmIChhdHRyVHlwZS5nZXRJbXBsaWVkVmFsdWUoKSAhPSBudWxsKSkgewotCQkJCWRlZmF1bHRWYWx1ZSA9IGF0dHJUeXBlLmdldEltcGxpZWRWYWx1ZSgpOwotCQkJfQotCQkJLy8gb3RoZXJ3aXNlLCBpZiBhbiBlbnVtZXJhdGVkIGxpc3Qgb2YgdmFsdWVzIGV4aXN0cywgdXNlIHRoZQotCQkJLy8gZmlyc3QgdmFsdWUKLQkJCWVsc2UgaWYgKChhdHRyVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCkgIT0gbnVsbCkgJiYgKGF0dHJUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKS5sZW5ndGggPiAwKSkgewotCQkJCWRlZmF1bHRWYWx1ZSA9IGF0dHJUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKVswXTsKLQkJCX0KLQkJfQotCQkKLQkJY2hhciBhdHRyUXVvdGUgPSAnXCInOwotCQkvLyBGb3VuZCBhIGRvdWJsZSBxdW90ZSwgd3JhcCB0aGUgYXR0cmlidXRlIGluIHNpbmdsZSBxdW90ZXMKLQkJaWYoZGVmYXVsdFZhbHVlICE9IG51bGwgJiYgZGVmYXVsdFZhbHVlLmluZGV4T2YoYXR0clF1b3RlKSA+PSAwKSB7Ci0JCQlhdHRyUXVvdGUgPSAnXCcnOwotCQl9Ci0JCQotCQlidWZmZXIuYXBwZW5kKGF0dHJRdW90ZSk7Ci0JCWJ1ZmZlci5hcHBlbmQoKChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgPyBkZWZhdWx0VmFsdWUgOiAiIikpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoYXR0clF1b3RlKTsKLQkJcmV0dXJuOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlU3RhcnRUYWcoU3RyaW5nIHRhZ05hbWUsIE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJaWYgKChlbGVtZW50RGVjbCA9PSBudWxsKSB8fCAoYnVmZmVyID09IG51bGwpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiPCIgKyB0YWdOYW1lKTsvLyROT04tTkxTLTEkCi0JCWdlbmVyYXRlQXR0cmlidXRlcyhlbGVtZW50RGVjbCwgYnVmZmVyKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRTdGFydFRhZ0Nsb3NlKHBhcmVudE5vZGUsIGVsZW1lbnREZWNsKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE1pbmltYWxTdGFydFRhZ0xlbmd0aChOb2RlIG5vZGUsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsKSB7Ci0JCWlmIChlbGVtZW50RGVjbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAocmVxdWlyZXNBdHRyaWJ1dGVzKGVsZW1lbnREZWNsKSkgewotCQkJcmV0dXJuIGdldFJlcXVpcmVkTmFtZShub2RlLCBlbGVtZW50RGVjbCkubGVuZ3RoKCkgKyAyOyAvLyA8ICsKLQkJCS8vIG5hbWUgKwotCQkJLy8gc3BhY2UKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAxICsgZ2V0UmVxdWlyZWROYW1lKG5vZGUsIGVsZW1lbnREZWNsKS5sZW5ndGgoKSArIGdldFN0YXJ0VGFnQ2xvc2Uobm9kZSwgZWxlbWVudERlY2wpLmxlbmd0aCgpOyAvLyA8ICsKLQkJCS8vIG5hbWUKLQkJCS8vICsKLQkJCS8vIGFwcHJvcHJpYXRlCi0JCQkvLyBjbG9zZQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRPdGhlckNsb3NlKE5vZGUgbm90QVRhZ05vZGUpIHsKLQkJaWYgKG5vdEFUYWdOb2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9ICgoSURPTU5vZGUpIG5vdEFUYWdOb2RlKS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE51bWJlck9mUmVnaW9ucygpID4gMSkgJiYgbm9kZS5nZXRSZWdpb25zKCkuZ2V0KDApLmdldFR5cGUoKS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfRElSRUNUSVZFX09QRU4pKSB7Ci0JCQkJcmV0dXJuICIlPiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXJ0VGFnQ2xvc2UoTm9kZSBwYXJlbnROb2RlLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCkgewotCQlTdHJpbmcgb3RoZXIgPSBnZXRPdGhlckNsb3NlKHBhcmVudE5vZGUpOwotCQlpZiAob3RoZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIG90aGVyOwotCQl9Ci0JCWlmIChlbGVtZW50RGVjbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIj4iOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkgewotCQkJcmV0dXJuICIvPiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gIj4iOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MUmVsZXZhbmNlQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxSZWxldmFuY2VDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE5OTA3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxSZWxldmFuY2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSVJlbGV2YW5jZUNvbnN0YW50czsKLQotCi0KLS8qKgotICogc29tZSByZWxldmFuY2UgY29uc3RhbnRzIGZvciBjb250ZW50IGFzc2lzdCBoaWdoZXIgcmVsZXZhbmNlIG1lYW5zIGl0IHNob3dzCi0gKiB1cCBoaWdoZXIgb24gdGhlIGxpc3QKLSAqLwotcHVibGljIGludGVyZmFjZSBYTUxSZWxldmFuY2VDb25zdGFudHMgZXh0ZW5kcyBJUmVsZXZhbmNlQ29uc3RhbnRzIHsKLQotCWludCBSX0NEQVRBID0gNDAwOwotCWludCBSX0NMT1NFX1RBRyA9IDE1MDA7Ci0KLQlpbnQgUl9DT01NRU5UID0gMTAwOwotCi0JLy8gbW92ZWQgdGhpcyBhYm92ZSBtYWNyb3MKLQlpbnQgUl9ET0NUWVBFID0gNjAwOwotCWludCBSX0VORF9UQUcgPSAxNDAwOwotCWludCBSX0VORF9UQUdfTkFNRSA9IDExMDA7Ci0JaW50IFJfRU5USVRZID0gMTAwMDsKLQlpbnQgUl9KU1AgPSA1MDA7Ci0KLQlpbnQgUl9KU1BfQVRUUklCVVRFX1ZBTFVFID0gNzAwOwotCi0JLy8gKHBhKSBtYWtlIHRoZXNlIHRoZSBzYW1lIHJlbGV2YW5jZSBzbyBwcm9wb3NhbHMgYXJlIHNhbWUgb3JkZXIgZm9yIFY1MDEKLQlpbnQgUl9NQUNSTyA9IDUwMDsKLQotCS8vIGFkZCB0aGlzIG9udG8gInJlcXVpcmVkIiBhdHRycywgZWxlbWVudHMsIGV0YyB0byBidWJibGUgdGhlbSB1cCBvbgotCS8vIHNvcnRpbmcuLi4KLQkvLyBDTVZDIDI0NjYxOAotCWludCBSX1JFUVVJUkVEID0gMTA7Ci0JaW50IFJfVEFHX0lOU0VSVElPTiA9IDUwMDsKLQlpbnQgUl9TVFJJQ1RMWV9WQUxJRF9UQUdfSU5TRVJUSU9OID0gNjAwOwotCWludCBSX1RBR19OQU1FID0gMTIwMDsKLQlpbnQgUl9YTUxfQVRUUklCVVRFX05BTUUgPSA5MDA7Ci0JaW50IFJfWE1MX0FUVFJJQlVURV9WQUxVRSA9IDgwMDsKLQlpbnQgUl9YTUxfREVDTEFSQVRJT04gPSAxMzAwOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlmOWFkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLQotLyoqCi0gKiBDb21wbGV0aW9uIHByb2Nlc3NvciBmb3IgWE1MIFRlbXBsYXRlcy4gTW9zdCBvZiB0aGUgd29yayBpcyBhbHJlYWR5IGRvbmUgYnkKLSAqIHRoZSBYTUwgQ29udGVudCBBc3Npc3QgcHJvY2Vzc29yLCBzbyBieSB0aGUgdGltZSB0aGUKLSAqIFhNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBpcyBhc2tlZCBmb3IgY29udGVudCBhc3Npc3QgcHJvcG9zYWxzLCB0aGUKLSAqIFhNTCBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3IgaGFzIGFscmVhZHkgc2V0IHRoZSBjb250ZXh0IHR5cGUgZm9yCi0gKiB0ZW1wbGF0ZXMuCi0gKi8KLWNsYXNzIFhNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBleHRlbmRzIFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUHJvcG9zYWxDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJcmV0dXJuICgoVGVtcGxhdGVQcm9wb3NhbCkgbzIpLmdldFJlbGV2YW5jZSgpIC0gKChUZW1wbGF0ZVByb3Bvc2FsKSBvMSkuZ2V0UmVsZXZhbmNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIGZnUHJvcG9zYWxDb21wYXJhdG9yID0gbmV3IFByb3Bvc2FsQ29tcGFyYXRvcigpOwotCXByaXZhdGUgU3RyaW5nIGZDb250ZXh0VHlwZUlkID0gbnVsbDsKLQotCS8qCi0JICogQ29waWVkIGZyb20gc3VwZXIgY2xhc3MgZXhjZXB0IGluc3RlYWQgb2YgY2FsbGluZyBjcmVhdGVDb250ZXh0KHZpZXdlciwKLQkgKiByZWdpb24pIGNhbGwgY3JlYXRlQ29udGV4dCh2aWV3ZXIsIHJlZ2lvbiwgb2Zmc2V0KSBpbnN0ZWFkCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQotCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCi0JCS8vIGFkanVzdCBvZmZzZXQgdG8gZW5kIG9mIG5vcm1hbGl6ZWQgc2VsZWN0aW9uCi0JCWlmIChzZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgPT0gb2Zmc2V0KSB7Ci0JCQlvZmZzZXQgPSBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0JCX0KLQotCQlTdHJpbmcgcHJlZml4ID0gZXh0cmFjdFByZWZpeCh2aWV3ZXIsIG9mZnNldCk7Ci0JCVJlZ2lvbiByZWdpb24gPSBuZXcgUmVnaW9uKG9mZnNldCAtIHByZWZpeC5sZW5ndGgoKSwgcHJlZml4Lmxlbmd0aCgpKTsKLQkJVGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBjcmVhdGVDb250ZXh0KHZpZXdlciwgcmVnaW9uLCBvZmZzZXQpOwotCQlpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCX0KLQotCQkvLyBuYW1lIG9mIHRoZSBzZWxlY3Rpb24gdmFyaWFibGVzIHtsaW5lLCB3b3JkfV9zZWxlY3Rpb24KLQkJY29udGV4dC5zZXRWYXJpYWJsZSgic2VsZWN0aW9uIiwgc2VsZWN0aW9uLmdldFRleHQoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlUZW1wbGF0ZVtdIHRlbXBsYXRlcyA9IGdldFRlbXBsYXRlcyhjb250ZXh0LmdldENvbnRleHRUeXBlKCkuZ2V0SWQoKSk7Ci0KLQkJTGlzdCBtYXRjaGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRlbXBsYXRlcy5sZW5ndGg7IGkrKykgewotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSB0ZW1wbGF0ZXNbaV07Ci0JCQl0cnkgewotCQkJCWNvbnRleHQuZ2V0Q29udGV4dFR5cGUoKS52YWxpZGF0ZSh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkpOwotCQkJfQotCQkJY2F0Y2ggKFRlbXBsYXRlRXhjZXB0aW9uIGUpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh0ZW1wbGF0ZS5tYXRjaGVzKHByZWZpeCwgY29udGV4dC5nZXRDb250ZXh0VHlwZSgpLmdldElkKCkpKSB7Ci0JCQkJbWF0Y2hlcy5hZGQoY3JlYXRlUHJvcG9zYWwodGVtcGxhdGUsIGNvbnRleHQsIChJUmVnaW9uKSByZWdpb24sIGdldFJlbGV2YW5jZSh0ZW1wbGF0ZSwgcHJlZml4KSkpOwotCQkJfQotCQl9Ci0KLQkJQ29sbGVjdGlvbnMuc29ydChtYXRjaGVzLCBmZ1Byb3Bvc2FsQ29tcGFyYXRvcik7Ci0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIG1hdGNoZXMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFttYXRjaGVzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb25jcmV0ZSB0ZW1wbGF0ZSBjb250ZXh0IGZvciB0aGUgZ2l2ZW4gcmVnaW9uIGluIHRoZQotCSAqIGRvY3VtZW50LiBUaGlzIGludm9sdmVzIGZpbmRpbmcgb3V0IHdoaWNoIGNvbnRleHQgdHlwZSBpcyB2YWxpZCBhdCB0aGUKLQkgKiBnaXZlbiBsb2NhdGlvbiwgYW5kIHRoZW4gY3JlYXRpbmcgYSBjb250ZXh0IG9mIHRoaXMgdHlwZS4gVGhlIGRlZmF1bHQKLQkgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGEgPGNvZGU+U21hcnRSZXBsYWNlVGVtcGxhdGVDb250ZXh0PC9jb2RlPiBmb3IKLQkgKiB0aGUgY29udGV4dCB0eXBlIGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4gVGhpcyB0YWtlcyB0aGUgb2Zmc2V0IGF0IHdoaWNoCi0JICogY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQgaW50byBjb25zaWRlcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgZm9yIHdoaWNoIHRoZSBjb250ZXh0IGlzIGNyZWF0ZWQKLQkgKiBAcGFyYW0gcmVnaW9uCi0JICogICAgICAgICAgICB0aGUgcmVnaW9uIGludG8gPGNvZGU+ZG9jdW1lbnQ8L2NvZGU+IGZvciB3aGljaCB0aGUKLQkgKiAgICAgICAgICAgIGNvbnRleHQgaXMgY3JlYXRlZAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBvZmZzZXQgd2hlcmUgY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQKLQkgKiBAcmV0dXJuIGEgdGVtcGxhdGUgY29udGV4dCB0aGF0IGNhbiBoYW5kbGUgdGVtcGxhdGUgaW5zZXJ0aW9uIGF0IHRoZQotCSAqICAgICAgICAgZ2l2ZW4gbG9jYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZUNvbnRleHQgY3JlYXRlQ29udGV4dChJVGV4dFZpZXdlciB2aWV3ZXIsIElSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIHByZXR0eSBtdWNoIHNhbWUgY29kZSBhcyBzdXBlci5jcmVhdGVDb250ZXh0IGV4Y2VwdCBjcmVhdGUKLQkJLy8gU21hcnRSZXBsYWNlVGVtcGxhdGVDb250ZXh0Ci0JCVRlbXBsYXRlQ29udGV4dFR5cGUgY29udGV4dFR5cGUgPSBnZXRDb250ZXh0VHlwZSh2aWV3ZXIsIHJlZ2lvbik7Ci0JCWlmIChjb250ZXh0VHlwZSAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCXJldHVybiBuZXcgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCByZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSwgb2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVQcm9wb3NhbChUZW1wbGF0ZSB0ZW1wbGF0ZSwgVGVtcGxhdGVDb250ZXh0IGNvbnRleHQsIElSZWdpb24gcmVnaW9uLCBpbnQgcmVsZXZhbmNlKSB7Ci0JCXJldHVybiBuZXcgQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbCh0ZW1wbGF0ZSwgY29udGV4dCwgcmVnaW9uLCBnZXRJbWFnZSh0ZW1wbGF0ZSksIHJlbGV2YW5jZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRlbXBsYXRlQ29udGV4dFR5cGUgZ2V0Q29udGV4dFR5cGUoSVRleHRWaWV3ZXIgdmlld2VyLCBJUmVnaW9uIHJlZ2lvbikgewotCQlUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUgPSBudWxsOwotCi0JCUNvbnRleHRUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpOwotCQlpZiAocmVnaXN0cnkgIT0gbnVsbCkgewotCQkJdHlwZSA9IHJlZ2lzdHJ5LmdldENvbnRleHRUeXBlKGZDb250ZXh0VHlwZUlkKTsKLQkJfQotCi0JCXJldHVybiB0eXBlOwotCX0KLQotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZShUZW1wbGF0ZSB0ZW1wbGF0ZSkgewotCQkvLyBqdXN0IHJldHVybiB0aGUgc2FtZSBpbWFnZSBmb3Igbm93Ci0JCXJldHVybiBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19NQUNSTyk7Ci0JfQotCi0JcHJpdmF0ZSBDb250ZXh0VHlwZVJlZ2lzdHJ5IGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRlbXBsYXRlW10gZ2V0VGVtcGxhdGVzKFN0cmluZyBjb250ZXh0VHlwZUlkKSB7Ci0JCVRlbXBsYXRlIHRlbXBsYXRlc1tdID0gbnVsbDsKLQotCQlUZW1wbGF0ZVN0b3JlIHN0b3JlID0gZ2V0VGVtcGxhdGVTdG9yZSgpOwotCQlpZiAoc3RvcmUgIT0gbnVsbCkgewotCQkJdGVtcGxhdGVzID0gc3RvcmUuZ2V0VGVtcGxhdGVzKGNvbnRleHRUeXBlSWQpOwotCQl9Ci0KLQkJcmV0dXJuIHRlbXBsYXRlczsKLQl9Ci0KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpIHsKLQkJcmV0dXJuIFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JfQotCi0Jdm9pZCBzZXRDb250ZXh0VHlwZShTdHJpbmcgY29udGV4dFR5cGVJZCkgewotCQlmQ29udGV4dFR5cGVJZCA9IGNvbnRleHRUeXBlSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMWM0NDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLkNNSW1hZ2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEFkYXB0cyBhIERPTSBub2RlIHRvIGEgSkZhY2Ugdmlld2VyLgotICovCi1wdWJsaWMgY2xhc3MgSkZhY2VOb2RlQWRhcHRlciBpbXBsZW1lbnRzIElKRmFjZU5vZGVBZGFwdGVyIHsKLQotCWZpbmFsIHN0YXRpYyBDbGFzcyBBREFQVEVSX0tFWSA9IElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzOwotCi0JLyoqCi0JICogZGVidWcgLm9wdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBnZXREZWJ1Z1ZhbHVlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGdldERlYnVnVmFsdWUoKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2RlYnVnL291dGxpbmUiKTsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIHJlc3VsdCA9ICh2YWx1ZSAhPSBudWxsKSAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSBmQWRhcHRlckZhY3Rvcnk7Ci0JcHJpdmF0ZSBSZWZyZXNoU3RydWN0dXJlSm9iIGZSZWZyZXNoSm9iID0gbnVsbDsKLQotCXB1YmxpYyBKRmFjZU5vZGVBZGFwdGVyKEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZkFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGNyZWF0ZUltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQlpbWFnZSA9IGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9FTEVNRU5UKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6IHsKLQkJCQlpbWFnZSA9IGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRSSUJVVEUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6IHsgLy8gYWN0dWFsbHksIFRFWFQgc2hvdWxkIG5ldmVyIGJlIHNlZW4gaW4KLQkJCQkvLyB0aGUgdHJlZQotCQkJCWltYWdlID0gY3JlYXRlWE1MSW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RYVEVYVCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDogewotCQkJCWltYWdlID0gY3JlYXRlWE1MSW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NEQVRBU0VDVElPTik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIDoKLQkJCWNhc2UgTm9kZS5FTlRJVFlfTk9ERSA6IHsKLQkJCQlpbWFnZSA9IGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9FTlRJVFkpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQlpbWFnZSA9IGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9QUk9DRVNTSU5HSU5TVFJVQ1RJT04pOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQlpbWFnZSA9IGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DT01NRU5UKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOiB7Ci0JCQkJaW1hZ2UgPSBjcmVhdGVYTUxJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRE9DVFlQRSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuTk9UQVRJT05fTk9ERSA6IHsKLQkJCQlpbWFnZSA9IGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9OT1RBVElPTik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkZWZhdWx0IDogewotCQkJCWltYWdlID0gY3JlYXRlWE1MSW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0VMRU1FTlQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgY3JlYXRlWE1MSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpbWFnZVJlc291cmNlTmFtZSkgewotCQlyZXR1cm4gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShpbWFnZVJlc291cmNlTmFtZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQotCQkvLyAocGEpIDIwMDIxMjE3Ci0JCS8vIGNtdmMgZGVmZWN0IDIzNTU1NAotCQkvLyBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudDogdXNpbmcgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSByYXRoZXIgdGhhbgotCQkvLyBub2RlTGlzdChpdGVtKSBmb3IgTyhuKSB2cy4gTyhuKm4pCi0JCS8vCi0JCUFycmF5TGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJCWZvciAoTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQlOb2RlIG4gPSBjaGlsZDsKLQkJCQlpZiAobi5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCXYuYWRkKG4pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdi50b0FycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiB3aXRoIHRoZSBlbGVtZW50cyBiZWxvbmdpbmcgdG8gdGhlIHBhc3NlZAotCSAqIGVsZW1lbnQuIFRoZXNlIGFyZSB0aGUgdG9wIGxldmVsIGl0ZW1zIGluIGEgbGlzdCwgdHJlZSwgdGFibGUsIGV0Yy4uLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgbm9kZSkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4obm9kZSk7Ci0JfQotCi0JLyoqCi0JICogRmV0Y2hlcyB0aGUgbGFiZWwgaW1hZ2Ugc3BlY2lmaWMgdG8gdGhpcyBvYmplY3QgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEltYWdlIGdldExhYmVsSW1hZ2UoT2JqZWN0IG5vZGUpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCWltYWdlID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2UoQ01JbWFnZVV0aWwuZ2V0RGVjbGFyYXRpb24oKE5vZGUpIG5vZGUpKTsKLQkJCWlmICgoaW1hZ2UgPT0gbnVsbCkgJiYgKEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKSAhPSBudWxsKSkgewotCQkJCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKTsKLQkJCQlTdHJpbmcgbm9kZU5hbWUgPSBnZXROb2RlTmFtZShub2RlKTsKLQkJCQlpbWFnZSA9IGltYWdlUmVnaXN0cnkuZ2V0KG5vZGVOYW1lKTsKLQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQlpbWFnZSA9IGNyZWF0ZUltYWdlKG5vZGUpOwotCQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCQkJaW1hZ2VSZWdpc3RyeS5wdXQobm9kZU5hbWUsIGltYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogRmV0Y2hlcyB0aGUgbGFiZWwgdGV4dCBzcGVjaWZpYyB0byB0aGlzIG9iamVjdCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsVGV4dChPYmplY3Qgbm9kZSkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUobm9kZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Tm9kZU5hbWUoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmdCdWZmZXIgbm9kZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQkJbm9kZU5hbWUuYXBwZW5kKG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0KLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpIHsKLQkJCQlub2RlTmFtZS5pbnNlcnQoMCwgIkRPQ1RZUEU6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQl9Ci0JCXJldHVybiBub2RlTmFtZS50b1N0cmluZygpOwotCX0KLQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJCXJldHVybiBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBSZWZyZXNoU3RydWN0dXJlSm9iIGdldFJlZnJlc2hKb2IoKSB7Ci0JCWlmIChmUmVmcmVzaEpvYiA9PSBudWxsKSB7Ci0JCQlmUmVmcmVzaEpvYiA9IG5ldyBSZWZyZXNoU3RydWN0dXJlSm9iKCk7Ci0JCX0KLQkJcmV0dXJuIGZSZWZyZXNoSm9iOwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyAocGEpIDIwMDIxMjE3Ci0JCS8vIGNtdmMgZGVmZWN0IDIzNTU1NCA+IHVzZSBjaGlsZC5nZXROZXh0U2libGluZygpIGluc3RlYWQgb2YKLQkJLy8gbm9kZUxpc3QoaXRlbSkgZm9yIE8obikgdnMuIE8obipuKQotCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQlmb3IgKE5vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0eXBlLmVxdWFscyhBREFQVEVSX0tFWSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGJ5IHRoZSBvYmplY3QgYmVpbmcgYWRhcHRlciAodGhlIG5vdGlmaWVyKSB3aGVuIHNvbWV0aGluZyBoYXMKLQkgKiBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkvLyBmdXR1cmVfVE9ETzogdGhlICd1aWpvYnMnIHVzZWQgaW4gdGhpcyBtZXRob2Qgd2VyZSBhZGRlZCB0byBzb2x2ZQotCQkvLyB0aHJlYWRpbmcgcHJvYmxlbXMgd2hlbiB0aGUgZG9tCi0JCS8vIGlzIHVwZGF0ZWQgaW4gdGhlIGJhY2tncm91bmQgd2hpbGUgdGhlIGVkaXRvciBpcyBvcGVuLiBUaGV5IG1heSBiZQotCQkvLyBhIGJpdCBvdmVya2lsbCBhbmQgbm90IHRoYXQgdXNlZnVsLgotCQkvLyAoVGhhdCBpcywgbWF5IGJlIGJlIHdvcnRoeSBvZiBqb2IgbWFuYWdlciBtYW5hZ2VtZW50KS4gSWYgdGhleSBhcmUKLQkJLy8gZm91bmQgdG8gYmUgaW1wb3J0YW50IGVub3VnaCB0byBsZWF2ZSBpbiwKLQkJLy8gdGhlcmUncyBwcm9iYWJseSBzb21lIG9wdGltaXphdGlvbiB0aGF0IGNhbiBiZSBkb25lLgotCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlDb2xsZWN0aW9uIGxpc3RlbmVycyA9IGZBZGFwdGVyRmFjdG9yeS5nZXRMaXN0ZW5lcnMoKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0KLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgbGlzdGVuZXIgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkwNjM3Ci0JCQkJLy8gaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgTm9kZSAmJiAobGlzdGVuZXIgaW5zdGFuY2VvZgotCQkJCS8vIFN0cnVjdHVyZWRWaWV3ZXIpICYmIChldmVudFR5cGUgPT0KLQkJCQkvLyBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEIHx8IChldmVudFR5cGUgPT0KLQkJCQkvLyBJTm9kZU5vdGlmaWVyLkNIQU5HRSAmJiBjaGFuZ2VkRmVhdHVyZSA9PSBudWxsKSkpIHsKLQkJCQlpZiAoKGxpc3RlbmVyIGluc3RhbmNlb2YgU3RydWN0dXJlZFZpZXdlcikgJiYgKChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCkgfHwgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNPTlRFTlRfQ0hBTkdFRCkgfHwgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNIQU5HRSkpKSB7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJKRmFjZU5vZGVBZGFwdGVyIG5vdGlmaWVkIG9uIGV2ZW50IHR5cGUgPiAiICsgZXZlbnRUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJLy8gcmVmcmVzaCBvbiBzdHJ1Y3R1cmFsIGFuZCAidW5rbm93biIgY2hhbmdlcwotCQkJCQlTdHJ1Y3R1cmVkVmlld2VyIHN0cnVjdHVyZWRWaWV3ZXIgPSAoU3RydWN0dXJlZFZpZXdlcikgbGlzdGVuZXI7Ci0JCQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD01MjMwCi0JCQkJCWlmIChzdHJ1Y3R1cmVkVmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsKSB7Ci0JCQkJCQlnZXRSZWZyZXNoSm9iKCkucmVmcmVzaChzdHJ1Y3R1cmVkVmlld2VyLCAoTm9kZSkgbm90aWZpZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk3N2NhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0KLS8qKgotICogQW4gYWRhcHRlciBmYWN0b3J5IHRvIGNyZWF0ZSBKRmFjZU5vZGVBZGFwdGVycy4gVXNlIHRoaXMgYWRhcHRlciBmYWN0b3J5Ci0gKiB3aXRoIGEgSkZhY2VBZGFwdGVyQ29udGVudFByb3ZpZGVyIHRvIGRpc3BsYXkgRE9NIG5vZGVzIGluIGEgdHJlZS4KLSAqLwotcHVibGljIGNsYXNzIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0JcHVibGljIGNsYXNzIENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXJJbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVUERBVEVfREVMQVkgPSAyMDA7Ci0KLQkJcHVibGljIHZvaWQgY2FjaGVDbGVhcmVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSkgewotCQkJLy8gbm90aGluZyB0byBkbwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2FjaGVVcGRhdGVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSwgZmluYWwgU3RyaW5nIHVyaSwgaW50IG9sZFN0YXR1cywgaW50IG5ld1N0YXR1cywgQ01Eb2N1bWVudCBjbURvY3VtZW50KSB7Ci0JCQlpZiAoKG5ld1N0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0xPQURFRCkgfHwgKG5ld1N0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0VSUk9SKSkgewotCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoQ01Eb2N1bWVudE1hbmFnZXIgY21Eb2N1bWVudE1hbmFnZXIsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCWlmIChjbURvY3VtZW50TWFuYWdlci5nZXRQcm9wZXJ0eUVuYWJsZWQoQ01Eb2N1bWVudE1hbmFnZXIuUFJPUEVSVFlfQVVUT19MT0FEKSkgewotCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcmVmcmVzaFZpZXdlcnMoKSB7Ci0JCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnMoKS50b0FycmF5KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChsaXN0ZW5lcnNbaV0gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVmlld2VyKSB7Ci0JCQkJCWZpbmFsIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIGxpc3RlbmVyc1tpXTsKLQkJCQkJSm9iIHJlZnJlc2ggPSBuZXcgVUlKb2IoWE1MVUlNZXNzYWdlcy5yZWZyZXNob3V0bGluZV8wKSB7Ci0JCQkJCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQkJCUNvbnRyb2wgcmVmcmVzaENvbnRyb2wgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQkJCQkJCWlmICgocmVmcmVzaENvbnRyb2wgIT0gbnVsbCkgJiYgIXJlZnJlc2hDb250cm9sLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJCQl2aWV3ZXIucmVmcmVzaCh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCXJlZnJlc2guc2V0U3lzdGVtKHRydWUpOwotCQkJCQlyZWZyZXNoLnNldFByaW9yaXR5KEpvYi5TSE9SVCk7Ci0JCQkJCXJlZnJlc2guc2NoZWR1bGUoVVBEQVRFX0RFTEFZKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobGlzdGVuZXJzW2ldIGluc3RhbmNlb2YgVmlld2VyKSB7Ci0JCQkJCWZpbmFsIFZpZXdlciB2aWV3ZXIgPSAoVmlld2VyKSBsaXN0ZW5lcnNbaV07Ci0JCQkJCUpvYiByZWZyZXNoID0gbmV3IFVJSm9iKFhNTFVJTWVzc2FnZXMucmVmcmVzaG91dGxpbmVfMCkgewotCQkJCQkJcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJCQlDb250cm9sIHJlZnJlc2hDb250cm9sID0gdmlld2VyLmdldENvbnRyb2woKTsKLQkJCQkJCQlpZiAoKHJlZnJlc2hDb250cm9sICE9IG51bGwpICYmICFyZWZyZXNoQ29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCXJlZnJlc2guc2V0U3lzdGVtKHRydWUpOwotCQkJCQlyZWZyZXNoLnNldFByaW9yaXR5KEpvYi5TSE9SVCk7Ci0JCQkJCXJlZnJlc2guc2NoZWR1bGUoVVBEQVRFX0RFTEFZKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENNRG9jdW1lbnRNYW5hZ2VyIGNtRG9jdW1lbnRNYW5hZ2VyOwotCXByaXZhdGUgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lckltcGwgZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgPSBudWxsOwotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSBTZXQgZkxpc3RlbmVycyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIHNpbmdsZXRvbkFkYXB0ZXI7Ci0KLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXRoaXMoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCX0KLQotCXB1YmxpYyBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRMaXN0ZW5lcihPYmplY3QgbGlzdGVuZXIpIHsKLQkJZkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkoZ2V0QWRhcHRlcktleSgpLCBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgSkZhY2UgYWRhcHRlciBmb3IgdGhlIERPTSBub2RlIHBhc3NlZCBpbgotCSAqLwotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIG5vZGUpIHsKLQkJaWYgKHNpbmdsZXRvbkFkYXB0ZXIgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIHRoZSBKRmFjZU5vZGVBZGFwdGVyCi0JCQlzaW5nbGV0b25BZGFwdGVyID0gbmV3IEpGYWNlTm9kZUFkYXB0ZXIodGhpcyk7Ci0JCQlpbml0QWRhcHRlcihzaW5nbGV0b25BZGFwdGVyLCBub2RlKTsKLQkJfQotCQlyZXR1cm4gc2luZ2xldG9uQWRhcHRlcjsKLQl9Ci0KLQotCS8qKgotCSAqIHJldHVybnMgImNvcHkiIHNvIG5vIG9uZSBjYW4gbW9kaWZ5IG91ciBsaXN0LiBJdCBpcyBhIHNoYWxsb3cgY29weS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIENvbGxlY3Rpb24gZ2V0TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdChmTGlzdGVuZXJzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0QWRhcHRlcihJTm9kZUFkYXB0ZXIgYWRhcHRlciwgSU5vZGVOb3RpZmllciBub2RlKSB7Ci0JCS8vIHJlZ2lzdGVyIGZvciBDTURvY3VtZW50TWFuYWdlciBldmVudHMKLQkJTW9kZWxRdWVyeUFkYXB0ZXIgbXFhZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKSBub2RlLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAobXFhZGFwdGVyICE9IG51bGwpIHsKLQkJCU1vZGVsUXVlcnkgbXF1ZXJ5ID0gbXFhZGFwdGVyLmdldE1vZGVsUXVlcnkoKTsKLQkJCWlmICgobXF1ZXJ5ICE9IG51bGwpICYmIChtcXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKSAhPSBudWxsKSkgewotCQkJCWNtRG9jdW1lbnRNYW5hZ2VyID0gbXF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0JCQkJZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgPSBuZXcgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lckltcGwoKTsKLQkJCQljbURvY3VtZW50TWFuYWdlci5hZGRMaXN0ZW5lcihmQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBkZXJlZ2lzdGVyIGZyb20gQ01Eb2N1bWVudE1hbmFnZXIgZXZlbnRzCi0JCWlmICgoY21Eb2N1bWVudE1hbmFnZXIgIT0gbnVsbCkgJiYgKGZDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyICE9IG51bGwpKSB7Ci0JCQljbURvY3VtZW50TWFuYWdlci5yZW1vdmVMaXN0ZW5lcihmQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lcik7Ci0JCX0KLQkJZkxpc3RlbmVycy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVMaXN0ZW5lcihPYmplY3QgbGlzdGVuZXIpIHsKLQkJZkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjNTQ1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0KLS8qKgotICogQW4gSVRyZWVDb250ZW50UHJvdmlkZXIgZm9yIGEgVHJlZVZpZXdlcnMgdXNlZCB0byBkaXNwbGF5IERPTSBub2Rlcy4gVGhpcwotICogY29udGVudCBwcm92aWRlciB0YWtlcyBhbiBhZGFwdGVyIGZhY3RvcnkgdG8gY3JlYXRlIEpGYWNlIGFkYXB0ZXJzIGZvciB0aGUKLSAqIG5vZGVzIGluIHRoZSB0cmVlLgotICovCi1wdWJsaWMgY2xhc3MgSkZhY2VOb2RlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JcHVibGljIEpGYWNlTm9kZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdmlzdWFsIHBhcnQgdGhhdCBpcyB1c2luZyB0aGlzIGNvbnRlbnQgcHJvdmlkZXIgaXMgYWJvdXQgdG8gYmUKLQkgKiBkaXNwb3NlZC4gRGVhbGxvY2F0ZSBhbGwgYWxsb2NhdGVkIFNXVCByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKRmFjZSBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRhYmxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0IFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBhZGFwdGVyIGZvcgotCSAqLwotCXByb3RlY3RlZCBJSkZhY2VOb2RlQWRhcHRlciBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGUpIHsKLQkJaWYgKGFkYXB0YWJsZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gKChJTm9kZU5vdGlmaWVyKSBhZGFwdGFibGUpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJSkZhY2VOb2RlQWRhcHRlcikgewotCQkJCXJldHVybiAoSUpGYWNlTm9kZUFkYXB0ZXIpIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIob2JqZWN0KTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVGhlIHJvb3QgaXMgdXN1YWxseSBhbiBpbnN0YW5jZSBvZiBhbiBYTUxTdHJ1Y3R1cmVkTW9kZWwgaW4KLQkJLy8gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIGV4dHJhY3QgdGhlIGRvY3VtZW50LgotCQlPYmplY3QgdG9wTm9kZSA9IG9iamVjdDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJdG9wTm9kZSA9ICgoSURPTU1vZGVsKSBvYmplY3QpLmdldERvY3VtZW50KCk7Ci0JCX0KLQotCQlJSkZhY2VOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcih0b3BOb2RlKTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRFbGVtZW50cyh0b3BOb2RlKTsKLQkJfQotCi0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIob2JqZWN0KTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIob2JqZWN0KTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5oYXNDaGlsZHJlbihvYmplY3QpOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlpZiAoKG9sZElucHV0ICE9IG51bGwpICYmIChvbGRJbnB1dCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkTW9kZWwpKSB7Ci0JCQlJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkpICgoSVN0cnVjdHVyZWRNb2RlbCkgb2xkSW5wdXQpLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkucmVtb3ZlTGlzdGVuZXIodmlld2VyKTsKLQkJCX0KLQkJfQotCQlpZiAoKG5ld0lucHV0ICE9IG51bGwpICYmIChuZXdJbnB1dCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkTW9kZWwpKSB7Ci0JCQlJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkpICgoSVN0cnVjdHVyZWRNb2RlbCkgbmV3SW5wdXQpLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkuYWRkTGlzdGVuZXIodmlld2VyKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVMYWJlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTNiNTA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotCi0vKioKLSAqIEEgbGFiZWwgcHJvdmlkZXIgYmFja2VkIGJ5IEpGYWNlTm9kZUFkYXB0ZXJzLgotICovCi1wdWJsaWMgY2xhc3MgSkZhY2VOb2RlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCS8qKgotCSAqIEpGYWNlTm9kZUxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSkZhY2VOb2RlTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKRmFjZSBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRhYmxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0IFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBhZGFwdGVyIGZvcgotCSAqLwotCXByb3RlY3RlZCBJSkZhY2VOb2RlQWRhcHRlciBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGUpIHsKLQkJaWYgKGFkYXB0YWJsZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gKChJTm9kZU5vdGlmaWVyKSBhZGFwdGFibGUpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJSkZhY2VOb2RlQWRhcHRlcikgewotCQkJCXJldHVybiAoSUpGYWNlTm9kZUFkYXB0ZXIpIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKGVsZW1lbnQpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0TGFiZWxJbWFnZShlbGVtZW50KTsKLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKGVsZW1lbnQpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0TGFiZWxUZXh0KGVsZW1lbnQpOwotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1JlZnJlc2hTdHJ1Y3R1cmVKb2IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9SZWZyZXNoU3RydWN0dXJlSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NjBkYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1JlZnJlc2hTdHJ1Y3R1cmVKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoaXMgam9iIGhvbGRzIGEgcXVldWUgb2YgdXBkYXRlcyAoYWZmZWN0ZWQgbm9kZXMpIGZvciBtdWx0aXBsZSBzdHJ1Y3R1cmVkCi0gKiB2aWV3ZXJzLiBXaGVuIGEgbmV3IHJlcXVlc3QgY29tZXMgaW4sIHRoZSBjdXJyZW50IHJ1biBpcyBjYW5jZWxsZWQsIHRoZSBuZXcKLSAqIHJlcXVlc3QgaXMgYWRkZWQgdG8gdGhlIHF1ZXVlLCB0aGVuIHRoZSBqb2IgaXMgcmUtc2NoZWR1bGVkLiBTdXBwb3J0IGZvcgotICogbXVsdGlwbGUgc3RydWN0dXJlZCB2aWV3ZXJzIGlzIHJlcXVpcmVkIGJlY2F1c2UgcmVmcmVzaCB1cGRhdGVzIGFyZSB1c3VhbGx5Ci0gKiB0cmlnZ2VyZWQgYnkgbW9kZWwgY2hhbmdlcywgYW5kIHRoZSBtb2RlbCBtYXkgYmUgdmlzaWJsZSBpbiBtb3JlIHRoYW4gb25lCi0gKiB2aWV3ZXIuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLWNsYXNzIFJlZnJlc2hTdHJ1Y3R1cmVKb2IgZXh0ZW5kcyBKb2IgewotCi0JLyoqIGRlYnVnIGZsYWcgKi8KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFVQREFURV9ERUxBWSA9IDI1MDsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWZyZXNoU3RydWN0dXJlIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSAodmFsdWUgIT0gbnVsbCkgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCS8qKiBMaXN0IG9mIHJlZnJlc2ggcmVxdWVzdHMgKE5vZGVzKSAqLwotCXByaXZhdGUgZmluYWwgTGlzdCBmUmVxdWVzdHM7Ci0JLyoqIHRoZSBzdHJ1Y3R1cmVkIHZpZXdlcnMgKi8KLQlMaXN0IGZWaWV3ZXJzID0gbmV3IEFycmF5TGlzdCgzKTsKLQotCXB1YmxpYyBSZWZyZXNoU3RydWN0dXJlSm9iKCkgewotCQlzdXBlcihYTUxVSU1lc3NhZ2VzLnJlZnJlc2hvdXRsaW5lXzApOwotCQlzZXRQcmlvcml0eShKb2IuTE9ORyk7Ci0JCXNldFN5c3RlbSh0cnVlKTsKLQkJZlJlcXVlc3RzID0gbmV3IEFycmF5TGlzdCgyKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZFJlcXVlc3QoTm9kZSBuZXdOb2RlUmVxdWVzdCkgewotCQkvKgotCQkgKiBub3RlOiB0aGUgY2FsbGVyIG11c3QgTk9UIHBhc3MgaW4gbnVsbCBub2RlIHJlcXVlc3QgKHdoaWNoLCBzaW5jZQotCQkgKiBwcml2YXRlIG1ldGhvZCwgd2UgZG8gbm90IG5lZWQgdG8gZ2F1cmQgYWdhaW5zdCBoZXJlLCBhcyBsb25nIGFzIHdlCi0JCSAqIGdhdXJkIGFnYWluc3QgaXQgaW4gY2FsbGluZyBtZXRob2QuCi0JCSAqLwotCQlpbnQgc2l6ZSA9IGZSZXF1ZXN0cy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlOb2RlIGV4aXN0aW5nTm9kZVJlcXVlc3QgPSAoTm9kZSkgZlJlcXVlc3RzLmdldChpKTsKLQkJCS8qCi0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3NDI3IElmIHdlCi0JCQkgKiBhbHJlYWR5IGhhdmUgYSByZXF1ZXN0IHdoaWNoIGVxdWFscyB0aGUgbmV3IHJlcXVlc3QsIGRpc2NhcmQKLQkJCSAqIHRoZSBuZXcgcmVxdWVzdAotCQkJICovCi0JCQlpZiAoZXhpc3RpbmdOb2RlUmVxdWVzdC5lcXVhbHMobmV3Tm9kZVJlcXVlc3QpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLyoKLQkJCSAqIElmIHdlIGFscmVhZHkgaGF2ZSBhIHJlcXVlc3Qgd2hpY2ggY29udGFpbnMgdGhlIG5ldyByZXF1ZXN0LAotCQkJICogZGlzY2FyZCB0aGUgbmV3IHJlcXVlc3QKLQkJCSAqLwotCQkJaWYgKGNvbnRhaW5zKGV4aXN0aW5nTm9kZVJlcXVlc3QsIG5ld05vZGVSZXF1ZXN0KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8qCi0JCQkgKiBJZiBuZXcgcmVxdWVzdCBjb250YWlucyBhbnkgZXhpc3RpbmcgcmVxdWVzdHMsIHJlcGxhY2UgaXQgd2l0aAotCQkJICogbmV3IHJlcXVlc3QuIElTU1VFOiB0ZWNobmljYWxseSwgd2Ugc2hvdWxkIHJlcGxhY2UgQUxMCi0JCQkgKiBjb250YWluZWQsIGV4aXN0aW5nIHJlcXVlc3RzIChzdWNoIGFzIGlmIG1hbnkgc2libGluZ3MgYWxyZWFkeQotCQkJICogcXVlJ2QgdXAgd2hlbiB0aGVpciBjb21tb24gcGFyZW50IGlzIHRoZW4gcmVxdWVzdGVkLCBidXQsIEknbQotCQkJICogbm90IHN1cmUgaWYgdGhhdCBvY2N1cnMgbXVjaCwgaW4gcHJhY3RpY2UsIG9yIGlmIHRoZXJlJ3MgYW4KLQkJCSAqIGFsZ29yaXRobSB0byBxdWlja2x5IGZpbmQgdGhlbSBhbGwuIEFjdHVhbGx5LCBJIGd1ZXNzIHdlIGNvdWxkCi0JCQkgKiBqdXN0IGdvIHRocm91Z2ggdGhlIF9yZXN0XyBvZiB0aGUgbGlzdCAoaSsxIHRvIHNpemUpIGFuZCByZW1vdmUKLQkJCSAqIGFueSB0aGF0IGFyZSBjb250YWluZWQgYnkgbmV3IHJlcXVlc3QgLi4uIGluIGZ1dHVyZSA6KSAuCi0JCQkgKi8KLQkJCWlmIChjb250YWlucyhuZXdOb2RlUmVxdWVzdCwgZXhpc3RpbmdOb2RlUmVxdWVzdCkpIHsKLQkJCQlmUmVxdWVzdHMuc2V0KGksIG5ld05vZGVSZXF1ZXN0KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJLyoKLQkJICogSWYgd2UgZ2V0IHRvIGhlcmUsIGVpdGhlciBmcm9tIGV4aXN0aW5nIHJlcXVlc3QgbGlzdCBiZWluZyB6ZXJvCi0JCSAqIGxlbmd0aCwgb3Igbm8gZXhpc2l0bmcgcmVxdWVzdHMgIm1hdGNoZWQiIG5ldyByZXF1ZXN0LCB0aGVuIGFkZCB0aGUKLQkJICogbmV3IHJlcXVlc3QuCi0JCSAqLwotCQlmUmVxdWVzdHMuYWRkKG5ld05vZGVSZXF1ZXN0KTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZFZpZXdlcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgewotCQlpZiAoIWZWaWV3ZXJzLmNvbnRhaW5zKHZpZXdlcikpIHsKLQkJCWZWaWV3ZXJzLmFkZCh2aWV3ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2ltcGxlIGhpZXJhcmNoaWNhbCBjb250YWlubWVudCByZWxhdGlvbnNoaXAuIE5vdGUsIHRoaXMgbWV0aG9kIHJldHVybnMKLQkgKiAiZmFsc2UiIGlmIHRoZSB0d28gbm9kZXMgYXJlIGVxdWFsIQotCSAqIAotCSAqIEBwYXJhbSByb290Ci0JICogQHBhcmFtIHBvc3NpYmxlCi0JICogQHJldHVybiBpZiB0aGUgcm9vdCBpcyBwYXJlbnQgb2YgcG9zc2libGUsIHJldHVybiB0cnVlLCBvdGhlcndpc2UKLQkgKiAgICAgICAgIHJldHVybiBmYWxzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjb250YWlucyhOb2RlIHJvb3QsIE5vZGUgcG9zc2libGUpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVjdXJzaXZlIGNhbGwgdy8gcm9vdDogIiArIHJvb3QuZ2V0Tm9kZU5hbWUoKSArICIgYW5kIHBvc3NpYmxlOiAiICsgcG9zc2libGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gdGhlIGZvbGxvd2luZyBjaGVja3MgYXJlIGltcG9ydGFudAotCQkvLyAjZG9jdW1lbnQgbm9kZSB3aWxsIGJyZWFrIHRoZSBhbGdvcml0aG0gb3RoZXJ3aXNlCi0KLQkJLy8gY2FuJ3QgY29udGFpbiB0aGUgY2hpbGQgaWYgaXQncyBudWxsCi0JCWlmIChyb290ID09IG51bGwpIHsKLQkJCWlmIChERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmV0dXJuaW5nIGZhbHNlOiByb290IGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vIG5vdGhpbmcgY2FuIGJlIHBhcmVudCBvZiBEb2N1bWVudCBub2RlCi0JCWlmIChwb3NzaWJsZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJldHVybmluZyBmYWxzZTogcG9zc2libGUgaXMgRG9jdW1lbnQgbm9kZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gZG9jdW1lbnQgY29udGFpbnMgZXZlcnl0aGluZwotCQlpZiAocm9vdCBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJldHVybmluZyB0cnVlOiByb290IGlzIERvY3VtZW50IG5vZGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvLyBjaGVjayBwYXJlbnRhZ2UKLQkJTm9kZSBjdXJyZW50ID0gcG9zc2libGU7Ci0JCS8vIGxvb3AgcGFyZW50cwotCQl3aGlsZSAoKGN1cnJlbnQgIT0gbnVsbCkgJiYgKGN1cnJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpKSB7Ci0JCQkvLyBmb3VuZCBpdAotCQkJaWYgKHJvb3QuZXF1YWxzKGN1cnJlbnQpKSB7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgISEhIGZvdW5kOiAiICsgcG9zc2libGUuZ2V0Tm9kZU5hbWUoKSArICIgaW4gc3ViZWxlbWVudCBvZjogIiArIHJvb3QuZ2V0Tm9kZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWN1cnJlbnQgPSBjdXJyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQkvLyBuZXZlciBmb3VuZCBpdAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaCBtdXN0IGJlIG9uIFVJIHRocmVhZCBiZWNhdXNlIGl0J3Mgb24gYSBTV1Qgd2lkZ2V0LgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvUmVmcmVzaChmaW5hbCBOb2RlIG5vZGUsIGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXJbXSB2aWV3ZXJzKSB7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVmcmVzaCBvbjogWyIgKyBub2RlLmdldE5vZGVOYW1lKCkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZpZXdlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKCF2aWV3ZXJzW2ldLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJCQkJdmlld2Vyc1tpXS5yZWZyZXNoKHRydWUpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJdmlld2Vyc1tpXS5yZWZyZXNoKG5vZGUsIHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAhISEgc2tpcHBlZCByZWZyZXNoaW5nIGRpc3Bvc2VkIHZpZXdlcjogIiArIHZpZXdlcnNbaV0pOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFsc28gc3luY2hyb25pemVkIGJlY2F1c2UgaXQgYWNjZXNzZXMgdGhlIGZSZXF1ZXN0cyBxdWV1ZQotCSAqIGFuZCBmVmlld2VycyBsaXN0Ci0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGFuZCBhcnJheSBvZiB0aGUgY3VycmVudGx5IHJlcXVlc3RlZCBOb2RlcwotCSAqICAgICAgICAgdG8gcmVmcmVzaCBhbmQgdGhlIHZpZXdlcnMgaW4gd2hpY2ggdG8gcmVmcmVzaCB0aGVtCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgT2JqZWN0W10gZ2V0UmVxdWVzdHMoKSB7Ci0JCU5vZGVbXSB0b1JlZnJlc2ggPSAoTm9kZVtdKSBmUmVxdWVzdHMudG9BcnJheShuZXcgTm9kZVtmUmVxdWVzdHMuc2l6ZSgpXSk7Ci0JCWZSZXF1ZXN0cy5jbGVhcigpOwotCi0JCVN0cnVjdHVyZWRWaWV3ZXJbXSB2aWV3ZXJzID0gKFN0cnVjdHVyZWRWaWV3ZXJbXSkgZlZpZXdlcnMudG9BcnJheShuZXcgU3RydWN0dXJlZFZpZXdlcltmVmlld2Vycy5zaXplKCldKTsKLQkJZlZpZXdlcnMuY2xlYXIoKTsKLQotCQlyZXR1cm4gbmV3IE9iamVjdFtde3RvUmVmcmVzaCwgdmlld2Vyc307Ci0JfQotCi0JLyoqCi0JICogSW52b2tlIGEgcmVmcmVzaCBvbiB0aGUgdmlld2VyIG9uIHRoZSBnaXZlbiBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaChTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlciwgTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWFkZFZpZXdlcih2aWV3ZXIpOwotCQlhZGRSZXF1ZXN0KG5vZGUpOwotCQlzY2hlZHVsZShVUERBVEVfREVMQVkpOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQl0cnkgewotCQkJLy8gUmV0cmlldmUgQk9USCB2aWV3ZXJzIGFuZCBOb2RlcyBvbiBvbmUgYmxvY2sKLQkJCU9iamVjdFtdIHJlcXVlc3RzID0gZ2V0UmVxdWVzdHMoKTsKLQkJCU5vZGVbXSBub2RlcyA9IChOb2RlW10pIHJlcXVlc3RzWzBdOwotCQkJU3RydWN0dXJlZFZpZXdlcltdIHZpZXdlcnMgPSAoU3RydWN0dXJlZFZpZXdlcltdKSByZXF1ZXN0c1sxXTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJZG9SZWZyZXNoKG5vZGVzW2ldLCB2aWV3ZXJzKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvWE1MTm9kZUFjdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9YTUxOb2RlQWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODU4MDcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9YTUxOb2RlQWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5BYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFhNTE5vZGVBY3Rpb25NYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlciB7Ci0JcHVibGljIFhNTE5vZGVBY3Rpb25NYW5hZ2VyKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIobW9kZWwsIE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobW9kZWwpLCB2aWV3ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZm9ybWF0KE5vZGUgbmV3RWxlbWVudCwgYm9vbGVhbiBkZWVwKSB7Ci0JCXRyeSB7Ci0JCQkvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBhYm91dCB0byBtYWtlIGEgYmlnIG1vZGVsIGNoYW5nZQotCQkJZk1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0JCQkvLyBmb3JtYXQgc2VsZWN0ZWQgbm9kZQotCQkJSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotCQkJZm9ybWF0UHJvY2Vzc29yLmZvcm1hdE5vZGUobmV3RWxlbWVudCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZyBtb2RlbCBjaGFuZ2UKLQkJCWZNb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQkJZk1vZGVsID0gbmV3TW9kZWw7Ci0JCXNldE1vZGVsUXVlcnkoTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShuZXdNb2RlbCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE1vZGVsUXVlcnkoTW9kZWxRdWVyeSBuZXdNb2RlbFF1ZXJ5KSB7Ci0JCW1vZGVsUXVlcnkgPSBuZXdNb2RlbFF1ZXJ5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0NvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVyWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMTEwNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVyWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb3JyZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5Db3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnM7Ci0KLS8qKgotICogQ29ycmVjdGlvbiBhc3Npc3RhbnQgZm9yIFhNTAotICogCi0gKiBAZGVwcmVjYXRlZCBzaW5jZSAyLjAgUkMwIFVzZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RQcm9jZXNzb3I7Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXJYTUwgZXh0ZW5kcyBDb3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXIgewotCi0JcHVibGljIElDb250ZW50QXNzaXN0YW50IGdldENvcnJlY3Rpb25Bc3Npc3RhbnQoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJSUNvbnRlbnRBc3Npc3RhbnQgY2EgPSBudWxsOwotCi0JCWlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJQ29udGVudEFzc2lzdGFudCBhc3Npc3RhbnQgPSBuZXcgQ29udGVudEFzc2lzdGFudCgpOwotCi0JCQlpZiAoc291cmNlVmlld2VyICE9IG51bGwpIHsKLQkJCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBjb3JyZWN0aW9uUHJvY2Vzc29yID0gbmV3IENvcnJlY3Rpb25Qcm9jZXNzb3JYTUwoc291cmNlVmlld2VyKTsKLQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb3JyZWN0aW9uUHJvY2Vzc29yLCBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCk7Ci0JCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY29ycmVjdGlvblByb2Nlc3NvciwgSVhNTFBhcnRpdGlvbnMuWE1MX0NEQVRBKTsKLQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb3JyZWN0aW9uUHJvY2Vzc29yLCBJWE1MUGFydGl0aW9ucy5YTUxfQ09NTUVOVCk7Ci0JCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY29ycmVjdGlvblByb2Nlc3NvciwgSVhNTFBhcnRpdGlvbnMuWE1MX0RFQ0xBUkFUSU9OKTsKLQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb3JyZWN0aW9uUHJvY2Vzc29yLCBJWE1MUGFydGl0aW9ucy5YTUxfUEkpOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNvcnJlY3Rpb25Qcm9jZXNzb3IsIElYTUxQYXJ0aXRpb25zLkRURF9TVUJTRVQpOwotCQkJfQotCQkJY2EgPSBhc3Npc3RhbnQ7Ci0JCX0KLQotCQlyZXR1cm4gY2E7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uUHJvY2Vzc29yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uUHJvY2Vzc29yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZTczZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29ycmVjdGlvblByb2Nlc3NvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uLklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb24uSVF1aWNrRml4UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5TdHJ1Y3R1cmVkQ29ycmVjdGlvblByb2Nlc3NvcjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBzaW5jZSAyLjAgUkMwIFVzZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RQcm9jZXNzb3I7Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb3JyZWN0aW9uUHJvY2Vzc29yWE1MIGV4dGVuZHMgU3RydWN0dXJlZENvcnJlY3Rpb25Qcm9jZXNzb3IgewotCXByb3RlY3RlZCBJUXVpY2tBc3Npc3RQcm9jZXNzb3IgZlF1aWNrQXNzaXN0UHJvY2Vzc29yOwotCXByb3RlY3RlZCBJUXVpY2tGaXhQcm9jZXNzb3IgZlF1aWNrRml4UHJvY2Vzc29yOwotCi0JcHVibGljIENvcnJlY3Rpb25Qcm9jZXNzb3JYTUwoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJc3VwZXIoc291cmNlVmlld2VyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVF1aWNrQXNzaXN0UHJvY2Vzc29yIGdldFF1aWNrQXNzaXN0UHJvY2Vzc29yKCkgewotCQlpZiAoZlF1aWNrQXNzaXN0UHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZRdWlja0Fzc2lzdFByb2Nlc3NvciA9IG5ldyBRdWlja0Fzc2lzdFByb2Nlc3NvclhNTCgpOwotCQl9Ci0KLQkJcmV0dXJuIGZRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVF1aWNrRml4UHJvY2Vzc29yIGdldFF1aWNrRml4UHJvY2Vzc29yKCkgewotCQlpZiAoZlF1aWNrRml4UHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZRdWlja0ZpeFByb2Nlc3NvciA9IG5ldyBRdWlja0ZpeFByb2Nlc3NvclhNTCgpOwotCQl9Ci0KLQkJcmV0dXJuIGZRdWlja0ZpeFByb2Nlc3NvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9JbnNlcnRSZXF1aXJlZEF0dHJzUXVpY2tBc3Npc3RQcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vSW5zZXJ0UmVxdWlyZWRBdHRyc1F1aWNrQXNzaXN0UHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ5NDdlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9JbnNlcnRSZXF1aXJlZEF0dHJzUXVpY2tBc3Npc3RQcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5JbnNlcnRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLXB1YmxpYyBjbGFzcyBJbnNlcnRSZXF1aXJlZEF0dHJzUXVpY2tBc3Npc3RQcm9wb3NhbCBpbXBsZW1lbnRzIElDb21wbGV0aW9uUHJvcG9zYWwsIElDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yIHsKLQlwcml2YXRlIGZpbmFsIExpc3QgZlJlcXVpcmVkQXR0cnM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVxdWlyZWRBdHRycwotCSAqLwotCXB1YmxpYyBJbnNlcnRSZXF1aXJlZEF0dHJzUXVpY2tBc3Npc3RQcm9wb3NhbChMaXN0IHJlcXVpcmVkQXR0cnMpIHsKLQkJZlJlcXVpcmVkQXR0cnMgPSByZXF1aXJlZEF0dHJzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIG5vdCBpbXBsZW1lbnRlZD8KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiNhcHBseShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgY2hhciwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoSVRleHRWaWV3ZXIgdmlld2VyLCBjaGFyIHRyaWdnZXIsIGludCBzdGF0ZU1hc2ssIGludCBvZmZzZXQpIHsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgQ29udGVudEFzc2lzdFV0aWxzLmdldE5vZGVBdCh2aWV3ZXIsIG9mZnNldCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWludCBpbmRleCA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGFzdFJlZ2lvbigpOwotCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB7Ci0JCQlpbmRleC0tOwotCQkJbGFzdFJlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluZGV4IC0gMSk7Ci0JCX0KLQkJZWxzZSBpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQlpbmRleCA9IGluZGV4IC0gMjsKLQkJCWxhc3RSZWdpb24gPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbmRleCAtIDEpOwotCQl9Ci0JCU11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZSZXF1aXJlZEF0dHJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBmUmVxdWlyZWRBdHRycy5nZXQoaSk7Ci0JCQkJU3RyaW5nIHJlcXVpcmVkQXR0cmlidXRlTmFtZSA9IGF0dHJEZWNsLmdldEF0dHJOYW1lKCk7Ci0JCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGF0dHJEZWNsLmdldERlZmF1bHRWYWx1ZSgpOwotCQkJCWlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkgewotCQkJCQlkZWZhdWx0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlTdHJpbmcgbmFtZUFuZERlZmF1bHRWYWx1ZSA9ICIgIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICgoaSA9PSAwKSAmJiAobGFzdFJlZ2lvbi5nZXRMZW5ndGgoKSA+IGxhc3RSZWdpb24uZ2V0VGV4dExlbmd0aCgpKSkgewotCQkJCQluYW1lQW5kRGVmYXVsdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJbmFtZUFuZERlZmF1bHRWYWx1ZSArPSByZXF1aXJlZEF0dHJpYnV0ZU5hbWUgKyAiPVwiIiArIGRlZmF1bHRWYWx1ZSArICJcIiI7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJbXVsdGlUZXh0RWRpdC5hZGRDaGlsZChuZXcgSW5zZXJ0RWRpdChpbmRleCwgbmFtZUFuZERlZmF1bHRWYWx1ZSkpOwotCQkJCS8vIEJVRzMzODE6IE11bHRpVGV4dEVkaXQgYXBwbGllcyBhbGwgY2hpbGQgVGV4dEVkaXQncyBiYXNpbmcKLQkJCQkvLyBvbiBvZmZzZXRzCi0JCQkJLy8gaW4gdGhlIGRvY3VtZW50IGJlZm9yZSB0aGUgZmlyc3QgVGV4dEVkaXQsIG5vdCBhZnRlciBlYWNoCi0JCQkJLy8gY2hpbGQgVGV4dEVkaXQuIFRoZXJlZm9yZSwgZG8gbm90IG5lZWQgdG8gYWR2YW5jZSB0aGUKLQkJCQkvLyBpbmRleC4KLQkJCQkvLyBpbmRleCArPSBuYW1lQW5kRGVmYXVsdFZhbHVlLmxlbmd0aCgpOwotCQkJfQotCQkJbXVsdGlUZXh0RWRpdC5hcHBseSh2aWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZywgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgdGhlcmUncyByZWFzb25zIHdoeSB3ZSBnZXQgc29tZQotCQkJLy8gaGVyZS4KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkgewotCQlyZXR1cm4gWE1MVUlNZXNzYWdlcy5JbnNlcnRSZXF1aXJlZEF0dHJzUXVpY2tBc3Npc3RQcm9wb3NhbF8wOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0Q29udGV4dEluZm9ybWF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbiBnZXRDb250ZXh0SW5mb3JtYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0RGlzcGxheVN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gWE1MVUlNZXNzYWdlcy5JbnNlcnRSZXF1aXJlZEF0dHJzUXVpY2tBc3Npc3RQcm9wb3NhbF8xOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0SW1hZ2UoKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJLy8gcmV0dXJuIEphdmFQbHVnaW5JbWFnZXMuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX0NPUlJFQ1RJT05fTE9DQUwpOwotCQlyZXR1cm4gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BRERfQ09SUkVDVElPTik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIFBvaW50IGdldFNlbGVjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjc2VsZWN0ZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0ZWQoSVRleHRWaWV3ZXIgdmlld2VyLCBib29sZWFuIHNtYXJ0VG9nZ2xlKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjdW5zZWxlY3RlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2VsZWN0ZWQoSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjdmFsaWRhdGUob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBpbnQsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1Byb2JsZW1JRHNYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1Byb2JsZW1JRHNYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQwMDA4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Qcm9ibGVtSURzWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBQcm9ibGVtSURzWE1MIHsKLQlpbnQgQXR0cnNJbkVuZFRhZyA9IDM7Ci0JaW50IEF0dHJWYWx1ZU5vdFF1b3RlZCA9IDEzOwotCWludCBFbXB0eVRhZyA9IDE7Ci0JaW50IEludmFsaWRBdHRyVmFsdWUgPSAxMTsKLQlpbnQgTWlzc2luZ0F0dHJWYWx1ZSA9IDQ7Ci0JaW50IE1pc3NpbmdDbG9zaW5nQnJhY2tldCA9IDE0OwotCWludCBNaXNzaW5nRW5kVGFnID0gMjsKLQlpbnQgTWlzc2luZ1JlcXVpcmVkQXR0ciA9IDEyOwotCWludCBOYW1lc3BhY2VJblBJID0gODsKLQlpbnQgTm9BdHRyVmFsdWUgPSA1OwotCWludCBTcGFjZXNCZWZvcmVQSSA9IDc7Ci0JaW50IFNwYWNlc0JlZm9yZVRhZ05hbWUgPSA2OwotCWludCBVbmNsYXNzaWZpZWQgPSAwOwotCWludCBVbmtub3duQXR0ciA9IDEwOwotCWludCBVbmtub3duRWxlbWVudCA9IDk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9RdWlja0Fzc2lzdFByb2Nlc3NvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUXVpY2tBc3Npc3RQcm9jZXNzb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI4ZGI4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9RdWlja0Fzc2lzdFByb2Nlc3NvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5JUXVpY2tBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNTmFtZWROb2RlTWFwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIHNpbmNlIDIuMCBSQzAgVXNlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLSAqLwotcHVibGljIGNsYXNzIFF1aWNrQXNzaXN0UHJvY2Vzc29yWE1MIGltcGxlbWVudHMgSVF1aWNrQXNzaXN0UHJvY2Vzc29yIHsKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29ycmVjdGlvbi5JUXVpY2tBc3Npc3RQcm9jZXNzb3IjY2FuQXNzaXN0KG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQXNzaXN0KFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvcG9zYWxzCi0JICogQHBhcmFtIHZpZXdlcgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBnZXRJbnNlcnRSZXF1aXJlZEF0dHJzKEFycmF5TGlzdCBwcm9wb3NhbHMsIFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgb2Zmc2V0KTsKLQkJaWYgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSAmJiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQkJSURPTU5vZGUgY3Vyc29yTm9kZSA9IChJRE9NTm9kZSkgQ29udGVudEFzc2lzdFV0aWxzLmdldE5vZGVBdCh2aWV3ZXIsIG9mZnNldCk7Ci0JCQkJTGlzdCByZXF1aXJlZEF0dHJzID0gZ2V0UmVxdWlyZWRBdHRycyhjdXJzb3JOb2RlKTsKLQkJCQlpZiAocmVxdWlyZWRBdHRycy5zaXplKCkgPiAwKSB7Ci0JCQkJCU5hbWVkTm9kZU1hcCBjdXJyZW50QXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJTGlzdCBpbnNlcnRBdHRycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaWYgKGN1cnJlbnRBdHRycy5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlpbnNlcnRBdHRycy5hZGRBbGwocmVxdWlyZWRBdHRycyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcXVpcmVkQXR0cnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQlTdHJpbmcgcmVxdWlyZWRBdHRyTmFtZSA9ICgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgcmVxdWlyZWRBdHRycy5nZXQoaSkpLmdldEF0dHJOYW1lKCk7Ci0JCQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY3VycmVudEF0dHJzLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJCQkJU3RyaW5nIGN1cnJlbnRBdHRyTmFtZSA9IGN1cnJlbnRBdHRycy5pdGVtKGopLmdldE5vZGVOYW1lKCk7Ci0JCQkJCQkJCWlmIChyZXF1aXJlZEF0dHJOYW1lLmNvbXBhcmVUb0lnbm9yZUNhc2UoY3VycmVudEF0dHJOYW1lKSA9PSAwKSB7Ci0JCQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIWZvdW5kKSB7Ci0JCQkJCQkJCWluc2VydEF0dHJzLmFkZChyZXF1aXJlZEF0dHJzLmdldChpKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChpbnNlcnRBdHRycy5zaXplKCkgPiAwKSB7Ci0JCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBJbnNlcnRSZXF1aXJlZEF0dHJzUXVpY2tBc3Npc3RQcm9wb3NhbChpbnNlcnRBdHRycykpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb3Bvc2FscwotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2V0TG9jYWxSZW5hbWVRdWlja0Fzc2lzdFByb3Bvc2FsKEFycmF5TGlzdCBwcm9wb3NhbHMsIFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgb2Zmc2V0KTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUgPT0gbnVsbCA/IG51bGwgOiBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZSA9PSBudWxsID8gbnVsbCA6IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaW50IHJlZ2lvblRleHRFbmRPZmZzZXQgPSAwOwotCQlpZiAoKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpICYmIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCXJlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlyZWdpb25UZXh0RW5kT2Zmc2V0ID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgJiYgZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCXJlZ2lvbiA9IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJcmVnaW9uVGV4dEVuZE9mZnNldCA9IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCX0KLQotCQlpZiAoKHJlZ2lvbiAhPSBudWxsKSAmJiAoKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHx8IChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpICYmIChvZmZzZXQgPD0gcmVnaW9uVGV4dEVuZE9mZnNldCkpIHsKLQkJCXByb3Bvc2Fscy5hZGQobmV3IFJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWwoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTW9kZWxRdWVyeSBnZXRNb2RlbFF1ZXJ5KE5vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJcmV0dXJuIE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoKERvY3VtZW50KSBub2RlKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb3JyZWN0aW9uLklRdWlja0Fzc2lzdFByb2Nlc3NvciNnZXRQcm9wb3NhbHMob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFByb3Bvc2FscyhTdHJ1Y3R1cmVkVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQXJyYXlMaXN0IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlnZXRMb2NhbFJlbmFtZVF1aWNrQXNzaXN0UHJvcG9zYWwocHJvcG9zYWxzLCB2aWV3ZXIsIG9mZnNldCk7Ci0JCWdldFN1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsKHByb3Bvc2Fscywgdmlld2VyLCBvZmZzZXQpOwotCQlnZXRJbnNlcnRSZXF1aXJlZEF0dHJzKHByb3Bvc2Fscywgdmlld2VyLCBvZmZzZXQpOwotCi0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBwcm9wb3NhbHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtwcm9wb3NhbHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UmVxdWlyZWRBdHRycyhOb2RlIG5vZGUpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gZ2V0TW9kZWxRdWVyeShub2RlKTsKLQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJCWlmIChlbGVtZW50RGVjbCAhPSBudWxsKSB7Ci0JCQkJQ01OYW1lZE5vZGVNYXAgYXR0ck1hcCA9IGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkJCUNNTmFtZWROb2RlTWFwSW1wbCBhbGxBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbChhdHRyTWFwKTsKLQkJCQlMaXN0IG5vZGVzID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShub2RlLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QXZhaWxhYmxlQ29udGVudCgoRWxlbWVudClub2RlLCBlbGVtZW50RGVjbCwgTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVMpOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbm9kZXMuc2l6ZSgpOyBrKyspIHsKLQkJCQkJQ01Ob2RlIGNtbm9kZSA9IChDTU5vZGUpIG5vZGVzLmdldChrKTsKLQkJCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pIHsKLQkJCQkJCWFsbEF0dHJpYnV0ZXMucHV0KGNtbm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYXR0ck1hcCA9IGFsbEF0dHJpYnV0ZXM7Ci0JCQkJCi0JCQkJSXRlcmF0b3IgaXQgPSBhdHRyTWFwLml0ZXJhdG9yKCk7Ci0JCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gbnVsbDsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCWF0dHIgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgaXQubmV4dCgpOwotCQkJCQlpZiAoYXR0ci5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpIHsKLQkJCQkJCXJlc3VsdC5hZGQoYXR0cik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9wb3NhbHMKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogQHBhcmFtIG9mZnNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdldFN1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsKEFycmF5TGlzdCBwcm9wb3NhbHMsIFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgb2Zmc2V0KTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJcHJvcG9zYWxzLmFkZChuZXcgU3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWwoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9RdWlja0ZpeFByb2Nlc3NvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUXVpY2tGaXhQcm9jZXNzb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhlYWVhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9RdWlja0ZpeFByb2Nlc3NvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb24uSVF1aWNrRml4UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlRlbXBvcmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBzaW5jZSAyLjAgUkMwIFVzZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5xdWlja2Fzc2lzdC5JUXVpY2tBc3Npc3RQcm9jZXNzb3I7Ci0gKi8KLXB1YmxpYyBjbGFzcyBRdWlja0ZpeFByb2Nlc3NvclhNTCBpbXBsZW1lbnRzIElRdWlja0ZpeFByb2Nlc3NvciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29ycmVjdGlvbi5JUXVpY2tGaXhQcm9jZXNzb3IjY2FuRml4KGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaXgoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBUZW1wb3JhcnlBbm5vdGF0aW9uKSB7Ci0JCQlUZW1wb3JhcnlBbm5vdGF0aW9uIHRlbXBBbm5vdGF0aW9uID0gKFRlbXBvcmFyeUFubm90YXRpb24pIGFubm90YXRpb247Ci0JCQlpbnQgcHJvYmxlbUlEID0gdGVtcEFubm90YXRpb24uZ2V0UHJvYmxlbUlEKCk7Ci0JCQlzd2l0Y2ggKHByb2JsZW1JRCkgewotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5FbXB0eVRhZyA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdFbmRUYWcgOgotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5BdHRyc0luRW5kVGFnIDoKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuTWlzc2luZ0F0dHJWYWx1ZSA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk5vQXR0clZhbHVlIDoKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuU3BhY2VzQmVmb3JlVGFnTmFtZSA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLlNwYWNlc0JlZm9yZVBJIDoKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuTmFtZXNwYWNlSW5QSSA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLlVua25vd25FbGVtZW50IDoKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuVW5rbm93bkF0dHIgOgotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5JbnZhbGlkQXR0clZhbHVlIDoKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuTWlzc2luZ1JlcXVpcmVkQXR0ciA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLkF0dHJWYWx1ZU5vdFF1b3RlZCA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdDbG9zaW5nQnJhY2tldCA6Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJLy8gcmV0dXJuCi0JCS8vIEphdmFQbHVnaW5JbWFnZXMuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX0NPUlJFQ1RJT05fQ0hBTkdFKTsKLQkJcmV0dXJuIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ09SUkVDVElPTl9DSEFOR0UpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb3JyZWN0aW9uLklRdWlja0ZpeFByb2Nlc3NvciNnZXRQcm9wb3NhbHMob3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuVGVtcG9yYXJ5QW5ub3RhdGlvbikKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFByb3Bvc2FscyhBbm5vdGF0aW9uIGFubm90YXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQXJyYXlMaXN0IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pIHsKLQkJCVRlbXBvcmFyeUFubm90YXRpb24gdGVtcEFubm90YXRpb24gPSAoVGVtcG9yYXJ5QW5ub3RhdGlvbikgYW5ub3RhdGlvbjsKLQkJCWludCBwcm9ibGVtSUQgPSB0ZW1wQW5ub3RhdGlvbi5nZXRQcm9ibGVtSUQoKTsKLQkJCXN3aXRjaCAocHJvYmxlbUlEKSB7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLkVtcHR5VGFnIDoKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzAsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdFbmRUYWcgOgotCQkJCQlTdHJpbmcgdGFnTmFtZSA9IChTdHJpbmcpICgoT2JqZWN0W10pIHRlbXBBbm5vdGF0aW9uLmdldEFkZGl0aW9uYWxGaXhJbmZvKCkpWzBdOwotCQkJCQlTdHJpbmcgdGFnQ2xvc2UgPSAoU3RyaW5nKSAoKE9iamVjdFtdKSB0ZW1wQW5ub3RhdGlvbi5nZXRBZGRpdGlvbmFsRml4SW5mbygpKVsxXTsKLQkJCQkJaW50IHRhZ0Nsb3NlT2Zmc2V0ID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSB0ZW1wQW5ub3RhdGlvbi5nZXRBZGRpdGlvbmFsRml4SW5mbygpKVsyXSkuaW50VmFsdWUoKTsKLQkJCQkJaW50IHN0YXJ0VGFnRW5kT2Zmc2V0ID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSB0ZW1wQW5ub3RhdGlvbi5nZXRBZGRpdGlvbmFsRml4SW5mbygpKVszXSkuaW50VmFsdWUoKTsKLQkJCQkJaW50IGZpcnN0Q2hpbGRTdGFydE9mZnNldCA9ICgoSW50ZWdlcikgKChPYmplY3RbXSkgdGVtcEFubm90YXRpb24uZ2V0QWRkaXRpb25hbEZpeEluZm8oKSlbNF0pLmludFZhbHVlKCk7Ci0JCQkJCWludCBlbmRPZmZzZXQgPSAoKEludGVnZXIpICgoT2JqZWN0W10pIHRlbXBBbm5vdGF0aW9uLmdldEFkZGl0aW9uYWxGaXhJbmZvKCkpWzVdKS5pbnRWYWx1ZSgpOwotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwodGFnQ2xvc2UsIHRhZ0Nsb3NlT2Zmc2V0LCAwLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzEsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSwgc3RhcnRUYWdFbmRPZmZzZXQgLSB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzIsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCI8LyIgKyB0YWdOYW1lICsgIj4iLCBmaXJzdENoaWxkU3RhcnRPZmZzZXQsIDAsIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMywgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgCi0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiPC8iICsgdGFnTmFtZSArICI+IiwgZW5kT2Zmc2V0LCAwLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzQsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIAotCQkJCQlicmVhazsKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuQXR0cnNJbkVuZFRhZyA6Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF81LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5NaXNzaW5nQXR0clZhbHVlIDoKLQkJCQkJU3RyaW5nIGRlZmF1bHRBdHRyVmFsdWUgPSAoU3RyaW5nKSAoKE9iamVjdFtdKSB0ZW1wQW5ub3RhdGlvbi5nZXRBZGRpdGlvbmFsRml4SW5mbygpKVswXTsKLQkJCQkJaW50IGluc2VydE9mZnNldCA9ICgoSW50ZWdlcikgKChPYmplY3RbXSkgdGVtcEFubm90YXRpb24uZ2V0QWRkaXRpb25hbEZpeEluZm8oKSlbMV0pLmludFZhbHVlKCk7Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiXCIiICsgZGVmYXVsdEF0dHJWYWx1ZSArICJcIiIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCkgKyB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpICsgaW5zZXJ0T2Zmc2V0LCAwLCBkZWZhdWx0QXR0clZhbHVlLmxlbmd0aCgpICsgMiwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF82LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzcsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk5vQXR0clZhbHVlIDoKLQkJCQkJZGVmYXVsdEF0dHJWYWx1ZSA9IChTdHJpbmcpIHRlbXBBbm5vdGF0aW9uLmdldEFkZGl0aW9uYWxGaXhJbmZvKCk7Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiPVwiIiArIGRlZmF1bHRBdHRyVmFsdWUgKyAiXCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpICsgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRMZW5ndGgoKSwgMCwgZGVmYXVsdEF0dHJWYWx1ZS5sZW5ndGgoKSArIDMsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfNiwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgCi0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF83LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5TcGFjZXNCZWZvcmVUYWdOYW1lIDoKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzgsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLlNwYWNlc0JlZm9yZVBJIDoKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzksIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk5hbWVzcGFjZUluUEkgOgotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCksIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTAsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLlVua25vd25FbGVtZW50IDoKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgUmVtb3ZlVW5rbm93bkVsZW1lbnRRdWlja0ZpeFByb3Bvc2FsKHRlbXBBbm5vdGF0aW9uLmdldEFkZGl0aW9uYWxGaXhJbmZvKCksIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTEpKTsKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgUmVuYW1lSW5GaWxlUXVpY2tBc3Npc3RQcm9wb3NhbCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLlVua25vd25BdHRyIDoKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzcsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgUmVuYW1lSW5GaWxlUXVpY2tBc3Npc3RQcm9wb3NhbCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLkludmFsaWRBdHRyVmFsdWUgOgotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCksIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTIsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdSZXF1aXJlZEF0dHIgOgotCQkJCQlTdHJpbmcgcmVxdWlyZWRBdHRyID0gKFN0cmluZykgKChPYmplY3RbXSkgdGVtcEFubm90YXRpb24uZ2V0QWRkaXRpb25hbEZpeEluZm8oKSlbMF07Ci0JCQkJCWluc2VydE9mZnNldCA9ICgoSW50ZWdlcikgKChPYmplY3RbXSkgdGVtcEFubm90YXRpb24uZ2V0QWRkaXRpb25hbEZpeEluZm8oKSlbMV0pLmludFZhbHVlKCk7Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbChyZXF1aXJlZEF0dHIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCkgKyBpbnNlcnRPZmZzZXQsIDAsIHJlcXVpcmVkQXR0ci5sZW5ndGgoKSwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF8xMywgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLkF0dHJWYWx1ZU5vdFF1b3RlZCA6Ci0JCQkJCVN0cmluZyBhdHRyVmFsdWUgPSAoU3RyaW5nKSB0ZW1wQW5ub3RhdGlvbi5nZXRBZGRpdGlvbmFsRml4SW5mbygpOwotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIlwiIiArIGF0dHJWYWx1ZSArICJcIiIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCksIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0TGVuZ3RoKCksIGF0dHJWYWx1ZS5sZW5ndGgoKSArIDIsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTQsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIAotCQkJCQlicmVhazsKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuTWlzc2luZ0Nsb3NpbmdCcmFja2V0IDoKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCI+IiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSArIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0TGVuZ3RoKCksIDAsIDEsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTUsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgcHJvcG9zYWxzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxzLnNpemUoKV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1JlbW92ZVVua25vd25FbGVtZW50UXVpY2tGaXhQcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUmVtb3ZlVW5rbm93bkVsZW1lbnRRdWlja0ZpeFByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4N2EyYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUmVtb3ZlVW5rbm93bkVsZW1lbnRRdWlja0ZpeFByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5EZWxldGVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlVW5rbm93bkVsZW1lbnRRdWlja0ZpeFByb3Bvc2FsIGltcGxlbWVudHMgSUNvbXBsZXRpb25Qcm9wb3NhbCwgSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIgewotCXByaXZhdGUgT2JqZWN0IGZBZGRpdGlvbmFsRml4SW5mbyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkRpc3BsYXlTdHJpbmc7Ci0JcHJpdmF0ZSBJbWFnZSBmSW1hZ2U7Ci0JcHJpdmF0ZSBQb2ludCBmU2VsZWN0aW9uOyAvLyBpbml0aWFsaXplZCBieSBhcHBseSgpCi0KLQlwdWJsaWMgUmVtb3ZlVW5rbm93bkVsZW1lbnRRdWlja0ZpeFByb3Bvc2FsKE9iamVjdCBhZGRpdGlvbmFsRml4SW5mbywgSW1hZ2UgaW1hZ2UsIFN0cmluZyBkaXNwbGF5U3RyaW5nKSB7Ci0JCWZBZGRpdGlvbmFsRml4SW5mbyA9IGFkZGl0aW9uYWxGaXhJbmZvOwotCQlmSW1hZ2UgPSBpbWFnZTsKLQkJZkRpc3BsYXlTdHJpbmcgPSBkaXNwbGF5U3RyaW5nOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIG5vdCBpbXBsZW1lbnRlZD8KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiNhcHBseShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgY2hhciwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoSVRleHRWaWV3ZXIgdmlld2VyLCBjaGFyIHRyaWdnZXIsIGludCBzdGF0ZU1hc2ssIGludCBvZmZzZXQpIHsKLQkJaW50IHN0YXJ0VGFnT2Zmc2V0ID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSBmQWRkaXRpb25hbEZpeEluZm8pWzBdKS5pbnRWYWx1ZSgpOwotCQlpbnQgc3RhcnRUYWdMZW5ndGggPSAoKEludGVnZXIpICgoT2JqZWN0W10pIGZBZGRpdGlvbmFsRml4SW5mbylbMV0pLmludFZhbHVlKCk7Ci0JCWludCBlbmRUYWdPZmZzZXQgPSAoKEludGVnZXIpICgoT2JqZWN0W10pIGZBZGRpdGlvbmFsRml4SW5mbylbMl0pLmludFZhbHVlKCk7Ci0JCWludCBlbmRUYWdMZW5ndGggPSAoKEludGVnZXIpICgoT2JqZWN0W10pIGZBZGRpdGlvbmFsRml4SW5mbylbM10pLmludFZhbHVlKCk7Ci0KLQkJTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJaWYgKGVuZFRhZ09mZnNldCAhPSAtMSkgewotCQkJbXVsdGlUZXh0RWRpdC5hZGRDaGlsZChuZXcgRGVsZXRlRWRpdChlbmRUYWdPZmZzZXQsIGVuZFRhZ0xlbmd0aCkpOwotCQkJZlNlbGVjdGlvbiA9IG5ldyBQb2ludChlbmRUYWdPZmZzZXQsIDApOwotCQl9Ci0JCWlmIChzdGFydFRhZ09mZnNldCAhPSAtMSkgewotCQkJbXVsdGlUZXh0RWRpdC5hZGRDaGlsZChuZXcgRGVsZXRlRWRpdChzdGFydFRhZ09mZnNldCwgc3RhcnRUYWdMZW5ndGgpKTsKLQkJCWZTZWxlY3Rpb24gPSBuZXcgUG9pbnQoc3RhcnRUYWdPZmZzZXQsIDApOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCW11bHRpVGV4dEVkaXQuYXBwbHkodmlld2VyLmdldERvY3VtZW50KCkpOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3MgZmluZCByZWFzb25zIG5vdCB0by4KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyBmaW5kIHJlYXNvbnMgbm90IHRvLgotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0Q29udGV4dEluZm9ybWF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbiBnZXRDb250ZXh0SW5mb3JtYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0RGlzcGxheVN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgewotCQlpZiAoZkRpc3BsYXlTdHJpbmcgPT0gbnVsbCkgewotCQkJZkRpc3BsYXlTdHJpbmcgPSBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzExOwotCQl9Ci0KLQkJcmV0dXJuIGZEaXNwbGF5U3RyaW5nOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0SW1hZ2UoKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGZJbWFnZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlyZXR1cm4gZlNlbGVjdGlvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiNzZWxlY3RlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3RlZChJVGV4dFZpZXdlciB2aWV3ZXIsIGJvb2xlYW4gc21hcnRUb2dnbGUpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiN1bnNlbGVjdGVkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIpCi0JICovCi0JcHVibGljIHZvaWQgdW5zZWxlY3RlZChJVGV4dFZpZXdlciB2aWV3ZXIpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiN2YWxpZGF0ZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIGludCwgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9SZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9SZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjOTViMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUmVuYW1lSW5GaWxlUXVpY2tBc3Npc3RQcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZE1vZGVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkTW9kZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5MaW5rZWRQb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkUG9zaXRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IubGluay5FZGl0b3JMaW5rZWRNb2RlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLQotcHVibGljIGNsYXNzIFJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWwgaW1wbGVtZW50cyBJQ29tcGxldGlvblByb3Bvc2FsLCBJQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiB7Ci0JcHJvdGVjdGVkIElSZWdpb24gZlNlbGVjdGVkUmVnaW9uOyAvLyBpbml0aWFsaXplZCBieSBhcHBseSgpCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2FwcGx5KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KElEb2N1bWVudCBkb2N1bWVudCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI2FwcGx5KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBjaGFyLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseShJVGV4dFZpZXdlciB2aWV3ZXIsIGNoYXIgdHJpZ2dlciwgaW50IHN0YXRlTWFzaywgaW50IG9mZnNldCkgewotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJTGlua2VkUG9zaXRpb25Hcm91cCBncm91cCA9IG5ldyBMaW5rZWRQb3NpdGlvbkdyb3VwKCk7Ci0JCXRyeSB7Ci0JCQlpZiAodmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRWaWV3ZXIpIHsKLQkJCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgb2Zmc2V0KTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSA/IG51bGwgOiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQlncm91cC5hZGRQb3NpdGlvbihuZXcgTGlua2VkUG9zaXRpb24oZG9jdW1lbnQsIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgKyByZWdpb24uZ2V0U3RhcnQoKSwgcmVnaW9uLmdldFRleHRMZW5ndGgoKSwgMCkpOwotCi0JCQkJCWlmICgocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgJiYgKG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkpIHsKLQkJCQkJCXJlZ2lvbiA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQkJCWdyb3VwLmFkZFBvc2l0aW9uKG5ldyBMaW5rZWRQb3NpdGlvbihkb2N1bWVudCwgbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpICsgcmVnaW9uLmdldFN0YXJ0KCksIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIDEpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlyZWdpb24gPSAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpID8gbnVsbCA6IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCWlmICgocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgJiYgKG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSkgewotCQkJCQkJCUlUZXh0UmVnaW9uIHN0YXJ0VGFnTmFtZVJlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQkJCQlncm91cC5hZGRQb3NpdGlvbihuZXcgTGlua2VkUG9zaXRpb24oZG9jdW1lbnQsIG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpICsgc3RhcnRUYWdOYW1lUmVnaW9uLmdldFN0YXJ0KCksIHN0YXJ0VGFnTmFtZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIDApKTsKLQkJCQkJCQkJZ3JvdXAuYWRkUG9zaXRpb24obmV3IExpbmtlZFBvc2l0aW9uKGRvY3VtZW50LCBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSArIHJlZ2lvbi5nZXRTdGFydCgpLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpLCAxKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJZ3JvdXAuYWRkUG9zaXRpb24obmV3IExpbmtlZFBvc2l0aW9uKGRvY3VtZW50LCBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSArIHJlZ2lvbi5nZXRTdGFydCgpLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpLCAwKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBUT0RPIENvbXBsZXRpb25Qcm9wb3NhbFBvcHVwI2luc2VydFByb3Bvc2FsKCkgY2FsbHMKLQkJCQkvLyBJUmV3cml0ZVRhcmdldC5iZWdpbkNvbXBvdW5kQ2hhbmdlKCkKLQkJCQkvLyB3aGljaCBkaXNhYmxlcyByZWRyYXcgaW4gSVRleHRWaWV3ZXIuIFdvcmthcm91bmQgZm9yIG5vdy4KLQkJCQkoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIpLnNldFJlZHJhdyh0cnVlKTsKLQkJCX0KLQotCQkJTGlua2VkTW9kZU1vZGVsIGxpbmtlZE1vZGVNb2RlbCA9IG5ldyBMaW5rZWRNb2RlTW9kZWwoKTsKLQkJCWxpbmtlZE1vZGVNb2RlbC5hZGRHcm91cChncm91cCk7Ci0JCQlsaW5rZWRNb2RlTW9kZWwuZm9yY2VJbnN0YWxsKCk7Ci0KLQkJCUxpbmtlZE1vZGVVSSB1aSA9IG5ldyBFZGl0b3JMaW5rZWRNb2RlVUkobGlua2VkTW9kZU1vZGVsLCB2aWV3ZXIpOwotCQkJdWkuc2V0RXhpdFBvc2l0aW9uKHZpZXdlciwgb2Zmc2V0LCAwLCBMaW5rZWRQb3NpdGlvbkdyb3VwLk5PX1NUT1ApOwotCQkJdWkuZW50ZXIoKTsKLQotCQkJZlNlbGVjdGVkUmVnaW9uID0gdWkuZ2V0U2VsZWN0ZWRSZWdpb24oKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkgewotCQlyZXR1cm4gWE1MVUlNZXNzYWdlcy5SZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsXzA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRDb250ZXh0SW5mb3JtYXRpb24oKQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uIGdldENvbnRleHRJbmZvcm1hdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXREaXNwbGF5U3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiBYTUxVSU1lc3NhZ2VzLlJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWxfMTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCS8vIHJldHVybiBKYXZhUGx1Z2luSW1hZ2VzLmdldChKYXZhUGx1Z2luSW1hZ2VzLklNR19DT1JSRUNUSU9OX0xPQ0FMKTsKLQkJcmV0dXJuIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfTE9DQUxfVkFSSUFCTEUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0U2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRTZWxlY3Rpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXJldHVybiBuZXcgUG9pbnQoZlNlbGVjdGVkUmVnaW9uLmdldE9mZnNldCgpLCBmU2VsZWN0ZWRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI3NlbGVjdGVkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGVkKElUZXh0Vmlld2VyIHZpZXdlciwgYm9vbGVhbiBzbWFydFRvZ2dsZSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI3Vuc2VsZWN0ZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNlbGVjdGVkKElUZXh0Vmlld2VyIHZpZXdlcikgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotCSAqICAgICAgaW50LCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1N1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9TdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmFmZmM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1N1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5JbnNlcnRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBTdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbCBleHRlbmRzIFJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWwgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGNoYXIsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KElUZXh0Vmlld2VyIHZpZXdlciwgY2hhciB0cmlnZ2VyLCBpbnQgc3RhdGVNYXNrLCBpbnQgb2Zmc2V0KSB7Ci0JCXRyeSB7Ci0JCQlpbnQgc3RhcnRUYWdPZmZzZXQgPSBvZmZzZXQ7Ci0JCQlpbnQgZW5kVGFnT2Zmc2V0ID0gb2Zmc2V0ICsgdmlld2VyLmdldFNlbGVjdGVkUmFuZ2UoKS55OwotCi0JCQkvLyBzdXJyb3VuZCB0aGUgbm9kZSBpZiBubyBzZWxlY3Rpb24KLQkJCWlmIChzdGFydFRhZ09mZnNldCA9PSBlbmRUYWdPZmZzZXQpIHsKLQkJCQlJRE9NTm9kZSBjdXJzb3JOb2RlID0gKElET01Ob2RlKSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgb2Zmc2V0KTsKLQkJCQkvLyB1c2UgcGFyZW50IG5vZGUgaWYgdGV4dCBub2RlIGlzIGVtcHR5Ci0JCQkJaWYgKChjdXJzb3JOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChjdXJzb3JOb2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCQljdXJzb3JOb2RlID0gKElET01Ob2RlKSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQl9Ci0KLQkJCQlzdGFydFRhZ09mZnNldCA9IGN1cnNvck5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQllbmRUYWdPZmZzZXQgPSBjdXJzb3JOb2RlLmdldEVuZE9mZnNldCgpOwotCQkJfQotCi0JCQkvLyBpbnNlcnQgbmV3IGVsZW1lbnQKLQkJCU11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQkvLyBlbGVtZW50IHRhZyBuYW1lIGNhbm5vdCBiZSBEQkNTLCBkbyBub3QgdHJhbnNsYXRlICI8ZWxlbWVudD4iCi0JCQkvLyBhbmQgIjwvZWxlbWVudD4iCi0JCQltdWx0aVRleHRFZGl0LmFkZENoaWxkKG5ldyBJbnNlcnRFZGl0KHN0YXJ0VGFnT2Zmc2V0LCAiPGVsZW1lbnQ+IikpOyAvLyROT04tTkxTLTEkCi0JCQltdWx0aVRleHRFZGl0LmFkZENoaWxkKG5ldyBJbnNlcnRFZGl0KGVuZFRhZ09mZnNldCwgIjwvZWxlbWVudD4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW11bHRpVGV4dEVkaXQuYXBwbHkodmlld2VyLmdldERvY3VtZW50KCkpOwotCi0JCQkvLyBnZXQgbmV3IGVsZW1lbnQgbm9kZQotCQkJSURPTU5vZGUgbmV3RWxlbWVudE5vZGUgPSAoSURPTU5vZGUpIENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodmlld2VyLCBzdGFydFRhZ09mZnNldCk7Ci0KLQkJCS8vIGZvcm1hdCBuZXcgZWxlbWVudAotCQkJSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotCQkJZm9ybWF0UHJvY2Vzc29yLmZvcm1hdE5vZGUobmV3RWxlbWVudE5vZGUpOwotCi0JCQkvLyByZW5hbWUgbmV3IGVsZW1lbnQKLQkJCXN1cGVyLmFwcGx5KHZpZXdlciwgdHJpZ2dlciwgc3RhdGVNYXNrLCBuZXdFbGVtZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpICsgMSk7Ci0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkgewotCQlyZXR1cm4gWE1MVUlNZXNzYWdlcy5TdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbF8wOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0RGlzcGxheVN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gWE1MVUlNZXNzYWdlcy5TdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbF8xOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0SW1hZ2UoKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJLy8gcmV0dXJuIEphdmFQbHVnaW5JbWFnZXMuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX0NPUlJFQ1RJT05fTE9DQUwpOwotCQlyZXR1cm4gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BRERfQ09SUkVDVElPTik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vWE1MUXVpY2tBc3Npc3RQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1hNTFF1aWNrQXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NDllOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vWE1MUXVpY2tBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucXVpY2thc3Npc3QuSVF1aWNrQXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5hbWVkTm9kZU1hcEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFhNTFF1aWNrQXNzaXN0UHJvY2Vzc29yIGltcGxlbWVudHMgSVF1aWNrQXNzaXN0UHJvY2Vzc29yIHsKLQotCXB1YmxpYyBib29sZWFuIGNhbkFzc2lzdChJUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaXgoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVRdWlja0Fzc2lzdFByb3Bvc2FscyhJUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCkgewotCQlMaXN0IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlnZXRMb2NhbFJlbmFtZVF1aWNrQXNzaXN0UHJvcG9zYWwocHJvcG9zYWxzLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRTb3VyY2VWaWV3ZXIoKSwgaW52b2NhdGlvbkNvbnRleHQuZ2V0T2Zmc2V0KCkpOwotCQlnZXRTdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbChwcm9wb3NhbHMsIGludm9jYXRpb25Db250ZXh0LmdldFNvdXJjZVZpZXdlcigpLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRPZmZzZXQoKSk7Ci0JCWdldEluc2VydFJlcXVpcmVkQXR0cnMocHJvcG9zYWxzLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRTb3VyY2VWaWV3ZXIoKSwgaW52b2NhdGlvbkNvbnRleHQuZ2V0T2Zmc2V0KCkpOwotCi0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBwcm9wb3NhbHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtwcm9wb3NhbHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRJbnNlcnRSZXF1aXJlZEF0dHJzKExpc3QgcHJvcG9zYWxzLCBJU291cmNlVmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBnZXROb2RlQXQodmlld2VyLCBvZmZzZXQpOwotCQlpZiAoKG5vZGUgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpICYmIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCQlJRE9NTm9kZSBjdXJzb3JOb2RlID0gKElET01Ob2RlKSBnZXROb2RlQXQodmlld2VyLCBvZmZzZXQpOwotCQkJCUxpc3QgcmVxdWlyZWRBdHRycyA9IGdldFJlcXVpcmVkQXR0cnMoY3Vyc29yTm9kZSk7Ci0JCQkJaWYgKHJlcXVpcmVkQXR0cnMuc2l6ZSgpID4gMCkgewotCQkJCQlOYW1lZE5vZGVNYXAgY3VycmVudEF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCUxpc3QgaW5zZXJ0QXR0cnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWlmIChjdXJyZW50QXR0cnMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJaW5zZXJ0QXR0cnMuYWRkQWxsKHJlcXVpcmVkQXR0cnMpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1aXJlZEF0dHJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJU3RyaW5nIHJlcXVpcmVkQXR0ck5hbWUgPSAoKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIHJlcXVpcmVkQXR0cnMuZ2V0KGkpKS5nZXRBdHRyTmFtZSgpOwotCQkJCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGN1cnJlbnRBdHRycy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQkJCVN0cmluZyBjdXJyZW50QXR0ck5hbWUgPSBjdXJyZW50QXR0cnMuaXRlbShqKS5nZXROb2RlTmFtZSgpOwotCQkJCQkJCQlpZiAocmVxdWlyZWRBdHRyTmFtZS5jb21wYXJlVG9JZ25vcmVDYXNlKGN1cnJlbnRBdHRyTmFtZSkgPT0gMCkgewotCQkJCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKCFmb3VuZCkgewotCQkJCQkJCQlpbnNlcnRBdHRycy5hZGQocmVxdWlyZWRBdHRycy5nZXQoaSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoaW5zZXJ0QXR0cnMuc2l6ZSgpID4gMCkgewotCQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgSW5zZXJ0UmVxdWlyZWRBdHRyc1F1aWNrQXNzaXN0UHJvcG9zYWwoaW5zZXJ0QXR0cnMpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRMb2NhbFJlbmFtZVF1aWNrQXNzaXN0UHJvcG9zYWwoTGlzdCBwcm9wb3NhbHMsIElTb3VyY2VWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGdldE5vZGVBdCh2aWV3ZXIsIG9mZnNldCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlID09IG51bGwgPyBudWxsIDogbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUgPT0gbnVsbCA/IG51bGwgOiBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCWludCByZWdpb25UZXh0RW5kT2Zmc2V0ID0gMDsKLQkJaWYgKChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSAmJiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQlyZWdpb24gPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJcmVnaW9uVGV4dEVuZE9mZnNldCA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKTsKLQkJfQotCQllbHNlIGlmICgoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpICYmIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQlyZWdpb24gPSBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCXJlZ2lvblRleHRFbmRPZmZzZXQgPSBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pOwotCQl9Ci0KLQkJaWYgKChyZWdpb24gIT0gbnVsbCkgJiYgKChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB8fCAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpKSAmJiAob2Zmc2V0IDw9IHJlZ2lvblRleHRFbmRPZmZzZXQpKSB7Ci0JCQlwcm9wb3NhbHMuYWRkKG5ldyBSZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlyZXR1cm4gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSgoRG9jdW1lbnQpIG5vZGUpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFJlcXVpcmVkQXR0cnMoTm9kZSBub2RlKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IGdldE1vZGVsUXVlcnkobm9kZSk7Ci0JCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgbm9kZSk7Ci0JCQlpZiAoZWxlbWVudERlY2wgIT0gbnVsbCkgewotCQkJCUNNTmFtZWROb2RlTWFwIGF0dHJNYXAgPSBlbGVtZW50RGVjbC5nZXRBdHRyaWJ1dGVzKCk7Ci0KLQkJCQlDTU5hbWVkTm9kZU1hcEltcGwgYWxsQXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoYXR0ck1hcCk7Ci0JCQkJTGlzdCBub2RlcyA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEF2YWlsYWJsZUNvbnRlbnQoKEVsZW1lbnQpIG5vZGUsIGVsZW1lbnREZWNsLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBub2Rlcy5zaXplKCk7IGsrKykgewotCQkJCQlDTU5vZGUgY21ub2RlID0gKENNTm9kZSkgbm9kZXMuZ2V0KGspOwotCQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCQkJYWxsQXR0cmlidXRlcy5wdXQoY21ub2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlhdHRyTWFwID0gYWxsQXR0cmlidXRlczsKLQkJCQkKLQkJCQlJdGVyYXRvciBpdCA9IGF0dHJNYXAuaXRlcmF0b3IoKTsKLQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBudWxsOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJYXR0ciA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChhdHRyLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgewotCQkJCQkJcmVzdWx0LmFkZChhdHRyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFN1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsKExpc3QgcHJvcG9zYWxzLCBJU291cmNlVmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBnZXROb2RlQXQodmlld2VyLCBvZmZzZXQpOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlwcm9wb3NhbHMuYWRkKG5ldyBTdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNsb3Nlc3QgSW5kZXhlZFJlZ2lvbiBmb3IgdGhlIG9mZnNldCBhbmQgdmlld2VyIGFsbG93aW5nCi0JICogZm9yIGRpZmZlcmVuY2VzIGJldHdlZW4gdmlld2VyIG9mZnNldHMgYW5kIG1vZGVsIHBvc2l0aW9ucy4gbm90ZTogdGhpcwotCSAqIG1ldGhvZCByZXR1cm5zIGFuIEluZGV4ZWRSZWdpb24gZm9yIHJlYWQgb25seQotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgd2hvc2UgZG9jdW1lbnQgaXMgdXNlZCB0byBjb21wdXRlIHRoZSBwcm9wb3NhbHMKLQkgKiBAcGFyYW0gZG9jdW1lbnRPZmZzZXQKLQkgKiAgICAgICAgICAgIGFuIG9mZnNldCB3aXRoaW4gdGhlIGRvY3VtZW50IGZvciB3aGljaCBjb21wbGV0aW9ucyBzaG91bGQKLQkgKiAgICAgICAgICAgIGJlIGNvbXB1dGVkCi0JICogQHJldHVybiBhbiBJbmRleGVkUmVnaW9uCi0JICovCi0JcHJpdmF0ZSBJbmRleGVkUmVnaW9uIGdldE5vZGVBdChJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQkvLyBjb3BpZWQgZnJvbSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KCkKLQkJaWYgKHZpZXdlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSW5kZXhlZFJlZ2lvbiBub2RlID0gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtbSA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlpZiAobW0gIT0gbnVsbCkKLQkJCW1vZGVsID0gbW0uZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQodmlld2VyLmdldERvY3VtZW50KCkpOwotCQl0cnkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlpbnQgbGFzdE9mZnNldCA9IGRvY3VtZW50T2Zmc2V0OwotCQkJCW5vZGUgPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50T2Zmc2V0KTsKLQkJCQl3aGlsZSAobm9kZSA9PSBudWxsICYmIGxhc3RPZmZzZXQgPj0gMCkgewotCQkJCQlsYXN0T2Zmc2V0LS07Ci0JCQkJCW5vZGUgPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGxhc3RPZmZzZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRBdHRyaWJ1dGVEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRBdHRyaWJ1dGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk1YWY4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0QXR0cmlidXRlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlhNTENvbW1vblVJQ29udGV4dElkczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0QXR0cmlidXRlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCXByb3RlY3RlZCBBdHRyIGF0dHJpYnV0ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZU5hbWU7Ci0JcHJvdGVjdGVkIFRleHQgYXR0cmlidXRlTmFtZUZpZWxkOwotCXByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0JcHJvdGVjdGVkIFRleHQgYXR0cmlidXRlVmFsdWVGaWVsZDsKLQlwcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLQlwcm90ZWN0ZWQgRWxlbWVudCBvd25lckVsZW1lbnQ7Ci0KLQlwdWJsaWMgRWRpdEF0dHJpYnV0ZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgRWxlbWVudCBvd25lckVsZW1lbnQsIEF0dHIgYXR0cmlidXRlKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJdGhpcy5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7Ci0JCXRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQlhdHRyaWJ1dGVOYW1lID0gZ2V0TW9kZWxWYWx1ZShhdHRyaWJ1dGVOYW1lRmllbGQuZ2V0VGV4dCgpKTsKLQkJCWF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlVmFsdWVGaWVsZC5nZXRUZXh0KCk7Ci0JCX0KLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJYXR0cmlidXRlTmFtZUZpZWxkLmZvcmNlRm9jdXMoKTsKLQkJYXR0cmlidXRlTmFtZUZpZWxkLnNlbGVjdEFsbCgpOwotCQl1cGRhdGVFcnJvck1lc3NhZ2UoKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlhbG9nQXJlYSwgWE1MQ29tbW9uVUlDb250ZXh0SWRzLlhDVUlfQVRUUklCVVRFX0RJQUxPRyk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vCi0JCS8vIFN0eWxlIGNvbnZlbmllbmNlIGNvbnN0YW50cwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJTGFiZWwgYXR0cmlidXRlTmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlhdHRyaWJ1dGVOYW1lTGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FX0NPTE9OKTsKLQotCQlhdHRyaWJ1dGVOYW1lRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2Qud2lkdGhIaW50ID0gMzAwOwotCQlhdHRyaWJ1dGVOYW1lRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWF0dHJpYnV0ZU5hbWVGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShhdHRyaWJ1dGUgIT0gbnVsbCA/IGF0dHJpYnV0ZS5nZXROYW1lKCkgOiAiIikpOyAvLyROT04tTkxTLTEkCi0JCWF0dHJpYnV0ZU5hbWVGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQotCQlMYWJlbCBhdHRyaWJ1dGVWYWx1ZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlhdHRyaWJ1dGVWYWx1ZUxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfVkFMVUVfQ09MT04pOwotCi0JCVN0cmluZyB2YWx1ZSA9IGF0dHJpYnV0ZSAhPSBudWxsID8gYXR0cmlidXRlLmdldFZhbHVlKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgc3R5bGUgPSBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUjsKLQkJaWYgKHZhbHVlLmluZGV4T2YoIlxuIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJc3R5bGUgPSBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMOwotCQl9Ci0KLQkJYXR0cmlidXRlVmFsdWVGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgc3R5bGUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQgPSAzMDA7Ci0JCWF0dHJpYnV0ZVZhbHVlRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWF0dHJpYnV0ZVZhbHVlRmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoYXR0cmlidXRlICE9IG51bGwgPyBhdHRyaWJ1dGUuZ2V0VmFsdWUoKSA6ICIiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBlcnJvciBtZXNzYWdlCi0JCWVycm9yTWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuZXJyb3JfbWVzc2FnZV9nb2VzX2hlcmUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQgPSAyMDA7Ci0JCWdkLmhlaWdodEhpbnQgPSBNYXRoLm1heCgzMCwgZXJyb3JNZXNzYWdlTGFiZWwuY29tcHV0ZVNpemUoMCwgMCwgZmFsc2UpLnkgKiAyKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZXJyb3JNZXNzYWdlTGFiZWwuZ2V0RGlzcGxheSgpLCAyMDAsIDAsIDApOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVWYWx1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpc3BsYXlWYWx1ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmcgIT0gbnVsbCA/IHN0cmluZyA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2RlbFZhbHVlKFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmICgoc3RyaW5nICE9IG51bGwpICYmIChzdHJpbmcudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLQkJCXJlc3VsdCA9IHN0cmluZzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQl1cGRhdGVFcnJvck1lc3NhZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFcnJvck1lc3NhZ2UoKSB7Ci0JCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCQlTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZU5hbWVGaWVsZC5nZXRUZXh0KCkudHJpbSgpOwotCQlpZiAobmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCUF0dHIgbWF0Y2hpbmdBdHRyaWJ1dGUgPSBvd25lckVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShuYW1lKTsKLQkJCWlmICgobWF0Y2hpbmdBdHRyaWJ1dGUgIT0gbnVsbCkgJiYgKG1hdGNoaW5nQXR0cmlidXRlICE9IGF0dHJpYnV0ZSkpIHsKLQkJCQllcnJvck1lc3NhZ2UgPSBYTUxVSU1lc3NhZ2VzLl9FUlJPUl9YTUxfQVRUUklCVVRFX0FMUkVBRFlfRVhJU1RTOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gVE9ETyBnZXQgY2hlY2tOYW1lIGZyb20gTW9kZWwKLQkJCQkvLyBlcnJvck1lc3NhZ2UgPSBWYWxpZGF0ZUhlbHBlci5jaGVja1hNTE5hbWUobmFtZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQllcnJvck1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChlcnJvck1lc3NhZ2UgIT0gbnVsbCA/IGVycm9yTWVzc2FnZSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQllcnJvck1lc3NhZ2VMYWJlbC5nZXRQYXJlbnQoKS5sYXlvdXQoKTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChlcnJvck1lc3NhZ2UgPT0gbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdERvY3R5cGVEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXREb2N0eXBlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMDcxYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdERvY3R5cGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoJICAgRGF2aWQgU2NobmVpZGVyLCBkYXZpZC5zY2huZWlkZXJAdW5pc3lzLmNvbSAtIFsxNDI1MDBdIFdUUCBwcm9wZXJ0aWVzIHBhZ2VzIGZvbnRzIGRvbid0IGZvbGxvdyBFY2xpcHNlIHByZWZlcmVuY2VzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWwuWE1MQ29tbW9uVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLQotcHVibGljIGNsYXNzIEVkaXREb2N0eXBlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb21wdXRlU3lzdGVtSWQ7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIGRvY3R5cGVEYXRhOwotCXByb3RlY3RlZCBib29sZWFuIGVycm9yQ2hlY2tpbmc7Ci0JcHJvdGVjdGVkIExhYmVsIGVycm9yTWVzc2FnZUxhYmVsOwotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBwdWJsaWNJZEJyb3dzZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgVGV4dCBwdWJsaWNJZEZpZWxkOwotCXByb3RlY3RlZCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uOwotCXByb3RlY3RlZCBUZXh0IHJvb3RFbGVtZW50TmFtZUZpZWxkOwotCXByb3RlY3RlZCBCdXR0b24gc3lzdGVtSWRCcm93c2VCdXR0b247Ci0JcHJvdGVjdGVkIFRleHQgc3lzdGVtSWRGaWVsZDsKLQotCXB1YmxpYyBFZGl0RG9jdHlwZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgRG9jdW1lbnRUeXBlIGRvY3R5cGUpIHsKLQkJdGhpcyhwYXJlbnRTaGVsbCwgZG9jdHlwZS5nZXROYW1lKCksIGRvY3R5cGUuZ2V0UHVibGljSWQoKSwgZG9jdHlwZS5nZXRTeXN0ZW1JZCgpKTsKLQl9Ci0KLQlwdWJsaWMgRWRpdERvY3R5cGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCWRvY3R5cGVEYXRhID0gbmV3IFN0cmluZ1szXTsKLQkJZG9jdHlwZURhdGFbMF0gPSBuYW1lOwotCQlkb2N0eXBlRGF0YVsxXSA9IHB1YmxpY0lkOwotCQlkb2N0eXBlRGF0YVsyXSA9IHN5c3RlbUlkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWRvY3R5cGVEYXRhWzBdID0gZ2V0TW9kZWxWYWx1ZShyb290RWxlbWVudE5hbWVGaWVsZC5nZXRUZXh0KCkpOwotCQlkb2N0eXBlRGF0YVsxXSA9IGdldE1vZGVsVmFsdWUocHVibGljSWRGaWVsZC5nZXRUZXh0KCkpOwotCQlkb2N0eXBlRGF0YVsyXSA9IGdldE1vZGVsVmFsdWUoc3lzdGVtSWRGaWVsZC5nZXRUZXh0KCkpOwotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgY29udHJvbCA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCXVwZGF0ZUVycm9yTWVzc2FnZSgpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0NvbnRyb2wgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlhbG9nQ29udHJvbCwgWE1MQ29tbW9uVUlDb250ZXh0SWRzLlhDVUlfRE9DVFlQRV9ESUFMT0cpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ0NvbnRyb2wsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0KLQkJTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgPT0gc3lzdGVtSWRGaWVsZCkgewotCQkJCQljb21wdXRlU3lzdGVtSWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gcm93IDEKLQkJLy8KLQkJTGFiZWwgcm9vdEVsZW1lbnROYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXJvb3RFbGVtZW50TmFtZUxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfUk9PVF9FTEVNRU5UX05BTUVfQ09MT04pOwotCi0JCXJvb3RFbGVtZW50TmFtZUZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocm9vdEVsZW1lbnROYW1lRmllbGQsIFhNTENvbW1vblVJQ29udGV4dElkcy5YQ1VJX0RPQ1RZUEVfUk9PVCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLndpZHRoSGludCA9IDIwMDsKLQkJcm9vdEVsZW1lbnROYW1lRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJvb3RFbGVtZW50TmFtZUZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGRvY3R5cGVEYXRhWzBdKSk7Ci0JCXJvb3RFbGVtZW50TmFtZUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCQlMYWJlbCBwbGFjZUhvbGRlciA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcGxhY2VIb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0KLQkJLy8gcm93IDIKLQkJLy8KLQkJTGFiZWwgcHVibGljSWRMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcHVibGljSWRMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1BVQkxJQ19JRF9DT0xPTik7Ci0KLQkJcHVibGljSWRGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHB1YmxpY0lkRmllbGQsIFhNTENvbW1vblVJQ29udGV4dElkcy5YQ1VJX0RPQ1RZUEVfUFVCTElDKTsKLQkJcHVibGljSWRGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcHVibGljSWRGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShkb2N0eXBlRGF0YVsxXSkpOwotCi0JCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJRWRpdEVudGl0eUhlbHBlciBoZWxwZXIgPSBuZXcgRWRpdEVudGl0eUhlbHBlcigpOwotCQkJCWlmIChlLndpZGdldCA9PSBwdWJsaWNJZEJyb3dzZUJ1dHRvbikgewotCQkJCQloZWxwZXIucGVyZm9ybUJyb3dzZUZvclB1YmxpY0lkKGdldFNoZWxsKCksIHB1YmxpY0lkRmllbGQsIGNvbXB1dGVTeXN0ZW1JZCA/IHN5c3RlbUlkRmllbGQgOiBudWxsKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZS53aWRnZXQgPT0gc3lzdGVtSWRCcm93c2VCdXR0b24pIHsKLQkJCQkJaGVscGVyLnBlcmZvcm1Ccm93c2VGb3JTeXN0ZW1JZChnZXRTaGVsbCgpLCBzeXN0ZW1JZEZpZWxkLCByZXNvdXJjZUxvY2F0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJcHVibGljSWRCcm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlwdWJsaWNJZEJyb3dzZUJ1dHRvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0JST1dTRSk7Ci0JCXB1YmxpY0lkQnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQkvLyByb3cgMwotCQlMYWJlbCBzeXN0ZW1JZExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzeXN0ZW1JZExhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfU1lTVEVNX0lEX0NPTE9OKTsKLQotCQlzeXN0ZW1JZEZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc3lzdGVtSWRGaWVsZCwgWE1MQ29tbW9uVUlDb250ZXh0SWRzLlhDVUlfRE9DVFlQRV9TWVNURU0pOwotCQlzeXN0ZW1JZEZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzeXN0ZW1JZEZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGRvY3R5cGVEYXRhWzJdKSk7Ci0JCXN5c3RlbUlkRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCi0KLQkJc3lzdGVtSWRCcm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzeXN0ZW1JZEJyb3dzZUJ1dHRvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0JST1dTRSk7Ci0JCXN5c3RlbUlkQnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQkvLyBlcnJvciBtZXNzYWdlCi0JCWVycm9yTWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGRpYWxvZ0NvbnRyb2wsIFNXVC5OT05FKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGVycm9yTWVzc2FnZUxhYmVsLmdldERpc3BsYXkoKSwgMjAwLCAwLCAwKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0KLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlyZXR1cm4gZGlhbG9nQ29udHJvbDsKLQl9Ci0KLQotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVNZXNzYWdlQXJlYShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkvLyBsYWJlbC5zZXRUZXh0KG1lc3NhZ2UpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpc3BsYXlWYWx1ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmcgIT0gbnVsbCA/IHN0cmluZyA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0RXJyb3JDaGVja2luZygpIHsKLQkJcmV0dXJuIGVycm9yQ2hlY2tpbmc7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZGVsVmFsdWUoU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKChzdHJpbmcgIT0gbnVsbCkgJiYgKHN0cmluZy50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotCQkJcmVzdWx0ID0gc3RyaW5nOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZG9jdHlwZURhdGFbMF07Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJcmV0dXJuIGRvY3R5cGVEYXRhWzFdOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0JCXJldHVybiBkb2N0eXBlRGF0YVsyXTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21wdXRlU3lzdGVtSWQoYm9vbGVhbiBjb21wdXRlU3lzdGVtSWQpIHsKLQkJdGhpcy5jb21wdXRlU3lzdGVtSWQgPSBjb21wdXRlU3lzdGVtSWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JDaGVja2luZyhib29sZWFuIGVycm9yQ2hlY2tpbmcpIHsKLQkJdGhpcy5lcnJvckNoZWNraW5nID0gZXJyb3JDaGVja2luZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUxvY2F0aW9uKElQYXRoIHBhdGgpIHsKLQkJcmVzb3VyY2VMb2NhdGlvbiA9IHBhdGg7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKCkgewotCQlpZiAoZXJyb3JDaGVja2luZykgewotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCQlpZiAoZ2V0TW9kZWxWYWx1ZShzeXN0ZW1JZEZpZWxkLmdldFRleHQoKSkgPT0gbnVsbCkgewotCQkJCWVycm9yTWVzc2FnZSA9IFhNTFVJTWVzc2FnZXMuX1VJX1dBUk5JTkdfU1lTVEVNX0lEX01VU1RfQkVfU1BFQ0lGSUVEOwotCQkJfQotCQkJZWxzZSBpZiAoZ2V0TW9kZWxWYWx1ZShyb290RWxlbWVudE5hbWVGaWVsZC5nZXRUZXh0KCkpID09IG51bGwpIHsKLQkJCQllcnJvck1lc3NhZ2UgPSBYTUxVSU1lc3NhZ2VzLl9VSV9XQVJOSU5HX1JPT1RfRUxFTUVOVF9NVVNUX0JFX1NQRUNJRklFRDsKLQkJCX0KLQotCQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChlcnJvck1lc3NhZ2UgIT0gbnVsbCA/IGVycm9yTWVzc2FnZSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJb2tCdXR0b24uc2V0RW5hYmxlZChlcnJvck1lc3NhZ2UgPT0gbnVsbCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0RWxlbWVudERpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdEVsZW1lbnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRhZDM4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0RWxlbWVudERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLk5hbWVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5YTUxDb21tb25VSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEVkaXRFbGVtZW50RGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCXByb3RlY3RlZCBFbGVtZW50IGVsZW1lbnQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBlbGVtZW50TmFtZTsKLQlwcm90ZWN0ZWQgVGV4dCBlbGVtZW50TmFtZUZpZWxkOwotCXByb3RlY3RlZCBMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCi0JcHVibGljIEVkaXRFbGVtZW50RGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQllbGVtZW50TmFtZSA9IGdldE1vZGVsVmFsdWUoZWxlbWVudE5hbWVGaWVsZC5nZXRUZXh0KCkpOwotCQl9Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJZWxlbWVudE5hbWVGaWVsZC5mb3JjZUZvY3VzKCk7Ci0JCWVsZW1lbnROYW1lRmllbGQuc2VsZWN0QWxsKCk7Ci0JCXVwZGF0ZUVycm9yTWVzc2FnZSgpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChkaWFsb2dBcmVhLCBYTUxDb21tb25VSUNvbnRleHRJZHMuWENVSV9FTEVNRU5UX0RJQUxPRyk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJTGFiZWwgZWxlbWVudE5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZWxlbWVudE5hbWVMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0VMRU1FTlRfTkFNRSk7Ci0KLQkJZWxlbWVudE5hbWVGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQgPSAyMDA7Ci0JCWVsZW1lbnROYW1lRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWVsZW1lbnROYW1lRmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoZWxlbWVudCAhPSBudWxsID8gZWxlbWVudC5nZXROb2RlTmFtZSgpIDogIiIpKTsgLy8kTk9OLU5MUy0xJAotCQllbGVtZW50TmFtZUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIGVycm9yIG1lc3NhZ2UKLQkJZXJyb3JNZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5lcnJvcl9tZXNzYWdlX2dvZXNfaGVyZSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGVycm9yTWVzc2FnZUxhYmVsLmdldERpc3BsYXkoKSwgMjAwLCAwLCAwKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0KLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaXNwbGF5VmFsdWUoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nICE9IG51bGwgPyBzdHJpbmcgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBlbGVtZW50TmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZGVsVmFsdWUoU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKChzdHJpbmcgIT0gbnVsbCkgJiYgKHN0cmluZy50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotCQkJcmVzdWx0ID0gc3RyaW5nOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCXVwZGF0ZUVycm9yTWVzc2FnZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUVycm9yTWVzc2FnZSgpIHsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCVN0cmluZyBuYW1lID0gZWxlbWVudE5hbWVGaWVsZC5nZXRUZXh0KCk7Ci0JCS8vIFN0cmluZyBuYW1lID0gZWxlbWVudE5hbWVGaWVsZC5nZXRUZXh0KCkudHJpbSgpOwotCQlpZiAobmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCS8vIFRPRE8gdXNlIGNoZWNrTmFtZSBmcm9tIG1vZGVsIGxldmVsCi0JCQkvLyBlcnJvck1lc3NhZ2UgPSBWYWxpZGF0ZUhlbHBlci5jaGVja1hNTE5hbWUobmFtZSk7Ci0JCQlpZiAoIU5hbWVWYWxpZGF0b3IuaXNWYWxpZChuYW1lKSkgewotCQkJCWVycm9yTWVzc2FnZSA9IFhNTFVJTWVzc2FnZXMuX1VJX0lOVkFMSURfTkFNRTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWVycm9yTWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KGVycm9yTWVzc2FnZSAhPSBudWxsID8gZXJyb3JNZXNzYWdlIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCW9rQnV0dG9uLnNldEVuYWJsZWQoZXJyb3JNZXNzYWdlID09IG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRFbnRpdHlIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRFbnRpdHlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVlYjY0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0RW50aXR5SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRWRpdEVudGl0eUhlbHBlciB7Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQnJvd3NlRm9yUHVibGljSWQoU2hlbGwgcGFyZW50U2hlbGwsIFRleHQgcHVibGljSWRGaWVsZCkgewotCQlwZXJmb3JtQnJvd3NlRm9yUHVibGljSWQocGFyZW50U2hlbGwsIHB1YmxpY0lkRmllbGQsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1Ccm93c2VGb3JQdWJsaWNJZChTaGVsbCBwYXJlbnRTaGVsbCwgVGV4dCBwdWJsaWNJZEZpZWxkLCBUZXh0IHN5c3RlbUlkRmllbGQpIHsKLQkJU3RyaW5nW10gZXh0ZW5zaW9ucyA9IHsiZHRkIiwgInR4dCJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU2VsZWN0WE1MQ2F0YWxvZ0lkRGlhbG9nIGRpYWxvZyA9IG5ldyBTZWxlY3RYTUxDYXRhbG9nSWREaWFsb2cocGFyZW50U2hlbGwsIGV4dGVuc2lvbnMpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfU0VMRUNUX1hNTF9DQVRBTE9HX0VOVFJZKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cub3BlbigpOwotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCVN0cmluZyBpZCA9IGRpYWxvZy5nZXRJZCgpOwotCQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCQlwdWJsaWNJZEZpZWxkLnNldFRleHQoaWQpOwotCQkJCWlmICgoc3lzdGVtSWRGaWVsZCAhPSBudWxsKSAmJiAoZGlhbG9nLmdldFN5c3RlbUlkKCkgIT0gbnVsbCkpIHsKLQkJCQkJc3lzdGVtSWRGaWVsZC5zZXRUZXh0KGRpYWxvZy5nZXRTeXN0ZW1JZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQnJvd3NlRm9yU3lzdGVtSWQoU2hlbGwgcGFyZW50U2hlbGwsIFRleHQgc3lzdGVtSWRGaWVsZCwgSVBhdGggcmVzb3VyY2VMb2NhdGlvbikgewotCQlTdHJpbmdbXSBleHRlbnNpb25zID0geyJkdGQifTsgLy8kTk9OLU5MUy0xJAotCQlTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2cgZGlhbG9nID0gbmV3IFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZERpYWxvZyhwYXJlbnRTaGVsbCwgZXh0ZW5zaW9ucywgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTSk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9TUEVDSUZZX1NZU1RFTV9JRCk7Ci0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlTdHJpbmcgaWQgPSBkaWFsb2cuZ2V0SWQoKTsKLQkJCUlGaWxlIGZpbGUgPSBkaWFsb2cuZ2V0RmlsZSgpOwotCQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCQlzeXN0ZW1JZEZpZWxkLnNldFRleHQoaWQpOwotCQkJfQotCQkJZWxzZSBpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHVyaSA9IG51bGw7Ci0JCQkJaWYgKHJlc291cmNlTG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQl1cmkgPSBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkoZmlsZS5nZXRMb2NhdGlvbigpLCByZXNvdXJjZUxvY2F0aW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXVyaSA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQkJfQotCQkJCXN5c3RlbUlkRmllbGQuc2V0VGV4dCh1cmkpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdE5hbWVzcGFjZUluZm9EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXROYW1lc3BhY2VJbmZvRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZTgzMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdE5hbWVzcGFjZUluZm9EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNvbnRlbnRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5YTUxDb21tb25VSUNvbnRleHRJZHM7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwdWJsaWMgc3RhdGljIEVkaXROYW1lc3BhY2VJbmZvRGlhbG9nIGludm9rZURpYWxvZyhTaGVsbCBzaGVsbCwgU3RyaW5nIHRpdGxlLCBOYW1lc3BhY2VJbmZvIGluZm8sIElQYXRoIHJlc291cmNlTG9jYXRpb24pIHsKLQkJRWRpdE5hbWVzcGFjZUluZm9EaWFsb2cgZGlhbG9nID0gbmV3IEVkaXROYW1lc3BhY2VJbmZvRGlhbG9nKHNoZWxsLCBpbmZvKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cuc2V0UmVzb3VyY2VMb2NhdGlvbihyZXNvdXJjZUxvY2F0aW9uKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuIGRpYWxvZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTWVzc2FnZTsKLQotCXByb3RlY3RlZCBMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbDsKLQlwcm90ZWN0ZWQgTmFtZXNwYWNlSW5mbyBmSW5mbzsKLQlwcm90ZWN0ZWQgVGV4dCBsb2NhdGlvbkhpbnRGaWVsZDsKLQotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0JcHJvdGVjdGVkIFRleHQgcHJlZml4RmllbGQ7Ci0JcHJvdGVjdGVkIElQYXRoIHJlc291cmNlTG9jYXRpb247Ci0JcHJvdGVjdGVkIFRleHQgdXJpRmllbGQ7Ci0KLQlwdWJsaWMgRWRpdE5hbWVzcGFjZUluZm9EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIE5hbWVzcGFjZUluZm8gaW5mbykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCXRoaXMuZkluZm8gPSBpbmZvOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQlmSW5mby51cmkgPSB1cmlGaWVsZC5nZXRUZXh0KCk7Ci0JCQlmSW5mby5wcmVmaXggPSBwcmVmaXhGaWVsZC5nZXRUZXh0KCk7Ci0JCQlmSW5mby5sb2NhdGlvbkhpbnQgPSBsb2NhdGlvbkhpbnRGaWVsZC5nZXRUZXh0KCk7Ci0JCX0KLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29tcHV0ZUVycm9yTWVzc2FnZSgpIHsKLQkJZXJyb3JNZXNzYWdlID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCQl1cGRhdGVXaWRnZXRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dzdWJBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRpYWxvZ3N1YkFyZWEsIFhNTENvbW1vblVJQ29udGV4dElkcy5YQ1VJX05BTUVTUEFDRV9ESUFMT0cpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ3N1YkFyZWEsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQgPSAzNTA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXVwZGF0ZVdpZGdldHMoKTsKLQkJCX0KLQkJfTsKLQotCi0JCS8vIHJvdyAxCi0JCS8vCi0JCUxhYmVsIHVyaUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl1cmlMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX05BTUVTUEFDRV9OQU1FX0NPTE9OKTsKLQotCQl1cmlGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdXJpRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXVyaUZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGZJbmZvLnVyaSkpOwotCQl1cmlGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCXVyaUZpZWxkLnNldEVuYWJsZWQoZkluZm8uZ2V0UHJvcGVydHkoInVyaS1yZWFkT25seSIpID09IG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gbmV2ZXIgcmVhZAotCQlMYWJlbCBwbGFjZUhvbGRlcjEgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXBsYWNlSG9sZGVyMS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHJvdyAyCi0JCS8vCi0JCUxhYmVsIHByZWZpeExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlwcmVmaXhMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1BSRUZJWF9DT0xPTik7Ci0KLQkJcHJlZml4RmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXByZWZpeEZpZWxkLnNldExheW91dERhdGEoZ2QpOwotCQlwcmVmaXhGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShmSW5mby5wcmVmaXgpKTsKLQkJcHJlZml4RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQlwcmVmaXhGaWVsZC5zZXRFbmFibGVkKGZJbmZvLmdldFByb3BlcnR5KCJwcmVmaXgtcmVhZE9ubHkiKSA9PSBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIG5ldmVyIHJlYWQKLQkJTGFiZWwgcGxhY2VIb2xkZXIyID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlwbGFjZUhvbGRlcjIuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyByb3cgMwotCQkvLwotCQlMYWJlbCBsb2NhdGlvbkhpbnRMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbG9jYXRpb25IaW50TGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9MT0NBVElPTl9ISU5UX0NPTE9OKTsKLQotCQlsb2NhdGlvbkhpbnRGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJbG9jYXRpb25IaW50RmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWxvY2F0aW9uSGludEZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGZJbmZvLmxvY2F0aW9uSGludCkpOwotCQlsb2NhdGlvbkhpbnRGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCWxvY2F0aW9uSGludEZpZWxkLnNldEVuYWJsZWQoZkluZm8uZ2V0UHJvcGVydHkoImxvY2F0aW9uSGludC1yZWFkT25seSIpID09IG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwZXJmb3JtQnJvd3NlKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfQlJPV1NFKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQobG9jYXRpb25IaW50RmllbGQuZ2V0RW5hYmxlZCgpKTsKLQotCQkvLyBlcnJvciBtZXNzYWdlCi0JCWVycm9yTWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGRpYWxvZ3N1YkFyZWEsIFNXVC5OT05FKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLmVycm9yX21lc3NhZ2VfZ29lc19oZXJlKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGVycm9yTWVzc2FnZUxhYmVsLmdldERpc3BsYXkoKSwgMjAwLCAwLCAwKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0KLQkJcmV0dXJuIGRpYWxvZ3N1YkFyZWE7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaXNwbGF5VmFsdWUoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nICE9IG51bGwgPyBzdHJpbmcgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1Ccm93c2UoKSB7Ci0JCVN0cmluZ1tdIGV4dGVuc2lvbnMgPSB7Ii54c2QifTsgLy8kTk9OLU5MUy0xJAotCQlTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2cgZGlhbG9nID0gbmV3IFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZERpYWxvZyhnZXRTaGVsbCgpLCBleHRlbnNpb25zKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1NFTEVDVF9GSUxFKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cub3BlbigpOwotCi0JCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJU3RyaW5nIGdyYW1tYXJVUkkgPSBudWxsOwotCQkJSUZpbGUgZmlsZSA9IGRpYWxvZy5nZXRGaWxlKCk7Ci0JCQlTdHJpbmcgaWQgPSBkaWFsb2cuZ2V0SWQoKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdXJpID0gbnVsbDsKLQkJCQlpZiAocmVzb3VyY2VMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihyZXNvdXJjZUxvY2F0aW9uKTsKLQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCUlQYXRoIGxvY2F0aW9uID0gcmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJdXJpID0gVVJJSGVscGVyLmdldFJlbGF0aXZlVVJJKGZpbGUuZ2V0TG9jYXRpb24oKSwgbG9jYXRpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWdyYW1tYXJVUkkgPSBmaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdXJpID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJCQkJZ3JhbW1hclVSSSA9IHVyaTsKLQkJCQl9Ci0JCQkJbG9jYXRpb25IaW50RmllbGQuc2V0VGV4dCh1cmkpOwotCQkJfQotCQkJZWxzZSBpZiAoaWQgIT0gbnVsbCkgewotCQkJCWxvY2F0aW9uSGludEZpZWxkLnNldFRleHQoaWQpOwotCQkJCVVSSVJlc29sdmVyIHJlc29sdmVyID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKTsKLQkJCQlncmFtbWFyVVJJID0gcmVzb2x2ZXIucmVzb2x2ZShudWxsLCBpZCwgaWQpOwotCQkJfQotCi0KLQkJCUNNRG9jdW1lbnQgZG9jdW1lbnQgPSBDb250ZW50TW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuY3JlYXRlQ01Eb2N1bWVudChVUklIZWxwZXIuZ2V0VVJJRm9yRmlsZVBhdGgoZ3JhbW1hclVSSSksICJ4c2QiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCUxpc3QgbmFtZXNwYWNlSW5mb0xpc3QgPSAoTGlzdCkgZG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9uYW1lc3BhY2VJbmZvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZihuYW1lc3BhY2VJbmZvTGlzdCAhPSBudWxsKSB7Ci0JCQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBuYW1lc3BhY2VJbmZvTGlzdC5nZXQoMCk7Ci0JCQkJCWlmKGluZm8gIT0gbnVsbCkgewotCQkJCQkJaWYgKCh1cmlGaWVsZC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApICYmIChpbmZvLnVyaSAhPSBudWxsKSkgewotCQkJCQkJCXVyaUZpZWxkLnNldFRleHQoaW5mby51cmkpOwotCQkJCQkJfQotCQkJCQkJaWYgKChwcmVmaXhGaWVsZC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApICYmIChpbmZvLnByZWZpeCAhPSBudWxsKSkgewotCQkJCQkJCXByZWZpeEZpZWxkLnNldFRleHQoaW5mby5wcmVmaXgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VMb2NhdGlvbihJUGF0aCBwYXRoKSB7Ci0JCXJlc291cmNlTG9jYXRpb24gPSBwYXRoOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUVycm9yTWVzc2FnZUxhYmVsKCkgewotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KGVycm9yTWVzc2FnZSAhPSBudWxsID8gZXJyb3JNZXNzYWdlIDogIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlT0tCdXR0b25TdGF0ZSgpIHsKLQkJaWYgKG9rQnV0dG9uICE9IG51bGwpIHsKLQkJCWlmICgodXJpRmllbGQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSAmJiAocHJlZml4RmllbGQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSAmJiAobG9jYXRpb25IaW50RmllbGQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJb2tCdXR0b24uc2V0RW5hYmxlZChlcnJvck1lc3NhZ2UgPT0gbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVXaWRnZXRzKCkgewotCQljb21wdXRlRXJyb3JNZXNzYWdlKCk7Ci0JCXVwZGF0ZUVycm9yTWVzc2FnZUxhYmVsKCk7Ci0JCXVwZGF0ZU9LQnV0dG9uU3RhdGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDI4NTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5YTUxDb21tb25VSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIFN0cmluZyBkYXRhOwotCXByb3RlY3RlZCBUZXh0IGRhdGFGaWVsZDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldDsKLQlwcm90ZWN0ZWQgVGV4dCB0YXJnZXRGaWVsZDsKLQotCXB1YmxpYyBFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkpIHsKLQkJdGhpcyhwYXJlbnRTaGVsbCwgcGkuZ2V0VGFyZ2V0KCksIHBpLmdldERhdGEoKSk7Ci0JfQotCi0JcHVibGljIEVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJdGFyZ2V0ID0gZ2V0TW9kZWxWYWx1ZSh0YXJnZXRGaWVsZC5nZXRUZXh0KCkpOwotCQlkYXRhID0gZ2V0TW9kZWxWYWx1ZShkYXRhRmllbGQuZ2V0VGV4dCgpKTsKLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWExID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRpYWxvZ0FyZWExLCBYTUxDb21tb25VSUNvbnRleHRJZHMuWENVSV9QUk9DRVNTSU5HX0RJQUxPRyk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYTEsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2Qud2lkdGhIaW50ID0gMjUwOwotCi0JCUxhYmVsIHRhcmdldExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl0YXJnZXRMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1RBUkdFVF9DT0xPTik7Ci0KLQkJdGFyZ2V0RmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJdGFyZ2V0RmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXRhcmdldEZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKHRhcmdldCkpOwotCi0JCUxhYmVsIGRhdGFMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZGF0YUxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfREFUQV9DT0xPTik7Ci0KLQkJZGF0YUZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWRhdGFGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZGF0YUZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGRhdGEpKTsKLQotCQlyZXR1cm4gZGlhbG9nQXJlYTE7Ci0JfQotCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZU1lc3NhZ2VBcmVhKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCS8vIGxhYmVsLnNldFRleHQobWVzc2FnZSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB7Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlzcGxheVZhbHVlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZyAhPSBudWxsID8gc3RyaW5nIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZGVsVmFsdWUoU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKChzdHJpbmcgIT0gbnVsbCkgJiYgKHN0cmluZy50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotCQkJcmVzdWx0ID0gc3RyaW5nOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldCgpIHsKLQkJcmV0dXJuIHRhcmdldDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0U2NoZW1hSW5mb0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdFNjaGVtYUluZm9EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ0NTgwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0U2NoZW1hSW5mb0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0LkNvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5YTUxDb21tb25VSUNvbnRleHRJZHM7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0U2NoZW1hSW5mb0RpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIFVwZGF0ZUxpc3RlbmVyIHsKLQkvLyBwcm90ZWN0ZWQgTmFtZXNwYWNlSW5mb1RhYmxlIG5hbWVzcGFjZUluZm9UYWJsZTsKLQlwcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWw7Ci0JcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlSW5mb0xpc3Q7Ci0JcHJvdGVjdGVkIElQYXRoIHJlc291cmNlTG9jYXRpb247Ci0KLQlwdWJsaWMgRWRpdFNjaGVtYUluZm9EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElQYXRoIHJlc291cmNlTG9jYXRpb24pIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRpYWxvZ0FyZWEsIFhNTENvbW1vblVJQ29udGV4dElkcy5YQ1VJX1NDSEVNQV9JTkZPX0RJQUxPRyk7Ci0KLQkJQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2cgZWRpdE5hbWVzcGFjZXNDb250cm9sID0gbmV3IENvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nKGRpYWxvZ0FyZWEsIHJlc291cmNlTG9jYXRpb24sIFhNTFVJTWVzc2FnZXMuX1VJX05BTUVTUEFDRV9ERUNMQVJBVElPTlMsIGZhbHNlLCB0cnVlKTsKLQkJZWRpdE5hbWVzcGFjZXNDb250cm9sLnNldE5hbWVzcGFjZUluZm9MaXN0KG5hbWVzcGFjZUluZm9MaXN0KTsKLQotCQllZGl0TmFtZXNwYWNlc0NvbnRyb2wudXBkYXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0KTsKLQotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBnZXREaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXROYW1lc3BhY2VJbmZvTGlzdCgpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZUluZm9MaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZUluZm9MaXN0KExpc3QgbGlzdCkgewotCQluYW1lc3BhY2VJbmZvTGlzdCA9IGxpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKExpc3QgbmFtZXNwYWNlSW5mb0xpc3QpIHsKLQkJTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyIGhlbHBlciA9IG5ldyBOYW1lc3BhY2VJbmZvRXJyb3JIZWxwZXIoKTsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IGhlbHBlci5jb21wdXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0LCBudWxsKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChlcnJvck1lc3NhZ2UgIT0gbnVsbCA/IGVycm9yTWVzc2FnZSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZU9jY3VyZWQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGFyZykgewotCQl1cGRhdGVFcnJvck1lc3NhZ2UoKExpc3QpIGFyZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9OYW1lc3BhY2VJbmZvRXJyb3JIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQwZGY5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9OYW1lc3BhY2VJbmZvRXJyb3JIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUluZm9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZUluZm9FcnJvckhlbHBlciB7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBlcnJvckxpc3Q7Ci0KLQlwdWJsaWMgTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyKCkgewotCX0KLQotCXB1YmxpYyBTdHJpbmcgY29tcHV0ZUVycm9yTWVzc2FnZShMaXN0IG5hbWVzcGFjZUluZm9MaXN0LCBVUklSZXNvbHZlciBpZFJlc29sdmVyKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlIYXNodGFibGUgcHJlZml4VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCUhhc2h0YWJsZSB1cmlUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5hbWVzcGFjZUluZm9MaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU5hbWVzcGFjZUluZm8gbnNJbmZvID0gKE5hbWVzcGFjZUluZm8pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCW5zSW5mby5ub3JtYWxpemUoKTsKLQotCQkJU3RyaW5nIHVyaWtleSA9IG5zSW5mby51cmkgIT0gbnVsbCA/IG5zSW5mby51cmkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJTmFtZXNwYWNlSW5mbyBuc0luZm8yID0gbnVsbDsKLQkJCWlmICgobnNJbmZvMiA9IChOYW1lc3BhY2VJbmZvKSB1cmlUYWJsZS5nZXQodXJpa2V5KSkgIT0gbnVsbCkgewotCQkJCWlmICgobnNJbmZvLnVyaSAhPSBudWxsKSAmJiBuc0luZm8udXJpLmVxdWFscyhuc0luZm8yLnVyaSkpIHsKLQkJCQkJcmVzdWx0ID0gWE1MVUlNZXNzYWdlcy5fVUlfV0FSTklOR19NT1JFX1RIQU5fT05FX05TX1dJVEhfTkFNRSArICInIiArIG5zSW5mby51cmkgKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIT1VUX05BTUU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdXJpVGFibGUucHV0KHVyaWtleSwgbnNJbmZvKTsKLQkJCX0KLQotCQkJaWYgKG5zSW5mby51cmkgIT0gbnVsbCkgewotCQkJCVN0cmluZyBrZXkgPSBuc0luZm8ucHJlZml4ICE9IG51bGwgPyBuc0luZm8ucHJlZml4IDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocHJlZml4VGFibGUuZ2V0KGtleSkgIT0gbnVsbCkgewotCQkJCQlpZiAobnNJbmZvLnByZWZpeCAhPSBudWxsKSB7Ci0JCQkJCQlyZXN1bHQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9XQVJOSU5HX01PUkVfVEhBTl9PTkVfTlNfV0lUSF9QUkVGSVggKyAiJyIgKyBuc0luZm8ucHJlZml4ICsgIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIT1VUX1BSRUZJWDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlwcmVmaXhUYWJsZS5wdXQoa2V5LCBuc0luZm8pOwotCQkJCX0KLQotCQkJCWlmICgobnNJbmZvLmxvY2F0aW9uSGludCAhPSBudWxsKSAmJiAoaWRSZXNvbHZlciAhPSBudWxsKSkgewotCQkJCQlTdHJpbmcgZ3JhbW1hclVSSSA9IGlkUmVzb2x2ZXIucmVzb2x2ZShudWxsLCBuc0luZm8ubG9jYXRpb25IaW50LCBuc0luZm8ubG9jYXRpb25IaW50KTsKLQkJCQkJaWYgKCFVUklIZWxwZXIuaXNSZWFkYWJsZVVSSShncmFtbWFyVVJJLCBmYWxzZSkpIHsKLQkJCQkJCXJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX1dBUk5JTkdfU0NIRU1BX0NBTl9OT1RfQkVfTE9DQVRFRCArICIgJyIgKyBuc0luZm8ubG9jYXRpb25IaW50ICsgIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoKGlkUmVzb2x2ZXIgIT0gbnVsbCkgJiYgKG5zSW5mby5sb2NhdGlvbkhpbnQgPT0gbnVsbCkgJiYgIW5zSW5mby51cmkuZXF1YWxzKERPTU5hbWVzcGFjZUluZm9NYW5hZ2VyLlhTSV9VUkkpKSB7Ci0JCQkJCXJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX1dBUk5JTkdfTE9DQVRJT05fSElOVF9OT1RfU1BFQ0lGSUVEICsgIiAnIiArIG5zSW5mby51cmkgKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKG5zSW5mby5wcmVmaXggIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9XQVJOSU5HX05BTUVTUEFDRV9OQU1FX05PVF9TUEVDSUZJRUQgKyAiICciICsgbnNJbmZvLnByZWZpeCArICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gYWRkaXRpb25hbCB0ZXN0cwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBuYW1lc3BhY2VJbmZvTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJTmFtZXNwYWNlSW5mbyBuc0luZm8gPSAoTmFtZXNwYWNlSW5mbykgaXRlcmF0b3IubmV4dCgpOwotCQkJCW5zSW5mby5ub3JtYWxpemUoKTsKLQkJCQlpZiAoKG5zSW5mby51cmkgIT0gbnVsbCkgJiYgbnNJbmZvLmlzUHJlZml4UmVxdWlyZWQgJiYgKG5zSW5mby5wcmVmaXggPT0gbnVsbCkpIHsKLQkJCQkJcmVzdWx0ID0gWE1MVUlNZXNzYWdlcy5fVUlfV0FSTklOR19QUkVGSVhfTk9UX1NQRUNJRklFRCArICIgJyIgKyBuc0luZm8udXJpICsgIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvTmFtZXNwYWNlSW5mb1RhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9OYW1lc3BhY2VJbmZvVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE0MzhkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9OYW1lc3BhY2VJbmZvVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlSW5mb1RhYmxlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotCS8qKgotCSAqIE5hbWVzcGFjZUluZm9UYWJsZUxhYmVsUHJvdmlkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgTmFtZXNwYWNlSW5mb1RhYmxlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIsIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbikgewotCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIG9iamVjdDsKLQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkJc3dpdGNoIChjb2x1bW4pIHsKLQkJCQljYXNlIDAgOiB7Ci0JCQkJCXJlc3VsdCA9IGluZm8udXJpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxIDogewotCQkJCQlyZXN1bHQgPSBpbmZvLnByZWZpeDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMiA6IHsKLQkJCQkJcmVzdWx0ID0gaW5mby5sb2NhdGlvbkhpbnQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXJlc3VsdCA9IHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChyZXN1bHQuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJc3dpdGNoIChjb2x1bW4pIHsKLQkJCQkJY2FzZSAwIDogewotCQkJCQkJcmVzdWx0ID0gWE1MVUlNZXNzYWdlcy5fVUlfTk9fTkFNRVNQQUNFX05BTUU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIDEgOiB7Ci0JCQkJCQlyZXN1bHQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9OT19QUkVGSVg7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0RGVmYXVsdFByZWZpeCgpIHsKLQkJCVN0cmluZyBkZWZhdWx0UHJlZml4ID0gInAiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobmFtZXNwYWNlSW5mb0xpc3QgPT0gbnVsbCkgewotCQkJCXJldHVybiBkZWZhdWx0UHJlZml4OwotCQkJfQotCQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZUluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJTmFtZXNwYWNlSW5mbyBuc2luZm8gPSAoTmFtZXNwYWNlSW5mbykgbmFtZXNwYWNlSW5mb0xpc3QuZ2V0KGkpOwotCQkJCWlmIChuc2luZm8ucHJlZml4ICE9IG51bGwpIHsKLQkJCQkJdi5hZGRFbGVtZW50KG5zaW5mby5wcmVmaXgpOwotCQkJCX0KLQkJCX0KLQkJCWlmICh2LmNvbnRhaW5zKGRlZmF1bHRQcmVmaXgpKSB7Ci0JCQkJU3RyaW5nIHMgPSBkZWZhdWx0UHJlZml4OwotCQkJCWZvciAoaW50IGogPSAwOyB2LmNvbnRhaW5zKHMpOyBqKyspIHsKLQkJCQkJcyA9IGRlZmF1bHRQcmVmaXggKyBJbnRlZ2VyLnRvU3RyaW5nKGopOwotCQkJCX0KLQkJCQlyZXR1cm4gczsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBkZWZhdWx0UHJlZml4OwotCQkJfQotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCXJldHVybiBuYW1lc3BhY2VJbmZvTGlzdC50b0FycmF5KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBvYmplY3QsIE9iamVjdCBwcm9wZXJ0eSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OX0hJTlQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9MT0NBVElPTl9ISU5UOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9VUkkgPSBYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FU1BBQ0VfTkFNRTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9QUkVGSVg7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZWxldGVCdXR0b247Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZHVtbXlSb3dzUmVtb3ZlZCA9IGZhbHNlOwotCXByb3RlY3RlZCBCdXR0b24gZWRpdEJ1dHRvbjsKLQlwcm90ZWN0ZWQgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQlwcm90ZWN0ZWQgQnV0dG9uIG5ld0J1dHRvbjsKLQlwcm90ZWN0ZWQgTmFtZXNwYWNlSW5mb1RhYmxlTGFiZWxQcm92aWRlciBwcm92aWRlcjsKLQlwcm90ZWN0ZWQgSVBhdGggcmVzb3VyY2VMb2NhdGlvbjsKLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0JcHJvdGVjdGVkIFVwZGF0ZUxpc3RlbmVyIHVwZGF0ZUxpc3RlbmVyOwotCXByb3RlY3RlZCBpbnQgdmlzaWJsZVJvd3MgPSAtMTsKLQotCXB1YmxpYyBOYW1lc3BhY2VJbmZvVGFibGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzKHBhcmVudCwgLTEsIC0xLCAtMSk7Ci0JfQotCi0JcHVibGljIE5hbWVzcGFjZUluZm9UYWJsZShDb21wb3NpdGUgcGFyZW50LCBpbnQgdmlzaWJsZVJvd3MpIHsKLQkJdGhpcyhwYXJlbnQsIC0xLCAtMSwgdmlzaWJsZVJvd3MpOwotCX0KLQotCXB1YmxpYyBOYW1lc3BhY2VJbmZvVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQpIHsKLQkJdGhpcyhwYXJlbnQsIHdpZHRoSGludCwgaGVpZ2h0SGludCwgLTEpOwotCX0KLQotCXB1YmxpYyBOYW1lc3BhY2VJbmZvVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQsIGludCB2aXNpYmxlUm93cykgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJc2V0TGF5b3V0KGNyZWF0ZUdyaWRMYXlvdXQoKSk7Ci0JCXNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlHcm91cCBuYW1lc3BhY2VJbmZvR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULk5PTkUpOwotCQluYW1lc3BhY2VJbmZvR3JvdXAuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9YTUxfU0NIRU1BX0lORk9STUFUSU9OKTsKLQkJbmFtZXNwYWNlSW5mb0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJaWYgKHdpZHRoSGludCAhPSAtMSkgewotCQkJZ2Qud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQl9Ci0JCWlmIChoZWlnaHRIaW50ICE9IC0xKSB7Ci0JCQlnZC5oZWlnaHRIaW50ID0gaGVpZ2h0SGludDsKLQkJfQotCQluYW1lc3BhY2VJbmZvR3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCS8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscChuYW1lc3BhY2VJbmZvR3JvdXAsIG5ldwotCQkvLyBDb250cm9sQ29udGV4dENvbXB1dGVyKG5hbWVzcGFjZUluZm9Hcm91cCwKLQkJLy8gWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MQ19OQU1FU1BBQ0VfR1JPVVApKTsKLQkJU3RyaW5nW10gdGl0bGVBcnJheSA9IHtOQU1FU1BBQ0VfVVJJLCBQUkVGSVgsIExPQ0FUSU9OX0hJTlR9OwotCQl0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihuYW1lc3BhY2VJbmZvR3JvdXAsIFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCXByb3ZpZGVyID0gbmV3IE5hbWVzcGFjZUluZm9UYWJsZUxhYmVsUHJvdmlkZXIoKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyKTsKLQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihwcm92aWRlcik7Ci0JCXRhYmxlVmlld2VyLnNldENvbHVtblByb3BlcnRpZXModGl0bGVBcnJheSk7Ci0JCVRhYmxlIHRhYmxlID0gdGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWludFtdIHdpZHRoQXJyYXkgPSB7NTAsIDIwLCAzMH07Ci0JCVRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRpdGxlQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgaSk7Ci0JCQljb2x1bW4uc2V0VGV4dCh0aXRsZUFycmF5W2ldKTsKLQkJCWNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEod2lkdGhBcnJheVtpXSwgdHJ1ZSkpOwotCQl9Ci0JCXRoaXMudmlzaWJsZVJvd3MgPSB2aXNpYmxlUm93czsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2aXNpYmxlUm93czsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCgiIyMjIyMjIyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGFibGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUNlbGxFZGl0b3JbXSBjZWxsRWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yW3RpdGxlQXJyYXkubGVuZ3RoXTsKLQkJY2VsbEVkaXRvcnNbMV0gPSBuZXcgVGV4dENlbGxFZGl0b3IodGFibGUpOwotCQljZWxsRWRpdG9yc1syXSA9IG5ldyBUZXh0Q2VsbEVkaXRvcih0YWJsZSk7Ci0JCXRhYmxlVmlld2VyLnNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLQkJTW91c2VBZGFwdGVyIG1vdXNlQWRhcHRlciA9IG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJCWlmICh0YWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW0obmV3IFBvaW50KGUueCwgZS55KSkgIT0gbnVsbCkgewotCQkJCQlwZXJmb3JtRWRpdCgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdGFibGUuYWRkTW91c2VMaXN0ZW5lcihtb3VzZUFkYXB0ZXIpOwotCQljcmVhdGVCdXR0b25zKG5hbWVzcGFjZUluZm9Hcm91cCk7Ci0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXVwZGF0ZUJ1dHRvbkVuYWJsZWRTdGF0ZSgpOwotCQkJfQotCQl9OwotCQl0YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJQnV0dG9uIGhpZGRlbkJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWhpZGRlbkJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJaGlkZGVuQnV0dG9uLnNldFZpc2libGUoZmFsc2UpOwotCQloaWRkZW5CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0ID09IG5ld0J1dHRvbikgewotCQkJCQlwZXJmb3JtTmV3KCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGUud2lkZ2V0ID09IGVkaXRCdXR0b24pIHsKLQkJCQkJcGVyZm9ybUVkaXQoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZS53aWRnZXQgPT0gZGVsZXRlQnV0dG9uKSB7Ci0JCQkJCXBlcmZvcm1EZWxldGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB0byBob2xkIHRoZSB0aHJlZSBidXR0b25zCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCUdyaWRMYXlvdXQgYnV0dG9uR3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWJ1dHRvbkdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWJ1dHRvbkdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChidXR0b25HcmlkTGF5b3V0KTsKLQkJLy8gYWRkIHRoZSBOZXcgYnV0dG9uCi0JCS8vCi0JCW5ld0J1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW5ld0J1dHRvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0JVVFRPTl9ORVcpOwotCQluZXdCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCW5ld0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCS8vIGFkZCB0aGUgRWRpdCBidXR0b24KLQkJLy8KLQkJZWRpdEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWVkaXRCdXR0b24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9CVVRUT05fRURJVCk7Ci0JCWVkaXRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWVkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQkvLyBhZGQgdGhlIERlbGV0ZSBidXR0b24KLQkJLy8KLQkJZGVsZXRlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZGVsZXRlQnV0dG9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfQlVUVE9OX0RFTEVURSk7Ci0JCWRlbGV0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZGVsZXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgR3JpZExheW91dCBjcmVhdGVHcmlkTGF5b3V0KCkgewotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJZ3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCXJldHVybiBncmlkTGF5b3V0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZUluZm9MaXN0KCkgewotCQlyZXR1cm4gbmFtZXNwYWNlSW5mb0xpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIE5hbWVzcGFjZUluZm8gZ2V0VGFyZ2V0TmFtZXNwYWNlSW5mbygpIHsKLQkJcmV0dXJuICgobmFtZXNwYWNlSW5mb0xpc3QgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZUluZm9MaXN0LnNpemUoKSA+IDApKSA/IChOYW1lc3BhY2VJbmZvKSBuYW1lc3BhY2VJbmZvTGlzdC5nZXQoMCkgOiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyBpbnZva2VEaWFsb2coU3RyaW5nIHRpdGxlLCBOYW1lc3BhY2VJbmZvIGluZm8pIHsKLQkJU2hlbGwgc2hlbGwgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCUVkaXROYW1lc3BhY2VJbmZvRGlhbG9nIGRpYWxvZyA9IG5ldyBFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyhzaGVsbCwgaW5mbyk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLnNldFJlc291cmNlTG9jYXRpb24ocmVzb3VyY2VMb2NhdGlvbik7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybiBkaWFsb2c7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlbGF5ZWRVcGRhdGUoKSB7Ci0JCVJ1bm5hYmxlIGRlbGF5ZWRVcGRhdGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdXBkYXRlKCk7Ci0JCQl9Ci0JCX07Ci0JCWdldERpc3BsYXkoKS5hc3luY0V4ZWMoZGVsYXllZFVwZGF0ZSk7Ci0JCWlmICh1cGRhdGVMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQl1cGRhdGVMaXN0ZW5lci51cGRhdGVPY2N1cmVkKHRoaXMsIG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWxldGUoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgPyAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpIDogbnVsbDsKLQkJaWYgKHNlbGVjdGVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCW5hbWVzcGFjZUluZm9MaXN0LnJlbW92ZShzZWxlY3RlZE9iamVjdCk7Ci0JCQlwZXJmb3JtRGVsYXllZFVwZGF0ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUVkaXQoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgPyAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpIDogbnVsbDsKLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgTmFtZXNwYWNlSW5mbykgewotCQkJaW52b2tlRGlhbG9nKFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX05FV19OQU1FU1BBQ0VfSU5GT1JNQVRJT04sIChOYW1lc3BhY2VJbmZvKSBzZWxlY3RlZE9iamVjdCk7Ci0JCQlwZXJmb3JtRGVsYXllZFVwZGF0ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybU5ldygpIHsKLQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLQkJRWRpdE5hbWVzcGFjZUluZm9EaWFsb2cgZGlhbG9nID0gaW52b2tlRGlhbG9nKFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX05FV19OQU1FU1BBQ0VfSU5GT1JNQVRJT04sIGluZm8pOwotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCW5hbWVzcGFjZUluZm9MaXN0LmFkZChpbmZvKTsKLQkJCXBlcmZvcm1EZWxheWVkVXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VJbmZvTGlzdChMaXN0IG5hbWVzcGFjZUluZm9MaXN0KSB7Ci0JCXRoaXMubmFtZXNwYWNlSW5mb0xpc3QgPSBuYW1lc3BhY2VJbmZvTGlzdDsKLQkJdXBkYXRlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VMb2NhdGlvbihJUGF0aCByZXNvdXJjZUxvY2F0aW9uKSB7Ci0JCXRoaXMucmVzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlTGlzdGVuZXIoVXBkYXRlTGlzdGVuZXIgdXBkYXRlTGlzdGVuZXIpIHsKLQkJdGhpcy51cGRhdGVMaXN0ZW5lciA9IHVwZGF0ZUxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJdXBkYXRlSGVscGVyKG5hbWVzcGFjZUluZm9MaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVCdXR0b25FbmFibGVkU3RhdGUoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgPyAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpIDogbnVsbDsKLQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIHNlbGVjdGVkT2JqZWN0OwotCQllZGl0QnV0dG9uLnNldEVuYWJsZWQoaW5mbyAhPSBudWxsKTsKLQkJZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoKGluZm8gIT0gbnVsbCkgJiYgKGluZm8uZ2V0UHJvcGVydHkoInVucmVtb3ZhYmxlIikgPT0gbnVsbCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlSGVscGVyKExpc3QgbmFtZXNwYWNlSW5mb0xpc3QpIHsKLQkJaWYgKCh2aXNpYmxlUm93cyAhPSAtMSkgJiYgIWR1bW15Um93c1JlbW92ZWQpIHsKLQkJCWR1bW15Um93c1JlbW92ZWQgPSB0cnVlOwotCQkJdGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5yZW1vdmVBbGwoKTsKLQkJfQotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQl0YWJsZVZpZXdlci5zZXRJbnB1dChuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlpZiAobmFtZXNwYWNlSW5mb0xpc3Quc2l6ZSgpID4gMCkgewotCQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuYW1lc3BhY2VJbmZvTGlzdC5nZXQoMCkpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2Y2Y3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotcHVibGljIGNsYXNzIFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZERpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIGludCBjYXRhbG9nRW50cnlUeXBlOwotCXByb3RlY3RlZCBTdHJpbmdbXSBleHRlbnNpb25zOwotCXByb3RlY3RlZCBJRmlsZSBmaWxlOwotCXByb3RlY3RlZCBTdHJpbmcgaWQ7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLQlwcm90ZWN0ZWQgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwgcGFuZWw7Ci0KLQlwdWJsaWMgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmdbXSBleHRlbnNpb25zKSB7Ci0JCXRoaXMocGFyZW50U2hlbGwsIGV4dGVuc2lvbnMsIDApOwotCX0KLQotCXB1YmxpYyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZ1tdIGV4dGVuc2lvbnMsIGludCBjYXRhbG9nRW50cnlUeXBlKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9uczsKLQkJdGhpcy5jYXRhbG9nRW50cnlUeXBlID0gY2F0YWxvZ0VudHJ5VHlwZTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQlmaWxlID0gcGFuZWwuZ2V0RmlsZSgpOwotCQkJaWQgPSBwYW5lbC5nZXRYTUxDYXRhbG9nSWQoKTsKLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlwYW5lbCA9IG5ldyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbChkaWFsb2dBcmVhKTsKLQkJcGFuZWwuc2V0Q2F0YWxvZ0VudHJ5VHlwZShjYXRhbG9nRW50cnlUeXBlKTsKLQkJcGFuZWwuc2V0RmlsdGVyRXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKLQkJcGFuZWwuc2V0VmlzaWJsZUhlbHBlcih0cnVlKTsKLQkJU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwuTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwuTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0aW9uU3RhdGVDaGFuZ2VkKCkgewotCQkJCXVwZGF0ZUJ1dHRvblN0YXRlKCk7Ci0JCQl9Ci0JCX07Ci0JCXBhbmVsLnNldExpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJ1dHRvblN0YXRlKCkgewotCQlva0J1dHRvbi5zZXRFbmFibGVkKChwYW5lbC5nZXRGaWxlKCkgIT0gbnVsbCkgfHwgKHBhbmVsLmdldFhNTENhdGFsb2dJZCgpICE9IG51bGwpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk4N2IwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKgkgICBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzLlNlbGVjdFNpbmdsZUZpbGVWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbCBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQotCS8qKgotCSAqIFRPRE86IENoYW5nZSB0aGUgbmFtZSBvZiB0aGlzIGludGVyZmFjZTsgIkxpc3RlbmVyIiBpcyB1c2VkIGJ5IFNXVC4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIHsKLQkJdm9pZCBjb21wbGV0aW9uU3RhdGVDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIE15U2VsZWN0U2luZ2xlRmlsZVZpZXcgZXh0ZW5kcyBTZWxlY3RTaW5nbGVGaWxlVmlldyBpbXBsZW1lbnRzIFNlbGVjdFNpbmdsZUZpbGVWaWV3Lkxpc3RlbmVyIHsKLQkJcHJvdGVjdGVkIENvbnRyb2wgY29udHJvbDsKLQotCQlwdWJsaWMgTXlTZWxlY3RTaW5nbGVGaWxlVmlldyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihudWxsLCB0cnVlKTsKLQkJCS8vIFN0cmluZ1tdIGV4dCA9IHsiLmR0ZCJ9OwotCQkJLy8gYWRkRmlsdGVyRXh0ZW5zaW9ucyhleHQpOwotCQkJY29udHJvbCA9IGNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQlNeVNlbGVjdFNpbmdsZUZpbGVWaWV3LnRoaXMuc2V0TGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQkJcmV0dXJuIGNvbnRyb2w7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRDb250cm9sQ29tcGxldGUoYm9vbGVhbiBpc0NvbXBsZXRlKSB7Ci0JCQl1cGRhdGVDb21wbGV0aW9uU3RhdGVDaGFuZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFZpc2libGVIZWxwZXIoYm9vbGVhbiBpc1Zpc2libGUpIHsKLQkJCXN1cGVyLnNldFZpc2libGVIZWxwZXIoaXNWaXNpYmxlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBMaXN0ZW5lciBsaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgUGFnZUJvb2sgcGFnZUJvb2s7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uW10gcmFkaW9CdXR0b247Ci0JcHJvdGVjdGVkIE15U2VsZWN0U2luZ2xlRmlsZVZpZXcgc2VsZWN0U2luZ2xlRmlsZVZpZXc7Ci0JcHJvdGVjdGVkIFNlbGVjdFhNTENhdGFsb2dJZFBhbmVsIHNlbGVjdFhNTENhdGFsb2dJZFBhbmVsOwotCi0JcHVibGljIFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJLy8gY29udGFpbmVyIGdyb3VwCi0JCXNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaGVpZ2h0SGludCA9IDQwMDsKLQkJZ2Qud2lkdGhIaW50ID0gNDAwOwotCQlzZXRMYXlvdXREYXRhKGdkKTsKLQotCQlyYWRpb0J1dHRvbiA9IG5ldyBCdXR0b25bMl07Ci0JCXJhZGlvQnV0dG9uWzBdID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuUkFESU8pOwotCQlyYWRpb0J1dHRvblswXS5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX1JBRElPX0JVVFRPTl9TRUxFQ1RfRlJPTV9XT1JLU1BBQ0UpOwotCQlyYWRpb0J1dHRvblswXS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmFkaW9CdXR0b25bMF0uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlyYWRpb0J1dHRvblswXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQlyYWRpb0J1dHRvblsxXSA9IG5ldyBCdXR0b24odGhpcywgU1dULlJBRElPKTsKLQkJcmFkaW9CdXR0b25bMV0uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9SQURJT19CVVRUT05fU0VMRUNUX0ZST01fQ0FUQUxPRyk7Ci0JCXJhZGlvQnV0dG9uWzFdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyYWRpb0J1dHRvblsxXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQlwYWdlQm9vayA9IG5ldyBQYWdlQm9vayh0aGlzLCBTV1QuTk9ORSk7Ci0JCXBhZ2VCb29rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3ID0gbmV3IE15U2VsZWN0U2luZ2xlRmlsZVZpZXcocGFnZUJvb2spOwotCi0JCUlDYXRhbG9nIHhtbENhdGFsb2cgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotCQlzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbCA9IG5ldyBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbChwYWdlQm9vaywgeG1sQ2F0YWxvZyk7Ci0JCXNlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmdldFRhYmxlVmlld2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVDb21wbGV0aW9uU3RhdGVDaGFuZ2UoKTsKLQkJCX0KLQkJfSk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJcGFnZUJvb2suc2hvd1BhZ2Uoc2VsZWN0U2luZ2xlRmlsZVZpZXcuZ2V0Q29udHJvbCgpKTsKLQotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlJRmlsZSByZXN1bHQgPSBudWxsOwotCQlpZiAocmFkaW9CdXR0b25bMF0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXJlc3VsdCA9IHNlbGVjdFNpbmdsZUZpbGVWaWV3LmdldEZpbGUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJQ2F0YWxvZ0VudHJ5IGdldFhNTENhdGFsb2dFbnRyeSgpIHsKLQkJSUNhdGFsb2dFbnRyeSByZXN1bHQgPSBudWxsOwotCQlpZiAocmFkaW9CdXR0b25bMV0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXJlc3VsdCA9IHNlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmdldFhNTENhdGFsb2dFbnRyeSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRYTUxDYXRhbG9nSWQoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAocmFkaW9CdXR0b25bMV0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXJlc3VsdCA9IHNlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFhNTENhdGFsb2dVUkkoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAocmFkaW9CdXR0b25bMV0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXJlc3VsdCA9IHNlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmdldFVSSSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0VudHJ5VHlwZShpbnQgY2F0YWxvZ0VudHJ5VHlwZSkgewotCQlzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5zZXRDYXRhbG9nRW50cnlUeXBlKGNhdGFsb2dFbnRyeVR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlckV4dGVuc2lvbnMoU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucykgewotCQlzZWxlY3RTaW5nbGVGaWxlVmlldy5yZXNldEZpbHRlcnMoKTsKLQkJc2VsZWN0U2luZ2xlRmlsZVZpZXcuYWRkRmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJFeHRlbnNpb25zKTsKLQotCQlzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5nZXRUYWJsZVZpZXdlcigpLnNldEZpbHRlckV4dGVuc2lvbnMoZmlsdGVyRXh0ZW5zaW9ucyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpc2libGVIZWxwZXIoYm9vbGVhbiBpc1Zpc2libGUpIHsKLQkJc2VsZWN0U2luZ2xlRmlsZVZpZXcuc2V0VmlzaWJsZUhlbHBlcihpc1Zpc2libGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbXBsZXRpb25TdGF0ZUNoYW5nZSgpIHsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCWxpc3RlbmVyLmNvbXBsZXRpb25TdGF0ZUNoYW5nZWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoZS53aWRnZXQgPT0gcmFkaW9CdXR0b25bMF0pIHsKLQkJCXBhZ2VCb29rLnNob3dQYWdlKHNlbGVjdFNpbmdsZUZpbGVWaWV3LmdldENvbnRyb2woKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwYWdlQm9vay5zaG93UGFnZShzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbCk7Ci0JCX0KLQkJdXBkYXRlQ29tcGxldGlvblN0YXRlQ2hhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0WE1MQ2F0YWxvZ0lkRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RYTUxDYXRhbG9nSWREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI0Yzk2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RYTUxDYXRhbG9nSWREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5YTUxDb21tb25VSUNvbnRleHRJZHM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgU2VsZWN0WE1MQ2F0YWxvZ0lkRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZXh0ZW5zaW9uczsKLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCXByb3RlY3RlZCBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbCBwYW5lbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY0lkOwotCXByb3RlY3RlZCBTdHJpbmcgc3lzdGVtSWQ7Ci0KLQlwdWJsaWMgU2VsZWN0WE1MQ2F0YWxvZ0lkRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmdbXSBleHRlbnNpb25zKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9uczsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHBhbmVsLmdldFRhYmxlVmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pID8gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKSA6IG51bGw7Ci0KLQkJCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpIHsKLQkJCQlJQ2F0YWxvZ0VudHJ5IG1hcHBpbmdJbmZvID0gKElDYXRhbG9nRW50cnkpIHNlbGVjdGVkT2JqZWN0OwotCQkJCXB1YmxpY0lkID0gbWFwcGluZ0luZm8uZ2V0S2V5KCk7Ci0JCQkJc3lzdGVtSWQgPSBjb21wdXRlRGVmYXVsdFN5c3RlbUlkKG1hcHBpbmdJbmZvKTsKLQkJCX0KLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVEZWZhdWx0U3lzdGVtSWQoSUNhdGFsb2dFbnRyeSBtYXBwaW5nSW5mbykgewotCQlTdHJpbmcgcmVzdWx0ID0gbWFwcGluZ0luZm8uZ2V0QXR0cmlidXRlVmFsdWUoSUNhdGFsb2dFbnRyeS5BVFRSX1dFQl9VUkwpOwotCQlpZiAoKHJlc3VsdCA9PSBudWxsKSAmJiAobWFwcGluZ0luZm8uZ2V0VVJJKCkgIT0gbnVsbCkpIHsKLQkJCWludCBpbmRleCA9IG1hcHBpbmdJbmZvLmdldFVSSSgpLmxhc3RJbmRleE9mKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBsYXN0U2VnbWVudCA9IGluZGV4ICE9IC0xID8gbWFwcGluZ0luZm8uZ2V0VVJJKCkuc3Vic3RyaW5nKGluZGV4ICsgMSkgOiBtYXBwaW5nSW5mby5nZXRVUkkoKTsKLQkJCXJlc3VsdCA9IGxhc3RTZWdtZW50OwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlhbG9nQXJlYSwgWE1MQ29tbW9uVUlDb250ZXh0SWRzLlhDVUlfQ0FUQUxPR19ESUFMT0cpOwotCi0JCUlDYXRhbG9nIHhtbENhdGFsb2cgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotCQlwYW5lbCA9IG5ldyBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbChkaWFsb2dBcmVhLCB4bWxDYXRhbG9nKTsKLQotCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXVwZGF0ZUJ1dHRvblN0YXRlKCk7Ci0JCQl9Ci0JCX07Ci0JCXBhbmVsLmdldFRhYmxlVmlld2VyKCkuc2V0RmlsdGVyRXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKLQkJcGFuZWwuZ2V0VGFibGVWaWV3ZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQl9Ci0KLQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIHB1YmxpY0lkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0JCXJldHVybiBzeXN0ZW1JZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25TdGF0ZSgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBwYW5lbC5nZXRUYWJsZVZpZXdlcigpLmdldFNlbGVjdGlvbigpOwotCQlva0J1dHRvbi5zZXRFbmFibGVkKCFzZWxlY3Rpb24uaXNFbXB0eSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFhOWU4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbCBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIGludCBjYXRhbG9nRW50cnlUeXBlOwotCXByb3RlY3RlZCBib29sZWFuIGRvVGFibGVTaXplSGFjayA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIFhNTENhdGFsb2dUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKLQlwcm90ZWN0ZWQgSUNhdGFsb2cgZlhtbENhdGFsb2c7Ci0KLQlwdWJsaWMgU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgSUNhdGFsb2cgeG1sQ2F0YWxvZykgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy5mWG1sQ2F0YWxvZyA9IHhtbENhdGFsb2c7Ci0KLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJdGhpcy5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhlaWdodEhpbnQgPSAyMDA7Ci0JCWdkLndpZHRoSGludCA9IDcwMDsKLQkJdGhpcy5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfWE1MX0NBVEFMT0dfQ09MT04pOwotCi0JCXRhYmxlVmlld2VyID0gY3JlYXRlVGFibGVWaWV3ZXIodGhpcyk7Ci0JCXRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQoImR1bW15Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyIGNyZWF0ZVRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RyaW5nIGhlYWRpbmdzW10gPSBuZXcgU3RyaW5nWzJdOwotCQloZWFkaW5nc1swXSA9IFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0tFWTsKLQkJaGVhZGluZ3NbMV0gPSBYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9VUkk7Ci0KLQkJWE1MQ2F0YWxvZ1RhYmxlVmlld2VyIHRoZVRhYmxlVmlld2VyID0gbmV3IFhNTENhdGFsb2dUYWJsZVZpZXdlcihwYXJlbnQsIGhlYWRpbmdzKSB7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGFkZFhNTENhdGFsb2dFbnRyaWVzKExpc3QgbGlzdCwgSUNhdGFsb2dFbnRyeVtdIGVudHJpZXMpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUNhdGFsb2dFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCQkJCWlmIChjYXRhbG9nRW50cnlUeXBlID09IDApIHsKLQkJCQkJCWxpc3QuYWRkKGVudHJ5KTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChjYXRhbG9nRW50cnlUeXBlID09IGVudHJ5LmdldEVudHJ5VHlwZSgpKSB7Ci0JCQkJCQlsaXN0LmFkZChlbnRyeSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBDb2xsZWN0aW9uIGdldFhNTENhdGFsb2dFbnRyaWVzKCkgewotCQkJCUxpc3QgcmVzdWx0ID0gbnVsbDsKLQotCQkJCWlmICgoZlhtbENhdGFsb2cgPT0gbnVsbCkgfHwgZG9UYWJsZVNpemVIYWNrKSB7Ci0JCQkJCS8vIHRoaXMgbGV0cyB1cyBjcmVhdGUgYSB0YWJsZSB3aXRoIGFuIGluaXRpYWwgaGVpZ2h0IG9mCi0JCQkJCS8vIDEwIHJvd3MKLQkJCQkJLy8gb3RoZXJ3aXNlIHdlIGdldCBzdHVjayB3aXRoIDAgcm93IGhlaWdoIHRhYmxlLi4uIHRoYXQncwotCQkJCQkvLyB0b28gc21hbGwKLQkJCQkJZG9UYWJsZVNpemVIYWNrID0gZmFsc2U7Ci0JCQkJCXJlc3VsdCA9IG5ldyBWZWN0b3IoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKLQkJCQkJCXJlc3VsdC5hZGQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBWZWN0b3IoKTsKLQkJCQkJSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gZlhtbENhdGFsb2cuZ2V0TmV4dENhdGFsb2dzKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJTmV4dENhdGFsb2cgY2F0YWxvZyA9IG5leHRDYXRhbG9nc1tpXTsKLQkJCQkJCUlDYXRhbG9nIHJlZmVyZW5jZWRDYXRhbG9nID0gY2F0YWxvZy5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotCQkJCQkJaWYgKHJlZmVyZW5jZWRDYXRhbG9nICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoWE1MQ29yZVBsdWdpbi5TWVNURU1fQ0FUQUxPR19JRC5lcXVhbHMocmVmZXJlbmNlZENhdGFsb2cuZ2V0SWQoKSkpIHsKLQkJCQkJCQkJSUNhdGFsb2cgc3lzdGVtQ2F0YWxvZyA9IHJlZmVyZW5jZWRDYXRhbG9nOwotCQkJCQkJCQlhZGRYTUxDYXRhbG9nRW50cmllcyhyZXN1bHQsIHN5c3RlbUNhdGFsb2cuZ2V0Q2F0YWxvZ0VudHJpZXMoKSk7Ci0KLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAoWE1MQ29yZVBsdWdpbi5VU0VSX0NBVEFMT0dfSUQuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKSB7Ci0JCQkJCQkJCUlDYXRhbG9nIHVzZXJDYXRhbG9nID0gcmVmZXJlbmNlZENhdGFsb2c7Ci0JCQkJCQkJCWFkZFhNTENhdGFsb2dFbnRyaWVzKHJlc3VsdCwgdXNlckNhdGFsb2cuZ2V0Q2F0YWxvZ0VudHJpZXMoKSk7Ci0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIHRoZVRhYmxlVmlld2VyOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJSUNhdGFsb2dFbnRyeSBlbnRyeSA9IGdldFhNTENhdGFsb2dFbnRyeSgpOwotCQlyZXR1cm4gZW50cnkgIT0gbnVsbCA/IGVudHJ5LmdldEtleSgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyIGdldFRhYmxlVmlld2VyKCkgewotCQlyZXR1cm4gdGFibGVWaWV3ZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCUlDYXRhbG9nRW50cnkgZW50cnkgPSBnZXRYTUxDYXRhbG9nRW50cnkoKTsKLQkJcmV0dXJuIGVudHJ5ICE9IG51bGwgPyBlbnRyeS5nZXRVUkkoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIElDYXRhbG9nRW50cnkgZ2V0WE1MQ2F0YWxvZ0VudHJ5KCkgewotCQlJQ2F0YWxvZ0VudHJ5IHJlc3VsdCA9IG51bGw7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgPyAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpIDogbnVsbDsKLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJcmVzdWx0ID0gKElDYXRhbG9nRW50cnkpIHNlbGVjdGVkT2JqZWN0OwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0VudHJ5VHlwZShpbnQgY2F0YWxvZ0VudHJ5VHlwZSkgewotCQl0aGlzLmNhdGFsb2dFbnRyeVR5cGUgPSBjYXRhbG9nRW50cnlUeXBlOwotCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvVXBkYXRlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1VwZGF0ZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNzI3MGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvVXBkYXRlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1wdWJsaWMgaW50ZXJmYWNlIFVwZGF0ZUxpc3RlbmVyIHsKLQotCXB1YmxpYyB2b2lkIHVwZGF0ZU9jY3VyZWQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGFyZyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9YTUxDYXRhbG9nVGFibGVWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1hNTENhdGFsb2dUYWJsZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGE4NzU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1hNTENhdGFsb2dUYWJsZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nVGFibGVWaWV3ZXIgZXh0ZW5kcyBUYWJsZVZpZXdlciB7Ci0KLQotCXB1YmxpYyBjbGFzcyBDYXRhbG9nRW50cnlDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotCQkJT2JqZWN0W10gYXJyYXkgPSBnZXRYTUxDYXRhbG9nRW50cmllcygpLnRvQXJyYXkoKTsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCQlpbnQgcmVzdWx0ID0gMDsKLQkJCQkJaWYgKChvMSBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpICYmIChvMiBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpKSB7Ci0JCQkJCQlJQ2F0YWxvZ0VudHJ5IG1hcHBpbmdJbmZvMSA9IChJQ2F0YWxvZ0VudHJ5KSBvMTsKLQkJCQkJCUlDYXRhbG9nRW50cnkgbWFwcGluZ0luZm8yID0gKElDYXRhbG9nRW50cnkpIG8yOwotCQkJCQkJcmVzdWx0ID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKG1hcHBpbmdJbmZvMS5nZXRLZXkoKSwgbWFwcGluZ0luZm8yLmdldEtleSgpKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX07Ci0JCQlBcnJheXMuc29ydChhcnJheSwgY29tcGFyYXRvcik7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZCwgT2JqZWN0IG5ld29iaikgewotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBDYXRhbG9nRW50cnlMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCUltYWdlIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJCUltYWdlIGJhc2UgPSBudWxsOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQkJCUlDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5ID0gKElDYXRhbG9nRW50cnkpIG9iamVjdDsKLQkJCQkJU3RyaW5nIHVyaSA9IGNhdGFsb2dFbnRyeS5nZXRVUkkoKTsKLQkJCQkJaWYgKHVyaS5lbmRzV2l0aCgiZHRkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYmFzZSA9IGR0ZEZpbGVJbWFnZTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICh1cmkuZW5kc1dpdGgoInhzZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJhc2UgPSB4c2RGaWxlSW1hZ2U7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQliYXNlID0gdW5rbm93bkZpbGVJbWFnZTsKLQkJCQkJfQotCi0JCQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQkJCWlmIChVUklIZWxwZXIuaXNSZWFkYWJsZVVSSSh1cmksIGZhbHNlKSkgewotCQkJCQkJCXJlc3VsdCA9IGJhc2U7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBUT0RPLi4uIFNTRSBwb3J0Ci0JCQkJCQkJcmVzdWx0ID0gYmFzZTsvLyBpbWFnZUZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlSW1hZ2UoYmFzZSwKLQkJCQkJCQkvLyBlcnJvckltYWdlLAotCQkJCQkJCS8vIEltYWdlRmFjdG9yeS5CT1RUT01fTEVGVCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJCUlDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5ID0gKElDYXRhbG9nRW50cnkpIG9iamVjdDsKLQkJCQlyZXN1bHQgPSBjb2x1bW5JbmRleCA9PSAwID8gY2F0YWxvZ0VudHJ5LmdldEtleSgpIDogY2F0YWxvZ0VudHJ5LmdldFVSSSgpOwotCQkJCXJlc3VsdCA9IFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2wocmVzdWx0KTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQotCWNsYXNzIFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0JCXByb3RlY3RlZCBTdHJpbmdbXSBleHRlbnNpb25zOwotCi0JCXB1YmxpYyBYTUxDYXRhbG9nVGFibGVWaWV3ZXJGaWx0ZXIoU3RyaW5nW10gZXh0ZW5zaW9ucykgewotCQkJdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9uczsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRmlsdGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBwcm9wZXJ0eSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQkJSUNhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgZWxlbWVudDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGNhdGFsb2dFbnRyeS5nZXRVUkkoKS5lbmRzV2l0aChleHRlbnNpb25zW2ldKSkgewotCQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgZHRkRmlsZUltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9EVERGSUxFKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIEVSUk9SX1NUQVRFX0tFWSA9ICJlcnJvcnN0YXRla2V5IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgZXJyb3JJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PVlJfRVJST1IpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSB1bmtub3duRmlsZUltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UWFRFWFQpOwotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgeHNkRmlsZUltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9YU0RGSUxFKTsKLQotCS8vIHByb3RlY3RlZCBJbWFnZUZhY3RvcnkgaW1hZ2VGYWN0b3J5ID0gbmV3IEltYWdlRmFjdG9yeSgpOwotCi0JcHVibGljIFhNTENhdGFsb2dUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQotCQlUYWJsZSB0YWJsZSA9IGdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0JCVRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtblByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgaSk7Ci0JCQljb2x1bW4uc2V0VGV4dChjb2x1bW5Qcm9wZXJ0aWVzW2ldKTsKLQkJCWNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIHRydWUpKTsKLQkJfQotCQl0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKLQotCQlzZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotCi0JCXNldENvbnRlbnRQcm92aWRlcihuZXcgQ2F0YWxvZ0VudHJ5Q29udGVudFByb3ZpZGVyKCkpOwotCQlzZXRMYWJlbFByb3ZpZGVyKG5ldyBDYXRhbG9nRW50cnlMYWJlbFByb3ZpZGVyKCkpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFhNTENhdGFsb2dFbnRyaWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImhlbGxvIikgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJydW4hIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQkJbWVudU1hbmFnZXIuYWRkKGFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBleHRlbnNpb25zKSB7Ci0JCXJlc2V0RmlsdGVycygpOwotCQlhZGRGaWx0ZXIobmV3IFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlcihleHRlbnNpb25zKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RuZC9EcmFnTm9kZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kbmQvRHJhZ05vZGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNWM2NmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RuZC9EcmFnTm9kZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5EZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgRHJhZ05vZGVDb21tYW5kIGV4dGVuZHMgRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZCB7Ci0JcHJpdmF0ZSBMaXN0IGZTZWxlY3Rpb25zOwotCXByaXZhdGUgVHJlZVZpZXdlciBmVHJlZVZpZXdlcjsKLQotCXB1YmxpYyBEcmFnTm9kZUNvbW1hbmQoT2JqZWN0IHRhcmdldCwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIHNvdXJjZXMsIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQlzdXBlcih0YXJnZXQsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZXMpOwotCQlmVHJlZVZpZXdlciA9IHRyZWVWaWV3ZXI7Ci0JCWZTZWxlY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBiZWdpbk1vZGVsQ2hhbmdlKE5vZGUgbm9kZSwgYm9vbGVhbiBiYXRjaFVwZGF0ZSkgewotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IGdldFN0cnVjdHVyZWRNb2RlbChub2RlKTsKLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdW5kb0Rlc2MgPSBuZXcgU3RyaW5nKCk7Ci0JCQlpZiAoZ2V0T3BlcmF0aW9uKCkgPT0gRE5ELkRST1BfTU9WRSkgewotCQkJCXVuZG9EZXNjID0gWE1MVUlNZXNzYWdlcy5EcmFnTm9kZUNvbW1hbmRfMDsKLQkJCX0KLQkJCWVsc2UgaWYgKGdldE9wZXJhdGlvbigpID09IERORC5EUk9QX0NPUFkpIHsKLQkJCQl1bmRvRGVzYyA9IFhNTFVJTWVzc2FnZXMuRHJhZ05vZGVDb21tYW5kXzE7Ci0JCQl9Ci0KLQkJCXN0cnVjdHVyZWRNb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCB1bmRvRGVzYyk7Ci0JCQlpZiAoYmF0Y2hVcGRhdGUpIHsKLQkJCQkvLyBzdHJ1Y3R1cmVkTW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gZXhlY3V0ZUhlbHBlcih0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZG9Nb2RpZnkoTm9kZSBzb3VyY2UsIE5vZGUgcGFyZW50Tm9kZSwgTm9kZSByZWZDaGlsZCwgYm9vbGVhbiB0ZXN0T25seSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoc291cmNlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJQXR0ciBzb3VyY2VBdHRyaWJ1dGUgPSAoQXR0cikgc291cmNlOwotCQkJRWxlbWVudCBzb3VyY2VBdHRyaWJ1dGVPd25lckVsZW1lbnQgPSBzb3VyY2VBdHRyaWJ1dGUuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQlpZiAoKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgJiYgKHNvdXJjZUF0dHJpYnV0ZU93bmVyRWxlbWVudCAhPSBwYXJlbnROb2RlKSkgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJaWYgKCF0ZXN0T25seSkgewotCQkJCQl0cnkgewotCQkJCQkJaWYgKGdldE9wZXJhdGlvbigpID09IERORC5EUk9QX01PVkUpIHsKLQkJCQkJCQlFbGVtZW50IHRhcmdldEVsZW1lbnQgPSAoRWxlbWVudCkgcGFyZW50Tm9kZTsKLQkJCQkJCQlzb3VyY2VBdHRyaWJ1dGVPd25lckVsZW1lbnQucmVtb3ZlQXR0cmlidXRlTm9kZShzb3VyY2VBdHRyaWJ1dGUpOwotCQkJCQkJCXRhcmdldEVsZW1lbnQuZ2V0QXR0cmlidXRlcygpLnNldE5hbWVkSXRlbShzb3VyY2VBdHRyaWJ1dGUpOwotCQkJCQkJCWZTZWxlY3Rpb25zLmFkZChzb3VyY2VBdHRyaWJ1dGUpOwotCQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGdldE9wZXJhdGlvbigpID09IERORC5EUk9QX0NPUFkpIHsKLQkJCQkJCQlBdHRyIGNsb25lQXR0cmlidXRlID0gKEF0dHIpIHNvdXJjZUF0dHJpYnV0ZS5jbG9uZU5vZGUoZmFsc2UpOwotCQkJCQkJCUVsZW1lbnQgdGFyZ2V0RWxlbWVudCA9IChFbGVtZW50KSBwYXJlbnROb2RlOwotCQkJCQkJCXRhcmdldEVsZW1lbnQuZ2V0QXR0cmlidXRlcygpLnNldE5hbWVkSXRlbShjbG9uZUF0dHJpYnV0ZSk7Ci0JCQkJCQkJZlNlbGVjdGlvbnMuYWRkKGNsb25lQXR0cmlidXRlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmICgoKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgfHwgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpKSAmJiAhKHJlZkNoaWxkIGluc3RhbmNlb2YgQXR0cikpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCi0JCQkJaWYgKCF0ZXN0T25seSkgewotCQkJCQl0cnkgewotCQkJCQkJaWYgKGlzQW5jZXN0b3Ioc291cmNlLCBwYXJlbnROb2RlKSkgewotCQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY2FuIG5vdCBwZXJmb3JtIHRoaXMgZHJhZyBkcm9wCi0JCQkJCQkJLy8gb3BlcmF0aW9uLi4uLiB0b2RvLi4uIHBvcCB1cCBkaWFsb2ciKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGRlZmVjdCAyMjEwNTUgdGhpcyB0ZXN0IGlzIHJlcXVpcmVkIG9yIGVsc2UgdGhlCi0JCQkJCQkJLy8gbm9kZSB3aWxsCi0JCQkJCQkJLy8gYmUgcmVtb3ZlZCBmcm9tIHRoZSB0cmVlIGFuZCB0aGUgaW5zZXJ0IHdpbGwgZmFpbAotCQkJCQkJCWlmIChzb3VyY2UgIT0gcmVmQ2hpbGQpIHsKLQkJCQkJCQkJaWYgKGdldE9wZXJhdGlvbigpID09IERORC5EUk9QX01PVkUpIHsKLQkJCQkJCQkJCU5vZGUgb2xkUGFyZW50ID0gc291cmNlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCQkJCU5vZGUgb2xkU2libGluZyA9IHNvdXJjZS5nZXROZXh0U2libGluZygpOwotCQkJCQkJCQkJb2xkUGFyZW50LnJlbW92ZUNoaWxkKHNvdXJjZSk7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCXBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNvdXJjZSwgcmVmQ2hpbGQpOwotCQkJCQkJCQkJfSBjYXRjaCAoRE9NRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkvLyBidWcxNTE2OTIgLSBpZiB1bmFibGUgdG8gbW92ZSBub2RlIHRvIG5ldyBsb2NhdGlvbiwgcmVpbnNlcnQgYmFjayB0byBvbGQgbG9jYXRpb24KLQkJCQkJCQkJCQlvbGRQYXJlbnQuaW5zZXJ0QmVmb3JlKHNvdXJjZSwgb2xkU2libGluZyk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlmU2VsZWN0aW9ucy5hZGQoc291cmNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIGlmIChnZXRPcGVyYXRpb24oKSA9PSBETkQuRFJPUF9DT1BZKSB7Ci0JCQkJCQkJCQlOb2RlIG5vZGVDbG9uZSA9IHNvdXJjZS5jbG9uZU5vZGUodHJ1ZSk7Ci0JCQkJCQkJCQlwYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlQ2xvbmUsIHJlZkNoaWxkKTsKLQkJCQkJCQkJCWZTZWxlY3Rpb25zLmFkZChub2RlQ2xvbmUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuZE1vZGVsQ2hhbmdlKE5vZGUgbm9kZSwgYm9vbGVhbiBiYXRjaFVwZGF0ZSkgewotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IGdldFN0cnVjdHVyZWRNb2RlbChub2RlKTsKLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJaWYgKGJhdGNoVXBkYXRlKSB7Ci0JCQkJLy8gc3RydWN0dXJlZE1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJZXhlY3V0ZUhlbHBlcihmYWxzZSk7Ci0KLQkJLy8gTWFrZSBvdXIgc2VsZWN0aW9uIGlmIHRoZSB0cmVlVmlld2VyICE9IG51bGwKLQkJaWYgKGZUcmVlVmlld2VyICE9IG51bGwpIHsKLQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZTZWxlY3Rpb25zKTsKLQkJCWZUcmVlVmlld2VyLnNldFNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBleGVjdXRlSGVscGVyKGJvb2xlYW4gdGVzdE9ubHkpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSB0YXJnZXROb2RlID0gKE5vZGUpIHRhcmdldDsKLQkJCU5vZGUgcGFyZW50Tm9kZSA9IGdldFBhcmVudEZvckRyb3BQb3NpdGlvbih0YXJnZXROb2RlKTsKLQkJCU5vZGUgcmVmQ2hpbGQgPSBnZXRSZWZDaGlsZCh0YXJnZXROb2RlKTsKLQotCQkJVmVjdG9yIHNvdXJjZXNMaXN0ID0gbmV3IFZlY3RvcigpOwotCQkJc291cmNlc0xpc3QuYWRkQWxsKHNvdXJjZXMpOwotCi0JCQlyZW1vdmVNZW1iZXJEZXNjZW5kYW50cyhzb3VyY2VzTGlzdCk7Ci0JCQlib29sZWFuIHBlcmZvcm1CYXRjaFVwZGF0ZSA9IHNvdXJjZXNMaXN0LnNpemUoKSA+IDU7Ci0KLQkJCWlmICghdGVzdE9ubHkpIHsKLQkJCQliZWdpbk1vZGVsQ2hhbmdlKHRhcmdldE5vZGUsIHBlcmZvcm1CYXRjaFVwZGF0ZSk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBzb3VyY2VzTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgc291cmNlID0gaS5uZXh0KCk7Ci0JCQkJaWYgKHNvdXJjZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJaWYgKCEoKHJlZkNoaWxkID09IG51bGwpICYmICh0YXJnZXROb2RlIGluc3RhbmNlb2YgQXR0cikpKSB7Ci0JCQkJCQlyZXN1bHQgPSBkb01vZGlmeSgoTm9kZSkgc291cmNlLCBwYXJlbnROb2RlLCByZWZDaGlsZCwgdGVzdE9ubHkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJaWYgKCFyZXN1bHQpIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKCF0ZXN0T25seSkgewotCQkJCWVuZE1vZGVsQ2hhbmdlKHRhcmdldE5vZGUsIHBlcmZvcm1CYXRjaFVwZGF0ZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIGludCBnZXRGZWVkYmFjaygpIHsKLQkJaW50IHJlc3VsdCA9IERORC5GRUVEQkFDS19TRUxFQ1Q7Ci0JCWlmIChsb2NhdGlvbiA+IDAuNzUpIHsKLQkJCXJlc3VsdCA9IERORC5GRUVEQkFDS19JTlNFUlRfQUZURVI7Ci0JCX0KLQkJZWxzZSBpZiAobG9jYXRpb24gPCAwLjI1KSB7Ci0JCQlyZXN1bHQgPSBETkQuRkVFREJBQ0tfSU5TRVJUX0JFRk9SRTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTm9kZSBnZXRQYXJlbnRGb3JEcm9wUG9zaXRpb24oTm9kZSBub2RlKSB7Ci0JCU5vZGUgcmVzdWx0ID0gbnVsbDsKLQotCQlpbnQgZmVlZGJhY2sgPSBnZXRGZWVkYmFjaygpOwotCQlpZiAoZmVlZGJhY2sgPT0gRE5ELkZFRURCQUNLX1NFTEVDVCkgewotCQkJcmVzdWx0ID0gbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGdldFBhcmVudE9yT3duZXIobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXByaXZhdGUgTm9kZSBnZXRQYXJlbnRPck93bmVyKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSA/ICgoQXR0cikgbm9kZSkuZ2V0T3duZXJFbGVtZW50KCkgOiBub2RlLmdldFBhcmVudE5vZGUoKTsKLQl9Ci0KLQotCXByaXZhdGUgTm9kZSBnZXRSZWZDaGlsZChOb2RlIG5vZGUpIHsKLQkJTm9kZSByZXN1bHQgPSBudWxsOwotCi0JCWludCBmZWVkYmFjayA9IGdldEZlZWRiYWNrKCk7Ci0KLQkJaWYgKGZlZWRiYWNrID09IERORC5GRUVEQkFDS19JTlNFUlRfQkVGT1JFKSB7Ci0JCQlyZXN1bHQgPSBub2RlOwotCQl9Ci0JCWVsc2UgaWYgKGZlZWRiYWNrID09IERORC5GRUVEQkFDS19JTlNFUlRfQUZURVIpIHsKLQkJCXJlc3VsdCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRTdHJ1Y3R1cmVkTW9kZWwoTm9kZSBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJcmVzdWx0ID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0TW9kZWwoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vIHJldHVybnMgdHJ1ZSBpZiBhIGlzIGFuIGFuY2VzdG9yZSBvZiBiCi0JLy8KLQlwcml2YXRlIGJvb2xlYW4gaXNBbmNlc3RvcihOb2RlIGEsIE5vZGUgYikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlmb3IgKE5vZGUgcGFyZW50ID0gYjsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChwYXJlbnQgPT0gYSkgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgbWVtYmVycyBvZiB0aGUgbGlzdCB0aGF0IGhhdmUgYW5jZXN0b3JzIHRoYXQgYXJlCi0JICogYWxzbyBtZW1iZXJzIG9mIHRoZSBsaXN0LgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVNZW1iZXJEZXNjZW5kYW50cyhMaXN0IGxpc3QpIHsKLQkJSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG5vZGUgPSBpLm5leHQoKTsKLQkJCXRhYmxlLnB1dChub2RlLCBub2RlKTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSBsaXN0LnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgbGlzdC5nZXQoaSk7Ci0JCQlmb3IgKE5vZGUgcGFyZW50ID0gZ2V0UGFyZW50T3JPd25lcihub2RlKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IGdldFBhcmVudE9yT3duZXIocGFyZW50KSkgewotCQkJCWlmICh0YWJsZS5nZXQocGFyZW50KSAhPSBudWxsKSB7Ci0JCQkJCWxpc3QucmVtb3ZlKGkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZG5kL1hNTERyYWdBbmREcm9wTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RuZC9YTUxEcmFnQW5kRHJvcE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgwOTdhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZG5kL1hNTERyYWdBbmREcm9wTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQuRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLkRyYWdBbmREcm9wTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5PYmplY3RUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5WaWV3ZXJEcmFnQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5WaWV3ZXJEcm9wQWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWE1MRHJhZ0FuZERyb3BNYW5hZ2VyIGltcGxlbWVudHMgRHJhZ0FuZERyb3BNYW5hZ2VyIHsKLQlwcml2YXRlIFRyZWVWaWV3ZXIgZlZpZXdlcjsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGREcmFnQW5kRHJvcFN1cHBvcnQoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTks7Ci0JCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW117T2JqZWN0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKX07Ci0JCXZpZXdlci5hZGREcmFnU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBWaWV3ZXJEcmFnQWRhcHRlcih2aWV3ZXIpKTsKLQkJdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IFZpZXdlckRyb3BBZGFwdGVyKHZpZXdlciwgbmV3IFhNTERyYWdBbmREcm9wTWFuYWdlcih2aWV3ZXIpKSk7Ci0JfQotCi0JcHVibGljIFhNTERyYWdBbmREcm9wTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgWE1MRHJhZ0FuZERyb3BNYW5hZ2VyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWZWaWV3ZXIgPSB2aWV3ZXI7Ci0JfQotCi0JcHVibGljIERyYWdBbmREcm9wQ29tbWFuZCBjcmVhdGVDb21tYW5kKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2UpIHsKLQkJRHJhZ0FuZERyb3BDb21tYW5kIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXN1bHQgPSBuZXcgRHJhZ05vZGVDb21tYW5kKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlLCBmVmlld2VyKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kb3VibGVjbGljay9YTUxEb3VibGVDbGlja1N0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZG91YmxlY2xpY2svWE1MRG91YmxlQ2xpY2tTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjMwOTdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kb3VibGVjbGljay9YTUxEb3VibGVDbGlja1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZG91YmxlY2xpY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRUZXh0RG91YmxlQ2xpY2tTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBYTUxEb3VibGVDbGlja1N0cmF0ZWd5IGV4dGVuZHMgRGVmYXVsdFRleHREb3VibGVDbGlja1N0cmF0ZWd5IHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgRE9VQkxFX1FVT1RFID0gJ1wiJzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgU0lOR0xFX1FVT1RFID0gJ1wnJzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgU1BBQ0UgPSAnICc7Ci0JcHJvdGVjdGVkIGludCBmQ2FyZXRQb3NpdGlvbiA9IC0xOwotCXByb3RlY3RlZCBpbnQgZkRvdWJsZUNsaWNrQ291bnQgPSAwOwotCXByb3RlY3RlZCBOb2RlIGZOb2RlID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBmU3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RydWN0dXJlZFRleHRWaWV3ZXIgZlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiBmVGV4dFJlZ2lvbiA9IG51bGw7Ci0KLQlwdWJsaWMgdm9pZCBkb3VibGVDbGlja2VkKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIpIHsKLQkJaWYgKHRleHRWaWV3ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgewotCQkJZlN0cnVjdHVyZWRUZXh0Vmlld2VyID0gKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB0ZXh0Vmlld2VyOwotCQkJdHJ5IHsKLQkJCQlmU3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmU3RydWN0dXJlZFRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0KLQkJCQlpZiAoZlN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCWludCBjYXJldFBvc2l0aW9uID0gdGV4dFZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCkueDsKLQkJCQkJaWYgKGNhcmV0UG9zaXRpb24gPCAwKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQlmTm9kZSA9IChOb2RlKSBmU3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oY2FyZXRQb3NpdGlvbik7Ci0JCQkJCWlmIChmTm9kZSA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQl1cGRhdGVEb3VibGVDbGlja0NvdW50KGNhcmV0UG9zaXRpb24pOwotCQkJCQl1cGRhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJdXBkYXRlVGV4dFJlZ2lvbigpOwotCi0JCQkJCWlmIChmTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCQlwcm9jZXNzVGV4dERvdWJsZUNsaWNrZWQoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXByb2Nlc3NFbGVtZW50RG91YmxlQ2xpY2tlZCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKGZTdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJCQlmU3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBQb2ludCBnZXRXb3JkKFN0cmluZyBzdHJpbmcsIGludCBjdXJzb3IpIHsKLQkJaWYgKHN0cmluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWludCB3b3JkU3RhcnQgPSAwOwotCQlpbnQgd29yZEVuZCA9IHN0cmluZy5sZW5ndGgoKTsKLQotCQl3b3JkU3RhcnQgPSBzdHJpbmcubGFzdEluZGV4T2YoU1BBQ0UsIGN1cnNvciAtIDEpOwotCQlpbnQgdGVtcCA9IHN0cmluZy5sYXN0SW5kZXhPZihTSU5HTEVfUVVPVEUsIGN1cnNvciAtIDEpOwotCQl3b3JkU3RhcnQgPSBNYXRoLm1heCh3b3JkU3RhcnQsIHRlbXApOwotCQl0ZW1wID0gc3RyaW5nLmxhc3RJbmRleE9mKERPVUJMRV9RVU9URSwgY3Vyc29yIC0gMSk7Ci0JCXdvcmRTdGFydCA9IE1hdGgubWF4KHdvcmRTdGFydCwgdGVtcCk7Ci0JCWlmICh3b3JkU3RhcnQgPT0gLTEpIHsKLQkJCXdvcmRTdGFydCA9IGN1cnNvcjsKLQkJfQotCQllbHNlIHsKLQkJCXdvcmRTdGFydCsrOwotCQl9Ci0KLQkJd29yZEVuZCA9IHN0cmluZy5pbmRleE9mKFNQQUNFLCBjdXJzb3IpOwotCQlpZiAod29yZEVuZCA9PSAtMSkgewotCQkJd29yZEVuZCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJfQotCQl0ZW1wID0gc3RyaW5nLmluZGV4T2YoU0lOR0xFX1FVT1RFLCBjdXJzb3IpOwotCQlpZiAodGVtcCA9PSAtMSkgewotCQkJdGVtcCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJfQotCQl3b3JkRW5kID0gTWF0aC5taW4od29yZEVuZCwgdGVtcCk7Ci0JCXRlbXAgPSBzdHJpbmcuaW5kZXhPZihET1VCTEVfUVVPVEUsIGN1cnNvcik7Ci0JCWlmICh0ZW1wID09IC0xKSB7Ci0JCQl0ZW1wID0gc3RyaW5nLmxlbmd0aCgpOwotCQl9Ci0JCXdvcmRFbmQgPSBNYXRoLm1pbih3b3JkRW5kLCB0ZW1wKTsKLQkJaWYgKHdvcmRFbmQgPT0gc3RyaW5nLmxlbmd0aCgpKSB7Ci0JCQl3b3JkRW5kID0gY3Vyc29yOwotCQl9Ci0KLQkJaWYgKCh3b3JkU3RhcnQgPT0gd29yZEVuZCkgJiYgIWlzUXVvdGVkKHN0cmluZykpIHsKLQkJCXdvcmRTdGFydCA9IDA7Ci0JCQl3b3JkRW5kID0gc3RyaW5nLmxlbmd0aCgpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBQb2ludCh3b3JkU3RhcnQsIHdvcmRFbmQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUXVvdGVkKFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKChzdHJpbmcgPT0gbnVsbCkgfHwgKHN0cmluZy5sZW5ndGgoKSA8IDIpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpbnQgbGFzdEluZGV4ID0gc3RyaW5nLmxlbmd0aCgpIC0gMTsKLQkJY2hhciBmaXJzdENoYXIgPSBzdHJpbmcuY2hhckF0KDApOwotCQljaGFyIGxhc3RDaGFyID0gc3RyaW5nLmNoYXJBdChsYXN0SW5kZXgpOwotCi0JCXJldHVybiAoKChmaXJzdENoYXIgPT0gU0lOR0xFX1FVT1RFKSAmJiAobGFzdENoYXIgPT0gU0lOR0xFX1FVT1RFKSkgfHwgKChmaXJzdENoYXIgPT0gRE9VQkxFX1FVT1RFKSAmJiAobGFzdENoYXIgPT0gRE9VQkxFX1FVT1RFKSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NFbGVtZW50QXR0ckVxdWFsc0RvdWJsZUNsaWNrZWQyVGltZXMoKSB7Ci0JCWludCBwcmV2UmVnaW9uT2Zmc2V0ID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbikgLSAxOwotCQlJVGV4dFJlZ2lvbiBwcmV2UmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwcmV2UmVnaW9uT2Zmc2V0KTsKLQkJaW50IG5leHRSZWdpb25PZmZzZXQgPSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldChmVGV4dFJlZ2lvbik7Ci0JCUlUZXh0UmVnaW9uIG5leHRSZWdpb24gPSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG5leHRSZWdpb25PZmZzZXQpOwotCi0JCWlmICgocHJldlJlZ2lvbiAhPSBudWxsKSAmJiAocHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSAmJiAobmV4dFJlZ2lvbiAhPSBudWxsKSAmJiAobmV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkpIHsKLQkJCWZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocHJldlJlZ2lvbiksIG5leHRSZWdpb24uZ2V0VGV4dEVuZCgpIC0gcHJldlJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NFbGVtZW50QXR0ck5hbWVEb3VibGVDbGlja2VkMlRpbWVzKCkgewotCQlpbnQgbmV4dFJlZ2lvbk9mZnNldCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KGZUZXh0UmVnaW9uKTsKLQkJSVRleHRSZWdpb24gbmV4dFJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobmV4dFJlZ2lvbk9mZnNldCk7Ci0KLQkJaWYgKG5leHRSZWdpb24gIT0gbnVsbCkgewotCQkJbmV4dFJlZ2lvbk9mZnNldCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KG5leHRSZWdpb24pOwotCQkJbmV4dFJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobmV4dFJlZ2lvbk9mZnNldCk7Ci0JCQlpZiAoKG5leHRSZWdpb24gIT0gbnVsbCkgJiYgKG5leHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpKSB7Ci0JCQkJZlN0cnVjdHVyZWRUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbiksIG5leHRSZWdpb24uZ2V0VGV4dEVuZCgpIC0gZlRleHRSZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBhdHRyaWJ1dGUgaGFzIG5vIHZhbHVlCi0JCQkJZlN0cnVjdHVyZWRUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpLCBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQlmRG91YmxlQ2xpY2tDb3VudCA9IDA7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRWxlbWVudEF0dHJWYWx1ZURvdWJsZUNsaWNrZWQoKSB7Ci0JCVN0cmluZyByZWdpb25UZXh0ID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KGZUZXh0UmVnaW9uKTsKLQotCQlpZiAoZkRvdWJsZUNsaWNrQ291bnQgPT0gMSkgewotCQkJUG9pbnQgd29yZCA9IGdldFdvcmQocmVnaW9uVGV4dCwgZkNhcmV0UG9zaXRpb24gLSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKSk7Ci0JCQlpZiAod29yZC54ID09IHdvcmQueSkgeyAvLyBubyB3b3JkIGZvdW5kOyBzZWxlY3Qgd2hvbGUgcmVnaW9uCi0JCQkJZlN0cnVjdHVyZWRUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbiksIHJlZ2lvblRleHQubGVuZ3RoKCkpOwotCQkJCWZEb3VibGVDbGlja0NvdW50Kys7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKSArIHdvcmQueCwgd29yZC55IC0gd29yZC54KTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChmRG91YmxlQ2xpY2tDb3VudCA9PSAyKSB7Ci0JCQlpZiAoaXNRdW90ZWQocmVnaW9uVGV4dCkpIHsKLQkJCQkvLyA9PT4gLy8gUG9pbnQgd29yZCA9IGdldFdvcmQocmVnaW9uVGV4dCwgZkNhcmV0UG9zaXRpb24gLQotCQkJCS8vIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZlRleHRSZWdpb24pKTsKLQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKSwgcmVnaW9uVGV4dC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwcm9jZXNzRWxlbWVudEF0dHJWYWx1ZURvdWJsZUNsaWNrZWQyVGltZXMoKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChmRG91YmxlQ2xpY2tDb3VudCA9PSAzKSB7Ci0JCQlpZiAoaXNRdW90ZWQocmVnaW9uVGV4dCkpIHsKLQkJCQlwcm9jZXNzRWxlbWVudEF0dHJWYWx1ZURvdWJsZUNsaWNrZWQyVGltZXMoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSwgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJZkRvdWJsZUNsaWNrQ291bnQgPSAwOwotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBmRG91YmxlQ2xpY2tDb3VudCA9PSA0Ci0JCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCksIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJZkRvdWJsZUNsaWNrQ291bnQgPSAwOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0VsZW1lbnRBdHRyVmFsdWVEb3VibGVDbGlja2VkMlRpbWVzKCkgewotCQlpbnQgcHJldlJlZ2lvbk9mZnNldCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZlRleHRSZWdpb24pIC0gMTsKLQkJSVRleHRSZWdpb24gcHJldlJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocHJldlJlZ2lvbk9mZnNldCk7Ci0KLQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCkgewotCQkJcHJldlJlZ2lvbk9mZnNldCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocHJldlJlZ2lvbikgLSAxOwotCQkJcHJldlJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocHJldlJlZ2lvbk9mZnNldCk7Ci0JCQlpZiAoKHByZXZSZWdpb24gIT0gbnVsbCkgJiYgKHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpIHsKLQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHByZXZSZWdpb24pLCBmVGV4dFJlZ2lvbi5nZXRUZXh0RW5kKCkgLSBwcmV2UmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0VsZW1lbnREb3VibGVDbGlja2VkKCkgewotCQlpZiAoZlRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCXByb2Nlc3NFbGVtZW50QXR0clZhbHVlRG91YmxlQ2xpY2tlZCgpOyAvLyBzcGVjaWFsIGhhbmRsaW5nIGZvcgotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGZEb3VibGVDbGlja0NvdW50ID09IDEpIHsKLQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCkgKyBmVGV4dFJlZ2lvbi5nZXRTdGFydCgpLCBmVGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJfQotCQkJZWxzZSBpZiAoZkRvdWJsZUNsaWNrQ291bnQgPT0gMikgewotCQkJCWlmIChmVGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCXByb2Nlc3NFbGVtZW50QXR0ck5hbWVEb3VibGVDbGlja2VkMlRpbWVzKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGZUZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCQlwcm9jZXNzRWxlbWVudEF0dHJFcXVhbHNEb3VibGVDbGlja2VkMlRpbWVzKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCksIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQlmRG91YmxlQ2xpY2tDb3VudCA9IDA7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7IC8vIGZEb3VibGVDbGlja0NvdW50ID09IDMKLQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCksIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWZEb3VibGVDbGlja0NvdW50ID0gMDsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NUZXh0RG91YmxlQ2xpY2tlZCgpIHsKLQkJaWYgKGZEb3VibGVDbGlja0NvdW50ID09IDEpIHsKLQkJCXN1cGVyLmRvdWJsZUNsaWNrZWQoZlN0cnVjdHVyZWRUZXh0Vmlld2VyKTsKLQotCQkJUG9pbnQgc2VsZWN0ZWRSYW5nZSA9IGZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCk7Ci0JCQlpZiAoKHNlbGVjdGVkUmFuZ2UueCA9PSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKSkgJiYgKHNlbGVjdGVkUmFuZ2UueSA9PSBmVGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpKSB7Ci0JCQkJLy8gb25seSBvbmUgd29yZCBpbiByZWdpb24sIHNraXAgb25lIGxldmVsIG9mIGRvdWJsZSBjbGljawotCQkJCS8vIHNlbGVjdGlvbgotCQkJCWZEb3VibGVDbGlja0NvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZkRvdWJsZUNsaWNrQ291bnQgPT0gMikgewotCQkJaWYgKGZUZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCkgewotCQkJCWZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSwgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJZkRvdWJsZUNsaWNrQ291bnQgPSAwOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGlzUXVvdGVkKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RnVsbFRleHQoZlRleHRSZWdpb24pKSkgewotCQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKSArIDEsIGZUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSAtIDIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZlN0cnVjdHVyZWRUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbiksIGZUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKChmRG91YmxlQ2xpY2tDb3VudCA9PSAzKSAmJiBpc1F1b3RlZChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEZ1bGxUZXh0KGZUZXh0UmVnaW9uKSkpIHsKLQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKSwgZlRleHRSZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICgoZkRvdWJsZUNsaWNrQ291bnQgPT0gMykgJiYgaXNRdW90ZWQoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblRleHQpKSB7Ci0JCQkJCWZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSArIDEsIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkgLSAyKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSwgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCWZEb3VibGVDbGlja0NvdW50ID0gMDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlmU3RydWN0dXJlZE1vZGVsID0gc3RydWN0dXJlZE1vZGVsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURvdWJsZUNsaWNrQ291bnQoaW50IGNhcmV0UG9zaXRpb24pIHsKLQkJaWYgKGZDYXJldFBvc2l0aW9uID09IGNhcmV0UG9zaXRpb24pIHsKLQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQlmRG91YmxlQ2xpY2tDb3VudCsrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZkRvdWJsZUNsaWNrQ291bnQgPSAxOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJZkNhcmV0UG9zaXRpb24gPSBjYXJldFBvc2l0aW9uOwotCQkJZkRvdWJsZUNsaWNrQ291bnQgPSAxOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZlN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChmQ2FyZXRQb3NpdGlvbik7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UZXh0ID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUZXh0UmVnaW9uKCkgewotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlmVGV4dFJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZkNhcmV0UG9zaXRpb24pOwotCQkJLy8gaWYgZlRleHRSZWdpb24gaXMgbnVsbCwgaXQgbWVhbnMgd2UgYXJlIGF0IGp1c3QgcGFzdCB0aGUgbGFzdAotCQkJLy8gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwKLQkJCS8vIGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgZG9jdW1lbnQsIHNvIHdlJ2xsIHVzZSB0aGUgbGFzdCB0ZXh0Ci0JCQkvLyByZWdpb24gaW4gdGhlIGRvY3VtZW50Ci0JCQlpZiAoZlRleHRSZWdpb24gPT0gbnVsbCkgewotCQkJCWZUZXh0UmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChmQ2FyZXRQb3NpdGlvbiAtIDEpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJZlRleHRSZWdpb24gPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9DTUltYWdlVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9DTUltYWdlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDMyMGVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9lZGl0b3IvQ01JbWFnZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBAYXV0aG9yIG5zZAotICovCi1wdWJsaWMgY2xhc3MgQ01JbWFnZVV0aWwgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU01BTExfSUNPTl9VUkwgPSAic21hbGwtaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgQ01Ob2RlIGdldERlY2xhcmF0aW9uKE5vZGUgbm9kZSkgewotCQlDTU5vZGUgZGVjbCA9IG51bGw7Ci0JCU1vZGVsUXVlcnkgbXEgPSBudWxsOwotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDogewotCQkJCW1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSgoKEF0dHIpIG5vZGUpLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQkJZGVjbCA9IG1xLmdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oKEF0dHIpIG5vZGUpOwotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQltcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJCWRlY2wgPSBtcS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgbm9kZSk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGRlY2w7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShDTU5vZGUgY21ub2RlKSB7Ci0JCWlmIChjbW5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihjbW5vZGUpOwotCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IGRlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoZmFsc2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoQ01Ob2RlIGNtbm9kZSkgewotCQlpZiAoY21ub2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCS8vIGNhY2hlIENNLXNwZWNpZmllZCBpbWFnZXMgd2l0aCB0aGUgWE1MIFVJIHBsdWdpbgotCQlTdHJpbmcgaW1hZ2VVUkxTdHJpbmcgPSAoU3RyaW5nKSBjbW5vZGUuZ2V0UHJvcGVydHkoU01BTExfSUNPTl9VUkwpOwotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG51bGw7Ci0JCWlmICgoaW1hZ2VVUkxTdHJpbmcgIT0gbnVsbCkgJiYgKGltYWdlVVJMU3RyaW5nLmxlbmd0aCgpID4gMCkpIHsKLQkJCWRlc2NyaXB0b3IgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlUmVnaXN0cnkoKS5nZXREZXNjcmlwdG9yKGltYWdlVVJMU3RyaW5nKTsKLQkJCWlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlVUkwgaW1hZ2VVUkwgPSBuZXcgVVJMKGltYWdlVVJMU3RyaW5nKTsKLQkJCQkJVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gaW1hZ2VVUkwub3BlbkNvbm5lY3Rpb24oKTsKLQkJCQkJY29ubmVjdGlvbi5zZXRVc2VDYWNoZXMoZmFsc2UpOwotCQkJCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUltYWdlRGF0YSBkYXRhID0gbmV3IEltYWdlRGF0YShpbnB1dFN0cmVhbSk7Ci0JCQkJCQlkZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21JbWFnZURhdGEoZGF0YSk7Ci0JCQkJCQlYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlUmVnaXN0cnkoKS5wdXQoaW1hZ2VVUkxTdHJpbmcsIGRlc2NyaXB0b3IpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJCQkJLyoKLQkJCQkJCSAqIFRoZXJlIHdhcyBhIHByb2JsZW0gbG9hZGluZyBpbWFnZSBmcm9tIHN0cmVhbQotCQkJCQkJICogKGNvcnJ1cHQsIG1pc3NpbmcsIGV0Yy4pCi0JCQkJCQkgKi8KLQkJCQkJCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKQotCQkJCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWRlc2NyaXB0b3IgPSBudWxsOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlkZXNjcmlwdG9yID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDTUltYWdlVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0MDA0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotLyoqCi0gKiBIZWxwIGNvbnRleHQgaWRzIGZvciB0aGUgWE1MIFNvdXJjZSBFZGl0b3IuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUKLSAqIGltcGxlbWVudGVkLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUhlbHBDb250ZXh0SWRzIHsKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IFhNTFVJUGx1Z2luLklEICsgIi4iOyAvLyROT04tTkxTLTEkCi0KLQkvLyBmaWd1cmVkIG91dCBvbiB0aGUgZmx5Ci0JLy8gLy8gWE1MIFNvdXJjZSBwYWdlIGVkaXRvcgotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9TT1VSQ0VWSUVXX0hFTFBJRCA9Ci0JLy8gQ29udGVudFR5cGVJZEZvclhNTC5Db250ZW50VHlwZUlEX1hNTCArIl9zb3VyY2VfSGVscElkIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gWE1MIEZpbGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QUkVGV0VCWF9GSUxFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwNjAiOyAvLyROT04tTkxTLTEkCi0JLy8gWE1MIFNvdXJjZSBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfUFJFRldFQlhfU09VUkNFX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDA2MSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBYTUwgU3R5bGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDYyIjsgLy8kTk9OLU5MUy0xJAotCS8vIFhNTCBUZW1wbGF0ZXMgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwNjMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBYTUwgQ2xlYW51cCBkaWFsb2cKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTlVQX1hNTF9IRUxQSUQgPSBQUkVGSVggKyAieG1sbTEyMDAiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBYTUwgTmV3IEZpbGUgV2l6YXJkIC0gVGVtcGxhdGUgUGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEID0gUFJFRklYICsgInhtbHcwMDEwIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjliNmI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9lZGl0b3IvWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGhhbmRsZSBpbWFnZXMgcHJvdmlkZWQgYnkgdGhpcyBwbHVnLWluLgotICogCi0gKiBOT1RFOiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuIEZvciBpbWFnZXMgdXNlZCBleHRlcm5hbGx5LCBwbGVhc2UgdXNlIHRoZQotICogU2hhcmVkKioqSW1hZ2VIZWxwZXIgY2xhc3MgaW5zdGVhZC4KLSAqIAotICogQGF1dGhvciBhbXl3dQotICovCi1wdWJsaWMgY2xhc3MgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgewotCXByaXZhdGUgc3RhdGljIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyIGluc3RhbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIEdldHMgdGhlIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvLyBzYXZlIGEgZGVzY3JpcHRvciBmb3IgZWFjaCBpbWFnZQotCXByaXZhdGUgSGFzaE1hcCBmSW1hZ2VEZXNjUmVnaXN0cnkgPSBudWxsOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBMVUdJTklEID0gWE1MVUlQbHVnaW4uSUQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGZyb20gdGhlIGdpdmVuIHJlc291cmNlIGFuZCBhZGRzIHRoZSBpbWFnZSB0byB0aGUKLQkgKiBpbWFnZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIEltYWdlCi0JICovCi0JcHJpdmF0ZSBJbWFnZSBjcmVhdGVJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBnZXRJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0KLQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCQkvLyBkb250IGFkZCB0aGUgbWlzc2luZyBpbWFnZSBkZXNjcmlwdG9yIGltYWdlIHRvIHRoZSBpbWFnZQotCQkJLy8gcmVnaXN0cnkKLQkJCWlmICghZGVzYy5lcXVhbHMoSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKSkpIHsKLQkJCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHJlc291cmNlLCBpbWFnZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmcm9tIHRoZSBnaXZlbiBpbWFnZUZpbGVQYXRoIGFuZCBhZGRzIHRoZQotCSAqIGltYWdlIGRlc2NyaXB0b3IgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIGFuIGltYWdlCi0JICogZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgY3JlYXRlZCwgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IKLQkgKiBpcyByZXR1cm5lZCBidXQgbm90IGFkZGVkIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVQYXRoCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgaW1hZ2UgZGVzY3JpcHRvciBmb3IgaW1hZ2VGaWxlUGF0aCBvciBkZWZhdWx0Ci0JICogICAgICAgICAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGltYWdlRmlsZVBhdGgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5JRCwgaW1hZ2VGaWxlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5wdXQoaW1hZ2VGaWxlUGF0aCwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqIElmIHRoZSBpbWFnZSBjYW5ub3QgYmUgcmV0cmlldmVkLCBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGF0Ci0JICogdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2UgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBvciBudWxsIGlmIG9uZSBjb3VsZAotCSAqICAgICAgICAgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGFuIGltYWdlCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZQotCSAqIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGNhbm5vdCBiZSByZXRyaWV2ZWQsCi0JICogYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQKLQkgKiBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NhdGVkIHdpdGggcmVzb3VyY2Ugb3IKLQkgKiAgICAgICAgIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIG9uZSBjb3VsZCBub3QgYmUKLQkgKiAgICAgICAgIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlPYmplY3QgbyA9IGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGEgZGVzY3JpcHRvcgotCQkJaW1hZ2VEZXNjcmlwdG9yID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IChJbWFnZURlc2NyaXB0b3IpIG87Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEhhc2hNYXAgLSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJaWYgKGZJbWFnZURlc2NSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlmSW1hZ2VEZXNjUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXJldHVybiBmSW1hZ2VEZXNjUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSW1hZ2VSZWdpc3RyeSAtIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9lZGl0b3IvWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZWRpdG9yL1hNTEVkaXRvclBsdWdpbkltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTJhNjNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9lZGl0b3IvWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yOwotCi0vKioKLSAqIEJ1bmRsZSBvZiBtb3N0IGltYWdlcyB1c2VkIGJ5IHRoZSBYTUwgU291cmNlIEVkaXRvciBwbHVnLWluLgotICovCi1wdWJsaWMgY2xhc3MgWE1MRWRpdG9yUGx1Z2luSW1hZ2VzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9DT05TVFJBSU5PRkYgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L2NvbnN0cmFpbm9mZi5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX0NPTlNUUkFJTk9OID0gImljb25zL2Z1bGwvZHRvb2wxNi9jb25zdHJhaW5vbi5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX1JMREdSTVIgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L3JsZGdybXIuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9WQUxJREFURSA9ICJpY29ucy9mdWxsL2R0b29sMTYvdmFsaWRhdGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9DT05TVFJBSU5PRkYgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L2NvbnN0cmFpbm9mZi5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0NPTlNUUkFJTk9OID0gImljb25zL2Z1bGwvZXRvb2wxNi9jb25zdHJhaW5vbi5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX1JMREdSTVIgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L3JsZGdybXIuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9WQUxJREFURSA9ICJpY29ucy9mdWxsL2V0b29sMTYvdmFsaWRhdGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQUREX0NPUlJFQ1RJT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9hZGRfY29ycmVjdGlvbi5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9BVFRfUkVRX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2F0dF9yZXFfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQVRUUklCVVRFID0gImljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DREFUQVNFQ1RJT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9jZGF0YXNlY3Rpb24uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ09NTUVOVCA9ICJpY29ucy9mdWxsL29iajE2L2NvbW1lbnRfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NPUlJFQ1RJT05fQ0hBTkdFID0gImljb25zL2Z1bGwvb2JqMTYvY29ycmVjdGlvbl9jaGFuZ2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfRE9DVFlQRSA9ICJpY29ucy9mdWxsL29iajE2L2RvY3R5cGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfRFRERklMRSA9ICJpY29ucy9mdWxsL29iajE2L2R0ZGZpbGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0VMRU1FTlQgPSAiaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50X29iai5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9FTlRJVFkgPSAiaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfRU5USVRZX1JFRkVSRU5DRSA9ICJpY29ucy9mdWxsL29iajE2L2VudGl0eV9yZWZlcmVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfRU5VTSA9ICJpY29ucy9mdWxsL29iajE2L2VudW0uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfTE9DQUxfVkFSSUFCTEUgPSAiaWNvbnMvZnVsbC9vYmoxNi9sb2NhbHZhcmlhYmxlX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9OT1RBVElPTiA9ICJpY29ucy9mdWxsL29iajE2L25vdGF0aW9uLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1BST0NFU1NJTkdJTlNUUlVDVElPTiA9ICJpY29ucy9mdWxsL29iajE2L3Byb2luc3Rfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19HRU5FUklDID0gImljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0dFTkVSSUNfREVFTVBIQVNJWkVEID0gImljb25zL2Z1bGwvb2JqMTYvdGFnX2dlbmVyaWNfZGVlbXBoYXNpemVkX29iai5naWYiOyAvLyROT04tTkxTLTEkICAgIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0dFTkVSSUNfRU1QSEFTSVpFRCA9ICJpY29ucy9mdWxsL29iajE2L3RhZ19nZW5lcmljX2VtcGhhc2l6ZWRfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQgICAgICAgIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX01BQ1JPID0gImljb25zL2Z1bGwvb2JqMTYvdGFnLW1hY3JvLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RYVEVYVCA9ICJpY29ucy9mdWxsL29iajE2L3RleHQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfV0FSTklOR19PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi93YXJuaW5nX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9YU0RGSUxFID0gImljb25zL2Z1bGwvb2JqMTYvWFNERmlsZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT1ZSX0VSUk9SID0gImljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3ZyLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT1ZSX1NUQUxFX0VSUk9SID0gImljb25zL2Z1bGwvb3ZyMTYvc3RhbGVfZXJyb3Jfb3ZyLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT1ZSX1dBUk4gPSAiaWNvbnMvZnVsbC9vdnIxNi93YXJuX292ci5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0laQkFOX0dFTkVSQVRFWE1MID0gImljb25zL2Z1bGwvd2l6YmFuL2dlbmVyYXRleG1sX3dpei5wbmciOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvQWJzdHJhY3RTaWJsaW5nTmF2aWdhdGlvbkhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9BYnN0cmFjdFNpYmxpbmdOYXZpZ2F0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTA1NjViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9BYnN0cmFjdFNpYmxpbmdOYXZpZ2F0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogUHJvdmlkZXMgbmF2aWdhdGlvbiB0byBuZXh0L3ByZXZpb3VzIERPTSBzaWJsaW5nIE5vZGVzCi0gKi8KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBBYnN0cmFjdFNpYmxpbmdOYXZpZ2F0aW9uSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVFZGl0b3IoZXZlbnQpOwotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQllbHNlIHsKLQkJCU9iamVjdCBvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0JCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCU5vZGUgc2libGluZyA9IG51bGw7Ci0KLQkJCQkJaWYgKCgoTm9kZSkgbykuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkJCQlvID0gKChBdHRyKSBvKS5nZXRPd25lckVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCQlpZiAobW92ZUZvcndhcmQoKSkgewotCQkJCQkJc2libGluZyA9ICgoTm9kZSkgbykuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCXdoaWxlIChzaWJsaW5nICE9IG51bGwgJiYgc2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIHNpYmxpbmcuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQlzaWJsaW5nID0gc2libGluZy5nZXROZXh0U2libGluZygpOwotCQkJCQkJfQotCQkJCQkJaWYgKHNpYmxpbmcgPT0gbnVsbCkgewotCQkJCQkJCXNpYmxpbmcgPSAoKE5vZGUpIG8pLmdldFBhcmVudE5vZGUoKS5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJCQkJd2hpbGUgKHNpYmxpbmcgIT0gbnVsbCAmJiBzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgc2libGluZy5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCQlzaWJsaW5nID0gc2libGluZy5nZXROZXh0U2libGluZygpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXNpYmxpbmcgPSAoKE5vZGUpIG8pLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCQkJd2hpbGUgKHNpYmxpbmcgIT0gbnVsbCAmJiBzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgc2libGluZy5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXNpYmxpbmcgPSBzaWJsaW5nLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCQkJfQotCQkJCQkJaWYgKHNpYmxpbmcgPT0gbnVsbCkgewotCQkJCQkJCXNpYmxpbmcgPSAoKE5vZGUpIG8pLmdldFBhcmVudE5vZGUoKS5nZXRMYXN0Q2hpbGQoKTsKLQkJCQkJCQl3aGlsZSAoc2libGluZyAhPSBudWxsICYmIHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBzaWJsaW5nLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJCXNpYmxpbmcgPSBzaWJsaW5nLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIFRoZSBvbmx5IGNoaWxkIGlzIGEgVGV4dCBOb2RlLCBnbyB0byB0aGUgcGFyZW50IE5vZGUKLQkJCQkJaWYgKCgoTm9kZSkgbykuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBvLmVxdWFscyhzaWJsaW5nKSkgewotCQkJCQkJc2libGluZyA9ICgoTm9kZSkgbykuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQl9Ci0KLQotCQkJCQlpZiAoc2libGluZyAhPSBudWxsKSB7Ci0JCQkJCQl0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNpYmxpbmcpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlRm9yd2FyZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0FkZEJsb2NrQ29tbWVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9BZGRCbG9ja0NvbW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NWYzN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0FkZEJsb2NrQ29tbWVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24sIGJ1ZyAyMTIzMzAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ29tbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgQWRkQmxvY2tDb21tZW50SGFuZGxlciBleHRlbmRzIENvbW1lbnRIYW5kbGVyIGltcGxlbWVudHMgSUhhbmRsZXIgewotCi0JcHVibGljIEFkZEJsb2NrQ29tbWVudEhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0Jdm9pZCBwcm9jZXNzQWN0aW9uKElUZXh0RWRpdG9yIHRleHRFZGl0b3IsIElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUluZGV4ZWRSZWdpb24gc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQkJCQlJbmRleGVkUmVnaW9uIHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQotCQkJCWlmIChzZWxlY3Rpb25TdGFydEluZGV4ZWRSZWdpb24gPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICgoc2VsZWN0aW9uRW5kSW5kZXhlZFJlZ2lvbiA9PSBudWxsKSAmJiAodGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSA+IDApKSB7Ci0JCQkJCXNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpIC0gMSk7Ci0JCQkJfQotCQkJCWlmIChzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWludCBvcGVuQ29tbWVudE9mZnNldCA9IHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJCWludCBjbG9zZUNvbW1lbnRPZmZzZXQgPSBzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpICsgT1BFTl9DT01NRU5ULmxlbmd0aCgpOwotCi0JCQkJaWYgKCh0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpID09IDApICYmIChzZWxlY3Rpb25TdGFydEluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBDb21tZW50SW1wbCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFhNTFVJTWVzc2FnZXMuQWRkQmxvY2tDb21tZW50X3Rvb2x0aXApOwotCQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0JCQkJdHJ5IHsKLQkJCQkJZG9jdW1lbnQucmVwbGFjZShvcGVuQ29tbWVudE9mZnNldCwgMCwgT1BFTl9DT01NRU5UKTsKLQkJCQkJZG9jdW1lbnQucmVwbGFjZShjbG9zZUNvbW1lbnRPZmZzZXQsIDAsIENMT1NFX0NPTU1FTlQpOwotCQkJCQlzdXBlci5yZW1vdmVPcGVuQ2xvc2VDb21tZW50cyhkb2N1bWVudCwgb3BlbkNvbW1lbnRPZmZzZXQgKyBPUEVOX0NPTU1FTlQubGVuZ3RoKCksIGNsb3NlQ29tbWVudE9mZnNldCAtIG9wZW5Db21tZW50T2Zmc2V0IC0gQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCQltb2RlbC5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvQ2xlYW51cGRvY3VtZW50SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0NsZWFudXBkb2N1bWVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ0NmEwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvQ2xlYW51cGRvY3VtZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gLSBidWcgMjEyMzMwIC0KLSAqICAgICAgICAgICAgICAgICAgICBCYXNlZCBvZmYgQ2xlYW51cEFjdGlvblhNTERlbGVnYXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNsZWFudXBQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLkNsZWFudXBEaWFsb2dYTUw7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhbnVwZG9jdW1lbnRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSUhhbmRsZXIgewotCXByaXZhdGUgSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGZDbGVhbnVwUHJvY2Vzc29yOwotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbnVsbGluZyBvdXQganVzdCBpbiBjYXNlCi0JCWZDbGVhbnVwUHJvY2Vzc29yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVFZGl0b3IoZXZlbnQpOwotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQllbHNlIHsKLQkJCU9iamVjdCBvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0JCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCWZpbmFsIElUZXh0RWRpdG9yIGZpbmFsVGV4dEVkaXRvciA9IHRleHRFZGl0b3I7Ci0JCQlEaWFsb2cgY2xlYW51cERpYWxvZyA9IG5ldyBDbGVhbnVwRGlhbG9nWE1MKGVkaXRvci5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQlpZiAoY2xlYW51cERpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJLy8gc2V0dXAgcnVubmFibGUKLQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGNsZWFudXBQcm9jZXNzb3IgPSBnZXRDbGVhbnVwUHJvY2Vzc29yKCk7Ci0JCQkJCQlpZiAoY2xlYW51cFByb2Nlc3NvciAhPSBudWxsKSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGZpbmFsVGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZmluYWxUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpKTsKLQkJCQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCQkJCWNsZWFudXBQcm9jZXNzb3IuY2xlYW51cE1vZGVsKG1vZGVsKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCS8vIFRPRE86IG1ha2UgaW5kZXBlbmRlbnQgb2YgJ21vZGVsJy4KLQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQodGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKSk7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBiZWdpbiByZWNvcmRpbmcKLQkJCQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgdGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJbW9kZWwuYmVnaW5SZWNvcmRpbmcodGhpcywgU1NFVUlNZXNzYWdlcy5DbGVhbnVwX0RvY3VtZW50X1VJXywgU1NFVUlNZXNzYWdlcy5DbGVhbnVwX0RvY3VtZW50X1VJXywgc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCi0JCQkJCQkvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBhYm91dCB0byBtYWtlIGEgYmlnCi0JCQkJCQkvLyBtb2RlbCBjaGFuZ2UKLQkJCQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0JCQkJCQkvLyBydW4KLQkJCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKHRleHRFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBydW5uYWJsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZwotCQkJCQkJLy8gbW9kZWwKLQkJCQkJCS8vIGNoYW5nZQotCQkJCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0KLQkJCQkJCS8vIGVuZCByZWNvcmRpbmcKLQkJCQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgdGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMsIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGdldENsZWFudXBQcm9jZXNzb3IoKSB7Ci0JCWlmIChmQ2xlYW51cFByb2Nlc3NvciA9PSBudWxsKSB7Ci0JCQlmQ2xlYW51cFByb2Nlc3NvciA9IG5ldyBDbGVhbnVwUHJvY2Vzc29yWE1MKCk7Ci0JCX0KLQotCQlyZXR1cm4gZkNsZWFudXBQcm9jZXNzb3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0NvbGxhcHNlQWxsSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0NvbGxhcHNlQWxsSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGM2NDRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9Db2xsYXBzZUFsbEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24sIGJ1ZyAyMTIzMzAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBDb2xsYXBzZUFsbEhhbmRsZXIgZXh0ZW5kcyBFeHBhbmRDb2xsYXBzZUFsbEhhbmRsZXIgaW1wbGVtZW50cyBJSGFuZGxlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ29sbGFwc2VBbGxIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyI2V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gSGFuZGxlclV0aWwuZ2V0QWN0aXZlRWRpdG9yKGV2ZW50KTsKLQkJCi0JCXZpZXdlciA9IGdldFRhYmxlVHJlZVZpZXdlckZvckVkaXRvclBhcnQoZWRpdG9yUGFydCk7Ci0JCQotCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCS8vIHRlbXBvcmFyaWx5IHNldCB0aGUgdmlzaWJpbGl0eSB0byBmYWxzZQotCQkJLy8gdGhpcyBoYXMgYSBIVUdFIHBlcmZvcm1hbmNlIGJlbmVmaXQKLQkJCWJvb2xlYW4gaXNWaXNpYmxlID0gdmlld2VyLmdldENvbnRyb2woKS5nZXRWaXNpYmxlKCk7Ci0JCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldFZpc2libGUoZmFsc2UpOwotCQkJdmlld2VyLmNvbGxhcHNlQWxsKCk7Ci0KLQkJCS8vIHJlc3RvcmUgdGhlIHByZXZpb3VzIHZpc2liaWxpdHkgc3RhdGUKLQkJCS8vIAotCQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRWaXNpYmxlKGlzVmlzaWJsZSk7Ci0JCX0JCQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0NvbW1lbnRIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvQ29tbWVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE4OGRiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvQ29tbWVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uLCBidWcgMjEyMzMwCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5JSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi1wdWJsaWMgY2xhc3MgQ29tbWVudEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBJSGFuZGxlciB7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBDTE9TRV9DT01NRU5UID0gIi0tPiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fQ09NTUVOVCA9ICI8IS0tIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIENvbW1lbnRIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZUVkaXRvcihldmVudCk7Ci0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpCi0JCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3I7Ci0JCWVsc2UgewotCQkJT2JqZWN0IG8gPSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQlpZiAobyAhPSBudWxsKQotCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIG87Ci0JCX0KLQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24KLQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gZ2V0Q3VycmVudFNlbGVjdGlvbih0ZXh0RWRpdG9yKTsKLQkJCQlpZiAodGV4dFNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHJvY2Vzc0FjdGlvbih0ZXh0RWRpdG9yLCBkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVRleHRTZWxlY3Rpb24gZ2V0Q3VycmVudFNlbGVjdGlvbihJVGV4dEVkaXRvciB0ZXh0RWRpdG9yKSB7Ci0JCUlTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IHRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gcHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCQlyZXR1cm4gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFRleHRTZWxlY3Rpb24uZW1wdHlTZWxlY3Rpb24oKTsKLQl9Ci0KLQl2b2lkIHByb2Nlc3NBY3Rpb24oSVRleHRFZGl0b3IgdGV4dEVkaXRvciwgSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCS8vIEltcGxlbWVudGF0aW9ucyB0byBvdmVyIHJpZGUuCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlT3BlbkNsb3NlQ29tbWVudHMoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXRyeSB7Ci0JCQlpbnQgYWRqdXN0ZWRfbGVuZ3RoID0gbGVuZ3RoOwotCi0JCQkvLyByZW1vdmUgb3BlbiBjb21tZW50cwotCQkJU3RyaW5nIHN0cmluZyA9IGRvY3VtZW50LmdldChvZmZzZXQsIGxlbmd0aCk7Ci0JCQlpbnQgaW5kZXggPSBzdHJpbmcubGFzdEluZGV4T2YoT1BFTl9DT01NRU5UKTsKLQkJCXdoaWxlIChpbmRleCAhPSAtMSkgewotCQkJCWRvY3VtZW50LnJlcGxhY2Uob2Zmc2V0ICsgaW5kZXgsIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW5kZXggPSBzdHJpbmcubGFzdEluZGV4T2YoT1BFTl9DT01NRU5ULCBpbmRleCAtIDEpOwotCQkJCWFkanVzdGVkX2xlbmd0aCAtPSBPUEVOX0NPTU1FTlQubGVuZ3RoKCk7Ci0JCQl9Ci0KLQkJCS8vIHJlbW92ZSBjbG9zZSBjb21tZW50cwotCQkJc3RyaW5nID0gZG9jdW1lbnQuZ2V0KG9mZnNldCwgYWRqdXN0ZWRfbGVuZ3RoKTsKLQkJCWluZGV4ID0gc3RyaW5nLmxhc3RJbmRleE9mKENMT1NFX0NPTU1FTlQpOwotCQkJd2hpbGUgKGluZGV4ICE9IC0xKSB7Ci0JCQkJZG9jdW1lbnQucmVwbGFjZShvZmZzZXQgKyBpbmRleCwgQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW5kZXggPSBzdHJpbmcubGFzdEluZGV4T2YoQ0xPU0VfQ09NTUVOVCwgaW5kZXggLSAxKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0V4cGFuZEFsbEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9FeHBhbmRBbGxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOTEzOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0V4cGFuZEFsbEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24sIGJ1ZyAyMTIzMzAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5YTUxUYWJsZVRyZWVWaWV3ZXI7Ci0KLXB1YmxpYyBjbGFzcyBFeHBhbmRBbGxIYW5kbGVyIGV4dGVuZHMgRXhwYW5kQ29sbGFwc2VBbGxIYW5kbGVyIHsKLQotCXByb3RlY3RlZCBYTUxUYWJsZVRyZWVWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBFeHBhbmRBbGxIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyI2V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkKLQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZUVkaXRvcihldmVudCk7Ci0JCQotCQl2aWV3ZXIgPSBnZXRUYWJsZVRyZWVWaWV3ZXJGb3JFZGl0b3JQYXJ0KGVkaXRvclBhcnQpOwotCQkKLQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkvLyB0ZW1wb3JhcmlseSBzZXQgdGhlIHZpc2liaWxpdHkgdG8gZmFsc2UKLQkJCS8vIHRoaXMgaGFzIGEgSFVHRSBwZXJmb3JtYW5jZSBiZW5lZml0Ci0JCQlib29sZWFuIGlzVmlzaWJsZSA9IHZpZXdlci5nZXRDb250cm9sKCkuZ2V0VmlzaWJsZSgpOwotCQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCXZpZXdlci5leHBhbmRBbGwoKTsKLQotCQkJLy8gcmVzdG9yZSB0aGUgcHJldmlvdXMgdmlzaWJpbGl0eSBzdGF0ZQotCQkJLy8gCi0JCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldFZpc2libGUoaXNWaXNpYmxlKTsKLQkJfQkJCi0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvRXhwYW5kQ29sbGFwc2VBbGxIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvRXhwYW5kQ29sbGFwc2VBbGxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZDQwZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL0V4cGFuZENvbGxhcHNlQWxsSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiwgYnVnIDIxMjMzMAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb21tYW5kcy5JRWxlbWVudFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubWVudXMuVUlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLklEZXNpZ25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuWE1MVGFibGVUcmVlVmlld2VyOwotCi1wdWJsaWMgY2xhc3MgRXhwYW5kQ29sbGFwc2VBbGxIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSUVsZW1lbnRVcGRhdGVyIHsKLQotCXByb3RlY3RlZCBYTUxUYWJsZVRyZWVWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQotCS8qKgotCSAqIENvbW1hbmQgaGFuZGxlciBmb3IgaGFuZGxpbmcgRXhwYW5kIGFuZCBDb2xsYXBzZSBmb3IgVHJlZSBWaWV3ZXIgCi0JICovCi0JcHVibGljIEV4cGFuZENvbGxhcHNlQWxsSGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlciNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQpCi0JICovCi0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gSW1wbGVtZW50b3JzIHRvIHB1dCB0aGVpciBjb2RlIGhlcmUuCi0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhNTFRhYmxlVHJlZVZpZXdlciBnZXRUYWJsZVRyZWVWaWV3ZXJGb3JFZGl0b3JQYXJ0KElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlYTUxUYWJsZVRyZWVWaWV3ZXIgcmVzdWx0ID0gbnVsbDsKLQkJT2JqZWN0IG9iamVjdCA9IHRhcmdldEVkaXRvci5nZXRBZGFwdGVyKElEZXNpZ25WaWV3ZXIuY2xhc3MpOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgWE1MVGFibGVUcmVlVmlld2VyKSB7Ci0JCQlyZXN1bHQgPSAoWE1MVGFibGVUcmVlVmlld2VyKSBvYmplY3Q7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlRWxlbWVudChVSUVsZW1lbnQgZWxlbWVudCwgTWFwIHBhcmFtZXRlcnMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvTmV4dFNpYmxpbmdOYXZpZ2F0aW9uSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL05leHRTaWJsaW5nTmF2aWdhdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1OTUxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvTmV4dFNpYmxpbmdOYXZpZ2F0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1wdWJsaWMgY2xhc3MgTmV4dFNpYmxpbmdOYXZpZ2F0aW9uSGFuZGxlciBleHRlbmRzIEFic3RyYWN0U2libGluZ05hdmlnYXRpb25IYW5kbGVyIHsKLQotCXByb3RlY3RlZCBib29sZWFuIG1vdmVGb3J3YXJkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9QcmV2aW91c1NpYmxpbmdOYXZpZ2F0aW9uSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL1ByZXZpb3VzU2libGluZ05hdmlnYXRpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NDJhOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL1ByZXZpb3VzU2libGluZ05hdmlnYXRpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLXB1YmxpYyBjbGFzcyBQcmV2aW91c1NpYmxpbmdOYXZpZ2F0aW9uSGFuZGxlciBleHRlbmRzIEFic3RyYWN0U2libGluZ05hdmlnYXRpb25IYW5kbGVyIHsKLQotCXByb3RlY3RlZCBib29sZWFuIG1vdmVGb3J3YXJkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvUmVsb2FkRGVwZW5kZW5jaWVzSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL1JlbG9hZERlcGVuZGVuY2llc0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM3MWExOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvUmVsb2FkRGVwZW5kZW5jaWVzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiwgYnVnIDIxMjMzMAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLkNNRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5JbmZlcnJlZEdyYW1tYXJCdWlsZGluZ0NNRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIFJlbG9hZERlcGVuZGVuY2llc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBJSGFuZGxlciB7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUmVsb2FkRGVwZW5kZW5jaWVzSGFuZGxlcigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlciNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQpCi0JICovCi0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSUVkaXRvclBhcnQgZWRpdG9yID0gSGFuZGxlclV0aWwuZ2V0QWN0aXZlRWRpdG9yKGV2ZW50KTsKLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IG51bGw7Ci0JCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvcjsKLQkJZWxzZSB7Ci0JCQlPYmplY3QgbyA9IGVkaXRvci5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQkJCWlmIChvICE9IG51bGwpCi0JCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgbzsKLQkJfQotCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG1vZGVsKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCQlEb2N1bWVudCBkb21Eb2N1bWVudCA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQlpZiAoKG1vZGVsUXVlcnkgIT0gbnVsbCkgJiYgKG1vZGVsUXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKSAhPSBudWxsKSkgewotCQkJCQltb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCkuZ2V0Q01Eb2N1bWVudENhY2hlKCkuY2xlYXIoKTsKLQkJCQkJLy8gVE9ETy4uLiBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGFjY2VzcyB0aGUKLQkJCQkJLy8gRE9NT2JzZXJ2ZXIgdmlhIE1vZGVsUXVlcnkKLQkJCQkJLy8gLi4ud2h5PwotCQkJCQlDTURvY3VtZW50TG9hZGVyIGxvYWRlciA9IG5ldyBJbmZlcnJlZEdyYW1tYXJCdWlsZGluZ0NNRG9jdW1lbnRMb2FkZXIoZG9tRG9jdW1lbnQsIG1vZGVsUXVlcnkpOwotCQkJCQlsb2FkZXIubG9hZENNRG9jdW1lbnRzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9SZW1vdmVCbG9ja0NvbW1lbnRIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvUmVtb3ZlQmxvY2tDb21tZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDA4MGJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9SZW1vdmVCbG9ja0NvbW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRGF2aWQgQ2FydmVyIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uLCBidWcgMjEyMzMwCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oYW5kbGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNvbW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotLyoqCi0gKiBAYXV0aG9yIGRjYXJ2ZXIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUmVtb3ZlQmxvY2tDb21tZW50SGFuZGxlciBleHRlbmRzIENvbW1lbnRIYW5kbGVyIGltcGxlbWVudHMgSUhhbmRsZXIgewotCi0JcHVibGljIFJlbW92ZUJsb2NrQ29tbWVudEhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0Jdm9pZCBwcm9jZXNzQWN0aW9uKElUZXh0RWRpdG9yIHRleHRFZGl0b3IsIElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUluZGV4ZWRSZWdpb24gc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQkJCQlJbmRleGVkUmVnaW9uIHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQotCQkJCWlmICgoc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uID09IG51bGwpIHx8IChzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uID09IG51bGwpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlpbnQgb3BlbkNvbW1lbnRPZmZzZXQgPSBzZWxlY3Rpb25TdGFydEluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgY2xvc2VDb21tZW50T2Zmc2V0ID0gc2VsZWN0aW9uRW5kSW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSAtIENMT1NFX0NPTU1FTlQubGVuZ3RoKCk7Ci0KLQkJCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBYTUxVSU1lc3NhZ2VzLlJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwKTsKLQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCXRyeSB7Ci0JCQkJCWlmICh0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpID09IDApIHsKLQkJCQkJCWlmIChzZWxlY3Rpb25TdGFydEluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBDb21tZW50SW1wbCkgewotCQkJCQkJCWRvY3VtZW50LnJlcGxhY2Uob3BlbkNvbW1lbnRPZmZzZXQsIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJZG9jdW1lbnQucmVwbGFjZShjbG9zZUNvbW1lbnRPZmZzZXQsIENMT1NFX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIENvbW1lbnRJbXBsKSB7Ci0JCQkJCQkJZG9jdW1lbnQucmVwbGFjZShvcGVuQ29tbWVudE9mZnNldCwgT1BFTl9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQotCQkJCQkJaWYgKHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBDb21tZW50SW1wbCkgewotCQkJCQkJCWRvY3VtZW50LnJlcGxhY2UoY2xvc2VDb21tZW50T2Zmc2V0LCBDTE9TRV9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZW1vdmVPcGVuQ2xvc2VDb21tZW50cyhkb2N1bWVudCwgb3BlbkNvbW1lbnRPZmZzZXQgKyBPUEVOX0NPTU1FTlQubGVuZ3RoKCksIGNsb3NlQ29tbWVudE9mZnNldCAtIG9wZW5Db21tZW50T2Zmc2V0IC0gQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCQltb2RlbC5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nWE1MSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDQzYjZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nWE1MSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmhhbmRsZXJzLkFic3RyYWN0U3RydWN0dXJlZFNlbGVjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdYTUxIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkU2VsZWN0SGFuZGxlciB7Ci0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLQotCQlpbmRleGVkUmVnaW9uID0gZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0KLQkJcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0JfQotCi0JcHJvdGVjdGVkIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24oSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uLCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCVJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQlpZiAoaW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgY3Vyc29yTm9kZSA9IChOb2RlKSBpbmRleGVkUmVnaW9uOwotCi0JCQkvLyB1c2UgcGFyZW50IG5vZGUgZm9yIGVtcHR5IHRleHQgbm9kZQotCQkJaWYgKChjdXJzb3JOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChjdXJzb3JOb2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCWN1cnNvck5vZGUgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCWlmIChjdXJzb3JOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQlpbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIGN1cnNvck5vZGU7Ci0JCQkJfQotCQkJfQotCi0JCQlSZWdpb24gY3Vyc29yTm9kZVJlZ2lvbiA9IG5ldyBSZWdpb24oaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBpbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQotCQkJaWYgKChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpID49IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpICYmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpIDw9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKSAmJiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPj0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSkgJiYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpIDw9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKSkgewotCQkJCU5vZGUgbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJaWYgKG5ld05vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCUluZGV4ZWRSZWdpb24gbmV3SW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBuZXdOb2RlOwotCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgbmV3SW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmV3UmVnaW9uID0gY3Vyc29yTm9kZVJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY2Nzg5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvU3RydWN0dXJlZFNlbGVjdE5leHRYTUxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmhhbmRsZXJzLkFic3RyYWN0U3RydWN0dXJlZFNlbGVjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3ROZXh0WE1MSGFuZGxlciBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZFNlbGVjdEhhbmRsZXIgewotCi0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJaW50IG9mZnNldCA9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpIC0gMTsKLQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCW9mZnNldCA9IDA7Ci0JCX0KLQotCQlJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24gPSBudWxsOwotCi0JCWluZGV4ZWRSZWdpb24gPSBnZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50LCBvZmZzZXQpOwotCi0JCXJldHVybiBpbmRleGVkUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIGN1cnNvck5vZGUgPSAoTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQotCQkJLy8gdXNlIHBhcmVudCBub2RlIGZvciBlbXB0eSB0ZXh0IG5vZGUKLQkJCWlmICgoY3Vyc29yTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAoY3Vyc29yTm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQljdXJzb3JOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQlpZiAoY3Vyc29yTm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJaW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBjdXJzb3JOb2RlOwotCQkJCX0KLQkJCX0KLQotCQkJUmVnaW9uIGN1cnNvck5vZGVSZWdpb24gPSBuZXcgUmVnaW9uKGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgaW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlpbnQgY3VycmVudE9mZnNldCA9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQgY3VycmVudEVuZE9mZnNldCA9IGN1cnJlbnRPZmZzZXQgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpOwotCQkJaWYgKChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpID49IGN1cnJlbnRPZmZzZXQpICYmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpIDw9IGN1cnJlbnRFbmRPZmZzZXQpICYmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA+PSBjdXJyZW50T2Zmc2V0KSAmJiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPD0gY3VycmVudEVuZE9mZnNldCkpIHsKLQkJCQluZXdSZWdpb24gPSBnZXROZXdTZWxlY3Rpb25SZWdpb24yKGluZGV4ZWRSZWdpb24sIHRleHRTZWxlY3Rpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmV3UmVnaW9uID0gY3Vyc29yTm9kZVJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdhcyBzZXBhcmF0ZWQgb3V0IGZyb20gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uMiBiZWNhdXNlIHRoZQotCSAqIGNvZGUgaW4gaGVyZSBpcyBhbGxvd2VkIHRvIGJlIGNhbGxlZCByZWN1cnNpdmVseS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXhlZFJlZ2lvbgotCSAqIEBwYXJhbSB0ZXh0U2VsZWN0aW9uCi0JICogQHJldHVybiBuZXcgcmVnaW9uIHRvIHNlbGVjdCBvciBudWxsIGlmIG5vbmUKLQkgKi8KLQlwcml2YXRlIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24yKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQkJCU5vZGUgbmV3Tm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmIChuZXdOb2RlID09IG51bGwpIHsKLQkJCQluZXdOb2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gbmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgbmV3SW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCi0JCQkJCWlmIChuZXdOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJCW5ld1JlZ2lvbiA9IGdldE5ld1NlbGVjdGlvblJlZ2lvbjIobmV3SW5kZXhlZFJlZ2lvbiwgbmV3IFRleHRTZWxlY3Rpb24obmV3UmVnaW9uLmdldE9mZnNldCgpLCBuZXdSZWdpb24uZ2V0TGVuZ3RoKCkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNYTUxIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjU3NDQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNYTUxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmhhbmRsZXJzLkFic3RyYWN0U3RydWN0dXJlZFNlbGVjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3RQcmV2aW91c1hNTEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRTZWxlY3RIYW5kbGVyIHsKLQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEN1cnNvckluZGV4ZWRSZWdpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0KLQkJaW5kZXhlZFJlZ2lvbiA9IGdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnQsIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCi0JCXJldHVybiBpbmRleGVkUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIGN1cnNvck5vZGUgPSAoTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQotCQkJLy8gdXNlIHBhcmVudCBub2RlIGZvciBlbXB0eSB0ZXh0IG5vZGUKLQkJCWlmICgoY3Vyc29yTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAoY3Vyc29yTm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQljdXJzb3JOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQlpZiAoY3Vyc29yTm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJaW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBjdXJzb3JOb2RlOwotCQkJCX0KLQkJCX0KLQotCQkJUmVnaW9uIGN1cnNvck5vZGVSZWdpb24gPSBuZXcgUmVnaW9uKGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgaW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0KLQkJCWlmICgoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA+PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKSAmJiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA8PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSkgJiYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpID49IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpICYmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA8PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSkpIHsKLQkJCQlOb2RlIG5ld05vZGUgPSBjdXJzb3JOb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCWlmIChuZXdOb2RlID09IG51bGwpIHsKLQkJCQkJbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgbmV3SW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCi0JCQkJCQlpZiAobmV3Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCQkJbmV3UmVnaW9uID0gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24sIG5ldyBUZXh0U2VsZWN0aW9uKG5ld1JlZ2lvbi5nZXRPZmZzZXQoKSwgbmV3UmVnaW9uLmdldExlbmd0aCgpKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJCWVsc2UgewotCQkJCW5ld1JlZ2lvbiA9IGN1cnNvck5vZGVSZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvVG9nZ2xlQ29tbWVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9Ub2dnbGVDb21tZW50SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzRmNjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9Ub2dnbGVDb21tZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24sIGJ1ZyAyMTIzMzAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLklIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBUb2dnbGVDb21tZW50SGFuZGxlciBleHRlbmRzIENvbW1lbnRIYW5kbGVyIGltcGxlbWVudHMgSUhhbmRsZXIgewotCXB1YmxpYyBUb2dnbGVDb21tZW50SGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVFZGl0b3IoZXZlbnQpOwotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQllbHNlIHsKLQkJCU9iamVjdCBvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0JCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCS8vIGdldCBjdXJyZW50IHRleHQgc2VsZWN0aW9uCi0JCQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IGdldEN1cnJlbnRTZWxlY3Rpb24odGV4dEVkaXRvcik7Ci0JCQkJaWYgKHRleHRTZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXByb2Nlc3NBY3Rpb24odGV4dEVkaXRvciwgZG9jdW1lbnQsIHRleHRTZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXZvaWQgcHJvY2Vzc0FjdGlvbihJVGV4dEVkaXRvciB0ZXh0RWRpdG9yLCBJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJLy8gZ2V0IHRleHQgc2VsZWN0aW9uIGxpbmVzIGluZm8KLQkJaW50IHNlbGVjdGlvblN0YXJ0TGluZSA9IHRleHRTZWxlY3Rpb24uZ2V0U3RhcnRMaW5lKCk7Ci0JCWludCBzZWxlY3Rpb25FbmRMaW5lID0gdGV4dFNlbGVjdGlvbi5nZXRFbmRMaW5lKCk7Ci0JCXRyeSB7Ci0JCQlpbnQgc2VsZWN0aW9uRW5kTGluZU9mZnNldCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQoc2VsZWN0aW9uRW5kTGluZSk7Ci0JCQlpbnQgc2VsZWN0aW9uRW5kT2Zmc2V0ID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0KLQkJCS8vIGFkanVzdCBzZWxlY3Rpb24gZW5kIGxpbmUKLQkJCWlmICgoc2VsZWN0aW9uRW5kTGluZSA+IHNlbGVjdGlvblN0YXJ0TGluZSkgJiYgKHNlbGVjdGlvbkVuZExpbmVPZmZzZXQgPT0gc2VsZWN0aW9uRW5kT2Zmc2V0KSkgewotCQkJCXNlbGVjdGlvbkVuZExpbmUtLTsKLQkJCX0KLQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQotCQkvLyBzYXZlIHRoZSBzZWxlY3Rpb24gcG9zaXRpb24gc2luY2UgaXQgd2lsbCBiZSBjaGFuZ2luZwotCQlQb3NpdGlvbiBzZWxlY3Rpb25Qb3NpdGlvbiA9IG51bGw7Ci0JCWJvb2xlYW4gdXBkYXRlU3RhcnRPZmZzZXQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXNlbGVjdGlvblBvc2l0aW9uID0gbmV3IFBvc2l0aW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJZG9jdW1lbnQuYWRkUG9zaXRpb24oc2VsZWN0aW9uUG9zaXRpb24pOwotCi0JCQkvLyBleHRyYSBjaGVjayBpZiBjb21tZW50aW5nIGZyb20gYmVnaW5uaW5nIG9mIGxpbmUKLQkJCWludCBzZWxlY3Rpb25TdGFydExpbmVPZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KHNlbGVjdGlvblN0YXJ0TGluZSk7Ci0JCQlpZiAoKHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgPiAwKSAmJiAoc2VsZWN0aW9uU3RhcnRMaW5lT2Zmc2V0ID09IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpICYmICFpc0NvbW1lbnRMaW5lKGRvY3VtZW50LCBzZWxlY3Rpb25TdGFydExpbmUpKSB7Ci0JCQkJdXBkYXRlU3RhcnRPZmZzZXQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQotCQlwcm9jZXNzQWN0aW9uKGRvY3VtZW50LCBzZWxlY3Rpb25TdGFydExpbmUsIHNlbGVjdGlvbkVuZExpbmUpOwotCi0JCXVwZGF0ZUN1cnJlbnRTZWxlY3Rpb24odGV4dEVkaXRvciwgc2VsZWN0aW9uUG9zaXRpb24sIGRvY3VtZW50LCB1cGRhdGVTdGFydE9mZnNldCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NBY3Rpb24oSURvY3VtZW50IGRvY3VtZW50LCBpbnQgc2VsZWN0aW9uU3RhcnRMaW5lLCBpbnQgc2VsZWN0aW9uRW5kTGluZSkgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFhNTFVJTWVzc2FnZXMuVG9nZ2xlQ29tbWVudF90b29sdGlwKTsKLQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCWZvciAoaW50IGkgPSBzZWxlY3Rpb25TdGFydExpbmU7IGkgPD0gc2VsZWN0aW9uRW5kTGluZTsgaSsrKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoZG9jdW1lbnQuZ2V0TGluZUxlbmd0aChpKSA+IDApIHsKLQkJCQkJCQlpZiAoaXNDb21tZW50TGluZShkb2N1bWVudCwgaSkpIHsKLQkJCQkJCQkJaW50IGxpbmVPZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGkpOwotCQkJCQkJCQlJUmVnaW9uIHJlZ2lvbiA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihpKTsKLQkJCQkJCQkJU3RyaW5nIHN0cmluZyA9IGRvY3VtZW50LmdldChyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCQkJCWludCBvcGVuQ29tbWVudE9mZnNldCA9IGxpbmVPZmZzZXQgKyBzdHJpbmcuaW5kZXhPZihPUEVOX0NPTU1FTlQpOwotCQkJCQkJCQlpbnQgY2xvc2VDb21tZW50T2Zmc2V0ID0gbGluZU9mZnNldCArIHN0cmluZy5pbmRleE9mKENMT1NFX0NPTU1FTlQpIC0gT1BFTl9DT01NRU5ULmxlbmd0aCgpOwotCQkJCQkJCQl1bmNvbW1lbnQoZG9jdW1lbnQsIG9wZW5Db21tZW50T2Zmc2V0LCBjbG9zZUNvbW1lbnRPZmZzZXQpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJaW50IG9wZW5Db21tZW50T2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChpKTsKLQkJCQkJCQkJaW50IGxpbmVEZWxpbWl0ZXJMZW5ndGggPSBkb2N1bWVudC5nZXRMaW5lRGVsaW1pdGVyKGkpID09IG51bGwgPyAwIDogZG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcihpKS5sZW5ndGgoKTsKLQkJCQkJCQkJaW50IGNsb3NlQ29tbWVudE9mZnNldCA9IG9wZW5Db21tZW50T2Zmc2V0ICsgZG9jdW1lbnQuZ2V0TGluZUxlbmd0aChpKSAtIGxpbmVEZWxpbWl0ZXJMZW5ndGggKyBPUEVOX0NPTU1FTlQubGVuZ3RoKCk7Ci0JCQkJCQkJCWNvbW1lbnQoZG9jdW1lbnQsIG9wZW5Db21tZW50T2Zmc2V0LCBjbG9zZUNvbW1lbnRPZmZzZXQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudExpbmUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgbGluZSkgewotCQlib29sZWFuIGlzQ29tbWVudCA9IGZhbHNlOwotCi0JCXRyeSB7Ci0JCQlJUmVnaW9uIHJlZ2lvbiA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihsaW5lKTsKLQkJCVN0cmluZyBzdHJpbmcgPSBkb2N1bWVudC5nZXQocmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCkpLnRyaW0oKTsKLQkJCWlzQ29tbWVudCA9IChzdHJpbmcubGVuZ3RoKCkgPj0gT1BFTl9DT01NRU5ULmxlbmd0aCgpICsgQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKSkgJiYgc3RyaW5nLnN0YXJ0c1dpdGgoT1BFTl9DT01NRU5UKSAmJiBzdHJpbmcuZW5kc1dpdGgoQ0xPU0VfQ09NTUVOVCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCQlyZXR1cm4gaXNDb21tZW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBjb21tZW50KElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9wZW5Db21tZW50T2Zmc2V0LCBpbnQgY2xvc2VDb21tZW50T2Zmc2V0KSB7Ci0JCXRyeSB7Ci0JCQlkb2N1bWVudC5yZXBsYWNlKG9wZW5Db21tZW50T2Zmc2V0LCAwLCBPUEVOX0NPTU1FTlQpOwotCQkJZG9jdW1lbnQucmVwbGFjZShjbG9zZUNvbW1lbnRPZmZzZXQsIDAsIENMT1NFX0NPTU1FTlQpOwotCQkJcmVtb3ZlT3BlbkNsb3NlQ29tbWVudHMoZG9jdW1lbnQsIG9wZW5Db21tZW50T2Zmc2V0ICsgT1BFTl9DT01NRU5ULmxlbmd0aCgpLCBjbG9zZUNvbW1lbnRPZmZzZXQgLSBvcGVuQ29tbWVudE9mZnNldCAtIENMT1NFX0NPTU1FTlQubGVuZ3RoKCkpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5jb21tZW50KElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9wZW5Db21tZW50T2Zmc2V0LCBpbnQgY2xvc2VDb21tZW50T2Zmc2V0KSB7Ci0JCXRyeSB7Ci0JCQlkb2N1bWVudC5yZXBsYWNlKG9wZW5Db21tZW50T2Zmc2V0LCBPUEVOX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJZG9jdW1lbnQucmVwbGFjZShjbG9zZUNvbW1lbnRPZmZzZXQsIENMT1NFX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ3VycmVudFNlbGVjdGlvbihJVGV4dEVkaXRvciB0ZXh0RWRpdG9yLCBQb3NpdGlvbiBzZWxlY3Rpb25Qb3NpdGlvbiwgSURvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIHVwZGF0ZVN0YXJ0T2Zmc2V0KSB7Ci0JCS8vIHVwZGF0ZSB0aGUgc2VsZWN0aW9uIGlmIHRleHQgc2VsZWN0aW9uIGNoYW5nZWQKLQkJaWYgKHNlbGVjdGlvblBvc2l0aW9uICE9IG51bGwpIHsKLQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0JCQlpZiAodXBkYXRlU3RhcnRPZmZzZXQpIHsKLQkJCQlzZWxlY3Rpb24gPSBuZXcgVGV4dFNlbGVjdGlvbihkb2N1bWVudCwgc2VsZWN0aW9uUG9zaXRpb24uZ2V0T2Zmc2V0KCkgLSBPUEVOX0NPTU1FTlQubGVuZ3RoKCksIHNlbGVjdGlvblBvc2l0aW9uLmdldExlbmd0aCgpICsgT1BFTl9DT01NRU5ULmxlbmd0aCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNlbGVjdGlvbiA9IG5ldyBUZXh0U2VsZWN0aW9uKGRvY3VtZW50LCBzZWxlY3Rpb25Qb3NpdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uUG9zaXRpb24uZ2V0TGVuZ3RoKCkpOwotCQkJfQotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gdGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQlwcm92aWRlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCX0KLQkJCWRvY3VtZW50LnJlbW92ZVBvc2l0aW9uKHNlbGVjdGlvblBvc2l0aW9uKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9Ub2dnbGVFZGl0TW9kZUhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oYW5kbGVycy9Ub2dnbGVFZGl0TW9kZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVlNGY1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvVG9nZ2xlRWRpdE1vZGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIERhdmlkIENhcnZlciAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiwgYnVnIDIxMjMzMAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaGFuZGxlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29tbWFuZHMuSUNvbW1hbmRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLklFbGVtZW50VXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tZW51cy5VSUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuc2VydmljZXMuSVNlcnZpY2VTY29wZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTEVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5TaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLQotcHVibGljIGNsYXNzIFRvZ2dsZUVkaXRNb2RlSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzIElFbGVtZW50VXBkYXRlciB7Ci0JcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBvbkltYWdlID0gU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2VEZXNjcmlwdG9yKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19FVE9PTF9DT05TVFJBSU5PTik7Ci0JcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBvZmZJbWFnZSA9IFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlRGVzY3JpcHRvcihTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfRVRPT0xfQ09OU1RSQUlOT0ZGKTsKLQlwcm90ZWN0ZWQgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5OwotCi0JcHVibGljIFRvZ2dsZUVkaXRNb2RlSGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVFZGl0b3IoZXZlbnQpOwotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQllbHNlIHsKLQkJCU9iamVjdCBvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0JCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG1vZGVsKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQkJCWludCBuZXdTdGF0ZSA9IGdldE5leHRTdGF0ZShtb2RlbFF1ZXJ5LmdldEVkaXRNb2RlKCkpOwotCQkJCQltb2RlbFF1ZXJ5LnNldEVkaXRNb2RlKG5ld1N0YXRlKTsKLQotCQkJCQkvLyBGb3JjZSBhIFJlZnJlc2ggb24gdGhpcyBjb21tYW5kIHNvIHRoYXQgdGhlIGltYWdlIGNhbgotCQkJCQkvLyBiZQotCQkJCQkvLyB1cGRhdGVkLgotCQkJCQlJQ29tbWFuZFNlcnZpY2UgY29tbWFuZFNlcnZpY2UgPSAoSUNvbW1hbmRTZXJ2aWNlKSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coZXZlbnQpLmdldFNlcnZpY2UoSUNvbW1hbmRTZXJ2aWNlLmNsYXNzKTsKLQkJCQkJTWFwIGZpbHRlciA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCWZpbHRlci5wdXQoSVNlcnZpY2VTY29wZXMuV0lORE9XX1NDT1BFLCBIYW5kbGVyVXRpbC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coZXZlbnQpKTsKLQkJCQkJY29tbWFuZFNlcnZpY2UucmVmcmVzaEVsZW1lbnRzKGV2ZW50LmdldENvbW1hbmQoKS5nZXRJZCgpLCBmaWx0ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TmV4dFN0YXRlKGludCBlZGl0TW9kZSkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWlmIChlZGl0TW9kZSA9PSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpIHsKLQkJCXJlc3VsdCA9IE1vZGVsUXVlcnkuRURJVF9NT0RFX1VOQ09OU1RSQUlORUQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1Q7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8vIEhhbmRsZXJzIHRoYXQgbmVlZCB0byBpbnRlcmFjdCB3aXRoIHRoZSB1aSB0aGF0IHRoZSBjb21tYW5kIGNhbWUgZnJvbQotCS8vIG5lZWQgdG8gdXNlIGltcGxlbWVudCB0aGlzIG1ldGhvZC4KLQlwdWJsaWMgdm9pZCB1cGRhdGVFbGVtZW50KFVJRWxlbWVudCBlbGVtZW50LCBNYXAgcGFyYW1ldGVycykgewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQllbHNlIHsKLQkJCU9iamVjdCBvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0JCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG1vZGVsKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQkJCXNldEFwcGVhcmFuY2VGb3JFZGl0TW9kZShtb2RlbFF1ZXJ5LmdldEVkaXRNb2RlKCksIGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFwcGVhcmFuY2VGb3JFZGl0TW9kZShpbnQgZWRpdE1vZGUsIFVJRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlZGl0TW9kZSA9PSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpIHsKLQkJCWVsZW1lbnQuc2V0VG9vbHRpcChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8zKTsKLQkJCWVsZW1lbnQuc2V0VGV4dChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8zKTsKLQkJCWVsZW1lbnQuc2V0SWNvbihvbkltYWdlKTsKLQkJfQotCQllbHNlIHsKLQkJCWVsZW1lbnQuc2V0VG9vbHRpcChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl81KTsKLQkJCWVsZW1lbnQuc2V0VGV4dChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl81KTsKLQkJCWVsZW1lbnQuc2V0SWNvbihvZmZJbWFnZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvWE1MRmluZE9jY3VyZW5jZXNIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaGFuZGxlcnMvWE1MRmluZE9jY3VyZW5jZXNIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YzI4YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2hhbmRsZXJzL1hNTEZpbmRPY2N1cmVuY2VzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBEYXZpZCBDYXJ2ZXIgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gLSBidWcgMjEyMzMwIC0KLSAqICAgICAgICAgICAgICAgICAgICBCYXNlZCBvZmYgQ2xlYW51cEFjdGlvblhNTERlbGVnYXRlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmhhbmRsZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGxhdGZvcm1TdGF0dXNMaW5lVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlYXJjaC5YTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3I7Ci0KLXB1YmxpYyBjbGFzcyBYTUxGaW5kT2NjdXJlbmNlc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBJSGFuZGxlciB7Ci0JcHJpdmF0ZSBMaXN0IGZQcm9jZXNzb3JzOwotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVFZGl0b3IoZXZlbnQpOwotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJYm9vbGVhbiBva2F5ID0gZmFsc2U7Ci0KLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQllbHNlIHsKLQkJCU9iamVjdCBvID0gZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJaWYgKG8gIT0gbnVsbCkKLQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBvOwotCQl9Ci0KLQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IGdldFRleHRTZWxlY3Rpb24odGV4dEVkaXRvcik7Ci0JCQkJRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGZpbmRPY2N1cnJlbmNlUHJvY2Vzc29yID0gZ2V0UHJvY2Vzc29yRm9yQ3VycmVudFNlbGVjdGlvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCQkJaWYgKGZpbmRPY2N1cnJlbmNlUHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCQkJaWYgKHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCQkJCUlGaWxlIGZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpIHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpOwotCQkJCQkJb2theSA9IGZpbmRPY2N1cnJlbmNlUHJvY2Vzc29yLmZpbmRPY2N1cnJlbmNlcyhkb2N1bWVudCwgdGV4dFNlbGVjdGlvbiwgZmlsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG9rYXkpIHsKLQkJCS8vIGNsZWFyIHN0YXR1cyBtZXNzYWdlCi0JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmNsZWFyU3RhdHVzTGluZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IFNTRVVJTWVzc2FnZXMuRmluZE9jY3VycmVuY2VzQWN0aW9uUHJvdmlkZXJfMDsgLy8kTk9OLU5MUy0xJAotCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5kaXNwbGF5RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmFkZE9uZVRpbWVDbGVhckxpc3RlbmVyKCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGFwcHJvcHJpYXRlIGZpbmQgb2NjdXJyZW5jZXMgcHJvY2Vzc29yCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgbm90IG51bGwKLQkgKiBAcGFyYW0gdGV4dFNlbGVjdGlvbgotCSAqIEByZXR1cm4gRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yCi0JICovCi0JcHJpdmF0ZSBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yRm9yQ3VycmVudFNlbGVjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJLy8gY2hlY2sgaWYgd2UgaGF2ZSBhbiBhY3Rpb24gdGhhdCdzIGVuYWJsZWQgb24gdGhlIGN1cnJlbnQgcGFydGl0aW9uCi0JCUlUeXBlZFJlZ2lvbiB0ciA9IGdldFBhcnRpdGlvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCVN0cmluZyBwYXJ0aXRpb24gPSB0ciAhPSBudWxsID8gdHIuZ2V0VHlwZSgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlJdGVyYXRvciBpdCA9IGdldFByb2Nlc3NvcnMoKS5pdGVyYXRvcigpOwotCQlGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgYWN0aW9uID0gbnVsbDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJYWN0aW9uID0gKEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcikgaXQubmV4dCgpOwotCQkJLy8gd2UganVzdCBjaG9vc2UgdGhlIGZpcnN0IGFjdGlvbiB0aGF0IGNhbiBoYW5kbGUgdGhlIHBhcnRpdGlvbgotCQkJaWYgKGFjdGlvbi5lbmFibGVkRm9yUGFyaXRpdGlvbihwYXJ0aXRpb24pKQotCQkJCXJldHVybiBhY3Rpb247Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJVHlwZWRSZWdpb24gZ2V0UGFydGl0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJVHlwZWRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaWYgKHRleHRTZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZWdpb24gPSBkb2N1bWVudC5nZXRQYXJ0aXRpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXJlZ2lvbiA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQlwcml2YXRlIElUZXh0U2VsZWN0aW9uIGdldFRleHRTZWxlY3Rpb24oSVRleHRFZGl0b3IgdGV4dEVkaXRvcikgewotCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gbnVsbDsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbiAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQl9Ci0JCXJldHVybiB0ZXh0U2VsZWN0aW9uOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldFByb2Nlc3NvcnMoKSB7Ci0JCWlmIChmUHJvY2Vzc29ycyA9PSBudWxsKSB7Ci0JCQlmUHJvY2Vzc29ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCVhNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciBodG1sUHJvY2Vzc29yID0gbmV3IFhNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcigpOwotCQkJZlByb2Nlc3NvcnMuYWRkKGh0bWxQcm9jZXNzb3IpOwotCQl9Ci0JCXJldHVybiBmUHJvY2Vzc29yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUVkaXRvcklucHV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZTg1ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGF0aEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklMb2NhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOwotCi0vKioKLSAqIEVkaXRvcklucHV0IGZvciBleHRlcm5hbCBmaWxlcy4gQ29waWVkIGZyb20KLSAqIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmVkaXRvcnMudGV4dC5KYXZhRmlsZUVkaXRvcklucHV0Ci0gKi8KLWNsYXNzIEV4dGVybmFsRmlsZUVkaXRvcklucHV0IGltcGxlbWVudHMgSUVkaXRvcklucHV0LCBJTG9jYXRpb25Qcm92aWRlciB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluawotCi0JLyoqCi0JICogVGhlIHdvcmtiZW5jaCBhZGFwdGVyIHdoaWNoIHNpbXBseSBwcm92aWRlcyB0aGUgbGFiZWwuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBXb3JrYmVuY2hBZGFwdGVyIGltcGxlbWVudHMgSVdvcmtiZW5jaEFkYXB0ZXIgewotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRJbWFnZURlc2NyaXB0b3IoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRMYWJlbChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3QgbykgewotCQkJcmV0dXJuICgoRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIG8pLmdldE5hbWUoKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgbykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEZpbGUgZkZpbGU7Ci0JcHJpdmF0ZSBXb3JrYmVuY2hBZGFwdGVyIGZXb3JrYmVuY2hBZGFwdGVyID0gbmV3IFdvcmtiZW5jaEFkYXB0ZXIoKTsKLQotCXB1YmxpYyBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dChGaWxlIGZpbGUpIHsKLQkJc3VwZXIoKTsKLQkJZkZpbGUgPSBmaWxlOwotCQlmV29ya2JlbmNoQWRhcHRlciA9IG5ldyBXb3JrYmVuY2hBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNleGlzdHMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIGZGaWxlLmV4aXN0cygpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0SW1hZ2VEZXNjcmlwdG9yKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBmRmlsZS5nZXROYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRQZXJzaXN0YWJsZSgpCi0JICovCi0JcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0VG9vbFRpcFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCXJldHVybiBmRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKElMb2NhdGlvblByb3ZpZGVyLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJaWYgKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJcmV0dXJuIGZXb3JrYmVuY2hBZGFwdGVyOwotCQl9Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5JTG9jYXRpb25Qcm92aWRlciNnZXRQYXRoKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElQYXRoIGdldFBhdGgoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgewotCQkJRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgaW5wdXQgPSAoRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gUGF0aC5mcm9tT1NTdHJpbmcoaW5wdXQuZkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGF0aEVkaXRvcklucHV0I2dldFBhdGgoKQotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIFBhdGguZnJvbU9TU3RyaW5nKGZGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlpZiAobyBpbnN0YW5jZW9mIEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCBpbnB1dCA9IChFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgbzsKLQkJCXJldHVybiBmRmlsZS5lcXVhbHMoaW5wdXQuZkZpbGUpOwotCQl9Ci0KLQkJaWYgKG8gaW5zdGFuY2VvZiBJUGF0aEVkaXRvcklucHV0KSB7Ci0JCQlJUGF0aEVkaXRvcklucHV0IGlucHV0ID0gKElQYXRoRWRpdG9ySW5wdXQpIG87Ci0JCQlyZXR1cm4gZ2V0UGF0aCgpLmVxdWFscyhpbnB1dC5nZXRQYXRoKCkpOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZkZpbGUuaGFzaENvZGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRiZjY2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBIeXBlcmxpbmsgZm9yIGV4dGVybmFsIGZpbGVzLgotICovCi1jbGFzcyBFeHRlcm5hbEZpbGVIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0KLQlwcml2YXRlIElSZWdpb24gZkh5cGVybGlua1JlZ2lvbjsKLQlwcml2YXRlIEZpbGUgZkh5cGVybGlua0ZpbGU7Ci0KLQlwdWJsaWMgRXh0ZXJuYWxGaWxlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBGaWxlIGZpbGUpIHsKLQkJZkh5cGVybGlua0ZpbGUgPSBmaWxlOwotCQlmSHlwZXJsaW5rUmVnaW9uID0gcmVnaW9uOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsKLQkJcmV0dXJuIGZIeXBlcmxpbmtSZWdpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7Ci0JCXJldHVybiBmSHlwZXJsaW5rRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0JCXJldHVybiBmSHlwZXJsaW5rRmlsZS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJaWYgKGZIeXBlcmxpbmtGaWxlICE9IG51bGwpIHsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dChmSHlwZXJsaW5rRmlsZSk7Ci0JCQlJRWRpdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCQkJdHJ5IHsKLQkJCQlkZXNjcmlwdG9yID0gSURFLmdldEVkaXRvckRlc2NyaXB0b3IoaW5wdXQuZ2V0TmFtZSgpLCB0cnVlKTsKLQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgaW5wdXQsIGRlc2NyaXB0b3IuZ2V0SWQoKSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1dvcmtzcGFjZUZpbGVIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvV29ya3NwYWNlRmlsZUh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmRlMzQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvV29ya3NwYWNlRmlsZUh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotICogSHlwZXJsaW5rIGZvciBmaWxlcyB3aXRoaW4gdGhlIHdvcmtzcGFjZS4gKEFzIGxvbmcgYXMgdGhlcmUgaXMgYW4gSUZpbGUsCi0gKiB0aGlzIGNhbiBiZSB1c2VkKSBPcGVucyB0aGUgZGVmYXVsdCBlZGl0b3IgZm9yIHRoZSBmaWxlLgotICovCi1jbGFzcyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluawotCi0JcHJpdmF0ZSBJUmVnaW9uIGZSZWdpb247Ci0JcHJpdmF0ZSBJRmlsZSBmRmlsZTsKLQlwcml2YXRlIElSZWdpb24gZkhpZ2hsaWdodFJhbmdlOwotCi0JcHVibGljIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIElGaWxlIGZpbGUpIHsKLQkJZlJlZ2lvbiA9IHJlZ2lvbjsKLQkJZkZpbGUgPSBmaWxlOwotCX0KLQotCXB1YmxpYyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBJRmlsZSBmaWxlLCBJUmVnaW9uIHJhbmdlKSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZGaWxlID0gZmlsZTsKLQkJZkhpZ2hsaWdodFJhbmdlID0gcmFuZ2U7Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlyZXR1cm4gZlJlZ2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQlyZXR1cm4gZkZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JCWlmICgoZkZpbGUgIT0gbnVsbCkgJiYgZkZpbGUuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IElERS5vcGVuRWRpdG9yKHBhZ2UsIGZGaWxlLCB0cnVlKTsKLQkJCQkvLyBoaWdobGlnaHQgcmFuZ2UgaW4gZWRpdG9yIGlmIHBvc3NpYmxlCi0JCQkJaWYgKChmSGlnaGxpZ2h0UmFuZ2UgIT0gbnVsbCkgJiYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSkgewotCQkJCQkoKElUZXh0RWRpdG9yKSBlZGl0b3IpLnNldEhpZ2hsaWdodFJhbmdlKGZIaWdobGlnaHRSYW5nZS5nZXRPZmZzZXQoKSwgZkhpZ2hsaWdodFJhbmdlLmdldExlbmd0aCgpLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGllKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgcGllLmdldE1lc3NhZ2UoKSwgcGllKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9YTUxIeXBlcmxpbmtEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9YTUxIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjAwYzBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvWE1MSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5BYnN0cmFjdEh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuVVJMSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01OYW1lZE5vZGVNYXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogRGV0ZWN0cyBoeXBlcmxpbmtzIGluIFhNTCB0YWdzLiBJbmNsdWRlcyBkZXRlY3Rpb24gaW4gRE9DVFlQRSBhbmQgYXR0cmlidXRlCi0gKiB2YWx1ZXMuIFJlc29sdmVzIHJlZmVyZW5jZXMgdG8gc2NoZW1hcywgZHRkcywgZXRjIHVzaW5nIHRoZSBDb21tb24gVVJJCi0gKiBSZXNvbHZlci4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgWE1MSHlwZXJsaW5rRGV0ZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdEh5cGVybGlua0RldGVjdG9yIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBIVFRQX1BST1RPQ09MID0gImh0dHA6Ly8iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBOT19OQU1FU1BBQ0VfU0NIRU1BX0xPQ0FUSU9OID0gIm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU0NIRU1BX0xPQ0FUSU9OID0gInNjaGVtYUxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFhTSV9OQU1FU1BBQ0VfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBoeXBlcmxpbmsKLQkgKiAKLQkgKiBAcGFyYW0gdXJpU3RyaW5nCi0JICogQHBhcmFtIGh5cGVybGlua1JlZ2lvbgotCSAqIEByZXR1cm4gSUh5cGVybGluawotCSAqLwotCXByaXZhdGUgSUh5cGVybGluayBjcmVhdGVIeXBlcmxpbmsoU3RyaW5nIHVyaVN0cmluZywgSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24sIElEb2N1bWVudCBkb2N1bWVudCwgTm9kZSBub2RlKSB7Ci0JCUlIeXBlcmxpbmsgbGluayA9IG51bGw7Ci0KLQkJaWYgKGlzSHR0cCh1cmlTdHJpbmcpKSB7Ci0JCQlsaW5rID0gbmV3IFVSTEh5cGVybGluayhoeXBlcmxpbmtSZWdpb24sIHVyaVN0cmluZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB0cnkgdG8gbG9jYXRlIHRoZSBmaWxlIGluIHRoZSB3b3Jrc3BhY2UKLQkJCUZpbGUgc3lzdGVtRmlsZSA9IGdldEZpbGVGcm9tVXJpU3RyaW5nKHVyaVN0cmluZyk7Ci0JCQlpZiAoc3lzdGVtRmlsZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHN5c3RlbVBhdGggPSBzeXN0ZW1GaWxlLmdldFBhdGgoKTsKLQkJCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShzeXN0ZW1QYXRoKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCS8vIHRoaXMgaXMgYSBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rIHNpbmNlIGZpbGUgZXhpc3RzIGluCi0JCQkJCS8vIHdvcmtzcGFjZQotCQkJCQlsaW5rID0gbmV3IFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsoaHlwZXJsaW5rUmVnaW9uLCBmaWxlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRoaXMgaXMgYW4gRXh0ZXJuYWxGaWxlSHlwZXJsaW5rIHNpbmNlIGZpbGUgZG9lcyBub3QKLQkJCQkJLy8gZXhpc3QgaW4gd29ya3NwYWNlCi0JCQkJCWxpbmsgPSBuZXcgRXh0ZXJuYWxGaWxlSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgc3lzdGVtRmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCXB1YmxpYyBJSHlwZXJsaW5rW10gZGV0ZWN0SHlwZXJsaW5rcyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHJlZ2lvbiwgYm9vbGVhbiBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKSB7Ci0JCS8vIGZvciBub3csIG9ubHkgY2FwYWJsZSBvZiBjcmVhdGluZyAxIGh5cGVybGluawotCQlMaXN0IGh5cGVybGlua3MgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCWlmICgocmVnaW9uICE9IG51bGwpICYmICh0ZXh0Vmlld2VyICE9IG51bGwpKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCk7Ci0JCQlOb2RlIGN1cnJlbnROb2RlID0gZ2V0Q3VycmVudE5vZGUoZG9jdW1lbnQsIHJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyB1cmlTdHJpbmcgPSBudWxsOwotCQkJCWlmIChjdXJyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQkJCS8vIGRvY3R5cGUgbm9kZXMKLQkJCQkJdXJpU3RyaW5nID0gZ2V0VVJJU3RyaW5nKGN1cnJlbnROb2RlLCBkb2N1bWVudCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGN1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJLy8gZWxlbWVudCBub2RlcwotCQkJCQlBdHRyIGN1cnJlbnRBdHRyID0gZ2V0Q3VycmVudEF0dHJOb2RlKGN1cnJlbnROb2RlLCByZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCQlpZiAoY3VycmVudEF0dHIgIT0gbnVsbCkgewotCQkJCQkJLy8gdHJ5IHRvIGZpbmQgbGluayBmb3IgY3VycmVudCBhdHRyaWJ1dGUKLQkJCQkJCS8vIHJlc29sdmUgYXR0cmlidXRlIHZhbHVlCi0JCQkJCQl1cmlTdHJpbmcgPSBnZXRVUklTdHJpbmcoY3VycmVudEF0dHIsIGRvY3VtZW50KTsKLQkJCQkJCS8vIHZlcmlmeSB2YWxpZGl0eSBvZiB1cmkgc3RyaW5nCi0JCQkJCQlpZiAoKHVyaVN0cmluZyA9PSBudWxsKSB8fCAhaXNWYWxpZFVSSSh1cmlTdHJpbmcpKSB7Ci0JCQkJCQkJLy8gcmVzZXQgY3VycmVudCBhdHRyaWJ1dGUKLQkJCQkJCQljdXJyZW50QXR0ciA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGN1cnJlbnRBdHRyID09IG51bGwpIHsKLQkJCQkJCS8vIHRyeSB0byBmaW5kIGEgbGlua2FibGUgYXR0cmlidXRlIHdpdGhpbiBlbGVtZW50Ci0JCQkJCQljdXJyZW50QXR0ciA9IGdldExpbmthYmxlQXR0cigoRWxlbWVudCkgY3VycmVudE5vZGUpOwotCQkJCQkJaWYgKGN1cnJlbnRBdHRyICE9IG51bGwpIHsKLQkJCQkJCQl1cmlTdHJpbmcgPSBnZXRVUklTdHJpbmcoY3VycmVudEF0dHIsIGRvY3VtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljdXJyZW50Tm9kZSA9IGN1cnJlbnRBdHRyOwotCQkJCX0KLQkJCQkvLyB0cnkgdG8gY3JlYXRlIGh5cGVybGluayBmcm9tIGluZm9ybWF0aW9uIGdhdGhlcmVkCi0JCQkJaWYgKCh1cmlTdHJpbmcgIT0gbnVsbCkgJiYgKGN1cnJlbnROb2RlICE9IG51bGwpICYmIGlzVmFsaWRVUkkodXJpU3RyaW5nKSkgewotCQkJCQlJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiA9IGdldEh5cGVybGlua1JlZ2lvbihjdXJyZW50Tm9kZSk7Ci0JCQkJCUlIeXBlcmxpbmsgaHlwZXJsaW5rID0gY3JlYXRlSHlwZXJsaW5rKHVyaVN0cmluZywgaHlwZXJsaW5rUmVnaW9uLCBkb2N1bWVudCwgY3VycmVudE5vZGUpOwotCQkJCQlpZiAoaHlwZXJsaW5rICE9IG51bGwpIHsKLQkJCQkJCWh5cGVybGlua3MuYWRkKGh5cGVybGluayk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGh5cGVybGlua3Muc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoSUh5cGVybGlua1tdKSBoeXBlcmxpbmtzLnRvQXJyYXkobmV3IElIeXBlcmxpbmtbMF0pOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgYmFzZSBsb2NhdGlvbiBmcm9tIHRoZSBjdXJyZW50IG1vZGVsIChsb2NhbCBmaWxlIHN5c3RlbSkKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRCYXNlTG9jYXRpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCi0JCS8vIGdldCB0aGUgYmFzZSBsb2NhdGlvbiBmcm9tIHRoZSBjdXJyZW50IG1vZGVsCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gc01vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJCQotCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChyZXN1bHQpOwotCQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG51bGw7Ci0JCQkJCQlpZiAoZmlsZS5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCQkJCQliYXNlTG9jYXRpb24gPSBmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChiYXNlTG9jYXRpb24gPT0gbnVsbCAmJiBmaWxlLmdldExvY2F0aW9uVVJJKCkgIT0gbnVsbCkgewotCQkJCQkJCWJhc2VMb2NhdGlvbiA9IGZpbGUuZ2V0TG9jYXRpb25VUkkoKS50b1N0cmluZygpOwotCQkJCQkJfQotCQkJCQkJaWYgKGJhc2VMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCQkJYmFzZUxvY2F0aW9uID0gZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXN1bHQgPSBiYXNlTG9jYXRpb247Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIENNRWxlbWVudERlY2xhcmF0aW9uIGZvciBhbiBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHJpdmF0ZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBudWxsOwotCi0JCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCWVkID0gbXEuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGVkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSBub2RlIHdpdGhpbiBub2RlIGF0IG9mZnNldAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEByZXR1cm4gQXR0cgotCSAqLwotCXByaXZhdGUgQXR0ciBnZXRDdXJyZW50QXR0ck5vZGUoTm9kZSBub2RlLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmICgobm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuY29udGFpbnMob2Zmc2V0KSAmJiAobm9kZS5oYXNBdHRyaWJ1dGVzKCkpKSB7Ci0JCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCS8vIGdvIHRocm91Z2ggZWFjaCBhdHRyaWJ1dGUgaW4gbm9kZSBhbmQgaWYgYXR0cmlidXRlIGNvbnRhaW5zCi0JCQkvLyBvZmZzZXQsIHJldHVybiB0aGF0IGF0dHJpYnV0ZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgKytpKSB7Ci0JCQkJLy8gYXNzdW1wdGlvbiB0aGF0IGlmIHBhcmVudCBub2RlIGlzIG9mIHR5cGUgSW5kZXhlZFJlZ2lvbiwKLQkJCQkvLyB0aGVuIGl0cyBhdHRyaWJ1dGVzIHdpbGwgYWxzbyBiZSBvZiB0eXBlIEluZGV4ZWRSZWdpb24KLQkJCQlJbmRleGVkUmVnaW9uIGF0dFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBhdHRycy5pdGVtKGkpOwotCQkJCWlmIChhdHRSZWdpb24uY29udGFpbnMob2Zmc2V0KSkgewotCQkJCQlyZXR1cm4gKEF0dHIpIGF0dHJzLml0ZW0oaSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5vZGUgdGhlIGN1cnNvciBpcyBjdXJyZW50bHkgb24gaW4gdGhlIGRvY3VtZW50LiBudWxsIGlmIG5vCi0JICogbm9kZSBpcyBzZWxlY3RlZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIE5vZGUgZWl0aGVyIGVsZW1lbnQsIGRvY3R5cGUsIHRleHQsIG9yIG51bGwKLQkgKi8KLQlwcml2YXRlIE5vZGUgZ2V0Q3VycmVudE5vZGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIGdldCB0aGUgY3VycmVudCBub2RlIGF0IHRoZSBvZmZzZXQgKHJldHVybnMgZWl0aGVyOiBlbGVtZW50LAotCQkvLyBkb2N0eXBlLCB0ZXh0KQotCQlJbmRleGVkUmVnaW9uIGlub2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlpbm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCk7Ci0JCQkJaWYgKGlub2RlID09IG51bGwpIHsKLQkJCQkJaW5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQgLSAxKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaW5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gKE5vZGUpIGlub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gSUZpbGUgZnJvbSB0aGUgZ2l2ZW4gdXJpIGlmIHBvc3NpYmxlLCBudWxsIGlmIGNhbm5vdCBmaW5kCi0JICogZmlsZSBmcm9tIHVyaS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVN0cmluZwotCSAqICAgICAgICAgICAgZmlsZSBzeXN0ZW0gcGF0aAotCSAqIEByZXR1cm4gcmV0dXJucyBJRmlsZSBpZiBmaWxlU3RyaW5nIGV4aXN0cyBpbiB0aGUgd29ya3NwYWNlCi0JICovCi0JcHJpdmF0ZSBJRmlsZSBnZXRGaWxlKFN0cmluZyBmaWxlU3RyaW5nKSB7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCi0JCWlmIChmaWxlU3RyaW5nICE9IG51bGwpIHsKLQkJCVBhdGggZmlsZVBhdGggPSBuZXcgUGF0aChmaWxlU3RyaW5nKTsKLQkJCWlmIChmaWxlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEgJiYgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGZpbGVQYXRoKS5leGlzdHMoKSkgewotCQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZmlsZVBhdGgpOwotCQkJfQotCQkJSUZpbGVbXSBmaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24oZmlsZVBhdGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IChpIDwgZmlsZXMubGVuZ3RoKSAmJiAoZmlsZSA9PSBudWxsKTsgaSsrKSB7Ci0JCQkJaWYgKGZpbGVzW2ldLmV4aXN0cygpKSB7Ci0JCQkJCWZpbGUgPSBmaWxlc1tpXTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBmaWxlIGZyb20gdGhlIGdpdmVuIHVyaSBzdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gdXJpU3RyaW5nIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgdXJpU3RyaW5nIGlzIG5vdCBodHRwOi8vCi0JICogQHJldHVybiBGaWxlIGNyZWF0ZWQgZnJvbSB1cmlTdHJpbmcgaWYgcG9zc2libGUsIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBGaWxlIGdldEZpbGVGcm9tVXJpU3RyaW5nKFN0cmluZyB1cmlTdHJpbmcpIHsKLQkJRmlsZSBmaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGZpcnN0IGp1c3QgdHJ5IHRvIGNyZWF0ZSBhIGZpbGUgZGlyZWN0bHkgZnJvbSB1cmlTdHJpbmcgYXMKLQkJCS8vIGRlZmF1bHQgaW4gY2FzZSBjcmVhdGUgZmlsZSBmcm9tIHVyaSBkb2VzIG5vdCB3b3JrCi0JCQlmaWxlID0gbmV3IEZpbGUodXJpU3RyaW5nKTsKLQotCQkJLy8gdHJ5IHRvIGNyZWF0ZSBmaWxlIGZyb20gdXJpCi0JCQlVUkkgdXJpID0gbmV3IFVSSSh1cmlTdHJpbmcpOwotCQkJZmlsZSA9IG5ldyBGaWxlKHVyaSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZiBleGNlcHRpb24gaXMgdGhyb3duIHdoaWxlIHRyeWluZyB0byBjcmVhdGUgRmlsZSBqdXN0IGlnbm9yZQotCQkJLy8gYW5kIGZpbGUgd2lsbCBiZSBudWxsCi0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JcHJpdmF0ZSBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbihOb2RlIG5vZGUpIHsKLQkJSVJlZ2lvbiBoeXBlclJlZ2lvbiA9IG51bGw7Ci0KLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCQlpZiAobm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpIHsKLQkJCQkvLyBoYW5kbGUgZG9jIHR5cGUgbm9kZQotCQkJCUlET01Ob2RlIGRvY05vZGUgPSAoSURPTU5vZGUpIG5vZGU7Ci0JCQkJaHlwZXJSZWdpb24gPSBuZXcgUmVnaW9uKGRvY05vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgZG9jTm9kZS5nZXRFbmRPZmZzZXQoKSAtIGRvY05vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkJLy8gaGFuZGxlIGF0dHJpYnV0ZSBub2RlcwotCQkJCUlET01BdHRyIGF0dCA9IChJRE9NQXR0cikgbm9kZTsKLQkJCQkvLyBkbyBub3QgaW5jbHVkZSBxdW90ZXMgaW4gYXR0cmlidXRlIHZhbHVlIHJlZ2lvbgotCQkJCWludCByZWdPZmZzZXQgPSBhdHQuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotCQkJCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gYXR0LmdldFZhbHVlUmVnaW9uKCk7Ci0JCQkJaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaW50IHJlZ0xlbmd0aCA9IHZhbHVlUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJU3RyaW5nIGF0dFZhbHVlID0gYXR0LmdldFZhbHVlUmVnaW9uVGV4dCgpOwotCQkJCQlpZiAoU3RyaW5nVXRpbHMuaXNRdW90ZWQoYXR0VmFsdWUpKSB7Ci0JCQkJCQkrK3JlZ09mZnNldDsKLQkJCQkJCXJlZ0xlbmd0aCA9IHJlZ0xlbmd0aCAtIDI7Ci0JCQkJCX0KLQkJCQkJaHlwZXJSZWdpb24gPSBuZXcgUmVnaW9uKHJlZ09mZnNldCwgcmVnTGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGh5cGVyUmVnaW9uOwotCX0KLQotCS8qKgotCSAqIEF0dGVtcHRzIHRvIGZpbmQgYW4gYXR0cmlidXRlIHdpdGhpbiBlbGVtZW50IHRoYXQgaXMgb3BlbmFibGUuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgLQotCSAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwKLQkgKiBAcmV0dXJuIEF0dHIgYXR0cmlidXRlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG9wZW4gb24sIG51bGwgaWYgbm8KLQkgKiAgICAgICAgIGF0dHJpYnV0ZSBjb3VsZCBiZSBmb3VuZAotCSAqLwotCXByaXZhdGUgQXR0ciBnZXRMaW5rYWJsZUF0dHIoRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCS8vIGdldCB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGlzIG5vZGUKLQkJTmFtZWROb2RlTWFwIGF0dHJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7ICsraSkgewotCQkJLy8gY2hlY2sgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgIm9wZW5Pbi1hYmxlIgotCQkJQXR0ciBhdHQgPSAoQXR0cikgYXR0cnMuaXRlbShpKTsKLQkJCWlmIChpc0xpbmthYmxlQXR0cihhdHQsIGVkKSkgewotCQkJCXJldHVybiBhdHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRmluZCB0aGUgbG9jYXRpb24gaGludCBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZVVSSSBpZiBpdCBleGlzdHMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudE5vZGUgLQotCSAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwKLQkgKiBAcGFyYW0gbmFtZXNwYWNlVVJJIC0KLQkgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsCi0JICogQHJldHVybiBsb2NhdGlvbiBoaW50IChzeXN0ZW1JZCkgaWYgaXQgd2FzIGZvdW5kLCBudWxsIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldExvY2F0aW9uSGludChFbGVtZW50IGVsZW1lbnROb2RlLCBTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCUF0dHIgc2NoZW1hTG9jTm9kZSA9IGVsZW1lbnROb2RlLmdldEF0dHJpYnV0ZU5vZGVOUyhYU0lfTkFNRVNQQUNFX1VSSSwgU0NIRU1BX0xPQ0FUSU9OKTsKLQkJaWYgKHNjaGVtYUxvY05vZGUgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzY2hlbWFMb2NOb2RlLmdldFZhbHVlKCkpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBwdWJsaWNJZCA9IHN0Lmhhc01vcmVUb2tlbnMoKSA/IHN0Lm5leHRUb2tlbigpIDogbnVsbDsKLQkJCQlTdHJpbmcgc3lzdGVtSWQgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7Ci0JCQkJLy8gZm91bmQgbG9jYXRpb24gaGludAotCQkJCWlmIChuYW1lc3BhY2VVUkkuZXF1YWxzSWdub3JlQ2FzZShwdWJsaWNJZCkpIHsKLQkJCQkJcmV0dXJuIHN5c3RlbUlkOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkkgc3RyaW5nCi0JICogCi0JICogQHBhcmFtIG5vZGUgLQotCSAqICAgICAgICAgICAgYXNzdW1lcyBub3QgbnVsbAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFVSSVN0cmluZyhOb2RlIG5vZGUsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQlTdHJpbmcgcmVzb2x2ZWRVUkkgPSBudWxsOwotCQkvLyBuZWVkIHRoZSBiYXNlIGxvY2F0aW9uLCBwdWJsaWNJZCwgYW5kIHN5c3RlbUlkIGZvciBVUklSZXNvbHZlcgotCQlTdHJpbmcgYmFzZUxvYyA9IG51bGw7Ci0JCVN0cmluZyBwdWJsaWNJZCA9IG51bGw7Ci0JCVN0cmluZyBzeXN0ZW1JZCA9IG51bGw7Ci0KLQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCS8vIGhhbmRsZSBkb2MgdHlwZSBub2RlCi0JCWlmIChub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJYmFzZUxvYyA9IGdldEJhc2VMb2NhdGlvbihkb2N1bWVudCk7Ci0JCQlwdWJsaWNJZCA9ICgoRG9jdW1lbnRUeXBlKSBub2RlKS5nZXRQdWJsaWNJZCgpOwotCQkJc3lzdGVtSWQgPSAoKERvY3VtZW50VHlwZSkgbm9kZSkuZ2V0U3lzdGVtSWQoKTsKLQkJfQotCQllbHNlIGlmIChub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkvLyBoYW5kbGUgYXR0cmlidXRlIG5vZGUKLQkJCUF0dHIgYXR0ck5vZGUgPSAoQXR0cikgbm9kZTsKLQkJCVN0cmluZyBhdHRyTmFtZSA9IGF0dHJOb2RlLmdldE5hbWUoKTsKLQkJCVN0cmluZyBhdHRyVmFsdWUgPSBhdHRyTm9kZS5nZXRWYWx1ZSgpOwotCQkJYXR0clZhbHVlID0gU3RyaW5nVXRpbHMuc3RyaXAoYXR0clZhbHVlKTsKLQkJCWlmICgoYXR0clZhbHVlICE9IG51bGwpICYmIChhdHRyVmFsdWUubGVuZ3RoKCkgPiAwKSkgewotCQkJCWJhc2VMb2MgPSBnZXRCYXNlTG9jYXRpb24oZG9jdW1lbnQpOwotCi0JCQkJLy8gaGFuZGxlIHNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZQotCQkJCVN0cmluZyBwcmVmaXggPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0UHJlZml4KGF0dHJOYW1lKTsKLQkJCQlTdHJpbmcgdW5wcmVmaXhlZE5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0VW5wcmVmaXhlZE5hbWUoYXR0ck5hbWUpOwotCQkJCWlmICgoWE1MTlMuZXF1YWxzKHByZWZpeCkpIHx8IChYTUxOUy5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSkgewotCQkJCQlwdWJsaWNJZCA9IGF0dHJWYWx1ZTsKLQkJCQkJc3lzdGVtSWQgPSBnZXRMb2NhdGlvbkhpbnQoYXR0ck5vZGUuZ2V0T3duZXJFbGVtZW50KCksIHB1YmxpY0lkKTsKLQkJCQkJaWYgKHN5c3RlbUlkID09IG51bGwpIHsKLQkJCQkJCXN5c3RlbUlkID0gYXR0clZhbHVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChYU0lfTkFNRVNQQUNFX1VSSS5lcXVhbHMoRE9NTmFtZXNwYWNlSGVscGVyLmdldE5hbWVzcGFjZVVSSShhdHRyTm9kZSkpKSAmJiAoU0NIRU1BX0xPQ0FUSU9OLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpKSB7Ci0JCQkJCS8vIGZvciBub3cganVzdCB1c2UgdGhlIGZpcnN0IHBhaXIKLQkJCQkJLy8gbmVlZCB0byBsb29rIGludG8gYmVpbmcgbW9yZSBwcmVjaXNlCi0JCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0clZhbHVlKTsKLQkJCQkJcHVibGljSWQgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7Ci0JCQkJCXN5c3RlbUlkID0gc3QuaGFzTW9yZVRva2VucygpID8gc3QubmV4dFRva2VuKCkgOiBudWxsOwotCQkJCQkvLyBlbHNlIGNoZWNrIGlmIHhtbG5zIHB1YmxpY0lkID0gdmFsdWUKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXN5c3RlbUlkID0gYXR0clZhbHVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJlc29sdmVkVVJJID0gcmVzb2x2ZVVSSShiYXNlTG9jLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQlyZXR1cm4gcmVzb2x2ZWRVUkk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdXJpU3RyaW5nIGlzIGFuIGh0dHAgc3RyaW5nCi0JICogCi0JICogQHBhcmFtIHVyaVN0cmluZwotCSAqIEByZXR1cm4gdHJ1ZSBpZiB1cmlTdHJpbmcgaXMgaHR0cCBzdHJpbmcsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0h0dHAoU3RyaW5nIHVyaVN0cmluZykgewotCQlib29sZWFuIGlzSHR0cCA9IGZhbHNlOwotCQlpZiAodXJpU3RyaW5nICE9IG51bGwpIHsKLQkJCVN0cmluZyB0ZW1wU3RyaW5nID0gdXJpU3RyaW5nLnRvTG93ZXJDYXNlKCk7Ci0JCQlpZiAodGVtcFN0cmluZy5zdGFydHNXaXRoKEhUVFBfUFJPVE9DT0wpKSB7Ci0JCQkJaXNIdHRwID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNIdHRwOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGdpdmVuIGF0dHJpYnV0ZSBpcyBvcGVuYWJsZS4gQXR0cmlidXRlIGlzIG9wZW5hYmxlCi0JICogaWYgaXQgaXMgYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gYXR0cmlidXRlIG9yIGlmIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMKLQkgKiBvZiB0eXBlIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0cgotCSAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwKLQkgKiBAcGFyYW0gY21FbGVtZW50Ci0JICogICAgICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGF0dHJpYnV0ZSAoY2FuIGJlCi0JICogICAgICAgICAgICBudWxsKQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGF0dHJpYnV0ZSBpcyAib3Blbk9uLWFibGUiIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0xpbmthYmxlQXR0cihBdHRyIGF0dHIsIENNRWxlbWVudERlY2xhcmF0aW9uIGNtRWxlbWVudCkgewotCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJU3RyaW5nIHByZWZpeCA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRQcmVmaXgoYXR0ck5hbWUpOwotCQlTdHJpbmcgdW5wcmVmaXhlZE5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0VW5wcmVmaXhlZE5hbWUoYXR0ck5hbWUpOwotCQkvLyBkZXRlcm1pbmUgaWYgYXR0cmlidXRlIGlzIG5hbWVzcGFjZSBkZWNsYXJhdGlvbgotCQlpZiAoKFhNTE5TLmVxdWFscyhwcmVmaXgpKSB8fCAoWE1MTlMuZXF1YWxzKHVucHJlZml4ZWROYW1lKSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gZGV0ZXJtaW5lIGlmIGF0dHJpYnV0ZSBjb250YWlucyBzY2hlbWEgbG9jYXRpb24KLQkJaWYgKChYU0lfTkFNRVNQQUNFX1VSSS5lcXVhbHMoRE9NTmFtZXNwYWNlSGVscGVyLmdldE5hbWVzcGFjZVVSSShhdHRyKSkpICYmICgoU0NIRU1BX0xPQ0FUSU9OLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpIHx8IChOT19OQU1FU1BBQ0VfU0NIRU1BX0xPQ0FUSU9OLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvLyBkZXRlcm1pbmUgaWYgYXR0cmlidXRlIHZhbHVlIGlzIG9mIHR5cGUgVVJJCi0JCWlmIChjbUVsZW1lbnQgIT0gbnVsbCkgewotCQkJQ01OYW1lZE5vZGVNYXAgYXR0ckRlY2xzID0gY21FbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJCUNNTmFtZWROb2RlTWFwSW1wbCBhbGxBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbChhdHRyRGVjbHMpOwotCQkJTGlzdCBub2RlcyA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoYXR0ci5nZXRPd25lckRvY3VtZW50KCkpLmdldEF2YWlsYWJsZUNvbnRlbnQoYXR0ci5nZXRPd25lckVsZW1lbnQoKSwgY21FbGVtZW50LCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IG5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQkJQ01Ob2RlIGNtbm9kZSA9IChDTU5vZGUpIG5vZGVzLmdldChrKTsKLQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCQlhbGxBdHRyaWJ1dGVzLnB1dChjbW5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWF0dHJEZWNscyA9IGFsbEF0dHJpYnV0ZXM7Ci0KLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0ckRlY2xzLmdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCQlpZiAoKGF0dHJEZWNsICE9IG51bGwpICYmIChhdHRyRGVjbC5nZXRBdHRyVHlwZSgpICE9IG51bGwpICYmIChDTURhdGFUeXBlLlVSSS5lcXVhbHMoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKS5nZXREYXRhVHlwZU5hbWUoKSkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB1cmlTdHJpbmcgaXMgcmVhbGx5IHBvaW50aW5nIHRvIGEgZmlsZQotCSAqIAotCSAqIEBwYXJhbSB1cmlTdHJpbmcKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFVSSShTdHJpbmcgdXJpU3RyaW5nKSB7Ci0JCWJvb2xlYW4gaXNWYWxpZCA9IGZhbHNlOwotCi0JCWlmIChpc0h0dHAodXJpU3RyaW5nKSkgewotCQkJaXNWYWxpZCA9IHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlGaWxlIGZpbGUgPSBnZXRGaWxlRnJvbVVyaVN0cmluZyh1cmlTdHJpbmcpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCWlzVmFsaWQgPSBmaWxlLmlzRmlsZSgpOwotCQkJfQotCQkJaWYoIWlzVmFsaWQpIHsKLQkJCX0KLQkJCQotCQl9Ci0JCXJldHVybiBpc1ZhbGlkOwotCX0KLQotCS8qKgotCSAqIFJlc29sdmVzIHRoZSBnaXZlbiBVUkkgaW5mb3JtYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZUxvY2F0aW9uCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogQHBhcmFtIHN5c3RlbUlkCi0JICogQHJldHVybiBTdHJpbmcgcmVzb2x2ZWQgdXJpLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJLy8gZG9udCByZXNvbHZlIGlmIHRoZXJlJ3Mgbm90aGluZyB0byByZXNvbHZlCi0JCWlmICgoYmFzZUxvY2F0aW9uID09IG51bGwpICYmIChwdWJsaWNJZCA9PSBudWxsKSAmJiAoc3lzdGVtSWQgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uQWRkTmFtZXNwYWNlc0NvbnRyb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uQWRkTmFtZXNwYWNlc0NvbnRyb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ2MjI1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvbnNlZGl0L0NvbW1vbkFkZE5hbWVzcGFjZXNDb250cm9sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9ncy5TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBDb21tb25BZGROYW1lc3BhY2VzQ29udHJvbCBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQotCWNsYXNzIEVkaXROYW1lc3BhY2VDb250cm9sIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQkJcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b247Ci0JCVRleHQgbG9jYXRpb25IaW50RmllbGQ7Ci0JCVRleHQgcHJlZml4RmllbGQ7Ci0JCVRleHQgdXJpRmllbGQ7Ci0KLQkJLy8gcHJvdGVjdGVkIE5hbWVzcGFjZUluZm8gaW5mbzsKLQotCQlwdWJsaWMgRWRpdE5hbWVzcGFjZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7IC8vIEJPUkRFUik7Ci0JCQlzZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlzZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9FTlRFUl9SRVFfUFJFRklYX0FORF9OQU1FU1BBQ0UpOwotCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlnZC53aWR0aEhpbnQgPSAzNTA7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCS8vIHJvdyAxCi0JCQkvLwotCQkJTGFiZWwgcHJlZml4TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlwcmVmaXhMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX1BSRUZJWF9DT0xPTik7Ci0KLQkJCXByZWZpeEZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlwcmVmaXhGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCS8vIHByZWZpeEZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGluZm8ucHJlZml4KSk7Ci0JCQkvLyBwcmVmaXhGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCQkvLyBwcmVmaXhGaWVsZC5zZXRFbmFibGVkKGluZm8uZ2V0UHJvcGVydHkoInByZWZpeC1yZWFkT25seSIpID09Ci0JCQkvLyBudWxsKTsKLQkJCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQotCQkJLy8gcm93IDIKLQkJCS8vCi0JCQlMYWJlbCB1cmlMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCXVyaUxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfTkFNRVNQQUNFX05BTUVfQ09MT04pOwotCi0JCQl1cmlGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJdXJpRmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQkvLyB1cmlGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShpbmZvLnVyaSkpOwotCQkJLy8gdXJpRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkJLy8gdXJpRmllbGQuc2V0RW5hYmxlZChpbmZvLmdldFByb3BlcnR5KCJ1cmktcmVhZE9ubHkiKSA9PSBudWxsKTsKLQotCQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0JCQkvLyByb3cgMwotCQkJLy8KLQkJCUxhYmVsIGxvY2F0aW9uSGludExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJbG9jYXRpb25IaW50TGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9MT0NBVElPTl9ISU5UX0NPTE9OKTsKLQotCQkJbG9jYXRpb25IaW50RmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCWxvY2F0aW9uSGludEZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJLy8gbG9jYXRpb25IaW50RmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoaW5mby5sb2NhdGlvbkhpbnQpKTsKLQkJCS8vIGxvY2F0aW9uSGludEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJCS8vIGxvY2F0aW9uSGludEZpZWxkLnNldEVuYWJsZWQoaW5mby5nZXRQcm9wZXJ0eSgibG9jYXRpb25IaW50LXJlYWRPbmx5IikKLQkJCS8vID09IG51bGwpOwotCi0JCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJcGVyZm9ybUJyb3dzZSgpOwotCQkJCX0KLQkJCX07Ci0KLQkJCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlicm93c2VCdXR0b24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9CUk9XU0UpOwotCQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJCWJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKGxvY2F0aW9uSGludEZpZWxkLmdldEVuYWJsZWQoKSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQnJvd3NlKCkgewotCQkJU3RyaW5nW10gZXh0ZW5zaW9ucyA9IHsiLnhzZCJ9OyAvLyROT04tTkxTLTEkCi0JCQlTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2cgZGlhbG9nID0gbmV3IFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZERpYWxvZyhnZXRTaGVsbCgpLCBleHRlbnNpb25zKTsKLQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfU0VMRUNUX0ZJTEUpOwotCQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQotCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJLy8gU3RyaW5nIGdyYW1tYXJVUkkgPSBudWxsOwotCQkJCUlGaWxlIGZpbGUgPSBkaWFsb2cuZ2V0RmlsZSgpOwotCQkJCVN0cmluZyBpZCA9IGRpYWxvZy5nZXRJZCgpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHVyaSA9IG51bGw7Ci0JCQkJCWlmIChyZXNvdXJjZUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihyZXNvdXJjZUxvY2F0aW9uKTsKLQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJSVBhdGggbG9jYXRpb24gPSByZXNvdXJjZS5nZXRMb2NhdGlvbigpOwotCQkJCQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCXVyaSA9IFVSSUhlbHBlci5nZXRSZWxhdGl2ZVVSSShmaWxlLmdldExvY2F0aW9uKCksIGxvY2F0aW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvLyBncmFtbWFyVVJJID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXVyaSA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQkJCQkvLyBncmFtbWFyVVJJID0gdXJpOwotCQkJCQl9Ci0JCQkJCWxvY2F0aW9uSGludEZpZWxkLnNldFRleHQodXJpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoaWQgIT0gbnVsbCkgewotCQkJCQlsb2NhdGlvbkhpbnRGaWVsZC5zZXRUZXh0KGlkKTsKLQkJCQkJLy8gVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPQotCQkJCQlVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOwotCQkJCQkvLyBncmFtbWFyVVJJID0gcmVzb2x2ZXIucmVzb2x2ZShudWxsLCBpZCwgaWQpOwotCQkJCX0KLQotCQkJCXRyeSB7Ci0JCQkJCS8vIFRPRE8gQ01Eb2N1bWVudCBkb2N1bWVudCA9Ci0JCQkJCS8vIENNRG9jdW1lbnRCdWlsZGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5idWlsZENNRG9jdW1lbnQoZ3JhbW1hclVSSSk7Ci0JCQkJCS8vIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QgPQotCQkJCQkvLyAoTGlzdClkb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25hbWVzcGFjZUluZm8iKTsKLQkJCQkJLy8gTmFtZXNwYWNlSW5mbyBpbmZvID0KLQkJCQkJLy8gKE5hbWVzcGFjZUluZm8pbmFtZXNwYWNlSW5mb0xpc3QuZ2V0KDApOwotCQkJCQkvLyBpZiAodXJpRmllbGQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwICYmIGluZm8udXJpCi0JCQkJCS8vICE9IG51bGwpCi0JCQkJCS8vIHsKLQkJCQkJLy8gdXJpRmllbGQuc2V0VGV4dChpbmZvLnVyaSk7Ci0JCQkJCS8vIH0KLQkJCQkJLy8gaWYgKHByZWZpeEZpZWxkLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCAmJgotCQkJCQkvLyBpbmZvLnByZWZpeCAhPSBudWxsKQotCQkJCQkvLyB7Ci0JCQkJCS8vIHByZWZpeEZpZWxkLnNldFRleHQoaW5mby5wcmVmaXgpOwotCQkJCQkvLyB9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBCdXR0b24gZGVsZXRlQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZWRpdEJ1dHRvbjsKLQlwcm90ZWN0ZWQgRWRpdE5hbWVzcGFjZUNvbnRyb2wgZWRpdE5hbWVzcGFjZUNvbnRyb2w7Ci0JcHJvdGVjdGVkIGludCBoZWlnaHRIaW50ID0gMjUwOwotCXByb3RlY3RlZCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBCdXR0b24gbmV3QnV0dG9uOwotCXByb3RlY3RlZCBQYWdlQm9vayBwYWdlQm9vazsKLQlwcm90ZWN0ZWQgQnV0dG9uIHJhZGlvMTsKLQlwcm90ZWN0ZWQgQnV0dG9uIHJhZGlvMjsKLQlwcm90ZWN0ZWQgSVBhdGggcmVzb3VyY2VMb2NhdGlvbjsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHRhYmxlU2VjdGlvbjsKLQlwcm90ZWN0ZWQgQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlIHRhYmxlVmlld2VyOwotCXByb3RlY3RlZCBpbnQgd2lkdGhIaW50ID0gNTAwOwotCi0KLQlwdWJsaWMgQ29tbW9uQWRkTmFtZXNwYWNlc0NvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlpZiAod2lkdGhIaW50ICE9IC0xKSB7Ci0JCQlnZC53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7Ci0JCX0KLQkJaWYgKGhlaWdodEhpbnQgIT0gLTEpIHsKLQkJCWdkLmhlaWdodEhpbnQgPSBoZWlnaHRIaW50OwotCQl9Ci0JCXNldExheW91dERhdGEoZ2QpOwotCQlzZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJcmFkaW8xID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuUkFESU8pOwotCQlyYWRpbzEuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9TRUxFQ1RfUkVHSVNURVJFRF9OQU1FU1BBQ0VTKTsKLQkJcmFkaW8xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCXJhZGlvMiA9IG5ldyBCdXR0b24odGhpcywgU1dULlJBRElPKTsKLQkJcmFkaW8yLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfU1BFQ0lGWV9ORVdfTkFNRVNQQUNFKTsKLQkJcmFkaW8yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCUxhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCS8vIEdyb3VwIG5hbWVzcGFjZUluZm9Hcm91cCA9IG5ldyBHcm91cCh0aGlzLCBTV1QuTk9ORSk7Ci0JCS8vIG5hbWVzcGFjZUluZm9Hcm91cC5zZXRUZXh0KCJOYW1lc3BhY2UgRGVjbGFyYXRpb25zIik7Ci0JCS8vIC8vWE1MQ29tbW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIl9VSV9MQUJFTF9YTUxfU0NIRU1BX0lORk9STUFUSU9OIikpOwotCQkvLyBuYW1lc3BhY2VJbmZvR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCS8vIG5hbWVzcGFjZUluZm9Hcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2sodGhpcywgU1dULk5PTkUpOwotCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQl0YWJsZVNlY3Rpb24gPSBuZXcgQ29tcG9zaXRlKHBhZ2VCb29rLCBTV1QuTk9ORSk7Ci0JCXRhYmxlU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRhYmxlU2VjdGlvbiwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX1NFTEVDVF9OQU1FU1BBQ0VfVE9fQUREKTsKLQotCQl0YWJsZVZpZXdlciA9IG5ldyBDb21tb25OYW1lc3BhY2VJbmZvVGFibGUodGFibGVTZWN0aW9uLCBTV1QuQ0hFQ0ssIDYpOwotCQllZGl0TmFtZXNwYWNlQ29udHJvbCA9IG5ldyBFZGl0TmFtZXNwYWNlQ29udHJvbChwYWdlQm9vayk7Ci0JCXBhZ2VCb29rLnNob3dQYWdlKHRhYmxlU2VjdGlvbik7Ci0KLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQobmFtZXNwYWNlSW5mb0xpc3QpOwotCX0KLQotCi0KLQlwdWJsaWMgTGlzdCBnZXROYW1lc3BhY2VJbmZvTGlzdCgpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocmFkaW8xLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQkJCWlmIChpdGVtLmdldENoZWNrZWQoKSkgewotCQkJCQlsaXN0LmFkZChpdGVtLmdldERhdGEoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLQkJCWluZm8ucHJlZml4ID0gZWRpdE5hbWVzcGFjZUNvbnRyb2wucHJlZml4RmllbGQuZ2V0VGV4dCgpOwotCQkJaW5mby51cmkgPSBlZGl0TmFtZXNwYWNlQ29udHJvbC51cmlGaWVsZC5nZXRUZXh0KCk7Ci0JCQlpbmZvLmxvY2F0aW9uSGludCA9IGVkaXROYW1lc3BhY2VDb250cm9sLmxvY2F0aW9uSGludEZpZWxkLmdldFRleHQoKTsKLQkJCWxpc3QuYWRkKGluZm8pOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZUluZm9MaXN0KExpc3QgbGlzdCkgewotCQluYW1lc3BhY2VJbmZvTGlzdCA9IGxpc3Q7Ci0JCXRhYmxlVmlld2VyLnNldElucHV0KG5hbWVzcGFjZUluZm9MaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IHJhZGlvMSkgewotCQkJcGFnZUJvb2suc2hvd1BhZ2UodGFibGVTZWN0aW9uKTsKLQkJfQotCQllbHNlIGlmIChlLndpZGdldCA9PSByYWRpbzIpIHsKLQkJCXBhZ2VCb29rLnNob3dQYWdlKGVkaXROYW1lc3BhY2VDb250cm9sKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uQWRkTmFtZXNwYWNlc0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25BZGROYW1lc3BhY2VzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OTExM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25BZGROYW1lc3BhY2VzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ29tbW9uQWRkTmFtZXNwYWNlc0RpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIENvbW1vbkFkZE5hbWVzcGFjZXNDb250cm9sIGFkZE5hbWVzcGFjZXNDb250cm9sOwotCXByb3RlY3RlZCBMaXN0IGV4aXN0aW5nTmFtZXNwYWNlczsKLQlwcm90ZWN0ZWQgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdDsKLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uOwotCXByb3RlY3RlZCBIYXNoTWFwIHByZWZlcnJlZFByZWZpeFRhYmxlID0gbmV3IEhhc2hNYXAoKTsKLQlwcm90ZWN0ZWQgSVBhdGggcmVzb3VyY2VMb2NhdGlvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotCi0JcHVibGljIENvbW1vbkFkZE5hbWVzcGFjZXNEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZSwgSVBhdGggcmVzb3VyY2VMb2NhdGlvbiwgTGlzdCBleGlzdGluZ05hbWVzcGFjZXMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXRoaXMuZXhpc3RpbmdOYW1lc3BhY2VzID0gZXhpc3RpbmdOYW1lc3BhY2VzOwotCQlwcmVmZXJyZWRQcmVmaXhUYWJsZS5wdXQoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiwgIndzZGwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXByZWZlcnJlZFByZWZpeFRhYmxlLnB1dCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIsICJzb2FwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwcmVmZXJyZWRQcmVmaXhUYWJsZS5wdXQoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iLCAiaHR0cCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcHJlZmVycmVkUHJlZml4VGFibGUucHV0KCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIiwgIm1pbWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXByZWZlcnJlZFByZWZpeFRhYmxlLnB1dCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLCAic29hcGVuYyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcHJlZmVycmVkUHJlZml4VGFibGUucHV0KCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIsICJzb2FwZW52Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwcmVmZXJyZWRQcmVmaXhUYWJsZS5wdXQoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInhzaSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcHJlZmVycmVkUHJlZml4VGFibGUucHV0KCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJ4c2QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQnVpbHRJbk5hbWVzcGFjZXMoTGlzdCBsaXN0KSB7Ci0JCVN0cmluZyB4c2lOYW1lc3BhY2UgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB4c2ROYW1lc3BhY2UgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOyAvLyROT04tTkxTLTEkCi0JCWlmICghaXNBbHJlYWR5RGVjbGFyZWQoeHNpTmFtZXNwYWNlKSkgewotCQkJbGlzdC5hZGQobmV3IE5hbWVzcGFjZUluZm8oImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInhzaSIsIG51bGwpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKCFpc0FscmVhZHlEZWNsYXJlZCh4c2ROYW1lc3BhY2UpKSB7Ci0JCQlsaXN0LmFkZChuZXcgTmFtZXNwYWNlSW5mbygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAieHNkIiwgbnVsbCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENhdGFsb2dNYXBUb0xpc3QoSUNhdGFsb2cgY2F0YWxvZywgTGlzdCBsaXN0KSB7Ci0JCUlDYXRhbG9nRW50cnlbXSBlbnRyaWVzID0gY2F0YWxvZy5nZXRDYXRhbG9nRW50cmllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDYXRhbG9nRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJaWYgKChlbnRyeS5nZXRFbnRyeVR5cGUoKSA9PSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDKSAmJiBlbnRyeS5nZXRVUkkoKS5lbmRzV2l0aCgiLnhzZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoIWlzQWxyZWFkeURlY2xhcmVkKGVudHJ5LmdldEtleSgpKSkgewotCQkJCQlOYW1lc3BhY2VJbmZvIG5hbWVzcGFjZUluZm8gPSBuZXcgTmFtZXNwYWNlSW5mbyhlbnRyeS5nZXRLZXkoKSwgInh4IiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbGlzdC5hZGQobmFtZXNwYWNlSW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCW5hbWVzcGFjZUluZm9MaXN0ID0gYWRkTmFtZXNwYWNlc0NvbnRyb2wuZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKTsKLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb21wdXRlQWRkYWJsZVByZWZpeGVzKExpc3QgYWRkYWJsZUxpc3QsIExpc3QgZXhpc2l0aW5nTGlzdCkgewotCQlIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGV4aXNpdGluZ0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0JCQlpZiAoaW5mby5wcmVmaXggIT0gbnVsbCkgewotCQkJCW1hcC5wdXQoaW5mby5wcmVmaXgsIGluZm8pOwotCQkJfQotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGFkZGFibGVMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotCQkJaWYgKGluZm8udXJpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgcHJlZmVycmVkUHJlZml4VGFibGUuZ2V0KGluZm8udXJpKTsKLQkJCQlpbmZvLnByZWZpeCA9IGdldFVuaXF1ZVByZWZpeChtYXAsIHByZWZpeCwgaW5mby51cmkpOwotCQkJCW1hcC5wdXQoaW5mby5wcmVmaXgsIGluZm8pOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGludCBjcmVhdGVBbmRPcGVuKCkgewotCQljcmVhdGUoKTsKLQkJZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQkJUmVjdGFuZ2xlIHIgPSBnZXRTaGVsbCgpLmdldEJvdW5kcygpOwotCQlnZXRTaGVsbCgpLnNldEJvdW5kcyhyLnggKyA4MCwgci55ICsgODAsIHIud2lkdGgsIHIuaGVpZ2h0KTsKLQkJc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCXJldHVybiBvcGVuKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJYWRkTmFtZXNwYWNlc0NvbnRyb2wgPSBuZXcgQ29tbW9uQWRkTmFtZXNwYWNlc0NvbnRyb2woZGlhbG9nQXJlYSwgU1dULk5PTkUsIHJlc291cmNlTG9jYXRpb24pOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJYWRkQnVpbHRJbk5hbWVzcGFjZXMobGlzdCk7Ci0JCUlDYXRhbG9nIGRlZmF1bHRDYXRhbG9nID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLQkJSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gZGVmYXVsdENhdGFsb2cuZ2V0TmV4dENhdGFsb2dzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJTmV4dENhdGFsb2cgY2F0YWxvZyA9IG5leHRDYXRhbG9nc1tpXTsKLQkJCUlDYXRhbG9nIHJlZmVyZW5jZWRDYXRhbG9nID0gY2F0YWxvZy5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotCQkJaWYgKHJlZmVyZW5jZWRDYXRhbG9nICE9IG51bGwpIHsKLQkJCQlpZiAoWE1MQ29yZVBsdWdpbi5VU0VSX0NBVEFMT0dfSUQuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKSB7Ci0JCQkJCUlDYXRhbG9nIHVzZXJDYXRhbG9nID0gcmVmZXJlbmNlZENhdGFsb2c7Ci0JCQkJCWFkZENhdGFsb2dNYXBUb0xpc3QodXNlckNhdGFsb2csIGxpc3QpOwotCi0JCQkJfQotCQkJCWVsc2UgaWYgKFhNTENvcmVQbHVnaW4uU1lTVEVNX0NBVEFMT0dfSUQuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKSB7Ci0JCQkJCUlDYXRhbG9nIHN5c3RlbUNhdGFsb2cgPSByZWZlcmVuY2VkQ2F0YWxvZzsKLQkJCQkJYWRkQ2F0YWxvZ01hcFRvTGlzdChzeXN0ZW1DYXRhbG9nLCBsaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQljb21wdXRlQWRkYWJsZVByZWZpeGVzKGxpc3QsIGV4aXN0aW5nTmFtZXNwYWNlcyk7Ci0KLQkJYWRkTmFtZXNwYWNlc0NvbnRyb2wuc2V0TmFtZXNwYWNlSW5mb0xpc3QobGlzdCk7Ci0JCXJldHVybiBkaWFsb2dBcmVhOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZUluZm9MaXN0KCkgewotCQlyZXR1cm4gbmFtZXNwYWNlSW5mb0xpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJyZWRQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotCQlyZXR1cm4gKFN0cmluZykgcHJlZmVycmVkUHJlZml4VGFibGUuZ2V0KG5hbWVzcGFjZVVSSSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VW5pcXVlUHJlZml4KEhhc2hNYXAgcHJlZml4TWFwLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0JCWlmIChwcmVmaXggPT0gbnVsbCkgewotCQkJaW50IGxhc3RJbmRleCA9IHVyaS5sYXN0SW5kZXhPZignLycpOwotCQkJaWYgKGxhc3RJbmRleCA9PSB1cmkubGVuZ3RoKCkgLSAxKSB7Ci0JCQkJdXJpID0gdXJpLnN1YnN0cmluZygwLCBsYXN0SW5kZXgpOwotCQkJCWxhc3RJbmRleCA9IHVyaS5sYXN0SW5kZXhPZignLycpOwotCQkJfQotCQkJcHJlZml4ID0gdXJpLnN1YnN0cmluZyhsYXN0SW5kZXggKyAxKTsKLQkJCWlmICgocHJlZml4Lmxlbmd0aCgpID4gMjApIHx8IChwcmVmaXguaW5kZXhPZignOicpICE9IC0xKSkgewotCQkJCXByZWZpeCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0JCQlwcmVmaXggPSAicCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAocHJlZml4TWFwLmdldChwcmVmaXgpICE9IG51bGwpIHsKLQkJCVN0cmluZyBiYXNlID0gcHJlZml4OwotCQkJZm9yIChpbnQgY291bnQgPSAwOyBwcmVmaXhNYXAuZ2V0KHByZWZpeCkgIT0gbnVsbDsgY291bnQrKykgewotCQkJCXByZWZpeCA9IGJhc2UgKyBjb3VudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlZml4OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQWxyZWFkeURlY2xhcmVkKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvciBpID0gZXhpc3RpbmdOYW1lc3BhY2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTmFtZXNwYWNlSW5mbyBuYW1lc3BhY2VJbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotCQkJaWYgKG5hbWVzcGFjZVVSSS5lcXVhbHMobmFtZXNwYWNlSW5mby51cmkpKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzNThjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvbnNlZGl0L0NvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9ncy5FZGl0TmFtZXNwYWNlSW5mb0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MuTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyOwotCi1wdWJsaWMgY2xhc3MgQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2cgewotCXByb3RlY3RlZCBDb21wb3NpdGUgY29tbW9uQ29tcG9zaXRlOwotCXByb3RlY3RlZCBCdXR0b24gZGVsZXRlQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZWRpdEJ1dHRvbjsKLQotCXByb3RlY3RlZCBMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbDsKLQlwcm90ZWN0ZWQgaW50IGhlaWdodEhpbnQgPSAyNTA7Ci0JcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIG5ld0J1dHRvbjsKLQlwcm90ZWN0ZWQgSVBhdGggcmVzb3VyY2VMb2NhdGlvbjsKLQotCXByaXZhdGUgYm9vbGVhbiBzaG93TG9jYXRpb25UZXh0ID0gZmFsc2U7Ci0JcHJvdGVjdGVkIFN0cmluZyB0YWJsZUxhYmVsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlIHRhYmxlVmlld2VyOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSB0b3BDb21wb3NpdGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlR3JvdXA7Ci0JcHJvdGVjdGVkIGludCB3aWR0aEhpbnQgPSA1MDA7Ci0KLQlwdWJsaWMgQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2coQ29tcG9zaXRlIHBhcmVudCwgSVBhdGggcmVzb3VyY2VMb2NhdGlvbiwgU3RyaW5nIHN0cmluZ1RhYmxlTGFiZWwpIHsKLQkJdGhpcyhwYXJlbnQsIHJlc291cmNlTG9jYXRpb24sIHN0cmluZ1RhYmxlTGFiZWwsIGZhbHNlLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIENvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nKENvbXBvc2l0ZSBwYXJlbnQsIElQYXRoIHJlc291cmNlTG9jYXRpb24sIFN0cmluZyBzdHJpbmdUYWJsZUxhYmVsLCBib29sZWFuIHVzZUdyb3VwLCBib29sZWFuIHNob3dMb2NUZXh0KSB7Ci0JCXRoaXMucmVzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0JCXRhYmxlTGFiZWwgPSBzdHJpbmdUYWJsZUxhYmVsOwotCQl0aGlzLnVzZUdyb3VwID0gdXNlR3JvdXA7Ci0JCXNob3dMb2NhdGlvblRleHQgPSBzaG93TG9jVGV4dDsKLQotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlpZiAod2lkdGhIaW50ICE9IC0xKSB7Ci0JCQlnZC53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7Ci0JCX0KLQkJaWYgKGhlaWdodEhpbnQgIT0gLTEpIHsKLQkJCWdkLmhlaWdodEhpbnQgPSBoZWlnaHRIaW50OwotCQl9Ci0KLQkJLy8gU2V0IEdyaWREYXRhIGFuZCBHcmlkTGF5b3V0IGZvciB0aGUgcGFyZW50IENvbXBvc2l0ZQotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSB0b3AgQ29tcG9zaXRlCi0JCXRvcENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIHRvcERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJdG9wRGF0YS5oZWlnaHRIaW50ID0gMDsKLQkJdG9wQ29tcG9zaXRlLnNldExheW91dERhdGEodG9wRGF0YSk7Ci0JCXRvcENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSAnY29tbW9uJy9taWRkbGUgQ29tcG9zaXRlCi0JCWlmICh1c2VHcm91cCkgewotCQkJY29tbW9uQ29tcG9zaXRlID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQl9Ci0JCWVsc2UgewotCQkJY29tbW9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJfQotCQljb21tb25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNvbW1vbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQotCQkvLyBBZGQgdGhlIGVycm9yIE1lc3NhZ2UgTGFiZWwKLQkJZXJyb3JNZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWVycm9yTWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoY3JlYXRlSG9yaXpvbnRhbEZpbGwoKSk7Ci0JCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGVycm9yTWVzc2FnZUxhYmVsLmdldERpc3BsYXkoKSwgMjAwLCAwLCAwKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0KLQkJY3JlYXRlQ29udHJvbEFyZWEoKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChlLndpZGdldCA9PSBuZXdCdXR0b24pIHsKLQkJCQkJcGVyZm9ybU5ldygpOwotCQkJCX0KLQkJCQllbHNlIGlmIChlLndpZGdldCA9PSBlZGl0QnV0dG9uKSB7Ci0JCQkJCXBlcmZvcm1FZGl0KCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGUud2lkZ2V0ID09IGRlbGV0ZUJ1dHRvbikgewotCQkJCQlwZXJmb3JtRGVsZXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB0byBob2xkIHRoZSB0aHJlZSBidXR0b25zCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShjcmVhdGVIb3Jpem9udGFsRmlsbCgpKTsKLQkJR3JpZExheW91dCBidXR0b25HcmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJLy8gYnV0dG9uR3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJLy8gYnV0dG9uR3JpZExheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGJ1dHRvbkdyaWRMYXlvdXQpOwotCi0JCS8vIGFkZCB0aGUgTmV3IGJ1dHRvbgotCQkvLwotCQluZXdCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkvLyBuZXdCdXR0b24uc2V0VGV4dCgiICIgKwotCQkvLyBYTUxDb21tb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygiX1VJX0JVVFRPTl9ORVciKSArICIgIik7Ci0JCW5ld0J1dHRvbi5zZXRUZXh0KCIgICAiICsgWE1MVUlNZXNzYWdlcy5Db21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZ18wICsgIiAgICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCW5ld0J1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsgLy8gVmlld1V0aWxpdHkuY3JlYXRlSG9yaXpvbnRhbEZpbGwoKSk7Ci0JCW5ld0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJLy8gYWRkIHRoZSBFZGl0IGJ1dHRvbgotCQkvLwotCQkvLyBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkvLyBnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gZ2QuRklMTDsKLQkJLy8gZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0KLQkJZWRpdEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWVkaXRCdXR0b24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9CVVRUT05fRURJVCk7Ci0JCWVkaXRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7IC8vIFZpZXdVdGlsaXR5LmNyZWF0ZUhvcml6b250YWxGaWxsKCkpOwotCQllZGl0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQkvLyBhZGQgdGhlIERlbGV0ZSBidXR0b24KLQkJLy8KLQkJLy8gZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJLy8gZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IGdkLkZJTEw7Ci0JCS8vIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCi0JCWRlbGV0ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWRlbGV0ZUJ1dHRvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0JVVFRPTl9ERUxFVEUpOwotCQlkZWxldGVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7IC8vIFZpZXdVdGlsaXR5LmNyZWF0ZUhvcml6b250YWxGaWxsKCkpOwotCQlkZWxldGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250cm9sQXJlYSgpIHsKLQkJaWYgKHVzZUdyb3VwKSB7Ci0JCQkoKEdyb3VwKSBjb21tb25Db21wb3NpdGUpLnNldFRleHQodGFibGVMYWJlbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21tb25Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQodGFibGVMYWJlbCk7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGNyZWF0ZUdyaWREYXRhKGZhbHNlLCAzKSk7Ci0JCX0KLQotCQl0YWJsZVZpZXdlciA9IG5ldyBDb21tb25OYW1lc3BhY2VJbmZvVGFibGUoY29tbW9uQ29tcG9zaXRlLCA2LCBzaG93TG9jYXRpb25UZXh0KTsKLQkJdGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoY3JlYXRlR3JpZERhdGEodHJ1ZSwgMikpOwotCQljcmVhdGVCdXR0b25zKGNvbW1vbkNvbXBvc2l0ZSk7Ci0KLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQobmFtZXNwYWNlSW5mb0xpc3QpOwotCQl1cGRhdGVCdXR0b25FbmFibGVkU3RhdGUoKTsKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlQnV0dG9uRW5hYmxlZFN0YXRlKCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCBHcmlkRGF0YSBjcmVhdGVHcmlkRGF0YShib29sZWFuIGJvdGgsIGludCBzcGFuKSB7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKGJvdGggPyBHcmlkRGF0YS5GSUxMX0JPVEggOiBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXJldHVybiBnZDsKLQl9Ci0KLQlwcml2YXRlIEdyaWREYXRhIGNyZWF0ZUhvcml6b250YWxGaWxsKCkgewotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXJldHVybiBnZDsKLQl9Ci0KLQotCi0JcHVibGljIE5hbWVzcGFjZUluZm8gZ2V0TmFtZXNwYWNlSW5mbyhTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCU5hbWVzcGFjZUluZm8gcmVzdWx0ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpID0gbmFtZXNwYWNlSW5mb0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0JCQlpZiAoKGluZm8udXJpICE9IG51bGwpICYmIGluZm8udXJpLmVxdWFscyhuYW1lc3BhY2UpKSB7Ci0JCQkJcmVzdWx0ID0gaW5mbzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0KLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gZXMgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCUl0ZXJhdG9yIGkgPSBlcy5pdGVyYXRvcigpOwotCQkJaWYgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJcmVzdWx0ID0gaS5uZXh0KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIFVzZSB0aGUgcmV0dXJuZWQgQ29tcG9zaXRlIHRvIGFkZCBjb250ZW50IGFib3ZlIHRoZSAnY29tbW9uIGNvbnRlbnRzJy4KLQkgKiBOb3RlOiBUaGUgR3JpZERhdGEgZm9yIHRoZSByZXR1cm5lZCBDb21wb3NpdGUgaGFzIGEgaGVpZ2h0SGludCA9IDAuCi0JICogVGhpcyBtZWFucyB3aGVuIHVzaW5nIHRoZSByZXR1cm5lZCBDb21wb3NpdGUsIHRoZSBHcmlkRGF0YSBtdXN0IGJlCi0JICogcmVzZXQsIGVsc2UgdGhlIENvbXBvc2l0ZSBhbmQgaXQncyBjb250ZW50cyB3aWxsIG5vdCBhcHBlYXIuCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBnZXRUb3BDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB0b3BDb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXROYW1lc3BhY2VJbmZvRGlhbG9nIGludm9rZURpYWxvZyhTdHJpbmcgdGl0bGUsIE5hbWVzcGFjZUluZm8gaW5mbykgewotCQlTaGVsbCBzaGVsbCA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJRWRpdE5hbWVzcGFjZUluZm9EaWFsb2cgZGlhbG9nID0gbmV3IEVkaXROYW1lc3BhY2VJbmZvRGlhbG9nKHNoZWxsLCBpbmZvKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cuc2V0UmVzb3VyY2VMb2NhdGlvbihyZXNvdXJjZUxvY2F0aW9uKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuIGRpYWxvZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVsYXllZFVwZGF0ZSgpIHsKLQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkvKgotCQkgKiBSdW5uYWJsZSBkZWxheWVkVXBkYXRlID0gbmV3IFJ1bm5hYmxlKCkgeyBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCSAqIHRhYmxlVmlld2VyLnJlZnJlc2goKTsgfSB9OwotCQkgKiBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoZGVsYXllZFVwZGF0ZSk7Ci0JCSAqLwotCQkvLyBpZiAodXBkYXRlTGlzdGVuZXIgIT0gbnVsbCkKLQkJLy8gewotCQkvLyB1cGRhdGVMaXN0ZW5lci51cGRhdGVPY2N1cmVkKHRoaXMsIG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJLy8gfQotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWxldGUoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJbmFtZXNwYWNlSW5mb0xpc3QucmVtb3ZlQWxsKHN0cnVjdHVyZWRTZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJdXBkYXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJCXBlcmZvcm1EZWxheWVkVXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRWRpdCgpIHsKLQkJT2JqZWN0IHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbih0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJaW52b2tlRGlhbG9nKFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX05FV19OQU1FU1BBQ0VfSU5GT1JNQVRJT04sIChOYW1lc3BhY2VJbmZvKSBzZWxlY3Rpb24pOwotCQkJdXBkYXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJCXBlcmZvcm1EZWxheWVkVXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtTmV3KCkgewotCQlTaGVsbCBzaGVsbCA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJQ29tbW9uQWRkTmFtZXNwYWNlc0RpYWxvZyBkaWFsb2cgPSBuZXcgQ29tbW9uQWRkTmFtZXNwYWNlc0RpYWxvZyhzaGVsbCwgWE1MVUlNZXNzYWdlcy5fVUlfQUREX05BTUVTUEFDRV9ERUNMQVJBVElPTlMsIHJlc291cmNlTG9jYXRpb24sIG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKTsKLQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQluYW1lc3BhY2VJbmZvTGlzdC5hZGRBbGwoZGlhbG9nLmdldE5hbWVzcGFjZUluZm9MaXN0KCkpOwotCQkJdXBkYXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJCXBlcmZvcm1EZWxheWVkVXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VJbmZvTGlzdChMaXN0IGxpc3QpIHsKLQkJbmFtZXNwYWNlSW5mb0xpc3QgPSBsaXN0OwotCQl0YWJsZVZpZXdlci5zZXRJbnB1dChuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlQnV0dG9uRW5hYmxlZFN0YXRlKCkgewotCQlPYmplY3Qgc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIHNlbGVjdGlvbjsKLQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGluZm8gIT0gbnVsbCk7Ci0JCWRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKChpbmZvICE9IG51bGwpICYmIChpbmZvLmdldFByb3BlcnR5KCJ1bnJlbW92YWJsZSIpID09IG51bGwpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUVycm9yTWVzc2FnZShMaXN0IG5hbWVzcGFjZUluZm9MaXN0KSB7Ci0JCU5hbWVzcGFjZUluZm9FcnJvckhlbHBlciBoZWxwZXIgPSBuZXcgTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyKCk7Ci0JCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBoZWxwZXIuY29tcHV0ZUVycm9yTWVzc2FnZShuYW1lc3BhY2VJbmZvTGlzdCwgbnVsbCk7Ci0JCWVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoZXJyb3JNZXNzYWdlICE9IG51bGwgPyBlcnJvck1lc3NhZ2UgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VQYXRoKElQYXRoIHBhdGgpIHsKLQkgIHJlc291cmNlTG9jYXRpb24gPSBwYXRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uRWRpdE5hbWVzcGFjZXNUYXJnZXRGaWVsZERpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNmQ4NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0vKgotICogVGhpcyBjbGFzcyBpcyBhbiBleHRlbnNpb24gb2YgQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2cuIFRoaXMgY2xhc3MgYWRkcwotICogdGhlIHRhcmdldCBuYW1lc3BhY2VzIGRpYWxvZyBmaWVsZC4KLSAqLwotcHVibGljIGNsYXNzIENvbW1vbkVkaXROYW1lc3BhY2VzVGFyZ2V0RmllbGREaWFsb2cgZXh0ZW5kcyBDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyB7Ci0KLQljbGFzcyBUYXJnZXROYW1lc3BhY2VNb2RpZnlMaXN0ZW5lciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlTdHJpbmcgb2xkVGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotCQkJdGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlRmllbGQuZ2V0VGV4dCgpOwotCQkJdXBkYXRlVGFyZ2V0TmFtZXNwYWNlQW5kTmFtZXNwYWNlSW5mbyhvbGRUYXJnZXROYW1lc3BhY2UsIHRhcmdldE5hbWVzcGFjZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLQlwcm90ZWN0ZWQgVGV4dCB0YXJnZXROYW1lc3BhY2VGaWVsZDsKLQotCXB1YmxpYyBDb21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nKENvbXBvc2l0ZSBwYXJlbnQsIElQYXRoIHJlc291cmNlTG9jYXRpb24xKSB7Ci0JCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VMb2NhdGlvbjEsIFhNTFVJTWVzc2FnZXMuX1VJX05BTUVTUEFDRV9ERUNMQVJBVElPTlMpOwotCi0JCUNvbXBvc2l0ZSB0YXJnZXRDb21wID0gZ2V0VG9wQ29tcG9zaXRlKCk7Ci0JCXRhcmdldENvbXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJTGFiZWwgdGFyZ2V0TmFtZXNwYWNlTGFiZWwgPSBuZXcgTGFiZWwodGFyZ2V0Q29tcCwgU1dULk5PTkUpOwotCQl0YXJnZXROYW1lc3BhY2VMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdGFyZ2V0TmFtZXNwYWNlTGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9UQVJHRVRfTkFNRVNQQUNFKTsKLQotCQl0YXJnZXROYW1lc3BhY2VGaWVsZCA9IG5ldyBUZXh0KHRhcmdldENvbXAsIFNXVC5CT1JERVIpOwotCQl0YXJnZXROYW1lc3BhY2VGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdGFyZ2V0TmFtZXNwYWNlRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IFRhcmdldE5hbWVzcGFjZU1vZGlmeUxpc3RlbmVyKCkpOwotCi0JCS8vIGNyZWF0ZUNvbnRyb2xBcmVhKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUVkaXQoKSB7Ci0JCU9iamVjdCBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24odGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gZWRpdFRhcmdldE5hbWVzcGFjZSA9IGZhbHNlOwotCQkJTmFtZXNwYWNlSW5mbyBuc0luZm8gPSAoTmFtZXNwYWNlSW5mbykgc2VsZWN0aW9uOwotCQkJaWYgKGdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyhuc0luZm8udXJpKSkgewotCQkJCWVkaXRUYXJnZXROYW1lc3BhY2UgPSB0cnVlOwotCQkJfQotCi0JCQlpbnZva2VEaWFsb2coWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfTkVXX05BTUVTUEFDRV9JTkZPUk1BVElPTiwgbnNJbmZvKTsKLQkJCXVwZGF0ZUVycm9yTWVzc2FnZShuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCQlwZXJmb3JtRGVsYXllZFVwZGF0ZSgpOwotCi0JCQlpZiAoZWRpdFRhcmdldE5hbWVzcGFjZSkgewotCQkJCXRhcmdldE5hbWVzcGFjZUZpZWxkLnNldFRleHQobnNJbmZvLnVyaSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHRoZVRhcmdldE5hbWVzcGFjZSkgewotCQl0YXJnZXROYW1lc3BhY2UgPSB0aGVUYXJnZXROYW1lc3BhY2UgIT0gbnVsbCA/IHRoZVRhcmdldE5hbWVzcGFjZSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCXRhcmdldE5hbWVzcGFjZUZpZWxkLnNldFRleHQodGFyZ2V0TmFtZXNwYWNlKTsKLQkJLy8gdXBkYXRlVGFyZ2V0TmFtZXNwYWNlQW5kTmFtZXNwYWNlSW5mbyh0YXJnZXROYW1lc3BhY2UpOwotCX0KLQotCXZvaWQgdXBkYXRlVGFyZ2V0TmFtZXNwYWNlQW5kTmFtZXNwYWNlSW5mbyhTdHJpbmcgb2xkVGFyZ2V0TmFtZXNwYWNlLCBTdHJpbmcgbmV3VGFyZ2V0TmFtZXNwYWNlKSB7Ci0JCU5hbWVzcGFjZUluZm8gaW5mbyA9IGdldE5hbWVzcGFjZUluZm8obmV3VGFyZ2V0TmFtZXNwYWNlKTsKLQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJaW5mbyA9IGdldE5hbWVzcGFjZUluZm8ob2xkVGFyZ2V0TmFtZXNwYWNlKTsKLQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQlpbmZvID0gbmV3IE5hbWVzcGFjZUluZm8obmV3VGFyZ2V0TmFtZXNwYWNlLCAidG5zIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQluYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbmZvLnVyaSA9IHRhcmdldE5hbWVzcGFjZTsKLQkJCX0KLQkJfQotCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25OYW1lc3BhY2VJbmZvVGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MTYyZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25OYW1lc3BhY2VJbmZvVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5uc2VkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlIGV4dGVuZHMgVGFibGVWaWV3ZXIgewotCi0JLyoqCi0JICogTmFtZXNwYWNlSW5mb1RhYmxlTGFiZWxQcm92aWRlcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyLCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCVZpZXdlciB2aWV3ZXI7Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJSW1hZ2UgcmVzdWx0ID0gbnVsbDsKLQkJCWludCBjb2x1bW5Db2RlID0gZ2V0Q29sdW1uQ29kZShjb2x1bW5JbmRleCk7Ci0JCQlpZiAoY29sdW1uQ29kZSA9PSBDT0xVTU5fTE9DQVRJT05fSElOVCkgewotCQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBvYmplY3Q7Ci0JCQkJaWYgKChpbmZvLmxvY2F0aW9uSGludCA9PSBudWxsKSB8fCBpbmZvLmxvY2F0aW9uSGludC50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIENvbW1lbnQgdGhpcyBvdXQgdW50aWwgd2Ugc29sdmUgdGhlIGFsaWdubWVudC8oc3BhY2UKLQkJCQkJLy8gZm9yIGltYWdlIGJlaW5nIGFsbG9jYXRlZAotCQkJCQkvLyB0byBwcmVmaXggY29sdW1uKSAuLi4uLi4KLQkJCQkJLy8gcmVzdWx0ID0KLQkJCQkJLy8gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9XQVJOSU5HX09CSik7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW4pIHsKLQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBvYmplY3Q7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJCWludCBjb2x1bW5Db2RlID0gZ2V0Q29sdW1uQ29kZShjb2x1bW4pOwotCQkJc3dpdGNoIChjb2x1bW5Db2RlKSB7Ci0JCQkJY2FzZSBDT0xVTU5fUFJFRklYIDogewotCQkJCQlyZXN1bHQgPSBpbmZvLnByZWZpeDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgQ09MVU1OX05BTUVTUEFDRV9VUkkgOiB7Ci0JCQkJCXJlc3VsdCA9IGluZm8udXJpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBDT0xVTU5fQ0hFQ0tCT1ggOiB7Ci0JCQkJCXJlc3VsdCA9ICIiOyAvLyBpbmZvLmxvY2F0aW9uSGludDsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBDT0xVTU5fTE9DQVRJT05fSElOVCA6IHsKLQkJCQkJcmVzdWx0ID0gaW5mby5sb2NhdGlvbkhpbnQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXJlc3VsdCA9IHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChyZXN1bHQuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJc3dpdGNoIChjb2x1bW5Db2RlKSB7Ci0JCQkJCWNhc2UgQ09MVU1OX1BSRUZJWCA6IHsKLQkJCQkJCXJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX05PX1BSRUZJWDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgQ09MVU1OX05BTUVTUEFDRV9VUkkgOiB7Ci0JCQkJCQlyZXN1bHQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9OT19OQU1FU1BBQ0VfTkFNRTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgdmlld2VyLmdldElucHV0KCk7Ci0JCQlyZXR1cm4gbGlzdCAhPSBudWxsID8gbGlzdC50b0FycmF5KCkgOiBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQkJfQotCX0KLQotCWNsYXNzIFRhYmxlSXRlbUNoZWNrZXIgZXh0ZW5kcyBNb3VzZUFkYXB0ZXIgewotCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IGdldFRhYmxlKCkuZ2V0SXRlbShuZXcgUG9pbnQoZS54LCBlLnkpKTsKLQkJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlbS5nZXREYXRhKCk7Ci0JCQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBvYmo7Ci0JCQkJCVRhYmxlQ29sdW1uIGNvbCA9IGdldFRhYmxlKCkuZ2V0Q29sdW1uKDApOwotCQkJCQlpZiAoZS54IDwgY29sLmdldFdpZHRoKCkpIC8vIGlmIHRoZSBwb2ludCBmYWxscyB3aXRoaW4KLQkJCQkJCQkJCQkJCS8vIHRoZQotCQkJCQkvLyBTZWxlY3QgY29sdW1uIHRoZW4gcGVyZm9ybQotCQkJCQkvLyBjaGVjay91bmNoZWNrCi0JCQkJCXsKLQkJCQkJCVN0cmluZyBjdXJyZW50U3RhdGUgPSAoU3RyaW5nKSBpbmZvLmdldFByb3BlcnR5KCJjaGVja2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY3VycmVudFN0YXRlIiArIGN1cnJlbnRTdGF0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmICgoY3VycmVudFN0YXRlID09IG51bGwpIHx8IGN1cnJlbnRTdGF0ZS5lcXVhbHMoImZhbHNlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXsKLQkJCQkJCQlpbmZvLnNldFByb3BlcnR5KCJjaGVja2VkIiwgInRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlpbmZvLnNldFByb3BlcnR5KCJjaGVja2VkIiwgImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQkJcmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0NIRUNLQk9YID0gMTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fTE9DQVRJT05fSElOVCA9IDQ7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX05BTUVTUEFDRV9VUkkgPSAyOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9QUkVGSVggPSAzOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUxfQ0hFQ0tCT1ggPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX0xPQ0FUSU9OX0hJTlQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9MT0NBVElPTl9ISU5UOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX05BTUVTUEFDRV9VUkkgPSBYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FU1BBQ0VfTkFNRTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9QUkVGSVggPSBYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9QUkVGSVg7Ci0JcHJvdGVjdGVkIExpc3QgY2hlY2tlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBwcm90ZWN0ZWQgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgaW50W10gY29sdW1uSW5kZXhNYXA7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0NoZWNrQm94ZXMgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBzaG93TG9jYXRpb25UZXh0ID0gZmFsc2U7Ci0KLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCXByb3RlY3RlZCBpbnQgdmlzaWJsZVJvd3MgPSAtMTsKLQotCXB1YmxpYyBDb21tb25OYW1lc3BhY2VJbmZvVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHZpc2libGVSb3dzKSB7Ci0JCXRoaXMocGFyZW50LCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSLCB2aXNpYmxlUm93cywgZmFsc2UpOwotCX0KLQotCS8vIHByb3RlY3RlZCBDZWxsRWRpdG9yIGdldENlbGxFZGl0b3IoaW50IGNvbHVtbikKLQkvLyB7Ci0JLy8gcmV0dXJuIChjb2x1bW4gPT0gQ09MVU1OX0NIRUNLQk9YKSA/IGNoZWNrQm94Q2VsbEVkaXRvciA6Ci0JLy8gdGV4dENlbGxFZGl0b3I7Ci0JLy8gfQotCi0JcHVibGljIENvbW1vbk5hbWVzcGFjZUluZm9UYWJsZShDb21wb3NpdGUgcGFyZW50LCBpbnQgdmlzaWJsZVJvd3MsIGJvb2xlYW4gc2hvd0xvY2F0aW9uVGV4dCkgewotCQl0aGlzKHBhcmVudCwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiwgdmlzaWJsZVJvd3MsIHNob3dMb2NhdGlvblRleHQpOwotCX0KLQotCXB1YmxpYyBDb21tb25OYW1lc3BhY2VJbmZvVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBpbnQgdmlzaWJsZVJvd3MpIHsKLQkJdGhpcyhwYXJlbnQsIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBzdHlsZSwgdmlzaWJsZVJvd3MsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgaW50IHZpc2libGVSb3dzLCBib29sZWFuIHNob3dMb2NhdGlvblRleHQpIHsKLQkJc3VwZXIobmV3IFRhYmxlKHBhcmVudCwgc3R5bGUpKTsKLQkJZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCXRoaXMuc2hvd0NoZWNrQm94ZXMgPSAoc3R5bGUgJiBTV1QuQ0hFQ0spICE9IDA7Ci0JCWNvbHVtbkluZGV4TWFwID0gY3JlYXRlQ29sdW1uSW5kZXhNYXAoKTsKLQkJdGhpcy5zaG93TG9jYXRpb25UZXh0ID0gc2hvd0xvY2F0aW9uVGV4dDsKLQotCQlQcm92aWRlciBwcm92aWRlciA9IG5ldyBQcm92aWRlcigpOwotCQlzZXRDb250ZW50UHJvdmlkZXIocHJvdmlkZXIpOwotCQlzZXRMYWJlbFByb3ZpZGVyKHByb3ZpZGVyKTsKLQotCQlTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzQXJyYXkgPSBjcmVhdGVDb2x1bW5Qcm9wZXJ0aWVzQXJyYXkoKTsKLQkJc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5Qcm9wZXJ0aWVzQXJyYXkpOwotCi0JCXRhYmxlID0gZ2V0VGFibGUoKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Qcm9wZXJ0aWVzQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgaSk7Ci0JCQlpZiAoKGNvbHVtblByb3BlcnRpZXNBcnJheVtpXSkuZXF1YWxzKExBQkVMX0xPQ0FUSU9OX0hJTlQpKSB7Ci0JCQkJaWYgKHNob3dMb2NhdGlvblRleHQpIHsKLQkJCQkJY29sdW1uLnNldFRleHQoY29sdW1uUHJvcGVydGllc0FycmF5W2ldKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIENvbW1lbnQgdGhpcyBvdXQgdW50aWwgd2Ugc29sdmUgdGhlIGFsaWdubWVudC8oc3BhY2UKLQkJCQkJLy8gZm9yIGltYWdlIGJlaW5nIGFsbG9jYXRlZAotCQkJCQkvLyB0byBwcmVmaXggY29sdW1uKSAuLi4uLi4KLQkJCQkJLy8gY29sdW1uLnNldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVFhURVhUKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY29sdW1uLnNldFRleHQoY29sdW1uUHJvcGVydGllc0FycmF5W2ldKTsKLQkJCX0KLQkJCWNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoZ2V0Q29sdW1uV2lkdGgoaSksIHRydWUpKTsKLQkJfQotCQl0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQl0aGlzLnZpc2libGVSb3dzID0gdmlzaWJsZVJvd3M7Ci0JCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgdmlzaWJsZVJvd3M7IGkrKykKLQkJLy8gewotCQkvLyBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJLy8gaXRlbS5zZXRUZXh0KCIjIyMjIyMjIik7Ci0JCS8vIH0KLQkJLy8gY2hlY2tCb3hDZWxsRWRpdG9yID0gbmV3IE5hbWVzcGFjZUluZm9DaGVja2JveENlbGxFZGl0b3IodGFibGUpOwotCQkvLyB0ZXh0Q2VsbEVkaXRvciA9IG5ldyBUZXh0Q2VsbEVkaXRvcih0YWJsZSk7Ci0KLQkJLyoKLQkJICogQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzID0gbmV3Ci0JCSAqIENlbGxFZGl0b3JbY29sdW1uUHJvcGVydGllc0FycmF5Lmxlbmd0aF07IGZvciAoaW50IGkgPSAwOyBpIDwKLQkJICogY29sdW1uUHJvcGVydGllc0FycmF5Lmxlbmd0aDsgaSsrKSB7IGNlbGxFZGl0b3JzW2ldID0KLQkJICogZ2V0Q2VsbEVkaXRvcihpKTsgfSBzZXRDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7Ci0JCSAqLwotCQkvLyBpZiAoc2hvd0NoZWNrQm94ZXMpCi0JCS8vIHsKLQkJLy8gZ2V0VGFibGUoKS5hZGRNb3VzZUxpc3RlbmVyKG5ldyBUYWJsZUl0ZW1DaGVja2VyKCkpOwotCQkvLyB9Ci0JfQotCi0JLy8gcHJvdGVjdGVkIENlbGxFZGl0b3IgY2hlY2tCb3hDZWxsRWRpdG9yOwotCS8vIHByb3RlY3RlZCBDZWxsRWRpdG9yIHRleHRDZWxsRWRpdG9yOwotCi0JcHJvdGVjdGVkIGludFtdIGNyZWF0ZUNvbHVtbkluZGV4TWFwKCkgewotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W3Nob3dDaGVja0JveGVzID8gNCA6IDNdOwotCQlpbnQgaSA9IDA7Ci0JCWlmIChzaG93Q2hlY2tCb3hlcykgewotCQkJcmVzdWx0W2krK10gPSBDT0xVTU5fQ0hFQ0tCT1g7Ci0JCX0KLQkJcmVzdWx0W2krK10gPSBDT0xVTU5fUFJFRklYOwotCQlyZXN1bHRbaSsrXSA9IENPTFVNTl9OQU1FU1BBQ0VfVVJJOwotCQlpZiAoIXNob3dDaGVja0JveGVzKSB7Ci0JCQlyZXN1bHRbaSsrXSA9IENPTFVNTl9MT0NBVElPTl9ISU5UOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGNyZWF0ZUNvbHVtblByb3BlcnRpZXNBcnJheSgpIHsKLQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1szXTsKLQkJaW50IGkgPSAwOwotCQlpZiAoc2hvd0NoZWNrQm94ZXMpIHsKLQkJCXJlc3VsdFtpKytdID0gTEFCRUxfQ0hFQ0tCT1g7Ci0JCX0KLQkJcmVzdWx0W2krK10gPSBMQUJFTF9QUkVGSVg7Ci0JCXJlc3VsdFtpKytdID0gTEFCRUxfTkFNRVNQQUNFX1VSSTsKLQkJaWYgKCFzaG93Q2hlY2tCb3hlcykgewotCQkJcmVzdWx0W2krK10gPSBMQUJFTF9MT0NBVElPTl9ISU5UOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRDb2x1bW5Db2RlKGludCBjb2x1bW4pIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCWlmIChjb2x1bW4gPCBjb2x1bW5JbmRleE1hcC5sZW5ndGgpIHsKLQkJCXJlc3VsdCA9IGNvbHVtbkluZGV4TWFwW2NvbHVtbl07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldENvbHVtbldpZHRoKGludCBjb2x1bW4pIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCXN3aXRjaCAoZ2V0Q29sdW1uQ29kZShjb2x1bW4pKSB7Ci0JCQljYXNlIENPTFVNTl9QUkVGSVggOiB7Ci0JCQkJcmVzdWx0ID0gNTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgQ09MVU1OX05BTUVTUEFDRV9VUkkgOiB7Ci0JCQkJLy8gU2l6ZSBjb2x1bW5zIGRpZmZlcmVudGx5IHdoZW4gbG9jYXRpb24gaGludCB0ZXh0IGxhYmVsIGlzCi0JCQkJLy8gZGlzcGxheWVkCi0JCQkJaWYgKHNob3dMb2NhdGlvblRleHQpIHsKLQkJCQkJcmVzdWx0ID0gMTA7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSAyMDsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIENPTFVNTl9DSEVDS0JPWCA6IHsKLQkJCQlyZXN1bHQgPSAxOyAvLyBpbmZvLmxvY2F0aW9uSGludDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgQ09MVU1OX0xPQ0FUSU9OX0hJTlQgOiB7Ci0JCQkJLy8gU2l6ZSBjb2x1bW5zIGRpZmZlcmVudGx5IHdoZW4gbG9jYXRpb24gaGludCB0ZXh0IGxhYmVsIGlzCi0JCQkJLy8gZGlzcGxheWVkCi0JCQkJaWYgKHNob3dMb2NhdGlvblRleHQpIHsKLQkJCQkJcmVzdWx0ID0gMTA7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSAyOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKgotCSAqIHByb3RlY3RlZCBjbGFzcyBOYW1lc3BhY2VJbmZvQ2VsbE1vZGlmaWVyIGltcGxlbWVudHMgSUNlbGxNb2RpZmllciB7Ci0JICogcHVibGljIE5hbWVzcGFjZUluZm9DZWxsTW9kaWZpZXIoKSB7IH0KLQkgKiAKLQkgKiBwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgeyBpZgotCSAqIChwcm9wZXJ0eS5lcXVhbHMoTEFCRUxfQ0hFQ0tCT1gpKSB7IHJldHVybiB0cnVlOyB9IGVsc2UgaWYKLQkgKiAocHJvcGVydHkuZXF1YWxzKExBQkVMX1BSRUZJWCkpIHsgcmV0dXJuIHRydWU7IH0gcmV0dXJuIGZhbHNlOyB9Ci0JICogCi0JICogcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7IGludCBjb2x1bW4gPQotCSAqIDA7IGlmIChwcm9wZXJ0eS5lcXVhbHMoTEFCRUxfQ0hFQ0tCT1gpKSB7IGNvbHVtbiA9IDA7IH0gZWxzZSBpZgotCSAqIChwcm9wZXJ0eS5lcXVhbHMoTEFCRUxfUFJFRklYKSkgeyBjb2x1bW4gPSAxOyB9IGVsc2UgaWYKLQkgKiAocHJvcGVydHkuZXF1YWxzKExBQkVMX05BTUVTUEFDRV9VUkkpKSB7IGNvbHVtbiA9IDI7IH0KLQkgKiAKLQkgKiAvL2lmIChlbGVtZW50IGluc3RhbmNlb2YgVGFibGVFbGVtZW50KSAvL3sgLy8gcmV0dXJuCi0JICogcHJvdmlkZXIuZ2V0Q29sdW1uVGV4dChlbGVtZW50LCBjb2x1bW4pOyAvL30gLy9lbHNlIC8veyAvLyByZXR1cm4gbnVsbDsgLy8gfQotCSAqIHJldHVybiAiaGVsbG8iOyB9Ci0JICogCi0JICogcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgeyB9IH0KLQkgKiAKLQkgKiBwcm90ZWN0ZWQgY2xhc3MgTmFtZXNwYWNlSW5mb0NoZWNrYm94Q2VsbEVkaXRvciBleHRlbmRzCi0JICogQ2hlY2tib3hDZWxsRWRpdG9yIGltcGxlbWVudHMgTW91c2VMaXN0ZW5lciB7IHB1YmxpYwotCSAqIE5hbWVzcGFjZUluZm9DaGVja2JveENlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgeyBzdXBlcihwYXJlbnQpOyB9Ci0JICogCi0JICogcHJvdGVjdGVkIHZvaWQgZG9TZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsgfQotCSAqIAotCSAqIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgeyBzdXBlci5hY3RpdmF0ZSgpOyBkZWFjdGl2YXRlKCk7Ci0JICogRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Rm9jdXNDb250cm9sKCkucmVkcmF3KCk7IH0KLQkgKiAKLQkgKiBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7IGlmIChnZXRUYWJsZSgpLmdldEl0ZW0obmV3Ci0JICogUG9pbnQoZS54LCBlLnkpKSAhPSBudWxsKSB7IH0gfSBwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQKLQkgKiBlKSB7IH0gcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsgfSB9Ci0JICovCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODcwNjMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEVtcHR5RmlsZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZVNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZV8wOyAKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKLQkJLy8gc29tZSB0aGVtZXMgb24gR1RLIGhhdmUgZGlmZmVyZW50IGJhY2tncm91bmQgY29sb3JzIGZvciBUZXh0IGFuZCBMYWJlbHMKLQkJdGV4dC5zZXRCYWNrZ3JvdW5kKGNvbXBvc2l0ZS5nZXRCYWNrZ3JvdW5kKCkpOwotCQl0ZXh0LnNldFRleHQoZGVzY3JpcHRpb24pOwotCi0JCXNldFNpemUoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVTY3JvbGxlZENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBzY3JvbGxiYXJzIGZvciB0aGlzIHBhcmVudCB3aGVuIG5lZWRlZAotCQlmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzYzEgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50LCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQlzYzEuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUoc2MxLCAxKTsKLQkJc2MxLnNldENvbnRlbnQoY29tcG9zaXRlKTsKLQotCQkvLyBub3QgY2FsbGluZyBzZXRTaXplIGZvciBjb21wb3NpdGUgd2lsbCByZXN1bHQgaW4gYSBibGFuayBjb21wb3NpdGUsCi0JCS8vIHNvIGNhbGxpbmcgaXQgaGVyZSBpbml0aWFsbHkKLQkJLy8gc2V0U2l6ZSBhY3R1YWxseSBuZWVkcyB0byBiZSBjYWxsZWQgYWZ0ZXIgYWxsIGNvbnRyb2xzIGFyZSBjcmVhdGVkLAotCQkvLyBzbyBzY3JvbGxlZENvbXBvc2l0ZQotCQkvLyBoYXMgY29ycmVjdCBtaW5TaXplCi0JCXNldFNpemUoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpZiAoY29tcG9zaXRlICE9IG51bGwpIHsKLQkJCS8vIE5vdGU6IFRoZSBmb250IGlzIHNldCBoZXJlIGluIGFudGljaXBhdGlvbiB0aGF0IHRoZSBjbGFzcyBpbmhlcml0aW5nCi0JCQkvLyAgICAgICB0aGlzIGJhc2UgY2xhc3MgbWF5IGFkZCB3aWRnZXRzIHRvIHRoZSBkaWFsb2cuICAgc2V0U2l6ZQotCQkJLy8gICAgICAgaXMgYXNzdW1lZCB0byBiZSBjYWxsZWQganVzdCBiZWZvcmUgd2UgZ28gbGl2ZS4KLQkJCWFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQkJUG9pbnQgbWluU2l6ZSA9IGNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJY29tcG9zaXRlLnNldFNpemUobWluU2l6ZSk7Ci0JCQkvLyBzZXQgc2Nyb2xsYmFyIGNvbXBvc2l0ZSdzIG1pbiBzaXplIHNvIHBhZ2UgaXMgZXhwYW5kYWJsZSBidXQKLQkJCS8vIGhhcyBzY3JvbGxiYXJzIHdoZW4gbmVlZGVkCi0JCQlpZiAoY29tcG9zaXRlLmdldFBhcmVudCgpIGluc3RhbmNlb2YgU2Nyb2xsZWRDb21wb3NpdGUpIHsKLQkJCQlTY3JvbGxlZENvbXBvc2l0ZSBzYzEgPSAoU2Nyb2xsZWRDb21wb3NpdGUpIGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLQkJCQlzYzEuc2V0TWluU2l6ZShtaW5TaXplKTsKLQkJCQlzYzEuc2V0RXhwYW5kSG9yaXpvbnRhbCh0cnVlKTsKLQkJCQlzYzEuc2V0RXhwYW5kVmVydGljYWwodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRW5jb2RpbmdTZXR0aW5ncy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0VuY29kaW5nU2V0dGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJiYmQ1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRW5jb2RpbmdTZXR0aW5ncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25DaGFyc2V0TmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0vKioKLSAqIEVuY29kaW5nU2V0dGluZ3MgaXMgYSBjb21wb3NpdGUgdGhhdCBjYW4gYmUgdXNlZCB0byBkaXNwbGF5IHRoZSBzZXQgb2YKLSAqIGVuY29kaW5nIHZhbHVlcyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIHVzZXIuIFRoZSBsaXN0IG9mIGVuY29kaW5nIHZhbHVlcwotICogaXMgYmFzZWQgb2ZmIHRoZSBTdXBwb3J0ZWRKYXZhRW5jb2RpbmcgY2xhc3MuIEFzIHRoZSB1c2VyIHNlbGVjdHMgYW4KLSAqIGVuY29kaW5nIGZyb20gdGhlIGNvbWJvIGJveCwgdGhlIHJlYWRvbmx5IGZpZWxkIGJlbG93IGl0IGNoYW5nZXMgdG8gc2hvdwotICogdGhlIElBTkEgdGFnIGZvciB0aGF0IHBhcnRpY3VsYXIgZW5jb2RpbmcgZGVzY3JpcHRpb24uIFRoZSBsYWJlbHMgZm9yIHRoZQotICogd2lkZ2V0cyBhcmUgY29uZmlndXJhYmxlIGFuZCB0aGUgaW5pdGlhbCB2YWx1ZSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyIGNhbgotICogYmUgc2V0IHVzaW5nIHRoZSBzZXRJQU5BVGFnKCkuIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZW50cnkncyBJQU5BIHRhZyBjYW4KLSAqIGJlIHJldHJpZXZlZCB3aXRoIGdldElBTkFUYWcoKS4gRW50cmllcyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgY2FuIGJlIGFkZGVkCi0gKiBhbmQgcmVtb3ZlZC4KLSAqLwotcHVibGljIGNsYXNzIEVuY29kaW5nU2V0dGluZ3MgZXh0ZW5kcyBDb21wb3NpdGUgewotCi0JcHJpdmF0ZSBjbGFzcyBDb21ib0xpc3RlbmVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCWludCBpID0gZW5jb2RpbmdDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJaWYgKChpID49IDApICYmIChpIDwgaWFuYVZlY3Rvci5zaXplKCkpKSB7Ci0JCQkJaWFuYVRleHQuc2V0VGV4dCgoU3RyaW5nKSAoaWFuYVZlY3Rvci5lbGVtZW50QXQoZW5jb2RpbmdDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEVOQ09ESU5HX0xBQkVMID0gWE1MVUlNZXNzYWdlcy5FbmNvZGluZ1NldHRpbmdzXzE7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSUFOQV9MQUJFTCA9IFhNTFVJTWVzc2FnZXMuRW5jb2RpbmdTZXR0aW5nc18wOwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBjb21ib0xpc3RlbmVyID0gbmV3IENvbWJvTGlzdGVuZXIoKTsKLQlwcm90ZWN0ZWQgQ29tYm8gZW5jb2RpbmdDb21ibzsKLQlwcm90ZWN0ZWQgTGFiZWwgZW5jb2RpbmdMYWJlbCwgaWFuYUxhYmVsOwotCXByb3RlY3RlZCBUZXh0IGlhbmFUZXh0OwotCXByb3RlY3RlZCBWZWN0b3IgaWFuYVZlY3RvcjsKLQotCS8qKgotCSAqIE1ldGhvZCBFbmNvZGluZ1NldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgRW5jb2RpbmdTZXR0aW5ncyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQlpbml0KElBTkFfTEFCRUwsIEVOQ09ESU5HX0xBQkVMKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgRW5jb2RpbmdTZXR0aW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGVuY29kaW5nTGFiZWwgLQotCSAqICAgICAgICAgICAgdGV4dCBsYWJlbCB0byB1c2UgYmVzaWRlIHRoZSBsb2NhbGUgc2Vuc2l0aXZlIGRlc2NyaXB0aW9uIG9mCi0JICogICAgICAgICAgICB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGVuY29kaW5nCi0JICovCi0JcHVibGljIEVuY29kaW5nU2V0dGluZ3MoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGVuY29kaW5nTGFiZWwpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWluaXQoSUFOQV9MQUJFTCwgZW5jb2RpbmdMYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIEVuY29kaW5nU2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBpYW5hTGFiZWwgPQotCSAqICAgICAgICAgICAgdGV4dCBsYWJlbCB0byB1c2UgYmVzaWRlIHRoZSBkaXNwbGF5IG9ubHkgSUFOQSBmaWVsZAotCSAqIEBwYXJhbSBlbmNvZGluZ0xhYmVsIC0KLQkgKiAgICAgICAgICAgIHRleHQgbGFiZWwgdG8gdXNlIGJlc2lkZSB0aGUgbG9jYWxlIHNlbnNpdGl2ZSBkZXNjcmlwdGlvbiBvZgotCSAqICAgICAgICAgICAgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbmNvZGluZwotCSAqLwotCXB1YmxpYyBFbmNvZGluZ1NldHRpbmdzKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBpYW5hTGFiZWwsIFN0cmluZyBlbmNvZGluZ0xhYmVsKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQlpbml0KGlhbmFMYWJlbCwgZW5jb2RpbmdMYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGFkZEVudHJ5LiBBZGQgYW4gZW50cnkgdG8gdGhlIGVuZCBvZiB0aGUgRW5jb2RpbmcgQ29tYm9ib3gKLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gLQotCSAqICAgICAgICAgICAgZW5jb2RpbmcgZGVzY3JpcHRpb24gdG8gZGlzcGxheQotCSAqIEBwYXJhbSBpYW5hVGFnIC0KLQkgKiAgICAgICAgICAgIElBTkEgdGFnIGZvciB0aGUgZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbnRyeShTdHJpbmcgZGVzY3JpcHRpb24sIFN0cmluZyBpYW5hVGFnKSB7Ci0JCWVuY29kaW5nQ29tYm8uYWRkKGRlc2NyaXB0aW9uKTsKLQkJaWFuYVZlY3Rvci5hZGQoaWFuYVRhZyk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGFkZEVudHJ5LiBBZGQgYW4gZW50cnkgdG8gdGhlIEVuY29kaW5nIENvbWJvYm94IGF0IGluZGV4IGluZGV4Ci0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIC0KLQkgKiAgICAgICAgICAgIGVuY29kaW5nIGRlc2NyaXB0aW9uIHRvIGRpc3BsYXkKLQkgKiBAcGFyYW0gaWFuYVRhZyAtCi0JICogICAgICAgICAgICBJQU5BIHRhZyBmb3IgdGhlIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGluZGV4IC0KLQkgKiAgICAgICAgICAgIGluZGV4IGludG8gdGhlIGNvbWJvIHRvIGFkZCB0bwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVudHJ5KFN0cmluZyBkZXNjcmlwdGlvbiwgU3RyaW5nIGlhbmFUYWcsIGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPT0gaWFuYVZlY3Rvci5zaXplKCkpIHsKLQkJCS8vIGp1c3QgYWRkIHRvIHRoZSBlbmQKLQkJCWFkZEVudHJ5KGRlc2NyaXB0aW9uLCBpYW5hVGFnKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICgoMCA8PSBpbmRleCkgJiYgKGluZGV4IDwgaWFuYVZlY3Rvci5zaXplKCkpKSB7Ci0JCQllbmNvZGluZ0NvbWJvLmFkZChkZXNjcmlwdGlvbiwgaW5kZXgpOwotCQkJaWFuYVZlY3Rvci5hZGQoaW5kZXgsIGlhbmFUYWcpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENvbWJvIGNyZWF0ZUNvbWJvQm94KENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gaXNSZWFkT25seSkgewotCQlpbnQgc3R5bGUgPSBpc1JlYWRPbmx5ID09IHRydWUgPyBTV1QuUkVBRF9PTkxZIDogU1dULkRST1BfRE9XTjsKLQotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIHN0eWxlKTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBIZWxwZXIgbWV0aG9kIGZvciBjcmVhdGluZyBsYWJlbHMuCi0JICovCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGgpIHsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlkYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQl0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZW5jb2RpbmdDb21iby5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb21ib0xpc3RlbmVyKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaWxsQ29tYm8oKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdbXSBpYW5hVGFncyA9IENvbW1vbkNoYXJzZXROYW1lcy5nZXRDb21tb25DaGFyc2V0TmFtZXMoKTsKLQkJCWludCB0b3RhbE51bSA9IGlhbmFUYWdzLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxOdW07IGkrKykgewotCQkJCVN0cmluZyBpYW5hID0gaWFuYVRhZ3NbaV07Ci0JCQkJU3RyaW5nIGVuYyA9IENvbW1vbkNoYXJzZXROYW1lcy5nZXREaXNwbGF5U3RyaW5nKGlhbmEpOwotCi0JCQkJaWYgKGVuYyAhPSBudWxsKSB7Ci0JCQkJCWVuY29kaW5nQ29tYm8uYWRkKGVuYyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiQ29tbW9uQ2hhcnNldE5hbWVzLmdldERpc3BsYXlTdHJpbmcoIiArIGlhbmEgKyAiKSByZXR1cm5lZCBudWxsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQllbmNvZGluZ0NvbWJvLmFkZChpYW5hKTsKLQkJCQl9Ci0JCQkJaWFuYVZlY3Rvci5hZGQoaWFuYSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJLy8gTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgIlJlc291cmNlIGV4Y2VwdGlvbiIsCi0JCQkvLyAiVW5hYmxlIHRvIG9idGFpbiBlbmNvZGluZyBzdHJpbmdzLiBDaGVjayByZXNvdXJjZSBmaWxlIik7Ci0JCQkvLyBYTUxFbmNvZGluZ1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZShlLnRvU3RyaW5nKCkpOwotCQkJLy8gWE1MRW5jb2RpbmdQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGVDdXJyZW50VGhyZWFkKCk7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkV4Y2VwdGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5nZXRFbmNvZGluZzwvY29kZT4gR2V0IHRoZSBkZXNjcmlwdGl2ZSBlbmNvZGluZyBuYW1lIHRoYXQgd2FzCi0JICogc2VsZWN0ZWQuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQlyZXR1cm4gZW5jb2RpbmdDb21iby5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldEVuY29kaW5nQ29tYm8uIFJldHVybnMgdGhlIGNvbWJvIHVzZWQgdG8gZGlzcGxheSB0aGUgZW5jb2RpbmcKLQkgKiBkZXNjcmlwdGlvbnMuCi0JICogCi0JICogQHJldHVybiBDb21ibwotCSAqLwotCXB1YmxpYyBDb21ibyBnZXRFbmNvZGluZ0NvbWJvKCkgewotCQlyZXR1cm4gZW5jb2RpbmdDb21ibzsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5nZXRJQU5BVGFnPC9jb2RlPiBHZXQgdGhlIElBTkEgdGFnIGVxdWl2YWxlbnQgb2YgdGhlIHNlbGVjdGVkCi0JICogZGVzY3JpcHRpdmUgZW5jb2RpbmcgbmFtZQotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJQU5BVGFnKCkgewotCQlpbnQgaSA9IGVuY29kaW5nQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGkgPj0gMCkgewotCQkJcmV0dXJuIChTdHJpbmcpIChpYW5hVmVjdG9yLmVsZW1lbnRBdChpKSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdChTdHJpbmcgaWFuYUxhYmVsU3RyLCBTdHJpbmcgZW5jb2RpbmdMYWJlbFN0cikgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZW5jb2RpbmdMYWJlbCA9IGNyZWF0ZUxhYmVsKHRoaXMsIGVuY29kaW5nTGFiZWxTdHIpOwotCQllbmNvZGluZ0NvbWJvID0gY3JlYXRlQ29tYm9Cb3godGhpcywgdHJ1ZSk7Ci0JCWlhbmFMYWJlbCA9IGNyZWF0ZUxhYmVsKHRoaXMsIGlhbmFMYWJlbFN0cik7Ci0JCWlhbmFUZXh0ID0gY3JlYXRlVGV4dEZpZWxkKHRoaXMsIDIwKTsKLQkJaWFuYVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLQotCQlmaWxsQ29tYm8oKTsKLQkJcmVzZXRUb0RlZmF1bHRFbmNvZGluZygpOwotCQllbmNvZGluZ0NvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKGNvbWJvTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmlzRW5jb2RpbmdJbkxpc3Q8L2NvZGU+IENoZWNrcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBuYW1lIGlzIGluCi0JICogdGhlIGNvbWJvCi0JICogCi0JICogQHBhcmFtIGVuYwotCSAqICAgICAgICAgICAgYSA8Y29kZT5zdHJpbmc8L2NvZGU+IHZhbHVlLiBUaGUgZW5jb2RpbmcgbmFtZS4KLQkgKiBAcmV0dXJuIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuIFRSVUUgaWYgZW5jb2RpbmcgaXMgaW4gbGlzdC4KLQkgKiAgICAgICAgIEZBTFNFIGlmIGVuY29kaW5nIGlzIG5vdCBpbiBsaXN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5jb2RpbmdJbkxpc3QoU3RyaW5nIGVuYykgewotCQlpbnQgaSA9IGVuY29kaW5nQ29tYm8uaW5kZXhPZihlbmMpOwotCQlpZiAoaSA+PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+aXNJQU5BVGFnSW5MaXN0PC9jb2RlPiBDaGVja3Mgd2hldGhlciB0aGUgSUFOQSB0YWcgaXMgaW4gdGhlCi0JICogY29tYm8KLQkgKiAKLQkgKiBAcGFyYW0gaWFuYVRhZwotCSAqICAgICAgICAgICAgYSA8Y29kZT5zdHJpbmc8L2NvZGU+IHZhbHVlLiBUaGUgSUFOQSB0YWcuCi0JICogQHJldHVybiBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLiBUUlVFIGlmIHRhZyBpcyBpbiBsaXN0LiBGQUxTRQotCSAqICAgICAgICAgaWYgdGFnIGlzIG5vdCBpbiBsaXN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSUFOQVRhZ0luTGlzdChTdHJpbmcgaWFuYVRhZykgewotCQlpbnQgaSA9IGlhbmFWZWN0b3IuaW5kZXhPZihpYW5hVGFnKTsKLQkJaWYgKGkgPj0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCByZW1vdmVFbnRyeS4gUmVtb3ZlcyBib3RoIHRoZSBkZXNjcmlwdGlvbiBhbmQgdGhlIElBTkEgdGFnIGF0Ci0JICogdGhlIHNwZWNpZmllZCBpbmRleAotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUVudHJ5KGludCBpbmRleCkgewotCQlpZiAoKDAgPD0gaW5kZXgpICYmIChpbmRleCA8IGlhbmFWZWN0b3Iuc2l6ZSgpKSkgewotCQkJZW5jb2RpbmdDb21iby5yZW1vdmUoaW5kZXgpOwotCQkJaWFuYVZlY3Rvci5yZW1vdmUoaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHJlc2V0VG9EZWZhdWx0RW5jb2RpbmcuIFJlc2V0IHRoZSBjb250cm9sIHRvIHRoZSBkZWZhdWx0Ci0JICogZW5jb2RpbmcuIEN1cnJlbnRseSBVVEYtOAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0VG9EZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCVN0cmluZyBkZWZhdWx0SUFOQVRhZyA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQkJaWFuYVRleHQuc2V0VGV4dChkZWZhdWx0SUFOQVRhZyk7Ci0JCXNldElBTkFUYWcoZGVmYXVsdElBTkFUYWcpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBzZXRFbmFibGVkLiBFbmFibGUvZGlzYWJsZSB0aGUgRW5jb2RpbmdTZXR0aW5ncyBjb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQllbmNvZGluZ0NvbWJvLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWVuY29kaW5nTGFiZWwuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJaWFuYUxhYmVsLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWlhbmFUZXh0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+c2V0RW5jb2Rpbmc8L2NvZGU+IFNldCB0aGUgc2VsZWN0aW9uIGluIHRoZSBjb21ibyB0byB0aGUKLQkgKiBkZXNjcmlwdGl2ZSBlbmNvZGluZyBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBlbmMKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+c3RyaW5nPC9jb2RlPiB2YWx1ZS4gTm90ZSB0aGlzIGlzIG5vdCB0aGUgSUFOQQotCSAqICAgICAgICAgICAgdGFnLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmMpIHsKLQkJZW5jb2RpbmdDb21iby5zZXRUZXh0KGVuYyk7Ci0JCWVuY29kaW5nQ29tYm8uc2VsZWN0KGVuY29kaW5nQ29tYm8uaW5kZXhPZihlbmMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5zZXRJQU5BVGFnPC9jb2RlPiBTZXQgdGhlIElBTkEgdGFnIGZvciB0aGUgY29tYm8KLQkgKiAKLQkgKiBAcGFyYW0gaWFuYVRhZwotCSAqICAgICAgICAgICAgYSA8Y29kZT5zdHJpbmc8L2NvZGU+IHZhbHVlLiBUaGUgSUFOQSB0YWcuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SUFOQVRhZyhTdHJpbmcgaWFuYVRhZykgewotCQlpbnQgaSA9IGlhbmFWZWN0b3IuaW5kZXhPZihpYW5hVGFnKTsKLQkJaWYgKGkgPj0gMCkgewotCQkJZW5jb2RpbmdDb21iby5zZWxlY3QoaSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Xb3JrYmVuY2hEZWZhdWx0RW5jb2RpbmdTZXR0aW5ncy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1dvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3OTMwZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1dvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25DaGFyc2V0TmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0vKioKLSAqIFdvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzIGlzIGFuIGV4dGVuc2lvbiBvZiBFbmNvZGluZ1NldHRpbmdzLiBUaGlzCi0gKiBjb21wb3NpdGUgY29udGFpbnMgRW5jb2RpbmdTZXR0aW5ncyBmb3IgdXNlcnMgdG8gc2VsZWN0IHRoZSBlbmNvZGluZyB0aGV5Ci0gKiBkZXNpcmUgYXMgd2VsbCBhcyBhIGNoZWNrYm94IGZvciB1c2VycyB0byBzZWxlY3QgdG8gdXNlIHRoZSBkZWZhdWx0Ci0gKiB3b3JrYmVuY2ggZW5jb2RpbmcgaW5zdGVhZC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkVuY29kaW5nU2V0dGluZ3MKLSAqLwotcHVibGljIGNsYXNzIFdvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBJTkRFTlQgPSAxNTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS0JFTkNIX0RFRkFVTFQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgRW5jb2RpbmdTZXR0aW5ncyBmRW5jb2RpbmdTZXR0aW5nczsKLQlwcml2YXRlIFN0cmluZyBmTm9uRGVmYXVsdElBTkEgPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIGZVc2VEZWZhdWx0QnV0dG9uOwotCi0JcHVibGljIFdvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNyZWF0ZUNvbnRyb2xzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRyb2xzKCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJQ29tcG9zaXRlIGRlZmF1bHRFbmNvZGluZ0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkZWZhdWx0RW5jb2RpbmdDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWRlZmF1bHRFbmNvZGluZ0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWZVc2VEZWZhdWx0QnV0dG9uID0gbmV3IEJ1dHRvbihkZWZhdWx0RW5jb2RpbmdDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZVc2VEZWZhdWx0QnV0dG9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5Xb3JrYmVuY2hEZWZhdWx0RW5jb2RpbmdTZXR0aW5nc18wKTsKLQotCQlmVXNlRGVmYXVsdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVVc2VEZWZhdWx0QnV0dG9uU2VsZWN0ZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZkVuY29kaW5nU2V0dGluZ3MgPSBuZXcgRW5jb2RpbmdTZXR0aW5ncyh0aGlzKTsKLQkJKChHcmlkTGF5b3V0KSBmRW5jb2RpbmdTZXR0aW5ncy5nZXRMYXlvdXQoKSkubWFyZ2luV2lkdGggPSAwOwotCQkoKEdyaWREYXRhKSBmRW5jb2RpbmdTZXR0aW5ncy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxJbmRlbnQgPSBJTkRFTlQ7Ci0KLQl9Ci0KLQlwcml2YXRlIENvbWJvIGdldEVuY29kaW5nQ29tYm8oKSB7Ci0JCXJldHVybiBmRW5jb2RpbmdTZXR0aW5ncy5nZXRFbmNvZGluZ0NvbWJvKCk7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+Z2V0SUFOQVRhZzwvY29kZT4gR2V0IHRoZSBJQU5BIHRhZyBlcXVpdmFsZW50IG9mIHRoZSBzZWxlY3RlZAotCSAqIGRlc2NyaXB0aXZlIGVuY29kaW5nIG5hbWUuIFJldHVybnMgZW1wdHkgc3RyaW5nIGlmIHVzaW5nIHdvcmtiZW5jaAotCSAqIGVuY29kaW5nLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJQU5BVGFnKCkgewotCQlpZiAoIWlzRGVmYXVsdCgpKSB7Ci0JCQlyZXR1cm4gZkVuY29kaW5nU2V0dGluZ3MuZ2V0SUFOQVRhZygpOwotCQl9Ci0JCXJldHVybiBXT1JLQkVOQ0hfREVGQVVMVDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRXb3JrYmVuY2hFbmNvZGluZygpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRFbmNvZGluZygpOwotCX0KLQotCXZvaWQgaGFuZGxlVXNlRGVmYXVsdEJ1dHRvblNlbGVjdGVkKCkgewotCQlpZiAoZlVzZURlZmF1bHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWZOb25EZWZhdWx0SUFOQSA9IGZFbmNvZGluZ1NldHRpbmdzLmdldElBTkFUYWcoKTsKLQkJCVN0cmluZyB3b3JrYmVuY2hWYWx1ZSA9IGdldFdvcmtiZW5jaEVuY29kaW5nKCk7Ci0JCQl3b3JrYmVuY2hWYWx1ZSA9IENvbW1vbkNoYXJzZXROYW1lcy5nZXRJYW5hUHJlZmVycmVkQ2hhcnNldE5hbWUod29ya2JlbmNoVmFsdWUpOwotCQkJZkVuY29kaW5nU2V0dGluZ3Muc2V0SUFOQVRhZyh3b3JrYmVuY2hWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAoZk5vbkRlZmF1bHRJQU5BICE9IG51bGwpIHsKLQkJCWZFbmNvZGluZ1NldHRpbmdzLnNldElBTkFUYWcoZk5vbkRlZmF1bHRJQU5BKTsKLQkJfQotCQlnZXRFbmNvZGluZ0NvbWJvKCkuc2V0RW5hYmxlZCghZlVzZURlZmF1bHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQlmRW5jb2RpbmdTZXR0aW5ncy5zZXRFbmFibGVkKCFmVXNlRGVmYXVsdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIGZVc2VEZWZhdWx0QnV0dG9uLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPnNldEVuY29kaW5nPC9jb2RlPiBTZXQgdGhlIHNlbGVjdGlvbiBpbiB0aGUgY29tYm8gdG8gdGhlCi0JICogZGVzY3JpcHRpdmUgZW5jb2RpbmcgbmFtZS4gU2VsZWN0cyB1c2Ugd29ya2JlbmNoIGVuY29kaW5nIGlmIGlhbmFUYWcgaXMKLQkgKiBudWxsIG9yIGVtcHR5IHN0cmluZy4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJQU5BVGFnKFN0cmluZyBpYW5hVGFnKSB7Ci0JCWlmICgoaWFuYVRhZyA9PSBudWxsKSB8fCBpYW5hVGFnLmVxdWFscyhXT1JLQkVOQ0hfREVGQVVMVCkpIHsKLQkJCWZVc2VEZWZhdWx0QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWhhbmRsZVVzZURlZmF1bHRCdXR0b25TZWxlY3RlZCgpOwotCQl9Ci0JCWVsc2UgewotCQkJZlVzZURlZmF1bHRCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWhhbmRsZVVzZURlZmF1bHRCdXR0b25TZWxlY3RlZCgpOwotCQkJaWYgKCFpc0RlZmF1bHQoKSkgewotCQkJCWZFbmNvZGluZ1NldHRpbmdzLnNldElBTkFUYWcoaWFuYVRhZyk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MQ29sb3JQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MQ29sb3JQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMjlkNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvbG9yUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgQmVuamFtaW4gTXVza2FsbGEsIGIubXVza2FsbGFAZ214Lm5ldCAtIFsxNTg2NjBdIGNoYXJhY3RlciBlbnRpdGllcyBzaG91bGQgaGF2ZSB0aGVpciBvd24gc3ludGF4IGhpZ2hsaWdodGluZyBwcmVmZXJlbmNlIAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0Q29sb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU3R5bGVkVGV4dENvbG9yUGlja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb2xvclBhZ2UgZXh0ZW5kcyBBYnN0cmFjdENvbG9yUGFnZSB7Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYWdlQ29tcG9uZW50ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCSgoR3JpZERhdGEpIHBhZ2VDb21wb25lbnQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOwotCi0JCXN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhZ2VDb21wb25lbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhZ2VDb21wb25lbnQsIElIZWxwQ29udGV4dElkcy5YTUxfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCk7Ci0JCXJldHVybiBwYWdlQ29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIFNldCB1cCBhbGwgdGhlIHN0eWxlIHByZWZlcmVuY2Uga2V5cyBpbiB0aGUgb3ZlcmxheSBzdG9yZQotCSAqLwotCXByb3RlY3RlZCBPdmVybGF5S2V5W10gY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpIHsKLQkJQXJyYXlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUFycmF5TGlzdCBzdHlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWluaXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQkJSXRlcmF0b3IgaSA9IHN0eWxlTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuU1RSSU5HLCAoU3RyaW5nKSBpLm5leHQoKSkpOwotCQl9Ci0KLQkJT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10ga2V5cyA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbb3ZlcmxheUtleXMuc2l6ZSgpXTsKLQkJb3ZlcmxheUtleXMudG9BcnJheShrZXlzKTsKLQkJcmV0dXJuIGtleXM7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTYW1wbGVUZXh0KCkgewotCQlyZXR1cm4gWE1MVUlNZXNzYWdlcy5TYW1wbGVfWE1MX2RvYzsgLy8gPSAiPD94bWwKLQkJLy8gdmVyc2lvbj1cIjEuMFwiPz5cbjw/Y3VzdG9tUHJvY2Vzc2luZ0luc3RydWN0aW9uXG5cdFhNTAotCQkvLyBwcm9jZXNzb3IKLQkJLy8gc3BlY2lmaWNcblx0Y29udGVudAotCQkvLyA/PlxuPCFET0NUWVBFCi0JCS8vIGNvbG9yc1xuXHRQVUJMSUMKLQkJLy8gXCIvL0lCTS9YTUwvQ09MT1JTL1wiCi0JCS8vIFwiY29sb3JzLmR0ZFwiPlxuPGNvbG9ycz5cblx0PCEtLQotCQkvLyBiZWdpbiBjb2xvciBkZWZpbml0aW9ucwotCQkvLyAtLT5cblx0PGNvbG9yCi0JCS8vIG5hbWU9XCJwbGFpbnRleHRcIgotCQkvLyBmb3JlZ3JvdW5kPVwiIzAwMDAwMFwiXG5cdFx0YmFja2dyb3VuZD1cIiNENEQwQzhcIi8+XG5cdDxjb2xvcgotCQkvLyBuYW1lPVwiYm9sZFwiCi0JCS8vIGZvcmVncm91bmQ9XCIjMDAwMDAwXCJcblx0XHRiYWNrZ3JvdW5kPVwiI0IzQUNBMFwiPlxuXHQ8IVtDREFUQVs8MTIzNDU2Nzg5Pl1dPlxuXHROb3JtYWwKLQkJLy8gdGV4dCBjb250ZW50LlxuXHQ8Y29sb3IKLQkJLy8gbmFtZT1cImludmVyc2VcIgotCQkvLyBmb3JlZ3JvdW5kPVwiI0YwRjBGMFwiXG5cdFx0YmFja2dyb3VuZD1cIiNENEQwQzhcIi8+XG5cbjwvY29sb3JzPlxuIjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29tbW9uQ29udGV4dFN0eWxlTWFwKERpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwKSB7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhULCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhUKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRUxFTUVOVF9ERUNMQVJBVElPTiwgSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9FTEVNRU5UX0RFQ0xfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UsIElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9QRV9SRUZFUkVOQ0UsIElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQsIElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbW1vbkRlc2NyaXB0aW9ucyhEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucykgewotCi0JCS8vIGNyZWF0ZSBkZXNjcmlwdGlvbnMgZm9yIGhpbGlnaHRpbmcgdHlwZXMKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIsIFhNTFVJTWVzc2FnZXMuQ29tbWVudF9EZWxpbWl0ZXJzX1VJXyk7IC8vID0KLQkJLy8gIkNvbW1lbnQKLQkJLy8gRGVsaW1pdGVycyIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhULCBYTUxVSU1lc3NhZ2VzLkNvbW1lbnRfQ29udGVudF9VSV8pOyAvLyA9Ci0JCS8vICJDb21tZW50Ci0JCS8vIENvbnRlbnQiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIsIFhNTFVJTWVzc2FnZXMuVGFnX0RlbGltaXRlcnNfVUlfKTsgLy8gPQotCQkvLyAiVGFnCi0JCS8vIERlbGltaXRlcnMiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FLCBYTUxVSU1lc3NhZ2VzLlRhZ19OYW1lc19VSV8pOyAvLyA9Ci0JCS8vICJUYWcKLQkJLy8gTmFtZXMiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSwgWE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfTmFtZXNfVUlfKTsgLy8gPQotCQkvLyAiQXR0cmlidXRlCi0JCS8vIE5hbWVzIgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLCBYTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9WYWx1ZXNfVUlfKTsgLy8gPQotCQkvLyAiQXR0cmlidXRlCi0JCS8vIFZhbHVlcyIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIsIFhNTFVJTWVzc2FnZXMuRGVjbGFyYXRpb25fRGVsaW1pdGVyc19VSV8pOyAvLyA9Ci0JCS8vICJEZWNsYXJhdGlvbgotCQkvLyBEZWxpbWl0ZXJzIgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCwgWE1MVUlNZXNzYWdlcy5Db250ZW50X1VJXyk7IC8vID0KLQkJLy8gIkNvbnRlbnQiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UsIFhNTFVJTWVzc2FnZXMuRW50aXR5X1JlZmVyZW5jZV9VSV8pOyAvLyROT04tTkxTLTEkID0gIkVudGl0eSBSZWZlcmVuY2VzIgotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDb21tb25TdHlsZUxpc3QoQXJyYXlMaXN0IGxpc3QpIHsKLQotCQkvLyBsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSKTsKLQkJLy8gbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQpOwotCQkvLyBsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSKTsKLQkJLy8gbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQpOwotCi0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGV4dFN0eWxlTWFwKERpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwKSB7Ci0KLQkJaW5pdENvbW1vbkNvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCQlpbml0RG9jVHlwZUNvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQsIElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUik7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9QSV9DT05URU5ULCBJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERlc2NyaXB0aW9ucyhEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucykgewotCi0JCWluaXRDb21tb25EZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQkJaW5pdERvY1R5cGVEZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLkNEQVRBX0RlbGltaXRlcnNfVUlfKTsgLy8gPQotCQkvLyAiQ0RBVEEKLQkJLy8gRGVsaW1pdGVycyIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCwgWE1MVUlNZXNzYWdlcy5DREFUQV9Db250ZW50X1VJXyk7IC8vID0KLQkJLy8gIkNEQVRBCi0JCS8vIENvbnRlbnQiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUiwgWE1MVUlNZXNzYWdlcy5Qcm9jZXNzaW5nX0luc3RydWN0aW9uX0RlbF9VSV8pOyAvLyA9Ci0JCS8vICJQcm9jZXNzaW5nCi0JCS8vIEluc3RydWN0aW9uCi0JCS8vIERlbGltaXRlcnMiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQsIFhNTFVJTWVzc2FnZXMuUHJvY2Vzc2luZ19JbnN0cnVjdGlvbl9Db25fVUlfX1VJXyk7IC8vID0KLQkJLy8gIlByb2Nlc3NpbmcKLQkJLy8gSW5zdHJ1Y3Rpb24KLQkJLy8gQ29udGVudCIKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RG9jVHlwZUNvbnRleHRTdHlsZU1hcChEaWN0aW9uYXJ5IGNvbnRleHRTdHlsZU1hcCkgewotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRUxFTUVOVF9ERUNMX05BTUUsIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04sIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTl9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUMsIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRiwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1RFTSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXREb2NUeXBlRGVzY3JpcHRpb25zKERpY3Rpb25hcnkgZGVzY3JpcHRpb25zKSB7Ci0KLQkJLy8gY3JlYXRlIGRlc2NyaXB0aW9ucyBmb3IgaGlsaWdodGluZyB0eXBlcyBmb3IgRE9DVFlQRSByZWxhdGVkIGl0ZW1zCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSwgWE1MVUlNZXNzYWdlcy5ET0NUWVBFX05hbWVfVUlfKTsgLy8gPQotCQkvLyAiRE9DVFlQRQotCQkvLyBOYW1lIgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lELCBYTUxVSU1lc3NhZ2VzLkRPQ1RZUEVfU1lTVEVNX1BVQkxJQ19LZXl3X1VJXyk7IC8vID0KLQkJLy8gIkRPQ1RZUEUKLQkJLy8gU1lTVEVNL1BVQkxJQwotCQkvLyBLZXl3b3JkIgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRiwgWE1MVUlNZXNzYWdlcy5ET0NUWVBFX1B1YmxpY19SZWZlcmVuY2VfVUlfKTsgLy8gPQotCQkvLyAiRE9DVFlQRQotCQkvLyBQdWJsaWMKLQkJLy8gUmVmZXJlbmNlIgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRiwgWE1MVUlNZXNzYWdlcy5ET0NUWVBFX1N5c3RlbV9SZWZlcmVuY2VfVUlfKTsgLy8gPQotCQkvLyAiRE9DVFlQRQotCQkvLyBTeXN0ZW0KLQkJLy8gUmVmZXJlbmNlIgotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXREb2NUeXBlU3R5bGVMaXN0KEFycmF5TGlzdCBsaXN0KSB7Ci0KLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0U3R5bGVMaXN0KEFycmF5TGlzdCBsaXN0KSB7Ci0JCWluaXRDb21tb25TdHlsZUxpc3QobGlzdCk7Ci0JCWluaXREb2NUeXBlU3R5bGVMaXN0KGxpc3QpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJLy8gcmVxdWlyZWQgc2luY2UgdGhlIHN1cGVyY2xhc3MgKnJlbW92ZXMqIGV4aXN0aW5nIHByZWZlcmVuY2VzIGJlZm9yZQotCQkvLyBzYXZpbmcgaXRzIG93bgotCQlzdXBlci5wZXJmb3JtT2soKTsKLQotCQlTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldHVwUGlja2VyKFN0eWxlZFRleHRDb2xvclBpY2tlciBwaWNrZXIpIHsKLQkJSU1vZGVsTWFuYWdlciBtbWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCXBpY2tlci5zZXRQYXJzZXIobW1hbmFnZXIuY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwpLmdldFBhcnNlcigpKTsKLQotCQlEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucyA9IG5ldyBIYXNodGFibGUoKTsKLQkJaW5pdERlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCi0JCURpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpbml0Q29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0KLQkJQXJyYXlMaXN0IHN0eWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW5pdFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCi0JCXBpY2tlci5zZXRDb250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQkJcGlja2VyLnNldERlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCQlwaWNrZXIuc2V0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0Q29sb3JQYWdlI3NhdmVQcmVmZXJlbmNlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgewotCQlYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTEZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmM2NjMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTEZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBbMjA1OTg5XSAtIFt2YWxpZGF0aW9uXSB2YWxpZGF0ZSBYTUwgYWZ0ZXIgWEluY2x1ZGUgcmVzb2x1dGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotCi1wdWJsaWMgY2xhc3MgWE1MRmlsZXNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZVBhZ2UgewotCXByb3RlY3RlZCBFbmNvZGluZ1NldHRpbmdzIGZFbmNvZGluZ1NldHRpbmdzID0gbnVsbDsKLQotCXByaXZhdGUgQ29tYm8gZkRlZmF1bHRTdWZmaXggPSBudWxsOwotCXByaXZhdGUgTGlzdCBmVmFsaWRFeHRlbnNpb25zID0gbnVsbDsKLQlwcml2YXRlIENvbWJvIGZJbmRpY2F0ZU5vR3JhbW1hciA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gZlVzZVhpbmNsdWRlID0gbnVsbDsKLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQgCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nW10gaXRlbXMpIHsKLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0JCWNvbWJvLnNldEl0ZW1zKGl0ZW1zKTsKLQotCQkvL0dyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIHRydWUpOwotCQljb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSUhlbHBDb250ZXh0SWRzLlhNTF9QUkVGV0VCWF9GSUxFU19IRUxQSUQpOwotCQljcmVhdGVDb250ZW50c0ZvckNyZWF0aW5nR3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlQ29udGVudHNGb3JWYWxpZGF0aW5nR3JvdXAoY29tcG9zaXRlKTsKLQotCQlzZXRTaXplKGNvbXBvc2l0ZSk7Ci0JCWxvYWRQcmVmZXJlbmNlcygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHNGb3JDcmVhdGluZ0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgY3JlYXRpbmdHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0JCWNyZWF0aW5nR3JvdXAuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkNyZWF0aW5nX2ZpbGVzKTsKLQotCQkvLyBEZWZhdWx0IGV4dGVuc2lvbiBmb3IgTmV3IGZpbGUgV2l6YXJkCi0JCWNyZWF0ZUxhYmVsKGNyZWF0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuWE1MRmlsZXNQcmVmZXJlbmNlUGFnZV9FeHRlbnNpb25MYWJlbCk7Ci0JCWZEZWZhdWx0U3VmZml4ID0gY3JlYXRlRHJvcERvd25Cb3goY3JlYXRpbmdHcm91cCk7Ci0JCVN0cmluZ1tdIHZhbGlkRXh0ZW5zaW9ucyA9IChTdHJpbmdbXSkgZ2V0VmFsaWRFeHRlbnNpb25zKCkudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQkJQXJyYXlzLnNvcnQodmFsaWRFeHRlbnNpb25zKTsKLQkJZkRlZmF1bHRTdWZmaXguc2V0SXRlbXModmFsaWRFeHRlbnNpb25zKTsKLQkJZkRlZmF1bHRTdWZmaXguYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBjcmVhdGVMYWJlbChjcmVhdGluZ0dyb3VwLCBYTUxVSU1lc3NhZ2VzLkVuY29kaW5nX2Rlc2MpOwotCQkoKEdyaWREYXRhKSBsYWJlbC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZkVuY29kaW5nU2V0dGluZ3MgPSBuZXcgRW5jb2RpbmdTZXR0aW5ncyhjcmVhdGluZ0dyb3VwLCBYTUxVSU1lc3NhZ2VzLkVuY29kaW5nKTsKLQkJKChHcmlkRGF0YSkgZkVuY29kaW5nU2V0dGluZ3MuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHNGb3JWYWxpZGF0aW5nR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCB2YWxpZGF0aW5nR3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDIpOwotCQkoKEdyaWRMYXlvdXQpIHZhbGlkYXRpbmdHcm91cC5nZXRMYXlvdXQoKSkubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gZmFsc2U7Ci0JCXZhbGlkYXRpbmdHcm91cC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuVmFsaWRhdGluZ19maWxlcyk7Ci0KLQkJaWYgKGZJbmRpY2F0ZU5vR3JhbW1hciA9PSBudWxsKSB7Ci0JCQljcmVhdGVMYWJlbCh2YWxpZGF0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuSW5kaWNhdGVfbm9fZ3JhbW1hcl9zcGVjaWZpZWQpOwotCQkJZkluZGljYXRlTm9HcmFtbWFyID0gY3JlYXRlQ29tYm8odmFsaWRhdGluZ0dyb3VwLCBTdHJpbmdVdGlscy51bnBhY2soWE1MVUlNZXNzYWdlcy5JbmRpY2F0ZV9ub19ncmFtbWFyX3NwZWNpZmllZF9zZXZlcml0aWVzKSk7Ci0JCX0KLQkJaWYgKGZVc2VYaW5jbHVkZSA9PSBudWxsKSB7Ci0JCQlmVXNlWGluY2x1ZGUgPSBjcmVhdGVDaGVja0JveCh2YWxpZGF0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuVXNlX1hJbmNsdWRlKTsKLQkJfQotCQkKLQkJbmV3IExhYmVsKHZhbGlkYXRpbmdHcm91cCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZEZWZhdWx0U3VmZml4LnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCkgewotCQlYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gbW9kZWwKLQl9Ci0KLQkvKioKLQkgKiBHZXQgY29udGVudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5ldyBmaWxlIHdpemFyZAotCSAqIAotCSAqIEByZXR1cm4gSUNvbnRlbnRUeXBlCi0JICovCi0JcHJvdGVjdGVkIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwpOwotCX0KLQotCS8qKgotCSAqIEdldCBsaXN0IG9mIHZhbGlkIGV4dGVuc2lvbnMKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0VmFsaWRFeHRlbnNpb25zKCkgewotCQlpZiAoZlZhbGlkRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCQlmVmFsaWRFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RmlsZVNwZWNzKElDb250ZW50VHlwZS5GSUxFX0VYVEVOU0lPTl9TUEVDKSkpOwotCQl9Ci0JCXJldHVybiBmVmFsaWRFeHRlbnNpb25zOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlI2dldE1vZGVsUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQlpbml0aWFsaXplVmFsdWVzRm9yQ3JlYXRpbmdHcm91cCgpOwotCQlpbml0aWFsaXplVmFsdWVzRm9yVmFsaWRhdGluZ0dyb3VwKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvckNyZWF0aW5nR3JvdXAoKSB7Ci0JCVN0cmluZyBzdWZmaXggPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04pOwotCQlmRGVmYXVsdFN1ZmZpeC5zZXRUZXh0KHN1ZmZpeCk7Ci0KLQkJU3RyaW5nIGVuY29kaW5nID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0KLQkJZkVuY29kaW5nU2V0dGluZ3Muc2V0SUFOQVRhZyhlbmNvZGluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvclZhbGlkYXRpbmdHcm91cCgpIHsKLQkJaW50IGluZGljYXRlTm9HcmFtbWFyQnV0dG9uU2VsZWN0ZWQgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ESUNBVEVfTk9fR1JBTU1BUik7Ci0JCWJvb2xlYW4gdXNlWEluY2x1ZGVCdXR0b25TZWxlY3RlZCA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVNFX1hJTkNMVURFKTsKLQotCQlpZiAoZkluZGljYXRlTm9HcmFtbWFyICE9IG51bGwpIHsKLQkJCWZJbmRpY2F0ZU5vR3JhbW1hci5zZWxlY3QoMiAtIGluZGljYXRlTm9HcmFtbWFyQnV0dG9uU2VsZWN0ZWQpOwotCQkJZkluZGljYXRlTm9HcmFtbWFyLnNldFRleHQoU3RyaW5nVXRpbHMudW5wYWNrKFhNTFVJTWVzc2FnZXMuSW5kaWNhdGVfbm9fZ3JhbW1hcl9zcGVjaWZpZWRfc2V2ZXJpdGllcylbMi1pbmRpY2F0ZU5vR3JhbW1hckJ1dHRvblNlbGVjdGVkXSk7Ci0JCX0KLQkJaWYgKGZVc2VYaW5jbHVkZSAhPSBudWxsKSB7Ci0JCQlmVXNlWGluY2x1ZGUuc2V0U2VsZWN0aW9uKHVzZVhJbmNsdWRlQnV0dG9uU2VsZWN0ZWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlwZXJmb3JtRGVmYXVsdHNGb3JDcmVhdGluZ0dyb3VwKCk7Ci0JCXBlcmZvcm1EZWZhdWx0c0ZvclZhbGlkYXRpbmdHcm91cCgpOwotCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckNyZWF0aW5nR3JvdXAoKSB7Ci0JCVN0cmluZyBzdWZmaXggPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQkJZkRlZmF1bHRTdWZmaXguc2V0VGV4dChzdWZmaXgpOwotCi0JCVN0cmluZyBlbmNvZGluZyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQotCQlmRW5jb2RpbmdTZXR0aW5ncy5zZXRJQU5BVGFnKGVuY29kaW5nKTsKLQkJLy8gZkVuY29kaW5nU2V0dGluZ3MucmVzZXRUb0RlZmF1bHRFbmNvZGluZygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvclZhbGlkYXRpbmdHcm91cCgpIHsKLQkJaW50IGluZGljYXRlTm9HcmFtbWFyQnV0dG9uU2VsZWN0ZWQgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklORElDQVRFX05PX0dSQU1NQVIpOwotCQlib29sZWFuIHVzZVhJbmNsdWRlQnV0dG9uU2VsZWN0ZWQgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VU0VfWElOQ0xVREUpOwotCQkKLQkJaWYgKGZJbmRpY2F0ZU5vR3JhbW1hciAhPSBudWxsKSB7Ci0JCQlmSW5kaWNhdGVOb0dyYW1tYXIuc2V0U2VsZWN0aW9uKG5ldyBQb2ludChpbmRpY2F0ZU5vR3JhbW1hckJ1dHRvblNlbGVjdGVkLCAyIC0gaW5kaWNhdGVOb0dyYW1tYXJCdXR0b25TZWxlY3RlZCkpOwotCQkJZkluZGljYXRlTm9HcmFtbWFyLnNldFRleHQoU3RyaW5nVXRpbHMudW5wYWNrKFhNTFVJTWVzc2FnZXMuSW5kaWNhdGVfbm9fZ3JhbW1hcl9zcGVjaWZpZWRfc2V2ZXJpdGllcylbaW5kaWNhdGVOb0dyYW1tYXJCdXR0b25TZWxlY3RlZF0pOwotCQl9Ci0JCWlmIChmVXNlWGluY2x1ZGUgIT0gbnVsbCkgewotCQkJZlVzZVhpbmNsdWRlLnNldFNlbGVjdGlvbih1c2VYSW5jbHVkZUJ1dHRvblNlbGVjdGVkKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtT2soKTsKLQotCQlkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlzdG9yZVZhbHVlc0ZvckNyZWF0aW5nR3JvdXAoKTsKLQkJc3RvcmVWYWx1ZXNGb3JWYWxpZGF0aW5nR3JvdXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlc0ZvckNyZWF0aW5nR3JvdXAoKSB7Ci0JCVN0cmluZyBzdWZmaXggPSBmRGVmYXVsdFN1ZmZpeC5nZXRUZXh0KCk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OLCBzdWZmaXgpOwotCi0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCwgZkVuY29kaW5nU2V0dGluZ3MuZ2V0SUFOQVRhZygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlc0ZvclZhbGlkYXRpbmdHcm91cCgpIHsKLQkJaWYgKGZJbmRpY2F0ZU5vR3JhbW1hciAhPSBudWxsKSB7Ci0JCQlpbnQgd2Fybk5vR3JhbW1hckJ1dHRvblNlbGVjdGVkID0gMiAtIGZJbmRpY2F0ZU5vR3JhbW1hci5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ESUNBVEVfTk9fR1JBTU1BUiwgd2Fybk5vR3JhbW1hckJ1dHRvblNlbGVjdGVkKTsKLQkJfQotCQlpZiAoZlVzZVhpbmNsdWRlICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gdXNlWEluY2x1ZGVCdXR0b25TZWxlY3RlZCA9IGZVc2VYaW5jbHVkZS5nZXRTZWxlY3Rpb24oKTsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVTRV9YSU5DTFVERSwgdXNlWEluY2x1ZGVCdXR0b25TZWxlY3RlZCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVZhbHVlcygpIHsKLQkJYm9vbGVhbiBpc1ZhbGlkID0gZmFsc2U7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRWYWxpZEV4dGVuc2lvbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkgJiYgIWlzVmFsaWQpIHsKLQkJCVN0cmluZyBleHRlbnNpb24gPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCWlzVmFsaWQgPSBleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZShmRGVmYXVsdFN1ZmZpeC5nZXRUZXh0KCkpOwotCQl9Ci0KLQkJaWYgKCFpc1ZhbGlkKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5YTUxGaWxlc1ByZWZlcmVuY2VQYWdlX0V4dGVuc2lvbkVycm9yLCBnZXRWYWxpZEV4dGVuc2lvbnMoKS50b1N0cmluZygpKSk7Ci0JCQlzZXRWYWxpZChmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlzZXRWYWxpZCh0cnVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxTb3VyY2VQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFNvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNTEzMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFNvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuR3JpZERhdGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlTGlua0FyZWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZXMuSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLQotcHVibGljIGNsYXNzIFhNTFNvdXJjZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyLCBTZWxlY3Rpb25MaXN0ZW5lciwgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQlwcml2YXRlIGZpbmFsIGludCBNSU5fSU5ERU5UQVRJT05fU0laRSA9IDA7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX0lOREVOVEFUSU9OX1NJWkUgPSAxNjsKLQotCS8vIENvbnRlbnQgQXNzaXN0Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQXV0b1Byb3Bvc2U7Ci0JcHJvdGVjdGVkIExhYmVsIGZBdXRvUHJvcG9zZUxhYmVsOwotCXByb3RlY3RlZCBUZXh0IGZBdXRvUHJvcG9zZVRleHQ7Ci0JcHJpdmF0ZSBDb21ibyBmU3VnZ2VzdGlvblN0cmF0ZWd5Q29tYm87Ci0JcHJpdmF0ZSBWZWN0b3IgZlN1Z2dlc3Rpb25TdHJhdGVnaWVzID0gbnVsbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDbGVhckFsbEJsYW5rTGluZXM7Ci0KLQkvLyBGb3JtYXR0aW5nCi0JcHJvdGVjdGVkIExhYmVsIGZMaW5lV2lkdGhMYWJlbDsKLQlwcm90ZWN0ZWQgVGV4dCBmTGluZVdpZHRoVGV4dDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZTcGxpdE11bHRpQXR0cnM7Ci0JcHJpdmF0ZSBCdXR0b24gZkluZGVudFVzaW5nVGFiczsKLQlwcml2YXRlIEJ1dHRvbiBmSW5kZW50VXNpbmdTcGFjZXM7Ci0JcHJpdmF0ZSBTcGlubmVyIGZJbmRlbnRhdGlvblNpemU7Ci0JcHJpdmF0ZSBCdXR0b24gZlByZXNlcnZlUENEQVRBQ29udGVudDsKLQlwcml2YXRlIEJ1dHRvbiBmQWxpZ25FbmRCcmFja2V0OwotCS8vIEJVRzE5NTI2NCAtIFN1cHBvcnQgZm9yIHJlbW92aW5nL2FkZGluZyBhIHNwYWNlIGJlZm9yZSBlbXB0eSBjbG9zZSB0YWdzCi0JcHJpdmF0ZSBCdXR0b24gZlNwYWNlQmVmb3JlRW1wdHlDbG9zZVRhZzsKLQotCS8vIGdyYW1tYXIgY29uc3RyYWludHMKLQlwcm90ZWN0ZWQgQnV0dG9uIGZVc2VJbmZlcnJlZEdyYW1tYXI7Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIElIZWxwQ29udGV4dElkcy5YTUxfUFJFRldFQlhfU09VUkNFX0hFTFBJRCk7Ci0KLQkJbmV3IFByZWZlcmVuY2VMaW5rQXJlYShjb21wb3NpdGUsIFNXVC5XUkFQIHwgU1dULk1VTFRJLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5lZGl0b3IiLCBYTUxVSU1lc3NhZ2VzLl9VSV9TVFJVQ1RVUkVEX1RFWFRfRURJVE9SX1BSRUZTX0xJTkssLy8kTk9OLU5MUy0xJAotCQkJCQkoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpIGdldENvbnRhaW5lcigpLCBudWxsKS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuaGludCgxNTAsIFNXVC5ERUZBVUxUKS5jcmVhdGUoKSk7Ci0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKS5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5zd3REZWZhdWx0cygpLmNyZWF0ZSgpKTsKLQotCQljcmVhdGVDb250ZW50c0ZvckZvcm1hdHRpbmdHcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVDb250ZW50c0ZvckNvbnRlbnRBc3Npc3RHcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVDb250ZW50c0ZvckdyYW1tYXJDb25zdHJhaW50c0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCXNldFNpemUoY29tcG9zaXRlKTsKLQkJbG9hZFByZWZlcmVuY2VzKCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50c0ZvckNvbnRlbnRBc3Npc3RHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGNvbnRlbnRBc3Npc3RHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0JCWNvbnRlbnRBc3Npc3RHcm91cC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuQ29udGVudF9hc3Npc3RfVUlfKTsKLQotCQlmQXV0b1Byb3Bvc2UgPSBjcmVhdGVDaGVja0JveChjb250ZW50QXNzaXN0R3JvdXAsIFhNTFVJTWVzc2FnZXMuQXV0b21hdGljYWxseV9tYWtlX3N1Z2dlc3RfVUlfKTsKLQkJKChHcmlkRGF0YSkgZkF1dG9Qcm9wb3NlLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmQXV0b1Byb3Bvc2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJZkF1dG9Qcm9wb3NlTGFiZWwgPSBjcmVhdGVMYWJlbChjb250ZW50QXNzaXN0R3JvdXAsIFhNTFVJTWVzc2FnZXMuUHJvbXB0X3doZW5fdGhlc2VfY2hhcmFjdGVfVUlfKTsKLQkJZkF1dG9Qcm9wb3NlVGV4dCA9IGNyZWF0ZVRleHRGaWVsZChjb250ZW50QXNzaXN0R3JvdXApOwotCi0JCWNyZWF0ZUxhYmVsKGNvbnRlbnRBc3Npc3RHcm91cCwgWE1MVUlNZXNzYWdlcy5TdWdnZXN0aW9uX1N0cmF0ZWd5KTsKLQkJZlN1Z2dlc3Rpb25TdHJhdGVneUNvbWJvID0gbmV3IENvbWJvKGNvbnRlbnRBc3Npc3RHcm91cCwgU1dULlJFQURfT05MWSk7Ci0JCWZTdWdnZXN0aW9uU3RyYXRlZ2llcyA9IG5ldyBWZWN0b3IoKTsKLQkJZlN1Z2dlc3Rpb25TdHJhdGVneUNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlmU3VnZ2VzdGlvblN0cmF0ZWd5Q29tYm8uYWRkKFhNTFVJTWVzc2FnZXMuU3VnZ2VzdGlvbl9TdHJhdGVneV9MYXgpOwotCQlmU3VnZ2VzdGlvblN0cmF0ZWdpZXMuYWRkKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlNVR0dFU1RJT05fU1RSQVRFR1lfVkFMVUVfTEFYKTsKLQkJZlN1Z2dlc3Rpb25TdHJhdGVneUNvbWJvLmFkZChYTUxVSU1lc3NhZ2VzLlN1Z2dlc3Rpb25fU3RyYXRlZ3lfU3RyaWN0KTsKLQkJZlN1Z2dlc3Rpb25TdHJhdGVnaWVzLmFkZChYTUxVSVByZWZlcmVuY2VOYW1lcy5TVUdHRVNUSU9OX1NUUkFURUdZX1ZBTFVFX1NUUklDVCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHNGb3JGb3JtYXR0aW5nR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBmb3JtYXR0aW5nR3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDIpOwotCQlmb3JtYXR0aW5nR3JvdXAuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkZvcm1hdHRpbmdfVUlfKTsKLQotCQlmTGluZVdpZHRoTGFiZWwgPSBjcmVhdGVMYWJlbChmb3JtYXR0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuTGluZV93aWR0aF9fVUlfKTsKLQkJZkxpbmVXaWR0aFRleHQgPSBuZXcgVGV4dChmb3JtYXR0aW5nR3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlnRGF0YS53aWR0aEhpbnQgPSAyNTsKLQkJZkxpbmVXaWR0aFRleHQuc2V0TGF5b3V0RGF0YShnRGF0YSk7Ci0JCWZMaW5lV2lkdGhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCi0JCWZTcGxpdE11bHRpQXR0cnMgPSBjcmVhdGVDaGVja0JveChmb3JtYXR0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuU3BsaXRfbXVsdGlwbGVfYXR0cmlidXRlcyk7Ci0JCSgoR3JpZERhdGEpIGZTcGxpdE11bHRpQXR0cnMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZBbGlnbkVuZEJyYWNrZXQgPSBjcmVhdGVDaGVja0JveChmb3JtYXR0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuQWxpZ25fZmluYWxfYnJhY2tldCk7Ci0JCSgoR3JpZERhdGEpIGZBbGlnbkVuZEJyYWNrZXQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZQcmVzZXJ2ZVBDREFUQUNvbnRlbnQgPSBjcmVhdGVDaGVja0JveChmb3JtYXR0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuUHJlc2VydmVfUENEQVRBX0NvbnRlbnQpOwotCQkoKEdyaWREYXRhKSBmUHJlc2VydmVQQ0RBVEFDb250ZW50LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmQ2xlYXJBbGxCbGFua0xpbmVzID0gY3JlYXRlQ2hlY2tCb3goZm9ybWF0dGluZ0dyb3VwLCBYTUxVSU1lc3NhZ2VzLkNsZWFyX2FsbF9ibGFua19saW5lc19VSV8pOwotCQkoKEdyaWREYXRhKSBmQ2xlYXJBbGxCbGFua0xpbmVzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmU3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnID0gY3JlYXRlQ2hlY2tCb3goZm9ybWF0dGluZ0dyb3VwLCBYTUxVSU1lc3NhZ2VzLlNwYWNlX2JlZm9yZV9lbXB0eV9jbG9zZV90YWcpOwotCQkoKEdyaWREYXRhKSBmU3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkKLQkJZkluZGVudFVzaW5nVGFicyA9IGNyZWF0ZVJhZGlvQnV0dG9uKGZvcm1hdHRpbmdHcm91cCwgWE1MVUlNZXNzYWdlcy5JbmRlbnRfdXNpbmdfdGFicyk7Ci0JCSgoR3JpZERhdGEpIGZJbmRlbnRVc2luZ1RhYnMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJZkluZGVudFVzaW5nU3BhY2VzID0gY3JlYXRlUmFkaW9CdXR0b24oZm9ybWF0dGluZ0dyb3VwLCBYTUxVSU1lc3NhZ2VzLkluZGVudF91c2luZ19zcGFjZXMpOwotCQkoKEdyaWREYXRhKSBmSW5kZW50VXNpbmdTcGFjZXMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJY3JlYXRlTGFiZWwoZm9ybWF0dGluZ0dyb3VwLCBYTUxVSU1lc3NhZ2VzLkluZGVudGF0aW9uX3NpemUpOwotCQlmSW5kZW50YXRpb25TaXplID0gbmV3IFNwaW5uZXIoZm9ybWF0dGluZ0dyb3VwLCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRUb29sVGlwVGV4dChYTUxVSU1lc3NhZ2VzLkluZGVudGF0aW9uX3NpemVfdGlwKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRNaW5pbXVtKE1JTl9JTkRFTlRBVElPTl9TSVpFKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRNYXhpbXVtKE1BWF9JTkRFTlRBVElPTl9TSVpFKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0UGFnZUluY3JlbWVudCg0KTsKLQkJZkluZGVudGF0aW9uU2l6ZS5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50c0ZvckdyYW1tYXJDb25zdHJhaW50c0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgZ3JhbW1hckNvbnN0cmFpbnRzR3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDEpOwotCQlncmFtbWFyQ29uc3RyYWludHNHcm91cC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuR3JhbW1hcl9Db25zdHJhaW50cyk7Ci0JCWdyYW1tYXJDb25zdHJhaW50c0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCi0JCWZVc2VJbmZlcnJlZEdyYW1tYXIgPSBjcmVhdGVDaGVja0JveChncmFtbWFyQ29uc3RyYWludHNHcm91cCwgWE1MVUlNZXNzYWdlcy5Vc2VfaW5mZXJyZWRfZ3JhbW1hcl9pbl9hYnNlbmNlX29mKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCVhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gZWRpdG9yCi0JCVhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOyAvLyBtb2RlbAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVZhbHVlcygpIHsKLQkJaWYgKGZBdXRvUHJvcG9zZSAhPSBudWxsKSB7Ci0JCQlpZiAoZkF1dG9Qcm9wb3NlLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZkF1dG9Qcm9wb3NlTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlmQXV0b1Byb3Bvc2VUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmQXV0b1Byb3Bvc2VMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlmQXV0b1Byb3Bvc2VUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgcHJlZmVyZW5jZQotCSAqIAotCSAqIEByZXR1cm4gYSBzdWdnZXN0aW9uIHN0cmF0ZWd5IGNvbnN0YW50IGZyb20gWE1MVUlQcmVmZXJlbmNlTmFtZXMKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRDdXJyZW50U3VnZ2VzdGlvblN0cmF0ZWd5KCkgewotCQlpbnQgaSA9IGZTdWdnZXN0aW9uU3RyYXRlZ3lDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaSA+PSAwKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgKGZTdWdnZXN0aW9uU3RyYXRlZ2llcy5lbGVtZW50QXQoaSkpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWluaXRpYWxpemVWYWx1ZXNGb3JGb3JtYXR0aW5nR3JvdXAoKTsKLQkJaW5pdGlhbGl6ZVZhbHVlc0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpOwotCQlpbml0aWFsaXplVmFsdWVzRm9yR3JhbW1hckNvbnN0cmFpbnRzR3JvdXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzRm9yQ29udGVudEFzc2lzdEdyb3VwKCkgewotCQkvLyBDb250ZW50IEFzc2lzdAotCQlmQXV0b1Byb3Bvc2Uuc2V0U2VsZWN0aW9uKGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFKSk7Ci0JCWZBdXRvUHJvcG9zZVRleHQuc2V0VGV4dChnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFX0NPREUpKTsKLQkJU3RyaW5nIHN1Z2dlc3Rpb25TdHJhdGVneSA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhYTUxVSVByZWZlcmVuY2VOYW1lcy5TVUdHRVNUSU9OX1NUUkFURUdZKTsKLQkJaWYgKHN1Z2dlc3Rpb25TdHJhdGVneS5sZW5ndGgoKSA+IDApIHsKLQkJCXNldEN1cnJlbnRTdWdnZXN0aW9uU3RyYXRlZ3koc3VnZ2VzdGlvblN0cmF0ZWd5KTsKLQkJfQotCQllbHNlIHsKLQkJCXNldEN1cnJlbnRTdWdnZXN0aW9uU3RyYXRlZ3koWE1MVUlQcmVmZXJlbmNlTmFtZXMuU1VHR0VTVElPTl9TVFJBVEVHWV9WQUxVRV9MQVgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvckZvcm1hdHRpbmdHcm91cCgpIHsKLQkJLy8gRm9ybWF0dGluZwotCQlmTGluZVdpZHRoVGV4dC5zZXRUZXh0KGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCWZTcGxpdE11bHRpQXR0cnMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BMSVRfTVVMVElfQVRUUlMpKTsKLQkJZkFsaWduRW5kQnJhY2tldC5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BTElHTl9FTkRfQlJBQ0tFVCkpOwotCQlmQ2xlYXJBbGxCbGFua0xpbmVzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUykpOwotCQlmUHJlc2VydmVQQ0RBVEFDb250ZW50LnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlBSRVNFUlZFX0NEQVRBQ09OVEVOVCkpOwotCQlmU3BhY2VCZWZvcmVFbXB0eUNsb3NlVGFnLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFX0JFRk9SRV9FTVBUWV9DTE9TRV9UQUcpKTsKLQkJCi0JCWlmIChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpKSkgewotCQkJZkluZGVudFVzaW5nVGFicy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlmSW5kZW50VXNpbmdTcGFjZXMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWZJbmRlbnRVc2luZ1NwYWNlcy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlmSW5kZW50VXNpbmdUYWJzLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQotCQlmSW5kZW50YXRpb25TaXplLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXNGb3JHcmFtbWFyQ29uc3RyYWludHNHcm91cCgpIHsKLQkJZlVzZUluZmVycmVkR3JhbW1hci5zZXRTZWxlY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihYTUxVSVByZWZlcmVuY2VOYW1lcy5VU0VfSU5GRVJSRURfR1JBTU1BUikpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJcGVyZm9ybURlZmF1bHRzRm9yRm9ybWF0dGluZ0dyb3VwKCk7Ci0JCXBlcmZvcm1EZWZhdWx0c0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpOwotCQlwZXJmb3JtRGVmYXVsdHNGb3JHcmFtbWFyQ29uc3RyYWludHNHcm91cCgpOwotCi0JCXZhbGlkYXRlVmFsdWVzKCk7Ci0JCWVuYWJsZVZhbHVlcygpOwotCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpIHsKLQkJLy8gQ29udGVudCBBc3Npc3QKLQkJZkF1dG9Qcm9wb3NlLnNldFNlbGVjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0Qm9vbGVhbihYTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UpKTsKLQkJZkF1dG9Qcm9wb3NlVGV4dC5zZXRUZXh0KGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFX0NPREUpKTsKLQkJU3RyaW5nIHN1Z2dlc3Rpb25TdHJhdGVneSA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuU1VHR0VTVElPTl9TVFJBVEVHWSk7Ci0JCWlmIChzdWdnZXN0aW9uU3RyYXRlZ3kubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzZXRDdXJyZW50U3VnZ2VzdGlvblN0cmF0ZWd5KHN1Z2dlc3Rpb25TdHJhdGVneSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRDdXJyZW50U3VnZ2VzdGlvblN0cmF0ZWd5KFhNTFVJUHJlZmVyZW5jZU5hbWVzLlNVR0dFU1RJT05fU1RSQVRFR1lfVkFMVUVfTEFYKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckZvcm1hdHRpbmdHcm91cCgpIHsKLQkJLy8gRm9ybWF0dGluZwotCQlmTGluZVdpZHRoVGV4dC5zZXRUZXh0KGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpOwotCQlmU3BsaXRNdWx0aUF0dHJzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUykpOwotCQlmQWxpZ25FbmRCcmFja2V0LnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BTElHTl9FTkRfQlJBQ0tFVCkpOwotCQlmQ2xlYXJBbGxCbGFua0xpbmVzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBUl9BTExfQkxBTktfTElORVMpKTsKLQkJZlByZXNlcnZlUENEQVRBQ29udGVudC5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuUFJFU0VSVkVfQ0RBVEFDT05URU5UKSk7Ci0JCS8vIEJVRzE5NTI2NCAtIFN1cHBvcnQgZm9yIHJlbW92aW5nL2FkZGluZyBhIHNwYWNlIGJlZm9yZSBlbXB0eSBjbG9zZSB0YWdzCi0JCWZTcGFjZUJlZm9yZUVtcHR5Q2xvc2VUYWcuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFX0JFRk9SRV9FTVBUWV9DTE9TRV9UQUcpKTsKLQkJCi0JCWlmIChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKSkpIHsKLQkJCWZJbmRlbnRVc2luZ1RhYnMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZkluZGVudFVzaW5nU3BhY2VzLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmSW5kZW50VXNpbmdTcGFjZXMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZkluZGVudFVzaW5nVGFicy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0SW50KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckdyYW1tYXJDb25zdHJhaW50c0dyb3VwKCkgewotCQlmVXNlSW5mZXJyZWRHcmFtbWFyLnNldFNlbGVjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0Qm9vbGVhbihYTUxVSVByZWZlcmVuY2VOYW1lcy5VU0VfSU5GRVJSRURfR1JBTU1BUikpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtT2soKTsKLQotCQlkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFNldCBhIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgaW4gc3VnZ2VzdGlvbiBzdHJhdGVneSBjb21ibyBib3gKLQkgKiAKLQkgKiBAcGFyYW0gc3RyYXRlZ3kKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0Q3VycmVudFN1Z2dlc3Rpb25TdHJhdGVneShTdHJpbmcgc3RyYXRlZ3kpIHsKLQkJLy8gQ2xlYXIgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotCQlmU3VnZ2VzdGlvblN0cmF0ZWd5Q29tYm8uY2xlYXJTZWxlY3Rpb24oKTsKLQkJZlN1Z2dlc3Rpb25TdHJhdGVneUNvbWJvLmRlc2VsZWN0QWxsKCk7Ci0KLQkJaW50IGkgPSBmU3VnZ2VzdGlvblN0cmF0ZWdpZXMuaW5kZXhPZihzdHJhdGVneSk7Ci0JCWlmIChpID49IDApIHsKLQkJCWZTdWdnZXN0aW9uU3RyYXRlZ3lDb21iby5zZWxlY3QoaSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJc3RvcmVWYWx1ZXNGb3JGb3JtYXR0aW5nR3JvdXAoKTsKLQkJc3RvcmVWYWx1ZXNGb3JDb250ZW50QXNzaXN0R3JvdXAoKTsKLQkJc3RvcmVWYWx1ZXNGb3JHcmFtbWFyQ29uc3RyYWludHNHcm91cCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzRm9yQ29udGVudEFzc2lzdEdyb3VwKCkgewotCQkvLyBDb250ZW50IEFzc2lzdAotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShYTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UsIGZBdXRvUHJvcG9zZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFLCBmQXV0b1Byb3Bvc2VUZXh0LmdldFRleHQoKSk7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlNVR0dFU1RJT05fU1RSQVRFR1ksIGdldEN1cnJlbnRTdWdnZXN0aW9uU3RyYXRlZ3koKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXNGb3JGb3JtYXR0aW5nR3JvdXAoKSB7Ci0JCS8vIEZvcm1hdHRpbmcKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCwgZkxpbmVXaWR0aFRleHQuZ2V0VGV4dCgpKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BMSVRfTVVMVElfQVRUUlMsIGZTcGxpdE11bHRpQXR0cnMuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BTElHTl9FTkRfQlJBQ0tFVCwgZkFsaWduRW5kQnJhY2tldC5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUywgZkNsZWFyQWxsQmxhbmtMaW5lcy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlBSRVNFUlZFX0NEQVRBQ09OVEVOVCwgZlByZXNlcnZlUENEQVRBQ29udGVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCS8vIEJVRzE5NTI2NCAtIFN1cHBvcnQgZm9yIHJlbW92aW5nL2FkZGluZyBhIHNwYWNlIGJlZm9yZSBlbXB0eSBjbG9zZSB0YWdzCi0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFX0JFRk9SRV9FTVBUWV9DTE9TRV9UQUcsIGZTcGFjZUJlZm9yZUVtcHR5Q2xvc2VUYWcuZ2V0U2VsZWN0aW9uKCkpOwotCQkKLQkJaWYgKGZJbmRlbnRVc2luZ1RhYnMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIsIFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFCKTsKLQkJfQotCQllbHNlIHsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIsIFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BBQ0UpOwotCQl9Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUsIGZJbmRlbnRhdGlvblNpemUuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzRm9yR3JhbW1hckNvbnN0cmFpbnRzR3JvdXAoKSB7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlVTRV9JTkZFUlJFRF9HUkFNTUFSLCBmVXNlSW5mZXJyZWRHcmFtbWFyLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVZhbHVlcygpIHsKLQkJYm9vbGVhbiBpc0Vycm9yID0gZmFsc2U7Ci0JCVN0cmluZyB3aWR0aFRleHQgPSBudWxsOwotCi0JCWlmIChmTGluZVdpZHRoVGV4dCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXdpZHRoVGV4dCA9IGZMaW5lV2lkdGhUZXh0LmdldFRleHQoKTsKLQkJCQlpbnQgZm9ybWF0dGluZ0xpbmVXaWR0aCA9IEludGVnZXIucGFyc2VJbnQod2lkdGhUZXh0KTsKLQkJCQlpZiAoKGZvcm1hdHRpbmdMaW5lV2lkdGggPCBXSURUSF9WQUxJREFUSU9OX0xPV0VSX0xJTUlUKSB8fCAoZm9ybWF0dGluZ0xpbmVXaWR0aCA+IFdJRFRIX1ZBTElEQVRJT05fVVBQRVJfTElNSVQpKSB7Ci0JCQkJCXRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZXhjKSB7Ci0JCQkJc2V0SW52YWxpZElucHV0TWVzc2FnZSh3aWR0aFRleHQpOwotCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCQlpc0Vycm9yID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWludCBpbmRlbnRTaXplID0gMDsKLQkJaWYgKGZJbmRlbnRhdGlvblNpemUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpbmRlbnRTaXplID0gZkluZGVudGF0aW9uU2l6ZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoKGluZGVudFNpemUgPCBNSU5fSU5ERU5UQVRJT05fU0laRSkgfHwgKGluZGVudFNpemUgPiBNQVhfSU5ERU5UQVRJT05fU0laRSkpIHsKLQkJCQkJdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZleGMpIHsKLQkJCQlzZXRJbnZhbGlkSW5wdXRNZXNzYWdlKEludGVnZXIudG9TdHJpbmcoaW5kZW50U2l6ZSkpOwotCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCQlpc0Vycm9yID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWlmICghaXNFcnJvcikgewotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJc2V0VmFsaWQodHJ1ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MU3ludGF4Q29sb3JpbmdQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MU3ludGF4Q29sb3JpbmdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NGZlZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFN5bnRheENvbG9yaW5nUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkNvbG9yU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxpc3RWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BQ0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotLyoqCi0gKiBBIHByZWZlcmVuY2UgcGFnZSB0byBjb25maWd1cmUgb3VyIFhNTCBzeW50YXggY29sb3IuIEl0IHJlc2VtYmxlcyB0aGUgSkRUCi0gKiBhbmQgQ0RUIHBhZ2VzIGZhciBtb3JlIHRoYW4gb3VyIG9yaWdpbmFsIGNvbG9yIHBhZ2Ugd2hpbGUgcmV0YWluaW5nIHRoZQotICogZXh0cmEgImNsaWNrLXRvLWZpbmQiIGZ1bmN0aW9uYWxpdHkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUxTeW50YXhDb2xvcmluZ1BhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIEJ1dHRvbiBmQm9sZDsKLQlwcml2YXRlIExhYmVsIGZGb3JlZ3JvdW5kTGFiZWw7Ci0JcHJpdmF0ZSBMYWJlbCBmQmFja2dyb3VuZExhYmVsOwotCXByaXZhdGUgQnV0dG9uIGZDbGVhclN0eWxlOwotCXByaXZhdGUgTWFwIGZDb250ZXh0VG9TdHlsZU1hcDsKLQlwcml2YXRlIENvbG9yIGZEZWZhdWx0Rm9yZWdyb3VuZCA9IG51bGw7Ci0JcHJpdmF0ZSBDb2xvciBmRGVmYXVsdEJhY2tncm91bmQgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBDb2xvclNlbGVjdG9yIGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3I7Ci0JcHJpdmF0ZSBDb2xvclNlbGVjdG9yIGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3I7Ci0JcHJpdmF0ZSBCdXR0b24gZkl0YWxpYzsKLQlwcml2YXRlIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZk92ZXJsYXlTdG9yZTsKLQlwcml2YXRlIEJ1dHRvbiBmU3RyaWtlOwotCXByaXZhdGUgQ29sbGVjdGlvbiBmU3R5bGVQcmVmZXJlbmNlS2V5czsKLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgZlN0eWxlc1ZpZXdlciA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgZlN0eWxlVG9EZXNjcmlwdGlvbk1hcDsKLQlwcml2YXRlIFN0eWxlZFRleHQgZlRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gZlVuZGVybGluZTsKLQotCS8vIGFjdGl2YXRlIGNvbnRyb2xzIGJhc2VkIG9uIHRoZSBnaXZlbiBsb2NhbCBjb2xvciB0eXBlCi0JcHJpdmF0ZSB2b2lkIGFjdGl2YXRlKFN0cmluZyBuYW1lZFN0eWxlKSB7Ci0JCUNvbG9yIGZvcmVncm91bmQgPSBmRGVmYXVsdEZvcmVncm91bmQ7Ci0JCUNvbG9yIGJhY2tncm91bmQgPSBmRGVmYXVsdEJhY2tncm91bmQ7Ci0JCWlmIChuYW1lZFN0eWxlID09IG51bGwpIHsKLQkJCWZDbGVhclN0eWxlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmSXRhbGljLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZlN0cmlrZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZVbmRlcmxpbmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJhY2tncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJvbGQuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZJdGFsaWMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZTdHJpa2Uuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWZVbmRlcmxpbmUuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCVRleHRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlRm9yKG5hbWVkU3R5bGUpOwotCQkJZkNsZWFyU3R5bGUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZCb2xkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmSXRhbGljLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmU3RyaWtlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmVW5kZXJsaW5lLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQm9sZC5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOwotCQkJZkl0YWxpYy5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULklUQUxJQykgIT0gMCk7Ci0JCQlmU3RyaWtlLnNldFNlbGVjdGlvbigoYXR0cmlidXRlLmdldFN0eWxlKCkgJiBUZXh0QXR0cmlidXRlLlNUUklLRVRIUk9VR0gpICE9IDApOwotCQkJZlVuZGVybGluZS5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5VTkRFUkxJTkUpICE9IDApOwotCQkJaWYgKGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCkgIT0gbnVsbCkgewotCQkJCWZvcmVncm91bmQgPSBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJfQotCQkJaWYgKGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCkgIT0gbnVsbCkgewotCQkJCWJhY2tncm91bmQgPSBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpOwotCQkJfQotCQl9Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5zZXRDb2xvclZhbHVlKGZvcmVncm91bmQuZ2V0UkdCKCkpOwotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldENvbG9yVmFsdWUoYmFja2dyb3VuZC5nZXRSR0IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29sb3IgdGhlIHRleHQgaW4gdGhlIHNhbXBsZSBhcmVhIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBwcmVmZXJlbmNlcwotCSAqLwotCXZvaWQgYXBwbHlTdHlsZXMoKSB7Ci0JCWlmIChmVGV4dCA9PSBudWxsIHx8IGZUZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IGZEb2N1bWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl3aGlsZSAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJLy8gbG9va3VwIHRoZSBsb2NhbCBjb2xvcmluZyB0eXBlIGFuZCBhcHBseSBpdAotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKFN0cmluZykgZkNvbnRleHRUb1N0eWxlTWFwLmdldChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSk7Ci0JCQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGVGb3IobmFtZWRTdHlsZSk7Ci0JCQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY3VycmVudFJlZ2lvbiksIGN1cnJlbnRSZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBhdHRyaWJ1dGUuZ2V0Rm9yZWdyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpLCBhdHRyaWJ1dGUuZ2V0U3R5bGUoKSk7Ci0JCQkJc3R5bGUuc3RyaWtlb3V0ID0gKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIKSAhPSAwOwotCQkJCXN0eWxlLnVuZGVybGluZSA9IChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FKSAhPSAwOwotCQkJCWZUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCQkJfQotCQkJZG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbi5nZXROZXh0KCk7Ci0JCX0KLQl9Ci0KLQlCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29tcG9zaXRlIGNvbnRyb2wgYW5kIHNldHMgdGhlIGRlZmF1bHQgbGF5b3V0IGRhdGEuCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0JCWZEZWZhdWx0Rm9yZWdyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfRk9SRUdST1VORCk7Ci0JCWZEZWZhdWx0QmFja2dyb3VuZCA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0JCUNvbXBvc2l0ZSBwYWdlQ29tcG9uZW50ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMik7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFnZUNvbXBvbmVudCwgSUhlbHBDb250ZXh0SWRzLlhNTF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhwYWdlQ29tcG9uZW50LCBTV1QuV1JBUCk7Ci0JCWxpbmsuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nX0xpbmspOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24ocGFyZW50LmdldFNoZWxsKCksIGUudGV4dCwgbnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUdyaWREYXRhIGxpbmtEYXRhPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGlua0RhdGEud2lkdGhIaW50PSAxNTA7IC8vIG9ubHkgZXhwYW5kIGZ1cnRoZXIgaWYgYW55b25lIGVsc2UgcmVxdWlyZXMgaXQKLQkJbGluay5zZXRMYXlvdXREYXRhKGxpbmtEYXRhKTsKLQotCQluZXcgTGFiZWwocGFnZUNvbXBvbmVudCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQluZXcgTGFiZWwocGFnZUNvbXBvbmVudCwgU1dULk5PTkUpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCVNhc2hGb3JtIGVkaXRvciA9IG5ldyBTYXNoRm9ybShwYWdlQ29tcG9uZW50LCBTV1QuVkVSVElDQUwpOwotCQlHcmlkRGF0YSBncmlkRGF0YTIgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEyLmhvcml6b250YWxTcGFuID0gMjsKLQkJZWRpdG9yLnNldExheW91dERhdGEoZ3JpZERhdGEyKTsKLQkJU2FzaEZvcm0gdG9wID0gbmV3IFNhc2hGb3JtKGVkaXRvciwgU1dULkhPUklaT05UQUwpOwotCQlDb21wb3NpdGUgc3R5bGVFZGl0b3IgPSBjcmVhdGVDb21wb3NpdGUodG9wLCAxKTsKLQkJKChHcmlkTGF5b3V0KSBzdHlsZUVkaXRvci5nZXRMYXlvdXQoKSkubWFyZ2luUmlnaHQgPSA1OwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gMDsKLQkJY3JlYXRlTGFiZWwoc3R5bGVFZGl0b3IsIFhNTFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzApOwotCQlmU3R5bGVzVmlld2VyID0gY3JlYXRlU3R5bGVzVmlld2VyKHN0eWxlRWRpdG9yKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSBNYXRoLm1heChncmlkRGF0YS53aWR0aEhpbnQsIGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhpdGVyYXRvci5uZXh0KCkudG9TdHJpbmcoKS5sZW5ndGgoKSkpOwotCQl9Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQlmU3R5bGVzVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlDb21wb3NpdGUgZWRpdGluZ0NvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b3AsIDEpOwotCQkoKEdyaWRMYXlvdXQpIHN0eWxlRWRpdG9yLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gNTsKLQkJY3JlYXRlTGFiZWwoZWRpdGluZ0NvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUJ1dHRvbiBlbmFibGVyID0gY3JlYXRlQ2hlY2tib3goZWRpdGluZ0NvbXBvc2l0ZSwgWE1MVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfMik7Ci0JCWVuYWJsZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVuYWJsZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQlDb21wb3NpdGUgZWRpdENvbnRyb2xzID0gY3JlYXRlQ29tcG9zaXRlKGVkaXRpbmdDb21wb3NpdGUsIDIpOwotCQkoKEdyaWRMYXlvdXQpIGVkaXRDb250cm9scy5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDIwOwotCi0JCWZGb3JlZ3JvdW5kTGFiZWwgPSBjcmVhdGVMYWJlbChlZGl0Q29udHJvbHMsIFNTRVVJTWVzc2FnZXMuRm9yZWdyb3VuZF9VSV8pOwotCQkoKEdyaWREYXRhKSBmRm9yZWdyb3VuZExhYmVsLmdldExheW91dERhdGEoKSkudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IgPSBuZXcgQ29sb3JTZWxlY3RvcihlZGl0Q29udHJvbHMpOwotCQlCdXR0b24gZkZvcmVncm91bmRDb2xvciA9IGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0QnV0dG9uKCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotCQlmRm9yZWdyb3VuZENvbG9yLnNldExheW91dERhdGEoZ2QpOwotCQlmRm9yZWdyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCYWNrZ3JvdW5kTGFiZWwgPSBjcmVhdGVMYWJlbChlZGl0Q29udHJvbHMsIFNTRVVJTWVzc2FnZXMuQmFja2dyb3VuZF9VSV8pOwotCQkoKEdyaWREYXRhKSBmQmFja2dyb3VuZExhYmVsLmdldExheW91dERhdGEoKSkudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuQ0VOVEVSOwotCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IgPSBuZXcgQ29sb3JTZWxlY3RvcihlZGl0Q29udHJvbHMpOwotCQlCdXR0b24gZkJhY2tncm91bmRDb2xvciA9IGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0QnV0dG9uKCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotCQlmQmFja2dyb3VuZENvbG9yLnNldExheW91dERhdGEoZ2QpOwotCQlmQmFja2dyb3VuZENvbG9yRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZCb2xkID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBYTUxVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV8zKTsKLQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZCb2xkLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmSXRhbGljID0gY3JlYXRlQ2hlY2tib3goZWRpdENvbnRyb2xzLCBYTUxVSU1lc3NhZ2VzLlN5bnRheENvbG9yaW5nUGFnZV80KTsKLQkJZkl0YWxpYy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJKChHcmlkRGF0YSkgZkl0YWxpYy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlN0cmlrZSA9IGNyZWF0ZUNoZWNrYm94KGVkaXRDb250cm9scywgWE1MVUlNZXNzYWdlcy5TeW50YXhDb2xvcmluZ1BhZ2VfNSk7Ci0JCWZTdHJpa2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCSgoR3JpZERhdGEpIGZTdHJpa2UuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZVbmRlcmxpbmUgPSBjcmVhdGVDaGVja2JveChlZGl0Q29udHJvbHMsIFhNTFVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdQYWdlXzYpOwotCQlmVW5kZXJsaW5lLnNldEVuYWJsZWQoZmFsc2UpOwotCQkoKEdyaWREYXRhKSBmVW5kZXJsaW5lLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmQ2xlYXJTdHlsZSA9IG5ldyBCdXR0b24oZWRpdGluZ0NvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlmQ2xlYXJTdHlsZS5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuUmVzdG9yZV9EZWZhdWx0X1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiUmVzdG9yZSBEZWZhdWx0IgotCQlmQ2xlYXJTdHlsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HKSk7Ci0JCSgoR3JpZERhdGEpIGZDbGVhclN0eWxlLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQlmQ2xlYXJTdHlsZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlDb21wb3NpdGUgc2FtcGxlQXJlYSA9IGNyZWF0ZUNvbXBvc2l0ZShlZGl0b3IsIDEpOwotCi0JCSgoR3JpZExheW91dCkgc2FtcGxlQXJlYS5nZXRMYXlvdXQoKSkubWFyZ2luTGVmdCA9IDU7Ci0JCSgoR3JpZExheW91dCkgc2FtcGxlQXJlYS5nZXRMYXlvdXQoKSkubWFyZ2luVG9wID0gNTsKLQkJY3JlYXRlTGFiZWwoc2FtcGxlQXJlYSwgU1NFVUlNZXNzYWdlcy5TYW1wbGVfdGV4dF9fVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICImU2FtcGxlIHRleHQ6IgotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbmV3IFNvdXJjZVZpZXdlcihzYW1wbGVBcmVhLCBudWxsLCBTV1QuQk9SREVSIHwgU1dULkxFRlRfVE9fUklHSFQgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZlRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlHcmlkRGF0YSBncmlkRGF0YTMgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEzLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyMCk7Ci0JCWdyaWREYXRhMy5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJZ3JpZERhdGEzLmhvcml6b250YWxTcGFuID0gMjsKLQkJZlRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YTMpOwotCQlmVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWZUZXh0LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlmVGV4dC5hZGRLZXlMaXN0ZW5lcihnZXRUZXh0S2V5TGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldFRleHRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJZlRleHQuYWRkTW91c2VMaXN0ZW5lcihnZXRUZXh0TW91c2VMaXN0ZW5lcigpKTsKLQkJZlRleHQuYWRkVHJhdmVyc2VMaXN0ZW5lcihnZXRUcmF2ZXJzZUxpc3RlbmVyKCkpOwotCQlzZXRBY2Nlc3NpYmxlKGZUZXh0LCBTU0VVSU1lc3NhZ2VzLlNhbXBsZV90ZXh0X19VSV8pOwotCQlmRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKTsKLQkJZkRvY3VtZW50LnNldChnZXRFeGFtcGxlVGV4dCgpKTsKLQkJdmlld2VyLnNldERvY3VtZW50KGZEb2N1bWVudCk7Ci0KLQkJdG9wLnNldFdlaWdodHMobmV3IGludFtdezEsIDF9KTsKLQkJZWRpdG9yLnNldFdlaWdodHMobmV3IGludFtdezEsIDF9KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYWdlQ29tcG9uZW50LCBJSGVscENvbnRleHRJZHMuWE1MX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQpOwotCi0JCWZTdHlsZXNWaWV3ZXIuc2V0SW5wdXQoZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpKTsKLQotCQlhcHBseVN0eWxlcygpOwotCi0JCWZTdHlsZXNWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIWV2ZW50LmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkgewotCQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkJCQlpZiAobmFtZWRTdHlsZSA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkZvcmVncm91bmRDb2xvckVkaXRvci5hZGRMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKENvbG9yU2VsZWN0b3IuUFJPUF9DT0xPUkNIQU5HRSkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1swXTsKLQkJCQkJCS8vIG9wZW4gY29sb3IgZGlhbG9nIHRvIGdldCBuZXcgY29sb3IKLQkJCQkJCVN0cmluZyBuZXdWYWx1ZSA9IENvbG9ySGVscGVyLnRvUkdCU3RyaW5nKGZGb3JlZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0Q29sb3JWYWx1ZSgpKTsKLQotCQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQkJc3R5bGVQcmVmc1swXSA9IG5ld1ZhbHVlOwotCQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkJhY2tncm91bmRDb2xvckVkaXRvci5hZGRMaXN0ZW5lcihuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKENvbG9yU2VsZWN0b3IuUFJPUF9DT0xPUkNIQU5HRSkpIHsKLQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1sxXTsKLQkJCQkJCS8vIG9wZW4gY29sb3IgZGlhbG9nIHRvIGdldCBuZXcgY29sb3IKLQkJCQkJCVN0cmluZyBuZXdWYWx1ZSA9IENvbG9ySGVscGVyLnRvUkdCU3RyaW5nKGZCYWNrZ3JvdW5kQ29sb3JFZGl0b3IuZ2V0Q29sb3JWYWx1ZSgpKTsKLQotCQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQkJc3R5bGVQcmVmc1sxXSA9IG5ld1ZhbHVlOwotCQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJCQlhY3RpdmF0ZShuYW1lZFN0eWxlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkJvbGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1syXTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZkJvbGQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbMl0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkl0YWxpYy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkvLyBnZXQgY3VycmVudCAobmV3bHkgb2xkKSBzdHlsZQotCQkJCU9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlN0eWxlc1ZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSBvLnRvU3RyaW5nKCk7Ci0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcobmFtZWRTdHlsZSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzNdOwotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBTdHJpbmcudmFsdWVPZihmSXRhbGljLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzNdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUobmFtZWRTdHlsZSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlhcHBseVN0eWxlcygpOwotCQkJCQkJZlRleHQucmVkcmF3KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZTdHJpa2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBuYW1lZFN0eWxlID0gby50b1N0cmluZygpOwotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1s0XTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZlN0cmlrZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJc3R5bGVQcmVmc1s0XSA9IG5ld1ZhbHVlOwotCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFZhbHVlKG5hbWVkU3R5bGUsIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJYXBwbHlTdHlsZXMoKTsKLQkJCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmVW5kZXJsaW5lLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN1cGVyLndpZGdldFNlbGVjdGVkKGUpOwotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IG8udG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldE92ZXJsYXlTdG9yZSgpLmdldFN0cmluZyhuYW1lZFN0eWxlKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbNV07Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGZVbmRlcmxpbmUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQlpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQkJCXN0eWxlUHJlZnNbNV0gPSBuZXdWYWx1ZTsKLQkJCQkJCVN0cmluZyBuZXdQcmVmU3RyaW5nID0gQ29sb3JIZWxwZXIucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVQcmVmcyk7Ci0JCQkJCQlnZXRPdmVybGF5U3RvcmUoKS5zZXRWYWx1ZShuYW1lZFN0eWxlLCBuZXdQcmVmU3RyaW5nKTsKLQkJCQkJCWFwcGx5U3R5bGVzKCk7Ci0JCQkJCQlmVGV4dC5yZWRyYXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkNsZWFyU3R5bGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGZTdHlsZXNWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm47Ci0JCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmU3R5bGVzVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKS50b1N0cmluZygpOwotCQkJCWdldE92ZXJsYXlTdG9yZSgpLnNldFRvRGVmYXVsdChuYW1lZFN0eWxlKTsKLQkJCQlhcHBseVN0eWxlcygpOwotCQkJCWZUZXh0LnJlZHJhdygpOwotCQkJCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gcGFnZUNvbXBvbmVudDsKLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGFiZWwuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0QmFja2dyb3VuZCgpKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8vIHByb3RlY3RlZCBMYWJlbCBjcmVhdGVEZXNjcmlwdGlvbkxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0KLQkvKioKLQkgKiBTZXQgdXAgYWxsIHRoZSBzdHlsZSBwcmVmZXJlbmNlIGtleXMgaW4gdGhlIG92ZXJsYXkgc3RvcmUKLQkgKi8KLQlwcml2YXRlIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUl0ZXJhdG9yIGkgPSBnZXRTdHlsZVByZWZlcmVuY2VLZXlzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgKFN0cmluZykgaS5uZXh0KCkpKTsKLQkJfQotCi0JCU92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGtleXMgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W292ZXJsYXlLZXlzLnNpemUoKV07Ci0JCW92ZXJsYXlLZXlzLnRvQXJyYXkoa2V5cyk7Ci0JCXJldHVybiBrZXlzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIExpc3Qgdmlld2VyIHdoZXJlIHdlIHNlZSB0aGUgdmFyaW91cyBzeW50YXggZWxlbWVudCBkaXNwbGF5Ci0JICogbmFtZXMtLXdvdWxkIGl0IGV2ZXIgYmUgYSBUcmVlIGxpa2UgSkRUJ3M/Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXIgY3JlYXRlU3R5bGVzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RydWN0dXJlZFZpZXdlciBzdHlsZXNWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJc3R5bGVzVmlld2VyLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKSkpOwotCQlzdHlsZXNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCU9iamVjdCBkZXNjcmlwdGlvbiA9IGZTdHlsZVRvRGVzY3JpcHRpb25NYXAuZ2V0KGVsZW1lbnQpOwotCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotCQkJCQlyZXR1cm4gZGVzY3JpcHRpb24udG9TdHJpbmcoKTsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQkJfSk7Ci0JCXN0eWxlc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKS50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldFN0eWxlUHJlZmVyZW5jZUtleXMoKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHN0eWxlc1ZpZXdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQlmT3ZlcmxheVN0b3JlLnN0b3AoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihTdHJpbmcgbmFtZWRTdHlsZSkgewotCQlUZXh0QXR0cmlidXRlIHRhID0gbmV3IFRleHRBdHRyaWJ1dGUoZkRlZmF1bHRGb3JlZ3JvdW5kLCBmRGVmYXVsdEJhY2tncm91bmQsIFNXVC5OT1JNQUwpOwotCi0JCWlmIChuYW1lZFN0eWxlICE9IG51bGwgJiYgZk92ZXJsYXlTdG9yZSAhPSBudWxsKSB7Ci0JCQkvLyBub3RlOiAibmFtZWRTdHlsZSIgKmlzKiB0aGUgcHJlZmVyZW5jZSBrZXkKLQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0T3ZlcmxheVN0b3JlKCkuZ2V0U3RyaW5nKG5hbWVkU3R5bGUpOwotCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCQlSR0IgYmFja2dyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMV0pOwotCi0JCQkJaW50IGZvbnRNb2RpZmllciA9IFNXVC5OT1JNQUw7Ci0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAyKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5CT0xEOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiAzKSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1szXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5JVEFMSUM7Ci0JCQkJfQotCQkJCWlmIChzdHlsZVByZWZzLmxlbmd0aCA+IDQpIHsKLQkJCQkJYm9vbGVhbiBvbiA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzRdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKG9uKQotCQkJCQkJZm9udE1vZGlmaWVyID0gZm9udE1vZGlmaWVyIHwgVGV4dEF0dHJpYnV0ZS5TVFJJS0VUSFJPVUdIOwotCQkJCX0KLQkJCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPiA1KSB7Ci0JCQkJCWJvb2xlYW4gb24gPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1s1XSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChvbikKLQkJCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFRleHRBdHRyaWJ1dGUuVU5ERVJMSU5FOwotCQkJCX0KLQotCQkJCXRhID0gbmV3IFRleHRBdHRyaWJ1dGUoKGZvcmVncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGZvcmVncm91bmQpIDogbnVsbCwgKGJhY2tncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGJhY2tncm91bmQpIDogbnVsbCwgZm9udE1vZGlmaWVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGE7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RXhhbXBsZVRleHQoKSB7Ci0JCXJldHVybiBYTUxVSU1lc3NhZ2VzLlNhbXBsZV9YTUxfZG9jOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE5hbWVkU3R5bGVBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCS8vIGVuc3VyZSB0aGUgb2Zmc2V0IGlzIGNsZWFuCi0JCWlmIChvZmZzZXQgPj0gZkRvY3VtZW50LmdldExlbmd0aCgpKQotCQkJcmV0dXJuIGdldE5hbWVkU3R5bGVBdE9mZnNldChmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJZWxzZSBpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybiBnZXROYW1lZFN0eWxlQXRPZmZzZXQoMCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBmRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJd2hpbGUgKGRvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgIWRvY3VtZW50UmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCWRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0TmV4dCgpOwotCQl9Ci0JCWlmIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBmaW5kIHRoZSBJVGV4dFJlZ2lvbidzIENvbnRleHQgYXQgdGhpcyBvZmZzZXQKLQkJCUlUZXh0UmVnaW9uIGludGVyZXN0ID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChpbnRlcmVzdCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKG9mZnNldCA+IGRvY3VtZW50UmVnaW9uLmdldFRleHRFbmRPZmZzZXQoaW50ZXJlc3QpKQotCQkJCXJldHVybiBudWxsOwotCQkJU3RyaW5nIHJlZ2lvbkNvbnRleHQgPSBpbnRlcmVzdC5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uQ29udGV4dCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJLy8gZmluZCB0aGUgbmFtZWQgc3R5bGUgKGludGVybmFsL3NlbGVjdGFibGUgbmFtZSkgZm9yIHRoYXQKLQkJCS8vIGNvbnRleHQKLQkJCVN0cmluZyBuYW1lZFN0eWxlID0gKFN0cmluZykgZkNvbnRleHRUb1N0eWxlTWFwLmdldChyZWdpb25Db250ZXh0KTsKLQkJCWlmIChuYW1lZFN0eWxlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmFtZWRTdHlsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZ2V0T3ZlcmxheVN0b3JlKCkgewotCQlyZXR1cm4gZk92ZXJsYXlTdG9yZTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0U3R5bGVQcmVmZXJlbmNlS2V5cygpIHsKLQkJaWYgKGZTdHlsZVByZWZlcmVuY2VLZXlzID09IG51bGwpIHsKLQkJCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSKTsKLQkJCXN0eWxlcy5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCQlzdHlsZXMuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQpOwotCQkJc3R5bGVzLmFkZChJU3R5bGVDb25zdGFudHNYTUwuRU5USVRZX1JFRkVSRU5DRSk7Ci0JCQlmU3R5bGVQcmVmZXJlbmNlS2V5cyA9IHN0eWxlczsKLQkJfQotCQlyZXR1cm4gZlN0eWxlUHJlZmVyZW5jZUtleXM7Ci0JfQotCi0JcHJpdmF0ZSBLZXlMaXN0ZW5lciBnZXRUZXh0S2V5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb3VzZUxpc3RlbmVyIGdldFRleHRNb3VzZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vdXNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZ2V0VGV4dFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KGUueCk7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQkoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24oZS54KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KGUueCk7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQkoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24oZS54KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmF2ZXJzZUxpc3RlbmVyIGdldFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhdmVyc2VMaXN0ZW5lcigpIHsKLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXIja2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWlmICgoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9ORVhUKSB8fCAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUykpCi0JCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCXNldERlc2NyaXB0aW9uKFNTRVVJTWVzc2FnZXMuU3ludGF4Q29sb3JpbmdfRGVzY3JpcHRpb24pOwotCi0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCWluaXRTdHlsZVRvRGVzY3JpcHRpb25NYXAoKTsKLQkJaW5pdFJlZ2lvbkNvbnRleHRUb1N0eWxlTWFwKCk7Ci0KLQkJZk92ZXJsYXlTdG9yZSA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlKGdldFByZWZlcmVuY2VTdG9yZSgpLCBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkpOwotCQlmT3ZlcmxheVN0b3JlLmxvYWQoKTsKLQkJZk92ZXJsYXlTdG9yZS5zdGFydCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0UmVnaW9uQ29udGV4dFRvU3R5bGVNYXAoKSB7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VMRU1FTlRfREVDTEFSQVRJT04sIElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRUxFTUVOVF9ERUNMX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCwgSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhULCBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUik7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ09OVEVOVCwgSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9FTEVNRU5UX0RFQ0xfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCi0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQkxJQywgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JCWZDb250ZXh0VG9TdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYsIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRik7Ci0KLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UpOwotCQlmQ29udGV4dFRvU3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UsIElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFKTsKLQkJZkNvbnRleHRUb1N0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9QRV9SRUZFUkVOQ0UsIElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFN0eWxlVG9EZXNjcmlwdGlvbk1hcCgpIHsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUiwgWE1MVUlNZXNzYWdlcy5DREFUQV9EZWxpbWl0ZXJzX1VJXyk7Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhULCBYTUxVSU1lc3NhZ2VzLkNEQVRBX0NvbnRlbnRfVUlfKTsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUiwgWE1MVUlNZXNzYWdlcy5Qcm9jZXNzaW5nX0luc3RydWN0aW9uX0RlbF9VSV8pOwotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCwgWE1MVUlNZXNzYWdlcy5Qcm9jZXNzaW5nX0luc3RydWN0aW9uX0Nvbl9VSV9fVUlfKTsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLkNvbW1lbnRfRGVsaW1pdGVyc19VSV8pOwotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhULCBYTUxVSU1lc3NhZ2VzLkNvbW1lbnRfQ29udGVudF9VSV8pOwotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUiwgWE1MVUlNZXNzYWdlcy5UYWdfRGVsaW1pdGVyc19VSV8pOwotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUsIFhNTFVJTWVzc2FnZXMuVGFnX05hbWVzX1VJXyk7Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUsIFhNTFVJTWVzc2FnZXMuQXR0cmlidXRlX05hbWVzX1VJXyk7Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLCBYTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9WYWx1ZXNfVUlfKTsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLkRlY2xhcmF0aW9uX0RlbGltaXRlcnNfVUlfKTsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5ULCBYTUxVSU1lc3NhZ2VzLkNvbnRlbnRfVUlfKTsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSwgWE1MVUlNZXNzYWdlcy5ET0NUWVBFX05hbWVfVUlfKTsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQsIFhNTFVJTWVzc2FnZXMuRE9DVFlQRV9TWVNURU1fUFVCTElDX0tleXdfVUlfKTsKLQkJZlN0eWxlVG9EZXNjcmlwdGlvbk1hcC5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGLCBYTUxVSU1lc3NhZ2VzLkRPQ1RZUEVfUHVibGljX1JlZmVyZW5jZV9VSV8pOwotCQlmU3R5bGVUb0Rlc2NyaXB0aW9uTWFwLnB1dChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYsIFhNTFVJTWVzc2FnZXMuRE9DVFlQRV9TeXN0ZW1fUmVmZXJlbmNlX1VJXyk7Ci0JCWZTdHlsZVRvRGVzY3JpcHRpb25NYXAucHV0KElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFLCBYTUxVSU1lc3NhZ2VzLkVudGl0eV9SZWZlcmVuY2VfVUlfKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlnZXRPdmVybGF5U3RvcmUoKS5sb2FkRGVmYXVsdHMoKTsKLQkJYXBwbHlTdHlsZXMoKTsKLQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCWFjdGl2YXRlKG51bGwpOwotCQlmVGV4dC5yZWRyYXcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWdldE92ZXJsYXlTdG9yZSgpLnByb3BhZ2F0ZSgpOwotCi0JCVhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VsZWN0Q29sb3JBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyBuYW1lZFN0eWxlID0gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KG9mZnNldCk7Ci0JCWlmIChuYW1lZFN0eWxlICE9IG51bGwpIHsKLQkJCWZTdHlsZXNWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5hbWVkU3R5bGUpKTsKLQkJCWZTdHlsZXNWaWV3ZXIucmV2ZWFsKG5hbWVkU3R5bGUpOwotCQl9Ci0JCWVsc2UgewotCQkJZlN0eWxlc1ZpZXdlci5zZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCX0KLQkJYWN0aXZhdGUobmFtZWRTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogU3BlY2lmaWNhbGx5IHNldCB0aGUgcmVwb3J0aW5nIG5hbWUgb2YgYSBjb250cm9sIGZvciBhY2Nlc3NpYmlsaXR5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFjY2Vzc2libGUoQ29udHJvbCBjb250cm9sLCBTdHJpbmcgbmFtZSkgewotCQlpZiAoY29udHJvbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmaW5hbCBTdHJpbmcgbiA9IG5hbWU7Ci0JCWNvbnRyb2wuZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJaWYgKGUuY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKQotCQkJCQllLnJlc3VsdCA9IG47Ci0JCQl9Ci0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTBiNTk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotCi0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBYTUwgdGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSB7Ci0KLQljbGFzcyBYTUxFZGl0VGVtcGxhdGVEaWFsb2cgZXh0ZW5kcyBFZGl0VGVtcGxhdGVEaWFsb2cgewotCQlwdWJsaWMgWE1MRWRpdFRlbXBsYXRlRGlhbG9nKFNoZWxsIHBhcmVudCwgVGVtcGxhdGUgdGVtcGxhdGUsIGJvb2xlYW4gZWRpdCwgYm9vbGVhbiBpc05hbWVNb2RpZmlhYmxlLCBDb250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCQlzdXBlcihwYXJlbnQsIHRlbXBsYXRlLCBlZGl0LCBpc05hbWVNb2RpZmlhYmxlLCByZWdpc3RyeSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwoKTsKLQotCQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQkJfQotCi0JCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCQkJfQotCi0JCQkJcHVibGljIElDb250ZW50QXNzaXN0YW50IGdldENvbnRlbnRBc3Npc3RhbnQoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQkJQ29udGVudEFzc2lzdGFudCBhc3Npc3RhbnQgPSBuZXcgQ29udGVudEFzc2lzdGFudCgpOwotCQkJCQlhc3Npc3RhbnQuZW5hYmxlQXV0b0FjdGl2YXRpb24odHJ1ZSk7Ci0JCQkJCWFzc2lzdGFudC5lbmFibGVBdXRvSW5zZXJ0KHRydWUpOwotCQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihnZXRUZW1wbGF0ZVByb2Nlc3NvcigpLCBJRG9jdW1lbnQuREVGQVVMVF9DT05URU5UX1RZUEUpOwotCQkJCQlyZXR1cm4gYXNzaXN0YW50OwotCQkJCX0KLQkJCX07Ci0JCQlyZXR1cm4gZG9DcmVhdGVWaWV3ZXIocGFyZW50LCBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyBYTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlKCkgewotCQlYTUxVSVBsdWdpbiB4bWxFZGl0b3JQbHVnaW4gPSBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0KLQkJc2V0UHJlZmVyZW5jZVN0b3JlKHhtbEVkaXRvclBsdWdpbi5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCXNldFRlbXBsYXRlU3RvcmUoeG1sRWRpdG9yUGx1Z2luLmdldFRlbXBsYXRlU3RvcmUoKSk7Ci0JCXNldENvbnRleHRUeXBlUmVnaXN0cnkoeG1sRWRpdG9yUGx1Z2luLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIGFuY2VzdG9yKSB7Ci0JCUNvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKGFuY2VzdG9yKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjLCBJSGVscENvbnRleHRJZHMuWE1MX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UjY3JlYXRlVmlld2VyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gc291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MKCk7Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGRvQ3JlYXRlVmlld2VyKHBhcmVudCwgc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci0JfQotCi0JU291cmNlVmlld2VyIGRvQ3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gdmlld2VyQ29uZmlndXJhdGlvbikgewotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlSUQgPSBDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MOwotCQl2aWV3ZXIgPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXIocGFyZW50LCBudWxsLCBudWxsLCBmYWxzZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlcikuZ2V0VGV4dFdpZGdldCgpLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udCgib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIpKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZE1vZGVsIHNjcmF0Y2hNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKGNvbnRlbnRUeXBlSUQpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzY3JhdGNoTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXZpZXdlci5jb25maWd1cmUodmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCXZpZXdlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZWRpdCBkaWFsb2cuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUKLQkgKiBhIGN1c3RvbSBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlCi0JICogICAgICAgICAgICB0aGUgdGVtcGxhdGUgYmVpbmcgZWRpdGVkCi0JICogQHBhcmFtIGVkaXQKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGRpYWxvZyBzaG91bGQgYmUgZWRpdGFibGUKLQkgKiBAcGFyYW0gaXNOYW1lTW9kaWZpYWJsZQotCSAqICAgICAgICAgICAgd2hldGhlciB0aGUgdGVtcGxhdGUgbmFtZSBtYXkgYmUgbW9kaWZpZWQKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIG9yIG1vZGlmaWVkIHRlbXBsYXRlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiAgICAgICAgIGVkaXRpb24gZmFpbGVkCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByb3RlY3RlZCBUZW1wbGF0ZSBlZGl0VGVtcGxhdGUoVGVtcGxhdGUgdGVtcGxhdGUsIGJvb2xlYW4gZWRpdCwgYm9vbGVhbiBpc05hbWVNb2RpZmlhYmxlKSB7Ci0JCUVkaXRUZW1wbGF0ZURpYWxvZyBkaWFsb2cgPSBuZXcgWE1MRWRpdFRlbXBsYXRlRGlhbG9nKGdldFNoZWxsKCksIHRlbXBsYXRlLCBlZGl0LCBpc05hbWVNb2RpZmlhYmxlLCBnZXRDb250ZXh0VHlwZVJlZ2lzdHJ5KCkpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXJldHVybiBkaWFsb2cuZ2V0VGVtcGxhdGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UjaXNTaG93Rm9ybWF0dGVyU2V0dGluZygpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaG93Rm9ybWF0dGVyU2V0dGluZygpIHsKLQkJLy8gdGVtcGxhdGUgZm9ybWF0dGluZyBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gb2sgPSBzdXBlci5wZXJmb3JtT2soKTsKLQkJWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gb2s7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFR5cGluZ1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVHlwaW5nUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMwYTdkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVHlwaW5nUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci0gCi1wdWJsaWMgY2xhc3MgWE1MVHlwaW5nUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgQnV0dG9uIGZDbG9zZUNvbW1lbnQ7Ci0JcHJpdmF0ZSBCdXR0b24gZkNsb3NlRW5kVGFnOwotCXByaXZhdGUgQnV0dG9uIGZSZW1vdmVFbmRUYWc7Ci0JCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuWE1MX1BSRUZXRUJYX0ZJTEVTX0hFTFBJRCk7Ci0JCQotCQljcmVhdGVBdXRvQ29tcGxldGUoY29tcG9zaXRlKTsKLQkJY3JlYXRlQXV0b1JlbW92ZShjb21wb3NpdGUpOwotCQkKLQkJc2V0U2l6ZShjb21wb3NpdGUpOwotCQlsb2FkUHJlZmVyZW5jZXMoKTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVBdXRvQ29tcGxldGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0JCQotCQlncm91cC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuWE1MVHlwaW5nX0F1dG9fQ29tcGxldGUpOwotCQkKLQkJZkNsb3NlQ29tbWVudCA9IGNyZWF0ZUNoZWNrQm94KGdyb3VwLCBYTUxVSU1lc3NhZ2VzLlhNTFR5cGluZ19Db21wbGV0ZV9Db21tZW50cyk7Ci0JCSgoR3JpZERhdGEpIGZDbG9zZUNvbW1lbnQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQotCQlmQ2xvc2VFbmRUYWcgPSBjcmVhdGVDaGVja0JveChncm91cCwgWE1MVUlNZXNzYWdlcy5YTUxUeXBpbmdfQ29tcGxldGVfRW5kX1RhZ3MpOwotCQkoKEdyaWREYXRhKSBmQ2xvc2VFbmRUYWcuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQXV0b1JlbW92ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAyKTsKLQkJCi0JCWdyb3VwLnNldFRleHQoWE1MVUlNZXNzYWdlcy5YTUxUeXBpbmdfQXV0b19SZW1vdmUpOwotCQkKLQkJZlJlbW92ZUVuZFRhZyA9IGNyZWF0ZUNoZWNrQm94KGdyb3VwLCBYTUxVSU1lc3NhZ2VzLlhNTFR5cGluZ19SZW1vdmVfRW5kX1RhZ3MpOwotCQkoKEdyaWREYXRhKSBmUmVtb3ZlRW5kVGFnLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0JCQotCQlYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQlpbml0Q2hlY2tib3goZkNsb3NlQ29tbWVudCwgWE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0NPTU1FTlRTKTsKLQkJaW5pdENoZWNrYm94KGZDbG9zZUVuZFRhZywgWE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0VORF9UQUdTKTsKLQkJaW5pdENoZWNrYm94KGZSZW1vdmVFbmRUYWcsIFhNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19SRU1PVkVfRU5EX1RBR1MpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWRlZmF1bHRDaGVja2JveChmQ2xvc2VDb21tZW50LCBYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfQ09NTUVOVFMpOwotCQlkZWZhdWx0Q2hlY2tib3goZkNsb3NlRW5kVGFnLCBYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfRU5EX1RBR1MpOwotCQlkZWZhdWx0Q2hlY2tib3goZlJlbW92ZUVuZFRhZywgWE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX1JFTU9WRV9FTkRfVEFHUyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0Q2hlY2tib3goQnV0dG9uIGJveCwgU3RyaW5nIGtleSkgewotCQlpZihib3ggIT0gbnVsbCAmJiBrZXkgIT0gbnVsbCkKLQkJCWJveC5zZXRTZWxlY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihrZXkpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRlZmF1bHRDaGVja2JveChCdXR0b24gYm94LCBTdHJpbmcga2V5KSB7Ci0JCWlmKGJveCAhPSBudWxsICYmIGtleSAhPSBudWxsKQotCQkJYm94LnNldFNlbGVjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0Qm9vbGVhbihrZXkpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19DT01QTEVURV9DT01NRU5UUywgKGZDbG9zZUNvbW1lbnQgIT0gbnVsbCkgPyBmQ2xvc2VDb21tZW50LmdldFNlbGVjdGlvbigpIDogZmFsc2UpOwotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfRU5EX1RBR1MsIChmQ2xvc2VFbmRUYWcgIT0gbnVsbCkgPyBmQ2xvc2VFbmRUYWcuZ2V0U2VsZWN0aW9uKCkgOiBmYWxzZSk7Ci0JCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19SRU1PVkVfRU5EX1RBR1MsIChmUmVtb3ZlRW5kVGFnICE9IG51bGwpID8gZlJlbW92ZUVuZFRhZy5nZXRTZWxlY3Rpb24oKSA6IGZhbHNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFVJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQyOTRiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEJlbmphbWluIE11c2thbGxhLCBiLm11c2thbGxhQGdteC5uZXQgLSBbMTU4NjYwXSBjaGFyYWN0ZXIgZW50aXRpZXMgc2hvdWxkIGhhdmUgdGhlaXIgb3duIHN5bnRheCBoaWdobGlnaHRpbmcgcHJlZmVyZW5jZSAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5Db2xvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi0vKioKLSAqIFNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIFhNTCBVSSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgWE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlDb2xvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRUaGVtZU1hbmFnZXIoKS5nZXRDdXJyZW50VGhlbWUoKS5nZXRDb2xvclJlZ2lzdHJ5KCk7Ci0KLQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KFhNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFLCAiPD06Iik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MDk0NgotCQlzdG9yZS5zZXREZWZhdWx0KFhNTFVJUHJlZmVyZW5jZU5hbWVzLlNVR0dFU1RJT05fU1RSQVRFR1ksIFhNTFVJUHJlZmVyZW5jZU5hbWVzLlNVR0dFU1RJT05fU1RSQVRFR1lfVkFMVUVfU1RSSUNUKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5VU0VfSU5GRVJSRURfR1JBTU1BUiwgdHJ1ZSk7Ci0KLQkJLy8gWE1MIFN0eWxlIFByZWZlcmVuY2VzCi0JCVN0cmluZyBOT0JBQ0tHUk9VTkRCT0xEID0gIiB8IG51bGwgfCBmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIEpVU1RJVEFMSUMgPSAiIHwgbnVsbCB8IGZhbHNlIHwgdHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FLCAxMjcsIDAsIDEyNykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSwgNDIsIDAsIDI1NSkgKyBKVVNUSVRBTElDOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gIm51bGwiICsgTk9CQUNLR1JPVU5EQk9MRDsgLy8kTk9OLU5MUy0xJAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUywgc3R5bGVWYWx1ZSk7IC8vIHNwZWNpZmllZAotCQkvLyB2YWx1ZQotCQkvLyBpcwotCQkvLyBibGFjazsKLQkJLy8gbGVhdmluZwotCQkvLyBhcwotCQkvLyB3aWRnZXQKLQkJLy8gZGVmYXVsdAotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIsIDYzLCA5NSwgMTkxKSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSLCBzdHlsZVZhbHVlKTsKLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQsIDYzLCA5NSwgMTkxKSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUiwgMCwgMTI4LCAxMjgpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FLCAwLCAwLCAxMjgpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FLCBzdHlsZVZhbHVlKTsKLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRiwgMCwgMCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQsIDEyOCwgMTI4LCAxMjgpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRiwgNjMsIDEyNywgOTUpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSAibnVsbCIgKyBOT0JBQ0tHUk9VTkRCT0xEOyAvLyROT04tTkxTLTEkCi0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5ULCBzdHlsZVZhbHVlKTsgLy8gc3BlY2lmaWVkCi0JCS8vIHZhbHVlCi0JCS8vIGlzCi0JCS8vIGJsYWNrOwotCQkvLyBsZWF2aW5nCi0JCS8vIGFzCi0JCS8vIHdpZGdldAotCQkvLyBkZWZhdWx0Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSLCAwLCAxMjgsIDEyOCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FLCA2MywgMTI3LCAxMjcpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5maW5kUkdCU3RyaW5nKHJlZ2lzdHJ5LCBJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSLCAwLCAxMjgsIDEyOCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSAibnVsbCIgKyBOT0JBQ0tHUk9VTkRCT0xEOyAvLyROT04tTkxTLTEkCi0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQsIHN0eWxlVmFsdWUpOyAvLyBzcGVjaWZpZWQKLQkJLy8gdmFsdWUKLQkJLy8gaXMKLQkJLy8gYmxhY2s7Ci0JCS8vIGxlYXZpbmcKLQkJLy8gYXMKLQkJLy8gd2lkZ2V0Ci0JCS8vIGRlZmF1bHQKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUiwgMCwgMTI4LCAxMjgpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZmluZFJHQlN0cmluZyhyZWdpc3RyeSwgSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQsIDAsIDAsIDApICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmZpbmRSR0JTdHJpbmcocmVnaXN0cnksIElTdHlsZUNvbnN0YW50c1hNTC5FTlRJVFlfUkVGRVJFTkNFLCA0MiwgMCwgMjU1KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UsIHN0eWxlVmFsdWUpOwotCQkKLQkJLy8gc2V0IGRlZmF1bHQgbmV3IHhtbCBmaWxlIHRlbXBsYXRlIHRvIHVzZSBpbiBuZXcgZmlsZSB3aXphcmQKLQkJLyoKLQkJICogTmVlZCB0byBmaW5kIHRlbXBsYXRlIG5hbWUgdGhhdCBnb2VzIHdpdGggZGVmYXVsdCB0ZW1wbGF0ZSBpZCAobmFtZQotCQkgKiBtYXkgY2hhbmdlIGZvciBkaWZmZXJudCBsYW5ndWFnZSkKLQkJICovCi0JCVN0cmluZyB0ZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCkuZmluZFRlbXBsYXRlQnlJZCgib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMueG1sZGVjbGFyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkKLQkJCXRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5ORVdfRklMRV9URU1QTEFURV9OQU1FLCB0ZW1wbGF0ZU5hbWUpOwotCQkKLQkJLy8gRGVmYXVsdHMgZm9yIHRoZSBUeXBpbmcgcHJlZmVyZW5jZSBwYWdlCi0JCXN0b3JlLnNldERlZmF1bHQoWE1MVUlQcmVmZXJlbmNlTmFtZXMuVFlQSU5HX0NPTVBMRVRFX0NPTU1FTlRTLCB0cnVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5UWVBJTkdfQ09NUExFVEVfRU5EX1RBR1MsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KFhNTFVJUHJlZmVyZW5jZU5hbWVzLlRZUElOR19SRU1PVkVfRU5EX1RBR1MsIHRydWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFVJUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVUlQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcxYTdhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVUlQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIGtleXMgZm9yIFhNTCBVSQotICovCi1wdWJsaWMgY2xhc3MgWE1MVUlQcmVmZXJlbmNlTmFtZXMgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VHR0VTVElPTl9TVFJBVEVHWV9WQUxVRV9MQVggPSAiTGF4IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNVR0dFU1RJT05fU1RSQVRFR1lfVkFMVUVfU1RSSUNUID0gIlN0cmljdCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBjb250cm9scyBpZiBjb2RlIGFzc2lzdCBnZXRzIGF1dG8gYWN0aXZhdGVkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fUFJPUE9TRSA9IGdldEF1dG9Qcm9wb3NlS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXV0b1Byb3Bvc2VLZXkoKSB7Ci0JCXJldHVybiAiYXV0b1Byb3Bvc2UiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBob2xkcyB0aGUgY2hhcmFjdGVycyB0aGF0IGF1dG8gYWN0aXZhdGUgY29kZQotCSAqIGFzc2lzdC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uIEFsbCBjaGFyYWN0ZXJzIHRoYXQgdHJpZ2dlcgotCSAqIGF1dG8gY29kZSBhc3Npc3QuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fUFJPUE9TRV9DT0RFID0gZ2V0QXV0b1Byb3Bvc2VDb2RlS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXV0b1Byb3Bvc2VDb2RlS2V5KCkgewotCQlyZXR1cm4gImF1dG9Qcm9wb3NlQ29kZSI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgY3VzdG9taXplZCB0ZW1wbGF0ZXMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURVNfS0VZID0gZ2V0VGVtcGxhdGVzS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGVtcGxhdGVzS2V5KCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY3VzdG9tX3RlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBjb250cm9scyB3aGV0aGVyIG9yIGdyYW1tYXIgc2hvdWxkIGJlIGluZmVycmVkCi0JICogb3Igbm90LgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9JTkZFUlJFRF9HUkFNTUFSID0gZ2V0VXNlSW5mZXJyZWRHcmFtbWFyS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VXNlSW5mZXJyZWRHcmFtbWFyS2V5KCkgewotCQlyZXR1cm4gInVzZUluZmVycmVkR3JhbW1hciI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBob2xkcyB0aGUgY2hhcmFjdGVycyB0aGF0IGF1dG8gYWN0aXZhdGUgY29kZQotCSAqIGFzc2lzdC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uIEFsbCBjaGFyYWN0ZXJzIHRoYXQgdHJpZ2dlcgotCSAqIGF1dG8gY29kZSBhc3Npc3QuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVR0dFU1RJT05fU1RSQVRFR1kgPSBnZXRTdWdnZXN0aW9uU3RyYXRlZ2V5S2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3VnZ2VzdGlvblN0cmF0ZWdleUtleSgpIHsKLQkJcmV0dXJuICJzdWdnZXN0aW9uU3RyYXRlZ3kiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBuZXcgRFREIGZpbGUgd2l6YXJkLgotCSAqIFRlbXBsYXRlIG5hbWUgaXMgc3RvcmVkIGluc3RlYWQgb2YgdGVtcGxhdGUgaWQgYmVjYXVzZSB1c2VyLWNyZWF0ZWQKLQkgKiB0ZW1wbGF0ZXMgZG8gbm90IGhhdmUgdGVtcGxhdGUgaWRzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSA9ICJuZXdGaWxlVGVtcGxhdGVOYW1lIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgdGhlIG9wdGlvbiBmb3IgYXV0by1jb21wbGV0aW5nIGNvbW1lbnRzIHdoaWxlCi0JICogdHlwaW5nLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUElOR19DT01QTEVURV9DT01NRU5UUyA9ICJjb21wbGV0ZUNvbW1lbnRzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgdGhlIG9wdGlvbiBmb3IgYXV0by1jb21wbGV0aW5nIGVuZC10YWdzIGFmdGVyIGVudGVyaW5nCi0JICogPGNvZGU+Jmx0Oy88L2NvZGU+Ci0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQSU5HX0NPTVBMRVRFX0VORF9UQUdTID0gImNvbXBsZXRlRW5kVGFncyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIHRoZSBvcHRpb24gZm9yIHJlbW92aW5nIGFuIGVuZC10YWcgaWYgdGhlIHN0YXJ0IHRhZyBpcwotCSAqIGNvbnZlcnRlZCB0byBhbiBlbXB0eS10YWcuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQSU5HX1JFTU9WRV9FTkRfVEFHUyA9ICJyZW1vdmVFbmRUYWdzIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNDE1ZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDb250YWlucyBhIHNldCBvZiBwcm9qZWN0aW9uIG1vZGVsIGFkZGl0aW9ucy9kZWxldGlvbnMvbW9kaWZpY2F0aW9ucwotICovCi1jbGFzcyBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgbG9jYXRlZCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JcHJpdmF0ZSBOb2RlIGZOb2RlOwotCXByaXZhdGUgQW5ub3RhdGlvbltdIGZEZWxldGlvbnM7Ci0JcHJpdmF0ZSBNYXAgZkFkZGl0aW9uczsKLQlwcml2YXRlIEFubm90YXRpb25bXSBmTW9kaWZpY2F0aW9uczsKLQotCXB1YmxpYyBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhOb2RlIG5vZGUsIEFubm90YXRpb25bXSBkZWxldGlvbnMsIE1hcCBhZGRpdGlvbnMsIEFubm90YXRpb25bXSBtb2RpZmljYXRpb25zKSB7Ci0JCWZOb2RlID0gbm9kZTsKLQkJZkRlbGV0aW9ucyA9IGRlbGV0aW9uczsKLQkJZkFkZGl0aW9ucyA9IGFkZGl0aW9uczsKLQkJZk1vZGlmaWNhdGlvbnMgPSBtb2RpZmljYXRpb25zOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0QWRkaXRpb25zKCkgewotCQlyZXR1cm4gZkFkZGl0aW9uczsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbltdIGdldERlbGV0aW9ucygpIHsKLQkJcmV0dXJuIGZEZWxldGlvbnM7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb25bXSBnZXRNb2RpZmljYXRpb25zKCkgewotCQlyZXR1cm4gZk1vZGlmaWNhdGlvbnM7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIGZOb2RlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMDJmNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MIGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0JLyoqCi0JICogTGlzdCBvZiBwcm9qZWN0aW9uIHZpZXdlcnMgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb2plY3Rpb24KLQkgKiBtb2RlbCBub2RlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZlByb2plY3Rpb25WaWV3ZXJzOwotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTCgpIHsKLQkJc3VwZXIoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwuY2xhc3MsIHRydWUpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlclhNTCBhZGFwdGVyID0gbnVsbDsKLQotCQkvLyBjcmVhdGUgYWRhcHRlciBmb3IgZXZlcnkgZWxlbWVudCB0YWcKLQkJaWYgKChpc0FjdGl2ZSgpKSAmJiAodGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkgJiYgKCgoTm9kZSkgdGFyZ2V0KS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSkgewotCQkJYWRhcHRlciA9IG5ldyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlclhNTCh0aGlzKTsKLQkJCWFkYXB0ZXIudXBkYXRlQWRhcHRlcigoTm9kZSkgdGFyZ2V0KTsKLQkJfQotCi0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgZmFjdG9yeSBpcyBjdXJyZW50bHkgYWN0aXZlbHkgbWFuYWdpbmcgcHJvamVjdGlvbgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGlzQWN0aXZlKCkgewotCQlyZXR1cm4gKChmUHJvamVjdGlvblZpZXdlcnMgIT0gbnVsbCkgJiYgIWZQcm9qZWN0aW9uVmlld2Vycy5pc0VtcHR5KCkpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGlmIGRvY3VtZW50IGlzIG5vdCBpbiBmbHV4LgotCSAqIE90aGVyd2lzZSwgcXVldWVzIHVwIHRoZSBjaGFuZ2VzIHRvIGJlIGFwcGxpZWQgd2hlbiBkb2N1bWVudCBpcyByZWFkeS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBkZWxldGlvbnMKLQkgKiBAcGFyYW0gYWRkaXRpb25zCi0JICogQHBhcmFtIG1vZGlmaWNhdGlvbnMKLQkgKi8KLQl2b2lkIHF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhOb2RlIG5vZGUsIEFubm90YXRpb25bXSBkZWxldGlvbnMsIE1hcCBhZGRpdGlvbnMsIEFubm90YXRpb25bXSBtb2RpZmljYXRpb25zKSB7Ci0JCXF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhub2RlLCBkZWxldGlvbnMsIGFkZGl0aW9ucywgbW9kaWZpY2F0aW9ucywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgZm9yIGEgc3BlY2lmaWMgcHJvamVjdGlvbiB2aWV3ZXIgaWYKLQkgKiBkb2N1bWVudCBpcyBub3QgaW4gZmx1eC4gT3RoZXJ3aXNlLCBxdWV1ZXMgdXAgdGhlIGNoYW5nZXMgdG8gYmUgYXBwbGllZAotCSAqIHdoZW4gZG9jdW1lbnQgaXMgcmVhZHkuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gZGVsZXRpb25zCi0JICogQHBhcmFtIGFkZGl0aW9ucwotCSAqIEBwYXJhbSBtb2RpZmljYXRpb25zCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXZvaWQgcXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKE5vZGUgbm9kZSwgQW5ub3RhdGlvbltdIGRlbGV0aW9ucywgTWFwIGFkZGl0aW9ucywgQW5ub3RhdGlvbltdIG1vZGlmaWNhdGlvbnMsIFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIGNyZWF0ZSBhIGNoYW5nZSBvYmplY3QgZm9yIGxhdGVzdCBjaGFuZ2UgYW5kIGFkZCB0byBxdWV1ZQotCQlQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyBuZXdDaGFuZ2UgPSBuZXcgUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMobm9kZSwgZGVsZXRpb25zLCBhZGRpdGlvbnMsIG1vZGlmaWNhdGlvbnMpOwotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwpIHsKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbikgZlByb2plY3Rpb25WaWV3ZXJzLmdldCh2aWV3ZXIpOwotCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJaW5mby5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobmV3Q2hhbmdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJdGVyYXRvciBpbmZvcyA9IGZQcm9qZWN0aW9uVmlld2Vycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpbmZvcy5oYXNOZXh0KCkpIHsKLQkJCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBpbmZvcy5uZXh0KCk7Ci0JCQkJCWluZm8ucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5ld0NoYW5nZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gZ28gdGhyb3VnaCBldmVyeSBwcm9qZWN0aW9udmlld2VyIGFuZCBjYWxsCi0JCS8vIHJlbW92ZVByb2plY3Rpb25WaWV3ZXIodmlld2VyKTsKLQkJaWYgKGZQcm9qZWN0aW9uVmlld2VycyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpbmZvcyA9IGZQcm9qZWN0aW9uVmlld2Vycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGluZm9zLmhhc05leHQoKSkgewotCQkJCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbikgaW5mb3MubmV4dCgpOwotCQkJCWluZm8uZGlzcG9zZSgpOwotCQkJCWluZm9zLnJlbW92ZSgpOwotCQkJfQotCQkJZlByb2plY3Rpb25WaWV3ZXJzID0gbnVsbDsKLQkJfQotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB2aWV3ZXIgdG8gbGlzdCBvZiBwcm9qZWN0aW9uIHZpZXdlcnMgdGhpcyBmYWN0b3J5IGlzIGFzc29jaWF0ZWQKLQkgKiB3aXRoCi0JICogCi0JICogQHBhcmFtIHZpZXdlciAtCi0JICogICAgICAgICAgICBhc3N1bWVzIHZpZXdlcidzIGRvY3VtZW50IGFuZCBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwKLQkgKiAgICAgICAgICAgIGFyZSBub3QgbnVsbAotCSAqLwotCXZvaWQgYWRkUHJvamVjdGlvblZpZXdlcihQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQkvLyByZW1vdmUgb2xkIGVudHJ5IGlmIGl0IGV4aXN0cwotCQlyZW1vdmVQcm9qZWN0aW9uVmlld2VyKHZpZXdlcik7Ci0KLQkJaWYgKGZQcm9qZWN0aW9uVmlld2VycyA9PSBudWxsKSB7Ci0JCQlmUHJvamVjdGlvblZpZXdlcnMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJLy8gY3JlYXRlIG5ldyBvYmplY3QgY29udGFpbmluZyBwcm9qZWN0aW9uIHZpZXdlciBhbmQgaXRzIGluZm8KLQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSBuZXcgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKHZpZXdlcik7Ci0JCWZQcm9qZWN0aW9uVmlld2Vycy5wdXQodmlld2VyLCBpbmZvKTsKLQkJaW5mby5pbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gdmlld2VyIGZyb20gdGhlIGxpc3Qgb2YgcHJvamVjdGlvbiB2aWV3ZXJzIHRoaXMKLQkgKiBmYWN0b3IgaXMgYXNzb2NpYXRlZCB3aXRoCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXZvaWQgcmVtb3ZlUHJvamVjdGlvblZpZXdlcihQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwpIHsKLQkJCS8vIHJlbW92ZSBlbnRyeSBmcm9tIGxpc3Qgb2Ygdmlld2VycwotCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBmUHJvamVjdGlvblZpZXdlcnMucmVtb3ZlKHZpZXdlcik7Ci0JCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJaW5mby5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQkvLyBpZiByZW1vdmluZyBsYXN0IHByb2plY3Rpb24gdmlld2VyLCBjbGVhciBvdXQgZXZlcnl0aGluZwotCQkJaWYgKGZQcm9qZWN0aW9uVmlld2Vycy5pc0VtcHR5KCkpIHsKLQkJCQlmUHJvamVjdGlvblZpZXdlcnMgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZTM3OWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBVcGRhdGVzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCB3aXRoIHByb2plY3Rpb24gYW5ub3RhdGlvbnMgZm9yIHRoaXMKLSAqIGFkYXB0ZXIgbm9kZSdzIGNoaWxkcmVuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlclhNTCBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1Byb2plY3Rpb25QZXJmID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC54bWwudWkvcHJvamVjdGlvbnBlcmYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBjbGFzcyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBleHRlbmRzIFByb2plY3Rpb25Bbm5vdGF0aW9uIHsKLQkJcHJpdmF0ZSBib29sZWFuIGZJc1Zpc2libGUgPSBmYWxzZTsgLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJcHJpdmF0ZSBOb2RlIGZOb2RlOwotCi0JCXB1YmxpYyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbihOb2RlIG5vZGUsIGJvb2xlYW4gaXNDb2xsYXBzZWQpIHsKLQkJCXN1cGVyKGlzQ29sbGFwc2VkKTsKLQkJCWZOb2RlID0gbm9kZTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gZk5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXROb2RlKE5vZGUgbm9kZSkgewotCQkJZk5vZGUgPSBub2RlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIERvZXMgbm90IHBhaW50IGhpZGRlbiBhbm5vdGF0aW9ucy4gQW5ub3RhdGlvbnMgYXJlIGhpZGRlbiB3aGVuIHRoZXkKLQkJICogb25seSBzcGFuIG9uZSBsaW5lLgotCQkgKiAKLQkJICogQHNlZSBQcm9qZWN0aW9uQW5ub3RhdGlvbiNwYWludChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsCi0JCSAqICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgQ2FudmFzIGNhbnZhcywgUmVjdGFuZ2xlIHJlY3RhbmdsZSkgewotCQkJLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJCS8qCi0JCQkgKiBvbmx5IG5lZWQgdG8gY2hlY2sgYW5ub3RhdGlvbnMgdGhhdCBhcmUgZXhwYW5kZWQgYmVjYXVzZSBoaWRkZW4KLQkJCSAqIGFubm90YXRpb25zIHNob3VsZCBuZXZlciBoYXZlIGJlZW4gZ2l2ZW4gdGhlIGNoYW5jZSB0bwotCQkJICogY29sbGFwc2UuCi0JCQkgKi8KLQkJCWlmICghaXNDb2xsYXBzZWQoKSkgewotCQkJCS8vIHdvcmtpbmcgd2l0aCByZWN0YW5nbGUsIHNvIGxpbmUgaGVpZ2h0Ci0JCQkJRm9udE1ldHJpY3MgbWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCQkJaWYgKG1ldHJpY3MgIT0gbnVsbCkgewotCQkJCQkvLyBkbyBub3QgZHJhdyBhbm5vdGF0aW9ucyB0aGF0IG9ubHkgc3BhbiBvbmUgbGluZSBhbmQKLQkJCQkJLy8gbWFyayB0aGVtIGFzIG5vdCB2aXNpYmxlCi0JCQkJCWlmICgocmVjdGFuZ2xlLmhlaWdodCAvIG1ldHJpY3MuZ2V0SGVpZ2h0KCkpIDw9IDEpIHsKLQkJCQkJCWZJc1Zpc2libGUgPSBmYWxzZTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZJc1Zpc2libGUgPSB0cnVlOwotCQkJc3VwZXIucGFpbnQoZ2MsIGNhbnZhcywgcmVjdGFuZ2xlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbiNtYXJrQ29sbGFwc2VkKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1hcmtDb2xsYXBzZWQoKSB7Ci0JCQkvKiB3b3JrYXJvdW5kIGZvciBCVUc4NTg3NCAqLwotCQkJLy8gZG8gbm90IG1hcmsgY29sbGFwc2VkIGlmIGFubm90YXRpb24gaXMgbm90IHZpc2libGUKLQkJCWlmIChmSXNWaXNpYmxlKSB7Ci0JCQkJc3VwZXIubWFya0NvbGxhcHNlZCgpOwotCQkJfQotCQl9Ci0JfQotCi0JUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MIGZBZGFwdGVyRmFjdG9yeTsKLQlwcml2YXRlIE1hcCBmVGFnQW5ub3RhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyWE1MKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTCBmYWN0b3J5KSB7Ci0JCWZBZGFwdGVyRmFjdG9yeSA9IGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgcHJvamVjdGlvbiBwb3NpdGlvbiBmcm9tIHRoZSBnaXZlbiBub2RlLiBBYmxlIHRvIGdldAotCSAqIHByb2plY3Rpb24gcG9zaXRpb24gaWYgbm9kZSBpc05vZGVQcm9qZWN0YWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gbnVsbCBpZiBubyBwcm9qZWN0aW9uIHBvc2l0aW9uIHBvc3NpYmxlLCBhIFBvc2l0aW9uIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgUG9zaXRpb24gY3JlYXRlUHJvamVjdGlvblBvc2l0aW9uKE5vZGUgbm9kZSkgewotCQlQb3NpdGlvbiBwb3MgPSBudWxsOwotCQlpZiAoaXNOb2RlUHJvamVjdGFibGUobm9kZSkgJiYgKG5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSkgewotCQkJLy8gSURvY3VtZW50IGRvY3VtZW50ID0KLQkJCS8vIGZBZGFwdGVyRmFjdG9yeS5nZXRQcm9qZWN0aW9uVmlld2VyKCkuZ2V0RG9jdW1lbnQoKTsKLQkJCS8vIGlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJbmRleGVkUmVnaW9uIGlub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCQlpbnQgc3RhcnQgPSBpbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGVuZCA9IGlub2RlLmdldEVuZE9mZnNldCgpOwotCQkJaWYgKChzdGFydCA+PSAwKSAmJiAoc3RhcnQgPCBlbmQpKSB7Ci0JCQkJLy8gcmVnaW9uLWJhc2VkCi0JCQkJLy8gZXh0cmEgbGluZSB3aGVuIGNvbGxhcHNlZCwgYnV0IG5vIHJlZ2lvbiBpbmNyZWFzZSB3aGVuIGFkZAotCQkJCS8vIG5ld2xpbmUKLQkJCQlwb3MgPSBuZXcgUG9zaXRpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQkJCQkvLyB0cnkgewotCQkJCS8vIC8vIGxpbmUtYmFzZWQKLQkJCQkvLyAvLyBleHRyYSBsaW5lIHdoZW4gY29sbGFwc2VkLCBidXQgbm8gcmVnaW9uIGluY3JlYXNlIHdoZW4KLQkJCQkvLyBhZGQgbmV3bGluZQotCQkJCS8vIElSZWdpb24gc3RhcnRMaW5lUmVnaW9uID0KLQkJCQkvLyBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChzdGFydCk7Ci0JCQkJLy8gSVJlZ2lvbiBlbmRMaW5lUmVnaW9uID0KLQkJCQkvLyBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChlbmQpOwotCQkJCS8vIGludCBzdGFydE9mZnNldCA9IHN0YXJ0TGluZVJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCQkvLyBpbnQgZW5kT2Zmc2V0ID0gZW5kTGluZVJlZ2lvbi5nZXRPZmZzZXQoKSArCi0JCQkJLy8gZW5kTGluZVJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQkvLyBpZiAoZW5kT2Zmc2V0ID4gc3RhcnRPZmZzZXQpIHsKLQkJCQkvLyBwb3MgPSBuZXcgUG9zaXRpb24oc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0KTsKLQkJCQkvLyB9Ci0KLQkJCQkvLyAvLyBsaW5lLWJhc2VkCi0JCQkJLy8gLy8gbm8gZXh0cmEgbGluZSB3aGVuIGNvbGxhcHNlZCwgYnV0IHJlZ2lvbiBpbmNyZWFzZSB3aGVuCi0JCQkJLy8gYWRkIG5ld2xpbmUKLQkJCQkvLyBpbnQgc3RhcnRMaW5lID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkvLyBpbnQgZW5kTGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChlbmQpOwotCQkJCS8vIGlmIChlbmRMaW5lICsgMSA8IGRvY3VtZW50LmdldE51bWJlck9mTGluZXMoKSkgewotCQkJCS8vIGludCBvZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KHN0YXJ0TGluZSk7Ci0JCQkJLy8gaW50IGVuZE9mZnNldCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQoZW5kTGluZSArIDEpOwotCQkJCS8vIHBvcyA9IG5ldyBQb3NpdGlvbihvZmZzZXQsIGVuZE9mZnNldCAtIG9mZnNldCk7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCS8vIExvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIG51bGwsIHgpOwotCQkJCS8vIH0KLQkJCX0KLQkJCS8vIH0KLQkJfQotCQlyZXR1cm4gcG9zOwotCX0KLQotCS8qKgotCSAqIEZpbmQgVGFnUHJvamVjdGlvbkFubm90YXRpb24gZm9yIG5vZGUgaW4gdGhlIGN1cnJlbnQgbGlzdCBvZiBwcm9qZWN0aW9uCi0JICogYW5ub3RhdGlvbnMgZm9yIHRoaXMgYWRhcHRlcgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybiBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbgotCSAqLwotCXByaXZhdGUgVGFnUHJvamVjdGlvbkFubm90YXRpb24gZ2V0RXhpc3RpbmdBbm5vdGF0aW9uKE5vZGUgbm9kZSkgewotCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBhbm5vID0gbnVsbDsKLQotCQlpZiAoKG5vZGUgIT0gbnVsbCkgJiYgKCFmVGFnQW5ub3RhdGlvbnMuaXNFbXB0eSgpKSkgewotCQkJSXRlcmF0b3IgaXQgPSBmVGFnQW5ub3RhdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkgJiYgKGFubm8gPT0gbnVsbCkpIHsKLQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBhID0gKFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJTm9kZSBuID0gYS5nZXROb2RlKCk7Ci0JCQkJaWYgKG5vZGUuZXF1YWxzKG4pKSB7Ci0JCQkJCWFubm8gPSBhOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYW5ubzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlID09IFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyWE1MLmNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBub2RlIGlzIGEgbm9kZSB0eXBlIGFibGUgdG8gZm9sZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybiBib29sZWFuIHRydWUgaWYgbm9kZSBpcyBwcm9qZWN0YWJsZSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTm9kZVByb2plY3RhYmxlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCS8vIGNoZWNrIGlmIGZvbGRpbmcgaXMgZXZlbiBlbmFibGVkLCBpZiBub3QsIGp1c3QgaWdub3JlIG5vdGlmeUNoYW5nZWQKLQkJLy8gZXZlbnRzCi0JCWlmICghZkFkYXB0ZXJGYWN0b3J5LmlzQWN0aXZlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICgoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQpICYmIChub3RpZmllciBpbnN0YW5jZW9mIE5vZGUpKSB7Ci0JCQl1cGRhdGVBZGFwdGVyKChOb2RlKSBub3RpZmllcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHByb2plY3Rpb24gYW5ub3RhdGlvbiBvZiBhbGwgdGhlIG5vZGVzIHRoYXQgYXJlIGNoaWxkcmVuIG9mCi0JICogbm9kZQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0Jdm9pZCB1cGRhdGVBZGFwdGVyKE5vZGUgbm9kZSkgewotCQl1cGRhdGVBZGFwdGVyKG5vZGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG9mIGFsbCB0aGUgbm9kZXMgdGhhdCBhcmUgY2hpbGRyZW4gb2YKLQkgKiBub2RlIGFuZCBhZGRzIGFsbCBwcm9qZWN0aW9uIGFubm90YXRpb25zIHRvIHZpZXdlciAoZm9yIG5ld2x5IGFkZGVkCi0JICogdmlld2VycykKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQl2b2lkIHVwZGF0ZUFkYXB0ZXIoTm9kZSBub2RlLCBQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJTWFwIGFkZGl0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCU1hcCBwcm9qZWN0aW9uQW5ub3RhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCS8vIGdvIHRocm91Z2ggaW1tZWRpYXRlIGNoaWxkIG5vZGVzIGFuZCBmaWd1cmUgb3V0IHByb2plY3Rpb24KLQkJLy8gbW9kZWwgYW5ub3RhdGlvbnMKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJTm9kZSBjaGlsZE5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChjaGlsZE5vZGUgIT0gbnVsbCkgewotCQkJCVBvc2l0aW9uIG5ld1BvcyA9IGNyZWF0ZVByb2plY3Rpb25Qb3NpdGlvbihjaGlsZE5vZGUpOwotCQkJCWlmIChuZXdQb3MgIT0gbnVsbCkgewotCQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uID0gbmV3IFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKGNoaWxkTm9kZSwgZmFsc2UpOwotCQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBleGlzdGluZyA9IGdldEV4aXN0aW5nQW5ub3RhdGlvbihjaGlsZE5vZGUpOwotCQkJCQlpZiAoZXhpc3RpbmcgPT0gbnVsbCkgewotCQkJCQkJLy8gYWRkIHRvIG1hcCBjb250YWluaW5nIGFsbCBhbm5vdGF0aW9ucyBmb3IgdGhpcwotCQkJCQkJLy8gYWRhcHRlcgotCQkJCQkJcHJvamVjdGlvbkFubm90YXRpb25zLnB1dChuZXdBbm5vdGF0aW9uLCBuZXdQb3MpOwotCQkJCQkJLy8gYWRkIHRvIG1hcCBjb250YWluaW5nIGFubm90YXRpb25zIHRvIGFkZAotCQkJCQkJYWRkaXRpb25zLnB1dChuZXdBbm5vdGF0aW9uLCBuZXdQb3MpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gYWRkIHRvIG1hcCBjb250YWluaW5nIGFsbCBhbm5vdGF0aW9ucyBmb3IgdGhpcwotCQkJCQkJLy8gYWRhcHRlcgotCQkJCQkJcHJvamVjdGlvbkFubm90YXRpb25zLnB1dChleGlzdGluZywgbmV3UG9zKTsKLQkJCQkJCS8vIHJlbW92ZSBmcm9tIG1hcCBjb250YWluaW5nIGFubm90YXRpb25zIHRvIGRlbGV0ZQotCQkJCQkJZlRhZ0Fubm90YXRpb25zLnJlbW92ZShleGlzdGluZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2hpbGROb2RlID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0KLQkJCS8vIGluIHRoZSBlbmQsIHdhbnQgdG8gZGVsZXRlIGFueXRoaW5nIGxlZnRvdmVyIGluIG9sZCBsaXN0LCBhZGQKLQkJCS8vIGV2ZXJ5dGhpbmcgaW4gYWRkaXRpb25zLCBhbmQgdXBkYXRlIGV2ZXJ5dGhpbmcgaW4KLQkJCS8vIHByb2plY3Rpb25Bbm5vdGF0aW9ucwotCQkJUHJvamVjdGlvbkFubm90YXRpb25bXSBvbGRMaXN0ID0gbnVsbDsKLQkJCWlmICghZlRhZ0Fubm90YXRpb25zLmlzRW1wdHkoKSkgewotCQkJCW9sZExpc3QgPSAoUHJvamVjdGlvbkFubm90YXRpb25bXSkgZlRhZ0Fubm90YXRpb25zLmtleVNldCgpLnRvQXJyYXkobmV3IFByb2plY3Rpb25Bbm5vdGF0aW9uWzBdKTsKLQkJCX0KLQkJCVByb2plY3Rpb25Bbm5vdGF0aW9uW10gbW9kaWZ5TGlzdCA9IG51bGw7Ci0JCQlpZiAoIXByb2plY3Rpb25Bbm5vdGF0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQltb2RpZnlMaXN0ID0gKFByb2plY3Rpb25Bbm5vdGF0aW9uW10pIHByb2plY3Rpb25Bbm5vdGF0aW9ucy5rZXlTZXQoKS50b0FycmF5KG5ldyBQcm9qZWN0aW9uQW5ub3RhdGlvblswXSk7Ci0JCQl9Ci0KLQkJCS8vIHNwZWNpZmljYWxseSBhZGQgYWxsIGFubm90YXRpb25zIHRvIHZpZXdlcgotCQkJaWYgKCh2aWV3ZXIgIT0gbnVsbCkgJiYgIXByb2plY3Rpb25Bbm5vdGF0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQlmQWRhcHRlckZhY3RvcnkucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5vZGUsIG51bGwsIHByb2plY3Rpb25Bbm5vdGF0aW9ucywgbnVsbCwgdmlld2VyKTsKLQkJCX0KLQotCQkJLy8gb25seSB1cGRhdGUgd2hlbiB0aGVyZSBpcyBzb21ldGhpbmcgdG8gdXBkYXRlCi0JCQlpZiAoKChvbGRMaXN0ICE9IG51bGwpICYmIChvbGRMaXN0Lmxlbmd0aCA+IDApKSB8fCAoIWFkZGl0aW9ucy5pc0VtcHR5KCkpIHx8ICgobW9kaWZ5TGlzdCAhPSBudWxsKSAmJiAobW9kaWZ5TGlzdC5sZW5ndGggPiAwKSkpIHsKLQkJCQlmQWRhcHRlckZhY3RvcnkucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5vZGUsIG9sZExpc3QsIGFkZGl0aW9ucywgbW9kaWZ5TGlzdCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBzYXZlIG5ldyBsaXN0IG9mIGFubm90YXRpb25zCi0JCWZUYWdBbm5vdGF0aW9ucyA9IHByb2plY3Rpb25Bbm5vdGF0aW9uczsKLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN0cmluZyBub2RlTmFtZSA9IG5vZGUgIT0gbnVsbCA/IG5vZGUuZ2V0Tm9kZU5hbWUoKSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlclhNTC51cGRhdGVBZGFwdGVyICgiICsgbm9kZU5hbWUgKyAiKToiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRjY2ZmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgcHJvamVjdGlvbiB2aWV3ZXIgYW5kIGFsc28gbWFuYWdlcyB1cGRhdGluZwotICogdGhlIHZpZXdlcidzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbAotICovCi1jbGFzcyBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGxvY2F0ZWQgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCi0JLyoqCi0JICogTGlzdGVucyB0byBkb2N1bWVudCB0byBiZSBhd2FyZSBvZiB3aGVuIHRvIHVwZGF0ZSB0aGUgcHJvamVjdGlvbgotCSAqIGFubm90YXRpb24gbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBEb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgSURvY3VtZW50TGlzdGVuZXIgewotCQlwcml2YXRlIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBmSW5mbzsKLQotCQlwdWJsaWMgRG9jdW1lbnRMaXN0ZW5lcihQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbykgewotCQkJZkluZm8gPSBpbmZvOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGV2ZW50LmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZkluZm8uZ2V0RG9jdW1lbnQoKSA9PSBkb2N1bWVudCkgewotCQkJCWZJbmZvLnNldElzRG9jdW1lbnRDaGFuZ2luZyh0cnVlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyByZWdpc3RlciBhIHBvc3Qgbm90aWZpY2F0aW9uIHJlcGxhY2Ugc28gdGhhdCBwcm9qZWN0aW9uCi0JCQkvLyBhbm5vdGF0aW9uIG1vZGVsIHdpbGwgYmUgdXBkYXRlZCBhZnRlciBhbGwgZG9jdW1lbnRDaGFuZ2VkCi0JCQkvLyBsaXN0ZW5lcnMgaGF2ZSBiZWVuIG5vdGlmaWVkCi0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBldmVudC5nZXREb2N1bWVudCgpOwotCQkJaWYgKChkb2N1bWVudCBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbikgJiYgKGZJbmZvLmdldERvY3VtZW50KCkgPT0gZG9jdW1lbnQpKSB7Ci0JCQkJaWYgKGZJbmZvLmhhc0NoYW5nZXNRdWV1ZWQoKSkgewotCQkJCQkoKElEb2N1bWVudEV4dGVuc2lvbikgZG9jdW1lbnQpLnJlZ2lzdGVyUG9zdE5vdGlmaWNhdGlvblJlcGxhY2UodGhpcywgbmV3IFBvc3REb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmSW5mbykpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEVzc2VudGlhbGx5IGEgcG9zdCBkb2N1bWVudCBjaGFuZ2VkIGxpc3RlbmVyIGJlY2F1c2UgaXQgaXMgY2FsbGVkIGFmdGVyCi0JICogZG9jdW1lbnRjaGFuZ2VkIGhhcyBiZWVuIGZpcmVkLgotCSAqLwotCXByaXZhdGUgY2xhc3MgUG9zdERvY3VtZW50Q2hhbmdlZExpc3RlbmVyIGltcGxlbWVudHMgSURvY3VtZW50RXh0ZW5zaW9uLklSZXBsYWNlIHsKLQkJcHJpdmF0ZSBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gZkluZm87Ci0KLQkJcHVibGljIFBvc3REb2N1bWVudENoYW5nZWRMaXN0ZW5lcihQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbykgewotCQkJZkluZm8gPSBpbmZvOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGVyZm9ybShJRG9jdW1lbnQgZG9jdW1lbnQsIElEb2N1bWVudExpc3RlbmVyIG93bmVyKSB7Ci0JCQlmSW5mby5hcHBseUFubm90YXRpb25Nb2RlbENoYW5nZXMoKTsKLQkJCWZJbmZvLnNldElzRG9jdW1lbnRDaGFuZ2luZyhmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgY3VycmVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9qZWN0aW9uCi0JICogdmlld2VyCi0JICovCi0JcHJpdmF0ZSBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsIGZQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsOwotCS8qKgotCSAqIERvY3VtZW50IGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9qZWN0aW9uIHZpZXdlcgotCSAqLwotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQkvKioKLQkgKiBMaXN0ZW5lciB0byBmUHJvamVjdGlvblZpZXdlcidzIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBJRG9jdW1lbnRMaXN0ZW5lciBmRG9jdW1lbnRMaXN0ZW5lcjsKLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgZG9jdW1lbnQgaXMgaW4gdGhlIG1pZGRsZSBvZiBjaGFuZ2luZwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmSXNEb2N1bWVudENoYW5naW5nID0gZmFsc2U7Ci0JLyoqCi0JICogTGlzdCBvZiBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgY2hhbmdlcyB0aGF0IG5lZWQgdG8gYmUgYXBwbGllZAotCSAqLwotCXByaXZhdGUgTGlzdCBmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXM7Ci0KLQlwdWJsaWMgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCWZEb2N1bWVudCA9IHZpZXdlci5nZXREb2N1bWVudCgpOwotCQlmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCA9IHZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCk7Ci0JfQotCi0JSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcygpIHsKLQkJaWYgKGZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcyA9PSBudWxsKSB7Ci0JCQlmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlczsKLQl9Ci0KLQl2b2lkIHNldElzRG9jdW1lbnRDaGFuZ2luZyhib29sZWFuIGNoYW5naW5nKSB7Ci0JCWZJc0RvY3VtZW50Q2hhbmdpbmcgPSBjaGFuZ2luZzsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEb2N1bWVudENoYW5naW5nKCkgewotCQlyZXR1cm4gZklzRG9jdW1lbnRDaGFuZ2luZzsKLQl9Ci0KLQkvKioKLQkgKiBBcHBsaWVzIHRoZSBwZW5kaW5nIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBjaGFuZ2VzIHRvIHRoZQotCSAqIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbC4KLQkgKi8KLQl2b2lkIGFwcGx5QW5ub3RhdGlvbk1vZGVsQ2hhbmdlcygpIHsKLQkJTGlzdCBxdWV1ZWRDaGFuZ2VzID0gZ2V0UXVldWVkQW5ub3RhdGlvbkNoYW5nZXMoKTsKLQkJLy8gZ28gdGhyb3VnaCBhbGwgdGhlIHBlbmRpbmcgYW5ub3RhdGlvbiBjaGFuZ2VzIGFuZCBhcHBseQotCQkvLyB0aGVtIHRvCi0JCS8vIHRoZSBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwKLQkJd2hpbGUgKCFxdWV1ZWRDaGFuZ2VzLmlzRW1wdHkoKSkgewotCQkJUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMgY2hhbmdlcyA9IChQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcykgcXVldWVkQ2hhbmdlcy5yZW1vdmUoMCk7Ci0JCQl0cnkgewotCQkJCWZQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsLm1vZGlmeUFubm90YXRpb25zKGNoYW5nZXMuZ2V0RGVsZXRpb25zKCksIGNoYW5nZXMuZ2V0QWRkaXRpb25zKCksIGNoYW5nZXMuZ2V0TW9kaWZpY2F0aW9ucygpKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcsIGxvZyBpdCBiZSBjb250aW51ZQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYW5ub3RhdGlvbiBjaGFuZ2VzIHF1ZXVlZCB1cCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBoYXNDaGFuZ2VzUXVldWVkKCkgewotCQlyZXR1cm4gIWdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCkuaXNFbXB0eSgpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGlmIGRvY3VtZW50IGlzIG5vdCBpbiBmbHV4LgotCSAqIE90aGVyd2lzZSwgcXVldWVzIHVwIHRoZSBjaGFuZ2VzIHRvIGJlIGFwcGxpZWQgd2hlbiBkb2N1bWVudCBpcyByZWFkeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBxdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMoUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMgbmV3Q2hhbmdlKSB7Ci0JCS8qCi0JCSAqIGZ1dHVyZV9UT0RPOiBtYXliZSBpbXByb3ZlIGJ5IGNoZWNraW5nIGlmIGFubm90YXRpb24gcHJvamVjdGlvbgotCQkgKiBtb2RlbCBjaGFuZ2UgYWxyZWFkeSBleGlzdHMgZm9yIG5vZGUuIGlmIHNvLCB0aHJvdyBvdXQgb2xkIGNoYW5nZS4KLQkJICovCi0JCWdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCkuYWRkKG5ld0NoYW5nZSk7Ci0KLQkJLy8gaWYgZG9jdW1lbnQgaXNuJ3QgY2hhbmdpbmcsIGdvIGFoZWFkIGFuZCBhcHBseSBpdAotCQlpZiAoIWlzRG9jdW1lbnRDaGFuZ2luZygpKSB7Ci0JCQlhcHBseUFubm90YXRpb25Nb2RlbENoYW5nZXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCS8vIGFkZCBkb2N1bWVudCBsaXN0ZW5lcgotCQlpZiAoZkRvY3VtZW50TGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50TGlzdGVuZXIgPSBuZXcgRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlnZXREb2N1bWVudCgpLmFkZERvY3VtZW50TGlzdGVuZXIoZkRvY3VtZW50TGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIHJlbW92ZSBkb2N1bWVudCBsaXN0ZW5lcgotCQlpZiAoZkRvY3VtZW50TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJZ2V0RG9jdW1lbnQoKS5yZW1vdmVEb2N1bWVudExpc3RlbmVyKGZEb2N1bWVudExpc3RlbmVyKTsKLQkJfQotCi0JCS8vIGNsZWFyIG91dCBsaXN0IG9mIHF1ZXVlZCBjaGFuZ2VzIHNpbmNlIGl0IG1heSBubyBsb25nZXIKLQkJLy8gYmUgYWNjdXJhdGUKLQkJaWYgKGZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcyAhPSBudWxsKSB7Ci0JCQlmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMuY2xlYXIoKTsKLQkJCWZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcyA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9TdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcwNDdiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9TdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5JUHJvamVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb24uSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBVcGRhdGVzIHRoZSBwcm9qZWN0aW9uIG1vZGVsIG9mIGEgc3RydWN0dXJlZCBtb2RlbCBmb3IgWE1MLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJYTUwgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIsIElQcm9qZWN0aW9uTGlzdGVuZXIsIElUZXh0SW5wdXRMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1Byb2plY3Rpb25QZXJmID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC54bWwudWkvcHJvamVjdGlvbnBlcmYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgUHJvamVjdGlvblZpZXdlciBmVmlld2VyOwotCXByaXZhdGUgYm9vbGVhbiBmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQkvKioKLQkgKiBNYXhpbXVtIG51bWJlciBvZiBjaGlsZCBub2RlcyB0byBhZGQgYWRhcHRlcnMgdG8gKGxpbWl0IGZvciBwZXJmb3JtYW5jZQotCSAqIHNha2UpCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX0NISUxEUkVOID0gMTA7Ci0JLyoqCi0JICogTWF4aW11bSBudW1iZXIgb2Ygc2libGluZyBub2RlcyB0byBhZGQgYWRhcHRlcnMgdG8gKGxpbWl0IGZvcgotCSAqIHBlcmZvcm1hbmNlIHNha2UpCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX1NJQkxJTkdTID0gMTAwMDsKLQotCS8qKgotCSAqIEFkZHMgYW4gYWRhcHRlciB0byBub2RlIGFuZCBpdHMgY2hpbGRyZW4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBjaGlsZExldmVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEFkYXB0ZXJUb05vZGVBbmRDaGlsZHJlbihOb2RlIG5vZGUsIGludCBjaGlsZExldmVsKSB7Ci0JCS8vIHN0b3AgYWRkaW5nIGluaXRpYWwgYWRhcHRlcnMgTUFYX0NISUxEUkVOIGxldmVscyBkZWVwIGZvcgotCQkvLyBwZXJmb3JtYW5jZSBzYWtlCi0JCWlmICgobm9kZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpICYmIChjaGlsZExldmVsIDwgTUFYX0NISUxEUkVOKSkgewotCQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBub2RlOwotCi0JCQkvLyB0cnkgYW5kIGdldCB0aGUgYWRhcHRlciBmb3IgdGhlIGN1cnJlbnQgbm9kZSBhbmQgdXBkYXRlIHRoZQotCQkJLy8gYWRhcHRlciB3aXRoIHByb2plY3Rpb24gaW5mb3JtYXRpb24KLQkJCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyWE1MIGFkYXB0ZXIgPSAoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwpIG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlclhNTC5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlci51cGRhdGVBZGFwdGVyKG5vZGUsIGZWaWV3ZXIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8ganVzdCBjYWxsIGdldGFkYXB0ZXIgc28gdGhlIGFkYXB0ZXIgaXMgY3JlYXRlZCBhbmQKLQkJCQkvLyBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVkCi0JCQkJbm90aWZpZXIuZ2V0QWRhcHRlckZvcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlclhNTC5jbGFzcyk7Ci0JCQl9Ci0JCQlpbnQgc2libGluZ0xldmVsID0gMDsKLQkJCU5vZGUgbmV4dENoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAoKG5leHRDaGlsZCAhPSBudWxsKSAmJiAoc2libGluZ0xldmVsIDwgTUFYX1NJQkxJTkdTKSkgewotCQkJCU5vZGUgY2hpbGROb2RlID0gbmV4dENoaWxkOwotCQkJCW5leHRDaGlsZCA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCQkJYWRkQWRhcHRlclRvTm9kZUFuZENoaWxkcmVuKGNoaWxkTm9kZSwgY2hpbGRMZXZlbCArIDEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR29lcyB0aHJvdWdoIGV2ZXJ5IG5vZGUgYW5kIGFkZHMgYW4gYWRhcHRlciBvbnRvIGVhY2ggZm9yIHRyYWNraW5nCi0JICogcHVycG9zZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQWxsQWRhcHRlcnMoKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJCQlJbmRleGVkUmVnaW9uIHN0YXJ0Tm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0T2Zmc2V0KTsKLQkJCQkJaWYgKHN0YXJ0Tm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJCWludCBzaWJsaW5nTGV2ZWwgPSAwOwotCQkJCQkJTm9kZSBuZXh0U2libGluZyA9IChOb2RlKSBzdGFydE5vZGU7Ci0JCQkJCQl3aGlsZSAoKG5leHRTaWJsaW5nICE9IG51bGwpICYmIChzaWJsaW5nTGV2ZWwgPCBNQVhfU0lCTElOR1MpKSB7Ci0JCQkJCQkJTm9kZSBjdXJyZW50Tm9kZSA9IG5leHRTaWJsaW5nOwotCQkJCQkJCW5leHRTaWJsaW5nID0gY3VycmVudE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkJCQkJCWFkZEFkYXB0ZXJUb05vZGVBbmRDaGlsZHJlbihjdXJyZW50Tm9kZSwgMCk7Ci0JCQkJCQkJKytzaWJsaW5nTGV2ZWw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJYTUwuYWRkQWxsQWRhcHRlcnM6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlYTUwgdG8gdXNlIHdpdGggdGhpcyBwcm92aWRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTAotCSAqLwotCXByaXZhdGUgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MIGdldEFkYXB0ZXJGYWN0b3J5KGJvb2xlYW4gY3JlYXRlSWZOZWVkZWQpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTCBmYWN0b3J5ID0gbnVsbDsKLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeSA9IHNNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQotCQkJCQkvLyBnZXR0aW5nIHRoZSBwcm9qZWN0aW9ubW9kZWxub2RlYWRhcHRlciBmb3IgdGhlIGZpcnN0Ci0JCQkJCS8vIHRpbWUKLQkJCQkJLy8gc28gZG8gc29tZSBpbml0aWFsaXppbmcKLQkJCQkJaWYgKCFmYWN0b3J5UmVnaXN0cnkuY29udGFpbnMoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwuY2xhc3MpICYmIGNyZWF0ZUlmTmVlZGVkKSB7Ci0JCQkJCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlYTUwgbmV3RmFjdG9yeSA9IG5ldyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlYTUwoKTsKLQotCQkJCQkJLy8gYWRkIGZhY3RvcnkgdG8gZmFjdG9yeSByZWdpc3RyeQotCQkJCQkJZmFjdG9yeVJlZ2lzdHJ5LmFkZEZhY3RvcnkobmV3RmFjdG9yeSk7Ci0KLQkJCQkJCS8vIGFkZCBmYWN0b3J5IHRvIHByb3BvZ2F0aW5nIGFkYXB0ZXIKLQkJCQkJCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIHNNb2RlbDsKLQkJCQkJCURvY3VtZW50IGRvY3VtZW50ID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJCVByb3BhZ2F0aW5nQWRhcHRlciBwcm9wYWdhdGluZ0FkYXB0ZXIgPSAoUHJvcGFnYXRpbmdBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCQkJCQlpZiAocHJvcGFnYXRpbmdBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCQlwcm9wYWdhdGluZ0FkYXB0ZXIuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkobmV3RmFjdG9yeSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyB0cnkgYW5kIGdldCB0aGUgZmFjdG9yeQotCQkJCQlmYWN0b3J5ID0gKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTCkgZmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwuY2xhc3MpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyWE1MLmdldEFkYXB0ZXJGYWN0b3J5OiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoaXMgcHJvdmlkZXIgd2l0aCB0aGUgY29ycmVjdCBkb2N1bWVudC4gQXNzdW1lcyBwcm9qZWN0aW9uCi0JICogaXMgZW5hYmxlZC4gKG90aGVyd2lzZSwgb25seSBpbnN0YWxsIHdvdWxkIGhhdmUgYmVlbiBjYWxsZWQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaWYgKCFpc0luc3RhbGxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCS8vIGNsZWFyIG91dCBvbGQgaW5mbwotCQlwcm9qZWN0aW9uRGlzYWJsZWQoKTsKLQotCQlmRG9jdW1lbnQgPSBmVmlld2VyLmdldERvY3VtZW50KCk7Ci0KLQkJLy8gc2V0IHByb2plY3Rpb24gdmlld2VyIG9uIG5ldyBkb2N1bWVudCdzIGFkYXB0ZXIgZmFjdG9yeQotCQlpZiAoZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkgIT0gbnVsbCkgewotCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MIGZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSh0cnVlKTsKLQkJCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlmYWN0b3J5LmFkZFByb2plY3Rpb25WaWV3ZXIoZlZpZXdlcik7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xOTgzMDQKLQkJCQkvLyBkaXNhYmxlIHJlZHJhdyB3aGlsZSBhZGRpbmcgYWxsIGFkYXB0ZXJzCi0JCQkJZlZpZXdlci5zZXRSZWRyYXcoZmFsc2UpOwotCQkJCWFkZEFsbEFkYXB0ZXJzKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlmVmlld2VyLnNldFJlZHJhdyh0cnVlKTsKLQkJCX0KLQkJfQotCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJYTUwuaW5pdGlhbGl6ZTogIiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBc3NvY2lhdGUgYSBQcm9qZWN0aW9uVmlld2VyIHdpdGggdGhpcyBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgbm90IG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIHVuaW5zdGFsbCBiZWZvcmUgdHJ5aW5nIHRvIGluc3RhbGwgbmV3IHZpZXdlcgotCQlpZiAoaXNJbnN0YWxsZWQoKSkgewotCQkJdW5pbnN0YWxsKCk7Ci0JCX0KLQkJZlZpZXdlciA9IHZpZXdlcjsKLQkJZlZpZXdlci5hZGRQcm9qZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZWaWV3ZXIuYWRkVGV4dElucHV0TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5zdGFsbGVkKCkgewotCQlyZXR1cm4gZlZpZXdlciAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb2plY3Rpb25EaXNhYmxlZCgpIHsKLQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MIGZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeShmYWxzZSk7Ci0JCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCWZhY3RvcnkucmVtb3ZlUHJvamVjdGlvblZpZXdlcihmVmlld2VyKTsKLQkJfQotCi0JCS8vIGNsZWFyIG91dCBhbGwgYW5ub3RhdGlvbnMKLQkJaWYgKGZWaWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpICE9IG51bGwpIHsKLQkJCWZWaWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpLnJlbW92ZUFsbEFubm90YXRpb25zKCk7Ci0JCX0KLQotCQlyZW1vdmVBbGxBZGFwdGVycygpOwotCi0JCWZEb2N1bWVudCA9IG51bGw7Ci0JCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb2plY3Rpb25FbmFibGVkKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbiBhZGFwdGVyIGZyb20gbm9kZSBhbmQgaXRzIGNoaWxkcmVuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQWRhcHRlckZyb21Ob2RlQW5kQ2hpbGRyZW4oTm9kZSBub2RlLCBpbnQgbGV2ZWwpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIG5vZGU7Ci0KLQkJCS8vIHRyeSBhbmQgZ2V0IHRoZSBhZGFwdGVyIGZvciB0aGUgY3VycmVudCBub2RlIGFuZCByZW1vdmUgaXQKLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyWE1MLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlub3RpZmllci5yZW1vdmVBZGFwdGVyKGFkYXB0ZXIpOwotCQkJfQotCi0JCQlOb2RlIG5leHRDaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKG5leHRDaGlsZCAhPSBudWxsKSB7Ci0JCQkJTm9kZSBjaGlsZE5vZGUgPSBuZXh0Q2hpbGQ7Ci0JCQkJbmV4dENoaWxkID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCQlyZW1vdmVBZGFwdGVyRnJvbU5vZGVBbmRDaGlsZHJlbihjaGlsZE5vZGUsIGxldmVsICsgMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHb2VzIHRocm91Z2ggZXZlcnkgbm9kZSBhbmQgcmVtb3ZlcyBhZGFwdGVyIGZyb20gZWFjaCBmb3IgY2xlYW51cAotCSAqIHB1cnBvc2VzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUFsbEFkYXB0ZXJzKCkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBzdGFydE5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE9mZnNldCk7Ci0JCQkJCWlmIChzdGFydE5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQlOb2RlIG5leHRTaWJsaW5nID0gKE5vZGUpIHN0YXJ0Tm9kZTsKLQkJCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBudWxsKSB7Ci0JCQkJCQkJTm9kZSBjdXJyZW50Tm9kZSA9IG5leHRTaWJsaW5nOwotCQkJCQkJCW5leHRTaWJsaW5nID0gY3VycmVudE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkJCQkJCXJlbW92ZUFkYXB0ZXJGcm9tTm9kZUFuZENoaWxkcmVuKGN1cnJlbnROb2RlLCAwKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyWE1MLnJlbW92ZUFsbEFkYXB0ZXJzOiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCS8vIGlmIGZvbGRpbmcgaXMgZW5hYmxlZCBhbmQgbmV3IGRvY3VtZW50IGlzIGdvaW5nIHRvIGJlIGEgdG90YWxseQotCQkvLyBkaWZmZXJlbnQgZG9jdW1lbnQsIGRpc2FibGUgcHJvamVjdGlvbgotCQlpZiAoKGZEb2N1bWVudCAhPSBudWxsKSAmJiAoZkRvY3VtZW50ICE9IG5ld0lucHV0KSkgewotCQkJLy8gZGlzYWJsZSBwcm9qZWN0aW9uIGFuZCBkaXNjb25uZWN0IGV2ZXJ5dGhpbmcKLQkJCXByb2plY3Rpb25EaXNhYmxlZCgpOwotCQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCS8vIGlmIHByb2plY3Rpb24gd2FzIHByZXZpb3VzbHkgZW5hYmxlZCBiZWZvcmUgaW5wdXQgZG9jdW1lbnQgY2hhbmdlZAotCQkvLyBhbmQgbmV3IGRvY3VtZW50IGlzIGRpZmZlcmVudCB0aGFuIG9sZCBkb2N1bWVudAotCQlpZiAoZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkICYmIChmRG9jdW1lbnQgPT0gbnVsbCkgJiYgKG5ld0lucHV0ICE9IG51bGwpKSB7Ci0JCQlwcm9qZWN0aW9uRW5hYmxlZCgpOwotCQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNjb25uZWN0IHRoaXMgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyIGZyb20gcHJvamVjdGlvbiB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCWlmIChpc0luc3RhbGxlZCgpKSB7Ci0JCQlwcm9qZWN0aW9uRGlzYWJsZWQoKTsKLQotCQkJZlZpZXdlci5yZW1vdmVQcm9qZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQlmVmlld2VyLnJlbW92ZVRleHRJbnB1dExpc3RlbmVyKHRoaXMpOwotCQkJZlZpZXdlciA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9FbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9FbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YmQ5ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBiZSB1c2VkIGZvciBwcm9wZXJ0aWVzIHdoaWNoIHJlcXVpcmUgYSBjb21ibyBib3ggY2VsbAotICogZWRpdG9yIGFuZCB3aG9zZSB2YWx1ZXMgY29uc2lzdCBvZiBhIGxpc3Qgb2YgZW51bWVyYXRlZCBzdHJpbmdzLgotICovCi1wdWJsaWMgY2xhc3MgRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvciBleHRlbmRzIFByb3BlcnR5RGVzY3JpcHRvciB7Ci0JcHJvdGVjdGVkIFN0cmluZ0NvbWJvQm94Q2VsbEVkaXRvciBmRWRpdG9yOwotCXByb3RlY3RlZCBDb21wb3NpdGUgZlBhcmVudDsKLQotCS8qKgotCSAqIFRoZSBlbnVtZXJhdGVkIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIGRlc2NyaWJlZCBwcm9wZXJ0eQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZlZhbHVlc1tdID0gbnVsbDsKLQotCXB1YmxpYyBFbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBpZCwgU3RyaW5nIG5ld0Rpc3BsYXlOYW1lLCBTdHJpbmdbXSB2YWx1ZXNBcnJheSkgewotCQlzdXBlcihpZCwgbmV3RGlzcGxheU5hbWUpOwotCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKSBpZCk7Ci0JCWZWYWx1ZXMgPSB2YWx1ZXNBcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGNlbGwgZWRpdG9yIGZvciBlZGl0aW5nIHRoaXMgcHJvcGVydHkuCi0JICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGVkaXRhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgd2lkZ2V0IGZvciB0aGUgY2VsbCBlZGl0b3IKLQkgKiBAcmV0dXJuIHRoZSBjZWxsIGVkaXRvciBmb3IgdGhpcyBwcm9wZXJ0eSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgICAgICAgIHRoaXMgcHJvcGVydHkgY2Fubm90IGJlIGVkaXRlZAotCSAqLwotCXB1YmxpYyBDZWxsRWRpdG9yIGNyZWF0ZVByb3BlcnR5RWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhIENlbGwgRWRpdG9yIHdpdGggYSB2YWxpZCBDb250cm9sCi0JCS8vIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQuCi0JCS8vIElmIGFueSBvZiB0aGF0J3Mgbm90IHRydWUsIGNyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IENlbGwgRWRpdG9yCi0JCWlmICgoZkVkaXRvciA9PSBudWxsKSB8fCAoZkVkaXRvci5nZXRDb250cm9sKCkgPT0gbnVsbCkgfHwgZkVkaXRvci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpIHx8IChwYXJlbnQgIT0gZlBhcmVudCkpIHsKLQkJCWZFZGl0b3IgPSBuZXcgU3RyaW5nQ29tYm9Cb3hDZWxsRWRpdG9yKHBhcmVudCwgZlZhbHVlcyk7Ci0JCX0KLQkJZlBhcmVudCA9IHBhcmVudDsKLQkJcmV0dXJuIGZFZGl0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlVmFsdWVzKFN0cmluZyBuZXdWYWx1ZXNbXSkgewotCQlpZiAoQXJyYXlzLmVxdWFscyhmVmFsdWVzLCBuZXdWYWx1ZXMpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZlZhbHVlcyA9IG5ld1ZhbHVlczsKLQkJaWYgKGZFZGl0b3IgIT0gbnVsbCkgewotCQkJZkVkaXRvci5zZXRJdGVtcyhuZXdWYWx1ZXMpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvU3RyaW5nQ29tYm9Cb3hDZWxsRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9TdHJpbmdDb21ib0JveENlbGxFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY1MzZiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9TdHJpbmdDb21ib0JveENlbGxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9Cb3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLQotCi0vKioKLSAqIEFuIGV4dGVuZGVkIENvbWJvQm94Q2VsbEVkaXRvciB0aGF0IHNlbGVjdHMgYW5kIHJldHVybnMgU3RyaW5ncwotICovCi0KLXB1YmxpYyBjbGFzcyBTdHJpbmdDb21ib0JveENlbGxFZGl0b3IgZXh0ZW5kcyBDb21ib0JveENlbGxFZGl0b3IgewotCXByaXZhdGUgYm9vbGVhbiBmU2V0dGluZ1ZhbHVlID0gZmFsc2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQ29tYm9Cb3hDZWxsRWRpdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gaXRlbXMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQ29tYm9Cb3hDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCXN1cGVyKHBhcmVudCwgaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gaXRlbXMKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQ29tYm9Cb3hDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZ1tdIGl0ZW1zLCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBpdGVtcywgc3R5bGUpOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZG9HZXRWYWx1ZSgpIHsKLQkJLy8gb3RoZXJ3aXNlIGxpbWl0cyB0byBzZXQgb2YgdmFsaWQgdmFsdWVzCi0JCU9iamVjdCBpbmRleCA9IHN1cGVyLmRvR2V0VmFsdWUoKTsKLQkJaW50IHNlbGVjdGlvbiA9IC0xOwotCQlpZiAoaW5kZXggaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQlzZWxlY3Rpb24gPSAoKEludGVnZXIpIGluZGV4KS5pbnRWYWx1ZSgpOwotCQl9Ci0JCWlmIChzZWxlY3Rpb24gPj0gMCkgewotCQkJcmV0dXJuIGdldEl0ZW1zKClbc2VsZWN0aW9uXTsKLQkJfQotCQllbHNlIGlmIChnZXRDb250cm9sKCkgaW5zdGFuY2VvZiBDQ29tYm8pIHsKLQkJCS8vIHJldHJpZXZlIHRoZSBhY3R1YWwgdGV4dCBhcyB0aGUgbGlzdCBvZiB2YWxpZCBpdGVtcyBkb2Vzbid0Ci0JCQkvLyBjb250YWluIHRoZSB2YWx1ZQotCQkJcmV0dXJuICgoQ0NvbWJvKSBnZXRDb250cm9sKCkpLmdldFRleHQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQlpZiAoZlNldHRpbmdWYWx1ZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZTZXR0aW5nVmFsdWUgPSB0cnVlOwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQlzdXBlci5kb1NldFZhbHVlKHZhbHVlKTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBzdHJpbmdWYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0JCQlpbnQgc2VsZWN0aW9uID0gLTE7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGdldEl0ZW1zKCkubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZ2V0SXRlbXMoKVtpXS5lcXVhbHMoc3RyaW5nVmFsdWUpKSB7Ci0JCQkJCXNlbGVjdGlvbiA9IGk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNlbGVjdGlvbiA+PSAwKSB7Ci0JCQkJc3VwZXIuZG9TZXRWYWx1ZShuZXcgSW50ZWdlcihzZWxlY3Rpb24pKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN1cGVyLmRvU2V0VmFsdWUobmV3IEludGVnZXIoLTEpKTsKLQkJCQlpZiAoKGdldENvbnRyb2woKSBpbnN0YW5jZW9mIENDb21ibykgJiYgIXN0cmluZ1ZhbHVlLmVxdWFscygoKENDb21ibykgZ2V0Q29udHJvbCgpKS5nZXRUZXh0KCkpKSB7Ci0JCQkJCS8vIHVwZGF0ZSB0aGUgVGV4dCB3aWRnZXQKLQkJCQkJKChDQ29tYm8pIGdldENvbnRyb2woKSkuc2V0VGV4dChzdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZTZXR0aW5nVmFsdWUgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJdGVtcyhTdHJpbmdbXSBuZXdJdGVtcykgewotCQlpZiAoKGdldENvbnRyb2woKSA9PSBudWxsKSB8fCBnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkF0dGVtcHRlZCB0byB1cGRhdGUgaXRlbSBsaXN0IGZvciBkaXNwb3NlZCBjZWxsIGVkaXRvciIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBrZWVwIHNlbGVjdGlvbiBpZiBwb3NzaWJsZQotCQlPYmplY3QgcHJldmlvdXNTZWxlY3RlZFZhbHVlID0gZ2V0VmFsdWUoKTsKLQkJc3VwZXIuc2V0SXRlbXMobmV3SXRlbXMpOwotCQlpZiAoKHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSAhPSBudWxsKSAmJiAoZ2V0Q29udHJvbCgpIGluc3RhbmNlb2YgQ0NvbWJvKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChuZXdJdGVtc1tpXS5lcXVhbHMocHJldmlvdXNTZWxlY3RlZFZhbHVlKSkgewotCQkJCQlzZXRWYWx1ZShwcmV2aW91c1NlbGVjdGVkVmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1hNTFByb3BlcnR5U291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9YTUxQcm9wZXJ0eVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2Y1Y2ZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1hNTFByb3BlcnR5U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5UZXh0UHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5hbWVkTm9kZU1hcEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQW4gSVByb3BlcnR5U291cmNlIGltcGxlbWVudGF0aW9uIGZvciBhIEpGYWNlIHZpZXdlciB1c2VkIHRvIGRpc3BsYXkKLSAqIHByb3BlcnRpZXMgb2YgRE9NIG5vZGVzLgotICovCi1wdWJsaWMgY2xhc3MgWE1MUHJvcGVydHlTb3VyY2UgaW1wbGVtZW50cyBJUHJvcGVydHlTb3VyY2UsIElQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbiwgSVByb3BlcnR5U291cmNlMiB7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FURUdPUllfQVRUUklCVVRFUyA9IFhNTFVJTWVzc2FnZXMuWE1MUHJvcGVydHlTb3VyY2VBZGFwdGVyXzA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGZTZXRFeHBlcnRGaWx0ZXIgPSBmYWxzZTsKLQotCS8qKgotCSAqIGRlcml2ZSBjYXRlZ29yaWVzIGZyb20gQ01EYXRhVHlwZXM7IGRpc2FibGVkIHVudGlsIGRpc3BsYXkgc3RyaW5ncyBjYW4KLQkgKiBiZSBwbGFubmVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBmU2hvdWxkRGVyaXZlQ2F0ZWdvcmllcyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBmU29ydEVudW1lcmF0ZWRWYWx1ZXMgPSB0cnVlOwotCi0JLyoqCi0JICogTm90ZTogd2Ugd2FudCB0aGUgZGVmYXVsdCBmQ2FzZVNlbnNpdGl2ZSB0byBiZSB0cnVlLCBidXQsIHRvIGF2b2lkCi0JICogbWVhbmluZ2xlc3MgZG91YmxlIGluaXRpYWxpemF0aW9uLCB3ZSBsZWF2ZSBkZWZhdWx0IGhlcmUsIGFuZCBzZXQgaW4KLQkgKiBjb25zdHJ1Y3RvciBvbmx5LgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmQ2FzZVNlbnNpdGl2ZTsKLQlwcml2YXRlIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBmRGVzY3JpcHRvcnMgPSBudWxsOwotCXByaXZhdGUgTm9kZSBmTm9kZSA9IG51bGw7Ci0KLQlwcml2YXRlIFN0YWNrIGZWYWx1ZXNCZWluZ1NldCA9IG5ldyBTdGFjaygpOwotCi0JcHVibGljIFhNTFByb3BlcnR5U291cmNlKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXN1cGVyKCk7Ci0JCWZOb2RlID0gaW5pdE5vZGUodGFyZ2V0KTsKLQkJZkNhc2VTZW5zaXRpdmUgPSBpbml0Q2FzZVNlbnNpdGl2ZShmTm9kZSk7Ci0KLQl9Ci0KLQkvKiogc2VwZXJhdGUgbWV0aG9kIGp1c3QgdG8gaXNvbGF0ZSBlcnJvciBwcm9jZXNzaW5nICovCi0JcHJpdmF0ZSBOb2RlIGluaXROb2RlKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCU5vZGUgbm9kZSA9IG51bGw7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlub2RlID0gKE5vZGUpIHRhcmdldDsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlhNTFByb3BlcnR5U291cmNlIGlzIG9ubHkgZm9yIE5vZGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5pdENhc2VTZW5zaXRpdmUoTm9kZSBub2RlKSB7Ci0JCS8vIGFsbW9zdCBhbGwgdGFncyBhcmUgY2FzZSBzZW5zdGl2ZSwgZXhjZXB0IHRoYXQgb2xkIEhUTUwKLQkJYm9vbGVhbiBjYXNlU2Vuc2l0aXZlID0gdHJ1ZTsKLQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJYWRhcHRlciA9IGdldERvY1R5cGVGcm9tRE9NTm9kZShub2RlKTsKLQkJfQotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQljYXNlU2Vuc2l0aXZlID0gKGFkYXB0ZXIuZ2V0VGFnTmFtZUNhc2UoKSA9PSBEb2N1bWVudFR5cGVBZGFwdGVyLlNUUklDVF9DQVNFKTsKLQkJfQotCQlyZXR1cm4gY2FzZVNlbnNpdGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBieSAiaW50ZXJuYWwgc3BlYyIgdGhlIERPQ1RZUEUgYWRhcHRlciBpcyBvbmx5IGF2YWlsYWJsZSBmcm9tIERvY3VtZW50Ci0JICogTm9kZQotCSAqIAotCSAqIEByZXR1cm4ge0BsaW5rIERvY3VtZW50VHlwZUFkYXB0ZXJ9Ci0JICovCi0JcHJpdmF0ZSBEb2N1bWVudFR5cGVBZGFwdGVyIGdldERvY1R5cGVGcm9tRE9NTm9kZShOb2RlIG5vZGUpIHsKLQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLQkJRG9jdW1lbnQgb3duZXJEb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAob3duZXJEb2N1bWVudCA9PSBudWxsKSB7Ci0JCQkvLyBpZiBvd25lckRvY3VtZW50IGlzIG51bGwsIHRoZW4gZk5vZGUgbXVzdCBiZSB0aGUgRG9jdW1lbnQgTm9kZQotCQkJLy8gW29sZCwgb2xkIGNvbW1lbnRdCi0JCQkvLyBobW1tbSwgZ3Vlc3Mgbm90LiBTZWUKLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzAyMzMKLQkJCS8vIGd1ZXNzIHRoaXMgaXMgdXNlZCBmb3IgbWFueSBJTm9kZU5vdGlmaWVycywgbm90IGp1c3QgWE1MLgotCQkJLy8gKGFuZCBEVEQncyB1c2UgSURPTU5vZGU/IC4uLiB0aGF0IGRvZXNuJ3Qgc291bmQgcXVpdGUgcmlnaHQKLQkJCS8vIC4uLiBidXQsIG1heWJlIGEgc2VwYXJhdGUgaXNzdWUpLgotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotCQkJCW93bmVyRG9jdW1lbnQgPSAoRG9jdW1lbnQpIG5vZGU7Ci0JCQl9Ci0JCX0KLQkJaWYgKG93bmVyRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIG93bmVyRG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCX0KLQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIF9nZXRWYWxpZEZpeGVkU3RyaW5ncyhDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsLCBDTURhdGFUeXBlIGhlbHBlcikgewotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShhdHRyRGVjbCwgZk5vZGUsIG51bGwpOwotCQlMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCVN0cmluZyBpbXBsaWVkVmFsdWUgPSBoZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCk7Ci0JCWlmIChpbXBsaWVkVmFsdWUgIT0gbnVsbCkgewotCQkJdmFsdWVzLmFkZChpbXBsaWVkVmFsdWUpOwotCQl9Ci0JCWJvb2xlYW4gY2hlY2tJZkN1cnJlbnRWYWx1ZUlzSW5jbHVkZWQgPSAoKGZOb2RlLmdldEF0dHJpYnV0ZXMoKSAhPSBudWxsKSAmJiAoZk5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyaWJ1dGVOYW1lKSAhPSBudWxsKSAmJiAoZk5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyaWJ1dGVOYW1lKS5nZXROb2RlVmFsdWUoKSAhPSBudWxsKSk7Ci0JCWlmIChjaGVja0lmQ3VycmVudFZhbHVlSXNJbmNsdWRlZCkgewotCQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IG51bGw7Ci0JCQljdXJyZW50VmFsdWUgPSBmTm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpLmdldE5vZGVWYWx1ZSgpOwotCQkJaWYgKCFjdXJyZW50VmFsdWUuZXF1YWxzKGltcGxpZWRWYWx1ZSkpIHsKLQkJCQl2YWx1ZXMuYWRkKGN1cnJlbnRWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nW10gdmFsaWRTdHJpbmdzID0gbmV3IFN0cmluZ1t2YWx1ZXMuc2l6ZSgpXTsKLQkJdmFsaWRTdHJpbmdzID0gKFN0cmluZ1tdKSB2YWx1ZXMudG9BcnJheSh2YWxpZFN0cmluZ3MpOwotCQlyZXR1cm4gdmFsaWRTdHJpbmdzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gX2dldFZhbGlkU3RyaW5ncyhDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsLCBDTURhdGFUeXBlIHZhbHVlc0hlbHBlcikgewotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShhdHRyRGVjbCwgZk5vZGUsIG51bGwpOwotCQlMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCWJvb2xlYW4gY3VycmVudFZhbHVlS25vd24gPSBmYWxzZTsKLQkJYm9vbGVhbiBjaGVja0lmQ3VycmVudFZhbHVlSXNLbm93biA9ICgoZk5vZGUuZ2V0QXR0cmlidXRlcygpICE9IG51bGwpICYmIChmTm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpICE9IG51bGwpICYmIChmTm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpLmdldE5vZGVWYWx1ZSgpICE9IG51bGwpKTsKLQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IG51bGw7Ci0JCWlmIChjaGVja0lmQ3VycmVudFZhbHVlSXNLbm93bikgewotCQkJY3VycmVudFZhbHVlID0gZk5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyaWJ1dGVOYW1lKS5nZXROb2RlVmFsdWUoKTsKLQkJfQotCi0JCWlmICgodmFsdWVzSGVscGVyLmdldEltcGxpZWRWYWx1ZUtpbmQoKSA9PSBDTURhdGFUeXBlLklNUExJRURfVkFMVUVfRklYRUQpICYmICh2YWx1ZXNIZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCkgIT0gbnVsbCkpIHsKLQkJCS8vIEZJWEVEIHZhbHVlCi0JCQljdXJyZW50VmFsdWVLbm93biA9IChjdXJyZW50VmFsdWUgIT0gbnVsbCkgJiYgdmFsdWVzSGVscGVyLmdldEltcGxpZWRWYWx1ZSgpLmVxdWFscyhjdXJyZW50VmFsdWUpOwotCQkJdmFsdWVzLmFkZCh2YWx1ZXNIZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gRU5VTUVSQVRFRCB2YWx1ZXMKLQkJCVN0cmluZ1tdIHZhbHVlU3RyaW5ncyA9IG51bGw7Ci0JCQkvLyB2YWx1ZVN0cmluZ3MgPSB2YWx1ZXNIZWxwZXIuZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShmTm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJaWYgKChtb2RlbFF1ZXJ5ICE9IG51bGwpICYmIChmTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSkgewotCQkJCXZhbHVlU3RyaW5ncyA9IG1vZGVsUXVlcnkuZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcygoRWxlbWVudCkgZk5vZGUsIGF0dHJEZWNsKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXZhbHVlU3RyaW5ncyA9IGF0dHJEZWNsLmdldEF0dHJUeXBlKCkuZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCQkJfQotCQkJaWYgKHZhbHVlU3RyaW5ncyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZVN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGNoZWNrSWZDdXJyZW50VmFsdWVJc0tub3duICYmIHZhbHVlU3RyaW5nc1tpXS5lcXVhbHMoY3VycmVudFZhbHVlKSkgewotCQkJCQkJY3VycmVudFZhbHVlS25vd24gPSB0cnVlOwotCQkJCQl9Ci0JCQkJCXZhbHVlcy5hZGQodmFsdWVTdHJpbmdzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCh2YWx1ZXNIZWxwZXIuZ2V0SW1wbGllZFZhbHVlS2luZCgpICE9IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9OT05FKSAmJiAodmFsdWVzSGVscGVyLmdldEltcGxpZWRWYWx1ZSgpICE9IG51bGwpKSB7Ci0JCQlpZiAoIXZhbHVlcy5jb250YWlucyh2YWx1ZXNIZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCkpKSB7Ci0JCQkJdmFsdWVzLmFkZCh2YWx1ZXNIZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGNoZWNrSWZDdXJyZW50VmFsdWVJc0tub3duICYmICFjdXJyZW50VmFsdWVLbm93biAmJiAoY3VycmVudFZhbHVlICE9IG51bGwpICYmIChjdXJyZW50VmFsdWUubGVuZ3RoKCkgPiAwKSkgewotCQkJdmFsdWVzLmFkZChjdXJyZW50VmFsdWUpOwotCQl9Ci0JCVN0cmluZ1tdIHZhbGlkU3RyaW5ncyA9IG5ldyBTdHJpbmdbdmFsdWVzLnNpemUoKV07Ci0JCXZhbGlkU3RyaW5ncyA9IChTdHJpbmdbXSkgdmFsdWVzLnRvQXJyYXkodmFsaWRTdHJpbmdzKTsKLQkJcmV0dXJuIHZhbGlkU3RyaW5nczsKLQl9Ci0KLQlwcml2YXRlIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihhdHRyaWJ1dGVOYW1lLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGJvb2xlYW4gaGlkZU9uRmlsdGVyKSB7Ci0JCS8vIFRoZSBkZXNjcmlwdG9yIGNsYXNzIHVzZWQgaGVyZSBpcyBhbHNvIHVzZWQgaW4KLQkJLy8gdXBkYXRlUHJvcGVydHlEZXNjcmlwdG9ycygpCi0JCVRleHRQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZU5hbWUpOwotCQlkZXNjcmlwdG9yLnNldENhdGVnb3J5KGdldENhdGVnb3J5KG51bGwpKTsKLQkJZGVzY3JpcHRvci5zZXREZXNjcmlwdGlvbihhdHRyaWJ1dGVOYW1lKTsKLQkJaWYgKGhpZGVPbkZpbHRlciAmJiBmU2V0RXhwZXJ0RmlsdGVyKSB7Ci0JCQlkZXNjcmlwdG9yLnNldEZpbHRlckZsYWdzKG5ldyBTdHJpbmdbXXtJUHJvcGVydHlTaGVldEVudHJ5LkZJTFRFUl9JRF9FWFBFUlR9KTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgYW4gYXR0cmlidXRlIHdpdGggRU5VTUVSQVRFRCB2YWx1ZXMgLQotCSAqIGlmIHRoZSB2YWx1ZSBkb2VzIG5vdCBleGlzdCwgYW4gZWRpdGFibGUgY29tYm8gYm94IGlzIHJldHVybmVkIC0gaWYgdGhlCi0JICogdmFsdWUgZXhpc3RzIGJ1dCBpcyBub3Qgb25lIGluIHRoZSBlbnVtZXJhdGVkIGxpc3Qgb2YgdmFsdWUsIGEgY29tYm8KLQkgKiBib3ggZmVhdHVyaW5nIHRoZSBjdXJyZW50IGFuZCBjb3JyZWN0IHZhbHVlcyBpcyByZXR1cm5lZCAtIGlmIHRoZSB2YWx1ZQotCSAqIGV4aXN0cyBhbmQgaXQgaXMgYSB2YWxpZCB2YWx1ZSwgYSBjb21ibyBib3ggZmVhdHVyaW5nIHRoZSBjb3JyZWN0Ci0JICogdmFsdWVzIHdpdGggdGhlIGN1cnJlbnQgb25lIHZpc2libGUgaXMgcmV0dXJuZWQKLQkgKi8KLQlwcml2YXRlIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlRW51bWVyYXRlZFByb3BlcnR5RGVzY3JpcHRvcihDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsLCBDTURhdGFUeXBlIHZhbHVlc0hlbHBlcikgewotCQkvLyB0aGUgZGlzcGxheU5hbWUgTVVTVCBiZSBzZXQKLQkJRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IEVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ckRlY2wuZ2V0QXR0ck5hbWUoKSwgYXR0ckRlY2wuZ2V0QXR0ck5hbWUoKSwgX2dldFZhbGlkU3RyaW5ncyhhdHRyRGVjbCwgdmFsdWVzSGVscGVyKSk7Ci0JCWRlc2NyaXB0b3Iuc2V0Q2F0ZWdvcnkoZ2V0Q2F0ZWdvcnkoYXR0ckRlY2wpKTsKLQkJU3RyaW5nIGF0dHJOYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmNvbXB1dGVOYW1lKGF0dHJEZWNsLCBmTm9kZSwgbnVsbCk7Ci0JCWRlc2NyaXB0b3Iuc2V0RGVzY3JpcHRpb24oYXR0ck5hbWUpOwotCQlpZiAoKGF0dHJEZWNsLmdldFVzYWdlKCkgIT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgJiYgZlNldEV4cGVydEZpbHRlcikgewotCQkJZGVzY3JpcHRvci5zZXRGaWx0ZXJGbGFncyhuZXcgU3RyaW5nW117SVByb3BlcnR5U2hlZXRFbnRyeS5GSUxURVJfSURfRVhQRVJUfSk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIGFuIGF0dHJpYnV0ZSB3aXRoIGEgRklYRUQgdmFsdWUgLSBpZgotCSAqIHRoZSB2YWx1ZSBkb2VzIG5vdCBleGlzdCwgYW4gZWRpdGFibGUgY29tYm8gYm94IGlzIHJldHVybmVkIC0gaWYgdGhlCi0JICogdmFsdWUgZXhpc3RzIGJ1dCBpcyBub3QgdGhlIGZpeGVkL2RlZmF1bHQgdmFsdWUsIGEgY29tYm8gYm94IGZlYXR1cmluZwotCSAqIHRoZSBjdXJyZW50IGFuZCBjb3JyZWN0IHZhbHVlIGlzIHJldHVybmVkIC0gaWYgdGhlIHZhbHVlIGV4aXN0cyBhbmQgaXQKLQkgKiBpcyB0aGUgZml4ZWQvZGVmYXVsdCB2YWx1ZSwgbm8gY2VsbCBlZGl0b3IgaXMgcHJvdmlkZWQgImxvY2tpbmciIHRoZQotCSAqIHZhbHVlIGluCi0JICovCi0JcHJpdmF0ZSBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZUZpeGVkUHJvcGVydHlEZXNjcmlwdG9yKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wsIENNRGF0YVR5cGUgaGVscGVyKSB7Ci0JCS8vIHRoZSBkaXNwbGF5TmFtZSBNVVNUIGJlIHNldAotCQlFbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvcihhdHRyRGVjbC5nZXROb2RlTmFtZSgpLCBhdHRyRGVjbC5nZXROb2RlTmFtZSgpLCBfZ2V0VmFsaWRGaXhlZFN0cmluZ3MoYXR0ckRlY2wsIGhlbHBlcikpOwotCQlkZXNjcmlwdG9yLnNldENhdGVnb3J5KGdldENhdGVnb3J5KGF0dHJEZWNsKSk7Ci0JCWRlc2NyaXB0b3Iuc2V0RGVzY3JpcHRpb24oRE9NTmFtZXNwYWNlSGVscGVyLmNvbXB1dGVOYW1lKGF0dHJEZWNsLCBmTm9kZSwgbnVsbCkpOwotCQlyZXR1cm4gZGVzY3JpcHRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCkgewotCQlJUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBudWxsOwotCQlDTURhdGFUeXBlIGF0dHJUeXBlID0gYXR0ckRlY2wuZ2V0QXR0clR5cGUoKTsKLQotCQlpZiAoYXR0clR5cGUgIT0gbnVsbCkgewotCQkJLy8gaGFuZGxlIGRlY2xhcmF0aW9ucyB0aGF0IHByb3ZpZGUgRklYRUQvRU5VTUVSQVRFRCB2YWx1ZXMKLQkJCWlmICgoYXR0clR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpICE9IG51bGwpICYmIChhdHRyVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCkubGVuZ3RoID4gMCkpIHsKLQkJCQlkZXNjcmlwdG9yID0gY3JlYXRlRW51bWVyYXRlZFByb3BlcnR5RGVzY3JpcHRvcihhdHRyRGVjbCwgYXR0clR5cGUpOwotCQkJfQotCQkJZWxzZSBpZiAoKChhdHRyRGVjbC5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uRklYRUQpIHx8IChhdHRyVHlwZS5nZXRJbXBsaWVkVmFsdWVLaW5kKCkgPT0gQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0ZJWEVEKSkgJiYgKGF0dHJUeXBlLmdldEltcGxpZWRWYWx1ZSgpICE9IG51bGwpKSB7Ci0JCQkJZGVzY3JpcHRvciA9IGNyZWF0ZUZpeGVkUHJvcGVydHlEZXNjcmlwdG9yKGF0dHJEZWNsLCBhdHRyVHlwZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBwbGFpbiB0ZXh0Ci0JCQkJZGVzY3JpcHRvciA9IGNyZWF0ZVRleHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ckRlY2wpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gbm8gZXh0cmEgaW5mb3JtYXRpb24gZ2l2ZW4KLQkJCWRlc2NyaXB0b3IgPSBjcmVhdGVUZXh0UHJvcGVydHlEZXNjcmlwdG9yKGF0dHJEZWNsKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGNvbGxlY3Rpb24gb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMuCi0JICogCi0JICogQHJldHVybiBhbGwgdmFsaWQgZGVzY3JpcHRvcnMuCi0JICovCi0JcHJpdmF0ZSBJUHJvcGVydHlEZXNjcmlwdG9yW10gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9ycygpIHsKLQkJQ01OYW1lZE5vZGVNYXAgYXR0ck1hcCA9IG51bGw7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0RGVjbGFyYXRpb24oKTsKLQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCWF0dHJNYXAgPSBlZC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlDTU5hbWVkTm9kZU1hcEltcGwgYWxsQXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoYXR0ck1hcCk7Ci0JCQlMaXN0IG5vZGVzID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShmTm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEF2YWlsYWJsZUNvbnRlbnQoKEVsZW1lbnQpIGZOb2RlLCBlZCwgTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVMpOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCBub2Rlcy5zaXplKCk7IGsrKykgewotCQkJCUNNTm9kZSBjbW5vZGUgPSAoQ01Ob2RlKSBub2Rlcy5nZXQoayk7Ci0JCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pIHsKLQkJCQkJYWxsQXR0cmlidXRlcy5wdXQoY21ub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlhdHRyTWFwID0gYWxsQXR0cmlidXRlczsKLQkJfQotCi0JCUxpc3QgZGVzY3JpcHRvckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQotCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gbnVsbDsKLQotCQkvLyBhZGQgZGVzY3JpcHRvcnMgZm9yIGV4aXN0aW5nIGF0dHJpYnV0ZXMKLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBmTm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJQXR0ciBhdHRyID0gKEF0dHIpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCQkvLyBpZiBtZXRhaW5mbyBpcyBwcmVzZW50IGZvciB0aGlzIGF0dHJpYnV0ZSwgdXNlIHRoZQotCQkJCS8vIENNQXR0cmlidXRlRGVjbGFyYXRpb24gdG8gZGVyaXZlIGEgZGVzY3JpcHRvcgotCQkJCWlmIChhdHRyTWFwICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0JCQkJCWlmIChmQ2FzZVNlbnNpdGl2ZSkgewotCQkJCQkJYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0ck1hcC5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYXR0ckRlY2wgPSBudWxsOwotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhdHRyTWFwLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJCQlpZiAoIWZDYXNlU2Vuc2l0aXZlICYmIGF0dHJNYXAuaXRlbShqKS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKSB7Ci0JCQkJCQkJCWF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJNYXAuaXRlbShqKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIGJlIGNvbnNpc3RlbnQ6IGlmIHRoZXJlJ3MgbWV0YWluZm8sIHVzZSAqdGhhdCogYXMgdGhlCi0JCQkJLy8gZGVzY3JpcHRvciBJRAotCQkJCWRlc2NyaXB0b3IgPSBudWxsOwotCQkJCWlmIChhdHRyRGVjbCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBhdHRyTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShhdHRyRGVjbCwgZk5vZGUsIG51bGwpOwotCQkJCQlpZiAoIW5hbWVzLmNvbnRhaW5zKGF0dHJOYW1lKSkgewotCQkJCQkJZGVzY3JpcHRvciA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihhdHRyRGVjbCk7Ci0JCQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKQotCQkJCQkJCW5hbWVzLmFkZChhdHRyTmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmICghbmFtZXMuY29udGFpbnMoYXR0ci5nZXROYW1lKCkpKSB7Ci0JCQkJCQlkZXNjcmlwdG9yID0gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihhdHRyLmdldE5hbWUoKSk7Ci0JCQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKQotCQkJCQkJCW5hbWVzLmFkZChhdHRyLmdldE5hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQlkZXNjcmlwdG9yTGlzdC5hZGQoZGVzY3JpcHRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIGRlc2NyaXB0b3JzIGZyb20gdGhlIG1ldGFpbmZvIHRoYXQgYXJlIG5vdCB5ZXQgbGlzdGVkCi0JCWlmIChhdHRyTWFwICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0ck1hcC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0ck1hcC5pdGVtKGkpOwotCQkJCVN0cmluZyBhdHRyTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShhdHRyRGVjbCwgZk5vZGUsIG51bGwpOwotCQkJCWlmICghbmFtZXMuY29udGFpbnMoYXR0ck5hbWUpKSB7Ci0JCQkJCUlQcm9wZXJ0eURlc2NyaXB0b3IgaG9sZERlc2NyaXB0b3IgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ckRlY2wpOwotCQkJCQlpZiAoaG9sZERlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQkJbmFtZXMuYWRkKGF0dHJOYW1lKTsKLQkJCQkJCWRlc2NyaXB0b3JMaXN0LmFkZChob2xkRGVzY3JpcHRvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgTVFFLWJhc2VkIGRlc2NyaXB0b3JzCi0JCWlmIChlZCAhPSBudWxsICYmIGZOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUxpc3Qgbm9kZXMgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGZOb2RlLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QXZhaWxhYmxlQ29udGVudCgoRWxlbWVudCkgZk5vZGUsIGVkLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQ01Ob2RlIG5vZGUgPSAoQ01Ob2RlKSBub2Rlcy5nZXQoaSk7Ci0JCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCWF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIG5vZGU7Ci0JCQkJCVN0cmluZyBhdHRyTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShhdHRyRGVjbCwgZk5vZGUsIG51bGwpOwotCQkJCQlpZiAoIW5hbWVzLmNvbnRhaW5zKGF0dHJOYW1lKSkgewotCQkJCQkJSVByb3BlcnR5RGVzY3JpcHRvciBob2xkRGVzY3JpcHRvciA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihhdHRyRGVjbCk7Ci0JCQkJCQlpZiAoaG9sZERlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQkJCW5hbWVzLmFkZChhdHRyTmFtZSk7Ci0JCQkJCQkJZGVzY3JpcHRvckxpc3QuYWRkKGhvbGREZXNjcmlwdG9yKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0KLQkJSVByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gbmV3IElQcm9wZXJ0eURlc2NyaXB0b3JbZGVzY3JpcHRvckxpc3Quc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJZGVzY3JpcHRvcnNbaV0gPSAoSVByb3BlcnR5RGVzY3JpcHRvcikgZGVzY3JpcHRvckxpc3QuZ2V0KGkpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdG9yczsKLQl9Ci0KLQlwcml2YXRlIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlVGV4dFByb3BlcnR5RGVzY3JpcHRvcihDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsKSB7Ci0JCVN0cmluZyBhdHRyTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShhdHRyRGVjbCwgZk5vZGUsIG51bGwpOwotCQlUZXh0UHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcihhdHRyTmFtZSwgYXR0ck5hbWUpOwotCQlkZXNjcmlwdG9yLnNldENhdGVnb3J5KGdldENhdGVnb3J5KGF0dHJEZWNsKSk7Ci0JCWRlc2NyaXB0b3Iuc2V0RGVzY3JpcHRpb24oYXR0ck5hbWUpOwotCQlpZiAoKGF0dHJEZWNsLmdldFVzYWdlKCkgIT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkgJiYgZlNldEV4cGVydEZpbHRlcikgewotCQkJZGVzY3JpcHRvci5zZXRGaWx0ZXJGbGFncyhuZXcgU3RyaW5nW117SVByb3BlcnR5U2hlZXRFbnRyeS5GSUxURVJfSURfRVhQRVJUfSk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q2F0ZWdvcnkoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCkgewotCQlpZiAoYXR0ckRlY2wgIT0gbnVsbCkgewotCQkJaWYgKGF0dHJEZWNsLnN1cHBvcnRzKCJjYXRlZ29yeSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gKFN0cmluZykgYXR0ckRlY2wuZ2V0UHJvcGVydHkoImNhdGVnb3J5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChmU2hvdWxkRGVyaXZlQ2F0ZWdvcmllcyAmJiAoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKSAhPSBudWxsKSAmJiAoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKS5nZXROb2RlTmFtZSgpICE9IG51bGwpICYmIChhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldE5vZGVOYW1lKCkubGVuZ3RoKCkgPiAwKSkgewotCQkJCXJldHVybiBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldERhdGFUeXBlTmFtZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBDQVRFR09SWV9BVFRSSUJVVEVTOwotCX0KLQotCXByaXZhdGUgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCWlmICgoZk5vZGUgPT0gbnVsbCkgfHwgKGZOb2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGZOb2RlLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCXJldHVybiBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBmTm9kZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0KLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB2YWx1ZSBmb3IgdGhpcyBOb2RlIHRoYXQgY2FuIGJlIGVkaXR0ZWQgaW4gYSBwcm9wZXJ0eSBzaGVldC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgdmFsdWUgdGhhdCBjYW4gYmUgZWRpdHRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBjb2xsZWN0aW9uIG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzLgotCSAqIAotCSAqIEByZXR1cm4gYWxsIHZhbGlkIGRlc2NyaXB0b3JzLgotCSAqLwotCXB1YmxpYyBmaW5hbCBJUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpIHsKLQkJaWYgKChmRGVzY3JpcHRvcnMgPT0gbnVsbCkgfHwgKGZEZXNjcmlwdG9ycy5sZW5ndGggPT0gMCkpIHsKLQkJCWZEZXNjcmlwdG9ycyA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQkJfQotCQllbHNlIHsKLQkJCXVwZGF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLQkJfQotCQlyZXR1cm4gZkRlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoZSBuYW1lZCBwcm9wZXJ0eS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IG5hbWVPYmplY3QpIHsKLQkJU3RyaW5nIG5hbWUgPSBuYW1lT2JqZWN0LnRvU3RyaW5nKCk7Ci0JCVN0cmluZyByZXR1cm5lZFZhbHVlID0gbnVsbDsKLQkJTmFtZWROb2RlTWFwIGF0dHJNYXAgPSBmTm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyTWFwICE9IG51bGwpIHsKLQkJCU5vZGUgYXR0cmlidXRlID0gYXR0ck1hcC5nZXROYW1lZEl0ZW0obmFtZSk7Ci0JCQlpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQlpZiAoYXR0cmlidXRlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQkJcmV0dXJuZWRWYWx1ZSA9ICgoSURPTU5vZGUpIGF0dHJpYnV0ZSkuZ2V0VmFsdWVTb3VyY2UoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybmVkVmFsdWUgPSBhdHRyaWJ1dGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZXR1cm5lZFZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybmVkVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXR1cm5lZFZhbHVlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0VmFsaWRWYWx1ZXMoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCkgewotCQlpZiAoYXR0ckRlY2wgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCX0KLQotCQlTdHJpbmdbXSB2YWxpZFZhbHVlcyA9IG51bGw7Ci0JCUNNRGF0YVR5cGUgYXR0clR5cGUgPSBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpOwotCQlpZiAoYXR0clR5cGUgIT0gbnVsbCkgewotCQkJdmFsaWRWYWx1ZXMgPSBfZ2V0VmFsaWRTdHJpbmdzKGF0dHJEZWNsLCBhdHRyVHlwZSk7Ci0JCQlpZiAoZlNvcnRFbnVtZXJhdGVkVmFsdWVzKSB7Ci0JCQkJQXJyYXlzLnNvcnQodmFsaWRWYWx1ZXMpOwotCQkJfQotCQl9Ci0JCWlmICh2YWxpZFZhbHVlcyA9PSBudWxsKSB7Ci0JCQl2YWxpZFZhbHVlcyA9IG5ldyBTdHJpbmdbMF07Ci0JCX0KLQkJcmV0dXJuIHZhbGlkVmFsdWVzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlSZW1vdmFibGUoT2JqZWN0IGlkKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlSZXNldHRhYmxlKE9iamVjdCBpZCkgewotCQlib29sZWFuIHJlc2V0dGFibGUgPSBmYWxzZTsKLQkJU3RyaW5nIHByb3BlcnR5ID0gaWQudG9TdHJpbmcoKTsKLQkJQ01OYW1lZE5vZGVNYXAgYXR0ckRlY2xzID0gbnVsbDsKLQotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldERlY2xhcmF0aW9uKCk7Ci0JCWlmIChlZCAhPSBudWxsKSB7Ci0JCQlhdHRyRGVjbHMgPSBlZC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlDTU5hbWVkTm9kZU1hcEltcGwgYWxsQXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoYXR0ckRlY2xzKTsKLQkJCUxpc3Qgbm9kZXMgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGZOb2RlLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QXZhaWxhYmxlQ29udGVudCgoRWxlbWVudCkgZk5vZGUsIGVkLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IG5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQkJQ01Ob2RlIGNtbm9kZSA9IChDTU5vZGUpIG5vZGVzLmdldChrKTsKLQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCQlhbGxBdHRyaWJ1dGVzLnB1dChjbW5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWF0dHJEZWNscyA9IGFsbEF0dHJpYnV0ZXM7Ci0JCX0KLQotCQlpZiAoYXR0ckRlY2xzICE9IG51bGwpIHsKLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0ckRlY2xzLmdldE5hbWVkSXRlbShwcm9wZXJ0eSk7Ci0JCQlpZiAoYXR0ckRlY2wgIT0gbnVsbCkgewotCQkJCWlmIChhdHRyRGVjbC5nZXRBdHRyVHlwZSgpICE9IG51bGwpIHsKLQkJCQkJQ01EYXRhVHlwZSBoZWxwZXIgPSBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpOwotCQkJCQlpZiAoKGhlbHBlci5nZXRJbXBsaWVkVmFsdWVLaW5kKCkgIT0gQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX05PTkUpICYmIChoZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCkgIT0gbnVsbCkpIHsKLQkJCQkJCXJlc2V0dGFibGUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXNldHRhYmxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgcHJvcGVydHkgdmFsdWUgaGFzIGNoYW5nZWQgZnJvbSB0aGUgZGVmYXVsdC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGhhcwotCSAqICAgICAgICAgY2hhbmdlZCBmcm9tIGl0cyBvcmlnaW5hbCBkZWZhdWx0IHZhbHVlOyA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBwcm9wZXJ0eU9iamVjdCkgewotCQlTdHJpbmcgcHJvcGVydHkgPSBwcm9wZXJ0eU9iamVjdC50b1N0cmluZygpOwotCi0JCU5hbWVkTm9kZU1hcCBhdHRyTWFwID0gZk5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0ck1hcCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYXR0ck1hcC5nZXROYW1lZEl0ZW0ocHJvcGVydHkpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZ2l2ZW4gYXR0cmlidXRlIGZyb20gdGhlIE5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlPYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eShPYmplY3QgcHJvcGVydHlPYmplY3QpIHsKLQkJTmFtZWROb2RlTWFwIGF0dHJNYXAgPSBmTm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyTWFwICE9IG51bGwpIHsKLQkJCU5vZGUgYXR0cmlidXRlID0gYXR0ck1hcC5nZXROYW1lZEl0ZW0ocHJvcGVydHlPYmplY3QudG9TdHJpbmcoKSk7Ci0JCQlpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlhdHRyTWFwLnJlbW92ZU5hbWVkSXRlbShwcm9wZXJ0eU9iamVjdC50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChlLmNvZGUgIT0gRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUikgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlc2V0cyB0aGUgc3BlY2lmaWVkIHByb3BlcnR5J3MgdmFsdWUgdG8gaXRzIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBwcm9wZXJ0eU9iamVjdCkgewotCQlTdHJpbmcgcHJvcGVydHkgPSBwcm9wZXJ0eU9iamVjdC50b1N0cmluZygpOwotCQlDTU5hbWVkTm9kZU1hcCBhdHRyRGVjbHMgPSBudWxsOwotCi0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0RGVjbGFyYXRpb24oKTsKLQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCWF0dHJEZWNscyA9IGVkLmdldEF0dHJpYnV0ZXMoKTsKLQkJCUNNTmFtZWROb2RlTWFwSW1wbCBhbGxBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbChhdHRyRGVjbHMpOwotCQkJTGlzdCBub2RlcyA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZk5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBdmFpbGFibGVDb250ZW50KChFbGVtZW50KSBmTm9kZSwgZWQsIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbm9kZXMuc2l6ZSgpOyBrKyspIHsKLQkJCQlDTU5vZGUgY21ub2RlID0gKENNTm9kZSkgbm9kZXMuZ2V0KGspOwotCQkJCWlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJCWFsbEF0dHJpYnV0ZXMucHV0KGNtbm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJYXR0ckRlY2xzID0gYWxsQXR0cmlidXRlczsKLQkJfQotCi0JCU5hbWVkTm9kZU1hcCBhdHRyTWFwID0gZk5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0ckRlY2xzICE9IG51bGwpIHsKLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0ckRlY2xzLmdldE5hbWVkSXRlbShwcm9wZXJ0eSk7Ci0JCQlTdHJpbmcgZGVmVmFsdWUgPSBudWxsOwotCQkJaWYgKGF0dHJEZWNsICE9IG51bGwpIHsKLQkJCQlpZiAoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJCUNNRGF0YVR5cGUgaGVscGVyID0gYXR0ckRlY2wuZ2V0QXR0clR5cGUoKTsKLQkJCQkJaWYgKChoZWxwZXIuZ2V0SW1wbGllZFZhbHVlS2luZCgpICE9IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9OT05FKSAmJiAoaGVscGVyLmdldEltcGxpZWRWYWx1ZSgpICE9IG51bGwpKSB7Ci0JCQkJCQlkZWZWYWx1ZSA9IGhlbHBlci5nZXRJbXBsaWVkVmFsdWUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICgoZGVmVmFsdWUgIT0gbnVsbCkgJiYgKGRlZlZhbHVlLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkoKEF0dHIpIGF0dHJNYXAuZ2V0TmFtZWRJdGVtKHByb3BlcnR5KSkuc2V0VmFsdWUoZGVmVmFsdWUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYXR0ck1hcC5yZW1vdmVOYW1lZEl0ZW0ocHJvcGVydHkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJYXR0ck1hcC5yZW1vdmVOYW1lZEl0ZW0ocHJvcGVydHkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZWQgcHJvcGVydHkgdG8gdGhlIGdpdmVuIHZhbHVlLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IG5hbWVPYmplY3QsIE9iamVjdCB2YWx1ZSkgewotCQkvLyBBdm9pZCBjeWNsaW5nIC0gY2FuIGhhcHBlbiBpZiBhIGNsb3NpbmcgY2VsbCBlZGl0b3IgY2F1c2VzIGEKLQkJLy8gcmVmcmVzaAotCQkvLyBvbiB0aGUgUHJvcGVydHlTaGVldCBwYWdlIGFuZCB0aGUgc2V0SW5wdXQgYWdhaW4gYXNrcyB0aGUgZWRpdG9yIHRvCi0JCS8vIGNsb3NlOyBiZXNpZGVzLCB3aHkgYXBwbHkgdGhlIHNhbWUgdmFsdWUgdHdpY2U/Ci0JCWlmICghZlZhbHVlc0JlaW5nU2V0LmlzRW1wdHkoKSAmJiAoZlZhbHVlc0JlaW5nU2V0LnBlZWsoKSA9PSBuYW1lT2JqZWN0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZWYWx1ZXNCZWluZ1NldC5wdXNoKG5hbWVPYmplY3QpOwotCQlTdHJpbmcgbmFtZSA9IG5hbWVPYmplY3QudG9TdHJpbmcoKTsKLQkJU3RyaW5nIHZhbHVlU3RyaW5nID0gbnVsbDsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCXZhbHVlU3RyaW5nID0gdmFsdWUudG9TdHJpbmcoKTsKLQkJfQotCQlOYW1lZE5vZGVNYXAgYXR0ck1hcCA9IGZOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJdHJ5IHsKLQkJCWlmIChhdHRyTWFwICE9IG51bGwpIHsKLQkJCQlBdHRyIGF0dHIgPSAoQXR0cikgYXR0ck1hcC5nZXROYW1lZEl0ZW0obmFtZSk7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQkvLyBFWElTVElORyBWQUxVRQotCQkJCQkvLyBwb3RlbnRpYWwgb3V0IG9mIGNvbnRyb2wgbG9vcCBpZiB1cGRhdGluZyB0aGUgdmFsdWUKLQkJCQkJLy8gdHJpZ2dlcnMgYSB2aWV3ZXIgdXBkYXRlLCBmb3JjaW5nIHRoZQotCQkJCQkvLyBhY3RpdmUgY2VsbCBlZGl0b3IgdG8gc2F2ZSBpdHMgdmFsdWUgYW5kIGNhdXNpbmcgdGhlCi0JCQkJCS8vIGxvb3AgdG8gY29udGludWUKLQkJCQkJaWYgKChhdHRyLmdldFZhbHVlKCkgPT0gbnVsbCkgfHwgIWF0dHIuZ2V0VmFsdWUoKS5lcXVhbHModmFsdWVTdHJpbmcpKSB7Ci0JCQkJCQlpZiAoYXR0ciBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJCQkJKChJRE9NTm9kZSkgYXR0cikuc2V0VmFsdWVTb3VyY2UodmFsdWVTdHJpbmcpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJYXR0ci5zZXRWYWx1ZSh2YWx1ZVN0cmluZyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIE5FVyg/KSB2YWx1ZQotCQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeyAvLyBuZXZlciBjcmVhdGUgYW4gZW1wdHkgYXR0cmlidXRlCi0JCQkJCQlBdHRyIG5ld0F0dHIgPSBmTm9kZS5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQXR0cmlidXRlKG5hbWUpOwotCQkJCQkJaWYgKG5ld0F0dHIgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCQkJCSgoSURPTU5vZGUpIG5ld0F0dHIpLnNldFZhbHVlU291cmNlKHZhbHVlU3RyaW5nKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCW5ld0F0dHIuc2V0VmFsdWUodmFsdWVTdHJpbmcpOwotCQkJCQkJfQotCQkJCQkJYXR0ck1hcC5zZXROYW1lZEl0ZW0obmV3QXR0cik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoZk5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJCSgoRWxlbWVudCkgZk5vZGUpLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZVN0cmluZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChET01FeGNlcHRpb24gZSkgewotCQkJRGlzcGxheSBkID0gZ2V0RGlzcGxheSgpOwotCQkJaWYgKGQgIT0gbnVsbCkgewotCQkJCWQuYmVlcCgpOwotCQkJfQotCQl9Ci0JCWZWYWx1ZXNCZWluZ1NldC5wb3AoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCQlpZiAoKGZEZXNjcmlwdG9ycyA9PSBudWxsKSB8fCAoZkRlc2NyaXB0b3JzLmxlbmd0aCA9PSAwKSkgewotCQkJLy8gTm90aGluZyB0byB1cGRhdGUKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIExpc3Qgb2YgYWxsIG5hbWVzIGVuY291bnRlcmVkIGluIHRoZSB0YWcgYW5kIGRlZmluZWQgYnkgdGhlIGVsZW1lbnQKLQkJTGlzdCBkZWNsYXJlZE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBOZXcgZGVzY3JpcHRvciBsaXN0IHRoYXQgd2lsbCBiZWNvbWUgZkRlc2NyaXB0b3JzIGFmdGVyIGFsbAotCQkvLyBwcm9jZXNzaW5nIGlzIGRvbmUKLQkJTGlzdCBkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gTmFtZXMgb2YgdGhlIGRlc2NyaXB0b3JzIGluIHRoZSBhYm92ZSBMaXN0Ci0JCUxpc3QgZGVzY3JpcHRvck5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIFVwZGF0ZSBhbnkgZGVzY3JpcHRvcnMgZGVyaXZlZCBmcm9tIHRoZSBtZXRhaW5mbwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldERlY2xhcmF0aW9uKCk7Ci0JCUNNTmFtZWROb2RlTWFwIGF0dHJNYXAgPSBudWxsOwotCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJYXR0ck1hcCA9IGVkLmdldEF0dHJpYnV0ZXMoKTsKLQkJCUNNTmFtZWROb2RlTWFwSW1wbCBhbGxBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbChhdHRyTWFwKTsKLQkJCUxpc3Qgbm9kZXMgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGZOb2RlLmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QXZhaWxhYmxlQ29udGVudCgoRWxlbWVudCkgZk5vZGUsIGVkLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IG5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQkJQ01Ob2RlIGNtbm9kZSA9IChDTU5vZGUpIG5vZGVzLmdldChrKTsKLQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCQlhbGxBdHRyaWJ1dGVzLnB1dChjbW5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWF0dHJNYXAgPSBhbGxBdHRyaWJ1dGVzOwotCQl9Ci0JCS8vIFVwZGF0ZSBleGl0aW5nIGRlc2NyaXB0b3JzOyBub3QgYWRkZWQgdG8gdGhlIGZpbmFsIGxpc3QgaGVyZQotCQlpZiAoYXR0ck1hcCAhPSBudWxsKSB7Ci0JCQkvLyBVcGRhdGUgZXhpc3RpbmcgZGVzY3JpcHRvciB0eXBlcyBiYXNlZCBvbiBtZXRhaW5mbwotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJNYXAuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCWF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJNYXAuaXRlbShpKTsKLQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuY29tcHV0ZU5hbWUoYXR0ckRlY2wsIGZOb2RlLCBudWxsKTsKLQkJCQlpZiAoIWRlY2xhcmVkTmFtZXMuY29udGFpbnMoYXR0ck5hbWUpKSB7Ci0JCQkJCWRlY2xhcmVkTmFtZXMuYWRkKGF0dHJOYW1lKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmRGVzY3JpcHRvcnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJYm9vbGVhbiBzYW1lTmFtZSA9IChmQ2FzZVNlbnNpdGl2ZSAmJiBmRGVzY3JpcHRvcnNbal0uZ2V0SWQoKS5lcXVhbHMoYXR0ckRlY2wuZ2V0Tm9kZU5hbWUoKSkpIHx8ICghZkNhc2VTZW5zaXRpdmUgJiYgYXR0ckRlY2wuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoZkRlc2NyaXB0b3JzW2pdLmdldElkKCkudG9TdHJpbmcoKSkpOwotCQkJCQlpZiAoc2FtZU5hbWUpIHsKLQkJCQkJCVN0cmluZ1tdIHZhbGlkVmFsdWVzID0gZ2V0VmFsaWRWYWx1ZXMoYXR0ckRlY2wpOwotCQkJCQkJLy8gVXBkYXRlIHRoZSBkZXNjcmlwdG9yIGZvciB0aGlzCi0JCQkJCQkvLyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIChvbmx5IGVudW1lcmF0ZWQgdmFsdWVzIGdldAotCQkJCQkJLy8gdXBkYXRlZCBmb3Igbm93KQotCQkJCQkJaWYgKGZEZXNjcmlwdG9yc1tqXSBpbnN0YW5jZW9mIEVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3IpIHsKLQkJCQkJCQkoKEVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3IpIGZEZXNjcmlwdG9yc1tqXSkudXBkYXRlVmFsdWVzKHZhbGlkVmFsdWVzKTsKLQkJCQkJCX0KLQkJCQkJCS8vIFJlcGxhY2Ugd2l0aCBiZXR0ZXIgZGVzY3JpcHRvcgotCQkJCQkJZWxzZSBpZiAoKHZhbGlkVmFsdWVzICE9IG51bGwpICYmICh2YWxpZFZhbHVlcy5sZW5ndGggPiAwKSkgewotCQkJCQkJCWZEZXNjcmlwdG9yc1tqXSA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihhdHRyRGVjbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBVcGRhdGUgZXhpc3RpbmcgZGVzY3JpcHRvcnMgYmFzZWQgb24gbm90IGhhdmluZyBhbnkgbWV0YWluZm8KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZkRlc2NyaXB0b3JzLmxlbmd0aDsgaisrKSB7Ci0JCQkJLy8gUmVwbGFjZSB3aXRoIGJhc2ljIGRlc2NyaXB0b3IKLQkJCQlpZiAoIShmRGVzY3JpcHRvcnNbal0gaW5zdGFuY2VvZiBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKSkgewotCQkJCQlmRGVzY3JpcHRvcnNbal0gPSBjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKChTdHJpbmcpIGZEZXNjcmlwdG9yc1tqXS5nZXRJZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGZOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkvLyBSZW1vdmUgZGVzY3JpcHRvcnMgZm9yIGF0dHJpYnV0ZXMgdGhhdCBhcmVuJ3QgcHJlc2VudCBBTkQgYXJlbid0Ci0JCS8vIGtub3duIHRocm91Z2ggbWV0YWluZm8sCi0JCS8vIGRvIHRoaXMgYnkgb25seSByZXVzaW5nIGV4aXN0aW5nIGRlc2NyaXB0b3JzIGZvciBhdHRyaWJ1dGVzIHRoYXQKLQkJLy8gYXJlIHByZXNlbnQgb3IgZGVjbGFyZWQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmRGVzY3JpcHRvcnNbaV0gIT0gbnVsbCkgewotCQkJCVN0cmluZyBkZXNjcmlwdG9yTmFtZSA9IGZEZXNjcmlwdG9yc1tpXS5nZXRJZCgpLnRvU3RyaW5nKCk7Ci0JCQkJaWYgKChkZWNsYXJlZE5hbWVzLmNvbnRhaW5zKGRlc2NyaXB0b3JOYW1lKSB8fCAoYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oZGVzY3JpcHRvck5hbWUpICE9IG51bGwpKSAmJiAhZGVzY3JpcHRvck5hbWVzLmNvbnRhaW5zKGRlc2NyaXB0b3JOYW1lKSkgewotCQkJCQlkZXNjcmlwdG9yTmFtZXMuYWRkKGRlc2NyaXB0b3JOYW1lKTsKLQkJCQkJZGVzY3JpcHRvcnMuYWRkKGZEZXNjcmlwdG9yc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gQWRkIGRlc2NyaXB0b3JzIGZvciBkZWNsYXJlZCBhdHRyaWJ1dGVzIHRoYXQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZQotCQlpZiAoYXR0ck1hcCAhPSBudWxsKSB7Ci0JCQkvLyBVcGRhdGUgZXhpc3RpbmcgZGVzY3JpcHRvciB0eXBlcyBiYXNlZCBvbiBtZXRhaW5mbwotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJNYXAuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCWF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJNYXAuaXRlbShpKTsKLQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuY29tcHV0ZU5hbWUoYXR0ckRlY2wsIGZOb2RlLCBudWxsKTsKLQkJCQlpZiAoZkNhc2VTZW5zaXRpdmUpIHsKLQkJCQkJaWYgKCFkZXNjcmlwdG9yTmFtZXMuY29udGFpbnMoYXR0ck5hbWUpKSB7Ci0JCQkJCQlJUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ckRlY2wpOwotCQkJCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQkJCWRlc2NyaXB0b3JOYW1lcy5hZGQoYXR0ck5hbWUpOwotCQkJCQkJCWRlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYm9vbGVhbiBleGlzdHMgPSBmYWxzZTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9yTmFtZXMuc2l6ZSgpOyBqKyspIHsKLQkJCQkJCWV4aXN0cyA9IChkZXNjcmlwdG9yTmFtZXMuZ2V0KGopLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpIHx8IGV4aXN0czsKLQkJCQkJfQotCQkJCQlpZiAoIWV4aXN0cykgewotCQkJCQkJZGVzY3JpcHRvck5hbWVzLmFkZChhdHRyTmFtZSk7Ci0JCQkJCQlJUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ckRlY2wpOwotCQkJCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQkJCWRlc2NyaXB0b3JOYW1lcy5hZGQoYXR0ck5hbWUpOwotCQkJCQkJCWRlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIEFkZCBkZXNjcmlwdG9ycyBmb3IgZXhpc3RpbmcgYXR0cmlidXRlcyB0aGF0IGRvbid0IGFscmVhZHkgaGF2ZSBvbmUKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlBdHRyIGF0dHIgPSAoQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJCVN0cmluZyBhdHRyTmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQkJCWlmIChmQ2FzZVNlbnNpdGl2ZSkgewotCQkJCQlpZiAoIWRlc2NyaXB0b3JOYW1lcy5jb250YWlucyhhdHRyTmFtZSkpIHsKLQkJCQkJCWRlc2NyaXB0b3JOYW1lcy5hZGQoYXR0ck5hbWUpOwotCQkJCQkJZGVzY3JpcHRvcnMuYWRkKGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ck5hbWUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYm9vbGVhbiBleGlzdHMgPSBmYWxzZTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9yTmFtZXMuc2l6ZSgpOyBqKyspIHsKLQkJCQkJCWV4aXN0cyA9IChkZXNjcmlwdG9yTmFtZXMuZ2V0KGopLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpIHx8IGV4aXN0czsKLQkJCQkJfQotCQkJCQlpZiAoIWV4aXN0cykgewotCQkJCQkJZGVzY3JpcHRvck5hbWVzLmFkZChhdHRyTmFtZSk7Ci0JCQkJCQlkZXNjcmlwdG9ycy5hZGQoY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihhdHRyTmFtZSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gVXBkYXRlIGZEZXNjcmlwdG9ycwotCQlJUHJvcGVydHlEZXNjcmlwdG9yW10gbmV3RGVzY3JpcHRvcnMgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltkZXNjcmlwdG9ycy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld0Rlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQluZXdEZXNjcmlwdG9yc1tpXSA9IChJUHJvcGVydHlEZXNjcmlwdG9yKSBkZXNjcmlwdG9ycy5nZXQoaSk7Ci0JCX0KLQkJZkRlc2NyaXB0b3JzID0gbmV3RGVzY3JpcHRvcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAxOGIwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50Lk5vZGVMb2NhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzIGV4dGVuZHMgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgewotCS8qKgotCSAqIFJldHVybnMgYSBXM0MgRE9NIGRvY3VtZW50Ci0JICogCi0JICogQHJldHVybiBEb2N1bWVudCBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgY29ycmVzcG9uZGluZwotCSAqICAgICAgICAgZG9jdW1lbnQgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlEb2N1bWVudCBnZXRET01Eb2N1bWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVzNDIERPTSBOb2RlIGF0IHRoZSBnaXZlbiBvZmZzZXQKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgSURvY3VtZW50Ci0JICogQHJldHVybiBhIE5vZGUgYXQgdGhhdCBsb2NhdGlvbiwgaWYgb25lIGlzIHByZXNlbnQKLQkgKiAKLQkgKiBAdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgZm9yIGludmFsaWQgb2Zmc2V0cwotCSAqLwotCU5vZGUgZ2V0Tm9kZShpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgTm9kZUxvY2F0aW9uIG9iamVjdCBkZXNjcmliaW5nIHRoZSBwb3NpdGlvbiBpbmZvcm1hdGlvbiBvZgotCSAqIHRoZSBOb2RlJ3Mgc3RhcnQgYW5kIGVuZCB0YWdzLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybiBUaGUgTm9kZUxvY2F0aW9uIGZvciB0aGlzIE5vZGUsIG51bGwgZm9yIHVuc3VwcG9ydGVkIE5vZGUKLQkgKiAgICAgICAgIGluc3RhbmNlcy4KLQkgKi8KLQlOb2RlTG9jYXRpb24gZ2V0Tm9kZUxvY2F0aW9uKE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNlcnZlci1zaWRlIHBhZ2UgbGFuZ3VhZ2UgZm9yIHRoZSBEb2N1bWVudCBvZiB0aGUKLQkgKiBnaXZlbiBOb2RlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHNlcnZlci1zaWRlIHBhZ2UgbGFuZ3VhZ2UgZm9yIHRoaXMgbm9kZW0gbnVsbCBmb3IgTm9kZXMKLQkgKiAgICAgICAgIHdpdGhpbiB1bnN1cHBvcnRlZCBEb2N1bWVudHMuCi0JICovCi0JU3RyaW5nIGdldFBhZ2VMYW5ndWFnZShOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogUmV0dXJucyBzdGFydCBvZmZzZXQgb2YgZ2l2ZW4gTm9kZS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgdzNjIDxjb2RlPk5vZGU8L2NvZGU+IG9iamVjdCB0byBjaGVjawotCSAqIEByZXR1cm4gdGhlIHN0YXJ0IG9mZnNldCBvciAtMSBmb3IgdW5zdXBwb3J0ZWQgTm9kZXMKLQkgKi8KLQlpbnQgZ2V0U3RhcnRPZmZzZXQoTm9kZSBub2RlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9YTUxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvWE1MU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2EzMzdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9YTUxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQuTm9kZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTVRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIGludGVyZmFjZQotICovCi1wdWJsaWMgY2xhc3MgWE1MU291cmNlRWRpdGluZ1RleHRUb29scyBpbXBsZW1lbnRzIElET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzLCBJTm9kZUFkYXB0ZXIgewotCi0JcHJvdGVjdGVkIGNsYXNzIE5vZGVMb2NhdGlvbkltcGwgaW1wbGVtZW50cyBOb2RlTG9jYXRpb24gewotCQlwcml2YXRlIElET01Ob2RlIG5vZGU7Ci0KLQkJcHVibGljIE5vZGVMb2NhdGlvbkltcGwoSURPTU5vZGUgeG1sbm9kZSkgewotCQkJc3VwZXIoKTsKLQkJCW5vZGUgPSB4bWxub2RlOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRFbmRUYWdFbmRPZmZzZXQoKSB7Ci0JCQlpZiAobm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEVuZFRhZ1N0YXJ0T2Zmc2V0KCkgewotCQkJaWYgKG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkgewotCQkJCXJldHVybiBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldFN0YXJ0VGFnRW5kT2Zmc2V0KCkgewotCQkJaWYgKG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoKTsKLQkJCX0KLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0U3RhcnRUYWdTdGFydE9mZnNldCgpIHsKLQkJCWlmIChub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkgewotCQkJCXJldHVybiBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCX0KLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCVN0cnVjdHVyZWRUZXh0RWRpdG9yIGZUZXh0RWRpdG9yID0gbnVsbDsKLQotCXB1YmxpYyBpbnQgZ2V0Q2FyZXRPZmZzZXQoKSB7Ci0JCVN0cnVjdHVyZWRUZXh0Vmlld2VyIHN0diA9IGZUZXh0RWRpdG9yLmdldFRleHRWaWV3ZXIoKTsKLQkJaWYgKChzdHYgIT0gbnVsbCkgJiYgKHN0di5nZXRUZXh0V2lkZ2V0KCkgIT0gbnVsbCkgJiYgIXN0di5nZXRUZXh0V2lkZ2V0KCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm4gc3R2LndpZGdldE9mZnNldDJNb2RlbE9mZnNldChzdHYuZ2V0VGV4dFdpZGdldCgpLmdldENhcmV0T2Zmc2V0KCkpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmVGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JfQotCi0JcHVibGljIERvY3VtZW50IGdldERPTURvY3VtZW50KCkgewotCQlyZXR1cm4gKERvY3VtZW50KSBmVGV4dEVkaXRvci5nZXRNb2RlbCgpLmdldEFkYXB0ZXIoRG9jdW1lbnQuY2xhc3MpOwotCX0KLQotCS8qCi0JICogSWYgc2ltaWxhciBmdW5jdGlvbiBpcyBuZWVkZWQsIGNvbXBvc2l0ZSBpdCBhcm91bmQgdGhlIHRleHQgZWRpdG9yJ3MKLQkgKiBpbnN0YW5jZS4gUmVtb3ZlZCBhbHNvIGJlY2F1c2UgaXQgcmV0dXJucyBhbiBhbHJlYWQtcmVsZWFzZWQgbW9kZWwKLQkgKiAKLQkgKiBwdWJsaWMgRG9jdW1lbnQgZ2V0RE9NRG9jdW1lbnQoSU1hcmtlciBtYXJrZXIpIHsgaWYgKG1hcmtlciA9PSBudWxsKQotCSAqIHJldHVybiBudWxsOwotCSAqIAotCSAqIElSZXNvdXJjZSByZXMgPSBtYXJrZXIuZ2V0UmVzb3VyY2UoKTsgaWYgKHJlcyA9PSBudWxsIHx8ICEocmVzCi0JICogaW5zdGFuY2VvZiBJRmlsZSkpIHJldHVybiBudWxsOwotCSAqIAotCSAqIElNb2RlbE1hbmFnZXIgbW0gPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCSAqIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOyB0cnkgeyBtb2RlbCA9Ci0JICogbW0uZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoKElGaWxlKSByZXMpOyBpZiAobW9kZWwgPT0gbnVsbCB8fCAhKG1vZGVsCi0JICogaW5zdGFuY2VvZiBJRE9NTW9kZWwpKSByZXR1cm4gbnVsbDsKLQkgKiAKLQkgKiByZXR1cm4gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOyB9IGZpbmFsbHkgeyBpZiAobW9kZWwgIT0KLQkgKiBudWxsKSBtb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsgfSB9Ci0JICovCi0KLQlwdWJsaWMgSUVkaXRvclBhcnQgZ2V0RWRpdG9yUGFydCgpIHsKLQkJcmV0dXJuIGZUZXh0RWRpdG9yLmdldEVkaXRvclBhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBnZXROb2RlKGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCU5vZGUgbm9kZSA9IG51bGw7Ci0JCWlmICgoMCA8PSBvZmZzZXQpICYmIChvZmZzZXQgPD0gZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKSkpIHsKLQkJCW5vZGUgPSAoTm9kZSkgZlRleHRFZGl0b3IuZ2V0TW9kZWwoKS5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aHJvdyBuZXcgQmFkTG9jYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9ucy5Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzI2dldE5vZGVMb2NhdGlvbihvcmcudzNjLmRvbS5Ob2RlKQotCSAqLwotCXB1YmxpYyBOb2RlTG9jYXRpb24gZ2V0Tm9kZUxvY2F0aW9uKE5vZGUgbm9kZSkgewotCQlpZiAoKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgJiYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkpIHsKLQkJCXJldHVybiBuZXcgTm9kZUxvY2F0aW9uSW1wbCgoSURPTU5vZGUpIG5vZGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUxhbmd1YWdlKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gKElUZXh0U2VsZWN0aW9uKSBmVGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIElFeHRlbmRlZE1hcmt1cEVkaXRvciBtZXRob2QKLQkgKi8KLQkvLyBwdWJsaWMgTGlzdCBnZXRTZWxlY3RlZE5vZGVzKCkgewotCS8vIFZpZXdlclNlbGVjdGlvbk1hbmFnZXIgdnNtID0gZ2V0Vmlld2VyU2VsZWN0aW9uTWFuYWdlcigpOwotCS8vIHJldHVybiAodnNtICE9IG51bGwpID8gdnNtLmdldFNlbGVjdGVkTm9kZXMoKSA6IG51bGw7Ci0JLy8gfQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoTm9kZSBub2RlKSB7Ci0JCWlmICgobm9kZSA9PSBudWxsKSB8fCAhKG5vZGUgaW5zdGFuY2VvZiBJRE9NVGV4dCkpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm5vZGUgPSAoKElET01UZXh0KSBub2RlKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlyZXR1cm4gZm5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jb3JlLklOb2RlQWRhcHRlciNpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuY2xhc3MuZXF1YWxzKHR5cGUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNvcmUuSU5vZGVBZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNvcmUuSU5vZGVOb3RpZmllciwKLQkgKiAgICAgIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHRFZGl0b3IoU3RydWN0dXJlZFRleHRFZGl0b3IgZWRpdG9yKSB7Ci0JCWZUZXh0RWRpdG9yID0gZWRpdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckZvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzk0YTE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5ET01PYnNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxVSVByZWZlcmVuY2VOYW1lczsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JYTUwgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLQotCS8qCi0JICogQHNlZSBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyI2FkZEFkYXB0ZXJGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBZGFwdGVyRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0KLQkJLy8gYWRkIHRoZSBub3JtYWwgY29udGVudCBiYXNlZCBmYWN0b3JpZXMgdG8gbW9kZWwncyByZWdpc3RyeQotCQlhZGRDb250ZW50QmFzZWRGYWN0b3JpZXMoc3RydWN0dXJlZE1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZW50QmFzZWRGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeSA9IHN0cnVjdHVyZWRNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChmYWN0b3J5UmVnaXN0cnksICJQcm9ncmFtIEVycm9yOiBjbGllbnQgY2FsbGVyIG11c3QgZW5zdXJlIG1vZGVsIGhhcyBmYWN0b3J5IHJlZ2lzdHJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQotCQlmYWN0b3J5ID0gZmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlmYWN0b3J5ID0gbmV3IEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlmYWN0b3J5UmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCi0JCS8vIGNzLi4uIGFkZGVkIGZvciBpbmZlcnJlZCBncmFtbWFyIHN1cHBvcnQKLQkJLy8KLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KHN0cnVjdHVyZWRNb2RlbCk7Ci0JCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQkJQ01Eb2N1bWVudE1hbmFnZXIgZG9jdW1lbnRNYW5hZ2VyID0gbW9kZWxRdWVyeS5nZXRDTURvY3VtZW50TWFuYWdlcigpOwotCQkJCWlmIChkb2N1bWVudE1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkJCQlib29sZWFuIHVzZUluZmVycmVkR3JhbW1hciA9IChzdG9yZSAhPSBudWxsKSA/IHN0b3JlLmdldEJvb2xlYW4oWE1MVUlQcmVmZXJlbmNlTmFtZXMuVVNFX0lORkVSUkVEX0dSQU1NQVIpIDogdHJ1ZTsKLQotCQkJCQlkb2N1bWVudE1hbmFnZXIuc2V0UHJvcGVydHlFbmFibGVkKENNRG9jdW1lbnRNYW5hZ2VyLlBST1BFUlRZX0FTWU5DX0xPQUQsIHRydWUpOwotCQkJCQlkb2N1bWVudE1hbmFnZXIuc2V0UHJvcGVydHlFbmFibGVkKENNRG9jdW1lbnRNYW5hZ2VyLlBST1BFUlRZX0FVVE9fTE9BRCwgZmFsc2UpOwotCQkJCQlkb2N1bWVudE1hbmFnZXIuc2V0UHJvcGVydHlFbmFibGVkKENNRG9jdW1lbnRNYW5hZ2VyLlBST1BFUlRZX1VTRV9DQUNIRURfUkVTT0xWRURfVVJJLCB0cnVlKTsKLQkJCQkJRE9NT2JzZXJ2ZXIgZG9tT2JzZXJ2ZXIgPSBuZXcgRE9NT2JzZXJ2ZXIoc3RydWN0dXJlZE1vZGVsKTsKLQkJCQkJZG9tT2JzZXJ2ZXIuc2V0R3JhbW1hckluZmVyZW5jZUVuYWJsZWQodXNlSW5mZXJyZWRHcmFtbWFyKTsKLQkJCQkJZG9tT2JzZXJ2ZXIuaW5pdCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyI2lzRm9yKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRm9yKElEb2N1bWVudFR5cGVIYW5kbGVyIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24pIHsKLQkJcmV0dXJuIChjb250ZW50VHlwZURlc2NyaXB0aW9uIGluc3RhbmNlb2YgTW9kZWxIYW5kbGVyRm9yWE1MKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWluaXRpYWxpemVGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJLy8gbm90aGluZyB0byBkbywgc2luY2Ugbm8gZW1iZWRkZWQgdHlwZQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWFyY2gvWE1MRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWFyY2gvWE1MRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRmMmVjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc2VhcmNoL1hNTEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogU2V0cyB1cCBGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSBmb3IgeG1sIGZpbmQgb2NjdXJyZW5jZXMgcHJvY2Vzc29ycwotICovCi1wdWJsaWMgY2xhc3MgWE1MRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBMaXN0IGZQcm9jZXNzb3JzOwotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UHJvY2Vzc29ycygpIHsKLQkJaWYgKGZQcm9jZXNzb3JzID09IG51bGwpIHsKLQkJCWZQcm9jZXNzb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJWE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGh0bWxQcm9jZXNzb3IgPSBuZXcgWE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yKCk7Ci0JCQlmUHJvY2Vzc29ycy5hZGQoaHRtbFByb2Nlc3Nvcik7Ci0JCX0KLQkJcmV0dXJuIGZQcm9jZXNzb3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWFyY2gvWE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc2VhcmNoL1hNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjEyZmVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWFyY2gvWE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zOwotCi0vKioKLSAqIENvbmZpZ3VyZXMgYSBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3Igd2l0aCBYTUwgcGFydGl0aW9ucyBhbmQgcmVnaW9ucwotICovCi1wdWJsaWMgY2xhc3MgWE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGV4dGVuZHMgRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIHsKLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRQYXJ0aXRpb25UeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVH07Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFJlZ2lvblR5cGVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0RPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLCBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUsIERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUV9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdYTUxBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNThiZTUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEN1cnNvckluZGV4ZWRSZWdpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0KLQkJaW5kZXhlZFJlZ2lvbiA9IGdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnQsIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCi0JCXJldHVybiBpbmRleGVkUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIGN1cnNvck5vZGUgPSAoTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQotCQkJLy8gdXNlIHBhcmVudCBub2RlIGZvciBlbXB0eSB0ZXh0IG5vZGUKLQkJCWlmICgoY3Vyc29yTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAoY3Vyc29yTm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQljdXJzb3JOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQlpZiAoY3Vyc29yTm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJaW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBjdXJzb3JOb2RlOwotCQkJCX0KLQkJCX0KLQotCQkJUmVnaW9uIGN1cnNvck5vZGVSZWdpb24gPSBuZXcgUmVnaW9uKGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgaW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0KLQkJCWlmICgoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA+PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKSAmJiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA8PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSkgJiYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpID49IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpICYmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA8PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSkpIHsKLQkJCQlOb2RlIG5ld05vZGUgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbihuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIG5ld0luZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCW5ld1JlZ2lvbiA9IGN1cnNvck5vZGVSZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KFhNTFVJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXApOwotCQkJYWN0aW9uLnNldERlc2NyaXB0aW9uKFhNTFVJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2Rlc2NyaXB0aW9uKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdE5leHRYTUxBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MDg4YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEN1cnNvckluZGV4ZWRSZWdpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCWludCBvZmZzZXQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSAtIDE7Ci0JCWlmIChvZmZzZXQgPCAwKSB7Ci0JCQlvZmZzZXQgPSAwOwotCQl9Ci0KLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLQotCQlpbmRleGVkUmVnaW9uID0gZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudCwgb2Zmc2V0KTsKLQotCQlyZXR1cm4gaW5kZXhlZFJlZ2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVnaW9uIGdldE5ld1NlbGVjdGlvblJlZ2lvbihJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24sIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJUmVnaW9uIG5ld1JlZ2lvbiA9IG51bGw7Ci0JCWlmIChpbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBjdXJzb3JOb2RlID0gKE5vZGUpIGluZGV4ZWRSZWdpb247Ci0KLQkJCS8vIHVzZSBwYXJlbnQgbm9kZSBmb3IgZW1wdHkgdGV4dCBub2RlCi0JCQlpZiAoKGN1cnNvck5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKGN1cnNvck5vZGUuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJY3Vyc29yTm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJaWYgKGN1cnNvck5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCWluZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgY3Vyc29yTm9kZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCVJlZ2lvbiBjdXJzb3JOb2RlUmVnaW9uID0gbmV3IFJlZ2lvbihpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJaW50IGN1cnJlbnRPZmZzZXQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpOwotCQkJaW50IGN1cnJlbnRFbmRPZmZzZXQgPSBjdXJyZW50T2Zmc2V0ICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKTsKLQkJCWlmICgoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA+PSBjdXJyZW50T2Zmc2V0KSAmJiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA8PSBjdXJyZW50RW5kT2Zmc2V0KSAmJiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPj0gY3VycmVudE9mZnNldCkgJiYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpIDw9IGN1cnJlbnRFbmRPZmZzZXQpKSB7Ci0JCQkJbmV3UmVnaW9uID0gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uMihpbmRleGVkUmVnaW9uLCB0ZXh0U2VsZWN0aW9uKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5ld1JlZ2lvbiA9IGN1cnNvck5vZGVSZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChYTUxVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcCk7Ci0JCQlhY3Rpb24uc2V0RGVzY3JpcHRpb24oWE1MVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3ROZXh0X2Rlc2NyaXB0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdhcyBzZXBhcmF0ZWQgb3V0IGZyb20gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uMiBiZWNhdXNlIHRoZQotCSAqIGNvZGUgaW4gaGVyZSBpcyBhbGxvd2VkIHRvIGJlIGNhbGxlZCByZWN1cnNpdmVseS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXhlZFJlZ2lvbgotCSAqIEBwYXJhbSB0ZXh0U2VsZWN0aW9uCi0JICogQHJldHVybiBuZXcgcmVnaW9uIHRvIHNlbGVjdCBvciBudWxsIGlmIG5vbmUKLQkgKi8KLQlwcml2YXRlIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24yKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQkJCU5vZGUgbmV3Tm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmIChuZXdOb2RlID09IG51bGwpIHsKLQkJCQluZXdOb2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gbmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgbmV3SW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCi0JCQkJCWlmIChuZXdOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJCW5ld1JlZ2lvbiA9IGdldE5ld1NlbGVjdGlvblJlZ2lvbjIobmV3SW5kZXhlZFJlZ2lvbiwgbmV3IFRleHRTZWxlY3Rpb24obmV3UmVnaW9uLmdldE9mZnNldCgpLCBuZXdSZWdpb24uZ2V0TGVuZ3RoKCkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkzOWMzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RQcmV2aW91c1hNTEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3RQcmV2aW91c1hNTEFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEN1cnNvckluZGV4ZWRSZWdpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0KLQkJaW5kZXhlZFJlZ2lvbiA9IGdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnQsIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCi0JCXJldHVybiBpbmRleGVkUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIGN1cnNvck5vZGUgPSAoTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQotCQkJLy8gdXNlIHBhcmVudCBub2RlIGZvciBlbXB0eSB0ZXh0IG5vZGUKLQkJCWlmICgoY3Vyc29yTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAoY3Vyc29yTm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQljdXJzb3JOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQlpZiAoY3Vyc29yTm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJaW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBjdXJzb3JOb2RlOwotCQkJCX0KLQkJCX0KLQotCQkJUmVnaW9uIGN1cnNvck5vZGVSZWdpb24gPSBuZXcgUmVnaW9uKGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgaW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0KLQkJCWlmICgoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA+PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKSAmJiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA8PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSkgJiYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpID49IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpICYmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA8PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSkpIHsKLQkJCQlOb2RlIG5ld05vZGUgPSBjdXJzb3JOb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCWlmIChuZXdOb2RlID09IG51bGwpIHsKLQkJCQkJbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgbmV3SW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCi0JCQkJCQlpZiAobmV3Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCQkJbmV3UmVnaW9uID0gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24sIG5ldyBUZXh0U2VsZWN0aW9uKG5ld1JlZ2lvbi5nZXRPZmZzZXQoKSwgbmV3UmVnaW9uLmdldExlbmd0aCgpKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJCWVsc2UgewotCQkJCW5ld1JlZ2lvbiA9IGN1cnNvck5vZGVSZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoWE1MVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihYTUxVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2Rlc2NyaXB0aW9uKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c1hNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c1hNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTA1NWI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgQmVuamFtaW4gTXVza2FsbGEsIGIubXVza2FsbGFAZ214Lm5ldCAtIFsxNTg2NjBdIGNoYXJhY3RlciBlbnRpdGllcyBzaG91bGQgaGF2ZSB0aGVpciBvd24gc3ludGF4IGhpZ2hsaWdodGluZyBwcmVmZXJlbmNlICAgICAgCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZTsKLQotLyoqCi0gKiBDb250YWlucyB0aGUgc3ltYm9saWMgbmFtZSBvZiBzdHlsZXMgdXNlZCBieSBMaW5lU3R5bGVQcm92aWRlciwKLSAqIENvbG9yTWFuYWdlciwgYW5kIGFueSBvdGhlcnMgd2hvIG1heSBiZSBpbnRlcmVzdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlQ29uc3RhbnRzWE1MIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQUNLR1JPVU5EID0gImJhY2tncm91bmQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEFfQk9SREVSID0gImNkYXRhQm9yZGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEFfVEVYVCA9ICJjZGF0YVRleHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0JPUkRFUiA9ICJjb21tZW50Qm9yZGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9URVhUID0gImNvbW1lbnRUZXh0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDTF9CT1JERVIgPSAiZGVjbEJvZGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVFlQRV9FWFRFUk5BTF9JRCA9ICJkb2N0eXBlRXh0ZXJuYWxJZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGID0gImRvY3R5cGVFeHRlcm5hbFB1YnJlZiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGID0gImRvY3R5cGVFeHRyZW5hbFN5c3JlZiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1RZUEVfTkFNRSA9ICJkb2N0eXBlTmFtZSI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SRUdST1VORCA9ICJmb3JlZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX0JPUkRFUiA9ICJwaUJvcmRlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX0NPTlRFTlQgPSAicGlDb250ZW50IjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVRUUklCVVRFX0VRVUFMUyA9ICJ0YWdBdHRyaWJ1dGVFcXVhbHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUVFJJQlVURV9OQU1FID0gInRhZ0F0dHJpYnV0ZU5hbWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVRUUklCVVRFX1ZBTFVFID0gInRhZ0F0dHJpYnV0ZVZhbHVlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0JPUkRFUiA9ICJ0YWdCb3JkZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJ0YWdOYW1lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NPTlRFTlQgPSAieG1sQ29udGVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9SRUZFUkVOQ0UgPSAiZW50aXR5UmVmZXJlbmNlIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTg0NTQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgQmVuamFtaW4gTXVza2FsbGEsIGIubXVza2FsbGFAZ214Lm5ldCAtIFsxNTg2NjBdIGNoYXJhY3RlciBlbnRpdGllcyBzaG91bGQgaGF2ZSB0aGVpciBvd24gc3ludGF4IGhpZ2hsaWdodGluZyBwcmVmZXJlbmNlICAgICAKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwgZXh0ZW5kcyBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyIGltcGxlbWVudHMgTGluZVN0eWxlUHJvdmlkZXIgewotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlckZvclhNTCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCS8qKgotCQkgKiBhIG1ldGhvZCB0byBjZW50cmFsaXplIGFsbCB0aGUgImZvcm1hdCBydWxlcyIgZm9yIHJlZ2lvbnMKLQkJICogc3BlY2lmaWNhbGx5IGFzc29jaWF0ZWQgZm9yIGhvdyB0byAib3BlbiIgdGhlIHJlZ2lvbi4KLQkJICovCi0JCS8vIG5vdCBzdXJlIHdoeSB0aGlzIGlzIGNvbWluZyB0aHJvdWdoIG51bGwsIGJ1dCBqdXN0IHRvIGNhdGNoIGl0Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCk7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQpKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JCX0KLQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJfQotCQllbHNlIGlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRSkpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUik7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04pIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCX0KLQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfRVFVQUxTKTsKLQkJfQotCQllbHNlIGlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfQ0xPU0UpKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX05BTUUpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSk7Ci0JCX0KLQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BFX1JFRkVSRU5DRSkpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ09OVEVOVCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCk7Ci0JCX0KLQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ0xPU0UpKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIpOwotCQl9Ci0JCWVsc2UgaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRik7Ci0JCX0KLQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUMpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNKSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LldISVRFX1NQQUNFKSB7Ci0JCQkvLyB3aGl0ZSBzcGFjZSBpcyBub3JtYWxsIG5vdCBvbiBpdHMgb3duIC4uLiBidXQgd2hlbiBpdCBpcywgd2UnbGwKLQkJCS8vIHRyZWF0IGFzIGNvbnRlbnQKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGRlZmF1bHQsIHJldHVybiBudWxsIHRvIHNpZ25hbCAibm90IGhhbmRsZWQiCi0JCQkvLyBpbiB3aGljaCBjYXNlLCBvdGhlciBmYWN0b3JpZXMgc2hvdWxkIGJlIHRyaWVkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3R5bGVLZXkgPSBudWxsOwotCi0JCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZktleSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkvLyBjaGVjayBpZiBwcmVmZXJlbmNlIGNoYW5nZWQgaXMgYSBzdHlsZSBwcmVmZXJlbmNlCi0JCQlpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUy5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUzsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhUOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuRU5USVRZX1JFRkVSRU5DRTsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVDsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lELmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUY7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRTsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5QSV9DT05URU5ULmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVDsKLQkJCX0KLQkJfQotCi0JCWlmIChzdHlsZUtleSAhPSBudWxsKSB7Ci0JCQkvLyBvdmVyd3JpdGUgc3R5bGUgcHJlZmVyZW5jZSB3aXRoIG5ldyB2YWx1ZQotCQkJYWRkVGV4dEF0dHJpYnV0ZShzdHlsZUtleSk7Ci0JCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0ZXh0IGF0dHJpYnV0ZXMgaW50byBtYXAuIE1ha2Ugc3VyZSBtYXAgaXMgY2xlYXJlZCBiZWZvcmUgY2FsbGluZwotCSAqIHRoaXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZENvbG9ycygpIHsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfRVFVQUxTKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkVOVElUWV9SRUZFUkVOQ0UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWdpbmZvL01hcmt1cFRhZ0luZm9Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhZ2luZm8vTWFya3VwVGFnSW5mb1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NTEzZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhZ2luZm8vTWFya3VwVGFnSW5mb1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURlc2NyaXB0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLS8qKgotICogUHJvdmlkZXMgYmFzaWMgdGFnIGluZm9ybWF0aW9uIHN1Y2ggYXMgZWxlbWVudC9hdHRyaWJ1dGUgbmFtZSwgZGF0YSB0eXBlLAotICogYW5kIHRhZyBpbmZvL2RvY3VtZW50YXRpb24gZm9yIENNTm9kZXMuIFVzZXMgSFRNTCB0byBlbmhhbmNlIHByZXNlbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE1hcmt1cFRhZ0luZm9Qcm92aWRlciB7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQk9MRF9FTkQgPSAiPC9iPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBCT0xEX1NUQVJUID0gIjxiPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBIRUFESU5HX0VORCA9ICI8L2g1PiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBIRUFESU5HX1NUQVJUID0gIjxoNT4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgTElTVF9CRUdJTiA9ICI8dWw+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIExJU1RfRUxFTUVOVCA9ICI8bGk+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIE5FV19MSU5FID0gIjxkbD4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSQUdSQVBIX0VORCA9ICI8L3A+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBUkFHUkFQSF9TVEFSVCA9ICI8cD4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1BBQ0UgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybnMgYmFzaWMgdGFnIGluZm9ybWF0aW9uIGZvciBkaXNwbGF5IGdpdmVuIGEgQ01Ob2RlCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluZm8oQ01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkvLyB3ZSBhc3N1bWUgdGhhdCBpZiB0aGVyZSBpcyB0YWdJbmZvIHByZXNlbnQsIG9ubHkgZGlzcGxheSB0YWdJbmZvCi0JCXByaW50VGFnSW5mbyhzYiwgbm9kZSk7Ci0KLQkJLy8gbm8gdGFnSW5mbyBwcmVzZW50LCBzbyB0cnkgdG8gZGlzcGxheSB0YWcgZGVzY3JpcHRpb24KLQkJaWYgKHNiLmxlbmd0aCgpID09IDApIHsKLQkJCXByaW50RGVzY3JpcHRpb24oc2IsIG5vZGUpOwotCQl9Ci0KLQkJLy8gbm8gdGFnIGRlc2NyaXB0aW9uIHByZXNlbnQgZWl0aGVyLCBzbyBkaXNwbGF5IGRlZmF1bHQgaW5mbwotCQlpZiAoc2IubGVuZ3RoKCkgPT0gMCkgewotCQkJcHJpbnREZWZhdWx0SW5mbyhub2RlLCBzYik7Ci0JCX0KLQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGRhdGFUeXBlJ3MgZGF0YSB0eXBlIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgZW51bWVyYXRlZCB0eXBlIHZhbHVlcwotCSAqIHRvIHN0cmluZyBidWZmZXIsIHNiCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbnREYXRhVHlwZUluZm8oU3RyaW5nQnVmZmVyIHNiLCBDTURhdGFUeXBlIGRhdGFUeXBlKSB7Ci0JCVN0cmluZyBkYXRhVHlwZU5hbWUgPSBkYXRhVHlwZS5nZXROb2RlTmFtZSgpOwotCQlpZiAoKGRhdGFUeXBlTmFtZSAhPSBudWxsKSAmJiAoZGF0YVR5cGVOYW1lLmxlbmd0aCgpID4gMCkpIHsKLQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfU1RBUlQgKyBCT0xEX1NUQVJUICsgWE1MVUlNZXNzYWdlcy5EYXRhX1R5cGVfX19fNCArIFNQQUNFICsgQk9MRF9FTkQpOwotCQkJc2IuYXBwZW5kKGRhdGFUeXBlTmFtZSk7Ci0JCQlzYi5hcHBlbmQoUEFSQUdSQVBIX0VORCk7Ci0JCX0KLQkJU3RyaW5nW10gZW51bWVyYXRlZFZhbHVlID0gZGF0YVR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCQlpZiAoKGVudW1lcmF0ZWRWYWx1ZSAhPSBudWxsKSAmJiAoZW51bWVyYXRlZFZhbHVlLmxlbmd0aCA+IDApKSB7Ci0JCQlzYi5hcHBlbmQoUEFSQUdSQVBIX1NUQVJUICsgQk9MRF9TVEFSVCArIFhNTFVJTWVzc2FnZXMuRW51bWVyYXRlZF9WYWx1ZXNfX19fNSArIFNQQUNFICsgQk9MRF9FTkQpOwotCQkJc2IuYXBwZW5kKExJU1RfQkVHSU4pOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtZXJhdGVkVmFsdWUubGVuZ3RoOyBpKyspIHsKLQkJCQlzYi5hcHBlbmQoTElTVF9FTEVNRU5UICsgZW51bWVyYXRlZFZhbHVlW2ldKTsKLQkJCX0KLQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfRU5EKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGRlZmF1bHQgaW5mbyAoZWxlbWVudCBuYW1lLCBjb250ZW50IG1vZGVsLCBkYXRhIHR5cGUpIG9mCi0JICogQ01Ob2RlIHRvIHRoZSBzdHJpbmcgYnVmZmVyLCBzYgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50RGVmYXVsdEluZm8oQ01Ob2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzYikgewotCQl7Ci0KLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pIHsKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgbm9kZTsKLQkJCQlzYi5hcHBlbmQoUEFSQUdSQVBIX1NUQVJUICsgQk9MRF9TVEFSVCArIFhNTFVJTWVzc2FnZXMuRWxlbWVudF9fX18xICsgU1BBQ0UgKyBCT0xEX0VORCk7Ci0JCQkJc2IuYXBwZW5kKG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJc2IuYXBwZW5kKFBBUkFHUkFQSF9FTkQpOwotCQkJCXByaW50RG9jdW1lbnRhdGlvbihzYiwgbm9kZSk7Ci0JCQkJaWYgKGVkLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uUENEQVRBKSB7Ci0JCQkJCUNNRGF0YVR5cGUgZGF0YVR5cGUgPSBlZC5nZXREYXRhVHlwZSgpOwotCQkJCQlpZiAoZGF0YVR5cGUgIT0gbnVsbCkgewotCQkJCQkJcHJpbnREYXRhVHlwZUluZm8oc2IsIGRhdGFUeXBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJQ01EZXNjcmlwdGlvbkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBDTURlc2NyaXB0aW9uQnVpbGRlcigpOwotCQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBidWlsZGVyLmJ1aWxkRGVzY3JpcHRpb24obm9kZSk7Ci0JCQkJCWlmICgoZGVzY3JpcHRpb24gIT0gbnVsbCkgJiYgKGRlc2NyaXB0aW9uLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfU1RBUlQgKyBCT0xEX1NUQVJUICsgWE1MVUlNZXNzYWdlcy5Db250ZW50X01vZGVsX19fXzIgKyBTUEFDRSArIEJPTERfRU5EKTsKLQkJCQkJCXNiLmFwcGVuZChkZXNjcmlwdGlvbiArIFBBUkFHUkFQSF9FTkQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pIHsKLQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIG5vZGU7Ci0JCQkJc2IuYXBwZW5kKFBBUkFHUkFQSF9TVEFSVCArIEJPTERfU1RBUlQgKyBYTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9fX18zICsgU1BBQ0UgKyBCT0xEX0VORCk7Ci0JCQkJc2IuYXBwZW5kKG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJc2IuYXBwZW5kKFBBUkFHUkFQSF9FTkQpOwotCQkJCXByaW50RG9jdW1lbnRhdGlvbihzYiwgbm9kZSk7Ci0JCQkJQ01EYXRhVHlwZSBkYXRhVHlwZSA9IGFkLmdldEF0dHJUeXBlKCk7Ci0JCQkJaWYgKGRhdGFUeXBlICE9IG51bGwpIHsKLQkJCQkJcHJpbnREYXRhVHlwZUluZm8oc2IsIGRhdGFUeXBlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkRBVEFfVFlQRSkgewotCQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfU1RBUlQgKyBCT0xEX1NUQVJUICsgWE1MVUlNZXNzYWdlcy5EYXRhX1R5cGVfX19fNCArIFNQQUNFICsgQk9MRF9FTkQpOwotCQkJCXNiLmFwcGVuZChub2RlLmdldE5vZGVOYW1lKCkpOwotCQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfRU5EKTsKLQkJCQlwcmludERvY3VtZW50YXRpb24oc2IsIG5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkgb2YgdGhlIENNTm9kZSB0byB0aGUgc3RyaW5nIGJ1ZmZlciwgc2IKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludERlc2NyaXB0aW9uKFN0cmluZ0J1ZmZlciBzYiwgQ01Ob2RlIG5vZGUpIHsKLQkJU3RyaW5nIHRhZ0luZm8gPSAoU3RyaW5nKSBub2RlLmdldFByb3BlcnR5KCJkZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh0YWdJbmZvICE9IG51bGwpIHsKLQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfU1RBUlQgKyB0YWdJbmZvLnRyaW0oKSArIFBBUkFHUkFQSF9FTkQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgdGFnIGRvY3VtZW50YXRpb24gcHJvcGVydHkgb2YgdGhlIENNTm9kZSB0byB0aGUgc3RyaW5nIGJ1ZmZlciwKLQkgKiBzYgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50RG9jdW1lbnRhdGlvbihTdHJpbmdCdWZmZXIgc2IsIENNTm9kZSBub2RlKSB7Ci0JCUNNTm9kZUxpc3Qgbm9kZUxpc3QgPSAoQ01Ob2RlTGlzdCkgbm9kZS5nZXRQcm9wZXJ0eSgiZG9jdW1lbnRhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICgobm9kZUxpc3QgIT0gbnVsbCkgJiYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCUNNRG9jdW1lbnRhdGlvbiBkb2N1bWVudGF0aW9uID0gKENNRG9jdW1lbnRhdGlvbikgbm9kZUxpc3QuaXRlbShpKTsKLQkJCQlTdHJpbmcgZG9jID0gZG9jdW1lbnRhdGlvbi5nZXRWYWx1ZSgpOwotCQkJCWlmIChkb2MgIT0gbnVsbCkgewotCQkJCQlzYi5hcHBlbmQoUEFSQUdSQVBIX1NUQVJUICsgZG9jLnRyaW0oKSArIFBBUkFHUkFQSF9FTkQpOwotCQkJCX0KLQkJCX0KLQkJCXNiLmFwcGVuZChORVdfTElORSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSB0YWcgaW5mbyBwcm9wZXJ0eSBvZiB0aGUgQ01Ob2RlIHRvIHRoZSBzdHJpbmcgYnVmZmVyLCBzYgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50VGFnSW5mbyhTdHJpbmdCdWZmZXIgc2IsIENNTm9kZSBub2RlKSB7Ci0JCVN0cmluZyB0YWdJbmZvID0gKFN0cmluZykgbm9kZS5nZXRQcm9wZXJ0eSgidGFnSW5mbyIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh0YWdJbmZvICE9IG51bGwpIHsKLQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfU1RBUlQgKyB0YWdJbmZvLnRyaW0oKSArIFBBUkFHUkFQSF9FTkQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhZ2luZm8vWE1MSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhZ2luZm8vWE1MSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTc2YTY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWdpbmZvL1hNTEluZm9ybWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotCi0vKioKLSAqIFByb3ZpZGVzIGNvbnRleHQgaW5mb3JtYXRpb24gZm9yIFhNTCB0YWdzIChTaG93cyB0b29sdGlwIGRlc2NyaXB0aW9uKQotICogCi0gKiBAZGVwcmVjYXRlZCBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gY3JlYXRlcyB0aGUgYXBwcm9wcmlhdGUKLSAqICAgICAgICAgICAgIGluZm9ybWF0aW9uIHByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxJbmZvcm1hdGlvblByb3ZpZGVyIGltcGxlbWVudHMgSUluZm9ybWF0aW9uUHJvdmlkZXIsIElJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uIHsKLQotCXByaXZhdGUgSVRleHRIb3ZlciBmVGV4dEhvdmVyID0gbnVsbDsKLQotCXB1YmxpYyBYTUxJbmZvcm1hdGlvblByb3ZpZGVyKCkgewotCQlmVGV4dEhvdmVyID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRleHRIb3Zlck1hbmFnZXIoKS5jcmVhdGVCZXN0TWF0Y2hIb3ZlcihuZXcgWE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlciNnZXRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBzdWJqZWN0KSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXRJbmZvcm1hdGlvbjIodGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uI2dldEluZm9ybWF0aW9uMihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24yKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gc3ViamVjdCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlckluZm8odGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyI2dldFN1YmplY3Qob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRTdWJqZWN0KElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIGZUZXh0SG92ZXIuZ2V0SG92ZXJSZWdpb24odGV4dFZpZXdlciwgb2Zmc2V0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9YTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWdpbmZvL1hNTFRhZ0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzI3NmZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWdpbmZvL1hNTFRhZ0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWdpbmZvOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50YWdpbmZvLkFic3RyYWN0SG92ZXJQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNTmFtZWROb2RlTWFwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIFByb3ZpZGVzIGhvdmVyIGhlbHAgZG9jdW1lbnRhdGlvbiBmb3IgeG1sIHRhZ3MKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIKLSAqLwotcHVibGljIGNsYXNzIFhNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvciBleHRlbmRzIEFic3RyYWN0SG92ZXJQcm9jZXNzb3IgewotCXByb3RlY3RlZCBNYXJrdXBUYWdJbmZvUHJvdmlkZXIgZkluZm9Qcm92aWRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgWE1MVGV4dEhvdmVyUHJvY2Vzc29yLgotCSAqLwotCXB1YmxpYyBYTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IoKSB7Ci0JCS8vIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXRyZWl2ZXMgZG9jdW1lbnRhdGlvbiB0byBkaXNwbGF5IGluIHRoZSBob3ZlciBoZWxwIHBvcHVwLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIGFueSBkb2N1bWVudGF0aW9uIGluZm9ybWF0aW9uIHRvIGRpc3BsYXkKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gZGlzcGxheS4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVIb3ZlckhlbHAoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0KLQkJSW5kZXhlZFJlZ2lvbiB0cmVlTm9kZSA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodGV4dFZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWlmICh0cmVlTm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlOb2RlIG5vZGUgPSAoTm9kZSkgdHJlZU5vZGU7Ci0KLQkJd2hpbGUgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSkgewotCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCUlET01Ob2RlIHBhcmVudE5vZGUgPSAoSURPTU5vZGUpIG5vZGU7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9ICgoSVN0cnVjdHVyZWREb2N1bWVudCkgdGV4dFZpZXdlci5nZXREb2N1bWVudCgpKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2N1bWVudFBvc2l0aW9uKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pOwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gY29tcHV0ZVJlZ2lvbkhlbHAodHJlZU5vZGUsIHBhcmVudE5vZGUsIGZsYXROb2RlLCByZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgaG92ZXJoZWxwIGJhc2VkIG9uIHJlZ2lvbgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIGhvdmVyaGVscAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZVJlZ2lvbkhlbHAoSW5kZXhlZFJlZ2lvbiB0cmVlTm9kZSwgSURPTU5vZGUgcGFyZW50Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCXJlc3VsdCA9IGNvbXB1dGVUYWdOYW1lSGVscCgoSURPTU5vZGUpIHRyZWVOb2RlLCBwYXJlbnROb2RlLCBmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJcmVzdWx0ID0gY29tcHV0ZVRhZ0F0dE5hbWVIZWxwKChJRE9NTm9kZSkgdHJlZU5vZGUsIHBhcmVudE5vZGUsIGZsYXROb2RlLCByZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJcmVzdWx0ID0gY29tcHV0ZVRhZ0F0dFZhbHVlSGVscCgoSURPTU5vZGUpIHRyZWVOb2RlLCBwYXJlbnROb2RlLCBmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBob3ZlciBoZWxwIGZvciB0aGUgYXR0cmlidXRlIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVUYWdBdHROYW1lSGVscChJRE9NTm9kZSB4bWxub2RlLCBJRE9NTm9kZSBwYXJlbnROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbih4bWxub2RlKTsKLQkJU3RyaW5nIGF0dE5hbWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0RGVjbCA9IGdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oeG1sbm9kZSwgZWxlbWVudERlY2wsIGF0dE5hbWUpOwotCQlyZXR1cm4gZ2V0QWRkaXRpb25hbEluZm8oZWxlbWVudERlY2wsIGF0dERlY2wpOwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBob3ZlciBoZWxwIGZvciB0aGUgYXR0cmlidXRlIHZhbHVlICh0aGlzIGlzIHRoZSBzYW1lIGFzCi0JICogdGhlIGF0dHJpYnV0ZSBuYW1lJ3MgaGVscCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVUYWdBdHRWYWx1ZUhlbHAoSURPTU5vZGUgeG1sbm9kZSwgSURPTU5vZGUgcGFyZW50Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oeG1sbm9kZSk7Ci0JCUlUZXh0UmVnaW9uIGF0dHJOYW1lUmVnaW9uID0gZ2V0QXR0ck5hbWVSZWdpb24oeG1sbm9kZSwgcmVnaW9uKTsKLQotCQlTdHJpbmcgYXR0TmFtZSA9IGZsYXROb2RlLmdldFRleHQoYXR0ck5hbWVSZWdpb24pOwotCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dERlY2wgPSBnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKHhtbG5vZGUsIGVsZW1lbnREZWNsLCBhdHROYW1lKTsKLQkJcmV0dXJuIGdldEFkZGl0aW9uYWxJbmZvKGVsZW1lbnREZWNsLCBhdHREZWNsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgaG92ZXIgaGVscCBmb3IgdGhlIHRhZyBuYW1lCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlVGFnTmFtZUhlbHAoSURPTU5vZGUgeG1sbm9kZSwgSURPTU5vZGUgcGFyZW50Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oeG1sbm9kZSk7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHBlbGVtZW50RGVjbCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudE5vZGUpOwotCQlyZXR1cm4gZ2V0QWRkaXRpb25hbEluZm8ocGVsZW1lbnREZWNsLCBlbGVtZW50RGVjbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmVpdmVzIGNtbm9kZSdzIGRvY3VtZW50YXRpb24gdG8gZGlzcGxheSBpbiB0aGUgaG92ZXIgaGVscCBwb3B1cC4gSWYKLQkgKiBubyBkb2N1bWVudGF0aW9uIGV4aXN0cyBmb3IgY21ub2RlLCB0cnkgZGlzcGxheWluZyBwYXJlbnRPck93bmVyJ3MKLQkgKiBkb2N1bWVudGF0aW9uCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgYW55IGRvY3VtZW50YXRpb24gaW5mb3JtYXRpb24gdG8gZGlzcGxheSBmb3IgY21ub2RlLgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm90aGluZyB0byBkaXNwbGF5LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QWRkaXRpb25hbEluZm8oQ01Ob2RlIHBhcmVudE9yT3duZXIsIENNTm9kZSBjbW5vZGUpIHsKLQkJU3RyaW5nIGFkZGxJbmZvID0gbnVsbDsKLQotCQlpZiAoY21ub2RlID09IG51bGwpIHsKLQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOdWxsIGRlY2xhcmF0aW9uISIpLnByaW50U3RhY2tUcmFjZSgpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWFkZGxJbmZvID0gZ2V0SW5mb1Byb3ZpZGVyKCkuZ2V0SW5mbyhjbW5vZGUpOwotCQlpZiAoKGFkZGxJbmZvID09IG51bGwpICYmIChwYXJlbnRPck93bmVyICE9IG51bGwpKSB7Ci0JCQlhZGRsSW5mbyA9IGdldEluZm9Qcm92aWRlcigpLmdldEluZm8ocGFyZW50T3JPd25lcik7Ci0JCX0KLQkJcmV0dXJuIGFkZGxJbmZvOwotCX0KLQotCS8qKgotCSAqIEZpbmQgdGhlIHJlZ2lvbiBvZiB0aGUgYXR0cmlidXRlIG5hbWUgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUgdmFsdWUKLQkgKiByZWdpb24KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0QXR0ck5hbWVSZWdpb24oSURPTU5vZGUgbm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCS8vIEZpbmQgdGhlIGF0dHJpYnV0ZSBuYW1lIGZvciB3aGljaCB0aGlzIHBvc2l0aW9uIHNob3VsZCBoYXZlIGEgdmFsdWUKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvcGVuID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJVGV4dFJlZ2lvbkxpc3Qgb3BlblJlZ2lvbnMgPSBvcGVuLmdldFJlZ2lvbnMoKTsKLQkJaW50IGkgPSBvcGVuUmVnaW9ucy5pbmRleE9mKHJlZ2lvbik7Ci0JCWlmIChpIDwgMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChpID49IDApIHsKLQkJCW5hbWVSZWdpb24gPSBvcGVuUmVnaW9ucy5nZXQoaS0tKTsKLQkJCWlmIChuYW1lUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZVJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyZWl2ZXMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBpbmRpY2F0ZWQgYnkgYXR0cmlidXRlIG5hbWUgd2l0aGluCi0JICogZWxlbWVudERlY2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKElET01Ob2RlIG5vZGUsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsLCBTdHJpbmcgYXR0TmFtZSkgewotCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gbnVsbDsKLQotCQlpZiAoZWxlbWVudERlY2wgIT0gbnVsbCkgewotCQkJQ01OYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQotCQkJQ01OYW1lZE5vZGVNYXBJbXBsIGFsbEF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKGF0dHJpYnV0ZXMpOwotCQkJTGlzdCBub2RlcyA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEF2YWlsYWJsZUNvbnRlbnQoKEVsZW1lbnQpIG5vZGUsIGVsZW1lbnREZWNsLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IG5vZGVzLnNpemUoKTsgaysrKSB7Ci0JCQkJQ01Ob2RlIGNtbm9kZSA9IChDTU5vZGUpIG5vZGVzLmdldChrKTsKLQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCQlhbGxBdHRyaWJ1dGVzLnB1dChjbW5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWF0dHJpYnV0ZXMgPSBhbGxBdHRyaWJ1dGVzOwotCi0JCQlTdHJpbmcgbm9wcmVmaXhOYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKGF0dE5hbWUpOwotCQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJCWF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKG5vcHJlZml4TmFtZSk7Ci0JCQkJaWYgKGF0dHJEZWNsID09IG51bGwpIHsKLQkJCQkJYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oYXR0TmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhdHRyRGVjbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyZWl2ZXMgQ01FbGVtZW50RGVjbGFyYXRpb24gZm9yIGdpdmVuIG5vZGUKLQkgKiAKLQkgKiBAcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uIC0gQ01FbGVtZW50RGVjbGFyYXRpb24gb2Ygbm9kZSBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHBvc3NpYmxlCi0JICovCi0JcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKE5vZGUgbm9kZSkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVySW5mbyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG92ZXJJbmZvKElUZXh0Vmlld2VyIHZpZXdlciwgSVJlZ2lvbiBob3ZlclJlZ2lvbikgewotCQlpZiAoKGhvdmVyUmVnaW9uID09IG51bGwpIHx8ICh2aWV3ZXIgPT0gbnVsbCkgfHwgKHZpZXdlci5nZXREb2N1bWVudCgpID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyBkaXNwbGF5VGV4dCA9IG51bGw7Ci0JCWludCBkb2N1bWVudE9mZnNldCA9IGhvdmVyUmVnaW9uLmdldE9mZnNldCgpOwotCQlkaXNwbGF5VGV4dCA9IGNvbXB1dGVIb3ZlckhlbHAodmlld2VyLCBkb2N1bWVudE9mZnNldCk7Ci0KLQkJcmV0dXJuIGRpc3BsYXlUZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZ2lvbiB0byBob3ZlciB0aGUgdGV4dCBvdmVyIGJhc2VkIG9uIHRoZSBvZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHRleHRWaWV3ZXIKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogCi0JICogQHJldHVybiBJUmVnaW9uIHJlZ2lvbiB0byBob3ZlciBvdmVyIGlmIG9mZnNldCBpcyB3aXRoaW4gdGFnIG5hbWUsCi0JICogICAgICAgICBhdHRyaWJ1dGUgbmFtZSwgb3IgYXR0cmlidXRlIHZhbHVlIGFuZCBpZiBvZmZzZXQgaXMgbm90IG92ZXIKLQkgKiAgICAgICAgIGludmFsaWQgd2hpdGVzcGFjZS4gb3RoZXJ3aXNlLCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIjZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIsIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIb3ZlclJlZ2lvbihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmICgodGV4dFZpZXdlciA9PSBudWxsKSB8fCAodGV4dFZpZXdlci5nZXREb2N1bWVudCgpID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJfQotCi0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJLy8gb25seSBzdXBwbHkgaG92ZXJoZWxwIGZvciB0YWcgbmFtZSwgYXR0cmlidXRlIG5hbWUsIG9yCi0JCQkvLyBhdHRyaWJ1dGUgdmFsdWUKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICgocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB8fCAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSkgewotCQkJCXRyeSB7Ci0JCQkJCS8vIGNoZWNrIGlmIHdlIGFyZSBhdCB3aGl0ZXNwYWNlIGJlZm9yZSBvciBhZnRlciBsaW5lCi0JCQkJCUlSZWdpb24gbGluZSA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChvZmZzZXQpOwotCQkJCQlpZiAoKG9mZnNldCA+IChsaW5lLmdldE9mZnNldCgpKSkgJiYgKG9mZnNldCA8IChsaW5lLmdldE9mZnNldCgpICsgbGluZS5nZXRMZW5ndGgoKSkpKSB7Ci0JCQkJCQkvLyBjaGVjayBpZiB3ZSBhcmUgaW4gcmVnaW9uJ3MgdHJhaWxpbmcgd2hpdGVzcGFjZQotCQkJCQkJLy8gKHdoaXRlc3BhY2UgYWZ0ZXIgcmVsZXZhbnQgaW5mbykKLQkJCQkJCWlmIChvZmZzZXQgPCBmbGF0Tm9kZS5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbikpIHsKLQkJCQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBpZiBlbmFibGVkIGZsYWcgaXMgZmFsc2UsIGRvbnQgY2FsbCBnZXRIb3ZlclJlZ2lvbiBpbiB0aGUKLQkgKiAgICAgICAgICAgICBmaXJzdCBwbGFjZSBpZiB0cnVlLCB1c2UgZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIsIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIb3ZlclJlZ2lvbihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgb2Zmc2V0LCBib29sZWFuIGVuYWJsZWQpIHsKLQkJaWYgKCghZW5hYmxlZCkgfHwgKHRleHRWaWV3ZXIgPT0gbnVsbCkgfHwgKHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSA9PSBudWxsKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKChJU3RydWN0dXJlZERvY3VtZW50KSB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCkpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0KLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCXJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCX0KLQotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIG9ubHkgc3VwcGx5IGhvdmVyaGVscCBmb3IgdGFnIG5hbWUsIGF0dHJpYnV0ZSBuYW1lLCBvcgotCQkJLy8gYXR0cmlidXRlIHZhbHVlCi0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAoKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHx8IChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkpIHsKLQkJCQl0cnkgewotCQkJCQkvLyBjaGVjayBpZiB3ZSBhcmUgYXQgd2hpdGVzcGFjZSBiZWZvcmUgb3IgYWZ0ZXIgbGluZQotCQkJCQlJUmVnaW9uIGxpbmUgPSB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCkuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQob2Zmc2V0KTsKLQkJCQkJaWYgKChvZmZzZXQgPiAobGluZS5nZXRPZmZzZXQoKSkpICYmIChvZmZzZXQgPCAobGluZS5nZXRPZmZzZXQoKSArIGxpbmUuZ2V0TGVuZ3RoKCkpKSkgewotCQkJCQkJLy8gY2hlY2sgaWYgd2UgYXJlIGluIHJlZ2lvbidzIHRyYWlsaW5nIHdoaXRlc3BhY2UKLQkJCQkJCS8vICh3aGl0ZXNwYWNlIGFmdGVyIHJlbGV2YW50IGluZm8pCi0JCQkJCQlpZiAob2Zmc2V0IDwgZmxhdE5vZGUuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pKSB7Ci0JCQkJCQkJcmV0dXJuIG5ldyBSZWdpb24oZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSwgcmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5mb1Byb3ZpZGVyLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBmSW5mb1Byb3ZpZGVyIGFuZCBpZiBmSW5mb1Byb3ZpZGVyIHdhcwotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gc2V0IGZJbmZvUHJvdmlkZXIgdG8gRGVmYXVsdEluZm9Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBNYXJrdXBUYWdJbmZvUHJvdmlkZXIgZ2V0SW5mb1Byb3ZpZGVyKCkgewotCQlpZiAoZkluZm9Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmSW5mb1Byb3ZpZGVyID0gbmV3IE1hcmt1cFRhZ0luZm9Qcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBmSW5mb1Byb3ZpZGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5YjA0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL0VuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuU2ltcGxlVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlclhNTCBleHRlbmRzIFNpbXBsZVRlbXBsYXRlVmFyaWFibGVSZXNvbHZlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX1RZUEUgPSBnZXRFbmNvZGluZ1R5cGUoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFbmNvZGluZ1R5cGUoKSB7Ci0JCXJldHVybiAiZW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlbmNvZGluZyB2YXJpYWJsZQotCSAqLwotCXB1YmxpYyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlclhNTCgpIHsKLQkJc3VwZXIoRU5DT0RJTkdfVFlQRSwgWE1MVUlNZXNzYWdlcy5DcmVhdGluZ19maWxlc19lbmNvZGluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlKFRlbXBsYXRlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc5OTNlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotcHVibGljIGNsYXNzIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMID0gZ2V0QWxsKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEUgPSBnZXRBdHRyaWJ1dGUoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9WQUxVRSA9IGdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVcgPSBnZXROZXcoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IGdldFRhZygpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEFsbCgpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl9hbGwiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl9hdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX2F0dHJpYnV0ZV92YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmV3KCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX25ldyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlyZXR1cm4gInhtbCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGFnKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX3RhZyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZVhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2NjZjIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZVhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkdsb2JhbFRlbXBsYXRlVmFyaWFibGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgWE1MIHRlbXBsYXRlIGNvbnRleHQgdHlwZXMuIFRlbXBsYXRlcyBvZiB0aGlzIGNvbnRleHQgdHlwZQotICogYXBwbHkgdG8gYW55IHBsYWNlIHdpdGhpbiBYTUwgY29udGVudCB0eXBlLgotICovCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVDb250ZXh0VHlwZVhNTCBleHRlbmRzIFRlbXBsYXRlQ29udGV4dFR5cGUgewotCi0JcHVibGljIFRlbXBsYXRlQ29udGV4dFR5cGVYTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5DdXJzb3IoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5EYXRlKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuRG9sbGFyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuTGluZVNlbGVjdGlvbigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlRpbWUoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Vc2VyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuV29yZFNlbGVjdGlvbigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlllYXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlclhNTCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGV4dC9YTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGV4dC9YTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOWZkOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RleHQvWE1MRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkRlZmF1bHRDaGFyYWN0ZXJQYWlyTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRleHQuRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBYTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIGV4dGVuZHMgRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gUEFJUlMgPSB7J3snLCAnfScsICcoJywgJyknLCAnWycsICddJywnIicsJyInLCdcJycsJ1wnJ307Ci0KLQlwdWJsaWMgWE1MRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcigpIHsKLQkJc3VwZXIobmV3IFN0cmluZ1tde0RPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLCBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQsIERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQsIERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4sIERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NPTlRFTlR9LCBuZXcgRGVmYXVsdENoYXJhY3RlclBhaXJNYXRjaGVyKFBBSVJTKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3V0aWwvU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC91dGlsL1NoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ODEyNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3V0aWwvU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLQotCi1wdWJsaWMgY2xhc3MgU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9DT05TVFJBSU5PRkYgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0NPTlNUUkFJTk9GRjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfQ09OU1RSQUlOT04gPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0NPTlNUUkFJTk9OOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9STERHUk1SID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19EVE9PTF9STERHUk1SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9WQUxJREFURSA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfVkFMSURBVEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0NPTlNUUkFJTk9GRiA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQ09OU1RSQUlOT0ZGOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9DT05TVFJBSU5PTiA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfQ09OU1RSQUlOT047Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX1JMREdSTVIgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VUT09MX1JMREdSTVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX1ZBTElEQVRFID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FVE9PTF9WQUxJREFURTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0FUVFJJQlVURSA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVFJJQlVURTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NEQVRBU0VDVElPTiA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NEQVRBU0VDVElPTjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NPTU1FTlQgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DT01NRU5UOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfRE9DVFlQRSA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0RPQ1RZUEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9FTEVNRU5UID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRUxFTUVOVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0VOVElUWSA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0VOVElUWTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0VOVElUWV9SRUZFUkVOQ0UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9FTlRJVFlfUkVGRVJFTkNFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfTk9UQVRJT04gPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9OT1RBVElPTjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1BST0NFU1NJTkdJTlNUUlVDVElPTiA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1BST0NFU1NJTkdJTlNUUlVDVElPTjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19HRU5FUklDID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfTUFDUk8gPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfTUFDUk87Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UWFRFWFQgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UWFRFWFQ7Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHNwZWNpZmllZCBpbWFnZSBmcm9tIHRoZSB4bWwgc291cmNlIGVkaXRvciBwbHVnaW4ncyBpbWFnZQotCSAqIHJlZ2lzdHJ5LiBOb3RlOiBUaGUgcmV0dXJuZWQgPGNvZGU+SW1hZ2U8L2NvZGU+IGlzIG1hbmFnZWQgYnkgdGhlCi0JICogd29ya2JlbmNoOyBjbGllbnRzIG11c3QgPGI+bm90IDwvYj4gZGlzcG9zZSBvZiB0aGUgcmV0dXJuZWQgaW1hZ2UuCi0JICogCi0JICogQHBhcmFtIHN5bWJvbGljTmFtZQotCSAqICAgICAgICAgICAgdGhlIHN5bWJvbGljIG5hbWUgb2YgdGhlIGltYWdlOyB0aGVyZSBhcmUgY29uc3RhbnRzIGRlY2xhcmVkCi0JICogICAgICAgICAgICBpbiB0aGlzIGNsYXNzIGZvciBidWlsZC1pbiBpbWFnZXMgdGhhdCBjb21lIHdpdGggdGhlIHhtbAotCSAqICAgICAgICAgICAgc291cmNlIGVkaXRvcgotCSAqIEByZXR1cm4gdGhlIGltYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKLQkJcmV0dXJuIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2Uoc3ltYm9saWNOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGRlc2NyaXB0b3IgZm9yIHNwZWNpZmllZCBpbWFnZSBmcm9tIHRoZSB4bWwgc291cmNlCi0JICogZWRpdG9yIHBsdWdpbidzIGltYWdlIHJlZ2lzdHJ5LiBVbmxpa2UgPGNvZGU+SW1hZ2U8L2NvZGU+cywgaW1hZ2UKLQkgKiBkZXNjcmlwdG9ycyB0aGVtc2VsdmVzIGRvIG5vdCBuZWVkIHRvIGJlIGRpc3Bvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBzeW1ib2xpY05hbWUKLQkgKiAgICAgICAgICAgIHRoZSBzeW1ib2xpYyBuYW1lIG9mIHRoZSBpbWFnZTsgdGhlcmUgYXJlIGNvbnN0YW50cyBkZWNsYXJlZAotCSAqICAgICAgICAgICAgaW4gdGhpcyBpbnRlcmZhY2UgZm9yIGJ1aWxkLWluIGltYWdlcyB0aGF0IGNvbWUgd2l0aCB0aGUgeG1sCi0JICogICAgICAgICAgICBzb3VyY2UgZWRpdG9yCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKLQkJcmV0dXJuIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKHN5bWJvbGljTmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3V0aWwvWE1MQ29tbW9uUmVzb3VyY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdXRpbC9YTUxDb21tb25SZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNiYTBiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdXRpbC9YTUxDb21tb25SZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgdXNlIFhNTFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCkgaW5zdGVhZAotICovCi0vKioKLSAqIFRoaXMgY2xhc3MgZXhpc3RzIHRlbXBvcmFyaWx5IHVudGlsIHRoZSBwcm9wZXJ0aWVzIGZpbGVzIGNhbiBiZQotICogcmUtb3JnYW5pemVkIGFuZCB0aGUgdmFyaW91cyByZXNvdXJjZSByZWZlcmVuY2VzIGNhbiBiZSB1cGRhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb21tb25SZXNvdXJjZXMgewotCXByb3RlY3RlZCBzdGF0aWMgWE1MQ29tbW9uUmVzb3VyY2VzIGluc3RhbmNlOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgWE1MQ29tbW9uUmVzb3VyY2VzIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgWE1MQ29tbW9uUmVzb3VyY2VzKFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKSk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgWE1MVUlQbHVnaW4gZWRpdG9yUGx1Z2luOwotCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQotCXB1YmxpYyBYTUxDb21tb25SZXNvdXJjZXMoWE1MVUlQbHVnaW4gZWRpdG9yUGx1Z2luKSB7Ci0JCWluc3RhbmNlID0gdGhpczsKLQkJdGhpcy5lZGl0b3JQbHVnaW4gPSBlZGl0b3JQbHVnaW47Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpblJlc291cmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vIFRPRE8uLi4gbG9nIGFuIGVycm9yIG1lc3NhZ2UKLQkJCS8vIEIyQlV0aWxQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGUoQjJCVXRpbFBsdWdpbi5nZXRHVUlTdHJpbmcoIl9XQVJOX1BMVUdJTl9QUk9QRVJUSUVTX01JU1NJTkciKQotCQkJLy8gKyBkZXNjcmlwdG9yLmdldExhYmVsKCkpOwotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JSW1hZ2VEZXNjcmlwdG9yIF9nZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGljb25OYW1lKSB7Ci0JCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oWE1MVUlQbHVnaW4uSUQsIGljb25OYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZ2V0cyB0aGUgc3RyaW5nIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZXRzIHRoZSBzdHJpbmcgcmVzb3VyY2UgYW5kIGRvZXMgb25lIHN1YnN0aXR1dGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBuZXcgT2JqZWN0W117czF9KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGdldHMgdGhlIHN0cmluZyByZXNvdXJjZSBhbmQgZG9lcyB0d28gc3Vic3RpdHV0aW9ucy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEsIE9iamVjdCBzMikgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIG5ldyBPYmplY3RbXXtzMSwgczJ9KTsKLQl9Ci0KLQlwdWJsaWMgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKSB7Ci0JCXJldHVybiBlZGl0b3JQbHVnaW4uZ2V0V29ya2JlbmNoKCk7Ci0JfQotCS8qCi0JICogcHVibGljIEltYWdlRmFjdG9yeSBnZXRJbWFnZUZhY3RvcnkoKSB7IHJldHVybiBpbWFnZUZhY3Rvcnk7IH0KLQkgKi8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC91dGlsL1hNTENvbW1vblVJQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3V0aWwvWE1MQ29tbW9uVUlDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2M2Q1MDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3V0aWwvWE1MQ29tbW9uVUlDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbDsKLQotLyoqCi0gKiBDb250ZXh0IGhlbHAgaWQgY29uc3RhbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhNTENvbW1vblVJQ29udGV4dElkcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qIENPTlRFWFRfSUQgeGN1aTA1MDAgZm9yIEVkaXQgQXR0cmlidXRlIEluc3RydWN0aW9uIERpYWxvZyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhDVUlfQVRUUklCVVRFX0RJQUxPRyA9IFBMVUdJTl9OQU1FICsgIi54Y3VpMDUwMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qIENPTlRFWFRfSUQgeGN1aTA0MDAgZm9yIFNlbGVjdCBYTUwgQ2F0YWxvZyBJRCBEaWFsb2cgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYQ1VJX0NBVEFMT0dfRElBTE9HID0gUExVR0lOX05BTUUgKyAiLnhjdWkwNDAwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyogQ09OVEVYVF9JRHMgZm9yIFhNTCBDb21tb24gVUkgdXNlIHhjdWl4eHggY29udGV4dCBJRHMgKi8KLQotCS8qIENPTlRFWFRfSUQgeGN1aTAwMTAgZm9yIEVkaXQgRG9jdHlwZSBEaWFsb2cgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYQ1VJX0RPQ1RZUEVfRElBTE9HID0gUExVR0lOX05BTUUgKyAiLnhjdWkwMDEwIjsgLy8kTk9OLU5MUy0xJAotCS8qIENPTlRFWFRfSUQgeGN1aTAwMzAgZm9yIFB1YmxpYyBJRCBUZXh0IEVkaXQgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYQ1VJX0RPQ1RZUEVfUFVCTElDID0gUExVR0lOX05BTUUgKyAiLnhjdWkwMDMwIjsgLy8kTk9OLU5MUy0xJAotCS8qIENPTlRFWFRfSUQgeGN1aTAwMjAgZm9yIFJvb3QgRWxlbWVudCBOYW1lIFRleHQgRWRpdCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhDVUlfRE9DVFlQRV9ST09UID0gUExVR0lOX05BTUUgKyAiLnhjdWkwMDIwIjsgLy8kTk9OLU5MUy0xJAotCS8qIENPTlRFWFRfSUQgeGN1aTAwNDAgZm9yIFN5c3RlbSBJRCBUZXh0IEVkaXQgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYQ1VJX0RPQ1RZUEVfU1lTVEVNID0gUExVR0lOX05BTUUgKyAiLnhjdWkwMDUwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyogQ09OVEVYVF9JRCB4Y3VpMDMwMCBmb3IgRWRpdCBFbGVtZW50IEluc3RydWN0aW9uIERpYWxvZyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhDVUlfRUxFTUVOVF9ESUFMT0cgPSBQTFVHSU5fTkFNRSArICIueGN1aTA2MDAiOyAvLyROT04tTkxTLTEkCi0KLQkvKiBDT05URVhUX0lEIHhjdWkwMjAwIGZvciBFZGl0IE5hbWVzcGFjZSBEaWFsb2cgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYQ1VJX05BTUVTUEFDRV9ESUFMT0cgPSBQTFVHSU5fTkFNRSArICIueGN1aTAyMDAiOyAvLyROT04tTkxTLTEkCi0KLQkvKiBDT05URVhUX0lEIHhjdWkwMzAwIGZvciBFZGl0IFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24gRGlhbG9nICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWENVSV9QUk9DRVNTSU5HX0RJQUxPRyA9IFBMVUdJTl9OQU1FICsgIi54Y3VpMDMwMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qIENPTlRFWFRfSUQgeGN1aTAxMDAgZm9yIEVkaXQgU2NoZW1hIEluZm9ybWF0aW9uIERpYWxvZyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhDVUlfU0NIRU1BX0lORk9fRElBTE9HID0gUExVR0lOX05BTUUgKyAiLnhjdWkwMTAwIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTczYmFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5JTWVzc2FnZUFjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEEgRGVsZWdhdGluZ1JlY29uY2lsZVZhbGlkYXRvciBjYWxscyBpdHMgZGVsZWdhdGUgdmFsaWRhdG9yIHRvIGdldCBhIGxpc3QKLSAqIG9mIHZhbGlkYXRpb24gZXJyb3IgSU1lc3NhZ2VzLiBVc2luZyBpbmZvcm1hdGlvbiBpbiB0aGlzIElNZXNzYWdlIHRoZQotICogRGVsZWdhdGluZ1JlY29uY2lsZVZhbGlkYXRvciB1cGRhdGVzIHRoZSBJTWVzc2FnZSB3aXRoIGFuIG9mZnNldCBhbmQgbGVuZ3RoCi0gKiB0byBnaXZlIGEgZ29vZCByYW5nZSB0byBiZSAic3F1aWdnbGVkIiBhbmQgYWRkcyB0aGUgbWVzc2FnZXMgdG8gdGhlCi0gKiBJUmVwb3J0ZXIKLSAqIAotICogQGF1dGhvciBNYXJrIEh1dGNoaW5zb24KLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IgewotCS8vIHRoZSBzZWxlY3Rpb24gc3RyYXRlZ2llczoKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfQVRUUklCVVRFUyA9ICJBTExfQVRUUklCVVRFUyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfTkFNRSA9ICJBVFRSSUJVVEVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVkFMVUUgPSAiQVRUUklCVVRFX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RBRyA9ICJTVEFSVF9UQUciOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVCA9ICJURVhUIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJUlNUX05PTl9XSElURVNQQUNFX1RFWFQgPSAiRklSU1RfTk9OX1dISVRFU1BBQ0VfVEVYVCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0VOVElUWV9SRUZFUkVOQ0UgPSAiVEVYVF9FTlRJVFlfUkVGRVJFTkNFIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX09GX0FUVFJJQlVURV9XSVRIX0dJVkVOX1ZBTFVFID0gIlZBTFVFX09GX0FUVFJJQlVURV9XSVRIX0dJVkVOX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9UQUcgPSAiRU5EX1RBRyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoaXMgY29uc3RhbnQgc3BlY2lmaWVzIHRoZSBhdHRyaWJ1dGUgbmFtZSB0aGF0IHNwZWNpZmllcyB0aGUgc2lkZSBvZgotCSAqIHRoZSAnc3RhcnQgdGFnJyB0aGF0IHRoZSB2YWxpZGF0b3IgaGFzIHVzZWQgdG8gcmVwb3J0IGFuIGVycm9yLiBBCi0JICogdmFsaWRhdG9yIG1heSBjaG9vc2UgdG8gcmVwb3J0IGEgbWVzc2FnZSBhdCB0aGUgbGVmdCAodGhlIHN0YXJ0IG9mIHRoZQotCSAqIHN0YXJ0IHRhZylvciBhdCB0aGUgcmlnaHQgKHRoZSBlbmQgb2YgdGhlIHN0YXJ0IHRhZykuIFdoZW4gdGhpcwotCSAqIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkIGVycm9yIEVSUk9SX1NJREVfTEVGVCBpcyB0aGUgZGVmYXVsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9TSURFID0gIkVSUk9SX1NJREUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBXaGVuIHRoZSBFUlJPUl9TSURFIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIEVSUk9SX1NJREVfTEVGVCB2YWx1ZSBpdCBpcwotCSAqIGFzc3VtZWQgdGhhdCB0aGUgbWVzc2FnZSBzcGVjaWZpZXMgYSBsb2NhdGlvbiB0byB0aGUgbGVmdCBvZiB0aGUgc3RhcnQKLQkgKiB0YWcKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9TSURFX0xFRlQgPSAiRVJST1JfU0lERV9MRUZUIjsgLy8kTk9OLU5MUy0xJAkKLQotCS8qKgotCSAqIFdoZW4gdGhlIEVSUk9SX1NJREUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgRVJST1JfU0lERV9SSUdIVCB2YWx1ZSBpdAotCSAqIGlzIGFzc3VtZWQgdGhhdCB0aGUgbWVzc2FnZSBzcGVjaWZpZXMgYSBsb2NhdGlvbiB0byB0aGUgcmlnaHQgb2YgdGhlCi0JICogc3RhcnQgdGFnCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfU0lERV9SSUdIVCA9ICJFUlJPUl9TSURFX1JJR0hUIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OVU1CRVJfQVRUUklCVVRFID0gImNvbHVtbk51bWJlciI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTUVVJR0dMRV9TRUxFQ1RJT05fU1RSQVRFR1lfQVRUUklCVVRFID0gInNxdWlnZ2xlU2VsZWN0aW9uU3RyYXRlZ3kiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1FVSUdHTEVfTkFNRV9PUl9WQUxVRV9BVFRSSUJVVEUgPSAic3F1aWdnbGVOYW1lT3JWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOyAvLyBjb25zdHJ1Y3RvcgotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIGFyZzApIHsgLy8gZG9uJ3QgbmVlZCB0byBpbXBsZW1lbnQKLQl9Ci0KLQkvLyBNeSBJbXBsZW1lbnRhdGlvbiBvZiBJSGVscGVyCi0JY2xhc3MgTXlIZWxwZXIgaW1wbGVtZW50cyBJUHJvamVjdFZhbGlkYXRpb25Db250ZXh0IHsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW07Ci0KLQkJSUZpbGUgZmlsZTsKLQotCQlwdWJsaWMgTXlIZWxwZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIElGaWxlIGZpbGUpIHsKLQkJCXRoaXMuaW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLQkJCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEJ1aWxkS2luZCgpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBsb2FkTW9kZWwoU3RyaW5nIHN5bWJvbGljTmFtZSwgT2JqZWN0W10gcGFybXMpIHsKLQkJCWlmIChzeW1ib2xpY05hbWUuZXF1YWxzKCJnZXRGaWxlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmaWxlOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGxvYWRNb2RlbChTdHJpbmcgc3ltYm9saWNOYW1lKSB7Ci0JCQlpZiAoc3ltYm9saWNOYW1lLmVxdWFscygiaW5wdXRTdHJlYW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGlucHV0U3RyZWFtOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nW10gZ2V0VVJJcygpIHsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IFN0cmluZ1tde2ZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpfTsKLQkJCX0KLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQl9Ci0KLQkJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZpbGUuZ2V0UHJvamVjdCgpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvLyBNeSBJbXBsZW1lbnRhdGlvbiBvZiBJUmVwb3J0ZXIKLQljbGFzcyBNeVJlcG9ydGVyIGltcGxlbWVudHMgSVJlcG9ydGVyIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXB1YmxpYyBNeVJlcG9ydGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoSVZhbGlkYXRvciBvcmlnaW4sIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJCWxpc3QuYWRkKG1lc3NhZ2UpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcGxheVN1YnRhc2soSVZhbGlkYXRvciB2YWxpZGF0b3IsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJCS8qIGRvIG5vdCBuZWVkIHRvIGltcGxlbWVudCAqLwotCQl9Ci0KLQkJcHVibGljIElNZXNzYWdlQWNjZXNzIGdldE1lc3NhZ2VBY2Nlc3MoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciBvcmlnaW4sIE9iamVjdCBvYmplY3QpIHsgLy8gZG8KLQkJCS8qIGRvIG5vdCBuZWVkIHRvIGltcGxlbWVudCAqLwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciBvcmlnaW4pIHsKLQkJCS8qIGRvIG5vdCBuZWVkIHRvIGltcGxlbWVudCAqLwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZVN1YnNldChJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iaiwgU3RyaW5nIGdyb3VwTmFtZSkgey8vIGRvCi0JCQkvKiBkbyBub3QgbmVlZCB0byBpbXBsZW1lbnQgKi8KLQkJfQotCi0JCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VzKCkgewotCQkJcmV0dXJuIGxpc3Q7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSVZhbGlkYXRvciBnZXREZWxlZ2F0ZVZhbGlkYXRvcigpOwotCi0JLyoqCi0JICogQ2FsbHMgYSBkZWxlZ2F0ZSB2YWxpZGF0b3IgZ2V0dGluZyBhbmQgdXBkYXRlcyBpdCdzIGxpc3Qgb2YKLQkgKiBWYWxpZGF0aW9uTWVzc2FnZXMgd2l0aCBhIGdvb2Qgc3F1aWdnbGUgb2Zmc2V0IGFuZCBsZW5ndGguCi0JICogCi0JICogQHBhcmFtIGhlbHBlcgotCSAqICAgICAgICAgICAgbG9hZHMgYW4gb2JqZWN0LgotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqICAgICAgICAgICAgSXMgYW4gaW5zdGFuY2Ugb2YgYW4gSVJlcG9ydGVyIGludGVyZmFjZSwgd2hpY2ggaXMgdXNlZCBmb3IKLQkgKiAgICAgICAgICAgIGludGVyYWN0aW9uIHdpdGggdGhlIHVzZXIuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdIGRlbHRhID0gaGVscGVyLmdldFVSSXMoKTsKLQkJaWYgKGRlbHRhLmxlbmd0aCA+IDApIHsKLQkJCS8vIGdldCB0aGUgZmlsZSwgbW9kZWwgYW5kIGRvY3VtZW50OgotCQkJSUZpbGUgZmlsZSA9IGdldEZpbGUoZGVsdGFbMF0pOwotCQkJSURPTU1vZGVsIHhtbE1vZGVsID0gZ2V0TW9kZWxGb3JSZXNvdXJjZShmaWxlKTsKLQkJCXRyeSB7Ci0JCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQotCQkJCS8vIHN0b3JlIHRoZSB0ZXh0IGluIGEgYnl0ZSBhcnJheTsgbWFrZSBhIGZ1bGwgY29weSB0byBlYXNlCi0JCQkJLy8gYW55IHRocmVhZGluZyBwcm9ibGVtcwotCQkJCWJ5dGVbXSBieXRlQXJyYXk7Ci0JCQkJdHJ5IHsKLQkJCQkJYnl0ZUFycmF5ID0geG1sTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0KCkuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0JCQkJfQotCQkJCWNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gTm90IGxpa2VseSB0byBoYXBwZW4KLQkJCQkJYnl0ZUFycmF5ID0geG1sTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0KCkuZ2V0Qnl0ZXMoKTsKLQkJCQl9Ci0KLQkJCQlpZiAoaXNEZWxlZ2F0ZVZhbGlkYXRvckVuYWJsZWQoZmlsZSkpIHsKLQkJCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBnZXREZWxlZ2F0ZVZhbGlkYXRvcigpOwotCQkJCQlpZiAodmFsaWRhdG9yICE9IG51bGwpIHsKLQkJCQkJCS8vIFZhbGlkYXRlIHRoZSBmaWxlOgotCQkJCQkJSVZhbGlkYXRpb25Db250ZXh0IHZIZWxwZXIgPSBuZXcgTXlIZWxwZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVBcnJheSksIGZpbGUpOwotCQkJCQkJTXlSZXBvcnRlciB2UmVwb3J0ZXIgPSBuZXcgTXlSZXBvcnRlcigpOwotCQkJCQkJaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIElWYWxpZGF0b3JKb2IpIHsKLQkJCQkJCQkoKElWYWxpZGF0b3JKb2IpIHZhbGlkYXRvcikudmFsaWRhdGVJbkpvYih2SGVscGVyLCB2UmVwb3J0ZXIpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJdmFsaWRhdG9yLnZhbGlkYXRlKHZIZWxwZXIsIHZSZXBvcnRlcik7Ci0JCQkJCQl9Ci0JCQkJCQlMaXN0IG1lc3NhZ2VzID0gdlJlcG9ydGVyLmxpc3Q7Ci0KLQkJCQkJCS8vIHNldCB0aGUgb2Zmc2V0IGFuZCBsZW5ndGgKLQkJCQkJCXVwZGF0ZVZhbGlkYXRpb25NZXNzYWdlcyhtZXNzYWdlcywgZG9jdW1lbnQsIHJlcG9ydGVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCi0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBpdGVyYXRlcyB0aHJvdWdoIHRoZSBtZXNzYWdlcyBhbmQgY2FsY3VsYXRlcyBhICJiZXR0ZXIiIG9mZnNldCBhbmQKLQkgKiBsZW5ndGgKLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZXMgLQotCSAqICAgICAgICAgICAgYSBMaXN0IG9mIElNZXNzYWdlcwotCSAqIEBwYXJhbSBkb2N1bWVudCAtCi0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQKLQkgKiBAcGFyYW0gcmVwb3J0ZXIgLQotCSAqICAgICAgICAgICAgdGhlIHJlcG9ydGVyIHRoZSBtZXNzYWdlcyBhcmUgdG8gYmUgYWRkZWQgdG8KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVWYWxpZGF0aW9uTWVzc2FnZXMoTGlzdCBtZXNzYWdlcywgSURPTURvY3VtZW50IGRvY3VtZW50LCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlcy5zaXplKCk7IGkrKykgewotCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IChJTWVzc2FnZSkgbWVzc2FnZXMuZ2V0KGkpOwotCQkJdHJ5IHsKLQkJCQlpZiAobWVzc2FnZS5nZXRBdHRyaWJ1dGUoQ09MVU1OX05VTUJFUl9BVFRSSUJVVEUpICE9IG51bGwpIHsKLQkJCQkJaW50IGNvbHVtbiA9ICgoSW50ZWdlcikgbWVzc2FnZS5nZXRBdHRyaWJ1dGUoQ09MVU1OX05VTUJFUl9BVFRSSUJVVEUpKS5pbnRWYWx1ZSgpOwotCQkJCQlTdHJpbmcgc2VsZWN0aW9uU3RyYXRlZ3kgPSAoU3RyaW5nKSBtZXNzYWdlLmdldEF0dHJpYnV0ZShTUVVJR0dMRV9TRUxFQ1RJT05fU1RSQVRFR1lfQVRUUklCVVRFKTsKLQkJCQkJU3RyaW5nIG5hbWVPclZhbHVlID0gKFN0cmluZykgbWVzc2FnZS5nZXRBdHRyaWJ1dGUoU1FVSUdHTEVfTkFNRV9PUl9WQUxVRV9BVFRSSUJVVEUpOwotCi0JCQkJCS8vIGNvbnZlcnQgdGhlIGxpbmUgYW5kIENvbHVtbiBudW1iZXJzIHRvIGFuIG9mZnNldDoKLQkJCQkJaW50IHN0YXJ0ID0gZG9jdW1lbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZU9mZnNldChtZXNzYWdlLmdldExpbmVOdW1iZXIoKSAtIDEpICsgY29sdW1uIC0gMTsKLQotCQkJCQkvLyBjYWxjdWxhdGUgdGhlICJiZXR0ZXIiIHN0YXJ0IGFuZCBlbmQgb2Zmc2V0OgotCQkJCQlpbnRbXSByZXN1bHQgPSBjb21wdXRlU3RhcnRBbmRFbmRMb2NhdGlvbihzdGFydCwgc2VsZWN0aW9uU3RyYXRlZ3ksIGdldEVycm9yU2lkZShtZXNzYWdlKSwgbmFtZU9yVmFsdWUsIGRvY3VtZW50KTsKLQkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJCQltZXNzYWdlLnNldE9mZnNldChyZXN1bHRbMF0pOwotCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgocmVzdWx0WzFdIC0gcmVzdWx0WzBdKTsKLQkJCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgeyAvLyB0aGlzIGV4Y2VwdGlvbiBzaG91bGQgbm90Ci0JCQkJLy8gb2NjdXIgLSBpdCBpcyB0aHJvd24gaWYKLQkJCQkvLyB0cnlpbmcgdG8gY29udmVydCBhbgotCQkJCS8vIGludmFsaWQgbGluZSBudW1iZXIgdG8gYW5kCi0JCQkJLy8gb2Zmc2V0Ci0JCQl9Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZWx0YQotCSAqICAgICAgICAgICAgdGhlIElGaWxlRGVsdGEgY29udGFpbmluZyB0aGUgZmlsZSBuYW1lIHRvIGdldAotCSAqIEByZXR1cm4gdGhlIElGaWxlCi0JICovCi0JcHVibGljIElGaWxlIGdldEZpbGUoU3RyaW5nIGRlbHRhKSB7Ci0JCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoZGVsdGEpKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKQotCQkgIHJldHVybiBmaWxlOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gZ2V0IHRoZSBtb2RlbCBmb3IKLQkgKiBAcmV0dXJuIHRoZSBmaWxlJ3MgWE1MTW9kZWwKLQkgKi8KLQlwcm90ZWN0ZWQgSURPTU1vZGVsIGdldE1vZGVsRm9yUmVzb3VyY2UoSUZpbGUgZmlsZSkgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQotCQl0cnkgewotCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChmaWxlKTsKLQkJCS8vIFRPRE8uLiBIVE1MIHZhbGlkYXRvciB0cmllcyBhZ2FpbiB0byBnZXQgYSBtb2RlbCBhIDJuZCB3YXkKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gbW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwgPyAoSURPTU1vZGVsKSBtb2RlbCA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGNvbXB1dGVTdGFydEVuZExvY2F0aW9uKGludCBzdGFydE9mZnNldCwgU3RyaW5nCi0JICogICAgICAgICAgICAgZXJyb3JNZXNzYWdlLCBTdHJpbmcgc2VsZWN0aW9uU3RyYXRlZ3ksIGJvb2xlYW4gbGVmdEVycm9yLAotCSAqICAgICAgICAgICAgIFN0cmluZyBuYW1lT3JWYWx1ZSwgSURPTURvY3VtZW50IGRvY3VtZW50KSB7Ci0JICogCi0JICovCi0JcHJvdGVjdGVkIGludFtdIGNvbXB1dGVTdGFydEVuZExvY2F0aW9uKGludCBzdGFydE9mZnNldCwgU3RyaW5nIGVycm9yTWVzc2FnZSwgU3RyaW5nIHNlbGVjdGlvblN0cmF0ZWd5LCBTdHJpbmcgbmFtZU9yVmFsdWUsIElET01Eb2N1bWVudCBkb2N1bWVudCkgewotCQlyZXR1cm4gY29tcHV0ZVN0YXJ0QW5kRW5kTG9jYXRpb24oc3RhcnRPZmZzZXQsIHNlbGVjdGlvblN0cmF0ZWd5LCBFUlJPUl9TSURFX1JJR0hULCBuYW1lT3JWYWx1ZSwgZG9jdW1lbnQpOwotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZXMgdGhlICJiZXR0ZXIiIG9mZnNldHMuCi0JICogCi0JICogQHBhcmFtIHN0YXJ0T2Zmc2V0IC0KLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgZ2l2ZW4gYnkgWGVyY2VzCi0JICogQHBhcmFtIGVycm9yTWVzc2FnZSAtCi0JICogICAgICAgICAgICB0aGUgWGVyY2VzIGVycm9yIE1lc3NhZ2UKLQkgKiBAcGFyYW0gc2VsZWN0aW9uU3RyYXRlZ3kgLQotCSAqICAgICAgICAgICAgdGhlIHNlbGVjdGlvblN0cmF0ZWd5Ci0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudAotCSAqIEByZXR1cm4gaW50W10gLSBwb3NpdGlvbiAwIGhhcyB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBzcXVpZ2dsZSByYW5nZSwKLQkgKiAgICAgICAgIHBvc2l0aW9uIDEgaGFzIHRoZSBlbmRPZmZzZXQKLQkgKi8KLQkvKgotCSAqIFRoZSB3YXkgdGhlIG9mZnNldHMgaXMgY2FsY3VsYXRlZCBpczogLSBmaW5kIHRoZSBpbmRleGVkIHJlZ2lvbgotCSAqIChlbGVtZW50KSBjbG9zZXN0IHRvIHRoZSBnaXZlbiBvZmZzZXQgLSBpZiB3ZSBhcmUgYmV0d2VlbiB0d28gZWxlbWVudHMsCi0JICogY2hvb3NpbmcgbGVmdCBvciByaWdodCBlbGVtZW50IHdpbGwgZGVwZW5kIG9uIHBhcmFtZXRlciAnZXJyb3JTaWRlJyAtCi0JICogYmFzZWQgb24gdGhlIHNlbGVjdGlvblN0cmF0ZWd5IGNob29zZSB0aGUgdW5kZXJsaW5pbmcgc3RyYXRlZ3kgKGVnCi0JICogU1RBUlRfVEFHIG1lYW5zIHVuZGVybGluZSB0aGUgc3RhcnQgdGFnIG9mIHRoYXQgZWxlbWVudCkgLSB1c2UKLQkgKiBpbmZvcm1hdGlvbiBmcm9tIG5hbWVPclZhbHVlIGFuZCB0aGUgRE9NIHRvIGdldCBiZXR0ZXIgb2Zmc2V0cwotCSAqIAotCSAqLwotCXByb3RlY3RlZCBpbnRbXSBjb21wdXRlU3RhcnRBbmRFbmRMb2NhdGlvbihpbnQgc3RhcnRPZmZzZXQsIFN0cmluZyBzZWxlY3Rpb25TdHJhdGVneSwgU3RyaW5nIGVycm9yU2lkZSwgU3RyaW5nIG5hbWVPclZhbHVlLCBJRE9NRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdHJ5IHsKLQkJCWludCBzdGFydEVuZFBvc2l0aW9uc1tdID0gbmV3IGludFsyXTsKLQotCQkJSW5kZXhlZFJlZ2lvbiByZWdpb24gPSBkb2N1bWVudC5nZXRNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24oc3RhcnRPZmZzZXQpOwotCQkJSW5kZXhlZFJlZ2lvbiBwcmV2UmVnaW9uID0gZG9jdW1lbnQuZ2V0TW9kZWwoKS5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0T2Zmc2V0IC0gMSk7Ci0KLQkJCWlmIChwcmV2UmVnaW9uICE9IHJlZ2lvbikgewotCQkJCS8vIGlmIGJldHdlZW4gdHdvIHJlZ2lvbnMgd2UgdXNlIHRoZSAnZXJyb3JTaWRlJyB0byB1bmRlcnN0YW5kCi0JCQkJLy8gd2hpY2gKLQkJCQkvLyBlbGVtZW50IGlzIGFwcGxpY2FibGUuIGlmIHdlIGtub3cgdGhlIGVycm9yIGhhcyBiZWVuCi0JCQkJLy8gcmVwb3J0ZWQgdG8gdGhlCi0JCQkJLy8gcmlnaHQgb2YgdGhlIHRhZywgdGhlbiB3ZSBjYW4gYXNzdW1lIHdlIG5lZWQgdG8gc3RlcCBiYWNrCi0JCQkJLy8gdG8gdGhlIHByZXZpb3VzCi0JCQkJLy8gcmVnaW9uIHRvIGxhbmQgYXQgdGhlICdjb3JyZWN0IGxvY2F0aW9uLiBPdGhlcndpc2UgYXNzdW1lCi0JCQkJLy8gd2UncmUKLQkJCQkvLyBleGFjdGx5IHdoZXJlIHdlIG5lZWQgdG8gYmUuCi0JCQkJaWYgKEVSUk9SX1NJREVfTEVGVC5lcXVhbHMoZXJyb3JTaWRlKSkgewotCQkJCQlyZWdpb24gPSBwcmV2UmVnaW9uOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gaW5pdGlhbGl6ZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucyB0byBiZSB0aGUgc3RhcnQgcG9zaXRpb25zCi0JCQkvLyB0aGlzIG1lYW5zIGlmIHRoZQotCQkJLy8gc3BlY2lhbCBjYXNlIGlzIG5vdCB0YWtlbiBjYXJlIG9mIGJlbG93IHRoZSBzdGFydCBhbmQgZW5kCi0JCQkvLyBvZmZzZXQgYXJlIHNldCB0byBiZQotCQkJLy8gdGhlIHN0YXJ0IG9mIHRoZSByZWdpb24gd2hlcmUgdGhlIGVycm9yIHdhcwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJc3RhcnRFbmRQb3NpdGlvbnNbMF0gPSByZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IHN0YXJ0RW5kUG9zaXRpb25zWzBdOwotCQkJfQotCQkJZWxzZSB7IC8vIHRoaXMgd2lsbCBtZXNzYWdlIHdpbGwgbm90IGdldCBhZGRlZCB0byB0aGUgSVJlcG9ydGVyCi0JCQkJLy8gc2luY2UgdGhlIGxlbmd0aCBpcyAwCi0JCQkJc3RhcnRFbmRQb3NpdGlvbnNbMF0gPSAwOwotCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzFdID0gMDsKLQkJCX0KLQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIHJlZ2lvbjsKLQotCQkJCWlmIChTVEFSVF9UQUcuZXF1YWxzKHNlbGVjdGlvblN0cmF0ZWd5KSkgey8vIHRoZW4gd2Ugd2FudCB0bwotCQkJCQkvLyB1bmRlcmxpbmUgdGhlIG9wZW5pbmcgdGFnCi0JCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IGVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKSArIDE7Ci0JCQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IHN0YXJ0RW5kUG9zaXRpb25zWzBdICsgZWxlbWVudC5nZXRUYWdOYW1lKCkubGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoRU5EX1RBRy5lcXVhbHMoc2VsZWN0aW9uU3RyYXRlZ3kpKSB7Ly8gdGhlbiB3ZSB3YW50IHRvCi0JCQkJCS8vIHVuZGVybGluZSB0aGUgZW5kIHRhZwotCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMF0gPSBlbGVtZW50LmdldEVuZFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IGVsZW1lbnQuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoQVRUUklCVVRFX05BTUUuZXF1YWxzKHNlbGVjdGlvblN0cmF0ZWd5KSkgeyAvLyBpbgotCQkJCQkvLyB1bmRlcmxpbmUgdGhlIGF0dHJpYnV0ZSdzIG5hbWUKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJCQkJCUlET01Ob2RlIGF0dHJpYnV0ZU5vZGUgPSAoSURPTU5vZGUpIChlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUobmFtZU9yVmFsdWUpKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVOb2RlICE9IG51bGwpIHsKLQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IGF0dHJpYnV0ZU5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IGF0dHJpYnV0ZU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSArIG5hbWVPclZhbHVlLmxlbmd0aCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKEFUVFJJQlVURV9WQUxVRS5lcXVhbHMoc2VsZWN0aW9uU3RyYXRlZ3kpKSB7Ci0JCQkJCS8vIHVuZGVybGluZSB0aGUgYXR0cmlidXRlJ3MgdmFsdWUKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJCQkJCUlET01BdHRyIGF0dHJpYnV0ZU5vZGUgPSAoSURPTUF0dHIpIChlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUobmFtZU9yVmFsdWUpKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVOb2RlICE9IG51bGwpIHsKLQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IGF0dHJpYnV0ZU5vZGUuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotCQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzFdID0gc3RhcnRFbmRQb3NpdGlvbnNbMF0gKyBhdHRyaWJ1dGVOb2RlLmdldFZhbHVlUmVnaW9uVGV4dCgpLmxlbmd0aCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKEFMTF9BVFRSSUJVVEVTLmVxdWFscyhzZWxlY3Rpb25TdHJhdGVneSkpIHsKLQkJCQkJLy8gdW5kZXJsaW5lIGFsbCBhdHRyaWJ1dGVzCi0JCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCQkJCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJCQkJCUlET01Ob2RlIGZpcnN0ID0gKElET01Ob2RlKSBhdHRyaWJ1dGVzLml0ZW0oMCk7Ci0JCQkJCQkJSURPTU5vZGUgbGFzdCA9IChJRE9NTm9kZSkgYXR0cmlidXRlcy5pdGVtKGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJCQkJCQlpZiAoKGZpcnN0ICE9IG51bGwpICYmIChsYXN0ICE9IG51bGwpKSB7Ci0JCQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzBdID0gZmlyc3QuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSBsYXN0LmdldEVuZE9mZnNldCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChURVhULmVxdWFscyhzZWxlY3Rpb25TdHJhdGVneSkpIHsKLQkJCQkJLy8gdW5kZXJsaW5lIHRoZSB0ZXh0IGJldHdlZW4gdGhlIHRhZ3MKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQkJSURPTVRleHQgdGV4dE5vZGUgPSAoSURPTVRleHQpIG5vZGU7Ci0JCQkJCQlpbnQgc3RhcnQgPSB0ZXh0Tm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJU3RyaW5nIHZhbHVlID0gdGV4dE5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQkJY2hhciBjdXJDaGFyID0gdmFsdWUuY2hhckF0KGluZGV4KTsKLQkJCQkJCS8vIGhlcmUgd2UgYXJlIGZpbmRpbmcgc3RhcnQgb2Zmc2V0IGJ5IHNraXBwaW5nIG92ZXIKLQkJCQkJCS8vIHdoaXRlc3BhY2U6Ci0JCQkJCQl3aGlsZSAoKGN1ckNoYXIgPT0gJ1xuJykgfHwgKGN1ckNoYXIgPT0gJ1x0JykgfHwgKGN1ckNoYXIgPT0gJ1xyJykgfHwgKGN1ckNoYXIgPT0gJyAnKSkgewotCQkJCQkJCWN1ckNoYXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpOwotCQkJCQkJCWluZGV4Kys7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQkJCQkJaW5kZXgtLTsKLQotCQkJCQkJfQotCQkJCQkJc3RhcnQgPSBzdGFydCArIGluZGV4OwotCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMF0gPSBzdGFydCArIGluZGV4OwotCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSBzdGFydCArIHZhbHVlLnRyaW0oKS5sZW5ndGgoKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCQkJCQlOb2RlIGNoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCQkJCUlET01Ob2RlIHhtbENoaWxkID0gKChJRE9NTm9kZSkgY2hpbGQpOwotCQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzBdID0geG1sQ2hpbGQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IHhtbENoaWxkLmdldEVuZE9mZnNldCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKEZJUlNUX05PTl9XSElURVNQQUNFX1RFWFQuZXF1YWxzKHNlbGVjdGlvblN0cmF0ZWd5KSkgewotCQkJCQkvLyBzZWFyY2ggdGhyb3VnaCBhbGwgY2hpbGQgbm9kZXMgYW5kIHJldHVybiByYW5nZSBvZgotCQkJCQkvLyBmaXJzdCBub24td2hpdGVzcGFjZQotCQkJCQkvLyB0ZXh0IG5vZGUKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJTm9kZUxpc3Qgbm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQkJCU5vZGUgY3VycmVudE5vZGUgPSBub2Rlcy5pdGVtKGkpOwotCQkJCQkJCWlmIChjdXJyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCQkJCS8vIFRPRE8gKFRydW5nKSBJIGRvbid0IHRoaW5rIHdlIHNob3VsZCBjYWxsCi0JCQkJCQkJCS8vIGdldE5vZGVWYWx1ZSgpLCB0cmltKCksIGxlbmd0aCgpCi0JCQkJCQkJCS8vIHJlcGVhdGVkbHkuCi0JCQkJCQkJCS8vIFRoaXMgaXMgaW5lZmZpY2llbnQsIHRvIGltcHJvdmUgdXNlIGxvY2FsCi0JCQkJCQkJCS8vIHZhcmlhYmxlcyB0byBzdG9yZSB2YWx1ZXMuCi0JCQkJCQkJCUlET01UZXh0IHRleHROb2RlID0gKElET01UZXh0KSBjdXJyZW50Tm9kZTsKLQkJCQkJCQkJaWYgKHRleHROb2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJCVN0cmluZyB2YWx1ZSA9IHRleHROb2RlLmdldE5vZGVWYWx1ZSgpOwotCQkJCQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJCQkJCWludCBzdGFydCA9IHRleHROb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQkJCQljaGFyIGN1ckNoYXIgPSB2YWx1ZS5jaGFyQXQoaW5kZXgpOwotCQkJCQkJCQkJLy8gaGVyZSB3ZSBhcmUgZmluZGluZyBzdGFydCBvZmZzZXQgYnkKLQkJCQkJCQkJCS8vIHNraXBwaW5nIG92ZXIgd2hpdGVzcGFjZToKLQkJCQkJCQkJCXdoaWxlICgoY3VyQ2hhciA9PSAnXG4nKSB8fCAoY3VyQ2hhciA9PSAnXHQnKSB8fCAoY3VyQ2hhciA9PSAnXHInKSB8fCAoY3VyQ2hhciA9PSAnICcpKSB7Ci0JCQkJCQkJCQkJY3VyQ2hhciA9IHZhbHVlLmNoYXJBdChpbmRleCk7Ci0JCQkJCQkJCQkJaW5kZXgrKzsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmIChpbmRleCA+IDApIHsKLQkJCQkJCQkJCQlpbmRleC0tOwotCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlzdGFydCA9IHN0YXJ0ICsgaW5kZXg7Ci0JCQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IHN0YXJ0OwotCQkJCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSBzdGFydCArIHZhbHVlLnRyaW0oKS5sZW5ndGgoKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQllbHNlIGlmIChURVhUX0VOVElUWV9SRUZFUkVOQ0UuZXF1YWxzKHNlbGVjdGlvblN0cmF0ZWd5KSkgewotCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFKSB7Ci0JCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IHJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSByZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQkvKgotCQkJCQkJICogSW4gdGhpcyBjYXNlIHRoZSB1bmRlY2xhcmVkIGVudGl0eSBtaWdodCBiZSBpbiBvbmUKLQkJCQkJCSAqIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWVzLiBTZWFyY2ggdGhyb3VnaCB0aGUKLQkJCQkJCSAqIGF0dHJpYnV0ZXMgdG8gZmluZCB0aGUgcmFuZ2Ugb2YgdGhlIHVuZGVjbGFyZWQKLQkJCQkJCSAqIGVudGl0eS4KLQkJCQkJCSAqLwotCQkJCQkJU3RyaW5nIGVudGl0eSA9ICImIiArIG5hbWVPclZhbHVlICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQkJCUlET01BdHRyIGF0dHIgPSAoSURPTUF0dHIpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCQkJCQlTdHJpbmcgbm9kZVZhbHVlID0gYXR0ci5nZXROb2RlVmFsdWUoKTsKLQkJCQkJCQlpbnQgaW5kZXggPSBub2RlVmFsdWUuaW5kZXhPZihlbnRpdHkpOwotCQkJCQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IGF0dHIuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgaW5kZXggKyAxOwotCQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IHN0YXJ0RW5kUG9zaXRpb25zWzBdICsgZW50aXR5Lmxlbmd0aCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotCQkJCWVsc2UgaWYgKFZBTFVFX09GX0FUVFJJQlVURV9XSVRIX0dJVkVOX1ZBTFVFLmVxdWFscyhzZWxlY3Rpb25TdHJhdGVneSkpIHsKLQkJCQkJLy8gVE9ETyAoVHJ1bmcpIGRvIHdlIHJlYWxseSBuZWVkIHRoaXMgc3RyYXRlZ3kgPwotCQkJCQkvLyBJZiB3ZSBrbm93IHRoZSBuYW1lIG9mIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIHdlCi0JCQkJCS8vIGNhbiByZXRyaWV2ZSBpdHMgdmFsdWUuCi0JCQkJCS8vIEhlbmNlLCB3ZSBjYW4gaW5jb3BlcmF0ZSB0aGlzIHN0cmF0ZWd5IHdpdGgKLQkJCQkJLy8gQVRUUklCVVRFX1ZBTFVFID8KLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJLy8gaGVyZSB3ZSB3aWxsIHNlYXJjaCB0aHJvdWdoIGFsbCBhdHRyaWJ1dGVzIGZvciB0aGUKLQkJCQkJCS8vIG9uZSB3aXRoIHRoZQotCQkJCQkJLy8gd2l0aCB0aGUgdmFsdWUgd2Ugd2FudDoKLQkJCQkJCS8vIFRPRE8gKFRydW5nKSBJIHNlZSBhIHBvdGVudGlhbCBwcm9ibGVtIGhlcmUuCi0JCQkJCQkvLyBXaGF0IGhhcHBlbnMgd2hlbiB0aGVyZSBpcyBhbm90aGVyIGF0dHJpYnV0ZSBoYXZpbmcKLQkJCQkJCS8vIHRoZSBzYW1lIHZhbHVlCi0JCQkJCQkvLyB3aXRoIHRoaXMgYXR0cmlidXRlJ3MgYnVnZ3kgdmFsdWUgPwotCQkJCQkJLy8gTmVlZCB0byBzb2x2ZSB3aGVuIHRpbWUgcGVybWl0cy4KLQkJCQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQkJCUlET01BdHRyIGF0dHIgPSAoSURPTUF0dHIpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCQkJCQlTdHJpbmcgbm9kZVZhbHVlID0gYXR0ci5nZXROb2RlVmFsdWUoKS50cmltKCk7Ci0JCQkJCQkJaWYgKG5vZGVWYWx1ZS5lcXVhbHMobmFtZU9yVmFsdWUpKSB7Ci0JCQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzBdID0gYXR0ci5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCkgKyAxOwotCQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IHN0YXJ0RW5kUG9zaXRpb25zWzBdICsgbm9kZVZhbHVlLmxlbmd0aCgpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc3RhcnRFbmRQb3NpdGlvbnM7Ci0JCX0KLQkJLy8gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IC8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCS8vIH0KLQkJZmluYWxseSB7Ci0JCX0KLQkJLy8gcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGRlbGVnYXRlIHZhbGlkYXRvciBpcyBlbmFibGVkIGJhc2VkIG9uIFZhbGlkYXRpb24KLQkgKiBwcmVmZXJlbmNlcwotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybiBmYWxzZSBpZiBkZWxlZ2F0ZSB2YWxpZGF0b3IgaXMgbm90IGVuYWJsZWQgYmFzZWQgb24gVmFsaWRhdG9pbgotCSAqICAgICAgICAgcHJlZmVyZW5jZXMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWxlZ2F0ZVZhbGlkYXRvckVuYWJsZWQoSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yU2lkZShJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCS8vIG5vdGUgdGhhdCBpZiB0aGUgRVJST1JfU0lERSBpcyB1bnNwZWNpZmllZCB3ZSByZXR1cm4gdGhlIGRlZmF1bHQKLQkJLy8gdmFsdWUgRVJST1JfU0lERV9MRUZUCi0JCU9iamVjdCB2YWx1ZSA9IG1lc3NhZ2UuZ2V0QXR0cmlidXRlKEVSUk9SX1NJREUpOwotCQlyZXR1cm4gRVJST1JfU0lERV9SSUdIVC5lcXVhbHModmFsdWUpID8gRVJST1JfU0lERV9SSUdIVCA6IEVSUk9SX1NJREVfTEVGVDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNGE4NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgcGVyZm9ybXMgYXMgeW91IHR5cGUgdmFsaWRhdGlvbiBmb3IgWE1MIGZpbGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWE1MIGV4dGVuZHMgRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvcgotewotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSWQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQotICBwcml2YXRlIFZhbGlkYXRvciBfdmFsaWRhdG9yOwotCi0gIHB1YmxpYyBEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWE1MKCkKLSAgewotICB9Ci0KLSAgcHJpdmF0ZSBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkKLSAgewotICAgIGlmIChfdmFsaWRhdG9yID09IG51bGwpCi0gICAgICBfdmFsaWRhdG9yID0gVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuZ2V0VmFsaWRhdG9yKElkKTsKLSAgICByZXR1cm4gX3ZhbGlkYXRvcjsKLSAgfQotCi0gIHByb3RlY3RlZCBJVmFsaWRhdG9yIGdldERlbGVnYXRlVmFsaWRhdG9yKCkKLSAgewotICAgIFZhbGlkYXRvciB2ID0gZ2V0VmFsaWRhdG9yKCk7Ci0gICAgaWYgKHYgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotICAgIHJldHVybiB2LmFzSVZhbGlkYXRvcigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWxlZ2F0ZVZhbGlkYXRvckVuYWJsZWQoSUZpbGUgZmlsZSkKLSAgewotICAgIFZhbGlkYXRvciB2ID0gZ2V0VmFsaWRhdG9yKCk7Ci0gICAgaWYgKHYgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoIXYuc2hvdWxkVmFsaWRhdGUoZmlsZSwgZmFsc2UsIGZhbHNlKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdi5pc0J1aWxkVmFsaWRhdGlvbigpIHx8IHYuaXNNYW51YWxWYWxpZGF0aW9uKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL01hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9NYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGM4NzZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL01hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnF1aWNrYXNzaXN0LklRdWlja0Fzc2lzdEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucXVpY2thc3Npc3QuSVF1aWNrQXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb24uUHJvYmxlbUlEc1hNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb24uUmVtb3ZlVW5rbm93bkVsZW1lbnRRdWlja0ZpeFByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5SZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLQotLyoqCi0gKiBRdWljayBhc3Npc3QgcHJvY2Vzc29yIGZvciBwcm9ibGVtcyBmb3VuZCBieSB0aGUgbWFya3VwIHZhbGlkYXRvcgotICovCi1jbGFzcyBNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElRdWlja0Fzc2lzdFByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBpbnQgZlByb2JsZW1JZDsKLQlwcml2YXRlIE9iamVjdCBmQWRkaXRpb25hbEZpeEluZm8gPSBudWxsOwotCi0JcHVibGljIGJvb2xlYW4gY2FuQXNzaXN0KElRdWlja0Fzc2lzdEludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaXgoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJc3dpdGNoIChmUHJvYmxlbUlkKSB7Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuRW1wdHlUYWcgOgotCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdFbmRUYWcgOgotCQkJY2FzZSBQcm9ibGVtSURzWE1MLkF0dHJzSW5FbmRUYWcgOgotCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdBdHRyVmFsdWUgOgotCQkJY2FzZSBQcm9ibGVtSURzWE1MLk5vQXR0clZhbHVlIDoKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5TcGFjZXNCZWZvcmVUYWdOYW1lIDoKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5TcGFjZXNCZWZvcmVQSSA6Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuTmFtZXNwYWNlSW5QSSA6Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuVW5rbm93bkVsZW1lbnQgOgotCQkJY2FzZSBQcm9ibGVtSURzWE1MLlVua25vd25BdHRyIDoKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5JbnZhbGlkQXR0clZhbHVlIDoKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5NaXNzaW5nUmVxdWlyZWRBdHRyIDoKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5BdHRyVmFsdWVOb3RRdW90ZWQgOgotCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdDbG9zaW5nQnJhY2tldCA6Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlUXVpY2tBc3Npc3RQcm9wb3NhbHMoSVF1aWNrQXNzaXN0SW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQpIHsKLQkJQXJyYXlMaXN0IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlzd2l0Y2ggKGZQcm9ibGVtSWQpIHsKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5FbXB0eVRhZyA6Ci0JCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRPZmZzZXQoKSwgaW52b2NhdGlvbkNvbnRleHQuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMCwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJCWJyZWFrOwotCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdFbmRUYWcgOgotCQkJCVN0cmluZyB0YWdOYW1lID0gKFN0cmluZykgKChPYmplY3RbXSkgZkFkZGl0aW9uYWxGaXhJbmZvKVswXTsKLQkJCQlTdHJpbmcgdGFnQ2xvc2UgPSAoU3RyaW5nKSAoKE9iamVjdFtdKSBmQWRkaXRpb25hbEZpeEluZm8pWzFdOwotCQkJCWludCB0YWdDbG9zZU9mZnNldCA9ICgoSW50ZWdlcikgKChPYmplY3RbXSkgZkFkZGl0aW9uYWxGaXhJbmZvKVsyXSkuaW50VmFsdWUoKTsKLQkJCQlpbnQgc3RhcnRUYWdFbmRPZmZzZXQgPSAoKEludGVnZXIpICgoT2JqZWN0W10pIGZBZGRpdGlvbmFsRml4SW5mbylbM10pLmludFZhbHVlKCk7Ci0JCQkJaW50IGZpcnN0Q2hpbGRTdGFydE9mZnNldCA9ICgoSW50ZWdlcikgKChPYmplY3RbXSkgZkFkZGl0aW9uYWxGaXhJbmZvKVs0XSkuaW50VmFsdWUoKTsKLQkJCQlpbnQgZW5kT2Zmc2V0ID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSBmQWRkaXRpb25hbEZpeEluZm8pWzVdKS5pbnRWYWx1ZSgpOwotCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCh0YWdDbG9zZSwgdGFnQ2xvc2VPZmZzZXQsIDAsIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMSwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpLCBzdGFydFRhZ0VuZE9mZnNldCAtIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzIsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIjwvIiArIHRhZ05hbWUgKyAiPiIsIGZpcnN0Q2hpbGRTdGFydE9mZnNldCwgMCwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF8zLCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIjwvIiArIHRhZ05hbWUgKyAiPiIsIGVuZE9mZnNldCwgMCwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF80LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCQlicmVhazsKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5BdHRyc0luRW5kVGFnIDoKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF81LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuTWlzc2luZ0F0dHJWYWx1ZSA6Ci0JCQkJU3RyaW5nIGRlZmF1bHRBdHRyVmFsdWUgPSAoU3RyaW5nKSAoKE9iamVjdFtdKSBmQWRkaXRpb25hbEZpeEluZm8pWzBdOwotCQkJCWludCBpbnNlcnRPZmZzZXQgPSAoKEludGVnZXIpICgoT2JqZWN0W10pIGZBZGRpdGlvbmFsRml4SW5mbylbMV0pLmludFZhbHVlKCk7Ci0JCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCJcIiIgKyBkZWZhdWx0QXR0clZhbHVlICsgIlwiIiwgaW52b2NhdGlvbkNvbnRleHQuZ2V0T2Zmc2V0KCkgKyBpbnZvY2F0aW9uQ29udGV4dC5nZXRMZW5ndGgoKSArIGluc2VydE9mZnNldCwgMCwgZGVmYXVsdEF0dHJWYWx1ZS5sZW5ndGgoKSArIDIsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfNiwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgCi0JCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRPZmZzZXQoKSwgaW52b2NhdGlvbkNvbnRleHQuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfNywgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJCWJyZWFrOwotCQkJY2FzZSBQcm9ibGVtSURzWE1MLk5vQXR0clZhbHVlIDoKLQkJCQlkZWZhdWx0QXR0clZhbHVlID0gKFN0cmluZykgZkFkZGl0aW9uYWxGaXhJbmZvOwotCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiPVwiIiArIGRlZmF1bHRBdHRyVmFsdWUgKyAiXCIiLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRPZmZzZXQoKSArIGludm9jYXRpb25Db250ZXh0LmdldExlbmd0aCgpLCAwLCBkZWZhdWx0QXR0clZhbHVlLmxlbmd0aCgpICsgMywgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF82LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF83LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuU3BhY2VzQmVmb3JlVGFnTmFtZSA6Ci0JCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRPZmZzZXQoKSwgaW52b2NhdGlvbkNvbnRleHQuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfOCwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJCWJyZWFrOwotCQkJY2FzZSBQcm9ibGVtSURzWE1MLlNwYWNlc0JlZm9yZVBJIDoKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF85LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuTmFtZXNwYWNlSW5QSSA6Ci0JCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCBpbnZvY2F0aW9uQ29udGV4dC5nZXRPZmZzZXQoKSwgaW52b2NhdGlvbkNvbnRleHQuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTAsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQlicmVhazsKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5Vbmtub3duRWxlbWVudCA6Ci0JCQkJcHJvcG9zYWxzLmFkZChuZXcgUmVtb3ZlVW5rbm93bkVsZW1lbnRRdWlja0ZpeFByb3Bvc2FsKGZBZGRpdGlvbmFsRml4SW5mbywgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF8xMSkpOwotCQkJCXByb3Bvc2Fscy5hZGQobmV3IFJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWwoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuVW5rbm93bkF0dHIgOgotCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgaW52b2NhdGlvbkNvbnRleHQuZ2V0T2Zmc2V0KCksIGludm9jYXRpb25Db250ZXh0LmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzcsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBSZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQcm9ibGVtSURzWE1MLkludmFsaWRBdHRyVmFsdWUgOgotCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgaW52b2NhdGlvbkNvbnRleHQuZ2V0T2Zmc2V0KCksIGludm9jYXRpb25Db250ZXh0LmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzEyLCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuTWlzc2luZ1JlcXVpcmVkQXR0ciA6Ci0JCQkJU3RyaW5nIHJlcXVpcmVkQXR0ciA9IChTdHJpbmcpICgoT2JqZWN0W10pIGZBZGRpdGlvbmFsRml4SW5mbylbMF07Ci0JCQkJaW5zZXJ0T2Zmc2V0ID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSBmQWRkaXRpb25hbEZpeEluZm8pWzFdKS5pbnRWYWx1ZSgpOwotCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbChyZXF1aXJlZEF0dHIsIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpICsgaW5zZXJ0T2Zmc2V0LCAwLCByZXF1aXJlZEF0dHIubGVuZ3RoKCksIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTMsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb2JsZW1JRHNYTUwuQXR0clZhbHVlTm90UXVvdGVkIDoKLQkJCQlTdHJpbmcgYXR0clZhbHVlID0gKFN0cmluZykgZkFkZGl0aW9uYWxGaXhJbmZvOwotCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiXCIiICsgYXR0clZhbHVlICsgIlwiIiwgaW52b2NhdGlvbkNvbnRleHQuZ2V0T2Zmc2V0KCksIGludm9jYXRpb25Db250ZXh0LmdldExlbmd0aCgpLCBhdHRyVmFsdWUubGVuZ3RoKCkgKyAyLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzE0LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCQlicmVhazsKLQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5NaXNzaW5nQ2xvc2luZ0JyYWNrZXQgOgotCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiPiIsIGludm9jYXRpb25Db250ZXh0LmdldE9mZnNldCgpICsgaW52b2NhdGlvbkNvbnRleHQuZ2V0TGVuZ3RoKCksIDAsIDEsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTUsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgcHJvcG9zYWxzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DT1JSRUNUSU9OX0NIQU5HRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvYmxlbUlkKGludCBwcm9ibGVtSWQpIHsKLQkJZlByb2JsZW1JZCA9IHByb2JsZW1JZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsRml4SW5mbyhPYmplY3QgZml4SW5mbykgewotCQlmQWRkaXRpb25hbEZpeEluZm8gPSBmaXhJbmZvOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL01hcmt1cFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vTWFya3VwVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyM2M4ZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vTWFya3VwVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucXVpY2thc3Npc3QuSVF1aWNrQXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5BYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5SZWNvbmNpbGVBbm5vdGF0aW9uS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlRlbXBvcmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yLkFubm90YXRpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvci5JU291cmNlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvci5JbmNyZW1lbnRhbFJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkxvY2FsaXplZE1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5Qcm9ibGVtSURzWE1MOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQmFzaWMgWE1MIHN5bnRheCBjaGVja2luZyBzdGVwLiBPbmx5IHVzZWQgYXMgSVNvdXJjZVZhbGlkYXRvciBhdCB0aGUKLSAqIG1vbWVudAotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgTWFya3VwVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvciwgSVNvdXJjZVZhbGlkYXRvciB7Ci0JcHJpdmF0ZSBTdHJpbmcgRFFVT1RFID0gIlwiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBTRVZFUklUWV9BVFRSX01JU1NJTkdfVkFMVUUgPSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX0VSUk9SOwotCXByb3RlY3RlZCBTdHJpbmcgU0VWRVJJVFlfQVRUUl9OT19WQUxVRSA9IFRlbXBvcmFyeUFubm90YXRpb24uQU5OT1RfRVJST1I7Ci0JLy8gc2V2ZXJpdGllcyBmb3IgdGhlIHByb2JsZW1zIGRpc2NvdmVyYWJsZSBieSB0aGlzIHJlY29uY2lsZXI7IHBvc3NpYmx5Ci0JLy8gdXNlciBjb25maWd1cmFibGUgbGF0ZXIKLQlwcm90ZWN0ZWQgU3RyaW5nIFNFVkVSSVRZX0dFTkVSSUNfSUxMRk9STUVEX1NZTlRBWCA9IFRlbXBvcmFyeUFubm90YXRpb24uQU5OT1RfV0FSTklORzsKLQlwcm90ZWN0ZWQgU3RyaW5nIFNFVkVSSVRZX1NUUlVDVFVSRSA9IFRlbXBvcmFyeUFubm90YXRpb24uQU5OT1RfRVJST1I7Ci0JcHJvdGVjdGVkIFN0cmluZyBTRVZFUklUWV9TWU5UQVhfRVJST1IgPSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX0VSUk9SOwotCS8vIHVzZWQgZm9yIGF0dHJpYnV0ZSBxdW90ZSBjaGVja2luZwotCXByaXZhdGUgU3RyaW5nIFNRVU9URSA9ICInIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFFVSUNLQVNTSVNUUFJPQ0VTU09SID0gSVF1aWNrQXNzaXN0UHJvY2Vzc29yLmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQotCXByaXZhdGUgdm9pZCBhZGRBdHRyaWJ1dGVFcnJvcihTdHJpbmcgbWVzc2FnZVRleHQsIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZVRleHQsIGludCBzdGFydCwgaW50IGxlbmd0aCwgaW50IHByb2JsZW1JZCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0KLQkJaWYgKHNkUmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgbGluZU5vID0gZ2V0TGluZU51bWJlcihzdGFydCk7Ci0JCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIG1lc3NhZ2VUZXh0KTsKLQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8pOwotCi0JCU1hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvcigpOwotCQlwcm9jZXNzb3Iuc2V0UHJvYmxlbUlkKHByb2JsZW1JZCk7Ci0JCXByb2Nlc3Nvci5zZXRBZGRpdGlvbmFsRml4SW5mbyhhdHRyaWJ1dGVWYWx1ZVRleHQpOwotCQltZXNzYWdlLnNldEF0dHJpYnV0ZShRVUlDS0FTU0lTVFBST0NFU1NPUiwgcHJvY2Vzc29yKTsKLQotCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEFubm90YXRpb25JbmZvKG1lc3NhZ2UpOwotCQkoKEluY3JlbWVudGFsUmVwb3J0ZXIpIHJlcG9ydGVyKS5hZGRBbm5vdGF0aW9uSW5mbyh0aGlzLCBpbmZvKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tBdHRyaWJ1dGVzSW5FbmRUYWcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotCi0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlUZXh0UmVnaW9uTGlzdCB0ZXh0UmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCWludCBlcnJvckNvdW50ID0gMDsKLQkJaW50IHN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQlpbnQgZW5kID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQlmb3IgKGludCBpID0gMDsgKGkgPCB0ZXh0UmVnaW9ucy5zaXplKCkpICYmIChlcnJvckNvdW50IDwgQWJzdHJhY3RTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kuRUxFTUVOVF9FUlJPUl9MSU1JVCkgJiYgIXN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKCh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHx8ICh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgfHwgKHRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpKSB7Ci0JCQkJaWYgKHN0YXJ0ID4gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHRleHRSZWdpb24pKSB7Ci0JCQkJCXN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHRleHRSZWdpb24pOwotCQkJCX0KLQkJCQllbmQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KHRleHRSZWdpb24pOwotCQkJCWVycm9yQ291bnQrKzsKLQkJCX0KLQkJfQotCQkvLyBjcmVhdGUgb25lIGVycm9yIGZvciBhbGwgYXR0cmlidXRlcyBpbiB0aGUgZW5kIHRhZwotCQlpZiAoZXJyb3JDb3VudCA+IDApIHsKLQkJCS8vIFBvc2l0aW9uIHAgPSBuZXcgUG9zaXRpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IFhNTFVJTWVzc2FnZXMuRW5kX3RhZ19oYXNfYXR0cmlidXRlczsKLQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwgbWVzc2FnZVRleHQpOwotCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJbWVzc2FnZS5zZXRMZW5ndGgoZW5kIC0gc3RhcnQpOwotCQkJbWVzc2FnZS5zZXRMaW5lTm8oZ2V0TGluZU51bWJlcihzdGFydCkpOwotCi0JCQlNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgTWFya3VwUXVpY2tBc3Npc3RQcm9jZXNzb3IoKTsKLQkJCXByb2Nlc3Nvci5zZXRQcm9ibGVtSWQoUHJvYmxlbUlEc1hNTC5BdHRyc0luRW5kVGFnKTsKLQkJCW1lc3NhZ2Uuc2V0QXR0cmlidXRlKFFVSUNLQVNTSVNUUFJPQ0VTU09SLCBwcm9jZXNzb3IpOwotCi0JCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEFubm90YXRpb25JbmZvKG1lc3NhZ2UpOwotCQkJKChJbmNyZW1lbnRhbFJlcG9ydGVyKSByZXBvcnRlcikuYWRkQW5ub3RhdGlvbkluZm8odGhpcywgaW5mbyk7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBjaGVja0Nsb3NpbmdCcmFja2V0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlib29sZWFuIGNsb3NlZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgKGkgPCByZWdpb25zLnNpemUoKSkgJiYgIXN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKTsgaSsrKSB7Ci0JCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgfHwgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkpIHsKLQkJCQljbG9zZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmICghY2xvc2VkKSB7Ci0KLQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IFhNTFVJTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF82OwotCi0JCQlpbnQgc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWludCBsZW5ndGggPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKTsKLQkJCWludCBsaW5lTm8gPSBnZXRMaW5lTnVtYmVyKHN0YXJ0KTsKLQotCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgbWVzc2FnZVRleHQpOwotCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0KLQkJCU1hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvcigpOwotCQkJcHJvY2Vzc29yLnNldFByb2JsZW1JZChQcm9ibGVtSURzWE1MLk1pc3NpbmdDbG9zaW5nQnJhY2tldCk7Ci0JCQltZXNzYWdlLnNldEF0dHJpYnV0ZShRVUlDS0FTU0lTVFBST0NFU1NPUiwgcHJvY2Vzc29yKTsKLQotCQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IG5ldyBBbm5vdGF0aW9uSW5mbyhtZXNzYWdlKTsKLQkJCSgoSW5jcmVtZW50YWxSZXBvcnRlcikgcmVwb3J0ZXIpLmFkZEFubm90YXRpb25JbmZvKHRoaXMsIGluZm8pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRW1wdHlUYWcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotCi0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIG5hdmlnYXRlIHRvIG5hbWUKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucy5zaXplKCkgPT0gMikgewotCQkJLy8gbWlzc2luZyBuYW1lIHJlZ2lvbgotCQkJaWYgKChyZWdpb25zLmdldCgwKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pICYmIChyZWdpb25zLmdldCgxKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSkgewotCQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IFhNTFVJTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF8zOwotCQkJCWludCBzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJCWludCBsZW5ndGggPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJaW50IGxpbmVObyA9IGdldExpbmVOdW1iZXIoc3RhcnQpOwotCi0JCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgbWVzc2FnZVRleHQpOwotCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0KLQkJCQlNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgTWFya3VwUXVpY2tBc3Npc3RQcm9jZXNzb3IoKTsKLQkJCQlwcm9jZXNzb3Iuc2V0UHJvYmxlbUlkKFByb2JsZW1JRHNYTUwuRW1wdHlUYWcpOwotCQkJCW1lc3NhZ2Uuc2V0QXR0cmlidXRlKFFVSUNLQVNTSVNUUFJPQ0VTU09SLCBwcm9jZXNzb3IpOwotCi0JCQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IG5ldyBBbm5vdGF0aW9uSW5mbyhtZXNzYWdlKTsKLQkJCQkoKEluY3JlbWVudGFsUmVwb3J0ZXIpIHJlcG9ydGVyKS5hZGRBbm5vdGF0aW9uSW5mbyh0aGlzLCBpbmZvKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGdldExpbmVOdW1iZXIoaW50IHN0YXJ0KSB7Ci0JCWludCBsaW5lTm8gPSAtMTsKLQkJdHJ5IHsKLQkJCWxpbmVObyA9IGdldERvY3VtZW50KCkuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gbGluZU5vOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0ZvckF0dHJpYnV0ZVZhbHVlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBjaGVjayBmb3IgYXR0cmlidXRlcyB3aXRob3V0IGEgdmFsdWUKLQkJLy8gdHJhY2sgdGhlIGF0dHJpYnV0ZS9lcXVhbHMvdmFsdWUgc2VxdWVuY2UgdXNpbmcgYSBzdGF0ZSBvZiAwLCAxICwyCi0JCS8vIHJlcHJlc2VudGluZyB0aGUgbmFtZSwgPSwgYW5kIHZhbHVlLCByZXNwZWN0aXZlbHkKLQkJaW50IGF0dHJTdGF0ZSA9IDA7Ci0JCUlUZXh0UmVnaW9uTGlzdCB0ZXh0UmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCS8vIFJlY29uY2lsZUFubm90YXRpb25LZXkga2V5ID0gY3JlYXRlS2V5KHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwKLQkJLy8gZ2V0U2NvcGUoKSk7Ci0KLQkJaW50IGVycm9yQ291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgKGkgPCB0ZXh0UmVnaW9ucy5zaXplKCkpICYmIChlcnJvckNvdW50IDwgQWJzdHJhY3RTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kuRUxFTUVOVF9FUlJPUl9MSU1JVCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gdGV4dFJlZ2lvbiA9IHRleHRSZWdpb25zLmdldChpKTsKLQkJCWlmICgodGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB8fCBpc1RhZ0Nsb3NlVGV4dFJlZ2lvbih0ZXh0UmVnaW9uKSkgewotCQkJCS8vIGRhbmdsaW5nIG5hbWUgYW5kICc9JwotCQkJCWlmICgoYXR0clN0YXRlID09IDIpICYmIChpID49IDIpKSB7Ci0JCQkJCS8vIGNyZWF0ZSBhbm5vdGF0aW9uCi0JCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoaSAtIDIpOwotCQkJCQlpZiAoIShuYW1lUmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpKSB7Ci0JCQkJCQlPYmplY3RbXSBhcmdzID0ge3N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KG5hbWVSZWdpb24pfTsKLQkJCQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuQXR0cmlidXRlX19pc19taXNzaW5nX2FfdmFsdWUsIGFyZ3MpOwotCi0JCQkJCQlpbnQgc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZVJlZ2lvbik7Ci0JCQkJCQlpbnQgZW5kID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQkJCQkJaW50IGxpbmVObyA9IGdldExpbmVOdW1iZXIoc3RhcnQpOwotCQkJCQkJaW50IHRleHRMZW5ndGggPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChuYW1lUmVnaW9uKS50cmltKCkubGVuZ3RoKCk7Ci0KLQkJCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIG1lc3NhZ2VUZXh0KTsKLQkJCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKHRleHRMZW5ndGgpOwotCQkJCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vKTsKLQotCQkJCQkJLy8gcXVpY2sgZml4IGluZm8KLQkJCQkJCUlUZXh0UmVnaW9uIGVxdWFsc1JlZ2lvbiA9IHRleHRSZWdpb25zLmdldChpIC0gMiArIDEpOwotCQkJCQkJaW50IGluc2VydE9mZnNldCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KGVxdWFsc1JlZ2lvbikgLSBlbmQ7Ci0JCQkJCQlPYmplY3RbXSBhZGRpdGlvbmFsRml4SW5mbyA9IHtzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChuYW1lUmVnaW9uKSwgbmV3IEludGVnZXIoaW5zZXJ0T2Zmc2V0KX07Ci0KLQkJCQkJCU1hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvcigpOwotCQkJCQkJcHJvY2Vzc29yLnNldFByb2JsZW1JZChQcm9ibGVtSURzWE1MLk1pc3NpbmdBdHRyVmFsdWUpOwotCQkJCQkJcHJvY2Vzc29yLnNldEFkZGl0aW9uYWxGaXhJbmZvKGFkZGl0aW9uYWxGaXhJbmZvKTsKLQkJCQkJCW1lc3NhZ2Uuc2V0QXR0cmlidXRlKFFVSUNLQVNTSVNUUFJPQ0VTU09SLCBwcm9jZXNzb3IpOwotCi0JCQkJCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEFubm90YXRpb25JbmZvKG1lc3NhZ2UpOwotCi0JCQkJCQkoKEluY3JlbWVudGFsUmVwb3J0ZXIpIHJlcG9ydGVyKS5hZGRBbm5vdGF0aW9uSW5mbyh0aGlzLCBpbmZvKTsKLQotCQkJCQkJLy8gYW5ub3RhdGlvbi5zZXRBZGRpdGlvbmFsRml4SW5mbyhhZGRpdGlvbmFsRml4SW5mbyk7Ci0JCQkJCQkvLyByZXN1bHRzLmFkZChhbm5vdGF0aW9uKTsKLQkJCQkJCWVycm9yQ291bnQrKzsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBuYW1lIGJ1dCBubyAnPScgKFhNTCBvbmx5KQotCQkJCWVsc2UgaWYgKChhdHRyU3RhdGUgPT0gMSkgJiYgKGkgPj0gMSkpIHsKLQkJCQkJLy8gY3JlYXRlIGFubm90YXRpb24KLQkJCQkJSVRleHRSZWdpb24gcHJldmlvdXNSZWdpb24gPSB0ZXh0UmVnaW9ucy5nZXQoaSAtIDEpOwotCQkJCQlpZiAoIShwcmV2aW91c1JlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSkgewotCQkJCQkJT2JqZWN0W10gYXJncyA9IHtzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChwcmV2aW91c1JlZ2lvbil9OwotCQkJCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfX2hhc19ub192YWx1ZSwgYXJncyk7Ci0JCQkJCQlpbnQgc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocHJldmlvdXNSZWdpb24pOwotCQkJCQkJaW50IHRleHRMZW5ndGggPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChwcmV2aW91c1JlZ2lvbikudHJpbSgpLmxlbmd0aCgpOwotCQkJCQkJaW50IGxpbmVObyA9IGdldExpbmVOdW1iZXIoc3RhcnQpOwotCi0JCQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBtZXNzYWdlVGV4dCk7Ci0JCQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJCQltZXNzYWdlLnNldExlbmd0aCh0ZXh0TGVuZ3RoKTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0KLQkJCQkJCU1hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvcigpOwotCQkJCQkJcHJvY2Vzc29yLnNldFByb2JsZW1JZChQcm9ibGVtSURzWE1MLk5vQXR0clZhbHVlKTsKLQkJCQkJCXByb2Nlc3Nvci5zZXRBZGRpdGlvbmFsRml4SW5mbyhzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChwcmV2aW91c1JlZ2lvbikpOwotCQkJCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoUVVJQ0tBU1NJU1RQUk9DRVNTT1IsIHByb2Nlc3Nvcik7Ci0KLQkJCQkJCUFubm90YXRpb25JbmZvIGluZm8gPSBuZXcgQW5ub3RhdGlvbkluZm8obWVzc2FnZSk7Ci0KLQkJCQkJCSgoSW5jcmVtZW50YWxSZXBvcnRlcikgcmVwb3J0ZXIpLmFkZEFubm90YXRpb25JbmZvKHRoaXMsIGluZm8pOwotCi0JCQkJCQllcnJvckNvdW50Kys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYXR0clN0YXRlID0gMTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJYXR0clN0YXRlID0gMjsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQlhdHRyU3RhdGUgPSAwOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tGb3JTcGFjZUJlZm9yZU5hbWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotCi0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBzZFJlZ2lvblRleHQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RnVsbFRleHQoKTsKLQkJaWYgKHNkUmVnaW9uVGV4dC5zdGFydHNXaXRoKCIgIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFByZXZpb3VzKCk7Ci0JCQlpZiAocHJldiAhPSBudWxsKSB7Ci0JCQkJLy8gdGhpcyBpcyBwb3NzaWJseSB0aGUgY2FzZSBvZiAiPCB0YWciCi0JCQkJaWYgKChwcmV2LmdldFJlZ2lvbnMoKS5zaXplKCkgPT0gMSkgJiYgaXNTdGFydFRhZyhwcmV2KSkgewotCQkJCQkvLyBhZGQgdGhlIGVycm9yIGZvciBwcmVjZWRpbmcgc3BhY2UgaW4gdGFnIG5hbWUKLQkJCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gWE1MVUlNZXNzYWdlcy5SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzI7Ci0JCQkJCWludCBzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkvLyBmaW5kIGxlbmd0aCBvZiB3aGl0ZXNwYWNlCi0JCQkJCWludCBsZW5ndGggPSBzZFJlZ2lvblRleHQudHJpbSgpLmVxdWFscygiIikgPyBzZFJlZ2lvblRleHQubGVuZ3RoKCkgOiBzZFJlZ2lvblRleHQuaW5kZXhPZihzZFJlZ2lvblRleHQudHJpbSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIG1lc3NhZ2VUZXh0KTsKLQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCQkJCQltZXNzYWdlLnNldExpbmVObyhnZXRMaW5lTnVtYmVyKHN0YXJ0KSk7Ci0KLQkJCQkJTWFya3VwUXVpY2tBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IE1hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yKCk7Ci0JCQkJCXByb2Nlc3Nvci5zZXRQcm9ibGVtSWQoUHJvYmxlbUlEc1hNTC5TcGFjZXNCZWZvcmVUYWdOYW1lKTsKLQkJCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoUVVJQ0tBU1NJU1RQUk9DRVNTT1IsIHByb2Nlc3Nvcik7Ci0KLQkJCQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IG5ldyBBbm5vdGF0aW9uSW5mbyhtZXNzYWdlKTsKLQkJCQkJKChJbmNyZW1lbnRhbFJlcG9ydGVyKSByZXBvcnRlcikuYWRkQW5ub3RhdGlvbkluZm8odGhpcywgaW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTm9OYW1lc3BhY2VJblBJKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBuYXZpZ2F0ZSB0byBuYW1lCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCWludCBlcnJvckNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IChpIDwgcmVnaW9ucy5zaXplKCkpICYmIChlcnJvckNvdW50IDwgQWJzdHJhY3RTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kuRUxFTUVOVF9FUlJPUl9MSU1JVCkgJiYgIXN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKTsgaSsrKSB7Ci0JCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQlTdHJpbmcgcGlUZXh0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQocik7Ci0JCQkJaW50IGluZGV4ID0gcGlUZXh0LmluZGV4T2YoIjoiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBYTUxVSU1lc3NhZ2VzLlJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfNDsKLQkJCQkJaW50IHN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHIpICsgaW5kZXg7Ci0JCQkJCWludCBsZW5ndGggPSBwaVRleHQudHJpbSgpLmxlbmd0aCgpIC0gaW5kZXg7Ci0KLQkJCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgbWVzc2FnZVRleHQpOwotCQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGdldExpbmVOdW1iZXIoc3RhcnQpKTsKLQotCQkJCQlNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgTWFya3VwUXVpY2tBc3Npc3RQcm9jZXNzb3IoKTsKLQkJCQkJcHJvY2Vzc29yLnNldFByb2JsZW1JZChQcm9ibGVtSURzWE1MLk5hbWVzcGFjZUluUEkpOwotCQkJCQltZXNzYWdlLnNldEF0dHJpYnV0ZShRVUlDS0FTU0lTVFBST0NFU1NPUiwgcHJvY2Vzc29yKTsKLQotCQkJCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEFubm90YXRpb25JbmZvKG1lc3NhZ2UpOwotCQkJCQkoKEluY3JlbWVudGFsUmVwb3J0ZXIpIHJlcG9ydGVyKS5hZGRBbm5vdGF0aW9uSW5mbyh0aGlzLCBpbmZvKTsKLQotCQkJCQllcnJvckNvdW50Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrUXVvdGVzRm9yQXR0cmlidXRlVmFsdWVzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJU3RyaW5nIGF0dHJWYWx1ZVRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgZXJyb3JDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyAoaSA8IHJlZ2lvbnMuc2l6ZSgpKSAmJiAoZXJyb3JDb3VudCA8IEFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5LkVMRU1FTlRfRVJST1JfTElNSVQpOyBpKyspIHsKLQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWF0dHJWYWx1ZVRleHQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChyKTsKLQkJCS8vIGF0dHJpYnV0ZSB2YWx1ZSBpbmNsdWRlcyBxdW90ZXMgaW4gdGhlIHN0cmluZwotCQkJLy8gc3BsaXQgdXAgYXR0cmlidXRlIHZhbHVlIG9uIHF1b3RlcwotCQkJLyoKLQkJCSAqIFdPUktBUk9VTkQgdGlsbAotCQkJICogaHR0cDovL2Rldi5pY3UtcHJvamVjdC5vcmcvY2dpLWJpbi9pY3UtYnVncy9pbmNvbWluZz9maW5kaWQ9NTIwNwotCQkJICogaXMgZml4ZWQuIChBbHNvIHNlZSBCVUcxNDM2MjgpCi0JCQkgKi8KLQotCQkJamF2YS51dGlsLlN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyKGF0dHJWYWx1ZVRleHQsICJcIiciLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotCQkJLy8gZ2V0IHRoZSBwaWVjZXMgb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZQotCQkJU3RyaW5nIG9uZSA9ICIiLCB0d28gPSAiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpZiAoc2l6ZSA+IDApIHsKLQkJCQlvbmUgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCX0KLQkJCWlmIChzaXplID4gMSkgewotCQkJCXR3byA9IHN0Lm5leHRUb2tlbigpOwotCQkJfQotCQkJaWYgKHNpemUgPiAyKSB7Ci0JCQkJLy8gc2hvdWxkIGJlIGhhbmRsZWQgYnkgcGFyc2luZy4uLgotCQkJCS8vIGFzIGluIHdlIGNhbid0IGhhdmUgYW4gYXR0cmlidXRlIHZhbHVlIGxpa2U6IDxlbGVtZW50Ci0JCQkJLy8gYXR0cj0iYSJiImMiLz4KLQkJCQkvLyBhbmQgPGVsZW1lbnQgYXR0cj0nYSJiImMnIC8+IGlzIGxlZ2FsCi0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQotCQkJaWYgKHNpemUgPT0gMSkgewotCQkJCWlmIChvbmUuZXF1YWxzKERRVU9URSkgfHwgb25lLmVxdWFscyhTUVVPVEUpKSB7Ci0JCQkJCS8vIG1pc3NpbmcgY2xvc2luZyBxdW90ZQotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IFhNTFVJTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF8wOwotCQkJCQlhZGRBdHRyaWJ1dGVFcnJvcihtZXNzYWdlLCBhdHRyVmFsdWVUZXh0LCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQociksIGF0dHJWYWx1ZVRleHQudHJpbSgpLmxlbmd0aCgpLCBQcm9ibGVtSURzWE1MLlVuY2xhc3NpZmllZCwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCQkJCWVycm9yQ291bnQrKzsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG1pc3NpbmcgYm90aAotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IFhNTFVJTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF8xOwotCQkJCQlhZGRBdHRyaWJ1dGVFcnJvcihtZXNzYWdlLCBhdHRyVmFsdWVUZXh0LCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQociksIGF0dHJWYWx1ZVRleHQudHJpbSgpLmxlbmd0aCgpLCBQcm9ibGVtSURzWE1MLkF0dHJWYWx1ZU5vdFF1b3RlZCwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCQkJCWVycm9yQ291bnQrKzsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChzaXplID09IDIpIHsKLQkJCQlpZiAoKG9uZS5lcXVhbHMoU1FVT1RFKSAmJiAhdHdvLmVxdWFscyhTUVVPVEUpKSB8fCAob25lLmVxdWFscyhEUVVPVEUpICYmICF0d28uZXF1YWxzKERRVU9URSkpKSB7Ci0JCQkJCS8vIG1pc3NpbmcgY2xvc2luZyBxdW90ZQotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IFhNTFVJTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF8wOwotCQkJCQlhZGRBdHRyaWJ1dGVFcnJvcihtZXNzYWdlLCBhdHRyVmFsdWVUZXh0LCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQociksIGF0dHJWYWx1ZVRleHQudHJpbSgpLmxlbmd0aCgpLCBQcm9ibGVtSURzWE1MLlVuY2xhc3NpZmllZCwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCQkJCWVycm9yQ291bnQrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZW5kIG9mIHJlZ2lvbiBmb3IgbG9vcAotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1N0YXJ0RW5kVGFnUGFpcnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0KLQkJaWYgKHNkUmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBjaGVjayBzdGFydC9lbmQgdGFnIHBhaXJzCi0JCUlET01Ob2RlIHhtbE5vZGUgPSBnZXRYTUxOb2RlKHNkUmVnaW9uKTsKLQotCQlpZiAoeG1sTm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlib29sZWFuIHNlbGZDbG9zZWQgPSBmYWxzZTsKLQkJU3RyaW5nIHRhZ05hbWUgPSBudWxsOwotCQlpbnQgbGVuZ3RoID0gMDsKLQotCQlpZiAoeG1sTm9kZS5pc0NvbnRhaW5lcigpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFJlZ2lvbiA9IHhtbE5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZW5kUmVnaW9uID09IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0UmVnaW9uID0geG1sTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmICghc3RhcnRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCQkJLy8gYW5hbHl6ZSB0aGUgdGFnIChjaGVjayBzZWxmIGNsb3NpbmcpCi0JCQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc3RhcnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCQlpZiAoKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB8fCAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSkgewotCQkJCQkJCWxlbmd0aCsrOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQkJCQl0YWdOYW1lID0gc2RSZWdpb24uZ2V0VGV4dChyKTsKLQkJCQkJCQlsZW5ndGggKz0gdGFnTmFtZS5sZW5ndGgoKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCQkJCQkJCXNlbGZDbG9zZWQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKCFzZWxmQ2xvc2VkICYmICh0YWdOYW1lICE9IG51bGwpKSB7Ci0JCQkJCQlPYmplY3RbXSBhcmdzID0ge3RhZ05hbWV9OwotCQkJCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5NaXNzaW5nX2VuZF90YWdfLCBhcmdzKTsKLQotCQkJCQkJaW50IHN0YXJ0ID0gc2RSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJCWludCBsaW5lTnVtYmVyID0gZ2V0TGluZU51bWJlcihzdGFydCk7Ci0KLQkJCQkJCS8vIFNFVkVSSVRZX1NUUlVDVFVSRSA9PSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZCi0JCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgbWVzc2FnZVRleHQpOwotCQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVOdW1iZXIpOwotCi0JCQkJCQlpZiAocmVwb3J0ZXIgaW5zdGFuY2VvZiBJbmNyZW1lbnRhbFJlcG9ydGVyKSB7Ci0KLQkJCQkJCQlPYmplY3RbXSBhZGRpdGlvbmFsRml4SW5mbyA9IGdldFN0YXJ0RW5kRml4SW5mbyh4bWxOb2RlLCB0YWdOYW1lLCByKTsKLQotCQkJCQkJCU1hcmt1cFF1aWNrQXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvcigpOwotCQkJCQkJCXByb2Nlc3Nvci5zZXRQcm9ibGVtSWQoUHJvYmxlbUlEc1hNTC5NaXNzaW5nRW5kVGFnKTsKLQkJCQkJCQlwcm9jZXNzb3Iuc2V0QWRkaXRpb25hbEZpeEluZm8oYWRkaXRpb25hbEZpeEluZm8pOwotCQkJCQkJCW1lc3NhZ2Uuc2V0QXR0cmlidXRlKFFVSUNLQVNTSVNUUFJPQ0VTU09SLCBwcm9jZXNzb3IpOwotCi0JCQkJCQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IG5ldyBBbm5vdGF0aW9uSW5mbyhtZXNzYWdlKTsKLQotCQkJCQkJCSgoSW5jcmVtZW50YWxSZXBvcnRlcikgcmVwb3J0ZXIpLmFkZEFubm90YXRpb25JbmZvKHRoaXMsIGluZm8pOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBnZXRTdGFydEVuZEZpeEluZm8oSURPTU5vZGUgeG1sTm9kZSwgU3RyaW5nIHRhZ05hbWUsIElUZXh0UmVnaW9uIHIpIHsKLQkJLy8gcXVpY2sgZml4IGluZm8KLQkJU3RyaW5nIHRhZ0Nsb3NlID0gIi8+IjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgdGFnQ2xvc2VPZmZzZXQgPSB4bWxOb2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmICgociAhPSBudWxsKSAmJiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSkgewotCQkJdGFnQ2xvc2UgPSAiLyI7IC8vJE5PTi1OTFMtMSQKLQkJCXRhZ0Nsb3NlT2Zmc2V0LS07Ci0JCX0KLQkJSURPTU5vZGUgZmlyc3RDaGlsZCA9IChJRE9NTm9kZSkgeG1sTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlICgoZmlyc3RDaGlsZCAhPSBudWxsKSAmJiAoZmlyc3RDaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSkgewotCQkJZmlyc3RDaGlsZCA9IChJRE9NTm9kZSkgZmlyc3RDaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCWludCBlbmRPZmZzZXQgPSB4bWxOb2RlLmdldEVuZE9mZnNldCgpOwotCQlpbnQgZmlyc3RDaGlsZFN0YXJ0T2Zmc2V0ID0gZmlyc3RDaGlsZCA9PSBudWxsID8gZW5kT2Zmc2V0IDogZmlyc3RDaGlsZC5nZXRTdGFydE9mZnNldCgpOwotCQlPYmplY3RbXSBhZGRpdGlvbmFsRml4SW5mbyA9IHt0YWdOYW1lLCB0YWdDbG9zZSwgbmV3IEludGVnZXIodGFnQ2xvc2VPZmZzZXQpLCBuZXcgSW50ZWdlcih4bWxOb2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCkpLCAvLyBzdGFydFRhZ0VuZE9mZnNldAotCQkJCQluZXcgSW50ZWdlcihmaXJzdENoaWxkU3RhcnRPZmZzZXQpLCAvLyBmaXJzdENoaWxkU3RhcnRPZmZzZXQKLQkJCQkJbmV3IEludGVnZXIoZW5kT2Zmc2V0KX07IC8vIGVuZE9mZnNldAotCQlyZXR1cm4gYWRkaXRpb25hbEZpeEluZm87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrU3RhcnRpbmdTcGFjZUZvclBJKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXYgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJaWYgKChwcmV2ICE9IG51bGwpICYmIHByZXYuZ2V0U3RhcnRPZmZzZXQoKSA9PSAwKSB7Ci0JCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgewotCQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IFhNTFVJTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF81OwotCQkJCWludCBzdGFydCA9IHByZXYuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgbGVuZ3RoID0gcHJldi5nZXRMZW5ndGgoKTsKLQotCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIG1lc3NhZ2VUZXh0KTsKLQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJCQltZXNzYWdlLnNldExpbmVObyhnZXRMaW5lTnVtYmVyKHN0YXJ0KSk7Ci0KLQkJCQlNYXJrdXBRdWlja0Fzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgTWFya3VwUXVpY2tBc3Npc3RQcm9jZXNzb3IoKTsKLQkJCQlwcm9jZXNzb3Iuc2V0UHJvYmxlbUlkKFByb2JsZW1JRHNYTUwuU3BhY2VzQmVmb3JlUEkpOwotCQkJCW1lc3NhZ2Uuc2V0QXR0cmlidXRlKFFVSUNLQVNTSVNUUFJPQ0VTU09SLCBwcm9jZXNzb3IpOwotCi0JCQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IG5ldyBBbm5vdGF0aW9uSW5mbyhtZXNzYWdlKTsKLQkJCQkoKEluY3JlbWVudGFsUmVwb3J0ZXIpIHJlcG9ydGVyKS5hZGRBbm5vdGF0aW9uSW5mbyh0aGlzLCBpbmZvKTsKLQotCQkJCS8vIFBvc2l0aW9uIHAgPSBuZXcgUG9zaXRpb24oc3RhcnQsIGxlbmd0aCk7Ci0JCQkJLy8JCQkJCi0JCQkJLy8gUmVjb25jaWxlQW5ub3RhdGlvbktleSBrZXkgPQotCQkJCS8vIGNyZWF0ZUtleShzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGdldFNjb3BlKCkpOwotCQkJCS8vIFRlbXBvcmFyeUFubm90YXRpb24gYW5ub3RhdGlvbiA9IG5ldyBUZW1wb3JhcnlBbm5vdGF0aW9uKHAsCi0JCQkJLy8gU0VWRVJJVFlfU1lOVEFYX0VSUk9SLCBtZXNzYWdlLCBrZXksCi0JCQkJLy8gUHJvYmxlbUlEc1hNTC5TcGFjZXNCZWZvcmVQSSk7Ci0JCQkJLy8gcmVzdWx0cy5hZGQoYW5ub3RhdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNjb3BlKCkgewotCQlyZXR1cm4gUmVjb25jaWxlQW5ub3RhdGlvbktleS5QQVJUSUFMOwotCX0KLQotCXByaXZhdGUgSURPTU5vZGUgZ2V0WE1MTm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0KLQkJaWYgKHNkUmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCB4TW9kZWwgPSBudWxsOwotCQlJRE9NTm9kZSB4bWxOb2RlID0gbnVsbDsKLQkJLy8gZ2V0L3JlbGVhc2UgbW9kZWxzIHNob3VsZCBhbHdheXMgYmUgaW4gYSB0cnkvZmluYWxseSBibG9jawotCQl0cnkgewotCQkJeE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLQkJCS8vIHhNb2RlbCBpcyBzb21ldGltZSBudWxsLCB3aGVuIGNsb3NpbmcgZWRpdG9yLCBmb3IgZXhhbXBsZQotCQkJaWYgKHhNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeG1sTm9kZSA9IChJRE9NTm9kZSkgeE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc2RSZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoeE1vZGVsICE9IG51bGwpIHsKLQkJCQl4TW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHhtbE5vZGU7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIGEgWE1MICJlbmQgdGFnIgotCSAqIHNpbmNlIHRoZXkncmUgbm90IGFsbG93ZWQgdG8gaGF2ZSBhdHRyaWJ1dGUgSVRleHRSZWdpb25zCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0VuZFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAoKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB8fCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTjsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHRoZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIGFuIFhNTCBQcm9jZXNzaW5nCi0JICogSW5zdHJ1Y3Rpb24KLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUEkoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgfHwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyBhIFhNTCAic3RhcnQgdGFnIgotCSAqIHNpbmNlIHRoZXkgbmVlZCB0byBiZSBjaGVja2VkIGZvciBwcm9wZXIgWE1MIGF0dHJpYnV0ZSByZWdpb24gc2VxdWVuY2VzCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1N0YXJ0VGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmICgoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHx8IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU47Ci0JfQotCi0JLy8gQmVjYXVzZSB3ZSBjaGVjayB0aGUgInByb3BlciIgY2xvc2luZyBzZXBhcmF0ZWx5IGZyb20gYXR0cmlidXRlCi0JLy8gc2VxdWVuY2luZywgd2UgbmVlZCB0byBrbm93IHdoYXQncwotCS8vIGFuIGFwcHJvcHJpYXRlIGNsb3NlLgotCXByaXZhdGUgYm9vbGVhbiBpc1RhZ0Nsb3NlVGV4dFJlZ2lvbihJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uKSB7Ci0JCXJldHVybiAodGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB8fCAodGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHRoZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIFhNTCBDb250ZW50Ci0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1hNTENvbnRlbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgfHwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jKSB7Ci0JCWZEb2N1bWVudCA9IGRvYzsKLQl9Ci0KLQlwcml2YXRlIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlzZXREb2N1bWVudChkb2N1bWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc2V0RG9jdW1lbnQobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVJlZ2lvbiBkaXJ0eVJlZ2lvbiwgSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWlmIChnZXREb2N1bWVudCgpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIShyZXBvcnRlciBpbnN0YW5jZW9mIEluY3JlbWVudGFsUmVwb3J0ZXIpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCEoZ2V0RG9jdW1lbnQoKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyByZW1vdmUgb2xkIG1lc3NhZ2VzCi0JCXJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHRoaXMpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSByZWdpb25zID0gKChJU3RydWN0dXJlZERvY3VtZW50KSBmRG9jdW1lbnQpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoZGlydHlSZWdpb24uZ2V0T2Zmc2V0KCksIGRpcnR5UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQl2YWxpZGF0ZShyZWdpb25zW2ldLCByZXBvcnRlcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0KLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoaXNTdGFydFRhZyhzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQkvLyBjaGVjayBmb3IgYXR0cmlidXRlcyB3aXRob3V0IGEgdmFsdWUKLQkJCWNoZWNrRm9yQXR0cmlidXRlVmFsdWUoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCQkvLyBjaGVjayBpZiBzdGFydGVkIHRhZyBpcyBlbmRlZAotCQkJY2hlY2tTdGFydEVuZFRhZ1BhaXJzKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJLy8gY2hlY2sgZW1wdHkgdGFnIDw+Ci0JCQljaGVja0VtcHR5VGFnKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJLy8gY2hlY2sgdGhhdCBlYWNoIGF0dHJpYnV0ZSBoYXMgcXVvdGVzCi0JCQljaGVja1F1b3Rlc0ZvckF0dHJpYnV0ZVZhbHVlcyhzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJCS8vIGNoZWNrIHRoYXQgdGhlIGNsb3NpbmcgJz4nIGlzIHRoZXJlCi0JCQljaGVja0Nsb3NpbmdCcmFja2V0KHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQl9Ci0JCWVsc2UgaWYgKGlzRW5kVGFnKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpIHsKLQkJCWNoZWNrQXR0cmlidXRlc0luRW5kVGFnKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJLy8gY2hlY2sgdGhhdCB0aGUgY2xvc2luZyAnPicgaXMgdGhlcmUKLQkJCWNoZWNrQ2xvc2luZ0JyYWNrZXQoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCX0KLQkJZWxzZSBpZiAoaXNQSShzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQkvLyBjaGVjayB2YWxpZGl0eSBvZiBwcm9jZXNzaW5nIGluc3RydWN0aW9uCi0JCQljaGVja1N0YXJ0aW5nU3BhY2VGb3JQSShzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJCWNoZWNrTm9OYW1lc3BhY2VJblBJKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQl9Ci0JCWVsc2UgaWYgKGlzWE1MQ29udGVudChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQljaGVja0ZvclNwYWNlQmVmb3JlTmFtZShzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvdmlld3MvY29udGVudG91dGxpbmUvWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvdmlld3MvY29udGVudG91dGxpbmUvWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNTlhZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL1hNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkxvY2FsU2VsZWN0aW9uVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5UcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNTmFtZWROb2RlTWFwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5YTUxOb2RlQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRuZC5EcmFnTm9kZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIE91dGxpbmUgQ29uZmlndXJhdGlvbiBmb3IgZ2VuZXJpYyBYTUwgc3VwcG9ydCwgZXhwZWN0cyB0aGF0IHRoZSB2aWV3ZXIncwotICogaW5wdXQgd2lsbCBiZSB0aGUgRE9NIE1vZGVsLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gewotCXByaXZhdGUgY2xhc3MgQWN0aW9uTWFuYWdlck1lbnVMaXN0ZW5lciBpbXBsZW1lbnRzIElNZW51TGlzdGVuZXIsIElSZWxlYXNhYmxlIHsKLQkJcHJpdmF0ZSBYTUxOb2RlQWN0aW9uTWFuYWdlciBmQWN0aW9uTWFuYWdlcjsKLQkJcHJpdmF0ZSBUcmVlVmlld2VyIGZUcmVlVmlld2VyOwotCi0JCXB1YmxpYyBBY3Rpb25NYW5hZ2VyTWVudUxpc3RlbmVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCQlmVHJlZVZpZXdlciA9IHZpZXdlcjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXIjbWVudUFib3V0VG9TaG93KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCWlmIChmQWN0aW9uTWFuYWdlciA9PSBudWxsKSB7Ci0JCQkJZkFjdGlvbk1hbmFnZXIgPSBjcmVhdGVOb2RlQWN0aW9uTWFuYWdlcihmVHJlZVZpZXdlcik7Ci0JCQl9Ci0JCQlmQWN0aW9uTWFuYWdlci5maWxsQ29udGV4dE1lbnUobWFuYWdlciwgZlRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklSZWxlYXNhYmxlI3JlbGVhc2UoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJCWZUcmVlVmlld2VyID0gbnVsbDsKLQkJCWlmIChmQWN0aW9uTWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJZkFjdGlvbk1hbmFnZXIuc2V0TW9kZWwobnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEF0dHJpYnV0ZVNob3dpbmdMYWJlbFByb3ZpZGVyIGV4dGVuZHMgSkZhY2VOb2RlTGFiZWxQcm92aWRlciB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG8pIHsKLQkJCVN0cmluZ0J1ZmZlciB0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci5nZXRUZXh0KG8pKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvOwotCQkJCWlmICgobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSAmJiBmU2hvd0F0dHJpYnV0ZXMpIHsKLQkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg4NDQ0Ci0JCQkJCWlmIChub2RlLmhhc0F0dHJpYnV0ZXMoKSkgewotCQkJCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQkJCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJTm9kZSBpZFR5cGVkQXR0cmlidXRlID0gbnVsbDsKLQkJCQkJCU5vZGUgcmVxdWlyZWRBdHRyaWJ1dGUgPSBudWxsOwotCQkJCQkJYm9vbGVhbiBoYXNJZCA9IGZhbHNlOwotCQkJCQkJYm9vbGVhbiBoYXNOYW1lID0gZmFsc2U7Ci0JCQkJCQlOb2RlIHNob3duQXR0cmlidXRlID0gbnVsbDsKLQotCQkJCQkJLy8gdHJ5IHRvIGdldCBjb250ZW50IG1vZGVsIGVsZW1lbnQKLQkJCQkJCS8vIGRlY2xhcmF0aW9uCi0JCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IG51bGw7Ci0JCQkJCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQkJCQlpZiAobXEgIT0gbnVsbCkgewotCQkJCQkJCWVsZW1lbnREZWNsID0gbXEuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBmaW5kIGFuIGF0dHJpYnV0ZSBvZiB0eXBlIChvciBqdXN0IG5hbWVkKQotCQkJCQkJLy8gSUQKLQkJCQkJCWlmIChlbGVtZW50RGVjbCAhPSBudWxsKSB7Ci0JCQkJCQkJaW50IGkgPSAwOwotCQkJCQkJCXdoaWxlICgoaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCkpICYmIChpZFR5cGVkQXR0cmlidXRlID09IG51bGwpKSB7Ci0JCQkJCQkJCU5vZGUgYXR0ciA9IGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCQkJCQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ci5nZXROb2RlTmFtZSgpOwotCQkJCQkJCQlDTU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVEZWNsYXJhdGlvbk1hcCA9IGVsZW1lbnREZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJCQkJCi0JCQkJCQkJCUNNTmFtZWROb2RlTWFwSW1wbCBhbGxBdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbChhdHRyaWJ1dGVEZWNsYXJhdGlvbk1hcCk7Ci0JCQkJCQkJCUxpc3Qgbm9kZXMgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBdmFpbGFibGVDb250ZW50KGVsZW1lbnQsIGVsZW1lbnREZWNsLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0JCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgbm9kZXMuc2l6ZSgpOyBrKyspIHsKLQkJCQkJCQkJCUNNTm9kZSBjbW5vZGUgPSAoQ01Ob2RlKSBub2Rlcy5nZXQoayk7Ci0JCQkJCQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCQkJCQkJCWFsbEF0dHJpYnV0ZXMucHV0KGNtbm9kZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJYXR0cmlidXRlRGVjbGFyYXRpb25NYXAgPSBhbGxBdHRyaWJ1dGVzOwotCi0JCQkJCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlRGVjbGFyYXRpb25NYXAuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJCQkJCQkJaWYgKGF0dHJEZWNsICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmICgoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKSAhPSBudWxsKSAmJiAoQ01EYXRhVHlwZS5JRC5lcXVhbHMoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKS5nZXREYXRhVHlwZU5hbWUoKSkpKSB7Ci0JCQkJCQkJCQkJaWRUeXBlZEF0dHJpYnV0ZSA9IGF0dHI7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmICgoYXR0ckRlY2wuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKSAmJiAocmVxdWlyZWRBdHRyaWJ1dGUgPT0gbnVsbCkpIHsKLQkJCQkJCQkJCQkvLyBhcyBhIGJhY2t1cCwga2VlcCB0YWJzIG9uCi0JCQkJCQkJCQkJLy8gYW55IHJlcXVpcmVkCi0JCQkJCQkJCQkJLy8gYXR0cmlidXRlcwotCQkJCQkJCQkJCXJlcXVpcmVkQXR0cmlidXRlID0gYXR0cjsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCWhhc0lkID0gaGFzSWQgfHwgYXR0ck5hbWUuZXF1YWxzKCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJaGFzTmFtZSA9IGhhc05hbWUgfHwgYXR0ck5hbWUuZXF1YWxzKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQkrK2k7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQkvKgotCQkJCQkJICogSWYgbm8gc3VpdGFibGUgYXR0cmlidXRlIHdhcyBmb3VuZCwgdHJ5IHVzaW5nIGEKLQkJCQkJCSAqIHJlcXVpcmVkIGF0dHJpYnV0ZSwgaWYgbm9uZSwgdGhlbiBwcmVmZXIgImlkIiBvcgotCQkJCQkJICogIm5hbWUiLCBvdGhlcndpc2UganVzdCB1c2UgZmlyc3QgYXR0cmlidXRlCi0JCQkJCQkgKi8KLQkJCQkJCWlmIChpZFR5cGVkQXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQkJCQlzaG93bkF0dHJpYnV0ZSA9IGlkVHlwZWRBdHRyaWJ1dGU7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChyZXF1aXJlZEF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJCQkJc2hvd25BdHRyaWJ1dGUgPSByZXF1aXJlZEF0dHJpYnV0ZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGhhc0lkKSB7Ci0JCQkJCQkJc2hvd25BdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoaGFzTmFtZSkgewotCQkJCQkJCXNob3duQXR0cmlidXRlID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJaWYgKHNob3duQXR0cmlidXRlID09IG51bGwpIHsKLQkJCQkJCQlzaG93bkF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuaXRlbSgwKTsKLQkJCQkJCX0KLQotCQkJCQkJLy8gZGlzcGxheSB0aGUgYXR0cmlidXRlIGFuZCB2YWx1ZSAod2l0aG91dCBxdW90ZXMpCi0JCQkJCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IHNob3duQXR0cmlidXRlLmdldE5vZGVOYW1lKCk7Ci0JCQkJCQlpZiAoKGF0dHJpYnV0ZU5hbWUgIT0gbnVsbCkgJiYgKGF0dHJpYnV0ZU5hbWUubGVuZ3RoKCkgPiAwKSkgewotCQkJCQkJCXRleHQuYXBwZW5kKCIgIiArIGF0dHJpYnV0ZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gc2hvd25BdHRyaWJ1dGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQkJaWYgKChhdHRyaWJ1dGVWYWx1ZSAhPSBudWxsKSAmJiAoYXR0cmlidXRlVmFsdWUubGVuZ3RoKCkgPiAwKSkgewotCQkJCQkJCQl0ZXh0LmFwcGVuZCgiPSIgKyBTdHJpbmdVdGlscy5zdHJpcChhdHRyaWJ1dGVWYWx1ZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRleHQudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgU3RhdHVzTGluZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBKRmFjZU5vZGVMYWJlbFByb3ZpZGVyIHsKLQkJVHJlZVZpZXdlciB0cmVlVmlld2VyID0gbnVsbDsKLQotCQlwdWJsaWMgU3RhdHVzTGluZUxhYmVsUHJvdmlkZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJCXRyZWVWaWV3ZXIgPSB2aWV3ZXI7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJTm9kZSBub2RlID0gKE5vZGUpIGVsZW1lbnQ7Ci0JCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQkJcy5pbnNlcnQoMCwgc3VwZXIuZ2V0VGV4dChub2RlKSk7Ci0JCQkJfQotCQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQkJcy5pbnNlcnQoMCwgSVBhdGguU0VQQVJBVE9SKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcy50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVG9nZ2xlIGFjdGlvbiBmb3Igd2hldGhlciBvciBub3QgdG8gZGlzcGxheSBlbGVtZW50J3MgZmlyc3QgYXR0cmlidXRlCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUb2dnbGVTaG93QXR0cmlidXRlQWN0aW9uIGV4dGVuZHMgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb24gewotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODg0NDQKLQkJcHJpdmF0ZSBUcmVlVmlld2VyIGZUcmVlVmlld2VyOwotCi0JCXB1YmxpYyBUb2dnbGVTaG93QXR0cmlidXRlQWN0aW9uKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBwcmVmZXJlbmNlLCBUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJCXN1cGVyKFhNTFVJTWVzc2FnZXMuWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uXzAsIHN0b3JlLCBwcmVmZXJlbmNlLCB0cnVlKTsKLQkJCXNldFRvb2xUaXBUZXh0KGdldFRleHQoKSk7Ci0JCQkvLyBpbWFnZXMgbmVlZGVkCi0JCQkvLyBzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihTWU5DRURfRCk7Ci0JCQkvLyAobnNkKSB0ZW1wb3JhcmlseSByZS11c2UgUHJvcGVydGllcyB2aWV3IGltYWdlCi0JCQlzZXRJbWFnZURlc2NyaXB0b3IoRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUFJPUF9QUykpOwotCQkJZlRyZWVWaWV3ZXIgPSB0cmVlVmlld2VyOwotCQkJdXBkYXRlKCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZSN1cGRhdGUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQkJc3VwZXIudXBkYXRlKCk7Ci0JCQlmU2hvd0F0dHJpYnV0ZXMgPSBpc0NoZWNrZWQoKTsKLQotCQkJLy8gbm90aWZ5IHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBjaGFuZ2UKLQkJCWVuYWJsZVNob3dBdHRyaWJ1dGVzKGZTaG93QXR0cmlidXRlcywgZlRyZWVWaWV3ZXIpOwotCi0JCQkvLyByZWZyZXNoIHRoZSBvdXRsaW5lIHZpZXcKLQkJCWZUcmVlVmlld2VyLnJlZnJlc2godHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgZkNvbnRlbnRQcm92aWRlciA9IG51bGw7Ci0KLQlwcml2YXRlIEFjdGlvbk1hbmFnZXJNZW51TGlzdGVuZXIgZkNvbnRleHRNZW51RmlsbGVyID0gbnVsbDsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXIgPSBudWxsOwotCi0JYm9vbGVhbiBmU2hvd0F0dHJpYnV0ZXMgPSBmYWxzZTsKLQotCXByaXZhdGUgSkZhY2VOb2RlTGFiZWxQcm92aWRlciBmU2ltcGxlTGFiZWxQcm92aWRlcjsKLQlwcml2YXRlIFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyW10gZlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyczsKLQotCXByaXZhdGUgVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJbXSBmVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzOwotCi0JLyoKLQkgKiBQcmVmZXJlbmNlIGtleSBmb3IgU2hvdyBBdHRyaWJ1dGVzCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT1VUTElORV9TSE9XX0FUVFJJQlVURV9QUkVGID0gIm91dGxpbmUtc2hvdy1hdHRyaWJ1dGUtZWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBYTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jY3JlYXRlTWVudUNvbnRyaWJ1dGlvbnMob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXByb3RlY3RlZCBJQ29udHJpYnV0aW9uSXRlbVtdIGNyZWF0ZU1lbnVDb250cmlidXRpb25zKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCUlDb250cmlidXRpb25JdGVtW10gaXRlbXM7Ci0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04ODQ0NAotCQlJQ29udHJpYnV0aW9uSXRlbSBzaG93QXR0cmlidXRlSXRlbSA9IG5ldyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0obmV3IFRvZ2dsZVNob3dBdHRyaWJ1dGVBY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCksIE9VVExJTkVfU0hPV19BVFRSSUJVVEVfUFJFRiwgdmlld2VyKSk7Ci0JCWl0ZW1zID0gc3VwZXIuY3JlYXRlTWVudUNvbnRyaWJ1dGlvbnModmlld2VyKTsKLQkJaWYgKGl0ZW1zID09IG51bGwpIHsKLQkJCWl0ZW1zID0gbmV3IElDb250cmlidXRpb25JdGVtW117c2hvd0F0dHJpYnV0ZUl0ZW19OwotCQl9Ci0JCWVsc2UgewotCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBjb21iaW5lZEl0ZW1zID0gbmV3IElDb250cmlidXRpb25JdGVtW2l0ZW1zLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShpdGVtcywgMCwgY29tYmluZWRJdGVtcywgMCwgaXRlbXMubGVuZ3RoKTsKLQkJCWNvbWJpbmVkSXRlbXNbaXRlbXMubGVuZ3RoXSA9IHNob3dBdHRyaWJ1dGVJdGVtOwotCQkJaXRlbXMgPSBjb21iaW5lZEl0ZW1zOwotCQl9Ci0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBOb2RlQWN0aW9uTWFuYWdlciB0byB1c2UgZm9yIHRoZSBnaXZlbiB0cmVlVmlld2VyLgotCSAqIDxwPgotCSAqIE5vdCBBUEkuIE1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB0cmVlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgVHJlZVZpZXdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhIG5vZGUgYWN0aW9uIG1hbmFnZXIgZm9yIHVzZSB3aXRoIHRoaXMgdHJlZSB2aWV3ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgWE1MTm9kZUFjdGlvbk1hbmFnZXIgY3JlYXRlTm9kZUFjdGlvbk1hbmFnZXIoVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCXJldHVybiBuZXcgWE1MTm9kZUFjdGlvbk1hbmFnZXIoKElTdHJ1Y3R1cmVkTW9kZWwpIHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSwgdHJlZVZpZXdlcik7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBjb25maWd1cmF0aW9uIHRoYXQgdGhlIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QKLQkgKiB0byBzaG93IGF0dHJpYnV0ZSB2YWx1ZXMgaW4gdGhlIHRyZWUgdmlld2VyIGhhcyBjaGFuZ2VkLiBUaGUgdHJlZQotCSAqIHZpZXdlciBpcyBhdXRvbWF0aWNhbGx5IHJlZnJlc2hlZCBhZnRlcndhcmRzIHRvIHVwZGF0ZSB0aGUgbGFiZWxzLgotCSAqIAotCSAqIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLCBidXQgcmF0aGVyIHNob3VsZCByZWFjdCB0byBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gc2hvd0F0dHJpYnV0ZXMKLQkgKiAgICAgICAgICAgIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0byBzaG93IGF0dHJpYnV0ZSB2YWx1ZXMgaW4KLQkgKiAgICAgICAgICAgIHRoZSB0cmVlIHZpZXdlcgotCSAqIEBwYXJhbSB0cmVlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgVHJlZVZpZXdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25maWd1cmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlU2hvd0F0dHJpYnV0ZXMoYm9vbGVhbiBzaG93QXR0cmlidXRlcywgVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCS8vIG5vdGhpbmcgYnkgZGVmYXVsdAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0Q29udGVudFByb3ZpZGVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZDb250ZW50UHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZkNvbnRlbnRQcm92aWRlciA9IG5ldyBKRmFjZU5vZGVDb250ZW50UHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gZkNvbnRlbnRQcm92aWRlcjsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBnZXRGaWx0ZXJlZE5vZGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQotCQkJLy8gcmVwbGFjZSBhdHRyaWJ1dGUgbm9kZSBpbiBzZWxlY3Rpb24gd2l0aCBpdHMgcGFyZW50Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCQlub2RlID0gKChBdHRyKSBub2RlKS5nZXRPd25lckVsZW1lbnQoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBnZXRGaWx0ZXJlZE5vZGVzKE9iamVjdFtdIGZpbHRlcmVkTm9kZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJlZE5vZGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaWx0ZXJlZE5vZGVzW2ldID0gZ2V0RmlsdGVyZWROb2RlKGZpbHRlcmVkTm9kZXNbaV0pOwotCQl9Ci0JCXJldHVybiBmaWx0ZXJlZE5vZGVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0TGFiZWxQcm92aWRlcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZMYWJlbFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZMYWJlbFByb3ZpZGVyID0gbmV3IEF0dHJpYnV0ZVNob3dpbmdMYWJlbFByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZMYWJlbFByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0TWVudUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgSU1lbnVMaXN0ZW5lciBnZXRNZW51TGlzdGVuZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZDb250ZXh0TWVudUZpbGxlciA9PSBudWxsKSB7Ci0JCQlmQ29udGV4dE1lbnVGaWxsZXIgPSBuZXcgQWN0aW9uTWFuYWdlck1lbnVMaXN0ZW5lcih2aWV3ZXIpOwotCQl9Ci0JCXJldHVybiBmQ29udGV4dE1lbnVGaWxsZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKFRyZWVWaWV3ZXIgdmlld2VyLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJU2VsZWN0aW9uIGZpbHRlcmVkU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCU9iamVjdFtdIGZpbHRlcmVkTm9kZXMgPSBnZXRGaWx0ZXJlZE5vZGVzKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikudG9BcnJheSgpKTsKLQkJCWZpbHRlcmVkU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmlsdGVyZWROb2Rlcyk7Ci0JCX0KLQkJcmV0dXJuIGZpbHRlcmVkU2VsZWN0aW9uOwotCX0KLQotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRTdGF0dXNMaW5lTGFiZWxQcm92aWRlcihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJaWYgKGZTaW1wbGVMYWJlbFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZTaW1wbGVMYWJlbFByb3ZpZGVyID0gbmV3IFN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyKHRyZWVWaWV3ZXIpOwotCQl9Ci0JCXJldHVybiBmU2ltcGxlTGFiZWxQcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVycyhvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyW10gZ2V0VHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzKGZpbmFsIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQlpZiAoZlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQlmVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzID0gbmV3IFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyW117bmV3IFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyKCkgewotCi0JCQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJCQlMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuc2V0U2VsZWN0aW9uKG51bGwpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRyYWdTdGFydChEcmFnU291cmNlRXZlbnQgZXZlbnQpIHsKLQkJCQkJTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLnNldFNlbGVjdGlvbih0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgVHJhbnNmZXIgZ2V0VHJhbnNmZXIoKSB7Ci0JCQkJCXJldHVybiBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCk7Ci0JCQkJfQotCQkJfX07Ci0JCX0KLQotCQlyZXR1cm4gZlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycyhvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyW10gZ2V0VHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzKGZpbmFsIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQlpZiAoZlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQlmVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzID0gbmV3IFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyW117bmV3IFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBkcmFnTGVhdmUoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZHJhZ09wZXJhdGlvbkNoYW5nZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZHJhZ092ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWV2ZW50LmZlZWRiYWNrID0gRE5ELkZFRURCQUNLX1NFTEVDVDsKLQkJCQkJZmxvYXQgZmVlZGJhY2tGbG9hdCA9IGdldEhlaWdodEluSXRlbShldmVudCk7Ci0JCQkJCWlmIChmZWVkYmFja0Zsb2F0ID4gMC43NSkgewotCQkJCQkJZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfSU5TRVJUX0FGVEVSOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGZlZWRiYWNrRmxvYXQgPCAwLjI1KSB7Ci0JCQkJCQlldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19JTlNFUlRfQkVGT1JFOwotCQkJCQl9Ci0JCQkJCWV2ZW50LmZlZWRiYWNrIHw9IERORC5GRUVEQkFDS19FWFBBTkQgfCBETkQuRkVFREJBQ0tfU0NST0xMOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChldmVudC5vcGVyYXRpb25zICE9IERORC5EUk9QX05PTkUgJiYgTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmdldFNlbGVjdGlvbigpICE9IG51bGwgJiYgIUxvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKS5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIGV2ZW50Lml0ZW0gIT0gbnVsbCAmJiBldmVudC5pdGVtLmdldERhdGEoKSAhPSBudWxsKSB7Ci0JCQkJCQkJLyoKLQkJCQkJCQkgKiB0aGUgY29tbWFuZCB1c2VzIHRoZXNlIG51bWJlcnMgaW5zdGVhZCBvZiB0aGUKLQkJCQkJCQkgKiBmZWVkYmFjayBjb25zdGFudHMgKGV2ZW4gdGhvdWdoIGl0IGNvbnZlcnRzIGluCi0JCQkJCQkJICogdGhlIG90aGVyIGRpcmVjdGlvbiBhcyB3ZWxsKQotCQkJCQkJCSAqLwotCQkJCQkJCWZsb2F0IGZlZWRiYWNrRmxvYXQgPSBnZXRIZWlnaHRJbkl0ZW0oZXZlbnQpOwotCi0JCQkJCQkJZmluYWwgRHJhZ05vZGVDb21tYW5kIGNvbW1hbmQgPSBuZXcgRHJhZ05vZGVDb21tYW5kKGV2ZW50Lml0ZW0uZ2V0RGF0YSgpLCBmZWVkYmFja0Zsb2F0LCBldmVudC5vcGVyYXRpb25zLCBldmVudC5kZXRhaWwsIHNlbGVjdGlvbi50b0xpc3QoKSwgdHJlZVZpZXdlcik7Ci0JCQkJCQkJaWYgKGNvbW1hbmQgIT0gbnVsbCAmJiBjb21tYW5kLmNhbkV4ZWN1dGUoKSkgewotCQkJCQkJCQlTYWZlUnVubmFibGUucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJCQkJCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZHJvcEFjY2VwdChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQl9Ci0KLQkJCQlwcml2YXRlIGZsb2F0IGdldEhlaWdodEluSXRlbShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKGV2ZW50Lml0ZW0gPT0gbnVsbCkKLQkJCQkJCXJldHVybiAuNWY7Ci0JCQkJCWlmIChldmVudC5pdGVtIGluc3RhbmNlb2YgVHJlZUl0ZW0pIHsKLQkJCQkJCVRyZWVJdGVtIHRyZWVJdGVtID0gKFRyZWVJdGVtKSBldmVudC5pdGVtOwotCQkJCQkJQ29udHJvbCBjb250cm9sID0gdHJlZUl0ZW0uZ2V0UGFyZW50KCk7Ci0JCQkJCQlQb2ludCBwb2ludCA9IGNvbnRyb2wudG9Db250cm9sKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0JCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gdHJlZUl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCQkJCQlyZXR1cm4gKGZsb2F0KSAocG9pbnQueSAtIGJvdW5kcy55KSAvIChmbG9hdCkgYm91bmRzLmhlaWdodDsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChldmVudC5pdGVtIGluc3RhbmNlb2YgVGFibGVJdGVtKSB7Ci0JCQkJCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gKFRhYmxlSXRlbSkgZXZlbnQuaXRlbTsKLQkJCQkJCUNvbnRyb2wgY29udHJvbCA9IHRhYmxlSXRlbS5nZXRQYXJlbnQoKTsKLQkJCQkJCVBvaW50IHBvaW50ID0gY29udHJvbC50b0NvbnRyb2wobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLQkJCQkJCVJlY3RhbmdsZSBib3VuZHMgPSB0YWJsZUl0ZW0uZ2V0Qm91bmRzKDApOwotCQkJCQkJcmV0dXJuIChmbG9hdCkgKHBvaW50LnkgLSBib3VuZHMueSkgLyAoZmxvYXQpIGJvdW5kcy5oZWlnaHQ7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXR1cm4gMC4wRjsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXB1YmxpYyBUcmFuc2ZlciBnZXRUcmFuc2ZlcigpIHsKLQkJCQkJcmV0dXJuIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJCXJldHVybiBnZXRUcmFuc2ZlcigpLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpOwotCQkJCX0KLQkJCX19OwotCQl9Ci0JCXJldHVybiBmVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jdW5jb25maWd1cmUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuY29uZmlndXJlKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyLnVuY29uZmlndXJlKHZpZXdlcik7Ci0JCWZUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnMgPSBudWxsOwotCQlmVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzID0gbnVsbDsKLQkJaWYgKGZDb250ZXh0TWVudUZpbGxlciAhPSBudWxsKSB7Ci0JCQlmQ29udGV4dE1lbnVGaWxsZXIucmVsZWFzZSgpOwotCQkJZkNvbnRleHRNZW51RmlsbGVyID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS92aWV3cy9wcm9wZXJ0aWVzL1hNTFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvdmlld3MvcHJvcGVydGllcy9YTUxQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmE1NDlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS92aWV3cy9wcm9wZXJ0aWVzL1hNTFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvcGVydGllcy5YTUxQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBwcm9wZXJ0eSBzaGVldCBwYWdlIHdoaWNoIHNob3dzIFhNTCBjb250ZW50LgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiB7Ci0JcHJpdmF0ZSBjbGFzcyBDTURvY3VtZW50TWFuYWdlckxpc3RlbmVySW1wbCBpbXBsZW1lbnRzIENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBjYWNoZUNsZWFyZWQoQ01Eb2N1bWVudENhY2hlIGNhY2hlKSB7Ci0JCQkvLyBub3RoaW5nIHRvIGRvCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBjYWNoZVVwZGF0ZWQoQ01Eb2N1bWVudENhY2hlIGNhY2hlLCBmaW5hbCBTdHJpbmcgdXJpLCBpbnQgb2xkU3RhdHVzLCBpbnQgbmV3U3RhdHVzLCBDTURvY3VtZW50IGNtRG9jdW1lbnQpIHsKLQkJCWlmICgobmV3U3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTE9BREVEKSB8fCAobmV3U3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfRVJST1IpKSB7Ci0JCQkJcmVmcmVzaFBhZ2VzKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoQ01Eb2N1bWVudE1hbmFnZXIgY21Eb2N1bWVudE1hbmFnZXIsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCWlmIChjbURvY3VtZW50TWFuYWdlci5nZXRQcm9wZXJ0eUVuYWJsZWQoQ01Eb2N1bWVudE1hbmFnZXIuUFJPUEVSVFlfQVVUT19MT0FEKSkgewotCQkJCXJlZnJlc2hQYWdlcygpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHJlZnJlc2hQYWdlcygpIHsKLQkJCWdldFByb3BlcnRpZXNSZWZyZXNoSm9iKCkuYWRkUHJvcGVydHlTaGVldFBhZ2UoZlByb3BlcnR5U2hlZXRQYWdlKTsKLQkJCWdldFByb3BlcnRpZXNSZWZyZXNoSm9iKCkuc2NoZWR1bGUoUHJvcGVydGllc1JlZnJlc2hKb2IuVVBEQVRFX0RFTEFZKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgUHJvcGVydGllc1JlZnJlc2hKb2IgZXh0ZW5kcyBVSUpvYiB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQREFURV9ERUxBWSA9IDIwMDsKLQotCQlwcml2YXRlIFNldCBwcm9wZXJ0eVNoZWV0UGFnZXMgPSBudWxsOwotCi0JCXB1YmxpYyBQcm9wZXJ0aWVzUmVmcmVzaEpvYigpIHsKLQkJCXN1cGVyKFhNTFVJTWVzc2FnZXMuSkZhY2VOb2RlQWRhcHRlcl8xKTsKLQkJCXNldFN5c3RlbSh0cnVlKTsKLQkJCXNldFByaW9yaXR5KEpvYi5TSE9SVCk7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZXMgPSBuZXcgSGFzaFNldCgxKTsKLQkJfQotCi0JCXZvaWQgYWRkUHJvcGVydHlTaGVldFBhZ2UoSVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UpIHsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlwcm9wZXJ0eVNoZWV0UGFnZXMuYWRkKHBhZ2UpOwotCQkJCXNjaGVkdWxlKFVQREFURV9ERUxBWSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJT2JqZWN0W10gcGFnZXMgPSBwcm9wZXJ0eVNoZWV0UGFnZXMudG9BcnJheSgpOwotCQkJcHJvcGVydHlTaGVldFBhZ2VzLmNsZWFyKCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlID0gKFByb3BlcnR5U2hlZXRQYWdlKSBwYWdlc1tpXTsKLQkJCQlpZiAoKHBhZ2UgIT0gbnVsbCkgJiYgKHBhZ2UuZ2V0Q29udHJvbCgpICE9IG51bGwpICYmICFwYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJcGFnZS5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgWE1MUHJvcGVydHlTaGVldFJlZnJlc2hBZGFwdGVyIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyIHsKLQkJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCQlpZiAoZlByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKLQkJCQlnZXRQcm9wZXJ0aWVzUmVmcmVzaEpvYigpLmFkZFByb3BlcnR5U2hlZXRQYWdlKGZQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFhNTFByb3BlcnR5U291cmNlUHJvdmlkZXIgaW1wbGVtZW50cyBJUHJvcGVydHlTb3VyY2VQcm92aWRlciB7Ci0JCXByaXZhdGUgSVByb3BlcnR5U291cmNlIGZQcm9wZXJ0eVNvdXJjZSA9IG51bGw7Ci0JCXByaXZhdGUgSU5vZGVOb3RpZmllciBmU291cmNlID0gbnVsbDsKLQotCQlwdWJsaWMgSVByb3BlcnR5U291cmNlIGdldFByb3BlcnR5U291cmNlKE9iamVjdCBvYmplY3QpIHsKLQkJCWlmICgoZlNvdXJjZSAhPSBudWxsKSAmJiBvYmplY3QuZXF1YWxzKGZTb3VyY2UpKSB7Ci0JCQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZTsKLQkJCX0KLQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJZlNvdXJjZSA9IChJTm9kZU5vdGlmaWVyKSBvYmplY3Q7Ci0JCQkJZlByb3BlcnR5U291cmNlID0gKElQcm9wZXJ0eVNvdXJjZSkgZlNvdXJjZS5nZXRBZGFwdGVyRm9yKElQcm9wZXJ0eVNvdXJjZS5jbGFzcyk7Ci0JCQkJaWYgKGZQcm9wZXJ0eVNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCWZQcm9wZXJ0eVNvdXJjZSA9IG5ldyBYTUxQcm9wZXJ0eVNvdXJjZSgoSU5vZGVOb3RpZmllcikgb2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmU291cmNlID0gbnVsbDsKLQkJCQlmUHJvcGVydHlTb3VyY2UgPSBudWxsOwotCQkJfQotCQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lckltcGwgZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgPSBuZXcgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lckltcGwoKTsKLQlwcml2YXRlIFByb3BlcnRpZXNSZWZyZXNoSm9iIGZQcm9wZXJ0aWVzUmVmcmVzaEpvYiA9IG51bGw7Ci0JSVByb3BlcnR5U2hlZXRQYWdlIGZQcm9wZXJ0eVNoZWV0UGFnZSA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvcGVydHlTb3VyY2VQcm92aWRlciBmUHJvcGVydHlTb3VyY2VQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBJTm9kZUFkYXB0ZXIgZlJlZnJlc2hBZGFwdGVyID0gbmV3IFhNTFByb3BlcnR5U2hlZXRSZWZyZXNoQWRhcHRlcigpOwotCXByaXZhdGUgQ01Eb2N1bWVudE1hbmFnZXJbXSBmU2VsZWN0ZWRDTURvY3VtZW50TWFuYWdlcnMgPSBuZXcgQ01Eb2N1bWVudE1hbmFnZXJbMF07Ci0JcHJpdmF0ZSBJTm9kZU5vdGlmaWVyW10gZlNlbGVjdGVkTm90aWZpZXJzID0gbmV3IElOb2RlTm90aWZpZXJbMF07Ci0KLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0SW5wdXRTZWxlY3Rpb24oSVdvcmtiZW5jaFBhcnQgc2VsZWN0aW5nUGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGZTZWxlY3RlZE5vdGlmaWVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZTZWxlY3RlZE5vdGlmaWVycy5sZW5ndGg7IGkrKykgewotCQkJCWZTZWxlY3RlZE5vdGlmaWVyc1tpXS5yZW1vdmVBZGFwdGVyKGZSZWZyZXNoQWRhcHRlcik7Ci0JCQl9Ci0JCQlmU2VsZWN0ZWROb3RpZmllcnMgPSBudWxsOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlNlbGVjdGVkQ01Eb2N1bWVudE1hbmFnZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmU2VsZWN0ZWRDTURvY3VtZW50TWFuYWdlcnNbaV0ucmVtb3ZlTGlzdGVuZXIoZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIpOwotCQl9Ci0KLQkJSVNlbGVjdGlvbiBwcmVmZXJyZWRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCi0JCQkvKgotCQkJICogT24gQXR0ciBub2Rlcywgc2VsZWN0IHRoZSBvd25lciBFbGVtZW50LiBPbiBUZXh0IG5vZGVzLCBzZWxlY3QKLQkJCSAqIHRoZSBwYXJlbnQgRWxlbWVudC4KLQkJCSAqLwotCQkJT2JqZWN0W10gc2VsZWN0ZWRPYmplY3RzID0gbmV3IE9iamVjdFtzdHJ1Y3R1cmVkU2VsLnNpemUoKV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cnVjdHVyZWRTZWwudG9BcnJheSgpLCAwLCBzZWxlY3RlZE9iamVjdHMsIDAsIHNlbGVjdGVkT2JqZWN0cy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZE9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3QgaW5vZGUgPSBzZWxlY3RlZE9iamVjdHNbaV07Ci0JCQkJaWYgKGlub2RlIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgaW5vZGU7Ci0JCQkJCS8vIHJlcGxhY2UgQXR0cmlidXRlIE5vZGUgd2l0aCBpdHMgb3duZXIKLQkJCQkJTm9kZSBwYXJlbnROb2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCQkJRWxlbWVudCBvd25lckVsZW1lbnQgPSAoKEF0dHIpIG5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotCQkJCQkJc2VsZWN0ZWRPYmplY3RzW2ldID0gb3duZXJFbGVtZW50OwotCQkJCQl9Ci0JCQkJCS8vIHJlcGxhY2UgVGV4dCBOb2RlIHdpdGggaXRzIHBhcmVudAotCQkJCQllbHNlIGlmICgoKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgfHwgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSkpICYmIChwYXJlbnROb2RlICE9IG51bGwpKSB7Ci0JCQkJCQlzZWxlY3RlZE9iamVjdHNbaV0gPSBwYXJlbnROb2RlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoc2VsZWN0ZWRPYmplY3RzLmxlbmd0aCA+IDApIHsKLQkJCQlTZXQgbWFuYWdlcnMgPSBuZXcgSGFzaFNldCgxKTsKLQkJCQlTZXQgc2VsZWN0ZWROb3RpZmllcnMgPSBuZXcgSGFzaFNldCgxKTsKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRPYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChzZWxlY3RlZE9iamVjdHNbaV0gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQlNb2RlbFF1ZXJ5IHF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSgoKE5vZGUpIHNlbGVjdGVkT2JqZWN0c1tpXSkuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCQkJCWlmIChxdWVyeSAhPSBudWxsKSB7Ci0JCQkJCQkJQ01Eb2N1bWVudE1hbmFnZXIgbWdyID0gcXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKTsKLQkJCQkJCQlpZiAobWdyICE9IG51bGwpIHsKLQkJCQkJCQkJbWFuYWdlcnMuYWRkKG1ncik7Ci0JCQkJCQkJCW1nci5hZGRMaXN0ZW5lcihmQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8qCi0JCQkJCSAqIEFkZCBVSSByZWZyZXNoIGFkYXB0ZXJzIGFuZCByZW1lbWJlciBub3RpZmllcnMgZm9yCi0JCQkJCSAqIGxhdGVyIHJlbW92YWwKLQkJCQkJICovCi0JCQkJCWlmIChzZWxlY3RlZE9iamVjdHNbaV0gaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQkJCQlzZWxlY3RlZE5vdGlmaWVycy5hZGQoc2VsZWN0ZWRPYmplY3RzW2ldKTsKLQkJCQkJCSgoSU5vZGVOb3RpZmllcikgc2VsZWN0ZWRPYmplY3RzW2ldKS5hZGRBZGFwdGVyKGZSZWZyZXNoQWRhcHRlcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZlNlbGVjdGVkQ01Eb2N1bWVudE1hbmFnZXJzID0gKENNRG9jdW1lbnRNYW5hZ2VyW10pIG1hbmFnZXJzLnRvQXJyYXkobmV3IENNRG9jdW1lbnRNYW5hZ2VyW21hbmFnZXJzLnNpemUoKV0pOwotCQkJCWZTZWxlY3RlZE5vdGlmaWVycyA9IChJTm9kZU5vdGlmaWVyW10pIHNlbGVjdGVkTm90aWZpZXJzLnRvQXJyYXkobmV3IElOb2RlTm90aWZpZXJbc2VsZWN0ZWROb3RpZmllcnMuc2l6ZSgpXSk7Ci0JCQl9Ci0KLQotCQkJcHJlZmVycmVkU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWRPYmplY3RzKTsKLQkJfQotCQlyZXR1cm4gcHJlZmVycmVkU2VsZWN0aW9uOwotCX0KLQotCVByb3BlcnRpZXNSZWZyZXNoSm9iIGdldFByb3BlcnRpZXNSZWZyZXNoSm9iKCkgewotCQlpZiAoZlByb3BlcnRpZXNSZWZyZXNoSm9iID09IG51bGwpIHsKLQkJCWZQcm9wZXJ0aWVzUmVmcmVzaEpvYiA9IG5ldyBQcm9wZXJ0aWVzUmVmcmVzaEpvYigpOwotCQl9Ci0JCXJldHVybiBmUHJvcGVydGllc1JlZnJlc2hKb2I7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGdldFByb3BlcnR5U291cmNlUHJvdmlkZXIoSVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UpIHsKLQkJaWYgKGZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZQcm9wZXJ0eVNoZWV0UGFnZSA9IHBhZ2U7Ci0JCQlmUHJvcGVydHlTb3VyY2VQcm92aWRlciA9IG5ldyBYTUxQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOwotCX0KLQotCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmUoKSB7Ci0JCXN1cGVyLnVuY29uZmlndXJlKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlNlbGVjdGVkQ01Eb2N1bWVudE1hbmFnZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmU2VsZWN0ZWRDTURvY3VtZW50TWFuYWdlcnNbaV0ucmVtb3ZlTGlzdGVuZXIoZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIpOwotCQl9Ci0JCWZQcm9wZXJ0eVNoZWV0UGFnZSA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3RlbXBsYXRlcy94bWxkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3RlbXBsYXRlcy94bWxkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjUxNzdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS90ZW1wbGF0ZXMveG1sZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1UZW1wbGF0ZXMuY29tbWVudC5uYW1lPWNvbW1lbnQKLVRlbXBsYXRlcy5jb21tZW50LmRlc2M9eG1sIGNvbW1lbnQKLVRlbXBsYXRlcy54bWxkZWNsYXJhdGlvbi5uYW1lPXhtbCBkZWNsYXJhdGlvbgotVGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uLmRlc2M9eG1sIGRlY2xhcmF0aW9uCi1UZW1wbGF0ZXMueHNscGkubmFtZT1YU0wgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbgotVGVtcGxhdGVzLnhzbHBpLmRlc2M9WFNMIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KLVRlbXBsYXRlcy54c2luc3AubmFtZT14c2luc3AKLVRlbXBsYXRlcy54c2luc3AuZGVzYz1YTUwgU2NoZW1hIG5hbWUgc3BhY2UKLVRlbXBsYXRlcy5zY2hlbWFMb2MubmFtZT1zY2hlbWFMb2MKLVRlbXBsYXRlcy5zY2hlbWFMb2MuZGVzYz1YTUwgU2NoZW1hIGxvY2F0aW9uIGF0dHJpYnV0ZQotVGVtcGxhdGVzLm5vc2NoZW1hTG9jLm5hbWU9bm9zY2hlbWFMb2MKLVRlbXBsYXRlcy5ub3NjaGVtYUxvYy5kZXNjPU5vIE5hbWVzcGFjZSBTY2hlbWEgTG9jYXRpb24KLVRlbXBsYXRlcy5kZWZhdWx0bnNwLm5hbWU9ZGVmYXVsdCBuYW1lc3BhY2UKLVRlbXBsYXRlcy5kZWZhdWx0bnNwLmRlc2M9RGVmYXVsdCBOYW1lc3BhY2UgQXR0cmlidXRlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvdGVtcGxhdGVzL3htbGRlZmF1bHQtdGVtcGxhdGVzLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS90ZW1wbGF0ZXMveG1sZGVmYXVsdC10ZW1wbGF0ZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjExODA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS90ZW1wbGF0ZXMveG1sZGVmYXVsdC10ZW1wbGF0ZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyIC0gYWRkZWQgdGVtcGxhdGVzIGZvciB4c2kgbmFtZXNwYWNlLCBzY2hlbWFMb2NhdGlvbiwgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBuYW1lc3BhY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIC0tPgotPHRlbXBsYXRlcz4KLSAgPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMueG1sZGVjbGFyYXRpb24ubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMueG1sZGVjbGFyYXRpb24uZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uIiBjb250ZXh0PSJ4bWxfbmV3IiBlbmFibGVkPSJ0cnVlIj4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSIke2VuY29kaW5nfSI/Jmd0OzwvdGVtcGxhdGU+Ci0gIDx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmNvbW1lbnQubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuY29tbWVudC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuY29tbWVudCIgY29udGV4dD0ieG1sX3RhZyIgZW5hYmxlZD0idHJ1ZSI+Jmx0OyEtLSAke2N1cnNvcn0gLS0mZ3Q7PC90ZW1wbGF0ZT4KLSAgPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMueHNscGkubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMueHNscGkuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLnhzbHBpIiBjb250ZXh0PSJ4bWxfdGFnIiBlbmFibGVkPSJ0cnVlIj4mbHQ7P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIiBocmVmPSIke2N1cnNvcn0iPyZndDs8L3RlbXBsYXRlPgotICA8dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy54c2luc3AubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMueHNpbnNwLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy54c2luc3AiIGNvbnRleHQ9InhtbF9hdHRyaWJ1dGUiIGVuYWJsZWQ9InRydWUiPnhtbG5zOnhzaT0iaHR0cDovL2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjwvdGVtcGxhdGU+Ci0gIDx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLnNjaGVtYUxvYy5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5zY2hlbWFMb2MuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLnNjaGVtYUxvYyIgY29udGV4dD0ieG1sX2F0dHJpYnV0ZSIgZW5hYmxlZD0idHJ1ZSI+eHNpOnNjaGVtYUxvY2F0aW9uPSJ7bmFtZXNwYWNlfSB7bG9jYXRpb259IjwvdGVtcGxhdGU+Ci0gIDx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLm5vc2NoZW1hTG9jLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLm5vc2NoZW1hTG9jLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5ub3NjaGVtYUxvYyIgY29udGV4dD0ieG1sX2F0dHJpYnV0ZSIgZW5hYmxlZD0idHJ1ZSI+eHNpOnNjaGVtYUxvY2F0aW9uPSJ7bmFtZXNwYWNlfSB7bG9jYXRpb259IjwvdGVtcGxhdGU+Ci0gIDx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmRlZmF1bHRuc3AubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuZGVmYXVsdG5zcC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuZGVmYXVsdG5zcCIgY29udGV4dD0ieG1sX2F0dHJpYnV0ZSIgZW5hYmxlZD0idHJ1ZSI+eG1sbnM9ImRlZmF1bHQgbmFtZXNwYWNlIjwvdGVtcGxhdGU+Ci08L3RlbXBsYXRlcz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzEwYzQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtY29udGVudG1vZGVsIiAvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy12YWxpZGF0aW9uIiAvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIgotCQlwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ij4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy9pbXBsL0NvbnN0YW50cyIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMvcGFyc2Vycy9YTUxHcmFtbWFyUHJlcGFyc2VyIiAvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIKLQkJCQlwYXR0ZXJuPSJvcmcvYXBhY2hlL3hlcmNlcy91dGlsL1hNTEdyYW1tYXJQb29sSW1wbCIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMveG5pL1hNTFJlc291cmNlSWRlbnRpZmllciIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMveG5pL1hOSUV4Y2VwdGlvbiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMveG5pL2dyYW1tYXJzL1hNTEdyYW1tYXJEZXNjcmlwdGlvbiIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMveG5pL3BhcnNlci9YTUxFbnRpdHlSZXNvbHZlciIgLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiCi0JCQkJcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMveG5pL3BhcnNlci9YTUxFcnJvckhhbmRsZXIiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9wYXJzZXIvWE1MSW5wdXRTb3VyY2UiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzL3huaS9wYXJzZXIvWE1MUGFyc2VFeGNlcHRpb24iIC8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIgotCQlwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvcmUvSU1lc3NhZ2UiIC8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIgotCQkJCXBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uL2ludGVybmFsL2RlbGVnYXRlcy9EZWxlZ2F0aW5nVmFsaWRhdG9yIiAvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIiAvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkZDdkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NWY4ZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueHNkLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNTU1OGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotI1NhdCBNYXIgMjQgMDI6MTk6MTIgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwOTg1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI1dlZCBOb3YgMTUgMDI6MTM6MTAgRVNUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGI5MmMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJV9VSV9QTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMzAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLlhTRENvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTt4LWludGVybmFsOj10cnVlIAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UueHNkO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMS4zLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZlNTc5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCi1vdXRwdXQuLiA9IGJpbi8KLXNvdXJjZS4uID0gc3JjLWNvbnRlbnRtb2RlbC8sXAotICAgICAgICAgICBzcmMtdmFsaWRhdGlvbi8sXAotICAgICAgICAgICBzcmMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGY1OTE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEgUHJvcGVydGllcyBmaWxlIGZvciBjb21wb25lbnQ6IFhNTCBTY2hlbWEgVmFsaWRhdG9yCi0KLSEKLSEgUGx1Z2luCi0hCi1fVUlfUExVR0lOX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFhTRCBDb3JlIFBsdWdpbgotWFNEX0NvbnRlbnRfVHlwZT1YU0QKLQotX1VJX1hNTF9TQ0hFTUFfVkFMSURBVE9SICAgICAgICAgICAgICAgICAgPSBYTUwgU2NoZW1hIFZhbGlkYXRvcgotX1VJX1hFUkNFU19WQUxJREFUT1JfREVMRUdBVEUgICAgICAgCSAgPSBYZXJjZXMtYmFzZWQgWE1MIFNjaGVtYSBWYWxpZGF0b3IKLQotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGMxYTExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50VHlwZXMiPgotCQk8Y29udGVudC10eXBlCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVYU0RfQ29udGVudF9UeXBlIgotCQkJaWQ9InhzZHNvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLQkJCWRlZmF1bHQtY2hhcnNldD0iVVRGLTgiCi0JCQlmaWxlLWV4dGVuc2lvbnM9InhzZCIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudEZhY3RvcmllcyI+Ci0JCTxmYWN0b3J5Ci0JCQl0eXBlPSJ4c2QiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWwuQ01Eb2N1bWVudEZhY3RvcnlYU0QiPgotCQk8L2ZhY3Rvcnk+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBSZWdpc3RlciB0aGUgWFNEIHZhbGlkYXRvciB3aXRoIHRoZSB2YWxpZGF0aW9uIAkJLS0+Ci0JPCEtLSBmcmFtZXdvcmsuIAkJCQkJCQkJCQkgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLQotCTxleHRlbnNpb24KLQkJaWQ9InhzZFZhbGlkYXRvciIKLQkJbmFtZT0iJV9VSV9YTUxfU0NIRU1BX1ZBTElEQVRPUiIKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvciI+Ci0JCTx2YWxpZGF0b3I+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCWNhc2VTZW5zaXRpdmU9ImZhbHNlIgotCQkJCW5hbWVGaWx0ZXI9IioueHNkIj4KLQkJCTwvZmlsdGVyPgotCQkJCi0JCQk8aGVscGVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuSGVscGVyIj4KLQkJCTwvaGVscGVyPgotCQkJCi0JCQk8cnVuCi0gICAgICAgICBhc3luYz0idHJ1ZSIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlhTRERlbGVnYXRpbmdWYWxpZGF0b3IiCi0gICAgICAgICBlbmFibGVkPSJ0cnVlIgotICAgICAgICAgZnVsbEJ1aWxkPSJ0cnVlIgotICAgICAgICAgaW5jcmVtZW50YWw9InRydWUiPgotCQkJPC9ydW4+Ci0JCTwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCS0tPgotCQotICAgPGV4dGVuc2lvbiBpZD0ieHNkIiBuYW1lPSIlX1VJX1hNTF9TQ0hFTUFfVkFMSURBVE9SIiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yVjIiPgotICAgICAgPHZhbGlkYXRvcgotICAgICAgICAgICAgYnVpbGQ9InRydWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZS5YU0REZWxlZ2F0aW5nVmFsaWRhdG9yIgotICAgICAgICAgICAgbWFudWFsPSJ0cnVlIgotICAgICAgICAgICAgc291cmNlaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWFNEIgotICAgICAgICAgICAgdmVyc2lvbj0iMiIKLSAgICAgICAgICAgIG1hcmtlcklkPSJvcmcuZWNsaXBzZS54c2QuZGlhZ25vc3RpYyI+Ci0gICAgICAgICA8aW5jbHVkZT4KLSAgICAgICAgICAgIDxydWxlcz4KLSAgICAgICAgICAgICAgIDxmaWxlZXh0IGNhc2VTZW5zaXRpdmU9ImZhbHNlIiBleHQ9InhzZCI+PC9maWxlZXh0PgotICAgICAgICAgICAgPC9ydWxlcz4KLSAgICAgICAgIDwvaW5jbHVkZT4KLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvckRlbGVnYXRlcyI+Ci0gICAgCTxkZWxlZ2F0ZQotICAgICAgICAJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuVmFsaWRhdG9yIgotCQkJbmFtZT0iJV9VSV9YRVJDRVNfVkFMSURBVE9SX0RFTEVHQVRFIgotICAgICAgICAJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlhTRERlbGVnYXRpbmdWYWxpZGF0b3IiLz4KLQkgPC9leHRlbnNpb24+Ci0gCSAKLQkgPCEtLSBpbml0aWFsaXplIHhtbCBjb3JlIHByZWZlcmVuY2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YU0RDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBBZGQgc2NoZW1hcyB0byBYTUwgQ2F0YWxvZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNhdGFsb2dDb250cmlidXRpb25zIj4KLQkJPGNhdGFsb2dDb250cmlidXRpb24gaWQ9ImRlZmF1bHQiPgotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCQkJCXVyaT0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS54c2QvY2FjaGUvd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS54c2QiIC8+Ci0JCQk8c3lzdGVtCi0JCQkJc3lzdGVtSWQ9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIKLQkJCQl1cmk9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UueHNkL2NhY2hlL3d3dy53My5vcmcvMjAwMS94bWwueHNkIi8+CQkJCQotCQk8L2NhdGFsb2dDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9DTURvY3VtZW50RmFjdG9yeVhTRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9DTURvY3VtZW50RmFjdG9yeVhTRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzI2MDgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvQ01Eb2N1bWVudEZhY3RvcnlYU0QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5LkNNRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFBhY2thZ2VJbXBsOwotCi0vKioKLSAqICBUaGlzIGJ1aWxkZXIgaGFuZGxlcyBidWlsZGluZyAuZHRkIC8gLnhzZCBncmFtbWFyIGZpbGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50RmFjdG9yeVhTRCBpbXBsZW1lbnRzIENNRG9jdW1lbnRGYWN0b3J5Ci17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRF9GSUxFX1RZUEUgPSAiWFNEIjsKLQotICBwdWJsaWMgQ01Eb2N1bWVudEZhY3RvcnlYU0QoKSAKLSAgeyAgCi0gICAgLy8gaGVyZSB3ZSBjYWxsIGluaXQgb24gdGhlIFhTRCBhbmQgRFREIHBhY2thZ2VzIHRvIGF2b2lkIHN0cmFuZ2UgaW5pdGlhbGl6YXRpb24gYnVncwotICAgIC8vCi0gICAgWFNEUGFja2FnZUltcGwuaW5pdCgpOwotICAgIFhTRFBhY2thZ2UuZUlOU1RBTkNFLmdldFhTREZhY3RvcnkoKTsgIAotICB9Ci0KLSAKLSAgcHVibGljIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudChTdHJpbmcgdXJpKQotICB7ICAgICAgICAgICAgICAgICAgCQotICAgIENNRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gWFNESW1wbC5idWlsZENNRG9jdW1lbnQodXJpKTsgICAgIAotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIAllLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OyAgCi0gIH0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL0NNTm9kZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvQ01Ob2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmNhNTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvQ01Ob2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTU5vZGVJbXBsIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBDTU5vZGUKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRE9DVU1FTlRBVElPTiA9ICJkb2N1bWVudGF0aW9uIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRE9DVU1FTlRBVElPTl9TT1VSQ0UgPSAiZG9jdW1lbnRhdGlvblNvdXJjZSI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RPQ1VNRU5UQVRJT05fTEFOR1VBR0UgPSAiZG9jdW1lbnRhdGlvbkxhbmd1YWdlIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTU9GX05PVElGSUVSID0gImtleSI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFRklOSVRJT05fSU5GTyA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvZGVmaW5pdGlvbkluZm8iOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ERUZJTklUSU9OID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9kZWZpbml0aW9uIjsKLQotICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldEtleSgpOwotCi0gIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsKLSAgICByZXR1cm4gcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9NT0ZfTk9USUZJRVIpOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2JqZWN0KQotICB7Ci0JICAvL25vIHByb3BlcnR5ZXMgc3VwcG9ydGVkPyAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RDTU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNEQ01NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NjFhNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RDTU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgWFNEQ01NYW5hZ2VyIGV4dGVuZHMgUGx1Z2luIAotewotICBwcml2YXRlIHN0YXRpYyBYU0RDTU1hbmFnZXIgaW5zdGFuY2U7Ci0gIAotICBwdWJsaWMgWFNEQ01NYW5hZ2VyKCkgCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFhTRENNTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgaW5zdGFuY2UgPSBuZXcgWFNEQ01NYW5hZ2VyKCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgc3RhcnR1cCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIAotICB7Ci0gICAgWFNEVHlwZVV0aWwuaW5pdGlhbGl6ZSgpOwotICAgIC8vQ29udGVudE1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLnNldEluZmVycmVkR3JhbW1hckZhY3RvcnkobmV3IEluZmVycmVkR3JhbW1hckZhY3RvcnlJbXBsKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTREltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNESW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNThmZmE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNESW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBidWcgMTU3MjU0IC0gcmVmZXJlbmNlZCBBdHRyaWJ1dGVzIGFuZCBFbGVtZW50cwotICogICAgICAgIHdlcmUgbm90IGJlaW5nIGNoZWNrZWQgdG8gc2VlIGlmIHRoZXkgaGFkIHRoZSBhbm5vdGF0aW9ucyBpZgotICogICAgICAgIG5vbmUgd2VyZSBkZWZpbmVkIGxvY2FsbHkuIChJbml0aWFsIGZpeCBtb2RpZmllZCAtIHNlZSBidWcpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWw7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmFubm90YXRpb24uQW5ub3RhdGlvbk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01EYXRhVHlwZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTURvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNRW50aXR5RGVjbGFyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5hbWVkTm9kZU1hcEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5vZGVMaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01EZXNjcmlwdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbC5YU0RTY2hlbWFMb2NhdG9yQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb250ZW50VHlwZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVudW1lcmF0aW9uRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RWYXJpZXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RTY2hlbWFJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU3dpdGNoOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gYnVpbGQgY21ub2RlcyBmcm9tIFhNTCBTY2hlbWEgbm9kZXMuIFRoZSBYTUwgU2NoZW1hIG1vZGVsIGlzCi0gKiBmb3VuZCBpbiB0aGUgb3JnLmVjbGlwc2UueHNkIHBsdWdpbi4KLSAqIAotICogVE9ETzogZ2V0TmFtZXNwYWNlVVJJKCljdXJyZW50bHkgYWx3YXlzIHJldHVybnMgJyMjYW55Jy4KLSAqLwotcHVibGljIGNsYXNzIFhTREltcGwKLXsKLSAgLyoKLSAgICogcHJvcGVydGllcyBjb21tb24gdG8gYWxsIGNtbm9kZXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGRlZmluZWQgaW4KLSAgICogQ01Ob2RlSW1wbCBjbGFzczogUFJPUEVSVFlfRE9DVU1FTlRBVElPTiBQUk9QRVJUWV9ET0NVTUVOVEFUSU9OX1NPVVJDRQotICAgKiBQUk9QRVJUWV9ET0NVTUVOVEFUSU9OX0xBTkdVQUdFIFBST1BFUlRZX01PRl9OT1RJRklFUgotICAgKiBQUk9QRVJUWV9ERUZJTklUSU9OX0lORk8gUFJPUEVSVFlfREVGSU5JVElPTgotICAgKiAKLSAgICogdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhpcyBjbGFzcywgWFNESW1wbDoKLSAgICogUFJPUEVSVFlfQ01ET0NVTUVOVCBQUk9QRVJUWV9VU0VTX0xPQ0FMX0VMRU1FTlRfREVDTEFSQVRJT05TCi0gICAqIFBST1BFUlRZX0lTX05BTUVfU1BBQ0VfQVdBUkUgUFJPUEVSVFlfTlNfUFJFRklYX1FVQUxJRklDQVRJT04KLSAgICogUFJPUEVSVFlfTklMTEFCTEUgUFJPUEVSVFlfU1BFQwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQ01ET0NVTUVOVCA9ICJDTURvY3VtZW50IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVVNFU19MT0NBTF9FTEVNRU5UX0RFQ0xBUkFUSU9OUyA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdXNlc0xvY2FsRWxlbWVudERlY2xhcmF0aW9ucyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0lTX05BTUVfU1BBQ0VfQVdBUkUgPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL2lzTmFtZVNwYWNlQXdhcmUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OU19QUkVGSVhfUVVBTElGSUNBVElPTiA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvbnNQcmVmaXhRdWFsaWZpY2F0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTklMTEFCTEUgPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25pbGxhYmxlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfU1BFQyA9ICJzcGVjIjsKLSAgLyoKLSAgICogcHJvcGVydGllcyBjb21tb24gdG8gYWxsIENNRG9jdW1lbnQgbm9kZXM6IFBST1BFUlRZX1RBUkdFVF9OQU1FU1BBQ0VfVVJJCi0gICAqIFBST1BFUlRZX0lNUE9SVEVEX05BTUVTUEFDRV9JTkZPIFBST1BFUlRZX05BTUVTUEFDRV9JTkZPCi0gICAqIFBST1BFUlRZX0VMRU1FTlRfRk9STV9ERUZBVUxUIFBST1BFUlRZX0FOTk9UQVRJT05fTUFQCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9UQVJHRVRfTkFNRVNQQUNFX1VSSSA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfSU1QT1JURURfTkFNRVNQQUNFX0lORk8gPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL2ltcG9ydGVkTmFtZXNwYWNlSW5mbyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUVTUEFDRV9JTkZPID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9uYW1lc3BhY2VJbmZvIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRUxFTUVOVF9GT1JNX0RFRkFVTFQgPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL2VsZW1lbnRGb3JtRGVmYXVsdCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0FOTk9UQVRJT05fTUFQID0gImFubm90YXRpb25NYXAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9DT01QTEVURV9OQU1FU1BBQ0VfSU5GTyA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvY29tcGxldGVOYW1lc3BhY2VJbmZvIjsKLSAgLyoKLSAgICogcHJvcGVydGllcyBjb21tb24gdG8gYWxsIENNRWxlbWVudERlY2xhcmF0aW9uIG5vZGVzOiBQUk9QRVJUWV9YU0lUWVBFUwotICAgKiBQUk9QRVJUWV9ERVJJVkVEX0VMRU1FTlRfREVDTEFSQVRJT04gUFJPUEVSVFlfU1VCU1RJVFVUSU9OX0dST1VQCi0gICAqIFBST1BFUlRZX0FCU1RSQUNUCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YU0lUWVBFUyA9ICJYU0lUeXBlcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFUklWRURfRUxFTUVOVF9ERUNMQVJBVElPTiA9ICJEZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfU1VCU1RJVFVUSU9OX0dST1VQID0gIlN1YnN0aXR1dGlvbkdyb3VwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfU1VCU1RJVFVUSU9OX0dST1VQX1ZBTFVFID0gIlN1YnN0aXR1dGlvbkdyb3VwVmFsdWUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9BQlNUUkFDVCA9ICJBYnN0cmFjdCI7Ci0gIC8qKgotICAgKiBEZWZpbml0aW9uIGluZm8gZm9yIGVsZW1lbnQgZGVjbGFyYXRpb25zLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGSU5JVElPTl9JTkZPX0dMT0JBTCA9ICJnbG9iYWwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZJTklUSU9OX0lORk9fTE9DQUwgPSAibG9jYWwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTEFOR19BVFRSSUJVVEUgPSAieG1sOmxhbmciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9QUk9UT0NPTCA9ICJwbGF0Zm9ybToiOwotICBwcm90ZWN0ZWQgc3RhdGljIFhTREFkYXB0ZXJGYWN0b3J5SW1wbCB4c2RBZGFwdGVyRmFjdG9yeUltcGwgPSBuZXcgWFNEQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0gIHByb3RlY3RlZCBzdGF0aWMgWFNJRG9jdW1lbnQgeHNpRG9jdW1lbnQgPSBuZXcgWFNJRG9jdW1lbnQoKTsKLQotICAvKioKLSAgICogR2l2ZW4gdXJpIGZvciBhbiBYTUwgU2NoZW1hIGRvY3VtZW50LCBwYXJzZSB0aGUgZG9jdW1lbnQgYW5kIGJ1aWxkCi0gICAqIGNvcnJlc3BvbmRpbmcgQ01Eb2N1bWVudCBub2RlLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSAtCi0gICAqICAgICAgICAgIHRoZSB1cmkgZm9yIGFuIFhNTCBTY2hlbWEgZG9jdW1lbnQKLSAgICogQHBhcmFtIGdyYW1tYXJFcnJvckNoZWNraW5nIC0KLSAgICogICAgICAgICAgZ3JhbW1hciBlcnJvciBjaGVja2luZyBmbGFnCi0gICAqIEBwYXJhbSBlcnJvckxpc3QgLQotICAgKiAgICAgICAgICB0aGUgcmVzdWx0aW5nIGVycm9yIGxpc3QKLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBDTURvY3VtZW50IG5vZGUuCi0gICAqIEBkZXByZWNhdGVkIC0tIHVzZSBidWlsZENNRG9jdW1lbnQoU3RyaW5nIHVyaSkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnQoU3RyaW5nIHVyaSwgaW50IGdyYW1tYXJFcnJvckNoZWNraW5nLCBMaXN0IGVycm9yTGlzdCkKLSAgewotICAgIHJldHVybiBidWlsZENNRG9jdW1lbnQodXJpKTsKLSAgfQotCi0gIC8qKgotICAgKiBHaXZlbiB1cmkgZm9yIGFuIFhNTCBTY2hlbWEgZG9jdW1lbnQsIHBhcnNlIHRoZSBkb2N1bWVudCBhbmQgYnVpbGQKLSAgICogY29ycmVzcG9uZGluZyBDTURvY3VtZW50IG5vZGUuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIC0KLSAgICogICAgICAgICAgdGhlIHVyaSBmb3IgYW4gWE1MIFNjaGVtYSBkb2N1bWVudAotICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIENNRG9jdW1lbnQgbm9kZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnQoU3RyaW5nIHVyaSkKLSAgewotICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IG51bGw7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IGJ1aWxkWFNETW9kZWwodXJpKTsKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KSBnZXRBZGFwdGVyKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIHJldHVybiBjbURvY3VtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIEdpdmVuIHVyaSBmb3IgYW4gWE1MIFNjaGVtYSBkb2N1bWVudCwgcGFyc2UgdGhlIGRvY3VtZW50IGFuZCBidWlsZAotICAgKiBjb3JyZXNwb25kaW5nIENNRG9jdW1lbnQgbm9kZS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgLQotICAgKiAgICAgICAgICB0aGUgdXJpIGZvciBhbiBYTUwgU2NoZW1hIGRvY3VtZW50Ci0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgQ01Eb2N1bWVudCBub2RlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBYU0RTY2hlbWEgYnVpbGRYU0RNb2RlbChTdHJpbmcgdXJpU3RyaW5nKQotICB7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IG51bGw7Ci0gCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gaWYgWE1MIFNjaGVtYSBmb3IgU2NoZW1hIGlzIHJlcXVlc3RlZCwgZ2V0IGl0IHRocm91Z2ggc2NoZW1hIG1vZGVsIAotICAgICAgaWYgKHVyaVN0cmluZy5lbmRzV2l0aCgiMjAwMS9YTUxTY2hlbWEueHNkIikpCi0gICAgICB7Ci0gICAgICAJeHNkU2NoZW1hID0gWFNEU2NoZW1hSW1wbC5nZXRTY2hlbWFGb3JTY2hlbWEoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKTsJCQkKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgCQotICAgICAgICBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLSAgICAgICAgLy9yZXNvdXJjZVNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKG5ldyBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkoKSk7Ci0gICAgICAgIHJlc291cmNlU2V0LmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5hZGQobmV3IFhTRFNjaGVtYUxvY2F0b3JBZGFwdGVyRmFjdG9yeSgpKTsKLSAgICAgICAgICAKLSAgICAgICAgVVJJIHVyaSA9IGNyZWF0ZVVSSSh1cmlTdHJpbmcpOyAgIAotICAgICAgICAKLSAgICAgICAgLy8gQ1MgOiBidWcgMTEzNTM3IGVuc3VyZSB3ZSBwZXJmb3JtIHBoeXNpY2FsIHJlc29sdXRpb24gYmVmb3JlIG9wZW5pbmcgYSBzdHJlYW0gZm9yIHRoZSByZXNvdXJjZQotICAgICAgICAvLwotICAgICAgICBTdHJpbmcgcGh5c2ljYWxMb2NhdGlvbiA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24oIiIsICIiLCB1cmlTdHJpbmcpOyAgICAgICAKLSAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSByZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKS5jcmVhdGVJbnB1dFN0cmVhbShVUkkuY3JlYXRlVVJJKHBoeXNpY2FsTG9jYXRpb24pKTsKLSAgICAgICAgWFNEUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKFhTRFJlc291cmNlSW1wbClyZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCIqLnhzZCIpKTsKLSAgICAgICAgcmVzb3VyY2Uuc2V0VVJJKHVyaSk7Ci0gICAgICAgIHJlc291cmNlLmxvYWQoaW5wdXRTdHJlYW0sIG51bGwpOyAgICAgICAgIAotICAgICAgICB4c2RTY2hlbWEgPSByZXNvdXJjZS5nZXRTY2hlbWEoKTsgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgfQotICAKLSAgLy8gVE9ETyAuLi4gbG9va3MgbGlrZSB3ZSBjYW4gcmVtb3ZlIHRoaXMgY2xhc3M/Ci0gIC8vCi0gIHN0YXRpYyBjbGFzcyBJbnRlcm5hbFVSSUNvbnZlcnRlciBleHRlbmRzIFVSSUNvbnZlcnRlckltcGwKLSAgewotICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBjcmVhdGVVUkxJbnB1dFN0cmVhbShVUkkgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICBpZiAoImh0dHAiLmVxdWFscyh1cmkuc2NoZW1lKCkpKQotICAgICAgewotICAgICAgICBTdHJpbmcgdGhlVVJJID0gdXJpLnRvU3RyaW5nKCk7Ci0gICAgICAgIFN0cmluZyBtYXBwZWQgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUodGhlVVJJLCB0aGVVUkksIHRoZVVSSSk7Ci0gICAgICAgIGlmIChtYXBwZWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHVyaSA9IGNyZWF0ZVVSSShtYXBwZWQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc3VwZXIuY3JlYXRlVVJMSW5wdXRTdHJlYW0odXJpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBhcHByb3ByaWF0ZSBVUkkgYmFzZWQgb24gYSB1cmkgc3RyaW5nLgotICAgKiAKLSAgICogQHBhcmFtIHVyaVN0cmluZyAtCi0gICAqICAgICAgICAgIGEgdXJpIHN0cmluZy4KLSAgICogQHJldHVybiBhbiBhcHByb3ByaWF0ZSBVUkkgYmFzZWQgb24gYSB1cmkgc3RyaW5nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVUkkgY3JlYXRlVVJJKFN0cmluZyB1cmlTdHJpbmcpCi0gIHsKLSAgICBpZiAoaGFzUHJvdG9jb2wodXJpU3RyaW5nKSkKLSAgICAgIHJldHVybiBVUkkuY3JlYXRlVVJJKHVyaVN0cmluZyk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIFVSSS5jcmVhdGVGaWxlVVJJKHVyaVN0cmluZyk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc1Byb3RvY29sKFN0cmluZyB1cmkpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSB1cmkuaW5kZXhPZigiOiIpOwotICAgICAgaWYgKGluZGV4ICE9IC0xICYmIGluZGV4ID4gMikgLy8gYXNzdW1lIHByb3RvY29sIHdpdGggYmUgbGVuZ3RoIDMgc28gdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlJ0MnIGluICdDOi8nIGlzIG5vdCBpbnRlcnByZXRlZCBhcyBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm90b2NvbAotICAgICAgewotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiBzdHJpbmcgYmVnaW5zIHdpdGggcGxhdGZvcm0gcHJvdG9jb2wuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpU3RyaW5nIC0KLSAgICogICAgICAgICAgYSB1cmkgc3RyaW5nLgotICAgKiBAcmV0dXJuIHRydWUgaWYgc3RyaW5nIGJlZ2lucyB3aXRoIHBsYXRmb3JtIHByb3RvY29sLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHdpdGhQbGF0Zm9ybVByb3RvY29sKFN0cmluZyB1cmlTdHJpbmcpCi0gIHsKLSAgICByZXR1cm4gdXJpU3RyaW5nLnN0YXJ0c1dpdGgoUExBVEZPUk1fUFJPVE9DT0wpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnTWluIE9jY3VycycgYXR0cmlidXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiMSIuCi0gICAqIAotICAgKiBAcGFyYW0gY29tcG9uZW50IC0KLSAgICogICAgICAgICAgYSBjb25jcmV0ZSBjb21wb25lbnQuCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTWluIE9jY3VycycgYXR0cmlidXRlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TWluT2NjdXJzKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgewotICAgIGludCBtaW5PY2N1ciA9IDE7Ci0gICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gY29tcG9uZW50LmdldENvbnRhaW5lcigpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCgoWFNEUGFydGljbGUpIG8pLmlzU2V0TWluT2NjdXJzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtaW5PY2N1ciA9ICgoWFNEUGFydGljbGUpIG8pLmdldE1pbk9jY3VycygpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWluT2NjdXIgPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWluT2NjdXI7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICdNYXggT2NjdXJzJyBhdHRyaWJ1dGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzICIxIi4KLSAgICogCi0gICAqIEBwYXJhbSBjb21wb25lbnQgLQotICAgKiAgICAgICAgICBhIGNvbmNyZXRlIGNvbXBvbmVudC4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdNYXggT2NjdXJzJyBhdHRyaWJ1dGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBnZXRNYXhPY2N1cnMoWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgaW50IG1heE9jY3VyID0gMTsKLSAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBjb21wb25lbnQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgewotICAgICAgICBpZiAoKChYU0RQYXJ0aWNsZSkgbykuaXNTZXRNYXhPY2N1cnMoKSkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1heE9jY3VyID0gKChYU0RQYXJ0aWNsZSkgbykuZ2V0TWF4T2NjdXJzKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXhPY2N1ciA9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtYXhPY2N1cjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBlbnVtZXJhdGVkIHZhbHVlcyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gICAqIAotICAgKiBAcGFyYW0gdHlwZSAtCi0gICAqICAgICAgICAgIGEgdHlwZSBkZWZpbml0aW9uLgotICAgKiBAcmV0dXJuIHRoZSBlbnVtZXJhdGVkIHZhbHVlcyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gICAqLwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVFlQRV9OQU1FX0JPT0xFQU4gPSAiYm9vbGVhbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRZUEVfVkFMVUVfVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVFlQRV9WQUxVRV9GQUxTRT0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJCAgCi0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEVudW1lcmF0ZWRWYWx1ZXNGb3JUeXBlKFhTRFR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAvLyBTZWUgYnVnIDIxNDgwNCAtIENvbnRlbnQgYXNzaXN0IG5vdCBzaG93aW5nIHZhbGlkIHZhbHVlcyB3aGVuIGl0J3MgYSBjb21wbGV4Ci0gICAgLy8gdHlwZSB3aXRoIHNpbXBsZSBjb250ZW50Ci0gICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgdHlwZSA9ICgoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKXR5cGUpLmdldFNpbXBsZVR5cGUoKTsKLSAgICB9Ci0gICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7ICAgICAgICAgCi0gICAgICBpZiAoVFlQRV9OQU1FX0JPT0xFQU4uZXF1YWxzKHR5cGUuZ2V0TmFtZSgpKSAmJiB0eXBlLmdldFNjaGVtYSgpLmdldFNjaGVtYUZvclNjaGVtYSgpID09IHR5cGUuZ2V0U2NoZW1hKCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hZGQoVFlQRV9WQUxVRV9UUlVFKTsKLSAgICAgICAgcmVzdWx0LmFkZChUWVBFX1ZBTFVFX0ZBTFNFKTsKLSAgICAgIH0gCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFNpbXBsZSB0eXBlcyBjYW4gYmUgb25lIG9mOiBhdG9taWMsIGxpc3Qgb3IgdW5pb24uCi0gICAgICAgIGludCB2YXJpZXR5VHlwZSA9ICgoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHR5cGUpLmdldFZhcmlldHkoKS5nZXRWYWx1ZSgpOwotCi0gICAgICAgIHN3aXRjaCAodmFyaWV0eVR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlIFhTRFZhcmlldHkuQVRPTUlDOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiBiYXNlVHlwZSA9IHR5cGUuZ2V0QmFzZVR5cGUoKTsKLSAgICAgICAgICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgISh0eXBlLmdldFNjaGVtYSgpLmdldFNjaGVtYUZvclNjaGVtYSgpID09IGJhc2VUeXBlLmdldFNjaGVtYSgpKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldEVudW1lcmF0ZWRWYWx1ZXNGb3JTaW1wbGVUeXBlKGJhc2VUeXBlLCByZXN1bHQpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldEVudW1lcmF0ZWRWYWx1ZXNGb3JTaW1wbGVUeXBlKHR5cGUsIHJlc3VsdCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgWFNEVmFyaWV0eS5MSVNUOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBpdGVtVHlwZURlZmluaXRpb24gPSAoKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB0eXBlKS5nZXRJdGVtVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgZ2V0RW51bWVyYXRlZFZhbHVlc0ZvclNpbXBsZVR5cGUoaXRlbVR5cGVEZWZpbml0aW9uLCByZXN1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBYU0RWYXJpZXR5LlVOSU9OOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICBMaXN0IG1lbWJlclR5cGVzID0gKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdHlwZSkuZ2V0TWVtYmVyVHlwZURlZmluaXRpb25zKCk7Ci0gICAgICAgICAgICAgIGlmIChtZW1iZXJUeXBlcyAhPSBudWxsICYmIG1lbWJlclR5cGVzLnNpemUoKSA+IDApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpID0gbWVtYmVyVHlwZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZSA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICBnZXRFbnVtZXJhdGVkVmFsdWVzRm9yU2ltcGxlVHlwZShzaW1wbGVUeXBlLCByZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAKLSAgICBTdHJpbmdbXSBhcnJheSA9IG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV07Ci0gICAgcmVzdWx0LnRvQXJyYXkoYXJyYXkpOwotICAgIHJldHVybiBhcnJheTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0RW51bWVyYXRlZFZhbHVlc0ZvclNpbXBsZVR5cGUoWFNEVHlwZURlZmluaXRpb24gdHlwZSwgTGlzdCByZXN1bHQpCi0gIHsKLSAgICBMaXN0IGVudW1lcmF0aW9uRmFjZXRzID0gKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdHlwZSkuZ2V0RW51bWVyYXRpb25GYWNldHMoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlbnVtZXJhdGlvbkZhY2V0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldCkgaS5uZXh0KCk7Ci0gICAgICBMaXN0IHZhbHVlcyA9IGVudW1GYWNldC5nZXRWYWx1ZSgpOwotICAgICAgZm9yIChJdGVyYXRvciBqID0gdmFsdWVzLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBqLm5leHQoKTsKLSAgICAgICAgaWYgKG8gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmICghcmVzdWx0LmNvbnRhaW5zKG8pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hZGQoby50b1N0cmluZygpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzIGZyb20gdGhlIGdpdmVuIGFubm90YXRpb24uIFdvcmtpbmcKLSAgICogd2l0aCBkb2N1bWVudGF0aW9uIGVsZW1lbnRzIHJlcXVpcmVzIGRyb3BwaW5nIGRvd24gaW50byB0aGUgRE9NIG1vZGVsLgotICAgKiAKLSAgICogQHBhcmFtIGFubm90YXRpb24gLQotICAgKiAgICAgICAgICBhbiBYU0RBbm5vdGF0aW9uIG5vZGUuCi0gICAqIEByZXR1cm4gYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIENNTm9kZUxpc3QgZ2V0RG9jdW1lbnRhdGlvbnMoWFNEQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotICB7Ci0gICAgQ01Ob2RlTGlzdEltcGwgZG9jdW1lbnRhdGlvbnMgPSBuZXcgQ01Ob2RlTGlzdEltcGwoKTsKLSAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3QgZG9jdW1lbnRhdGlvbnNFbGVtZW50cyA9IGFubm90YXRpb24uZ2V0VXNlckluZm9ybWF0aW9uKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkb2N1bWVudGF0aW9uc0VsZW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgZG9jdW1lbnRhdGlvbnMuZ2V0TGlzdCgpLmFkZChuZXcgRG9jdW1lbnRhdGlvbkltcGwoKEVsZW1lbnQpIGkubmV4dCgpKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBkb2N1bWVudGF0aW9uczsKLSAgfQotCi0gIC8qKgotICAgKiBBZGFwdGVkIGZyb20gcHVibGljIHN0YXRpYyBMaXN0IGZpbmRUeXBlc0Rlcml2ZWRGcm9tKFhTRFNjaGVtYSBzY2hlbWEsCi0gICAqIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpIGluIGNsYXNzIFhTRFNjaGVtYVF1ZXJ5VG9vbHMgZm91bmQgaW4KLSAgICogb3JnLmVjbGlwc2UueHNkIHBsdWdpbi4KLSAgICogCi0gICAqIEZpbmQgdHlwZURlZmluaXRpb25zIHRoYXQgZGVyaXZlIGZyb20gYSBnaXZlbiB0eXBlLgotICAgKiAKLSAgICogQHBhcmFtIHR5cGUKLSAgICogICAgICAgICAgdGhlIHR5cGUgZGVyaXZlZCBmcm9tCi0gICAqIEByZXR1cm4gTGlzdCBvZiBhbnkgWFNEVHlwZURlZmluaXRpb25zIGZvdW5kCi0gICAqLwotICBwdWJsaWMgc3RhdGljIExpc3QgZmluZFR5cGVzRGVyaXZlZEZyb20oWFNEVHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIEFycmF5TGlzdCB0eXBlc0Rlcml2ZWRGcm9tID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgewotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IHR5cGUuZ2V0U2NoZW1hKCk7Ci0gICAgICBTdHJpbmcgbG9jYWxOYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0gICAgICBpZiAoKG51bGwgIT0gc2NoZW1hKSAmJiAobnVsbCAhPSBsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAvLyBBIGhhbmR5IGNvbnZlbmllbmNlIG1ldGhvZCBxdWlja2x5IGdldHMgYWxsCi0gICAgICAgIC8vIHR5cGVEZWZpbml0aW9ucyB3aXRoaW4gb3VyIHNjaGVtYTsgbm90ZSB0aGF0Ci0gICAgICAgIC8vIHdoZXRoZXIgb3Igbm90IHRoaXMgcmV0dXJucyB0eXBlcyBpbiBpbmNsdWRlZCwKLSAgICAgICAgLy8gaW1wb3J0ZWQsIG9yIHJlZGVmaW5lZCBzY2hlbWFzIGlzIHN1YmplY3QgdG8gY2hhbmdlCi0gICAgICAgIExpc3QgdHlwZWRlZnMgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkZWZzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVkZWYgPSAoWFNEVHlwZURlZmluaXRpb24pIGl0ZXIubmV4dCgpOwotICAgICAgICAgIGlmICh0eXBlZGVmIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFdhbGsgdGhlIGJhc2VUeXBlcyBmcm9tIHRoaXMgdHlwZWRlZiBzZWVpbmcgaWYgYW55Ci0gICAgICAgICAgICAvLyBvZiB0aGVtIG1hdGNoIHRoZSByZXF1ZXN0ZWQgb25lCi0gICAgICAgICAgICBpZiAoaXNUeXBlRGVyaXZlZEZyb20odHlwZWRlZiwgbmFtZXNwYWNlLCBsb2NhbE5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBpdCwgcmV0dXJuIHRoZSBvcmlnaW5hbCBvbmUgYW5kIGNvbnRpbnVlCi0gICAgICAgICAgICAgIHR5cGVzRGVyaXZlZEZyb20uYWRkKHR5cGVkZWYpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHR5cGVzRGVyaXZlZEZyb207Ci0gIH0KLQotICAvKioKLSAgICogQWRhcHRlZCBmcm9tIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1R5cGVEZXJpdmVkRnJvbShYU0RUeXBlRGVmaW5pdGlvbgotICAgKiB0eXBlZGVmLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKSBpbiBjbGFzcyBYU0RTY2hlbWFRdWVyeVRvb2xzCi0gICAqIGZvdW5kIGluIG9yZy5lY2xpcHNlLnhzZCBwbHVnaW4uCi0gICAqIAotICAgKiBSZWN1cnNpdmUgd29ya2VyIG1ldGhvZCB0byBmaW5kIHR5cGVEZWZpbml0aW9ucyB0aGF0IGRlcml2ZSBmcm9tIGEgbmFtZWQKLSAgICogdHlwZS4KLSAgICogCi0gICAqIEBzZWUgI2ZpbmRUeXBlc0Rlcml2ZWRGcm9tKFhTRFNjaGVtYSwgU3RyaW5nLCBTdHJpbmcpCi0gICAqIEBwYXJhbSB0eXBlRGVmCi0gICAqICAgICAgICAgIHRvIHNlZSBpZiBpdCdzIGRlcml2ZWQgZnJvbQotICAgKiBAcGFyYW0gbmFtZXNwYWNlCi0gICAqICAgICAgICAgIGZvciB0aGUgdHlwZSBkZXJpdmVkIGZyb20KLSAgICogQHBhcmFtIGxvY2FsTmFtZQotICAgKiAgICAgICAgICBmb3IgdGhlIHR5cGUgZGVyaXZlZCBmcm9tCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBpdCBpczsgZmFsc2Ugb3RoZXJ3aXNlCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNUeXBlRGVyaXZlZEZyb20oWFNEVHlwZURlZmluaXRpb24gdHlwZWRlZiwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAgIC8vIFdhbGsgdGhlIGJhc2VUeXBlcyBmcm9tIHRoaXMgdHlwZWRlZiBzZWVpbmcgaWYgYW55Ci0gICAgLy8gb2YgdGhlbSBtYXRjaCB0aGUgcmVxdWVzdGVkIG9uZQotICAgIFhTRFR5cGVEZWZpbml0aW9uIGJhc2VUeXBlID0gdHlwZWRlZi5nZXRCYXNlVHlwZSgpOwotICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKQotICAgCXsKLSAgICAgIC8vIHR5cGVkZWYgaXMgYSByb290IHR5cGUgbGlrZSB4c2Q6YW55VHlwZSwgc28gaXQgaGFzIG5vIGJhc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLy8gQXMgdGhpcyBjb252ZW5pZW5jZSBtZXRob2QgaWYgb3VyIHBhcmFtZXRlcnMgbWF0Y2gKLSAgICBpZiAoYmFzZVR5cGUuaGFzTmFtZUFuZFRhcmdldE5hbWVzcGFjZShsb2NhbE5hbWUsIG5hbWVzcGFjZSkpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIFhTRFR5cGVEZWZpbml0aW9uIHJvb3RUeXBlID0gdHlwZWRlZi5nZXRSb290VHlwZSgpOwotCi0gICAgaWYgKHJvb3RUeXBlID09IGJhc2VUeXBlKQotICAgIHsKLSAgICAgIC8vIElmIHdlJ3ZlIGhpdCB0aGUgcm9vdCwgd2UgYXJlbid0IGRlcml2ZWQgZnJvbSBpdAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gTmVlZCB0byBjaGVjayBpZiB0aGUgYmFzZSB0eXBlIGlzIHJlZGVmaW5lZC9jaXJjdWxhcgotICAgICAgLy8gb3RoZXJ3aXNlIHRoaXMgd2lsbCBiZSBhbiBlbmRsZXNzIHJlY3Vyc2l2ZSBjYWxsLgotICAgICAgLy8gTW92ZWQuICBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxMzU0MwotICAgICAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggICAgIFhTRENvbnN0YW50cy5pc09ySXNEZXJpdmVkRnJvbShiYXNlVHlwZSwgbG9jYWxOYW1lLCBuYW1lc3BhY2UpOwotICAgICAgaWYgKHJvb3RUeXBlLmlzQ2lyY3VsYXIoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICAvLyBPdGhlcndpc2UgY29udGludWUgdG8gdHJhdmVyc2UgdXB3YXJkcwotICAgICAgcmV0dXJuIGlzVHlwZURlcml2ZWRGcm9tKGJhc2VUeXBlLCBuYW1lc3BhY2UsIGxvY2FsTmFtZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgY21ub2RlIG9mIHRoZSBzcGVjaWZpZWQgWE1MIFNjaGVtYSBub2RlLgotICAgKiAKLSAgICogQHBhcmFtIHRhcmdldCAtCi0gICAqICAgICAgICAgIGFuIFhNTCBTY2hlbWEgbm9kZQotICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGNtbm9kZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ01Ob2RlIGdldEFkYXB0ZXIoTm90aWZpZXIgbykKLSAgewotICAgIHJldHVybiAoQ01Ob2RlKSB4c2RBZGFwdGVyRmFjdG9yeUltcGwuYWRhcHQobyk7Ci0gIH0KLQotICAvKioKLSAgICogQWRhcHRlZCBmcm9tIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBucywgYm9vbGVhbiB3aXRoQ29sb24pIGluIGNsYXNzCi0gICAqIFR5cGVzSGVscGVyIGZvdW5kIGluIG9yZy5lY2xpcHNlLndzdC54c2QuZWRpdG9yIHBsdWdpbi4KLSAgICogCi0gICAqIEBwYXJhbSBzY2hlbWEgLQotICAgKiAgICAgICAgICB0aGUgcmVsZXZhbnQgc2NoZW1hCi0gICAqIEBwYXJhbSBucyAtCi0gICAqICAgICAgICAgIHRoZSByZWxldmFudCBuYW1lc3BhY2UKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByZWZpeChYU0RTY2hlbWEgc2NoZW1hLCBTdHJpbmcgbnMpCi0gIHsKLSAgICBTdHJpbmcga2V5ID0gIiI7Ci0gICAgaWYgKChzY2hlbWEgIT0gbnVsbCkgJiYgKG5zICE9IG51bGwpKQotICAgIHsKLSAgICAgIE1hcCBtYXAgPSBzY2hlbWEuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpOwotICAgICAgSXRlcmF0b3IgaXRlciA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBPYmplY3Qga2V5T2JqID0gaXRlci5uZXh0KCk7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG1hcC5nZXQoa2V5T2JqKTsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUudG9TdHJpbmcoKS5lcXVhbHMobnMpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGtleU9iaiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGtleSA9IGtleU9iai50b1N0cmluZygpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAga2V5ID0gIiI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBrZXk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBGYWN0b3J5IGZvciB0aGUgWFNEIGFkYXB0ZXIgbW9kZWwuIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaAotICAgKiBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBYU0RBZGFwdGVyRmFjdG9yeUltcGwgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwKLSAgewotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KQotICAgIHsKLSAgICAgIFhTRFN3aXRjaCB4c2RTd2l0Y2ggPSBuZXcgWFNEU3dpdGNoKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEV2lsZGNhcmQoWFNEV2lsZGNhcmQgb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBYU0RXaWxkY2FyZEFkYXB0ZXIob2JqZWN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyKG9iamVjdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RBdHRyaWJ1dGVVc2UoWFNEQXR0cmlidXRlVXNlIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgWFNEQXR0cmlidXRlVXNlQWRhcHRlcihvYmplY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNERWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBvYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbmV3IFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIob2JqZWN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCBvYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbmV3IFhTRE1vZGVsR3JvdXBBZGFwdGVyKG9iamVjdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RTY2hlbWEoWFNEU2NoZW1hIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgWFNEU2NoZW1hQWRhcHRlcihvYmplY3QpOwotICAgICAgICB9Ci0gICAgICB9OwotICAgICAgT2JqZWN0IG8gPSB4c2RTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpIHRhcmdldCk7Ci0gICAgICBBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIEFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IChBZGFwdGVyKSBvOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBUaHJlYWQuZHVtcFN0YWNrKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIHRhcmdldCkKLSAgICB7Ci0gICAgICByZXR1cm4gYWRhcHQodGFyZ2V0LCB0aGlzKTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIFhTREJhc2VBZGFwdGVyIC0tIGFuIGFic3RyYWN0IGJhc2Ugbm9kZSBpbiB0aGUgbW9kZWwuIEFsbCBvdGhlciBtb2RlbCBub2RlcwotICAgKiBhcmUgZGVyaXZlZCBmcm9tIGl0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBYU0RCYXNlQWRhcHRlciBleHRlbmRzIENNTm9kZUltcGwKLSAgewotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0SW1wbCBkb2N1bWVudGF0aW9uID0gbmV3IENNTm9kZUxpc3RJbXBsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBub2RlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBhbiBlbXB0eSBzdHJpbmcgdmFsdWUuCi0gICAgICogQWxsIGRlcml2ZWQgY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgZG8gbm90IHdhbnQgdGhlCi0gICAgICogZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICAgIHsKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgb2YgdGhlIGdpdmVuIGZhY3RvcnkgaXMgdGhlIGZhY3RvcnkgZm9yIHRoaXMgWFNEIGFkYXB0ZXIKLSAgICAgKiBtb2RlbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZSAtCi0gICAgICogICAgICAgICAgYSBmYWN0b3J5Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0eXBlIGlzIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoaXMgbW9kZWwuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSB4c2RBZGFwdGVyRmFjdG9yeUltcGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQgZm9yIHRoaXMgY2xhc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICByZXR1cm4gcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9OU19QUkVGSVhfUVVBTElGSUNBVElPTikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9OSUxMQUJMRSkgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9VU0VTX0xPQ0FMX0VMRU1FTlRfREVDTEFSQVRJT05TKQotICAgICAgICAgIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfRE9DVU1FTlRBVElPTikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9ET0NVTUVOVEFUSU9OX1NPVVJDRSkgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9ET0NVTUVOVEFUSU9OX0xBTkdVQUdFKQotICAgICAgICAgIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfTU9GX05PVElGSUVSKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RFRklOSVRJT05fSU5GTykgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9ERUZJTklUSU9OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0NNRE9DVU1FTlQpCi0gICAgICAgICAgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9JU19OQU1FX1NQQUNFX0FXQVJFKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX1NQRUMpIHx8IHN1cGVyLnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICdOaWxsYWJsZScgYXR0cmlidXRlLiBUaGlzIHJlcHJlc2VudHMgdGhlCi0gICAgICogbmlsbGFibGUgaW5mb3NldCBwcm9wZXJ0eS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuIEFsbCBkZXJpdmVkCi0gICAgICogY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgZG8gbm90IHdhbnQgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdOaWxsYWJsZScgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTmlsbGFibGUoKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbWRvY3VtZW50IHRoYXQgaXMgdGhlIG93bmVyIG9mIHRoaXMgY21ub2RlLiBUaGUgZGVmYXVsdAotICAgICAqIHZhbHVlIGlzIG51bGw7IEFsbCBkZXJpdmVkIGNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IGRvCi0gICAgICogbm90IHdhbnQgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY21kb2N1bWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYW4gZW1wdHkKLSAgICAgKiBDTU5vZGVMaXN0OyBBbGwgZGVyaXZlZCBjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBkbyBub3QKLSAgICAgKiB3YW50IHRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNTm9kZUxpc3QgZ2V0RG9jdW1lbnRhdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIGRvY3VtZW50YXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBuYW1lLiBSZXR1cm5zIG51bGwgaWYgdGhlCi0gICAgICogcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfQ01ET0NVTUVOVCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldENNRG9jdW1lbnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfRE9DVU1FTlRBVElPTikpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldERvY3VtZW50YXRpb24oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfVVNFU19MT0NBTF9FTEVNRU5UX0RFQ0xBUkFUSU9OUykpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEJvb2xlYW4uVFJVRTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfSVNfTkFNRV9TUEFDRV9BV0FSRSkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEJvb2xlYW4uVFJVRTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfTlNfUFJFRklYX1FVQUxJRklDQVRJT04pKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXROU1ByZWZpeFF1YWxpZmljYXRpb24oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfTklMTEFCTEUpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBpc05pbGxhYmxlKCkgPyB4c2lEb2N1bWVudC5uaWxBdHRyaWJ1dGUgOiBudWxsOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9NT0ZfTk9USUZJRVIpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXRLZXkoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfU1BFQykpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldFNwZWMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLSAgICAgICAgewotICAgICAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENNRG9jdW1lbnQoKTsKLSAgICAgICAgICBpZiAoY21Eb2N1bWVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYUFkYXB0ZXIpCi0gICAgICAgICAgewotICAgICAgICAgICAgQW5ub3RhdGlvbk1hcCBtYXAgPSAoKFhTRFNjaGVtYUFkYXB0ZXIpIGNtRG9jdW1lbnQpLmFubm90YXRpb25NYXA7Ci0gICAgICAgICAgICBpZiAobWFwICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyBzcGVjID0gZ2V0U3BlYygpOwotICAgICAgICAgICAgICBpZiAoc3BlYyAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbWFwLmdldFByb3BlcnR5KGdldFNwZWMoKSwgcHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgICAgCi0KLQotICAgIC8qCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZvcm0gW2F0dHJpYnV0ZV0gd2hpY2ggYWZmZWN0cyB0aGUgdGFyZ2V0Ci0gICAgICogbmFtZXNwYWNlIG9mIGxvY2FsbHkgc2NvcGVkIGZlYXR1cmVzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBudWxsLiBBbGwKLSAgICAgKiBkZXJpdmVkIGNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IGRvIG5vdCB3YW50IHRoZSBkZWZhdWx0Ci0gICAgICogdmFsdWUuIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmb3JtIFthdHRyaWJ1dGVdLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0TlNQcmVmaXhRdWFsaWZpY2F0aW9uKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZ2VuZXJhbCBYUGF0aCBleHByZXNzaW9uIGZvciB0aGUgbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgZ2VuZXJhbCBYUGF0aCBleHByZXNzaW9uIGZvciB0aGUgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNwZWMoKQotICAgIHsKLSAgICAgIHJldHVybiAiLy8iICsgZ2V0Tm9kZU5hbWUoKTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIFhTRFNjaGVtYUFkYXB0ZXIgaW1wbGVtZW50cyBDTURvY3VtZW50LiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbAotICAgKiBvYmplY3QgJ1NjaGVtYScuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTRFNjaGVtYUFkYXB0ZXIgZXh0ZW5kcyBYU0RCYXNlQWRhcHRlciBpbXBsZW1lbnRzIENNRG9jdW1lbnQKLSAgewotICAgIHByb3RlY3RlZCBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICAgIHByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgbmFtZWROb2RlTWFwOwotICAgIHByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgZW50aXR5Tm9kZU1hcDsKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbk1hcCBhbm5vdGF0aW9uTWFwID0gbmV3IEFubm90YXRpb25NYXAoKTsKLSAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIHN1YnN0aXR1dGlvbkdyb3VwVGFibGU7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0geHNkU2NoZW1hIC0KLSAgICAgKiAgICAgICAgICB0aGUgc2NoZW1hIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFhTRFNjaGVtYUFkYXB0ZXIoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgICB7Ci0gICAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlIHdoaWNoIGlzIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RTY2hlbWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlsZW5hbWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZmlsZW5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgewotICAgICAgLy8gU2VlIGJ1aWxkQ01Eb2N1bWVudCgpIGFib3ZlLgotICAgICAgcmV0dXJuIHhzZFNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgc3VwcG9ydGVkIGZvciB0aGlzIGNsYXNzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLQotICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgc3VwcG9ydGVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgewotICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfVEFSR0VUX05BTUVTUEFDRV9VUkkpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfSU1QT1JURURfTkFNRVNQQUNFX0lORk8pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfTkFNRVNQQUNFX0lORk8pCi0gICAgICAgICAgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9FTEVNRU5UX0ZPUk1fREVGQVVMVCkgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9BTk5PVEFUSU9OX01BUCkgfHwgc3VwZXIuc3VwcG9ydHMocHJvcGVydHlOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgYSBwcmVmaXggaXMgZ2xvYmFsbHkgcmVxdWlyZWQgZm9yIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSB4c2RTY2hlbWEgLQotICAgICAqICAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIHNjaGVtYSBub2RlLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhIHByZWZpeCBpcyBnbG9iYWxseSByZXF1aXJlZCBmb3IgZWxlbWVudHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNQcmVmaXhSZXF1aXJlZChYU0RTY2hlbWEgeHNkU2NoZW1hKQotICAgIHsKLSAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIGlmICh4c2RTY2hlbWEuaXNTZXRFbGVtZW50Rm9ybURlZmF1bHQoKSkKLSAgICAgICAgcmVzdWx0ID0gISh4c2RTY2hlbWEuZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkuZ2V0VmFsdWUoKSA9PSBYU0RGb3JtLlFVQUxJRklFRCk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgcHJvcGVydHkgbmFtZS4gUmV0dXJucyBudWxsIGlmIHRoZQotICAgICAqIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX1RBUkdFVF9OQU1FU1BBQ0VfVVJJKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0geHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9JTVBPUlRFRF9OQU1FU1BBQ0VfSU5GTykpCi0gICAgICB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZ2V0SW1wb3J0ZWROYW1lc3BhY2VJbmZvKHhzZFNjaGVtYSwgbGlzdCk7Ci0gICAgICAgIHJlc3VsdCA9IGxpc3Q7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX05BTUVTUEFDRV9JTkZPKSkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotICAgICAgICBpbmZvLnVyaSA9IHhzZFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgaW5mby5wcmVmaXggPSBnZXRQcmVmaXgoeHNkU2NoZW1hLCBpbmZvLnVyaSk7Ci0gICAgICAgIGluZm8ubG9jYXRpb25IaW50ID0gbnVsbDsgLy8gbm90ZSB0aGF0IHRoaXMgbG9jYXRpb25IaW50IGluZm8gaXMgbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgcm9vdCB4c2QgZmlsZQotICAgICAgICBpbmZvLmlzUHJlZml4UmVxdWlyZWQgPSBpc1ByZWZpeFJlcXVpcmVkKHhzZFNjaGVtYSk7Ci0gICAgICAgIGxpc3QuYWRkKGluZm8pOwotICAgICAgICBnZXRJbXBvcnRlZE5hbWVzcGFjZUluZm8oeHNkU2NoZW1hLCBsaXN0KTsKLSAgICAgICAgcmVzdWx0ID0gbGlzdDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfQ09NUExFVEVfTkFNRVNQQUNFX0lORk8pKQotICAgICAgewotICAgIAkgIHJlc3VsdCA9IGdldEFsbE5hbWVzcGFjZUluZm8oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfRUxFTUVOVF9GT1JNX0RFRkFVTFQpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkuZ2V0TmFtZSgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9BTk5PVEFUSU9OX01BUCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGFubm90YXRpb25NYXA7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJhbGxFbGVtZW50cyIpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXRBbGxFbGVtZW50cygpOwotICAgICAgfSAgCi0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aCgiZ2V0RWxlbWVudEZvclR5cGUjIikpCi0gICAgICB7Ci0gICAgICAgIGludCBpbmRleCA9IHByb3BlcnR5TmFtZS5pbmRleE9mKCIjIik7Ci0gICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IHByb3BlcnR5TmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxLCBwcm9wZXJ0eU5hbWUubGVuZ3RoKCkpOwotICAgICAgICAvLwotICAgICAgICAvLwotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IHhzZFNjaGVtYS5yZXNvbHZlVHlwZURlZmluaXRpb24odHlwZU5hbWUpOwotICAgICAgICBpZiAodGQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIExvY2FsRWxlbWVudFZpc2l0b3IgbG9jYWxFbGVtZW50VmlzaXRvciA9IG5ldyBMb2NhbEVsZW1lbnRWaXNpdG9yKCk7Ci0gICAgICAgICAgbG9jYWxFbGVtZW50VmlzaXRvci52aXNpdFR5cGVEZWZpbml0aW9uKHRkKTsKLSAgICAgICAgICByZXN1bHQgPSBsb2NhbEVsZW1lbnRWaXNpdG9yLmdldENNTmFtZWROb2RlTWFwKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2F0aGVyIGluZm9ybWF0aW9uIG9uIG5hbWVzcGFjZXMgdXNlZCBpbiBleHRlcm5hbCByZWZlcmVuY2VzLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0aGVYU0RTY2hlbWEgLQotICAgICAqICAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIHNjaGVtYSBub2RlCi0gICAgICogQHBhcmFtIGxpc3QgLQotICAgICAqICAgICAgICAgIHRoZSBsaXN0IG9mIGltcG9ydGVkIG5hbWVzcGFjZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2V0SW1wb3J0ZWROYW1lc3BhY2VJbmZvKFhTRFNjaGVtYSB0aGVYU0RTY2hlbWEsIExpc3QgbGlzdCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdGhlWFNEU2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hQ29udGVudCBjb250ZW50ID0gKFhTRFNjaGVtYUNvbnRlbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RJbXBvcnQpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RJbXBvcnQgeEltcG9ydCA9IChYU0RJbXBvcnQpIGNvbnRlbnQ7Ci0gICAgICAgICAgWFNEU2NoZW1hIGltcG9ydGVkWFNEU2NoZW1hID0geEltcG9ydC5nZXRSZXNvbHZlZFNjaGVtYSgpOwotICAgICAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0gICAgICAgICAgaW5mby51cmkgPSB4SW1wb3J0LmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgIGluZm8ucHJlZml4ID0gZ2V0UHJlZml4KGltcG9ydGVkWFNEU2NoZW1hLCBpbmZvLnVyaSk7Ci0gICAgICAgICAgaW5mby5sb2NhdGlvbkhpbnQgPSB4SW1wb3J0LmdldFNjaGVtYUxvY2F0aW9uKCk7Ci0gICAgICAgICAgaWYgKGltcG9ydGVkWFNEU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5mby5pc1ByZWZpeFJlcXVpcmVkID0gaXNQcmVmaXhSZXF1aXJlZChpbXBvcnRlZFhTRFNjaGVtYSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGxpc3QuYWRkKGluZm8pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBzZXQgb2YgbmFtZWQgKHRvcC1sZXZlbCkgZWxlbWVudCBkZWNsYXJhdGlvbnMgZm9yIHRoaXMgc2NoZW1hCi0gICAgICogbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgc2V0IG9mIG5hbWVkICh0b3AtbGV2ZWwpIGVsZW1lbnQgZGVjbGFyYXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpCi0gICAgewotICAgICAgaWYgKG5hbWVkTm9kZU1hcCA9PSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lZE5vZGVNYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBOb3RlIHRoYXQgaWYgd2UgY2FsbCB4c2RTY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpCi0gICAgICAgIC8vIHdlIGdldCAnbW9yZScgZWxlbWVudHMgdGhhbiB3ZSByZWFsbHkgd2FudCBzaW5jZSB3ZSBhbHNvCi0gICAgICAgIC8vIGdldCAnaW1wb3J0ZWQnIGVsZW1lbnRzLiAgQmVsb3cgd2UgdGVzdCB0byBlbnN1cmUgdGhlIGVsZW1lbnRzCi0gICAgICAgIC8vIGFjdHVhbGx5IGhhdmUgdGhlIHNhbWUgdGFyZ2V0IG5hbWVzcGFjZSBhcyB0aGUgc2NoZW1hLgotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0geHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGkubmV4dCgpOwotICAgICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCA/IHRhcmdldE5hbWVzcGFjZS5lcXVhbHMoZWQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpIDogZWQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcikgZ2V0QWRhcHRlcihlZCk7Ci0gICAgICAgICAgICBuYW1lZE5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KGFkYXB0ZXIuZ2V0Tm9kZU5hbWUoKSwgYWRhcHRlcik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbmFtZWROb2RlTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJ1aWx0LWluIGVudGl0eSBkZWNsYXJhdGlvbnMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYnVpbHQtaW4gZW50aXR5IGRlY2xhcmF0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKQotICAgIHsKLSAgICAgIGlmIChlbnRpdHlOb2RlTWFwID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGVudGl0eU5vZGVNYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0gICAgICAgIC8vIGFkZCB0aGUgYnVpbHQgaW4gZW50aXR5IGRlY2xhcmF0aW9ucwotICAgICAgICBlbnRpdHlOb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dCgiYW1wIiwgbmV3IENNRW50aXR5RGVjbGFyYXRpb25JbXBsKCJhbXAiLCAiJiIpKTsKLSAgICAgICAgZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoImx0IiwgbmV3IENNRW50aXR5RGVjbGFyYXRpb25JbXBsKCJsdCIsICI8IikpOwotICAgICAgICBlbnRpdHlOb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dCgiZ3QiLCBuZXcgQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwoImd0IiwgIj4iKSk7Ci0gICAgICAgIGVudGl0eU5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KCJxdW90IiwgbmV3IENNRW50aXR5RGVjbGFyYXRpb25JbXBsKCJxdW90IiwgIlwiIikpOwotICAgICAgICBlbnRpdHlOb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dCgiYXBvcyIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgiYXBvcyIsICInIikpOwotICAgICAgfQotICAgICAgcmV0dXJuIGVudGl0eU5vZGVNYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgbm9kZS4gVGhlIHR5cGVzIGFyZSBkZWZpbmVkIGluIENNTm9kZSBjbGFzcwotICAgICAqIChBTllfRUxFTUVOVCwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBEQVRBX1RZUEUsIERPQ1VNRU5ULAotICAgICAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEVOVElUWV9ERUNMQVJBVElPTiwgR1JPVVAsIE5BTUVfU1BBQ0Ugb3IKLSAgICAgKiBET0NVTUVOVEFUSU9OKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gRE9DVU1FTlQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIG51bGwuICEhISBXaHkgYXJlIHdlIG5vdCBpbXBsZW1lbnRpbmcgdGhpcz8/Pz8gQHJldHVybiBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBDTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhpcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoaXMuCi0gICAgICovCi0gICAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpCi0gICAgewotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRBbGxFbGVtZW50cygpCi0gICAgewotICAgICAgQ01OYW1lZE5vZGVNYXBJbXBsIG1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24paS5uZXh0KCk7Ci0gICAgICAgIG1hcC5wdXQoZWQpOyAgICAgICAgICAgCi0gICAgICAgIGFkZExvY2FsRWxlbWVudERlZmluaXRpb25zKG1hcCwgZWQpOyAgICAgICAgICAgICAgCi0gICAgICB9ICAgICAKLSAgICAgIHJldHVybiBtYXA7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGFkZExvY2FsRWxlbWVudERlZmluaXRpb25zKENNTmFtZWROb2RlTWFwSW1wbCBtYXAsIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBDTU5hbWVkTm9kZU1hcCBsb2NhbEVsZW1lbnRNYXAgPSBwYXJlbnRFbGVtZW50RGVjbGFyYXRpb24uZ2V0TG9jYWxFbGVtZW50cygpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gbG9jYWxFbGVtZW50TWFwLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uKWkubmV4dCgpOwotICAgICAgICBpZiAobWFwLmdldE5hbWVkSXRlbShlZC5nZXROb2RlTmFtZSgpKSA9PSBudWxsKQotICAgICAgICB7ICAKLSAgICAgICAgICBtYXAucHV0KGVkKTsgICAgICAgIAotICAgICAgICAgIGFkZExvY2FsRWxlbWVudERlZmluaXRpb25zKG1hcCwgZWQpOwotICAgICAgICB9ICAKLSAgICAgIH0gICAgICAgICAgICAgICAKLSAgICB9IAotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhIExpc3Qgb2YgTmFtZXNwYWNlSW5mbyBvYmplY3RzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIGdpdmVuIHNjaGVtYSAKLSAgICAgKiBhbmQgdGhlIHRhcmdldCBuYW1lc3BhY2VzIG9mIGFsbCBpdHMgcmVjdXJzaXZlbHkgaW1wb3J0ZWQvaW5jbHVkZWQgcmVmZXJlbmNlZCBzY2hlbWFzLiBBbGwgbmFtZXNwYWNlCi0gICAgICogcHJlZml4ZXMgaW4gdGhlIGxpc3QgYXJlIGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlLiBQcmVmaXggY29sbGl0aW9ucyBhcmUgcmVzb2x2ZWQgYnkgY29uY2F0ZW5hdGluZwotICAgICAqIGludGVnZXIgbnVtYmVycyB0byBlYWNoIHJlcGVhdGVkIHByZWZpeCBmb3VuZCBpLmUuIHRucywgdG5zMSwgdG5zMi4uLgotICAgICAqIEFsbCBzY2hlbWEgbG9jYXRpb25zIGluIHRoZSBsaXN0IGFyZSBmb3JtYXRlZCBhcyBlbmNvZGVkIFVSSXMgcmVsYXRpdmUgdG8gdGhlIGdpdmVuIHNjaGVtYS4KLSAgICAgKiBTY2hlbWFzIHRoYXQgYXJlIGltcG9ydGVkL2luY2x1ZGVkIGJ1dCBub3QgcmVmZXJlbmNlZCB3aWxsIG5vdCBhcHBlYXIgaW4gdGhlIGxpc3QuCi0gICAgICogQHJldHVybiBMaXN0IG9mIE5hbWVzcGFjZUluZm8gb2JqZWN0cwotICAgICAqIAotICAgICAqLwotCXB1YmxpYyBMaXN0IGdldEFsbE5hbWVzcGFjZUluZm8oKSB7Ci0JCUxpc3QgbmFtZXNwYWNlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCByZXNvdXJjZXMgID0geHNkU2NoZW1hLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0JCUl0ZXJhdG9yIGkgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaS5oYXNOZXh0KCkpIHsKLQkJCVhTRFJlc291cmNlSW1wbCByZXNvdXJjZSA9IChYU0RSZXNvdXJjZUltcGwpIGkubmV4dCgpOwotCQkJaWYocmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCVhTRFNjaGVtYSBzY2hlbWEgPSByZXNvdXJjZS5nZXRTY2hlbWEoKTsKLQkJCQlpZighaXNEYXRhSW5OYW1lc3BhY2VMaXN0KG5hbWVzcGFjZUxpc3QsIDAsIHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpIHsKLQkJCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLQkJCQkJaW5mby51cmkgPSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0JCQkJCWluZm8uaXNQcmVmaXhSZXF1aXJlZCA9IGlzUHJlZml4UmVxdWlyZWQoc2NoZW1hKTsKLQkJCQkJaW5mby5wcmVmaXggPSBnZXRQcmVmaXgoc2NoZW1hLHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0JCQkJCWlmKCJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLmVxdWFscyhpbmZvLnVyaSkpIHsKLSAgICAJCQkJCWluZm8ucHJlZml4ID0gInhtbCI7Ci0gICAgCQkJCX0gZWxzZSBpZigiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucyIuZXF1YWxzKGluZm8udXJpKSkgewotICAgIAkJCQkJaW5mby5wcmVmaXggPSAieG1sbnMiOwotICAgIAkJCQl9IGVsc2UgewotICAgIAkJCQkJaWYoaW5mby51cmkgIT0gbnVsbCAmJiBpbmZvLnVyaSAhPSAiIikgewotCSAgICAJCQkJCWludCBuID0gMTsKLQkgICAgCSAgICAJCQlpZihpbmZvLnByZWZpeCA9PSBudWxsIHx8IGluZm8ucHJlZml4LmVxdWFscygiIikpIHsKLQkgICAgCSAgICAJCQkJaW5mby5wcmVmaXggPSAicCI7Ci0JICAgIAkgICAgCQkJfQotCSAgICAJICAgIAkJCVN0cmluZyBwcmVmaXggPSBpbmZvLnByZWZpeDsKLQkgICAgCSAgICAJCQl3aGlsZShpc0RhdGFJbk5hbWVzcGFjZUxpc3QobmFtZXNwYWNlTGlzdCwgMSwgaW5mby5wcmVmaXgpKSB7Ci0JICAgIAkgICAgCQkJCWluZm8ucHJlZml4ID0gcHJlZml4ICsgbisrOwotCSAgICAJICAgIAkJCX0KLSAgICAJCQkJCX0KLSAgICAJCQkJfQotCSAgICAJCQlVUkkgcmVsYXRpdmUgPSBVUkkuY3JlYXRlVVJJKHhzZFNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpLCB0cnVlKTsKLQkJCQkJVVJJIGFic29sdXRlID0gVVJJLmNyZWF0ZVVSSShzY2hlbWEuZ2V0U2NoZW1hTG9jYXRpb24oKSwgdHJ1ZSk7Ci0JCQkJCVVSSSByZXNvbHZlZFJlbGF0aXZlID0gYWJzb2x1dGUuZGVyZXNvbHZlKHJlbGF0aXZlKTsKLQkJCQkJaW5mby5sb2NhdGlvbkhpbnQgPSByZXNvbHZlZFJlbGF0aXZlLnRvU3RyaW5nKCk7Ci0JICAgIAkJCW5hbWVzcGFjZUxpc3QuYWRkKGluZm8pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZXNwYWNlTGlzdDsJCi0JfQotCi0KLSAgICAvKioKLSAgICAgKiBTZWFyY2hlcyBmb3IgYSBnaXZlbiB2YWx1ZSBpbiBhIGxpc3Qgb2YgbmFtZXNwYWNlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlTGlzdDoJTGlzdCBvZiBOYW1lc3BhY2VJbmZvIG9iamVjdHMKLSAgICAgKiBAcGFyYW0gZGF0YToJCQkJaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIGRhdGEgaW4gdGhlIG5hbWVzcGFjZSBhcyBmb2xsb3dzOgotICAgICAqIAkJCQkJCQkJMDoJdXJpCi0gICAgICogCQkJCQkJCQkxOglwcmVmaXgKLSAgICAgKiAJCQkJCQkJCTI6CWxvY2F0aW9uSGludAotICAgICAqIEBwYXJhbSB2YWx1ZQkJCQlTdHJpbmcgY29udGFpbmluZyB0aGUgdmFsdWUgZm9yIHNlYXJjaAotICAgICAqIEByZXR1cm4JCQkJCXRydWUgaWYgdGhlIHZhbHVlIGlzIGZvdW5kLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEYXRhSW5OYW1lc3BhY2VMaXN0KExpc3QgbmFtZXNwYWNlTGlzdCwgaW50IGRhdGEsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAobmFtZXNwYWNlTGlzdCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpID0gbmFtZXNwYWNlTGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJTmFtZXNwYWNlSW5mbyBuYW1lc3BhY2VJbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotCQkJCXN3aXRjaChkYXRhKSB7Ci0JCQkJCWNhc2UgMDoJaWYgKG5hbWVzcGFjZUluZm8udXJpICE9IG51bGwgJiYgbmFtZXNwYWNlSW5mby51cmkuZXF1YWxzKHZhbHVlKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQkJY2FzZSAxOglpZiAobmFtZXNwYWNlSW5mby5wcmVmaXggIT0gbnVsbCAmJiBuYW1lc3BhY2VJbmZvLnByZWZpeC5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCQljYXNlIDI6CWlmIChuYW1lc3BhY2VJbmZvLmxvY2F0aW9uSGludCAhPSBudWxsICYmIG5hbWVzcGFjZUluZm8ubG9jYXRpb25IaW50LmVxdWFscyh2YWx1ZSkpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0gICAgCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIgaW1wbGVtZW50cyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLiBBIHJlcHJlc2VudGF0aW9uCi0gICAqIG9mIHRoZSBtb2RlbCBvYmplY3QgJ0F0dHJpYnV0ZSBVc2UnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uCi0gIHsKLSAgICAvLyBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFhNTCBTY2hlbWEgbm9kZQotICAgIHByb3RlY3RlZCBYU0RBdHRyaWJ1dGVVc2UgeHNkQXR0cmlidXRlVXNlOwotICAgIC8vIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlCi0gICAgcHJvdGVjdGVkIENNRGF0YVR5cGUgZGF0YVR5cGUgPSBuZXcgRGF0YVR5cGVJbXBsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0geHNkQXR0cmlidXRlVXNlIC0KLSAgICAgKiAgICAgICAgICB0aGUgWE1MIFNjaGVtYSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyKFhTREF0dHJpYnV0ZVVzZSB4c2RBdHRyaWJ1dGVVc2UpCi0gICAgewotICAgICAgdGhpcy54c2RBdHRyaWJ1dGVVc2UgPSB4c2RBdHRyaWJ1dGVVc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUga2V5IGZvciB0aGlzIGNtbm9kZSB3aGljaCBpcyB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hCi0gICAgICogbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkKLSAgICB7Ci0gICAgICByZXR1cm4geHNkQXR0cmlidXRlVXNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBnZW5lcmFsIFhQYXRoIGV4cHJlc3Npb24gZm9yIHRoZSBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBnZW5lcmFsIFhQYXRoIGV4cHJlc3Npb24gZm9yIHRoZSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3BlYygpCi0gICAgewotICAgICAgcmV0dXJuICIvL0AiICsgZ2V0QXR0ck5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBub2RlLiBUaGUgdHlwZXMgYXJlIGRlZmluZWQgaW4gQ01Ob2RlIGNsYXNzCi0gICAgICogKEFOWV9FTEVNRU5ULCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIERBVEFfVFlQRSwgRE9DVU1FTlQsCi0gICAgICogRUxFTUVOVF9ERUNMQVJBVElPTiwgRU5USVRZX0RFQ0xBUkFUSU9OLCBHUk9VUCwgTkFNRV9TUEFDRSBvcgotICAgICAqIERPQ1VNRU5UQVRJT04pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiBBVFRSSUJVVEVfREVDTEFSQVRJT047Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbm9kZS4gU2ltaWxhciB0byBnZXRBdHRyTmFtZSgpLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgewotICAgICAgcmV0dXJuIGdldEF0dHJOYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0RW51bUF0dHIgbWV0aG9kCi0gICAgICogCi0gICAgICogQHJldHVybiBqYXZhLnV0aWwuRW51bWVyYXRpb24KLSAgICAgKiBAZGVwcmVjYXRlZCAtLSB0byBiZSByZXBsYWNlZCBpbiBmdXR1cmUgd2l0aCBhZGRpdGlvbmFsIENNRGF0YVR5cGUKLSAgICAgKiAgICAgICAgICAgICBtZXRob2RzIChjdXJyZW50bHkgZm91bmQgb24gQ01EYXRhVHlwZUhlbHBlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0RW51bUF0dHIoKQotICAgIHsKLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgYXR0cmlidXRlLiBTaW1pbGFyIHRvIGdldE5vZGVOYW1lKCkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJOYW1lKCkKLSAgICB7Ci0gICAgICByZXR1cm4geHNkQXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIENNRGF0YVR5cGUgZ2V0QXR0clR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiBkYXRhVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZGVmYXVsdCBvciBmaXhlZCBjb25zdHJhaW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBkZWZhdWx0IG9yIGZpeGVkIGNvbnN0cmFpbnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKQotICAgIHsKLSAgICAgIHJldHVybiBkYXRhVHlwZS5nZXRJbXBsaWVkVmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB1c2FnZSBjb25zdHJhaW50IGZvciB0aGlzIGF0dHJpYnV0ZS4gVGhlIHVzYWdlcyBhcmUgZGVmaW5lZAotICAgICAqIGluIENNQXR0cmlidXRlRGVjbGFyYXRpb24gY2xhc3MgKE9QVElPTkFMLCBSRVFVSVJFRCwgRklYRUQgb3IKLSAgICAgKiBQUk9ISUJJVEVEKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB1c2FnZSBjb25zdHJhaW50IGZvciB0aGlzIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFVzYWdlKCkKLSAgICB7Ci0gICAgICBpbnQgdXNlS2luZCA9IE9QVElPTkFMOwotICAgICAgc3dpdGNoICh4c2RBdHRyaWJ1dGVVc2UuZ2V0VXNlKCkuZ2V0VmFsdWUoKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeS5PUFRJT05BTCA6IHsKLSAgICAgICAgICB1c2VLaW5kID0gT1BUSU9OQUw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeS5QUk9ISUJJVEVEIDogewotICAgICAgICAgIHVzZUtpbmQgPSBQUk9ISUJJVEVEOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkuUkVRVUlSRUQgOiB7Ci0gICAgICAgICAgdXNlS2luZCA9IFJFUVVJUkVEOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdXNlS2luZDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmb3JtIFthdHRyaWJ1dGVdIHdoaWNoIGFmZmVjdHMgdGhlIHRhcmdldAotICAgICAqIG5hbWVzcGFjZSBvZiBsb2NhbGx5IHNjb3BlZCBmZWF0dXJlcy4gSWYgdGhlIGZvcm0gaXMgbm90IHNldCBvbiB0aGlzCi0gICAgICogYXR0cmlidXRlLCB0aGVuIHNlZSBpZiB0aGVyZSBpcyBhIGdsb2JhbGx5IGRlZmluZWQgZGVmYXVsdC4gQHJldHVybiB0aGUKLSAgICAgKiB2YWx1ZSBvZiB0aGUgZm9ybSBbYXR0cmlidXRlXS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldE5TUHJlZml4UXVhbGlmaWNhdGlvbigpCi0gICAgewotICAgICAgU3RyaW5nIGZvcm0gPSBudWxsOwotICAgICAgaWYgKHhzZEF0dHJpYnV0ZVVzZS5nZXRDb250ZW50KCkgIT0geHNkQXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpCi0gICAgICB7Ci0gICAgICAJZm9ybSA9ICAicXVhbGlmaWVkIjsKLSAgICAgIH0JCi0gICAgICBlbHNlIGlmICh4c2RBdHRyaWJ1dGVVc2UuZ2V0Q29udGVudCgpLmlzU2V0Rm9ybSgpKQotICAgICAgewotICAgICAgICBmb3JtID0geHNkQXR0cmlidXRlVXNlLmdldENvbnRlbnQoKS5nZXRGb3JtKCkuZ2V0TmFtZSgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0geHNkQXR0cmlidXRlVXNlLmdldFNjaGVtYSgpOwotICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgZm9ybSA9IHNjaGVtYS5nZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpLmdldE5hbWUoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmb3JtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0IGdldERvY3VtZW50YXRpb24oKQotICAgIHsKLSAgICAgIC8vIENoZWNrIGlmIGl0IGlzIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2UgZmlyc3QKLSAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHhzZEF0dHJpYnV0ZVJlZiA9IHhzZEF0dHJpYnV0ZVVzZS5nZXRDb250ZW50KCk7Ci0gICAgICBpZiAoeHNkQXR0cmlidXRlUmVmICE9IG51bGwgJiYgeHNkQXR0cmlidXRlUmVmLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIGl0IGhhcyBhbm5vdGF0aW9ucwotICAgICAgICBib29sZWFuIHJlZkhhc0RvY3VtZW50YXRpb24gPSBmYWxzZTsKLSAgICAgICAgWFNEQW5ub3RhdGlvbiByZWZBbm5vdGF0aW9uID0geHNkQXR0cmlidXRlUmVmLmdldEFubm90YXRpb24oKTsKLSAgICAgICAgaWYgKHJlZkFubm90YXRpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vIERldGVybWluZSBpZiB0aGVyZSBpcyBkb2N1bWVudGF0aW9uCi0gICAgICAgICAgaWYgKCFyZWZBbm5vdGF0aW9uLmdldFVzZXJJbmZvcm1hdGlvbigpLmlzRW1wdHkoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZWZIYXNEb2N1bWVudGF0aW9uID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlZkhhc0RvY3VtZW50YXRpb24pCi0gICAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25zKHJlZkFubm90YXRpb24pOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBPdGhlcndpc2UgcHJvY2VlZCB3aXRoIGdldHRpbmcgdGhlIGRvY3VtZW50YXRpb24gYXMgdXN1YWwKLSAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHhzZEF0dHJpYnV0ZURlY2xhcmF0aW9uID0gIHhzZEF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOyAgICAgIAotICAgICAgWFNEQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0geHNkQXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbigpOwotICAgICAgCi0gICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbnMoYW5ub3RhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY21kb2N1bWVudCB0aGF0IGlzIHRoZSBvd25lciBvZiB0aGlzIGNtbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjbWRvY3VtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpCi0gICAgewotICAgICAgcmV0dXJuIChDTURvY3VtZW50KSBnZXRBZGFwdGVyKHhzZEF0dHJpYnV0ZVVzZS5nZXRTY2hlbWEoKSk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIuRGF0YVR5cGVJbXBsIEFuIGlubmVyIGNsYXNzIHRvIGhvbGQgdHlwZQotICAgICAqIGluZm9ybWF0aW9uIGZvciB0aGlzIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgRGF0YVR5cGVJbXBsIGltcGxlbWVudHMgQ01EYXRhVHlwZQotICAgIHsKLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgbm9kZS4gVGhlIHR5cGVzIGFyZSBkZWZpbmVkIGluIENNTm9kZSBjbGFzcwotICAgICAgICogKEFOWV9FTEVNRU5ULCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIERBVEFfVFlQRSwgRE9DVU1FTlQsCi0gICAgICAgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBFTlRJVFlfREVDTEFSQVRJT04sIEdST1VQLCBOQU1FX1NQQUNFIG9yCi0gICAgICAgKiBET0NVTUVOVEFUSU9OKS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIG5vZGUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICAgICAgewotICAgICAgICByZXR1cm4gQ01Ob2RlLkRBVEFfVFlQRTsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHlwZS4gU2FtZSBhcyBnZXREYXRhVHlwZU5hbWUoKS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHR5cGUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICAgICAgewotICAgICAgICByZXR1cm4gZ2V0RGF0YVR5cGVOYW1lKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyBmYWxzZS4gVGhpcyBjbGFzcyBkb2VzIG5vdCBzdXBwb3J0IGFueSBwcm9wZXJ0aWVzLgotICAgICAgICogCi0gICAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAgICogQHJldHVybiBmYWxzZS4KLSAgICAgICAqLwotICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgbnVsbC4gVGhpcyBjbGFzcyBkb2VzIG5vdCBzdXBwb3J0IGFueSBwcm9wZXJ0aWVzLgotICAgICAgICogCi0gICAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAgICogQHJldHVybiBudWxsLgotICAgICAgICovCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0eXBlLiBTYW1lIGFzIGdldE5vZGVOYW1lKCkuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0eXBlLgotICAgICAgICovCi0gICAgICBwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlTmFtZSgpCi0gICAgICB7Ci0gICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNjID0geHNkQXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gc2MuZ2V0TmFtZSgpOwotICAgICAgICByZXR1cm4gdHlwZU5hbWUgIT0gbnVsbCA/IHR5cGVOYW1lIDogInN0cmluZyI7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUga2luZCBvZiBjb25zdHJhaW50OiBub25lLCBkZWZhdWx0IG9yIGZpeGVkLiBUaGUga2luZHMgYXJlCi0gICAgICAgKiBkZWZpbmVkIGluIENNRGF0YVR5cGUgY2xhc3MgKElNUExJRURfVkFMVUVfTk9ORSwgSU1QTElFRF9WQUxVRV9GSVhFRCBvcgotICAgICAgICogSU1QTElFRF9WQUxVRV9ERUZBVUxUKS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUga2luZCBvZiBjb25zdHJhaW50OiBub25lLCBkZWZhdWx0IG9yIGZpeGVkLgotICAgICAgICovCi0gICAgICBwdWJsaWMgaW50IGdldEltcGxpZWRWYWx1ZUtpbmQoKQotICAgICAgewotICAgICAgICBpbnQgcmVzdWx0ID0gSU1QTElFRF9WQUxVRV9OT05FOwotICAgICAgICBpZiAoeHNkQXR0cmlidXRlVXNlLmlzU2V0Q29uc3RyYWludCgpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHhzZEF0dHJpYnV0ZVVzZS5nZXRDb25zdHJhaW50KCkuZ2V0VmFsdWUoKSA9PSBYU0RDb25zdHJhaW50LkRFRkFVTFQpCi0gICAgICAgICAgICByZXN1bHQgPSBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQ7Ci0gICAgICAgICAgZWxzZSBpZiAoeHNkQXR0cmlidXRlVXNlLmdldENvbnN0cmFpbnQoKS5nZXRWYWx1ZSgpID09IFhTRENvbnN0cmFpbnQuRklYRUQpCi0gICAgICAgICAgICByZXN1bHQgPSBJTVBMSUVEX1ZBTFVFX0ZJWEVEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgb3IgZml4ZWQgY29uc3RyYWludC4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgb3IgZml4ZWQgY29uc3RyYWludC4KLSAgICAgICAqLwotICAgICAgcHVibGljIFN0cmluZyBnZXRJbXBsaWVkVmFsdWUoKQotICAgICAgewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKHhzZEF0dHJpYnV0ZVVzZS5pc1NldENvbnN0cmFpbnQoKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IHhzZEF0dHJpYnV0ZVVzZS5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIGVudW1lcmF0ZWQgdmFsdWVzIGZvciB0aGUgYXR0cmlidXRlIHR5cGUuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIGVudW1lcmF0ZWQgdmFsdWVzIGZvciB0aGUgYXR0cmlidXRlIHR5cGUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFbnVtZXJhdGVkVmFsdWVzKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEVudW1lcmF0ZWRWYWx1ZXNGb3JUeXBlKGdldFhTRFR5cGUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogR2VuZXJhdGUgYSB2YWxpZCB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSBiYXNlZCBvbiBpdHMgdHlwZS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiBhIHZhbGlkIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIGJhc2VkIG9uIGl0cyB0eXBlLgotICAgICAgICovCi0gICAgICBwdWJsaWMgU3RyaW5nIGdlbmVyYXRlSW5zdGFuY2VWYWx1ZSgpCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSB4c2RBdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgICAgICAgcmV0dXJuIFhTRFR5cGVVdGlsLmdldEluc3RhbmNlVmFsdWUoYXR0ci5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIHR5cGUgZGVmaW5pdGlvbi4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIHR5cGUgZGVmaW5pdGlvbi4KLSAgICAgICAqLwotICAgICAgcHJvdGVjdGVkIFhTRFR5cGVEZWZpbml0aW9uIGdldFhTRFR5cGUoKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0geHNkQXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgICAgIHJldHVybiBhdHRyLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgfQotICAgIH0KLSAgfQotICAvKioKLSAgICogRWxlbWVudERlY2xhcmF0aW9uQmFzZUltcGwgaW1wbGVtZW50cyBDTUVsZW1lbnREZWNsYXJhdGlvbi4gVGhpcyBpcyB0aGUKLSAgICogYmFzZSBjbGFzcyBmb3IgWFNERWxlbWVudERlY2xhcmF0aW9uIGFuZCBEZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uSW1wbC4KLSAgICogCi0gICAqIEFic3RyYWN0IG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBhcmU6IHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0S2V5KCk7IHB1YmxpYwotICAgKiBhYnN0cmFjdCBPYmplY3QgZ2V0TlNQcmVmaXhRdWFsaWZpY2F0aW9uKCk7IHB1YmxpYyBhYnN0cmFjdAotICAgKiBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCk7IHB1YmxpYyBhYnN0cmFjdAotICAgKiBYU0RUeXBlRGVmaW5pdGlvbiBnZXRYU0RUeXBlKCk7IHB1YmxpYyBhYnN0cmFjdCBMaXN0IGdldFhTSVR5cGVzKCk7IHB1YmxpYwotICAgKiBhYnN0cmFjdCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXREZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uKFN0cmluZwotICAgKiB1cmlRdWFsaWZpZWRUeXBlTmFtZSk7IHB1YmxpYyBhYnN0cmFjdCBDTU5vZGUgZ2V0RGVmaW5pdGlvbigpOyBwdWJsaWMKLSAgICogYWJzdHJhY3QgU3RyaW5nIGdldERlZmluaXRpb25JbmZvKCk7IHB1YmxpYyBhYnN0cmFjdCBDTU5vZGVMaXN0SW1wbAotICAgKiBnZXRTdWJzdGl0dXRpb25Hcm91cCgpOwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBFbGVtZW50RGVjbGFyYXRpb25CYXNlSW1wbCBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01FbGVtZW50RGVjbGFyYXRpb24KLSAgewotICAgIHByb3RlY3RlZCBDTURhdGFUeXBlIGRhdGFUeXBlID0gbmV3IERhdGFUeXBlSW1wbCgpOwotICAgIHByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcCBuYW1lZE5vZGVNYXA7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgWFNERWxlbWVudERlY2xhcmF0aW9uIGdldFJlc29sdmVkWFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBub2RlLiBUaGUgdHlwZXMgYXJlIGRlZmluZWQgaW4gQ01Ob2RlIGNsYXNzCi0gICAgICogKEFOWV9FTEVNRU5ULCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIERBVEFfVFlQRSwgRE9DVU1FTlQsCi0gICAgICogRUxFTUVOVF9ERUNMQVJBVElPTiwgRU5USVRZX0RFQ0xBUkFUSU9OLCBHUk9VUCwgTkFNRV9TUEFDRSBvcgotICAgICAqIERPQ1VNRU5UQVRJT04pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiBFTEVNRU5UX0RFQ0xBUkFUSU9OOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG5vZGUuIFRoZSBzYW1lIGFzIGdldEVsZW1lbnROYW1lKCkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0RWxlbWVudE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudC4gVGhlIHNhbWUgYXMgZ2V0Tm9kZU5hbWUoKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVzdWx0ID0gZ2V0UmVzb2x2ZWRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5nZXROYW1lKCk7Ci0gICAgICByZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiAiIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZCBmb3IgdGhpcyBjbGFzcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX1hTSVRZUEVTKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RFUklWRURfRUxFTUVOVF9ERUNMQVJBVElPTikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9TVUJTVElUVVRJT05fR1JPVVApCi0gICAgICAgICAgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9BQlNUUkFDVCkgfHwgc3VwZXIuc3VwcG9ydHMocHJvcGVydHlOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlIHdoaWNoIGlzIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRLZXkoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBhdHRyaWJ1dGVzIGRlZmluZWQgZm9yIHRoaXMgZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2YgYXR0cmlidXRlcyBkZWZpbmVkIGZvciB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKQotICAgIHsKLSAgICAgIENNTmFtZWROb2RlTWFwSW1wbCBtYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IGdldFhTRFR5cGUoKTsKLSAgICAgIGdldEF0dHJpYnV0ZXMobWFwLCB0ZCk7Ci0gICAgICBhZGRYU0lUeXBlQXR0cmlidXRlKG1hcCk7Ci0gICAgICByZXR1cm4gbWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdhdGhlciB0aGUgc2V0IG9mIGF0dHJpYnV0ZXMgZGVmaW5lZCBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAgLQotICAgICAqICAgICAgICAgIHVzZWQgZm9yIHJldHVybmluZyB0aGUgc2V0IG9mIGF0dHJpYnV0ZXMuCi0gICAgICogQHBhcmFtIHhzZFR5cGVEZWZpbml0aW9uIC0KLSAgICAgKiAgICAgICAgICB0aGUgdHlwZSBkZWZpbml0aW9uIGZvciB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2V0QXR0cmlidXRlcyhDTU5hbWVkTm9kZU1hcEltcGwgbWFwLCBYU0RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBpZiAoeHNkVHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdGQgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB4c2RUeXBlRGVmaW5pdGlvbjsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gY3RkLmdldEF0dHJpYnV0ZVVzZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgeHNkQXR0cmlidXRlVXNlID0gKFhTREF0dHJpYnV0ZVVzZSkgaS5uZXh0KCk7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlVXNlQWRhcHRlciBhZGFwdGVyID0gKFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIpIGdldEFkYXB0ZXIoeHNkQXR0cmlidXRlVXNlKTsKLSAgICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuZ2V0Tm9kZU5hbWUoKSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1hcC5nZXRIYXNodGFibGUoKS5wdXQoYWRhcHRlci5nZXROb2RlTmFtZSgpLCBhZGFwdGVyKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IGZvciB0aGlzIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udGVudCBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpCi0gICAgewotICAgICAgQ01Db250ZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IGdldFhTRFR5cGUoKTsKLSAgICAgIGlmICh0ZCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgRGVyaXZlZENoaWxkVmlzaXRvciBkY3YgPSBuZXcgRGVyaXZlZENoaWxkVmlzaXRvcih0ZCk7Ci0gICAgICAgIGRjdi52aXNpdFR5cGVEZWZpbml0aW9uKHRkKTsKLSAgICAgICAgQ01Ob2RlTGlzdCBub2RlTGlzdCA9IGRjdi5nZXRDaGlsZE5vZGVMaXN0KCk7Ci0gICAgICAgIGlmIChub2RlTGlzdC5nZXRMZW5ndGgoKSA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBuZXcgQ01Hcm91cEltcGwobm9kZUxpc3QsIENNR3JvdXAuU0VRVUVOQ0UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IChDTUNvbnRlbnQpIG5vZGVMaXN0Lml0ZW0oMCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGVudCB0eXBlIG9mIHRoaXMgZWxlbWVudC4gVGhlIGNvbnRlbnQgdHlwZSBpcyBkZWZpbmVkIGluCi0gICAgICogQ01FbGVtZW50RGVjbGFyYXRpb24gKEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEgb3IgQ0RBVEEpLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpCi0gICAgewotICAgICAgaW50IGNvbnRlbnRUeXBlID0gRU1QVFk7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IGdldFhTRFR5cGUoKTsKLSAgICAgIGlmICh0ZCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSB0ZC5nZXROYW1lKCk7Ci0gICAgICAgIGlmICh0eXBlTmFtZSAhPSBudWxsICYmIHR5cGVOYW1lLmVxdWFscygiYW55VHlwZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgY29udGVudFR5cGUgPSBBTlk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgY29udGVudFR5cGUgPSBQQ0RBVEE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHRkIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RDb250ZW50VHlwZUNhdGVnb3J5IGNhdGVnb3J5ID0gKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHRkKS5nZXRDb250ZW50VHlwZUNhdGVnb3J5KCk7Ci0gICAgICAgIGlmIChjYXRlZ29yeSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc3dpdGNoIChjYXRlZ29yeS5nZXRWYWx1ZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgWFNEQ29udGVudFR5cGVDYXRlZ29yeS5FTEVNRU5UX09OTFkgOgotICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IEVMRU1FTlQ7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBYU0RDb250ZW50VHlwZUNhdGVnb3J5LkVNUFRZIDoKLSAgICAgICAgICAgICAgY29udGVudFR5cGUgPSBFTVBUWTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkuTUlYRUQgOgotICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IE1JWEVEOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgWFNEQ29udGVudFR5cGVDYXRlZ29yeS5TSU1QTEUgOgotICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IFBDREFUQTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gY29udGVudFR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01EYXRhVHlwZSBnZXREYXRhVHlwZSgpCi0gICAgewotICAgICAgQ01EYXRhVHlwZSByZXN1bHQgPSBudWxsOwotICAgICAgaW50IGNvbnRlbnRUeXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgIGJvb2xlYW4gaGFzRGF0YVR5cGUgPSBjb250ZW50VHlwZSA9PSBQQ0RBVEEgfHwgY29udGVudFR5cGUgPT0gTUlYRUQ7Ci0gICAgICBpZiAoaGFzRGF0YVR5cGUpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGRhdGFUeXBlOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiAnTWluIE9jY3VycycgYXR0cmlidXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiMSIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdNaW4gT2NjdXJzJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNaW5PY2N1cigpCi0gICAgewotICAgICAgcmV0dXJuIGdldE1pbk9jY3VycyhnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICdNYXggT2NjdXJzJyBhdHRyaWJ1dGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzCi0gICAgICogIjEiLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTWF4IE9jY3VycycgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRNYXhPY2N1cnMoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlZmVyZW5jZWQgZWxlbWVudCBkZWNsYXJhdGlvbiBpZiB0aGlzIGlzIGFuIGVsZW1lbnQKLSAgICAgKiByZWZlcmVuY2UuIE90aGVyd2lzZSBpdCByZXR1cm5zIGl0c2VsZi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IENNTm9kZSBnZXREZWZpbml0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGluZGljYXRpbmcgd2hldGhlciB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBpcyBnbG9iYWwgb3IKLSAgICAgKiBsb2NhbC4gUmV0dXJucyBudWxsIGlmIHRoaXMgaXMgYW4gZWxlbWVudCByZWZlcmVuY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHN0cmluZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gaXMgZ2xvYmFsIG9yCi0gICAgICogICAgICAgICBsb2NhbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERlZmluaXRpb25JbmZvKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50cyBsb2NhbCB0byB0aGlzIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudHMgbG9jYWwgdG8gdGhpcyBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRMb2NhbEVsZW1lbnRzKCkKLSAgICB7Ci0gICAgICBpZiAobmFtZWROb2RlTWFwID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIExvY2FsRWxlbWVudFZpc2l0b3IgbG9jYWxFbGVtZW50VmlzaXRvciA9IG5ldyBMb2NhbEVsZW1lbnRWaXNpdG9yKCk7Ci0gICAgICAgIGxvY2FsRWxlbWVudFZpc2l0b3IudmlzaXRUeXBlRGVmaW5pdGlvbihnZXRYU0RUeXBlKCkpOwotICAgICAgICBuYW1lZE5vZGVNYXAgPSBsb2NhbEVsZW1lbnRWaXNpdG9yLmdldENNTmFtZWROb2RlTWFwKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbmFtZWROb2RlTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgcHJvcGVydHkgbmFtZS4gUmV0dXJucyBudWxsIGlmIHRoZQotICAgICAqIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RFRklOSVRJT05fSU5GTykpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldERlZmluaXRpb25JbmZvKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RFRklOSVRJT04pKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXREZWZpbml0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX1hTSVRZUEVTKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0WFNJVHlwZXMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKFBST1BFUlRZX0RFUklWRURfRUxFTUVOVF9ERUNMQVJBVElPTikpCi0gICAgICB7Ci0gICAgICAgIGludCBpbmRleCA9IHByb3BlcnR5TmFtZS5pbmRleE9mKCI9Iik7Ci0gICAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyB1cmlRdWFsaWZpZWRUeXBlTmFtZSA9IHByb3BlcnR5TmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAgICAgICByZXN1bHQgPSBnZXREZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uKHVyaVF1YWxpZmllZFR5cGVOYW1lKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9TVUJTVElUVVRJT05fR1JPVVApKQotICAgICAgewotICAgICAgICByZXR1cm4gZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfU1VCU1RJVFVUSU9OX0dST1VQX1ZBTFVFKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFN1YnN0aXR1dGlvbkdyb3VwVmFsdWUoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfQUJTVFJBQ1QpKQotICAgICAgewotICAgICAgICByZXR1cm4gZ2V0QWJzdHJhY3QoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICdOaWxsYWJsZScgYXR0cmlidXRlLiBUaGlzIHJlcHJlc2VudHMgdGhlCi0gICAgICogbmlsbGFibGUgaW5mb3NldCBwcm9wZXJ0eS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdOaWxsYWJsZScgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTmlsbGFibGUoKQotICAgIHsKLSAgICAgIGlmIChnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5pc1NldE5pbGxhYmxlKCkpCi0gICAgICAgIHJldHVybiBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5pc05pbGxhYmxlKCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3Vic3RpdHV0aW9uR3JvdXAgYXR0cmlidXRlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdmFsdWUgb2YgdGhlIHN1YnN0aXR1dGlvbkdyb3VwIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3Vic3RpdHV0aW9uR3JvdXBWYWx1ZSgpCi0gICAgewotICAgIAlYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uID0gZ2V0UmVzb2x2ZWRYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAJaWYoeHNkRWxlbWVudERlY2xhcmF0aW9uICE9IG51bGwpCi0gICAgCXsKLSAgICAJCUVsZW1lbnQgZWxlbWVudCA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRFbGVtZW50KCk7Ci0gICAgCQlpZihlbGVtZW50ICE9IG51bGwpCi0gICAgCQl7Ci0gICAgCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5TVUJTVElUVVRJT05HUk9VUF9BVFRSSUJVVEUpOwotICAgIAkJfQotICAgIAl9Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZWxlbWVudCBpcyAnQWJzdHJhY3QnLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyAnQWJzdHJhY3QnLgotICAgICAqLwotICAgIHB1YmxpYyBCb29sZWFuIGdldEFic3RyYWN0KCkKLSAgICB7Ci0gICAgICBib29sZWFuIHJlc3VsdCA9IGdldFJlc29sdmVkWFNERWxlbWVudERlY2xhcmF0aW9uKCkuaXNBYnN0cmFjdCgpOwotICAgICAgLy8gVE9ETy4uLiBob3cgZG8gd2UgaGFuZGxlIGVsZW1lbnRzIHdpdGggYWJzdHJhY3QgdHlwZSdzID8KLSAgICAgIHJldHVybiByZXN1bHQgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdCBnZXREb2N1bWVudGF0aW9uKCkKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uID0gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgICBYU0RBbm5vdGF0aW9uIGFubm90YXRpb24gPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbigpOwotICAgICAgCi0gICAgICAvLyBOZWVkIHRvIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IGRvY3VtZW50YXRpb24gZWxlbWVudHMuICBKdXN0IGJlY2F1c2UKLSAgICAgIC8vIHRoZXJlIGlzIGFuIGFubm90YXRpb24gZWxlbWVudCBkb2Vzbid0IG1lYW4gdGhhdCB0aGUgZG9jdW1lbnRhdGlvbiBlbGVtZW50IGlzCi0gICAgICAvLyBhbHNvIHRoZXJlLCBhcyBpdCBjb3VsZCBjb250YWluIGp1c3QgYXBwaW5mbyBlbGVtZW50cy4KLSAgICAgIAotICAgICAgYm9vbGVhbiBoYXNEb2N1bWVudGF0aW9uID0gZmFsc2U7Ci0gICAgICAKLSAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAJICBpZiAoIWFubm90YXRpb24uZ2V0VXNlckluZm9ybWF0aW9uKCkuaXNFbXB0eSgpKSB7Ci0gICAgCQkgIGhhc0RvY3VtZW50YXRpb24gPSB0cnVlOwotICAgIAkgIH0KLSAgICAgIH0KLQotICAgICAgLy8gVGhlIGVsZW1lbnQgbWF5IG5vdCBoYXZlIGFubm90YXRpb24gYW5kIGlmIGl0IGlzIHJlZmVyZW5jZWQKLSAgICAgIC8vIGNoZWNrIHRoZSByZWZlcmVuY2VkIGF0dHJpYnV0ZSBmb3IgdGhlIGFubm90YXRpb25zLgotICAgICAgaWYgKGhhc0RvY3VtZW50YXRpb24gPT0gZmFsc2UpIHsKLSAgICAgICAgICBpZiAoeHNkRWxlbWVudERlY2xhcmF0aW9uLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgCSAgYW5ub3RhdGlvbiA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldEFubm90YXRpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9ucyhhbm5vdGF0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgdHlwZSBkZWZpbml0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSB0eXBlIGRlZmluaXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFhTRFR5cGVEZWZpbml0aW9uIGdldFhTRFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHR5cGUgbmFtZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgdHlwZSBuYW1lcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdCBnZXRYU0lUeXBlcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHVyaSBxdWFsaWZpZWQKLSAgICAgKiB0eXBlIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaVF1YWxpZmllZFR5cGVOYW1lIC0KLSAgICAgKiAgICAgICAgICBhIHVyaSBxdWFsaWZpZWQgdHlwZSBuYW1lCi0gICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIHVyaVF1YWxpZmllZFR5cGVOYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRYU0lUeXBlQXR0cmlidXRlKENNTmFtZWROb2RlTWFwSW1wbCBtYXApCi0gICAgewotICAgICAgTGlzdCBsaXN0ID0gZ2V0WFNJVHlwZXMoKTsKLSAgICAgIGludCBsaXN0U2l6ZSA9IGxpc3Quc2l6ZSgpOwotICAgICAgaWYgKGxpc3RTaXplID4gMSkKLSAgICAgIHsKLSAgICAgICAgQ01EYXRhVHlwZSBkYXRhVHlwZSA9IG5ldyBDTURhdGFUeXBlSW1wbCgidHlwZU5hbWVzIiwgKFN0cmluZykgbnVsbCk7Ci0gICAgICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsIGF0dHJpYnV0ZSA9IG5ldyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCgidHlwZSIsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwsIGRhdGFUeXBlKTsKLSAgICAgICAgYXR0cmlidXRlLnNldENNRG9jdW1lbnQoeHNpRG9jdW1lbnQpOwotICAgICAgICBhdHRyaWJ1dGUuc2V0UHJlZml4UXVhbGlmaWNhdGlvbih0cnVlKTsKLSAgICAgICAgYXR0cmlidXRlLnNldFhTSVR5cGVzKGxpc3QpOwotCi0gICAgICAgIC8vIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI1NDQ3Ci0gICAgICAgIC8vIEZvciBub3csIGRvbid0IGNsb2JiZXIgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBzYW1lICd0eXBlJyBuYW1lIGRlZmluZWQgaW4gdGhlIGdyYW1tYXIKLSAgICAgICAgLy8gd2l0aCB0aGUgeHNpOnR5cGUgYXR0cmlidXRlLiAgVGhlIGltcGFjdCBvZiB0aGlzIGNoYW5nZSB3aWxsIGJlIHRoYXQgZm9yIGNvbnRlbnQgYXNzaXN0LCB0aGUgbm9uLXhzaQotICAgICAgICAvLyB0eXBlIGF0dHJpYnV0ZSB3aWxsIGJlIHByZXNlbnRlZDsgdGhlIGdlbmVyYXRlZCBYTUwgZnJvbSBYU0Qgd2lsbCBoYXZlIHRoaXMgYXR0cmlidXRlIGNyZWF0ZWQsIGFuZAotICAgICAgICAvLyBub3QgdGhlIHhzaTp0eXBlIGF0dHJpYnV0ZS4KLSAgICAgICAgSGFzaHRhYmxlIGhhc2hUYWJsZSA9IG1hcC5nZXRIYXNodGFibGUoKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGUuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgaWYgKCFoYXNoVGFibGUuY29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgaGFzaFRhYmxlLnB1dChuYW1lLCBhdHRyaWJ1dGUpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNtZG9jdW1lbnQgdGhhdCBpcyB0aGUgb3duZXIgb2YgdGhpcyBjbW5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY21kb2N1bWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKQotICAgIHsgICAgICAKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBnZXRSZXNvbHZlZFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFNjaGVtYSgpOwotICAgICAgaWYgKHNjaGVtYSA9PSBudWxsKQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIGVsc2UgIAotICAgICAgICByZXR1cm4gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoc2NoZW1hKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdWJzdGl0dXRpb24gZ3JvdXAgZm9yIHRoaXMgZWxlbWVudC4gVGhlIGdyb3VwIGNvbnNpc3RzIG9mOgotICAgICAqIDEuIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGl0c2VsZiAyLiBhbmQgYW55IGVsZW1lbnQgZGVjbGFyYXRpb24gdGhhdCBoYXMKLSAgICAgKiBhIHtzdWJzdGl0dXRpb24gZ3JvdXAgYWZmaWxpYXRpb259IGluIHRoZSBncm91cAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN1YnN0aXR1dGlvbiBncm91cCBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBDTU5vZGVMaXN0SW1wbCBnZXRTdWJzdGl0dXRpb25Hcm91cCgpOwotICAgIC8qCi0gICAgICogWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5EYXRhVHlwZUltcGwgQW4gaW5uZXIgY2xhc3MgdG8gaG9sZCB0eXBlCi0gICAgICogaW5mb3JtYXRpb24gZm9yIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgRGF0YVR5cGVJbXBsIGltcGxlbWVudHMgQ01EYXRhVHlwZQotICAgIHsKLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgbm9kZS4gVGhlIHR5cGVzIGFyZSBkZWZpbmVkIGluIENNTm9kZSBjbGFzcwotICAgICAgICogKEFOWV9FTEVNRU5ULCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIERBVEFfVFlQRSwgRE9DVU1FTlQsCi0gICAgICAgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBFTlRJVFlfREVDTEFSQVRJT04sIEdST1VQLCBOQU1FX1NQQUNFIG9yCi0gICAgICAgKiBET0NVTUVOVEFUSU9OKS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIG5vZGUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICAgICAgewotICAgICAgICByZXR1cm4gQ01Ob2RlLkRBVEFfVFlQRTsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUuIFNhbWUgYXMgZ2V0RGF0YVR5cGVOYW1lKCkuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZS4KLSAgICAgICAqLwotICAgICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBnZXREYXRhVHlwZU5hbWUoKTsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIGZhbHNlLiBUaGlzIGNsYXNzIGRvZXMgbm90IHN1cHBvcnQgYW55IHByb3BlcnRpZXMuCi0gICAgICAgKiAKLSAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLQotICAgICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICAgKiBAcmV0dXJuIGZhbHNlLgotICAgICAgICovCi0gICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyBudWxsLiBUaGlzIGNsYXNzIGRvZXMgbm90IHN1cHBvcnQgYW55IHByb3BlcnRpZXMuCi0gICAgICAgKiAKLSAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLQotICAgICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICAgKiBAcmV0dXJuIG51bGwuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlLiBTYW1lIGFzIGdldE5vZGVOYW1lKCkuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZS4KLSAgICAgICAqLwotICAgICAgcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKQotICAgICAgewotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBudWxsOwotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdGQgPSBnZXRYU0RUeXBlKCkuZ2V0U2ltcGxlVHlwZSgpOwotICAgICAgICBpZiAoc3RkICE9IG51bGwpCi0gICAgICAgICAgdHlwZU5hbWUgPSBzdGQuZ2V0TmFtZSgpOwotICAgICAgICByZXR1cm4gdHlwZU5hbWUgIT0gbnVsbCA/IHR5cGVOYW1lIDogInN0cmluZyI7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUga2luZCBvZiBjb25zdHJhaW50OiBub25lLCBkZWZhdWx0IG9yIGZpeGVkLiBUaGUga2luZHMgYXJlCi0gICAgICAgKiBkZWZpbmVkIGluIENNRGF0YVR5cGUgY2xhc3MgKElNUExJRURfVkFMVUVfTk9ORSwgSU1QTElFRF9WQUxVRV9GSVhFRCBvcgotICAgICAgICogSU1QTElFRF9WQUxVRV9ERUZBVUxUKS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUga2luZCBvZiBjb25zdHJhaW50OiBub25lLCBkZWZhdWx0IG9yIGZpeGVkLgotICAgICAgICovCi0gICAgICBwdWJsaWMgaW50IGdldEltcGxpZWRWYWx1ZUtpbmQoKQotICAgICAgewotICAgICAgICBpbnQgcmVzdWx0ID0gSU1QTElFRF9WQUxVRV9OT05FOwotICAgICAgICBpZiAoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuaXNTZXRDb25zdHJhaW50KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0Q29uc3RyYWludCgpLmdldFZhbHVlKCkgPT0gWFNEQ29uc3RyYWludC5ERUZBVUxUKQotICAgICAgICAgICAgcmVzdWx0ID0gSU1QTElFRF9WQUxVRV9ERUZBVUxUOwotICAgICAgICAgIGVsc2UgaWYgKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldENvbnN0cmFpbnQoKS5nZXRWYWx1ZSgpID09IFhTRENvbnN0cmFpbnQuRklYRUQpCi0gICAgICAgICAgICByZXN1bHQgPSBJTVBMSUVEX1ZBTFVFX0ZJWEVEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgb3IgZml4ZWQgY29uc3RyYWludC4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgb3IgZml4ZWQgY29uc3RyYWludC4KLSAgICAgICAqLwotICAgICAgcHVibGljIFN0cmluZyBnZXRJbXBsaWVkVmFsdWUoKQotICAgICAgewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmlzU2V0Q29uc3RyYWludCgpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSBlbnVtZXJhdGVkIHZhbHVlcyBmb3IgdGhlIGF0dHJpYnV0ZSB0eXBlLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSBlbnVtZXJhdGVkIHZhbHVlcyBmb3IgdGhlIGF0dHJpYnV0ZSB0eXBlLgotICAgICAgICovCi0gICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RW51bWVyYXRlZFZhbHVlcygpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBnZXRFbnVtZXJhdGVkVmFsdWVzRm9yVHlwZShnZXRYU0RUeXBlKCkpOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgU3RyaW5nIGdlbmVyYXRlSW5zdGFuY2VWYWx1ZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBYU0RUeXBlVXRpbC5nZXRJbnN0YW5jZVZhbHVlKGdldFhTRFR5cGUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgY21kb2N1bWVudCB0aGF0IGlzIHRoZSBvd25lciBvZiB0aGlzIGNtbm9kZS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgY21kb2N1bWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY21ub2RlLgotICAgICAgICovCi0gICAgICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIChDTURvY3VtZW50KSBnZXRBZGFwdGVyKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFNjaGVtYSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBDTUVsZW1lbnREZWNsYXJhdGlvbi4gQQotICAgKiByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICdFbGVtZW50IERlY2xhcmF0aW9uJy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciBleHRlbmRzIEVsZW1lbnREZWNsYXJhdGlvbkJhc2VJbXBsCi0gIHsKLSAgICBwcm90ZWN0ZWQgTGlzdCBkZXJpdmVkRWxlbWVudERlY2xhcmF0aW9ucyA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIExpc3QgeHNpVHlwZXMgPSBudWxsOwotICAgIHByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uOwotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0SW1wbCBzdWJzdGl0dXRpb25Hcm91cDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSB4c2RFbGVtZW50RGVjbGFyYXRpb24gLQotICAgICAqICAgICAgICAgIHRoZSBYTUwgU2NoZW1hIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIoWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICB0aGlzLnhzZEVsZW1lbnREZWNsYXJhdGlvbiA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RFbGVtZW50RGVjbGFyYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0UmVzb2x2ZWRYU0RFbGVtZW50RGVjbGFyYXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlIHdoaWNoIGlzIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RFbGVtZW50RGVjbGFyYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVmZXJlbmNlZCBlbGVtZW50IGRlY2xhcmF0aW9uIGlmIHRoaXMgaXMgYW4gZWxlbWVudAotICAgICAqIHJlZmVyZW5jZS4gT3RoZXJ3aXNlIGl0IHJldHVybnMgaXRzZWxmLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01Ob2RlIGdldERlZmluaXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRBZGFwdGVyKHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGluZGljYXRpbmcgd2hldGhlciB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBpcyBnbG9iYWwgb3IKLSAgICAgKiBsb2NhbC4gUmV0dXJucyBudWxsIGlmIHRoaXMgaXMgYW4gZWxlbWVudCByZWZlcmVuY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHN0cmluZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gaXMgZ2xvYmFsIG9yCi0gICAgICogICAgICAgICBsb2NhbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmluaXRpb25JbmZvKCkKLSAgICB7Ci0gICAgICBpZiAoeHNkRWxlbWVudERlY2xhcmF0aW9uLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgZWxzZSBpZiAoeHNkRWxlbWVudERlY2xhcmF0aW9uLmlzR2xvYmFsKCkpCi0gICAgICAgIHJldHVybiBERUZJTklUSU9OX0lORk9fR0xPQkFMOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gREVGSU5JVElPTl9JTkZPX0xPQ0FMOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0TlNQcmVmaXhRdWFsaWZpY2F0aW9uKCkKLSAgICB7Ci0gICAgICBTdHJpbmcgZm9ybSA9IG51bGw7Ci0gICAgICBpZiAoeHNkRWxlbWVudERlY2xhcmF0aW9uLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICB7Ci0gICAgICAgIGZvcm0gPSAicXVhbGlmaWVkIjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKHhzZEVsZW1lbnREZWNsYXJhdGlvbi5pc1NldEZvcm0oKSkKLSAgICAgICAgewotICAgICAgICAgIGZvcm0gPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0Rm9ybSgpLmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFNjaGVtYSgpOwotICAgICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICAgIGZvcm0gPSBzY2hlbWEuZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZm9ybTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgdHlwZSBkZWZpbml0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSB0eXBlIGRlZmluaXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhTRFR5cGVEZWZpbml0aW9uIGdldFhTRFR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHR5cGUgbmFtZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgdHlwZSBuYW1lcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRYU0lUeXBlcygpCi0gICAgewotICAgICAgaWYgKHhzaVR5cGVzID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbXB1dGVEZXJpdmVkVHlwZUluZm8oKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB4c2lUeXBlczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb21wdXRlRGVyaXZlZFR5cGVJbmZvKCkKLSAgICB7Ci0gICAgICB4c2lUeXBlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGRlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25zID0gbmV3IFZlY3RvcigpOwotICAgICAgY29tcHV0ZURlcml2ZWRUeXBlSW5mb0hlbHBlcihnZXRYU0RUeXBlKCksIHhzaVR5cGVzLCBkZXJpdmVkRWxlbWVudERlY2xhcmF0aW9ucyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZURlcml2ZWRUeXBlSW5mb0hlbHBlcihYU0RUeXBlRGVmaW5pdGlvbiB0eXBlLCBMaXN0IHR5cGVOYW1lTGlzdCwgTGlzdCBlZExpc3QpCi0gICAgewotICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIExpc3QgZGVyaXZlZFR5cGVzID0gZmluZFR5cGVzRGVyaXZlZEZyb20odHlwZSk7Ci0gICAgICAgIEFycmF5TGlzdCBpbmNsdXNpdmVEZXJpdmVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGluY2x1c2l2ZURlcml2ZWRUeXBlcy5hZGQodHlwZSk7Ci0gICAgICAgIGlmICgoZGVyaXZlZFR5cGVzICE9IG51bGwpICYmIChkZXJpdmVkVHlwZXMuc2l6ZSgpID4gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpbmNsdXNpdmVEZXJpdmVkVHlwZXMuYWRkQWxsKGRlcml2ZWRUeXBlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gaW5jbHVzaXZlRGVyaXZlZFR5cGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIGRlcml2ZWRUeXBlID0gKFhTRFR5cGVEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gZGVyaXZlZFR5cGUuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGRlcml2ZWRUeXBlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG5hbWUgPSB1cmkgIT0gbnVsbCA/ICgiWyIgKyB1cmkgKyAiXSIgKyBuYW1lKSA6IG5hbWU7Ci0gICAgICAgICAgICAgIHR5cGVOYW1lTGlzdC5hZGQobmFtZSk7Ci0gICAgICAgICAgICAgIERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25JbXBsIGVkID0gbmV3IERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25JbXBsKHRoaXMsIGRlcml2ZWRUeXBlLCBuYW1lKTsKLSAgICAgICAgICAgICAgZWRMaXN0LmFkZChlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHVyaSBxdWFsaWZpZWQKLSAgICAgKiB0eXBlIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaVF1YWxpZmllZFR5cGVOYW1lIC0KLSAgICAgKiAgICAgICAgICBhIHVyaSBxdWFsaWZpZWQgdHlwZSBuYW1lCi0gICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIHVyaVF1YWxpZmllZFR5cGVOYW1lKQotICAgIHsKLSAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAoZGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbnMgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29tcHV0ZURlcml2ZWRUeXBlSW5mbygpOwotICAgICAgfQotICAgICAgZm9yIChJdGVyYXRvciBpID0gZGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBEZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uSW1wbCBlZCA9IChEZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uSW1wbCkgaS5uZXh0KCk7Ci0gICAgICAgIGlmICgoZWQgIT0gbnVsbCkgJiYgKGVkLnVyaVF1YWxpZmllZFR5cGVOYW1lICE9IG51bGwpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGVkLnVyaVF1YWxpZmllZFR5cGVOYW1lLmVxdWFscyh1cmlRdWFsaWZpZWRUeXBlTmFtZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gZWQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3Vic3RpdHV0aW9uIGdyb3VwIGZvciB0aGlzIGVsZW1lbnQuIFRoZSBncm91cCBjb25zaXN0cyBvZjoKLSAgICAgKiAxLiB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBpdHNlbGYgMi4gYW5kIGFueSBlbGVtZW50IGRlY2xhcmF0aW9uIHRoYXQgaGFzCi0gICAgICogYSB7c3Vic3RpdHV0aW9uIGdyb3VwIGFmZmlsaWF0aW9ufSBpbiB0aGUgZ3JvdXAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWJzdGl0dXRpb24gZ3JvdXAgZm9yIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdEltcGwgZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKQotICAgIHsKLSAgICAgIGlmIChzdWJzdGl0dXRpb25Hcm91cCA9PSBudWxsKQotICAgICAgewotICAgICAgICBzdWJzdGl0dXRpb25Hcm91cCA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotICAgICAgICBMaXN0IHNncm91cCA9IGdldFJlc29sdmVkWFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc2dyb3VwLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGkubmV4dCgpOyAgCi0gICAgICAgICAgc3Vic3RpdHV0aW9uR3JvdXAuYWRkKGdldEFkYXB0ZXIoZWQpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHN1YnN0aXR1dGlvbkdyb3VwOwotICAgIH0KLSAgfQotICAvKioKLSAgICogRGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbkltcGwgZXh0ZW5kcyBFbGVtZW50RGVjbGFyYXRpb25CYXNlSW1wbAotICAgKiAgCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25JbXBsIGV4dGVuZHMgRWxlbWVudERlY2xhcmF0aW9uQmFzZUltcGwKLSAgewotICAgIHByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIG93bmVyOwotICAgIHByb3RlY3RlZCBYU0RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlOwotICAgIHB1YmxpYyBTdHJpbmcgdXJpUXVhbGlmaWVkVHlwZU5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3duZXIgLQotICAgICAqIEBwYXJhbSB4c2RUeXBlIC0KLSAgICAgKiBAcGFyYW0gdXJpUXVhbGlmaWVkVHlwZU5hbWUgLQotICAgICAqLwotICAgIHB1YmxpYyBEZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uSW1wbChYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIG93bmVyLCBYU0RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlLCBTdHJpbmcgdXJpUXVhbGlmaWVkVHlwZU5hbWUpCi0gICAgewotICAgICAgdGhpcy5vd25lciA9IG93bmVyOwotICAgICAgdGhpcy54c2RUeXBlID0geHNkVHlwZTsKLSAgICAgIHRoaXMudXJpUXVhbGlmaWVkVHlwZU5hbWUgPSB1cmlRdWFsaWZpZWRUeXBlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBvd25lci5nZXRLZXkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRSZXNvbHZlZFhTREVsZW1lbnREZWNsYXJhdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBvd25lci5nZXRLZXkoKSkuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlIHdoaWNoIGlzIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoKQotICAgIHsKLSAgICAgIHJldHVybiBvd25lci5nZXRLZXkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgdHlwZSBkZWZpbml0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSB0eXBlIGRlZmluaXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhTRFR5cGVEZWZpbml0aW9uIGdldFhTRFR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHR5cGUgbmFtZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgdHlwZSBuYW1lcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRYU0lUeXBlcygpCi0gICAgewotICAgICAgcmV0dXJuIG93bmVyLmdldFhTSVR5cGVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHVyaSBxdWFsaWZpZWQKLSAgICAgKiB0eXBlIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaVF1YWxpZmllZFR5cGVOYW1lIC0KLSAgICAgKiAgICAgICAgICBhIHVyaSBxdWFsaWZpZWQgdHlwZSBuYW1lCi0gICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIHVyaVF1YWxpZmllZFR5cGVOYW1lKQotICAgIHsKLSAgICAgIHJldHVybiBvd25lci5nZXREZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uKHVyaVF1YWxpZmllZFR5cGVOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQgZGVjbGFyYXRpb24gaWYgdGhpcyBpcyBhbiBlbGVtZW50Ci0gICAgICogcmVmZXJlbmNlLiBPdGhlcndpc2UgaXQgcmV0dXJucyBpdHNlbGYuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDTU5vZGUgZ2V0RGVmaW5pdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gaXMgZ2xvYmFsIG9yCi0gICAgICogbG9jYWwuIFJldHVybnMgbnVsbCBpZiB0aGlzIGlzIGFuIGVsZW1lbnQgcmVmZXJlbmNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzdHJpbmcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGlzIGdsb2JhbCBvcgotICAgICAqICAgICAgICAgbG9jYWwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZWZpbml0aW9uSW5mbygpCi0gICAgewotICAgICAgcmV0dXJuIG93bmVyLmdldERlZmluaXRpb25JbmZvKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZm9ybSBbYXR0cmlidXRlXSB3aGljaCBhZmZlY3RzIHRoZSB0YXJnZXQKLSAgICAgKiBuYW1lc3BhY2Ugb2YgbG9jYWxseSBzY29wZWQgZmVhdHVyZXMuIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmb3JtCi0gICAgICogW2F0dHJpYnV0ZV0uCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXROU1ByZWZpeFF1YWxpZmljYXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiBvd25lci5nZXROU1ByZWZpeFF1YWxpZmljYXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdWJzdGl0dXRpb24gZ3JvdXAgZm9yIHRoaXMgZWxlbWVudC4gVGhlIGdyb3VwIGNvbnNpc3RzIG9mOgotICAgICAqIDEuIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGl0c2VsZiAyLiBhbmQgYW55IGVsZW1lbnQgZGVjbGFyYXRpb24gdGhhdCBoYXMKLSAgICAgKiBhIHtzdWJzdGl0dXRpb24gZ3JvdXAgYWZmaWxpYXRpb259IGluIHRoZSBncm91cAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN1YnN0aXR1dGlvbiBncm91cCBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0SW1wbCBnZXRTdWJzdGl0dXRpb25Hcm91cCgpCi0gICAgewotICAgICAgcmV0dXJuIG93bmVyLmdldFN1YnN0aXR1dGlvbkdyb3VwKCk7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBYU0RXaWxkY2FyZEFkYXB0ZXIKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNEV2lsZGNhcmRBZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBDTUFueUVsZW1lbnQKLSAgewotICAgIHByb3RlY3RlZCBYU0RXaWxkY2FyZCB4c2RXaWxkY2FyZDsKLQotICAgIHB1YmxpYyBYU0RXaWxkY2FyZEFkYXB0ZXIoWFNEV2lsZGNhcmQgeHNkV2lsZGNhcmQpCi0gICAgewotICAgICAgdGhpcy54c2RXaWxkY2FyZCA9IHhzZFdpbGRjYXJkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUgd2hpY2ggaXMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYQotICAgICAqIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5IGZvciB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpCi0gICAgewotICAgICAgcmV0dXJuIHhzZFdpbGRjYXJkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG5vZGUuIFRoZSB0eXBlcyBhcmUgZGVmaW5lZCBpbiBDTU5vZGUgY2xhc3MKLSAgICAgKiAoQU5ZX0VMRU1FTlQsIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgREFUQV9UWVBFLCBET0NVTUVOVCwKLSAgICAgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBFTlRJVFlfREVDTEFSQVRJT04sIEdST1VQLCBOQU1FX1NQQUNFIG9yCi0gICAgICogRE9DVU1FTlRBVElPTikuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIEFOWV9FTEVNRU5UOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG5vZGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGFuIGVtcHR5IHN0cmluZyB2YWx1ZS4KLSAgICAgKiBBbGwgZGVyaXZlZCBjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBkbyBub3Qgd2FudCB0aGUKLSAgICAgKiBkZWZhdWx0IHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgewotICAgICAgcmV0dXJuICJhbnkiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICB7Ci0gICAgICBTdHJpbmcgdXJpID0geHNkV2lsZGNhcmQuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSk7Ci0gICAgICByZXR1cm4gKHVyaSAhPSBudWxsICYmIHVyaS5sZW5ndGgoKSA+IDApID8gdXJpIDogIiMjYW55IjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiAnTWluIE9jY3VycycgYXR0cmlidXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiMSIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdNaW4gT2NjdXJzJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNaW5PY2N1cigpCi0gICAgewotICAgICAgcmV0dXJuIGdldE1pbk9jY3Vycyh4c2RXaWxkY2FyZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICdNYXggT2NjdXJzJyBhdHRyaWJ1dGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzCi0gICAgICogIjEiLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTWF4IE9jY3VycycgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRNYXhPY2N1cnMoeHNkV2lsZGNhcmQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNtZG9jdW1lbnQgdGhhdCBpcyB0aGUgb3duZXIgb2YgdGhpcyBjbW5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY21kb2N1bWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKQotICAgIHsKLSAgICAgIHJldHVybiAoQ01Eb2N1bWVudCkgZ2V0QWRhcHRlcih4c2RXaWxkY2FyZC5nZXRTY2hlbWEoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0IGdldERvY3VtZW50YXRpb24oKQotICAgIHsKLSAgICAgIFhTREFubm90YXRpb24gYW5ub3RhdGlvbiA9IHhzZFdpbGRjYXJkLmdldEFubm90YXRpb24oKTsKLSAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9ucyhhbm5vdGF0aW9uKTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIFhTRE1vZGVsR3JvdXBBZGFwdGVyCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTRE1vZGVsR3JvdXBBZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBDTUdyb3VwCi0gIHsKLSAgICBwcm90ZWN0ZWQgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwOwotCi0gICAgcHVibGljIFhTRE1vZGVsR3JvdXBBZGFwdGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIFhTRE1vZGVsR3JvdXBBZGFwdGVyKFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCkKLSAgICB7Ci0gICAgICB0aGlzLnhzZE1vZGVsR3JvdXAgPSB4c2RNb2RlbEdyb3VwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG5vZGUuIFRoZSB0eXBlcyBhcmUgZGVmaW5lZCBpbiBDTU5vZGUgY2xhc3MKLSAgICAgKiAoQU5ZX0VMRU1FTlQsIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgREFUQV9UWVBFLCBET0NVTUVOVCwKLSAgICAgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBFTlRJVFlfREVDTEFSQVRJT04sIEdST1VQLCBOQU1FX1NQQUNFIG9yCi0gICAgICogRE9DVU1FTlRBVElPTikuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIEdST1VQOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUgd2hpY2ggaXMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYQotICAgICAqIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5IGZvciB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpCi0gICAgewotICAgICAgcmV0dXJuIHhzZE1vZGVsR3JvdXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgdGhlIGNoaWxkcmVuIG9mIHRoaXMgZ3JvdXAuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgdGhlIGNoaWxkcmVuIG9mIHRoaXMgZ3JvdXAuCi0gICAgICovCi0gICAgcHVibGljIENNTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpCi0gICAgewotICAgICAgQ01Ob2RlTGlzdEltcGwgbm9kZUxpc3QgPSBuZXcgQ01Ob2RlTGlzdEltcGwoKTsKLSAgICAgIGlmICh4c2RNb2RlbEdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHhzZE1vZGVsR3JvdXAuZ2V0UGFydGljbGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSAoWFNEUGFydGljbGUpIGkubmV4dCgpOwotICAgICAgICAgIFhTRFBhcnRpY2xlQ29udGVudCBjb250ZW50ID0gcGFydGljbGUuZ2V0Q29udGVudCgpOwotICAgICAgICAgIENNTm9kZSBhZGFwdGVyID0gZ2V0QWRhcHRlcihjb250ZW50KTsKLSAgICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5vZGVMaXN0LmdldExpc3QoKS5hZGQoYWRhcHRlcik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbm9kZUxpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbm9kZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYW4gZW1wdHkgc3RyaW5nIHZhbHVlLgotICAgICAqIEFsbCBkZXJpdmVkIGNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IGRvIG5vdCB3YW50IHRoZQotICAgICAqIGRlZmF1bHQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgICB7Ci0gICAgICBDTURlc2NyaXB0aW9uQnVpbGRlciBkZXNjcmlwdGlvbkJ1aWxkZXIgPSBuZXcgQ01EZXNjcmlwdGlvbkJ1aWxkZXIoKTsKLSAgICAgIHJldHVybiBkZXNjcmlwdGlvbkJ1aWxkZXIuYnVpbGREZXNjcmlwdGlvbih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiAnTWluIE9jY3VycycgYXR0cmlidXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiMSIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdNaW4gT2NjdXJzJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNaW5PY2N1cigpCi0gICAgewotICAgICAgcmV0dXJuIGdldE1pbk9jY3Vycyh4c2RNb2RlbEdyb3VwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJ01heCBPY2N1cnMnIGF0dHJpYnV0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMKLSAgICAgKiAiMSIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdNYXggT2NjdXJzJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNYXhPY2N1cigpCi0gICAgewotICAgICAgcmV0dXJuIGdldE1heE9jY3Vycyh4c2RNb2RlbEdyb3VwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gb3BlcmF0b3Igb2YgdGhpcyBncm91cCAtLSBDSE9JQ0UsIFNFUVVFTkNFIG9yIEFMTCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvcGVyYXRvciBvZiB0aGlzIGdyb3VwLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0T3BlcmF0b3IoKQotICAgIHsKLSAgICAgIGludCByZXN1bHQgPSAwOwotICAgICAgLy90b2RvLi4uIGhhbmRsZSBBTE9ORSBjYXNlIGJ5IGNoZWNraWcgaWYgY2hpbGQgY291bnQgPT0gMQotICAgICAgaWYgKHhzZE1vZGVsR3JvdXAgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc3dpdGNoICh4c2RNb2RlbEdyb3VwLmdldENvbXBvc2l0b3IoKS5nZXRWYWx1ZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBYU0RDb21wb3NpdG9yLkNIT0lDRSA6IHsKLSAgICAgICAgICAgIHJlc3VsdCA9IENIT0lDRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIFhTRENvbXBvc2l0b3IuU0VRVUVOQ0UgOiB7Ci0gICAgICAgICAgICByZXN1bHQgPSBTRVFVRU5DRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIFhTRENvbXBvc2l0b3IuQUxMIDogewotICAgICAgICAgICAgcmVzdWx0ID0gQUxMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdCBnZXREb2N1bWVudGF0aW9uKCkKLSAgICB7Ci0gICAgICBYU0RBbm5vdGF0aW9uIGFubm90YXRpb24gPSB4c2RNb2RlbEdyb3VwLmdldEFubm90YXRpb24oKTsKLSAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9ucyhhbm5vdGF0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbWRvY3VtZW50IHRoYXQgaXMgdGhlIG93bmVyIG9mIHRoaXMgY21ub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNtZG9jdW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkKLSAgICB7Ci0gICAgICByZXR1cm4gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoeHNkTW9kZWxHcm91cC5nZXRTY2hlbWEoKSk7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBDTUdyb3VwCi0gIHsKLSAgICBwcm90ZWN0ZWQgWFNETW9kZWxHcm91cERlZmluaXRpb24geHNkTW9kZWxHcm91cERlZmluaXRpb247Ci0KLSAgICBwdWJsaWMgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHRoaXMueHNkTW9kZWxHcm91cERlZmluaXRpb24gPSB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBub2RlLiBUaGUgdHlwZXMgYXJlIGRlZmluZWQgaW4gQ01Ob2RlIGNsYXNzCi0gICAgICogKEFOWV9FTEVNRU5ULCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIERBVEFfVFlQRSwgRE9DVU1FTlQsCi0gICAgICogRUxFTUVOVF9ERUNMQVJBVElPTiwgRU5USVRZX0RFQ0xBUkFUSU9OLCBHUk9VUCwgTkFNRV9TUEFDRSBvcgotICAgICAqIERPQ1VNRU5UQVRJT04pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiBHUk9VUDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlIHdoaWNoIGlzIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBncm91cC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBncm91cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01Ob2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkKLSAgICB7Ci0gICAgICBDTU5vZGVMaXN0SW1wbCBub2RlTGlzdCA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotICAgICAgWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0geHNkTW9kZWxHcm91cERlZmluaXRpb24uZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldE1vZGVsR3JvdXAoKTsKLSAgICAgIGlmIChtb2RlbEdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIENNTm9kZSBhZGFwdGVyID0gZ2V0QWRhcHRlcihtb2RlbEdyb3VwKTsKLSAgICAgICAgbm9kZUxpc3QuYWRkKGFkYXB0ZXIpOwotICAgICAgfQotICAgICAgcmV0dXJuIG5vZGVMaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG5vZGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGFuIGVtcHR5IHN0cmluZyB2YWx1ZS4KLSAgICAgKiBBbGwgZGVyaXZlZCBjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBkbyBub3Qgd2FudCB0aGUKLSAgICAgKiBkZWZhdWx0IHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgewotICAgICAgQ01EZXNjcmlwdGlvbkJ1aWxkZXIgZGVzY3JpcHRpb25CdWlsZGVyID0gbmV3IENNRGVzY3JpcHRpb25CdWlsZGVyKCk7Ci0gICAgICByZXR1cm4gZGVzY3JpcHRpb25CdWlsZGVyLmJ1aWxkRGVzY3JpcHRpb24odGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgJ01pbiBPY2N1cnMnIGF0dHJpYnV0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgIjEiLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTWluIE9jY3VycycgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRNaW5PY2N1cnMoeHNkTW9kZWxHcm91cERlZmluaXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnTWF4IE9jY3VycycgYXR0cmlidXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcwotICAgICAqICIxIi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJ01heCBPY2N1cnMnIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1heE9jY3VyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0TWF4T2NjdXJzKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gb3BlcmF0b3Igb2YgdGhpcyBncm91cCAtLSBDSE9JQ0UsIFNFUVVFTkNFIG9yIEFMTCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvcGVyYXRvciBvZiB0aGlzIGdyb3VwLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0T3BlcmF0b3IoKQotICAgIHsKLSAgICAgIHJldHVybiBYU0RDb21wb3NpdG9yLlNFUVVFTkNFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdCBnZXREb2N1bWVudGF0aW9uKCkKLSAgICB7Ci0gICAgICBYU0RBbm5vdGF0aW9uIGFubm90YXRpb24gPSB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbnMoYW5ub3RhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY21kb2N1bWVudCB0aGF0IGlzIHRoZSBvd25lciBvZiB0aGlzIGNtbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjbWRvY3VtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpCi0gICAgewotICAgICAgcmV0dXJuIChDTURvY3VtZW50KSBnZXRBZGFwdGVyKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldFNjaGVtYSgpKTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIERvY3VtZW50YXRpb25JbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudGF0aW9uLiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZQotICAgKiBkb2N1bWVudGF0aW9uIGVsZW1lbnQgcGFydCBvZiB0aGUgJ1VzZXIgSW5mb3JtYXRpb24nIGZlYXR1cmUuIFdvcmtpbmcgd2l0aAotICAgKiB0aGUgZG9jdW1lbnRhdGlvbiBlbGVtZW50IHJlcXVpcmVzIGRyb3BwaW5nIGRvd24gaW50byB0aGUgRE9NIG1vZGVsLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBEb2N1bWVudGF0aW9uSW1wbCBpbXBsZW1lbnRzIENNRG9jdW1lbnRhdGlvbgotICB7Ci0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZG9jdW1lbnRhdGlvbjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBkb2N1bWVudGF0aW9uIC0KLSAgICAgKiAgICAgICAgICBhIGRvY3VtZW50YXRpb24gZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnRhdGlvbkltcGwoRWxlbWVudCBkb2N1bWVudGF0aW9uKQotICAgIHsKLSAgICAgIHRoaXMuZG9jdW1lbnRhdGlvbiA9IGRvY3VtZW50YXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgbm9kZS4gVGhlIHR5cGVzIGFyZSBkZWZpbmVkIGluIENNTm9kZSBjbGFzcwotICAgICAqIChBTllfRUxFTUVOVCwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBEQVRBX1RZUEUsIERPQ1VNRU5ULAotICAgICAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEVOVElUWV9ERUNMQVJBVElPTiwgR1JPVVAsIE5BTUVfU1BBQ0Ugb3IKLSAgICAgKiBET0NVTUVOVEFUSU9OKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gRE9DVU1FTlRBVElPTjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGVtcHR5IHN0cmluZyB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgICB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBmYWxzZS4gVGhpcyBjbGFzcyBkb2VzIG5vdCBzdXBwb3J0IGFueSBwcm9wZXJ0aWVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLQotICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gZmFsc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBudWxsLiBUaGlzIGNsYXNzIGRvZXMgbm90IHN1cHBvcnQgYW55IHByb3BlcnRpZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICogQHJldHVybiBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IG9mIHRoZSBkb2N1bWVudGF0aW9uIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udGVudCBvZiB0aGUgZG9jdW1lbnRhdGlvbiBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotICAgIHsKLSAgICAgIFN0cmluZyBjb250ZW50ID0gIiI7Ci0gICAgICBib29sZWFuIGNvbnRlbnRGb3VuZCA9IGZhbHNlOwotICAgICAgTm9kZUxpc3Qgbm9kZXMgPSBkb2N1bWVudGF0aW9uLmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsKLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBUZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgY29udGVudEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICBjb250ZW50ICs9IG5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBjb250ZW50Rm91bmQgPyBjb250ZW50IDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgdmFsdWUgb2YgdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgdmFsdWUgb2YgdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZG9jdW1lbnRhdGlvbi5oYXNBdHRyaWJ1dGVOUyhYU0RDb25zdGFudHMuWE1MX05BTUVTUEFDRV9VUklfMTk5OCwgWE1MX0xBTkdfQVRUUklCVVRFKSA/IGRvY3VtZW50YXRpb24uZ2V0QXR0cmlidXRlTlMoWFNEQ29uc3RhbnRzLlhNTF9OQU1FU1BBQ0VfVVJJXzE5OTgsIFhNTF9MQU5HX0FUVFJJQlVURSkgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNvdXJjZSBhdHRyaWJ1dGUgdmFsdWUgb2YgdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzb3VyY2UgYXR0cmlidXRlIHZhbHVlIG9mIHRoZSBkb2N1bWVudGF0aW9uIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKQotICAgIHsKLSAgICAgIHJldHVybiBkb2N1bWVudGF0aW9uLmhhc0F0dHJpYnV0ZU5TKG51bGwsIFhTRENvbnN0YW50cy5TT1VSQ0VfQVRUUklCVVRFKSA/IGRvY3VtZW50YXRpb24uZ2V0QXR0cmlidXRlTlMobnVsbCwgWFNEQ29uc3RhbnRzLlNPVVJDRV9BVFRSSUJVVEUpIDogbnVsbDsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIFhTSURvY3VtZW50IGV4dGVuZHMgQ01Eb2N1bWVudEltcGwuIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBob2xkIHRob3NlCi0gICAqIGF0dHJpYnV0ZXMgdGhhdCBhcmUgZm9yIGRpcmVjdCB1c2UgaW4gYW55IFhNTCBkb2N1bWVudHMuIFRoZXNlIGF0dHJpYnV0ZXMKLSAgICogYXJlIGluIGEgZGlmZmVyZW50IG5hbWVzcGFjZSwgd2hpY2ggaGFzIHRoZSBuYW1lc3BhY2UgbmFtZQotICAgKiBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZS4gQXR0cmlidXRlcyBpbiB0aGlzIG5hbWVzcGFjZQotICAgKiBpbmNsdWRlOiB4c2k6dHlwZSB4c2k6bmlsIHhzaTpzY2hlbWFMb2NhdGlvbiB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBYU0lEb2N1bWVudCBleHRlbmRzIENNRG9jdW1lbnRJbXBsCi0gIHsKLSAgICBwdWJsaWMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwgbmlsQXR0cmlidXRlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuIENyZWF0ZXMgdGhlICd4c2k6bmlsJwotICAgICAqLwotICAgIHB1YmxpYyBYU0lEb2N1bWVudCgpCi0gICAgewotICAgICAgc3VwZXIoWFNEQ29uc3RhbnRzLlNDSEVNQV9JTlNUQU5DRV9VUklfMjAwMSk7Ci0gICAgICAvLyBjcmVhdGUgdGhlICduaWxsJyBhdHRyaWJ1dGUKLSAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IHsiZmFsc2UiLCAidHJ1ZSJ9OwotICAgICAgbmlsQXR0cmlidXRlID0gbmV3IENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsKCJuaWwiLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVELCBuZXcgQ01EYXRhVHlwZUltcGwoImJvb2xlYW4iLCB2YWx1ZXMpKTsKLSAgICAgIG5pbEF0dHJpYnV0ZS5zZXRQcmVmaXhRdWFsaWZpY2F0aW9uKHRydWUpOwotICAgICAgbmlsQXR0cmlidXRlLnNldENNRG9jdW1lbnQodGhpcyk7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBOb3RlIHRoaXMgWFNEIG1vZGVsIHZpc2l0b3IgZGlmZmVycyBmcm9tIHRoZSBYU0QgbW9kZWwgdmlzaXRvciBpbgotICAgKiBvcmcuZWNsaXBzZS53c3QueHNkLmVkaXRvciBwbHVnaW4uIEluIHZpc2l0TW9kZWxHcm91cCBtZXRob2Qgd2UgY2FsbAotICAgKiBnZXRQYXJ0aWNsZXMoKSBpbnN0ZWFkIG9mIGdldENvbnRlbnRzKCkuIFRoaXMgZ2F0aGVycyBhbGwgb2YgdGhlIGNvbnRlbnQgb2YKLSAgICogYSBkZXJpdmVkIHR5cGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTRENNVmlzaXRvciBleHRlbmRzIFhTRFZpc2l0b3IKLSAgewotICAgIHB1YmxpYyB2b2lkIHZpc2l0U2ltcGxlVHlwZURlZmluaXRpb24oWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZSkKLSAgICB7Ci0gICAgICBYU0RQYXJ0aWNsZSBjdGQgPSB0eXBlLmdldENvbXBsZXhUeXBlKCk7Ci0gICAgICBpZiAoY3RkICE9IG51bGwpCi0gICAgICAgIHZpc2l0UGFydGljbGUoY3RkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIGlmIChtb2RlbEdyb3VwLmdldFBhcnRpY2xlcygpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2RlbEdyb3VwLmdldFBhcnRpY2xlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IChYU0RQYXJ0aWNsZSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgIHZpc2l0UGFydGljbGUocGFydGljbGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmKQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IG1vZGVsR3JvdXBEZWYuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldE1vZGVsR3JvdXAoKTsKLSAgICAgIGlmIChtb2RlbEdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZpc2l0TW9kZWxHcm91cChtb2RlbEdyb3VwKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIEEgdmlzaXRvciBjbGFzcyB0aGF0IHdhbGtzIHRoZSB4c2QgbW9kZWwgYW5kIGNvbXB1dGVzIHRoZSBsaXN0IG9mIGNoaWxkcmVuCi0gICAqIHRoYXQgYmVsb25nIHRvIHRoZSBpbml0aWFsbHkgdmlzaXRlZCBlbGVtZW50IHR5cGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIERlcml2ZWRDaGlsZFZpc2l0b3IgZXh0ZW5kcyBYU0RDTVZpc2l0b3IKLSAgewotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0SW1wbCBjaGlsZE5vZGVMaXN0ID0gbmV3IENNTm9kZUxpc3RJbXBsKCk7Ci0gICAgcHJvdGVjdGVkIExpc3QgYmFzZVR5cGVMaXN0ID0gbmV3IFZlY3RvcigpOwotICAgIE9iamVjdCByb290OwotCi0gICAgRGVyaXZlZENoaWxkVmlzaXRvcihPYmplY3Qgcm9vdCkKLSAgICB7Ci0gICAgICB0aGlzLnJvb3QgPSByb290OwotICAgIH0KLQotICAgIHB1YmxpYyBDTU5vZGVMaXN0SW1wbCBnZXRDaGlsZE5vZGVMaXN0KCkKLSAgICB7Ci0gICAgICByZXR1cm4gY2hpbGROb2RlTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFdpbGRjYXJkKFhTRFdpbGRjYXJkIHdpbGRjYXJkKQotICAgIHsKLSAgICAgIGNoaWxkTm9kZUxpc3QuZ2V0TGlzdCgpLmFkZChnZXRBZGFwdGVyKHdpbGRjYXJkKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gICAgewotICAgICAgY2hpbGROb2RlTGlzdC5nZXRMaXN0KCkuYWRkKGdldEFkYXB0ZXIoZWxlbWVudCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXApCi0gICAgewotICAgICAgY2hpbGROb2RlTGlzdC5nZXRMaXN0KCkuYWRkKGdldEFkYXB0ZXIobW9kZWxHcm91cCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgY2hpbGROb2RlTGlzdC5nZXRMaXN0KCkuYWRkKGdldEFkYXB0ZXIobW9kZWxHcm91cERlZmluaXRpb24pKTsKLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIEEgdmlzaXRvciBjbGFzcyB0aGF0IGdhdGhlcnMgYWxsIG9mIHRoZSBlbGVtZW50cyB3aXRoaW4gYSB0eXBlIGRlZmluaXRpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIExvY2FsRWxlbWVudFZpc2l0b3IgZXh0ZW5kcyBYU0RDTVZpc2l0b3IKLSAgewotICAgIHByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgbmFtZWROb2RlTWFwID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICAgIHByb3RlY3RlZCBMaXN0IGJhc2VUeXBlTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKSBnZXRBZGFwdGVyKGVsZW1lbnQpOwotICAgICAgbmFtZWROb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dChhZGFwdGVyLmdldE5vZGVOYW1lKCksIGFkYXB0ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRDTU5hbWVkTm9kZU1hcCgpCi0gICAgewotICAgICAgcmV0dXJuIG5hbWVkTm9kZU1hcDsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNEVHlwZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNEVHlwZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4NjdhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTRFR5cGVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBnZW5lcmF0ZSB2YWxpZCB2YWx1ZXMgZm9yIGJ1aWx0LWluIHNpbXBsZSB0eXBlcy4KLSAqLwotCi1wdWJsaWMgY2xhc3MgWFNEVHlwZVV0aWwKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBNYXAgZGVmYXVsdFZhbHVlID0gbmV3IEhhc2hNYXAoKTsKLQotICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZSgpCi0gIHsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJhbnlTaW1wbGVUeXBlIiwgbnVsbCk7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiYW55VHlwZSIsIG51bGwpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImFueVVSSSIsICJodHRwOi8vdGVtcHVyaS5vcmciKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJiYXNlNjRCaW5hcnkiLCAiMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImJvb2xlYW4iLCAidHJ1ZSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImJ5dGUiLCAiMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImRhdGUiLCAiMjAwMS0wMS0wMSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImRhdGVUaW1lIiwgIjIwMDEtMTItMzFUMTI6MDA6MDAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJkZWNpbWFsIiwgIjAuMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImRvdWJsZSIsICIwLjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJkdXJhdGlvbiIsICJQMUQiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJFTlRJVFkiLCAiZW50aXR5Iik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiRU5USVRJRVMiLCAiZW50aXRpZXMiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJmbG9hdCIsICIwLjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJnRGF5IiwgIi0tLTAxIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiZ01vbnRoIiwgIi0tMDEtLSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImdNb250aERheSIsICItLTAxLTAxIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiZ1llYXIiLCAiMjAwMSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImdZZWFyTW9udGgiLCAiMjAwMS0wMSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImhleEJpbmFyeSIsICIwRjAwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiSUQiLCBudWxsKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJJRFJFRiIsIG51bGwpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIklEUkVGUyIsIG51bGwpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImludCIsICIwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiaW50ZWdlciIsICIwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgibGFuZ3VhZ2UiLCAiRU4iKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJsb25nIiwgIjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJOYW1lIiwgIk5hbWUiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJOQ05hbWUiLCAiTkNOYW1lIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgibmVnYXRpdmVJbnRlZ2VyIiwgIi0xIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiTk1UT0tFTiIsICJOTVRPS0VOIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiTk1UT0tFTlMiLCAiTk1UT0tFTlMiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJub25OZWdhdGl2ZUludGVnZXIiLCAiMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIm5vblBvc2l0aXZlSW50ZWdlciIsICIwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgibm9ybWFsaXplZFN0cmluZyIsIG51bGwpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIk5PVEFUSU9OIiwgIk5PVEFUSU9OIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgicG9zaXRpdmVJbnRlZ2VyIiwgIjEiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJRTmFtZSIsICJRTmFtZSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoInNob3J0IiwgIjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJzdHJpbmciLCBudWxsKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJ0aW1lIiwgIjEyOjAwOjAwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgidG9rZW4iLCAidG9rZW4iKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJ1bnNpZ25lZEJ5dGUiLCAiMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoInVuc2lnbmVkSW50IiwgIjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJ1bnNpZ25lZExvbmciLCAiMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoInVuc2lnbmVkU2hvcnQiLCAiMCIpOwotICB9Ci0KLQotICAvKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR5cGUgaXMgYnVpbHQtaW4uCi0gICAqIEBwYXJhbSB0eXBlIC0gYW4gWFNEVHlwZURlZmluaXRpb24gb2JqZWN0LgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHR5cGUgaXMgYnVpbHQtaW4uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCdWlsdEluKFhTRFR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsgCi0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFN0cmluZyBuYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0gICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXR1cm4gIGRlZmF1bHRWYWx1ZS5jb250YWluc0tleShuYW1lKTsgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgdmFsaWQgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHNpbXBsZSB0eXBlLgotICAgKiBAcGFyYW0gdHlwZSAtIGEgc2ltcGxlIGJ1aWx0LWluIHR5cGUuCi0gICAqIEByZXR1cm4gYSB2YWxpZCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc2ltcGxlIHR5cGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbnN0YW5jZVZhbHVlKFhTRFR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgICBpZiAodHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChpc0J1aWx0SW4odHlwZSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lSUQgPSB0eXBlLmdldE5hbWUoKTsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpZGVmYXVsdFZhbHVlLmdldChuYW1lSUQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiBiYXNldHlwZSA9IHR5cGUuZ2V0QmFzZVR5cGUoKTsKLSAgICAgICAgaWYgKGJhc2V0eXBlICE9IHR5cGUpIHJldHVybiBnZXRJbnN0YW5jZVZhbHVlKGJhc2V0eXBlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTRFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdlNGE5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTRFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROb3RhdGlvbkRlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RWaXNpdG9yCi17Ci0gIHB1YmxpYyBYU0RWaXNpdG9yKCkKLSAgewotICB9Ci0gIAotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHNjaGVtYTsKLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0U2NoZW1hKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSAoWFNEVHlwZURlZmluaXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0VHlwZURlZmluaXRpb24odHlwZSk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiBpZGVudGl0eUNvbnN0cmFpbnQgPSAoWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKGlkZW50aXR5Q29uc3RyYWludCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0TW9kZWxHcm91cERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKG1vZGVsR3JvdXApOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cCA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKGF0dHJpYnV0ZUdyb3VwKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXROb3RhdGlvbkRlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNETm90YXRpb25EZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTRE5vdGF0aW9uRGVjbGFyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0Tm90YXRpb25EZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cikKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFR5cGVEZWZpbml0aW9uKFhTRFR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0U2ltcGxlVHlwZURlZmluaXRpb24oKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKXR5cGUpOwotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pdHlwZSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50LmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgIH0KLSAgICBlbHNlIGlmIChlbGVtZW50LmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB2aXNpdFR5cGVEZWZpbml0aW9uKGVsZW1lbnQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24oWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiBpZGVudGl0eUNvbnN0cmFpbnQpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmKQotICB7Ci0gICAgaWYgKCFtb2RlbEdyb3VwRGVmLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICBpZiAobW9kZWxHcm91cERlZi5nZXRNb2RlbEdyb3VwKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRNb2RlbEdyb3VwKG1vZGVsR3JvdXBEZWYuZ2V0TW9kZWxHcm91cCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cCkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdE5vdGF0aW9uRGVjbGFyYXRpb24oWFNETm90YXRpb25EZWNsYXJhdGlvbiBub3RhdGlvbikKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24oWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgICBpZiAodHlwZS5nZXRDb250ZW50VHlwZSgpICE9IG51bGwpCi0gICAgewotICAgICAgWFNEQ29tcGxleFR5cGVDb250ZW50IGNvbXBsZXhDb250ZW50ID0gdHlwZS5nZXRDb250ZW50VHlwZSgpOwotICAgICAgaWYgKGNvbXBsZXhDb250ZW50IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIHZpc2l0U2ltcGxlVHlwZURlZmluaXRpb24oKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWNvbXBsZXhDb250ZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbXBsZXhDb250ZW50IGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICB7Ci0gICAgICAgIHZpc2l0UGFydGljbGUoKFhTRFBhcnRpY2xlKSBjb21wbGV4Q29udGVudCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFBhcnRpY2xlKFhTRFBhcnRpY2xlIHBhcnRpY2xlKQotICB7Ci0gICAgdmlzaXRQYXJ0aWNsZUNvbnRlbnQocGFydGljbGUuZ2V0Q29udGVudCgpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRQYXJ0aWNsZUNvbnRlbnQoWFNEUGFydGljbGVDb250ZW50IHBhcnRpY2xlQ29udGVudCkKLSAgewotICAgIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICB2aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgcGFydGljbGVDb250ZW50KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICB7Ci0gICAgICB2aXNpdE1vZGVsR3JvdXAoKFhTRE1vZGVsR3JvdXApcGFydGljbGVDb250ZW50KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKChYU0RFbGVtZW50RGVjbGFyYXRpb24pcGFydGljbGVDb250ZW50KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNEV2lsZGNhcmQpCi0gICAgewotICAgICAgdmlzaXRXaWxkY2FyZCgoWFNEV2lsZGNhcmQpcGFydGljbGVDb250ZW50KTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXApCi0gIHsKLSAgICBpZiAobW9kZWxHcm91cC5nZXRDb250ZW50cygpICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IChYU0RQYXJ0aWNsZSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICB2aXNpdFBhcnRpY2xlKHBhcnRpY2xlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0V2lsZGNhcmQoWFNEV2lsZGNhcmQgd2lsZGNhcmQpCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0b3JBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDMwOWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdG9yQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hTG9jYXRvcjsKLQotcHVibGljIGNsYXNzIFhTRFNjaGVtYUxvY2F0b3JBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbAotewotICAgIHByb3RlY3RlZCBYU0RTY2hlbWFMb2NhdG9ySW1wbCBzY2hlbWFMb2NhdG9yID0gbmV3IFhTRFNjaGVtYUxvY2F0b3JJbXBsKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IFhTRFNjaGVtYUxvY2F0b3IuY2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIEFkYXB0ZXIgYWRhcHROZXcoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gc2NoZW1hTG9jYXRvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmYwMTgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdG9yOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hTG9jYXRvckltcGwgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIFhTRFNjaGVtYUxvY2F0b3IKLXsKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUxvY2F0b3IjbG9jYXRlU2NoZW1hKG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWEsCi0gICAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBYU0RTY2hlbWEgbG9jYXRlU2NoZW1hKFhTRFNjaGVtYSB4c2RTY2hlbWEsIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyByYXdTY2hlbWFMb2NhdGlvblVSSSwgU3RyaW5nIHJlc29sdmVkU2NoZW1hTG9jYXRpb25VUkkpCi0gICAgewotICAgICAgWFNEU2NoZW1hIHJlc3VsdCA9IG51bGw7Ci0gICAgICBTdHJpbmcgYmFzZUxvY2F0aW9uID0geHNkU2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uKCk7ICAgICAgCi0gICAgICBTdHJpbmcgcmVzb2x2ZWRVUkkgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBuYW1lc3BhY2VVUkksIHJhd1NjaGVtYUxvY2F0aW9uVVJJKTsgCi0gICAgICBpZiAocmVzb2x2ZWRVUkkgPT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIHJlc29sdmVkVVJJID0gcmVzb2x2ZWRTY2hlbWFMb2NhdGlvblVSSTsgICAgICAgCi0gICAgICB9Ci0gICAgICB0cnkKLSAgICAgIHsgICAgICAgIAotICAgICAgICBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHhzZFNjaGVtYS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotICAgICAgICBVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShyZXNvbHZlZFVSSSk7Ci0gICAgICAgIFJlc291cmNlIHIgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZSh1cmksIGZhbHNlKTsgCi0gICAgICAgIFhTRFJlc291cmNlSW1wbCByZXNvbHZlZFJlc291cmNlID0gbnVsbDsKLSAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBYU0RSZXNvdXJjZUltcGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXNvbHZlZFJlc291cmNlID0gKFhTRFJlc291cmNlSW1wbClyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgICAgICAgIAotICAgICAgICB7ICAKLSAgICAgICAgICBTdHJpbmcgcGh5c2ljYWxMb2NhdGlvbiA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24oYmFzZUxvY2F0aW9uLCBuYW1lc3BhY2VVUkksIHJlc29sdmVkVVJJKTsgICAgIAotICAgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gcmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCkuY3JlYXRlSW5wdXRTdHJlYW0oVVJJLmNyZWF0ZVVSSShwaHlzaWNhbExvY2F0aW9uKSk7Ci0gICAgICAgICAgcmVzb2x2ZWRSZXNvdXJjZSA9IChYU0RSZXNvdXJjZUltcGwpcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiKi54c2QiKSk7Ci0gICAgICAgICAgcmVzb2x2ZWRSZXNvdXJjZS5zZXRVUkkodXJpKTsKLSAgICAgICAgICByZXNvbHZlZFJlc291cmNlLmxvYWQoaW5wdXRTdHJlYW0sIG51bGwpOyAgICAgICAgICAgCi0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQgPSByZXNvbHZlZFJlc291cmNlLmdldFNjaGVtYSgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAgICAgLy8gSXQgaXMgZ2VuZXJhbGx5IG5vdCBhbiBlcnJvciB0byBmYWlsIHRvIHJlc29sdmUuCi0gICAgICAgIC8vIElmIGEgcmVzb3VyY2UgaXMgYWN0dWFsbHkgY3JlYXRlZCwgCi0gICAgICAgIC8vIHdoaWNoIGhhcHBlbnMgb25seSB3aGVuIHdlIGNhbiBjcmVhdGUgYW4gaW5wdXQgc3RyZWFtLAotICAgICAgICAvLyB0aGVuIGl0J3MgYW4gZXJyb3IgaWYgaXQncyBub3QgYSBnb29kIHNjaGVtYQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXRwZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IFhTRFNjaGVtYUxvY2F0b3IuY2xhc3M7Ci0gICAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE1N2Y5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBDYXJ2ZXIsIFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCwgYnVnIDExNDcwMzMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotLyoqCi0gKiBBbiBYU0QgdmFsaWRhdGlvbiBjb25maWd1cmF0aW9uIGFsbG93cyBzZXR0aW5nIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24KLSAqIGluZm9ybWF0aW9uIGZvciBhIFdUUCBYU0QgdmFsaWRhdGlvbiBydW4uIEFueSBmZWF0dXJlcyBhbmQgcHJvcGVydGllcwotICogc2V0IG9uIHRoaXMgY29uZmlndXJhdGlvbiBzaG91bGQgbm90IGJlIGNvbmZ1c2VkIHdpdGggdGhvc2UgZnJvbQotICogcGFyc2VycyBzdWNoIGFzIFhlcmNlcy4gKFRoaXMgb2JqZWN0IGRvZXMgbm90IGJ5IGRlZmF1bHQgd3JhcCBmZWF0dXJlcwotICogYW5kIHByb3BlcnRpZXMgZnJvbSBzcGVjaWZpYyBwYXJzZXJzLikKLSAqLwotcHVibGljIGNsYXNzIFhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uIAotewotICBwdWJsaWMgc3RhdGljIFN0cmluZyBIT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMgPSAiSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBGVUxMX1NDSEVNQV9DT05GT1JNQU5DRSA9ICJGVUxMX1NDSEVNQV9DT05GT1JNQU5DRSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBib29sZWFuIGhvbm91cl9hbGxfc2NoZW1hX2xvY2F0aW9ucyA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gZnVsbFNjaGVtYUNvbmZvcm1hbmNlID0gdHJ1ZTsKLSAgCi0gIC8qKgotICAgKiBTZXQgYSBmZWF0dXJlIG9mIHRoaXMgY29uZmlndXJhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBmZWF0dXJlCi0gICAqIAkJVGhlIGZlYXR1cmUgdG8gc2V0LgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogCQlUaGUgdmFsdWUgdG8gc2V0IGZvciB0aGUgZmVhdHVyZS4KLSAgICogQHRocm93cyAKLSAgICogCQlBbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBmZWF0dXJlIGlzIG5vdCByZWNvZ25pemVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0JaWYoSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TLmVxdWFscyhmZWF0dXJlKSkKLQkgIGhvbm91cl9hbGxfc2NoZW1hX2xvY2F0aW9ucyA9IHZhbHVlOwotCWVsc2UgaWYgKEZVTExfU0NIRU1BX0NPTkZPUk1BTkNFLmVxdWFscyhmZWF0dXJlKSkKLQkJZnVsbFNjaGVtYUNvbmZvcm1hbmNlID0gdmFsdWU7Ci0JZWxzZQotCSAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmVhdHVyZSBub3QgcmVjb2duaXplZC4iKTsgLy8kTk9OLU5MUy0xJAotCQotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4gZmVhdHVyZS4gSWYgdGhlIGZlYXR1cmUgaXMgbm90IGRlZmluZWQKLSAgICogdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gZmVhdHVyZQotICAgKiAJCVRoZSBmZWF0dXJlIGZvciB3aGljaCB0byByZXRyaWV2ZSB0aGUgdmFsdWUuCi0gICAqIEByZXR1cm4KLSAgICogCQlUaGUgZmVhdHVyZSdzIHZhbHVlLCB0cnVlIG9yIGZhbHNlLgotICAgKiBAdGhyb3dzIAotICAgKiAJCUFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGZlYXR1cmUgaXMgbm90IHJlY29nbml6ZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLQlpZihIT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMuZXF1YWxzKGZlYXR1cmUpKQotCSAgcmV0dXJuIGhvbm91cl9hbGxfc2NoZW1hX2xvY2F0aW9uczsKLQllbHNlIGlmIChGVUxMX1NDSEVNQV9DT05GT1JNQU5DRS5lcXVhbHMoZmVhdHVyZSkpCi0gICAgICByZXR1cm4gZnVsbFNjaGVtYUNvbmZvcm1hbmNlOwotCQotCXRocm93IG5ldyBFeGNlcHRpb24oIkZlYXR1cmUgbm90IHJlY29nbml6ZWQuIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YU0RWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTRFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTZiNWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTRFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyLCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwsIGJ1ZyAxMTQ3MDMzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlhNTEdyYW1tYXJQcmVwYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5YTUxHcmFtbWFyUG9vbEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE5JRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5ncmFtbWFycy5YTUxHcmFtbWFyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTElucHV0U291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5YTUxWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXJyb3I7Ci0KLS8qKgotICogVGhlIFhTRFZhbGlkYXRvciB3aWxsIHZhbGlkYXRlIFhTRCBmaWxlcy4KLSAqLwotcHVibGljIGNsYXNzIFhTRFZhbGlkYXRvcgotewotICBwcm90ZWN0ZWQgVVJJUmVzb2x2ZXIgdXJpcmVzb2x2ZXIgPSBudWxsOwotCi0gIHB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmkpCi0gIHsKLSAgICByZXR1cm4gdmFsaWRhdGUodXJpLCBudWxsKTsKLSAgfQotICAKLSAgcHVibGljIFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCi0gIHsKLQlyZXR1cm4gdmFsaWRhdGUodXJpLCBudWxsLCBudWxsKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBYU0QgZmlsZSBzcGVjaWZpZWQgYnkgdGhlIFVSSS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkKLSAgICogCQlUaGUgVVJJIG9mIHRoZSBYU0QgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIGlucHV0U3RyZWFtIAotICAgKiAJCUFuIGlucHV0IHN0cmVhbSByZXByZXNlbnRpbmcgdGhlIFhTRCBmaWxlIHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotICAgKiAJCUEgY29uZmlndXJhdGlvbiBmb3IgdGhpcyB2YWxpZGF0aW9uIHJ1bi4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBYU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotICB7Ci0JaWYoY29uZmlndXJhdGlvbiA9PSBudWxsKQotCXsKLQkgIGNvbmZpZ3VyYXRpb24gPSBuZXcgWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24oKTsKLQl9Ci0JVmFsaWRhdGlvbkluZm8gdmFsaW5mbyA9IG5ldyBWYWxpZGF0aW9uSW5mbyh1cmkpOwotCVhTREVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIgPSBuZXcgWFNERXJyb3JIYW5kbGVyKHZhbGluZm8pOwotCXRyeQotCXsKLQkgIFhNTEdyYW1tYXJQcmVwYXJzZXIgZ3JhbW1hclByZXBhcnNlciA9IG5ldyBYTUxHcmFtbWFyUHJlcGFyc2VyKCk7Ci0JICBncmFtbWFyUHJlcGFyc2VyLnJlZ2lzdGVyUHJlcGFyc2VyKFhNTEdyYW1tYXJEZXNjcmlwdGlvbi5YTUxfU0NIRU1BLG51bGwvKnNjaGVtYUxvYWRlciovKTsKLQkJICAKLQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0UHJvcGVydHkoQ29uc3RhbnRzLlhFUkNFU19QUk9QRVJUWV9QUkVGSVggKyBDb25zdGFudHMuWE1MR1JBTU1BUl9QT09MX1BST1BFUlRZLCBuZXcgWE1MR3JhbW1hclBvb2xJbXBsKCkpOwotCSAgZ3JhbW1hclByZXBhcnNlci5zZXRGZWF0dXJlKENvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyBDb25zdGFudHMuQ09OVElOVUVfQUZURVJfRkFUQUxfRVJST1JfRkVBVFVSRSwgZmFsc2UpOwotICAgICAgZ3JhbW1hclByZXBhcnNlci5zZXRGZWF0dXJlKENvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyBDb25zdGFudHMuTkFNRVNQQUNFU19GRUFUVVJFLCB0cnVlKTsKLSAgICAgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLk5BTUVTUEFDRV9QUkVGSVhFU19GRUFUVVJFLCB0cnVlKTsKLQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLlZBTElEQVRJT05fRkVBVFVSRSwgdHJ1ZSk7Ci0JICBncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5TQ0hFTUFfVkFMSURBVElPTl9GRUFUVVJFLCB0cnVlKTsKLQotCSAgZ3JhbW1hclByZXBhcnNlci5zZXRGZWF0dXJlKENvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyBDb25zdGFudHMuRVhURVJOQUxfR0VORVJBTF9FTlRJVElFU19GRUFUVVJFLCB0cnVlKTsKLQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLkVYVEVSTkFMX1BBUkFNRVRFUl9FTlRJVElFU19GRUFUVVJFLCB0cnVlKTsKLQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLldBUk5fT05fRFVQTElDQVRFX0FUVERFRl9GRUFUVVJFLCB0cnVlKTsKLQkgICAgIAotCSAgaWYoY29uZmlndXJhdGlvbi5nZXRGZWF0dXJlKFhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uLkhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUykpCi0JICB7Ci0JICAgIHRyeQotCSAgICB7Ci0JICAgICAgZ3JhbW1hclByZXBhcnNlci5zZXRGZWF0dXJlKENvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyAiaG9ub3VyLWFsbC1zY2hlbWFMb2NhdGlvbnMiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCSAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLQkgICAgewotCSAgICAgIC8vIGNhdGNoIHRoZSBleGNlcHRpb24gYW5kIGlnbm9yZQotCSAgICB9Ci0JICB9Ci0JICAKLQkgIGlmKGNvbmZpZ3VyYXRpb24uZ2V0RmVhdHVyZShYU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5GVUxMX1NDSEVNQV9DT05GT1JNQU5DRSkpIHsKLQkJdHJ5Ci0JCXsKLQkJICBncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5TQ0hFTUFfRlVMTF9DSEVDS0lORywgdHJ1ZSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQkvLyBpZ25vcmUgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBzZXQgaXQgb3IgY2FuJ3QuCi0JCX0KLQkJCi0JICB9Ci0JICAgICAgCi0JICBncmFtbWFyUHJlcGFyc2VyLnNldEVycm9ySGFuZGxlcihlcnJvckhhbmRsZXIpOwotCSAgaWYgKHVyaXJlc29sdmVyICE9IG51bGwpCi0JICB7Ci0JICAgIFhTREVudGl0eVJlc29sdmVyIHJlc29sdmVyID0gbmV3IFhTREVudGl0eVJlc29sdmVyKHVyaXJlc29sdmVyLCB1cmkpOwotCSAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkKLQkgICAgewotCSAgICAgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RW50aXR5UmVzb2x2ZXIocmVzb2x2ZXIpOwotCSAgICB9Ci0JICB9Ci0KLQkgIHRyeQotCSAgewotCSAgCVhNTElucHV0U291cmNlIGlzID0gbmV3IFhNTElucHV0U291cmNlKG51bGwsIHVyaSwgdXJpLCBpbnB1dFN0cmVhbSwgbnVsbCk7Ci0JICAgIGdyYW1tYXJQcmVwYXJzZXIuZ2V0TG9hZGVyKFhNTEdyYW1tYXJEZXNjcmlwdGlvbi5YTUxfU0NIRU1BKTsKLQkJZ3JhbW1hclByZXBhcnNlci5wcmVwYXJzZUdyYW1tYXIoWE1MR3JhbW1hckRlc2NyaXB0aW9uLlhNTF9TQ0hFTUEsaXMpOwotCSAgfQotCSAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCSAgewotCSAgICAvL3BhcnNlciB3aWxsIHJldHVybiBudWxsIHBvaW50ZXIgZXhjZXB0aW9uIGlmIHRoZSBkb2N1bWVudCBpcyBzdHJ1Y3R1cmFsbHkgaW52YWxpZAotCQkvL1RPRE86IGxvZyBlcnJvciBtZXNzYWdlCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgfQotCX0KLQljYXRjaCAoRXhjZXB0aW9uIGUpCi0JewotICAgICAgLy8gVE9ETzogbG9nIGVycm9yLgotCSAgLy9TeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JfQotCXJldHVybiB2YWxpbmZvOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgVVJJIHJlc29sdmVyIHRvIHVzZSB3aXRoIFhTRCB2YWxpZGF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIHVyaXJlc29sdmVyCi0gICAqICAgICAgICAgIFRoZSBVUkkgcmVzb2x2ZXIgdG8gdXNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VVJJUmVzb2x2ZXIoVVJJUmVzb2x2ZXIgdXJpcmVzb2x2ZXIpCi0gIHsKLSAgICB0aGlzLnVyaXJlc29sdmVyID0gdXJpcmVzb2x2ZXI7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIFhTREVycm9ySGFuZGxlciBoYW5kbGUgWGVyY2VzIHBhcnNpbmcgZXJyb3JzIGFuZCBwdXRzIHRoZSBlcnJvcnMKLSAgICogaW50byB0aGUgZ2l2ZW4gVmFsaWRhdGlvbkluZm8gb2JqZWN0LgotICAgKi8KLSAgcHJvdGVjdGVkIGNsYXNzIFhTREVycm9ySGFuZGxlciBpbXBsZW1lbnRzIFhNTEVycm9ySGFuZGxlcgotICB7Ci0JICAKLSAgICBwcml2YXRlIGZpbmFsIFZhbGlkYXRpb25JbmZvIHZhbGluZm87Ci0KLSAgICBwdWJsaWMgWFNERXJyb3JIYW5kbGVyKFZhbGlkYXRpb25JbmZvIHZhbGluZm8pCi0gICAgewotICAgICAgdGhpcy52YWxpbmZvID0gdmFsaW5mbzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkIGEgdmFsaWRhdGlvbiBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIHNldmVyaXR5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBlcnJvcktleSBUaGUgWGVyY2VzIGVycm9yIGtleS4KLSAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdGhhdCBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lc3NhZ2UuCi0gICAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZFZhbGlkYXRpb25NZXNzYWdlKFN0cmluZyBlcnJvcktleSwgWE1MUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uLCBpbnQgc2V2ZXJpdHkpCi0gICAgeyAKLSAgICAgIFN0cmluZyBzeXN0ZW1JZCA9IGV4Y2VwdGlvbi5nZXRFeHBhbmRlZFN5c3RlbUlkKCk7Ci0gICAgICBpZiAoc3lzdGVtSWQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHNldmVyaXR5ID09IERPTUVycm9yLlNFVkVSSVRZX1dBUk5JTkcpCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxpbmZvLmFkZFdhcm5pbmcoZXhjZXB0aW9uLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZXhjZXB0aW9uLmdldExpbmVOdW1iZXIoKSwgZXhjZXB0aW9uLmdldENvbHVtbk51bWJlcigpLCBzeXN0ZW1JZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdmFsaW5mby5hZGRFcnJvcihleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBleGNlcHRpb24uZ2V0TGluZU51bWJlcigpLCBleGNlcHRpb24uZ2V0Q29sdW1uTnVtYmVyKCksIHN5c3RlbUlkLCBlcnJvcktleSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVycm9ySGFuZGxlciN3YXJuaW5nKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MUGFyc2VFeGNlcHRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2FybmluZyhTdHJpbmcgZG9tYWluLCBTdHJpbmcga2V5LCBYTUxQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBYTklFeGNlcHRpb24KLQl7Ci0gICAgCWFkZFZhbGlkYXRpb25NZXNzYWdlKGtleSwgZXhjZXB0aW9uLCBET01FcnJvci5TRVZFUklUWV9XQVJOSU5HKTsKLQl9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVycm9ySGFuZGxlciNlcnJvcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVycm9yKFN0cmluZyBkb21haW4sIFN0cmluZyBrZXksIFhNTFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFhOSUV4Y2VwdGlvbgotICAgIHsKLSAgICAJYWRkVmFsaWRhdGlvbk1lc3NhZ2Uoa2V5LCBleGNlcHRpb24sIERPTUVycm9yLlNFVkVSSVRZX0VSUk9SKTsKLQl9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVycm9ySGFuZGxlciNmYXRhbEVycm9yKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MUGFyc2VFeGNlcHRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTdHJpbmcgZG9tYWluLCBTdHJpbmcga2V5LCBYTUxQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBYTklFeGNlcHRpb24KLQl7Ci0gICAgCWFkZFZhbGlkYXRpb25NZXNzYWdlKGtleSwgZXhjZXB0aW9uLCBET01FcnJvci5TRVZFUklUWV9GQVRBTF9FUlJPUik7Ci0JfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBYU0RFbnRpdHlSZXNvbHZlciB3cmFwcyBhbiBpZHJlc29sdmVyIHRvIHByb3ZpZGUgZW50aXR5IHJlc29sdXRpb24gdG8KLSAgICogdGhlIFhTRCB2YWxpZGF0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgWFNERW50aXR5UmVzb2x2ZXIgaW1wbGVtZW50cyBYTUxFbnRpdHlSZXNvbHZlcgotICB7Ci0gICAgcHJpdmF0ZSBVUklSZXNvbHZlciB1cmlyZXNvbHZlciA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWRyZXNvbHZlcgotICAgICAqICAgICAgICAgIFRoZSBpZHJlc29sdmVyIHRoaXMgZW50aXR5IHJlc29sdmVyIHdyYXBzLgotICAgICAqIEBwYXJhbSBiYXNlbG9jYXRpb24gVGhlIGJhc2UgbG9jYXRpb24gdG8gcmVzb2x2ZSB3aXRoLgotICAgICAqLwotICAgIHB1YmxpYyBYU0RFbnRpdHlSZXNvbHZlcihVUklSZXNvbHZlciB1cmlyZXNvbHZlciwgU3RyaW5nIGJhc2Vsb2NhdGlvbikKLSAgICB7Ci0gICAgICB0aGlzLnVyaXJlc29sdmVyID0gdXJpcmVzb2x2ZXI7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyKQotICAgICAqLwotICAgIHB1YmxpYyBYTUxJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFhNTFJlc291cmNlSWRlbnRpZmllciByZXNvdXJjZUlkZW50aWZpZXIpIHRocm93cyBYTklFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgU3RyaW5nIGxpdGVyYWxTeXN0ZW1JZCA9IHJlc291cmNlSWRlbnRpZmllci5nZXRMaXRlcmFsU3lzdGVtSWQoKTsKLSAgICAgIGlmKGxpdGVyYWxTeXN0ZW1JZCAhPSBudWxsKQotICAgICAgewotICAgIAlyZXNvdXJjZUlkZW50aWZpZXIuc2V0TGl0ZXJhbFN5c3RlbUlkKGxpdGVyYWxTeXN0ZW1JZC5yZXBsYWNlKCdcXCcsJy8nKSk7Ci0gICAgICB9Ci0gICAgICAgIC8vIFRPRE8gY3M6IEluIHJldmlzaW9uIDEuMSB3ZSBleHBsaWNpdGx5IG9wZW5lZCBhIHN0cmVhbSB0byBlbnN1cmUKLSAgICAgICAgLy8gZmlsZSBJL08gcHJvYmxlbXMgcHJvZHVjZWQgbWVzc2FnZXMuIEkndmUgcmVtb3ZlIHRoaXMgZnVkZ2UgZm9yIG5vdwotICAgICAgICAvLyBzaW5jZSBJIGNhbid0IHNlZW0gdG8gcmVwcm9kdWNlIHRoZSBwcm9ibGVtIGl0IHdhcyBpbnRlbmRlZCB0byBmaXguCi0gICAgICAgIC8vIEknbSBob3BpbmcgdGhlIG5ld2VyIFhlcmNlcyBjb2RlIGJhc2UgaGFzIGZpeGVkIHRoaXMgcHJvYmxlbSBhbmQgdGhlIGZ1ZGdlIGlzIGRlZnVuY3QuCi0gICAgICAgIHJldHVybiBYTUxWYWxpZGF0b3IuX2ludGVybmFsUmVzb2x2ZUVudGl0eSh1cmlyZXNvbHZlciwgcmVzb3VyY2VJZGVudGlmaWVyKTsKLSAgICAgIAotICAgIH0KLSAgfSAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExODk4MDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciwgU3RhbmRhcmRzIGZvciBUZWNobm9sb2d5IGluIEF1dG9tb3RpdmUgUmV0YWlsLCBidWcgMTE0NzAzMwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC5YU0RDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YU0RDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IKLXsKLSAgcHJvdGVjdGVkIEhhc2hNYXAgeHNkQ29uZmlndXJhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3Ijc2V0dXBWYWxpZGF0aW9uKG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldHVwVmFsaWRhdGlvbihOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIAotICB7Ci0JWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBYU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbigpOwotCWJvb2xlYW4gaG9ub3VyQWxsU2NoZW1hTG9jYXRpb25zID0gWFNEQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhTRENvcmVQcmVmZXJlbmNlTmFtZXMuSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TKTsKLQlib29sZWFuIGZ1bGxTY2hlbWFDb25mb3JtYW5jZSA9IFhTRENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYU0RDb3JlUHJlZmVyZW5jZU5hbWVzLkZVTExfU0NIRU1BX0NPTkZPUk1BTkNFKTsKLQl0cnkKLQl7Ci0JICBjb25maWd1cmF0aW9uLnNldEZlYXR1cmUoWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TLCBob25vdXJBbGxTY2hlbWFMb2NhdGlvbnMpOwotCSAgY29uZmlndXJhdGlvbi5zZXRGZWF0dXJlKFhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uLkZVTExfU0NIRU1BX0NPTkZPUk1BTkNFLCBmdWxsU2NoZW1hQ29uZm9ybWFuY2UpOwotCX0KLQljYXRjaChFeGNlcHRpb24gZSkKLQl7Ci0JICAvLyBVbmFibGUgdG8gc2V0IHRoZSBob25vdXIgYWxsIHNjaGVtYSBsb2NhdGlvbnMgb3B0aW9uLiBEbyBub3RoaW5nLgotCX0KLQl4c2RDb25maWd1cmF0aW9ucy5wdXQoY29udGV4dCwgY29uZmlndXJhdGlvbik7Ci0JCi0Jc3VwZXIuc2V0dXBWYWxpZGF0aW9uKGNvbnRleHQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IjdGVhcmRvd25WYWxpZGF0aW9uKG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHRlYXJkb3duVmFsaWRhdGlvbihOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIAotICB7Ci0JeHNkQ29uZmlndXJhdGlvbnMucmVtb3ZlKGNvbnRleHQpOwotCQotCXN1cGVyLnRlYXJkb3duVmFsaWRhdGlvbihjb250ZXh0KTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yI3ZhbGlkYXRlKGphdmEubGFuZy5TdHJpbmcsIGphdmEuaW8uSW5wdXRTdHJlYW0sIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0c3RyZWFtLCBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpCi0gIHsgIAotCVhTRFZhbGlkYXRvciB2YWxpZGF0b3IgPSBYU0RWYWxpZGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkKLQlYU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gKFhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uKXhzZENvbmZpZ3VyYXRpb25zLmdldChjb250ZXh0KTsKLQotCVZhbGlkYXRpb25SZXBvcnQgdmFscmVwb3J0ID0gbnVsbDsKLQkKLQl2YWxyZXBvcnQgPSB2YWxpZGF0b3IudmFsaWRhdGUodXJpLCBpbnB1dHN0cmVhbSwgY29uZmlndXJhdGlvbik7Ci0JCSAgICAgICAgCi0JcmV0dXJuIHZhbHJlcG9ydDsKLSAgfQotCSAgCi0gIC8qKgotICAgKiBTdG9yZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZSBtZXNzYWdlIHBhcmFtZXRlcnMuIEZvciBYU0QgdmFsaWRhdGlvbiB0aGVyZQotICAgKiBhcmUgdGhyZWUgYWRkaXRpb25hbCBwaWVjZXMgb2YgaW5mb3JtYXRpb24gdG8gc3RvcmU6Ci0gICAqIHBhcmFtWzBdID0gdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGVycm9yCi0gICAqIHBhcmFtWzFdID0gdGhlICdzcXVpZ2dsZSBzZWxlY3Rpb24gc3RyYXRlZ3knIGZvciB3aGljaCBET00gcGFydCB0byBzcXVpZ2dsZQotICAgKiBwYXJhbVsyXSA9IHRoZSBuYW1lIG9yIHZhbHVlIG9mIHdoYXQgaXMgdG8gYmUgc3F1aWdnbGVkCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IjYWRkSW5mb1RvTWVzc2FnZShvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25NZXNzYWdlLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYWRkSW5mb1RvTWVzc2FnZShWYWxpZGF0aW9uTWVzc2FnZSB2YWxpZGF0aW9uTWVzc2FnZSwgSU1lc3NhZ2UgbWVzc2FnZSkKLSAgeyAKLQlTdHJpbmcga2V5ID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0S2V5KCk7Ci0JaWYoa2V5ICE9IG51bGwpCi0JewotCSAgWFNETWVzc2FnZUluZm9IZWxwZXIgbWVzc2FnZUluZm9IZWxwZXIgPSBuZXcgWFNETWVzc2FnZUluZm9IZWxwZXIoKTsKLQkgIFN0cmluZ1tdIG1lc3NhZ2VJbmZvID0gbWVzc2FnZUluZm9IZWxwZXIuY3JlYXRlTWVzc2FnZUluZm8oa2V5LCB2YWxpZGF0aW9uTWVzc2FnZS5nZXRNZXNzYWdlKCkpOwotCi0JICBtZXNzYWdlLnNldEF0dHJpYnV0ZShDT0xVTU5fTlVNQkVSX0FUVFJJQlVURSwgbmV3IEludGVnZXIodmFsaWRhdGlvbk1lc3NhZ2UuZ2V0Q29sdW1uTnVtYmVyKCkpKTsKLQkgIG1lc3NhZ2Uuc2V0QXR0cmlidXRlKFNRVUlHR0xFX1NFTEVDVElPTl9TVFJBVEVHWV9BVFRSSUJVVEUsIG1lc3NhZ2VJbmZvWzBdKTsKLQkgIG1lc3NhZ2Uuc2V0QXR0cmlidXRlKFNRVUlHR0xFX05BTUVfT1JfVkFMVUVfQVRUUklCVVRFLCBtZXNzYWdlSW5mb1sxXSk7Ci0JfQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IjZ2V0VmFsaWRhdG9ySUQoKQotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWxpZGF0b3JJRCgpCi0gIHsKLSAgICAvLyBCZWNhdXNlIHRoaXMgY2xhc3MgaXMgdXNlZCBhcyBhIGRlbGVnYXRlLCByZXR1cm4gdGhlIGlkIG9mIHRoZSB2YWxpZGF0b3IKLSAgICAvLyB3aGljaCBkZWxlZ2F0ZXMgdG8gdGhpcyBjbGFzcy4KLQotICAgIHJldHVybiBYU0REZWxlZ2F0aW5nVmFsaWRhdG9yLmNsYXNzLmdldE5hbWUoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YU0REZWxlZ2F0aW5nVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hTRERlbGVnYXRpbmdWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2MTViYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hTRERlbGVnYXRpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmRlbGVnYXRlcy5EZWxlZ2F0aW5nVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSB1bmlxdWUgbmFtZSAoY2xhc3MgbmFtZSkgd2hpY2ggdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrCi0gKiB3aWxsIHVzZSB0byBpZGVudGlmeSB0aGUgWFNEIHZhbGlkYXRvci4gVGhlIGFjdHVhbCBkZWxlZ2F0aW5nIHZhbGlkYXRvcgotICogZnVuY3Rpb25hbGl0eSBpcyBwcm92aWRlZCBieSB0aGUgYmFzZSBjbGFzcy4gVGhlIGFjdHVhbCB2YWxpZGF0aW9uCi0gKiBmdW5jdGlvbmFsaXR5IGlzIHByb3ZpZGVkIGJ5IHRoZSBkZWxlZ2F0ZXMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgY2xhc3MgYXMKLSAqIHRoZWlyIHRhcmdldC4KLSAqLwotcHVibGljIGNsYXNzIFhTRERlbGVnYXRpbmdWYWxpZGF0b3IgZXh0ZW5kcyBEZWxlZ2F0aW5nVmFsaWRhdG9yCi17Ci0gIC8qKgotICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFhTRERlbGVnYXRpbmdWYWxpZGF0b3IoKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWFNETWVzc2FnZUluZm9IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWFNETWVzc2FnZUluZm9IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRlMzI5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hTRE1lc3NhZ2VJbmZvSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlOwotCi0KLS8qKgotICogVGhlIFhTRE1lc3NhZ2VJbmZvSGVscGVyIGNyZWF0ZXMgYSBzdHJpbmcgd2l0aCB0aGUKLSAqLwotcHVibGljIGNsYXNzIFhTRE1lc3NhZ2VJbmZvSGVscGVyCi17Ci0gIHB1YmxpYyBYU0RNZXNzYWdlSW5mb0hlbHBlcigpCi0gIHsgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBjcmVhdGVNZXNzYWdlSW5mbyhTdHJpbmcgZXJyb3JLZXksIFN0cmluZyBlcnJvck1lc3NhZ2UpCi0gIHsgCi0gICAgLy9Ob3cgbWFwIHRoZSBlcnJvciBrZXkgdG8gd2hhdCB3ZSB3b3VsZCB3YW50IHRvIHVuZGVybGluZToKLSAgICBTdHJpbmcgbmFtZU9yVmFsdWUgPSAiIjsKLSAgICBTdHJpbmcgc2VsZWN0aW9uU3RyYXRlZ3kgPSAiIjsKLSAgICBpZihlcnJvcktleSAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlcnJvcktleS5lcXVhbHMoInM0cy1lbHQtaW52YWxpZC1jb250ZW50LjEiKSB8fCBlcnJvcktleS5lcXVhbHMoInM0cy1lbHQtbXVzdC1tYXRjaC4xIikgfHwgCi0gICAgCQkgIGVycm9yS2V5LmVxdWFscygiczRzLWF0dC1tdXN0LWFwcGVhciIpIHx8IGVycm9yS2V5LmVxdWFscygiczRzLWVsdC1pbnZhbGlkLWNvbnRlbnQuMiIpKSAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJCAgLy8kTk9OLU5MUy0zJCAgLy8kTk9OLU5MUy00JAotICAgICAgeyAKLSAgICAJc2VsZWN0aW9uU3RyYXRlZ3kgPSAiU1RBUlRfVEFHIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJzNHMtYXR0LW5vdC1hbGxvd2VkIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsgCi0gICAgCXNlbGVjdGlvblN0cmF0ZWd5ID0gIkFUVFJJQlVURV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBuYW1lT3JWYWx1ZSA9IGdldEZpcnN0U3RyaW5nQmV0d2VlblNpbmdsZVF1b3RlcyhlcnJvck1lc3NhZ2UpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJzNHMtYXR0LWludmFsaWQtdmFsdWUiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgeyAKLSAgICAJc2VsZWN0aW9uU3RyYXRlZ3kgPSAiQVRUUklCVVRFX1ZBTFVFIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBuYW1lT3JWYWx1ZSA9IGdldEZpcnN0U3RyaW5nQmV0d2VlblNpbmdsZVF1b3RlcyhlcnJvck1lc3NhZ2UpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJzNHMtZWx0LWNoYXJhY3RlciIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7IAotICAgIAlzZWxlY3Rpb25TdHJhdGVneSA9ICJURVhUIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJzcmMtcmVzb2x2ZS40LjIiKSB8fCBlcnJvcktleS5lcXVhbHMoInNyYy1yZXNvbHZlIikpICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0gICAgICB7IAotICAgIAlzZWxlY3Rpb25TdHJhdGVneSA9ICJWQUxVRV9PRl9BVFRSSUJVVEVfV0lUSF9HSVZFTl9WQUxVRSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbmFtZU9yVmFsdWUgPSBnZXRGaXJzdFN0cmluZ0JldHdlZW5TaW5nbGVRdW90ZXMoZXJyb3JNZXNzYWdlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiRXFSZXF1aXJlZEluQXR0cmlidXRlIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJPcGVuUXVvdGVFeHBlY3RlZCIpIHx8IAotICAgIAkJICBlcnJvcktleS5lcXVhbHMoIkxlc3N0aGFuSW5BdHRWYWx1ZSIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgewotICAgICAgCXNlbGVjdGlvblN0cmF0ZWd5ID0gIkFUVFJJQlVURV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBuYW1lT3JWYWx1ZSA9IGdldEZpcnN0U3RyaW5nQmV0d2VlblF1b3RlcyhlcnJvck1lc3NhZ2UpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJFbGVtZW50VW50ZXJtaW5hdGVkIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uU3RyYXRlZ3kgPSAiRU5USVJFX0VMRU1FTlQiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoIkVUYWdVbnRlcm1pbmF0ZWQiKSB8fCBlcnJvcktleS5lcXVhbHMoIkVUYWdSZXF1aXJlZCIpKSAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvblN0cmF0ZWd5ID0gIkVORF9UQUciOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotICAgIFN0cmluZyBtZXNzYWdlSW5mb1tdID0gbmV3IFN0cmluZ1syXTsKLSAgICBtZXNzYWdlSW5mb1swXSA9IHNlbGVjdGlvblN0cmF0ZWd5OwotICAgIG1lc3NhZ2VJbmZvWzFdID0gbmFtZU9yVmFsdWU7Ci0gICAgcmV0dXJuIG1lc3NhZ2VJbmZvOyAgICAKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgdmFsdWUgYmV0d2VlbiB0aGUgZmlyc3QgcGFpciBvZiBzaW5nbGUgcXVvdGVzCi0gICAqIEl0IGlzIHVzZWQgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBlcnJvciBNZXNzYWdlIChmb3IgZXhhbXBsZQotICAgKiBhbiBhdHRyaWJ1dGUgbmFtZSkKLSAgICogCi0gICAqIEBwYXJhbSBzCi0gICAqIAkJVGhlIHN0cmluZyB0byBleHRyYWN0IHRoZSB2YWx1ZSBmcm9tLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRGaXJzdFN0cmluZ0JldHdlZW5TaW5nbGVRdW90ZXMoU3RyaW5nIHMpCi0gIHsKLSAgICByZXR1cm4gZ2V0Rmlyc3RTdHJpbmdCZXR3ZWVuRGVsaW1pdGVycyhzLCAnXCcnKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgdmFsdWUgYmV0d2VlbiB0aGUgZmlyc3QgcGFpciBvZiBxdW90ZXMKLSAgICogSXQgaXMgdXNlZCB0byBleHRyYWN0IGluZm9ybWF0aW9uIGZyb20gdGhlIGVycm9yIE1lc3NhZ2UgKGZvciBleGFtcGxlCi0gICAqIGFuIGF0dHJpYnV0ZSBuYW1lKQotICAgKiAKLSAgICogQHBhcmFtIHMKLSAgICogCQlUaGUgc3RyaW5nIHRvIGV4dHJhY3QgdGhlIHZhbHVlIGZyb20uCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZpcnN0U3RyaW5nQmV0d2VlblF1b3RlcyhTdHJpbmcgcykKLSAgewotICAgIHJldHVybiBnZXRGaXJzdFN0cmluZ0JldHdlZW5EZWxpbWl0ZXJzKHMsICdcIicpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSB2YWx1ZSBiZXR3ZWVuIHRoZSBmaXJzdCBzdGFydCBhbmQgZW5kIG9jY3VycmVuY2VzIG9mIHRoZSBnaXZlbiBkZWxpbWl0ZXIgY2hhcmFjdGVyLgotICAgKiAKLSAgICogQHBhcmFtIHMKLSAgICogCQlUaGUgc3RyaW5nIHRvIGV4dHJhY3QgdGhlIHZhbHVlIGZyb20uCi0gICAqIEBwYXJhbSBkZWxpbWl0ZXIgCi0gICAqIAkJVGhlIHN0YXJ0IGFuZCBlbmQgY2hhcmFjdGVyCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZpcnN0U3RyaW5nQmV0d2VlbkRlbGltaXRlcnMoU3RyaW5nIHMsIGNoYXIgZGVsaW1pdGVyKQotICB7Ci0gICAgaW50IGZpcnN0ID0gcy5pbmRleE9mKGRlbGltaXRlcik7Ci0gICAgaW50IHNlY29uZCA9IHMuaW5kZXhPZihkZWxpbWl0ZXIsIGZpcnN0ICsgMSk7Ci0gICAgU3RyaW5nIHN0cmluZ0JldHdlZW5EZWxpbWl0ZXJzID0gbnVsbDsKLSAgICBpZiAoZmlyc3QgIT0gLTEgJiYgc2Vjb25kICE9IC0xKQotICAgIHsgCi0gICAgICBzdHJpbmdCZXR3ZWVuRGVsaW1pdGVycyA9IHMuc3Vic3RyaW5nKGZpcnN0ICsgMSwgc2Vjb25kKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0cmluZ0JldHdlZW5EZWxpbWl0ZXJzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hTRFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YU0RWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJlMWEwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hTRFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotCi0KLS8qKgotICogQW4gWFNEIHZhbGlkYXRvciBzcGVjaWZpYyB0byBFY2xpcHNlLiBUaGlzIHZhbGlkYXRvciB3aWxsIHdyYXAgdGhlIGludGVybmFsCi0gKiBYU0QgdmFsaWRhdG9yIGFuIHByb3ZpZGUgYXV0b21hdGljIFVSSSByZXNvbHV0aW9uIHN1cHBvcnQuCi0gKiBVc2luZyB0aGlzIGNsYXNzIGlzIGVxdWl2YWxlbnQgdG8gdXNpbmcgdGhlIGludGVybmFsIFhTRCB2YWxpZGF0b3IgYW5kIHJlZ2lzdGVyaW5nCi0gKiB0aGUgVVJJIHJlc29sdmVyIGZyb20gdGhlIFVSSSByZXNvbHV0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIFhTRFZhbGlkYXRvciBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlhTRFZhbGlkYXRvcgotewotICBwcml2YXRlIHN0YXRpYyBYU0RWYWxpZGF0b3IgaW5zdGFuY2UgPSBudWxsOwotICAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBYU0QgdmFsaWRhdG9yLiBUaGUgdmFsaWRhdG9yCi0gICAqIGNhbiBiZSByZXVzZWQgYW5kIGNhbm5vdCBiZSBjdXN0b21pemVkIHNvIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSBpbnN0YW5jZSBvZiBpdC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgWFNEIHZhbGlkYXRvci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgWFNEVmFsaWRhdG9yIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmKGluc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgaW5zdGFuY2UgPSBuZXcgWFNEVmFsaWRhdG9yKCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotICAvKioKLSAgICogQ29uc3RydWN0b3IuIENyZWF0ZSB0aGUgWFNEIHZhbGlkYXRvciBhbmQgc2V0IHRoZSBVUkkgcmVzb2x2ZXIuCi0gICAqLwotICBwcm90ZWN0ZWQgWFNEVmFsaWRhdG9yKCkKLSAgewotICAgIHRoaXMuc2V0VVJJUmVzb2x2ZXIoVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvWFNEQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC9YU0RDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMzBmMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC9YU0RDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWwuWFNEQ01NYW5hZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgWFNEQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFhTRENvcmVQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgWFNEQ29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLSAgICBYU0RDTU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zdGFydHVwKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBYU0RDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0RDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZGI0ZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0RDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC5YU0RDb3JlUGx1Z2luOwotCi0vKioKLSAqIFNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIFhTRCBDb3JlIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBub2RlID0gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoWFNEQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQkKLQkJLy8gVmFsaWRhdGlvbiBwcmVmZXJlbmNlcy4KLQkJbm9kZS5wdXRCb29sZWFuKFhTRENvcmVQcmVmZXJlbmNlTmFtZXMuSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TLCBmYWxzZSk7Ci0KLQkJLy8gSW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgYmVzdCBjb21wYXRpYmlsaXR5IGFuZCBjb25mb3JtYW5jZSB0byB0aGUgWE1MIFNjaGVtYQotCQkvLyBzcGVjaWZpY2F0aW9uIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhpcyBiZSBkZWZhdWx0ZWQgdG8gdHJ1ZS4KLQkJbm9kZS5wdXRCb29sZWFuKFhTRENvcmVQcmVmZXJlbmNlTmFtZXMuRlVMTF9TQ0hFTUFfQ09ORk9STUFOQ0UsIHRydWUpOwotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTRENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTU5Y2MxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBDb21tb24gcHJlZmVyZW5jZSBrZXlzIHVzZWQgYnkgWFNEIGNvcmUKLSAqLwotcHVibGljIGNsYXNzIFhTRENvcmVQcmVmZXJlbmNlTmFtZXMgewotCXByaXZhdGUgWFNEQ29yZVByZWZlcmVuY2VOYW1lcygpIHsKLQkJLy8gZW1wdHkgcHJpdmF0ZSBjb25zdHJ1Y3RvciBzbyB1c2VycyBjYW5ub3QgaW5zdGFudGlhdGUgY2xhc3MKLQl9Ci0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGFsbCBzY2hlbWEgbG9jYXRpb25zIHNob3VsZCBiZSBob25vdXJlZAotCSAqIGR1cmluZyBYU0QgdmFsaWRhdGlvbi4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge1RSVUUsIEZBTFNFfQotCSAqIDwvcD4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMgPSAiaG9ub3VyQWxsU2NoZW1hTG9jYXRpb25zIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTF9TQ0hFTUFfQ09ORk9STUFOQ0UgPSAiZnVsbFNjaGVtYUNvbmZvcm1hbmNlIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTJiNTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLXJlZmFjdG9yIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWFkdCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1hZHQteHNkIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLWNvbW1vbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1hZHQteHNkLXR5cGV2aXoiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtc2VhcmNoIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9hcGFjaGUveGVyY2VzLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2NvbW1vbi91aS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MDBlNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgoteHNkZWRpdG9yLmphcgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotb3JnLmVjbGlwc2Uud3N0LnhzZC51aV8xLjAuMC5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFiMzgyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueHNkLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1Yzg4MmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSNUdWUgSmFuIDE2IDE3OjQ4OjMwIEVTVCAyMDA3DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS40DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS40DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNzgyZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNUdWUgSmFuIDE2IDE3OjA0OjEzIEVTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPXVzZXIKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjFjZDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYNCi1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTANCi1jb21waWxlcnMucC5idWlsZD0wDQotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xDQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MA0KLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wDQotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MA0KLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTANCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTANCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MA0KLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MA0KLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTANCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wDQotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTANCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDk0ZDJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVfVUlfUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC54c2QudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4xMDEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQucHJvcGVydGllczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXo7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24ubGF5b3V0czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnByb3ZpZGVyczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwb2xpY2llczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5sYXlvdXRzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5pY29uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLnNlYXJjaDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwubmF2aWdhdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwubnNlZGl0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iuc3RydWN0dXJlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWxzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC52YWxpZGF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aWRnZXRzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzO3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC40MDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5nZWY7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5lZGl0O2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UueHNkLmVkaXQ7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3Jpbmc7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjMwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLnNlYXJjaDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjguMSw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZjk2NmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMtc2VhcmNoLyxcCi0gICAgICAgICAgIHNyYy1yZWZhY3Rvci8sXAotICAgICAgICAgICBzcmMtYWR0LyxcCi0gICAgICAgICAgIHNyYy1hZHQteHNkLyxcCi0gICAgICAgICAgIHNyYy1hZHQteHNkLXR5cGV2aXovLFwKLSAgICAgICAgICAgc3JjLWNvbW1vbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgY29tcG9uZW50LnhtbAotb3V0cHV0Li4gPSBiaW4vCi1qYXZhY1NvdXJjZT0xLjQKLWphdmFjVGFyZ2V0PTEuNAotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvY29tcG9uZW50LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTQ0NDNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIgotCW5hbWU9Im9yZy5lY2xpcHNlLndzdC54c2QiPgotCTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci0JPHBsdWdpbglpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4JaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL1hTREZpbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL1hTREZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTAwZjFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9YU0RGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ibGFuay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvYmxhbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTM2ZTIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ibGFuay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvYnJvd3NlYnV0dG9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9icm93c2VidXR0b24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2RhZTU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9icm93c2VidXR0b24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2NvbGxhcHNlX2F0dHIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2NvbGxhcHNlX2F0dHIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODcyYmVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9jb2xsYXBzZV9hdHRyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9kZWxldGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9kZWxldGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5MjJhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZGVsZXRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZGxjbDE2L3NjaGVtYXZpZXdfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2RsY2wxNi9zY2hlbWF2aWV3X2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2Nzk1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZGxjbDE2L3NjaGVtYXZpZXdfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2RsY2wxNi9zaG93cHJvcGVydGllc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2RsY2wxNi9zaG93cHJvcGVydGllc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTRmZjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9kbGNsMTYvc2hvd3Byb3BlcnRpZXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9kdG9vbDE2L2NhcHR1cmVzY3JlZW4uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2R0b29sMTYvY2FwdHVyZXNjcmVlbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NzBjOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2R0b29sMTYvY2FwdHVyZXNjcmVlbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZHRvb2wxNi9oZWxwX2NvbnRlbnRzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9kdG9vbDE2L2hlbHBfY29udGVudHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGJmNjE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9kdG9vbDE2L2hlbHBfY29udGVudHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2R0b29sMTYvc2hvd3Byb3BlcnRpZXNfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9kdG9vbDE2L3Nob3dwcm9wZXJ0aWVzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NGZmMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2R0b29sMTYvc2hvd3Byb3BlcnRpZXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9lbGNsMTYvc2NoZW1hdmlld19jby5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZWxjbDE2L3NjaGVtYXZpZXdfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmQ3ZjFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9lbGNsMTYvc2NoZW1hdmlld19jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZWxjbDE2L3Nob3dwcm9wZXJ0aWVzX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZWxjbDE2L3Nob3dwcm9wZXJ0aWVzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYzE5YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2VsY2wxNi9zaG93cHJvcGVydGllc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2V0b29sMTYvY2FwdHVyZXNjcmVlbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXRvb2wxNi9jYXB0dXJlc2NyZWVuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2ODMwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXRvb2wxNi9jYXB0dXJlc2NyZWVuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ldG9vbDE2L2hlbHBfY29udGVudHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2V0b29sMTYvaGVscF9jb250ZW50cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNzAzMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2V0b29sMTYvaGVscF9jb250ZW50cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXRvb2wxNi9zaG93cHJvcGVydGllc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2V0b29sMTYvc2hvd3Byb3BlcnRpZXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRjMTlhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXRvb2wxNi9zaG93cHJvcGVydGllc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2V0b29sMTYvem9vbW1pbnVzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ldG9vbDE2L3pvb21taW51cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMmM5MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2V0b29sMTYvem9vbW1pbnVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ldG9vbDE2L3pvb21wbHVzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9ldG9vbDE2L3pvb21wbHVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY2ZDc1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXRvb2wxNi96b29tcGx1cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXhwYW5kX2F0dHIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2V4cGFuZF9hdHRyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMyODdlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZXhwYW5kX2F0dHIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL2ZpbHRlci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZmlsdGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZlNmYwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvZmlsdGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBbnlBdHRyaWJ1dGVkaXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREFueUF0dHJpYnV0ZWRpcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NDBhMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREFueUF0dHJpYnV0ZWRpcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQW55ZGlzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBbnlkaXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGRhNzUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBbnlkaXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZUdyb3VwLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBdHRyaWJ1dGVHcm91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOGRmNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZUdyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlR3JvdXBSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmMxZGI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlR3JvdXBSZWZkaXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZUdyb3VwUmVmZGlzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkYzU4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlR3JvdXBSZWZkaXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZUdyb3VwZGlzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBdHRyaWJ1dGVHcm91cGRpcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlODE2NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZUdyb3VwZGlzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBdHRyaWJ1dGVSZWZkaXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZVJlZmRpcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MGFmNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREF0dHJpYnV0ZVJlZmRpcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQXR0cmlidXRlZGlzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBdHRyaWJ1dGVkaXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjFkMTkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RBdHRyaWJ1dGVkaXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTRENvbXBsZXhDb250ZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RDb21wbGV4Q29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MGMxMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTRENvbXBsZXhDb250ZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RDb21wbGV4VHlwZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQ29tcGxleFR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzhiOTRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RDb21wbGV4VHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQ29tcGxleFR5cGVkaXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTRENvbXBsZXhUeXBlZGlzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkMWIzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNEQ29tcGxleFR5cGVkaXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREVsZW1lbnRSZWZkaXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREVsZW1lbnRSZWZkaXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGJkM2FhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RFbGVtZW50UmVmZGlzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RFbGVtZW50ZGlzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RFbGVtZW50ZGlzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1Njg2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNERWxlbWVudGRpcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNER3JvdXAuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREdyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYyYzJkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNER3JvdXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREdyb3VwUmVmLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RHcm91cFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ODk4N2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREdyb3VwUmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RHcm91cFJlZmRpcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNER3JvdXBSZWZkaXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjE3ZTliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RHcm91cFJlZmRpcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNER3JvdXBkaXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTREdyb3VwZGlzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThkZjdmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvWFNER3JvdXBkaXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTRFNpbXBsZUNvbnRlbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L1hTRFNpbXBsZUNvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWU4MTJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9YU0RTaW1wbGVDb250ZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9hbGxfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9hbGxfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEzN2ZiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYWxsX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYWxsZGlzX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYWxsZGlzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNTQ4NGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2FsbGRpc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Fubm90YXRpb25zaGVhZGVyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9hbm5vdGF0aW9uc2hlYWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZmI2ODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Fubm90YXRpb25zaGVhZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9hdHRyaWJ1dGVncm91cHNoZWFkZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2F0dHJpYnV0ZWdyb3Vwc2hlYWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MDkyZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2F0dHJpYnV0ZWdyb3Vwc2hlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYXR0cmlidXRlc2hlYWRlci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvYXR0cmlidXRlc2hlYWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNTQ4NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2F0dHJpYnV0ZXNoZWFkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Nob2ljZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Nob2ljZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWY1ODNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9jaG9pY2Vfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9jaG9pY2VkaXNfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9jaG9pY2VkaXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjYzRmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvY2hvaWNlZGlzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZGlyZWN0aXZlc2hlYWRlci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZGlyZWN0aXZlc2hlYWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMDBjYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2RpcmVjdGl2ZXNoZWFkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2VsZW1lbnRzaGVhZGVyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9lbGVtZW50c2hlYWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZjcyMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2VsZW1lbnRzaGVhZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9lcnJvcl9tYXJrZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Vycm9yX21hcmtlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZTFlMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2Vycm9yX21hcmtlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZXJyb3JfdHNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9lcnJvcl90c2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjA0OGQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9lcnJvcl90c2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2V4dG5zbl9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2V4dG5zbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjRhOTVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9leHRuc25fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9leHRuc25kaXNfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9leHRuc25kaXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQzY2QwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZXh0bnNuZGlzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvZ3JvdXBzaGVhZGVyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9ncm91cHNoZWFkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2ExMWNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9ncm91cHNoZWFkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2luZGV4LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9pbmRleC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZjlhYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L2luZGV4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9ub3RhdGlvbnNoZWFkZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L25vdGF0aW9uc2hlYWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNWM2NDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L25vdGF0aW9uc2hlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc2VxdWVuY2Vfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zZXF1ZW5jZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmI4NjEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zZXF1ZW5jZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NlcXVlbmNlZGlzX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc2VxdWVuY2VkaXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ5NzJkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc2VxdWVuY2VkaXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zaW1wbGV0eXBlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc2ltcGxldHlwZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTc0NDMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zaW1wbGV0eXBlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc2ltcGxldHlwZWRpc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NpbXBsZXR5cGVkaXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwOTczZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc2ltcGxldHlwZWRpc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfbGlzdF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfbGlzdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjUxOGM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX2xpc3Rfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX2xpc3RkaXNfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX2xpc3RkaXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgzODI1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF9saXN0ZGlzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF9yZXN0cmljdF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfcmVzdHJpY3Rfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZhOWFmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF9yZXN0cmljdF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfcmVzdHJpY3RkaXNfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX3Jlc3RyaWN0ZGlzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNjc2NjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfcmVzdHJpY3RkaXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX3VuaW9uX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF91bmlvbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjEzMTQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi9zbXBsX3VuaW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF91bmlvbmRpc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3NtcGxfdW5pb25kaXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE3MjAzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb2JqMTYvc21wbF91bmlvbmRpc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3R5cGVzaGVhZGVyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vYmoxNi90eXBlc2hlYWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNjc1NDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL29iajE2L3R5cGVzaGVhZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vdnIxNi9hdHRyaWJ1dGVvdmVybGF5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vdnIxNi9hdHRyaWJ1dGVvdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkzMWY5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb3ZyMTYvYXR0cmlidXRlb3ZlcmxheS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb3ZyMTYvZXJyb3Jfb3ZyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vdnIxNi9lcnJvcl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTlkY2NjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vdnIxNi9lcnJvcl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L2V4dG5zbl9vdnIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L2V4dG5zbl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzQ0MjBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vdnIxNi9leHRuc25fb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vdnIxNi9leHRuc25kaXNfb3ZyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9pY29ucy9vdnIxNi9leHRuc25kaXNfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlYjc2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb3ZyMTYvZXh0bnNuZGlzX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb3ZyMTYvdGV4dG92ZXJsYXkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL2ljb25zL292cjE2L3RleHRvdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ1NWMyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvaWNvbnMvb3ZyMTYvdGV4dG92ZXJsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjE4MzVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg1NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotISBQcm9wZXJ0aWVzIGZpbGUgZm9yIGNvbXBvbmVudDogWE1TQ0ggLSBYTUwgVG9vbHMgLSAgWE1MIFNjaGVtYSBFZGl0b3IKLSEgUGFja2FnZWQgZm9yIHRyYW5zbGF0aW9uIGluOiAgeG1sLnppcAotCi0hCi0hIFBsdWdpbgotIQotX1VJX1BMVUdJTl9OQU1FICAgICAgICAgICAgID0gWE1MIFNjaGVtYSBFZGl0b3IKLV9VSV9FRElUT1JfTkFNRSAgICAgICAgICAgICA9IFhNTCBTY2hlbWEgRWRpdG9yCi0KLV9VSV9BQ1RJT05fRVhUX0dFTkVSQVRFICAgICAgPSAmR2VuZXJhdGUKLV9VSV9BQ1RJT05fRVhUX0dFTkVSQVRFX0RETCAgPSAmRERMLi4uCi1fVUlfQUNUSU9OX0VYVF9HRU5FUkFURV9EVEQgID0gRCZURC4uLgotX1VJX0FDVElPTl9FWFRfR0VORVJBVEVfSkFWQSA9ICZKYXZhIEJlYW5zLi4uCi0KLV9VSV9BQ1RJT05fRVhUX0dFTkVSQVRFX1hTRCA9ICZHZW5lcmF0ZSBYTUwgU2NoZW1hCi1fVUlfV0laQVJEX05BTUVfTkVXX1hTRCAgICAgPSBYTUwgU2NoZW1hCi0KLV9VSV9YTUxfVE9PTFNfUFJFRkVSRU5DRV9QQUdFICA9IFhNTAotX1VJX1hNTF9TQ0hFTUFfUFJFRkVSRU5DRSAgICAgID0gWE1MIFNjaGVtYSBGaWxlcwotCi1fVUlfV0laQVJEX05FV19YU0QgICAgICAgICAgICAgPSBYTUwgU2NoZW1hCi1fVUlfQ1JFQVRFX0FfTkVXX1NDSEVNQSAgICAgICAgPSBDcmVhdGUgYSBuZXcgWE1MIHNjaGVtYSBmaWxlCi0KLSEgTmV3IHByb3BlcnR5IHRhYnMKLV9VSV9MQUJFTF9HRU5FUkFMICAgICAgICAgID0gR2VuZXJhbAotX1VJX0xBQkVMX0FUVFJJQlVURVMgICAgICAgPSBBdHRyaWJ1dGVzCi1fVUlfTEFCRUxfRE9DVU1FTlRBVElPTiAgICA9IERvY3VtZW50YXRpb24KLV9VSV9MQUJFTF9UWVBFX0NPTlNUUkFJTlRTID0gQ29uc3RyYWludHMKLV9VSV9MQUJFTF9BUFBMSUNBVElPTl9JTkZPID0gQXBwbGljYXRpb24gSW5mbwotX1VJX0xBQkVMX0VYVEVOU0lPTlMgICAgICAgPSBFeHRlbnNpb25zCi1fVUlfTEFCRUxfRkFDRVRTICAgICAgICAgICA9IEZhY2V0cwotX1VJX0xBQkVMX0VOVU1FUkFUSU9OUyAgICAgPSBFbnVtZXJhdGlvbnMKLV9VSV9MQUJFTF9OQU1FU1BBQ0UgICAgICAgID0gTmFtZXNwYWNlCi1fVUlfTEFCRUxfQURWQU5DRUQgICAgICAgICA9IEFkdmFuY2VkCi0KLV9VSV9MQUJFTF9SRUFEX09OTFkgICAgID0gcmVhZC1vbmx5Ci1fVUlfTEFCRUxfS0lORCAgICAgICAgICA9IEtpbmQ6Ci1fVUlfTEFCRUxfVkFSSUVUWSAgICAgICA9IFZhcmlldHk6Ci0KLV9VSV9MQUJFTF9BUFBfSU5GTyAgICAgID0gQXBwIEluZm8KLQotIQotISBTY2hlbWEgRmlsZSBXaW5kb3cKLSEKLV9VSV9MQUJFTF9GSUxFX05BTUUgICAgICAgICAgICAgID0gRmlsZSBuYW1lOgotX1VJX0xBQkVMX1ZFUlNJT04gICAgICAgICAgICAgICAgPSBWZXJzaW9uOgotX1VJX1RPT0xUSVBfVkVSU0lPTiAgICAgICAgICAgICAgPSBDb252ZW5pZW50IGF0dHJpYnV0ZSB0byBzdG9yZSB2ZXJzaW9uIG51bWJlcgotX1VJX0xBQkVMX0xBTkdVQUdFICAgICAgICAgICAgICAgPSBMYW5ndWFnZToKLV9VSV9UT09MVElQX0xBTkdVQUdFICAgICAgICAgICAgID0gUmVwcmVzZW50cyBuYXR1cmFsIGxhbmd1YWdlIGlkZW50aWZpZXJzCi1fVUlfR1JPVVBfTkFNRVNQQUNFICAgICAgICAgICAgICA9IE5hbWVzcGFjZQotX1VJX0xBQkVMX1NDSEVNQV9QUkVGSVggICAgICAgICAgPSBQcmVmaXg6Ci1fVUlfVE9PTFRJUF9TQ0hFTUFfUFJFRklYICAgICAgICA9IFRoZSBwcmVmaXggYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IG5hbWVzcGFjZS4KLV9VSV9MQUJFTF9UQVJHRVRfTkFNRV9TUEFDRSAgICAgID0gVGFyZ2V0IG5hbWVzcGFjZToKLV9VSV9UT09MVElQX1RBUkdFVF9OQU1FX1NQQUNFICAgID0gVGhlIG5hbWVzcGFjZSBmb3IgdGhpcyBzY2hlbWEuCi1fVUlfQlVUVE9OX0FQUExZICAgICAgICAgICAgICAgICA9IEFwcGx5Ci1fVUlfTEFCRUxfQVRUUklCVVRFX0ZPUk1fREVGQVVMVCA9IEF0dHJpYnV0ZSBmb3JtIGRlZmF1bHQ6Ci1fVUlfVE9PTFRJUF9BVFRSSUJVVEVfRk9STSAgICAgICA9IEluZGljYXRlcyBpZiBhbGwgYXR0cmlidXRlcyBpbiBhIHNjaGVtYSBtdXN0IGJlIHF1YWxpZmllZCBvciBub3QgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50Ci1fVUlfTEFCRUxfRUxFTUVOVF9GT1JNX0RFRkFVTFQgICA9IEVsZW1lbnQgZm9ybSBkZWZhdWx0OgotX1VJX1RPT0xUSVBfRUxFTUVOVF9GT1JNX0RFRkFVTFQgPSBJbmRpY2F0ZXMgaWYgYWxsIGVsZW1lbnRzIGluIGEgc2NoZW1hIG11c3QgYmUgcXVhbGlmaWVkIG9yIG5vdCBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQKLV9VSV9MQUJFTF9CTE9DS19ERUZBVUxUICAgICAgICAgID0gQmxvY2sgZGVmYXVsdDoKLV9VSV9UT09MVElQX0JMT0NLX0RFRkFVTFQgICAgICAgID0gQ29udHJvbCBkZXJpdmF0aW9ucyBmb3IgZXZlcnkgdHlwZSBhbmQgZWxlbWVudCBpbiB0aGUgc2NoZW1hCi1fVUlfTEFCRUxfRklOQUxfREVGQVVMVCAgICAgICAgICA9IEZpbmFsIGRlZmF1bHQ6Ci1fVUlfVE9PTFRJUF9GSU5BTF9ERUZBVUxUICAgICAgICA9IENvbnRyb2wgZGVyaXZhdGlvbnMgZm9yIGV2ZXJ5IHR5cGUgYW5kIGVsZW1lbnQgaW4gdGhlIHNjaGVtYQotX1VJX0FDVElPTl9ERUxFVEVfSU5DTFVERSAgICAgICAgPSBEZWxldGUKLV9VSV9BQ1RJT05fREVMRVRFX05PREVTICAgICAgICAgID0gRGVsZXRlIE5vZGVzCi0hIE5vdGUgdG8gdHJhbnNsYXRvcnM6IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGFjcm9ueW0gZm9yIFVuaWZvcm0gUmVzb3VyY2UgSW5kaWNhdG9yCi1fVUlfTEFCRUxfVVJJICAgICAgICAgICAgICAgICAgICA9IFVSSToKLQotCi1fVUlfTEFCRUxfQUREICAgICAgICAgICAgICA9IEFkZC4uLgotX1VJX0xBQkVMX0VESVQgICAgICAgICAgICAgPSBFZGl0Li4uCi1fVUlfTEFCRUxfUEFUVEVSTlMgICAgICAgICA9IFBhdHRlcm5zCi1fRVJST1JfRklMRV9BTFJFQURZX0VYSVNUUyA9IFRoZSBmaWxlIG5hbWUgYWxyZWFkeSBleGlzdHM6IHswfQotCi0hCi0hIEFueSBTZWN0aW9uCi0hCi0hIE5vdGUgdG8gdHJhbnNsYXRvcnMgLSB0cmFuc2xhdGUgb25seSB0aGUgd29yZCBhbmQKLV9VSV9MQUJFTF9OQU1FU1BBQ0VfQU5EX1BST0NFU1NfQ09OVEVOVFMgPSBuYW1lc3BhY2UgYW5kIHByb2Nlc3NDb250ZW50cwotCi0hCi0hIG1pbk9jY3VycyBhbmQgbWF4T2NjdXJzIHNlY3Rpb24KLSEKLSEgTm90ZSB0byB0cmFuc2xhdG9ycyAtIHRyYW5zbGF0ZSBvbmx5IHRoZSB3b3JkIGFuZAotX1VJX0xBQkVMX01JTk9DQ1VSU19BTkRfTUFYT0NDVVJTID0gbWluT2NjdXJzIGFuZCBtYXhPY2N1cnMKLQotIQotISBWYWx1ZSBJbmZvcm1hdGlvbiBTZWN0aW9uCi0hCi1fVUlfTEFCRUxfVkFMVUVfSU5GT1JNQVRJT04gICA9IFZhbHVlIEluZm9ybWF0aW9uCi0KLSEKLSEgTm90YXRpb24gd2luZG93Ci0hCi1fVUlfTk9UQVRJT05fTkFNRSAgICAgICAgICAgICAgICA9IE5hbWU6Ci1fVUlfTk9UQVRJT05fUFVCTElDICAgICAgICAgICAgICA9IFB1YmxpYzoKLV9VSV9OT1RBVElPTl9TWVNURU0gICAgICAgICAgICAgID0gU3lzdGVtOgotX1VJX1RPT0xUSVBfUFVCTElDICAgICAgICAgICAgICAgPSBBbiBvcHRpb25hbCBwdWJsaWMgaWRlbnRpZmllcgotX1VJX1RPT0xUSVBfU1lTVEVNICAgICAgICAgICAgICAgPSBBbiBvcHRpb25hbCBVUkkgcmVmZXJlbmNlCi0KLSEKLSEgQ29tcGxleCBUeXBlIFdpbmRvdwotIQotX1VJX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgPSBOYW1lOgotX1VJX0FCU1RSQUNUICAgICAgICAgICAgICAgICAgICAgPSBBYnN0cmFjdDoKLV9VSV9NSVhFRCAgICAgICAgICAgICAgICAgICAgICAgID0gTWl4ZWQ6Ci1fVUlfQkxPQ0sgICAgICAgICAgICAgICAgICAgICAgICA9IEJsb2NrOgotX1VJX0ZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgPSBGaW5hbDoKLQotX1VJX0NUX1RPT0xUSVBfTUlYRUQgICAgICAgICAgICAgPSBJbmRpY2F0ZXMgaWYgdHlwZSBtYXkgY29udGFpbiBtaXhlZCBjb250ZW50Ci1fVUlfQ1RfVE9PTFRJUF9BQlNUUkFDVCAgICAgICAgICA9IFdoZW4gYSBjb21wbGV4IHR5cGUgaXMgZGVjbGFyZWQgYWJzdHJhY3QsIGl0IGNhbm5vdCBiZSB1c2VkIGluIGFuIGluc3RhbmNlIGRvY3VtZW50Ci1fVUlfQ1RfVE9PTFRJUF9GSU5BTCAgICAgICAgICAgICA9IFlvdSBjYW4gdXNlIHRoaXMgdG8gcHJldmVudCBmdXJ0aGVyIGRlcml2YXRpb25zCi1fVUlfQ1RfVE9PTFRJUF9CTE9DSyAgICAgICAgICAgICA9IFlvdSBjYW4gdXNlIHRoaXMgdG8gYmxvY2sgYW55IGRlcml2YXRpb25zCi0KLSEKLSEgU2ltcGxlQ29udGVudCBhbmQgQ29tcGxleENvbnRlbnQgV2luZG93Ci0hIAotX1VJX0xBQkVMX0RFUklWRURfQlkgICAgICAgICAgICA9IERlcml2ZWQgYnk6Ci1fVUlfVE9PTFRJUF9ERVJJVkVEX0JZICAgICAgICAgID0gRGVyaXZlIGJ5IGV4dGVuc2lvbiB0byBpbmhlcml0IGZyb20gYSBiYXNlIHR5cGUgY29udGVudCBtb2RlbCBhbmQgYWRkIHRvIGl0LiBEZXJpdmUgYnkgcmVzdHJpY3Rpb24gdG8gcmVzdHJpY3QgdGhlIGNvbnRlbnQgbW9kZWwgb2YgYW4gZXhpc3RpbmcgdHlwZS4KLQotIQotISBDb21ibyBib3ggaXRlbXMgLSBubyBuZWVkIHRvIHRyYW5zbGF0ZQotIQotX1VJX0NPTUJPX1JFU1RSSUNUSU9OICAgICAgICAgICA9IHJlc3RyaWN0aW9uCi1fVUlfQ09NQk9fRVhURU5TSU9OICAgICAgICAgICAgID0gZXh0ZW5zaW9uCi0KLSEKLSEgRWxlbWVudCAmIEVsZW1lbnQgUmVmIFdpbmRvdwotIQotX1VJX0VMRU1FTlRfTkFNRSAgICAgICAgICAgICAgICAgPSBOYW1lOgotX1VJX0NIRUNLQk9YX05JTExBQkxFICAgICAgICAgICAgPSBOaWxsYWJsZQotX1VJX0NIRUNLQk9YX0FCU1RSQUNUICAgICAgICAgICAgPSBBYnN0cmFjdAotX1VJX1NVQlNUSVRVVElPTiAgICAgICAgICAgICAgICAgPSBTdWJzdGl0dXRpb24gZ3JvdXA6Ci1fVUlfTUlOSU1VTSAgICAgICAgICAgICAgICAgICAgICA9IE1pbmltdW06Ci1fVUlfTUFYSU1VTSAgICAgICAgICAgICAgICAgICAgICA9IE1heGltdW06Ci1fVUlfUkVGRVJFTkNFX05BTUUgICAgICAgICAgICAgICA9IFJlZmVyZW5jZSBuYW1lOgotCi1fVUlfVE9PTFRJUF9FTEVNRU5UX01JTklNVU0gICAgICA9IEEgbm9uLW5lZ2F0aXZlIGludGVnZXIgdGhhdCBzcGVjaWZpZXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHRpbWVzIGFuIGVsZW1lbnQgY2FuIG9jY3VyLgotX1VJX1RPT0xUSVBfRUxFTUVOVF9NQVhJTVVNICAgICAgPSBBIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIG9yIHVuYm91bmRlZCBpZiB0aGVyZSBpcyBubyB1cHBlciBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBlbGVtZW50IGNhbiBvY2N1ci4KLV9VSV9UT09MVElQX0VMRU1FTlRfQUJTVFJBQ1QgICAgID0gV2hlbiBhbiBlbGVtZW50IGlzIGRlY2xhcmVkIGFic3RyYWN0LCBhIG1lbWJlciBvZiBpdHMgZXF1aXZhbGVudCBjbGFzcyBtdXN0IGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQsCi1fVUlfVE9PTFRJUF9FTEVNRU5UX05JTCAgICAgICAgICA9IElmIHNlbGVjdGVkLCBhbiBhdHRyaWJ1dGUgY2FuIGJlIGluY2x1ZGVkIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBlbGVtZW50IGhhcyBhIG5pbCB2YWx1ZS4KLV9VSV9UT09MVElQX0VMRU1FTlRfU1VCU1RJVFVUSU9OID0gU2VsZWN0IHRoZSBlbGVtZW50IHRoYXQgY2FuIGJlIHN1YnN0aXR1dGVkIGJ5IHRoaXMgZWxlbWVudAotX1VJX1RPT0xUSVBfRUxFTUVOVF9GT1JNICAgICAgICAgPSBJbmRpY2F0ZXMgaWYgdGhlIGVsZW1lbnQgaXMgcXVhbGlmZWQgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50Ci1fVUlfVE9PTFRJUF9FTEVNRU5UX1ZBTFVFICAgICAgICA9IFByb3ZpZGVzIGEgZGVmYXVsdCBvciBmaXhlZCB2YWx1ZSBmb3IgdGhlIGVsZW1lbnQuCi0KLQotIQotISBBdHRyaWJ1dGUgV2luZG93Ci0hICAgIF9VSV9DT01CT19CT1ggc3RyaW5ncyBhcmUgdXNlZCBpbiBjb2RlIGdlbmVyYXRpb24uIAotISAgICBQcm9iYWJseSBkb24ndCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQKLSEKLV9VSV9DT01CT19CT1hfUkVRVUlSRUQgICAgICAgICAgID0gcmVxdWlyZWQKLV9VSV9DT01CT19CT1hfT1BUSU9OQUwgICAgICAgICAgID0gb3B0aW9uYWwKLV9VSV9DT01CT19CT1hfUFJPSElCSVRFRCAgICAgICAgID0gcHJvaGliaXRlZAotCi1fVUlfRklYRUQgICAgICAgICAgICAgICAgICAgICAgICA9IEZpeGVkCi1fVUlfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICA9IERlZmF1bHQKLV9VSV9BVFRSSUJVVEVfTkFNRSAgICAgICAgICAgICAgID0gQXR0cmlidXRlIG5hbWU6Ci1fVUlfVVNBR0UgICAgICAgICAgICAgICAgICAgICAgICA9IFVzYWdlOgotX1VJX0ZPUk0gICAgICAgICAgICAgICAgICAgICAgICAgPSBGb3JtIHF1YWxpZmljYXRpb246Ci1fVUlfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgICA9IFZhbHVlCi0KLV9VSV9MQUJFTF9PVEhFUl9BVFRSSUJVVEVTICAgICAgID0gT3RoZXIgQXR0cmlidXRlcwotCi1fVUlfVE9PTFRJUF9BVFRSSUJVVEVfVVNFICAgICAgICA9IEluZGljYXRlcyBpZiB0aGUgYXR0cmlidXRlIGlzIHJlcXVpcmVkLCBvcHRpb25hbCwgb3IgcHJvaGliaXRlZAotX1VJX1RPT0xUSVBfQVRUUklCVVRFX0ZPUk0gICAgICAgPSBJbmRpY2F0ZXMgaWYgdGhlIGF0dHJpYnV0ZSBpcyBxdWFsaWZlZCBvciBub3QgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50Ci1fVUlfVE9PTFRJUF9BVFRSSUJVVEVfVkFMVUUgICAgICA9IFByb3ZpZGVzIGRlZmF1bHQgb3IgZml4ZWQgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUuIERlZmF1bHQgdmFsdWUgb25seSB2YWxpZCBpZiBVc2FnZSB2YWx1ZSBpcyBzZXQgdG8gb3B0aW9uYWwuCi0KLV9VSV9QUk9DRVNTX0NPTlRFTlRTICAgICAgICAgICAgID0gUHJvY2VzcyBjb250ZW50czoKLQotIQotISBBbm5vdGF0aW9uIC0gRG9jICYgQXBwSW5mbyBXaW5kb3cKLSEKLV9VSV9DT01NRU5UICAgICAgICAgICAgICAgICAgICAgID0gQ29tbWVudAotX1VJX1RPT0xUSVBfQ09NTUVOVCAgICAgICAgICAgICAgPSBJbmZvcm1hdGlvbiB1c2VmdWwgdG8gdGhlIHVzZXIgb3IgYXBwbGljYXRpb24KLV9VSV9TT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgID0gU291cmNlOgotX1VJX1RPT0xUSVBfU09VUkNFICAgICAgICAgICAgICAgPSBBbiBvcHRpb25hbCBVUkkgcmVmZXJlbmNlIHRvIHN1cHBsZW1lbnQgdGhlIGxvY2FsIGluZm9ybWF0aW9uCi1fVUlfTEFOR1VBR0UgICAgICAgICAgICAgICAgICAgICA9IExhbmd1YWdlOgotX1VJX1RPT0xUSVBfTEFOR1VBR0VfQU5OT1RBVElPTiAgPSBJbmRpY2F0ZSB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggdGhlIGFubm90YXRpb24gaXMgZXhwcmVzc2VkCi0KLSEKLSEgR3JvdXAKLSEgCi1fVUlfQ09OVEVOVF9NT0RFTCAgICAgICAgICAgICAgID0gQ29udGVudCBtb2RlbAotX1VJX1NFUVVFTkNFICAgICAgICAgICAgICAgICAgICA9IFNlcXVlbmNlCi1fVUlfQ0hPSUNFICAgICAgICAgICAgICAgICAgICAgID0gQ2hvaWNlCi1fVUlfQUxMICAgICAgICAgICAgICAgICAgICAgICAgID0gQWxsCi0KLQotIQotISBTaW1wbGUgVHlwZSBSZWxhdGVkIEZhY2V0cyAgLSBhcHBlYXIgYXMgZW50cmllcyBpbiBhIHRhYmxlIC0gcmVzdHJpY3Rpb24gb24gc2ltcGxlIHR5cGUKLSEKLV9VSV9HUk9VUF9GQUNFVFMgICAgICAgICAgICAgICAgPSBGYWNldHMKLV9VSV9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgPSBMZW5ndGgKLV9VSV9NSU5JTVVNX0xFTkdUSCAgICAgICAgICAgICAgPSBNaW5pbXVtIExlbmd0aAotX1VJX01BWElNVU1fTEVOR1RIICAgICAgICAgICAgICA9IE1heGltdW0gTGVuZ3RoCi1fVUlfTUlOSU1VTV9JTkNMVVNJVkUgICAgICAgICAgID0gTWluaW11bSBJbmNsdXNpdmUKLV9VSV9NQVhJTVVNX0lOQ0xVU0lWRSAgICAgICAgICAgPSBNYXhpbXVtIEluY2x1c2l2ZQotX1VJX01JTklNVU1fRVhDTFVTSVZFICAgICAgICAgICA9IE1pbmltdW0gRXhjbHVzaXZlCi1fVUlfTUFYSU1VTV9FWENMVVNJVkUgICAgICAgICAgID0gTWF4aW11bSBFeGNsdXNpdmUKLV9VSV9UT1RBTF9ESUdJVFMgICAgICAgICAgICAgICAgPSBUb3RhbCBEaWdpdHMKLV9VSV9GUkFDVElPTl9ESUdJVFMgICAgICAgICAgICAgPSBGcmFjdGlvbiBEaWdpdHMKLV9VSV9XSElURV9TUEFDRSAgICAgICAgICAgICAgICAgPSBXaGl0ZSBTcGFjZQotX1VJX0ZBQ0VUX05BTUUgICAgICAgICAgICAgICAgICA9IE5hbWUKLV9VSV9GQUNFVF9WQUxVRSAgICAgICAgICAgICAgICAgPSBWYWx1ZQotX1VJX0ZBQ0VUX0ZJWEVEICAgICAgICAgICAgICAgICA9IEZpeGVkCi0KLV9VSV9UT09MVElQX0xFTkdUSCAgICAgICAgICAgICAgPSBUaGUgbnVtYmVyIG9mIHVuaXRzIG9mIGxlbmd0aC4gTXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLgotX1VJX1RPT0xUSVBfTUlOX0xFTiAgICAgICAgICAgICA9IFRoZSBtaW5pbXVtIG51bWJlciBvZiB1bml0cyBvZiBsZW5ndGguIE11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci4KLV9VSV9UT09MVElQX01BWF9MRU4gICAgICAgICAgICAgPSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdW5pdHMgb2YgbGVuZ3RoLiBNdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuCi1fVUlfVE9PTFRJUF9NQVhfSU5DTFVTSVZFICAgICAgID0gVGhlIHVwcGVyIGJvdW5kIG9mIHRoZSB2YWx1ZSBzcGFjZS4gVGhlIHZhbHVlIGlzIGl0c2VsZiBpbmNsdWRlZC4KLV9VSV9UT09MVElQX01BWF9FWENMVVNJVkUgICAgICAgPSBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIHZhbHVlIHNwYWNlLiBUaGUgdmFsdWUgaXMgaXRzZWxmIGV4Y2x1ZGVkLgotX1VJX1RPT0xUSVBfTUlOX0lOQ0xVU0lWRSAgICAgICA9IFRoZSBsb3dlciBib3VuZCBvZiB0aGUgdmFsdWUgc3BhY2UuIFRoZSB2YWx1ZSBpcyBpdHNlbGYgaW5jbHVkZWQuCi1fVUlfVE9PTFRJUF9NSU5fRVhDTFVTSVZFICAgICAgID0gVGhlIGxvd2VyIGJvdW5kIG9mIHRoZSB2YWx1ZSBzcGFjZS4gVGhlIHZhbHVlIGlzIGl0c2VsZiBleGNsdWRlZC4KLV9VSV9UT09MVElQX1RPVEFMX0RJR0lUUyAgICAgICAgPSBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGVjaW1hbCBkaWdpdHMuIE11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLgotX1VJX1RPT0xUSVBfRlJBQ1RJT05fRElHSVRTICAgICA9IFRoZSBtYXhpbXVtIG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cyBpbiB0aGUgZnJhY3Rpb25hbCBwYXJ0LiBNdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuCi1fVUlfVE9PTFRJUF9XSElURV9TUEFDRSAgICAgICAgID0gSW5kaWNhdGVzIGlmIHdoaXRlIHNwYWNlIHNob3VsZCBiZSBwcmVzZXJ2ZWQsIHJlcGxhY2VkIG9yIGNvbGxhcHNlZC4gCi0KLV9VSV9UT09MVElQX1BBVFRFUk4gICAgICAgICAgICAgPSBDb25zdHJhaW5zIHRoZSB2YWx1ZSB0byBtYXRjaCBhIHNwZWNpZmljIHBhdHRlcm4uIFRoZSBwYXR0ZXJuIG11c3QgYmUgYSByZWd1bGFyIGV4cHJlc3Npb24uIAotX1VJX1RPT0xUSVBfRU5VTSAgICAgICAgICAgICAgICA9IENvbnN0cmFpbnMgdGhlIHZhbHVlIHRvIGEgc3BlY2lmaWVkIHNldCBvZiB2YWx1ZXMuIAotCi0hCi0hIFNpbXBsZS9Db21wbGV4IFR5cGUgU2VsZWN0aW9uIAotIQotX1VJX0xBQkVMX1RZUEVfSU5GT1JNQVRJT04gICAgICAgICAgPSBUeXBlIGluZm9ybWF0aW9uCi1fVUlfTEFCRUxfQkFTRV9UWVBFICAgICAgICAgICAgICAgICA9IEJhc2UgdHlwZQotX1VJX0xBQkVMX0JBU0VfVFlQRV9XSVRIX0NPTE9OICAgICAgPSBCYXNlIHR5cGU6Ci1fVUlfTEFCRUxfU0VUX0JBU0VfVFlQRSAgICAgICAgICAgICA9IFNldCBCYXNlIFR5cGUKLV9VSV9BQ1RJT05fU0VUX0JBU0VfVFlQRSAgICAgICAgICAgID0gU2V0IEJhc2UgVHlwZS4uLgotX1VJX1JBRElPX05PTkUgICAgICAgICAgICAgICAgICAgICAgPSBOb25lCi1fVUlfUkFESU9fQlVJTFRfSU5fU0lNUExFX1RZUEUgICAgICA9IEJ1aWx0LWluIHNpbXBsZSB0eXBlCi1fVUlfUkFESU9fVVNFUl9ERUZJTkVEX1NJTVBMRV9UWVBFICA9IFVzZXItZGVmaW5lZCBzaW1wbGUgdHlwZQotX1VJX1JBRElPX1VTRVJfREVGSU5FRF9DT01QTEVYX1RZUEUgPSBVc2VyLWRlZmluZWQgY29tcGxleCB0eXBlCi1fVUlfTEFCRUxfTkVXX0NPTVBMRVhfVFlQRSAgICAgICAgICA9IE5ldyBDb21wbGV4IFR5cGUKLV9VSV9MQUJFTF9ORVdfU0lNUExFX1RZUEUgICAgICAgICAgID0gTmV3IFNpbXBsZSBUeXBlCi1fVUlfTEFCRUxfU0VUX1RZUEUJCQkJICAgID0gU2V0IFR5cGUKLV9VSV9MQUJFTF9TRVRfRVhJU1RJTkdfVFlQRSAJCT0gU2V0IEV4aXN0aW5nIFR5cGUuLi4KLV9VSV9OT19UWVBFICAgICAgICAgICAgICAgICAgICAgICAgID0gKipub25lKioKLV9VSV9MQUJFTF9DT01QT05FTlRTCQkJCT0gQ29tcG9uZW50czoKLV9VSV9MQUJFTF9RVUFMSUZJRVIJCQkJCT0gUXVhbGlmaWVyOgotCi1fVUlfTEFCRUxfQ09NUE9ORU5UX05BTUUJCQkgICA9IENvbXBvbmVudCBOYW1lOgotX1VJX0xBQkVMX01BVENISU5HX0NPTVBPTkVOVFMJCSAgID0gTWF0Y2hpbmcgQ29tcG9uZW50czoKLV9VSV9MQUJFTF9NQVRDSElOR19UWVBFUwkJICAgCSAgID0gTWF0Y2hpbmcgVHlwZXM6Ci1fVUlfTEFCRUxfVFlQRV9OQU1FCQkJCQkgICA9IFR5cGUgTmFtZToKLV9VSV9MQUJFTF9TUEVDSUZJRURfRklMRQkJCSAgID0gU3BlY2lmaWVkIEZpbGUKLV9VSV9MQUJFTF9FTkNMT1NJTkdfUFJPSkVDVAkJCSAgID0gRW5jbG9zaW5nIFByb2plY3QKLV9VSV9MQUJFTF9XT1JLU1BBQ0UJCQkJCSAgID0gV29ya3NwYWNlCi1fVUlfTEFCRUxfQ1VSUkVOVF9SRVNPVVJDRQkJCSAgID0gQ3VycmVudCBSZXNvdXJjZQotX1VJX0xBQkVMX1NFQVJDSF9TQ09QRQkJCQkgICA9IFNlYXJjaCBTY29wZQotX1VJX0xBQkVMX05BUlJPV19TRUFSQ0hfU0NPUEVfUkVTT1VSQ0UgPSBVc2UgcmVzb3VyY2UgdmlldyB0byBuYXJyb3cgc2VhcmNoIHNjb3BlCi1fVUlfTEFCRUxfQVZBSUxBQkxFX1RZUEVTCQkJICAgPSBBdmFpbGFibGUgVHlwZXMKLQotCi0hCi0hIENvbWJvLWJveCB2YWx1ZSAKLSEgTk9URSBUTyBUUkFOU0xBVE9SOiBEbyBub3QgdHJhbnNsYXRlIGZvbGxvd2luZyBsaW5lCi1fVUlfREVGQVVMVF9BTk9OWU1PVVMgICAgICAgICAgICAgICA9ICoqYW5vbnltb3VzKioKLQotIQotISBVbmlxdWUsIEtleSBhbmQgS2V5UmVmIHdpbmRvdwotIQotX1VJX1JFRkVSRU5DRV9LRVkgICAgICAgICAgICAgICAgICAgPSBSZWZlcmVuY2Uga2V5Ci1fVUlfU0VMRUNUT1IgICAgICAgICAgICAgICAgICAgICAgICA9IFNlbGVjdG9yCi1fVUlfRklFTERTICAgICAgICAgICAgICAgICAgICAgICAgICA9IEZpZWxkcwotCi1fVUlfVE9PTFRJUF9TRUxFQ1RPUl9URVhUICAgICAgICAgICA9IFNwZWNpZmllcyBhbiBYUGF0aCBleHByZXNzaW9uIHJlbGF0aXZlIHRvIGluc3RhbmNlcyBvZiB0aGUgY3VycmVudCBlbGVtZW50Ci1fVUlfVE9PTFRJUF9GSUVMRF9URVhUICAgICAgICAgICAgICA9IFNwZWNpZmllcyBhbiBYUGF0aCBleHByZXNzaW9uIHJlbGF0aXZlIHRvIGVhY2ggZWxlbWVudCBzZWxlY3RlZCBieSB0aGUgc2VsZWN0b3IKLQotX1VJX0FERF9CVVRUT04gICAgICAgICAgICAgICAgICAgICAgPSBBZGQ+PgotX1VJX1JFTU9WRV9CVVRUT04gICAgICAgICAgICAgICAgICAgPSA8PFJlbW92ZQotCi0hCi0hIEluY2x1ZGUgJiBJbXBvcnRzCi0hCi1fVUlfTEFCRUxfUFJFRklYICAgICAgICAgICAgICAgID0gUHJlZml4OgotX1VJX0xBQkVMX05BTUVTUEFDRSAgICAgICAgICAgICA9IE5hbWVzcGFjZToKLQotX1VJX1NDSEVNQV9JTkNMVURFX0RFU0MgICAgICAgICA9IFNlbGVjdCBhIHNjaGVtYSBmaWxlIHNvIHRoYXQgdGhlIGRlZmluaXRpb25zIGluIHRoZSBzY2hlbWEgZmlsZSB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBzY2hlbWEuIFRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBpbmNsdWRlZCBzY2hlbWEgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgY3VycmVudCBzY2hlbWEuCi1fVUlfTEFCRUxfU0NIRU1BX0lNUE9SVF9ERVNDICAgID0gU2VsZWN0IGEgc2NoZW1hIGZpbGUgZnJvbSBhIGRpZmZlcmVudCBuYW1lc3BhY2Ugc28gdGhhdCBpdHMgZGVmaW5pdGlvbnMgY2FuIGJlIHJlZmVyZW5jZWQgYnkgdGhlIGN1cnJlbnQgc2NoZW1hLiBZb3UgbXVzdCBhc3NvY2lhdGUgYSBwcmVmaXggd2l0aCB0aGUgbmV3IG5hbWVzcGFjZSBmb3IgdXNlIGluIHRoZSBjdXJyZW50IHNjaGVtYS4KLQotX1VJX0xBQkVMX1NDSEVNQV9MT0NBVElPTiAgICAgICAgPSBTY2hlbWEgbG9jYXRpb246Ci1fVUlfQlVUVE9OX1NFTEVDVCAgICAgICAgICAgICAgICA9IFNlbGVjdAotX1VJX0ZJTEVESUFMT0dfU0VMRUNUX1hNTF9TQ0hFTUEgPSBTZWxlY3QgWE1MIHNjaGVtYSBmaWxlCi1fVUlfRklMRURJQUxPR19TRUxFQ1RfWE1MX0RFU0MgICA9IFNlbGVjdCBhbiBYTUwgc2NoZW1hIGZpbGUgZnJvbSB0aGUgV29ya2JlbmNoIHByb2plY3RzCi1fVUlfRklMRURJQUxPR19TRUxFQ1RfWE1MX1VSTCAgICA9IFNlbGVjdCBhbiBYTUwgc2NoZW1hIGZpbGUgZnJvbSBIVFRQCi0KLV9VSV9MQUJFTF9MT0FESU5HX1hNTF9TQ0hFTUEgICAgID0gTG9hZGluZyBYTUwgU2NoZW1hCi1fVUlfTEFCRUxfRklOSVNIX0xPQURJTkcgICAgICAgICA9IEZpbmlzaCBMb2FkaW5nCi1fVUlfTEFCRUxfTk9fTE9DQVRJT05fU1BFQ0lGSUVEICA9IE5vIExvY2F0aW9uIFNwZWNpZmllZAotCi0hCi0hIFhTRCBFZGl0b3IKLSEKLV9VSV9UQUJfU09VUkNFICAgICAgICAgICAgICAgICAgPSBTb3VyY2UKLV9VSV9UQUJfREVTSUdOICAgICAgICAgICAgICAgICAgPSBEZXNpZ24KLSEgIE5vdGUgdG8gdHJhbnNsYXRvcnM6IEdyYXBoIGlzIHRoZSBncmFwaGljIHZpZXcgb2YgdGhlIFhNTCBzY2hlbWEKLV9VSV9UQUJfR1JBUEggICAgICAgICAgICAgICAgICAgPSBHcmFwaAotX1VJX01FTlVfVU5ETyAgICAgICAgICAgICAgICAgICA9ICZVbmRvIEBDdHJsK1oKLV9VSV9NRU5VX1JFRE8gICAgICAgICAgICAgICAgICAgPSAmUmVkbyBAQ3RybCtZCi0KLSEKLSEgVGFzayBMaXN0IFJlbGF0ZWQgTWVzc2FnZQotIQotX1VJX1JFRl9GSUxFX0VSUk9SX0RFU0NSSVBUSU9OICAgICAgPSBUaGUgZXJyb3JzIGJlbG93IHdlcmUgZGV0ZWN0ZWQgd2hlbiB2YWxpZGF0aW5nIHRoZSBmaWxlICJ7MH0iIHZpYSB0aGUgZmlsZSAiezF9Ii4gIEluIG1vc3QgY2FzZXMgdGhlc2UgZXJyb3JzIGNhbiBiZSBkZXRlY3RlZCBieSB2YWxpZGF0aW5nICJ7Mn0iIGRpcmVjdGx5LiAgSG93ZXZlciBpdCBpcyBwb3NzaWJsZSB0aGF0IGVycm9ycyB3aWxsIG9ubHkgb2NjdXIgd2hlbiB7Mn0gaXMgdmFsaWRhdGVkIGluIHRoZSBjb250ZXh0IG9mIHszfS4KLV9VSV9SRUZfRklMRV9FUlJPUl9QVVNIX0hFTFAgICAgICAgID0gUHVzaCB0aGUgaGVscCBidXR0b24gYmVsb3cgdG8gcmVhZCBtb3JlLgotX1VJX1JFRl9GSUxFX0VSUk9SX01FU1NBR0UgICAgICAgICAgPSBSZWZlcmVuY2VkIGZpbGUgY29udGFpbnMgZXJyb3JzICh7MH0pLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJpZ2h0IGNsaWNrIG9uIHRoZSBtZXNzYWdlIGFuZCBzZWxlY3QgIlNob3cgRGV0YWlscy4uLiIKLV9VSV9SRUZfRklMRV9TSE9XX0RFVEFJTFMgICAgICAgICAgID0gU2hvdyBEZXRhaWxzLi4uCi0KLQotIQotISBYU0RFZGl0b3IgTWVudSBiYXIgY29udHJpYnV0b3IKLSEKLV9VSV9NRU5VX0dFTkVSQVRFX0pBVkEgICAgICAgICAgICAgID0gR2VuZXJhdGUgJkphdmEgQmVhbnMuLi4KLV9VSV9NRU5VX0dFTkVSQVRFX0RURCAgICAgICAgICAgICAgID0gR2VuZXJhdGUgJkRURC4uLgotX1VJX01FTlVfR0VORVJBVEVfU0FNUExFX1hNTCAgICAgICAgPSBHZW5lcmF0ZSBYTSZMLi4uCi1fVUlfTUVOVV9YU0RfRURJVE9SICAgICAgICAgICAgICAgICA9ICZYU0QKLV9VSV9NRU5VX1ZBTElEQVRFX1hNTCAgICAgICAgICAgICAgID0gJlZhbGlkYXRlIFhNTCBTY2hlbWEKLV9VSV9NRU5VX1ZBTElEQVRFX1hNTF9UT09MVElQICAgICAgID0gVmFsaWRhdGUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIFhNTCBTY2hlbWEKLV9VSV9NRU5VX0dFTkVSQVRFX0pBVkFfVE9PTFRJUCAgICAgID0gR2VuZXJhdGUgSmF2YSBiZWFucyBmb3IgdGhlIFhNTCBTY2hlbWEKLV9VSV9NRU5VX0dFTkVSQVRFX0RURF9UT09MVElQICAgICAgID0gR2VuZXJhdGUgYSBEVEQgZnJvbSB0aGUgWE1MIFNjaGVtYQotX1VJX01FTlVfR0VORVJBVEVfU0FNUExFX1hNTF9UT09MVElQID0gR2VuZXJhdGUgYW4gWE1MIGZyb20gdGhlIFhNTCBTY2hlbWEKLV9VSV9NRU5VX1JFTE9BRF9ERVBFTkRFTkNJRVNfVE9PTFRJUCA9IFJlbG9hZCBEZXBlbmRlbmNpZXMKLV9VSV9NRU5VX1JFTE9BRF9ERVBFTkRFTkNJRVMgPSAmUmVsb2FkIERlcGVuZGVuY2llcwotCi0hCi0hIFByZWZlcmVuY2UgUGFnZQotIQotX1VJX1RFWFRfSU5ERU5UX0xBQkVMICAgICAgICAgICAgICAgICA9IEluZGVudGF0aW9uCi1fVUlfVEVYVF9JTkRFTlRfU1BBQ0VTX0xBQkVMICAgICAgICAgID0gJk51bWJlciBvZiBzcGFjZXM6IAotX1VJX1RFWFRfWFNEX05BTUVTUEFDRV9QUkVGSVggICAgICAgICA9IFhNTCBzY2hlbWEgbGFuZ3VhZ2UKLV9VSV9URVhUX1hTRF9ERUZBVUxUX1BSRUZJWCAgICAgICAgICAgPSBYTUwgc2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgJnByZWZpeDoKLV9VSV9RVUFMSUZZX1hTRCAgICAgICAgICAgICAgICAgICAgICAgPSAmUXVhbGlmeSBYTUwgc2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMKLV9VSV9TRVBBUkFURV9ERVNJR05fQU5EX1NPVVJDRV9WSUVXICAgPSBTZXBhcmF0ZSBTb3VyY2UsIERlc2lnbiBhbmQgR3JhcGggdmlldwotX1VJX0NPTUJJTkVEX0RFU0lHTl9BTkRfU09VUkNFX1ZJRVcgICA9IENvbWJpbmVkIFNvdXJjZSBvciBHcmFwaCB2aWV3IHdpdGggRGVzaWduIHZpZXcgCi1fVUlfTEFCRUxfRURJVE9SX0xBWU9VVCAgICAgICAgICAgICAgID0gRWRpdG9yIExheW91dAotX1VJX1BSRUZfREVTSUdOX1ZJRVdfTEFZT1VUICAgICAgICAgICA9IERlc2lnbiBWaWV3IExvY2F0aW9uCi1fVUlfUFJFRl9ERVNJR05fQk9UVE9NICAgICAgICAgICAgICAgID0gQmVsb3cKLV9VSV9QUkVGX0RFU0lHTl9SSUdIVCAgICAgICAgICAgICAgICAgPSBSaWdodAotX1VJX1RFWFRfWFNEX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSA9IERlZmF1bHQgVGFyZ2V0IE5hbWVzcGFjZToKLQotIQotISBDb250ZW50IE91dGxpbmUgVmlldyBhY3Rpb24KLSEgTk9URSBUTyBUUkFOU0xBVE9SOiBEbyBub3QgdHJhbnNsYXRlIHRoZSB3b3JkKHMpIGZvbGxvd2luZyAiQWRkIiBvbiBlYWNoIGxpbmUgaW4KLSEgICB0aGlzIHNlY3Rpb24gaS5lLiBBbm5vdGF0aW9uLCBEb2N1bWVudGF0aW9uLCBBcHBJbmZvICBUaGVzZSB3b3JkcyBhcmUgWE1MIFNjaGVtYSBrZXl3b3Jkcy4KLV9VSV9BQ1RJT05fREVMRVRFICAgICAgICAgICAgICAgICAgPSBEJmVsZXRlCi1fVUlfQUNUSU9OX0FERF9BTk5PVEFUSU9OICAgICAgICAgID0gQWRkICZBbm5vdGF0aW9uCi1fVUlfQUNUSU9OX0FERF9ET0MgICAgICAgICAgICAgICAgID0gQWRkICZEb2N1bWVudGF0aW9uCi1fVUlfQUNUSU9OX0FERF9BUFBfSU5GTyAgICAgICAgICAgID0gQWRkIEEmcHBJbmZvCi1fVUlfQUNUSU9OX0FERF9HTE9CQUxfRUxFTUVOVCAgICAgID0gQWRkIEdsb2ImYWwgRWxlbWVudAotX1VJX0FDVElPTl9BRERfS0VZICAgICAgICAgICAgICAgICA9IEFkZCAmS2V5Ci1fVUlfQUNUSU9OX0FERF9LRVlfUkVGICAgICAgICAgICAgID0gQWRkIEtleSBSZSZmCi1fVUlfQUNUSU9OX0FERF9VTklRVUUgICAgICAgICAgICAgID0gQWRkIFVuaSZxdWUKLV9VSV9BQ1RJT05fQUREX0dST1VQICAgICAgICAgICAgICAgPSBBZGQgRyZyb3VwCi1fVUlfQUREX0dST1VQX1JFRiAgICAgICAgICAgICAgICAgID0gQWRkIEdyJm91cCBSZWYKLV9VSV9BQ1RJT05fQUREX0NPTlRFTlRfTU9ERUwgICAgICAgPSBBZGQgQ29udGVudCAmTW9kZWwKLV9VSV9BQ1RJT05fQUREX0VMRU1FTlQgICAgICAgICAgICAgPSBBZGQgJkVsZW1lbnQKLV9VSV9BQ1RJT05fQUREX0VMRU1FTlRfUkVGICAgICAgICAgPSBBZGQgRSZsZW1lbnQgUmVmCi1fVUlfQUNUSU9OX0FERF9TSU1QTEVfVFlQRSAgICAgICAgID0gQWRkICZTaW1wbGUgVHlwZQotX1VJX0FDVElPTl9BRERfUEFUVEVSTiAgICAgICAgICAgICA9IEFkZCAmUGF0dGVybgotX1VJX0FDVElPTl9BRERfRU5VTSAgICAgICAgICAgICAgICA9IEFkZCBFbiZ1bWVyYXRpb24KLV9VSV9BQ1RJT05fQUREX0VOVU1TICAgICAgICAgICAgICAgPSBBZGQgRW51Jm1lcmF0aW9ucy4uLgotX1VJX0FDVElPTl9BRERfQ09NUExFWF9UWVBFICAgICAgICA9IEFkZCBDb21wbGV4ICZUeXBlCi1fVUlfQUNUSU9OX0FERF9DT01QTEVYX0NPTlRFTlQgICAgID0gQWRkIENvbXBsZSZ4IENvbnRlbnQKLV9VSV9BQ1RJT05fQUREX1NJTVBMRV9DT05URU5UICAgICAgPSBBZGQgU2ltcGxlICZDb250ZW50Ci1fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEUgICAgICAgICAgID0gQWRkIEF0dHJpJmJ1dGUKLV9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUCAgICAgPSBBZGQgQXR0ciZpYnV0ZSBHcm91cAotX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX0dST1VQX1JFRiA9IEFkZCBBJnR0cmlidXRlIEdyb3VwIFJlZgotX1VJX0FDVElPTl9BRERfSU5DTFVERSAgICAgICAgICAgICA9IEFkZCBJbiZjbHVkZQotX1VJX0FDVElPTl9BRERfSU1QT1JUICAgICAgICAgICAgICA9IEFkZCAmSW1wb3J0Ci1fVUlfQUNUSU9OX0FERF9SRURFRklORSAgICAgICAgICAgID0gQWRkIFJlJmRlZmluZQotX1VJX0FDVElPTl9BRERfTk9UQVRJT04gICAgICAgICAgICA9IEFkZCAmTm90YXRpb24KLV9VSV9BQ1RJT05fQUREX0FOWV9FTEVNRU5UICAgICAgICAgPSBBZGQgQW4meQotX1VJX0FDVElPTl9BRERfQU5ZX0FUVFJJQlVURSAgICAgICA9IEFkZCAmQW55IEF0dHJpYnV0ZQotX1VJX0FDVElPTl9BRERfR0xPQkFMX0FUVFJJQlVURSAgICA9IEFkZCAmR2xvYmFsIEF0dHJpYnV0ZQotX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX1JFRkVSRU5DRSA9IEFkZCBBdHRyaWImdXRlIFJlZgotX1VJX0FDVElPTl9BRERfUkVTVFJJQ1RJT04gICAgICAgICA9IEFkZCBSZSZzdHJpY3Rpb24KLV9VSV9BQ1RJT05fQUREX1VOSU9OICAgICAgICAgICAgICAgPSBBZGQgVSZuaW9uCi1fVUlfQUNUSU9OX0FERF9MSVNUICAgICAgICAgICAgICAgID0gQWRkICZMaXN0Ci1fVUlfQUNUSU9OX0RFTEVURV9HUk9VUF9TQ09QRSAgICAgID0gRCZlbGV0ZQotX1VJX0FDVElPTl9BRERfQ0hPSUNFICAgICAgICAgICAgICA9IEFkZCAmQ2hvaWNlCi1fVUlfQUNUSU9OX0FERF9TRVFVRU5DRSAgICAgICAgICAgID0gQWRkIFNlJnF1ZW5jZQotX1VJX0FDVElPTl9BRERfQUxMICAgICAgICAgICAgICAgICA9IEFkZCAmQWxsCi1fVUlfQUNUSU9OX0FERF9FWFRFTlNJT04gICAgICAgICAgID0gQWRkIEUmeHRlbnNpb24KLV9VSV9BQ1RJT05fQUREX1NFTEVDVE9SICAgICAgICAgICAgPSBBZGQgJlNlbGVjdG9yCi1fVUlfQUNUSU9OX0FERF9GSUVMRCAgICAgICAgICAgICAgID0gQWRkICZGaWVsZAotISBOT1RFIFRPIFRSQU5TTEFUT1I6IFRyYW5zbGF0ZSBBZGQgYW5kIE5vZGUKLV9VSV9BQ1RJT05fQUREX1NDSEVNQV9OT0RFICAgICAgICAgPSBBZGQgJlNjaGVtYSBOb2RlCi0hIE5PVEUgVE8gVFJBTlNMQVRPUjogVFJBTlNMQVRFIEFkZCBhbmQgTG9jYWwKLV9VSV9BQ1RJT05fQUREX0xPQ0FMX1NJTVBMRV9UWVBFICAgPSBBZGQgTG9jYWwgJlNpbXBsZSBUeXBlCi1fVUlfQUNUSU9OX0FERF9MT0NBTF9DT01QTEVYX1RZUEUgID0gQWRkIExvY2FsICZDb21wbGV4IFR5cGUKLV9VSV9BQ1RJT05fQkFDS19UT19TQ0hFTUFfVklFVyAgICAgPSBCYWNrIFRvIFNjaGVtYQotX1VJX0hPVkVSX0JBQ0tfVE9fU0NIRU1BX1ZJRVcgICAgID0gQmFjayB0byBzY2hlbWEKLQotX1VJX0FDVElPTl9NQUtFX0FOT05ZTU9VU19UWVBFX0dMT0JBTCA9IE1ha2UgQW5vbnltb3VzIFR5cGUgR2xvYmFsCi1fVUlfQUNUSU9OX09QRU5fU0NIRU1BICAgICAgICAgICAgICAgID0gT3BlbiBTY2hlbWEKLQotX1VJX0FDVElPTl9JTlNFUlRfQkVGT1JFICAgICAgICAgICA9IEluc2VydCBCZWZvcmUKLV9VSV9BQ1RJT05fSU5TRVJUX0FGVEVSICAgICAgICAgICAgPSBJbnNlcnQgQWZ0ZXIKLQotX1VJX09VVExJTkVfU09SVCAgICAgICAgICAgICAgICAgICA9IFNvcnQgYWxwaGFiZXRpY2FsbHkKLV9VSV9PVVRMSU5FX0RPX05PVF9TT1JUICAgICAgICAgICAgPSBEbyBub3Qgc29ydCBhbHBoYWJldGljYWxseQotCi1fVUlfT1VUTElORV9TSE9XX0NPTVBMRVhfVFlQRSAgICAgID0gU2hvdyBDb21wbGV4IFR5cGVzIE9ubHkKLV9VSV9PVVRMSU5FX1NIT1dfU0lNUExFX1RZUEUgICAgICAgPSBTaG93IFNpbXBsZSBUeXBlcyBPbmx5Ci1fVUlfT1VUTElORV9TSE9XX0FUVFJJQlVURV9HUk9VUCAgID0gU2hvdyBBdHRyaWJ1dGUgR3JvdXBzIE9ubHkKLV9VSV9PVVRMSU5FX1NIT1dfR1JPVVAgICAgICAgICAgICAgPSBTaG93IEdyb3VwcyBPbmx5Ci1fVUlfT1VUTElORV9TSE9XX0dMT0JBTF9FTEVNRU5UICAgID0gU2hvdyBHbG9iYWwgRWxlbWVudHMgT25seQotX1VJX09VVExJTkVfU0hPV19SRUZFUkVOQ0VTICAgICAgICA9IFNob3cgUmVmZXJlbmNlIENvbnRlbnQKLV9VSV9PVVRMSU5FX1NIT1dfSU5IRVJJVEVEICAgICAgICAgPSBTaG93IEluaGVyaXRlZCBDb250ZW50Ci0KLV9VSV9BQ1RJT05fU0VUX01VTFRJUExJQ0lUWQkJICAgPSBTZXQgTXVsdGlwbGljaXR5Ci0KLSEKLSEgTmV3IFhNTCBTY2hlbWEgV2l6YXJkCi0hCi1fVUlfV0laQVJEX0NSRUFURV9YU0RfTU9ERUxfVElUTEUgICAgPSBDcmVhdGUgWE1MIFNjaGVtYQotCi0hIE5PVEUgVE8gVFJBTlNMQVRPUjogRG8gbm90IHRyYW5zbGF0ZSBmb2xsb3dpbmcgbGluZQotX1VJX0NSRUFURVhTRCAgICAgICAgICAgICAgICAgICAgICAgID0gY3JlYXRlWFNECi1fVUlfTkVXX1hNTF9TQ0hFTUFfVElUTEUgICAgICAgICAgICAgPSBOZXcgWE1MIFNjaGVtYQotX1VJX0NSRUFURV9BX05FV19YTUxfU0NIRU1BX0RFU0MgICAgID0gQ3JlYXRlIGEgbmV3IFhNTCBzY2hlbWEuCi0KLSEgTk9URSBUTyBUUkFOU0xBVE9SOiBEbyBub3QgdHJhbnNsYXRlIGZvbGxvd2luZyBsaW5lCi1fVUlfTkVXX1hNTF9TQ0hFTUFfRklMRU5BTUUgICAgICAgICAgPSBOZXdYTUxTY2hlbWEueHNkCi0KLSEKLSEgWFNEIEZyb20gUkRCIFNjaGVtYSBXaXphcmQKLSEKLV9VSV9XSVpBUkRfQ1JFQVRFX1hTRF9GUk9NX1JEQl9USVRMRSA9IENyZWF0ZSBYU0QgZnJvbSBSREIgVGFibGUKLQotCi0hCi0hIFJlZ3VsYXIgRXhwcmVzc2lvbiBXaXphcmQKLSEKLV9VSV9SRUdFWF9XSVpBUkRfQ1JFQVRFX0JVVFRPTiA9IENyZWF0ZSBSZWd1bGFyIEV4cHJlc3Npb24uLi4KLV9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9CVVRUT04gPSBMYXVuY2ggdGhlIFJlZ3VsYXIgRXhwcmVzc2lvbiBXaXphcmQKLV9VSV9SRUdFWF9XSVpBUkRfVElUTEUgPSBSZWd1bGFyIEV4cHJlc3Npb24gV2l6YXJkCi1fVUlfUkVHRVhfV0laQVJEX0NPTVBPU0lUSU9OX1BBR0VfVElUTEUgPSBDb21wb3NlIFJlZ3VsYXIgRXhwcmVzc2lvbgotX1VJX1JFR0VYX1dJWkFSRF9DT01QT1NJVElPTl9QQUdFX0RFU0NSSVBUSU9OID0gVG8gYWRkIGEgdG9rZW4sIHNwZWNpZnkgaXRzIGNvbnRlbnRzIGFuZCBvY2N1cnJlbmNlLCB0aGVuIGNsaWNrIEFkZC4KLV9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9SRUdFWF9FUlJPUl9QUkVGSVggPSBUaGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbm90IHZhbGlkLiAgUmVhc29uOiAgCi1fVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfVE9LRU5fRVJST1JfUFJFRklYID0gVGhlIGN1cnJlbnQgdG9rZW4gaXMgbm90IHZhbGlkLiAgUmVhc29uOiAgCi1fVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfUkVHRVhfRVJST1IgPSBUaGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbm90IHZhbGlkLgotX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX1RPS0VOX0VSUk9SID0gVGhlIGN1cnJlbnQgdG9rZW4gaXMgbm90IHZhbGlkLgotX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX01JTl9FUlJPUl9TVUZGSVggPSBJbnZhbGlkIG1pbmltdW0gcmFuZ2UgdmFsdWUuICBUaGUgdmFsdWUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgbGVzcyB0aGFuIHRoZSBtYXhpbXVtIHZhbHVlLgotX1VJX1JFR0VYX1dJWkFSRF9NSVNTSU5HX01JTl9FUlJPUl9TVUZGSVggPSBJbnZhbGlkIG1pbmltdW0gcmFuZ2UgdmFsdWUuICBBIG1pbmltdW0gcmFuZ2UgbXVzdCBiZSBzcGVjaWZpZWQgaWYgYSBtYXhpbXVtIHJhbmdlIGlzIHNwZWNpZmllZC4KLV9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9NQVhfRVJST1JfU1VGRklYID0gSW52YWxpZCBtYXhpbXVtIHJhbmdlIHZhbHVlLiAgVGhlIHZhbHVlIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiB0aGUgbWluaW11bSB2YWx1ZS4KLV9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9SRVBFQVRfRVJST1JfU1VGRklYID0gSW52YWxpZCByZXBlYXQgdmFsdWUuICBUaGUgdmFsdWUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuCi1fVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfU0VMRUNUSU9OX0VSUk9SID0gTm90aGluZyBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuICBFaXRoZXIgbWFrZSBhIHNlbGVjdGlvbiBvciBjaG9vc2UgYSBkaWZmZXJlbnQgdG9rZW4uIAotX1VJX1JFR0VYX1dJWkFSRF9UT0tFTl9MQUJFTCA9IFRva2VuIGNvbnRlbnRzOgotX1VJX1JFR0VYX1dJWkFSRF9BVVRPX0VTQ0FQRV9DSEVDS0JPWF9MQUJFTCA9IEF1dG8gZXNjYXBlCi1fVUlfUkVHRVhfV0laQVJEX09DQ1VSRU5DRV9MQUJFTCA9IE9jY3VycmVuY2UKLSEgSW5zdHJ1Y3Rpb25zIGZvciB0cmFuc2xhdG9yczogVGhlIGZvbGxvd2luZyBsYWJlbCBpcyB1c2VkIGluIGEgcGhyYXNlIHRvIGlkZW50aWZ5IGEgcmFuZ2Ugb2YgdmFsdWVzLgotISBGb3IgZXhhbXBsZTogIDUgdG8gMTAuCi0hIFRoZSB2YWx1ZXMgYXJlIHRleHQgZmllbGRzIHRoYXQgYXJlIGluaXRpYWxseSBibGFuayBzbyB0aGUgdXNlciBoYXMgdG8gZW50ZXIgaW4gdmFsdWVzCi0hIEZvciBleGFtcGxlOiAgIF9fX19fX18gdG8gX19fX19fX18KLV9VSV9SRUdFWF9XSVpBUkRfVE9fTEFCRUwgPSB0bwotX1VJX1JFR0VYX1dJWkFSRF9BRERfQlVUVE9OX0xBQkVMID0gQWRkIAotX1VJX1JFR0VYX1dJWkFSRF9DVVJSRU5UX1JFR0VYX0xBQkVMID0gQ3VycmVudCByZWd1bGFyIGV4cHJlc3Npb246Ci1fVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfVEVSTVMgPSBDb250ZW50IG9mIG5ldyB0b2tlbgotX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX0FVVE9fRVNDQVBFX0NIRUNLQk9YID0gSW5zZXJ0IGVzY2FwZSBjaGFyYWN0ZXJzIHRvIG1hdGNoIG1ldGFjaGFyYWN0ZXIgbGl0ZXJhbHMgKGUuZy4gY29udmVydHMgXCIqXCIgdG8gXCJcXCpcIikKLV9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9BRERfQlVUVE9OID0gQWRkIHRoaXMgdG9rZW4gdG8gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbgotX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX0NVUlJFTlRfUkVHRVggPSBUaGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24KLV9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9SRVBFQVQgPSBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhlIHRva2VuIG11c3Qgb2NjdXIuCi1fVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfTUlOID0gVGhlIG1pbmltdW0gbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhlIHRva2VuIGNhbiBvY2N1ci4KLV9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9NQVggPSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUgdG9rZW4gY2FuIG9jY3VyLgotX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX0NBUkVUX0xBQkVMID0gVGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBuZXcgdG9rZW4gd2lsbCBiZSBpbnNlcnRlZC4KLV9VSV9SRUdFWF9XSVpBUkRfVEVTVElOR19QQUdFX1RJVExFID0gVGVzdCBSZWd1bGFyIEV4cHJlc3Npb24KLV9VSV9SRUdFWF9XSVpBUkRfVEVTVElOR19QQUdFX0RFU0NSSVBUSU9OID0gVG8gdGVzdCB0aGUgcmVndWxhciBleHByZXNzaW9uLCBlbnRlciBzYW1wbGUgdGV4dCB0aGF0IHlvdSB3aXNoIHRvIG1hdGNoLiAgVGhlIHN1Y2Nlc3Mgb2YgdGhlIG1hdGNoIHdpbGwgYmUgaW5kaWNhdGVkIGFib3ZlLgotX1VJX1JFR0VYX1dJWkFSRF9SRUdFWF9MQUJFTCA9IFJlZ3VsYXIgZXhwcmVzc2lvbjogCi1fVUlfUkVHRVhfV0laQVJEX1NBTVBMRV9URVhUID0gIFNhbXBsZSB0ZXh0OiAKLV9VSV9SRUdFWF9XSVpBUkRfTUFUQ0hFUyA9IFRoZSB0ZXh0IG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KLV9VSV9SRUdFWF9XSVpBUkRfRE9FU19OT1RfTUFUQ0ggPSBUaGUgdGV4dCBkb2VzIG5vdCBtYXRjaCB0aGUgcmVndWxhciBleHByZXNzaW9uLgotX1VJX1JFR0VYX1dJWkFSRF9URVJNX0FOWV9DSEFSID0gQW55IGNoYXJhY3RlcgotX1VJX1JFR0VYX1dJWkFSRF9URVJNX0FMUEhBTlVNRVJJQ19DSEFSID0gQWxwaGFudW1lcmljIGNoYXJhY3RlcgotX1VJX1JFR0VYX1dJWkFSRF9URVJNX1dISVRFU1BBQ0UgPSBXaGl0ZXNwYWNlCi1fVUlfUkVHRVhfV0laQVJEX1RFUk1fRElHSVQgPSBEaWdpdAotX1VJX1JFR0VYX1dJWkFSRF9URVJNX1VQUEVSID0gVXBwZXIgY2FzZQotX1VJX1JFR0VYX1dJWkFSRF9URVJNX0xPV0VSID0gTG93ZXIgY2FzZQotX1VJX1JFR0VYX1dJWkFSRF9URVJNX1NFTEVDVElPTiA9IEN1cnJlbnQgc2VsZWN0aW9uCi1fVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfU0lOR0xFID0gSnVzdCBvbmNlCi1fVUlfUkVHRVhfV0laQVJEX1FVQU5USUZJRVJfU1RBUiA9IFplcm8gb3IgbW9yZQotX1VJX1JFR0VYX1dJWkFSRF9RVUFOVElGSUVSX1BMVVMgPSBPbmUgb3IgbW9yZQotX1VJX1JFR0VYX1dJWkFSRF9RVUFOVElGSUVSX09QVElPTkFMID0gT3B0aW9uYWwKLV9VSV9SRUdFWF9XSVpBUkRfUVVBTlRJRklFUl9SRVBFQVQgPSBSZXBlYXQKLV9VSV9SRUdFWF9XSVpBUkRfUVVBTlRJRklFUl9SQU5HRSA9IFJhbmdlCi0KLSEKLSEgU2VsZWN0IEluY2x1ZGUgRmlsZSBXaXphcmQKLV9VSV9MQUJFTF9JTkNMVURFX1VSTF9GSUxFICAgID0gU2VsZWN0IHNjaGVtYSBmcm9tOgotX1VJX1JBRElPX1VSTCAgICAgICAgICAgICAgICAgPSBIVFRQCi1fVUlfUkFESU9fRklMRSAgICAgICAgICAgICAgICA9IFdvcmtiZW5jaCBwcm9qZWN0cwotX1VJX1dJWkFSRF9JTkNMVURFX0ZJTEVfVElUTEUgPSBJbmNsdWRlIEFub3RoZXIgU2NoZW1hCi1fVUlfV0laQVJEX0lOQ0xVREVfRklMRV9ERVNDICA9IFNlbGVjdCBhbm90aGVyIHNjaGVtYSBmcm9tIHdvcmtiZW5jaCBwcm9qZWN0cyBvciBmcm9tIEhUVFAuCi1fVUlfTEFCRUxfVVJMICAgICAgICAgICAgICAgICA9IFVSTDoKLV9VSV9VUkxfU1RBUlRfV0lUSCAgICAgICAgICAgID0gVGhlIFVSTCBtdXN0IHN0YXJ0IHdpdGggaHR0cDovLwotX1VJX1NQRUNJRllfVVJMICAgICAgICAgICAgICAgPSBQbGVhc2Ugc3BlY2lmeSBhIFVSTAotCi0hCi0hIEVudW1lcmF0aW9ucyBEaWFsb2cKLV9VSV9FTlVNRVJBVElPTlNfRElBTE9HX1RJVExFID0gQWRkIEVudW1lcmF0aW9ucwotX1VJX0xBQkVMX0RFTElNSVRFUl9DSEFSICAgICAgPSAmRGVsaW1pdGVyIGNoYXJhY3RlcnM6Ci1fVUlfTEFCRUxfUFJFU0VSVkVfV0hJVEVTUEFDRSA9ICZQcmVzZXJ2ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlCi0KLV9VSV9BQ1RJT05fREVMRVRFX0VOVU1FUkFUSU9OID0gRGVsZXRlIEVudW1lcmF0aW9uCi0KLSEKLSEgVmFsaWRhdGUgU2NoZW1hIAotIQotX1VJX0RJQUxPR19YTUxfU0NIRU1BX0lOVkFMSURfVElUTEUgICAgICAgPSBWYWxpZGF0aW9uIEZhaWxlZAotX1VJX0RJQUxPR19YTUxfU0NIRU1BX1ZBTElEX1RJVExFICAgICAgICAgPSBWYWxpZGF0aW9uIFN1Y2NlZWRlZAotX1VJX0RJQUxPR19YTUxfU0NIRU1BX1ZBTElEX1RFWFQgICAgICAgICAgPSBUaGUgWE1MIHNjaGVtYSBmaWxlIGlzIHZhbGlkLgotX1VJX0RJQUxPR19YTUxfU0NIRU1BX1ZBTElEX1dJVEhfV0FSTklOR1MgPSBUaGUgWE1MIHNjaGVtYSBmaWxlIGlzIHZhbGlkIGhvd2V2ZXIgd2FybmluZ3MgaGF2ZSBiZWVuIGlzc3VlZC4gU2VlIHRoZSBQcm9ibGVtcyB2aWV3IGZvciB0aGUgd2FybmluZyBtZXNzYWdlcy4KLV9VSV9ESUFMT0dfWE1MX1NDSEVNQV9JTlZBTElEX1RFWFQgICAgICAgID0gVGhlIFhNTCBzY2hlbWEgZmlsZSBpcyBub3QgdmFsaWQuIFNlZSB0aGUgUHJvYmxlbXMgdmlldyBmb3IgdGhlIGVycm9yIG1lc3NhZ2VzLgotCi0hCi0hIENvbWJvLWJveCBjaG9pY2VzIAotIQotISBOT1RFIFRPIFRSQU5TTEFUT1I6IERvIG5vdCB0cmFuc2xhdGUgZm9sbG93aW5nIDEwIGxpbmVzCi1fVUlfQ09NQk9fUVVBTElGSUVEICAgICAgICAgICAgID0gcXVhbGlmaWVkCi1fVUlfQ09NQk9fVU5RVUFMSUZJRUQgICAgICAgICAgID0gdW5xdWFsaWZpZWQKLV9VSV9DT01CT19FWFRFTlNJT04gICAgICAgICAgICAgPSBleHRlbnNpb24KLV9VSV9DT01CT19SRVNUUklDVElPTiAgICAgICAgICAgPSByZXN0cmljdGlvbgotX1VJX0NPTUJPX0FMTCAgICAgICAgICAgICAgICAgICA9IGFsbAotX1VJX0NPTUJPX1RSVUUgICAgICAgICAgICAgICAgICA9IHRydWUKLV9VSV9DT01CT19GQUxTRSAgICAgICAgICAgICAgICAgPSBmYWxzZQotX1VJX0NPTUJPX0xBWCAgICAgICAgICAgICAgICAgICA9IGxheAotX1VJX0NPTUJPX1NLSVAgICAgICAgICAgICAgICAgICA9IHNraXAKLV9VSV9DT01CT19TVFJJQ1QgICAgICAgICAgICAgICAgPSBzdHJpY3QKLQotISBHZW5lcmF0ZSBEVEQgLSBwYXNzIGFzIHRpdGxlIGFuZCBkZXNjcmlwdGlvbiBmb3Igd2l6YXJkIHBhZ2UKLV9VSV9HRU5FUkFURV9EVERfVElUTEUgICAgICAgICAgPSBHZW5lcmF0ZSBEVEQKLV9VSV9HRU5FUkFURV9EVERfREVTQ1JJUFRJT04gICAgPSBHZW5lcmF0ZSBhIERURCBmcm9tIHRoZSBzZWxlY3RlZCBYTUwgc2NoZW1hIGZpbGUuCi0KLSEgR2VuZXJhdGUgRERMIC0gcGFzcyBhcyB0aXRsZSBhbmQgZGVzY3JpcHRpb24gZm9yIHdpemFyZCBwYWdlCi1fVUlfR0VORVJBVEVfRERMX1RJVExFICAgICAgICAgID0gR2VuZXJhdGUgRERMCi1fVUlfR0VORVJBVEVfRERMX0RFU0NSSVBUSU9OICAgID0gR2VuZXJhdGUgRERMIGZyb20gdGhlIHNlbGVjdGVkIFhNTCBzY2hlbWEgZmlsZS4KLQotX1VJX1hNTF9TQ0hFTUFfVkFMSURBVE9SICAgICAgICAgICAgPSBYTUwgU2NoZW1hIFZhbGlkYXRvcgotCi0hIEdlbmVyYXRpb24gZnJvbSB0aGUgU2NoZW1hIG1vZGVsIC0gcHJlLWNvbmRpdGlvbiBjaGVjawotX1VJX0RJQUxPR19USVRMRV9HUkFNTUFSX0VSUk9SICAgICAgPSBJbnZhbGlkIEdyYW1tYXIKLV9VSV9ESUFMT0dfSU5GT19TQ0hFTUFfSU5WQUxJRCAgICAgID0gVGhlIHNjaGVtYSBmaWxlIGNvbnRhaW5zIGVycm9ycy4gT3BlbiBpdCBpbiB0aGUgWE1MIFNjaGVtYSBlZGl0b3IgYW5kIHZhbGlkYXRlIGl0IGZvciBkZXRhaWxzLgotX1VJX0RJQUxPR19USVRMRV9OT19HTE9CQUxfRUxFTUVOVFMgPSBObyBHbG9iYWwgRWxlbWVudHMKLV9VSV9ESUFMT0dfSU5GT19OT19HTE9CQUxfRUxFTUVOVFMgID0gVGhlIHNlbGVjdGVkIHNjaGVtYSBoYXMgbm8gZ2xvYmFsIGVsZW1lbnRzLiBHbG9iYWwgZWxlbWVudHMgYXJlIHJlcXVpcmVkIHRvIGdlbmVyYXRlIGFueXRoaW5nIGZyb20gYW4gWE1MIHNjaGVtYS4KLQotISBTZWN0aW9uIHRpdGxlIGZvciBvdGhlciBhdHRyaWJ1dGVzCi1fVUlfU0VDVElPTl9BRFZBTkNFRF9BVFRSSUJVVEVTICAgPSBBZHZhbmNlZAotCi0hIEZvciB1bmRvIGFjdGlvbiBtZW51cwotISBOb3RlIHRvIFRyYW5zbGF0b3JzOiBGb3IgdGhlIGZvbGxvd2luZyAiQ2hhbmdlIiBwaHJhc2VzLAotISBtYXhPY2N1cnMsIG1pbk9jY3VycywgbGFuZywgeHBhdGggYXJlIGtleXdvcmRzIHNvIHBsZWFzZQotISBkbyBubyB0cmFuc2xhdGUgdGhlbS4gIFRoZXNlIGFyZSBmb3IgdGhlIHVuZG8gYWN0aW9uIG1lbnVzLgotISBGb3IgZXhhbXBsZSwgaWYgdGhlIHVzZXIgbWFrZXMgYSBjaGFuZ2UgaW4gdGhlIG5hbWUgb2YgYW4KLSEgZWxlbWVudCwgdGhlbiB0aGUgdW5kbyBhY3Rpb24gd291bGQgYmUgVW5kbyBFbGVtZW50IE5hbWUgQ2hhbmdlCi1fVUlfTkFNRVNQQUNFX0NIQU5HRSAgICAgICAgICAgPSBOYW1lc3BhY2UgQ2hhbmdlCi1fVUlfUFJPQ0VTU0NPTlRFTlRTX0NIQU5HRSAgICAgPSBQcm9jZXNzIENvbnRlbnRzIENoYW5nZQotX1VJX01BWE9DQ1VSU19DSEFOR0UgICAgICAgICAgID0gbWF4T2NjdXJzIENoYW5nZQotX1VJX01JTk9DQ1VSU19DSEFOR0UgICAgICAgICAgID0gbWluT2NjdXJzIENoYW5nZQotX1VJX1NPVVJDRV9BVFRSSUJVVEVfQ0hBTkdFICAgID0gU291cmNlIENoYW5nZQotX1VJX0NPTU1FTlRfQ0hBTkdFICAgICAgICAgICAgID0gQ29tbWVudCBDaGFuZ2UKLV9VSV9QUkVGSVhfQ0hBTkdFICAgICAgICAgICAgICA9IFByZWZpeCBDaGFuZ2UKLV9VSV9BVFRSSUJVVEVHUk9VUF9SRUZfQ0hBTkdFICA9IEF0dHJpYnV0ZSBHcm91cCBSZWZlcmVuY2UgQ2hhbmdlCi1fVUlfQVRUUklCVVRFR1JPVVBfTkFNRV9DSEFOR0UgPSBBdHRyaWJ1dGUgR3JvdXAgTmFtZSBDaGFuZ2UKLV9VSV9BVFRSSUJVVEVfRklYRURfQ0hBTkdFICAgICA9IEF0dHJpYnV0ZSBGaXhlZCBDaGFuZ2UKLV9VSV9BVFRSSUJVVEVfREVGQVVMVF9DSEFOR0UgICA9IEF0dHJpYnV0ZSBEZWZhdWx0IENoYW5nZQotX1VJX0FUVFJJQlVURV9OQU1FX0NIQU5HRSAgICAgID0gQXR0cmlidXRlIE5hbWUgQ2hhbmdlCi1fVUlfQVRUUklCVVRFX1ZBTFVFX0NIQU5HRSAgICAgPSBBdHRyaWJ1dGUgVmFsdWUgQ2hhbmdlCi1fVUlfQVRUUklCVVRFX1VTRV9DSEFOR0UgICAgICAgPSBBdHRyaWJ1dGUgVXNlIENoYW5nZQotX1VJX0FUVFJJQlVURV9GT1JNX0NIQU5HRSAgICAgID0gQXR0cmlidXRlIEZvcm0gQ2hhbmdlCi1fVUlfQ09NUExFWFRZUEVfTkFNRV9DSEFOR0UgICAgPSBDb21wbGV4IFR5cGUgTmFtZSBDaGFuZ2UKLV9VSV9DT01QTEVYVFlQRV9BQlNUUkFDVF9DSEFOR0UgPSBDb21wbGV4IFR5cGUgQWJzdHJhY3QgQ2hhbmdlCi1fVUlfQ09NUExFWFRZUEVfTUlYRURfQ0hBTkdFICAgPSBDb21wbGV4IFR5cGUgTWl4ZWQgQ2hhbmdlCi1fVUlfQ09NUExFWFRZUEVfQkxPQ0tfQ0hBTkdFICAgPSBDb21wbGV4IFR5cGUgQmxvY2sgQ2hhbmdlCi1fVUlfQ09NUExFWFRZUEVfRklOQUxfQ0hBTkdFICAgPSBDb21wbGV4IFR5cGUgRmluYWwgQ2hhbmdlCi1fVUlfRE9DVU1FTlRBVElPTl9TT1VSQ0VfQ0hBTkdFID0gRG9jdW1lbnRhdGlvbiBTb3VyY2UgQ2hhbmdlCi1fVUlfRE9DVU1FTlRBVElPTl9MQU5HX0NIQU5HRSAgID0gRG9jdW1lbnRhdGlvbiBsYW5nIENoYW5nZQotX1VJX0RPQ1VNRU5UQVRJT05fQ09NTUVOVF9DSEFOR0UgPSBEb2N1bWVudGF0aW9uIENvbW1lbnQgQ2hhbmdlCi1fVUlfRUxFTUVOVF9OQU1FX0NIQU5HRSAgICAgICAgICA9IEVsZW1lbnQgTmFtZSBDaGFuZ2UKLV9VSV9FTEVNRU5UX1ZBTFVFX0NIQU5HRSAgICAgICAgID0gRWxlbWVudCBWYWx1ZSBDaGFuZ2UKLV9VSV9FTEVNRU5UX1RZUEVfQ0hBTkdFICAgICAgICAgID0gRWxlbWVudCBUeXBlIENoYW5nZQotX1VJX0VOVU1fVkFMVUVfQ0hBTkdFICAgICAgICAgICAgPSBFbnVtIFZhbHVlIENoYW5nZQotX1VJX0ZJRUxEX1hQQVRIX0NIQU5HRSAgICAgICAgICAgPSBGaWVsZCB4cGF0aCBDaGFuZ2UKLV9VSV9HUk9VUF9SRUZfQ0hBTkdFICAgICAgICAgICAgID0gR3JvdXAgUmVmZXJlbmNlIENoYW5nZQotX1VJX0dST1VQX1NDT1BFX0NIQU5HRSAgICAgICAgICAgPSBDb250ZW50IE1vZGVsIENoYW5nZQotX1VJX0dST1VQX05BTUVfQ0hBTkdFICAgICAgICAgICAgPSBHcm91cCBOYW1lIENoYW5nZQotX1VJX0lNUE9SVF9DSEFOR0UgICAgICAgICAgICAgICAgPSBJbXBvcnQgQ2hhbmdlCi1fVUlfS0VZX05BTUVfQ0hBTkdFICAgICAgICAgICAgICA9IEtleSBOYW1lIENoYW5nZQotX1VJX0tFWVJFRl9OQU1FX0NIQU5HRSAgICAgICAgICAgPSBLZXkgUmVmZXJlbmNlIE5hbWUgQ2hhbmdlCi0hIE5vdGUgdG8gdHJhbnNsYXRvcnMKLSEgRm9yIHRoZSBmb2xsb3dpbmcgaXRlbSwgUmVmZXIgaXMgdGhlIGtleXJlZiBhdHRyaWJ1dGUgdG8gcmVmZXIgdG8gc29tZSBvdGhlciBrZXkKLV9VSV9LRVlSRUZfUkVGRVJfQ0hBTkdFICAgICAgICAgID0gS2V5IFJlZmVyZW5jZSBSZWZlciBDaGFuZ2UKLV9VSV9OT1RBVElPTl9OQU1FX0NIQU5HRSAgICAgICAgID0gTm90YXRpb24gTmFtZSBDaGFuZ2UKLV9VSV9OT1RBVElPTl9QVUJMSUNfQ0hBTkdFICAgICAgID0gTm90YXRpb24gUHVibGljIENoYW5nZQotX1VJX05PVEFUSU9OX1NZU1RFTV9DSEFOR0UgICAgICAgPSBOb3RhdGlvbiBTeXN0ZW0gQ2hhbmdlCi1fVUlfUEFUVEVSTl9WQUxVRV9DSEFOR0UgICAgICAgICA9IFBhdHRlcm4gVmFsdWUgQ2hhbmdlCi1fVUlfU0NIRU1BX1ZFUlNJT05fQ0hBTkdFICAgICAgICA9IFNjaGVtYSBWZXJzaW9uIENoYW5nZQotX1VJX1NDSEVNQV9MQU5HX0NIQU5HRSAgICAgICAgICAgPSBTY2hlbWEgbGFuZyBDaGFuZ2UKLV9VSV9TRUxFQ1RPUl9YUEFUSF9DSEFOR0UgICAgICAgID0gU2VsZWN0b3IgeHBhdGggQ2hhbmdlCi1fVUlfVFlQRV9DSEFOR0UgICAgICAgICAgICAgICAgICA9IFR5cGUgQ2hhbmdlCi1fVUlfREVSSVZFREJZX0NIQU5HRSAgICAgICAgICAgICA9IERlcml2YXRpb24gQ2hhbmdlCi1fVUlfRkFDRVRfQ0hBTkdFICAgICAgICAgICAgICAgICA9IEZhY2V0IENoYW5nZQotX1VJX1NJTVBMRVRZUEVfTkFNRV9DSEFOR0UgICAgICAgPSBTaW1wbGVUeXBlIE5hbWUgQ2hhbmdlCi1fVUlfVU5JUVVFX05BTUVfQ0hBTkdFICAgICAgICAgICA9IFVuaXF1ZSBOYW1lIENoYW5nZQotX1VJX1NDSEVNQV9BVFRSSUJVVEVGT1JNREVGQVVMVF9DSEFOR0UgPSBBdHRyaWJ1dGUgRm9ybSBEZWZhdWx0IENoYW5nZQotX1VJX1NDSEVNQV9FTEVNRU5URk9STURFRkFVTFRfQ0hBTkdFID0gRWxlbWVudCBGb3JtIERlZmF1bHQgQ2hhbmdlCi1fVUlfU0NIRU1BX0JMT0NLREVGQVVMVF9DSEFOR0UgICA9IEJsb2NrIERlZmF1bHQgQ2hhbmdlCi1fVUlfU0NIRU1BX0ZJTkFMREVGQVVMVF9DSEFOR0UgICA9IEZpbmFsIERlZmF1bHQgQ2hhbmdlCi1fVUlfRUxFTUVOVF9TVUJTVElUVVRJT05HUk9VUF9DSEFOR0UgPSBTdWJzdGl0dXRpb24gR3JvdXAgQ2hhbmdlCi1fVUlfRUxFTUVOVF9GT1JNX0NIQU5HRSAgICAgICAgICA9IEZvcm0gQ2hhbmdlCi1fVUlfRUxFTUVOVF9CTE9DS19DSEFOR0UgICAgICAgICA9IEJsb2NrIENoYW5nZQotX1VJX0VMRU1FTlRfRklOQUxfQ0hBTkdFICAgICAgICAgPSBGaW5hbCBDaGFuZ2UKLV9VSV9FTEVNRU5UX0FCU1RSQUNUX0NIQU5HRSAgICAgID0gQWJzdHJhY3QgQ2hhbmdlCi1fVUlfRUxFTUVOVF9OSUxMQUJMRV9DSEFOR0UgICAgICA9IE5pbGxhYmxlIENoYW5nZQotX1VJX1RBUkdFVE5BTUVTUEFDRV9DSEFOR0UgICAgICAgPSBUYXJnZXQgTmFtZXNwYWNlIENoYW5nZQotCi0hIFdpbmRvdyBIZWFkaW5ncyBmb3IgRmxhdCBWaWV3Ci1fVUlfUEFHRV9IRUFESU5HX0FOWUFUVFJJQlVURSA9IEFueSBBdHRyaWJ1dGUKLV9VSV9QQUdFX0hFQURJTkdfQU5ZRUxFTUVOVCAgID0gQW55IEVsZW1lbnQKLV9VSV9QQUdFX0hFQURJTkdfQVBQSU5GTyAgICAgICAgICAgID0gQXBwSW5mbwotX1VJX1BBR0VfSEVBRElOR19BVFRSSUJVVEVHUk9VUF9SRUYgPSBBdHRyaWJ1dGUgR3JvdXAgUmVmZXJlbmNlCi1fVUlfUEFHRV9IRUFESU5HX0FUVFJJQlVURUdST1VQICAgICA9IEF0dHJpYnV0ZSBHcm91cAotX1VJX1BBR0VfSEVBRElOR19BVFRSSUJVVEVfUkVGICAgICAgPSBBdHRyaWJ1dGUgUmVmZXJlbmNlCi1fVUlfUEFHRV9IRUFESU5HX0FUVFJJQlVURSAgICAgICAgICA9IEF0dHJpYnV0ZQotX1VJX1BBR0VfSEVBRElOR19DT01QTEVYVFlQRSAgICAgICAgPSBDb21wbGV4IFR5cGUKLV9VSV9QQUdFX0hFQURJTkdfRE9DVU1FTlRBVElPTiAgICAgID0gRG9jdW1lbnRhdGlvbgotX1VJX1BBR0VfSEVBRElOR19FTEVNRU5UICAgICA9IEVsZW1lbnQKLV9VSV9QQUdFX0hFQURJTkdfRUxFTUVOVF9SRUYgPSBFbGVtZW50IFJlZmVyZW5jZQotX1VJX1BBR0VfSEVBRElOR19FTlVNICAgICAgICA9IEVudW1lcmF0aW9uCi1fVUlfUEFHRV9IRUFESU5HX0ZJRUxEICAgICAgID0gRmllbGQKLV9VSV9QQUdFX0hFQURJTkdfR1JPVVBfUkVGICAgPSBHcm91cCBSZWZlcmVuY2UKLV9VSV9QQUdFX0hFQURJTkdfQ09OVEVOVE1PREVMICA9IENvbnRlbnQgTW9kZWwKLV9VSV9QQUdFX0hFQURJTkdfR1JPVVAgICAgICAgICA9IEdyb3VwCi1fVUlfUEFHRV9IRUFESU5HX0lNUE9SVCAgICAgICAgPSBJbXBvcnQKLV9VSV9QQUdFX0hFQURJTkdfSU5DTFVERSAgICAgICA9IEluY2x1ZGUKLV9VSV9QQUdFX0hFQURJTkdfS0VZUkVGICAgICAgICA9IEtleSBSZWZlcmVuY2UKLV9VSV9QQUdFX0hFQURJTkdfS0VZICAgICAgICAgICA9IEtleQotX1VJX1BBR0VfSEVBRElOR19OT1RBVElPTiAgICAgID0gTm90YXRpb24KLV9VSV9QQUdFX0hFQURJTkdfUEFUVEVSTiAgICAgICA9IFBhdHRlcm4KLV9VSV9QQUdFX0hFQURJTkdfUkVERUZJTkUgICAgICA9IFJlZGVmaW5lCi1fVUlfUEFHRV9IRUFESU5HX1NDSEVNQSAgICAgICAgPSBTY2hlbWEKLV9VSV9QQUdFX0hFQURJTkdfU0VMRUNUT1IgICAgICA9IFNlbGVjdG9yCi1fVUlfUEFHRV9IRUFESU5HX0xJU1QgICAgICAgICAgPSBMaXN0Ci1fVUlfUEFHRV9IRUFESU5HX1VOSU9OICAgICAgICAgPSBVbmlvbgotX1VJX1BBR0VfSEVBRElOR19TSU1QTEVDT05URU5UID0gU2ltcGxlIENvbnRlbnQKLV9VSV9QQUdFX0hFQURJTkdfQ09NUExFWENPTlRFTlQgPSBDb21wbGV4IENvbnRlbnQKLV9VSV9QQUdFX0hFQURJTkdfUkVTVFJJQ1RJT04gICA9IFJlc3RyaWN0aW9uCi1fVUlfUEFHRV9IRUFESU5HX0VYVEVOU0lPTiAgICAgPSBFeHRlbnNpb24KLV9VSV9QQUdFX0hFQURJTkdfU0lNUExFVFlQRSAgICA9IFNpbXBsZSBUeXBlCi1fVUlfUEFHRV9IRUFESU5HX1VOSVFVRSAgICAgICAgPSBVbmlxdWUKLV9VSV9QQUdFX0hFQURJTkdfUkVGRVJFTkNFICAgICA9IHJlZmVyZW5jZQotCi0hCi0hIEdyYXBoIHBhZ2UKLSEKLV9VSV9HUkFQSF9TSU1QTEVfVFlQRVMgICAgICAgICA9IFNpbXBsZSBUeXBlcwotX1VJX0dSQVBIX0NPTVBMRVhfVFlQRVMgICAgICAgID0gQ29tcGxleCBUeXBlcwotX1VJX0dSQVBIX0dST1VQUyAgICAgICAgICAgICAgID0gR3JvdXBzCi1fVUlfR1JBUEhfR0xPQkFMX0FUVFJJQlVURVMgICAgPSBHbG9iYWwgQXR0cmlidXRlcwotX1VJX0dSQVBIX0dMT0JBTF9FTEVNRU5UUyAgICAgID0gR2xvYmFsIEVsZW1lbnRzCi1fVUlfR1JBUEhfWFNEU0NIRU1BICAgICAgICAgICAgPSBTY2hlbWEKLV9VSV9HUkFQSF9YU0RTQ0hFTUFfTk9fTkFNRVNQQUNFID0gKG5vIHRhcmdldCBuYW1lc3BhY2Ugc3BlY2lmaWVkKQotX1VJX0dSQVBIX1hTRENPTVBMRVhUWVBFREVGSU5JVElPTiA9IFhTRCBDb21wbGV4IFR5cGUgRGVmaW5pdGlvbjoKLV9VSV9HUkFQSF9YU0RNT0RFTEdST1VQICAgICAgICA9IFhTRCBNb2RlbCBHcm91cAotX1VJX0dSQVBIX1hTRFBBUlRJQ0xFICAgICAgICAgID0gWFNEIFBhcnRpY2xlCi1fVUlfR1JBUEhfVklFV19OT1RfQVZBSUxBQkxFICAgPSBWaWV3IGlzIG5vdCBhdmFpbGFibGUgZm9yIHNlbGVjdGVkIG9iamVjdC4KLV9VSV9HUkFQSF9VTktOT1dOX09CSkVDVCAgICAgICA9IFVua25vd24gb2JqZWN0Ci0KLSEgQWRkaXRpb25hbCBDYXRlZ29yaWVzCi1fVUlfR1JBUEhfVFlQRVMgICAgICAgICAgICAgICAgPSBUeXBlcwotX1VJX0dSQVBIX0VMRU1FTlRTICAgICAgICAgICAgID0gRWxlbWVudHMKLV9VSV9HUkFQSF9BVFRSSUJVVEVTICAgICAgICAgICA9IEF0dHJpYnV0ZXMKLV9VSV9HUkFQSF9BVFRSSUJVVEVfR1JPVVBTICAgICA9IEF0dHJpYnV0ZSBHcm91cHMKLV9VSV9HUkFQSF9OT1RBVElPTlMgICAgICAgICAgICA9IE5vdGF0aW9ucwotX1VJX0dSQVBIX0lERU5USVRZX0NPTlNUUkFJTlRTID0gSWRlbnRpdHkgQ29uc3RyYWludHMKLV9VSV9HUkFQSF9BTk5PVEFUSU9OUyAgICAgICAgICA9IEFubm90YXRpb25zCi1fVUlfR1JBUEhfRElSRUNUSVZFUyAgICAgICAgICAgPSBEaXJlY3RpdmVzCi0KLSEgRm9yIFVuaW9uIE1lbWJlclR5cGVzIERpYWxvZwotX1VJX0xBQkVMX1NFTEVDVF9NRU1CRVJUWVBFUyAgID0gU2VsZWN0IGZyb20gdGhlIGF2YWlsYWJsZSB0eXBlcyBhbmQgYWRkIHRvIHRoZSBtZW1iZXJUeXBlcyBsaXN0Ci1fVUlfTEFCRUxfTUVNQkVSVFlQRVNfQ0hBTkdFICAgPSBNZW1iZXIgVHlwZXMgQ2hhbmdlCi1fVUlfTEFCRUxfTUVNQkVSVFlQRVNfVkFMVUUgICAgPSBNZW1iZXIgVHlwZXMgVmFsdWU6Ci1fVUlfTEFCRUxfTUVNQkVSVFlQRVMgICAgICAgICAgPSBNZW1iZXIgdHlwZXM6Ci0KLV9VSV9MQUJFTF9WQVJJRVRZX0NIQU5HRSAgICAgICA9IFZhcmlldHkgQ2hhbmdlCi0KLV9VSV9MQUJFTF9GSVhFRE9SREVGQVVMVF9WQUxVRSA9IEZpeGVkL0RlZmF1bHQgVmFsdWUKLQotX1VJX0xBQkVMX0lURU1fVFlQRV9DSEFOR0UgICAgID0gSXRlbSBUeXBlIENoYW5nZQotCi1fVUlfTEFCRUxfQVZBSUxBQkxFX1RZUEVTICAgICAgPSBBdmFpbGFibGUgVHlwZXMKLQotX1VJX0xBQkVMX0lOQ0xVREVfQ0hBTkdFICAgICAgID0gSW5jbHVkZSBDaGFuZ2UKLQotX1VJX0xBQkVMX0lURU1fVFlQRSAgICAgICAgICAgID0gSXRlbSB0eXBlOgotX1VJX0xBQkVMX0JBU0VfVFlQRSAgICAgICAgICAgID0gQmFzZSBUeXBlCi1fVUlfTEFCRUxfVFlQRSAgICAgICAgICAgICAgICAgPSBUeXBlCi1fVUlfTEFCRUxfTU9ERUxfR1JPVVAgICAgICAgICAgPSBNb2RlbCBHcm91cAotCi1fVUlfTEFCRUxfQUJTRU5UICAgICAgICAgICAgICAgPSBhYnNlbnQKLQotX1VJX1dBUk5JTkdfUkVTRVRfQVRUUkdSUF9SRUYgID0gUmVzZXQgYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSA8ezB9PgotX1VJX1dBUk5JTkdfUkVNT1ZFX0FUVFJHUlBfUkVGID0gUmVtb3ZlIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2UgPHswfT4KLV9VSV9XQVJOSU5HX1JFU0VUX0FUVFJfUkVGICAgICA9IFJlc2V0IGF0dHJpYnV0ZSByZWZlcmVuY2UgPHswfT4KLV9VSV9XQVJOSU5HX1JFTU9WRV9BVFRSX1JFRiAgICA9IFJlbW92ZSBhdHRyaWJ1dGUgcmVmZXJlbmNlIDx7MH0+Ci0KLSE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIQotISBIZXJlIGlzIHRoZSBsaXN0IG9mIEVycm9yIHN0cmluZyB0aGF0IGhhdmUgbWVzc2FnZSBJRHMgLSBtYWtlIHN1cmUgdGhleSBhcmUgdW5pcXVlCi0KLSEKLSE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotISBUaGVzZSB0aHJlZSBlcnJvcnMgYXBwZWFyIGluIHRoZSBzZWxlY3QgaW5jbHVkZSB3aXphcmQKLSEgVGhlIG5hbWUgb2YgdGhlIGZpbGUgd2lsbCBiZSBzdWJzdGl0dXRlZCBpbgotX1VJX0RJRkZFUkVOVF9OQU1FX1NQQUNFICA9IHswfSBpcyBpbiBhIGRpZmZlcmVudCBuYW1lc3BhY2UgCi1fVUlfU0FNRV9OQU1FX1NQQUNFICAgICAgID0gezB9IGlzIGluIHRoZSBzYW1lIG5hbWVzcGFjZQotX1VJX0lOQ09SUkVDVF9YTUxfU0NIRU1BICA9IHswfSBpcyBhbiBpbnZhbGlkIFhNTCBzY2hlbWEgZmlsZQotCi1fRVJST1JfU0NIRU1BX05PVF9FWElTVCAgICAgICAgID0gRG9lcyBub3QgZXhpc3QuCi1fRVJST1JfTEFCRUxfSU5WQUxJRF9QUkVGSVggICAgID0gSW52YWxpZCBwcmVmaXguIEEgcHJlZml4IG11c3Qgbm90IGJlIGVtcHR5IG9yIGNvbnRhaW4gYW55IHNwYWNlLgotCi0hIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHdpbGwgYmUgc3Vic3RpdHV0ZWQgaW4KLV9FUlJPUl9TQ0hFTUFfTkFNRV9USEVfU0FNRSAgPSB7MH0gaXMgdGhlIGN1cnJlbnQgc2NoZW1hLiBBIHNjaGVtYSBjYW5ub3QgaW5jbHVkZSBpdHNlbGYuIFJlc2V0IHRvIHRoZSBsYXN0IHZhbGlkIHNjaGVtYS4KLQotX0VSUk9SX1hTRF9HRU5FUkFUSU9OICAgICAgICAgICAgICAgID0gRXJyb3IgZ2VuZXJhdGluZyBYTUwgc2NoZW1hCi1fRVJST1JfTk9fQ09OVEFJTkVSICAgICAgICAgICAgICAgICAgPSBObyBmb2xkZXIgc2VsZWN0ZWQKLV9FUlJPUl9OT19GSUxFX05BTUUgICAgICAgICAgICAgICAgICA9IE5vIGZpbGUgbmFtZSBwcm92aWRlZAotX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX1hTRCAgICAgICAgID0gVGhlIGZpbGUgbmFtZSBtdXN0IGVuZCBpbiAueHNkCi0KLQotIQotISBGb3Igc2NoZW1hIHRoYXQgaGFzIHRvbyBtYW55IGVycm9ycywgYW4gZXh0ZW5kZWQgbWVzc2FnZS4gCi0hCi1fRVJST1JfRElBTE9HX1hNTF9TQ0hFTUFfSU5WQUxJRF9URVhUICA9IFRoZSBYTUwgc2NoZW1hIGZpbGUgaXMgbm90IHZhbGlkLiAgCi1fRVJST1JfTU9SRV9FUlJPUlMgICAgICAgICAgICAgICAgICAgID0gVGhlcmUgYXJlIG1vcmUgZXJyb3JzIGluIHRoZSBzY2hlbWEgdGhhbiBhcmUgZGlzcGxheWVkIGluIHRoZSBUYXNrcyB2aWV3LiAgQ29ycmVjdCB0aGUgZmlyc3QgezB9IGVycm9ycyBhbmQgcmUtdmFsaWRhdGUgdGhlIHNjaGVtYSBmaWxlLgotCi0hIERETCBHZW5lcmF0aW9uIEZhaWxlZCBEaWFsb2cKLV9VSV9ESUFMT0dfRERMX0dFTl9GQUlMRURfVElUTEUgICAgID0gRERMIEdlbmVyYXRpb24gRmFpbGVkCi1fRVJST1JfRElBTE9HX0RETF9OT1RfR0VORVJFQVRFRCAgICA9IERETCBoYXMgbm90IGJlZW4gZ2VuZXJhdGVkCi1fVUlfRElBTE9HX0RETF9HRU5fRkFJTEVEX1JFQVNPTiAgICA9IFRoZSBzZWxlY3RlZCBzY2hlbWEgaGFzIG5vIGdsb2JhbCBlbGVtZW50cwotX1VJX0RJQUxPR19ERExfR0VOX0ZBSUxFRF9SRUFTT04yICAgPSBOb25lIG9mIHRoZSBnbG9iYWwgZWxlbWVudHMgaW4gdGhlIHNjaGVtYSBoYXZlIGEgY29tcGxleCB0eXBlIG9yIHRoZXkgcmVmZXJlbmNlIGNvbXBsZXggdHlwZXMgdGhhdCBjYW5ub3QgYmUgZm91bmQuCi0KLV9FWENfT1BFTl9YU0QgPSBDYW5ub3Qgb3BlbiBYTUwgU2NoZW1hIGVkaXRvcgotCi1fRVJST1JfTEFCRUxfUFJFRklYX0VYSVNUUyAgICAgPSBQcmVmaXggYWxyZWFkeSBleGlzdHMKLQotX0VSUk9SX1JFTU9WRV9MT0NBTF9TSU1QTEVUWVBFICA9IFJlbW92ZSBsb2NhbCBzaW1wbGUgdHlwZSBmcm9tIGV4dGVuc2lvbgotCi1fV0FSTl9JTlZBTElEX1RBUkdFVF9OQU1FU1BBQ0UgPSBUaGUgdGFyZ2V0IG5hbWVzcGFjZSBpcyBub3Qgd2VsbC1mb3JtZWQKLQotX0VSUk9SX1RBUkdFVF9OQU1FU1BBQ0VfQU5EX1BSRUZJWCA9IEEgdGFyZ2V0IG5hbWVzcGFjZSBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHByZWZpeAotCi0KLV9VSV9DT05UQUlOTUVOVCA9IENvbnRhaW5tZW50Ci1fVUlfSU5IRVJJVEFOQ0UgPSBJbmhlcml0YW5jZQotX1VJX1NVQlNUSVRVVElPTl9HUk9VUFMgPSBTdWJzdGl0dXRpb24gR3JvdXBzCi1fVUlfQU5PTllNT1VTID0gKiphbm9ueW1vdXMqKgotX1VJX1ZBTFVFID0gVmFsdWUKLV9VSV9BTllfRUxFTUVOVCA9IEFueSBFbGVtZW50Ci1fVUlfU09SVCA9IFNvcnQKLQotX1VJX0FDVElPTl9FRElUX05BTUVTUEFDRVMgPSBFZGl0IE5hbWVzcGFjZXMuLi4KLQotCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dCA9IHswfQotX1VJX0NyZWF0ZUNoaWxkX3RleHQyID0gezF9IHswfQotX1VJX0NyZWF0ZUNoaWxkX3Rvb2x0aXAgPSBDcmVhdGUgTmV3IHswfSBVbmRlciB7MX0gRmVhdHVyZQotX1VJX0NyZWF0ZUNoaWxkX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IGNoaWxkIG9mIHR5cGUgezB9IGZvciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlIHNlbGVjdGVkIHsyfS4KLV9VSV9DcmVhdGVTaWJsaW5nX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IHNpYmxpbmcgb2YgdHlwZSB7MH0gZm9yIHRoZSBzZWxlY3RlZCB7Mn0sIHVuZGVyIHRoZSB7MX0gZmVhdHVyZSBvZiB0aGVpciBwYXJlbnQuCi0KLSE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIQotISBVc2VkIGJ5IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2Vycy5TZWxlY3RTaW5nbGVGaWxlVmlldwotIQotIT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1fVUlfTEFCRUxfU09VUkNFX0ZJTEVTICAgPSBXb3JrYmVuY2ggRmlsZXMKLV9VSV9MQUJFTF9TRUxFQ1RFRF9GSUxFUyA9IFNlbGVjdGVkIEZpbGVzCi0KLV9VSV9JTVBPUlRfQlVUVE9OICAgICAgICAgID0gSW1wb3J0IEZpbGVzLi4uCi1fVUlfSU1QT1JUX0JVVFRPTl9UT09MX1RJUCA9IEltcG9ydCBmaWxlcyBmcm9tIGZpbGUgc3lzdGVtCi0KLQotIT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0hCi0hIHJlZmFjdG9yaW5nCi0hCi0hPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXJlZmFjdG9yaW5nQWN0aW9uU2V0LmxhYmVsPVJlZmFjdG9yCi1yZWZhY3RvcmluZ0FjdGlvblNldC5kZXNjcmlwdGlvbj1YU0QgRWRpdG9yIHJlZmFjdG9yaW5nIGFjdGlvbnMKLXJlZmFjdG9yaW5nLm1lbnUubGFiZWw9UmVmYWN0b3IKLXJlZmFjdG9yaW5nLnJlbmFtZUFjdGlvbi5sYWJlbD1SZSZuYW1lLi4uCi1jb250ZXh0LnRleHQuZWRpdG9yLnhzZC5uYW1lPUVkaXRpbmcgWFNEIGNvbnRleHQKLWNvbW1hbmQueHNkLnJlZmFjdG9yLnJlbmFtZS5lbGVtZW50Lm5hbWU9UmVuYW1lIFhTRCBlbGVtZW50Ci1jb21tYW5kLnhzZC5yZWZhY3Rvci5yZW5hbWUuZWxlbWVudC5kZXNjcmlwdGlvbj1SZW5hbWUgWFNEIGVsZW1lbnQKLWNvbW1hbmQueHNkLnJlZmFjdG9yLm1ha2VFbGVtZW50R2xvYmFsLmVsZW1lbnQubmFtZT1NYWtlIGxvY2FsIGVsZW1lbnQgZ2xvYmFsCi1jb21tYW5kLnhzZC5yZWZhY3Rvci5tYWtlRWxlbWVudEdsb2JhbC5lbGVtZW50LmRlc2NyaXB0aW9uPVByb21vdGVzIGxvY2FsIGVsZW1lbnQgdG8gZ2xvYmFsIGxldmVsIGFuZCByZXBsYWNlcyBpdHMgcmVmZXJlbmNlcwotY29tbWFuZC54c2QucmVmYWN0b3IubWFrZVR5cGVHbG9iYWwuZWxlbWVudC5uYW1lPU1ha2UgYW5vbnltb3VzIHR5cGUgZ2xvYmFsCi1jb21tYW5kLnhzZC5yZWZhY3Rvci5tYWtlVHlwZUdsb2JhbC5lbGVtZW50LmRlc2NyaXB0aW9uPVByb21vdGVzIGFub255bW91cyB0eXBlIHRvIGdsb2JhbCBsZXZlbCBhbmQgcmVwbGFjZXMgaXRzIHJlZmVyZW5jZXMKLWNvbW1hbmQueHNkLnJlZmFjdG9yLnJlbmFtZVRhcmdldE5hbWVzcGFjZS5uYW1lPVJlbmFtZSBUYXJnZXQgTmFtZXNwYWNlCi1jb21tYW5kLnhzZC5yZWZhY3Rvci5yZW5hbWVUYXJnZXROYW1lc3BhY2UuZGVzY3JpcHRpb249Q2hhbmdlcyB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgc2NoZW1hCi14c2QucmVzb3VyY2UucmVuYW1lLnBhcnRpY2lwYW50Lm5hbWU9UmVuYW1lIFhTRCBDb21wb25lbnQKLUV4dGVuc2lvbnNTY2hlbWFzRGVzY3JpcHRpb249VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgZGVwcmVjYXRlZCwgdXNlIGV4dGVuc2lvbkNhdGVnb3JpZXMKLUV4dGVuc2lvbkNhdGVnb3JpZXNEZXNjcmlwdGlvbj1FeHRlbnNpb24gcG9pbnQgZm9yIGNvbnRyaWJ1dGluZyB0byB0aGUgJ2J1aWx0IGluJyBjYXRlZ29yaWVzIG9mIGV4dGVuc2lvbiBlbGVtZW50cyBmb3IgWE1MIFNjaGVtYQotWFNERWRpdG9yRXh0ZW5zaW9uQ29uZmlndXJhdGlvbj1UaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBkZXByZWNhdGVkLCB1c2UgaW50ZXJuYWxFZGl0b3JDb25maWd1cmF0aW9uCi1JbnRlcm5hbEVkaXRvckNvbmZpZ3VyYXRpb249RXh0ZW5zaW9uIHBvaW50IGZvciBleHRlbmRpbmcgdGhlIFhNTCBTY2hlbWEgRWRpdG9yCi0KLSEgQ29waWVkIGZyb20gc3NlCi0yM2NvbmNhdF9FWENfPVJlc291cmNlIHswfSBkb2VzIG5vdCBleGlzdC4KLTMyY29uY2F0X0VYQ189RWRpdG9yIGNvdWxkIG5vdCBiZSBvcGVuIG9uIHswfQotQW5fZXJyb3JfaGFzX29jY3VycmVkX3doZW4xX0VSUk9SXz1BbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hlbiBpbml0aWFsaXppbmcgdGhlIGlucHV0IGZvciB0aGUgdGhlIGVkaXRvcidzIHNvdXJjZSBwYWdlLgotT3BlbkZpbGVGcm9tU291cmNlLmxhYmVsPU9wJmVuIFNlbGVjdGlvbgotT3BlbkZpbGVGcm9tU291cmNlLnRvb2x0aXA9T3BlbiBhbiBlZGl0b3Igb24gdGhlIHNlbGVjdGVkIGxpbmsKLU9wZW5GaWxlRnJvbVNvdXJjZS5pbWFnZT0KLU9wZW5GaWxlRnJvbVNvdXJjZS5kZXNjcmlwdGlvbj1PcGVuIGFuIGVkaXRvciBvbiB0aGUgc2VsZWN0ZWQgbGluawotCi1BZGRUYXNrLmxhYmVsPUFkZCAmVGFzay4uLgotQWRkVGFzay50b29sdGlwPUFkZCBUYXNrLi4uCi1BZGRCb29rbWFyay5sYWJlbD1BZGQgQm9vJmttYXJrLi4uCi1BZGRCb29rbWFyay50b29sdGlwPUFkZCBCb29rbWFyay4uLgotU2VsZWN0UnVsZXIubGFiZWw9U2VsZWN0IFJ1bGVyCi0KLV9aRVJPX09SX01PUkUgPSBaZXJvIG9yIE1vcmUKLV9aRVJPX09SX09ORSAgPSBaZXJvIG9yIE9uZQotX09ORV9PUl9NT1JFICA9IE9uZSBvciBNb3JlCi0KLSMgRm9yIHRyYW5zbGF0b3JzLCBhcyBpbiBzdHJ1Y3R1cmVkIERPTSB0cmVlCi1fVUlfTEFCRUxfU1RSVUNUVVJFRCAgICAgICAgICAgPSBTdHJ1Y3R1cmVkCi0KLV9VSV9MQUJFTF9NT1ZFICAgCQkJCSAgICAgICA9IE1vdmUKLV9VSV9MQUJFTF9SRU5BTUUgCQkJCSAgICAgICA9IFJlbmFtZQotX1VJX0xBQkVMX1RBUkdFVE5BTUVTUEFDRV9DSEFOR0UgICAgICAgPSBUYXJnZXQgTmFtZXNwYWNlIENoYW5nZQotX0lORk9fUkVTRVRfQVRUUklCVVRFX0dST1VQX1JFRkVSRU5DRSAgPSBSZXNldCBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlCi1fSU5GT19SRU1PVkVfQVRUUklCVVRFX0dST1VQX1JFRkVSRU5DRSA9IFJlbW92ZSBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlCi0KLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnCi1zZWFyY2guZGVjbGFyYXRpb25zLmxhYmVsID0gRGVjbGFyYXRpb25zCi1zZWFyY2gucmVmZXJlbmNlcy5sYWJlbCA9IFJlZmVyZW5jZXMKLQotISBleHRlbnNpb24gcG9pbnRzIAotRXh0ZW5zaW9uTm9kZUN1c3RvbWl6YXRpb25zRGVzY3JpcHRpb24gPSBFeHRlbnNpb24gTm9kZSBDdXN0b21pemF0aW9ucwotWE1MU2NoZW1hRWRpdG9yTW9kZXMgPSBYTUwgU2NoZW1hIEVkaXRvciBNb2RlcwotIyMKLVhTRF9Tb3VyY2VfdGFyZ2V0X25hbWU9WE1MIFNjaGVtYSBTb3VyY2UKLVhTRF9oeXBlcmxpbms9WE1MIFNjaGVtYSBDb250ZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4N2VmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotCQk8ZWRpdG9yCi0JCQluYW1lPSIlX1VJX0VESVRPUl9OQU1FIgotCQkJaWNvbj0iaWNvbnMvWFNERmlsZS5naWYiCi0gICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RNdWx0aVBhZ2VFZGl0b3JDb250cmlidXRvciIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5JbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5JbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvciI+Ci0gICAgICAgICAgICA8Y29udGVudFR5cGVCaW5kaW5nCi0gICAgICAgICAgICAgICAgY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLnhzZHNvdXJjZSIgLz4KLQkJPC9lZGl0b3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JBY3Rpb25zIj4KLSAgICAgICAgPGVkaXRvckNvbnRyaWJ1dGlvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2Uuc291cmNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UucnVsZXIuYWN0aW9ucyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotICAgICAgICAgICAgICAgaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotICAgICAgICAgICAgICAgYWN0aW9uSUQ9IlJ1bGVyRG91YmxlQ2xpY2siCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIi8+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVNlbGVjdFJ1bGVyLmxhYmVsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIi8+Ci0gICAgICAgIDwvZWRpdG9yQ29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0JCTx3aXphcmQKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHMuTmV3WFNEV2l6YXJkIgotCQkJbmFtZT0iJV9VSV9XSVpBUkRfTkVXX1hTRCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHMuTmV3WFNEV2l6YXJkIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5YTUxDYXRlZ29yeSIKLQkJCWljb249Imljb25zL1hTREZpbGUuZ2lmIj4KLQkJCTxkZXNjcmlwdGlvbj4lX1VJX0NSRUFURV9BX05FV19TQ0hFTUE8L2Rlc2NyaXB0aW9uPgotCQkJPHNlbGVjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIiAvPgotCQk8L3dpemFyZD4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0JCTxwYWdlCi0JCQluYW1lPSIlX1VJX1hNTF9TQ0hFTUFfUFJFRkVSRU5DRSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnByZWZlcmVuY2VzLnhtbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhTRFByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWFNEUHJlZmVyZW5jZVBhZ2UiPgotCQk8L3BhZ2U+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0icHJlZmVyZW5jZXBhZ2VzIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWFNEUHJlZmVyZW5jZVBhZ2UiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UiIC8+Ci0gICAJCTxzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWFNEIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUueHNkc291cmNlIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3VwcG9ydCBoZWxwIG9uIHRoZSB0YWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSAgIDxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbkZpbGVzIj4KLQkJPGFubm90YXRpb25GaWxlCi0JCWxvY2F0aW9uPSIvdzNjL3NjaGVtYUZvckNvZGVBc3Npc3QtYW5ub3RhdGlvbnMueG1sIgotCQlwdWJsaWNJZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotCQk8L2Fubm90YXRpb25GaWxlPgotCQk8L2V4dGVuc2lvbj4KLQktLT4KLQkKLQkKLSAgIDxleHRlbnNpb24gCi0gICAJCXBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5wcm9wZXJ0eUNvbnRyaWJ1dG9yIj4KLSAgICAgPHByb3BlcnR5Q29udHJpYnV0b3IKLSAgICAgICAgICAgY29udHJpYnV0b3JJZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IiCi0gICAgICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMucHJvdmlkZXJzLlhTRFNlY3Rpb25MYWJlbFByb3ZpZGVyIj4KLSAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5IGNhdGVnb3J5PSJHZW5lcmFsIi8+Ci0gICAJCSA8cHJvcGVydHlDYXRlZ29yeSBjYXRlZ29yeT0iRG9jdW1lbnRhdGlvbiIvPgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkgY2F0ZWdvcnk9IkFkdmFuY2VkIi8+Ci0gICAgIDwvcHJvcGVydHlDb250cmlidXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIAotICAgIAlwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQucHJvcGVydHlUYWJzIj4KLSAgICAgIDxwcm9wZXJ0eVRhYnMgCi0gICAgICAgICAgICBjb250cmlidXRvcklkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvciI+Ci0JCQk8cHJvcGVydHlUYWIKLQkJCQlsYWJlbD0iJV9VSV9MQUJFTF9HRU5FUkFMIgotCQkJCWNhdGVnb3J5PSJHZW5lcmFsIgotCQkJCWlkPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCI+Ci0JCQk8L3Byb3BlcnR5VGFiPgotCQkJPHByb3BlcnR5VGFiCi0JCQkJbGFiZWw9IiVfVUlfTEFCRUxfVFlQRV9DT05TVFJBSU5UUyIKLQkJCQljYXRlZ29yeT0iR2VuZXJhbCIKLQkJCQlhZnRlclRhYj0icHJvcGVydHkudGFiLmdlbmVyYWwiCi0JCQkJaWQ9InByb3BlcnR5LnRhYi50eXBlY29uc3RyYWludHMiPgotCQkJPC9wcm9wZXJ0eVRhYj4KLQkJCTxwcm9wZXJ0eVRhYgotCQkJCWxhYmVsPSIlX1VJX0xBQkVMX0VOVU1FUkFUSU9OUyIKLQkJCQljYXRlZ29yeT0iR2VuZXJhbCIKLQkJCQlhZnRlclRhYj0icHJvcGVydHkudGFiLmdlbmVyYWwiCi0JCQkJaWQ9InByb3BlcnR5LnRhYi5lbnVtZXJhdGlvbnMiPgotCQkJPC9wcm9wZXJ0eVRhYj4KLQkJCTxwcm9wZXJ0eVRhYgotCQkJCWxhYmVsPSIlX1VJX0xBQkVMX0FEVkFOQ0VEIgotCQkJCWNhdGVnb3J5PSJBZHZhbmNlZCIKLQkJCQlhZnRlclRhYj0icHJvcGVydHkudGFiLmdlbmVyYWwiCi0JCQkJaWQ9InByb3BlcnR5LnRhYi5hZHZhbmNlZCI+Ci0JCQk8L3Byb3BlcnR5VGFiPgkJCQotCQkJPHByb3BlcnR5VGFiCi0JCQkJbGFiZWw9IiVfVUlfTEFCRUxfRE9DVU1FTlRBVElPTiIKLQkJCQljYXRlZ29yeT0iRG9jdW1lbnRhdGlvbiIKLQkJCQlhZnRlclRhYj0icHJvcGVydHkudGFiLmdlbmVyYWwiCi0JCQkJaWQ9InByb3BlcnR5LnRhYi5kb2N1bWVudGF0aW9uIj4KLQkJCTwvcHJvcGVydHlUYWI+Ci0JCQk8cHJvcGVydHlUYWIKLQkJCQlsYWJlbD0iJV9VSV9MQUJFTF9FWFRFTlNJT05TIgotCQkJCWNhdGVnb3J5PSJEb2N1bWVudGF0aW9uIgotCQkJCWFmdGVyVGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIKLQkJCQlpZD0icHJvcGVydHkudGFiLmV4dGVuc2lvbnMiPgotCQkJPC9wcm9wZXJ0eVRhYj4KLSAgICA8L3Byb3BlcnR5VGFicz4KLSA8L2V4dGVuc2lvbj4KLQotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5wcm9wZXJ0eVNlY3Rpb25zIj4KLSAgIDxwcm9wZXJ0eVNlY3Rpb25zIGNvbnRyaWJ1dG9ySWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yIj4KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuWFNEU2NoZW1hU2VjdGlvbiIgIAotCSAJaWQ9InByb3Auc2VjdGlvbi5YU0RTY2hlbWFTZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWEiPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuU2NoZW1hTG9jYXRpb25TZWN0aW9uIiAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uU2NoZW1hTG9jYXRpb25TZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFDb21wb3NpdG9yIj4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIgCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLlhTRENvbXBsZXhUeXBlU2VjdGlvbiIgIAotCSAJaWQ9InByb3Auc2VjdGlvbi5YU0RDb21wbGV4VHlwZVNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmFkdmFuY2VkIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuWFNEQ29tcGxleFR5cGVBZHZhbmNlZFNlY3Rpb24iICAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uWFNEQ29tcGxleFR5cGVBZHZhbmNlZFNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgkJIAotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmdlbmVyYWwiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5YU0RFbGVtZW50RGVjbGFyYXRpb25TZWN0aW9uIiAgCi0JIAlpZD0icHJvcC5zZWN0aW9uLlhTREVsZW1lbnREZWNsYXJhdGlvblNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbiI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmFkdmFuY2VkIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuWFNERWxlbWVudERlY2xhcmF0aW9uQWR2YW5jZWRTZWN0aW9uIiAgCi0JIAlpZD0icHJvcC5zZWN0aW9uLlhTREVsZW1lbnREZWNsYXJhdGlvbkFkdmFuY2VkU2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uIj4KLQkgICAgPC9pbnB1dD4gICAKLQkgPC9wcm9wZXJ0eVNlY3Rpb24+IAotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmdlbmVyYWwiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvblNlY3Rpb24iCi0JIAlpZD0icHJvcC5zZWN0aW9uLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uU2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi5nZW5lcmFsIiAKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uU2VjdGlvbiIgIAotCSAJaWQ9InByb3Auc2VjdGlvbi5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25TZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4JCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIgCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLlhTRE1vZGVsR3JvdXBTZWN0aW9uIiAgCi0JIAlpZD0icHJvcC5zZWN0aW9uLlhTRE1vZGVsR3JvdXBTZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwIj4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIgCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uU2VjdGlvbiIgIAotCSAJaWQ9InByb3Auc2VjdGlvbi5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvblNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIj4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIgCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLlhTRFNpbXBsZVR5cGVTZWN0aW9uIgotCSAJaWQ9InByb3Auc2VjdGlvbi5YU0RTaW1wbGVUeXBlU2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb24iPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi50eXBlY29uc3RyYWludHMiIAotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5YU0RGYWNldFNlY3Rpb24iCi0gICAgICAgIGZpbHRlcj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5YU0RGYWNldFNlY3Rpb25GaWx0ZXIiCi0JIAlpZD0icHJvcC5zZWN0aW9uLlhTREZhY2V0U2VjdGlvbiI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQiPgotCSAgICA8L2lucHV0PgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9InByb3BlcnR5LnRhYi5kb2N1bWVudGF0aW9uIiAKLQkgCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLkFubm90YXRpb25TZWN0aW9uIiAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uQW5ub3RhdGlvblNlY3Rpb24iPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50Ij4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIuZXh0ZW5zaW9ucyIgCi0JIAljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5FeHRlbnNpb25zU2VjdGlvbiIgCi0JIAlpZD0icHJvcC5zZWN0aW9uLkV4dGVuc2lvbnNTZWN0aW9uIj4KLQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudCI+Ci0JICAgIDwvaW5wdXQ+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0icHJvcGVydHkudGFiLmdlbmVyYWwiIAotCSAJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuWFNEQW55RWxlbWVudENvbnRlbnRzU2VjdGlvbiIgCi0JIAlpZD0icHJvcC5zZWN0aW9uLmdlbmVyYWwiPgotCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkIj4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJwcm9wZXJ0eS50YWIuZ2VuZXJhbCIgCi0JIAljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5YU0RJbXBvcnRTZWN0aW9uIiAKLQkgCWlkPSJwcm9wLnNlY3Rpb24uZ2VuZXJhbCI+Ci0JICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0Ij4KLQkgICAgPC9pbnB1dD4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gIDwvcHJvcGVydHlTZWN0aW9ucz4KLTwvZXh0ZW5zaW9uPgotCi0gIDwhLS0gdGhpcyBleHRlbnNpb24gcG9pbnQgaXMgZGVwcmVjYXRlZCwgdXNlIGV4dGVuc2lvbkNhdGVnb3JpZXMgLS0+Ci0gIDxleHRlbnNpb24tcG9pbnQgaWQ9IkV4dGVuc2lvbnNTY2hlbWFzRGVzY3JpcHRpb24iIG5hbWU9IiVFeHRlbnNpb25zU2NoZW1hc0Rlc2NyaXB0aW9uIi8+ICAKLSAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZXh0ZW5zaW9uQ2F0ZWdvcmllcyIgbmFtZT0iJUV4dGVuc2lvbkNhdGVnb3JpZXNEZXNjcmlwdGlvbiIvPgotCi0gIDwhLS0gdGhpcyBleHRlbnNpb24gcG9pbnQgaXMgZGVwcmVjYXRlZCwgdXNlIGludGVybmFsRWRpdG9yQ29uZmlndXJhdGlvbiAtLT4gIAotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJYU0RFZGl0b3JFeHRlbnNpb25Db25maWd1cmF0aW9uIiBuYW1lPSIlWFNERWRpdG9yRXh0ZW5zaW9uQ29uZmlndXJhdGlvbiIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJpbnRlcm5hbEVkaXRvckNvbmZpZ3VyYXRpb24iIG5hbWU9IiVJbnRlcm5hbEVkaXRvckNvbmZpZ3VyYXRpb24iLz4KLSAgCi0gIDxleHRlbnNpb24tcG9pbnQgaWQ9ImV4dGVuc2liaWxpdHlOb2RlQ3VzdG9taXphdGlvbnMiIG5hbWU9IiVFeHRlbnNpb25Ob2RlQ3VzdG9taXphdGlvbnNEZXNjcmlwdGlvbiIvPgotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJlZGl0b3JNb2RlcyIgbmFtZT0iJVhNTFNjaGVtYUVkaXRvck1vZGVzIi8+Ci0KLQk8IS0tIGludGlhbGl6ZSB4c2QgcmVjb25jaWxlIHZhbGlkYXRvciAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0idG90YWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYU0QiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYU0QiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllcgotCQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUueHNkc291cmNlIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCI+Ci0JCQkJPC9wYXJ0aXRpb25UeXBlPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCTwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMiPgotCQk8Y29udGV4dAotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkudGV4dC5lZGl0b3IuY29udGV4dCIKLQkJCW5hbWU9IiVjb250ZXh0LnRleHQuZWRpdG9yLnhzZC5uYW1lIgotCQkJcGFyZW50SWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRFZGl0b3JTY29wZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gdGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBhdWdtZW50IHRoZSBNb2RlbFF1ZXJ5IHRvIHByb3ZpZGUgc2NoZW1hIHNwZWNpZmljIGd1aWRlZCBlZGl0aW5nIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5tb2RlbFF1ZXJ5RXh0ZW5zaW9ucyI+Ci0JCTxtb2RlbFF1ZXJ5RXh0ZW5zaW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC50ZXh0LlhTRE1vZGVsUXVlcnlFeHRlbnNpb24iCi0JCQljb250ZW50VHlwZT0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLnhzZHNvdXJjZSI+Ci0JCTwvbW9kZWxRdWVyeUV4dGVuc2lvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gUmVnaXN0ZXIgdGhlIFhTRFNlYXJjaFBhcnRpY3BhbnQgYWdhaW5zdCBmb3IgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybnMgCQktLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4JCi0JIDxleHRlbnNpb24gICAKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2hQYXJ0aWNpcGFudHMiPgotCQk8c2VhcmNoUGFydGljaXBhbnQKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnNlYXJjaC5YU0RTZWFyY2hQYXJ0aWNpcGFudCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5YU0RTZWFyY2hQYXJ0aWNpcGFudCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCSAgIDxvcj4KLQkJCSAgICAgIDx3aXRoIHZhcmlhYmxlPSJwYXR0ZXJuIj4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybiIvPgkJCSAgIAotCQkJCSAgPC93aXRoPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvc2VhcmNoUGFydGljaXBhbnQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4JIAotICAgIDwhLS0gUmVnaXN0ZXIgYSAncmVuYW1lJyBwYXJ0aWNpcGFudCB0aGlzIGVuYWJsZXMgdXMgdG8gcHJvdmlkZSByZWZhY3RvcmluZyBmb3IgICAgIC0tPiAKLSAgICA8IS0tIHJlbmFtZWQgWE1MIFNjaGVtYSBjb21wb25lbnRzIChlLmcuIGVsZW1lbnRzLCB0eXBlcyBldGMuKSAgICAgICAgICAgICAgICAgICAgICAtLT4gCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CSAKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5yZW5hbWVQYXJ0aWNpcGFudHMiPgotCQk8cmVuYW1lUGFydGljaXBhbnQKLQkJCW5hbWU9IiV4c2QucmVzb3VyY2UucmVuYW1lLnBhcnRpY2lwYW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuWFNEQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC5yZWZhY3RvcmluZy5YU0RDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iZWxlbWVudCI+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50Ij4KLQkJCQkJPC9pbnN0YW5jZW9mPgotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZW5hbWVQYXJ0aWNpcGFudD4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CSAKLSAgICA8IS0tIFJlZ2lzdGVyIGEgJ3JlbmFtZScgcGFydGljaXBhbnQgdGhpcyBlbmFibGVzIHVzIHRvIHByb3ZpZGUgcmVmYWN0b3JpbmcgZm9yICAgICAtLT4gCi0gICAgPCEtLSByZW5hbWVkIHJlc291cmNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+IAotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgkgCi08IS0tCi0gICAgPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucmVuYW1lUGFydGljaXBhbnRzIj4KLQkJPHJlbmFtZVBhcnRpY2lwYW50Ci0JCQluYW1lPSIleHNkLnJlc291cmNlLnJlbmFtZS5wYXJ0aWNpcGFudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lLlJlc291cmNlUmVuYW1lUGFydGljaXBhbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC5yZWZhY3RvcmluZy5YU0RSZXNvdXJjZVJlbmFtZVBhcnRpY2lwYW50Ij4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJlbGVtZW50Ij4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIvPgotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZW5hbWVQYXJ0aWNpcGFudD4KLQk8L2V4dGVuc2lvbj4KLQktLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBSZWdpc3RlciB0aGUgICdSZWZhY3RvcicsICdSZWZlcmVuY2VzJyBhbmQgJ0RlY2xhcmF0aW9ucycgaXRlbXMgdG8gdGhlIGRlc2lnbiB2aWV3CSAgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4JICAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+IAotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbiAKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yaW5nLm1lbnUub2JqZWN0Q29udHJpYiIgCi0gICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlciI+ICAKLSAgICAgICAgIDwhLS0gCi0gICAgICAgICBjcyA6IGRlY2xhcmF0aW9uIHNlYXJjaCBpc24ndCBmdWxseSBpbXBsZW1lbnRlZCB5ZXQsIHJlbW92aW5nIHRoaXMgbWVudSBhY3Rpb24gZm9yIG5vdwotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuc2VhcmNoLmRlY2xhcmF0aW9ucy5hY3Rpb24iIAotICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgIHN0eWxlPSJwdWxsZG93biIKLSAgICAgICAgICAgIG1lbnViYXJQYXRoPSJzZWFyY2gtc2xvdCIKLSAgICAgICAgICAgIGxhYmVsPSIlc2VhcmNoLmRlY2xhcmF0aW9ucy5sYWJlbCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zLlhTRFNlYXJjaERlY2xhcmF0aW9uc0dyb3VwQWN0aW9uRGVsZWdhdGUiPiAKLSAgICAgICAgIDwvYWN0aW9uPiAgICAgICAgICAKLSAgICAgICAgIC0tPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuc2VhcmNoLnJlZmVyZW5jZXMuYWN0aW9uIiAKLSAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICBzdHlsZT0icHVsbGRvd24iCi0gICAgICAgICAgICBtZW51YmFyUGF0aD0ic2VhcmNoLXNsb3QiCi0gICAgICAgICAgICBsYWJlbD0iJXNlYXJjaC5yZWZlcmVuY2VzLmxhYmVsIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnMuWFNEU2VhcmNoUmVmZXJlbmNlc0dyb3VwQWN0aW9uRGVsZWdhdGUiPiAKLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3JpbmcubWVudS5yZWZhY3Rvckdyb3VwLm9iamVjdCIgCi0gICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgc3R5bGU9InB1bGxkb3duIgotICAgICAgICAgICAgbWVudWJhclBhdGg9InJlZmFjdG9yaW5nLXNsb3QiCi0gICAgICAgICAgICBsYWJlbD0iJXJlZmFjdG9yaW5nQWN0aW9uU2V0LmxhYmVsIiAKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnMuWFNEUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlIj4gCi0gICAgICAgICA8L2FjdGlvbj4gICAKLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAgICAgICAgIAotICAgICAgPCEtLSBoZXJlIHdlIGFkZCB0aGUgJ3JlZmFjdG9yJyBtZW51IGl0ZW0gdG8gdGhlIHNvdXJjZSB2aWV3IC0tPgotICAgICAgPHZpZXdlckNvbnRyaWJ1dGlvbgotICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3RvcmluZy5tZW51LnNvdXJjZSIKLSAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2Uuc291cmNlLkVkaXRvckNvbnRleHQiPgotCSAgICA8YWN0aW9uIGlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yaW5nLm1lbnUucmVmYWN0b3JHcm91cC5zb3VyY2UiCi0gICAgICAgCQlzdHlsZT0icHVsbGRvd24iCi0gICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgbGFiZWw9IiVyZWZhY3RvcmluZy5tZW51LmxhYmVsIiAKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnMuWFNEUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlIj4gCi0gIAkgICAgPC9hY3Rpb24+Ci0gICAgICAgPC92aWV3ZXJDb250cmlidXRpb24+Ci0JCTx2aWV3ZXJDb250cmlidXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUueHNkc291cmNlLnNvdXJjZS5SdWxlckNvbnRleHQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5ydWxlci5jb250ZXh0LmFjdGlvbnMiPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkVGFzay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5BZGRUYXNrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkVGFzay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkQm9va21hcmsudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iPgotCQkJPC9hY3Rpb24+Ci0JCTwvdmlld2VyQ29udHJpYnV0aW9uPgotCi0gICAgIDwvZXh0ZW5zaW9uPgotCi0JCi0JPCEtLSAKLQkJVGhlIGZvbGxvd2luZyBleHRlbnNpb24gdG8gdGhlIGZpbGUgY29udGV4dCBtZW51IGlzIHRlbXBvcmFyeSB1bnRpbCByZXNvdXJjZSAKLQkJbmF2aWdhdG9yIHdpbGwgcHJvdmlkZSBhbGxvdyB0byBleHRlbmQgcmVmYWN0b3IgbWVudSAgICAgICAgCi0JLS0+Ci0JCi0JPCEtLWV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0JIDxvYmplY3RDb250cmlidXRpb24KLQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQluYW1lRmlsdGVyPSIqLnhzZCIKLQkJaWQ9Im9yZy53c3QueHNkLnVpLnJlbmFtZSI+Ci0JCTxtZW51IGlkPSJyZWZhY3RvclhTRFJlc291cmNlIiBwYXRoPSJhZGRpdGlvbnMiIGxhYmVsPSIlcmVmYWN0b3JpbmcubWVudS5sYWJlbCI+Ci0JCSAgPHNlcGFyYXRvciBuYW1lPSJyZWZhY3RvciIvPgotCQk8L21lbnU+Ci0JPGFjdGlvbgotCQlsYWJlbD0iJXJlZmFjdG9yaW5nLnJlbmFtZUFjdGlvbi5sYWJlbCIKLQkJbWVudWJhclBhdGg9InJlZmFjdG9yWFNEUmVzb3VyY2UvcmVmYWN0b3IiCi0JCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnMuUmVuYW1lUmVzb3VyY2VBY3Rpb25EZWxlZ2F0ZSIKLQkJZW5hYmxlc0Zvcj0iMSIKLQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3JpbmcuYWN0aW9ucy5SZW5hbWVSZXNvdXJjZSI+Ci0JIDwvYWN0aW9uPgotCSA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbi0tPgkKLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLnhzZC5yZWZhY3Rvci5yZW5hbWUuZWxlbWVudC5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLnhzZC5yZWZhY3Rvci5yZW5hbWUuZWxlbWVudC5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5yZWZhY3Rvci5yZW5hbWUuZWxlbWVudCI+Ci0JCTwvY29tbWFuZD4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLnhzZC5yZWZhY3Rvci5tYWtlRWxlbWVudEdsb2JhbC5lbGVtZW50Lm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbW1hbmQueHNkLnJlZmFjdG9yLm1ha2VFbGVtZW50R2xvYmFsLmVsZW1lbnQuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IubWFrZUVsZW1lbnRHbG9iYWwiPgotCQk8L2NvbW1hbmQ+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlY29tbWFuZC54c2QucmVmYWN0b3IubWFrZVR5cGVHbG9iYWwuZWxlbWVudC5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLnhzZC5yZWZhY3Rvci5tYWtlVHlwZUdsb2JhbC5lbGVtZW50LmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLm1ha2VUeXBlR2xvYmFsIj4KLQkJPC9jb21tYW5kPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJWNvbW1hbmQueHNkLnJlZmFjdG9yLnJlbmFtZVRhcmdldE5hbWVzcGFjZS5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLnhzZC5yZWZhY3Rvci5yZW5hbWVUYXJnZXROYW1lc3BhY2UuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IucmVuYW1lVGFyZ2V0TmFtZXNwYWNlIj4KLQkJPC9jb21tYW5kPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmh5cGVybGlua0RldGVjdG9yVGFyZ2V0cyI+Ci0JCTx0YXJnZXQKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUueHNkc291cmNlIgotCQkJbmFtZT0iJVhTRF9Tb3VyY2VfdGFyZ2V0X25hbWUiPgotCQk8L3RhcmdldD4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci5oeXBlcmxpbmtEZXRlY3RvcnMiPgotCQk8aHlwZXJsaW5rRGV0ZWN0b3IKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RIeXBlcmxpbmtEZXRlY3RvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RIeXBlcmxpbmtEZXRlY3RvciIKLQkJCW5hbWU9IiVYU0RfaHlwZXJsaW5rIgotCQkJdGFyZ2V0SWQ9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UiPgotCQk8L2h5cGVybGlua0RldGVjdG9yPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovVHlwZVZpekVkaXRvck1vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovVHlwZVZpekVkaXRvck1vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ4ZDEyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L1R5cGVWaXpFZGl0b3JNb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXo7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuRWRpdG9yTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLkFEVENvbnRlbnRPdXRsaW5lUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5UeXBlVml6RmlndXJlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuWFNERWRpdFBhcnRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgVHlwZVZpekVkaXRvck1vZGUgZXh0ZW5kcyBFZGl0b3JNb2RlCi17Ci0gIHByaXZhdGUgRWRpdFBhcnRGYWN0b3J5IGVkaXRQYXJ0RmFjdG9yeTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS50eXBldml6IjsKLSAgCi0gIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkKLSAgewotICAgIHJldHVybiAiQWR2YW5jZWQiOwotICB9Ci0KLSAgcHVibGljIEVkaXRQYXJ0RmFjdG9yeSBnZXRFZGl0UGFydEZhY3RvcnkoKQotICB7Ci0gICAgaWYgKGVkaXRQYXJ0RmFjdG9yeSA9PSBudWxsKQotICAgIHsKLSAgICAgIGVkaXRQYXJ0RmFjdG9yeSA9IG5ldyBYU0RFZGl0UGFydEZhY3RvcnkobmV3IFR5cGVWaXpGaWd1cmVGYWN0b3J5KCkpOwotICAgIH0gIAotICAgIHJldHVybiBlZGl0UGFydEZhY3Rvcnk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIHJldHVybiBJRDsKLSAgfQotCi0gIHB1YmxpYyBJQ29udGVudFByb3ZpZGVyIGdldE91dGxpbmVQcm92aWRlcigpCi0gIHsKLSAgICByZXR1cm4gbmV3IEFEVENvbnRlbnRPdXRsaW5lUHJvdmlkZXIoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9Cb3hGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvQm94RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YTkwNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9Cb3hGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5sYXlvdXRzLkNvbHVtbkRhdGE7Ci0KLXB1YmxpYyBjbGFzcyBCb3hGaWd1cmUgZXh0ZW5kcyBGaWd1cmUKLXsKLSAgcHJvdGVjdGVkIENvbHVtbkRhdGEgY29sdW1uRGF0YSA9IG5ldyBDb2x1bW5EYXRhKCk7ICAKLSAgcHVibGljIEhlYWRpbmdGaWd1cmUgaGVhZGluZ0ZpZ3VyZTsKLSAgcHJvdGVjdGVkIEZpZ3VyZSBjb250ZW50UGFuZTsKLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQgPSBmYWxzZTsKLQotICBwdWJsaWMgQm94RmlndXJlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gCi0gICAgYm9vbGVhbiBoaWdoQ29udHJhc3QgPSBmYWxzZTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBoaWdoQ29udHJhc3QgPSBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRIaWdoQ29udHJhc3QoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgaWYgKCFoaWdoQ29udHJhc3QpCi0gICAgewotICAgICAgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLSAgICB9Ci0gICAgCi0gICAgaGVhZGluZ0ZpZ3VyZSA9IG5ldyBIZWFkaW5nRmlndXJlKCk7ICAgCi0gICAgYWRkKGhlYWRpbmdGaWd1cmUpOwotCi0gICAgY29udGVudFBhbmUgPSBuZXcgRmlndXJlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBwYWludChHcmFwaGljcyBncmFwaGljcykKLSAgICAgIHsKLSAgICAgICAgZ3JhcGhpY3MuZmlsbFJlY3RhbmdsZShnZXRCb3VuZHMoKSk7Ci0gICAgICAgIHN1cGVyLnBhaW50KGdyYXBoaWNzKTsKLSAgICAgICAgYm9vbGVhbiBpc0ZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgRmlndXJlIGZpZ3VyZSA9IChGaWd1cmUpIGkubmV4dCgpOwotICAgICAgICAgIGlmIChpc0ZpcnN0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFJlY3RhbmdsZSByID0gZmlndXJlLmdldEJvdW5kcygpOwotICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd0xpbmUoci54LCByLnkgKyAxLCByLnggKyByLndpZHRoLCByLnkgKyAxKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotICAgIGNvbnRlbnRQYW5lLnNldExheW91dE1hbmFnZXIobmV3IFRvb2xiYXJMYXlvdXQoKSk7Ci0gICAgYWRkKGNvbnRlbnRQYW5lKTsKLSAgICBoZWFkaW5nRmlndXJlLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7IAotICB9Ci0KLSAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZ3JhcGhpY3MpCi0gIHsKLSAgICBzdXBlci5wYWludChncmFwaGljcyk7Ci0gICAgLyoKLSAgICAvLyBGaWxsIGZvciB0aGUgaGVhZGVyIHNlY3Rpb24KLSAgICAvLwotICAgIFJlY3RhbmdsZSByID0gZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotICAgIGdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5kYXJrR3JheSk7Ci0gICAgQ29sb3IgZ3JhZGllbnQxID0gQ29sb3JDb25zdGFudHMubGlnaHRHcmF5OwotICAgIGlmIChpc1NlbGVjdGVkKQotICAgIHsKLSAgICAgIGdyYWRpZW50MSA9IENvbG9yQ29uc3RhbnRzLmxpZ2h0Qmx1ZTsKLSAgICB9Ci0gICAgQ29sb3IgZ3JhZGllbnQyID0gQ29sb3JDb25zdGFudHMud2hpdGU7Ci0gICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKGdyYWRpZW50MSk7Ci0gICAgZ3JhcGhpY3Muc2V0QmFja2dyb3VuZENvbG9yKGdyYWRpZW50Mik7Ci0gICAgZ3JhcGhpY3MuZmlsbEdyYWRpZW50KHIueCArIDEsIHIueSArIDEsIHIud2lkdGggLSAyLCBub2RlTmFtZUxhYmVsLmdldEJvdW5kcygpLmhlaWdodCAtIDEsIHRydWUpOwotICAgIG5vZGVOYW1lTGFiZWwucGFpbnQoZ3JhcGhpY3MpOwotICAgICovCi0gIH0KLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpCi0gIHsKLSAgICByZXR1cm4gY29udGVudFBhbmU7Ci0gIH0KLQotICBwdWJsaWMgTGFiZWwgZ2V0TmFtZUxhYmVsKCkKLSAgewotICAgIHJldHVybiBoZWFkaW5nRmlndXJlLmdldExhYmVsKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBIZWFkaW5nRmlndXJlIGdldEhlYWRpbmdGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIGhlYWRpbmdGaWd1cmU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBDb2x1bW5EYXRhIGdldENvbHVtbkRhdGEoKQotICB7Ci0gICAgcmV0dXJuIGNvbHVtbkRhdGE7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9Db21wYXJ0bWVudEZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9Db21wYXJ0bWVudEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDE5YWRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvQ29tcGFydG1lbnRGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkRlc2lnblZpZXdlckdyYXBoaWNDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5TdHJ1Y3R1cmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JQ29tcGFydG1lbnRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSVN0cnVjdHVyZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5sYXlvdXRzLlJvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLkdlbmVyaWNHcm91cEZpZ3VyZTsKLQotcHVibGljIGNsYXNzIENvbXBhcnRtZW50RmlndXJlIGV4dGVuZHMgRmlndXJlIGltcGxlbWVudHMgSUNvbXBhcnRtZW50RmlndXJlCi17Ci0gIHB1YmxpYyBMYWJlbCBub2RlTmFtZUxhYmVsOwotICBwcm90ZWN0ZWQgRmlndXJlIGNvbnRlbnRQYW5lOwotICBwcm90ZWN0ZWQgRmlndXJlIGFubm90YXRpb25BcmVhOwotICBwdWJsaWMgRmlndXJlIHJvd0ZpZ3VyZTsKLQotICBwdWJsaWMgQ29tcGFydG1lbnRGaWd1cmUoKQotICB7Ci0gICAgc3VwZXIoKTsKLQotICAgIHJvd0ZpZ3VyZSA9IG5ldyBGaWd1cmUoKTsKLSAgICBhZGQocm93RmlndXJlKTsKLQotICAgIGFubm90YXRpb25BcmVhID0gbmV3IEZpZ3VyZSgpIHsKLSAgICAgIAotICAgICAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZ3JhcGhpY3MpCi0gICAgICB7Ci0gICAgICAgIHN1cGVyLnBhaW50KGdyYXBoaWNzKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBncmFwaGljcy5wdXNoU3RhdGUoKTsgIAotICAgICAgICAgIGdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibHVlKTsKLSAgICAgICAgICBncmFwaGljcy5zZXRGb250KERlc2lnblZpZXdlckdyYXBoaWNDb25zdGFudHMuc21hbGxGb250KTsKLSAgICAgICAgICBMaXN0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZpZ3VyZSBvYmplY3QgPSAoRmlndXJlKWkubmV4dCgpOwotICAgICAgICAgICAgdHJhdmVyc2Uob2JqZWN0LCBncmFwaGljcyk7ICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICBncmFwaGljcy5wb3BTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHByaXZhdGUgdm9pZCB0cmF2ZXJzZShGaWd1cmUgZmlndXJlLCBHcmFwaGljcyBncmFwaGljcykKLSAgICAgIHsKLSAgICAgICAgTGlzdCBjaGlsZHJlbiA9IGZpZ3VyZS5nZXRDaGlsZHJlbigpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgRmlndXJlIG9iamVjdCA9IChGaWd1cmUpaS5uZXh0KCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEdlbmVyaWNHcm91cEZpZ3VyZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBHZW5lcmljR3JvdXBGaWd1cmUgZmlnID0gKEdlbmVyaWNHcm91cEZpZ3VyZSkgb2JqZWN0OwotICAgICAgICAgICAgaWYgKGZpZy5oYXNUZXh0KCkpCi0gICAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdUZXh0KGZpZy5nZXRUZXh0KCksIGZpZy5nZXRUZXh0Q29vcmRpbmF0ZXMoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHRyYXZlcnNlKG9iamVjdCwgZ3JhcGhpY3MpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotICAgICAgCi0gICAgfTsKLSAgICBUb29sYmFyTGF5b3V0IGFubm90YXRpb25MYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSk7Ci0gICAgYW5ub3RhdGlvbkxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIGFubm90YXRpb25BcmVhLnNldExheW91dE1hbmFnZXIoYW5ub3RhdGlvbkxheW91dCk7Ci0KLSAgICAvLyBOZWVkIHRoaXMgdG8gc2hvdyBjb250ZW50IG1vZGVsIHN0cnVjdHVyZSBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBmaWd1cmUKLSAgICByb3dGaWd1cmUuYWRkKGFubm90YXRpb25BcmVhKTsKLQotICAgIGNvbnRlbnRQYW5lID0gbmV3IEZpZ3VyZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZ3JhcGhpY3MpCi0gICAgICB7Ci0gICAgICAgIHN1cGVyLnBhaW50KGdyYXBoaWNzKTsKLSAgICAgICAgZ3JhcGhpY3MucHVzaFN0YXRlKCk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgYm9vbGVhbiBpc0ZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICBDb2xvciBvbGRDb2xvciA9IGdyYXBoaWNzLmdldEZvcmVncm91bmRDb2xvcigpOwotICAgICAgICAgIGdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5saWdodEdyYXkpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZpZ3VyZSBmaWd1cmUgPSAoRmlndXJlKSBpLm5leHQoKTsKLSAgICAgICAgICAgIFJlY3RhbmdsZSByID0gZmlndXJlLmdldEJvdW5kcygpOwotLy8gICAgICAgICAgICBpZiAoZmlndXJlIGluc3RhbmNlb2YgRmllbGRGaWd1cmUpCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgUmVjdGFuZ2xlIHJDaGlsZCA9ICgoRmllbGRGaWd1cmUpZmlndXJlKS5nZXROYW1lRmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0vLyAgICAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKHJDaGlsZC5yaWdodCgpLCByQ2hpbGQueSwgckNoaWxkLnJpZ2h0KCksIHJDaGlsZC5ib3R0b20oKSk7Ci0vLyAgICAgICAgICAgICAgIGdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5kYXJrR3JheSk7Ci0vLyAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpc0ZpcnN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7Ci0vLyAgICAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKHIueCwgci55LCByLngsIHIueSArIHIuaGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLSAgICAgICAgICAgICAgZ3JhcGhpY3Muc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSk7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgZ3JhcGhpY3MuZmlsbEdyYWRpZW50KHIueCwgci55LCByLndpZHRoLCAxLCBmYWxzZSk7ICAgIAotLy8gICAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKHIueCwgci55LCByLnggKyByLndpZHRoLCByLnkpOwotLy8gICAgICAgICAgICBncmFwaGljcy5kcmF3TGluZShyLngsIHIueSwgci54LCByLnkgKyByLmhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihvbGRDb2xvcik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgZ3JhcGhpY3MucG9wU3RhdGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH07Ci0gICAgY29udGVudFBhbmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgVG9vbGJhckxheW91dCgpKTsKLSAgICByb3dGaWd1cmUuYWRkKGNvbnRlbnRQYW5lKTsKLQotICAgIFJvd0xheW91dCByb3dMYXlvdXQgPSBuZXcgUm93TGF5b3V0KCk7Ci0gICAgcm93RmlndXJlLnNldExheW91dE1hbmFnZXIocm93TGF5b3V0KTsKLSAgICByb3dMYXlvdXQuc2V0Q29uc3RyYWludChhbm5vdGF0aW9uQXJlYSwgImFubm90YXRpb24iKTsKLSAgICByb3dMYXlvdXQuc2V0Q29uc3RyYWludChjb250ZW50UGFuZSwgImNvbnRlbnRQYW5lIik7Ci0gIH0KLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpCi0gIHsKLSAgICByZXR1cm4gY29udGVudFBhbmU7Ci0gIH0KLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRBbm5vdGF0aW9uUGFuZSgpCi0gIHsKLSAgICByZXR1cm4gYW5ub3RhdGlvbkFyZWE7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGVkaXRQYXJ0QXR0YWNoZWQoRWRpdFBhcnQgb3duZXIpCi0gIHsgICAKLSAgICBTdHJ1Y3R1cmVFZGl0UGFydCBzdHJ1Y3R1cmVFZGl0UGFydCA9IG51bGw7Ci0gICAgZm9yIChFZGl0UGFydCBwYXJlbnQgPSBvd25lci5nZXRQYXJlbnQoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKSkKLSAgICB7Ci0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgU3RydWN0dXJlRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIHN0cnVjdHVyZUVkaXRQYXJ0ID0gKFN0cnVjdHVyZUVkaXRQYXJ0KSBwYXJlbnQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBSb3dMYXlvdXQgcm93TGF5b3V0ID0gKFJvd0xheW91dClyb3dGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpOwotICAgIElTdHJ1Y3R1cmVGaWd1cmUgdHlwZUZpZ3VyZSA9IHN0cnVjdHVyZUVkaXRQYXJ0LmdldFN0cnVjdHVyZUZpZ3VyZSgpOyAgICAKLSAgICBBc3NlcnQuaXNUcnVlKHR5cGVGaWd1cmUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVGaWd1cmUsICJFeHBlY3RlZCBvYmplY3Qgb2YgdHlwZSBTdHJ1Y3R1cmVGaWd1cmUiKTsgICAgCi0gICAgcm93TGF5b3V0LnNldENvbHVtbkRhdGEoKChTdHJ1Y3R1cmVGaWd1cmUpdHlwZUZpZ3VyZSkuZ2V0Q29sdW1uRGF0YSgpKTsgICAgICAgICAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkZlZWRiYWNrKCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uRmVlZGJhY2soKQotICB7Ci0gIH0gICAKLSAgCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hWaXN1YWxzKE9iamVjdCBtb2RlbCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9GaWVsZEZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9GaWVsZEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWQ4N2NjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvRmllbGRGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5TdHJ1Y3R1cmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JRmllbGRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSVN0cnVjdHVyZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5sYXlvdXRzLlJvd0xheW91dDsKLQotcHVibGljIGNsYXNzIEZpZWxkRmlndXJlIGV4dGVuZHMgRmlndXJlIGltcGxlbWVudHMgSUZpZWxkRmlndXJlCi17Ci0gIC8vIFRPRE86IHB1dCB0aGlzIGNvbG9yIGlzIHNvbWUgY29tbW9uIGNsYXNzCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgY2VsbENvbG9yID0gbmV3IENvbG9yKG51bGwsIDIyNCwgMjMzLCAyNDYpOwotCi0vLyBGb3IgZml4IHRvIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjE5NDAKLS8vICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIGxlZnRPdXRlckJvcmRlckNvbG9yID0gbmV3IENvbG9yKG51bGwsIDI1MywgMTk2LCA4OCk7Ci0vLyAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBsZWZ0SW5uZXJCb3JkZXJDb2xvciA9IG5ldyBDb2xvcihudWxsLCAyNTMsIDIyNiwgMTcyKTsKLS8vICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIHJpZ2h0T3V0ZXJCb3JkZXJDb2xvciA9IG5ldyBDb2xvcihudWxsLCAxNTAsIDE3OSwgMjI0KTsKLS8vICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIHJpZ2h0SW5uZXJCb3JkZXJDb2xvciA9IG5ldyBDb2xvcihudWxsLCA0OSwgMTA2LCAxOTcpOwotICAKLSAgLy8gRm9ybWF0dGluZyBjb25zdHJhaW50cwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT1BfTUFSR0lOID0gMjsgLy8gcGl4ZWxzCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPVFRPTV9NQVJHSU4gPSBUT1BfTUFSR0lOICsgMTsgLy8gZXh0cmEgcGl4ZWwgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvb3RlciBsaW5lCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFRlRfTUFSR0lOID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRfTUFSR0lOID0gTEVGVF9NQVJHSU47Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJR0hUX1NJREVfUEFERElORyA9IDY7Ci0KLSAgLy8gU3RhdGVzIHJlcXVpcmluZyBkZWNvcmF0b3JzLCBhbmQgdGhlaXIgaWNvbnMKLSAgLy8gcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbWFnZSBlcnJvckljb24gPSBJQ09OX0VSUk9SOwotCi0gIC8vIExhYmVscyB3aGljaCBoYW5kbGUgcHJlc2VudGF0aW9uIG9mIG5hbWUgYW5kIHR5cGUKLSAgcHVibGljIEZpZ3VyZSByb3dGaWd1cmU7Ci0gIHByb3RlY3RlZCBMYWJlbCBuYW1lTGFiZWw7Ci0gIHByb3RlY3RlZCBMYWJlbCBuYW1lQW5ub3RhdGlvbkxhYmVsOyAgLy8gZm9yIG9jY3VycmVuY2UgdGV4dCwgb3IgZXJyb3IgaWNvbnMKLSAgcHJvdGVjdGVkIExhYmVsIHR5cGVMYWJlbDsKLSAgcHJvdGVjdGVkIExhYmVsIHR5cGVBbm5vdGF0aW9uTGFiZWw7ICAvLyBmb3Igb2NjdXJyZW5jZSB0ZXh0LCBvciBlcnJvciBpY29ucwotICBwcm90ZWN0ZWQgTGFiZWwgdG9vbFRpcExhYmVsOwotICAKLSAgcHVibGljIGJvb2xlYW4gaGFzRm9jdXMgPSBmYWxzZTsKLSAgCi0gIHB1YmxpYyBGaWVsZEZpZ3VyZSgpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHNldExheW91dE1hbmFnZXIobmV3IFRvb2xiYXJMYXlvdXQoKSk7Ci0gICAgcm93RmlndXJlID0gbmV3IEZpZ3VyZSgpOwotICAgIFJvd0xheW91dCByb3dMYXlvdXQgPSBuZXcgUm93TGF5b3V0KCk7Ci0gICAgcm93RmlndXJlLnNldExheW91dE1hbmFnZXIocm93TGF5b3V0KTsKLQotICAgIGFkZChyb3dGaWd1cmUpOwotCi0gICAgbmFtZUxhYmVsID0gbmV3IExhYmVsKCk7Ci0gICAgbmFtZUxhYmVsLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDMsIDUsIDMsIDUpKTsKLSAgICBuYW1lTGFiZWwuc2V0TGFiZWxBbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuTEVGVCk7Ci0gICAgbmFtZUxhYmVsLnNldE9wYXF1ZSh0cnVlKTsKLSAgICByb3dGaWd1cmUuYWRkKG5hbWVMYWJlbCk7Ci0gICAgCi0gICAgbmFtZUFubm90YXRpb25MYWJlbCA9IG5ldyBMYWJlbCgpOwotICAgIG5hbWVBbm5vdGF0aW9uTGFiZWwuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMywgNSwgMywgNSkpOwotICAgIG5hbWVBbm5vdGF0aW9uTGFiZWwuc2V0TGFiZWxBbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuTEVGVCk7Ci0gICAgbmFtZUFubm90YXRpb25MYWJlbC5zZXRPcGFxdWUodHJ1ZSk7Ci0gICAgcm93RmlndXJlLmFkZChuYW1lQW5ub3RhdGlvbkxhYmVsKTsKLSAgICAKLSAgICB0b29sVGlwTGFiZWwgPSBuZXcgTGFiZWwoKTsKLS8vICBEb24ndCBzaG93IHRvb2x0aXAgZm9yIG5vdy4gIEFubm95aW5nIHZlcnRpY2FsIGxpbmUgc2hvd3MgdXAuICBTYWZlIGZpeC4KLS8vICAgIG5hbWVMYWJlbC5zZXRUb29sVGlwKHRvb2xUaXBMYWJlbCk7Ci0gICAgdHlwZUxhYmVsID0gbmV3IExhYmVsKCk7Ci0gICAgCi0gICAgLy8gY3MgOiB3ZSBuZWVkIHRvIGFkZCBzb21lIGFkZGl0aW9uYWwgcGFkZGluZyB0byB0aGUgcmlnaHQKLSAgICAvLyBzbyB0aGF0IHdoZW4gd2UgZWRpdCB0aGUgZmllbGQgdGhlcmUncyByb29tIGZvciB0aGUgY29tYm9ib3gncyBhcnJvdwotICAgIC8vIGFuZCB0aGUgdHlwZSBuYW1lIHdvbid0IGJlIHBhcnRpYWxseSBvYnNjdXJlZAotICAgIC8vCi0gICAgdHlwZUxhYmVsLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDMsIDUsIDMsIDIwKSk7Ci0gICAgdHlwZUxhYmVsLnNldExhYmVsQWxpZ25tZW50KFBvc2l0aW9uQ29uc3RhbnRzLkxFRlQpOwotICAgIHR5cGVMYWJlbC5zZXRPcGFxdWUodHJ1ZSk7Ci0gICAgcm93RmlndXJlLmFkZCh0eXBlTGFiZWwpOwotCi0gICAgdHlwZUFubm90YXRpb25MYWJlbCA9IG5ldyBMYWJlbCgpIHsKLSAgICAgIAotICAgICAgcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKGludCB3SGludCwgaW50IGhIaW50KQotICAgICAgewotICAgICAgICBpZiAoZ2V0VGV4dCgpID09IG51bGwgfHwgZ2V0VGV4dCgpLmVxdWFscygiIikpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbmV3IERpbWVuc2lvbigwLCAwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UHJlZmVycmVkU2l6ZSh3SGludCwgaEhpbnQpOwotICAgICAgfQotICAgIH07Ci0gICAgdHlwZUFubm90YXRpb25MYWJlbC5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigzLCA1LCAzLCA1KSk7Ci0gICAgdHlwZUFubm90YXRpb25MYWJlbC5zZXRMYWJlbEFsaWdubWVudChQb3NpdGlvbkNvbnN0YW50cy5MRUZUKTsKLSAgICB0eXBlQW5ub3RhdGlvbkxhYmVsLnNldE9wYXF1ZSh0cnVlKTsKLSAgICByb3dGaWd1cmUuYWRkKHR5cGVBbm5vdGF0aW9uTGFiZWwpOwotLy8gRG9uJ3Qgc2hvdyB0b29sdGlwIGZvciBub3cuICBBbm5veWluZyB2ZXJ0aWNhbCBsaW5lIHNob3dzIHVwLiAgU2FmZSBmaXguCi0vLyAgICB0eXBlQW5ub3RhdGlvbkxhYmVsLnNldFRvb2xUaXAodG9vbFRpcExhYmVsKTsKLSAgICAKLSAgICByb3dMYXlvdXQuc2V0Q29uc3RyYWludChuYW1lTGFiZWwsICJuYW1lIik7Ci0gICAgcm93TGF5b3V0LnNldENvbnN0cmFpbnQobmFtZUFubm90YXRpb25MYWJlbCwgIm5hbWVBbm5vdGF0aW9uIik7Ci0gICAgcm93TGF5b3V0LnNldENvbnN0cmFpbnQodHlwZUxhYmVsLCAidHlwZSIpOwotICAgIHJvd0xheW91dC5zZXRDb25zdHJhaW50KHR5cGVBbm5vdGF0aW9uTGFiZWwsICJ0eXBlQW5ub3RhdGlvbiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgIm5hbWUiIHN0cmluZyB1c2VkIGJ5IHRoaXMgZmlndXJlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lTGFiZWwuZ2V0VGV4dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZmlndXJlIHJlcHJlc2VudGluZyB0aGUgYXR0cmlidXRlIG5hbWUKLSAgICovCi0gIHB1YmxpYyBMYWJlbCBnZXROYW1lTGFiZWwoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVMYWJlbDsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlICJ0eXBlIiBzdHJpbmcgdXNlZCBieSB0aGlzIGZpZ3VyZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gdHlwZUxhYmVsLmdldFRleHQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZpZ3VyZSByZXByZXNlbnRpbmcgdGhlIGF0dHJpYnV0ZSdzIHR5cGUKLSAgICovCi0gIHB1YmxpYyBMYWJlbCBnZXRUeXBlTGFiZWwoKQotICB7Ci0gICAgcmV0dXJuIHR5cGVMYWJlbDsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gbmFtZQotICAgKiAgICAgICAgICBTZXQgdGhlICJuYW1lIiBzdHJpbmcgdXNlZCBieSB0aGlzIGZpZ3VyZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBuYW1lTGFiZWwuc2V0VGV4dChuYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gdHlwZQotICAgKiAgICAgICAgICBTZXQgdGhlICJ0eXBlIiBzdHJpbmcgdXNlZCBieSB0aGlzIGZpZ3VyZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpCi0gIHsKLSAgICB0eXBlTGFiZWwuc2V0VGV4dCh0eXBlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VHlwZVRvb2xUaXBUZXh0KFN0cmluZyB0b29sVGlwKQotICB7Ci0gICAgc2V0TmFtZVRvb2xUaXBUZXh0KHRvb2xUaXApOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZVRvb2xUaXBUZXh0KFN0cmluZyB0b29sVGlwKQotICB7Ci0gICAgaWYgKHRvb2xUaXAubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIG5hbWVMYWJlbC5zZXRUb29sVGlwKHRvb2xUaXBMYWJlbCk7Ci0gICAgICB0b29sVGlwTGFiZWwuc2V0VGV4dCh0b29sVGlwKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG5hbWVMYWJlbC5zZXRUb29sVGlwKG51bGwpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmFtZUFubm90YXRpb25MYWJlbChTdHJpbmcgdGV4dCkKLSAgewotICAgIG5hbWVBbm5vdGF0aW9uTGFiZWwuc2V0VGV4dCh0ZXh0KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWVBbm5vdGF0aW9uTGFiZWxJY29uKEltYWdlIGljb24pCi0gIHsKLSAgICBuYW1lQW5ub3RhdGlvbkxhYmVsLnNldEljb24oaWNvbik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMYWJlbCBnZXROYW1lQW5ub3RhdGlvbkxhYmVsKCkKLSAgewotICAgIHJldHVybiBuYW1lQW5ub3RhdGlvbkxhYmVsOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRUeXBlQW5ub3RhdGlvbkxhYmVsKFN0cmluZyB0ZXh0KQotICB7Ci0gICAgdHlwZUFubm90YXRpb25MYWJlbC5zZXRUZXh0KHRleHQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VHlwZUFubm90YXRpb25MYWJlbEljb24oSW1hZ2UgaWNvbikKLSAgewotICAgIHR5cGVBbm5vdGF0aW9uTGFiZWwuc2V0SWNvbihpY29uKTsKLSAgfQotCi0gIHB1YmxpYyBMYWJlbCBnZXRUeXBlQW5ub3RhdGlvbkxhYmVsKCkKLSAgewotICAgIHJldHVybiB0eXBlQW5ub3RhdGlvbkxhYmVsOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZWNvbXB1dGVMYXlvdXQoKQotICB7Ci0gICAgUm93TGF5b3V0IGxheW91dCA9IChSb3dMYXlvdXQpcm93RmlndXJlLmdldExheW91dE1hbmFnZXIoKTsKLSAgICBpZiAobGF5b3V0ICE9IG51bGwgJiYgbGF5b3V0LmdldENvbHVtbkRhdGEoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGxheW91dC5nZXRDb2x1bW5EYXRhKCkuY2xlYXJDb2x1bW5XaWR0aHMoKTsKLSAgICB9ICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBlZGl0UGFydEF0dGFjaGVkKEVkaXRQYXJ0IG93bmVyKQotICB7Ci0gICAgU3RydWN0dXJlRWRpdFBhcnQgc3RydWN0dXJlRWRpdFBhcnQgPSBudWxsOwotICAgIGZvciAoRWRpdFBhcnQgcGFyZW50ID0gb3duZXIuZ2V0UGFyZW50KCk7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCkpCi0gICAgewotICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBzdHJ1Y3R1cmVFZGl0UGFydCA9IChTdHJ1Y3R1cmVFZGl0UGFydCkgcGFyZW50OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgUm93TGF5b3V0IHJvd0xheW91dCA9IChSb3dMYXlvdXQpcm93RmlndXJlLmdldExheW91dE1hbmFnZXIoKTsKLSAgICBJU3RydWN0dXJlRmlndXJlIHR5cGVGaWd1cmUgPSBzdHJ1Y3R1cmVFZGl0UGFydC5nZXRTdHJ1Y3R1cmVGaWd1cmUoKTsgICAgCi0gICAgQXNzZXJ0LmlzVHJ1ZSh0eXBlRmlndXJlIGluc3RhbmNlb2YgU3RydWN0dXJlRmlndXJlLCAiRXhwZWN0ZWQgb2JqZWN0IG9mIHR5cGUgU3RydWN0dXJlRmlndXJlIik7ICAgIAotICAgIHJvd0xheW91dC5zZXRDb2x1bW5EYXRhKCgoU3RydWN0dXJlRmlndXJlKXR5cGVGaWd1cmUpLmdldENvbHVtbkRhdGEoKSk7ICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkZlZWRiYWNrKCkKLSAgewotICAgIGJvb2xlYW4gaGlnaENvbnRyYXN0ID0gZmFsc2U7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaGlnaENvbnRyYXN0ID0gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0SGlnaENvbnRyYXN0KCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGlmIChoaWdoQ29udHJhc3QpCi0gICAgewotICAgICAgcm93RmlndXJlLnNldEZvcmVncm91bmRDb2xvcihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpKTsKLSAgICAgIHJvd0ZpZ3VyZS5zZXRCYWNrZ3JvdW5kQ29sb3IoRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9GT1JFR1JPVU5EKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByb3dGaWd1cmUuc2V0QmFja2dyb3VuZENvbG9yKGNlbGxDb2xvcik7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25GZWVkYmFjaygpCi0gIHsKLSAgICBib29sZWFuIGhpZ2hDb250cmFzdCA9IGZhbHNlOwotICAgIHRyeQotICAgIHsKLSAgICAgIGhpZ2hDb250cmFzdCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEhpZ2hDb250cmFzdCgpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBpZiAoaGlnaENvbnRyYXN0KQotICAgIHsKLSAgICAgIHJvd0ZpZ3VyZS5zZXRGb3JlZ3JvdW5kQ29sb3IoRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9GT1JFR1JPVU5EKSk7Ci0gICAgICByb3dGaWd1cmUuc2V0QmFja2dyb3VuZENvbG9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcm93RmlndXJlLnNldEJhY2tncm91bmRDb2xvcihnZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZWZyZXNoVmlzdWFscyhPYmplY3QgbW9kZWwpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZ3JhcGhpY3MpCi0gIHsKLSAgICBzdXBlci5wYWludChncmFwaGljcyk7Ci0gICAgaWYgKGhhc0ZvY3VzKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBncmFwaGljcy5wdXNoU3RhdGUoKTsKLSAgICAgICAgUmVjdGFuZ2xlIHIgPSBnZXRCb3VuZHMoKTsKLSAgICAgICAgZ3JhcGhpY3Muc2V0WE9STW9kZSh0cnVlKTsKLSAgICAgICAgZ3JhcGhpY3MuZHJhd0ZvY3VzKHIueCwgci55ICsgMSwgci53aWR0aCAtIDEsIHIuaGVpZ2h0IC0gMik7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIGdyYXBoaWNzLnBvcFN0YXRlKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL0hlYWRpbmdGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvSGVhZGluZ0ZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzI3NWQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvSGVhZGluZ0ZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLXB1YmxpYyBjbGFzcyBIZWFkaW5nRmlndXJlIGV4dGVuZHMgRmlndXJlCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgaGVhZGVyQ29sb3IgPSBuZXcgQ29sb3IobnVsbCwgMjI0LCAyMzMsIDI0Nik7Ci0gIExhYmVsIGxhYmVsOwotICBDb2xvcltdIGdyYWRpZW50Q29sb3IgPSB7Q29sb3JDb25zdGFudHMud2hpdGUsICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yQ29uc3RhbnRzLmxpZ2h0Qmx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yQ29uc3RhbnRzLmdyYXl9OwotICBib29sZWFuIGlzU2VsZWN0ZWQgPSBmYWxzZTsKLSAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgSGVhZGluZ0ZpZ3VyZSgpCi0gIHsKLSAgICBsYWJlbCA9IG5ldyBMYWJlbCgpOwotICAgIGxhYmVsLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDIpKTsKLSAgICBUb29sYmFyTGF5b3V0IHRvb2xiYXJMYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSk7Ci0gICAgdG9vbGJhckxheW91dC5zZXRNaW5vckFsaWdubWVudChUb29sYmFyTGF5b3V0LkFMSUdOX0NFTlRFUik7Ci0gICAgc2V0TGF5b3V0TWFuYWdlcih0b29sYmFyTGF5b3V0KTsKLSAgICBhZGQobGFiZWwpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRHcmFkaWVudENvbG9ycyhDb2xvcltdIGNvbG9ycykKLSAgewotICAgIHRoaXMuZ3JhZGllbnRDb2xvciA9IGNvbG9yczsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQoYm9vbGVhbiBpc1NlbGVjdGVkKQotICB7Ci0gICAgdGhpcy5pc1NlbGVjdGVkID0gaXNTZWxlY3RlZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElzUmVhZE9ubHkoYm9vbGVhbiBpc1JlYWRPbmx5KQotICB7Ci0gICAgdGhpcy5pc1JlYWRPbmx5ID0gaXNSZWFkT25seTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcGFpbnQoR3JhcGhpY3MgZ3JhcGhpY3MpCi0gIHsKLSAgICBzdXBlci5wYWludChncmFwaGljcyk7Ci0gICAgCi0gICAgZ3JhcGhpY3MucHVzaFN0YXRlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gRmlsbCBmb3IgdGhlIGhlYWRlciBzZWN0aW9uCi0gICAgICAvLwotICAgICAgUmVjdGFuZ2xlIHIgPSBnZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0gICAgICBncmFwaGljcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubGlnaHRHcmF5KTsKLSAgCi0gICAgICBDb2xvciBncmFkaWVudDEgPSBpc1JlYWRPbmx5ID8gZ3JhZGllbnRDb2xvclsxXSA6IGhlYWRlckNvbG9yOwotICAgICAgaWYgKGlzU2VsZWN0ZWQgJiYgaXNSZWFkT25seSkgZ3JhZGllbnQxID0gZ3JhZGllbnRDb2xvclszXTsKLSAgICAgIGVsc2UgaWYgKGlzU2VsZWN0ZWQgJiYgIWlzUmVhZE9ubHkpIGdyYWRpZW50MSA9IGdyYWRpZW50Q29sb3JbMl07Ci0gICAgICBDb2xvciBncmFkaWVudDIgPSBncmFkaWVudENvbG9yWzBdOwotICAgICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKGdyYWRpZW50MSk7Ci0gICAgICBncmFwaGljcy5zZXRCYWNrZ3JvdW5kQ29sb3IoZ3JhZGllbnQyKTsKLSAgICAgIFJlY3RhbmdsZSBsYWJlbEJvdW5kcyA9IGxhYmVsLmdldEJvdW5kcygpOwotICAgICAgZ3JhcGhpY3MuZmlsbEdyYWRpZW50KHIueCsxLCByLnkrMSwgci53aWR0aC0yLCBsYWJlbEJvdW5kcy5oZWlnaHQgLSAyLCB0cnVlKTsgICAgCi0gICAgICBncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuZGFya0dyYXkpOwotICAgICAgbGFiZWwucGFpbnQoZ3JhcGhpY3MpOyAgICAKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGdyYXBoaWNzLnBvcFN0YXRlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIExhYmVsIGdldExhYmVsKCkKLSAgewotICAgIHJldHVybiBsYWJlbDsKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL1JvdW5kZWRMaW5lQm9yZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9maWd1cmVzL1JvdW5kZWRMaW5lQm9yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZTgwZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9Sb3VuZGVkTGluZUJvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5JbnNldHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi1wdWJsaWMgY2xhc3MgUm91bmRlZExpbmVCb3JkZXIgZXh0ZW5kcyBMaW5lQm9yZGVyCi17Ci0gIHByb3RlY3RlZCBpbnQgYXJjTGVuZ3RoOyAgIAotICBwcm90ZWN0ZWQgaW50IGxpbmVTdHlsZSA9IEdyYXBoaWNzLkxJTkVfU09MSUQ7Ci0KLSAgcHVibGljIFJvdW5kZWRMaW5lQm9yZGVyKENvbG9yIGMsIGludCB3aWR0aCwgaW50IGFyY0xlbmd0aCkKLSAgewotICAgIHN1cGVyKGMsIHdpZHRoKTsgICAgIAotICAgIHRoaXMuYXJjTGVuZ3RoID0gYXJjTGVuZ3RoOwotICB9Ci0KLSAgcHVibGljIFJvdW5kZWRMaW5lQm9yZGVyKGludCB3aWR0aCwgaW50IGFyY0xlbmd0aCkKLSAgewotICAgIHN1cGVyKHdpZHRoKTsgICAgIAotICAgIHRoaXMuYXJjTGVuZ3RoID0gYXJjTGVuZ3RoOwotICB9Ci0gIAotICBwdWJsaWMgUm91bmRlZExpbmVCb3JkZXIoQ29sb3IgYywgaW50IHdpZHRoLCBpbnQgYXJjTGVuZ3RoLCBpbnQgbGluZVN0eWxlKQotICB7Ci0gICAgc3VwZXIoYywgd2lkdGgpOwotICAgIHRoaXMuYXJjTGVuZ3RoID0gYXJjTGVuZ3RoOwotICAgIHRoaXMubGluZVN0eWxlID0gbGluZVN0eWxlOwotICB9Ci0KLSAgcHVibGljIFJvdW5kZWRMaW5lQm9yZGVyKGludCB3aWR0aCwgaW50IGFyY0xlbmd0aCwgaW50IGxpbmVTdHlsZSkKLSAgewotICAgIHN1cGVyKHdpZHRoKTsKLSAgICB0aGlzLmFyY0xlbmd0aCA9IGFyY0xlbmd0aDsKLSAgICB0aGlzLmxpbmVTdHlsZSA9IGxpbmVTdHlsZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBhaW50KElGaWd1cmUgZmlndXJlLCBHcmFwaGljcyBncmFwaGljcywgSW5zZXRzIGluc2V0cykKLSAgewotICAgIGludCBybGJXaWR0aCA9IGdldFdpZHRoKCk7Ci0gICAgdGVtcFJlY3Quc2V0Qm91bmRzKGdldFBhaW50UmVjdGFuZ2xlKGZpZ3VyZSwgaW5zZXRzKSk7Ci0gICAgaWYgKHJsYldpZHRoJTIgPT0gMSkKLSAgICB7Ci0gICAgICB0ZW1wUmVjdC53aWR0aC0tOwotICAgICAgdGVtcFJlY3QuaGVpZ2h0LS07Ci0gICAgfQotICAgIHRlbXBSZWN0LnNocmluayhybGJXaWR0aC8yLHJsYldpZHRoLzIpOwotICAgIGdyYXBoaWNzLnNldExpbmVXaWR0aChybGJXaWR0aCk7Ci0gICAgZ3JhcGhpY3Muc2V0TGluZVN0eWxlKGxpbmVTdHlsZSk7Ci0gICAgaWYgKGdldENvbG9yKCkgIT0gbnVsbCkKLSAgICAgIGdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihnZXRDb2xvcigpKTsKLSAgICBncmFwaGljcy5kcmF3Um91bmRSZWN0YW5nbGUodGVtcFJlY3QsIGFyY0xlbmd0aCwgYXJjTGVuZ3RoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9TdHJ1Y3R1cmVGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvU3RydWN0dXJlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MGY2NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9TdHJ1Y3R1cmVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklTdHJ1Y3R1cmVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci0KLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZUZpZ3VyZSBleHRlbmRzIEJveEZpZ3VyZSBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVGaWd1cmUKLXsKLSAgcHVibGljIHZvaWQgZWRpdFBhcnRBdHRhY2hlZChFZGl0UGFydCBvd25lcikKLSAgewotICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZSA6LSkKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkZlZWRiYWNrKCkKLSAgewotICAgIExpbmVCb3JkZXIgYm94RmlndXJlTGluZUJvcmRlciA9IChMaW5lQm9yZGVyKWdldEJvcmRlcigpOwotICAgIGJveEZpZ3VyZUxpbmVCb3JkZXIuc2V0V2lkdGgoMik7Ci0gICAgLy8gVE9ETyAoY3MpIG5lZWQgdG8gZml4IHRoaXMKLSAgICAvL2JveEZpZ3VyZUxpbmVCb3JkZXIuc2V0Q29sb3IoZ2V0Q29tcGxleFR5cGUoKS5pc1JlYWRPbmx5KCkgPyBDb2xvckNvbnN0YW50cy5kYXJrR3JheSA6IENvbG9yQ29uc3RhbnRzLmRhcmtCbHVlKTsgIAotICAgIGdldEhlYWRpbmdGaWd1cmUoKS5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICByZXBhaW50KCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25GZWVkYmFjaygpCi0gIHsKLSAgICBMaW5lQm9yZGVyIGJveEZpZ3VyZUxpbmVCb3JkZXIgPSAoTGluZUJvcmRlcilnZXRCb3JkZXIoKTsKLSAgICBib3hGaWd1cmVMaW5lQm9yZGVyLnNldFdpZHRoKDEpOwotICAgIGdldEhlYWRpbmdGaWd1cmUoKS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0gICAgcmVwYWludCgpOwotICB9ICAKLSAgCi0gIHB1YmxpYyBib29sZWFuIGhpdFRlc3RIZWFkZXIoUG9pbnQgbG9jYXRpb24pCi0gIHsKLSAgICBJRmlndXJlIHRhcmdldCA9IGdldEhlYWRpbmdGaWd1cmUoKTsKLSAgICBSZWN0YW5nbGUgYiA9IHRhcmdldC5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0gICAgdGFyZ2V0LnRyYW5zbGF0ZVRvQWJzb2x1dGUoYik7ICAKLSAgICByZXR1cm4gYi5jb250YWlucyhsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hWaXN1YWxzKE9iamVjdCBtb2RlbCkKLSAgewotICAgIElTdHJ1Y3R1cmUgc3RydWN0dXJlID0gKElTdHJ1Y3R1cmUpbW9kZWw7Ci0gICAgZ2V0TmFtZUxhYmVsKCkuc2V0VGV4dChzdHJ1Y3R1cmUuZ2V0TmFtZSgpKTsKLSAgICBnZXRIZWFkaW5nRmlndXJlKCkuc2V0SXNSZWFkT25seShzdHJ1Y3R1cmUuaXNSZWFkT25seSgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9UeXBlVml6RmlndXJlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vZmlndXJlcy9UeXBlVml6RmlndXJlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODI2MGZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2ZpZ3VyZXMvVHlwZVZpekZpZ3VyZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JQ29tcGFydG1lbnRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSUZpZWxkRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklTdHJ1Y3R1cmVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5JRXh0ZW5kZWRGaWd1cmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuSU1vZGVsR3JvdXBGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5Nb2RlbEdyb3VwRmlndXJlOwotCi1wdWJsaWMgY2xhc3MgVHlwZVZpekZpZ3VyZUZhY3RvcnkgaW1wbGVtZW50cyBJRXh0ZW5kZWRGaWd1cmVGYWN0b3J5Ci17ICAKLSAgcHVibGljIElTdHJ1Y3R1cmVGaWd1cmUgY3JlYXRlU3RydWN0dXJlRmlndXJlKE9iamVjdCBtb2RlbCkKLSAgewotICAgIFN0cnVjdHVyZUZpZ3VyZSBmaWd1cmUgPSBuZXcgU3RydWN0dXJlRmlndXJlKCk7Ci0gICAgZmlndXJlLnNldEJvcmRlcihuZXcgTGluZUJvcmRlcigxKSk7ICAgIAotICAgIFRvb2xiYXJMYXlvdXQgdG9vbGJhckxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KCk7Ci0gICAgdG9vbGJhckxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIGZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKHRvb2xiYXJMYXlvdXQpOwotCi0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSVRyZWVFbGVtZW50KQotICAgIHsKLSAgICAgIGZpZ3VyZS5nZXROYW1lTGFiZWwoKS5zZXRJY29uKCgoSVRyZWVFbGVtZW50KW1vZGVsKS5nZXRJbWFnZSgpKTsKLSAgICB9ICAgIAotICAgIC8vZmlndXJlLmdldEhlYWRpbmdGaWd1cmUoKS5zZXRJc1JlYWRPbmx5KGdldENvbXBsZXhUeXBlKCkuaXNSZWFkT25seSgpKTsKLSAgICAvLyB3ZSBzaG91bGQgb3JnYW5pemUgSVRyZWVFbGVtZW50IGFuZCBpbnRlZ3JhdGUgaXQgd2l0aCB0aGUgZmFjYWRlICAgIAotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLQotICBwdWJsaWMgSUZpZWxkRmlndXJlIGNyZWF0ZUZpZWxkRmlndXJlKE9iamVjdCBtb2RlbCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbmV3IEZpZWxkRmlndXJlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJQ29tcGFydG1lbnRGaWd1cmUgY3JlYXRlQ29tcGFydG1lbnRGaWd1cmUoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgQ29tcGFydG1lbnRGaWd1cmUgZmlndXJlID0gbmV3IENvbXBhcnRtZW50RmlndXJlKCk7Ci0gICAgZmlndXJlLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDEpKTsKLSAgICBUb29sYmFyTGF5b3V0IHRvb2xiYXJMYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSk7Ci0gICAgdG9vbGJhckxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIGZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKHRvb2xiYXJMYXlvdXQpOwotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0gIAotICAKLSAgcHVibGljIElNb2RlbEdyb3VwRmlndXJlIGNyZWF0ZU1vZGVsR3JvdXBGaWd1cmUoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBuZXcgTW9kZWxHcm91cEZpZ3VyZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2QtdHlwZXZpei9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC90eXBldml6L2Rlc2lnbi9sYXlvdXRzL0NvbHVtbkRhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2xheW91dHMvQ29sdW1uRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGU5ZGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2xheW91dHMvQ29sdW1uRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmxheW91dHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBDb2x1bW5EYXRhCi17Ci0gIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgCi0gIGNsYXNzIEVudHJ5Ci0gIHsKLSAgICBpbnQgd2lkdGggPSAwOwotICAgIGludCB3ZWlnaHQgPSAxOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBjbGVhckNvbHVtbldpZHRocygpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBtYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KWkubmV4dCgpOwotICAgICAgZW50cnkud2lkdGggPSAwOwotICAgIH0gIAotICB9ICAKLSAgCi0gIHByaXZhdGUgRW50cnkgbG9va3VwT3JDcmVhdGVDb2x1bW5FbnRyeShTdHJpbmcgaWRlbnRpZmllcikKLSAgewotICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KW1hcC5nZXQoaWRlbnRpZmllcik7Ci0gICAgaWYgKGVudHJ5ID09IG51bGwpCi0gICAgewotICAgICAgZW50cnkgPSBuZXcgRW50cnkoKTsKLSAgICAgIG1hcC5wdXQoaWRlbnRpZmllciwgZW50cnkpOwotICAgIH0gIAotICAgcmV0dXJuIGVudHJ5OyAKLSAgfSAgCi0gIAotICB2b2lkIHN0cmV0Y2hDb2x1bW5XaWR0aElmTmVlZGVkKFN0cmluZyBpZGVudGlmaWVyLCBpbnQgd2lkdGgpCi0gIHsKLSAgICBFbnRyeSBlbnRyeSA9IGxvb2t1cE9yQ3JlYXRlQ29sdW1uRW50cnkoaWRlbnRpZmllcik7Ci0gICAgZW50cnkud2lkdGggPSBNYXRoLm1heChlbnRyeS53aWR0aCwgd2lkdGgpOwotICB9Ci0gIAotICBpbnQgZ2V0Q29sdW1uV2lkdGgoU3RyaW5nIGlkZW50aWZpZXIpCi0gIHsKLSAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSltYXAuZ2V0KGlkZW50aWZpZXIpOwotICAgIGlmIChlbnRyeSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBlbnRyeS53aWR0aDsKLSAgICB9ICAKLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIDA7Ly9obW0gc2hvdWxkIHdlIHJldHVybiAtMSA/Ci0gICAgfSAgCi0gIH0KLSAgCi0gIGludCBnZXRDb2x1bW5XZWlnaHQoU3RyaW5nIGlkZW50aWZpZXIpCi0gIHsKLSAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSltYXAuZ2V0KGlkZW50aWZpZXIpOwotICAgIGlmIChlbnRyeSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBlbnRyeS53ZWlnaHQ7Ci0gICAgfSAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0gIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDb2x1bW5XZWlnaHQoU3RyaW5nIGlkZW50aWZpZXIsIGludCB3ZWlnaHQpCi0gIHsKLSAgICBFbnRyeSBlbnRyeSA9IGxvb2t1cE9yQ3JlYXRlQ29sdW1uRW50cnkoaWRlbnRpZmllcik7Ci0gICAgZW50cnkud2VpZ2h0ID0gd2VpZ2h0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vbGF5b3V0cy9Sb3dMYXlvdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC10eXBldml6L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L3R5cGV2aXovZGVzaWduL2xheW91dHMvUm93TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjOTA2NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkLXR5cGV2aXovb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvdHlwZXZpei9kZXNpZ24vbGF5b3V0cy9Sb3dMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24ubGF5b3V0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLXB1YmxpYyBjbGFzcyBSb3dMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdExheW91dAotewotICAvLyBsYXlvdXQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFyZW50IGNvbnRleHQKLSAgLy8gYW55IGxheW91dCBtYW5hZ2VyIHVuZGVyIHRoZSBwYXJlbnQgY29udGV4dCBpcyBjb25uZWN0ZWQKLSAgLy8gY29sdW1uIHJvd3MgYXJlIG1haW50YWluZWQgYWNjcm9zcyBjb250YWluZXIgYm91bmRhcmllcyAgCi0gIHByb3RlY3RlZCBDb2x1bW5EYXRhIGNvbHVtbkRhdGE7Ci0gIHByb3RlY3RlZCBIYXNoTWFwIGZpZ3VyZVRvQ29udHN0cmFpbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAKLSAgcHVibGljIFJvd0xheW91dCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotCi0gIC8vIHRoaXMgbWV0aG9kIGNvbXB1dGVzIHRoZSBtaW5pbXVtIHNpemUgcmVxdWlyZWQgdG8gZGlzcGxheSB0aGUgZmlndXJlcwotICAvLwotICBwcml2YXRlIERpbWVuc2lvbiBjYWxjdWxhdGVDaGlsZHJlblNpemUoSUZpZ3VyZSBjb250YWluZXIsIExpc3QgY2hpbGRyZW4sIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIHByZWZlcnJlZCkKLSAgewotICAgIERpbWVuc2lvbiBjaGlsZFNpemU7Ci0gICAgSUZpZ3VyZSBjaGlsZDsKLSAgICBpbnQgaGVpZ2h0ID0gMDsKLSAgICBpbnQgd2lkdGggPSAwOwotICAgIAotICAgIC8vSVJvd0ZpZ3VyZSBmaWd1cmUgPSAoSVJvd0ZpZ3VyZSljb250YWluZXI7Ci0gICAgCi0gICAgLy8gZm9yIGVhY2ggY2VsbCBpbiB0aGUgcm93Ci0gICAgLy8KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIGNoaWxkID0gKElGaWd1cmUpIGNoaWxkcmVuLmdldChpKTsKLSAgICAgIFN0cmluZyBjb2x1bW5JZGVuaWZpZXIgPSAoU3RyaW5nKWdldENvbnN0cmFpbnQoY2hpbGQpOwotICAgICAgICAgICAgIAotICAgICAgLy8gZmlyc3Qgd2UgY29tcHV0ZSB0aGUgY2hpbGQgc2l6ZSB3aXRob3V0IHJlZ2FyZCBmb3IgY29sdW1uRGF0YQotICAgICAgLy8KLSAgICAgIGNoaWxkU2l6ZSA9IGNoaWxkLmdldFByZWZlcnJlZFNpemUod0hpbnQsIGhIaW50KTsvLyA6IGNoaWxkLmdldE1pbmltdW1TaXplKHdIaW50LCBoSGludCk7Ci0gICAgICAgIAotICAgICAgLy8gbm93IHRoYXQgdGhlIGNvbHVtbkRhdGEgaGFzIGJlZW4gcG9wdWxhdGVkIHdlIGNhbiBjb25zaWRlciBpZiB0aGUgcm93IG5lZWRzIHRvIGJlIGxhcmdlcgotICAgICAgLy8KLSAgICAgIGludCBlZmZlY3RpdmVXaWR0aCA9IGNoaWxkU2l6ZS53aWR0aDsKLSAgICAgIGlmIChjb2x1bW5JZGVuaWZpZXIgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBjb2x1bW5EYXRhLnN0cmV0Y2hDb2x1bW5XaWR0aElmTmVlZGVkKGNvbHVtbklkZW5pZmllciwgY2hpbGRTaXplLndpZHRoKTsKLSAgICAgICAgZWZmZWN0aXZlV2lkdGggPSBjb2x1bW5EYXRhLmdldENvbHVtbldpZHRoKGNvbHVtbklkZW5pZmllcik7Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGhlaWdodCA9IE1hdGgubWF4KGNoaWxkU2l6ZS5oZWlnaHQsIGhlaWdodCk7Ci0gICAgICB3aWR0aCArPSBlZmZlY3RpdmVXaWR0aDsKLSAgICB9ICAKLSAgICByZXR1cm4gbmV3IERpbWVuc2lvbih3aWR0aCwgaGVpZ2h0KTsKLSAgfQotICAKLSAgCi0gIAotICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoSUZpZ3VyZSBjb250YWluZXIsIGludCB3SGludCwgaW50IGhIaW50KQotICB7ICAgIAotICAgIExpc3QgY2hpbGRyZW4gPSBjb250YWluZXIuZ2V0Q2hpbGRyZW4oKTsKLSAgICBEaW1lbnNpb24gcHJlZlNpemUgPSBjYWxjdWxhdGVDaGlsZHJlblNpemUoY29udGFpbmVyLCBjaGlsZHJlbiwgd0hpbnQsIGhIaW50LCB0cnVlKTsKLSAgICByZXR1cm4gcHJlZlNpemU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBsYXlvdXQoSUZpZ3VyZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBsYXlvdXQgYSB0YWJsZSB3aXRoIHRoZSBjb2x1bW5zIGFsaWduZWQgICAgICAKLSAgICAvL0lSb3dGaWd1cmUgcm93RmlndXJlID0gKElSb3dGaWd1cmUpcGFyZW50OyAgICAKLSAgICBSZWN0YW5nbGUgY2xpZW50QXJlYSA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCk7ICAgCi0gICAgTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpOwotICAgIFJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZSgpOwotICAgIHIueCA9IGNsaWVudEFyZWEueDsKLSAgICByLnkgPSBjbGllbnRBcmVhLnk7Ci0gICAgci5oZWlnaHQgPSBjbGllbnRBcmVhLmhlaWdodDsKLSAgICAKLSAgICBpbnQgY2hpbGRyZW5TaXplID0gY2hpbGRyZW4uc2l6ZSgpOwotICAgIFJlY3RhbmdsZVtdIGJvdW5kcyA9IG5ldyBSZWN0YW5nbGVbY2hpbGRyZW5TaXplXTsKLSAgICAKLSAgICAvLyBmb3IgZWFjaCBjZWxsIGluIHRoZSByb3cKLSAgICAvLwotICAgIGludCByZXF1aXJlZFdpZHRoID0gMDsKLSAgICBpbnQgdG90YWxDb2x1bW5XZWlnaHQgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW5TaXplOyBpKyspCi0gICAgewotICAgICAgSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKSBjaGlsZHJlbi5nZXQoaSk7Ci0gICAgICAvL1N0cmluZyBjb2x1bW5JZGVuaWZpZXIgPSBmaWd1cmUuZ2V0Q29sdW1uSWRlbnRpZmllcihjaGlsZCk7ICAgICAgICAgICAgIAotICAgICAgLy8gZmlyc3Qgd2UgY29tcHV0ZSB0aGUgY2hpbGQgc2l6ZSB3aXRob3V0IHJlZ2FyZCBmb3IgY29sdW1uRGF0YQotICAgICAgLy8KLSAgICAgIERpbWVuc2lvbiBjaGlsZFNpemUgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKC0xLCAtMSk7Ci0gICAgICAKLSAgICAgIGludCBjb2x1bW5XaWR0aCA9IC0xOwotICAgICAgLy9TdHJpbmcgY29sdW1uSWRlbnRpZmllciA9IHJvd0ZpZ3VyZS5nZXRDb2x1bW5JZGVudGlmaWVyKGNoaWxkKTsKLSAgICAgIFN0cmluZyBjb2x1bW5JZGVudGlmaWVyID0gKFN0cmluZylnZXRDb25zdHJhaW50KGNoaWxkKTsKLSAgICAgIGlmIChjb2x1bW5JZGVudGlmaWVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vY29sdW1uRGF0YS5zdHJldGNoQ29sdW1uV2lkdGhJZk5lZWRlZChjb2x1bW5JZGVudGlmaWVyLCBjaGlsZFNpemUud2lkdGgpOyAgICAgICAgCi0gICAgICAgIGNvbHVtbldpZHRoID0gY29sdW1uRGF0YS5nZXRDb2x1bW5XaWR0aChjb2x1bW5JZGVudGlmaWVyKTsKLSAgICAgICAgdG90YWxDb2x1bW5XZWlnaHQgKz0gY29sdW1uRGF0YS5nZXRDb2x1bW5XZWlnaHQoY29sdW1uSWRlbnRpZmllcik7Ci0gICAgICB9ICAKLSAgICAgIHIud2lkdGggPSBNYXRoLm1heChjaGlsZFNpemUud2lkdGgsIGNvbHVtbldpZHRoKTsKLSAgICAgIHJlcXVpcmVkV2lkdGggKz0gci53aWR0aDsKLSAgICAgIGJvdW5kc1tpXSA9IG5ldyBSZWN0YW5nbGUocik7ICAgICAgCi0gICAgICByLnggKz0gci53aWR0aDsKLSAgICB9ICAgICAgICAgIAotICAgIGlmICh0b3RhbENvbHVtbldlaWdodCA8IDEpCi0gICAgewotICAgICAgdG90YWxDb2x1bW5XZWlnaHQgPSAxOwotICAgIH0KLSAgICBpbnQgZXh0cmFXaWR0aCA9IE1hdGgubWF4KGNsaWVudEFyZWEud2lkdGggLSByZXF1aXJlZFdpZHRoLCAwKTsgICAgCi0gICAgaW50IGV4dHJhV2lkdGhBbGxvY2F0ZWQgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW5TaXplOyBpKyspCi0gICAgewotICAgICAgSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKSBjaGlsZHJlbi5nZXQoaSk7ICAgICAgCi0gICAgICBSZWN0YW5nbGUgYiA9IGJvdW5kc1tpXTsgICAgCi0gICAgICBpZiAoZXh0cmFXaWR0aCA+IDApCi0gICAgICB7ICAKLSAgICAgICAgU3RyaW5nIGNvbHVtbklkZW50aWZpZXIgPSAoU3RyaW5nKWdldENvbnN0cmFpbnQoY2hpbGQpOwotICAgICAgICBpZiAoY29sdW1uSWRlbnRpZmllciAhPSBudWxsKQotICAgICAgICB7ICAgICAgICAKLSAgICAgICAgICBpbnQgd2VpZ2h0ID0gY29sdW1uRGF0YS5nZXRDb2x1bW5XZWlnaHQoY29sdW1uSWRlbnRpZmllcik7Ci0gICAgICAgICAgZmxvYXQgZnJhY3Rpb24gPSAoZmxvYXQpd2VpZ2h0IC8gKGZsb2F0KXRvdGFsQ29sdW1uV2VpZ2h0OwotICAgICAgICAgIGludCBleHRyYVdpZHRoRm9yQ2hpbGQgPSAoaW50KShleHRyYVdpZHRoICogZnJhY3Rpb24pOwotICAgICAgIAotICAgICAgICAgIGIud2lkdGggKz0gZXh0cmFXaWR0aEZvckNoaWxkOyAgICAgICAgCi0gICAgICAgICAgYi54ICs9IGV4dHJhV2lkdGhBbGxvY2F0ZWQ7Ci0gICAgICAgICAgZXh0cmFXaWR0aEFsbG9jYXRlZCArPSBleHRyYVdpZHRoRm9yQ2hpbGQ7Ci0gICAgICAgIH0gIAotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBiLnggKz0gZXh0cmFXaWR0aEFsbG9jYXRlZDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2hpbGQuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoYikpOyAgCi0gICAgfSAgCi0gIH0KLQotICBwdWJsaWMgQ29sdW1uRGF0YSBnZXRDb2x1bW5EYXRhKCkKLSAgewotICAgIHJldHVybiBjb2x1bW5EYXRhOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q29sdW1uRGF0YShDb2x1bW5EYXRhIGNvbHVtbkRhdGEpCi0gIHsKLSAgICB0aGlzLmNvbHVtbkRhdGEgPSBjb2x1bW5EYXRhOwotICB9ICAgIAotICAKLSAgcHVibGljIE9iamVjdCBnZXRDb25zdHJhaW50KElGaWd1cmUgY2hpbGQpCi0gIHsKLSAgICByZXR1cm4gZmlndXJlVG9Db250c3RyYWludE1hcC5nZXQoY2hpbGQpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50KElGaWd1cmUgY2hpbGQsIE9iamVjdCBjb25zdHJhaW50KQotICB7Ci0gICAgZmlndXJlVG9Db250c3RyYWludE1hcC5wdXQoY2hpbGQsIGNvbnN0cmFpbnQpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCkKLSAgewotICAgIC8vZmlndXJlVG9Db250c3RyYWludE1hcC5jbGVhcigpOwotICAgIC8vdGhpcy5jb2x1bW5EYXRhLmNsZWFyQ29sdW1uV2lkdGhzKCk7Ci0gICAgc3VwZXIuaW52YWxpZGF0ZSgpOwotICAgCi0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9DcmVhdGVFbGVtZW50QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0NyZWF0ZUVsZW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmM2I3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0NyZWF0ZUVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5BYnN0cmFjdEVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0vLyBpc3N1ZSAoY3MpIGNhbiB3ZSByZW1vdmUgdGhpcz8KLS8vCi1wdWJsaWMgY2xhc3MgQ3JlYXRlRWxlbWVudEFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uOwotICBwcm90ZWN0ZWQgRWxlbWVudCBwYXJlbnROb2RlOwotCi0gIHByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWEgeHNkU2NoZW1hOwotCi0gIHByb3RlY3RlZCBPYmplY3Qgc291cmNlQ29udGV4dDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIENyZWF0ZUVsZW1lbnRBY3Rpb24uCi0gICAqLwotICBwdWJsaWMgQ3JlYXRlRWxlbWVudEFjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQ3JlYXRlRWxlbWVudEFjdGlvbi4KLSAgICogQHBhcmFtIHRleHQKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVFbGVtZW50QWN0aW9uKFN0cmluZyB0ZXh0KQotICB7Ci0gICAgc3VwZXIodGV4dCk7Ci0gIH0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBDcmVhdGVFbGVtZW50QWN0aW9uLgotICAgKiBAcGFyYW0gdGV4dAotICAgKiBAcGFyYW0gaW1hZ2UKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVFbGVtZW50QWN0aW9uKFN0cmluZyB0ZXh0LCBJbWFnZURlc2NyaXB0b3IgaW1hZ2UpCi0gIHsKLSAgICBzdXBlcih0ZXh0LCBpbWFnZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRYU0RTY2hlbWEoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHRoaXMueHNkU2NoZW1hID0geHNkU2NoZW1hOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Qcm92aWRlcihJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIpCi0gIHsKLSAgICB0aGlzLnNlbGVjdGlvblByb3ZpZGVyID0gc2VsZWN0aW9uUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VDb250ZXh0KE9iamVjdCBzb3VyY2VDb250ZXh0KQotICB7Ci0gICAgdGhpcy5zb3VyY2VDb250ZXh0ID0gc291cmNlQ29udGV4dDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldHMgdGhlIHBhcmVudE5vZGUuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIEVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBFbGVtZW50IGdldFBhcmVudE5vZGUoKQotICB7Ci0gICAgcmV0dXJuIHBhcmVudE5vZGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgcGFyZW50Tm9kZS4KLSAgICogQHBhcmFtIHBhcmVudE5vZGUgVGhlIHBhcmVudE5vZGUgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQYXJlbnROb2RlKEVsZW1lbnQgcGFyZW50Tm9kZSkKLSAgewotICAgIHRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7Ci0gIH0KLQotICBib29sZWFuIGlzR2xvYmFsID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJc0dsb2JhbChib29sZWFuIGlzR2xvYmFsKQotICB7Ci0gICAgdGhpcy5pc0dsb2JhbCA9IGlzR2xvYmFsOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRJc0dsb2JhbCgpCi0gIHsKLSAgICByZXR1cm4gaXNHbG9iYWw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTm9kZSByZWxhdGl2ZU5vZGU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZWxlbWVudFRhZzsKLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudFRhZyhTdHJpbmcgZWxlbWVudFRhZykKLSAgewotICAgIHRoaXMuZWxlbWVudFRhZyA9IGVsZW1lbnRUYWc7Ci0gIH0KLSAgCi0gIHB1YmxpYyBEb2N1bWVudEltcGwgZ2V0RG9jdW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIChEb2N1bWVudEltcGwpIGdldFBhcmVudE5vZGUoKS5nZXRPd25lckRvY3VtZW50KCk7Ci0gIH0KLSAgICAKLSAgcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7Ci0gICAgZ2V0RG9jdW1lbnQoKS5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIGRlc2NyaXB0aW9uKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZW5kUmVjb3JkaW5nKCkKLSAgewotICAgIERvY3VtZW50SW1wbCBkb2MgPSBnZXREb2N1bWVudCgpOwotICAgIAotICAgIGRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUFuZEFkZE5ld0NoaWxkRWxlbWVudCgpCi0gIHsKLSAgICBTdHJpbmcgcHJlZml4ID0gcGFyZW50Tm9kZS5nZXRQcmVmaXgoKTsKLSAgICBwcmVmaXggPSAocHJlZml4ID09IG51bGwpID8gIiIgOiAocHJlZml4ICsgIjoiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgRWxlbWVudCBjaGlsZE5vZGUgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnROUyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsIHByZWZpeCArIGVsZW1lbnRUYWcpOwotICAgIGlmIChnZXRBdHRyaWJ1dGVzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IGF0dHJpYnV0ZXMgPSBnZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIERPTUF0dHJpYnV0ZSBhdHRyID0gKERPTUF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoaSk7Ci0gICAgICAgIGNoaWxkTm9kZS5zZXRBdHRyaWJ1dGUoYXR0ci5nZXROYW1lKCksIGF0dHIuZ2V0VmFsdWUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChnZXRSZWxhdGl2ZU5vZGUoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoY2hpbGROb2RlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkTm9kZSxnZXRSZWxhdGl2ZU5vZGUoKSk7Ci0gICAgfQotICAgIAotICAgIGlmIChpc0dsb2JhbCAmJiBnZXRSZWxhdGl2ZU5vZGUoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIFRleHQgdGV4dE5vZGUgPSBnZXREb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKCJcblxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOwotICAgIH0KLSAgICBlbHNlIGlmIChpc0dsb2JhbCAmJiBnZXRSZWxhdGl2ZU5vZGUoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIFRleHQgdGV4dE5vZGUgPSBnZXREb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKCJcblxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRleHROb2RlLCBnZXRSZWxhdGl2ZU5vZGUoKSk7Ci0gICAgfQotCi0gICAgZm9ybWF0Q2hpbGQoY2hpbGROb2RlKTsKLSAgICAKLSAgICByZXR1cm4gY2hpbGROb2RlOwotICB9ICAgIAotICAgIAotICBwcm90ZWN0ZWQgdm9pZCBmb3JtYXRDaGlsZChFbGVtZW50IGNoaWxkKQotICB7Ci0gICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgSURPTU1vZGVsIG1vZGVsID0gKChJRE9NTm9kZSljaGlsZCkuZ2V0TW9kZWwoKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBhYm91dCB0byBtYWtlIGEgYmlnIG1vZGVsIGNoYW5nZQotICAgICAgICBtb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLSAgICAgICAgCi0JICAgICAgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotCQkgICAgZm9ybWF0UHJvY2Vzc29yLmZvcm1hdE5vZGUoY2hpbGQpOwotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICAvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZyBtb2RlbCBjaGFuZ2UKLSAgICAgICAgbW9kZWwuY2hhbmdlZE1vZGVsKCk7IAotICAgICAgfQotICAgIH0KLSAgfQotICAvKgotICAgKiBAc2VlIElBY3Rpb24jcnVuKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBiZWdpblJlY29yZGluZyhnZXREZXNjcmlwdGlvbigpKTsKLSAgICBmaW5hbCBFbGVtZW50IGNoaWxkID0gY3JlYXRlQW5kQWRkTmV3Q2hpbGRFbGVtZW50KCk7Ci0gICAgZW5kUmVjb3JkaW5nKCk7Ci0KLSAgICBpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmaW5hbCBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wID0geHNkU2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQoY2hpbGQpOwotLy8gICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29tcCkpOwotICAgICAgCi0gICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7Ci0gICAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiljb21wKS5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29tcC5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2VsZWN0aW9uUHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbXAuZ2V0Q29udGFpbmVyKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNvbXAuZ2V0Q29udGFpbmVyKCkuZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoY2hpbGQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIHRydWUpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0aW9uUHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbXAuZ2V0Q29udGFpbmVyKCkpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29tcCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNlbGVjdGlvblByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjb21wKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29tcCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29tcCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoc291cmNlQ29udGV4dCBpbnN0YW5jZW9mIEFic3RyYWN0RWRpdFBhcnRWaWV3ZXIpCi0gICAgICAgICAgewotLy8gICAgICAgICAgICBBYnN0cmFjdEVkaXRQYXJ0Vmlld2VyIHZpZXdlciA9IChBYnN0cmFjdEVkaXRQYXJ0Vmlld2VyKXNvdXJjZUNvbnRleHQ7Ci0gICAgICAgICAgCi0vLyAgICAgICAgICAgIE9iamVjdCBvYmogPSB2aWV3ZXIuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKS5nZXQoMCk7Ci0gICAgICAgICAgICAKLS8vICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEVsZW1lbnREZWNsYXJhdGlvbkVkaXRQYXJ0KQotLy8gICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtID0gKChFbGVtZW50RGVjbGFyYXRpb25FZGl0UGFydClvYmopLmdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpOwotLy8gICAgICAgICAgICAgICAgaWYgKCFlbGVtLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0vLyAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgICgoRWxlbWVudERlY2xhcmF0aW9uRWRpdFBhcnQpb2JqKS5kb0VkaXROYW1lKCk7Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1vZGVsR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpCi0vLyAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gZ3JvdXAgPSAoKE1vZGVsR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpb2JqKS5nZXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpOwotLy8gICAgICAgICAgICAgICAgaWYgKCFncm91cC5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0vLyAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgICgoTW9kZWxHcm91cERlZmluaXRpb25FZGl0UGFydClvYmopLmRvRWRpdE5hbWUoKTsKLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQ29tcGxleFR5cGVEZWZpbml0aW9uRWRpdFBhcnQpCi0vLyAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0ID0gKChDb21wbGV4VHlwZURlZmluaXRpb25FZGl0UGFydClvYmopLmdldFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotLy8gICAgICAgICAgICAgICAgaWYgKGN0LmdldE5hbWUoKSAhPSBudWxsKQotLy8gICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAoKENvbXBsZXhUeXBlRGVmaW5pdGlvbkVkaXRQYXJ0KW9iaikuZG9FZGl0TmFtZSgpOwotLy8gICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUb3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0KQotLy8gICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICgoVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydClvYmopLmRvRWRpdE5hbWUoKTsKLS8vICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIH0KLQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH07Ci0gICAgRGlzcGxheS5nZXREZWZhdWx0KCkudGltZXJFeGVjKDUwLHJ1bm5hYmxlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgcmVsYXRpdmVOb2RlLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBFbGVtZW50Ci0gICAqLwotICBwdWJsaWMgTm9kZSBnZXRSZWxhdGl2ZU5vZGUoKQotICB7Ci0gICAgcmV0dXJuIHJlbGF0aXZlTm9kZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSByZWxhdGl2ZU5vZGUuCi0gICAqIEBwYXJhbSByZWxhdGl2ZU5vZGUgVGhlIHJlbGF0aXZlTm9kZSB0byBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlbGF0aXZlTm9kZShOb2RlIHJlbGF0aXZlTm9kZSkKLSAgewotICAgIHRoaXMucmVsYXRpdmVOb2RlID0gcmVsYXRpdmVOb2RlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGRlc2NyaXB0aW9uLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICB7Ci0gICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGdldFRleHQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGRlc2NyaXB0aW9uLgotICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIHRvIHNldAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7Ci0gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgYXR0cmlidXRlczsKLSAgLyoqCi0gICAqIEdldHMgdGhlIG5hbWVBdHRyaWJ1dGUuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0QXR0cmlidXRlcygpCi0gIHsKLSAgICByZXR1cm4gYXR0cmlidXRlczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGVzLgotICAgKiBAcGFyYW0gYXR0cmlidXRlcyBUaGUgYXR0cmlidXRlcyB0byBzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMoTGlzdCBhdHRyaWJ1dGVzKQotICB7Ci0gICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9ET01BdHRyaWJ1dGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvRE9NQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNGYzNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9ET01BdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi0vLyBpc3N1ZSAoY3MpIHJlbW92ZSB0aGlzCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIERPTUF0dHJpYnV0ZQotewotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIERPTUF0dHJpYnV0ZS4KLSAgICovCi0gIHB1YmxpYyBET01BdHRyaWJ1dGUoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBET01BdHRyaWJ1dGUuCi0gICAqLwotICBwdWJsaWMgRE9NQXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWUsIHZhbHVlOwotICAvKioKLSAgICogR2V0cyB0aGUgdmFsdWUuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUuCi0gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmFtZS4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgbmFtZS4KLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0lYU0RUb29sYmFyQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL0lYU0RUb29sYmFyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMTk5ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9JWFNEVG9vbGJhckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElYU0RUb29sYmFyQWN0aW9uIGV4dGVuZHMgSUFjdGlvbgotewotICBwdWJsaWMgdm9pZCBzZXRFZGl0b3JQYXJ0KElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9Nb3ZlWFNEQXR0cmlidXRlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL01vdmVYU0RBdHRyaWJ1dGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY5YTJmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL01vdmVYU0RBdHRyaWJ1dGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBNb3ZlWFNEQXR0cmlidXRlQWN0aW9uIGV4dGVuZHMgTW92ZVhTREJhc2VBY3Rpb24KLXsKLSAgcHJpdmF0ZSBzdGF0aWMgaW50IElOU0VSVF9CRUZPUkUgPSAwOwotICBwcml2YXRlIHN0YXRpYyBpbnQgSU5TRVJUX0FGVEVSID0gMTsKLSAgcHJpdmF0ZSBzdGF0aWMgaW50IElOU0VSVF9ESVJFQ1QgPSAyOwotICBwcm90ZWN0ZWQgTGlzdCBzZWxlY3RlZE5vZGVzOwotICBwcm90ZWN0ZWQgTm9kZSBwYXJlbnROb2RlOwotICBwcm90ZWN0ZWQgTm9kZSBwcmV2aW91c1JlZkNoaWxkLCBuZXh0UmVmQ2hpbGQ7Ci0gIGludCBpbnNlcnRUeXBlOwotCi0gIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudENvbXBvbmVudDsKLSAgWFNEQ29uY3JldGVDb21wb25lbnQgc2VsZWN0ZWQsIHByZXZpb3VzUmVmQ29tcG9uZW50LCBuZXh0UmVmQ29tcG9uZW50OwotICBib29sZWFuIGluc2VydEF0RW5kID0gdHJ1ZTsKLSAgCi0gIHB1YmxpYyBNb3ZlWFNEQXR0cmlidXRlQWN0aW9uKFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudENvbXBvbmVudCwgWFNEQ29uY3JldGVDb21wb25lbnQgc2VsZWN0ZWQsIFhTRENvbmNyZXRlQ29tcG9uZW50IHByZXZpb3VzUmVmQ2hpbGRDb21wb25lbnQsIFhTRENvbmNyZXRlQ29tcG9uZW50IG5leHRSZWZDaGlsZENvbXBvbmVudCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5wYXJlbnRDb21wb25lbnQgPSBwYXJlbnRDb21wb25lbnQ7Ci0gICAgdGhpcy5zZWxlY3RlZCA9IHNlbGVjdGVkOwotICAgIHRoaXMucHJldmlvdXNSZWZDb21wb25lbnQgPSBwcmV2aW91c1JlZkNoaWxkQ29tcG9uZW50OwotICAgIHRoaXMubmV4dFJlZkNvbXBvbmVudCA9IG5leHRSZWZDaGlsZENvbXBvbmVudDsKLQotICAgIGlmIChwYXJlbnRDb21wb25lbnQgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBwYXJlbnROb2RlID0gcGFyZW50Q29tcG9uZW50LmdldEVsZW1lbnQoKTsKLSAgICBuZXh0UmVmQ2hpbGQgPSBuZXh0UmVmQ2hpbGRDb21wb25lbnQgIT0gbnVsbCA/IG5leHRSZWZDaGlsZENvbXBvbmVudC5nZXRFbGVtZW50KCkgOiBudWxsOwotICAgIHByZXZpb3VzUmVmQ2hpbGQgPSBwcmV2aW91c1JlZkNoaWxkQ29tcG9uZW50ICE9IG51bGwgPyBwcmV2aW91c1JlZkNoaWxkQ29tcG9uZW50LmdldEVsZW1lbnQoKSA6IG51bGw7Ci0KLSAgICBpZiAobmV4dFJlZkNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChuZXh0UmVmQ29tcG9uZW50LmdldENvbnRhaW5lcigpLmdldENvbnRhaW5lcigpID09IHBhcmVudENvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgaW5zZXJ0VHlwZSA9IElOU0VSVF9CRUZPUkU7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChwcmV2aW91c1JlZkNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChwcmV2aW91c1JlZkNvbXBvbmVudC5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKSA9PSBwYXJlbnRDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIGluc2VydFR5cGUgPSBJTlNFUlRfQUZURVI7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChuZXh0UmVmQ2hpbGRDb21wb25lbnQgPT0gbnVsbCAmJiBwcmV2aW91c1JlZkNoaWxkQ29tcG9uZW50ID09IG51bGwpCi0gICAgewotICAgICAgaW5zZXJ0VHlwZSA9IElOU0VSVF9ESVJFQ1Q7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgTW92ZVhTREF0dHJpYnV0ZUFjdGlvbihYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnRDb21wb25lbnQsIFhTRENvbmNyZXRlQ29tcG9uZW50IHNlbGVjdGVkLCBYU0RDb25jcmV0ZUNvbXBvbmVudCBwcmV2aW91c1JlZkNoaWxkQ29tcG9uZW50LCBYU0RDb25jcmV0ZUNvbXBvbmVudCBuZXh0UmVmQ2hpbGRDb21wb25lbnQsIGJvb2xlYW4gaW5zZXJ0QXRFbmQpCi0gIHsKLSAgICB0aGlzKHBhcmVudENvbXBvbmVudCwgc2VsZWN0ZWQsIHByZXZpb3VzUmVmQ2hpbGRDb21wb25lbnQsIG5leHRSZWZDaGlsZENvbXBvbmVudCk7Ci0gICAgdGhpcy5pbnNlcnRBdEVuZCA9IGluc2VydEF0RW5kOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBjYW5Nb3ZlKCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgIAotICAgIGlmIChuZXh0UmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uIHx8IHByZXZpb3VzUmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uIHx8IHBhcmVudENvbXBvbmVudCA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgSUFjdGlvbiNydW4oKQotICAgKi8KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGlmIChwYXJlbnRDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgbW92ZVVuZGVyWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIHBhcmVudENvbXBvbmVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcmVudENvbXBvbmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBtb3ZlVW5kZXJYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgcGFyZW50Q29tcG9uZW50KTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBtb3ZlVW5kZXJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIHBhcmVudEdyb3VwKQotICB7Ci0gICAgaW50IG9yaWdpbmFsSW5kZXggPSAwOwotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwYXJlbnRHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IGF0dHJpYnV0ZUdyb3VwQ29udGVudCA9IChYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGlmIChhdHRyaWJ1dGVHcm91cENvbnRlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSA9ICgoWFNEQXR0cmlidXRlVXNlKSBhdHRyaWJ1dGVHcm91cENvbnRlbnQpLmdldENvbnRlbnQoKTsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBzZWxlY3RlZCkKLSAgICAgICAgewotICAgICAgICAgIHBhcmVudEdyb3VwLmdldENvbnRlbnRzKCkucmVtb3ZlKGF0dHJpYnV0ZS5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG9yaWdpbmFsSW5kZXgrKzsKLSAgICB9Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICBib29sZWFuIGFkZGVkQmFjayA9IGZhbHNlOwotICAgIGlmIChpbnNlcnRUeXBlID09IElOU0VSVF9ESVJFQ1QpCi0gICAgewotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29udGFpbmVyID0gc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChpbnNlcnRBdEVuZCkKLSAgICAgICAgICAoKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgcGFyZW50Q29tcG9uZW50KS5nZXRSZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpLmdldENvbnRlbnRzKCkuYWRkKGNvbnRhaW5lcik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAoKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgcGFyZW50Q29tcG9uZW50KS5nZXRSZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpLmdldENvbnRlbnRzKCkuYWRkKDAsIGNvbnRhaW5lcik7Ci0gICAgICAgIGFkZGVkQmFjayA9IHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTGlzdCBhdHRyaWJ1dGVHcm91cENvbnRlbnRzID0gcGFyZW50R3JvdXAuZ2V0Q29udGVudHMoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXR0cmlidXRlR3JvdXBDb250ZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCBhdHRyaWJ1dGVHcm91cENvbnRlbnQgPSAoWFNEQXR0cmlidXRlR3JvdXBDb250ZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBpZiAoYXR0cmlidXRlR3JvdXBDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGUgPSAoKFhTREF0dHJpYnV0ZVVzZSkgYXR0cmlidXRlR3JvdXBDb250ZW50KS5nZXRDb250ZW50KCk7Ci0gICAgICAgIGlmIChpbnNlcnRUeXBlID09IElOU0VSVF9CRUZPUkUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYXR0cmlidXRlID09IG5leHRSZWZDb21wb25lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcGFyZW50R3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoaW5kZXgsIHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgICAgIGFkZGVkQmFjayA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHNlbGVjdGVkID09IG5leHRSZWZDb21wb25lbnQgJiYgb3JpZ2luYWxJbmRleCA9PSBpbmRleCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwYXJlbnRHcm91cC5nZXRDb250ZW50cygpLmFkZChpbmRleCwgc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgICAgICAgYWRkZWRCYWNrID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpbnNlcnRUeXBlID09IElOU0VSVF9BRlRFUikKLSAgICAgICAgewotICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT0gcHJldmlvdXNSZWZDb21wb25lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcGFyZW50R3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoaW5kZXggKyAxLCBzZWxlY3RlZC5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgICAgICBhZGRlZEJhY2sgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChzZWxlY3RlZCA9PSBwcmV2aW91c1JlZkNvbXBvbmVudCAmJiBvcmlnaW5hbEluZGV4ID09IGluZGV4KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBhcmVudEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGluZGV4LCBzZWxlY3RlZC5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgICAgICBhZGRlZEJhY2sgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbmRleCsrOwotICAgIH0KLSAgICBpZiAoYXR0cmlidXRlR3JvdXBDb250ZW50cy5zaXplKCkgPT0gMCkKLSAgICB7Ci0gICAgICBwYXJlbnRHcm91cC5nZXRDb250ZW50cygpLmFkZChzZWxlY3RlZC5nZXRDb250YWluZXIoKSk7Ci0gICAgICBhZGRlZEJhY2sgPSB0cnVlOwotICAgIH0KLQotICAgIGlmICghYWRkZWRCYWNrKQotICAgIHsKLSAgICAgIHBhcmVudEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKG9yaWdpbmFsSW5kZXgsIHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBtb3ZlVW5kZXJYU0RDb21wbGV4VHlwZURlZmluaXRpb24oWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlKQotICB7Ci0gICAgaW50IG9yaWdpbmFsSW5kZXggPSAwOwotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb21wbGV4VHlwZS5nZXRBdHRyaWJ1dGVDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IGF0dHJpYnV0ZUdyb3VwQ29udGVudCA9IChYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGlmIChhdHRyaWJ1dGVHcm91cENvbnRlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSA9ICgoWFNEQXR0cmlidXRlVXNlKSBhdHRyaWJ1dGVHcm91cENvbnRlbnQpLmdldENvbnRlbnQoKTsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBzZWxlY3RlZCkKLSAgICAgICAgewotICAgICAgICAgIGNvbXBsZXhUeXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkucmVtb3ZlKGF0dHJpYnV0ZS5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG9yaWdpbmFsSW5kZXgrKzsKLSAgICB9Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICBib29sZWFuIGFkZGVkQmFjayA9IGZhbHNlOwotICAgIExpc3QgYXR0cmlidXRlR3JvdXBDb250ZW50cyA9IGNvbXBsZXhUeXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGF0dHJpYnV0ZUdyb3VwQ29udGVudHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQgYXR0cmlidXRlR3JvdXBDb250ZW50ID0gKFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgaWYgKGF0dHJpYnV0ZUdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlID0gKChYU0RBdHRyaWJ1dGVVc2UpIGF0dHJpYnV0ZUdyb3VwQ29udGVudCkuZ2V0Q29udGVudCgpOwotICAgICAgICBpZiAoaW5zZXJ0VHlwZSA9PSBJTlNFUlRfQUZURVIpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYXR0cmlidXRlID09IHByZXZpb3VzUmVmQ29tcG9uZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbXBsZXhUeXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuYWRkKGluZGV4ICsgMSwgc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgICAgICAgYWRkZWRCYWNrID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpbnNlcnRUeXBlID09IElOU0VSVF9CRUZPUkUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYXR0cmlidXRlID09IG5leHRSZWZDb21wb25lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgY29tcGxleFR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5hZGQoaW5kZXgsIHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgICAgIGFkZGVkQmFjayA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGluZGV4Kys7Ci0gICAgfQotICAgIGlmIChhdHRyaWJ1dGVHcm91cENvbnRlbnRzLnNpemUoKSA9PSAwKQotICAgIHsKLSAgICAgIGNvbXBsZXhUeXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuYWRkKHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICAgIGFkZGVkQmFjayA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKCFhZGRlZEJhY2spCi0gICAgewotICAgICAgY29tcGxleFR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5hZGQob3JpZ2luYWxJbmRleCwgc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCkpOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL01vdmVYU0RCYXNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL01vdmVYU0RCYXNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZDk5MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9Nb3ZlWFNEQmFzZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgTW92ZVhTREJhc2VBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLQotICBwdWJsaWMgTW92ZVhTREJhc2VBY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGNhbk1vdmUoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9Nb3ZlWFNERWxlbWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWN0aW9ucy9Nb3ZlWFNERWxlbWVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTczZmY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvTW92ZVhTREVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIE1vdmVYU0RFbGVtZW50QWN0aW9uIGV4dGVuZHMgTW92ZVhTREJhc2VBY3Rpb24KLXsKLSAgcHJpdmF0ZSBzdGF0aWMgaW50IElOU0VSVF9CRUZPUkUgPSAwOwotICBwcml2YXRlIHN0YXRpYyBpbnQgSU5TRVJUX0FGVEVSID0gMTsKLSAgcHJpdmF0ZSBzdGF0aWMgaW50IElOU0VSVF9ESVJFQ1QgPSAyOwotICBwcm90ZWN0ZWQgTGlzdCBzZWxlY3RlZE5vZGVzOwotICBwcm90ZWN0ZWQgTm9kZSBwYXJlbnROb2RlOwotICBwcm90ZWN0ZWQgTm9kZSBwcmV2aW91c1JlZkNoaWxkLCBuZXh0UmVmQ2hpbGQ7Ci0gIGludCBpbnNlcnRUeXBlOwotCi0gIFhTRE1vZGVsR3JvdXAgcGFyZW50TW9kZWxHcm91cDsKLSAgWFNEQ29uY3JldGVDb21wb25lbnQgc2VsZWN0ZWQsIHByZXZpb3VzUmVmQ29tcG9uZW50LCBuZXh0UmVmQ29tcG9uZW50OwotICBib29sZWFuIGluc2VydEF0RW5kID0gdHJ1ZTsKLQotICBwdWJsaWMgTW92ZVhTREVsZW1lbnRBY3Rpb24oWFNETW9kZWxHcm91cCBwYXJlbnRDb21wb25lbnQsIFhTRENvbmNyZXRlQ29tcG9uZW50IHNlbGVjdGVkLCBYU0RDb25jcmV0ZUNvbXBvbmVudCBwcmV2aW91c1JlZkNoaWxkQ29tcG9uZW50LCBYU0RDb25jcmV0ZUNvbXBvbmVudCBuZXh0UmVmQ2hpbGRDb21wb25lbnQpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMucGFyZW50TW9kZWxHcm91cCA9IHBhcmVudENvbXBvbmVudDsKLSAgICB0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWQ7Ci0gICAgdGhpcy5wcmV2aW91c1JlZkNvbXBvbmVudCA9IHByZXZpb3VzUmVmQ2hpbGRDb21wb25lbnQ7Ci0gICAgdGhpcy5uZXh0UmVmQ29tcG9uZW50ID0gbmV4dFJlZkNoaWxkQ29tcG9uZW50OwotCi0gICAgaWYgKHBhcmVudENvbXBvbmVudCA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIHBhcmVudE5vZGUgPSBwYXJlbnRDb21wb25lbnQuZ2V0RWxlbWVudCgpOwotICAgIG5leHRSZWZDaGlsZCA9IG5leHRSZWZDaGlsZENvbXBvbmVudCAhPSBudWxsID8gbmV4dFJlZkNoaWxkQ29tcG9uZW50LmdldEVsZW1lbnQoKSA6IG51bGw7Ci0gICAgcHJldmlvdXNSZWZDaGlsZCA9IHByZXZpb3VzUmVmQ2hpbGRDb21wb25lbnQgIT0gbnVsbCA/IHByZXZpb3VzUmVmQ2hpbGRDb21wb25lbnQuZ2V0RWxlbWVudCgpIDogbnVsbDsKLQotICAgIGlmIChuZXh0UmVmQ29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKG5leHRSZWZDb21wb25lbnQuZ2V0Q29udGFpbmVyKCkuZ2V0Q29udGFpbmVyKCkgPT0gcGFyZW50TW9kZWxHcm91cCkKLSAgICAgIHsKLSAgICAgICAgaW5zZXJ0VHlwZSA9IElOU0VSVF9CRUZPUkU7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChwcmV2aW91c1JlZkNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChwcmV2aW91c1JlZkNvbXBvbmVudC5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKSA9PSBwYXJlbnRNb2RlbEdyb3VwKQotICAgICAgewotICAgICAgICBpbnNlcnRUeXBlID0gSU5TRVJUX0FGVEVSOwotICAgICAgfQotICAgIH0KLSAgICBpZiAobmV4dFJlZkNoaWxkQ29tcG9uZW50ID09IG51bGwgJiYgcHJldmlvdXNSZWZDaGlsZENvbXBvbmVudCA9PSBudWxsKQotICAgIHsKLSAgICAgIGluc2VydFR5cGUgPSBJTlNFUlRfRElSRUNUOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBNb3ZlWFNERWxlbWVudEFjdGlvbihYU0RNb2RlbEdyb3VwIHBhcmVudENvbXBvbmVudCwgWFNEQ29uY3JldGVDb21wb25lbnQgc2VsZWN0ZWQsIFhTRENvbmNyZXRlQ29tcG9uZW50IHByZXZpb3VzUmVmQ2hpbGRDb21wb25lbnQsIFhTRENvbmNyZXRlQ29tcG9uZW50IG5leHRSZWZDaGlsZENvbXBvbmVudCwgYm9vbGVhbiBpbnNlcnRBdEVuZCkKLSAgewotICAgIHRoaXMocGFyZW50Q29tcG9uZW50LCBzZWxlY3RlZCwgcHJldmlvdXNSZWZDaGlsZENvbXBvbmVudCwgbmV4dFJlZkNoaWxkQ29tcG9uZW50KTsKLSAgICB0aGlzLmluc2VydEF0RW5kID0gaW5zZXJ0QXRFbmQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGNhbk1vdmUoKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgCi0gICAgaWYgKG5leHRSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB8fCBwcmV2aW91c1JlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHx8IHBhcmVudE1vZGVsR3JvdXAgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKgotICAgKiBAc2VlIElBY3Rpb24jcnVuKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBpbnQgb3JpZ2luYWxJbmRleCA9IDA7Ci0gICAgZm9yIChJdGVyYXRvciBwYXJ0aWNsZXMgPSBwYXJlbnRNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgcGFydGljbGVzLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSAoWFNEUGFydGljbGUpIHBhcnRpY2xlcy5uZXh0KCk7Ci0gICAgICBYU0RQYXJ0aWNsZUNvbnRlbnQgcGFydGljbGVDb250ZW50ID0gcGFydGljbGUuZ2V0Q29udGVudCgpOwotICAgICAgaWYgKHBhcnRpY2xlQ29udGVudCA9PSBzZWxlY3RlZCkKLSAgICAgIHsKLSAgICAgICAgcGFyZW50TW9kZWxHcm91cC5nZXRDb250ZW50cygpLnJlbW92ZShwYXJ0aWNsZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgb3JpZ2luYWxJbmRleCsrOwotICAgIH0KLSAgICBpbnQgaW5kZXggPSAwOwotICAgIGJvb2xlYW4gYWRkZWRCYWNrID0gZmFsc2U7Ci0gICAgaWYgKGluc2VydFR5cGUgPT0gSU5TRVJUX0RJUkVDVCkKLSAgICB7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb250YWluZXIgPSBzZWxlY3RlZC5nZXRDb250YWluZXIoKTsKLSAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29udGFpbmVyMiA9IGNvbnRhaW5lci5nZXRDb250YWluZXIoKTsKLSAgICAgICAgaWYgKGNvbnRhaW5lcjIgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgICB7Ci0gICAgICAgICAgKChYU0RNb2RlbEdyb3VwKSBjb250YWluZXIyKS5nZXRDb250ZW50cygpLnJlbW92ZShjb250YWluZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnNlcnRBdEVuZCkKLSAgICAgICAgICBwYXJlbnRNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGNvbnRhaW5lcik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBwYXJlbnRNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKDAsIGNvbnRhaW5lcik7Ci0gICAgICAgIGFkZGVkQmFjayA9IHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTGlzdCBwYXJ0aWNsZXMgPSBwYXJlbnRNb2RlbEdyb3VwLmdldENvbnRlbnRzKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBhcnRpY2xlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBYU0RQYXJ0aWNsZUNvbnRlbnQgcGFydGljbGVDb250ZW50ID0gcGFydGljbGUuZ2V0Q29udGVudCgpOwotICAgICAgaWYgKGluc2VydFR5cGUgPT0gSU5TRVJUX0JFRk9SRSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHBhcnRpY2xlQ29udGVudCA9PSBuZXh0UmVmQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgcGFyZW50TW9kZWxHcm91cC5nZXRDb250ZW50cygpLmFkZChpbmRleCwgc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgICAgIGFkZGVkQmFjayA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlbGVjdGVkID09IG5leHRSZWZDb21wb25lbnQgJiYgb3JpZ2luYWxJbmRleCA9PSBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgIHBhcmVudE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoaW5kZXgsIHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgICBhZGRlZEJhY2sgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnNlcnRUeXBlID09IElOU0VSVF9BRlRFUikKLSAgICAgIHsKLSAgICAgICAgaWYgKHBhcnRpY2xlQ29udGVudCA9PSBwcmV2aW91c1JlZkNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgIHBhcmVudE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoaW5kZXggKyAxLCBzZWxlY3RlZC5nZXRDb250YWluZXIoKSk7Ci0gICAgICAgICAgYWRkZWRCYWNrID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VsZWN0ZWQgPT0gcHJldmlvdXNSZWZDb21wb25lbnQgJiYgb3JpZ2luYWxJbmRleCA9PSBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgIHBhcmVudE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoaW5kZXgsIHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgICBhZGRlZEJhY2sgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbmRleCsrOwotICAgIH0KLSAgICBpZiAocGFydGljbGVzLnNpemUoKSA9PSAwKQotICAgIHsKLSAgICAgIHBhcmVudE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoc2VsZWN0ZWQuZ2V0Q29udGFpbmVyKCkpOwotICAgICAgYWRkZWRCYWNrID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoIWFkZGVkQmFjaykKLSAgICB7Ci0gICAgICBwYXJlbnRNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKG9yaWdpbmFsSW5kZXgsIHNlbGVjdGVkLmdldENvbnRhaW5lcigpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvWFNERWRpdE5hbWVzcGFjZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FjdGlvbnMvWFNERWRpdE5hbWVzcGFjZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmZjJlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hY3Rpb25zL1hTREVkaXROYW1lc3BhY2VzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VJbmZvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5SZXBsYWNlUHJlZml4QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5YTUxDb21tb25SZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwubnNlZGl0LlNjaGVtYVByZWZpeENoYW5nZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uc2VkaXQuVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpZGdldHMuWFNERWRpdFNjaGVtYUluZm9EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBYU0RFZGl0TmFtZXNwYWNlc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbjsKLQlwcml2YXRlIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0gICAgcHJpdmF0ZSBET01OYW1lc3BhY2VJbmZvTWFuYWdlciBuYW1lc3BhY2VJbmZvTWFuYWdlciA9IG5ldyBET01OYW1lc3BhY2VJbmZvTWFuYWdlcigpOwotCQotCXB1YmxpYyBYU0RFZGl0TmFtZXNwYWNlc0FjdGlvbihTdHJpbmcgbGFiZWwsIEVsZW1lbnQgZWxlbWVudCwgTm9kZSBub2RlKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRleHQobGFiZWwpOwotCQkKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vIFRoaXMgbmVlZHMgdG8gYmUgY2hhbmdlZC4uLi4KLQkJdGhpcy5yZXNvdXJjZUxvY2F0aW9uID0gImR1bW15IjsJCQotCX0KLQkKLQlwdWJsaWMgWFNERWRpdE5hbWVzcGFjZXNBY3Rpb24oU3RyaW5nIGxhYmVsLCBFbGVtZW50IGVsZW1lbnQsIE5vZGUgbm9kZSwgWFNEU2NoZW1hIHNjaGVtYSkgewotCQl0aGlzIChsYWJlbCwgZWxlbWVudCwgbm9kZSk7Ci0JCXhzZFNjaGVtYSA9IHNjaGVtYTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZWxlbWVudCAhPSBudWxsKQotCQl7ICAgCi0JCSAgICAgIFNoZWxsIHNoZWxsID0gWE1MQ29tbW9uUmVzb3VyY2VzLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IG51bGw7Ci0JCSAgICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkgewotCQkgICAgICAJdGFyZ2V0TmFtZXNwYWNlID0geHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotCQkgICAgICB9Ci0JCSAgICAgIFhTREVkaXRTY2hlbWFJbmZvRGlhbG9nIGRpYWxvZyA9IG5ldyBYU0RFZGl0U2NoZW1hSW5mb0RpYWxvZyhzaGVsbCwgbmV3IFBhdGgocmVzb3VyY2VMb2NhdGlvbiksIHRhcmdldE5hbWVzcGFjZSk7IAotCi0JCSAgICAgIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QgPSBuYW1lc3BhY2VJbmZvTWFuYWdlci5nZXROYW1lc3BhY2VJbmZvTGlzdChlbGVtZW50KTsKLQkJICAgICAgTGlzdCBvbGROYW1lc3BhY2VJbmZvTGlzdCA9IE5hbWVzcGFjZUluZm8uY2xvbmVOYW1lc3BhY2VJbmZvTGlzdChuYW1lc3BhY2VJbmZvTGlzdCk7Ci0KLQkJICAgICAgLy8gaGVyZSB3ZSBzdG9yZSBhIGNvcHkgb2YgdGhlIG9sZCBpbmZvIGZvciBlYWNoIE5hbWVzcGFjZUluZm8KLQkJICAgICAgLy8gdGhpcyBpbmZvIHdpbGwgYmUgdXNlZCBpbiBjcmVhdGVQcmVmaXhNYXBwaW5nKCkgdG8gZmlndXJlIG91dCBob3cgdG8gdXBkYXRlIHRoZSBkb2N1bWVudCAKLQkJICAgICAgLy8gaW4gcmVzcG9uc2UgdG8gdGhlc2UgY2hhbmdlcwotCQkgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuYW1lc3BhY2VJbmZvTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCQkgICAgICB7Ci0JCSAgICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8paS5uZXh0KCk7Ci0JCSAgICAgICAgTmFtZXNwYWNlSW5mbyBvbGRDb3B5ID0gbmV3IE5hbWVzcGFjZUluZm8oaW5mbyk7Ci0JCSAgICAgICAgaW5mby5zZXRQcm9wZXJ0eSgib2xkQ29weSIsIG9sZENvcHkpOyAvLyROT04tTkxTLTEkCi0JCSAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBTdHJpbmcgY3VycmVudEVsZW1lbnRGb3JtUXVhbGlmaWVkID0gIiI7Ci0gICAgICAgICAgU3RyaW5nIGN1cnJlbnRBdHRyaWJ1dGVGb3JtUXVhbGlmaWVkID0gIiI7Ci0gICAgICAgICAgCi0gICAgICAgICAgYm9vbGVhbiBoYXNFbGVtZW50Rm9ybSA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5FTEVNRU5URk9STURFRkFVTFRfQVRUUklCVVRFKTsKLSAgICAgICAgICBpZiAoaGFzRWxlbWVudEZvcm0pIGN1cnJlbnRFbGVtZW50Rm9ybVF1YWxpZmllZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5FTEVNRU5URk9STURFRkFVTFRfQVRUUklCVVRFKTsKLSAgICAgICAgICAKLSAgICAgICAgICBib29sZWFuIGhhc0F0dHJpYnV0ZUZvcm0gPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuQVRUUklCVVRFRk9STURFRkFVTFRfQVRUUklCVVRFKTsKLSAgICAgICAgICBpZiAoaGFzQXR0cmlidXRlRm9ybSkgY3VycmVudEF0dHJpYnV0ZUZvcm1RdWFsaWZpZWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuQVRUUklCVVRFRk9STURFRkFVTFRfQVRUUklCVVRFKTsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCSAgICAgIGRpYWxvZy5zZXROYW1lc3BhY2VJbmZvTGlzdChuYW1lc3BhY2VJbmZvTGlzdCk7ICAgCi0JCSAgICAgIGRpYWxvZy5jcmVhdGUoKTsgICAgICAKLQkJICAgICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSg1MDAsIDQwMCk7Ci0JCSAgICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoWE1MQ29tbW9uUmVzb3VyY2VzLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJfVUlfTUVOVV9FRElUX1NDSEVNQV9JTkZPUk1BVElPTl9USVRMRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGRpYWxvZy5zZXRJc0VsZW1lbnRRdWFsaWZpZWQoY3VycmVudEVsZW1lbnRGb3JtUXVhbGlmaWVkKTsKLSAgICAgICAgICBkaWFsb2cuc2V0SXNBdHRyaWJ1dGVRdWFsaWZpZWQoY3VycmVudEF0dHJpYnV0ZUZvcm1RdWFsaWZpZWQpOwotCQkgICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCSAgICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgICAgICAgU3RyaW5nIHhzZFByZWZpeCA9ICIiOyAgICAgLy8kTk9OLU5MUy0xJAotCi0JCSAgICAgIGlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykKLQkJICAgICAgewotICAgICAgICAgICAgRWxlbWVudCB4c2RTY2hlbWFFbGVtZW50ID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAgIERvY3VtZW50SW1wbCBkb2MgPSAoRG9jdW1lbnRJbXBsKSB4c2RTY2hlbWFFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTGlzdCBuZXdJbmZvTGlzdCA9IGRpYWxvZy5nZXROYW1lc3BhY2VJbmZvTGlzdCgpOwotCi0JCSAgICAgICAgLy8gc2VlIGlmIHdlIG5lZWQgdG8gcmVuYW1lIGFueSBwcmVmaXhlcwotCQkgICAgICAgIE1hcCBwcmVmaXhNYXBwaW5nID0gY3JlYXRlUHJlZml4TWFwcGluZyhvbGROYW1lc3BhY2VJbmZvTGlzdCwgbmFtZXNwYWNlSW5mb0xpc3QpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBNYXAgbWFwMiA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG5ld0luZm9MaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE5hbWVzcGFjZUluZm8gbmkgPSAoTmFtZXNwYWNlSW5mbylpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgU3RyaW5nIHByZWYgPSBuaS5wcmVmaXg7Ci0gICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBuaS51cmk7Ci0gICAgICAgICAgICAgIGlmIChwcmVmID09IG51bGwpIHByZWYgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICBpZiAodXJpID09IG51bGwpIHVyaSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGlmIChYU0RDb25zdGFudHMuaXNTY2hlbWFGb3JTY2hlbWFOYW1lc3BhY2UodXJpKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhzZFByZWZpeCA9IHByZWY7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgbWFwMi5wdXQocHJlZiwgdXJpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgCi0JCSAgICAgICAgaWYgKG1hcDIuc2l6ZSgpID4gMCkKLQkJICAgICAgICB7Ci0JCSAgICAgICAgCXRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZG9jLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX05BTUVTUEFDRV9DSEFOR0UiKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoeHNkUHJlZml4ICE9IG51bGwgJiYgeHNkUHJlZml4Lmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeHNkU2NoZW1hLnNldFNjaGVtYUZvclNjaGVtYVFOYW1lUHJlZml4KG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeHNkU2NoZW1hLnNldFNjaGVtYUZvclNjaGVtYVFOYW1lUHJlZml4KHhzZFByZWZpeCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgeHNkU2NoZW1hLnNldFRhcmdldE5hbWVzcGFjZShkaWFsb2cuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgIHhzZFNjaGVtYS51cGRhdGUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTY2hlbWFQcmVmaXhDaGFuZ2VIYW5kbGVyIHNwY2ggPSBuZXcgU2NoZW1hUHJlZml4Q2hhbmdlSGFuZGxlcih4c2RTY2hlbWEsIHhzZFByZWZpeCk7Ci0gICAgICAgICAgICAgICAgc3BjaC5yZXNvbHZlKCk7Ci0gICAgICAgICAgICAgICAgeHNkU2NoZW1hLnVwZGF0ZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHhzZFNjaGVtYS5zZXRJbmNyZW1lbnRhbFVwZGF0ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlSW5mb01hbmFnZXIucmVtb3ZlTmFtZXNwYWNlSW5mbyhlbGVtZW50KTsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VJbmZvTWFuYWdlci5hZGROYW1lc3BhY2VJbmZvKGVsZW1lbnQsIG5ld0luZm9MaXN0LCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgeHNkU2NoZW1hLnNldEluY3JlbWVudGFsVXBkYXRlKHRydWUpOwotCi0gICAgICAgICAgICAgICAgLy8gZG9uJ3QgbmVlZCB0aGVzZSBhbnkgbW9yZT8KLQkJCSAgICAgICAgICBSZXBsYWNlUHJlZml4QWN0aW9uIHJlcGxhY2VQcmVmaXhBY3Rpb24gPSBuZXcgUmVwbGFjZVByZWZpeEFjdGlvbihudWxsLCBlbGVtZW50LCBwcmVmaXhNYXBwaW5nKTsKLQkJCSAgICAgICAgICByZXBsYWNlUHJlZml4QWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIgdGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlciA9IG5ldyBUYXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyKHhzZFNjaGVtYSwgdGFyZ2V0TmFtZXNwYWNlLCBkaWFsb2cuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIucmVzb2x2ZSgpOwotCQkJCSAgICAJfQotICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgIHsgCi0vLyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhzZFNjaGVtYS51cGRhdGUoKTsKLSAgICAgICAgICAgICAgICBkb2MuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JCQkgICAgIAkJfQotCQkgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZUZvcm1RdWFsaWZpZWQgPSBkaWFsb2cuZ2V0QXR0cmlidXRlRm9ybVF1YWxpZmllZCgpOwotICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnRGb3JtUXVhbGlmaWVkID0gZGlhbG9nLmdldEVsZW1lbnRGb3JtUXVhbGlmaWVkKCk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gZWxlbWVudEZvcm1DaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJvb2xlYW4gYXR0cmlidXRlRm9ybUNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgaWYgKGVsZW1lbnRGb3JtUXVhbGlmaWVkLmVxdWFscyhjdXJyZW50RWxlbWVudEZvcm1RdWFsaWZpZWQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlbGVtZW50Rm9ybUNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVGb3JtUXVhbGlmaWVkLmVxdWFscyhjdXJyZW50QXR0cmlidXRlRm9ybVF1YWxpZmllZCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGF0dHJpYnV0ZUZvcm1DaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZWxlbWVudEZvcm1DaGFuZ2VkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBkb2MuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfU0NIRU1BX0VMRU1FTlRGT1JNREVGQVVMVF9DSEFOR0UiKSk7Ci0gICAgICAgICAgICAgIGlmIChlbGVtZW50Rm9ybVF1YWxpZmllZC5lcXVhbHMoWFNERm9ybS5RVUFMSUZJRURfTElURVJBTC5nZXROYW1lKCkpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeHNkU2NoZW1hLnNldEVsZW1lbnRGb3JtRGVmYXVsdChYU0RGb3JtLlFVQUxJRklFRF9MSVRFUkFMKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50Rm9ybVF1YWxpZmllZC5lcXVhbHMoWFNERm9ybS5VTlFVQUxJRklFRF9MSVRFUkFMLmdldE5hbWUoKSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4c2RTY2hlbWEuc2V0RWxlbWVudEZvcm1EZWZhdWx0KFhTREZvcm0uVU5RVUFMSUZJRURfTElURVJBTCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gTW9kZWwgc2hvdWxkIGFsbG93IHVzIHRvIHJlbW92ZSB0aGUgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgeHNkU2NoZW1hLmdldEVsZW1lbnQoKS5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkVMRU1FTlRGT1JNREVGQVVMVF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVGb3JtQ2hhbmdlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZG9jLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1NDSEVNQV9BVFRSSUJVVEVGT1JNREVGQVVMVF9DSEFOR0UiKSk7Ci0gICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVGb3JtUXVhbGlmaWVkLmVxdWFscyhYU0RGb3JtLlFVQUxJRklFRF9MSVRFUkFMLmdldE5hbWUoKSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4c2RTY2hlbWEuc2V0QXR0cmlidXRlRm9ybURlZmF1bHQoWFNERm9ybS5RVUFMSUZJRURfTElURVJBTCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAoYXR0cmlidXRlRm9ybVF1YWxpZmllZC5lcXVhbHMoWFNERm9ybS5VTlFVQUxJRklFRF9MSVRFUkFMLmdldE5hbWUoKSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4c2RTY2hlbWEuc2V0QXR0cmlidXRlRm9ybURlZmF1bHQoWFNERm9ybS5VTlFVQUxJRklFRF9MSVRFUkFMKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBNb2RlbCBzaG91bGQgYWxsb3cgdXMgdG8gcmVtb3ZlIHRoZSBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpLnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuQVRUUklCVVRFRk9STURFRkFVTFRfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgZG9jLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotICAgICAgICAgICAgfQotCQkgICB9ICAgICAgCi0gICAgICAgICAgCi0JCX0KLQl9Ci0JCi0JIHByb3RlY3RlZCBNYXAgY3JlYXRlUHJlZml4TWFwcGluZyhMaXN0IG9sZExpc3QsIExpc3QgbmV3TGlzdCkKLQkgIHsgICAgICAgICAgCi0JICAgIE1hcCBtYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkgICAgSGFzaHRhYmxlIG9sZFVSSVRvUHJlZml4VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JICAgIGZvciAoSXRlcmF0b3IgaSA9IG9sZExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLQkgICAgeyAgICAKLQkgICAgICBOYW1lc3BhY2VJbmZvIG9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsgICAgICAgICAgICAgICAgICAgIAotCSAgICAgIG9sZFVSSVRvUHJlZml4VGFibGUucHV0KG9sZEluZm8udXJpLCBvbGRJbmZvKTsKLQkgICAgfQotCSAgICAKLQkgICAgZm9yIChJdGVyYXRvciBpID0gbmV3TGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCSAgICB7Ci0JICAgICAgTmFtZXNwYWNlSW5mbyBuZXdJbmZvID0gKE5hbWVzcGFjZUluZm8paS5uZXh0KCk7Ci0JICAgICAgTmFtZXNwYWNlSW5mbyBvbGRJbmZvID0gKE5hbWVzcGFjZUluZm8pb2xkVVJJVG9QcmVmaXhUYWJsZS5nZXQobmV3SW5mby51cmkgIT0gbnVsbCA/IG5ld0luZm8udXJpIDogIiIpOyAgLy8kTk9OLU5MUy0xJAotCi0KLQkgICAgICAvLyBpZiBvbGRJbmZvIGlzIG5vbiBudWxsIC4uLiB0aGVyZSdzIGEgbWF0Y2hpbmcgVVJJIGluIHRoZSBvbGQgc2V0Ci0JICAgICAgLy8gd2UgY2FuIHVzZSBpdHMgcHJlZml4IHRvIGRldGVtaW5lIG91dCBtYXBwaW5nCi0JICAgICAgLy8KLQkgICAgICAvLyBpZiBvbGRJbmZvIGlzIG51bGwgLi4uICB3ZSB1c2UgdGhlICdvbGRDb3B5JyB3ZSBzdGFzaGVkIGF3YXkgCi0JICAgICAgLy8gYXNzdW1pbmcgdGhhdCB0aGUgdXNlciBjaGFuZ2VkIHRoZSBVUkkgYW5kIHRoZSBwcmVmaXgKLQkgICAgICBpZiAob2xkSW5mbyA9PSBudWxsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICAgICAgewotCSAgICAgICAgb2xkSW5mbyA9IChOYW1lc3BhY2VJbmZvKW5ld0luZm8uZ2V0UHJvcGVydHkoIm9sZENvcHkiKTsgICAgICAgICAgICAvLyROT04tTkxTLTEkCi0JICAgICAgfSAKLQotCSAgICAgIGlmIChvbGRJbmZvICE9IG51bGwpCi0JICAgICAgewotCSAgICAgICAgU3RyaW5nIG5ld1ByZWZpeCA9IG5ld0luZm8ucHJlZml4ICE9IG51bGwgPyBuZXdJbmZvLnByZWZpeCA6ICIiOyAvLyROT04tTkxTLTEkCi0JICAgICAgICBTdHJpbmcgb2xkUHJlZml4ID0gb2xkSW5mby5wcmVmaXggIT0gbnVsbCA/IG9sZEluZm8ucHJlZml4IDogIiI7IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgIGlmICghb2xkUHJlZml4LmVxdWFscyhuZXdQcmVmaXgpKQotCSAgICAgICAgewotCSAgICAgICAgICBtYXAucHV0KG9sZFByZWZpeCwgbmV3UHJlZml4KTsgICAgCi0JICAgICAgICB9Ci0JICAgICAgfSAgICAgIAotCSAgICB9ICAgICAgICAKLQkgICAgcmV0dXJuIG1hcDsKLQkgIH0KLSAgIAotLy8gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUFsbE5vZGVzKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHByZWZpeCkKLS8vICAgIHsKLS8vICAgICAgZWxlbWVudC5zZXRQcmVmaXgocHJlZml4KTsKLS8vICAgICAgTm9kZUxpc3QgbGlzdCA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotLy8gICAgICBpZiAobGlzdCAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIE5vZGUgY2hpbGQgPSBsaXN0Lml0ZW0oaSk7Ci0vLyAgICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIGNoaWxkLnNldFByZWZpeChwcmVmaXgpOwotLy8gICAgICAgICAgICBpZiAoY2hpbGQuaGFzQ2hpbGROb2RlcygpKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgdXBkYXRlQWxsTm9kZXMoKEVsZW1lbnQpY2hpbGQsIHByZWZpeCk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgIH0gICAKLS8vICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvQ2F0ZWdvcnlBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9DYXRlZ29yeUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiNGY0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9DYXRlZ29yeUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSU1vZGVsUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEU2NoZW1hRGlyZWN0aXZlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcnlBZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBJTW9kZWxQcm94eSwgSUFjdGlvblByb3ZpZGVyLCBJQURUT2JqZWN0TGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyB0ZXh0OwotICBwcm90ZWN0ZWQgSW1hZ2UgaW1hZ2U7Ci0gIHByb3RlY3RlZCBPYmplY3QgcGFyZW50OwotICBwcm90ZWN0ZWQgaW50IGdyb3VwVHlwZTsKLSAgQ29sbGVjdGlvbiBjaGlsZHJlbiwgYWxsQ2hpbGRyZW47ICAvLyBjaGlsZHJlbiBmcm9tIGN1cnJlbnQgc2NoZW1hLCBjaGlsZHJlbiBmcm9tIGN1cnJlbnQgc2NoZW1hIGFuZCBpbmNsdWRlcwotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotCi0gIHB1YmxpYyBDYXRlZ29yeUFkYXB0ZXIoU3RyaW5nIGxhYmVsLCBJbWFnZSBpbWFnZSwgQ29sbGVjdGlvbiBjaGlsZHJlbiwgWFNEU2NoZW1hIHhzZFNjaGVtYSwgaW50IGdyb3VwVHlwZSkKLSAgewotICAgIHRoaXMudGV4dCA9IGxhYmVsOwotICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTsKLSAgICB0aGlzLnBhcmVudCA9IHhzZFNjaGVtYTsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgICB0aGlzLnRhcmdldCA9IHhzZFNjaGVtYTsKLSAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47Ci0gICAgdGhpcy5ncm91cFR5cGUgPSBncm91cFR5cGU7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBBVFRSSUJVVEVTID0gMTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRUxFTUVOVFMgPSAyOwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBUWVBFUyA9IDM7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEdST1VQUyA9IDU7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERJUkVDVElWRVMgPSA2OwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBOT1RBVElPTlMgPSA3OwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBBVFRSSUJVVEVfR1JPVVBTID0gODsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSURFTlRJVFlfQ09OU1RSQUlOVFMgPSA5OwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBBTk5PVEFUSU9OUyA9IDEwOwotCi0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0WFNEU2NoZW1hKCkKLSAgewotICAgIHJldHVybiB4c2RTY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEdyb3VwVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZ3JvdXBUeXBlOwotICB9Ci0KLSAgcHVibGljIEltYWdlIGdldEltYWdlKCkKLSAgewotICAgIHJldHVybiBpbWFnZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gIHsKLSAgICByZXR1cm4gdGV4dDsKLSAgfQotCi0gIHB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpCi0gIHsKLSAgICByZXR1cm4gKElUcmVlRWxlbWVudFtdKSBjaGlsZHJlbi50b0FycmF5KG5ldyBJVHJlZUVsZW1lbnRbMF0pOwotICB9Ci0gIAotICBwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0QWxsQ2hpbGRyZW4oKQotICB7Ci0gICAgcmV0dXJuIChJVHJlZUVsZW1lbnRbXSkgYWxsQ2hpbGRyZW4udG9BcnJheShuZXcgSVRyZWVFbGVtZW50WzBdKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENoaWxkcmVuKENvbGxlY3Rpb24gbGlzdCkKLSAgewotICAgIGNoaWxkcmVuID0gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEFsbENoaWxkcmVuKENvbGxlY3Rpb24gbGlzdCkKLSAgewotICAgIGFsbENoaWxkcmVuID0gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gIHsKLQotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgeyAgICAKLSAgICBDb2xsZWN0aW9uIGFjdGlvbklEcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAKLSAgICBzd2l0Y2ggKGdyb3VwVHlwZSkKLSAgICB7Ci0gICAgICBjYXNlIFRZUEVTIDogewotICAgICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFjdGlvbi5JRCk7Ci0gICAgICAgIGFjdGlvbklEcy5hZGQoQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25BY3Rpb24uSUQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgRUxFTUVOVFMgOiB7Ci0gICAgICAgIGFjdGlvbklEcy5hZGQoQWRkWFNERWxlbWVudEFjdGlvbi5JRCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBHUk9VUFMgOiB7Ci0gICAgICAgIGFjdGlvbklEcy5hZGQoQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25BY3Rpb24uTU9ERUxHUk9VUERFRklOSVRJT05fSUQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQVRUUklCVVRFUyA6IHsKLSAgICAgICAgYWN0aW9uSURzLmFkZChBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbi5JRCk7Ci0gICAgICAgIGFjdGlvbklEcy5hZGQoQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWN0aW9uLklEKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEFUVFJJQlVURV9HUk9VUFMgOiB7Ci0gICAgICAgIGFjdGlvbklEcy5hZGQoQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWN0aW9uLklEKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIERJUkVDVElWRVMgOiB7Ci0gICAgICAgIGFjdGlvbklEcy5hZGQoQWRkWFNEU2NoZW1hRGlyZWN0aXZlQWN0aW9uLklOQ0xVREVfSUQpOwotICAgICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTRFNjaGVtYURpcmVjdGl2ZUFjdGlvbi5JTVBPUlRfSUQpOwotICAgICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTRFNjaGVtYURpcmVjdGl2ZUFjdGlvbi5SRURFRklORV9JRCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBhY3Rpb25JRHMuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBhY3Rpb25JRHMuYWRkKFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbi5JRCk7Ci0gICAgcmV0dXJuIChTdHJpbmcgW10pYWN0aW9uSURzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICBpZiAoZ2V0VGV4dCgpLmVxdWFscyhwcm9wZXJ0eSkpCi0gICAgICBub3RpZnlMaXN0ZW5lcnModGhpcywgcHJvcGVydHkpOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0VHlwZXMoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgewotICAgIHJldHVybiAoSU1vZGVsKVhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoeHNkU2NoZW1hKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOWI1MTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU3dpdGNoOwotCi1wdWJsaWMgY2xhc3MgWFNEQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBYU0RBZGFwdGVyRmFjdG9yeSBpbnN0YW5jZTsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgWFNEQWRhcHRlckZhY3RvcnkgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgLy8gZmlyc3QgdXNlIHRoZSBvbmUgZGVmaW5lZCBieSB0aGUgY29uZmlndXJhdGlvbgotICAgICAgaW5zdGFuY2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0WFNERWRpdG9yQ29uZmlndXJhdGlvbigpLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0gICAgICAvLyBpZiB0aGVyZSBpc24ndCBvbmUsIHRoZW4gdXNlIHRoZSBkZWZhdWx0Ci0gICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICAgICAgaW5zdGFuY2UgPSBuZXcgWFNEQWRhcHRlckZhY3RvcnkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0gIAotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkKLSAgewotICAgIFhTRFN3aXRjaCB4c2RTd2l0Y2ggPSBuZXcgWFNEU3dpdGNoKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RTY2hlbWFEaXJlY3RpdmUoWFNEU2NoZW1hRGlyZWN0aXZlIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRFdpbGRjYXJkKFhTRFdpbGRjYXJkIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RXaWxkY2FyZEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlcigpOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEQXR0cmlidXRlVXNlKFhTREF0dHJpYnV0ZVVzZSBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgWFNEQXR0cmlidXRlVXNlQWRhcHRlcigpOwotICAgICAgfQotICAgICAgCi0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RQYXJ0aWNsZShYU0RQYXJ0aWNsZSBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgWFNEUGFydGljbGVBZGFwdGVyKCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTREVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oWFNEU2ltcGxlVHlwZURlZmluaXRpb24gb2JqZWN0KQotICAgICAgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBuZXcgWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24gb2JqZWN0KQotICAgICAgewotICAgICAgICAvLyB3ZSBkb24ndCBsaWtlIGV4cG9zaW5nIHRoZSAnYW55VHlwZScgdHlwZSBhcyBhIHZpc2libGUgY29tcGxleCB0eXBlCi0gICAgICAgIC8vIHNvIHdlIGFkYXB0IGl0IGluIGEgc3BlY2lhbGl6ZWQgd2F5IHNvIHRoYXQgaXQncyB0cmVhdGVkIGFzIHNpbXBsZSB0eXBlCi0gICAgICAgIC8vIHRoYXQgd2F5IGl0IGRvZXNuJ3Qgc2hvdyB1cCBhcyBhIHJlZmVyZW5jZSBmcm9tIGEgZmllbGQKLSAgICAgICAgLy8KLSAgICAgICAgaWYgKCJhbnlUeXBlIi5lcXVhbHMob2JqZWN0LmdldE5hbWUoKSkpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgWFNEQW55VHlwZURlZmluaXRpb25BZGFwdGVyKCk7IAotICAgICAgICB9ICAKLSAgICAgICAgZWxzZQotICAgICAgICB7ICAgICAgICAgICAgIAotICAgICAgICAgIHJldHVybiBuZXcgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcigpOwotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNETW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RNb2RlbEdyb3VwQWRhcHRlcigpOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RTY2hlbWEoWFNEU2NoZW1hIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RTY2hlbWFBZGFwdGVyKCk7Ci0gICAgICB9ICAgICAgICAgCi0gICAgfTsKLSAgICBPYmplY3QgbyA9IHhzZFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCkgdGFyZ2V0KTsKLSAgICBBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKG8gaW5zdGFuY2VvZiBBZGFwdGVyKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChBZGFwdGVyKSBvOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotLy8gICAgICBUaHJlYWQuZHVtcFN0YWNrKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQpCi0gIHsKLSAgICByZXR1cm4gYWRhcHQodGFyZ2V0LCB0aGlzKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREFueVR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQW55VHlwZURlZmluaXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMWIyNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQW55VHlwZURlZmluaXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotCi1wdWJsaWMgY2xhc3MgWFNEQW55VHlwZURlZmluaXRpb25BZGFwdGVyIGV4dGVuZHMgWFNEVHlwZURlZmluaXRpb25BZGFwdGVyCi17Ci0gIHB1YmxpYyBib29sZWFuIGlzQ29tcGxleFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGb2N1c0FsbG93ZWQoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotCXJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNBbm9ueW1vdXMoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIElBRFRPYmplY3QgZ2V0VG9wQ29udGFpbmVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmYzhlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlciBleHRlbmRzIFhTREJhc2VBdHRyaWJ1dGVBZGFwdGVyIGltcGxlbWVudHMgSUFjdGlvblByb3ZpZGVyCi17Ci0gIHByb3RlY3RlZCBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKXRhcmdldDsKLSAgfQotIAotICBwcm90ZWN0ZWQgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0UmVzb2x2ZWRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0WFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKLSAgewotICAgIHJldHVybiBnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2UoKQotICB7Ci0gICAgcmV0dXJuIGdldFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuaXNBdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSgpOwotICB9Ci0KLSAgcHVibGljIElNb2RlbCBnZXRNb2RlbCgpCi0gIHsKLSAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGdldFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0U2NoZW1hKCkpOwotICAgIHJldHVybiAoSU1vZGVsKWFkYXB0ZXI7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQWxsb3dlZCgpCi0gIHsKLSAgICByZXR1cm4gaXNHbG9iYWwoKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZVF1YWxpZmllcigpCi0gIHsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gZ2V0UmVzb2x2ZWRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgcHVibGljIElBRFRPYmplY3QgZ2V0VG9wQ29udGFpbmVyKCkKLSAgewotICAgIGlmICghaXNHbG9iYWwoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0R2xvYmFsWFNEQ29udGFpbmVyKGdldFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MjliODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2V0SW5wdXRUb0dyYXBoVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklBY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklHcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQW55QXR0cmlidXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5EZWxldGVYU0RDb25jcmV0ZUNvbXBvbmVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLQotcHVibGljIGNsYXNzIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIgZXh0ZW5kcyBYU0RCYXNlQWRhcHRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmUsIElBY3Rpb25Qcm92aWRlciwgSUdyYXBoRWxlbWVudCwgSUFEVE9iamVjdExpc3RlbmVyCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgQVRUUklCVVRFX0dST1VQX1JFRl9JQ09OX0lNQUdFID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREF0dHJpYnV0ZUdyb3VwUmVmLmdpZiIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIEFUVFJJQlVURV9HUk9VUF9SRUZfRElTQUJMRURfSUNPTl9JTUFHRSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9YU0RBdHRyaWJ1dGVHcm91cFJlZmRpcy5naWYiKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBBVFRSSUJVVEVfR1JPVVBfSUNPTl9JTUFHRSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9YU0RBdHRyaWJ1dGVHcm91cC5naWYiKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBBVFRSSUJVVEVfR1JPVVBfRElTQUJMRURfSUNPTl9JTUFHRSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9YU0RBdHRyaWJ1dGVHcm91cGRpcy5naWYiKTsKLQkgIAotICBwcm90ZWN0ZWQgTGlzdCBmaWVsZHMgPSBudWxsOwotICBwcm90ZWN0ZWQgTGlzdCBvdGhlclRoaW5nc1RvTGlzdGVuVG8gPSBudWxsOwotCi0gIHB1YmxpYyBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGdldFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgdGFyZ2V0OwotICB9Ci0KLSAgcHVibGljIEltYWdlIGdldEltYWdlKCkKLSAgewotICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiB4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSB0YXJnZXQ7Ci0gICAgaWYgKHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbi5pc0F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIHJldHVybiBpc1JlYWRPbmx5KCkgPyBBVFRSSUJVVEVfR1JPVVBfUkVGX0RJU0FCTEVEX0lDT05fSU1BR0UgOiBBVFRSSUJVVEVfR1JPVVBfUkVGX0lDT05fSU1BR0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gaXNSZWFkT25seSgpID8gQVRUUklCVVRFX0dST1VQX0RJU0FCTEVEX0lDT05fSU1BR0UgOiBBVFRSSUJVVEVfR1JPVVBfSUNPTl9JTUFHRTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQotICB7Ci0gICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIHRhcmdldDsKLSAgICBTdHJpbmcgcmVzdWx0ID0geHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLmlzQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkgPyB4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24uZ2V0UU5hbWUoKSA6IHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbi5nZXROYW1lKCk7Ci0gICAgcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gTWVzc2FnZXMuX1VJX0xBQkVMX0FCU0VOVCA6IHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpCi0gIHsKLSAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24geHNkQXR0cmlidXRlR3JvdXAgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSB0YXJnZXQ7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkQWxsKHhzZEF0dHJpYnV0ZUdyb3VwLmdldENvbnRlbnRzKCkpOwotICAgIFhTRFdpbGRjYXJkIHdpbGRjYXJkID0geHNkQXR0cmlidXRlR3JvdXAuZ2V0QXR0cmlidXRlV2lsZGNhcmRDb250ZW50KCk7Ci0gICAgaWYgKHdpbGRjYXJkICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5hZGQod2lsZGNhcmQpOwotICAgIH0KLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QobGlzdCwgYWRhcHRlckxpc3QpOwotICAgIHJldHVybiAoSVRyZWVFbGVtZW50W10pIGFkYXB0ZXJMaXN0LnRvQXJyYXkobmV3IElUcmVlRWxlbWVudFswXSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uSUQpOwotICAgIGxpc3QuYWRkKEFkZFhTREFueUF0dHJpYnV0ZUFjdGlvbi5JRCk7Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIGxpc3QuYWRkKERlbGV0ZVhTRENvbmNyZXRlQ29tcG9uZW50QWN0aW9uLkRFTEVURV9YU0RfQ09NUE9ORU5UX0lEKTsKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgT2JqZWN0IHNjaGVtYSA9IGdldEVkaXRvclNjaGVtYSgpOwotICAgIGlmIChnZXRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKS5nZXRTY2hlbWEoKSA9PSBzY2hlbWEpCi0gICAgewotICAgICAgaWYgKGdldFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpLmdldENvbnRhaW5lcigpID09IHNjaGVtYSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoU2V0SW5wdXRUb0dyYXBoVmlldy5JRCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsaXN0LmFkZChPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgIH0KLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgbGlzdC5hZGQoU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLklEKTsKLSAgICByZXR1cm4gKFN0cmluZyBbXSlsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRBZGROZXdGaWVsZENvbW1hbmQoU3RyaW5nIGZpZWxkS2luZCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBEZWxldGVDb21tYW5kKCIiLCBnZXRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEZpZWxkcygpCi0gIHsKLSAgICBpZiAoZmllbGRzID09IG51bGwpCi0gICAgewotICAgICAgZmllbGRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgb3RoZXJUaGluZ3NUb0xpc3RlblRvID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgWFNEVmlzaXRvckZvckZpZWxkcyB2aXNpdG9yID0gbmV3IFhTRFZpc2l0b3JGb3JGaWVsZHMoKTsKLSAgICAgIHZpc2l0b3IudmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oZ2V0WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCkpOwotICAgICAgcG9wdWxhdGVBZGFwdGVyTGlzdCh2aXNpdG9yLmNvbmNyZXRlQ29tcG9uZW50TGlzdCwgZmllbGRzKTsKLSAgICAgIHBvcHVsYXRlQWRhcHRlckxpc3QodmlzaXRvci50aGluZ3NXZU5lZWRUb0xpc3RlblRvLCBvdGhlclRoaW5nc1RvTGlzdGVuVG8pOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gb3RoZXJUaGluZ3NUb0xpc3RlblRvLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGkubmV4dCgpOwotICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICBJQURUT2JqZWN0IGFkdE9iamVjdCA9IChJQURUT2JqZWN0KSBhZGFwdGVyOwotICAgICAgICAgIGFkdE9iamVjdC5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmaWVsZHM7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjbGVhckZpZWxkcygpCi0gIHsKLSAgICBpZiAob3RoZXJUaGluZ3NUb0xpc3RlblRvICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gb3RoZXJUaGluZ3NUb0xpc3RlblRvLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGkubmV4dCgpOwotICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICBJQURUT2JqZWN0IGFkdE9iamVjdCA9IChJQURUT2JqZWN0KSBhZGFwdGVyOwotICAgICAgICAgIGFkdE9iamVjdC51bnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZmllbGRzID0gbnVsbDsKLSAgICBvdGhlclRoaW5nc1RvTGlzdGVuVG8gPSBudWxsOwotICB9Ci0KLSAgcHVibGljIElNb2RlbCBnZXRNb2RlbCgpCi0gIHsKLSAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGdldFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gKElNb2RlbClhZGFwdGVyOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIC8vIFRPRE8gKGNzKSAuLi4gcmV2aWV3IHRoaXMKLSAgICByZXR1cm4gZ2V0VGV4dCgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGb2N1c0FsbG93ZWQoKQotICB7Ci0gICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIHRhcmdldDsKLSAgICBpZiAoeHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLmlzQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBJQURUT2JqZWN0IGdldFRvcENvbnRhaW5lcigpCi0gIHsKLSAgICByZXR1cm4gZ2V0R2xvYmFsWFNEQ29udGFpbmVyKGdldFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykKLSAgewotICAgIGNsZWFyRmllbGRzKCk7Ci0gICAgc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgY2xlYXJGaWVsZHMoKTsKLSAgICBub3RpZnlMaXN0ZW5lcnModGhpcywgbnVsbCk7Ci0gIH0KLSAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREF0dHJpYnV0ZVVzZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREF0dHJpYnV0ZVVzZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY4MzY1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RBdHRyaWJ1dGVVc2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgWFNEQXR0cmlidXRlVXNlQWRhcHRlciBleHRlbmRzIFhTREJhc2VBdHRyaWJ1dGVBZGFwdGVyIGltcGxlbWVudHMgSUFjdGlvblByb3ZpZGVyCi17Ci0gIHByb3RlY3RlZCBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0WFNEQXR0cmlidXRlVXNlKCkuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgfQotCi0gIHByb3RlY3RlZCBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRSZXNvbHZlZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCkKLSAgewotICAgIHJldHVybiBnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFhTREF0dHJpYnV0ZVVzZSBnZXRYU0RBdHRyaWJ1dGVVc2UoKQotICB7Ci0gICAgcmV0dXJuIChYU0RBdHRyaWJ1dGVVc2UpdGFyZ2V0OwotICB9Ci0KLSAgcHVibGljIFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0VGV4dEZvckF0dHJpYnV0ZVVzZShnZXRYU0RBdHRyaWJ1dGVVc2UoKSwgdHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHRGb3JBdHRyaWJ1dGVVc2UoWFNEQXR0cmlidXRlVXNlIGF0dHJpYnV0ZVVzZSwgYm9vbGVhbiBzaG93VHlwZSkKLSAgewotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkID0gYXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgICAKLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ICA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICByZXN1bHQuYXBwZW5kKGdldFRleHRGb3JBdHRyaWJ1dGUoYWQsIHNob3dUeXBlKSk7Ci0gICAgLyoKLSAgICBpZiAoeHNkQXR0cmlidXRlVXNlLmlzU2V0Q29uc3RyYWludCgpKQotICAgIHsKLSAgICAgIGlmIChyZXN1bHQubGVuZ3RoKCkgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAiKTsKLSAgICAgIH0KLSAgICAgIHJlc3VsdC5hcHBlbmQoJzwnKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoeHNkQXR0cmlidXRlVXNlLmdldENvbnN0cmFpbnQoKSk7Ci0gICAgICByZXN1bHQuYXBwZW5kKCI9XCIiKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoeHNkQXR0cmlidXRlVXNlLmdldExleGljYWxWYWx1ZSgpKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoIlwiPiIpOwotICAgIH0KLSAgICAqLwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIElNb2RlbCBnZXRNb2RlbCgpCi0gIHsKLSAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGdldFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0U2NoZW1hKCkpOwotICAgIHJldHVybiAoSU1vZGVsKWFkYXB0ZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWVRdWFsaWZpZXIoKQotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IGdldFJlc29sdmVkWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgfQotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHB1YmxpYyBJQURUT2JqZWN0IGdldFRvcENvbnRhaW5lcigpCi0gIHsKLSAgICByZXR1cm4gZ2V0R2xvYmFsWFNEQ29udGFpbmVyKGdldFhTREF0dHJpYnV0ZVVzZSgpKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlKCkKLSAgewotICAgIHJldHVybiBnZXRYU0RBdHRyaWJ1dGVVc2UoKS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREJhc2VBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RCYXNlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjJmZjYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREJhc2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUNvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RCYXNlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSUFEVE9iamVjdCwgSVRyZWVFbGVtZW50Ci17ICAKLSAgcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAKLSAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgewotICAgIHJldHVybiB0eXBlID09IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHBvcHVsYXRlQWRhcHRlckxpc3QoTGlzdCBub3RpZmllckxpc3QsIExpc3QgYWRhcHRlckxpc3QpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBub3RpZmllckxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0gICAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudClvYmo7Ci0gICAgICAgIGFkYXB0ZXJMaXN0LmFkZChYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGNvbXBvbmVudCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBhZGFwdGVyTGlzdC5hZGQob2JqKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gIAotICAKLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBpZiAoIWxpc3RlbmVyTGlzdC5jb250YWlucyhsaXN0ZW5lcikpCi0gICAgewotICAgICAgbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyTGlzdGVuZXIoSUFEVE9iamVjdExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykKLSAgewotICAgIHN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLSAgICBub3RpZnlMaXN0ZW5lcnModGhpcywgbnVsbCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhPYmplY3QgY2hhbmdlZE9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgTGlzdCBjbG9uZWRMaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgY2xvbmVkTGlzdGVuZXJMaXN0LmFkZEFsbChsaXN0ZW5lckxpc3QpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGNsb25lZExpc3RlbmVyTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIElBRFRPYmplY3RMaXN0ZW5lciBsaXN0ZW5lciA9IChJQURUT2JqZWN0TGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICBsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQodGhpcywgcHJvcGVydHkpOwotICAgIH0gICAgICAKLSAgfQotICAgIAotICBwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICB9Ci0gIAotICBwdWJsaWMgSVRyZWVFbGVtZW50IGdldFBhcmVudCgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKQotICB7Ci0gICAgaWYgKGdldENoaWxkcmVuKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPiAwOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0KLSAgLyoqCi0gICAqIEltcGxlbWVudHMgSUZpZWxkIGdldENvbnRhaW5lclR5cGUuICBHZXQgcGFyZW50IENvbXBsZXggVHlwZSBjb250YWluaW5nIHRoZSBmaWVsZAotICAgKiBAcmV0dXJuIElDb21wbGV4VHlwZQotICAgKi8KLSAgcHVibGljIElDb21wbGV4VHlwZSBnZXRDb250YWluZXJUeXBlKCkKLSAgewotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbmNyZXRlQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSB0YXJnZXQ7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gbnVsbDsKLSAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QgPSBudWxsOwotICAgIGZvciAocGFyZW50ID0geHNkQ29uY3JldGVDb21wb25lbnQuZ2V0Q29udGFpbmVyKCk7IHBhcmVudCAhPSBudWxsOyApCi0gICAgewotICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgY3QgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKXBhcmVudDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgfQotICAgIGlmIChjdCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiAoSUNvbXBsZXhUeXBlKVhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoY3QpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCi0gIHsKLSAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gbnVsbDsKLSAgICAgIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgIGlmICh3aW5kb3cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIGlmIChwYWdlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBlZGl0b3JQYXJ0ID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgewotICAgICAgICB4c2RTY2hlbWEgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KXRhcmdldCkuZ2V0U2NoZW1hKCk7Ci0gICAgICB9Ci0gICAgICBpZiAoZWRpdG9yUGFydCA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXR1cm4gZmFsbEJhY2tDaGVja0lzUmVhZE9ubHkoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgWFNEU2NoZW1hIGVkaXRvclNjaGVtYSA9IChYU0RTY2hlbWEpZWRpdG9yUGFydC5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcyk7Ci0gICAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwgJiYgeHNkU2NoZW1hID09IGVkaXRvclNjaGVtYSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR1cm4gZmFsbEJhY2tDaGVja0lzUmVhZE9ubHkoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgewotCi0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gZmFsbEJhY2tDaGVja0lzUmVhZE9ubHkoKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudCl0YXJnZXQpLmdldEVsZW1lbnQoKTsKLSAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElET01Ob2RlCi0gICAgICAgIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkKLSAgICB7Ci0gICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCBPYmplY3QgZ2V0RWRpdG9yU2NoZW1hKCkKLSAgewotICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICByZXR1cm4gZWRpdG9yUGFydC5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcyk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJQURUT2JqZWN0IGdldEdsb2JhbFhTRENvbnRhaW5lcihYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjID0gY29tcG9uZW50LmdldENvbnRhaW5lcigpOwotICAgIC8vIFdlIHdhbnQgdGhlIHRvcCBtb3N0IHN0cnVjdHVyYWwgY29tcG9uZW50Ci0gICAgd2hpbGUgKGMgIT0gbnVsbCAmJiAKLSAgICAgICAgICAgIShjLmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEU2NoZW1hKSAmJiAKLSAgICAgICAgICAgIShjIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSAmJgotICAgICAgICAgICAhKGMgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgJiYKLSAgICAgICAgICAgIShjIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pICYmCi0gICAgICAgICAgICEoYyBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikpCi0gICAgewotICAgICAgYyA9IGMuZ2V0Q29udGFpbmVyKCk7Ci0gICAgfQotICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoYyk7Ci0gICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQURUT2JqZWN0KQotICAgICAgcmV0dXJuIChJQURUT2JqZWN0KWFkYXB0ZXI7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREJhc2VBdHRyaWJ1dGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RCYXNlQXR0cmlidXRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWQ1YzU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREJhc2VBdHRyaWJ1dGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2V0SW5wdXRUb0dyYXBoVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklHcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuT3BlbkluTmV3RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlTmFtZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi0vLyBhIGJhc2UgYWRhcHRlciBmb3IgcmV1c2UgYnkgYW4gQXR0cmlidXRlVXNlIGFuZCBBdHRyaWJ1dGVEZWNsYXJhdGlvbgotLy8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYU0RCYXNlQXR0cmlidXRlQWRhcHRlciBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgSUZpZWxkLCBJR3JhcGhFbGVtZW50Ci17Ci0gIHByb3RlY3RlZCBhYnN0cmFjdCBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0UmVzb2x2ZWRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotCi0gIHB1YmxpYyBYU0RCYXNlQXR0cmlidXRlQWRhcHRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoIWlzR2xvYmFsKCkpCi0gICAgewotICAgICAgbGlzdC5hZGQoQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uSUQpOwotICAgICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIH0KLSAgICBsaXN0LmFkZChEZWxldGVBY3Rpb24uSUQpOwotICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBPYmplY3Qgc2NoZW1hID0gZ2V0RWRpdG9yU2NoZW1hKCk7Ci0gICAgaWYgKGdldFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0U2NoZW1hKCkgPT0gc2NoZW1hKQotICAgIHsKLSAgICAgIGlmIChnZXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldENvbnRhaW5lcigpID09IHNjaGVtYSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoU2V0SW5wdXRUb0dyYXBoVmlldy5JRCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsaXN0LmFkZChPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgIH0KLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgbGlzdC5hZGQoU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLklEKTsKLSAgICByZXR1cm4gKFN0cmluZ1tdKSBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkKLSAgewotICAgIHJldHVybiBuZXcgRGVsZXRlQ29tbWFuZCgiIiwgZ2V0WFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0S2luZCgpCi0gIHsKLSAgICByZXR1cm4gWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRzsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TWF4T2NjdXJzKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gLTM7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1pbk9jY3VycygpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIC0zOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24gPSBnZXRSZXNvbHZlZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgU3RyaW5nIG5hbWUgPSByZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldE5hbWUoKTsKLSAgICByZXR1cm4gKG5hbWUgPT0gbnVsbCkgPyAiIiA6IG5hbWU7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBJVHlwZSBnZXRUeXBlKCkKLSAgewotICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gZ2V0UmVzb2x2ZWRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgcmV0dXJuICh0ZCAhPSBudWxsKSA/IChJVHlwZSkgWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCh0ZCkgOiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpCi0gIHsKLSAgICBJVHlwZSB0eXBlID0gZ2V0VHlwZSgpOwotICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgeyAgCi0gICAgICByZXR1cm4gdHlwZS5nZXROYW1lKCk7Ci0gICAgfQotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWVRdWFsaWZpZXIoKQotICB7Ci0gICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IGdldFJlc29sdmVkWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgICBpZiAoYXR0ciAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChhdHRyLmdldFR5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGF0dHIuZ2V0VHlwZURlZmluaXRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU1heE9jY3Vyc0NvbW1hbmQoaW50IG1heE9jY3VycykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU1pbk9jY3Vyc0NvbW1hbmQoaW50IG1pbk9jY3VycykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU5hbWVDb21tYW5kKFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuIG5ldyBVcGRhdGVOYW1lQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9OQU1FLCBnZXRSZXNvbHZlZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCksIG5hbWUpOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlVHlwZU5hbWVDb21tYW5kKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHF1YWlsaWZpZXIpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50I2dldEltYWdlKCkKLSAgICovCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbiA9IGdldFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7ICAvLyBkb24ndCB3YW50IHRoZSByZXNvbHZlZCBhdHRyaWJ1dGUKLSAgICBpZiAoeHNkQXR0cmlidXRlRGVjbGFyYXRpb24uaXNBdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIGlmIChpc1JlYWRPbmx5KCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNEQXR0cmlidXRlUmVmZGlzLmdpZiIpOwotICAgICAgfQotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEQXR0cmlidXRlUmVmLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaXNSZWFkT25seSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREF0dHJpYnV0ZWRpcy5naWYiKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREF0dHJpYnV0ZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQjZ2V0VGV4dCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQotICB7Ci0gICAgcmV0dXJuIGdldFRleHRGb3JBdHRyaWJ1dGUoZ2V0UmVzb2x2ZWRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLCB0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dEZvckF0dHJpYnV0ZShYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCwgYm9vbGVhbiBzaG93VHlwZSkKLSAgewotICAgIGFkID0gYWQuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgIFN0cmluZyBuYW1lID0gYWQuZ2V0TmFtZSgpOwotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQuYXBwZW5kKCIgIiArIE1lc3NhZ2VzLl9VSV9MQUJFTF9BQlNFTlQgKyAiICIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQuYXBwZW5kKG5hbWUpOwotICAgIH0KLSAgICBpZiAoYWQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSA9PSBudWxsICYmIGFkLmdldFR5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQuYXBwZW5kKCIgOiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgLy8gcmVzdWx0LmFwcGVuZChyZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0UU5hbWUoeHNkQXR0cmlidXRlRGVjbGFyYXRpb24pKTsKLSAgICAgIHJlc3VsdC5hcHBlbmQoYWQuZ2V0VHlwZURlZmluaXRpb24oKS5nZXROYW1lKCkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0dsb2JhbCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIElNb2RlbCBnZXRNb2RlbCgpCi0gIHsKLSAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGdldFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0U2NoZW1hKCkpOwotICAgIHJldHVybiAoSU1vZGVsKWFkYXB0ZXI7Ci0gIH0gIAotCi0gIHB1YmxpYyBib29sZWFuIGlzRm9jdXNBbGxvd2VkKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RDaGlsZFV0aWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRENoaWxkVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTExMTBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRENoaWxkVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2g7Ci0gICAgICAgICAgICAgIAotCi1wdWJsaWMgY2xhc3MgWFNEQ2hpbGRVdGlsaXR5Ci17ICAgICAgICAgICAgICAKLSAgc3RhdGljIHB1YmxpYyBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgWFNEQ2hpbGRWaXNpdG9yIHZpc2l0b3IgPSBuZXcgWFNEQ2hpbGRWaXNpdG9yKG1vZGVsKTsKLSAgICB2aXNpdG9yLnZpc2l0WFNET2JqZWN0KG1vZGVsKTsKLSAgICByZXR1cm4gdmlzaXRvci5saXN0OwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBMaXN0IGdldEltbWVkaWF0ZURlcml2ZWRUeXBlcyhYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUpCi0gIHsKLSAgICBBcnJheUxpc3QgdHlwZXNEZXJpdmVkRnJvbSA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIC8vIEEgaGFuZHkgY29udmVuaWVuY2UgbWV0aG9kIHF1aWNrbHkgZ2V0cyBhbGwgCi0gICAgLy8gdHlwZURlZmluaXRpb25zIHdpdGhpbiBvdXIgc2NoZW1hOyBub3RlIHRoYXQgCi0gICAgLy8gd2hldGhlciBvciBub3QgdGhpcyByZXR1cm5zIHR5cGVzIGluIGluY2x1ZGVkLCAKLSAgICAvLyBpbXBvcnRlZCwgb3IgcmVkZWZpbmVkIHNjaGVtYXMgaXMgc3ViamVjdCB0byBjaGFuZ2UKLSAgICBMaXN0IHR5cGVkZWZzID0gY29tcGxleFR5cGUuZ2V0U2NoZW1hKCkuZ2V0VHlwZURlZmluaXRpb25zKCk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlZGVmcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVkZWYgPSAoWFNEVHlwZURlZmluaXRpb24paXRlci5uZXh0KCk7Ci0gICAgICAvLyBXYWxrIHRoZSBiYXNlVHlwZXMgZnJvbSB0aGlzIHR5cGVkZWYgc2VlaW5nIGlmIGFueSAKLSAgICAgIC8vIG9mIHRoZW0gbWF0Y2ggdGhlIHJlcXVlc3RlZCBvbmUKLSAgICAgIGlmIChjb21wbGV4VHlwZS5lcXVhbHModHlwZWRlZi5nZXRCYXNlVHlwZSgpKSkKLSAgICAgIHsKLSAgICAgICAgLy8gV2UgZm91bmQgaXQsIHJldHVybiB0aGUgb3JpZ2luYWwgb25lIGFuZCBjb250aW51ZQotICAgICAgICB0eXBlc0Rlcml2ZWRGcm9tLmFkZCh0eXBlZGVmKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHR5cGVzRGVyaXZlZEZyb207Ci0gIH0KLSAgLy8gVE9ETy4uLiB1c2UgdGhlIFhTRFZpc2l0b3IgZGVmaW5lZCBpbiB4c2RlZGl0b3IudXRpbCBpbnN0ZWFkCi0gIC8vICAgICAgICAgIAotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTRENoaWxkVmlzaXRvciBleHRlbmRzIFhTRFZpc2l0b3IKLSAgewotICAgIE9iamVjdCByb290OwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHB1YmxpYyBYU0RDaGlsZFZpc2l0b3IoT2JqZWN0IHJvb3QpCi0gICAgewotICAgICAgdGhpcy5yb290ID0gcm9vdDsKLSAgICB9ICAgICAgICAgICAgICAgICAgCi0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTRE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIGlmICh4c2RNb2RlbEdyb3VwICE9IHJvb3QpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKHhzZE1vZGVsR3JvdXApOyAKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHN1cGVyLnZpc2l0WFNETW9kZWxHcm91cCh4c2RNb2RlbEdyb3VwKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGlmICh4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbiAhPSByb290KQotICAgICAgewotICAgICAgICBsaXN0LmFkZCh4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbik7Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzdXBlci52aXNpdFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTREVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIGlmICh4c2RFbGVtZW50RGVjbGFyYXRpb24gIT0gcm9vdCkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoeHNkRWxlbWVudERlY2xhcmF0aW9uKTsKLSAgICAgICAgCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzdXBlci52aXNpdFhTREVsZW1lbnREZWNsYXJhdGlvbih4c2RFbGVtZW50RGVjbGFyYXRpb24pOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgaWYgKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbiAhPSByb290KQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSAhPSBudWxsIHx8IGdldE1vZGVsQ2hpbGRyZW4oeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKS5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKTsKLSAgICAgICAgfQotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc3VwZXIudmlzaXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKTsKLSAgICAgIH0KLSAgICB9ICAgIAotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RXaWxkY2FyZChYU0RXaWxkY2FyZCB4c2RXaWxkQ2FyZCkKLSAgICB7Ci0gICAgICBpZiAoeHNkV2lsZENhcmQgIT0gcm9vdCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgbGlzdC5hZGQoeHNkV2lsZENhcmQpOyAgICAgICAgCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzdXBlci52aXNpdFhTRFdpbGRjYXJkKHhzZFdpbGRDYXJkKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNEVmlzaXRvcgotICB7IAotICAgIGludCBpbmRlbnQgPSAwOwotICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTRE9iamVjdChPYmplY3Qgb2JqZWN0KQotICAgIHsgICAgICAgICAgIAotICAgICAgaWYgKG9iamVjdCA9PSBudWxsKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIFhTRFN3aXRjaCB0aGVTd2l0Y2ggPSBuZXcgWFNEU3dpdGNoKCkKLSAgICAgIHsgICAKLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBvYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbihvYmplY3QpOwotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IAotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTREF0dHJpYnV0ZVVzZShYU0RBdHRyaWJ1dGVVc2Ugb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRYU0RBdHRyaWJ1dGVVc2Uob2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTREVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRYU0RFbGVtZW50RGVjbGFyYXRpb24ob2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0WFNETW9kZWxHcm91cERlZmluaXRpb24ob2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gc3VwZXIuY2FzZVhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKG9iamVjdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRYU0RNb2RlbEdyb3VwKG9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHN1cGVyLmNhc2VYU0RNb2RlbEdyb3VwKG9iamVjdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RQYXJ0aWNsZShYU0RQYXJ0aWNsZSBvYmplY3QpCi0gICAgICAgIHsgCi0gICAgICAgICAgdmlzaXRYU0RQYXJ0aWNsZShvYmplY3QpOwotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IAotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRFNjaGVtYShYU0RTY2hlbWEgb2JqZWN0KQotICAgICAgICB7IAotICAgICAgICAgIHZpc2l0WFNEU2NoZW1hKG9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNEV2lsZGNhcmQoWFNEV2lsZGNhcmQgb2JqZWN0KQotICAgICAgICB7IAotICAgICAgICAgIHZpc2l0WFNEV2lsZGNhcmQob2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSAKLSAgICAgIH07Ci0gICAgICB0aGVTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3Qpb2JqZWN0KTsKLSAgICB9Ci0gICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTREF0dHJpYnV0ZVVzZShYU0RBdHRyaWJ1dGVVc2UgeHNkQXR0cmlidXRlVXNlKQotICAgIHsgIAotLy8gICAgICBwcmludEluZGVudGVkKCJAIiArIHhzZEF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RTY2hlbWEoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgICB7ICAgICAgICAgCi0gICAgICBpbmRlbnQgKz0gMjsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICB2aXNpdFhTRE9iamVjdChpdGVyYXRvci5uZXh0KCkpOwotICAgICAgfQotICAgICAgaW5kZW50IC09IDI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7ICAgICAgCi0gICAgICBpbmRlbnQgKz0gMjsgICAgICAgICAKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAodGQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGQgPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKTsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgdmlzaXRYU0RPYmplY3QodGQpOwotICAgICAgaW5kZW50IC09IDI7Ci0gICAgfQotICAgCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBpbmRlbnQgKz0gMjsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGVVc2VzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsgICAgICAgIAotICAgICAgICB2aXNpdFhTRE9iamVjdChpLm5leHQoKSk7Ci0gICAgICB9Ci0gICAgICB2aXNpdFhTRE9iamVjdCh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0Q29udGVudCgpKTsKLSAgICAgIGluZGVudCAtPSAyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNETW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXApCi0gICAgewotICAgICAgaW5kZW50ICs9IDI7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0geHNkTW9kZWxHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICB2aXNpdFhTRE9iamVjdChpdGVyYXRvci5uZXh0KCkpOwotICAgICAgfSAKLSAgICAgIGluZGVudCAtPSAyOwotICAgIH0gICAgIAotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBpbmRlbnQgKz0gMjsKLSAgICAgIHZpc2l0WFNET2JqZWN0KHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKS5nZXRNb2RlbEdyb3VwKCkpOwotICAgICAgaW5kZW50IC09IDI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RQYXJ0aWNsZShYU0RQYXJ0aWNsZSB4c2RQYXJ0aWNsZSkKLSAgICB7Ci0gICAgICBpbmRlbnQgKz0gMjsgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKHhzZFBhcnRpY2xlLmdldENvbnRlbnQoKSAhPSBudWxsKQotICAgICAgICB2aXNpdFhTRE9iamVjdCh4c2RQYXJ0aWNsZS5nZXRDb250ZW50KCkpOwotICAgICAgaW5kZW50IC09IDI7Ci0gICAgfSAKLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNEV2lsZGNhcmQoWFNEV2lsZGNhcmQgb2JqZWN0KQotICAgIHsgCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmludEluZGVudGVkKFN0cmluZyBzdHJpbmcpCi0gICAgeyAKLSAgICAgIC8vU3RyaW5nIHNwYWNlcyA9ICIiOwotICAgICAgLy9mb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKQotICAgICAgLy97Ci0gICAgICAvLyAgc3BhY2VzICs9ICIgIjsKLSAgICAgIC8vfSAgICAgICAgICAgICAgIAotICAgICAKLSAgICB9Ci0gIH0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YzdhMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2V0SW5wdXRUb0dyYXBoVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQ29tcGxleFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBbnlBdHRyaWJ1dGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBbnlFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNETW9kZWxHcm91cEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRYU0RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5TcGFjZUZpbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMubW9kZWwuVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXIgZXh0ZW5kcyBYU0RUeXBlRGVmaW5pdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBJQ29tcGxleFR5cGUsIElBRFRPYmplY3RMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgTGlzdCBmaWVsZHMgPSBudWxsOwotICBwcm90ZWN0ZWQgTGlzdCBvdGhlclRoaW5nc1RvTGlzdGVuVG8gPSBudWxsOwotCi0gIHB1YmxpYyBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gZ2V0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB0YXJnZXQ7Ci0gIH0KLQotICBwdWJsaWMgSVR5cGUgZ2V0U3VwZXJUeXBlKCkKLSAgewotICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gZ2V0WFNEVHlwZURlZmluaXRpb24oKS5nZXRCYXNlVHlwZSgpOwotCi0gICAgLy8gdGVzdCB0byBmaWx0ZXIgb3V0IHRoZSAnYW55VHlwZScgdHlwZSAuLi4gZG9uJ3Qgd2FudCB0byBzZWUgdGhhdAotICAgIC8vCi0gICAgaWYgKHRkICE9IG51bGwgJiYgIXRkLmdldE5hbWUoKS5lcXVhbHMoImFueVR5cGUiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJldHVybiAoSVR5cGUpIFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQodGQpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNsZWFyRmllbGRzKCkKLSAgewotICAgIGlmIChvdGhlclRoaW5nc1RvTGlzdGVuVG8gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvdGhlclRoaW5nc1RvTGlzdGVuVG8uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcikgaS5uZXh0KCk7Ci0gICAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUFEVE9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIElBRFRPYmplY3QgYWR0T2JqZWN0ID0gKElBRFRPYmplY3QpIGFkYXB0ZXI7Ci0gICAgICAgICAgYWR0T2JqZWN0LnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBmaWVsZHMgPSBudWxsOwotICAgIG90aGVyVGhpbmdzVG9MaXN0ZW5UbyA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRGaWVsZHMoKQotICB7Ci0gICAgaWYgKGZpZWxkcyA9PSBudWxsKQotICAgIHsKLSAgICAgIGZpZWxkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIG90aGVyVGhpbmdzVG9MaXN0ZW5UbyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgWFNEVmlzaXRvckZvckZpZWxkcyB2aXNpdG9yID0gbmV3IFhTRFZpc2l0b3JGb3JGaWVsZHNXaXRoU3BhY2VGaWxsZXJzKCk7Ci0gICAgICB2aXNpdG9yLnZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKGdldFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpKTsKLSAgICAgIHBvcHVsYXRlQWRhcHRlckxpc3QodmlzaXRvci5jb25jcmV0ZUNvbXBvbmVudExpc3QsIGZpZWxkcyk7Ci0gICAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KHZpc2l0b3IudGhpbmdzV2VOZWVkVG9MaXN0ZW5Ubywgb3RoZXJUaGluZ3NUb0xpc3RlblRvKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG90aGVyVGhpbmdzVG9MaXN0ZW5Uby5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBpLm5leHQoKTsKLSAgICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQURUT2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgSUFEVE9iamVjdCBhZHRPYmplY3QgPSAoSUFEVE9iamVjdCkgYWRhcHRlcjsKLSAgICAgICAgICBhZHRPYmplY3QucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmllbGRzOwotICB9Ci0KLSAgY2xhc3MgWFNEVmlzaXRvckZvckZpZWxkc1dpdGhTcGFjZUZpbGxlcnMgZXh0ZW5kcyBYU0RWaXNpdG9yRm9yRmllbGRzCi0gIHsKLSAgICBwdWJsaWMgWFNEVmlzaXRvckZvckZpZWxkc1dpdGhTcGFjZUZpbGxlcnMoKQotICAgIHsKLSAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBhdHRyaWJ1dGVHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvID0gaXQubmV4dCgpOwotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZVVzZSBhdHRyaWJ1dGVVc2UgPSAoWFNEQXR0cmlidXRlVXNlKSBvOwotICAgICAgICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQoYXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpOwotICAgICAgICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKGF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJHcm91cCA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIG87Ci0gICAgICAgICAgdGhpbmdzV2VOZWVkVG9MaXN0ZW5Uby5hZGQoYXR0ckdyb3VwKTsKLSAgICAgICAgICBpZiAoYXR0ckdyb3VwLmlzQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgYXR0ckdyb3VwID0gYXR0ckdyb3VwLmdldFJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoYXR0ckdyb3VwLmdldENvbnRlbnRzKCkuc2l6ZSgpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQobmV3IFNwYWNlRmlsbGVyKCJhdHRyaWJ1dGUiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKGF0dHJHcm91cCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCkKLSAgICB7Ci0gICAgICBpbnQgbnVtT2ZDaGlsZHJlbiA9IG1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5zaXplKCk7Ci0gICAgICBpZiAobnVtT2ZDaGlsZHJlbiA9PSAwKQotICAgICAgewotICAgICAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKG5ldyBTcGFjZUZpbGxlcigiZWxlbWVudCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgc3VwZXIudmlzaXRNb2RlbEdyb3VwKG1vZGVsR3JvdXApOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldE1vZGVsR3JvdXBzKCkKLSAgewotICAgIExpc3QgZ3JvdXBzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGdyb3Vwcy5hZGRBbGwoWFNEQ2hpbGRVdGlsaXR5LmdldE1vZGVsQ2hpbGRyZW4oZ2V0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCkpKTsKLSAgICByZXR1cm4gZ3JvdXBzOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0QXR0cmlidXRlR3JvdXBDb250ZW50KCkKLSAgewotICAgIEVMaXN0IGF0dHJDb250ZW50ID0gZ2V0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCkuZ2V0QXR0cmlidXRlQ29udGVudHMoKTsKLSAgICBMaXN0IGF0dHJVc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaXQgPSBhdHRyQ29udGVudC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCBhdHRyR3JvdXBDb250ZW50ID0gKFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCkgaXQubmV4dCgpOwotCi0gICAgICBpZiAoYXR0ckdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIGF0dHJHcm91cENvbnRlbnQ7Ci0gICAgICAgIGxpc3QuYWRkKFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSk7Ci0gICAgICAgIGdldEF0dHJpYnV0ZVVzZXMoYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLCBhdHRyVXNlcyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGF0dHJVc2VzLmFkZChhdHRyR3JvdXBDb250ZW50KTsKLSAgICAgICAgbGlzdC5hZGQobmV3IFRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcih0aGlzKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV4VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykKLSAgewotICAgIGNsZWFyRmllbGRzKCk7Ci0gICAgc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlTmFtZUNvbW1hbmQoU3RyaW5nIG5ld05hbWUpCi0gIHsKLSAgICByZXR1cm4gbmV3IFVwZGF0ZU5hbWVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX05BTUUsIGdldFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpLCBuZXdOYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldEFkZE5ld0ZpZWxkQ29tbWFuZChTdHJpbmcgZmllbGRLaW5kKQotICB7Ci0gICAgcmV0dXJuIG5ldyBBZGRYU0RFbGVtZW50Q29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9GSUVMRCwgZ2V0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCkpOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZCgpCi0gIHsKLSAgICByZXR1cm4gbmV3IERlbGV0ZUNvbW1hbmQoIiIsIGdldFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIEFkZE5ld0ZpZWxkQ29tbWFuZCBleHRlbmRzIENvbW1hbmQKLSAgewotICAgIHByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdE5hbWU7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBmaWVsZEtpbmQ7Ci0KLSAgICBBZGROZXdGaWVsZENvbW1hbmQoU3RyaW5nIGRlZmF1bHROYW1lLCBTdHJpbmcgZmllbGRLaW5kKQotICAgIHsKLSAgICAgIHRoaXMuZGVmYXVsdE5hbWUgPSBkZWZhdWx0TmFtZTsKLSAgICAgIHRoaXMuZmllbGRLaW5kID0gZmllbGRLaW5kOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgT2JqZWN0IHNjaGVtYSA9IGdldEVkaXRvclNjaGVtYSgpOwotICAgIAotICAgIGxpc3QuYWRkKEFkZFhTREVsZW1lbnRBY3Rpb24uSUQpOwotICAgIGxpc3QuYWRkKEFkZFhTREVsZW1lbnRBY3Rpb24uUkVGX0lEKTsKLSAgICBsaXN0LmFkZChBZGRYU0RBbnlFbGVtZW50QWN0aW9uLklEKTsKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgbGlzdC5hZGQoQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24uSUQpOwotICAgIGxpc3QuYWRkKEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLlJFRl9JRCk7Ci0gICAgbGlzdC5hZGQoQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWN0aW9uLlJFRl9JRCk7Ci0gICAgbGlzdC5hZGQoQWRkWFNEQW55QXR0cmlidXRlQWN0aW9uLklEKTsKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgbGlzdC5hZGQoQWRkWFNETW9kZWxHcm91cEFjdGlvbi5TRVFVRU5DRV9JRCk7Ci0gICAgbGlzdC5hZGQoQWRkWFNETW9kZWxHcm91cEFjdGlvbi5DSE9JQ0VfSUQpOwotICAgIGxpc3QuYWRkKEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24uQUxMX0lEKTsKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgbGlzdC5hZGQoRGVsZXRlQWN0aW9uLklEKTsKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgaWYgKGdldFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpLmdldFNjaGVtYSgpID09IHNjaGVtYSkKLSAgICB7Ci0gICAgICBpZiAoZ2V0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCkuZ2V0Q29udGFpbmVyKCkgPT0gc2NoZW1hKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChTZXRJbnB1dFRvR3JhcGhWaWV3LklEKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGxpc3QuYWRkKE9wZW5Jbk5ld0VkaXRvci5JRCk7Ci0gICAgfQotICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBsaXN0LmFkZChTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24uSUQpOwotICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotICAgIGxpc3QudG9BcnJheShyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgY2xlYXJGaWVsZHMoKTsKLSAgICBub3RpZnlMaXN0ZW5lcnModGhpcywgbnVsbCk7Ci0gIH0KLQotICBjbGFzcyBCb2d1c0FjdGlvbiBleHRlbmRzIEFjdGlvbgotICB7Ci0gICAgQm9ndXNBY3Rpb24oU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICBzdXBlci5ydW4oKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbiA9IGdldFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAvLyBBZGQgYXR0cmlidXRlcwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGVDb250ZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0gICAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgewotICAgICAgICBsaXN0LmFkZCgoKFhTREF0dHJpYnV0ZVVzZSlvYmopLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBnZXRBdHRyaWJ1dGVVc2VzKChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIG9iaiwgbGlzdCk7Ci0gICAgICB9Ci0gICAgfQotICAgIFhTRFdpbGRjYXJkIGFueUF0dHIgPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0QXR0cmlidXRlV2lsZGNhcmQoKTsKLSAgICBpZiAoYW55QXR0ciAhPSBudWxsKQotICAgICAgbGlzdC5hZGQoYW55QXR0cik7Ci0gICAgLy8gZ2V0IGltbWVkaWF0ZSBYU0QgTW9kZWwgR3JvdXAgb2YgdGhpcyBjb21wbGV4IHR5cGUKLSAgICBpZiAoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldENvbnRlbnQoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIFhTRENvbXBsZXhUeXBlQ29udGVudCB4c2RDb21wbGV4VHlwZUNvbnRlbnQgPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0Q29udGVudCgpOwotICAgICAgaWYgKHhzZENvbXBsZXhUeXBlQ29udGVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgewotICAgICAgICBYU0RQYXJ0aWNsZUNvbnRlbnQgcGFydGljbGVDb250ZW50ID0gKChYU0RQYXJ0aWNsZSkgeHNkQ29tcGxleFR5cGVDb250ZW50KS5nZXRDb250ZW50KCk7Ci0gICAgICAgIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQocGFydGljbGVDb250ZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBnZXQgaW5oZXJpdGVkIFhTRCBNb2RlbCBHcm91cCBvZiB0aGlzIGNvbXBsZXggdHlwZQotICAgIGJvb2xlYW4gc2hvd0luaGVyaXRlZENvbnRlbnQgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U2hvd0luaGVyaXRlZENvbnRlbnQoKTsKLSAgICBpZiAoc2hvd0luaGVyaXRlZENvbnRlbnQpCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZiA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLSAgICAgIGlmICh0eXBlRGVmIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gYmFzZUNUID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgdHlwZURlZjsKLSAgICAgICAgaWYgKGJhc2VDVC5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsICYmICFiYXNlQ1QuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYmFzZUNULmdldENvbnRlbnQoKSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRENvbXBsZXhUeXBlQ29udGVudCB4c2RDb21wbGV4VHlwZUNvbnRlbnQgPSBiYXNlQ1QuZ2V0Q29udGVudCgpOwotICAgICAgICAgICAgaWYgKHhzZENvbXBsZXhUeXBlQ29udGVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RQYXJ0aWNsZUNvbnRlbnQgcGFydGljbGVDb250ZW50ID0gKChYU0RQYXJ0aWNsZSkgeHNkQ29tcGxleFR5cGVDb250ZW50KS5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgICAgIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQocGFydGljbGVDb250ZW50KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QobGlzdCwgYWRhcHRlckxpc3QpOwotICAgIHJldHVybiAoSVRyZWVFbGVtZW50W10pIGFkYXB0ZXJMaXN0LnRvQXJyYXkobmV3IElUcmVlRWxlbWVudFswXSk7Ci0gIH0KLQotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKQotICB7Ci0gICAgaWYgKGlzUmVhZE9ubHkoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTRENvbXBsZXhUeXBlZGlzLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNEQ29tcGxleFR5cGUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gIHsKLSAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgdGFyZ2V0OwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgIHJlc3VsdC5hcHBlbmQoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSA9PSBudWxsID8gImxvY2FsIHR5cGUiIDogeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIFhTRFR5cGVEZWZpbml0aW9uIGJhc2VUeXBlRGVmaW5pdGlvbiA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLSAgICBpZiAoYmFzZVR5cGVEZWZpbml0aW9uICE9IG51bGwgJiYgYmFzZVR5cGVEZWZpbml0aW9uICE9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRDb250ZW50KCkgJiYgYmFzZVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSAhPSBudWxsICYmICFYU0RDb25zdGFudHMuaXNVUlR5cGUoYmFzZVR5cGVEZWZpbml0aW9uKSkKLSAgICB7Ci0gICAgICByZXN1bHQuYXBwZW5kKCIgOiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgcmVzdWx0LmFwcGVuZChiYXNlVHlwZURlZmluaXRpb24uZ2V0UU5hbWUoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2V0QXR0cmlidXRlVXNlcyhYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLCBMaXN0IGxpc3QpCi0gIHsKLSAgICBJdGVyYXRvciBpID0gYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLmdldFJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCkuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotCi0gICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCBhdHRyR3JvdXBDb250ZW50ID0gKFhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCkgaS5uZXh0KCk7Ci0KLSAgICAgIGlmIChhdHRyR3JvdXBDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBnZXRBdHRyaWJ1dGVVc2VzKChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIGF0dHJHcm91cENvbnRlbnQsIGxpc3QpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBsaXN0LmFkZChYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGF0dHJHcm91cENvbnRlbnQpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgewotICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZ2V0WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCkuZ2V0U2NoZW1hKCkpOwotICAgIHJldHVybiAoSU1vZGVsKWFkYXB0ZXI7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQWxsb3dlZCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzQW5vbnltb3VzKCkKLSAgewotICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZURlZmluaXRpb24gPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB0YXJnZXQ7Ci0gICAgcmV0dXJuICEoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYSk7Ci0gIH0KLQotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRUb3BDb250YWluZXIoKQotICB7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQzZjk3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuVGV4dFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2V0SW5wdXRUb0dyYXBoVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uSUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklBY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklHcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5TZXRNdWx0aXBsaWNpdHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5TZXRUeXBlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlTmFtZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIGV4dGVuZHMgWFNEUGFydGljbGVBZGFwdGVyIGltcGxlbWVudHMgSUZpZWxkLCBJQWN0aW9uUHJvdmlkZXIsIElBbm5vdGF0aW9uUHJvdmlkZXIsIElHcmFwaEVsZW1lbnQKLXsKLSAgcHJvdGVjdGVkIFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHRhcmdldDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICBTdHJpbmcgbmFtZSA9IGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpOwotICAgIHJldHVybiAobmFtZSA9PSBudWxsKSA/ICIiIDogbmFtZTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpCi0gIHsKLSAgICBJVHlwZSB0eXBlID0gZ2V0VHlwZSgpOwotICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgeyAgCi0gICAgICByZXR1cm4gdHlwZS5nZXROYW1lKCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZVF1YWxpZmllcigpCi0gIHsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgfQotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHB1YmxpYyBJVHlwZSBnZXRUeXBlKCkKLSAgewotICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgIC8vaWYgKHRkICE9IG51bGwgJiYKLSAgICAvLyAgICB0ZC5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsICYmIHRkLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpKSByZXR1cm4gbnVsbDsKLSAgICByZXR1cm4gKHRkICE9IG51bGwpID8gKElUeXBlKSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KHRkKSA6IG51bGw7Ci0gIH0KLSAKLSAgcHVibGljIEltYWdlIGdldEltYWdlKCkKLSAgewotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSB0YXJnZXQ7Ci0gICAgCi0gICAgaWYgKCF4c2RFbGVtZW50RGVjbGFyYXRpb24uaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICBpZiAoaXNSZWFkT25seSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREVsZW1lbnRkaXMuZ2lmIik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RFbGVtZW50LmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaXNSZWFkT25seSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREVsZW1lbnRSZWZkaXMuZ2lmIik7Ci0gICAgICB9ICAgICAgICAKLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREVsZW1lbnRSZWYuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQotICB7Ci0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHRhcmdldDsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gcmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24gPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAvL1N0cmluZyBuYW1lID0geHNkRWxlbWVudERlY2xhcmF0aW9uICE9IHJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uID8geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFFOYW1lKCkgOiB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0TmFtZSgpOwotICAgIFN0cmluZyBuYW1lID0gcmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24uZ2V0TmFtZSgpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBpZiAobmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoTWVzc2FnZXMuX1VJX0xBQkVMX0FCU0VOVCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQuYXBwZW5kKG5hbWUpOwotICAgIH0KLQotICAgIGlmICgheHNkRWxlbWVudERlY2xhcmF0aW9uLmlzR2xvYmFsKCkpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldEVsZW1lbnQoKTsKLSAgICAgIGJvb2xlYW4gaGFzTWluT2NjdXJzID0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1JTk9DQ1VSU19BVFRSSUJVVEUpOwotICAgICAgYm9vbGVhbiBoYXNNYXhPY2N1cnMgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuTUFYT0NDVVJTX0FUVFJJQlVURSk7Ci0KLSAgICAgIGlmIChoYXNNaW5PY2N1cnMgfHwgaGFzTWF4T2NjdXJzKQotICAgICAgewotICAgICAgICByZXN1bHQuYXBwZW5kKCIgWyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChoYXNNaW5PY2N1cnMpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgbWluID0gKChYU0RQYXJ0aWNsZSkgeHNkRWxlbWVudERlY2xhcmF0aW9uLmdldENvbnRhaW5lcigpKS5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICBpZiAobWluID09IFhTRFBhcnRpY2xlLlVOQk9VTkRFRCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWluKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgLy8gcHJpbnQgZGVmYXVsdAotICAgICAgICB7Ci0gICAgICAgICAgaW50IG1pbiA9ICgoWFNEUGFydGljbGUpIHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRDb250YWluZXIoKSkuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcudmFsdWVPZihtaW4pKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaGFzTWF4T2NjdXJzKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IG1heCA9ICgoWFNEUGFydGljbGUpIHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRDb250YWluZXIoKSkuZ2V0TWF4T2NjdXJzKCk7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLi4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChtYXggPT0gWFNEUGFydGljbGUuVU5CT1VOREVEKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIioiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcudmFsdWVPZihtYXgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAvLyBwcmludCBkZWZhdWx0Ci0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKCIuLiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaW50IG1heCA9ICgoWFNEUGFydGljbGUpIHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRDb250YWluZXIoKSkuZ2V0TWF4T2NjdXJzKCk7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcudmFsdWVPZihtYXgpKTsKLQotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIl0iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLQotICAgIGlmIChyZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpID09IG51bGwgJiYgcmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24uZ2V0VHlwZURlZmluaXRpb24oKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoIiA6ICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAvLyByZXN1bHQuYXBwZW5kKHJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uLmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0UU5hbWUoeHNkRWxlbWVudERlY2xhcmF0aW9uKSk7Ci0gICAgICByZXN1bHQuYXBwZW5kKHJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uLmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgdGV4dCA9IHJlc3VsdC50b1N0cmluZygpOwotICAgIFN0cmluZyBwcm9jZXNzZWRTdHJpbmcgPSBUZXh0UHJvY2Vzc29yLnByb2Nlc3ModGV4dCwgIjoiKTsKLSAgICByZXR1cm4gcHJvY2Vzc2VkU3RyaW5nOwotCi0gIH0KLQotICBwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHRhcmdldDsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IG51bGw7Ci0gICAgaWYgKHhzZEVsZW1lbnREZWNsYXJhdGlvbi5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIHR5cGUgPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdHlwZSA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpOwotICAgICAgaWYgKHR5cGUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHlwZSA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uICYmIHR5cGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCAmJiAhdHlwZS5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKSkKLSAgICB7Ci0gICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3RUeXBlID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgdHlwZTsKLSAgICAgIGlmIChjdFR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHhzZEVsZW1lbnREZWNsYXJhdGlvbi5pc0dsb2JhbCgpKQotICAgICAgICAgIGxpc3QuYWRkKGN0VHlwZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgTGlzdCBhZGFwdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KGxpc3QsIGFkYXB0ZXJMaXN0KTsKLSAgICByZXR1cm4gKElUcmVlRWxlbWVudFtdKSBhZGFwdGVyTGlzdC50b0FycmF5KG5ldyBJVHJlZUVsZW1lbnRbMF0pOwotCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0S2luZCgpCi0gIHsKLSAgICByZXR1cm4gImVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKLSAgewotICAgIHJldHVybiBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWE7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlKCkKLSAgewotCSAgcmV0dXJuICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSB0YXJnZXQpLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCk7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVNYXhPY2N1cnNDb21tYW5kKGludCBtYXhPY2N1cnMpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVNaW5PY2N1cnNDb21tYW5kKGludCBtaW5PY2N1cnMpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVOYW1lQ29tbWFuZChTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiBuZXcgVXBkYXRlTmFtZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfTkFNRSwgZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKSwgbmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVUeXBlTmFtZUNvbW1hbmQoU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgcXVhaWxpZmllcikKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBuZXcgRGVsZXRlQ29tbWFuZCgiIiwgZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKCFpc0dsb2JhbCgpKQotICAgICAgbGlzdC5hZGQoQWRkWFNERWxlbWVudEFjdGlvbi5JRCk7Ci0KLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfU1RBUlRfSUQgKyBNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9UWVBFKTsKLSAgICBsaXN0LmFkZChTZXRUeXBlQWN0aW9uLlNFVF9ORVdfVFlQRV9JRCk7Ci0gICAgbGlzdC5hZGQoU2V0VHlwZUFjdGlvbi5TRUxFQ1RfRVhJU1RJTkdfVFlQRV9JRCk7Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX0VORF9JRCk7Ci0KLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfU1RBUlRfSUQgKyBNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9NVUxUSVBMSUNJVFkpOwotICAgIGxpc3QuYWRkKFNldE11bHRpcGxpY2l0eUFjdGlvbi5SRVFVSVJFRF9JRCk7Ci0gICAgbGlzdC5hZGQoU2V0TXVsdGlwbGljaXR5QWN0aW9uLlpFUk9fT1JfT05FX0lEKTsKLSAgICBsaXN0LmFkZChTZXRNdWx0aXBsaWNpdHlBY3Rpb24uWkVST19PUl9NT1JFX0lEKTsKLSAgICBsaXN0LmFkZChTZXRNdWx0aXBsaWNpdHlBY3Rpb24uT05FX09SX01PUkVfSUQpOyAgICAKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfRU5EX0lEKTsKLQotICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBsaXN0LmFkZChEZWxldGVBY3Rpb24uSUQpOwotICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBPYmplY3Qgc2NoZW1hID0gZ2V0RWRpdG9yU2NoZW1hKCk7Ci0gICAgaWYgKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFNjaGVtYSgpID09IHNjaGVtYSkKLSAgICB7Ci0gICAgICBpZiAoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0Q29udGFpbmVyKCkgPT0gc2NoZW1hKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChTZXRJbnB1dFRvR3JhcGhWaWV3LklEKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGxpc3QuYWRkKE9wZW5Jbk5ld0VkaXRvci5JRCk7Ci0gICAgfQotICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICBsaXN0LmFkZChTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24uSUQpOwotICAgIHJldHVybiAoU3RyaW5nIFtdKWxpc3QudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgfQotICAKLSAgcHVibGljIElNb2RlbCBnZXRNb2RlbCgpCi0gIHsKLSAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gKElNb2RlbClhZGFwdGVyOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGb2N1c0FsbG93ZWQoKQotICB7Ci0gICAgcmV0dXJuIGlzR2xvYmFsKCk7Ci0gIH0KLQotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRUb3BDb250YWluZXIoKQotICB7Ci0gICAgaWYgKCFpc0dsb2JhbCgpKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRHbG9iYWxYU0RDb250YWluZXIoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNERW1wdHlGaWVsZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTREVtcHR5RmllbGRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlOWI4ZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNERW1wdHlGaWVsZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgbm90IHVzZWQKLSAqLwotcHVibGljIGNsYXNzIFhTREVtcHR5RmllbGRBZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBJRmllbGQKLXsKLSAgU3RyaW5nIGtpbmQ7Ci0gIHB1YmxpYyBYU0RFbXB0eUZpZWxkQWRhcHRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRLaW5kKCkKLSAgewotICAgIHJldHVybiBraW5kOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRLaW5kKFN0cmluZyBraW5kKQotICB7Ci0gICAgdGhpcy5raW5kID0ga2luZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZVF1YWxpZmllcigpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgSVR5cGUgZ2V0VHlwZSgpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1pbk9jY3VycygpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1heE9jY3VycygpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU1pbk9jY3Vyc0NvbW1hbmQoaW50IG1pbk9jY3VycykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU1heE9jY3Vyc0NvbW1hbmQoaW50IG1heE9jY3VycykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZVR5cGVOYW1lQ29tbWFuZChTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBxdWFpbGlmaWVyKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlTmFtZUNvbW1hbmQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2UoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNETW9kZWxHcm91cEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRE1vZGVsR3JvdXBBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMzIxODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNETW9kZWxHcm91cEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklBY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklHcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBbnlFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNERWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTRE1vZGVsR3JvdXBBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkRlbGV0ZVhTRENvbmNyZXRlQ29tcG9uZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuU2V0TXVsdGlwbGljaXR5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuTW9kZWxHcm91cEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9zaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RNb2RlbEdyb3VwQWRhcHRlciBleHRlbmRzIFhTRFBhcnRpY2xlQWRhcHRlciBpbXBsZW1lbnRzIElBY3Rpb25Qcm92aWRlciwgSUdyYXBoRWxlbWVudAotewotICBYU0RNb2RlbEdyb3VwIGdldFhTRE1vZGVsR3JvdXAoKQotICB7Ci0gICAgcmV0dXJuIChYU0RNb2RlbEdyb3VwKSB0YXJnZXQ7Ci0gIH0KLQotICBwdWJsaWMgWFNETW9kZWxHcm91cEFkYXB0ZXIoKQotICB7Ci0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5JVHJlZUVsZW1lbnQjZ2V0SW1hZ2UoKQotICAgKi8KLSAgcHVibGljIEltYWdlIGdldEltYWdlKCkKLSAgewotICAgIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCA9IGdldFhTRE1vZGVsR3JvdXAoKTsKLSAgICBpZiAoWFNEQ29tcG9zaXRvci5DSE9JQ0VfTElURVJBTCA9PSB4c2RNb2RlbEdyb3VwLmdldENvbXBvc2l0b3IoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gTW9kZWxHcm91cEZpZ3VyZS5DSE9JQ0VfSUNPTl9JTUFHRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoWFNEQ29tcG9zaXRvci5BTExfTElURVJBTCA9PSB4c2RNb2RlbEdyb3VwLmdldENvbXBvc2l0b3IoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gTW9kZWxHcm91cEZpZ3VyZS5BTExfSUNPTl9JTUFHRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBNb2RlbEdyb3VwRmlndXJlLlNFUVVFTkNFX0lDT05fSU1BR0U7Ci0gICAgfQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLklUcmVlRWxlbWVudCNnZXRUZXh0KCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gIHsKLSAgICBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXAgPSBnZXRYU0RNb2RlbEdyb3VwKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIFN0cmluZyBuYW1lID0geHNkTW9kZWxHcm91cC5nZXRDb21wb3NpdG9yKCkuZ2V0TmFtZSgpOwotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0LmFwcGVuZChuYW1lKTsKLSAgICB9Ci0KLSAgICBFbGVtZW50IGVsZW1lbnQgPSB4c2RNb2RlbEdyb3VwLmdldEVsZW1lbnQoKTsKLQotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgYm9vbGVhbiBoYXNNaW5PY2N1cnMgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuTUlOT0NDVVJTX0FUVFJJQlVURSk7Ci0gICAgICBib29sZWFuIGhhc01heE9jY3VycyA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5NQVhPQ0NVUlNfQVRUUklCVVRFKTsKLQotICAgICAgaWYgKGhhc01pbk9jY3VycyB8fCBoYXNNYXhPY2N1cnMpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiBbIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKGhhc01pbk9jY3VycykKLSAgICAgICAgewotICAgICAgICAgIGludCBtaW4gPSAoKFhTRFBhcnRpY2xlKSB4c2RNb2RlbEdyb3VwLmdldENvbnRhaW5lcigpKS5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICBpZiAobWluID09IFhTRFBhcnRpY2xlLlVOQk9VTkRFRCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWluKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgLy8gcHJpbnQgZGVmYXVsdAotICAgICAgICB7Ci0gICAgICAgICAgaW50IG1pbiA9ICgoWFNEUGFydGljbGUpIHhzZE1vZGVsR3JvdXAuZ2V0Q29udGFpbmVyKCkpLmdldE1pbk9jY3VycygpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWluKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhhc01heE9jY3VycykKLSAgICAgICAgewotICAgICAgICAgIGludCBtYXggPSAoKFhTRFBhcnRpY2xlKSB4c2RNb2RlbEdyb3VwLmdldENvbnRhaW5lcigpKS5nZXRNYXhPY2N1cnMoKTsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKCIuLiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYgKG1heCA9PSBYU0RQYXJ0aWNsZS5VTkJPVU5ERUQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiKiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG1heCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIC8vIHByaW50IGRlZmF1bHQKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi4uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpbnQgbWF4ID0gKChYU0RQYXJ0aWNsZSkgeHNkTW9kZWxHcm91cC5nZXRDb250YWluZXIoKSkuZ2V0TWF4T2NjdXJzKCk7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcudmFsdWVPZihtYXgpKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKCJdIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIElUcmVlRWxlbWVudFtdIGdldENoaWxkcmVuKCkKLSAgewotICAgIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCA9IGdldFhTRE1vZGVsR3JvdXAoKTsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0geHNkTW9kZWxHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgIE9iamVjdCBvYmplY3QgPSBpLm5leHQoKTsKLSAgICAgICBYU0RQYXJ0aWNsZUNvbnRlbnQgcGFydGljbGUgPSAoKFhTRFBhcnRpY2xlKW9iamVjdCkuZ2V0Q29udGVudCgpOwotICAgICAgIGlmIChwYXJ0aWNsZSBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgICB7Ci0gICAgICAgICBsaXN0LmFkZChwYXJ0aWNsZSk7Ci0gICAgICAgfQotICAgICAgIGVsc2UgaWYgKHBhcnRpY2xlIGluc3RhbmNlb2YgWFNEV2lsZGNhcmQpCi0gICAgICAgewotICAgICAgICAgbGlzdC5hZGQocGFydGljbGUpOwotICAgICAgIH0KLSAgICAgICBlbHNlIGlmIChwYXJ0aWNsZSBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICAgewotICAgICAgICAgbGlzdC5hZGQocGFydGljbGUpOwotICAgICAgIH0KLSAgICAgICBlbHNlIGlmIChwYXJ0aWNsZSBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgIHsgCi0gICAgCSAvL2xpc3QuYWRkKCgoWFNETW9kZWxHcm91cERlZmluaXRpb24pcGFydGljbGUpLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKSk7Ci0gICAgCSBsaXN0LmFkZChwYXJ0aWNsZSk7Ci0gICAgICAgfQotICAgIH0KLQotICAgIExpc3QgYWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcG9wdWxhdGVBZGFwdGVyTGlzdChsaXN0LCBhZGFwdGVyTGlzdCk7Ci0gICAgcmV0dXJuIChJVHJlZUVsZW1lbnQgW10pIGFkYXB0ZXJMaXN0LnRvQXJyYXkobmV3IElUcmVlRWxlbWVudFswXSk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgWFNETW9kZWxHcm91cCBlbGVtZW50ID0gKFhTRE1vZGVsR3JvdXApIG9iamVjdDsKLSAgICByZXR1cm4gZWxlbWVudC5nZXRDb250YWluZXIoKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXIjZ2V0QWN0aW9ucyhqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgICBDb2xsZWN0aW9uIGFjdGlvbklEcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgYWN0aW9uSURzLmFkZChBZGRYU0RFbGVtZW50QWN0aW9uLklEKTsKLSAgICAgYWN0aW9uSURzLmFkZChBZGRYU0RFbGVtZW50QWN0aW9uLlJFRl9JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoQWRkWFNEQW55RWxlbWVudEFjdGlvbi5JRCk7Ci0gICAgIC8vIEFkZCBFbGVtZW50IFJlZgotICAgICBhY3Rpb25JRHMuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICAgYWN0aW9uSURzLmFkZChBZGRYU0RNb2RlbEdyb3VwQWN0aW9uLlNFUVVFTkNFX0lEKTsKLSAgICAgYWN0aW9uSURzLmFkZChBZGRYU0RNb2RlbEdyb3VwQWN0aW9uLkNIT0lDRV9JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoQWRkWFNETW9kZWxHcm91cEFjdGlvbi5BTExfSUQpOwotICAgICBhY3Rpb25JRHMuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICAgYWN0aW9uSURzLmFkZChBZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFjdGlvbi5NT0RFTEdST1VQREVGSU5JVElPTlJFRl9JRCk7Ci0vLyAgICAgYWN0aW9uSURzLmFkZChBZGRGaWVsZEFjdGlvbi5JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgICAvLyBBZGQgQW55Ci0KLSAgICAgYWN0aW9uSURzLmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfU1RBUlRfSUQgKyBNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9NVUxUSVBMSUNJVFkpOwotICAgICBhY3Rpb25JRHMuYWRkKFNldE11bHRpcGxpY2l0eUFjdGlvbi5SRVFVSVJFRF9JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoU2V0TXVsdGlwbGljaXR5QWN0aW9uLlpFUk9fT1JfT05FX0lEKTsKLSAgICAgYWN0aW9uSURzLmFkZChTZXRNdWx0aXBsaWNpdHlBY3Rpb24uWkVST19PUl9NT1JFX0lEKTsKLSAgICAgYWN0aW9uSURzLmFkZChTZXRNdWx0aXBsaWNpdHlBY3Rpb24uT05FX09SX01PUkVfSUQpOyAgICAKLSAgICAgYWN0aW9uSURzLmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfRU5EX0lEKTsKLSAgICAKLSAgICAgaWYgKCEoZ2V0UGFyZW50KHRhcmdldCkgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikpCi0gICAgIHsKLSAgICAgICBhY3Rpb25JRHMuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICAgICBhY3Rpb25JRHMuYWRkKERlbGV0ZVhTRENvbmNyZXRlQ29tcG9uZW50QWN0aW9uLkRFTEVURV9YU0RfQ09NUE9ORU5UX0lEKTsKLSAgICAgfSAgICAKLSAgICAgYWN0aW9uSURzLmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLklEKTsKLSAgICAgICAgCi0gICAgIHJldHVybiAoU3RyaW5nIFtdKWFjdGlvbklEcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRNYXhPY2N1cnMoKQotICB7Ci0gICAgcmV0dXJuIGdldE1heE9jY3VycyhnZXRYU0RNb2RlbEdyb3VwKCkpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRNaW5PY2N1cnMoKQotICB7Ci0gICAgcmV0dXJuIGdldE1pbk9jY3VycyhnZXRYU0RNb2RlbEdyb3VwKCkpOwotICB9Ci0KLSAgcHVibGljIElBRFRPYmplY3QgZ2V0VG9wQ29udGFpbmVyKCkKLSAgewotICAgIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCA9IGdldFhTRE1vZGVsR3JvdXAoKTsKLSAgICByZXR1cm4gZ2V0R2xvYmFsWFNEQ29udGFpbmVyKHhzZE1vZGVsR3JvdXApOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGb2N1c0FsbG93ZWQoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YmFhMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNldElucHV0VG9HcmFwaFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLklUcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTREVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RNb2RlbEdyb3VwQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuRGVsZXRlWFNEQ29uY3JldGVDb21wb25lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5TZXRNdWx0aXBsaWNpdHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyIGV4dGVuZHMgWFNEUGFydGljbGVBZGFwdGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZSwgSUFjdGlvblByb3ZpZGVyLCBJR3JhcGhFbGVtZW50LCBJQURUT2JqZWN0TGlzdGVuZXIKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBNT0RFTF9HUk9VUF9JQ09OID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREdyb3VwLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgTU9ERUxfR1JPVVBfRElTQUJMRURfSUNPTiA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9YU0RHcm91cGRpcy5naWYiKTsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIE1PREVMX0dST1VQX1JFRl9JQ09OID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREdyb3VwUmVmLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgTU9ERUxfR1JPVVBfUkVGX0RJU0FCTEVEX0lDT04gPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNER3JvdXBSZWZkaXMuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotICBwcm90ZWN0ZWQgTGlzdCBmaWVsZHMgPSBudWxsOwotICBwcm90ZWN0ZWQgTGlzdCBvdGhlclRoaW5nc1RvTGlzdGVuVG8gPSBudWxsOwotICAKLSAgcHVibGljIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGdldFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIHRhcmdldDsKLSAgfQotCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbiA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgdGFyZ2V0OwotCi0gICAgaWYgKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICBpZiAoaXNSZWFkT25seSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gTU9ERUxfR1JPVVBfUkVGX0RJU0FCTEVEX0lDT047Ci0gICAgICB9Ci0gICAgICByZXR1cm4gTU9ERUxfR1JPVVBfUkVGX0lDT047Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaXNSZWFkT25seSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gTU9ERUxfR1JPVVBfRElTQUJMRURfSUNPTjsKLSAgICAgIH0KLSAgICAgIHJldHVybiBNT0RFTF9HUk9VUF9JQ09OOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gIHsKLSAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbiA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgdGFyZ2V0OwotICAgIFN0cmluZyByZXN1bHQgPSB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkgPyB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRRTmFtZSgpIDogeHNkTW9kZWxHcm91cERlZmluaXRpb24uZ2V0TmFtZSgpOwotICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/IE1lc3NhZ2VzLl9VSV9MQUJFTF9BQlNFTlQgOiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCA9ICgoWFNETW9kZWxHcm91cERlZmluaXRpb24pIHRhcmdldCkuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldE1vZGVsR3JvdXAoKTsKLSAgICBpZiAoeHNkTW9kZWxHcm91cCAhPSBudWxsKQotICAgICAgbGlzdC5hZGQoeHNkTW9kZWxHcm91cCk7Ci0KLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QobGlzdCwgYWRhcHRlckxpc3QpOwotICAgIHJldHVybiAoSVRyZWVFbGVtZW50W10pIGFkYXB0ZXJMaXN0LnRvQXJyYXkobmV3IElUcmVlRWxlbWVudFswXSk7Ci0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXIjZ2V0QWN0aW9ucyhqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIENvbGxlY3Rpb24gbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIGlmICghZ2V0WFNETW9kZWxHcm91cERlZmluaXRpb24oKS5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgICAgbGlzdC5hZGQoQWRkWFNERWxlbWVudEFjdGlvbi5JRCk7Ci0gICAgICBsaXN0LmFkZChBZGRYU0RFbGVtZW50QWN0aW9uLlJFRl9JRCk7Ci0gICAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgICBsaXN0LmFkZChBZGRYU0RNb2RlbEdyb3VwQWN0aW9uLlNFUVVFTkNFX0lEKTsKLSAgICAgIGxpc3QuYWRkKEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24uQ0hPSUNFX0lEKTsKLSAgICAgIGxpc3QuYWRkKEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24uQUxMX0lEKTsKLSAgICAgIGxpc3QuYWRkKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKTsKLSAgICB9Ci0gICAgCi0gICAgbGlzdC5hZGQoRGVsZXRlWFNEQ29uY3JldGVDb21wb25lbnRBY3Rpb24uREVMRVRFX1hTRF9DT01QT05FTlRfSUQpOwotICAgIAotICAgIGlmIChnZXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfU1RBUlRfSUQgKyBNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9NVUxUSVBMSUNJVFkpOwotICAgICAgbGlzdC5hZGQoU2V0TXVsdGlwbGljaXR5QWN0aW9uLlJFUVVJUkVEX0lEKTsKLSAgICAgIGxpc3QuYWRkKFNldE11bHRpcGxpY2l0eUFjdGlvbi5aRVJPX09SX09ORV9JRCk7Ci0gICAgICBsaXN0LmFkZChTZXRNdWx0aXBsaWNpdHlBY3Rpb24uWkVST19PUl9NT1JFX0lEKTsKLSAgICAgIGxpc3QuYWRkKFNldE11bHRpcGxpY2l0eUFjdGlvbi5PTkVfT1JfTU9SRV9JRCk7ICAgIAotICAgICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TVUJNRU5VX0VORF9JRCk7IAotICAgIH0KLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgT2JqZWN0IHNjaGVtYSA9IGdldEVkaXRvclNjaGVtYSgpOwotICAgIGlmIChnZXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldFNjaGVtYSgpID09IHNjaGVtYSkKLSAgICB7Ci0gICAgICBpZiAoZ2V0WFNETW9kZWxHcm91cERlZmluaXRpb24oKS5nZXRDb250YWluZXIoKSA9PSBzY2hlbWEpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKFNldElucHV0VG9HcmFwaFZpZXcuSUQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbGlzdC5hZGQoT3BlbkluTmV3RWRpdG9yLklEKTsKLSAgICB9Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIGxpc3QuYWRkKFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbi5JRCk7Ci0KLSAgICByZXR1cm4gKFN0cmluZyBbXSlsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRBZGROZXdGaWVsZENvbW1hbmQoU3RyaW5nIGZpZWxkS2luZCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBEZWxldGVDb21tYW5kKCIiLCBnZXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgLy8gVE9ETyBDb21tb24gdGhpcyB1cCB3aXRoIFhTRENvbXBsZXhUeXBlJ3MuICBTZWUgYWxzbyBnZXRGaWVsZHMgCi0gIHByb3RlY3RlZCB2b2lkIGNsZWFyRmllbGRzKCkKLSAgewotICAgIGlmIChvdGhlclRoaW5nc1RvTGlzdGVuVG8gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvdGhlclRoaW5nc1RvTGlzdGVuVG8uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcikgaS5uZXh0KCk7Ci0gICAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUFEVE9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIElBRFRPYmplY3QgYWR0T2JqZWN0ID0gKElBRFRPYmplY3QpIGFkYXB0ZXI7Ci0gICAgICAgICAgYWR0T2JqZWN0LnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBmaWVsZHMgPSBudWxsOwotICAgIG90aGVyVGhpbmdzVG9MaXN0ZW5UbyA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRGaWVsZHMoKQotICB7Ci0gICAgTGlzdCBmaWVsZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgb3RoZXJUaGluZ3NUb0xpc3RlblRvID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFhTRFZpc2l0b3JGb3JGaWVsZHMgdmlzaXRvciA9IG5ldyBYU0RWaXNpdG9yRm9yRmllbGRzKCk7Ci0gICAgdmlzaXRvci52aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKGdldFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCkpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QodmlzaXRvci5jb25jcmV0ZUNvbXBvbmVudExpc3QsIGZpZWxkcyk7Ci0gICAgCi0gICAgLy8gVE9ETyAoY3MpIGNvbW1vbiBhIGJhc2UgY2xhc3MgZm9yIGEgc3RydWN0dXJlIHRoaW5nZWUKLSAgICAvLwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QodmlzaXRvci50aGluZ3NXZU5lZWRUb0xpc3RlblRvLCBvdGhlclRoaW5nc1RvTGlzdGVuVG8pOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IG90aGVyVGhpbmdzVG9MaXN0ZW5Uby5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGkubmV4dCgpOwotICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQURUT2JqZWN0KQotICAgICAgewotICAgICAgICBJQURUT2JqZWN0IGFkdE9iamVjdCA9IChJQURUT2JqZWN0KSBhZGFwdGVyOwotICAgICAgICBhZHRPYmplY3QucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZpZWxkczsKLSAgfQotCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChnZXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldFNjaGVtYSgpKTsKLSAgICByZXR1cm4gKElNb2RlbClhZGFwdGVyOwotICB9Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0VGV4dCgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGb2N1c0FsbG93ZWQoKQotICB7Ci0gICAgWFNETW9kZWxHcm91cERlZmluaXRpb24geHNkTW9kZWxHcm91cERlZmluaXRpb24gPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIHRhcmdldDsKLSAgICBpZiAoeHNkTW9kZWxHcm91cERlZmluaXRpb24uaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgIHsgCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIGNsZWFyRmllbGRzKCk7Ci0gICAgbm90aWZ5TGlzdGVuZXJzKHRoaXMsIG51bGwpOwotICB9Ci0gIAotICBwdWJsaWMgaW50IGdldE1heE9jY3VycygpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWF4T2NjdXJzKGdldFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCkpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRNaW5PY2N1cnMoKQotICB7Ci0gICAgcmV0dXJuIGdldE1pbk9jY3VycyhnZXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpKTsKLSAgfQotCi0gIHB1YmxpYyBJQURUT2JqZWN0IGdldFRvcENvbnRhaW5lcigpCi0gIHsKLSAgICByZXR1cm4gZ2V0R2xvYmFsWFNEQ29udGFpbmVyKGdldFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKCkpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFBhcnRpY2xlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEUGFydGljbGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNjY0OWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEUGFydGljbGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uSUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotCi1wdWJsaWMgY2xhc3MgWFNEUGFydGljbGVBZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBJQW5ub3RhdGlvblByb3ZpZGVyCi17Ci0gIHB1YmxpYyBYU0RQYXJ0aWNsZUFkYXB0ZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TWF4T2NjdXJzKCkKLSAgewotICAgIHJldHVybiBnZXRNYXhPY2N1cnMoKFhTRENvbmNyZXRlQ29tcG9uZW50KSB0YXJnZXQpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRNaW5PY2N1cnMoKQotICB7Ci0gICAgcmV0dXJuIGdldE1pbk9jY3VycygoWFNEQ29uY3JldGVDb21wb25lbnQpIHRhcmdldCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGludCBnZXRNaW5PY2N1cnMoWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgaW50IG1pbk9jY3VyID0gLTI7Ci0gICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gY29tcG9uZW50LmdldENvbnRhaW5lcigpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCgoWFNEUGFydGljbGUpIG8pLmlzU2V0TWluT2NjdXJzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtaW5PY2N1ciA9ICgoWFNEUGFydGljbGUpIG8pLmdldE1pbk9jY3VycygpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWluT2NjdXI7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGludCBnZXRNYXhPY2N1cnMoWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgaW50IG1heE9jY3VyID0gLTI7Ci0gICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gY29tcG9uZW50LmdldENvbnRhaW5lcigpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCgoWFNEUGFydGljbGUpIG8pLmlzU2V0TWF4T2NjdXJzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXhPY2N1ciA9ICgoWFNEUGFydGljbGUpIG8pLmdldE1heE9jY3VycygpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWF4T2NjdXI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVBbm5vdGF0aW9uU3RyaW5nKCkKLSAgewotICAgIHJldHVybiBidWlsZEFubm90YXRpb25TdHJpbmcodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVBbm5vdGF0aW9uVG9vbFRpcFN0cmluZygpCi0gIHsKLSAgICByZXR1cm4gYnVpbGRBbm5vdGF0aW9uU3RyaW5nKGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZUFubm90YXRpb25TdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVBbm5vdGF0aW9uVG9vbFRpcFN0cmluZygpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgYnVpbGRBbm5vdGF0aW9uU3RyaW5nKGJvb2xlYW4gaXNGb3JMYWJlbCkKLSAgewotICAgIFN0cmluZyBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIHRvb2xUaXBEZXNjcmlwdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgLy8gVE9ETzogc2V0IGludCB2YWx1ZXMgYXMgZGVmaW5lZCBjb25zdGFudHMKLSAgICAvLyAtMiBtZWFucyB0aGUgdXNlciBkaWRuJ3Qgc3BlY2lmeSAoc28gdGhlIGRlZmF1bHQgaXMgMSkKLSAgICBpbnQgbWluT2NjdXJzID0gZ2V0TWluT2NjdXJzKCk7Ci0gICAgaW50IG1heE9jY3VycyA9IGdldE1heE9jY3VycygpOwotCi0gICAgLy8gVGhpcyBpcyBmb3IgdGhlIGF0dHJpYnV0ZSBmaWVsZCBjYXNlLCB3aGljaCBoYXMgbm8KLSAgICAvLyBvY2N1cnJlbmNlIGF0dHJpYnV0ZXMKLSAgICBpZiAobWluT2NjdXJzID09IC0zICYmIG1heE9jY3VycyA9PSAtMykKLSAgICB7Ci0gICAgICBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGVsc2UgaWYgKG1pbk9jY3VycyA9PSAwICYmIChtYXhPY2N1cnMgPT0gLTIgfHwgbWF4T2NjdXJzID09IDEpKQotICAgIHsKLSAgICAgIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gIlswLi4xXSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHRvb2xUaXBEZXNjcmlwdGlvbiA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9PUFRJT05BTDsKLSAgICB9Ci0gICAgZWxzZSBpZiAobWluT2NjdXJzID09IDAgJiYgbWF4T2NjdXJzID09IC0xKQotICAgIHsKLSAgICAgIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gIlswLi4qXSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHRvb2xUaXBEZXNjcmlwdGlvbiA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9aRVJPX09SX01PUkU7Ci0gICAgfQotICAgIGVsc2UgaWYgKChtaW5PY2N1cnMgPT0gMSAmJiBtYXhPY2N1cnMgPT0gLTEpIHx8IChtaW5PY2N1cnMgPT0gLTIgJiYgbWF4T2NjdXJzID09IC0xKSkKLSAgICB7Ci0gICAgICBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9ICJbMS4uKl0iOyAvLyROT04tTkxTLTEkCi0gICAgICB0b29sVGlwRGVzY3JpcHRpb24gPSBNZXNzYWdlcy5fVUlfTEFCRUxfT05FX09SX01PUkU7Ci0gICAgfQotICAgIGVsc2UgaWYgKChtaW5PY2N1cnMgPT0gMSAmJiBtYXhPY2N1cnMgPT0gMSkgfHwgKG1pbk9jY3VycyA9PSAtMiAmJiBtYXhPY2N1cnMgPT0gMSkgfHwgKG1pbk9jY3VycyA9PSAxICYmIG1heE9jY3VycyA9PSAtMikpCi0gICAgewotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSAiWzEuLjFdIjsgLy8kTk9OLU5MUy0xJAotICAgICAgdG9vbFRpcERlc2NyaXB0aW9uID0gTWVzc2FnZXMuX1VJX0xBQkVMX1JFUVVJUkVEOwotICAgIH0KLSAgICBlbHNlIGlmIChtaW5PY2N1cnMgPT0gLTIgJiYgbWF4T2NjdXJzID09IC0yKQotICAgIHsKLSAgICAgIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIC8vIG5vbmUgc3BlY2lmaWVkLCBzbyBkb24ndCBoYXZlIGFueSB0b29sVGlwIGRlc2NyaXB0aW9uCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobWF4T2NjdXJzID09IC0yKQotICAgICAgICBtYXhPY2N1cnMgPSAxOwotICAgICAgU3RyaW5nIG1heFN5bWJvbCA9IG1heE9jY3VycyA9PSAtMSA/ICIqIiA6ICIiICsgbWF4T2NjdXJzOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIFN0cmluZyBtaW5TeW1ib2wgPSBtaW5PY2N1cnMgPT0gLTIgPyAiMSIgOiAiIiArIG1pbk9jY3VyczsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9ICJbIiArIG1pblN5bWJvbCArICIuLiIgKyBtYXhTeW1ib2wgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgICB0b29sVGlwRGVzY3JpcHRpb24gPSBNZXNzYWdlcy5fVUlfTEFCRUxfQVJSQVk7Ci0gICAgfQotCi0gICAgaWYgKGlzRm9yTGFiZWwpCi0gICAgewotICAgICAgcmV0dXJuIG9jY3VyZW5jZURlc2NyaXB0aW9uOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIHRvb2xUaXBEZXNjcmlwdGlvbjsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEU2NoZW1hQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEU2NoZW1hQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzc4Zjg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFNjaGVtYUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNERWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbmNsdWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hQWRhcHRlciBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgSUFjdGlvblByb3ZpZGVyLCBJTW9kZWwsIElBRFRPYmplY3RMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgTGlzdCB0eXBlcyA9IG51bGw7Ci0gIHByb3RlY3RlZCBMaXN0IGNoaWxkcmVuLCBhbGxDaGlsZHJlbjsKLQotICBwcm90ZWN0ZWQgQ2F0ZWdvcnlBZGFwdGVyIGZEaXJlY3RpdmVzQ2F0ZWdvcnk7Ci0gIHByb3RlY3RlZCBDYXRlZ29yeUFkYXB0ZXIgZkVsZW1lbnRzQ2F0ZWdvcnk7Ci0gIHByb3RlY3RlZCBDYXRlZ29yeUFkYXB0ZXIgZkF0dHJpYnV0ZXNDYXRlZ29yeTsKLSAgcHJvdGVjdGVkIENhdGVnb3J5QWRhcHRlciBmVHlwZXNDYXRlZ29yeTsKLSAgcHJvdGVjdGVkIENhdGVnb3J5QWRhcHRlciBmR3JvdXBzQ2F0ZWdvcnk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhbGwgdGhlIGNhdGVnb3J5IGFkYXB0ZXJzCi0gICAqIAotICAgKiBAcGFyYW0geHNkU2NoZW1hCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDYXRlZ29yeUFkYXB0ZXJzKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBMaXN0IGRpcmVjdGl2ZXNMaXN0ID0gZ2V0RGlyZWN0aXZlcyh4c2RTY2hlbWEpOwotICAgIExpc3QgZWxlbWVudHNMaXN0ID0gZ2V0R2xvYmFsRWxlbWVudHMoeHNkU2NoZW1hKTsKLSAgICBMaXN0IGF0dHJpYnV0ZXNMaXN0ID0gZ2V0QXR0cmlidXRlTGlzdCh4c2RTY2hlbWEpOwotICAgIExpc3QgZ3JvdXBzID0gZ2V0R3JvdXBzKHhzZFNjaGVtYSk7Ci0gICAgTGlzdCB0eXBlcyA9IGdldENvbXBsZXhUeXBlcyh4c2RTY2hlbWEpOwotICAgIHR5cGVzLmFkZEFsbChnZXRTaW1wbGVUeXBlcyh4c2RTY2hlbWEpKTsKLQotICAgIGZEaXJlY3RpdmVzQ2F0ZWdvcnkgPSBuZXcgQ2F0ZWdvcnlBZGFwdGVyKE1lc3NhZ2VzLl9VSV9HUkFQSF9ESVJFQ1RJVkVTLCBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEljb25JbWFnZSgib2JqMTYvZGlyZWN0aXZlc2hlYWRlciIpLCBkaXJlY3RpdmVzTGlzdCwgeHNkU2NoZW1hLCBDYXRlZ29yeUFkYXB0ZXIuRElSRUNUSVZFUyk7IC8vJE5PTi1OTFMtMSQKLSAgICBmRGlyZWN0aXZlc0NhdGVnb3J5LnNldEFsbENoaWxkcmVuKGRpcmVjdGl2ZXNMaXN0KTsKLSAgICByZWdpc3Rlckxpc3RlbmVyKGZEaXJlY3RpdmVzQ2F0ZWdvcnkpOwotCi0gICAgZkVsZW1lbnRzQ2F0ZWdvcnkgPSBuZXcgQ2F0ZWdvcnlBZGFwdGVyKE1lc3NhZ2VzLl9VSV9HUkFQSF9FTEVNRU5UUywgWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJY29uSW1hZ2UoIm9iajE2L2VsZW1lbnRzaGVhZGVyIiksIGVsZW1lbnRzTGlzdCwgeHNkU2NoZW1hLCBDYXRlZ29yeUFkYXB0ZXIuRUxFTUVOVFMpOyAgLy8kTk9OLU5MUy0xJAotICAgIGZFbGVtZW50c0NhdGVnb3J5LnNldEFsbENoaWxkcmVuKGdldEdsb2JhbEVsZW1lbnRzKHhzZFNjaGVtYSwgdHJ1ZSkpOwotICAgIHJlZ2lzdGVyTGlzdGVuZXIoZkVsZW1lbnRzQ2F0ZWdvcnkpOwotCi0gICAgZkF0dHJpYnV0ZXNDYXRlZ29yeSA9IG5ldyBDYXRlZ29yeUFkYXB0ZXIoTWVzc2FnZXMuX1VJX0dSQVBIX0FUVFJJQlVURVMsIFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWNvbkltYWdlKCJvYmoxNi9hdHRyaWJ1dGVzaGVhZGVyIiksIGF0dHJpYnV0ZXNMaXN0LCB4c2RTY2hlbWEsIENhdGVnb3J5QWRhcHRlci5BVFRSSUJVVEVTKTsgICAvLyROT04tTkxTLTEkCi0gICAgZkF0dHJpYnV0ZXNDYXRlZ29yeS5zZXRBbGxDaGlsZHJlbihhdHRyaWJ1dGVzTGlzdCk7Ci0gICAgcmVnaXN0ZXJMaXN0ZW5lcihmQXR0cmlidXRlc0NhdGVnb3J5KTsKLQotICAgIGZUeXBlc0NhdGVnb3J5ID0gbmV3IENhdGVnb3J5QWRhcHRlcihNZXNzYWdlcy5fVUlfR1JBUEhfVFlQRVMsIFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWNvbkltYWdlKCJvYmoxNi90eXBlc2hlYWRlciIpLCB0eXBlcywgeHNkU2NoZW1hLCBDYXRlZ29yeUFkYXB0ZXIuVFlQRVMpOyAgLy8kTk9OLU5MUy0xJAotICAgIGZUeXBlc0NhdGVnb3J5LnNldEFsbENoaWxkcmVuKGdldFR5cGVzKHhzZFNjaGVtYSwgdHJ1ZSkpOwotICAgIHJlZ2lzdGVyTGlzdGVuZXIoZlR5cGVzQ2F0ZWdvcnkpOwotCi0gICAgZkdyb3Vwc0NhdGVnb3J5ID0gbmV3IENhdGVnb3J5QWRhcHRlcihNZXNzYWdlcy5fVUlfR1JBUEhfR1JPVVBTLCBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEljb25JbWFnZSgib2JqMTYvZ3JvdXBzaGVhZGVyIiksIGdyb3VwcywgeHNkU2NoZW1hLCBDYXRlZ29yeUFkYXB0ZXIuR1JPVVBTKTsgLy8kTk9OLU5MUy0xJAotICAgIGZHcm91cHNDYXRlZ29yeS5zZXRBbGxDaGlsZHJlbihncm91cHMpOwotICAgIHJlZ2lzdGVyTGlzdGVuZXIoZkdyb3Vwc0NhdGVnb3J5KTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldFR5cGVzKCkKLSAgewotICAgIGlmICh0eXBlcyA9PSBudWxsKQotICAgIHsKLSAgICAgIHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpIHRhcmdldDsKLSAgICAgIExpc3QgY29uY3JldGVDb21wb25lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gc2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpIGkubmV4dCgpOwotICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKGNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHBvcHVsYXRlQWRhcHRlckxpc3QoY29uY3JldGVDb21wb25lbnRMaXN0LCB0eXBlcyk7Ci0gICAgfQotICAgIHJldHVybiB0eXBlczsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTYW1lTmFtZXNwYWNlKFN0cmluZyBuczEsIFN0cmluZyBuczIpCi0gIHsKLSAgICBpZiAobnMxID09IG51bGwpIG5zMSA9ICIiOwotICAgIGlmIChuczIgPT0gbnVsbCkgbnMyID0gIiI7Ci0gICAgCi0gICAgaWYgKG5zMS5lcXVhbHMobnMyKSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLklUcmVlRWxlbWVudCNnZXRDaGlsZHJlbigpCi0gICAqLwotICBwdWJsaWMgSVRyZWVFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IChYU0RTY2hlbWEpIGdldFRhcmdldCgpOwotCi0gICAgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvLyBqdXN0IHNldCBjYXRlZ29yeWFkYXB0ZXJzJyBjaGlsZHJlbiBpZiBjYXRlZ29yeSBhZGFwdGVycyBhcmUKLSAgICAvLyBhbHJlYWR5IGNyZWF0ZWQKLSAgICBpZiAoZkRpcmVjdGl2ZXNDYXRlZ29yeSAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3QgZGlyZWN0aXZlc0xpc3QgPSBnZXREaXJlY3RpdmVzKHhzZFNjaGVtYSk7Ci0gICAgICBMaXN0IGVsZW1lbnRzTGlzdCA9IGdldEdsb2JhbEVsZW1lbnRzKHhzZFNjaGVtYSk7Ci0gICAgICBMaXN0IGF0dHJpYnV0ZXNMaXN0ID0gZ2V0QXR0cmlidXRlTGlzdCh4c2RTY2hlbWEpOwotICAgICAgTGlzdCBncm91cHMgPSBnZXRHcm91cHMoeHNkU2NoZW1hKTsKLSAgICAgIExpc3QgdHlwZXMgPSBnZXRDb21wbGV4VHlwZXMoeHNkU2NoZW1hKTsKLSAgICAgIHR5cGVzLmFkZEFsbChnZXRTaW1wbGVUeXBlcyh4c2RTY2hlbWEpKTsKLQotICAgICAgZkRpcmVjdGl2ZXNDYXRlZ29yeS5zZXRDaGlsZHJlbihkaXJlY3RpdmVzTGlzdCk7Ci0gICAgICBmRGlyZWN0aXZlc0NhdGVnb3J5LnNldEFsbENoaWxkcmVuKGRpcmVjdGl2ZXNMaXN0KTsKLSAgICAgIGZFbGVtZW50c0NhdGVnb3J5LnNldENoaWxkcmVuKGVsZW1lbnRzTGlzdCk7Ci0gICAgICBmRWxlbWVudHNDYXRlZ29yeS5zZXRBbGxDaGlsZHJlbihnZXRHbG9iYWxFbGVtZW50cyh4c2RTY2hlbWEsIHRydWUpKTsKLSAgICAgIGZBdHRyaWJ1dGVzQ2F0ZWdvcnkuc2V0Q2hpbGRyZW4oYXR0cmlidXRlc0xpc3QpOwotICAgICAgZkF0dHJpYnV0ZXNDYXRlZ29yeS5zZXRBbGxDaGlsZHJlbihnZXRBdHRyaWJ1dGVMaXN0KHhzZFNjaGVtYSwgdHJ1ZSkpOwotICAgICAgZlR5cGVzQ2F0ZWdvcnkuc2V0Q2hpbGRyZW4odHlwZXMpOwotICAgICAgZlR5cGVzQ2F0ZWdvcnkuc2V0QWxsQ2hpbGRyZW4oZ2V0VHlwZXMoeHNkU2NoZW1hLCB0cnVlKSk7Ci0gICAgICBmR3JvdXBzQ2F0ZWdvcnkuc2V0Q2hpbGRyZW4oZ3JvdXBzKTsKLSAgICAgIGZHcm91cHNDYXRlZ29yeS5zZXRBbGxDaGlsZHJlbihnZXRHcm91cHMoeHNkU2NoZW1hLCB0cnVlKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjcmVhdGVDYXRlZ29yeUFkYXB0ZXJzKHhzZFNjaGVtYSk7Ci0gICAgfQotCi0gICAgY2hpbGRyZW4uYWRkKGZEaXJlY3RpdmVzQ2F0ZWdvcnkpOwotICAgIGNoaWxkcmVuLmFkZChmRWxlbWVudHNDYXRlZ29yeSk7Ci0gICAgY2hpbGRyZW4uYWRkKGZBdHRyaWJ1dGVzQ2F0ZWdvcnkpOwotICAgIGNoaWxkcmVuLmFkZChmVHlwZXNDYXRlZ29yeSk7Ci0gICAgY2hpbGRyZW4uYWRkKGZHcm91cHNDYXRlZ29yeSk7Ci0KLSAgICByZXR1cm4gKElUcmVlRWxlbWVudFtdKSBjaGlsZHJlbi50b0FycmF5KG5ldyBJVHJlZUVsZW1lbnRbMF0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbXNnKQotICB7Ci0gICAgY2xhc3MgQ2F0ZWdvcnlOb3RpZmljYXRpb24gZXh0ZW5kcyBOb3RpZmljYXRpb25JbXBsCi0gICAgewotICAgICAgcHJvdGVjdGVkIE9iamVjdCBjYXRlZ29yeTsKLQotICAgICAgcHVibGljIENhdGVnb3J5Tm90aWZpY2F0aW9uKE9iamVjdCBjYXRlZ29yeSkKLSAgICAgIHsKLSAgICAgICAgc3VwZXIobXNnLmdldEV2ZW50VHlwZSgpLCBtc2cuZ2V0T2xkVmFsdWUoKSwgbXNnLmdldE5ld1ZhbHVlKCksIG1zZy5nZXRQb3NpdGlvbigpKTsKLSAgICAgICAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OwotICAgICAgfQotCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldE5vdGlmaWVyKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNhdGVnb3J5OwotICAgICAgfQotCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldEZlYXR1cmUoKQotICAgICAgewotICAgICAgICByZXR1cm4gbXNnLmdldEZlYXR1cmUoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBnZXRDaGlsZHJlbigpOwotICAgIH0KLSAgICAKLSAgICBPYmplY3QgbmV3VmFsdWUgPSBtc2cuZ2V0TmV3VmFsdWUoKTsKLSAgICBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBYU0RJbmNsdWRlIHx8IG5ld1ZhbHVlIGluc3RhbmNlb2YgWFNESW1wb3J0IHx8IG5ld1ZhbHVlIGluc3RhbmNlb2YgWFNEUmVkZWZpbmUgfHwKLSAgICAgICAgKG1zZy5nZXRGZWF0dXJlKCkgPT0gWFNEUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WFNEU2NoZW1hX0NvbnRlbnRzKCkgJiYgbXNnLmdldE9sZFZhbHVlKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmUpIHx8IC8vIGhhbmRsZSB0aGUgY2FzZSBmb3IgZGVsZXRlIGRpcmVjdGl2ZQotICAgICAgICAgbXNnLmdldEZlYXR1cmUoKSA9PSBYU0RQYWNrYWdlLmVJTlNUQU5DRS5nZXRYU0RTY2hlbWFfSW5jb3Jwb3JhdGVkVmVyc2lvbnMoKSkgLy8gdXBkYXRlcyB0byB0aGUgaW1wb3J0cy9pbmNsdWRlcwotICAgIHsKLSAgICAgIENhdGVnb3J5QWRhcHRlciBhZGFwdGVyID0gZ2V0Q2F0ZWdvcnkoQ2F0ZWdvcnlBZGFwdGVyLkRJUkVDVElWRVMpOwotICAgICAgQXNzZXJ0LmlzVHJ1ZShhZGFwdGVyICE9IG51bGwpOwotICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IGFkYXB0ZXIuZ2V0WFNEU2NoZW1hKCk7Ci0gICAgICBhZGFwdGVyLnNldENoaWxkcmVuKGdldERpcmVjdGl2ZXMoeHNkU2NoZW1hKSk7Ci0gICAgICBhZGFwdGVyLnNldEFsbENoaWxkcmVuKGdldERpcmVjdGl2ZXMoeHNkU2NoZW1hKSk7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMobmV3IENhdGVnb3J5Tm90aWZpY2F0aW9uKGFkYXB0ZXIpLCBhZGFwdGVyLmdldFRleHQoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gWFNEUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WFNEU2NoZW1hX0VsZW1lbnREZWNsYXJhdGlvbnMoKSkKLSAgICB7Ci0gICAgICBDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IGdldENhdGVnb3J5KENhdGVnb3J5QWRhcHRlci5FTEVNRU5UUyk7Ci0gICAgICBBc3NlcnQuaXNUcnVlKGFkYXB0ZXIgIT0gbnVsbCk7Ci0gICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gYWRhcHRlci5nZXRYU0RTY2hlbWEoKTsKLSAgICAgIGFkYXB0ZXIuc2V0Q2hpbGRyZW4oZ2V0R2xvYmFsRWxlbWVudHMoeHNkU2NoZW1hKSk7Ci0gICAgICBhZGFwdGVyLnNldEFsbENoaWxkcmVuKGdldEdsb2JhbEVsZW1lbnRzKHhzZFNjaGVtYSwgdHJ1ZSkpOwotICAgICAgbm90aWZ5TGlzdGVuZXJzKG5ldyBDYXRlZ29yeU5vdGlmaWNhdGlvbihhZGFwdGVyKSwgYWRhcHRlci5nZXRUZXh0KCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IFhTRFBhY2thZ2UuZUlOU1RBTkNFLmdldFhTRFNjaGVtYV9BdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB8fAotICAgICAgICAgICAgIG1zZy5nZXRGZWF0dXJlKCkgPT0gWFNEUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WFNEU2NoZW1hX0F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMoKSkKLSAgICB7Ci0gICAgICBDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IGdldENhdGVnb3J5KENhdGVnb3J5QWRhcHRlci5BVFRSSUJVVEVTKTsKLSAgICAgIEFzc2VydC5pc1RydWUoYWRhcHRlciAhPSBudWxsKTsKLSAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBhZGFwdGVyLmdldFhTRFNjaGVtYSgpOwotICAgICAgYWRhcHRlci5zZXRDaGlsZHJlbihnZXRBdHRyaWJ1dGVMaXN0KHhzZFNjaGVtYSkpOwotICAgICAgYWRhcHRlci5zZXRBbGxDaGlsZHJlbihnZXRBdHRyaWJ1dGVMaXN0KHhzZFNjaGVtYSwgdHJ1ZSkpOwotICAgICAgbm90aWZ5TGlzdGVuZXJzKG5ldyBDYXRlZ29yeU5vdGlmaWNhdGlvbihhZGFwdGVyKSwgYWRhcHRlci5nZXRUZXh0KCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IFhTRFBhY2thZ2UuZUlOU1RBTkNFLmdldFhTRFNjaGVtYV9UeXBlRGVmaW5pdGlvbnMoKSkKLSAgICB7Ci0gICAgICBDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IGdldENhdGVnb3J5KENhdGVnb3J5QWRhcHRlci5UWVBFUyk7Ci0gICAgICBBc3NlcnQuaXNUcnVlKGFkYXB0ZXIgIT0gbnVsbCk7Ci0gICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gYWRhcHRlci5nZXRYU0RTY2hlbWEoKTsKLSAgICAgIExpc3QgdHlwZXMgPSBnZXRDb21wbGV4VHlwZXMoeHNkU2NoZW1hKTsKLSAgICAgIHR5cGVzLmFkZEFsbChnZXRTaW1wbGVUeXBlcyh4c2RTY2hlbWEpKTsKLQotICAgICAgYWRhcHRlci5zZXRDaGlsZHJlbih0eXBlcyk7Ci0gICAgICBhZGFwdGVyLnNldEFsbENoaWxkcmVuKGdldFR5cGVzKHhzZFNjaGVtYSwgdHJ1ZSkpOwotICAgICAgbm90aWZ5TGlzdGVuZXJzKG5ldyBDYXRlZ29yeU5vdGlmaWNhdGlvbihhZGFwdGVyKSwgYWRhcHRlci5nZXRUZXh0KCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IFhTRFBhY2thZ2UuZUlOU1RBTkNFLmdldFhTRFNjaGVtYV9Nb2RlbEdyb3VwRGVmaW5pdGlvbnMoKSkKLSAgICB7Ci0gICAgICBDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IGdldENhdGVnb3J5KENhdGVnb3J5QWRhcHRlci5HUk9VUFMpOwotICAgICAgQXNzZXJ0LmlzVHJ1ZShhZGFwdGVyICE9IG51bGwpOwotICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IGFkYXB0ZXIuZ2V0WFNEU2NoZW1hKCk7Ci0gICAgICBhZGFwdGVyLnNldENoaWxkcmVuKGdldEdyb3Vwcyh4c2RTY2hlbWEpKTsKLSAgICAgIGFkYXB0ZXIuc2V0QWxsQ2hpbGRyZW4oZ2V0R3JvdXBzKHhzZFNjaGVtYSwgdHJ1ZSkpOwotICAgICAgbm90aWZ5TGlzdGVuZXJzKG5ldyBDYXRlZ29yeU5vdGlmaWNhdGlvbihhZGFwdGVyKSwgYWRhcHRlci5nZXRUZXh0KCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IFhTRFBhY2thZ2UuZUlOU1RBTkNFLmdldFhTRFNjaGVtYV9Bbm5vdGF0aW9ucygpKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobXNnLmdldEZlYXR1cmUoKSA9PSBYU0RQYWNrYWdlLmVJTlNUQU5DRS5nZXRYU0RTY2hlbWFfU2NoZW1hTG9jYXRpb24oKSkKLSAgICB7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMobXNnLCBudWxsKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgdHlwZXMgPSBudWxsOwotICAgIGdldFR5cGVzKCk7Ci0KLSAgICBzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHVwZGF0ZUNhdGVnb3JpZXMoKQotICB7Ci0gICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzCi0gICAgZ2V0Q2hpbGRyZW4oKTsKLSAgfQotICAKLSAgcHVibGljIENhdGVnb3J5QWRhcHRlciBnZXRDYXRlZ29yeShpbnQgY2F0ZWdvcnkpCi0gIHsKLSAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgdXBkYXRlQ2F0ZWdvcmllcygpOyAvLyBpbml0IGNhdGVnb3JpZXMKLSAgICBpbnQgbGVuZ3RoID0gY2hpbGRyZW4uc2l6ZSgpOwotICAgIENhdGVnb3J5QWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGFkYXB0ZXIgPSAoQ2F0ZWdvcnlBZGFwdGVyKSBjaGlsZHJlbi5nZXQoaSk7Ci0gICAgICBpZiAoYWRhcHRlci5nZXRHcm91cFR5cGUoKSA9PSAgY2F0ZWdvcnkpCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYWRhcHRlcjsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldERpcmVjdGl2ZXMoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEU2NoZW1hRGlyZWN0aXZlKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChvKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgTGlzdCBhZGFwdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KGxpc3QsIGFkYXB0ZXJMaXN0KTsKLSAgICByZXR1cm4gYWRhcHRlckxpc3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldEdsb2JhbEVsZW1lbnRzKFhTRFNjaGVtYSBzY2hlbWEsIGJvb2xlYW4gc2hvd0Zyb21JbmNsdWRlcykKLSAgewotICAgIExpc3QgZWxlbWVudHMgPSBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpOwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW0gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpLm5leHQoKTsKLSAgICAgIGlmIChpc1NhbWVOYW1lc3BhY2UoZWxlbS5nZXRUYXJnZXROYW1lc3BhY2UoKSxzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpICYmIChlbGVtLmdldFJvb3RDb250YWluZXIoKSA9PSBzY2hlbWEgfHwgc2hvd0Zyb21JbmNsdWRlcykpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKGVsZW0pOwotICAgICAgfQotICAgIH0KLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QobGlzdCwgYWRhcHRlckxpc3QpOwotICAgIHJldHVybiBhZGFwdGVyTGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEdsb2JhbEVsZW1lbnRzKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICByZXR1cm4gZ2V0R2xvYmFsRWxlbWVudHMoc2NoZW1hLCBmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHNjaGVtYQotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRDb21wbGV4VHlwZXMoWFNEU2NoZW1hIHNjaGVtYSwgYm9vbGVhbiBzaG93RnJvbUluY2x1ZGVzKQotICB7Ci0gICAgTGlzdCBhbGxUeXBlcyA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKTsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gYWxsVHlwZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gKFhTRFR5cGVEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgIGlmICh0ZCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0ID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgdGQ7Ci0gICAgICAgIGlmIChpc1NhbWVOYW1lc3BhY2UoY3QuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKSAmJiAoY3QuZ2V0Um9vdENvbnRhaW5lcigpID09IHNjaGVtYSB8fCBzaG93RnJvbUluY2x1ZGVzKSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGN0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBMaXN0IGFkYXB0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHBvcHVsYXRlQWRhcHRlckxpc3QobGlzdCwgYWRhcHRlckxpc3QpOwotICAgIHJldHVybiBhZGFwdGVyTGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldENvbXBsZXhUeXBlcyhYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgcmV0dXJuIGdldENvbXBsZXhUeXBlcyhzY2hlbWEsIGZhbHNlKTsKLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0VHlwZXMoWFNEU2NoZW1hIHNjaGVtYSwgYm9vbGVhbiBzaG93RnJvbUluY2x1ZGVzKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gZ2V0Q29tcGxleFR5cGVzKHNjaGVtYSwgc2hvd0Zyb21JbmNsdWRlcyk7Ci0gICAgbGlzdC5hZGRBbGwoZ2V0U2ltcGxlVHlwZXMoc2NoZW1hLCBzaG93RnJvbUluY2x1ZGVzKSk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldEF0dHJpYnV0ZUdyb3VwTGlzdChYU0RTY2hlbWEgeHNkU2NoZW1hLCBib29sZWFuIHNob3dGcm9tSW5jbHVkZXMpCi0gIHsKLSAgICBMaXN0IGF0dHJpYnV0ZUdyb3VwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0ckdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICBpZiAoaXNTYW1lTmFtZXNwYWNlKGF0dHJHcm91cC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgeHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKSAmJiAoYXR0ckdyb3VwLmdldFJvb3RDb250YWluZXIoKSA9PSB4c2RTY2hlbWEgfHwgc2hvd0Zyb21JbmNsdWRlcykpCi0gICAgICB7Ci0gICAgICAgIGF0dHJpYnV0ZUdyb3VwTGlzdC5hZGQoYXR0ckdyb3VwKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgTGlzdCBhZGFwdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KGF0dHJpYnV0ZUdyb3VwTGlzdCwgYWRhcHRlckxpc3QpOwotICAgIHJldHVybiBhZGFwdGVyTGlzdDsKLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0QXR0cmlidXRlR3JvdXBMaXN0KFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlR3JvdXBMaXN0KHhzZFNjaGVtYSwgZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0QXR0cmlidXRlTGlzdChYU0RTY2hlbWEgeHNkU2NoZW1hLCBib29sZWFuIHNob3dGcm9tSW5jbHVkZXMpCi0gIHsKLSAgICBMaXN0IGF0dHJpYnV0ZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHhzZFNjaGVtYS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIG87Ci0gICAgICAgIGlmIChhdHRyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYXR0ci5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghKGF0dHIuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKFhTRENvbnN0YW50cy5TQ0hFTUFfSU5TVEFOQ0VfVVJJXzIwMDEpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGlzU2FtZU5hbWVzcGFjZShhdHRyLmdldFRhcmdldE5hbWVzcGFjZSgpLCB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpICYmIChhdHRyLmdldFJvb3RDb250YWluZXIoKSA9PSB4c2RTY2hlbWEgfHwgc2hvd0Zyb21JbmNsdWRlcykpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzTGlzdC5hZGQoYXR0cik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpc1NhbWVOYW1lc3BhY2UoYXR0ci5nZXRUYXJnZXROYW1lc3BhY2UoKSwgeHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKSAmJiAoYXR0ci5nZXRSb290Q29udGFpbmVyKCkgPT0geHNkU2NoZW1hIHx8IHNob3dGcm9tSW5jbHVkZXMpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBhdHRyaWJ1dGVzTGlzdC5hZGQoYXR0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGF0dHJpYnV0ZXNMaXN0LmFkZEFsbChnZXRBdHRyaWJ1dGVHcm91cExpc3QoeHNkU2NoZW1hLCBzaG93RnJvbUluY2x1ZGVzKSk7Ci0gICAgCi0gICAgTGlzdCBhZGFwdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KGF0dHJpYnV0ZXNMaXN0LCBhZGFwdGVyTGlzdCk7Ci0gICAgcmV0dXJuIGFkYXB0ZXJMaXN0OwotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRBdHRyaWJ1dGVMaXN0KFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICByZXR1cm4gZ2V0QXR0cmlidXRlTGlzdCh4c2RTY2hlbWEsIGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldFNpbXBsZVR5cGVzKFhTRFNjaGVtYSBzY2hlbWEsIGJvb2xlYW4gc2hvd0Zyb21JbmNsdWRlcykKLSAgewotICAgIExpc3QgYWxsVHlwZXMgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCk7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGFsbFR5cGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IChYU0RUeXBlRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICBpZiAodGQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHRkOwotICAgICAgICBpZiAoaXNTYW1lTmFtZXNwYWNlKHN0LmdldFRhcmdldE5hbWVzcGFjZSgpLHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSkgJiYgKHN0LmdldFJvb3RDb250YWluZXIoKSA9PSBzY2hlbWEgfHwgc2hvd0Zyb21JbmNsdWRlcykpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChzdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgTGlzdCBhZGFwdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwb3B1bGF0ZUFkYXB0ZXJMaXN0KGxpc3QsIGFkYXB0ZXJMaXN0KTsKLSAgICByZXR1cm4gYWRhcHRlckxpc3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldFNpbXBsZVR5cGVzKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICByZXR1cm4gZ2V0U2ltcGxlVHlwZXMoc2NoZW1hLCBmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRHcm91cHMoWFNEU2NoZW1hIHNjaGVtYSwgYm9vbGVhbiBzaG93RnJvbUluY2x1ZGVzKQotICB7Ci0gICAgTGlzdCBncm91cHMgPSBzY2hlbWEuZ2V0TW9kZWxHcm91cERlZmluaXRpb25zKCk7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdyb3Vwcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gZ3JvdXAgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgaWYgKGlzU2FtZU5hbWVzcGFjZShncm91cC5nZXRUYXJnZXROYW1lc3BhY2UoKSxzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpICYmIChncm91cC5nZXRSb290Q29udGFpbmVyKCkgPT0gc2NoZW1hIHx8IHNob3dGcm9tSW5jbHVkZXMpKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChncm91cCk7Ci0gICAgICB9Ci0gICAgfQotICAgIExpc3QgYWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcG9wdWxhdGVBZGFwdGVyTGlzdChsaXN0LCBhZGFwdGVyTGlzdCk7Ci0gICAgcmV0dXJuIGFkYXB0ZXJMaXN0OwotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRHcm91cHMoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHJldHVybiBnZXRHcm91cHMoc2NoZW1hLCBmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aW9ucyhPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgIENvbGxlY3Rpb24gYWN0aW9uSURzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTREVsZW1lbnRBY3Rpb24uSUQpOwotICAgICBhY3Rpb25JRHMuYWRkKEFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFjdGlvbi5JRCk7Ci0KLSAgICAgYWN0aW9uSURzLmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgIGFjdGlvbklEcy5hZGQoU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLklEKTsKLSAgICAgcmV0dXJuIChTdHJpbmcgW10pYWN0aW9uSURzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgbm90aWZ5TGlzdGVuZXJzKG9iamVjdCwgcHJvcGVydHkpOwotICB9Ci0gIAotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKQotICB7Ci0gICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNERmlsZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNmNlYjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEU2NoZW1hRGlyZWN0aXZlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuRGVsZXRlWFNEQ29uY3JldGVDb21wb25lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbmNsdWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmFibGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYURpcmVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBJQWN0aW9uUHJvdmlkZXIKLXsKLSAgcHVibGljIEltYWdlIGdldEltYWdlKCkKLSAgewotICAgIFhTRFNjaGVtYURpcmVjdGl2ZSBvYmplY3QgPSAoWFNEU2NoZW1hRGlyZWN0aXZlKSB0YXJnZXQ7Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTREltcG9ydCkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RJbXBvcnQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNESW5jbHVkZSkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RJbmNsdWRlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotICAgIHsKLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRFJlZGVmaW5lLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIFhTRFNjaGVtYURpcmVjdGl2ZSBkaXJlY3RpdmUgPSAoWFNEU2NoZW1hRGlyZWN0aXZlKSB0YXJnZXQ7Ci0gICAgU3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gICAgU3RyaW5nIGxvY2F0aW9uID0gZGlyZWN0aXZlLmdldFNjaGVtYUxvY2F0aW9uKCk7Ci0gICAgaWYgKGxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24uZXF1YWxzKCIiKSApCi0gICAgewotICAgICAgcmVzdWx0ID0gIigiICsgTWVzc2FnZXMuX1VJX0xBQkVMX05PX0xPQ0FUSU9OX1NQRUNJRklFRCArICIpIjsgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBsb2NhdGlvbjsKLSAgICB9ICAKLQotICAgIC8vIG9ubHkgc2hvdyB0aGUgbmFtZXNwYWNlIHdoZW4gdGhlIGRpcmVjdGlhdmUgaXMgYW4gaW1wb3J0Ci0gICAgLy8gKG90aGVyd2lzZSB0aGUgbmFtZXNwYWNlIGlzIG9idmlvdXNseSB0aGUgc2FtZSBhcyB0aGUgY29udGFpbmluZyBzY2hlbWEncykKLSAgICBpZiAoZGlyZWN0aXZlIGluc3RhbmNlb2YgWFNESW1wb3J0KQotICAgIHsKLSAgICAgIFhTREltcG9ydCBpbXBvcnRPYmogPSAoWFNESW1wb3J0KSBkaXJlY3RpdmU7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gaW1wb3J0T2JqLmdldE5hbWVzcGFjZSgpOwotICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIHJlc3VsdCArPSAiICB7IiArIG5hbWVzcGFjZSArICJ9IjsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBJVHJlZUVsZW1lbnRbXSBnZXRDaGlsZHJlbigpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotICAgIHsKLSAgICAgIFhTRFJlZGVmaW5lIHJlZGVmaW5lID0gKFhTRFJlZGVmaW5lKSB0YXJnZXQ7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZWRlZmluZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEUmVkZWZpbmVDb250ZW50IHJlZGVmaW5lQ29udGVudCA9IChYU0RSZWRlZmluZUNvbnRlbnQpIGkubmV4dCgpOwotICAgICAgICBpZiAocmVkZWZpbmVDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIHx8Ci0gICAgICAgIAlyZWRlZmluZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKHJlZGVmaW5lQ29udGVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocmVkZWZpbmVDb250ZW50IGluc3RhbmNlb2YgWFNEUmVkZWZpbmFibGVDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RSZWRlZmluYWJsZUNvbXBvbmVudCBjb21wID0gKFhTRFJlZGVmaW5hYmxlQ29tcG9uZW50KSByZWRlZmluZUNvbnRlbnQ7Ci0gICAgICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gfHwKLSAgICAgICAgICAgICAgY29tcCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHx8Ci0gICAgICAgICAgICAgIGNvbXAgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gfHwKLSAgICAgICAgICAgICAgY29tcCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxpc3QuYWRkKGNvbXApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChyZWRlZmluZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChyZWRlZmluZUNvbnRlbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHJlZGVmaW5lQ29udGVudCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQocmVkZWZpbmVDb250ZW50KTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgfQotICAgIExpc3QgYWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcG9wdWxhdGVBZGFwdGVyTGlzdChsaXN0LCBhZGFwdGVyTGlzdCk7Ci0gICAgcmV0dXJuIChJVHJlZUVsZW1lbnRbXSkgYWRhcHRlckxpc3QudG9BcnJheShuZXcgSVRyZWVFbGVtZW50WzBdKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZ1tdIGdldEFjdGlvbnMoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgIGxpc3QuYWRkKERlbGV0ZVhTRENvbmNyZXRlQ29tcG9uZW50QWN0aW9uLkRFTEVURV9YU0RfQ09NUE9ORU5UX0lEKTsKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgbGlzdC5hZGQoU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLklEKTsKLSAgICAKLSAgICByZXR1cm4gKFN0cmluZyBbXSlsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI1MmRjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNldElucHV0VG9HcmFwaFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5EZWxldGVYU0RDb25jcmV0ZUNvbXBvbmVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFZhcmlldHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyIGV4dGVuZHMgWFNEVHlwZURlZmluaXRpb25BZGFwdGVyCi17Ci0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICBpZiAoaXNSZWFkT25seSgpKQotICAgIHsKLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvc2ltcGxldHlwZWRpc19vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9zaW1wbGV0eXBlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkKLSAgewotICAgIHJldHVybiBnZXROYW1lKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQotICB7Ci0gICAgcmV0dXJuIGdldFRleHQodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoYm9vbGVhbiBzaG93VHlwZSkKLSAgewotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB0YXJnZXQ7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgcmVzdWx0LmFwcGVuZCh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkgPT0gbnVsbCA/IE1lc3NhZ2VzLl9VSV9MQUJFTF9MT0NBTF9UWVBFIDogeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpKTsKLQotICAgIGlmIChzaG93VHlwZSkKLSAgICB7Ci0gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBiYXNlVHlwZURlZmluaXRpb24gPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLSAgICAgIGlmIChiYXNlVHlwZURlZmluaXRpb24gIT0gbnVsbCAmJiBYU0RWYXJpZXR5LkFUT01JQ19MSVRFUkFMID09IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldFZhcmlldHkoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGJhc2VUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkgIT0gbnVsbCAmJiAheHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0Q29udGVudHMoKS5jb250YWlucyhiYXNlVHlwZURlZmluaXRpb24pICYmICFYU0RDb25zdGFudHMuaXNBbnlTaW1wbGVUeXBlKGJhc2VUeXBlRGVmaW5pdGlvbikpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgOiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYmFzZVR5cGVEZWZpbml0aW9uLmdldFFOYW1lKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gaXRlbVR5cGVEZWZpbml0aW9uID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0SXRlbVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIGlmIChpdGVtVHlwZURlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChpdGVtVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIDogIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaXRlbVR5cGVEZWZpbml0aW9uLmdldFFOYW1lKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIExpc3QgbWVtYmVyVHlwZURlZmluaXRpb25zID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TWVtYmVyVHlwZURlZmluaXRpb25zKCk7Ci0gICAgICAgICAgaWYgKCFtZW1iZXJUeXBlRGVmaW5pdGlvbnMuaXNFbXB0eSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBtZW1iZXJzID0gbWVtYmVyVHlwZURlZmluaXRpb25zLml0ZXJhdG9yKCk7IG1lbWJlcnMuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gbWVtYmVyVHlwZURlZmluaXRpb24gPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIG1lbWJlcnMubmV4dCgpOwotICAgICAgICAgICAgICBpZiAobWVtYmVyVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIDogIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgfCAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKG1lbWJlclR5cGVEZWZpbml0aW9uLmdldFFOYW1lKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAocmVzdWx0Lmxlbmd0aCgpID09IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChNZXNzYWdlcy5fVUlfTEFCRUxfQUJTRU5UKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzQ29tcGxleFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGb2N1c0FsbG93ZWQoKQotICB7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZURlZmluaXRpb24gPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHRhcmdldDsKLSAgICBpZiAoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLmVxdWFscyh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSkpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGlzQW5vbnltb3VzKCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aW9ucyhPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkKERlbGV0ZVhTRENvbmNyZXRlQ29tcG9uZW50QWN0aW9uLkRFTEVURV9YU0RfQ09NUE9ORU5UX0lEKTsKLSAgICBsaXN0LmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgT2JqZWN0IHNjaGVtYSA9IGdldEVkaXRvclNjaGVtYSgpOwotICAgIGlmIChnZXRYU0RUeXBlRGVmaW5pdGlvbigpLmdldFNjaGVtYSgpID09IHNjaGVtYSkKLSAgICB7Ci0gICAgICBpZiAoZ2V0WFNEVHlwZURlZmluaXRpb24oKS5nZXRDb250YWluZXIoKSA9PSBzY2hlbWEpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKFNldElucHV0VG9HcmFwaFZpZXcuSUQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbGlzdC5hZGQoT3BlbkluTmV3RWRpdG9yLklEKTsKLSAgICB9Ci0gICAgbGlzdC5hZGQoQmFzZVNlbGVjdGlvbkFjdGlvbi5TRVBBUkFUT1JfSUQpOwotICAgIGxpc3QuYWRkKFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbi5JRCk7Ci0gICAgCi0gICAgcmV0dXJuIChTdHJpbmcgW10pbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNBbm9ueW1vdXMoKQotICB7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZURlZmluaXRpb24gPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHRhcmdldDsKLSAgICByZXR1cm4gISh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWEpOwotICB9Ci0KLSAgcHVibGljIElBRFRPYmplY3QgZ2V0VG9wQ29udGFpbmVyKCkKLSAgewotICAgIHJldHVybiB0aGlzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RUeXBlRGVmaW5pdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWE0MWI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFR5cGVEZWZpbml0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklBY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklHcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFhTRFR5cGVEZWZpbml0aW9uQWRhcHRlciBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgSVR5cGUsIElBY3Rpb25Qcm92aWRlciwgSUdyYXBoRWxlbWVudAotewotICBwdWJsaWMgWFNEVHlwZURlZmluaXRpb24gZ2V0WFNEVHlwZURlZmluaXRpb24oKQotICB7Ci0gICAgcmV0dXJuIChYU0RUeXBlRGVmaW5pdGlvbil0YXJnZXQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgaWYgKGdldFhTRFR5cGVEZWZpbml0aW9uKCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgIHsgIAotICAgICAgcmV0dXJuIGdldFhTRFR5cGVEZWZpbml0aW9uKCkuZ2V0TmFtZSgpOwotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAgIEVPYmplY3QgbyA9IGdldFhTRFR5cGVEZWZpbml0aW9uKCkuZUNvbnRhaW5lcigpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgIFhTRE5hbWVkQ29tcG9uZW50IGVkID0gKFhTRE5hbWVkQ29tcG9uZW50KW87Ci0gICAgICAgICByZXR1cm4gIigiICsgZWQuZ2V0TmFtZSgpICsgIlR5cGUpIjsgICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZXIoKQotICB7Ci0gICAgcmV0dXJuIGdldFhTRFR5cGVEZWZpbml0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gIH0KLQotICBwdWJsaWMgSVR5cGUgZ2V0U3VwZXJUeXBlKCkKLSAgewotICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gZ2V0WFNEVHlwZURlZmluaXRpb24oKS5nZXRCYXNlVHlwZSgpOwotICAgIHJldHVybiB0ZCAhPSBudWxsID8gKElUeXBlKVhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQodGQpIDogbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU5hbWVDb21tYW5kKFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV4VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNTQxZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWRhcHRlcnMvWFNEVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5vdGF0aW9uRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLQotcHVibGljIGNsYXNzIFhTRFZpc2l0b3IKLXsKLSAgcHVibGljIFhTRFZpc2l0b3IoKQotICB7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBYU0RTY2hlbWEgc2NoZW1hOwotICAKLSAgcHVibGljIHZvaWQgdmlzaXRTY2hlbWEoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdEF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IChYU0RUeXBlRGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRUeXBlRGVmaW5pdGlvbih0eXBlKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIGlkZW50aXR5Q29uc3RyYWludCA9IChYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24oaWRlbnRpdHlDb25zdHJhaW50KTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXAgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24obW9kZWxHcm91cCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oYXR0cmlidXRlR3JvdXApOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldE5vdGF0aW9uRGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNETm90YXRpb25EZWNsYXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXROb3RhdGlvbkRlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0VHlwZURlZmluaXRpb24oWFNEVHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgdmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pdHlwZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgdmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24oKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbil0eXBlKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50LmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkpOwotICAgIH0KLSAgICBlbHNlIGlmIChlbGVtZW50LmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB2aXNpdFR5cGVEZWZpbml0aW9uKGVsZW1lbnQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24oWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiBpZGVudGl0eUNvbnN0cmFpbnQpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmKQotICB7Ci0gICAgaWYgKCFtb2RlbEdyb3VwRGVmLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICBpZiAobW9kZWxHcm91cERlZi5nZXRNb2RlbEdyb3VwKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRNb2RlbEdyb3VwKG1vZGVsR3JvdXBEZWYuZ2V0TW9kZWxHcm91cCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IG1vZGVsR3JvdXBEZWYuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldE1vZGVsR3JvdXAoKTsKLSAgICAgIGlmIChtb2RlbEdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZpc2l0TW9kZWxHcm91cChtb2RlbEdyb3VwKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXApCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gYXR0cmlidXRlR3JvdXAuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGl0Lm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0clVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpbzsKLSAgICAgICAgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyVXNlLmdldENvbnRlbnQoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0ckdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbilvOwotICAgICAgICB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihhdHRyR3JvdXAuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdE5vdGF0aW9uRGVjbGFyYXRpb24oWFNETm90YXRpb25EZWNsYXJhdGlvbiBub3RhdGlvbikKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRDb21wbGV4VHlwZUNvbnRlbnQoWFNEU2ltcGxlVHlwZURlZmluaXRpb24gY29udGVudCkKLSAgewotICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIGlmICh0eXBlLmdldENvbnRlbnQoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIFhTRENvbXBsZXhUeXBlQ29udGVudCBjb21wbGV4Q29udGVudCA9IHR5cGUuZ2V0Q29udGVudCgpOwotICAgICAgaWYgKGNvbXBsZXhDb250ZW50IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIHZpc2l0Q29tcGxleFR5cGVDb250ZW50KChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiljb21wbGV4Q29udGVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjb21wbGV4Q29udGVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgewotICAgICAgICB2aXNpdFBhcnRpY2xlKChYU0RQYXJ0aWNsZSkgY29tcGxleENvbnRlbnQpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRQYXJ0aWNsZShYU0RQYXJ0aWNsZSBwYXJ0aWNsZSkKLSAgewotICAgIHZpc2l0UGFydGljbGVDb250ZW50KHBhcnRpY2xlLmdldENvbnRlbnQoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0UGFydGljbGVDb250ZW50KFhTRFBhcnRpY2xlQ29udGVudCBwYXJ0aWNsZUNvbnRlbnQpCi0gIHsKLSAgICBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbigoWFNETW9kZWxHcm91cERlZmluaXRpb24pIHBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgewotICAgICAgdmlzaXRNb2RlbEdyb3VwKChYU0RNb2RlbEdyb3VwKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbigoWFNERWxlbWVudERlY2xhcmF0aW9uKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgIHsKLSAgICAgIHZpc2l0V2lsZGNhcmQoKFhTRFdpbGRjYXJkKXBhcnRpY2xlQ29udGVudCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwKQotICB7Ci0gICAgaWYgKG1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSAoWFNEUGFydGljbGUpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgdmlzaXRQYXJ0aWNsZShwYXJ0aWNsZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFdpbGRjYXJkKFhTRFdpbGRjYXJkIHdpbGRjYXJkKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFZpc2l0b3JGb3JGaWVsZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFZpc2l0b3JGb3JGaWVsZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAyNmU5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RWaXNpdG9yRm9yRmllbGRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotCi1wdWJsaWMgY2xhc3MgWFNEVmlzaXRvckZvckZpZWxkcyBleHRlbmRzIFhTRFZpc2l0b3IKLXsKLSAgcHVibGljIFhTRFZpc2l0b3JGb3JGaWVsZHMoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBjb25jcmV0ZUNvbXBvbmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHB1YmxpYyBMaXN0IHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIGlmICh0eXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IGF0dHJHcm91cENvbnRlbnQgPSAoWFNEQXR0cmlidXRlR3JvdXBDb250ZW50KWl0ZXIubmV4dCgpOwotICAgICAgICBpZiAoYXR0ckdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZVVzZSBhdHRyVXNlID0gKFhTREF0dHJpYnV0ZVVzZSlhdHRyR3JvdXBDb250ZW50OwotICAgICAgICAgIAotICAgICAgICAgIHZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0clVzZS5nZXRDb250ZW50KCkpOwotCi0vLyAgICAgICAgICBpZiAoYXR0clVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpICE9IGF0dHJVc2UuZ2V0Q29udGVudCgpKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICB2aXNpdEF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHJVc2UuZ2V0Q29udGVudCgpKTsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgIGVsc2UKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgdGhpbmdzV2VOZWVkVG9MaXN0ZW5Uby5hZGQoYXR0clVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLS8vICAgICAgICAgICAgY29uY3JldGVDb21wb25lbnRMaXN0LmFkZChhdHRyVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpOwotLy8gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGF0dHJHcm91cENvbnRlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0ckdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbilhdHRyR3JvdXBDb250ZW50OwotICAgICAgICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKGF0dHJHcm91cCk7Ci0gICAgICAgICAgaWYgKGF0dHJHcm91cC5pc0F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGF0dHJHcm91cCA9IGF0dHJHcm91cC5nZXRSZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgdmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oYXR0ckdyb3VwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHR5cGUuZ2V0QXR0cmlidXRlV2lsZGNhcmQoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKHR5cGUuZ2V0QXR0cmlidXRlV2lsZGNhcmQoKSk7Ci0gICAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKHR5cGUuZ2V0QXR0cmlidXRlV2lsZGNhcmQoKSk7Ci0gICAgfQotICAgIHN1cGVyLnZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKHR5cGUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdENvbXBsZXhUeXBlQ29udGVudChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBjb250ZW50KQotICB7Ci0gICAgdGhpbmdzV2VOZWVkVG9MaXN0ZW5Uby5hZGQoY29udGVudCk7Ci0gICAgCi0gICAgc3VwZXIudmlzaXRDb21wbGV4VHlwZUNvbnRlbnQoY29udGVudCk7ICAgCi0gIH0KLQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmKQotICB7Ci0gICAgaWYgKG1vZGVsR3JvdXBEZWYuaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIC8vIGlmIGl0J3MgYSByZWZlcmVuY2Ugd2UgbmVlZCB0byBsaXN0ZW4gdG8gdGhlIHJlZmVyZW5jZSBpbmNhc2UgaXQgY2hhbmdlcwotICAgICAgdGhpbmdzV2VOZWVkVG9MaXN0ZW5Uby5hZGQobW9kZWxHcm91cERlZik7ICAgICAgCi0gICAgfSAgICAKLSAgICAvLyBsaXN0ZW4gdG8gZGVmaW5pdGlvbiBpbmNhc2UgaXQgY2hhbmdlcwotICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHJlc29sdmVkTW9kZWxHcm91cERlZiA9IG1vZGVsR3JvdXBEZWYuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpOwotICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKHJlc29sdmVkTW9kZWxHcm91cERlZik7Ci0gICAgc3VwZXIudmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihtb2RlbEdyb3VwRGVmKTsgICAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCkKLSAgewotICAgIHN1cGVyLnZpc2l0TW9kZWxHcm91cChtb2RlbEdyb3VwKTsKLSAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChtb2RlbEdyb3VwKTsgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaXQgPSBhdHRyaWJ1dGVHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gaXQubmV4dCgpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZVVzZSBhdHRyaWJ1dGVVc2UgPSAoWFNEQXR0cmlidXRlVXNlKW87Ci0gICAgICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQoYXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkpOwotICAgICAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChhdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0ckdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbilvOwotICAgICAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChhdHRyR3JvdXApOwotICAgICAgICBpZiAoYXR0ckdyb3VwLmlzQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBhdHRyR3JvdXAgPSBhdHRyR3JvdXAuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKTsKLSAgICAgICAgICB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihhdHRyR3JvdXApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIFhTRFdpbGRjYXJkIGFueUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZUdyb3VwLmdldEF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCgpOwotICAgIGlmIChhbnlBdHRyaWJ1dGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKGFueUF0dHJpYnV0ZSk7Ci0gICAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChhbnlBdHRyaWJ1dGUpOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRQYXJ0aWNsZShYU0RQYXJ0aWNsZSBwYXJ0aWNsZSkKLSAgewotICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKHBhcnRpY2xlKTsKLSAgICBzdXBlci52aXNpdFBhcnRpY2xlKHBhcnRpY2xlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRXaWxkY2FyZChYU0RXaWxkY2FyZCB3aWxkY2FyZCkKLSAgewotICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQod2lsZGNhcmQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudC5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKGVsZW1lbnQpOwotICAgICAgdGhpbmdzV2VOZWVkVG9MaXN0ZW5Uby5hZGQoZWxlbWVudC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpKTsKLSAgICAgIC8vIG5vdywgYWRkIHRoZSByZWZlcmVuY2UgYXMgYSBmaWVsZAotICAgICAgY29uY3JldGVDb21wb25lbnRMaXN0LmFkZChlbGVtZW50KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQoZWxlbWVudC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpKTsKLSAgICAgIC8vIG5vdGUuLi4gd2UgaW50ZW50aW9uYWxseSBvbW1pdCB0aGUgY2FsbCB0byBzdXBlci52aXNpdEVsZW1lbnREZWNsYXJhdGlvbigpCi0gICAgICAvLyBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIGRlbHZlIGRvd24gZGVlcGVyIHRoYW4gdGhlIGVsZW1lbnQgICAgICAKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cikKLSAgewotICAgIGlmIChhdHRyLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICB0aGluZ3NXZU5lZWRUb0xpc3RlblRvLmFkZChhdHRyKTsKLSAgICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKGF0dHIuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgICAgIGNvbmNyZXRlQ29tcG9uZW50TGlzdC5hZGQoYXR0cik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb25jcmV0ZUNvbXBvbmVudExpc3QuYWRkKGF0dHIuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgICAgIHRoaW5nc1dlTmVlZFRvTGlzdGVuVG8uYWRkKGF0dHIuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZGFwdGVycy9YU0RXaWxkY2FyZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFdpbGRjYXJkQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGM4YmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkYXB0ZXJzL1hTRFdpbGRjYXJkQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TaG93UHJvcGVydGllc1ZpZXdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5EZWxldGVYU0RDb25jcmV0ZUNvbXBvbmVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFhTRFdpbGRjYXJkQWRhcHRlciBleHRlbmRzIFhTRFBhcnRpY2xlQWRhcHRlciBpbXBsZW1lbnRzIElGaWVsZCwgSUFjdGlvblByb3ZpZGVyLCBJR3JhcGhFbGVtZW50Ci17Ci0vLyAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBBTllFTEVNRU5UX0lDT04gPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNEQW55LmdpZiIpOyAvLyROT04tTkxTLTEkCi0vLyAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBBTllFTEVNRU5UX0RJU0FCTEVEX0lDT04gPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvWFNEQW55LmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIAotICBwdWJsaWMgWFNEV2lsZGNhcmRBZGFwdGVyKCkKLSAgewotCi0gIH0KLSAgCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpCi0gIHsKLSAgICBYU0RXaWxkY2FyZCB4c2RXaWxkY2FyZCA9IChYU0RXaWxkY2FyZCkgdGFyZ2V0OwotICAgIAotICAgIGlmICh4c2RXaWxkY2FyZC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICB7Ci0gICAgICBpZiAoaXNSZWFkT25seSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREFueWRpcy5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEQW55LmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaXNSZWFkT25seSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L1hTREFueUF0dHJpYnV0ZWRpcy5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEQW55QXR0cmlidXRlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIFhTRFdpbGRjYXJkIHhzZFdpbGRjYXJkID0gKFhTRFdpbGRjYXJkKSB0YXJnZXQ7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIEVsZW1lbnQgZWxlbWVudCA9IHhzZFdpbGRjYXJkLmdldEVsZW1lbnQoKTsKLQotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0LmFwcGVuZChlbGVtZW50LmdldE5vZGVOYW1lKCkpOwotICAgICAgYm9vbGVhbiBoYXNNaW5PY2N1cnMgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuTUlOT0NDVVJTX0FUVFJJQlVURSk7Ci0gICAgICBib29sZWFuIGhhc01heE9jY3VycyA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5NQVhPQ0NVUlNfQVRUUklCVVRFKTsKLQotICAgICAgaWYgKGhhc01pbk9jY3VycyB8fCBoYXNNYXhPY2N1cnMpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiBbIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKGhhc01pbk9jY3VycykKLSAgICAgICAgewotCi0gICAgICAgICAgaW50IG1pbiA9ICgoWFNEUGFydGljbGUpIHhzZFdpbGRjYXJkLmdldENvbnRhaW5lcigpKS5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICBpZiAobWluID09IFhTRFBhcnRpY2xlLlVOQk9VTkRFRCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWluKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgLy8gcHJpbnQgZGVmYXVsdAotICAgICAgICB7Ci0gICAgICAgICAgaW50IG1pbiA9ICgoWFNEUGFydGljbGUpIHhzZFdpbGRjYXJkLmdldENvbnRhaW5lcigpKS5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG1pbikpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoYXNNYXhPY2N1cnMpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgbWF4ID0gKChYU0RQYXJ0aWNsZSkgeHNkV2lsZGNhcmQuZ2V0Q29udGFpbmVyKCkpLmdldE1heE9jY3VycygpOwotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi4uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAobWF4ID09IFhTRFBhcnRpY2xlLlVOQk9VTkRFRCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobWF4KSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgLy8gcHJpbnQgZGVmYXVsdAotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLi4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGludCBtYXggPSAoKFhTRFBhcnRpY2xlKSB4c2RXaWxkY2FyZC5nZXRDb250YWluZXIoKSkuZ2V0TWF4T2NjdXJzKCk7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcudmFsdWVPZihtYXgpKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKCJdIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgWFNEV2lsZGNhcmQgeHNkV2lsZGNhcmQgPSAoWFNEV2lsZGNhcmQpIHRhcmdldDsKLSAgICByZXR1cm4geHNkV2lsZGNhcmQuZ2V0Q29udGFpbmVyKCk7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0S2luZCgpCi0gIHsKLSAgICBYU0RXaWxkY2FyZCB4c2RXaWxkY2FyZCA9IChYU0RXaWxkY2FyZCkgdGFyZ2V0OwotICAgIGlmICh4c2RXaWxkY2FyZC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICB7Ci0gICAgICByZXR1cm4gImVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHJldHVybiAiYXR0cmlidXRlIjsKLSAgfQotCi0gIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgWFNEV2lsZGNhcmQgeHNkV2lsZGNhcmQgPSAoWFNEV2lsZGNhcmQpIHRhcmdldDsKLSAgICBpZiAoeHNkV2lsZGNhcmQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgewotICAgICAgcmV0dXJuICJhbnkiOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHJldHVybiAiYW55QXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotICB9Ci0gIAotICBwdWJsaWMgSVR5cGUgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lUXVhbGlmaWVyKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU1heE9jY3Vyc0NvbW1hbmQoaW50IG1heE9jY3VycykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU1pbk9jY3Vyc0NvbW1hbmQoaW50IG1pbk9jY3VycykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldFVwZGF0ZU5hbWVDb21tYW5kKFN0cmluZyBuYW1lKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlVHlwZU5hbWVDb21tYW5kKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHF1YWlsaWZpZXIpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0dsb2JhbCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW5jZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aW9ucyhPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgQ29sbGVjdGlvbiBhY3Rpb25JRHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgYWN0aW9uSURzLmFkZChEZWxldGVYU0RDb25jcmV0ZUNvbXBvbmVudEFjdGlvbi5ERUxFVEVfWFNEX0NPTVBPTkVOVF9JRCk7Ci0gICAgYWN0aW9uSURzLmFkZChCYXNlU2VsZWN0aW9uQWN0aW9uLlNFUEFSQVRPUl9JRCk7Ci0gICAgYWN0aW9uSURzLmFkZChTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24uSUQpOwotICAgIHJldHVybiAoU3RyaW5nIFtdKWFjdGlvbklEcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICB9Ci0KLSAgcHVibGljIElBRFRPYmplY3QgZ2V0VG9wQ29udGFpbmVyKCkKLSAgewotICAgIHJldHVybiBnZXRHbG9iYWxYU0RDb250YWluZXIoKFhTRFdpbGRjYXJkKSB0YXJnZXQpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGb2N1c0FsbG93ZWQoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvQmFzZURyYWdBbmREcm9wQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbWFuZHMvQmFzZURyYWdBbmREcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGE4ZWY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL0Jhc2VEcmFnQW5kRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLlNjYWxhYmxlUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5Nb3ZlWFNEQmFzZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUZpZWxkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQmFzZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLkNvbm5lY3RhYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLlRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLlhTREJhc2VGaWVsZEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuR2VuZXJpY0dyb3VwRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VEcmFnQW5kRHJvcENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBwcm90ZWN0ZWQgc3RhdGljIGludCBBQk9WRV9JU19DTE9TRVIgPSAwOwotICBwcm90ZWN0ZWQgc3RhdGljIGludCBCRUxPV19JU19DTE9TRVIgPSAxOwotICAKLSAgcHJvdGVjdGVkIEVkaXRQYXJ0Vmlld2VyIHZpZXdlcjsgICAgCi0gIHByb3RlY3RlZCBDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3Q7Ci0gIHByb3RlY3RlZCBib29sZWFuIGNhbkV4ZWN1dGU7Ci0gIHByb3RlY3RlZCBHcmFwaGljYWxFZGl0UGFydCB0YXJnZXQ7Ci0gIAotICBwcm90ZWN0ZWQgR3JhcGhpY2FsRWRpdFBhcnQgbGVmdFNpYmxpbmdFZGl0UGFydDsKLSAgcHJvdGVjdGVkIEdyYXBoaWNhbEVkaXRQYXJ0IHJpZ2h0U2libGluZ0VkaXRQYXJ0OwotICBwcm90ZWN0ZWQgUG9pbnQgbG9jYXRpb247Ci0KLSAgcHJvdGVjdGVkIENvbm5lY3RhYmxlRWRpdFBhcnQgcGFyZW50RWRpdFBhcnQ7Ci0gIHByb3RlY3RlZCBYU0RDb25jcmV0ZUNvbXBvbmVudCBwcmV2aW91c1JlZkNvbXBvbmVudCA9IG51bGwsIG5leHRSZWZDb21wb25lbnQgPSBudWxsLCB4c2RDb21wb25lbnRUb0RyYWc7Ci0gIHByb3RlY3RlZCBYU0RCYXNlRmllbGRFZGl0UGFydCBpdGVtVG9EcmFnOwotICBwcm90ZWN0ZWQgUmVjdGFuZ2xlIG9yaWdpbmFsTG9jYXRpb247Ci0gIHByb3RlY3RlZCBQb2x5bGluZSBwb2x5TGluZTsKLSAgCi0gIHByb3RlY3RlZCBNb3ZlWFNEQmFzZUFjdGlvbiBhY3Rpb247Ci0gIHByb3RlY3RlZCBMaXN0IHRhcmdldFNwYWNlc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByb3RlY3RlZCBpbnQgY2xvc2VyU2libGluZzsKLSAgCi0gIHB1YmxpYyBCYXNlRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRQYXJ0Vmlld2VyIHZpZXdlciwgQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7ICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXR1cCgpOwotIAotICBwdWJsaWMgUG9pbnRMaXN0IGdldENvbm5lY3Rpb25Qb2ludHMoUmVjdGFuZ2xlIGRyYWdnZWRGaWd1cmVCb3VuZHMpCi0gIHsKLSAgICBQb2ludExpc3QgcG9pbnRMaXN0ID0gbnVsbDsKLSAgICBpZiAodGFyZ2V0ICE9IG51bGwgJiYgaXRlbVRvRHJhZyAhPSBudWxsICYmIHBhcmVudEVkaXRQYXJ0ICE9IG51bGwpCi0gICAgewotICAgICAgcG9pbnRMaXN0ID0gZ2V0Q29ubmVjdGlvblBvaW50cyhwYXJlbnRFZGl0UGFydCwgaXRlbVRvRHJhZywgZHJhZ2dlZEZpZ3VyZUJvdW5kcyk7Ci0gICAgfQotICAgIHJldHVybiBwb2ludExpc3QgIT0gbnVsbCA/IHBvaW50TGlzdCA6IG5ldyBQb2ludExpc3QoKTsKLSAgfQotICAKLSAgLy8gVGhpcyBtZXRob2Qgc3VwcG9ydHMgdGhlIHByZXZpZXcgY29ubmVjdGlvbiBsaW5lIGZ1bmN0aW9uIHJlbGF0ZWQgdG8gZHJhZyBhbmQgZHJvcAotICAvLyAgICAgCi0gIHB1YmxpYyBQb2ludExpc3QgZ2V0Q29ubmVjdGlvblBvaW50cyhDb25uZWN0YWJsZUVkaXRQYXJ0IHBhcmVudEVkaXRQYXJ0LCBCYXNlRmllbGRFZGl0UGFydCBjaGlsZFJlZkVkaXRQYXJ0LCBSZWN0YW5nbGUgZHJhZ2dlZEZpZ3VyZUJvdW5kcykKLSAgeyAgICAgICAgICAgCi0gICAgUG9pbnRMaXN0IHBvaW50TGlzdCA9IG5ldyBQb2ludExpc3QoKTsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaW50W10gZGF0YSA9IG5ldyBpbnRbMV07Ci0gICAgUG9pbnQgYSA9IGdldENvbm5lY3Rpb25Qb2ludChwYXJlbnRFZGl0UGFydCwgY2hpbGRSZWZFZGl0UGFydCwgZGF0YSk7Ci0gICAgaWYgKGEgIT0gbnVsbCkKLSAgICB7ICAgCi0gICAgICBpbnQgZHJhZ2dlZEZpZ3VyZUJvdW5kc1kgPSBkcmFnZ2VkRmlndXJlQm91bmRzLnkgKyBkcmFnZ2VkRmlndXJlQm91bmRzLmhlaWdodC8yOwotCi0gICAgICBwb2ludExpc3QuYWRkUG9pbnQoYSk7IAotICAgICAgCi0gICAgICBpZiAoZGF0YVswXSA9PSAwKSAvLyBpbnNlcnQgYmV0d2VlbiAyIGl0ZW1zCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaW50IHggPSBhLnggKyA1OwotICAgICAgICBwb2ludExpc3QuYWRkUG9pbnQobmV3IFBvaW50KHgsIGEueSkpOwotICAgICAgICBwb2ludExpc3QuYWRkUG9pbnQobmV3IFBvaW50KHgsIGRyYWdnZWRGaWd1cmVCb3VuZHNZKSk7ICAgICAgICAKLSAgICAgICAgcG9pbnRMaXN0LmFkZFBvaW50KG5ldyBQb2ludChkcmFnZ2VkRmlndXJlQm91bmRzLngsIGRyYWdnZWRGaWd1cmVCb3VuZHNZKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIC8vIGluc2VydCBhdCBmaXJzdCBvciBsYXN0IHBvc2l0aW9uCi0gICAgICB7Ci0gICAgICAgIHBvaW50TGlzdC5hZGRQb2ludChuZXcgUG9pbnQoYS54LCBkcmFnZ2VkRmlndXJlQm91bmRzWSkpOyAgIAotICAgICAgICBwb2ludExpc3QuYWRkUG9pbnQobmV3IFBvaW50KGRyYWdnZWRGaWd1cmVCb3VuZHMueCwgZHJhZ2dlZEZpZ3VyZUJvdW5kc1kpKTsKLSAgICAgIH0KLSAgICB9ICAgICAgIAotICAgIHJldHVybiBwb2ludExpc3Q7Ci0gIH0KLQotICAvLyBUaGlzIG1ldGhvZCBzdXBwb3J0cyB0aGUgcHJldmlldyBjb25uZWN0aW9uIGxpbmUgZnVuY3Rpb24gcmVsYXRlZCB0byBkcmFnIGFuZCBkcm9wCi0gIC8vICAgICAKLSAgcHJvdGVjdGVkIFBvaW50IGdldENvbm5lY3Rpb25Qb2ludChDb25uZWN0YWJsZUVkaXRQYXJ0IHBhcmVudEVkaXRQYXJ0LCBCYXNlRmllbGRFZGl0UGFydCBjaGlsZFJlZkVkaXRQYXJ0LCBpbnRbXSBkYXRhKQotICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgIFBvaW50IHBvaW50ID0gbnVsbDsgICAgIAotICAgIExpc3QgY2hpbGRMaXN0ID0gcGFyZW50RWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKTsgICAgICAgICAKLSAgICBpZiAocGFyZW50RWRpdFBhcnQuZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBHZW5lcmljR3JvdXBGaWd1cmUgJiYgY2hpbGRMaXN0LnNpemUoKSA+IDApCi0gICAgewotICAgICAgcG9pbnQgPSBuZXcgUG9pbnQoKTsKLQotICAgICAgUmVjdGFuZ2xlIHIgPSBnZXRDb25uZWN0ZWRFZGl0UGFydENvbm5lY3Rpb25Cb3VuZHMocGFyZW50RWRpdFBhcnQpOyAgCi0gICAgICBwb2ludC54ID0gci54ICsgci53aWR0aDsKLSAgICAgIHBvaW50LnkgPSByLnkgKyByLmhlaWdodC8yOwotICAgIH0gICAgCi0gICAgcmV0dXJuIHBvaW50OwotICB9Ci0KLSAgcHJvdGVjdGVkIFJlY3RhbmdsZSBnZXRDb25uZWN0ZWRFZGl0UGFydENvbm5lY3Rpb25Cb3VuZHMoQ29ubmVjdGFibGVFZGl0UGFydCBlZGl0UGFydCkKLSAgewotICAgIHJldHVybiBnZXRab29tZWRCb3VuZHMoKChHZW5lcmljR3JvdXBGaWd1cmUpZWRpdFBhcnQuZ2V0RmlndXJlKCkpLmdldEljb25GaWd1cmUoKS5nZXRCb3VuZHMoKSk7Ci0gIH0KLSAgICAKLSAgcHVibGljIHZvaWQgcmVkbygpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVuZG8oKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIGlmIChjYW5FeGVjdXRlKQotICAgIHsKLSAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKQotICB7Ci0gICAgcmV0dXJuIGNhbkV4ZWN1dGU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNvbW1vblNldHVwKExpc3Qgc2libGluZ3MsIEdyYXBoaWNhbEVkaXRQYXJ0IG1vdmluZ0VkaXRQYXJ0KQotICB7Ci0gICAgY2xvc2VyU2libGluZyA9IEFCT1ZFX0lTX0NMT1NFUjsKLSAgICBpbnQgcG9pbnRlcllMb2NhdGlvbiA9IGxvY2F0aW9uLnk7Ci0gICAgaW50IGluZGV4OwotICAgIAotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHNpYmxpbmdzLnNpemUoKTsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBHcmFwaGljYWxFZGl0UGFydCBzaWJsaW5nID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBzaWJsaW5ncy5nZXQoaW5kZXgpOwotICAgICAgaWYgKHNpYmxpbmcgaW5zdGFuY2VvZiBCYXNlRmllbGRFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgaW50IHNpYmxpbmdZTG9jYXRpb24gPSBnZXRab29tZWRCb3VuZHMoc2libGluZy5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKSkuZ2V0Q2VudGVyKCkueTsKLQotICAgICAgICBpZiAoc2libGluZ1lMb2NhdGlvbiA+IHBvaW50ZXJZTG9jYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICByaWdodFNpYmxpbmdFZGl0UGFydCA9IHNpYmxpbmc7Ci0gICAgICAgICAgaWYgKGluZGV4ID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsZWZ0U2libGluZ0VkaXRQYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBzaWJsaW5ncy5nZXQoaW5kZXggLSAxKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAobGVmdFNpYmxpbmdFZGl0UGFydCAhPSBudWxsICYmIE1hdGguYWJzKGdldFpvb21lZEJvdW5kcyhsZWZ0U2libGluZ0VkaXRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpKS5nZXRDZW50ZXIoKS55IC0gcG9pbnRlcllMb2NhdGlvbikgPiBNYXRoLmFicyhzaWJsaW5nWUxvY2F0aW9uIC0gcG9pbnRlcllMb2NhdGlvbikpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2xvc2VyU2libGluZyA9IEJFTE9XX0lTX0NMT1NFUjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sZWFuIGlzSGFuZGxlZCA9IGhhbmRsZUZpcnN0QW5kTGFzdERyb3BUYXJnZXRzKGluZGV4LCBzaWJsaW5ncyk7Ci0gICAgaWYgKCFpc0hhbmRsZWQpCi0gICAgICBoYW5kbGVPdGhlclRhcmdldHMoaW5kZXgpOwotCi0gICAgY2FsY3VsYXRlTGVmdEFuZFJpZ2h0WFNEQ29tcG9uZW50cygpOwotICAgIAotICAgIHhzZENvbXBvbmVudFRvRHJhZyA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgKChYU0RCYXNlQWRhcHRlcikgaXRlbVRvRHJhZy5nZXRNb2RlbCgpKS5nZXRUYXJnZXQoKTsgICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNhbGN1bGF0ZUxlZnRBbmRSaWdodFhTRENvbXBvbmVudHMoKQotICB7Ci0gICAgaWYgKGxlZnRTaWJsaW5nRWRpdFBhcnQgaW5zdGFuY2VvZiBYU0RCYXNlRmllbGRFZGl0UGFydCkKLSAgICB7Ci0gICAgICBPYmplY3QgbGVmdE1vZGVsID0gKChYU0RCYXNlRmllbGRFZGl0UGFydCkgbGVmdFNpYmxpbmdFZGl0UGFydCkuZ2V0TW9kZWwoKTsKLSAgICAgIHByZXZpb3VzUmVmQ29tcG9uZW50ID0gbnVsbDsKLSAgICAgIGlmIChsZWZ0TW9kZWwgaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgWFNEQmFzZUFkYXB0ZXIgbGVmdEFkYXB0ZXIgPSAoWFNEQmFzZUFkYXB0ZXIpIGxlZnRNb2RlbDsKLSAgICAgICAgcHJldmlvdXNSZWZDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpIGxlZnRBZGFwdGVyLmdldFRhcmdldCgpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChyaWdodFNpYmxpbmdFZGl0UGFydCBpbnN0YW5jZW9mIFhTREJhc2VGaWVsZEVkaXRQYXJ0KQotICAgIHsKLSAgICAgIE9iamVjdCByaWdodE1vZGVsID0gKChYU0RCYXNlRmllbGRFZGl0UGFydCkgcmlnaHRTaWJsaW5nRWRpdFBhcnQpLmdldE1vZGVsKCk7Ci0gICAgICBuZXh0UmVmQ29tcG9uZW50ID0gbnVsbDsKLSAgICAgIGlmIChyaWdodE1vZGVsIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIFhTREJhc2VBZGFwdGVyIHJpZ2h0QWRhcHRlciA9IChYU0RCYXNlQWRhcHRlcikgcmlnaHRNb2RlbDsKLSAgICAgICAgbmV4dFJlZkNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgcmlnaHRBZGFwdGVyLmdldFRhcmdldCgpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRmlyc3RBbmRMYXN0RHJvcFRhcmdldHMoaW50IGluZGV4LCBMaXN0IHNpYmxpbmdzKQotICB7Ci0gICAgLy8gSGFuZGxlIGNhc2Ugd2hlcmUgeW91IGRyb3AgdG8gZmlyc3QgcG9zaXRpb24KLSAgICBpZiAoaW5kZXggPT0gMCAmJiBzaWJsaW5ncy5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIGxlZnRTaWJsaW5nRWRpdFBhcnQgPSBudWxsOwotICAgICAgcmlnaHRTaWJsaW5nRWRpdFBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIHNpYmxpbmdzLmdldCgwKTsKLSAgICAgIGNsb3NlclNpYmxpbmcgPSBCRUxPV19JU19DTE9TRVI7Ci0gICAgfQotICAgIC8vIEhhbmRsZSBjYXNlIHdoZXJlIHlvdSBkcm9wIHRvIGxhc3QgcG9zaXRpb24KLSAgICBlbHNlIGlmIChpbmRleCA+IDAgJiYgaW5kZXggPT0gc2libGluZ3Muc2l6ZSgpKQotICAgIHsKLSAgICAgIGxlZnRTaWJsaW5nRWRpdFBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIHNpYmxpbmdzLmdldChpbmRleCAtIDEpOwotICAgICAgcmlnaHRTaWJsaW5nRWRpdFBhcnQgPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVPdGhlclRhcmdldHMoaW50IGluZGV4KQotICB7Ci0gICAgaW50IGluID0gMDsKLSAgICBDb25uZWN0YWJsZUVkaXRQYXJ0IHByZXZpb3VzTW9kZWxFZGl0UGFydCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gdGFyZ2V0U3BhY2VzTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgIHByZXZpb3VzTW9kZWxFZGl0UGFydCA9IHBhcmVudEVkaXRQYXJ0OwotICAgICAgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCBzcCA9IChUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KSBvOwotICAgICAgaWYgKHNwLmdldFBhcmVudCgpIGluc3RhbmNlb2YgQ29ubmVjdGFibGVFZGl0UGFydCkKLSAgICAgICAgcGFyZW50RWRpdFBhcnQgPSAoQ29ubmVjdGFibGVFZGl0UGFydClzcC5nZXRQYXJlbnQoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcGFyZW50RWRpdFBhcnQgPSBudWxsOwotICAgICAgaW4rKzsKLSAgICAgIGlmIChpbiA+IGluZGV4KQotICAgICAgewotICAgICAgICBpZiAoY2xvc2VyU2libGluZyA9PSBBQk9WRV9JU19DTE9TRVIpCi0gICAgICAgIHsKLSAgICAgICAgICBwYXJlbnRFZGl0UGFydCA9IHByZXZpb3VzTW9kZWxFZGl0UGFydDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9ICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgTGlzdCBjYWxjdWxhdGVGaWVsZEVkaXRQYXJ0cygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSB0YXJnZXQuZ2V0UGFyZW50KCkuZ2V0Q2hpbGRyZW4oKTsKLSAgICBMaXN0IGxpc3RPZkZpZWxkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBCYXNlRmllbGRFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgbGlzdE9mRmllbGRzLmFkZChvKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3RPZkZpZWxkczsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFBvaW50TGlzdCBkcmF3TGluZXMoUG9seWxpbmUgcG9seUxpbmUpCi0gIHsKLSAgICBQb2ludExpc3QgcG9pbnRMaXN0ID0gbmV3IFBvaW50TGlzdCgpOwotCi0gICAgaWYgKGxlZnRTaWJsaW5nRWRpdFBhcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBSZWN0YW5nbGUgbGVmdFJlY3RhbmdsZSA9IGdldFpvb21lZEJvdW5kcyhsZWZ0U2libGluZ0VkaXRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpKTsKLSAgICAgIGludCB4Q29vcmQgPSBsZWZ0UmVjdGFuZ2xlLng7Ci0gICAgICBpbnQgeUNvb3JkID0gbGVmdFJlY3RhbmdsZS55OwotICAgICAgaW50IGhlaWdodCA9IGxlZnRSZWN0YW5nbGUuaGVpZ2h0OwotICAgICAgaW50IHdpZHRoID0gbGVmdFJlY3RhbmdsZS53aWR0aDsKLQotICAgICAgLy8gRHJhdyBsZWZ0IGVuZCBsaW5lCi0gICAgICBhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkLCB5Q29vcmQgKyBoZWlnaHQgKyAzLCB4Q29vcmQsIHlDb29yZCArIGhlaWdodCAtIDMpOwotICAgICAgYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCwgeUNvb3JkICsgaGVpZ2h0IC0gMywgeENvb3JkLCB5Q29vcmQgKyBoZWlnaHQpOwotCi0gICAgICAvLyBEcmF3IGhvcml6b250YWwgbGluZQotICAgICAgYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCwgeUNvb3JkICsgaGVpZ2h0LCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkICsgaGVpZ2h0KTsKLQotICAgICAgLy8gRHJhdyByaWdodCBlbmQgbGluZQotICAgICAgYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQgKyBoZWlnaHQsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQgKyBoZWlnaHQgLSAzKTsKLSAgICAgIGFkZExpbmVUb1BvbHlsaW5lKHBvbHlMaW5lLCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkICsgaGVpZ2h0LCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkICsgaGVpZ2h0ICsgMyk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHJpZ2h0U2libGluZ0VkaXRQYXJ0ICE9IG51bGwpCi0gICAgewotICAgICAgUmVjdGFuZ2xlIHJpZ2h0UmVjdGFuZ2xlID0gZ2V0Wm9vbWVkQm91bmRzKHJpZ2h0U2libGluZ0VkaXRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpKTsKLSAgICAgIGludCB4Q29vcmQgPSByaWdodFJlY3RhbmdsZS54OwotICAgICAgaW50IHlDb29yZCA9IHJpZ2h0UmVjdGFuZ2xlLnk7Ci0gICAgICBpbnQgd2lkdGggPSByaWdodFJlY3RhbmdsZS53aWR0aDsKLQotICAgICAgLy8gRHJhdyBsZWZ0IGVuZCBsaW5lCi0gICAgICBhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkLCB5Q29vcmQgKyAzLCB4Q29vcmQsIHlDb29yZCAtIDMpOwotICAgICAgYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCwgeUNvb3JkIC0gMywgeENvb3JkLCB5Q29vcmQpOwotCi0gICAgICAvLyBEcmF3IGhvcml6b250YWwgbGluZQotICAgICAgYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCwgeUNvb3JkLCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkKTsKLQotICAgICAgLy8gRHJhdyByaWdodCBlbmQgbGluZQotICAgICAgYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQgLSAzKTsKLSAgICAgIGFkZExpbmVUb1BvbHlsaW5lKHBvbHlMaW5lLCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkLCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkICsgMyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHBvaW50TGlzdDsKLSAgfQotCi0gIHByb3RlY3RlZCBQb2x5bGluZSBhZGRMaW5lVG9Qb2x5bGluZShQb2x5bGluZSBwb2x5bGluZSwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKQotICB7Ci0gICAgcG9seWxpbmUuYWRkUG9pbnQobmV3IFBvaW50KHgxLCB5MSkpOwotICAgIHBvbHlsaW5lLmFkZFBvaW50KG5ldyBQb2ludCh4MiwgeTIpKTsKLQotICAgIHJldHVybiBwb2x5bGluZTsKLSAgfQotICAKLSAgcHVibGljIElGaWd1cmUgZ2V0RmVlZGJhY2tGaWd1cmUoKQotICB7Ci0gICAgRmlndXJlIHBhbmVsID0gbmV3IEZpZ3VyZSgpOwotICAgIHBhbmVsLnNldExheW91dE1hbmFnZXIobmV3IEZyZWVmb3JtTGF5b3V0KCkpOwotICAgIHBhbmVsLnNldE9wYXF1ZShmYWxzZSk7Ci0KLSAgICBQb2x5bGluZSBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBQb2x5bGluZSgpOwotICAgIGZlZWRiYWNrRmlndXJlLnNldExpbmVXaWR0aCgyKTsKLSAgICBkcmF3TGluZXMoZmVlZGJhY2tGaWd1cmUpOwotICAgIG9yaWdpbmFsTG9jYXRpb24gPSBuZXcgUmVjdGFuZ2xlKGZlZWRiYWNrRmlndXJlLmdldEJvdW5kcygpKTsKLSAgICBwYW5lbC5hZGQoZmVlZGJhY2tGaWd1cmUpOwotCi0gICAgcG9seUxpbmUgPSBuZXcgUG9seWxpbmUoKTsKLSAgICBwb2x5TGluZS5zZXRMaW5lU3R5bGUoR3JhcGhpY3MuTElORV9EQVNIRE9UKTsKLSAgICBwb2x5TGluZS5zZXRMaW5lV2lkdGgoMSk7Ci0gICAgcGFuZWwuYWRkKHBvbHlMaW5lKTsKLSAgICAKLSAgICBwYW5lbC5zZXRCb3VuZHMob3JpZ2luYWxMb2NhdGlvbik7Ci0gICAgCi0gICAgYWRkQ29ubmVjdG9yVG9QYXJlbnQocGFuZWwpOwotCi0gICAgaWYgKHBhcmVudEVkaXRQYXJ0ICE9IG51bGwgJiYgcGFyZW50RWRpdFBhcnQuZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBHZW5lcmljR3JvdXBGaWd1cmUpCi0gICAgewotICAgICAgR2VuZXJpY0dyb3VwRmlndXJlIGZpZyA9IChHZW5lcmljR3JvdXBGaWd1cmUpcGFyZW50RWRpdFBhcnQuZ2V0RmlndXJlKCk7Ci0gICAgICBSZWN0YW5nbGUgaWNvbkJvdW5kcyA9IGdldFpvb21lZEJvdW5kcyhmaWcuZ2V0SWNvbkZpZ3VyZSgpLmdldEJvdW5kcygpKTsKLSAgICAgIFJvdW5kZWRSZWN0YW5nbGUgcm91bmRlZFJlY3RhbmdsZSA9IG5ldyBSb3VuZGVkUmVjdGFuZ2xlKCk7Ci0gICAgICByb3VuZGVkUmVjdGFuZ2xlLnNldEZpbGwoZmFsc2UpOwotICAgICAgcm91bmRlZFJlY3RhbmdsZS5zZXRPcGFxdWUodHJ1ZSk7Ci0vLyAgICAgIHJvdW5kZWRSZWN0YW5nbGUuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoaWNvbkJvdW5kcy54LCBpY29uQm91bmRzLnksIGljb25Cb3VuZHMud2lkdGggLSAxLCBpY29uQm91bmRzLmhlaWdodCAtIDEpKTsKLSAgICAgIHJvdW5kZWRSZWN0YW5nbGUuc2V0Qm91bmRzKGljb25Cb3VuZHMpOwotICAgICAgcGFuZWwuYWRkKHJvdW5kZWRSZWN0YW5nbGUpOwotICAgIH0KLSAgICByZXR1cm4gcGFuZWw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGFkZENvbm5lY3RvclRvUGFyZW50KElGaWd1cmUgcCkKLSAgewotICAgIFJlY3RhbmdsZSByID0gb3JpZ2luYWxMb2NhdGlvbi5nZXRDb3B5KCk7Ci0gICAgUmVjdGFuZ2xlIHBCb3VuZHMgPSByLmdldENvcHkoKTsKLSAgICBQb2ludExpc3QgcG9pbnRMaXN0ID0gZ2V0Q29ubmVjdGlvblBvaW50cyhyKTsKLQotICAgIGlmIChwb2ludExpc3QgIT0gbnVsbCAmJiBwb2ludExpc3Quc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBwb2x5TGluZS5zZXRQb2ludHMocG9pbnRMaXN0KTsKLSAgICAgIFBvaW50IGZpcnN0UG9pbnQgPSBwb2ludExpc3QuZ2V0Rmlyc3RQb2ludCgpOwotICAgICAgaWYgKGZpcnN0UG9pbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcEJvdW5kcyA9IHBCb3VuZHMuZ2V0VW5pb24obmV3IFJlY3RhbmdsZShmaXJzdFBvaW50LngsIGZpcnN0UG9pbnQueSwgMSwgMSkpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChwYXJlbnRFZGl0UGFydCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChwYXJlbnRFZGl0UGFydC5nZXRGaWd1cmUoKSBpbnN0YW5jZW9mIEdlbmVyaWNHcm91cEZpZ3VyZSkKLSAgICAgIHsKLSAgICAgICAgR2VuZXJpY0dyb3VwRmlndXJlIGZpZyA9IChHZW5lcmljR3JvdXBGaWd1cmUpcGFyZW50RWRpdFBhcnQuZ2V0RmlndXJlKCk7Ci0gICAgICAgIFJlY3RhbmdsZSBpY29uQm91bmRzID0gZ2V0Wm9vbWVkQm91bmRzKGZpZy5nZXRJY29uRmlndXJlKCkuZ2V0Qm91bmRzKCkpOwotICAgICAgICBwQm91bmRzID0gcEJvdW5kcy5nZXRVbmlvbihpY29uQm91bmRzKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwLnNldEJvdW5kcyhwQm91bmRzKTsKLSAgICBwLnZhbGlkYXRlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBQb2ludCBnZXRab29tZWRQb2ludChQb2ludCBwKQotICB7Ci0gICAgZG91YmxlIGZhY3RvciA9ICgoU2NhbGFibGVSb290RWRpdFBhcnQpdmlld2VyLmdldFJvb3RFZGl0UGFydCgpKS5nZXRab29tTWFuYWdlcigpLmdldFpvb20oKTsKLQotICAgIGludCB4ID0gKGludClNYXRoLnJvdW5kKHAueCAqIGZhY3Rvcik7Ci0gICAgaW50IHkgPSAoaW50KU1hdGgucm91bmQocC55ICogZmFjdG9yKTsKLQotICAgIHJldHVybiBuZXcgUG9pbnQoeCwgeSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBSZWN0YW5nbGUgZ2V0Wm9vbWVkQm91bmRzKFJlY3RhbmdsZSByKQotICB7Ci0gICAgZG91YmxlIGZhY3RvciA9ICgoU2NhbGFibGVSb290RWRpdFBhcnQpdmlld2VyLmdldFJvb3RFZGl0UGFydCgpKS5nZXRab29tTWFuYWdlcigpLmdldFpvb20oKTsKLQotICAgIGludCB4ID0gKGludClNYXRoLnJvdW5kKHIueCAqIGZhY3Rvcik7Ci0gICAgaW50IHkgPSAoaW50KU1hdGgucm91bmQoci55ICogZmFjdG9yKTsKLSAgICBpbnQgd2lkdGggPSAoaW50KU1hdGgucm91bmQoci53aWR0aCAqIGZhY3Rvcik7Ci0gICAgaW50IGhlaWdodCA9IChpbnQpTWF0aC5yb3VuZChyLmhlaWdodCAqIGZhY3Rvcik7Ci0KLSAgICByZXR1cm4gbmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZUtleWJvYXJkRHJhZ0FuZERyb3AoWFNEQmFzZUZpZWxkRWRpdFBhcnQgbGVmdEZpZWxkLCBYU0RCYXNlRmllbGRFZGl0UGFydCByaWdodEZpZWxkLCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgdGFyZ2V0ID0gbGVmdEZpZWxkOwotICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuU09VVEgpCi0gICAgewotICAgICAgaWYgKGl0ZW1Ub0RyYWcgPT0gdGFyZ2V0KQotICAgICAgICByZXR1cm47Ci0gICAgICB0YXJnZXQgPSByaWdodEZpZWxkOwotICAgIH0KLSAgICB0aGlzLmxvY2F0aW9uID0gbnVsbDsKLSAgICBpZiAodGFyZ2V0ICE9IG51bGwpCi0gICAgICB0aGlzLmxvY2F0aW9uID0gdGFyZ2V0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tYW5kcy9YU0RBdHRyaWJ1dGVEcmFnQW5kRHJvcENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL1hTREF0dHJpYnV0ZURyYWdBbmREcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTUwZGYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL1hTREF0dHJpYnV0ZURyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuTW92ZVhTREF0dHJpYnV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRFdpbGRjYXJkQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VGaWVsZEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkNvbXBsZXhUeXBlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLkF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5UYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5YU0RBdHRyaWJ1dGVzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5YU0RCYXNlRmllbGRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLkdlbmVyaWNHcm91cEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLQotcHVibGljIGNsYXNzIFhTREF0dHJpYnV0ZURyYWdBbmREcm9wQ29tbWFuZCBleHRlbmRzIEJhc2VEcmFnQW5kRHJvcENvbW1hbmQKLXsKLSAgcHVibGljIFhTREF0dHJpYnV0ZURyYWdBbmREcm9wQ29tbWFuZChFZGl0UGFydFZpZXdlciB2aWV3ZXIsIENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCwgR3JhcGhpY2FsRWRpdFBhcnQgdGFyZ2V0LCBYU0RCYXNlRmllbGRFZGl0UGFydCBpdGVtVG9EcmFnLCBQb2ludCBsb2NhdGlvbikKLSAgewotICAgIHN1cGVyKHZpZXdlciwgcmVxdWVzdCk7Ci0gICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0gICAgdGhpcy5pdGVtVG9EcmFnID0gaXRlbVRvRHJhZzsKLSAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgc2V0dXAoKTsKLSAgfQotCi0gIHB1YmxpYyBYU0RBdHRyaWJ1dGVEcmFnQW5kRHJvcENvbW1hbmQoWFNEQmFzZUZpZWxkRWRpdFBhcnQgaXRlbVRvRHJhZywgWFNEQmFzZUZpZWxkRWRpdFBhcnQgbGVmdEZpZWxkLCBYU0RCYXNlRmllbGRFZGl0UGFydCByaWdodEZpZWxkLCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgc3VwZXIoaXRlbVRvRHJhZy5nZXRWaWV3ZXIoKSwgbnVsbCk7IAotICAgIHRoaXMuaXRlbVRvRHJhZyA9IGl0ZW1Ub0RyYWc7Ci0gICAgY2FuRXhlY3V0ZSA9IGZhbHNlOwotICAgIGhhbmRsZUtleWJvYXJkRHJhZ0FuZERyb3AobGVmdEZpZWxkLCByaWdodEZpZWxkLCBkaXJlY3Rpb24pOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVLZXlib2FyZERyYWdBbmREcm9wKFhTREJhc2VGaWVsZEVkaXRQYXJ0IGxlZnRGaWVsZCwgWFNEQmFzZUZpZWxkRWRpdFBhcnQgcmlnaHRGaWVsZCwgaW50IGRpcmVjdGlvbikKLSAgewotICAgIHN1cGVyLmhhbmRsZUtleWJvYXJkRHJhZ0FuZERyb3AobGVmdEZpZWxkLCByaWdodEZpZWxkLCBkaXJlY3Rpb24pOwotICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgpCi0gICAgewotICAgICAgaWYgKHRhcmdldCA9PSBudWxsKQotICAgICAgewotICAgICAgICB0YXJnZXQgPSByaWdodEZpZWxkOwotICAgICAgICB0aGlzLmxvY2F0aW9uID0gdGFyZ2V0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldFRvcCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIShsZWZ0RmllbGQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlcikKLSAgICAgICAgICAgICAgICAgfHwgbGVmdEZpZWxkLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZEFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIHRhcmdldCA9IHJpZ2h0RmllbGQ7Ci0gICAgICAgIHRoaXMubG9jYXRpb24gPSB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0VG9wKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKSByZXR1cm47Ci0gICAgc2V0dXAoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgc2V0dXAoKQotICB7Ci0gICAgY2FuRXhlY3V0ZSA9IGZhbHNlOwotCi0gICAgLy8gRHJvcCB0YXJnZXQgaXMgYXR0cmlidXRlIGdyb3VwIHJlZgotICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCkKLSAgICB7Ci0gICAgICBwYXJlbnRFZGl0UGFydCA9IChBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCkgdGFyZ2V0OwotICAgICAgaWYgKCgoR2VuZXJpY0dyb3VwRmlndXJlKSBwYXJlbnRFZGl0UGFydC5nZXRGaWd1cmUoKSkuZ2V0SWNvbkZpZ3VyZSgpLmdldEJvdW5kcygpLmNvbnRhaW5zKGxvY2F0aW9uKSkKLSAgICAgIHsKLSAgICAgICAgeHNkQ29tcG9uZW50VG9EcmFnID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSAoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWRhcHRlcikgaXRlbVRvRHJhZy5nZXRNb2RlbCgpKS5nZXRUYXJnZXQoKTsKLSAgICAgICAgYWN0aW9uID0gbmV3IE1vdmVYU0RBdHRyaWJ1dGVBY3Rpb24oKChBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCkgcGFyZW50RWRpdFBhcnQpLmdldFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpLCB4c2RDb21wb25lbnRUb0RyYWcsIG51bGwsIG51bGwpOwotICAgICAgICBjYW5FeGVjdXRlID0gYWN0aW9uLmNhbk1vdmUoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQmFzZUZpZWxkRWRpdFBhcnQpCi0gICAgewotICAgICAgdGFyZ2V0U3BhY2VzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbGlzdCBvZiBhbGwgc2libGluZyBmaWVsZCBlZGl0IHBhcnRzOwotICAgICAgTGlzdCB0YXJnZXRFZGl0UGFydFNpYmxpbmdzID0gY2FsY3VsYXRlRmllbGRFZGl0UGFydHMoKTsKLSAgICAgIGNhbGN1bGF0ZUF0dHJpYnV0ZUdyb3VwTGlzdCgpOwotCi0gICAgICAvLyBHZXQgJ2xlZnQnIGFuZCAncmlnaHQnIHNpYmxpbmdzCi0gICAgICBkb0Ryb3AodGFyZ2V0RWRpdFBhcnRTaWJsaW5ncywgaXRlbVRvRHJhZyk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZG9Ecm9wKExpc3Qgc2libGluZ3MsIEdyYXBoaWNhbEVkaXRQYXJ0IG1vdmluZ0VkaXRQYXJ0KQotICB7Ci0gICAgY29tbW9uU2V0dXAoc2libGluZ3MsIG1vdmluZ0VkaXRQYXJ0KTsKLQotICAgIGlmICgocHJldmlvdXNSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB8fCBwcmV2aW91c1JlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKSAKLSAgICAgICAgJiYgKG5leHRSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB8fCBuZXh0UmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEV2lsZGNhcmQpKQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IHByZXZpb3VzUmVmQ29tcG9uZW50LmdldENvbnRhaW5lcigpLmdldENvbnRhaW5lcigpOwotICAgICAgaWYgKGNsb3NlclNpYmxpbmcgPT0gQkVMT1dfSVNfQ0xPU0VSKQotICAgICAgewotICAgICAgICBwYXJlbnQgPSBuZXh0UmVmQ29tcG9uZW50LmdldENvbnRhaW5lcigpLmdldENvbnRhaW5lcigpOwotICAgICAgfQotICAgICAgYWN0aW9uID0gbmV3IE1vdmVYU0RBdHRyaWJ1dGVBY3Rpb24ocGFyZW50LCB4c2RDb21wb25lbnRUb0RyYWcsIHByZXZpb3VzUmVmQ29tcG9uZW50LCBuZXh0UmVmQ29tcG9uZW50KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHJldmlvdXNSZWZDb21wb25lbnQgPT0gbnVsbCAmJiAobmV4dFJlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHx8IG5leHRSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkpCi0gICAgewotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gbmV4dFJlZkNvbXBvbmVudC5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKTsKLSAgICAgIGlmIChjbG9zZXJTaWJsaW5nID09IEFCT1ZFX0lTX0NMT1NFUikKLSAgICAgIHsKLSAgICAgICAgaWYgKGxlZnRTaWJsaW5nRWRpdFBhcnQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlWFNEQXR0cmlidXRlQWN0aW9uKHBhcmVudCwgeHNkQ29tcG9uZW50VG9EcmFnLCBwcmV2aW91c1JlZkNvbXBvbmVudCwgbmV4dFJlZkNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFyZW50RWRpdFBhcnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlWFNEQXR0cmlidXRlQWN0aW9uKHBhcmVudEVkaXRQYXJ0LmdldFhTRENvbmNyZXRlQ29tcG9uZW50KCksIHhzZENvbXBvbmVudFRvRHJhZywgcHJldmlvdXNSZWZDb21wb25lbnQsIG5leHRSZWZDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlWFNEQXR0cmlidXRlQWN0aW9uKHBhcmVudCwgeHNkQ29tcG9uZW50VG9EcmFnLCBwcmV2aW91c1JlZkNvbXBvbmVudCwgbmV4dFJlZkNvbXBvbmVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHByZXZpb3VzUmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gJiYgbmV4dFJlZkNvbXBvbmVudCA9PSBudWxsKQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IHByZXZpb3VzUmVmQ29tcG9uZW50LmdldENvbnRhaW5lcigpLmdldENvbnRhaW5lcigpOwotICAgICAgaWYgKGNsb3NlclNpYmxpbmcgPT0gQUJPVkVfSVNfQ0xPU0VSKQotICAgICAgewotICAgICAgICBhY3Rpb24gPSBuZXcgTW92ZVhTREF0dHJpYnV0ZUFjdGlvbihwYXJlbnQsIHhzZENvbXBvbmVudFRvRHJhZywgcHJldmlvdXNSZWZDb21wb25lbnQsIG5leHRSZWZDb21wb25lbnQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAocmlnaHRTaWJsaW5nRWRpdFBhcnQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlWFNEQXR0cmlidXRlQWN0aW9uKHBhcmVudCwgeHNkQ29tcG9uZW50VG9EcmFnLCBwcmV2aW91c1JlZkNvbXBvbmVudCwgbmV4dFJlZkNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYWN0aW9uID0gbmV3IE1vdmVYU0RBdHRyaWJ1dGVBY3Rpb24ocGFyZW50LCB4c2RDb21wb25lbnRUb0RyYWcsIHByZXZpb3VzUmVmQ29tcG9uZW50LCBuZXh0UmVmQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmIChhY3Rpb24gIT0gbnVsbCkKLSAgICAgIGNhbkV4ZWN1dGUgPSBhY3Rpb24uY2FuTW92ZSgpOwotICB9Ci0KLSAgCi0gIC8vIEF0dHJpYnV0ZSBHcm91cCByZWxhdGVkIGhlbHBlciBtZXRob2QgCi0gIAotICBwcm90ZWN0ZWQgdm9pZCBjYWxjdWxhdGVBdHRyaWJ1dGVHcm91cExpc3QoKQotICB7Ci0gICAgRWRpdFBhcnQgZWRpdFBhcnQgPSB0YXJnZXQ7Ci0gICAgd2hpbGUgKGVkaXRQYXJ0ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29tcGxleFR5cGVFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3QgY2hpbGQgPSBpLm5leHQoKTsKLSAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBDb21wYXJ0bWVudEVkaXRQYXJ0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIExpc3QgY29tcGFydG1lbnRMaXN0ID0gKChDb21wYXJ0bWVudEVkaXRQYXJ0KSBjaGlsZCkuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjb21wYXJ0bWVudExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZXNGb3JBbm5vdGF0aW9uRWRpdFBhcnQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYU0RBdHRyaWJ1dGVzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0IGdyb3VwcyA9IChYU0RBdHRyaWJ1dGVzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0KSBvYmo7Ci0gICAgICAgICAgICAgICAgTGlzdCBncm91cExpc3QgPSBncm91cHMuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBncm91cExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIE9iamVjdCBncm91cENoaWxkID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBDaGlsZCBpbnN0YW5jZW9mIFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldFNwYWNlc0xpc3QuYWRkKGdyb3VwQ2hpbGQpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZ3JvdXBDaGlsZCBpbnN0YW5jZW9mIEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBnZXRBdHRyaWJ1dGVHcm91cEVkaXRQYXJ0cygoQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpIGdyb3VwQ2hpbGQpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWRpdFBhcnQgPSBlZGl0UGFydC5nZXRQYXJlbnQoKTsKLSAgICB9Ci0KLSAgfQotCi0gIC8vIEF0dHJpYnV0ZSBHcm91cCByZWxhdGVkIGhlbHBlciBtZXRob2QKLSAgCi0gIHByb3RlY3RlZCBMaXN0IGdldEF0dHJpYnV0ZUdyb3VwRWRpdFBhcnRzKEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0IGF0dHJpYnV0ZUdyb3VwRWRpdFBhcnQpCi0gIHsKLSAgICBMaXN0IGdyb3VwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBMaXN0IGxpc3QgPSBhdHRyaWJ1dGVHcm91cEVkaXRQYXJ0LmdldENoaWxkcmVuKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG9iamVjdCA9IGkubmV4dCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIHRhcmdldFNwYWNlc0xpc3QuYWRkKG9iamVjdCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQgZ3JvdXBSZWYgPSAoQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpIG9iamVjdDsKLSAgICAgICAgTGlzdCBncm91cFJlZkNoaWxkcmVuID0gZ3JvdXBSZWYuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGdyb3VwUmVmQ2hpbGRyZW4uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBvID0gaXQubmV4dCgpOwotICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRTcGFjZXNMaXN0LmFkZChvKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0IGFHcm91cCA9IChBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCkgbzsKLSAgICAgICAgICAgIGdyb3VwTGlzdC5hZGQoYUdyb3VwKTsKLSAgICAgICAgICAgIGdyb3VwTGlzdC5hZGRBbGwoZ2V0QXR0cmlidXRlR3JvdXBFZGl0UGFydHMoYUdyb3VwKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBncm91cExpc3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL1hTREVsZW1lbnREcmFnQW5kRHJvcENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1hbmRzL1hTREVsZW1lbnREcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg5NzQ5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tYW5kcy9YU0RFbGVtZW50RHJhZ0FuZERyb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5Nb3ZlWFNERWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RXaWxkY2FyZEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRmllbGRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5Db21wbGV4VHlwZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuU3RydWN0dXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLk1vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLk1vZGVsR3JvdXBFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuWFNEQmFzZUZpZWxkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLlhTREdyb3Vwc0ZvckFubm90YXRpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLkdlbmVyaWNHcm91cEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci0KLQotcHVibGljIGNsYXNzIFhTREVsZW1lbnREcmFnQW5kRHJvcENvbW1hbmQgZXh0ZW5kcyBCYXNlRHJhZ0FuZERyb3BDb21tYW5kCi17Ci0gIHByb3RlY3RlZCBNb2RlbEdyb3VwRWRpdFBhcnQgdG9wTW9zdEdyb3VwOwotCi0gIHB1YmxpYyBYU0RFbGVtZW50RHJhZ0FuZERyb3BDb21tYW5kKEVkaXRQYXJ0Vmlld2VyIHZpZXdlciwgQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0LCBHcmFwaGljYWxFZGl0UGFydCB0YXJnZXQsIFhTREJhc2VGaWVsZEVkaXRQYXJ0IGl0ZW1Ub0RyYWcsIFBvaW50IGxvY2F0aW9uKQotICB7Ci0gICAgc3VwZXIodmlld2VyLCByZXF1ZXN0KTsKLSAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKLSAgICB0aGlzLml0ZW1Ub0RyYWcgPSBpdGVtVG9EcmFnOwotICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICBzZXR1cCgpOwotICB9Ci0gIAotICBwdWJsaWMgWFNERWxlbWVudERyYWdBbmREcm9wQ29tbWFuZChYU0RCYXNlRmllbGRFZGl0UGFydCBpdGVtVG9EcmFnLCBYU0RCYXNlRmllbGRFZGl0UGFydCBsZWZ0RmllbGQsIFhTREJhc2VGaWVsZEVkaXRQYXJ0IHJpZ2h0RmllbGQsIGludCBkaXJlY3Rpb24pCi0gIHsKLSAgICBzdXBlcihpdGVtVG9EcmFnLmdldFZpZXdlcigpLCBudWxsKTsgCi0gICAgdGhpcy5pdGVtVG9EcmFnID0gaXRlbVRvRHJhZzsKLSAgICBjYW5FeGVjdXRlID0gZmFsc2U7Ci0gICAgaGFuZGxlS2V5Ym9hcmREcmFnQW5kRHJvcChsZWZ0RmllbGQsIHJpZ2h0RmllbGQsIGRpcmVjdGlvbik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZUtleWJvYXJkRHJhZ0FuZERyb3AoWFNEQmFzZUZpZWxkRWRpdFBhcnQgbGVmdEZpZWxkLCBYU0RCYXNlRmllbGRFZGl0UGFydCByaWdodEZpZWxkLCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgc3VwZXIuaGFuZGxlS2V5Ym9hcmREcmFnQW5kRHJvcChsZWZ0RmllbGQsIHJpZ2h0RmllbGQsIGRpcmVjdGlvbik7Ci0gICAgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCkKLSAgICB7Ci0gICAgICBpZiAodGFyZ2V0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRhcmdldCA9IHJpZ2h0RmllbGQ7Ci0gICAgICAgIHRoaXMubG9jYXRpb24gPSB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0VG9wKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICghKGxlZnRGaWVsZC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcikKLSAgICAgICAgICAgICAgICAgfHwgbGVmdEZpZWxkLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZEFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIHRhcmdldCA9IHJpZ2h0RmllbGQ7Ci0gICAgICAgIHRoaXMubG9jYXRpb24gPSB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0VG9wKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKSByZXR1cm47Ci0gICAgc2V0dXAoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNldHVwKCkKLSAgewotICAgIGNhbkV4ZWN1dGUgPSBmYWxzZTsKLQotICAgIC8vIERyb3AgdGFyZ2V0IGlzIG1vZGVsIGdyb3VwCi0gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE1vZGVsR3JvdXBFZGl0UGFydCkKLSAgICB7Ci0gICAgICBwYXJlbnRFZGl0UGFydCA9IChNb2RlbEdyb3VwRWRpdFBhcnQpIHRhcmdldDsKLSAgICAgIGlmICgoKEdlbmVyaWNHcm91cEZpZ3VyZSkgcGFyZW50RWRpdFBhcnQuZ2V0RmlndXJlKCkpLmdldEljb25GaWd1cmUoKS5nZXRCb3VuZHMoKS5jb250YWlucyhsb2NhdGlvbikpCi0gICAgICB7Ci0gICAgICAgIHhzZENvbXBvbmVudFRvRHJhZyA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgKChYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKSBpdGVtVG9EcmFnLmdldE1vZGVsKCkpLmdldFRhcmdldCgpOwotICAgICAgICBhY3Rpb24gPSBuZXcgTW92ZVhTREVsZW1lbnRBY3Rpb24oKChNb2RlbEdyb3VwRWRpdFBhcnQpIHRhcmdldCkuZ2V0WFNETW9kZWxHcm91cCgpLCB4c2RDb21wb25lbnRUb0RyYWcsIG51bGwsIG51bGwpOwotICAgICAgICBjYW5FeGVjdXRlID0gYWN0aW9uLmNhbk1vdmUoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgQmFzZUZpZWxkRWRpdFBhcnQpCi0gICAgewotICAgICAgdGFyZ2V0U3BhY2VzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbGlzdCBvZiBhbGwgc2libGluZyBmaWVsZCBlZGl0IHBhcnRzOwotICAgICAgTGlzdCB0YXJnZXRFZGl0UGFydFNpYmxpbmdzID0gY2FsY3VsYXRlRmllbGRFZGl0UGFydHMoKTsKLSAgICAgIGNhbGN1bGF0ZU1vZGVsR3JvdXBMaXN0KCk7Ci0KLSAgICAgIGRvRHJvcCh0YXJnZXRFZGl0UGFydFNpYmxpbmdzLCBpdGVtVG9EcmFnKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBkb0Ryb3AoTGlzdCBzaWJsaW5ncywgR3JhcGhpY2FsRWRpdFBhcnQgbW92aW5nRWRpdFBhcnQpCi0gIHsKLSAgICBjb21tb25TZXR1cChzaWJsaW5ncywgbW92aW5nRWRpdFBhcnQpOwotCi0gICAgLy8gQ2FuIGNvbW1vbiB0aGlzIGNvZGUgdXAgd2l0aCBYU0RBdHRyaWJ1dGVEcmFnQW5kRHJvcENvbW1hbmQuLi4gCi0gICAgaWYgKChwcmV2aW91c1JlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbiB8fCBwcmV2aW91c1JlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgICAgICAmJiAobmV4dFJlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbiB8fCBuZXh0UmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEV2lsZGNhcmQpKSAKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSAoWFNETW9kZWxHcm91cCkgcHJldmlvdXNSZWZDb21wb25lbnQuZ2V0Q29udGFpbmVyKCkuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBpZiAocGFyZW50RWRpdFBhcnQgIT0gbnVsbCkKLSAgICAgICAgbW9kZWxHcm91cCA9ICgoTW9kZWxHcm91cEVkaXRQYXJ0KSBwYXJlbnRFZGl0UGFydCkuZ2V0WFNETW9kZWxHcm91cCgpOwotICAgICAgYWN0aW9uID0gbmV3IE1vdmVYU0RFbGVtZW50QWN0aW9uKG1vZGVsR3JvdXAsIHhzZENvbXBvbmVudFRvRHJhZywgcHJldmlvdXNSZWZDb21wb25lbnQsIG5leHRSZWZDb21wb25lbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwcmV2aW91c1JlZkNvbXBvbmVudCA9PSBudWxsICYmIChuZXh0UmVmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uIHx8IG5leHRSZWZDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkpCi0gICAgewotICAgICAgaWYgKGNsb3NlclNpYmxpbmcgPT0gQUJPVkVfSVNfQ0xPU0VSKQotICAgICAgewotICAgICAgICBpZiAobGVmdFNpYmxpbmdFZGl0UGFydCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYWN0aW9uID0gbmV3IE1vdmVYU0RFbGVtZW50QWN0aW9uKHRvcE1vc3RHcm91cC5nZXRYU0RNb2RlbEdyb3VwKCksIHhzZENvbXBvbmVudFRvRHJhZywgbnVsbCwgbnVsbCwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcmVudEVkaXRQYXJ0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBhY3Rpb24gPSBuZXcgTW92ZVhTREVsZW1lbnRBY3Rpb24oKChNb2RlbEdyb3VwRWRpdFBhcnQpIHBhcmVudEVkaXRQYXJ0KS5nZXRYU0RNb2RlbEdyb3VwKCksIHhzZENvbXBvbmVudFRvRHJhZywgcHJldmlvdXNSZWZDb21wb25lbnQsIG5leHRSZWZDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IChYU0RNb2RlbEdyb3VwKSBuZXh0UmVmQ29tcG9uZW50LmdldENvbnRhaW5lcigpLmdldENvbnRhaW5lcigpOwotICAgICAgICBhY3Rpb24gPSBuZXcgTW92ZVhTREVsZW1lbnRBY3Rpb24obW9kZWxHcm91cCwgeHNkQ29tcG9uZW50VG9EcmFnLCBwcmV2aW91c1JlZkNvbXBvbmVudCwgbmV4dFJlZkNvbXBvbmVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKChwcmV2aW91c1JlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbiB8fCBwcmV2aW91c1JlZkNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKSAgCi0gICAgICAgICYmIG5leHRSZWZDb21wb25lbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSAoWFNETW9kZWxHcm91cClwcmV2aW91c1JlZkNvbXBvbmVudC5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKTsKLSAgICAgIGlmIChwYXJlbnRFZGl0UGFydCAhPSBudWxsKQotICAgICAgICBtb2RlbEdyb3VwID0gKChNb2RlbEdyb3VwRWRpdFBhcnQpIHBhcmVudEVkaXRQYXJ0KS5nZXRYU0RNb2RlbEdyb3VwKCk7Ci0gICAgICBpZiAoY2xvc2VyU2libGluZyA9PSBBQk9WRV9JU19DTE9TRVIpCi0gICAgICB7Ci0gICAgICAgIGFjdGlvbiA9IG5ldyBNb3ZlWFNERWxlbWVudEFjdGlvbihtb2RlbEdyb3VwLCB4c2RDb21wb25lbnRUb0RyYWcsIHByZXZpb3VzUmVmQ29tcG9uZW50LCBuZXh0UmVmQ29tcG9uZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKHJpZ2h0U2libGluZ0VkaXRQYXJ0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBhY3Rpb24gPSBuZXcgTW92ZVhTREVsZW1lbnRBY3Rpb24odG9wTW9zdEdyb3VwLmdldFhTRE1vZGVsR3JvdXAoKSwgeHNkQ29tcG9uZW50VG9EcmFnLCBudWxsLCBudWxsLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBhY3Rpb24gPSBuZXcgTW92ZVhTREVsZW1lbnRBY3Rpb24obW9kZWxHcm91cCwgeHNkQ29tcG9uZW50VG9EcmFnLCBwcmV2aW91c1JlZkNvbXBvbmVudCwgbmV4dFJlZkNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoYWN0aW9uICE9IG51bGwpCi0gICAgICBjYW5FeGVjdXRlID0gYWN0aW9uLmNhbk1vdmUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBvdmVycmlkZXMgYmFzZQotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRmlyc3RBbmRMYXN0RHJvcFRhcmdldHMoaW50IGluZGV4LCBMaXN0IHNpYmxpbmdzKQotICB7Ci0gICAgLy8gVGhpcyBib29sZWFuIGlzIHRvIGhhbmRsZSB0aGUgVG9wIGFuZCBCb3R0b20gZHJvcCB0YXJnZXRzIGZvciB3aGljaCB3ZSB3YW50IHRvIGRyb3AKLSAgICAvLyB0byB0aGUgdG9wIG1vc3QgbW9kZWwgZ3JvdXAKLSAgICAvLyBUT0RPOiBJIG5lZWQgdG8gcmVhcnJhbmdlIHRoaXMgY29kZSBiZXR0ZXIKLSAgICBib29sZWFuIGlzSGFuZGxlZCA9IGZhbHNlOwotICAgIGludCBwb2ludGVyWUxvY2F0aW9uID0gbG9jYXRpb24ueTsKLSAgICAvLyBXZSBuZWVkIHRvIGZpbmQgdGhlIHBhcmVudCBlZGl0cGFydCwgd2hpY2ggaXMgdGhlIG1vZGVsIGdyb3VwCi0gICAgLy8gSGFuZGxlIGNhc2Ugd2hlcmUgeW91IGRyb3AgdG8gZmlyc3QgcG9zaXRpb24KLSAgICBpZiAoaW5kZXggPT0gMCAmJiBzaWJsaW5ncy5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIGxlZnRTaWJsaW5nRWRpdFBhcnQgPSBudWxsOwotICAgICAgcmlnaHRTaWJsaW5nRWRpdFBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIHNpYmxpbmdzLmdldCgwKTsKLSAgICAgIGludCBzaWJsaW5nWUxvY2F0aW9uID0gZ2V0Wm9vbWVkQm91bmRzKHJpZ2h0U2libGluZ0VkaXRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpKS5nZXRDZW50ZXIoKS55OwotICAgICAgY2xvc2VyU2libGluZyA9IEJFTE9XX0lTX0NMT1NFUjsKLSAgICAgIGlmIChNYXRoLmFicyhwb2ludGVyWUxvY2F0aW9uIC0gc2libGluZ1lMb2NhdGlvbikgPiBnZXRab29tZWRCb3VuZHMocmlnaHRTaWJsaW5nRWRpdFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkpLmhlaWdodCAvIDQpCi0gICAgICB7Ci0gICAgICAgIGlzSGFuZGxlZCA9IHRydWU7Ci0gICAgICAgIHBhcmVudEVkaXRQYXJ0ID0gdG9wTW9zdEdyb3VwOwotICAgICAgICBpZiAodG9wTW9zdEdyb3VwICE9IG51bGwpCi0gICAgICAgICAgY2xvc2VyU2libGluZyA9IEFCT1ZFX0lTX0NMT1NFUjsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gSGFuZGxlIGNhc2Ugd2hlcmUgeW91IGRyb3AgdG8gbGFzdCBwb3NpdGlvbgotICAgIGlmIChpbmRleCA+IDAgJiYgaW5kZXggPT0gc2libGluZ3Muc2l6ZSgpKQotICAgIHsKLSAgICAgIGxlZnRTaWJsaW5nRWRpdFBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIHNpYmxpbmdzLmdldChpbmRleCAtIDEpOwotICAgICAgaW50IHNpYmxpbmdZTG9jYXRpb24gPSBnZXRab29tZWRCb3VuZHMobGVmdFNpYmxpbmdFZGl0UGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKSkuZ2V0Q2VudGVyKCkueTsKLSAgICAgIGlmIChNYXRoLmFicyhwb2ludGVyWUxvY2F0aW9uIC0gc2libGluZ1lMb2NhdGlvbikgPiBnZXRab29tZWRCb3VuZHMobGVmdFNpYmxpbmdFZGl0UGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKSkuaGVpZ2h0IC8gNCkKLSAgICAgIHsKLSAgICAgICAgaXNIYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgcGFyZW50RWRpdFBhcnQgPSB0b3BNb3N0R3JvdXA7Ci0gICAgICAgIGlmICh0b3BNb3N0R3JvdXAgIT0gbnVsbCkKLSAgICAgICAgICBjbG9zZXJTaWJsaW5nID0gQkVMT1dfSVNfQ0xPU0VSOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gaXNIYW5kbGVkOwotICB9Ci0KLSAgLy8gTWV0aG9kcyBzcGVjaWZpYyB0byBlbGVtZW50IGFzIGRyYWcgc291cmNlCi0gIAotICAvLyBNb2RlbCBHcm91cCByZWxhdGVkIGhlbHBlciBtZXRob2QKLSAgcHJvdGVjdGVkIHZvaWQgY2FsY3VsYXRlTW9kZWxHcm91cExpc3QoKQotICB7Ci0gICAgRWRpdFBhcnQgZWRpdFBhcnQgPSB0YXJnZXQ7Ci0gICAgd2hpbGUgKGVkaXRQYXJ0ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgTW9kZWxHcm91cEVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBnZXRNb2RlbEdyb3VwRWRpdFBhcnRzKChNb2RlbEdyb3VwRWRpdFBhcnQpIGVkaXRQYXJ0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ29tcGxleFR5cGVFZGl0UGFydCB8fCBlZGl0UGFydCBpbnN0YW5jZW9mIFN0cnVjdHVyZUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBib29sZWFuIGZvdW5kVG9wID0gZmFsc2U7Ci0gICAgICAgIExpc3QgbGlzdCA9IGVkaXRQYXJ0LmdldENoaWxkcmVuKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0IGNoaWxkID0gaS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQ29tcGFydG1lbnRFZGl0UGFydCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0IGNvbXBhcnRtZW50TGlzdCA9ICgoQ29tcGFydG1lbnRFZGl0UGFydCkgY2hpbGQpLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY29tcGFydG1lbnRMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RHcm91cHNGb3JBbm5vdGF0aW9uRWRpdFBhcnQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYU0RHcm91cHNGb3JBbm5vdGF0aW9uRWRpdFBhcnQgZ3JvdXBzID0gKFhTREdyb3Vwc0ZvckFubm90YXRpb25FZGl0UGFydCkgb2JqOwotICAgICAgICAgICAgICAgIExpc3QgZ3JvdXBMaXN0ID0gZ3JvdXBzLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZ3JvdXBMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBPYmplY3QgZ3JvdXBDaGlsZCA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwQ2hpbGQgaW5zdGFuY2VvZiBNb2RlbEdyb3VwRWRpdFBhcnQpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZm91bmRUb3ApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBmb3VuZFRvcCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgdG9wTW9zdEdyb3VwID0gKE1vZGVsR3JvdXBFZGl0UGFydCkgZ3JvdXBDaGlsZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBnZXRNb2RlbEdyb3VwRWRpdFBhcnRzKChNb2RlbEdyb3VwRWRpdFBhcnQpIGdyb3VwQ2hpbGQpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWRpdFBhcnQgPSBlZGl0UGFydC5nZXRQYXJlbnQoKTsKLSAgICB9Ci0gIH0KLQotICAvLyBNb2RlbCBHcm91cCByZWxhdGVkIGhlbHBlciBtZXRob2QKLSAgCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsR3JvdXBFZGl0UGFydHMoTW9kZWxHcm91cEVkaXRQYXJ0IG1vZGVsR3JvdXBFZGl0UGFydCkKLSAgewotICAgIExpc3QgbW9kZWxHcm91cExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgTGlzdCBsaXN0ID0gbW9kZWxHcm91cEVkaXRQYXJ0LmdldENoaWxkcmVuKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG9iamVjdCA9IGkubmV4dCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIHRhcmdldFNwYWNlc0xpc3QuYWRkKG9iamVjdCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZUVkaXRQYXJ0IGdyb3VwUmVmID0gKE1vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlRWRpdFBhcnQpIG9iamVjdDsKLSAgICAgICAgTGlzdCBncm91cFJlZkNoaWxkcmVuID0gZ3JvdXBSZWYuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGdyb3VwUmVmQ2hpbGRyZW4uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBvID0gaXQubmV4dCgpOwotICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgTW9kZWxHcm91cEVkaXRQYXJ0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdldE1vZGVsR3JvdXBFZGl0UGFydHMoKE1vZGVsR3JvdXBFZGl0UGFydCkgbyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNb2RlbEdyb3VwRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIGdldE1vZGVsR3JvdXBFZGl0UGFydHMoKE1vZGVsR3JvdXBFZGl0UGFydCkgb2JqZWN0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1vZGVsR3JvdXBMaXN0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL0F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL0F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYzRmZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9BdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5DZW50ZXJlZENvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLlRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLkdlbmVyaWNHcm91cEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0IGV4dGVuZHMgQ29ubmVjdGFibGVFZGl0UGFydAotewotICBwdWJsaWMgQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gZ2V0WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCkKLSAgewotICAgIGlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlcikKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlcikgZ2V0TW9kZWwoKTsKLSAgICAgIHJldHVybiAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBhZGFwdGVyLmdldFRhcmdldCgpOwotICAgIH0KLS8vICAgIGVsc2UgaWYgKGdldE1vZGVsKCkgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0vLyAgICB7Ci0vLyAgICAgIHJldHVybiAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBnZXRNb2RlbCgpOwotLy8gICAgfQotICAgIHJldHVybiBudWxsOwotCi0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgR2VuZXJpY0dyb3VwRmlndXJlIGZpZ3VyZSA9IG5ldyBHZW5lcmljR3JvdXBGaWd1cmUoKTsKLSAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlcikgZ2V0TW9kZWwoKTsKLSAgICBmaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLmltYWdlID0gYWRhcHRlci5nZXRJbWFnZSgpOwotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAKLSAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWRhcHRlcilnZXRNb2RlbCgpOwotICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cERlZmluaXRpb24gPSBhZGFwdGVyLmdldFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpOwotICAgIEl0ZXJhdG9yIGkgPSBhdHRyaWJ1dGVHcm91cERlZmluaXRpb24uZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0KLSAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IGF0dHJHcm91cENvbnRlbnQgPSAoWFNEQXR0cmlidXRlR3JvdXBDb250ZW50KSBpLm5leHQoKTsKLQotICAgICAgaWYgKGF0dHJHcm91cENvbnRlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoYXR0ckdyb3VwQ29udGVudCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXR0ckdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQobmV3IFRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcigoWFNEQmFzZUFkYXB0ZXIpWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCgoKFhTREF0dHJpYnV0ZVVzZSlhdHRyR3JvdXBDb250ZW50KS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKSkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBsaXN0LmFkZChuZXcgVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyKChYU0RCYXNlQWRhcHRlcilnZXRNb2RlbCgpKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmIChsaXN0LmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBsaXN0LmFkZChuZXcgVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyKChYU0RCYXNlQWRhcHRlcilnZXRNb2RlbCgpKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotCi0gIHB1YmxpYyBSZWZlcmVuY2VDb25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25GaWd1cmUoQmFzZUVkaXRQYXJ0IGNoaWxkKQotICB7Ci0gICAgUmVmZXJlbmNlQ29ubmVjdGlvbiBjb25uZWN0aW9uRmlndXJlID0gbmV3IFJlZmVyZW5jZUNvbm5lY3Rpb24oKTsKLQotICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0U291cmNlQW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoKChHZW5lcmljR3JvdXBGaWd1cmUpZ2V0RmlndXJlKCkpLmdldEljb25GaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLlJJR0hULCAwLCAwKSk7Ci0KLSAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBBdHRyaWJ1dGVHcm91cERlZmluaXRpb25FZGl0UGFydCkKLSAgICB7Ci0gICAgICBjb25uZWN0aW9uRmlndXJlLnNldFRhcmdldEFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKCgoQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uRWRpdFBhcnQpIGNoaWxkKS5nZXRUYXJnZXRGaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLkxFRlQsIDAsIDApKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KQotICAgIHsKLS8vICAgICAgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCBlbGVtID0gKFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpIGNoaWxkOwotICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRUYXJnZXRBbmNob3IobmV3IENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcigoKFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpIGNoaWxkKS5nZXRGaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLkxFRlQsIDAsIDApKTsKLSAgICB9Ci0KLSAgICBjb25uZWN0aW9uRmlndXJlLnNldEhpZ2hsaWdodChmYWxzZSk7Ci0gICAgcmV0dXJuIGNvbm5lY3Rpb25GaWd1cmU7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9DYXRlZ29yeUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL0NhdGVnb3J5RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhmMzEyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL0NhdGVnb3J5RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU2Nyb2xsUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVmlld3BvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlZpZXdwb3J0TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5DYXRlZ29yeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5FZGl0UGFydE5hdmlnYXRpb25IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzLkhlYWRpbmdGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5Sb3VuZGVkTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmxheW91dHMuQ29udGFpbmVyTGF5b3V0OwotCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcnlFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydAotewotICBwcm90ZWN0ZWQgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5OwotICBGaWd1cmUgb3V0ZXJQYW5lOwotICBIZWFkaW5nRmlndXJlIGhlYWRpbmdGaWd1cmU7Ci0gIHByb3RlY3RlZCBTY3JvbGxQYW5lIHNjcm9sbHBhbmU7Ci0gIHByb3RlY3RlZCBpbnQgbWluaW11bUhlaWdodCA9IDQwMDsKLQotICBwdWJsaWMgaW50IGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuICgoQ2F0ZWdvcnlBZGFwdGVyKSBnZXRNb2RlbCgpKS5nZXRHcm91cFR5cGUoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBvdXRlclBhbmUgPSBuZXcgRmlndXJlKCk7Ci0gICAgb3V0ZXJQYW5lLnNldEJvcmRlcihuZXcgUm91bmRlZExpbmVCb3JkZXIoMSwgNikpOwotCi0gICAgaGVhZGluZ0ZpZ3VyZSA9IG5ldyBIZWFkaW5nRmlndXJlKCk7Ci0gICAgb3V0ZXJQYW5lLmFkZChoZWFkaW5nRmlndXJlKTsKLSAgICBoZWFkaW5nRmlndXJlLmdldExhYmVsKCkuc2V0VGV4dCgoKENhdGVnb3J5QWRhcHRlcikgZ2V0TW9kZWwoKSkuZ2V0VGV4dCgpKTsKLSAgICBoZWFkaW5nRmlndXJlLmdldExhYmVsKCkuc2V0SWNvbigoKENhdGVnb3J5QWRhcHRlcikgZ2V0TW9kZWwoKSkuZ2V0SW1hZ2UoKSk7Ci0KLSAgICBpbnQgbWluSGVpZ2h0ID0gU1dULkRFRkFVTFQ7Ci0gICAgc3dpdGNoIChnZXRUeXBlKCkpCi0gICAgewotICAgIGNhc2UgQ2F0ZWdvcnlBZGFwdGVyLkRJUkVDVElWRVM6Ci0gICAgewotICAgICAgbWluSGVpZ2h0ID0gODA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBDYXRlZ29yeUFkYXB0ZXIuQVRUUklCVVRFUzoKLSAgICBjYXNlIENhdGVnb3J5QWRhcHRlci5HUk9VUFM6Ci0gICAgewotICAgICAgbWluSGVpZ2h0ID0gMTAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIH0KLQotICAgIGZpbmFsIGludCB0aGVNaW5IZWlnaHQgPSBtaW5IZWlnaHQ7Ci0gICAgIAotICAgIFRvb2xiYXJMYXlvdXQgb3V0ZXJMYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSkKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoSUZpZ3VyZSBwYXJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgICAgIHsKLSAgICAgICAgRGltZW5zaW9uIGQgPSBzdXBlci5jYWxjdWxhdGVQcmVmZXJyZWRTaXplKHBhcmVudCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGQudW5pb24obmV3IERpbWVuc2lvbigyNTAsIHRoZU1pbkhlaWdodCkpOwotICAgICAgICByZXR1cm4gZDsKLSAgICAgIH0KLSAgICB9OwotICAgIG91dGVyTGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXModHJ1ZSk7Ci0gICAgb3V0ZXJQYW5lLnNldExheW91dE1hbmFnZXIob3V0ZXJMYXlvdXQpOwotCi0gICAgUmVjdGFuZ2xlRmlndXJlIGxpbmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgRGltZW5zaW9uIGdldFByZWZlcnJlZFNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQpCi0gICAgICB7Ci0gICAgICAgIERpbWVuc2lvbiBkID0gc3VwZXIuZ2V0UHJlZmVycmVkU2l6ZSh3SGludCwgaEhpbnQpOwotICAgICAgICBkLndpZHRoICs9IDIwOwotICAgICAgICBkLmhlaWdodCA9IDE7Ci0gICAgICAgIHJldHVybiBkOwotICAgICAgfQotICAgIH07Ci0gICAgVG9vbGJhckxheW91dCBsaW5lTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoZmFsc2UpOwotICAgIGxpbmVMYXlvdXQuc2V0VmVydGljYWwodHJ1ZSk7Ci0gICAgbGluZUxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIGxpbmUuc2V0TGF5b3V0TWFuYWdlcihsaW5lTGF5b3V0KTsKLSAgICBvdXRlclBhbmUuYWRkKGxpbmUpOwotCi0gICAgc2Nyb2xscGFuZSA9IG5ldyBTY3JvbGxQYW5lKCk7Ci0gICAgc2Nyb2xscGFuZS5zZXRWZXJ0aWNhbFNjcm9sbEJhclZpc2liaWxpdHkoU2Nyb2xsUGFuZS5BVVRPTUFUSUMpOyAvLyBTY3JvbGxQYW5lLkFMV0FZUyk7Ci0gICAgb3V0ZXJQYW5lLmFkZChzY3JvbGxwYW5lKTsKLQotICAgIEZpZ3VyZSBwYW5lID0gbmV3IEZpZ3VyZSgpOwotICAgIHBhbmUuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoNSwgOCwgNSwgOCkpOwotICAgIENvbnRhaW5lckxheW91dCBsYXlvdXQgPSBuZXcgQ29udGFpbmVyTGF5b3V0KCk7Ci0gICAgbGF5b3V0LnNldEhvcml6b250YWwoZmFsc2UpOwotICAgIGxheW91dC5zZXRTcGFjaW5nKDApOwotICAgIHBhbmUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCi0gICAgVmlld3BvcnQgdmlld3BvcnQgPSBuZXcgVmlld3BvcnQoKTsKLSAgICB2aWV3cG9ydC5zZXRDb250ZW50c1RyYWNrc0hlaWdodCh0cnVlKTsKLSAgICBWaWV3cG9ydExheW91dCB2aWV3cG9ydExheW91dCA9IG5ldyBWaWV3cG9ydExheW91dCgpCi0gICAgewotICAgICAgcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVQcmVmZXJyZWRTaXplKElGaWd1cmUgcGFyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi0gICAgICB7Ci0gICAgICAgIERpbWVuc2lvbiBkID0gc3VwZXIuY2FsY3VsYXRlUHJlZmVycmVkU2l6ZShwYXJlbnQsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBpZiAodGhlTWluSGVpZ2h0ID4gMCkKLSAgICAgICAgICBkLmhlaWdodCA9IE1hdGgubWluKGQuaGVpZ2h0LCB0aGVNaW5IZWlnaHQpOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBkb3VibGUgZmFjdG9yID0gZ2V0Wm9vbU1hbmFnZXIoKS5nZXRab29tKCk7Ci0gICAgICAgICAgaW50IHNjYWxlZEhlaWdodCA9IChpbnQpTWF0aC5yb3VuZCgoZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpLmdldEJvdW5kcygpLmhlaWdodCAtIG1pbmltdW1IZWlnaHQpIC8gZmFjdG9yKTsgLy8gYWRqdXN0IGZvciBvdGhlciBjYXRlZ29yaWVzIGFuZCBzcGFjZXMKLSAgICAgICAgICBkLmhlaWdodCA9IE1hdGgubWF4KDI1MCwgc2NhbGVkSGVpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICBkLndpZHRoID0gTWF0aC5taW4oZC53aWR0aCwgMzAwKTsKLSAgICAgICAgcmV0dXJuIGQ7Ci0gICAgICB9Ci0gICAgfTsKLSAgICB2aWV3cG9ydC5zZXRMYXlvdXRNYW5hZ2VyKHZpZXdwb3J0TGF5b3V0KTsKLQotICAgIHNjcm9sbHBhbmUuc2V0Vmlld3BvcnQodmlld3BvcnQpOwotICAgIHNjcm9sbHBhbmUuc2V0Q29udGVudHMocGFuZSk7Ci0KLSAgICByZXR1cm4gb3V0ZXJQYW5lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQotICAgIFJvdW5kZWRMaW5lQm9yZGVyIGJvcmRlciA9IChSb3VuZGVkTGluZUJvcmRlcikgb3V0ZXJQYW5lLmdldEJvcmRlcigpOwotICAgIGJvcmRlci5zZXRXaWR0aChpc1NlbGVjdGVkID8gMiA6IDEpOwotICAgIGhlYWRpbmdGaWd1cmUuc2V0U2VsZWN0ZWQoaXNTZWxlY3RlZCk7Ci0gICAgb3V0ZXJQYW5lLnJlcGFpbnQoKTsKLQotICAgIGhlYWRpbmdGaWd1cmUuZ2V0TGFiZWwoKS5zZXRUZXh0KCgoQ2F0ZWdvcnlBZGFwdGVyKSBnZXRNb2RlbCgpKS5nZXRUZXh0KCkpOwotICB9Ci0KLSAgcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKQotICB7Ci0gICAgcmV0dXJuIHNjcm9sbHBhbmUuZ2V0Q29udGVudHMoKTsKLSAgfQotCi0gIHB1YmxpYyBMYWJlbCBnZXROYW1lTGFiZWwoKQotICB7Ci0gICAgcmV0dXJuIGhlYWRpbmdGaWd1cmUuZ2V0TGFiZWwoKTsKLSAgfQotCi0gIHB1YmxpYyBIZWFkaW5nRmlndXJlIGdldEhlYWRpbmdGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIGhlYWRpbmdGaWd1cmU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlQ2hpbGQoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBuZXcgVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydCgpOwotICAgIGVkaXRQYXJ0LnNldE1vZGVsKG1vZGVsKTsKLSAgICBlZGl0UGFydC5zZXRQYXJlbnQodGhpcyk7Ci0gICAgcmV0dXJuIGVkaXRQYXJ0OwotICB9Ci0gIAotICBwdWJsaWMgRWRpdFBhcnQgZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsgCi0gICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydCkKLSAgICB7Ci0gICAgICBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBFZGl0UGFydE5hdmlnYXRpb25IYW5kbGVyVXRpbC5nZXROZXh0U2libGluZyhlZGl0UGFydCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEVkaXRQYXJ0TmF2aWdhdGlvbkhhbmRsZXJVdGlsLmdldFByZXZTaWJsaW5nKGVkaXRQYXJ0KTsKLSAgICAgIH0gICAgICAKLSAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2Nyb2xsVG8oKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpZWRpdFBhcnQpOwotICAgICAgfSAgCi0gICAgfSAgICAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICgoQmFzZUVkaXRQYXJ0KWdldFBhcmVudCgpKS5kb0dldFJlbGF0aXZlRWRpdFBhcnQoZWRpdFBhcnQsIGRpcmVjdGlvbik7Ci0gICAgfSAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLSAgICAvLyBjcyA6IG9kZGx5IGFycm93aW5nIHVwIGFuZCBkb3duIHRydWUgaXRlbXMgaW4gdGhlIGxpc3QgaXMgbm90IGhhbmRsZWQgbmljZWx5Ci0gICAgLy8gYnkgdGhlIGNhbm5lZCBHRUYgR3JhcGhpY2FsVmlld2VyS2V5SGFuZGxlciBzbyB0aGlzIG5hdmlnYXRpb24gcG9saWN5IGlzIG5lZWQgdG8gZml4IHRoYXQgICAgCi0gICAgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kgPSBuZXcgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsKCk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kpOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpCi0gIHsKLSAgICBDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IChDYXRlZ29yeUFkYXB0ZXIpIGdldE1vZGVsKCk7Ci0gICAgTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChhZGFwdGVyLmdldEFsbENoaWxkcmVuKCkpKTsKLSAgICByZXR1cm4gY2hpbGRyZW47Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzY3JvbGxUbyhBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHRvcExldmVsKQotICB7Ci0gICAgUmVjdGFuZ2xlIHRvcExldmVsQm91bmRzID0gdG9wTGV2ZWwuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0gICAgUmVjdGFuZ2xlIGNhdGVnb3J5Qm91bmRzID0gZmlndXJlLmdldEJvdW5kcygpOwotICAgIGludCBzY3JvbGxWYWx1ZSA9IHNjcm9sbHBhbmUuZ2V0VmVydGljYWxTY3JvbGxCYXIoKS5nZXRWYWx1ZSgpOwotICAgIGludCBsb2NhdGlvbiA9IHRvcExldmVsQm91bmRzLnkgKyBzY3JvbGxWYWx1ZSAtIGNhdGVnb3J5Qm91bmRzLnk7Ci0gICAgc2Nyb2xscGFuZS5zY3JvbGxWZXJ0aWNhbFRvKGxvY2F0aW9uIC0gY2F0ZWdvcnlCb3VuZHMuaGVpZ2h0IC8gMik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1pbmltdW1IZWlnaHQoaW50IG1pbmltdW1IZWlnaHQpCi0gIHsKLSAgICB0aGlzLm1pbmltdW1IZWlnaHQgPSBtaW5pbXVtSGVpZ2h0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL0Nvbm5lY3RhYmxlRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvQ29ubmVjdGFibGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTMyOTM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvQ29ubmVjdGFibGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUZpZWxkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLkNlbnRlcmVkSWNvbkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLkdlbmVyaWNHcm91cEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLklFeHRlbmRlZEZpZ3VyZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29ubmVjdGFibGVFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydAotewotICBwcm90ZWN0ZWQgQXJyYXlMaXN0IGNvbm5lY3Rpb25GaWd1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotICAKLSAgcHVibGljIElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkgZ2V0RXh0ZW5kZWRGaWd1cmVGYWN0b3J5KCkKLSAgewotICAgIEVkaXRQYXJ0RmFjdG9yeSBmYWN0b3J5ID0gZ2V0Vmlld2VyKCkuZ2V0RWRpdFBhcnRGYWN0b3J5KCk7Ci0gICAgQXNzZXJ0LmlzVHJ1ZShmYWN0b3J5IGluc3RhbmNlb2YgSUV4dGVuZGVkRmlndXJlRmFjdG9yeSwgIkVkaXRQYXJ0RmFjdG9yeSBtdXN0IGJlIGFuIGluc3RhbmNlb2Ygb2YgSUV4dGVuZGVkRmlndXJlRmFjdG9yeSIpOyAgICAgLy8kTk9OLU5MUy0xJAotICAgIHJldHVybiAoSUV4dGVuZGVkRmlndXJlRmFjdG9yeSlmYWN0b3J5OyAKLSAgfQotICAKLSAgcHVibGljIENvbm5lY3RhYmxlRWRpdFBhcnQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIEdlbmVyaWNHcm91cEZpZ3VyZSBmaWd1cmUgPSBuZXcgR2VuZXJpY0dyb3VwRmlndXJlKCk7Ci0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfQotCi0gIHB1YmxpYyBYU0RDb25jcmV0ZUNvbXBvbmVudCBnZXRYU0RDb25jcmV0ZUNvbXBvbmVudCgpCi0gIHsKLSAgICByZXR1cm4gKFhTRENvbmNyZXRlQ29tcG9uZW50KSgoWFNEQmFzZUFkYXB0ZXIpZ2V0TW9kZWwoKSkuZ2V0VGFyZ2V0KCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldENvbm5lY3Rpb25GaWd1cmVzKCkKLSAgewotICAgIHJldHVybiBjb25uZWN0aW9uRmlndXJlczsKLSAgfQotICAKLSAgcHVibGljIGFic3RyYWN0IFJlZmVyZW5jZUNvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZShCYXNlRWRpdFBhcnQgY2hpbGQpOwotICAKLSAgcHVibGljIHZvaWQgYWN0aXZhdGUoKQotICB7Ci0gICAgc3VwZXIuYWN0aXZhdGUoKTsKLSAgICBhY3RpdmF0ZUNvbm5lY3Rpb24oKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFjdGl2YXRlQ29ubmVjdGlvbigpCi0gIHsKLSAgICBpZiAoY29ubmVjdGlvbkZpZ3VyZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb25uZWN0aW9uRmlndXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgQmFzZUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBCYXNlRWRpdFBhcnQgZyA9IChCYXNlRWRpdFBhcnQpIG87Ci0gICAgICAgIFJlZmVyZW5jZUNvbm5lY3Rpb24gZmlndXJlID0gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZShnKTsKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZXMuYWRkKGZpZ3VyZSk7Ci0gICAgICAgIGZpZ3VyZS5zZXRQb2ludHMoZmlndXJlLmdldFBvaW50cygpKTsKLQotICAgICAgICBnZXRMYXllcihMYXllckNvbnN0YW50cy5DT05ORUNUSU9OX0xBWUVSKS5hZGQoZmlndXJlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotICB7Ci0gICAgc3VwZXIuZGVhY3RpdmF0ZSgpOwotICAgIGRlYWN0aXZhdGVDb25uZWN0aW9uKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBkZWFjdGl2YXRlQ29ubmVjdGlvbigpCi0gIHsKLSAgICAvLyBpZiB3ZSBoYXZlIGEgY29ubmVjdGlvbiwgcmVtb3ZlIGl0Ci0gICAgUmVmZXJlbmNlQ29ubmVjdGlvbiBjb25uZWN0aW9uRmlndXJlOwotICAgIGlmIChjb25uZWN0aW9uRmlndXJlcyAhPSBudWxsICYmICFjb25uZWN0aW9uRmlndXJlcy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gY29ubmVjdGlvbkZpZ3VyZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBjb25uZWN0aW9uRmlndXJlID0gKFJlZmVyZW5jZUNvbm5lY3Rpb24pIGkubmV4dCgpOwotCi0gICAgICAgIGlmIChnZXRMYXllcihMYXllckNvbnN0YW50cy5DT05ORUNUSU9OX0xBWUVSKS5nZXRDaGlsZHJlbigpLmNvbnRhaW5zKGNvbm5lY3Rpb25GaWd1cmUpKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuQ09OTkVDVElPTl9MQVlFUikucmVtb3ZlKGNvbm5lY3Rpb25GaWd1cmUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjb25uZWN0aW9uRmlndXJlcyA9IG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0gICAgcmVmcmVzaENvbm5lY3Rpb24oKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hDb25uZWN0aW9uKCkKLSAgewotICAgIGlmICghaXNBY3RpdmUoKSkKLSAgICAgIHJldHVybjsKLQotICAgIGlmIChjb25uZWN0aW9uRmlndXJlcyA9PSBudWxsIHx8IGNvbm5lY3Rpb25GaWd1cmVzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBhY3RpdmF0ZUNvbm5lY3Rpb24oKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGRlYWN0aXZhdGVDb25uZWN0aW9uKCk7Ci0gICAgICBhY3RpdmF0ZUNvbm5lY3Rpb24oKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZEZlZWRiYWNrKCkKLSAgewotICAgIFJlZmVyZW5jZUNvbm5lY3Rpb24gY29ubmVjdGlvbkZpZ3VyZTsKLSAgICBpZiAoY29ubmVjdGlvbkZpZ3VyZXMgIT0gbnVsbCAmJiAhY29ubmVjdGlvbkZpZ3VyZXMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbm5lY3Rpb25GaWd1cmVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZSA9IChSZWZlcmVuY2VDb25uZWN0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRIaWdobGlnaHQodHJ1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIEdlbmVyaWNHcm91cEZpZ3VyZSBmaWd1cmUgPSAoR2VuZXJpY0dyb3VwRmlndXJlKWdldEZpZ3VyZSgpOwotICAgIGZpZ3VyZS5nZXRJY29uRmlndXJlKCkuc2V0TW9kZShDZW50ZXJlZEljb25GaWd1cmUuU0VMRUNURUQpOwotICAgIGZpZ3VyZS5nZXRJY29uRmlndXJlKCkucmVmcmVzaCgpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpCi0gIHsKLSAgICBSZWZlcmVuY2VDb25uZWN0aW9uIGNvbm5lY3Rpb25GaWd1cmU7Ci0gICAgaWYgKGNvbm5lY3Rpb25GaWd1cmVzICE9IG51bGwgJiYgIWNvbm5lY3Rpb25GaWd1cmVzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb25uZWN0aW9uRmlndXJlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUgPSAoUmVmZXJlbmNlQ29ubmVjdGlvbikgaS5uZXh0KCk7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0SGlnaGxpZ2h0KGZhbHNlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgR2VuZXJpY0dyb3VwRmlndXJlIGZpZ3VyZSA9IChHZW5lcmljR3JvdXBGaWd1cmUpZ2V0RmlndXJlKCk7Ci0gICAgZmlndXJlLmdldEljb25GaWd1cmUoKS5zZXRNb2RlKENlbnRlcmVkSWNvbkZpZ3VyZS5OT1JNQUwpOwotICAgIGZpZ3VyZS5nZXRJY29uRmlndXJlKCkucmVmcmVzaCgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoVmlzdWFscygpOwotICAgIEdlbmVyaWNHcm91cEZpZ3VyZSBmaWd1cmUgPSAoR2VuZXJpY0dyb3VwRmlndXJlKWdldEZpZ3VyZSgpOwotICAgIGZpZ3VyZS5nZXRJY29uRmlndXJlKCkucmVmcmVzaCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIG5ldyBBRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3koKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpCi0gIHsKLSAgICBJRmlndXJlIGNoaWxkID0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCk7Ci0gICAgZ2V0Q29udGVudFBhbmUoKS5hZGQoY2hpbGQsIGluZGV4KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpCi0gIHsKLSAgICBJRmlndXJlIGNoaWxkID0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCk7Ci0gICAgZ2V0Q29udGVudFBhbmUoKS5yZW1vdmUoY2hpbGQpOwotICB9Ci0gIAotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpCi0gIHsKLSAgICByZXR1cm4gKChHZW5lcmljR3JvdXBGaWd1cmUpZ2V0RmlndXJlKCkpLmdldENvbnRlbnRGaWd1cmUoKTsKLSAgfQotCi0gIHB1YmxpYyBGaWd1cmUgZ2V0VGFyZ2V0RmlndXJlKCkKLSAgewotICAgIHJldHVybiAoKEdlbmVyaWNHcm91cEZpZ3VyZSlnZXRGaWd1cmUoKSkuZ2V0VGFyZ2V0RmlndXJlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFZGl0UGFydCBkb0dldFJlbGF0aXZlRWRpdFBhcnQoRWRpdFBhcnQgZWRpdFBhcnQsIGludCBkaXJlY3Rpb24pCi0gIHsKLSAgICBFZGl0UGFydCByZXN1bHQgPSBudWxsOwotICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuV0VTVCkKLSAgICB7Ci0gICAgICBpZiAoZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBDb25uZWN0YWJsZUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXRQYXJlbnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gdGhpczsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLkVBU1QpCi0gICAgeyAgICAKLSAgICAgIHJlc3VsdCA9IChFZGl0UGFydCkgZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5nZXQoMCk7Ci0gICAgICBUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0IHRhcmdldCA9IG51bGw7Ci0gICAgICBib29sZWFuIGZvdW5kU2VsZWN0YWJsZUdyb3VwID0gZmFsc2U7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlZGl0UGFydC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIEVkaXRQYXJ0IGNoaWxkID0gKEVkaXRQYXJ0KWkubmV4dCgpOwotICAgICAgICBpZiAoIShjaGlsZCBpbnN0YW5jZW9mIFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpKQotICAgICAgICB7Ci0gICAgICAgICAgZm91bmRTZWxlY3RhYmxlR3JvdXAgPSB0cnVlOwotICAgICAgICAgIHJlc3VsdCA9IGNoaWxkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0ID0gKFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpIHJlc3VsdDsKLSAgICAgIH0KLSAgICAgIGlmICghZm91bmRTZWxlY3RhYmxlR3JvdXAgJiYgdGFyZ2V0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEVkaXRQYXJ0IHBhcmVudCA9IGVkaXRQYXJ0LmdldFBhcmVudCgpOwotICAgICAgICB3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBDb21wYXJ0bWVudEVkaXRQYXJ0KSkKLSAgICAgICAgewotICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHBhcmVudC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICBFZGl0UGFydCBjaGlsZCA9IChFZGl0UGFydCkgaS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQmFzZUZpZWxkRWRpdFBhcnQgJiYgIShjaGlsZCBpbnN0YW5jZW9mIFNwYWNlRmlsbGVyRm9yRmllbGRFZGl0UGFydCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgQmFzZUZpZWxkRWRpdFBhcnQgZmllbGQgPSAoQmFzZUZpZWxkRWRpdFBhcnQpIGNoaWxkOwotICAgICAgICAgICAgaWYgKGZpZWxkLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpLnkgPCB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuYm90dG9tKCkgJiYKLSAgICAgICAgICAgICAgICBmaWVsZC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKS55ID4gdGFyZ2V0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJldHVybiBjaGlsZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVkaXRQYXJ0OwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeS5JTl9UT19GSVJTVF9DSElMRCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0LmdldENoaWxkcmVuKCkuZ2V0KDApOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2VFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDhlNmU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2VFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkNlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLkdlbmVyaWNHcm91cEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZUVkaXRQYXJ0IGV4dGVuZHMgQ29ubmVjdGFibGVFZGl0UGFydAotewotICBHZW5lcmljR3JvdXBGaWd1cmUgZmlndXJlOwotICAKLSAgcHVibGljIE1vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlRWRpdFBhcnQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBmaWd1cmUgPSBuZXcgR2VuZXJpY0dyb3VwRmlndXJlKCk7Ci0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLSAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpZ2V0TW9kZWwoKTsKLSAgICBmaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLmltYWdlID0gYWRhcHRlci5nZXRJbWFnZSgpOwotCi0gICAgR2VuZXJpY0dyb3VwRmlndXJlIGdyb3VwRmlndXJlID0gKEdlbmVyaWNHcm91cEZpZ3VyZSlnZXRGaWd1cmUoKTsKLSAgICBTdHJpbmcgbm9kZU5hbWUgPSAiIjsKLSAgICAKLSAgICAvLyBUT0RPOiBjb21tbW9uIHRoaXMgdXAgd2l0aCBNb2RlbEdyb3VwRWRpdFBhcnQsIFhTRFBhcnRpY2xlQWRhcHRlcidzIGNvZGUKLSAgICAKLSAgICAvLyAtMiBtZWFucyB0aGUgdXNlciBkaWRuJ3Qgc3BlY2lmeSAoc28gdGhlIGRlZmF1bHQgaXMgMSkKLSAgICBpbnQgbWluT2NjdXJzID0gYWRhcHRlci5nZXRNaW5PY2N1cnMoKTsKLSAgICBpbnQgbWF4T2NjdXJzID0gYWRhcHRlci5nZXRNYXhPY2N1cnMoKTsKLSAgICBTdHJpbmcgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIGlmIChtaW5PY2N1cnMgPT0gLTMgJiYgbWF4T2NjdXJzID09IC0zKQotICAgIHsKLSAgICAgIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gbm9kZU5hbWU7Ci0gICAgICBncm91cEZpZ3VyZS5zZXRUZXh0KG51bGwpOwotICAgIH0KLSAgICBlbHNlIGlmIChtaW5PY2N1cnMgPT0gMCAmJiAobWF4T2NjdXJzID09IC0yIHx8IG1heE9jY3VycyA9PSAxKSkKLSAgICB7Ci0gICAgICBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9IG5vZGVOYW1lICsgIiBbMC4uMV0iOyAvLyROT04tTkxTLTEkCi0gICAgICBncm91cEZpZ3VyZS5zZXRUZXh0KCIwLi4xIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKChtaW5PY2N1cnMgPT0gMSAmJiBtYXhPY2N1cnMgPT0gMSkgfHwKLSAgICAgICAgICAgICAobWluT2NjdXJzID09IC0yICYmIG1heE9jY3VycyA9PSAxKSB8fAotICAgICAgICAgICAgIChtaW5PY2N1cnMgPT0gMSAmJiBtYXhPY2N1cnMgPT0gLTIpKQotICAgIHsKLSAgICAgIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gbm9kZU5hbWUgKyAiIFsxLi4xXSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGdyb3VwRmlndXJlLnNldFRleHQoIjEuLjEiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobWluT2NjdXJzID09IC0yICYmIG1heE9jY3VycyA9PSAtMikKLSAgICB7Ci0gICAgICBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9IG5vZGVOYW1lOwotICAgICAgZ3JvdXBGaWd1cmUuc2V0VGV4dChudWxsKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmIChtYXhPY2N1cnMgPT0gLTIpIG1heE9jY3VycyA9IDE7Ci0gICAgICBTdHJpbmcgbWF4U3ltYm9sID0gbWF4T2NjdXJzID09IC0xID8gIioiIDogIiIgKyBtYXhPY2N1cnM7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgCi0gICAgICBTdHJpbmcgbWluU3ltYm9sID0gbWluT2NjdXJzID09IC0yID8gIjEiIDogIiIgKyBtaW5PY2N1cnM7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSBub2RlTmFtZSArICIgWyIgKyBtaW5TeW1ib2wgKyAiLi4iICsgbWF4U3ltYm9sICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgZ3JvdXBGaWd1cmUuc2V0VGV4dChtaW5TeW1ib2wgKyAiLi4iICsgbWF4U3ltYm9sKTsKLSAgICB9Ci0KLSAgICBncm91cEZpZ3VyZS5nZXRJY29uRmlndXJlKCkuc2V0VG9vbFRpcFRleHQob2NjdXJlbmNlRGVzY3JpcHRpb24pOwotICAgIGdyb3VwRmlndXJlLmdldEljb25GaWd1cmUoKS5yZXBhaW50KCk7Ci0KLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyKWdldE1vZGVsKCk7Ci0gICAgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwID0gKChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgYWRhcHRlci5nZXRUYXJnZXQoKSkuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldE1vZGVsR3JvdXAoKTsKLSAgICBpZiAoeHNkTW9kZWxHcm91cCAhPSBudWxsKQotICAgICAgbGlzdC5hZGQoWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCh4c2RNb2RlbEdyb3VwKSk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgUmVmZXJlbmNlQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uRmlndXJlKEJhc2VFZGl0UGFydCBjaGlsZCkKLSAgewotICAgIFJlZmVyZW5jZUNvbm5lY3Rpb24gY29ubmVjdGlvbkZpZ3VyZSA9IG5ldyBSZWZlcmVuY2VDb25uZWN0aW9uKCk7Ci0KLSAgICBjb25uZWN0aW9uRmlndXJlLnNldFNvdXJjZUFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKCgoR2VuZXJpY0dyb3VwRmlndXJlKWdldEZpZ3VyZSgpKS5nZXRJY29uRmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5SSUdIVCwgMCwgMCkpOwotCi0gICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgTW9kZWxHcm91cEVkaXRQYXJ0KQotICAgIHsKLSAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0VGFyZ2V0QW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoKChNb2RlbEdyb3VwRWRpdFBhcnQpIGNoaWxkKS5nZXRUYXJnZXRGaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLkxFRlQsIDAsIDApKTsKLSAgICB9Ci0gICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRIaWdobGlnaHQoZmFsc2UpOwotICAgIHJldHVybiBjb25uZWN0aW9uRmlndXJlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL01vZGVsR3JvdXBFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9Nb2RlbEdyb3VwRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEwM2YzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL01vZGVsR3JvdXBFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRE1vZGVsR3JvdXBBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMubW9kZWwuVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuR2VuZXJpY0dyb3VwRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuTW9kZWxHcm91cEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9zaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBNb2RlbEdyb3VwRWRpdFBhcnQgZXh0ZW5kcyBDb25uZWN0YWJsZUVkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RXh0ZW5kZWRGaWd1cmVGYWN0b3J5KCkuY3JlYXRlTW9kZWxHcm91cEZpZ3VyZShnZXRNb2RlbCgpKTsKLSAgfQotICAKLSAgcHVibGljIFhTRFBhcnRpY2xlIGdldFhTRFBhcnRpY2xlKCkKLSAgewotICAgIE9iamVjdCBvID0gZ2V0WFNETW9kZWxHcm91cCgpLmdldENvbnRhaW5lcigpOwotICAgIHJldHVybiAobyBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKSA/IChYU0RQYXJ0aWNsZSkgbyA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgWFNETW9kZWxHcm91cCBnZXRYU0RNb2RlbEdyb3VwKCkKLSAgewotICAgIGlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cEFkYXB0ZXIpCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cEFkYXB0ZXIgYWRhcHRlciA9IChYU0RNb2RlbEdyb3VwQWRhcHRlcikgZ2V0TW9kZWwoKTsKLSAgICAgIHJldHVybiAoWFNETW9kZWxHcm91cCkgYWRhcHRlci5nZXRUYXJnZXQoKTsKLSAgICB9Ci0vLyAgICBlbHNlIGlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLS8vICAgIHsKLS8vICAgICAgcmV0dXJuIChYU0RNb2RlbEdyb3VwKSBnZXRNb2RlbCgpOwotLy8gICAgfQotICAgIHJldHVybiBudWxsOwotCi0gIH0KLQotICAKLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICAgIGJvb2xlYW4gaXNSZWFkT25seSA9IGZhbHNlOwotICAgIEdlbmVyaWNHcm91cEZpZ3VyZSBtb2RlbEdyb3VwRmlndXJlID0gKEdlbmVyaWNHcm91cEZpZ3VyZSlnZXRGaWd1cmUoKTsKLSAgICAKLSAgICBYU0RNb2RlbEdyb3VwQWRhcHRlciBhZGFwdGVyID0gKFhTRE1vZGVsR3JvdXBBZGFwdGVyKSBnZXRNb2RlbCgpOwotICAgIGlzUmVhZE9ubHkgPSBhZGFwdGVyLmlzUmVhZE9ubHkoKTsKLSAgICAKLSAgICBTdHJpbmcgbm9kZU5hbWUgPSAiIjsKLSAgICBJbWFnZSBpbWFnZTsKLSAgICBzd2l0Y2ggKGdldFhTRE1vZGVsR3JvdXAoKS5nZXRDb21wb3NpdG9yKCkuZ2V0VmFsdWUoKSkKLSAgICB7Ci0gICAgICBjYXNlIFhTRENvbXBvc2l0b3IuQUxMOgotICAgICAgewotICAgICAgICBpbWFnZSA9IGlzUmVhZE9ubHkgPyBNb2RlbEdyb3VwRmlndXJlLkFMTF9JQ09OX0RJU0FCTEVEX0lNQUdFIDpNb2RlbEdyb3VwRmlndXJlLkFMTF9JQ09OX0lNQUdFOwotICAgICAgICBtb2RlbEdyb3VwRmlndXJlLmdldEljb25GaWd1cmUoKS5pbWFnZSA9IFhTRENvbW1vblVJVXRpbHMuZ2V0VXBkYXRlZEltYWdlKChYU0RDb25jcmV0ZUNvbXBvbmVudClhZGFwdGVyLmdldFRhcmdldCgpLCBpbWFnZSwgaXNSZWFkT25seSk7Ci0gICAgICAgIG5vZGVOYW1lID0gWFNEQ29uc3RhbnRzLkFMTF9FTEVNRU5UX1RBRzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFhTRENvbXBvc2l0b3IuQ0hPSUNFOgotICAgICAgewotICAgICAgICBpbWFnZSA9IGlzUmVhZE9ubHkgPyBNb2RlbEdyb3VwRmlndXJlLkNIT0lDRV9JQ09OX0RJU0FCTEVEX0lNQUdFIDogTW9kZWxHcm91cEZpZ3VyZS5DSE9JQ0VfSUNPTl9JTUFHRTsKLSAgICAgICAgbW9kZWxHcm91cEZpZ3VyZS5nZXRJY29uRmlndXJlKCkuaW1hZ2UgPSBYU0RDb21tb25VSVV0aWxzLmdldFVwZGF0ZWRJbWFnZSgoWFNEQ29uY3JldGVDb21wb25lbnQpYWRhcHRlci5nZXRUYXJnZXQoKSwgaW1hZ2UsIGlzUmVhZE9ubHkpOyAKLSAgICAgICAgbm9kZU5hbWUgPSBYU0RDb25zdGFudHMuQ0hPSUNFX0VMRU1FTlRfVEFHOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgWFNEQ29tcG9zaXRvci5TRVFVRU5DRToKLSAgICAgIHsKLSAgICAgICAgaW1hZ2UgPSBpc1JlYWRPbmx5ID8gTW9kZWxHcm91cEZpZ3VyZS5TRVFVRU5DRV9JQ09OX0RJU0FCTEVEX0lNQUdFIDogTW9kZWxHcm91cEZpZ3VyZS5TRVFVRU5DRV9JQ09OX0lNQUdFOwotICAgICAgICBtb2RlbEdyb3VwRmlndXJlLmdldEljb25GaWd1cmUoKS5pbWFnZSA9IFhTRENvbW1vblVJVXRpbHMuZ2V0VXBkYXRlZEltYWdlKChYU0RDb25jcmV0ZUNvbXBvbmVudClhZGFwdGVyLmdldFRhcmdldCgpLCBpbWFnZSwgaXNSZWFkT25seSk7IAotICAgICAgICBub2RlTmFtZSA9IFhTRENvbnN0YW50cy5TRVFVRU5DRV9FTEVNRU5UX1RBRzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIAotLy8gICAgU3RyaW5nIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gYWRhcHRlci5nZXROYW1lQW5ub3RhdGlvblRvb2xUaXBTdHJpbmcoKTsKLS8vICAgIG1vZGVsR3JvdXBGaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLnNldFRvb2xUaXAob2NjdXJlbmNlRGVzY3JpcHRpb24pOwotCi0gICAgLy8gVE9ETzogY29tbW1vbiB0aGlzIHVwIHdpdGggWFNEUGFydGljbGVBZGFwdGVyJ3MgY29kZQotICAgIAotICAgIC8vIC0yIG1lYW5zIHRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IChzbyB0aGUgZGVmYXVsdCBpcyAxKQotICAgIGludCBtaW5PY2N1cnMgPSBhZGFwdGVyLmdldE1pbk9jY3VycygpOwotICAgIGludCBtYXhPY2N1cnMgPSBhZGFwdGVyLmdldE1heE9jY3VycygpOwotICAgIFN0cmluZyBvY2N1cmVuY2VEZXNjcmlwdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgaWYgKG1pbk9jY3VycyA9PSAtMyAmJiBtYXhPY2N1cnMgPT0gLTMpCi0gICAgewotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSBub2RlTmFtZTsKLSAgICAgIG1vZGVsR3JvdXBGaWd1cmUuc2V0VGV4dChudWxsKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobWluT2NjdXJzID09IDAgJiYgKG1heE9jY3VycyA9PSAtMiB8fCBtYXhPY2N1cnMgPT0gMSkpCi0gICAgewotICAgICAgb2NjdXJlbmNlRGVzY3JpcHRpb24gPSBub2RlTmFtZSArICIgWzAuLjFdIjsgLy8kTk9OLU5MUy0xJAotICAgICAgbW9kZWxHcm91cEZpZ3VyZS5zZXRUZXh0KCIwLi4xIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKChtaW5PY2N1cnMgPT0gMSAmJiBtYXhPY2N1cnMgPT0gMSkgfHwKLSAgICAgICAgICAgICAobWluT2NjdXJzID09IC0yICYmIG1heE9jY3VycyA9PSAxKSB8fAotICAgICAgICAgICAgIChtaW5PY2N1cnMgPT0gMSAmJiBtYXhPY2N1cnMgPT0gLTIpKQotICAgIHsKLSAgICAgIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gbm9kZU5hbWUgKyAiIFsxLi4xXSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIG1vZGVsR3JvdXBGaWd1cmUuc2V0VGV4dCgiMS4uMSIpOwotICAgIH0KLSAgICBlbHNlIGlmIChtaW5PY2N1cnMgPT0gLTIgJiYgbWF4T2NjdXJzID09IC0yKQotICAgIHsKLSAgICAgIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gbm9kZU5hbWU7Ci0gICAgICBtb2RlbEdyb3VwRmlndXJlLnNldFRleHQobnVsbCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobWF4T2NjdXJzID09IC0yKSBtYXhPY2N1cnMgPSAxOwotICAgICAgU3RyaW5nIG1heFN5bWJvbCA9IG1heE9jY3VycyA9PSAtMSA/ICIqIiA6ICIiICsgbWF4T2NjdXJzOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIAotICAgICAgU3RyaW5nIG1pblN5bWJvbCA9IG1pbk9jY3VycyA9PSAtMiA/ICIxIiA6ICIiICsgbWluT2NjdXJzOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIG9jY3VyZW5jZURlc2NyaXB0aW9uID0gbm9kZU5hbWUgKyAiIFsiICsgbWluU3ltYm9sICsgIi4uIiArIG1heFN5bWJvbCArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIG1vZGVsR3JvdXBGaWd1cmUuc2V0VGV4dChtaW5TeW1ib2wgKyAiLi4iICsgbWF4U3ltYm9sKTsKLSAgICB9Ci0KLSAgICBtb2RlbEdyb3VwRmlndXJlLmdldEljb25GaWd1cmUoKS5zZXRUb29sVGlwVGV4dChvY2N1cmVuY2VEZXNjcmlwdGlvbik7Ci0gICAgbW9kZWxHcm91cEZpZ3VyZS5nZXRJY29uRmlndXJlKCkucmVwYWludCgpOwotCi0gICAgcmVmcmVzaENvbm5lY3Rpb24oKTsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICB7Ci0vLyAgICBYU0RNb2RlbEdyb3VwQWRhcHRlciBtb2RlbEdyb3VwQWRhcHRlciA9IChYU0RNb2RlbEdyb3VwQWRhcHRlcilnZXRNb2RlbCgpOwotLy8gICAgQXJyYXlMaXN0IGNoID0gbmV3IEFycmF5TGlzdCgpOwotLy8gICAgSVRyZWVFbGVtZW50IFtdIHRyZWUgPSBtb2RlbEdyb3VwQWRhcHRlci5nZXRDaGlsZHJlbigpOwotLy8gICAgaW50IGxlbmd0aCA9IHRyZWUubGVuZ3RoOwotLy8gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLS8vICAgIHsKLS8vICAgICAgY2guYWRkKHRyZWVbaV0pOwotLy8gICAgfQotCi0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCA9IGdldFhTRE1vZGVsR3JvdXAoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2RNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFBhcnRpY2xlIG5leHQgPSAoWFNEUGFydGljbGUpIGkubmV4dCgpOwotICAgICAgaWYgKG5leHQuZ2V0Q29udGVudCgpIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2xhcmF0aW9uID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgbmV4dC5nZXRDb250ZW50KCk7Ci0gICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZWxlbWVudERlY2xhcmF0aW9uKTsKLSAgICAgICAgbGlzdC5hZGQobmV3IFRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcigoWFNEQmFzZUFkYXB0ZXIpYWRhcHRlcikpOwotICAgICAgfQotICAgICAgaWYgKG5leHQuZ2V0Q29udGVudCgpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGRlZiA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgbmV4dC5nZXRDb250ZW50KCk7Ci0gICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZGVmKTsKLSAgICAgICAgbGlzdC5hZGQoYWRhcHRlcik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChuZXh0LmdldFRlcm0oKSBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICB7Ci0gICAgICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IChYU0RNb2RlbEdyb3VwKSBuZXh0LmdldFRlcm0oKTsKLSAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChtb2RlbEdyb3VwKTsKLSAgICAgICAgbGlzdC5hZGQoYWRhcHRlcik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChuZXh0LmdldFRlcm0oKSBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgICAgewotICAgICAgICBYU0RXaWxkY2FyZCB3aWxkQ2FyZCA9IChYU0RXaWxkY2FyZCluZXh0LmdldFRlcm0oKTsKLSAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCh3aWxkQ2FyZCk7Ci0gICAgICAgIGxpc3QuYWRkKG5ldyBUYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXIoKFhTREJhc2VBZGFwdGVyKWFkYXB0ZXIpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobGlzdC5zaXplKCkgPT0gMCkKLSAgICAgIGxpc3QuYWRkKG5ldyBUYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXIobnVsbCkpOwotCi0gICAgcmV0dXJuIGxpc3Q7Ci0vLyAgICByZXR1cm4gY2g7Ci0gIH0KLQotICBwdWJsaWMgUmVmZXJlbmNlQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uRmlndXJlKEJhc2VFZGl0UGFydCBjaGlsZCkKLSAgewotICAgIFJlZmVyZW5jZUNvbm5lY3Rpb24gY29ubmVjdGlvbkZpZ3VyZSA9IG5ldyBSZWZlcmVuY2VDb25uZWN0aW9uKCk7Ci0gICAgR2VuZXJpY0dyb3VwRmlndXJlIG1vZGVsR3JvdXBGaWd1cmUgPSAoR2VuZXJpY0dyb3VwRmlndXJlKWdldEZpZ3VyZSgpOwotICAKLSAgICBjb25uZWN0aW9uRmlndXJlLnNldFNvdXJjZUFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKG1vZGVsR3JvdXBGaWd1cmUuZ2V0SWNvbkZpZ3VyZSgpLCBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuUklHSFQsIDAsIDApKTsKLQotICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIE1vZGVsR3JvdXBFZGl0UGFydCkKLSAgICB7Ci0gICAgICBjb25uZWN0aW9uRmlndXJlLnNldFRhcmdldEFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKCgoTW9kZWxHcm91cEVkaXRQYXJ0KSBjaGlsZCkuZ2V0VGFyZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5MRUZULCAwLCAwKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCkKLSAgICB7Ci0gICAgICBUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0IGVsZW0gPSAoVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCkgY2hpbGQ7Ci0gICAgICBjb25uZWN0aW9uRmlndXJlLnNldFRhcmdldEFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKGVsZW0uZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5MRUZULCAwLCAxKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2VFZGl0UGFydCkKLSAgICB7Ci0gICAgICBNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZUVkaXRQYXJ0IGVsZW0gPSAoTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2VFZGl0UGFydCkgY2hpbGQ7Ci0gICAgICBjb25uZWN0aW9uRmlndXJlLnNldFRhcmdldEFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKGVsZW0uZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5MRUZULCAwLCAxKSk7Ci0gICAgfQotICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0SGlnaGxpZ2h0KGZhbHNlKTsKLSAgICByZXR1cm4gY29ubmVjdGlvbkZpZ3VyZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9SZWZlcmVuY2VDb25uZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1JlZmVyZW5jZUNvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ2M2RiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1JlZmVyZW5jZUNvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25Sb3V0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlQ29ubmVjdGlvbiBleHRlbmRzIFBvbHlsaW5lQ29ubmVjdGlvbgotewotICBwcm90ZWN0ZWQgYm9vbGVhbiBoaWdobGlnaHQgPSBmYWxzZTsKLQotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbG9yIGFjdGl2ZUNvbm5lY3Rpb24gPSBDb2xvckNvbnN0YW50cy5ibGFjazsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBpbmFjdGl2ZUNvbm5lY3Rpb24gPSBuZXcgQ29sb3IobnVsbCwgMTk4LCAxOTUsIDE5OCk7Ci0KLSAgcHVibGljIFJlZmVyZW5jZUNvbm5lY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBzZXRDb25uZWN0aW9uUm91dGVyKG5ldyBYU0RNb2RlbEdyb3VwUm91dGVyKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvblJvdXRlcihDb25uZWN0aW9uUm91dGVyIGNyKQotICB7Ci0gICAgaWYgKGNyICE9IG51bGwgJiYgZ2V0Q29ubmVjdGlvblJvdXRlcigpICE9IG51bGwgJiYgIShnZXRDb25uZWN0aW9uUm91dGVyKCkgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwUm91dGVyKSkKLSAgICAgIHN1cGVyLnNldENvbm5lY3Rpb25Sb3V0ZXIoY3IpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNIaWdobGlnaHRlZCgpCi0gIHsKLSAgICByZXR1cm4gaGlnaGxpZ2h0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SGlnaGxpZ2h0KGJvb2xlYW4gaGlnaGxpZ2h0KQotICB7Ci0gICAgdGhpcy5oaWdobGlnaHQgPSBoaWdobGlnaHQ7Ci0gICAgCi0gICAgYm9vbGVhbiBoaWdoQ29udHJhc3QgPSBmYWxzZTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBoaWdoQ29udHJhc3QgPSBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRIaWdoQ29udHJhc3QoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgaWYgKGhpZ2hDb250cmFzdCkKLSAgICB7Ci0gICAgICBzZXRGb3JlZ3JvdW5kQ29sb3IoaGlnaGxpZ2h0ID8gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9GT1JFR1JPVU5EKSA6IENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRGb3JlZ3JvdW5kQ29sb3IoaGlnaGxpZ2h0ID8gYWN0aXZlQ29ubmVjdGlvbiA6IGluYWN0aXZlQ29ubmVjdGlvbik7Ci0gICAgfQotICAgIHNldE9wYXF1ZShoaWdobGlnaHQpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvU3BhY2VGaWxsZXJGb3JGaWVsZEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1NwYWNlRmlsbGVyRm9yRmllbGRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGY0NGVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvU3BhY2VGaWxsZXJGb3JGaWVsZEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRmllbGRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBTcGFjZUZpbGxlckZvckZpZWxkRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRmllbGRFZGl0UGFydAotewotICBMYWJlbCBzcGFjZTsKLSAgcHVibGljIFNwYWNlRmlsbGVyRm9yRmllbGRFZGl0UGFydCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIHNwYWNlID0gbmV3IExhYmVsKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIHNwYWNlLnNldEljb24oWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9Eb3QuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgc3BhY2Uuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMywgMCwgMywgMCkpOwotICAgIHJldHVybiBzcGFjZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgewotCi0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0YWJsZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9UYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZDFhOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9UYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5TcGFjaW5nRmlndXJlOwotCi1wdWJsaWMgY2xhc3MgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydAotewotICBwdWJsaWMgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgU3BhY2luZ0ZpZ3VyZSBmaWd1cmU7Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIGZpZ3VyZSA9IG5ldyBTcGFjaW5nRmlndXJlKCk7Ci0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfQotCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbm5lY3Rpb25GaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLQotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGFibGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1RvcExldmVsQ29tcG9uZW50RWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTRmOTA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Mb2NhdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkFic3RyYWN0RWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEU2NoZW1hRGlyZWN0aXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLklOYW1lZEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuUm9vdENvbnRlbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklGZWVkYmFja0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuQURURGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLklBRFRVcGRhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuU2ltcGxlRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzLkZpZWxkRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuT3BlbkluTmV3RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwb2xpY2llcy5Ub3BMZXZlbENvbXBvbmVudExhYmVsQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBvbGljaWVzLlRvcExldmVsTmFtZURpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuSHlwZXJMaW5rTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24ubGF5b3V0cy5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbHMuT3Blbk9uU2VsZWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYURpcmVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RJbXBvcnRJbXBsOwotCi1wdWJsaWMgY2xhc3MgVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydCBpbXBsZW1lbnRzIElGZWVkYmFja0hhbmRsZXIsIElOYW1lZEVkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBMYWJlbCBsYWJlbDsKLSAgLy8gcHJvdGVjdGVkIExhYmVsIGFycm93TGFiZWw7Ci0gIHByb3RlY3RlZCBGaWd1cmUgbGFiZWxIb2xkZXIgPSBuZXcgRmlndXJlKCk7Ci0gIHByb3RlY3RlZCBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3k7Ci0gIHByb3RlY3RlZCBBRFREaXJlY3RFZGl0UG9saWN5IGFkdERpcmVjdEVkaXRQb2xpY3kgPSBuZXcgQURURGlyZWN0RWRpdFBvbGljeSgpOwotICBwcm90ZWN0ZWQgU2ltcGxlRGlyZWN0RWRpdFBvbGljeSBzaW1wbGVEaXJlY3RFZGl0UG9saWN5ID0gbmV3IFNpbXBsZURpcmVjdEVkaXRQb2xpY3koKTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWFkT25seTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTZWxlY3RlZDsKLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgRmlndXJlIHR5cGVHcm91cCA9IG5ldyBGaWd1cmUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGdyYXBoaWNzKQotICAgICAgewotICAgICAgICBzdXBlci5wYWludChncmFwaGljcyk7Ci0gICAgICAgIGlmIChoYXNGb2N1cykKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdyYXBoaWNzLnB1c2hTdGF0ZSgpOwotICAgICAgICAgICAgUmVjdGFuZ2xlIHIgPSBnZXRCb3VuZHMoKTsKLSAgICAgICAgICAgIGdyYXBoaWNzLnNldFhPUk1vZGUodHJ1ZSk7Ci0gICAgICAgICAgICBncmFwaGljcy5kcmF3Rm9jdXMoci54LCByLnkgKyAxLCByLndpZHRoIC0gMSwgci5oZWlnaHQgLSAyKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZmluYWxseQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdyYXBoaWNzLnBvcFN0YXRlKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotICAgIH07Ci0gICAgdHlwZUdyb3VwLnNldExheW91dE1hbmFnZXIobmV3IFRvb2xiYXJMYXlvdXQoKSk7Ci0KLSAgICBsYWJlbEhvbGRlciA9IG5ldyBGaWd1cmUoKTsKLSAgICBGaWxsTGF5b3V0IGZpbGxMYXlvdXQgPSBuZXcgRmlsbExheW91dCgpOwotICAgIGxhYmVsSG9sZGVyLnNldExheW91dE1hbmFnZXIoZmlsbExheW91dCk7Ci0gICAgdHlwZUdyb3VwLmFkZChsYWJlbEhvbGRlcik7Ci0KLSAgICBsYWJlbCA9IG5ldyBIeXBlckxpbmtMYWJlbCgpOwotICAgIGxhYmVsLnNldE9wYXF1ZSh0cnVlKTsKLSAgICBsYWJlbC5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigxLCAyLCAyLCA1KSk7Ci0gICAgaWYgKCFpc0hpZ2hDb250cmFzdCkKLSAgICAgIGxhYmVsLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgbGFiZWxIb2xkZXIuYWRkKGxhYmVsKTsKLQotICAgIHJldHVybiB0eXBlR3JvdXA7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkKLSAgewotICAgIHN1cGVyLmRlYWN0aXZhdGUoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICAgIFhTREJhc2VBZGFwdGVyIGFkYXB0ZXIgPSAoWFNEQmFzZUFkYXB0ZXIpIGdldE1vZGVsKCk7Ci0gICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpc1JlYWRPbmx5ID0gYWRhcHRlci5pc1JlYWRPbmx5KCk7Ci0gICAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IoY29tcHV0ZUxhYmVsQ29sb3IoKSk7Ci0gICAgICBsYWJlbC5zZXRUZXh0KGFkYXB0ZXIuZ2V0VGV4dCgpKTsKLSAgICAgIEltYWdlIGltYWdlID0gYWRhcHRlci5nZXRJbWFnZSgpOwotICAgICAgaWYgKGltYWdlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGxhYmVsLnNldEljb24oWFNEQ29tbW9uVUlVdGlscy5nZXRVcGRhdGVkSW1hZ2UoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBhZGFwdGVyLmdldFRhcmdldCgpLCBpbWFnZSwgaXNSZWFkT25seSkpOwotICAgICAgfQotICAgICAgLy8gYXJyb3dMYWJlbC5zZXRWaXNpYmxlKEJvb2xlYW4uVFJVRS5lcXVhbHMoYWRhcHRlci5nZXRQcm9wZXJ0eShnZXRNb2RlbCgpLAotICAgICAgLy8gImRyaWxsRG93biIpKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9HUkFQSF9VTktOT1dOX09CSkVDVCArIGdldE1vZGVsKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgLy8gYXJyb3dMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBpZiAocmVzZWxlY3QpCi0gICAgewotICAgICAgZ2V0Vmlld2VyKCkuc2VsZWN0KHRoaXMpOwotICAgICAgc2V0UmVzZWxlY3QoZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICB7Ci0gICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFZGl0UGFydCBkb0dldFJlbGF0aXZlRWRpdFBhcnQoRWRpdFBhcnQgZWRpdFBhcnQsIGludCBkaXJlY3Rpb24pCi0gIHsKLSAgICByZXR1cm4gKChCYXNlRWRpdFBhcnQpdGhpcy5nZXRQYXJlbnQoKSkuZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KGVkaXRQYXJ0LCBkaXJlY3Rpb24pOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotICAgIC8vIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIG5ldwotICAgIC8vIE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSk7Ci0gICAgLy8gc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kgPSBuZXcgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsKCk7Ci0gICAgLy8gaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwKLSAgICAvLyBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSk7Ci0KLSAgICBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwgcG9saWN5ID0gbmV3IFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCgpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIHBvbGljeSk7Ci0KLSAgICBTZWxlY3Rpb25FZGl0UG9saWN5IGZlZWRCYWNrU2VsZWN0aW9uRWRpdFBvbGljeSA9IG5ldyBTZWxlY3Rpb25FZGl0UG9saWN5KCkKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgdm9pZCBoaWRlU2VsZWN0aW9uKCkKLSAgICAgIHsKLSAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBnZXRIb3N0KCk7Ci0gICAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElGZWVkYmFja0hhbmRsZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAoKElGZWVkYmFja0hhbmRsZXIpIGVkaXRQYXJ0KS5yZW1vdmVGZWVkYmFjaygpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHByb3RlY3RlZCB2b2lkIHNob3dTZWxlY3Rpb24oKQotICAgICAgewotICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9IGdldEhvc3QoKTsKLSAgICAgICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUZlZWRiYWNrSGFuZGxlcikKLSAgICAgICAgewotICAgICAgICAgICgoSUZlZWRiYWNrSGFuZGxlcikgZWRpdFBhcnQpLmFkZEZlZWRiYWNrKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIGZlZWRCYWNrU2VsZWN0aW9uRWRpdFBvbGljeSk7Ci0KLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsIGFkdERpcmVjdEVkaXRQb2xpY3kpOwotICB9Ci0KLSAgcHVibGljIENvbG9yIGNvbXB1dGVMYWJlbENvbG9yKCkKLSAgewotICAgIENvbG9yIGNvbG9yID0gQ29sb3JDb25zdGFudHMuYmxhY2s7Ci0gICAgaWYgKGlzSGlnaENvbnRyYXN0KQotICAgIHsgCi0gICAgICBjb2xvciA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfRk9SRUdST1VORCk7Ci0gICAgfQotCi0gICAgaWYgKGlzU2VsZWN0ZWQpCi0gICAgewotICAgICAgaWYgKGlzSGlnaENvbnRyYXN0KQotICAgICAgewotICAgICAgICBjb2xvciA9IENvbG9yQ29uc3RhbnRzLmxpc3RCYWNrZ3JvdW5kOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjb2xvciA9IENvbG9yQ29uc3RhbnRzLmJsYWNrOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpc1JlYWRPbmx5KQotICAgIHsKLSAgICAgIGNvbG9yID0gQ29sb3JDb25zdGFudHMuZ3JheTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbG9yOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKQotICB7Ci0gICAgaXNTZWxlY3RlZCA9IHRydWU7Ci0KLSAgICBpZiAoaXNIaWdoQ29udHJhc3QpCi0gICAgewotICAgICAgbGFiZWxIb2xkZXIuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmxpc3RGb3JlZ3JvdW5kKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGxhYmVsSG9sZGVyLnNldEJhY2tncm91bmRDb2xvcihGaWVsZEZpZ3VyZS5jZWxsQ29sb3IpOwotICAgIH0KLSAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IoY29tcHV0ZUxhYmVsQ29sb3IoKSk7Ci0gICAgLy8gbGFiZWxIb2xkZXIuc2V0RmlsbCh0cnVlKTsKLQotICAgIGlmIChkb1Njcm9sbCkKLSAgICB7Ci0gICAgICBDYXRlZ29yeUVkaXRQYXJ0IGNhdGVnb3J5RVAgPSAoQ2F0ZWdvcnlFZGl0UGFydCkgZ2V0UGFyZW50KCk7Ci0gICAgICBjYXRlZ29yeUVQLnNjcm9sbFRvKHRoaXMpOwotICAgICAgc2V0U2Nyb2xsKGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gZG9TY3JvbGwgPSBmYWxzZTsKLQotICBwdWJsaWMgdm9pZCBzZXRTY3JvbGwoYm9vbGVhbiBkb1Njcm9sbCkKLSAgewotICAgIHRoaXMuZG9TY3JvbGwgPSBkb1Njcm9sbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCkKLSAgewotICAgIGlzU2VsZWN0ZWQgPSBmYWxzZTsKLSAgICBsYWJlbEhvbGRlci5zZXRCYWNrZ3JvdW5kQ29sb3IobnVsbCk7Ci0gICAgbGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbXB1dGVMYWJlbENvbG9yKCkpOwotICAgIC8vIGxhYmVsSG9sZGVyLnNldEZpbGwoZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgLy8gRG8gbm90IG9wZW4gb24gb3Igc2V0IGZvY3VzIG9uIGRpcmVjdCBlZGl0IHR5cGUgCi0gICAgaWYgKHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX09QRU4pCi0gICAgewotCi0gICAgICBPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSUdyYXBoRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgaWYgKCgoSUdyYXBoRWxlbWVudCltb2RlbCkuaXNGb2N1c0FsbG93ZWQoKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgTG9jYXRpb25SZXF1ZXN0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIExvY2F0aW9uUmVxdWVzdCBsb2NhdGlvblJlcXVlc3QgPSAoTG9jYXRpb25SZXF1ZXN0KSByZXF1ZXN0OwotICAgICAgICAgICAgUG9pbnQgcCA9IGxvY2F0aW9uUmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCi0gICAgICAgICAgICBpZiAoaGl0VGVzdChsYWJlbEhvbGRlciwgcCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBlcmZvcm1EcmlsbERvd25BY3Rpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgWFNEU2NoZW1hRGlyZWN0aXZlQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBMb2NhdGlvblJlcXVlc3QpCi0gICAgICAgIHsKLSAgICAgICAgICBMb2NhdGlvblJlcXVlc3QgbG9jYXRpb25SZXF1ZXN0ID0gKExvY2F0aW9uUmVxdWVzdCkgcmVxdWVzdDsKLSAgICAgICAgICBQb2ludCBwID0gbG9jYXRpb25SZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0KLSAgICAgICAgICBpZiAoaGl0VGVzdChsYWJlbEhvbGRlciwgcCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEU2NoZW1hRGlyZWN0aXZlIGRpciA9IChYU0RTY2hlbWFEaXJlY3RpdmUpKChYU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyKW1vZGVsKS5nZXRUYXJnZXQoKTsKLSAgICAgICAgICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiA9ICIiOwotICAgICAgICAgICAgLy8gZm9yY2UgbG9hZCBvZiBpbXBvcnRlZCBzY2hlbWEKLSAgICAgICAgICAgIGlmIChkaXIgaW5zdGFuY2VvZiBYU0RJbXBvcnRJbXBsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAoKFhTREltcG9ydEltcGwpZGlyKS5pbXBvcnRTY2hlbWEoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkaXIuZ2V0UmVzb2x2ZWRTY2hlbWEoKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbiA9IFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2woZGlyLmdldFJlc29sdmVkU2NoZW1hKCkuZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgIGlmIChzY2hlbWFMb2NhdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT3Blbk9uU2VsZWN0aW9uSGVscGVyLm9wZW5YU0RFZGl0b3IoZGlyLmdldFJlc29sdmVkU2NoZW1hKCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBoaXRUZXN0KElGaWd1cmUgdGFyZ2V0LCBQb2ludCBsb2NhdGlvbikKLSAgewotICAgIFJlY3RhbmdsZSBiID0gdGFyZ2V0LmdldEJvdW5kcygpLmdldENvcHkoKTsKLSAgICB0YXJnZXQudHJhbnNsYXRlVG9BYnNvbHV0ZShiKTsKLSAgICByZXR1cm4gYi5jb250YWlucyhsb2NhdGlvbik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRHJpbGxEb3duQWN0aW9uKCkKLSAgewotICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgewotICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9ICgoQWJzdHJhY3RFZGl0UGFydFZpZXdlcikgZ2V0Vmlld2VyKCkpLmdldFJvb3RFZGl0UGFydCgpLmdldENvbnRlbnRzKCk7Ci0gICAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFJvb3RDb250ZW50RWRpdFBhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gZ2V0RWRpdG9yUGFydCgpOwotLy8gICAgICAgICAgQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSAoQWN0aW9uUmVnaXN0cnkpIGVkaXRvclBhcnQuZ2V0QWRhcHRlcihBY3Rpb25SZWdpc3RyeS5jbGFzcyk7Ci0vLyAgICAgICAgICBJQWN0aW9uIGFjdGlvbiA9IHJlZ2lzdHJ5LmdldEFjdGlvbihTZXRJbnB1dFRvR3JhcGhWaWV3LklEKTsKLS8vICAgICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgICBBY3Rpb25SZWdpc3RyeSByZWdpc3RyeSA9IChBY3Rpb25SZWdpc3RyeSkgZWRpdG9yUGFydC5nZXRBZGFwdGVyKEFjdGlvblJlZ2lzdHJ5LmNsYXNzKTsKLSAgICAgICAgICBpZiAocmVnaXN0cnkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJQWN0aW9uIGFjdGlvbiA9IHJlZ2lzdHJ5LmdldEFjdGlvbihPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgICAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgYWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH07Ci0gICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZG9FZGl0TmFtZShib29sZWFuIGFkZEZyb21EZXNpZ24pCi0gIHsKLSAgICBpZiAoIWFkZEZyb21EZXNpZ24pIHJldHVybjsKLSAgICAKLS8vICAgIHJlbW92ZUZlZWRiYWNrKCk7Ci0KLSAgICBPYmplY3Qgb2JqZWN0ID0gKChYU0RCYXNlQWRhcHRlcikgZ2V0TW9kZWwoKSkuZ2V0VGFyZ2V0KCk7Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgIHsKLSAgICAgIFBvaW50IHAgPSBsYWJlbC5nZXRMb2NhdGlvbigpOwotICAgICAgVG9wTGV2ZWxOYW1lRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlciA9IG5ldyBUb3BMZXZlbE5hbWVEaXJlY3RFZGl0TWFuYWdlcihUb3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0LnRoaXMsIG5ldyBUb3BMZXZlbENvbXBvbmVudExhYmVsQ2VsbEVkaXRvckxvY2F0b3IoVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydC50aGlzLCBwKSwgKFhTRE5hbWVkQ29tcG9uZW50KSBvYmplY3QpOwotICAgICAgTmFtZVVwZGF0ZUNvbW1hbmRXcmFwcGVyIHdyYXBwZXIgPSBuZXcgTmFtZVVwZGF0ZUNvbW1hbmRXcmFwcGVyKCk7Ci0gICAgICBhZHREaXJlY3RFZGl0UG9saWN5LnNldFVwZGF0ZUNvbW1hbmQod3JhcHBlcik7Ci0gICAgICBtYW5hZ2VyLnNob3coKTsKLSAgICB9Ci0gIH0KLSAgCi0gIGNsYXNzIE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlciBleHRlbmRzIENvbW1hbmQgaW1wbGVtZW50cyBJQURUVXBkYXRlQ29tbWFuZAotICB7Ci0gICAgQ29tbWFuZCBjb21tYW5kOwotICAgIHByb3RlY3RlZCBEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0OwotICAgIAotICAgIHB1YmxpYyBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIoKQotICAgIHsKLSAgICAgIHN1cGVyKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX05BTUUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3QoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkKLSAgICB7Ci0gICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgICB7Ci0gICAgICBYU0RCYXNlQWRhcHRlciBhZGFwdGVyID0gKFhTREJhc2VBZGFwdGVyKWdldE1vZGVsKCk7Ci0gICAgICBPYmplY3QgbmV3VmFsdWUgPSByZXF1ZXN0LmdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpOwotICAgICAgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgU3RyaW5nICYmICgoU3RyaW5nKW5ld1ZhbHVlKS5sZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIFVwZGF0ZU5hbWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlTmFtZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfTkFNRSwgKFhTRE5hbWVkQ29tcG9uZW50KWFkYXB0ZXIuZ2V0VGFyZ2V0KCksIChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsKQotICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgfQotICAgICB9Ci0gIH0KLQotICBzdGF0aWMgYm9vbGVhbiByZXNlbGVjdCA9IGZhbHNlOwotCi0gIHB1YmxpYyB2b2lkIHNldFJlc2VsZWN0KGJvb2xlYW4gc3RhdGUpCi0gIHsKLSAgICByZXNlbGVjdCA9IHN0YXRlOwotICB9Ci0KLSAgcHVibGljIExhYmVsIGdldE5hbWVMYWJlbEZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gbGFiZWw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBjdXJzb3JMb2NhdGlvbikKLSAgewotICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKGludCB2YWx1ZSkKLSAgewotICAgIC8vIGlmIGl0IGlzIHNlbGVjdGVkLCB3ZSB3YW50IHRvIHNjcm9sbCB0byBpdAotICAgIGlmIChkb1Njcm9sbCkKLSAgICAgIHNldFNjcm9sbCh0cnVlKTsKLSAgICBzdXBlci5zZXRTZWxlY3RlZCh2YWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGb2N1cyhib29sZWFuIGIpCi0gIHsKLSAgICBzdXBlci5zZXRGb2N1cyhiKTsKLSAgICBoYXNGb2N1cyA9IGI7Ci0gICAgZ2V0RmlndXJlKCkucmVwYWludCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTREF0dHJpYnV0ZXNGb3JBbm5vdGF0aW9uRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNEQXR0cmlidXRlc0ZvckFubm90YXRpb25FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2I0ZGQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNEQXR0cmlidXRlc0ZvckFubm90YXRpb25FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLlNlY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklDb21wbGV4VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVN0cnVjdHVyZTsKLQotcHVibGljIGNsYXNzIFhTREF0dHJpYnV0ZXNGb3JBbm5vdGF0aW9uRWRpdFBhcnQgZXh0ZW5kcyBTZWN0aW9uRWRpdFBhcnQKLXsKLSAgcHVibGljIFhTREF0dHJpYnV0ZXNGb3JBbm5vdGF0aW9uRWRpdFBhcnQoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICB7Ci0gICAgSVN0cnVjdHVyZSBzdHJ1Y3R1cmUgPSAgKChBbm5vdGF0aW9uKWdldE1vZGVsKCkpLmdldE93bmVyKCk7Ci0gICAgaWYgKHN0cnVjdHVyZSBpbnN0YW5jZW9mIElDb21wbGV4VHlwZSkKLSAgICB7ICAKLSAgICAgIGNvbXBsZXhUeXBlID0gKElDb21wbGV4VHlwZSlzdHJ1Y3R1cmU7Ci0gICAgICBpZiAoY29tcGxleFR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyKQotICAgICAgewotICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcikgY29tcGxleFR5cGU7Ci0gICAgICAgIHJldHVybiBhZGFwdGVyLmdldEF0dHJpYnV0ZUdyb3VwQ29udGVudCgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9YU0RCYXNlRmllbGRFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9YU0RCYXNlRmllbGRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWRhYzljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNEQmFzZUZpZWxkRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5JQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5kaXJlY3RlZGl0LkF0dHJpYnV0ZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5kaXJlY3RlZGl0LkVsZW1lbnRSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdC5MYWJlbENlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5kaXJlY3RlZGl0LkxhYmVsRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQuUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRmllbGRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JRmllbGRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzLkZpZWxkRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cG9saWNpZXMuRHJhZ0FuZERyb3BFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgWFNEQmFzZUZpZWxkRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRmllbGRFZGl0UGFydAotewotCi0gIHB1YmxpYyBYU0RCYXNlRmllbGRFZGl0UGFydCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0RWRpdFBhcnQjcmVmcmVzaFZpc3VhbHMoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgSUZpZWxkRmlndXJlIGZpZ3VyZSA9IGdldEZpZWxkRmlndXJlKCk7Ci0gICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZCkgZ2V0TW9kZWwoKTsKLSAgICAKLSAgICBmaWd1cmUuZ2V0TmFtZUxhYmVsKCkuc2V0VGV4dChmaWVsZC5nZXROYW1lKCkpOwotICAgIGZpZ3VyZS5nZXRUeXBlTGFiZWwoKS5zZXRUZXh0KGZpZWxkLmdldFR5cGVOYW1lKCkpOwotICAgIGZpZ3VyZS5yZWZyZXNoVmlzdWFscyhnZXRNb2RlbCgpKTsKLSAgICBpZiAoZmllbGQuaXNSZWFkT25seSgpKQotICAgIHsKLSAgICAgIGZpZ3VyZS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuZGFya0dyYXkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKGlzSGlnaENvbnRyYXN0KQotICAgICAgewotICAgICAgICBmaWd1cmUuc2V0Rm9yZWdyb3VuZENvbG9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfRk9SRUdST1VORCkpOwotICAgICAgICBmaWd1cmUuc2V0QmFja2dyb3VuZENvbG9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBmaWd1cmUuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsgICAgIAotICAgIH0KLQotICAgIFN0cmluZyBvY2N1cnJlbmNlRGVzY3JpcHRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIElBbm5vdGF0aW9uUHJvdmlkZXIpCi0gICAgewotICAgICAgb2NjdXJyZW5jZURlc2NyaXB0aW9uID0gKChJQW5ub3RhdGlvblByb3ZpZGVyKWZpZWxkKS5nZXROYW1lQW5ub3RhdGlvblN0cmluZygpOwotICAgIH0KLSAgICByZWZyZXNoSWNvbigpOwotICAgIGZpZ3VyZS5nZXROYW1lQW5ub3RhdGlvbkxhYmVsKCkuc2V0VGV4dChvY2N1cnJlbmNlRGVzY3JpcHRpb24pOwotICAgIAotICAgIGZpZ3VyZS5yZWNvbXB1dGVMYXlvdXQoKTsKLQotCi0gICAgaWYgKGdldFJvb3QoKSAhPSBudWxsKQotICAgICAgKChHcmFwaGljYWxFZGl0UGFydClnZXRSb290KCkpLmdldEZpZ3VyZSgpLmludmFsaWRhdGVUcmVlKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hJY29uKCkgIAotICB7Ci0gICAgSUZpZWxkRmlndXJlIGZpZ3VyZSA9IGdldEZpZWxkRmlndXJlKCk7ICAgCi0gICAgLy8gb3VyIG1vZGVsIGltcGxlbWVudHMgSVRyZWVFbGVtZW50Ci0gICAgaWYgKGdldE1vZGVsKCkgaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICBJbWFnZSBpbWFnZSA9ICgoWFNEQmFzZUFkYXB0ZXIpZ2V0TW9kZWwoKSkuZ2V0SW1hZ2UoKTsKLSAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICgoWFNEQmFzZUFkYXB0ZXIpZ2V0TW9kZWwoKSkuaXNSZWFkT25seSgpOwotICAgICAgZmlndXJlLmdldE5hbWVMYWJlbCgpLnNldEljb24oaW1hZ2UpOwotICAgICAgCi0gICAgICBpZiAoaW1hZ2UgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgKChYU0RCYXNlQWRhcHRlcilnZXRNb2RlbCgpKS5nZXRUYXJnZXQoKTsKLSAgICAgICAgZmlndXJlLmdldE5hbWVMYWJlbCgpLnNldEljb24oWFNEQ29tbW9uVUlVdGlscy5nZXRVcGRhdGVkSW1hZ2UoY29tcCwgaW1hZ2UsIGlzUmVhZE9ubHkpKTsKLSAgICAgIH0KLSAgICB9ICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkTm90aWZ5KCkKLSAgewotICAgIHN1cGVyLmFkZE5vdGlmeSgpOwotICAgIGdldEZpZWxkRmlndXJlKCkuZWRpdFBhcnRBdHRhY2hlZCh0aGlzKTsKLSAgfQotCi0gIHByb3RlY3RlZCBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kgPSBuZXcgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsKCk7Ci0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSk7Ci0gICAgaWYgKCFpc0ZpbGVSZWFkT25seSgpKQotICAgICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwgbmV3IERyYWdBbmREcm9wRWRpdFBvbGljeShnZXRWaWV3ZXIoKSwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgZGlyZWN0RWRpdE5hbWVGaWVsZCgpCi0gIHsKLSAgICBPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotICAgIElGaWVsZEZpZ3VyZSBmaWVsZEZpZ3VyZSA9IGdldEZpZWxkRmlndXJlKCk7Ci0gICAgaWYgKCBtb2RlbCBpbnN0YW5jZW9mIElGaWVsZCkgCi0gICAgewotICAgICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZCkgbW9kZWw7Ci0gICAgICBpZiAoZmllbGQuaXNSZWZlcmVuY2UoKSkKLSAgICAgIHsKLSAgICAgICAgUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlciA9IG51bGw7Ci0gICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICBtYW5hZ2VyID0gbmV3IEVsZW1lbnRSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlcigoSUZpZWxkKSBtb2RlbCwgdGhpcywgZmllbGRGaWd1cmUuZ2V0TmFtZUxhYmVsKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGZpZWxkIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyKQotICAgICAgICB7Ci0gICAgICAgICAgbWFuYWdlciA9IG5ldyBBdHRyaWJ1dGVSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlcigoSUZpZWxkKSBtb2RlbCwgdGhpcywgZmllbGRGaWd1cmUuZ2V0TmFtZUxhYmVsKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYW5hZ2VyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBSZWZlcmVuY2VVcGRhdGVDb21tYW5kIGVsZW1lbnRVcGRhdGVDb21tYW5kID0gbmV3IFJlZmVyZW5jZVVwZGF0ZUNvbW1hbmQoKTsKLSAgICAgICAgICBlbGVtZW50VXBkYXRlQ29tbWFuZC5zZXREZWxlZ2F0ZShtYW5hZ2VyKTsKLSAgICAgICAgICBhZHREaXJlY3RFZGl0UG9saWN5LnNldFVwZGF0ZUNvbW1hbmQoZWxlbWVudFVwZGF0ZUNvbW1hbmQpOwotICAgICAgICAgIG1hbmFnZXIuc2hvdygpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIExhYmVsRWRpdE1hbmFnZXIgbWFuYWdlciA9IG5ldyBMYWJlbEVkaXRNYW5hZ2VyKHRoaXMsIG5ldyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKHRoaXMsIG51bGwpKTsKLSAgICAgICAgTmFtZVVwZGF0ZUNvbW1hbmRXcmFwcGVyIHdyYXBwZXIgPSBuZXcgTmFtZVVwZGF0ZUNvbW1hbmRXcmFwcGVyKCk7Ci0gICAgICAgIGFkdERpcmVjdEVkaXRQb2xpY3kuc2V0VXBkYXRlQ29tbWFuZCh3cmFwcGVyKTsKLSAgICAgICAgbWFuYWdlci5zaG93KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRGb2N1cyhib29sZWFuIGZvY3VzKQotICB7Ci0gICAgc3VwZXIuc2V0Rm9jdXMoZm9jdXMpOwotICAgIGhhc0ZvY3VzID0gZm9jdXM7Ci0gICAgKChGaWVsZEZpZ3VyZSlnZXRGaWd1cmUoKSkuaGFzRm9jdXMgPSBoYXNGb2N1czsKLSAgICBnZXRGaWd1cmUoKS5yZXBhaW50KCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNERWRpdFBhcnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTREVkaXRQYXJ0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTFiNzg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNERWRpdFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLkNhdGVnb3J5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRE1vZGVsR3JvdXBBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEU2NoZW1hQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkFEVEVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkNvbHVtbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSUNvbXBhcnRtZW50RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklGaWVsZEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JU3RydWN0dXJlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5UeXBlVml6RmlndXJlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLlNwYWNlRmlsbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5UYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5JRXh0ZW5kZWRGaWd1cmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuSU1vZGVsR3JvdXBGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIFhTREVkaXRQYXJ0RmFjdG9yeSBleHRlbmRzIEFEVEVkaXRQYXJ0RmFjdG9yeSBpbXBsZW1lbnRzIElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkKLXsKLSAgcHJvdGVjdGVkIElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkgZGVsZWdhdGU7Ci0gIAotICBwdWJsaWMgWFNERWRpdFBhcnRGYWN0b3J5KCkKLSAgewotICAgIGRlbGVnYXRlID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFhTREVkaXRvckNvbmZpZ3VyYXRpb24oKS5nZXRGaWd1cmVGYWN0b3J5KCk7Ci0gICAgaWYgKGRlbGVnYXRlID09IG51bGwpCi0gICAgICBkZWxlZ2F0ZSA9IG5ldyBUeXBlVml6RmlndXJlRmFjdG9yeSgpOwotICB9Ci0gIAotICBwdWJsaWMgWFNERWRpdFBhcnRGYWN0b3J5KElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkgZmlndXJlRmFjdG9yeSkKLSAgewotICAgIGRlbGVnYXRlID0gZmlndXJlRmFjdG9yeTsKLSAgfQotICAKLQotICBwdWJsaWMgRWRpdFBhcnQgZG9DcmVhdGVFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBFZGl0UGFydCBjaGlsZCA9IG51bGw7Ci0gICAgLy8gT3ZlcnJpZGUgZWRpdCBwYXJ0IHdoZXJlIGRlc2lyZWQKLSAgICAKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJRmllbGQpCi0gICAgewotICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgU3BhY2VGaWxsZXIpCi0gICAgICB7Ci0gICAgICAgIGNoaWxkID0gbmV3IFNwYWNlRmlsbGVyRm9yRmllbGRFZGl0UGFydCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29udGV4dCBpbnN0YW5jZW9mIENvbXBhcnRtZW50RWRpdFBhcnQpCi0gICAgICB7ICAKLSAgICAgICAgY2hpbGQgPSBuZXcgWFNEQmFzZUZpZWxkRWRpdFBhcnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RTY2hlbWFBZGFwdGVyKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IFhTRFNjaGVtYUVkaXRQYXJ0KCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgQ2F0ZWdvcnlBZGFwdGVyKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IENhdGVnb3J5RWRpdFBhcnQoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFkYXB0ZXIpCi0gICAgewotICAgICAgY2hpbGQgPSBuZXcgWFNEU2ltcGxlVHlwZUVkaXRQYXJ0KCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cEFkYXB0ZXIpCi0gICAgewotICAgICAgY2hpbGQgPSBuZXcgTW9kZWxHcm91cEVkaXRQYXJ0KCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgQW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQW5ub3RhdGlvbikgbW9kZWw7Ci0gICAgICBTdHJpbmcga2luZCA9IGFubm90YXRpb24uZ2V0Q29tcGFydG1lbnQoKS5nZXRLaW5kKCk7Ci0gICAgICBpZiAoa2luZC5lcXVhbHMoImVsZW1lbnQiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBjaGlsZCA9IG5ldyBYU0RHcm91cHNGb3JBbm5vdGF0aW9uRWRpdFBhcnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGtpbmQuZXF1YWxzKCJhdHRyaWJ1dGUiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBjaGlsZCA9IG5ldyBYU0RBdHRyaWJ1dGVzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKCEoY29udGV4dCBpbnN0YW5jZW9mIENvbHVtbkVkaXRQYXJ0KSkKLSAgICB7ICAgCi0gICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBUYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXIpCi0gICAgICB7Ci0gICAgICAgIGNoaWxkID0gbmV3IFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyKQotICAgICAgewotICAgICAgICBjaGlsZCA9IG5ldyBNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZUVkaXRQYXJ0KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIGNoaWxkID0gbmV3IEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkVkaXRQYXJ0KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYSBzcGVjaWFsemllZCBYU0QgZWRpdCBwYXJ0IHRvIGNyZWF0ZQotICAgIC8vIHRoZW4gd2Ugc2ltcGx5IGNhbGwgdGhlIHN1cGVyIGNsYXNzIHRvIGNyZWF0ZSBhIGdlbmVyaWMgQURUIGVkaXQgcGFydAotICAgIC8vCi0gICAgaWYgKGNoaWxkID09IG51bGwpCi0gICAgewotICAgICAgY2hpbGQgPSBzdXBlci5kb0NyZWF0ZUVkaXRQYXJ0KGNvbnRleHQsIG1vZGVsKTsKLSAgICB9Ci0KLSAgICAvLyBpZiBhdCB0aGlzIHRoaXMgcG9pbnQgd2UgaGF2ZSBub3QgY3JlYXRlZCBhbiBlZGl0IHBhcnQgd2Ugc2ltcGx5Ci0gICAgLy8gY3JlYXRlIGEgcGxhY2Vob2xkZXIgZWRpdCBwYXJ0IHRvIHByb3ZpZGUgdGhlIG1vc3Qgcm9idXN0IGJlaGF2aW91ciBwb3NzaWJsZQotICAgIC8vICAgIAotICAgIGlmIChjaGlsZCA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIFRPRE8gKGNzKSBsb2cgYW4gZXJyb3IgbWVzc2FnZSBoZXJlLCBzaW5jZSB3ZSBzaG91bGRuJ3QgcmVhbGx5IGdldCBoZXJlIAotICAgICAgY2hpbGQgPSBuZXcgU3BhY2VGaWxsZXJGb3JGaWVsZEVkaXRQYXJ0KCk7Ci0gICAgfSAgCi0gICAgcmV0dXJuIGNoaWxkOwotICB9Ci0KLSAgcHVibGljIElDb21wYXJ0bWVudEZpZ3VyZSBjcmVhdGVDb21wYXJ0bWVudEZpZ3VyZShPYmplY3QgbW9kZWwpCi0gIHsKLSAgICByZXR1cm4gZGVsZWdhdGUuY3JlYXRlQ29tcGFydG1lbnRGaWd1cmUobW9kZWwpOwotICB9Ci0gIAotICBwdWJsaWMgSVN0cnVjdHVyZUZpZ3VyZSBjcmVhdGVTdHJ1Y3R1cmVGaWd1cmUoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgSVN0cnVjdHVyZUZpZ3VyZSBmaWd1cmUgPSBkZWxlZ2F0ZS5jcmVhdGVTdHJ1Y3R1cmVGaWd1cmUobW9kZWwpOwotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXAgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpICgoWFNEQmFzZUFkYXB0ZXIpbW9kZWwpLmdldFRhcmdldCgpOwotICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gKChYU0RCYXNlQWRhcHRlciltb2RlbCkuaXNSZWFkT25seSgpOwotICAgICAgZmlndXJlLmdldE5hbWVMYWJlbCgpLnNldEljb24oWFNEQ29tbW9uVUlVdGlscy5nZXRVcGRhdGVkSW1hZ2UoIGNvbXAsICgoWFNEQmFzZUFkYXB0ZXIpbW9kZWwpLmdldEltYWdlKCksIGlzUmVhZE9ubHkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfSAgCi0KLSAgcHVibGljIElGaWVsZEZpZ3VyZSBjcmVhdGVGaWVsZEZpZ3VyZShPYmplY3QgbW9kZWwpCi0gIHsKLSAgICByZXR1cm4gZGVsZWdhdGUuY3JlYXRlRmllbGRGaWd1cmUobW9kZWwpOwotICB9Ci0gIAotICBwdWJsaWMgSU1vZGVsR3JvdXBGaWd1cmUgY3JlYXRlTW9kZWxHcm91cEZpZ3VyZShPYmplY3QgbW9kZWwpCi0gIHsKLSAgICByZXR1cm4gZGVsZWdhdGUuY3JlYXRlTW9kZWxHcm91cEZpZ3VyZShtb2RlbCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNER3JvdXBzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTREdyb3Vwc0ZvckFubm90YXRpb25FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDY1YjM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNER3JvdXBzRm9yQW5ub3RhdGlvbkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLlNlY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklDb21wbGV4VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBYU0RHcm91cHNGb3JBbm5vdGF0aW9uRWRpdFBhcnQgZXh0ZW5kcyBTZWN0aW9uRWRpdFBhcnQKLXsKLSAgcHVibGljIFhTREdyb3Vwc0ZvckFubm90YXRpb25FZGl0UGFydCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpCi0gIHsKLSAgICBMaXN0IHhzZE1vZGVsR3JvdXBMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIExpc3QgYWRhcHRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgSVN0cnVjdHVyZSBzdHJ1Y3R1cmUgPSAgKChBbm5vdGF0aW9uKWdldE1vZGVsKCkpLmdldE93bmVyKCk7Ci0gICAgaWYgKHN0cnVjdHVyZSBpbnN0YW5jZW9mIElDb21wbGV4VHlwZSkKLSAgICB7ICAKLSAgICAgIGNvbXBsZXhUeXBlID0gKElDb21wbGV4VHlwZSlzdHJ1Y3R1cmU7Ci0gICAgICBpZiAoY29tcGxleFR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyKQotICAgICAgewotICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcikgY29tcGxleFR5cGU7Ci0gICAgICAgIHhzZE1vZGVsR3JvdXBMaXN0ID0gYWRhcHRlci5nZXRNb2RlbEdyb3VwcygpOwotICAgICAgfQotICAgICAgCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2RNb2RlbEdyb3VwTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgICB7Ci0gICAgICAgICAgYWRhcHRlckxpc3QuYWRkKFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoKFhTRE1vZGVsR3JvdXApb2JqKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBhZGFwdGVyTGlzdC5hZGQoWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCgoWFNETW9kZWxHcm91cERlZmluaXRpb24pb2JqKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RydWN0dXJlIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyKQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcikgc3RydWN0dXJlOwotICAgICAgWFNETW9kZWxHcm91cCBncm91cCA9IGFkYXB0ZXIuZ2V0WFNETW9kZWxHcm91cERlZmluaXRpb24oKS5nZXRNb2RlbEdyb3VwKCk7Ci0gICAgICBpZiAoZ3JvdXAgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYWRhcHRlckxpc3QuYWRkKFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoZ3JvdXApKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGFkYXB0ZXJMaXN0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTRE1vZGVsR3JvdXBSb3V0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNETW9kZWxHcm91cFJvdXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTk1NzgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNETW9kZWxHcm91cFJvdXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RSb3V0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vLyBUT0RPIE1hbmhhdHRhbiBjb25uZWN0aW9uIHJvdXRlciBpcyBmaW5hbAotcHVibGljIGNsYXNzIFhTRE1vZGVsR3JvdXBSb3V0ZXIgZXh0ZW5kcyBBYnN0cmFjdFJvdXRlcgotewotICBwdWJsaWMgWFNETW9kZWxHcm91cFJvdXRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIHByaXZhdGUgTWFwIHJvd3NVc2VkID0gbmV3IEhhc2hNYXAoKTsKLSAgcHJpdmF0ZSBNYXAgY29sc1VzZWQgPSBuZXcgSGFzaE1hcCgpOwotCi0gIHByaXZhdGUgTWFwIHJlc2VydmVkSW5mbyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgcHJpdmF0ZSBjbGFzcyBSZXNlcnZlZEluZm8gewotICAgIHB1YmxpYyBMaXN0IHJlc2VydmVkUm93cyA9IG5ldyBBcnJheUxpc3QoMik7Ci0gICAgcHVibGljIExpc3QgcmVzZXJ2ZWRDb2xzID0gbmV3IEFycmF5TGlzdCgyKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFJheSAgVVAgICAgPSBuZXcgUmF5KDAsIC0xKSwKLSAgICAgICAgICAgICAgRE9XTiAgPSBuZXcgUmF5KDAsIDEpLAotICAgICAgICAgICAgICBMRUZUICA9IG5ldyBSYXkoLTEsIDApLAotICAgICAgICAgICAgICBSSUdIVCA9IG5ldyBSYXkoMSwgMCk7Ci0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvblJvdXRlciNpbnZhbGlkYXRlKENvbm5lY3Rpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgIHJlbW92ZVJlc2VydmVkTGluZXMoY29ubmVjdGlvbik7Ci0gIH0KLQotICBwcml2YXRlIGludCBnZXRDb2x1bW5OZWFyKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgaW50IHIsIGludCBuLCBpbnQgeCkgewotICAgIGludCBtaW4gPSBNYXRoLm1pbihuLCB4KSwKLSAgICAgIG1heCA9IE1hdGgubWF4KG4sIHgpOwotICAgIGlmIChtaW4gPiByKSB7Ci0gICAgICBtYXggPSBtaW47Ci0gICAgICBtaW4gPSByIC0gKG1pbiAtIHIpOwotICAgIH0KLSAgICBpZiAobWF4IDwgcikgewotICAgICAgbWluID0gbWF4OwotICAgICAgbWF4ID0gciArIChyIC0gbWF4KTsKLSAgICB9Ci0gICAgaW50IHByb3hpbWl0eSA9IDA7Ci0gICAgaW50IGRpcmVjdGlvbiA9IC0xOwotICAgIGlmIChyICUgMiA9PSAxKQotICAgICAgci0tOwotICAgIEludGVnZXIgaTsKLSAgICB3aGlsZSAocHJveGltaXR5IDwgcikgewotICAgICAgaSA9IG5ldyBJbnRlZ2VyKHIgKyBwcm94aW1pdHkgKiBkaXJlY3Rpb24pOwotICAgICAgaWYgKCFjb2xzVXNlZC5jb250YWluc0tleShpKSkgewotICAgICAgICBjb2xzVXNlZC5wdXQoaSwgaSk7Ci0gICAgICAgIHJlc2VydmVDb2x1bW4oY29ubmVjdGlvbiwgaSk7Ci0gICAgICAgIHJldHVybiBpLmludFZhbHVlKCk7Ci0gICAgICB9Ci0gICAgICBpbnQgaiA9IGkuaW50VmFsdWUoKTsKLSAgICAgIGlmIChqIDw9IG1pbikKLSAgICAgICAgcmV0dXJuIGogKyAyOwotICAgICAgaWYgKGogPj0gbWF4KQotICAgICAgICByZXR1cm4gaiAtIDI7Ci0gICAgICBpZiAoZGlyZWN0aW9uID09IDEpCi0gICAgICAgIGRpcmVjdGlvbiA9IC0xOwotICAgICAgZWxzZSB7Ci0gICAgICAgIGRpcmVjdGlvbiA9IDE7Ci0gICAgICAgIHByb3hpbWl0eSArPSAyOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBkaXJlY3Rpb24gdGhlIHBvaW50IDxpPnA8L2k+IGlzIGluIHJlbGF0aW9uIHRvIHRoZSBnaXZlbiByZWN0YW5nbGUuCi0gICAqIFBvc3NpYmxlIHZhbHVlcyBhcmUgTEVGVCAoLTEsMCksIFJJR0hUICgxLDApLCBVUCAoMCwtMSkgYW5kIERPV04gKDAsMSkuCi0gICAqIAotICAgKiBAcGFyYW0gciB0aGUgcmVjdGFuZ2xlCi0gICAqIEBwYXJhbSBwIHRoZSBwb2ludAotICAgKiBAcmV0dXJuIHRoZSBkaXJlY3Rpb24gZnJvbSA8aT5yPC9pPiB0byA8aT5wPC9pPgotICAgKi8KLSAgcHJvdGVjdGVkIFJheSBnZXREaXJlY3Rpb24oUmVjdGFuZ2xlIHIsIFBvaW50IHApIHsKLSAgICBpbnQgaSwgZGlzdGFuY2UgPSBNYXRoLmFicyhyLnggLSBwLngpOwotICAgIFJheSBkaXJlY3Rpb247Ci0gICAgCi0gICAgZGlyZWN0aW9uID0gTEVGVDsKLQotICAgIGkgPSBNYXRoLmFicyhyLnkgLSBwLnkpOwotICAgIGlmIChpIDw9IGRpc3RhbmNlKSB7Ci0gICAgICBkaXN0YW5jZSA9IGk7Ci0gICAgICBkaXJlY3Rpb24gPSBVUDsKLSAgICB9Ci0KLSAgICBpID0gTWF0aC5hYnMoci5ib3R0b20oKSAtIHAueSk7Ci0gICAgaWYgKGkgPD0gZGlzdGFuY2UpIHsKLSAgICAgIGRpc3RhbmNlID0gaTsKLSAgICAgIGRpcmVjdGlvbiA9IERPV047Ci0gICAgfQotCi0gICAgaSA9IE1hdGguYWJzKHIucmlnaHQoKSAtIHAueCk7Ci0gICAgaWYgKGkgPCBkaXN0YW5jZSkgewotICAgICAgZGlzdGFuY2UgPSBpOwotICAgICAgZGlyZWN0aW9uID0gUklHSFQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGRpcmVjdGlvbjsKLSAgfQotCi0gIHByb3RlY3RlZCBSYXkgZ2V0RW5kRGlyZWN0aW9uKENvbm5lY3Rpb24gY29ubikgewotICAgIENvbm5lY3Rpb25BbmNob3IgYW5jaG9yID0gY29ubi5nZXRUYXJnZXRBbmNob3IoKTsKLSAgICBQb2ludCBwID0gZ2V0RW5kUG9pbnQoY29ubik7Ci0gICAgUmVjdGFuZ2xlIHJlY3Q7Ci0gICAgaWYgKGFuY2hvci5nZXRPd25lcigpID09IG51bGwpCi0gICAgICByZWN0ID0gbmV3IFJlY3RhbmdsZShwLnggLSAxLCBwLnkgLSAxLCAyLCAyKTsKLSAgICBlbHNlIHsKLSAgICAgIHJlY3QgPSBjb25uLmdldFRhcmdldEFuY2hvcigpLmdldE93bmVyKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotICAgICAgY29ubi5nZXRUYXJnZXRBbmNob3IoKS5nZXRPd25lcigpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocmVjdCk7Ci0gICAgfQotICAgIHJldHVybiBnZXREaXJlY3Rpb24ocmVjdCwgcCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgaW50IGdldFJvd05lYXIoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBpbnQgciwgaW50IG4sIGludCB4KSB7Ci0gICAgaW50IG1pbiA9IE1hdGgubWluKG4sIHgpLAotICAgICAgbWF4ID0gTWF0aC5tYXgobiwgeCk7Ci0gICAgaWYgKG1pbiA+IHIpIHsKLSAgICAgIG1heCA9IG1pbjsKLSAgICAgIG1pbiA9IHIgLSAobWluIC0gcik7Ci0gICAgfQotICAgIGlmIChtYXggPCByKSB7Ci0gICAgICBtaW4gPSBtYXg7Ci0gICAgICBtYXggPSByICsgKHIgLSBtYXgpOwotICAgIH0KLQotICAgIGludCBwcm94aW1pdHkgPSAwOwotICAgIGludCBkaXJlY3Rpb24gPSAtMTsKLSAgICBpZiAociAlIDIgPT0gMSkKLSAgICAgIHItLTsKLSAgICBJbnRlZ2VyIGk7Ci0gICAgd2hpbGUgKHByb3hpbWl0eSA8IHIpIHsKLSAgICAgIGkgPSBuZXcgSW50ZWdlcihyICsgcHJveGltaXR5ICogZGlyZWN0aW9uKTsKLSAgICAgIGlmICghcm93c1VzZWQuY29udGFpbnNLZXkoaSkpIHsKLSAgICAgICAgcm93c1VzZWQucHV0KGksIGkpOwotICAgICAgICByZXNlcnZlUm93KGNvbm5lY3Rpb24sIGkpOwotICAgICAgICByZXR1cm4gaS5pbnRWYWx1ZSgpOwotICAgICAgfQotICAgICAgaW50IGogPSBpLmludFZhbHVlKCk7Ci0gICAgICBpZiAoaiA8PSBtaW4pCi0gICAgICAgIHJldHVybiBqICsgMjsKLSAgICAgIGlmIChqID49IG1heCkKLSAgICAgICAgcmV0dXJuIGogLSAyOwotICAgICAgaWYgKGRpcmVjdGlvbiA9PSAxKQotICAgICAgICBkaXJlY3Rpb24gPSAtMTsKLSAgICAgIGVsc2UgewotICAgICAgICBkaXJlY3Rpb24gPSAxOwotICAgICAgICBwcm94aW1pdHkgKz0gMjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgUmF5IGdldFN0YXJ0RGlyZWN0aW9uKENvbm5lY3Rpb24gY29ubikgewotICAgIENvbm5lY3Rpb25BbmNob3IgYW5jaG9yID0gY29ubi5nZXRTb3VyY2VBbmNob3IoKTsKLSAgICBQb2ludCBwID0gZ2V0U3RhcnRQb2ludChjb25uKTsKLSAgICBSZWN0YW5nbGUgcmVjdDsKLSAgICBpZiAoYW5jaG9yLmdldE93bmVyKCkgPT0gbnVsbCkKLSAgICAgIHJlY3QgPSBuZXcgUmVjdGFuZ2xlKHAueCAtIDEsIHAueSAtIDEsIDIsIDIpOwotICAgIGVsc2UgewotICAgICAgcmVjdCA9IGNvbm4uZ2V0U291cmNlQW5jaG9yKCkuZ2V0T3duZXIoKS5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0gICAgICBjb25uLmdldFNvdXJjZUFuY2hvcigpLmdldE93bmVyKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShyZWN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIGdldERpcmVjdGlvbihyZWN0LCBwKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NQb3NpdGlvbnMoUmF5IHN0YXJ0LCBSYXkgZW5kLCBMaXN0IHBvc2l0aW9ucywgCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaG9yaXpvbnRhbCwgQ29ubmVjdGlvbiBjb25uKSB7Ci0gICAgcmVtb3ZlUmVzZXJ2ZWRMaW5lcyhjb25uKTsKLQotICAgIGludCBwb3NbXSA9IG5ldyBpbnRbcG9zaXRpb25zLnNpemUoKSArIDJdOwotICAgIGlmIChob3Jpem9udGFsKQotICAgICAgcG9zWzBdID0gc3RhcnQueDsKLSAgICBlbHNlCi0gICAgICBwb3NbMF0gPSBzdGFydC55OwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBwb3NpdGlvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIHBvc1tpICsgMV0gPSAoKEludGVnZXIpcG9zaXRpb25zLmdldChpKSkuaW50VmFsdWUoKTsKLSAgICB9Ci0gICAgaWYgKGhvcml6b250YWwgPT0gKHBvc2l0aW9ucy5zaXplKCkgJSAyID09IDEpKQotICAgICAgcG9zWysraV0gPSBlbmQueDsKLSAgICBlbHNlCi0gICAgICBwb3NbKytpXSA9IGVuZC55OwotCi0gICAgUG9pbnRMaXN0IHBvaW50cyA9IG5ldyBQb2ludExpc3QoKTsKLSAgICBwb2ludHMuYWRkUG9pbnQobmV3IFBvaW50KHN0YXJ0LngsIHN0YXJ0LnkpKTsKLSAgICBQb2ludCBwOwotICAgIGludCBjdXJyZW50LCBwcmV2LCBtaW4sIG1heDsKLSAgICBib29sZWFuIGFkanVzdDsKLSAgICBmb3IgKGkgPSAyOyBpIDwgcG9zLmxlbmd0aCAtIDE7IGkrKykgewotICAgICAgaG9yaXpvbnRhbCA9ICFob3Jpem9udGFsOwotICAgICAgcHJldiA9IHBvc1tpIC0gMV07Ci0gICAgICBjdXJyZW50ID0gcG9zW2ldOwotCi0gICAgICBhZGp1c3QgPSAoaSAhPSBwb3MubGVuZ3RoIC0gMik7Ci0gICAgICBpZiAoaG9yaXpvbnRhbCkgewotICAgICAgICBpZiAoYWRqdXN0KSB7Ci0gICAgICAgICAgbWluID0gcG9zW2kgLSAyXTsKLSAgICAgICAgICBtYXggPSBwb3NbaSArIDJdOwotICAgICAgICAgIHBvc1tpXSA9IGN1cnJlbnQgPSBnZXRSb3dOZWFyKGNvbm4sIGN1cnJlbnQsIG1pbiwgbWF4KTsKLSAgICAgICAgfQotICAgICAgICBwID0gbmV3IFBvaW50KHByZXYsIGN1cnJlbnQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGFkanVzdCkgewotICAgICAgICAgIG1pbiA9IHBvc1tpIC0gMl07Ci0gICAgICAgICAgbWF4ID0gcG9zW2kgKyAyXTsKLSAgICAgICAgICBwb3NbaV0gPSBjdXJyZW50ID0gZ2V0Q29sdW1uTmVhcihjb25uLCBjdXJyZW50LCBtaW4sIG1heCk7Ci0gICAgICAgIH0KLSAgICAgICAgcCA9IG5ldyBQb2ludChjdXJyZW50LCBwcmV2KTsKLSAgICAgIH0KLSAgICAgIHBvaW50cy5hZGRQb2ludChwKTsKLSAgICB9Ci0gICAgcG9pbnRzLmFkZFBvaW50KG5ldyBQb2ludChlbmQueCwgZW5kLnkpKTsKLSAgICBjb25uLnNldFBvaW50cyhwb2ludHMpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25Sb3V0ZXIjcmVtb3ZlKENvbm5lY3Rpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCByZW1vdmUoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0gICAgcmVtb3ZlUmVzZXJ2ZWRMaW5lcyhjb25uZWN0aW9uKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZVJlc2VydmVkTGluZXMoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0gICAgUmVzZXJ2ZWRJbmZvIHJJbmZvID0gKFJlc2VydmVkSW5mbykgcmVzZXJ2ZWRJbmZvLmdldChjb25uZWN0aW9uKTsKLSAgICBpZiAockluZm8gPT0gbnVsbCkgCi0gICAgICByZXR1cm47Ci0gICAgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBySW5mby5yZXNlcnZlZFJvd3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgIHJvd3NVc2VkLnJlbW92ZShySW5mby5yZXNlcnZlZFJvd3MuZ2V0KGkpKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBySW5mby5yZXNlcnZlZENvbHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGNvbHNVc2VkLnJlbW92ZShySW5mby5yZXNlcnZlZENvbHMuZ2V0KGkpKTsKLSAgICB9Ci0gICAgcmVzZXJ2ZWRJbmZvLnJlbW92ZShjb25uZWN0aW9uKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlc2VydmVDb2x1bW4oQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBJbnRlZ2VyIGNvbHVtbikgewotICAgIFJlc2VydmVkSW5mbyBpbmZvID0gKFJlc2VydmVkSW5mbykgcmVzZXJ2ZWRJbmZvLmdldChjb25uZWN0aW9uKTsKLSAgICBpZiAoaW5mbyA9PSBudWxsKSB7Ci0gICAgICBpbmZvID0gbmV3IFJlc2VydmVkSW5mbygpOwotICAgICAgcmVzZXJ2ZWRJbmZvLnB1dChjb25uZWN0aW9uLCBpbmZvKTsKLSAgICB9Ci0gICAgaW5mby5yZXNlcnZlZENvbHMuYWRkKGNvbHVtbik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZXNlcnZlUm93KENvbm5lY3Rpb24gY29ubmVjdGlvbiwgSW50ZWdlciByb3cpIHsKLSAgICBSZXNlcnZlZEluZm8gaW5mbyA9IChSZXNlcnZlZEluZm8pIHJlc2VydmVkSW5mby5nZXQoY29ubmVjdGlvbik7Ci0gICAgaWYgKGluZm8gPT0gbnVsbCkgewotICAgICAgaW5mbyA9IG5ldyBSZXNlcnZlZEluZm8oKTsKLSAgICAgIHJlc2VydmVkSW5mby5wdXQoY29ubmVjdGlvbiwgaW5mbyk7Ci0gICAgfQotICAgIGluZm8ucmVzZXJ2ZWRSb3dzLmFkZChyb3cpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25Sb3V0ZXIjcm91dGUoQ29ubmVjdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJvdXRlKENvbm5lY3Rpb24gY29ubikgewotICAgIGlmICgoY29ubi5nZXRTb3VyY2VBbmNob3IoKSA9PSBudWxsKSB8fCAoY29ubi5nZXRUYXJnZXRBbmNob3IoKSA9PSBudWxsKSkgCi0gICAgICByZXR1cm47Ci0gICAgaW50IGk7Ci0gICAgUG9pbnQgc3RhcnRQb2ludCA9IGdldFN0YXJ0UG9pbnQoY29ubik7Ci0gICAgY29ubi50cmFuc2xhdGVUb1JlbGF0aXZlKHN0YXJ0UG9pbnQpOwotICAgIFBvaW50IGVuZFBvaW50ID0gZ2V0RW5kUG9pbnQoY29ubik7Ci0gICAgY29ubi50cmFuc2xhdGVUb1JlbGF0aXZlKGVuZFBvaW50KTsKLQotICAgIFJheSBzdGFydCA9IG5ldyBSYXkoc3RhcnRQb2ludCk7Ci0gICAgUmF5IGVuZCA9IG5ldyBSYXkoZW5kUG9pbnQpOwotICAgIFJheSBhdmVyYWdlID0gbmV3IFJheShzdGFydFBvaW50LnggKyA0LCBzdGFydFBvaW50LnkpOyAvLyBzdGFydC5nZXRBdmVyYWdlZChlbmQpOwotCi0gICAgUmF5IGRpcmVjdGlvbiA9IG5ldyBSYXkoc3RhcnQsIGVuZCk7Ci0gICAgUmF5IHN0YXJ0Tm9ybWFsID0gZ2V0U3RhcnREaXJlY3Rpb24oY29ubik7Ci0gICAgUmF5IGVuZE5vcm1hbCAgID0gZ2V0RW5kRGlyZWN0aW9uKGNvbm4pOwotCi0gICAgTGlzdCBwb3NpdGlvbnMgPSBuZXcgQXJyYXlMaXN0KDUpOwotICAgIGJvb2xlYW4gaG9yaXpvbnRhbCA9IHN0YXJ0Tm9ybWFsLmlzSG9yaXpvbnRhbCgpOwotICAgIGlmIChob3Jpem9udGFsKSAKLSAgICAgIHBvc2l0aW9ucy5hZGQobmV3IEludGVnZXIoc3RhcnQueSkpOwotICAgIGVsc2UKLSAgICAgIHBvc2l0aW9ucy5hZGQobmV3IEludGVnZXIoc3RhcnQueCkpOwotICAgIGhvcml6b250YWwgPSAhaG9yaXpvbnRhbDsKLQotICAgIGlmIChzdGFydE5vcm1hbC5kb3RQcm9kdWN0KGVuZE5vcm1hbCkgPT0gMCkgewotICAgICAgaWYgKChzdGFydE5vcm1hbC5kb3RQcm9kdWN0KGRpcmVjdGlvbikgPj0gMCkgCi0gICAgICAgICYmIChlbmROb3JtYWwuZG90UHJvZHVjdChkaXJlY3Rpb24pIDw9IDApKSB7Ci0gICAgICAgIC8vIDAKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIDIKLSAgICAgICAgaWYgKHN0YXJ0Tm9ybWFsLmRvdFByb2R1Y3QoZGlyZWN0aW9uKSA8IDApCi0gICAgICAgICAgaSA9IHN0YXJ0Tm9ybWFsLnNpbWlsYXJpdHkoc3RhcnQuZ2V0QWRkZWQoc3RhcnROb3JtYWwuZ2V0U2NhbGVkKDEwKSkpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBpZiAoaG9yaXpvbnRhbCkgCi0gICAgICAgICAgICBpID0gYXZlcmFnZS55OwotICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICBpID0gYXZlcmFnZS54OwotICAgICAgICB9Ci0gICAgICAgIHBvc2l0aW9ucy5hZGQobmV3IEludGVnZXIoaSkpOwotICAgICAgICBob3Jpem9udGFsID0gIWhvcml6b250YWw7Ci0KLSAgICAgICAgaWYgKGVuZE5vcm1hbC5kb3RQcm9kdWN0KGRpcmVjdGlvbikgPiAwKQotICAgICAgICAgIGkgPSBlbmROb3JtYWwuc2ltaWxhcml0eShlbmQuZ2V0QWRkZWQoZW5kTm9ybWFsLmdldFNjYWxlZCgxMCkpKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgaWYgKGhvcml6b250YWwpIAotICAgICAgICAgICAgaSA9IGF2ZXJhZ2UueTsKLSAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgaSA9IGF2ZXJhZ2UueDsKLSAgICAgICAgfQotICAgICAgICBwb3NpdGlvbnMuYWRkKG5ldyBJbnRlZ2VyKGkpKTsKLSAgICAgICAgaG9yaXpvbnRhbCA9ICFob3Jpem9udGFsOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoc3RhcnROb3JtYWwuZG90UHJvZHVjdChlbmROb3JtYWwpID4gMCkgewotICAgICAgICAvLzEKLSAgICAgICAgaWYgKHN0YXJ0Tm9ybWFsLmRvdFByb2R1Y3QoZGlyZWN0aW9uKSA+PSAwKQotICAgICAgICAgIGkgPSBzdGFydE5vcm1hbC5zaW1pbGFyaXR5KHN0YXJ0LmdldEFkZGVkKHN0YXJ0Tm9ybWFsLmdldFNjYWxlZCgxMCkpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGkgPSBlbmROb3JtYWwuc2ltaWxhcml0eShlbmQuZ2V0QWRkZWQoZW5kTm9ybWFsLmdldFNjYWxlZCgxMCkpKTsKLSAgICAgICAgcG9zaXRpb25zLmFkZChuZXcgSW50ZWdlcihpKSk7Ci0gICAgICAgIGhvcml6b250YWwgPSAhaG9yaXpvbnRhbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vMyBvciAxCi0gICAgICAgIGlmIChzdGFydE5vcm1hbC5kb3RQcm9kdWN0KGRpcmVjdGlvbikgPCAwKSB7Ci0gICAgICAgICAgaSA9IHN0YXJ0Tm9ybWFsLnNpbWlsYXJpdHkoc3RhcnQuZ2V0QWRkZWQoc3RhcnROb3JtYWwuZ2V0U2NhbGVkKDEwKSkpOwotICAgICAgICAgIHBvc2l0aW9ucy5hZGQobmV3IEludGVnZXIoaSkpOwotICAgICAgICAgIGhvcml6b250YWwgPSAhaG9yaXpvbnRhbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChob3Jpem9udGFsKSAKLSAgICAgICAgICBpID0gYXZlcmFnZS55OwotICAgICAgICBlbHNlIAotICAgICAgICAgIGkgPSBhdmVyYWdlLng7Ci0gICAgICAgIHBvc2l0aW9ucy5hZGQobmV3IEludGVnZXIoaSkpOwotICAgICAgICBob3Jpem9udGFsID0gIWhvcml6b250YWw7Ci0KLSAgICAgICAgaWYgKHN0YXJ0Tm9ybWFsLmRvdFByb2R1Y3QoZGlyZWN0aW9uKSA8IDApIHsKLSAgICAgICAgICBpID0gZW5kTm9ybWFsLnNpbWlsYXJpdHkoZW5kLmdldEFkZGVkKGVuZE5vcm1hbC5nZXRTY2FsZWQoMTApKSk7Ci0gICAgICAgICAgcG9zaXRpb25zLmFkZChuZXcgSW50ZWdlcihpKSk7Ci0gICAgICAgICAgaG9yaXpvbnRhbCA9ICFob3Jpem9udGFsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChob3Jpem9udGFsKSAKLSAgICAgIHBvc2l0aW9ucy5hZGQobmV3IEludGVnZXIoZW5kLnkpKTsKLSAgICBlbHNlIAotICAgICAgcG9zaXRpb25zLmFkZChuZXcgSW50ZWdlcihlbmQueCkpOwotICAgIAotICAgIHByb2Nlc3NQb3NpdGlvbnMoc3RhcnQsIGVuZCwgcG9zaXRpb25zLCBzdGFydE5vcm1hbC5pc0hvcml6b250YWwoKSwgY29ubik7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9YU0RTY2hlbWFFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9YU0RTY2hlbWFFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzBhZDdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNEU2NoZW1hRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5UZXh0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLkNhdGVnb3J5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRFNjaGVtYUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5LZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXMuSGVhZGluZ0ZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBvbGljaWVzLlNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5sYXlvdXRzLkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydAotewotICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7Ci0KLSAgcHJvdGVjdGVkIEZpZ3VyZSBvdXRlciwgY29udGVudEZpZ3VyZTsKLSAgcHJvdGVjdGVkIEhlYWRpbmdGaWd1cmUgaGVhZGluZ0ZpZ3VyZTsKLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpCi0gIHsKLSAgICByZXR1cm4gY29udGVudEZpZ3VyZTsKLSAgfQotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBvdXRlciA9IG5ldyBGaWd1cmUoKTsKLSAgICBvdXRlci5zZXRCb3JkZXIobmV3IExpbmVCb3JkZXIoMSkpOwotCi0gICAgRmlsbExheW91dCBmaWxsTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoNCk7Ci0gICAgb3V0ZXIuc2V0TGF5b3V0TWFuYWdlcihmaWxsTGF5b3V0KTsKLQotICAgIGhlYWRpbmdGaWd1cmUgPSBuZXcgSGVhZGluZ0ZpZ3VyZSgpOwotICAgIG91dGVyLmFkZChoZWFkaW5nRmlndXJlKTsKLQotICAgIFJlY3RhbmdsZUZpZ3VyZSBsaW5lID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpCi0gICAgewotICAgICAgcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKGludCB3SGludCwgaW50IGhIaW50KQotICAgICAgewotICAgICAgICBEaW1lbnNpb24gZCA9IHN1cGVyLmdldFByZWZlcnJlZFNpemUod0hpbnQsIGhIaW50KTsKLSAgICAgICAgZC5oZWlnaHQgPSAxOwotICAgICAgICByZXR1cm4gZDsKLSAgICAgIH0KLSAgICB9OwotICAgIFRvb2xiYXJMYXlvdXQgbGluZUxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KGZhbHNlKTsKLSAgICBsaW5lTGF5b3V0LnNldFZlcnRpY2FsKHRydWUpOwotICAgIGxpbmVMYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyh0cnVlKTsKLSAgICBsaW5lLnNldExheW91dE1hbmFnZXIobGluZUxheW91dCk7Ci0gICAgb3V0ZXIuYWRkKGxpbmUpOwotCi0gICAgY29udGVudEZpZ3VyZSA9IG5ldyBGaWd1cmUoKTsKLSAgICBjb250ZW50RmlndXJlLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDQpKTsKLSAgICBmaWxsTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoNCk7Ci0gICAgY29udGVudEZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKGZpbGxMYXlvdXQpOwotCi0gICAgb3V0ZXIuYWRkKGNvbnRlbnRGaWd1cmUpOwotICAgIHJldHVybiBvdXRlcjsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICB7Ci0gICAgWFNEU2NoZW1hQWRhcHRlciBzY2hlbWFBZGFwdGVyID0gKFhTRFNjaGVtYUFkYXB0ZXIpIGdldE1vZGVsKCk7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0vLyBCdWcgMTAzODcwOiB1bmRvIGJsYW5rcyBvdXQgc2NoZW1hIHZpZXcgICAgCi0vLyAgICBzY2hlbWFBZGFwdGVyLnVwZGF0ZUNhdGVnb3JpZXMoKTsKLQotICAgIExpc3QgdGVtcGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgdGVtcGxpc3QuYWRkKHNjaGVtYUFkYXB0ZXIuZ2V0Q2F0ZWdvcnkoQ2F0ZWdvcnlBZGFwdGVyLkRJUkVDVElWRVMpKTsKLSAgICBIb2xkZXIgaG9sZGVyID0gbmV3IEhvbGRlcih0ZW1wbGlzdCk7Ci0gICAgbGlzdC5hZGQoaG9sZGVyKTsKLQotICAgIHRlbXBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHRlbXBsaXN0LmFkZChzY2hlbWFBZGFwdGVyLmdldENhdGVnb3J5KENhdGVnb3J5QWRhcHRlci5FTEVNRU5UUykpOwotICAgIHRlbXBsaXN0LmFkZChzY2hlbWFBZGFwdGVyLmdldENhdGVnb3J5KENhdGVnb3J5QWRhcHRlci5UWVBFUykpOwotICAgIGhvbGRlciA9IG5ldyBIb2xkZXIodGVtcGxpc3QpOwotICAgIGxpc3QuYWRkKGhvbGRlcik7Ci0KLSAgICB0ZW1wbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB0ZW1wbGlzdC5hZGQoc2NoZW1hQWRhcHRlci5nZXRDYXRlZ29yeShDYXRlZ29yeUFkYXB0ZXIuQVRUUklCVVRFUykpOwotICAgIHRlbXBsaXN0LmFkZChzY2hlbWFBZGFwdGVyLmdldENhdGVnb3J5KENhdGVnb3J5QWRhcHRlci5HUk9VUFMpKTsKLSAgICBob2xkZXIgPSBuZXcgSG9sZGVyKHRlbXBsaXN0KTsKLSAgICBsaXN0LmFkZChob2xkZXIpOwotCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlQ2hpbGQoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgQ2F0ZWdvcnlSb3dFZGl0UGFydCByZXN1bHQgPSBuZXcgQ2F0ZWdvcnlSb3dFZGl0UGFydCgpOwotICAgIHJlc3VsdC5zZXRNb2RlbChtb2RlbCk7Ci0gICAgcmVzdWx0LnNldFBhcmVudCh0aGlzKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLSAgICAKLSAgICBMaW5lQm9yZGVyIGJvcmRlciA9IChMaW5lQm9yZGVyKSBvdXRlci5nZXRCb3JkZXIoKTsKLSAgICBib3JkZXIuc2V0V2lkdGgoaXNTZWxlY3RlZCA/IDIgOiAxKTsKLSAgICBoZWFkaW5nRmlndXJlLnNldFNlbGVjdGVkKGlzU2VsZWN0ZWQpOwotCi0gICAgWFNEU2NoZW1hQWRhcHRlciBzY2hlbWFBZGFwdGVyID0gKFhTRFNjaGVtYUFkYXB0ZXIpIGdldE1vZGVsKCk7Ci0gICAgSW1hZ2UgaW1hZ2UgPSBzY2hlbWFBZGFwdGVyLmdldEltYWdlKCk7Ci0gICAgaGVhZGluZ0ZpZ3VyZS5nZXRMYWJlbCgpLnNldEljb24oaW1hZ2UpOwotICAgIGlmIChpbWFnZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGhlYWRpbmdGaWd1cmUuZ2V0TGFiZWwoKS5zZXRJY29uKFhTRENvbW1vblVJVXRpbHMuZ2V0VXBkYXRlZEltYWdlKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgc2NoZW1hQWRhcHRlci5nZXRUYXJnZXQoKSwgaW1hZ2UsIGZhbHNlKSk7Ci0gICAgfQotICAgIG91dGVyLnJlcGFpbnQoKTsKLSAgICAKLSAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlVmFsdWUgPSAoKFhTRFNjaGVtYSkgKChYU0RTY2hlbWFBZGFwdGVyKSBnZXRNb2RlbCgpKS5nZXRUYXJnZXQoKSkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgdGFyZ2V0TmFtZXNwYWNlVmFsdWUgPSBUZXh0UHJvY2Vzc29yLnByb2Nlc3ModGFyZ2V0TmFtZXNwYWNlVmFsdWUpOwotCi0gICAgaWYgKHRhcmdldE5hbWVzcGFjZVZhbHVlID09IG51bGwgfHwgdGFyZ2V0TmFtZXNwYWNlVmFsdWUubGVuZ3RoKCkgPT0gMCkKLSAgICB7Ci0gICAgICB0YXJnZXROYW1lc3BhY2VWYWx1ZSA9IE1lc3NhZ2VzLl9VSV9HUkFQSF9YU0RTQ0hFTUFfTk9fTkFNRVNQQUNFOwotICAgIH0KLSAgICBoZWFkaW5nRmlndXJlLmdldExhYmVsKCkuc2V0VGV4dChNZXNzYWdlcy5fVUlfR1JBUEhfWFNEU0NIRU1BICsgIiA6ICIgKyB0YXJnZXROYW1lc3BhY2VWYWx1ZSk7ICAvLyROT04tTkxTLTEkCi0gIH0KLSAgCi0gIHB1YmxpYyBFZGl0UGFydCBkb0dldFJlbGF0aXZlRWRpdFBhcnQoRWRpdFBhcnQgZWRpdFBhcnQsIGludCBkaXJlY3Rpb24pCi0gIHsKLSAgICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDYXRlZ29yeUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IChDYXRlZ29yeUFkYXB0ZXIpZWRpdFBhcnQuZ2V0TW9kZWwoKTsgICAgCi0gICAgICAgIHN3aXRjaCAoYWRhcHRlci5nZXRHcm91cFR5cGUoKSkKLSAgICAgICAgeyAKLSAgICAgICAgICBjYXNlIENhdGVnb3J5QWRhcHRlci5ESVJFQ1RJVkVTOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuU09VVEgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IGdldENhdGVnb3J5RWRpdFBhcnQoQ2F0ZWdvcnlBZGFwdGVyLkVMRU1FTlRTKTsKLSAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgQ2F0ZWdvcnlBZGFwdGVyLkVMRU1FTlRTOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuU09VVEgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IGdldENhdGVnb3J5RWRpdFBhcnQoQ2F0ZWdvcnlBZGFwdGVyLkFUVFJJQlVURVMpOwotICAgICAgICAgICAgfSAgICAgICAgICAgCi0gICAgICAgICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IGdldENhdGVnb3J5RWRpdFBhcnQoQ2F0ZWdvcnlBZGFwdGVyLkRJUkVDVElWRVMpOwotICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIENhdGVnb3J5QWRhcHRlci5UWVBFUzoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBnZXRDYXRlZ29yeUVkaXRQYXJ0KENhdGVnb3J5QWRhcHRlci5HUk9VUFMpOwotICAgICAgICAgICAgfSAgICAgICAgICAgCi0gICAgICAgICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuTk9SVEgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IGdldENhdGVnb3J5RWRpdFBhcnQoQ2F0ZWdvcnlBZGFwdGVyLkRJUkVDVElWRVMpOwotICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgQ2F0ZWdvcnlBZGFwdGVyLkFUVFJJQlVURVM6ICAgICAgCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0Q2F0ZWdvcnlFZGl0UGFydChDYXRlZ29yeUFkYXB0ZXIuRUxFTUVOVFMpOwotICAgICAgICAgICAgfSAgICAKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gICAKLSAgICAgICAgICBjYXNlIENhdGVnb3J5QWRhcHRlci5HUk9VUFM6ICAgICAgCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0Q2F0ZWdvcnlFZGl0UGFydChDYXRlZ29yeUFkYXB0ZXIuVFlQRVMpOwotICAgICAgICAgICAgfSAgICAKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9IAotICAgICAgZWxzZSBpZiAoZWRpdFBhcnQgPT0gdGhpcykKLSAgICAgIHsgICAgICAgCi0gICAgICAgIGlmIChkaXJlY3Rpb24gPT0gS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeS5JTl9UT19GSVJTVF9DSElMRCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9ICgoQ2F0ZWdvcnlSb3dFZGl0UGFydClnZXRDaGlsZHJlbigpLmdldCgwKSkuZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KGVkaXRQYXJ0LCBkaXJlY3Rpb24pOyAgICAgICAgCi0gICAgICAgIH0gICAgICAgICAgCi0gICAgICB9ICAKLSAgICAgIHJldHVybiByZXN1bHQ7ICAgICAgICAgICAgICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBFZGl0UGFydCBnZXRDYXRlZ29yeUVkaXRQYXJ0KGludCBraW5kKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBqID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKSAgICAgIAotICAgIHsgICAgCi0gICAgICBFZGl0UGFydCByb3cgPSAoRWRpdFBhcnQpai5uZXh0KCk7ICAgIAotICAgICAgZm9yIChJdGVyYXRvciBpID0gcm93LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpaS5uZXh0KCk7Ci0gICAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENhdGVnb3J5RWRpdFBhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICBDYXRlZ29yeUVkaXRQYXJ0IGNhdGVnb3J5RWRpdFBhcnQgPSAoQ2F0ZWdvcnlFZGl0UGFydCllZGl0UGFydDsKLSAgICAgICAgICBDYXRlZ29yeUFkYXB0ZXIgYWRhcHRlciA9IChDYXRlZ29yeUFkYXB0ZXIpY2F0ZWdvcnlFZGl0UGFydC5nZXRNb2RlbCgpOwotICAgICAgICAgIGlmIChhZGFwdGVyLmdldEdyb3VwVHlwZSgpID09IGtpbmQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGVkaXRQYXJ0OwotICAgICAgICAgIH0KLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9ICAKLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgbmV3IFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCgpKTsgICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgSG9sZGVyCi0gIHsKLSAgICBMaXN0IGxpc3Q7Ci0KLSAgICBwdWJsaWMgSG9sZGVyKExpc3QgbGlzdCkKLSAgICB7Ci0gICAgICB0aGlzLmxpc3QgPSBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldExpc3QoKQotICAgIHsKLSAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBDYXRlZ29yeVJvd0VkaXRQYXJ0IGV4dGVuZHMgQmFzZUVkaXRQYXJ0Ci0gIHsKLSAgICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHNjaGVtYTsKLSAgICBwcm90ZWN0ZWQgRmlndXJlIGNvbnRlbnRQYW5lOwotCi0gICAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgICB7Ci0gICAgICBGaWd1cmUgY29udGFpbmVyRmlndXJlID0gbmV3IEZpZ3VyZSgpOwotICAgICAgY29udGFpbmVyRmlndXJlLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDQsIDQsIDQsIDQpKTsKLSAgICAgIC8vIGNvbnRhaW5lckZpZ3VyZS5zZXRCb3JkZXIobmV3IExpbmVCb3JkZXIoMSkpOwotICAgICAgLy8gY29udGFpbmVyRmlndXJlLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ncmVlbik7Ci0KLSAgICAgIEZpbGxMYXlvdXQgZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KDQpOwotICAgICAgZmlsbExheW91dC5zZXRIb3Jpem9udGFsKHRydWUpOwotICAgICAgY29udGFpbmVyRmlndXJlLnNldExheW91dE1hbmFnZXIoZmlsbExheW91dCk7Ci0gICAgICAKLSAgICAgIHJldHVybiBjb250YWluZXJGaWd1cmU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBFZGl0UGFydCBkb0dldFJlbGF0aXZlRWRpdFBhcnQoRWRpdFBhcnQgZWRpdFBhcnQsIGludCBkaXJlY3Rpb24pCi0gICAgewotICAgICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQ2F0ZWdvcnlFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5Lk9VVF9UT19QQVJFTlQpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gZ2V0UGFyZW50KCk7Ci0gICAgICAgIH0gIAotICAgICAgfSAgCi0gICAgICBlbHNlIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFhTRFNjaGVtYUVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBpZiAoZGlyZWN0aW9uID09IEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuSU5fVE9fRklSU1RfQ0hJTEQpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gKEVkaXRQYXJ0KWdldENoaWxkcmVuKCkuZ2V0KDApOwotICAgICAgICB9ICAKLSAgICAgIH0gIAotICAgICAgcmV0dXJuICgoWFNEU2NoZW1hRWRpdFBhcnQpZ2V0UGFyZW50KCkpLmRvR2V0UmVsYXRpdmVFZGl0UGFydChlZGl0UGFydCwgZGlyZWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCNnZXRDb250ZW50UGFuZSgpCi0gICAgICovCi0gICAgcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKQotICAgIHsKLSAgICAgIHJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICAgIHsKLSAgICAgIEhvbGRlciBob2xkZXIgPSAoSG9sZGVyKSBnZXRNb2RlbCgpOwotICAgICAgcmV0dXJuIGhvbGRlci5nZXRMaXN0KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgICB7Ci0gICAgICBzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RhYmxlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNEU2ltcGxlVHlwZUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL1hTRFNpbXBsZVR5cGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzUyYWRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvWFNEU2ltcGxlVHlwZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFuaGF0dGFuQ29ubmVjdGlvblJvdXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuTG9jYXRpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2V0SW5wdXRUb0dyYXBoVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VUeXBlQ29ubmVjdGluZ0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQ29sdW1uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5UeXBlUmVmZXJlbmNlQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLkFEVERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5BRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSVN0cnVjdHVyZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5IZWFkaW5nRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXMuUm91bmRlZExpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5TdHJ1Y3R1cmVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgWFNEU2ltcGxlVHlwZUVkaXRQYXJ0IGV4dGVuZHMgQmFzZVR5cGVDb25uZWN0aW5nRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIFN0cnVjdHVyZUZpZ3VyZSBmaWd1cmU7Ci0gIHByb3RlY3RlZCBBRFREaXJlY3RFZGl0UG9saWN5IGFkdERpcmVjdEVkaXRQb2xpY3kgPSBuZXcgQURURGlyZWN0RWRpdFBvbGljeSgpOwotICAKLSAgcHVibGljIFhTRFNpbXBsZVR5cGVFZGl0UGFydCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICBwdWJsaWMgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gZ2V0WFNEU2ltcGxlVHlwZURlZmluaXRpb24oKQotICB7Ci0gICAgcmV0dXJuIChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikoKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcilnZXRNb2RlbCgpKS5nZXRUYXJnZXQoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBmaWd1cmUgPSBuZXcgU3RydWN0dXJlRmlndXJlKCk7Ci0gICAgZmlndXJlLnNldEJvcmRlcihuZXcgUm91bmRlZExpbmVCb3JkZXIoMSwgMTApKTsgICAgCi0gICAgVG9vbGJhckxheW91dCB0b29sYmFyTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoKTsKLSAgICB0b29sYmFyTGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXModHJ1ZSk7Ci0gICAgZmlndXJlLnNldExheW91dE1hbmFnZXIodG9vbGJhckxheW91dCk7Ci0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb25BZGFwdGVyKWdldE1vZGVsKCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBhZGFwdGVyLmdldERpc3BsYXlOYW1lKCk7Ci0gICAgSGVhZGluZ0ZpZ3VyZSBoZWFkaW5nRmlndXJlID0gZmlndXJlLmdldEhlYWRpbmdGaWd1cmUoKTsKLSAgICBoZWFkaW5nRmlndXJlLnNldElzUmVhZE9ubHkoYWRhcHRlci5pc1JlYWRPbmx5KCkpOwotICAgIExhYmVsIGxhYmVsID0gaGVhZGluZ0ZpZ3VyZS5nZXRMYWJlbCgpOwotICAgIGxhYmVsLnNldFRleHQobmFtZSk7Ci0gICAgbGFiZWwuc2V0SWNvbihYU0RDb21tb25VSVV0aWxzLmdldFVwZGF0ZWRJbWFnZShhZGFwdGVyLmdldFhTRFR5cGVEZWZpbml0aW9uKCksIGFkYXB0ZXIuZ2V0SW1hZ2UoKSwgYWRhcHRlci5pc1JlYWRPbmx5KCkpKTsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBJU3RydWN0dXJlRmlndXJlIGdldFN0cnVjdHVyZUZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gKElTdHJ1Y3R1cmVGaWd1cmUpZ2V0RmlndXJlKCk7Ci0gIH0KLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0U3RydWN0dXJlRmlndXJlKCkuZ2V0Q29udGVudFBhbmUoKTsKLSAgfQotICAKLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBuZXcgQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5KCkpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwgYWR0RGlyZWN0RWRpdFBvbGljeSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpCi0gIHsKLSAgICBnZXRTdHJ1Y3R1cmVGaWd1cmUoKS5hZGRTZWxlY3Rpb25GZWVkYmFjaygpOwotICAgIHN1cGVyLmFkZEZlZWRiYWNrKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCkKLSAgewotICAgIGdldFN0cnVjdHVyZUZpZ3VyZSgpLnJlbW92ZVNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0gICAgc3VwZXIucmVtb3ZlRmVlZGJhY2soKTsgICAgCi0gIH0KLQotICBwdWJsaWMgUmVmZXJlbmNlQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uRmlndXJlKEJhc2VFZGl0UGFydCBjaGlsZCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uRmlndXJlKCkKLSAgewotICAgIFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uIGNvbm5lY3Rpb25GaWd1cmUgPSBudWxsOwotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcilnZXRNb2RlbCgpOwotICAgIElUeXBlIHN1cGVyVHlwZSA9IGFkYXB0ZXIuZ2V0U3VwZXJUeXBlKCk7Ci0KLSAgICBpZiAoc3VwZXJUeXBlICE9IG51bGwpCi0gICAgeyAgICAgIAotICAgICAgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCByZWZlcmVuY2VUeXBlUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KWdldFRhcmdldEVkaXRQYXJ0KHN1cGVyVHlwZSk7Ci0gICAgICAKLSAgICAgIGlmIChyZWZlcmVuY2VUeXBlUGFydCAhPSBudWxsKQotICAgICAgewotICAgICAgICBjb25uZWN0aW9uRmlndXJlID0gbmV3IFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uKHRydWUpOwotICAgICAgICAvLyBkcmF3IGEgbGluZSBvdXQgZnJvbSB0aGUgdG9wICAgICAgICAgCi0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0U291cmNlQW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5UT1AsIDEpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRPRE8gKGNzKSBuZWVkIHRvIGRyYXcgdGhlIHRhcmdldCBhbmNob3IgdG8gbG9vayBsaWtlIGEgVU1MIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcAotICAgICAgICAvLyBhZGRpbmcgYSBsYWJlbCB0byB0aGUgY29ubmVjdGlvbiB3b3VsZCBoZWxwIHRvCi0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0VGFyZ2V0QW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IocmVmZXJlbmNlVHlwZVBhcnQuZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5CT1RUT00sIDAsIDApKTsKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRDb25uZWN0aW9uUm91dGVyKG5ldyBNYW5oYXR0YW5Db25uZWN0aW9uUm91dGVyKCkpOwotICAgICAgICAoKENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvciljb25uZWN0aW9uRmlndXJlLmdldFNvdXJjZUFuY2hvcigpKS5zZXRPdGhlcigoQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKWNvbm5lY3Rpb25GaWd1cmUuZ2V0VGFyZ2V0QW5jaG9yKCkpOwotICAgICAgICBjb25uZWN0aW9uRmlndXJlLnNldEhpZ2hsaWdodChmYWxzZSk7Ci0KLSAgICAgIH0KLSAgICB9ICAgIAotICAgIHJldHVybiBjb25uZWN0aW9uRmlndXJlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgRWRpdFBhcnQgZ2V0VGFyZ2V0RWRpdFBhcnQoSVR5cGUgdHlwZSkKLSAgewotICAgIENvbHVtbkVkaXRQYXJ0IGNvbHVtbkVkaXRQYXJ0ID0gbnVsbDsKLSAgICBmb3IgKEVkaXRQYXJ0IGVkaXRQYXJ0ID0gdGhpczsgZWRpdFBhcnQgIT0gbnVsbDsgZWRpdFBhcnQgPSBlZGl0UGFydC5nZXRQYXJlbnQoKSkKLSAgICB7Ci0gICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBDb2x1bW5FZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgY29sdW1uRWRpdFBhcnQgPSAoQ29sdW1uRWRpdFBhcnQpZWRpdFBhcnQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAgCi0gICAgfSAgICAgCi0gICAgaWYgKGNvbHVtbkVkaXRQYXJ0ICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gY29sdW1uRWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBFZGl0UGFydCBjaGlsZCA9IChFZGl0UGFydClpLm5leHQoKTsKLSAgICAgICAgaWYgKGNoaWxkLmdldE1vZGVsKCkgPT0gdHlwZSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBjaGlsZDsKLSAgICAgICAgfSAgICAgICAgIAotICAgICAgfSAgCi0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KQotICB7ICAKLSAgICBpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfT1BFTikKLSAgICB7Ci0gICAgICBPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBMb2NhdGlvblJlcXVlc3QpCi0gICAgICB7Ci0gICAgICAgIExvY2F0aW9uUmVxdWVzdCBsb2NhdGlvblJlcXVlc3QgPSAoTG9jYXRpb25SZXF1ZXN0KXJlcXVlc3Q7Ci0gICAgICAgIFBvaW50IHAgPSBsb2NhdGlvblJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgIAotICAgICAgICBpZiAoZ2V0U3RydWN0dXJlRmlndXJlKCkuaGl0VGVzdEhlYWRlcihwKSkKLSAgICAgICAgeyAgICAgICAgICAKLSAgICAgICAgICAvLyBUT0RPOiAhISEgVGhpcyBzaG91bGQgYmUgbW92ZWQgdG8gdGhlIGFkdC14c2QgcGFja2FnZQotICAgICAgICAgIC8vIAotICAgICAgICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlcikgICAgIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWRhcHRlciltb2RlbDsKLSAgICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgICAgT2JqZWN0IHNjaGVtYSA9IGVkaXRvclBhcnQuZ2V0QWRhcHRlcihYU0RTY2hlbWEuY2xhc3MpOwotICAgICAgICAgICAgQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRFZGl0b3JBY3Rpb25SZWdpc3RyeShlZGl0b3JQYXJ0KTsKLSAgICAgICAgICAgIGlmIChyZWdpc3RyeSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoc2NoZW1hID09IHN0LmdldFNjaGVtYSgpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSUFjdGlvbiBhY3Rpb24gPSByZWdpc3RyeS5nZXRBY3Rpb24oU2V0SW5wdXRUb0dyYXBoVmlldy5JRCk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElBY3Rpb24gYWN0aW9uID0gcmVnaXN0cnkuZ2V0QWN0aW9uKE9wZW5Jbk5ld0VkaXRvci5JRCk7Ci0gICAgICAgICAgICAgICAgYWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIEFjdGlvblJlZ2lzdHJ5IGdldEVkaXRvckFjdGlvblJlZ2lzdHJ5KElFZGl0b3JQYXJ0IGVkaXRvcikKLSAgewotICAgIHJldHVybiAoQWN0aW9uUmVnaXN0cnkpIGVkaXRvci5nZXRBZGFwdGVyKEFjdGlvblJlZ2lzdHJ5LmNsYXNzKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHNob3VsZERyYXdDb25uZWN0aW9uKCkKLSAgewotICAgIGlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgSVR5cGUpCi0gICAgewotICAgICAgaWYgKCgoSVR5cGUpZ2V0TW9kZWwoKSkuZ2V0U3VwZXJUeXBlKCkgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvU3BhY2VGaWxsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvU3BhY2VGaWxsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU4NDdlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL1NwYWNlRmlsbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQ29tcGxleFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLS8qKgotICogRHVtbXkgY2xhc3MgdG8gYWRkIHNwYWNlIHRvIGZpZWxkIGxpc3QKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTcGFjZUZpbGxlciBpbXBsZW1lbnRzIElGaWVsZAotewotICBTdHJpbmcga2luZDsKLSAgcHVibGljIFNwYWNlRmlsbGVyKFN0cmluZyBraW5kKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLmtpbmQgPSBraW5kOwotICB9Ci0KLSAgcHVibGljIEltYWdlIGdldEltYWdlKCkKLSAgewotICAgIGlmIChraW5kLmVxdWFscygiYXR0cmlidXRlIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RBdHRyaWJ1dGUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREVsZW1lbnQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0S2luZCgpCi0gIHsKLSAgICByZXR1cm4ga2luZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0S2luZChTdHJpbmcga2luZCkKLSAgewotICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBJQ29tcGxleFR5cGUgZ2V0Q29udGFpbmVyVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWVRdWFsaWZpZXIoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIElUeXBlIGdldFR5cGUoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRNaW5PY2N1cnMoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRNYXhPY2N1cnMoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlTWluT2NjdXJzQ29tbWFuZChpbnQgbWluT2NjdXJzKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlTWF4T2NjdXJzQ29tbWFuZChpbnQgbWF4T2NjdXJzKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlVHlwZU5hbWVDb21tYW5kKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIHF1YWlsaWZpZXIpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQ29tbWFuZCBnZXRVcGRhdGVOYW1lQ29tbWFuZChTdHJpbmcgbmFtZSkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyTGlzdGVuZXIoSUFEVE9iamVjdExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIAotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIElNb2RlbCBnZXRNb2RlbCgpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW5jZSgpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9UYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZWFlNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9UYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0TGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBUYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXIgaW1wbGVtZW50cyBJQURUT2JqZWN0Ci17Ci0gIHByaXZhdGUgWFNEQmFzZUFkYXB0ZXIgYWRhcHRlcjsKLSAgCi0gIHB1YmxpYyBUYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXIoWFNEQmFzZUFkYXB0ZXIgYWRhcHRlcikKLSAgewotICAgIHRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0gIH0KLQotICBwdWJsaWMgWFNEQmFzZUFkYXB0ZXIgZ2V0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gYWRhcHRlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoSUFEVE9iamVjdExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyTGlzdGVuZXIoSUFEVE9iamVjdExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwb2xpY2llcy9EcmFnQW5kRHJvcEVkaXRQb2xpY3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cG9saWNpZXMvRHJhZ0FuZERyb3BFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MmUzZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwb2xpY2llcy9EcmFnQW5kRHJvcEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUF0dHJpYnV0ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHMuQmFzZURyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzLlhTREF0dHJpYnV0ZURyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzLlhTREVsZW1lbnREcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBhcnRzLlhTREJhc2VGaWVsZEVkaXRQYXJ0OwotCi0KLXB1YmxpYyBjbGFzcyBEcmFnQW5kRHJvcEVkaXRQb2xpY3kgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkdyYXBoaWNhbEVkaXRQb2xpY3kKLXsgCi0gIHByb3RlY3RlZCBFZGl0UGFydFZpZXdlciB2aWV3ZXI7Ci0gIHByb3RlY3RlZCBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3k7Ci0KLSAgcHVibGljIERyYWdBbmREcm9wRWRpdFBvbGljeShFZGl0UGFydFZpZXdlciB2aWV3ZXIsIFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSkKLSAgewotICAgIHRoaXMudmlld2VyID0gdmlld2VyOwotICAgIHRoaXMuc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kgPSBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcSkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgCi0gIHB1YmxpYyBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkKLSAgeyAgICAgICAgICAgICAKLSAgICBCYXNlRHJhZ0FuZERyb3BDb21tYW5kIGNvbW1hbmQgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENoYW5nZUJvdW5kc1JlcXVlc3QpCi0gICAgewotICAgICAgQ2hhbmdlQm91bmRzUmVxdWVzdCBjaGFuZ2VCb3VuZHNSZXF1ZXN0ID0gKENoYW5nZUJvdW5kc1JlcXVlc3QpcmVxdWVzdDsKLSAgICAgIFBvaW50IGxvY2F0aW9uID0gY2hhbmdlQm91bmRzUmVxdWVzdC5nZXRMb2NhdGlvbigpOwotICAgICAgCi0gICAgICBHcmFwaGljYWxFZGl0UGFydCB0YXJnZXQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpdmlld2VyLmZpbmRPYmplY3RBdChsb2NhdGlvbik7Ci0gICAgICBsb2NhdGlvbiA9IGdldFBvaW50ZXJMb2NhdGlvbihjaGFuZ2VCb3VuZHNSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotICAgICAgKChHcmFwaGljYWxFZGl0UGFydCl2aWV3ZXIuZ2V0Um9vdEVkaXRQYXJ0KCkpLmdldEZpZ3VyZSgpLnRyYW5zbGF0ZVRvUmVsYXRpdmUobG9jYXRpb24pOwotCi0gICAgICBMaXN0IGxpc3QgPSBjaGFuZ2VCb3VuZHNSZXF1ZXN0LmdldEVkaXRQYXJ0cygpOwotICAgICAgLy8gYWxsb3cgZHJhZyBhbmQgZHJvcCBvZiBvbmx5IG9uZSBzZWxlY3RlZCBvYmplY3QKLSAgICAgIGlmIChsaXN0LnNpemUoKSA9PSAxKQotICAgICAgewotICAgICAgICBPYmplY3QgaXRlbVRvRHJhZyA9IGxpc3QuZ2V0KDApOwotICAgICAgICBpZiAoaXRlbVRvRHJhZyBpbnN0YW5jZW9mIFhTREJhc2VGaWVsZEVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQmFzZUZpZWxkRWRpdFBhcnQgc2VsZWN0ZWQgPSAoWFNEQmFzZUZpZWxkRWRpdFBhcnQpIGl0ZW1Ub0RyYWc7Ci0gICAgICAgICAgaWYgKHNlbGVjdGVkLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbW1hbmQgPSBuZXcgWFNERWxlbWVudERyYWdBbmREcm9wQ29tbWFuZCh2aWV3ZXIsIChDaGFuZ2VCb3VuZHNSZXF1ZXN0KXJlcXVlc3QsIHRhcmdldCwgc2VsZWN0ZWQsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5LnNldERyYWdBbmREcm9wQ29tbWFuZChjb21tYW5kKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoc2VsZWN0ZWQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFhTREJhc2VBdHRyaWJ1dGVBZGFwdGVyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbW1hbmQgPSBuZXcgWFNEQXR0cmlidXRlRHJhZ0FuZERyb3BDb21tYW5kKHZpZXdlciwgKENoYW5nZUJvdW5kc1JlcXVlc3QpcmVxdWVzdCwgdGFyZ2V0LCBzZWxlY3RlZCwgbG9jYXRpb24pOwotICAgICAgICAgICAgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kuc2V0RHJhZ0FuZERyb3BDb21tYW5kKGNvbW1hbmQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gCi0gICAgcmV0dXJuIGNvbW1hbmQ7ICAgICAgICAgICAgIAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAKLSAgcHJvdGVjdGVkIFBvaW50IGdldFBvaW50ZXJMb2NhdGlvbihQb2ludCBvcmlnUG9pbnRlckxvY2F0aW9uKQotICB7Ci0gICAgIFBvaW50IGNvbXBlbnNhdGVkTG9jYXRpb24gPSBvcmlnUG9pbnRlckxvY2F0aW9uOwotICAgICBGaWd1cmVDYW52YXMgZmlndXJlQ2FudmFzID0gKEZpZ3VyZUNhbnZhcykgdmlld2VyLmdldENvbnRyb2woKTsKLSAgICAgaW50IHlPZmZzZXQgPSBmaWd1cmVDYW52YXMuZ2V0Vmlld3BvcnQoKS5nZXRWZXJ0aWNhbFJhbmdlTW9kZWwoKS5nZXRWYWx1ZSgpOwotICAgICBpbnQgeE9mZnNldCA9IGZpZ3VyZUNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldEhvcml6b250YWxSYW5nZU1vZGVsKCkuZ2V0VmFsdWUoKTsKLSAgICAgY29tcGVuc2F0ZWRMb2NhdGlvbi55ID0gY29tcGVuc2F0ZWRMb2NhdGlvbi55ICsgeU9mZnNldDsKLSAgICAgY29tcGVuc2F0ZWRMb2NhdGlvbi54ID0gY29tcGVuc2F0ZWRMb2NhdGlvbi54ICsgeE9mZnNldDsKLSAgICAgcmV0dXJuIGNvbXBlbnNhdGVkTG9jYXRpb247Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cG9saWNpZXMvR3JhcGhOb2RlRHJhZ1RyYWNrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cG9saWNpZXMvR3JhcGhOb2RlRHJhZ1RyYWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E4YjMxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL0dyYXBoTm9kZURyYWdUcmFja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwb2xpY2llczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRyYWdFZGl0UGFydHNUcmFja2VyOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotcHVibGljIGNsYXNzIEdyYXBoTm9kZURyYWdUcmFja2VyIGV4dGVuZHMgRHJhZ0VkaXRQYXJ0c1RyYWNrZXIgCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgRWRpdFBhcnQgZWRpdFBhcnQ7IAotICAgICAgICAgICAKLSAgcHVibGljIEdyYXBoTm9kZURyYWdUcmFja2VyKEVkaXRQYXJ0IGVkaXRQYXJ0KQotICB7Ci0gICAgc3VwZXIoZWRpdFBhcnQpOwotICAgIHRoaXMuZWRpdFBhcnQgPSBlZGl0UGFydDsKLSAgfSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29tbWFuZCgpIAotICB7IAotCVJlcXVlc3QgcmVxdWVzdCA9IGdldFRhcmdldFJlcXVlc3QoKTsKLSAgICByZXR1cm4gZWRpdFBhcnQuZ2V0Q29tbWFuZChyZXF1ZXN0KTsgCi0gIH0KLX0gCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL1NlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwb2xpY2llcy9TZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdmMGIzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL1NlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBvbGljaWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLkFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1hbmRzLkJhc2VEcmFnQW5kRHJvcENvbW1hbmQ7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwJZXh0ZW5kcyBBRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3kKLXsKLSAgcHJvdGVjdGVkIElGaWd1cmUgZmVlZGJhY2s7Ci0gIHByb3RlY3RlZCBSZWN0YW5nbGUgb3JpZ2luYWxMb2NhdGlvbjsKLSAgcHJvdGVjdGVkIEJhc2VEcmFnQW5kRHJvcENvbW1hbmQgZHJhZ0FuZERyb3BDb21tYW5kOwotICBwcm90ZWN0ZWQgUG9seWxpbmUgcG9seUxpbmU7Ci0gIHByb3RlY3RlZCBSZWN0YW5nbGVGaWd1cmUgZ2hvc3RTaGFwZTsKLQotICBwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KQotICB7ICAgIAotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLSAgICBpZiAoUkVRX01PVkUuZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSkKLSAgICB7ICAKLSAgICAgIHJlc3VsdCA9IGZhbHNlOyAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHN1cGVyLnVuZGVyc3RhbmRzUmVxdWVzdChyZXF1ZXN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLQotICBwdWJsaWMgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIG51bGw7ICAKLSAgfSAgIAotCi0gIHB1YmxpYyB2b2lkIHNldERyYWdBbmREcm9wQ29tbWFuZChCYXNlRHJhZ0FuZERyb3BDb21tYW5kIGRyYWdBbmREcm9wQ29tbWFuZCkKLSAgewotICAgIHRoaXMuZHJhZ0FuZERyb3BDb21tYW5kID0gZHJhZ0FuZERyb3BDb21tYW5kOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2hvd1NvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkKLSAgeyAgIAotICAgICAgZXJhc2VDaGFuZ2VCb3VuZHNGZWVkYmFjayhudWxsKTsKLSAgICAgIGlmIChkcmFnQW5kRHJvcENvbW1hbmQgIT0gbnVsbCAmJiBkcmFnQW5kRHJvcENvbW1hbmQuY2FuRXhlY3V0ZSgpKSB7Ci0gICAgICAgIGlmIChSRVFfTU9WRS5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpIHx8IFJFUV9BREQuZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSkgewotICAgICAgICAgIGlmIChkcmFnQW5kRHJvcENvbW1hbmQgIT0gbnVsbCAmJiBkcmFnQW5kRHJvcENvbW1hbmQuZ2V0RmVlZGJhY2tGaWd1cmUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmZWVkYmFjayA9IGRyYWdBbmREcm9wQ29tbWFuZC5nZXRGZWVkYmFja0ZpZ3VyZSgpOwotICAgICAgICAgICAgYWRkRmVlZGJhY2soZmVlZGJhY2spOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gIHsKLQkgIGlmIChmZWVkYmFjayAhPSBudWxsKQotICAgIHsKLQkJICByZW1vdmVGZWVkYmFjayhmZWVkYmFjayk7Ci0JCSAgZmVlZGJhY2sgPSBudWxsOwotCSAgfQotCSAgaGlkZUZvY3VzKCk7Ci0JICBzdXBlci5kZWFjdGl2YXRlKCk7Ci0gIH0KLQotICAvKioKLSAgICogRXJhc2UgZmVlZGJhY2sgaW5kaWNhdGluZyB0aGF0IHRoZSByZWNlaXZlciBvYmplY3QgaXMgCi0gICAqIGJlaW5nIGRyYWdnZWQuICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIGRyYWcgaXMKLSAgICogY29tcGxldGVkIG9yIGNhbmNlbGxlZCBvbiB0aGUgcmVjZWl2ZXIgb2JqZWN0LgotICAgKiBAcGFyYW0gZHJhZ1RyYWNrZXIgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRyYWdUcmFja2VyIFRoZSBkcmFnIHRyYWNrZXIgb2YgdGhlIHRvb2wgcGVyZm9ybWluZyB0aGUgZHJhZy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGVyYXNlQ2hhbmdlQm91bmRzRmVlZGJhY2soQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KSAKLSAgewotCSAgaWYgKGZlZWRiYWNrICE9IG51bGwpIAotICAgIHsJCSAgICAgIAotCQkgIHJlbW92ZUZlZWRiYWNrKGZlZWRiYWNrKTsKLQkgIH0KLQkgIGZlZWRiYWNrID0gbnVsbDsKLQkgIG9yaWdpbmFsTG9jYXRpb24gPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEVyYXNlIGZlZWRiYWNrIGluZGljYXRpbmcgdGhhdCB0aGUgcmVjZWl2ZXIgb2JqZWN0IGlzIAotICAgKiBiZWluZyBkcmFnZ2VkLiAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSBkcmFnIGlzCi0gICAqIGNvbXBsZXRlZCBvciBjYW5jZWxsZWQgb24gdGhlIHJlY2VpdmVyIG9iamVjdC4KLSAgICogQHBhcmFtIGRyYWdUcmFja2VyIG9yZy5lY2xpcHNlLmdlZi50b29scy5EcmFnVHJhY2tlciBUaGUgZHJhZyB0cmFja2VyIG9mIHRoZSB0b29sIHBlcmZvcm1pbmcgdGhlIGRyYWcuCi0gICAqLwotICBwdWJsaWMgdm9pZCBlcmFzZVNvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgCi0gIHsKLSAgICBpZiAoUkVRX01PVkUuZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSB8fCAgUkVRX0FERC5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpKQotICAgIHsKLQkJICBlcmFzZUNoYW5nZUJvdW5kc0ZlZWRiYWNrKChDaGFuZ2VCb3VuZHNSZXF1ZXN0KXJlcXVlc3QpOwotICAgIH0KLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cG9saWNpZXMvVG9wTGV2ZWxDb21wb25lbnRMYWJlbENlbGxFZGl0b3JMb2NhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL1RvcExldmVsQ29tcG9uZW50TGFiZWxDZWxsRWRpdG9yTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTk0YTUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9lZGl0cG9saWNpZXMvVG9wTGV2ZWxDb21wb25lbnRMYWJlbENlbGxFZGl0b3JMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdC5MYWJlbENlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuSU5hbWVkRWRpdFBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBUb3BMZXZlbENvbXBvbmVudExhYmVsQ2VsbEVkaXRvckxvY2F0b3IgZXh0ZW5kcyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yCi17Ci0gIHB1YmxpYyBUb3BMZXZlbENvbXBvbmVudExhYmVsQ2VsbEVkaXRvckxvY2F0b3IoSU5hbWVkRWRpdFBhcnQgbmFtZWRFZGl0UGFydCwgUG9pbnQgY3Vyc29yTG9jYXRpb24pCi0gIHsKLSAgICBzdXBlcihuYW1lZEVkaXRQYXJ0LCBjdXJzb3JMb2NhdGlvbik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWxvY2F0ZShDZWxsRWRpdG9yIGNlbGxlZGl0b3IpCi0gIHsKLSAgICBUZXh0IHRleHQgPSAoVGV4dCkgY2VsbGVkaXRvci5nZXRDb250cm9sKCk7Ci0KLSAgICBMYWJlbCBsYWJlbCA9IG5hbWVkRWRpdFBhcnQuZ2V0TmFtZUxhYmVsRmlndXJlKCk7Ci0gICAgCi0gICAgaWYgKHRleHQuZ2V0Qm91bmRzKCkueCA8PSAwKQotICAgIHsKLSAgICAgIHN1cGVyLnJlbG9jYXRlKGNlbGxlZGl0b3IpOyAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQgc2VsID0gdGV4dC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludCBwcmVmID0gdGV4dC5jb21wdXRlU2l6ZSgtMSwgLTEpOwotICAgICAgUmVjdGFuZ2xlIHJlY3QgPSBsYWJlbC5nZXRUZXh0Qm91bmRzKCkuZ2V0Q29weSgpOwotICAgICAgbGFiZWwudHJhbnNsYXRlVG9BYnNvbHV0ZShyZWN0KTsKLSAgICAgIHRleHQuc2V0Qm91bmRzKHJlY3QueCwgcmVjdC55LTEsIHJlY3Qud2lkdGgsIHByZWYueSsxKTsKLSAgICAgIHRleHQuc2V0U2VsZWN0aW9uKDApOwotICAgICAgdGV4dC5zZXRTZWxlY3Rpb24oc2VsKTsgCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL1RvcExldmVsTmFtZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZWRpdHBvbGljaWVzL1RvcExldmVsTmFtZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YjIxYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2VkaXRwb2xpY2llcy9Ub3BMZXZlbE5hbWVEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5DZWxsRWRpdG9yQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLklOYW1lZEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5Ub3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIFRvcExldmVsTmFtZURpcmVjdEVkaXRNYW5hZ2VyIGV4dGVuZHMgRGlyZWN0RWRpdE1hbmFnZXIKLXsKLSAgcHJvdGVjdGVkIFhTRE5hbWVkQ29tcG9uZW50IGNvbXBvbmVudDsKLSAgcHJpdmF0ZSBJQWN0aW9uQmFycyBhY3Rpb25CYXJzOwotICBwcml2YXRlIENlbGxFZGl0b3JBY3Rpb25IYW5kbGVyIGFjdGlvbkhhbmRsZXI7Ci0gIHByaXZhdGUgSUFjdGlvbiBjb3B5LCBjdXQsIHBhc3RlLCB1bmRvLCByZWRvLCBmaW5kLCBzZWxlY3RBbGwsIGRlbGV0ZTsKLSAgcHJpdmF0ZSBGb250IHNjYWxlZEZvbnQ7Ci0KLSAgcHVibGljIFRvcExldmVsTmFtZURpcmVjdEVkaXRNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwgQ2VsbEVkaXRvckxvY2F0b3IgbG9jYXRvciwgWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgc3VwZXIoc291cmNlLCBudWxsLCBsb2NhdG9yKTsKLSAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNicmluZ0Rvd24oKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKCkKLSAgewotICAgIGlmIChhY3Rpb25IYW5kbGVyICE9IG51bGwpCi0gICAgewotICAgICAgYWN0aW9uSGFuZGxlci5kaXNwb3NlKCk7Ci0gICAgICBhY3Rpb25IYW5kbGVyID0gbnVsbDsKLSAgICB9Ci0gICAgaWYgKGFjdGlvbkJhcnMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN0b3JlU2F2ZWRBY3Rpb25zKGFjdGlvbkJhcnMpOwotICAgICAgYWN0aW9uQmFycy51cGRhdGVBY3Rpb25CYXJzKCk7Ci0gICAgICBhY3Rpb25CYXJzID0gbnVsbDsKLSAgICB9Ci0KLSAgICBGb250IGRpc3Bvc2VGb250ID0gc2NhbGVkRm9udDsKLSAgICBzY2FsZWRGb250ID0gbnVsbDsKLSAgICBzdXBlci5icmluZ0Rvd24oKTsKLSAgICBpZiAoZGlzcG9zZUZvbnQgIT0gbnVsbCkKLSAgICAgIGRpc3Bvc2VGb250LmRpc3Bvc2UoKTsKLQotICAgIGlmIChnZXRFZGl0UGFydCgpIGluc3RhbmNlb2YgVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydCkKLSAgICB7Ci0gICAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgIHsKLSAgICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICBPYmplY3QgYWRhcHRlciA9IGVkaXRvci5nZXRBZGFwdGVyKElTZWxlY3Rpb25Qcm92aWRlci5jbGFzcyk7Ci0gICAgICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU2VsZWN0aW9uUHJvdmlkZXIpCi0gICAgICAgICAgewotICAgICAgICAgICAgSVNlbGVjdGlvblByb3ZpZGVyIHNlbCA9IChJU2VsZWN0aW9uUHJvdmlkZXIpIGFkYXB0ZXI7Ci0gICAgICAgICAgICBzZWwuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKSkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfTsKLSAgICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2hvd0ZlZWRiYWNrKCkKLSAgewotICAgIHN1cGVyLnNob3dGZWVkYmFjaygpOwotICB9Ci0KLSAgcHJvdGVjdGVkIENlbGxFZGl0b3IgY3JlYXRlQ2VsbEVkaXRvck9uKENvbXBvc2l0ZSBjb21wb3NpdGUpCi0gIHsKLSAgICByZXR1cm4gbmV3IFRleHRDZWxsRWRpdG9yKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5XUkFQKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXRDZWxsRWRpdG9yKCkKLSAgewotICAgIFRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotICAgIExhYmVsIGxhYmVsID0gKChJTmFtZWRFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkuZ2V0TmFtZUxhYmVsRmlndXJlKCk7Ci0KLSAgICBpZiAobGFiZWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzY2FsZWRGb250ID0gbGFiZWwuZ2V0Rm9udCgpOwotCi0gICAgICBDb2xvciBjb2xvciA9IGxhYmVsLmdldEJhY2tncm91bmRDb2xvcigpOwotICAgICAgdGV4dC5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQotICAgICAgU3RyaW5nIGluaXRpYWxMYWJlbFRleHQgPSBjb21wb25lbnQuZ2V0TmFtZSgpOwotICAgICAgZ2V0Q2VsbEVkaXRvcigpLnNldFZhbHVlKGluaXRpYWxMYWJlbFRleHQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2NhbGVkRm9udCA9IGxhYmVsLmdldFBhcmVudCgpLmdldEZvbnQoKTsKLSAgICAgIHRleHQuc2V0QmFja2dyb3VuZChsYWJlbC5nZXRQYXJlbnQoKS5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0gICAgfQotCi0gICAgRm9udERhdGEgZGF0YSA9IHNjYWxlZEZvbnQuZ2V0Rm9udERhdGEoKVswXTsKLSAgICBEaW1lbnNpb24gZm9udFNpemUgPSBuZXcgRGltZW5zaW9uKDAsIGRhdGEuZ2V0SGVpZ2h0KCkpOwotICAgIGxhYmVsLmdldFBhcmVudCgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUoZm9udFNpemUpOwotICAgIGRhdGEuc2V0SGVpZ2h0KGZvbnRTaXplLmhlaWdodCk7Ci0gICAgc2NhbGVkRm9udCA9IG5ldyBGb250KG51bGwsIGRhdGEpOwotCi0gICAgdGV4dC5zZXRGb250KHNjYWxlZEZvbnQpOwotICAgIC8vIHRleHQuc2VsZWN0QWxsKCk7Ci0KLSAgICAvLyBIb29rIHRoZSBjZWxsIGVkaXRvcidzIGNvcHkvcGFzdGUgYWN0aW9ucyB0byB0aGUgYWN0aW9uQmFycyBzbyB0aGF0IHRoZXkKLSAgICAvLyBjYW4KLSAgICAvLyBiZSBpbnZva2VkIHZpYSBrZXlib2FyZCBzaG9ydGN1dHMuCi0gICAgYWN0aW9uQmFycyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0gICAgc2F2ZUN1cnJlbnRBY3Rpb25zKGFjdGlvbkJhcnMpOwotICAgIGFjdGlvbkhhbmRsZXIgPSBuZXcgQ2VsbEVkaXRvckFjdGlvbkhhbmRsZXIoYWN0aW9uQmFycyk7Ci0gICAgYWN0aW9uSGFuZGxlci5hZGRDZWxsRWRpdG9yKGdldENlbGxFZGl0b3IoKSk7Ci0gICAgYWN0aW9uQmFycy51cGRhdGVBY3Rpb25CYXJzKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVzdG9yZVNhdmVkQWN0aW9ucyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKQotICB7Ci0gICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpLCBjb3B5KTsKLSAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpLCBwYXN0ZSk7Ci0gICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksIGRlbGV0ZSk7Ci0gICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpLCBzZWxlY3RBbGwpOwotICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpLCBjdXQpOwotICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkZJTkQuZ2V0SWQoKSwgZmluZCk7Ci0gICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLCB1bmRvKTsKLSAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5SRURPLmdldElkKCksIHJlZG8pOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNhdmVDdXJyZW50QWN0aW9ucyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKQotICB7Ci0gICAgY29weSA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSk7Ci0gICAgcGFzdGUgPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpKTsKLSAgICBkZWxldGUgPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSk7Ci0gICAgc2VsZWN0QWxsID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpKTsKLSAgICBjdXQgPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSk7Ci0gICAgZmluZCA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkZJTkQuZ2V0SWQoKSk7Ci0gICAgdW5kbyA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlVORE8uZ2V0SWQoKSk7Ci0gICAgcmVkbyA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSk7Ci0gIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL0NhdGVnb3J5RmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9DYXRlZ29yeUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDEyNTM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL0NhdGVnb3J5RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNjcm9sbFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlZpZXdwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5WaWV3cG9ydExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC50eXBldml6LmRlc2lnbi5maWd1cmVzLkhlYWRpbmdGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQudHlwZXZpei5kZXNpZ24uZmlndXJlcy5Sb3VuZGVkTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5sYXlvdXRzLkZpbGxMYXlvdXQ7Ci0KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeUZpZ3VyZSBleHRlbmRzIEZpZ3VyZQotewotICBwcm90ZWN0ZWQgU2Nyb2xsUGFuZSBzY3JvbGxwYW5lOwotICBwcm90ZWN0ZWQgRmlndXJlIG91dGVyUGFuZTsKLSAgcHVibGljIEhlYWRpbmdGaWd1cmUgaGVhZGluZ0ZpZ3VyZTsKLSAgRmlndXJlIGNvbnRlbnRQYW5lOwotCi0gIHB1YmxpYyBDYXRlZ29yeUZpZ3VyZShpbnQgdHlwZSkKLSAgewotICAgIHN1cGVyKCk7Ci0KLSAgICBvdXRlclBhbmUgPSBuZXcgRmlndXJlKCk7Ci0gICAgb3V0ZXJQYW5lLnNldEJvcmRlcihuZXcgUm91bmRlZExpbmVCb3JkZXIoMSwgNikpOwotCi0gICAgVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dChmYWxzZSk7Ci0gICAgbGF5b3V0LnNldFZlcnRpY2FsKHRydWUpOwotICAgIGxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIEZpbGxMYXlvdXQgZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KDMpOwotICAgIGZpbGxMYXlvdXQuc2V0SG9yaXpvbnRhbChmYWxzZSk7Ci0KLSAgICBGaWxsTGF5b3V0IG91dGVyTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoKTsKLSAgICBvdXRlclBhbmUuc2V0TGF5b3V0TWFuYWdlcihvdXRlckxheW91dCk7Ci0KLSAgICBhZGQob3V0ZXJQYW5lKTsKLQotICAgIGhlYWRpbmdGaWd1cmUgPSBuZXcgSGVhZGluZ0ZpZ3VyZSgpOwotICAgIG91dGVyUGFuZS5hZGQoaGVhZGluZ0ZpZ3VyZSk7Ci0KLSAgICBGaWd1cmUgbGluZSA9IG5ldyBGaWd1cmUoKTsKLSAgICBsaW5lLnNldEJvcmRlcihuZXcgTGluZUJvcmRlcigxKSk7Ci0gICAgVG9vbGJhckxheW91dCBsaW5lTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoZmFsc2UpOwotICAgIGxpbmVMYXlvdXQuc2V0VmVydGljYWwodHJ1ZSk7Ci0gICAgbGluZUxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIGxpbmUuc2V0TGF5b3V0TWFuYWdlcihsaW5lTGF5b3V0KTsKLSAgICBvdXRlclBhbmUuYWRkKGxpbmUpOwotCi0gICAgc2Nyb2xscGFuZSA9IG5ldyBTY3JvbGxQYW5lKCk7Ci0gICAgc2Nyb2xscGFuZS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotICAgIHNjcm9sbHBhbmUuc2V0VmVydGljYWxTY3JvbGxCYXJWaXNpYmlsaXR5KFNjcm9sbFBhbmUuQVVUT01BVElDKTsKLSAgICBvdXRlclBhbmUuYWRkKHNjcm9sbHBhbmUpOwotCi0gICAgRmlndXJlIHBhbmUgPSBuZXcgRmlndXJlKCk7Ci0gICAgcGFuZS5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcig1LCA4LCA1LCA4KSk7Ci0gICAgVG9vbGJhckxheW91dCB0b29sYmFyTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoZmFsc2UpOwotICAgIHRvb2xiYXJMYXlvdXQuc2V0U3BhY2luZygzKTsKLSAgICBwYW5lLnNldExheW91dE1hbmFnZXIodG9vbGJhckxheW91dCk7IC8vIGdvb2QKLQotICAgIFZpZXdwb3J0IHZpZXdwb3J0ID0gbmV3IFZpZXdwb3J0KCk7Ci0gICAgdmlld3BvcnQuc2V0Q29udGVudHNUcmFja3NIZWlnaHQodHJ1ZSk7Ci0gICAgVmlld3BvcnRMYXlvdXQgdmlld3BvcnRMYXlvdXQgPSBuZXcgVmlld3BvcnRMYXlvdXQoKTsKLSAgICB2aWV3cG9ydC5zZXRMYXlvdXRNYW5hZ2VyKHZpZXdwb3J0TGF5b3V0KTsKLQotICAgIHNjcm9sbHBhbmUuc2V0Vmlld3BvcnQodmlld3BvcnQpOwotICAgIHNjcm9sbHBhbmUuc2V0Q29udGVudHMocGFuZSk7Ci0gIH0KLQotICBwdWJsaWMgSGVhZGluZ0ZpZ3VyZSBnZXRIZWFkaW5nRmlndXJlKCkKLSAgewotICAgIHJldHVybiBoZWFkaW5nRmlndXJlOwotICB9Ci0KLSAgcHVibGljIFNjcm9sbFBhbmUgZ2V0U2Nyb2xsUGFuZSgpCi0gIHsKLSAgICByZXR1cm4gc2Nyb2xscGFuZTsKLSAgfQotCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiBzY3JvbGxwYW5lLmdldENvbnRlbnRzKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvQ2VudGVyZWRJY29uRmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9DZW50ZXJlZEljb25GaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE3NzI4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9DZW50ZXJlZEljb25GaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlczsKLSAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Sb3VuZGVkUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5SZWZlcmVuY2VDb25uZWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgQ2VudGVyZWRJY29uRmlndXJlIGV4dGVuZHMgUm91bmRlZFJlY3RhbmdsZQoteyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9STUFMID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNURUQgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIT1ZFUiA9IDI7Ci0gIHB1YmxpYyBJbWFnZSBpbWFnZTsKLSAgcHJvdGVjdGVkIExhYmVsIHRvb2xUaXBMYWJlbDsKLSAgcHJvdGVjdGVkIGludCBtb2RlID0gMDsKLSAgCi0gIHB1YmxpYyBDZW50ZXJlZEljb25GaWd1cmUoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBzZXRGaWxsKHRydWUpOyAgIAotICAgIHRvb2xUaXBMYWJlbCA9IG5ldyBMYWJlbCgpOwotICAgIHNldENvcm5lckRpbWVuc2lvbnMobmV3IERpbWVuc2lvbig1LDUpKTsKLSAgfQotICAKLSAgcHVibGljIENlbnRlcmVkSWNvbkZpZ3VyZShJbWFnZSBpbWcpCi0gIHsKLSAgICB0aGlzKCk7Ci0gICAgdGhpcy5pbWFnZSA9IGltZzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICByZXBhaW50KCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIG91dGxpbmVTaGFwZShHcmFwaGljcyBncmFwaGljcykKLSAgewotICAgIGdyYXBoaWNzLnB1c2hTdGF0ZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGlmIChtb2RlID09IE5PUk1BTCkKLSAgICAgIHsgLy8gVE9ETzogY29tbW9uIHVwIGFuZCBvcmdhbml6ZSBjb2xvcnMuLi4uCi0gICAgICAgIGdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihSZWZlcmVuY2VDb25uZWN0aW9uLmluYWN0aXZlQ29ubmVjdGlvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChtb2RlID09IFNFTEVDVEVEKQotICAgICAgewotICAgICAgICBib29sZWFuIGhpZ2hDb250cmFzdCA9IGZhbHNlOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGhpZ2hDb250cmFzdCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEhpZ2hDb250cmFzdCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGlmIChoaWdoQ29udHJhc3QpCi0gICAgICAgIHsKLSAgICAgICAgICBncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9GT1JFR1JPVU5EKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgc3VwZXIub3V0bGluZVNoYXBlKGdyYXBoaWNzKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGdyYXBoaWNzLnBvcFN0YXRlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZmlsbFNoYXBlKEdyYXBoaWNzIGcpCi0gIHsgICAgCi0gICAgc3VwZXIuZmlsbFNoYXBlKGcpOwotICAgIGlmIChpbWFnZSAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBSZWN0YW5nbGUgciA9IGdldEJvdW5kcygpOwotICAgICAgRGltZW5zaW9uIGltYWdlU2l6ZSA9IG5ldyBEaW1lbnNpb24oMTUsIDE1KTsKLSAgICAgIGcuZHJhd0ltYWdlKGltYWdlLCByLnggKyAoci53aWR0aCAtIGltYWdlU2l6ZS53aWR0aCkvMiwgci55ICsgKHIuaGVpZ2h0IC0gaW1hZ2VTaXplLmhlaWdodCkvMiAtIDEpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBMYWJlbCBnZXRUb29sVGlwTGFiZWwoKQotICB7Ci0gICAgcmV0dXJuIHRvb2xUaXBMYWJlbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TW9kZShpbnQgbW9kZSkKLSAgewotICAgIHRoaXMubW9kZSA9IG1vZGU7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VG9vbFRpcFRleHQoU3RyaW5nIHRleHQpCi0gIHsKLSAgICBpZiAodGV4dC5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgc2V0VG9vbFRpcCh0b29sVGlwTGFiZWwpOwotICAgICAgdG9vbFRpcExhYmVsLnNldFRleHQodGV4dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRUb29sVGlwKG51bGwpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvR2VuZXJpY0dyb3VwRmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9HZW5lcmljR3JvdXBGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAxMTdjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9HZW5lcmljR3JvdXBGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24ubGF5b3V0cy5Nb2RlbEdyb3VwTGF5b3V0OwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0dyb3VwRmlndXJlIGV4dGVuZHMgRmlndXJlCi17Ci0gIHByb3RlY3RlZCBDZW50ZXJlZEljb25GaWd1cmUgY2VudGVyZWRJY29uRmlndXJlOwotICBwcm90ZWN0ZWQgRmlndXJlIGNvbnRlbnRGaWd1cmU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdGV4dDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzVGV4dCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgTGFiZWwgdGV4dEZpZ3VyZTsKLSAgCi0gIHB1YmxpYyBHZW5lcmljR3JvdXBGaWd1cmUoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBzZXRMYXlvdXRNYW5hZ2VyKG5ldyBNb2RlbEdyb3VwTGF5b3V0KHRydWUpKTsKLSAgIAotICAgIGNlbnRlcmVkSWNvbkZpZ3VyZSA9IG5ldyBDZW50ZXJlZEljb25GaWd1cmUoKTsKLSAgICBjZW50ZXJlZEljb25GaWd1cmUuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDE1LCAxNSkpOwotCi0gICAgYWRkKGNlbnRlcmVkSWNvbkZpZ3VyZSk7Ci0gICAgY29udGVudEZpZ3VyZSA9IG5ldyBGaWd1cmUoKTsKLSAgICBjb250ZW50RmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IE1vZGVsR3JvdXBMYXlvdXQoZmFsc2UsIDApKTsKLSAgICBhZGQoY29udGVudEZpZ3VyZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpCi0gIHsKLSAgICB0aGlzLnRleHQgPSB0ZXh0OwotICAgIGhhc1RleHQgPSBmYWxzZTsKLSAgICBpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIGhhc1RleHQgPSB0cnVlOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpCi0gIHsKLSAgICByZXR1cm4gaGFzVGV4dDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIHJldHVybiB0ZXh0OwotICB9Ci0gIAotICBwdWJsaWMgUG9pbnQgZ2V0VGV4dENvb3JkaW5hdGVzKCkKLSAgewotICAgIFJlY3RhbmdsZSByZWN0ID0gY2VudGVyZWRJY29uRmlndXJlLmdldEJvdW5kcygpOwotICAgIHJldHVybiBuZXcgUG9pbnQocmVjdC54LCByZWN0LnkgKyAxNCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEljb25GaWd1cmUoSW1hZ2UgaW1hZ2UpCi0gIHsKLSAgICBjZW50ZXJlZEljb25GaWd1cmUuaW1hZ2UgPSBpbWFnZTsKLSAgfQotCi0gIHB1YmxpYyBDZW50ZXJlZEljb25GaWd1cmUgZ2V0VGFyZ2V0RmlndXJlKCkKLSAgewotICAgIHJldHVybiBjZW50ZXJlZEljb25GaWd1cmU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBDZW50ZXJlZEljb25GaWd1cmUgZ2V0SWNvbkZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gY2VudGVyZWRJY29uRmlndXJlOwotICB9Ci0gIAotICBwdWJsaWMgRmlndXJlIGdldENvbnRlbnRGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRlbnRGaWd1cmU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFRvb2xUaXBUZXh0KFN0cmluZyB0ZXh0KQotICB7Ci0gICAgY2VudGVyZWRJY29uRmlndXJlLnNldFRvb2xUaXBUZXh0KHRleHQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9IeXBlckxpbmtMYWJlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvSHlwZXJMaW5rTGFiZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRlZjI5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9IeXBlckxpbmtMYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci0KLXB1YmxpYyBjbGFzcyBIeXBlckxpbmtMYWJlbCBleHRlbmRzIExhYmVsCi17Ci0gIHByb3RlY3RlZCB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKQotICB7Ci0gICAgc3VwZXIucGFpbnRGaWd1cmUoZ3JhcGhpY3MpOyAgIAotICAgIGdyYXBoaWNzLnNldEZvbnQoZ2V0Rm9udCgpKTsKLSAgICAgICAgCi0gICAgLy8gVE9ETyAoY3MpIHRoaXMgbG9va3VwIHRvIGZpbmQgIiA6IiBpcyBhIGhhY2sKLSAgICAvLyB0aGF0J3Mgc3BlY2lhbGl6ZWQgZm9yIGVsZW1lbnQgYW5kIHR5cGUgbGFiZWwgdGV4dAotICAgIC8vIHdlIG5lZWQgdG8gbWFrZSB0aGUgVG9wTGV2ZWxDb21wb25lbnQgdXNlIHR3byBsYWJlbHMgaW4gdGhpcyBjYXNlCi0gICAgLy8gICAgCi0gICAgU3RyaW5nIHN0cmluZyA9IGdldFRleHQoKTsKLSAgICBpbnQgaW5kZXggPSBzdHJpbmcuaW5kZXhPZigiIDoiKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgfQotICAgIC8vIGVuZCBoYWNrCi0gICAgCi0gICAgUG9pbnQgcCA9IGdldFRleHRMb2NhdGlvbigpOyAgICAgIAotICAgIERpbWVuc2lvbiB0ZXh0U2l6ZSA9ICBGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dEV4dGVudHMoc3RyaW5nLCBnZXRGb250KCkpOwotICAgIGludCB0ZXh0V2lkdGggPSB0ZXh0U2l6ZS53aWR0aDsKLSAgICBpbnQgdGV4dEhlaWdodCA9IHRleHRTaXplLmhlaWdodDsKLSAgICBpbnQgZGVzY2VudCA9IGdyYXBoaWNzLmdldEZvbnRNZXRyaWNzKCkuZ2V0RGVzY2VudCgpOwotICAgIGludCBsaW5lWSA9IGJvdW5kcy55ICsgcC55ICsgdGV4dEhlaWdodCAtIGRlc2NlbnQgKyAxOyAgICAgIAotICAgIGludCBsaW5lWCA9IGJvdW5kcy54ICsgcC54OwotICAgIGdyYXBoaWNzLmRyYXdMaW5lKGxpbmVYLCBsaW5lWSwgbGluZVggKyB0ZXh0V2lkdGgsIGxpbmVZKTsgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL0lFeHRlbmRlZEZpZ3VyZUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL0lFeHRlbmRlZEZpZ3VyZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwN2I1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9JRXh0ZW5kZWRGaWd1cmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzLklGaWd1cmVGYWN0b3J5OwotCi1wdWJsaWMgaW50ZXJmYWNlIElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkgZXh0ZW5kcyBJRmlndXJlRmFjdG9yeQotewotICBJTW9kZWxHcm91cEZpZ3VyZSBjcmVhdGVNb2RlbEdyb3VwRmlndXJlKE9iamVjdCBtb2RlbCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9JTW9kZWxHcm91cEZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvSU1vZGVsR3JvdXBGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBmZjQyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9JTW9kZWxHcm91cEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JQURURmlndXJlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbEdyb3VwRmlndXJlIGV4dGVuZHMgSUFEVEZpZ3VyZQotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvTW9kZWxHcm91cEZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvTW9kZWxHcm91cEZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDA5OTMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9maWd1cmVzL01vZGVsR3JvdXBGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBNb2RlbEdyb3VwRmlndXJlIGV4dGVuZHMgR2VuZXJpY0dyb3VwRmlndXJlIGltcGxlbWVudHMgSU1vZGVsR3JvdXBGaWd1cmUKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBTRVFVRU5DRV9JQ09OX0lNQUdFID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L3NlcXVlbmNlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIFNFUVVFTkNFX0lDT05fRElTQUJMRURfSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvc2VxdWVuY2VkaXNfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgQ0hPSUNFX0lDT05fSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvY2hvaWNlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIENIT0lDRV9JQ09OX0RJU0FCTEVEX0lNQUdFID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm9iajE2L2Nob2ljZWRpc19vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBBTExfSUNPTl9JTUFHRSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJvYmoxNi9hbGxfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgQUxMX0lDT05fRElTQUJMRURfSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib2JqMTYvYWxsZGlzX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHVibGljIE1vZGVsR3JvdXBGaWd1cmUoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEljb25GaWd1cmUoSW1hZ2UgaW1hZ2UpCi0gIHsKLSAgICBjZW50ZXJlZEljb25GaWd1cmUuaW1hZ2UgPSBpbWFnZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkZlZWRiYWNrKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGVkaXRQYXJ0QXR0YWNoZWQoRWRpdFBhcnQgb3duZXIpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoVmlzdWFscyhPYmplY3QgbW9kZWwpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25GZWVkYmFjaygpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViICAgCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9TcGFjaW5nRmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vZmlndXJlcy9TcGFjaW5nRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNmE1NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2ZpZ3VyZXMvU3BhY2luZ0ZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBTcGFjaW5nRmlndXJlIGV4dGVuZHMgTGFiZWwKLXsKLSAgcHVibGljIFNwYWNpbmdGaWd1cmUoKQotICB7Ci0gICAgc3VwZXIoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgc2V0SWNvbihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL0RvdC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBzZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigzLCAwLCAzLCAwKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9sYXlvdXRzL0NvbnRhaW5lckxheW91dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2xheW91dHMvQ29udGFpbmVyTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMDk4MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2xheW91dHMvQ29udGFpbmVyTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmxheW91dHM7Ci0gICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuU3BhY2luZ0ZpZ3VyZTsKLSAgICAgICAgICAgICAgCi0KLXB1YmxpYyBjbGFzcyBDb250YWluZXJMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdExheW91dAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzSG9yaXpvbnRhbDsKLSAgcHJvdGVjdGVkIGludCBzcGFjaW5nID0gMDsKLSAgcHJvdGVjdGVkIGludCBib3JkZXIgPSAwOyAKLQotICBwdWJsaWMgQ29udGFpbmVyTGF5b3V0KCkKLSAgeyAKLSAgICB0aGlzKHRydWUsIDApOyAKLSAgfSAgICAgICAgICAgICAKLQotICBwdWJsaWMgQ29udGFpbmVyTGF5b3V0KGJvb2xlYW4gaXNIb3Jpem9udGFsLCBpbnQgc3BhY2luZykKLSAgewotICAgIHRoaXMuaXNIb3Jpem9udGFsID0gaXNIb3Jpem9udGFsOyAgIAotICAgIHRoaXMuc3BhY2luZyA9IHNwYWNpbmc7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIHNldEhvcml6b250YWwoYm9vbGVhbiBpc0hvcml6b250YWwpCi0gIHsKLSAgICB0aGlzLmlzSG9yaXpvbnRhbCA9IGlzSG9yaXpvbnRhbDsKLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgc2V0U3BhY2luZyhpbnQgc3BhY2luZykKLSAgewotICAgIHRoaXMuc3BhY2luZyA9IHNwYWNpbmc7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIHNldEJvcmRlcihpbnQgYm9yZGVyKQotICB7Ci0gICAgdGhpcy5ib3JkZXIgPSBib3JkZXI7Ci0gIH0gIAotCi0gIHByb3RlY3RlZCBpbnQgYWxpZ25GaWd1cmUoSUZpZ3VyZSBwYXJlbnQsIElGaWd1cmUgY2hpbGQpCi0gIHsgCi0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbGN1bGF0ZXMgYW5kIHJldHVybnMgdGhlIHByZWZlcnJlZCBzaXplIG9mIHRoZSBjb250YWluZXIgCi0gICAqIGdpdmVuIGFzIGlucHV0LgotICAgKiAKLSAgICogQHBhcmFtIGZpZ3VyZSAgRmlndXJlIHdob3NlIHByZWZlcnJlZCBzaXplIGlzIHJlcXVpcmVkLgotICAgKiBAcmV0dXJuICBUaGUgcHJlZmVycmVkIHNpemUgb2YgdGhlIHBhc3NlZCBGaWd1cmUuCi0gICAqIEBzaW5jZSAyLjAKLSAgICovCi0gIHByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZUhlbHBlcihJRmlndXJlIHBhcmVudCkKLSAgeyAKLSAgICBEaW1lbnNpb24JcHJlZmVycmVkID0gbmV3IERpbWVuc2lvbigpOwotICAJTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpOwotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICBmb3IgKGludCBpPTA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykKLSAgICB7Ci0JCSAgSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKWNoaWxkcmVuLmdldChpKTsgICAgICAKLSAgICAKLSAgICAgIERpbWVuc2lvbgljaGlsZFNpemUgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKCk7Ci0JICAKLSAgICAgIGlmIChpc0hvcml6b250YWwpCi0gICAgICB7Ci0JCSAgICBwcmVmZXJyZWQud2lkdGggKz0gY2hpbGRTaXplLndpZHRoOwotCQkgICAgcHJlZmVycmVkLmhlaWdodCA9IE1hdGgubWF4KHByZWZlcnJlZC5oZWlnaHQsIGNoaWxkU2l6ZS5oZWlnaHQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAgCi0gICAgICAgIHByZWZlcnJlZC5oZWlnaHQgKz0gY2hpbGRTaXplLmhlaWdodDsKLSAgICAgICAgcHJlZmVycmVkLndpZHRoID0gTWF0aC5tYXgocHJlZmVycmVkLndpZHRoLCBjaGlsZFNpemUud2lkdGgpOwotICAgICAgfQotCSAgfSAgIAotCi0gICAgaW50IGNoaWxkcmVuU2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsKLSAgICBpZiAoY2hpbGRyZW5TaXplID4gMSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKGlzSG9yaXpvbnRhbCkgICAgCi0gICAgICB7Ci0gICAgICAgIHByZWZlcnJlZC53aWR0aCArPSBzcGFjaW5nICogKGNoaWxkcmVuU2l6ZSAtIDEpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotCQkgICAgcHJlZmVycmVkLmhlaWdodCArPSBzcGFjaW5nICogKGNoaWxkcmVuU2l6ZSAtIDEpOwotICAgICAgfSAKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByZWZlcnJlZC53aWR0aCArPSBib3JkZXIgKiAyOwotICAgIHByZWZlcnJlZC5oZWlnaHQgKz0gYm9yZGVyICogMjsKLQkgIHByZWZlcnJlZC53aWR0aCArPSBwYXJlbnQuZ2V0SW5zZXRzKCkuZ2V0V2lkdGgoKTsKLQkgIHByZWZlcnJlZC5oZWlnaHQgKz0gcGFyZW50LmdldEluc2V0cygpLmdldEhlaWdodCgpOyAgICAgICAKLSAgCi0gIAlyZXR1cm4gcHJlZmVycmVkOwotICB9Ci0KLSAgcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVQcmVmZXJyZWRTaXplKElGaWd1cmUgcGFyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi0gIHsgICAgCi0gICAgRGltZW5zaW9uCXByZWZlcnJlZCA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vIEhlcmUgd2UgZW5zdXJlIHRoYXQgYW4gdW5leHBhbmRlZCBjb250YWluZXIgaXMgZ2l2ZW4gYSBzaXplIG9mICgwLDApCi0gICAgLy8KLS8vICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJRXhwYW5kYWJsZSkKLS8vICAgIHsKLS8vICAgICAgSUV4cGFuZGFibGUgZXhwYW5kYWJsZUZpZ3VyZSA9IChJRXhwYW5kYWJsZSlwYXJlbnQ7Ci0vLyAgICAgIGlmICghZXhwYW5kYWJsZUZpZ3VyZS5pc0V4cGFuZGVkKCkpCi0vLyAgICAgIHsKLS8vICAgICAgICBwcmVmZXJyZWQgPSBuZXcgRGltZW5zaW9uKCk7IAotLy8gICAgICB9Ci0vLyAgICB9ICAgCi0gICAgCi0gICAgaWYgKHByZWZlcnJlZCA9PSBudWxsKQotICAgIHsKLQkgICAgcHJlZmVycmVkID0gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZUhlbHBlcihwYXJlbnQpOyAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHByZWZlcnJlZDsKLSAgfQotICAgICAKLQotICBwcm90ZWN0ZWQgdm9pZCBhZGp1c3RMYXlvdXRMb2NhdGlvbihJRmlndXJlIHBhcmVudCwgRGltZW5zaW9uIGRpbWVuc2lvbikKLSAgeyAgICAgCi0gIH0gICAKLQotICBwdWJsaWMgdm9pZCBsYXlvdXQoSUZpZ3VyZSBwYXJlbnQpCi0gIHsgICAgICAgCi0gIAlMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7Ci0gCi0gICAgaW50IHJ4ID0gMDsKLSAgICBEaW1lbnNpb24JZGltZW5zaW9uID0gbmV3IERpbWVuc2lvbigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQkgIGZvciAoaW50IGk9MDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKQotICAgIHsKLQkJICBJRmlndXJlIGNoaWxkID0gKElGaWd1cmUpY2hpbGRyZW4uZ2V0KGkpOwotCQkgIERpbWVuc2lvbgljaGlsZFNpemUgPSBjaGlsZC5nZXRQcmVmZXJyZWRTaXplKCk7Ci0gICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgeyAgIAotICAgICAgICBkaW1lbnNpb24uaGVpZ2h0ID0gTWF0aC5tYXgoZGltZW5zaW9uLmhlaWdodCwgY2hpbGRTaXplLmhlaWdodCk7Ci0gICAgICAgIHJ4ICs9IGNoaWxkU2l6ZS53aWR0aDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZGltZW5zaW9uLndpZHRoID0gTWF0aC5tYXgoZGltZW5zaW9uLndpZHRoLCBjaGlsZFNpemUud2lkdGgpOwotICAgICAgfQotICAgIH0KLQotCSAgLy9kaW1lbnNpb24ud2lkdGggKz0gcGFyZW50LmdldEluc2V0cygpLmxlZnQ7Ci0gICAgLy9kaW1lbnNpb24uaGVpZ2h0ICs9IHBhcmVudC5nZXRJbnNldHMoKS50b3A7Ci0KLSAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgIHsKLSAgICAgIGRpbWVuc2lvbi5oZWlnaHQgKz0gYm9yZGVyKjI7Ci0gICAgCWRpbWVuc2lvbi53aWR0aCArPSBib3JkZXI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBkaW1lbnNpb24ud2lkdGggKz0gYm9yZGVyKjI7Ci0gICAgCWRpbWVuc2lvbi5oZWlnaHQgKz0gYm9yZGVyOwotICAgIH0KLSAgICBhZGp1c3RMYXlvdXRMb2NhdGlvbihwYXJlbnQsIGRpbWVuc2lvbik7ICAgIAotCi0gICAgZm9yIChpbnQgaT0wOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKWNoaWxkcmVuLmdldChpKTsKLQkgICAgRGltZW5zaW9uCWNoaWxkU2l6ZSA9IGNoaWxkLmdldFByZWZlcnJlZFNpemUoKTsKLSAgICAgICAgCi0gICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgeyAgIAotICAgICAgICBpbnQgeSA9IC0xOyAKLSAgICAKLSAgICAgICAgeSA9IGFsaWduRmlndXJlKHBhcmVudCwgY2hpbGQpOwotICAgIAotICAgICAgICBpZiAoeSA9PSAtMSkKLSAgICAgICAgewotICAgICAgICAgICB5ID0gKGRpbWVuc2lvbi5oZWlnaHQgLSBjaGlsZFNpemUuaGVpZ2h0KSAvIDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBSZWN0YW5nbGUgcmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZShkaW1lbnNpb24ud2lkdGgsIHksIGNoaWxkU2l6ZS53aWR0aCwgY2hpbGRTaXplLmhlaWdodCk7Ci0gICAgICAgIHJlY3RhbmdsZS50cmFuc2xhdGUocGFyZW50LmdldENsaWVudEFyZWEoKS5nZXRMb2NhdGlvbigpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgIGNoaWxkLnNldEJvdW5kcyhyZWN0YW5nbGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAgICAgIGRpbWVuc2lvbi53aWR0aCArPSBjaGlsZFNpemUud2lkdGg7IAotICAgICAgICBkaW1lbnNpb24ud2lkdGggKz0gc3BhY2luZzsgICAgICAgCi0KLSAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgU3BhY2luZ0ZpZ3VyZSkKLSAgICAgICAgeyAgICAgICAgICAKLSAgICAgICAgICBpbnQgYXZhaWxhYmxlSG9yaXpvbnRhbFNwYWNlID0gcGFyZW50LmdldENsaWVudEFyZWEoKS53aWR0aCAtIHJ4OwotICAgICAgICAgIGRpbWVuc2lvbi53aWR0aCArPSBhdmFpbGFibGVIb3Jpem9udGFsU3BhY2U7Ci0gICAgICAgIH0gICAgICAgICAgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBSZWN0YW5nbGUgcmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZSgwLCBkaW1lbnNpb24uaGVpZ2h0LCBjaGlsZFNpemUud2lkdGgsIGNoaWxkU2l6ZS5oZWlnaHQpOwotCSAgICAgIHJlY3RhbmdsZS50cmFuc2xhdGUocGFyZW50LmdldENsaWVudEFyZWEoKS5nZXRMb2NhdGlvbigpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotCi0gICAgICAgIGNoaWxkLnNldEJvdW5kcyhyZWN0YW5nbGUpOyAgCi0gICAgICAgIGRpbWVuc2lvbi5oZWlnaHQgKz0gY2hpbGRTaXplLmhlaWdodDsKLSAgICAgICAgZGltZW5zaW9uLmhlaWdodCArPSBzcGFjaW5nOwotICAgICAgfQotCSAgfQkgICAgICAKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vbGF5b3V0cy9GaWxsTGF5b3V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vbGF5b3V0cy9GaWxsTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZmU4ZTViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2Rlc2lnbi9sYXlvdXRzL0ZpbGxMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmxheW91dHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi1wdWJsaWMgY2xhc3MgRmlsbExheW91dCBleHRlbmRzIEFic3RyYWN0TGF5b3V0Ci17Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzSG9yaXpvbnRhbCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgaW50IHNwYWNpbmcgPSAwOwotICBwdWJsaWMgRGltZW5zaW9uIG1pbjsKLQotICBwdWJsaWMgRmlsbExheW91dCgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBGaWxsTGF5b3V0KGludCBzcGFjaW5nKQotICB7Ci0gICAgdGhpcy5zcGFjaW5nID0gc3BhY2luZzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEhvcml6b250YWwoYm9vbGVhbiBpc0hvcml6b250YWwpCi0gIHsKLSAgICB0aGlzLmlzSG9yaXpvbnRhbCA9IGlzSG9yaXpvbnRhbDsKLSAgfQotCi0gIC8qKgotICAgKiBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBwcmVmZXJyZWQgc2l6ZSBvZiB0aGUgaW5wdXQgY29udGFpbmVyLiBUaGlzIGlzCi0gICAqIHRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IGNoaWxkIG9mIHRoZSBjb250YWluZXIsIGFzIGFsbCBvdGhlciBjaGlsZHJlbiBmaXQKLSAgICogaW50byB0aGlzIHNpemUuCi0gICAqIAotICAgKiBAcGFyYW0gZmlndXJlCi0gICAqICAgICAgICAgIENvbnRhaW5lciBmaWd1cmUgZm9yIHdoaWNoIHByZWZlcnJlZCBzaXplIGlzIHJlcXVpcmVkLgotICAgKiBAcmV0dXJuIFRoZSBwcmVmZXJyZWQgc2l6ZSBvZiB0aGUgaW5wdXQgZmlndXJlLgotICAgKi8KLQotICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoSUZpZ3VyZSBmaWd1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgewotICAgIERpbWVuc2lvbiBkID0gY2FsY3VsYXRlUHJlZmVycmVkQ2xpZW50QXJlYVNpemUoZmlndXJlKTsKLSAgICBkLmV4cGFuZChmaWd1cmUuZ2V0SW5zZXRzKCkuZ2V0V2lkdGgoKSwgZmlndXJlLmdldEluc2V0cygpLmdldEhlaWdodCgpKTsKLSAgICBkLnVuaW9uKGdldEJvcmRlclByZWZlcnJlZFNpemUoZmlndXJlKSk7Ci0gICAgcmV0dXJuIGQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZENsaWVudEFyZWFTaXplKElGaWd1cmUgZmlndXJlKQotICB7Ci0gICAgRGltZW5zaW9uIGQgPSBuZXcgRGltZW5zaW9uKCk7Ci0gICAgTGlzdCBjaGlsZHJlbiA9IGZpZ3VyZS5nZXRDaGlsZHJlbigpOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSkgaS5uZXh0KCk7Ci0gICAgICBEaW1lbnNpb24gY2hpbGRTaXplID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZSgpOwotCi0gICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgewotICAgICAgICBkLndpZHRoICs9IGNoaWxkU2l6ZS53aWR0aDsKLSAgICAgICAgZC5oZWlnaHQgPSBNYXRoLm1heChjaGlsZFNpemUuaGVpZ2h0LCBkLmhlaWdodCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGQuaGVpZ2h0ICs9IGNoaWxkU2l6ZS5oZWlnaHQ7Ci0gICAgICAgIGQud2lkdGggPSBNYXRoLm1heChjaGlsZFNpemUud2lkdGgsIGQud2lkdGgpOwotICAgICAgfQotICAgIH0KLQotICAgIGludCBjaGlsZHJlblNpemUgPSBjaGlsZHJlbi5zaXplKCk7Ci0gICAgaWYgKGNoaWxkcmVuU2l6ZSA+IDApCi0gICAgewotICAgICAgaWYgKGlzSG9yaXpvbnRhbCkKLSAgICAgIHsKLSAgICAgICAgZC53aWR0aCArPSBzcGFjaW5nICogKGNoaWxkcmVuU2l6ZSAtIDEpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBkLmhlaWdodCArPSBzcGFjaW5nICogKGNoaWxkcmVuU2l6ZSAtIDEpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChtaW4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkLndpZHRoID0gTWF0aC5tYXgoZC53aWR0aCwgbWluLndpZHRoKTsKLSAgICAgIGQuaGVpZ2h0ID0gTWF0aC5tYXgoZC5oZWlnaHQsIG1pbi5oZWlnaHQpOwotICAgIH0KLSAgICByZXR1cm4gZDsKLSAgfQotCi0gIC8qCi0gICAqIFJldHVybnMgdGhlIG1pbmltdW0gc2l6ZSByZXF1aXJlZCBieSB0aGUgaW5wdXQgY29udGFpbmVyLiBUaGlzIGlzIHRoZSBzaXplCi0gICAqIG9mIHRoZSBsYXJnZXN0IGNoaWxkIG9mIHRoZSBjb250YWluZXIsIGFzIGFsbCBvdGhlciBjaGlsZHJlbiBmaXQgaW50byB0aGlzCi0gICAqIHNpemUuCi0gICAqLwotICBwdWJsaWMgRGltZW5zaW9uIGdldE1pbmltdW1TaXplKElGaWd1cmUgZmlndXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi0gIHsKLSAgICBEaW1lbnNpb24gZCA9IG5ldyBEaW1lbnNpb24oKTsKLSAgICBMaXN0IGNoaWxkcmVuID0gZmlndXJlLmdldENoaWxkcmVuKCk7Ci0gICAgSUZpZ3VyZSBjaGlsZDsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgY2hpbGQgPSAoSUZpZ3VyZSkgY2hpbGRyZW4uZ2V0KGkpOwotICAgICAgZC51bmlvbihjaGlsZC5nZXRNaW5pbXVtU2l6ZSgpKTsKLSAgICB9Ci0gICAgZC5leHBhbmQoZmlndXJlLmdldEluc2V0cygpLmdldFdpZHRoKCksIGZpZ3VyZS5nZXRJbnNldHMoKS5nZXRIZWlnaHQoKSk7Ci0gICAgcmV0dXJuIGQ7Ci0gIH0KLQotICBwdWJsaWMgRGltZW5zaW9uIGdldFByZWZlcnJlZFNpemUoSUZpZ3VyZSBmaWd1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgewotICAgIHJldHVybiBjYWxjdWxhdGVQcmVmZXJyZWRTaXplKGZpZ3VyZSwgd2lkdGgsIGhlaWdodCk7Ci0gIH0KLQotICAvKgotICAgKiBMYXlzIG91dCB0aGUgY2hpbGRyZW4gb24gdG9wIG9mIGVhY2ggb3RoZXIgd2l0aCB0aGVpciBzaXplcyBlcXVhbCB0byB0aGF0Ci0gICAqIG9mIHRoZSBhdmFpbGFibGUgcGFpbnRhYmxlIGFyZWEgb2YgdGhlIGlucHV0IGNvbnRhaW5lciBmaWd1cmUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsYXlvdXQoSUZpZ3VyZSBmaWd1cmUpCi0gIHsKLSAgICBEaW1lbnNpb24gcHJlZmVycmVkU2l6ZSA9IGNhbGN1bGF0ZVByZWZlcnJlZENsaWVudEFyZWFTaXplKGZpZ3VyZSk7Ci0gICAgUmVjdGFuZ2xlIHIgPSBmaWd1cmUuZ2V0Q2xpZW50QXJlYSgpLmdldENvcHkoKTsKLSAgICBMaXN0IGNoaWxkcmVuID0gZmlndXJlLmdldENoaWxkcmVuKCk7Ci0KLSAgICBpbnQgbkNoaWxkcmVuID0gY2hpbGRyZW4uc2l6ZSgpOwotICAgIGludCBleHRyYUhvcml6b250YWxTcGFjZSA9IHIud2lkdGggLSBwcmVmZXJyZWRTaXplLndpZHRoOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSkgaS5uZXh0KCk7Ci0gICAgICBEaW1lbnNpb24gcHJlZmVycmVkQ2hpbGRTaXplID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZSgpOwotCi0gICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgewotICAgICAgICBpbnQgdyA9IHByZWZlcnJlZENoaWxkU2l6ZS53aWR0aCArIChleHRyYUhvcml6b250YWxTcGFjZSAvIG5DaGlsZHJlbik7Ci0gICAgICAgIGNoaWxkLnNldEJvdW5kcyhuZXcgUmVjdGFuZ2xlKHIueCwgci55LCB3LCBNYXRoLm1heChwcmVmZXJyZWRTaXplLmhlaWdodCwgci5oZWlnaHQpKSk7Ci0gICAgICAgIHIueCArPSB3ICsgc3BhY2luZzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY2hpbGQuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoci54LCByLnksIE1hdGgubWF4KHByZWZlcnJlZFNpemUud2lkdGgsIHIud2lkdGgpLCBwcmVmZXJyZWRDaGlsZFNpemUuaGVpZ2h0KSk7Ci0gICAgICAgIHIueSArPSBwcmVmZXJyZWRDaGlsZFNpemUuaGVpZ2h0ICsgc3BhY2luZzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vbGF5b3V0cy9Nb2RlbEdyb3VwTGF5b3V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kZXNpZ24vbGF5b3V0cy9Nb2RlbEdyb3VwTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZjdiNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGVzaWduL2xheW91dHMvTW9kZWxHcm91cExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5sYXlvdXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5Nb2RlbEdyb3VwRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuU3BhY2luZ0ZpZ3VyZTsKLQotcHVibGljIGNsYXNzIE1vZGVsR3JvdXBMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdExheW91dAotewotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0hvcml6b250YWw7Ci0gIHByb3RlY3RlZCBpbnQgc3BhY2luZyA9IDEwOwotICBwcm90ZWN0ZWQgaW50IGJvcmRlciA9IDA7Ci0KLSAgcHVibGljIE1vZGVsR3JvdXBMYXlvdXQoKQotICB7Ci0gICAgdGhpcygwKTsKLSAgfQotCi0gIHB1YmxpYyBNb2RlbEdyb3VwTGF5b3V0KGJvb2xlYW4gaXNIb3Jpem9udGFsKQotICB7Ci0gICAgdGhpcy5pc0hvcml6b250YWwgPSBpc0hvcml6b250YWw7Ci0gIH0KLQotICBwdWJsaWMgTW9kZWxHcm91cExheW91dChib29sZWFuIGlzSG9yaXpvbnRhbCwgaW50IHNwYWNpbmcpCi0gIHsKLSAgICB0aGlzLmlzSG9yaXpvbnRhbCA9IGlzSG9yaXpvbnRhbDsKLSAgICB0aGlzLnNwYWNpbmcgPSBzcGFjaW5nOwotICB9Ci0KLSAgcHVibGljIE1vZGVsR3JvdXBMYXlvdXQoaW50IHNwYWNpbmcpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMuc3BhY2luZyA9IHNwYWNpbmc7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoSUZpZ3VyZSBjb250YWluZXIsIGludCB3SGludCwgaW50IGhIaW50KQotICB7Ci0gICAgRGltZW5zaW9uIHByZWZlcnJlZCA9IG5ldyBEaW1lbnNpb24oKTsKLSAgICBMaXN0IGNoaWxkcmVuID0gY29udGFpbmVyLmdldENoaWxkcmVuKCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSkgY2hpbGRyZW4uZ2V0KGkpOwotCi0gICAgICBEaW1lbnNpb24gY2hpbGRTaXplID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZSgpOwotCi0gICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgewotICAgICAgICBwcmVmZXJyZWQud2lkdGggKz0gY2hpbGRTaXplLndpZHRoOwotICAgICAgICBwcmVmZXJyZWQuaGVpZ2h0ID0gTWF0aC5tYXgocHJlZmVycmVkLmhlaWdodCwgY2hpbGRTaXplLmhlaWdodCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHByZWZlcnJlZC5oZWlnaHQgKz0gY2hpbGRTaXplLmhlaWdodDsKLSAgICAgICAgcHJlZmVycmVkLndpZHRoID0gTWF0aC5tYXgocHJlZmVycmVkLndpZHRoLCBjaGlsZFNpemUud2lkdGgpOwotICAgICAgfQotICAgIH0KLQotICAgIGludCBjaGlsZHJlblNpemUgPSBjaGlsZHJlbi5zaXplKCk7Ci0gICAgaWYgKGNoaWxkcmVuU2l6ZSA+IDEpCi0gICAgewotICAgICAgaWYgKGlzSG9yaXpvbnRhbCkKLSAgICAgIHsKLSAgICAgICAgcHJlZmVycmVkLndpZHRoICs9IHNwYWNpbmcgKiAoY2hpbGRyZW5TaXplIC0gMSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHByZWZlcnJlZC5oZWlnaHQgKz0gc3BhY2luZyAqIChjaGlsZHJlblNpemUgLSAxKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcmVmZXJyZWQud2lkdGggKz0gYm9yZGVyICogMjsKLSAgICBwcmVmZXJyZWQuaGVpZ2h0ICs9IGJvcmRlciAqIDI7Ci0gICAgcHJlZmVycmVkLndpZHRoICs9IGNvbnRhaW5lci5nZXRJbnNldHMoKS5nZXRXaWR0aCgpOwotICAgIHByZWZlcnJlZC5oZWlnaHQgKz0gY29udGFpbmVyLmdldEluc2V0cygpLmdldEhlaWdodCgpOwotCi0gICAgcmV0dXJuIHByZWZlcnJlZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGxheW91dChJRmlndXJlIGNvbnRhaW5lcikKLSAgewotICAgIExpc3QgY2hpbGRyZW4gPSBjb250YWluZXIuZ2V0Q2hpbGRyZW4oKTsKLQotICAgIGludCByeCA9IDA7Ci0gICAgRGltZW5zaW9uIGRpbWVuc2lvbiA9IG5ldyBEaW1lbnNpb24oKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKSBjaGlsZHJlbi5nZXQoaSk7Ci0gICAgICBEaW1lbnNpb24gY2hpbGRTaXplID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZSgpOwotICAgICAgaWYgKGlzSG9yaXpvbnRhbCkKLSAgICAgIHsKLSAgICAgICAgZGltZW5zaW9uLmhlaWdodCA9IE1hdGgubWF4KGRpbWVuc2lvbi5oZWlnaHQsIGNoaWxkU2l6ZS5oZWlnaHQpOwotICAgICAgICByeCArPSBjaGlsZFNpemUud2lkdGg7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGRpbWVuc2lvbi53aWR0aCA9IE1hdGgubWF4KGRpbWVuc2lvbi53aWR0aCwgY2hpbGRTaXplLndpZHRoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgIHsKLSAgICAgIGRpbWVuc2lvbi5oZWlnaHQgKz0gYm9yZGVyICogMjsKLSAgICAgIGRpbWVuc2lvbi53aWR0aCArPSBib3JkZXI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBkaW1lbnNpb24ud2lkdGggKz0gYm9yZGVyICogMjsKLSAgICAgIGRpbWVuc2lvbi5oZWlnaHQgKz0gYm9yZGVyOwotICAgIH0KLQotICAgIFJlY3RhbmdsZSByID0gY29udGFpbmVyLmdldENsaWVudEFyZWEoKTsKLSAgICBkaW1lbnNpb24gPSBuZXcgRGltZW5zaW9uKHIud2lkdGgsIHIuaGVpZ2h0KTsKLSAgICBQb2ludCBwID0gbmV3IFBvaW50KDAsIDApOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSkgaS5uZXh0KCk7Ci0gICAgICBEaW1lbnNpb24gY2hpbGRTaXplID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZSgpOwotCi0gICAgICBpZiAoaXNIb3Jpem9udGFsKQotICAgICAgewotICAgICAgICBSZWN0YW5nbGUgcmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZShwLngsIDAsIGNoaWxkU2l6ZS53aWR0aCwgY2hpbGRTaXplLmhlaWdodCk7Ci0KLSAgICAgICAgLy8gbGFzdCBjaGlsZAotICAgICAgICBpZiAoIWkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVjdGFuZ2xlLndpZHRoID0gZGltZW5zaW9uLndpZHRoIC0gcmVjdGFuZ2xlLng7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocC54ID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICByZWN0YW5nbGUueSA9IHIuaGVpZ2h0IC8gMiAtIGNoaWxkU2l6ZS5oZWlnaHQgLyAyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlY3RhbmdsZS55ID0gci5oZWlnaHQgLyAyIC0gY2hpbGRTaXplLmhlaWdodCAvIDI7Ci0gICAgICAgIH0KLQotICAgICAgICByZWN0YW5nbGUudHJhbnNsYXRlKGNvbnRhaW5lci5nZXRDbGllbnRBcmVhKCkuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIGNoaWxkLnNldEJvdW5kcyhyZWN0YW5nbGUpOwotICAgICAgICBwLnggKz0gY2hpbGRTaXplLndpZHRoOwotICAgICAgICBwLnggKz0gc3BhY2luZzsKLQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBSZWN0YW5nbGUgcmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZSgwLCBwLnksIGNoaWxkU2l6ZS53aWR0aCwgY2hpbGRTaXplLmhlaWdodCk7Ci0KLSAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgU3BhY2luZ0ZpZ3VyZSkKLSAgICAgICAgewotICAgICAgICAgIHJlY3RhbmdsZS54ID0gZGltZW5zaW9uLndpZHRoICsgNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIE1vZGVsR3JvdXBGaWd1cmUpCi0gICAgICAgIHsKLSAgICAgICAgICByZWN0YW5nbGUud2lkdGggPSBkaW1lbnNpb24ud2lkdGggLSByZWN0YW5nbGUueDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZWN0YW5nbGUud2lkdGggPSBkaW1lbnNpb24ud2lkdGggLSByZWN0YW5nbGUueDsKLSAgICAgICAgfQotCi0gICAgICAgIHJlY3RhbmdsZS50cmFuc2xhdGUoY29udGFpbmVyLmdldENsaWVudEFyZWEoKS5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgY2hpbGQuc2V0Qm91bmRzKHJlY3RhbmdsZSk7Ci0gICAgICAgIHAueSArPSBjaGlsZFNpemUuaGVpZ2h0OwotICAgICAgICBwLnkgKz0gc3BhY2luZzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTcGFjaW5nKGludCBzcGFjaW5nKQotICB7Ci0gICAgdGhpcy5zcGFjaW5nID0gc3BhY2luZzsKLSAgfQotCi0gIHByb3RlY3RlZCBpbnQgYWxpZ25GaWd1cmUoSUZpZ3VyZSBwYXJlbnQsIElGaWd1cmUgY2hpbGQpCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvQnVpbHRJblR5cGVzVHJlZVZpZXdlclByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL0J1aWx0SW5UeXBlc1RyZWVWaWV3ZXJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGNlY2JiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvQnVpbHRJblR5cGVzVHJlZVZpZXdlclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKLSAqICAgICBUcnVuZyBkZSBJcmVuZSA8dHJ1bmdoYUBjYS5pYm0uY29tPgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgY29udGVudCBmb3IgU2VsZWN0QnVpbHRJblR5cGVzRm9yRmlsdGVyRGlhbG9nCi0gKiByZWFkYWJpbGl0eSBXYXJuaW5nOiBTb21lIHNpbXBsZSB0cmlja3MgdG8gdHdlYWsgZWZmaWNpZW5jeSBhcmUgdXNlZAotICovCi1wdWJsaWMgY2xhc3MgQnVpbHRJblR5cGVzVHJlZVZpZXdlclByb3ZpZGVyIHsKLQkKLQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCQotCUlUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQkKLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVF9QQVJFTlQgPSAicGFyZW50IjsKLQkKLQkvKioKLQkgKiBDdXJyZW50bHkgdGhlcmUgYXJlIDMgc3ViZ3JvdXBzOiBOdW1iZXJzLCBEYXRhIGFuZCBUaW1lLCBPdGhlcgotCSAqIEZvbGtzIGNhbiBjaG9vc2UgdG8gZXhwYW5kIHRvIG1vcmUgc3ViZ3JvdXBzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IEJVSUxUX0lOX1RZUEVTX1NVQl9HUk9VUCA9IDM7Ci0JCi0gICAgc3RhdGljIFN0cmluZ1tdIG51bWJlclR5cGVzID0gCi0gICAgCXsgImJhc2U2NEJpbmFyeSIsICJieXRlIiwgImRlY2ltYWwiLCAiZG91YmxlIiwgImZsb2F0IiwgImhleEJpbmFyeSIsCi0gICAgCSAgImludCIsICJpbnRlZ2VyIiwgImxvbmciLCAibmVnYXRpdmVJbnRlZ2VyIiwgIm5vbk5lZ2F0aXZlSW50ZWdlciIsCi0gICAgCSAgIm5vblBvc2l0aXZlSW50ZWdlciIsICJwb3NpdGl2ZUludGVnZXIiLCAic2hvcnQiLCAidW5zaWduZWRCeXRlIiwKLSAgICAJICAidW5zaWduZWRJbnQiLCAidW5zaWduZWRMb25nIiwgInVuc2lnbmVkU2hvcnQifTsKLSAgICAKLSAgICBzdGF0aWMgU3RyaW5nW10gZGF0ZUFuZFRpbWVUeXBlcyA9Ci0gICAgCXsgImRhdGUiLCAiZGF0ZVRpbWUiLCAiZHVyYXRpb24iLCAiZ0RheSIsCi0gICAgCSAgImdNb250aCIsICJnTW9udGhEYXkiLCAiZ1llYXIiLCAiZ1llYXJNb250aCIsICJ0aW1lIn07Ci0JCi0JCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbEJ1aWx0SW5UeXBlcygpIHsKLSAgICAgICAgTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgLy9mb3IgKGludCBpID0gMDsgaSA8IFhTRERPTUhlbHBlci5kYXRhVHlwZS5sZW5ndGg7IGkrKykgewotICAgICAgICAvLyAgaXRlbXMuYWRkKFhTRERPTUhlbHBlci5kYXRhVHlwZVtpXVswXSk7Ci0gICAgICAgIC8vfQotICAgICAgICBJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7Ci0gICAgICAgIAotICAgICAgICBMaXN0IG1haW5Db250YWluZXIgPSBuZXcgQXJyYXlMaXN0KEJVSUxUX0lOX1RZUEVTX1NVQl9HUk9VUCk7Ci0gICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gaGVhZGVyID0gbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24oIiIsICJSb290IiwgbnVsbCk7Ci0gICAgICAgIG1haW5Db250YWluZXIuYWRkKGhlYWRlcik7Ci0gICAgICAgIAotICAgICAgICBMaXN0IG51bWJlcnNHcm91cCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaGVhZGVyID0gbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24oIiIsICJOdW1iZXJzIiwgbnVsbCk7Ci0gICAgICAgIG51bWJlcnNHcm91cC5hZGQoaGVhZGVyKTsKLSAgICAgICAgbWFpbkNvbnRhaW5lci5hZGQobnVtYmVyc0dyb3VwKTsKLSAgICAgICAgCi0gICAgICAgIExpc3QgZGF0ZUFuZFRpbWVHcm91cCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaGVhZGVyID0gbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24oIiIsICJEYXRlIGFuZCBUaW1lIiwgbnVsbCk7Ci0gICAgICAgIGRhdGVBbmRUaW1lR3JvdXAuYWRkKGhlYWRlcik7Ci0gICAgICAgIG1haW5Db250YWluZXIuYWRkKGRhdGVBbmRUaW1lR3JvdXApOwotICAgICAgICAKLSAgICAgICAgTGlzdCBvdGhlckdyb3VwID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBoZWFkZXIgPSBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbigiIiwgIk90aGVyIiwgbnVsbCk7Ci0gICAgICAgIG90aGVyR3JvdXAuYWRkKGhlYWRlcik7Ci0gICAgICAgIG1haW5Db250YWluZXIuYWRkKG90aGVyR3JvdXApOwotCi0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgCU9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpdGVtLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gYnVpbHRJblR5cGVJdGVtID0gbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24obmFtZSwgWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCBudWxsKTsKLSAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGlmIHRoaXMgYnVpbHQtSW4gVHlwZSBpcyBpbiBOdW1iZXIgZ3JvdXAgCi0gICAgICAgICAgICBpZiAoIHBhcnRPZihuYW1lLCBudW1iZXJUeXBlcykgKXsKLSAgICAgICAgICAgIAkvLyBTZXQgcGFyZW50Ci0gICAgICAgICAgICAJLy9idWlsdEluVHlwZUl0ZW0uYWRkQXR0cmlidXRlSW5mbyhDT05TVF9QQVJFTlQsIG51bWJlcnNHcm91cCk7Ci0gICAgICAgICAgICAJCi0gICAgICAgICAgICAJbnVtYmVyc0dyb3VwLmFkZChidWlsdEluVHlwZUl0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaWYgdGhpcyBidWlsdC1JbiBUeXBlIGlzIGluIERhdGUtYW5kLVRpbWUgZ3JvdXAgCi0gICAgICAgICAgICBlbHNlIGlmICggcGFydE9mKG5hbWUsIGRhdGVBbmRUaW1lVHlwZXMpKXsKLSAgICAgICAgICAgIAkvL2J1aWx0SW5UeXBlSXRlbS5hZGRBdHRyaWJ1dGVJbmZvKENPTlNUX1BBUkVOVCwgZGF0ZUFuZFRpbWVHcm91cCk7Ci0gICAgICAgICAgICAJZGF0ZUFuZFRpbWVHcm91cC5hZGQoYnVpbHRJblR5cGVJdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgcHV0IGluIE90aGVyIGdyb3VwCi0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIAkvL2J1aWx0SW5UeXBlSXRlbS5hZGRBdHRyaWJ1dGVJbmZvKENPTlNUX1BBUkVOVCwgb3RoZXJHcm91cCk7Ci0gICAgICAgICAgICAJb3RoZXJHcm91cC5hZGQoYnVpbHRJblR5cGVJdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtYWluQ29udGFpbmVyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpewotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJcmV0dXJuIGxhYmVsUHJvdmlkZXI7Ci0JCQotCQlsYWJlbFByb3ZpZGVyID0gbmV3IEJ1aWx0SW5UeXBlTGFiZWxQcm92aWRlcigpOwotCQlyZXR1cm4gbGFiZWxQcm92aWRlcjsKLQl9Ci0JCi0JcHVibGljIElUcmVlQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpIHsKLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKQotCQkJcmV0dXJuIGNvbnRlbnRQcm92aWRlcjsKLQkJCi0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBCdWlsdEluVHlwZXNUcmVlQ29udGVudFByb3ZpZGVyKCk7Ci0JCXJldHVybiBjb250ZW50UHJvdmlkZXI7Ci0JfQotCQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciBhbiBlcXVpdmFsZW50IG9mICdpdGVtJyBhcHBlYXJzIGluICdhcnJheScKLQkgKiBAcGFyYW0gaXRlbQotCSAqIEBwYXJhbSBhcnJheQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHBhcnRPZihTdHJpbmcgaXRlbSwgU3RyaW5nW10gYXJyYXkpewotCSAgICBmb3IoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKysgKXsKLQkgICAgCWlmICggaXRlbS5lcXVhbHMoYXJyYXlbaV0pICl7Ci0JICAgIAkJcmV0dXJuIHRydWU7Ci0JICAgIAl9ICAgICAgICAgICAgCQkKLQkgICAgfQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCQotCWNsYXNzIEJ1aWx0SW5UeXBlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyewotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsJCQkKLQkJCWlmICggZ2V0VGV4dChlbGVtZW50KS5lcXVhbHMoIk51bWJlcnMiKSApCi0JCQkJcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNETnVtYmVyVHlwZXMuZ2lmIik7Ci0JCQlpZiAoIGdldFRleHQoZWxlbWVudCkuZXF1YWxzKCJEYXRlIGFuZCBUaW1lIikgKQotCQkJCXJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRERhdGVBbmRUaW1lVHlwZXMuZ2lmIik7Ci0JCQlpZiAoIGdldFRleHQoZWxlbWVudCkuZXF1YWxzKCJPdGhlciIpICkKLQkJCQlyZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9icm93c2VidXR0b24uZ2lmIik7Ci0JCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBDb21wb25lbnRTcGVjaWZpY2F0aW9uICl7Ci0JCQkJcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEU2ltcGxlVHlwZS5naWYiKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMgPSBudWxsOwotCQkJCi0JCQkvKiBpZiBub3Qgbm9uLWxlYWYgbm9kZSwgdGhlIGZpcnN0IGVsZW1lbnQgaGFzIHRoZSBuYW1lIGZvciAKLQkJCSAqIHRoZSB3aG9sZSBsaXN0ICovCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIExpc3QpewotCQkJCXNwZWMgPSAoQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgKChMaXN0KSBlbGVtZW50KS5nZXQoMCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiApewotCQkJCXNwZWMgPSAoQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgZWxlbWVudDsKLQkJCX0KLQkJCXJldHVybiBzcGVjLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkKLQkJfSAgCi0JCQotCX0KLQotCi0JY2xhc3MgQnVpbHRJblR5cGVzVHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTGlzdCkgewotCQkJCUxpc3QgcGFyZW50Q29udGVudCA9IChMaXN0KSBwYXJlbnRFbGVtZW50OwotCQkJCQotCQkJCS8qKiBJZ25vcmUgdGhlIGZpcnN0IGVsZW1lbnQgKHdoaWNoIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoaXMgbGlzdAotCQkJCSAqIGllLiAnTnVtYmVycycsICdEYXRlIGFuZCB0aW1lJywgJ090aGVyJykgKi8KLQkJCQlyZXR1cm4gcGFyZW50Q29udGVudC5zdWJMaXN0KDEsIHBhcmVudENvbnRlbnQuc2l6ZSgpKS50b0FycmF5KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCSAgICByZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9JT3BlbkluTmV3RWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL0lPcGVuSW5OZXdFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUyYzUyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL0lPcGVuSW5OZXdFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU9wZW5Jbk5ld0VkaXRvcgotewotICBwdWJsaWMgdm9pZCBvcGVuWFNERWRpdG9yKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld0F0dHJpYnV0ZURpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdBdHRyaWJ1dGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYwMjk0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld0F0dHJpYnV0ZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLklYU0RTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBOZXdBdHRyaWJ1dGVEaWFsb2cgZXh0ZW5kcyBOZXdDb21wb25lbnREaWFsb2cgaW1wbGVtZW50cyBJQ29tcG9uZW50RGlhbG9nCi17Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWEgc2NoZW1hOwotICBwcm90ZWN0ZWQgT2JqZWN0IHNldE9iamVjdDsKLSAgcHJvdGVjdGVkIGludCB0eXBlS2luZDsKLSAgcHJvdGVjdGVkIE9iamVjdCBzZWxlY3Rpb247Ci0KLSAgcHVibGljIE5ld0F0dHJpYnV0ZURpYWxvZygpCi0gIHsKLSAgICBzdXBlcihEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBNZXNzYWdlcy5fVUlfTEFCRUxfTkVXX0FUVFJJQlVURSwgIk5ld0F0dHJpYnV0ZSIpOyAgICAgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIE5ld0F0dHJpYnV0ZURpYWxvZyhYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgc3VwZXIoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgTWVzc2FnZXMuX1VJX0xBQkVMX05FV19BVFRSSUJVVEUsICJOZXdBdHRyaWJ1dGUiKTsgICAgIC8vJE5PTi1OTFMtMSQKLSAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNldHVwKCkgewotICAgIGlmIChzY2hlbWEgIT0gbnVsbCkgewotICAgICAgTGlzdCB1c2VkTmFtZXMgPSBnZXRVc2VkRWxlbWVudE5hbWVzKCk7Ci0gICAgICBzZXRVc2VkTmFtZXModXNlZE5hbWVzKTsKLSAgICAgIHNldERlZmF1bHROYW1lKFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUoIk5ld0F0dHJpYnV0ZSIsIHNjaGVtYS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSkpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIGludCBjcmVhdGVBbmRPcGVuKCkKLSAgewotICBzZXR1cCgpOwotICAgIGludCByZXR1cm5Db2RlID0gc3VwZXIuY3JlYXRlQW5kT3BlbigpOwotICAgIGlmIChyZXR1cm5Db2RlID09IDApCi0gICAgewotICAgICAgaWYgKHNldE9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXIpCi0gICAgICB7ICAKLSAgICAgICAgLy9Db21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZChnZXROYW1lKCksIHNjaGVtYSk7Ci0gICAgICB9ICAgICAgICAKLSAgICB9ICAKLSAgICByZXR1cm4gcmV0dXJuQ29kZTsKLSAgfQotCi0gIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldFNlbGVjdGVkQ29tcG9uZW50KCkKLSAgewotICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbiA9ICBuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihudWxsLCBnZXROYW1lKCksIG51bGwpOyAgICAKLSAgICBjb21wb25lbnRTcGVjaWZpY2F0aW9uLnNldE1ldGFOYW1lKElYU0RTZWFyY2hDb25zdGFudHMuQVRUUklCVVRFX01FVEFfTkFNRSk7Ci0gICAgY29tcG9uZW50U3BlY2lmaWNhdGlvbi5zZXROZXcodHJ1ZSk7Ci0gICAgcmV0dXJuIGNvbXBvbmVudFNwZWNpZmljYXRpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbikKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgfQotICAKLSAgcHJpdmF0ZSBMaXN0IGdldFVzZWRFbGVtZW50TmFtZXMoKSB7Ci0gICAgTGlzdCB1c2VkTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7ICAgICAKLSAgICBpZiAoc2NoZW1hICE9IG51bGwgKSB7Ci0gICAgICBMaXN0IGVsZW1lbnRzTGlzdCA9IHNjaGVtYS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKTsKLSAgICAgIEl0ZXJhdG9yIGVsZW1lbnRzID0gZWxlbWVudHNMaXN0Lml0ZXJhdG9yKCk7IAotICAgICAgd2hpbGUgKGVsZW1lbnRzLmhhc05leHQoKSkgewotICAgICAgICB1c2VkTmFtZXMuYWRkKCgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGVsZW1lbnRzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHVzZWROYW1lczsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld0NvbXBvbmVudERpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdDb21wb25lbnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEwYzQ5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld0NvbXBvbmVudERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotCi1wdWJsaWMgY2xhc3MgTmV3Q29tcG9uZW50RGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIFRleHQgbmFtZUZpZWxkOyAKLSAgcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgdGl0bGU7Ci0gIHByb3RlY3RlZCBMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbDsKLSAgcHJvdGVjdGVkIExpc3QgdXNlZE5hbWVzOwotCi0gIHB1YmxpYyBOZXdDb21wb25lbnREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlZmF1bHROYW1lKSAKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICBzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotICAgIG5hbWUgPSBkZWZhdWx0TmFtZTsgICAgICAKLSAgICB0aGlzLnRpdGxlID0gdGl0bGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBOZXdDb21wb25lbnREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlZmF1bHROYW1lLCBMaXN0IHVzZWROYW1lcykgCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gICAgc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLSAgICBuYW1lID0gZGVmYXVsdE5hbWU7ICAgICAgCi0gICAgdGhpcy50aXRsZSA9IHRpdGxlOwotICAgIHRoaXMudXNlZE5hbWVzID0gdXNlZE5hbWVzOwotICB9Ci0KLSAgcHVibGljIGludCBjcmVhdGVBbmRPcGVuKCkKLSAgewotICAgIGNyZWF0ZSgpOwotICAgIGdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0gICAgc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgcmV0dXJuIG9wZW4oKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpICAKLSAgewotICAgIENvbnRyb2wgY29udHJvbCA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0gICAgbmFtZUZpZWxkLmZvcmNlRm9jdXMoKTsKLSAgICBuYW1lRmllbGQuc2VsZWN0QWxsKCk7ICAKLSAgICB1cGRhdGVFcnJvck1lc3NhZ2UoKTsKLSAgICByZXR1cm4gY29udHJvbDsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSAKLSAgewotICAgIG9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0gICAgY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVIZWFkZXJDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRXh0ZW5kZWRDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsKLSAgICBDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgIAotICAgIGNyZWF0ZUhlYWRlckNvbnRlbnQoZGlhbG9nQXJlYSk7Ci0KLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgIEdyaWREYXRhIGdkRmlsbD0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2RGaWxsLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2RGaWxsLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0gICAgZ2RGaWxsLnZlcnRpY2FsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGdkRmlsbC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZT0gdHJ1ZTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZEZpbGwpOwotCi0gICAgTGFiZWwgbmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIG5hbWVMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLlVJX0xBQkVMX05BTUUpOwotCi0gICAgbmFtZUZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgICBnZC53aWR0aEhpbnQgPSAyMDA7Ci0gICAgbmFtZUZpZWxkLnNldExheW91dERhdGEoZ2QpOwotICAgIG5hbWVGaWVsZC5zZXRUZXh0KG5hbWUpOwotICAgIG5hbWVGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG5hbWVGaWVsZCwgWFNERWRpdG9yQ1NIZWxwSWRzLk5FV1RZUEVfTkFNRSk7Ci0KLSAgICBjcmVhdGVFeHRlbmRlZENvbnRlbnQoZGlhbG9nQXJlYSk7Ci0KLSAgICAvLyBlcnJvciBtZXNzYWdlCi0gICAgZXJyb3JNZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotICAgIGVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoImVycm9yIG1lc3NhZ2UgZ29lcyBoZXJlIik7Ci0gICAgR3JpZERhdGEgZ2QyID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QyLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2QyLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0gICAgZ2QyLndpZHRoSGludCA9IDIwMDsKLSAgICBlcnJvck1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGdkMik7ICAgICAgICAgIAotLy8gICAgQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZXJyb3JNZXNzYWdlTGFiZWwuZ2V0RGlzcGxheSgpLCAyMDAsIDAsIDApOwotLy8gICAgZXJyb3JNZXNzYWdlTGFiZWwuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0KLSAgICByZXR1cm4gZGlhbG9nQXJlYTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSAKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHVwZGF0ZUVycm9yTWVzc2FnZSgpOwotICB9ICAgICAgICAKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVFcnJvck1lc3NhZ2UoU3RyaW5nIG5hbWUpCi0gIHsKLSAgCWlmICh1c2VkTmFtZXMgPT0gbnVsbCkKLSAgCQlyZXR1cm4gbnVsbDsKLSAgCQotICAJSXRlcmF0b3IgaXRlcmF0b3IgPSB1c2VkTmFtZXMuaXRlcmF0b3IoKTsKLSAgCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKSkpIHsKLSAgCQkJcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0VSUk9SX05BTUVfQUxSRUFEWV9VU0VEOyAvLyROT04tTkxTLTEkCi0gIAkJfQotICAJfQotICAJCi0gIAlyZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUVycm9yTWVzc2FnZSgpCi0gIHsgICAgICAgICAgICAgICAgIAotICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotICAgIFN0cmluZyBuYW1lID0gbmFtZUZpZWxkLmdldFRleHQoKS50cmltKCk7Ci0gICAgaWYgKG5hbWUubGVuZ3RoKCkgPiAwKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZXJyb3JNZXNzYWdlID0gY29tcHV0ZUVycm9yTWVzc2FnZShuYW1lKTsKLSAgICB9ICAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIGVycm9yTWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgfSAgCi0gICAgZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChlcnJvck1lc3NhZ2UgIT0gbnVsbCA/IGVycm9yTWVzc2FnZSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIG9rQnV0dG9uLnNldEVuYWJsZWQoZXJyb3JNZXNzYWdlID09IG51bGwpOwotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSAKLSAgewotICAgIGlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKQotICAgIHsKLSAgICAgIG5hbWUgPSBuYW1lRmllbGQuZ2V0VGV4dCgpOwotICAgIH0KLSAgICBzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VXNlZE5hbWVzKExpc3QgdXNlZE5hbWVzKSB7Ci0JICB0aGlzLnVzZWROYW1lcyA9IHVzZWROYW1lczsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdFbGVtZW50QnV0dG9uSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdFbGVtZW50QnV0dG9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzgzNTcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvTmV3RWxlbWVudEJ1dHRvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLklOZXdDb21wb25lbnRIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgTmV3RWxlbWVudEJ1dHRvbkhhbmRsZXIgaW1wbGVtZW50cyBJTmV3Q29tcG9uZW50SGFuZGxlcgotewotICBwdWJsaWMgTmV3RWxlbWVudEJ1dHRvbkhhbmRsZXIoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBvcGVuTmV3Q29tcG9uZW50RGlhbG9nKCkKLSAgewotICAgIE5ld0VsZW1lbnREaWFsb2cgbmV3RWxlbWVudERpYWxvZyA9IG5ldyBOZXdFbGVtZW50RGlhbG9nKCk7Ci0gICAgbmV3RWxlbWVudERpYWxvZy5jcmVhdGVBbmRPcGVuKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvTmV3RWxlbWVudERpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdFbGVtZW50RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMDYxOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdFbGVtZW50RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guSVhTRFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBOZXdFbGVtZW50RGlhbG9nIGV4dGVuZHMgTmV3Q29tcG9uZW50RGlhbG9nIGltcGxlbWVudHMgSUNvbXBvbmVudERpYWxvZwotewotCSAgcHJvdGVjdGVkIFhTRFNjaGVtYSBzY2hlbWE7Ci0JICBwcm90ZWN0ZWQgT2JqZWN0IHNldE9iamVjdDsKLQkgIHByb3RlY3RlZCBpbnQgdHlwZUtpbmQ7Ci0JICBwcm90ZWN0ZWQgT2JqZWN0IHNlbGVjdGlvbjsKLQotCSAgcHVibGljIE5ld0VsZW1lbnREaWFsb2coKQotCSAgewotCSAgICBzdXBlcihEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBNZXNzYWdlcy5fVUlfTEFCRUxfTkVXX0VMRU1FTlQsICJOZXdFbGVtZW50Iik7ICAgICAvLyROT04tTkxTLTEkCi0JICB9Ci0KLQkgIHB1YmxpYyBOZXdFbGVtZW50RGlhbG9nKFhTRFNjaGVtYSBzY2hlbWEpCi0JICB7Ci0JICAgIHN1cGVyKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIE1lc3NhZ2VzLl9VSV9MQUJFTF9ORVdfRUxFTUVOVCwgIk5ld0VsZW1lbnQiKTsgICAgIC8vJE5PTi1OTFMtMSQKLQkgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0JICB9Ci0JICAKLQkgIHByaXZhdGUgdm9pZCBzZXR1cCgpIHsKLQkJICBpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCSAgTGlzdCB1c2VkTmFtZXMgPSBnZXRVc2VkRWxlbWVudE5hbWVzKCk7Ci0JCQkgIHNldFVzZWROYW1lcyh1c2VkTmFtZXMpOwotCQkJICBzZXREZWZhdWx0TmFtZShYU0RDb21tb25VSVV0aWxzLmNyZWF0ZVVuaXF1ZUVsZW1lbnROYW1lKCJOZXdFbGVtZW50Iiwgc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKSkpOwotCQkgIH0KLQkgIH0KLQkgIAotCSAgcHVibGljIGludCBjcmVhdGVBbmRPcGVuKCkKLQkgIHsKLQkJc2V0dXAoKTsKLQkgICAgaW50IHJldHVybkNvZGUgPSBzdXBlci5jcmVhdGVBbmRPcGVuKCk7Ci0JICAgIGlmIChyZXR1cm5Db2RlID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoc2V0T2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlcikKLQkgICAgICB7ICAKLQkgICAgICAgIC8vQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQoZ2V0TmFtZSgpLCBzY2hlbWEpOwotCSAgICAgIH0gICAgICAgIAotCSAgICB9ICAKLQkgICAgcmV0dXJuIHJldHVybkNvZGU7Ci0JICB9Ci0KLQkgIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldFNlbGVjdGVkQ29tcG9uZW50KCkKLQkgIHsKLQkgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uID0gIG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKG51bGwsIGdldE5hbWUoKSwgbnVsbCk7ICAgIAotCSAgICBjb21wb25lbnRTcGVjaWZpY2F0aW9uLnNldE1ldGFOYW1lKElYU0RTZWFyY2hDb25zdGFudHMuRUxFTUVOVF9NRVRBX05BTUUpOwotCSAgICBjb21wb25lbnRTcGVjaWZpY2F0aW9uLnNldE5ldyh0cnVlKTsKLQkgICAgcmV0dXJuIGNvbXBvbmVudFNwZWNpZmljYXRpb247Ci0JICB9Ci0KLQkgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uKQotCSAgewotCSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JICB9Ci0JICAKLQkgIHByaXZhdGUgTGlzdCBnZXRVc2VkRWxlbWVudE5hbWVzKCkgewotCQkgIExpc3QgdXNlZE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwkJICAKLQkJICBpZiAoc2NoZW1hICE9IG51bGwgKSB7Ci0JCQkgIExpc3QgZWxlbWVudHNMaXN0ID0gc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKTsKLQkJCSAgSXRlcmF0b3IgZWxlbWVudHMgPSBlbGVtZW50c0xpc3QuaXRlcmF0b3IoKTsgCi0JCQkgIHdoaWxlIChlbGVtZW50cy5oYXNOZXh0KCkpIHsKLQkJCQkgIHVzZWROYW1lcy5hZGQoKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJCSAgfQotCQkgIH0KLQkJICAKLQkJICByZXR1cm4gdXNlZE5hbWVzOwotCSAgfQotCX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvTmV3VHlwZUJ1dHRvbkhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvTmV3VHlwZUJ1dHRvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgxNWE4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld1R5cGVCdXR0b25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JTmV3Q29tcG9uZW50SGFuZGxlcjsKLQotcHVibGljIGNsYXNzIE5ld1R5cGVCdXR0b25IYW5kbGVyIGltcGxlbWVudHMgSU5ld0NvbXBvbmVudEhhbmRsZXIKLXsKLSAgcHVibGljIE5ld1R5cGVCdXR0b25IYW5kbGVyKCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgb3Blbk5ld0NvbXBvbmVudERpYWxvZygpCi0gIHsKLSAgICBOZXdUeXBlRGlhbG9nIG5ld1R5cGVEaWFsb2cgPSBuZXcgTmV3VHlwZURpYWxvZygpOwotICAgIG5ld1R5cGVEaWFsb2cuY3JlYXRlQW5kT3BlbigpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZGlhbG9ncy9OZXdUeXBlRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld1R5cGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAyZTIxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL05ld1R5cGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgTmV3VHlwZURpYWxvZyBleHRlbmRzIE5ld0NvbXBvbmVudERpYWxvZyBpbXBsZW1lbnRzIElDb21wb25lbnREaWFsb2cKLXsKLSAgcHJvdGVjdGVkIFhTRFNjaGVtYSBzY2hlbWE7Ci0gIHByb3RlY3RlZCBzdGF0aWMgaW50IFNJTVBMRV9UWVBFID0gMDsKLSAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgQ09NUExFWF9UWVBFID0gMTsKLSAgcHJvdGVjdGVkIE9iamVjdCBzZXRPYmplY3Q7Ci0gIHByb3RlY3RlZCBpbnQgdHlwZUtpbmQ7Ci0gIHByb3RlY3RlZCBPYmplY3Qgc2VsZWN0aW9uOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBhbGxvd0NvbXBsZXhUeXBlID0gdHJ1ZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gYWxsb3dBbm9ueW1vdXNUeXBlID0gdHJ1ZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gYW5vbnltb3VzVHlwZSA9IGZhbHNlOwotICBwcml2YXRlIEJ1dHRvbiBjb21wbGV4VHlwZUJ1dHRvbjsKLSAgcHJpdmF0ZSBCdXR0b24gc2ltcGxlVHlwZUJ1dHRvbjsKLSAgcHJpdmF0ZSBCdXR0b24gYW5vbnltb3VzVHlwZUNoZWNrQm94OwotCi0gIHB1YmxpYyBOZXdUeXBlRGlhbG9nKCkKLSAgewotICAgIHN1cGVyKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIE1lc3NhZ2VzLl9VSV9MQUJFTF9ORVdfVFlQRSwgIk5ld1R5cGUiKTsgICAgIC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBOZXdUeXBlRGlhbG9nKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBzdXBlcihEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBNZXNzYWdlcy5fVUlfTEFCRUxfTkVXX1RZUEUsICJOZXdUeXBlIik7ICAgICAvLyROT04tTkxTLTEkCi0gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBzZXR1cCgpIHsKLQkgIGlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkgIExpc3QgdXNlZE5hbWVzID0gZ2V0VXNlZFR5cGVOYW1lcygpOwotCQkgIHNldFVzZWROYW1lcyh1c2VkTmFtZXMpOwotCQkgIHNldERlZmF1bHROYW1lKFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUobmFtZSwgc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpKSk7Ci0JICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBpbnQgY3JlYXRlQW5kT3BlbigpCi0gIHsKLQlzZXR1cCgpOwotICAgIGludCByZXR1cm5Db2RlID0gc3VwZXIuY3JlYXRlQW5kT3BlbigpOwotICAgIGlmIChyZXR1cm5Db2RlID09IDApCi0gICAgewotICAgICAgaWYgKHNldE9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXIpCi0gICAgICB7ICAKLSAgICAgICAgLy9Db21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZChnZXROYW1lKCksIHNjaGVtYSk7Ci0gICAgICB9ICAgICAgICAKLSAgICB9ICAKLSAgICByZXR1cm4gcmV0dXJuQ29kZTsKLSAgfQotCi0gIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldFNlbGVjdGVkQ29tcG9uZW50KCkKLSAgewotICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLSAgICBpZiAoIGFub255bW91c1R5cGUgKQotICAgIAljb21wb25lbnRTcGVjaWZpY2F0aW9uID0gbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24obnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgZWxzZQotICAgIAljb21wb25lbnRTcGVjaWZpY2F0aW9uID0gIG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKG51bGwsIGdldE5hbWUoKSwgbnVsbCk7ICAgIAotICAgIGNvbXBvbmVudFNwZWNpZmljYXRpb24uc2V0TWV0YU5hbWUodHlwZUtpbmQgPT0gQ09NUExFWF9UWVBFID8gSVhTRFNlYXJjaENvbnN0YW50cy5DT01QTEVYX1RZUEVfTUVUQV9OQU1FIDogSVhTRFNlYXJjaENvbnN0YW50cy5TSU1QTEVfVFlQRV9NRVRBX05BTUUpOwotICAgIGNvbXBvbmVudFNwZWNpZmljYXRpb24uc2V0TmV3KHRydWUpOwotICAgIC8vY29tcG9uZW50U3BlY2lmaWNhdGlvbi4KLSAgICByZXR1cm4gY29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlSGVhZGVyQ29udGVudChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgY29tcGxleFR5cGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLSAgICBjb21wbGV4VHlwZUJ1dHRvbi5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9DT01QTEVYX1RZUEUpOwotICAgIGNvbXBsZXhUeXBlQnV0dG9uLnNldEVuYWJsZWQoYWxsb3dDb21wbGV4VHlwZSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wbGV4VHlwZUJ1dHRvbiwgWFNERWRpdG9yQ1NIZWxwSWRzLk5FV1RZUEVfQ09NUExFWFRZUEUpOwotICAgIAotICAgIHNpbXBsZVR5cGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLSAgICBzaW1wbGVUeXBlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX1NJTVBMRV9UWVBFKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNpbXBsZVR5cGVCdXR0b24sIFhTREVkaXRvckNTSGVscElkcy5ORVdUWVBFX1NJTVBMRVRZUEUpOwotICAgIAotICAgIFNlbGVjdGlvbkFkYXB0ZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGUud2lkZ2V0ID09IHNpbXBsZVR5cGVCdXR0b24pCi0gICAgICAgIHsKLSAgICAgICAgICB0eXBlS2luZCA9IFNJTVBMRV9UWVBFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGNvbXBsZXhUeXBlQnV0dG9uKQotICAgICAgICB7Ci0gICAgICAgICAgdHlwZUtpbmQgPSBDT01QTEVYX1RZUEU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYWxsb3dBbm9ueW1vdXNUeXBlICYmIGUud2lkZ2V0ID09IGFub255bW91c1R5cGVDaGVja0JveCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChhbm9ueW1vdXNUeXBlQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkgPT0gdHJ1ZSkKLSAgICAgICAgICB7Ci0gICAgICAgIAkgIG5hbWVGaWVsZC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgCSAgYW5vbnltb3VzVHlwZSA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgIAkgIG5hbWVGaWVsZC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAJICBhbm9ueW1vdXNUeXBlID0gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLSAgICBpZiAoYWxsb3dDb21wbGV4VHlwZSkKLSAgICB7Ci0gICAgICBjb21wbGV4VHlwZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICB0eXBlS2luZCA9IENPTVBMRVhfVFlQRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNpbXBsZVR5cGVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgdHlwZUtpbmQgPSBTSU1QTEVfVFlQRTsKLSAgICB9Ci0KLSAgICBzaW1wbGVUeXBlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICBjb21wbGV4VHlwZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgCi0gICAgTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIGlmIChhbGxvd0Fub255bW91c1R5cGUgKQotICAgIHsKLSAgICAgIGFub255bW91c1R5cGVDaGVja0JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgYW5vbnltb3VzVHlwZUNoZWNrQm94LnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX0NSRUFURV9BTk9OX1RZUEUpOwotICAgIH0gICAgCi0KLSAgICBpZiAoYW5vbnltb3VzVHlwZUNoZWNrQm94ICE9IG51bGwpCi0gICAgICBhbm9ueW1vdXNUeXBlQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOyAgICAKLSAgfQotCi0gIC8vIFRPRE86IENhbiB3ZSByZW1vdmUgdGhpcz8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXROb3JtYWxpemVkTG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVVJMIHVybCA9IG5ldyBVUkwobG9jYXRpb24pOwotICAgICAgVVJMIHJlc29sdmVkVVJMID0gRmlsZUxvY2F0b3IucmVzb2x2ZSh1cmwpOwotICAgICAgbG9jYXRpb24gPSByZXNvbHZlZFVSTC5nZXRQYXRoKCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gbG9jYXRpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhbGxvd0NvbXBsZXhUeXBlKGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICB0aGlzLmFsbG93Q29tcGxleFR5cGU9IHZhbHVlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBhbGxvd0Fub255bW91c1R5cGUoYm9vbGVhbiB2YWx1ZSkKLSAgewotCXRoaXMuYWxsb3dBbm9ueW1vdXNUeXBlID0gdmFsdWU7Ci0gIH0KLSAgCi0gIHByaXZhdGUgTGlzdCBnZXRVc2VkVHlwZU5hbWVzKCkgewotCSAgTGlzdCB1c2VkTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkgIGlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkgIExpc3QgdHlwZXNMaXN0ID0gc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpOwotCQkgIEl0ZXJhdG9yIHR5cGVzID0gdHlwZXNMaXN0Lml0ZXJhdG9yKCk7Ci0JCSAgd2hpbGUgKHR5cGVzLmhhc05leHQoKSkgewotCQkJICB1c2VkTmFtZXMuYWRkKCgoWFNEVHlwZURlZmluaXRpb24pIHR5cGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJICB9Ci0JICB9Ci0JICAKLQkgIHJldHVybiB1c2VkTmFtZXM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0QnVpbHRJblR5cGVzRm9yRmlsdGVyaW5nRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdEJ1aWx0SW5UeXBlc0ZvckZpbHRlcmluZ0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDM3ZDZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0QnVpbHRJblR5cGVzRm9yRmlsdGVyaW5nRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAKLSAqICAgICBUcnVuZyBkZSBJcmVuZSA8dHJ1bmdoYUBjYS5pYm0uY29tPgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuQ2hlY2tlZFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBUaGUgQnVpbHRJblR5cGVzRmlsdGVyaW5nRGlhbG9nIGlzIGEgU2VsZWN0aW9uRGlhbG9nIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvCi0gKiAgc2VsZWN0IGEgLi4uCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RCdWlsdEluVHlwZXNGb3JGaWx0ZXJpbmdEaWFsb2cgZXh0ZW5kcyBDaGVja2VkVHJlZVNlbGVjdGlvbkRpYWxvZyB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVVNUT01fTElTVF9TRVBBUkFUT1IgPSBYU0RFZGl0b3JQbHVnaW4uQ1VTVE9NX0xJU1RfU0VQQVJBVE9SOwotCi0JcHVibGljIFNlbGVjdEJ1aWx0SW5UeXBlc0ZvckZpbHRlcmluZ0RpYWxvZyhTaGVsbCBwYXJlbnQsIAotCQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwgSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgbGFiZWxQcm92aWRlciwgY29udGVudFByb3ZpZGVyKTsKLQotCQlpbml0KCk7Ci0JfQotCQotCXB1YmxpYyBDaGVja2JveFRyZWVWaWV3ZXIgZ2V0VHJlZVZpZXdlcigpewotCQlyZXR1cm4gc3VwZXIuZ2V0VHJlZVZpZXdlcigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdCgpewotCQkvLyBncmV5IHN0YXRlIGVuYWJsZQotCQlzZXRDb250YWluZXJNb2RlKHRydWUpOwotCQkKLQkJc2V0VGl0bGUoTWVzc2FnZXMuX1VJX0xBQkVMX1NFVF9DT01NT05fQlVJTFRfSU5fVFlQRVMpOwotCQlzZXRNZXNzYWdlKE1lc3NhZ2VzLl9VSV9MQUJFTF9TRUxFQ1RfVFlQRVNfRklMVEVSX09VVCk7Ci0JCQotCQkvL3N1cGVyLmNyZWF0ZSgpOwotCQkvL3N1cGVyLmdldFRyZWVWaWV3ZXIoKS5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpKTsKLQkJCi0JfQotCQotCS8qKgotCSAqICAgUmV0dXJucyBhIFN0cmluZyBhY3RpbmcgYXMgbGlzdCBvZiBidWlsdC1pbiB0eXBlcyBzZWxlY3RlZCBieSB0aGUgdXNlcgotCSAqIGluIHRoZSBmaWx0ZXIgZGlhbG9nICh3aGl0ZSBzcGFjZSBhY3RzIGFzIHRoZSBpdGVtIHNlcGFyYXRvcikuCi0JICogICBTdWdnZXN0IHVzaW5nIGdldFNlbGVjdGVkQnVpbHRJblR5cGVzRnJvbVN0cmluZwotCSAqIHRvIGdldCBhIGNvbmNyZXRlIGFycmF5IG9mIHNlbGVjdGVkIHR5cGVzLgotCSAqICAgV2UgY2FuIG9ubHkgc3RvcmUgU3RyaW5nIGluIHRoZSBwbHVnaW4gcHJlZmVyZW5jZSdzIHN0b3JhZ2Ugc28gd2UgaGF2ZSAKLQkgKiB1c2UgdGhpcyBtZXRob2QgZm9yIGNvbnZlcnNpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlc0xpc3RJblN0cmluZyhPYmplY3RbXSBjaG9zZW5UeXBlcykgewotCQlTdHJpbmcgcmV0dXJuaW5nTGlzdCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hvc2VuVHlwZXMubGVuZ3RoOyBpKyspewotCQkJaWYgKCBjaG9zZW5UeXBlc1tpXSBpbnN0YW5jZW9mIENvbXBvbmVudFNwZWNpZmljYXRpb24pewotCQkJCUNvbXBvbmVudFNwZWNpZmljYXRpb24gYVR5cGUgPSAKLQkJCQkJKENvbXBvbmVudFNwZWNpZmljYXRpb24pIGNob3NlblR5cGVzW2ldOwotCi0JCQkJcmV0dXJuaW5nTGlzdCArPSBhVHlwZS5nZXROYW1lKCkgKyBDVVNUT01fTElTVF9TRVBBUkFUT1I7Ci0JCQl9Ci0JCQkvKiBlbHNlIHNlbGVjdGVkQnVpbHRJblR5cGVzW2ldIGluc3RhbmNlb2YgTGlzdCwgaWUuIGEgcGFyZW50Tm9kZQotCQkJICogd2UgaWdub3JlIGl0LiAqLwotCQl9Ci0JCXJldHVybiByZXR1cm5pbmdMaXN0OwotCX0KLQkKLQkvKioKLQkgKiBGaWx0ZXJzIG91dCBhbGwgYnVpbHQtSW4gdHlwZSBub3QgcmVjb3JkZWQgaW4gdGhlICdsaXN0U3RyaW5nJyBhbmQgCi0JICogcmV0dXJucyB0aGUgcmVzdWx0IGluIGEgTGlzdAotCSAqIFdhcm5pbmc6IHJlY3Vyc2l2ZSBtZXRob2QKLQkgKiBAcGFyYW0gbGlzdFN0cmluZyAKLQkgKiBAcGFyYW0gYUNvbnRhaW5lciAKLQkgKiAJCQlDb250YWluaW5nIGFsbCB0eXBlcwotCSAqIEByZXR1cm4gYSBzdWJzZXQgb2Ygd2hhdCAnYUNvbnRhaW5lcicgaGFzIGFzIHNwZWNpZmllZCBieSAnbGlzdFN0cmluZycKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0U2VsZWN0ZWRCdWlsdEluVHlwZXNGcm9tU3RyaW5nKFN0cmluZyBsaXN0U3RyaW5nLCAKLQkJCUxpc3QgYUNvbnRhaW5lcikgewotCQlMaXN0IHNlbGVjdGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gaWdub3JlIHRoZSAnaGVhZGVyJyBpdGVtIGluIHRoZSBjb250YWluZXIsIHN0YXJ0aW5nIGZyb20gaSA9IDEKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBhQ29udGFpbmVyLnNpemUoKTsgaSsrKXsKLQkJCU9iamVjdCBvID0gYUNvbnRhaW5lci5nZXQoaSk7Ci0JCQlpZiAoIG8gaW5zdGFuY2VvZiBDb21wb25lbnRTcGVjaWZpY2F0aW9uKXsKLQkJCQlDb21wb25lbnRTcGVjaWZpY2F0aW9uIGFUeXBlID0gKENvbXBvbmVudFNwZWNpZmljYXRpb24pIG87Ci0JCQkJU3RyaW5nIHR5cGVOYW1lID0gYVR5cGUuZ2V0TmFtZSgpOwotCQkJCS8vIGlmIHR5cGVOYW1lJ3MgbmFtZSBhcHBlYXJzIGluICdsaXN0U3RyaW5nJwotCQkJCWlmICggbGlzdFN0cmluZy5pbmRleE9mKHR5cGVOYW1lICsgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SKSAhPSAtMSkKLQkJCQkJc2VsZWN0ZWRUeXBlcy5hZGQobyk7Ci0JCQl9Ci0JCQllbHNlIGlmICggbyBpbnN0YW5jZW9mIExpc3QpewotCQkJCXNlbGVjdGVkVHlwZXMuYWRkQWxsKCBnZXRTZWxlY3RlZEJ1aWx0SW5UeXBlc0Zyb21TdHJpbmcobGlzdFN0cmluZywgKExpc3QpIG8pICk7IAotCQkJfQotCQl9Ci0JCXJldHVybiBzZWxlY3RlZFR5cGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvWFNER3JhcGhWaWV3ZXJEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2RpYWxvZ3MvWFNER3JhcGhWaWV3ZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE2NmUyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9kaWFsb2dzL1hTREdyYXBoVmlld2VyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlBvcHVwRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSUh5cGVybGlua0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5Sb290Q29udGVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXMuVHlwZVZpekZpZ3VyZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuWFNERWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFhTREdyYXBoVmlld2VyRGlhbG9nIGV4dGVuZHMgUG9wdXBEaWFsb2cKLXsKLSAgcHJvdGVjdGVkIE9iamVjdCBtb2RlbDsKLSAgcHJvdGVjdGVkIFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlciB2aWV3ZXI7Ci0gIHByb3RlY3RlZCBJT3BlbkluTmV3RWRpdG9yIG9wZW5Jbk5ld0VkaXRvckhlbHBlcjsKLSAgcHJpdmF0ZSBPcGVuRWRpdG9yTGlua0xpc3RlbmVyIGxpbmtMaXN0ZW5lcjsKLSAgcHJpdmF0ZSBMYWJlbCBuc0luZm9MYWJlbDsKLSAgcHJpdmF0ZSBIeXBlcmxpbmsgbGluazsKLSAgcHJpdmF0ZSBTdHJpbmcgaW5mb1RleHQ7Ci0gIHByaXZhdGUgRm9udCBpbmZvRm9udDsKLSAgcHJpdmF0ZSBTdHJpbmcgdW5pcXVlSUQ7Ci0gIHByaXZhdGUgUHJldmlld0NvbnRyb2xMaXN0ZW5lciBtb3ZlTGlzdGVuZXI7Ci0gIAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWF9PUklHSU4gPSAiRElBTE9HX1hfT1JJR0lOIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWV9PUklHSU4gPSAiRElBTE9HX1lfT1JJR0lOIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGJvb2xlYW4gaXNIaWdoQ29udHJhc3QgPSBmYWxzZTsKLQotICBwdWJsaWMgWFNER3JhcGhWaWV3ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZVRleHQsIFN0cmluZyBpbmZvVGV4dCwgT2JqZWN0IG1vZGVsLCBTdHJpbmcgSUQpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCwgSE9WRVJfU0hFTExTVFlMRSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRpdGxlVGV4dCwgaW5mb1RleHQpOwotICAgIHNldE1vZGVsKG1vZGVsKTsKLSAgICBsaW5rTGlzdGVuZXIgPSBuZXcgT3BlbkVkaXRvckxpbmtMaXN0ZW5lcigpOwotICAgIHRoaXMuaW5mb1RleHQgPSBpbmZvVGV4dDsKLSAgICB0aGlzLnVuaXF1ZUlEID0gSUQ7Ci0gICAgQXNzZXJ0LmlzVHJ1ZShJRCAhPSBudWxsICYmIElELmxlbmd0aCgpID4gMCk7ICAgIAotICAgIG1vdmVMaXN0ZW5lciA9IG5ldyBQcmV2aWV3Q29udHJvbExpc3RlbmVyKCk7Ci0gICAgdHJ5IAotICAgIHsKLSAgICAgIGlzSGlnaENvbnRyYXN0ID0gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0SGlnaENvbnRyYXN0KCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgLy8gaWdub3JlIAotICAgIH0KLSAgICBjcmVhdGUoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE9wZW5FeHRlcm5hbEVkaXRvcihJT3BlbkluTmV3RWRpdG9yIGhlbHBlcikKLSAgewotICAgIHRoaXMub3BlbkluTmV3RWRpdG9ySGVscGVyID0gaGVscGVyOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBmaWxsRGlhbG9nTWVudShJTWVudU1hbmFnZXIgZGlhbG9nTWVudSkKLSAgewotICAgIHN1cGVyLmZpbGxEaWFsb2dNZW51KGRpYWxvZ01lbnUpOwotICAgIGRpYWxvZ01lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgZGlhbG9nTWVudS5hZGQobmV3IFNldE9wZW5JbkVkaXRvcigpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIHZpZXdlciA9IG5ldyBTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIoKTsKLSAgICBDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLSAgICBpZiAoaXNIaWdoQ29udHJhc3QpCi0gICAgewotICAgICAgYy5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9CQUNLR1JPVU5EKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjLnNldEJhY2tncm91bmQoQ29sb3JDb25zdGFudHMud2hpdGUpOwotICAgIH0KLSAgICBjLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQotICAgIFJvb3RFZGl0UGFydCByb290ID0gbmV3IFJvb3RFZGl0UGFydCgpOwotICAgIHZpZXdlci5zZXRSb290RWRpdFBhcnQocm9vdCk7Ci0KLSAgICB2aWV3ZXIuY3JlYXRlQ29udHJvbChjKTsKLSAgICBpZiAoaXNIaWdoQ29udHJhc3QpCi0gICAgewotICAgICAgdmlld2VyLmdldENvbnRyb2woKS5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9CQUNLR1JPVU5EKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldEJhY2tncm91bmQoQ29sb3JDb25zdGFudHMud2hpdGUpOwotICAgIH0KLSAgICBFZGl0UGFydEZhY3RvcnkgZWRpdFBhcnRGYWN0b3J5ID0gbmV3IFhTREVkaXRQYXJ0RmFjdG9yeShuZXcgVHlwZVZpekZpZ3VyZUZhY3RvcnkoKSk7Ci0gICAgdmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShlZGl0UGFydEZhY3RvcnkpOwotCi0gICAgUm9vdENvbnRlbnRFZGl0UGFydCByb290Q29udGVudEVkaXRQYXJ0ID0gbmV3IFJvb3RDb250ZW50RWRpdFBhcnQoKTsKLSAgICByb290Q29udGVudEVkaXRQYXJ0LnNldE1vZGVsKG1vZGVsKTsKLSAgICB2aWV3ZXIuc2V0Q29udGVudHMocm9vdENvbnRlbnRFZGl0UGFydCk7Ci0gICAgCi0gICAgZ2V0U2hlbGwoKS5hZGRDb250cm9sTGlzdGVuZXIobW92ZUxpc3RlbmVyKTsKLSAgICByZXR1cm4gYzsKLSAgfQotICAKLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlSW5mb1RleHRBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgaW5mb0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBpbmZvQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIGluZm9Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICBuc0luZm9MYWJlbCA9IG5ldyBMYWJlbChpbmZvQ29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0gICAgbnNJbmZvTGFiZWwuc2V0VGV4dChpbmZvVGV4dCk7Ci0KLSAgICBGb250IGZvbnQgPSBuc0luZm9MYWJlbC5nZXRGb250KCk7Ci0gICAgRm9udERhdGFbXSBmb250RGF0YXMgPSBmb250LmdldEZvbnREYXRhKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb250RGF0YXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgZm9udERhdGFzW2ldLnNldEhlaWdodChmb250RGF0YXNbaV0uZ2V0SGVpZ2h0KCkgKiA5IC8gMTApOwotICAgIH0KLSAgICBpbmZvRm9udCA9IG5ldyBGb250KG5zSW5mb0xhYmVsLmdldERpc3BsYXkoKSwgZm9udERhdGFzKTsKLSAgICBuc0luZm9MYWJlbC5zZXRGb250KGluZm9Gb250KTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgbnNJbmZvTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgbnNJbmZvTGFiZWwuc2V0Rm9yZWdyb3VuZChwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfREFSS19TSEFET1cpKTsKLQotICAgIGxpbmsgPSBuZXcgSHlwZXJsaW5rKGluZm9Db21wb3NpdGUsIFNXVC5SSUdIVCk7Ci0gICAgbGluay5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fT1BFTl9JTl9ORVdfRURJVE9SKTsKLSAgICBsaW5rLnNldEZvbnQoaW5mb0ZvbnQpOwotICAgIGxpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobGlua0xpc3RlbmVyKTsKLSAgICByZXR1cm4gaW5mb0NvbXBvc2l0ZTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNldE1vZGVsKE9iamVjdCBtb2RlbCkKLSAgewotICAgIEFzc2VydC5pc1RydWUobW9kZWwgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCk7Ci0gICAgdGhpcy5tb2RlbCA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBtb2RlbCk7Ci0gIH0KLSAgICAKLSAgcHJvdGVjdGVkIGNsYXNzIFNldE9wZW5JbkVkaXRvciBleHRlbmRzIEFjdGlvbgotICB7Ci0gICAgcHVibGljIFNldE9wZW5JbkVkaXRvcigpCi0gICAgewotICAgICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9PUEVOX0lOX05FV19FRElUT1IpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgIHsKLSAgICAgIGlmIChvcGVuSW5OZXdFZGl0b3JIZWxwZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBvcGVuSW5OZXdFZGl0b3JIZWxwZXIub3BlblhTREVkaXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkKLSAgewotICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncz0gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpLmdldFNlY3Rpb24odW5pcXVlSUQpOwotICAgIGlmIChzZXR0aW5ncyA9PSBudWxsKQotICAgICAgc2V0dGluZ3M9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKS5hZGROZXdTZWN0aW9uKHVuaXF1ZUlEKTsKLQotICAgIHJldHVybiBzZXR0aW5nczsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFBvaW50IGdldEluaXRpYWxMb2NhdGlvbihQb2ludCBpbml0aWFsU2l6ZSkKLSAgewotICAgIFBvaW50IHJlc3VsdCA9IHN1cGVyLmdldEluaXRpYWxMb2NhdGlvbihpbml0aWFsU2l6ZSk7Ci0KLSAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotICAgIGlmIChzZXR0aW5ncyAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSB1bmlxdWVJRCA9PSBudWxsID8gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgOiB1bmlxdWVJRDsKLSAgICAgICAgaW50IHggPSBzZXR0aW5ncy5nZXRJbnQocHJlZml4ICsgWF9PUklHSU4pOwotICAgICAgICBpbnQgeSA9IHNldHRpbmdzLmdldEludChwcmVmaXggKyBZX09SSUdJTik7Ci0gICAgICAgIHJlc3VsdCA9IG5ldyBQb2ludCh4LCB5KTsKLSAgICAgICAgU2hlbGwgcGFyZW50ID0gZ2V0UGFyZW50U2hlbGwoKTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgUG9pbnQgcGFyZW50TG9jYXRpb24gPSBwYXJlbnQuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICByZXN1bHQueCArPSBwYXJlbnRMb2NhdGlvbi54OwotICAgICAgICAgIHJlc3VsdC55ICs9IHBhcmVudExvY2F0aW9uLnk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNhdmVEaWFsb2dCb3VuZHMoU2hlbGwgc2hlbGwpCi0gIHsKLSAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotICAgIGlmIChzZXR0aW5ncyAhPSBudWxsKQotICAgIHsKLSAgICAgIFBvaW50IHNoZWxsTG9jYXRpb24gPSBzaGVsbC5nZXRMb2NhdGlvbigpOwotICAgICAgU2hlbGwgcGFyZW50ID0gZ2V0UGFyZW50U2hlbGwoKTsKLSAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgUG9pbnQgcGFyZW50TG9jYXRpb24gPSBwYXJlbnQuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgc2hlbGxMb2NhdGlvbi54IC09IHBhcmVudExvY2F0aW9uLng7Ci0gICAgICAgIHNoZWxsTG9jYXRpb24ueSAtPSBwYXJlbnRMb2NhdGlvbi55OwotICAgICAgfQotICAgICAgU3RyaW5nIHByZWZpeCA9IHVuaXF1ZUlEID09IG51bGwgPyBnZXRDbGFzcygpLmdldE5hbWUoKSA6IHVuaXF1ZUlEOwotICAgICAgc2V0dGluZ3MucHV0KHByZWZpeCArIFhfT1JJR0lOLCBzaGVsbExvY2F0aW9uLngpOwotICAgICAgc2V0dGluZ3MucHV0KHByZWZpeCArIFlfT1JJR0lOLCBzaGVsbExvY2F0aW9uLnkpOwotICAgIH0KLSAgfQotCi0gIAotICBwdWJsaWMgYm9vbGVhbiBjbG9zZSgpCi0gIHsKLSAgICBnZXRTaGVsbCgpLnJlbW92ZUNvbnRyb2xMaXN0ZW5lcihtb3ZlTGlzdGVuZXIpOwotICAgIGlmIChsaW5rICE9IG51bGwpCi0gICAgICBsaW5rLnJlbW92ZUh5cGVybGlua0xpc3RlbmVyKGxpbmtMaXN0ZW5lcik7Ci0gICAgaWYgKGluZm9Gb250ICE9IG51bGwpCi0gICAgICBpbmZvRm9udC5kaXNwb3NlKCk7Ci0gICAgaW5mb0ZvbnQgPSBudWxsOwotICAgIHJldHVybiBzdXBlci5jbG9zZSgpOwotICB9Ci0gIAotICBwcml2YXRlIGZpbmFsIGNsYXNzIE9wZW5FZGl0b3JMaW5rTGlzdGVuZXIgaW1wbGVtZW50cyBJSHlwZXJsaW5rTGlzdGVuZXIKLSAgewotCi0gICAgcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKQotICAgIHsKLSAgICAgIG5ldyBTZXRPcGVuSW5FZGl0b3IoKS5ydW4oKTsKLSAgICAgIGNsb3NlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbGlua0VudGVyZWQoSHlwZXJsaW5rRXZlbnQgZSkKLSAgICB7Ci0gICAgICBsaW5rLnNldEZvcmVncm91bmQoQ29sb3JDb25zdGFudHMubGlnaHRCbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsaW5rRXhpdGVkKEh5cGVybGlua0V2ZW50IGUpCi0gICAgewotICAgICAgbGluay5zZXRGb3JlZ3JvdW5kKGxpbmsuZ2V0UGFyZW50KCkuZ2V0Rm9yZWdyb3VuZCgpKTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBjbGFzcyBQcmV2aWV3Q29udHJvbExpc3RlbmVyIGltcGxlbWVudHMgQ29udHJvbExpc3RlbmVyCi0gIHsKLQotICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xNb3ZlZChDb250cm9sRXZlbnQgZSkKLSAgICB7Ci0gICAgICBzYXZlRGlhbG9nQm91bmRzKGdldFNoZWxsKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKQotICAgIHsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS4yLjEwMQotICAgKiBAcGFyYW0geHNkQ29tcG9uZW50Ci0gICAqIEBwYXJhbSBzY2hlbWEKLSAgICogQHBhcmFtIGVkaXRvck5hbWUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuTm9uWFNEUmVzb3VyY2VTY2hlbWEoWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcG9uZW50LCBYU0RTY2hlbWEgc2NoZW1hLCBTdHJpbmcgZWRpdG9yTmFtZSkKLSAgewotICAgIG9wZW5JbmxpbmVTY2hlbWEoZ2V0Q3VycmVudEVkaXRvcklucHV0KCksIHhzZENvbXBvbmVudCwgc2NoZW1hLCBlZGl0b3JOYW1lKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW5JbmxpbmVTY2hlbWEoSUVkaXRvcklucHV0IGVkaXRvcklucHV0LCBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wb25lbnQsIFhTRFNjaGVtYSBzY2hlbWEsIFN0cmluZyBlZGl0b3JOYW1lKQotICB7Ci0gICAgT3BlbkluTmV3RWRpdG9yLm9wZW5JbmxpbmVTY2hlbWEoZWRpdG9ySW5wdXQsIHhzZENvbXBvbmVudCwgc2NoZW1hLCBlZGl0b3JOYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW5YU0RFZGl0b3IoWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcG9uZW50KQotICB7Ci0gICAgb3BlblhTREVkaXRvcihnZXRDdXJyZW50RWRpdG9ySW5wdXQoKSwgeHNkQ29tcG9uZW50LmdldFNjaGVtYSgpLCB4c2RDb21wb25lbnQpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW5YU0RFZGl0b3IoSUVkaXRvcklucHV0IGVkaXRvcklucHV0LCBYU0RTY2hlbWEgc2NoZW1hLCBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wb25lbnQpCi0gIHsKLSAgICBPcGVuSW5OZXdFZGl0b3Iub3BlblhTREVkaXRvcihlZGl0b3JJbnB1dCwgc2NoZW1hLCB4c2RDb21wb25lbnQpOwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBJRWRpdG9ySW5wdXQgZ2V0Q3VycmVudEVkaXRvcklucHV0KCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBudWxsOwotICAgICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotICAgICAgewotICAgICAgICBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgIGlmIChlZGl0b3JQYXJ0ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIAotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL0Jhc2VIeXBlcmxpbmtEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL0Jhc2VIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDQzMTYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9CYXNlSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuQWJzdHJhY3RIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGh5cGVybGlua3MgZGV0ZWN0b3JzLiBQcm92aWRlcyBhIGZyYW1ld29yayBhbmQgY29tbW9uIGNvZGUgZm9yCi0gKiBoeXBlcmxpbmsgZGV0ZWN0b3JzLiBUT0RPOiBDYW4gd2UgcHVsbCB0aGlzIGNsYXNzIGZ1cnRoZXIgdXAgdGhlIGluaGVyaXRhbmNlCi0gKiBoaWVyYXJjaHk/Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlSHlwZXJsaW5rRGV0ZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdEh5cGVybGlua0RldGVjdG9yCi17Ci0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICovCi0gIHB1YmxpYyBJSHlwZXJsaW5rW10gZGV0ZWN0SHlwZXJsaW5rcyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHJlZ2lvbiwgYm9vbGVhbiBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKQotICB7Ci0gICAgaWYgKHJlZ2lvbiA9PSBudWxsIHx8IHRleHRWaWV3ZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBMaXN0IGh5cGVybGlua3MgPSBuZXcgQXJyYXlMaXN0KDApOwotICAgIElEb2N1bWVudCBkb2N1bWVudCA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLSAgICBpbnQgb2Zmc2V0ID0gcmVnaW9uLmdldE9mZnNldCgpOwotCi0gICAgSURPTU5vZGUgbm9kZSA9IGdldEN1cnJlbnROb2RlKGRvY3VtZW50LCBvZmZzZXQpOwotCi0gICAgLy8gVGhpcyBjYWxsIGFsbG93cyB1cyB0byBkZXRlcm1pbmUgd2hldGhlciBhbiBhdHRyaWJ1dGUgaXMgbGlua2FibGUsCi0gICAgLy8gd2l0aG91dCBpbmN1cnJpbmcgdGhlIGNvc3Qgb2YgYXNraW5nIGZvciB0aGUgdGFyZ2V0IGNvbXBvbmVudC4KLQotICAgIGlmICghaXNMaW5rYWJsZShub2RlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiA9IGdldEh5cGVybGlua1JlZ2lvbihub2RlKTsKLQotICAgIC8vIGNyZWF0ZUh5cGVybGluayBpcyBhIHRlbXBsYXRlIG1ldGhvZC4gRGVyaXZlZCBjbGFzc2VzLCBzaG91bGQgb3ZlcnJpZGUuCi0KLSAgICBJSHlwZXJsaW5rIGh5cGVybGluayA9IGNyZWF0ZUh5cGVybGluayhkb2N1bWVudCwgbm9kZSwgaHlwZXJsaW5rUmVnaW9uKTsKLQotICAgIGlmIChoeXBlcmxpbmsgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBoeXBlcmxpbmtzLmFkZChoeXBlcmxpbmspOwotICAgIH0KLQotICAgIGlmIChoeXBlcmxpbmtzLnNpemUoKSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHJldHVybiAoSUh5cGVybGlua1tdKSBoeXBlcmxpbmtzLnRvQXJyYXkobmV3IElIeXBlcmxpbmtbMF0pOwotICB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZXMgd2hldGhlciBhIG5vZGUgaXMgImxpbmthYmxlIiB0aGF0IGlzLCB0aGUgY29tcG9uZW50IGl0IHJlZmVycyB0bwotICAgKiBjYW4gYmUgdGhlIHRhcmdldCBvZiBhICJnbyB0byBkZWZpbml0aW9uIiBuYXZpZ2F0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdGVzdCwgbXVzdCBub3QgYmUgbnVsbDsKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBub2RlIGlzIGxpbmthYmxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNMaW5rYWJsZShJRE9NTm9kZSBub2RlKQotICB7Ci0gICAgaWYgKG5vZGUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0KLSAgICBib29sZWFuIGlzTGlua2FibGUgPSBmYWxzZTsKLQotICAgIGlmIChub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotICAgIHsKLSAgICAgIElET01BdHRyIGF0dHIgPSAoSURPTUF0dHIpIG5vZGU7Ci0gICAgICBTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCi0gICAgICAvLyBpc0xpbmthYmxlQXR0cmlidXRlIGlzIGEgdGVtcGxhdGUgbWV0aG9kLiBEZXJpdmVkIGNsYXNzZXMgc2hvdWxkCi0gICAgICAvLyBvdmVycmlkZS4KLQotICAgICAgaXNMaW5rYWJsZSA9IGlzTGlua2FibGVBdHRyaWJ1dGUobmFtZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGlzTGlua2FibGU7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGF0dHJpYnV0ZSBpcyAibGlua2FibGUiIHRoYXQgaXMsIHRoZSBjb21wb25lbnQgaXQKLSAgICogcG9pbnRzIHRvIGNhbiBiZSB0aGUgdGFyZ2V0IG9mIGEgImdvIHRvIGRlZmluaXRpb24iIG5hdmlnYXRpb24uIERlcml2ZWQKLSAgICogY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZSB0aGUgYXR0cmlidXRlIG5hbWUuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIGxpbmthYmxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc0xpbmthYmxlQXR0cmlidXRlKFN0cmluZyBuYW1lKTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIGh5cGVybGluayBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgbm9kZS4gRGVyaXZlZCBjbGFzc2VzIHNob3VsZAotICAgKiBvdmVycmlkZS4KLSAgICogCi0gICAqIEBwYXJhbSBkb2N1bWVudCB0aGUgc291cmNlIGRvY3VtZW50LgotICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB1bmRlciB0aGUgY3Vyc29yLgotICAgKiBAcGFyYW0gcmVnaW9uIHRoZSB0ZXh0IHJlZ2lvbiB0byB1c2UgdG8gY3JlYXRlIHRoZSBoeXBlcmxpbmsuCi0gICAqIEByZXR1cm4gYSBuZXcgSUh5cGVybGluayBmb3IgdGhlIG5vZGUgb3IgbnVsbCBpZiBvbmUgY2Fubm90IGJlIGNyZWF0ZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgSUh5cGVybGluayBjcmVhdGVIeXBlcmxpbmsoSURvY3VtZW50IGRvY3VtZW50LCBJRE9NTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbik7Ci0KLSAgLyoqCi0gICAqIExvY2F0ZXMgdGhlIGF0dHJpYnV0ZSBub2RlIHVuZGVyIHRoZSBjdXJzb3IuCi0gICAqIAotICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBjdXJzb3Igb2Zmc2V0LgotICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgbm9kZQotICAgKiBAcmV0dXJuIGFuIElET01Ob2RlIHJlcHJlc2VudGluZyB0aGUgYXR0cmlidXRlIGlmIG9uZSBpcyBmb3VuZCBhdCB0aGUKLSAgICogICAgICAgICBvZmZzZXQgb3IgbnVsbCBvdGhlcndpc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgSURPTU5vZGUgZ2V0QXR0cmlidXRlTm9kZShpbnQgb2Zmc2V0LCBJRE9NTm9kZSBwYXJlbnQpCi0gIHsKLSAgICBJRE9NQXR0ciBhdHRyTm9kZSA9IG51bGw7Ci0gICAgTmFtZWROb2RlTWFwIG1hcCA9IHBhcmVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0KLSAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbWFwLmdldExlbmd0aCgpOyBpbmRleCsrKQotICAgIHsKLSAgICAgIGF0dHJOb2RlID0gKElET01BdHRyKSBtYXAuaXRlbShpbmRleCk7Ci0gICAgICBib29sZWFuIGxvY2F0ZWQgPSBhdHRyTm9kZS5jb250YWlucyhvZmZzZXQpOwotICAgICAgaWYgKGxvY2F0ZWQpCi0gICAgICB7Ci0gICAgICAgIGlmIChhdHRyTm9kZS5oYXNOYW1lT25seSgpKQotICAgICAgICB7Ci0gICAgICAgICAgYXR0ck5vZGUgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChhdHRyTm9kZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotICAgIHJldHVybiBhdHRyTm9kZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBub2RlIHRoZSBjdXJzb3IgaXMgY3VycmVudGx5IG9uIGluIHRoZSBkb2N1bWVudCBvciBudWxsIGlmIG5vCi0gICAqIG5vZGUgaXMgc2VsZWN0ZWQKLSAgICogCi0gICAqIEBwYXJhbSBvZmZzZXQgdGhlIGN1cnJlbnQgY3Vyc29yIG9mZnNldC4KLSAgICogQHJldHVybiBJRE9NTm9kZSBlaXRoZXIgZWxlbWVudCwgZG9jdHlwZSwgdGV4dCwgYXR0cmlidXRlIG9yIG51bGwKLSAgICovCi0gIHByaXZhdGUgSURPTU5vZGUgZ2V0Q3VycmVudE5vZGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KQotICB7Ci0gICAgSW5kZXhlZFJlZ2lvbiBpbm9kZSA9IG51bGw7Ci0gICAgSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0gICAgICBpbm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCk7Ci0gICAgICBpZiAoaW5vZGUgPT0gbnVsbCkKLSAgICAgICAgaW5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQgLSAxKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGlmIChzTW9kZWwgIT0gbnVsbCkKLSAgICAgICAgc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotICAgIH0KLQotICAgIGlmIChpbm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgIElET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGlub2RlOwotCi0gICAgICBpZiAobm9kZS5oYXNBdHRyaWJ1dGVzKCkpCi0gICAgICB7Ci0gICAgICAgIG5vZGUgPSBnZXRBdHRyaWJ1dGVOb2RlKG9mZnNldCwgbm9kZSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbm9kZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHRleHQgcmVnaW9uIGNvcnJlc3BvbmRpbmcgdG8gYW4gSURPTU5vZGUuCi0gICAqIAotICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSBmb3Igd2hpY2ggd2Ugd2FudCB0aGUgdGV4dCByZWdpb24uIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gYW4gSVJlZ2lvbiBmb3IgdGhlIG5vZGUsIG9yIG51bGwgaWYgdGhlIG5vZGUgaXMgbm90IHJlY29nbml6ZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oSURPTU5vZGUgbm9kZSkKLSAgewotICAgIGlmIChub2RlID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgSVJlZ2lvbiBoeXBlclJlZ2lvbiA9IG51bGw7Ci0gICAgc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0KLSAgICBzd2l0Y2ggKG5vZGVUeXBlKQotICAgIHsKLSAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiAKLSAgICAgICAgewotICAgICAgICAgIGh5cGVyUmVnaW9uID0gbmV3IFJlZ2lvbihub2RlLmdldFN0YXJ0T2Zmc2V0KCksIG5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBub2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLSAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6IAotICAgICAgICB7Ci0gICAgICAgICAgSURPTUF0dHIgYXR0ID0gKElET01BdHRyKSBub2RlOwotICAKLSAgICAgICAgICBpbnQgcmVnT2Zmc2V0ID0gYXR0LmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKTsKLSAgCi0gICAgICAgICAgLy8gSVNTVUU6IFdlIGFyZSB1c2luZyBhIGRlcHJlY2F0ZWQgbWV0aG9kIGhlcmUuIElzIHRoZXJlCi0gICAgICAgICAgLy8gYSBiZXR0ZXIgd2F5IHRvIGdldCB3aGF0IHdlIG5lZWQ/Ci0gIAotICAgICAgICAgIElUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gYXR0LmdldFZhbHVlUmVnaW9uKCk7Ci0gICAgICAgICAgaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW50IHJlZ0xlbmd0aCA9IHZhbHVlUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLSAgICAgICAgICAgIFN0cmluZyBhdHRWYWx1ZSA9IGF0dC5nZXRWYWx1ZVJlZ2lvblRleHQoKTsKLSAgCi0gICAgICAgICAgICAvLyBEbyBub3QgaW5jbHVkZSBxdW90ZXMgaW4gYXR0cmlidXRlIHZhbHVlIHJlZ2lvbiBhbmQgb25seQotICAgICAgICAgICAgLy8gdW5kZXJsaW5lIHRoZSBhY3R1YWwgdmFsdWUsIG5vdCB0aGUgcXVvdGVzLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNRdW90ZWQoYXR0VmFsdWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZWdMZW5ndGggPSByZWdMZW5ndGggLSAyOwotICAgICAgICAgICAgICByZWdPZmZzZXQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGh5cGVyUmVnaW9uID0gbmV3IFJlZ2lvbihyZWdPZmZzZXQsIHJlZ0xlbmd0aCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgIC8vIERvIG5vdGhpbmcuCi0gICAgICAgIGJyZWFrOwotICAgIH0KLSAKLSAgICByZXR1cm4gaHlwZXJSZWdpb247Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9JU2VsZWN0aW9uTWFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvSVNlbGVjdGlvbk1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTFjMGZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9JU2VsZWN0aW9uTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVNlbGVjdGlvbk1hcHBlcgotewotICBJU2VsZWN0aW9uIG1hcFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGVkT2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9JbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL0ludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMzlhYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL0ludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLktleVN0cm9rZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkdFRkFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5QcmludEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVBvc3RTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOYXZpZ2F0aW9uTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5hdmlnYXRpb25Mb2NhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLkZpbGVTdG9yZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuSUNvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuQ2F0ZWdvcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkFkZEZpZWxkQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZURpcmVjdEVkaXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2V0SW5wdXRUb0dyYXBoVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uSUtleWJvYXJkRHJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLlJvb3RDb250ZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLkFEVE11bHRpUGFnZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuRWRpdG9yTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuRWRpdG9yTW9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLklBRFRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuQURUQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouVHlwZVZpekVkaXRvck1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBbnlBdHRyaWJ1dGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBbnlFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNETW9kZWxHcm91cEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEU2NoZW1hRGlyZWN0aXZlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5EZWxldGVYU0RDb25jcmV0ZUNvbXBvbmVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLk9wZW5Jbk5ld0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLlNldE11bHRpcGxpY2l0eUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLlNldFR5cGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5JRG9jdW1lbnRDaGFuZ2VkTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uYXZpZ2F0aW9uLkRlc2lnblZpZXdOYXZpZ2F0aW9uTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uYXZpZ2F0aW9uLk11bHRpUGFnZUVkaXRvclRleHRTZWxlY3Rpb25OYXZpZ2F0aW9uTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC50ZXh0LlhTRE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWxzLk9wZW5PblNlbGVjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb3NpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IgZXh0ZW5kcyBBRFRNdWx0aVBhZ2VFZGl0b3IgaW1wbGVtZW50cyBJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciwgSU5hdmlnYXRpb25Mb2NhdGlvblByb3ZpZGVyCi17Ci0gIC8vIElNb2RlbCBtb2RlbDsKLSAgSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWw7Ci0gIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0gIFhTRE1vZGVsQWRhcHRlciBzY2hlbWFOb2RlQWRhcHRlcjsKLSAgcHJpdmF0ZSBPdXRsaW5lVHJlZVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGZPdXRsaW5lTGlzdGVuZXI7Ci0gIHByaXZhdGUgU291cmNlRWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIgZlNvdXJjZUVkaXRvclNlbGVjdGlvbkxpc3RlbmVyOwotICBwcml2YXRlIFhTRFNlbGVjdGlvbk1hbmFnZXJTZWxlY3Rpb25MaXN0ZW5lciBmWFNEU2VsZWN0aW9uTGlzdGVuZXI7Ci0gIHByaXZhdGUgSW50ZXJuYWxEb2N1bWVudENoYW5nZWROb3RpZmllciBpbnRlcm5hbERvY3VtZW50Q2hhbmdlZE5vdGlmaWVyID0gbmV3IEludGVybmFsRG9jdW1lbnRDaGFuZ2VkTm90aWZpZXIoKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRF9FRElUT1JfTU9ERV9FWFRFTlNJT05fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5lZGl0b3JNb2RlcyI7IC8vJE5PTi1OTFMtTiQgCi0gIHByaXZhdGUgWFNEUHJlZmVyZW5jZVN0b3JlTGlzdGVuZXIgeHNkUHJlZmVyZW5jZVN0b3JlTGlzdGVuZXI7Ci0gIAotICBjbGFzcyBJbnRlcm5hbERvY3VtZW50Q2hhbmdlZE5vdGlmaWVyIGltcGxlbWVudHMgSURvY3VtZW50Q2hhbmdlZE5vdGlmaWVyCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vZGVBZGFwdGVyIGFkYXB0ZXIpCi0gICAgewotICAgICAgbGlzdC5hZGQoYWRhcHRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vZGVBZGFwdGVyIGFkYXB0ZXIpCi0gICAgewotICAgICAgbGlzdC5yZW1vdmUoYWRhcHRlcik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUxpc3RlbmVycyhJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKQotICAgIHsKLSAgICAgIExpc3QgY2xvbmUgPSBuZXcgQXJyYXlMaXN0KGxpc3Quc2l6ZSgpKTsgICAgIAotICAgICAgY2xvbmUuYWRkQWxsKGxpc3QpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gY2xvbmUuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU5vZGVBZGFwdGVyKWkubmV4dCgpOwotICAgICAgICBhZGFwdGVyLm5vdGlmeUNoYW5nZWQobm90aWZpZXIsIGV2ZW50VHlwZSwgY2hhbmdlZEZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgcG9zKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHNldElucHV0VG9HcmFwaGljYWxWaWV3ZXIoSURvY3VtZW50IG5ld0RvY3VtZW50KQotICB7Ci0gICAgSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIG9ubHkgc2V0IGlucHV0IGlmIHN0cnVjdHVyZWQgbW9kZWwgYWxyZWFkeSBleGlzdHMKLSAgICAgIC8vIChtZWFuaW5nIHNvdXJjZSBlZGl0b3IgaXMgYWxyZWFkeSBtYW5hZ2luZyB0aGUgbW9kZWwpCi0gICAgICBzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKG5ld0RvY3VtZW50KTsKLSAgICAgIGlmICgoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpICYmIChzdHJ1Y3R1cmVkTW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpKQotICAgICAgewotICAgICAgICBEb2N1bWVudCBkb2MgPSAoKElET01Nb2RlbCkgc3RydWN0dXJlZE1vZGVsKS5nZXREb2N1bWVudCgpOwotICAgICAgICBpZiAoZG9jICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RNb2RlbEFkYXB0ZXIgbW9kZWxBZGFwdGVyID0gWFNETW9kZWxBZGFwdGVyLmxvb2t1cE9yQ3JlYXRlTW9kZWxBZGFwdGVyKGRvYyk7Ci0gICAgICAgICAgaWYgKG1vZGVsQWRhcHRlciAhPSBudWxsKSAvLyBBc3NlcnQgc2hvdWxkIG5vdCBiZSBudWxsCi0gICAgICAgICAgewotICAgICAgICAgICAgbW9kZWxBZGFwdGVyLnNldFNjaGVtYSh4c2RTY2hlbWEpOwotICAgICAgICAgICAgeHNkU2NoZW1hID0gbW9kZWxBZGFwdGVyLnJlc2V0U2NoZW1hKGRvYyk7Ci0gICAgICAgICAgICBtb2RlbCA9IChJTW9kZWwpIFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoeHNkU2NoZW1hKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAKLSAgcHVibGljIElNb2RlbCBidWlsZE1vZGVsKCkKLSAgewotICAgIHRyeQotICAgIHsgICAgICAKLSAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0gICAgICAKLSAgICAgIC8vIElmIHRoZSBpbnB1dCBzY2hlbWEgaXMgZnJvbSB0aGUgV1NETCBFZGl0b3IsIHRoZW4gdXNlIHRoYXQgaW5saW5lIHNjaGVtYQotICAgICAgaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUFEVEVkaXRvcklucHV0KQotICAgICAgewotICAgICAgICB4c2RTY2hlbWEgPSAoKElBRFRFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQpLmdldFNjaGVtYSgpOwotICAgICAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgbW9kZWwgPSAoSU1vZGVsKSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KHhzZFNjaGVtYSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgIElEb2N1bWVudCBkb2MgPSBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgICBpZiAoZG9jIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkKLSAgICAgIHsKLSAgICAgICAgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgIC8vIFRPRE86IGZvciBTdG9yYWdlRWRpdG9ySW5wdXRzLCBzaG91bGQgYmUgZm9yUmVhZAotICAgICAgICAgIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2MpOwotICAgICAgICAgIGlmIChtb2RlbCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvYyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRvY3VtZW50ID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGlmIChtb2RlbCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgQXNzZXJ0LmlzTm90TnVsbChkb2N1bWVudCk7Ci0KLSAgICAgIGlmIChtb2RlbCAhPSBudWxsKQotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgICAKLSAgICAgIHhzZFNjaGVtYSA9IFhTRE1vZGVsQWRhcHRlci5sb29rdXBPckNyZWF0ZVNjaGVtYShkb2N1bWVudCk7Ci0gICAgICBtb2RlbCA9IChJTW9kZWwpIFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoeHNkU2NoZW1hKTsgICAgICAgICAgICAgIAotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotCi0gICAgfQotICAgIAotLy8gICAgdHJ5Ci0vLyAgICB7Ci0vLyAgICAgIEVQYWNrYWdlLlJlZ2lzdHJ5IHJlZyA9IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFOwotLy8gICAgICBYU0RQYWNrYWdlIHhzZFBhY2thZ2UgPSAoWFNEUGFja2FnZSkgcmVnLmdldEVQYWNrYWdlKFhTRFBhY2thZ2UuZU5TX1VSSSk7Ci0vLyAgICAgIHhzZFNjaGVtYSA9IHhzZFBhY2thZ2UuZ2V0WFNERmFjdG9yeSgpLmNyZWF0ZVhTRFNjaGVtYSgpOwotLy8gICAgICByZXNvdXJjZVNldCA9IFhTRFNjaGVtYUltcGwuY3JlYXRlUmVzb3VyY2VTZXQoKTsKLS8vICAgICAgSUZpbGUgcmVzb3VyY2VGaWxlID0gZWRpdG9ySW5wdXQuZ2V0RmlsZSgpOwotLy8gICAgICBzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChyZXNvdXJjZUZpbGUpOwotLy8gICAgICAvLyBJZiB0aGUgcmVzb3VyY2UgaXMgaW4gdGhlIHdvcmtzcGFjZS4uLi4KLS8vICAgICAgLy8gb3RoZXJ3aXNlIHRoZSB1c2VyIGlzIHRyeWluZyB0byBvcGVuIGFuIGV4dGVybmFsIGZpbGUKLS8vICAgICAgaWYgKHJlc291cmNlRmlsZSAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgICAgU3RyaW5nIHBhdGhOYW1lID0gcmVzb3VyY2VGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLS8vICAgICAgICB4c2RSZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHBhdGhOYW1lKSwgdHJ1ZSk7Ci0vLyAgICAgICAgcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKHhzZFJlc291cmNlKTsKLS8vICAgICAgICBPYmplY3Qgb2JqID0geHNkUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0vLyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICB4c2RTY2hlbWEgPSAoWFNEU2NoZW1hKSBvYmo7Ci0vLyAgICAgICAgICB4c2RTY2hlbWEuc2V0RWxlbWVudCgoKElET01Nb2RlbCkgc3RydWN0dXJlZE1vZGVsKS5nZXREb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpKTsKLS8vICAgICAgICAgIG1vZGVsID0gKElNb2RlbCkgWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCh4c2RTY2hlbWEpOwotLy8gICAgICAgIH0KLS8vICAgICAgICAKLS8vICAgICAgICAvLyBJZiB0aGUgaW5wdXQgc2NoZW1hIGlzIGZyb20gdGhlIFdTREwgRWRpdG9yLCB0aGVuIHVzZSB0aGF0IGlubGluZSBzY2hlbWEKLS8vICAgICAgICBpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBYU0RGaWxlRWRpdG9ySW5wdXQpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgeHNkU2NoZW1hID0gKChYU0RGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KS5nZXRTY2hlbWEoKTsKLS8vICAgICAgICAgIG1vZGVsID0gKElNb2RlbCkgWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCh4c2RTY2hlbWEpOwotLy8gICAgICAgIH0KLS8vICAgICAgICBpZiAoeHNkU2NoZW1hLmdldEVsZW1lbnQoKSAhPSBudWxsKQotLy8gICAgICAgICAgCi0vLyAgICAgICAgICAvLyBUT0RPIChjcykgLi4uIHdlIG5lZWQgdG8gbG9vayBpbnRvIHBlcmZvcm1hbmNlIGlzc3VlcyB3aGVuIHdlIGFkZCBlbGVtZW50cwotLy8gICAgICAgICAgLy8gc2VlbXMgdG8gYmUgdGhhdCBmb3JtYXR0aW5nIGlzIGNhdXNpZyBsb3RzIG9mIG5vdGlmaWNhdGlvbiBhbmQgdGhpbmdzIGdldCB0ZXJyaWJseSBzbG93Ci0vLyAgICAgICAgICAvLyBJJ20gc3BlY2lhbGl6aW5nIHRoZSBtZXRob2QgYmVsb3cgdG8gYWRkIGFuIGlzTW9kZWxTdGF0ZUNoYW5naW5nIGNoZWNrIHRoYXQgc2hvdWxkCi0vLyAgICAgICAgICAvLyBoZWxwIGhlcmUgLi4uIGJ1dCB3ZSBuZWVkIHRvIGludmVzdGlnYXRlIGZ1cnRoZXIKLS8vICAgICAgICAgIG5ldyBYU0RNb2RlbFJlY29uY2lsZUFkYXB0ZXIoeHNkU2NoZW1hLmdldEVsZW1lbnQoKS5nZXRPd25lckRvY3VtZW50KCksIHhzZFNjaGVtYSkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTm90aWZ5Q2hhbmdlKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgTm9kZUltcGwpCi0vLyAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgTm9kZUltcGwgbm9kZUltcGwgPSAoTm9kZUltcGwpbm90aWZpZXI7Ci0vLyAgICAgICAgICAgICAgICBpZiAoIW5vZGVJbXBsLmdldE1vZGVsKCkuaXNNb2RlbFN0YXRlQ2hhbmdpbmcoKSkKLS8vICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgCi0vLyAgICAgICAgICAgICAgICAgIHN1cGVyLmhhbmRsZU5vdGlmeUNoYW5nZShub3RpZmllciwgZXZlbnRUeXBlLCBmZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsKLS8vICAgICAgICAgICAgICAgICAgaW50ZXJuYWxEb2N1bWVudENoYW5nZWROb3RpZmllci5ub3RpZnlMaXN0ZW5lcnMobm90aWZpZXIsIGV2ZW50VHlwZSwgZmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBpbmRleCk7Ci0vLyAgICAgICAgICAgICAgICB9ICAKLS8vICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgIH07Ci0vLyAgICAgICAgeHNkUmVzb3VyY2Uuc2V0TW9kaWZpZWQoZmFsc2UpOwotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgICBjYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIGUpCi0vLyAgICB7Ci0vLyAgICB9Ci0vLyAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotLy8gICAgewotLy8gICAgfQotICAgIHJldHVybiBtb2RlbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotICAgIFhTRE1vZGVsQWRhcHRlciBtb2RlbEFkYXB0ZXIgPSBudWxsOwotICAgIElET01Eb2N1bWVudCBkb2MgPSBudWxsOwotICAgIElEb2N1bWVudCBpZG9jID0gc3RydWN0dXJlZFRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGdldEVkaXRvcklucHV0KCkpOwotICAgIGlmIChpZG9jICE9IG51bGwpCi0gICAgewotICAgICAgc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChpZG9jKTsKLSAgICAgIGlmICgoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpICYmIChzdHJ1Y3R1cmVkTW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGlmICgoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpICYmIChzdHJ1Y3R1cmVkTW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGRvYyA9ICgoSURPTU1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWwpLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICBpZiAoZG9jICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1vZGVsQWRhcHRlciA9IChYU0RNb2RlbEFkYXB0ZXIpIGRvYy5nZXRFeGlzdGluZ0FkYXB0ZXIoWFNETW9kZWxBZGFwdGVyLmNsYXNzKTsKLSAgICAgICAgICAgICAgaWYgKG1vZGVsQWRhcHRlciAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG9jLmdldE1vZGVsKCkucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKG1vZGVsQWRhcHRlci5nZXRNb2RlbFJlY29uY2lsZUFkYXB0ZXIoKSk7Ci0gICAgICAgICAgICAgICAgZG9jLnJlbW92ZUFkYXB0ZXIobW9kZWxBZGFwdGVyLmdldE1vZGVsUmVjb25jaWxlQWRhcHRlcigpKTsKLSAgICAgICAgICAgICAgICBkb2MucmVtb3ZlQWRhcHRlcihtb2RlbEFkYXB0ZXIpOwotICAgICAgICAgICAgICAgIG1vZGVsQWRhcHRlci5jbGVhcigpOwotICAgICAgICAgICAgICAgIG1vZGVsQWRhcHRlciA9IG51bGw7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgCi0KLQotICAgIGlmIChmT3V0bGluZVBhZ2UgIT0gbnVsbCkKLSAgICB7Ci0vLyAgICAgIGlmIChmT3V0bGluZVBhZ2UgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UgJiYgZk91dGxpbmVMaXN0ZW5lciAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgICAgKChDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UpIGZPdXRsaW5lUGFnZSkucmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihmT3V0bGluZUxpc3RlbmVyKTsKLS8vICAgICAgfQotICAgICAgaWYgKGZPdXRsaW5lTGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZk91dGxpbmVQYWdlLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmT3V0bGluZUxpc3RlbmVyKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmWFNEU2VsZWN0aW9uTGlzdGVuZXIpOwotICAgIFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih4c2RQcmVmZXJlbmNlU3RvcmVMaXN0ZW5lcik7Ci0gICAgeHNkUHJlZmVyZW5jZVN0b3JlTGlzdGVuZXIgPSBudWxsOwotICAgIHN0cnVjdHVyZWRUZXh0RWRpdG9yLmRpc3Bvc2UoKTsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR3JhcGhpY2FsVmlld2VyKCkKLSAgewotICAgIFJvb3RDb250ZW50RWRpdFBhcnQgcm9vdCA9IG5ldyBSb290Q29udGVudEVkaXRQYXJ0KCk7Ci0gICAgaWYgKCEoZ2V0RWRpdG9ySW5wdXQoKSBpbnN0YW5jZW9mIElBRFRFZGl0b3JJbnB1dCkpCi0gICAgewotICAgICAgcm9vdC5zZXRNb2RlbChtb2RlbCk7Ci0gICAgfQotICAgIGdyYXBoaWNhbFZpZXdlci5zZXRDb250ZW50cyhyb290KTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCkKLSAgewotICAgIHN1cGVyLmNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOwotICAgIGdyYXBoaWNhbFZpZXdlci5nZXRLZXlIYW5kbGVyKCkucHV0KEtleVN0cm9rZS5nZXRQcmVzc2VkKFNXVC5GMiwgMCksIGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKEdFRkFjdGlvbkNvbnN0YW50cy5ESVJFQ1RfRURJVCkpOwotICAgIC8vIGdldCBlZGl0IHBhcnQgZmFjdG9yeSBmcm9tIGV4dGVuc2lvbgotICAgIEVkaXRQYXJ0RmFjdG9yeSBlZGl0UGFydEZhY3RvcnkgPSBnZXRFZGl0b3JNb2RlTWFuYWdlcigpLmdldEN1cnJlbnRNb2RlKCkuZ2V0RWRpdFBhcnRGYWN0b3J5KCk7Ci0gICAgZ3JhcGhpY2FsVmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShlZGl0UGFydEZhY3RvcnkpOyAgIAotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIHR5cGUpCi0gIHsKLSAgICBpZiAodHlwZSA9PSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcykKLSAgICB7Ci0gICAgICBYU0RUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlID0gbmV3IFhTRFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKHRoaXMpOwotICAgICAgcmV0dXJuIHBhZ2U7Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUgPT0gSVNlbGVjdGlvblByb3ZpZGVyLmNsYXNzKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRTZWxlY3Rpb25NYW5hZ2VyKCk7Ci0gICAgfSAgCi0gICAgZWxzZSBpZiAodHlwZSA9PSBYU0RTY2hlbWEuY2xhc3MpCi0gICAgewotICAgICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZSA9PSBJS2V5Ym9hcmREcmFnLmNsYXNzKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgS2V5Ym9hcmREcmFnSW1wbCgpOwotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlID09IElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MpCi0gICAgewotICAgICAgT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5nZXRBZGFwdGVyKHR5cGUpOwotICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSUNvbnRlbnRPdXRsaW5lUGFnZSBwYWdlID0gKElDb250ZW50T3V0bGluZVBhZ2UpIGFkYXB0ZXI7Ci0gICAgICAgIGZPdXRsaW5lTGlzdGVuZXIgPSBuZXcgT3V0bGluZVRyZWVTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpOwotICAgICAgICBwYWdlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmT3V0bGluZUxpc3RlbmVyKTsKLSAgICAgICAgCi0vLyAgICAgICAgaWYgKHBhZ2UgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgKChDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UpIHBhZ2UpLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIoZk91dGxpbmVMaXN0ZW5lcik7Ci0vLyAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFnZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZSA9PSBYU0RBdHRyaWJ1dGVSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcykKLSAgICB7Ci0gICAgCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0gICAgCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpCi0gICAgCXsKLSAgICAJCUlGaWxlRWRpdG9ySW5wdXQgZmlsZUVkaXRvcklucHV0ID0gKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0OwotICAgIAkJLy8gVE9ETyAoY3MpIGN1cnJlbnRseSB3ZSBhc3N1bWUgdGhlIHNjaGVtYSBlZGl0b3Igd2lsbCBvbmx5IGV2ZXIgZWRpdCBhCi0gICAgCQkvLyBzaW5nbGUgc2NoZW1hCi0gICAgCQkvLy8gYnV0IGlmIHdlIHdhbnQgdG8gZW5hYmxlIHRoZSBzY2hlbWEgZWRpdG9yIHRvIGVkaXQgd3NkbCBmaWxlcyB3ZQotICAgIAkJLy8gc2hvdWxkIHBhc3MgaW4KLSAgICAJCS8vIGFuIGFycmF5IG9mIHNjaGVtYXMKLSAgICAJCS8vIGhtbS4uIHBlcmhhcHMganVzdCBwYXNzIGluIGEgUmVzb3VyY2VTZXQKLSAgICAJCVhTRFNjaGVtYVtdIHNjaGVtYXMgPSB7eHNkU2NoZW1hfTsKLSAgICAJCXJldHVybiBuZXcgWFNEQXR0cmlidXRlUmVmZXJlbmNlRWRpdE1hbmFnZXIoZmlsZUVkaXRvcklucHV0LmdldEZpbGUoKSwgc2NoZW1hcyk7Ci0gICAgCX0KLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZSA9PSBYU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpCi0gICAgewotICAgICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgIGlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpCi0gICAgICB7Ci0gICAgICAgIElGaWxlRWRpdG9ySW5wdXQgZmlsZUVkaXRvcklucHV0ID0gKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0OwotICAgICAgICAvLyBUT0RPIChjcykgY3VycmVudGx5IHdlIGFzc3VtZSB0aGUgc2NoZW1hIGVkaXRvciB3aWxsIG9ubHkgZXZlciBlZGl0IGEKLSAgICAgICAgLy8gc2luZ2xlIHNjaGVtYQotICAgICAgICAvLy8gYnV0IGlmIHdlIHdhbnQgdG8gZW5hYmxlIHRoZSBzY2hlbWEgZWRpdG9yIHRvIGVkaXQgd3NkbCBmaWxlcyB3ZQotICAgICAgICAvLyBzaG91bGQgcGFzcyBpbgotICAgICAgICAvLyBhbiBhcnJheSBvZiBzY2hlbWFzCi0gICAgICAgIC8vIGhtbS4uIHBlcmhhcHMganVzdCBwYXNzIGluIGEgUmVzb3VyY2VTZXQKLSAgICAgICAgWFNEU2NoZW1hW10gc2NoZW1hcyA9IHt4c2RTY2hlbWF9OwotICAgICAgICByZXR1cm4gbmV3IFhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcihmaWxlRWRpdG9ySW5wdXQuZ2V0RmlsZSgpLCBzY2hlbWFzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZSA9PSBYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpCi0gICAgewotICAgICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgIGlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpCi0gICAgICB7Ci0gICAgICAgIElGaWxlRWRpdG9ySW5wdXQgZmlsZUVkaXRvcklucHV0ID0gKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0OwotICAgICAgICAvLyBUT0RPIChjcykgY3VycmVudGx5IHdlIGFzc3VtZSB0aGUgc2NoZW1hIGVkaXRvciB3aWxsIG9ubHkgZXZlciBlZGl0IGEKLSAgICAgICAgLy8gc2luZ2xlIHNjaGVtYQotICAgICAgICAvLyBidXQgaWYgd2Ugd2FudCB0byBlbmFibGUgdGhlIHNjaGVtYSBlZGl0b3IgdG8gZWRpdCB3c2RsIGZpbGVzIHdlCi0gICAgICAgIC8vIHNob3VsZCBwYXNzIGluCi0gICAgICAgIC8vIGFuIGFycmF5IG9mIHNjaGVtYXMKLSAgICAgICAgLy8gaG1tLi4gcGVyaGFwcyBqdXN0IHBhc3MgaW4gYSBSZXNvdXJjZVNldAotICAgICAgICBYU0RTY2hlbWFbXSBzY2hlbWFzID0ge3hzZFNjaGVtYX07Ci0gICAgICAgIHJldHVybiBuZXcgWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyKGZpbGVFZGl0b3JJbnB1dC5nZXRGaWxlKCksIHNjaGVtYXMpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlID09IFhTRENvbXBsZXhUeXBlQmFzZVR5cGVFZGl0TWFuYWdlci5jbGFzcykKLSAgICB7Ci0gICAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotICAgICAgaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkKLSAgICAgIHsKLSAgICAgICAgSUZpbGVFZGl0b3JJbnB1dCBmaWxlRWRpdG9ySW5wdXQgPSAoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQ7Ci0gICAgICAgIC8vIFRPRE8gKGNzKSBjdXJyZW50bHkgd2UgYXNzdW1lIHRoZSBzY2hlbWEgZWRpdG9yIHdpbGwgb25seSBldmVyIGVkaXQgYQotICAgICAgICAvLyBzaW5nbGUgc2NoZW1hCi0gICAgICAgIC8vIGJ1dCBpZiB3ZSB3YW50IHRvIGVuYWJsZSB0aGUgc2NoZW1hIGVkaXRvciB0byBlZGl0IHdzZGwgZmlsZXMgd2UKLSAgICAgICAgLy8gc2hvdWxkIHBhc3MgaW4KLSAgICAgICAgLy8gYW4gYXJyYXkgb2Ygc2NoZW1hcwotICAgICAgICAvLyBobW0uLiBwZXJoYXBzIGp1c3QgcGFzcyBpbiBhIFJlc291cmNlU2V0Ci0gICAgICAgIFhTRFNjaGVtYVtdIHNjaGVtYXMgPSB7eHNkU2NoZW1hfTsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RDb21wbGV4VHlwZUJhc2VUeXBlRWRpdE1hbmFnZXIoZmlsZUVkaXRvcklucHV0LmdldEZpbGUoKSwgc2NoZW1hcyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUgPT0gWFNEU3Vic3RpdHV0aW9uR3JvdXBFZGl0TWFuYWdlci5jbGFzcykKLSAgICB7Ci0gICAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotICAgICAgaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkKLSAgICAgIHsKLSAgICAgICAgSUZpbGVFZGl0b3JJbnB1dCBmaWxlRWRpdG9ySW5wdXQgPSAoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQ7Ci0gICAgICAgIFhTRFNjaGVtYVtdIHNjaGVtYXMgPSB7eHNkU2NoZW1hfTsKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RTdWJzdGl0dXRpb25Hcm91cEVkaXRNYW5hZ2VyKGZpbGVFZGl0b3JJbnB1dC5nZXRGaWxlKCksIHNjaGVtYXMpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlID09IElUZXh0RWRpdG9yLmNsYXNzKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRUZXh0RWRpdG9yKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUgPT0gSVNlbGVjdGlvbk1hcHBlci5jbGFzcykKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFhTRFNlbGVjdGlvbk1hcHBlcigpOwotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlID09IElEb2N1bWVudENoYW5nZWROb3RpZmllci5jbGFzcykKLSAgICB7Ci0gICAgICByZXR1cm4gaW50ZXJuYWxEb2N1bWVudENoYW5nZWROb3RpZmllcjsKLSAgICB9ICAKLSAgICBlbHNlIGlmICh0eXBlID09IFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuY2xhc3MpCi0gICAgewotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKCk7Ci0gICAgfSAgCi0gICAgcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIodHlwZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldENvbnRyaWJ1dG9ySWQoKQotICB7Ci0gICAgcmV0dXJuICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvciI7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0WFNEU2NoZW1hKCkKLSAgewotICAgIHJldHVybiB4c2RTY2hlbWE7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIG9wZW5Pbkdsb2JhbFJlZmVyZW5jZS4gVGhlIGNvbXAgYXJndW1lbnQgaXMgYSByZXNvbHZlZCB4c2Qgc2NoZW1hCi0gICAqIG9iamVjdCBmcm9tIGFub3RoZXIgZmlsZS4gVGhpcyBpcyBjcmVhdGVkIGFuZCBjYWxsZWQgZnJvbSBhbm90aGVyIHNjaGVtYQotICAgKiBtb2RlbCB0byBhbGxvdyBGMyBuYXZpZ2F0aW9uIHRvIG9wZW4gYSBuZXcgZWRpdG9yIGFuZCBjaG9vc2UgdGhlIHJlZmVyZW5jZWQKLSAgICogb2JqZWN0IHdpdGhpbiB0aGF0IGVkaXRvciBjb250ZXh0Ci0gICAqIAotICAgKiBAcGFyYW0gY29tcAotICAgKi8KLSAgcHVibGljIHZvaWQgb3Blbk9uR2xvYmFsUmVmZXJlbmNlKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXApCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBuYW1lZENvbXBvbmVudCA9IG9wZW5PblNlbGVjdGlvbkhlbHBlci5vcGVuT25HbG9iYWxSZWZlcmVuY2UoY29tcCk7Ci0gICAgCi0gICAgaWYgKG5hbWVkQ29tcG9uZW50ID09IG51bGwpCi0gICAgewotICAgICAgbmFtZWRDb21wb25lbnQgPSBnZXRYU0RTY2hlbWEoKTsKLSAgICB9Ci0gICAgWFNEQmFzZUFkYXB0ZXIgYWRhcHRlciA9IChYU0RCYXNlQWRhcHRlcikgWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChuYW1lZENvbXBvbmVudCk7Ci0gICAgZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihhZGFwdGVyKSk7Ci0gICAgSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihTZXRJbnB1dFRvR3JhcGhWaWV3LklEKTsKLSAgICBpZiAoYWN0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgYWN0aW9uLnJ1bigpOwotICAgIH0KLQotICB9Ci0gIAotICBwcm90ZWN0ZWQgT3Blbk9uU2VsZWN0aW9uSGVscGVyIG9wZW5PblNlbGVjdGlvbkhlbHBlcjsKLQotICBwdWJsaWMgT3Blbk9uU2VsZWN0aW9uSGVscGVyIGdldE9wZW5PblNlbGVjdGlvbkhlbHBlcigpCi0gIHsKLSAgICByZXR1cm4gb3Blbk9uU2VsZWN0aW9uSGVscGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgdGhlIHBhZ2VzIG9mIHRoZSBtdWx0aS1wYWdlIGVkaXRvci4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVBhZ2VzKCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZVBhZ2VzKCk7Ci0gICAgCi0vLyAgICBzZWxlY3Rpb25Qcm92aWRlciA9IGdldFNlbGVjdGlvbk1hbmFnZXIoKTsKLS8vICAgIGdldEVkaXRvclNpdGUoKS5zZXRTZWxlY3Rpb25Qcm92aWRlcihzZWxlY3Rpb25Qcm92aWRlcik7Ci0vLyAgICAKLS8vICAgIHN0cnVjdHVyZWRUZXh0RWRpdG9yID0gbmV3IFN0cnVjdHVyZWRUZXh0RWRpdG9yKCk7Ci0vLyAgICBtb2RlbCA9IGJ1aWxkTW9kZWwoKElGaWxlRWRpdG9ySW5wdXQpIGdldEVkaXRvcklucHV0KCkpOwotLy8gICAgY3JlYXRlR3JhcGhQYWdlKCk7Ci0vLyAgICBjcmVhdGVTb3VyY2VQYWdlKCk7Ci0KLSAgICBvcGVuT25TZWxlY3Rpb25IZWxwZXIgPSBuZXcgT3Blbk9uU2VsZWN0aW9uSGVscGVyKGdldFRleHRFZGl0b3IoKSwgZ2V0WFNEU2NoZW1hKCkpOwotCi0gICAgSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0VGV4dEVkaXRvcigpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0gICAgZlNvdXJjZUVkaXRvclNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNvdXJjZUVkaXRvclNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0gICAgaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikKLSAgICB7Ci0gICAgICAoKElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIHByb3ZpZGVyKS5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZTb3VyY2VFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBwcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZlNvdXJjZUVkaXRvclNlbGVjdGlvbkxpc3RlbmVyKTsKLSAgICB9Ci0gICAgZlhTRFNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFhTRFNlbGVjdGlvbk1hbmFnZXJTZWxlY3Rpb25MaXN0ZW5lcigpOwotICAgIGdldFNlbGVjdGlvbk1hbmFnZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZlhTRFNlbGVjdGlvbkxpc3RlbmVyKTsKLSAgICAKLSAgICAvLyBTZWxlY3QgdGhlIHNjaGVtYSB0byBzaG93IHRoZSBwcm9wZXJ0aWVzCi0gICAgZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihnZXRNb2RlbCgpKSk7Ci0gICAgCi0gICAgeHNkUHJlZmVyZW5jZVN0b3JlTGlzdGVuZXIgPSBuZXcgWFNEUHJlZmVyZW5jZVN0b3JlTGlzdGVuZXIoKTsKLSAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoeHNkUHJlZmVyZW5jZVN0b3JlTGlzdGVuZXIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIFhTRFByZWZlcmVuY2VTdG9yZUxpc3RlbmVyIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KQotICAgIHsKLSAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IGV2dC5nZXRQcm9wZXJ0eSgpOwotICAgICAgaWYgKFhTREVkaXRvclBsdWdpbi5DT05TVF9TSE9XX0VYVEVSTkFMUy5lcXVhbHMocHJvcGVydHkpKQotICAgICAgewotICAgICAgICAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBncmFwaGljYWxWaWV3ZXIuZ2V0Q29udGVudHMoKSkuZ2V0RmlndXJlKCkuaW52YWxpZGF0ZVRyZWUoKTsKLSAgICAgICAgZ3JhcGhpY2FsVmlld2VyLmdldENvbnRlbnRzKCkucmVmcmVzaCgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKQotICB7Ci0gICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICByZXR1cm4gIShlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQgfHwgZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBGaWxlU3RvcmVFZGl0b3JJbnB1dCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlQWN0aW9ucygpOwotICAgIAotICAgIEFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0QWN0aW9uUmVnaXN0cnkoKTsKLSAgICAKLSAgICAvLyBhZGQgYW4gaXNSZWFkT25seSBtZXRob2QgdG8gdGhlIGVkaXRvclBhcnQgaW5zdGVhZAotICAgIGlmICghaXNSZWFkT25seSgpKQotICAgIHsKLSAgICBCYXNlU2VsZWN0aW9uQWN0aW9uIGFjdGlvbiA9IG5ldyBBZGRGaWVsZEFjdGlvbih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotICAgIGFjdGlvbiA9IG5ldyBEZWxldGVBY3Rpb24odGhpcyk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RFbGVtZW50QWN0aW9uKHRoaXMsIEFkZFhTREVsZW1lbnRBY3Rpb24uSUQsIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0VMRU1FTlQsIGZhbHNlKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RFbGVtZW50LmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTREVsZW1lbnRBY3Rpb24odGhpcywgQWRkWFNERWxlbWVudEFjdGlvbi5SRUZfSUQsIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0VMRU1FTlRfUkVGLCB0cnVlKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RFbGVtZW50UmVmLmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24odGhpcywgWFNEQ29tcG9zaXRvci5TRVFVRU5DRV9MSVRFUkFMLCBBZGRYU0RNb2RlbEdyb3VwQWN0aW9uLlNFUVVFTkNFX0lEKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RTZXF1ZW5jZS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RNb2RlbEdyb3VwQWN0aW9uKHRoaXMsIFhTRENvbXBvc2l0b3IuQ0hPSUNFX0xJVEVSQUwsIEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24uQ0hPSUNFX0lEKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RDaG9pY2UuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gICAgCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTRE1vZGVsR3JvdXBBY3Rpb24odGhpcywgWFNEQ29tcG9zaXRvci5BTExfTElURVJBTCwgQWRkWFNETW9kZWxHcm91cEFjdGlvbi5BTExfSUQpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTREFsbC5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFjdGlvbih0aGlzLCBmYWxzZSk7Ci0gICAgYWN0aW9uLnNldElkKEFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWN0aW9uLk1PREVMR1JPVVBERUZJTklUSU9OX0lEKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RHcm91cC5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFjdGlvbih0aGlzLCB0cnVlKTsKLSAgICBhY3Rpb24uc2V0SWQoQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25BY3Rpb24uTU9ERUxHUk9VUERFRklOSVRJT05SRUZfSUQpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoWFNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvb2JqMTYvWFNER3JvdXBSZWYuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTRENvbXBsZXhUeXBlLmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTRFNpbXBsZVR5cGUuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24odGhpcyk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEQXR0cmlidXRlLmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uKHRoaXMsIEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLlJFRl9JRCwgTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX1JFRiwgdHJ1ZSk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEQXR0cmlidXRlUmVmLmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IE9wZW5Jbk5ld0VkaXRvcih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbih0aGlzKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFjdGlvbih0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RBdHRyaWJ1dGVHcm91cC5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb24odGhpcywgQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWN0aW9uLlJFRl9JRCk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEQXR0cmlidXRlR3JvdXBSZWYuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLSAgICBhY3Rpb24gPSBuZXcgRGVsZXRlWFNEQ29uY3JldGVDb21wb25lbnRBY3Rpb24odGhpcyk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RBbnlFbGVtZW50QWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTREFueS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNEQW55QXR0cmlidXRlQWN0aW9uKHRoaXMpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTREFueUF0dHJpYnV0ZS5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLSAgICAKLSAgICBhY3Rpb24gPSBuZXcgQWRkWFNEU2NoZW1hRGlyZWN0aXZlQWN0aW9uKHRoaXMsIEFkZFhTRFNjaGVtYURpcmVjdGl2ZUFjdGlvbi5JTkNMVURFX0lELCBNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9JTkNMVURFKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9YU0RJbmNsdWRlLmdpZiIpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0gICAgYWN0aW9uID0gbmV3IEFkZFhTRFNjaGVtYURpcmVjdGl2ZUFjdGlvbih0aGlzLCBBZGRYU0RTY2hlbWFEaXJlY3RpdmVBY3Rpb24uSU1QT1JUX0lELCBNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9JTVBPUlQpOwotICAgIGFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL1hTREltcG9ydC5naWYiKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotICAgIGFjdGlvbiA9IG5ldyBBZGRYU0RTY2hlbWFEaXJlY3RpdmVBY3Rpb24odGhpcywgQWRkWFNEU2NoZW1hRGlyZWN0aXZlQWN0aW9uLlJFREVGSU5FX0lELCBNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9SRURFRklORSk7Ci0gICAgYWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoWFNERWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvWFNEUmVkZWZpbmUuZ2lmIikpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gICAgCi0gICAgU2V0VHlwZUFjdGlvbiBzZXROZXdDb21wbGV4VHlwZUFjdGlvbiA9IG5ldyBTZXRUeXBlQWN0aW9uKE1lc3NhZ2VzLl9VSV9BQ1RJT05fTkVXLCBTZXRUeXBlQWN0aW9uLlNFVF9ORVdfVFlQRV9JRCwgdGhpcyk7Ci0gICAgc2V0TmV3Q29tcGxleFR5cGVBY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICAKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihzZXROZXdDb21wbGV4VHlwZUFjdGlvbik7Ci0gICAgICAgIAotICAgIFNldFR5cGVBY3Rpb24gc2V0RXhpc3RpbmdUeXBlQWN0aW9uID0gbmV3IFNldFR5cGVBY3Rpb24oTWVzc2FnZXMuX1VJX0FDVElPTl9CUk9XU0UsIFNldFR5cGVBY3Rpb24uU0VMRUNUX0VYSVNUSU5HX1RZUEVfSUQsIHRoaXMpOwotICAgIHNldEV4aXN0aW5nVHlwZUFjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKHNldEV4aXN0aW5nVHlwZUFjdGlvbik7Ci0KLSAgICBhZGRNdWx0aXBsaWNpdHlNZW51KHJlZ2lzdHJ5KTsKLSAgICAKLSAgICBQcmludEFjdGlvbiBwcmludEFjdGlvbiA9IG5ldyBQcmludEFjdGlvbih0aGlzKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihwcmludEFjdGlvbik7Ci0gICAgCi0gICAgQmFzZURpcmVjdEVkaXRBY3Rpb24gZGlyZWN0RWRpdEFjdGlvbiA9IG5ldyBCYXNlRGlyZWN0RWRpdEFjdGlvbih0aGlzKTsKLSAgICBkaXJlY3RFZGl0QWN0aW9uLnNldFNlbGVjdGlvblByb3ZpZGVyKGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oZGlyZWN0RWRpdEFjdGlvbik7Ci0gICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBCYXNlU2VsZWN0aW9uQWN0aW9uIGFjdGlvbiA9IG5ldyBPcGVuSW5OZXdFZGl0b3IodGhpcyk7Ci0gICAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLSAgICAgIGFjdGlvbiA9IG5ldyBTaG93UHJvcGVydGllc1ZpZXdBY3Rpb24odGhpcyk7Ci0gICAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotICAgICAgCi0gICAgICBQcmludEFjdGlvbiBwcmludEFjdGlvbiA9IG5ldyBQcmludEFjdGlvbih0aGlzKTsKLSAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKHByaW50QWN0aW9uKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGFkZE11bHRpcGxpY2l0eU1lbnUoQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkpCi0gIHsKLSAgICBTZXRNdWx0aXBsaWNpdHlBY3Rpb24gb25lTXVsdGlwbGljaXR5ID0gbmV3IFNldE11bHRpcGxpY2l0eUFjdGlvbih0aGlzLCAiMS4uMSAoIiArIE1lc3NhZ2VzLl9VSV9MQUJFTF9SRVFVSVJFRCArICIpIiwgU2V0TXVsdGlwbGljaXR5QWN0aW9uLlJFUVVJUkVEX0lEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgb25lTXVsdGlwbGljaXR5LnNldE1heE9jY3VycygxKTsKLSAgICBvbmVNdWx0aXBsaWNpdHkuc2V0TWluT2NjdXJzKDEpOwotICAgIG9uZU11bHRpcGxpY2l0eS5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKG9uZU11bHRpcGxpY2l0eSk7Ci0KLSAgICBTZXRNdWx0aXBsaWNpdHlBY3Rpb24gemVyb09yTW9yZU11bHRpcGxpY2l0eSA9IG5ldyBTZXRNdWx0aXBsaWNpdHlBY3Rpb24odGhpcywgIjAuLiogKCIgKyBNZXNzYWdlcy5fVUlfTEFCRUxfWkVST19PUl9NT1JFICsgIikiLCBTZXRNdWx0aXBsaWNpdHlBY3Rpb24uWkVST19PUl9NT1JFX0lEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgemVyb09yTW9yZU11bHRpcGxpY2l0eS5zZXRNYXhPY2N1cnMoLTEpOwotICAgIHplcm9Pck1vcmVNdWx0aXBsaWNpdHkuc2V0TWluT2NjdXJzKDApOwotICAgIHplcm9Pck1vcmVNdWx0aXBsaWNpdHkuc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbih6ZXJvT3JNb3JlTXVsdGlwbGljaXR5KTsKLSAgICAKLSAgICBTZXRNdWx0aXBsaWNpdHlBY3Rpb24gemVyb09yT25lTXVsdGlwbGljaXR5ID0gbmV3IFNldE11bHRpcGxpY2l0eUFjdGlvbih0aGlzLCAiMC4uMSAoIiArIE1lc3NhZ2VzLl9VSV9MQUJFTF9PUFRJT05BTCArICIpIiwgU2V0TXVsdGlwbGljaXR5QWN0aW9uLlpFUk9fT1JfT05FX0lEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgemVyb09yT25lTXVsdGlwbGljaXR5LnNldE1heE9jY3VycygxKTsKLSAgICB6ZXJvT3JPbmVNdWx0aXBsaWNpdHkuc2V0TWluT2NjdXJzKDApOwotICAgIHplcm9Pck9uZU11bHRpcGxpY2l0eS5zZXRTZWxlY3Rpb25Qcm92aWRlcihnZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKHplcm9Pck9uZU11bHRpcGxpY2l0eSk7Ci0KLSAgICBTZXRNdWx0aXBsaWNpdHlBY3Rpb24gb25lT3JNb3JlTXVsdGlwbGljaXR5ID0gbmV3IFNldE11bHRpcGxpY2l0eUFjdGlvbih0aGlzLCAiMS4uKiAoIiArIE1lc3NhZ2VzLl9VSV9MQUJFTF9PTkVfT1JfTU9SRSArICIpIiwgU2V0TXVsdGlwbGljaXR5QWN0aW9uLk9ORV9PUl9NT1JFX0lEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgb25lT3JNb3JlTXVsdGlwbGljaXR5LnNldE1heE9jY3VycygtMSk7Ci0gICAgb25lT3JNb3JlTXVsdGlwbGljaXR5LnNldE1pbk9jY3VycygxKTsKLSAgICBvbmVPck1vcmVNdWx0aXBsaWNpdHkuc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihvbmVPck1vcmVNdWx0aXBsaWNpdHkpOwotICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIExpc3RlbmVyIG9uIFNTRSdzIG91dGxpbmUgcGFnZSdzIHNlbGVjdGlvbnMgdGhhdCBjb252ZXJ0cyBET00gc2VsZWN0aW9ucwotICAgKiBpbnRvIHhzZCBzZWxlY3Rpb25zIGFuZCBub3RpZmllcyBYU0Qgc2VsZWN0aW9uIG1hbmFnZXIKLSAgICovCi0gIGNsYXNzIE91dGxpbmVUcmVlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLCBJRG91YmxlQ2xpY2tMaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIE91dGxpbmVUcmVlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElTZWxlY3Rpb24gZ2V0WFNEU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICAgIHsKLSAgICAgIElTZWxlY3Rpb24gc2VsID0gbnVsbDsKLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgICBPYmplY3QgbyA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIGlmIChvICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvKTsKLSAgICAgICAgfQotICAgICAgICAgIAotICAgICAgfQotICAgICAgcmV0dXJuIHNlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIERPTSBub2RlIGJhc2VkIG9uIG9iamVjdCAoeHNkIG5vZGUpCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCBnZXRPYmplY3RGb3JPdGhlck1vZGVsKE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgTm9kZSBub2RlID0gbnVsbDsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKQotICAgICAgewotICAgICAgICBub2RlID0gKE5vZGUpIG9iamVjdDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRENvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9ICgoWFNEQ29tcG9uZW50KSBvYmplY3QpLmdldEVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIENhdGVnb3J5QWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9ICgoQ2F0ZWdvcnlBZGFwdGVyKSBvYmplY3QpLmdldFhTRFNjaGVtYSgpLmdldEVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgICAgewotICAgICAgICBpZiAoKChYU0RCYXNlQWRhcHRlcikgb2JqZWN0KS5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgbm9kZSA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpICgoWFNEQmFzZUFkYXB0ZXIpIG9iamVjdCkuZ2V0VGFyZ2V0KCkpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gdGhlIHRleHQgZWRpdG9yIGNhbiBvbmx5IGFjY2VwdCBzZWQgbm9kZXMhCi0gICAgICAvLwotICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSkKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9IG51bGw7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbm9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBTZWxlY3Rpb24gaW4gb3V0bGluZSB0cmVlIGNoYW5nZWQgc28gc2V0IG91dGxpbmUgdHJlZSdzIHNlbGVjdGlvbiBpbnRvCi0gICAgICAgKiBlZGl0b3IncyBzZWxlY3Rpb24gYW5kIHNheSBpdCBjYW1lIGZyb20gb3V0bGluZSB0cmVlCi0gICAgICAgKi8KLSAgICAgIGlmIChnZXRTZWxlY3Rpb25NYW5hZ2VyKCkgIT0gbnVsbCAmJiBnZXRTZWxlY3Rpb25NYW5hZ2VyKCkuZ2V0RW5hYmxlTm90aWZ5KCkpCi0gICAgICB7Ci0gICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0WFNEU2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIGZPdXRsaW5lUGFnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGdldFRleHRFZGl0b3IoKSAhPSBudWxsICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IHN0YXJ0ID0gLTE7Ci0gICAgICAgICAgaW50IGxlbmd0aCA9IDA7Ci0gICAgICAgICAgT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgIGlmIChvICE9IG51bGwpCi0gICAgICAgICAgICBvID0gZ2V0T2JqZWN0Rm9yT3RoZXJNb2RlbChvKTsKLSAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG8pLmdldFN0YXJ0T2Zmc2V0KCk7Ci0gICAgICAgICAgICBsZW5ndGggPSAoKEluZGV4ZWRSZWdpb24pIG8pLmdldEVuZE9mZnNldCgpIC0gc3RhcnQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChzdGFydCA+IC0xKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdldFRleHRFZGl0b3IoKS5zZWxlY3RBbmRSZXZlYWwoc3RhcnQsIGxlbmd0aCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIFNlbGVjdGlvbiBpbiBvdXRsaW5lIHRyZWUgY2hhbmdlZCBzbyBzZXQgb3V0bGluZSB0cmVlJ3Mgc2VsZWN0aW9uIGludG8KLSAgICAgICAqIGVkaXRvcidzIHNlbGVjdGlvbiBhbmQgc2F5IGl0IGNhbWUgZnJvbSBvdXRsaW5lIHRyZWUKLSAgICAgICAqLwotICAgICAgaWYgKGdldFNlbGVjdGlvbk1hbmFnZXIoKSAhPSBudWxsICYmIGdldFNlbGVjdGlvbk1hbmFnZXIoKS5nZXRFbmFibGVOb3RpZnkoKSkKLSAgICAgIHsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRYU0RTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZk91dGxpbmVQYWdlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAKLSAgLyoqCi0gICAqIExpc3RlbmVyIG9uIFNTRSdzIHNvdXJjZSBlZGl0b3IncyBzZWxlY3Rpb25zIHRoYXQgY29udmVydHMgRE9NIHNlbGVjdGlvbnMKLSAgICogaW50byB4c2Qgc2VsZWN0aW9ucyBhbmQgbm90aWZpZXMgWFNEIHNlbGVjdGlvbiBtYW5hZ2VyCi0gICAqLwotICBwcml2YXRlIGNsYXNzIFNvdXJjZUVkaXRvclNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotICB7Ci0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBYU0Qgbm9kZSBiYXNlZCBvbiBvYmplY3QgKERPTSBub2RlKQotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0WFNETm9kZShPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgIC8vIGdldCB0aGUgZWxlbWVudCBub2RlCi0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE5vZGUpCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0gICAgICAgIGlmIChub2RlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpCi0gICAgICAgICAgewotICAgICAgICAgICAgZWxlbWVudCA9ICgoQXR0cikgbm9kZSkuZ2V0T3duZXJFbGVtZW50KCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbW9kZWw7IAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgT2JqZWN0IG8gPSBlbGVtZW50OwotICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG1vZGVsT2JqZWN0ID0gZ2V0WFNEU2NoZW1hKCkuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChlbGVtZW50KTsKLSAgICAgICAgaWYgKG1vZGVsT2JqZWN0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBvID0gbW9kZWxPYmplY3Q7Ci0gICAgICAgICAgbyA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoKE5vdGlmaWVyKSBtb2RlbE9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBvOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgIGlmIChnZXRTZWxlY3Rpb25NYW5hZ2VyKCkuZ2V0RW5hYmxlTm90aWZ5KCkgJiYgZ2V0QWN0aXZlUGFnZSgpID09IDEpCi0gICAgICB7Ci0gICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgICAgewotICAgICAgICAgIExpc3QgeHNkU2VsZWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgZG9tTm9kZSA9IGkubmV4dCgpOwotICAgICAgICAgICAgT2JqZWN0IHhzZE5vZGUgPSBnZXRYU0ROb2RlKGRvbU5vZGUpOwotICAgICAgICAgICAgaWYgKHhzZE5vZGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgeHNkU2VsZWN0aW9ucy5hZGQoeHNkTm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICgheHNkU2VsZWN0aW9ucy5pc0VtcHR5KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiB4c2RTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih4c2RTZWxlY3Rpb25zKTsKLSAgICAgICAgICAgIGdldFNlbGVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3Rpb24oeHNkU2VsZWN0aW9uLCBnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBMaXN0ZW5lciBvbiBYU0QncyBzZWxlY3Rpb24gbWFuYWdlcidzIHNlbGVjdGlvbnMgdGhhdCBjb252ZXJ0cyBYU0QKLSAgICogc2VsZWN0aW9ucyBpbnRvIERPTSBzZWxlY3Rpb25zIGFuZCBub3RpZmllcyBTU0UncyBzZWxlY3Rpb24gcHJvdmlkZXIKLSAgICovCi0gIHByaXZhdGUgY2xhc3MgWFNEU2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotICB7Ci0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBET00gbm9kZSBiYXNlZCBvbiBvYmplY3QgKHhzZCBub2RlKQotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0T2JqZWN0Rm9yT3RoZXJNb2RlbChPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgIE5vZGUgbm9kZSA9IG51bGw7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIG5vZGUgPSAoKFhTRENvbXBvbmVudCkgb2JqZWN0KS5nZXRFbGVtZW50KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDYXRlZ29yeUFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIG5vZGUgPSAoKENhdGVnb3J5QWRhcHRlcikgb2JqZWN0KS5nZXRYU0RTY2hlbWEoKS5nZXRFbGVtZW50KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgaWYgKCgoWFNEQmFzZUFkYXB0ZXIpIG9iamVjdCkuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgIG5vZGUgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KSAoKFhTREJhc2VBZGFwdGVyKSBvYmplY3QpLmdldFRhcmdldCgpKS5nZXRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgIHsKLSAgICAgICAgLy8gVGhpcyBjYXNlIHdhcyBhZGRlZCB0byBtYWtlIHRoZSBGMy9oeXBlcmxpbmsgbmF2aWdhdGlvbiB3b3JrIHdoZW4gYW4KLSAgICAgICAgLy8gaW5saW5lIHNjaGVtYSBmcm9tIGEgV1NETCBkb2N1bWVudCBpcyBvcGVuZWQgaW4gdGhlIHNjaGVtYSBlZGl0b3IuCi0gICAgICAgIC8vIFRoZSBzdHJpbmcgaXMgZXhwZWN0ZWQgdG8gYmUgYSBVUkkgZnJhZ21lbnQgdXNlZCB0byBpZGVudGlmeSBhbiBYU0QKLSAgICAgICAgLy8gY29tcG9uZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSBlbmNsb3NpbmcgV1NETCByZXNvdXJjZS4KLQotICAgICAgICBTdHJpbmcgdXJpRnJhZ21lbnQgPSAoU3RyaW5nKSBvYmplY3Q7Ci0gICAgICAgIFJlc291cmNlIHJlc291cmNlID0geHNkU2NoZW1hLmVSZXNvdXJjZSgpOwotICAgICAgICBFT2JqZWN0IG1vZGVsT2JqZWN0ID0gcmVzb3VyY2UuZ2V0RU9iamVjdCh1cmlGcmFnbWVudCk7Ci0KLSAgICAgICAgaWYgKG1vZGVsT2JqZWN0ICE9IG51bGwgJiYgbW9kZWxPYmplY3QgaW5zdGFuY2VvZiBYU0RDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RDb21wb25lbnQgY29tcG9uZW50ID0gKFhTRENvbXBvbmVudCkgbW9kZWxPYmplY3Q7Ci0gICAgICAgICAgbm9kZSA9IGNvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gdGhlIHRleHQgZWRpdG9yIGNhbiBvbmx5IGFjY2VwdCBzZWQgbm9kZXMhCi0gICAgICAvLwotICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSkKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9IG51bGw7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbm9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgICB7Ci0JCS8vIGRvIG5vdCBmaXJlIHNlbGVjdGlvbiBpbiBzb3VyY2UgZWRpdG9yIGlmIHRoZSBjdXJyZW50IGFjdGl2ZSBwYWdlIGlzIHRoZSBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvciAoc291cmNlKQotCQkvLyBXZSBvbmx5IHdhbnQgdG8gbWFrZSBzb3VyY2Ugc2VsZWN0aW9ucyBpZiB0aGUgYWN0aXZlIHBhZ2UgaXMgZWl0aGVyIHRoZSBvdXRsaW5lIG9yIHByb3BlcnRpZXMgKGEgbW9kaWZ5Ci0JCS8vIGhhcyBiZWVuIGRvbmUgdmlhIHRoZSBvdXRsaW5lIG9yIHByb3BlcnRpZXMgYW5kIG5vdCB0aGUgc291cmNlIHZpZXcpLiAgV2UgZG9uJ3Qgd2FudCB0byBiZSBzZWxlY3RpbmcKLQkJLy8gYW5kIHVuc2VsZWN0aW5nIHRoaW5ncyBpbiB0aGUgc291cmNlIHdoZW4gZWRpdGluZyBpbiB0aGUgc291cmNlISEKLSAgICAJYm9vbGVhbiBtYWtlU2VsZWN0aW9uID0gdHJ1ZTsKLQkJaWYgKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwYWdlLmdldEFjdGl2ZVBhcnQoKSBpbnN0YW5jZW9mIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKSB7Ci0JCQkJaWYgKGdldEFjdGl2ZUVkaXRvcigpIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRFZGl0b3IpIHsKLQkJCQkJbWFrZVNlbGVjdGlvbiA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotICAgIAkKLSAgICAgIC8vIGRvIG5vdCBmaXJlIHNlbGVjdGlvbiBpbiBzb3VyY2UgZWRpdG9yIGlmIHNlbGVjdGlvbiBldmVudCBjYW1lCi0gICAgICAvLyBmcm9tIHNvdXJjZSBlZGl0b3IKLSAgICAgIGlmIChldmVudC5nZXRTb3VyY2UoKSAhPSBnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSAmJiBtYWtlU2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBMaXN0IG90aGVyTW9kZWxPYmplY3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBtb2RlbE9iamVjdCA9IGkubmV4dCgpOwotICAgICAgICAgICAgT2JqZWN0IG90aGVyTW9kZWxPYmplY3QgPSBnZXRPYmplY3RGb3JPdGhlck1vZGVsKG1vZGVsT2JqZWN0KTsKLSAgICAgICAgICAgIGlmIChvdGhlck1vZGVsT2JqZWN0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG90aGVyTW9kZWxPYmplY3RMaXN0LmFkZChvdGhlck1vZGVsT2JqZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCFvdGhlck1vZGVsT2JqZWN0TGlzdC5pc0VtcHR5KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gaGVyZSdzIGFuIHVnbHkgaGFjay4uLiBpZiB3ZSBhbGxvdyB0ZXh0IHNlbGVjdGlvbnMgdG8gZmlyZSBkdXJpbmcKLSAgICAgICAgICAgIC8vIFNldElucHV0VG9HcmFwaFZpZXcgYWN0aW9uIHdlIHNjcmV3IHVwIHRoZSBuYXZpZ2F0aW9uIGhpc3RvcnkhCi0gICAgICAgICAgICAvLyAgICAgICAgICAgIAotICAgICAgICAgICAgLy9UT0RPIChjcykgLi4uIHdlIG5lZWQgdG8gcHJldmVudCB0aGUgc291cmNlIGVkaXRvciBmcm9tIG1lc3NpbmcgdXAgdGhlIG5hdmlnYXRpb24gaGlzdG9yeQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGlmIChnZXRBY3RpdmVQYWdlKCkgPT0gU09VUkNFX1BBR0VfSU5ERVgpCi0gICAgICAgICAgICB7ICAKLSAgICAgICAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBub2RlU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob3RoZXJNb2RlbE9iamVjdExpc3QpOwotICAgICAgICAgICAgICBnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5zZXRTZWxlY3Rpb24obm9kZVNlbGVjdGlvbik7Ci0gICAgICAgICAgICB9ICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZG9TZXRTZWxlY3Rpb24oKQotICAgIHsKLSAgICAgIElTZWxlY3Rpb24gaVNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbk1hbmFnZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIGlmIChpU2VsZWN0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBmaXJzdEVsZW1lbnQgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24paVNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIE9iamVjdCBvdGhlck1vZGVsT2JqZWN0ID0gZ2V0T2JqZWN0Rm9yT3RoZXJNb2RlbChmaXJzdEVsZW1lbnQpOwotICAgICAgICBpZiAob3RoZXJNb2RlbE9iamVjdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBub2RlU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob3RoZXJNb2RlbE9iamVjdCk7Ci0gICAgICAgICAgZ2V0VGV4dEVkaXRvcigpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuc2V0U2VsZWN0aW9uKG5vZGVTZWxlY3Rpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvLyBCdWcgMTQ1NTkwLiAgV29ya2Fyb3VuZCB0byB1cGRhdGUgc291cmNlIHBvc2l0aW9uIHdoZW4gZmxpcHBpbmcgdG8gdGhlIHNvdXJjZSBwYWdlLgotICAvLyBVbmZvcnR1bmF0ZWx5LCB0aGlzIHdpbGwgc3RpbGwgYWRkIGFuIGVudHJ5IHRvIHRoZSBuYXZpZ2F0aW9uIGhpc3RvcnksIGJ1dCB0aGlzCi0gIC8vIGJlaGF2aW91ciBpcyBhbiBpbXByb3ZlbWVudCB0aGFuIHdpdGhvdXQgdGhpcyBjaGFuZ2UKLSAgYm9vbGVhbiBkb1VwZGF0ZVNvdXJjZUxvY2F0aW9uID0gZmFsc2U7Ci0gIHByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IG5ld1BhZ2VJbmRleCkKLSAgewotICAgIHN1cGVyLnBhZ2VDaGFuZ2UobmV3UGFnZUluZGV4KTsKLSAgICBkb1VwZGF0ZVNvdXJjZUxvY2F0aW9uID0gbmV3UGFnZUluZGV4ID09IFNPVVJDRV9QQUdFX0lOREVYOwotICAgIGlmIChkb1VwZGF0ZVNvdXJjZUxvY2F0aW9uICYmIGZYU0RTZWxlY3Rpb25MaXN0ZW5lciAhPSBudWxsKQotICAgICAgZlhTRFNlbGVjdGlvbkxpc3RlbmVyLmRvU2V0U2VsZWN0aW9uKCk7Ci0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBzb3VyY2UsIGludCBwcm9wSWQpCi0gIHsKLSAgICBzd2l0Y2ggKHByb3BJZCkKLSAgICB7Ci0gICAgICAvLyB3aGVuIHJlZmFjdG9yIHJlbmFtZSB3aGlsZSBmaWxlIGlzIG9wZW4gaW4gZWRpdG9yLCBuZWVkIHRvIHJlc2V0Ci0gICAgICAvLyBlZGl0b3IgY29udGVudHMgdG8gcmVmbGVjdCBuZXcgZG9jdW1lbnQKLSAgICAgIGNhc2UgSUVkaXRvclBhcnQuUFJPUF9JTlBVVDoKLSAgICAgIHsKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBzdHJ1Y3R1cmVkVGV4dEVkaXRvciAmJiB4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3RydWN0dXJlZE1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBEb2N1bWVudCBzY2hlbWFEb2N1bWVudCA9IHhzZFNjaGVtYS5nZXREb2N1bWVudCgpOwotICAgICAgICAgICAgICBEb2N1bWVudCBkb21Nb2RlbERvY3VtZW50ID0gKChJRE9NTW9kZWwpc3RydWN0dXJlZE1vZGVsKS5nZXREb2N1bWVudCgpOwotICAgICAgICAgICAgICAvLyBpZiBkb20gZG9jdW1lbnRzIGFyZSBub3QgdGhlIHNhbWUsIHRoZXkgbmVlZCB0byBiZSByZXNldAotICAgICAgICAgICAgICBpZiAoc2NoZW1hRG9jdW1lbnQgIT0gZG9tTW9kZWxEb2N1bWVudCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhTRE1vZGVsQWRhcHRlciBtb2RlbEFkYXB0ZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChzY2hlbWFEb2N1bWVudCBpbnN0YW5jZW9mIElET01Eb2N1bWVudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvLyBzYXZlIHRoaXMgbW9kZWwgYWRhcHRlciBmb3IgY2xlYW51cCBsYXRlcgotICAgICAgICAgICAgICAgICAgbW9kZWxBZGFwdGVyID0gKFhTRE1vZGVsQWRhcHRlcikgKChJRE9NRG9jdW1lbnQpc2NoZW1hRG9jdW1lbnQpLmdldEV4aXN0aW5nQWRhcHRlcihYU0RNb2RlbEFkYXB0ZXIuY2xhc3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbXVsdGlwYWdlIGVkaXRvciB3aXRoIG5ldyBlZGl0b3IgaW5wdXQKLSAgICAgICAgICAgICAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgICAgICAgIHNldElucHV0KGVkaXRvcklucHV0KTsKLSAgICAgICAgICAgICAgICBzZXRQYXJ0TmFtZShlZGl0b3JJbnB1dC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLm1hcmtTYXZlTG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3cgZG8gdGhlIGNsZWFuIHVwIG1vZGVsIGFkYXB0ZXIKLSAgICAgICAgICAgICAgICBpZiAobW9kZWxBZGFwdGVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgbW9kZWxBZGFwdGVyLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICBtb2RlbEFkYXB0ZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotICAgICAgICAgICAgICBzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5wcm9wZXJ0eUNoYW5nZWQoc291cmNlLCBwcm9wSWQpOwotICB9Ci0KLSAgcHVibGljIElOYXZpZ2F0aW9uTG9jYXRpb24gY3JlYXRlRW1wdHlOYXZpZ2F0aW9uTG9jYXRpb24oKQotICB7Ci0gICAgaWYgKGdldEFjdGl2ZVBhZ2UoKSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgRGVzaWduVmlld05hdmlnYXRpb25Mb2NhdGlvbih0aGlzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgTXVsdGlQYWdlRWRpdG9yVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbihnZXRUZXh0RWRpdG9yKCksIGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgSU5hdmlnYXRpb25Mb2NhdGlvbiBjcmVhdGVOYXZpZ2F0aW9uTG9jYXRpb24oKQotICB7Ci0gICAgaWYgKGdldEFjdGl2ZVBhZ2UoKSA9PSBERVNJR05fUEFHRV9JTkRFWCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgUm9vdEVkaXRQYXJ0IHJvb3RFZGl0UGFydCA9IGdyYXBoaWNhbFZpZXdlci5nZXRSb290RWRpdFBhcnQoKTsKLSAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSByb290RWRpdFBhcnQuZ2V0Q29udGVudHMoKTsKLSAgICAgICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgUm9vdENvbnRlbnRFZGl0UGFydCkKLSAgICAgICAgewotICAgICAgICAgIFJvb3RDb250ZW50RWRpdFBhcnQgcm9vdENvbnRlbnRFZGl0UGFydCA9IChSb290Q29udGVudEVkaXRQYXJ0KWVkaXRQYXJ0OwotICAgICAgICAgIE9iamVjdCBpbnB1dCA9IHJvb3RDb250ZW50RWRpdFBhcnQuZ2V0SW5wdXQoKTsgICAgICAKLSAgICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBBZGFwdGVyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSgoQWRhcHRlcilpbnB1dCkuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKS5nZXRBZGFwdGVyKFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuY2xhc3MpOwotICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciA9IChQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKW9iamVjdDsKLSAgICAgICAgICAgICAgaWYgKHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmdldE5hdmlnYXRpb25Mb2NhdGlvbih0aGlzLCBjb25jcmV0ZUNvbXBvbmVudCwgcm9vdENvbnRlbnRFZGl0UGFydCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgRGVzaWduVmlld05hdmlnYXRpb25Mb2NhdGlvbih0aGlzLCBjb25jcmV0ZUNvbXBvbmVudCk7Ci0gICAgICAgICAgfQotICAgICAgICB9ICAgCi0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgTXVsdGlQYWdlRWRpdG9yVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbihnZXRUZXh0RWRpdG9yKCksIHRydWUpOwotICAgIH0KLSAgfQotICAKLSAgCi0gIHB1YmxpYyB2b2lkIGVkaXRvck1vZGVDaGFuZ2VkKEVkaXRvck1vZGUgbmV3RWRpdG9yTW9kZSkKLSAgewotICAgIC8vaWYgKGlzSW5pdGlhbGl6aW5nKQotICAgIC8vICByZXR1cm47Ci0gICAgCi0gICAgRWRpdFBhcnRGYWN0b3J5IGVkaXRQYXJ0RmFjdG9yeSA9IG5ld0VkaXRvck1vZGUuZ2V0RWRpdFBhcnRGYWN0b3J5KCk7Ci0gICAgaWYgKGVkaXRQYXJ0RmFjdG9yeSAhPSBudWxsKQotICAgIHsgIAotICAgICAgZ3JhcGhpY2FsVmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShlZGl0UGFydEZhY3RvcnkpOwotICAgICAgaWYgKGdyYXBoaWNhbFZpZXdlciBpbnN0YW5jZW9mIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIpCi0gICAgICB7ICAKLSAgICAgICAgRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcilncmFwaGljYWxWaWV3ZXI7ICAKLSAgICAgICAgSUFEVE9iamVjdCBpbnB1dCA9IHZpZXdlci5nZXRJbnB1dCgpOwotICAgICAgICB2aWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0gICAgICAgIC8vdmlld2VyLmdldFJvb3RFZGl0UGFydCgpLnJlZnJlc2goKTsKLSAgICAgICAvLyB2aWV3ZXIuZ2V0Um9vdEVkaXRQYXJ0KCkuZ2V0Q29udGVudHMoKS5yZWZyZXNoKCk7Ci0gICAgICAgIHZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0gICAgICAgIAotICAgICAgICBmbG9hdGluZ1Rvb2xiYXIuc2V0RWRpdFBhcnRGYWN0b3J5KGVkaXRQYXJ0RmFjdG9yeSk7Ci0gICAgICAgIGZsb2F0aW5nVG9vbGJhci5zZXRNb2RlbChnZXRNb2RlbCgpKTsKLSAgICAgICAgZmxvYXRpbmdUb29sYmFyLnJlZnJlc2goIShpbnB1dCBpbnN0YW5jZW9mIElNb2RlbCkpOwotICAgICAgICAKLSAgICAgICAgQ29udHJvbCBjb250cm9sID0gZ3JhcGhpY2FsVmlld2VyLmdldENvbnRyb2woKTsKLSAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb21wb3NpdGUpCi0gICAgICAgIHsKLSAgICAgICAgICBDb21wb3NpdGUgcGFyZW50ID0gKChDb21wb3NpdGUpY29udHJvbCkuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgcGFyZW50LmxheW91dCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgCi0gICAgSUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IG5ld0VkaXRvck1vZGUuZ2V0T3V0bGluZVByb3ZpZGVyKCk7Ci0gICAgaWYgKHByb3ZpZGVyICE9IG51bGwpCi0gICAgewotICAgICAgQURUQ29udGVudE91dGxpbmVQYWdlIG91dGxpbmUgPSAoQURUQ29udGVudE91dGxpbmVQYWdlKWdldENvbnRlbnRPdXRsaW5lUGFnZSgpOwotICAgICAgaWYgKG91dGxpbmUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgVHJlZVZpZXdlciB0cmVlVmlld2VyID0gb3V0bGluZS5nZXRUcmVlVmlld2VyKCk7Ci0gICAgICAgIGlmICh0cmVlVmlld2VyICE9IG51bGwpCi0gICAgICAgIHsgICAgICAKLSAgICAgICAgICBvdXRsaW5lLmdldFRyZWVWaWV3ZXIoKS5zZXRDb250ZW50UHJvdmlkZXIocHJvdmlkZXIpOwotICAgICAgICAgIG91dGxpbmUuZ2V0VHJlZVZpZXdlcigpLnJlZnJlc2goKTsKLSAgICAgICAgfQotICAgICAgfSAgCi0gICAgfSAgCi0gIH0gIAotICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRURJVE9SX01PREVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5kZWZhdWx0RWRpdG9yTW9kZUlkIjsgLy8kTk9OLU5MUy0xJAotICAvL3ByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemluZyA9IGZhbHNlOwotICBwcm90ZWN0ZWQgRWRpdG9yTW9kZU1hbmFnZXIgY3JlYXRlRWRpdG9yTW9kZU1hbmFnZXIoKQotICB7Ci0gICAgZmluYWwgUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyID0gKFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpZ2V0QWRhcHRlcihQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmNsYXNzKTsKLSAgICBFZGl0b3JNb2RlTWFuYWdlciBtYW5hZ2VyID0gbmV3IEVkaXRvck1vZGVNYW5hZ2VyKFhTRF9FRElUT1JfTU9ERV9FWFRFTlNJT05fSUQpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgaW5pdCgpCi0gICAgICB7Ci0gICAgICAgIGlmIChwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyID09IG51bGwgfHwgCi0gICAgICAgICAgICBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmlzRWRpdG9yTW9kZUFwcGxpY2FibGUoVHlwZVZpekVkaXRvck1vZGUuSUQpKQotICAgICAgICB7ICAKLSAgICAgICAgICBhZGRNb2RlKG5ldyBUeXBlVml6RWRpdG9yTW9kZSgpKTsKLSAgICAgICAgfSAgCi0gICAgICAgIHN1cGVyLmluaXQoKTsgICAgICAgICAgICAgICAgCi0gICAgICB9ICAgICAgIAotICAgICAgCi0gICAgICBwcm90ZWN0ZWQgRWRpdG9yTW9kZSBnZXREZWZhdWx0TW9kZSgpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBkZWZhdWx0TW9kZUlkID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhERUZBVUxUX0VESVRPUl9NT0RFX0lEKTsKLSAgICAgICAgaWYgKGRlZmF1bHRNb2RlSWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEVkaXRvck1vZGUgZWRpdG9yTW9kZSA9IGdldEVkaXRvck1vZGUoZGVmYXVsdE1vZGVJZCk7Ci0gICAgICAgICAgaWYgKGVkaXRvck1vZGUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZWRpdG9yTW9kZTsKLSAgICAgICAgICB9ICAKLSAgICAgICAgfSAgICAgICAgICAgICAgIAotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdE1vZGUoKTsKLSAgICAgIH0KLSAgICB9OwotICAgIG1hbmFnZXIuc2V0UHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcihwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKTsKLSAgICByZXR1cm4gbWFuYWdlcjsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgc3RvcmVDdXJyZW50TW9kZVByZWZlcmVuY2UoU3RyaW5nIGlkKQotICB7Ci0gICAgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKERFRkFVTFRfRURJVE9SX01PREVfSUQsIGlkKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjZG9TYXZlQXMoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZG9TYXZlQXMoKQotICB7Ci0gICAgLy8gV2hlbiBwZXJmb3JtaW5nIGEgc2F2ZSBhcywgdGhlIGRvY3VtZW50IGNoYW5nZXMuICAgT3VyIG1vZGVsIHN0YXRlIGxpc3RlbmVycyBzaG91bGQgbGlzdGVuCi0gICAgLy8gdG8gdGhlIG5ldyBkb2N1bWVudC4KLSAgICAKLSAgICAvLyBGaXJzdCBnZXQgdGhlIGN1cnJlbnQgZG9jdW1lbnQKLSAgICBJRG9jdW1lbnQgY3VycmVudERvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLSAgICBYU0RNb2RlbEFkYXB0ZXIgbW9kZWxBZGFwdGVyID0gbnVsbDsKLSAgICBJRE9NRG9jdW1lbnQgZG9jID0gbnVsbDsKLSAgICBpZiAoY3VycmVudERvY3VtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGN1cnJlbnREb2N1bWVudCk7Ci0gICAgICBpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgJiYgKHN0cnVjdHVyZWRNb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gR2V0IHRoZSBhc3NvY2lhdGVkIElET01Eb2N1bWVudCBtb2RlbAotICAgICAgICAgICAgZG9jID0gKChJRE9NTW9kZWwpIHN0cnVjdHVyZWRNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIC8vIGFuZCBub3cgZ2V0IG91ciBhZGFwdGVyIHRoYXQgbGlzdGVucyB0byBET00gY2hhbmdlcwotICAgICAgICAgICAgaWYgKGRvYyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtb2RlbEFkYXB0ZXIgPSAoWFNETW9kZWxBZGFwdGVyKSBkb2MuZ2V0RXhpc3RpbmdBZGFwdGVyKFhTRE1vZGVsQWRhcHRlci5jbGFzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIHN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotICAgIC8vIHBlcmZvcm0gc2F2ZSBhcwotICAgIHN0cnVjdHVyZWRUZXh0RWRpdG9yLmRvU2F2ZUFzKCk7Ci0gICAgLy8gaWYgc2F2ZUFzIGNhbmNlbGxlZCB0aGVuIGRvbid0IHNldElucHV0IGJlY2F1c2UgdGhlIGlucHV0IGhhc24ndCBjaGFuZ2UKLSAgICAvLyBTZWUgQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yJ3MgcGVyZm9ybVNhdmVBcwotICAgIGlmIChlZGl0b3JJbnB1dCAhPSBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKQotICAgIHsKLSAgICAgIHNldElucHV0KHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotICAgICAgc2V0UGFydE5hbWUoc3RydWN0dXJlZFRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKS5nZXROYW1lKCkpOwotICAgIAotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkubWFya1NhdmVMb2NhdGlvbigpOwotICAgCi0gICAgICAvLyBOb3cgZG8gdGhlIGNsZWFuIHVwIG9uIHRoZSBvbGQgZG9jdW1lbnQKLSAgICAgIGlmIChtb2RlbEFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gY2xlYXIgb3V0IG1vZGVsIGFkYXB0ZXIKLSAgICAgICAgbW9kZWxBZGFwdGVyLmNsZWFyKCk7Ci0gICAgICAgIG1vZGVsQWRhcHRlciA9IG51bGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLX0gIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9LZXlib2FyZERyYWdJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvS2V5Ym9hcmREcmFnSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGZjOGUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9LZXlib2FyZERyYWdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uSUtleWJvYXJkRHJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLktleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kcy5CYXNlRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHMuWFNEQXR0cmlidXRlRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHMuWFNERWxlbWVudERyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuWFNEQmFzZUZpZWxkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotCi1wdWJsaWMgY2xhc3MgS2V5Ym9hcmREcmFnSW1wbCBpbXBsZW1lbnRzIElLZXlib2FyZERyYWcKLXsKLSAgcHVibGljIHZvaWQgcGVyZm9ybUtleWJvYXJkRHJhZyhHcmFwaGljYWxFZGl0UGFydCBtb3ZpbmdFbGVtZW50LCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeSBwb2xpY3kgPSAoS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeSkgbW92aW5nRWxlbWVudC5nZXRFZGl0UG9saWN5KEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuS0VZKTsKLQotICAgIEVkaXRQYXJ0IHJpZ2h0RWxlbWVudCA9IHBvbGljeS5nZXRSZWxhdGl2ZUVkaXRQYXJ0KG1vdmluZ0VsZW1lbnQsIGRpcmVjdGlvbik7Ci0gICAgcG9saWN5ID0gKEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kpIHJpZ2h0RWxlbWVudC5nZXRFZGl0UG9saWN5KEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuS0VZKTsKLSAgICBFZGl0UGFydCBsZWZ0RWxlbWVudCA9IChwb2xpY3kgIT0gbnVsbCkgPyBwb2xpY3kuZ2V0UmVsYXRpdmVFZGl0UGFydChyaWdodEVsZW1lbnQsIGRpcmVjdGlvbikgOiBudWxsOwotCi0gICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIGV4dGVuZGVycwotICAgIGlmICghKG1vdmluZ0VsZW1lbnQgaW5zdGFuY2VvZiBYU0RCYXNlRmllbGRFZGl0UGFydCkpIHJldHVybjsKLSAgICAKLSAgICBYU0RCYXNlRmllbGRFZGl0UGFydCBtb3ZpbmdGaWVsZCA9IChYU0RCYXNlRmllbGRFZGl0UGFydCkgbW92aW5nRWxlbWVudDsKLSAgICBYU0RCYXNlRmllbGRFZGl0UGFydCBsZWZ0RmllbGQgPSAoWFNEQmFzZUZpZWxkRWRpdFBhcnQpIGxlZnRFbGVtZW50OwotICAgIFhTREJhc2VGaWVsZEVkaXRQYXJ0IHJpZ2h0RmllbGQgPSAoWFNEQmFzZUZpZWxkRWRpdFBhcnQpIHJpZ2h0RWxlbWVudDsKLSAgICAKLSAgICBPYmplY3QgbW92aW5nT2JqZWN0ID0gbW92aW5nRmllbGQuZ2V0TW9kZWwoKTsKLSAgICAKLSAgICBCYXNlRHJhZ0FuZERyb3BDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgIGlmIChtb3ZpbmdPYmplY3QgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIHx8IG1vdmluZ09iamVjdCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgIHsKLSAgICAgIGNvbW1hbmQgPSBuZXcgWFNERWxlbWVudERyYWdBbmREcm9wQ29tbWFuZChtb3ZpbmdGaWVsZCwgbGVmdEZpZWxkLCByaWdodEZpZWxkLCBkaXJlY3Rpb24pOwotICAgIH0KLSAgICBlbHNlIGlmIChtb3ZpbmdPYmplY3QgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFkYXB0ZXIpCi0gICAgewotICAgICAgY29tbWFuZCA9IG5ldyBYU0RBdHRyaWJ1dGVEcmFnQW5kRHJvcENvbW1hbmQobW92aW5nRmllbGQsIGxlZnRGaWVsZCwgcmlnaHRGaWVsZCwgZGlyZWN0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNvbW1hbmQgIT0gbnVsbCAmJiBjb21tYW5kLmNhbkV4ZWN1dGUoKSkKLSAgICB7Ci0gICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgIC8vIFRoaXMgaXMgdG8gcmVzZWxlY3QgdGhlIG1vdmVkIGl0ZW0KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgaWYgKGVkaXRvciAhPSBudWxsICYmIGVkaXRvci5nZXRBZGFwdGVyKElTZWxlY3Rpb25Qcm92aWRlci5jbGFzcykgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IChJU2VsZWN0aW9uUHJvdmlkZXIpIGVkaXRvci5nZXRBZGFwdGVyKElTZWxlY3Rpb25Qcm92aWRlci5jbGFzcyk7Ci0gICAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1vdmluZ0VsZW1lbnQuZ2V0TW9kZWwoKSkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotCi0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMjc0NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGN1cnJlbnRseSB0cmFjaW5nIGEgY2F0ZWdvcnkKLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdHJhY2luZyBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2luZyhTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFmZDQyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGF2aWQgQ2FydmVyLCBTdGFuZGFyZHMgZm9yIFRlY2hub2xvZ3kgaW4gQXV0b21vdGl2ZSBSZXRhaWwsIGJ1ZyAxMTQ3MDMzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMKLXsKLSAgc3RhdGljIAotICB7Ci0gICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcygib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IubWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBNZXNzYWdlcygpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9CQVNFX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0RFUklWRURfQlk7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0lOSEVSSVRfRlJPTTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfSU5IRVJJVF9CWTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfRE9DVU1FTlRBVElPTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfQVBQX0lORk87Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1NFVF9UWVBFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9UWVBFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9OQU1FOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9LSU5EOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9NSU5PQ0NVUlM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX01BWE9DQ1VSUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTk9fVFlQRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfUEFHRV9IRUFESU5HX1JFRkVSRU5DRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfUkVBRF9PTkxZOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9DT01QT05FTlRTOwotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9UWVBFUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0dSQVBIX0VMRU1FTlRTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfR1JBUEhfQVRUUklCVVRFUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0dSQVBIX0FUVFJJQlVURV9HUk9VUFM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9OT1RBVElPTlM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9JREVOVElUWV9DT05TVFJBSU5UUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0dSQVBIX0FOTk9UQVRJT05TOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfR1JBUEhfRElSRUNUSVZFUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0dSQVBIX0dST1VQUzsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OT19MT0NBVElPTl9TUEVDSUZJRUQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9OT19UWVBFX0RFRklORUQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fVVBEQVRFX05BTUU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BQlNFTlQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0ZJRUxEOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1NFVF9NVUxUSVBMSUNJVFk7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9PUFRJT05BTDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1pFUk9fT1JfTU9SRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX09ORV9PUl9NT1JFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUkVRVUlSRUQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BUlJBWTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9TRVRfVFlQRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0xPQ0FMX1RZUEU7Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfR1JBUEhfVU5LTk9XTl9PQkpFQ1Q7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9YU0RTQ0hFTUE7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9HUkFQSF9YU0RTQ0hFTUFfTk9fTkFNRVNQQUNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU0VUX0NPTU1PTl9CVUlMVF9JTl9UWVBFUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NFTEVDVF9UWVBFU19GSUxURVJfT1VUOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTkVXX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9WQUxVRV9ORVdfVFlQRTsgIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ09NUExFWF9UWVBFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU0lNUExFX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9ORVdfRUxFTUVOVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05FV19BVFRSSUJVVEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1hTRF9FRElUT1I7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TT1VSQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0VMRU1FTlQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0VMRU1FTlRfUkVGOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX05FVzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9CUk9XU0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fVVBEQVRFX0VMRU1FTlRfUkVGRVJFTkNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1VQREFURV9BVFRSSUJVVEVfUkVGRVJFTkNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfVEFSR0VUX05BTUVTUEFDRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05PX05BTUVTUEFDRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfQ09NUExFWF9UWVBFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9TSU1QTEVfVFlQRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05BTUVfU0VBUkNIX0ZJTFRFUl9URVhUOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRUxFTUVOVFNfQ09MT047Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BVFRSSUJVVEVTX0NPTE9OOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU0VUX0VMRU1FTlRfUkVGRVJFTkNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU0VUX0FUVFJJQlVURV9SRUZFUkVOQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9UWVBFU19DT0xPTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NFVF9UWVBFOwotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9URVhUX0lOREVOVF9MQUJFTDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RFWFRfSU5ERU5UX1NQQUNFU19MQUJFTDsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9URVhUX1hTRF9OQU1FU1BBQ0VfUFJFRklYOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVEVYVF9YU0RfREVGQVVMVF9QUkVGSVg7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9RVUFMSUZZX1hTRDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RFWFRfWFNEX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1ZBTElEQVRJTkdfRklMRVM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GVUxMX0NPTkZPUk1BTkNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVEVYVF9IT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlM7Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfTEFCRUxfSU5WQUxJRF9QUkVGSVg7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0lOQ0xVREU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0lNUE9SVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfUkVERUZJTkU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FUVFJJQlVURTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX1JFRjsKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRUxFTUVOVEZPUk1ERUZBVUxUOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUklCVVRFRk9STURFRkFVTFQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DUkVBVEVfQU5PTl9UWVBFOyAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TVFJVQ1RVUkVEX1RFWFRfRURJVE9SX1BSRUZTX0xJTks7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NWVkMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1NvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5BY3Rpb25Db250cmlidXRvclhNTDsKLQotCi0vKioKLSAqIFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvcgotICogCi0gKiBUaGlzIGNsYXNzIGlzIGZvciBtdWx0aSBwYWdlIGVkaXRvcidzIHNvdXJjZSBwYWdlIGNvbnRyaWJ1dG9yLgotICoKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yIGV4dGVuZHMgQWN0aW9uQ29udHJpYnV0b3JYTUwgewotCi0JcHJpdmF0ZSBJQWN0aW9uQmFycyBmQmFyczsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbGxzOgotCSAqIDx1bD4KLQkgKiAgPGxpPjxjb2RlPmNvbnRyaWJ1dGVUb01lbnU8L2NvZGU+IHdpdGggPGNvZGU+YmFyczwvY29kZT4nIG1lbnUgbWFuYWdlcjwvbGk+Ci0JICogIDxsaT48Y29kZT5jb250cmlidXRlVG9Ub29sQmFyPC9jb2RlPiB3aXRoIDxjb2RlPmJhcnM8L2NvZGU+JyB0b29sIGJhcgotCSAqICAgIG1hbmFnZXI8L2xpPgotCSAqICA8bGk+PGNvZGU+Y29udHJpYnV0ZVRvU3RhdHVzTGluZTwvY29kZT4gd2l0aCA8Y29kZT5iYXJzPC9jb2RlPicgc3RhdHVzIGxpbmUKLQkgKiAgICBtYW5hZ2VyPC9saT4KLQkgKiA8L3VsPgotCSAqIFRoZSBnaXZlbiBhY3Rpb24gYmFycyBhcmUgYWxzbyByZW1lbWJlcmVkIGFuZCBtYWRlIGFjY2Vzc2libGUgdmlhIAotCSAqIDxjb2RlPmdldEFjdGlvbkJhcnM8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBiYXJzIHRoZSBhY3Rpb24gYmFycwotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYmFycykgewotCQlmQmFycyA9IGJhcnM7Ci0JCWNvbnRyaWJ1dGVUb01lbnUoYmFycy5nZXRNZW51TWFuYWdlcigpKTsKLQkJY29udHJpYnV0ZVRvVG9vbEJhcihiYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCkpOwotCQljb250cmlidXRlVG9TdGF0dXNMaW5lKGJhcnMuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIGNvbnRyaWJ1dG9yJ3MgYWN0aW9uIGJhcnMuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBhY3Rpb24gYmFycwotCSAqLwotCXB1YmxpYyBJQWN0aW9uQmFycyBnZXRBY3Rpb25CYXJzKCkgewotCQlyZXR1cm4gZkJhcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhTRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhTRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmFjNjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YU0QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTDsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBlZGl0aW5nIFhTRCBjb250ZW50IHR5cGUKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhTRCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTCB7Ci0JcHJvdGVjdGVkIE1hcCBnZXRIeXBlcmxpbmtEZXRlY3RvclRhcmdldHMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJTWFwIHRhcmdldHMgPSBzdXBlci5nZXRIeXBlcmxpbmtEZXRlY3RvclRhcmdldHMoc291cmNlVmlld2VyKTsKLQkJdGFyZ2V0cy5wdXQoIm9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UiLCBudWxsKTsgIC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHRhcmdldHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREF0dHJpYnV0ZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEQXR0cmlidXRlUmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk0MDQxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEQXR0cmlidXRlUmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MuTmV3QXR0cmlidXRlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLnNlYXJjaC5YU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guSVhTRFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBYU0RBdHRyaWJ1dGVSZWZlcmVuY2VFZGl0TWFuYWdlciBleHRlbmRzIFhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBpbXBsZW1lbnRzIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyCi17Ci0gIHB1YmxpYyBYU0RBdHRyaWJ1dGVSZWZlcmVuY2VFZGl0TWFuYWdlcihJRmlsZSBjdXJyZW50RmlsZSwgWFNEU2NoZW1hW10gc2NoZW1hcykKLSAgewotICAgIHN1cGVyKGN1cnJlbnRGaWxlLCBzY2hlbWFzKTsKLSAgfQotCi0gIHB1YmxpYyBJQ29tcG9uZW50RGlhbG9nIGdldEJyb3dzZURpYWxvZygpCi0gIHsKLSAgICBYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUgZGlhbG9nRGVsZWdhdGUgPSAKLSAgICAgIG5ldyBYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUoWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlLkFUVFJJQlVURV9NRVRBX05BTUUsIGN1cnJlbnRGaWxlLCBzY2hlbWFzKTsKLSAgICByZXR1cm4gZGlhbG9nRGVsZWdhdGU7Ci0gIH0KLQotICBwdWJsaWMgSUNvbXBvbmVudERpYWxvZyBnZXROZXdEaWFsb2coKQotICB7Ci0gICAgaWYgKHNjaGVtYXMubGVuZ3RoID4gMCkgewotICAgICAgcmV0dXJuIG5ldyBOZXdBdHRyaWJ1dGVEaWFsb2coc2NoZW1hc1swXSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgcmV0dXJuIG5ldyBOZXdBdHRyaWJ1dGVEaWFsb2coKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoT2JqZWN0IHJlZmVyZW5jaW5nT2JqZWN0LCBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHJlZmVyZW5jZWRDb21wb25lbnQpCi0gIHsKLSAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBjb25jcmV0ZUNvbXBvbmVudCA9IG51bGw7Ci0gICAgaWYgKHJlZmVyZW5jaW5nT2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlcikKLSAgICB7Ci0gICAgICBBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcilyZWZlcmVuY2luZ09iamVjdDsKLSAgICAgIGlmIChhZGFwdGVyLmdldFRhcmdldCgpIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIGNvbmNyZXRlQ29tcG9uZW50ID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKWFkYXB0ZXIuZ2V0VGFyZ2V0KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHJlZmVyZW5jaW5nT2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgewotICAgICAgY29uY3JldGVDb21wb25lbnQgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIHJlZmVyZW5jaW5nT2JqZWN0OwotICAgIH0KLSAgICBpZiAoY29uY3JldGVDb21wb25lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAgIGlmIChyZWZlcmVuY2VkQ29tcG9uZW50LmlzTmV3KCkpCi0gICAgICAgIHsgIAotICAgICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZURlYyA9IG51bGw7Ci0gICAgICAgICAgaWYgKHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0TWV0YU5hbWUoKSA9PSBJWFNEU2VhcmNoQ29uc3RhbnRzLkFUVFJJQlVURV9NRVRBX05BTUUpCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQVRUUklCVVRFLCBjb25jcmV0ZUNvbXBvbmVudC5nZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgICBjb21tYW5kLnNldE5hbWVUb0FkZChyZWZlcmVuY2VkQ29tcG9uZW50LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZURlYyA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgY29tbWFuZC5nZXRBZGRlZENvbXBvbmVudCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoYXR0cmlidXRlRGVjICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVJlZmVyZW5jZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfQVRUUklCVVRFX1JFRkVSRU5DRSwgY29uY3JldGVDb21wb25lbnQsIGF0dHJpYnV0ZURlYyk7Ci0gICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgICB9ICAKLSAgICAgICAgfSAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQoY29uY3JldGVDb21wb25lbnQsIHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0TmFtZSgpLCByZWZlcmVuY2VkQ29tcG9uZW50LmdldFF1YWxpZmllcigpLCByZWZlcmVuY2VkQ29tcG9uZW50LmdldEZpbGUoKSk7Ci0gICAgICAgICAgY29tbWFuZC5zZXRMYWJlbChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9BVFRSSUJVVEVfUkVGRVJFTkNFKTsKLSAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RDb21wbGV4VHlwZUJhc2VUeXBlRWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RDb21wbGV4VHlwZUJhc2VUeXBlRWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE1ZDZmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEQ29tcGxleFR5cGVCYXNlVHlwZUVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlNldEJhc2VUeXBlQW5kTWFuYWdlckRpcmVjdGl2ZXNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlNldEJhc2VUeXBlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLnNlYXJjaC5YU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guSVhTRFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBYU0RDb21wbGV4VHlwZUJhc2VUeXBlRWRpdE1hbmFnZXIgZXh0ZW5kcyBYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIKLXsKLSAgcHVibGljIFhTRENvbXBsZXhUeXBlQmFzZVR5cGVFZGl0TWFuYWdlcihJRmlsZSBjdXJyZW50RmlsZSwgWFNEU2NoZW1hW10gc2NoZW1hcykKLSAgewotICAgIHN1cGVyKGN1cnJlbnRGaWxlLCBzY2hlbWFzKTsKLSAgfQotCi0gIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gZ2V0UXVpY2tQaWNrcygpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuZ2V0UXVpY2tQaWNrcygpOwotICB9Ci0gIAotICBwdWJsaWMgSUNvbXBvbmVudERpYWxvZyBnZXRCcm93c2VEaWFsb2coKQotICB7Ci0gICAgWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlIGRpYWxvZ0RlbGVnYXRlID0gbmV3IFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZShYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUuVFlQRV9NRVRBX05BTUUsIGN1cnJlbnRGaWxlLCBzY2hlbWFzKTsKLSAgICByZXR1cm4gZGlhbG9nRGVsZWdhdGU7Ci0gIH0KLQotICAvLyBUT0RPIGNvbW1vbiB0aGlzIHVwCi0gIHB1YmxpYyB2b2lkIG1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShPYmplY3QgcmVmZXJlbmNpbmdPYmplY3QsIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50KQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQgPSBudWxsOwotICAgIGlmIChyZWZlcmVuY2luZ09iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXIpCi0gICAgewotICAgICAgQWRhcHRlciBhZHBhdGVyID0gKEFkYXB0ZXIpcmVmZXJlbmNpbmdPYmplY3Q7Ci0gICAgICBpZiAoYWRwYXRlci5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBjb25jcmV0ZUNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudClhZHBhdGVyLmdldFRhcmdldCgpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChyZWZlcmVuY2luZ09iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIGNvbmNyZXRlQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSByZWZlcmVuY2luZ09iamVjdDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGlmIChjb21wb25lbnQuaXNOZXcoKSkKLSAgICAgIHsgIAotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IG51bGw7Ci0gICAgICAgIGlmIChjb21wb25lbnQuZ2V0TWV0YU5hbWUoKSA9PSBJWFNEU2VhcmNoQ29uc3RhbnRzLkNPTVBMRVhfVFlQRV9NRVRBX05BTUUpCi0gICAgICAgIHsgIAotICAgICAgICAgIEFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25Db21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0NPTVBMRVhfVFlQRSwgY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgICAgIGNvbW1hbmQuc2V0TmFtZVRvQWRkKGNvbXBvbmVudC5nZXROYW1lKCkpOwotICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICAgIHRkID0gY29tbWFuZC5nZXRDcmVhdGVkQ29tcGxleFR5cGUoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfU0lNUExFX1RZUEUsIGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgICAgICBjb21tYW5kLnNldE5hbWVUb0FkZChjb21wb25lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgICB0ZCA9IGNvbW1hbmQuZ2V0Q3JlYXRlZFNpbXBsZVR5cGUoKTsKLSAgICAgICAgfSAgCi0gICAgICAgIGlmICh0ZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbmV3IFNldEJhc2VUeXBlQ29tbWFuZChjb25jcmV0ZUNvbXBvbmVudCwgdGQpOwotICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICB9ICAKLSAgICAgIH0gIAotICAgICAgZWxzZQotICAgICAgeyAgCi0gICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG5ldyBTZXRCYXNlVHlwZUFuZE1hbmFnZXJEaXJlY3RpdmVzQ29tbWFuZChjb25jcmV0ZUNvbXBvbmVudCwgY29tcG9uZW50LmdldE5hbWUoKSwgY29tcG9uZW50LmdldFF1YWxpZmllcigpLCBjb21wb25lbnQuZ2V0RmlsZSgpKTsKLSAgICAgICAgY29tbWFuZC5zZXRMYWJlbChNZXNzYWdlcy5fVUlfQUNUSU9OX1NFVF9CQVNFX1RZUEUpOwotICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgIH0gIAotICAgIH0KLSAgICBlbHNlIGlmIChjb25jcmV0ZUNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGlmIChjb21wb25lbnQuaXNOZXcoKSkKLSAgICAgIHsgIAotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IG51bGw7Ci0gICAgICAgIGlmIChjb21wb25lbnQuZ2V0TWV0YU5hbWUoKSA9PSBJWFNEU2VhcmNoQ29uc3RhbnRzLlNJTVBMRV9UWVBFX01FVEFfTkFNRSkKLSAgICAgICAgeyAgCi0gICAgICAgICAgQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25Db21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25Db21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX1NJTVBMRV9UWVBFLCBjb25jcmV0ZUNvbXBvbmVudC5nZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgY29tbWFuZC5zZXROYW1lVG9BZGQoY29tcG9uZW50LmdldE5hbWUoKSk7Ci0gICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgICAgdGQgPSBjb21tYW5kLmdldENyZWF0ZWRTaW1wbGVUeXBlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBuZXcgU2V0QmFzZVR5cGVDb21tYW5kKGNvbmNyZXRlQ29tcG9uZW50LCB0ZCk7Ci0gICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgIH0gIAotICAgICAgfSAgCi0gICAgICBlbHNlCi0gICAgICB7ICAKLSAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbmV3IFNldEJhc2VUeXBlQW5kTWFuYWdlckRpcmVjdGl2ZXNDb21tYW5kKGNvbmNyZXRlQ29tcG9uZW50LCBjb21wb25lbnQuZ2V0TmFtZSgpLCBjb21wb25lbnQuZ2V0UXVhbGlmaWVyKCksIGNvbXBvbmVudC5nZXRGaWxlKCkpOwotICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgIH0gIAotICAgIH0KLQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RFZGl0b3JDU0hlbHBJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RFZGl0b3JDU0hlbHBJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkwZGIxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yQ1NIZWxwSWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yOwotCi0vKioKLSAqIAotICogQ29udGV4dCBTZW5zaXRpdmUgSGVscCBJRHMKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RFZGl0b3JDU0hlbHBJZHMKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aSI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWF9XSVpBUkRfUEFHRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1dzAwMTAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWF9UT0tFTl9DT05URU5UUyA9IFBMVUdJTl9OQU1FICsgIi54c2R1dzAwMjAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWF9KVVNUX09OQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMDMwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhfWkVST19PUl9NT1JFID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDA0MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX09ORV9PUl9NT1JFID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDA1MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX09QVElPTkFMID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDA2MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX1JFUEVBVF9SQURJTyA9IFBMVUdJTl9OQU1FICsgIi54c2R1dzAwNzAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWF9SQU5HRV9SQURJTyA9IFBMVUdJTl9OQU1FICsgIi54c2R1dzAwODAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWF9SRVBFQVRfRklFTEQgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMDkwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhfUkFOR0VfTUlOSU1VTV9GSUVMRCA9IFBMVUdJTl9OQU1FICsgIi54c2R1dzAxMDAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWF9SQU5HRV9NQVhJTVVNX0ZJRUxEID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDExMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX0FERF9CVVRUT04gPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMTIwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhfQ1VSUkVOVF9WQUxVRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1dzAxMzAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhfVEVTVF9QQUdFID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDIwMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX1NBTVBMRV9URVhUID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDIxMCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU5BTUVfTkVXX05BTUUgPSBQTFVHSU5fTkFNRSArICIueHNkdXcwMzAwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVOQU1FX1VQREFURV9SRUZFUkVOQ0VTID0gUExVR0lOX05BTUUgKyAiLnhzZHV3MDMxMCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdUWVBFX0NPTVBMRVhUWVBFID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDAxMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV1RZUEVfU0lNUExFVFlQRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAwMjAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdUWVBFX05BTUUgPSBQTFVHSU5fTkFNRSArICIueHNkdWQwMDMwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVFRZUEVfTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAwNTAiOyAvLyB0aGVzZSAzIGFyZSBpbiBjb21tb24udWkKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUVFlQRV9UWVBFUyA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAwNjAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRUWVBFX1NFQVJDSFNDT1BFUyA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAwNzAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0VOVU1FUkFUSU9OU19fTk9fTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAwOTAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfRU5VTUVSQVRJT05TX19ERUxJTUlURVJfQ0hBUlMgPSBQTFVHSU5fTkFNRSArICIueHNkdWQwMTAwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0VOVU1FUkFUSU9OU19fUFJFU0VSVkVfTEVBRF9BTkRfVFJBSUxfV0hJVEVTUEFDRVMgPSBQTFVHSU5fTkFNRSArICIueHNkdWQwMTEwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9FWFRFTlNJT05TX0NPTVBPTkVOVFNfX0VYVEVOU0lPTl9DQVRFR09SSUVTID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDEzMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9FWFRFTlNJT05TX0NPTVBPTkVOVFNfX0FWQUlMQUJMRV9DT01QT05FTlRTX1RPX0FERCA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAxNDAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfRVhURU5TSU9OU19DT01QT05FTlRTX19BREQgPSBQTFVHSU5fTkFNRSArICIueHNkdWQwMTUwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0VYVEVOU0lPTlNfQ09NUE9ORU5UU19fREVMRVRFID0gUExVR0lOX05BTUUgKyAiLnhzZHVkMDE2MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9FWFRFTlNJT05TX0NPTVBPTkVOVFNfX0VESVQgPSBQTFVHSU5fTkFNRSArICIueHNkdWQwMTcwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9DQVRFR09SWV9fTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAxOTAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfQ0FURUdPUllfX1NDSEVNQSA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAyMDAiOyAvLyBjYW4ndCBpbnZva2UgaGVscCwgdGhpcyBpcyBhIENMYWJlbCwgbm90IHRleHQgRmllbGQKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DQVRBTE9HX0VOVFJJRVNfX0VOVFJJRVNfVFJFRUxJU1QgPSBQTFVHSU5fTkFNRSArICIueHNkdWQwMjIwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NBVEFMT0dfRU5UUklFU19fREVUQUlMUyA9IFBMVUdJTl9OQU1FICsgIi54c2R1ZDAyMzAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MU0NIRU1BRklMRVNfUFJFRkVSRU5DRVNfX1FVQUxJRllfWE1MU0NIRU1BX0xBTkdVQUdFX0NPTlNUUlVDVFMgPSBQTFVHSU5fTkFNRSArICIueHNkdWYwMDEwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MU0NIRU1BRklMRVNfUFJFRkVSRU5DRVNfX1hNTF9TQ0hFTUFfTEFOR1VBR0VfQ09OU1RSVUNUU19QUkVGSVggPSBQTFVHSU5fTkFNRSArICIueHNkdWYwMDIwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MU0NIRU1BRklMRVNfUFJFRkVSRU5DRVNfX0RFRkFVTFRfVEFSR0VUTkFNRVNQQUNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVmMDAzMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTFNDSEVNQUZJTEVTX1BSRUZFUkVOQ0VTX19IT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMgPSBQTFVHSU5fTkFNRSArICIueHNkdWYwMDQwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UQVRJT05fVEFCX19OT19MQUJFTCA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAwMTAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OU19UQUJfX0VYVEVOU0lPTlMgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMDMwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OU19UQUJfX0FERCA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAwNDAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05TX1RBQl9fREVMRVRFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDA1MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTlNfVEFCX19FWFRFTlNJT05TX0RFVEFJTFMgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMDYwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUUkFJTlRTX1RBQl9fTUlOSU1VTV9MRU5HVEggPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMDgwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RSQUlOVFNfVEFCX19NQVhJTVVNX0xFTkdUSCA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAwOTAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVFJBSU5UU19UQUJfX0NPTExBUFNFX1dISVRFU1BBQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMTAwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RSQUlOVFNfVEFCX19FTlVNRVJBVElPTlMgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMTEwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RSQUlOVFNfVEFCX19QQVRURVJOUyA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAxMjAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVFJBSU5UU19UQUJfX05PX0xBQkVMID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDEzMCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fU0NIRU1BX19QUkVGSVggPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMjAwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX1NDSEVNQV9fVEFSR0VUTkFNRVNQQUNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDIxMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19TQ0hFTUFfX0FEVkFOQ0VEID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDIyMCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fRUxFTUVOVF9fTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAyMzAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fRUxFTUVOVF9fVFlQRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAyNDAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fRUxFTUVOVF9fUkVGRVJFTkNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDI1MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19FTEVNRU5UX19NSU5fT0NDVVJFTkNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDE4MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19FTEVNRU5UX19NQVhfT0NDVVJFTkNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDE5MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQ09NUExFWF9UWVBFX19OQU1FID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDI2MCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19DT01QTEVYX1RZUEVfX0lOSEVSSVRfRlJPTSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAyNzAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQ09NUExFWF9UWVBFX19JTkhFUklUX0JZID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDI4MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fU0lNUExFX1RZUEVfX05BTUUgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMjkwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX1NJTVBMRV9UWVBFX19WQVJJRVRZID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDMwMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19TSU1QTEVfVFlQRV9fQkFTRV9UWVBFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDMxMCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQVRUUklCVVRFX19OQU1FID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDMyMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19BVFRSSUJVVEVfX1RZUEUgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMzMwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19BVFRSSUJVVEVHUk9VUF9fTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAzNDAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX01PREVMR1JPVVBfREVGSU5JVElPTl9fTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAzNTAiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX0lOQ0xVREVfUkVERUZJTkVfX1NDSEVNQUxPQ0FUSU9OID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDM2MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fSU1QT1JUX19TQ0hFTUFMT0NBVElPTiA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAzNzAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fSU1QT1JUX19OQU1FU1BBQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMzgwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX0lNUE9SVF9fUFJFRklYID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDM5MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQU5ZRUxFTUVOVF9fTkFNRVNQQUNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDQwMCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19BTllFTEVNRU5UX19QUk9DRVNTQ09OVEVOVFMgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwNDEwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX0FOWUVMRU1FTlRfX01JTl9PQ0NVUkVOQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMTgwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX0FOWUVMRU1FTlRfX01BWF9PQ0NVUkVOQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwMTkwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19BTllBVFRSSUJVVEVfX05BTUVTUEFDRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDA0MDAiOyAgLy8gdGhlc2UgNCBhcmUgbm90IHVzZWQsIHNhbWUgYXMgYW55ZWxlbWVudCBhYm92ZQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQU5ZQVRUUklCVVRFX19QUk9DRVNTQ09OVEVOVFMgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwNDEwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBTF9UQUJfX0FOWUFUVFJJQlVURV9fTUlOX09DQ1VSRU5DRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAxODAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fQU5ZQVRUUklCVVRFX19NQVhfT0NDVVJFTkNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDE5MCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9fS0lORCA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDA0MjAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9fTUlOX09DQ1VSRU5DRSA9IFBMVUdJTl9OQU1FICsgIi54c2R1cDAxODAiOyAvL2Nhbid0IGludm9rZSBoZWxwCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19NT0RFTEdST1VQX19NQVhfT0NDVVJFTkNFID0gUExVR0lOX05BTUUgKyAiLnhzZHVwMDE5MCI7IC8vIGNhbid0IGludm9rZSBoZWxwCi0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9SRUZTX19SRUYgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwNDMwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfVEFCX19BVFRSSUJVVEVHUk9VUF9SRUZTX19SRUYgPSBQTFVHSU5fTkFNRSArICIueHNkdXAwNDQwIjsKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVkaXRvckNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllNTgwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuSVhTRFRvb2xiYXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLklFeHRlbmRlZEZpZ3VyZUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFZGl0b3JDb25maWd1cmF0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVESVRPUkNPTkZJR1VSQVRJT05FWFRFTlNJT05JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLlhTREVkaXRvckV4dGVuc2lvbkNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSTkFMRURJVE9SQ09ORklHVVJBVElPTl9FWFRFTlNJT05JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsRWRpdG9yQ29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBREFQVEVSRkFDVE9SWSA9ICJhZGFwdGVyRmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTEJBUkFDVElPTiA9ICJ0b29sYmFyQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUdVUkVGQUNUT1JZID0gImZpZ3VyZUZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRQQVJURkFDVE9SWSA9ICJlZGl0UGFydEZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLSAgTGlzdCBkZWZpbmVkRXh0ZW5zaW9uc0xpc3QgPSBudWxsOwotCi0gIHB1YmxpYyBYU0RFZGl0b3JDb25maWd1cmF0aW9uKCkKLSAgewotCi0gIH0KLQotICBwdWJsaWMgWFNEQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKQotICB7Ci0gICAgaWYgKGRlZmluZWRFeHRlbnNpb25zTGlzdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlYWRYU0RDb25maWd1cmF0aW9uUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgaWYgKCFkZWZpbmVkRXh0ZW5zaW9uc0xpc3QuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJldHVybiAoKFhTREVkaXRvckV4dGVuc2lvblByb3BlcnRpZXMpIGRlZmluZWRFeHRlbnNpb25zTGlzdC5nZXQoMCkpLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIEVkaXRQYXJ0RmFjdG9yeSBnZXRFZGl0UGFydEZhY3RvcnkoKQotICB7Ci0gICAgaWYgKGRlZmluZWRFeHRlbnNpb25zTGlzdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlYWRYU0RDb25maWd1cmF0aW9uUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgaWYgKCFkZWZpbmVkRXh0ZW5zaW9uc0xpc3QuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJldHVybiAoKFhTREVkaXRvckV4dGVuc2lvblByb3BlcnRpZXMpIGRlZmluZWRFeHRlbnNpb25zTGlzdC5nZXQoMCkpLmdldEVkaXRQYXJ0RmFjdG9yeSgpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBJRXh0ZW5kZWRGaWd1cmVGYWN0b3J5IGdldEZpZ3VyZUZhY3RvcnkoKQotICB7Ci0gICAgaWYgKGRlZmluZWRFeHRlbnNpb25zTGlzdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlYWRYU0RDb25maWd1cmF0aW9uUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgaWYgKCFkZWZpbmVkRXh0ZW5zaW9uc0xpc3QuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJldHVybiAoKFhTREVkaXRvckV4dGVuc2lvblByb3BlcnRpZXMpIGRlZmluZWRFeHRlbnNpb25zTGlzdC5nZXQoMCkpLmdldEZpZ3VyZUZhY3RvcnkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRUb29sYmFyQWN0aW9ucygpCi0gIHsKLSAgICBpZiAoZGVmaW5lZEV4dGVuc2lvbnNMaXN0ID09IG51bGwpCi0gICAgewotICAgICAgcmVhZFhTRENvbmZpZ3VyYXRpb25SZWdpc3RyeSgpOwotICAgIH0KLSAgICBpZiAoIWRlZmluZWRFeHRlbnNpb25zTGlzdC5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmV0dXJuICgoWFNERWRpdG9yRXh0ZW5zaW9uUHJvcGVydGllcykgZGVmaW5lZEV4dGVuc2lvbnNMaXN0LmdldCgwKSkuZ2V0QWN0aW9uTGlzdCgpOwotICAgIH0KLSAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgfQotCi0gIHByb3RlY3RlZCBPYmplY3QgbG9hZENsYXNzKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgY2xhc3NTdHJpbmcpCi0gIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpLmxvYWRDbGFzcyhjbGFzc1N0cmluZyk7Ci0gICAgICBPYmplY3QgaW5zdGFuY2UgPSB0aGVDbGFzcy5uZXdJbnN0YW5jZSgpOwotCi0gICAgICByZXR1cm4gaW5zdGFuY2U7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWFkWFNEQ29uZmlndXJhdGlvblJlZ2lzdHJ5KCkKLSAgewotICAgIGRlZmluZWRFeHRlbnNpb25zTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB1cGRhdGVMaXN0KElOVEVSTkFMRURJVE9SQ09ORklHVVJBVElPTl9FWFRFTlNJT05JRCk7Ci0gICAgdXBkYXRlTGlzdChYU0RFRElUT1JDT05GSUdVUkFUSU9ORVhURU5TSU9OSUQpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgdXBkYXRlTGlzdChTdHJpbmcgSUQpCi0gIHsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB4c2RFZGl0b3JFeHRlbnNpb25MaXN0ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoSUQpOwotICAgIGJvb2xlYW4gZGVmaW5lZEV4dGVuc2lvbnNFeGlzdCA9ICh4c2RFZGl0b3JFeHRlbnNpb25MaXN0ICE9IG51bGwgJiYgeHNkRWRpdG9yRXh0ZW5zaW9uTGlzdC5sZW5ndGggPiAwKTsKLSAgICAKLSAgICBpZiAoZGVmaW5lZEV4dGVuc2lvbnNFeGlzdCkKLSAgICB7Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgeHNkRWRpdG9yRXh0ZW5zaW9uTGlzdC5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgWFNERWRpdG9yRXh0ZW5zaW9uUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhTREVkaXRvckV4dGVuc2lvblByb3BlcnRpZXMoKTsKLSAgICAgICAgZGVmaW5lZEV4dGVuc2lvbnNMaXN0LmFkZChwcm9wZXJ0aWVzKTsKLSAgCi0gICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0geHNkRWRpdG9yRXh0ZW5zaW9uTGlzdFtpXTsKLSAgICAgICAgU3RyaW5nIGFkYXB0ZXJGYWN0b3J5Q2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBREFQVEVSRkFDVE9SWSk7Ci0gICAgICAgIGlmIChhZGFwdGVyRmFjdG9yeUNsYXNzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbG9hZENsYXNzKGVsZW1lbnQsIGFkYXB0ZXJGYWN0b3J5Q2xhc3MpOwotICAgICAgICAgIFhTREFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQWRhcHRlckZhY3RvcnkpCi0gICAgICAgICAgewotICAgICAgICAgICAgYWRhcHRlckZhY3RvcnkgPSAoWFNEQWRhcHRlckZhY3RvcnkpIG9iamVjdDsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAKLSAgICAgICAgU3RyaW5nIGZpZ3VyZUZhY3RvcnlDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEZJR1VSRUZBQ1RPUlkpOwotICAgICAgICBpZiAoZmlndXJlRmFjdG9yeUNsYXNzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbG9hZENsYXNzKGVsZW1lbnQsIGZpZ3VyZUZhY3RvcnlDbGFzcyk7Ci0gICAgICAgICAgSUV4dGVuZGVkRmlndXJlRmFjdG9yeSBmaWd1cmVGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUV4dGVuZGVkRmlndXJlRmFjdG9yeSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmaWd1cmVGYWN0b3J5ID0gKElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkpIG9iamVjdDsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0RmlndXJlRmFjdG9yeUxpc3QoZmlndXJlRmFjdG9yeSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gIAotICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB0b29sYmFyQWN0aW9ucyA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVE9PTEJBUkFDVElPTik7Ci0gICAgICAgIExpc3QgYWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaWYgKHRvb2xiYXJBY3Rpb25zICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRvb2xiYXJBY3Rpb25zLmxlbmd0aDsgaisrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBhY3Rpb25FbGVtZW50ID0gdG9vbGJhckFjdGlvbnNbal07Ci0gICAgICAgICAgICBTdHJpbmcgYWN0aW9uQ2xhc3MgPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShDTEFTU05BTUUpOwotICAgICAgICAgICAgSVhTRFRvb2xiYXJBY3Rpb24gYWN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChhY3Rpb25DbGFzcyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbG9hZENsYXNzKGFjdGlvbkVsZW1lbnQsIGFjdGlvbkNsYXNzKTsKLSAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElYU0RUb29sYmFyQWN0aW9uKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWN0aW9uID0gKElYU0RUb29sYmFyQWN0aW9uKSBvYmplY3Q7Ci0gICAgICAgICAgICAgICAgYWN0aW9uTGlzdC5hZGQoYWN0aW9uKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcm9wZXJ0aWVzLnNldEFjdGlvbkxpc3QoYWN0aW9uTGlzdCk7Ci0gIAotICAgICAgICBTdHJpbmcgZWRpdFBhcnRGYWN0b3J5Q2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShFRElUUEFSVEZBQ1RPUlkpOwotICAgICAgICBpZiAoZWRpdFBhcnRGYWN0b3J5Q2xhc3MgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBsb2FkQ2xhc3MoZWxlbWVudCwgZWRpdFBhcnRGYWN0b3J5Q2xhc3MpOwotICAgICAgICAgIEVkaXRQYXJ0RmFjdG9yeSBlZGl0UGFydEZhY3RvcnkgPSBudWxsOwotICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFZGl0UGFydEZhY3RvcnkpCi0gICAgICAgICAgewotICAgICAgICAgICAgZWRpdFBhcnRGYWN0b3J5ID0gKEVkaXRQYXJ0RmFjdG9yeSkgb2JqZWN0OwotICAgICAgICAgICAgcHJvcGVydGllcy5zZXRFZGl0UGFydEZhY3RvcnlMaXN0KGVkaXRQYXJ0RmFjdG9yeSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVkaXRvckNvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg4ZjcwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLS8qKgotICogQ29udGV4dCBoZWxwIGlkIGNvbnN0YW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBYU0RFZGl0b3JDb250ZXh0SWRzIAotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsIjsKLQotICAvKiBDT05URVhUX0lEcyBOZXcgWFNEIFdpemFyZCB1c2VzIHRoZSBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIGZyb20gb3JnLmVjbGlwc2UudWkuZGlhbG9ncyAqLwotIAotICAvKiBDT05URVhUX0lEcyBmb3IgWFNERWRpdG9yIGZvbGxvdyB0aGUgeHNkZXh4eCBjb250ZXh0IElEcyAqLwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTAwMTAgZm9yIFhTRCBFZGl0b3IgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TQ0hFTUFfREVTSUdOX1ZJRVcgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDAxMCI7Ci0gIC8qIG5vIENPTlRFWFRfSUQgZm9yIEZpbGUgTmFtZSBUZXh0IEVkaXQgKG5vdCBlZGl0YWJsZSkgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDAyMCBmb3IgVmVyc2lvbiBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TQ0hFTUFfVkVSU0lPTiAgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDAyMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAwMzAgZm9yIExhbmd1YWdlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NDSEVNQV9MQU5HVUFHRSAgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwMDMwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDA0MCBmb3IgTmFtZXNwYWNlIEdyb3VwICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0NIRU1BX05BTUVTUEFDRV9HUk9VUCAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAwNDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwMDUwIGZvciBQcmVmaXggVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0NIRU1BX1BSRUZJWCAgICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAwNTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwMDYwIGZvciBUYXJnZXQgbmFtZXNwYWNlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NDSEVNQV9UQVJHRVRfTkFNRVNQQUNFID0gUExVR0lOX05BTUUgKyAiLnhzZGUwMDYwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDA3MCBmb3IgQXBwbHkgUHVzaCBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TQ0hFTUFfQVBQTFkgICAgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDA3MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAwODAgZm9yIEF0dHJpYnV0ZSBmb3JtIGRlZmF1bHQgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0NIRU1BX0FUVFJJQlVURSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAwODAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwMDkwIGZvciBFbGVtZW50IGZvcm0gZGVmYXVsdCBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TQ0hFTUFfRUxFTUVOVCAgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDA5MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAxMDAgZm9yIEJsb2NrIGRlZmF1bHQgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0NIRU1BX0JMT0NLICAgICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAxMDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwMTEwIGZvciBGaW5hbCBEZWZhdWx0IENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NDSEVNQV9GSU5BTCAgICAgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwMTEwIjsKLQotICAKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDIwMCBmb3IgQW5ub3RhdGlvbnMgQ29tbWVudCBHcm91cCAtIG9ubHkgdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIERvY3VtZW50YXRpb24gRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBBcHAgSW5mbyBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FOTk9UQVRJT05fQ09NTUVOVF9HUk9VUCA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDIwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAyMTAgZm9yIEFubm90YXRpb25zIENvbW1lbnQgR3JvdXAgLSBvbmx5IHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBEb2N1bWVudGF0aW9uIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gQXBwIEluZm8gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BTk5PVEFUSU9OX0NPTU1FTlQgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAyMTAiOwotICAKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDMwMCBmb3IgRG9jdW1lbnRhdGlvbiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0RPQ1VNRU5UQVRJT05fREVTSUdOX1ZJRVcgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDMwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTAzMTAgZm9yIFNvdXJjZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9ET0NVTUVOVEFUSU9OX1NPVVJDRSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAzMTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwMzIwIGZvciBMYW5ndWFnZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9ET0NVTUVOVEFUSU9OX0xBTkdVQUdFICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTAzMjAiOwotICAvKiBDT05URVhUX0lEIENvbW1lbnQgR3JvdXAgaXMgZnJvbSBBbm5vdGF0aW9ucyBXaW5kb3cgeHNkZTAyMDAgKi8KLSAgLyogQ09OVEVYVF9JRCBDb21tZW50IE11bHRpLWxpbmUgRWRpdCBpcyBmcm9tIEFubm90YXRpb25zIFdpbmRvdyB4c2QwMjEwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDQwMCBmb3IgQXBwIEluZm8gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BUFBfSU5GT19ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDQwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA0MTAgZm9yIEFwcCBJbmZvIFNvdXJjZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BUFBfSU5GT19TT1VSQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkZTA0MTAiOwotICAvKiBDT05URVhUX0lEIENvbW1lbnQgR3JvdXAgaXMgZnJvbSBBbm5vdGF0aW9ucyBXaW5kb3cgeHNkZTAyMDAgKi8KLSAgLyogQ09OVEVYVF9JRCBDb21tZW50IE11bHRpLWxpbmUgRWRpdCBpcyBmcm9tIEFubm90YXRpb25zIFdpbmRvdyB4c2QwMjEwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDUwMCBmb3IgQ29tcGxleCBUeXBlIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQ09NUExFWF9ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDUwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA1MTAgZm9yIE5hbWUgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQ09NUExFWF9OQU1FICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDUxMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA1MjAgZm9yIEFic3RyYWN0IENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0NPTVBMRVhfQUJTVFJBQ1QgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA1MjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNTMwIGZvciBNaXhlZCBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9DT01QTEVYX01JWEVEICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwNTMwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDU0MCBmb3IgQmxvY2sgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQ09NUExFWF9CTE9DSyAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDU0MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA1NTAgZm9yIEZpbmFsIENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0NPTVBMRVhfRklOQUwgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA1NTAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTA2MDAgZm9yIFNpbXBsZSBUeXBlIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0lNUExFX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUwNjAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDYxMCBmb3IgTmFtZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9TSU1QTEVfTkFNRSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA2MTAiOwotCi0gIC8qIENPTlRFWFRfSUQgZm9yIEdsb2JhbCBFbGVtZW50IGFuZCBFbGVtZW50IERlc2lnbiBWaWV3cyBhcmUgdGhlIHNhbWUgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDcwMCBmb3IgRWxlbWVudCBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3MDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNzEwIGZvciBFbGVtZW50IE5hbWUgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9OQU1FICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3MTAiOwotICAvKiBDT05URVhUX0lEIFR5cGUgSW5mb3JtYXRpb24gR3JvdXAgaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkwMCAqLwotICAvKiBDT05URVhUX0lEIEJ1aWx0LWluIHNpbXBsZSB0eXBlIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTIwICovCi0gIC8qIENPTlRFWFRfSUQgVXNlci1kZWZpbmVkIHNpbXBsZSB0eXBlIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTMwICovCi0gIC8qIENPTlRFWFRfSUQgVXNlci1kZWZpbmVkIGNvbXBsZXggdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDk0MCAqLwotICAvKiBDT05URVhUX0lEIFR5cGUgaW5mb3JtYXRpb24gQ29tYm8gQm94IGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5NTAgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMDcyMCBmb3IgQWJzdHJhY3QgQ2hlY2sgQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9BQlNUUkFDVCAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3MjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNzMwIGZvciBOaWxsYWJsZSBDaGVjayBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX05JTExBQkxFICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDczMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA3NDAgZm9yIFZhbHVlIEdyb3VwICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9WQUxVRSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3NDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNzUwIGZvciBGaXhlZCBSYWRpbyBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX0ZJWEVEICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDc1MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA3NjAgZm9yIERlZmF1bHQgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9ERUZBVUxUICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3NjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwNzcwIGZvciBWYWx1ZSBHcm91cCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfVkFMVUVfR1JPVVAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwNzcwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDc4MCBmb3IgTWluaW11bSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX01JTklNVU0gICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDc4MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA3OTAgZm9yIE1heGltdW0gVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9NQVhJTVVNICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA3OTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwODAwIGZvciBCbG9jayBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX0JMT0NLICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDgwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTA4MTAgZm9yIEZpbmFsIENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfRklOQUwgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwODEwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDgyMCBmb3IgU3Vic3RpdHV0aW9uIEdyb3VwIENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfU1VCU1RJVFVUSU9OID0gUExVR0lOX05BTUUgKyAiLnhzZGUwODIwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDgzMCBmb3IgRm9ybSBRdWFsaWZpY2F0aW9uIENvbWJvIEJveCAqLyAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9GT1JNICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA4MzAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTA5MDAgZm9yIFR5cGUgSGVscGVyIEdyb3VwIC0gb25seSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gR2xvYmFsIEVsZW1lbnQgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBHbG9iYWwgQXR0cmlidXRlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gU2ltcGxlIENvbnRlbnQgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBSZXN0cmljdGlvbiBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIExpc3QgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBVbmlvbiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1RZUEVfSEVMUEVSX0dST1VQICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUwOTAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMDkxMCBmb3IgTm9uZSBSYWRpbyBCdXR0b24gLSBvbmx5IHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBTaW1wbGUgQ29udGVudCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFJlc3RyaWN0aW9uIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gTGlzdCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFVuaW9uIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVFlQRV9IRUxQRVJfTk9ORSAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTA5MTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwOTIwIGZvciBCdWlsdC1pbiBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gLSBvbmx5IHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBHbG9iYWwgRWxlbWVudCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEdsb2JhbCBBdHRyaWJ1dGUgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBTaW1wbGUgQ29udGVudCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFJlc3RyaWN0aW9uIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gTGlzdCBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFVuaW9uIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVFlQRV9IRUxQRVJfQlVJTFRfSU4gPSBQTFVHSU5fTkFNRSArICIueHNkZTA5MjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwOTMwIGZvciBVc2VyLWRlZmluZWQgc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIC0gb25seSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gR2xvYmFsIEVsZW1lbnQgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBHbG9iYWwgQXR0cmlidXRlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gU2ltcGxlIENvbnRlbnQgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBSZXN0cmljdGlvbiBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIExpc3QgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBVbmlvbiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1RZUEVfSEVMUEVSX1VTRVJfREVGSU5FRF9TSU1QTEUgPSBQTFVHSU5fTkFNRSArICIueHNkZTA5MzAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwOTQwIGZvciBVc2VyLWRlZmluZWQgY29tcGxleCB0eXBlIFJhZGlvIEJ1dHRvbiAtIG9ubHkgdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEdsb2JhbCBFbGVtZW50IERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVFlQRV9IRUxQRVJfVVNFUl9ERUZJTkVEX0NPTVBMRVggPSBQTFVHSU5fTkFNRSArICIueHNkZTA5NDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUwOTUwIGZvciBUeXBlIGluZm9ybWF0aW9uIENvbWJvIEJveCAtIG9ubHkgdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEdsb2JhbCBFbGVtZW50IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gR2xvYmFsIEF0dHJpYnV0ZSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFNpbXBsZSBDb250ZW50IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gUmVzdHJpY3Rpb24gRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBMaXN0IERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVFlQRV9IRUxQRVJfVFlQRSA9IFBMVUdJTl9OQU1FICsgIi54c2RlMDk1MCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTAwMCBmb3IgQXR0cmlidXRlIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQVRUUklCVVRFX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMDAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTAxMCBmb3IgQXR0cmlidXRlIE5hbWUgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQVRUUklCVVRFX05BTUUgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMDEwIjsKLSAgLyogQ09OVEVYVF9JRCBUeXBlIEluZm9ybWF0aW9uIEdyb3VwIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MDAgKi8KLSAgLyogQ09OVEVYVF9JRCBCdWlsdC1pbiBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkyMCAqLwotICAvKiBDT05URVhUX0lEIFVzZXItZGVmaW5lZCBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkzMCAqLwotICAvKiBDT05URVhUX0lEIFR5cGUgaW5mb3JtYXRpb24gQ29tYm8gQm94IGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5NTAgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTAyMCBmb3IgVmFsdWUgR3JvdXAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfVkFMVUVfR1JPVVAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEwMjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxMDMwIGZvciBGaXhlZCBSYWRpbyBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfRklYRUQgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEwMzAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxMDQwIGZvciBEZWZhdWx0IFJhZGlvIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FUVFJJQlVURV9ERUZBVUxUICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTA0MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTEwNTAgZm9yIFZhbHVlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FUVFJJQlVURV9WQUxVRSAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTA1MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTEwNjAgZm9yIFVzYWdlIENvbWJvIEJveCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FUVFJJQlVURV9VU0FHRSAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTA2MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTEwNzAgZm9yIEZvcm0gcXVhbGlmaWNhaXRvbiBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfRk9STSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEwNzAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTExMDAgZm9yIEVsZW1lbnQgUmVmIFdpbmRvdyBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfUkVGX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMTAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTExMCBmb3IgUmVmZXJlbmNlIE5hbWUgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRUxFTUVOVF9SRUZfUkVGRVJFTkNFICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTExMTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxMTIwIGZvciBNaW5pbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0VMRU1FTlRfUkVGX01JTklNVU0gICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMTIwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTEzMCBmb3IgTWF4aW11bSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTEVNRU5UX1JFRl9NQVhJTVVNICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTEzMCI7Ci0gIAotICAvKiBDT05URVhUX0lEIHhzZGUxMjAwIGZvciBTaW1wbGUgQ29udGVudCBEZXNpZ24gVmlldyAtIHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBTaW1wbGUgQ29udGVudCBEZXNpZ24gVmlldyAqLyAKLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBDb21wbGV4IENvbnRlbnQgRGVzaWduIFZpZXcgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NJTVBMRV9DT05URU5UX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxMjAwIjsKLSAgLyogQ09OVEVYVF9JRCBCYXNlIFR5cGUgR3JvdXAgaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkwMCAqLwotICAvKiBDT05URVhUX0lEIE5vbmUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MTAgKi8KLSAgLyogQ09OVEVYVF9JRCBCdWlsdC1pbiBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkyMCAqLwotICAvKiBDT05URVhUX0lEIFVzZXItZGVmaW5lZCBzaW1wbGUgdHlwZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkzMCAqLwotICAvKiBDT05URVhUX0lEIFR5cGUgaW5mb3JtYXRpb24gQ29tYm8gQm94IGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5NTAgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTIxMCBmb3IgRGVyaXZlZCBieSBDb21ibyBCb3ggLSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gU2ltcGxlIENvbnRlbnQgRGVzaWduIFZpZXcgKi8gCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gQ29tcGxleCBDb250ZW50IERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfU0lNUExFX0NPTlRFTlRfREVSSVZFRCA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTIxMCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTMwMCBmb3IgUmVzdHJpY3Rpb24gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9SRVNUUklDVElPTl9ERVNJR05fVklFVyAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEzMDAiOwotICAvKiBDT05URVhUX0lEIEJhc2UgVHlwZSBHcm91cCBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTAwICovCi0gIC8qIENPTlRFWFRfSUQgTm9uZSBSYWRpbyBCdXR0b24gaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDkxMCAqLwotICAvKiBDT05URVhUX0lEIEJ1aWx0LWluIHNpbXBsZSB0eXBlIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTIwICovCi0gIC8qIENPTlRFWFRfSUQgVXNlci1kZWZpbmVkIHNpbXBsZSB0eXBlIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTMwICovCi0gIC8qIENPTlRFWFRfSUQgVHlwZSBpbmZvcm1hdGlvbiBDb21ibyBCb3ggaXMgZnJvbSBUeXBlIEhlbHBlciB4c2RlMDk1MCAqLwotICAvKiBDT05URVhUX0lEIHhzZGUxMzEwIGZvciBGYWNldHMgR3JvdXAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9SRVNUUklDVElPTl9GQUNFVFNfR1JPVVAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEzMTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxMzIwIGZvciBGYWNldHMgVGFibGUgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9SRVNUUklDVElPTl9GQUNFVFMgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTEzMjAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTE0MDAgZm9yIExpc3QgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9MSVNUX0RFU0lHTl9WSUVXICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTQwMCI7Ci0gIC8qIENPTlRFWFRfSUQgQmFzZSBUeXBlIEdyb3VwIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MDAgKi8KLSAgLyogQ09OVEVYVF9JRCBOb25lIFJhZGlvIEJ1dHRvbiBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTEwICovCi0gIC8qIENPTlRFWFRfSUQgQnVpbHQtaW4gc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MjAgKi8KLSAgLyogQ09OVEVYVF9JRCBVc2VyLWRlZmluZWQgc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MzAgKi8KLSAgLyogQ09OVEVYVF9JRCBUeXBlIGluZm9ybWF0aW9uIENvbWJvIEJveCBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTUwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTUwMCBmb3IgQXR0cmlidXRlIEdyb3VwIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQVRUUklCVVRFX0dST1VQX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxNTAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTUxMCBmb3IgTmFtZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfR1JPVVBfTkFNRSA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTUxMCI7Ci0KLSAgLyogQ09OVEVYVF9JRCBmb3IgR2xvYmFsIEF0dHJpYnV0ZSBhbmQgQXR0cmlidXRlIERlc2lnbiBWaWV3cyBhcmUgdGhlIHNhbWUgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMTYwMCBmb3IgQXR0cmlidXRlIEdyb3VwIFJlZmVyZW5jZSBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FUVFJJQlVURV9HUk9VUF9SRUZfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTE2MDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUxNjEwIGZvciBSZWZlcmVuY2UgTmFtZSBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfR1JPVVBfUkVGX05BTUUgPSBQTFVHSU5fTkFNRSArICIueHNkZTE2MTAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTE3MDAgZm9yIEF0dHJpYnV0ZSBSZWZlcmVuY2UgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BVFRSSUJVVEVfUkVGX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxNzAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTcxMCBmb3IgUmVmZXJlbmNlIE5hbWUgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQVRUUklCVVRFX1JFRl9OQU1FID0gUExVR0lOX05BTUUgKyAiLnhzZGUxNzEwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUxODAwIGZvciBQYXR0ZXJuIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfUEFUVEVSTl9ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTgwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTE4MTAgZm9yIFZhbHVlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1BBVFRFUk5fVkFMVUUgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTgxMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTE4MjAgZm9yIENyZWF0ZSBSZWd1bGFyIEV4cHJlc3Npb24gUHVzaCBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9QQVRURVJOX1JFR1VMQVIgPSBQTFVHSU5fTkFNRSArICIueHNkZTE4MjAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTE5MDAgZm9yIEVudW0gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9FTlVNX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUxOTAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMTkxMCBmb3IgVmFsdWUgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfRU5VTV9WQUxVRSAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMTkxMCI7Ci0gIAotICAvKiBDT05URVhUX0lEIHhzZGUyMDAwIGZvciBJbmNsdWRlIERlc2lnbiBQYWdlICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfSU5DTFVERV9ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjAwMCI7Ci0gIC8qIG5vIENPTlRFWFRfSUQgZm9yIFNjaGVtYSBMb2NhdGlvbiBUZXh0IEVkaXQgKG5vdCBlZGl0YWJsZSkgKi8KLSAgLyogQ09OVEVYVF9JRCBTZWxlY3QgUHVzaCBCdXR0b24gaXMgZnJvbSBJbmNsdWRlIEhlbHBlciB4c2RlMjEwMCAqLyAKLSAgCi0gIC8qIENPTlRFWFRfSUQgeHNkZTIxMDAgZm9yIEluY2x1ZGUgSGVscGVyIFNlbGVjdCBQdXNoIEJ1dHRvbiAtIHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBJbmNsdWRlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gSW1wb3J0IERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfSU5DTFVERV9IRUxQRVJfU0VMRUNUID0gUExVR0lOX05BTUUgKyAiLnhzZGUyMTAwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUyMjAwIGZvciBJbXBvcnQgRGVzaWduIFBhZ2UgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9JTVBPUlRfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTIyMDAiOwotICAvKiBubyBDT05URVhUX0lEIGZvciBTY2hlbWEgTG9jYXRpb24gVGV4dCBFZGl0IChub3QgZWRpdGFibGUpICovCi0gIC8qIENPTlRFWFRfSUQgU2VsZWN0IFB1c2ggQnV0dG9uIGlzIGZyb20gSW5jbHVkZSBIZWxwZXIgeHNkZTIxMDAgKi8KLSAgLyogQ09OVEVYVF9JRCB4c2RlMjIxMCBmb3IgUHJlZml4IFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0lNUE9SVF9QUkVGSVggICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjIxMCI7Ci0gIC8qIG5vIENPTlRFWFRfSUQgZm9yIE5hbWVzcGFjZSBUZXh0IEVkaXQgKG5vdCBlZGl0YWJsZSkgKi8KLQotICAvKiBDT05URVhUX0lEIHhzZGUyMzAwIGZvciBSZWRlZmluZSBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1JFREVGSU5FX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUyMzAwIjsKLSAgLyogbm8gQ09OVEVYVF9JRCBmb3IgU2NoZW1hIExvY2F0aW9uIFRleHQgRWRpdCAobm90IGVkaXRhYmxlKSAqLwotICAvKiBDT05URVhUX0lEIFNlbGVjdCBQdXNoIEJ1dHRvbiBpcyBmcm9tIEluY2x1ZGUgSGVscGVyIHhzZGUyMTAwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMjQwMCBmb3IgR3JvdXAgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9HUk9VUF9ERVNJR05fVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjQwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI0MTAgZm9yIE5hbWUgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfTkFNRSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI0MTAiOwotCi0gIC8qIENPTlRFWFRfSUQgeHNkZTI1MDAgZm9yIEdyb3VwIFNjb3BlIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfU0NPUEVfREVTSUdOX1ZJRVcgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjUwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI1MTAgZm9yIENvbnRlbnQgbW9kZWwgR3JvdXAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9HUk9VUF9TQ09QRV9DT05URU5UX0dST1VQID0gUExVR0lOX05BTUUgKyAiLnhzZGUyNTEwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjUyMCBmb3IgU2VxdWVuY2UgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfU0NPUEVfU0VRVUVOQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkZTI1MjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyNTMwIGZvciBDaG9pY2UgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfU0NPUEVfQ0hPSUNFICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI1MzAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyNTQwIGZvciBBbGwgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfU0NPUEVfQUxMICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI1NDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyNTUwIGZvciBNaW5pbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0dST1VQX1NDT1BFX01JTklNVU0gID0gUExVR0lOX05BTUUgKyAiLnhzZGUyNTUwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjU2MCBmb3IgTWF4aW11bSBUZXh0IEVkaXQqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0dST1VQX1NDT1BFX01BWElNVU0gID0gUExVR0lOX05BTUUgKyAiLnhzZGUyNTYwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUyNjAwIGZvciBHcm91cCBSZWYgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9HUk9VUF9SRUZfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTI2MDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyNjEwIGZvciBSZWZlcmVuY2UgbmFtZSBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9HUk9VUF9SRUZfUkVGRVJFTkNFICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI2MTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyNjIwIGZvciBNaW5pbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0dST1VQX1JFRl9NSU5JTVVNICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjYyMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI2MzAgZm9yIE1heGltdW0gVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfR1JPVVBfUkVGX01BWElNVU0gICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUyNjMwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUyNzAwIGZvciBVbmlxdWUgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9VTklRVUVfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTI3MDAiOwotICAvKiBDT05URVhUX0lEIE5hbWUgVGV4dCBFZGl0IGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MDAgKi8KLSAgLyogQ09OVEVYVF9JRCBTZWxlY3RvciBHcm91cCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODEwICovCi0gIC8qIENPTlRFWFRfSUQgU2VsZWN0b3IgTXVsaXQtbGluZSBFZGl0IGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MjAgKi8KLSAgLyogQ09OVEVYVF9JRCBGaWVsZHMgR3JvdXAgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjgzMCAqLwotICAvKiBDT05URVhUX0lEIFNvdXJjZSBUZXh0IEVkaXQgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg0MCAqLwotICAvKiBDT05URVhUX0lEIEFkZCBQdXNoIEJ1dHRvbiBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODUwICovCi0gIC8qIENPTlRFWFRfSUQgUmVtb3ZlIFB1c2ggQnV0dG9uIGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4NjAgKi8KLSAgLyogQ09OVEVYVF9JRCBUYXJnZXQgTGlzdCBCb3ggaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg3MCAqLwotICAKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjgwMCBmb3IgVW5pcXVlIEJhc2UgTmFtZSBUZXh0IEVkaXQgLSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gVW5pcXVlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IFJlZiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1VOSVFVRV9CQVNFX05BTUUgPSBQTFVHSU5fTkFNRSArICIueHNkZTI4MDAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyODEwIGZvciBTZWxlY3RvciBHcm91cCAtIHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBVbmlxdWUgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgUmVmIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVU5JUVVFX0JBU0VfU0VMRUNUT1JfR1JPVVAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI4MTAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyODIwIGZvciBTZWxlY3RvciBNdWx0aS1saW5lIEVkaXQgLSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gVW5pcXVlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IFJlZiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1VOSVFVRV9CQVNFX1NFTEVDVE9SICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUyODIwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjgzMCBmb3IgRmllbGRzIEdyb3VwIC0gdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFVuaXF1ZSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEtleSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEtleSBSZWYgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9VTklRVUVfQkFTRV9GSUVMRFNfR1JPVVAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjgzMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI4NDAgZm9yIFNvdXJjZSBUZXh0IEVkaXQgLSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gVW5pcXVlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IFJlZiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1VOSVFVRV9CQVNFX1NPVVJDRSAgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUyODQwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMjg1MCBmb3IgQWRkIFB1c2ggQnV0dG9uIC0gdXNlZCBnZW5lcmljYWxseSAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIFVuaXF1ZSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEtleSBEZXNpZ24gVmlldyAqLwotICAvKiBDT05URVhUX0lEICAgICAgLSB1c2VkIGluIEtleSBSZWYgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9VTklRVUVfQkFTRV9BREQgICAgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMjg1MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTI4NjAgZm9yIFJlbW92ZSBQdXNoIEJ1dHRvbiAtIHVzZWQgZ2VuZXJpY2FsbHkgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBVbmlxdWUgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgRGVzaWduIFZpZXcgKi8KLSAgLyogQ09OVEVYVF9JRCAgICAgIC0gdXNlZCBpbiBLZXkgUmVmIERlc2lnbiBWaWV3ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfVU5JUVVFX0JBU0VfUkVNT1ZFICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTI4NjAiOwotICAvKiBDT05URVhUX0lEIHhzZGUyODcwIGZvciBUYXJnZXQgTGlzdCBCb3ggLSB1c2VkIGdlbmVyaWNhbGx5ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gVW5pcXVlIERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IERlc2lnbiBWaWV3ICovCi0gIC8qIENPTlRFWFRfSUQgICAgICAtIHVzZWQgaW4gS2V5IFJlZiBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1VOSVFVRV9CQVNFX1RBUkdFVCAgICAgICAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUyODcwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGUyOTAwIGZvciBLZXkgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9LRVlfREVTSUdOX1ZJRVcgPSBQTFVHSU5fTkFNRSArICIueHNkZTI5MDAiOwotICAvKiBDT05URVhUX0lEIE5hbWUgVGV4dCBFZGl0IGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MDAgKi8KLSAgLyogQ09OVEVYVF9JRCBTZWxlY3RvciBHcm91cCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODEwICovCi0gIC8qIENPTlRFWFRfSUQgU2VsZWN0b3IgTXVsaXQtbGluZSBFZGl0IGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MjAgKi8KLSAgLyogQ09OVEVYVF9JRCBGaWVsZHMgR3JvdXAgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjgzMCAqLwotICAvKiBDT05URVhUX0lEIFNvdXJjZSBUZXh0IEVkaXQgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg0MCAqLwotICAvKiBDT05URVhUX0lEIEFkZCBQdXNoIEJ1dHRvbiBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODUwICovCi0gIC8qIENPTlRFWFRfSUQgUmVtb3ZlIFB1c2ggQnV0dG9uIGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4NjAgKi8KLSAgLyogQ09OVEVYVF9JRCBUYXJnZXQgTGlzdCBCb3ggaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg3MCAqLwotICAvKiBDT05URVhUX0lEIHhzZGUyOTAwIGZvciBLZXkgRGVzaWduIFZpZXcgKi8KLSAgCi0gIC8qIENPTlRFWFRfSUQgeHNkZTI5NTAgZm9yIEtleSBSZWYgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9LRVlfUkVGX0RFU0lHTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUyOTUwIjsKLSAgLyogQ09OVEVYVF9JRCBOYW1lIFRleHQgRWRpdCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODAwICovCi0gIC8qIENPTlRFWFRfSUQgeHNkZTI5NjAgZm9yIFJlZmVyZW5jZSBLZXkgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfS0VZX1JFRl9SRUZFUkVOQ0UgPSBQTFVHSU5fTkFNRSArICIueHNkZTI5NjAiOwotICAvKiBDT05URVhUX0lEIFNlbGVjdG9yIEdyb3VwIGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4MTAgKi8KLSAgLyogQ09OVEVYVF9JRCBTZWxlY3RvciBNdWxpdC1saW5lIEVkaXQgaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjgyMCAqLwotICAvKiBDT05URVhUX0lEIEZpZWxkcyBHcm91cCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODMwICovCi0gIC8qIENPTlRFWFRfSUQgU291cmNlIFRleHQgRWRpdCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODQwICovCi0gIC8qIENPTlRFWFRfSUQgQWRkIFB1c2ggQnV0dG9uIGlzIGZyb20gVW5pcXVlIEJhc2UgeHNkZTI4NTAgKi8KLSAgLyogQ09OVEVYVF9JRCBSZW1vdmUgUHVzaCBCdXR0b24gaXMgZnJvbSBVbmlxdWUgQmFzZSB4c2RlMjg2MCAqLwotICAvKiBDT05URVhUX0lEIFRhcmdldCBMaXN0IEJveCBpcyBmcm9tIFVuaXF1ZSBCYXNlIHhzZGUyODcwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMzAwMCBmb3IgQW55IEVsZW1lbnQgRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BTllfRUxFTUVOVF9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUzMDAwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMzAxMCBmb3IgTmFtZXNwYWNlIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FOWV9FTEVNRU5UX05BTUVTUEFDRSA9IFBMVUdJTl9OQU1FICsgIi54c2RlMzAxMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTMwMjAgZm9yIFByb2Nlc3MgQ29udGVudHMgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQU5ZX0VMRU1FTlRfUFJPQ0VTUyAgID0gUExVR0lOX05BTUUgKyAiLnhzZGUzMDIwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RlMzAzMCBmb3IgTWluaW11bSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BTllfRUxFTUVOVF9NSU5JTVVNICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTMwMzAiOwotICAvKiBDT05URVhUX0lEIHhzZGUzMDQwIGZvciBNYXhpbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FOWV9FTEVNRU5UX01BWElNVU0gICA9IFBMVUdJTl9OQU1FICsgIi54c2RlMzA0MCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMzEwMCBmb3IgQW55IEF0dHJpYnV0ZSBEZXNpZ24gVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX0FOWV9BVFRSSUJVVEVfVklFVyA9IFBMVUdJTl9OQU1FICsgIi54c2RlMzEwMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTMxMTAgZm9yIE5hbWVzcGFjZSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9BTllfQVRUUklCVVRFX05BTUVTUEFDRSA9IFBMVUdJTl9OQU1FICsgIi54c2RlMzExMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkZTMxMjAgZm9yIFByb2Nlc3MgQ29udGVudHMgQ29tYm8gQm94ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTREVfQU5ZX0FUVFJJQlVURV9QUk9DRVNTICAgPSBQTFVHSU5fTkFNRSArICIueHNkZTMxMjAiOwotCi0gIC8qIG5vIENPTlRFWFRfSUQgZm9yIFVuaW9uIERlc2lnbiBWaWV3IC0gdXNlcyBhIGdlbmVyaWMgaW50ZXJmYWNlICovCi0gIC8qIENPTlRFWFRfSUQgVHlwZSBJbmZvcm1hdGlvbiBHcm91cCBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTAwICovCi0gIC8qIENPTlRFWFRfSUQgQnVpbHQtaW4gc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MjAgKi8KLSAgLyogQ09OVEVYVF9JRCBVc2VyLWRlZmluZWQgc2ltcGxlIHR5cGUgUmFkaW8gQnV0dG9uIGlzIGZyb20gVHlwZSBIZWxwZXIgeHNkZTA5MzAgKi8KLSAgLyogQ09OVEVYVF9JRCBUeXBlIGluZm9ybWF0aW9uIENvbWJvIEJveCBpcyBmcm9tIFR5cGUgSGVscGVyIHhzZGUwOTUwICovCi0KLSAgLyogQ09OVEVYVF9JRCB4c2RlMzIwMCBmb3IgTm90YXRpb24gRGVzaWduIFZpZXcgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNERV9OT1RBVElPTl9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGUzMjAwIjsKLQotICAvKiBDT05URVhUX0lEIHhzZGU0MDAwIGZvciBTb3VyY2UgVmlldyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RFX1NPVVJDRV9WSUVXID0gUExVR0lOX05BTUUgKyAiLnhzZGU0MDAwIjsKLQotICAvKiBDT05URVhUX0lEcyBmb3IgUmVndWxhciBFeHByZXNzaW9uIFdpemFyZCBmb2xsb3cgdGhlIHhzZHJ4eHggY29udGV4dCBJRHMgKi8KLSAgCi0gIC8qIENPTlRFWFRfSUQgeHNkcjAwMTAgZm9yIENvbXBvc2UgUmVndWxhciBFeHByZXNzaW9uIFBhZ2UgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9DT01QT1NJVElPTl9QQUdFICAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAwMTAiOwotICAvKiBDT05URVhUX0lEIHhzZHIwMDE1IGZvciBUb2tlbiBDb250ZW50cyBDb21ibyBCb3ggKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9DT01QT1NJVElPTl9UT0tFTiA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDAxNSI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAwMjAgZm9yIE9jY3VycmVjZSBHcm91cCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX09DQ1VSUkVOQ0VfR1JPVVAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAwMjAiOwotICAvKiBDT05URVhUX0lEIHhzZHIwMDMwIGZvciBKdXN0IG9uY2UgUmFkaW8gQnV0dG9uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRFJfQ09NUE9TSVRJT05fSlVTVF9PTkNFICAgID0gUExVR0lOX05BTUUgKyAiLnhzZHIwMDMwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RyMDA0MCBmb3IgWmVybyBvciBtb3JlIFJhZGlvIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX1pFUk9fT1JfTU9SRSA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDA0MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAwNTAgZm9yIE9uZSBvciBtb3JlIFJhZGlvIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX09ORV9PUl9NT1JFICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDA1MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAwNjAgZm9yIE9wdGlvbmFsIFJhZGlvIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX09QVElPTkFMICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDA2MCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAwNzAgZm9yIFJlcGVhdCBSYWRpbyBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9DT01QT1NJVElPTl9SRVBFQVQgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAwNzAiOwotICAvKiBDT05URVhUX0lEIHhzZHIwMDgwIGZvciBSYW5nZSBSYWRpbyBCdXR0b24gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9DT01QT1NJVElPTl9SQU5HRSAgICAgICAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAwODAiOwotICAvKiBDT05URVhUX0lEIHhzZHIwMDkwIGZvciBSZXBlYXQgVGV4dCBFZGl0ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRFJfQ09NUE9TSVRJT05fUkVQRUFUX1RFWFQgID0gUExVR0lOX05BTUUgKyAiLnhzZHIwMDkwIjsKLSAgLyogQ09OVEVYVF9JRCB4c2RyMDEwMCBmb3IgUmFuZ2UgTWluaW11bSBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9DT01QT1NJVElPTl9SQU5HRV9NSU4gICAgPSBQTFVHSU5fTkFNRSArICIueHNkcjAxMDAiOwotICAvKiBDT05URVhUX0lEIHhzZHIwMTEwIGZvciBSYW5nZSBNYXhpbXVtIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX1JBTkdFX01BWCAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDExMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAxMjAgZm9yIEFkZCBQdXNoIEJ1dHRvbiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX0FERCAgICAgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDEyMCI7Ci0gIC8qIENPTlRFWFRfSUQgeHNkcjAxMzAgZm9yIEN1cnJlbnQgUmVndWxhciBFeHByZXNzaW9uIFRleHQgRWRpdCAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX0NPTVBPU0lUSU9OX0NVUlJFTlQgICAgICA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDEzMCI7Ci0KLSAgLyogQ09OVEVYVF9JRCB4c2RyMDIwMCBmb3IgVGVzdCBSZWd1bGFyIEV4cHJlc3Npb24gUGFnZSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RSX1RFU1RfUEFHRSAgID0gUExVR0lOX05BTUUgKyAiLnhzZHIwMjAwIjsKLSAgLyogbm8gQ09OVEVYVF9JRCBmb3IgUmVndWxhciBFeHByZXNzaW9uIFRleHQgRWRpdCAobm90IGVkaXRhYmxlKSAqLwotICAvKiBDT05URVhUX0lEIHhzZHIwMjEwIGZvciBTYW1wbGUgVGV4dCBUZXh0IEVkaXQgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEUl9URVNUX1NBTVBMRSA9IFBMVUdJTl9OQU1FICsgIi54c2RyMDIxMCI7Ci0KLSAgLyogQ09OVEVYVF9JRHMgZm9yIFByZWZlcmVuY2VzIFBhZ2UgZm9sbG93cyB0aGUgeHNkcHh4eCBjb250ZXh0IElEcyAqLwotICAKLSAgLyogQ09OVEVYVF9JRCB4c2RwMDAxMCBmb3IgWE1MIFNjaGVtYSBQcmVmZXJlbmNlcyBQYWdlICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRFBfUFJFRkVSRU5DRV9QQUdFID0gUExVR0lOX05BTUUgKyAiLnhzZHAwMDEwIjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RFZGl0b3JFeHRlbnNpb25Qcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yRXh0ZW5zaW9uUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODcxMzlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RFZGl0b3JFeHRlbnNpb25Qcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLklFeHRlbmRlZEZpZ3VyZUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFZGl0b3JFeHRlbnNpb25Qcm9wZXJ0aWVzCi17Ci0gIFhTREFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotICBJRXh0ZW5kZWRGaWd1cmVGYWN0b3J5IGZpZ3VyZUZhY3Rvcnk7Ci0gIEVkaXRQYXJ0RmFjdG9yeSBlZGl0UGFydEZhY3Rvcnk7Ci0gIExpc3QgYWN0aW9uTGlzdDsKLQotICBwdWJsaWMgWFNERWRpdG9yRXh0ZW5zaW9uUHJvcGVydGllcygpCi0gIHsKLQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QWN0aW9uTGlzdChMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICB0aGlzLmFjdGlvbkxpc3QgPSBhY3Rpb25MaXN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QWRhcHRlckZhY3RvcnkoWFNEQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpCi0gIHsKLSAgICB0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFZGl0UGFydEZhY3RvcnlMaXN0KEVkaXRQYXJ0RmFjdG9yeSBlZGl0UGFydEZhY3RvcnkpCi0gIHsKLSAgICB0aGlzLmVkaXRQYXJ0RmFjdG9yeSA9IGVkaXRQYXJ0RmFjdG9yeTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEZpZ3VyZUZhY3RvcnlMaXN0KElFeHRlbmRlZEZpZ3VyZUZhY3RvcnkgZmlndXJlRmFjdG9yeSkKLSAgewotICAgIHRoaXMuZmlndXJlRmFjdG9yeSA9IGZpZ3VyZUZhY3Rvcnk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRBY3Rpb25MaXN0KCkKLSAgewotICAgIHJldHVybiBhY3Rpb25MaXN0OwotICB9Ci0KLSAgcHVibGljIFhTREFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiBhZGFwdGVyRmFjdG9yeTsKLSAgfQotCi0gIHB1YmxpYyBFZGl0UGFydEZhY3RvcnkgZ2V0RWRpdFBhcnRGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiBlZGl0UGFydEZhY3Rvcnk7Ci0gIH0KLQotICBwdWJsaWMgSUV4dGVuZGVkRmlndXJlRmFjdG9yeSBnZXRGaWd1cmVGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiBmaWd1cmVGYWN0b3J5OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWRpdG9yUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NjZhNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREVkaXRvclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tLk5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFZGl0b3JQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IiOyAgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVF9YU0RfREVGQVVMVF9QUkVGSVhfVEVYVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sc2NoZW1hLnhzZERlZmF1bHRQcmVmaXhUZXh0IjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVF9QUkVGRVJFRF9CVUlMVF9JTl9UWVBFUyA9ICJvcmcuZWNsaXBzZS53c3QueG1sc2NoZW1hLnByZWZlcmVkQnVpbHRJblR5cGVzIjsgIC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05TX1NDSEVNQVNfRVhURU5TSU9OSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5leHRlbnNpb25DYXRlZ29yaWVzIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQUkVDQVRFRF9FWFRFTlNJT05TX1NDSEVNQVNfRVhURU5TSU9OSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5FeHRlbnNpb25zU2NoZW1hc0Rlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJCAgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSA9ICJodHRwOi8vd3d3LmV4YW1wbGUub3JnIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYU0RfQ09OVEVOVF9UWVBFX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0gIAotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBYU0RFZGl0b3JQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0gIHByaXZhdGUgRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSByZWdpc3RyeTsgIAotICBwcml2YXRlIE5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkgbm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeTsKLSAgcHJpdmF0ZSBYU0RFZGl0b3JDb25maWd1cmF0aW9uIHhzZEVkaXRvckNvbmZpZ3VyYXRpb24gPSBudWxsOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1RfVVNFX1NJTVBMRV9FRElUX01PREUgPSBQTFVHSU5fSUQgKyAiLnVzZVNpbXBsZUVkaXRNb2RlIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVF9TSE9XX0lOSEVSSVRFRF9DT05URU5UID0gUExVR0lOX0lEICsgIi5zaG93SW5oZXJpdGVkQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVF9YU0RfTEFOR1VBR0VfUVVBTElGWSA9ICJvcmcuZWNsaXBzZS53c3QueG1sc2NoZW1hLnhzZFF1YWxpZnkiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS53c3QueG1sc2NoZW1hLmRlZmF1bHRUYXJnZXRuYW1lc3BhY2VUZXh0IjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVF9TSE9XX0VYVEVSTkFMUyA9IFBMVUdJTl9JRCArICIuc2hvd0V4dGVybmFscyI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfUEFHRSA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlZmF1bHRQYWdlIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgREVTSUdOX1BBR0UgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ25QYWdlIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgU09VUkNFX1BBR0UgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zb3VyY2VQYWdlIjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgWFNERWRpdG9yUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBYU0RFZGl0b3JQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBvKQotICB7Ci0gICAgICByZXR1cm4gZ2V0UmVzb3VyY2VTdHJpbmcoa2V5LCBuZXcgT2JqZWN0W10geyBvfSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBvYmplY3RzKQotICB7Ci0gICAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KSwgb2JqZWN0cyk7Ci0gIH0KLQkKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IG8xLCBPYmplY3QgbzIpCi0gIHsKLSAgICAgIHJldHVybiBnZXRSZXNvdXJjZVN0cmluZyhrZXksIG5ldyBPYmplY3RbXSB7IG8xLCBvMn0pOwotICB9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKHJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQkJLy8gcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpblJlc291cmNlcyIpOwotICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFBsYXRmb3JtLmdldFJlc291cmNlQnVuZGxlKGdldEJ1bmRsZSgpKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4KLQkgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGguCi0JICoKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigib3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsIHBhdGgpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgbmFtZSwgYm9vbGVhbiBnZXRCYXNlVVJMKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVSTCA9IGdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgaW1hZ2VTdHJpbmcgPSBnZXRCYXNlVVJMID8gImljb25zLyIgKyBuYW1lIDogbmFtZTsgLy8kTk9OLU5MUy0xJAotCi0JCQlVUkwgaW1hZ2VVUkwgPSBuZXcgVVJMKGluc3RhbGxVUkwsIGltYWdlU3RyaW5nKTsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSTCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJY29uKFN0cmluZyBuYW1lKQotCXsKLQkgIHRyeSB7Ci0JCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IGdldEltYWdlUmVnaXN0cnkoKTsKLQotCQlpZiAoaW1hZ2VSZWdpc3RyeS5nZXQobmFtZSkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGltYWdlUmVnaXN0cnkuZ2V0KG5hbWUpOwotCQl9Ci0JCWVsc2UgewotCQkJVVJMIGluc3RhbGxVUkwgPSBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGltYWdlU3RyaW5nID0gImljb25zLyIgKyBuYW1lOyAvLyROT04tTkxTLTEkCi0KLQkJCVVSTCBpbWFnZVVSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCwgaW1hZ2VTdHJpbmcpOwotCQkJaW1hZ2VSZWdpc3RyeS5wdXQobmFtZSwgSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaW1hZ2VVUkwpKTsKLQkJCXJldHVybiBpbWFnZVJlZ2lzdHJ5LmdldChuYW1lKTsKLQkJfQotCi0JICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gbnVsbDsKLQkgIH0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBYU0RFZGl0b3JQbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFhTRFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZVN0cmluZyhrZXkpOwotCX0KLQotICAvKioKLSAgICogVGhpcyBnZXRzIHRoZSBzdHJpbmcgcmVzb3VyY2UgYW5kIGRvZXMgb25lIHN1YnN0aXR1dGlvbi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkgewotICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChQbGF0Zm9ybS5nZXRSZXNvdXJjZUJ1bmRsZShnZXRCdW5kbGUoKSkuZ2V0U3RyaW5nKGtleSksIG5ldyBPYmplY3RbXXtzMX0pOwotICB9Ci0gIAotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0WFNESW1hZ2UoU3RyaW5nIGljb25OYW1lKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0SW1hZ2UoaWNvbk5hbWUpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgaWNvbk5hbWUpIHsKLQkJSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5ID0gZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCi0JCWlmIChpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlUmVnaXN0cnkucHV0KGljb25OYW1lLCBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoZ2V0Q2xhc3MoKSwgaWNvbk5hbWUpKTsKLQkJCXJldHVybiBpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFVSTCBnZXRCYXNlVVJMKCkgewotCQlyZXR1cm4gZ2V0RGVzY3JpcHRvcigpLmdldEluc3RhbGxVUkwoKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SWNvbkltYWdlKFN0cmluZyBvYmplY3QpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShuZXcgVVJMKGdldEJhc2VVUkwoKSArICJpY29ucy8iICsgb2JqZWN0ICsgIi5naWYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0U2hvd0luaGVyaXRlZENvbnRlbnQoKQotICB7Ci0gICAgcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oQ09OU1RfU0hPV19JTkhFUklURURfQ09OVEVOVCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkKLSAgewotICAgIHN0b3JlLnNldERlZmF1bHQoQ09OU1RfU0hPV19JTkhFUklURURfQ09OVEVOVCwgZmFsc2UpOwotICAgIHN0b3JlLnNldERlZmF1bHQoQ09OU1RfWFNEX0RFRkFVTFRfUFJFRklYX1RFWFQsICJ4c2QiKTsgLy8kTk9OLU5MUy0xJAotICAgIHN0b3JlLnNldERlZmF1bHQoQ09OU1RfWFNEX0xBTkdVQUdFX1FVQUxJRlksIGZhbHNlKTsKLSAgICBzdG9yZS5zZXREZWZhdWx0KERFRkFVTFRfUEFHRSwgREVTSUdOX1BBR0UpOwotICAgIHN0b3JlLnNldERlZmF1bHQoQ09OU1RfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFLCBERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UpOwotICAgIHN0b3JlLnNldERlZmF1bHQoQ09OU1RfU0hPV19FWFRFUk5BTFMsIGZhbHNlKTsKLSAgICAKLSAgICAvL0V2ZW4gdGhlIGxhc3QgaXRlbSBpbiB0aGUgbGlzdCBtdXN0IGNvbnRhaW4gYSB0cmFpbGluZyBMaXN0IHNlcGFyYXRvcgotICAgIHN0b3JlLnNldERlZmF1bHQoQ09OU1RfUFJFRkVSRURfQlVJTFRfSU5fVFlQRVMsICAgICAJCQotICAgIAkJImJvb2xlYW4iKyBDVVNUT01fTElTVF9TRVBBUkFUT1IgKyAvLyROT04tTkxTLTEkCi0gICAgCQkiZGF0ZSIgKyBDVVNUT01fTElTVF9TRVBBUkFUT1IgKyAvLyROT04tTkxTLTEkCi0gICAgCQkiZGF0ZVRpbWUiICsgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SICsgLy8kTk9OLU5MUy0xJAotICAgIAkJImRvdWJsZSIgKyBDVVNUT01fTElTVF9TRVBBUkFUT1IgKyAvLyROT04tTkxTLTEkCi0gICAgCQkiZmxvYXQiICsgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SICsgLy8kTk9OLU5MUy0xJAotICAgIAkJImhleEJpbmFyeSIgKyBDVVNUT01fTElTVF9TRVBBUkFUT1IgKyAvLyROT04tTkxTLTEkCi0gICAgCQkiaW50IiArIENVU1RPTV9MSVNUX1NFUEFSQVRPUiArIC8vJE5PTi1OTFMtMSQKLSAgICAJCSJzdHJpbmciICsgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SICsgLy8kTk9OLU5MUy0xJAotICAgIAkJInRpbWUiICsgQ1VTVE9NX0xJU1RfU0VQQVJBVE9SKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkgZ2V0RXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSgpCi0gIHsKLSAgICBpZiAocmVnaXN0cnkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZWdpc3RyeSA9IG5ldyBFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5KEVYVEVOU0lPTlNfU0NIRU1BU19FWFRFTlNJT05JRCk7Ci0gICAgICByZWdpc3RyeS5fX2ludGVybmFsU2V0RGVwcmVjYXRlZEV4dGVuc2lvbklkKERFUFJFQ0FURURfRVhURU5TSU9OU19TQ0hFTUFTX0VYVEVOU0lPTklEKTsKLSAgICAgIHJlZ2lzdHJ5LnNldFByZWZTdG9yZShYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkgKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlZ2lzdHJ5OwotICB9Ci0KLSAKLSAgcHVibGljIFhTREVkaXRvckNvbmZpZ3VyYXRpb24gZ2V0WFNERWRpdG9yQ29uZmlndXJhdGlvbigpCi0gIHsKLSAgICBpZiAoeHNkRWRpdG9yQ29uZmlndXJhdGlvbiA9PSBudWxsKQotICAgIHsKLSAgICAgIHhzZEVkaXRvckNvbmZpZ3VyYXRpb24gPSBuZXcgWFNERWRpdG9yQ29uZmlndXJhdGlvbigpOwotICAgIH0KLSAgICByZXR1cm4geHNkRWRpdG9yQ29uZmlndXJhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHhtbCBzY2hlbWEgZGVmYXVsdCBuYW1lc3BhY2UgcHJlZml4Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFhNTFNjaGVtYVByZWZpeCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKENPTlNUX1hTRF9ERUZBVUxUX1BSRUZJWF9URVhUKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldFNob3dFeHRlcm5hbHMoKQotICB7Ci0gICAgcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oQ09OU1RfU0hPV19FWFRFUk5BTFMpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTaG93RXh0ZXJuYWxzKGJvb2xlYW4gZG9TaG93KQotICB7Ci0gICAgZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoQ09OU1RfU0hPV19FWFRFUk5BTFMsIGRvU2hvdyk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB4bWwgc2NoZW1hIGRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRYTUxTY2hlbWFUYXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhDT05TVF9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UpOwotICAgIGlmICghdGFyZ2V0TmFtZXNwYWNlLmVuZHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlICsgIi8iOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB4bWwgc2NoZW1hIGxhbmd1YWdlIHF1YWxpZmljYXRpb24KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUXVhbGlmeVhNTFNjaGVtYUxhbmd1YWdlKCkgewotICAgIHJldHVybiBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKENPTlNUX1hTRF9MQU5HVUFHRV9RVUFMSUZZKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0gICAgcmV0dXJuIGdldFBsdWdpbigpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNvdXJjZVBhZ2VBc0RlZmF1bHQoKQotICB7Ci0gICAgZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoREVGQVVMVF9QQUdFLCBTT1VSQ0VfUEFHRSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZXNpZ25QYWdlQXNEZWZhdWx0KCkKLSAgewotICAgIGdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKERFRkFVTFRfUEFHRSwgREVTSUdOX1BBR0UpOwotICB9Ci0gIAotICAvKioKLSAgICogTWV0aG9kIGdldERlZmF1bHRQYWdlLgotICAgKiAKLSAgICogQHJldHVybiBTdHJpbmcgdmFsdWUgb2YgdGhlIHN0cmluZyBjb25zdGFudCB0aGF0IGlzIHRoZSBkZWZhdWx0IHBhZ2UKLSAgICogICAgICAgICB0aGUgZWRpdG9yIHNob3VsZCB0dXJuIHRvIHdoZW4gZmlyc3Qgb3BlbmVkLiBDaGFuZ2VzIHRvIHRoZQotICAgKiAgICAgICAgIGxhc3QgdmlzaWJsZSBwYWdlIHdoZW4gdGhlIGVkaXRvciB3YXMgY2xvc2VkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYWdlKCkgewotICAgIHJldHVybiBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoREVGQVVMVF9QQUdFKTsKLSAgfQotCi0gIHB1YmxpYyBOb2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5IGdldE5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkoKQotICB7Ci0gICAgaWYgKG5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkgPT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIG5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkgPSBuZXcgTm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeSgiZm9vIik7Ci0gICAgfQotICAgIHJldHVybiBub2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5OwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9DVVNUT01JWkFUSU9OX1BST1ZJREVSX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXJQbHVnaW5JZCI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0RVQ1RfQ1VTVE9NSVpBVElPTl9QUk9WSURFUl9DTEFTU19OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkucHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlckNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIHByaXZhdGUgc3RhdGljIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcjsKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVySW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgCi0gIHB1YmxpYyBQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyIGdldFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIoKQotICB7Ci0gICAgaWYgKCFwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVySW5pdGlhbGl6ZWQpCi0gICAgewotICAgICAgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlckluaXRpYWxpemVkID0gdHJ1ZTsKLSAgICAgIFN0cmluZyBwbHVnaW5OYW1lID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKFBST0RVQ1RfQ1VTVE9NSVpBVElPTl9QUk9WSURFUl9QTFVHSU5fSUQpOwotICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhQUk9EVUNUX0NVU1RPTUlaQVRJT05fUFJPVklERVJfQ0xBU1NfTkFNRSk7Ci0gICAgICBpZiAocGx1Z2luTmFtZSAhPSBudWxsICYmIHBsdWdpbk5hbWUubGVuZ3RoKCkgPiAwICYmCi0gICAgICAgICAgY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbk5hbWUpOwotICAgICAgICAgIENsYXNzIGNsYXp6ID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICAgIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgPSAoUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciljbGF6ei5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9ICAgICAgICAgIAotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAKLSAgICByZXR1cm4gcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcjsKLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhYzE1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLklDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTREVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZUVsZW1lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVFbGVtZW50UmVmZXJlbmNlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MuTmV3RWxlbWVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5zZWFyY2guWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLklYU0RTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBpbXBsZW1lbnRzIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyCi17ICAKLSAgcHJvdGVjdGVkIElGaWxlIGN1cnJlbnRGaWxlOwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hW10gc2NoZW1hczsKLSAgCi0gIHB1YmxpYyBYU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoSUZpbGUgY3VycmVudEZpbGUsIFhTRFNjaGVtYVtdIHNjaGVtYXMpCi0gIHsKLSAgICB0aGlzLmN1cnJlbnRGaWxlID0gY3VycmVudEZpbGU7Ci0gICAgdGhpcy5zY2hlbWFzID0gc2NoZW1hczsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkVG9IaXN0b3J5KENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50KQotICB7Ci0gICAgLy8gVE9ETyAoY3MpIGltcGxlbWVudCBtZSEgICAgCi0gIH0KLQotICBwdWJsaWMgSUNvbXBvbmVudERpYWxvZyBnZXRCcm93c2VEaWFsb2coKQotICB7Ci0gICAgLy9YU0RTZXRFeGlzdGluZ1R5cGVEaWFsb2cgZGlhbG9nID0gbmV3IFhTRFNldEV4aXN0aW5nVHlwZURpYWxvZyhjdXJyZW50RmlsZSwgc2NoZW1hcyk7Ci0gICAgLy9yZXR1cm4gZGlhbG9nOwotICAgIFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZSBkaWFsb2dEZWxlZ2F0ZSA9IAotICAgIAluZXcgWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlKFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZS5FTEVNRU5UX01FVEFfTkFNRSwgY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICAgIHJldHVybiBkaWFsb2dEZWxlZ2F0ZTsKLSAgfQotCi0gIHB1YmxpYyBJQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBnZXRDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gZ2V0SGlzdG9yeSgpCi0gIHsKLSAgICAvLyBUT0RPIChjcykgaW1wbGVtZW50IHRoaXMgcHJvcGVybHkgLSBzaG91bGQgdGhpcyBoaXN0b3J5IGJlIGdsb2JhbCBvciBsb2NhbCB0byBlYWNoIGVkaXRvcj8KLSAgICAvLyBUaGlzIGlzIHNvbWV0aGluZyB3ZSBzaG91bGQgcGxheSBhcm91bmQgd2l0aCBvdXJzZWx2ZXMgdG8gc2VlIHdoYXQgZmVlbHMgcmlnaHQuCi0gICAgLy8KLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZXN1bHRbXSA9IG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uW2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIElDb21wb25lbnREaWFsb2cgZ2V0TmV3RGlhbG9nKCkKLSAgewotCSAgaWYgKHNjaGVtYXMubGVuZ3RoID4gMCkgewotCQkgIHJldHVybiBuZXcgTmV3RWxlbWVudERpYWxvZyhzY2hlbWFzWzBdKTsKLQkgIH0KLQkgIGVsc2UgewotCQkgIHJldHVybiBuZXcgTmV3RWxlbWVudERpYWxvZygpOwotCSAgfQotICB9Ci0KLSAgcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBnZXRRdWlja1BpY2tzKCkKLSAgewotICAgIC8vIFRPRE8gKGNzKSBpbXBsZW1lbnQgdGhpcyBwcm9wZXJseSAtIHdlIHNob3VsZCBiZSBwcm92aWRpbmcgYSBsaXN0IG9mIHRoZSAKLSAgICAvLyBtb3N0ICdjb21tb24nIGJ1aWx0IGluIHNjaGVtYSB0eXBlcyBoZXJlCi0gICAgLy8gSSBiZWxpZXZlIFRydW5nIHdpbGwgYmUgd29ya2luZyBvbiBhIHBlcmZlcmVuY2UgcGFnZSB0byBnaXZlIHVzIHRoaXMgbGlzdAotICAgIC8vIGZvciBub3cgbGV0J3MgaGFyZCBjb2RlIHNvbWUgdmFsdWVzCi0gICAgLy8KLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCi0gICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZXN1bHRbXSA9IG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uW2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotLy9UT0RPIG5vdCBjaGFuZ2VkIHlldAotICBwdWJsaWMgdm9pZCBtb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoT2JqZWN0IHJlZmVyZW5jaW5nT2JqZWN0LCBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudCkKLSAgewotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBjb25jcmV0ZUNvbXBvbmVudCA9IG51bGw7Ci0gICAgaWYgKHJlZmVyZW5jaW5nT2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlcikKLSAgICB7Ci0gICAgICBBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcilyZWZlcmVuY2luZ09iamVjdDsKLSAgICAgIGlmIChhZGFwdGVyLmdldFRhcmdldCgpIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBjb25jcmV0ZUNvbXBvbmVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pYWRhcHRlci5nZXRUYXJnZXQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAocmVmZXJlbmNpbmdPYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBjb25jcmV0ZUNvbXBvbmVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHJlZmVyZW5jaW5nT2JqZWN0OwotICAgIH0KLSAgICBpZiAoY29uY3JldGVDb21wb25lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAgIGlmIChjb21wb25lbnQuaXNOZXcoKSkKLSAgICAgICAgeyAgCi0gICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWMgPSBudWxsOwotICAgICAgICAgIGlmIChjb21wb25lbnQuZ2V0TWV0YU5hbWUoKSA9PSBJWFNEU2VhcmNoQ29uc3RhbnRzLkVMRU1FTlRfTUVUQV9OQU1FKQotICAgICAgICAgIHsgIAotICAgICAgICAgICAgQWRkWFNERWxlbWVudENvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RFbGVtZW50Q29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9FTEVNRU5ULCBjb25jcmV0ZUNvbXBvbmVudC5nZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgICBjb21tYW5kLnNldE5hbWVUb0FkZChjb21wb25lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICAgICAgZWxlbWVudERlYyA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGNvbW1hbmQuZ2V0QWRkZWRDb21wb25lbnQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGVsZW1lbnREZWMgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlRWxlbWVudFJlZmVyZW5jZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfRUxFTUVOVF9SRUZFUkVOQ0UsIGNvbmNyZXRlQ29tcG9uZW50LCBlbGVtZW50RGVjKTsKLSAgICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICAgIH0gIAotICAgICAgICB9ICAKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUVsZW1lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZChjb25jcmV0ZUNvbXBvbmVudCwgY29tcG9uZW50LmdldE5hbWUoKSwgY29tcG9uZW50LmdldFF1YWxpZmllcigpLCBjb21wb25lbnQuZ2V0RmlsZSgpKTsKLSAgICAgICAgICBjb21tYW5kLnNldExhYmVsKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX0VMRU1FTlRfUkVGRVJFTkNFKTsKLSAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RGaWxlRWRpdG9ySW5wdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RGaWxlRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJmMjgzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNERmlsZUVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuSUFEVEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBYU0RGaWxlRWRpdG9ySW5wdXQgZXh0ZW5kcyBGaWxlRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJQURURWRpdG9ySW5wdXQKLXsKLSAgcHJpdmF0ZSBJRmlsZSBmaWxlOwotICBwcml2YXRlIFhTRFNjaGVtYSBzY2hlbWE7Ci0gIHByaXZhdGUgU3RyaW5nIGVkaXRvck5hbWU7Ci0KLSAgcHVibGljIFhTREZpbGVFZGl0b3JJbnB1dChJRmlsZSBmaWxlLCBYU0RTY2hlbWEgc2NoZW1hKSB7Ci0gICAgc3VwZXIoZmlsZSk7Ci0gICAgaWYgKGZpbGUgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgIH0KLSAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwotICAgIGVkaXRvck5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLSAgfQotCi0gIHB1YmxpYyBJRmlsZSBnZXRGaWxlKCkKLSAgewotICAgIHJldHVybiBmaWxlOwotICB9Ci0KLSAgcHVibGljIFhTRFNjaGVtYSBnZXRTY2hlbWEoKQotICB7Ci0gICAgcmV0dXJuIHNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVkaXRvck5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBlZGl0b3JOYW1lID0gbmFtZTsKLSAgfQotIAotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgaWYgKGVkaXRvck5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZWRpdG9yTmFtZTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmdldE5hbWUoKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpCi0gIHsKLSAgICBpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIG5zID0gc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgaWYgKG5zICE9IG51bGwgJiYgbnMubGVuZ3RoKCkgPiAwKQotICAgICAgICByZXR1cm4gTWVzc2FnZXMuX1VJX0xBQkVMX1RBUkdFVF9OQU1FU1BBQ0UgKyBuczsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIE1lc3NhZ2VzLl9VSV9MQUJFTF9OT19OQU1FU1BBQ0U7Ci0gICAgfQotICAgIHJldHVybiBzdXBlci5nZXRUb29sVGlwVGV4dCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNESHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNESHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOWI5MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotLyoqCi0gKiBYU0RIeXBlcmxpbmsga25vd3MgaG93IHRvIG9wZW4gbGlua3MgZnJvbSBYU0QgZmlsZXMuCi0gKiAKLSAqIEBzZWUgWFNESHlwZXJsaW5rRGV0ZWN0b3IKLSAqLwotcHVibGljIGNsYXNzIFhTREh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsKLXsKLSAgcHJpdmF0ZSBJUmVnaW9uIGZSZWdpb247Ci0gIHByaXZhdGUgWFNEQ29uY3JldGVDb21wb25lbnQgZkNvbXBvbmVudDsKLQotICBwdWJsaWMgWFNESHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBmUmVnaW9uID0gcmVnaW9uOwotICAgIGZDb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gIH0KLQotICBwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKQotICB7Ci0gICAgcmV0dXJuIGZSZWdpb247Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG9wZW4oKQotICB7Ci0gICAgWFNEU2NoZW1hIHNjaGVtYSA9IGZDb21wb25lbnQuZ2V0U2NoZW1hKCk7Ci0KLSAgICBpZiAoc2NoZW1hID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IHNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgIHNjaGVtYUxvY2F0aW9uID0gVVJJSGVscGVyLnJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChzY2hlbWFMb2NhdGlvbik7Ci0gICAgSVBhdGggc2NoZW1hUGF0aCA9IG5ldyBQYXRoKHNjaGVtYUxvY2F0aW9uKTsKLSAgICBJRmlsZSBzY2hlbWFGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHNjaGVtYVBhdGgpOwotCi0gICAgYm9vbGVhbiBmaWxlRXhpc3RzID0gc2NoZW1hRmlsZSAhPSBudWxsICYmIHNjaGVtYUZpbGUuZXhpc3RzKCk7Ci0KLSAgICBpZiAoIWZpbGVFeGlzdHMpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotICAgIHsKLSAgICAgIElXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAKLSAgICAgIHdvcmtiZW5jaFBhZ2UuZ2V0TmF2aWdhdGlvbkhpc3RvcnkoKS5tYXJrTG9jYXRpb24oZWRpdG9yUGFydCk7Ci0gICAgICAKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBlZGl0b3JQYXJ0ID0gSURFLm9wZW5FZGl0b3Iod29ya2JlbmNoUGFnZSwgc2NoZW1hRmlsZSwgdHJ1ZSk7Ci0gICAgICAgIGlmIChlZGl0b3JQYXJ0IGluc3RhbmNlb2YgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpCi0gICAgICAgIHsKLSAgICAgICAgICAoKEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKSBlZGl0b3JQYXJ0KS5vcGVuT25HbG9iYWxSZWZlcmVuY2UoZkNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpCi0gICAgICB7Ci0gICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIHBpZS5nZXRNZXNzYWdlKCksIHBpZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNESHlwZXJsaW5rRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTI3ZjE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC50ZXh0LlhTRE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLQotLyoqCi0gKiBEZXRlY3RzIGh5cGVybGlua3MgZm9yIFhTRCBmaWxlcy4gVXNlZCBieSB0aGUgWFNEIHRleHQgZWRpdG9yIHRvIHByb3ZpZGUgYQotICogIkdvIHRvIGRlY2xhcmF0aW9uIiBmdW5jdGlvbmFsaXR5IHNpbWlsYXIgd2l0aCB0aGUgb25lIHByb3ZpZGVkIGJ5IHRoZSBKYXZhCi0gKiBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RIeXBlcmxpbmtEZXRlY3RvciBleHRlbmRzIEJhc2VIeXBlcmxpbmtEZXRlY3RvcgotewotICAvKioKLSAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGF0dHJpYnV0ZSBpcyAibGlua2FibGUiIHRoYXQgaXMsIHRoZSBjb21wb25lbnQgaXQKLSAgICogcG9pbnRzIHRvIGNhbiBiZSB0aGUgdGFyZ2V0IG9mIGEgImdvIHRvIGRlZmluaXRpb24iIG5hdmlnYXRpb24uIERlcml2ZWQKLSAgICogY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZSB0aGUgYXR0cmlidXRlIG5hbWUuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIGxpbmthYmxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xpbmthYmxlQXR0cmlidXRlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgYm9vbGVhbiBpc0xpbmthYmxlID0gbmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFKSB8fAotICAgICAgbmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLlJFRkVSX0FUVFJJQlVURSkgfHwgCi0gICAgICBuYW1lLmVxdWFscyhYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSkgfHwgCi0gICAgICBuYW1lLmVxdWFscyhYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUpIHx8IAotICAgICAgbmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQUxPQ0FUSU9OX0FUVFJJQlVURSkgfHwgCi0gICAgICBuYW1lLmVxdWFscyhYU0RDb25zdGFudHMuU1VCU1RJVFVUSU9OR1JPVVBfQVRUUklCVVRFKSB8fAotICAgICAgbmFtZS5lcXVhbHMoWFNEQ29uc3RhbnRzLklURU1UWVBFX0FUVFJJQlVURSkgfHwKLSAgICAgIG5hbWUuZXF1YWxzKFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUpCi0gICAgICA7Ci0KLSAgICByZXR1cm4gaXNMaW5rYWJsZTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgaHlwZXJsaW5rIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBub2RlLiBEZXJpdmVkIGNsYXNzZXMgc2hvdWxkCi0gICAqIG92ZXJyaWRlLgotICAgKiAKLSAgICogQHBhcmFtIGRvY3VtZW50IHRoZSBzb3VyY2UgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHVuZGVyIHRoZSBjdXJzb3IuCi0gICAqIEBwYXJhbSByZWdpb24gdGhlIHRleHQgcmVnaW9uIHRvIHVzZSB0byBjcmVhdGUgdGhlIGh5cGVybGluay4KLSAgICogQHJldHVybiBhIG5ldyBJSHlwZXJsaW5rIGZvciB0aGUgbm9kZSBvciBudWxsIGlmIG9uZSBjYW5ub3QgYmUgY3JlYXRlZC4KLSAgICovCi0gIHByb3RlY3RlZCBJSHlwZXJsaW5rIGNyZWF0ZUh5cGVybGluayhJRG9jdW1lbnQgZG9jdW1lbnQsIElET01Ob2RlIG5vZGUsIElSZWdpb24gcmVnaW9uKQotICB7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IGdldFhTRFNjaGVtYShkb2N1bWVudCk7Ci0KLSAgICBpZiAoeHNkU2NoZW1hID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gZ2V0VGFyZ2V0WFNEQ29tcG9uZW50KHhzZFNjaGVtYSwgbm9kZSk7Ci0KLSAgICBpZiAodGFyZ2V0Q29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgSVJlZ2lvbiBub2RlUmVnaW9uID0gZ2V0SHlwZXJsaW5rUmVnaW9uKG5vZGUpOwotCi0gICAgICByZXR1cm4gbmV3IFhTREh5cGVybGluayhub2RlUmVnaW9uLCB0YXJnZXRDb21wb25lbnQpOwotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmRzIHRoZSBYU0QgY29tcG9uZW50IGZvciB0aGUgZ2l2ZW4gbm9kZS4KLSAgICogCi0gICAqIEBwYXJhbSB4c2RTY2hlbWEgY2Fubm90IGJlIG51bGwKLSAgICogQHBhcmFtIG5vZGUgY2Fubm90IGJlIG51bGwKLSAgICogQHJldHVybiBYU0RDb25jcmV0ZUNvbXBvbmVudAotICAgKi8KLSAgcHJpdmF0ZSBYU0RDb25jcmV0ZUNvbXBvbmVudCBnZXRUYXJnZXRYU0RDb21wb25lbnQoWFNEU2NoZW1hIHhzZFNjaGVtYSwgSURPTU5vZGUgbm9kZSkKLSAgewotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbXBvbmVudCA9IHhzZFNjaGVtYS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KG5vZGUpOwotCi0gICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBudWxsOwotICAgIAotICAgIGlmIChub2RlIGluc3RhbmNlb2YgQXR0cikKLSAgICB7Ci0gICAgICBBdHRyIGF0dHJpYnV0ZSA9IChBdHRyKW5vZGU7Ci0gICAgICBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlICE9IG51bGwgPyBhdHRyaWJ1dGUuZ2V0TmFtZSgpOiBudWxsOwotICAgIH0KLSAgICAKLSAgICBYU0RIeXBlcmxpbmtUYXJnZXRMb2NhdG9yIHhzZEh5cGVybGlua1RhcmdldExvY2F0b3IgPSBuZXcgWFNESHlwZXJsaW5rVGFyZ2V0TG9jYXRvcigpOwotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCA9IHhzZEh5cGVybGlua1RhcmdldExvY2F0b3IubG9jYXRlKHhzZENvbXBvbmVudCwgYXR0cmlidXRlTmFtZSk7IAotICAgIAotICAgIHJldHVybiBjb21wb25lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgeHNkIHNjaGVtYSBmcm9tIGRvY3VtZW50Ci0gICAqIAotICAgKiBAcGFyYW0gZG9jdW1lbnQKLSAgICogQHJldHVybiBYU0RTY2hlbWEgb3IgbnVsbCBvZiBvbmUgZG9lcyBub3QgZXhpc3QgeWV0IGZvciBkb2N1bWVudAotICAgKi8KLSAgcHJpdmF0ZSBYU0RTY2hlbWEgZ2V0WFNEU2NoZW1hKElEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBudWxsOwotICAgIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLSAgICBpZiAobW9kZWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKQotICAgICAgICB7Ci0gICAgICAgICAgSURPTURvY3VtZW50IGRvbURvYyA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICBpZiAoZG9tRG9jICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNETW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IChYU0RNb2RlbEFkYXB0ZXIpIGRvbURvYy5nZXRFeGlzdGluZ0FkYXB0ZXIoWFNETW9kZWxBZGFwdGVyLmNsYXNzKTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBJU1NVRTogRGlkbid0IHdhbnQgdG8gZ28gdGhyb3VnaCBpbml0aWFsaXppbmcgc2NoZW1hIGlmIGl0IGRvZXMKLSAgICAgICAgICAgICAqIG5vdCBhbHJlYWR5IGV4aXN0LCBzbyBqdXN0IGF0dGVtcHRlZCB0byBnZXQgZXhpc3RpbmcgYWRhcHRlci4gSWYKLSAgICAgICAgICAgICAqIGRvZXNuJ3QgZXhpc3QsIGp1c3QgZG9uJ3QgYm90aGVyIHdvcmtpbmcuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChtb2RlbEFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgc2NoZW1hID0gbW9kZWxBZGFwdGVyLmdldFNjaGVtYSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICBtb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNjaGVtYTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREh5cGVybGlua1RhcmdldExvY2F0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RIeXBlcmxpbmtUYXJnZXRMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNGFlYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTREh5cGVybGlua1RhcmdldExvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVmFyaWV0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU3dpdGNoOwotCi0vKioKLSAqIEEgY3VzdG9tIFhTRFN3aXRjaCB1c2VkIHRvIGxvY2F0ZSB0aGUgInJlZmVyZW5jZWQiIGNvbXBvbmVudC4gVXNlZCBieSB0aGUKLSAqIGh5cGVybGluay9GMyBuYXZpZ2F0aW9uIG1lY2hhbmlzbS4gTWFkZSBhIHNlcGFyYXRlIGNsYXNzIGJlY2F1c2UgaXQgaXMgdXNlZAotICogZnJvbSB0aGUgV1NETCBlZGl0b3IgYXMgd2VsbC4KLSAqLwotcHVibGljIGNsYXNzIFhTREh5cGVybGlua1RhcmdldExvY2F0b3IgZXh0ZW5kcyBYU0RTd2l0Y2gKLXsKLSAgLyoqCi0gICAqIEhvbGRzIHRoZSBhdHRyaWJ1dGUgbmFtZSBpZiB0aGUgY3Vyc29yL21vdXNlIGlzIG92ZXIgYW4gYXR0cmlidXRlLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgYXR0cmlidXRlTmFtZTsKLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFN3aXRjaCNjYXNlWFNEQXR0cmlidXRlRGVjbGFyYXRpb24ob3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlRGVjbGFyYXRpb24pCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB0YXJnZXQgPSBudWxsOwotCi0gICAgaWYgKGF0dHJpYnV0ZURlY2xhcmF0aW9uLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICB0YXJnZXQgPSBhdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0YXJnZXQgPSBhdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXRUeXBlRGVmaW5pdGlvbigpOwotCi0gICAgICAvLyBBdm9pZCBuYXZpZ2F0aW5nIHRvIGJ1aWx0IGluIGRhdGEgdHlwZXMuCi0KLSAgICAgIGlmIChpc0Zyb21TY2hlbWFGb3JTY2hlbWEodGFyZ2V0KSkKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0ID0gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRhcmdldDsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU3dpdGNoI2Nhc2VYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24ob3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgdGFyZ2V0ID0gbnVsbDsKLQotICAgIGlmIChhdHRyaWJ1dGVHcm91cERlZmluaXRpb24uaXNBdHRyaWJ1dGVHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICB0YXJnZXQgPSBhdHRyaWJ1dGVHcm91cERlZmluaXRpb24uZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGFyZ2V0OwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2gjY2FzZVhTREVsZW1lbnREZWNsYXJhdGlvbihvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlWFNERWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24pCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB0YXJnZXQgPSBudWxsOwotCi0gICAgaWYgKGVsZW1lbnREZWNsYXJhdGlvbi5pc0VsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIHRhcmdldCA9IGVsZW1lbnREZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgdHlwZURlZmluaXRpb24gPSBudWxsOwotCi0gICAgICBpZiAoZWxlbWVudERlY2xhcmF0aW9uLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHlwZURlZmluaXRpb24gPSBlbGVtZW50RGVjbGFyYXRpb24uZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgIH0KLQotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgc3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbiA9IGVsZW1lbnREZWNsYXJhdGlvbi5nZXRTdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uKCk7Ci0KLSAgICAgIGlmICh0eXBlRGVmaW5pdGlvbiAhPSBudWxsICYmIHN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gVGhlcmUgYXJlIDIgdGhpbmdzIHdlIGNhbiBuYXZpZ2F0ZSB0bzogaWYgdGhlIGN1cnNvciBpcyBhbnl3aGVyZSBvbgotICAgICAgICAvLyB0aGUKLSAgICAgICAgLy8gc3Vic3RpdHV0aW9uIGF0dHJpYnV0ZSB0aGVuIGp1bXAgdG8gdGhhdCwgb3RoZXJ3aXNlIGp1c3QgZ28gdG8gdGhlCi0gICAgICAgIC8vIGJhc2UgdHlwZS4KLQotICAgICAgICBpZiAoWFNEQ29uc3RhbnRzLlNVQlNUSVRVVElPTkdST1VQX0FUVFJJQlVURS5lcXVhbHMoYXR0cmlidXRlTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICB0YXJnZXQgPSBzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHRhcmdldCA9IHR5cGVEZWZpbml0aW9uOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRhcmdldCA9IHR5cGVEZWZpbml0aW9uICE9IG51bGwgPyB0eXBlRGVmaW5pdGlvbiA6IHN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb247Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpc0Zyb21TY2hlbWFGb3JTY2hlbWEodGFyZ2V0KSkKLSAgICAgIHsKLSAgICAgICAgdGFyZ2V0ID0gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdGFyZ2V0OwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2gjY2FzZVhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24ob3JnLmVjbGlwc2UueHNkLlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24pCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24gaWRDb25zdHJhaW50RGVmaW5pdGlvbikKLSAgewotICAgIE9iamVjdCB0YXJnZXQgPSBudWxsOwotCi0gICAgWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiByZWZlcmVuY2VkS2V5ID0gaWRDb25zdHJhaW50RGVmaW5pdGlvbi5nZXRSZWZlcmVuY2VkS2V5KCk7Ci0KLSAgICBpZiAocmVmZXJlbmNlZEtleSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRhcmdldCA9IHJlZmVyZW5jZWRLZXk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRhcmdldDsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU3dpdGNoI2Nhc2VYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgewotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHRhcmdldCA9IG51bGw7Ci0KLSAgICBpZiAobW9kZWxHcm91cERlZmluaXRpb24uaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIHRhcmdldCA9IG1vZGVsR3JvdXBEZWZpbml0aW9uLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGFyZ2V0OwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2gjY2FzZVhTRFNjaGVtYURpcmVjdGl2ZShvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlWFNEU2NoZW1hRGlyZWN0aXZlKFhTRFNjaGVtYURpcmVjdGl2ZSBkaXJlY3RpdmUpCi0gIHsKLSAgICBYU0RTY2hlbWEgc2NoZW1hID0gZGlyZWN0aXZlLmdldFJlc29sdmVkU2NoZW1hKCk7Ci0KLSAgICByZXR1cm4gc2NoZW1hOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBjYXNlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24pCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB0YXJnZXQgPSBudWxsOwotCi0gICAgLy8gU2ltcGxlIHR5cGVzIGNhbiBiZSBvbmUgb2Y6IGF0b21pYywgbGlzdCBvciB1bmlvbi4KLQotICAgIFhTRFZhcmlldHkgdmFyaWV0eSA9IHR5cGVEZWZpbml0aW9uLmdldFZhcmlldHkoKTsKLSAgICBpbnQgdmFyaWV0eVR5cGUgPSB2YXJpZXR5LmdldFZhbHVlKCk7Ci0KLSAgICBzd2l0Y2ggKHZhcmlldHlUeXBlKQotICAgIHsKLSAgICAgIGNhc2UgWFNEVmFyaWV0eS5BVE9NSUM6Ci0gICAgICAgIHsKLSAgICAgICAgICB0YXJnZXQgPSB0eXBlRGVmaW5pdGlvbi5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWFNEVmFyaWV0eS5MSVNUOgotICAgICAgICB7Ci0gICAgICAgICAgdGFyZ2V0ID0gdHlwZURlZmluaXRpb24uZ2V0SXRlbVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhTRFZhcmlldHkuVU5JT046Ci0gICAgICAgIHsKLSAgICAgICAgICBMaXN0IG1lbWJlclR5cGVzID0gdHlwZURlZmluaXRpb24uZ2V0TWVtYmVyVHlwZURlZmluaXRpb25zKCk7Ci0gICAgICAgICAgaWYgKG1lbWJlclR5cGVzICE9IG51bGwgJiYgbWVtYmVyVHlwZXMuc2l6ZSgpID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJU1NVRTogV2hhdCBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSB0eXBlPwotICAgICAgICAgICAgLy8gVGhpcyBjb3VsZCBiZSBhIGNhc2UgZm9yIG11bHRpcGxlIGh5cGVybGlua3MgYXQgdGhlIHNhbWUKLSAgICAgICAgICAgIC8vIGxvY2F0aW9uLgotICAgICAgICAgICAgdGFyZ2V0ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSBtZW1iZXJUeXBlcy5nZXQoMCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIEF2b2lkIG5hdmlnYXRpbmcgdG8gYnVpbHQgaW4gZGF0YSB0eXBlcy4KLQotICAgIGlmIChpc0Zyb21TY2hlbWFGb3JTY2hlbWEodGFyZ2V0KSkKLSAgICB7Ci0gICAgICB0YXJnZXQgPSBudWxsOwotICAgIH0KLQotICAgIHJldHVybiB0YXJnZXQ7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFN3aXRjaCNjYXNlWFNEVHlwZURlZmluaXRpb24ob3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlWFNEVHlwZURlZmluaXRpb24oWFNEVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24pCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB0YXJnZXQgPSBudWxsOwotCi0gICAgWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGUgPSB0eXBlRGVmaW5pdGlvbi5nZXRCYXNlVHlwZSgpOwotCi0gICAgaWYgKGJhc2VUeXBlICE9IG51bGwpCi0gICAgewotICAgICAgdGFyZ2V0ID0gYmFzZVR5cGU7Ci0gICAgfQotCi0gICAgLy8gQXZvaWQgbmF2aWdhdGluZyB0byBidWlsdCBpbiBkYXRhIHR5cGVzLgotCi0gICAgaWYgKGlzRnJvbVNjaGVtYUZvclNjaGVtYSh0YXJnZXQpKQotICAgIHsKLSAgICAgIHRhcmdldCA9IG51bGw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRhcmdldDsKLSAgfQotCi0gIC8qKgotICAgKiBEZXRlY3RzIGlmIGEgZ2l2ZW4gc2NoZW1hIGNvbXBvbmVudCBpcyBmcm9tIHRoZSBzY2hlbWEgZm9yIHNjaGVtYSAoYnVpbHQgaW4KLSAgICogZGF0YSB0eXBlcykuIFVzZWQgdG8gYXZvaWQgbmF2aWdhdGluZyB0byB0aGlzIHR5cGUgb2YgY29tcG9uZW50cyBhcyB0aGV5Ci0gICAqIGRvbid0IGhhdmUgYW4gYWNjZXNzaWJsZSBwaHlzaWNhbCBsb2NhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBjb21wb25lbnQgdGhlIGNvbXBvbmVudCB0byBjaGVjay4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb21wb25lbnQgaXMgZnJvbSB0aGUgc2NoZW1hIGZvciBzY2hlbWEgbmFtZXNwYWNlLAotICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRnJvbVNjaGVtYUZvclNjaGVtYShYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBpZiAoY29tcG9uZW50ID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBjb21wb25lbnQuZ2V0U2NoZW1hKCk7Ci0KLSAgICBpZiAoc2NoZW1hICE9IG51bGwgJiYgc2NoZW1hLmVxdWFscyhzY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hKCkpKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBMb2NhdGVzIHRoZSB0YXJnZXQgY29tcG9uZW50IC0gZm9yIGV4YW1wbGUgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gcG9pbnRlZAotICAgKiB0byBieSBhbiBlbGVtZW50IHJlZmVyZW5jZSwgZXRjLgotICAgKiAKLSAgICogQHBhcmFtIGNvbXBvbmVudCB0aGUgY3VycmVudCBjb21wb25lbnQuCi0gICAqIEBwYXJhbSBhdHRyaWJ1dGVOYW1lIHRoZSBhdHRyaWJ1dGUgbmFtZSBpZiB0aGUgY3Vyc29yL21vdXNlIGlzIG92ZXIgYW4KLSAgICogICAgICAgIGF0dHJpYnV0ZS4gVGhpcyBpcyB1c2VkIHRvIHByb3ZpZGUgZmluZSBncmFpbmVkIG5hdmlnYXRpb24gZm9yCi0gICAqICAgICAgICBjb21wb25lbnRzIHdpdGggbW9yZSB0aGFuIG9uZSAiYWN0aXZlIiBhdHRyaWJ1dGUuCi0gICAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZWQgWFNEIGNvbmNyZXRlIGNvbXBvbmVudCBvciBudWxsIGlmIG5vbmUgaXMgZm91bmQuCi0gICAqLwotICBwdWJsaWMgWFNEQ29uY3JldGVDb21wb25lbnQgbG9jYXRlKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICB0aGlzLmF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lOwotCi0gICAgcmV0dXJuIChYU0RDb25jcmV0ZUNvbXBvbmVudCkgZG9Td2l0Y2goY29tcG9uZW50KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTRE11bHRpUGFnZUVkaXRvckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNETXVsdGlQYWdlRWRpdG9yQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y0NzgxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNETXVsdGlQYWdlRWRpdG9yQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuWm9vbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuR0VGQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLlpvb21Db21ib0NvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuWm9vbUluUmV0YXJnZXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuWm9vbU91dFJldGFyZ2V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5SZXRhcmdldEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hY3Rpb25zLklYU0RUb29sYmFyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQ2FwdHVyZVNjcmVlbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBpbnN0YWxsYXRpb24vZGVpbnN0YWxsYXRpb24gb2YgZ2xvYmFsIGFjdGlvbnMgZm9yIG11bHRpLXBhZ2UKLSAqIGVkaXRvcnMuIFJlc3BvbnNpYmxlIGZvciB0aGUgcmVkaXJlY3Rpb24gb2YgZ2xvYmFsIGFjdGlvbnMgdG8gdGhlIGFjdGl2ZQotICogZWRpdG9yLiBNdWx0aS1wYWdlIGNvbnRyaWJ1dG9yIHJlcGxhY2VzIHRoZSBjb250cmlidXRvcnMgZm9yIHRoZSBpbmRpdmlkdWFsCi0gKiBlZGl0b3JzIGluIHRoZSBtdWx0aS1wYWdlIGVkaXRvci4KLSAqLwotcHVibGljIGNsYXNzIFhTRE11bHRpUGFnZUVkaXRvckNvbnRyaWJ1dG9yIGV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IKLXsKLSAgcHJpdmF0ZSBJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3JQYXJ0OwotICBwcml2YXRlIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIHhzZEVkaXRvcjsKLSAgcHJvdGVjdGVkIElUZXh0RWRpdG9yIHRleHRFZGl0b3I7Ci0gIHByb3RlY3RlZCBJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3Igc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgPSBudWxsOwotICBwcm90ZWN0ZWQgTGlzdCBmUGFydExpc3RlbmVycz0gbmV3IEFycmF5TGlzdCgpOwotICBab29tSW5SZXRhcmdldEFjdGlvbiB6b29tSW5SZXRhcmdldEFjdGlvbjsKLSAgWm9vbU91dFJldGFyZ2V0QWN0aW9uIHpvb21PdXRSZXRhcmdldEFjdGlvbjsKLSAgQWN0aW9uIGNhcHR1cmVTY3JlZW5BY3Rpb247Ci0gIFpvb21Db21ib0NvbnRyaWJ1dGlvbkl0ZW0gem9vbUNvbWJvQ29udHJpYnV0aW9uSXRlbTsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBtdWx0aS1wYWdlIGNvbnRyaWJ1dG9yLgotICAgKi8KLSAgcHVibGljIFhTRE11bHRpUGFnZUVkaXRvckNvbnRyaWJ1dG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgPSBuZXcgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yKCk7Ci0gICAgem9vbUluUmV0YXJnZXRBY3Rpb24gPSBuZXcgWm9vbUluUmV0YXJnZXRBY3Rpb24oKTsKLSAgICB6b29tSW5SZXRhcmdldEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoWFNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvZXRvb2wxNi96b29tcGx1cy5naWYiKSk7Ci0gICAgem9vbU91dFJldGFyZ2V0QWN0aW9uID0gbmV3IFpvb21PdXRSZXRhcmdldEFjdGlvbigpOwotICAgIHpvb21PdXRSZXRhcmdldEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoWFNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvZXRvb2wxNi96b29tbWludXMuZ2lmIikpOwotICAgIGNhcHR1cmVTY3JlZW5BY3Rpb24gPSBuZXcgQ2FwdHVyZVNjcmVlbkFjdGlvbigpOwotICAgIGZQYXJ0TGlzdGVuZXJzLmFkZCh6b29tSW5SZXRhcmdldEFjdGlvbik7Ci0gICAgZlBhcnRMaXN0ZW5lcnMuYWRkKHpvb21PdXRSZXRhcmdldEFjdGlvbik7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgYWN0aW9uIHJlZ2lzdGVkIHdpdGggdGhlIGdpdmVuIHRleHQgZWRpdG9yLgotICAgKiAKLSAgICogQHJldHVybiBJQWN0aW9uIG9yIG51bGwgaWYgZWRpdG9yIGlzIG51bGwuCi0gICAqLwotICBwcm90ZWN0ZWQgSUFjdGlvbiBnZXRBY3Rpb24oSVRleHRFZGl0b3IgZWRpdG9yLCBTdHJpbmcgYWN0aW9uSUQpCi0gIHsKLSAgICByZXR1cm4gKGVkaXRvciA9PSBudWxsID8gbnVsbCA6IGVkaXRvci5nZXRBY3Rpb24oYWN0aW9uSUQpKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YURvYykgTWV0aG9kIGRlY2xhcmVkIGluCi0gICAqIEFic3RyYWN0TXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuCi0gICAqLwotCi0gIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhZ2UoSUVkaXRvclBhcnQgcGFydCkKLSAgewotICAgIGlmIChhY3RpdmVFZGl0b3JQYXJ0ID09IHBhcnQpCi0gICAgICByZXR1cm47Ci0KLSAgICBhY3RpdmVFZGl0b3JQYXJ0ID0gcGFydDsKLQotICAgIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRBY3Rpb25CYXJzKCk7Ci0gICAgYm9vbGVhbiBpc1NvdXJjZSA9IGZhbHNlOwotICAgIAotICAgIGlmIChhY3RpdmVFZGl0b3JQYXJ0ICE9IG51bGwgJiYgYWN0aXZlRWRpdG9yUGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotICAgIHsKLSAgICAgIGlzU291cmNlID0gdHJ1ZTsKLSAgICAgIHpvb21JblJldGFyZ2V0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgem9vbU91dFJldGFyZ2V0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgY2FwdHVyZVNjcmVlbkFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIGFjdGl2YXRlU291cmNlUGFnZShhY3RpdmVFZGl0b3JQYXJ0LCB0cnVlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGFjdGl2YXRlU291cmNlUGFnZSh4c2RFZGl0b3IsIGZhbHNlKTsKLSAgICAgIGlmIChwYXJ0IGluc3RhbmNlb2YgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpCi0gICAgICB7Ci0gICAgICAgIHhzZEVkaXRvciA9IChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikgcGFydDsKLSAgICAgIH0KLSAgICAgIGlmICh4c2RFZGl0b3IgIT0gbnVsbCkKLSAgICAgIHsgICAgCSAgCi0gICAgICAgIC8vIGNzOiBoZXJlJ3Mgd2UgZW5zdXJlIHRoZSBVTkRPIGFuZCBSRURPIGFjdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIAotICAgICAgICAvLyB0aGUgZGVzaWduIHZpZXcgaXMgYWN0aXZlCi0gICAgICAgIElXb3JrYmVuY2hQYXJ0U2l0ZSBzaXRlID0geHNkRWRpdG9yLmdldFNpdGUoKTsKLSAgICAgICAgaWYgKHNpdGUgaW5zdGFuY2VvZiBJRWRpdG9yU2l0ZSkgCi0gICAgICAgIHsKLSAgICAgICAgICBJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0geHNkRWRpdG9yLmdldFRleHRFZGl0b3IoKTsKLSAgICAgICAgICBJQWN0aW9uQmFycyBzaXRlQWN0aW9uQmFycyA9ICgoSUVkaXRvclNpdGUpIHNpdGUpLmdldEFjdGlvbkJhcnMoKTsKLSAgICAgICAgICBzaXRlQWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVORE8sIGdldEFjdGlvbih0ZXh0RWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRPKSk7Ci0gICAgICAgICAgc2l0ZUFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5SRURPLCBnZXRBY3Rpb24odGV4dEVkaXRvciwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUkVETykpOwotICAgICAgICAgIHNpdGVBY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsgICAgCQkJCQkKLSAgICAgICAgfQotCQkJCi0gICAgICAgIE9iamVjdCBhZGFwdGVyID0geHNkRWRpdG9yLmdldEFkYXB0ZXIoQWN0aW9uUmVnaXN0cnkuY2xhc3MpOwotICAgICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIEFjdGlvblJlZ2lzdHJ5KQotICAgICAgICB7Ci0gICAgICAgICAgQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSAoQWN0aW9uUmVnaXN0cnkpIGFkYXB0ZXI7Ci0gICAgICAgICAgYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksIHJlZ2lzdHJ5LmdldEFjdGlvbihEZWxldGVBY3Rpb24uSUQpKTsKLSAgICAgICAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoR0VGQWN0aW9uQ29uc3RhbnRzLlpPT01fSU4sIHJlZ2lzdHJ5LmdldEFjdGlvbihHRUZBY3Rpb25Db25zdGFudHMuWk9PTV9JTikpOwotICAgICAgICAgIGFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihHRUZBY3Rpb25Db25zdGFudHMuWk9PTV9PVVQsIHJlZ2lzdHJ5LmdldEFjdGlvbihHRUZBY3Rpb25Db25zdGFudHMuWk9PTV9PVVQpKTsKLSAgICAgICAgICBhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QUklOVC5nZXRJZCgpLCByZWdpc3RyeS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5QUklOVC5nZXRJZCgpKSk7Ci0gICAgICAgICAgem9vbUluUmV0YXJnZXRBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICB6b29tT3V0UmV0YXJnZXRBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICBjYXB0dXJlU2NyZWVuQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoYWN0aW9uQmFycyAhPSBudWxsKSB7Ci0gICAgICAvLyB1cGRhdGUgbWVudSBiYXIgYW5kIHRvb2wgYmFyCi0gICAgICBhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKHpvb21Db21ib0NvbnRyaWJ1dGlvbkl0ZW0gIT0gbnVsbCkKLSAgICB7Ci0gICAgICB6b29tQ29tYm9Db250cmlidXRpb25JdGVtLnNldFZpc2libGUoIWlzU291cmNlKTsKLSAgICAgIHpvb21Db21ib0NvbnRyaWJ1dGlvbkl0ZW0udXBkYXRlKCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZVNvdXJjZVBhZ2UoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yLCBib29sZWFuIHN0YXRlKQotICB7Ci0gICAgaWYgKHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yICE9IG51bGwgJiYgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpCi0gICAgewotICAgICAgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0gICAgICAoKElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IpLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoc3RhdGUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBwYXJ0KQotICB7Ci0gICAgSUVkaXRvclBhcnQgYWN0aXZlTmVzdGVkRWRpdG9yID0gbnVsbDsKLSAgICBpZiAocGFydCBpbnN0YW5jZW9mIE11bHRpUGFnZUVkaXRvclBhcnQpCi0gICAgewotICAgICAgYWN0aXZlTmVzdGVkRWRpdG9yID0gcGFydDsKLSAgICB9Ci0gICAgc2V0QWN0aXZlUGFnZShhY3RpdmVOZXN0ZWRFZGl0b3IpOwotICAgIAotICAgIGlmIChwYXJ0IGluc3RhbmNlb2YgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpCi0gICAgewotICAgICAgeHNkRWRpdG9yID0gKEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKSBwYXJ0OwotCi0gICAgICB0ZXh0RWRpdG9yID0geHNkRWRpdG9yLmdldFRleHRFZGl0b3IoKTsKLSAgICAgIGlmICh0ZXh0RWRpdG9yICE9IG51bGwpCi0gICAgICB7ICAgICAgCi0vLyAgICAgICAgdXBkYXRlQWN0aW9ucygpOyAgCi0gICAgICAgIGdldEFjdGlvbkJhcnMoKS51cGRhdGVBY3Rpb25CYXJzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIExpc3QgbGlzdCA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRYU0RFZGl0b3JDb25maWd1cmF0aW9uKCkuZ2V0VG9vbGJhckFjdGlvbnMoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgKChJWFNEVG9vbGJhckFjdGlvbilpLm5leHQoKSkuc2V0RWRpdG9yUGFydChhY3RpdmVOZXN0ZWRFZGl0b3IpOwotICAgIH0KLSAgICAKLSAgICBzdXBlci5zZXRBY3RpdmVFZGl0b3IocGFydCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKQotICB7Ci0gICAgSU1lbnVNYW5hZ2VyIG1lbnUgPSBuZXcgTWVudU1hbmFnZXIoTWVzc2FnZXMuX1VJX01FTlVfWFNEX0VESVRPUik7Ci0gICAgbWFuYWdlci5wcmVwZW5kVG9Hcm91cChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgbWVudSk7Ci0KLSAgICAvLyBBZGQgZXh0ZW5zaW9uIG1lbnUgYWN0aW9ucwotICAgIExpc3QgbGlzdCA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRYU0RFZGl0b3JDb25maWd1cmF0aW9uKCkuZ2V0VG9vbGJhckFjdGlvbnMoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgbWVudS5hZGQoKElYU0RUb29sYmFyQWN0aW9uKWkubmV4dCgpKTsKLSAgICB9Ci0KLSAgICBtZW51LmFkZCh6b29tSW5SZXRhcmdldEFjdGlvbik7Ci0gICAgbWVudS5hZGQoem9vbU91dFJldGFyZ2V0QWN0aW9uKTsKLSAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0gICAgbWVudS5hZGQoY2FwdHVyZVNjcmVlbkFjdGlvbik7Ci0KLSAgICBtZW51LnVwZGF0ZUFsbCh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIpCi0gIHsKLSAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgIC8vIEFkZCBleHRlbnNpb24gdG9vbGJhciBhY3Rpb25zCi0gICAgTGlzdCBsaXN0ID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFhTREVkaXRvckNvbmZpZ3VyYXRpb24oKS5nZXRUb29sYmFyQWN0aW9ucygpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBtYW5hZ2VyLmFkZCgoSVhTRFRvb2xiYXJBY3Rpb24paS5uZXh0KCkpOwotICAgIH0KLQotICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgU3RyaW5nW10gem9vbVN0cmluZ3MgPSBuZXcgU3RyaW5nW10geyBab29tTWFuYWdlci5GSVRfQUxMLCBab29tTWFuYWdlci5GSVRfSEVJR0hULCBab29tTWFuYWdlci5GSVRfV0lEVEggfTsKLSAgICB6b29tQ29tYm9Db250cmlidXRpb25JdGVtID0gbmV3IFpvb21Db21ib0NvbnRyaWJ1dGlvbkl0ZW0oZ2V0UGFnZSgpLCB6b29tU3RyaW5ncyk7Ci0gICAgbWFuYWdlci5hZGQoem9vbUNvbWJvQ29udHJpYnV0aW9uSXRlbSk7Ci0gICAgbWFuYWdlci5hZGQoY2FwdHVyZVNjcmVlbkFjdGlvbik7Ci0gIH0KLSAgCi0gIAotICBwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGJhcnMsIElXb3JrYmVuY2hQYWdlIHBhZ2UpCi0gIHsKLSAgICBJdGVyYXRvciBlID0gZlBhcnRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoZS5oYXNOZXh0KCkpCi0gICAgewotICAgICAgcGFnZS5hZGRQYXJ0TGlzdGVuZXIoKFJldGFyZ2V0QWN0aW9uKSBlLm5leHQoKSk7Ci0gICAgfQotICAgIAotICAgIGluaXRTb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcihiYXJzKTsKLSAgICAKLSAgICBzdXBlci5pbml0KGJhcnMsIHBhZ2UpOwotICB9Ci0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGluaXRTb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcihJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0gICAgaWYgKHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yICE9IG51bGwpCi0gICAgICBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5pbml0KGFjdGlvbkJhcnMsIGdldFBhZ2UoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgZlBhcnRMaXN0ZW5lcnMgPSBudWxsOwotICAgIGlmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsKQotICAgICAgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IuZGlzcG9zZSgpOwotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEU2VsZWN0aW9uTWFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEU2VsZWN0aW9uTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1Mjc1OTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTRFNlbGVjdGlvbk1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBYU0RTZWxlY3Rpb25NYXBwZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uTWFwcGVyCi17Ci0gIHB1YmxpYyBJU2VsZWN0aW9uIG1hcFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgeyAgCi0gICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBBZGFwdGVyKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQoKChBZGFwdGVyKW8pLmdldFRhcmdldCgpKTsKLSAgICAgICAgfSAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKG8pOwotICAgICAgICB9ICAKLSAgICAgIH0gIAotICAgIH0KLSAgICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obGlzdCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RTdWJzdGl0dXRpb25Hcm91cEVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEU3Vic3RpdHV0aW9uR3JvdXBFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDE5YTBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RTdWJzdGl0dXRpb25Hcm91cEVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRYU0RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guSVhTRFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFhTRFN1YnN0aXR1dGlvbkdyb3VwRWRpdE1hbmFnZXIgZXh0ZW5kcyBYU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIKLXsKLQotICBwdWJsaWMgWFNEU3Vic3RpdHV0aW9uR3JvdXBFZGl0TWFuYWdlcihJRmlsZSBjdXJyZW50RmlsZSwgWFNEU2NoZW1hW10gc2NoZW1hcykKLSAgewotICAgIHN1cGVyKGN1cnJlbnRGaWxlLCBzY2hlbWFzKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShPYmplY3QgcmVmZXJlbmNpbmdPYmplY3QsIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50KQotICB7Ci0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGNvbmNyZXRlQ29tcG9uZW50ID0gbnVsbDsKLSAgICBpZiAocmVmZXJlbmNpbmdPYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyKQotICAgIHsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKXJlZmVyZW5jaW5nT2JqZWN0OwotICAgICAgaWYgKGFkYXB0ZXIuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIGNvbmNyZXRlQ29tcG9uZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbilhZGFwdGVyLmdldFRhcmdldCgpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChyZWZlcmVuY2luZ09iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIGNvbmNyZXRlQ29tcG9uZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgcmVmZXJlbmNpbmdPYmplY3Q7Ci0gICAgfQotICAgIGlmIChjb25jcmV0ZUNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgICAgaWYgKGNvbXBvbmVudC5pc05ldygpKQotICAgICAgICB7ICAKLSAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlYyA9IG51bGw7Ci0gICAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRNZXRhTmFtZSgpID09IElYU0RTZWFyY2hDb25zdGFudHMuRUxFTUVOVF9NRVRBX05BTUUpCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICBBZGRYU0RFbGVtZW50Q29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTREVsZW1lbnRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0VMRU1FTlQsIGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLSAgICAgICAgICAgIGNvbW1hbmQuc2V0TmFtZVRvQWRkKGNvbXBvbmVudC5nZXROYW1lKCkpOwotICAgICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgICAgICBlbGVtZW50RGVjID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgY29tbWFuZC5nZXRBZGRlZENvbXBvbmVudCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZWxlbWVudERlYyAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoY29uY3JldGVDb21wb25lbnQuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuU1VCU1RJVFVUSU9OR1JPVVBfQVRUUklCVVRFLCBlbGVtZW50RGVjLmdldFFOYW1lKGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpKSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfU1VCU1RJVFVUSU9OX0dST1VQKTsKLSAgICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICAgIH0gIAotICAgICAgICB9ICAKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChjb25jcmV0ZUNvbXBvbmVudC5nZXRFbGVtZW50KCksIFhTRENvbnN0YW50cy5TVUJTVElUVVRJT05HUk9VUF9BVFRSSUJVVEUsICgoWFNERWxlbWVudERlY2xhcmF0aW9uKWNvbXBvbmVudC5nZXRPYmplY3QoKSkuZ2V0UU5hbWUoY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9TVUJTVElUVVRJT05fR1JPVVApOwotICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICB9ICAKLSAgICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL1hTRFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAzNTkxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRXVnZW5lIE9zdHJvdWtob3YsIGV1Z2VuZUBnZW51aXRlYy5jb20gLSBbMjAzMjkxXSBYU0QgRWRpdG9yIFNvdXJjZSBTdGF0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHVwZGF0ZWQgaW4gT3V0bGluZS9HcmFwaAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREF0dHJpYnV0ZVVzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RQYXJ0aWNsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnRleHQuWFNETW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFhTRFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIGV4dGVuZHMgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgaW1wbGVtZW50cyBJQURUT2JqZWN0TGlzdGVuZXIKLXsKLSAgWFNEQmFzZUFkYXB0ZXIgb2xkU2VsZWN0aW9uOwotICBYU0RNb2RlbEFkYXB0ZXIgeHNkTW9kZWxBZGFwdGVyOwotICBwdWJsaWMgWFNEVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UoSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcikKLSAgewotICAgIHN1cGVyKHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvbkxpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQotICAgICAgT2JqZWN0IHNlbGVjdGVkID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgWFNEQmFzZUFkYXB0ZXIgYWRhcHRlciA9IChYU0RCYXNlQWRhcHRlcilzZWxlY3RlZDsKLSAgICAgICAgaWYgKG9sZFNlbGVjdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgb2xkU2VsZWN0aW9uLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICBpZiAob2xkU2VsZWN0aW9uIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbSA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pKChYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKW9sZFNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoZWxlbS5nZXRDb250YWluZXIoKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBBZGFwdGVyIGFkYXAgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGVsZW0uZ2V0Q29udGFpbmVyKCkpOwotICAgICAgICAgICAgICBpZiAoYWRhcCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlQWRhcHRlcikKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhTRFBhcnRpY2xlQWRhcHRlciBwYXJ0aWNsZUFkYXB0ZXIgPSAoWFNEUGFydGljbGVBZGFwdGVyKWFkYXA7Ci0gICAgICAgICAgICAgICAgcGFydGljbGVBZGFwdGVyLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVsZW0uaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciByZXNvbHZlZEVsZW1lbnRBZGFwdGVyID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIpWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChlbGVtLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkpOwotICAgICAgICAgICAgICByZXNvbHZlZEVsZW1lbnRBZGFwdGVyLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW0gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSgoWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcilhZGFwdGVyKS5nZXRUYXJnZXQoKTsKLSAgICAgICAgICBBZGFwdGVyIGFkYXAgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGVsZW0uZ2V0Q29udGFpbmVyKCkpOwotICAgICAgICAgIGlmIChhZGFwIGluc3RhbmNlb2YgWFNEUGFydGljbGVBZGFwdGVyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRFBhcnRpY2xlQWRhcHRlciBwYXJ0aWNsZUFkYXB0ZXIgPSAoWFNEUGFydGljbGVBZGFwdGVyKWFkYXA7Ci0gICAgICAgICAgICBwYXJ0aWNsZUFkYXB0ZXIucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGVsZW0uaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIHJlc29sdmVkRWxlbWVudEFkYXB0ZXIgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcilYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGVsZW0uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKSk7Ci0gICAgICAgICAgICByZXNvbHZlZEVsZW1lbnRBZGFwdGVyLnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlVXNlQWRhcHRlciBhdHRyaWJ1dGVVc2UgPSAoWFNEQXR0cmlidXRlVXNlQWRhcHRlcikgYWRhcHRlcjsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgeHNkQXR0clVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpIGF0dHJpYnV0ZVVzZS5nZXRUYXJnZXQoKTsKLSAgICAgICAgICBhZGFwdGVyID0gKFhTREJhc2VBZGFwdGVyKSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KHhzZEF0dHJVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYWRhcHRlci5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgICAgICBvbGRTZWxlY3Rpb24gPSBhZGFwdGVyOwotICAgICAgICBPYmplY3QgbW9kZWwgPSBhZGFwdGVyLmdldFRhcmdldCgpOwotCi0gICAgICAgIGlmICh4c2RNb2RlbEFkYXB0ZXIgIT0gbnVsbCAmJiB4c2RNb2RlbEFkYXB0ZXIuZ2V0TW9kZWxSZWNvbmNpbGVBZGFwdGVyKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHhzZE1vZGVsQWRhcHRlci5nZXRNb2RlbFJlY29uY2lsZUFkYXB0ZXIoKS5yZW1vdmVMaXN0ZW5lcihpbnRlcm5hbE5vZGVBZGFwdGVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClhZGFwdGVyLmdldFRhcmdldCgpKS5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICB4c2RNb2RlbEFkYXB0ZXIgPSBYU0RNb2RlbEFkYXB0ZXIubG9va3VwT3JDcmVhdGVNb2RlbEFkYXB0ZXIoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh4c2RNb2RlbEFkYXB0ZXIgIT0gbnVsbCAmJiB4c2RNb2RlbEFkYXB0ZXIuZ2V0TW9kZWxSZWNvbmNpbGVBZGFwdGVyKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHhzZE1vZGVsQWRhcHRlci5nZXRNb2RlbFJlY29uY2lsZUFkYXB0ZXIoKS5hZGRMaXN0ZW5lcihpbnRlcm5hbE5vZGVBZGFwdGVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtb2RlbCk7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChwYXJ0LCBzZWxlY3Rpb24pOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHBhcnQsIHNlbGVjdGlvbik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICBpZiAoZ2V0Q3VycmVudFRhYigpICE9IG51bGwpCi0gICAgewotICAgICAgcmVmcmVzaCgpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBpZiAoeHNkTW9kZWxBZGFwdGVyICE9IG51bGwgJiYgeHNkTW9kZWxBZGFwdGVyLmdldE1vZGVsUmVjb25jaWxlQWRhcHRlcigpICE9IG51bGwpCi0gICAgewotICAgICAgeHNkTW9kZWxBZGFwdGVyLmdldE1vZGVsUmVjb25jaWxlQWRhcHRlcigpLnJlbW92ZUxpc3RlbmVyKGludGVybmFsTm9kZUFkYXB0ZXIpOwotICAgICAgeHNkTW9kZWxBZGFwdGVyID0gbnVsbDsKLSAgICB9Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIElOb2RlQWRhcHRlciBpbnRlcm5hbE5vZGVBZGFwdGVyID0gbmV3IEludGVybmFsTm9kZUFkYXB0ZXIoKTsKLSAgY2xhc3MgSW50ZXJuYWxOb2RlQWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlcgotICB7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKQotICAgIHsKLSAgICAgIHJlZnJlc2goKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9YU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc0ODkwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZVR5cGVSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVUeXBlUmVmZXJlbmNlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MuTmV3VHlwZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5zZWFyY2guWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLklYU0RTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUJ1aWxkaW5nVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIgaW1wbGVtZW50cyBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciwgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIyCi17ICAKLSAgcHJvdGVjdGVkIElGaWxlIGN1cnJlbnRGaWxlOwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hW10gc2NoZW1hczsKLSAgcHJpdmF0ZSBzdGF0aWMgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZXN1bHRbXTsKLSAgcHJpdmF0ZSBJQURUT2JqZWN0IHJlZmVyZW5jZXI7Ci0gIAotICBwdWJsaWMgWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyKElGaWxlIGN1cnJlbnRGaWxlLCBYU0RTY2hlbWFbXSBzY2hlbWFzKQotICB7Ci0gICAgdGhpcy5jdXJyZW50RmlsZSA9IGN1cnJlbnRGaWxlOwotICAgIHRoaXMuc2NoZW1hcyA9IHNjaGVtYXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZFRvSGlzdG9yeShDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudCkKLSAgewotICAgIC8vIFRPRE8gKGNzKSBpbXBsZW1lbnQgbWUhICAgIAotICB9Ci0gIAotICBwdWJsaWMgSUFEVE9iamVjdCBnZXRSZWZlcmVuY2VyKCkKLSAgewotICAgIHJldHVybiByZWZlcmVuY2VyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VyKElBRFRPYmplY3QgcmVmZXJlbmNlcikKLSAgewotICAgIHRoaXMucmVmZXJlbmNlciA9IHJlZmVyZW5jZXI7Ci0gIH0KLQotICBwdWJsaWMgSUNvbXBvbmVudERpYWxvZyBnZXRCcm93c2VEaWFsb2coKQotICB7Ci0gICAgLy9YU0RTZXRFeGlzdGluZ1R5cGVEaWFsb2cgZGlhbG9nID0gbmV3IFhTRFNldEV4aXN0aW5nVHlwZURpYWxvZyhjdXJyZW50RmlsZSwgc2NoZW1hcyk7Ci0gICAgLy9yZXR1cm4gZGlhbG9nOwotICAgIFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZSBkaWFsb2dEZWxlZ2F0ZSA9IG5ldyBYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUoWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlLlRZUEVfTUVUQV9OQU1FLCBjdXJyZW50RmlsZSwgc2NoZW1hcyk7Ci0gICAgcmV0dXJuIGRpYWxvZ0RlbGVnYXRlOwotICB9Ci0KLSAgcHVibGljIElDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyIGdldENvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBnZXRIaXN0b3J5KCkKLSAgewotICAgIC8vIFRPRE8gKGNzKSBpbXBsZW1lbnQgdGhpcyBwcm9wZXJseSAtIHNob3VsZCB0aGlzIGhpc3RvcnkgYmUgZ2xvYmFsIG9yIGxvY2FsIHRvIGVhY2ggZWRpdG9yPwotICAgIC8vIFRoaXMgaXMgc29tZXRoaW5nIHdlIHNob3VsZCBwbGF5IGFyb3VuZCB3aXRoIG91cnNlbHZlcyB0byBzZWUgd2hhdCBmZWVscyByaWdodC4KLSAgICAvLwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHJlc3VsdFtdID0gbmV3IENvbXBvbmVudFNwZWNpZmljYXRpb25bbGlzdC5zaXplKCldOwotICAgIGxpc3QudG9BcnJheShyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgSUNvbXBvbmVudERpYWxvZyBnZXROZXdEaWFsb2coKQotICB7Ci0gICAgTmV3VHlwZURpYWxvZyByZXN1bHQgPSBudWxsOwotICAgIGlmIChzY2hlbWFzLmxlbmd0aCA+IDApIAotICAgIHsKLSAgICAgIHJlc3VsdCA9IG5ldyBOZXdUeXBlRGlhbG9nKHNjaGVtYXNbMF0pOwotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAgIHJlc3VsdCA9IG5ldyBOZXdUeXBlRGlhbG9nKCk7Ci0gICAgfQotICAgIGlmIChyZWZlcmVuY2VyIGluc3RhbmNlb2YgSUZpZWxkKQotICAgIHsKLSAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpcmVmZXJlbmNlcjsKLSAgICAgIGlmIChYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLmVxdWFscyhmaWVsZC5nZXRLaW5kKCkpKQotICAgICAgewotICAgICAgICByZXN1bHQuYWxsb3dDb21wbGV4VHlwZShmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBTdHJpbmcgZmllbGROYW1lID0gZmllbGQuZ2V0TmFtZSgpOwotICAgICAgaWYgKGZpZWxkTmFtZSAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIGZpZWxkTmFtZSA9IGZpZWxkTmFtZS50cmltKCk7Ci0gICAgICAgIGlmIChmaWVsZE5hbWUubGVuZ3RoKCkgPiAwKQotICAgICAgICB7ICAKLSAgICAgICAgICByZXN1bHQuc2V0RGVmYXVsdE5hbWUoTkxTLmJpbmQoTWVzc2FnZXMuX1VJX1ZBTFVFX05FV19UWVBFLCBmaWVsZE5hbWUpKTsKLSAgICAgICAgfSAgCi0gICAgICB9ICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gZ2V0UXVpY2tQaWNrcygpCi0gIHsKLSAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgLy8gVE9ETyAoY3MpIGltcGxlbWVudCB0aGlzIHByb3Blcmx5IC0gd2Ugc2hvdWxkIGJlIHByb3ZpZGluZyBhIGxpc3Qgb2YgdGhlIAotICAgIC8vIG1vc3QgJ2NvbW1vbicgYnVpbHQgaW4gc2NoZW1hIHR5cGVzIGhlcmUKLSAgICAvLyBJIGJlbGlldmUgVHJ1bmcgd2lsbCBiZSB3b3JraW5nIG9uIGEgcGVyZmVyZW5jZSBwYWdlIHRvIGdpdmUgdXMgdGhpcyBsaXN0Ci0gICAgLy8gZm9yIG5vdyBsZXQncyBoYXJkIGNvZGUgc29tZSB2YWx1ZXMKLSAgICAvLwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJib29sZWFuIiwgbnVsbCkpOyAvLyROT04tTkxTLTEkCi0gICAgbGlzdC5hZGQobmV3IENvbXBvbmVudFNwZWNpZmljYXRpb24oWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCAiZGF0ZSIsIG51bGwpKTsgLy8kTk9OLU5MUy0xJAotICAgIGxpc3QuYWRkKG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgImRhdGVUaW1lIiwgbnVsbCkpOyAgICAgLy8kTk9OLU5MUy0xJAotICAgIGxpc3QuYWRkKG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgImRvdWJsZSIsIG51bGwpKTsgLy8kTk9OLU5MUy0xJAotICAgIGxpc3QuYWRkKG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgImZsb2F0IiwgbnVsbCkpOyAgLy8kTk9OLU5MUy0xJAotICAgIGxpc3QuYWRkKG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgImhleEJpbmFyeSIsIG51bGwpKTsgLy8kTk9OLU5MUy0xJAotICAgIGxpc3QuYWRkKG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgImludCIsIG51bGwpKTsgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBsaXN0LmFkZChuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJzdHJpbmciLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBsaXN0LmFkZChuZXcgQ29tcG9uZW50U3BlY2lmaWNhdGlvbihYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJ0aW1lIiwgbnVsbCkpOyAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgIHJlc3VsdCA9IG5ldyBDb21wb25lbnRTcGVjaWZpY2F0aW9uW2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotCi0gIHB1YmxpYyB2b2lkIG1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShPYmplY3QgcmVmZXJlbmNpbmdPYmplY3QsIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50KQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQgPSBudWxsOwotICAgIGlmIChyZWZlcmVuY2luZ09iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXIpCi0gICAgewotICAgICAgQWRhcHRlciBhZHBhdGVyID0gKEFkYXB0ZXIpcmVmZXJlbmNpbmdPYmplY3Q7Ci0gICAgICBpZiAoYWRwYXRlci5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBjb25jcmV0ZUNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudClhZHBhdGVyLmdldFRhcmdldCgpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChyZWZlcmVuY2luZ09iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIGNvbmNyZXRlQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSByZWZlcmVuY2luZ09iamVjdDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGNvbmNyZXRlQ29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGNvbXBvbmVudC5pc05ldygpKQotICAgICAgeyAgCi0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gbnVsbDsKLSAgICAgICAgaWYgKGNvbXBvbmVudC5nZXROYW1lKCkgPT0gbnVsbCAvLyBUaGlzIG1lYW5zIHdlIHNldCB0byBhbm9ueW1vdXMgdHlwZQotICAgICAgICAJCSYmIGNvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERmFjdG9yeSBmYWN0b3J5ID0gWFNEU2NoZW1hQnVpbGRpbmdUb29scy5nZXRYU0RGYWN0b3J5KCk7Ci0gICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGNvbmNyZXRlQ29tcG9uZW50OwotICAgICAgICAgIC8vIFRPRE8gKGNzKSB3ZSBzaG91bGQgdXNlIGFjdGlvbnMgaGVyZSBzbyB0aGF0IFVORE8vUkVETyBjYW4gd29yayBuaWNlbHkKLSAgICAgICAgICAvLyB3aXRoIHRoZSBwcm9wZXIgdW5kbyBkZXNjcmlwdGlvbnMKLSAgICAgICAgICBpZiAoY29tcG9uZW50LmdldE1ldGFOYW1lKCkgPT0gSVhTRFNlYXJjaENvbnN0YW50cy5DT01QTEVYX1RZUEVfTUVUQV9OQU1FKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IGZhY3RvcnkuY3JlYXRlWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7ICAgICAgICAgICAgCi0JICAJICAgIGVsZW1lbnREZWNsYXJhdGlvbi5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbihjb21wbGV4VHlwZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgIAlYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlID0gZmFjdG9yeS5jcmVhdGVYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAJc2ltcGxlVHlwZS5zZXRCYXNlVHlwZURlZmluaXRpb24oCi0gICAgICAgIAkJCWVsZW1lbnREZWNsYXJhdGlvbi5nZXRTY2hlbWEoKS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCAic3RyaW5nIikgKTsgLy8kTk9OLU5MUy0xJAotICAJICAJICAgIGVsZW1lbnREZWNsYXJhdGlvbi5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbihzaW1wbGVUeXBlKTsKLSAgICAgICAgICB9Ci0JCSAgZWxlbWVudERlY2xhcmF0aW9uLmdldEVsZW1lbnQoKS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKTsgLy9UT0RPIHVzZSBleHRlcm5hbCBsaXRlcmFsIHN0cmluZwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbXBvbmVudC5nZXRNZXRhTmFtZSgpID09IElYU0RTZWFyY2hDb25zdGFudHMuQ09NUExFWF9UWVBFX01FVEFfTkFNRSkKLSAgICAgICAgeyAgCi0gICAgICAgICAgQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQ09NUExFWF9UWVBFLCBjb25jcmV0ZUNvbXBvbmVudC5nZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgY29tbWFuZC5zZXROYW1lVG9BZGQoY29tcG9uZW50LmdldE5hbWUoKSk7Ci0gICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgICAgdGQgPSBjb21tYW5kLmdldENyZWF0ZWRDb21wbGV4VHlwZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIEFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9TSU1QTEVfVFlQRSwgY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgICAgIGNvbW1hbmQuc2V0TmFtZVRvQWRkKGNvbXBvbmVudC5nZXROYW1lKCkpOwotICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICAgIHRkID0gY29tbWFuZC5nZXRDcmVhdGVkU2ltcGxlVHlwZSgpOwotICAgICAgICB9ICAKLSAgICAgICAgaWYgKHRkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlVHlwZVJlZmVyZW5jZUNvbW1hbmQoY29uY3JldGVDb21wb25lbnQsIHRkKTsKLSAgICAgICAgICBjb21tYW5kLnNldExhYmVsKE1lc3NhZ2VzLl9VSV9BQ1RJT05fU0VUX1RZUEUpOwotICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICB9ICAKLSAgICAgIH0gIAotICAgICAgZWxzZQotICAgICAgeyAgCi0gICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVUeXBlUmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQoY29uY3JldGVDb21wb25lbnQsIGNvbXBvbmVudC5nZXROYW1lKCksIGNvbXBvbmVudC5nZXRRdWFsaWZpZXIoKSwgY29tcG9uZW50LmdldEZpbGUoKSk7Ci0gICAgICAgIGNvbW1hbmQuc2V0TGFiZWwoTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfVFlQRSk7Ci0gICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgfSAgCi0gICAgfSAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9Eb3QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL0RvdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMGJiMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL0RvdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvR2VuZXJhdGVEdGQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL0dlbmVyYXRlRHRkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1OGMxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvR2VuZXJhdGVEdGQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL0dlbmVyYXRlSmF2YS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvR2VuZXJhdGVKYXZhLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3NWM2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvR2VuZXJhdGVKYXZhLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9HcmFwaFZpZXdFbGVtZW50UmVmLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9HcmFwaFZpZXdFbGVtZW50UmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUzNWRhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvR3JhcGhWaWV3RWxlbWVudFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvTmV3WFNELnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9OZXdYU0QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzRjYWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9OZXdYU0QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1JlZ2V4V2l6YXJkQXJyb3cuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1JlZ2V4V2l6YXJkQXJyb3cuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDU1MGEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9SZWdleFdpemFyZEFycm93LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9UcmlhbmdsZVRvb2xCYXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1RyaWFuZ2xlVG9vbEJhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMzdlYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1RyaWFuZ2xlVG9vbEJhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvVmFsaWRhdGVYU0QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1ZhbGlkYXRlWFNELmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzNDdhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvVmFsaWRhdGVYU0QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREFsbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ3NGU4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBbm5vdGF0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQW5ub3RhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjEwOGMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBbm5vdGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQW55LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBbnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzlmOTNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBbnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREFueUF0dHJpYnV0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQW55QXR0cmlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4MGNjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQW55QXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBcHBJbmZvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBcHBJbmZvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRhMDAxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQXBwSW5mby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQXR0cmlidXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWQ0OWQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREF0dHJpYnV0ZUdyb3VwLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGVHcm91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ODQ2MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREF0dHJpYnV0ZUdyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQXR0cmlidXRlR3JvdXBSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODlmYThmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQXR0cmlidXRlUmVmLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGVSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzY1YWYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RBdHRyaWJ1dGVSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRENob2ljZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQ2hvaWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODliYTgyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQ2hvaWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RDb21wbGV4Q29udGVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQ29tcGxleENvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWM2OGRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RDb21wbGV4Q29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQ29tcGxleFR5cGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRENvbXBsZXhUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3Zjg1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEQ29tcGxleFR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRERhdGVBbmRUaW1lVHlwZXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRERhdGVBbmRUaW1lVHlwZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmM4NGU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0REYXRlQW5kVGltZVR5cGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0REb2MuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRERvYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNDlhMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRERvYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERWxlbWVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNDVmMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREVsZW1lbnRSZWYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREVsZW1lbnRSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDlhY2ZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RFbGVtZW50UmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RFeHRlbnNpb24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREV4dGVuc2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZmI4MDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREV4dGVuc2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERmllbGQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREZpZWxkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4ZTQzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNERmllbGQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREZpbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTAwZjFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RHbG9iYWxBdHRyaWJ1dGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREdsb2JhbEF0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDQ5ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREdsb2JhbEF0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNER2xvYmFsRWxlbWVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNER2xvYmFsRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNDVmMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREdsb2JhbEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREdyb3VwLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RHcm91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NWVmNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREdyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RHcm91cFJlZi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNER3JvdXBSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGE3ZmIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RHcm91cFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNESW1wb3J0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RJbXBvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTQ0Y2U1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RJbXBvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREluY2x1ZGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREluY2x1ZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjZjNTI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RJbmNsdWRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RLZXkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREtleS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MDMyYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTREtleS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNES2V5UmVmLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RLZXlSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTU4MjlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RLZXlSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRE5vdGF0aW9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0ROb3RhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOWRmOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRE5vdGF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0ROdW1iZXJUeXBlcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNETnVtYmVyVHlwZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTM0MjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0ROdW1iZXJUeXBlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEUmVkZWZpbmUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFJlZGVmaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5NjRjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEUmVkZWZpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNlbGVjdG9yLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTZWxlY3Rvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzOTlhNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNlbGVjdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTZXF1ZW5jZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2VxdWVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmYzZjk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTZXF1ZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlQ29udGVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlQ29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZjM4ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZUNvbnRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZUVudW0uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZUVudW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWQ3OTU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVFbnVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVMaXN0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVMaXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA4ZTc4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlTGlzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlUGF0dGVybi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlUGF0dGVybi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMTNjZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZVBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZVJlc3RyaWN0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVSZXN0cmljdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YmMxMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZVJlc3RyaWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVUeXBlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmMzNjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvWFNEU2ltcGxlVHlwZUZvckVkaXRQYXJ0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVUeXBlRm9yRWRpdFBhcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWVmZWIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVUeXBlRm9yRWRpdFBhcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZVVuaW9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RTaW1wbGVVbmlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MmFkYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFNpbXBsZVVuaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9YU0RVbmlxdWUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFVuaXF1ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOGE2NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL1hTRFVuaXF1ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvYXBwaW5mb19icm93c2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL2FwcGluZm9fYnJvd3NlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmOWJhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvYXBwaW5mb19icm93c2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL2FwcGluZm9fY2F0ZWdvcnkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL2FwcGluZm9fY2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTY2NWQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9hcHBpbmZvX2NhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9iYWNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9iYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRkMWEyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvYmFjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvYnJvd3NlYnV0dG9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9icm93c2VidXR0b24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2RhZTU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9icm93c2VidXR0b24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL2Vycm9yX3N0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvZXJyb3Jfc3Rfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjNjA2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvZXJyb3Jfc3Rfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9mb3J3YXJkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9mb3J3YXJkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiNjk5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvZm9yd2FyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvZ2VuZXJhdGVfeG1sLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9nZW5lcmF0ZV94bWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmUzNjM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9nZW5lcmF0ZV94bWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL3F1aWNrYXNzaXN0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9xdWlja2Fzc2lzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YWUyYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL3F1aWNrYXNzaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9yZWd4X3dpei5wbmcgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvcmVneF93aXoucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjE0NzdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9yZWd4X3dpei5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvcmVsb2FkZ3JhbW1hci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMvcmVsb2FkZ3JhbW1hci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MDVkYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL3JlbG9hZGdyYW1tYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL3NvcnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL2ljb25zL3NvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzY1ZGM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy9zb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy94bWxjYXRhbG9nX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvaWNvbnMveG1sY2F0YWxvZ19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjE0NDFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9pY29ucy94bWxjYXRhbG9nX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3IvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWMwMDFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotVUlfTEFCRUxfQkFTRV9UWVBFID0gQmFzZSBUeXBlOgotVUlfTEFCRUxfREVSSVZFRF9CWSA9IERlcml2ZWQgQnk6Ci0KLVVJX0xBQkVMX0lOSEVSSVRfRlJPTSA9IEluaGVyaXQgRnJvbToKLVVJX0xBQkVMX0lOSEVSSVRfQlkgPSBJbmhlcml0IEJ5OgotCi1VSV9MQUJFTF9ET0NVTUVOVEFUSU9OID0gRG9jdW1lbnRhdGlvbgotVUlfTEFCRUxfQVBQX0lORk8gPSBBcHAgSW5mbwotCi1VSV9MQUJFTF9TRVRfVFlQRSA9IFNldCBUeXBlCi1VSV9MQUJFTF9UWVBFID0gVHlwZToKLQotVUlfTEFCRUxfTkFNRSA9IE5hbWU6Ci0KLVVJX0xBQkVMX0tJTkQgPSBLaW5kOgotCi1VSV9MQUJFTF9NSU5PQ0NVUlMgPSBNaW5pbXVtIE9jY3VycmVuY2U6Ci1VSV9MQUJFTF9NQVhPQ0NVUlMgPSBNYXhpbXVtIE9jY3VycmVuY2U6Ci0KLVVJX1BBR0VfSEVBRElOR19SRUZFUkVOQ0UgPSBSZWZlcmVuY2UKLVVJX0xBQkVMX1JFQURfT05MWSA9IHJlYWQtb25seQotCi1VSV9OT19UWVBFID0gTm8gVHlwZQotCi1VSV9MQUJFTF9DT01QT05FTlRTCQkJCT0gQ29tcG9uZW50czoKLQotISBBZGRpdGlvbmFsIENhdGVnb3JpZXMKLV9VSV9HUkFQSF9UWVBFUyAgICAgICAgICAgICAgICA9IFR5cGVzCi1fVUlfR1JBUEhfRUxFTUVOVFMgICAgICAgICAgICAgPSBFbGVtZW50cwotX1VJX0dSQVBIX0FUVFJJQlVURVMgICAgICAgICAgID0gQXR0cmlidXRlcwotX1VJX0dSQVBIX0FUVFJJQlVURV9HUk9VUFMgICAgID0gQXR0cmlidXRlIEdyb3VwcwotX1VJX0dSQVBIX05PVEFUSU9OUyAgICAgICAgICAgID0gTm90YXRpb25zCi1fVUlfR1JBUEhfSURFTlRJVFlfQ09OU1RSQUlOVFMgPSBJZGVudGl0eSBDb25zdHJhaW50cwotX1VJX0dSQVBIX0FOTk9UQVRJT05TICAgICAgICAgID0gQW5ub3RhdGlvbnMKLV9VSV9HUkFQSF9ESVJFQ1RJVkVTICAgICAgICAgICA9IERpcmVjdGl2ZXMKLV9VSV9HUkFQSF9HUk9VUFMgICAgICAgICAgICAgICA9IEdyb3VwcwotCi1fVUlfTEFCRUxfTk9fTE9DQVRJT05fU1BFQ0lGSUVEICA9IE5vIExvY2F0aW9uIFNwZWNpZmllZAotX1VJX0FDVElPTl9TRVRfTVVMVElQTElDSVRZCQkgPSBTZXQgTXVsdGlwbGljaXR5Ci1fVUlfTEFCRUxfQUJTRU5UICAgICAgICAgICAgICAgPSBhYnNlbnQKLV9VSV9HUkFQSF9VTktOT1dOX09CSkVDVCAgICAgICA9IFVua25vd24gb2JqZWN0Ci1fVUlfR1JBUEhfWFNEU0NIRU1BX05PX05BTUVTUEFDRSA9IChubyB0YXJnZXQgbmFtZXNwYWNlIHNwZWNpZmllZCkKLV9VSV9HUkFQSF9YU0RTQ0hFTUEgICAgICAgICAgICA9IFNjaGVtYQotX1VJX01FTlVfWFNEX0VESVRPUiAgICAgICAgICAgICAgICAgPSAmWFNECi1fVUlfTEFCRUxfU0VUX1RZUEUJCQkJICAgID0gU2V0IFR5cGUKLQotIQotISBQcmVmZXJlbmNlIFBhZ2UKLSEKLV9VSV9URVhUX0lOREVOVF9MQUJFTCAgICAgICAgICAgICAgICAgPSBJbmRlbnRhdGlvbgotX1VJX1RFWFRfSU5ERU5UX1NQQUNFU19MQUJFTCAgICAgICAgICA9ICZOdW1iZXIgb2Ygc3BhY2VzOiAKLV9VSV9URVhUX1hTRF9OQU1FU1BBQ0VfUFJFRklYICAgICAgICAgPSBYTUwgc2NoZW1hIGxhbmd1YWdlCi1fVUlfU1RSVUNUVVJFRF9URVhUX0VESVRPUl9QUkVGU19MSU5LID0gTm90ZSB0aGF0IHNvbWUgcHJlZmVyZW5jZXMgbWF5IGJlIHNldCBvbiB0aGUgPGE+ezB9PC9hPiBwcmVmZXJlbmNlIHBhZ2UuCi1fVUlfVEVYVF9YU0RfREVGQVVMVF9QUkVGSVggICAgICAgICAgID0gWE1MIHNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzICZwcmVmaXg6Ci1fVUlfUVVBTElGWV9YU0QgICAgICAgICAgICAgICAgICAgICAgID0gJlF1YWxpZnkgWE1MIHNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzCi1fVUlfVEVYVF9YU0RfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFID0gRGVmYXVsdCBUYXJnZXQgTmFtZXNwYWNlOgotX1VJX1ZBTElEQVRJTkdfRklMRVMgICAgICAgICAgICAgICAgICA9IFZhbGlkYXRpbmcgZmlsZXMKLV9VSV9URVhUX0hPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUyAgPSBIb25vdXIgYWxsIHNjaGVtYSBsb2NhdGlvbnMKLV9VSV9GVUxMX0NPTkZPUk1BTkNFICAgICAgICAgICAgICAgICAgPSBDaGVjayBmdWxsIFhNTCBTY2hlbWEgY29uZm9ybWFuY2UgCi0KLV9FUlJPUl9MQUJFTF9JTlZBTElEX1BSRUZJWCAgICAgPSBJV0FYMTAwNEUgSW52YWxpZCBwcmVmaXguIEEgcHJlZml4IG11c3Qgbm90IGJlIGVtcHR5IG9yIGNvbnRhaW4gYW55IHNwYWNlLgotCi1fVUlfTk9fVFlQRV9ERUZJTkVEPShubyB0eXBlIGRlZmluZWQpCi1fVUlfQUNUSU9OX1VQREFURV9OQU1FPVVwZGF0ZSBOYW1lCi1fVUlfQUNUSU9OX1VQREFURV9FTEVNRU5UX1JFRkVSRU5DRT1VcGRhdGUgRWxlbWVudCByZWZlcmVuY2UKLV9VSV9BQ1RJT05fVVBEQVRFX0FUVFJJQlVURV9SRUZFUkVOQ0U9VXBkYXRlIEF0dHJpYnV0ZSByZWZlcmVuY2UKLV9VSV9BQ1RJT05fQUREX0ZJRUxEPUFkZCBGaWVsZAotX1VJX0FDVElPTl9BRERfRUxFTUVOVD1BZGQgRWxlbWVudAotX1VJX0FDVElPTl9BRERfSU5DTFVERT1BZGQgSW5jbHVkZQotX1VJX0FDVElPTl9BRERfSU1QT1JUPUFkZCBJbXBvcnQKLV9VSV9BQ1RJT05fQUREX1JFREVGSU5FPUFkZCBSZWRlZmluZQotX1VJX0FDVElPTl9BRERfRUxFTUVOVF9SRUY9QWRkIEVsZW1lbnQgUmVmCi1fVUlfQUNUSU9OX0FERF9DT01QTEVYX1RZUEU9QWRkIENvbXBsZXggVHlwZQotX1VJX0FDVElPTl9BRERfU0lNUExFX1RZUEU9QWRkIFNpbXBsZSBUeXBlCi1fVUlfQUNUSU9OX1NFVF9UWVBFPVNldCBUeXBlCi1fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEU9QWRkIEF0dHJpYnV0ZQotX1VJX0FDVElPTl9BRERfQVRUUklCVVRFX1JFRj1BZGQgQXR0cmlidXRlIFJlZgotX1VJX0FDVElPTl9ORVc9TmV3Li4uCi1fVUlfQUNUSU9OX0JST1dTRT1Ccm93c2UuLi4KLQotX1VJX0xBQkVMX09QVElPTkFMPU9wdGlvbmFsCi1fVUlfTEFCRUxfWkVST19PUl9NT1JFPVplcm8gb3IgbW9yZQotX1VJX0xBQkVMX09ORV9PUl9NT1JFPU9uZSBvciBtb3JlCi1fVUlfTEFCRUxfTE9DQUxfVFlQRT1sb2NhbCB0eXBlCi1fVUlfTEFCRUxfUkVRVUlSRUQ9UmVxdWlyZWQKLV9VSV9MQUJFTF9BUlJBWT1hcnJheQotCi1fVUlfTEFCRUxfU0VUX0NPTU1PTl9CVUlMVF9JTl9UWVBFUz1TZXQgY29tbW9uIEJ1aWx0LUluIHR5cGVzCi1fVUlfTEFCRUxfU0VMRUNUX1RZUEVTX0ZJTFRFUl9PVVQ9U2VsZWN0IHRoZSB0eXBlcyB0aGF0IHlvdSBkbyBub3Qgd2FudCB0byBmaWx0ZXIgb3V0OiAKLV9VSV9MQUJFTF9OQU1FX1NFQVJDSF9GSUxURVJfVEVYVD1OYW1lICg/ID0gYW55IGNoYXJhY3RlciwgKiA9IGFueSBzdHJpbmcpOgotX1VJX0xBQkVMX1NFVF9FTEVNRU5UX1JFRkVSRU5DRT1TZXQgZWxlbWVudCByZWZlcmVuY2UKLV9VSV9MQUJFTF9TRVRfQVRUUklCVVRFX1JFRkVSRU5DRT1TZXQgYXR0cmlidXRlIHJlZmVyZW5jZQotCi1fVUlfTEFCRUxfTkVXX1RZUEU9TmV3IFR5cGUKLV9VSV9WQUxVRV9ORVdfVFlQRT17MH1UeXBlCi1fVUlfTEFCRUxfTkVXX0VMRU1FTlQ9TmV3IEVsZW1lbnQKLV9VSV9MQUJFTF9ORVdfQVRUUklCVVRFPU5ldyBBdHRyaWJ1dGUKLV9VSV9MQUJFTF9DT01QTEVYX1RZUEU9Q29tcGxleCBUeXBlCi1fVUlfTEFCRUxfVEFSR0VUX05BTUVTUEFDRT1UYXJnZXQgTmFtZXNwYWNlOiAKLV9VSV9MQUJFTF9OT19OQU1FU1BBQ0U9Tm8gTmFtZXNwYWNlCi1fVUlfTEFCRUxfRUxFTUVOVFNfQ09MT049RWxlbWVudHM6Ci1fVUlfTEFCRUxfQVRUUklCVVRFU19DT0xPTj1BdHRyaWJ1dGVzOgotX1VJX0xBQkVMX1NJTVBMRV9UWVBFPVNpbXBsZSBUeXBlCi1fVUlfTEFCRUxfVFlQRVNfQ09MT049VHlwZXM6Ci0KLV9VSV9MQUJFTF9TT1VSQ0U9U291cmNlCi0KLV9VSV9MQUJFTF9FTEVNRU5URk9STURFRkFVTFQ9UHJlZml4IHF1YWxpZmljYXRpb24gb2YgbG9jYWwgZWxlbWVudHM6Ci1fVUlfTEFCRUxfQVRUUklCVVRFRk9STURFRkFVTFQ9UHJlZml4IHF1YWxpZmljYXRpb24gb2YgYXR0cmlidXRlczoKLV9VSV9MQUJFTF9DUkVBVEVfQU5PTl9UWVBFPUNyZWF0ZSBhcyBsb2NhbCBhbm9ueW1vdXMgdHlwZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9JWFNEVHlwZXNGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvSVhTRFR5cGVzRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlM2M2MmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9JWFNEVHlwZXNGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5zZWFyY2g7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVhTRFR5cGVzRmlsdGVyIHsJCi0JLyoqCi0JICogR2l2ZSBtZSBhbiBPYmplY3QgbywgaWYgSSBrbm93IGl0IGFuZCBpdCBzaG91bGQgYmUgZmlsdGVyZWQgb3V0LCBJIHdpbGwgCi0JICogcmV0dXJuIHRydWUuIE90aGVyd2lzZSBJJ2xsIHJldHVybiBmYWxzZSwgZXZlbiBpZiBJIGRvbid0IGtub3cgdGhlIG9iamVjdCAKLQkgKiBAcGFyYW0gbwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRGaWx0ZXJPdXQoT2JqZWN0IG8pOwotCQotCXB1YmxpYyB2b2lkIHR1cm5PbigpOwotCXB1YmxpYyB2b2lkIHR1cm5PZmYoKTsKLQlwdWJsaWMgYm9vbGVhbiBpc09uKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL1hTREF0dHJpYnV0ZVNlYXJjaExpc3RQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RBdHRyaWJ1dGVTZWFyY2hMaXN0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0ZmExMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL1hTREF0dHJpYnV0ZVNlYXJjaExpc3RQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLklDb21wb25lbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLklYU0RTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFhTREF0dHJpYnV0ZVNlYXJjaExpc3RQcm92aWRlciBleHRlbmRzIFhTRFNlYXJjaExpc3RQcm92aWRlcgotewotCi0gIHB1YmxpYyBYU0RBdHRyaWJ1dGVTZWFyY2hMaXN0UHJvdmlkZXIoSUZpbGUgY3VycmVudEZpbGUsIFhTRFNjaGVtYVtdIHNjaGVtYXMpCi0gIHsKLSAgICBzdXBlcihjdXJyZW50RmlsZSwgc2NoZW1hcyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUNvbXBvbmVudExpc3QoSUNvbXBvbmVudExpc3QgbGlzdCwgU2VhcmNoU2NvcGUgc2NvcGUsIElQcm9ncmVzc01vbml0b3IgcG0pCi0gIHsKLSAgICAvLyBub3cgd2UgdHJhdmVyc2UgdGhlIHR5cGVzIGFscmVhZHkgZGVmaW5lZCB3aXRoaW4gdGhlIHZpc2libGUgc2NoZW1hcwotICAgIC8vIHdlIGRvIHRoaXMgaW4gYWRkaXRpb24gdG8gdGhlIGNvbXBvbmVudCBzZWFyY2ggc2luY2UgdGhpcyBzaG91bGQgZXhlY3V0ZQotICAgIC8vIHZlcnkgcXVpY2tseSBhbmQgdGhlcmUncyBhIGdvb2QgY2hhbmNlIHRoZSB1c2VyIHdhbnRzIHRvIHNlbGVjdCBhIHRpbWUgdGhhdCdzIAotICAgIC8vIGFscmVhZHkgaW1wb3J0ZWQvaW5jbHVkZWQKLSAgICAvLyBUT0RPIChjcykgZW5zdXJlIHdlIGRvbid0IGFkZCBkdXBsaWNhdGVzIHdoZW4gd2UgcHJvY2VlZCB0byB1c2UgdGhlIHNlYXJjaCBsaXN0Ci0gICAgLy8KLSAgICBMaXN0IHZpc2l0ZWRTY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gc2NoZW1hc1tpXTsKLSAgICAgIENvbXBvbmVudENvbGxlY3RpbmdYU0RWaXNpdG9yIHZpc2l0b3IgPSBuZXcgQ29tcG9uZW50Q29sbGVjdGluZ1hTRFZpc2l0b3IobGlzdCwgSVhTRFNlYXJjaENvbnN0YW50cy5BVFRSSUJVVEVfTUVUQV9OQU1FKTsKLSAgICAgIHZpc2l0b3IudmlzaXRTY2hlbWEoc2NoZW1hLCB0cnVlKTsKLSAgICAgIHZpc2l0ZWRTY2hlbWFzLmFkZEFsbCh2aXNpdG9yLmdldFZpc2l0ZWRTY2hlbWFzKCkpOwotICAgIH0KLSAgICAvLyBmaW5hbGx5IHdlIGNhbGwgdGhlIHNlYXJjaCBBUEkncyB0byBkbyBhIHBvdGVudGlhbGx5IHNsb3cgc2VhcmNoCi0gICAgaWYgKHNjb3BlICE9IG51bGwpCi0gICAgewotICAgICAgcG9wdWxhdGVDb21wb25lbnRMaXN0VXNpbmdTZWFyY2gobGlzdCwgc2NvcGUsIHBtLCBjcmVhdGVGaWxlTWFwKHZpc2l0ZWRTY2hlbWFzKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29tcG9uZW50TGlzdFVzaW5nU2VhcmNoKElDb21wb25lbnRMaXN0IGxpc3QsIFNlYXJjaFNjb3BlIHNjb3BlLCBJUHJvZ3Jlc3NNb25pdG9yIHBtLCBIYXNoTWFwIGZpbGVzKQotICB7Ci0gICAgU2VhcmNoRW5naW5lIHNlYXJjaEVuZ2luZSA9IG5ldyBTZWFyY2hFbmdpbmUoKTsKLSAgICBJbnRlcm5hbFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgSW50ZXJuYWxTZWFyY2hSZXF1ZXN0b3IobGlzdCwgZmlsZXMpOwotICAgIGZpbmRNYXRjaGVzKHNlYXJjaEVuZ2luZSwgcmVxdWVzdG9yLCBzY29wZSwgSVhTRFNlYXJjaENvbnN0YW50cy5BVFRSSUJVVEVfTUVUQV9OQU1FKTsKLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNEQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlY2QzMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5JQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guSVhTRFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBYU0RDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyCi17Ci0gIHB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZShPYmplY3QgY29tcG9uZW50KQotICB7Ci0gICAgLy8gVE9ETyAoY3MpIGlmIHRoaXMgcHJvdmlkZXIgaXMgdXNlZCBpbiBhIG11bHRpIGxhbmd1YWdlIGNvbnRleHQKLSAgICAvLyB3ZSdsbCBuZWVkIHRvIHByb3ZpZGUgc29tZSBsb2dpYyBoZXJlCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZSBTSU1QTEVfVFlQRV9JTUFHRSA9ICBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRFNpbXBsZVR5cGUuZ2lmIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlIENPTVBMRVhfVFlQRV9JTUFHRSA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEQ29tcGxleFR5cGUuZ2lmIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlIEVMRU1FTlRfSU1BR0UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREVsZW1lbnQuZ2lmIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlIEFUVFJJQlVURV9JTUFHRSA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEQXR0cmlidXRlLmdpZiIpOwotICAvL3ByaXZhdGUgZmluYWwgc3RhdGljIEltYWdlIEJVSUxUX0lOX1RZUEUpSU1BR0UgPSAKLSAgICAKLSAgcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZXIoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBDb21wb25lbnRTcGVjaWZpY2F0aW9uKQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICgoQ29tcG9uZW50U3BlY2lmaWNhdGlvbiljb21wb25lbnQpLmdldFF1YWxpZmllcigpOwotICAgIH0gIAotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICgoWFNETmFtZWRDb21wb25lbnQpY29tcG9uZW50KS5nZXRUYXJnZXROYW1lc3BhY2UoKTsgCi0gICAgfSAgCi0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgU2VhcmNoTWF0Y2gpCi0gICAgewotICAgICAgUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gZ2V0UXVhbGlmaWVkTmFtZUZvclNlYXJjaE1hdGNoKChTZWFyY2hNYXRjaCljb21wb25lbnQpOwotICAgICAgaWYgKHF1YWxpZmllZE5hbWUgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICByZXN1bHQgPSBxdWFsaWZpZWROYW1lLmdldE5hbWVzcGFjZSgpOwotICAgICAgfSAgICAKLSAgICB9ICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICAvLyBUT0RPLi4uIHRoaXMgd2lsbCBiZSBtdWNoIGVhc2llciB3aXRoIEhpcm9zaGkncyBwcm9wb3NlZCBTZWFyY2hNYXRjaCBjaGFuZ2VzCi0gIC8vCi0gIHByaXZhdGUgUXVhbGlmaWVkTmFtZSBnZXRRdWFsaWZpZWROYW1lRm9yU2VhcmNoTWF0Y2goU2VhcmNoTWF0Y2ggbWF0Y2gpCi0gIHsKLSAgICBRdWFsaWZpZWROYW1lIHF1YWxpZmllZE5hbWUgPSBudWxsOwotICAgIE9iamVjdCBvID0gbWF0Y2gubWFwLmdldCgibmFtZSIpOwotICAgIGlmIChvICE9IG51bGwgJiYgbyBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWUpCi0gICAgeyAgCi0gICAgICBxdWFsaWZpZWROYW1lID0gKFF1YWxpZmllZE5hbWUpbzsKLSAgICB9ICAgICAgCi0gICAgcmV0dXJuIHF1YWxpZmllZE5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBDb21wb25lbnRTcGVjaWZpY2F0aW9uKQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICgoQ29tcG9uZW50U3BlY2lmaWNhdGlvbiljb21wb25lbnQpLmdldE5hbWUoKTsKLSAgICB9ICAKLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKFhTRE5hbWVkQ29tcG9uZW50KWNvbXBvbmVudCkuZ2V0TmFtZSgpOyAKLSAgICB9ICAKLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBTZWFyY2hNYXRjaCkKLSAgICB7Ci0gICAgICBRdWFsaWZpZWROYW1lIHF1YWxpZmllZE5hbWUgPSBnZXRRdWFsaWZpZWROYW1lRm9yU2VhcmNoTWF0Y2goKFNlYXJjaE1hdGNoKWNvbXBvbmVudCk7Ci0gICAgICBpZiAocXVhbGlmaWVkTmFtZSAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIHJlc3VsdCA9IHF1YWxpZmllZE5hbWUuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICB9ICAgIAotICAgIH0gICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIElGaWxlIGdldEZpbGUoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIElGaWxlIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIENvbXBvbmVudFNwZWNpZmljYXRpb24pCi0gICAgewotICAgICAgcmVzdWx0ID0gKChDb21wb25lbnRTcGVjaWZpY2F0aW9uKWNvbXBvbmVudCkuZ2V0RmlsZSgpOwotICAgIH0gIAotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFNlYXJjaE1hdGNoKQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICgoU2VhcmNoTWF0Y2gpY29tcG9uZW50KS5nZXRGaWxlKCk7Ci0gICAgfSAgCi0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgewotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpY29tcG9uZW50OwotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IGNvbmNyZXRlQ29tcG9uZW50LmdldFNjaGVtYSgpOwotICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBUT0RPIChjcykgcmV2aXNpdCBhbmQgdGVzdCBtb3JlCi0gICAgICAgIC8vCi0gICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IHNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgICAgICBTdHJpbmcgcGxhdGZvcm1SZXNvdXJjZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2UiOwotICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCAmJiBsb2NhdGlvbi5zdGFydHNXaXRoKHBsYXRmb3JtUmVzb3VyY2UpKQotICAgICAgICB7Ci0gICAgICAgICAgUGF0aCBwYXRoID0gbmV3IFBhdGgobG9jYXRpb24uc3Vic3RyaW5nKHBsYXRmb3JtUmVzb3VyY2UubGVuZ3RoKCkpKTsKLSAgICAgICAgICByZXN1bHQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0gICAgICAgIH0gIAotICAgICAgfSAgCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpCi0gIHsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9ICIiOwotICAgIFN0cmluZyBuYW1lID0gZ2V0TmFtZShlbGVtZW50KTsKLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCArPSBuYW1lOwotICAgICAgLyoKLSAgICAgIFN0cmluZyBxdWFsaWZpZXIgPSBnZXRRdWFsaWZpZXIoZWxlbWVudCk7Ci0gICAgICBpZiAocXVhbGlmaWVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCArPSAiIC0gIiArIHF1YWxpZmllcjsKLSAgICAgIH0gIAotICAgICAgSUZpbGUgZmlsZSA9IGdldEZpbGUoZWxlbWVudCk7Ci0gICAgICBpZiAoZmlsZSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgKz0gIiAgKCIgKyBmaWxlLmdldFByb2plY3QoKS5nZXROYW1lKCkgKyAiKSI7Ci0gICAgICB9Ki8gCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gCi0gIAotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIEltYWdlIHJlc3VsdCA9IG51bGw7IAotICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBTZWFyY2hNYXRjaCkKLSAgICB7Ci0gICAgICBTZWFyY2hNYXRjaCBzZWFyY2hNYXRjaCA9IChTZWFyY2hNYXRjaCljb21wb25lbnQ7Ci0gICAgICBRdWFsaWZpZWROYW1lIHF1YWxpZmllZE5hbWUgPSAoUXVhbGlmaWVkTmFtZSlzZWFyY2hNYXRjaC5tYXAuZ2V0KCJtZXRhTmFtZSIpOwotICAgICAgaWYgKCBxdWFsaWZpZWROYW1lICE9IG51bGwgKXsKLSAgICAJICBpZiAoIHF1YWxpZmllZE5hbWUuZXF1YWxzKElYU0RTZWFyY2hDb25zdGFudHMuU0lNUExFX1RZUEVfTUVUQV9OQU1FKSkKLSAgICAJCSAgcmVzdWx0ID0gU0lNUExFX1RZUEVfSU1BR0U7Ci0gICAgCSAgZWxzZSBpZiAoIHF1YWxpZmllZE5hbWUuZXF1YWxzKElYU0RTZWFyY2hDb25zdGFudHMuQ09NUExFWF9UWVBFX01FVEFfTkFNRSkpCi0gICAgCQkgIHJlc3VsdCA9IENPTVBMRVhfVFlQRV9JTUFHRTsKLSAgICAJICBlbHNlIGlmICggcXVhbGlmaWVkTmFtZS5lcXVhbHMoSVhTRFNlYXJjaENvbnN0YW50cy5FTEVNRU5UX01FVEFfTkFNRSkpCi0gICAgCQkgIHJlc3VsdCA9IEVMRU1FTlRfSU1BR0U7Ci0gICAgCSAgZWxzZSBpZiAoIHF1YWxpZmllZE5hbWUuZXF1YWxzKElYU0RTZWFyY2hDb25zdGFudHMuQVRUUklCVVRFX01FVEFfTkFNRSkpCi0gICAgCSAgICByZXN1bHQgPSBBVFRSSUJVVEVfSU1BR0U7Ci0gICAgICB9Ci0gICAgfSAgICAgIAotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHJlc3VsdCA9IENPTVBMRVhfVFlQRV9JTUFHRTsgICAgICAKLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHJlc3VsdCA9IFNJTVBMRV9UWVBFX0lNQUdFOwotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHJlc3VsdCA9IEVMRU1FTlRfSU1BR0U7Ci0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICByZXN1bHQgPSBBVFRSSUJVVEVfSU1BR0U7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBJbWFnZSBnZXRGaWxlSWNvbihPYmplY3QgY29tcG9uZW50KSB7Ci0JcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNERmlsZS5naWYiKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RFbGVtZW50c1NlYXJjaExpc3RQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RFbGVtZW50c1NlYXJjaExpc3RQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTQwNDJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNERWxlbWVudHNTZWFyY2hMaXN0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLklDb21wb25lbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLklYU0RTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFhTREVsZW1lbnRzU2VhcmNoTGlzdFByb3ZpZGVyIGV4dGVuZHMgWFNEU2VhcmNoTGlzdFByb3ZpZGVyCi17Ci0gIHB1YmxpYyBYU0RFbGVtZW50c1NlYXJjaExpc3RQcm92aWRlcihJRmlsZSBjdXJyZW50RmlsZSwgWFNEU2NoZW1hW10gc2NoZW1hcykKLSAgewotICAgIHN1cGVyKGN1cnJlbnRGaWxlLCBzY2hlbWFzKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBvcHVsYXRlQ29tcG9uZW50TGlzdChJQ29tcG9uZW50TGlzdCBsaXN0LCBTZWFyY2hTY29wZSBzY29wZSwgSVByb2dyZXNzTW9uaXRvciBwbSkKLSAgewotICAgIC8vIG5vdyB3ZSB0cmF2ZXJzZSB0aGUgdHlwZXMgYWxyZWFkeSBkZWZpbmVkIHdpdGhpbiB0aGUgdmlzaWJsZSBzY2hlbWFzCi0gICAgLy8gd2UgZG8gdGhpcyBpbiBhZGRpdGlvbiB0byB0aGUgY29tcG9uZW50IHNlYXJjaCBzaW5jZSB0aGlzIHNob3VsZCBleGVjdXRlCi0gICAgLy8gdmVyeSBxdWlja2x5IGFuZCB0aGVyZSdzIGEgZ29vZCBjaGFuY2UgdGhlIHVzZXIgd2FudHMgdG8gc2VsZWN0IGEgdGltZSB0aGF0J3MgCi0gICAgLy8gYWxyZWFkeSBpbXBvcnRlZC9pbmNsdWRlZAotICAgIC8vIFRPRE8gKGNzKSBlbnN1cmUgd2UgZG9uJ3QgYWRkIGR1cGxpY2F0ZXMgd2hlbiB3ZSBwcm9jZWVkIHRvIHVzZSB0aGUgc2VhcmNoIGxpc3QKLSAgICAvLwotICAgIExpc3QgdmlzaXRlZFNjaGVtYXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBzY2hlbWFzW2ldOwotICAgICAgQ29tcG9uZW50Q29sbGVjdGluZ1hTRFZpc2l0b3IgdmlzaXRvciA9IG5ldyBDb21wb25lbnRDb2xsZWN0aW5nWFNEVmlzaXRvcihsaXN0LCBJWFNEU2VhcmNoQ29uc3RhbnRzLkVMRU1FTlRfTUVUQV9OQU1FKTsKLSAgICAgIHZpc2l0b3IudmlzaXRTY2hlbWEoc2NoZW1hLCB0cnVlKTsKLSAgICAgIHZpc2l0ZWRTY2hlbWFzLmFkZEFsbCh2aXNpdG9yLmdldFZpc2l0ZWRTY2hlbWFzKCkpOwotICAgIH0KLSAgICAvLyBmaW5hbGx5IHdlIGNhbGwgdGhlIHNlYXJjaCBBUEkncyB0byBkbyBhIHBvdGVudGlhbGx5IHNsb3cgc2VhcmNoCi0gICAgaWYgKHNjb3BlICE9IG51bGwpCi0gICAgewotICAgICAgcG9wdWxhdGVDb21wb25lbnRMaXN0VXNpbmdTZWFyY2gobGlzdCwgc2NvcGUsIHBtLCBjcmVhdGVGaWxlTWFwKHZpc2l0ZWRTY2hlbWFzKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29tcG9uZW50TGlzdFVzaW5nU2VhcmNoKElDb21wb25lbnRMaXN0IGxpc3QsIFNlYXJjaFNjb3BlIHNjb3BlLCBJUHJvZ3Jlc3NNb25pdG9yIHBtLCBIYXNoTWFwIGZpbGVzKQotICB7Ci0gICAgU2VhcmNoRW5naW5lIHNlYXJjaEVuZ2luZSA9IG5ldyBTZWFyY2hFbmdpbmUoKTsKLSAgICBJbnRlcm5hbFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgSW50ZXJuYWxTZWFyY2hSZXF1ZXN0b3IobGlzdCwgZmlsZXMpOwotICAgIGZpbmRNYXRjaGVzKHNlYXJjaEVuZ2luZSwgcmVxdWVzdG9yLCBzY29wZSwgSVhTRFNlYXJjaENvbnN0YW50cy5FTEVNRU5UX01FVEFfTkFNRSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL1hTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjYyZGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTZWFyY2hMaXN0RGlhbG9nQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5TY29wZWRDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUgaW1wbGVtZW50cyBJQ29tcG9uZW50RGlhbG9nCi17Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZSBUWVBFX01FVEFfTkFNRSA9IG5ldyBRdWFsaWZpZWROYW1lKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgInR5cGUiKTsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWUgRUxFTUVOVF9NRVRBX05BTUUgPSBuZXcgUXVhbGlmaWVkTmFtZShYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJlbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lIEFUVFJJQlVURV9NRVRBX05BTUUgPSBuZXcgUXVhbGlmaWVkTmFtZShYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJhdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotICAvLyBwcm90ZWN0ZWQgT2JqZWN0IHNldE9iamVjdDsKLSAgcHJvdGVjdGVkIENvbXBvbmVudFNwZWNpZmljYXRpb24gc2VsZWN0aW9uOwotICBwcm90ZWN0ZWQgSUZpbGUgY3VycmVudEZpbGU7Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWFbXSBzY2hlbWFzOwotICBwcm90ZWN0ZWQgUXVhbGlmaWVkTmFtZSBtZXRhTmFtZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0NvbXBsZXhUeXBlcyA9IHRydWU7Ci0KLSAgcHVibGljIFhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZShRdWFsaWZpZWROYW1lIG1ldGFOYW1lLCBJRmlsZSBjdXJyZW50RmlsZSwgWFNEU2NoZW1hW10gc2NoZW1hcykKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5tZXRhTmFtZSA9IG1ldGFOYW1lOwotICAgIHRoaXMuY3VycmVudEZpbGUgPSBjdXJyZW50RmlsZTsKLSAgICB0aGlzLnNjaGVtYXMgPSBzY2hlbWFzOwotICB9Ci0KLSAgcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0U2VsZWN0ZWRDb21wb25lbnQoKQotICB7Ci0gICAgcmV0dXJuIHNlbGVjdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiAgIAotICB9Ci0gIAotICAvKiogCi0gICAqIFdoZXRoZXIgdG8gc2hvdyBjb21wbGV4IHR5cGVzIGluIHRoZSBEaWFsb2cncyBMaXN0LCBoYXMgbm8gZWZmZWN0IGlmIHRoZQotICAgKiBkaWFsb2cgcG9wdWxhdGVzIGxpc3Qgb2YgZWxlbWVudHMgaW5zdGVhZCBvZiB0eXBlCi0gICAqIEBwYXJhbSB2YWx1ZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2hvd0NvbXBsZXhUeXBlcyhib29sZWFuIHZhbHVlKQotICB7Ci0gICAgc2hvd0NvbXBsZXhUeXBlcyA9IHZhbHVlOwotICB9Ci0gIAotICBwdWJsaWMgaW50IGNyZWF0ZUFuZE9wZW4oKQotICB7Ci0gICAgU2hlbGwgc2hlbGwgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0gICAgaW50IHJldHVyblZhbHVlID0gV2luZG93LkNBTkNFTDsKLSAgICBTY29wZWRDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nIGRpYWxvZyA9IG51bGw7Ci0gICAgCi0gICAgLy8gVE9ETyAoY3MpIGxvdCdzIG9mIGNvZGUgaXMgY29tbW9uIHRvIGJvdGggdGhlc2UgYmxvY2tzLiAgQ2FuIHdlIHJlLW9yZyBpdCBhIGJpdAotICAgIC8vIHNvIGl0J3MgZWFzaWVyIHRvIHNlZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGhvdyB3ZSBjb25maWcgZm9yIGFuIGVsZW1lbnQgdnMgdHlwZT8KLSAgICBpZiAoIG1ldGFOYW1lID09IEVMRU1FTlRfTUVUQV9OQU1FKQotICAgIHsKLSAgICAJWFNEQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBkZXNjcmlwdGlvblByb3ZpZGVyID0gbmV3IFhTRENvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIoKTsKLSAgICAJZmluYWwgWFNERWxlbWVudHNTZWFyY2hMaXN0UHJvdmlkZXIgc2VhcmNoTGlzdFByb3ZpZGVyID0gbmV3IFhTREVsZW1lbnRzU2VhcmNoTGlzdFByb3ZpZGVyKGN1cnJlbnRGaWxlLCBzY2hlbWFzKTsKLSAgICAJQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nQ29uZmlndXJhdGlvbigpOwotICAgIAkKLSAgICAgICAgY29uZmlndXJhdGlvbi5zZXREZXNjcmlwdGlvblByb3ZpZGVyKGRlc2NyaXB0aW9uUHJvdmlkZXIpOwotICAgICAgICBjb25maWd1cmF0aW9uLnNldFNlYXJjaExpc3RQcm92aWRlcihzZWFyY2hMaXN0UHJvdmlkZXIpOwotICAgICAgICBjb25maWd1cmF0aW9uLnNldEZpbHRlckxhYmVsVGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfTkFNRV9TRUFSQ0hfRklMVEVSX1RFWFQpOwotICAgICAgICBjb25maWd1cmF0aW9uLnNldExpc3RMYWJlbFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX0VMRU1FTlRTX0NPTE9OKTsKLS8vICAgICAgICBjb25maWd1cmF0aW9uLnNldE5ld0NvbXBvbmVudEhhbmRsZXIobmV3IE5ld0VsZW1lbnRCdXR0b25IYW5kbGVyKCkpOwotICAgICAgICAvL1RPRE8gZXh0ZXJuYWxpemUgc3RyaW5nCi0gICAgICAgIGRpYWxvZyA9IG5ldyBTY29wZWRDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nKHNoZWxsLCBNZXNzYWdlcy5fVUlfTEFCRUxfU0VUX0VMRU1FTlRfUkVGRVJFTkNFLCBjb25maWd1cmF0aW9uKTsgICAgIAotICAgIH0KLSAgICBlbHNlIGlmICggbWV0YU5hbWUgPT0gQVRUUklCVVRFX01FVEFfTkFNRSkKLSAgICB7Ci0gICAgICBYU0RDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyIGRlc2NyaXB0aW9uUHJvdmlkZXIgPSBuZXcgWFNEQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlcigpOwotICAgICAgZmluYWwgWFNEQXR0cmlidXRlU2VhcmNoTGlzdFByb3ZpZGVyIHNlYXJjaExpc3RQcm92aWRlciA9IG5ldyBYU0RBdHRyaWJ1dGVTZWFyY2hMaXN0UHJvdmlkZXIoY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICAgICAgQ29tcG9uZW50U2VhcmNoTGlzdERpYWxvZ0NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nQ29uZmlndXJhdGlvbigpOwotICAgICAgCi0gICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0RGVzY3JpcHRpb25Qcm92aWRlcihkZXNjcmlwdGlvblByb3ZpZGVyKTsKLSAgICAgICAgY29uZmlndXJhdGlvbi5zZXRTZWFyY2hMaXN0UHJvdmlkZXIoc2VhcmNoTGlzdFByb3ZpZGVyKTsKLSAgICAgICAgY29uZmlndXJhdGlvbi5zZXRGaWx0ZXJMYWJlbFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX05BTUVfU0VBUkNIX0ZJTFRFUl9URVhUKTsKLSAgICAgICAgY29uZmlndXJhdGlvbi5zZXRMaXN0TGFiZWxUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9BVFRSSUJVVEVTX0NPTE9OKTsKLSAgICAgICAgZGlhbG9nID0gbmV3IFNjb3BlZENvbXBvbmVudFNlYXJjaExpc3REaWFsb2coc2hlbGwsIE1lc3NhZ2VzLl9VSV9MQUJFTF9TRVRfQVRUUklCVVRFX1JFRkVSRU5DRSwgY29uZmlndXJhdGlvbik7ICAgICAKLSAgICB9Ci0gICAgZWxzZSBpZiAobWV0YU5hbWUgPT0gVFlQRV9NRVRBX05BTUUpCi0gICAgewotICAgICAgWFNEQ29tcG9uZW50RGVzY3JpcHRpb25Qcm92aWRlciBkZXNjcmlwdGlvblByb3ZpZGVyID0gbmV3IFhTRENvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIoKTsKLSAgICAgIGZpbmFsIFhTRFR5cGVzU2VhcmNoTGlzdFByb3ZpZGVyIHNlYXJjaExpc3RQcm92aWRlciA9IG5ldyBYU0RUeXBlc1NlYXJjaExpc3RQcm92aWRlcihjdXJyZW50RmlsZSwgc2NoZW1hcyk7Ci0gICAgICBpZiAoIXNob3dDb21wbGV4VHlwZXMpCi0gICAgICAgIHNlYXJjaExpc3RQcm92aWRlci5zaG93Q29tcGxleFR5cGVzKGZhbHNlKTsKLSAgICAgCi0gICAgICBDb21wb25lbnRTZWFyY2hMaXN0RGlhbG9nQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IENvbXBvbmVudFNlYXJjaExpc3REaWFsb2dDb25maWd1cmF0aW9uKCk7Ci0gICAgICBjb25maWd1cmF0aW9uLnNldERlc2NyaXB0aW9uUHJvdmlkZXIoZGVzY3JpcHRpb25Qcm92aWRlcik7Ci0gICAgICBjb25maWd1cmF0aW9uLnNldFNlYXJjaExpc3RQcm92aWRlcihzZWFyY2hMaXN0UHJvdmlkZXIpOwotLy8gICAgICBjb25maWd1cmF0aW9uLnNldE5ld0NvbXBvbmVudEhhbmRsZXIobmV3IE5ld1R5cGVCdXR0b25IYW5kbGVyKCkpOwotICAgICAgY29uZmlndXJhdGlvbi5zZXRGaWx0ZXJMYWJlbFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX05BTUVfU0VBUkNIX0ZJTFRFUl9URVhUKTsKLSAgICAgIGNvbmZpZ3VyYXRpb24uc2V0TGlzdExhYmVsVGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfVFlQRVNfQ09MT04pOwotICAgICAgZGlhbG9nID0gbmV3IFNjb3BlZENvbXBvbmVudFNlYXJjaExpc3REaWFsb2coc2hlbGwsIE1lc3NhZ2VzLl9VSV9MQUJFTF9TRVRfVFlQRSwgY29uZmlndXJhdGlvbik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgaWYgKGRpYWxvZyAhPSBudWxsKQotICAgIHsKLSAgICAgIGRpYWxvZy5zZXRDdXJyZW50UmVzb3VyY2UoY3VycmVudEZpbGUpOyAgICAgIAotICAgICAgZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgcmV0dXJuVmFsdWUgPSBkaWFsb2cub3BlbigpOwotICAgICAgaWYgKHJldHVyblZhbHVlID09IFdpbmRvdy5PSykKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uID0gZGlhbG9nLmdldFNlbGVjdGVkQ29tcG9uZW50KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgfQotCi0vLyAgcHJpdmF0ZSBJRWRpdG9yUGFydCBnZXRBY3RpdmVFZGl0b3IoKQotLy8gIHsKLS8vICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLS8vICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotLy8gICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0vLyAgICByZXR1cm4gZWRpdG9yUGFydDsKLS8vICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL1hTRFNlYXJjaExpc3RQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvZWRpdG9yL3NlYXJjaC9YU0RTZWFyY2hMaXN0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FmZTVhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL1hTRFNlYXJjaExpc3RQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLklDb21wb25lbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuSUNvbXBvbmVudFNlYXJjaExpc3RQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLlhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5JWFNEU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREluY2x1ZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYURpcmVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYU0RTZWFyY2hMaXN0UHJvdmlkZXIgaW1wbGVtZW50cyBJQ29tcG9uZW50U2VhcmNoTGlzdFByb3ZpZGVyCi17Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWFbXSBzY2hlbWFzOwotICBwcm90ZWN0ZWQgSUZpbGUgY3VycmVudEZpbGU7Ci0gIC8vIFRPRE8gKGNzKSByZW1vdmUgdGhlc2UgYW5kIHVzZSBwcm9wZXIgc2VhcmNoIHNjb3BlcyEKLSAgLy8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DTE9TSU5HX1BST0pFQ1RfU0NPUEUgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJUkVfV09SS1NQQUNFX1NDT1BFID0gMTsKLQotICBwdWJsaWMgWFNEU2VhcmNoTGlzdFByb3ZpZGVyKElGaWxlIGN1cnJlbnRGaWxlLCBYU0RTY2hlbWFbXSBzY2hlbWFzKQotICB7Ci0gICAgdGhpcy5zY2hlbWFzID0gc2NoZW1hczsKLSAgICB0aGlzLmN1cnJlbnRGaWxlID0gY3VycmVudEZpbGU7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVByb2plY3RbXSByZWZzID0gY3VycmVudEZpbGUuZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZWRQcm9qZWN0cygpOwotICAgICAgICAgICAgCi0gICAgICBmb3IgKGludCBpPTA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRlcCAiICsgcmVmc1tpXS5nZXROYW1lKCkpOwotICAgICAgfSAgCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0gCi0gICAgCi0gIH0KLSAgIAotICAKLSAgY2xhc3MgQ29tcG9uZW50Q29sbGVjdGluZ1hTRFZpc2l0b3IKLSAgewotICAgIHByb3RlY3RlZCBMaXN0IHZpc2l0ZWRTY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIElDb21wb25lbnRMaXN0IGxpc3Q7Ci0gICAgUXVhbGlmaWVkTmFtZSBzZWFyY2hLaW5kOwotICAgIAotICAgIENvbXBvbmVudENvbGxlY3RpbmdYU0RWaXNpdG9yKElDb21wb25lbnRMaXN0IGxpc3QsIFF1YWxpZmllZE5hbWUgc2VhcmNoS2luZCkKLSAgICB7Ci0gICAgICB0aGlzLmxpc3QgPSBsaXN0OwotICAgICAgdGhpcy5zZWFyY2hLaW5kID0gc2VhcmNoS2luZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFNjaGVtYShYU0RTY2hlbWEgc2NoZW1hLCBib29sZWFuIHZpc2l0SW1wb3J0ZWRTY2hlbWEpCi0gICAgewotICAgICAgdmlzaXRlZFNjaGVtYXMuYWRkKHNjaGVtYSk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGNvbnRlbnRzID0gc2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgY29udGVudHMuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hQ29udGVudCBjb250ZW50ID0gKFhTRFNjaGVtYUNvbnRlbnQpIGNvbnRlbnRzLm5leHQoKTsKLSAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmUpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWFEaXJlY3RpdmUgc2NoZW1hRGlyZWN0aXZlID0gKFhTRFNjaGVtYURpcmVjdGl2ZSkgY29udGVudDsKLSAgICAgICAgICBYU0RTY2hlbWEgZXh0U2NoZW1hID0gc2NoZW1hRGlyZWN0aXZlLmdldFJlc29sdmVkU2NoZW1hKCk7Ci0gICAgICAgICAgaWYgKGV4dFNjaGVtYSAhPSBudWxsICYmICF2aXNpdGVkU2NoZW1hcy5jb250YWlucyhleHRTY2hlbWEpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzY2hlbWFEaXJlY3RpdmUgaW5zdGFuY2VvZiBYU0RJbXBvcnQgJiYgdmlzaXRJbXBvcnRlZFNjaGVtYSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdmlzaXRTY2hlbWEoZXh0U2NoZW1hLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzY2hlbWFEaXJlY3RpdmUgaW5zdGFuY2VvZiBYU0RJbmNsdWRlIHx8IHNjaGVtYURpcmVjdGl2ZSBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgCXZpc2l0U2NoZW1hKGV4dFNjaGVtYSwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uICYmIHNlYXJjaEtpbmQgPT0gSVhTRFNlYXJjaENvbnN0YW50cy5FTEVNRU5UX01FVEFfTkFNRSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGNvbnRlbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiAmJiBzZWFyY2hLaW5kID09IElYU0RTZWFyY2hDb25zdGFudHMuQVRUUklCVVRFX01FVEFfTkFNRSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGNvbnRlbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiAmJiBzZWFyY2hLaW5kID09IElYU0RTZWFyY2hDb25zdGFudHMuU0lNUExFX1RZUEVfTUVUQV9OQU1FKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHdlIG9ubHkgd2FudCB0byBzaG93IHNpbXBsZSB0eXBlcwotICAgICAgICAgIGxpc3QuYWRkKGNvbnRlbnQpOyAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbiAmJiBzZWFyY2hLaW5kID09IElYU0RTZWFyY2hDb25zdGFudHMuVFlQRV9NRVRBX05BTUUpCi0gICAgICAgIHsgICAgIAotICAgICAgICAgIC8vIGluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIHNob3cgYWxsIHR5cGVzCi0gICAgICAgICAgbGlzdC5hZGQoY29udGVudCk7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldFZpc2l0ZWRTY2hlbWFzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gdmlzaXRlZFNjaGVtYXM7Ci0gICAgfQotICB9Ci0gICAKLSAgCi0gIGNsYXNzIEludGVybmFsU2VhcmNoUmVxdWVzdG9yIGV4dGVuZHMgU2VhcmNoUmVxdWVzdG9yCi0gIHsKLSAgICBJQ29tcG9uZW50TGlzdCBjb21wb25lbnRMaXN0OwotICAgIEhhc2hNYXAgZmlsZXM7Ci0KLSAgICBJbnRlcm5hbFNlYXJjaFJlcXVlc3RvcihJQ29tcG9uZW50TGlzdCBjb21wb25lbnRMaXN0LCBIYXNoTWFwIGZpbGVzKQotICAgIHsKLSAgICAgIHRoaXMuY29tcG9uZW50TGlzdCA9IGNvbXBvbmVudExpc3Q7Ci0gICAgICB0aGlzLmZpbGVzID0gZmlsZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWNjZXB0U2VhcmNoTWF0Y2goU2VhcmNoTWF0Y2ggbWF0Y2gpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgewotICAgICAgLy8gd2UgZmlsdGVyIG91dCB0aGUgbWF0Y2hlcyBmcm9tIHRoZSBjdXJyZW50IGZpbGUgc2luY2Ugd2UgYXNzdW1lIHRoZQotICAgICAgLy8gaW5mbyBkZXJpdmVkIGZyb20gb3VyIHNjaGVtYSBtb2RlbHMgaXMgbW9yZSB1cGRhdGUgdG8gZGF0ZQotICAgICAgLy8gKGluIHRoZSBldmVudCB0aGF0IHdlIGhhdmVuJ3Qgc2F2ZWQgb3VyIGxhdGVzdCBtb2RpZmljYXRpb25zKQotICAgICAgLy8KLSAgICAgIGlmIChmaWxlcy5nZXQobWF0Y2guZ2V0RmlsZSgpKSA9PSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIC8vIFRPRE8uLi4gdGhpcyB1Z2x5IHF1YWxpZmllZCBuYW1lIHN0YXNoaW5nIHdpbGwgZ28gYXdheSBzb29uCi0gICAgICAgIC8vCi0gICAgICAgIFF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IG51bGw7Ci0gICAgICAgIE9iamVjdCBvID0gbWF0Y2gubWFwLmdldCgibmFtZSIpOwotICAgICAgICBpZiAobyAhPSBudWxsICYmIG8gaW5zdGFuY2VvZiBRdWFsaWZpZWROYW1lKQotICAgICAgICB7ICAKLSAgICAgICAgICBxdWFsaWZpZWROYW1lID0gKFF1YWxpZmllZE5hbWUpbzsKLSAgICAgICAgfSAKLSAgICAgICAgaWYgKHF1YWxpZmllZE5hbWUgIT0gbnVsbCAmJiBxdWFsaWZpZWROYW1lLmdldExvY2FsTmFtZSgpICE9IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgIGNvbXBvbmVudExpc3QuYWRkKG1hdGNoKTsKLSAgICAgICAgfQotICAgICAgfSAgCi0gICAgfQotICB9ICAKLQotICBwcm90ZWN0ZWQgdm9pZCBmaW5kTWF0Y2hlcyhTZWFyY2hFbmdpbmUgc2VhcmNoRW5naW5lLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yLCBTZWFyY2hTY29wZSBzY29wZSwgUXVhbGlmaWVkTmFtZSBtZXRhTmFtZSkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybiBwYXR0ZXJuID0gbmV3IFhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybihuZXcgUXVhbGlmaWVkTmFtZSgiKiIsICIqIiksIG1ldGFOYW1lLCBTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSCk7Ci0gICAgICAvLyBUT0RPIChjcykgcmV2aXN0IHRoaXMuLi4gd2Ugc2hvdWxkbid0IGJlIG5lZWRpbmcgdG8gaGFyZC1jb2RlIHBhcnRpcGFudCBpZCdzCi0gICAgICAvLyBBbGwgd2UncmUgcmVhbGx5IGRvaW5nIGhlcmUgaXMgdHJ5aW5nIHRvIGF2b2lkIGZpbmRpbmcgbWF0Y2hlcyBpbgotICAgICAgLy8gd3NkbCdzIHNpbmNlIHdlIGRvbid0ICBldmVyIHdhbnQgdG8gaW1wb3J0L2luY2x1ZGUgYSB3c2RsIGZyb20gYSBzY2hlbWEhIAotICAgICAgLy8gTWF5YmUgd2Ugc2hvdWxkIGp1c3Qgc2NvcGUgb3V0IGFueSBmaWxlIHR5cGVzIHRoYXQgYXJlbid0IHhzZCdzIHVzaW5nIGEgCi0gICAgICAvLyBjdXN0b20gU2VhcmNoU2NvcGU/Ci0gICAgICAvLwotICAgICAgU2VhcmNoUGFydGljaXBhbnQgcGFydGljcGFudCA9IFNlYXJjaFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2VhcmNoUGFydGljaXBhbnQoIm9yZy5lY2xpcHNlLndzdC54c2Quc2VhcmNoLlhTRFNlYXJjaFBhcnRpY2lwYW50Iik7Ci0gICAgICBBc3NlcnQuaXNOb3ROdWxsKHBhcnRpY3BhbnQpOwotICAgICAgU2VhcmNoUGFydGljaXBhbnRbXSBwYXJ0aWNpcGFudHMgPSB7cGFydGljcGFudH07Ci0gICAgICBzZWFyY2hFbmdpbmUuc2VhcmNoKHBhdHRlcm4sIHJlcXVlc3RvciwgcGFydGljaXBhbnRzLCBzY29wZSwgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgfQotICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIAotICBwcm90ZWN0ZWQgSGFzaE1hcCBjcmVhdGVGaWxlTWFwKExpc3QgdmlzaXRlZFNjaGVtYXMpCi0gIHsKLSAgICBIYXNoTWFwIGZpbGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHZpc2l0ZWRTY2hlbWFzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgWFNEU2NoZW1hIHRoZVNjaGVtYSA9IChYU0RTY2hlbWEpaS5uZXh0KCk7Ci0gICAgICBTdHJpbmcgbG9jYXRpb24gPSB0aGVTY2hlbWEuZ2V0U2NoZW1hTG9jYXRpb24oKTsgICAgICAgCi0gICAgICBJRmlsZSBmaWxlID0gY29tcHV0ZUZpbGUobG9jYXRpb24pOwotICAgICAgaWYgKGZpbGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZmlsZU1hcC5wdXQoZmlsZSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgIH0gICAgICAgCi0gICAgfSAgIAotICAgIHJldHVybiBmaWxlTWFwOwotICB9Ci0gIAotICBwcml2YXRlIElGaWxlIGNvbXB1dGVGaWxlKFN0cmluZyBiYXNlTG9jYXRpb24pCi0gIHsKLSAgICBJRmlsZSBmaWxlID0gbnVsbDsKLSAgICBpZiAoYmFzZUxvY2F0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGZpbGVTY2hlbWUgPSAiZmlsZToiOyAvLyROT04tTkxTLTEkCi0gICAgICBTdHJpbmcgcGxhdGZvcm1SZXNvdXJjZVNjaGVtZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2UiOwotICAgICAgaWYgKGJhc2VMb2NhdGlvbi5zdGFydHNXaXRoKGZpbGVTY2hlbWUpKQotICAgICAgewotICAgICAgICBiYXNlTG9jYXRpb24gPSBiYXNlTG9jYXRpb24uc3Vic3RyaW5nKGZpbGVTY2hlbWUubGVuZ3RoKCkpOwotICAgICAgICBiYXNlTG9jYXRpb24gPSByZW1vdmVMZWFkaW5nKGJhc2VMb2NhdGlvbiwgIi8iKTsKLSAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKGJhc2VMb2NhdGlvbik7Ci0gICAgICAgIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGJhc2VMb2NhdGlvbi5zdGFydHNXaXRoKHBsYXRmb3JtUmVzb3VyY2VTY2hlbWUpKQotICAgICAgewotICAgICAgICBiYXNlTG9jYXRpb24gPSBiYXNlTG9jYXRpb24uc3Vic3RyaW5nKHBsYXRmb3JtUmVzb3VyY2VTY2hlbWUubGVuZ3RoKCkpOwotICAgICAgICBiYXNlTG9jYXRpb24gPSByZW1vdmVMZWFkaW5nKGJhc2VMb2NhdGlvbiwgIi8iKTsKLSAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKGJhc2VMb2NhdGlvbik7Ci0gICAgICAgIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0gICAgICB9ICAgIAotICAgIH0KLSAgICByZXR1cm4gZmlsZTsgICAgCi0gIH0gIAotICAKLSAgcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlTGVhZGluZyhTdHJpbmcgcGF0aCwgU3RyaW5nIHBhdHRlcm4pCi0gIHsKLSAgICB3aGlsZSAocGF0aC5zdGFydHNXaXRoKHBhdHRlcm4pKQotICAgIHsKLSAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyhwYXR0ZXJuLmxlbmd0aCgpKTsKLSAgICB9ICAKLSAgICByZXR1cm4gcGF0aDsKLSAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNEVHlwZXNTZWFyY2hMaXN0UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2VkaXRvci9zZWFyY2gvWFNEVHlwZXNTZWFyY2hMaXN0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4MGZhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9lZGl0b3Ivc2VhcmNoL1hTRFR5cGVzU2VhcmNoTGlzdFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLnNlYXJjaDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuSUNvbXBvbmVudExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guSVhTRFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RTY2hlbWFJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLXB1YmxpYyBjbGFzcyBYU0RUeXBlc1NlYXJjaExpc3RQcm92aWRlciBleHRlbmRzIFhTRFNlYXJjaExpc3RQcm92aWRlcgotewotICBwcm90ZWN0ZWQgSVhTRFR5cGVzRmlsdGVyIGJ1aWx0SW5GaWx0ZXI7Ci0gIC8qKgotICAgKiBEZXRlcm1pbmVzIGlmIHdlIHNob3VsZCB1c2UgdGhlIGZpbHRlciBUaGlzIHVzIHVzZWQgdG8gdHVybiB0aGUgZmlsdGVyIG9uCi0gICAqIGFuZCBvZmYKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRGaWx0ZXIgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gc2hvd0NvbXBsZXhUeXBlcyA9IHRydWU7Ci0KLSAgcHVibGljIFhTRFR5cGVzU2VhcmNoTGlzdFByb3ZpZGVyKElGaWxlIGN1cnJlbnRGaWxlLCBYU0RTY2hlbWFbXSBzY2hlbWFzKQotICB7Ci0gICAgc3VwZXIoY3VycmVudEZpbGUsIHNjaGVtYXMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcG9wdWxhdGVDb21wb25lbnRMaXN0KElDb21wb25lbnRMaXN0IGxpc3QsIFNlYXJjaFNjb3BlIHNjb3BlLCBJUHJvZ3Jlc3NNb25pdG9yIHBtKQotICB7Ci0gICAgLy8gZmlyc3Qgd2UgYWRkIHRoZSAnYnVpbHQgaW4nIHR5cGVzCi0gICAgLy8KLSAgICBYU0RTY2hlbWEgc2NoZW1hRm9yU2NoZW1hID0gWFNEU2NoZW1hSW1wbC5nZXRTY2hlbWFGb3JTY2hlbWEoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzY2hlbWFGb3JTY2hlbWEuZ2V0U2ltcGxlVHlwZUlkTWFwKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gKFhTRFR5cGVEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgIGlmIChidWlsdEluRmlsdGVyID09IG51bGwgfHwgIWJ1aWx0SW5GaWx0ZXIuc2hvdWxkRmlsdGVyT3V0KHRkKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQodGQpOwotICAgICAgfQotICAgIH0KLSAgICAvLyBub3cgd2UgdHJhdmVyc2UgdGhlIHR5cGVzIGFscmVhZHkgZGVmaW5lZCB3aXRoaW4gdGhlIHZpc2libGUgc2NoZW1hcwotICAgIC8vIHdlIGRvIHRoaXMgaW4gYWRkaXRpb24gdG8gdGhlIGNvbXBvbmVudCBzZWFyY2ggc2luY2UgdGhpcyBzaG91bGQgZXhlY3V0ZQotICAgIC8vIHZlcnkgcXVpY2tseSBhbmQgdGhlcmUncyBhIGdvb2QgY2hhbmNlIHRoZSB1c2VyIHdhbnRzIHRvIHNlbGVjdCBhIHRpbWUKLSAgICAvLyB0aGF0J3MKLSAgICAvLyBhbHJlYWR5IGltcG9ydGVkL2luY2x1ZGVkCi0gICAgLy8gVE9ETyAoY3MpIGVuc3VyZSB3ZSBkb24ndCBhZGQgZHVwbGljYXRlcyB3aGVuIHdlIHByb2NlZWQgdG8gdXNlIHRoZQotICAgIC8vIHNlYXJjaCBsaXN0Ci0gICAgLy8KLSAgICBMaXN0IHZpc2l0ZWRTY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gc2NoZW1hc1tpXTsKLSAgICAgIFF1YWxpZmllZE5hbWUga2luZCA9IHNob3dDb21wbGV4VHlwZXMgPyBJWFNEU2VhcmNoQ29uc3RhbnRzLlRZUEVfTUVUQV9OQU1FIDogSVhTRFNlYXJjaENvbnN0YW50cy5TSU1QTEVfVFlQRV9NRVRBX05BTUU7Ci0gICAgICBDb21wb25lbnRDb2xsZWN0aW5nWFNEVmlzaXRvciB2aXNpdG9yID0gbmV3IENvbXBvbmVudENvbGxlY3RpbmdYU0RWaXNpdG9yKGxpc3QsIGtpbmQpOwotICAgICAgdmlzaXRvci52aXNpdFNjaGVtYShzY2hlbWEsIHRydWUpOwotICAgICAgdmlzaXRlZFNjaGVtYXMuYWRkQWxsKHZpc2l0b3IuZ2V0VmlzaXRlZFNjaGVtYXMoKSk7Ci0gICAgfQotICAgIC8vIGZpbmFsbHkgd2UgY2FsbCB0aGUgc2VhcmNoIEFQSSdzIHRvIGRvIGEgcG90ZW50aWFsbHkgc2xvdyBzZWFyY2gKLSAgICAvLyAgIAotICAgIGlmIChzY29wZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHBvcHVsYXRlQ29tcG9uZW50TGlzdFVzaW5nU2VhcmNoKGxpc3QsIHNjb3BlLCBwbSwgY3JlYXRlRmlsZU1hcCh2aXNpdGVkU2NoZW1hcykpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbXBvbmVudExpc3RVc2luZ1NlYXJjaChJQ29tcG9uZW50TGlzdCBsaXN0LCBTZWFyY2hTY29wZSBzY29wZSwgSVByb2dyZXNzTW9uaXRvciBwbSwgSGFzaE1hcCBmaWxlcykKLSAgewotICAgIFNlYXJjaEVuZ2luZSBzZWFyY2hFbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKCk7Ci0gICAgSW50ZXJuYWxTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IEludGVybmFsU2VhcmNoUmVxdWVzdG9yKGxpc3QsIGZpbGVzKTsKLSAgICBpZiAoc2hvd0NvbXBsZXhUeXBlcykKLSAgICB7Ci0gICAgICBmaW5kTWF0Y2hlcyhzZWFyY2hFbmdpbmUsIHJlcXVlc3Rvciwgc2NvcGUsIElYU0RTZWFyY2hDb25zdGFudHMuQ09NUExFWF9UWVBFX01FVEFfTkFNRSk7Ci0gICAgfQotICAgIGZpbmRNYXRjaGVzKHNlYXJjaEVuZ2luZSwgcmVxdWVzdG9yLCBzY29wZSwgSVhTRFNlYXJjaENvbnN0YW50cy5TSU1QTEVfVFlQRV9NRVRBX05BTUUpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBfcG9wdWxhdGVDb21wb25lbnRMaXN0UXVpY2soSUNvbXBvbmVudExpc3QgbGlzdCwgSVByb2dyZXNzTW9uaXRvciBwbSkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgdHVybkJ1aWx0SW5GaWx0ZXJPbihib29sZWFuIG9wdGlvbikKLSAgewotICAgIHN1cHBvcnRGaWx0ZXIgPSBvcHRpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRCdWlsdEluRmlsdGVyKElYU0RUeXBlc0ZpbHRlciBmaWx0ZXIpCi0gIHsKLSAgICB0aGlzLmJ1aWx0SW5GaWx0ZXIgPSBmaWx0ZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzaG93Q29tcGxleFR5cGVzKGJvb2xlYW4gc2hvdykKLSAgewotICAgIHNob3dDb21wbGV4VHlwZXMgPSBzaG93OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9uYXZpZ2F0aW9uL0Rlc2lnblZpZXdOYXZpZ2F0aW9uTG9jYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL25hdmlnYXRpb24vRGVzaWduVmlld05hdmlnYXRpb25Mb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Y4ZWUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL25hdmlnYXRpb24vRGVzaWduVmlld05hdmlnYXRpb25Mb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLm5hdmlnYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5hdmlnYXRpb25Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5OYXZpZ2F0aW9uTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkRlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBleGlzdHMgdG8gc3VwcG9ydCBuYXZpZ2F0aW9uIGluIGEgY29udGV4dCB3aGVyZSB0aGVyZSBpcyBubyB0ZXh0IAotICogZWRpdG9yIHBhZ2UuICBJbiB0aGVzZSBjYXNlcyB3ZSBjYW4ndCByZWx5IG9uIHRoZSBUZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9ucwotICogc28gd2UgdGhpcyBjbGFzcyB3aGljaCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGgganVzdCB0aGUgZGVzaWduIHZpZXcuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNpZ25WaWV3TmF2aWdhdGlvbkxvY2F0aW9uIGV4dGVuZHMgTmF2aWdhdGlvbkxvY2F0aW9uCi17Ci0gIHByb3RlY3RlZCBQYXRoIHBhdGg7Ci0KLSAgcHVibGljIERlc2lnblZpZXdOYXZpZ2F0aW9uTG9jYXRpb24oSUVkaXRvclBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHRoaXMucGF0aCA9IG5ldyBQYXRoKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBEZXNpZ25WaWV3TmF2aWdhdGlvbkxvY2F0aW9uKElFZGl0b3JQYXJ0IHBhcnQsIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgewotICAgIHN1cGVyKHBhcnQpOyAgIAotICAgIHRoaXMucGF0aCA9IFBhdGguY29tcHV0ZVBhdGgoY29tcG9uZW50KTsgIAotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gbWVyZ2VJbnRvKElOYXZpZ2F0aW9uTG9jYXRpb24gY3VycmVudExvY2F0aW9uKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICBpZiAoY3VycmVudExvY2F0aW9uIGluc3RhbmNlb2YgRGVzaWduVmlld05hdmlnYXRpb25Mb2NhdGlvbikKLSAgICB7Ci0gICAgICBEZXNpZ25WaWV3TmF2aWdhdGlvbkxvY2F0aW9uIGxvYyA9IChEZXNpZ25WaWV3TmF2aWdhdGlvbkxvY2F0aW9uKSBjdXJyZW50TG9jYXRpb247Ci0gICAgICByZXN1bHQgPSBsb2MucGF0aC50b1N0cmluZygpLmVxdWFscyhwYXRoLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVzdG9yZUxvY2F0aW9uKCkKLSAgewotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKSBnZXRFZGl0b3JQYXJ0KCkuZ2V0QWRhcHRlcihYU0RTY2hlbWEuY2xhc3MpOwotICAgIE9iamVjdCB2aWV3ZXIgPSBnZXRFZGl0b3JQYXJ0KCkuZ2V0QWRhcHRlcihHcmFwaGljYWxWaWV3ZXIuY2xhc3MpOwotICAgIGlmICh2aWV3ZXIgaW5zdGFuY2VvZiBEZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyKQotICAgIHsKLSAgICAgIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyID0gKERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIpIHZpZXdlcjsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCA9IFBhdGguY29tcHV0ZUNvbXBvbmVudChzY2hlbWEsIHBhdGgpOwotICAgICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGNvbXBvbmVudCk7Ci0gICAgICAgIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUFEVE9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIGdyYXBoaWNhbFZpZXdlci5zZXRJbnB1dCgoSUFEVE9iamVjdClhZGFwdGVyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAocGF0aC5zZWdtZW50cy5pc0VtcHR5KCkpCi0gICAgICB7Ci0gICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoc2NoZW1hKTsKLSAgICAgICAgaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQURUT2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgZ3JhcGhpY2FsVmlld2VyLnNldElucHV0KChJQURUT2JqZWN0KWFkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pCi0gIHsKLSAgICBTdHJpbmcgc3RyaW5nID0gbWVtZW50by5nZXRTdHJpbmcoInBhdGgiKTsKLSAgICBwYXRoID0gUGF0aC5jcmVhdGVQYXRoKHN0cmluZyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykKLSAgewotICAgIG1lbWVudG8ucHV0U3RyaW5nKCJwYXRoIiwgcGF0aC50b1N0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVwZGF0ZSgpCi0gIHsKLSAgICAvLyBUT0RPIChjcykgbm90IHN1cmUgd2hhdCBuZWVkcyB0byBiZSBkb25lIGhlcmUKLSAgfQotICBzdGF0aWMgY2xhc3MgUGF0aFNlZ21lbnQKLSAgewotICAgIGZpbmFsIHN0YXRpYyBpbnQgRUxFTUVOVCA9IDE7Ci0gICAgZmluYWwgc3RhdGljIGludCBUWVBFID0gMjsKLSAgICBpbnQga2luZDsKLSAgICBTdHJpbmcgbmFtZTsKLQotICAgIFBhdGhTZWdtZW50KCkKLSAgICB7Ci0gICAgfQotCi0gICAgUGF0aFNlZ21lbnQoaW50IGtpbmQsIFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLSAgfQotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFBhdGgKLSAgewotICAgIExpc3Qgc2VnbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXB1dGVDb21wb25lbnQoWFNEU2NoZW1hIHNjaGVtYSwgUGF0aCBwYXRoKQotICAgIHsKLSAgICAgIFBhdGhSZXNvbHZpbmdYU0RWaXNpdG9yIHZpc2l0b3IgPSBuZXcgUGF0aFJlc29sdmluZ1hTRFZpc2l0b3IocGF0aCk7Ci0gICAgICB2aXNpdG9yLnZpc2l0U2NoZW1hKHNjaGVtYSk7Ci0gICAgICBpZiAodmlzaXRvci5pc0RvbmUoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHZpc2l0b3IucmVzdWx0OwotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgc3RhdGljIFBhdGggY3JlYXRlUGF0aChTdHJpbmcgc3RyaW5nKQotICAgIHsKLSAgICAgIFBhdGggcGF0aCA9IG5ldyBQYXRoKCk7Ci0gICAgICBQYXRoU2VnbWVudCBzZWdtZW50ID0gbnVsbDsKLSAgICAgIGZvciAoU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHJpbmcsICIvIik7IHN0Lmhhc01vcmVUb2tlbnMoKTspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgICBpbnQga2luZCA9IC0xOwotICAgICAgICBpZiAodG9rZW4uc3RhcnRzV2l0aCgiZWxlbWVudCIpKQotICAgICAgICB7Ci0gICAgICAgICAga2luZCA9IFBhdGhTZWdtZW50LkVMRU1FTlQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodG9rZW4uc3RhcnRzV2l0aCgidHlwZSIpKQotICAgICAgICB7Ci0gICAgICAgICAga2luZCA9IFBhdGhTZWdtZW50LlRZUEU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGtpbmQgIT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICBzZWdtZW50ID0gbmV3IFBhdGhTZWdtZW50KCk7Ci0gICAgICAgICAgc2VnbWVudC5raW5kID0ga2luZDsKLSAgICAgICAgICBwYXRoLnNlZ21lbnRzLmFkZChzZWdtZW50KTsKLSAgICAgICAgICBTdHJpbmcgbmFtZVBhdHRlcm4gPSAiW0BuYW1lPSciOwotICAgICAgICAgIGludCBzdGFydEluZGV4ID0gdG9rZW4uaW5kZXhPZihuYW1lUGF0dGVybik7Ci0gICAgICAgICAgaWYgKHN0YXJ0SW5kZXggIT0gLTEpCi0gICAgICAgICAgewotICAgICAgICAgICAgc3RhcnRJbmRleCArPSBuYW1lUGF0dGVybi5sZW5ndGgoKTsKLSAgICAgICAgICAgIGludCBlbmRJbmRleCA9IHRva2VuLmluZGV4T2YoIiddIik7Ci0gICAgICAgICAgICBpZiAoZW5kSW5kZXggIT0gLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNlZ21lbnQubmFtZSA9IHRva2VuLnN1YnN0cmluZyhzdGFydEluZGV4LCBlbmRJbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcGF0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFBhdGggY29tcHV0ZVBhdGgoWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50KQotICAgIHsKLSAgICAgIFBhdGggcGF0aCA9IG5ldyBQYXRoKCk7Ci0gICAgICBmb3IgKEVPYmplY3QgYyA9IGNvbXBvbmVudDsgYyAhPSBudWxsOyBjID0gYy5lQ29udGFpbmVyKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChjIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBQYXRoU2VnbWVudCBzZWdtZW50ID0gY29tcHV0ZVBhdGhTZWdtZW50KChYU0RDb25jcmV0ZUNvbXBvbmVudCkgYyk7Ci0gICAgICAgICAgaWYgKHNlZ21lbnQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwYXRoLnNlZ21lbnRzLmFkZCgwLCBzZWdtZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBwYXRoOwotICAgIH0KLQotICAgIHN0YXRpYyBQYXRoU2VnbWVudCBjb21wdXRlUGF0aFNlZ21lbnQoWFNEQ29uY3JldGVDb21wb25lbnQgYykKLSAgICB7Ci0gICAgICBpZiAoYyBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVkID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgYzsKLSAgICAgICAgcmV0dXJuIG5ldyBQYXRoU2VnbWVudChQYXRoU2VnbWVudC5FTEVNRU5ULCBlZC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjIGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gKFhTRFR5cGVEZWZpbml0aW9uKSBjOwotICAgICAgICByZXR1cm4gbmV3IFBhdGhTZWdtZW50KFBhdGhTZWdtZW50LlRZUEUsIHRkLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICBTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNlZ21lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgUGF0aFNlZ21lbnQgc2VnbWVudCA9IChQYXRoU2VnbWVudCkgaS5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyBraW5kID0gIiI7Ci0gICAgICAgIGlmIChzZWdtZW50LmtpbmQgPT0gUGF0aFNlZ21lbnQuRUxFTUVOVCkKLSAgICAgICAgewotICAgICAgICAgIGtpbmQgPSAiZWxlbWVudCI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2VnbWVudC5raW5kID09IFBhdGhTZWdtZW50LlRZUEUpCi0gICAgICAgIHsKLSAgICAgICAgICBraW5kID0gInR5cGUiOwotICAgICAgICB9Ci0gICAgICAgIGIuYXBwZW5kKGtpbmQpOwotICAgICAgICBpZiAoc2VnbWVudC5uYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBiLmFwcGVuZCgiW0BuYW1lPSciICsgc2VnbWVudC5uYW1lICsgIiddIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgYi5hcHBlbmQoIi8iKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGIudG9TdHJpbmcoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIAotICBzdGF0aWMgY2xhc3MgUGF0aFJlc29sdmluZ1hTRFZpc2l0b3IgZXh0ZW5kcyBYU0RWaXNpdG9yCi0gIHsKLSAgICBQYXRoIHBhdGg7Ci0gICAgaW50IGluZGV4ID0gLTE7Ci0gICAgUGF0aFNlZ21lbnQgc2VnbWVudDsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCByZXN1bHQgPSBudWxsOwotCi0gICAgUGF0aFJlc29sdmluZ1hTRFZpc2l0b3IoUGF0aCBwYXRoKQotICAgIHsKLSAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgICBpbmNyZW1lbnRTZWdtZW50KCk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc0RvbmUoKQotICAgIHsKLSAgICAgIHJldHVybiBpbmRleCA+PSBwYXRoLnNlZ21lbnRzLnNpemUoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGluY3JlbWVudFNlZ21lbnQoKQotICAgIHsKLSAgICAgIGluZGV4Kys7Ci0gICAgICBpZiAoaW5kZXggPCBwYXRoLnNlZ21lbnRzLnNpemUoKSkKLSAgICAgIHsKLSAgICAgICAgc2VnbWVudCA9IChQYXRoU2VnbWVudCkgcGF0aC5zZWdtZW50cy5nZXQoaW5kZXgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzZWdtZW50ID0gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFNjaGVtYShYU0RTY2hlbWEgc2NoZW1hKQotICAgIHsKLSAgICAgIGlmIChzZWdtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChzZWdtZW50LmtpbmQgPT0gUGF0aFNlZ21lbnQuRUxFTUVOVCkKLSAgICAgICAgewotICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IHNjaGVtYS5yZXNvbHZlRWxlbWVudERlY2xhcmF0aW9uKHNlZ21lbnQubmFtZSk7Ci0gICAgICAgICAgaWYgKGVkICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oZWQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzZWdtZW50LmtpbmQgPT0gUGF0aFNlZ21lbnQuVFlQRSkKLSAgICAgICAgewotICAgICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gc2NoZW1hLnJlc29sdmVUeXBlRGVmaW5pdGlvbihzZWdtZW50Lm5hbWUpOwotICAgICAgICAgIGlmICh0ZCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHZpc2l0VHlwZURlZmluaXRpb24odGQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICAgIHsKLSAgICAgIGlmIChzZWdtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKHNlZ21lbnQua2luZCA9PSBQYXRoU2VnbWVudC5FTEVNRU5UICYmIGlzTWF0Y2goc2VnbWVudC5uYW1lLCBuYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGVsZW1lbnQ7Ci0gICAgICAgICAgaW5jcmVtZW50U2VnbWVudCgpOwotICAgICAgICAgIGlmICghaXNEb25lKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgc3VwZXIudmlzaXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRUeXBlRGVmaW5pdGlvbihYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKQotICAgIHsKLSAgICAgIGlmIChzZWdtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChzZWdtZW50LmtpbmQgPT0gUGF0aFNlZ21lbnQuVFlQRSAmJiBpc01hdGNoKHNlZ21lbnQubmFtZSwgbmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSB0eXBlOwotICAgICAgICAgIGluY3JlbWVudFNlZ21lbnQoKTsKLSAgICAgICAgICBpZiAoIWlzRG9uZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyLnZpc2l0VHlwZURlZmluaXRpb24odHlwZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNNYXRjaChTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikKLSAgICB7Ci0gICAgICByZXR1cm4gbmFtZTEgIT0gbnVsbCA/IG5hbWUxLmVxdWFscyhuYW1lMikgOiBuYW1lMSA9PSBuYW1lMjsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9uYXZpZ2F0aW9uL011bHRpUGFnZUVkaXRvclRleHRTZWxlY3Rpb25OYXZpZ2F0aW9uTG9jYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL25hdmlnYXRpb24vTXVsdGlQYWdlRWRpdG9yVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGY2NTk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL25hdmlnYXRpb24vTXVsdGlQYWdlRWRpdG9yVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwubmF2aWdhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9uOwotCi0vKioKLSAqIFRoZSBwbGF0Zm9ybSdzIG5hdmlnYXRpb24gaGlzdG9yeSBwbHVtYmluZyBkb2Vzbid0IGxpa2UgbXVsdGlwYWdlIHRleHQKLSAqIGVkaXRvcnMgdmVyeSBtdWNoIGFuZCB0ZW5kcyB0byBpZ25vcmUgdGV4dCBsb2NhdGlvbnMuICBUbyBmaXggdGhpcwotICogcHJvYmxlbSB3ZSBuZWVkIHRvIG92ZXJyaWRlIHRoZSBnZXRFZGl0UGFydCgpIG1ldGhvZCBvZiB0aGUgc3VwZXIgY2xhc3MKLSAqIGluIG9yZGVyIHRvIHJldHVybiB0aGUgYWN0dWFsIFRleHRFZGl0b3Igb2Ygb3VyIG11bHRpLXBhZ2UgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aVBhZ2VFZGl0b3JUZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9uIGV4dGVuZHMgVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbgotewotICBwdWJsaWMgTXVsdGlQYWdlRWRpdG9yVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbihJVGV4dEVkaXRvciBwYXJ0LCBib29sZWFuIGluaXRpYWxpemUpCi0gIHsKLSAgICBzdXBlcihwYXJ0LCBpbml0aWFsaXplKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJRWRpdG9yUGFydCBnZXRFZGl0b3JQYXJ0KCkKLSAgewotICAgIElFZGl0b3JQYXJ0IHBhcnQgPSBzdXBlci5nZXRFZGl0b3JQYXJ0KCk7Ci0gICAgaWYgKHBhcnQgIT0gbnVsbCkKLSAgICAgIHJldHVybiAoSVRleHRFZGl0b3IpIHBhcnQuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQotICB7Ci0gICAgLy8gSVNTVUU6IGhvdyB0byBnZXQgdGl0bGU/Ci0gICAgLy8gSUVkaXRvclBhcnQgcGFydCA9IGdldEVkaXRvclBhcnQoKTsKLSAgICAvLyBpZiAocGFydCBpbnN0YW5jZW9mIFdTRExUZXh0RWRpdG9yKSB7Ci0gICAgLy8gcmV0dXJuICgoV1NETFRleHRFZGl0b3IpIHBhcnQpLmdldFdTRExFZGl0b3IoKS5nZXRUaXRsZSgpOwotICAgIC8vIH0KLSAgICAvLyBlbHNlIHsKLSAgICAvLyByZXR1cm4gc3VwZXIuZ2V0VGV4dCgpOwotICAgIC8vIH0KLSAgICByZXR1cm4gc3VwZXIuZ2V0VGV4dCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9uc2VkaXQvU2NoZW1hUHJlZml4Q2hhbmdlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvbnNlZGl0L1NjaGVtYVByZWZpeENoYW5nZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBhNTM0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9uc2VkaXQvU2NoZW1hUHJlZml4Q2hhbmdlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uc2VkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgU2NoZW1hUHJlZml4Q2hhbmdlSGFuZGxlcgotewotICBTdHJpbmcgbmV3UHJlZml4OwotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotCi0gIHB1YmxpYyBTY2hlbWFQcmVmaXhDaGFuZ2VIYW5kbGVyKFhTRFNjaGVtYSB4c2RTY2hlbWEsIFN0cmluZyBuZXdQcmVmaXgpCi0gIHsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgICB0aGlzLm5ld1ByZWZpeD0gbmV3UHJlZml4OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZXNvbHZlKCkKLSAgewotICAgIFhTRFNjaGVtYVByZWZpeFJlbmFtZXIgeHNkU2NoZW1hUHJlZml4UmVuYW1lciA9IG5ldyBYU0RTY2hlbWFQcmVmaXhSZW5hbWVyKCk7Ci0gICAgeHNkU2NoZW1hUHJlZml4UmVuYW1lci52aXNpdFNjaGVtYSh4c2RTY2hlbWEpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROZXdRTmFtZShYU0RUeXBlRGVmaW5pdGlvbiBjb21wLCBTdHJpbmcgdmFsdWUsIFN0cmluZyBuZXdYU0RQcmVmaXgpCi0gIHsKLSAgICBTdHJpbmcgcU5hbWUgPSBudWxsOwotICAgIGlmICh2YWx1ZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHFOYW1lID0gbmV3WFNEUHJlZml4OwotICAgICAgaWYgKHFOYW1lICE9IG51bGwgJiYgcU5hbWUubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBxTmFtZSArPSAiOiIgKyB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcU5hbWUgPSB2YWx1ZTsgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBxTmFtZSA9IHZhbHVlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcU5hbWU7Ci0gIH0KLQotICAKLSAgY2xhc3MgWFNEU2NoZW1hUHJlZml4UmVuYW1lciBleHRlbmRzIFhTRFZpc2l0b3IKLSAgewotICAgIHB1YmxpYyBYU0RTY2hlbWFQcmVmaXhSZW5hbWVyKCkKLSAgICB7Ci0gICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkKLSAgICB7Ci0gICAgICBzdXBlci52aXNpdEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSBlbGVtZW50LmdldFR5cGUoKTsKLSAgICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBucyA9IHR5cGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGlmIChucyA9PSBudWxsKSBucyA9ICIiOwotLy8gICAgICAgIGlmIChucy5lcXVhbHMoeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSgpKSkKLSAgICAgICAgaWYgKG5zLmVxdWFscyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpKSAgICAgICAgCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50IGRvbUVsZW1lbnQgPSBlbGVtZW50LmdldEVsZW1lbnQoKTsKLSAgICAgICAgICBpZiAoZG9tRWxlbWVudCAhPSBudWxsICYmIGRvbUVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBBdHRyIHR5cGVBdHRyID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICBpZiAodHlwZUF0dHIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZWxlbWVudC5nZXRFbGVtZW50KCkuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSwgZ2V0TmV3UU5hbWUodHlwZSwgdHlwZS5nZXROYW1lKCksIG5ld1ByZWZpeCkpOyAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGUpCi0gICAgewotICAgICAgc3VwZXIudmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbihzaW1wbGVUeXBlKTsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIGJhc2VUeXBlID0gc2ltcGxlVHlwZS5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLSAgICAgIAotICAgICAgaWYgKGJhc2VUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBucyA9IGJhc2VUeXBlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAobnMgPT0gbnVsbCkgbnMgPSAiIjsKLS8vICAgICAgICBpZiAobnMuZXF1YWxzKHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWFOYW1lc3BhY2UoKSkpCi0gICAgICAgIGlmIChucy5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKSkKLSAgICAgICAgewotICAgICAgICAgIFhTRERPTUhlbHBlciBkb21IZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0gICAgICAgICAgRWxlbWVudCBkZXJpdmVkQnkgPSBkb21IZWxwZXIuZ2V0RGVyaXZlZEJ5RWxlbWVudChzaW1wbGVUeXBlLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgaWYgKGRlcml2ZWRCeSAhPSBudWxsICYmIGRlcml2ZWRCeSBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEF0dHIgdHlwZUF0dHIgPSBkZXJpdmVkQnkuZ2V0QXR0cmlidXRlTm9kZShYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUpOwotICAgICAgICAgICAgaWYgKHR5cGVBdHRyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGRlcml2ZWRCeS5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFLCBnZXROZXdRTmFtZShiYXNlVHlwZSwgYmFzZVR5cGUuZ2V0TmFtZSgpLCBuZXdQcmVmaXgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gaXRlbVR5cGUgPSBzaW1wbGVUeXBlLmdldEl0ZW1UeXBlRGVmaW5pdGlvbigpOwotICAgICAgaWYgKGl0ZW1UeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBucyA9IGl0ZW1UeXBlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAobnMgPT0gbnVsbCkgbnMgPSAiIjsKLSAgICAgICAgaWYgKG5zLmVxdWFscyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERE9NSGVscGVyIGRvbUhlbHBlciA9IG5ldyBYU0RET01IZWxwZXIoKTsKLSAgICAgICAgICBOb2RlIGxpc3ROb2RlID0gZG9tSGVscGVyLmdldENoaWxkTm9kZShzaW1wbGVUeXBlLmdldEVsZW1lbnQoKSwgWFNEQ29uc3RhbnRzLkxJU1RfRUxFTUVOVF9UQUcpOwotICAgICAgICAgIGlmIChsaXN0Tm9kZSAhPSBudWxsICYmIGxpc3ROb2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBFbGVtZW50IGxpc3RFbGVtZW50ID0gKEVsZW1lbnQpbGlzdE5vZGU7ICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGxpc3RFbGVtZW50IGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEF0dHIgdHlwZUF0dHIgPSBsaXN0RWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKFhTRENvbnN0YW50cy5JVEVNVFlQRV9BVFRSSUJVVEUpOwotICAgICAgICAgICAgICBpZiAodHlwZUF0dHIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpc3RFbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuSVRFTVRZUEVfQVRUUklCVVRFLCBnZXROZXdRTmFtZShpdGVtVHlwZSwgaXRlbVR5cGUuZ2V0TmFtZSgpLCBuZXdQcmVmaXgpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBMaXN0IG1lbWJlclR5cGVzID0gc2ltcGxlVHlwZS5nZXRNZW1iZXJUeXBlRGVmaW5pdGlvbnMoKTsKLSAgICAgIGlmIChtZW1iZXJUeXBlcy5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBYU0RET01IZWxwZXIgZG9tSGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICAgICAgICBOb2RlIHVuaW9uTm9kZSA9IGRvbUhlbHBlci5nZXRDaGlsZE5vZGUoc2ltcGxlVHlwZS5nZXRFbGVtZW50KCksIFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRyk7Ci0gICAgICAgIGlmICh1bmlvbk5vZGUgIT0gbnVsbCAmJiB1bmlvbk5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCB1bmlvbkVsZW1lbnQgPSAoRWxlbWVudCl1bmlvbk5vZGU7ICAgICAgICAgIAotICAgICAgICAgIGlmICh1bmlvbkVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG1lbWJlclR5cGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWkubmV4dCgpOwotICAgICAgICAgICAgICBTdHJpbmcgbnMgPSBzdC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgaWYgKG5zID09IG51bGwpIG5zID0gIiI7Ci0gICAgICAgICAgICAgIGlmIChucy5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChnZXROZXdRTmFtZShzdCwgc3QuZ2V0TmFtZSgpLCBuZXdQcmVmaXgpKTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKHN0LmdldFFOYW1lKHhzZFNjaGVtYSkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bmlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUsIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cikKLSAgICB7Ci0gICAgICBzdXBlci52aXNpdEF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpOwotICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IGF0dHIuZ2V0VHlwZSgpOwotICAgICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5zID0gdHlwZS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgaWYgKG5zID09IG51bGwpIG5zID0gIiI7Ci0vLyAgICAgICAgaWYgKG5zLmVxdWFscyh4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hTmFtZXNwYWNlKCkpKQotICAgICAgICBpZiAobnMuZXF1YWxzKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSkpCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50IGRvbUVsZW1lbnQgPSBhdHRyLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICBpZiAoZG9tRWxlbWVudCAhPSBudWxsICYmIGRvbUVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBBdHRyIHR5cGVBdHRyID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICBpZiAodHlwZUF0dHIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYXR0ci5nZXRFbGVtZW50KCkuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSwgZ2V0TmV3UU5hbWUodHlwZSwgdHlwZS5nZXROYW1lKCksIG5ld1ByZWZpeCkpOyAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL25zZWRpdC9UYXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9uc2VkaXQvVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjZjOWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL25zZWRpdC9UYXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLm5zZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi0KLXB1YmxpYyBjbGFzcyBUYXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyCi17Ci0gIFN0cmluZyBuZXdOUzsKLSAgU3RyaW5nIG9sZE5TOwotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotCi0gIHB1YmxpYyBUYXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyKFhTRFNjaGVtYSB4c2RTY2hlbWEsIFN0cmluZyBvbGROUywgU3RyaW5nIG5ld05TKQotICB7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gICAgdGhpcy5vbGROUz0gb2xkTlM7Ci0gICAgdGhpcy5uZXdOUz0gbmV3TlM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlc29sdmUoKQotICB7Ci0gICAgRWxlbWVudFJlZmVyZW5jZVJlbmFtZXIgZWxlbWVudFJlZmVyZW5jZVJlbmFtZXIgPSBuZXcgRWxlbWVudFJlZmVyZW5jZVJlbmFtZXIoKTsKLSAgICBlbGVtZW50UmVmZXJlbmNlUmVuYW1lci52aXNpdFNjaGVtYSh4c2RTY2hlbWEpOwotICAgIEF0dHJpYnV0ZVJlZmVyZW5jZVJlbmFtZXIgYXR0cmlidXRlUmVmZXJlbmNlUmVuYW1lciA9IG5ldyBBdHRyaWJ1dGVSZWZlcmVuY2VSZW5hbWVyKCk7Ci0gICAgYXR0cmlidXRlUmVmZXJlbmNlUmVuYW1lci52aXNpdFNjaGVtYSh4c2RTY2hlbWEpOwotICB9Ci0KLSAgY2xhc3MgRWxlbWVudFJlZmVyZW5jZVJlbmFtZXIgZXh0ZW5kcyBYU0RWaXNpdG9yCi0gIHsKLSAgICBwdWJsaWMgRWxlbWVudFJlZmVyZW5jZVJlbmFtZXIoKQotICAgIHsKLSAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICAgIHsKLSAgICAgIHN1cGVyLnZpc2l0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgICAgaWYgKGVsZW1lbnQuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgIHsKLSAgICAgIAlpZiAoZWxlbWVudC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwpCi0gICAgICAJewotICAgICAgCSAgaWYgKGVsZW1lbnQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMob2xkTlMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIHNldCB0aGUgcmVzb2x2ZWQgZWxlbWVudCdzIGRlY2xhcmF0aW9uIHRvIG5ldyBucwotICAgICAgICAgICAgLy8gdGhpcyBpcyBkZWZlY3QgMjM3NTE4IC0gdGFyZ2V0IG5hbWVzcGFjZSByZW5hbWUgY3JlYXRlcyBhIG5ldyBuYW1lc3BhY2UKLSAgICAgICAgICAgIGVsZW1lbnQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5zZXRUYXJnZXROYW1lc3BhY2UobmV3TlMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgCWlmIChvbGROUyA9PSBudWxsIHx8IChvbGROUyAhPSBudWxsICYmIG9sZE5TLmVxdWFscygiIikpKQotICAgICAgICAJewotCQkJCQkJZWxlbWVudC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLnNldFRhcmdldE5hbWVzcGFjZShuZXdOUyk7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIC8vIFNpbWlsYXIgdG8gZGVmZWN0IDIzNzUxOCBidXQgZm9yIGF0dHJpYnV0ZXMKLSAgY2xhc3MgQXR0cmlidXRlUmVmZXJlbmNlUmVuYW1lciBleHRlbmRzIFhTRFZpc2l0b3IKLSAgewotICAgIHB1YmxpYyBBdHRyaWJ1dGVSZWZlcmVuY2VSZW5hbWVyKCkKLSAgICB7Ci0gICAgICBzdXBlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdHlwZSkKLSAgICB7Ci0gICAgICBzdXBlci52aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbih0eXBlKTsKLSAgICAgIGlmICh0eXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZS5nZXRBdHRyaWJ1dGVDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQgYXR0ckdyb3VwQ29udGVudCA9IChYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgIGlmIChhdHRyR3JvdXBDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTREF0dHJpYnV0ZVVzZSBhdHRyVXNlID0gKFhTREF0dHJpYnV0ZVVzZSkgYXR0ckdyb3VwQ29udGVudDsKLSAgICAgICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gYXR0clVzZS5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChhdHRyRGVjbCAhPSBudWxsICYmIGF0dHJEZWNsLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICAgIHsKLQkJCQkJCQlpZiAoYXR0ckRlY2wuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwpCi0JCQkJCQkJewotICAgICAgICAgICAgICAgIGlmIChhdHRyRGVjbC5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKG9sZE5TKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBhdHRyRGVjbC5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuc2V0VGFyZ2V0TmFtZXNwYWNlKG5ld05TKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0JCQkJCQkJCWlmIChvbGROUyA9PSBudWxsIHx8IChvbGROUyAhPSBudWxsICYmIG9sZE5TLmVxdWFscygiIikpKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQlhdHRyRGVjbC5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuc2V0VGFyZ2V0TmFtZXNwYWNlKG5ld05TKTsKLQkJCQkJCQkJfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0cmlidXRlR3JvdXApCi0gICAgewotICAgICAgc3VwZXIudmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oYXR0cmlidXRlR3JvdXApOwotICAgICAgRUxpc3QgbGlzdCA9IGF0dHJpYnV0ZUdyb3VwLmdldEF0dHJpYnV0ZVVzZXMoKTsKLSAgICAgIGlmIChsaXN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZVVzZSBhdHRyVXNlID0gKFhTREF0dHJpYnV0ZVVzZSlpdGVyLm5leHQoKTsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IGF0dHJVc2UuZ2V0Q29udGVudCgpOwotCi0gICAgICAgICAgaWYgKGF0dHJEZWNsICE9IG51bGwgJiYgYXR0ckRlY2wuaXNBdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgICAgICAgIHsKLQkJCQkJCWlmIChhdHRyRGVjbC5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCkKLQkJCQkJCXsKLSAgICAgICAgICAgICAgaWYgKGF0dHJEZWNsLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMob2xkTlMpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXR0ckRlY2wuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLnNldFRhcmdldE5hbWVzcGFjZShuZXdOUyk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLQkJCQkJCQlpZiAob2xkTlMgPT0gbnVsbCB8fCAob2xkTlMgIT0gbnVsbCAmJiBvbGROUy5lcXVhbHMoIiIpKSkKLQkJCQkJCQl7Ci0JCQkJCQkJCWF0dHJEZWNsLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKS5zZXRUYXJnZXROYW1lc3BhY2UobmV3TlMpOwotCQkJCQkJCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL25zZWRpdC9YU0RWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9uc2VkaXQvWFNEVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWEyZTI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL25zZWRpdC9YU0RWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLm5zZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROb3RhdGlvbkRlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RWaXNpdG9yCi17Ci0gIHB1YmxpYyBYU0RWaXNpdG9yKCkKLSAgewotICB9Ci0gIAotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHNjaGVtYTsKLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0U2NoZW1hKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSAoWFNEVHlwZURlZmluaXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0VHlwZURlZmluaXRpb24odHlwZSk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiBpZGVudGl0eUNvbnN0cmFpbnQgPSAoWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKGlkZW50aXR5Q29uc3RyYWludCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0TW9kZWxHcm91cERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKG1vZGVsR3JvdXApOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cCA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKGF0dHJpYnV0ZUdyb3VwKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXROb3RhdGlvbkRlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNETm90YXRpb25EZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTRE5vdGF0aW9uRGVjbGFyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0Tm90YXRpb25EZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlRGVjbGFyYXRpb24oWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cikKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFR5cGVEZWZpbml0aW9uKFhTRFR5cGVEZWZpbml0aW9uIHR5cGUpCi0gIHsKLSAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0U2ltcGxlVHlwZURlZmluaXRpb24oKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKXR5cGUpOwotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0Q29tcGxleFR5cGVEZWZpbml0aW9uKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pdHlwZSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50LmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgewotICAgIH0KLSAgICBlbHNlIGlmIChlbGVtZW50LmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB2aXNpdFR5cGVEZWZpbml0aW9uKGVsZW1lbnQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24oWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiBpZGVudGl0eUNvbnN0cmFpbnQpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmKQotICB7Ci0gICAgaWYgKCFtb2RlbEdyb3VwRGVmLmlzTW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgICBpZiAobW9kZWxHcm91cERlZi5nZXRNb2RlbEdyb3VwKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRNb2RlbEdyb3VwKG1vZGVsR3JvdXBEZWYuZ2V0TW9kZWxHcm91cCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cCkKLSAgewotICAgIGlmIChhdHRyaWJ1dGVHcm91cC5nZXRBdHRyaWJ1dGVVc2VzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVHcm91cC5nZXRBdHRyaWJ1dGVVc2VzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlVXNlIGF0dHJVc2UgPSAoWFNEQXR0cmlidXRlVXNlKWl0ZXIubmV4dCgpOwotICAgICAgICB2aXNpdEF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHJVc2UuZ2V0Q29udGVudCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0Tm90YXRpb25EZWNsYXJhdGlvbihYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIG5vdGF0aW9uKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0U2ltcGxlVHlwZURlZmluaXRpb24oWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIGlmICh0eXBlLmdldENvbnRlbnRUeXBlKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgY29tcGxleENvbnRlbnQgPSB0eXBlLmdldENvbnRlbnRUeXBlKCk7Ci0gICAgICBpZiAoY29tcGxleENvbnRlbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgdmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pY29tcGxleENvbnRlbnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29tcGxleENvbnRlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRQYXJ0aWNsZSgoWFNEUGFydGljbGUpIGNvbXBsZXhDb250ZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKHR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQgYXR0ckdyb3VwQ29udGVudCA9IChYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQpaXRlci5uZXh0KCk7Ci0gICAgICAgIGlmIChhdHRyR3JvdXBDb250ZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlVXNlIGF0dHJVc2UgPSAoWFNEQXR0cmlidXRlVXNlKWF0dHJHcm91cENvbnRlbnQ7Ci0gICAgICAgICAgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyVXNlLmdldENvbnRlbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXR0ckdyb3VwQ29udGVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pYXR0ckdyb3VwQ29udGVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0UGFydGljbGUoWFNEUGFydGljbGUgcGFydGljbGUpCi0gIHsKLSAgICB2aXNpdFBhcnRpY2xlQ29udGVudChwYXJ0aWNsZS5nZXRDb250ZW50KCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFBhcnRpY2xlQ29udGVudChYU0RQYXJ0aWNsZUNvbnRlbnQgcGFydGljbGVDb250ZW50KQotICB7Ci0gICAgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24oKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIHZpc2l0TW9kZWxHcm91cCgoWFNETW9kZWxHcm91cClwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oKFhTREVsZW1lbnREZWNsYXJhdGlvbilwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkKLSAgICB7Ci0gICAgICB2aXNpdFdpbGRjYXJkKChYU0RXaWxkY2FyZClwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCkKLSAgewotICAgIGlmIChtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kZWxHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIHZpc2l0UGFydGljbGUocGFydGljbGUpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRXaWxkY2FyZChYU0RXaWxkY2FyZCB3aWxkY2FyZCkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0RQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QyYzVjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0RQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi1EYXZpZCBDYXJ2ZXIsIFN0YW5kYXJkcyBmb3IgVGVjaG5vbG9neSBpbiBBdXRvbW90aXZlIFJldGFpbCwgYnVnIDExNDcwMzMgICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuR3JpZERhdGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VMaW5rQXJlYTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZXMuSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLlhTRENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhTRENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5WaWV3VXRpbGl0eTsKLQotcHVibGljIGNsYXNzIFhTRFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIExpc3RlbmVyIAotewotICBUZXh0IGluZGVudFRleHRGaWVsZDsKLSAgU3RyaW5nIGluZGVudFN0cmluZzsKLSAgVGV4dCBzY2hlbWFOc1ByZWZpeEZpZWxkOwotICBUZXh0IGRlZmF1bHRUYXJnZXROYW1lc3BhY2VUZXh0OwotICBCdXR0b24gcXVhbGlmeVhTRExhbmd1YWdlOwotICBwcml2YXRlIEJ1dHRvbiBob25vdXJBbGxTY2hlbWFMb2NhdGlvbnMgPSBudWxsOwotICBwcml2YXRlIEJ1dHRvbiBmdWxsU2NoZW1hQ29uZm9ybWFuY2UgPSBudWxsOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIHByZWZlcmVuY2UgcGFnZSBjb250cm9scyBvbiBkZW1hbmQuCi0gICAqICAgQHBhcmFtIHBhcmVudCAgdGhlIHBhcmVudCBmb3IgdGhlIHByZWZlcmVuY2UgcGFnZQotICAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChwYXJlbnQsIFhTREVkaXRvckNvbnRleHRJZHMuWFNEUF9QUkVGRVJFTkNFX1BBR0UpOwotCi0JbmV3IFByZWZlcmVuY2VMaW5rQXJlYShwYXJlbnQsIFNXVC5XUkFQIHwgU1dULk1VTFRJLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5lZGl0b3IiLCBNZXNzYWdlcy5fVUlfU1RSVUNUVVJFRF9URVhUX0VESVRPUl9QUkVGU19MSU5LLC8vJE5PTi1OTFMtMSQKLQkJCQkoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpIGdldENvbnRhaW5lcigpLCBudWxsKS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuaGludCgxNTAsIFNXVC5ERUZBVUxUKS5jcmVhdGUoKSk7Ci0JbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpLnNldExheW91dERhdGEoR3JpZERhdGFGYWN0b3J5LnN3dERlZmF1bHRzKCkuY3JlYXRlKCkpOwotCi0gICAgR3JvdXAgZ3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDIpOyAgIAotICAgIGdyb3VwLnNldFRleHQoTWVzc2FnZXMuX1VJX1RFWFRfWFNEX05BTUVTUEFDRV9QUkVGSVgpOwotCi0gICAgcXVhbGlmeVhTRExhbmd1YWdlID0gVmlld1V0aWxpdHkuY3JlYXRlQ2hlY2tCb3goZ3JvdXAsIE1lc3NhZ2VzLl9VSV9RVUFMSUZZX1hTRCk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChxdWFsaWZ5WFNETGFuZ3VhZ2UsCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuWE1MU0NIRU1BRklMRVNfUFJFRkVSRU5DRVNfX1FVQUxJRllfWE1MU0NIRU1BX0xBTkdVQUdFX0NPTlNUUlVDVFMpOyAKLSAgICBWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChncm91cCwgIiAiKTsKLQotICAgIGNyZWF0ZUxhYmVsKGdyb3VwLCBNZXNzYWdlcy5fVUlfVEVYVF9YU0RfREVGQVVMVF9QUkVGSVgpOwotICAgIHNjaGVtYU5zUHJlZml4RmllbGQgPSBjcmVhdGVUZXh0RmllbGQoZ3JvdXApOwotICAgIHNjaGVtYU5zUHJlZml4RmllbGQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkKLSAgICAgIHsKLSAgICAgICAgc2V0VmFsaWQodHJ1ZSk7Ci0gICAgICB9ICAgICAgCi0gICAgfSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzY2hlbWFOc1ByZWZpeEZpZWxkLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLlhNTFNDSEVNQUZJTEVTX1BSRUZFUkVOQ0VTX19YTUxfU0NIRU1BX0xBTkdVQUdFX0NPTlNUUlVDVFNfUFJFRklYKTsgCi0gICAgCi0gICAgY3JlYXRlTGFiZWwoZ3JvdXAsIE1lc3NhZ2VzLl9VSV9URVhUX1hTRF9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UpOwotICAgIGRlZmF1bHRUYXJnZXROYW1lc3BhY2VUZXh0ID0gY3JlYXRlVGV4dEZpZWxkKGdyb3VwKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRlZmF1bHRUYXJnZXROYW1lc3BhY2VUZXh0LAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLlhNTFNDSEVNQUZJTEVTX1BSRUZFUkVOQ0VTX19ERUZBVUxUX1RBUkdFVE5BTUVTUEFDRSk7IAotICAgIAotICAgIAotICAgIGNyZWF0ZUNvbnRlbnRzRm9yVmFsaWRhdGluZ0dyb3VwKHBhcmVudCk7Ci0KLSAgICBpbml0aWFsaXplVmFsdWVzKCk7Ci0KLSAgICBhcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQotICAgIHJldHVybiBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICB9Ci0KLSAgcHJpdmF0ZSBHcm91cCBjcmVhdGVHcm91cChDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgCi0gIHsKLSAgICBHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OVUxMKTsKLQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0gICAgZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgCi0gICAgcmV0dXJuIGdyb3VwOwotICB9Ci0KLSAgcHJpdmF0ZSBUZXh0IGNyZWF0ZVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50KSAKLSAgewotICAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgCi0gIHsKLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLSAgICBsYWJlbC5zZXRUZXh0KHRleHQpOwotICAgIAotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAKLSAgICByZXR1cm4gbGFiZWw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yVmFsaWRhdGluZ0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIAotICB7Ci0JR3JvdXAgdmFsaWRhdGluZ0dyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAxKTsKLQl2YWxpZGF0aW5nR3JvdXAuc2V0VGV4dChNZXNzYWdlcy5fVUlfVkFMSURBVElOR19GSUxFUyk7Ci0KLQkvL0dyaWREYXRhCi0JR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCk7Ci0JZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5DRU5URVI7Ci0JZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0KLQlpZiAoaG9ub3VyQWxsU2NoZW1hTG9jYXRpb25zID09IG51bGwpIAotCXsKLQkJaG9ub3VyQWxsU2NoZW1hTG9jYXRpb25zID0gbmV3IEJ1dHRvbih2YWxpZGF0aW5nR3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKLQkJaG9ub3VyQWxsU2NoZW1hTG9jYXRpb25zLnNldFRleHQoTWVzc2FnZXMuX1VJX1RFWFRfSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TKTsKLQkJaG9ub3VyQWxsU2NoZW1hTG9jYXRpb25zLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGhvbm91ckFsbFNjaGVtYUxvY2F0aW9ucywKLQkgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuWE1MU0NIRU1BRklMRVNfUFJFRkVSRU5DRVNfX0hPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUyk7IAotCi0JfQotCWlmIChmdWxsU2NoZW1hQ29uZm9ybWFuY2UgPT0gbnVsbCkgCi0JewotCQlmdWxsU2NoZW1hQ29uZm9ybWFuY2UgPSBuZXcgQnV0dG9uKHZhbGlkYXRpbmdHcm91cCwgU1dULkNIRUNLIHwgU1dULkxFRlQpOwotCQlmdWxsU2NoZW1hQ29uZm9ybWFuY2Uuc2V0TGF5b3V0RGF0YShHcmlkRGF0YUZhY3RvcnkuY29weURhdGEoZGF0YSkpOwotCQlmdWxsU2NoZW1hQ29uZm9ybWFuY2Uuc2V0VGV4dChNZXNzYWdlcy5fVUlfRlVMTF9DT05GT1JNQU5DRSk7Ci0JfQotCi0gIH0KLSAgCi0gIC8qKgotICAgKiBEb2VzIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBkZWZhdWx0IGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgCi0gIHsKLSAgICBzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLSAgICBpbml0aWFsaXplRGVmYXVsdHMoKTsKLSAgICBjaGVja1ZhbHVlcygpOwotICB9Ci0KLSAgLyoqCi0gICAqIERvIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBPSyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICogIEByZXR1cm4gd2hldGhlciBpdCBpcyBva2F5IHRvIGNsb3NlIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIAotICB7Ci0gICAgaWYgKGNoZWNrVmFsdWVzKCkpCi0gICAgewotICAgICAgc3RvcmVWYWx1ZXMoKTsgICAgCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFwcGx5KCkKLSAgewotICAgIGlmIChjaGVja1ZhbHVlcygpKQotICAgIHsKLSAgICAgIHN0b3JlVmFsdWVzKCk7ICAgIAotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBIYW5kbGVzIGV2ZW50cyBnZW5lcmF0ZWQgYnkgY29udHJvbHMgb24gdGhpcyBwYWdlLgotICAgKiAgIEBwYXJhbSBlICB0aGUgZXZlbnQgdG8gaGFuZGxlCi0gICAqLwotICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSAKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKQotICB7IAotICB9Ci0KLSAgLyoqIAotICAgKiBUaGUgaW5kZW50IGlzIHN0b3JlZCBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZSBhc3NvY2lhdGVkIHdpdGggdGhlIFhNTCBTY2hlbWEgTW9kZWwKLSAgICovCi0gIHB1YmxpYyBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpCi0gIHsKLSAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdXNpbmcgZGVmYXVsdCB2YWx1ZXMKLSAgICogaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkgCi0gIHsKLSAgICBzY2hlbWFOc1ByZWZpeEZpZWxkLnNldFRleHQoZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0RGVmYXVsdFN0cmluZyhYU0RFZGl0b3JQbHVnaW4uQ09OU1RfWFNEX0RFRkFVTFRfUFJFRklYX1RFWFQpKTsKLSAgICBxdWFsaWZ5WFNETGFuZ3VhZ2Uuc2V0U2VsZWN0aW9uKGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRCb29sZWFuKFhTREVkaXRvclBsdWdpbi5DT05TVF9YU0RfTEFOR1VBR0VfUVVBTElGWSkpOwotICAgIGRlZmF1bHRUYXJnZXROYW1lc3BhY2VUZXh0LnNldFRleHQoZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKFhTREVkaXRvclBsdWdpbi5DT05TVF9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UpKTsKLSAgICBob25vdXJBbGxTY2hlbWFMb2NhdGlvbnMuc2V0U2VsZWN0aW9uKFhTRENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEJvb2xlYW4oWFNEQ29yZVByZWZlcmVuY2VOYW1lcy5IT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMpKTsKLSAgICBmdWxsU2NoZW1hQ29uZm9ybWFuY2Uuc2V0U2VsZWN0aW9uKFhTRENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEJvb2xlYW4oWFNEQ29yZVByZWZlcmVuY2VOYW1lcy5GVUxMX1NDSEVNQV9DT05GT1JNQU5DRSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgCi0gIHsKLSAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgc2NoZW1hTnNQcmVmaXhGaWVsZC5zZXRUZXh0KHN0b3JlLmdldFN0cmluZyhYU0RFZGl0b3JQbHVnaW4uQ09OU1RfWFNEX0RFRkFVTFRfUFJFRklYX1RFWFQpKTsKLSAgICBxdWFsaWZ5WFNETGFuZ3VhZ2Uuc2V0U2VsZWN0aW9uKHN0b3JlLmdldEJvb2xlYW4oWFNERWRpdG9yUGx1Z2luLkNPTlNUX1hTRF9MQU5HVUFHRV9RVUFMSUZZKSk7Ci0gICAgZGVmYXVsdFRhcmdldE5hbWVzcGFjZVRleHQuc2V0VGV4dChzdG9yZS5nZXRTdHJpbmcoWFNERWRpdG9yUGx1Z2luLkNPTlNUX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSkpOwotICAgIGhvbm91ckFsbFNjaGVtYUxvY2F0aW9ucy5zZXRTZWxlY3Rpb24oWFNEQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhTRENvcmVQcmVmZXJlbmNlTmFtZXMuSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TKSk7Ci0gICAgZnVsbFNjaGVtYUNvbmZvcm1hbmNlLnNldFNlbGVjdGlvbihYU0RDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWFNEQ29yZVByZWZlcmVuY2VOYW1lcy5GVUxMX1NDSEVNQV9DT05GT1JNQU5DRSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBjb250cm9scyBiYWNrIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkgCi0gIHsKLSAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLSAgICBzdG9yZS5zZXRWYWx1ZShYU0RFZGl0b3JQbHVnaW4uQ09OU1RfWFNEX0RFRkFVTFRfUFJFRklYX1RFWFQsIGdldFhNTFNjaGVtYVByZWZpeCgpKTsKLSAgICBzdG9yZS5zZXRWYWx1ZShYU0RFZGl0b3JQbHVnaW4uQ09OU1RfWFNEX0xBTkdVQUdFX1FVQUxJRlksIGdldFF1YWxpZnkoKSk7Ci0gICAgc3RvcmUuc2V0VmFsdWUoWFNERWRpdG9yUGx1Z2luLkNPTlNUX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSwgZ2V0WE1MU2NoZW1hVGFyZ2V0TmFtZXNwYWNlKCkpOwotCi0gICAgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotICAgIAotICAgIFhTRENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWFNEQ29yZVByZWZlcmVuY2VOYW1lcy5IT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMsIGhvbm91ckFsbFNjaGVtYUxvY2F0aW9ucy5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgWFNEQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYU0RDb3JlUHJlZmVyZW5jZU5hbWVzLkZVTExfU0NIRU1BX0NPTkZPUk1BTkNFLCBmdWxsU2NoZW1hQ29uZm9ybWFuY2UuZ2V0U2VsZWN0aW9uKCkpOwotICAgIAotICAgIFhTRENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRYTUxTY2hlbWFQcmVmaXgoKQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9IHNjaGVtYU5zUHJlZml4RmllbGQuZ2V0VGV4dCgpOwotICAgIGlmIChwcmVmaXggPT0gbnVsbCB8fCBwcmVmaXguZXF1YWxzKCIiKSkgCi0gICAgewotICAgICAgcmV0dXJuICJ4c2QiOwotICAgIH0KLSAgICByZXR1cm4gcHJlZml4OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0UXVhbGlmeSgpCi0gIHsKLSAgICByZXR1cm4gcXVhbGlmeVhTRExhbmd1YWdlLmdldFNlbGVjdGlvbigpOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSB4bWwgc2NoZW1hIGRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRYTUxTY2hlbWFUYXJnZXROYW1lc3BhY2UoKQotICB7Ci0gIAlTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZGVmYXVsdFRhcmdldE5hbWVzcGFjZVRleHQuZ2V0VGV4dCgpOwotICAgIGlmICh0YXJnZXROYW1lc3BhY2UgPT0gbnVsbCB8fCB0YXJnZXROYW1lc3BhY2UuZXF1YWxzKCIiKSkgCi0gICAgewotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0U7Ci0gICAgfQotICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGNoZWNrVmFsdWVzKCkKLSAgewotLy8gS0NQb3J0IFRPRE8gICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IFZhbGlkYXRlSGVscGVyLmNoZWNrWE1MTmFtZShzY2hlbWFOc1ByZWZpeEZpZWxkLmdldFRleHQoKSk7Ci0JIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCi0gICAgaWYgKGVycm9yTWVzc2FnZSA9PSBudWxsIHx8IGVycm9yTWVzc2FnZS5sZW5ndGgoKSA9PSAwKQotICAgIHsKLSAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgIHNldFZhbGlkKHRydWUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuX0VSUk9SX0xBQkVMX0lOVkFMSURfUFJFRklYKTsKLSAgICAgIHNldFZhbGlkKGZhbHNlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3RleHQvWFNETW9kZWxBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC90ZXh0L1hTRE1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGVhOThmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3RleHQvWFNETW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuTW9kZWxSZWNvbmNpbGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RTY2hlbWFJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNETW9kZWxBZGFwdGVyIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyCi17Ci0gIHByb3RlY3RlZCBSZXNvdXJjZVNldCByZXNvdXJjZVNldDsKLSAgcHJvdGVjdGVkIFhTRFNjaGVtYSBzY2hlbWE7Ci0gIHByaXZhdGUgTW9kZWxSZWNvbmNpbGVBZGFwdGVyIG1vZGVsUmVjb25jaWxlQWRhcHRlcjsKLQotICBwdWJsaWMgWFNEU2NoZW1hIGdldFNjaGVtYSgpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1hOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2NoZW1hKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgY2xlYXIoKQotICB7Ci0JaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCURvY3VtZW50IGRvYyA9IHNjaGVtYS5nZXREb2N1bWVudCgpOwotCQlpZiAoZG9jIGluc3RhbmNlb2YgSURPTURvY3VtZW50KSB7Ci0JCQlJRE9NRG9jdW1lbnQgZG9tRG9jdW1lbnQgPSAoSURPTURvY3VtZW50KWRvYzsKLQkJCWRvbURvY3VtZW50LmdldE1vZGVsKCkucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKGdldE1vZGVsUmVjb25jaWxlQWRhcHRlcigpKTsKLQkJCWRvbURvY3VtZW50LnJlbW92ZUFkYXB0ZXIoZ2V0TW9kZWxSZWNvbmNpbGVBZGFwdGVyKCkpOwotCQkJZG9tRG9jdW1lbnQucmVtb3ZlQWRhcHRlcih0aGlzKTsJCQotCQl9Ci0JICAgIHNjaGVtYSA9IG51bGw7Ci0JfQotICAgIHJlc291cmNlU2V0ID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpCi0gIHsKLSAgICByZXR1cm4gdHlwZSA9PSBYU0RNb2RlbEFkYXB0ZXIuY2xhc3M7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpCi0gIHsKLSAgfQotICAKLSAgcHVibGljIE1vZGVsUmVjb25jaWxlQWRhcHRlciBnZXRNb2RlbFJlY29uY2lsZUFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG1vZGVsUmVjb25jaWxlQWRhcHRlcjsKLSAgfQotCi0gIHB1YmxpYyBYU0RTY2hlbWEgY3JlYXRlU2NoZW1hKERvY3VtZW50IGRvY3VtZW50KQotICB7ICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIChjcykgbm90ZSB0aGF0IHdlIGFsd2F5cyB3YW50IHRvIGVuc3VyZSB0aGF0IGEgCi0gICAgICAvLyBzY2hlbWEgbW9kZWwgb2JqZWN0IGdldCdzIHJldHVybmVkCi0gICAgICBzY2hlbWEgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RTY2hlbWEoKTsKLSAgICAgIHJlc291cmNlU2V0ID0gWFNEU2NoZW1hSW1wbC5jcmVhdGVSZXNvdXJjZVNldCgpOwotICAgICAgcmVzb3VyY2VTZXQuZ2V0QWRhcHRlckZhY3RvcmllcygpLmFkZChuZXcgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckFkYXB0ZXJGYWN0b3J5KCkpOyAgICAgICAgICAgICAgICAKLQotICAgICAgSURPTU5vZGUgZG9tTm9kZSA9IChJRE9NTm9kZSlkb2N1bWVudDsKLSAgICAgIFN0cmluZyBiYXNlTG9jYXRpb24gPSBkb21Ob2RlLmdldE1vZGVsKCkuZ2V0QmFzZUxvY2F0aW9uKCk7ICAgICAgICAgICAKLQotICAgICAgLy8gVE9ETy4uLiBnb3R0YSBwZXN0ZXIgU1NFIGZvbGtzIHRvIHByb3ZpZGUgJ3VzZWZ1bCcgYmFzZUxvY2F0aW9ucwotICAgICAgLy8gCi0gICAgICBVUkkgdXJpID0gZ2V0VVJJKGJhc2VMb2NhdGlvbik7Ci0KLSAgICAgIFJlc291cmNlIHJlc291cmNlID0gbmV3IFhTRFJlc291cmNlSW1wbCgpOwotICAgICAgcmVzb3VyY2Uuc2V0VVJJKHVyaSk7Ci0gICAgICBzY2hlbWEgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RTY2hlbWEoKTsgCi0gICAgICByZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChzY2hlbWEpOwotICAgICAgcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc291cmNlKTsgICAgIAotCi0gICAgICBzY2hlbWEuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotICAgICAgZmluYWwgRWxlbWVudCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIC8vIEZvcmNlIHRoZSBsb2FkaW5nIG9mIHRoZSAibWV0YSIgc2NoZW1hIGZvciBzY2hlbWEgaW5zdGFuY2UgaW5zdGFuY2UuCi0gICAgICAgIC8vCi0gICAgICAgIFN0cmluZyBzY2hlbWFGb3JTY2hlbWFOYW1lc3BhY2UgPSBlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBYU0RTY2hlbWFJbXBsLmdldFNjaGVtYUZvclNjaGVtYShzY2hlbWFGb3JTY2hlbWFOYW1lc3BhY2UpOyAgICAgICAgICAgIAotICAgICAgfQotICAgICAgICAKLSAgICAgIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBzZXRFbGVtZW50T3BlcmF0aW9uID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgLy8gVXNlIHRoZSBhbmltYXRlZCBmbGF2b3VyIGFzIHdlIGRvbid0IGtub3cgYmVmb3JlaGFuZCBob3cgbWFueSB0aWNrcyB3ZSBuZWVkLgotICAgICAgICAgIC8vIFRoZSB0YXNrIG5hbWUgd2lsbCBiZSBkaXNwbGF5ZWQgYnkgdGhlIGNvZGUgaW4gWFNEUmVzb3VyY2VJbXBsLgotICAgICAgICAgIAotICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCIiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgTWFwIGxvYWRPcHRpb25zID0gcmVzb3VyY2VTZXQuZ2V0TG9hZE9wdGlvbnMoKTsKLSAgICAgICAgICBsb2FkT3B0aW9ucy5wdXQoWFNEUmVzb3VyY2VJbXBsLlhTRF9QUk9HUkVTU19NT05JVE9SLCBtb25pdG9yKTsKLSAgICAgICAgICAKLSAgICAgICAgICBzY2hlbWEuc2V0RWxlbWVudChlbGVtZW50KTsKLSAgICAgICAgICAKLSAgICAgICAgICBsb2FkT3B0aW9ucy5yZW1vdmUoWFNEUmVzb3VyY2VJbXBsLlhTRF9QUk9HUkVTU19NT05JVE9SKTsKLSAgICAgICAgfQotICAgICAgfTsKLQotICAgICAgSVByb2dyZXNzU2VydmljZSBwcm9ncmVzc1NlcnZpY2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHByb2dyZXNzU2VydmljZS5idXN5Q3Vyc29yV2hpbGUoc2V0RWxlbWVudE9wZXJhdGlvbik7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB9ICAgICAgIAotICAgICAgICAKLSAgICAgIC8vIGF0dGFjaCBhbiBhZGFwdGVyIHRvIGtlZXAgdGhlIFhTRCBtb2RlbCBhbmQgRE9NIGluIHN5bmMKLSAgICAgIC8vCi0gICAgICBtb2RlbFJlY29uY2lsZUFkYXB0ZXIgPSBuZXcgWFNETW9kZWxSZWNvbmNpbGVBZGFwdGVyKGRvY3VtZW50LCBzY2hlbWEpOwotICAgICAgZG9tTm9kZS5nZXRNb2RlbCgpLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcihtb2RlbFJlY29uY2lsZUFkYXB0ZXIpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgIHsKLSAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gc2NoZW1hOyAgICAKLSAgfQotICAKLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkCi0gICAqLwotICBwdWJsaWMgWFNEU2NoZW1hIGNyZWF0ZVNjaGVtYShFbGVtZW50IGVsZW1lbnQpCi0gIHsgICAgIAotICAgIHJldHVybiBjcmVhdGVTY2hlbWEoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICB9Ci0KLSAgcHVibGljIFhTRFNjaGVtYSByZXNldFNjaGVtYShEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIC8vIFRoZSBkb2N1bWVudCBoYXMgY2hhbmdlZCBzbyB0aGUgc2NoZW1hIHNob3VsZCBiZSB1cGRhdGVkIGFzIHdlbGwuCi0gICAgdHJ5Ci0gICAgewotICAgICAgSURPTU5vZGUgZG9tTm9kZSA9IChJRE9NTm9kZSlkb2N1bWVudDsKLSAgICAgIHNjaGVtYS5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0gICAgICBzY2hlbWEuc2V0RWxlbWVudChkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0KLSAgICAgIHJlc291cmNlU2V0ID0gc2NoZW1hLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0gICAgICAKLSAgICAgIFN0cmluZyBiYXNlTG9jYXRpb24gPSBkb21Ob2RlLmdldE1vZGVsKCkuZ2V0QmFzZUxvY2F0aW9uKCk7ICAgICAgICAgICAKLSAgICAgIFVSSSB1cmkgPSBnZXRVUkkoYmFzZUxvY2F0aW9uKTsKLSAgICAgIHNjaGVtYS5lUmVzb3VyY2UoKS5zZXRVUkkodXJpKTsKLQotICAgICAgbW9kZWxSZWNvbmNpbGVBZGFwdGVyID0gbmV3IFhTRE1vZGVsUmVjb25jaWxlQWRhcHRlcihkb2N1bWVudCwgc2NoZW1hKTsKLSAgICAgIGRvbU5vZGUuZ2V0TW9kZWwoKS5hZGRNb2RlbFN0YXRlTGlzdGVuZXIobW9kZWxSZWNvbmNpbGVBZGFwdGVyKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBzY2hlbWE7Ci0gIH0gIAotCi0gIHB1YmxpYyBzdGF0aWMgWFNETW9kZWxBZGFwdGVyIGxvb2t1cE9yQ3JlYXRlTW9kZWxBZGFwdGVyKERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgWFNETW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOwotICAgIGlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpCi0gICAgewotICAgICAgSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKWRvY3VtZW50OwotICAgICAgYWRhcHRlciA9IChYU0RNb2RlbEFkYXB0ZXIpbm90aWZpZXIuZ2V0QWRhcHRlckZvcihYU0RNb2RlbEFkYXB0ZXIuY2xhc3MpOwotICAgICAgaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYWRhcHRlciA9IG5ldyBYU0RNb2RlbEFkYXB0ZXIoKTsKLSAgICAgICAgbm90aWZpZXIuYWRkQWRhcHRlcihhZGFwdGVyKTsKLSAgICAgIH0gCi0gICAgfSAgIAotICAgIHJldHVybiBhZGFwdGVyOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFhTRFNjaGVtYSBsb29rdXBPckNyZWF0ZVNjaGVtYShmaW5hbCBEb2N1bWVudCBkb2N1bWVudCkKLSAgeyAgICAKLSAgICBYU0RTY2hlbWEgcmVzdWx0ID0gbnVsbDsgICAgCi0gICAgWFNETW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBsb29rdXBPckNyZWF0ZU1vZGVsQWRhcHRlcihkb2N1bWVudCk7ICAgICAgCi0gICAgaWYgKGFkYXB0ZXIuZ2V0U2NoZW1hKCkgPT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIAotICAgICAgYWRhcHRlci5jcmVhdGVTY2hlbWEoZG9jdW1lbnQpOyAKLSAgICB9ICAgCi0gICAgcmVzdWx0ID0gYWRhcHRlci5nZXRTY2hlbWEoKTsgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsgICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgVVJJIGdldFVSSShTdHJpbmcgYmFzZUxvY2F0aW9uKQotICB7Ci0gICAgVVJJIHVyaSA9IG51bGw7Ci0gICAgaWYgKGJhc2VMb2NhdGlvbi5zdGFydHNXaXRoKCIvIikpCi0gICAgewotICAgICAgdXJpID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoYmFzZUxvY2F0aW9uKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYmFzZUxvY2F0aW9uLnN0YXJ0c1dpdGgoImh0dHAiKSkKLSAgICB7Ci0gICAgICB1cmkgPSBVUkkuY3JlYXRlVVJJKGJhc2VMb2NhdGlvbik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB1cmkgPSBVUkkuY3JlYXRlRmlsZVVSSShiYXNlTG9jYXRpb24pOwotICAgIH0KLSAgICByZXR1cm4gdXJpOwotICB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdGV4dC9YU0RNb2RlbFF1ZXJ5RXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC90ZXh0L1hTRE1vZGVsUXVlcnlFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxMTRkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC90ZXh0L1hTRE1vZGVsUXVlcnlFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb24uTW9kZWxRdWVyeUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tLk5vZGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5UeXBlc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1wdWJsaWMgY2xhc3MgWFNETW9kZWxRdWVyeUV4dGVuc2lvbiBleHRlbmRzIE1vZGVsUXVlcnlFeHRlbnNpb24KLXsKLSAgcHVibGljIFhTRE1vZGVsUXVlcnlFeHRlbnNpb24oKQotICB7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0QXR0cmlidXRlVmFsdWVzKEVsZW1lbnQgZSwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgU3RyaW5nIGN1cnJlbnRFbGVtZW50TmFtZSA9IGUuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgTm9kZSBwYXJlbnROb2RlID0gZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgU3RyaW5nIHBhcmVudE5hbWUgPSBwYXJlbnROb2RlICE9IG51bGwgPyBwYXJlbnROb2RlLmdldExvY2FsTmFtZSgpIDogIiI7Ci0gICAgaWYgKGNoZWNrTmFtZShuYW1lLCAidHlwZSIpKQotICAgIHsKLSAgICAgIGlmIChjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAiYXR0cmlidXRlIikpCi0gICAgICB7Ci0gICAgICAgIGxpc3QgPSBnZXRUeXBlc0hlbHBlcihlKS5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdDIoKTsKLSAgICAgICAgbGlzdC5hZGRBbGwoZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAiZWxlbWVudCIpKQotICAgICAgewotICAgICAgICBsaXN0ID0gZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QyKCk7Ci0gICAgICAgIGxpc3QuYWRkQWxsKGdldFR5cGVzSGVscGVyKGUpLmdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KCkpOwotICAgICAgICBsaXN0LmFkZEFsbChnZXRUeXBlc0hlbHBlcihlKS5nZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGNoZWNrTmFtZShuYW1lLCAiYmxvY2tEZWZhdWx0IikgfHwgY2hlY2tOYW1lKG5hbWUsICJmaW5hbERlZmF1bHQiKSkKLSAgICB7Ci0gICAgICBsaXN0LmFkZCgiI2FsbCIpOwotICAgICAgbGlzdC5hZGQoInN1YnN0aXR1dGlvbiIpOwotICAgICAgbGlzdC5hZGQoImV4dGVuc2lvbiIpOwotICAgICAgbGlzdC5hZGQoInJlc3RyaWN0aW9uIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNoZWNrTmFtZShuYW1lLCAibmFtZXNwYWNlIikpCi0gICAgewotICAgICAgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJhbnkiKSB8fCBjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAiYW55QXR0cmlidXRlIikpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKCIjI2FueSIpOwotICAgICAgICBsaXN0LmFkZCgiIyNvdGhlciIpOwotICAgICAgICBsaXN0LmFkZCgiIyN0YXJnZXROYW1lc3BhY2UiKTsKLSAgICAgICAgbGlzdC5hZGQoIiMjbG9jYWwiKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoY2hlY2tOYW1lKG5hbWUsICJtYXhPY2N1cnMiKSkKLSAgICB7Ci0gICAgICBsaXN0LmFkZCgiMSIpOwotICAgICAgbGlzdC5hZGQoInVuYm91bmRlZCIpOwotICAgIH0KLSAgICBlbHNlIGlmIChjaGVja05hbWUobmFtZSwgIm1pbk9jY3VycyIpKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKCIwIik7Ci0gICAgICBsaXN0LmFkZCgiMSIpOwotICAgIH0KLSAgICBlbHNlIGlmIChjaGVja05hbWUobmFtZSwgIml0ZW1UeXBlIikpCi0gICAgewotICAgICAgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJsaXN0IikpCi0gICAgICB7Ci0gICAgICAgIGlmIChjaGVja05hbWUocGFyZW50TmFtZSwgInNpbXBsZVR5cGUiKSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QgPSBnZXRUeXBlc0hlbHBlcihlKS5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpOwotICAgICAgICAgIGxpc3QuYWRkQWxsKGdldFR5cGVzSGVscGVyKGUpLmdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGNoZWNrTmFtZShuYW1lLCAibWVtYmVyVHlwZXMiKSkKLSAgICB7Ci0gICAgICBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgInVuaW9uIikpCi0gICAgICB7Ci0gICAgICAgIGlmIChjaGVja05hbWUocGFyZW50TmFtZSwgInNpbXBsZVR5cGUiKSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QgPSBnZXRUeXBlc0hlbHBlcihlKS5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpOwotICAgICAgICAgIGxpc3QuYWRkQWxsKGdldFR5cGVzSGVscGVyKGUpLmdldFVzZXJTaW1wbGVUeXBlTmFtZXNMaXN0KCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGNoZWNrTmFtZShuYW1lLCAiYmFzZSIpKQotICAgIHsKLSAgICAgIGlmIChjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAicmVzdHJpY3Rpb24iKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoZWNrTmFtZShwYXJlbnROYW1lLCAic2ltcGxlVHlwZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCk7Ci0gICAgICAgICAgbGlzdC5hZGRBbGwoZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY2hlY2tOYW1lKHBhcmVudE5hbWUsICJzaW1wbGVDb250ZW50IikpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0ID0gZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKTsKLSAgICAgICAgICBsaXN0LmFkZEFsbChnZXRUeXBlc0hlbHBlcihlKS5nZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY2hlY2tOYW1lKHBhcmVudE5hbWUsICJjb21wbGV4Q29udGVudCIpKQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCk7Ci0gICAgICAgICAgbGlzdC5hZGRBbGwoZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0VXNlckNvbXBsZXhUeXBlTmFtZXNMaXN0KCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAiZXh0ZW5zaW9uIikpCi0gICAgICB7Ci0gICAgICAgIGlmIChjaGVja05hbWUocGFyZW50TmFtZSwgInNpbXBsZUNvbnRlbnQiKSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QgPSBnZXRUeXBlc0hlbHBlcihlKS5nZXRCdWlsdEluVHlwZU5hbWVzTGlzdCgpOwotICAgICAgICAgIGxpc3QuYWRkQWxsKGdldFR5cGVzSGVscGVyKGUpLmdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjaGVja05hbWUocGFyZW50TmFtZSwgImNvbXBsZXhDb250ZW50IikpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0ID0gZ2V0VHlwZXNIZWxwZXIoZSkuZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKTsKLSAgICAgICAgICBsaXN0LmFkZEFsbChnZXRUeXBlc0hlbHBlcihlKS5nZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoY2hlY2tOYW1lKG5hbWUsICJyZWYiKSkKLSAgICB7Ci0gICAgICBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgImVsZW1lbnQiKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldEdsb2JhbEVsZW1lbnRzKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAiYXR0cmlidXRlIikpCi0gICAgICB7Ci0gICAgICAgIGxpc3QgPSBnZXRUeXBlc0hlbHBlcihlKS5nZXRHbG9iYWxBdHRyaWJ1dGVzKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjaGVja05hbWUoY3VycmVudEVsZW1lbnROYW1lLCAiYXR0cmlidXRlR3JvdXAiKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdCA9IGdldFR5cGVzSGVscGVyKGUpLmdldEdsb2JhbEF0dHJpYnV0ZUdyb3VwcygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgImdyb3VwIikpCi0gICAgICB7Ci0gICAgICAgIGxpc3QgPSBnZXRUeXBlc0hlbHBlcihlKS5nZXRNb2RlbEdyb3VwcygpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChjaGVja05hbWUobmFtZSwgInN1YnN0aXR1dGlvbkdyb3VwIikpCi0gICAgewotICAgICAgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJlbGVtZW50IikpCi0gICAgICB7Ci0gICAgICAgIGxpc3QgPSBnZXRUeXBlc0hlbHBlcihlKS5nZXRHbG9iYWxFbGVtZW50cygpOwotICAgICAgfQotICAgIH0KLSAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlQ2hpbGRFbGVtZW50KE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBpZiAoWFNEQ29uc3RhbnRzLkFQUElORk9fRUxFTUVOVF9UQUcuZXF1YWxzKHBhcmVudE5vZGUuZ2V0Tm9kZU5hbWUoKSkgJiYKLSAgICAgICAgWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLmVxdWFscyhuYW1lc3BhY2UpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgIAotICAgIC8vIHdlIGFzc3VtZSB0aGF0IG90aGVyIG5vZGVzIGRvbid0IHdhbnQgc2NoZW1hIG5vZGVzIGFzIGV4dGVuc2lvbiBlbGVtZW50cwotICAgIC8vIFRPRE8uLi4gY3M6IHdlIHJlYWxseSBuZWVkIHRvIGRlZmluZSBjdXN0aW1pemF0aW9ucyBmb3IgZmlsdGVyaW5nIGJhc2VkIG9uIHBhcmVudC9jaGlsZAotICAgIC8vIG5hbWVzcGFjZSBwYWlycyB0byBhY2N1cmF0ZWx5IGhhbmRsZSB0aGlzICAgIAotICAgIFN0cmluZyBwYXJlbnRFbGVtZW50TmFtZXNwYWNlVVJJID0gcGFyZW50Tm9kZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICBpZiAoIVhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMS5lcXVhbHMocGFyZW50RWxlbWVudE5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLmVxdWFscyhuYW1lc3BhY2UpKQotICAgIHsKLSAgICAgICByZXR1cm4gZmFsc2U7ICAgCi0gICAgfQotICAgIAotICAgIGlmICghWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLmVxdWFscyhuYW1lc3BhY2UpKQotICAgIHsgIAotICAgICAgTm9kZUZpbHRlciBmaWx0ZXIgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0Tm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeSgpLmdldE5vZGVGaWx0ZXIobmFtZXNwYWNlKTsKLSAgICAgIGlmIChmaWx0ZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbHRlci5pc0FwcGxpY2FibGVDb250ZXh0KHBhcmVudE5vZGUsIE5vZGUuRUxFTUVOVF9OT0RFLCBuYW1lc3BhY2UsIG5hbWUpOwotICAgICAgfSAgICAgCi0gICAgfQotICAgICAKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCBYU0RTY2hlbWEgbG9va3VwT3JDcmVhdGVTY2hlbWEoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICByZXR1cm4gWFNETW9kZWxBZGFwdGVyLmxvb2t1cE9yQ3JlYXRlU2NoZW1hKGRvY3VtZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIFhTRFNjaGVtYSBsb29rdXBPckNyZWF0ZVNjaGVtYUZvckVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIGxvb2t1cE9yQ3JlYXRlU2NoZW1hKGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBUeXBlc0hlbHBlciBnZXRUeXBlc0hlbHBlcihFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBYU0RTY2hlbWEgc2NoZW1hID0gbG9va3VwT3JDcmVhdGVTY2hlbWEoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgIHJldHVybiBuZXcgVHlwZXNIZWxwZXIoc2NoZW1hKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGNoZWNrTmFtZShTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgdG9rZW4pCi0gIHsKLSAgICBpZiAobG9jYWxOYW1lICE9IG51bGwgJiYgbG9jYWxOYW1lLnRyaW0oKS5lcXVhbHModG9rZW4pKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC90ZXh0L1hTRE1vZGVsUmVjb25jaWxlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdGV4dC9YU0RNb2RlbFJlY29uY2lsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhNmRiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC90ZXh0L1hTRE1vZGVsUmVjb25jaWxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRXVnZW5lIE9zdHJvdWtob3YsIGV1Z2VuZUBnZW51aXRlYy5jb20gLSBbMjAzMjkxXSBYU0QgRWRpdG9yIFNvdXJjZSBTdGF0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHVwZGF0ZWQgaW4gT3V0bGluZS9HcmFwaAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5Nb2RlbFJlY29uY2lsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFhTRE1vZGVsUmVjb25jaWxlQWRhcHRlciBleHRlbmRzIE1vZGVsUmVjb25jaWxlQWRhcHRlcgotewotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHNjaGVtYTsKLSAgCi0gIHB1YmxpYyBYU0RNb2RlbFJlY29uY2lsZUFkYXB0ZXIoRG9jdW1lbnQgZG9jdW1lbnQsIFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBzdXBlcihkb2N1bWVudCk7Ci0gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZU5vZGVDaGFuZ2VkKE5vZGUgbm9kZSkKLSAgewotICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBub2RlIGlzIGluIHRoZSBYU0QgU2NoZW1hIG5hbWVzcGFjZS4gV2UgZG9uJ3QgbmVlZCB0byAKLSAgICAvLyByZWNvbmNpbGUgdGhlIG1vZGVsIGZvciBvdGhlciBub2RlcyBsaWtlIHRleHQgb3Igbm9kZXMgaW4gb3RoZXIgbmFtZXNwYWNlcwotICAgIC8vIGxpa2UgdGhlIG9uZXMgbm9ybWFsbHkgb2NjdXJyaW5nIGluIGFubm90YXRpb25zLgotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICghc2hvdWxkUmVjb25jaWxlTW9kZWxGb3Iobm9kZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0KLSAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgeyAgCi0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCA9IHNjaGVtYS5nZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KG5vZGUpOyAgICAKLSAgICAgIGNvbmNyZXRlQ29tcG9uZW50LmVsZW1lbnRDaGFuZ2VkKChFbGVtZW50KW5vZGUpOwotICAgIH0KLSAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpCi0gICAgewotICAgICAgLy8gVGhlIGRvY3VtZW50IGNoYW5nZWQgc28gd2UgbWF5IG5lZWQgdG8gZml4IHVwIHRoZSAKLSAgICAgIC8vIGRlZmluaXRpb24ncyByb290IGVsZW1lbnQKLSAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gKERvY3VtZW50KW5vZGU7ICAgIAotICAgICAgRWxlbWVudCBzY2hlbWFFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICBpZiAoc2NoZW1hRWxlbWVudCAhPSBudWxsICYmIHNjaGVtYUVsZW1lbnQgIT0gc2NoZW1hLmdldEVsZW1lbnQoKSkKLSAgICAgIHsgICAKLSAgICAgICAgLy8gaGVyZSB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYSBuZXcgJ3NjaGVtYScgZWxlbWVudCB3YXMgYWRkZWQKLSAgICAgICAgLy8oZS5nLiB0aGUgZmlsZSB3YXMgdG90YWxseSBibGFuayBhbmQgdGhlbiB3ZSB0eXBlIGluIHRoZSByb290IGVsZW1lbnQpICAgICAgICAKLSAgICAgICAgLy8KLSAgICAgICAgaWYgKHNjaGVtYUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFhTRENvbnN0YW50cy5TQ0hFTUFfRUxFTUVOVF9UQUcpKSAgICAgICAgIAotICAgICAgICB7ICAKLSAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiKioqKioqIFNldHRpbmcgbmV3IHNjaGVtYSIpOwotICAgICAgICAgIHNjaGVtYS5zZXRFbGVtZW50KHNjaGVtYUVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgCi0gICAgICBlbHNlIGlmIChzY2hlbWFFbGVtZW50ICE9IG51bGwpCi0gICAgICB7ICAgICAgIAotICAgICAgICAvLyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGRlZmluaXRpb24gZWxlbWVudCdzIGNvbnRlbnQgaGFzIGNoYW5nZWQKLSAgICAgICAgLy8gVE9ETyAoY3MpIGRvIHdlIHJlYWxseSBuZWVkIHRvIGhhbmRsZSB0aGlzIGNhc2U/Ci0gICAgICAgIHNjaGVtYS5lbGVtZW50Q2hhbmdlZChzY2hlbWFFbGVtZW50KTsKLSAgICAgIH0gICAgICAKLSAgICAgIGVsc2UgaWYgKHNjaGVtYUVsZW1lbnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gaWYgdGhlcmUncyBubyByb290IGVsZW1lbnQgY2xlYXIgb3V0IHRoZSBzY2hlbWEKLSAgICAgICAgLy8KLSAgICAgICAgCi0gICAgICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMDMyOTEKLSAgICAgICAgLy8gQWRkIHRyeS1jYXRjaCB0byB3b3JrLWFyb3VuZCBwcm9ibGVtIGF0IAotICAgICAgICAvLyBYU0RDb25jcmV0ZUNvbXBvbmVudEltcGwuZm9yY2VOaWNlUmVtb3ZlQ2hpbGQoWFNEQ29uY3JldGVDb21wb25lbnRJbXBsLmphdmE6MTY5NikKLSAgICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBzdGF0ZW1lbnRzIGJlbG93IGRvbid0IGdldCBydW4KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBzY2hlbWEuZ2V0Q29udGVudHMoKS5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gd29ya2Fyb3VuZAotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETyAoY3MpIEknbSBub3Qgc3VyZSB3aHkgdGhlIGFib3ZlIGlzbid0IGVub3VnaAotICAgICAgICAvLyB0byBjbGVhciBvdXQgYWxsIG9mIHRoZSBjb21wb25lbnQgbGlzdHMKLSAgICAgICAgLy8gZm9yIG5vdyBJJ3ZlIGp1c3QgYWRkZWQgYSBmZXcgbW9yZSBsaW5lcyB0byBkbyBhZGRpdGlvbmFsIGNsZWFyaW5nCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFNlZSBjb21tZW50IGFib3ZlIGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAzMjkxCi0gICAgICAgIHRyeSB7IHNjaGVtYS5nZXRJbmNvcnBvcmF0ZWRWZXJzaW9ucygpLmNsZWFyKCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IH0KLSAgICAgICAgdHJ5IHsgc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKS5jbGVhcigpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgICAgICAgdHJ5IHsgc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpLmNsZWFyKCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICAgICAgICB0cnkgeyBzY2hlbWEuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb25zKCkuY2xlYXIoKTsgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgIHRyeSB7IHNjaGVtYS5nZXRNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKS5jbGVhcigpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgICAgICAgdHJ5IHsgc2NoZW1hLmdldEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMoKS5jbGVhcigpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30gICAgIAotICAgICAgICB0cnkgeyBzY2hlbWEuc2V0VGFyZ2V0TmFtZXNwYWNlKG51bGwpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgICAgICAgdHJ5IHsgc2NoZW1hLnJlc2V0KCk7IH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCi0gICAgICAgIHNjaGVtYS5zZXRFbGVtZW50KG51bGwpOwotICAgICAgfSAgICAgIAotICAgIH0gCi0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIGlmIGEgY2hhbmdlIHRvIHRoZSBnaXZlbiBub2RlIHNob3VsZCB0cmlnZ2VyIGEgbW9kZWwgdXBkYXRlLgotICAgKiAKLSAgICogQHBhcmFtIGNoYW5nZWROb2RlCi0gICAqICAgICAgICAgIHRoZSBET00gbm9kZSB0byB0ZXN0LgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNoYW5nZSB0byB0aGUgZ2l2ZW4gbm9kZSBzaG91bGQgdHJpZ2dlciBhIG1vZGVsIHVwZGF0ZS4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHNob3VsZFJlY29uY2lsZU1vZGVsRm9yKE5vZGUgY2hhbmdlZE5vZGUpCi0gIHsKLSAgICAvLyBObyBuZWVkIHRvIHJlY29uY2lsZSBpZiB0aGUgbm9kZSBpcyBpbiBhIGRpZmZlcmVudCBuYW1lc3BhY2UgYXMgaXQgaXMgdGhlCi0gICAgLy8gY2FzZSBmb3Igbm9kZXMgZGVlcGx5IG5lc3RlZCBpbiBhcHBpbmZvIG9yIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0KLSAgICAvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjAzMjkxCi0gICAgaWYgKGNoYW5nZWROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgU3RyaW5nIG5vZGVOYW1lc3BhY2UgPSBjaGFuZ2VkTm9kZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICBTdHJpbmcgc2NoZW1hTmFtZXNwYWNlID0gc2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSgpOwotICAgIC8vIElmIHRoZSBkb2N1bWVudCBub2RlIGNoYW5nZXMsIHRoZW4gdGhlIG5vZGVOYW1lc3BhY2UgaXMgbnVsbAotICAgIC8vIHNvIHdlIGRvIHdhbnQgdG8gcmVjb25jaWxlLiAgVGhpcyBjaGFuZ2UgaXMgbmVlZGVkIGZvcgotICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDg4NDIgYW5kCi0gICAgLy8gcmVhZCBvbmx5IGZpbGUgc3VwcG9ydC4KLSAgICBpZiAoIXNjaGVtYU5hbWVzcGFjZS5lcXVhbHMobm9kZU5hbWVzcGFjZSkgJiYgbm9kZU5hbWVzcGFjZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBXaGVuIGEgY2hpbGQgbm9kZSBpcyBhZGRlZCB0byBhbiBhcHBpbmZvIG9yIGRvY3VtZW50YXRpb24gZWxlbWVudAotICAgIC8vIE5vIG5lZWQgdG8gcmVjb25jaWxlIGlmIHRoZSBub2RlIGlzIHRoZSBmaXJzdCBjaGlsZCBvZiBhcHBpbmZvIG9yIGRvY3VtZW50YXRpb24KLSAgICAvLyBlbGVtZW50cy4KLQotICAgIE5vZGUgcGFyZW50Tm9kZSA9IGNoYW5nZWROb2RlLmdldFBhcmVudE5vZGUoKTsKLQotICAgIGlmIChwYXJlbnROb2RlICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIG5vZGVOYW1lID0gY2hhbmdlZE5vZGUuZ2V0TG9jYWxOYW1lKCk7Ci0KLSAgICAgIGlmIChYU0RDb25zdGFudHMuQVBQSU5GT19FTEVNRU5UX1RBRy5lcXVhbHMobm9kZU5hbWUpIHx8IFhTRENvbnN0YW50cy5ET0NVTUVOVEFUSU9OX0VMRU1FTlRfVEFHLmVxdWFscyhub2RlTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNEaXJ0eSkKLSAgewotICAgIGlmICghaXNEaXJ0eSkKLSAgICB7Ci0gICAgICAvLyBUT0RPIG5lZWQgYSB3YXkgdG8gdGVsbCB0aGUgdmlld3MgdG8gc3RvcCByZWZyZXNoaW5nICh0ZW1wb3JhcmlseSkKLSAgICAgIC8vCi0gICAgICAvKgotICAgICAgc2NoZW1hLnJlc2V0KCk7Ci0gICAgICAKLSAgICAgIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlIHJlZmVyZW5jZXMgZG9uJ3QgZ2V0IGZpeGVkIHVwIHdoZW4gYW4gaW1wb3J0IGlzIHJlbW92ZWQKLSAgICAgIC8vIGV2ZW4gaWYgd2UgY2FsbCBzY2hlbWEucmVzZXQoKSBleHBsaWN0bHkuICBUbyB3b3JrIGFyb3VuZCB0aGlzICB3ZSBpdGVyYXRlIHRocnUKLSAgICAgIC8vIHRoZSB0eXBlIHJlZmVyZW5jZXMgYW5kIHJlY29tcHV0ZSB0aGVtIGluY2FzZSBhIHNjaGVtYSBkaWQgaW5mYWN0IGNoYW5nZQotICAgICAgLy8KLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsgIAotICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb25JbXBsIGVkID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbkltcGwpaS5uZXh0KCk7Ci0gICAgICAgIC8vZWQuZWxlbWVudEF0dHJpYnV0ZXNDaGFuZ2VkKGVkLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gZWQuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgdGQgPSBlZC5yZXNvbHZlVHlwZURlZmluaXRpb24odGQuZ2V0U2NoZW1hKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHRkLmdldE5hbWUoKSk7ICAgICAgICAKLSAgICAgICAgZWQuc2V0VHlwZURlZmluaXRpb24odGQpOwotICAgICAgfSovICAKLSAgICB9Ci0gIH0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvRG9jdW1lbnRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL0RvY3VtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzEzM2M1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvRG9jdW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1hYnN0cmFjdCBjbGFzcyBEb2N1bWVudEFkYXB0ZXIgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIKLXsKLSAgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0KLSAgcHVibGljIERvY3VtZW50QWRhcHRlcihEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsKLSAgICAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5hZGRBZGFwdGVyKHRoaXMpOwotICAgIGFkYXB0Q2hpbGRFbGVtZW50cyhkb2N1bWVudCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYWRhcHRDaGlsZEVsZW1lbnRzKE5vZGUgcGFyZW50Tm9kZSkKLSAgewotICAgIGZvciAoTm9kZSBjaGlsZCA9IHBhcmVudE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpCi0gICAgewotICAgICAgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0gICAgICAgIGFkYXB0KChFbGVtZW50KSBjaGlsZCk7Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRhcHQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgaWYgKCgoSU5vZGVOb3RpZmllcikgZWxlbWVudCkuZ2V0RXhpc3RpbmdBZGFwdGVyKHRoaXMpID09IG51bGwpCi0gICAgewotICAgICAgKChJTm9kZU5vdGlmaWVyKSBlbGVtZW50KS5hZGRBZGFwdGVyKHRoaXMpOwotICAgICAgYWRhcHRDaGlsZEVsZW1lbnRzKGVsZW1lbnQpOyAgCi0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgewotICAgIHJldHVybiB0eXBlID09IHRoaXM7Ci0gIH0KLQotICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KTsKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL01vZGVsUmVjb25jaWxlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9Nb2RlbFJlY29uY2lsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY4NTY3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL01vZGVsUmVjb25jaWxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbFN0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZGVsUmVjb25jaWxlQWRhcHRlciBleHRlbmRzIERvY3VtZW50QWRhcHRlciBpbXBsZW1lbnRzIElNb2RlbFN0YXRlTGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxpbmdOb3RpZnlDaGFuZ2VkID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBMaXN0IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCi0gIHB1YmxpYyBNb2RlbFJlY29uY2lsZUFkYXB0ZXIoRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBzdXBlcihkb2N1bWVudCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb2RlQWRhcHRlciBsaXN0ZW5lcikKLSAgewotICAgIGlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkKLSAgICB7Ci0gICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICB9ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vZGVBZGFwdGVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gIH0gIAotICAKLSAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGxpc3RlbmVycyk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIElOb2RlQWRhcHRlciBhZGFwdGVyID0gKElOb2RlQWRhcHRlcilpLm5leHQoKTsKLSAgICAgIGFkYXB0ZXIubm90aWZ5Q2hhbmdlZChub3RpZmllciwgZXZlbnRUeXBlLCBjaGFuZ2VkRmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBwb3MpOwotICAgIH0gIAotICB9Ci0gICAgICAKLSAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCkKLSAgewotICAgIGlmICghaGFuZGxpbmdOb3RpZnlDaGFuZ2VkKQotICAgIHsKLSAgICAgIGhhbmRsaW5nTm90aWZ5Q2hhbmdlZCA9IHRydWU7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaGFuZGxlTm90aWZ5Q2hhbmdlKG5vdGlmaWVyLCBldmVudFR5cGUsIGZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOwotICAgICAgICBub3RpZnlMaXN0ZW5lcnMobm90aWZpZXIsIGV2ZW50VHlwZSwgZmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBpbmRleCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0vLyAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLndyaXRlKGUpOwotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICBoYW5kbGluZ05vdGlmeUNoYW5nZWQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZU5vZGVDaGFuZ2VkKE5vZGUgbm9kZSkKLSAgeyAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgaGFuZGxlTm90aWZ5Q2hhbmdlKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KQotICB7Ci0gICAgTm9kZSBub2RlID0gKE5vZGUpbm90aWZpZXI7Ci0gICAgc3dpdGNoIChldmVudFR5cGUpCi0gICAgewotICAgICAgY2FzZSBJTm9kZU5vdGlmaWVyLkFERDoKLSAgICAgIHsKLSAgICAgICAgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KW5ld1ZhbHVlOwotICAgICAgICAgIGFkYXB0KGVsZW1lbnQpOwotICAgICAgICB9ICAKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIElOb2RlTm90aWZpZXIuUkVNT1ZFOgotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgSU5vZGVOb3RpZmllci5DSEFOR0U6Ci0gICAgICBjYXNlIElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQ6Ci0gICAgICB7IAotICAgICAgICBoYW5kbGVOb2RlQ2hhbmdlZChub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAKLSAgICAgIGNhc2UgSU5vZGVOb3RpZmllci5DT05URU5UX0NIQU5HRUQ6Ci0gICAgICB7Ci0gICAgICAgIC8vIElmIHRoZSBvbmx5IHRoaW5nIGNoYW5nZWQgd2FzIHRoZSBjb250ZW50IG9mIGEgdGV4dCBub2RlCi0gICAgICAgIC8vIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byByZWNvbmNpbGUuCi0gICAgICAgIAotICAgICAgICBpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIFRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaGFuZGxlTm9kZUNoYW5nZWQobm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAgICAgICAgICAgICAKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RlbENoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBib29sZWFuIGlzRGlydHkpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1vZGVsUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9TZWxlY3Rpb25BZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1NlbGVjdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMwNzg0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1NlbGVjdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VsZWN0aW9uQWRhcHRlciBpbXBsZW1lbnRzIElTZWxlY3Rpb25Qcm92aWRlcgotewotICBwcm90ZWN0ZWQgTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByb3RlY3RlZCBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0gIHByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgZXZlbnRTb3VyY2U7Ci0KLSAgcHVibGljIHZvaWQgc2V0RXZlbnRTb3VyY2UoSVNlbGVjdGlvblByb3ZpZGVyIGV2ZW50U291cmNlKQotICB7Ci0gICAgdGhpcy5ldmVudFNvdXJjZSA9IGV2ZW50U291cmNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIAotICB7Ci0gICAgbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0aW9uOwotICB9ICAgIAotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBzcGVjaWFsaXplZCB0byByZXR1cm4gdGhlIGNvcnJlY3Qgb2JqZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlICdvdGhlcicgbW9kZWwKLSAgICovCi0gIGFic3RyYWN0IHByb3RlY3RlZCBPYmplY3QgZ2V0T2JqZWN0Rm9yT3RoZXJNb2RlbChPYmplY3Qgb2JqZWN0KTsKLQotICAgIAotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBtb2RlbFNlbGVjdGlvbikgIAotICB7IAotICAgIExpc3Qgb3RoZXJNb2RlbE9iamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKG1vZGVsU2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbiltb2RlbFNlbGVjdGlvbikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG1vZGVsT2JqZWN0ID0gaS5uZXh0KCk7IAotICAgICAgICBPYmplY3Qgb3RoZXJNb2RlbE9iamVjdCA9IGdldE9iamVjdEZvck90aGVyTW9kZWwobW9kZWxPYmplY3QpOyAgICAgICAKLSAgICAgICAgaWYgKG90aGVyTW9kZWxPYmplY3QgIT0gbnVsbCkKLSAgICAgICAgeyAKLSAgICAgICAgICBvdGhlck1vZGVsT2JqZWN0TGlzdC5hZGQob3RoZXJNb2RlbE9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgCi0gICAgU3RydWN0dXJlZFNlbGVjdGlvbiBub2RlU2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob3RoZXJNb2RlbE9iamVjdExpc3QpOwotICAgIHNlbGVjdGlvbiA9IG5vZGVTZWxlY3Rpb247Ci0gICAgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChldmVudFNvdXJjZSAhPSBudWxsID8gZXZlbnRTb3VyY2UgOiB0aGlzLCBub2RlU2VsZWN0aW9uKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3RlbmVyTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcilpLm5leHQoKTsKLSAgICAgIGxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1R5cGVzSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1R5cGVzSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MzZmOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9UeXBlc0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RJbXBvcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBUeXBlc0hlbHBlcgotewotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICBWZWN0b3IgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICBwdWJsaWMgVHlwZXNIZWxwZXIoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHRoaXMueHNkU2NoZW1hID0geHNkU2NoZW1hOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpCi0gIHsKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgY29udGVudHMgPSB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGNvbnRlbnRzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hQ29udGVudCBjb250ZW50ID0gKFhTRFNjaGVtYUNvbnRlbnQpIGNvbnRlbnRzLm5leHQoKTsKLSAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RJbXBvcnRJbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgWFNESW1wb3J0SW1wbCBhbkltcG9ydCA9IChYU0RJbXBvcnRJbXBsKSBjb250ZW50OwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhbkltcG9ydC5nZXRTY2hlbWFMb2NhdGlvbigpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGFuSW1wb3J0LmltcG9ydFNjaGVtYSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvLyBUT0RPIFRoaXMgbWV0aG9kIGFuZCBpdCdzIHZlcnkgc2ltaWxhciBnZXRCdWlsdEluVHlwZU5hbWVzTGlzdDIgc2hvdWxkIAotICAvLyBiZSByZXZpZXdlZCBhbmQgY29tYmluZWQgaWYgcG9zc2libGUuIEJvdGggc2VlbSB0byBiZSB1c2VkIGZyb20gCi0gIC8vIFhTRE1vZGVsUXVlcnlFeHRlbnNpb24gZm9yIGNvbnRlbnQgYXNzaXN0IHB1cnBvc2VzLgotICAKLSAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCkKLSAgewotICAgIExpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBwcmVmaXggPSB4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hUU5hbWVQcmVmaXgoKTsKLSAgICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hIHNjaGVtYUZvclNjaGVtYSA9IFhTRFNjaGVtYUltcGwuZ2V0U2NoZW1hRm9yU2NoZW1hKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjaGVtYUZvclNjaGVtYS5nZXRTaW1wbGVUeXBlSWRNYXAoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0ZCA9IChYU0RUeXBlRGVmaW5pdGlvbikgaS5uZXh0KCk7ICAKLSAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gdGQuZ2V0TmFtZSgpOyAKLSAgICAgICAgICBTdHJpbmcgcHJlZml4ZWROYW1lID0gKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApID8gcHJlZml4ICsgIjoiICsgbG9jYWxOYW1lIDogbG9jYWxOYW1lOyAKLSAgICAgICAgICBpdGVtcy5hZGQocHJlZml4ZWROYW1lKTsgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIC8vIGlzc3VlIChjcykgZG8gd2Ugc3RpbGwgbmVlZCB0aGlzPyAgaXQgY2FuIGxpa2VseSBiZSByZW1vdmUgbm93Ci0gIC8vIHdhcyB1c2VkIGZvciBjb250ZW50IGFzc2lzdCBidXQgSSBkb24ndCB0aGluayB3ZSByZWFsbHkgbmVlZCBpdAotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QyKCkKLSAgewotICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IHByZWZpeGVzID0gZ2V0UHJlZml4ZXNGb3JOYW1lc3BhY2UoeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSgpKTsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWFGb3JTY2hlbWEgPSBYU0RTY2hlbWFJbXBsLmdldFNjaGVtYUZvclNjaGVtYShYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gc2NoZW1hRm9yU2NoZW1hLmdldFNpbXBsZVR5cGVJZE1hcCgpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdGQgPSAoWFNEVHlwZURlZmluaXRpb24pIGkubmV4dCgpOyAgCi0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSB0ZC5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBwcmVmaXhlcy5zaXplKCkgPiAwID8gKFN0cmluZylwcmVmaXhlcy5nZXQoMCkgOiBudWxsOwotICAgICAgICBTdHJpbmcgcHJlZml4ZWROYW1lID0gKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApID8gcHJlZml4ICsgIjoiICsgbG9jYWxOYW1lIDogbG9jYWxOYW1lOyAKLSAgICAgICAgcmVzdWx0LmFkZChwcmVmaXhlZE5hbWUpOyAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKQotICB7Ci0gICAgVmVjdG9yIGl0ZW1zID0gbmV3IFZlY3RvcigpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVFeHRlcm5hbEltcG9ydEdsb2JhbHMoKTsKLSAgICAgIEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24gPSAoWFNEVHlwZURlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICBpZiAodHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGl0ZW1zLmFkZEFsbChnZXRQcmVmaXhlZE5hbWVzKHR5cGVEZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCB0eXBlRGVmaW5pdGlvbi5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaXRlbXMgPSAoVmVjdG9yKSBzb3J0TGlzdChpdGVtcyk7Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoKQotICB7Ci0gICAgVmVjdG9yIGl0ZW1zID0gbmV3IFZlY3RvcigpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVFeHRlcm5hbEltcG9ydEdsb2JhbHMoKTsKLSAgICAgIEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24gPSAoWFNEVHlwZURlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICBpZiAodHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgIHsKLQkJCSAgICBpdGVtcy5hZGRBbGwoZ2V0UHJlZml4ZWROYW1lcyh0eXBlRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgdHlwZURlZmluaXRpb24uZ2V0TmFtZSgpKSk7ICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGl0ZW1zID0gKFZlY3Rvcikgc29ydExpc3QoaXRlbXMpOwotICAgIH0KLSAgICByZXR1cm4gaXRlbXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRVc2VyU2ltcGxlVHlwZXMoKQotICB7Ci0gICAgVmVjdG9yIGl0ZW1zID0gbmV3IFZlY3RvcigpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVFeHRlcm5hbEltcG9ydEdsb2JhbHMoKTsKLSAgICAgIEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24gPSAoWFNEVHlwZURlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICBpZiAodHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGl0ZW1zLmFkZCh0eXBlRGVmaW5pdGlvbik7Ci0gICAgICAgICAgLy9pdGVtcy5hZGQodHlwZURlZmluaXRpb24uZ2V0UU5hbWUoeHNkU2NoZW1hKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIFdlIG5lZWQgdG8gYWRkIHRoZSBhbnlUeXBlCi0vLyAgICAgIGl0ZW1zLmFkZChnZXRQcmVmaXgoeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYU5hbWVzcGFjZSgpLCB0cnVlKSArICJhbnlUeXBlIik7Ci0gICAgICAKLSAgICAgIC8vICAgICAgaXRlbXMgPSBhZGRFeHRlcm5hbEltcG9ydGVkVXNlclNpbXBsZVR5cGVzKGl0ZW1zKTsKLSAgICAgIC8vaXRlbXMgPSAoVmVjdG9yKSBzb3J0TGlzdChpdGVtcyk7Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBucywgYm9vbGVhbiB3aXRoQ29sb24pCi0gIHsKLSAgICBTdHJpbmcga2V5ID0gIiI7Ci0KLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgTWFwIG1hcCA9IHhzZFNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgICBJdGVyYXRvciBpdGVyID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBrZXlPYmogPSBpdGVyLm5leHQoKTsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbWFwLmdldChrZXlPYmopOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS50b1N0cmluZygpLmVxdWFscyhucykpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoa2V5T2JqICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAga2V5ID0ga2V5T2JqLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBrZXkgPSAiIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICgha2V5LmVxdWFscygiIikpCi0gICAgICB7Ci0gICAgICAgIGlmICh3aXRoQ29sb24pCi0gICAgICAgIHsKLSAgICAgICAgICBrZXkgPSBrZXkgKyAiOiI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGtleTsKLSAgfQotCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRHbG9iYWxFbGVtZW50cygpCi0gIHsKLSAgICBWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpOwotICAgICAgaWYgKHhzZFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgaSA9IHhzZFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGkubmV4dCgpOwotICAgICAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudERlY2xhcmF0aW9uLmdldFFOYW1lKHhzZFNjaGVtYSk7Ci0gICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpdGVtcy5hZGQobmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyAgICAgIGl0ZW1zID0gYWRkRXh0ZXJuYWxJbXBvcnRlZEdsb2JhbEVsZW1lbnRzKGl0ZW1zKTsKLSAgICAgIGl0ZW1zID0gKFZlY3Rvcikgc29ydExpc3QoaXRlbXMpOwotICAgIH0KLSAgICByZXR1cm4gaXRlbXM7Ci0gIH0KLQotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0R2xvYmFsQXR0cmlidXRlcygpCi0gIHsKLSAgICBWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpOwotICAgICAgaWYgKHhzZFNjaGVtYS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBpID0geHNkU2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZURlY2xhcmF0aW9uID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICBpZiAoYXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPT0gbnVsbCB8fCAoYXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCAmJiAhYXR0cmlidXRlRGVjbGFyYXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKFhTRENvbnN0YW50cy5TQ0hFTUFfSU5TVEFOQ0VfVVJJXzIwMDEpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldFFOYW1lKHhzZFNjaGVtYSk7Ci0gICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpdGVtcy5hZGQobmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyAgICAgIGl0ZW1zID0gYWRkRXh0ZXJuYWxJbXBvcnRlZEF0dHJpYnV0ZXMoaXRlbXMpOwotICAgICAgaXRlbXMgPSAoVmVjdG9yKSBzb3J0TGlzdChpdGVtcyk7Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRHbG9iYWxBdHRyaWJ1dGVHcm91cHMoKQotICB7Ci0gICAgVmVjdG9yIGl0ZW1zID0gbmV3IFZlY3RvcigpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVFeHRlcm5hbEltcG9ydEdsb2JhbHMoKTsKLSAgICAgIGlmICh4c2RTY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cERlZmluaXRpb24gPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbi5nZXRRTmFtZSh4c2RTY2hlbWEpOwotICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXRlbXMuYWRkKG5hbWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gICAgICBpdGVtcyA9IGFkZEV4dGVybmFsSW1wb3J0ZWRBdHRyaWJ1dGVHcm91cHMoaXRlbXMpOwotICAgICAgaXRlbXMgPSAoVmVjdG9yKSBzb3J0TGlzdChpdGVtcyk7Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLSAgfQotCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRNb2RlbEdyb3VwcygpCi0gIHsKLSAgICBWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0ZUV4dGVybmFsSW1wb3J0R2xvYmFscygpOwotICAgICAgaWYgKHhzZFNjaGVtYS5nZXRNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBpID0geHNkU2NoZW1hLmdldE1vZGVsR3JvdXBEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXBEZWZpbml0aW9uID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICBTdHJpbmcgbmFtZSA9IG1vZGVsR3JvdXBEZWZpbml0aW9uLmdldFFOYW1lKHhzZFNjaGVtYSk7Ci0gICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpdGVtcy5hZGQobmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyAgICAgIGl0ZW1zID0gYWRkRXh0ZXJuYWxJbXBvcnRlZEdyb3VwcyhpdGVtcyk7Ci0gICAgICBpdGVtcyA9IChWZWN0b3IpIHNvcnRMaXN0KGl0ZW1zKTsKLSAgICB9Ci0gICAgcmV0dXJuIGl0ZW1zOwotICB9Ci0KLSAgLy8gaXNzdWUgKGNzKSBzc2VtcyBsaWtlIGEgcmF0aGVyIGdvb2Z5IHV0aWwgbWV0aG9kPwotICBwdWJsaWMgc3RhdGljIGphdmEudXRpbC5MaXN0IHNvcnRMaXN0KGphdmEudXRpbC5MaXN0IHR5cGVzKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgamF2YS51dGlsLkNvbGxlY3Rpb25zLnNvcnQodHlwZXMpOyAvLyBwZXJmb3JtYW5jZT8gIG4qbG9nKG4pCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0vLyAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZSgiU29ydCBmYWlsZWQiKTsKLSAgICB9Ci0gICAgcmV0dXJuIHR5cGVzOwotICB9Ci0KLSAgLy8gaXNzdWUgKGNzKSBkbyB3ZSBzdGlsbCBuZWVkIHRoaXM/Ci0gIHB1YmxpYyB2b2lkIHVwZGF0ZU1hcEFmdGVyRGVsZXRlKFhTREltcG9ydCBkZWxldGVkTm9kZSkKLSAgewotICAgIFN0cmluZyBucyA9IGRlbGV0ZWROb2RlLmdldE5hbWVzcGFjZSgpOwotICAgIGlmIChucyAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBwcmVmaXggPSBnZXRQcmVmaXgobnMsIGZhbHNlKTsKLSAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gcHJlZml4LnRyaW0oKTsKLSAgICAgIH0KLSAgICAgIFN0cmluZyB4bWxuc0F0dHIgPSAocHJlZml4ID09ICIiKSA/ICJ4bWxucyIgOiAieG1sbnM6IiArIHByZWZpeDsKLQotICAgICAgaWYgKHByZWZpeCA9PSAiIikKLSAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gbnVsbDsKLSAgICAgIH0KLQotICAgICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgICAgewotICAgICAgICBNYXAgbWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICAgICAgbWFwLnJlbW92ZShwcmVmaXgpOwotICAgICAgICBFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpOwotICAgICAgICBzY2hlbWFFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSh4bWxuc0F0dHIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldFByZWZpeGVkTmFtZXMoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAobmFtZXNwYWNlID09IG51bGwpCi0gICAgewotICAgICAgbmFtZXNwYWNlID0gIiI7ICAgIAkJCQotICAgIH0KLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwgJiYgbG9jYWxOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBwcmVmaXhlcyA9IGdldFByZWZpeGVzRm9yTmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwcmVmaXhlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgCVN0cmluZyBwcmVmaXggPSAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgCWlmIChwcmVmaXggPT0gbnVsbCkgcHJlZml4ID0gIiI7Ci0gICAgICAgIFN0cmluZyBwcmVmaXhlZE5hbWUgPSBwcmVmaXgubGVuZ3RoKCkgPiAwID8gcHJlZml4ICsgIjoiICsgbG9jYWxOYW1lIDogbG9jYWxOYW1lOwotICAgICAgICBsaXN0LmFkZChwcmVmaXhlZE5hbWUpOyAgICAgICAgICAgICAgIAotICAgICAgfQotICAgICAgaWYgKHByZWZpeGVzLnNpemUoKSA9PSAwKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChsb2NhbE5hbWUpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIExpc3QgZ2V0UHJlZml4ZXNGb3JOYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBNYXAgbWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgIE9iamVjdCB2YWx1ZSA9IG1hcC5nZXQocHJlZml4KTsKLSAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLnRvU3RyaW5nKCkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICB7Ci0gICAgICAgbGlzdC5hZGQocHJlZml4KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvVmlld1V0aWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvVmlld1V0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q1YWMzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1ZpZXdVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLy8gaXNzdWUgKGNzKSBjYW4gd2UgZ2V0IHJpZCBvZiB0aGlzIGNsYXNzPwotLy8gSSd2ZSBzdHJpcHBlZCBpdCBkb3duIGEgd2hvbGUgbG90Li4uIGJ1dCBpdCdkIGJlIGdyZWF0IHRvIGdldCByaWQgb2YgaXQKLS8vCi1wdWJsaWMgY2xhc3MgVmlld1V0aWxpdHkKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgRm9udCBmb250OwotCi0gIHByaXZhdGUgc3RhdGljIEZvbnQgZ2V0Rm9udCgpCi0gIHsKLSAgICBpZiAoZm9udCA9PSBudWxsKQotICAgIHsgICAgICAgICAgICAgIAotICAgICAgZm9udCA9IG5ldyBGb250KERpc3BsYXkuZ2V0Q3VycmVudCgpLCAibXMgc2FucyBzZXJpZiIsIDgsIFNXVC5OT1JNQUwpOyAgCi0gICAgfQotICAgIHJldHVybiBmb250OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbXBvc2l0ZShDb21wb3NpdGUgY29tcCkKLSAgewotICAgIC8vIGRlcHJlY2F0ZWQuICBSZW1vdmUgbGF0ZXIKLSAgfQotICBwdWJsaWMgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotICAgIGNvbXBvc2l0ZS5zZXRGb250KGdldEZvbnQoKSk7Ci0KLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMsIGJvb2xlYW4gaG9yaXpvbnRhbEZpbGwpCi0gIHsKLSAgICBpZiAoIWhvcml6b250YWxGaWxsKQotICAgIHsKLSAgICAgIGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIG51bUNvbHVtbnMpOwotICAgIH0KLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0gICAgY29tcG9zaXRlLnNldEZvbnQoZ2V0Rm9udCgpKTsKLQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUhvcml6b250YWxGaWxsZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IGhvcml6b250YWxTcGFuKSAKLSAgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHJldHVybiBsYWJlbDsKLSAgfQotCi0gIC8qKgotICAgKiBIZWxwZXIgbWV0aG9kIGZvciBjcmVhdGluZyBsYWJlbHMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSAKLSAgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotICAgIGxhYmVsLnNldFRleHQodGV4dCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHJldHVybiBsYWJlbDsKLSAgfQotCi0JcHVibGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgU3RyaW5nIHRleHQpCi0JewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIHN0eWxlKTsKLS8vCQlzZXRDb2xvcihsYWJlbCk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotICAKLSAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IGFsaWdubWVudCkKLSAgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotICAgIGxhYmVsLnNldFRleHQodGV4dCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gYWxpZ25tZW50OwotICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgcmV0dXJuIGxhYmVsOwotICB9Ci0KLSAKLQotCi0gIC8qKgotICAgKiBDcmVhdGUgcmFkaW8gYnV0dG9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpCi0gIHsKLSAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyk7Ci0gICAgYnV0dG9uLnNldFRleHQobGFiZWwpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICByZXR1cm4gYnV0dG9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEhlbHBlciBtZXRob2QgZm9yIGNyZWF0aW5nIGNoZWNrIGJveAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSAKLSAgewotICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICBidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICByZXR1cm4gYnV0dG9uOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVDb21ib0JveChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNvbWJvQm94KHBhcmVudCwgdHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZUNvbWJvQm94KENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gaXNSZWFkT25seSkKLSAgewotICAgIGludCBzdHlsZSA9IGlzUmVhZE9ubHkgPT0gdHJ1ZSA/IFNXVC5SRUFEX09OTFkgOiBTV1QuRFJPUF9ET1dOOwotCi0gICAgQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBzdHlsZSk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgcmV0dXJuIGNvbWJvOwotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aCkKLSAgewotICAgIFRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLndpZHRoSGludCA9IHdpZHRoOwotICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgLyoqCi0gICAqIDxjb2RlPmNyZWF0ZVdyYXBwZWRNdWx0aVRleHRGaWVsZDwvY29kZT4gY3JlYXRlcyBhIHdyYXBwZWQgbXVsdGl0ZXh0IGZpZWxkCi0gICAqCi0gICAqIEBwYXJhbSBwYXJlbnQgYSA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHZhbHVlCi0gICAqIEBwYXJhbSB3aWR0aCBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlCi0gICAqIEBwYXJhbSBudW1MaW5lcyBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIHJlcHJlc2VudGluZyBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBoZWlnaHQKLSAgICogQHBhcmFtIHZlcnRpY2FsRmlsbCBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0gICAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiB2YWx1ZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVdyYXBwZWRNdWx0aVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGgsIGludCBudW1MaW5lcywgYm9vbGVhbiB2ZXJ0aWNhbEZpbGwpCi0gIHsKLSAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGlmICh2ZXJ0aWNhbEZpbGwpCi0gICAgewotICAgICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICB9ICAgICAgCi0gICAgZGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLSAgICBGb250RGF0YVtdIGZvbnREYXRhID0gZ2V0Rm9udCgpLmdldEZvbnREYXRhKCk7Ci0gICAgLy8gaGFjayBmb3Igbm93IHdoZXJlIG9uIFdpbmRvd3MsIG9ubHkgMSBmb250ZGF0YSBleGlzdHMKLSAgICBkYXRhLmhlaWdodEhpbnQgPSBudW1MaW5lcyAqIGZvbnREYXRhWzBdLmdldEhlaWdodCgpOwotICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZU11bHRpVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbGVhbiB2ZXJ0aWNhbEZpbGwpCi0gIHsKLSAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBpZiAodmVydGljYWxGaWxsKQotICAgIHsKLSAgICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgfSAgICAgIAotICAgIGRhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0gICAgZGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHJldHVybiB0ZXh0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1hTRERPTUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9YU0RET01IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiZjBjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1hTRERPTUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0vLyBpc3N1ZSAoY3MpIHJlbW92ZSB0aGlzIGNsYXNzISEKLXB1YmxpYyBjbGFzcyBYU0RET01IZWxwZXIKLXsKLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWE1MU2NoZW1hVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFhTRERPTUhlbHBlci4KLSAgICovCi0gIHB1YmxpYyBYU0RET01IZWxwZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBOb2RlIGdldENoaWxkTm9kZShFbGVtZW50IHBhcmVudCwgU3RyaW5nIGNoaWxkTmFtZSkKLSAgewotLyogICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhYTUxTY2hlbWFVUkksIGNoaWxkTmFtZSk7Ci0gICAgaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkKLSAgICAgIHJldHVybiBub2RlTGlzdC5pdGVtKDApOwotICAgIHJldHVybiBudWxsOwotKi8KLSAgICBOb2RlTGlzdCBsaXN0ID0gbnVsbDsKLSAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgfQotCi0gICAgaWYgKGxpc3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBQZXJmb3JtYW5jZSBpc3N1ZSBwZXJoYXBzPwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChsaXN0Lml0ZW0oaSkgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGxpc3QuaXRlbShpKS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoY2hpbGROYW1lKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC5pdGVtKGkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0KLQotCi0gIHB1YmxpYyB2b2lkIGNoYW5nZURlcml2ZWRCeVR5cGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgZGVyaXZlZEJ5VHlwZSwgU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBEb2N1bWVudCBkb2MgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQotICAgIFN0cmluZyBwcmVmaXggPSBlbGVtZW50LmdldFByZWZpeCgpOwotICAgIHByZWZpeCA9IHByZWZpeCA9PSBudWxsID8gIiIgOiBwcmVmaXggKyAiOiI7Ci0KLSAgICBFbGVtZW50IGRlcml2ZWRCeUVsZW1lbnQgPSBnZXREZXJpdmVkQnlFbGVtZW50KGVsZW1lbnQpOwotICAgIAotICAgIGlmIChkZXJpdmVkQnlFbGVtZW50ICE9IG51bGwgJiYgZGVyaXZlZEJ5RWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoZGVyaXZlZEJ5VHlwZSkpCi0gICAgewotICAgIAlyZXR1cm47IC8vIGl0J3MgYWxyZWFkeSB0aGUgZGVyaXZlZCBieSB0eXBlCi0gICAgfQotICAgIEVsZW1lbnQgbmV3Tm9kZTsKLSAgCWlmIChkZXJpdmVkQnlUeXBlLmVxdWFscygicmVzdHJpY3Rpb24iKSkKLSAgCXsKLSAgICAJbmV3Tm9kZSA9IGRvYy5jcmVhdGVFbGVtZW50TlMoWFNERE9NSGVscGVyLlhNTFNjaGVtYVVSSSwgcHJlZml4ICsgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAJbmV3Tm9kZSA9IGRvYy5jcmVhdGVFbGVtZW50TlMoWFNERE9NSGVscGVyLlhNTFNjaGVtYVVSSSwgcHJlZml4ICsgWFNEQ29uc3RhbnRzLkVYVEVOU0lPTl9FTEVNRU5UX1RBRyk7Ci0gICAgfQotCQotICAgIG5ld05vZGUuc2V0QXR0cmlidXRlKCJiYXNlIiwgdHlwZSk7Ci0KLSAgICBpZiAoZGVyaXZlZEJ5RWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChkZXJpdmVkQnlFbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkKLSAgICAgIHsgICAgICAgIAotICAgICAgICBOb2RlTGlzdCBub2RlcyA9IGRlcml2ZWRCeUVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAvLyB1c2UgY2xvbmVzIHNvIHdlIGRvbid0IGhhdmUgYSByZWZyZXNoIHByb2JsZW0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsgICAgICAgCi0gICAgICAgICAgbmV3Tm9kZS5hcHBlbmRDaGlsZChub2RlLmNsb25lTm9kZSh0cnVlKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQkgIGVsZW1lbnQucmVwbGFjZUNoaWxkKG5ld05vZGUsIGRlcml2ZWRCeUVsZW1lbnQpOwotICAgIH0KLSAgICBlbHNlIAotCXsKLQkJRWxlbWVudCBwYXJlbnQgPSAoRWxlbWVudCkgZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7CQkJCS8vIGdldCBiYWNrIHRvIGNvbXBsZXhUeXBlCi0gICAgICAgIE5vZGVMaXN0IG5vZGVzID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJQXJyYXlMaXN0IG5vZGVTYXZlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCS8vIHNhdmUgY2hpbGRyZW4uIChub2RlcyB0dXJucyBvdXQgdG8gYmUgdGhlIHNhbWUgb2JqZWN0IGFzIHBhcmVudDsKLQkJLy8gZGVsZXRpbmcgdGhlbSBmcm9tIHBhcmVudCB3aWxsIGRlbGV0ZSB0aGVtIGZyb20gbm9kZXMuKQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspCQkJCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKGkpOyAgICAgIAotCQkgIG5vZGVTYXZlTGlzdC5hZGQobm9kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZW1vdmUgY2hpbGRyZW4gc28gd2UgY2FuIHN1cnJvdW5kIHRoZW0gYnkgY29tcGxleENvbnRlbnQKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlU2F2ZUxpc3Quc2l6ZSgpOyBpKyspCQkJCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgbm9kZVNhdmVMaXN0LmdldChpKTsgICAgICAKLSAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7Ci0gICAgICAgIH0KLQkJCi0JCS8vIGJ1aWxkIGEgY29tcGxleENvbnRlbnQgZWxlbWVudAotCQlFbGVtZW50IGNvbXBsZXhDb250ZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhYU0RET01IZWxwZXIuWE1MU2NoZW1hVVJJLCBwcmVmaXggKyBYU0RDb25zdGFudHMuQ09NUExFWENPTlRFTlRfRUxFTUVOVF9UQUcpOwotCQlwYXJlbnQuYXBwZW5kQ2hpbGQoY29tcGxleENvbnRlbnQpOwkJCQkJLy8gaW5zZXJ0IGludG8gY29tcGxleFR5cGUKLQkJY29tcGxleENvbnRlbnQuYXBwZW5kQ2hpbGQobmV3Tm9kZSk7CQkJCS8vIGluc2VydCBkZXJpdmF0aW9uIHR5cGUKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlU2F2ZUxpc3Quc2l6ZSgpOyBpKyspCQkJLy8gaW5zZXJ0IGNoaWxkcmVuIHByZXZpb3VzbHkgb2YgY29tcGxleFR5cGUKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBub2RlU2F2ZUxpc3QuZ2V0KGkpOyAgICAgICAKLSAgICAgICAgICBuZXdOb2RlLmFwcGVuZENoaWxkKG5vZGUuY2xvbmVOb2RlKHRydWUpKTsKLSAgICAgICAgfQotCQkKLQkJcGFyZW50LmFwcGVuZENoaWxkKGNvbXBsZXhDb250ZW50KTsKLQkJZm9ybWF0Q2hpbGQoY29tcGxleENvbnRlbnQpOwotICAgIH0KLSAgfQotCi0gIAotICAvKioKLSAgICogR2V0IHRoZSBkZXJpdmVkIGJ5IG5vZGUgZ2l2ZW4gdGhlIGNvbXBsZXhDb250ZW50IG9yIHNpbXBsZUNvbnRlbnQgbm9kZQotICAgKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0RGVyaXZlZEJ5RWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBOb2RlIHJlc3RyaWN0aW9uQ2hpbGQgPSBnZXRDaGlsZE5vZGUoZWxlbWVudCwgInJlc3RyaWN0aW9uIik7Ci0gICAgTm9kZSBleHRlbnNpb25DaGlsZCA9IGdldENoaWxkTm9kZShlbGVtZW50LCAiZXh0ZW5zaW9uIik7Ci0gICAgaWYgKHJlc3RyaWN0aW9uQ2hpbGQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAocmVzdHJpY3Rpb25DaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoRWxlbWVudClyZXN0cmljdGlvbkNoaWxkOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoZXh0ZW5zaW9uQ2hpbGQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZXh0ZW5zaW9uQ2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICByZXR1cm4gKEVsZW1lbnQpZXh0ZW5zaW9uQ2hpbGQ7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgZGVyaXZlZCBieSBub2RlIGdpdmVuIHRoZSBDb21wbGV4VHlwZSBub2RlCi0gICAqIFJldHVybnMgdGhlIGZpcnN0IG9uZSwgaWYgc2F5LCB0aGUgSU5WQUxJRCBzY2hlbWEgaGFzIG1vcmUgdGhhbiBvbmUKLSAgICovCi0gIHB1YmxpYyBFbGVtZW50IGdldERlcml2ZWRCeUVsZW1lbnRGcm9tQ29tcGxleFR5cGUoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgTm9kZUxpc3QgbmwgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICBpbnQgaiA9IDA7Ci0gICAgZm9yIChqID0gMDsgaiA8IG5sLmdldExlbmd0aCgpOyBqKyspCi0gICAgewotICAgICAgTm9kZSBhTm9kZSA9IG5sLml0ZW0oaik7Ci0gICAgICBpZiAoaW5wdXRFcXVhbHMoYU5vZGUsIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICBicmVhazsgCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhhTm9kZSwgWFNEQ29uc3RhbnRzLlNJTVBMRUNPTlRFTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIEVsZW1lbnQgZGVyaXZlZEJ5Tm9kZSA9IGdldERlcml2ZWRCeUVsZW1lbnQoKEVsZW1lbnQpbmwuaXRlbShqKSk7Ci0gICAgcmV0dXJuIGRlcml2ZWRCeU5vZGU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjb250ZW50IG1vZGVsIGdpdmVuIHRoZSBDb21wbGV4VHlwZSBub2RlCi0gICAqIFJldHVybnMgdGhlIGZpcnN0IG9uZSwgaWYgc2F5LCB0aGUgSU5WQUxJRCBzY2hlbWEgaGFzIG1vcmUgdGhhbiBvbmUKLSAgICovCi0gIHB1YmxpYyBFbGVtZW50IGdldENvbnRlbnRNb2RlbEZyb21QYXJlbnQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgTm9kZUxpc3QgbmwgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICBpbnQgaiA9IDA7Ci0gICAgYm9vbGVhbiBtb2RlbEV4aXN0cyA9IGZhbHNlOwotICAgIGludCBsZW5ndGggPSBubC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspCi0gICAgewotICAgICAgTm9kZSBhTm9kZSA9IG5sLml0ZW0oaik7Ci0gICAgICBpZiAoaW5wdXRFcXVhbHMoYU5vZGUsIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICBtb2RlbEV4aXN0cyA9IHRydWU7Ci0gICAgICAgIGJyZWFrOyAKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGFOb2RlLCBYU0RDb25zdGFudHMuU0lNUExFQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICBtb2RlbEV4aXN0cyA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoYU5vZGUsIFhTRENvbnN0YW50cy5TRVFVRU5DRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICBtb2RlbEV4aXN0cyA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoYU5vZGUsIFhTRENvbnN0YW50cy5DSE9JQ0VfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgIHsKLSAgICAgICAgbW9kZWxFeGlzdHMgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGFOb2RlLCBYU0RDb25zdGFudHMuQUxMX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIG1vZGVsRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICghbW9kZWxFeGlzdHMpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgRWxlbWVudCBkZXJpdmVkQnlOb2RlID0gKEVsZW1lbnQpbmwuaXRlbShqKTsKLSAgICByZXR1cm4gZGVyaXZlZEJ5Tm9kZTsKLSAgfQotCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNoYW5nZUNvbnRlbnRNb2RlbChFbGVtZW50IGNvbXBsZXhUeXBlRWxlbWVudCwgU3RyaW5nIGNvbnRlbnRNb2RlbCwgRWxlbWVudCBzZXF1ZW5jZUNob2ljZU9yQWxsRWxlbWVudCkKLSAgewotICAgIERvY3VtZW50IGRvYyA9IGNvbXBsZXhUeXBlRWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0KLSAgICBTdHJpbmcgcHJlZml4ID0gY29tcGxleFR5cGVFbGVtZW50LmdldFByZWZpeCgpOwotICAgIHByZWZpeCA9IHByZWZpeCA9PSBudWxsID8gIiIgOiBwcmVmaXggKyAiOiI7Ci0gICAgCi0gICAgRWxlbWVudCBjb250ZW50TW9kZWxFbGVtZW50ID0gZ2V0Q29udGVudE1vZGVsRnJvbVBhcmVudChjb21wbGV4VHlwZUVsZW1lbnQpOwotCi0gICAgaWYgKGNvbnRlbnRNb2RlbEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKGNvbnRlbnRNb2RlbCkpCi0gICAgewotICAgICAgcmV0dXJuOyAvLyBpdCdzIGFscmVhZHkgdGhlIGNvbnRlbnQgbW9kZWwgCi0gICAgfQotICAgIEVsZW1lbnQgbmV3Tm9kZTsKLSAgICBuZXdOb2RlID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhYU0RET01IZWxwZXIuWE1MU2NoZW1hVVJJLCBwcmVmaXggKyBjb250ZW50TW9kZWwpOwotCi0gICAgaWYgKGNvbnRlbnRNb2RlbEVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKQotICAgIHsgICAgICAgIAotICAgICAgTm9kZUxpc3Qgbm9kZXMgPSBjb250ZW50TW9kZWxFbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgIC8vIHVzZSBjbG9uZXMgc28gd2UgZG9uJ3QgaGF2ZSBhIHJlZnJlc2ggcHJvYmxlbQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgewotICAgICAgICBOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKGkpOwotICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobm9kZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhjb250ZW50TW9kZWxFbGVtZW50LCBYU0RDb25zdGFudHMuU0VRVUVOQ0VfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotICAgICAgICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhjb250ZW50TW9kZWxFbGVtZW50LCBYU0RDb25zdGFudHMuQ0hPSUNFX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLSAgICAgICAgICAgICAgICBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoY29udGVudE1vZGVsRWxlbWVudCwgWFNEQ29uc3RhbnRzLkFMTF9FTEVNRU5UX1RBRywgZmFsc2UpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbmV3Tm9kZS5hcHBlbmRDaGlsZChub2RlLmNsb25lTm9kZSh0cnVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKG5vZGUuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRykgfHwKLSAgICAgICAgICAgICAgICAgICAgbm9kZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLkVYVEVOU0lPTl9FTEVNRU5UX1RBRykpCi0gICAgICAgICAgewotICAgICAgICAgICAgbmV3Tm9kZS5hcHBlbmRDaGlsZChub2RlLmNsb25lTm9kZSh0cnVlKSk7Ci0gICAgICAgICAgICBpZiAoc2VxdWVuY2VDaG9pY2VPckFsbEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChzZXF1ZW5jZUNob2ljZU9yQWxsRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZW1vdmVOb2RlQW5kV2hpdGVzcGFjZShub2RlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmV3Tm9kZS5hcHBlbmRDaGlsZChub2RlLmNsb25lTm9kZSh0cnVlKSk7IAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNvbXBsZXhUeXBlRWxlbWVudC5yZXBsYWNlQ2hpbGQobmV3Tm9kZSwgY29udGVudE1vZGVsRWxlbWVudCk7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjbG9uZUVsZW1lbnQoRWxlbWVudCBwYXJlbnQsIEVsZW1lbnQgc291cmNlTm9kZSkKLSAgewotICAgIERvY3VtZW50IGRvYyA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgU3RyaW5nIHByZWZpeCA9IHBhcmVudC5nZXRQcmVmaXgoKTsKLSAgICBwcmVmaXggPSBwcmVmaXggPT0gbnVsbCA/ICIiIDogcHJlZml4ICsgIjoiOwotICAgIAotICAgIEVsZW1lbnQgbmV3Tm9kZSA9IGRvYy5jcmVhdGVFbGVtZW50TlMoWFNERE9NSGVscGVyLlhNTFNjaGVtYVVSSSwgcHJlZml4ICsgc291cmNlTm9kZS5nZXRMb2NhbE5hbWUoKSk7Ci0KLSAgICBpZiAoc291cmNlTm9kZS5oYXNDaGlsZE5vZGVzKCkpCi0gICAgeyAgICAgICAgCi0gICAgICBOb2RlTGlzdCBub2RlcyA9IHNvdXJjZU5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgLy8gdXNlIGNsb25lcyBzbyB3ZSBkb24ndCBoYXZlIGEgcmVmcmVzaCBwcm9ibGVtCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0gICAgICAgIG5ld05vZGUuYXBwZW5kQ2hpbGQobm9kZS5jbG9uZU5vZGUodHJ1ZSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmV3Tm9kZTsKLS8vICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQobmV3Tm9kZSwgc291cmNlTm9kZSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzT25seVdoaXRlc3BhY2UoTm9kZSBub2RlKQotICB7Ci0gICAgTm9kZUxpc3QgbGlzdCA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBsZW5ndGggPSBsaXN0LmdldExlbmd0aCgpOwotICAgIGJvb2xlYW4gaGFzT25seVdoaXRlc3BhY2UgPSB0cnVlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgTm9kZSBjaGlsZCA9IGxpc3QuaXRlbShpKTsKLSAgICAgIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKQotICAgICAgewotICAgICAgICBoYXNPbmx5V2hpdGVzcGFjZSA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gY2hpbGQuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgIFN0cmluZyB0cmltbWVkVmFsdWUgPSB2YWx1ZS50cmltKCk7Ci0gICAgICAgIGlmICh0cmltbWVkVmFsdWUubGVuZ3RoKCkgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgIGhhc09ubHlXaGl0ZXNwYWNlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAKLSAgICAKLSAgICByZXR1cm4gaGFzT25seVdoaXRlc3BhY2U7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UoTm9kZSBub2RlKQotICB7Ci0gICAgTm9kZSBwYXJlbnROb2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgCi0gICAgTm9kZSBuZXh0RWxlbWVudCA9IGdldE5leHRFbGVtZW50Tm9kZShub2RlKTsKLSAgICBOb2RlIHByZXZpb3VzRWxlbWVudCA9IGdldFByZXZpb3VzRWxlbWVudE5vZGUobm9kZSk7Ci0KLSAgICBOb2RlIG5leHRTaWJsaW5nID0gbm9kZS5nZXROZXh0U2libGluZygpOwotICAgIGlmIChuZXh0U2libGluZyBpbnN0YW5jZW9mIFRleHQpCi0gICAgewotICAgICAgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuZXh0U2libGluZyk7Ci0gICAgfQotCi0gICAgaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkKLSAgICB7Ci0JCSAgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsKLSAgICB9Ci0KLSAgICBpZiAobmV4dEVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0JCQlmb3JtYXRDaGlsZChuZXh0RWxlbWVudCk7Ci0gICAgfQotCi0JCWlmIChwcmV2aW91c0VsZW1lbnQgIT0gbnVsbCkKLQkJewotCQkJZm9ybWF0Q2hpbGQocHJldmlvdXNFbGVtZW50KTsKLQkJfQotICB9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZm9ybWF0Q2hpbGQoTm9kZSBjaGlsZCkKLQl7Ci0gICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgSURPTU1vZGVsIG1vZGVsID0gKChJRE9NTm9kZSljaGlsZCkuZ2V0TW9kZWwoKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBhYm91dCB0byBtYWtlIGEgYmlnIG1vZGVsIGNoYW5nZQotICAgICAgICBtb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLSAgICAgICAgCi0JICAgICAgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotCQkgICAgZm9ybWF0UHJvY2Vzc29yLmZvcm1hdE5vZGUoY2hpbGQpOwotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICAvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZyBtb2RlbCBjaGFuZ2UKLSAgICAgICAgbW9kZWwuY2hhbmdlZE1vZGVsKCk7IAotICAgICAgfQotICAgIH0KLSAgfQotICAKLQotICBwcml2YXRlIHN0YXRpYyBOb2RlIGdldE5leHRFbGVtZW50Tm9kZShOb2RlIG5vZGUpCi0gIHsKLSAgICBOb2RlIG5leHQgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgCi0gICAgd2hpbGUgKCEobmV4dCBpbnN0YW5jZW9mIEVsZW1lbnQpICYmIG5leHQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBuZXh0ID0gbmV4dC5nZXROZXh0U2libGluZygpOwotICAgIH0KLSAgICBpZiAobmV4dCBpbnN0YW5jZW9mIFRleHQpCi0gICAgewotICAgIAlyZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIG5leHQ7Ci0gIH0KLQotCXByaXZhdGUgc3RhdGljIE5vZGUgZ2V0UHJldmlvdXNFbGVtZW50Tm9kZShOb2RlIG5vZGUpCi0JewotCQlOb2RlIHByZXZpb3VzID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLSAgICAKLQkJd2hpbGUgKCEocHJldmlvdXMgaW5zdGFuY2VvZiBFbGVtZW50KSAmJiBwcmV2aW91cyAhPSBudWxsKQotCQl7Ci0JCQlwcmV2aW91cyA9IHByZXZpb3VzLmdldFByZXZpb3VzU2libGluZygpOwotCQl9Ci0gICAgaWYgKHByZXZpb3VzIGluc3RhbmNlb2YgVGV4dCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIHByZXZpb3VzOwotCX0KLQotIAotCi0gIC8vIGlzc3VlIChjcykgd2hhdCdzIHRoaXMgbWV0aG9kIHN1cHBvc2VkIHRvIGRvPwotICAvLyBiaXp6YXJlIG5hbWUKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlucHV0RXF1YWxzKE9iamVjdCBpbnB1dCwgU3RyaW5nIHRhZ25hbWUsIGJvb2xlYW4gaXNSZWYpCi0gIHsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBpbnB1dDsKLSAgICAgIGlmIChlbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscyh0YWduYW1lKSkKLSAgICAgIHsKLSAgICAgICAgYm9vbGVhbiByZWZQcmVzZW50ID0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoInJlZiIpOwotCi0gICAgICAgIHJldHVybiByZWZQcmVzZW50ID09IGlzUmVmOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmM2Q5MWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi17Ci0gICAgcHJvdGVjdGVkIFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJJbXBsIHNjaGVtYUxvY2F0b3IgPSBuZXcgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwoKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUgPT0gWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlci5jbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiBzY2hlbWFMb2NhdG9yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q5ODViNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hTG9jYXRvcjsKLQotcHVibGljIGNsYXNzIFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJJbXBsIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyCi17Ci0gICAgcHVibGljIFN0cmluZyByZXNvbHZlU2NoZW1hTG9jYXRpb24oWFNEU2NoZW1hIHhzZFNjaGVtYSwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHNjaGVtYUxvY2F0aW9uVVJJKQotICAgIHsKLSAgICAgIFN0cmluZyBiYXNlTG9jYXRpb24gPSB4c2RTY2hlbWEuZ2V0U2NoZW1hTG9jYXRpb24oKTsgICAgICAKLSAgICAgIFN0cmluZyByZXN1bHQgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBuYW1lc3BhY2VVUkksIHNjaGVtYUxvY2F0aW9uVVJJKTsKLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgCXJlc3VsdCA9IG5hbWVzcGFjZVVSSTsKLSAgICAgIH0KLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgCXJlc3VsdCA9ICIiOwotICAgICAgfQotCi0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQWRhdHBlckZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUgPT0gWFNEU2NoZW1hTG9jYXRvci5jbGFzczsKLSAgICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3V0aWxzL09wZW5PblNlbGVjdGlvbkhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbHMvT3Blbk9uU2VsZWN0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMWFhNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdXRpbHMvT3Blbk9uU2VsZWN0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5PcGVuSW5OZXdFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vLyBpc3N1ZSAoY3MpIGNhbiB3ZSByZW1vdmUgdGhpcz8KLS8vCi1wdWJsaWMgY2xhc3MgT3Blbk9uU2VsZWN0aW9uSGVscGVyCi17Ci0gIAotICBwcm90ZWN0ZWQgU3RydWN0dXJlZFRleHRFZGl0b3IgdGV4dEVkaXRvcjsKLSAgcHJvdGVjdGVkIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0KLSAKLSAgcHVibGljIE9wZW5PblNlbGVjdGlvbkhlbHBlcihTdHJ1Y3R1cmVkVGV4dEVkaXRvciB0ZXh0RWRpdG9yLCBYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gIAl0aGlzLnRleHRFZGl0b3IgPSB0ZXh0RWRpdG9yOwotICAJdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gIH0KLSAgCi0KLSAgYm9vbGVhbiBsYXN0UmVzdWx0OwotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW5YU0RFZGl0b3IoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvcklucHV0KCk7Ci0gICAgCi0gICAgT3BlbkluTmV3RWRpdG9yLm9wZW5YU0RFZGl0b3IoZWRpdG9ySW5wdXQsIHNjaGVtYSwgc2NoZW1hKTsgICAgCi0gICAKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW5YU0RFZGl0b3IoU3RyaW5nIHNjaGVtYUxvY2F0aW9uKQotICB7Ci0gICAgSVBhdGggc2NoZW1hUGF0aCA9IG5ldyBQYXRoKHNjaGVtYUxvY2F0aW9uKTsKLQkJZmluYWwgSUZpbGUgc2NoZW1hRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShzY2hlbWFQYXRoKTsKLQkKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpCi0JCXsKLQkJCS8qKgotCQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkKLQkJCXsKLQkJCQlmaW5hbCBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQlpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpCi0JCQkJewotCQkJCQl0cnkKLQkJCQkJewotCQkJCQkgIHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KHNjaGVtYUZpbGUpLCBYU0RFZGl0b3JQbHVnaW4uRURJVE9SX0lEKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gaW5pdEV4KQotCQkJCQl7Ci0JCQkJCSAgaW5pdEV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKQotCQkJCQl7Ci0JCQkJCSAgZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0gICAgICAgICAgCi0JCQl9Ci0JCX0pOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiByZXZlYWxPYmplY3QoZmluYWwgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgaWYgKGNvbXBvbmVudC5nZXRSb290Q29udGFpbmVyKCkuZXF1YWxzKHhzZFNjaGVtYSkpCi0gICAgewotICAgICAgTm9kZSBlbGVtZW50ID0gY29tcG9uZW50LmdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikKLSAgICAgIHsKLSAgICAgICAgSW5kZXhlZFJlZ2lvbiBpbmRleE5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgZWxlbWVudDsKLSAgICAgICAgdGV4dEVkaXRvci5nZXRUZXh0Vmlld2VyKCkuc2V0UmFuZ2VJbmRpY2F0aW9uKGluZGV4Tm9kZS5nZXRTdGFydE9mZnNldCgpLCBpbmRleE5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBpbmRleE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgdHJ1ZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbGFzdFJlc3VsdCA9IGZhbHNlOwotICAgICAgaWYgKGNvbXBvbmVudC5nZXRTY2hlbWEoKSAhPSBudWxsKQotICAgICAgewotCQkJCVN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2woY29tcG9uZW50LmdldFNjaGVtYSgpLmdldFNjaGVtYUxvY2F0aW9uKCkpOwotICAgICAgICBJUGF0aCBzY2hlbWFQYXRoID0gbmV3IFBhdGgoc2NoZW1hTG9jYXRpb24pOwotCQkJCWZpbmFsIElGaWxlIHNjaGVtYUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoc2NoZW1hUGF0aCk7Ci0gICAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpCi0gICAgICAgIHsKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkgICAgICAgICAqLwotCSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLQkgICAgICAgIHsKLQkJICAgICAgICBmaW5hbCBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJICAgICAgICBpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpCi0JCSAgICAgICAgewotCQkJCQkJCXRyeQotCQkJCQkJCXsKLQkJCQkJCQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KHNjaGVtYUZpbGUpLCBYU0RFZGl0b3JQbHVnaW4uUExVR0lOX0lEKTsKLQkJCQkJCQkJaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikKLQkJCQkJCQkJewotCQkJCQkJCQkJKChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcillZGl0b3JQYXJ0KS5vcGVuT25HbG9iYWxSZWZlcmVuY2UoY29tcG9uZW50KTsKLQkJCQkJCQkJCWxhc3RSZXN1bHQgPSB0cnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBpbml0RXgpCi0JCQkJCQkJewotCQkJCQkJCX0KLQkJCQkJCX0gICAgICAgICAgCi0JCQkJCX0KLQkJCQl9KTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBsYXN0UmVzdWx0OwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFhTRE5hbWVkQ29tcG9uZW50IG9wZW5Pbkdsb2JhbFJlZmVyZW5jZShYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wKQotICB7Ci0gICAgWFNEU2NoZW1hIHNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICB7Ci0gICAgICBuYW1lID0gKChYU0ROYW1lZENvbXBvbmVudCkgY29tcCkuZ2V0TmFtZSgpOwotICAgIH0KLSAgICBpZiAobmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIEZvciBBbm9ueW1vdXMgdHlwZXMsIGp1c3Qgc2hvdyB0aGUgZWxlbWVudAotICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IChYU0RUeXBlRGVmaW5pdGlvbikgY29tcDsKLSAgICAgICAgY29tcCA9IHR5cGUuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lID0gKChYU0ROYW1lZENvbXBvbmVudCkgY29tcCkuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmIChzY2hlbWEgPT0gbnVsbCB8fCBuYW1lID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgTGlzdCBvYmplY3RzID0gbnVsbDsgICAgCi0gICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgb2JqZWN0cyA9IHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBvYmplY3RzID0gc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpOwotICAgIH0KLSAgICBlbHNlIGlmIChjb21wIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIG9iamVjdHMgPSBzY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpOwotICAgIH0KLSAgICBlbHNlIGlmIChjb21wIGluc3RhbmNlb2YgWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBvYmplY3RzID0gc2NoZW1hLmdldElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBvYmplY3RzID0gc2NoZW1hLmdldE1vZGVsR3JvdXBEZWZpbml0aW9ucygpOwotICAgIH0KLSAgICBlbHNlIGlmIChjb21wIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgewotICAgICAgb2JqZWN0cyA9IHNjaGVtYS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKTsKLSAgICB9Ci0KLSAgICBpZiAob2JqZWN0cyAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBYU0ROYW1lZENvbXBvbmVudCBuYW1lZENvbXAgPSAoWFNETmFtZWRDb21wb25lbnQpIGl0ZXIubmV4dCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKG5hbWVkQ29tcC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV2ZWFsT2JqZWN0KG5hbWVkQ29tcCk7Ci0gICAgICAgICAgcmV0dXJuIG5hbWVkQ29tcDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gb3Blbk9uU2VsZWN0aW9uKCkKLSAgewotICAgIExpc3Qgc2VsZWN0ZWROb2RlcyA9IG51bGw7Ci0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0gICAgICBzZWxlY3RlZE5vZGVzID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0xpc3QoKTsKLSAgICB9Ci0KLSAgICBpZiAoc2VsZWN0ZWROb2RlcyAhPSBudWxsICYmICFzZWxlY3RlZE5vZGVzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzZWxlY3RlZE5vZGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotICAgICAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wID0geHNkU2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQoKE5vZGUpb2JqKTsKLSAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBvYmplY3RUb1JldmVhbCA9IG51bGw7Ci0KLSAgICAgICAgICBpZiAoeHNkQ29tcCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSB4c2RDb21wOwotICAgICAgICAgICAgaWYgKGVsZW1lbnREZWNsLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9iamVjdFRvUmV2ZWFsID0gZWxlbWVudERlY2wuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgdHlwZURlZiA9IG51bGw7Ci0gICAgICAgICAgICAgIGlmIChlbGVtZW50RGVjbC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpID09IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0eXBlRGVmID0gZWxlbWVudERlY2wuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgc3ViR3JvdXBBZmZpbGlhdGlvbiA9IGVsZW1lbnREZWNsLmdldFN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24oKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGlmICh0eXBlRGVmICE9IG51bGwgJiYgc3ViR3JvdXBBZmZpbGlhdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSAyIHRoaW5ncyB3ZSBjYW4gbmF2aWdhdGUgdG8sIGlmIHRoZSBjdXJzb3IgaXMgYW55d2hlcmUgb24gdGhlIHN1YnN0aXR1dGlvbiBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAvLyB0aGVuIGp1bXAgdG8gdGhhdCwgb3RoZXJ3aXNlIGp1c3QgZ28gdG8gdGhlIHR5cGVEZWYuCi0gICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEF0dHIgJiYgKChBdHRyKW9iaikuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFhTRENvbnN0YW50cy5TVUJTVElUVVRJT05HUk9VUF9BVFRSSUJVVEUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG9iamVjdFRvUmV2ZWFsID0gc3ViR3JvdXBBZmZpbGlhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byByZXZlYWwgdGhlIHR5cGUgbm93LiAgT24gc3VjY2VzcywgdGhlbiB3ZSByZXR1cm4gdHJ1ZS4KLSAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGZhaWwsIHNldCB0aGUgc3Vic3RpdHV0aW9uIGdyb3VwIGFzIHRoZSBvYmplY3QgdG8gcmV2ZWFsIGFzIGEgYmFja3VwIHBsYW4uCi0gICAgICAgICAgICAgICAgICBpZiAocmV2ZWFsT2JqZWN0KHR5cGVEZWYpKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0VG9SZXZlYWwgPSBzdWJHcm91cEFmZmlsaWF0aW9uOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBvbmUgb3IgbW9yZSBvZiB0aGVzZSBpcyBudWxsLiAgSWYgdGhlIHR5cGVEZWYgaXMgbm9uLW51bGwsIHVzZSBpdC4gIE90aGVyd2lzZQotICAgICAgICAgICAgICAgIC8vIHRyeSBhbmQgdXNlIHRoZSBzdWJzdGl0dXRpb24gZ3JvdXAKLSAgICAgICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IHR5cGVEZWYgIT0gbnVsbCA/IHR5cGVEZWYgOiBzdWJHcm91cEFmZmlsaWF0aW9uOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHhzZENvbXAgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBlbGVtZW50RGVjbCA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgeHNkQ29tcDsKLSAgICAgICAgICAgIGlmIChlbGVtZW50RGVjbC5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9iamVjdFRvUmV2ZWFsID0gZWxlbWVudERlY2wuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICh4c2RDb21wIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIHhzZENvbXA7Ci0gICAgICAgICAgICBpZiAoYXR0ckRlY2wuaXNBdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IGF0dHJEZWNsLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGF0dHJEZWNsLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb2JqZWN0VG9SZXZlYWwgPSBhdHRyRGVjbC5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgfSAgICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHhzZENvbXAgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJHcm91cERlZiA9IChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIHhzZENvbXA7Ci0gICAgICAgICAgICBpZiAoYXR0ckdyb3VwRGVmLmlzQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9iamVjdFRvUmV2ZWFsID0gYXR0ckdyb3VwRGVmLmdldFJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHhzZENvbXAgaW5zdGFuY2VvZiBYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24gaWRDb25zdHJhaW50RGVmID0gKFhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24pIHhzZENvbXA7Ci0gICAgICAgICAgICBpZiAoaWRDb25zdHJhaW50RGVmLmdldFJlZmVyZW5jZWRLZXkoKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IGlkQ29uc3RyYWludERlZi5nZXRSZWZlcmVuY2VkS2V5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHhzZENvbXAgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB4c2RDb21wOwotICAgICAgICAgICAgb2JqZWN0VG9SZXZlYWwgPSB0eXBlRGVmLmdldEl0ZW1UeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgaWYgKG9iamVjdFRvUmV2ZWFsID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIGlmIGl0ZW1UeXBlIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LCB0aGVuIGNoZWNrIGZvciBtZW1iZXJUeXBlCi0gICAgICAgICAgICAgIExpc3QgbWVtYmVyVHlwZXMgPSB0eXBlRGVmLmdldE1lbWJlclR5cGVEZWZpbml0aW9ucygpOwotICAgICAgICAgICAgICBpZiAobWVtYmVyVHlwZXMgIT0gbnVsbCAmJiBtZW1iZXJUeXBlcy5zaXplKCkgPiAwKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0VG9SZXZlYWwgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpbWVtYmVyVHlwZXMuZ2V0KDApOwotICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoeHNkQ29tcCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSAoWFNEVHlwZURlZmluaXRpb24pIHhzZENvbXA7Ci0gICAgICAgICAgICBvYmplY3RUb1JldmVhbCA9IHR5cGVEZWYuZ2V0QmFzZVR5cGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoeHNkQ29tcCBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgCVhTRFNjaGVtYURpcmVjdGl2ZSBkaXJlY3RpdmUgPSAoWFNEU2NoZW1hRGlyZWN0aXZlKSB4c2RDb21wOwotLy8JCQkJCQlTdHJpbmcgc2NoZW1hTG9jYXRpb24gPSBVUklIZWxwZXIucmVtb3ZlUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKGRpcmVjdGl2ZS5nZXRSZXNvbHZlZFNjaGVtYSgpLmdldFNjaGVtYUxvY2F0aW9uKCkpOwotLy8JCQkJCQlvcGVuWFNERWRpdG9yKHNjaGVtYUxvY2F0aW9uKTsKLS8vCQkJCQkJcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgb2JqZWN0VG9SZXZlYWwgPSBkaXJlY3RpdmUuZ2V0UmVzb2x2ZWRTY2hlbWEoKTsJCQkJCQkgICAgICAgICAgCSAgICAgICAgICAJCi0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gbm93IHJldmVhbCB0aGUgb2JqZWN0IGlmIHRoaXMgaXNuJ3QgbnVsbAotICAgICAgICAgIGlmIChvYmplY3RUb1JldmVhbCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZXZlYWxPYmplY3Qob2JqZWN0VG9SZXZlYWwpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWFNELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYU0QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkwY2NlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYU0QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgcGVyZm9ybXMgdGhlIGFzLXlvdS10eXBlIHZhbGlkYXRpb24gZm9yIHNjaGVtYSBmaWxlcwotICoKLSAqLwotcHVibGljIGNsYXNzIERlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYU0QgZXh0ZW5kcyBEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIElkID0gIm9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2QiOwotCi0gIHByaXZhdGUgVmFsaWRhdG9yIF92YWxpZGF0b3I7Ci0gIAotICBwdWJsaWMgRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhTRCgpIHsgCi0gIH0KLSAgCi0gIHByaXZhdGUgVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpewotCSAgaWYgKF92YWxpZGF0b3IgPT0gbnVsbClfdmFsaWRhdG9yID0gVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuZ2V0VmFsaWRhdG9yKElkKTsKLQkgIHJldHVybiBfdmFsaWRhdG9yOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgSVZhbGlkYXRvciBnZXREZWxlZ2F0ZVZhbGlkYXRvcigpIHsKLQkgIFZhbGlkYXRvciB2ID0gZ2V0VmFsaWRhdG9yKCk7Ci0JICBpZiAodiA9PSBudWxsKXJldHVybiBudWxsOwotCSAgcmV0dXJuIHYuYXNJVmFsaWRhdG9yKCk7Ci0gIH0KLSAgCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWxlZ2F0ZVZhbGlkYXRvckVuYWJsZWQoSUZpbGUgZmlsZSkgewotCQlWYWxpZGF0b3IgdiA9IGdldFZhbGlkYXRvcigpOwotCQlpZiAodiA9PSBudWxsKXJldHVybiBmYWxzZTsKLQkJaWYgKCF2LnNob3VsZFZhbGlkYXRlKGZpbGUsIGZhbHNlLCBmYWxzZSkpcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdi5pc0J1aWxkVmFsaWRhdGlvbigpIHx8IHYuaXNNYW51YWxWYWxpZGF0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2lkZ2V0cy9FbnVtZXJhdGlvbnNEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpZGdldHMvRW51bWVyYXRpb25zRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZjE5ZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2lkZ2V0cy9FbnVtZXJhdGlvbnNEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5WaWV3VXRpbGl0eTsKLQotCi0vKioKLSAqIERpYWxvZyB0byBoZWxwIGRlZmluZSBhIGxpc3Qgb2YgZW51bWVyYXRpb25zCi0gKiBmb3IgYSBqb2luLiBUaGlzIG1pZ2h0IGJlIHJlcGxhY2VkIG9uY2Ugd2Uga25vdyBob3cgdG8KLSAqIGluaXRpYXRlIGEgZHJhZyB0cmFja2VyCi0gKi8KLQotcHVibGljIGNsYXNzIEVudW1lcmF0aW9uc0RpYWxvZyBleHRlbmRzIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nCi17Ci0gIHB1YmxpYyBFbnVtZXJhdGlvbnNEaWFsb2coU2hlbGwgc2hlbGwpCi0gIHsKLSAgICBzdXBlcihzaGVsbCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkKLSAgewotICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgICBzaGVsbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9FTlVNRVJBVElPTlNfRElBTE9HX1RJVExFIikpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpCi0gIHsKLSAgICBpZiAoYnV0dG9uSWQgPT0gV2luZG93Lk9LKQotICAgIHsKLSAgICAgIHRleHQgPSB0ZXh0RmllbGQuZ2V0VGV4dCgpOwotICAgICAgZGVsaW1pdGVyID0gZGVsaW1pdGVyRmllbGQuZ2V0VGV4dCgpOwotICAgICAgaXNQcmVzZXJ2ZSA9IHByZXNlcnZlV2hpdGVzcGFjZS5nZXRTZWxlY3Rpb24oKTsKLSAgICB9Ci0gICAgc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyB0ZXh0LCBkZWxpbWl0ZXI7Ci0gIHByaXZhdGUgYm9vbGVhbiBpc1ByZXNlcnZlOwotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7IHJldHVybiB0ZXh0OyB9Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVsaW1pdGVyKCkgeyByZXR1cm4gZGVsaW1pdGVyOyB9Ci0gIHB1YmxpYyBib29sZWFuIGlzUHJlc2VydmVXaGl0ZXNwYWNlKCkgeyByZXR1cm4gaXNQcmVzZXJ2ZTsgfQotCi0gIHByaXZhdGUgVGV4dCB0ZXh0RmllbGQ7Ci0gIHByaXZhdGUgQnV0dG9uIHByZXNlcnZlV2hpdGVzcGFjZTsKLSAgcHJpdmF0ZSBDb21ibyBkZWxpbWl0ZXJGaWVsZDsKLSAgLy8KLSAgLy8gQ3JlYXRlIHRoZSBjb250cm9scwotICAvLwotICBwdWJsaWMgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb250cm9sW10gdGFiT3JkZXIgPSBuZXcgQ29udHJvbFszXTsKLSAgCWludCB0YWJJbmRleCA9IDA7Ci0gICAgQ29tcG9zaXRlIGNsaWVudCA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpY2xpZW50LmdldExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBjbGllbnQuc2V0TGF5b3V0KGxheW91dCk7IAotCi0gICAgdGV4dEZpZWxkID0gVmlld1V0aWxpdHkuY3JlYXRlV3JhcHBlZE11bHRpVGV4dEZpZWxkKGNsaWVudCwgNDAwLCAyMCwgdHJ1ZSk7Ci0gICAgR3JpZERhdGEgZ2QgPSAoR3JpZERhdGEpIHRleHRGaWVsZC5nZXRMYXlvdXREYXRhKCk7Ci0gICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgIHRhYk9yZGVyW3RhYkluZGV4KytdID0gdGV4dEZpZWxkOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGV4dEZpZWxkLCBYU0RFZGl0b3JDU0hlbHBJZHMuQUREX0VOVU1FUkFUSU9OU19fTk9fTkFNRSk7Ci0KLSAgICBWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChjbGllbnQsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9ERUxJTUlURVJfQ0hBUiIpKTsKLSAgICBkZWxpbWl0ZXJGaWVsZCA9IFZpZXdVdGlsaXR5LmNyZWF0ZUNvbWJvQm94KGNsaWVudCwgZmFsc2UpOwotICAgIGdkID0gKEdyaWREYXRhKSBkZWxpbWl0ZXJGaWVsZC5nZXRMYXlvdXREYXRhKCk7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0gICAgZ2Qud2lkdGhIaW50ID0gMzA7Ci0gICAgdGFiT3JkZXJbdGFiSW5kZXgrK10gPSBkZWxpbWl0ZXJGaWVsZDsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRlbGltaXRlckZpZWxkLCBYU0RFZGl0b3JDU0hlbHBJZHMuQUREX0VOVU1FUkFUSU9OU19fREVMSU1JVEVSX0NIQVJTKTsKLQotICAgIC8vIGFkZCBkZWZhdWx0IGRlbGltaXRlcnMKLSAgICBkZWxpbWl0ZXJGaWVsZC5hZGQoIjoiKTsKLSAgICBkZWxpbWl0ZXJGaWVsZC5hZGQoIiwiKTsKLSAgICBkZWxpbWl0ZXJGaWVsZC5hZGQoIiAiKTsKLSAgICAvLyBzZXQgdGhlIGN1cnJlbnQgb25lIHRvIGJlICcsJwotICAgIGRlbGltaXRlckZpZWxkLnNldFRleHQoIiwiKTsKLQotICAgIHByZXNlcnZlV2hpdGVzcGFjZSA9IFZpZXdVdGlsaXR5LmNyZWF0ZUNoZWNrQm94KGNsaWVudCwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1BSRVNFUlZFX1dISVRFU1BBQ0UiKSk7Ci0gICAgZ2QgPSAoR3JpZERhdGEpIHByZXNlcnZlV2hpdGVzcGFjZS5nZXRMYXlvdXREYXRhKCk7Ci0gICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgIHRhYk9yZGVyW3RhYkluZGV4KytdID0gcHJlc2VydmVXaGl0ZXNwYWNlOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocHJlc2VydmVXaGl0ZXNwYWNlLCBYU0RFZGl0b3JDU0hlbHBJZHMuQUREX0VOVU1FUkFUSU9OU19fUFJFU0VSVkVfTEVBRF9BTkRfVFJBSUxfV0hJVEVTUEFDRVMpOwotICAgIAotICAgIGNsaWVudC5zZXRUYWJMaXN0KHRhYk9yZGVyKTsKLQotICAgIHJldHVybiBjbGllbnQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpZGdldHMvVHlwZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpZGdldHMvVHlwZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUyOWZlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aWRnZXRzL1R5cGVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5UeXBlc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVmlld1V0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFR5cGVTZWN0aW9uCi17Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgVHlwZVNlY3Rpb24uCi0gICAqIEBwYXJhbSBwYXJlbnQKLSAgICovCi0gIHB1YmxpYyBUeXBlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQnV0dG9uICBzaW1wbGVUeXBlOwotICBwcm90ZWN0ZWQgQnV0dG9uICB1c2VyU2ltcGxlVHlwZTsKLSAgcHJvdGVjdGVkIEJ1dHRvbiAgdXNlckNvbXBsZXhUeXBlOwotICBwcm90ZWN0ZWQgQnV0dG9uICBub25lUmFkaW87Ci0gIHByb3RlY3RlZCBDb21ibyAgIHR5cGVMaXN0OwotICBwcm90ZWN0ZWQgQ29tYm8gICBkZXJpdmVkQnlDb21ibzsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvd1VzZXJDb21wbGV4VHlwZSA9IHRydWU7Ci0gIHByb3RlY3RlZCBib29sZWFuIHNob3dVc2VyU2ltcGxlVHlwZSAgPSB0cnVlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG93Tm9uZSAgICAgICAgICAgID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBib29sZWFuIHNob3dEZXJpdmVkQnkgICAgICAgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIFN0cmluZyAgZGVyaXZlZEJ5Q2hvaWNlc1tdICA9IHsgInJlc3RyaWN0aW9uIiwgImV4dGVuc2lvbiIgfTsKLSAgcHVibGljIGZpbmFsIGludCAgTk9ORSAgICAgICAgICAgICAgICA9IDE7Ci0gIHB1YmxpYyBmaW5hbCBpbnQgIEJVSUxUX0lOICAgICAgICAgICAgPSAyOwotICBwdWJsaWMgZmluYWwgaW50ICBTSU1QTEUgICAgICAgICAgICAgID0gMzsKLSAgcHVibGljIGZpbmFsIGludCAgQ09NUExFWCAgICAgICAgICAgICA9IDQ7Ci0KLSAgU3RyaW5nICAgICAgICAgICAgc2VjdGlvblRpdGxlICAgICAgICA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9UWVBFX0lORk9STUFUSU9OIik7Ci0gIFN0cmluZyAgICAgICAgICAgIGN1cnJlbnRPYmplY3RVdWlkICAgPSAiIjsKLQotICAvKgotICAgKiBAc2VlIEZsYXRQYWdlU2VjdGlvbiNjcmVhdGVDbGllbnQoQ29tcG9zaXRlLCBXaWRnZXRGYWN0b3J5KQotICAgKi8KLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDbGllbnQoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBjbGllbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICBnbC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotICAgIGNsaWVudC5zZXRMYXlvdXQoZ2wpOwotCi0gICAgaWYgKHNob3dOb25lKQotICAgIHsKLSAgICAgIG5vbmVSYWRpbyA9IFZpZXdVdGlsaXR5LmNyZWF0ZVJhZGlvQnV0dG9uKGNsaWVudCwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JBRElPX05PTkUiKSk7Ci0gICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAobm9uZVJhZGlvLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTREVfVFlQRV9IRUxQRVJfTk9ORSk7Ci0gICAgfQotCi0gICAgc2ltcGxlVHlwZSA9IFZpZXdVdGlsaXR5LmNyZWF0ZVJhZGlvQnV0dG9uKGNsaWVudCwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JBRElPX0JVSUxUX0lOX1NJTVBMRV9UWVBFIikpOwotICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChzaW1wbGVUeXBlLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTREVfVFlQRV9IRUxQRVJfQlVJTFRfSU4pOwotCi0gICAgaWYgKHNob3dVc2VyU2ltcGxlVHlwZSkKLSAgICB7Ci0gICAgICB1c2VyU2ltcGxlVHlwZSA9IFZpZXdVdGlsaXR5LmNyZWF0ZVJhZGlvQnV0dG9uKGNsaWVudCwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JBRElPX1VTRVJfREVGSU5FRF9TSU1QTEVfVFlQRSIpKTsKLSAgICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscCh1c2VyU2ltcGxlVHlwZSwgWFNERWRpdG9yQ29udGV4dElkcy5YU0RFX1RZUEVfSEVMUEVSX1VTRVJfREVGSU5FRF9TSU1QTEUpOwotICAgIH0KLQotICAgIGlmIChzaG93VXNlckNvbXBsZXhUeXBlKQotICAgIHsKLSAgICAgIHVzZXJDb21wbGV4VHlwZSA9IFZpZXdVdGlsaXR5LmNyZWF0ZVJhZGlvQnV0dG9uKGNsaWVudCwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JBRElPX1VTRVJfREVGSU5FRF9DT01QTEVYX1RZUEUiKSk7Ci0gICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAodXNlckNvbXBsZXhUeXBlLCBYU0RFZGl0b3JDb250ZXh0SWRzLlhTREVfVFlQRV9IRUxQRVJfVVNFUl9ERUZJTkVEX0NPTVBMRVgpOwotICAgIH0KLQotICAgIC8vCSAgdHlwZUxpc3QgPSB1dGlsaXR5LmNyZWF0ZUNvbWJvQm94KGNsaWVudCk7Ci0gICAgLy8JICBXb3JrYmVuY2hIZWxwLnNldEhlbHAodHlwZUxpc3QsIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9UWVBFX0hFTFBFUl9UWVBFKTsKLSAgICAvLyAgICB1dGlsaXR5LmNyZWF0ZUhlYWRpbmdMYWJlbChjbGllbnQsICJUeXBlIixudWxsKTsKLQotICAgIGlmIChzaG93RGVyaXZlZEJ5KQotICAgIHsKLSAgICAgIENvbXBvc2l0ZSBkZXJpdmVkQnlDb21wb3NpdGUgPSBWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUoY2xpZW50LCAyKTsKLSAgICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGRlcml2ZWRCeUNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX0RFUklWRURfQlkiKSk7Ci0gICAgICBkZXJpdmVkQnlDb21ibyA9IFZpZXdVdGlsaXR5LmNyZWF0ZUNvbWJvQm94KGRlcml2ZWRCeUNvbXBvc2l0ZSk7Ci0gICAgICBwb3B1bGF0ZURlcml2ZWRCeUNvbWJvKCk7Ci0gICAgICBXb3JrYmVuY2hIZWxwLnNldEhlbHAoZGVyaXZlZEJ5Q29tYm8sIFhTREVkaXRvckNvbnRleHRJZHMuWFNERV9TSU1QTEVfQ09OVEVOVF9ERVJJVkVEKTsKLSAgICAgIGRlcml2ZWRCeUNvbWJvLnNldFRvb2xUaXBUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UT09MVElQX0RFUklWRURfQlkiKSk7Ci0gICAgfQotICAgIC8vIFNldCB0aGUgZGVmYXVsdCBzZWxlY3Rpb24KLSAgICBpZiAoc2hvd05vbmUpCi0gICAgewotICAgICAgLy8JCW5vbmVSYWRpby5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAvLwkJdHlwZUxpc3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzaW1wbGVUeXBlLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNsaWVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElzRGVyaXZlZEJ5KGJvb2xlYW4gZGVyaXZlKQotICB7Ci0gICAgaWYgKGRlcml2ZSkKLSAgICB7Ci0gICAgICBzZWN0aW9uVGl0bGUgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfQkFTRV9UWVBFIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZWN0aW9uVGl0bGUgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfVFlQRV9JTkZPUk1BVElPTiIpOwotICAgIH0KLSAgICAvLwlzZXRIZWFkZXJUZXh0KHNlY3Rpb25UaXRsZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRvIHRydWUgaWYgY2FsbGVkIGJ5IENvbXBsZXggVHlwZSAmIFNpbXBsZSBUeXBlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTaG93RGVyaXZlZEJ5KGJvb2xlYW4gZGVyaXZlKQotICB7Ci0gICAgc2hvd0Rlcml2ZWRCeSA9IGRlcml2ZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBkZXJpdmVkQnlGaWVsZAotICAgKiBAcmV0dXJuIFJldHVybnMgYSBCdXR0b24KLSAgICovCi0gIHB1YmxpYyBDb21ibyBnZXREZXJpdmVkQnlDb21ibygpCi0gIHsKLSAgICByZXR1cm4gZGVyaXZlZEJ5Q29tYm87Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbm9uZVJhZGlvLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBCdXR0b24KLSAgICovCi0gIHB1YmxpYyBCdXR0b24gZ2V0Tm9uZVJhZGlvKCkKLSAgewotICAgIHJldHVybiBub25lUmFkaW87Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgc2ltcGxlVHlwZS4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgQnV0dG9uCi0gICAqLwotICBwdWJsaWMgQnV0dG9uIGdldFNpbXBsZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHNpbXBsZVR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgdXNlckNvbXBsZXhUeXBlLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBCdXR0b24KLSAgICovCi0gIHB1YmxpYyBCdXR0b24gZ2V0VXNlckNvbXBsZXhUeXBlKCkKLSAgewotICAgIHJldHVybiB1c2VyQ29tcGxleFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgdXNlclNpbXBsZVR5cGUuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIEJ1dHRvbgotICAgKi8KLSAgcHVibGljIEJ1dHRvbiBnZXRVc2VyU2ltcGxlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gdXNlclNpbXBsZVR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgdHlwZUxpc3QuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIENDb21ibwotICAgKi8KLSAgcHVibGljIENvbWJvIGdldFR5cGVMaXN0KCkKLSAgewotICAgIHJldHVybiB0eXBlTGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBQb3B1bGF0ZSBjb21ibyBib3ggd2l0aCBidWlsdC1pbiBzaW1wbGUgdHlwZXMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHBvcHVsYXRlQnVpbHRJblR5cGUoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIGdldFR5cGVMaXN0KCkucmVtb3ZlQWxsKCk7Ci0gICAgTGlzdCBpdGVtcyA9IGdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KHhzZFNjaGVtYSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBnZXRUeXBlTGlzdCgpLmFkZChpdGVtcy5nZXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICByZXR1cm4gaGVscGVyLmdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KCk7Ci0gIH0KLQotICAvKioKLSAgICogUG9wdWxhdGUgY29tYm8gYm94IHdpdGggdXNlciBkZWZpbmVkIGNvbXBsZXggdHlwZXMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHBvcHVsYXRlVXNlckNvbXBsZXhUeXBlKFhTRFNjaGVtYSB4c2RTY2hlbWEsIGJvb2xlYW4gc2hvd0Fub255bW91cykKLSAgewotICAgIGdldFR5cGVMaXN0KCkucmVtb3ZlQWxsKCk7Ci0gICAgaWYgKHNob3dBbm9ueW1vdXMpCi0gICAgewotICAgICAgZ2V0VHlwZUxpc3QoKS5hZGQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FOT05ZTU9VUyIpKTsKLSAgICB9Ci0KLSAgICBMaXN0IGl0ZW1zID0gZ2V0VXNlckNvbXBsZXhUeXBlTmFtZXNMaXN0KHhzZFNjaGVtYSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBnZXRUeXBlTGlzdCgpLmFkZChpdGVtcy5nZXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGphdmEudXRpbC5MaXN0IGdldFVzZXJDb21wbGV4VHlwZU5hbWVzTGlzdChYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHhzZFNjaGVtYSk7Ci0gICAgcmV0dXJuIGhlbHBlci5nZXRVc2VyQ29tcGxleFR5cGVOYW1lc0xpc3QoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBvcHVsYXRlVXNlclNpbXBsZVR5cGUoWFNEU2NoZW1hIHhzZFNjaGVtYSwgYm9vbGVhbiBzaG93QW5vbnltb3VzKQotICB7Ci0gICAgZ2V0VHlwZUxpc3QoKS5yZW1vdmVBbGwoKTsKLSAgICBpZiAoc2hvd0Fub255bW91cykKLSAgICB7Ci0gICAgICBnZXRUeXBlTGlzdCgpLmFkZChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQU5PTllNT1VTIikpOwotICAgIH0KLSAgICBMaXN0IGl0ZW1zID0gZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoeHNkU2NoZW1hKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIGdldFR5cGVMaXN0KCkuYWRkKGl0ZW1zLmdldChpKS50b1N0cmluZygpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUG9wdWxhdGUgY29tYm8gYm94IHdpdGggdXNlciBkZWZpbmVkIHNpbXBsZSB0eXBlcwotICAgKi8KLSAgcHVibGljIHZvaWQgcG9wdWxhdGVVc2VyU2ltcGxlVHlwZShYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgZ2V0VHlwZUxpc3QoKS5yZW1vdmVBbGwoKTsKLSAgICBMaXN0IGl0ZW1zID0gZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoeHNkU2NoZW1hKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIGdldFR5cGVMaXN0KCkuYWRkKGl0ZW1zLmdldChpKS50b1N0cmluZygpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgIHJldHVybiBoZWxwZXIuZ2V0VXNlclNpbXBsZVR5cGVOYW1lc0xpc3QoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBucywgWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgIFN0cmluZyBrZXkgPSBoZWxwZXIuZ2V0UHJlZml4KG5zLCB0cnVlKTsKLSAgICByZXR1cm4ga2V5OwotICB9Ci0KLSAgLyoqCi0gICAqIFBvcHVsYXRlIGNvbWJvIGJveCB3aXRoIGRlcml2ZWQgYnkgY2hvaWNlcwotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVEZXJpdmVkQnlDb21ibygpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlcml2ZWRCeUNob2ljZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgZ2V0RGVyaXZlZEJ5Q29tYm8oKS5hZGQoZGVyaXZlZEJ5Q2hvaWNlc1tpXSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIHNob3dVc2VyQ29tcGxleFR5cGUuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFNob3dVc2VyQ29tcGxleFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHNob3dVc2VyQ29tcGxleFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgc2hvd1VzZXJTaW1wbGVUeXBlLgotICAgKiBAcmV0dXJuIFJldHVybnMgYSBib29sZWFuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93VXNlclNpbXBsZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHNob3dVc2VyU2ltcGxlVHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBzaG93Tm9uZS4KLSAgICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0U2hvd05vbmUoKQotICB7Ci0gICAgcmV0dXJuIHNob3dOb25lOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHNob3dVc2VyQ29tcGxleFR5cGUuCi0gICAqIEBwYXJhbSBzaG93VXNlckNvbXBsZXhUeXBlIFRoZSBzaG93VXNlckNvbXBsZXhUeXBlIHRvIHNldAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2hvd1VzZXJDb21wbGV4VHlwZShib29sZWFuIHNob3dVc2VyQ29tcGxleFR5cGUpCi0gIHsKLSAgICB0aGlzLnNob3dVc2VyQ29tcGxleFR5cGUgPSBzaG93VXNlckNvbXBsZXhUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHNob3dVc2VyU2ltcGxlVHlwZS4KLSAgICogQHBhcmFtIHNob3dVc2VyU2ltcGxlVHlwZSBUaGUgc2hvd1VzZXJTaW1wbGVUeXBlIHRvIHNldAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2hvd1VzZXJTaW1wbGVUeXBlKGJvb2xlYW4gc2hvd1VzZXJTaW1wbGVUeXBlKQotICB7Ci0gICAgdGhpcy5zaG93VXNlclNpbXBsZVR5cGUgPSBzaG93VXNlclNpbXBsZVR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgc2hvd05vbmUKLSAgICogQHBhcmFtIHNob3dVc2VyU2ltcGxlVHlwZSBUaGUgc2hvd05vbmUgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTaG93Tm9uZShib29sZWFuIHNob3dOb25lKQotICB7Ci0gICAgdGhpcy5zaG93Tm9uZSA9IHNob3dOb25lOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aWRnZXRzL1hTREVkaXRTY2hlbWFJbmZvRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aWRnZXRzL1hTREVkaXRTY2hlbWFJbmZvRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ODZiYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2lkZ2V0cy9YU0RFZGl0U2NoZW1hSW5mb0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgkgICBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLkVkaXRTY2hlbWFJbmZvRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0LkNvbW1vbkVkaXROYW1lc3BhY2VzVGFyZ2V0RmllbGREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLlByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZvcm07Ci0KLXB1YmxpYyBjbGFzcyBYU0RFZGl0U2NoZW1hSW5mb0RpYWxvZyBleHRlbmRzIEVkaXRTY2hlbWFJbmZvRGlhbG9nIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCVN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0JQ29tbW9uRWRpdE5hbWVzcGFjZXNUYXJnZXRGaWVsZERpYWxvZyBlZGl0TmFtZXNwYWNlc0NvbnRyb2w7Ci0gIENvbWJvIGVsZW1lbnRGb3JtQ29tYm8sIGF0dHJpYnV0ZUZvcm1Db21ibzsKLSAgU3RyaW5nIGVsZW1lbnRGb3JtUXVhbGlmaWVkID0gIiIsIGF0dHJpYnV0ZUZvcm1RdWFsaWZpZWQgPSAiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gIAotICBwcml2YXRlIFN0cmluZyBbXSBmb3JtUXVhbGlmaWNhdGlvbiA9IHsgIiIsIFhTREZvcm0uUVVBTElGSUVEX0xJVEVSQUwuZ2V0TGl0ZXJhbCgpLCBYU0RGb3JtLlVOUVVBTElGSUVEX0xJVEVSQUwuZ2V0TGl0ZXJhbCgpIH07ICAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIFhTREVkaXRTY2hlbWFJbmZvRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCByZXNvdXJjZUxvY2F0aW9uKTsKLQkJdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0JfQotLyoKLQkvLyBpbiBzdXBlcgotCXByb3RlY3RlZCBDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyBjcmVhdGVDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyhDb21wb3NpdGUgZGlhbG9nQXJlYSkKLQl7Ci0JICByZXR1cm4gbmV3IENvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nKGRpYWxvZ0FyZWEsIHJlc291cmNlTG9jYXRpb24sIFhNTFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlX1VJX05BTUVTUEFDRV9ERUNMQVJBVElPTlMiKSwgZmFsc2UsIHRydWUpOyAvLyROT04tTkxTLTEkCQkJCQotCX0KLQkKLQkvLyBpbiBzdXBlcgotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2cgZWRpdE5hbWVzcGFjZXNDb250cm9sID0gY3JlYXRlQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2coZGlhbG9nQXJlYSk7IAotCQllZGl0TmFtZXNwYWNlc0NvbnRyb2wuc2V0TmFtZXNwYWNlSW5mb0xpc3QobmFtZXNwYWNlSW5mb0xpc3QpOwotCQllZGl0TmFtZXNwYWNlc0NvbnRyb2wudXBkYXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCQotCS8vIGluIHRoaXMKLQlwcm90ZWN0ZWQgQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2cgY3JlYXRlQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2coQ29tcG9zaXRlIGRpYWxvZ0FyZWEpCi0JewotCSAgcmV0dXJuIG5ldyBDb21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nKGRpYWxvZ0FyZWEsIHJlc291cmNlTG9jYXRpb24pOyAvLyROT04tTkxTLTEkCQkJCQotCX0JKi8KLQkKLQkvLyB0aGlzIGlzIGNvcHkgb2YgLi4uLgotICAgIHByb3RlY3RlZCBDb250cm9sIF9faW50ZXJuYWxDcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgLy8gY3JlYXRlIGEgY29tcG9zaXRlIHdpdGggc3RhbmRhcmQgbWFyZ2lucyBhbmQgc3BhY2luZwotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0gICAgICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLSAgICAgICAgbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9CQotCQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIF9faW50ZXJuYWxDcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWVkaXROYW1lc3BhY2VzQ29udHJvbCA9IG5ldyBDb21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nKGRpYWxvZ0FyZWEsIHJlc291cmNlTG9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCWlmICh0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCkKLQkJewkKLQkJCWVkaXROYW1lc3BhY2VzQ29udHJvbC5zZXRUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsKLQkJfQotCQllZGl0TmFtZXNwYWNlc0NvbnRyb2wuc2V0TmFtZXNwYWNlSW5mb0xpc3QobmFtZXNwYWNlSW5mb0xpc3QpOwotCQllZGl0TmFtZXNwYWNlc0NvbnRyb2wudXBkYXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0KTsKLSAgICAKLSAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAKLSAgICBDb21wb3NpdGUgb3RoZXJBdHRyaWJ1dGVzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgb3RoZXJBdHRyaWJ1dGVzQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotICAgIG90aGVyQXR0cmlidXRlc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIAotICAgIExhYmVsIGVsZW1lbnRGb3JtTGFiZWwgPSBuZXcgTGFiZWwob3RoZXJBdHRyaWJ1dGVzQ29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0gICAgZWxlbWVudEZvcm1MYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9FTEVNRU5URk9STURFRkFVTFQpOwotICAgIAotICAgIE9iamVjdCBvYmplY3QgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKS5nZXRBZGFwdGVyKFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuY2xhc3MpOwotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKQotICAgIHsKLSAgICAgIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciA9IChQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKW9iamVjdDsKLSAgICAgIFN0cmluZyBuZXdTdHJpbmcgPSBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmdldFByb2R1Y3RTdHJpbmcoIkxBQkVMX0VMRU1FTlRfRk9STV9ERUZBVUxUIik7Ci0gICAgICBpZiAobmV3U3RyaW5nICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGVsZW1lbnRGb3JtTGFiZWwuc2V0VGV4dChuZXdTdHJpbmcpOwotICAgICAgfQotICAgIH0KLQotICAgIAotICAgIGVsZW1lbnRGb3JtQ29tYm8gPSBuZXcgQ29tYm8ob3RoZXJBdHRyaWJ1dGVzQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgZWxlbWVudEZvcm1Db21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICBlbGVtZW50Rm9ybUNvbWJvLnNldEl0ZW1zKGZvcm1RdWFsaWZpY2F0aW9uKTsKLSAgICBlbGVtZW50Rm9ybUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIExhYmVsIGF0dHJpYnV0ZUZvcm1MYWJlbCA9IG5ldyBMYWJlbChvdGhlckF0dHJpYnV0ZXNDb21wb3NpdGUsIFNXVC5MRUZUKTsKLSAgICBhdHRyaWJ1dGVGb3JtTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfQVRUUklCVVRFRk9STURFRkFVTFQpOwotICAgIAotICAgIGF0dHJpYnV0ZUZvcm1Db21ibyA9IG5ldyBDb21ibyhvdGhlckF0dHJpYnV0ZXNDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBhdHRyaWJ1dGVGb3JtQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgYXR0cmlidXRlRm9ybUNvbWJvLnNldEl0ZW1zKGZvcm1RdWFsaWZpY2F0aW9uKTsKLSAgICBhdHRyaWJ1dGVGb3JtQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXJldHVybiBkaWFsb2dBcmVhOwotCX0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBlZGl0TmFtZXNwYWNlc0NvbnRyb2wuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0JfQotICAKLSAgcHVibGljIHZvaWQgc2V0SXNFbGVtZW50UXVhbGlmaWVkKFN0cmluZyBzdGF0ZSkKLSAgewotICAgIGVsZW1lbnRGb3JtQ29tYm8uc2V0VGV4dChzdGF0ZSk7Ci0gICAgZWxlbWVudEZvcm1RdWFsaWZpZWQgPSBzdGF0ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SXNBdHRyaWJ1dGVRdWFsaWZpZWQoU3RyaW5nIHN0YXRlKQotICB7Ci0gICAgYXR0cmlidXRlRm9ybUNvbWJvLnNldFRleHQoc3RhdGUpOwotICAgIGF0dHJpYnV0ZUZvcm1RdWFsaWZpZWQgPSBzdGF0ZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50Rm9ybVF1YWxpZmllZCgpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudEZvcm1RdWFsaWZpZWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlRm9ybVF1YWxpZmllZCgpCi0gIHsKLSAgICByZXR1cm4gYXR0cmlidXRlRm9ybVF1YWxpZmllZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IGF0dHJpYnV0ZUZvcm1Db21ibykKLSAgICB7Ci0gICAgICBhdHRyaWJ1dGVGb3JtUXVhbGlmaWVkID0gYXR0cmlidXRlRm9ybUNvbWJvLmdldFRleHQoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gZWxlbWVudEZvcm1Db21ibykKLSAgICB7Ci0gICAgICBlbGVtZW50Rm9ybVF1YWxpZmllZCA9IGVsZW1lbnRGb3JtQ29tYm8uZ2V0VGV4dCgpOwotICAgIH0KLQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WFNEV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hTRFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWNkMjlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WFNEV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNldFNlbGVjdGlvblRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBOZXdYU0RXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQlwcml2YXRlIFhTRE5ld0ZpbGVQYWdlIG5ld0ZpbGVQYWdlOwotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCXByaXZhdGUgSVdvcmtiZW5jaCB3b3JrYmVuY2g7Ci0KLQlwdWJsaWMgTmV3WFNEV2l6YXJkKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gYVNlbGVjdGlvbjsKLQkJdGhpcy53b3JrYmVuY2ggPSBhV29ya2JlbmNoOwotCi0JCXRoaXMuc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFhTREVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL05ld1hTRC5wbmciKSk7Ci0JCXRoaXMuc2V0V2luZG93VGl0bGUoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1dJWkFSRF9DUkVBVEVfWFNEX01PREVMX1RJVExFIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQluZXdGaWxlUGFnZSA9IG5ldyBYU0ROZXdGaWxlUGFnZShzZWxlY3Rpb24pOwotCQlhZGRQYWdlKG5ld0ZpbGVQYWdlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlJRmlsZSBmaWxlID0gbmV3RmlsZVBhZ2UuY3JlYXRlTmV3RmlsZSgpOwotCi0JCS8vCi0JCS8vIEdldCB0aGUgeHNkIHNjaGVtYSBuYW1lIGZyb20gdGhlIGZ1bGwgcGF0aCBuYW1lCi0JCS8vIGUuZy4gZjovYjJiL3BvLnhzZCA9PiBzY2hlbWEgbmFtZSA9IHBvCi0JCS8vCi0JCUlQYXRoIGlQYXRoID0gZmlsZS5nZXRGdWxsUGF0aCgpLnJlbW92ZUZpbGVFeHRlbnNpb24oKTsKLQkJLy8gU3RyaW5nIHNjaGVtYU5hbWUgPSBpUGF0aC5sYXN0U2VnbWVudCgpOwotCQlTdHJpbmcgc2NoZW1hTmFtZSA9IGlQYXRoLmxhc3RTZWdtZW50KCk7Ci0JCVN0cmluZyBzY2hlbWFQcmVmaXggPSAidG5zIjsKLQkJU3RyaW5nIHByZWZpeEZvclNjaGVtYU5hbWVzcGFjZSA9ICIiOwotCQlTdHJpbmcgc2NoZW1hTmFtZXNwYWNlQXR0cmlidXRlID0gInhtbG5zIjsKLQkJaWYgKFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5pc1F1YWxpZnlYTUxTY2hlbWFMYW5ndWFnZSgpKSB7Ci0JCQkvLyBBZGRlZCB0aGlzIGlmIGNoZWNrIGJlZm9yZSBkaXNhbGxvd2luZyBibGFuayBwcmVmaXhlcyBpbiB0aGUKLQkJCS8vIHByZWZlcmVuY2VzLi4uCi0JCQkvLyBDYW4gdGFrZSB0aGlzIG91dC4gU2VlIGFsc28gWFNERWRpdG9yCi0JCQlpZiAoWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFhNTFNjaGVtYVByZWZpeCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlwcmVmaXhGb3JTY2hlbWFOYW1lc3BhY2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0WE1MU2NoZW1hUHJlZml4KCkgKyAiOiI7Ci0JCQkJc2NoZW1hTmFtZXNwYWNlQXR0cmlidXRlICs9ICI6IiArIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRYTUxTY2hlbWFQcmVmaXgoKTsKLQkJCX0KLQkJfQotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2UgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTdHJpbmcgY2hhclNldCA9IHByZWZlcmVuY2UuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQkJaWYgKGNoYXJTZXQgPT0gbnVsbCB8fCBjaGFyU2V0LnRyaW0oKS5lcXVhbHMoIiIpKSB7Ci0JCQljaGFyU2V0ID0gIlVURi04IjsKLQkJfQotCi0JCVN0cmluZyBuZXdDb250ZW50cyA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCIiICsgY2hhclNldCArICJcIj8+XG4iOwotCi0JCVN0cmluZyBkZWZhdWx0VGFyZ2V0VVJJID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldFhNTFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpOwotCQluZXdDb250ZW50cyArPSAiPCIgKyBwcmVmaXhGb3JTY2hlbWFOYW1lc3BhY2UgKyAic2NoZW1hICIgKyBzY2hlbWFOYW1lc3BhY2VBdHRyaWJ1dGUgKyAiPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWFcIiB0YXJnZXROYW1lc3BhY2U9XCIiICsgZGVmYXVsdFRhcmdldFVSSSArIHNjaGVtYU5hbWUgKyAiXCIgeG1sbnM6IiArIHNjaGVtYVByZWZpeCArICI9XCIiICsgZGVmYXVsdFRhcmdldFVSSSArIHNjaGVtYU5hbWUgKyAiXCIgZWxlbWVudEZvcm1EZWZhdWx0PVwicXVhbGlmaWVkXCI+XG48LyIgKyBwcmVmaXhGb3JTY2hlbWFOYW1lc3BhY2UgKyAic2NoZW1hPiI7Ci0KLQkJdHJ5IHsKLQkJCWJ5dGVbXSBieXRlcyA9IG5ld0NvbnRlbnRzLmdldEJ5dGVzKGNoYXJTZXQpOwotCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotCi0JCQlmaWxlLnNldENvbnRlbnRzKGlucHV0U3RyZWFtLCB0cnVlLCBmYWxzZSwgbnVsbCk7Ci0JCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLndyaXRlKCJFcnJvciB3cml0aW5nCi0JCQkvLyBkZWZhdWx0IGNvbnRlbnQ6XG4iICsgbmV3Q29udGVudHMpOwotCQkJLy8gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLndyaXRlKGUpOwotCQl9Ci0KLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJcmV2ZWFsU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpbGUpKTsKLQkJfQotCi0JCW9wZW5FZGl0b3IoZmlsZSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJldmVhbFNlbGVjdGlvbihmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2ggd29ya2JlbmNoMjsKLQkJCWlmICh3b3JrYmVuY2ggPT0gbnVsbCkKLQkJCXsKLQkJCSAgd29ya2JlbmNoMiA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRXb3JrYmVuY2goKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCSAgd29ya2JlbmNoMiA9IHdvcmtiZW5jaDsKLQkJCX0KLQkJCWZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoMi5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCWZpbmFsIElXb3JrYmVuY2hQYXJ0IGZvY3VzUGFydCA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlUGFydCgpOwotCQkJaWYgKGZvY3VzUGFydCBpbnN0YW5jZW9mIElTZXRTZWxlY3Rpb25UYXJnZXQpIHsKLQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkoKElTZXRTZWxlY3Rpb25UYXJnZXQpIGZvY3VzUGFydCkuc2VsZWN0UmV2ZWFsKHNlbGVjdGlvbik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW5FZGl0b3IoZmluYWwgSUZpbGUgaUZpbGUpIHsKLQkJaWYgKGlGaWxlICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2ggd29ya2JlbmNoMjsKLQkJCWlmICh3b3JrYmVuY2ggPT0gbnVsbCkKLQkJCXsKLQkJCSAgd29ya2JlbmNoMiA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRXb3JrYmVuY2goKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCSAgd29ya2JlbmNoMiA9IHdvcmtiZW5jaDsKLQkJCX0KLQkJCWZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoMi5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgZWRpdG9ySWQgPSBudWxsOwotCQkJCQkJSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRFZGl0b3JSZWdpc3RyeSgpLmdldERlZmF1bHRFZGl0b3IoaUZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCksIGlGaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpLmdldENvbnRlbnRUeXBlKCkpOwotCQkJCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCQkJZWRpdG9ySWQgPSBlZGl0b3IuZ2V0SWQoKTsKLQkJCQkJCX0KLQkJCQkJCXdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGlGaWxlKSwgZWRpdG9ySWQpOwotCQkJCQkJCi0JCQkJCX0KLQkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4KSB7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4Q29tcG9zaXRpb25QYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4Q29tcG9zaXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMTcxMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9SZWdleENvbXBvc2l0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIEJhc2VkIG9uIHZlcnNpb24gMS4xMiBvZiBvcmlnaW5hbCB4c2RlZGl0b3IKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm5TeW50YXhFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlZpZXdVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXR0ZXJuRmFjZXQ7Ci0KLQotCi0vKgotLW90aGVyIHJlZ2V4IGZlYXR1cmVzIChlZyBjYXNlIHNlbnNpdGl2aXR5LCBeIG9yICQsIHwsIGV0YyBldGMpCi0tc21hcnRlciBtb2RlbAotLWJldHRlciBrZXlib2FyZCBuYXZpZ2F0aW9uCi0tdXBkYXRlIGxpc3Qgb2YgdG9rZW5zIAotKi8KLQotcHVibGljIGNsYXNzIFJlZ2V4Q29tcG9zaXRpb25QYWdlIGV4dGVuZHMgV2l6YXJkUGFnZQotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0KLSAgLyogVGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2Ygb3VyIHBhdHRlcm4uICovCi0gIHByaXZhdGUgU3R5bGVkVGV4dCB2YWx1ZTsgCi0KLSAgLyogVGhlIFN0eWxlUmFuZ2UgdXNlZCB0byBjb2xvciBjb2RlIHRoZSBjdXJyZW50IHBhcnNlIGVycm9yLiAqLwotICBwcml2YXRlIFN0eWxlUmFuZ2UgY3VycmVudEVycm9yOwotCi0gIC8qIFRoZSByZWdleCB0ZXJtcyB3ZSBjYW4gZm9ybSB0b2tlbnMgZnJvbS4gKi8KLSAgcHJpdmF0ZSBDb21ibyB0ZXJtczsKLQotICAvKiBUaGUgY2hlY2tib3ggZm9yIGFjdGl2YXRpbmcgYXV0by1lc2NhcGUgbW9kZS4gKi8gIAotICBwcml2YXRlIEJ1dHRvbiBlc2NhcGVDaGVja2JveDsKLSAgCi0gIC8qIE9uL29mZiBzdGF0dXMgb2YgYXV0by1lc2NhcGUgbW9kZS4gKi8gCi0gIHByaXZhdGUgYm9vbGVhbiBhdXRvRXNjYXBlU3RhdHVzOwotCi0gIC8qIFRoZSBBZGQgVG9rZW4gYnV0dG9uLiAqLwotICBwcml2YXRlIEJ1dHRvbiBhZGQ7Ci0KLQotICAvLyBUaGUgZm9sbG93aW5nIGNvbnRyb2xzIGFyZSB1c2VkIGluIHRoZSBvY2N1cnJlbmNlIHNlbGVjdGlvbiBncm91cAotCi0gIHByaXZhdGUgVGV4dCByZXBlYXRWYWx1ZTsKLQotICBwcml2YXRlIFRleHQgcmFuZ2VNaW5WYWx1ZTsKLSAgcHJpdmF0ZSBUZXh0IHJhbmdlTWF4VmFsdWU7Ci0gIHByaXZhdGUgTGFiZWwgcmFuZ2VUb0xhYmVsOyAgCi0KLSAgcHJpdmF0ZSBCdXR0b24gc2luZ2xlUmFkaW87Ci0gIHByaXZhdGUgQnV0dG9uIHN0YXJSYWRpbzsKLSAgcHJpdmF0ZSBCdXR0b24gcGx1c1JhZGlvOwotICBwcml2YXRlIEJ1dHRvbiBvcHRpb25hbFJhZGlvOyAKLSAgcHJpdmF0ZSBCdXR0b24gcmVwZWF0UmFkaW87Ci0gIHByaXZhdGUgQnV0dG9uIHJhbmdlUmFkaW87Ci0KLSAgCi0gIC8vIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIHVzZWQgYXMgcGFydCBvZiB0aGUgbW9kZWwuIAotCi0gIC8qIE91ciBwYXR0ZXJuLiAqLwotICBwcml2YXRlIFhTRFBhdHRlcm5GYWNldCBwYXR0ZXJuOwotCi0gIC8qIE1vZGVsIHVzZWQgdG8gc3RvcmUgdGhlIGN1cnJlbnQgdG9rZW4uICovCi0gIHByaXZhdGUgUmVnZXhOb2RlIG5vZGU7ICAgIAotCi0gIC8qIFRoZSBmbGFncyBwYXNzZWQgdG8gdGhlIG5ldyBSZWd1bGFyRXhwcmVzc2lvbiBvYmplY3QuICBEZWZhdWx0IHZhbHVlIGluY2x1ZGVzOgotICAgICAgWCA9IFhNTFNjaGVtYSBtb2RlICAgICovCi0gIHByaXZhdGUgU3RyaW5nIHJlZ2V4RmxhZ3MgPSAiWCI7Ci0gICAgICAKLQotICAvKiBJcyB0aGUgY3VycmVudCByZWdleCB0b2tlbiB2YWxpZD8gKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRUb2tlbjsKLQotICAvKiBUaGUgbGFiZWwgdXNlZCB0byBpbmRpY2F0ZSB0aGUgdmFsdWUncyBjYXJldCBwb3NpdGlvbiB3aGVuIGl0IGxvb3NlcyBmb2N1cy4gKi8KLSAgcHJpdmF0ZSBMYWJlbCBjYXJldExhYmVsOwotCi0gIC8qIFRoZSBwaXhlbCBvZmZzZXRzIG5lZWRlZCB0byBhbGlnbiB0aGUgbGFiZWwgaWNvbiB3aXRoIHRoZSBjYXJldCBsb2NhdGlvbi4KLSAgICAgVGhlc2UgYXJlIGRlcGVuZGVudCBvbiB0aGUgaWNvbiB1c2VkLiAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FSRVRfTEFCRUxfWF9PRkZTRVQgPSAtMzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBUkVUX0xBQkVMX1lfT0ZGU0VUID0gMTk7Ci0KLSAgCi0gIC8qIEVudW1lcmF0ZWQgY29uc3RhbnRzIGZvciBzcGVjaWZ5aW5nIHRoZSB0eXBlIG9mIGFuIGVycm9yIG1lc3NhZ2UuICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT0tFTiA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RJT04gPSAxOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFSU0UgPSAyOwotICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9FUlJPUl9NRVNTQUdFX1RZUEVTID0gMzsKLSAgCi0gIC8qIFRoZSBjdXJyZW50IGVycm9yIG1lc3NhZ2UgZm9yIGVhY2ggdHlwZSBvZiBlcnJvci4gIEEgdmFsdWUgb2YgbnVsbCBpbmRpY2F0ZXMgbm8gbWVzc2FnZS4gCi0gICAgIFRoZSBhcnJheSBpcyBpbmRleGVkIGFjY29yZGluZyB0byB0aGUgYWJvdmUgY29uc3RhbnRzLgotICAqLwotICBwcml2YXRlIFN0cmluZ1tdIGN1cnJlbnRFcnJvck1lc3NhZ2VzOwotCi0KLSAgcHVibGljIFJlZ2V4Q29tcG9zaXRpb25QYWdlKFhTRFBhdHRlcm5GYWNldCBwYXR0ZXJuKQotICB7Ci0gICAgc3VwZXIoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9DT01QT1NJVElPTl9QQUdFX1RJVExFIikpOwotICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm47Ci0KLSAgICBzZXRUaXRsZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0NPTVBPU0lUSU9OX1BBR0VfVElUTEUiKSk7Ci0gICAgc2V0RGVzY3JpcHRpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9DT01QT1NJVElPTl9QQUdFX0RFU0NSSVBUSU9OIikpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gU2V0IHVwIG91ciBtb2RlbCBhbmQgdmFsaWRhdG9yCi0gICAgbm9kZSA9IG5ldyBSZWdleE5vZGUoKTsKLSAgICAgICAgCi0gICAgaXNWYWxpZFRva2VuID0gdHJ1ZTsKLQotICAgIGN1cnJlbnRFcnJvck1lc3NhZ2VzID0gbmV3IFN0cmluZ1tOVU1fRVJST1JfTUVTU0FHRV9UWVBFU107Ci0KLSAgICAvLyBUaGUgbWFpbiBjb21wb3NpdGUKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBYU0RFZGl0b3JDU0hlbHBJZHMuUkVHRVhfV0laQVJEX1BBR0UpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQotICAgIC8vIFRoZSBjb21wb3NpdGUgZm9yIHRoZSB0b2tlbiBjb21ibyBib3gsIGxhYmVsLCBhbmQgYXV0by1lc2NhcGUgY2hlY2tib3gKLSAgICBDb21wb3NpdGUgdG9rZW5Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlIChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IHRva2VuQ29tcG9zaXRlTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICB0b2tlbkNvbXBvc2l0ZUxheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICB0b2tlbkNvbXBvc2l0ZUxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgdG9rZW5Db21wb3NpdGUuc2V0TGF5b3V0KHRva2VuQ29tcG9zaXRlTGF5b3V0KTsKLQotCi0gICAgbmV3IExhYmVsKHRva2VuQ29tcG9zaXRlLCBTV1QuTEVGVCkuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RPS0VOX0xBQkVMIikpOwotICAgIAotICAgIHRlcm1zID0gbmV3IENvbWJvKHRva2VuQ29tcG9zaXRlLCBTV1QuRFJPUF9ET1dOKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRlcm1zLCBYU0RFZGl0b3JDU0hlbHBJZHMuUkVHRVhfVE9LRU5fQ09OVEVOVFMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUmVnZXhOb2RlLmdldE51bVJlZ2V4VGVybXMoKTsgaSsrKQotICAgIHsKLSAgICAgIHRlcm1zLmFkZChSZWdleE5vZGUuZ2V0UmVnZXhUZXJtVGV4dChpKSk7Ci0gICAgfQotICAgIHRlcm1zLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIG5ldyBDb21ib0xpc3RlbmVyKCkpOwotICAgIHRlcm1zLnNldFRvb2xUaXBUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9URVJNUyIpKTsKLQotICAgIGVzY2FwZUNoZWNrYm94ID0gbmV3IEJ1dHRvbih0b2tlbkNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLSAgICBlc2NhcGVDaGVja2JveC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfQVVUT19FU0NBUEVfQ0hFQ0tCT1hfTEFCRUwiKSk7Ci0gICAgZXNjYXBlQ2hlY2tib3guc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX0FVVE9fRVNDQVBFX0NIRUNLQk9YIikpOyAKLSAgICBlc2NhcGVDaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgQ2hlY2tib3hMaXN0ZW5lcigpKTsKLSAgICBhdXRvRXNjYXBlU3RhdHVzID0gZmFsc2U7Ci0KLQotICAgIC8vIFNldCB1cCB0aGUgY29tcG9zaXRlcyBwZXJ0YWluaW5nIHRvIHRoZSBzZWxlY3Rpb24gb2Ygb2NjdXJyZW5jZSBxdWFudGlmaWVycwotCi0gICAgR3JvdXAgb2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgb2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX09DQ1VSRU5DRV9MQUJFTCIpKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG9jY3VycmVuY2VTZWxlY3Rpb25BcmVhLCBYU0RFZGl0b3JDU0hlbHBJZHMuUkVHRVhfV0laQVJEX1BBR0UpOwotICAgIEdyaWRMYXlvdXQgc2VsZWN0aW9uQXJlYUxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgc2VsZWN0aW9uQXJlYUxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYS5zZXRMYXlvdXQoc2VsZWN0aW9uQXJlYUxheW91dCk7Ci0KLSAgICBvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotICAgIC8vIExpc3RlbmVyIHVzZWQgZm9yIGFsbCBvZiB0aGUgdGV4dCBmaWVsZHMKLSAgICBUZXh0TGlzdGVuZXIgdGV4dExpc3RlbmVyID0gbmV3IFRleHRMaXN0ZW5lcigpOwotICAgIAotCi0gICAgLy8gQWRkIHRoZSByYWRpbyBidXR0b25zCi0gICAgUmFkaW9TZWxlY3RMaXN0ZW5lciByYWRpb1NlbGVjdExpc3RlbmVyID0gbmV3IFJhZGlvU2VsZWN0TGlzdGVuZXIoKTsKLQotICAgIHNpbmdsZVJhZGlvID0gYWRkT2NjdXJlbmNlUmFkaW9CdXR0b24oUmVnZXhOb2RlLlNJTkdMRSwgb2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEsIHJhZGlvU2VsZWN0TGlzdGVuZXIpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2luZ2xlUmFkaW8sIFhTREVkaXRvckNTSGVscElkcy5SRUdFWF9KVVNUX09OQ0UpOwotICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUhvcml6b250YWxGaWxsZXIob2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEsIDEpOwotCi0gICAgc3RhclJhZGlvID0gYWRkT2NjdXJlbmNlUmFkaW9CdXR0b24oUmVnZXhOb2RlLlNUQVIsIG9jY3VycmVuY2VTZWxlY3Rpb25BcmVhLCByYWRpb1NlbGVjdExpc3RlbmVyKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHN0YXJSYWRpbywgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX1pFUk9fT1JfTU9SRSk7Ci0gICAgVmlld1V0aWxpdHkuY3JlYXRlSG9yaXpvbnRhbEZpbGxlcihvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgMSk7Ci0KLSAgICBwbHVzUmFkaW8gPSBhZGRPY2N1cmVuY2VSYWRpb0J1dHRvbihSZWdleE5vZGUuUExVUywgb2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEsIHJhZGlvU2VsZWN0TGlzdGVuZXIpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGx1c1JhZGlvLCBYU0RFZGl0b3JDU0hlbHBJZHMuUkVHRVhfT05FX09SX01PUkUpOwotICAgIFZpZXdVdGlsaXR5LmNyZWF0ZUhvcml6b250YWxGaWxsZXIob2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEsIDEpOwotCi0gICAgb3B0aW9uYWxSYWRpbyA9IGFkZE9jY3VyZW5jZVJhZGlvQnV0dG9uKFJlZ2V4Tm9kZS5PUFRJT05BTCwgb2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEsIHJhZGlvU2VsZWN0TGlzdGVuZXIpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAob3B0aW9uYWxSYWRpbywgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX09QVElPTkFMKTsKLSAgICBWaWV3VXRpbGl0eS5jcmVhdGVIb3Jpem9udGFsRmlsbGVyKG9jY3VycmVuY2VTZWxlY3Rpb25BcmVhLCAxKTsKLQotICAgIHJlcGVhdFJhZGlvID0gYWRkT2NjdXJlbmNlUmFkaW9CdXR0b24oUmVnZXhOb2RlLlJFUEVBVCwgb2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEsIHJhZGlvU2VsZWN0TGlzdGVuZXIpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmVwZWF0UmFkaW8sIFhTREVkaXRvckNTSGVscElkcy5SRUdFWF9SRVBFQVRfUkFESU8pOwotICAgIAotICAgIHJlcGVhdFZhbHVlID0gbmV3IFRleHQob2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICByZXBlYXRWYWx1ZS5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0ZXh0TGlzdGVuZXIpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmVwZWF0VmFsdWUsIFhTREVkaXRvckNTSGVscElkcy5SRUdFWF9SRVBFQVRfRklFTEQpOwotICAgIHJlcGVhdFZhbHVlLnNldFRvb2xUaXBUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9SRVBFQVQiKSk7Ci0gICAgcmVwZWF0VmFsdWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgc2V0RW5hYmxlZFN0YXR1cyhSZWdleE5vZGUuUkVQRUFULCBmYWxzZSk7Ci0gICAgCi0gICAgcmFuZ2VSYWRpbyA9IGFkZE9jY3VyZW5jZVJhZGlvQnV0dG9uKFJlZ2V4Tm9kZS5SQU5HRSwgb2NjdXJyZW5jZVNlbGVjdGlvbkFyZWEsIHJhZGlvU2VsZWN0TGlzdGVuZXIpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmFuZ2VSYWRpbywgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX1JBTkdFX1JBRElPKTsKLQotICAgIC8vIEFkZCB0ZXh0IGZpZWxkcyBhbmQgbGFiZWxzIGZvciBzcGVjaWZ5aW5nIHRoZSByYW5nZSAgICAKLSAgICBDb21wb3NpdGUgcmFuZ2VXaWRnZXRzID0gbmV3IENvbXBvc2l0ZShvY2N1cnJlbmNlU2VsZWN0aW9uQXJlYSwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgcmFuZ2VXaWRnZXRzLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICByYW5nZVdpZGdldHMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgCi0gICAgcmFuZ2VNaW5WYWx1ZSA9IG5ldyBUZXh0KHJhbmdlV2lkZ2V0cywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIHJhbmdlTWluVmFsdWUuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGV4dExpc3RlbmVyKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJhbmdlTWluVmFsdWUsIFhTREVkaXRvckNTSGVscElkcy5SRUdFWF9SQU5HRV9NSU5JTVVNX0ZJRUxEKTsKLSAgICByYW5nZU1pblZhbHVlLnNldFRvb2xUaXBUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9NSU4iKSk7Ci0gICAgcmFuZ2VNaW5WYWx1ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAKLSAgICByYW5nZVRvTGFiZWwgPSBuZXcgTGFiZWwocmFuZ2VXaWRnZXRzLCBTV1QuTk9ORSk7Ci0gICAgcmFuZ2VUb0xhYmVsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9UT19MQUJFTCIpKTsKLSAgICAKLSAgICByYW5nZU1heFZhbHVlID0gbmV3IFRleHQocmFuZ2VXaWRnZXRzLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgcmFuZ2VNYXhWYWx1ZS5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0ZXh0TGlzdGVuZXIpOwotICAgIHJhbmdlTWF4VmFsdWUuc2V0VG9vbFRpcFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RPT0xUSVBfUkVHRVhfV0laQVJEX01BWCIpKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJhbmdlTWF4VmFsdWUsIFhTREVkaXRvckNTSGVscElkcy5SRUdFWF9SQU5HRV9NQVhJTVVNX0ZJRUxEKTsKLSAgICByYW5nZU1heFZhbHVlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgc2V0RW5hYmxlZFN0YXR1cyhSZWdleE5vZGUuUkFOR0UsIGZhbHNlKTsKLSAgICAKLSAgICBzaW5nbGVSYWRpby5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgCi0gICAgLy8gVGhlIGFkZCBidXR0b24KLSAgICBhZGQgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgIGFkZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgQnV0dG9uU2VsZWN0TGlzdGVuZXIoKSk7Ci0gICAgYWRkLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9BRERfQlVUVE9OX0xBQkVMIikpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYWRkLCBYU0RFZGl0b3JDU0hlbHBJZHMuUkVHRVhfQUREX0JVVFRPTik7Ci0gICAgYWRkLnNldFRvb2xUaXBUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9BRERfQlVUVE9OIikpOwotCi0gICAgCi0gICAgTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICBzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICAKLSAgICAvLyBPdXIgbWFpbiB0ZXh0IGJveAotCi0gICAgTGFiZWwgdmFsdWVMYWJlbD0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotICAgIHZhbHVlTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0NVUlJFTlRfUkVHRVhfTEFCRUwiKSk7Ci0gICAgCi0gICAgdmFsdWUgPSBuZXcgU3R5bGVkVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICB2YWx1ZS5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0ZXh0TGlzdGVuZXIpOwotICAgIHZhbHVlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRleHRMaXN0ZW5lcik7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh2YWx1ZSwgWFNERWRpdG9yQ1NIZWxwSWRzLlJFR0VYX0NVUlJFTlRfVkFMVUUpOwotICAgIHZhbHVlLnNldFRvb2xUaXBUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9UT09MVElQX1JFR0VYX1dJWkFSRF9DVVJSRU5UX1JFR0VYIikpOwotICAgIHZhbHVlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgdmFsdWUuc2V0Rm9jdXMoKTsKLQotICAgIC8vIFN0eWxlUmFuZ2UgdXNlZCBmb3IgaGlnaGxpZ2h0aW5nIHBhcnNlIGVycm9ycwotICAgIGN1cnJlbnRFcnJvciA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0gICAgY3VycmVudEVycm9yLmxlbmd0aCA9IDE7Ci0gICAgY3VycmVudEVycm9yLmZvcmVncm91bmQgPSBwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOwotCi0gICAgLy8gVGhlIGNhcmV0IGxhYmVsCi0gICAgY2FyZXRMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLSAgICBjYXJldExhYmVsLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvUmVnZXhXaXphcmRBcnJvdy5naWYiKSk7Ci0gICAgY2FyZXRMYWJlbC5zZXRUb29sVGlwVGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVE9PTFRJUF9SRUdFWF9XSVpBUkRfQ0FSRVRfTEFCRUwiKSk7Ci0gICAgc2V0U2hvd0NhcmV0TGFiZWwodHJ1ZSk7Ci0KLSAgICB2YWx1ZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBUZXh0Rm9jdXNMaXN0ZW5lcigpKTsKLQotICAgIHRlcm1zLnNlbGVjdCgwKTsKLQotCi0gICAgc2V0Q29udHJvbChjb21wb3NpdGUpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkKLSAgewotICAgIHN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0KLSAgICB2YWx1ZS5zZXRUZXh0KHBhdHRlcm4uZ2V0TGV4aWNhbFZhbHVlKCkpOwotICAgIHZhbHVlLnNldENhcmV0T2Zmc2V0KHZhbHVlLmdldENoYXJDb3VudCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogU2V0cyB0aGUgdmlzaWJsZSBzdGF0dXMgb2YgY2FyZXRMYWJlbCB0byBzdGF0dXMuICBJZiBzdGF0dXMgaXMgdHJ1ZSwgdGhlbiB3ZSBhbHNvIHVwZGF0ZSB0aGUgcG9zaXRpb24KLSAgICogb2YgY2FyZXRMYWJlbCBpbiBvbmUgb2YgdHdvIHdheXMuICBJZiB0aGVyZSBpcyBubyBhY3RpdmUgc2VsZWN0aW9uIGluIHZhbHVlLCB3ZSBzZXQgY2FyZXRMYWJlbCdzCi0gICAqIHBvc2l0aW9uIHRvIGNvcnJlc3BvbmQgd2l0aCB0aGUgcG9zaXRpb24gb2YgdGhlIGFjdHVhbCBjYXJldC4gIEFsdGVybmF0aXZlbHksIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBzZWxlY3Rpb24KLSAgICogaW4gdmFsdWUsIHdlIHNldCBjYXJldExhYmVsJ3MgcG9zaXRpb24gdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VsZWN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gVGhlIG5ldyB2aXNpYmlsaXR5IHN0YXR1cyBvZiBjYXJldExhYmVsLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHNldFNob3dDYXJldExhYmVsKGJvb2xlYW4gc3RhdHVzKQotICB7Ci0gICAgaWYgKHN0YXR1cykKLSAgICB7Ci0gIAotICAgICAgaW50IG9mZnNldDsKLSAgICAgIAotICAgICAgaWYgKHZhbHVlLmdldFNlbGVjdGlvblRleHQoKS5lcXVhbHMoIiIpKQotICAgICAgewotICAgICAgICBvZmZzZXQgPSB2YWx1ZS5nZXRDYXJldE9mZnNldCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBvZmZzZXQgPSB2YWx1ZS5nZXRTZWxlY3Rpb24oKS54OwotICAgICAgfQotICAKLSAgICAgIFBvaW50IHAgPSB2YWx1ZS5nZXRMb2NhdGlvbkF0T2Zmc2V0KG9mZnNldCk7Ci0gICAgICAKLSAgICAgIHAueCArPSB2YWx1ZS5nZXRMb2NhdGlvbigpLng7Ci0gICAgICBwLnkgPSB2YWx1ZS5nZXRMb2NhdGlvbigpLnk7Ci0gICAgICAKLSAgICAgIC8vIFBsYWNlIHRoZSBsYWJlbCB1bmRlciB2YWx1ZSwgYW5kIG1ha2Ugc3VyZSBpdCBpcyBhbGlnbmVkIHdpdGggdGhlIGNhcmV0LgotICAgICAgLy8gVGhlIG9mZnNldHMgYXJlIGRlcGVuZGVudCBvbiB0aGUgaWNvbiB1c2VkLgotICAgICAgcC54ICs9IENBUkVUX0xBQkVMX1hfT0ZGU0VUOwotICAgICAgcC55ICs9IENBUkVUX0xBQkVMX1lfT0ZGU0VUOwotICAKLSAgICAgIGlmIChkZWJ1ZykKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQT0lOVDogIiArIHApOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICAKLSAgICAgIGNhcmV0TGFiZWwuc2V0TG9jYXRpb24ocCk7Ci0gICAgICBjYXJldExhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjYXJldExhYmVsLnNldFZpc2libGUoZmFsc2UpOwotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIEFkZHMgYSBuZXcgcmFkaW8gYnV0dG9uIHRvIENvbXBvc2l0ZSBjIHdpdGggU2VsZWN0aW9uTGlzdGVuZXIgbC4gIFRoZSB0ZXh0IG9mIHRoZSBidXR0b24gaXMgdGhlIFN0cmluZyBhc3NvY2lhdGVkIHdpdGgKLSAgICogcXVhbnRpZmllci4KLSAgICoKLSAgICogQHBhcmFtIHF1YW50aWZpZXIgVGhlIGRlc2lyZWQgcXVhbnRpZmllciwgYXMgZW51bWVyYXRlZCBpbiBSZWdleE5vZGUuCi0gICAqIEBwYXJhbSBjIFRoZSBDb21wb3NpdGUgdG8gYWRkIHRoZSBidXR0b25zIHRvIChub3JtYWxseSBvY2N1cnJlbmNlUmFkaW9CdXR0b25zKS4KLSAgICogQHBhcmFtIGwgVGhlIFNlbGVjdGlvbkxpc3RlbmVyIChub3JtYWxseSByYWRpb1NlbGVjdGlvbkxpc3RlbmVyKS4KLSAgICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBidXR0b24uCi0gICAqLwotICBwcml2YXRlIEJ1dHRvbiBhZGRPY2N1cmVuY2VSYWRpb0J1dHRvbihpbnQgcXVhbnRpZmllciwgQ29tcG9zaXRlIGMsIFNlbGVjdGlvbkxpc3RlbmVyIGwpCi0gIHsKLSAgICBCdXR0b24gcmVzdWx0ID0gbmV3IEJ1dHRvbihjLCBTV1QuUkFESU8pOwotICAgIHJlc3VsdC5zZXRUZXh0KFJlZ2V4Tm9kZS5nZXRRdWFudGlmaWVyVGV4dChxdWFudGlmaWVyKSk7Ci0gICAgcmVzdWx0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGwpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZXMgdGhlIHJlZ2V4IGluIHZhbHVlLiAgSWYgdGhlIHJlZ2V4IGlzIHZhbGlkLCBjbGVhcnMgdGhlIFdpemFyZCdzIGVycm9yIG1lc3NhZ2UuICBJZiBpdCdzIG5vdCB2YWxpZCwKLSAgICogIHNldHMgdGhlIFdpemFyZCdzIGVycm9yIG1lc3NhZ2UgYWNjb3JkaW5nbHkuCi0gICAqCi0gICAqIEByZXR1cm4gV2hldGhlciB0aGUgcmVnZXggaXMgdmFsaWQuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVSZWdleCgpCi0gIHsKLQotICAgIGJvb2xlYW4gaXNWYWxpZDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBXZSB2YWxpZGF0ZSB0aGUgcmVnZXggYnkgY2hlY2tpbmcgd2hldGhlciB3ZSBnZXQgYSBQYXJzZUV4Y2VwdGlvbi4KLSAgICAgIC8vIEJ5IGRlZmF1bHQsIHdlIGFzc3VtZSB0aGF0IGl0J3MgdmFsaWQgdW5sZXNzIHdlIGRldGVybWluZSBvdGhlcndpc2UuCi0gICAgICBpc1ZhbGlkID0gdHJ1ZTsKLSAgICAgIGRpc3BsYXlSZWdleEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgIHZhbHVlLnNldFN0eWxlUmFuZ2UobnVsbCk7Ci0KLSAgICAgIFBhdHRlcm4uY29tcGlsZSh2YWx1ZS5nZXRUZXh0KCkpOwotICAgIH0KLSAgICBjYXRjaCAoUGF0dGVyblN5bnRheEV4Y2VwdGlvbiBwZSkKLSAgICB7Ci0gICAgICBpc1ZhbGlkID0gZmFsc2U7Ci0gICAgICBkaXNwbGF5UmVnZXhFcnJvck1lc3NhZ2UocGUuZ2V0TWVzc2FnZSgpKTsKLQotICAgICAgLy8gQW4gb2ZmLWJ5LW9uZSBidWcgaW4gdGhlIHhlcmNlcyByZWdleCBwYXJzZXIgd2lsbCBzb21ldGltZXMgcmV0dXJuIGEgbG9jYXRpb24gZm9yIHRoZSBwYXJzZUVycm9yIHRoYXQKLSAgICAgIC8vICBpcyBvZmYgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLiAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhlbiB3ZSB3YW50IHRvIGhpZ2hsaWdodCB0aGUgbGFzdCBjaGFyYWN0ZXIuCi0gICAgICBpZiAocGUuZ2V0SW5kZXgoKSA+PSB2YWx1ZS5nZXRUZXh0KCkubGVuZ3RoKCkpCi0gICAgICB7Ci0gICAgICAgIGN1cnJlbnRFcnJvci5zdGFydCA9IHZhbHVlLmdldFRleHQoKS5sZW5ndGgoKSAtIDE7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGN1cnJlbnRFcnJvci5zdGFydCA9IHBlLmdldEluZGV4KCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkZWJ1ZykKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYXJzZSBFcnJvciBsb2NhdGlvbjogIiArIHBlLmdldEluZGV4KCkpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImN1cnJlbnRFcnJvci5zdGFydDogIiArIGN1cnJlbnRFcnJvci5zdGFydCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLQotICAgICAgdmFsdWUuc2V0U3R5bGVSYW5nZShjdXJyZW50RXJyb3IpOwotCi0gICAgfQotCi0gICAgLy8gQW5vdGhlciBidWcgaW4gdGhlIHhlcmNlcyBwYXJzZXIgd2lsbCBzb21ldGltZXMgdGhyb3cgYSBSdW50aW1lRXhjZXB0aW9uIGluc3RlYWQgb2YgYSBQYXJzZUV4Y2VwdGlvbi4KLSAgICAvLyAgV2hlbiB3ZSBnZXQgYSBSdW50aW1lRXhjZXB0aW9uLCB3ZSBhcmVuJ3QgcHJvdmlkZWQgd2l0aCB0aGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3ZSBuZWVkIHRvIGhpZ2hsaWdodAotICAgIC8vICB0aGUgcGFyc2UgZXJyb3IuICBTbywgd2UgbWVyZWx5IHJlcG9ydCB0aGF0IHRoZXJlIGlzIGFuIGVycm9yLgotICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKQotICAgIHsKLSAgICAgIGRpc3BsYXlSZWdleEVycm9yTWVzc2FnZSgiIik7Ci0gICAgICB2YWx1ZS5zZXRTdHlsZVJhbmdlKG51bGwpOwotICAgICAgaXNWYWxpZCA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBzZXRQYWdlQ29tcGxldGUoaXNWYWxpZCk7ICAgIAotICAgIHJldHVybiBpc1ZhbGlkOwotICB9Ci0KLSAgCi0gIC8qKgotICAgKiBNYW5hZ2VzIHRoZSBkaXNwbGF5IG9mIGVycm9yIG1lc3NhZ2VzLgotICAgKiBTZXRzIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0eXBlIHRvIGVycm9yTWVzc2FnZS4gIElmIGVycm9yTWVzc2FnZSAhPSBudWxsLCB0aGVuIHdlIHNldCB0aGUgV2l6YXJkJ3MgZXJyb3IgbWVzc2FnZQotICAgKiB0byBlcnJvck1lc3NhZ2UuICBJZiBlcnJvck1lc3NhZ2UgPT0gbnVsbCwgdGhlbiB3ZSBjaGVjayB3aGV0aGVyIHdlIGhhdmUgYSBwZW5kaW5nIG1lc3NhZ2Ugb2YgYW5vdGhlciB0eXBlLgotICAgKiBJZiB3ZSBkbywgdGhlbiBpdCBpcyBkaXNwbGF5ZWQgYXMgdGhlIFdpemFyZCdzIGVycm9yIG1lc3NhZ2UuICBJZiB3ZSBkb24ndCwgdGhlbiB0aGUgV2l6YXJkJ3MgZXJyb3IgbWVzc2FnZSBmaWVsZAotICAgKiBpcyBjbGVhcmVkLgotICAgKgotICAgKiBAcGFyYW0gZXJyb3JNZXNzYWdlIFRoZSB0ZXh0IG9mIHRoZSBuZXcgZXJyb3IgbWVzc2FnZS4gIEEgdmFsdWUgb2YgbnVsbCBpbmRpY2F0ZXMgdGhhdCB0aGUgZXJyb3IgbWVzc2FnZSBzaG91bGQKLSAgICogIGJlIGNsZWFyZWQuCi0gICAqIEBwYXJhbSB0eXBlIFRoZSBlcnJvciB0eXBlLCBvbmUgb2YgUEFSU0UsIFRPS0VOLCBvciBTRUxFQ1RJT04uCi0gICAqLyAKLSAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yTWVzc2FnZSwgaW50IHR5cGUpCi0gIHsKLSAgICBTdHJpbmcgbWVzc2FnZVRvRGlzcGxheSA9IG51bGw7Ci0KLQotICAgIGN1cnJlbnRFcnJvck1lc3NhZ2VzW3R5cGVdID0gZXJyb3JNZXNzYWdlOwotCi0gICAgbWVzc2FnZVRvRGlzcGxheSA9IGVycm9yTWVzc2FnZTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0VSUk9SX01FU1NBR0VfVFlQRVM7IGkrKykKLSAgICB7Ci0gICAgICBpZiAobWVzc2FnZVRvRGlzcGxheSAhPSBudWxsKQotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIG1lc3NhZ2VUb0Rpc3BsYXkgPSBjdXJyZW50RXJyb3JNZXNzYWdlc1tpXTsKLSAgICB9Ci0KLSAgICBzZXRFcnJvck1lc3NhZ2UobWVzc2FnZVRvRGlzcGxheSk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBXaXphcmQncyBlcnJvciBtZXNzYWdlIHRvIG1lc3NhZ2UsIHByZWNlZGVkIGJ5IGEgc3RhbmRhcmQgcHJlZml4LgotICAgKgotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbmV3IGVycm9yIG1lc3NhZ2UgKG9yIG51bGwgdG8gY2xlYXIgaXQpLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlSZWdleEVycm9yTWVzc2FnZSAoU3RyaW5nIGVycm9yTWVzc2FnZSkKLSAgewotICAgIGlmIChlcnJvck1lc3NhZ2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBkaXNwbGF5RXJyb3JNZXNzYWdlKG51bGwsIFBBUlNFKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAJaWYgKGVycm9yTWVzc2FnZS50cmltKCkuZXF1YWxzKCIiKSkgLy8gd2hlbiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlIGF2YWlsYWJsZS4KLSAgICAJewotICAgICAgICBkaXNwbGF5RXJyb3JNZXNzYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9SRUdFWF9FUlJPUiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSU0UpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBkaXNwbGF5RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSwgUEFSU0UpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFVwZGF0ZXMgdGhlIHRva2VuIHN0YXR1cy4gIFNldHMgaXNWYWxpZFRva2VuIHRvIHN0YXR1cyAmJiB0aGUgc3RhdHVzIG9mIHRoZSBvdGhlciBlcnJvciB0eXBlLgotICAgKiBJZiBzdGF0dXMgaXMgdHJ1ZSwgd2UgY2xlYXIgdGhlIHdpemFyZCdzIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgdHlwZTsgaWYgaXQgaXMgZmFsc2UsIHdlIHNldCBpdCB0byBlcnJvck1lc3NhZ2UuCi0gICAqCi0gICAqIEBwYXJhbSBzdGF0dXMgVGhlIG5ldyBpc1ZhbGlkVG9rZW4gdmFsdWUuCi0gICAqIEBwYXJhbSBlcnJvck1lc3NhZ2UgVGhlIG5ldyBlcnJvciBtZXNzYWdlLgotICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgZXJyb3IgKGVpdGhlciBUT0tFTiBvciBTRUxFQ1RJT04pLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHNldFRva2VuU3RhdHVzIChib29sZWFuIHN0YXR1cywgU3RyaW5nIGVycm9yTWVzc2FnZSwgaW50IHR5cGUpCi0gIHsKLSAgICBib29sZWFuIG90aGVyVHlwZVN0YXR1cyA9ICAgICAodHlwZSA9PSBUT0tFTikgPyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RXJyb3JNZXNzYWdlc1tTRUxFQ1RJT05dID09IG51bGwgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFcnJvck1lc3NhZ2VzW1RPS0VOXSA9PSBudWxsOwotICAgIAotICAgIGlzVmFsaWRUb2tlbiA9IHN0YXR1cyAmJiBvdGhlclR5cGVTdGF0dXM7Ci0gICAgYWRkLnNldEVuYWJsZWQoaXNWYWxpZFRva2VuKTsKLQotICAgIGlmIChzdGF0dXMpCi0gICAgewotICAgICAgZGlzcGxheUVycm9yTWVzc2FnZShudWxsLCB0eXBlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAJaWYgKGVycm9yTWVzc2FnZSAhPSBudWxsICYmIGVycm9yTWVzc2FnZS50cmltKCkuZXF1YWxzKCIiKSkgLy8gd2hlbiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlIGF2YWlsYWJsZS4KLSAgICAJewotICAgICAgICBkaXNwbGF5RXJyb3JNZXNzYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9UT0tFTl9FUlJPUiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGRpc3BsYXlFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlLCB0eXBlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAKLSAgLyoqCi0gICAqIFVwZGF0ZXMgdGhlIHRva2VuIHN0YXR1cy4gIFNldHMgaXNWYWxpZFRva2VuIHRvIHN0YXR1cyAmJiB0aGUgc3RhdHVzIG9mIHRoZSBvdGhlciBlcnJvciB0eXBlLgotICAgKiBBbHNvIGNsZWFycyB0aGUgd2l6YXJkJ3MgZXJyb3IgbWVzc2FnZSBmb3IgdGhpcyB0eXBlLgotICAgKiBVc3VhbGx5IHVzZWQgdG8gc2V0IGlzVmFsaWRUb2tlbiB0byB0cnVlLgotICAgKgotICAgKiBAcGFyYW0gc3RhdHVzIFRoZSBuZXcgaXNWYWxpZFRva2VuIHZhbHVlLgotICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgZXJyb3IgKGVpdGhlciBUT0tFTiBvciBTRUxFQ1RJT04pLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHNldFRva2VuU3RhdHVzKGJvb2xlYW4gc3RhdHVzLCBpbnQgdHlwZSkKLSAgewotICAgIHNldFRva2VuU3RhdHVzKHN0YXR1cywgbnVsbCwgdHlwZSk7Ci0gIH0KLQotCi0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVuYWJsZWQgc3RhdHVzIG9mIHRoZSB0ZXh0IGZpZWxkcyBhbmQgbGFiZWxzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHF1YW50aWZpZXIuCi0gICAqIElmIHN0YXR1cyBpcyB0cnVlLCB0aGVuIGZpZWxkcyBhbmQgbGFiZWxzIGFzc29jaWF0ZWQgd2l0aCBvdGhlciBxdWFudGlmaWVycyBhcmUgZGlzYWJsZWQuCi0gICAqIEBwYXJhbSBxdWFudGlmaWVyIFRoZSBxdWFudGlmaWVyIHdob3NlIGVsZW1lbnRzJyBlbmFibGVkIHN0YXR1cyB3ZSB3aXNoIHRvIGNoYW5nZQotICAgKiAgIChhcyBlbnVtZXJhdGVkIGluIFJlZ2V4Tm9kZSkuCi0gICAqIEBwYXJhbSBzdGF0dXMgVGhlIG5ldyBzdGF0dXMgb2YgdGhlIGVsZW1lbnRzLiAgSWYgdHJ1ZSwgdGhlbiBhbGwgZWxlbWVudHMgYXNzb2NpYXRlZCB3aXRoIG90aGVyIGJ1dHRvbnMKLSAgICogICAgICAgICAgICAgICBhcmUgZGlzYWJsZWQuCi0gICAqLyAgICAKLSAgcHJpdmF0ZSB2b2lkIHNldEVuYWJsZWRTdGF0dXMoaW50IHF1YW50aWZpZXIsIGJvb2xlYW4gc3RhdHVzKQotICB7Ci0gICAgc3dpdGNoIChxdWFudGlmaWVyKQotICAgIHsKLSAgICAKLSAgICBjYXNlIFJlZ2V4Tm9kZS5SRVBFQVQ6Ci0gICAgICByZXBlYXRWYWx1ZS5zZXRFbmFibGVkKHN0YXR1cyk7Ci0gICAgICBpZiAoc3RhdHVzKQotICAgICAgewotICAgICAgICByYW5nZU1pblZhbHVlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICByYW5nZU1heFZhbHVlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICByYW5nZVRvTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUmVnZXhOb2RlLlJBTkdFOgotICAgICAgcmFuZ2VNaW5WYWx1ZS5zZXRFbmFibGVkKHN0YXR1cyk7Ci0gICAgICByYW5nZU1heFZhbHVlLnNldEVuYWJsZWQoc3RhdHVzKTsKLSAgICAgIHJhbmdlVG9MYWJlbC5zZXRFbmFibGVkKHN0YXR1cyk7Ci0gICAgICBpZiAoc3RhdHVzKQotICAgICAgewotICAgICAgICByZXBlYXRWYWx1ZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB0byBzZWUgaWYgdGhlcmUgaXMgYSBzZWxlY3Rpb24gaW4gdmFsdWUuICBJZiB0aGVyZSBpcyBub3QsIHdlIHNldCB0aGUgV2l6YXJkJ3MgZXJyb3IgbWVzc2FnZSBhY2NvcmRpbmdseS4KLSAgICogSWYgdGhlcmUgaXMsIHdlIHVwZGF0ZSB0aGUgY29udGVudHMgb2Ygbm9kZS4gIElmICJDdXJyZW50IFNlbGVjdGlvbiIgaXMgbm90IHRoZSBjdXJyZW50IHRva2VuLCB0aGVuCi0gICAqIHdlIGNsZWFyIHRoZSBTZWxlY3Rpb24gZXJyb3IgbWVzc2FnZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVDdXJyZW50U2VsZWN0aW9uU3RhdHVzKCkKLSAgewotICAgIGlmICh0ZXJtcy5nZXRTZWxlY3Rpb25JbmRleCgpID09IFJlZ2V4Tm9kZS5TRUxFQ1RJT04pCi0gICAgewotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IHZhbHVlLmdldFNlbGVjdGlvblRleHQoKTsKLSAgICAgIGlmIChzZWxlY3Rpb24uZXF1YWxzKCIiKSkKLSAgICAgIHsKLSAgICAgICAgc2V0VG9rZW5TdGF0dXMoZmFsc2UsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9TRUxFQ1RJT05fRVJST1IiKSwgU0VMRUNUSU9OKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc2V0VG9rZW5TdGF0dXModHJ1ZSwgU0VMRUNUSU9OKTsKLSAgICAgICAgbm9kZS5zZXRDb250ZW50cyhzZWxlY3Rpb24pOwotICAgICAgICBub2RlLnNldEhhc1BhcmVucyh0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNldFRva2VuU3RhdHVzKHRydWUsIFNFTEVDVElPTik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFVwZGF0ZXMgdGhlIGVuYWJsZWQgc3RhdHVzIG9mIHRoZSBhdXRvLWVzY2FwZSBjaGVja2JveC4gIElmIHN0YXR1cyBpcyB0cnVlLCB3ZSBlbmFibGUgdGhlIGNoZWNrYm94LCBhbmQKLSAgICogc2V0IGl0cyBzZWxlY3Rpb24gc3RhdHVzIGFuZCBub2RlJ3MgYXV0by1lc2NhcGUgc3RhdHVzIHRvIHRoZSB2YWx1ZSBvZiBhdXRvRXNjYXBlU3RhdHVzLiAgSWYgc3RhdHVzIGlzCi0gICAqIGZhbHNlLCB0aGVuIHdlIGRpc2FibGUgYW5kIGRlc2VsZWN0IHRoZSBjaGVja2JveCwgYW5kIHNldCBub2RlJ3Mgc3RhdHVzIHRvIGZhbHNlLgotICAgKgotICAgKiBAcGFyYW0gc3RhdHVzIFRoZSBuZXcgZW5hYmxlZCBzdGF0dXMuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc2V0RXNjYXBlQ2hlY2tib3hFbmFibGVkU3RhdHVzKGJvb2xlYW4gc3RhdHVzKQotICB7Ci0gICAgaWYgKHN0YXR1cykKLSAgICB7Ci0gICAgICBlc2NhcGVDaGVja2JveC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgZXNjYXBlQ2hlY2tib3guc2V0U2VsZWN0aW9uKGF1dG9Fc2NhcGVTdGF0dXMpOwotICAgICAgbm9kZS5zZXRBdXRvRXNjYXBlU3RhdHVzKGF1dG9Fc2NhcGVTdGF0dXMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZXNjYXBlQ2hlY2tib3guc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICBlc2NhcGVDaGVja2JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgbm9kZS5zZXRBdXRvRXNjYXBlU3RhdHVzKGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJlZ2V4IGZsYWdzLgotICAgKi8KLSAgU3RyaW5nIGdldEZsYWdzKCkKLSAgewotICAgIHJldHVybiByZWdleEZsYWdzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgWFNEUGF0dGVybiBtb2RlbC4KLSAgICovCi0gIFhTRFBhdHRlcm5GYWNldCBnZXRQYXR0ZXJuKCkKLSAgewotICAgIHJldHVybiBwYXR0ZXJuOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyBhIHN0cmluZyBjb25zaXN0aW5nIG9mIHRoZSB2YWx1ZXMgb2YgbWluLCBtYXgsIGFuZCByZXBlYXQgc3RvcmVkIGluIG5vZGUuCi0gICAqIFVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5LgotICAgKi8gIAotICBwcml2YXRlIFN0cmluZyBnZXRBbGxGaWVsZFZhbHVlcygpCi0gIHsKLSAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsKLSAgICAgIHJlc3VsdCArPSAiTWluOiAiICsgbm9kZS5nZXRNaW4oKSArICJcbiI7Ci0gICAgICByZXN1bHQgKz0gIk1heDogIiArIG5vZGUuZ2V0TWF4KCkgKyAiXG4iOwotICAgICAgcmVzdWx0ICs9ICJSZXBlYXQ6ICIgKyBub2RlLmdldFJlcGVhdCgpICsgIlxuIjsKLSAgICAgIHJlc3VsdCArPSAiXG4iOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLQotICAvKiBMaXN0ZW5lciBmb3IgdGhlIGFkZCBidXR0b24uICovCi0gIGNsYXNzIEJ1dHRvblNlbGVjdExpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICB9Ci0KLSAgICAvLyBQcmVjb25kaXRpb246IGlzVmFsaWRUb2tlbiA9PSB0cnVlICAKLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIGlmICghaXNWYWxpZFRva2VuKSAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCi0gICAgICB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLy8gV2hldGhlciB0aGVyZSBpcyBhbnl0aGluZyBzZWxlY3RlZCBpbiB2YWx1ZS4KLSAgICAgIGJvb2xlYW4gaXNBY3RpdmVTZWxlY3Rpb24gPSB2YWx1ZS5nZXRTZWxlY3Rpb25Db3VudCgpICE9IDA7Ci0gICAgICAKLSAgICAgIHZhbHVlLmluc2VydChub2RlLnRvU3RyaW5nKCkpOwotCi0gICAgICBpZiAodGVybXMuZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSBSZWdleE5vZGUuU0VMRUNUSU9OKQotICAgICAgewotICAgICAgICB1cGRhdGVDdXJyZW50U2VsZWN0aW9uU3RhdHVzKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIG5vdGhpbmcgaXMgc2VsZWN0ZWQsIHRoZW4gd2UgbmVlZCB0byBhZHZhbmNlIHRoZSBjYXJldCBsb2NhdGlvbi4KLSAgICAgIGlmICghaXNBY3RpdmVTZWxlY3Rpb24pCi0gICAgICB7Ci0gICAgICAgIHZhbHVlLnNldENhcmV0T2Zmc2V0KHZhbHVlLmdldENhcmV0T2Zmc2V0KCkgKyBub2RlLnRvU3RyaW5nKCkubGVuZ3RoKCkpOwotICAgICAgfQotCi0gICAgICB2YWx1ZS5zZXRGb2N1cygpOwotCi0gICAgfQotCi0gIH0KLSAKLQotICAvKiBMaXN0ZW5lciBmb3IgdGhlIHRlcm1zIGNvbWJvIGJveC4gKi8KLSAgY2xhc3MgQ29tYm9MaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKQotICAgIHsKLSAgICAgIAotICAgICAgdXBkYXRlQ3VycmVudFNlbGVjdGlvblN0YXR1cygpOwotCi0gICAgICAvLyBJZiB0aGUgdXNlciBoYXMgdHlwZWQgaW4gYSB0b2tlbgotICAgICAgaWYgKHRlcm1zLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIHNldEVzY2FwZUNoZWNrYm94RW5hYmxlZFN0YXR1cyh0cnVlKTsKLSAgICAgICAgbm9kZS5zZXRDb250ZW50cyh0ZXJtcy5nZXRUZXh0KCkpOwotICAgICAgICBub2RlLnNldEhhc1BhcmVucyh0cnVlKTsKLSAgICAgICAgCi0KLSAgICAgICAgaWYgKGRlYnVnKQotICAgICAgICB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRlcm1zLmdldFRleHQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgICAgZWxzZSBpZiAodGVybXMuZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSBSZWdleE5vZGUuU0VMRUNUSU9OKQotICAgICAgewotICAgICAgICBzZXRFc2NhcGVDaGVja2JveEVuYWJsZWRTdGF0dXMoZmFsc2UpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBub2RlLnNldENvbnRlbnRzKFJlZ2V4Tm9kZS5nZXRSZWdleFRlcm1WYWx1ZSh0ZXJtcy5nZXRTZWxlY3Rpb25JbmRleCgpKSk7Ci0gICAgICAgIG5vZGUuc2V0SGFzUGFyZW5zKGZhbHNlKTsKLSAgICAgICAgc2V0RXNjYXBlQ2hlY2tib3hFbmFibGVkU3RhdHVzKGZhbHNlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qIExpc3RlbmVyIGZvciBlbmFibGluZy9kaXNhYmxpbmcgY2FyZXRMYWJlbC4gKi8KLSAgY2xhc3MgVGV4dEZvY3VzTGlzdGVuZXIgaW1wbGVtZW50cyBGb2N1c0xpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpCi0gICAgewotICAgICAgc2V0U2hvd0NhcmV0TGFiZWwoZmFsc2UpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKQotICAgIHsKLSAgICAgIHNldFNob3dDYXJldExhYmVsKHRydWUpOwotICAgIH0KLSAgfQotCi0KLQotICAvKiBMaXN0ZW5lciBmb3IgdGhlIHRleHQgZmllbGRzLiAqLwotICBjbGFzcyBUZXh0TGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGUpCi0gICAgewotCi0gICAgICBpZiAoZGVidWcpCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW5zaWRlIFRleHRMaXN0ZW5lciBoYW5kbGVyIik7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGdldEFsbEZpZWxkVmFsdWVzKCkpOwotICAgICAgfQotCi0KLSAgICAgIGlmICggKGUud2lkZ2V0ID09IHZhbHVlKSAmJiAoZS50eXBlID09IFNXVC5Nb2RpZnkpICkKLSAgICAgIHsKLSAgICAgICAgcGF0dGVybi5zZXRMZXhpY2FsVmFsdWUodmFsdWUuZ2V0VGV4dCgpKTsKLSAgICAgICAgdmFsaWRhdGVSZWdleCgpOwotICAgICAgfQotCi0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSB2YWx1ZSAmJiBlLnR5cGUgPT0gU1dULlNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgaWYgKHRlcm1zLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gUmVnZXhOb2RlLlNFTEVDVElPTikKLSAgICAgICAgewotICAgICAgICAgIHVwZGF0ZUN1cnJlbnRTZWxlY3Rpb25TdGF0dXMoKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSByYW5nZU1pblZhbHVlKQotICAgICAgewotICAgICAgICBib29sZWFuIGlzVmFsaWQgPSBub2RlLnNldE1pbihyYW5nZU1pblZhbHVlLmdldFRleHQoKSk7Ci0KLSAgICAgICAgaWYgKGlzVmFsaWQpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRUb2tlblN0YXR1cyh0cnVlLCBudWxsLCBUT0tFTik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgc2V0VG9rZW5TdGF0dXMoZmFsc2UsICBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfTUlOX0VSUk9SX1NVRkZJWCIpLCBUT0tFTik7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gcmFuZ2VNYXhWYWx1ZSkKLSAgICAgIHsKLSAgICAgICAgYm9vbGVhbiBpc1ZhbGlkID0gbm9kZS5zZXRNYXgocmFuZ2VNYXhWYWx1ZS5nZXRUZXh0KCkpOwotCi0gICAgICAgIGlmIChub2RlLmdldE1pbigpID09IFJlZ2V4Tm9kZS5FTVBUWSkKLSAgICAgICAgewotICAgICAgICAgIHNldFRva2VuU3RhdHVzKGZhbHNlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX01JU1NJTkdfTUlOX0VSUk9SX1NVRkZJWCIpLCBUT0tFTik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaXNWYWxpZCkKLSAgICAgICAgewotICAgICAgICAgIHNldFRva2VuU3RhdHVzKHRydWUsIG51bGwsIFRPS0VOKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRUb2tlblN0YXR1cyhmYWxzZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9JTlZBTElEX01BWF9FUlJPUl9TVUZGSVgiKSwgVE9LRU4pOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgIC8vIChlLndpZGdldCA9PSByZXBlYXRWYWx1ZSkKLSAgICAgIHsKLSAgICAgICAgYm9vbGVhbiBpc1ZhbGlkID0gbm9kZS5zZXRSZXBlYXQocmVwZWF0VmFsdWUuZ2V0VGV4dCgpKTsKLSAgICAgICAgaWYgKGlzVmFsaWQpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRUb2tlblN0YXR1cyh0cnVlLCBudWxsLCBUT0tFTik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgc2V0VG9rZW5TdGF0dXMoZmFsc2UsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9SRVBFQVRfRVJST1JfU1VGRklYIiksIFRPS0VOKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIExpc3RlbmVyIGZvciB0aGUgYXV0by1lc2NhcGUgY2hlY2tib3guICovCi0gIGNsYXNzIENoZWNrYm94TGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgYm9vbGVhbiBuZXdTdGF0dXMgPSAhYXV0b0VzY2FwZVN0YXR1czsKLSAgICAgIG5vZGUuc2V0QXV0b0VzY2FwZVN0YXR1cyhuZXdTdGF0dXMpOwotICAgICAgYXV0b0VzY2FwZVN0YXR1cyA9IG5ld1N0YXR1czsKLSAgICAgIAotICAgICAgaWYgKGRlYnVnKQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkF1dG9Fc2NhcGUgU3RhdHVzOiAiICsgbm9kZS5nZXRBdXRvRXNjYXBlU3RhdHVzKCkpOyAgLy8kTk9OLU5MUy0xJCAKLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0KLSAgLyogTGlzdGVuZXIgZm9yIHRoZSByYWRpbyBidXR0b25zLiAqLwotICBjbGFzcyBSYWRpb1NlbGVjdExpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIGlmIChkZWJ1ZykKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGdldEFsbEZpZWxkVmFsdWVzKCkpOwotICAgICAgfQotCi0KLSAgICAgIGludCBjdXJyZW50UXVhbnRpZmllciA9IGdldFF1YW50aWZpZXIoZSk7Ci0KLSAgICAgIG5vZGUuc2V0UXVhbnRpZmllcihjdXJyZW50UXVhbnRpZmllcik7Ci0KLSAgICAgIHN3aXRjaCAoY3VycmVudFF1YW50aWZpZXIpCi0gICAgICB7Ci0gICAgICBjYXNlIFJlZ2V4Tm9kZS5TSU5HTEU6ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBjYXNlIFJlZ2V4Tm9kZS5TVEFSOgotICAgICAgY2FzZSBSZWdleE5vZGUuUExVUzoKLSAgICAgIGNhc2UgUmVnZXhOb2RlLk9QVElPTkFMOgotICAgICAgICBzZXRFbmFibGVkU3RhdHVzKFJlZ2V4Tm9kZS5SRVBFQVQsIGZhbHNlKTsKLSAgICAgICAgc2V0RW5hYmxlZFN0YXR1cyhSZWdleE5vZGUuUkFOR0UsIGZhbHNlKTsKLSAgICAgICAgc2V0VG9rZW5TdGF0dXModHJ1ZSwgVE9LRU4pOwotICAgICAgICBicmVhazsgCi0KLSAgICAgIGNhc2UgUmVnZXhOb2RlLlJFUEVBVDoKLSAgICAgICAgc2V0RW5hYmxlZFN0YXR1cyhSZWdleE5vZGUuUkVQRUFULCB0cnVlKTsKLSAgICAgICAgc2V0VG9rZW5TdGF0dXMobm9kZS5oYXNWYWxpZFJlcGVhdCgpLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfUkVQRUFUX0VSUk9SX1NVRkZJWCIpLCBUT0tFTik7Ci0gICAgICAgIHJlcGVhdFZhbHVlLnNldEZvY3VzKCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFJlZ2V4Tm9kZS5SQU5HRToKLSAgICAgICAgc2V0RW5hYmxlZFN0YXR1cyhSZWdleE5vZGUuUkFOR0UsIHRydWUpOwotICAgICAgICBTdHJpbmcgZXJyb3IgPSAobm9kZS5oYXNWYWxpZE1pbigpKSA/IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfSU5WQUxJRF9NQVhfRVJST1JfU1VGRklYIikgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX0lOVkFMSURfTUlOX0VSUk9SX1NVRkZJWCIpOwotCi0gICAgICAgIHNldFRva2VuU3RhdHVzKCBub2RlLmhhc1ZhbGlkTWluKCkgJiYgbm9kZS5oYXNWYWxpZE1heCgpLCBlcnJvciwgVE9LRU4pOwotICAgICAgICByYW5nZU1pblZhbHVlLnNldEZvY3VzKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFF1YW50aWZpZXIoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0KLSAgICAgIGlmIChlLndpZGdldCA9PSBzaW5nbGVSYWRpbykKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFJlZ2V4Tm9kZS5TSU5HTEU7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHN0YXJSYWRpbykKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFJlZ2V4Tm9kZS5TVEFSOwotICAgICAgfQotICAgICAgCi0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSBwbHVzUmFkaW8pCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBSZWdleE5vZGUuUExVUzsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gb3B0aW9uYWxSYWRpbykKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFJlZ2V4Tm9kZS5PUFRJT05BTDsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gcmVwZWF0UmFkaW8pCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBSZWdleE5vZGUuUkVQRUFUOwotICAgICAgfQotICAgICAgCi0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSByYW5nZVJhZGlvKQotICAgICAgewotICAgICAgICByZXR1cm4gUmVnZXhOb2RlLlJBTkdFOwotICAgICAgfQotICAgICAgCi0gICAgICBlbHNlIC8vIGNhbid0IGdldCBoZXJlCi0gICAgICB7IAotICAgICAgICByZXR1cm4gUmVnZXhOb2RlLkVNUFRZOwotICAgICAgfQotICAgIH0gCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIHZhbHVlLmdldFRleHQoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9SZWdleE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvUmVnZXhOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YmJlYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9SZWdleE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLQotCi1jbGFzcyBSZWdleE5vZGUKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgY29udGVudHM7Ci0gIHByaXZhdGUgaW50IG1pbjsKLSAgcHJpdmF0ZSBpbnQgbWF4OwotICBwcml2YXRlIGludCByZXBlYXQ7Ci0gIHByaXZhdGUgaW50IHF1YW50aWZpZXI7Ci0gIHByaXZhdGUgYm9vbGVhbiBoYXNQYXJlbnM7Ci0gIHByaXZhdGUgYm9vbGVhbiBhdXRvRXNjYXBlU3RhdHVzOwotCi0gIAotICAvKiBRdWFudGlmaWVycy4gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lOR0xFID0gMDsgICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVIgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTFVTID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OQUwgPSAzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBFQVQgPSA0OyAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkFOR0UgPSA1OwotCi0gIC8qIFJlZ2V4IHF1YW50aWZpZXJzLiAgRmlyc3QgY29sdW1uIGlzIHRoZSBvbi1zY3JlZW4gdGV4dHVhbCByZXByZXNlbnRhdGlvbiwgc2Vjb25kIGNvbHVtbiBpcyB0aGUgCi0gICBvbi1zY3JlZW4gcmVnZXggcmVwcmVzZW50YXRpb24uICBUaGUgdHdvIGFyZSBjb25jYXRlbmF0ZWQgdG9nZXRoZXIgdG8gZm9ybSB0aGUgb24tc2NyZWVuCi0gICByZXByZXNlbnRhdGlvbi4KLSAgIEluZGV4aW5nIG9mIHRoaXMgYXJyYXkgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSB2YWx1ZXMgb2YgdGhlIHF1YW50aWZpZXIgY29uc3RhbnRzIGFib3ZlLgotICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXVtdIHJlZ2V4UXVhbnRpZmllcnMgPQotICB7IAotICAgIHsgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9RVUFOVElGSUVSX1NJTkdMRSIpLCAgICIiICB9LAotICAgIHsgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9RVUFOVElGSUVSX1NUQVIiKSwgICAgICIqIiB9LAotICAgIHsgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9RVUFOVElGSUVSX1BMVVMiKSwgICAgICIrIiB9LAotICAgIHsgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9RVUFOVElGSUVSX09QVElPTkFMIiksICI/IiB9LAotICAgIHsgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9RVUFOVElGSUVSX1JFUEVBVCIpLCAgICIiICB9LAotICAgIHsgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9RVUFOVElGSUVSX1JBTkdFIiksICAgICIiICB9LAotICB9OwotCi0KLSAgLyogUmVnZXggdG9rZW5zLiAgRmlyc3QgY29sdW1uIGlzIHRoZSBvbi1zY3JlZW4gcmVwcmVzZW50YXRpb24sIHNlY29uZCBjb2x1bW4gaXMgdGhlIHJlZ2V4IHJlcHJlc2VudGF0aW9uLiAKLSAgICAgTW9yZSB0b2tlbnMgY2FuIGJlIGFkZGVkLCBidXQgaXQgaXMgYXNzdW1lZCB0aGF0ICJDdXJyZW50IFNlbGVjdGlvbiIgaXMgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuCi0gICAgIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCB0aGVuIHRoZSB2YWx1ZSBvZiB0aGUgU0VMRUNUSU9OIGNvbnN0YW50IGJlbG93IHdpbGwgbmVlZCB0byBiZSBjaGFuZ2VkIAotICAgICBhY2NvcmRpbmdseS4KLSAgICAgQWxzbyBub3RlIHRoYXQgYmVjYXVzZSB0aGVzZSBhcmUgamF2YSBTdHJpbmdzLCBiYWNrc2xhc2hlcyBtdXN0IGJlIGVzY2FwZWQgKHRoaXMgaXMgb25seSByZWxldmFudCB0byB0aGUKLSAgICAgc2Vjb25kIGNvbHVtbiBvZiB0aGUgYXJyYXkpLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW11bXSByZWdleFRlcm1zID0KLSAgeyAKLSAgICB7IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfVEVSTV9BTllfQ0hBUiIpLCAgICIuIiAgICAgfSwKLSAgICB7IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfVEVSTV9BTFBIQU5VTUVSSUNfQ0hBUiIpLCAgICJcXHciICAgICB9LAotICAgIHsgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9URVJNX1dISVRFU1BBQ0UiKSwgIlxccyIgICB9LAotICAgIHsgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9URVJNX0RJR0lUIiksICAgICAgIlxcZCIgICB9LAotICAgIHsgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9URVJNX1VQUEVSIiksICAgICAgIltBLVpdIiB9LAotICAgIHsgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9URVJNX0xPV0VSIiksICAgICAgIlthLXpdIiB9LAotICAgIHsgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9URVJNX1NFTEVDVElPTiIpLCAgIiIgICAgICB9LAotICB9OwotCi0gIC8qIFRva2VuIGVudW1lcmF0ZWQgY29uc3RhbnRzLiAqLwotCi0gIC8vIFNFTEVDVElPTiBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIGluZGV4IGluIHJlZ2V4VGVybXMgb2YgIkN1cnJlbnQgU2VsZWN0aW9uIi4gIFRoaXMgaXMgYXNzdW1lZCB0byBiZQotICAvLyAgdGhlIGxhc3QgZWxlbWVudC4KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUSU9OID0gcmVnZXhUZXJtcy5sZW5ndGggLSAxOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVNUFRZID0gLTE7Ci0KLSAgLyogCi0gIFRoZSBtZXRhY2hhcmFjdGVycyByZWNvZ25pemVkIGJ5IFhNTCBTY2hlbWEuCi0gIE5vdGUgdGhhdCB0aGUgZG91YmxlIGJhY2tzbGFzaCAoIlxcIikgYWN0dWFsbHkgcmVwcmVzZW50cyBhbiBlc2NhcGVkIHNpbmdsZSBiYWNrc2xhc2ggY2hhcmFjdGVyICgiXCIpLgotICAqLyAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1ldGFjaGFyYWN0ZXJzID0gIi5cXD8qK3t9KClbXSI7Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWdleFRlcm1UZXh0KGludCBpKQotICB7Ci0gICAgaWYgKGkgPT0gU0VMRUNUSU9OKQotICAgIHsKLSAgICAgIHJldHVybiByZWdleFRlcm1zW2ldWzBdOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIHJlZ2V4VGVybXNbaV1bMF0gKyAiICggIiArIHJlZ2V4VGVybXNbaV1bMV0gKyAiICkiOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlZ2V4VGVybVZhbHVlKGludCBpKQotICB7Ci0gICAgaWYgKGkgPT0gU0VMRUNUSU9OKSAvLyBzaG91bGRuJ3QgaGFwcGVuCi0gICAgewotICAgICAgcmV0dXJuICIiOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIHJlZ2V4VGVybXNbaV1bMV07Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TnVtUmVnZXhUZXJtcygpCi0gIHsKLSAgICByZXR1cm4gcmVnZXhUZXJtcy5sZW5ndGg7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRRdWFudGlmaWVyVGV4dChpbnQgaSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSByZWdleFF1YW50aWZpZXJzW2ldWzBdOwotICAgIAotICAgIGlmICghcmVnZXhRdWFudGlmaWVyc1tpXVsxXS5lcXVhbHMoIiIpKQotICAgIHsKLSAgICAgIHJlc3VsdCArPSAiICggIjsKLSAgICAgIHJlc3VsdCArPSByZWdleFF1YW50aWZpZXJzW2ldWzFdOwotICAgICAgcmVzdWx0ICs9ICIgKSI7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBSZWdleE5vZGUoKQotICB7Ci0gICAgdGhpcy5jb250ZW50cyA9ICIiOwotICAgIHRoaXMucXVhbnRpZmllciA9IFNJTkdMRTsKLSAgICB0aGlzLm1pbiA9IEVNUFRZOwotICAgIHRoaXMubWF4ID0gRU1QVFk7Ci0gICAgdGhpcy5yZXBlYXQgPSBFTVBUWTsKLSAgICB0aGlzLmhhc1BhcmVucyA9IGZhbHNlOwotCi0gIH0KLQotICAKLSAgcHVibGljIFN0cmluZyBnZXRDb250ZW50cygpCi0gIHsKLSAgICByZXR1cm4gY29udGVudHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENvbnRlbnRzKFN0cmluZyBjb250ZW50cykKLSAgewotICAgIHRoaXMuY29udGVudHMgPSBjb250ZW50czsKLSAgfQotCi0KLSAgcHVibGljIGludCBnZXRRdWFudGlmaWVyKCkKLSAgewotICAgIHJldHVybiBxdWFudGlmaWVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UXVhbnRpZmllcihpbnQgcXVhbnRpZmllcikKLSAgewotICAgIHRoaXMucXVhbnRpZmllciA9IHF1YW50aWZpZXI7Ci0gIH0KLQotCi0gIHB1YmxpYyBpbnQgZ2V0TWluKCkKLSAgewotICAgIHJldHVybiBtaW47Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNaW4oaW50IG1pbikKLSAgewotICAgIHRoaXMubWluID0gbWluOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhpcy5taW4gdG8gdGhlIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgbWluIGlmZiBtaW4gaXMgYSB2YWxpZCB2YWx1ZSAoaS5lLiBncmVhdGVyIHRoYW4gMCkuCi0gICAqIFNldHMgdGhpcy5taW4gdG8gRU1QVFkgaWYgaXQgaXMgbm90LgotICAgKgotICAgKiBAcGFyYW0gbWluIFRoZSBuZXcgbWluIHZhbHVlCi0gICAqIEByZXR1cm5zIFdoZXRoZXIgbWluIHdhcyBhIHZhbGlkIHZhbHVlCi0gICAqLyAgCi0gIHB1YmxpYyBib29sZWFuIHNldE1pbihTdHJpbmcgbWluKQotICB7Ci0gICAgdGhpcy5taW4gPSBjb252ZXJ0VG9JbnQobWluKTsKLQotICAgIC8vIG1pbiA+IG1heCBpcyBhbiBpbnZhbGlkIGNhc2UsIHVubGVzcyBtYXggaXMgRU1QVFkgKHNpbmNlIEVNUFRZID09IC0xKS4KLSAgICBpZiAoICh0aGlzLm1heCAhPSBFTVBUWSkgJiYgKHRoaXMubWluID4gdGhpcy5tYXgpICkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiAodGhpcy5taW4gPj0gMCk7Ci0gIH0KLQotICAKLSAgcHVibGljIGludCBnZXRNYXgoKQotICB7Ci0gICAgcmV0dXJuIG1heDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TWF4KGludCBtYXgpCi0gIHsKLSAgICB0aGlzLm1heCA9IG1heDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoaXMubWF4IHRvIHRoZSBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIG1heCBpZmYgbWF4IGlzIGEgdmFsaWQgdmFsdWUgKGkuZS4gZ3JlYXRlciB0aGFuIDApLgotICAgKiBTZXRzIHRoaXMubWF4IHRvIEVNUFRZIGlmIGl0IGlzIG5vdC4KLSAgICoKLSAgICogQHBhcmFtIG1heCBUaGUgbmV3IG1heCB2YWx1ZQotICAgKiBAcmV0dXJucyBXaGV0aGVyIG1heCB3YXMgYSB2YWxpZCB2YWx1ZSwgb3IgKHdoZXRoZXIgbWF4ID09IHRoZSBlbXB0eSBzdHJpbmcgJiYgbWluIGhhcyBhIHZhbGlkIHZhbHVlKQotICAgKi8gCi0gIHB1YmxpYyBib29sZWFuIHNldE1heChTdHJpbmcgbWF4KQotICB7Ci0gICAgdGhpcy5tYXggPSBjb252ZXJ0VG9JbnQobWF4KTsKLQotICAgIC8vIFRoZSBlbXB0eSBzdHJpbmcgaXMgYSB2YWxpZCBtYXggdmFsdWUgaWZmIG1pbiBoYXMgYSB2YWxpZCB2YWx1ZS4KLSAgICAvLyBUaGlzIGlzIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHtuLH0gbWVhbnMgImF0IGxlYXN0IG4gdGltZXMiIGluIHJlZ2V4IHBhcmxhbmNlLgotICAgIGlmIChtYXguZXF1YWxzKCIiKSAmJiB0aGlzLm1pbiAhPSBFTVBUWSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgZWxzZSBpZiAodGhpcy5tYXggPCB0aGlzLm1pbikKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gKHRoaXMubWF4ID49IDApOwotICAgIH0KLSAgfQotCi0KLSAKLSAgcHVibGljIGludCBnZXRSZXBlYXQoKQotICB7Ci0gICAgcmV0dXJuIHJlcGVhdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFJlcGVhdChpbnQgcmVwZWF0KQotICB7Ci0gICAgdGhpcy5yZXBlYXQgPSByZXBlYXQ7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGlzLnJlcGVhdCB0byB0aGUgaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiByZXBlYXQgaWZmIHJlcGVhdCBpcyBhIHZhbGlkIHZhbHVlIChpLmUuIGdyZWF0ZXIgdGhhbiAwKS4KLSAgICogU2V0cyB0aGlzLnJlcGVhdCB0byBFTVBUWSBpZiBpdCBpcyBub3QuCi0gICAqCi0gICAqIEBwYXJhbSByZXBlYXQgVGhlIG5ldyByZXBlYXQgdmFsdWUKLSAgICogQHJldHVybnMgV2hldGhlciByZXBlYXQgd2FzIGEgdmFsaWQgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNldFJlcGVhdChTdHJpbmcgcmVwZWF0KQotICB7Ci0gICAgdGhpcy5yZXBlYXQgPSBjb252ZXJ0VG9JbnQocmVwZWF0KTsKLSAgICByZXR1cm4gKHRoaXMucmVwZWF0ID49IDApOwotICB9Ci0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHMuICBJZiBzIGlzIGxlc3MgdGhhbiB6ZXJvLCBvciBpZiBzIGlzIG5vdCBhbiBpbnQKLSAgICogKGkuZS4gaWYgSW50ZWdlci5wYXJzZUludCB3b3VsZCB0aHJvdyBhIE51bWJlckZvcm1hdEV4Y2VwdGlvbiksIHRoZW4gcmV0dXJucyBFTVBUWS4KLSAgICoKLSAgICogQHBhcmFtIHMgVGhlIFN0cmluZyB0byBjb252ZXJ0LgotICAgKiBAcmV0dXJucyBUaGUgaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBzLgotICAgKi8KLSAgcHJpdmF0ZSBpbnQgY29udmVydFRvSW50KFN0cmluZyBzKQotICB7Ci0gICAgaW50IHJlc3VsdDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBJbnRlZ2VyLnBhcnNlSW50KHMpOwotICAgICAgaWYgKHJlc3VsdCA8IDApCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEVNUFRZOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gRU1QVFk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIGJvb2xlYW4gZ2V0SGFzUGFyZW5zKCkKLSAgewotICAgIHJldHVybiBoYXNQYXJlbnM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRIYXNQYXJlbnMoYm9vbGVhbiBzdGF0dXMpCi0gIHsKLSAgICB0aGlzLmhhc1BhcmVucyA9IHN0YXR1czsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldEF1dG9Fc2NhcGVTdGF0dXMoKQotICB7Ci0gICAgcmV0dXJuIGF1dG9Fc2NhcGVTdGF0dXM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBdXRvRXNjYXBlU3RhdHVzKGJvb2xlYW4gc3RhdHVzKQotICB7Ci0gICAgdGhpcy5hdXRvRXNjYXBlU3RhdHVzID0gc3RhdHVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gZXNjYXBlZCB2ZXJzaW9uIG9mIHMuICBJbiBvdGhlciB3b3JkcywgZWFjaCBvY2N1cnJlbmNlIG9mIGEgbWV0YWNoYXJhY3RlciAoIC5cPyore30oKVtdICkKLSAgICogaXMgcmVwbGFjZWQgYnkgdGhhdCBjaGFyYWN0ZXIgcHJlY2VkZWQgYnkgYSBiYWNrc2xhc2guCi0gICAqCi0gICAqIEBwYXJhbSBzIFRoZSBTdHJpbmcgdG8gZXNjYXBlLgotICAgKiBAcmV0dXJucyBBbiBlc2NhcGVkIHZlcnNpb24gb2Ygcy4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGFkZEVzY2FwZUNoYXJhY3RlcnMoU3RyaW5nIHMpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBjaGFyIGN1cnJlbnRDaGFyID0gcy5jaGFyQXQoaSk7Ci0KLSAgICAgIGlmIChpc01ldGFjaGFyKGN1cnJlbnRDaGFyKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiXFwiKTsgLy8gTm90ZSB0aGF0IHRoaXMgaXMgYW4gZXNjYXBlZCBiYWNrc2xhc2gsIG5vdCBhIGRvdWJsZSBiYWNrc2xhc2guCi0gICAgICB9Ci0gICAgICByZXN1bHQuYXBwZW5kKGN1cnJlbnRDaGFyKTsKLQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3Mgd2hldGhlciBjIGlzIGEgbWV0YWNoYXJhY3RlciBhcyBkZWZpbmVkIGluIHRoZSBzdGF0aWMgdmFyaWFibGUgbWV0YWNoYXJhY3RlcnMuCi0gICAqCi0gICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAqIEByZXR1cm5zIFdoZXRoZXIgYyBpcyBhIG1ldGFjaGFyYWN0ZXIuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNNZXRhY2hhcihjaGFyIGMpCi0gIHsKLSAgICByZXR1cm4gbWV0YWNoYXJhY3RlcnMuaW5kZXhPZihjKSAhPSAtMTsKLSAgfQotICAKLQotICBwdWJsaWMgYm9vbGVhbiBoYXNWYWxpZE1pbigpCi0gIHsKLSAgICByZXR1cm4gKG1pbiAhPSBFTVBUWSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBoYXNWYWxpZE1heCgpCi0gIHsKLSAgICByZXR1cm4obWF4ICE9IEVNUFRZKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGhhc1ZhbGlkUmVwZWF0KCkKLSAgewotICAgIHJldHVybihyZXBlYXQgIT0gRU1QVFkpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gIiI7Ci0gICAgCi0gICAgaWYgKGhhc1BhcmVucykKLSAgICB7Ci0gICAgICByZXN1bHQgKz0gIigiOwotICAgIH0KLSAgICAKLSAgICBpZiAoYXV0b0VzY2FwZVN0YXR1cykKLSAgICB7Ci0gICAgICAgcmVzdWx0ICs9IGFkZEVzY2FwZUNoYXJhY3RlcnMoY29udGVudHMpOwotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAgIHJlc3VsdCArPSBjb250ZW50czsKLSAgICB9Ci0KLQotICAgIGlmIChoYXNQYXJlbnMpCi0gICAgewotICAgICAgcmVzdWx0ICs9ICIpIjsKLSAgICB9Ci0gICAgCi0gICAgc3dpdGNoIChxdWFudGlmaWVyKQotICAgIHsKLSAgICAgIGNhc2UgU1RBUjoKLSAgICAgICAgcmVzdWx0ICs9ICIqIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICAgIGNhc2UgUExVUzoKLSAgICAgICAgcmVzdWx0ICs9ICIrIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICAgIGNhc2UgT1BUSU9OQUw6Ci0gICAgICAgIHJlc3VsdCArPSAiPyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgCi0gICAgICBjYXNlIFJFUEVBVDoKLSAgICAgICAgcmVzdWx0ICs9ICJ7IiArIHJlcGVhdCArICJ9IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICAgIGNhc2UgUkFOR0U6Ci0gICAgICAgIHJlc3VsdCArPSAieyIgKyBtaW4gKyAiLCI7Ci0gICAgICAgIGlmIChtYXggPT0gRU1QVFkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgKz0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ICs9IG1heDsKLSAgICAgICAgfSAgICAgICAKLSAgICAgICAgcmVzdWx0ICs9ICJ9IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICAgIC8vIFNJTkdMRSBpcyBhIGZhbGwgdGhyb3VnaCAgICAgICAgICAgCi0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9SZWdleFRlc3RpbmdQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4VGVzdGluZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg4YzZlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4VGVzdGluZ1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vLyBCYXNlZCBvbiB2ZXJzaW9uIDEuNiBvZiBvcmlnaW5hbCB4c2RlZGl0b3IKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuVGV4dFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlZpZXdVdGlsaXR5OwotCi0KLXB1YmxpYyBjbGFzcyBSZWdleFRlc3RpbmdQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZQotewotICAvKiBWYWxpZGF0b3IgZnJvbSB4ZXJjZXMgcGFja2FnZS4gKi8KLS8vICBwcml2YXRlIFJlZ3VsYXJFeHByZXNzaW9uIHZhbGlkYXRvcjsKLSAgCi0gIC8qIERpc3BsYXlzIHRoZSBzdGF0dXMgb2YgdGhlIG1hdGNoLiAqLwotICBwcml2YXRlIExhYmVsIG1hdGNoTGFiZWw7Ci0KLQotICAvKiBUaGUgcmVnZXguICovCi0gIHByaXZhdGUgVGV4dCB2YWx1ZTsKLSAgCi0gIC8qIFRoZSBzdHJpbmcgdGhlIHVzZXIgaXMgdHJ5aW5nIHRvIG1hdGNoIGFnYWluc3QgdGhlIHJlZ2V4LiAqLwotICBwcml2YXRlIFN0eWxlZFRleHQgdGVzdFN0cmluZzsKLQotICBwdWJsaWMgUmVnZXhUZXN0aW5nUGFnZSgpCi0gIHsKLSAgICBzdXBlcihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RFU1RJTkdfUEFHRV9USVRMRSIpKTsKLQotICAgIHNldFRpdGxlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfVEVTVElOR19QQUdFX1RJVExFIikpOwotICAgIHNldERlc2NyaXB0aW9uKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfVEVTVElOR19QQUdFX0RFU0NSSVBUSU9OIikpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gVmlld1V0aWxpdHkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIFhTREVkaXRvckNTSGVscElkcy5SRUdFWF9URVNUX1BBR0UpOwotCi0gICAgbWF0Y2hMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICBtYXRjaExhYmVsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9URVNUSU5HX1BBR0VfREVTQ1JJUFRJT04iKSk7Ci0gICAgRm9udERhdGFbXSBmb250RGF0YSA9IG1hdGNoTGFiZWwuZ2V0Rm9udCgpLmdldEZvbnREYXRhKCk7Ci0gICAgR3JpZERhdGEgZGF0YUYgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhRi53aWR0aEhpbnQgPSA0MDA7Ci0gICAgZGF0YUYuaGVpZ2h0SGludCA9IDYgKiBmb250RGF0YVswXS5nZXRIZWlnaHQoKTsKLSAgICBtYXRjaExhYmVsLnNldExheW91dERhdGEoZGF0YUYpOwotICAgIAotICAgIENvbXBvc2l0ZSBjb250cm9scyA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBjb250cm9sc0xheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgY29udHJvbHNMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgY29udHJvbHMuc2V0TGF5b3V0KGNvbnRyb2xzTGF5b3V0KTsKLSAgICBjb250cm9scy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotICAgIG5ldyBMYWJlbChjb250cm9scywgU1dULkxFRlQpLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9SRUdFWF9MQUJFTCIpKTsKLSAgICB2YWx1ZSA9IG5ldyBUZXh0KGNvbnRyb2xzLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0gICAgdmFsdWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQotICAgIG5ldyBMYWJlbChjb250cm9scywgU1dULkxFRlQpLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9TQU1QTEVfVEVYVCIpKTsKLSAgICB0ZXN0U3RyaW5nID0gbmV3IFN0eWxlZFRleHQoY29udHJvbHMsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRlc3RTdHJpbmcsIFhTREVkaXRvckNTSGVscElkcy5SRUdFWF9TQU1QTEVfVEVYVCk7Ci0gICAgdGVzdFN0cmluZy5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBuZXcgVGVzdFN0cmluZ0xpc3RlbmVyKCkpOwotICAgIHRlc3RTdHJpbmcuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgCi0gICAgY29udHJvbHMucGFjaygpOwotICAgIAotICAgIExhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgR0MgZ2MgPSBuZXcgR0Moc2VwYXJhdG9yKTsKLSAgICBQb2ludCBwb2ludFNpemUgPSBnYy5zdHJpbmdFeHRlbnQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9URVNUSU5HX1BBR0VfREVTQ1JJUFRJT04iKSk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZC53aWR0aEhpbnQgPSBwb2ludFNpemUueCAvIDIgKyBnYy5nZXRBZHZhbmNlV2lkdGgoJ00nKSoxMTsKLSAgICBnZC5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAKLSAgICBjb21wb3NpdGUucGFjaygpOwotCi0gICAgc2V0Q29udHJvbChjb21wb3NpdGUpOwotICB9Ci0KLQotICBwcml2YXRlIFN0cmluZyBnZXRQYXR0ZXJuVmFsdWUoKQotICB7Ci0gICAgcmV0dXJuICggKFJlZ2V4Q29tcG9zaXRpb25QYWdlKWdldFByZXZpb3VzUGFnZSgpICkuZ2V0UGF0dGVybigpLmdldExleGljYWxWYWx1ZSgpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0RmxhZ3MoKQotICB7Ci0gICAgcmV0dXJuICggKFJlZ2V4Q29tcG9zaXRpb25QYWdlKWdldFByZXZpb3VzUGFnZSgpICkuZ2V0RmxhZ3MoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKQotICB7Ci0gICAgc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQotICAgIGdldEZsYWdzKCk7Ci0gICAgdmFsdWUuc2V0VGV4dChUZXh0UHJvY2Vzc29yLnByb2Nlc3MoZ2V0UGF0dGVyblZhbHVlKCkpKTsKLSAgICB1cGRhdGVNYXRjaFN0YXR1cygpOwotICAgIHRlc3RTdHJpbmcuc2V0Rm9jdXMoKTsKLSAgfQotCi0gIGNsYXNzIFRlc3RTdHJpbmdMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKQotICAgIHsKLSAgICAgIHVwZGF0ZU1hdGNoU3RhdHVzKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU1hdGNoU3RhdHVzKCkKLSAgewotICAgIGlmIChQYXR0ZXJuLm1hdGNoZXMoZ2V0UGF0dGVyblZhbHVlKCksIHRlc3RTdHJpbmcuZ2V0VGV4dCgpKSkKLSAgICB7Ci0vLyAgICAgIG1hdGNoTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX01BVENIRVMiKSk7Ci0gICAgICBzZXRNZXNzYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfTUFUQ0hFUyIpLCAxKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNldE1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9ET0VTX05PVF9NQVRDSCIpLCAyKTsKLS8vICAgICAgbWF0Y2hMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9SRUdFWF9XSVpBUkRfRE9FU19OT1RfTUFUQ0giKSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4V2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1JlZ2V4V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNDFmNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9SZWdleFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhdHRlcm5GYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RGYWN0b3J5SW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgUmVnZXhXaXphcmQgZXh0ZW5kcyBXaXphcmQgCi17Ci0gIHByaXZhdGUgUmVnZXhDb21wb3NpdGlvblBhZ2UgY29tcG9zaXRpb25QYWdlOwotICBwcml2YXRlIFJlZ2V4VGVzdGluZ1BhZ2UgdGVzdGluZ1BhZ2U7Ci0KLSAgLyogVGhlIG9yaWdpbmFsLCB1bmNoYW5nZWQgcGF0dGVybi4gKi8gIAotICBwcml2YXRlIFhTRFBhdHRlcm5GYWNldCBvcmlnaW5hbFBhdHRlcm47Ci0gIAotICAvKiBBIGNvcHkgb2YgdGhlIG9yaWdpbmFsIHBhdHRlcm4gdGhhdCBpcyBwYXNzZWQgaW50byB0aGUgd2l6YXJkLiAqLwotICBwcml2YXRlIFhTRFBhdHRlcm5GYWNldCBtb2RpZmllZFBhdHRlcm47Ci0KLSAgU3RyaW5nIHBhdHRlcm47Ci0KLSAgcHVibGljIFJlZ2V4V2l6YXJkKFN0cmluZyBleHByKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBzZXRXaW5kb3dUaXRsZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkVHRVhfV0laQVJEX1RJVExFIikpOwotICAgIHNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9yZWd4X3dpei5wbmciKSk7Ci0KLSAgICBYU0RGYWN0b3J5SW1wbCBmYWN0b3J5ID0gbmV3IFhTREZhY3RvcnlJbXBsKCk7Ci0gICAgbW9kaWZpZWRQYXR0ZXJuID0gZmFjdG9yeS5jcmVhdGVYU0RQYXR0ZXJuRmFjZXQoKTsKLSAgICBtb2RpZmllZFBhdHRlcm4uc2V0TGV4aWNhbFZhbHVlKGV4cHIpOwotCi0gICAgb3JpZ2luYWxQYXR0ZXJuID0gZmFjdG9yeS5jcmVhdGVYU0RQYXR0ZXJuRmFjZXQoKTsKLSAgICBvcmlnaW5hbFBhdHRlcm4uc2V0TGV4aWNhbFZhbHVlKGV4cHIpOwotCi0gICAgY29tcG9zaXRpb25QYWdlID0gbmV3IFJlZ2V4Q29tcG9zaXRpb25QYWdlKG1vZGlmaWVkUGF0dGVybik7Ci0gICAgYWRkUGFnZShjb21wb3NpdGlvblBhZ2UpOwotCi0gICAgdGVzdGluZ1BhZ2UgPSBuZXcgUmVnZXhUZXN0aW5nUGFnZSgpOwotICAgIGFkZFBhZ2UodGVzdGluZ1BhZ2UpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuKCkKLSAgewotICAgIHJldHVybiBwYXR0ZXJuOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKQotICB7Ci0gICAgcmV0dXJuIChjb21wb3NpdGlvblBhZ2UuZ2V0VmFsdWUoKS5sZW5ndGgoKSA+IDApOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpCi0gIHsKLSAgICBwYXR0ZXJuID0gbW9kaWZpZWRQYXR0ZXJuLmdldExleGljYWxWYWx1ZSgpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1hTRExvY2F0aW9uQ2hvaWNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9YU0RMb2NhdGlvbkNob2ljZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcwOWYxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1hTRExvY2F0aW9uQ2hvaWNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVmlld1V0aWxpdHk7Ci0KLQotcHVibGljIGNsYXNzIFhTRExvY2F0aW9uQ2hvaWNlUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgCi17Ci0gIHByb3RlY3RlZCBCdXR0b24gcmFkaW9CdXR0b24xOwotICBwcm90ZWN0ZWQgQnV0dG9uIHJhZGlvQnV0dG9uMjsKLSAgICAKLSAgcHVibGljIFhTRExvY2F0aW9uQ2hvaWNlUGFnZSgpCi0gIHsKLSAgICBzdXBlcigiWFNETG9jYXRpb25DaG9pY2VQYWdlIik7Ci0KLSAgICB0aGlzLnNldFRpdGxlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9XSVpBUkRfSU5DTFVERV9GSUxFX1RJVExFIikpOwotICAgIHRoaXMuc2V0RGVzY3JpcHRpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1dJWkFSRF9JTkNMVURFX0ZJTEVfREVTQyIpKTsKLSAgfQotICAgIAotICBwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgYmFzZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgYmFzZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAKLSAgICBWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChiYXNlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfSU5DTFVERV9VUkxfRklMRSIpKTsKLSAgICBDb21wb3NpdGUgcmFkaW9CdXR0b25zR3JvdXAgPSBWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUoYmFzZSwgMSwgdHJ1ZSk7Ci0KLSAgICByYWRpb0J1dHRvbjEgPSBWaWV3VXRpbGl0eS5jcmVhdGVSYWRpb0J1dHRvbihyYWRpb0J1dHRvbnNHcm91cCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JBRElPX0ZJTEUiKSk7Ci0gICAgICAKLSAgICByYWRpb0J1dHRvbjIgPSBWaWV3VXRpbGl0eS5jcmVhdGVSYWRpb0J1dHRvbihyYWRpb0J1dHRvbnNHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfUkFESU9fVVJMIikpOwotCi0gICAgcmFkaW9CdXR0b24xLnNldFNlbGVjdGlvbih0cnVlKTsKLQotICAgIHNldENvbnRyb2woYmFzZSk7Ci0gIH0KLQotICAvLyBhY3Rpb25zIG9uIGZpbmlzaAotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNVUkwoKQotICB7Ci0gICAgcmV0dXJuIHJhZGlvQnV0dG9uMi5nZXRTZWxlY3Rpb24oKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9YU0ROZXdGaWxlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9YU0ROZXdGaWxlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWMxZTBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0LXhzZC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3dpemFyZHMvWFNETmV3RmlsZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkczsKLSAKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIFhTRE5ld0ZpbGVQYWdlIGV4dGVuZHMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZQotewotICBwdWJsaWMgWFNETmV3RmlsZVBhZ2UoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSAKLSAgewotICAgIHN1cGVyKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9DUkVBVEVYU0QiKSwgc2VsZWN0aW9uKTsKLSAgICBzZXRUaXRsZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTkVXX1hNTF9TQ0hFTUFfVElUTEUiKSk7Ci0gICAgc2V0RGVzY3JpcHRpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0NSRUFURV9BX05FV19YTUxfU0NIRU1BX0RFU0MiKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIAotICB7Ci0gICAgLy8gaW5oZXJpdCBkZWZhdWx0IGNvbnRhaW5lciBhbmQgbmFtZSBzcGVjaWZpY2F0aW9uIHdpZGdldHMKLSAgICBzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0KLSAgICB0aGlzLnNldEZpbGVOYW1lKGNvbXB1dGVEZWZhdWx0RmlsZU5hbWUoKSk7Ci0KLSAgICBzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkKLSAgewotICAgIFBhdGggbmV3TmFtZSA9IG5ldyBQYXRoKGdldEZpbGVOYW1lKCkpOwotICAgIFN0cmluZyBmdWxsRmlsZU5hbWUgPSBnZXRGaWxlTmFtZSgpOwotICAgIFN0cmluZyBleHRlbnNpb24gPSBuZXdOYW1lLmdldEZpbGVFeHRlbnNpb24oKTsKLSAgICBpZiAoZXh0ZW5zaW9uID09IG51bGwgfHwgIWV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJ4c2QiKSkgCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9YU0QiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgIH0KLQotICAgIC8vIGNoZWNrIGZvciBmaWxlIHNob3VsZCBiZSBjYXNlIGluc2Vuc2l0aXZlCi0gICAgU3RyaW5nIHNhbWVOYW1lID0gZXhpc3RzRmlsZUFueUNhc2UoZnVsbEZpbGVOYW1lKTsKLSAgICBpZiAoc2FtZU5hbWUgIT0gbnVsbCkgCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9FUlJPUl9GSUxFX0FMUkVBRFlfRVhJU1RTIiwgc2FtZU5hbWUpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiBzdXBlci52YWxpZGF0ZVBhZ2UoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZGVmYXVsdE5hbWUgPSAiTmV3WE1MU2NoZW1hIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgU3RyaW5nIGRlZmF1bHRGaWxlRXh0ZW5zaW9uID0gIi54c2QiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zID0geyAiKi54c2QifTsgLy8kTk9OLU5MUy0xJAotCi0gIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZURlZmF1bHRGaWxlTmFtZSgpCi0gIHsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIFN0cmluZyBmaWxlTmFtZSA9IGRlZmF1bHROYW1lICsgZGVmYXVsdEZpbGVFeHRlbnNpb247Ci0gICAgSVBhdGggY29udGFpbmVyRnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotICAgIGlmIChjb250YWluZXJGdWxsUGF0aCAhPSBudWxsKQotICAgIHsKLSAgICAgIHdoaWxlICh0cnVlKQotICAgICAgewotICAgICAgICBJUGF0aCBwYXRoID0gY29udGFpbmVyRnVsbFBhdGguYXBwZW5kKGZpbGVOYW1lKTsKLSAgICAgICAgaWYgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZXhpc3RzKHBhdGgpKQotICAgICAgICB7Ci0gICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICBmaWxlTmFtZSA9IGRlZmF1bHROYW1lICsgY291bnQgKyBkZWZhdWx0RmlsZUV4dGVuc2lvbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmlsZU5hbWU7Ci0gIH0KLQotICAvLyByZXR1cm5zIHRydWUgaWYgZmlsZSBvZiBzcGVjaWZpZWQgbmFtZSBleGlzdHMgaW4gYW55IGNhc2UgZm9yIHNlbGVjdGVkIGNvbnRhaW5lcgotICBwcm90ZWN0ZWQgU3RyaW5nIGV4aXN0c0ZpbGVBbnlDYXNlKFN0cmluZyBmaWxlTmFtZSkKLSAgewotICAgIGlmICggKGdldENvbnRhaW5lckZ1bGxQYXRoKCkgIT0gbnVsbCkgJiYgKGdldENvbnRhaW5lckZ1bGxQYXRoKCkuaXNFbXB0eSgpID09IGZhbHNlKQotICAgICAgICAmJiAoZmlsZU5hbWUuY29tcGFyZVRvKCIiKSAhPSAwKSkKLSAgICB7Ci0gICAgICAvL2xvb2sgdGhyb3VnaCBhbGwgcmVzb3VyY2VzIGF0IHRoZSBzcGVjaWZpZWQgY29udGFpbmVyIC0gY29tcGFyZSBpbiB1cHBlciBjYXNlCi0gICAgICBJUmVzb3VyY2UgcGFyZW50ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKGdldENvbnRhaW5lckZ1bGxQYXRoKCkpOwotICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIElDb250YWluZXIpCi0gICAgICB7Ci0gICAgICAgIElDb250YWluZXIgY29udGFpbmVyID0gKElDb250YWluZXIpIHBhcmVudDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBJUmVzb3VyY2VbXSBtZW1iZXJzID0gY29udGFpbmVyLm1lbWJlcnMoKTsKLSAgICAgICAgICBTdHJpbmcgZW50ZXJlZEZpbGVVcHBlciA9IGZpbGVOYW1lLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1lbWJlcnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlVXBwZXJOYW1lID0gbWVtYmVyc1tpXS5nZXROYW1lKCkudG9VcHBlckNhc2UoKTsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZVVwcGVyTmFtZS5lcXVhbHMoZW50ZXJlZEZpbGVVcHBlcikpCi0gICAgICAgICAgICB7ICAKLSAgICAgICAgICAgICAgcmV0dXJuIG1lbWJlcnNbaV0uZ2V0TmFtZSgpOyAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1hTRFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC14c2Qvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC93aXphcmRzL1hTRFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYzFiZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQteHNkL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvd2l6YXJkcy9YU0RTZWxlY3RJbmNsdWRlRmlsZVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzLlNlbGVjdFNpbmdsZUZpbGVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVmlld1V0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RQYXJzZXI7Ci0KLQotLyoqCi0gKiBFeHRlbmQgdGhlIGJhc2Ugd2l6YXJkIHRvIHNlbGVjdCBhIGZpbGUgZnJvbSB0aGUgcHJvamVjdCBvciBvdXRzaWRlIHRoZSB3b3JrYmVuY2gKLSAqIGFuZCBhZGQgZXJyb3IgaGFuZGxpbmcKLSAqLwotcHVibGljIGNsYXNzIFhTRFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZAotewotICBib29sZWFuIGlzSW5jbHVkZTsKLSAgWFNEU2NoZW1hIG1haW5TY2hlbWE7Ci0gIFhTRFNjaGVtYSBleHRlcm5hbFNjaGVtYTsKLQotICBYU0RMb2NhdGlvbkNob2ljZVBhZ2UgY2hvaWNlUGFnZTsKLSAgWFNEU2VsZWN0U2luZ2xlRmlsZVBhZ2UgZmlsZVBhZ2U7Ci0gIFhTRFVSTFBhZ2UgdXJsUGFnZTsKLQotICBJRmlsZSByZXN1bHRGaWxlOwotICBTdHJpbmcgcmVzdWx0VVJMOwotICBTdHJpbmcgbmFtZXNwYWNlID0gIiI7Ci0KLSAgcHVibGljIFhTRFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkKFhTRFNjaGVtYSBtYWluU2NoZW1hLCBib29sZWFuIGlzSW5jbHVkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2MsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlld2VyRmlsdGVyIGZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgc2V0V2luZG93VGl0bGUodGl0bGUpOwotICAgIHNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYU0RFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9OZXdYU0QucG5nIikpOwotCi0gICAgc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0KLSAgICAvLyBDaG9pY2UgUGFnZQotICAgIGNob2ljZVBhZ2UgPSBuZXcgWFNETG9jYXRpb25DaG9pY2VQYWdlKCk7Ci0KLSAgICAvLyBTZWxlY3QgRmlsZSBQYWdlCi0gICAgZmlsZVBhZ2UgPSBuZXcgWFNEU2VsZWN0U2luZ2xlRmlsZVBhZ2UoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgIHNlbGVjdGlvbiwgdHJ1ZSk7Ci0gICAgZmlsZVBhZ2Uuc2V0VGl0bGUodGl0bGUpOwotICAgIGZpbGVQYWdlLnNldERlc2NyaXB0aW9uKGRlc2MpOwotICAgIGZpbGVQYWdlLmFkZEZpbHRlcihmaWx0ZXIpOwotCi0gICAgLy8gVVJMIFBhZ2UKLSAgICB1cmxQYWdlID0gbmV3IFhTRFVSTFBhZ2UoKTsKLSAgICB1cmxQYWdlLnNldFRpdGxlKHRpdGxlKTsKLSAgICB1cmxQYWdlLnNldERlc2NyaXB0aW9uKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9GSUxFRElBTE9HX1NFTEVDVF9YTUxfVVJMIikpOwotICAgIAotICAgIHRoaXMubWFpblNjaGVtYSA9IG1haW5TY2hlbWE7Ci0gICAgdGhpcy5pc0luY2x1ZGUgPSBpc0luY2x1ZGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggYVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gYVNlbGVjdGlvbikKLSAgeyAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkKLSAgewotICAgIGFkZFBhZ2UoY2hvaWNlUGFnZSk7Ci0gICAgYWRkUGFnZShmaWxlUGFnZSk7Ci0gICAgYWRkUGFnZSh1cmxQYWdlKTsKLSAgfQotCi0gIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBjdXJyZW50UGFnZSkKLSAgewotICAgIFdpemFyZFBhZ2UgbmV4dFBhZ2UgPSBudWxsOwotCi0gICAgaWYgKGN1cnJlbnRQYWdlID09IGNob2ljZVBhZ2UpCi0gICAgewotICAgICAgaWYgKGNob2ljZVBhZ2UuaXNVUkwoKSkgCi0gICAgICB7Ci0gICAgICAgIG5leHRQYWdlID0gdXJsUGFnZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbmV4dFBhZ2UgPSBmaWxlUGFnZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5leHRQYWdlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkKLSAgewotICAgIGlmICghY2hvaWNlUGFnZS5pc1VSTCgpKQotICAgIHsKLSAgICAgIHJldHVybiBmaWxlUGFnZS5pc1BhZ2VDb21wbGV0ZSgpOyAKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkKLSAgeyAKLSAgICBpZiAoY2hvaWNlUGFnZS5pc1VSTCgpKQotICAgIHsKLSAgICAgIHRyeSAKLSAgICAgIHsKLSAgICAgICAgZ2V0Q29udGFpbmVyKCkucnVuKGZhbHNlLCB0cnVlLCB1cmxQYWdlLmdldFJ1bm5hYmxlKCkpOwotICAgICAgICByZXN1bHRVUkwgPSB1cmxQYWdlLmdldFVSTCgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsgIAotICAgICAgcmVzdWx0RmlsZSA9IGZpbGVQYWdlLmdldEZpbGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBNT0Ygb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgZXh0ZXJuYWwgZmlsZQotICAgKi8KLSAgcHVibGljIFhTRFNjaGVtYSBnZXRFeHRlcm5hbFNjaGVtYSgpCi0gIHsKLSAgICByZXR1cm4gZXh0ZXJuYWxTY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgSUZpbGUgZ2V0UmVzdWx0RmlsZSgpCi0gIHsKLSAgICByZXR1cm4gcmVzdWx0RmlsZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJMKCkKLSAgewotICAgIHJldHVybiByZXN1bHRVUkw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkKLSAgewotICAJcmV0dXJuIG5hbWVzcGFjZTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBNT0YgbW9kZWwgZm9yIHRoZSBpbXBvcnRlZCBmaWxlCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGRvTG9hZEV4dGVybmFsTW9kZWwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgeHNkTW9kZWxGaWxlLCBTdHJpbmcgeHNkRmlsZU5hbWUpCi0gIHsgCi0gICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0gICAgU3RyaW5nIGN1cnJlbnROYW1lU3BhY2UgPSBtYWluU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotCi0gICAgbW9uaXRvci5iZWdpblRhc2soIkxvYWRpbmcgWE1MIFNjaGVtYSIsIDEwMCk7Ci0gICAgbW9uaXRvci53b3JrZWQoNTApOwotCi0gICAgWFNEUGFyc2VyIHBhcnNlciA9IG5ldyBYU0RQYXJzZXIoKTsKLSAgICBwYXJzZXIucGFyc2UoeHNkTW9kZWxGaWxlKTsKLQotICAgIGV4dGVybmFsU2NoZW1hID0gcGFyc2VyLmdldFNjaGVtYSgpOwotICAgIGlmIChleHRlcm5hbFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBleHROYW1lc3BhY2UgPSBleHRlcm5hbFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgIG5hbWVzcGFjZSA9IGV4dE5hbWVzcGFjZTsKLSAgICAgCi0gICAgICBpZiAoZXh0ZXJuYWxTY2hlbWEuZ2V0RGlhZ25vc3RpY3MoKSAhPSBudWxsICYmCi0gICAgICAgICAgZXh0ZXJuYWxTY2hlbWEuZ2V0RGlhZ25vc3RpY3MoKS5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBlcnJvck1lc3NhZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RyaW5nKCJfVUlfSU5DT1JSRUNUX1hNTF9TQ0hFTUEiLCB4c2RGaWxlTmFtZSk7Ci0gICAgICB9ICAKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKGlzSW5jbHVkZSkgCi0gICAgICAgIHsgIAotICAgICAgICAgIC8vIENoZWNrIHRoZSBuYW1lc3BhY2UgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHRoZSBzYW1lIGFzIGN1cnJlbnQgZmlsZQotICAgICAgICAgIGlmIChleHROYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY3VycmVudE5hbWVTcGFjZSAhPSBudWxsICYmICFleHROYW1lc3BhY2UuZXF1YWxzKGN1cnJlbnROYW1lU3BhY2UpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RyaW5nKCJfVUlfRElGRkVSRU5UX05BTUVfU1BBQ0UiLCB4c2RGaWxlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeyAgCi0gICAgICAgICAgLy8gQ2hlY2sgdGhlIG5hbWVzcGFjZSB0byBtYWtlIHN1cmUgdGhleSBhcmUgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgZmlsZQotICAgICAgICAgIGlmIChleHROYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY3VycmVudE5hbWVTcGFjZSAhPSBudWxsICYmIGV4dE5hbWVzcGFjZS5lcXVhbHMoY3VycmVudE5hbWVTcGFjZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9VSV9TQU1FX05BTUVfU1BBQ0UiLCB4c2RGaWxlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlcnJvck1lc3NhZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RyaW5nKCJfVUlfSU5DT1JSRUNUX1hNTF9TQ0hFTUEiLCB4c2RGaWxlTmFtZSk7Ci0gICAgfQotCi0gICAgbW9uaXRvci5zdWJUYXNrKCJGaW5pc2ggTG9hZGluZyIpOwotICAgIG1vbml0b3Iud29ya2VkKDgwKTsKLQotICAgIHJldHVybiBlcnJvck1lc3NhZ2U7Ci0gIH0KLQotIAotICAvKioKLSAgICogVVJMIHBhZ2UKLSAgICovCi0gIGNsYXNzIFhTRFVSTFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlCi0gIHsgCi0gICAgVGV4dCB1cmxGaWVsZDsKLSAgICBTdHJpbmcgc2F2ZVN0cmluZzsKLQotICAgIHB1YmxpYyBYU0RVUkxQYWdlKCkKLSAgICB7Ci0gICAgICBzdXBlcigiVVJMUGFnZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgICB7Ci0gICAgICBDb21wb3NpdGUgY2xpZW50ID0gVmlld1V0aWxpdHkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwyKTsKLSAgICAgIFZpZXdVdGlsaXR5LnNldENvbXBvc2l0ZShjbGllbnQpOwotCi0gICAgICBWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChjbGllbnQsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9VUkwiKSk7Ci0gICAgICBWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChjbGllbnQsICIiKTsKLQotICAgICAgdXJsRmllbGQgPSBWaWV3VXRpbGl0eS5jcmVhdGVUZXh0RmllbGQoY2xpZW50LCA1MCk7Ci0gICAgICBzYXZlU3RyaW5nID0gImh0dHA6Ly8iOwotICAgICAgdXJsRmllbGQuc2V0VGV4dChzYXZlU3RyaW5nKTsKLQotICAgICAgc2V0Q29udHJvbChjbGllbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJMKCkKLSAgICB7Ci0gICAgICByZXR1cm4gdXJsRmllbGQuZ2V0VGV4dCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBvcGVuRXh0ZXJuYWxTY2hlbWEoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgIHsKLSAgICAgIFN0cmluZyB0ZXh0ID0gdXJsRmllbGQuZ2V0VGV4dCgpOwotLy8gICAgICBpZiAodGV4dC5lcXVhbHMoc2F2ZVN0cmluZykpIAotLy8gICAgICB7Ci0vLyAgICAgICAgcmV0dXJuIGZhbHNlOwotLy8gICAgICB9Ci0vLyAgICAgIHNhdmVTdHJpbmcgPSB0ZXh0OwotCi0gICAgICBpZiAodGV4dC5lcXVhbHMoIiIpKQotICAgICAgewotICAgICAgICBzZXRFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1NQRUNJRllfVVJMIikpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggIXRleHQuc3RhcnRzV2l0aCgiaHR0cDovLyIpICkKLSAgICAgIHsKLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9VUkxfU1RBUlRfV0lUSCIpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gZG9Mb2FkRXh0ZXJuYWxNb2RlbChtb25pdG9yLCB0ZXh0LCB0ZXh0KTsKLSAgICAgIGlmIChlcnJvck1lc3NhZ2UgIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOyAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGdldFJ1bm5hYmxlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpICAgCi0gICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobW9uaXRvciA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1vbml0b3I9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCIiLCA2KTsKLSAgICAgICAgCi0gICAgICAgICAgYm9vbGVhbiBvayA9IG9wZW5FeHRlcm5hbFNjaGVtYShtb25pdG9yKTsKLQotICAgICAgICAgIGlmICghb2spIAotICAgICAgICAgIHsgCi0gICAgICAgICAgICB0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihuZXcgamF2YS5sYW5nLkVycm9yKCkpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICB9Ci0gICAgICB9OwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTZWxlY3QgWE1MIFNjaGVtYSBGaWxlCi0gICAqLwotICBjbGFzcyBYU0RTZWxlY3RTaW5nbGVGaWxlUGFnZSBleHRlbmRzIFNlbGVjdFNpbmdsZUZpbGVQYWdlCi0gIHsKLSAgICBwdWJsaWMgWFNEU2VsZWN0U2luZ2xlRmlsZVBhZ2UoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgYm9vbGVhbiBpc0ZpbGVNYW5kYXRvcnkpCi0gICAgeyAgICAgICAgICAKLSAgICAgIHN1cGVyKHdvcmtiZW5jaCxzZWxlY3Rpb24saXNGaWxlTWFuZGF0b3J5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gb3BlbkV4dGVybmFsU2NoZW1hKCkKLSAgICB7Ci0gICAgICAvLyBHZXQgdGhlIGZ1bGx5LXF1YWxpZmllZCBmaWxlIG5hbWUKLSAgICAgIElGaWxlIGlGaWxlID0gZ2V0RmlsZSgpOwotICAgICAgaWYgKGlGaWxlID09IG51bGwpIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLQotICAgICAgU3RyaW5nIHhzZE1vZGVsRmlsZSA9IGlGaWxlLmdldExvY2F0aW9uVVJJKCkudG9TdHJpbmcoKTsKLSAgICAgIFN0cmluZyB4c2RGaWxlTmFtZSA9IGlGaWxlLmdldE5hbWUoKTsKLSAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBkb0xvYWRFeHRlcm5hbE1vZGVsKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHhzZE1vZGVsRmlsZSwgeHNkRmlsZU5hbWUpOwotCi0gICAgICBpZiAoZXJyb3JNZXNzYWdlICE9IG51bGwpIAotICAgICAgewotICAgICAgICBzZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpCi0gICAgeyAgCi0gICAgICBpZiAoY2hvaWNlUGFnZS5pc1VSTCgpKSAKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzdXBlci5pc1BhZ2VDb21wbGV0ZSgpKSAKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG9wZW5FeHRlcm5hbFNjaGVtYSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIHN1cGVyLmlzUGFnZUNvbXBsZXRlKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0FkZEZpZWxkQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0FkZEZpZWxkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MTEyNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9BZGRGaWVsZEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRmllbGRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklDb21wbGV4VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkJhc2VDb21tYW5kOwotCi0KLXB1YmxpYyBjbGFzcyBBZGRGaWVsZEFjdGlvbiBleHRlbmRzIEJhc2VTZWxlY3Rpb25BY3Rpb24KLXsgICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAiQWRkRmllbGRBY3Rpb24iOyAgLy8kTk9OLU5MUy0xJAotICAKLSAgcHVibGljIEFkZEZpZWxkQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBzZXRJZChJRCk7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9GSUVMRCk7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGlmIChnZXRTZWxlY3RlZE9iamVjdHMoKS5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gZ2V0U2VsZWN0ZWRPYmplY3RzKCkuZ2V0KDApOwotICAgICAgSUNvbXBsZXhUeXBlIHR5cGUgPSBudWxsOwotICAgICAgCi0gICAgICBpZiAobyBpbnN0YW5jZW9mIElDb21wbGV4VHlwZSkKLSAgICAgIHsgIAotICAgICAgICB0eXBlID0gKElDb21wbGV4VHlwZSlvOyAKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJRmllbGQpCi0gICAgICB7Ci0gICAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpbzsKLSAgICAgICAgdHlwZSA9IGZpZWxkLmdldENvbnRhaW5lclR5cGUoKTsKLSAgICAgIH0KLSAgICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIENvbW1hbmQgY29tbWFuZCA9IHR5cGUuZ2V0QWRkTmV3RmllbGRDb21tYW5kKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsKQotICAgICAgICB7ICAKLSAgICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoKChCYXNlQ29tbWFuZCljb21tYW5kKS5nZXRBZGRlZENvbXBvbmVudCgpKTsKLSAgICAgICAgICBzZWxlY3RBZGRlZENvbXBvbmVudChhZGFwdGVyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgLy9UT0RPIC4uLiBwb3AgdXAgYSBjb21tYW5kIG5vdCBpbXBsZW1lbnRlZCBtZXNzYWdlCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgZG9FZGl0KE9iamVjdCBvYmosIElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICBpZiAob2JqIGluc3RhbmNlb2YgQmFzZUZpZWxkRWRpdFBhcnQpCi0gICAgewotICAgICAgQmFzZUZpZWxkRWRpdFBhcnQgZWRpdFBhcnQgPSAoQmFzZUZpZWxkRWRpdFBhcnQpb2JqOwotICAgICAgZWRpdFBhcnQuZG9FZGl0TmFtZSghKHBhcnQgaW5zdGFuY2VvZiBDb250ZW50T3V0bGluZSkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9CYXNlRGlyZWN0RWRpdEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9CYXNlRGlyZWN0RWRpdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDE0MWJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvQmFzZURpcmVjdEVkaXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuRGlyZWN0RWRpdEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuQWJzdHJhY3RFZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotCi0KLXB1YmxpYyBjbGFzcyBCYXNlRGlyZWN0RWRpdEFjdGlvbiBleHRlbmRzIERpcmVjdEVkaXRBY3Rpb24gewotCXByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXI7Ci0JCi0JLyoqCi0JICogU2FtZSBhcyB7QGxpbmsgI0RpcmVjdEVkaXRBY3Rpb24oSVdvcmtiZW5jaFBhcnQpfS4KLQkgKiBAcGFyYW0gZWRpdG9yIHRoZSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgQmFzZURpcmVjdEVkaXRBY3Rpb24oSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCXN1cGVyKChJV29ya2JlbmNoUGFydCllZGl0b3IpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBEaXJlY3RFZGl0QWN0aW9uIHVzaW5nIHRoZSBzcGVjaWZpZWQgcGFydC4KLQkgKiBAcGFyYW0gcGFydCB0aGUgd29ya2JlbmNoIHBhcnQKLQkgKi8KLQlwdWJsaWMgQmFzZURpcmVjdEVkaXRBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlzdXBlcihwYXJ0KTsKLQl9Ci0JCi0JICAvKiAobm9uLUphdmFkb2MpCi0JICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLlNlbGVjdGlvbkFjdGlvbiNnZXRTZWxlY3Rpb24oKQotCSAgICovCi0JICBwcm90ZWN0ZWQgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKQotCSAgewotCSAgICAvLyBhbHdheXMgZ2V0IHNlbGVjdGlvbiBmcm9tIHNlbGVjdGlvbiBwcm92aWRlciBmaXJzdAotCQkgIGlmIChwcm92aWRlciE9bnVsbCkgewotCQkJICBPYmplY3Qgc2VsZWN0aW9uID0gcHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJICBPYmplY3Qgb2JqZWN0ID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCSAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKSB7Ci0JCQkJCSAgLy8gV2UgbmVlZCB0byByZXR1cm4gYW4gRWRpdFBhcnQgYXMgdGhlIHNlbGVjdGlvbi4KLQkJCQkJICBJRWRpdG9yUGFydCBlZGl0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQkJICBPYmplY3QgZ3JhcGhpY2FsVmlld2VyID0gZWRpdG9yLmdldEFkYXB0ZXIoR3JhcGhpY2FsVmlld2VyLmNsYXNzKTsKLQkJCQkJICBpZiAoZ3JhcGhpY2FsVmlld2VyIGluc3RhbmNlb2YgQWJzdHJhY3RFZGl0UGFydFZpZXdlcikgewotCQkJCQkJICBBYnN0cmFjdEVkaXRQYXJ0Vmlld2VyIHZpZXdlciA9IChBYnN0cmFjdEVkaXRQYXJ0Vmlld2VyKSBncmFwaGljYWxWaWV3ZXI7Ci0JCQkJCQkgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KXZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KG9iamVjdCk7Ci0JCQkJCQkgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0UGFydCk7Ci0JCQkJCSAgfQotCQkJCSAgfQotCQkJICB9Ci0JICAgIH0KLQkgICAgCi0JICAgIHJldHVybiBzdXBlci5nZXRTZWxlY3Rpb24oKTsKLQkgIH0KLQkKLQkgIHByb3RlY3RlZCBib29sZWFuIGNhbGN1bGF0ZUVuYWJsZWQoKSB7Ci0JCSAgT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQkgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikgewotCQkJICByZXR1cm4gICEoKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb24pLmlzUmVhZE9ubHkoKTsKLQkJICB9Ci0JCSAgCi0JCSAgcmV0dXJuIHRydWU7Ci0JICB9Ci0JICAKLQkgIC8qIChub24tSmF2YWRvYykKLQkgICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuU2VsZWN0aW9uQWN0aW9uI3NldFNlbGVjdGlvblByb3ZpZGVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyKQotCSAgICovCi0JICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Qcm92aWRlcihJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpCi0JICB7Ci0JICAgIHN1cGVyLnNldFNlbGVjdGlvblByb3ZpZGVyKHByb3ZpZGVyKTsKLQkgICAgdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyOwotCSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9CYXNlU2VsZWN0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0Jhc2VTZWxlY3Rpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhmNmY3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0Jhc2VTZWxlY3Rpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5TZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkFic3RyYWN0RWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUNvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlU2VsZWN0aW9uQWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUEFSQVRPUl9JRCA9ICJvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJNRU5VX1NUQVJUX0lEID0gIlNVQk1FTlVfU1RBUlRfSUQ6ICI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCTUVOVV9FTkRfSUQgPSAiU1VCTUVOVV9FTkRfSUQ6ICI7IC8vJE5PTi1OTFMtMSQKLQotICBwcm90ZWN0ZWQgSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBkb0RpcmVjdEVkaXQgPSB0cnVlOwotICAKLSAgcHVibGljIEJhc2VTZWxlY3Rpb25BY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuU2VsZWN0aW9uQWN0aW9uI2dldFNlbGVjdGlvbigpCi0gICAqLwotICBwcm90ZWN0ZWQgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKQotICB7Ci0gICAgLy8gYWx3YXlzIGdldCBzZWxlY3Rpb24gZnJvbSBzZWxlY3Rpb24gcHJvdmlkZXIgZmlyc3QKLSAgICBpZiAocHJvdmlkZXIhPW51bGwpCi0gICAgICByZXR1cm4gcHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgCi0gICAgcmV0dXJuIHN1cGVyLmdldFNlbGVjdGlvbigpOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5TZWxlY3Rpb25BY3Rpb24jc2V0U2VsZWN0aW9uUHJvdmlkZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Qcm92aWRlcihJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpCi0gIHsKLSAgICBzdXBlci5zZXRTZWxlY3Rpb25Qcm92aWRlcihwcm92aWRlcik7Ci0gICAgdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uI2NhbGN1bGF0ZUVuYWJsZWQoKQotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpCi0gIHsKLSAgICBpZiAoZ2V0U2VsZWN0ZWRPYmplY3RzKCkuc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGdldFNlbGVjdGVkT2JqZWN0cygpLmdldCgwKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgSUNvbXBsZXhUeXBlKQotICAgICAgewotICAgICAgICByZXR1cm4gISgoSUNvbXBsZXhUeXBlKW8pLmlzUmVhZE9ubHkoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJRmllbGQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAhKChJRmllbGQpbykuaXNSZWFkT25seSgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgc2VsZWN0QWRkZWRDb21wb25lbnQoZmluYWwgQWRhcHRlciBhZGFwdGVyKQotICB7Ci0gICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7Ci0gICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBwcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYWRhcHRlcikpOwotICAgICAgICAgIGlmIChkb0RpcmVjdEVkaXQpCi0gICAgICAgICAgICBhY3RpdmF0ZURpcmVjdEVkaXQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH07Ci0gICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFjdGl2YXRlRGlyZWN0RWRpdCgpCi0gIHsKLSAgICBpZiAoZ2V0V29ya2JlbmNoUGFydCgpIGluc3RhbmNlb2YgSUVkaXRvclBhcnQpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIElFZGl0b3JQYXJ0IG93bmluZ0VkaXRvciA9IChJRWRpdG9yUGFydClnZXRXb3JrYmVuY2hQYXJ0KCk7Ci0gICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgcGFydCA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlUGFydCgpOwotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gb3duaW5nRWRpdG9yLmdldEFkYXB0ZXIoR3JhcGhpY2FsVmlld2VyLmNsYXNzKTsKLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFic3RyYWN0RWRpdFBhcnRWaWV3ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICBBYnN0cmFjdEVkaXRQYXJ0Vmlld2VyIHZpZXdlciA9IChBYnN0cmFjdEVkaXRQYXJ0Vmlld2VyKW9iamVjdDsKLSAgICAgICAgICBPYmplY3Qgb2JqID0gdmlld2VyLmdldFNlbGVjdGVkRWRpdFBhcnRzKCkuZ2V0KDApOwotICAgICAgICAgIGRvRWRpdChvYmosIHBhcnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIAotICAgICAgfQotICAgIH0gICAgICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBkb0VkaXQoT2JqZWN0IG9iaiwgSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0NhcHR1cmVTY3JlZW5BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvQ2FwdHVyZVNjcmVlbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjRjMmE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvQ2FwdHVyZVNjcmVlbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNXVEdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuTGF5ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuU2NhbGFibGVSb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBDYXB0dXJlU2NyZWVuQWN0aW9uIGV4dGVuZHMgQWN0aW9uCi17Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIExBU1RfU0NSRUVOX0NBUFRVUkVfUEFUSCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIik7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIExBU1RfU0NSRUVOX0NBUFRVUkVfRklMRV9OQU1FID0gTWVzc2FnZXMuX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9ERUZBVUxUX0ZJTEVfTkFNRTsKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIExBU1RfU0NSRUVOX0NBUFRVUkVfRklMRV9FWFRFTlNJT04gPSAiLmpwZyI7IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgQ2FwdHVyZVNjcmVlbkFjdGlvbigpCi0gIHsKLSAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9DQVBUVVJFX1NDUkVFTl9BQ1RJT05fVEVYVCk7Ci0gICAgc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuX1VJX0NBUFRVUkVfU0NSRUVOX0FDVElPTl9UT09MVElQVEVYVCk7Ci0gICAgc2V0SW1hZ2VEZXNjcmlwdG9yKFhTREVkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL2V0b29sMTYvY2FwdHVyZXNjcmVlbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihYU0RFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9kdG9vbDE2L2NhcHR1cmVzY3JlZW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgc2V0QWNjZWxlcmF0b3IoU1dULkNUUkwgfCBTV1QuU0hJRlQgfCAnWCcpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgSW1hZ2VFeHBvcnRlciBpbWFnZUV4cG9ydGVyID0gbmV3IEltYWdlRXhwb3J0ZXIoKTsKLSAgICBpbWFnZUV4cG9ydGVyLnNhdmUoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCksIChHcmFwaGljYWxWaWV3ZXIpIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpLmdldEFkYXB0ZXIoR3JhcGhpY2FsVmlld2VyLmNsYXNzKSk7Ci0gIH0KLQotICBwdWJsaWMgY2xhc3MgSW1hZ2VFeHBvcnRlcgotICB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfRk9STUFUUyA9ICIqLmpwZzsqLmpwZWc7Ki5ibXA7Ki50aWYiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1NFUEFSQVRPUiA9ICJmaWxlLnNlcGFyYXRvciI7Ci0KLQlwdWJsaWMgYm9vbGVhbiBzYXZlKElFZGl0b3JQYXJ0IGVkaXRvclBhcnQsIEdyYXBoaWNhbFZpZXdlciB2aWV3ZXIsIFN0cmluZyBzYXZlRmlsZVBhdGgsIGludCBmb3JtYXQpCi0gICAgewotICAgICAgQXNzZXJ0LmlzTm90TnVsbChlZGl0b3JQYXJ0LCAibnVsbCBlZGl0b3JQYXJ0IHBhc3NlZCB0byBJbWFnZUV4cG9ydGVyLnNhdmUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgQXNzZXJ0LmlzTm90TnVsbCh2aWV3ZXIsICJudWxsIHZpZXdlciBwYXNzZWQgdG8gSW1hZ2VFeHBvcnRlci5zYXZlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIEFzc2VydC5pc05vdE51bGwoc2F2ZUZpbGVQYXRoLCAibnVsbCBzYXZlRmlsZVBhdGggcGFzc2VkIHRvIEltYWdlRXhwb3J0ZXIuc2F2ZSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgIGlmIChmb3JtYXQgIT0gU1dULklNQUdFX0JNUCAmJiBmb3JtYXQgIT0gU1dULklNQUdFX0pQRUcgJiYgZm9ybWF0ICE9IFNXVC5JTUFHRV9JQ08pCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9GT1JNQVRfTk9UX1NVUFBPUlRFRCk7Ci0KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBzYXZlRWRpdG9yQ29udGVudHNBc0ltYWdlKGVkaXRvclBhcnQsIHZpZXdlciwgc2F2ZUZpbGVQYXRoLCBmb3JtYXQpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICAgIHsKLSAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZWRpdG9yUGFydC5nZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSwgTWVzc2FnZXMuX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9FUlJPUl9USVRMRSwgTWVzc2FnZXMuX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9FUlJPUl9ERVNDUklQVElPTik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2F2ZShJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBHcmFwaGljYWxWaWV3ZXIgdmlld2VyKQotICAgIHsKLSAgICAgIEFzc2VydC5pc05vdE51bGwoZWRpdG9yUGFydCwgIm51bGwgZWRpdG9yUGFydCBwYXNzZWQgdG8gSW1hZ2VFeHBvcnRlci5zYXZlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIEFzc2VydC5pc05vdE51bGwodmlld2VyLCAibnVsbCB2aWV3ZXIgcGFzc2VkIHRvIEltYWdlRXhwb3J0ZXIuc2F2ZSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgIFN0cmluZyBzYXZlRmlsZVBhdGggPSBnZXRTYXZlRmlsZVBhdGgoZWRpdG9yUGFydCwgdmlld2VyKTsKLSAgICAgIGlmIChzYXZlRmlsZVBhdGggPT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShzYXZlRmlsZVBhdGgpOwotICAgICAgaWYgKGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5pc0ZpbGUoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fT1ZFUldSSVRFX0NPTkZJUk1BVElPTl9RVUVTVElPTiwgTWVzc2FnZXMuX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9PVkVSV1JJVEVfQ09ORklSTUFUSU9OLnJlcGxhY2UoInswfSIsIHNhdmVGaWxlUGF0aCkpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaW50IGZvcm1hdCA9IFNXVC5JTUFHRV9KUEVHOwotICAgICAgaWYgKHNhdmVGaWxlUGF0aC5lbmRzV2l0aCgiLmJtcCIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIGZvcm1hdCA9IFNXVC5JTUFHRV9CTVA7Ci0gICAgICBlbHNlIGlmIChzYXZlRmlsZVBhdGguZW5kc1dpdGgoIi5pY28iKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICBmb3JtYXQgPSBTV1QuSU1BR0VfSUNPOwotICAgICAgZWxzZSBpZiAoc2F2ZUZpbGVQYXRoLmVuZHNXaXRoKCIucG5nIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZm9ybWF0ID0gU1dULklNQUdFX1BORzsKLSAgICAgIGVsc2UgaWYgKHNhdmVGaWxlUGF0aC5lbmRzV2l0aCgiLmdpZiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIGZvcm1hdCA9IFNXVC5JTUFHRV9HSUY7Ci0gICAgICBlbHNlIGlmIChzYXZlRmlsZVBhdGguZW5kc1dpdGgoIi50aWZmIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZm9ybWF0ID0gU1dULklNQUdFX1RJRkY7Ci0KLSAgICAgIHJldHVybiBzYXZlKGVkaXRvclBhcnQsIHZpZXdlciwgc2F2ZUZpbGVQYXRoLCBmb3JtYXQpOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U2F2ZUZpbGVQYXRoKElFZGl0b3JQYXJ0IGVkaXRvclBhcnQsIEdyYXBoaWNhbFZpZXdlciB2aWV3ZXIpCi0gICAgewotICAgICAgU3RyaW5nIGZpbGVQYXRoOwotCi0gICAgICBGaWxlRGlhbG9nIGZpbGVEaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhlZGl0b3JQYXJ0LmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLCBTV1QuU0FWRSk7Ci0KLSAgICAgIFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMgPSBuZXcgU3RyaW5nW10ge0ZJTEVfRk9STUFUU307IC8vJE5PTi1OTFMtMSQKLQotICAgICAgZmlsZURpYWxvZy5zZXRGaWxlTmFtZShvYnRhaW5OZXh0RmlsZU5hbWUoKSk7Ci0gICAgICBmaWxlRGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMoZmlsdGVyRXh0ZW5zaW9ucyk7Ci0gICAgICBmaWxlRGlhbG9nLnNldEZpbHRlck5hbWVzKG5ldyBTdHJpbmdbXSB7RklMRV9GT1JNQVRTfSk7Ci0gICAgICBmaWxlRGlhbG9nLnNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9GSUxFX1NBVkVfRElBTE9HX1RJVExFKTsKLSAgICAgIAotICAgICAgZmlsZVBhdGggPSBmaWxlRGlhbG9nLm9wZW4oKTsKLQotICAgICAgaWYgKGZpbGVQYXRoICE9IG51bGwpCi0gICAgICB7Ci0JICAgICAgTEFTVF9TQ1JFRU5fQ0FQVFVSRV9QQVRIID0gZmlsZURpYWxvZy5nZXRGaWx0ZXJQYXRoKCk7Ci0JICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZmlsZURpYWxvZy5nZXRGaWxlTmFtZSgpOwotCSAgICAgIGlmIChmaWxlTmFtZS5pbmRleE9mKCcuJykgPiAwKSB7Ci0JCSAgICAgIExBU1RfU0NSRUVOX0NBUFRVUkVfRklMRV9OQU1FID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGZpbGVOYW1lLmluZGV4T2YoJy4nKSk7Ci0JCSAgICAgIExBU1RfU0NSRUVOX0NBUFRVUkVfRklMRV9FWFRFTlNJT04gPSBmaWxlTmFtZS5zdWJzdHJpbmcoZmlsZU5hbWUuaW5kZXhPZignLicpKTsKLQkgICAgICB9Ci0JICAgICAgZWxzZQotCSAgICAgIHsKLQkJICAgICAgTEFTVF9TQ1JFRU5fQ0FQVFVSRV9GSUxFX05BTUUgPSBmaWxlTmFtZTsKLQkJICAgICAgTEFTVF9TQ1JFRU5fQ0FQVFVSRV9GSUxFX0VYVEVOU0lPTiA9ICIiOwotCSAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBmaWxlUGF0aDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2F2ZUVkaXRvckNvbnRlbnRzQXNJbWFnZShJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBHcmFwaGljYWxWaWV3ZXIgdmlld2VyLCBTdHJpbmcgc2F2ZUZpbGVQYXRoLCBpbnQgZm9ybWF0KQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiAxLiBGaXJzdCBnZXQgdGhlIGZpZ3VyZSB3aG9zZSB2aXN1YWxzIHdlIHdhbnQgdG8gc2F2ZSBhcyBpbWFnZS4gU28gd2UKLSAgICAgICAqIHdvdWxkIGxpa2UgdG8gc2F2ZSB0aGUgcm9vdGVkaXRwYXJ0IHdoaWNoIGFjdHVhbGx5IGhvc3RzIGFsbCB0aGUKLSAgICAgICAqIHByaW50YWJsZSBsYXllcnMuCi0gICAgICAgKiAKLSAgICAgICAqIE5PVEU6IFNjYWxhYmxlUm9vdEVkaXRQYXJ0IG1hbmFnZXMgbGF5ZXJzIGFuZCBpcyByZWdpc3RlcmVkCi0gICAgICAgKiBncmFwaGljYWx2aWV3ZXIncyBlZGl0cGFydHJlZ2lzdHJ5IHdpdGggdGhlIGtleSBMYXllck1hbmFnZXIuSUQgLi4uCi0gICAgICAgKiB3ZWxsIHRoYXQgaXMgYmVjYXVzZSBTY2FsYWJsZVJvb3RFZGl0UGFydCBtYW5hZ2VzIGFsbCBsYXllcnMgdGhhdCBhcmUKLSAgICAgICAqIGhvc3RlZCBvbiBhIEZpZ3VyZUNhbnZhcy4gTWFueSBsYXllcnMgZXhpc3QgZm9yIGRvaW5nIGRpZmZlcmVudCB0aGluZ3MKLSAgICAgICAqLwotICAgICAgU2NhbGFibGVSb290RWRpdFBhcnQgcm9vdEVkaXRQYXJ0ID0gKFNjYWxhYmxlUm9vdEVkaXRQYXJ0KSB2aWV3ZXIuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldChMYXllck1hbmFnZXIuSUQpOwotICAgICAgSUZpZ3VyZSByb290RmlndXJlID0gKChMYXllck1hbmFnZXIpIHJvb3RFZGl0UGFydCkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuUFJJTlRBQkxFX0xBWUVSUyk7Ly8gcm9vdEVkaXRQYXJ0LmdldEZpZ3VyZSgpOwotICAgICAgUmVjdGFuZ2xlIHJvb3RGaWd1cmVCb3VuZHMgPSBuZXcgUmVjdGFuZ2xlKG5ldyBQb2ludCgwLDApLHJvb3RGaWd1cmUuZ2V0UHJlZmVycmVkU2l6ZSgpKTsKLQotICAgICAgLyoKLSAgICAgICAqIDIuIE5vdyB3ZSB3YW50IHRvIGdldCB0aGUgR0MgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250cm9sIG9uIHdoaWNoIGFsbAotICAgICAgICogZmlndXJlcyBhcmUgcGFpbnRlZCBieSBTV1RHcmFwaGljcy4gRm9yIHRoYXQgZmlyc3QgZ2V0IHRoZSBTV1QgQ29udHJvbAotICAgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSB2aWV3ZXIgb24gd2hpY2ggdGhlIHJvb3RlZGl0cGFydCBpcyBzZXQgYXMgY29udGVudHMKLSAgICAgICAqLwotICAgICAgQ29udHJvbCBmaWd1cmVDYW52YXMgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotICAgICAgR0MgZmlndXJlQ2FudmFzR0MgPSBuZXcgR0MoZmlndXJlQ2FudmFzKTsKLQotICAgICAgLyoKLSAgICAgICAqIDMuIENyZWF0ZSBhIG5ldyBHcmFwaGljcyBmb3IgYW4gSW1hZ2Ugb250byB3aGljaCB3ZSB3YW50IHRvIHBhaW50Ci0gICAgICAgKiByb290RmlndXJlCi0gICAgICAgKi8KLSAgICAgIEltYWdlIGltZyA9IG5ldyBJbWFnZShudWxsLCByb290RmlndXJlQm91bmRzLndpZHRoLCByb290RmlndXJlQm91bmRzLmhlaWdodCk7Ci0gICAgICBHQyBpbWFnZUdDID0gbmV3IEdDKGltZyk7Ci0gICAgICBpbWFnZUdDLnNldEJhY2tncm91bmQoZmlndXJlQ2FudmFzR0MuZ2V0QmFja2dyb3VuZCgpKTsKLSAgICAgIGltYWdlR0Muc2V0Rm9yZWdyb3VuZChmaWd1cmVDYW52YXNHQy5nZXRGb3JlZ3JvdW5kKCkpOwotICAgICAgaW1hZ2VHQy5zZXRGb250KGZpZ3VyZUNhbnZhc0dDLmdldEZvbnQoKSk7Ci0gICAgICBpbWFnZUdDLnNldExpbmVTdHlsZShmaWd1cmVDYW52YXNHQy5nZXRMaW5lU3R5bGUoKSk7Ci0gICAgICBpbWFnZUdDLnNldExpbmVXaWR0aChmaWd1cmVDYW52YXNHQy5nZXRMaW5lV2lkdGgoKSk7Ci0gICAgICBpbWFnZUdDLnNldFhPUk1vZGUoZmlndXJlQ2FudmFzR0MuZ2V0WE9STW9kZSgpKTsKLSAgICAgIEdyYXBoaWNzIGltZ0dyYXBoaWNzID0gbmV3IFNXVEdyYXBoaWNzKGltYWdlR0MpOwotCi0gICAgICAvKiA0LiBEcmF3IHJvb3RGaWd1cmUgb250byBpbWFnZS4gQWZ0ZXIgdGhhdCBpbWFnZSB3aWxsIGJlIHJlYWR5IGZvciBzYXZlICovCi0gICAgICByb290RmlndXJlLnBhaW50KGltZ0dyYXBoaWNzKTsKLQotICAgICAgLyogNS4gU2F2ZSBpbWFnZSAqLwotICAgICAgSW1hZ2VEYXRhW10gaW1nRGF0YSA9IG5ldyBJbWFnZURhdGFbMV07Ci0gICAgICBpbWdEYXRhWzBdID0gaW1nLmdldEltYWdlRGF0YSgpOwotCi0gICAgICBJbWFnZUxvYWRlciBpbWdMb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoKTsKLSAgICAgIGltZ0xvYWRlci5kYXRhID0gaW1nRGF0YTsKLSAgICAgIGltZ0xvYWRlci5zYXZlKHNhdmVGaWxlUGF0aCwgZm9ybWF0KTsKLQotICAgICAgLyogcmVsZWFzZSBPUyByZXNvdXJjZXMgKi8KLSAgICAgIGZpZ3VyZUNhbnZhc0dDLmRpc3Bvc2UoKTsKLSAgICAgIGltYWdlR0MuZGlzcG9zZSgpOwotICAgICAgaW1nLmRpc3Bvc2UoKTsKLQotICAgIH0KLQotICAgIFN0cmluZyBvYnRhaW5OZXh0RmlsZU5hbWUoKQotICAgIHsKLQotICAgICAgaW50IGF1eCA9IExBU1RfU0NSRUVOX0NBUFRVUkVfRklMRV9OQU1FLmxlbmd0aCgpIC0gMTsKLSAgICAgIHdoaWxlIChDaGFyYWN0ZXIuaXNEaWdpdChMQVNUX1NDUkVFTl9DQVBUVVJFX0ZJTEVfTkFNRS5jaGFyQXQoYXV4KSkpCi0gICAgICB7Ci0gICAgICAgIGF1eC0tOwotICAgICAgfQotCi0gICAgICBTdHJpbmcgbm9uTnVtZXJhdGVkZmlsZU5hbWUgPSBMQVNUX1NDUkVFTl9DQVBUVVJFX0ZJTEVfTkFNRS5zdWJzdHJpbmcoMCwgYXV4ICsgMSk7Ci0gICAgICBTdHJpbmcgZmlsZVBhdGggPSBMQVNUX1NDUkVFTl9DQVBUVVJFX1BBVEggKyBTeXN0ZW0uZ2V0UHJvcGVydHkoRklMRV9TRVBBUkFUT1IpICsgbm9uTnVtZXJhdGVkZmlsZU5hbWUgKyBMQVNUX1NDUkVFTl9DQVBUVVJFX0ZJTEVfRVhURU5TSU9OOyAvLyROT04tTkxTLTEkCi0KLSAgICAgIGludCBjb3VudGVyID0gMTsKLSAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVQYXRoKTsKLSAgICAgIHdoaWxlIChmaWxlLmV4aXN0cygpKQotICAgICAgewotICAgICAgICBmaWxlUGF0aCA9IExBU1RfU0NSRUVOX0NBUFRVUkVfUEFUSCArIFN5c3RlbS5nZXRQcm9wZXJ0eShGSUxFX1NFUEFSQVRPUikgKyBub25OdW1lcmF0ZWRmaWxlTmFtZSArIGNvdW50ZXIrKyArIExBU1RfU0NSRUVOX0NBUFRVUkVfRklMRV9FWFRFTlNJT047IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZmlsZSA9IG5ldyBGaWxlKGZpbGVQYXRoKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGZpbGVQYXRoOwotICAgIH0KLQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0RlbGV0ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9EZWxldGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY3YzhjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL0RlbGV0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklDb21wbGV4VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRGVsZXRlQWN0aW9uIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkFjdGlvbgotewotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5EZWxldGVBY3Rpb24iOyAgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgRGVsZXRlQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fREVMRVRFKTsKLSAgICBzZXRJZChJRCk7Ci0gICAgc2V0SW1hZ2VEZXNjcmlwdG9yKFhTREVkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL2RlbGV0ZV9vYmouZ2lmIikgKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgT2JqZWN0IHNlbGVjdGlvbiA9IGkubmV4dCgpOwotICAgICAgQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLSAgICAgIGJvb2xlYW4gZG9SZXNlbGVjdCA9IGZhbHNlOwotICAgICAgSU1vZGVsIG1vZGVsID0gbnVsbDsKLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJQ29tcGxleFR5cGUpCi0gICAgICB7Ci0gICAgICAgIGNvbW1hbmQgPSAoKElDb21wbGV4VHlwZSlzZWxlY3Rpb24pLmdldERlbGV0ZUNvbW1hbmQoKTsKLSAgICAgICAgbW9kZWwgPSAoKElDb21wbGV4VHlwZSlzZWxlY3Rpb24pLmdldE1vZGVsKCk7Ci0gICAgICAgIGRvUmVzZWxlY3QgPSAhKChJQ29tcGxleFR5cGUpc2VsZWN0aW9uKS5pc0Fub255bW91cygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSUZpZWxkKQotICAgICAgewotICAgICAgICBtb2RlbCA9ICgoSUZpZWxkKXNlbGVjdGlvbikuZ2V0TW9kZWwoKTsKLSAgICAgICAgaWYgKCAoKElGaWVsZClzZWxlY3Rpb24pLmlzR2xvYmFsKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBkb1Jlc2VsZWN0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBjb21tYW5kID0gKChJRmllbGQpc2VsZWN0aW9uKS5nZXREZWxldGVDb21tYW5kKCk7Ci0gICAgICB9ICAKLSAgICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmUpCi0gICAgICB7Ci0gICAgICAgIC8vIEZhbGxiYWNrIGZvciBtb2RlbCBncm91cHMgYW5kIGF0dHJpYnV0ZSBncm91cHMuCi0gICAgICAgIElTdHJ1Y3R1cmUgc3RydWN0dXJlID0gKElTdHJ1Y3R1cmUpc2VsZWN0aW9uOyAKLSAgICAgICAgbW9kZWwgPSBzdHJ1Y3R1cmUuZ2V0TW9kZWwoKTsKLSAgICAgICAgY29tbWFuZCA9IHN0cnVjdHVyZS5nZXREZWxldGVDb21tYW5kKCk7Ci0gICAgICAgIGRvUmVzZWxlY3QgPSB0cnVlOwotICAgICAgfSAgCi0KLSAgICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgaWYgKHdvcmtiZW5jaCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsICYmIHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICAgIGlmIChlZGl0b3JQYXJ0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE9iamVjdCB2aWV3ZXIgPSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoR3JhcGhpY2FsVmlld2VyLmNsYXNzKTsKLSAgICAgICAgICAgICAgaWYgKHZpZXdlciBpbnN0YW5jZW9mIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIpCi0gICAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgT2JqZWN0IGlucHV0ID0gKChEZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyKXZpZXdlcikuZ2V0SW5wdXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXQgIT0gc2VsZWN0aW9uKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8vIEJ1ZyA4NjIxOCA6IERvbid0IHN3aXRjaCB0byB0b3AgbGV2ZWwgdmlldyBpZiB0aGUgb2JqZWN0IHdlJ3JlIGRlbGV0aW5nCi0gICAgICAgICAgICAgICAgICAvLyBpcyBub3QgdGhlIGlucHV0IHRvIHRoZSB2aWV3ZXIKLSAgICAgICAgICAgICAgICAgIGRvUmVzZWxlY3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgIGlmIChtb2RlbCAhPSBudWxsICYmIGRvUmVzZWxlY3QpCi0gICAgICAgICAgcHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG1vZGVsKSk7Ci0gICAgICB9ICAKLSAgICB9Ci0gICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvU2V0SW5wdXRUb0dyYXBoVmlldy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9TZXRJbnB1dFRvR3JhcGhWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZjkzMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvYWN0aW9ucy9TZXRJbnB1dFRvR3JhcGhWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkRlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5Sb290Q29udGVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLQotcHVibGljIGNsYXNzIFNldElucHV0VG9HcmFwaFZpZXcgZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIlNldEFzRm9jdXMiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0OwotICBwcm90ZWN0ZWQgT2JqZWN0IGlucHV0OwotCi0gIHB1YmxpYyBTZXRJbnB1dFRvR3JhcGhWaWV3KElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICB0aGlzKHBhcnQsIG51bGwpOwotICB9Ci0gIAotICBwdWJsaWMgU2V0SW5wdXRUb0dyYXBoVmlldyhJV29ya2JlbmNoUGFydCBwYXJ0LCBPYmplY3QgaW5wdXQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICB0aGlzLmlucHV0ID0gaW5wdXQ7Ci0gICAgc2V0SWQoSUQpOwotICAgIHNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfQVNfRk9DVVMpOwotICAgIGlmIChwYXJ0IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpCi0gICAgewotICAgICAgZWRpdG9yUGFydCA9IChJRWRpdG9yUGFydClwYXJ0OwotICAgIH0gICAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsgICAgCi0gICAgT2JqZWN0IHNlbGVjdGlvbiA9IGlucHV0OyAgIAotICAgIGlmIChzZWxlY3Rpb24gPT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICB9ICAKLSAgICBPYmplY3QgYWRhcHRlciA9IGdldFdvcmtiZW5jaFBhcnQoKS5nZXRBZGFwdGVyKEdyYXBoaWNhbFZpZXdlci5jbGFzcyk7Ci0KLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSUFEVE9iamVjdCkKLSAgICB7Ci0gICAgICBJQURUT2JqZWN0IG9iaiA9IChJQURUT2JqZWN0KSBzZWxlY3Rpb247Ci0gICAgICBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIpCi0gICAgICB7Ci0gICAgICAgIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyID0gKERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIpIGFkYXB0ZXI7ICAKLSAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBncmFwaGljYWxWaWV3ZXIuZ2V0SW5wdXRFZGl0UGFydCgpOwotICAgICAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBSb290Q29udGVudEVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgZ3JhcGhpY2FsVmlld2VyLnNldElucHV0QW5kTWFya0xvY2F0aW9uKG9iaik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9hY3Rpb25zL1Nob3dQcm9wZXJ0aWVzVmlld0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2QyMzJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2FjdGlvbnMvU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi0KLS8qKgotICogU2hvdyB0aGUgcHJvcGVydGllcyB2aWV3IGluIHRoZSBjdXJyZW50IHBlcnNwZWN0aXZlLgotICovCi1wdWJsaWMgY2xhc3MgU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkFjdGlvbgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfVklFV19JRCA9ICJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0IjsgLy8kTk9OLU5MUy0xJAotCQotICBwcm90ZWN0ZWQgc3RhdGljIEltYWdlRGVzY3JpcHRvciBlbmFibGVkSW1hZ2UsIGRpc2FibGVkSW1hZ2U7Ci0KLQlwdWJsaWMgU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLQkJc3VwZXIocGFydCk7Ci0JCXNldElkKElEKTsKLQkJc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX1NIT1dfUFJPUEVSVElFUyk7Ci0JCXNldFRvb2xUaXBUZXh0KGdldFRleHQoKSk7Ci0gICAgc2V0SW1hZ2VEZXNjcmlwdG9yKFhTREVkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL2VsY2wxNi9zaG93cHJvcGVydGllc19vYmouZ2lmIikgKTsgLy8kTk9OLU5MUy0xJAotCSAgc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoWFNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvZGxjbDE2L3Nob3dwcm9wZXJ0aWVzX29iai5naWYiKSApOyAvLyROT04tTkxTLTEkCi0JfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGdldFdvcmtiZW5jaFBhcnQoKS5nZXRTaXRlKCkuZ2V0UGFnZSgpLnNob3dWaWV3KFBST1BFUlRJRVNfVklFV19JRCk7Ci0gICAgfQotICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpCi0gICAgewotCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vQURURmxvYXRpbmdUb29sYmFyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vQURURmxvYXRpbmdUb29sYmFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MGJjMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0FEVEZsb2F0aW5nVG9vbGJhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuR3JhcGhpY2FsVmlld2VySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkFEVEZsb2F0aW5nVG9vbGJhckVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBBRFRGbG9hdGluZ1Rvb2xiYXIgZXh0ZW5kcyBHcmFwaGljYWxWaWV3ZXJJbXBsCi17Ci0gIHByb3RlY3RlZCBJTW9kZWwgbW9kZWw7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzRHJpbGxlZERvd247Ci0gIHByb3RlY3RlZCBBRFRGbG9hdGluZ1Rvb2xiYXJFZGl0UGFydCBlZGl0UGFydDsKLQotICBwdWJsaWMgQURURmxvYXRpbmdUb29sYmFyKElNb2RlbCBtb2RlbCkKLSAgewotICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1vZGVsKElNb2RlbCBtb2RlbCkKLSAgewotICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICBlZGl0UGFydCA9IChBRFRGbG9hdGluZ1Rvb2xiYXJFZGl0UGFydClnZXRFZGl0UGFydEZhY3RvcnkoKS5jcmVhdGVFZGl0UGFydChudWxsLCBuZXcgQURURmxvYXRpbmdUb29sYmFyTW9kZWwobW9kZWwpKTsKLSAgICBpZiAoZWRpdFBhcnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlZGl0UGFydCA9IG5ldyBBRFRGbG9hdGluZ1Rvb2xiYXJFZGl0UGFydChtb2RlbCk7Ci0gICAgfQotICAgIGVkaXRQYXJ0LnNldE1vZGVsKG1vZGVsKTsKLSAgICBzZXRDb250ZW50cyhlZGl0UGFydCk7Ci0gIH0KLQotICBwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpCi0gIHsKLSAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBjYW52YXMuc2V0QmFja2dyb3VuZChDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0gICAgc2V0Q29udHJvbChjYW52YXMpOwotICAgIHJldHVybiBnZXRDb250cm9sKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKGJvb2xlYW4gaXNEcmlsbGVkRG93bikKLSAgewotICAgIHRoaXMuaXNEcmlsbGVkRG93biA9IGlzRHJpbGxlZERvd247Ci0gICAgZWRpdFBhcnQuc2V0SXNEcmlsbGVkRG93bihpc0RyaWxsZWREb3duKTsKLSAgICBnZXRDb250ZW50cygpLnJlZnJlc2goKTsKLSAgfQotICAKLSAgcHVibGljIGNsYXNzIEFEVEZsb2F0aW5nVG9vbGJhck1vZGVsCi0gIHsKLSAgICBJTW9kZWwgbW9kZWw7Ci0gICAgcHVibGljIEFEVEZsb2F0aW5nVG9vbGJhck1vZGVsKElNb2RlbCBtb2RlbCkKLSAgICB7Ci0gICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJTW9kZWwgZ2V0TW9kZWwoKQotICAgIHsKLSAgICAgIHJldHVybiBtb2RlbDsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9CYXNlR3JhcGhpY2FsVmlld2VyS2V5SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0Jhc2VHcmFwaGljYWxWaWV3ZXJLZXlIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYzRlODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0Jhc2VHcmFwaGljYWxWaWV3ZXJLZXlIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVDYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuR3JhcGhpY2FsVmlld2VyS2V5SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5LZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuT3BlbkluTmV3RWRpdG9yOwotCi0vKioKLSAqIFRoaXMga2V5IGhhbmRsZXIgaXMgZGVzaWduZWQgdG8gYmUgcmUtdXNlZCBieSBib3RoIHRoZSBXU0RMIGFuZCBYU0QgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlR3JhcGhpY2FsVmlld2VyS2V5SGFuZGxlciBleHRlbmRzIEdyYXBoaWNhbFZpZXdlcktleUhhbmRsZXIKLXsKLSAgcHVibGljIEJhc2VHcmFwaGljYWxWaWV3ZXJLZXlIYW5kbGVyKEdyYXBoaWNhbFZpZXdlciB2aWV3ZXIpCi0gIHsKLSAgICBzdXBlcih2aWV3ZXIpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4ga2V5UHJlc3NlZChLZXlFdmVudCBldmVudCkKLSAgewotICAgIGludCBkaXJlY3Rpb24gPSAtMTsKLSAgICBib29sZWFuIGlzQWx0RG93biA9IChldmVudC5zdGF0ZU1hc2sgJiBTV1QuQUxUKSAhPSAwOwotICAgIGJvb2xlYW4gaXNDdHJsRG93biA9IChldmVudC5zdGF0ZU1hc2sgJiBTV1QuQ1RSTCkgIT0gMDsKLSAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpCi0gICAgewotICAgICAgY2FzZSBTV1QuQVJST1dfTEVGVCA6IHsKLSAgICAgICAgZGlyZWN0aW9uID0gUG9zaXRpb25Db25zdGFudHMuV0VTVDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFNXVC5BUlJPV19SSUdIVCA6IHsKLSAgICAgICAgZGlyZWN0aW9uID0gUG9zaXRpb25Db25zdGFudHMuRUFTVDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFNXVC5BUlJPV19VUCA6IHsKLSAgICAgICAgZGlyZWN0aW9uID0gaXNBbHREb3duID8gS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeS5PVVRfVE9fUEFSRU5UIDogUG9zaXRpb25Db25zdGFudHMuTk9SVEg7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBTV1QuQVJST1dfRE9XTiA6IHsKLSAgICAJIGRpcmVjdGlvbiA9IGlzQWx0RG93biA/IEtleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuSU5fVE9fRklSU1RfQ0hJTEQgOiBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSDsgICAgICAgCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoZGlyZWN0aW9uICE9IC0xKQotICAgIHsKLSAgICAgIEdyYXBoaWNhbEVkaXRQYXJ0IGZvY3VzRWRpdFBhcnQgPSBnZXRGb2N1c0VkaXRQYXJ0KCk7Ci0gICAgICBLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5IHBvbGljeSA9IChLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5KWZvY3VzRWRpdFBhcnQuZ2V0RWRpdFBvbGljeShLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5LktFWSk7Ci0gICAgICAKLSAgICAgIGlmIChwb2xpY3kgIT0gbnVsbCkgICAgICAgICAgCi0gICAgICB7Ci0gICAgICAgIEVkaXRQYXJ0IHRhcmdldCA9IHBvbGljeS5nZXRSZWxhdGl2ZUVkaXRQYXJ0KGZvY3VzRWRpdFBhcnQsIGRpcmVjdGlvbik7Ci0gICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAJaWYoaXNDdHJsRG93bikgewotCi0gICAgICAgIAkJSUVkaXRvclBhcnQgZWRpdG9yID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgIAkJCSBPYmplY3Qga2V5Ym9hcmREcmFnID0gZWRpdG9yLmdldEFkYXB0ZXIoSUtleWJvYXJkRHJhZy5jbGFzcyk7Ci0gICAgICAgIAkJCSBpZiAoa2V5Ym9hcmREcmFnIGluc3RhbmNlb2YgSUtleWJvYXJkRHJhZykgewotICAgICAgICAJCQkJICgoSUtleWJvYXJkRHJhZykga2V5Ym9hcmREcmFnKS5wZXJmb3JtS2V5Ym9hcmREcmFnKGZvY3VzRWRpdFBhcnQsIGRpcmVjdGlvbik7Ci0gICAgICAgIAkJCQkgcmV0dXJuIHRydWU7Ci0gICAgICAgIAkJIH0KLSAgICAgICAgCX0KLSAgICAgICAgCWVsc2UgewotICAgICAgICAgICAgICAgIG5hdmlnYXRlVG8odGFyZ2V0LCBldmVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0gICAgICAgICAgCi0gICAgICB9ICAgICAgICAgCi0gICAgfQotICAgIAotICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkKLSAgICB7Ci0gICAgICBjYXNlIFNXVC5QQUdFX0RPV04gOgotICAgICAgeyAgCi0gICAgICAgIGlmIChzY3JvbGxQYWdlKGV2ZW50LCBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCkpCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9ICAKLSAgICAgIGNhc2UgU1dULlBBR0VfVVAgOgotICAgICAgeyAgCi0gICAgICAgIGlmIChzY3JvbGxQYWdlKGV2ZW50LCBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCkpCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBjYXNlIFNXVC5GMyA6Ci0gICAgICBjYXNlIFNXVC5DUiA6Ci0gICAgICB7Ci0gICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICBBY3Rpb25SZWdpc3RyeSByZWdpc3RyeSA9IChBY3Rpb25SZWdpc3RyeSkgZWRpdG9yUGFydC5nZXRBZGFwdGVyKEFjdGlvblJlZ2lzdHJ5LmNsYXNzKTsKLSAgICAgICAgaWYgKHJlZ2lzdHJ5ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJQWN0aW9uIGFjdGlvbiA9IHJlZ2lzdHJ5LmdldEFjdGlvbihPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8qCi0gICAgICBjYXNlIFNXVC5GNSA6Ci0gICAgICB7Ci0gICAgICAgIElFZGl0b3JQYXJ0IHBhcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgaWYgKHBhcnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEVkaXRvck1vZGVNYW5hZ2VyIG1hbmFnZXIgPSAoRWRpdG9yTW9kZU1hbmFnZXIpcGFydC5nZXRBZGFwdGVyKEVkaXRvck1vZGVNYW5hZ2VyLmNsYXNzKTsKLSAgICAgICAgICBFZGl0b3JNb2RlW10gbW9kZXMgPSBtYW5hZ2VyLmdldE1vZGVzKCk7Ci0gICAgICAgICAgRWRpdG9yTW9kZSBtb2RlID0gbWFuYWdlci5nZXRDdXJyZW50TW9kZSgpOwotICAgICAgICAgIExpc3QgbGlzdCA9IEFycmF5cy5hc0xpc3QobW9kZXMpOwotICAgICAgICAgIGludCBpbmRleCA9IGxpc3QuaW5kZXhPZihtb2RlKTsKLSAgICAgICAgICBpbnQgbmV4dEluZGV4ID0gaW5kZXggKyAxOwotICAgICAgICAgIGlmIChuZXh0SW5kZXggPCBtb2Rlcy5sZW5ndGgpCi0gICAgICAgICAgewotICAgICAgICAgICAgbW9kZSA9IChFZGl0b3JNb2RlKWxpc3QuZ2V0KG5leHRJbmRleCk7Ci0gICAgICAgICAgfSAgCi0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1vZGUgPSAoRWRpdG9yTW9kZSlsaXN0LmdldCgwKTsgICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKG1vZGUgIT0gbWFuYWdlci5nZXRDdXJyZW50TW9kZSgpKQotICAgICAgICAgIHsgIAotICAgICAgICAgICAgbWFuYWdlci5zZXRDdXJyZW50TW9kZShtb2RlKTsKLSAgICAgICAgICB9ICAKLSAgICAgICAgfSAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfSovICAgICAgCi0gICAgfQotICAgIHJldHVybiBzdXBlci5rZXlQcmVzc2VkKGV2ZW50KTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBzY3JvbGxQYWdlKEtleUV2ZW50IGV2ZW50LCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgaWYgKCEoZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpIGluc3RhbmNlb2YgRmlndXJlQ2FudmFzKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBGaWd1cmVDYW52YXMgZmlnQ2FudmFzID0gKEZpZ3VyZUNhbnZhcykgZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpOwotICAgIFBvaW50IGxvYyA9IGZpZ0NhbnZhcy5nZXRWaWV3cG9ydCgpLmdldFZpZXdMb2NhdGlvbigpOwotICAgIFJlY3RhbmdsZSBhcmVhID0gZmlnQ2FudmFzLmdldFZpZXdwb3J0KCkuZ2V0Q2xpZW50QXJlYShSZWN0YW5nbGUuU0lOR0xFVE9OKS5zY2FsZSguOCk7Ci0gICAgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCkKLSAgICB7Ci0gICAgICBmaWdDYW52YXMuc2Nyb2xsVG9ZKGxvYy55IC0gYXJlYS5oZWlnaHQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZmlnQ2FudmFzLnNjcm9sbFRvWShsb2MueSArIGFyZWEuaGVpZ2h0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vRGVzaWduVmlld0NvbnRleHRNZW51UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9EZXNpZ25WaWV3Q29udGV4dE1lbnVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWIwNDMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9EZXNpZ25WaWV3Q29udGV4dE1lbnVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkNvbnRleHRNZW51UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLkNvbnRleHRNZW51UGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLkVkaXRvck1vZGVNYW5hZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBEZXNpZ25WaWV3Q29udGV4dE1lbnVQcm92aWRlciBleHRlbmRzIENvbnRleHRNZW51UHJvdmlkZXIKLXsKLSAgSUVkaXRvclBhcnQgZWRpdG9yOyAgCi0gIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEdyYXBoQ29udGV4dE1lbnVQcm92aWRlci4KLSAgICogCi0gICAqIEBwYXJhbSBzZWxlY3Rpb25Qcm92aWRlcgotICAgKiBAcGFyYW0gZWRpdG9yCi0gICAqLwotICBwdWJsaWMgRGVzaWduVmlld0NvbnRleHRNZW51UHJvdmlkZXIoSUVkaXRvclBhcnQgZWRpdG9yLCBFZGl0UGFydFZpZXdlciB2aWV3ZXIsIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikKLSAgewotICAgIHN1cGVyKHZpZXdlcik7Ci0gICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7Ci0gICAgdGhpcy5zZWxlY3Rpb25Qcm92aWRlciA9IHNlbGVjdGlvblByb3ZpZGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkNvbnRleHRNZW51UHJvdmlkZXIjYnVpbGRDb250ZXh0TWVudShvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyLAotICAgKiAgICAgIG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGJ1aWxkQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpCi0gIHsKLSAgICBJTWVudU1hbmFnZXIgY3VycmVudE1lbnUgPSBtZW51OwotICAgIAotICAgIEVkaXRvck1vZGVNYW5hZ2VyIG1hbmFnZXIgPSAoRWRpdG9yTW9kZU1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoRWRpdG9yTW9kZU1hbmFnZXIuY2xhc3MpOwotICAgIENvbnRleHRNZW51UGFydGljaXBhbnQgY29udGV4dE1lbnVQYXJ0aWNpcGFudCA9IG1hbmFnZXIgIT0gbnVsbCA/IG1hbmFnZXIuZ2V0Q3VycmVudE1vZGUoKS5nZXRDb250ZXh0TWVudVBhcnRpY2lwYW50KCkgOiBudWxsOwotICAgIAotICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLSAgICBBY3Rpb25SZWdpc3RyeSByZWdpc3RyeSA9IGdldEVkaXRvckFjdGlvblJlZ2lzdHJ5KCk7Ci0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgCi0gICAgICAvLyBDb252ZXJ0IGVkaXRwYXJ0cyB0byBtb2RlbCBvYmplY3RzIGFzIHNlbGVjdGlvbnMgCi0gICAgICBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0ZWRPYmplY3QgPSAoKEVkaXRQYXJ0KXNlbGVjdGVkT2JqZWN0KS5nZXRNb2RlbCgpOwotICAgICAgfQotCi0gICAgICBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJQWN0aW9uUHJvdmlkZXIpCi0gICAgICB7Ci0gICAgICAgIElBY3Rpb25Qcm92aWRlciBhY3Rpb25Qcm92aWRlciA9IChJQWN0aW9uUHJvdmlkZXIpIHNlbGVjdGVkT2JqZWN0OwotCi0gICAgICAgIFN0cmluZ1tdIGFjdGlvbnMgPSBhY3Rpb25Qcm92aWRlci5nZXRBY3Rpb25zKG51bGwpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjdGlvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgaWQgPSBhY3Rpb25zW2ldOwotICAgICAgICAgIGlmIChjb250ZXh0TWVudVBhcnRpY2lwYW50ID09IG51bGwgfHwgY29udGV4dE1lbnVQYXJ0aWNpcGFudC5pc0FwcGxpY2FibGUoc2VsZWN0ZWRPYmplY3QsIGlkKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaWQuc3RhcnRzV2l0aChCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfU1RBUlRfSUQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGlkLnN1YnN0cmluZyhCYXNlU2VsZWN0aW9uQWN0aW9uLlNVQk1FTlVfU1RBUlRfSUQubGVuZ3RoKCkpOwotICAgICAgICAgICAgICBJTWVudU1hbmFnZXIgc3ViTWVudSA9IG5ldyBNZW51TWFuYWdlcih0ZXh0KTsKLSAgICAgICAgICAgICAgY3VycmVudE1lbnUuYWRkKHN1Yk1lbnUpOwotICAgICAgICAgICAgICBjdXJyZW50TWVudSA9IHN1Yk1lbnU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChpZC5zdGFydHNXaXRoKEJhc2VTZWxlY3Rpb25BY3Rpb24uU1VCTUVOVV9FTkRfSUQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjdXJyZW50TWVudSA9IGdldFBhcmVudE1lbnUobWVudSwgY3VycmVudE1lbnUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoaWQuZXF1YWxzKEJhc2VTZWxlY3Rpb25BY3Rpb24uU0VQQVJBVE9SX0lEKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY3VycmVudE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIElBY3Rpb24gYWN0aW9uID0gcmVnaXN0cnkuZ2V0QWN0aW9uKGlkKTsKLSAgICAgICAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgICB7IAotICAgICAgICAgICAgICAgIGFjdGlvbi5pc0VuYWJsZWQoKTsKLSAgICAgICAgICAgICAgICBjdXJyZW50TWVudS5hZGQoYWN0aW9uKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOyAgICAgICAKLSAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigicmVmYWN0b3Jpbmctc2xvdCIpKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsgICAgICAgCi0gICAgICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoInNlYXJjaC1zbG90IikpOyAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgfQotICAgIH0gICAgCi0gICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAvL21lbnUuYWRkKHJlZ2lzdHJ5LmdldEFjdGlvbigib3JnLmVjbGlwc2Uud3N0LnhzZC5EZWxldGVBY3Rpb24iKSk7Ci0gICAgLy9tZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgIC8vU2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uIHNob3dQcm9wZXJ0aWVzQWN0aW9uID0gKFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbikgcmVnaXN0cnkuZ2V0QWN0aW9uKFNob3dQcm9wZXJ0aWVzVmlld0FjdGlvbi5BQ1RJT05fSUQpOwotICAgIC8vc2hvd1Byb3BlcnRpZXNBY3Rpb24uc2V0UGFnZShQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKSk7Ci0gICAgLy9tZW51LmFkZChzaG93UHJvcGVydGllc0FjdGlvbik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGdldFBhcmVudE1lbnUoSU1lbnVNYW5hZ2VyIHJvb3QsIElNZW51TWFuYWdlciBjaGlsZCkgewotICAgIElNZW51TWFuYWdlciBwYXJlbnQgPSBudWxsOwotICAgIAotICAgIElDb250cmlidXRpb25JdGVtW10ga2lkcyA9IHJvb3QuZ2V0SXRlbXMoKTsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIHdoaWxlIChpbmRleCA8IGtpZHMubGVuZ3RoICYmIHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICBJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0ga2lkc1tpbmRleF07Ci0gICAgICBpZiAoaXRlbS5lcXVhbHMoY2hpbGQpKSB7Ci0gICAgICAgIHBhcmVudCA9IHJvb3Q7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBJTWVudU1hbmFnZXIpIHsKLSAgICAgICAgICBwYXJlbnQgPSBnZXRQYXJlbnRNZW51KChJTWVudU1hbmFnZXIpIGl0ZW0sIGNoaWxkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaW5kZXgrKzsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHBhcmVudDsKLSAgfQotCi0gIHByb3RlY3RlZCBBY3Rpb25SZWdpc3RyeSBnZXRFZGl0b3JBY3Rpb25SZWdpc3RyeSgpCi0gIHsKLSAgICByZXR1cm4gKEFjdGlvblJlZ2lzdHJ5KSBlZGl0b3IuZ2V0QWRhcHRlcihBY3Rpb25SZWdpc3RyeS5jbGFzcyk7Ci0gIH0KLSAgcHJvdGVjdGVkIENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2s7Ci0KLSAgcHJvdGVjdGVkIENvbW1hbmRTdGFjayBnZXRDb21tYW5kU3RhY2soKQotICB7Ci0gICAgaWYgKGNvbW1hbmRTdGFjayA9PSBudWxsKQotICAgICAgY29tbWFuZFN0YWNrID0gZ2V0Vmlld2VyKCkuZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpOwotICAgIHJldHVybiBjb21tYW5kU3RhY2s7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9EZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjlhNWQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9EZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLklIb2xkZXJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLlJvb3RDb250ZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5TdHJ1Y3R1cmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLklHcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5JTW9kZWxQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuQ29tbW9uU2VsZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5BRFRDb250ZW50T3V0bGluZVBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBEZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyIGV4dGVuZHMgU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgQURUU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIgPSBuZXcgQURUU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCk7Ci0gIHByb3RlY3RlZCBJbnB1dENoYW5nZU1hbmFnZXIgaW5wdXRDaGFuZ2VNYW5hZ2VyID0gbmV3IElucHV0Q2hhbmdlTWFuYWdlcigpOwotICBwcml2YXRlIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0KLSAgcHVibGljIERlc2lnblZpZXdHcmFwaGljYWxWaWV3ZXIoSUVkaXRvclBhcnQgZWRpdG9yLCBDb21tb25TZWxlY3Rpb25NYW5hZ2VyIG1hbmFnZXIpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMuZWRpdG9yUGFydCA9IGVkaXRvcjsKLSAgICBzZXRDb250ZXh0TWVudShuZXcgRGVzaWduVmlld0NvbnRleHRNZW51UHJvdmlkZXIoZWRpdG9yLCB0aGlzLCB0aGlzKSk7Ci0gICAgZWRpdG9yLmdldEVkaXRvclNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KCJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnBvcHVwLmdyYXBoIiwgZ2V0Q29udGV4dE1lbnUoKSwgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlciwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLy8gbWFrZSB0aGUgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlciBsaXN0ZW4gdG8gZ3JhcGggdmlldyBzZWxlY3Rpb24gY2hhbmdlcwotICAgIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihpbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyKTsgICAgCi0gICAgaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobWFuYWdlcik7Ci0gICAgbWFuYWdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7ICAKLSAgICAKLSAgICBzZXRLZXlIYW5kbGVyKG5ldyBCYXNlR3JhcGhpY2FsVmlld2VyS2V5SGFuZGxlcih0aGlzKSk7ICAgIAotICB9Ci0gIAotICAKLSAgLy8gdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gc29tZXRoaW5nIGNoYW5nZXMgaW4gdGhlIHNlbGVjdGlvbiBtYW5hZ2VyCi0gIC8vIChlLmcuIGEgc2VsZWN0aW9uIG9jY3VyZWQgZnJvbSBhbm90aGVyIHZpZXcpCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICB7Ci0gICAgT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgCi0gICAgLy8gVE9ETyAoY3MpIEl0IHNlZW1zIGxpa2UgdGhlcmUncyB3YXkgbW9yZSBzZWxlY3Rpb24gZ29pbmcgb24gdGhhbiB0aGVyZQotICAgIC8vIHNob3VsZAotICAgIC8vIGJlISEgVGhlcmUncyBhdCBsZWFzdCAyIHNlbGVjdGlvbnMgZ2V0dGluZyBmaXJlZCB3aGVuIHNvbWV0aGluZyBpcwotICAgIC8vIHNlbGVjdGVkIGluIHRoZQotICAgIC8vIG91dGxpbmUgdmlldy4gQXJlIHdlIGxpc3RlbmluZyB0byB0b28gbWFueSB0aGluZ3M/Ci0gICAgLy8KLSAgICAvLyBpZiAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBBRFRDb250ZW50T3V0bGluZVBhZ2UpCi0gICAgaWYgKGV2ZW50LmdldFNvdXJjZSgpICE9IGludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIpCi0gICAgewotICAgICAgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSVN0cnVjdHVyZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCgoZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElNb2RlbCkgJiYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQURUQ29udGVudE91dGxpbmVQYWdlKSkgfHwKLSAgICAgICAgICAgICghKGdldElucHV0KCkgaW5zdGFuY2VvZiBJTW9kZWwpKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICgoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJR3JhcGhFbGVtZW50KSAmJiAoKElHcmFwaEVsZW1lbnQpc2VsZWN0ZWRPYmplY3QpLmlzRm9jdXNBbGxvd2VkKCkpIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2V0SW5wdXQoKElTdHJ1Y3R1cmUpc2VsZWN0ZWRPYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzZXRJbnB1dEFuZE1hcmtMb2NhdGlvbigoSVN0cnVjdHVyZSlzZWxlY3RlZE9iamVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElHcmFwaEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIGlmICgoKElHcmFwaEVsZW1lbnQpc2VsZWN0ZWRPYmplY3QpLmlzRm9jdXNBbGxvd2VkKCkgJiYgKChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFEVENvbnRlbnRPdXRsaW5lUGFnZSkpKQotICAgICAgICB7Ci0gICAgICAgICAgc2V0SW5wdXRBbmRNYXJrTG9jYXRpb24oKElBRFRPYmplY3Qpc2VsZWN0ZWRPYmplY3QpOyAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKChJR3JhcGhFbGVtZW50KXNlbGVjdGVkT2JqZWN0KS5pc0ZvY3VzQWxsb3dlZCgpIAotICAgICAgICAgICAgJiYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JUG9zdFNlbGVjdGlvblByb3ZpZGVyICYmICEoZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElNb2RlbCkpKQotICAgICAgICB7Ci0gICAgICAgICAgc2V0SW5wdXQoKElBRFRPYmplY3Qpc2VsZWN0ZWRPYmplY3QpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCEoKElHcmFwaEVsZW1lbnQpc2VsZWN0ZWRPYmplY3QpLmlzRm9jdXNBbGxvd2VkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBXZSBlbmNvdW50ZXJlZCBhbiBvYmplY3QgdGhhdCBpcyBub3QgYSB2YWxpZCBpbnB1dCB0byB0aGUgZ3JhcGggdmlld2VyCi0gICAgICAgICAgLy8gTm93IGZpbmQgdGhlIHRvcCBjb250YWluZXIgdGhhdCBjYW4gYmUgYSB2YWxpZCBpbnB1dAotICAgICAgICAgIElBRFRPYmplY3Qgb2JqID0gKChJR3JhcGhFbGVtZW50KXNlbGVjdGVkT2JqZWN0KS5nZXRUb3BDb250YWluZXIoKTsKLSAgICAgICAgICBpZiAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBBRFRDb250ZW50T3V0bGluZVBhZ2UpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCBpZiB0aGUgc2VsZWN0aW9uIGlzIG9yaWdpbmF0ZWQgZnJvbSB0aGUgb3V0bGluZSwgd2Ugc2hvdWxkIAotICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBpbnB1dHMKLSAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkKLSAgICAgICAgICAgICAgc2V0SW5wdXRBbmRNYXJrTG9jYXRpb24ob2JqKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBDb21tb25TZWxlY3Rpb25NYW5hZ2VyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgaWYgdGhlIHNlbGVjdGlvbiBpcyBvcmlnaW5hdGVkIGZyb20gc29tZSBhY3Rpb24sIGllLiBhZGRpbmcKLSAgICAgICAgICAgIC8vIGEgbmV3IGVsZW1lbnQsIHdlIHNob3VsZCBjaGFuZ2UgdGhlIGlucHV0IG9ubHkgaWYgdGhlIGN1cnJlbnQgaW5wdXQgaXMgdGhlIG1vZGVsCi0gICAgICAgICAgICAvLyBvdGhlcndpc2UsIGlucHV0cyB3aWxsIGNoYW5nZSB1bmV4cGVjdGVkbHkhIQotICAgICAgICAgICAgaWYgKGdldElucHV0KCkgaW5zdGFuY2VvZiBJTW9kZWwpIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAob2JqICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc2V0SW5wdXQgKG9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JUG9zdFNlbGVjdGlvblByb3ZpZGVyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIGlmIHRoZSBzZWxlY3Rpb24gaXMgb3JpZ2luYXRlZCBmcm9tIHRoZSBzb3VyY2Ugdmlld2VyCi0gICAgICAgICAgICAvLyB3ZSBzaG91bGQgY2hhbmdlIHRoZSBpbnB1dCByZWdhcmRsZXNzLiAgVGVzdCBpcyBmb3IgbXVsdGlwbGUgbGV2ZWxzCi0gICAgICAgICAgICAvLyBvZiBhbm9ueW1vdXMgdHlwZXMKLSAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkKLSAgICAgICAgICAgICAgc2V0SW5wdXQgKG9iaik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAob2JqICE9IG51bGwgJiYgZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElNb2RlbCkKLSAgICAgICAgICAgICAgc2V0SW5wdXRBbmRNYXJrTG9jYXRpb24ob2JqKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUZpZWxkKSAKLSAgICAgICAgewotICAgICAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpc2VsZWN0ZWRPYmplY3Q7Ci0gICAgICAgICAgaWYgKCAoIWZpZWxkLmlzR2xvYmFsKCkgJiYgZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElNb2RlbCkgfHwKLSAgICAgICAgICAgICAgICghZmllbGQuaXNHbG9iYWwoKSAmJiAhKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgQ29tbW9uU2VsZWN0aW9uTWFuYWdlcikpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElBRFRPYmplY3Qgb2JqID0gKChJR3JhcGhFbGVtZW50KXNlbGVjdGVkT2JqZWN0KS5nZXRUb3BDb250YWluZXIoKTsKLSAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkKLSAgICAgICAgICAgICAgc2V0SW5wdXRBbmRNYXJrTG9jYXRpb24ob2JqKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoZmllbGQuaXNHbG9iYWwoKSAmJiAhKGdldElucHV0KCkgaW5zdGFuY2VvZiBJTW9kZWwpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVBvc3RTZWxlY3Rpb25Qcm92aWRlciApCi0gICAgICAgICAgICAgIHNldElucHV0KGZpZWxkKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgc2V0SW5wdXRBbmRNYXJrTG9jYXRpb24oZmllbGQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJRmllbGQpCi0gICAgICB7Ci0gICAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpc2VsZWN0ZWRPYmplY3Q7Ci0gICAgICAgIGlmICggKGZpZWxkLmlzR2xvYmFsKCkgJiYgKGdldElucHV0KCkgaW5zdGFuY2VvZiBJTW9kZWwpICYmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFEVENvbnRlbnRPdXRsaW5lUGFnZSkpIHx8Ci0gICAgICAgICAgICAoIChmaWVsZC5pc0dsb2JhbCgpICYmICEoZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElNb2RlbCkpKSkKLSAgICAgICAgeyAgCi0gICAgICAgICAgc2V0SW5wdXRBbmRNYXJrTG9jYXRpb24oZmllbGQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElNb2RlbFByb3h5KQotICAgICAgewotICAgICAgICBJTW9kZWxQcm94eSBhZGFwdGVyID0gKElNb2RlbFByb3h5KXNlbGVjdGVkT2JqZWN0OwotICAgICAgICBpZiAoZ2V0SW5wdXQoKSAhPSBhZGFwdGVyLmdldE1vZGVsKCkpCi0gICAgICAgICAgIHNldElucHV0KGFkYXB0ZXIuZ2V0TW9kZWwoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElNb2RlbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGdldElucHV0KCkgIT0gc2VsZWN0ZWRPYmplY3QpCi0gICAgICAgICAgc2V0SW5wdXQoKElNb2RlbClzZWxlY3RlZE9iamVjdCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0RWRpdFBhcnQoZ2V0Um9vdEVkaXRQYXJ0KCksIHNlbGVjdGVkT2JqZWN0KTsKLSAgICAgIGlmIChlZGl0UGFydCAhPSBudWxsKQotICAgICAgewotICAgICAgICBzZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdFBhcnQpKTsKLSAgICAgICAgc2V0Rm9jdXMoZWRpdFBhcnQpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgLyoKLSAgICogV2UgbmVlZCB0byBjb252ZXJ0IGZyb20gZWRpdCBwYXJ0IHNlbGVjdGlvbnMgdG8gbW9kZWwgb2JqZWN0IHNlbGVjdGlvbnMKLSAgICovCi0gIGNsYXNzIEFEVFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25Qcm92aWRlciwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotICB7Ci0gICAgcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByb3RlY3RlZCBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgICBsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgICBsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKQotICAgIHsKLSAgICAgIHJldHVybiBzZWxlY3Rpb247Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0ZW5lckxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGkubmV4dCgpOwotICAgICAgICBsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RydWN0dXJlZFNlbGVjdGlvbiBjb252ZXJ0U2VsZWN0aW9uRnJvbUVkaXRQYXJ0VG9Nb2RlbChJU2VsZWN0aW9uIGVkaXRQYXJ0U2VsZWN0aW9uKQotICAgIHsKLSAgICAgIExpc3Qgc2VsZWN0ZWRNb2RlbE9iamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBpZiAoZWRpdFBhcnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZWRpdFBhcnRTZWxlY3Rpb24pLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBvYmogPSBpLm5leHQoKTsKLSAgICAgICAgICBPYmplY3QgbW9kZWwgPSBudWxsOwotICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFZGl0UGFydCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgb2JqOwotICAgICAgICAgICAgbW9kZWwgPSBlZGl0UGFydC5nZXRNb2RlbCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobW9kZWwgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZWxlY3RlZE1vZGVsT2JqZWN0TGlzdC5hZGQobW9kZWwpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGVkTW9kZWxPYmplY3RMaXN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gICAgewotICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgSVNlbGVjdGlvbiBuZXdTZWxlY3Rpb24gPSBjb252ZXJ0U2VsZWN0aW9uRnJvbUVkaXRQYXJ0VG9Nb2RlbChldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICB0aGlzLnNlbGVjdGlvbiA9IG5ld1NlbGVjdGlvbjsKLSAgICAgIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBuZXdFdmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgbmV3U2VsZWN0aW9uKTsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyhuZXdFdmVudCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgRWRpdFBhcnQgZ2V0RWRpdFBhcnQoRWRpdFBhcnQgcGFyZW50LCBPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KWkubmV4dCgpOwotICAgICAgaWYgKGVkaXRQYXJ0LmdldE1vZGVsKCkgPT0gb2JqZWN0ICYmICEoZWRpdFBhcnQgaW5zdGFuY2VvZiBJSG9sZGVyRWRpdFBhcnQpICYmICEoZWRpdFBhcnQgaW5zdGFuY2VvZiBSb290Q29udGVudEVkaXRQYXJ0KSkKLSAgICAgIHsgIAotICAgICAgICByZXN1bHQgPSBlZGl0UGFydDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAKLSAgCi0gICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgIHsgCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9IGdldEVkaXRQYXJ0KChFZGl0UGFydClpLm5leHQoKSwgb2JqZWN0KTsKLSAgICAgICAgaWYgKGVkaXRQYXJ0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBGaXJzdCBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYSBzZWxlY3Rpb24KLSAgICAgICAgICBJU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHNlbGVjdGlvbiB0aGVuIHdlIHdpbGwgdHJ5IHRvIHNlbGVjdCAKLSAgICAgICAgICAvLyB0aGUgdGFyZ2V0IGVkaXQgcGFydCB0aGF0IGlzIG9uZSBvZiBpdHMgY2hpbGRyZW4KLSAgICAgICAgICAvLyBUaGlzIGlzIGhhbmR5IHdoZW4geW91IGFkZCBhbiBlbGVtZW50IHRvIGEgc3RydWN0dXJlZCBlZGl0IHBhcnQKLSAgICAgICAgICAvLyB0aGVuIHlvdSB3YW50IHRvIHNlbGVjdCB0aGUgZWxlbWVudCBpbW1lZGlhdGVseSBhbmQgcHV0IGl0IGluCi0gICAgICAgICAgLy8gZGlyZWN0IGVkaXQgbW9kZQotICAgICAgICAgIGlmIChjdXJyZW50U2VsZWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGN1cnJlbnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBFZGl0UGFydCB0YXJnZXRTdHJ1Y3R1cmVFZGl0UGFydCA9IChFZGl0UGFydCkoKFN0cnVjdHVyZWRTZWxlY3Rpb24pY3VycmVudFNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICAgIGlmICh0YXJnZXRTdHJ1Y3R1cmVFZGl0UGFydCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHRhcmdldFN0cnVjdHVyZUVkaXRQYXJ0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldFN0cnVjdHVyZUVkaXRQYXJ0IGluc3RhbmNlb2YgU3RydWN0dXJlRWRpdFBhcnQpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgdGFyZ2V0U3RydWN0dXJlRWRpdFBhcnQgPSB0YXJnZXRTdHJ1Y3R1cmVFZGl0UGFydC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgRWRpdFBhcnQgcG90ZW50aWFsRWRpdFBhcnRUb1NlbGVjdCA9IGVkaXRQYXJ0OwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgd2hpbGUgKHBvdGVudGlhbEVkaXRQYXJ0VG9TZWxlY3QgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwb3RlbnRpYWxFZGl0UGFydFRvU2VsZWN0IGluc3RhbmNlb2YgU3RydWN0dXJlRWRpdFBhcnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBvdGVudGlhbEVkaXRQYXJ0VG9TZWxlY3QgPSBwb3RlbnRpYWxFZGl0UGFydFRvU2VsZWN0LmdldFBhcmVudCgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAvLyBJZiB3ZSBmb3VuZCBhIHBvdGVudGlhbCBlZGl0IHBhcnQgdG8gc2VsZWN0IHRoZW4gcmV0dXJuIGl0Ci0gICAgICAgICAgICAgIC8vIE9SLCBpZiB0aGVyZSBpcyBubyB0YXJnZXQgZm91bmQsIHRoZW4gd2Ugc2hvdWxkIGp1c3QgcmV0dXJuCi0gICAgICAgICAgICAgIC8vIHRoZSBlZGl0IHBhcnQgd2UgZm91bmQKLSAgICAgICAgICAgICAgaWYgKHBvdGVudGlhbEVkaXRQYXJ0VG9TZWxlY3QgPT0gdGFyZ2V0U3RydWN0dXJlRWRpdFBhcnQgfHwgcG90ZW50aWFsRWRpdFBhcnRUb1NlbGVjdCA9PSBudWxsIHx8IHRhcmdldFN0cnVjdHVyZUVkaXRQYXJ0ID09IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBlZGl0UGFydDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIC8vIE90aGVyd2lzZSBqdXN0IGZpbmQgdGhlIGZpcnN0IG9uZSBhbmQgcmV0dXJuCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gZWRpdFBhcnQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAgICAgICAKLSAgICB9Ci0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldElucHV0QW5kTWFya0xvY2F0aW9uKElBRFRPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgSUFEVE9iamVjdCBvbGRJbnB1dCA9IGdldElucHV0KCk7ICAgIAotICAgIGlmIChlZGl0b3JQYXJ0ICE9IG51bGwgJiYgb2xkSW5wdXQgIT0gb2JqZWN0KQotICAgIHsgICAgICAgICAgCi0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXROYXZpZ2F0aW9uSGlzdG9yeSgpLm1hcmtMb2NhdGlvbihlZGl0b3JQYXJ0KTsKLSAgICB9ICAKLSAgICBzZXRJbnB1dChvYmplY3QpOwotCi0gICAgaWYgKGVkaXRvclBhcnQgIT0gbnVsbCAmJiBvbGRJbnB1dCAhPSBvYmplY3QpCi0gICAgewotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0TmF2aWdhdGlvbkhpc3RvcnkoKS5tYXJrTG9jYXRpb24oZWRpdG9yUGFydCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJQURUT2JqZWN0IG9iamVjdCkKLSAgewotICAgIFJvb3RDb250ZW50RWRpdFBhcnQgcm9vdENvbnRlbnRFZGl0UGFydCA9IChSb290Q29udGVudEVkaXRQYXJ0KWdldFJvb3RFZGl0UGFydCgpLmdldENvbnRlbnRzKCk7Ci0gICAgcm9vdENvbnRlbnRFZGl0UGFydC5zZXRNb2RlbChvYmplY3QpOwotICAgIHJvb3RDb250ZW50RWRpdFBhcnQucmVmcmVzaCgpOwotCi0gICAgaWYgKG9iamVjdCAhPSBudWxsKQotICAgIHsgIAotICAgICAgaW5wdXRDaGFuZ2VNYW5hZ2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmplY3QpKTsKLSAgICB9Ci0gICAgLy8gU2VsZWN0IHRoZSBlZGl0cGFydCB3aGVuIGl0IGlzIHNldCBhcyBpbnB1dAotICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0RWRpdFBhcnQocm9vdENvbnRlbnRFZGl0UGFydCwgb2JqZWN0KTsKLSAgICBpZiAoZWRpdFBhcnQgIT0gbnVsbCkKLSAgICAgIHNlbGVjdChlZGl0UGFydCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJQURUT2JqZWN0IGdldElucHV0KCkKLSAgewotICAgIFJvb3RDb250ZW50RWRpdFBhcnQgcm9vdENvbnRlbnRFZGl0UGFydCA9IChSb290Q29udGVudEVkaXRQYXJ0KWdldFJvb3RFZGl0UGFydCgpLmdldENvbnRlbnRzKCk7ICAgIAotICAgIHJldHVybiAoSUFEVE9iamVjdClyb290Q29udGVudEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFZGl0UGFydCBnZXRJbnB1dEVkaXRQYXJ0KCkKLSAgewotICAgIHJldHVybiBnZXRSb290RWRpdFBhcnQoKS5nZXRDb250ZW50cygpOyAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkSW5wdXRDaGFuZ2RMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgaW5wdXRDaGFuZ2VNYW5hZ2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUlucHV0Q2hhbmdkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGlucHV0Q2hhbmdlTWFuYWdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOyAgICAKLSAgfSAgCi0gIAotICAKLSAgcHJpdmF0ZSBjbGFzcyBJbnB1dENoYW5nZU1hbmFnZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIKLSAgewotICAgIExpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICAgIGlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkKLSAgICAgIHsgIAotICAgICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICAgIH0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpCi0gICAgeyAgIAotICAgICAgLy8gbm8gb25lIHNob3VsZCBiZSBjYWxsaW5nIHRoaXMgbWV0aG9kICAgICAKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICAgIGxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOyAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgICB7IAotICAgICAgbm90aWZ5TGlzdGVuZXJzKHNlbGVjdGlvbik7Ci0gICAgfQotCi0gICAgdm9pZCBub3RpZnlMaXN0ZW5lcnMoSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gICAgewotICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChsaXN0ZW5lcnMpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICAgIGxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCBzZWxlY3Rpb24pKTsKLSAgICAgIH0gIAotICAgIH0gICAgICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9EZXNpZ25WaWV3ZXJHcmFwaGljQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vRGVzaWduVmlld2VyR3JhcGhpY0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzRlMGQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9EZXNpZ25WaWV3ZXJHcmFwaGljQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1wdWJsaWMgaW50ZXJmYWNlIERlc2lnblZpZXdlckdyYXBoaWNDb25zdGFudHMKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NBTEVEX0hBTkRMRV9MQVlFUiA9ICJTY2FsZWQgSGFuZGxlIExheWVyIjsgLy8kTk9OLU5MUy0xJCAgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIEZvbnQgIHNtYWxsRm9udCA9IG5ldyBGb250KERpc3BsYXkuZ2V0Q3VycmVudCgpLCAiVGFob21hIiwgNiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vRmxhdENDb21iby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0ZsYXRDQ29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE2ZDUxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vRmxhdENDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BQ0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVDb250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVUZXh0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlVGV4dEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlR5cGVkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIFRoZSBDQ29tYm8gY2xhc3MgcmVwcmVzZW50cyBhIHNlbGVjdGFibGUgdXNlciBpbnRlcmZhY2Ugb2JqZWN0Ci0gKiB0aGF0IGNvbWJpbmVzIGEgdGV4dCBmaWVsZCBhbmQgYSBsaXN0IGFuZCBpc3N1ZXMgbm90aWZpY2F0aW9uCi0gKiB3aGVuIGFuIGl0ZW0gaXMgc2VsZWN0ZWQgZnJvbSB0aGUgbGlzdC4KLSAqIDxwPgotICogTm90ZSB0aGF0IGFsdGhvdWdoIHRoaXMgY2xhc3MgaXMgYSBzdWJjbGFzcyBvZiA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LAotICogaXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBhZGQgY2hpbGRyZW4gdG8gaXQsIG9yIHNldCBhIGxheW91dCBvbiBpdC4KLSAqIDwvcD4KLSAqIDxkbD4KLSAqIDxkdD48Yj5TdHlsZXM6PC9iPgotICogPGRkPkJPUkRFUiwgUkVBRF9PTkxZLCBGTEFUPC9kZD4KLSAqIDxkdD48Yj5FdmVudHM6PC9iPgotICogPGRkPlNlbGVjdGlvbjwvZGQ+Ci0gKiA8L2RsPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRmxhdENDb21ibyBleHRlbmRzIENvbXBvc2l0ZSB7Ci0KLSAgVGV4dCB0ZXh0OwotICBMaXN0IGxpc3Q7Ci0gIGludCB2aXNpYmxlSXRlbUNvdW50ID0gNTsKLSAgU2hlbGwgcG9wdXA7Ci0gIExhYmVsIGFycm93OwotICBib29sZWFuIGhhc0ZvY3VzOwotICBMaXN0ZW5lciBsaXN0ZW5lciwgZmlsdGVyOwotICBDb2xvciBmb3JlZ3JvdW5kLCBiYWNrZ3JvdW5kOwotICBGb250IGZvbnQ7Ci0gIAotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZ2l2ZW4gaXRzIHBhcmVudAotICogYW5kIGEgc3R5bGUgdmFsdWUgZGVzY3JpYmluZyBpdHMgYmVoYXZpb3IgYW5kIGFwcGVhcmFuY2UuCi0gKiA8cD4KLSAqIFRoZSBzdHlsZSB2YWx1ZSBpcyBlaXRoZXIgb25lIG9mIHRoZSBzdHlsZSBjb25zdGFudHMgZGVmaW5lZCBpbgotICogY2xhc3MgPGNvZGU+U1dUPC9jb2RlPiB3aGljaCBpcyBhcHBsaWNhYmxlIHRvIGluc3RhbmNlcyBvZiB0aGlzCi0gKiBjbGFzcywgb3IgbXVzdCBiZSBidWlsdCBieSA8ZW0+Yml0d2lzZSBPUjwvZW0+J2luZyB0b2dldGhlciAKLSAqICh0aGF0IGlzLCB1c2luZyB0aGUgPGNvZGU+aW50PC9jb2RlPiAifCIgb3BlcmF0b3IpIHR3byBvciBtb3JlCi0gKiBvZiB0aG9zZSA8Y29kZT5TV1Q8L2NvZGU+IHN0eWxlIGNvbnN0YW50cy4gVGhlIGNsYXNzIGRlc2NyaXB0aW9uCi0gKiBsaXN0cyB0aGUgc3R5bGUgY29uc3RhbnRzIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGNsYXNzLgotICogU3R5bGUgYml0cyBhcmUgYWxzbyBpbmhlcml0ZWQgZnJvbSBzdXBlcmNsYXNzZXMuCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIHBhcmVudCBhIHdpZGdldCB3aGljaCB3aWxsIGJlIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBpbnN0YW5jZSAoY2Fubm90IGJlIG51bGwpCi0gKiBAcGFyYW0gc3R5bGUgdGhlIHN0eWxlIG9mIHdpZGdldCB0byBjb25zdHJ1Y3QKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBwYXJlbnQgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHBhcmVudDwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIEBzZWUgU1dUI0JPUkRFUgotICogQHNlZSBTV1QjUkVBRF9PTkxZCi0gKiBAc2VlIFNXVCNGTEFUCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldCNnZXRTdHlsZSgpCi0gKi8KLXB1YmxpYyBGbGF0Q0NvbWJvIChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgc3VwZXIgKHBhcmVudCwgc3R5bGUgPSBjaGVja1N0eWxlIChzdHlsZSkpOwotICAKLSAgaW50IHRleHRTdHlsZSA9IFNXVC5TSU5HTEU7Ci0gIGlmICgoc3R5bGUgJiBTV1QuUkVBRF9PTkxZKSAhPSAwKSB0ZXh0U3R5bGUgfD0gU1dULlJFQURfT05MWTsKLSAgaWYgKChzdHlsZSAmIFNXVC5GTEFUKSAhPSAwKSB0ZXh0U3R5bGUgfD0gU1dULkZMQVQ7Ci0gIHRleHQgPSBuZXcgVGV4dCAodGhpcywgdGV4dFN0eWxlKTsKLSAgaW50IGFycm93U3R5bGUgPSBTV1QuQVJST1cgfCBTV1QuRE9XTjsKLSAgaWYgKChzdHlsZSAmIFNXVC5GTEFUKSAhPSAwKSBhcnJvd1N0eWxlIHw9IFNXVC5GTEFUOwotICBhcnJvdyA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuRkxBVCk7Ci0gIGFycm93LnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvVHJpYW5nbGVUb29sQmFyLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCi0gIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyICgpIHsKLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIHsKLSAgICAgIGlmIChwb3B1cCA9PSBldmVudC53aWRnZXQpIHsKLSAgICAgICAgcG9wdXBFdmVudCAoZXZlbnQpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAodGV4dCA9PSBldmVudC53aWRnZXQpIHsKLSAgICAgICAgdGV4dEV2ZW50IChldmVudCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChsaXN0ID09IGV2ZW50LndpZGdldCkgewotICAgICAgICBsaXN0RXZlbnQgKGV2ZW50KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKGFycm93ID09IGV2ZW50LndpZGdldCkgewotICAgICAgICBhcnJvd0V2ZW50IChldmVudCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChGbGF0Q0NvbWJvLnRoaXMgPT0gZXZlbnQud2lkZ2V0KSB7Ci0gICAgICAgIGNvbWJvRXZlbnQgKGV2ZW50KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKGdldFNoZWxsICgpID09IGV2ZW50LndpZGdldCkgewotICAgICAgICBoYW5kbGVGb2N1cyAoU1dULkZvY3VzT3V0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH07Ci0gIGZpbHRlciA9IG5ldyBMaXN0ZW5lcigpIHsKLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgU2hlbGwgc2hlbGwgPSAoKENvbnRyb2wpZXZlbnQud2lkZ2V0KS5nZXRTaGVsbCAoKTsKLSAgICAgIGlmIChzaGVsbCA9PSBGbGF0Q0NvbWJvLnRoaXMuZ2V0U2hlbGwgKCkpIHsKLSAgICAgICAgaGFuZGxlRm9jdXMgKFNXVC5Gb2N1c091dCk7Ci0gICAgICB9Ci0gICAgfQotICB9OwotICAKLSAgaW50IFtdIGNvbWJvRXZlbnRzID0ge1NXVC5EaXNwb3NlLCBTV1QuTW92ZSwgU1dULlJlc2l6ZX07Ci0gIGZvciAoaW50IGk9MDsgaTxjb21ib0V2ZW50cy5sZW5ndGg7IGkrKykgdGhpcy5hZGRMaXN0ZW5lciAoY29tYm9FdmVudHMgW2ldLCBsaXN0ZW5lcik7Ci0gIAotICBpbnQgW10gdGV4dEV2ZW50cyA9IHtTV1QuS2V5RG93biwgU1dULktleVVwLCBTV1QuTWVudURldGVjdCwgU1dULk1vZGlmeSwgU1dULk1vdXNlRG93biwgU1dULk1vdXNlVXAsIFNXVC5UcmF2ZXJzZSwgU1dULkZvY3VzSW59OwotICBmb3IgKGludCBpPTA7IGk8dGV4dEV2ZW50cy5sZW5ndGg7IGkrKykgdGV4dC5hZGRMaXN0ZW5lciAodGV4dEV2ZW50cyBbaV0sIGxpc3RlbmVyKTsKLSAgCi0gIGludCBbXSBhcnJvd0V2ZW50cyA9IHtTV1QuTW91c2VEb3duLCBTV1QuU2VsZWN0aW9uLCBTV1QuRm9jdXNJbn07Ci0gIGZvciAoaW50IGk9MDsgaTxhcnJvd0V2ZW50cy5sZW5ndGg7IGkrKykgYXJyb3cuYWRkTGlzdGVuZXIgKGFycm93RXZlbnRzIFtpXSwgbGlzdGVuZXIpOwotICAKLSAgY3JlYXRlUG9wdXAobnVsbCwgLTEpOwotICBpbml0QWNjZXNzaWJsZSgpOwotfQotc3RhdGljIGludCBjaGVja1N0eWxlIChpbnQgc3R5bGUpIHsKLSAgaW50IG1hc2sgPSBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSB8IFNXVC5GTEFUIHwgU1dULkxFRlRfVE9fUklHSFQgfCBTV1QuUklHSFRfVE9fTEVGVDsKLSAgcmV0dXJuIHN0eWxlICYgbWFzazsKLX0KLS8qKgotICogQWRkcyB0aGUgYXJndW1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgcmVjZWl2ZXIncyBsaXN0LgotICoKLSAqIEBwYXJhbSBzdHJpbmcgdGhlIG5ldyBpdGVtCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgc3RyaW5nIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKgotICogQHNlZSAjYWRkKFN0cmluZyxpbnQpCi0gKi8KLXB1YmxpYyB2b2lkIGFkZCAoU3RyaW5nIHN0cmluZykgewotICBjaGVja1dpZGdldCgpOwotICBpZiAoc3RyaW5nID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICBsaXN0LmFkZCAoc3RyaW5nKTsKLX0KLS8qKgotICogQWRkcyB0aGUgYXJndW1lbnQgdG8gdGhlIHJlY2VpdmVyJ3MgbGlzdCBhdCB0aGUgZ2l2ZW4KLSAqIHplcm8tcmVsYXRpdmUgaW5kZXguCi0gKiA8cD4KLSAqIE5vdGU6IFRvIGFkZCBhbiBpdGVtIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QsIHVzZSB0aGUKLSAqIHJlc3VsdCBvZiBjYWxsaW5nIDxjb2RlPmdldEl0ZW1Db3VudCgpPC9jb2RlPiBhcyB0aGUKLSAqIGluZGV4IG9yIHVzZSA8Y29kZT5hZGQoU3RyaW5nKTwvY29kZT4uCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIHN0cmluZyB0aGUgbmV3IGl0ZW0KLSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggZm9yIHRoZSBpdGVtCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgc3RyaW5nIGlzIG51bGw8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfUkFOR0UgLSBpZiB0aGUgaW5kZXggaXMgbm90IGJldHdlZW4gMCBhbmQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAoaW5jbHVzaXZlKTwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqCi0gKiBAc2VlICNhZGQoU3RyaW5nKQotICovCi1wdWJsaWMgdm9pZCBhZGQgKFN0cmluZyBzdHJpbmcsIGludCBpbmRleCkgewotICBjaGVja1dpZGdldCgpOwotICBpZiAoc3RyaW5nID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICBsaXN0LmFkZCAoc3RyaW5nLCBpbmRleCk7Ci19Ci0vKioKLSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbAotICogYmUgbm90aWZpZWQgd2hlbiB0aGUgcmVjZWl2ZXIncyB0ZXh0IGlzIG1vZGlmaWVkLCBieSBzZW5kaW5nCi0gKiBpdCBvbmUgb2YgdGhlIG1lc3NhZ2VzIGRlZmluZWQgaW4gdGhlIDxjb2RlPk1vZGlmeUxpc3RlbmVyPC9jb2RlPgotICogaW50ZXJmYWNlLgotICoKLSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgbGlzdGVuZXIgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqCi0gKiBAc2VlIE1vZGlmeUxpc3RlbmVyCi0gKiBAc2VlICNyZW1vdmVNb2RpZnlMaXN0ZW5lcgotICovCi1wdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lciAoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgaWYgKGxpc3RlbmVyID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICBUeXBlZExpc3RlbmVyIHR5cGVkTGlzdGVuZXIgPSBuZXcgVHlwZWRMaXN0ZW5lciAobGlzdGVuZXIpOwotICBhZGRMaXN0ZW5lciAoU1dULk1vZGlmeSwgdHlwZWRMaXN0ZW5lcik7Ci19Ci0vKioKLSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbAotICogYmUgbm90aWZpZWQgd2hlbiB0aGUgcmVjZWl2ZXIncyBzZWxlY3Rpb24gY2hhbmdlcywgYnkgc2VuZGluZwotICogaXQgb25lIG9mIHRoZSBtZXNzYWdlcyBkZWZpbmVkIGluIHRoZSA8Y29kZT5TZWxlY3Rpb25MaXN0ZW5lcjwvY29kZT4KLSAqIGludGVyZmFjZS4KLSAqIDxwPgotICogPGNvZGU+d2lkZ2V0U2VsZWN0ZWQ8L2NvZGU+IGlzIGNhbGxlZCB3aGVuIHRoZSBjb21ibydzIGxpc3Qgc2VsZWN0aW9uIGNoYW5nZXMuCi0gKiA8Y29kZT53aWRnZXREZWZhdWx0U2VsZWN0ZWQ8L2NvZGU+IGlzIHR5cGljYWxseSBjYWxsZWQgd2hlbiBFTlRFUiBpcyBwcmVzc2VkIHRoZSBjb21ibydzIHRleHQgYXJlYS4KLSAqIDwvcD4KLSAqCi0gKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIGxpc3RlbmVyIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKgotICogQHNlZSBTZWxlY3Rpb25MaXN0ZW5lcgotICogQHNlZSAjcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudAotICovCi1wdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICBjaGVja1dpZGdldCgpOwotICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gIFR5cGVkTGlzdGVuZXIgdHlwZWRMaXN0ZW5lciA9IG5ldyBUeXBlZExpc3RlbmVyIChsaXN0ZW5lcik7Ci0gIGFkZExpc3RlbmVyIChTV1QuU2VsZWN0aW9uLHR5cGVkTGlzdGVuZXIpOwotICBhZGRMaXN0ZW5lciAoU1dULkRlZmF1bHRTZWxlY3Rpb24sdHlwZWRMaXN0ZW5lcik7Ci19Ci12b2lkIGFycm93RXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0gIHN3aXRjaCAoZXZlbnQudHlwZSkgewotICAgIGNhc2UgU1dULkZvY3VzSW46IHsKLSAgICAgIGhhbmRsZUZvY3VzIChTV1QuRm9jdXNJbik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuU2VsZWN0aW9uOiB7Ci0gICAgICBkcm9wRG93biAoIWlzRHJvcHBlZCAoKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuTW91c2VEb3duOiB7Ci0gICAgICBkcm9wRG93biAoIWlzRHJvcHBlZCAoKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLS8qKgotICogU2V0cyB0aGUgc2VsZWN0aW9uIGluIHRoZSByZWNlaXZlcidzIHRleHQgZmllbGQgdG8gYW4gZW1wdHkKLSAqIHNlbGVjdGlvbiBzdGFydGluZyBqdXN0IGJlZm9yZSB0aGUgZmlyc3QgY2hhcmFjdGVyLiBJZiB0aGUKLSAqIHRleHQgZmllbGQgaXMgZWRpdGFibGUsIHRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgcGxhY2luZyB0aGUKLSAqIGktYmVhbSBhdCB0aGUgc3RhcnQgb2YgdGhlIHRleHQuCi0gKiA8cD4KLSAqIE5vdGU6IFRvIGNsZWFyIHRoZSBzZWxlY3RlZCBpdGVtcyBpbiB0aGUgcmVjZWl2ZXIncyBsaXN0LCAKLSAqIHVzZSA8Y29kZT5kZXNlbGVjdEFsbCgpPC9jb2RlPi4KLSAqIDwvcD4KLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIEBzZWUgI2Rlc2VsZWN0QWxsCi0gKi8KLXB1YmxpYyB2b2lkIGNsZWFyU2VsZWN0aW9uICgpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIHRleHQuY2xlYXJTZWxlY3Rpb24gKCk7Ci0gIGxpc3QuZGVzZWxlY3RBbGwgKCk7Ci19Ci12b2lkIGNvbWJvRXZlbnQgKEV2ZW50IGV2ZW50KSB7Ci0gIHN3aXRjaCAoZXZlbnQudHlwZSkgewotICAgIGNhc2UgU1dULkRpc3Bvc2U6Ci0gICAgICBpZiAocG9wdXAgIT0gbnVsbCAmJiAhcG9wdXAuaXNEaXNwb3NlZCAoKSkgewotICAgICAgICBsaXN0LnJlbW92ZUxpc3RlbmVyIChTV1QuRGlzcG9zZSwgbGlzdGVuZXIpOwotICAgICAgICBwb3B1cC5kaXNwb3NlICgpOwotICAgICAgfQotICAgICAgU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCAoKTsKLSAgICAgIHNoZWxsLnJlbW92ZUxpc3RlbmVyIChTV1QuRGVhY3RpdmF0ZSwgbGlzdGVuZXIpOwotICAgICAgRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSAoKTsKLSAgICAgIGRpc3BsYXkucmVtb3ZlRmlsdGVyIChTV1QuRm9jdXNJbiwgZmlsdGVyKTsKLSAgICAgIHBvcHVwID0gbnVsbDsgIAotICAgICAgdGV4dCA9IG51bGw7ICAKLSAgICAgIGxpc3QgPSBudWxsOyAgCi0gICAgICBhcnJvdyA9IG51bGw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNXVC5Nb3ZlOgotICAgICAgZHJvcERvd24gKGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1dULlJlc2l6ZToKLSAgICAgIGludGVybmFsTGF5b3V0IChmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi1wdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUgKGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGNoYW5nZWQpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIGludCB3aWR0aCA9IDAsIGhlaWdodCA9IDA7Ci0gIFN0cmluZ1tdIGl0ZW1zID0gbGlzdC5nZXRJdGVtcyAoKTsKLSAgaW50IHRleHRXaWR0aCA9IDA7Ci0gIEdDIGdjID0gbmV3IEdDICh0ZXh0KTsKLSAgaW50IHNwYWNlciA9IGdjLnN0cmluZ0V4dGVudCAoIiAiKS54OyAvLyROT04tTkxTLTEkCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICB0ZXh0V2lkdGggPSBNYXRoLm1heCAoZ2Muc3RyaW5nRXh0ZW50IChpdGVtc1tpXSkueCwgdGV4dFdpZHRoKTsKLSAgfQotICBnYy5kaXNwb3NlKCk7Ci0gIFBvaW50IHRleHRTaXplID0gdGV4dC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBjaGFuZ2VkKTsKLSAgLy8gUG9pbnQgYXJyb3dTaXplID0gYXJyb3cuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgY2hhbmdlZCk7Ci0gIFBvaW50IGFycm93U2l6ZSA9IG5ldyBQb2ludCgxNiwgMTYpOwotICBQb2ludCBsaXN0U2l6ZSA9IGxpc3QuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgY2hhbmdlZCk7Ci0gIGludCBib3JkZXJXaWR0aCA9IGdldEJvcmRlcldpZHRoICgpOwotICAKLSAgaGVpZ2h0ID0gTWF0aC5tYXggKHRleHRTaXplLnksIGFycm93U2l6ZS55KTsKLSAgd2lkdGggPSBNYXRoLm1heCAodGV4dFdpZHRoICsgMipzcGFjZXIgKyBhcnJvd1NpemUueCArIDIqYm9yZGVyV2lkdGgsIGxpc3RTaXplLngpOwotICBpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQpIHdpZHRoID0gd0hpbnQ7Ci0gIGlmIChoSGludCAhPSBTV1QuREVGQVVMVCkgaGVpZ2h0ID0gaEhpbnQ7Ci0gIHJldHVybiBuZXcgUG9pbnQgKHdpZHRoICsgMipib3JkZXJXaWR0aCwgaGVpZ2h0ICsgMipib3JkZXJXaWR0aCk7Ci19Ci12b2lkIGNyZWF0ZVBvcHVwKFN0cmluZ1tdIGl0ZW1zLCBpbnQgc2VsZWN0aW9uSW5kZXgpIHsgICAgCi0gICAgLy8gY3JlYXRlIHNoZWxsIGFuZCBsaXN0Ci0gICAgcG9wdXAgPSBuZXcgU2hlbGwgKGdldFNoZWxsICgpLCBTV1QuTk9fVFJJTSB8IFNXVC5PTl9UT1ApOwotICAgIGludCBzdHlsZSA9IGdldFN0eWxlICgpOwotICAgIGludCBsaXN0U3R5bGUgPSBTV1QuU0lOR0xFIHwgU1dULlZfU0NST0xMOwotICAgIGlmICgoc3R5bGUgJiBTV1QuRkxBVCkgIT0gMCkgbGlzdFN0eWxlIHw9IFNXVC5GTEFUOwotICAgIGlmICgoc3R5bGUgJiBTV1QuUklHSFRfVE9fTEVGVCkgIT0gMCkgbGlzdFN0eWxlIHw9IFNXVC5SSUdIVF9UT19MRUZUOwotICAgIGlmICgoc3R5bGUgJiBTV1QuTEVGVF9UT19SSUdIVCkgIT0gMCkgbGlzdFN0eWxlIHw9IFNXVC5MRUZUX1RPX1JJR0hUOwotICAgIGxpc3QgPSBuZXcgTGlzdCAocG9wdXAsIGxpc3RTdHlsZSk7Ci0gICAgaWYgKGZvbnQgIT0gbnVsbCkgbGlzdC5zZXRGb250IChmb250KTsKLSAgICBpZiAoZm9yZWdyb3VuZCAhPSBudWxsKSBsaXN0LnNldEZvcmVncm91bmQgKGZvcmVncm91bmQpOwotICAgIGlmIChiYWNrZ3JvdW5kICE9IG51bGwpIGxpc3Quc2V0QmFja2dyb3VuZCAoYmFja2dyb3VuZCk7Ci0gICAgCi0gICAgaW50IFtdIHBvcHVwRXZlbnRzID0ge1NXVC5DbG9zZSwgU1dULlBhaW50LCBTV1QuRGVhY3RpdmF0ZX07Ci0gICAgZm9yIChpbnQgaT0wOyBpPHBvcHVwRXZlbnRzLmxlbmd0aDsgaSsrKSBwb3B1cC5hZGRMaXN0ZW5lciAocG9wdXBFdmVudHMgW2ldLCBsaXN0ZW5lcik7Ci0gICAgaW50IFtdIGxpc3RFdmVudHMgPSB7U1dULk1vdXNlVXAsIFNXVC5TZWxlY3Rpb24sIFNXVC5UcmF2ZXJzZSwgU1dULktleURvd24sIFNXVC5LZXlVcCwgU1dULkZvY3VzSW4sIFNXVC5EaXNwb3NlfTsKLSAgICBmb3IgKGludCBpPTA7IGk8bGlzdEV2ZW50cy5sZW5ndGg7IGkrKykgbGlzdC5hZGRMaXN0ZW5lciAobGlzdEV2ZW50cyBbaV0sIGxpc3RlbmVyKTsKLSAgICAKLSAgICBpZiAoaXRlbXMgIT0gbnVsbCkgbGlzdC5zZXRJdGVtcyAoaXRlbXMpOwotICAgIGlmIChzZWxlY3Rpb25JbmRleCAhPSAtMSkgbGlzdC5zZXRTZWxlY3Rpb24gKHNlbGVjdGlvbkluZGV4KTsKLX0KLS8qKgotICogRGVzZWxlY3RzIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiB6ZXJvLXJlbGF0aXZlIGluZGV4IGluIHRoZSByZWNlaXZlcidzIAotICogbGlzdC4gIElmIHRoZSBpdGVtIGF0IHRoZSBpbmRleCB3YXMgYWxyZWFkeSBkZXNlbGVjdGVkLCBpdCByZW1haW5zCi0gKiBkZXNlbGVjdGVkLiBJbmRpY2VzIHRoYXQgYXJlIG91dCBvZiByYW5nZSBhcmUgaWdub3JlZC4KLSAqCi0gKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIGRlc2VsZWN0Ci0gKgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgZGVzZWxlY3QgKGludCBpbmRleCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgbGlzdC5kZXNlbGVjdCAoaW5kZXgpOwotfQotLyoqCi0gKiBEZXNlbGVjdHMgYWxsIHNlbGVjdGVkIGl0ZW1zIGluIHRoZSByZWNlaXZlcidzIGxpc3QuCi0gKiA8cD4KLSAqIE5vdGU6IFRvIGNsZWFyIHRoZSBzZWxlY3Rpb24gaW4gdGhlIHJlY2VpdmVyJ3MgdGV4dCBmaWVsZCwKLSAqIHVzZSA8Y29kZT5jbGVhclNlbGVjdGlvbigpPC9jb2RlPi4KLSAqIDwvcD4KLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIEBzZWUgI2NsZWFyU2VsZWN0aW9uCi0gKi8KLXB1YmxpYyB2b2lkIGRlc2VsZWN0QWxsICgpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIGxpc3QuZGVzZWxlY3RBbGwgKCk7Ci19Ci12b2lkIGRyb3BEb3duIChib29sZWFuIGRyb3ApIHsKLSAgaWYgKGRyb3AgPT0gaXNEcm9wcGVkICgpKSByZXR1cm47Ci0gIGlmICghZHJvcCkgewotICAgIHBvcHVwLnNldFZpc2libGUgKGZhbHNlKTsKLSAgICBpZiAoIWlzRGlzcG9zZWQgKCkmJiBhcnJvdy5pc0ZvY3VzQ29udHJvbCgpKSB7Ci0gICAgICB0ZXh0LnNldEZvY3VzKCk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChnZXRTaGVsbCgpICE9IHBvcHVwLmdldFBhcmVudCAoKSkgewotICAgIFN0cmluZ1tdIGl0ZW1zID0gbGlzdC5nZXRJdGVtcyAoKTsKLSAgICBpbnQgc2VsZWN0aW9uSW5kZXggPSBsaXN0LmdldFNlbGVjdGlvbkluZGV4ICgpOwotICAgIGxpc3QucmVtb3ZlTGlzdGVuZXIgKFNXVC5EaXNwb3NlLCBsaXN0ZW5lcik7Ci0gICAgcG9wdXAuZGlzcG9zZSgpOwotICAgIHBvcHVwID0gbnVsbDsKLSAgICBsaXN0ID0gbnVsbDsKLSAgICBjcmVhdGVQb3B1cCAoaXRlbXMsIHNlbGVjdGlvbkluZGV4KTsKLSAgfQotICAKLSAgUG9pbnQgc2l6ZSA9IGdldFNpemUgKCk7Ci0gIGludCBpdGVtQ291bnQgPSBsaXN0LmdldEl0ZW1Db3VudCAoKTsKLSAgaXRlbUNvdW50ID0gKGl0ZW1Db3VudCA9PSAwKSA/IHZpc2libGVJdGVtQ291bnQgOiBNYXRoLm1pbih2aXNpYmxlSXRlbUNvdW50LCBpdGVtQ291bnQpOwotICBpbnQgaXRlbUhlaWdodCA9IGxpc3QuZ2V0SXRlbUhlaWdodCAoKSAqIGl0ZW1Db3VudDsKLSAgUG9pbnQgbGlzdFNpemUgPSBsaXN0LmNvbXB1dGVTaXplIChTV1QuREVGQVVMVCwgaXRlbUhlaWdodCwgZmFsc2UpOwotICBsaXN0LnNldEJvdW5kcyAoMSwgMSwgTWF0aC5tYXggKHNpemUueCAtIDIsIGxpc3RTaXplLngpLCBsaXN0U2l6ZS55KTsKLSAgCi0gIGludCBpbmRleCA9IGxpc3QuZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0gIGlmIChpbmRleCAhPSAtMSkgbGlzdC5zZXRUb3BJbmRleCAoaW5kZXgpOwotICBEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5ICgpOwotICBSZWN0YW5nbGUgbGlzdFJlY3QgPSBsaXN0LmdldEJvdW5kcyAoKTsKLSAgUmVjdGFuZ2xlIHBhcmVudFJlY3QgPSBkaXNwbGF5Lm1hcCAoZ2V0UGFyZW50ICgpLCBudWxsLCBnZXRCb3VuZHMgKCkpOwotICBQb2ludCBjb21ib1NpemUgPSBnZXRTaXplICgpOwotICBSZWN0YW5nbGUgZGlzcGxheVJlY3QgPSBnZXRNb25pdG9yICgpLmdldENsaWVudEFyZWEgKCk7Ci0gIGludCB3aWR0aCA9IE1hdGgubWF4IChjb21ib1NpemUueCwgbGlzdFJlY3Qud2lkdGggKyAyKTsKLSAgaW50IGhlaWdodCA9IGxpc3RSZWN0LmhlaWdodCArIDI7Ci0gIGludCB4ID0gcGFyZW50UmVjdC54OwotICBpbnQgeSA9IHBhcmVudFJlY3QueSArIGNvbWJvU2l6ZS55OwotICBpZiAoeSArIGhlaWdodCA+IGRpc3BsYXlSZWN0LnkgKyBkaXNwbGF5UmVjdC5oZWlnaHQpIHkgPSBwYXJlbnRSZWN0LnkgLSBoZWlnaHQ7Ci0gIGlmICh4ICsgd2lkdGggPiBkaXNwbGF5UmVjdC54ICsgZGlzcGxheVJlY3Qud2lkdGgpIHggPSBkaXNwbGF5UmVjdC54ICsgZGlzcGxheVJlY3Qud2lkdGggLSBsaXN0UmVjdC53aWR0aDsKLSAgcG9wdXAuc2V0Qm91bmRzICh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLSAgcG9wdXAuc2V0VmlzaWJsZSAodHJ1ZSk7Ci0gIGxpc3Quc2V0Rm9jdXMgKCk7Ci19Ci0vKgotICogUmV0dXJuIHRoZSBsb3dlcmNhc2Ugb2YgdGhlIGZpcnN0IG5vbi0nJicgY2hhcmFjdGVyIGZvbGxvd2luZwotICogYW4gJyYnIGNoYXJhY3RlciBpbiB0aGUgZ2l2ZW4gc3RyaW5nLiBJZiB0aGVyZSBhcmUgbm8gJyYnCi0gKiBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbiBzdHJpbmcsIHJldHVybiAnXDAnLgotICovCi1jaGFyIF9maW5kTW5lbW9uaWMgKFN0cmluZyBzdHJpbmcpIHsKLSAgaWYgKHN0cmluZyA9PSBudWxsKSByZXR1cm4gJ1wwJzsKLSAgaW50IGluZGV4ID0gMDsKLSAgaW50IGxlbmd0aCA9IHN0cmluZy5sZW5ndGggKCk7Ci0gIGRvIHsKLSAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGggJiYgc3RyaW5nLmNoYXJBdCAoaW5kZXgpICE9ICcmJykgaW5kZXgrKzsKLSAgICBpZiAoKytpbmRleCA+PSBsZW5ndGgpIHJldHVybiAnXDAnOwotICAgIGlmIChzdHJpbmcuY2hhckF0IChpbmRleCkgIT0gJyYnKSByZXR1cm4gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlIChzdHJpbmcuY2hhckF0IChpbmRleCkpOwotICAgIGluZGV4Kys7Ci0gIH0gd2hpbGUgKGluZGV4IDwgbGVuZ3RoKTsKLSAgcmV0dXJuICdcMCc7Ci19Ci0vKiAKLSAqIFJldHVybiB0aGUgTGFiZWwgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHRoZSByZWNlaXZlciBpbiB0aGUgei1vcmRlciwgCi0gKiBvciBudWxsIGlmIG5vbmUuIAotICovCi1MYWJlbCBnZXRBc3NvY2lhdGVkTGFiZWwgKCkgewotICBDb250cm9sW10gc2libGluZ3MgPSBnZXRQYXJlbnQgKCkuZ2V0Q2hpbGRyZW4gKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgc2libGluZ3MubGVuZ3RoOyBpKyspIHsKLSAgICBpZiAoc2libGluZ3MgW2ldID09IHRoaXMpIHsKLSAgICAgIGlmIChpID4gMCAmJiBzaWJsaW5ncyBbaS0xXSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0gICAgICAgIHJldHVybiAoTGFiZWwpIHNpYmxpbmdzIFtpLTFdOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gbnVsbDsKLX0KLXB1YmxpYyBDb250cm9sIFtdIGdldENoaWxkcmVuICgpIHsKLSAgcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKCk7Ci19Ci0vKioKLSAqIEdldHMgdGhlIGVkaXRhYmxlIHN0YXRlLgotICoKLSAqIEByZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHJlY2VpdmVyIGlzIGVkaXRhYmxlCi0gKiAKLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGJvb2xlYW4gZ2V0RWRpdGFibGUgKCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgcmV0dXJuIHRleHQuZ2V0RWRpdGFibGUoKTsKLX0KLS8qKgotICogUmV0dXJucyB0aGUgaXRlbSBhdCB0aGUgZ2l2ZW4sIHplcm8tcmVsYXRpdmUgaW5kZXggaW4gdGhlCi0gKiByZWNlaXZlcidzIGxpc3QuIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIG91dAotICogb2YgcmFuZ2UuCi0gKgotICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm4KLSAqIEByZXR1cm4gdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGluZGV4Ci0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfUkFOR0UgLSBpZiB0aGUgaW5kZXggaXMgbm90IGJldHdlZW4gMCBhbmQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCBtaW51cyAxIChpbmNsdXNpdmUpPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgU3RyaW5nIGdldEl0ZW0gKGludCBpbmRleCkgewotICBjaGVja1dpZGdldCgpOwotICByZXR1cm4gbGlzdC5nZXRJdGVtIChpbmRleCk7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBjb250YWluZWQgaW4gdGhlIHJlY2VpdmVyJ3MgbGlzdC4KLSAqCi0gKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMKLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGdldEl0ZW1Db3VudCAoKSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICByZXR1cm4gbGlzdC5nZXRJdGVtQ291bnQgKCk7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGhlaWdodCBvZiB0aGUgYXJlYSB3aGljaCB3b3VsZCBiZSB1c2VkIHRvCi0gKiBkaXNwbGF5IDxlbT5vbmU8L2VtPiBvZiB0aGUgaXRlbXMgaW4gdGhlIHJlY2VpdmVyJ3MgbGlzdC4KLSAqCi0gKiBAcmV0dXJuIHRoZSBoZWlnaHQgb2Ygb25lIGl0ZW0KLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGdldEl0ZW1IZWlnaHQgKCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgcmV0dXJuIGxpc3QuZ2V0SXRlbUhlaWdodCAoKTsKLX0KLS8qKgotICogUmV0dXJucyBhbiBhcnJheSBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+cyB3aGljaCBhcmUgdGhlIGl0ZW1zCi0gKiBpbiB0aGUgcmVjZWl2ZXIncyBsaXN0LiAKLSAqIDxwPgotICogTm90ZTogVGhpcyBpcyBub3QgdGhlIGFjdHVhbCBzdHJ1Y3R1cmUgdXNlZCBieSB0aGUgcmVjZWl2ZXIKLSAqIHRvIG1haW50YWluIGl0cyBsaXN0IG9mIGl0ZW1zLCBzbyBtb2RpZnlpbmcgdGhlIGFycmF5IHdpbGwKLSAqIG5vdCBhZmZlY3QgdGhlIHJlY2VpdmVyLiAKLSAqIDwvcD4KLSAqCi0gKiBAcmV0dXJuIHRoZSBpdGVtcyBpbiB0aGUgcmVjZWl2ZXIncyBsaXN0Ci0gKgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIFN0cmluZyBbXSBnZXRJdGVtcyAoKSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICByZXR1cm4gbGlzdC5nZXRJdGVtcyAoKTsKLX0KLXB1YmxpYyBNZW51IGdldE1lbnUoKSB7Ci0gIHJldHVybiB0ZXh0LmdldE1lbnUoKTsKLX0KLS8qKgotICogUmV0dXJucyBhIDxjb2RlPlBvaW50PC9jb2RlPiB3aG9zZSB4IGNvb3JkaW5hdGUgaXMgdGhlIHN0YXJ0Ci0gKiBvZiB0aGUgc2VsZWN0aW9uIGluIHRoZSByZWNlaXZlcidzIHRleHQgZmllbGQsIGFuZCB3aG9zZSB5Ci0gKiBjb29yZGluYXRlIGlzIHRoZSBlbmQgb2YgdGhlIHNlbGVjdGlvbi4gVGhlIHJldHVybmVkIHZhbHVlcwotICogYXJlIHplcm8tcmVsYXRpdmUuIEFuICJlbXB0eSIgc2VsZWN0aW9uIGFzIGluZGljYXRlZCBieQotICogdGhlIHRoZSB4IGFuZCB5IGNvb3JkaW5hdGVzIGhhdmluZyB0aGUgc2FtZSB2YWx1ZS4KLSAqCi0gKiBAcmV0dXJuIGEgcG9pbnQgcmVwcmVzZW50aW5nIHRoZSBzZWxlY3Rpb24gc3RhcnQgYW5kIGVuZAotICoKLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBQb2ludCBnZXRTZWxlY3Rpb24gKCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgcmV0dXJuIHRleHQuZ2V0U2VsZWN0aW9uICgpOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSB6ZXJvLXJlbGF0aXZlIGluZGV4IG9mIHRoZSBpdGVtIHdoaWNoIGlzIGN1cnJlbnRseQotICogc2VsZWN0ZWQgaW4gdGhlIHJlY2VpdmVyJ3MgbGlzdCwgb3IgLTEgaWYgbm8gaXRlbSBpcyBzZWxlY3RlZC4KLSAqCi0gKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotICoKLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBpbnQgZ2V0U2VsZWN0aW9uSW5kZXggKCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgcmV0dXJuIGxpc3QuZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci19Ci1wdWJsaWMgaW50IGdldFN0eWxlICgpIHsKLSAgaW50IHN0eWxlID0gc3VwZXIuZ2V0U3R5bGUgKCk7Ci0gIHN0eWxlICY9IH5TV1QuUkVBRF9PTkxZOwotICBpZiAoIXRleHQuZ2V0RWRpdGFibGUoKSkgc3R5bGUgfD0gU1dULlJFQURfT05MWTsgCi0gIHJldHVybiBzdHlsZTsKLX0KLS8qKgotICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGEgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlCi0gKiByZWNlaXZlcidzIHRleHQgZmllbGQuCi0gKgotICogQHJldHVybiB0aGUgcmVjZWl2ZXIncyB0ZXh0Ci0gKgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIFN0cmluZyBnZXRUZXh0ICgpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIHJldHVybiB0ZXh0LmdldFRleHQgKCk7Ci19Ci0vKioKLSAqIFJldHVybnMgdGhlIGhlaWdodCBvZiB0aGUgcmVjZWl2ZXJzJ3MgdGV4dCBmaWVsZC4KLSAqCi0gKiBAcmV0dXJuIHRoZSB0ZXh0IGhlaWdodAotICoKLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBpbnQgZ2V0VGV4dEhlaWdodCAoKSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICByZXR1cm4gdGV4dC5nZXRMaW5lSGVpZ2h0ICgpOwotfQotLyoqCi0gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgdGhlIHJlY2VpdmVyJ3MKLSAqIHRleHQgZmllbGQgaXMgY2FwYWJsZSBvZiBob2xkaW5nLiBJZiB0aGlzIGhhcyBub3QgYmVlbiBjaGFuZ2VkCi0gKiBieSA8Y29kZT5zZXRUZXh0TGltaXQoKTwvY29kZT4sIGl0IHdpbGwgYmUgdGhlIGNvbnN0YW50Ci0gKiA8Y29kZT5Db21iby5MSU1JVDwvY29kZT4uCi0gKiAKLSAqIEByZXR1cm4gdGhlIHRleHQgbGltaXQKLSAqIAotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGludCBnZXRUZXh0TGltaXQgKCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgcmV0dXJuIHRleHQuZ2V0VGV4dExpbWl0ICgpOwotfQotLyoqCi0gKiBHZXRzIHRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCBhcmUgdmlzaWJsZSBpbiB0aGUgZHJvcAotICogZG93biBwb3J0aW9uIG9mIHRoZSByZWNlaXZlcidzIGxpc3QuCi0gKgotICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgYXJlIHZpc2libGUKLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnQgZ2V0VmlzaWJsZUl0ZW1Db3VudCAoKSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICByZXR1cm4gdmlzaWJsZUl0ZW1Db3VudDsKLX0KLXZvaWQgaGFuZGxlRm9jdXMgKGludCB0eXBlKSB7Ci0gIGlmIChpc0Rpc3Bvc2VkICgpKSByZXR1cm47Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgU1dULkZvY3VzSW46IHsKLSAgICAgIGlmIChoYXNGb2N1cykgcmV0dXJuOwotICAgICAgaWYgKGdldEVkaXRhYmxlICgpKSB0ZXh0LnNlbGVjdEFsbCAoKTsKLSAgICAgIGhhc0ZvY3VzID0gdHJ1ZTsKLSAgICAgIFNoZWxsIHNoZWxsID0gZ2V0U2hlbGwgKCk7Ci0gICAgICBzaGVsbC5yZW1vdmVMaXN0ZW5lciAoU1dULkRlYWN0aXZhdGUsIGxpc3RlbmVyKTsKLSAgICAgIHNoZWxsLmFkZExpc3RlbmVyIChTV1QuRGVhY3RpdmF0ZSwgbGlzdGVuZXIpOwotICAgICAgRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSAoKTsKLSAgICAgIGRpc3BsYXkucmVtb3ZlRmlsdGVyIChTV1QuRm9jdXNJbiwgZmlsdGVyKTsKLSAgICAgIGRpc3BsYXkuYWRkRmlsdGVyIChTV1QuRm9jdXNJbiwgZmlsdGVyKTsKLSAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5Gb2N1c0luLCBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFNXVC5Gb2N1c091dDogewotICAgICAgaWYgKCFoYXNGb2N1cykgcmV0dXJuOwotICAgICAgQ29udHJvbCBmb2N1c0NvbnRyb2wgPSBnZXREaXNwbGF5ICgpLmdldEZvY3VzQ29udHJvbCAoKTsKLSAgICAgIGlmIChmb2N1c0NvbnRyb2wgPT0gYXJyb3cgfHwgZm9jdXNDb250cm9sID09IGxpc3QgfHwgZm9jdXNDb250cm9sID09IHRleHQpIHJldHVybjsKLSAgICAgIGhhc0ZvY3VzID0gZmFsc2U7Ci0gICAgICBTaGVsbCBzaGVsbCA9IGdldFNoZWxsICgpOwotICAgICAgc2hlbGwucmVtb3ZlTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIGxpc3RlbmVyKTsKLSAgICAgIERpc3BsYXkgZGlzcGxheSA9IGdldERpc3BsYXkgKCk7Ci0gICAgICBkaXNwbGF5LnJlbW92ZUZpbHRlciAoU1dULkZvY3VzSW4sIGZpbHRlcik7Ci0gICAgICBFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotICAgICAgbm90aWZ5TGlzdGVuZXJzIChTV1QuRm9jdXNPdXQsIGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0vKioKLSAqIFNlYXJjaGVzIHRoZSByZWNlaXZlcidzIGxpc3Qgc3RhcnRpbmcgYXQgdGhlIGZpcnN0IGl0ZW0KLSAqIChpbmRleCAwKSB1bnRpbCBhbiBpdGVtIGlzIGZvdW5kIHRoYXQgaXMgZXF1YWwgdG8gdGhlIAotICogYXJndW1lbnQsIGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGF0IGl0ZW0uIElmIG5vIGl0ZW0KLSAqIGlzIGZvdW5kLCByZXR1cm5zIC0xLgotICoKLSAqIEBwYXJhbSBzdHJpbmcgdGhlIHNlYXJjaCBpdGVtCi0gKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgaXRlbQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHN0cmluZyBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgaW50IGluZGV4T2YgKFN0cmluZyBzdHJpbmcpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIGlmIChzdHJpbmcgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gIHJldHVybiBsaXN0LmluZGV4T2YgKHN0cmluZyk7Ci19Ci0vKioKLSAqIFNlYXJjaGVzIHRoZSByZWNlaXZlcidzIGxpc3Qgc3RhcnRpbmcgYXQgdGhlIGdpdmVuLCAKLSAqIHplcm8tcmVsYXRpdmUgaW5kZXggdW50aWwgYW4gaXRlbSBpcyBmb3VuZCB0aGF0IGlzIGVxdWFsCi0gKiB0byB0aGUgYXJndW1lbnQsIGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGF0IGl0ZW0uIElmCi0gKiBubyBpdGVtIGlzIGZvdW5kIG9yIHRoZSBzdGFydGluZyBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsCi0gKiByZXR1cm5zIC0xLgotICoKLSAqIEBwYXJhbSBzdHJpbmcgdGhlIHNlYXJjaCBpdGVtCi0gKiBAcGFyYW0gc3RhcnQgdGhlIHplcm8tcmVsYXRpdmUgaW5kZXggYXQgd2hpY2ggdG8gYmVnaW4gdGhlIHNlYXJjaAotICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGl0ZW0KLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBzdHJpbmcgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGludCBpbmRleE9mIChTdHJpbmcgc3RyaW5nLCBpbnQgc3RhcnQpIHsKLSAgY2hlY2tXaWRnZXQgKCk7Ci0gIGlmIChzdHJpbmcgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gIHJldHVybiBsaXN0LmluZGV4T2YgKHN0cmluZywgc3RhcnQpOwotfQotCi12b2lkIGluaXRBY2Nlc3NpYmxlKCkgewotICBBY2Nlc3NpYmxlQWRhcHRlciBhY2Nlc3NpYmxlQWRhcHRlciA9IG5ldyBBY2Nlc3NpYmxlQWRhcHRlciAoKSB7Ci0gICAgcHVibGljIHZvaWQgZ2V0TmFtZSAoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLSAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICAgIExhYmVsIGxhYmVsID0gZ2V0QXNzb2NpYXRlZExhYmVsICgpOwotICAgICAgaWYgKGxhYmVsICE9IG51bGwpIHsKLSAgICAgICAgbmFtZSA9IHN0cmlwTW5lbW9uaWMgKGxhYmVsLmdldFRleHQoKSk7Ci0gICAgICB9Ci0gICAgICBlLnJlc3VsdCA9IG5hbWU7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGdldEtleWJvYXJkU2hvcnRjdXQoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLSAgICAgIFN0cmluZyBzaG9ydGN1dCA9IG51bGw7Ci0gICAgICBMYWJlbCBsYWJlbCA9IGdldEFzc29jaWF0ZWRMYWJlbCAoKTsKLSAgICAgIGlmIChsYWJlbCAhPSBudWxsKSB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gbGFiZWwuZ2V0VGV4dCAoKTsKLSAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgewotICAgICAgICAgIGNoYXIgbW5lbW9uaWMgPSBfZmluZE1uZW1vbmljICh0ZXh0KTsKLSAgICAgICAgICBpZiAobW5lbW9uaWMgIT0gJ1wwJykgewotICAgICAgICAgICAgc2hvcnRjdXQgPSAiQWx0KyIrbW5lbW9uaWM7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGUucmVzdWx0ID0gc2hvcnRjdXQ7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGdldEhlbHAgKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0gICAgICBlLnJlc3VsdCA9IGdldFRvb2xUaXBUZXh0ICgpOwotICAgIH0KLSAgfTsKLSAgZ2V0QWNjZXNzaWJsZSAoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIgKGFjY2Vzc2libGVBZGFwdGVyKTsKLSAgdGV4dC5nZXRBY2Nlc3NpYmxlICgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lciAoYWNjZXNzaWJsZUFkYXB0ZXIpOwotICBsaXN0LmdldEFjY2Vzc2libGUgKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyIChhY2Nlc3NpYmxlQWRhcHRlcik7Ci0gIAotICBhcnJvdy5nZXRBY2Nlc3NpYmxlICgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lciAobmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgewotICAgIHB1YmxpYyB2b2lkIGdldE5hbWUgKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0gICAgICBlLnJlc3VsdCA9IGlzRHJvcHBlZCAoKSA/IFNXVC5nZXRNZXNzYWdlICgiU1dUX0Nsb3NlIikgOiBTV1QuZ2V0TWVzc2FnZSAoIlNXVF9PcGVuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBnZXRLZXlib2FyZFNob3J0Y3V0IChBY2Nlc3NpYmxlRXZlbnQgZSkgewotICAgICAgZS5yZXN1bHQgPSAiQWx0K0Rvd24gQXJyb3ciOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHB1YmxpYyB2b2lkIGdldEhlbHAgKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0gICAgICBlLnJlc3VsdCA9IGdldFRvb2xUaXBUZXh0ICgpOwotICAgIH0KLSAgfSk7Ci0KLSAgZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVUZXh0TGlzdGVuZXIgKG5ldyBBY2Nlc3NpYmxlVGV4dEFkYXB0ZXIoKSB7Ci0gICAgcHVibGljIHZvaWQgZ2V0Q2FyZXRPZmZzZXQgKEFjY2Vzc2libGVUZXh0RXZlbnQgZSkgewotICAgICAgZS5vZmZzZXQgPSB0ZXh0LmdldENhcmV0UG9zaXRpb24gKCk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGdldFNlbGVjdGlvblJhbmdlKEFjY2Vzc2libGVUZXh0RXZlbnQgZSkgewotICAgICAgUG9pbnQgc2VsID0gdGV4dC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIGUub2Zmc2V0ID0gc2VsLng7Ci0gICAgICBlLmxlbmd0aCA9IHNlbC55IC0gc2VsLng7Ci0gICAgfQotICB9KTsKLSAgCi0gIGdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyIChuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKCkgewotICAgIHB1YmxpYyB2b2lkIGdldENoaWxkQXRQb2ludCAoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0gICAgICBQb2ludCB0ZXN0UG9pbnQgPSB0b0NvbnRyb2wgKGUueCwgZS55KTsKLSAgICAgIGlmIChnZXRCb3VuZHMgKCkuY29udGFpbnMgKHRlc3RQb2ludCkpIHsKLSAgICAgICAgZS5jaGlsZElEID0gQUNDLkNISUxESURfU0VMRjsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZ2V0TG9jYXRpb24gKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotICAgICAgUmVjdGFuZ2xlIGxvY2F0aW9uID0gZ2V0Qm91bmRzICgpOwotICAgICAgUG9pbnQgcHQgPSB0b0Rpc3BsYXkgKGxvY2F0aW9uLngsIGxvY2F0aW9uLnkpOwotICAgICAgZS54ID0gcHQueDsKLSAgICAgIGUueSA9IHB0Lnk7Ci0gICAgICBlLndpZHRoID0gbG9jYXRpb24ud2lkdGg7Ci0gICAgICBlLmhlaWdodCA9IGxvY2F0aW9uLmhlaWdodDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZ2V0Q2hpbGRDb3VudCAoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0gICAgICBlLmRldGFpbCA9IDA7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGdldFJvbGUgKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotICAgICAgZS5kZXRhaWwgPSBBQ0MuUk9MRV9DT01CT0JPWDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZ2V0U3RhdGUgKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotICAgICAgZS5kZXRhaWwgPSBBQ0MuU1RBVEVfTk9STUFMOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdldFZhbHVlIChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgIGUucmVzdWx0ID0gZ2V0VGV4dCAoKTsKLSAgICB9Ci0gIH0pOwotCi0gIHRleHQuZ2V0QWNjZXNzaWJsZSAoKS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyIChuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyICgpIHsKLSAgICBwdWJsaWMgdm9pZCBnZXRSb2xlIChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgIGUuZGV0YWlsID0gdGV4dC5nZXRFZGl0YWJsZSAoKSA/IEFDQy5ST0xFX1RFWFQgOiBBQ0MuUk9MRV9MQUJFTDsKLSAgICB9Ci0gIH0pOwotCi0gIGFycm93LmdldEFjY2Vzc2libGUgKCkuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lciAobmV3IEFjY2Vzc2libGVDb250cm9sQWRhcHRlcigpIHsKLSAgICBwdWJsaWMgdm9pZCBnZXREZWZhdWx0QWN0aW9uIChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgIGUucmVzdWx0ID0gaXNEcm9wcGVkICgpID8gU1dULmdldE1lc3NhZ2UgKCJTV1RfQ2xvc2UiKSA6IFNXVC5nZXRNZXNzYWdlICgiU1dUX09wZW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICB9KTsKLX0KLWJvb2xlYW4gaXNEcm9wcGVkICgpIHsKLSAgcmV0dXJuIHBvcHVwLmdldFZpc2libGUgKCk7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQ29udHJvbCAoKSB7Ci0gIGNoZWNrV2lkZ2V0KCk7Ci0gIGlmICh0ZXh0LmlzRm9jdXNDb250cm9sICgpIHx8IGFycm93LmlzRm9jdXNDb250cm9sICgpIHx8IGxpc3QuaXNGb2N1c0NvbnRyb2wgKCkgfHwgcG9wdXAuaXNGb2N1c0NvbnRyb2wgKCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSAKLSAgcmV0dXJuIHN1cGVyLmlzRm9jdXNDb250cm9sICgpOwotfQotdm9pZCBpbnRlcm5hbExheW91dCAoYm9vbGVhbiBjaGFuZ2VkKSB7Ci0gIGlmIChpc0Ryb3BwZWQgKCkpIGRyb3BEb3duIChmYWxzZSk7Ci0gIFJlY3RhbmdsZSByZWN0ID0gZ2V0Q2xpZW50QXJlYSAoKTsKLSAgaW50IHdpZHRoID0gcmVjdC53aWR0aDsKLSAgaW50IGhlaWdodCA9IHJlY3QuaGVpZ2h0OwotICAvLyBQb2ludCBhcnJvd1NpemUgPSBhcnJvdy5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIGhlaWdodCwgY2hhbmdlZCk7Ci0gIC8vIHRleHQuc2V0Qm91bmRzICgwLCAwLCB3aWR0aCAtIGFycm93U2l6ZS54LCBoZWlnaHQpOwotICB0ZXh0LnNldEJvdW5kcyAoMCwgMCwgd2lkdGggLSAxNiwgaGVpZ2h0KTsKLSAgLy8gYXJyb3cuc2V0Qm91bmRzICh3aWR0aCAtIGFycm93U2l6ZS54LCAwLCBhcnJvd1NpemUueCwgYXJyb3dTaXplLnkpOwotICBhcnJvdy5zZXRCb3VuZHMgKHdpZHRoIC0gMTYsIDAsIDE2LCAxNik7Ci19Ci12b2lkIGxpc3RFdmVudCAoRXZlbnQgZXZlbnQpIHsKLSAgc3dpdGNoIChldmVudC50eXBlKSB7Ci0gICAgY2FzZSBTV1QuRGlzcG9zZToKLSAgICAgIGlmIChnZXRTaGVsbCAoKSAhPSBwb3B1cC5nZXRQYXJlbnQgKCkpIHsKLSAgICAgICAgU3RyaW5nW10gaXRlbXMgPSBsaXN0LmdldEl0ZW1zICgpOwotICAgICAgICBpbnQgc2VsZWN0aW9uSW5kZXggPSBsaXN0LmdldFNlbGVjdGlvbkluZGV4ICgpOwotICAgICAgICBwb3B1cCA9IG51bGw7Ci0gICAgICAgIGxpc3QgPSBudWxsOwotICAgICAgICBjcmVhdGVQb3B1cCAoaXRlbXMsIHNlbGVjdGlvbkluZGV4KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1dULkZvY3VzSW46IHsKLSAgICAgIGhhbmRsZUZvY3VzIChTV1QuRm9jdXNJbik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuTW91c2VVcDogewotICAgICAgaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSByZXR1cm47Ci0gICAgICBkcm9wRG93biAoZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgU1dULlNlbGVjdGlvbjogewotICAgICAgaW50IGluZGV4ID0gbGlzdC5nZXRTZWxlY3Rpb25JbmRleCAoKTsKLSAgICAgIGlmIChpbmRleCA9PSAtMSkgcmV0dXJuOwotICAgICAgdGV4dC5zZXRUZXh0IChsaXN0LmdldEl0ZW0gKGluZGV4KSk7Ci0gICAgICB0ZXh0LnNlbGVjdEFsbCAoKTsKLSAgICAgIGxpc3Quc2V0U2VsZWN0aW9uIChpbmRleCk7Ci0gICAgICBFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotICAgICAgZS50aW1lID0gZXZlbnQudGltZTsKLSAgICAgIGUuc3RhdGVNYXNrID0gZXZlbnQuc3RhdGVNYXNrOwotICAgICAgZS5kb2l0ID0gZXZlbnQuZG9pdDsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULlNlbGVjdGlvbiwgZSk7Ci0gICAgICBldmVudC5kb2l0ID0gZS5kb2l0OwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgU1dULlRyYXZlcnNlOiB7Ci0gICAgICBzd2l0Y2ggKGV2ZW50LmRldGFpbCkgewotICAgICAgICBjYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0gICAgICAgIGNhc2UgU1dULlRSQVZFUlNFX0VTQ0FQRToKLSAgICAgICAgY2FzZSBTV1QuVFJBVkVSU0VfQVJST1dfUFJFVklPVVM6Ci0gICAgICAgIGNhc2UgU1dULlRSQVZFUlNFX0FSUk9XX05FWFQ6Ci0gICAgICAgICAgZXZlbnQuZG9pdCA9IGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLSAgICAgIGUudGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICBlLmRldGFpbCA9IGV2ZW50LmRldGFpbDsKLSAgICAgIGUuZG9pdCA9IGV2ZW50LmRvaXQ7Ci0gICAgICBlLmNoYXJhY3RlciA9IGV2ZW50LmNoYXJhY3RlcjsKLSAgICAgIGUua2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5UcmF2ZXJzZSwgZSk7Ci0gICAgICBldmVudC5kb2l0ID0gZS5kb2l0OwotICAgICAgZXZlbnQuZGV0YWlsID0gZS5kZXRhaWw7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuS2V5VXA6IHsgICAKLSAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0gICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgZS5jaGFyYWN0ZXIgPSBldmVudC5jaGFyYWN0ZXI7Ci0gICAgICBlLmtleUNvZGUgPSBldmVudC5rZXlDb2RlOwotICAgICAgZS5zdGF0ZU1hc2sgPSBldmVudC5zdGF0ZU1hc2s7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5LZXlVcCwgZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuS2V5RG93bjogewotICAgICAgaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuRVNDKSB7IAotICAgICAgICAvLyBFc2NhcGUga2V5IGNhbmNlbHMgcG9wdXAgbGlzdAotICAgICAgICBkcm9wRG93biAoZmFsc2UpOwotICAgICAgfQotICAgICAgaWYgKChldmVudC5zdGF0ZU1hc2sgJiBTV1QuQUxUKSAhPSAwICYmIChldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19VUCB8fCBldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19ET1dOKSkgewotICAgICAgICBkcm9wRG93biAoZmFsc2UpOwotICAgICAgfQotICAgICAgaWYgKGV2ZW50LmNoYXJhY3RlciA9PSBTV1QuQ1IpIHsKLSAgICAgICAgLy8gRW50ZXIgY2F1c2VzIGRlZmF1bHQgc2VsZWN0aW9uCi0gICAgICAgIGRyb3BEb3duIChmYWxzZSk7Ci0gICAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0gICAgICAgIGUudGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICAgIGUuc3RhdGVNYXNrID0gZXZlbnQuc3RhdGVNYXNrOwotICAgICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5EZWZhdWx0U2VsZWN0aW9uLCBlKTsKLSAgICAgIH0KLSAgICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHdpZGdldCBtYXkgaGF2ZSBiZWVuIGRpc3Bvc2VkLgotICAgICAgLy8gSWYgc28sIGRvIG5vdCBjb250aW51ZS4KLSAgICAgIGlmIChpc0Rpc3Bvc2VkICgpKSBicmVhazsKLSAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQoKTsKLSAgICAgIGUudGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICBlLmNoYXJhY3RlciA9IGV2ZW50LmNoYXJhY3RlcjsKLSAgICAgIGUua2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0gICAgICBlLnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyhTV1QuS2V5RG93biwgZSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIH0KLSAgfQotfQotCi12b2lkIHBvcHVwRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgc3dpdGNoIChldmVudC50eXBlKSB7Ci0gICAgY2FzZSBTV1QuUGFpbnQ6Ci0gICAgICAvLyBkcmF3IGJsYWNrIHJlY3RhbmdsZSBhcm91bmQgbGlzdAotICAgICAgUmVjdGFuZ2xlIGxpc3RSZWN0ID0gbGlzdC5nZXRCb3VuZHMoKTsKLSAgICAgIENvbG9yIGJsYWNrID0gZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSyk7Ci0gICAgICBldmVudC5nYy5zZXRGb3JlZ3JvdW5kKGJsYWNrKTsKLSAgICAgIGV2ZW50LmdjLmRyYXdSZWN0YW5nbGUoMCwgMCwgbGlzdFJlY3Qud2lkdGggKyAxLCBsaXN0UmVjdC5oZWlnaHQgKyAxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1dULkNsb3NlOgotICAgICAgZXZlbnQuZG9pdCA9IGZhbHNlOwotICAgICAgZHJvcERvd24gKGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1dULkRlYWN0aXZhdGU6Ci0gICAgICBkcm9wRG93biAoZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLXB1YmxpYyB2b2lkIHJlZHJhdyAoKSB7Ci0gIHN1cGVyLnJlZHJhdygpOwotICB0ZXh0LnJlZHJhdygpOwotICBhcnJvdy5yZWRyYXcoKTsKLSAgaWYgKHBvcHVwLmlzVmlzaWJsZSgpKSBsaXN0LnJlZHJhdygpOwotfQotcHVibGljIHZvaWQgcmVkcmF3IChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbGVhbiBhbGwpIHsKLSAgc3VwZXIucmVkcmF3KHgsIHksIHdpZHRoLCBoZWlnaHQsIHRydWUpOwotfQotCi0vKioKLSAqIFJlbW92ZXMgdGhlIGl0ZW0gZnJvbSB0aGUgcmVjZWl2ZXIncyBsaXN0IGF0IHRoZSBnaXZlbgotICogemVyby1yZWxhdGl2ZSBpbmRleC4KLSAqCi0gKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IGZvciB0aGUgaXRlbQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX1JBTkdFIC0gaWYgdGhlIGluZGV4IGlzIG5vdCBiZXR3ZWVuIDAgYW5kIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgbWludXMgMSAoaW5jbHVzaXZlKTwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgcmVtb3ZlIChpbnQgaW5kZXgpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgbGlzdC5yZW1vdmUgKGluZGV4KTsKLX0KLS8qKgotICogUmVtb3ZlcyB0aGUgaXRlbXMgZnJvbSB0aGUgcmVjZWl2ZXIncyBsaXN0IHdoaWNoIGFyZQotICogYmV0d2VlbiB0aGUgZ2l2ZW4gemVyby1yZWxhdGl2ZSBzdGFydCBhbmQgZW5kIAotICogaW5kaWNlcyAoaW5jbHVzaXZlKS4KLSAqCi0gKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZQotICogQHBhcmFtIGVuZCB0aGUgZW5kIG9mIHRoZSByYW5nZQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX1JBTkdFIC0gaWYgZWl0aGVyIHRoZSBzdGFydCBvciBlbmQgYXJlIG5vdCBiZXR3ZWVuIDAgYW5kIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgbWludXMgMSAoaW5jbHVzaXZlKTwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgcmVtb3ZlIChpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgbGlzdC5yZW1vdmUgKHN0YXJ0LCBlbmQpOwotfQotLyoqCi0gKiBTZWFyY2hlcyB0aGUgcmVjZWl2ZXIncyBsaXN0IHN0YXJ0aW5nIGF0IHRoZSBmaXJzdCBpdGVtCi0gKiB1bnRpbCBhbiBpdGVtIGlzIGZvdW5kIHRoYXQgaXMgZXF1YWwgdG8gdGhlIGFyZ3VtZW50LCAKLSAqIGFuZCByZW1vdmVzIHRoYXQgaXRlbSBmcm9tIHRoZSBsaXN0LgotICoKLSAqIEBwYXJhbSBzdHJpbmcgdGhlIGl0ZW0gdG8gcmVtb3ZlCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgc3RyaW5nIGlzIG51bGw8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB0aGUgc3RyaW5nIGlzIG5vdCBmb3VuZCBpbiB0aGUgbGlzdDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgcmVtb3ZlIChTdHJpbmcgc3RyaW5nKSB7Ci0gIGNoZWNrV2lkZ2V0KCk7Ci0gIGlmIChzdHJpbmcgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gIGxpc3QucmVtb3ZlIChzdHJpbmcpOwotfQotLyoqCi0gKiBSZW1vdmVzIGFsbCBvZiB0aGUgaXRlbXMgZnJvbSB0aGUgcmVjZWl2ZXIncyBsaXN0IGFuZCBjbGVhciB0aGUKLSAqIGNvbnRlbnRzIG9mIHJlY2VpdmVyJ3MgdGV4dCBmaWVsZC4KLSAqIDxwPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgcmVtb3ZlQWxsICgpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgdGV4dC5zZXRUZXh0ICgiIik7IC8vJE5PTi1OTFMtMSQKLSAgbGlzdC5yZW1vdmVBbGwgKCk7Ci19Ci0vKioKLSAqIFJlbW92ZXMgdGhlIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsCi0gKiBiZSBub3RpZmllZCB3aGVuIHRoZSByZWNlaXZlcidzIHRleHQgaXMgbW9kaWZpZWQuCi0gKgotICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgbGlzdGVuZXIgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqCi0gKiBAc2VlIE1vZGlmeUxpc3RlbmVyCi0gKiBAc2VlICNhZGRNb2RpZnlMaXN0ZW5lcgotICovCi1wdWJsaWMgdm9pZCByZW1vdmVNb2RpZnlMaXN0ZW5lciAoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgY2hlY2tXaWRnZXQoKTsKLSAgaWYgKGxpc3RlbmVyID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICByZW1vdmVMaXN0ZW5lcihTV1QuTW9kaWZ5LCBsaXN0ZW5lcik7IAotfQotLyoqCi0gKiBSZW1vdmVzIHRoZSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbAotICogYmUgbm90aWZpZWQgd2hlbiB0aGUgcmVjZWl2ZXIncyBzZWxlY3Rpb24gY2hhbmdlcy4KLSAqCi0gKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBsaXN0ZW5lciBpcyBudWxsPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICoKLSAqIEBzZWUgU2VsZWN0aW9uTGlzdGVuZXIKLSAqIEBzZWUgI2FkZFNlbGVjdGlvbkxpc3RlbmVyCi0gKi8KLXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyIChTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICBjaGVja1dpZGdldCgpOwotICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gIHJlbW92ZUxpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLSAgcmVtb3ZlTGlzdGVuZXIoU1dULkRlZmF1bHRTZWxlY3Rpb24sbGlzdGVuZXIpOyAgCi19Ci0vKioKLSAqIFNlbGVjdHMgdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIHplcm8tcmVsYXRpdmUgaW5kZXggaW4gdGhlIHJlY2VpdmVyJ3MgCi0gKiBsaXN0LiAgSWYgdGhlIGl0ZW0gYXQgdGhlIGluZGV4IHdhcyBhbHJlYWR5IHNlbGVjdGVkLCBpdCByZW1haW5zCi0gKiBzZWxlY3RlZC4gSW5kaWNlcyB0aGF0IGFyZSBvdXQgb2YgcmFuZ2UgYXJlIGlnbm9yZWQuCi0gKgotICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byBzZWxlY3QKLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZWxlY3QgKGludCBpbmRleCkgewotICBjaGVja1dpZGdldCgpOwotICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICBsaXN0LmRlc2VsZWN0QWxsICgpOwotICAgIHRleHQuc2V0VGV4dCAoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgcmV0dXJuOwotICB9Ci0gIGlmICgwIDw9IGluZGV4ICYmIGluZGV4IDwgbGlzdC5nZXRJdGVtQ291bnQoKSkgewotICAgIGlmIChpbmRleCAhPSBnZXRTZWxlY3Rpb25JbmRleCgpKSB7Ci0gICAgICB0ZXh0LnNldFRleHQgKGxpc3QuZ2V0SXRlbSAoaW5kZXgpKTsKLSAgICAgIHRleHQuc2VsZWN0QWxsICgpOwotICAgICAgbGlzdC5zZWxlY3QgKGluZGV4KTsKLSAgICAgIGxpc3Quc2hvd1NlbGVjdGlvbiAoKTsKLSAgICB9Ci0gIH0KLX0KLXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmQgKENvbG9yIGNvbG9yKSB7Ci0gIHN1cGVyLnNldEJhY2tncm91bmQoY29sb3IpOwotICBiYWNrZ3JvdW5kID0gY29sb3I7Ci0gIGlmICh0ZXh0ICE9IG51bGwpIHRleHQuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0gIGlmIChsaXN0ICE9IG51bGwpIGxpc3Quc2V0QmFja2dyb3VuZChjb2xvcik7Ci0gIGlmIChhcnJvdyAhPSBudWxsKSBhcnJvdy5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLX0KLS8qKgotICogU2V0cyB0aGUgZWRpdGFibGUgc3RhdGUuCi0gKgotICogQHBhcmFtIGVkaXRhYmxlIHRoZSBuZXcgZWRpdGFibGUgc3RhdGUKLSAqCi0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlIChib29sZWFuIGVkaXRhYmxlKSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICB0ZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLX0KLXB1YmxpYyB2b2lkIHNldEVuYWJsZWQgKGJvb2xlYW4gZW5hYmxlZCkgewotICBzdXBlci5zZXRFbmFibGVkKGVuYWJsZWQpOwotICBpZiAocG9wdXAgIT0gbnVsbCkgcG9wdXAuc2V0VmlzaWJsZSAoZmFsc2UpOwotICBpZiAodGV4dCAhPSBudWxsKSB0ZXh0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gIGlmIChhcnJvdyAhPSBudWxsKSBhcnJvdy5zZXRFbmFibGVkKGVuYWJsZWQpOwotfQotcHVibGljIGJvb2xlYW4gc2V0Rm9jdXMgKCkgewotICBjaGVja1dpZGdldCgpOwotICByZXR1cm4gdGV4dC5zZXRGb2N1cyAoKTsKLX0KLXB1YmxpYyB2b2lkIHNldEZvbnQgKEZvbnQgZm9udCkgewotICBzdXBlci5zZXRGb250IChmb250KTsKLSAgdGhpcy5mb250ID0gZm9udDsKLSAgdGV4dC5zZXRGb250IChmb250KTsKLSAgbGlzdC5zZXRGb250IChmb250KTsKLSAgaW50ZXJuYWxMYXlvdXQgKHRydWUpOwotfQotcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZCAoQ29sb3IgY29sb3IpIHsKLSAgc3VwZXIuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0gIGZvcmVncm91bmQgPSBjb2xvcjsKLSAgaWYgKHRleHQgIT0gbnVsbCkgdGV4dC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLSAgaWYgKGxpc3QgIT0gbnVsbCkgbGlzdC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLSAgaWYgKGFycm93ICE9IG51bGwpIGFycm93LnNldEZvcmVncm91bmQoY29sb3IpOwotfQotLyoqCi0gKiBTZXRzIHRoZSB0ZXh0IG9mIHRoZSBpdGVtIGluIHRoZSByZWNlaXZlcidzIGxpc3QgYXQgdGhlIGdpdmVuCi0gKiB6ZXJvLXJlbGF0aXZlIGluZGV4IHRvIHRoZSBzdHJpbmcgYXJndW1lbnQuIFRoaXMgaXMgZXF1aXZhbGVudAotICogdG8gPGNvZGU+cmVtb3ZlPC9jb2RlPidpbmcgdGhlIG9sZCBpdGVtIGF0IHRoZSBpbmRleCwgYW5kIHRoZW4KLSAqIDxjb2RlPmFkZDwvY29kZT4naW5nIHRoZSBuZXcgaXRlbSBhdCB0aGF0IGluZGV4LgotICoKLSAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggZm9yIHRoZSBpdGVtCi0gKiBAcGFyYW0gc3RyaW5nIHRoZSBuZXcgdGV4dCBmb3IgdGhlIGl0ZW0KLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9SQU5HRSAtIGlmIHRoZSBpbmRleCBpcyBub3QgYmV0d2VlbiAwIGFuZCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IG1pbnVzIDEgKGluY2x1c2l2ZSk8L2xpPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgc3RyaW5nIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldEl0ZW0gKGludCBpbmRleCwgU3RyaW5nIHN0cmluZykgewotICBjaGVja1dpZGdldCgpOwotICBsaXN0LnNldEl0ZW0gKGluZGV4LCBzdHJpbmcpOwotfQotLyoqCi0gKiBTZXRzIHRoZSByZWNlaXZlcidzIGxpc3QgdG8gYmUgdGhlIGdpdmVuIGFycmF5IG9mIGl0ZW1zLgotICoKLSAqIEBwYXJhbSBpdGVtcyB0aGUgYXJyYXkgb2YgaXRlbXMKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBpdGVtcyBhcnJheSBpcyBudWxsPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgYW4gaXRlbSBpbiB0aGUgaXRlbXMgYXJyYXkgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0SXRlbXMgKFN0cmluZyBbXSBpdGVtcykgewotICBjaGVja1dpZGdldCAoKTsKLSAgbGlzdC5zZXRJdGVtcyAoaXRlbXMpOwotICBpZiAoIXRleHQuZ2V0RWRpdGFibGUgKCkpIHRleHQuc2V0VGV4dCAoIiIpOyAvLyROT04tTkxTLTEkCi19Ci0vKioKLSAqIFNldHMgdGhlIGxheW91dCB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY2VpdmVyIHRvIGJlCi0gKiB0aGUgYXJndW1lbnQgd2hpY2ggbWF5IGJlIG51bGwuCi0gKiA8cD4KLSAqIE5vdGU6IE5vIExheW91dCBjYW4gYmUgc2V0IG9uIHRoaXMgQ29udHJvbCBiZWNhdXNlIGl0IGFscmVhZHkKLSAqIG1hbmFnZXMgdGhlIHNpemUgYW5kIHBvc2l0aW9uIG9mIGl0cyBjaGlsZHJlbi4KLSAqIDwvcD4KLSAqCi0gKiBAcGFyYW0gbGF5b3V0IHRoZSByZWNlaXZlcidzIG5ldyBsYXlvdXQgb3IgbnVsbAotICoKLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldExheW91dCAoTGF5b3V0IGxheW91dCkgewotICBjaGVja1dpZGdldCAoKTsKLSAgcmV0dXJuOwotfQotcHVibGljIHZvaWQgc2V0TWVudShNZW51IG1lbnUpIHsKLSAgdGV4dC5zZXRNZW51KG1lbnUpOwotfQotLyoqCi0gKiBTZXRzIHRoZSBzZWxlY3Rpb24gaW4gdGhlIHJlY2VpdmVyJ3MgdGV4dCBmaWVsZCB0byB0aGUKLSAqIHJhbmdlIHNwZWNpZmllZCBieSB0aGUgYXJndW1lbnQgd2hvc2UgeCBjb29yZGluYXRlIGlzIHRoZQotICogc3RhcnQgb2YgdGhlIHNlbGVjdGlvbiBhbmQgd2hvc2UgeSBjb29yZGluYXRlIGlzIHRoZSBlbmQKLSAqIG9mIHRoZSBzZWxlY3Rpb24uIAotICoKLSAqIEBwYXJhbSBzZWxlY3Rpb24gYSBwb2ludCByZXByZXNlbnRpbmcgdGhlIG5ldyBzZWxlY3Rpb24gc3RhcnQgYW5kIGVuZAotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHBvaW50IGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbiAoUG9pbnQgc2VsZWN0aW9uKSB7Ci0gIGNoZWNrV2lkZ2V0KCk7Ci0gIGlmIChzZWxlY3Rpb24gPT0gbnVsbCkgU1dULmVycm9yIChTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0gIHRleHQuc2V0U2VsZWN0aW9uIChzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLnkpOwotfQotCi0vKioKLSAqIFNldHMgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWNlaXZlcidzIHRleHQgZmllbGQgdG8gdGhlCi0gKiBnaXZlbiBzdHJpbmcuCi0gKiA8cD4KLSAqIE5vdGU6IFRoZSB0ZXh0IGZpZWxkIGluIGEgPGNvZGU+Q29tYm88L2NvZGU+IGlzIHR5cGljYWxseQotICogb25seSBjYXBhYmxlIG9mIGRpc3BsYXlpbmcgYSBzaW5nbGUgbGluZSBvZiB0ZXh0LiBUaHVzLAotICogc2V0dGluZyB0aGUgdGV4dCB0byBhIHN0cmluZyBjb250YWluaW5nIGxpbmUgYnJlYWtzIG9yCi0gKiBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMgd2lsbCBwcm9iYWJseSBjYXVzZSBpdCB0byAKLSAqIGRpc3BsYXkgaW5jb3JyZWN0bHkuCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIHN0cmluZyB0aGUgbmV3IHRleHQKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBzdHJpbmcgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9XSURHRVRfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotICogICAgPGxpPkVSUk9SX1RIUkVBRF9JTlZBTElEX0FDQ0VTUyAtIGlmIG5vdCBjYWxsZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY3JlYXRlZCB0aGUgcmVjZWl2ZXI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0VGV4dCAoU3RyaW5nIHN0cmluZykgewotICBjaGVja1dpZGdldCgpOwotICBpZiAoc3RyaW5nID09IG51bGwpIFNXVC5lcnJvciAoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotICBpbnQgaW5kZXggPSBsaXN0LmluZGV4T2YgKHN0cmluZyk7Ci0gIGlmIChpbmRleCA9PSAtMSkgewotICAgIGxpc3QuZGVzZWxlY3RBbGwgKCk7Ci0gICAgdGV4dC5zZXRUZXh0IChzdHJpbmcpOwotICAgIHJldHVybjsKLSAgfQotICB0ZXh0LnNldFRleHQgKHN0cmluZyk7Ci0gIHRleHQuc2VsZWN0QWxsICgpOwotICBsaXN0LnNldFNlbGVjdGlvbiAoaW5kZXgpOwotICBsaXN0LnNob3dTZWxlY3Rpb24gKCk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCB0aGUgcmVjZWl2ZXIncwotICogdGV4dCBmaWVsZCBpcyBjYXBhYmxlIG9mIGhvbGRpbmcgdG8gYmUgdGhlIGFyZ3VtZW50LgotICoKLSAqIEBwYXJhbSBsaW1pdCBuZXcgdGV4dCBsaW1pdAotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9DQU5OT1RfQkVfWkVSTyAtIGlmIHRoZSBsaW1pdCBpcyB6ZXJvPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIG9yZy5lY2xpcHNlLnN3dC5TV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX1dJREdFVF9ESVNQT1NFRCAtIGlmIHRoZSByZWNlaXZlciBoYXMgYmVlbiBkaXNwb3NlZDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVEhSRUFEX0lOVkFMSURfQUNDRVNTIC0gaWYgbm90IGNhbGxlZCBmcm9tIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVkIHRoZSByZWNlaXZlcjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBzZXRUZXh0TGltaXQgKGludCBsaW1pdCkgewotICBjaGVja1dpZGdldCgpOwotICB0ZXh0LnNldFRleHRMaW1pdCAobGltaXQpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRUb29sVGlwVGV4dCAoU3RyaW5nIHN0cmluZykgewotICBjaGVja1dpZGdldCgpOwotICBzdXBlci5zZXRUb29sVGlwVGV4dChzdHJpbmcpOwotICBhcnJvdy5zZXRUb29sVGlwVGV4dCAoc3RyaW5nKTsKLSAgdGV4dC5zZXRUb29sVGlwVGV4dCAoc3RyaW5nKTsgICAKLX0KLQotcHVibGljIHZvaWQgc2V0VmlzaWJsZSAoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gIHN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0gIGlmICghdmlzaWJsZSkgcG9wdXAuc2V0VmlzaWJsZShmYWxzZSk7Ci19Ci0vKioKLSAqIFNldHMgdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IGFyZSB2aXNpYmxlIGluIHRoZSBkcm9wCi0gKiBkb3duIHBvcnRpb24gb2YgdGhlIHJlY2VpdmVyJ3MgbGlzdC4KLSAqCi0gKiBAcGFyYW0gY291bnQgdGhlIG5ldyBudW1iZXIgb2YgaXRlbXMgdG8gYmUgdmlzaWJsZQotICoKLSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfV0lER0VUX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLSAqICAgIDxsaT5FUlJPUl9USFJFQURfSU5WQUxJRF9BQ0NFU1MgLSBpZiBub3QgY2FsbGVkIGZyb20gdGhlIHRocmVhZCB0aGF0IGNyZWF0ZWQgdGhlIHJlY2VpdmVyPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIHZvaWQgc2V0VmlzaWJsZUl0ZW1Db3VudCAoaW50IGNvdW50KSB7Ci0gIGNoZWNrV2lkZ2V0ICgpOwotICBpZiAoY291bnQgPCAwKSByZXR1cm47Ci0gIHZpc2libGVJdGVtQ291bnQgPSBjb3VudDsKLX0KLVN0cmluZyBzdHJpcE1uZW1vbmljIChTdHJpbmcgc3RyaW5nKSB7Ci0gIGludCBpbmRleCA9IDA7Ci0gIGludCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoICgpOwotICBkbyB7Ci0gICAgd2hpbGUgKChpbmRleCA8IGxlbmd0aCkgJiYgKHN0cmluZy5jaGFyQXQgKGluZGV4KSAhPSAnJicpKSBpbmRleCsrOwotICAgIGlmICgrK2luZGV4ID49IGxlbmd0aCkgcmV0dXJuIHN0cmluZzsKLSAgICBpZiAoc3RyaW5nLmNoYXJBdCAoaW5kZXgpICE9ICcmJykgewotICAgICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgtMSkgKyBzdHJpbmcuc3Vic3RyaW5nKGluZGV4LCBsZW5ndGgpOwotICAgIH0KLSAgICBpbmRleCsrOwotICB9IHdoaWxlIChpbmRleCA8IGxlbmd0aCk7Ci0gIHJldHVybiBzdHJpbmc7Ci19Ci12b2lkIHRleHRFdmVudCAoRXZlbnQgZXZlbnQpIHsKLSAgc3dpdGNoIChldmVudC50eXBlKSB7Ci0gICAgY2FzZSBTV1QuRm9jdXNJbjogewotICAgICAgaGFuZGxlRm9jdXMgKFNXVC5Gb2N1c0luKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFNXVC5LZXlEb3duOiB7Ci0gICAgICBpZiAoZXZlbnQuY2hhcmFjdGVyID09IFNXVC5DUikgewotICAgICAgICBkcm9wRG93biAoZmFsc2UpOwotICAgICAgICBFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotICAgICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgICBlLnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXJzIChTV1QuRGVmYXVsdFNlbGVjdGlvbiwgZSk7Ci0gICAgICB9Ci0gICAgICAvL0F0IHRoaXMgcG9pbnQgdGhlIHdpZGdldCBtYXkgaGF2ZSBiZWVuIGRpc3Bvc2VkLgotICAgICAgLy8gSWYgc28sIGRvIG5vdCBjb250aW51ZS4KLSAgICAgIGlmIChpc0Rpc3Bvc2VkICgpKSBicmVhazsKLSAgICAgIAotICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX1VQIHx8IGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX0RPV04pIHsKLSAgICAgICAgZXZlbnQuZG9pdCA9IGZhbHNlOwotICAgICAgICBpZiAoKGV2ZW50LnN0YXRlTWFzayAmIFNXVC5BTFQpICE9IDApIHsKLSAgICAgICAgICBib29sZWFuIGRyb3BwZWQgPSBpc0Ryb3BwZWQgKCk7Ci0gICAgICAgICAgdGV4dC5zZWxlY3RBbGwgKCk7Ci0gICAgICAgICAgaWYgKCFkcm9wcGVkKSBzZXRGb2N1cyAoKTsKLSAgICAgICAgICBkcm9wRG93biAoIWRyb3BwZWQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG9sZEluZGV4ID0gZ2V0U2VsZWN0aW9uSW5kZXggKCk7Ci0gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19VUCkgewotICAgICAgICAgIHNlbGVjdCAoTWF0aC5tYXggKG9sZEluZGV4IC0gMSwgMCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHNlbGVjdCAoTWF0aC5taW4gKG9sZEluZGV4ICsgMSwgZ2V0SXRlbUNvdW50ICgpIC0gMSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvbGRJbmRleCAhPSBnZXRTZWxlY3Rpb25JbmRleCAoKSkgewotICAgICAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQoKTsKLSAgICAgICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgICAgIGUuc3RhdGVNYXNrID0gZXZlbnQuc3RhdGVNYXNrOwotICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULlNlbGVjdGlvbiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9BdCB0aGlzIHBvaW50IHRoZSB3aWRnZXQgbWF5IGhhdmUgYmVlbiBkaXNwb3NlZC4KLSAgICAgICAgLy8gSWYgc28sIGRvIG5vdCBjb250aW51ZS4KLSAgICAgICAgaWYgKGlzRGlzcG9zZWQgKCkpIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBGdXJ0aGVyIHdvcmsgOiBOZWVkIHRvIGFkZCBzdXBwb3J0IGZvciBpbmNyZW1lbnRhbCBzZWFyY2ggaW4gCi0gICAgICAvLyBwb3AgdXAgbGlzdCBhcyBjaGFyYWN0ZXJzIHR5cGVkIGluIHRleHQgd2lkZ2V0Ci0gICAgICAgICAgICAKLSAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0gICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgZS5jaGFyYWN0ZXIgPSBldmVudC5jaGFyYWN0ZXI7Ci0gICAgICBlLmtleUNvZGUgPSBldmVudC5rZXlDb2RlOwotICAgICAgZS5zdGF0ZU1hc2sgPSBldmVudC5zdGF0ZU1hc2s7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5LZXlEb3duLCBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFNXVC5LZXlVcDogewotICAgICAgRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLSAgICAgIGUudGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICBlLmNoYXJhY3RlciA9IGV2ZW50LmNoYXJhY3RlcjsKLSAgICAgIGUua2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0gICAgICBlLnN0YXRlTWFzayA9IGV2ZW50LnN0YXRlTWFzazsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULktleVVwLCBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFNXVC5NZW51RGV0ZWN0OiB7Ci0gICAgICBFdmVudCBlID0gbmV3IEV2ZW50ICgpOwotICAgICAgZS50aW1lID0gZXZlbnQudGltZTsKLSAgICAgIG5vdGlmeUxpc3RlbmVycyAoU1dULk1lbnVEZXRlY3QsIGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgU1dULk1vZGlmeTogewotICAgICAgbGlzdC5kZXNlbGVjdEFsbCAoKTsKLSAgICAgIEV2ZW50IGUgPSBuZXcgRXZlbnQgKCk7Ci0gICAgICBlLnRpbWUgPSBldmVudC50aW1lOwotICAgICAgbm90aWZ5TGlzdGVuZXJzIChTV1QuTW9kaWZ5LCBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFNXVC5Nb3VzZURvd246IHsKLSAgICAgIGlmIChldmVudC5idXR0b24gIT0gMSkgcmV0dXJuOwotICAgICAgaWYgKHRleHQuZ2V0RWRpdGFibGUgKCkpIHJldHVybjsKLSAgICAgIGJvb2xlYW4gZHJvcHBlZCA9IGlzRHJvcHBlZCAoKTsKLSAgICAgIHRleHQuc2VsZWN0QWxsICgpOwotICAgICAgaWYgKCFkcm9wcGVkKSBzZXRGb2N1cyAoKTsKLSAgICAgIGRyb3BEb3duICghZHJvcHBlZCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuTW91c2VVcDogewotICAgICAgaWYgKGV2ZW50LmJ1dHRvbiAhPSAxKSByZXR1cm47Ci0gICAgICBpZiAodGV4dC5nZXRFZGl0YWJsZSAoKSkgcmV0dXJuOwotICAgICAgdGV4dC5zZWxlY3RBbGwgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTV1QuVHJhdmVyc2U6IHsgICAgCi0gICAgICBzd2l0Y2ggKGV2ZW50LmRldGFpbCkgewotICAgICAgICBjYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0gICAgICAgIGNhc2UgU1dULlRSQVZFUlNFX0FSUk9XX1BSRVZJT1VTOgotICAgICAgICBjYXNlIFNXVC5UUkFWRVJTRV9BUlJPV19ORVhUOgotICAgICAgICAgIC8vIFRoZSBlbnRlciBjYXVzZXMgZGVmYXVsdCBzZWxlY3Rpb24gYW5kCi0gICAgICAgICAgLy8gdGhlIGFycm93IGtleXMgYXJlIHVzZWQgdG8gbWFuaXB1bGF0ZSB0aGUgbGlzdCBjb250ZW50cyBzbwotICAgICAgICAgIC8vIGRvIG5vdCB1c2UgdGhlbSBmb3IgdHJhdmVyc2FsLgotICAgICAgICAgIGV2ZW50LmRvaXQgPSBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLSAgICAgIGUudGltZSA9IGV2ZW50LnRpbWU7Ci0gICAgICBlLmRldGFpbCA9IGV2ZW50LmRldGFpbDsKLSAgICAgIGUuZG9pdCA9IGV2ZW50LmRvaXQ7Ci0gICAgICBlLmNoYXJhY3RlciA9IGV2ZW50LmNoYXJhY3RlcjsKLSAgICAgIGUua2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0gICAgICBub3RpZnlMaXN0ZW5lcnMgKFNXVC5UcmF2ZXJzZSwgZSk7Ci0gICAgICBldmVudC5kb2l0ID0gZS5kb2l0OwotICAgICAgZXZlbnQuZGV0YWlsID0gZS5kZXRhaWw7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9JQW5ub3RhdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vSUFubm90YXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjZkNDM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9JQW5ub3RhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduOwotCi1wdWJsaWMgaW50ZXJmYWNlIElBbm5vdGF0aW9uUHJvdmlkZXIKLXsKLSAgU3RyaW5nIGdldE5hbWVBbm5vdGF0aW9uU3RyaW5nKCk7Ci0gIFN0cmluZyBnZXROYW1lQW5ub3RhdGlvblRvb2xUaXBTdHJpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9JS2V5Ym9hcmREcmFnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vSUtleWJvYXJkRHJhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTA2OTIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9JS2V5Ym9hcmREcmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElLZXlib2FyZERyYWcgewotCi0JcHVibGljIHZvaWQgcGVyZm9ybUtleWJvYXJkRHJhZyAoR3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLCBpbnQgZGlyZWN0aW9uKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0ltYWdlT3ZlcmxheURlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9JbWFnZU92ZXJsYXlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMmE2NzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL0ltYWdlT3ZlcmxheURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db21wb3NpdGVJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIEltYWdlT3ZlcmxheURlc2NyaXB0b3IgZXh0ZW5kcyBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IKLXsKLSAgcHJvdGVjdGVkIEltYWdlIGJhc2VJbWFnZTsKLSAgcHJvdGVjdGVkIEltYWdlIGV4dGVuc2lvbk92ZXJsYXksIGRpc2FibGVkRXh0ZW5zaW9uT3ZlcmxheTsKLSAgcHJvdGVjdGVkIFBvaW50IGltYWdlU2l6ZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWFkT25seTsKLSAgCi0gIHB1YmxpYyBJbWFnZU92ZXJsYXlEZXNjcmlwdG9yKEltYWdlIGJhc2VJbWFnZSwgYm9vbGVhbiBpc1JlYWRPbmx5KQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLmJhc2VJbWFnZSA9IGJhc2VJbWFnZTsKLSAgICB0aGlzLmlzUmVhZE9ubHkgPSBpc1JlYWRPbmx5OwotICAgIGltYWdlU2l6ZSA9IG5ldyBQb2ludChiYXNlSW1hZ2UuZ2V0Qm91bmRzKCkud2lkdGgsIGJhc2VJbWFnZS5nZXRCb3VuZHMoKS5oZWlnaHQpOwotICAgIGV4dGVuc2lvbk92ZXJsYXkgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigib3ZyMTYvZXh0bnNuX292ci5naWYiKTsgIC8vJE5PTi1OTFMtMSQgCi0gICAgZGlzYWJsZWRFeHRlbnNpb25PdmVybGF5ID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldEljb24oIm92cjE2L2V4dG5zbmRpc19vdnIuZ2lmIik7ICAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZUltYWdlKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCi0gIHsKLSAgICBkcmF3SW1hZ2UoYmFzZUltYWdlLmdldEltYWdlRGF0YSgpLCAwLCAwKTsKLSAgICBJbWFnZURhdGEgZXh0ZW5zaW9uSW1hZ2VEYXRhOwotICAgIGlmIChpc1JlYWRPbmx5KQotICAgIHsKLSAgICAgIGV4dGVuc2lvbkltYWdlRGF0YSA9IGRpc2FibGVkRXh0ZW5zaW9uT3ZlcmxheS5nZXRJbWFnZURhdGEoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGV4dGVuc2lvbkltYWdlRGF0YSA9IGV4dGVuc2lvbk92ZXJsYXkuZ2V0SW1hZ2VEYXRhKCk7Ci0gICAgfQotICAgIGRyYXdJbWFnZSAoZXh0ZW5zaW9uSW1hZ2VEYXRhLCBpbWFnZVNpemUueCAtIGV4dGVuc2lvbkltYWdlRGF0YS53aWR0aCwgMCk7ICAvLyBUb3AgUmlnaHQgY29ybmVyCi0gIH0KLQotICBwcm90ZWN0ZWQgUG9pbnQgZ2V0U2l6ZSgpCi0gIHsKLSAgICByZXR1cm4gaW1hZ2VTaXplOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9BRFRDb21ib0JveENlbGxFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0FEVENvbWJvQm94Q2VsbEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzY2ODNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0FEVENvbWJvQm94Q2VsbEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib0JveENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlR5cGVkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLk1lc3NhZ2VzOwotCi0vKgotICogVGhpcyB3cmFwcyB0aGUgQ29tYm9Cb3hDZWxsRWRpdG9yLgotICogV2UgbmVlZCB0byBhcHBseSBhbmQgZGVhY3RpdmF0ZSB0aGUgY29tYm8gb24gYSBzaW5nbGUgY2xpY2sgKG5vdCBvbiBhIGRvdWJsZSBjbGljayBsaWtlCi0gKiB0aGUgQ29tYm9Cb3hDZWxsRWRpdG9yKS4KLSAqLwotcHVibGljIGNsYXNzIEFEVENvbWJvQm94Q2VsbEVkaXRvciBleHRlbmRzIENvbWJvQm94Q2VsbEVkaXRvcgotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgYWR0RGVmYXVsdFN0eWxlID0gU1dULk5PTkU7Ci0KLSAgLyoqCi0gICAqIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZSBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgY2VsbC4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBjb250aW51ZUFwcGx5OwotICBwcml2YXRlIGJvb2xlYW4gaXNUcmF2ZXJzaW5nID0gZmFsc2U7Ci0gIHByaXZhdGUgT2JqZWN0IHNlbGVjdGVkVmFsdWU7Ci0gIHByaXZhdGUgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgY29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci0gIAotICAvLyBUaGlzIHByZXZlbnRzIHRoZSBjZWxsIGVkaXRvciBmcm9tIGJlaW5nIGRlYWN0aXZhdGVkIHdoaWxlIGhhbmRsaW5nIHRoZSBOZXcgb3IgQnJvd3NlIHNlbGVjdGlvbi4KLSAgcHJpdmF0ZSBib29sZWFuIGlzSGFuZGxpbmdTZWxlY3Rpb24gPSBmYWxzZTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBjZWxsIGVkaXRvciB3aXRoIGEgY29tYm8gY29udGFpbmluZyB0aGUgZ2l2ZW4gbGlzdCBvZiBjaG9pY2VzCi0gICAqIGFuZCBwYXJlbnRlZCB1bmRlciB0aGUgZ2l2ZW4gY29udHJvbC4gVGhlIGNlbGwgZWRpdG9yIHZhbHVlIGlzIHRoZQotICAgKiB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpdGVtLiBJbml0aWFsbHksIHRoZSBjZWxsIGVkaXRvciBoYXMgbm8KLSAgICogY2VsbCB2YWxpZGF0b3IgYW5kIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0IGlzIHNlbGVjdGVkLgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudAotICAgKiAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLSAgICogQHBhcmFtIGl0ZW1zCi0gICAqICAgICAgICAgIHRoZSBsaXN0IG9mIHN0cmluZ3MgZm9yIHRoZSBjb21ibyBib3gKLSAgICovCi0gIHB1YmxpYyBBRFRDb21ib0JveENlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nW10gaXRlbXMsIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGVkaXRNYW5hZ2VyKQotICB7Ci0gICAgc3VwZXIocGFyZW50LCBpdGVtcywgYWR0RGVmYXVsdFN0eWxlIHwgU1dULlJFQURfT05MWSk7Ci0gICAgc2V0SXRlbXMoaXRlbXMpOwotICAgIGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyID0gZWRpdE1hbmFnZXI7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVtb3ZlTGlzdGVuZXJzKENDb21ibyBjb21ib0JveCwgaW50IGV2ZW50KQotICB7Ci0gICAgTGlzdGVuZXIgW10gbGlzdGVuZXJzID0gY29tYm9Cb3guZ2V0TGlzdGVuZXJzKGV2ZW50KTsKLSAgICBpbnQgbGVuZ3RoID0gbGlzdGVuZXJzLmxlbmd0aDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIExpc3RlbmVyIGwgPSBsaXN0ZW5lcnNbaV07Ci0gICAgICBpZiAobCBpbnN0YW5jZW9mIFR5cGVkTGlzdGVuZXIpCi0gICAgICB7Ci0gICAgICAgIFR5cGVkTGlzdGVuZXIgdHlwZWRMaXN0ZW5lciA9IChUeXBlZExpc3RlbmVyKWw7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSB0eXBlZExpc3RlbmVyLmdldEV2ZW50TGlzdGVuZXIoKS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKTsKLSAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZXJlIGFyZSBvdGhlciB0eXBlZCBsaXN0ZW5lcnMgYWRkZWQgdG8gdGhlIENDb21iby4KLSAgICAgICAgLy8gQ3VycmVudGx5IHRoZXJlIGFyZSBub25lLCBidXQgYXMgYW4gZXh0cmEgY2hlY2ssIEkgd2FudCB0byBlbnN1cmUgCi0gICAgICAgIC8vIEknbSByZW1vdmluZyB0aGUgb25lcyBhZGRlZCBmcm9tIHRoZSBpbmhlcml0ZWQgY2xhc3MuCi0gICAgICAgIC8vIEkndmUgdGVzdGVkIHRoaXMgYW5kIEkga25vdyBpdCByZW1vdmVzIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIC8vIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9Cb3hDZWxsRWRpdG9yJDIKLSAgICAgICAgLy8gb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib0JveENlbGxFZGl0b3IkNAotICAgICAgICAvLyB3aGljaCBhcmUgaW5kZWVkIHRoZSBvbmVzIEknbSBjdXN0b21pemluZwotICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLmNvbnRhaW5zKCJvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvQm94Q2VsbEVkaXRvciIpKQotICAgICAgICB7Ci0gICAgICAgICAgY29tYm9Cb3gucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGwpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvKgotICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBDZWxsRWRpdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ0NvbWJvIGNvbWJvQm94ID0gKENDb21ibylzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0KLSAgICBjb21ib0JveC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0gICAgLy8gTmVlZCB0byByZW1vdmUgdGhlIGxpc3RlbmVycyBhZGRlZCBmcm9tIENvbWJvQm94Q2VsbEVkaXRvcgotICAgIHJlbW92ZUxpc3RlbmVycyhjb21ib0JveCwgU1dULlNlbGVjdGlvbik7Ci0gICAgcmVtb3ZlTGlzdGVuZXJzKGNvbWJvQm94LCBTV1QuRGVmYXVsdFNlbGVjdGlvbik7Ci0gICAgcmVtb3ZlTGlzdGVuZXJzKGNvbWJvQm94LCBTV1QuRm9jdXNJbik7Ci0gICAgcmVtb3ZlTGlzdGVuZXJzKGNvbWJvQm94LCBTV1QuRm9jdXNPdXQpOwotICAgIAotICAgIC8vIE5vdyBhZGQgb3VyIGN1c3RvbSBsaXN0ZW5lcnMKLSAgICBjb21ib0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgICAvLyBXYW50IHRoZSBzYW1lIGJlaGF2aW91ciBzaW5jZSBoaXR0aW5nIHJldHVybiBvbiBCcm93c2Ugb3IgTmV3IHNob3VsZCBsYXVuY2ggdGhlIGRpYWxvZ3MsCi0gICAgICAgIC8vIGFuZCBub3QgaW1tZWRpYXRlbHkgYXBwbHkgdGhlIHZhbHVlCi0vLyAgICAgIGFwcGx5RWRpdG9yVmFsdWVBbmREZWFjdGl2YXRlKCk7Ci0gICAgICAgIHdpZGdldFNlbGVjdGVkKGV2ZW50KTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIGNvbnRpbnVlQXBwbHkgPSB0cnVlOwotICAgICAgICBDQ29tYm8gY29tYm9Cb3ggPSBnZXRDQ29tYm8oKTsKLSAgICAgICAgaXNIYW5kbGluZ1NlbGVjdGlvbiA9IHRydWU7Ci0gICAgICAgIE9iamVjdCBuZXdWYWx1ZSA9IG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnQgc2VsZWN0aW9uID0gY29tYm9Cb3guZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICBpZiAoaXNUcmF2ZXJzaW5nKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzVHJhdmVyc2luZyA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLQotICAgICAgICAgIFN0cmluZ1tdIGl0ZW1zID0gZ2V0SXRlbXMoKTsKLSAgICAgICAgICBTdHJpbmcgc3RyaW5nU2VsZWN0aW9uID0gaXRlbXNbc2VsZWN0aW9uXTsKLQotICAgICAgICAgIGlmIChzdHJpbmdTZWxlY3Rpb24uZXF1YWxzKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQlJPV1NFKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjb250aW51ZUFwcGx5ID0gdHJ1ZTsKLSAgICAgICAgICAgIG5ld1ZhbHVlID0gaW52b2tlRGlhbG9nKGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLmdldEJyb3dzZURpYWxvZygpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoc3RyaW5nU2VsZWN0aW9uLmVxdWFscyhNZXNzYWdlcy5fVUlfQUNUSU9OX05FVykpCi0gICAgICAgICAgewotICAgICAgICAgICAgY29udGludWVBcHBseSA9IHRydWU7Ci0gICAgICAgICAgICBuZXdWYWx1ZSA9IGludm9rZURpYWxvZyhjb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5nZXROZXdEaWFsb2coKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGlzSGFuZGxpbmdTZWxlY3Rpb24gPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb250aW51ZUFwcGx5KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG5ld1ZhbHVlID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW50IGluZGV4ID0gY29tYm9Cb3guZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZSA9IGNvbWJvQm94LmdldEl0ZW0oaW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZSA9IG5ld1ZhbHVlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGFwcGx5RWRpdG9yVmFsdWVBbmREZWFjdGl2YXRlKCk7Ci0gICAgICAgICAgZm9jdXNMb3N0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIGNvbWJvQm94LmFkZFRyYXZlcnNlTGlzdGVuZXIobmV3IFRyYXZlcnNlTGlzdGVuZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIGtleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50IGUpCi0gICAgICB7Ci0gICAgICAgIGlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfQVJST1dfTkVYVCB8fCBlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfQVJST1dfUFJFVklPVVMpCi0gICAgICAgIHsKLSAgICAgICAgICBpc1RyYXZlcnNpbmcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBjb21ib0JveC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpCi0gICAgICB7Ci0gICAgICAgIGlmICghaXNIYW5kbGluZ1NlbGVjdGlvbikKLSAgICAgICAgICBBRFRDb21ib0JveENlbGxFZGl0b3IudGhpcy5mb2N1c0xvc3QoKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICByZXR1cm4gY29tYm9Cb3g7Ci0gIH0KLQotICBwcml2YXRlIE9iamVjdCBpbnZva2VEaWFsb2coSUNvbXBvbmVudERpYWxvZyBkaWFsb2cpCi0gIHsKLSAgICBPYmplY3QgbmV3VmFsdWUgPSBudWxsOwotCi0gICAgaWYgKGRpYWxvZyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8vZGlhbG9nLnNldEluaXRpYWxDb21wb25lbnQoc2V0T2JqZWN0KTsKLSAgICBpZiAoZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKSA9PSBXaW5kb3cuT0spCi0gICAgewotICAgICAgbmV3VmFsdWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNvbnRpbnVlQXBwbHkgPSBmYWxzZTsKLSAgICAgIGZvY3VzTG9zdCgpOwotICAgIH0KLQotICAgIHJldHVybiBuZXdWYWx1ZTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0U2VsZWN0ZWRWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0ZWRWYWx1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCBDQ29tYm8gZ2V0Q0NvbWJvKCkKLSAgewotICAgIHJldHVybiAoQ0NvbWJvKWdldENvbnRyb2woKTsKLSAgfQotICAKLS8vLy8vLy8vLyBDb21ib0JveCBjZWxsIGVkaXRvciAgCi0KLSAgdm9pZCBhcHBseUVkaXRvclZhbHVlQW5kRGVhY3RpdmF0ZSgpCi0gIHsKLSAgICAvLyBtdXN0IHNldCB0aGUgc2VsZWN0aW9uIGJlZm9yZSBnZXR0aW5nIHZhbHVlCi0gICAgQ0NvbWJvIGNvbWJvQm94ID0gZ2V0Q0NvbWJvKCk7Ci0gICAgU3RyaW5nW10gaXRlbXMgPSBnZXRJdGVtcygpOwotCi0gICAgaW50IHNlbGVjdGlvbiA9IGNvbWJvQm94LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgT2JqZWN0IG5ld1ZhbHVlID0gZG9HZXRWYWx1ZSgpOwotICAgIG1hcmtEaXJ0eSgpOwotICAgIGJvb2xlYW4gaXNWYWxpZCA9IGlzQ29ycmVjdChuZXdWYWx1ZSk7Ci0gICAgc2V0VmFsdWVWYWxpZChpc1ZhbGlkKTsKLQotICAgIGlmICghaXNWYWxpZCkKLSAgICB7Ci0gICAgICAvLyBPbmx5IGZvcm1hdCBpZiB0aGUgJ2luZGV4JyBpcyB2YWxpZAotICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDAgJiYgc2VsZWN0aW9uID49IDAgJiYgc2VsZWN0aW9uIDwgaXRlbXMubGVuZ3RoKQotICAgICAgewotICAgICAgICAvLyB0cnkgdG8gaW5zZXJ0IHRoZSBjdXJyZW50IHZhbHVlIGludG8gdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAgICAgIHNldEVycm9yTWVzc2FnZShNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRFcnJvck1lc3NhZ2UoKSwgbmV3IE9iamVjdFtdIHsgaXRlbXNbc2VsZWN0aW9uXSB9KSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFNpbmNlIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBpbmRleCwgYXNzdW1lIHdlJ3JlIHVzaW5nIGFuCi0gICAgICAgIC8vICdlZGl0JwotICAgICAgICAvLyBjb21ibyBzbyBmb3JtYXQgdXNpbmcgaXRzIHRleHQgdmFsdWUKLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldEVycm9yTWVzc2FnZSgpLCBuZXcgT2JqZWN0W10geyBjb21ib0JveC5nZXRUZXh0KCkgfSkpOwotICAgICAgfQotICAgIH0KLQotICAgIGZpcmVBcHBseUVkaXRvclZhbHVlKCk7Ci0gICAgZGVhY3RpdmF0ZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9BdHRyaWJ1dGVSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvQXR0cmlidXRlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1ZTI3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9BdHRyaWJ1dGVSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREF0dHJpYnV0ZVJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIgZXh0ZW5kcyBSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlcgotewotICBwdWJsaWMgQXR0cmlidXRlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIoSUZpZWxkIHBhcmFtZXRlciwgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsIExhYmVsIGxhYmVsKQotICB7Ci0gICAgc3VwZXIocGFyYW1ldGVyLCBzb3VyY2UsIGxhYmVsKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpCi0gIHsKLSAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciByZXN1bHQgPSBudWxsOwotICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgIGlmIChlZGl0b3IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNEQXR0cmlidXRlUmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpOwotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9Db21ib0JveENlbGxFZGl0b3JNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9Db21ib0JveENlbGxFZGl0b3JNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NDBmMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21ib0JveENlbGxFZGl0b3JNYW5hZ2VyIGV4dGVuZHMgRGlyZWN0RWRpdE1hbmFnZXIvLyBpbXBsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZQotewotICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7Ci0KLSAgcHVibGljIENvbWJvQm94Q2VsbEVkaXRvck1hbmFnZXIoR3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLCBMYWJlbCBsYWJlbCkKLSAgewotICAgIHN1cGVyKHNvdXJjZSwgQ29tYm9Cb3hDZWxsRWRpdG9yLmNsYXNzLCBuZXcgSW50ZXJuYWxDZWxsRWRpdG9yTG9jYXRvcihsYWJlbCkpOwotICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXRDZWxsRWRpdG9yKCkKLSAgewotICAgIFN0cmluZyBpbml0aWFsTGFiZWxUZXh0ID0gbGFiZWwuZ2V0VGV4dCgpOwotCi0gICAgQ0NvbWJvIGNvbWJvID0gKENDb21ibykgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLSAgICBjb21iby5zZXRGb250KGxhYmVsLmdldEZvbnQoKSk7Ci0gICAgY29tYm8uc2V0Rm9yZWdyb3VuZChsYWJlbC5nZXRGb3JlZ3JvdW5kQ29sb3IoKSk7Ci0gICAgY29tYm8uc2V0QmFja2dyb3VuZChsYWJlbC5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0gICAgY29tYm8uc2V0VmlzaWJsZUl0ZW1Db3VudCgyMCk7Ci0KLSAgICAvKgotICAgICAqIGNvbWJvLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgeyAvLyBob29rIGtleSBwcmVzc2VkIC0gc2VlIFBSCi0gICAgICogMTQyMDEgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBrZXlFdmVudCkgeyBpZiAoa2V5RXZlbnQuY2hhcmFjdGVyID09Ci0gICAgICogJ3onKSB7IGdldENlbGxFZGl0b3IoKS5hcHBseUVkaXRvclZhbHVlKCk7IH0gfSB9KTsKLSAgICAgKi8KLSAgICBJQ2VsbEVkaXRvckxpc3RlbmVyIGNlbGxFZGl0b3JMaXN0ZW5lciA9IG5ldyBJQ2VsbEVkaXRvckxpc3RlbmVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBjYW5jZWxFZGl0b3IoKQotICAgICAgewotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBhcHBseUVkaXRvclZhbHVlKCkKLSAgICAgIHsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgZWRpdG9yVmFsdWVDaGFuZ2VkKGJvb2xlYW4gb2xkLCBib29sZWFuIG5ld1N0YXRlKQotICAgICAgewotICAgICAgfQotICAgIH07Ci0gICAgZ2V0Q2VsbEVkaXRvcigpLmFkZExpc3RlbmVyKGNlbGxFZGl0b3JMaXN0ZW5lcik7Ci0KLSAgICBTdHJpbmdbXSBpdGVtID0gY29tYm8uZ2V0SXRlbXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW0ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGl0ZW1baV0uZXF1YWxzKGluaXRpYWxMYWJlbFRleHQpKQotICAgICAgewotICAgICAgICBnZXRDZWxsRWRpdG9yKCkuc2V0VmFsdWUobmV3IEludGVnZXIoaSkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBoYWNrLi4uIGZvciBzb21lIHJlYXNvbiB0aGUgQ29tYm9Cb3hDZWxsRWRpdG9yIGRvZXMndCBmaXJlIGFuCi0gIC8vIGVkaXRvclZhbHVlQ2hhbmdlZCB0byBzZXQgdGhlIGRpcnR5IGZsYWcKLSAgLy8gdW5sZXNzIHdlIG92ZXJpZGUgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRydWUsIHRoZSBtYW5hZ2VyIGlzIG5vdCBub3RpZmllZAotICAvLyBvZiBjaGFuZ2VzIG1hZGUgaW4gdGhlIGNlbGwgZWRpdG9yCi0gIHByb3RlY3RlZCBib29sZWFuIGlzRGlydHkoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBjcmVhdGVDZWxsRWRpdG9yT24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkKLSAgewotICAgIGJvb2xlYW4gaXNMYWJlbFRleHRJbkxpc3QgPSBmYWxzZTsKLSAgICBMaXN0IGxpc3QgPSBjb21wdXRlQ29tYm9Db250ZW50KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgU3RyaW5nIHN0cmluZyA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgaWYgKHN0cmluZy5lcXVhbHMobGFiZWwuZ2V0VGV4dCgpKSkKLSAgICAgIHsKLSAgICAgICAgaXNMYWJlbFRleHRJbkxpc3QgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWlzTGFiZWxUZXh0SW5MaXN0KQotICAgIHsKLSAgICAgIGxpc3QuYWRkKGxhYmVsLmdldFRleHQoKSk7Ci0gICAgfQotCi0gICAgTGlzdCBzb3J0ZWRMaXN0ID0gY29tcHV0ZVNvcnRlZExpc3QobGlzdCk7Ci0gICAgU3RyaW5nW10gc3RyaW5nQXJyYXkgPSBuZXcgU3RyaW5nW3NvcnRlZExpc3Quc2l6ZSgpXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ0FycmF5Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHN0cmluZ0FycmF5W2ldID0gKFN0cmluZykgc29ydGVkTGlzdC5nZXQoaSk7Ci0gICAgfQotICAgIHJldHVybiBjcmVhdGVDZWxsRWRpdG9yKGNvbXBvc2l0ZSwgc3RyaW5nQXJyYXkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBjcmVhdGVDZWxsRWRpdG9yKENvbXBvc2l0ZSBjb21wb3NpdGUsIFN0cmluZ1tdIHN0cmluZ0FycmF5KQotICB7Ci0gICAgcmV0dXJuIG5ldyBDb21ib0JveENlbGxFZGl0b3IoY29tcG9zaXRlLCBzdHJpbmdBcnJheSk7ICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgY29tcHV0ZVNvcnRlZExpc3QoTGlzdCBsaXN0KQotICB7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdCBjb21wdXRlQ29tYm9Db250ZW50KCk7Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcGVyZm9ybU1vZGlmeShPYmplY3QgdmFsdWUpOwotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW50ZXJuYWxDZWxsRWRpdG9yTG9jYXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3JMb2NhdG9yCi0gIHsKLSAgICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7Ci0KLSAgICBwdWJsaWMgSW50ZXJuYWxDZWxsRWRpdG9yTG9jYXRvcihMYWJlbCBsYWJlbCkKLSAgICB7Ci0gICAgICB0aGlzLmxhYmVsID0gbGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKQotICAgIHsKLSAgICAgIENDb21ibyBjb21ibyA9IChDQ29tYm8pIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCi0gICAgICAvLyBUT0RPOiBXZSdyZSBwdWxsaW5nIGEgZmFzdCBvbmUgaGVyZS4uLi4uIFRoaXMgaXMgYXNzdW1pbmcgd2UncmUgdXNpbmcgYQotICAgICAgLy8gQ0NvbWJvIGFzIG91ciB3aWRnZXQKLSAgICAgIC8vIE91ciBldmVudHVhbCAnQ29tYm8nIG1heSBub3QgZXZlbiB1c2UgQ0NvbWJvIHNvIHRoaXMgd2lsbCBtb3N0IGxpa2VseQotICAgICAgLy8gZ2V0IHJlcGxhY2VkLgotICAgICAgLy8gaW50IGRyb3BEb3duQnV0dG9uU2l6ZVggPSAxNjsKLQotICAgICAgUmVjdGFuZ2xlIGxhYmVsUGFyZW50Qm91bmRzID0gbGFiZWwuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotICAgICAgbGFiZWwudHJhbnNsYXRlVG9BYnNvbHV0ZShsYWJlbFBhcmVudEJvdW5kcyk7Ci0KLSAgICAgIGludCB4ID0gbGFiZWxQYXJlbnRCb3VuZHMueDsKLSAgICAgIGludCB5ID0gbGFiZWxQYXJlbnRCb3VuZHMueTsKLSAgICAgIGludCB3aWR0aEsgPSBsYWJlbFBhcmVudEJvdW5kcy53aWR0aDsKLSAgICAgIGludCBoZWlnaHQgPSBsYWJlbFBhcmVudEJvdW5kcy5oZWlnaHQ7Ci0gICAgICBjb21iby5zZXRCb3VuZHMoeCwgeSArIDEsIHdpZHRoSywgaGVpZ2h0IC0gMik7Ci0gICAgfQotICB9Ci0KLSAgLy8gaW1wbGVtZW50cyBEaXJlY3RFZGl0UG9saWN5RGVsZWdhdGUKLSAgLy8gCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1FZGl0KENlbGxFZGl0b3IgY2VsbEVkaXRvcikKLSAgewotICAgIEFEVENvbWJvQm94Q2VsbEVkaXRvciBjb21ib0NlbGxFZGl0b3IgPSAoQURUQ29tYm9Cb3hDZWxsRWRpdG9yKSBjZWxsRWRpdG9yOwotICAgIENDb21ibyBjb21ibyA9IChDQ29tYm8pIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0gICAgaW50IGluZGV4ID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgT2JqZWN0IHZhbHVlID0gY29tYm8uZ2V0SXRlbShpbmRleCk7Ci0gICAgICBpZiAoY29tYm9DZWxsRWRpdG9yLmdldFNlbGVjdGVkVmFsdWUoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICB2YWx1ZSA9IGNvbWJvQ2VsbEVkaXRvci5nZXRTZWxlY3RlZFZhbHVlKCk7Ci0gICAgICB9Ci0KLSAgICAgIHBlcmZvcm1Nb2RpZnkodmFsdWUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3RyaW5nIHR5cGVkVmFsdWUgPSBjb21iby5nZXRUZXh0KCk7Ci0gICAgICBpZiAoY29tYm8uaW5kZXhPZih0eXBlZFZhbHVlKSAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgcGVyZm9ybU1vZGlmeSh0eXBlZFZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGNsb3NlTWF0Y2ggPSBnZXRDbG9zZU1hdGNoKHR5cGVkVmFsdWUsIGNvbWJvLmdldEl0ZW1zKCkpOwotICAgICAgICBpZiAoY2xvc2VNYXRjaCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcGVyZm9ybU1vZGlmeShjbG9zZU1hdGNoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5iZWVwKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsb3NlTWF0Y2goU3RyaW5nIHZhbHVlLCBTdHJpbmdbXSBpdGVtcykKLSAgewotICAgIGludCBtYXRjaEluZGV4ID0gLTE7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyBpdGVtID0gaXRlbXNbaV07Ci0gICAgICBTdHJpbmcgYSA9IGdldExvY2FsTmFtZSh2YWx1ZSk7Ci0gICAgICBTdHJpbmcgYiA9IGdldExvY2FsTmFtZShpdGVtKTsKLSAgICAgIGlmIChhLmVxdWFsc0lnbm9yZUNhc2UoYikpCi0gICAgICB7Ci0gICAgICAgIG1hdGNoSW5kZXggPSBpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1hdGNoSW5kZXggIT0gLTEgPyBpdGVtc1ttYXRjaEluZGV4XSA6IG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldExvY2FsTmFtZShTdHJpbmcgc3RyaW5nKQotICB7Ci0gICAgaW50IGluZGV4ID0gc3RyaW5nLmluZGV4T2YoIjoiKTsgLy8kTk9OLU5MUy0xJAotICAgIHJldHVybiAoaW5kZXggIT0gLTEpID8gc3RyaW5nLnN1YnN0cmluZyhpbmRleCArIDEpIDogc3RyaW5nOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9FbGVtZW50UmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0VsZW1lbnRSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDExN2EyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0VsZW1lbnRSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVsZW1lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEVsZW1lbnRSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlciBleHRlbmRzIFJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyCi17Ci0gIHB1YmxpYyBFbGVtZW50UmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIoSUZpZWxkIHBhcmFtZXRlciwgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsIExhYmVsIGxhYmVsKQotICB7Ci0gICAgc3VwZXIocGFyYW1ldGVyLCBzb3VyY2UsIGxhYmVsKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGdldENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCkKLSAgewotICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIHJlc3VsdCA9IG51bGw7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgaWYgKGVkaXRvciAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpOwotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0xhYmVsQ2VsbEVkaXRvckxvY2F0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0xhYmVsQ2VsbEVkaXRvckxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIzNGY4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9MYWJlbENlbGxFZGl0b3JMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQmFzZUZpZWxkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5JTmFtZWRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JRmllbGRGaWd1cmU7Ci0KLXB1YmxpYyBjbGFzcyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IKLXsKLSAgcHJvdGVjdGVkIElOYW1lZEVkaXRQYXJ0IG5hbWVkRWRpdFBhcnQ7Ci0gIHByb3RlY3RlZCBQb2ludCBjdXJzb3JMb2NhdGlvbjsKLQotICBwdWJsaWMgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcihJTmFtZWRFZGl0UGFydCBuYW1lZEVkaXRQYXJ0LCBQb2ludCBjdXJzb3JMb2NhdGlvbikKLSAgewotICAgIHRoaXMubmFtZWRFZGl0UGFydCA9IG5hbWVkRWRpdFBhcnQ7Ci0gICAgdGhpcy5jdXJzb3JMb2NhdGlvbiA9IGN1cnNvckxvY2F0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKQotICB7Ci0gICAgVGV4dCB0ZXh0ID0gKFRleHQpIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCi0gICAgTGFiZWwgbGFiZWwgPSBuYW1lZEVkaXRQYXJ0LmdldE5hbWVMYWJlbEZpZ3VyZSgpOwotICAgIGlmICh0ZXh0LmdldEJvdW5kcygpLnggPD0gMCkKLSAgICB7Ci0gICAgICBpbnQgd2lkdGhUb1JlbW92ZSA9IDA7Ci0gICAgICAvLyBIQUNLIAotICAgICAgaWYgKG5hbWVkRWRpdFBhcnQgaW5zdGFuY2VvZiBCYXNlRmllbGRFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgQmFzZUZpZWxkRWRpdFBhcnQgZmllbGQgPSAoQmFzZUZpZWxkRWRpdFBhcnQpbmFtZWRFZGl0UGFydDsKLSAgICAgICAgSUZpZWxkRmlndXJlIGZpZWxkRmlndXJlID0gZmllbGQuZ2V0RmllbGRGaWd1cmUoKTsgICAgIAotICAgICAgICB3aWR0aFRvUmVtb3ZlID0gZmllbGRGaWd1cmUuZ2V0VHlwZUxhYmVsKCkuZ2V0Qm91bmRzKCkud2lkdGg7ICAgICAgIAotICAgICAgICAvL1RPRE86ICEhIHBlcmhhcHMgdGhlIElGaWVsZEZpZ3VyZSBzaG91bGQganVzdCBoYXZlIGEgbWV0aG9kIHRvIGNvbXB1dGUgdGhpcz8KLSAgICAgICAgLy9MYWJlbCB0eXBlQW5ub3RhdGlvbkxhYmVsID0gKChGaWVsZEZpZ3VyZSkgZmllbGQuZ2V0RmlndXJlKCkpLmdldFR5cGVBbm5vdGF0aW9uTGFiZWwoKTsKLSAgICAgICAgLy9MYWJlbCBuYW1lQW5ub3RhdGlvbkxhYmVsID0gKChGaWVsZEZpZ3VyZSkgZmllbGQuZ2V0RmlndXJlKCkpLmdldE5hbWVBbm5vdGF0aW9uTGFiZWwoKTsKLSAgICAgICAgLy93aWR0aFRvUmVtb3ZlID0gdHlwZUxhYmVsLmdldEJvdW5kcygpLndpZHRoICsgdHlwZUFubm90YXRpb25MYWJlbC5nZXRCb3VuZHMoKS53aWR0aCArIG5hbWVBbm5vdGF0aW9uTGFiZWwuZ2V0Qm91bmRzKCkud2lkdGg7Ci0gICAgICB9Ci0gICAgIAotICAgICAgUmVjdGFuZ2xlIGJvdW5kaW5nUmVjdCA9IGxhYmVsLmdldFRleHRCb3VuZHMoKTsKLQotICAgICAgLy8gUmVkdWNlIHRoZSB3aWR0aCBieSB0aGUgYW1vdW50IHdlIHNoaWZ0ZWQgYWxvbmcgdGhlIHgtYXhpcwotICAgICAgaW50IGRlbHRhID0gTWF0aC5hYnMoYm91bmRpbmdSZWN0LnggLSBsYWJlbC5nZXRQYXJlbnQoKS5nZXRCb3VuZHMoKS54KTsKLQotICAgICAgbGFiZWwuZ2V0UGFyZW50KCkudHJhbnNsYXRlVG9BYnNvbHV0ZShib3VuZGluZ1JlY3QpOwotICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZSB0cmltID0gdGV4dC5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKTsKLSAgICAgIGJvdW5kaW5nUmVjdC50cmFuc2xhdGUodHJpbS54LCB0cmltLnkpOwotICAgICAgYm91bmRpbmdSZWN0LmhlaWdodCA9IGJvdW5kaW5nUmVjdC5oZWlnaHQgLSB0cmltLnk7Ci0KLSAgICAgIGJvdW5kaW5nUmVjdC53aWR0aCA9IGxhYmVsLmdldFBhcmVudCgpLmdldEJvdW5kcygpLndpZHRoIC0gZGVsdGEgLSB3aWR0aFRvUmVtb3ZlOwotICAgICAgdGV4dC5zZXRCb3VuZHMoYm91bmRpbmdSZWN0LngsIGJvdW5kaW5nUmVjdC55LCBib3VuZGluZ1JlY3Qud2lkdGgsIGJvdW5kaW5nUmVjdC5oZWlnaHQpOwotCi0gICAgICAvLyBUcmFuc2xhdGUgcG9pbnQKLSAgICAgIGlmIChjdXJzb3JMb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgCSAgUG9pbnQgdHJhbnNsYXRlZFBvaW50ID0gbmV3IFBvaW50KGN1cnNvckxvY2F0aW9uLnggLSBib3VuZGluZ1JlY3QueCwgY3Vyc29yTG9jYXRpb24ueSAtIGJvdW5kaW5nUmVjdC55KTsKLQotICAgIAkgIC8vIENhbGN1bGF0ZSB0ZXh0IG9mZnNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0cmFuc2xhdGVkIHBvaW50Ci0gICAgCSAgdGV4dC5zZXRTZWxlY3Rpb24oMCwgMCk7Ci0gICAgCSAgaW50IHhDYXJldCA9IHRleHQuZ2V0Q2FyZXRMb2NhdGlvbigpLng7Ci0gICAgCSAgaW50IG9mZnNldCA9IHRleHQuZ2V0Q2FyZXRQb3NpdGlvbigpOwotICAgIAkgIHdoaWxlICh4Q2FyZXQgPCB0cmFuc2xhdGVkUG9pbnQueCkKLSAgICAJICB7Ci0gICAgCQkgIHRleHQuc2V0U2VsZWN0aW9uKG9mZnNldCArIDEsIG9mZnNldCArIDEpOwotICAgIAkJICB4Q2FyZXQgPSB0ZXh0LmdldENhcmV0TG9jYXRpb24oKS54OwotICAgIAkJICBpbnQgbmV3T2Zmc2V0ID0gdGV4dC5nZXRDYXJldFBvc2l0aW9uKCk7Ci0gICAgCQkgIGlmIChuZXdPZmZzZXQgPT0gb2Zmc2V0KQotICAgIAkJICB7Ci0gICAgCQkJICBicmVhazsKLSAgICAJCSAgfQotICAgIAkJICBvZmZzZXQrKzsKLSAgICAJICB9Ci0gICAgCSAgdGV4dC5zZXRTZWxlY3Rpb24ob2Zmc2V0LCBvZmZzZXQpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvTGFiZWxFZGl0TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvTGFiZWxFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTdhNWJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L0xhYmVsRWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5DZWxsRWRpdG9yQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLklOYW1lZEVkaXRQYXJ0OwotCi1wdWJsaWMgY2xhc3MgTGFiZWxFZGl0TWFuYWdlciBleHRlbmRzIERpcmVjdEVkaXRNYW5hZ2VyIHsKLQotCXByaXZhdGUgSUFjdGlvbkJhcnMgYWN0aW9uQmFyczsKLQlwcml2YXRlIENlbGxFZGl0b3JBY3Rpb25IYW5kbGVyIGFjdGlvbkhhbmRsZXI7Ci0JcHJpdmF0ZSBJQWN0aW9uIGNvcHksIGN1dCwgcGFzdGUsIHVuZG8sIHJlZG8sIGZpbmQsIHNlbGVjdEFsbCwgZGVsZXRlOwotCXByaXZhdGUgRm9udCBzY2FsZWRGb250OwotCi0JcHVibGljIExhYmVsRWRpdE1hbmFnZXIoR3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLCBDZWxsRWRpdG9yTG9jYXRvciBsb2NhdG9yKSB7Ci0JCXN1cGVyKHNvdXJjZSwgbnVsbCwgbG9jYXRvcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjYnJpbmdEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicmluZ0Rvd24oKSB7Ci0JCWlmIChhY3Rpb25IYW5kbGVyICE9IG51bGwpIHsKLQkJCWFjdGlvbkhhbmRsZXIuZGlzcG9zZSgpOwotCQkJYWN0aW9uSGFuZGxlciA9IG51bGw7Ci0JCX0KLQkJaWYgKGFjdGlvbkJhcnMgIT0gbnVsbCkgewotCQkJcmVzdG9yZVNhdmVkQWN0aW9ucyhhY3Rpb25CYXJzKTsKLQkJCWFjdGlvbkJhcnMudXBkYXRlQWN0aW9uQmFycygpOwotCQkJYWN0aW9uQmFycyA9IG51bGw7Ci0JCX0KLQotCQlGb250IGRpc3Bvc2VGb250ID0gc2NhbGVkRm9udDsKLQkJc2NhbGVkRm9udCA9IG51bGw7Ci0JCXN1cGVyLmJyaW5nRG93bigpOwotCQlpZiAoZGlzcG9zZUZvbnQgIT0gbnVsbCkKLQkJCWRpc3Bvc2VGb250LmRpc3Bvc2UoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2hvd0ZlZWRiYWNrKCkgewotLy8gICAgc3VwZXIuc2hvd0ZlZWRiYWNrKCk7Ci0JCWdldEVkaXRQYXJ0KCkuc2hvd1NvdXJjZUZlZWRiYWNrKGdldERpcmVjdEVkaXRSZXF1ZXN0KCkpOwotCX0KLQotCXByb3RlY3RlZCBDZWxsRWRpdG9yIGNyZWF0ZUNlbGxFZGl0b3JPbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXJldHVybiBuZXcgVGV4dENlbGxFZGl0b3IoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULldSQVApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDZWxsRWRpdG9yKCkgewotCQlUZXh0IHRleHQgPSAoVGV4dClnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCQlMYWJlbCBsYWJlbCA9ICgoSU5hbWVkRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCkpLmdldE5hbWVMYWJlbEZpZ3VyZSgpOwotICAgIAotCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJc2NhbGVkRm9udCA9IGxhYmVsLmdldEZvbnQoKTsKLQkJCQotCQkJQ29sb3IgY29sb3IgPSBsYWJlbC5nZXRCYWNrZ3JvdW5kQ29sb3IoKTsKLQkJCXRleHQuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCQkKLQkJCVN0cmluZyBpbml0aWFsTGFiZWxUZXh0ID0gbGFiZWwuZ2V0VGV4dCgpOwotCQkJZ2V0Q2VsbEVkaXRvcigpLnNldFZhbHVlKGluaXRpYWxMYWJlbFRleHQpOwotCQl9Ci0JCWVsc2UgewotCQkJc2NhbGVkRm9udCA9IGxhYmVsLmdldFBhcmVudCgpLmdldEZvbnQoKTsKLQkJCXRleHQuc2V0QmFja2dyb3VuZChsYWJlbC5nZXRQYXJlbnQoKS5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0JCX0KLQkJCi0JCUZvbnREYXRhIGRhdGEgPSBzY2FsZWRGb250LmdldEZvbnREYXRhKClbMF07Ci0JCURpbWVuc2lvbiBmb250U2l6ZSA9IG5ldyBEaW1lbnNpb24oMCwgZGF0YS5nZXRIZWlnaHQoKSk7Ci0JCWxhYmVsLmdldFBhcmVudCgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUoZm9udFNpemUpOwotCQlkYXRhLnNldEhlaWdodChmb250U2l6ZS5oZWlnaHQpOwotCQlzY2FsZWRGb250ID0gbmV3IEZvbnQobnVsbCwgZGF0YSk7Ci0JCQotCQl0ZXh0LnNldEZvbnQoc2NhbGVkRm9udCk7Ci0vLwkJdGV4dC5zZWxlY3RBbGwoKTsKLQotCQkvLyBIb29rIHRoZSBjZWxsIGVkaXRvcidzIGNvcHkvcGFzdGUgYWN0aW9ucyB0byB0aGUgYWN0aW9uQmFycyBzbyB0aGF0IHRoZXkgY2FuCi0JCS8vIGJlIGludm9rZWQgdmlhIGtleWJvYXJkIHNob3J0Y3V0cy4KLQkJYWN0aW9uQmFycyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpCi0JCQkJLmdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCXNhdmVDdXJyZW50QWN0aW9ucyhhY3Rpb25CYXJzKTsKLQkJYWN0aW9uSGFuZGxlciA9IG5ldyBDZWxsRWRpdG9yQWN0aW9uSGFuZGxlcihhY3Rpb25CYXJzKTsKLQkJYWN0aW9uSGFuZGxlci5hZGRDZWxsRWRpdG9yKGdldENlbGxFZGl0b3IoKSk7Ci0JCWFjdGlvbkJhcnMudXBkYXRlQWN0aW9uQmFycygpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZXN0b3JlU2F2ZWRBY3Rpb25zKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpewotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksIGNvcHkpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpLCBwYXN0ZSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpLCBkZWxldGUpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5TRUxFQ1RfQUxMLmdldElkKCksIHNlbGVjdEFsbCk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpLCBjdXQpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5GSU5ELmdldElkKCksIGZpbmQpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5VTkRPLmdldElkKCksIHVuZG8pOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5SRURPLmdldElkKCksIHJlZG8pOwotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlQ3VycmVudEFjdGlvbnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQljb3B5ID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpKTsKLQkJcGFzdGUgPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpKTsKLQkJZGVsZXRlID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotCQlzZWxlY3RBbGwgPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5TRUxFQ1RfQUxMLmdldElkKCkpOwotCQljdXQgPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSk7Ci0JCWZpbmQgPSBhY3Rpb25CYXJzLmdldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5GSU5ELmdldElkKCkpOwotCQl1bmRvID0gYWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpKTsKLQkJcmVkbyA9IGFjdGlvbkJhcnMuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9kaXJlY3RlZGl0L1JlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OGNiYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5kaXJlY3RlZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIgZXh0ZW5kcyBDb21ib0JveENlbGxFZGl0b3JNYW5hZ2VyCi17Ci0gIHByb3RlY3RlZCBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0OwotICBwcm90ZWN0ZWQgSUZpZWxkIHNldE9iamVjdDsKLQotICBwdWJsaWMgUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIoSUZpZWxkIHBhcmFtZXRlciwgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsIExhYmVsIGxhYmVsKQotICB7Ci0gICAgc3VwZXIoc291cmNlLCBsYWJlbCk7Ci0gICAgZWRpdFBhcnQgPSBzb3VyY2U7Ci0gICAgc2V0T2JqZWN0ID0gcGFyYW1ldGVyOwotICB9Ci0KLSAgcHJvdGVjdGVkIENlbGxFZGl0b3IgY3JlYXRlQ2VsbEVkaXRvck9uKENvbXBvc2l0ZSBjb21wb3NpdGUpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuY3JlYXRlQ2VsbEVkaXRvck9uKGNvbXBvc2l0ZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBjb21wdXRlQ29tYm9Db250ZW50KCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBlZGl0TWFuYWdlciA9IGdldENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCk7Ci0gICAgaWYgKGVkaXRNYW5hZ2VyICE9IG51bGwpCi0gICAgewotICAgICAgIGxpc3QuYWRkKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQlJPV1NFKTsKLSAgICAgICBsaXN0LmFkZChNZXNzYWdlcy5fVUlfQUNUSU9OX05FVyk7Ci0gICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIHF1aWNrUGlja3MgPSBlZGl0TWFuYWdlci5nZXRRdWlja1BpY2tzKCk7Ci0gICAgICAgaWYgKHF1aWNrUGlja3MgIT0gbnVsbCkKLSAgICAgICB7Ci0gICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBxdWlja1BpY2tzLmxlbmd0aDsgaSsrKQotICAgICAgICAgewotICAgICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPSBxdWlja1BpY2tzW2ldOwotICAgICAgICAgICBsaXN0LmFkZChjb21wb25lbnRTcGVjaWZpY2F0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICB9ICAKLSAgICAgICB9Ci0gICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGhpc3RvcnkgPSBlZGl0TWFuYWdlci5nZXRIaXN0b3J5KCk7Ci0gICAgICAgaWYgKGhpc3RvcnkgIT0gbnVsbCkKLSAgICAgICB7Ci0gICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBoaXN0b3J5Lmxlbmd0aDsgaSsrKQotICAgICAgICAgewotICAgICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPSBoaXN0b3J5W2ldOwotICAgICAgICAgICBsaXN0LmFkZChjb21wb25lbnRTcGVjaWZpY2F0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICB9ICAKLSAgICAgICB9Ci0gICAgfSAKLSAgICByZXR1cm4gbGlzdDsgCi0gIH0KLQotICBwcm90ZWN0ZWQgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBnZXRDb21wb25lbnRTcGVjaWZpY2F0aW9uRm9yVmFsdWUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZWRpdE1hbmFnZXIgPSBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpOwotICAgIGlmIChlZGl0TWFuYWdlciAhPSBudWxsKQotICAgIHsgIAotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIHF1aWNrUGlja3MgPSBlZGl0TWFuYWdlci5nZXRRdWlja1BpY2tzKCk7Ci0gICAgICBpZiAocXVpY2tQaWNrcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBxdWlja1BpY2tzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uID0gcXVpY2tQaWNrc1tpXTsKLSAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKGNvbXBvbmVudFNwZWNpZmljYXRpb24uZ2V0TmFtZSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBoaXN0b3J5ID0gZWRpdE1hbmFnZXIuZ2V0SGlzdG9yeSgpOwotICAgICAgaWYgKGhpc3RvcnkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgaGlzdG9yeS5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbiA9IGhpc3RvcnlbaV07Ci0gICAgICAgICAgaWYgKHZhbHVlLmVxdWFscyhjb21wb25lbnRTcGVjaWZpY2F0aW9uLmdldE5hbWUoKSkpCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcGVyZm9ybU1vZGlmeShPYmplY3QgdmFsdWUpCi0gIHsKLSAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBlZGl0TWFuYWdlciA9IGdldENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCk7Ci0gICAgaWYgKGVkaXRNYW5hZ2VyID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICAvLyBvdXIgY3J1ZGUgY29tYm8gYm94IGNhbiBvbmx5IHdvcmsgd2l0aCAnU3RyaW5nJyBvYmplY3RzCi0gICAgLy8gaWYgd2UgZ2V0IGEgU3RyaW5nIGJhY2sgd2UgbmVlZCB0byBkbyBzb21lIGNsZXZlciBtYXBwaW5nIHRvIGdldCB0aGUgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiAKLSAgICAvLyAgICAKLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgewotICAgICAgdmFsdWUgPSBnZXRDb21wb25lbnRTcGVjaWZpY2F0aW9uRm9yVmFsdWUoKFN0cmluZyl2YWx1ZSk7ICAgICAKLSAgICB9ICAKLSAgICAvLyB3ZSBhc3N1bWUgdGhlIHNlbGVjdGVkIHZhbHVlIGlzIGFsd2F5cyBvZiB0aGUgZm9ybSBvZiBhIENvbXBvbmVudFNwZWNpZmljYXRpb24KLSAgICAvLyAKLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBDb21wb25lbnRTcGVjaWZpY2F0aW9uKSAgICAgIAotICAgIHsKLSAgICAgIC8vIHdlIG5lZWQgdG8gcGVyZm9ybSBhbiBhc3luY0V4ZWMgaGVyZSBzaW5jZSB0aGUgJ2hvc3QnIGVkaXRwYXJ0IG1heSBiZQotICAgICAgLy8gcmVtb3ZlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIHBlcmZvcm1pbmcgdGhlIGFjdGlvbiAgICAgICAgICAgCi0gICAgICBEZWxheWVkU2V0UmVmZXJlbmNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgRGVsYXllZFNldFJlZmVyZW5jZVJ1bm5hYmxlKGVkaXRNYW5hZ2VyLCBzZXRPYmplY3QsIChDb21wb25lbnRTcGVjaWZpY2F0aW9uKXZhbHVlKTsKLSAgICAgIC8vcnVubmFibGUucnVuKCk7Ci0gICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMocnVubmFibGUpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGNvbXB1dGVTb3J0ZWRMaXN0KExpc3QgbGlzdCkKLSAgewotICAgIC8vIHJldHVybiBUeXBlc0hlbHBlci5zb3J0TGlzdChsaXN0KTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIENlbGxFZGl0b3IgY3JlYXRlQ2VsbEVkaXRvcihDb21wb3NpdGUgY29tcG9zaXRlLCBTdHJpbmdbXSBzdHJpbmdBcnJheSkKLSAgewotICAgIEFEVENvbWJvQm94Q2VsbEVkaXRvciBjZWxsRWRpdG9yID0gbmV3IEFEVENvbWJvQm94Q2VsbEVkaXRvcihjb21wb3NpdGUsIHN0cmluZ0FycmF5LCBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpKTsKLSAgICAvLygoQURUQ29tYm9Cb3hDZWxsRWRpdG9yKSBjZWxsRWRpdG9yKS5zZXRPYmplY3RUb01vZGlmeShzZXRPYmplY3QpOwotICAgIHJldHVybiBjZWxsRWRpdG9yOwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGdldENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKCk7Ci0gIAotICBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZ2V0QWN0aXZlRWRpdG9yKCkKLSAgewotICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICByZXR1cm4gZWRpdG9yUGFydDsKLSAgfSAgICAKLSAgCi0gIHByb3RlY3RlZCBjbGFzcyBEZWxheWVkU2V0UmVmZXJlbmNlUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZQotICB7Ci0gICAgcHJvdGVjdGVkIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotICAgIHByb3RlY3RlZCBDb21wb25lbnRTcGVjaWZpY2F0aW9uIG5ld1ZhbHVlOwotICAgIHByb3RlY3RlZCBJRmllbGQgZmllbGQ7Ci0KLSAgICBwdWJsaWMgRGVsYXllZFNldFJlZmVyZW5jZVJ1bm5hYmxlKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLAotICAgICAgICBJRmllbGQgc2V0T2JqZWN0LCBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNlbGVjdGVkVmFsdWUpCi0gICAgewotICAgICAgdGhpcy5jb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciA9IGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotICAgICAgbmV3VmFsdWUgPSBzZWxlY3RlZFZhbHVlOwotICAgICAgZmllbGQgPSBzZXRPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICBjb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5tb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoZmllbGQsIG5ld1ZhbHVlKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2RpcmVjdGVkaXQvVHlwZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9UeXBlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJlYmFlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZGlyZWN0ZWRpdC9UeXBlUmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLQotcHVibGljIGNsYXNzIFR5cGVSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlciBleHRlbmRzIFJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyIC8vQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlcgotewotICBwdWJsaWMgVHlwZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyKElGaWVsZCBwYXJhbWV0ZXIsIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLCBMYWJlbCBsYWJlbCkKLSAgewotICAgIHN1cGVyKHBhcmFtZXRlciwgc291cmNlLCBsYWJlbCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZ2V0Q29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIoKQotICB7Ci0gICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgcmVzdWx0ID0gbnVsbDsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLSAgICBpZiAoZWRpdG9yICE9IG51bGwpCi0gICAgewotICAgICAgICByZXN1bHQgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKTsKLSAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyMikKLSAgICAgICAgewotICAgICAgICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyMiBtYW5hZ2VyID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyMilyZXN1bHQ7Ci0gICAgICAgICAgbWFuYWdlci5zZXRSZWZlcmVuY2VyKHNldE9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9ICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0FEVEVkaXRQYXJ0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9BRFRFZGl0UGFydEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY0MjYwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0FEVEVkaXRQYXJ0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkFEVEZsb2F0aW5nVG9vbGJhci5BRFRGbG9hdGluZ1Rvb2xiYXJNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkFic3RyYWN0TW9kZWxDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuQ29tcGFydG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Gb2N1c1R5cGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5Sb290SG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQ29tcGxleFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JU3RydWN0dXJlOwotCi1wdWJsaWMgY2xhc3MgQURURWRpdFBhcnRGYWN0b3J5IGltcGxlbWVudHMgRWRpdFBhcnRGYWN0b3J5Ci17Ci0gIHB1YmxpYyBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBFZGl0UGFydCBjaGlsZCA9IGRvQ3JlYXRlRWRpdFBhcnQoY29udGV4dCwgbW9kZWwpOwotICAgIGNoZWNrQ2hpbGQoY2hpbGQsIG1vZGVsKTsKLSAgICByZXR1cm4gY2hpbGQ7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBFZGl0UGFydCBkb0NyZWF0ZUVkaXRQYXJ0KEVkaXRQYXJ0IGNvbnRleHQsIE9iamVjdCBtb2RlbCkKLSAgewotICAgIEVkaXRQYXJ0IGNoaWxkID0gbnVsbDsKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBDb21wYXJ0bWVudCkKLSAgICB7Ci0gICAgICBjaGlsZCA9IG5ldyBDb21wYXJ0bWVudEVkaXRQYXJ0KCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgUm9vdEhvbGRlcikKLSAgICB7Ci0gICAgICBjaGlsZCA9IG5ldyBSb290SG9sZGVyRWRpdFBhcnQoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBBRFRGbG9hdGluZ1Rvb2xiYXJNb2RlbCkKLSAgICB7Ci0gICAgICBjaGlsZCA9IG5ldyBBRFRGbG9hdGluZ1Rvb2xiYXJFZGl0UGFydCgoKEFEVEZsb2F0aW5nVG9vbGJhck1vZGVsKW1vZGVsKS5nZXRNb2RlbCgpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBBYnN0cmFjdE1vZGVsQ29sbGVjdGlvbikKLSAgICB7Ci0gICAgICBjaGlsZCA9IG5ldyBDb2x1bW5FZGl0UGFydCgpOwotICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgRm9jdXNUeXBlQ29sdW1uKQotICAgICAgewotICAgICAgICBDb2x1bW5FZGl0UGFydCBjb2x1bW5FZGl0UGFydCA9IChDb2x1bW5FZGl0UGFydCljaGlsZDsKLSAgICAgICAgY29sdW1uRWRpdFBhcnQuc2V0U3BhY2luZyg2MCk7Ci0gICAgICAgIGNvbHVtbkVkaXRQYXJ0LnNldE1pbm9yQWxpZ25tZW50KFRvb2xiYXJMYXlvdXQuQUxJR05fQ0VOVEVSKTsKLSAgICAgIH0gIAotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIElDb21wbGV4VHlwZSkKLSAgICB7Ci0gICAgICBjaGlsZCA9IG5ldyBDb21wbGV4VHlwZUVkaXRQYXJ0KCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgSVN0cnVjdHVyZSkKLSAgICB7Ci0gICAgICBjaGlsZCA9IG5ldyBTdHJ1Y3R1cmVFZGl0UGFydCgpOwotICAgIH0gIAotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgSUZpZWxkKQotICAgIHsKLSAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgQ29tcGFydG1lbnRFZGl0UGFydCkKLSAgICAgIHsgIAotICAgICAgICBjaGlsZCA9IG5ldyBGaWVsZEVkaXRQYXJ0KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGNoaWxkID0gbmV3IFRvcExldmVsRmllbGRFZGl0UGFydCgpOwotICAgICAgfSAgCi0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgSU1vZGVsKQotICAgIHsKLSAgICAgIGNoaWxkID0gbmV3IFJvb3RDb250ZW50RWRpdFBhcnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNoaWxkOyAgIAotICB9Ci0KLSAgLyoqCi0gICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGFuZCBub3QgY2hlY2sgZm9yIG51bGwKLSAgICogCi0gICAqIEBwYXJhbSBjaGlsZAotICAgKiBAcGFyYW0gbW9kZWwKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNoZWNrQ2hpbGQoRWRpdFBhcnQgY2hpbGQsIE9iamVjdCBtb2RlbCkKLSAgewotICAgIGlmIChjaGlsZCA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIFRocmVhZC5kdW1wU3RhY2soKTsKLSAgICB9Ci0gICAgQXNzZXJ0LmlzTm90TnVsbChjaGlsZCk7Ci0gICAgY2hpbGQuc2V0TW9kZWwobW9kZWwpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0FEVEZsb2F0aW5nVG9vbGJhckVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0FEVEZsb2F0aW5nVG9vbGJhckVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYmRhYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9BRFRGbG9hdGluZ1Rvb2xiYXJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1vdXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1vdXNlTW90aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLlNldElucHV0VG9HcmFwaFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZmlndXJlcy5DZW50ZXJlZEljb25GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgQURURmxvYXRpbmdUb29sYmFyRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIElNb2RlbCBtb2RlbDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEcmlsbGVkRG93bjsKLSAgcHJvdGVjdGVkIEFEVFRvb2xiYXJCdXR0b24gYmFja1RvU2NoZW1hOwotICAKLSAgcHVibGljIEFEVEZsb2F0aW5nVG9vbGJhckVkaXRQYXJ0KElNb2RlbCBtb2RlbCkKLSAgewotICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgfQotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBGaWd1cmUgZmlndXJlID0gbmV3IEZpZ3VyZSgpOwotICAgIFRvb2xiYXJMYXlvdXQgdGIgPSBuZXcgVG9vbGJhckxheW91dCh0cnVlKTsKLSAgICB0Yi5zZXRTdHJldGNoTWlub3JBeGlzKGZhbHNlKTsKLSAgICB0Yi5zZXRTcGFjaW5nKDMpOwotICAgIGZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKHRiKTsKLSAgICAKLSAgICBiYWNrVG9TY2hlbWEgPSBuZXcgQURUVG9vbGJhckJ1dHRvbihYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigiZWxjbDE2L3NjaGVtYXZpZXdfY28uZ2lmIikpOwotICAgIGJhY2tUb1NjaGVtYS5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5fVUlfSE9WRVJfQkFDS19UT19TQ0hFTUEpOwotICAgIGJhY2tUb1NjaGVtYS5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMud2hpdGUpOwotLy8gICAgYmFja1RvU2NoZW1hLnNldEJvdW5kcyhuZXcgUmVjdGFuZ2xlKDAsIDAsIDI0LCAyNCkpOwotICAgIGZpZ3VyZS5hZGQoYmFja1RvU2NoZW1hKTsKLSAgICBmaWd1cmUuc2V0Qm91bmRzKG5ldyBSZWN0YW5nbGUoMCwwLDI0LDI0KSk7Ci0gICAgCi0gICAgYWRkVG9Ub29sYmFyKGZpZ3VyZSk7ICAgCi0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgYWRkVG9Ub29sYmFyKElGaWd1cmUgZmlndXJlKQotICB7Ci0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldElzRHJpbGxlZERvd24oYm9vbGVhbiBpc0RyaWxsZWREb3duKQotICB7Ci0gICAgdGhpcy5pc0RyaWxsZWREb3duID0gaXNEcmlsbGVkRG93bjsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLSAgICBiYWNrVG9TY2hlbWEuaXNFbmFibGVkID0gaXNEcmlsbGVkRG93bjsKLSAgICBpZiAoaXNEcmlsbGVkRG93bikKLSAgICB7Ci0gICAgICBiYWNrVG9TY2hlbWEuaW1hZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigiZWxjbDE2L3NjaGVtYXZpZXdfY28uZ2lmIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBiYWNrVG9TY2hlbWEuaW1hZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigiZGxjbDE2L3NjaGVtYXZpZXdfY28uZ2lmIik7Ci0gICAgfQotICAgIGJhY2tUb1NjaGVtYS5yZWZyZXNoKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGRvQWN0aW9uKE1vdXNlRXZlbnQgbWUpCi0gIHsKLSAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gCi0gICAgaWYgKGJhY2tUb1NjaGVtYS5nZXRCb3VuZHMoKS5jb250YWlucyhtZS5nZXRMb2NhdGlvbigpKSkKLSAgICB7Ci0gICAgICBTZXRJbnB1dFRvR3JhcGhWaWV3IGFjdGlvbiA9IG5ldyBTZXRJbnB1dFRvR3JhcGhWaWV3KGVkaXRvclBhcnQsIG1vZGVsKTsKLSAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBjbGFzcyBBRFRUb29sYmFyQnV0dG9uIGV4dGVuZHMgQ2VudGVyZWRJY29uRmlndXJlCi0gIHsKLSAgICBwcm90ZWN0ZWQgTW91c2VMaXN0ZW5lciBtb3VzZUxpc3RlbmVyOwotICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZDsKLSAgICAKLSAgICBwdWJsaWMgQURUVG9vbGJhckJ1dHRvbihJbWFnZSBpbWcpCi0gICAgewotICAgICAgc3VwZXIoKTsKLSAgICAgIHRoaXMuaW1hZ2UgPSBpbWc7Ci0KLSAgICAgIG1vdXNlTGlzdGVuZXIgPSBuZXcgTW91c2VMaXN0ZW5lci5TdHViKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgbW91c2VQcmVzc2VkKG9yZy5lY2xpcHNlLmRyYXcyZC5Nb3VzZUV2ZW50IG1lKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlzRW5hYmxlZCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhZGRGZWVkYmFjaygpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUmVsZWFzZWQob3JnLmVjbGlwc2UuZHJhdzJkLk1vdXNlRXZlbnQgbWUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNFbmFibGVkKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlbW92ZUZlZWRiYWNrKCk7Ci0gICAgICAgICAgICBkb0FjdGlvbihtZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9OwotICAgICAgYWRkTW91c2VMaXN0ZW5lcihtb3VzZUxpc3RlbmVyKTsKLSAgICAgIGFkZE1vdXNlTW90aW9uTGlzdGVuZXIobmV3IE1vdXNlTW90aW9uTGlzdGVuZXIuU3R1YigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRXhpdGVkKE1vdXNlRXZlbnQgbWUpCi0gICAgICAgIHsKLSAgICAgICAgICByZW1vdmVGZWVkYmFjaygpOwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpCi0gICAgewotICAgICAgc2V0TW9kZShDZW50ZXJlZEljb25GaWd1cmUuU0VMRUNURUQpOwotICAgICAgcmVmcmVzaCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCkKLSAgICB7Ci0gICAgICBzZXRNb2RlKENlbnRlcmVkSWNvbkZpZ3VyZS5OT1JNQUwpOwotICAgICAgcmVmcmVzaCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZWN0YW5nbGUgZ2V0Qm91bmRzKCkKLSAgICB7Ci0gICAgICBSZWN0YW5nbGUgciA9IHN1cGVyLmdldEJvdW5kcygpOwotICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0gICAgICByZXR1cm4gbmV3IFJlY3RhbmdsZShyLngsIHIueSwgcmVjdC53aWR0aCArIDgsIHJlY3QuaGVpZ2h0ICsgOCk7Ci0gICAgfQotCi0gICAgcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKGludCBoaW50LCBpbnQgaGludDIpCi0gICAgewotICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0gICAgICByZXR1cm4gbmV3IERpbWVuc2lvbihyZWN0LndpZHRoICsgOCwgcmVjdC5oZWlnaHQgKyA4KTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9CYWNrVG9TY2hlbWFFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9CYWNrVG9TY2hlbWFFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzllZDZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQmFja1RvU2NoZW1hRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TZXRJbnB1dFRvR3JhcGhWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUZlZWRiYWNrSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLkFEVERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5BRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLkFEVE11bHRpUGFnZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5maWd1cmVzLkNlbnRlcmVkSWNvbkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBCYWNrVG9TY2hlbWFFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydCBpbXBsZW1lbnRzIElGZWVkYmFja0hhbmRsZXIKLXsKLSAgcHJvdGVjdGVkIE11bHRpUGFnZUVkaXRvclBhcnQgbXVsdGlwYWdlRWRpdG9yOwotICBwcm90ZWN0ZWQgQURURGlyZWN0RWRpdFBvbGljeSBhZHREaXJlY3RFZGl0UG9saWN5ID0gbmV3IEFEVERpcmVjdEVkaXRQb2xpY3koKTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNFbmFibGVkOwotICBwcm90ZWN0ZWQgQ2VudGVyZWRJY29uRmlndXJlIGJhY2tUb1NjaGVtYTsKLSAgcHJvdGVjdGVkIE1vdXNlTGlzdGVuZXIgbW91c2VMaXN0ZW5lcjsKLQotICBwdWJsaWMgQmFja1RvU2NoZW1hRWRpdFBhcnQoQURUTXVsdGlQYWdlRWRpdG9yIG11bHRpcGFnZUVkaXRvcikKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5tdWx0aXBhZ2VFZGl0b3IgPSBtdWx0aXBhZ2VFZGl0b3I7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgYmFja1RvU2NoZW1hID0gbmV3IENlbnRlcmVkSWNvbkZpZ3VyZSgpOwotICAgIGJhY2tUb1NjaGVtYS5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMud2hpdGUpOwotICAgIGJhY2tUb1NjaGVtYS5pbWFnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJY29uKCJlbGNsMTYvc2NoZW1hdmlld19jby5naWYiKTsKLSAgICAvLyBUT0RPLCBsb29rIGF0IHdoeSB0aGUgZWRpdHBvbGljeSBkb2Vzbid0IHdvcmsKLSAgICBtb3VzZUxpc3RlbmVyID0gbmV3IE1vdXNlTGlzdGVuZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2tlZChvcmcuZWNsaXBzZS5kcmF3MmQuTW91c2VFdmVudCBtZSkKLSAgICAgIHsKLQotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQob3JnLmVjbGlwc2UuZHJhdzJkLk1vdXNlRXZlbnQgbWUpCi0gICAgICB7Ci0gICAgICAgIGlmIChpc0VuYWJsZWQpCi0gICAgICAgIHsKLSAgICAgICAgICBhZGRGZWVkYmFjaygpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUmVsZWFzZWQob3JnLmVjbGlwc2UuZHJhdzJkLk1vdXNlRXZlbnQgbWUpCi0gICAgICB7Ci0gICAgICAgIGlmIChpc0VuYWJsZWQpCi0gICAgICAgIHsKLSAgICAgICAgICByZW1vdmVGZWVkYmFjaygpOwotICAgICAgICAgIFNldElucHV0VG9HcmFwaFZpZXcgYWN0aW9uID0gbmV3IFNldElucHV0VG9HcmFwaFZpZXcobXVsdGlwYWdlRWRpdG9yLCBnZXRNb2RlbCgpKTsKLSAgICAgICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotICAgIGJhY2tUb1NjaGVtYS5hZGRNb3VzZUxpc3RlbmVyKG1vdXNlTGlzdGVuZXIpOwotICAgIHJldHVybiBiYWNrVG9TY2hlbWE7Ci0gIH0KLSAgCi0gIAotICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gaXNFbmFibGVkKQotICB7Ci0gICAgdGhpcy5pc0VuYWJsZWQgPSBpc0VuYWJsZWQ7Ci0gICAgcmVmcmVzaFZpc3VhbHMoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsIGFkdERpcmVjdEVkaXRQb2xpY3kpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIG5ldyBBRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3koKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVQgfHwgcmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfT1BFTikKLSAgICB7Ci0gICAgICBTZXRJbnB1dFRvR3JhcGhWaWV3IGFjdGlvbiA9IG5ldyBTZXRJbnB1dFRvR3JhcGhWaWV3KG11bHRpcGFnZUVkaXRvciwgZ2V0TW9kZWwoKSk7Ci0gICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLSAgICBDZW50ZXJlZEljb25GaWd1cmUgZmlndXJlID0gKENlbnRlcmVkSWNvbkZpZ3VyZSkgZ2V0RmlndXJlKCk7Ci0gICAgaWYgKGlzRW5hYmxlZCkKLSAgICB7Ci0gICAgICBiYWNrVG9TY2hlbWEuaW1hZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigiZWxjbDE2L3NjaGVtYXZpZXdfY28uZ2lmIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBiYWNrVG9TY2hlbWEuaW1hZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SWNvbigiZGxjbDE2L3NjaGVtYXZpZXdfY28uZ2lmIik7Ci0gICAgfQotICAgIGZpZ3VyZS5yZWZyZXNoKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpCi0gIHsKLSAgICBDZW50ZXJlZEljb25GaWd1cmUgZmlndXJlID0gKENlbnRlcmVkSWNvbkZpZ3VyZSkgZ2V0RmlndXJlKCk7Ci0gICAgZmlndXJlLnNldE1vZGUoQ2VudGVyZWRJY29uRmlndXJlLlNFTEVDVEVEKTsKLSAgICBmaWd1cmUucmVmcmVzaCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKQotICB7Ci0gICAgQ2VudGVyZWRJY29uRmlndXJlIGZpZ3VyZSA9IChDZW50ZXJlZEljb25GaWd1cmUpIGdldEZpZ3VyZSgpOwotICAgIGZpZ3VyZS5zZXRNb2RlKENlbnRlcmVkSWNvbkZpZ3VyZS5OT1JNQUwpOwotICAgIGZpZ3VyZS5yZWZyZXNoKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotICB7Ci0gICAgYmFja1RvU2NoZW1hLnJlbW92ZU1vdXNlTGlzdGVuZXIobW91c2VMaXN0ZW5lcik7Ci0gICAgc3VwZXIuZGVhY3RpdmF0ZSgpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQmFzZUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0Jhc2VFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWM1ODBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQmFzZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5TY2FsYWJsZVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLlpvb21MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLlpvb21NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLkZpbGVTdG9yZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUZlZWRiYWNrSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLktleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXMuSUZpZ3VyZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLkNvbW1vbk11bHRpUGFnZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdExpc3RlbmVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBpbXBsZW1lbnRzIElBY3Rpb25Qcm92aWRlciwgSUFEVE9iamVjdExpc3RlbmVyLCBJRmVlZGJhY2tIYW5kbGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfQUNUSU9OX0FSUkFZID0ge307Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzU2VsZWN0ZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzRm9jdXMgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzSGlnaENvbnRyYXN0ID0gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0SGlnaENvbnRyYXN0KCk7Ci0gIAotICBwdWJsaWMgSUZpZ3VyZUZhY3RvcnkgZ2V0RmlndXJlRmFjdG9yeSgpCi0gIHsKLSAgICBFZGl0UGFydEZhY3RvcnkgZmFjdG9yeSA9IGdldFZpZXdlcigpLmdldEVkaXRQYXJ0RmFjdG9yeSgpOwotICAgIEFzc2VydC5pc1RydWUoZmFjdG9yeSBpbnN0YW5jZW9mIElGaWd1cmVGYWN0b3J5LCAiRWRpdFBhcnRGYWN0b3J5IG11c3QgYmUgYW4gaW5zdGFuY2VvZiBvZiBJRmlndXJlRmFjdG9yeSIpOyAgICAgLy8kTk9OLU5MUy0xJAotICAgIHJldHVybiAoSUZpZ3VyZUZhY3RvcnkpZmFjdG9yeTsgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIElBY3Rpb25Qcm92aWRlcikKLSAgICB7Ci0gICAgICByZXR1cm4gKChJQWN0aW9uUHJvdmlkZXIpbW9kZWwpLmdldEFjdGlvbnMob2JqZWN0KTsKLSAgICB9ICAKLSAgICByZXR1cm4gRU1QVFlfQUNUSU9OX0FSUkFZOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBhZGRBY3Rpb25zVG9MaXN0KExpc3QgbGlzdCwgSUFjdGlvbltdIGFjdGlvbnMpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjdGlvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgbGlzdC5hZGQoYWN0aW9uc1tpXSk7Ci0gICAgfSAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkKLSAgewotICAgIHN1cGVyLmFjdGl2YXRlKCk7Ci0gICAgT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJQURUT2JqZWN0KQotICAgIHsKLSAgICAgIElBRFRPYmplY3Qgb2JqZWN0ID0gKElBRFRPYmplY3QpbW9kZWw7Ci0gICAgICBvYmplY3QucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGdldFpvb21NYW5hZ2VyKCkgIT0gbnVsbCkKLSAgICAgIGdldFpvb21NYW5hZ2VyKCkuYWRkWm9vbUxpc3RlbmVyKHpvb21MaXN0ZW5lcik7Ci0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJQURUT2JqZWN0KQotICAgIHsKLSAgICAgIElBRFRPYmplY3Qgb2JqZWN0ID0gKElBRFRPYmplY3QpbW9kZWw7Ci0gICAgICBvYmplY3QudW5yZWdpc3Rlckxpc3RlbmVyKHRoaXMpOwotICAgIH0gICAKLSAgICAKLSAgICBpZiAoZ2V0Wm9vbU1hbmFnZXIoKSAhPSBudWxsKQotICAgICAgZ2V0Wm9vbU1hbmFnZXIoKS5yZW1vdmVab29tTGlzdGVuZXIoem9vbUxpc3RlbmVyKTsgICAgCi0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBzdXBlci5kZWFjdGl2YXRlKCk7Ci0gICAgfSAgCi0gIH0gIAotICAKLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIHJlZnJlc2goKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLSAgICAKLSAgICBib29sZWFuIGRvVXBkYXRlRGVzaWduID0gZG9VcGRhdGVEZXNpZ24oKTsKLSAgICBpZiAoZG9VcGRhdGVEZXNpZ24pCi0gICAgewotICAgICAgc3VwZXIucmVmcmVzaCgpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvYmogPSBpLm5leHQoKTsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEJhc2VFZGl0UGFydCkKLSAgICAgICAgewotICAgICAgICAgICgoQmFzZUVkaXRQYXJ0KSBvYmopLnJlZnJlc2goKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgKChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBvYmopLnJlZnJlc2goKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEZlZWRiYWNrKCkKLSAgewotICAgIGlzU2VsZWN0ZWQgPSB0cnVlOwotICAgIHJlZnJlc2hWaXN1YWxzKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpCi0gIHsKLSAgICBpc1NlbGVjdGVkID0gZmFsc2U7Ci0gICAgcmVmcmVzaFZpc3VhbHMoKTsKLSAgfQotICAKLSAgcHVibGljIFpvb21NYW5hZ2VyIGdldFpvb21NYW5hZ2VyKCkKLSAgewotICAgIHJldHVybiAoKFNjYWxhYmxlUm9vdEVkaXRQYXJ0KWdldFJvb3QoKSkuZ2V0Wm9vbU1hbmFnZXIoKTsKLSAgfQotICAKLSAgcHVibGljIFJlY3RhbmdsZSBnZXRab29tZWRCb3VuZHMoUmVjdGFuZ2xlIHIpCi0gIHsKLSAgICBkb3VibGUgZmFjdG9yID0gZ2V0Wm9vbU1hbmFnZXIoKS5nZXRab29tKCk7Ci0gICAgaW50IHggPSAoaW50KU1hdGgucm91bmQoci54ICogZmFjdG9yKTsKLSAgICBpbnQgeSA9IChpbnQpTWF0aC5yb3VuZChyLnkgKiBmYWN0b3IpOwotICAgIGludCB3aWR0aCA9IChpbnQpTWF0aC5yb3VuZChyLndpZHRoICogZmFjdG9yKTsKLSAgICBpbnQgaGVpZ2h0ID0gKGludClNYXRoLnJvdW5kKHIuaGVpZ2h0ICogZmFjdG9yKTsKLQotICAgIHJldHVybiBuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpOwotICB9Ci0gIAotICBwcml2YXRlIFpvb21MaXN0ZW5lciB6b29tTGlzdGVuZXIgPSBuZXcgWm9vbUxpc3RlbmVyKCkKLSAgewotICAgIHB1YmxpYyB2b2lkIHpvb21DaGFuZ2VkKGRvdWJsZSB6b29tKQotICAgIHsKLSAgICAgIGhhbmRsZVpvb21DaGFuZ2VkKCk7Ci0gICAgfQotICB9OwotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVpvb21DaGFuZ2VkKCkKLSAgewotICAgIHJlZnJlc2hWaXN1YWxzKCk7Ci0gIH0KLQotICBwdWJsaWMgSUVkaXRvclBhcnQgZ2V0RWRpdG9yUGFydCgpCi0gIHsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gbnVsbDsKLSAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgaWYgKHdvcmtiZW5jaCAhPSBudWxsKQotICAgIHsKLSAgICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAod29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0vLyAgICBBc3NlcnQuaXNOb3ROdWxsKGVkaXRvclBhcnQpOwotICAgIHJldHVybiBlZGl0b3JQYXJ0OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeS5LRVksIG5ldyBLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5KCkKLSAgICB7ICAgICAgCi0gICAgICBwdWJsaWMgRWRpdFBhcnQgZ2V0UmVsYXRpdmVFZGl0UGFydChFZGl0UGFydCBlZGl0UGFydCwgaW50IGRpcmVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGRvR2V0UmVsYXRpdmVFZGl0UGFydChlZGl0UGFydCwgZGlyZWN0aW9uKTsgIAotICAgICAgfSAgICAgICAgICAgCi0gICAgfSk7ICAgICAgICAKLSAgfQotICAKLSAgCi0gIHB1YmxpYyBFZGl0UGFydCBkb0dldFJlbGF0aXZlRWRpdFBhcnQoRWRpdFBhcnQgZWRpdFBhcnQsIGludCBkaXJlY3Rpb24pCi0gIHsgICAKLSAgICByZXR1cm4gbnVsbDsgICAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNGaWxlUmVhZE9ubHkoKQotICB7Ci0gICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgIGlmICh3b3JrYmVuY2ggIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIGlmIChwYWdlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgIGlmIChlZGl0b3IgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICAgIGlmICghKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCB8fCBlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIEZpbGVTdG9yZUVkaXRvcklucHV0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgLy8gRm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTgyODEKLSAgLy8gRG9uJ3Qgd2FudCB0byByZWZyZXNoIHRoZSBkZXNpZ24gd2hlbiBjaGFuZ2VzIGFyZSBtYWRlIGluIHRoZSBzb3VyY2Ugdmlldy4KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZG9VcGRhdGVEZXNpZ24oKQotICB7Ci0gICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgIGlmICh3b3JrYmVuY2ggIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIGlmIChwYWdlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICBpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIENvbW1vbk11bHRpUGFnZUVkaXRvcikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDb21tb25NdWx0aVBhZ2VFZGl0b3IgZWRpdG9yID0gKENvbW1vbk11bHRpUGFnZUVkaXRvcikgZWRpdG9yUGFydDsKLSAgICAgICAgICAgIEdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoR3JhcGhpY2FsVmlld2VyKWVkaXRvci5nZXRBZGFwdGVyKEdyYXBoaWNhbFZpZXdlci5jbGFzcyk7Ci0gICAgICAgICAgICAvLyBOZWVkIHRvIGVuc3VyZSB0aGlzIGlzIHRoZSBzYW1lIGVkaXRvciB3ZSBhcmUgd29ya2luZyB3aXRoIHNpbmNlIHRoZSBhY3RpdmUgZWRpdG9yIG1heSBub3QgYmUgCi0gICAgICAgICAgICAvLyB0aGUgY3VycmVudCwgZWcuIGF0IHN0YXJ0dXAsIHRoZXJlIGNhbiBiZSBhbm90aGVyIFhTRCBFZGl0b3Igb3BlbiBvbiB0aGUgc291cmNlIHBhZ2UsIHNvIHdlIGNvdWxkIGVuZAotICAgICAgICAgICAgLy8gdXAgbm90IHBvcHVsYXRpbmcgdGhlIGRlc2lnbiB2aWV3IGluaXRhbGx5Ci0gICAgICAgICAgICBpZiAoZ2V0Vmlld2VyKCkgPT0gdmlld2VyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBJZiBzb3VyY2UgcGFnZSBpcyBhY3RpdmUsIGRvbid0IHVwZGF0ZSB0aGUgZGVzaWduCi0gICAgICAgICAgICAgIHJldHVybiAhZWRpdG9yLmlzU291cmNlUGFnZUFjdGl2ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9CYXNlRmllbGRFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9CYXNlRmllbGRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDRiNmI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQmFzZUZpZWxkRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkRyYWdUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkxvY2F0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQuQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdC5FbGVtZW50UmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmRpcmVjdGVkaXQuTGFiZWxDZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdC5MYWJlbEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5kaXJlY3RlZGl0LlR5cGVSZWZlcmVuY2VEaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkZvY3VzVHlwZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLkFEVERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5BRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5JQURUVXBkYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JRmllbGRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5Db25uZWN0YWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5UYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5UYXJnZXRDb25uZWN0aW9uU3BhY2VGaWxsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kZXNpZ24uZWRpdHBvbGljaWVzLkdyYXBoTm9kZURyYWdUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIEJhc2VGaWVsZEVkaXRQYXJ0IGV4dGVuZHMgQmFzZVR5cGVDb25uZWN0aW5nRWRpdFBhcnQgaW1wbGVtZW50cyBJTmFtZWRFZGl0UGFydAotewotICBwcm90ZWN0ZWQgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gY29ubmVjdGlvbkZpZ3VyZTsKLSAgcHJvdGVjdGVkIEFEVERpcmVjdEVkaXRQb2xpY3kgYWR0RGlyZWN0RWRpdFBvbGljeSA9IG5ldyBBRFREaXJlY3RFZGl0UG9saWN5KCk7Ci0gIHByb3RlY3RlZCBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbiBjb25uZWN0aW9uRmVlZGJhY2tGaWd1cmU7Ci0gIAotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7ICAgICAgICAgIAotICAgIElGaWVsZEZpZ3VyZSBmaWd1cmUgPSBnZXRGaWd1cmVGYWN0b3J5KCkuY3JlYXRlRmllbGRGaWd1cmUoZ2V0TW9kZWwoKSk7ICAgIAotICAgIGZpZ3VyZS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJRmllbGRGaWd1cmUgZ2V0RmllbGRGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIChJRmllbGRGaWd1cmUpZmlndXJlOwotICB9Ci0gCi0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREcmF3Q29ubmVjdGlvbigpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIAotICAgIC8vIEZvciBub3cgd2Ugb25seSB3YW50IHRvIHByb2R1Y2Ugb3V0Ym91bmQgbGluZXMgZnJvbSBhIEZpZWxkIHRvIGEgVHlwZQotICAgIC8vIHdoZW4gdGhlIGZpZWxkIGluIGNvbnRhaW5lZCBpbiB0aGUgJ2ZvY3VzJyBlZGl0IHBhcnQgICAgCi0gICAgZm9yIChFZGl0UGFydCBwYXJlbnQgPSBnZXRQYXJlbnQoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKSkKLSAgICB7ICAKLSAgICAgIGlmIChwYXJlbnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIEZvY3VzVHlwZUNvbHVtbikKLSAgICAgIHsgICAgICAgIAotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0gIAotICAgIH0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgcHJpdmF0ZSBFZGl0UGFydCBnZXRUYXJnZXRFZGl0UGFydChJVHlwZSB0eXBlKQotICB7Ci0gICAgQ29sdW1uRWRpdFBhcnQgY29sdW1uRWRpdFBhcnQgPSBudWxsOwotICAgIGZvciAoRWRpdFBhcnQgZWRpdFBhcnQgPSB0aGlzOyBlZGl0UGFydCAhPSBudWxsOyBlZGl0UGFydCA9IGVkaXRQYXJ0LmdldFBhcmVudCgpKQotICAgIHsKLSAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbHVtbkVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBjb2x1bW5FZGl0UGFydCA9IChDb2x1bW5FZGl0UGFydCllZGl0UGFydDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAKLSAgICB9ICAgICAKLSAgICBpZiAoY29sdW1uRWRpdFBhcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBnZXQgdGhlIG5leHQgY29sdW1uCi0gICAgICBFZGl0UGFydCBwYXJlbnQgPSBjb2x1bW5FZGl0UGFydC5nZXRQYXJlbnQoKTsKLSAgICAgIExpc3QgY29sdW1ucyA9IHBhcmVudC5nZXRDaGlsZHJlbigpOwotICAgICAgaW50IGluZGV4ID0gY29sdW1ucy5pbmRleE9mKGNvbHVtbkVkaXRQYXJ0KTsKLSAgICAgIGlmIChpbmRleCArIDEgPCBjb2x1bW5zLnNpemUoKSkKLSAgICAgIHsgIAotICAgICAgICBFZGl0UGFydCBuZXh0Q29sdW1uID0gKEVkaXRQYXJ0KWNvbHVtbnMuZ2V0KGluZGV4ICsgMSk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5leHRDb2x1bW4uZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgRWRpdFBhcnQgY2hpbGQgPSAoRWRpdFBhcnQpaS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGNoaWxkLmdldE1vZGVsKCkgPT0gdHlwZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGQ7Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0gIAotICAgICAgfSAgCi0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIEVkaXRQYXJ0IGdldFRhcmdldENvbm5lY3Rpb25FZGl0UGFydCgpCi0gIHsKLSAgICBFZGl0UGFydCByZXN1bHQgPSBudWxsOyAKLSAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKWdldE1vZGVsKCk7Ci0gICAgSVR5cGUgdHlwZSA9IGZpZWxkLmdldFR5cGUoKTsKLSAgICBpZiAodHlwZSAhPSBudWxsKQotICAgIHsgICAgICAKLSAgICAgIHJlc3VsdCA9IGdldFRhcmdldEVQKHR5cGUpOyAvL2dldFRhcmdldEVkaXRQYXJ0KHR5cGUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICAvKioKLSAgICogRG8gbm90IG92ZXJyaWRlCi0gICAqIEBwYXJhbSB0eXBlCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHByb3RlY3RlZCBFZGl0UGFydCBnZXRUYXJnZXRFUChJVHlwZSB0eXBlKQotICB7Ci0gICAgcmV0dXJuIGdldFRhcmdldEVkaXRQYXJ0KHR5cGUpOwotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZSgpCi0gIHsKLSAgICBjb25uZWN0aW9uRmlndXJlID0gbnVsbDsgICAKLSAgICBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHJlZmVyZW5jZVR5cGVQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpZ2V0VGFyZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KCk7Ci0gICAgaWYgKHJlZmVyZW5jZVR5cGVQYXJ0ICE9IG51bGwpCi0gICAgewotICAgICAgY29ubmVjdGlvbkZpZ3VyZSA9IG5ldyBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbigpOwotCi0gICAgICBpZiAoZ2V0RmlndXJlKCkuZ2V0UGFyZW50KCkgPT0gcmVmZXJlbmNlVHlwZVBhcnQuZ2V0RmlndXJlKCkpCi0gICAgICB7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0U291cmNlQW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5MRUZULCAxKSk7IAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjb25uZWN0aW9uRmlndXJlLnNldFNvdXJjZUFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKGdldEZpZ3VyZSgpLCBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuUklHSFQsIDUpKTsKLSAgICAgIH0KLSAgICAgIGludCB0YXJnZXRBbmNob3JZT2Zmc2V0ID0gODsKLQotICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRUYXJnZXRBbmNob3IobmV3IENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcihyZWZlcmVuY2VUeXBlUGFydC5nZXRGaWd1cmUoKSwgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLkhFQURFUl9MRUZULCAwLCB0YXJnZXRBbmNob3JZT2Zmc2V0KSk7IAotICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRIaWdobGlnaHQoZmFsc2UpOwotICAgIH0KLQotICAgIHJldHVybiBjb25uZWN0aW9uRmlndXJlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwgYWR0RGlyZWN0RWRpdFBvbGljeSk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgbmV3IEFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeSgpKTsKLSAgfQotICAKLSAgcHVibGljIEVkaXRQYXJ0IGRvR2V0UmVsYXRpdmVFZGl0UGFydChFZGl0UGFydCBlZGl0UGFydCwgaW50IGRpcmVjdGlvbikKLSAgewotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7ICAgICAgICAKLSAgICBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLkVBU1QpCi0gICAgeyAgICAKLSAgICAgIHJlc3VsdCA9IGdldFRhcmdldENvbm5lY3Rpb25FZGl0UGFydCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuV0VTVCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRQYXJlbnQoKS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBTZWN0aW9uRWRpdFBhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICBTZWN0aW9uRWRpdFBhcnQgZ3JvdXBzID0gKFNlY3Rpb25FZGl0UGFydCkgY2hpbGQ7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZ3JvdXBzLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgZ3JvdXBDaGlsZCA9IGkubmV4dCgpOwotICAgICAgICAgICAgRWRpdFBhcnQgY29ubmVjdGFibGUgPSBnZXRQYXJlbnRDb25uZWN0YWJsZUVkaXRQYXJ0KChFZGl0UGFydClncm91cENoaWxkKTsKLSAgICAgICAgICAgIGlmIChjb25uZWN0YWJsZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBjb25uZWN0YWJsZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gdGhpczsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHN1cGVyLmRvR2V0UmVsYXRpdmVFZGl0UGFydChlZGl0UGFydCwgZGlyZWN0aW9uKTsKLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICByZXN1bHQgPSAoKEJhc2VFZGl0UGFydClnZXRQYXJlbnQoKSkuZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KGVkaXRQYXJ0LCBkaXJlY3Rpb24pOwotICAgICAgfSAgCi0gICAgfSAgCi0gICAgcmV0dXJuIHJlc3VsdDsgICAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIENvbm5lY3RhYmxlRWRpdFBhcnQgZ2V0UGFyZW50Q29ubmVjdGFibGVFZGl0UGFydChFZGl0UGFydCBjb25uZWN0YWJsZSkKLSAgewotICAgIGlmIChjb25uZWN0YWJsZSBpbnN0YW5jZW9mIFRhcmdldENvbm5lY3Rpb25TcGFjaW5nRmlndXJlRWRpdFBhcnQpCi0gICAgewotICAgICAgVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyIHNwYWNlID0gKFRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcikgKChUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KWNvbm5lY3RhYmxlKS5nZXRNb2RlbCgpOwotICAgICAgaWYgKHNwYWNlLmdldEFkYXB0ZXIoKSA9PSB0aGlzLmdldE1vZGVsKCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoQ29ubmVjdGFibGVFZGl0UGFydCljb25uZWN0YWJsZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgZm9yIChJdGVyYXRvciBpID0gY29ubmVjdGFibGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE9iamVjdCBjaGlsZCA9IGkubmV4dCgpOwotICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQ29ubmVjdGFibGVFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgQ29ubmVjdGFibGVFZGl0UGFydCByID0gZ2V0UGFyZW50Q29ubmVjdGFibGVFZGl0UGFydCgoRWRpdFBhcnQpY2hpbGQpOwotICAgICAgICBpZiAociAhPSBudWxsKSByZXR1cm4gcjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgVGFyZ2V0Q29ubmVjdGlvblNwYWNpbmdGaWd1cmVFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgVGFyZ2V0Q29ubmVjdGlvblNwYWNlRmlsbGVyIHNwYWNlID0gKFRhcmdldENvbm5lY3Rpb25TcGFjZUZpbGxlcikgKChUYXJnZXRDb25uZWN0aW9uU3BhY2luZ0ZpZ3VyZUVkaXRQYXJ0KWNoaWxkKS5nZXRNb2RlbCgpOwotICAgICAgICBpZiAoc3BhY2UuZ2V0QWRhcHRlcigpID09IHRoaXMuZ2V0TW9kZWwoKSAmJiBjb25uZWN0YWJsZSBpbnN0YW5jZW9mIENvbm5lY3RhYmxlRWRpdFBhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gKENvbm5lY3RhYmxlRWRpdFBhcnQpY29ubmVjdGFibGU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLSAgICBJRmllbGRGaWd1cmUgZmlndXJlID0gZ2V0RmllbGRGaWd1cmUoKTsKLSAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKSBnZXRNb2RlbCgpOwotICAgIAotICAgIGZpZ3VyZS5nZXROYW1lTGFiZWwoKS5zZXRUZXh0KGZpZWxkLmdldE5hbWUoKSk7Ci0gICAgZmlndXJlLmdldFR5cGVMYWJlbCgpLnNldFRleHQoZmllbGQuZ2V0VHlwZU5hbWUoKSk7Ci0gICAgZmlndXJlLnJlZnJlc2hWaXN1YWxzKGdldE1vZGVsKCkpOwotCi0gICAgZmlndXJlLnJlY29tcHV0ZUxheW91dCgpOwotCi0gICAgKChHcmFwaGljYWxFZGl0UGFydClnZXRSb290KCkpLmdldEZpZ3VyZSgpLmludmFsaWRhdGVUcmVlKCk7Ci0gIH0KLQotICBwdWJsaWMgRHJhZ1RyYWNrZXIgZ2V0RHJhZ1RyYWNrZXIoUmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgcmV0dXJuIG5ldyBHcmFwaE5vZGVEcmFnVHJhY2tlcih0aGlzKTsKLSAgfQotICAKLSAgLyoKLSAgcHVibGljIElBY3Rpb25bXSBnZXRBY3Rpb25zKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAvLyB3aGVuIGEgRmllbGRFZGl0UGFydCBpcyBzZWxlY3RlZCBpdCBwcm92aWRlcyBpdCdzIG93biBhY3Rpb25zCi0gICAgLy8gYXMgd2VsbCBhcyB0aG9zZSBvZiBpdCdzIHBhcmVudCAndHlwZScgZWRpdCBwYXJ0Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIEVkaXRQYXJ0IGNvbXBhcnRtZW50ID0gZ2V0UGFyZW50KCk7Ci0gICAgaWYgKGNvbXBhcnRtZW50ICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBFZGl0UGFydCB0eXBlID0gY29tcGFydG1lbnQuZ2V0UGFyZW50KCk7Ci0gICAgICBpZiAodHlwZSAhPSBudWxsICYmIHR5cGUgaW5zdGFuY2VvZiBJQWN0aW9uUHJvdmlkZXIpCi0gICAgICB7Ci0gICAgICAgIElBY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IChJQWN0aW9uUHJvdmlkZXIpdHlwZTsKLSAgICAgICAgYWRkQWN0aW9uc1RvTGlzdChsaXN0LCBwcm92aWRlci5nZXRBY3Rpb25zKG9iamVjdCkpOwotICAgICAgfQotICAgIH0KLSAgICBhZGRBY3Rpb25zVG9MaXN0KGxpc3QsIHN1cGVyLmdldEFjdGlvbnMob2JqZWN0KSk7Ci0gICAgSUFjdGlvbltdIHJlc3VsdCA9IG5ldyBJQWN0aW9uW2xpc3Quc2l6ZSgpXTsKLSAgICBsaXN0LnRvQXJyYXkocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ki8KLSAgCi0gIHB1YmxpYyBMYWJlbCBnZXROYW1lTGFiZWxGaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIGdldEZpZWxkRmlndXJlKCkuZ2V0TmFtZUxhYmVsKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBjdXJzb3JMb2NhdGlvbikKLSAgewotICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpCi0gIHsgIAotICAgIGlmICgoKElBRFRPYmplY3QpZ2V0TW9kZWwoKSkuaXNSZWFkT25seSgpIHx8IGlzRmlsZVJlYWRPbmx5KCkpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVR8fAotICAgICAgICByZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9PUEVOKQotICAgIHsKLSAgICAgIElGaWVsZEZpZ3VyZSBmaWVsZEZpZ3VyZSA9IGdldEZpZWxkRmlndXJlKCk7Ci0gICAgICBPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBMb2NhdGlvblJlcXVlc3QpCi0gICAgICB7Ci0gICAgICAgIExvY2F0aW9uUmVxdWVzdCBsb2NhdGlvblJlcXVlc3QgPSAoTG9jYXRpb25SZXF1ZXN0KXJlcXVlc3Q7Ci0gICAgICAgIFBvaW50IHAgPSBsb2NhdGlvblJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAKLSAgICAgICAgaWYgKGhpdFRlc3QoZmllbGRGaWd1cmUuZ2V0VHlwZUxhYmVsKCksIHApKQotICAgICAgICB7Ci0gICAgICAgICAgVHlwZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgVHlwZVJlZmVyZW5jZURpcmVjdEVkaXRNYW5hZ2VyKChJRmllbGQpbW9kZWwsIHRoaXMsIGZpZWxkRmlndXJlLmdldFR5cGVMYWJlbCgpKTsKLSAgICAgICAgICBUeXBlVXBkYXRlQ29tbWFuZCB0eXBlVXBkYXRlQ29tbWFuZCA9IG5ldyBUeXBlVXBkYXRlQ29tbWFuZCgpOwotICAgICAgICAgIHR5cGVVcGRhdGVDb21tYW5kLnNldERlbGVnYXRlKG1hbmFnZXIpOwotICAgICAgICAgIGFkdERpcmVjdEVkaXRQb2xpY3kuc2V0VXBkYXRlQ29tbWFuZCh0eXBlVXBkYXRlQ29tbWFuZCk7Ci0gICAgICAgICAgbWFuYWdlci5zaG93KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaGl0VGVzdChmaWVsZEZpZ3VyZS5nZXROYW1lTGFiZWwoKSwgcCkpCi0gICAgICAgIHsKLSAgICAgICAgCWRpcmVjdEVkaXROYW1lRmllbGQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgCSAgZGlyZWN0RWRpdE5hbWVGaWVsZCgpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgZGlyZWN0RWRpdE5hbWVGaWVsZCgpCi0gIHsKLSAgICBpZiAoaXNGaWxlUmVhZE9ubHkoKSkgcmV0dXJuOwotCSAgT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkgIElGaWVsZEZpZ3VyZSBmaWVsZEZpZ3VyZSA9IGdldEZpZWxkRmlndXJlKCk7Ci0gIAlpZiAoIG1vZGVsIGluc3RhbmNlb2YgSUZpZWxkKSAKLSAgICB7Ci0gICAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKSBtb2RlbDsKLSAgICAgIGlmIChmaWVsZC5pc1JlZmVyZW5jZSgpKQotICAgICAgewotICAgICAgICBFbGVtZW50UmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlciA9IG5ldyBFbGVtZW50UmVmZXJlbmNlRGlyZWN0RWRpdE1hbmFnZXIoKElGaWVsZCkgbW9kZWwsIHRoaXMsIGZpZWxkRmlndXJlLmdldE5hbWVMYWJlbCgpKTsKLSAgICAgICAgUmVmZXJlbmNlVXBkYXRlQ29tbWFuZCBlbGVtZW50VXBkYXRlQ29tbWFuZCA9IG5ldyBSZWZlcmVuY2VVcGRhdGVDb21tYW5kKCk7Ci0gICAgICAgIGVsZW1lbnRVcGRhdGVDb21tYW5kLnNldERlbGVnYXRlKG1hbmFnZXIpOwotICAgICAgICBhZHREaXJlY3RFZGl0UG9saWN5LnNldFVwZGF0ZUNvbW1hbmQoZWxlbWVudFVwZGF0ZUNvbW1hbmQpOwotICAgICAgICBtYW5hZ2VyLnNob3coKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgTGFiZWxFZGl0TWFuYWdlciBtYW5hZ2VyID0gbmV3IExhYmVsRWRpdE1hbmFnZXIodGhpcywgbmV3IExhYmVsQ2VsbEVkaXRvckxvY2F0b3IodGhpcywgbnVsbCkpOwotICAgICAgICBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIgd3JhcHBlciA9IG5ldyBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIoKTsKLSAgICAgICAgYWR0RGlyZWN0RWRpdFBvbGljeS5zZXRVcGRhdGVDb21tYW5kKHdyYXBwZXIpOwotICAgICAgICBtYW5hZ2VyLnNob3coKTsKLSAgICAgIH0KLSAgCX0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgZG9FZGl0TmFtZShib29sZWFuIGFkZEZyb21EZXNpZ24pCi0gIHsKLSAgICBpZiAoIWFkZEZyb21EZXNpZ24pIHJldHVybjsKLSAgICAKLS8vICAgIHJlbW92ZUZlZWRiYWNrKCk7Ci0KLSAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9ICgoWFNEQmFzZUFkYXB0ZXIpZ2V0TW9kZWwoKSkuZ2V0VGFyZ2V0KCk7Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgIFBvaW50IHAgPSBnZXROYW1lTGFiZWxGaWd1cmUoKS5nZXRMb2NhdGlvbigpOwotICAgICAgICAgIExhYmVsRWRpdE1hbmFnZXIgbWFuYWdlciA9IG5ldyBMYWJlbEVkaXRNYW5hZ2VyKEJhc2VGaWVsZEVkaXRQYXJ0LnRoaXMsIG5ldyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKEJhc2VGaWVsZEVkaXRQYXJ0LnRoaXMsIHApKTsKLSAgICAgICAgICBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIgd3JhcHBlciA9IG5ldyBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIoKTsKLSAgICAgICAgICBhZHREaXJlY3RFZGl0UG9saWN5LnNldFVwZGF0ZUNvbW1hbmQod3JhcHBlcik7Ci0gICAgICAgICAgbWFuYWdlci5zaG93KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0KLSAgfQotICAKLSAgcHJvdGVjdGVkIGNsYXNzIE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlciBleHRlbmRzIENvbW1hbmQgaW1wbGVtZW50cyBJQURUVXBkYXRlQ29tbWFuZAotICB7Ci0gICAgQ29tbWFuZCBjb21tYW5kOwotICAgIHByb3RlY3RlZCBEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0OwotICAgIAotICAgIHB1YmxpYyBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIoKQotICAgIHsKLSAgICAgIHN1cGVyKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX05BTUUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3QoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkKLSAgICB7Ci0gICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgICB7Ci0gICAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKWdldE1vZGVsKCk7Ci0gICAgICBPYmplY3QgbmV3VmFsdWUgPSByZXF1ZXN0LmdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpOwotICAgICAgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgewotICAgICAgICBjb21tYW5kID0gZmllbGQuZ2V0VXBkYXRlTmFtZUNvbW1hbmQoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoY29tbWFuZCAhPSBudWxsKQotICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIGNsYXNzIFR5cGVVcGRhdGVDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCBpbXBsZW1lbnRzIElBRFRVcGRhdGVDb21tYW5kCi0gIHsKLSAgICBwcm90ZWN0ZWQgQ29tYm9Cb3hDZWxsRWRpdG9yTWFuYWdlciBkZWxlZ2F0ZTsKLSAgICBwcm90ZWN0ZWQgRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdDsKLSAgICAKLSAgICBwdWJsaWMgVHlwZVVwZGF0ZUNvbW1hbmQoKQotICAgIHsKLSAgICAgIHN1cGVyKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX1RZUEUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlbGVnYXRlKENvbWJvQm94Q2VsbEVkaXRvck1hbmFnZXIgZGVsZWdhdGUpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdChEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KQotICAgIHsKLSAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgIHsKLSAgICAgIGlmIChkZWxlZ2F0ZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBkZWxlZ2F0ZS5wZXJmb3JtRWRpdChyZXF1ZXN0LmdldENlbGxFZGl0b3IoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpCi0gICAgewotICAgICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZClnZXRNb2RlbCgpOwotICAgICAgT2JqZWN0IG5ld1ZhbHVlID0gKChDQ29tYm8pcmVxdWVzdC5nZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpKS5nZXRUZXh0KCk7Ci0gICAgICBpZiAobmV3VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAhbmV3VmFsdWUuZXF1YWxzKGZpZWxkLmdldFR5cGVOYW1lKCkpOwotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgY2xhc3MgUmVmZXJlbmNlVXBkYXRlQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgaW1wbGVtZW50cyBJQURUVXBkYXRlQ29tbWFuZAotICB7Ci0JICAgIHByb3RlY3RlZCBDb21ib0JveENlbGxFZGl0b3JNYW5hZ2VyIGRlbGVnYXRlOwotCSAgICBwcm90ZWN0ZWQgRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdDsKLQkgICAgCi0JICAgIHB1YmxpYyBSZWZlcmVuY2VVcGRhdGVDb21tYW5kKCkKLQkgICAgewotCSAgICAgIHN1cGVyKE1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX0VMRU1FTlRfUkVGRVJFTkNFKTsKLQkgICAgfQotCi0JICAgIHB1YmxpYyB2b2lkIHNldERlbGVnYXRlKENvbWJvQm94Q2VsbEVkaXRvck1hbmFnZXIgZGVsZWdhdGUpCi0JICAgIHsKLQkgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0JICAgIH0KLQotCSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0KERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpCi0JICAgIHsKLQkgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotCSAgICB9Ci0KLQkgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0JICAgIHsKLQkgICAgICBpZiAoZGVsZWdhdGUgIT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICBkZWxlZ2F0ZS5wZXJmb3JtRWRpdChyZXF1ZXN0LmdldENlbGxFZGl0b3IoKSk7Ci0JICAgICAgfQotCSAgICB9Ci0KLQkgICAgcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpCi0JICAgIHsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpCi0gIHsKLSAgICAvLyBQdXQgYmFjayBjb25uZWN0aW9uIGZpZ3VyZSBzbyBpdCB3b24ndCBnZXQgb3ZlcmxheWVkIGJ5IG90aGVyIG5vbiBoaWdobGlnaHRlZCBjb25uZWN0aW9ucwotICAgIGlmIChjb25uZWN0aW9uRmlndXJlICE9IG51bGwpCi0gICAgewotICAgICAgY29ubmVjdGlvbkZlZWRiYWNrRmlndXJlID0gbmV3IFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uKCk7Ci0gICAgICBjb25uZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0U291cmNlQW5jaG9yKGNvbm5lY3Rpb25GaWd1cmUuZ2V0U291cmNlQW5jaG9yKCkpOwotICAgICAgY29ubmVjdGlvbkZlZWRiYWNrRmlndXJlLnNldFRhcmdldEFuY2hvcihjb25uZWN0aW9uRmlndXJlLmdldFRhcmdldEFuY2hvcigpKTsKLSAgICAgIGNvbm5lY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRIaWdobGlnaHQodHJ1ZSk7Ci0gICAgICBnZXRMYXllcihMYXllckNvbnN0YW50cy5GRUVEQkFDS19MQVlFUikuYWRkKGNvbm5lY3Rpb25GZWVkYmFja0ZpZ3VyZSk7Ci0gICAgfQotICAgICBzdXBlci5hZGRGZWVkYmFjaygpOwotICAgICBnZXRGaWVsZEZpZ3VyZSgpLmFkZFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCkKLSAgewotICAgIGlmIChjb25uZWN0aW9uRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb25uZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0SGlnaGxpZ2h0KGZhbHNlKTsKLSAgICAgIGdldExheWVyKExheWVyQ29uc3RhbnRzLkZFRURCQUNLX0xBWUVSKS5yZW1vdmUoY29ubmVjdGlvbkZlZWRiYWNrRmlndXJlKTsKLSAgICB9Ci0gICAgY29ubmVjdGlvbkZlZWRiYWNrRmlndXJlID0gbnVsbDsKLSAgICBzdXBlci5yZW1vdmVGZWVkYmFjaygpOwotICAgIGdldEZpZWxkRmlndXJlKCkucmVtb3ZlU2VsZWN0aW9uRmVlZGJhY2soKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0Jhc2VUeXBlQ29ubmVjdGluZ0VkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0Jhc2VUeXBlQ29ubmVjdGluZ0VkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwM2NlNDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9CYXNlVHlwZUNvbm5lY3RpbmdFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUZlZWRiYWNrSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzLklBRFRVcGRhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSVR5cGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzb21lIGJhc2UgZnVuY3Rpb24gdG8gZW5hYmxlIGRyYXdpbmcgY29ubmVjdGlvbnMgdG8gYSByZWZlcmVuY2VkIHR5cGUKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlVHlwZUNvbm5lY3RpbmdFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydCBpbXBsZW1lbnRzIElGZWVkYmFja0hhbmRsZXIsIElDb25uZWN0aW9uQ29udGFpbmVyCi17Ci0gIHByaXZhdGUgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gY29ubmVjdGlvbkZpZ3VyZTsgIAotICAKLSAgcHVibGljIHZvaWQgYWN0aXZhdGUoKQotICB7Ci0gICAgc3VwZXIuYWN0aXZhdGUoKTsgICAgICAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpCi0gIHsKLSAgICBkZWFjdGl2YXRlQ29ubmVjdGlvbigpOwotICAgIHN1cGVyLmRlYWN0aXZhdGUoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVmcmVzaENvbm5lY3Rpb25zKCkKLSAgewotICAgIGRlYWN0aXZhdGVDb25uZWN0aW9uKCk7ICAgICAKLSAgICBhY3RpdmF0ZUNvbm5lY3Rpb24oKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFjdGl2YXRlQ29ubmVjdGlvbigpCi0gIHsgICAgCi0gICAgLy8gSWYgYXBwcm9wcmlhdGUsIGNyZWF0ZSBvdXIgY29ubmVjdGlvbkZpZ3VyZSBhbmQgYWRkIGl0IHRvIHRoZSBhcHByb3ByaWF0ZSBsYXllcgotICAgIGlmIChjb25uZWN0aW9uRmlndXJlID09IG51bGwgJiYgc2hvdWxkRHJhd0Nvbm5lY3Rpb24oKSkKLSAgICB7Ci0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiYWN0aXZhdGVlQ29ubmVjdGlvbigpLXByZToiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAgICAgICAgICAgCi0gICAgICBjb25uZWN0aW9uRmlndXJlID0gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZSgpOwotICAgICAgaWYgKGNvbm5lY3Rpb25GaWd1cmUgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICAvLyBBZGQgb3VyIGVkaXRwb2xpY3kgYXMgYSBsaXN0ZW5lciBvbiB0aGUgY29ubmVjdGlvbiwgc28gaXQgY2FuIHN0YXkgaW4gc3luY2gKLSAgICAgICAgLy9jb25uZWN0aW9uRmlndXJlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKEF0dHJpYnV0ZVNlbGVjdGlvbkZlZWRiYWNrUG9saWN5KSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUpKTsKLSAgICAgICAgLy9jb25uZWN0aW9uRmlndXJlLmFkZE1vdXNlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIGdldExheWVyKExheWVyQ29uc3RhbnRzLkNPTk5FQ1RJT05fTEFZRVIpLmFkZChjb25uZWN0aW9uRmlndXJlKTsKLSAgICAgIH0gIAotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgZGVhY3RpdmF0ZUNvbm5lY3Rpb24oKQotICB7Ci0gICAgLy8gaWYgd2UgaGF2ZSBhIGNvbm5lY3Rpb24sIHJlbW92ZSBpdAotICAgIGlmIChjb25uZWN0aW9uRmlndXJlICE9IG51bGwpCi0gICAgewotICAgICAgZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuQ09OTkVDVElPTl9MQVlFUikucmVtb3ZlKGNvbm5lY3Rpb25GaWd1cmUpOwotICAgICAgLy8gUmVtb3ZlIG91ciBlZGl0cG9saWN5IGxpc3RlbmVyKHMpCi0gICAgICAvL2Nvbm5lY3Rpb25GaWd1cmUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigoQXR0cmlidXRlU2VsZWN0aW9uRmVlZGJhY2tQb2xpY3kpIGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSkpOwotICAgICAgLy9jb25uZWN0aW9uRmlndXJlLnJlbW92ZU1vdXNlTGlzdGVuZXIodGhpcyk7Ci0gICAgICBjb25uZWN0aW9uRmlndXJlID0gbnVsbDsKLSAgICB9Ci0gIH0gIAotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRHJhd0Nvbm5lY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBhYnN0cmFjdCBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uRmlndXJlKCk7Ci0gIAotICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpCi0gIHsKLSAgICBpZiAoY29ubmVjdGlvbkZpZ3VyZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0SGlnaGxpZ2h0KHRydWUpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKQotICB7Ci0gICAgaWYgKGNvbm5lY3Rpb25GaWd1cmUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb25uZWN0aW9uRmlndXJlLnNldEhpZ2hsaWdodChmYWxzZSk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgY2xhc3MgTmFtZVVwZGF0ZUNvbW1hbmRXcmFwcGVyIGV4dGVuZHMgQ29tbWFuZCBpbXBsZW1lbnRzIElBRFRVcGRhdGVDb21tYW5kCi0gIHsKLSAgICBDb21tYW5kIGNvbW1hbmQ7Ci0gICAgcHJvdGVjdGVkIERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3Q7Ci0gICAgCi0gICAgcHVibGljIE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlcigpCi0gICAgewotICAgICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfTkFNRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdChEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KQotICAgIHsKLSAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgIHsKLSAgICAgIElUeXBlIGlUeXBlID0gKElUeXBlKWdldE1vZGVsKCk7Ci0gICAgICBPYmplY3QgbmV3VmFsdWUgPSByZXF1ZXN0LmdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpOwotICAgICAgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgewotICAgICAgICBjb21tYW5kID0gaVR5cGUuZ2V0VXBkYXRlTmFtZUNvbW1hbmQoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoY29tbWFuZCAhPSBudWxsKQotICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBoaXRUZXN0KElGaWd1cmUgdGFyZ2V0LCBQb2ludCBsb2NhdGlvbikKLSAgewotICAgIFJlY3RhbmdsZSBiID0gdGFyZ2V0LmdldEJvdW5kcygpLmdldENvcHkoKTsKLSAgICB0YXJnZXQudHJhbnNsYXRlVG9BYnNvbHV0ZShiKTsgIAotICAgIHJldHVybiBiLmNvbnRhaW5zKGxvY2F0aW9uKTsKLSAgfSAgIAotICAKLSAgcHVibGljIEVkaXRQYXJ0IGRvR2V0UmVsYXRpdmVFZGl0UGFydChFZGl0UGFydCBlZGl0UGFydCwgaW50IGRpcmVjdGlvbikKLSAgewotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7ICAgICAgICAKLSAgICBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLldFU1QpCi0gICAgeyAgICAKLSAgICAgIHJlc3VsdCA9IGdldENvbm5lY3Rpb25FZGl0UGFydChQb3NpdGlvbkNvbnN0YW50cy5XRVNUKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLkVBU1QpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KFBvc2l0aW9uQ29uc3RhbnRzLkVBU1QpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OyAgICAgICAgICAgIAotICB9ICAgICAgICAKLSAgCi0gIHByaXZhdGUgRWRpdFBhcnQgZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KGludCBkaXJlY3Rpb24pCi0gIHsKLSAgICAvLyBmaW5kIHRoZSBmaXJzdCBjb25uZWN0aW9uIHRoYXQgdGFyZ2V0cyB0aGlzIGVkaXRQYXJ0Ci0gICAgLy8gbmF2aWdhdGUgYmFja3dhcmQgYWxvbmcgdGhlIGNvbm5lY3Rpb24gKHRvIHRoZSBsZWZ0KSB0byBmaW5kIHRoZSBzb3VyY2UgZWRpdCBwYXJ0Ci0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRMYXllcihMYXllckNvbnN0YW50cy5DT05ORUNUSU9OX0xBWUVSKS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgRmlndXJlIGZpZ3VyZSA9IChGaWd1cmUpaS5uZXh0KCk7Ci0gICAgICBpZiAoZmlndXJlIGluc3RhbmNlb2YgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24pCi0gICAgICB7Ci0gICAgICAgIFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uIHR5cGVSZWZlcmVuY2VDb25uZWN0aW9uID0gKFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uKWZpZ3VyZTsKLSAgICAgICAgQ29ubmVjdGlvbkFuY2hvciB0aGlzQW5jaG9yID0gbnVsbDsKLSAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5FQVNUKQotICAgICAgICB7Ci0gICAgICAgICAgdGhpc0FuY2hvciA9IHR5cGVSZWZlcmVuY2VDb25uZWN0aW9uLmdldFNvdXJjZUFuY2hvcigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5XRVNUKQotICAgICAgICB7Ci0gICAgICAgICAgdGhpc0FuY2hvciA9IHR5cGVSZWZlcmVuY2VDb25uZWN0aW9uLmdldFRhcmdldEFuY2hvcigpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0aGlzQW5jaG9yICE9IG51bGwgJiYgdGhpc0FuY2hvci5nZXRPd25lcigpID09IGdldEZpZ3VyZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgQ29ubmVjdGlvbkFuY2hvciBvdXRBbmNob3IgPSBudWxsOwotICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuRUFTVCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBvdXRBbmNob3IgPSB0eXBlUmVmZXJlbmNlQ29ubmVjdGlvbi5nZXRUYXJnZXRBbmNob3IoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoZGlyZWN0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLldFU1QpCi0gICAgICAgICAgewotICAgICAgICAgICAgb3V0QW5jaG9yID0gdHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24uZ2V0U291cmNlQW5jaG9yKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGlmIChvdXRBbmNob3IgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJRmlndXJlIHNvdXJjZUZpZ3VyZSA9IG91dEFuY2hvci5nZXRPd25lcigpOyAgICAgICAgICAKLSAgICAgICAgICAgIEVkaXRQYXJ0IHBhcnQgPSBudWxsOwotICAgICAgICAgICAgd2hpbGUgKHBhcnQgPT0gbnVsbCAmJiBzb3VyY2VGaWd1cmUgIT0gbnVsbCkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBhcnQgPSAoRWRpdFBhcnQpZ2V0Vmlld2VyKCkuZ2V0VmlzdWFsUGFydE1hcCgpLmdldChzb3VyY2VGaWd1cmUpOwotICAgICAgICAgICAgICBzb3VyY2VGaWd1cmUgPSBzb3VyY2VGaWd1cmUuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICAgICAgcmVzdWx0ID0gcGFydDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgCi0gICAgICB9ICAgICAgICAgICAgICAgIAotICAgIH0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Cb3hFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Cb3hFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWE4NWRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQm94RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuQ29tcGFydG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5BRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5TaW1wbGVEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXMuQm94RmlndXJlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQm94RWRpdFBhcnQgZXh0ZW5kcyBCYXNlVHlwZUNvbm5lY3RpbmdFZGl0UGFydCAvL0lGZWVkYmFja0hhbmRsZXIKLXsgIAotICBwcm90ZWN0ZWQgTGlzdCBjb21wYXJ0bWVudExpc3QgPSBudWxsOwotICBwcm90ZWN0ZWQgU2ltcGxlRGlyZWN0RWRpdFBvbGljeSBzaW1wbGVEaXJlY3RFZGl0UG9saWN5ID0gbmV3IFNpbXBsZURpcmVjdEVkaXRQb2xpY3koKTsKLQotICBwcm90ZWN0ZWQgQ29tcGFydG1lbnRbXSBnZXRDb21wYXJ0bWVudHMoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBCb3hGaWd1cmUgZmlndXJlID0gbmV3IEJveEZpZ3VyZSgpOwotICAgIExpbmVCb3JkZXIgYm94TGluZUJvcmRlciA9IG5ldyBMaW5lQm9yZGVyKDEpOwotICAgIGZpZ3VyZS5zZXRCb3JkZXIoYm94TGluZUJvcmRlcik7ICAgIAotICAgIFRvb2xiYXJMYXlvdXQgdG9vbGJhckxheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KCk7Ci0gICAgdG9vbGJhckxheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIGZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKHRvb2xiYXJMYXlvdXQpOwotICAgIC8vIHdlIHNob3VsZCBvcmdhbml6ZSBJVHJlZUVsZW1lbnQgYW5kIGludGVncmF0ZSBpdCB3aXRoIHRoZSBmYWNhZGUKLSAgICBpZiAoZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIElUcmVlRWxlbWVudCkKLSAgICB7Ci0gICAgICBmaWd1cmUuZ2V0TmFtZUxhYmVsKCkuc2V0SWNvbigoKElUcmVlRWxlbWVudClnZXRNb2RlbCgpKS5nZXRJbWFnZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfQotICAKLSAgcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKQotICB7Ci0gICAgcmV0dXJuICgoQm94RmlndXJlKWdldEZpZ3VyZSgpKS5nZXRDb250ZW50UGFuZSgpOwotICB9Ci0gICAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBuZXcgQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5KCkpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwgc2ltcGxlRGlyZWN0RWRpdFBvbGljeSk7Ci0gIH0KLSAgCi0gICAKLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKQotICB7Ci0gICAgQm94RmlndXJlIGJveEZpZ3VyZSA9IChCb3hGaWd1cmUpZmlndXJlOwotICAgIExpbmVCb3JkZXIgYm94RmlndXJlTGluZUJvcmRlciA9IChMaW5lQm9yZGVyKWJveEZpZ3VyZS5nZXRCb3JkZXIoKTsKLSAgICBib3hGaWd1cmVMaW5lQm9yZGVyLnNldFdpZHRoKDIpOwotICAgIGJveEZpZ3VyZUxpbmVCb3JkZXIuc2V0Q29sb3IoQ29sb3JDb25zdGFudHMuZGFya0JsdWUpOyAgCi0gICAgYm94RmlndXJlLmdldEhlYWRpbmdGaWd1cmUoKS5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICBmaWd1cmUucmVwYWludCgpOwotICAgIHN1cGVyLmFkZEZlZWRiYWNrKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCkKLSAgewotICAgIEJveEZpZ3VyZSBib3hGaWd1cmUgPSAoQm94RmlndXJlKWZpZ3VyZTsKLSAgICBMaW5lQm9yZGVyIGJveEZpZ3VyZUxpbmVCb3JkZXIgPSAoTGluZUJvcmRlcilib3hGaWd1cmUuZ2V0Qm9yZGVyKCk7Ci0gICAgYm94RmlndXJlTGluZUJvcmRlci5zZXRXaWR0aCgxKTsKLSAgICBib3hGaWd1cmVMaW5lQm9yZGVyLnNldENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLSAgICBib3hGaWd1cmUuZ2V0SGVhZGluZ0ZpZ3VyZSgpLnNldFNlbGVjdGVkKGZhbHNlKTsKLSAgICBmaWd1cmUucmVwYWludCgpOwotICAgIHN1cGVyLnJlbW92ZUZlZWRiYWNrKCk7ICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgQWN0aW9uUmVnaXN0cnkgZ2V0RWRpdG9yQWN0aW9uUmVnaXN0cnkoSUVkaXRvclBhcnQgZWRpdG9yKQotICB7Ci0gICAgcmV0dXJuIChBY3Rpb25SZWdpc3RyeSkgZWRpdG9yLmdldEFkYXB0ZXIoQWN0aW9uUmVnaXN0cnkuY2xhc3MpOwotICB9Ci19ICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0NlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzkzYjlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmZpZ3VyZXMuQ2VudGVyZWRJY29uRmlndXJlOwotCi1wdWJsaWMgY2xhc3MgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yIGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPUCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPVFRPTSA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFRlQgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVCA9IDM7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSEVBREVSX0xFRlQgPSA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIRUFERVJfUklHSFQgPSA1OwotCi0gIHByaXZhdGUgaW50IGxvY2F0aW9uOwotICBwcml2YXRlIGludCBpbnNldDsKLSAgcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gMDsKLSAgcHJpdmF0ZSBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3Igb3RoZXI7Ci0KLSAgcHVibGljIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcihJRmlndXJlIG93bmVyLCBpbnQgbG9jYXRpb24sIGludCBpbnNldCkKLSAgewotICAgIHN1cGVyKG93bmVyKTsKLSAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgdGhpcy5pbnNldCA9IGluc2V0OwotICB9Ci0KLSAgcHVibGljIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvcihJRmlndXJlIG93bmVyLCBpbnQgbG9jYXRpb24sIGludCBpbnNldCwgaW50IG9mZnNldCkKLSAgewotICAgIHRoaXMob3duZXIsIGxvY2F0aW9uLCBpbnNldCk7Ci0gICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0gIH0KLQotICBwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oUG9pbnQgcmVmZXJlbmNlKQotICB7Ci0gICAgUmVjdGFuZ2xlIHIgPSBnZXRPd25lcigpLmdldEJvdW5kcygpOwotICAgIGludCB4LCB5OwotICAgIHN3aXRjaCAobG9jYXRpb24pCi0gICAgewotICAgIGNhc2UgVE9QOgotICAgICAgeCA9IHIucmlnaHQoKSAtIHIud2lkdGggLyAyICsgb2Zmc2V0OwotICAgICAgeSA9IHIueSArIGluc2V0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCT1RUT006Ci0gICAgICB4ID0gci5yaWdodCgpIC0gci53aWR0aCAvIDIgKyBvZmZzZXQ7Ci0gICAgICB5ID0gci5ib3R0b20oKSAtIGluc2V0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMRUZUOgotICAgICAgeCA9IHIueCArIGluc2V0OwotICAgICAgeSA9IHIuYm90dG9tKCkgLSByLmhlaWdodCAvIDIgKyBvZmZzZXQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJJR0hUOgotICAgICAgeCA9IHIucmlnaHQoKSAtIGluc2V0OwotICAgICAgeSA9IHIuYm90dG9tKCkgLSByLmhlaWdodCAvIDIgKyBvZmZzZXQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhFQURFUl9MRUZUOgotICAgICAgeCA9IHIueCArIGluc2V0OwotICAgICAgeSA9IHIueSArIG9mZnNldDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSEVBREVSX1JJR0hUOgotICAgICAgeCA9IHIucmlnaHQoKSAtIGluc2V0OwotICAgICAgeSA9IHIueSArIG9mZnNldDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHggPSByLnJpZ2h0KCkgLSByLndpZHRoIC8gMjsKLSAgICAgIHkgPSByLmJvdHRvbSgpIC0gci5oZWlnaHQgLyAyOwotICAgIH0KLSAgICBQb2ludCBwID0gbmV3IFBvaW50KHgsIHkpOwotCi0gICAgaWYgKCEoZ2V0T3duZXIoKSBpbnN0YW5jZW9mIENlbnRlcmVkSWNvbkZpZ3VyZSkpCi0gICAgewotICAgICAgZ2V0T3duZXIoKS50cmFuc2xhdGVUb0Fic29sdXRlKHApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZ2V0T3duZXIoKS50cmFuc2xhdGVUb0Fic29sdXRlKHApOwotICAgIH0KLSAgICAKLSAgICBpZiAob3RoZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBpZiB3aXRoaW4gb25seSBvbmUgcGl4ZWwgb2YgYmVpbmcgdmVydGljYWwsIHdlIHN0cmFpZ2h0ZW4gdXAgdGhlIGxpbmUKLSAgICAgIFBvaW50IHAyID0gb3RoZXIuZ2V0TG9jYXRpb24obnVsbCk7Ci0gICAgICBpZiAoTWF0aC5hYnMocDIueCAtIHAueCkgPD0gMSkKLSAgICAgIHsKLSAgICAgICAgcC54ID0gcDIueDsKLSAgICAgIH0gIAotICAgIH0gIAotICAgIHJldHVybiBwOwotICB9Ci0KLSAgcHVibGljIFBvaW50IGdldFJlZmVyZW5jZVBvaW50KCkKLSAgewotICAgIHJldHVybiBnZXRMb2NhdGlvbihudWxsKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE90aGVyKENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvciBvdGhlcikKLSAgewotICAgIHRoaXMub3RoZXIgPSBvdGhlcjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0NvbHVtbkVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0NvbHVtbkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYjQwOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Db2x1bW5FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuQWJzdHJhY3RNb2RlbENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbC5SZWZlcmVuY2VkVHlwZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUNvbXBsZXhUeXBlOwotCi1wdWJsaWMgY2xhc3MgQ29sdW1uRWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQKLXsgICAgICAgICAKLSAgcHJvdGVjdGVkIGludCBzcGFjaW5nID0gMjA7ICAKLSAgcHJvdGVjdGVkIGludCBtaW5vckFsaWdubWVudCA9IC0xOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0hvcml6b250YWwgPSBmYWxzZTsKLSAgCi0gIHB1YmxpYyBDb2x1bW5FZGl0UGFydCgpCi0gIHsgICAgCi0gIH0KLQotICBwdWJsaWMgQ29sdW1uRWRpdFBhcnQoYm9vbGVhbiBpc0hvcml6b250YWwpCi0gIHsKLSAgICB0aGlzLmlzSG9yaXpvbnRhbCA9IGlzSG9yaXpvbnRhbDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIEZpZ3VyZSBmaWd1cmUgPSBuZXcgRmlndXJlKCk7Ci0gICAgVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgVG9vbGJhckxheW91dChpc0hvcml6b250YWwpOwotICAgCi0gICAgaWYgKG1pbm9yQWxpZ25tZW50ICE9IC0xKQotICAgIHsgIAotICAgICAgbGF5b3V0LnNldE1pbm9yQWxpZ25tZW50KG1pbm9yQWxpZ25tZW50KTsKLSAgICB9ICAKLSAgICBsYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7Ci0gICAgbGF5b3V0LnNldFNwYWNpbmcoc3BhY2luZyk7Ci0gICAgZmlndXJlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLSAgICByZXR1cm4gZmlndXJlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTcGFjaW5nKGludCBzcGFjaW5nKQotICB7Ci0gICAgdGhpcy5zcGFjaW5nID0gc3BhY2luZzsKLSAgICBpZiAoZmlndXJlICE9IG51bGwpCi0gICAgeyAgCi0gICAgICAoKFRvb2xiYXJMYXlvdXQpZmlndXJlLmdldExheW91dE1hbmFnZXIoKSkuc2V0U3BhY2luZyhzcGFjaW5nKTsKLSAgICB9ICAKLSAgfQotICAKLSAgcHVibGljIElDb21wbGV4VHlwZSBnZXRDb21wbGV4VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gKElDb21wbGV4VHlwZSlnZXRNb2RlbCgpOyAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgfQotICAKLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpCi0gIHsgCi0gICAgQWJzdHJhY3RNb2RlbENvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChBYnN0cmFjdE1vZGVsQ29sbGVjdGlvbilnZXRNb2RlbCgpOwotICAgIHJldHVybiBjb2xsZWN0aW9uLmdldENoaWxkcmVuKCk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1pbm9yQWxpZ25tZW50KCkKLSAgewotICAgIHJldHVybiBtaW5vckFsaWdubWVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1pbm9yQWxpZ25tZW50KGludCBtaW5vckFsaWdubWVudCkKLSAgewotICAgIHRoaXMubWlub3JBbGlnbm1lbnQgPSBtaW5vckFsaWdubWVudDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENoaWxkcmVuKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2hDaGlsZHJlbigpOwotICAgIGlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgUmVmZXJlbmNlZFR5cGVDb2x1bW4pCi0gICAgewotICAgICAgaWYgKGdldFBhcmVudCgpLmdldENoaWxkcmVuKCkuc2l6ZSgpID4gMCkgCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpZ2V0UGFyZW50KCkuZ2V0Q2hpbGRyZW4oKS5nZXQoMCk7Ci0gICAgICAgIHJlZnJlc2hDb25uZWN0aW9ucyhlZGl0UGFydCk7Ci0gICAgICB9ICAKLSAgICB9ICAgICAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlZnJlc2hDb25uZWN0aW9ucyh0aGlzKTsgICAgICAKLSAgICB9ICAKLSAgfQotICAKLSAgCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hDb25uZWN0aW9ucyhFZGl0UGFydCBwYXJlbnQpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KWkubmV4dCgpOyAgICAgIAotICAgICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQmFzZVR5cGVDb25uZWN0aW5nRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIEJhc2VUeXBlQ29ubmVjdGluZ0VkaXRQYXJ0IGNvbm5lY3RpbmdFZGl0UGFydCA9IChCYXNlVHlwZUNvbm5lY3RpbmdFZGl0UGFydCllZGl0UGFydDsKLSAgICAgICAgY29ubmVjdGluZ0VkaXRQYXJ0LnJlZnJlc2hDb25uZWN0aW9ucygpOwotICAgICAgfSAgCi0gICAgICByZWZyZXNoQ29ubmVjdGlvbnMoZWRpdFBhcnQpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RhYmxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Db21wYXJ0bWVudEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0NvbXBhcnRtZW50RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmNTZlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0NvbXBhcnRtZW50RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkNvbXBhcnRtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JQ29tcGFydG1lbnRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklGaWVsZDsKLQotLy8gVE9ETyAoY3MpIGNvbW1vbi11cCB3aXRoIEJveEVkaXRQYXJ0ICg/KQotcHVibGljIGNsYXNzIENvbXBhcnRtZW50RWRpdFBhcnQgZXh0ZW5kcyBCYXNlRWRpdFBhcnQgLy8gaW1wbGVtZW50cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSUZlZWRiYWNrSGFuZGxlcgotewotICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb24oKTsKLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgSUNvbXBhcnRtZW50RmlndXJlIGZpZ3VyZSA9IGdldEZpZ3VyZUZhY3RvcnkoKS5jcmVhdGVDb21wYXJ0bWVudEZpZ3VyZShnZXRNb2RlbCgpKTsKLSAgICByZXR1cm4gZmlndXJlOwotICB9Ci0KLSAgcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKQotICB7Ci0gICAgcmV0dXJuIGdldENvbXBhcnRtZW50RmlndXJlKCkuZ2V0Q29udGVudFBhbmUoKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaGFzQ29udGVudCgpCi0gIHsKLSAgICAvLyBzaW5jZSB0aGUgYW5ub3RhdGlvbiBhbHdheXMgdGFrZXMgdXAgMSBjaGlsZCwgaGVyZSdzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRvIGZpZ3VyZSBvdXQgaWYKLSAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPiAxOwotICB9Ci0KLSAgTGlzdCBnZXRDaGlsZHJlblNhbnNBbm5vdGF0aW9uKCkKLSAgewotICAgIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgY2hpbGRyZW4uYWRkQWxsKGdldENoaWxkcmVuKCkpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgRWRpdFBhcnQgY2hpbGQgPSAoRWRpdFBhcnQpaS5uZXh0KCk7Ci0gICAgICBpZiAoY2hpbGQuZ2V0TW9kZWwoKSA9PSBhbm5vdGF0aW9uKQotICAgICAgewotICAgICAgICBpLnJlbW92ZSgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0gIAotICAgIH0gIAotICAgIHJldHVybiBjaGlsZHJlbjsKLSAgfQotICAKLSAgcHVibGljIEVkaXRQYXJ0IGRvR2V0UmVsYXRpdmVFZGl0UGFydChFZGl0UGFydCBlZGl0UGFydCwgaW50IGRpcmVjdGlvbikKLSAgewotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7ICAgCi0gICAgCi0gICAgLy8gd2UgY29tcHV0ZSB0aGUgY2hpbGRyZW4gc2FucyB0aGUgYW5ub3RhdGlvbiBFZGl0UGFydAotICAgIC8vIHNpbmNlIHRoZSBhbm5vdGF0aW9uIEVkaXRQYXJ0IGNvbmZ1c2VzIG91ciB1cC9kb3duIGtleSBoYW5kbGluZwotICAgIExpc3QgY2hpbGRyZW4gPSBnZXRDaGlsZHJlblNhbnNBbm5vdGF0aW9uKCk7Ci0gICAgaWYgKGNoaWxkcmVuLmNvbnRhaW5zKGVkaXRQYXJ0KSkKLSAgICB7ICAKLSAgICAgIGlmIChkaXJlY3Rpb24gPT0gS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeS5PVVRfVE9fUEFSRU5UKQotICAgICAgewotICAgICAgICBDb21wYXJ0bWVudCBjb21wYXJ0bWVudCA9IChDb21wYXJ0bWVudClnZXRNb2RlbCgpOwotICAgICAgICBmb3IgKEVkaXRQYXJ0IHBhcmVudCA9IGVkaXRQYXJ0LmdldFBhcmVudCgpOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpKQotICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgICAgaWYgKHBhcmVudC5nZXRNb2RlbCgpID09IGNvbXBhcnRtZW50LmdldE93bmVyKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gcGFyZW50OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0gIAotICAgICAgfSAgICAgICAgCi0gICAgICBlbHNlIGlmIChkaXJlY3Rpb24gPT0gUG9zaXRpb25Db25zdGFudHMuU09VVEgpCi0gICAgICB7ICAgIAotICAgICAgICBpbnQgc2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsKLSAgICAgICAgaWYgKHNpemUgPiAwKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgaWYgKGNoaWxkcmVuLmdldChzaXplIC0gMSkgPT0gZWRpdFBhcnQpCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICBDb21wYXJ0bWVudEVkaXRQYXJ0IG5leHRDb21wYXJ0bWVudCA9IChDb21wYXJ0bWVudEVkaXRQYXJ0KUVkaXRQYXJ0TmF2aWdhdGlvbkhhbmRsZXJVdGlsLmdldE5leHRTaWJsaW5nKENvbXBhcnRtZW50RWRpdFBhcnQudGhpcyk7Ci0gICAgICAgICAgICBpZiAobmV4dENvbXBhcnRtZW50ICE9IG51bGwgJiYgbmV4dENvbXBhcnRtZW50LmdldENoaWxkcmVuU2Fuc0Fubm90YXRpb24oKS5zaXplKCkgPiAwKQotICAgICAgICAgICAgeyAgICAgICAgICAgIAotICAgICAgICAgICAgICByZXN1bHQgPSBFZGl0UGFydE5hdmlnYXRpb25IYW5kbGVyVXRpbC5nZXRGaXJzdENoaWxkKG5leHRDb21wYXJ0bWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IGVkaXRQYXJ0OwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IEVkaXRQYXJ0TmF2aWdhdGlvbkhhbmRsZXJVdGlsLmdldE5leHRTaWJsaW5nKGVkaXRQYXJ0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCkKLSAgICAgIHsKLSAgICAgICAgaWYgKEVkaXRQYXJ0TmF2aWdhdGlvbkhhbmRsZXJVdGlsLmdldEZpcnN0Q2hpbGQoQ29tcGFydG1lbnRFZGl0UGFydC50aGlzKSA9PSBlZGl0UGFydCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgRWRpdFBhcnQgcHJldkNvbXBhcnRtZW50ID0gRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWwuZ2V0UHJldlNpYmxpbmcoQ29tcGFydG1lbnRFZGl0UGFydC50aGlzKTsKLSAgICAgICAgICBpZiAocHJldkNvbXBhcnRtZW50IGluc3RhbmNlb2YgQ29tcGFydG1lbnRFZGl0UGFydCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0IHByZXZDb21wTGlzdENoaWxkcmVuID0gKChDb21wYXJ0bWVudEVkaXRQYXJ0KXByZXZDb21wYXJ0bWVudCkuZ2V0Q2hpbGRyZW5TYW5zQW5ub3RhdGlvbigpOwotICAgICAgICAgICAgaW50IHNpemUgPSBwcmV2Q29tcExpc3RDaGlsZHJlbi5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA+IDApCi0gICAgICAgICAgICB7ICAKLSAgICAgICAgICAgICAgcmVzdWx0ID0gKEVkaXRQYXJ0KXByZXZDb21wYXJ0bWVudC5nZXRDaGlsZHJlbigpLmdldChzaXplIC0gMSk7Ci0gICAgICAgICAgICB9ICAKLSAgICAgICAgICB9ICAgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IEVkaXRQYXJ0TmF2aWdhdGlvbkhhbmRsZXJVdGlsLmdldFByZXZTaWJsaW5nKGVkaXRQYXJ0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsgICAgICAKLSAgfQotIAotICBwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpCi0gIHsKLSAgICBPYmplY3QgbW9kZWwgPSBjaGlsZEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0KLSAgICBJRmlndXJlIGNoaWxkID0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCk7Ci0KLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJRmllbGQpCi0gICAgewotICAgICAgZ2V0Q29tcGFydG1lbnRGaWd1cmUoKS5nZXRDb250ZW50UGFuZSgpLmFkZChjaGlsZCwgaW5kZXgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIEFubm90YXRpb24pCi0gICAgewotICAgICAgZ2V0Q29tcGFydG1lbnRGaWd1cmUoKS5nZXRBbm5vdGF0aW9uUGFuZSgpLmFkZChjaGlsZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIGluZGV4KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpCi0gIHsKLSAgICBPYmplY3QgbW9kZWwgPSBjaGlsZEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0gICAgSUZpZ3VyZSBjaGlsZCA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLmdldEZpZ3VyZSgpOwotCi0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSUZpZWxkKQotICAgIHsKLSAgICAgIGdldENvbXBhcnRtZW50RmlndXJlKCkuZ2V0Q29udGVudFBhbmUoKS5yZW1vdmUoY2hpbGQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIEFubm90YXRpb24pCi0gICAgewotICAgICAgZ2V0Q29tcGFydG1lbnRGaWd1cmUoKS5nZXRBbm5vdGF0aW9uUGFuZSgpLnJlbW92ZShjaGlsZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbXBhcnRtZW50IGdldENvbXBhcnRtZW50KCkKLSAgewotICAgIHJldHVybiAoQ29tcGFydG1lbnQpIGdldE1vZGVsKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotICAgIExpc3QgY2hpbGRyZW4gPSBnZXRDb21wYXJ0bWVudCgpLmdldENoaWxkcmVuKCk7Ci0gICAgY2hpbGRyZW4uYWRkKGFubm90YXRpb24pOwotICAgIHJldHVybiBjaGlsZHJlbjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TW9kZWwoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgc3VwZXIuc2V0TW9kZWwobW9kZWwpOwotICAgIGFubm90YXRpb24uc2V0Q29tcGFydG1lbnQoZ2V0Q29tcGFydG1lbnQoKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ2hpbGRyZW4oKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaENoaWxkcmVuKCk7Ci0gICAgLy8gKChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KWdldFBhcmVudCgpKS5nZXRDb250ZW50UGFuZSgpLmludmFsaWRhdGUoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpCi0gIHsKLSAgICAvLyBnZXRGaWd1cmUoKS5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmx1ZSk7Ci0gICAgLy8gKChDb21wYXJ0bWVudEZpZ3VyZSlnZXRGaWd1cmUoKSkuc2V0Qm9yZGVyQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotICAgIGdldEZpZ3VyZSgpLnJlcGFpbnQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCkKLSAgewotICAgIC8vIGdldEZpZ3VyZSgpLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5saWdodEJsdWUpOwotICAgIC8vICgoQ29tcGFydG1lbnRGaWd1cmUpZ2V0RmlndXJlKCkpLnNldEJvcmRlckNvbG9yKENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSk7Ci0gICAgZ2V0RmlndXJlKCkucmVwYWludCgpOwotICB9Ci0gIAotICBwdWJsaWMgSUNvbXBhcnRtZW50RmlndXJlIGdldENvbXBhcnRtZW50RmlndXJlKCkKLSAgewotICAgIHJldHVybiAoSUNvbXBhcnRtZW50RmlndXJlKWZpZ3VyZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZE5vdGlmeSgpCi0gIHsgIAotICAgIHN1cGVyLmFkZE5vdGlmeSgpOwotICAgIGdldENvbXBhcnRtZW50RmlndXJlKCkuZWRpdFBhcnRBdHRhY2hlZCh0aGlzKTsgICAKLSAgfSAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Db21wbGV4VHlwZUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0NvbXBsZXhUeXBlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmMTJjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0NvbXBsZXhUeXBlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hbmhhdHRhbkNvbm5lY3Rpb25Sb3V0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkZvY3VzVHlwZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUNvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JVHlwZTsKLQotcHVibGljIGNsYXNzIENvbXBsZXhUeXBlRWRpdFBhcnQgZXh0ZW5kcyBTdHJ1Y3R1cmVFZGl0UGFydAoteyAgIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREcmF3Q29ubmVjdGlvbigpCi0gIHsKLSAgICBpZiAoZ2V0UGFyZW50KCkuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIEZvY3VzVHlwZUNvbHVtbikKLSAgICB7ICAKLSAgICAgIElDb21wbGV4VHlwZSBjb21wbGV4VHlwZSA9IChJQ29tcGxleFR5cGUpZ2V0TW9kZWwoKTsKLSAgICAgIHJldHVybiBjb21wbGV4VHlwZS5nZXRTdXBlclR5cGUoKSAhPSBudWxsOwotICAgIH0gCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAKLSAgcHJpdmF0ZSBFZGl0UGFydCBnZXRUYXJnZXRFZGl0UGFydChJVHlwZSB0eXBlKQotICB7Ci0gICAgQ29sdW1uRWRpdFBhcnQgY29sdW1uRWRpdFBhcnQgPSBudWxsOwotICAgIGZvciAoRWRpdFBhcnQgZWRpdFBhcnQgPSB0aGlzOyBlZGl0UGFydCAhPSBudWxsOyBlZGl0UGFydCA9IGVkaXRQYXJ0LmdldFBhcmVudCgpKQotICAgIHsKLSAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIENvbHVtbkVkaXRQYXJ0KQotICAgICAgewotICAgICAgICBjb2x1bW5FZGl0UGFydCA9IChDb2x1bW5FZGl0UGFydCllZGl0UGFydDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAKLSAgICB9ICAgICAKLSAgICBpZiAoY29sdW1uRWRpdFBhcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb2x1bW5FZGl0UGFydC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIEVkaXRQYXJ0IGNoaWxkID0gKEVkaXRQYXJ0KWkubmV4dCgpOwotICAgICAgICBpZiAoY2hpbGQuZ2V0TW9kZWwoKSA9PSB0eXBlKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGNoaWxkOwotICAgICAgICB9ICAgICAgICAgCi0gICAgICB9ICAKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbiBjcmVhdGVDb25uZWN0aW9uRmlndXJlKCkKLSAgewotICAgIGNvbm5lY3Rpb25GaWd1cmUgPSBudWxsOwotICAgIElDb21wbGV4VHlwZSBjb21wbGV4VHlwZSA9IChJQ29tcGxleFR5cGUpZ2V0TW9kZWwoKTsKLSAgICBJVHlwZSB0eXBlID0gY29tcGxleFR5cGUuZ2V0U3VwZXJUeXBlKCk7Ci0gICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICB7ICAgICAgCi0gICAgICBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHJlZmVyZW5jZVR5cGVQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpZ2V0VGFyZ2V0RWRpdFBhcnQodHlwZSk7Ci0gICAgICBpZiAocmVmZXJlbmNlVHlwZVBhcnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZSA9IG5ldyBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbih0cnVlKTsKLSAgICAgICAgLy8gZHJhdyBhIGxpbmUgb3V0IGZyb20gdGhlIHRvcCAgICAgICAgIAotICAgICAgICBjb25uZWN0aW9uRmlndXJlLnNldFNvdXJjZUFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKGdldEZpZ3VyZSgpLCBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuVE9QLCAxKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBUT0RPIChjcykgbmVlZCB0byBkcmF3IHRoZSB0YXJnZXQgYW5jaG9yIHRvIGxvb2sgbGlrZSBhIFVNTCBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXAKLSAgICAgICAgLy8gYWRkaW5nIGEgbGFiZWwgdG8gdGhlIGNvbm5lY3Rpb24gd291bGQgaGVscCB0bwotICAgICAgICBjb25uZWN0aW9uRmlndXJlLnNldFRhcmdldEFuY2hvcihuZXcgQ2VudGVyZWRDb25uZWN0aW9uQW5jaG9yKHJlZmVyZW5jZVR5cGVQYXJ0LmdldEZpZ3VyZSgpLCBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IuQk9UVE9NLCAwLCAwKSk7Ci0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0Q29ubmVjdGlvblJvdXRlcihuZXcgTWFuaGF0dGFuQ29ubmVjdGlvblJvdXRlcigpKTsKLSAgICAgICAgKChDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IpY29ubmVjdGlvbkZpZ3VyZS5nZXRTb3VyY2VBbmNob3IoKSkuc2V0T3RoZXIoKENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvciljb25uZWN0aW9uRmlndXJlLmdldFRhcmdldEFuY2hvcigpKTsKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRIaWdobGlnaHQoZmFsc2UpOwotICAgICAgfQotICAgIH0gICAgCi0gICAgcmV0dXJuIGNvbm5lY3Rpb25GaWd1cmU7Ci0gIH0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvRWRpdFBhcnROYXZpZ2F0aW9uSGFuZGxlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzNGI2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0VkaXRQYXJ0TmF2aWdhdGlvbkhhbmRsZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci0KLQotcHVibGljIGNsYXNzIEVkaXRQYXJ0TmF2aWdhdGlvbkhhbmRsZXJVdGlsCi17ICAKLSAgcHVibGljIHN0YXRpYyBFZGl0UGFydCBnZXRGaXJzdENoaWxkKEVkaXRQYXJ0IGVkaXRQYXJ0KQotICB7ICAgICAgCi0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChFZGl0UGFydCllZGl0UGFydC5nZXRDaGlsZHJlbigpLmdldCgwKTsKLSAgICB9ICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBFZGl0UGFydCBnZXRMYXN0Q2hpbGQoRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsgICAgICAKLSAgICBFZGl0UGFydCByZXN1bHQgPSBudWxsOwotICAgIGludCBzaXplID0gZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5zaXplKCk7Ci0gICAgaWYgKHNpemUgPiAwKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChFZGl0UGFydCllZGl0UGFydC5nZXRDaGlsZHJlbigpLmdldChzaXplIC0gMSk7Ci0gICAgfSAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gIAotICAKLSAgcHVibGljIHN0YXRpYyBFZGl0UGFydCBnZXROZXh0U2libGluZyhFZGl0UGFydCBlZGl0UGFydCkKLSAgeyAgICAKLSAgICBFZGl0UGFydCByZXN1bHQgPSBudWxsOyAgICAKLSAgICBFZGl0UGFydCBwYXJlbnQgPSBlZGl0UGFydC5nZXRQYXJlbnQoKTsKLSAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBMaXN0IGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7Ci0gICAgICBpbnQgaW5kZXggPSBjaGlsZHJlbi5pbmRleE9mKGVkaXRQYXJ0KTsKLSAgICAgIGlmIChpbmRleCArIDEgPCBjaGlsZHJlbi5zaXplKCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IChFZGl0UGFydCljaGlsZHJlbi5nZXQoaW5kZXggKyAxKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBFZGl0UGFydCBnZXRQcmV2U2libGluZyhFZGl0UGFydCBlZGl0UGFydCkKLSAgeyAgICAKLSAgICBFZGl0UGFydCByZXN1bHQgPSBudWxsOwotICAgIEVkaXRQYXJ0IHBhcmVudCA9IGVkaXRQYXJ0LmdldFBhcmVudCgpOwotICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIExpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgIGludCBpbmRleCA9IGNoaWxkcmVuLmluZGV4T2YoZWRpdFBhcnQpOwotICAgICAgaWYgKGluZGV4IC0gMSA+PSAwKQotICAgICAgewotICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSBmaXJzdCBjaGlsZAotICAgICAgICAvLyAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IChFZGl0UGFydCljaGlsZHJlbi5nZXQoaW5kZXggLSAxKTsKLSAgICAgIH0gCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9GaWVsZEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0ZpZWxkRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3ZGQzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0ZpZWxkRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi0KLXB1YmxpYyBjbGFzcyBGaWVsZEVkaXRQYXJ0IGV4dGVuZHMgQmFzZUZpZWxkRWRpdFBhcnQKLXsKLSAgcHVibGljIHZvaWQgYWRkTm90aWZ5KCkKLSAgewotICAgIHN1cGVyLmFkZE5vdGlmeSgpOwotICAgIGdldEZpZWxkRmlndXJlKCkuZWRpdFBhcnRBdHRhY2hlZCh0aGlzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9JQ29ubmVjdGlvbkNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9JQ29ubmVjdGlvbkNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzYxMjUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvSUNvbm5lY3Rpb25Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotcHVibGljIGludGVyZmFjZSBJQ29ubmVjdGlvbkNvbnRhaW5lcgotewotICBwdWJsaWMgdm9pZCByZWZyZXNoQ29ubmVjdGlvbnMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvSUhvbGRlckVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL0lIb2xkZXJFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjdhNWFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvSUhvbGRlckVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotcHVibGljIGludGVyZmFjZSBJSG9sZGVyRWRpdFBhcnQKLXsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9JTmFtZWRFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9JTmFtZWRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTg2YzI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvSU5hbWVkRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLQotcHVibGljIGludGVyZmFjZSBJTmFtZWRFZGl0UGFydAotewotICBwdWJsaWMgTGFiZWwgZ2V0TmFtZUxhYmVsRmlndXJlKCk7Ci0KLSAgcHVibGljIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgY3Vyc29yTG9jYXRpb24pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Sb290Q29udGVudEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1Jvb3RDb250ZW50RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZhMDM0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1Jvb3RDb250ZW50RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUGFuZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLlJvb3RIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklDb21wbGV4VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklUeXBlOwotCi1wdWJsaWMgY2xhc3MgUm9vdENvbnRlbnRFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydAotewotICBMaXN0IGNvbGxlY3Rpb25zID0gbnVsbDsKLSAgRmlndXJlIGNvbnRlbnRQYW5lOwotICAKLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgeyAgICAKLSAgICBQYW5lbCBwYW5lbCA9IG5ldyBQYW5lbCgpOyAgICAKLSAgICBwYW5lbC5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcig2MCkpOwotICAgCi0gICAgVG9vbGJhckxheW91dCBwYW5lbExheW91dCA9IG5ldyBUb29sYmFyTGF5b3V0KGZhbHNlKTsKLSAgICBwYW5lbExheW91dC5zZXRTdHJldGNoTWlub3JBeGlzKHRydWUpOwotICAgIHBhbmVsLnNldExheW91dE1hbmFnZXIocGFuZWxMYXlvdXQpOwotICAgIAotICAgIGNvbnRlbnRQYW5lID0gbmV3IEZpZ3VyZSgpOwotICAgIHBhbmVsLmFkZChjb250ZW50UGFuZSk7Ci0gICAgCi0gICAgVG9vbGJhckxheW91dCB0YiA9IG5ldyBUb29sYmFyTGF5b3V0KGZhbHNlKTsKLSAgICB0Yi5zZXRNaW5vckFsaWdubWVudChUb29sYmFyTGF5b3V0LkFMSUdOX0NFTlRFUik7Ci0gICAgdGIuc2V0U3RyZXRjaE1pbm9yQXhpcyh0cnVlKTsKLSAgICB0Yi5zZXRTcGFjaW5nKDQwKTsKLSAgICBjb250ZW50UGFuZS5zZXRMYXlvdXRNYW5hZ2VyKHRiKTsKLSAgICAKLSAgICByZXR1cm4gcGFuZWw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiBjb250ZW50UGFuZTsKLSAgfQotICAKLSAgCi0gIHB1YmxpYyBJQ29tcGxleFR5cGUgZ2V0U2VsZWN0ZWRDb21wbGV4VHlwZSgpCi0gIHsKLSAgICBJQ29tcGxleFR5cGUgcmVzdWx0ID0gbnVsbDsKLSAgICBJTW9kZWwgbW9kZWwgPSAoSU1vZGVsKWdldE1vZGVsKCk7Ci0gICAgTGlzdCB0eXBlcyA9IG1vZGVsLmdldFR5cGVzKCk7Ci0gICAgaWYgKHR5cGVzLnNpemUoKSA+IDApCi0gICAgewotICAgICAgaWYgKHR5cGVzLmdldCgwKSBpbnN0YW5jZW9mIElDb21wbGV4VHlwZSkgCi0gICAgICAgIHJlc3VsdCA9IChJQ29tcGxleFR5cGUpdHlwZXMuZ2V0KDApOwotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICB9Ci0gIAotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgeyAKLSAgICBjb2xsZWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoZ2V0TW9kZWwoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBnZXRNb2RlbCgpOwotICAgICAgSUFEVE9iamVjdCBmb2N1c09iamVjdCA9IG51bGw7Ci0gICAgICBpZiAob2JqIGluc3RhbmNlb2YgSVN0cnVjdHVyZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElHcmFwaEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKChJR3JhcGhFbGVtZW50KW9iaikuaXNGb2N1c0FsbG93ZWQoKSkKLSAgICAgICAgICAgIGZvY3VzT2JqZWN0ID0gKElTdHJ1Y3R1cmUpb2JqOyAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSUZpZWxkKQotICAgICAgewotICAgICAgICBmb2N1c09iamVjdCA9IChJRmllbGQpb2JqOwotICAgICAgfSAgCi0gICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJTW9kZWwpCi0gICAgICB7Ci0gICAgICAgIGZvY3VzT2JqZWN0ID0gKElNb2RlbClvYmo7Ci0gICAgICAgIGNvbGxlY3Rpb25zLmFkZChmb2N1c09iamVjdCk7Ci0gICAgICAgIHJldHVybiBjb2xsZWN0aW9uczsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElUeXBlKQotICAgICAgewotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSUdyYXBoRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIGlmICgoKElHcmFwaEVsZW1lbnQpb2JqKS5pc0ZvY3VzQWxsb3dlZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZvY3VzT2JqZWN0ID0gKElUeXBlKW9iajsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmb2N1c09iamVjdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBSb290SG9sZGVyIGhvbGRlciA9IG5ldyBSb290SG9sZGVyKGZvY3VzT2JqZWN0KTsKLSAgICAgICAgY29sbGVjdGlvbnMuYWRkKGhvbGRlcik7Ci0gICAgICAgIHJldHVybiBjb2xsZWN0aW9uczsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGNvbGxlY3Rpb25zOwotICB9Ci0gICAgCi0gIAotICAvKioKLSAgICogQGRlcHJlY2F0ZWQgRG9uJ3QgY2FsbCB0aGlzIG1ldGhvZC4gIFVzZSBEZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyLnNldElucHV0KCkgaW5zdGVhZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICBzZXRNb2RlbChjb21wb25lbnQpOwotICAgIHJlZnJlc2goKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkIERvbid0IGNhbGwgdGhpcyBtZXRob2QuICBVc2UgRGVzaWduVmlld0dyYXBoaWNhbFZpZXdlci5nZXRJbnB1dCgpIGluc3RlYWQuCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldElucHV0KCkKLSAgewotICAgIHJldHVybiBnZXRNb2RlbCgpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2goKTsKLSAgICAvKgotICAgIC8vIG9uY2Ugd2UncmUgZG9uZSByZWZyZXNoaW5nIHdlIGNhbiBhc3N1bWUgYWxsIG9mIHRoZSBjaGlsZCBlZGl0cGFydHMKLSAgICAvLyBub3cgd2UgaXRlcmF0cmUgdGhydSB0aGUgbGlzdCBhZ2FpbiBhbmQgdGVsbCB0aGUgY2hpbGRyZW4gdG8gdXBkYXRlCi0gICAgLy8gdGhlaXIgY29ubmVjdGlvbnMKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElDb25uZWN0aW9uQ29udGFpbmVyKQotICAgICAgewotICAgICAgICAoKElDb25uZWN0aW9uQ29udGFpbmVyKW9iaikucmVmcmVzaENvbm5lY3Rpb25zKCk7Ci0gICAgICB9Ci0gICAgfSovCi0gICAgCi0gICAgZm9yKEl0ZXJhdG9yIGkgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgICgoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydClvYmopLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Sb290RWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvUm9vdEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkODc1ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Sb290RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkJlbmRwb2ludENvbm5lY3Rpb25Sb3V0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25MYXllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVDYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYXllcmVkUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLlNjYWxhYmxlUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5TY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkRlc2lnblZpZXdlckdyYXBoaWNDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBSb290RWRpdFBhcnQgZXh0ZW5kcyBTY2FsYWJsZVJvb3RFZGl0UGFydCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmdlZi5Sb290RWRpdFBhcnQKLXsgICAgCi0gIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkKLSAgewotICAgIHN1cGVyLmFjdGl2YXRlKCk7Ci0gICAgLy8gU2V0IHVwIENvbm5lY3Rpb24gbGF5ZXIgd2l0aCBhIHJvdXRlciwgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGhhdmUgb25lCi0gICAgQ29ubmVjdGlvbkxheWVyIGNvbm5lY3Rpb25MYXllciA9IChDb25uZWN0aW9uTGF5ZXIpIGdldExheWVyKExheWVyQ29uc3RhbnRzLkNPTk5FQ1RJT05fTEFZRVIpOwotICAgIGlmIChjb25uZWN0aW9uTGF5ZXIgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIGNvbm5lY3Rpb25MYXllci5zZXRDb25uZWN0aW9uUm91dGVyKG5ldyBCZW5kcG9pbnRDb25uZWN0aW9uUm91dGVyKCkpOwotICAgIH0KLQotICAgIEZpZ3VyZSBmaWd1cmUgPSAoRmlndXJlKWdldExheWVyKExheWVyQ29uc3RhbnRzLkZFRURCQUNLX0xBWUVSKTsgICAgICAgCi0gICAgaWYgKGZpZ3VyZSAhPSBudWxsKQotICAgIHsgICAgICAKLSAgICAgIGlmIChnZXRWaWV3ZXIoKSBpbnN0YW5jZW9mIFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcikKLSAgICAgIHsgIAotICAgICAgICAvL1Njcm9sbGluZ0dyYXBoaWNhbFZpZXdlciBzZ3YgPSAoU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyKWdldFZpZXdlcigpOwotICAgICAgICAvL0luZGV4RmlndXJlIGluZGV4RmlndXJlID0gbmV3IEluZGV4RmlndXJlKHNndik7Ci0gICAgICAgIC8vZmlndXJlLmFkZChpbmRleEZpZ3VyZSk7Ci0gICAgICAgIC8vZ2V0Vmlld2VyKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihpbmRleEZpZ3VyZSk7Ci0gICAgICB9ICAKLSAgICB9ICAgICAgICAgICAKLSAgICByZWZyZXNoKCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBMYXllcmVkUGFuZSBjcmVhdGVQcmludGFibGVMYXllcnMoKSAKLSAgewotICAgIExheWVyZWRQYW5lIHBhbmUgPSBzdXBlci5jcmVhdGVQcmludGFibGVMYXllcnMoKTsgICAgCi0gICAgTGF5ZXIgbGF5ZXIgPSBuZXcgU2NhbGVkSGFuZGxlTGF5ZXIoKTsKLSAgICBsYXllci5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oNSwgNSkpOwotICAgIHBhbmUuYWRkKGxheWVyLCBEZXNpZ25WaWV3ZXJHcmFwaGljQ29uc3RhbnRzLlNDQUxFRF9IQU5ETEVfTEFZRVIpOyAgICAKLSAgICByZXR1cm4gcGFuZTsKLSAgfSAgCi0gIAotICAKLSAgY2xhc3MgU2NhbGVkSGFuZGxlTGF5ZXIgZXh0ZW5kcyBMYXllcgotICB7Ci0gICAgU2NhbGVkSGFuZGxlTGF5ZXIoKSAKLSAgICB7Ci0gICAgICBzZXRFbmFibGVkKHRydWUpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmUjZ2V0UHJlZmVycmVkU2l6ZShpbnQsIGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgRGltZW5zaW9uIGdldFByZWZlcnJlZFNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQpIAotICAgIHsKLSAgICAgIFJlY3RhbmdsZSByZWN0ID0gbmV3IFJlY3RhbmdsZSgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRDaGlsZHJlbigpLnNpemUoKTsgaSsrKQotICAgICAgICByZWN0LnVuaW9uKCgoSUZpZ3VyZSlnZXRDaGlsZHJlbigpLmdldChpKSkuZ2V0Qm91bmRzKCkpOwotICAgICAgcmV0dXJuIHJlY3QuZ2V0U2l6ZSgpOwotICAgIH0KLSAgfSAgCi0gIAotICBjbGFzcyBJbmRleEZpZ3VyZSBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZSBpbXBsZW1lbnRzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLSAgewotICAgIEVkaXRQYXJ0IGVkaXRQYXJ0OwotICAgIFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlciBzZ3Y7Ci0gICAgcHVibGljIEluZGV4RmlndXJlKFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlciBzZ3YpCi0gICAgewotICAgICAgdGhpcy5zZ3YgPSBzZ3Y7ICAgICAgCi0gICAgICAoKEZpZ3VyZUNhbnZhcylzZ3YuZ2V0Q29udHJvbCgpKS5nZXRWaWV3cG9ydCgpLmdldEhvcml6b250YWxSYW5nZU1vZGVsKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICgoRmlndXJlQ2FudmFzKXNndi5nZXRDb250cm9sKCkpLmdldFZpZXdwb3J0KCkuZ2V0VmVydGljYWxSYW5nZU1vZGVsKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgIFJlY3RhbmdsZSBib3VuZHMgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIDQwLCA0MCk7Ci0gICAgICB0cmFuc2xhdGVUb0Fic29sdXRlKGJvdW5kcyk7ICAgICAgCi0gICAgICBzZXRCb3VuZHMoYm91bmRzKTsgICAgICAgCi0gICAgfQotICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2Nyb2xsLWNoYW5nZSIpOwotICAgICAgUmVjdGFuZ2xlIGJvdW5kcyA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgNDAsIDQwKTsKLSAgICAgIFBvaW50IHAgPSAoKEZpZ3VyZUNhbnZhcylzZ3YuZ2V0Q29udHJvbCgpKS5nZXRWaWV3cG9ydCgpLmdldFZpZXdMb2NhdGlvbigpOwotICAgICAgYm91bmRzLnRyYW5zbGF0ZShwKTsKLSAgICAgIHNldEJvdW5kcyhib3VuZHMpOyAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFJlY3RhbmdsZSBnZXRCb3VuZHMoKQotICAgIHsKLSAgICAgIFBvaW50IHAgPSAoKEZpZ3VyZUNhbnZhcylzZ3YuZ2V0Q29udHJvbCgpKS5nZXRWaWV3cG9ydCgpLmdldFZpZXdMb2NhdGlvbigpOwotICAgICAgYm91bmRzLnRyYW5zbGF0ZShwKTsgICAgICAKLSAgICAgIHJldHVybiBzdXBlci5nZXRCb3VuZHMoKS5nZXRDb3B5KCkudHJhbnNsYXRlKHApOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Sb290SG9sZGVyRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvUm9vdEhvbGRlckVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YWQwNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Sb290SG9sZGVyRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5QYW5lbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLkZvY3VzVHlwZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsLlJlZmVyZW5jZWRUeXBlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuUm9vdEhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLQotcHVibGljIGNsYXNzIFJvb3RIb2xkZXJFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydCBpbXBsZW1lbnRzIElIb2xkZXJFZGl0UGFydAotewotICBwcm90ZWN0ZWQgUGFuZWwgcGFuZWw7Ci0gIAotICBwdWJsaWMgUm9vdEhvbGRlckVkaXRQYXJ0KCkKLSAgewotICB9Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIHBhbmVsID0gbmV3IFBhbmVsKCk7ICAgIAotICAgIFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQodHJ1ZSk7Ci0gICAgbGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXMoZmFsc2UpOwotICAgIGxheW91dC5zZXRTcGFjaW5nKDEwMCk7Ci0gICAgcGFuZWwuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOyAgICAKLQotICAgIHJldHVybiBwYW5lbDsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKQotICB7Ci0gICAgTGlzdCBjb2xsZWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBSb290SG9sZGVyIGhvbGRlciA9IChSb290SG9sZGVyKWdldE1vZGVsKCk7Ci0gICAgSUFEVE9iamVjdCBmb2N1c09iamVjdCA9IGhvbGRlci5nZXRNb2RlbCgpOwotICAgIGNvbGxlY3Rpb25zLmFkZChuZXcgRm9jdXNUeXBlQ29sdW1uKGZvY3VzT2JqZWN0KSk7Ci0gICAgY29sbGVjdGlvbnMuYWRkKG5ldyBSZWZlcmVuY2VkVHlwZUNvbHVtbihmb2N1c09iamVjdCkpOwotICAgIHJldHVybiBjb2xsZWN0aW9uczsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0YWJsZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvU2VjdGlvbkVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1NlY3Rpb25FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjVhZjQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvU2VjdGlvbkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklDb21wbGV4VHlwZTsKLQotcHVibGljIGNsYXNzIFNlY3Rpb25FZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydAotewotICBwcm90ZWN0ZWQgSUNvbXBsZXhUeXBlIGNvbXBsZXhUeXBlOwotICAKLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIEZpZ3VyZSBmaWcgPSBuZXcgRmlndXJlKCk7Ci0gICAgZmlnLnNldExheW91dE1hbmFnZXIobmV3IFRvb2xiYXJMYXlvdXQoKSk7Ci0gICAgcmV0dXJuIGZpZzsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLQotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGFibGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1N0cnVjdHVyZUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1N0cnVjdHVyZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZjA3OWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9TdHJ1Y3R1cmVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkxvY2F0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5TZXRJbnB1dFRvR3JhcGhWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuQ29tcGFydG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5BRFREaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlcy5JU3RydWN0dXJlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuT3BlbkluTmV3RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGVzaWduLmVkaXRwYXJ0cy5TcGFjZUZpbGxlckZvckZpZWxkRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlRWRpdFBhcnQgZXh0ZW5kcyBCYXNlVHlwZUNvbm5lY3RpbmdFZGl0UGFydCBpbXBsZW1lbnRzIElOYW1lZEVkaXRQYXJ0Ci17ICAKLSAgcHJvdGVjdGVkIExpc3QgY29tcGFydG1lbnRMaXN0ID0gbnVsbDsKLSAgcHJvdGVjdGVkIEFEVERpcmVjdEVkaXRQb2xpY3kgYWR0RGlyZWN0RWRpdFBvbGljeSA9IG5ldyBBRFREaXJlY3RFZGl0UG9saWN5KCk7Ci0gIHByb3RlY3RlZCBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbiBjb25uZWN0aW9uRmlndXJlOwotICBwcm90ZWN0ZWQgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gY29ubmVjdGlvbkZlZWRiYWNrRmlndXJlOwotCi0gIC8qKgotICAgKiBUT0RPIGNzLi4uIEknbSBzdXJlIHRoaXMgaGFzIHNvbWV0aGluZyB0byBkbyB3aXRoIHRoZSB3YXkgd2Ugd2FudGVkIHRvIHJld29yayBjb21wYXJ0bWVudCBjcmVhdGlvbgotICAgKiBJIHN1cHBvc2Ugd2UgY291bGQgaGF2ZSBzdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGluc3RlYWQgb2YgZ2V0TW9kZWxDaGlsZHJlbigpCi0gICAqIAotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIENvbXBhcnRtZW50W10gZ2V0Q29tcGFydG1lbnRzKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgSVN0cnVjdHVyZUZpZ3VyZSBmaWd1cmUgPSBnZXRGaWd1cmVGYWN0b3J5KCkuY3JlYXRlU3RydWN0dXJlRmlndXJlKGdldE1vZGVsKCkpOwotICAgIHJldHVybiBmaWd1cmU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJU3RydWN0dXJlRmlndXJlIGdldFN0cnVjdHVyZUZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gKElTdHJ1Y3R1cmVGaWd1cmUpZ2V0RmlndXJlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgewotICAgIHJldHVybiBnZXRTdHJ1Y3R1cmVGaWd1cmUoKS5nZXRDb250ZW50UGFuZSgpOwotICB9Ci0gIAotICAKLSAgcHVibGljIEVkaXRQYXJ0IGRvR2V0UmVsYXRpdmVFZGl0UGFydChFZGl0UGFydCBlZGl0UGFydCwgaW50IGRpcmVjdGlvbikKLSAgewotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7ICAgICAgICAgICAgICAgCi0gICAgaWYgKGRpcmVjdGlvbiA9PSBLZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5LklOX1RPX0ZJUlNUX0NISUxEKQotICAgIHsgICAgICAgICAgCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgQ29tcGFydG1lbnRFZGl0UGFydCBjb21wYXJ0bWVudCA9IChDb21wYXJ0bWVudEVkaXRQYXJ0KWkubmV4dCgpOwotICAgICAgICBpZiAoY29tcGFydG1lbnQuaGFzQ29udGVudCgpKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBjb250ZW50Q2hpbGRyZW4gPSBjb21wYXJ0bWVudC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNvbnRlbnRDaGlsZHJlbi5oYXNOZXh0KCk7ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgY2hpbGQgPSBjb250ZW50Q2hpbGRyZW4ubmV4dCgpOwotICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgU2VjdGlvbkVkaXRQYXJ0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTZWN0aW9uRWRpdFBhcnQgcGFydCA9IChTZWN0aW9uRWRpdFBhcnQpIGNoaWxkOwotICAgICAgICAgICAgICByZXN1bHQgPSAoRWRpdFBhcnQpcGFydC5nZXRDaGlsZHJlbigpLmdldCgwKTsKLSAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgQmFzZUZpZWxkRWRpdFBhcnQgJiYgKCEoY2hpbGQgaW5zdGFuY2VvZiBTcGFjZUZpbGxlckZvckZpZWxkRWRpdFBhcnQpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gKEVkaXRQYXJ0KWNoaWxkOwotICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSAgCi0gICAgICB9ICAKLSAgICB9ICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gc3VwZXIuZG9HZXRSZWxhdGl2ZUVkaXRQYXJ0KGVkaXRQYXJ0LCBkaXJlY3Rpb24pOwotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7ICAgICAgICAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgeyAgICAgICAgCi0gICAgc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7ICAKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBuZXcgQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5KCkpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwgYWR0RGlyZWN0RWRpdFBvbGljeSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJU3RydWN0dXJlIGdldFN0cnVjdHVyZSgpCi0gIHsKLSAgICByZXR1cm4gKElTdHJ1Y3R1cmUpZ2V0TW9kZWwoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpCi0gIHsKLSAgICBpZiAoY29tcGFydG1lbnRMaXN0ID09IG51bGwpCi0gICAgewotICAgICAgY29tcGFydG1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgCi0gICAgICAvLyBUT0RPLi4gdGhpcyBuZWVkcyB0byBiZSBtb3ZlZCB0byB0aGUgeHNkIHNwZWNpZmljIHZlcnNpb24gb2YgdGhpcyBjbGFzcyAKLSAgICAgIGNvbXBhcnRtZW50TGlzdC5hZGQobmV3IENvbXBhcnRtZW50KGdldFN0cnVjdHVyZSgpLCAiYXR0cmlidXRlIikpOyAvLyROT04tTkxTLTEkCi0gICAgICBjb21wYXJ0bWVudExpc3QuYWRkKG5ldyBDb21wYXJ0bWVudChnZXRTdHJ1Y3R1cmUoKSwgImVsZW1lbnQiKSk7ICAgIC8vJE5PTi1OTFMtMSQKLSAgICB9ICAKLSAgICByZXR1cm4gY29tcGFydG1lbnRMaXN0OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ2hpbGRyZW4oKQotICB7ICAgCi0gICAgc3VwZXIucmVmcmVzaENoaWxkcmVuKCk7Ci0gICAgLy9nZXRGaWd1cmUoKS5pbnZhbGlkYXRlVHJlZSgpOyAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLSAgICBnZXRTdHJ1Y3R1cmVGaWd1cmUoKS5yZWZyZXNoVmlzdWFscyhnZXRNb2RlbCgpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkRmVlZGJhY2soKQotICB7Ci0gICAgZ2V0U3RydWN0dXJlRmlndXJlKCkuYWRkU2VsZWN0aW9uRmVlZGJhY2soKTsKLSAgICBzdXBlci5hZGRGZWVkYmFjaygpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZW1vdmVGZWVkYmFjaygpCi0gIHsKLSAgICBnZXRTdHJ1Y3R1cmVGaWd1cmUoKS5yZW1vdmVTZWxlY3Rpb25GZWVkYmFjaygpOwotICAgIHN1cGVyLnJlbW92ZUZlZWRiYWNrKCk7ICAgIAotICB9Ci0KLSAgcHVibGljIExhYmVsIGdldE5hbWVMYWJlbEZpZ3VyZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0U3RydWN0dXJlRmlndXJlKCkuZ2V0TmFtZUxhYmVsKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBjdXJzb3JMb2NhdGlvbikKLSAgewotICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KQotICB7ICAKLSAgICBpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVQpCi0gICAgewotICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBMb2NhdGlvblJlcXVlc3QpCi0gICAgICB7Ci0gICAgIC8vIHVuY29tbWVudCBmb3IgZGlyZWN0IGVkaXQgb2YgbmFtZSAoYWRkIGVsc2UpCi0vLyAgICAgICAgTG9jYXRpb25SZXF1ZXN0IGxvY2F0aW9uUmVxdWVzdCA9IChMb2NhdGlvblJlcXVlc3QpcmVxdWVzdDsKLS8vICAgICAgICBQb2ludCBwID0gbG9jYXRpb25SZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0vLyAgICAgICAgaWYgKGhpdFRlc3QoZ2V0TmFtZUxhYmVsRmlndXJlKCksIHApKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIExhYmVsRWRpdE1hbmFnZXIgbWFuYWdlciA9IG5ldyBMYWJlbEVkaXRNYW5hZ2VyKHRoaXMsIG5ldyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKHRoaXMsIHApKTsKLS8vICAgICAgICAgIE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlciB3cmFwcGVyID0gbmV3IE5hbWVVcGRhdGVDb21tYW5kV3JhcHBlcigpOwotLy8gICAgICAgICAgYWR0RGlyZWN0RWRpdFBvbGljeS5zZXRVcGRhdGVDb21tYW5kKHdyYXBwZXIpOwotLy8gICAgICAgICAgbWFuYWdlci5zaG93KCk7Ci0vLyAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChyZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9PUEVOKQotICAgIHsKLSAgICAgIE9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0gICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkKLSAgICAgIHsKLSAgICAgICAgTG9jYXRpb25SZXF1ZXN0IGxvY2F0aW9uUmVxdWVzdCA9IChMb2NhdGlvblJlcXVlc3QpcmVxdWVzdDsKLSAgICAgICAgUG9pbnQgcCA9IGxvY2F0aW9uUmVxdWVzdC5nZXRMb2NhdGlvbigpOwotICAgICAgICAgCi0gICAgICAgIGlmIChnZXRTdHJ1Y3R1cmVGaWd1cmUoKS5oaXRUZXN0SGVhZGVyKHApKQotICAgICAgICB7ICAgICAgICAgIAotICAgICAgICAgIC8vIFRPRE86ICEhISBUaGlzIHNob3VsZCBiZSBtb3ZlZCB0byB0aGUgYWR0LXhzZCBwYWNrYWdlCi0gICAgICAgICAgLy8gCi0gICAgICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWRhcHRlcikgICAgIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb25BZGFwdGVyKW1vZGVsOwotICAgICAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0ID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbilhZGFwdGVyLmdldFRhcmdldCgpOwotICAgICAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotICAgICAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICAgIE9iamVjdCBzY2hlbWEgPSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoWFNEU2NoZW1hLmNsYXNzKTsKLSAgICAgICAgICAgIEFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0RWRpdG9yQWN0aW9uUmVnaXN0cnkoZWRpdG9yUGFydCk7Ci0gICAgICAgICAgICBpZiAocmVnaXN0cnkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKHNjaGVtYSA9PSBjdC5nZXRTY2hlbWEoKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElBY3Rpb24gYWN0aW9uID0gcmVnaXN0cnkuZ2V0QWN0aW9uKFNldElucHV0VG9HcmFwaFZpZXcuSUQpOwotICAgICAgICAgICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJQWN0aW9uIGFjdGlvbiA9IHJlZ2lzdHJ5LmdldEFjdGlvbihPcGVuSW5OZXdFZGl0b3IuSUQpOwotICAgICAgICAgICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBBY3Rpb25SZWdpc3RyeSBnZXRFZGl0b3JBY3Rpb25SZWdpc3RyeShJRWRpdG9yUGFydCBlZGl0b3IpCi0gIHsKLSAgICByZXR1cm4gKEFjdGlvblJlZ2lzdHJ5KSBlZGl0b3IuZ2V0QWRhcHRlcihBY3Rpb25SZWdpc3RyeS5jbGFzcyk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHNob3VsZERyYXdDb25uZWN0aW9uKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25GaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1RvcExldmVsRmllbGRFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9Ub3BMZXZlbEZpZWxkRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEyOGU3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL1RvcExldmVsRmllbGRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llcy5BRFREaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXMuQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LnR5cGV2aXouZGVzaWduLmZpZ3VyZXMuQm94RmlndXJlOwotCi1wdWJsaWMgY2xhc3MgVG9wTGV2ZWxGaWVsZEVkaXRQYXJ0IGV4dGVuZHMgQm94RWRpdFBhcnQgaW1wbGVtZW50cyBJTmFtZWRFZGl0UGFydAotewotICBwcm90ZWN0ZWQgQURURGlyZWN0RWRpdFBvbGljeSBhZHREaXJlY3RFZGl0UG9saWN5ID0gbmV3IEFEVERpcmVjdEVkaXRQb2xpY3koKTsKLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHNob3VsZERyYXdDb25uZWN0aW9uKCkKLSAgewotICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpZ2V0TW9kZWwoKTsKLSAgICBJVHlwZSB0eXBlID0gZmllbGQuZ2V0VHlwZSgpOwotICAgIHJldHVybiAodHlwZSAhPSBudWxsKTsKLSAgfQotICAKLSAgcHVibGljIFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25GaWd1cmUoKQotICB7Ci0gICAgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24gY29ubmVjdGlvbkZpZ3VyZSA9IG51bGw7Ci0gICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZClnZXRNb2RlbCgpOwotICAgIElUeXBlIHR5cGUgPSBmaWVsZC5nZXRUeXBlKCk7Ci0gICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICB7ICAgICAgCi0gICAgICBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHJlZmVyZW5jZVR5cGVQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpZ2V0Vmlld2VyKCkuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldCh0eXBlKTsKLSAgICAgIGlmIChyZWZlcmVuY2VUeXBlUGFydCAhPSBudWxsKQotICAgICAgewotICAgICAgICBjb25uZWN0aW9uRmlndXJlID0gbmV3IFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uKCk7ICAgCi0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0U291cmNlQW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IoZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5SSUdIVCwgMCkpOwotICAgICAgICBpbnQgdGFyZ2V0QW5jaG9yWU9mZnNldCA9IDEyOyAgICAgICAgCi0gICAgICAgIGNvbm5lY3Rpb25GaWd1cmUuc2V0VGFyZ2V0QW5jaG9yKG5ldyBDZW50ZXJlZENvbm5lY3Rpb25BbmNob3IocmVmZXJlbmNlVHlwZVBhcnQuZ2V0RmlndXJlKCksIENlbnRlcmVkQ29ubmVjdGlvbkFuY2hvci5IRUFERVJfTEVGVCwgMCwgdGFyZ2V0QW5jaG9yWU9mZnNldCkpOyAKLSAgICAgICAgY29ubmVjdGlvbkZpZ3VyZS5zZXRIaWdobGlnaHQoZmFsc2UpOwotICAgICAgfQotICAgIH0gICAgCi0gICAgcmV0dXJuIGNvbm5lY3Rpb25GaWd1cmU7Ci0gIH0gIAotICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwgYWR0RGlyZWN0RWRpdFBvbGljeSk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgbmV3IEFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeSgpKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpZ2V0TW9kZWwoKTsKLSAgICBCb3hGaWd1cmUgYm94RmlndXJlID0gKEJveEZpZ3VyZSlnZXRGaWd1cmUoKTsKLSAgICBib3hGaWd1cmUuZ2V0TmFtZUxhYmVsKCkuc2V0VGV4dChmaWVsZC5nZXROYW1lKCkpOwotICAgIHN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMYWJlbCBnZXROYW1lTGFiZWxGaWd1cmUoKQotICB7Ci0gICAgQm94RmlndXJlIGJveEZpZ3VyZSA9IChCb3hGaWd1cmUpZ2V0RmlndXJlKCk7Ci0gICAgcmV0dXJuIGJveEZpZ3VyZS5nZXROYW1lTGFiZWwoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGN1cnNvckxvY2F0aW9uKQotICB7Ci0gICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KQotICB7ICAKLSAgICBpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVR8fAotICAgICAgICByZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9PUEVOKQotICAgIHsKLS8vICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBMb2NhdGlvblJlcXVlc3QpCi0vLyAgICAgIHsKLS8vICAgICAgICBMb2NhdGlvblJlcXVlc3QgbG9jYXRpb25SZXF1ZXN0ID0gKExvY2F0aW9uUmVxdWVzdClyZXF1ZXN0OwotLy8gICAgICAgIFBvaW50IHAgPSBsb2NhdGlvblJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLS8vICAgICAgIAotLy8gICAgICAgIGlmIChoaXRUZXN0KGdldE5hbWVMYWJlbEZpZ3VyZSgpLCBwKSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBMYWJlbEVkaXRNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTGFiZWxFZGl0TWFuYWdlcih0aGlzLCBuZXcgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcih0aGlzLCBwKSk7Ci0vLyAgICAgICAgICBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIgd3JhcHBlciA9IG5ldyBOYW1lVXBkYXRlQ29tbWFuZFdyYXBwZXIoKTsKLS8vICAgICAgICAgIGFkdERpcmVjdEVkaXRQb2xpY3kuc2V0VXBkYXRlQ29tbWFuZCh3cmFwcGVyKTsKLS8vICAgICAgICAgIG1hbmFnZXIuc2hvdygpOwotLy8gICAgICAgIH0KLS8vICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9UeXBlUmVmZXJlbmNlQ29ubmVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9UeXBlUmVmZXJlbmNlQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDdkYTRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvblJvdXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hbmhhdHRhbkNvbm5lY3Rpb25Sb3V0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlnb25EZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotcHVibGljIGNsYXNzIFR5cGVSZWZlcmVuY2VDb25uZWN0aW9uIGV4dGVuZHMgUG9seWxpbmVDb25uZWN0aW9uCi17Ci0gIHByb3RlY3RlZCBib29sZWFuIGhpZ2hsaWdodCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbG9yIGFjdGl2ZUNvbm5lY3Rpb24gPSBDb2xvckNvbnN0YW50cy5ibGFjazsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb2xvciBpbmFjdGl2ZUNvbm5lY3Rpb24gPSBuZXcgQ29sb3IobnVsbCwgMTk4LCAxOTUsIDE5OCk7Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgY29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBUeXBlUmVmZXJlbmNlQ29ubmVjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHNldFRhcmdldERlY29yYXRpb24obmV3IFBvbHlnb25EZWNvcmF0aW9uKCkpOwotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJlZmVyZW5jZUNvbm5lY3Rpb24oYm9vbGVhbiBmaWxsKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBQb2x5Z29uRGVjb3JhdGlvbiBkZWMgPSBuZXcgUG9seWdvbkRlY29yYXRpb24oKQotICAgIHsKLSAgICAgIHByb3RlY3RlZCB2b2lkIGZpbGxTaGFwZShHcmFwaGljcyBnKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGcucHVzaFN0YXRlKCk7Ci0gICAgICAgICAgZy5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMud2hpdGUpOwotICAgICAgICAgIHN1cGVyLmZpbGxTaGFwZShnKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICBnLnBvcFN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgIH07Ci0gICAgZGVjLnNldEZpbGwoZmlsbCk7Ci0gICAgZGVjLnNldFRlbXBsYXRlKFBvbHlnb25EZWNvcmF0aW9uLlRSSUFOR0xFX1RJUCk7Ci0gICAgZGVjLnNldFNjYWxlKDE0LDYpOwotICAgIHNldFRhcmdldERlY29yYXRpb24oZGVjKTsKLSAgfQotICAKLQotICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uUm91dGVyKENvbm5lY3Rpb25Sb3V0ZXIgY3IpCi0gIHsKLSAgICBpZiAoY3IgIT0gbnVsbCAmJiBnZXRDb25uZWN0aW9uUm91dGVyKCkgIT0gbnVsbCAmJiAhKGdldENvbm5lY3Rpb25Sb3V0ZXIoKSBpbnN0YW5jZW9mIE1hbmhhdHRhbkNvbm5lY3Rpb25Sb3V0ZXIpKQotICAgICAgc3VwZXIuc2V0Q29ubmVjdGlvblJvdXRlcihjcik7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjdXJyZW50IGhpZ2hsaWdodCBzdGF0dXMuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0hpZ2hsaWdodGVkKCkKLSAgewotICAgIHJldHVybiBoaWdobGlnaHQ7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGhpZ2hsaWdodAotICAgKiAgICAgICAgICBUaGUgaGlnaGxpZ2h0IHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhpZ2hsaWdodChib29sZWFuIGhpZ2hsaWdodCkKLSAgewotICAgIHRoaXMuaGlnaGxpZ2h0ID0gaGlnaGxpZ2h0OwotICAgIC8vIFVwZGF0ZSBvdXIgY29ubmVjdGlvbiB0byB1c2UgdGhlIGNvcnJlY3QgY29sb3VyaW5nCi0gICAgYm9vbGVhbiBoaWdoQ29udHJhc3QgPSBmYWxzZTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBoaWdoQ29udHJhc3QgPSBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRIaWdoQ29udHJhc3QoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgaWYgKGhpZ2hDb250cmFzdCkKLSAgICB7Ci0gICAgICBzZXRGb3JlZ3JvdW5kQ29sb3IoaGlnaGxpZ2h0ID8gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9GT1JFR1JPVU5EKSA6IENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRGb3JlZ3JvdW5kQ29sb3IoaGlnaGxpZ2h0ID8gYWN0aXZlQ29ubmVjdGlvbiA6IGluYWN0aXZlQ29ubmVjdGlvbik7Ci0gICAgfQotICAgIHNldE9wYXF1ZShoaWdobGlnaHQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0Fic3RyYWN0TW9kZWxDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0Fic3RyYWN0TW9kZWxDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZWI4OGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9BYnN0cmFjdE1vZGVsQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0TGlzdGVuZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1vZGVsQ29sbGVjdGlvbiBpbXBsZW1lbnRzIElBRFRPYmplY3QKLXsKLSAgcHJvdGVjdGVkIElBRFRPYmplY3QgbW9kZWw7Ci0gIHByb3RlY3RlZCBTdHJpbmcga2luZDsKLSAgCi0gIHB1YmxpYyBBYnN0cmFjdE1vZGVsQ29sbGVjdGlvbihJQURUT2JqZWN0IG1vZGVsLCBTdHJpbmcga2luZCkKLSAgewotICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB0aGlzLmtpbmQgPSBraW5kOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRNb2RlbCgpCi0gIHsKLSAgICByZXR1cm4gbW9kZWw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNb2RlbChJQURUT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRLaW5kKCkKLSAgewotICAgIHJldHVybiBraW5kOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0S2luZChTdHJpbmcga2luZCkKLSAgewotICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBhYnN0cmFjdCBMaXN0IGdldENoaWxkcmVuKCk7Ci0KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBtb2RlbC5yZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJMaXN0ZW5lcihJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBtb2RlbC51bnJlZ2lzdGVyTGlzdGVuZXIobGlzdGVuZXIpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9Bbm5vdGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY2N2E3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0Fubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uCi17Ci0gIENvbXBhcnRtZW50IGNvbXBhcnRtZW50OwotICBwdWJsaWMgQW5ub3RhdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDb21wYXJ0bWVudChDb21wYXJ0bWVudCBjb21wYXJ0bWVudCkKLSAgewotICAgIHRoaXMuY29tcGFydG1lbnQgPSBjb21wYXJ0bWVudDsKLSAgfQotICAKLSAgcHVibGljIENvbXBhcnRtZW50IGdldENvbXBhcnRtZW50KCkKLSAgewotICAgIHJldHVybiBjb21wYXJ0bWVudDsKLSAgfQotICAKLSAgcHVibGljIElTdHJ1Y3R1cmUgZ2V0T3duZXIoKQotICB7Ci0gICAgcmV0dXJuIGNvbXBhcnRtZW50LmdldE93bmVyKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvQ29tcGFydG1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvQ29tcGFydG1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI4Y2Q0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0NvbXBhcnRtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JU3RydWN0dXJlOwotCi1wdWJsaWMgY2xhc3MgQ29tcGFydG1lbnQgaW1wbGVtZW50cyBJQURUT2JqZWN0Ci17Ci0gIFN0cmluZyBraW5kOwotICBJU3RydWN0dXJlIG93bmVyOwotCi0gIHB1YmxpYyBDb21wYXJ0bWVudChJU3RydWN0dXJlIG93bmVyLCBTdHJpbmcga2luZCkKLSAgewotICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gICAgdGhpcy5vd25lciA9IG93bmVyOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IG93bmVyLmdldEZpZWxkcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKSBpLm5leHQoKTsKLSAgICAgIGlmIChraW5kID09IG51bGwgfHwga2luZC5lcXVhbHMoZmllbGQuZ2V0S2luZCgpKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoZmllbGQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0S2luZCgpCi0gIHsKLSAgICByZXR1cm4ga2luZDsKLSAgfQotICAKLSAgcHVibGljIElTdHJ1Y3R1cmUgZ2V0T3duZXIoKQotICB7Ci0gICAgcmV0dXJuIG93bmVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICAvLyByZWFsbHkgd2Ugd2FudCB0byBsaXN0ZW4gdG8gdGhlIG93bmVyCi0gICAgb3duZXIucmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyTGlzdGVuZXIoSUFEVE9iamVjdExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgLy8gcmVhbGx5IHdlIHdhbnQgdG8gbGlzdGVuIHRvIHRoZSBvd25lcgotICAgIG93bmVyLnVucmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9Gb2N1c1R5cGVDb2x1bW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvRm9jdXNUeXBlQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYTZmYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9Gb2N1c1R5cGVDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JQURUT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklUeXBlOwotCi1wdWJsaWMgY2xhc3MgRm9jdXNUeXBlQ29sdW1uIGV4dGVuZHMgQWJzdHJhY3RNb2RlbENvbGxlY3Rpb24KLXsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNGb2N1c09iamVjdCA9IGZhbHNlOwotICAKLSAgcHVibGljIEZvY3VzVHlwZUNvbHVtbihJQURUT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgc3VwZXIobW9kZWwsICJGb2N1c1R5cGVDb2x1bW4iKTsgLy8kTk9OLU5MUy0xJCAgCi0gIH0KLQotICBwdWJsaWMgRm9jdXNUeXBlQ29sdW1uKElBRFRPYmplY3QgbW9kZWwsIGJvb2xlYW4gaXNGb2N1c09iamVjdCkKLSAgewotICAgIHN1cGVyKG1vZGVsLCAiRm9jdXNUeXBlQ29sdW1uIik7IC8vJE5PTi1OTFMtMSQKLSAgICB0aGlzLmlzRm9jdXNPYmplY3QgPSBpc0ZvY3VzT2JqZWN0OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKQotICB7Ci0gICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7ICAKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJVHlwZSkKLSAgICB7Ci0gICAgICBJVHlwZSB0eXBlID0gKElUeXBlKW1vZGVsOwotICAgICAgaWYgKHR5cGUuZ2V0U3VwZXJUeXBlKCkgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICByZXN1bHQuYWRkKHR5cGUuZ2V0U3VwZXJUeXBlKCkpOwotICAgICAgfQotICAgICAgcmVzdWx0LmFkZCh0eXBlKTsKLSAgICB9ICAKLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIElGaWVsZCB8fAotICAgICAgICAgICAgIG1vZGVsIGluc3RhbmNlb2YgSVN0cnVjdHVyZSkKLSAgICB7ICAgCi0gICAgICByZXN1bHQuYWRkKG1vZGVsKTsKLSAgICB9ICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7ICAgICAgIAotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzT2JqZWN0KCkKLSAgewotICAgIHJldHVybiBpc0ZvY3VzT2JqZWN0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0lBY3Rpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9JQWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg0NDNmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0lBY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIElBY3Rpb25Qcm92aWRlcgotewotICBwdWJsaWMgU3RyaW5nW10gZ2V0QWN0aW9ucyhPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvSUZlZWRiYWNrSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9JRmVlZGJhY2tIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZTg2MGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9JRmVlZGJhY2tIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDsKLQotcHVibGljIGludGVyZmFjZSBJRmVlZGJhY2tIYW5kbGVyCi17Ci0gIHB1YmxpYyB2b2lkIGFkZEZlZWRiYWNrKCk7Ci0gIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0lHcmFwaEVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvSUdyYXBoRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTFkOTExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvSUdyYXBoRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLQotcHVibGljIGludGVyZmFjZSBJR3JhcGhFbGVtZW50Ci17Ci0gIGJvb2xlYW4gaXNGb2N1c0FsbG93ZWQoKTsKLSAgSUFEVE9iamVjdCBnZXRUb3BDb250YWluZXIoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvSU1vZGVsUHJveHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvSU1vZGVsUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2M2MzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL0lNb2RlbFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsUHJveHkKLXsKLSAgSU1vZGVsIGdldE1vZGVsKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL1JlZmVyZW5jZWRUeXBlQ29sdW1uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL1JlZmVyZW5jZWRUeXBlQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1Zjg5NzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwYXJ0cy9tb2RlbC9SZWZlcmVuY2VkVHlwZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklUeXBlOwotCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlZFR5cGVDb2x1bW4gZXh0ZW5kcyBBYnN0cmFjdE1vZGVsQ29sbGVjdGlvbgotewotICBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgSW50ZXJuYWxMaXN0ZW5lciBpbnRlcm5hbExpc3RlbmVyID0gbmV3IEludGVybmFsTGlzdGVuZXIoKTsKLSAgCi0gIC8vIHRvZG8uLi4gcmVhbGx5IHRoaXMgdGhpcyBtb2RlbCBvYmplY3Qgc2hvdWxkIGxpc3RlbgotICAvLyB0byB0aGUgcGFyZW50IG9mIHRoZSBJVHlwZQotICAvLwotICBwdWJsaWMgUmVmZXJlbmNlZFR5cGVDb2x1bW4oSUFEVE9iamVjdCBtb2RlbCkKLSAgewotICAgIHN1cGVyKG1vZGVsLCAiUmVmZXJlbmNlZFR5cGVDb2x1bW4iKTsgLy8kTk9OLU5MUy0xJAotICAgIG1vZGVsLnJlZ2lzdGVyTGlzdGVuZXIoaW50ZXJuYWxMaXN0ZW5lcik7Ci0gICAgaW50ZXJuYWxMaXN0ZW5lci5yZWNvbXB1dGVTdWJMaXN0ZW5lcnMoKTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldENoaWxkcmVuKCkKLSAgewotICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOyAgCi0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSVN0cnVjdHVyZSkKLSAgICB7Ci0gICAgICBJU3RydWN0dXJlIHN0cnVjdHVyZSA9IChJU3RydWN0dXJlKW1vZGVsOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gc3RydWN0dXJlLmdldEZpZWxkcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpaS5uZXh0KCk7Ci0gICAgICAgIElUeXBlIHR5cGUgPSBmaWVsZC5nZXRUeXBlKCk7Ci0gICAgICAgIGlmICh0eXBlICE9IG51bGwpICAvLyAmJiB0eXBlLmlzQ29tcGxleFR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghcmVzdWx0LmNvbnRhaW5zKHR5cGUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgSUdyYXBoRWxlbWVudCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCgoSUdyYXBoRWxlbWVudCl0eXBlKS5pc0ZvY3VzQWxsb3dlZCgpKQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQodHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0gIAotICAgICAgfSAgICAgICAgCi0gICAgfSAgCi0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBJRmllbGQpCi0gICAgewotICAgICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZCltb2RlbDsKLSAgICAgIElUeXBlIHR5cGUgPSBmaWVsZC5nZXRUeXBlKCk7Ci0gICAgICBpZiAodHlwZSAhPSBudWxsKSAvLyAgJiYgdHlwZS5pc0NvbXBsZXhUeXBlKCkpCi0gICAgICB7Ci0gICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgSUdyYXBoRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIGlmICgoKElHcmFwaEVsZW1lbnQpdHlwZSkuaXNGb2N1c0FsbG93ZWQoKSkKLSAgICAgICAgICAgIHJlc3VsdC5hZGQodHlwZSk7ICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gIAotICAKLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJMaXN0ZW5lcihJQURUT2JqZWN0TGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLSAgfSAgIAotICAKLSAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKE9iamVjdCBjaGFuZ2VkT2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICBMaXN0IGNsb25lZExpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBjbG9uZWRMaXN0ZW5lckxpc3QuYWRkQWxsKGxpc3RlbmVyTGlzdCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gY2xvbmVkTGlzdGVuZXJMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgSUFEVE9iamVjdExpc3RlbmVyIGxpc3RlbmVyID0gKElBRFRPYmplY3RMaXN0ZW5lcilpLm5leHQoKTsKLSAgICAgIGxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZCh0aGlzLCBudWxsKTsKLSAgICB9IAotICB9ICAgCi0gIAotICBwcm90ZWN0ZWQgY2xhc3MgSW50ZXJuYWxMaXN0ZW5lciBpbXBsZW1lbnRzIElBRFRPYmplY3RMaXN0ZW5lcgotICB7Ci0gICAgTGlzdCBmaWVsZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICB2b2lkIHJlY29tcHV0ZVN1Ykxpc3RlbmVycygpCi0gICAgewotICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSVN0cnVjdHVyZSkKLSAgICAgIHsgIAotICAgICAgICAvLyByZW1vdmUgb2xkIG9uZXMKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZmllbGRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpIGkubmV4dCgpOwotICAgICAgICAgIGZpZWxkLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgfQotICAgICAgICAvLyBhZGQgbmV3IG9uZXMKLSAgICAgICAgZmllbGRzLmNsZWFyKCk7Ci0gICAgICAgIElTdHJ1Y3R1cmUgY29tcGxleFR5cGUgPSAoSVN0cnVjdHVyZSkgbW9kZWw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbXBsZXhUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIElGaWVsZCBmaWVsZCA9IChJRmllbGQpIGkubmV4dCgpOwotICAgICAgICAgIGZpZWxkcy5hZGQoZmllbGQpOwotICAgICAgICAgIGZpZWxkLnJlZ2lzdGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIGlmIChvYmplY3QgPT0gbW9kZWwpCi0gICAgICB7Ci0gICAgICAgIC8vIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBmaWVsZHMgd2UncmUgbGlzdGVuaW5nIHRvbwotICAgICAgICAvLyBzaW5jZSB0aGVzZSBtYXkgaGF2ZSBjaGFuZ2VkCi0gICAgICAgIHJlY29tcHV0ZVN1Ykxpc3RlbmVycygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUZpZWxkKQotICAgICAgewotICAgICAgfSAgCi0gICAgICBub3RpZnlMaXN0ZW5lcnMob2JqZWN0LCBwcm9wZXJ0eSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBhcnRzL21vZGVsL1Jvb3RIb2xkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvUm9vdEhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTdiM2E2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cGFydHMvbW9kZWwvUm9vdEhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci0KLXB1YmxpYyBjbGFzcyBSb290SG9sZGVyCi17Ci0gIElBRFRPYmplY3QgbW9kZWw7Ci0KLSAgcHVibGljIFJvb3RIb2xkZXIoSUFEVE9iamVjdCBtb2RlbCkKLSAgewotICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgfQotCi0gIHB1YmxpYyBJQURUT2JqZWN0IGdldE1vZGVsKCkKLSAgewotICAgIHJldHVybiBtb2RlbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9BRFREaXJlY3RFZGl0UG9saWN5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0FEVERpcmVjdEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdmMjJiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0FEVERpcmVjdEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5EaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZGlyZWN0ZWRpdC5Db21ib0JveENlbGxFZGl0b3JNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQURURGlyZWN0RWRpdFBvbGljeSBleHRlbmRzIERpcmVjdEVkaXRQb2xpY3kKLXsKLSAgcHJvdGVjdGVkIENvbWJvQm94Q2VsbEVkaXRvck1hbmFnZXIgZGVsZWdhdGU7Ci0gIHByb3RlY3RlZCBJQURUVXBkYXRlQ29tbWFuZCBjb21tYW5kOwotCi0gIHB1YmxpYyBBRFREaXJlY3RFZGl0UG9saWN5KCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAKLSAgcHVibGljIHZvaWQgc2V0VXBkYXRlQ29tbWFuZChJQURUVXBkYXRlQ29tbWFuZCBjb21tYW5kKQotICB7Ci0gICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgc2hvd0N1cnJlbnRFZGl0VmFsdWUoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkgCi0gIHsgICAgICAKLSAgICBnZXRIb3N0RmlndXJlKCkuZ2V0VXBkYXRlTWFuYWdlcigpLnBlcmZvcm1VcGRhdGUoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb21tYW5kIGdldERpcmVjdEVkaXRDb21tYW5kKERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBjb21tYW5kLnNldFJlcXVlc3QocmVxdWVzdCk7Ci0gICAgcmV0dXJuIChDb21tYW5kKWNvbW1hbmQ7IAotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9BRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cG9saWNpZXMvQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NDcxNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9BRFRTZWxlY3Rpb25GZWVkYmFja0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSUZlZWRiYWNrSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIEFEVFNlbGVjdGlvbkZlZWRiYWNrRWRpdFBvbGljeSBleHRlbmRzIFNlbGVjdGlvbkVkaXRQb2xpY3kKLXsKLQotICBwdWJsaWMgQURUU2VsZWN0aW9uRmVlZGJhY2tFZGl0UG9saWN5KCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoaWRlU2VsZWN0aW9uKCkKLSAgewotICAgIGlmIChnZXRIb3N0KCkgaW5zdGFuY2VvZiBJRmVlZGJhY2tIYW5kbGVyKQotICAgIHsKLSAgICAgICgoSUZlZWRiYWNrSGFuZGxlcikgZ2V0SG9zdCgpKS5yZW1vdmVGZWVkYmFjaygpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNob3dTZWxlY3Rpb24oKQotICB7Ci0gICAgaWYgKGdldEhvc3QoKSBpbnN0YW5jZW9mIElGZWVkYmFja0hhbmRsZXIpCi0gICAgewotICAgICAgKChJRmVlZGJhY2tIYW5kbGVyKSBnZXRIb3N0KCkpLmFkZEZlZWRiYWNrKCk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzaG93Rm9jdXMoKQotICB7Ci0gICAgc3VwZXIuc2hvd0ZvY3VzKCk7Ci0gICAgZ2V0SG9zdCgpLnNldEZvY3VzKHRydWUpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBoaWRlRm9jdXMoKQotICB7Ci0gICAgc3VwZXIuaGlkZUZvY3VzKCk7Ci0gICAgZ2V0SG9zdCgpLnNldEZvY3VzKGZhbHNlKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0RpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9EaXJlY3RFZGl0UG9saWN5RGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxYjQ5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0RpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXM7Ci0gICAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRGlyZWN0RWRpdFBvbGljeURlbGVnYXRlCi17ICAgICAgIAotICBwdWJsaWMgdm9pZCBwZXJmb3JtRWRpdChDZWxsRWRpdG9yIGNlbGxFZGl0b3IpOyAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0lBRFRVcGRhdGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0lBRFRVcGRhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YzRlYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9JQURUVXBkYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUFEVFVwZGF0ZUNvbW1hbmQKLXsKLSAgdm9pZCBzZXRSZXF1ZXN0KERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9LZXlCb2FyZEFjY2Vzc2liaWxpdHlFZGl0UG9saWN5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0tleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQwZWU2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZWRpdHBvbGljaWVzL0tleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5HcmFwaGljYWxFZGl0UG9saWN5OwotCi1wdWJsaWMgY2xhc3MgS2V5Qm9hcmRBY2Nlc3NpYmlsaXR5RWRpdFBvbGljeSBleHRlbmRzIEdyYXBoaWNhbEVkaXRQb2xpY3kKLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZID0gIktleUJvYXJkQWNjZXNzaWJpbGl0eUVkaXRQb2xpY3kiOwotICAKLSAgcHVibGljIHN0YXRpYyBpbnQgT1VUX1RPX1BBUkVOVCA9IFBvc2l0aW9uQ29uc3RhbnRzLkFMV0FZU19MRUZUOwotICBwdWJsaWMgc3RhdGljIGludCBJTl9UT19GSVJTVF9DSElMRCA9IFBvc2l0aW9uQ29uc3RhbnRzLkFMV0FZU19SSUdIVDsKLSAgCi0gIHB1YmxpYyBFZGl0UGFydCBnZXRSZWxhdGl2ZUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0LCBpbnQgZGlyZWN0aW9uKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9lZGl0cG9saWNpZXMvU2ltcGxlRGlyZWN0RWRpdFBvbGljeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9TaW1wbGVEaXJlY3RFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMzhlMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2VkaXRwb2xpY2llcy9TaW1wbGVEaXJlY3RFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLXB1YmxpYyBjbGFzcyBTaW1wbGVEaXJlY3RFZGl0UG9saWN5IGV4dGVuZHMgRGlyZWN0RWRpdFBvbGljeSAKLXsKLSAgcHJvdGVjdGVkIERpcmVjdEVkaXRQb2xpY3lEZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQotICBwdWJsaWMgdm9pZCBzZXREZWxlZ2F0ZShEaXJlY3RFZGl0UG9saWN5RGVsZWdhdGUgZGVsZWdhdGUpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotICB9Ci0KLSAgcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGdldERpcmVjdEVkaXRDb21tYW5kKGZpbmFsIERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpIAotICB7IAotICAJcmV0dXJuIG5ldyBDb21tYW5kKCkgLy9BYnN0cmFjdENvbW1hbmQoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChkZWxlZ2F0ZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZGVsZWdhdGUucGVyZm9ybUVkaXQocmVxdWVzdC5nZXRDZWxsRWRpdG9yKCkpOwotICAgICAgICB9ICAKLSAgICAgIH0gICAgIAotICAKLSAgICAgIHB1YmxpYyB2b2lkIHJlZG8oKQotICAgICAgewotICAgICAgfSAgCi0gIAotICAgICAgcHVibGljIHZvaWQgdW5kbygpCi0gICAgICB7Ci0gICAgICB9ICAgICAKLSAgCi0gICAgICBwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgc2hvd0N1cnJlbnRFZGl0VmFsdWUoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkgCi0gIHsgICAgICAKLSAgCS8vaGFjayB0byBwcmV2ZW50IGFzeW5jIGxheW91dCBmcm9tIHBsYWNpbmcgdGhlIGNlbGwgZWRpdG9yIHR3aWNlLgotICAJZ2V0SG9zdEZpZ3VyZSgpLmdldFVwZGF0ZU1hbmFnZXIoKS5wZXJmb3JtVXBkYXRlKCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZmlndXJlcy9JQURURmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZmlndXJlcy9JQURURmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NGEyNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2ZpZ3VyZXMvSUFEVEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElBRFRGaWd1cmUgZXh0ZW5kcyBJRmlndXJlCi17Ci0gIHZvaWQgZWRpdFBhcnRBdHRhY2hlZChFZGl0UGFydCBvd25lcik7IAotICB2b2lkIGFkZFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0gIHZvaWQgcmVtb3ZlU2VsZWN0aW9uRmVlZGJhY2soKTsKLSAgdm9pZCByZWZyZXNoVmlzdWFscyhPYmplY3QgbW9kZWwpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2ZpZ3VyZXMvSUNvbXBhcnRtZW50RmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZmlndXJlcy9JQ29tcGFydG1lbnRGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UyNWRlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZmlndXJlcy9JQ29tcGFydG1lbnRGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb21wYXJ0bWVudEZpZ3VyZSBleHRlbmRzIElBRFRGaWd1cmUKLXsKLSAgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpOwotICBJRmlndXJlIGdldEFubm90YXRpb25QYW5lKCk7ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9maWd1cmVzL0lGaWVsZEZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2ZpZ3VyZXMvSUZpZWxkRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYWJlYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2ZpZ3VyZXMvSUZpZWxkRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci0KLQotcHVibGljIGludGVyZmFjZSBJRmllbGRGaWd1cmUgZXh0ZW5kcyBJQURURmlndXJlCi17Ci0gIExhYmVsIGdldFR5cGVMYWJlbCgpOwotICBMYWJlbCBnZXROYW1lTGFiZWwoKTsKLSAgTGFiZWwgZ2V0TmFtZUFubm90YXRpb25MYWJlbCgpOwotICBMYWJlbCBnZXRUeXBlQW5ub3RhdGlvbkxhYmVsKCk7Ci0gIHZvaWQgcmVjb21wdXRlTGF5b3V0KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZmlndXJlcy9JRmlndXJlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZGVzaWduL2ZpZ3VyZXMvSUZpZ3VyZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZlZmU2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZmlndXJlcy9JRmlndXJlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5maWd1cmVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElGaWd1cmVGYWN0b3J5Ci17Ci0gIElGaWVsZEZpZ3VyZSBjcmVhdGVGaWVsZEZpZ3VyZShPYmplY3QgbW9kZWwpOwotICBJU3RydWN0dXJlRmlndXJlIGNyZWF0ZVN0cnVjdHVyZUZpZ3VyZShPYmplY3QgbW9kZWwpOwotICBJQ29tcGFydG1lbnRGaWd1cmUgY3JlYXRlQ29tcGFydG1lbnRGaWd1cmUoT2JqZWN0IG1vZGVsKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9maWd1cmVzL0lTdHJ1Y3R1cmVGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2Rlc2lnbi9maWd1cmVzL0lTdHJ1Y3R1cmVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE5NmFmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9kZXNpZ24vZmlndXJlcy9JU3RydWN0dXJlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVGaWd1cmUgZXh0ZW5kcyBJQURURmlndXJlCi17Ci0gIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKTsKLSAgTGFiZWwgZ2V0TmFtZUxhYmVsKCk7Ci0gIGJvb2xlYW4gaGl0VGVzdEhlYWRlcihQb2ludCBwb2ludCk7ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXQvQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXQvQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZhYzk5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0L0NvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLklDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyCi17Ci0gIHB1YmxpYyBJQ29tcG9uZW50RGlhbG9nIGdldEJyb3dzZURpYWxvZygpOwotICBwdWJsaWMgSUNvbXBvbmVudERpYWxvZyBnZXROZXdEaWFsb2coKTsKLSAgcHVibGljIHZvaWQgbW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKE9iamVjdCByZWZlcmVuY2luZ09iamVjdCwgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZWZlcmVuY2VkQ29tcG9uZW50KTsKLSAgcHVibGljIElDb21wb25lbnREZXNjcmlwdGlvblByb3ZpZGVyIGdldENvbXBvbmVudERlc2NyaXB0aW9uUHJvdmlkZXIoKTsKLSAgCi0gIHB1YmxpYyBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gZ2V0UXVpY2tQaWNrcygpOwotICBwdWJsaWMgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGdldEhpc3RvcnkoKTsKLSAgcHVibGljIHZvaWQgYWRkVG9IaXN0b3J5KENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50KTsgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdC9Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXQvQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMTMxMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdC9Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklBRFRPYmplY3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIyIGV4dGVuZHMgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIKLXsKLSAgdm9pZCBzZXRSZWZlcmVuY2VyKElBRFRPYmplY3QgZmllbGQpOwotICBJQURUT2JqZWN0IGdldFJlZmVyZW5jZXIoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXQvSUNvbXBvbmVudERpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdC9JQ29tcG9uZW50RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOTRmOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdC9JQ29tcG9uZW50RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJQ29tcG9uZW50RGlhbG9nICB7Ci0gIAotCS8qCi0JICogU2V0IHRoZSBPYmplY3QgYmVpbmcgc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24pOwotCQotCS8qCi0JICogUmV0dXJuIHRoZSBPYmplY3Qgd2hpY2ggc2hvdWxkIGJlIHVzZWQgYXMgdGhlIHR5cGUuCi0JICovCi0JcHVibGljIENvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLQkKLQkvKgotCSAqIFVzZWQgdG8gb3BlbiB0aGUgRGlhbG9nCi0JICovCi0JcHVibGljIGludCBjcmVhdGVBbmRPcGVuKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0FEVEV4dGVybmFsUmVzb3VyY2VWYXJpYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQURURXh0ZXJuYWxSZXNvdXJjZVZhcmlhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlmNWFhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQURURXh0ZXJuYWxSZXNvdXJjZVZhcmlhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlNvY2tldFRpbWVvdXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRW5jb2RlZFN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgQURURXh0ZXJuYWxSZXNvdXJjZVZhcmlhbnQgZXh0ZW5kcyBQbGF0Zm9ybU9iamVjdAotewotICBwcml2YXRlIElTdG9yYWdlIHN0b3JhZ2U7Ci0gIHByaXZhdGUgU3RyaW5nIHVybFN0cmluZzsKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDaGFyc2V0KFN0cmluZyBuYW1lLCBJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGdldENvbnRlbnREZXNjcmlwdGlvbihuYW1lLCBzdHJlYW0pOwotICAgIHJldHVybiBkZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IGRlc2NyaXB0aW9uLmdldENoYXJzZXQoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgSUNvbnRlbnREZXNjcmlwdGlvbiBnZXRDb250ZW50RGVzY3JpcHRpb24oU3RyaW5nIG5hbWUsIElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBJQ29udGVudFR5cGVNYW5hZ2VyIGNvbnRlbnRUeXBlTWFuYWdlciA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpOwotICAgIHRyeQotICAgIHsKLSAgICAgIHJldHVybiBjb250ZW50VHlwZU1hbmFnZXIuZ2V0RGVzY3JpcHRpb25Gb3Ioc3RyZWFtLCBuYW1lLCBJQ29udGVudERlc2NyaXB0aW9uLkFMTCk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBpZiAoc3RyZWFtICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEFEVEV4dGVybmFsUmVzb3VyY2VWYXJpYW50KFN0cmluZyB1cmxTdHJpbmcpCi0gIHsKLSAgICB0aGlzLnVybFN0cmluZyA9IHVybFN0cmluZzsKLSAgfQotCi0gIGNsYXNzIFhTRFJlc291cmNlVmFyaWFudFN0b3JhZ2UgaW1wbGVtZW50cyBJRW5jb2RlZFN0b3JhZ2UKLSAgewotCi0gICAgcHJvdGVjdGVkIEZpbGUgZ2V0RmlsZSgpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBGaWxlKHVybFN0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldENvbnRlbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcpOwotICAgICAgICAgIFVSTENvbm5lY3Rpb24gdXJsQ29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotICAgICAgICAgIHJldHVybiB1cmxDb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoU29ja2V0VGltZW91dEV4Y2VwdGlvbiB0b0V4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAgICAgLy8gaGFuZGxlCi0gICAgICB9Ci0gICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgIHsKLQotICAgICAgfQotICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSk7Ci0gICAgfQotCi0gICAgcHVibGljIElQYXRoIGdldEZ1bGxQYXRoKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFBhdGgodXJsU3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRGdWxsUGF0aCgpLnRvRmlsZSgpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikKLSAgICB7Ci0gICAgICByZXR1cm4gQURURXh0ZXJuYWxSZXNvdXJjZVZhcmlhbnQudGhpcy5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldCgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgewotICAgICAgSW5wdXRTdHJlYW0gY29udGVudHMgPSBnZXRDb250ZW50cygpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFN0cmluZyBjaGFyU2V0ID0gQURURXh0ZXJuYWxSZXNvdXJjZVZhcmlhbnQuZ2V0Q2hhcnNldChnZXROYW1lKCksIGNvbnRlbnRzKTsKLSAgICAgICAgcmV0dXJuIGNoYXJTZXQ7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBYU0RFZGl0b3JQbHVnaW4uUExVR0lOX0lELCBJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX0RFU0NSSUJJTkdfQ09OVEVOVFMsIE5MUy5iaW5kKCIiLCBuZXcgU3RyaW5nW10geyBnZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkgfSksIGUpKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBjb250ZW50cy5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb0V4Y2VwdGlvbikKLSAgICAgICAgewotCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgSVN0b3JhZ2UgZ2V0U3RvcmFnZSgpCi0gIHsKLSAgICBpZiAoc3RvcmFnZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHN0b3JhZ2UgPSBuZXcgWFNEUmVzb3VyY2VWYXJpYW50U3RvcmFnZSgpOwotICAgIH0KLSAgICByZXR1cm4gc3RvcmFnZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0FEVEZpbGVTdG9yZUVkaXRvcklucHV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQURURmlsZVN0b3JlRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmYzg3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQURURmlsZVN0b3JlRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uSUZpbGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuRmlsZVN0b3JlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEFEVEZpbGVTdG9yZUVkaXRvcklucHV0IGV4dGVuZHMgRmlsZVN0b3JlRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJQURURWRpdG9ySW5wdXQKLXsKLSAgcHJpdmF0ZSBYU0RTY2hlbWEgc2NoZW1hOwotICBwcml2YXRlIFN0cmluZyBlZGl0b3JOYW1lOwotCi0gIHB1YmxpYyBBRFRGaWxlU3RvcmVFZGl0b3JJbnB1dChJRmlsZVN0b3JlIGZpbGVTdG9yZSwgWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIHN1cGVyKGZpbGVTdG9yZSk7Ci0gICAgdGhpcy5zY2hlbWEgPSB4c2RTY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgWFNEU2NoZW1hIGdldFNjaGVtYSgpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1hOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RWRpdG9yTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGVkaXRvck5hbWUgPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIGlmIChlZGl0b3JOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGVkaXRvck5hbWU7Ci0gICAgfQotICAgIHJldHVybiBzdXBlci5nZXROYW1lKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkKLSAgewotICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbnMgPSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICBpZiAobnMgIT0gbnVsbCAmJiBucy5sZW5ndGgoKSA+IDApCi0gICAgICAgIHJldHVybiBNZXNzYWdlcy5fVUlfTEFCRUxfVEFSR0VUX05BTUVTUEFDRSArIG5zOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gTWVzc2FnZXMuX1VJX0xBQkVMX05PX05BTUVTUEFDRTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmdldFRvb2xUaXBUZXh0KCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9BRFRNdWx0aVBhZ2VFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9BRFRNdWx0aVBhZ2VFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ3MzU0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQURUTXVsdGlQYWdlRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5TZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuWm9vbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuYWN0aW9ucy5CYXNlU2VsZWN0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuU2V0SW5wdXRUb0dyYXBoVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uQURURmxvYXRpbmdUb29sYmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5EZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMuQURURWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZS5JTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5BRFRDb250ZW50T3V0bGluZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZS5BRFRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuRXh0ZW5zaWJsZUNvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBRFRNdWx0aVBhZ2VFZGl0b3IgZXh0ZW5kcyBDb21tb25NdWx0aVBhZ2VFZGl0b3IKLXsKLSAgcHJvdGVjdGVkIElNb2RlbCBtb2RlbDsKLSAgcHJpdmF0ZSBpbnQgY3VycmVudFBhZ2UgPSAtMTsKLSAgcHJvdGVjdGVkIEJ1dHRvbiB0YWJsZU9mQ29udGVudHNCdXR0b247Ci0gIHByb3RlY3RlZCBBRFRGbG9hdGluZ1Rvb2xiYXIgZmxvYXRpbmdUb29sYmFyOwotICAKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBtdWx0aS1wYWdlIGVkaXRvciBleGFtcGxlLgotICAgKi8KLSAgcHVibGljIEFEVE11bHRpUGFnZUVkaXRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgCi0gIHByaXZhdGUgY2xhc3MgSW50ZXJuYWxMYXlvdXQgZXh0ZW5kcyBTdGFja0xheW91dAotICB7Ci0gICAgcHVibGljIEludGVybmFsTGF5b3V0KCkKLSAgICB7Ci0gICAgICBzdXBlcigpOyAgCi0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpCi0gICAgewotICAgICAgQ29udHJvbCBjaGlsZHJlbltdID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0gICAgICBSZWN0YW5nbGUgcmVjdCA9IGNvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICByZWN0LnggKz0gbWFyZ2luV2lkdGg7Ci0gICAgICByZWN0LnkgKz0gbWFyZ2luSGVpZ2h0OwotICAgICAgcmVjdC53aWR0aCAtPSAyICogbWFyZ2luV2lkdGg7Ci0gICAgICByZWN0LmhlaWdodCAtPSAyICogbWFyZ2luSGVpZ2h0OwotICAgICAgCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSAKLSAgICAgIHsKLSAgICAgICAgaWYgKGkgPT0gMCkgIC8vIEZvciB0aGUgYmFjayB0byBzY2hlbWEgYnV0dG9uIAotICAgICAgICB7IAotICAgICAgICAgIG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGUgciA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpZmxvYXRpbmdUb29sYmFyLmdldENvbnRlbnRzKCkpLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotICAgICAgICAgIGNoaWxkcmVuW2ldLnNldEJvdW5kcyhyZWN0LnggKyAxMCwgcmVjdC55ICsgMTAsIHIud2lkdGgsIE1hdGgubWF4KDI0LCByLmhlaWdodCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGkgPT0gMSAmJiBtb2RlQ29tYm8gIT0gbnVsbCkgLy8gRm9yIHRoZSBkcm9wIGRvd24gdG9vbGJhcgotICAgICAgICB7Ci0gICAgICAgICAgY2hpbGRyZW5baV0uc2V0Qm91bmRzKHJlY3QueCArIHJlY3Qud2lkdGggLSA5MCAtIG1heExlbmd0aCwgcmVjdC55ICsgMTAsIG1heExlbmd0aCArIDYwLCAyNik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvLyBGb3IgdGhlIG1haW4gZ3JhcGggdmlld2VyCi0gICAgICAgIHsKLSAgICAgICAgICBjaGlsZHJlbltpXS5zZXRCb3VuZHMocmVjdCk7ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9ICAgICAgIAotICAgIH0gICAgICAgICAgICAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVHcmFwaFBhZ2VDb21wb3NpdGUoKQotICB7ICAgIAotICAgIENvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKGdldENvbnRhaW5lcigpLCBTV1QuRkxBVCk7Ci0gICAgcGFyZW50LnNldEJhY2tncm91bmQoQ29sb3JDb25zdGFudHMud2hpdGUpOwotICAgIAotICAgIHBhcmVudC5zZXRMYXlvdXQobmV3IEludGVybmFsTGF5b3V0KCkpOwotCi0gICAgZmxvYXRpbmdUb29sYmFyID0gbmV3IEFEVEZsb2F0aW5nVG9vbGJhcihnZXRNb2RlbCgpKTsKLSAgICBmbG9hdGluZ1Rvb2xiYXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotICAgIGZsb2F0aW5nVG9vbGJhci5nZXRDb250cm9sKCkuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICBFZGl0UGFydEZhY3RvcnkgZWRpdFBhcnRGYWN0b3J5ID0gZ2V0RWRpdG9yTW9kZU1hbmFnZXIoKS5nZXRDdXJyZW50TW9kZSgpLmdldEVkaXRQYXJ0RmFjdG9yeSgpOwotICAgIGZsb2F0aW5nVG9vbGJhci5zZXRFZGl0UGFydEZhY3RvcnkoZWRpdFBhcnRGYWN0b3J5KTsKLSAgICAKLSAgICBjcmVhdGVWaWV3TW9kZVRvb2xiYXIocGFyZW50KTsKLSAgICAKLSAgICByZXR1cm4gcGFyZW50OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHcmFwaFBhZ2UoKQotICB7Ci0gICAgc3VwZXIuY3JlYXRlR3JhcGhQYWdlKCk7IAotLy8gICAgdG9vbGJhclZpZXdlci5nZXRDb250cm9sKCkubW92ZUFib3ZlKGdyYXBoaWNhbFZpZXdlci5nZXRDb250cm9sKCkpOwotLy8gICAgZ3JhcGhpY2FsVmlld2VyLmdldENvbnRyb2woKS5tb3ZlQmVsb3codG9vbGJhclZpZXdlci5nZXRDb250cm9sKCkpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENvbnRyaWJ1dG9ySWQoKQotICB7Ci0gICAgcmV0dXJuICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvciI7IC8vJE5PTi1OTFMtMSQKLSAgfQotICAKLSAgcHVibGljIElDb250ZW50T3V0bGluZVBhZ2UgZ2V0Q29udGVudE91dGxpbmVQYWdlKCkKLSAgewotICAgIGlmIChmT3V0bGluZVBhZ2UgPT0gbnVsbCB8fCBmT3V0bGluZVBhZ2UuZ2V0Q29udHJvbCgpID09IG51bGwgfHwgZk91dGxpbmVQYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgZmluYWwgUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyID0gKFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpZ2V0QWRhcHRlcihQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmNsYXNzKTsKLSAgICAgIEV4dGVuc2libGVDb250ZW50T3V0bGluZVBhZ2Ugb3V0bGluZVBhZ2UgPSBudWxsOwotICAgICAgaWYgKHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3V0bGluZVBhZ2UgPSBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmdldFByb2R1Y3RDb250ZW50T3V0bGluZVBhZ2UoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKG91dGxpbmVQYWdlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG91dGxpbmVQYWdlID0gbmV3IEFEVENvbnRlbnRPdXRsaW5lUGFnZSgpOwotICAgICAgfQotICAgICAgb3V0bGluZVBhZ2Uuc2V0RWRpdG9yKHRoaXMpOwotICAgICAgSVRyZWVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpZ2V0RWRpdG9yTW9kZU1hbmFnZXIoKS5nZXRDdXJyZW50TW9kZSgpLmdldE91dGxpbmVQcm92aWRlcigpOwotICAgICAgb3V0bGluZVBhZ2Uuc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICAgIEFEVExhYmVsUHJvdmlkZXIgYWR0TGFiZWxQcm92aWRlciA9IG5ldyBBRFRMYWJlbFByb3ZpZGVyKCk7Ci0gICAgICBvdXRsaW5lUGFnZS5zZXRMYWJlbFByb3ZpZGVyKGFkdExhYmVsUHJvdmlkZXIpOwotICAgICAgb3V0bGluZVBhZ2Uuc2V0TW9kZWwoZ2V0TW9kZWwoKSk7Ci0gICAgICBmT3V0bGluZVBhZ2UgPSBvdXRsaW5lUGFnZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZPdXRsaW5lUGFnZTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIHRoZSBwYWdlcyBvZiB0aGUgbXVsdGktcGFnZSBlZGl0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpCi0gIHsKLSAgICBzZWxlY3Rpb25Qcm92aWRlciA9IGdldFNlbGVjdGlvbk1hbmFnZXIoKTsKLSAgICAKLSAgICBjcmVhdGVHcmFwaFBhZ2UoKTsKLSAgICBjcmVhdGVTb3VyY2VQYWdlKCk7Ci0gICAgCi0gICAgZ2V0RWRpdG9yU2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKHNlbGVjdGlvblByb3ZpZGVyKTsKLQotICAgIG1vZGVsID0gYnVpbGRNb2RlbCgpOyAgLy8gKElGaWxlRWRpdG9ySW5wdXQpZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgCi0gICAgaW5pdGlhbGl6ZUdyYXBoaWNhbFZpZXdlcigpOwotICAgIGZsb2F0aW5nVG9vbGJhci5zZXRNb2RlbChtb2RlbCk7Ci0gICAgCi0gICAgaW50IHBhZ2VJbmRleFRvU2hvdyA9IGdldERlZmF1bHRQYWdlVHlwZUluZGV4KCk7Ci0gICAgc2V0QWN0aXZlUGFnZShwYWdlSW5kZXhUb1Nob3cpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGludCBnZXREZWZhdWx0UGFnZVR5cGVJbmRleCgpIHsKLSAgICBpbnQgcGFnZUluZGV4ID0gU09VUkNFX1BBR0VfSU5ERVg7Ci0gICAgaWYgKFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXREZWZhdWx0UGFnZSgpLmVxdWFscyhYU0RFZGl0b3JQbHVnaW4uREVTSUdOX1BBR0UpKSB7Ci0gICAgICAgIHBhZ2VJbmRleCA9IERFU0lHTl9QQUdFX0lOREVYOwotICAgIH0KLQotICAgIHJldHVybiBwYWdlSW5kZXg7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkKLSAgewotICAgIGlmIChnZXRBY3RpdmVQYWdlKCkgPT0gREVTSUdOX1BBR0VfSU5ERVgpCi0gICAgewotICAgICAgaWYgKGdyYXBoaWNhbFZpZXdlciAhPSBudWxsICYmIGdyYXBoaWNhbFZpZXdlci5nZXRDb250cm9sKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBzZWxlY3RlZCA9IGdyYXBoaWNhbFZpZXdlci5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotICAgICAgICBpZiAoc2VsZWN0ZWQuc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGdyYXBoaWNhbFZpZXdlci5zZXRGb2N1cygoRWRpdFBhcnQpc2VsZWN0ZWQuZ2V0KDApKTsKLSAgICAgICAgfQotICAgICAgICBncmFwaGljYWxWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7Ci0gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZ3JhcGhpY2FsVmlld2VyLnNldEZvY3VzKG51bGwpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IG5ld1BhZ2VJbmRleCkKLSAgewotICAgIGN1cnJlbnRQYWdlID0gbmV3UGFnZUluZGV4OwotICAgIHN1cGVyLnBhZ2VDaGFuZ2UobmV3UGFnZUluZGV4KTsKLSAgICAKLSAgICBpZiAobmV3UGFnZUluZGV4ID09IERFU0lHTl9QQUdFX0lOREVYKQotICAgIHsKLSAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ3JhcGhpY2FsVmlld2VyLmdldFNlbGVjdGlvbk1hbmFnZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIE9iamVjdCBtb2RlbCA9IG51bGw7Ci0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgICAvLyBXaGlsZSBpbiB0aGUgc291cmNlIHZpZXcsIHNlbGVjdGlvbiBjb3VsZCBoYXZlIGNoYW5nZWQuCi0gICAgICAgIC8vIFdpbGwgdHJ5IHRvIHNlbGVjdCB0aGUgZmlyc3QgaXRlbSB3aGVuIHN3aXRjaGluZyBiYWNrIHRvIHRoZSBkZXNpZ24gdmlldy4KLSAgICAgICAgLy8gV2UgY3VycmVudGx5IGRvIG5vdCBtdWx0aS1zZWxlY3QgZmlndXJlcyBpZiBtdWx0aXBsZSBlbGVtZW50cyBhcmUgc2VsZWN0ZWQgaW4gdGhlIHNvdXJjZSB2aWV3LgotICAgICAgICAvLyBGb3IgZXhhbXBsZSwgaWYgbXVsdGlwbGUgZ2xvYmFsIGVsZW1lbnRzIGFyZSBzZWxlY3RlZCwgdGhlIGdyYXBoIHZpZXcgd2lsbCBiZSBpbiB0aGUgZGV0YWlscyB2aWV3Ci0gICAgICAgIC8vIG9mIHRoZSBmaXJzdCBvbmUuCi0gICAgICAgIE9iamVjdCBlbGVtID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKGVsZW0gaW5zdGFuY2VvZiBFZGl0UGFydCkKLSAgICAgICAgICBtb2RlbCA9ICgoRWRpdFBhcnQpZWxlbSkuZ2V0TW9kZWwoKTsKLSAgICAgIH0KLSAgICAgIC8vIFJlZnJlc2ggdGhlIGRlc2lnbiBwYWdlIHVwb24gcGFnZSBjaGFuZ2UKLSAgICAgIGdyYXBoaWNhbFZpZXdlci5nZXRDb250ZW50cygpLnJlZnJlc2goKTsKLSAgICAgIC8vIE5lZWQgdG8gdXNlIHRoZSBhZGFwdGVyLCBzaW5jZSBhZnRlciByZWZyZXNoLCB0aGUgb2xkIGVkaXQgcGFydCB3aWxsIGhhdmUgYmVlbiByZXBsYWNlZAotICAgICAgLy8gTWFpbnRhaW4gcHJldmlvdXMgc2VsZWN0aW9uOgotICAgICAgaWYgKG1vZGVsICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGdldFNlbGVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obW9kZWwpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc2V0Rm9jdXMoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGlzVGFibGVPZkNvbnRlbnRzQXBwbGljYWJsZShPYmplY3QgZ3JhcGhWaWV3SW5wdXQpCi0gIHsKLSAgICByZXR1cm4gIShncmFwaFZpZXdJbnB1dCBpbnN0YW5jZW9mIElNb2RlbCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyIGdldEdyYXBoaWNhbFZpZXdlcigpCi0gIHsKLSAgICBEZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IG5ldyBEZXNpZ25WaWV3R3JhcGhpY2FsVmlld2VyKHRoaXMsIGdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgdmlld2VyLmFkZElucHV0Q2hhbmdkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICAgICAgeyAgICAgICAgCi0gICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGlucHV0ID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKWV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgICBmbG9hdGluZ1Rvb2xiYXIucmVmcmVzaChpc1RhYmxlT2ZDb250ZW50c0FwcGxpY2FibGUoaW5wdXQuZ2V0Rmlyc3RFbGVtZW50KCkpKTsKLSAgICAgIH0gICAgICAKLSAgICB9KTsKLSAgICAvLyBXb3JrYXJvdW5kIGJ1ZyAyMjc2ODcgQW4gZWRpdCBwYXJ0J3MgZm9jdXMgc3RhdGUgaXMgbm90IHVwZGF0ZWQgcHJvcGVybHkKLSAgICAvLyBPbmNlIHRoaXMgaXMgYnVnIGlzIGZpeGVkLCB3ZSBjYW4gcmVtb3ZlIGN1c3RvbSBzZWxlY3Rpb24gbWFuYWdlcgotICAgIHZpZXdlci5zZXRTZWxlY3Rpb25NYW5hZ2VyKG5ldyBDdXN0b21TZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHJldHVybiB2aWV3ZXI7Ci0gIH0KLQotICAvLyBXb3JrYXJvdW5kIGJ1ZyAyMjc2ODcgQW4gZWRpdCBwYXJ0J3MgZm9jdXMgc3RhdGUgaXMgbm90IHVwZGF0ZWQgcHJvcGVybHkKLSAgLy8gT25jZSB0aGlzIGlzIGJ1ZyBpcyBmaXhlZCwgd2UgY2FuIHJlbW92ZSB0aGlzIGNsYXNzCi0gIHByaXZhdGUgY2xhc3MgQ3VzdG9tU2VsZWN0aW9uTWFuYWdlciBleHRlbmRzIFNlbGVjdGlvbk1hbmFnZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGFwcGVuZFNlbGVjdGlvbihFZGl0UGFydCBlZGl0cGFydCkKLSAgICB7Ci0gICAgICBpZiAoZWRpdHBhcnQgIT0gZ2V0Rm9jdXMoKSkKLSAgICAgICAgZ2V0Vmlld2VyKCkuc2V0Rm9jdXMoZWRpdHBhcnQpOwotICAgICAgc3VwZXIuYXBwZW5kU2VsZWN0aW9uKGVkaXRwYXJ0KTsKLSAgICB9Ci0gIH0KLSAgCi0gIGFic3RyYWN0IHB1YmxpYyBJTW9kZWwgYnVpbGRNb2RlbCgpOyAgLy8gKElGaWxlRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpOwotICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpCi0gIHsKLSAgICBBY3Rpb25SZWdpc3RyeSByZWdpc3RyeSA9IGdldEFjdGlvblJlZ2lzdHJ5KCk7Ci0gICAgCi0gICAgQmFzZVNlbGVjdGlvbkFjdGlvbiBhY3Rpb24gPSBuZXcgU2V0SW5wdXRUb0dyYXBoVmlldyh0aGlzKTsKLSAgICBhY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotICB9Ci0KLQotICBwdWJsaWMgSU1vZGVsIGdldE1vZGVsKCkKLSAgewotICAgIHJldHVybiBtb2RlbDsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyB0eXBlKQotICB7Ci0gICAgaWYgKHR5cGUgPT0gWm9vbU1hbmFnZXIuY2xhc3MpCi0gICAgICByZXR1cm4gZ3JhcGhpY2FsVmlld2VyLmdldFByb3BlcnR5KFpvb21NYW5hZ2VyLmNsYXNzLnRvU3RyaW5nKCkpOwotICAgIAotICAgIGlmICh0eXBlID09IEdyYXBoaWNhbFZpZXdlci5jbGFzcykKLSAgICAgIHJldHVybiBncmFwaGljYWxWaWV3ZXI7Ci0gICAgaWYgKHR5cGUgPT0gRWRpdFBhcnQuY2xhc3MgJiYgZ3JhcGhpY2FsVmlld2VyICE9IG51bGwpCi0gICAgICByZXR1cm4gZ3JhcGhpY2FsVmlld2VyLmdldFJvb3RFZGl0UGFydCgpOwotICAgIGlmICh0eXBlID09IElGaWd1cmUuY2xhc3MgJiYgZ3JhcGhpY2FsVmlld2VyICE9IG51bGwpCi0gICAgICByZXR1cm4gKChHcmFwaGljYWxFZGl0UGFydCkgZ3JhcGhpY2FsVmlld2VyLmdldFJvb3RFZGl0UGFydCgpKS5nZXRGaWd1cmUoKTsKLQotICAgIGlmICh0eXBlID09IElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MpCi0gICAgewotICAgICAgcmV0dXJuIGdldENvbnRlbnRPdXRsaW5lUGFnZSgpOwotICAgIH0KLQotICAgIHJldHVybiBzdXBlci5nZXRBZGFwdGVyKHR5cGUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0RmFjdG9yeSBnZXRFZGl0UGFydEZhY3RvcnkoKSB7Ci0gICAgcmV0dXJuIG5ldyBBRFRFZGl0UGFydEZhY3RvcnkoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHcmFwaGljYWxWaWV3ZXIoKQotICB7Ci0gICAgZ3JhcGhpY2FsVmlld2VyLnNldENvbnRlbnRzKG1vZGVsKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBpZiAoY3VycmVudFBhZ2UgPT0gU09VUkNFX1BBR0VfSU5ERVgpCi0gICAgewotICAgICAgWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLnNldFNvdXJjZVBhZ2VBc0RlZmF1bHQoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5zZXREZXNpZ25QYWdlQXNEZWZhdWx0KCk7Ci0gICAgfQotICAgIGZsb2F0aW5nVG9vbGJhciA9IG51bGw7Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9BRFRSZWFkT25seUZpbGVFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWZkOGQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9BRFRSZWFkT25seUZpbGVFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLS8qKgotICogCi0gKiBVc2VkIGZvciBhbnkgcmVhZC1vbmx5IGZpbGVzLCBpZS4gSFRUUCBmaWxlcy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBRFRSZWFkT25seUZpbGVFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElTdG9yYWdlRWRpdG9ySW5wdXQsIElBRFRFZGl0b3JJbnB1dAotewotICBwcm90ZWN0ZWQgU3RyaW5nIHVybFN0cmluZzsKLSAgcHJvdGVjdGVkIElTdG9yYWdlIHN0b3JhZ2U7Ci0gIHByb3RlY3RlZCBBRFRFeHRlcm5hbFJlc291cmNlVmFyaWFudCB2YXJpYW50OwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgcHJvdGVjdGVkIFN0cmluZyBlZGl0b3JOYW1lOwotICBwcm90ZWN0ZWQgU3RyaW5nIGVkaXRvcklEID0gIiI7Ci0KLSAgcHVibGljIEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0KFN0cmluZyB1cmxTdHJpbmcpCi0gIHsKLSAgICB0aGlzLnVybFN0cmluZyA9IHVybFN0cmluZzsKLSAgICB2YXJpYW50ID0gbmV3IEFEVEV4dGVybmFsUmVzb3VyY2VWYXJpYW50KHVybFN0cmluZyk7Ci0gIH0KLQotICAvKgotICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCi0gIHsKLSAgICBpZiAobyA9PSB0aGlzKQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBpZiAobyBpbnN0YW5jZW9mIEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0KQotICAgIHsKLSAgICAgIEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0IGlucHV0ID0gKEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0KSBvOwotICAgICAgCi0gICAgICByZXR1cm4gdXJsU3RyaW5nLmVxdWFscyhpbnB1dC5nZXRVcmxTdHJpbmcoKSkgJiYgaW5wdXQuZ2V0RWRpdG9ySUQoKS5lcXVhbHMoZWRpdG9ySUQpOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VXJsU3RyaW5nKCkKLSAgewotICAgIHJldHVybiB1cmxTdHJpbmc7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJU3RvcmFnZSBnZXRTdG9yYWdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIHN0b3JhZ2UgPSB2YXJpYW50LmdldFN0b3JhZ2UoKTsKLSAgICByZXR1cm4gc3RvcmFnZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGV4aXN0cygpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICBpZiAoZWRpdG9yTmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIFVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVybFN0cmluZyk7Ci0gICAgICByZXR1cm4gdXJpLmxhc3RTZWdtZW50KCk7Ci0gICAgfQotICAgIHJldHVybiBlZGl0b3JOYW1lOwotICB9Ci0KLSAgcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKQotICB7Ci0gICAgLy8gaHR0cCBmaWxlcyBjYW5ub3QgcGVyc2lzdAotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpCi0gIHsKLSAgICByZXR1cm4gdXJsU3RyaW5nOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpCi0gIHsKLSAgICBpZiAoYWRhcHRlciA9PSBJV29ya2JlbmNoQWRhcHRlci5jbGFzcykKLSAgICAgIHJldHVybiB0aGlzOwotICAgIGlmIChhZGFwdGVyID09IElTdG9yYWdlLmNsYXNzKQotICAgICAgcmV0dXJuIHN0b3JhZ2U7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNjaGVtYShYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgWFNEU2NoZW1hIGdldFNjaGVtYSgpCi0gIHsKLSAgICByZXR1cm4geHNkU2NoZW1hOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RWRpdG9yTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGVkaXRvck5hbWUgPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RWRpdG9ySUQoU3RyaW5nIGVkaXRvcklEKQotICB7Ci0gICAgdGhpcy5lZGl0b3JJRCA9IGVkaXRvcklEOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEVkaXRvcklEKCkKLSAgewotICAgIHJldHVybiBlZGl0b3JJRDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0NvbW1vbk11bHRpUGFnZUVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0NvbW1vbk11bHRpUGFnZUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmNkYmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9Db21tb25NdWx0aVBhZ2VFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvcjsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkRlZmF1bHRFZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Nb3VzZVdoZWVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTW91c2VXaGVlbFpvb21IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuTGF5ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuWm9vbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuVXBkYXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLlpvb21JbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5ab29tT3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5TY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNlbGVjdGlvblN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkltYWdlSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkRlc2lnblZpZXdlckdyYXBoaWNDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkZsYXRDQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5Sb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tbW9uTXVsdGlQYWdlRWRpdG9yIGV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yUGFydCBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBDb21tYW5kU3RhY2tMaXN0ZW5lciwgSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IsIElQcm9wZXJ0eUxpc3RlbmVyLCBJRWRpdG9yTW9kZUxpc3RlbmVyCi17Ci0gIHB1YmxpYyBzdGF0aWMgaW50IFNPVVJDRV9QQUdFX0lOREVYID0gMSwgREVTSUdOX1BBR0VfSU5ERVggPSAwOyAgCi0gIAotICBwcm90ZWN0ZWQgSUNvbnRlbnRPdXRsaW5lUGFnZSBmT3V0bGluZVBhZ2U7Ci0gIHByb3RlY3RlZCBEZWZhdWx0RWRpdERvbWFpbiBlZGl0RG9tYWluOwotICBwcm90ZWN0ZWQgU2VsZWN0aW9uU3luY2hyb25pemVyIHN5bmNocm9uaXplcjsKLSAgcHJvdGVjdGVkIEFjdGlvblJlZ2lzdHJ5IGFjdGlvblJlZ2lzdHJ5OwotICBwcm90ZWN0ZWQgU3RydWN0dXJlZFRleHRFZGl0b3Igc3RydWN0dXJlZFRleHRFZGl0b3I7Ci0gIHByb3RlY3RlZCBDb21tb25TZWxlY3Rpb25NYW5hZ2VyIHNlbGVjdGlvblByb3ZpZGVyOwotICBwcm90ZWN0ZWQgU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlcjsKLSAgcHJvdGVjdGVkIEVkaXRvck1vZGVNYW5hZ2VyIGVkaXRvck1vZGVNYW5hZ2VyOwotICBwcm90ZWN0ZWQgRmxhdENDb21ibyBtb2RlQ29tYm87Ci0gIHByaXZhdGUgRWRpdG9yTW9kZUFuZEN1c3RvbWl6ZWROYW1lW10gZWRpdG9yTW9kZUFuZEN1c3RvbWl6ZWROYW1lczsKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSB0b29sYmFyOwotICBwcm90ZWN0ZWQgTW9kZUNvbWJvTGlzdGVuZXIgbW9kZUNvbWJvTGlzdGVuZXI7Ci0gIHByb3RlY3RlZCBpbnQgbWF4TGVuZ3RoID0gMDsKLSAgcHJvdGVjdGVkIENvbW1vbkFjdGl2YXRpb25MaXN0ZW5lciBmQWN0aXZhdGlvbkxpc3RlbmVyOwotICAKLSAgcHVibGljIENvbW1vbk11bHRpUGFnZUVkaXRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIGVkaXREb21haW4gPSBuZXcgRGVmYXVsdEVkaXREb21haW4odGhpcykKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBtb3VzZUV2ZW50LCBFZGl0UGFydFZpZXdlciB2aWV3ZXIpCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gZWF0VGhlRXZlbnQgPSBmYWxzZTsgICAgICAKLSAgICAgICAgTGF5ZXJNYW5hZ2VyIG1hbmFnZXIgPSAoTGF5ZXJNYW5hZ2VyKXZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KExheWVyTWFuYWdlci5JRCk7ICAgICAKLSAgICAgICAgSUZpZ3VyZSBsYXllciA9IG1hbmFnZXIuZ2V0TGF5ZXIoRGVzaWduVmlld2VyR3JhcGhpY0NvbnN0YW50cy5TQ0FMRURfSEFORExFX0xBWUVSKTsKLSAgICAgICAgaWYgKGxheWVyICE9IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgIFBvaW50IHAgPSBuZXcgUG9pbnQobW91c2VFdmVudC54LCBtb3VzZUV2ZW50LnkpOwotICAgICAgICAgIGxheWVyLnRyYW5zbGF0ZVRvUmVsYXRpdmUocCk7Ci0gICAgICAgICAgSUZpZ3VyZSBmaWd1cmUgPSBsYXllci5maW5kRmlndXJlQXQocCk7ICAgICAKLSAgICAgICAgICBpZiAoZmlndXJlICE9IG51bGwgJiYgZmlndXJlICE9IGxheWVyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIHdlIGVhdCB0aGlzIHNlbGVjdGlvbiBldmVudCEKLSAgICAgICAgICAgIGVhdFRoZUV2ZW50ID0gdHJ1ZTsKLSAgICAgICAgICB9IAotICAgICAgICB9Ci0gICAgICAgIGlmICghZWF0VGhlRXZlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBzdXBlci5tb3VzZURvd24obW91c2VFdmVudCwgdmlld2VyKTsKLSAgICAgICAgfSAgCi0gICAgICB9ICAgICAgCi0gICAgfTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciNnZXRDb250cmlidXRvcklkKCkKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29udHJpYnV0b3JJZCgpOwotICAKLSAgCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZUFjdGlvbnMoKTsKLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQjY3JlYXRlUGFnZXMoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUGFnZXMoKQotICB7Ci0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjZG9TYXZlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotICAgKi8KLSAgcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgewotLy8gICAgZ2V0RWRpdG9yKDEpLmRvU2F2ZShtb25pdG9yKTsgCi0gICAgc3RydWN0dXJlZFRleHRFZGl0b3IuZG9TYXZlKG1vbml0b3IpOwotICAgIGdldENvbW1hbmRTdGFjaygpLm1hcmtTYXZlTG9jYXRpb24oKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjZG9TYXZlQXMoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZG9TYXZlQXMoKQotICB7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0RWRpdG9yKDEpOwotLy8gICAgZWRpdG9yLmRvU2F2ZUFzKCk7Ci0gICAgc3RydWN0dXJlZFRleHRFZGl0b3IuZG9TYXZlQXMoKTsKLSAgICBzZXRJbnB1dChzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLSAgICBzZXRQYXJ0TmFtZShlZGl0b3IuZ2V0VGl0bGUoKSk7Ci0gICAgZ2V0Q29tbWFuZFN0YWNrKCkubWFya1NhdmVMb2NhdGlvbigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNpc1NhdmVBc0FsbG93ZWQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyI3Jlc291cmNlQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudCkKLSAgICogCi0gICAqIENsb3NlcyBhbGwgcHJvamVjdCBmaWxlcyBvbiBwcm9qZWN0IGNsb3NlLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKGZpbmFsIElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UpCi0gICAgewotICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgIHsKLSAgICAgICAgICBJV29ya2JlbmNoUGFnZVtdIHBhZ2VzID0gZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFBhZ2VzKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKChGaWxlRWRpdG9ySW5wdXQpIHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKS5nZXRQcm9qZWN0KCkuZXF1YWxzKGV2ZW50LmdldFJlc291cmNlKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gcGFnZXNbaV0uZmluZEVkaXRvcihzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLSAgICAgICAgICAgICAgcGFnZXNbaV0uY2xvc2VFZGl0b3IoZWRpdG9yUGFydCwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICB9Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFja0xpc3RlbmVyI2NvbW1hbmRTdGFja0NoYW5nZWQoamF2YS51dGlsLkV2ZW50T2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChFdmVudE9iamVjdCBldmVudCkKLSAgewotICAgIGZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEluZGljYXRlcyB0aGF0IGEgcHJvcGVydHkgaGFzIGNoYW5nZWQuCi0gICAqIAotICAgKiBAcGFyYW0gc291cmNlCi0gICAqICAgICAgICAgIHRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydHkgaGFzIGNoYW5nZWQKLSAgICogQHBhcmFtIHByb3BJZAotICAgKiAgICAgICAgICB0aGUgaWQgb2YgdGhlIHByb3BlcnR5IHdoaWNoIGhhcyBjaGFuZ2VkOyBwcm9wZXJ0eSBpZHMgYXJlCi0gICAqICAgICAgICAgIGdlbmVyYWxseSBkZWZpbmVkIGFzIGNvbnN0YW50cyBvbiB0aGUgc291cmNlIGNsYXNzCi0gICAqLwotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IHNvdXJjZSwgaW50IHByb3BJZCkKLSAgewotICAgIHN3aXRjaCAocHJvcElkKQotICAgIHsKLSAgICAgIC8vIGhhZCB0byBpbXBsZW1lbnQgaW5wdXQgY2hhbmdlZCAibGlzdGVuZXIiIHNvIHRoYXQKLSAgICAgIC8vIHN0cnVjdXRlZFRleHQgY291bGQgdGVsbCBpdCBjb250YWluaW5nIGVkaXRvciB0aGF0Ci0gICAgICAvLyB0aGUgaW5wdXQgaGFzIGNoYW5nZSwgd2hlbiBhICdyZXNvdXJjZSBtb3ZlZCcgZXZlbnQgaXMKLSAgICAgIC8vIGZvdW5kLgotICAgICAgY2FzZSBJRWRpdG9yUGFydC5QUk9QX0lOUFVUIDoKLSAgICAgIGNhc2UgSUVkaXRvclBhcnQuUFJPUF9ESVJUWSA6IHsKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBzdHJ1Y3R1cmVkVGV4dEVkaXRvcikKLSAgICAgICAgewotICAgICAgICAgIGlmIChzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpICE9IGdldEVkaXRvcklucHV0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgc2V0SW5wdXQoc3RydWN0dXJlZFRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgICAgICAgICAvLyB0aXRsZSBzaG91bGQgYWx3YXlzIGNoYW5nZSB3aGVuIGlucHV0IGNoYW5nZXMuCi0gICAgICAgICAgICAvLyBjcmVhdGUgcnVubmFibGUgZm9yIGZvbGxvd2luZyBwb3N0IGNhbGwKLSAgICAgICAgICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9maXJlUHJvcGVydHlDaGFuZ2UoSVdvcmtiZW5jaFBhcnQuUFJPUF9USVRMRSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAvLyBVcGRhdGUgaXMganVzdCB0byBwb3N0IHRoaW5ncyBvbiB0aGUgZGlzcGxheSBxdWV1ZQotICAgICAgICAgICAgLy8gKHRocmVhZCkuIFdlIGhhdmUgdG8gZG8gdGhpcyB0byBnZXQgdGhlIGRpcnR5Ci0gICAgICAgICAgICAvLyBwcm9wZXJ0eSB0byBnZXQgdXBkYXRlZCBhZnRlciBvdGhlciB0aGluZ3Mgb24gdGhlCi0gICAgICAgICAgICAvLyBxdWV1ZSBhcmUgZXhlY3V0ZWQuCi0gICAgICAgICAgICBwb3N0T25EaXNwbGF5UXVlKHJ1bm5hYmxlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIElXb3JrYmVuY2hQYXJ0LlBST1BfVElUTEUgOiB7Ci0gICAgICAgIC8vIHVwZGF0ZSB0aGUgaW5wdXQgaWYgdGhlIHRpdGxlIGlzIGNoYW5nZWQKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBzdHJ1Y3R1cmVkVGV4dEVkaXRvcikKLSAgICAgICAgewotICAgICAgICAgIGlmIChzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpICE9IGdldEVkaXRvcklucHV0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgc2V0SW5wdXQoc3RydWN0dXJlZFRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZGVmYXVsdCA6IHsKLSAgICAgICAgLy8gcHJvcGFnYXRlIGNoYW5nZXMuIElzIHRoaXMgbmVlZGVkPyBBbnN3ZXI6IFllcy4KLSAgICAgICAgaWYgKHNvdXJjZSA9PSBzdHJ1Y3R1cmVkVGV4dEVkaXRvcikKLSAgICAgICAgewotICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZShwcm9wSWQpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgLy8gU2hvdWxkIG92ZXJyaWRlIHRvIHNldCB0aGUgaW5wdXQgdG8gdGhlIGRlc2lnbiB2aWV3ZXIgZm9yIGEgbmV3IGRvY3VtZW50IGNoYW5nZQotICAvLyBpZS4gd2hlbiBkb2luZyBhIHNhdmVBcwotICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dFRvR3JhcGhpY2FsVmlld2VyKElEb2N1bWVudCBuZXdJbnB1dCkKLSAgewotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXQoSUVkaXRvcklucHV0IGlucHV0KQotICB7Ci0gICAgc3VwZXIuc2V0SW5wdXQoaW5wdXQpOwotICAgIGlmIChncmFwaGljYWxWaWV3ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZXRJbnB1dFRvR3JhcGhpY2FsVmlld2VyKGdldERvY3VtZW50KCkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKQotICB7Ci0gICAgSURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICBpZiAoc3RydWN0dXJlZFRleHRFZGl0b3IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkb2N1bWVudCA9IHN0cnVjdHVyZWRUZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGRvY3VtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHByb3RlY3RlZCBTZWxlY3Rpb25TeW5jaHJvbml6ZXIgZ2V0U2VsZWN0aW9uU3luY2hyb25pemVyKCkKLSAgewotICAgIGlmIChzeW5jaHJvbml6ZXIgPT0gbnVsbCkKLSAgICAgIHN5bmNocm9uaXplciA9IG5ldyBTZWxlY3Rpb25TeW5jaHJvbml6ZXIoKTsKLSAgICByZXR1cm4gc3luY2hyb25pemVyOwotICB9Ci0KLSAgcHVibGljIENvbW1vblNlbGVjdGlvbk1hbmFnZXIgZ2V0U2VsZWN0aW9uTWFuYWdlcigpCi0gIHsKLSAgICBpZiAoc2VsZWN0aW9uUHJvdmlkZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZWxlY3Rpb25Qcm92aWRlciA9IG5ldyBDb21tb25TZWxlY3Rpb25NYW5hZ2VyKHRoaXMpOwotICAgIH0KLSAgICByZXR1cm4gc2VsZWN0aW9uUHJvdmlkZXI7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFRoaXMgbWV0aG9kIGlzIGp1c3QgdG8gbWFrZSBmaXJlUHJvcGVydHlDaGFuZ2VkIGFjY2Vzc2JpYmxlIGZyb20gc29tZQotICAgKiAoYW5vbm9tb3VzKSBpbm5lciBjbGFzc2VzLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgX2ZpcmVQcm9wZXJ0eUNoYW5nZShpbnQgcHJvcGVydHkpCi0gIHsKLSAgICBzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UocHJvcGVydHkpOwotICB9Ci0gIAotICAvKioKLSAgICogUG9zdHMgdGhlIHVwZGF0ZSBjb2RlICJiZWhpbmQiIHRoZSBydW5uaW5nIG9wZXJhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHBvc3RPbkRpc3BsYXlRdWUoUnVubmFibGUgcnVubmFibGUpCi0gIHsKLSAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgSVdvcmtiZW5jaFdpbmRvd1tdIHdpbmRvd3MgPSB3b3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOwotICAgIGlmICh3aW5kb3dzICE9IG51bGwgJiYgd2luZG93cy5sZW5ndGggPiAwKQotICAgIHsKLSAgICAgIERpc3BsYXkgZGlzcGxheSA9IHdpbmRvd3NbMF0uZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCk7Ci0gICAgICBkaXNwbGF5LmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJ1bm5hYmxlLnJ1bigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSA8Y29kZT5NdWx0aVBhZ2VFZGl0b3JQYXJ0PC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCi0gICAqIDxjb2RlPklXb3JrYmVuY2hQYXJ0PC9jb2RlPiBtZXRob2QgZGlzcG9zZXMgYWxsIG5lc3RlZCBlZGl0b3JzLgotICAgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGdldENvbW1hbmRTdGFjaygpLnJlbW92ZUNvbW1hbmRTdGFja0xpc3RlbmVyKHRoaXMpOwotICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotICAgIGFjdGlvblJlZ2lzdHJ5LmRpc3Bvc2UoKTsKLSAgICAKLSAgICBpZiAoc3RydWN0dXJlZFRleHRFZGl0b3IgIT0gbnVsbCkgewotICAgICAgc3RydWN0dXJlZFRleHRFZGl0b3IucmVtb3ZlUHJvcGVydHlMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gICAgc3RydWN0dXJlZFRleHRFZGl0b3IgPSBudWxsOwotICAgIGVkaXREb21haW4gPSBudWxsOwotICAgIGZPdXRsaW5lUGFnZSA9IG51bGw7Ci0gICAgc3luY2hyb25pemVyID0gbnVsbDsKLSAgICBhY3Rpb25SZWdpc3RyeSA9IG51bGw7Ci0gICAgc2VsZWN0aW9uUHJvdmlkZXIgPSBudWxsOwotICAgIGdyYXBoaWNhbFZpZXdlciA9IG51bGw7Ci0gICAgaWYgKG1vZGVDb21ibyAhPSBudWxsICYmICFtb2RlQ29tYm8uaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIG1vZGVDb21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihtb2RlQ29tYm9MaXN0ZW5lcik7Ci0gICAgICBtb2RlQ29tYm9MaXN0ZW5lciA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIGlmIChmQWN0aXZhdGlvbkxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgIGZBY3RpdmF0aW9uTGlzdGVuZXIuZGlzcG9zZSgpOwotICAgICAgZkFjdGl2YXRpb25MaXN0ZW5lciA9IG51bGw7Ci0gICAgfQotICAgCi0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbW1hbmRTdGFjayBnZXRDb21tYW5kU3RhY2soKQotICB7Ci0gICAgcmV0dXJuIGVkaXREb21haW4uZ2V0Q29tbWFuZFN0YWNrKCk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJRWRpdG9yUGFydAotICAgKi8KLSAgcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikKLSAgewotICAgIHNldEFjdGl2ZVBhZ2UoU09VUkNFX1BBR0VfSU5ERVgpOwotICAgIElERS5nb3RvTWFya2VyKHN0cnVjdHVyZWRUZXh0RWRpdG9yLCBtYXJrZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSA8Y29kZT5NdWx0aVBhZ2VFZGl0b3JFeGFtcGxlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZAotICAgKiBjaGVja3MgdGhhdCB0aGUgaW5wdXQgaXMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+SUZpbGVFZGl0b3JJbnB1dDwvY29kZT4uCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5pbml0KHNpdGUsIGVkaXRvcklucHV0KTsKLSAgICAKLSAgICBnZXRDb21tYW5kU3RhY2soKS5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICBpbml0aWFsaXplQWN0aW9uUmVnaXN0cnkoKTsKLSAgICAKLSAgICBTdHJpbmcgdGl0bGUgPSBudWxsOwotICAgIGlmIChnZXRFZGl0b3JJbnB1dCgpICE9IG51bGwpIHsKLSAgICAgIHRpdGxlID0gZ2V0RWRpdG9ySW5wdXQoKS5nZXROYW1lKCk7Ci0gICAgfQotICAgIHNldFBhcnROYW1lKHRpdGxlKTsKLSAgICAKLSAgICBmQWN0aXZhdGlvbkxpc3RlbmVyID0gbmV3IENvbW1vbkFjdGl2YXRpb25MaXN0ZW5lcihzaXRlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFBhcnRTZXJ2aWNlKCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUFjdGlvblJlZ2lzdHJ5KCkKLSAgewotICAgIGNyZWF0ZUFjdGlvbnMoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIEFjdGlvblJlZ2lzdHJ5IGdldEFjdGlvblJlZ2lzdHJ5KCkKLSAgewotICAgIGlmIChhY3Rpb25SZWdpc3RyeSA9PSBudWxsKQotICAgICAgYWN0aW9uUmVnaXN0cnkgPSBuZXcgQWN0aW9uUmVnaXN0cnkoKTsKLSAgICByZXR1cm4gYWN0aW9uUmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgdHlwZSkKLSAgewotICAgIGlmICh0eXBlID09IENvbW1hbmRTdGFjay5jbGFzcykKLSAgICAgIHJldHVybiBnZXRDb21tYW5kU3RhY2soKTsKLSAgICBpZiAodHlwZSA9PSBBY3Rpb25SZWdpc3RyeS5jbGFzcykKLSAgICAgIHJldHVybiBnZXRBY3Rpb25SZWdpc3RyeSgpOwotICAgIGlmICh0eXBlID09IEVkaXRvck1vZGVNYW5hZ2VyLmNsYXNzKQotICAgICAgcmV0dXJuIGdldEVkaXRvck1vZGVNYW5hZ2VyKCk7Ci0gICAgaWYgKHR5cGUgPT0gSUdvdG9NYXJrZXIuY2xhc3MpIHsKLSAgICAgIHJldHVybiBuZXcgSUdvdG9NYXJrZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAgICAgICBDb21tb25NdWx0aVBhZ2VFZGl0b3IudGhpcy5nb3RvTWFya2VyKG1hcmtlcik7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgfQotICAgIGlmICh0eXBlID09IElUZXh0RWRpdG9yLmNsYXNzKQotICAgICAgcmV0dXJuIGdldFRleHRFZGl0b3IoKTsKLSAgICAKLSAgICByZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcih0eXBlKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIERlZmF1bHRFZGl0RG9tYWluIGdldEVkaXREb21haW4oKQotICB7Ci0gICAgcmV0dXJuIGVkaXREb21haW47Ci0gIH0KLQotICAvKioKLSAgICogRnJvbSBHRUYgR3JhcGhpY2FsRWRpdG9yIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciB1cGRhdGluZyBhIHNldCBvZiBhY3Rpb25zCi0gICAqIGRlZmluZWQgYnkgdGhlIGdpdmVuIExpc3Qgb2YgYWN0aW9uIElEcy4gVGhlIGFjdGlvbnMgYXJlIGZvdW5kIGJ5IGxvb2tpbmcKLSAgICogdXAgdGhlIElEIGluIHRoZSB7QGxpbmsgI2dldEFjdGlvblJlZ2lzdHJ5KCkgYWN0aW9uIHJlZ2lzdHJ5fS4gSWYgdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgYWN0aW9uIGlzIGFuIHtAbGluayBVcGRhdGVBY3Rpb259LCBpdCB3aWxsIGhhdmUgaXRzCi0gICAqIDxjb2RlPnVwZGF0ZSgpPC9jb2RlPiBtZXRob2QgY2FsbGVkLgotICAgKiAKLSAgICogQHBhcmFtIGFjdGlvbklkcwotICAgKiAgICAgICAgICB0aGUgbGlzdCBvZiBJRHMgdG8gdXBkYXRlCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVBY3Rpb25zKExpc3QgYWN0aW9uSWRzKQotICB7Ci0gICAgQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRBY3Rpb25SZWdpc3RyeSgpOwotICAgIEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpb25JZHMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgSUFjdGlvbiBhY3Rpb24gPSByZWdpc3RyeS5nZXRBY3Rpb24oaXRlci5uZXh0KCkpOwotICAgICAgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIFVwZGF0ZUFjdGlvbikKLSAgICAgICAgKChVcGRhdGVBY3Rpb24pIGFjdGlvbikudXBkYXRlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cnVjdHVyZWRUZXh0RWRpdG9yIGdldFRleHRFZGl0b3IoKQotICB7Ci0gICAgcmV0dXJuIHN0cnVjdHVyZWRUZXh0RWRpdG9yOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVHcmFwaFBhZ2VDb21wb3NpdGUoKQotICB7Ci0gICAgQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoZ2V0Q29udGFpbmVyKCksIFNXVC5OT05FKTsgICAgCi0gICAgcGFyZW50LnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLSAgICByZXR1cm4gcGFyZW50OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHcmFwaFBhZ2UoKQotICB7Ci0gICAgQ29tcG9zaXRlIHBhcmVudCA9IGNyZWF0ZUdyYXBoUGFnZUNvbXBvc2l0ZSgpOwotICAgIAotICAgIGdyYXBoaWNhbFZpZXdlciA9IGdldEdyYXBoaWNhbFZpZXdlcigpOwotICAgIGdyYXBoaWNhbFZpZXdlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gICAgICAgIAotICAgIGdldEVkaXREb21haW4oKS5hZGRWaWV3ZXIoZ3JhcGhpY2FsVmlld2VyKTsKLSAgICAKLSAgICBjb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKTsKLSAgICBob29rR3JhcGhpY2FsVmlld2VyKCk7ICAgIAotICAgIGludCBpbmRleCA9IGFkZFBhZ2UocGFyZW50KTsKLSAgICBzZXRQYWdlVGV4dChpbmRleCwgTWVzc2FnZXMuX1VJX0xBQkVMX0RFU0lHTik7Ci0gIH0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I2NyZWF0ZVNpdGUob3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQpCi0JICovCi0JcHJvdGVjdGVkIElFZGl0b3JTaXRlIGNyZWF0ZVNpdGUoSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCUlFZGl0b3JTaXRlIHNpdGUgPSBudWxsOwotCQlpZiAoZWRpdG9yID09IHN0cnVjdHVyZWRUZXh0RWRpdG9yKSB7Ci0JCQlzaXRlID0gbmV3IE11bHRpUGFnZUVkaXRvclNpdGUodGhpcywgZWRpdG9yKSB7Ci0JCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQkJLy8gc2V0cyB0aGlzIGlkIHNvIG5lc3RlZCBlZGl0b3IgaXMgY29uc2lkZXJlZCB4bWwgc291cmNlCi0JCQkJCS8vIHBhZ2UKLQkJCQkJcmV0dXJuIENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwgKyAiLnNvdXJjZSI7IC8vJE5PTi1OTFMtMSQ7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQllbHNlIHsKLQkJCXNpdGUgPSBzdXBlci5jcmVhdGVTaXRlKGVkaXRvcik7Ci0JCX0KLQkJcmV0dXJuIHNpdGU7Ci0JfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlU291cmNlUGFnZSgpCi0gIHsKLSAgICBzdHJ1Y3R1cmVkVGV4dEVkaXRvciA9IG5ldyBTdHJ1Y3R1cmVkVGV4dEVkaXRvcigpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IGFkZFBhZ2Uoc3RydWN0dXJlZFRleHRFZGl0b3IsIGdldEVkaXRvcklucHV0KCkpOwotICAgICAgc2V0UGFnZVRleHQoaW5kZXgsIE1lc3NhZ2VzLl9VSV9MQUJFTF9TT1VSQ0UpOwotICAgICAgc3RydWN0dXJlZFRleHRFZGl0b3IudXBkYXRlKCk7Ci0gICAgICBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5zZXRFZGl0b3JQYXJ0KHRoaXMpOwotICAgICAgc3RydWN0dXJlZFRleHRFZGl0b3IuYWRkUHJvcGVydHlMaXN0ZW5lcih0aGlzKTsKLSAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX1RJVExFKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNpdGUoKS5nZXRTaGVsbCgpLCAiRXJyb3IgY3JlYXRpbmcgbmVzdGVkIHRleHQgZWRpdG9yIiwgbnVsbCwgZS5nZXRTdGF0dXMoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpCi0gIHsKLSAgICBncmFwaGljYWxWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEJhY2tncm91bmQoQ29sb3JDb25zdGFudHMubGlzdEJhY2tncm91bmQpOwotCi0gICAgLy8gU2V0IHRoZSByb290IGVkaXQgcGFydAotICAgIC8vIFNjYWxhYmxlRnJlZWZvcm1Sb290RWRpdFBhcnQgcm9vdCA9IG5ldyBTY2FsYWJsZUZyZWVmb3JtUm9vdEVkaXRQYXJ0KCk7Ci0gICAgUm9vdEVkaXRQYXJ0IHJvb3QgPSBuZXcgUm9vdEVkaXRQYXJ0KCk7Ci0gICAgWm9vbU1hbmFnZXIgem9vbU1hbmFnZXIgPSByb290LmdldFpvb21NYW5hZ2VyKCk7Ci0gICAgCi0gICAgTGlzdCB6b29tTGV2ZWxDb250cmlidXRpb25zID0gbmV3IEFycmF5TGlzdCgzKTsKLSAgICB6b29tTGV2ZWxDb250cmlidXRpb25zLmFkZChab29tTWFuYWdlci5GSVRfQUxMKTsKLSAgICB6b29tTGV2ZWxDb250cmlidXRpb25zLmFkZChab29tTWFuYWdlci5GSVRfV0lEVEgpOwotICAgIHpvb21MZXZlbENvbnRyaWJ1dGlvbnMuYWRkKFpvb21NYW5hZ2VyLkZJVF9IRUlHSFQpOwotICAgIHpvb21NYW5hZ2VyLnNldFpvb21MZXZlbENvbnRyaWJ1dGlvbnMoem9vbUxldmVsQ29udHJpYnV0aW9ucyk7Ci0KLSAgICBkb3VibGVbXSB6b29tTGV2ZWxzID0gey4xMCwgLjI1LCAuNSwgLjc1LCAxLjAsIDEuMjUsIDEuNSwgMi4wLCAyLjUsIDMsIDQsIDV9OwotICAgIHpvb21NYW5hZ2VyLnNldFpvb21MZXZlbHMoem9vbUxldmVscyk7Ci0KLSAgICBJQWN0aW9uIHpvb21JbiA9IG5ldyBab29tSW5BY3Rpb24oem9vbU1hbmFnZXIpOwotICAgIElBY3Rpb24gem9vbU91dCA9IG5ldyBab29tT3V0QWN0aW9uKHpvb21NYW5hZ2VyKTsKLSAgICBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHpvb21Jbik7Ci0gICAgZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbih6b29tT3V0KTsKLQotICAgIGdldFNpdGUoKS5nZXRLZXlCaW5kaW5nU2VydmljZSgpLnJlZ2lzdGVyQWN0aW9uKHpvb21Jbik7Ci0gICAgZ2V0U2l0ZSgpLmdldEtleUJpbmRpbmdTZXJ2aWNlKCkucmVnaXN0ZXJBY3Rpb24oem9vbU91dCk7Ci0KLSAgICAvL0Nvbm5lY3Rpb25MYXllciBjb25uZWN0aW9uTGF5ZXIgPSAoQ29ubmVjdGlvbkxheWVyKSByb290LmdldExheWVyKExheWVyQ29uc3RhbnRzLkNPTk5FQ1RJT05fTEFZRVIpOwotICAgIC8vY29ubmVjdGlvbkxheWVyLnNldENvbm5lY3Rpb25Sb3V0ZXIobmV3IEJlbmRwb2ludENvbm5lY3Rpb25Sb3V0ZXIoKSk7Ci0KLSAgICAvL2Nvbm5lY3Rpb25MYXllci5zZXRDb25uZWN0aW9uUm91dGVyKG5ldyBTaG9ydGVzdFBhdGhDb25uZWN0aW9uUm91dGVyKGNvbm5lY3Rpb25MYXllcikpOwotICAgIC8vIGNvbm5lY3Rpb25MYXllci5zZXRWaXNpYmxlKGZhbHNlKTsKLQotICAgIC8vIFpvb20KLSAgICB6b29tTWFuYWdlci5zZXRab29tKDEuMCk7Ci0gICAgLy8gU2Nyb2xsLXdoZWVsIFpvb20KLSAgICBncmFwaGljYWxWaWV3ZXIuc2V0UHJvcGVydHkoTW91c2VXaGVlbEhhbmRsZXIuS2V5R2VuZXJhdG9yLmdldEtleShTV1QuQ1RSTCksIE1vdXNlV2hlZWxab29tSGFuZGxlci5TSU5HTEVUT04pOwotICAgIGdyYXBoaWNhbFZpZXdlci5zZXRSb290RWRpdFBhcnQocm9vdCk7Ci0gICAgZ3JhcGhpY2FsVmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShnZXRFZGl0UGFydEZhY3RvcnkoKSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGhvb2tHcmFwaGljYWxWaWV3ZXIoKQotICB7Ci0gICAgZ2V0U2VsZWN0aW9uU3luY2hyb25pemVyKCkuYWRkVmlld2VyKGdyYXBoaWNhbFZpZXdlcik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIgZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0gIHByb3RlY3RlZCBhYnN0cmFjdCBFZGl0UGFydEZhY3RvcnkgZ2V0RWRpdFBhcnRGYWN0b3J5KCk7Ci0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVHcmFwaGljYWxWaWV3ZXIoKTsKLQotICBwcm90ZWN0ZWQgRWRpdG9yTW9kZU1hbmFnZXIgZ2V0RWRpdG9yTW9kZU1hbmFnZXIoKQotICB7Ci0gICAgaWYgKGVkaXRvck1vZGVNYW5hZ2VyID09IG51bGwpCi0gICAgewotICAgICAgZWRpdG9yTW9kZU1hbmFnZXIgPSBjcmVhdGVFZGl0b3JNb2RlTWFuYWdlcigpOwotICAgICAgZWRpdG9yTW9kZU1hbmFnZXIuYWRkTGlzdGVuZXIodGhpcyk7Ci0gICAgICBlZGl0b3JNb2RlTWFuYWdlci5pbml0KCk7Ci0gICAgfSAgCi0gICAgcmV0dXJuIGVkaXRvck1vZGVNYW5hZ2VyOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYWJzdHJhY3QgRWRpdG9yTW9kZU1hbmFnZXIgY3JlYXRlRWRpdG9yTW9kZU1hbmFnZXIoKTsKLSAgCi0gIAotICBwcml2YXRlIFN0cmluZyBnZXRFZGl0TW9kZU5hbWUoRWRpdG9yTW9kZSBlZGl0b3JNb2RlLCBQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gZWRpdG9yTW9kZS5nZXREaXNwbGF5TmFtZSgpOwotICAgIGlmIChwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGN1c3RvbWl6ZWROYW1lID0gcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5nZXRFZGl0b3JNb2RlRGlzcGxheU5hbWUoZWRpdG9yTW9kZS5nZXRJZCgpKTsKLSAgICAgIGlmIChjdXN0b21pemVkTmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBjdXN0b21pemVkTmFtZTsKLSAgICAgIH0gIAotICAgIH0gCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgY2xhc3MgRWRpdG9yTW9kZUFuZEN1c3RvbWl6ZWROYW1lCi0gIHsKLSAgICBFZGl0b3JNb2RlIG1vZGU7Ci0gICAgU3RyaW5nIG5hbWU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVZpZXdNb2RlVG9vbGJhcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgRWRpdG9yTW9kZU1hbmFnZXIgbWFuYWdlciA9IChFZGl0b3JNb2RlTWFuYWdlcilnZXRBZGFwdGVyKEVkaXRvck1vZGVNYW5hZ2VyLmNsYXNzKTsKLSAgICBmaW5hbCBQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgPSAoUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcilnZXRBZGFwdGVyKFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuY2xhc3MpOwotICAgIEVkaXRvck1vZGUgW10gbW9kZUxpc3QgPSBtYW5hZ2VyLmdldE1vZGVzKCk7Ci0gICAgCi0gICAgaW50IG1vZGVMaXN0TGVuZ3RoID0gbW9kZUxpc3QubGVuZ3RoOwotICAgIGJvb2xlYW4gc2hvd1Rvb2xCYXIgPSBtb2RlTGlzdExlbmd0aCA+IDE7Ci0gICAKLSAgICBpZiAoc2hvd1Rvb2xCYXIpCi0gICAgewotICAgICAgdG9vbGJhciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuRkxBVCB8IFNXVC5EUkFXX1RSQU5TUEFSRU5UKTsKLSAgICAgIHRvb2xiYXIuc2V0QmFja2dyb3VuZChDb2xvckNvbnN0YW50cy5saXN0QmFja2dyb3VuZCk7Ci0gICAgICB0b29sYmFyLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkKLSAgICAgICAgewotICAgICAgICAgIFJlY3RhbmdsZSBjbGllbnRBcmVhID0gdG9vbGJhci5nZXRDbGllbnRBcmVhKCk7IAotICAgICAgICAgIGUuZ2Muc2V0Rm9yZWdyb3VuZChDb2xvckNvbnN0YW50cy5saWdodEdyYXkpOwotICAgICAgICAgIGUuZ2MuZHJhd1JlY3RhbmdsZShjbGllbnRBcmVhLngsIGNsaWVudEFyZWEueSwgY2xpZW50QXJlYS53aWR0aCAtIDEsIGNsaWVudEFyZWEuaGVpZ2h0IC0gMSk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgICAgCi0gICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0gICAgICB0b29sYmFyLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwodG9vbGJhciwgU1dULkZMQVQgfCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgICBsYWJlbC5zZXRCYWNrZ3JvdW5kKENvbG9yQ29uc3RhbnRzLmxpc3RCYWNrZ3JvdW5kKTsKLSAgICAgIGxhYmVsLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX1ZJRVcpOwotICAgICAgbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKSk7Ci0KLSAgICAgIG1vZGVDb21ibyA9IG5ldyBGbGF0Q0NvbWJvKHRvb2xiYXIsIFNXVC5GTEFUKTsKLSAgICAgIG1vZGVDb21iby5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgICBtb2RlQ29tYm8uc2V0VGV4dChnZXRFZGl0TW9kZU5hbWUobWFuYWdlci5nZXRDdXJyZW50TW9kZSgpLCBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKSk7IAotICAgICAgR0MgZ2MgPSBuZXcgR0MobW9kZUNvbWJvKTsKLSAgICAgIGludCB0ZXh0V2lkdGggPSAwOwotICAgICAgbWF4TGVuZ3RoID0gMDsKLSAgICAgIAotICAgICAgLy8gcG9wdWxhdGUgY29tYm8gd2l0aCBtb2RlcwotICAgICAgZWRpdG9yTW9kZUFuZEN1c3RvbWl6ZWROYW1lcyA9IG5ldyBFZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWVbbW9kZUxpc3RMZW5ndGhdOyAgICAgIAotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RlTGlzdExlbmd0aDsgaSsrKQotICAgICAgeyAgCi0gICAgICAgIEVkaXRvck1vZGVBbmRDdXN0b21pemVkTmFtZSBlbnRyeSA9IG5ldyBFZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWUoKTsKLSAgICAgICAgZWRpdG9yTW9kZUFuZEN1c3RvbWl6ZWROYW1lc1tpXSA9IGVudHJ5OwotICAgICAgICBlbnRyeS5uYW1lID0gZ2V0RWRpdE1vZGVOYW1lKG1vZGVMaXN0W2ldLCBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKTsKLSAgICAgICAgZW50cnkubW9kZSA9IG1vZGVMaXN0W2ldOwotICAgICAgfSAgICAgICAgCi0gICAgICBBcnJheXMuc29ydChlZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWVzLCBuZXcgQ29tcGFyYXRvcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpCi0gICAgICAgIHsKLSAgICAgICAgICBFZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWUgYSA9IChFZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWUpYXJnMDsKLSAgICAgICAgICBFZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWUgYiA9IChFZGl0b3JNb2RlQW5kQ3VzdG9taXplZE5hbWUpYXJnMTsgICAgICAgIAotICAgICAgICAgIHJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoYS5uYW1lLCBiLm5hbWUpOwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yTW9kZUFuZEN1c3RvbWl6ZWROYW1lcy5sZW5ndGg7IGkrKyApCi0gICAgICB7Ci0gICAgICAgIEVkaXRvck1vZGVBbmRDdXN0b21pemVkTmFtZSBlbnRyeSA9IGVkaXRvck1vZGVBbmRDdXN0b21pemVkTmFtZXNbaV07Ci0gICAgICAgIG1vZGVDb21iby5hZGQoZW50cnkubmFtZSk7Ci0gICAgICAgIG1heExlbmd0aCA9IE1hdGgubWF4IChnYy5zdHJpbmdFeHRlbnQoZW50cnkubmFtZSkueCwgbWF4TGVuZ3RoKTsKLSAgICAgICAgaW50IGFwcHJveFdpZHRoT2ZTdHJpbmdzID0gTWF0aC5tYXggKGdjLnN0cmluZ0V4dGVudChlbnRyeS5uYW1lKS54LCB0ZXh0V2lkdGgpOwotICAgICAgICBpZiAoYXBwcm94V2lkdGhPZlN0cmluZ3MgPiBtYXhMZW5ndGgpCi0gICAgICAgICAgbWF4TGVuZ3RoID0gYXBwcm94V2lkdGhPZlN0cmluZ3M7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIG1heExlbmd0aCArPSBnYy5zdHJpbmdFeHRlbnQoTWVzc2FnZXMuX1VJX0xBQkVMX1ZJRVcpLng7IAotICAgICAgZ2MuZGlzcG9zZSgpOwotICAgICAgCi0gICAgICBtb2RlQ29tYm9MaXN0ZW5lciA9IG5ldyBNb2RlQ29tYm9MaXN0ZW5lcigpOwotICAgICAgbW9kZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG1vZGVDb21ib0xpc3RlbmVyKTsKLSAgICAgIG1vZGVDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9FTkQpKTsKLSAgICAgIG1vZGVDb21iby5zZXRCYWNrZ3JvdW5kKHRvb2xiYXIuZ2V0QmFja2dyb3VuZCgpKTsKLQotICAgICAgSW1hZ2VIeXBlcmxpbmsgaHlwZXJsaW5rID0gbmV3IEltYWdlSHlwZXJsaW5rKHRvb2xiYXIsIFNXVC5GTEFUKTsKLSAgICAgIGh5cGVybGluay5zZXRCYWNrZ3JvdW5kKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLSAgICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ0NTcKLSAgICAgIEltYWdlIGltYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJY29uSW1hZ2UoImV0b29sMTYvaGVscF9jb250ZW50cyIpOwotICAgICAgaHlwZXJsaW5rLnNldEltYWdlKGltYWdlKTsKLSAgICAgIGh5cGVybGluay5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5fVUlfSE9WRVJfVklFV19NT0RFX0RFU0NSSVBUSU9OKTsKLSAgICAgIGh5cGVybGluay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpKTsKLSAgICAgIGh5cGVybGluay5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmhhbmRsZUFjdGlvbigic2hvd0VkaXRvck1vZGVIZWxwIik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9KTsgICAgICAKLSAgICB9Ci0gIH0KLSAgCi0gIAotICBwcm90ZWN0ZWQgY2xhc3MgTW9kZUNvbWJvTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIE1vZGVDb21ib0xpc3RlbmVyKCkKLSAgICB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIGlmIChlLndpZGdldCA9PSBtb2RlQ29tYm8pCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgRWRpdG9yTW9kZU1hbmFnZXIgbWFuYWdlciA9IChFZGl0b3JNb2RlTWFuYWdlcilnZXRBZGFwdGVyKEVkaXRvck1vZGVNYW5hZ2VyLmNsYXNzKTsKLSAgICAgICAgRWRpdG9yTW9kZSBbXSBtb2RlTGlzdCA9IG1hbmFnZXIuZ2V0TW9kZXMoKTsKLSAgICAgICAgaWYgKG1vZGVMaXN0Lmxlbmd0aCA+PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgRWRpdG9yTW9kZUFuZEN1c3RvbWl6ZWROYW1lIGVudHJ5ID0gZWRpdG9yTW9kZUFuZEN1c3RvbWl6ZWROYW1lc1ttb2RlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKV07Ci0gICAgICAgICAgaWYgKG1hbmFnZXIuZ2V0Q3VycmVudE1vZGUoKSAhPSBlbnRyeS5tb2RlKQotICAgICAgICAgIHsgIAotICAgICAgICAgICAgbWFuYWdlci5zZXRDdXJyZW50TW9kZShlbnRyeS5tb2RlKTsKLSAgICAgICAgICAgIHN0b3JlQ3VycmVudE1vZGVQcmVmZXJlbmNlKGVudHJ5Lm1vZGUuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgPSAoUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcikgZ2V0QWRhcHRlcihQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuaGFuZGxlQWN0aW9uKCJlZGl0b3JNb2RlQ2hhbmdlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzdG9yZUN1cnJlbnRNb2RlUHJlZmVyZW5jZShTdHJpbmcgaWQpCi0gIHsKLSAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBhcyBkZWZhdWx0LiAgQWxsb3cgZXh0ZW5kZXJzIHRvIGltcGxlbWVudC4KLSAgfQotICAKLSAgCi0gIHByb3RlY3RlZCBjbGFzcyBDb21tb25BY3RpdmF0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJUGFydExpc3RlbmVyLCBJV2luZG93TGlzdGVuZXIKLSAgewotCi0gICAgLyoqIENhY2hlIG9mIHRoZSBhY3RpdmUgd29ya2JlbmNoIHBhcnQuICovCi0gICAgcHJpdmF0ZSBJV29ya2JlbmNoUGFydCBmQWN0aXZlUGFydDsKLSAgICAvKiogSW5kaWNhdGVzIHdoZXRoZXIgYWN0aXZhdGlvbiBoYW5kbGluZyBpcyBjdXJyZW50bHkgYmUgZG9uZS4gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gZmFsc2U7Ci0gICAgLyoqCi0gICAgICogVGhlIHBhcnQgc2VydmljZS4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHJpdmF0ZSBJUGFydFNlcnZpY2UgZlBhcnRTZXJ2aWNlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGlzIGFjdGl2YXRpb24gbGlzdGVuZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcnRTZXJ2aWNlCi0gICAgICogICAgICAgICAgdGhlIHBhcnQgc2VydmljZSBvbiB3aGljaCB0byBhZGQgdGhlIHBhcnQgbGlzdGVuZXIKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIENvbW1vbkFjdGl2YXRpb25MaXN0ZW5lcihJUGFydFNlcnZpY2UgcGFydFNlcnZpY2UpCi0gICAgewotICAgICAgZlBhcnRTZXJ2aWNlID0gcGFydFNlcnZpY2U7Ci0gICAgICBmUGFydFNlcnZpY2UuYWRkUGFydExpc3RlbmVyKHRoaXMpOwotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwb3NlcyB0aGlzIGFjdGl2YXRpb24gbGlzdGVuZXIuCi0gICAgICogCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICAgIGZQYXJ0U2VydmljZS5yZW1vdmVQYXJ0TGlzdGVuZXIodGhpcyk7Ci0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLnJlbW92ZVdpbmRvd0xpc3RlbmVyKHRoaXMpOwotICAgICAgZlBhcnRTZXJ2aWNlID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0QWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgICB7Ci0gICAgICBmQWN0aXZlUGFydCA9IHBhcnQ7Ci0gICAgICBoYW5kbGVBY3RpdmF0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydEJyb3VnaHRUb1RvcChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gICAgewotICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRDbG9zZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KQotICAgIHsKLSAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0RGVhY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gICAgewotICAgICAgZkFjdGl2ZVBhcnQgPSBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRPcGVuZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KQotICAgIHsKLSAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIHRoZSBhY3RpdmF0aW9uIHRyaWdnZXJpbmcgYSBlbGVtZW50IHN0YXRlIGNoZWNrIGluIHRoZSBlZGl0b3IuCi0gICAgICovCi0gICAgdm9pZCBoYW5kbGVBY3RpdmF0aW9uKCkKLSAgICB7Ci0gICAgICBpZiAoZklzSGFuZGxpbmdBY3RpdmF0aW9uIHx8IChnZXRUZXh0RWRpdG9yKCkgPT0gbnVsbCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKGZBY3RpdmVQYXJ0ID09IENvbW1vbk11bHRpUGFnZUVkaXRvci50aGlzKQotICAgICAgewotICAgICAgICBmSXNIYW5kbGluZ0FjdGl2YXRpb24gPSB0cnVlOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGdldFRleHRFZGl0b3IoKS5zYWZlbHlTYW5pdHlDaGVja1N0YXRlKGdldEVkaXRvcklucHV0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGZJc0hhbmRsaW5nQWN0aXZhdGlvbiA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lciN3aW5kb3dBY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2luZG93QWN0aXZhdGVkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KQotICAgIHsKLSAgICAgIGlmICh3aW5kb3cgPT0gZ2V0RWRpdG9yU2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpKQotICAgICAgewotICAgICAgICAvKgotICAgICAgICAgKiBXb3JrYXJvdW5kIGZvciBwcm9ibGVtIGRlc2NyaWJlZCBpbgotICAgICAgICAgKiBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNzMxIFdpbGwgYmUgcmVtb3ZlZAotICAgICAgICAgKiB3aGVuIFNXVCBoYXMgc29sdmVkIHRoZSBwcm9ibGVtLgotICAgICAgICAgKi8KLSAgICAgICAgd2luZG93LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKQotICAgICAgICB7Ci0gICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBoYW5kbGVBY3RpdmF0aW9uKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyI3dpbmRvd0RlYWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdpbmRvd0RlYWN0aXZhdGVkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KQotICAgIHsKLSAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyI3dpbmRvd0Nsb3NlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3aW5kb3dDbG9zZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpCi0gICAgewotICAgICAgLy8gZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93T3BlbmVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdpbmRvd09wZW5lZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykKLSAgICB7Ci0gICAgICAvLyBkbyBub3RoaW5nCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1NvdXJjZVBhZ2VBY3RpdmUoKQotICB7Ci0gICAgcmV0dXJuIGdldEFjdGl2ZVBhZ2UoKSA9PSBTT1VSQ0VfUEFHRV9JTkRFWDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0NvbW1vblNlbGVjdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9Db21tb25TZWxlY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZWFkNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0NvbW1vblNlbGVjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgQ29tbW9uU2VsZWN0aW9uTWFuYWdlciBleHRlbmRzIE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyIGltcGxlbWVudHMgSVNlbGVjdGlvblByb3ZpZGVyLCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi17Ci0KLSAgcHVibGljIENvbW1vblNlbGVjdGlvbk1hbmFnZXIoTXVsdGlQYWdlRWRpdG9yUGFydCBtdWx0aVBhZ2VFZGl0b3IpCi0gIHsKLSAgICBzdXBlcihtdWx0aVBhZ2VFZGl0b3IpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2FkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2dldFNlbGVjdGlvbigpCi0gICAqLwotICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIGN1cnJlbnRTZWxlY3Rpb247Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjc2V0U2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRoaXMpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoZW5hYmxlTm90aWZ5KQotICAgIHsKLSAgICAgIHNldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSwgZXZlbnQuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSk7Ci0gICAgfQotICB9Ci0KLSAgCi0gIHByb3RlY3RlZCBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJvdGVjdGVkIElTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbjsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlTm90aWZ5ID0gdHJ1ZTsKLQotICBwdWJsaWMgYm9vbGVhbiBnZXRFbmFibGVOb3RpZnkoKQotICB7Ci0gICAgcmV0dXJuIGVuYWJsZU5vdGlmeTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBJU2VsZWN0aW9uUHJvdmlkZXIgc291cmNlKQotICB7ICAKLSAgICBpZiAoZW5hYmxlTm90aWZ5KQotICAgIHsKLSAgICAgIGN1cnJlbnRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gICAgICBlbmFibGVOb3RpZnkgPSBmYWxzZTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHNvdXJjZSwgc2VsZWN0aW9uKTsKLSAgICAgICAgTGlzdCBjb3B5T2ZMaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KGxpc3RlbmVyTGlzdCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvcHlPZkxpc3RlbmVyTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKWkubmV4dCgpOwotICAgICAgICAgIGxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIGVuYWJsZU5vdGlmeSA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQ29udGV4dE1lbnVQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0NvbnRleHRNZW51UGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlkNDI0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvQ29udGV4dE1lbnVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQ29udGV4dE1lbnVQYXJ0aWNpcGFudAoteyAgCi0gIHB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgYWN0aW9uSWQpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgY29udHJpYnV0ZUFjdGlvbnMoT2JqZWN0IG9iamVjdCwgSU1lbnVNYW5hZ2VyIG1lbnUpCi0gIHsgICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9FZGl0b3JNb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvRWRpdG9yTW9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmVmODQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9FZGl0b3JNb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWRpdG9yTW9kZSBpbXBsZW1lbnRzIElBZGFwdGFibGUKLXsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRJZCgpOwotICAKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREaXNwbGF5TmFtZSgpOwotICAKLSAgcHVibGljIGFic3RyYWN0IEVkaXRQYXJ0RmFjdG9yeSBnZXRFZGl0UGFydEZhY3RvcnkoKTsKLSAgCi0gIC8vIFRPRE8gKGNzKSB0aGlzIHNob3VsZCByZXR1cm4gSVRyZWVDb250ZW50UHJvdmlkZXIKLSAgcHVibGljIGFic3RyYWN0IElDb250ZW50UHJvdmlkZXIgZ2V0T3V0bGluZVByb3ZpZGVyKCk7Ci0gIAotICBwdWJsaWMgQ29udGV4dE1lbnVQYXJ0aWNpcGFudCBnZXRDb250ZXh0TWVudVBhcnRpY2lwYW50KCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvRWRpdG9yTW9kZU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9FZGl0b3JNb2RlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmJlZjY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9FZGl0b3JNb2RlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLXB1YmxpYyBjbGFzcyBFZGl0b3JNb2RlTWFuYWdlciBpbXBsZW1lbnRzIElBZGFwdGFibGUKLXsKLSAgcHJpdmF0ZSBMaXN0IG1vZGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICBwcml2YXRlIEVkaXRvck1vZGUgY3VycmVudE1vZGUgPSBudWxsOwotICBwcml2YXRlIExpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICBwcml2YXRlIFN0cmluZyBleHRlbnNpb25Qb2ludElkOwotICBwcml2YXRlIFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcjsKLSAgCi0gIHB1YmxpYyBFZGl0b3JNb2RlTWFuYWdlcihTdHJpbmcgZXh0ZW5zaW9uUG9pbnRJZCkKLSAgewotICAgIHRoaXMuZXh0ZW5zaW9uUG9pbnRJZCA9IGV4dGVuc2lvblBvaW50SWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGluaXQoKQotICB7IAotICAgIHJlYWRSZWdpc3RyeShleHRlbnNpb25Qb2ludElkKTsgICAgCi0gICAgY3VycmVudE1vZGUgPSBnZXREZWZhdWx0TW9kZSgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgRWRpdG9yTW9kZSBnZXREZWZhdWx0TW9kZSgpCi0gIHsKLSAgICByZXR1cm4gKEVkaXRvck1vZGUpbW9kZUxpc3QuZ2V0KDApOyAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgYWRkTW9kZShFZGl0b3JNb2RlIG1vZGUpCi0gIHsKLSAgICBtb2RlTGlzdC5hZGQobW9kZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFZGl0b3JNb2RlIGdldEVkaXRvck1vZGUoU3RyaW5nIGVkaXRvck1vZGVJZCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IG1vZGVMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgRWRpdG9yTW9kZSBlZGl0b3JNb2RlID0gKEVkaXRvck1vZGUpaS5uZXh0KCk7Ci0gICAgICBpZiAoZWRpdG9yTW9kZUlkLmVxdWFscyhlZGl0b3JNb2RlLmdldElkKCkpKQotICAgICAgewotICAgICAgICByZXR1cm4gZWRpdG9yTW9kZTsKLSAgICAgIH0gIAotICAgIH0gIAotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50TW9kZShFZGl0b3JNb2RlIG1vZGUpCi0gIHsKLSAgICBpZiAobW9kZUxpc3QuY29udGFpbnMobW9kZSkpCi0gICAgewotICAgICAgY3VycmVudE1vZGUgPSBtb2RlOwotICAgICAgTGlzdCBjbG9uZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgY2xvbmVkTGlzdC5hZGRBbGwobGlzdGVuZXJzKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNsb25lZExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgSUVkaXRvck1vZGVMaXN0ZW5lciBsaXN0ZW5lciA9IChJRWRpdG9yTW9kZUxpc3RlbmVyKWkubmV4dCgpOwotICAgICAgICBsaXN0ZW5lci5lZGl0b3JNb2RlQ2hhbmdlZChtb2RlKTsKLSAgICAgIH0gIAotICAgIH0gIAotICB9Ci0gIAotICBwdWJsaWMgRWRpdG9yTW9kZSBnZXRDdXJyZW50TW9kZSgpCi0gIHsKLSAgICByZXR1cm4gY3VycmVudE1vZGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFZGl0b3JNb2RlW10gZ2V0TW9kZXMoKQotICB7Ci0gICAgRWRpdG9yTW9kZVtdIG1vZGVzID0gbmV3IEVkaXRvck1vZGVbbW9kZUxpc3Quc2l6ZSgpXTsKLSAgICBtb2RlTGlzdC50b0FycmF5KG1vZGVzKTsKLSAgICByZXR1cm4gbW9kZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElFZGl0b3JNb2RlTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBpZiAoIWxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpCi0gICAgeyAgCi0gICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgICB9ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUVkaXRvck1vZGVMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOyAgCi0gIH0gIAotICAKLSAgcHJpdmF0ZSB2b2lkIHJlYWRSZWdpc3RyeShTdHJpbmcgaWQpCi0gIHsgICAgCi0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihpZCk7ICAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0gICAgICBTdHJpbmcgZWRpdG9yTW9kZUlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChlZGl0b3JNb2RlSWQgIT0gbnVsbCAmJiAKLSAgICAgICAgICBwcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyICE9IG51bGwgJiYKLSAgICAgICAgICAhcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5pc0VkaXRvck1vZGVBcHBsaWNhYmxlKGVkaXRvck1vZGVJZCkpCi0gICAgICB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfSAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgRWRpdG9yTW9kZSBtb2RlID0gKEVkaXRvck1vZGUpZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotICAgICAgICBtb2RlTGlzdC5hZGQobW9kZSk7ICAgICAgICAKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgfSAgCi0gIAotICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0Q3VzdG9taXphdGlvblByb3ZpZGVyKFByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIgcHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcikKLSAgewotICAgIHRoaXMucHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlciA9IHByb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9JQURURWRpdG9ySW5wdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9JQURURWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2NGQ2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvSUFEVEVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUFEVEVkaXRvcklucHV0IGV4dGVuZHMgSUVkaXRvcklucHV0Ci17Ci0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0U2NoZW1hKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvSUVkaXRvck1vZGVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL0lFZGl0b3JNb2RlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U5OGJkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvSUVkaXRvck1vZGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUVkaXRvck1vZGVMaXN0ZW5lcgotewotICB2b2lkIGVkaXRvck1vZGVDaGFuZ2VkKEVkaXRvck1vZGUgbmV3RWRpdG9yTW9kZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjQ5ZDMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUwotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0gIHByaXZhdGUgTWVzc2FnZXMoKQotICB7Ci0gIH0KLQotICBzdGF0aWMKLSAgewotICAgIC8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0gICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotICB9Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fU0hPV19QUk9QRVJUSUVTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1NFVF9BU19GT0NVUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9ERUxFVEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0ZJRUxEOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0JST1dTRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9ORVc7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fVVBEQVRFX05BTUU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fVVBEQVRFX1RZUEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fVVBEQVRFX0VMRU1FTlRfUkVGRVJFTkNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfREVTSUdOOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU09VUkNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfVklFVzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0hPVkVSX1ZJRVdfTU9ERV9ERVNDUklQVElPTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9PVkVSV1JJVEVfQ09ORklSTUFUSU9OX1FVRVNUSU9OOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX09WRVJXUklURV9DT05GSVJNQVRJT047Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fRVJST1JfVElUTEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fRVJST1JfREVTQ1JJUFRJT047Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fRk9STUFUX05PVF9TVVBQT1JURUQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DQVBUVVJFX1NDUkVFTl9BQ1RJT05fVEVYVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NBUFRVUkVfU0NSRUVOX0FDVElPTl9UT09MVElQVEVYVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9ERUZBVUxUX0ZJTEVfTkFNRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9GSUxFX1NBVkVfRElBTE9HX1RJVExFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSE9WRVJfQkFDS19UT19TQ0hFTUE7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL1Byb2R1Y3RDdXN0b21pemF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVjZTA2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9lZGl0b3IvUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLk5hdmlnYXRpb25Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uZWRpdHBhcnRzLkJhc2VFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lLkV4dGVuc2libGVDb250ZW50T3V0bGluZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvZHVjdEN1c3RvbWl6YXRpb25Qcm92aWRlcgotewotICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0VkaXRvck1vZGVBcHBsaWNhYmxlKFN0cmluZyBpZCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RWRpdG9yTW9kZURpc3BsYXlOYW1lKFN0cmluZyBpZCk7Ci0gCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdFN0cmluZyhTdHJpbmcgaWQpCi0gIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdFN0cmluZyhTdHJpbmcgaWQsIE9iamVjdFtdIGFyZ3MpCi0gIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUFjdGlvbihTdHJpbmcgYWN0aW9uSWQpCi0gIHsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBOYXZpZ2F0aW9uTG9jYXRpb24gZ2V0TmF2aWdhdGlvbkxvY2F0aW9uKElFZGl0b3JQYXJ0IHBhcnQsIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCwgQmFzZUVkaXRQYXJ0IGVkaXRQYXJ0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFeHRlbnNpYmxlQ29udGVudE91dGxpbmVQYWdlIGdldFByb2R1Y3RDb250ZW50T3V0bGluZVBhZ2UoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2VkaXRvci9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMGVjMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZWRpdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1fVUlfQUNUSU9OX1NIT1dfUFJPUEVSVElFUz1TaG93IHByb3BlcnRpZXMKLV9VSV9BQ1RJT05fU0VUX0FTX0ZPQ1VTPVNldCBBcyBGb2N1cwotX1VJX0FDVElPTl9VUERBVEVfTkFNRT1VcGRhdGUgTmFtZQotX1VJX0FDVElPTl9VUERBVEVfVFlQRT1VcGRhdGUgdHlwZQotX1VJX0FDVElPTl9VUERBVEVfRUxFTUVOVF9SRUZFUkVOQ0U9VXBkYXRlIGVsZW1lbnQgcmVmZXJlbmNlCi1fVUlfQUNUSU9OX0RFTEVURT1EZWxldGUKLV9VSV9BQ1RJT05fQlJPV1NFPUJyb3dzZS4uLgotX1VJX0xBQkVMX0RFU0lHTj1EZXNpZ24KLV9VSV9MQUJFTF9TT1VSQ0U9U291cmNlCi1fVUlfQUNUSU9OX05FVz1OZXcuLi4KLV9VSV9BQ1RJT05fQUREX0ZJRUxEPUFkZCBGaWVsZAotX1VJX0xBQkVMX1ZJRVc9VmlldzoKLV9VSV9IT1ZFUl9WSUVXX01PREVfREVTQ1JJUFRJT049Q2hhbmdlIHRoZSB2aWV3IG1vZGUgb2YgdGhlIGVkaXRvcgotX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9PVkVSV1JJVEVfQ09ORklSTUFUSU9OX1FVRVNUSU9OPVF1ZXN0aW9uCi1fVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX09WRVJXUklURV9DT05GSVJNQVRJT049VGhlIGZpbGUgezB9IGFscmVhZHkgZXhpc3RzLiBEbyB5b3Ugd2FudCB0byByZXBsYWNlIHRoZSBleGlzdGluZyBmaWxlPwotX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9FUlJPUl9USVRMRT1FcnJvcgotX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9FUlJPUl9ERVNDUklQVElPTj1Db3VsZCBub3Qgc2F2ZSBlZGl0b3IgY29udGVudHMKLV9VSV9BQ1RJT05fQ0FQVFVSRV9TQ1JFRU5fRk9STUFUX05PVF9TVVBQT1JURUQ9Rm9ybWF0IG5vdCBzdXBwb3J0ZWQKLV9VSV9DQVBUVVJFX1NDUkVFTl9BQ1RJT05fVEVYVCA9ICZFeHBvcnQgRGlhZ3JhbSBhcyBJbWFnZS4uLgotX1VJX0NBUFRVUkVfU0NSRUVOX0FDVElPTl9UT09MVElQVEVYVCA9IEV4cG9ydCBEaWFncmFtIGFzIEltYWdlCi1fVUlfQUNUSU9OX0NBUFRVUkVfU0NSRUVOX0RFRkFVTFRfRklMRV9OQU1FID0gRGlhZ3JhbQotX1VJX0FDVElPTl9DQVBUVVJFX1NDUkVFTl9GSUxFX1NBVkVfRElBTE9HX1RJVExFPUV4cG9ydCBEaWFncmFtIGFzIEltYWdlCi1fVUlfSE9WRVJfQkFDS19UT19TQ0hFTUE9U2hvdyBzY2hlbWEgaW5kZXggdmlldwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lBRFRPYmplY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JQURUT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYTRhODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lBRFRPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUFEVE9iamVjdAotewotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoSUFEVE9iamVjdExpc3RlbmVyIGxpc3RlbmVyKTsKLSAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyTGlzdGVuZXIoSUFEVE9iamVjdExpc3RlbmVyIGxpc3RlbmVyKTsKLSAgICBib29sZWFuIGlzUmVhZE9ubHkoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JQURUT2JqZWN0TGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JQURUT2JqZWN0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjOGVmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSUFEVE9iamVjdExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElBRFRPYmplY3RMaXN0ZW5lcgotewotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KTsgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lDb21wbGV4VHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lDb21wbGV4VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODM4N2FjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JQ29tcGxleFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGU7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIElDb21wbGV4VHlwZSBleHRlbmRzIElUeXBlLCBJU3RydWN0dXJlCi17Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSUZpZWxkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSUZpZWxkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YTYyODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1wdWJsaWMgaW50ZXJmYWNlIElGaWVsZCBleHRlbmRzIElBRFRPYmplY3QKLXsKLSAgU3RyaW5nIGdldEtpbmQoKTsKLSAgU3RyaW5nIGdldE5hbWUoKTsKLSAgU3RyaW5nIGdldFR5cGVOYW1lKCk7Ci0gIFN0cmluZyBnZXRUeXBlTmFtZVF1YWxpZmllcigpOwotICBJTW9kZWwgZ2V0TW9kZWwoKTsKLSAgSVR5cGUgZ2V0VHlwZSgpOwotICBJQ29tcGxleFR5cGUgZ2V0Q29udGFpbmVyVHlwZSgpOwotICBpbnQgZ2V0TWluT2NjdXJzKCk7Ci0gIGludCBnZXRNYXhPY2N1cnMoKTsKLSAgYm9vbGVhbiBpc0dsb2JhbCgpOwotICBib29sZWFuIGlzUmVmZXJlbmNlKCk7Ci0gIAotICBDb21tYW5kIGdldFVwZGF0ZU1pbk9jY3Vyc0NvbW1hbmQoaW50IG1pbk9jY3Vycyk7Ci0gIENvbW1hbmQgZ2V0VXBkYXRlTWF4T2NjdXJzQ29tbWFuZChpbnQgbWF4T2NjdXJzKTsKLSAgQ29tbWFuZCBnZXRVcGRhdGVUeXBlTmFtZUNvbW1hbmQoU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgcXVhaWxpZmllcik7Ci0gIENvbW1hbmQgZ2V0VXBkYXRlTmFtZUNvbW1hbmQoU3RyaW5nIG5hbWUpOyAKLSAgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCk7ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU0MjQ1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsIGV4dGVuZHMgSUFEVE9iamVjdAotewotICBMaXN0IGdldFR5cGVzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSVN0cnVjdHVyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lTdHJ1Y3R1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMwZDE2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9mYWNhZGUvSVN0cnVjdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmZhY2FkZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmUgZXh0ZW5kcyBJQURUT2JqZWN0Ci17Ci0gIFN0cmluZyBnZXROYW1lKCk7Ci0gIExpc3QgZ2V0RmllbGRzKCk7Ci0gIElNb2RlbCBnZXRNb2RlbCgpOwotICBDb21tYW5kIGdldEFkZE5ld0ZpZWxkQ29tbWFuZChTdHJpbmcgZmllbGRLaW5kKTsKLSAgQ29tbWFuZCBnZXREZWxldGVDb21tYW5kKCk7ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L2ZhY2FkZS9JVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZDFhZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvZmFjYWRlL0lUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVR5cGUgZXh0ZW5kcyBJQURUT2JqZWN0Ci17IAotICBJVHlwZSBnZXRTdXBlclR5cGUoKTsKLSAgU3RyaW5nIGdldE5hbWUoKTsKLSAgU3RyaW5nIGdldFF1YWxpZmllcigpOwotICBib29sZWFuIGlzQ29tcGxleFR5cGUoKTsKLSAgYm9vbGVhbiBpc0Fub255bW91cygpOwotICAKLSAgQ29tbWFuZCBnZXRVcGRhdGVOYW1lQ29tbWFuZChTdHJpbmcgbmV3TmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9vdXRsaW5lL0FEVENvbnRlbnRPdXRsaW5lUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvb3V0bGluZS9BRFRDb250ZW50T3V0bGluZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyYzkzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9vdXRsaW5lL0FEVENvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLkRlc2lnblZpZXdDb250ZXh0TWVudVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmRlc2lnbi5lZGl0cGFydHMubW9kZWwuSU1vZGVsUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZmFjYWRlLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEFEVENvbnRlbnRPdXRsaW5lUGFnZSBleHRlbmRzIEV4dGVuc2libGVDb250ZW50T3V0bGluZVBhZ2UKLXsKLSAgcHJvdGVjdGVkIGludCBsZXZlbCA9IDA7Ci0gIHByb3RlY3RlZCBNdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25NYW5hZ2VyOwotICBwcm90ZWN0ZWQgU2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHNlbGVjdGlvbk1hbmFnZXJTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQotICBwdWJsaWMgQURUQ29udGVudE91dGxpbmVQYWdlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gICAgZ2V0VHJlZVZpZXdlcigpLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotICAgIGdldFRyZWVWaWV3ZXIoKS5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotICAgIGdldFRyZWVWaWV3ZXIoKS5zZXRJbnB1dChtb2RlbCk7Ci0gICAgZ2V0VHJlZVZpZXdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLSAgICBNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigiI3BvcHVwIik7Ly8kTk9OLU5MUy0xJAotICAgIG1lbnVNYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLSAgICBNZW51IG1lbnUgPSBtZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudShnZXRUcmVlVmlld2VyKCkuZ2V0Q29udHJvbCgpKTsKLSAgICBnZXRUcmVlVmlld2VyKCkuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0gICAgc2V0U2VsZWN0aW9uTWFuYWdlcihlZGl0b3IuZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgbWVudS4uLmZvciBub3cgcmV1c2UgZ3JhcGgncy4gIE5vdGUgZWRpdCBwYXJ0IHZpZXdlciA9IG51bGwKLSAgICBEZXNpZ25WaWV3Q29udGV4dE1lbnVQcm92aWRlciBtZW51UHJvdmlkZXIgPSBuZXcgRGVzaWduVmlld0NvbnRleHRNZW51UHJvdmlkZXIoZWRpdG9yLCBudWxsLCBlZGl0b3IuZ2V0U2VsZWN0aW9uTWFuYWdlcigpKTsKLSAgICBtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIobWVudVByb3ZpZGVyKTsKLSAgICBnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudSgib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5wb3B1cC5vdXRsaW5lIiwgbWVudU1hbmFnZXIsIGVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBlbmFibGUgcG9wdXBNZW51cyBleHRlbnNpb24KLSAgICAvLyBnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudSgib3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci51aS5wb3B1cC5vdXRsaW5lIiwKLSAgICAvLyBtZW51TWFuYWdlciwgeHNkRWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0KLSAgICAvLyBjcy4uLiB3aHkgYXJlIHdlIGRvaW5nIHRoaXMgZnJvbSB0aGUgb3V0bGluZSB2aWV3PwotICAgIC8vCi0gICAgLy8geHNkVGV4dEVkaXRvci5nZXRYU0RFZGl0b3IoKS5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldwotICAgIC8vIFN0cnVjdHVyZWRTZWxlY3Rpb24oeHNkVGV4dEVkaXRvci5nZXRYU0RTY2hlbWEoKSkpOwotICAgIC8vIGRyaWxsIGRvd24gZnJvbSBvdXRsaW5lIHZpZXcKLSAgICBnZXRUcmVlVmlld2VyKCkuZ2V0Q29udHJvbCgpLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpCi0gICAgICB7Ci0gICAgICAgIElTZWxlY3Rpb24gaVNlbGVjdGlvbiA9IGdldFRyZWVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgaWYgKGlTZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgaVNlbGVjdGlvbjsKLSAgICAgICAgICBPYmplY3Qgb2JqID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSBvYmo7Ci0gICAgICAgICAgICBpZiAoY29tcC5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gZ2V0WFNERWRpdG9yKCkuZ2V0R3JhcGhWaWV3ZXIoKS5zZXRJbnB1dChvYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLQotICBjbGFzcyBYU0RLZXlMaXN0ZW5lciBleHRlbmRzIEtleUFkYXB0ZXIKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBjb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEV4cGFuZFRvTGV2ZWwoaW50IGkpCi0gIHsKLSAgICBsZXZlbCA9IGk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgdmFsdWUpCi0gIHsKLSAgICBnZXRUcmVlVmlld2VyKCkuc2V0SW5wdXQodmFsdWUpOwotICAgIGdldFRyZWVWaWV3ZXIoKS5leHBhbmRUb0xldmVsKGxldmVsKTsKLSAgfQotCi0gIC8vIHB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpCi0gIC8vIHsKLSAgLy8gaWYgKGdldFRyZWVWaWV3ZXIoKSA9PSBudWxsKQotICAvLyByZXR1cm4gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLSAgLy8gcmV0dXJuIGdldFRyZWVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgLy8gfQotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25NYW5hZ2VyKE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyIG5ld1NlbGVjdGlvbk1hbmFnZXIpCi0gIHsKLS8vICAgIFRyZWVWaWV3ZXIgdHJlZVZpZXdlciA9IGdldFRyZWVWaWV3ZXIoKTsKLSAgICAvLyBkaXNjb25uZWN0IGZyb20gb2xkIG9uZQotICAgIGlmIChzZWxlY3Rpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgewotICAgICAgc2VsZWN0aW9uTWFuYWdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLS8vICAgICAgdHJlZVZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodHJlZVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLSAgICB9Ci0gICAgc2VsZWN0aW9uTWFuYWdlciA9IG5ld1NlbGVjdGlvbk1hbmFnZXI7Ci0gICAgLy8gY29ubmVjdCB0byBuZXcgb25lCi0gICAgaWYgKHNlbGVjdGlvbk1hbmFnZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZWxlY3Rpb25NYW5hZ2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotLy8gICAgICB0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0cmVlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBTZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICB1cGRhdGVTdGF0dXNMaW5lKGdldFNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSwgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgaWYgKGV2ZW50LmdldFNlbGVjdGlvblByb3ZpZGVyKCkgIT0gQURUQ29udGVudE91dGxpbmVQYWdlLnRoaXMpICAvL2dldFRyZWVWaWV3ZXIoKSkKLSAgICAgIHsKLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFRyZWVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRPRE86IEhhY2sgdG8gcHJldmVudCBsb3NpbmcgYSBzZWxlY3Rpb24gd2hlbiB0aGUgc2NoZW1hIGlzIHNlbGVjdGVkIGluIHRoZQotICAgICAgICAvLyBzb3VyY2UuICBGaXggaXMgdG8gcHJldmVudCB0aGUgc291cmNlIGZyb20gZmlyaW5nIG9mZiBzZWxlY3Rpb24gY2hhbmdlcyB3aGVuCi0gICAgICAgIC8vIHRoZSBzZWxlY3Rpb24gc291cmNlIGlzIG5vdCB0aGUgc291cmNlIHZpZXcuCi0gICAgICAgIGlmIChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBJTW9kZWwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIShjdXJyZW50U2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgSU1vZGVsUHJveHkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdldFRyZWVWaWV3ZXIoKS5zZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCksIHRydWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRUcmVlVmlld2VyKCkuc2V0U2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0vLyAgY2xhc3MgVHJlZVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotLy8gIHsKLS8vICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotLy8gICAgewotLy8gICAgICBpZiAoc2VsZWN0aW9uTWFuYWdlciAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLS8vICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0vLyAgICAgICAgewotLy8gICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotLy8gICAgICAgICAgT2JqZWN0IG8gPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotLy8gICAgICAgICAgaWYgKG8gIT0gbnVsbCkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgc2VsZWN0aW9uTWFuYWdlci5zZXRTZWxlY3Rpb24oc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgfQotICAKLSAgCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXR1c0xpbmUoSVN0YXR1c0xpbmVNYW5hZ2VyIG1nciwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBTdHJpbmcgdGV4dCA9IG51bGw7Ci0gICAgSW1hZ2UgaW1hZ2UgPSBudWxsOwotICAgIElMYWJlbFByb3ZpZGVyIHN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyID0gbmV3IFN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyKGdldFRyZWVWaWV3ZXIoKSk7Ci0gICAgaWYgKHN0YXR1c0xpbmVMYWJlbFByb3ZpZGVyICE9IG51bGwgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpCi0gICAgewotICAgICAgT2JqZWN0IGZpcnN0RWxlbWVudCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICB0ZXh0ID0gc3RhdHVzTGluZUxhYmVsUHJvdmlkZXIuZ2V0VGV4dChmaXJzdEVsZW1lbnQpOwotICAgICAgaW1hZ2UgPSBzdGF0dXNMaW5lTGFiZWxQcm92aWRlci5nZXRJbWFnZShmaXJzdEVsZW1lbnQpOwotICAgIH0KLSAgICBpZiAoaW1hZ2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBtZ3Iuc2V0TWVzc2FnZSh0ZXh0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG1nci5zZXRNZXNzYWdlKGltYWdlLCB0ZXh0KTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBjbGFzcyBTdGF0dXNMaW5lTGFiZWxQcm92aWRlciBleHRlbmRzIEpGYWNlTm9kZUxhYmVsUHJvdmlkZXIKLSAgewotICAgIFRyZWVWaWV3ZXIgdHJlZVZpZXdlciA9IG51bGw7Ci0KLSAgICBwdWJsaWMgU3RhdHVzTGluZUxhYmVsUHJvdmlkZXIoVHJlZVZpZXdlciB2aWV3ZXIpCi0gICAgewotICAgICAgdHJlZVZpZXdlciA9IHZpZXdlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgIFN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgcy5hcHBlbmQobGFiZWxQcm92aWRlci5nZXRUZXh0KGVsZW1lbnQpKTsKLSAgICAgIHJldHVybiBzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIHJldHVybiBsYWJlbFByb3ZpZGVyLmdldEltYWdlKGVsZW1lbnQpOwotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvQURUQ29udGVudE91dGxpbmVQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvb3V0bGluZS9BRFRDb250ZW50T3V0bGluZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNjMyNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvb3V0bGluZS9BRFRDb250ZW50T3V0bGluZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdExpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgQURUQ29udGVudE91dGxpbmVQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyLCBJQURUT2JqZWN0TGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIFZpZXdlciB2aWV3ZXIgPSBudWxsOwotICBwcm90ZWN0ZWQgT2JqZWN0IG9sZElucHV0LCBuZXdJbnB1dDsKLQotICBwdWJsaWMgQURUQ29udGVudE91dGxpbmVQcm92aWRlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkKLSAgewotICAgIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSVRyZWVFbGVtZW50KQotICAgIHsKLSAgICAgIE9iamVjdFtdIGNoaWxkcmVuID0gKChJVHJlZUVsZW1lbnQpIHBhcmVudEVsZW1lbnQpLmdldENoaWxkcmVuKCk7Ci0gICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW50IGxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBjaGlsZCA9IGNoaWxkcmVuW2ldOwotICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgICAgICAgewotICAgICAgICAgICAgKChJQURUT2JqZWN0KSBjaGlsZCkucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBjaGlsZHJlbjsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElUcmVlRWxlbWVudCkKLSAgICB7Ci0gICAgICByZXR1cm4gKChJVHJlZUVsZW1lbnQpIGVsZW1lbnQpLmhhc0NoaWxkcmVuKCk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgewotICAgIHJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgT2JqZWN0IGlucHV0ID0gdmlld2VyLmdldElucHV0KCk7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSUFEVE9iamVjdCkKLSAgICB7Ci0gICAgICByZW1vdmVMaXN0ZW5lcigoSUFEVE9iamVjdCkgaW5wdXQpOwotICAgIH0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotICB7Ci0gICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0gICAgdGhpcy5vbGRJbnB1dCA9IG9sZElucHV0OwotICAgIHRoaXMubmV3SW5wdXQgPSBuZXdJbnB1dDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5mYWNhZGUuSUFEVE9iamVjdExpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlZChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIGlmICh2aWV3ZXIgaW5zdGFuY2VvZiBUcmVlVmlld2VyKQotICAgIHsKLSAgICAgIFRyZWVWaWV3ZXIgdHJlZVZpZXdlciA9IChUcmVlVmlld2VyKSB2aWV3ZXI7Ci0gICAgICBpZiAodHJlZVZpZXdlci5nZXRUcmVlKCkgIT0gbnVsbCAmJiAhdHJlZVZpZXdlci5nZXRUcmVlKCkuaXNEaXNwb3NlZCgpKQotICAgICAgewotICAgICAgICB0cmVlVmlld2VyLnJlZnJlc2gob2JqZWN0KTsKLSAgICAgICAgdHJlZVZpZXdlci5yZXZlYWwob2JqZWN0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIG1vZGVsCi0gICAqLwotICBwcml2YXRlIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUFEVE9iamVjdCBtb2RlbCkKLSAgewotICAgIG1vZGVsLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICBPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKG1vZGVsKTsKLSAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IGNoaWxkID0gY2hpbGRyZW5baV07Ci0gICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIElBRFRPYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICByZW1vdmVMaXN0ZW5lcigoSUFEVE9iamVjdCkgY2hpbGQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvQURUTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvb3V0bGluZS9BRFRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YTZkNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvb3V0bGluZS9BRFRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIEFEVExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlcgotewotCi0gIHB1YmxpYyBBRFRMYWJlbFByb3ZpZGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVHJlZUVsZW1lbnQpCi0gICAgewotICAgICAgcmV0dXJuICgoSVRyZWVFbGVtZW50KWVsZW1lbnQpLmdldEltYWdlKCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVHJlZUVsZW1lbnQpCi0gICAgewotICAgICAgcmV0dXJuICgoSVRyZWVFbGVtZW50KWVsZW1lbnQpLmdldFRleHQoKTsKLSAgICB9Ci0gICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvRXh0ZW5zaWJsZUNvbnRlbnRPdXRsaW5lUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvb3V0bGluZS9FeHRlbnNpYmxlQ29udGVudE91dGxpbmVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNjY4YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvb3V0bGluZS9FeHRlbnNpYmxlQ29udGVudE91dGxpbmVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5vdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVBhZ2VTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXRvci5BRFRNdWx0aVBhZ2VFZGl0b3I7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmxlQ29udGVudE91dGxpbmVQYWdlIGV4dGVuZHMgUGFnZSBpbXBsZW1lbnRzIElDb250ZW50T3V0bGluZVBhZ2UsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIExpc3RlbmVyTGlzdCBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotICBwcm90ZWN0ZWQgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotICBwcm90ZWN0ZWQgT2JqZWN0IG1vZGVsOwotICBwcm90ZWN0ZWQgSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotICBwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLSAgcHJvdGVjdGVkIEFEVE11bHRpUGFnZUVkaXRvciBlZGl0b3I7Ci0KLSAgcHJvdGVjdGVkIEV4dGVuc2libGVDb250ZW50T3V0bGluZVBhZ2UoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIHRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0gICAgdHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFZGl0b3IoQURUTXVsdGlQYWdlRWRpdG9yIGVkaXRvcikKLSAgewotICAgIHRoaXMuZWRpdG9yID0gZWRpdG9yOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNb2RlbChPYmplY3QgbmV3TW9kZWwpCi0gIHsKLSAgICBtb2RlbCA9IG5ld01vZGVsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q29udGVudFByb3ZpZGVyKElUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikKLSAgewotICAgIHRoaXMuY29udGVudFByb3ZpZGVyID0gY29udGVudFByb3ZpZGVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TGFiZWxQcm92aWRlcihJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKQotICB7Ci0gICAgdGhpcy5sYWJlbFByb3ZpZGVyID0gbGFiZWxQcm92aWRlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkKLSAgewotICAgIHRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBpZiAodHJlZVZpZXdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBmaXJlU2VsZWN0aW9uQ2hhbmdlZChJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIC8vIGNyZWF0ZSBhbiBldmVudAotICAgIGZpbmFsIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgc2VsZWN0aW9uKTsKLQotICAgIC8vIGZpcmUgdGhlIGV2ZW50Ci0gICAgT2JqZWN0W10gbGlzdGVuZXJzID0gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7ICsraSkKLSAgICB7Ci0gICAgICBmaW5hbCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGwgPSAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOwotICAgICAgUGxhdGZvcm0ucnVuKG5ldyBTYWZlUnVubmFibGUoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICB7Ci0gICAgICAgICAgbC5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpCi0gIHsKLSAgICBpZiAodHJlZVZpZXdlciA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICByZXR1cm4gdHJlZVZpZXdlci5nZXRDb250cm9sKCk7Ci0gIH0KLQotICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKQotICB7Ci0gICAgaWYgKHRyZWVWaWV3ZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLSAgICB9Ci0gICAgcmV0dXJuIHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLQotICBwdWJsaWMgVHJlZVZpZXdlciBnZXRUcmVlVmlld2VyKCkKLSAgewotICAgIHJldHVybiB0cmVlVmlld2VyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdChJUGFnZVNpdGUgcGFnZVNpdGUpCi0gIHsKLSAgICBzdXBlci5pbml0KHBhZ2VTaXRlKTsKLSAgICBwYWdlU2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0aGlzKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBmaXJlU2VsZWN0aW9uQ2hhbmdlZChldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvSVRyZWVFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9vdXRsaW5lL0lUcmVlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjYwZDlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtYWR0L29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvYWR0L291dGxpbmUvSVRyZWVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQub3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGludGVyZmFjZSBJVHJlZUVsZW1lbnQKLXsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBJVHJlZUVsZW1lbnRbXSBFTVBUWV9MSVNUID0ge307Ci0gIElUcmVlRWxlbWVudFtdIGdldENoaWxkcmVuKCk7Ci0gIElUcmVlRWxlbWVudCBnZXRQYXJlbnQoKTsKLSAgYm9vbGVhbiBoYXNDaGlsZHJlbigpOwotICBTdHJpbmcgZ2V0VGV4dCgpOwotICBJbWFnZSBnZXRJbWFnZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvcHJvcGVydGllcy9BRFRUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1hZHQvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9hZHQvcHJvcGVydGllcy9BRFRUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzEzNDNmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWFkdC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2FkdC9wcm9wZXJ0aWVzL0FEVFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZC4gIEV4dGVuZGVycyBzaG91bGQgc3BlY2lhbGl6ZS4uLmllLiBYU0RUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZQotICovCi1wdWJsaWMgY2xhc3MgQURUVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgZXh0ZW5kcyBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZQotewotICBwdWJsaWMgQURUVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UoSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcikKLSAgewotICAgIHN1cGVyKHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTZWxlY3Rpb25MaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0KLS8vICAgICAgT2JqZWN0IHNlbGVjdGVkID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0vLyAgICAgIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIEVkaXRQYXJ0KQotLy8gICAgICB7Ci0vLyAgICAgICAgT2JqZWN0IG1vZGVsID0gKChFZGl0UGFydClzZWxlY3RlZCkuZ2V0TW9kZWwoKTsKLS8vICAgICAgICBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtb2RlbCk7Ci0vLyAgICAgIH0KLSAgICAgIHN1cGVyLnNlbGVjdGlvbkNoYW5nZWQocGFydCwgc2VsZWN0aW9uKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTREFueUF0dHJpYnV0ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RBbnlBdHRyaWJ1dGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc3ODVmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTREFueUF0dHJpYnV0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTREFueUF0dHJpYnV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RBbnlBdHRyaWJ1dGVBY3Rpb24gZXh0ZW5kcyBYU0RCYXNlQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuQWRkWFNEQW55QXR0cmlidXRlQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLSAgCi0gIHB1YmxpYyBBZGRYU0RBbnlBdHRyaWJ1dGVBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQU5ZX0FUVFJJQlVURSk7Ci0gICAgc2V0SWQoSUQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIE9iamVjdCBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgewotICAgICAgc2VsZWN0aW9uID0gKChYU0RCYXNlQWRhcHRlcikgc2VsZWN0aW9uKS5nZXRUYXJnZXQoKTsKLSAgICB9Ci0gICAgQWRkWFNEQW55QXR0cmlidXRlQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNEQW55QXR0cmlidXRlQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BTllfQVRUUklCVVRFLCAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBzZWxlY3Rpb24pOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNEQW55QXR0cmlidXRlQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BTllfQVRUUklCVVRFLCAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKXNlbGVjdGlvbik7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgICAKLSAgICBpZiAoY29tbWFuZCAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkZGVkQ29tcG9uZW50ID0gY29tbWFuZC5nZXRBZGRlZENvbXBvbmVudCgpOwotICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChhZGRlZENvbXBvbmVudCk7Ci0gICAgICBzZWxlY3RBZGRlZENvbXBvbmVudChhZGFwdGVyKTsKLSAgICB9Ci0gIH0KLQotCi0gIHByb3RlY3RlZCBib29sZWFuIGNhbGN1bGF0ZUVuYWJsZWQoKQotICB7Ci0gICAgYm9vbGVhbiByYyA9IHN1cGVyLmNhbGN1bGF0ZUVuYWJsZWQoKTsKLSAgICBpZiAocmMpCi0gICAgewotICAgICAgT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgICAgewotICAgICAgICBzZWxlY3Rpb24gPSAoKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb24pLmdldFRhcmdldCgpOwotICAgICAgfQotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICgoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKXNlbGVjdGlvbikuZ2V0QXR0cmlidXRlV2lsZGNhcmRDb250ZW50KCkgPT0gbnVsbDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICgoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKXNlbGVjdGlvbikuZ2V0QXR0cmlidXRlV2lsZGNhcmRDb250ZW50KCkgPT0gbnVsbDsKLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICByZXR1cm4gcmM7Ci0gIH0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEQW55RWxlbWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RBbnlFbGVtZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MGE1M2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RBbnlFbGVtZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNEQW55RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RBbnlFbGVtZW50QWN0aW9uIGV4dGVuZHMgWFNEQmFzZUFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLkFkZFhTREFueUVsZW1lbnRBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIEFkZFhTREFueUVsZW1lbnRBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfQU5ZX0VMRU1FTlQpOwotICAgIHNldElkKElEKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0gZ2V0TW9kZWxHcm91cChzZWxlY3Rpb24pOwotCi0gICAgQWRkWFNEQW55RWxlbWVudENvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RBbnlFbGVtZW50Q29tbWFuZChnZXRUZXh0KCksIG1vZGVsR3JvdXApOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgY29tbWFuZC5zZXRDb21wbGV4VHlwZSgoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKXNlbGVjdGlvbik7Ci0gICAgfQotICAgIGNvbW1hbmQuc2V0RG9DcmVhdGVNb2RlbEdyb3VwRm9yQ29tcGxleFR5cGUobW9kZWxHcm91cCA9PSBudWxsKTsKLSAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIGFkZGVkQ29tcG9uZW50ID0gY29tbWFuZC5nZXRBZGRlZENvbXBvbmVudCgpOwotICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoYWRkZWRDb21wb25lbnQpOwotICAgIHNlbGVjdEFkZGVkQ29tcG9uZW50KGFkYXB0ZXIpOwotICB9Ci0KLSAgcHJpdmF0ZSBYU0RNb2RlbEdyb3VwIGdldE1vZGVsR3JvdXAoT2JqZWN0IHNlbGVjdGlvbikKLSAgewotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIHJldHVybiAoWFNETW9kZWxHcm91cCkgc2VsZWN0aW9uOwotICAgIH0KLSAgICBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgWFNEQ29tcGxleFR5cGVDb250ZW50IGNvbnRlbnQgPSAoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbilzZWxlY3Rpb24pLmdldENvbnRlbnQoKTsKLSAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICB7Ci0gICAgICAgIFhTRFBhcnRpY2xlQ29udGVudCBwYXJ0aWNsZUNvbnRlbnQgPSAoKFhTRFBhcnRpY2xlKWNvbnRlbnQpLmdldENvbnRlbnQoKTsKLSAgICAgICAgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gKFhTRE1vZGVsR3JvdXApcGFydGljbGVDb250ZW50OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NWI0YjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbiBleHRlbmRzIFhTREJhc2VBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAiQWRkWFNEQXR0cmlidXRlQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUZfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RBdHRyaWJ1dGVSZWZlcmVuY2VBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gIGJvb2xlYW4gaXNSZWZlcmVuY2UgPSBmYWxzZTsKLSAgCi0gIHB1YmxpYyBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEUpOwotICAgIHNldElkKElEKTsKLSAgICBpc1JlZmVyZW5jZSA9IGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25BY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCwgU3RyaW5nIGlkLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNSZWZlcmVuY2UpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBzZXRUZXh0KGxhYmVsKTsKLSAgICBzZXRJZChpZCk7Ci0gICAgdGhpcy5pc1JlZmVyZW5jZSA9IGlzUmVmZXJlbmNlOwotICAgIGRvRGlyZWN0RWRpdCA9ICFpc1JlZmVyZW5jZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIHNlbGVjdGlvbikuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURSwgKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgc2VsZWN0aW9uKTsKLSAgICAgIGNvbW1hbmQuc2V0UmVmZXJlbmNlKGlzUmVmZXJlbmNlKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVVc2UgeHNkQXR0cmlidXRlVXNlID0gKFhTREF0dHJpYnV0ZVVzZSkgc2VsZWN0aW9uOwotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gbnVsbDsKLSAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCA9IG51bGw7Ci0gICAgICBmb3IgKHBhcmVudCA9IHhzZEF0dHJpYnV0ZVVzZS5nZXRDb250YWluZXIoKTsgcGFyZW50ICE9IG51bGw7KQotICAgICAgewotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgY3QgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBwYXJlbnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldENvbnRhaW5lcigpOwotICAgICAgfQotICAgICAgaWYgKGN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNEQXR0cmlidXRlRGVjbGFyYXRpb25Db21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURSwgY3QpOwotICAgICAgICBjb21tYW5kLnNldFJlZmVyZW5jZShpc1JlZmVyZW5jZSk7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEUsIChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pc2VsZWN0aW9uKTsKLSAgICAgIGNvbW1hbmQuc2V0UmVmZXJlbmNlKGlzUmVmZXJlbmNlKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEUsIChYU0RTY2hlbWEpc2VsZWN0aW9uKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIAotICAgIGlmIChjb21tYW5kICE9IG51bGwpCi0gICAgewotICAgICAgYWRkZWRDb21wb25lbnQgPSBjb21tYW5kLmdldEFkZGVkQ29tcG9uZW50KCk7Ci0gICAgICBBZGFwdGVyIGFkYXB0ZXIgPSBYU0RBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGFkZGVkQ29tcG9uZW50KTsKLSAgICAgIHNlbGVjdEFkZGVkQ29tcG9uZW50KGFkYXB0ZXIpOwotICAgIH0KLQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMwYTNlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25BY3Rpb24gZXh0ZW5kcyBYU0RCYXNlQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElEID0gIkFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVGX0lEID0gIkFkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblJlZkFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUCk7Ci0gICAgc2V0SWQoSUQpOwotICB9Ci0gIAotICBwdWJsaWMgQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQsIFN0cmluZyBpZCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIGlmIChpZC5lcXVhbHMoUkVGX0lEKSkKLSAgICB7Ci0gICAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUF9SRUYpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVBfREVGSU5JVElPTik7Ci0gICAgfSAgIAotICAgIHNldElkKGlkKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVBfUkVGLCAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBzZWxlY3Rpb24pOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgIHsKLSAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVBfREVGSU5JVElPTiwgKFhTRFNjaGVtYSkgc2VsZWN0aW9uKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotCi0gICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGRlZENvbXBvbmVudCA9IGNvbW1hbmQuZ2V0QWRkZWRDb21wb25lbnQoKTsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoYWRkZWRDb21wb25lbnQpOwotICAgICAgc2VsZWN0QWRkZWRDb21wb25lbnQoYWRhcHRlcik7Ci0gICAgfQotCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTVmNGVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25BY3Rpb24gZXh0ZW5kcyBYU0RCYXNlQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLkFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0NPTVBMRVhfVFlQRSk7Ci0gICAgc2V0SWQoSUQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIE9iamVjdCBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgewotICAgICAgc2VsZWN0aW9uID0gKChYU0RCYXNlQWRhcHRlcikgc2VsZWN0aW9uKS5nZXRUYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgIHsKLSAgICAgIEFkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RDb21wbGV4VHlwZURlZmluaXRpb25Db21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0NPTVBMRVhfVFlQRSwgKFhTRFNjaGVtYSkgc2VsZWN0aW9uKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAKLSAgICAgIGFkZGVkQ29tcG9uZW50ID0gY29tbWFuZC5nZXRBZGRlZENvbXBvbmVudCgpOwotICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChhZGRlZENvbXBvbmVudCk7Ci0gICAgICBzZWxlY3RBZGRlZENvbXBvbmVudChhZGFwdGVyKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNERWxlbWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RFbGVtZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYzM1YjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RFbGVtZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTREVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotLy9yZXZpc2l0IHRoaXMgYW5kIHNlZSBpZiB3ZSBjYW4gcmV1c2UgQWRkRmllbGRBY3Rpb24/PwotCi1wdWJsaWMgY2xhc3MgQWRkWFNERWxlbWVudEFjdGlvbiBleHRlbmRzIFhTREJhc2VBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbGVtZW50QWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUZfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5BZGRYU0RFbGVtZW50UmVmZXJlbmNlQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBib29sZWFuIGlzUmVmZXJlbmNlOwotICAKLSAgcHVibGljIEFkZFhTREVsZW1lbnRBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCwgU3RyaW5nIGlkLCBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gaXNSZWZlcmVuY2UpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBzZXRUZXh0KGxhYmVsKTsKLSAgICBzZXRJZChpZCk7Ci0gICAgdGhpcy5pc1JlZmVyZW5jZSA9IGlzUmVmZXJlbmNlOwotICAgIGRvRGlyZWN0RWRpdCA9ICFpc1JlZmVyZW5jZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgfQotICAgIEFkZFhTREVsZW1lbnRDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RFbGVtZW50Q29tbWFuZChnZXRUZXh0KCksIChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHNlbGVjdGlvbik7Ci0gICAgICBjb21tYW5kLnNldFJlZmVyZW5jZShpc1JlZmVyZW5jZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgICBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IEFkZFhTREVsZW1lbnRDb21tYW5kKGdldFRleHQoKSwgKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBzZWxlY3Rpb24pOwotICAgICAgY29tbWFuZC5zZXRSZWZlcmVuY2UoaXNSZWZlcmVuY2UpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgIHsKLSAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNERWxlbWVudENvbW1hbmQoZ2V0VGV4dCgpLCAoWFNEU2NoZW1hKSBzZWxlY3Rpb24pOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSAoWFNETW9kZWxHcm91cCkgc2VsZWN0aW9uOwotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50ID0gbW9kZWxHcm91cC5nZXRDb250YWluZXIoKTsKLSAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCA9IG51bGw7Ci0gICAgICB3aGlsZSAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBjdCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIGNvbXBvbmVudDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjb21wb25lbnQgPSBjb21wb25lbnQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChjdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBjb21tYW5kID0gbmV3IEFkZFhTREVsZW1lbnRDb21tYW5kKGdldFRleHQoKSwgKFhTRE1vZGVsR3JvdXApIHNlbGVjdGlvbiwgY3QpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjb21tYW5kID0gbmV3IEFkZFhTREVsZW1lbnRDb21tYW5kKGdldFRleHQoKSwgKFhTRE1vZGVsR3JvdXApIHNlbGVjdGlvbik7Ci0gICAgICB9Ci0gICAgICBjb21tYW5kLnNldFJlZmVyZW5jZShpc1JlZmVyZW5jZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgICBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24gfHwgc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbmNyZXRlQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSBzZWxlY3Rpb247Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSBudWxsOwotICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0ID0gbnVsbDsKLSAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGdyb3VwID0gbnVsbDsKLSAgICAgIGZvciAocGFyZW50ID0geHNkQ29uY3JldGVDb21wb25lbnQuZ2V0Q29udGFpbmVyKCk7IHBhcmVudCAhPSBudWxsOyApCi0gICAgICB7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBjdCA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pcGFyZW50OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgZ3JvdXAgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pcGFyZW50OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRDb250YWluZXIoKTsKLSAgICAgIH0KLSAgICAgIGlmIChjdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBjb21tYW5kID0gbmV3IEFkZFhTREVsZW1lbnRDb21tYW5kKGdldFRleHQoKSwgY3QpOwotICAgICAgICBjb21tYW5kLnNldFJlZmVyZW5jZShpc1JlZmVyZW5jZSk7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICB9Ci0gICAgICBpZiAoZ3JvdXAgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RFbGVtZW50Q29tbWFuZChnZXRUZXh0KCksIGdyb3VwKTsKLSAgICAgICAgY29tbWFuZC5zZXRSZWZlcmVuY2UoaXNSZWZlcmVuY2UpOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoY29tbWFuZCAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkZGVkQ29tcG9uZW50ID0gY29tbWFuZC5nZXRBZGRlZENvbXBvbmVudCgpOwotICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChhZGRlZENvbXBvbmVudCk7Ci0gICAgICBzZWxlY3RBZGRlZENvbXBvbmVudChhZGFwdGVyKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RNb2RlbEdyb3VwQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRE1vZGVsR3JvdXBBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmYjQ2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRE1vZGVsR3JvdXBBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNETW9kZWxHcm91cENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgQWRkWFNETW9kZWxHcm91cEFjdGlvbiBleHRlbmRzIFhTREJhc2VBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0VRVUVOQ0VfSUQgPSAiQWRkWFNEU2VxdWVuY2VNb2RlbEdyb3VwQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBDSE9JQ0VfSUQgPSAiQWRkWFNEQ2hvaWNlTW9kZWxHcm91cEFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQUxMX0lEID0gIkFkZFhTREFsbE1vZGVsR3JvdXBBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gIFhTRENvbXBvc2l0b3IgeHNkQ29tcG9zaXRvcjsKLQotICBwdWJsaWMgQWRkWFNETW9kZWxHcm91cEFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0LCBYU0RDb21wb3NpdG9yIGNvbXBvc2l0b3IsIFN0cmluZyBJRCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldFRleHQoZ2V0TGFiZWwoY29tcG9zaXRvcikpOwotICAgIHNldElkKElEKTsKLSAgICB0aGlzLnhzZENvbXBvc2l0b3IgPSBjb21wb3NpdG9yOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIE9iamVjdCBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgKChYU0RCYXNlQWRhcHRlcikgc2VsZWN0aW9uKS5nZXRUYXJnZXQoKTsKLSAgICAgIEFkZFhTRE1vZGVsR3JvdXBDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgICAgaWYgKHhzZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHhzZENvbXBvbmVudDsKLQotICAgICAgICBjb21tYW5kID0gbmV3IEFkZFhTRE1vZGVsR3JvdXBDb21tYW5kKGdldExhYmVsKHhzZENvbXBvc2l0b3IpLCB4c2RFbGVtZW50RGVjbGFyYXRpb24sIHhzZENvbXBvc2l0b3IpOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoeHNkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgIHsKLSAgICAgICAgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwID0gKFhTRE1vZGVsR3JvdXApIHhzZENvbXBvbmVudDsKLQotICAgICAgICBjb21tYW5kID0gbmV3IEFkZFhTRE1vZGVsR3JvdXBDb21tYW5kKGdldExhYmVsKHhzZENvbXBvc2l0b3IpLCB4c2RNb2RlbEdyb3VwLCB4c2RDb21wb3NpdG9yKTsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHhzZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbgotICAgICAgICAgICAgICAgfHwgeHNkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNETW9kZWxHcm91cENvbW1hbmQoZ2V0TGFiZWwoeHNkQ29tcG9zaXRvciksIHhzZENvbXBvbmVudCwgeHNkQ29tcG9zaXRvcik7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICB9Ci0gICAgIAotICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQWRhcHRlciBhZGFwdGVyID0gWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdChjb21tYW5kLmdldEFkZGVkQ29tcG9uZW50KCkpOwotICAgICAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgICAgICAgIHByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihhZGFwdGVyKSk7Ci0gICAgICB9Ci0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRMYWJlbChYU0RDb21wb3NpdG9yIGNvbXBvc2l0b3IpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfU0VRVUVOQ0UiKTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChjb21wb3NpdG9yICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGNvbXBvc2l0b3IgPT0gWFNEQ29tcG9zaXRvci5DSE9JQ0VfTElURVJBTCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQ0hPSUNFIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbXBvc2l0b3IgPT0gWFNEQ29tcG9zaXRvci5BTExfTElURVJBTCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfQUxMIik7Ly8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OWEzNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIEFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWN0aW9uIGV4dGVuZHMgWFNEQmFzZUFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTEdST1VQREVGSU5JVElPTl9JRCA9ICJBZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxHUk9VUERFRklOSVRJT05SRUZfSUQgPSAiQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25SZWZBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gIGJvb2xlYW4gaXNSZWZlcmVuY2U7Ci0KLSAgcHVibGljIEFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQsIGJvb2xlYW4gaXNSZWZlcmVuY2UpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICB0aGlzLmlzUmVmZXJlbmNlID0gaXNSZWZlcmVuY2U7Ci0gICAgaWYgKGlzUmVmZXJlbmNlKQotICAgIHsKLSAgICAgIHNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfR1JPVVBfUkVGKTsKLSAgICAgIHNldElkKE1PREVMR1JPVVBERUZJTklUSU9OX0lEKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfR1JPVVApOwotICAgICAgc2V0SWQoTU9ERUxHUk9VUERFRklOSVRJT05SRUZfSUQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbmNyZXRlQ29tcG9uZW50ID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgewotICAgICAgeHNkQ29uY3JldGVDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgfQotICAgIGlmICh4c2RDb25jcmV0ZUNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIEFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQ29tbWFuZChnZXRUZXh0KCksIHhzZENvbmNyZXRlQ29tcG9uZW50LCBpc1JlZmVyZW5jZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCi0gICAgICBhZGRlZENvbXBvbmVudCA9IGNvbW1hbmQuZ2V0QWRkZWRDb21wb25lbnQoKTsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoYWRkZWRDb21wb25lbnQpOwotICAgICAgc2VsZWN0QWRkZWRDb21wb25lbnQoYWRhcHRlcik7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRFNjaGVtYURpcmVjdGl2ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9BZGRYU0RTY2hlbWFEaXJlY3RpdmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlkODMzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRFNjaGVtYURpcmVjdGl2ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRYU0RJbXBvcnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTREluY2x1ZGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZFhTRFJlZGVmaW5lQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5CYXNlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgQWRkWFNEU2NoZW1hRGlyZWN0aXZlQWN0aW9uIGV4dGVuZHMgWFNEQmFzZUFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTkNMVURFX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNESW5jbHVkZUFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgSU1QT1JUX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQWRkWFNESW1wb3J0QWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRURFRklORV9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkFkZFhTRFJlZGVmaW5lQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICBTdHJpbmcgbGFiZWw7Ci0gIAotICBwdWJsaWMgQWRkWFNEU2NoZW1hRGlyZWN0aXZlQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQsIFN0cmluZyBJRCwgU3RyaW5nIGxhYmVsKQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChsYWJlbCk7Ci0gICAgc2V0SWQoSUQpOwotICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgQmFzZUNvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICB7Ci0gICAgICBpZiAoSU5DTFVERV9JRC5lcXVhbHMoZ2V0SWQoKSkpCi0gICAgICB7Ci0gICAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNESW5jbHVkZUNvbW1hbmQobGFiZWwsIChYU0RTY2hlbWEpIHNlbGVjdGlvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChJTVBPUlRfSUQuZXF1YWxzKGdldElkKCkpKQotICAgICAgewotICAgICAgICBjb21tYW5kID0gbmV3IEFkZFhTREltcG9ydENvbW1hbmQobGFiZWwsIChYU0RTY2hlbWEpIHNlbGVjdGlvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChSRURFRklORV9JRC5lcXVhbHMoZ2V0SWQoKSkpCi0gICAgICB7Ci0gICAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNEUmVkZWZpbmVDb21tYW5kKGxhYmVsLCAoWFNEU2NoZW1hKSBzZWxlY3Rpb24pOwotICAgICAgfQotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0KLSAgICBpZiAoY29tbWFuZCAhPSBudWxsKQotICAgIHsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoY29tbWFuZC5nZXRBZGRlZENvbXBvbmVudCgpKTsKLSAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgICAgIHByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihhZGFwdGVyKSk7Ci0gICAgfQotCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM3Y2Q3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0FkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQWN0aW9uIGV4dGVuZHMgWFNEQmFzZUFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5BZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgQWRkWFNEU2ltcGxlVHlwZURlZmluaXRpb25BY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfU0lNUExFX1RZUEUpOwotICAgIHNldElkKElEKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTREJhc2VBZGFwdGVyKQotICAgIHsKLSAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICB7Ci0gICAgICBBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfU0lNUExFX1RZUEUsIChYU0RTY2hlbWEpIHNlbGVjdGlvbik7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgCi0gICAgICBhZGRlZENvbXBvbmVudCA9IGNvbW1hbmQuZ2V0QWRkZWRDb21wb25lbnQoKTsKLSAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQoYWRkZWRDb21wb25lbnQpOwotICAgICAgc2VsZWN0QWRkZWRDb21wb25lbnQoYWRhcHRlcik7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvRGVsZXRlWFNEQ29uY3JldGVDb21wb25lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvRGVsZXRlWFNEQ29uY3JldGVDb21wb25lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk1NzkxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9hY3Rpb25zL0RlbGV0ZVhTRENvbmNyZXRlQ29tcG9uZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBEZWxldGVYU0RDb25jcmV0ZUNvbXBvbmVudEFjdGlvbiBleHRlbmRzIFhTREJhc2VBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX1hTRF9DT01QT05FTlRfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5EZWxldGVYU0RDb25jcmV0ZUNvbXBvbmVudEFjdGlvbiI7ICAgLy8kTk9OLU5MUy0xJAotCi0gIHB1YmxpYyBEZWxldGVYU0RDb25jcmV0ZUNvbXBvbmVudEFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0RFTEVURSk7Ci0gICAgc2V0SWQoREVMRVRFX1hTRF9DT01QT05FTlRfSUQpOwotICAgIHNldEltYWdlRGVzY3JpcHRvcihYU0RFZGl0b3JQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpY29ucy9kZWxldGVfb2JqLmdpZiIpICk7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9iamVjdCBzZWxlY3Rpb24gPSBpLm5leHQoKTsKLSAgICAgIGJvb2xlYW4gZG9SZXNlbGVjdCA9IGZhbHNlOwotICAgICAgCi0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSBzZWxlY3Rpb247Ci0gICAgICAgIFhTRFNjaGVtYSBtb2RlbCA9IHhzZENvbXBvbmVudC5nZXRTY2hlbWEoKTsKLSAgICAgICAgCi0gICAgICAgIGRvUmVzZWxlY3QgPSB4c2RDb21wb25lbnQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEU2NoZW1hOwotICAgICAgICAKLSAgICAgICAgRGVsZXRlQ29tbWFuZCBjb21tYW5kID0gbmV3IERlbGV0ZUNvbW1hbmQoZ2V0VGV4dCgpLCB4c2RDb21wb25lbnQpOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICAKLSAgICAgICAgaWYgKG1vZGVsICE9IG51bGwgJiYgZG9SZXNlbGVjdCkKLSAgICAgICAgewotICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciA9IFhTREFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQobW9kZWwpOwotICAgICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgICAgICAgICBwcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYWRhcHRlcikpOwotICAgICAgICB9Ci0gICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9PcGVuSW5OZXdFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvT3BlbkluTmV3RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyN2MyMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9PcGVuSW5OZXdFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5FRlM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLklGaWxlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuRmlsZVN0b3JlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWRhcHRlcnMuWFNEQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmFjdGlvbnMuQmFzZVNlbGVjdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuQURURmlsZVN0b3JlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdG9yLkFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTREltcG9ydEltcGw7Ci0KLXB1YmxpYyBjbGFzcyBPcGVuSW5OZXdFZGl0b3IgZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIk9wZW5Jbk5ld0VkaXRvciI7IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgT3BlbkluTmV3RWRpdG9yKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgICBzZXRUZXh0KE1lc3NhZ2VzLl9VSV9BQ1RJT05fT1BFTl9JTl9ORVdfRURJVE9SKTsgLy8kTk9OLU5MUy0xJAotICAgIHNldElkKElEKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGNhbGN1bGF0ZUVuYWJsZWQoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgT2JqZWN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IG51bGw7Ci0gICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gbnVsbDsKLSAgICBpZiAod29ya2JlbmNoV2luZG93ICE9IG51bGwpCi0gICAgewotICAgICAgcGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICBJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgaWYgKGFjdGl2ZUVkaXRvciAhPSBudWxsKQotICAgICAgewotICAgICAgICBlZGl0b3JJbnB1dCA9IGFjdGl2ZUVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIAotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICBYU0RCYXNlQWRhcHRlciB4c2RBZGFwdGVyID0gKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb247Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBmQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSB4c2RBZGFwdGVyLmdldFRhcmdldCgpOwotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IGZDb21wb25lbnQuZ2V0U2NoZW1hKCk7Ci0gICAgICAKLSAgICAgIGJvb2xlYW4gaXNSZWZlcmVuY2UgPSBmYWxzZTsKLSAgICAgIGlmIChmQ29tcG9uZW50IGluc3RhbmNlb2YgWFNERmVhdHVyZSkKLSAgICAgIHsKLSAgICAgICAgaXNSZWZlcmVuY2UgPSAoKFhTREZlYXR1cmUpZkNvbXBvbmVudCkuaXNGZWF0dXJlUmVmZXJlbmNlKCk7Ci0gICAgICAgIGZDb21wb25lbnQgPSAoKFhTREZlYXR1cmUpZkNvbXBvbmVudCkuZ2V0UmVzb2x2ZWRGZWF0dXJlKCk7Ci0gICAgICB9Ci0KLSAgICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IG51bGw7Ci0gICAgICBJUGF0aCBzY2hlbWFQYXRoID0gbnVsbDsKLSAgICAgIElGaWxlIHNjaGVtYUZpbGUgPSBudWxsOwotCi0gICAgICAvLyBTcGVjaWFsIGNhc2UgYW55IGltcG9ydHMvaW5jbHVkZXMKLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmVBZGFwdGVyKQotICAgICAgewotICAgICAgICBYU0RTY2hlbWFEaXJlY3RpdmUgZGlyID0gKFhTRFNjaGVtYURpcmVjdGl2ZSkoKFhTRFNjaGVtYURpcmVjdGl2ZUFkYXB0ZXIpc2VsZWN0aW9uKS5nZXRUYXJnZXQoKTsKLSAgICAgICAgLy8gZm9yY2UgbG9hZCBvZiBpbXBvcnRlZCBzY2hlbWEKLSAgICAgICAgaWYgKGRpciBpbnN0YW5jZW9mIFhTREltcG9ydEltcGwpCi0gICAgICAgIHsKLSAgICAgICAgICAoKFhTREltcG9ydEltcGwpZGlyKS5pbXBvcnRTY2hlbWEoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGlyLmdldFJlc29sdmVkU2NoZW1hKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNjaGVtYUxvY2F0aW9uID0gVVJJSGVscGVyLnJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChkaXIuZ2V0UmVzb2x2ZWRTY2hlbWEoKS5nZXRTY2hlbWFMb2NhdGlvbigpKTsKLSAgICAgICAgICBzY2hlbWFQYXRoID0gbmV3IFBhdGgoc2NoZW1hTG9jYXRpb24pOwotICAgICAgICAgIHNjaGVtYUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoc2NoZW1hUGF0aCk7Ci0gICAgICAgICAgc2NoZW1hID0gZGlyLmdldFJlc29sdmVkU2NoZW1hKCk7IAotICAgICAgICAgIGZDb21wb25lbnQgPSBkaXIuZ2V0UmVzb2x2ZWRTY2hlbWEoKTsKLSAgICAgICAgfQotICAgICAgfSAvLyBIYW5kbGUgYW55IG90aGVyIGV4dGVybmFsIGNvbXBvbmVudHMKLSAgICAgIGVsc2UgaWYgKGZDb21wb25lbnQuZ2V0U2NoZW1hKCkgIT0gbnVsbCAmJiBmQ29tcG9uZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRFNjaGVtYSB8fCBpc1JlZmVyZW5jZSkKLSAgICAgIHsKLSAgICAgICAgc2NoZW1hTG9jYXRpb24gPSBVUklIZWxwZXIucmVtb3ZlUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKGZDb21wb25lbnQuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0gICAgICAgIHNjaGVtYVBhdGggPSBuZXcgUGF0aChzY2hlbWFMb2NhdGlvbik7Ci0gICAgICAgIHNjaGVtYUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoc2NoZW1hUGF0aCk7Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSAoWFNEU2NoZW1hKWdldFdvcmtiZW5jaFBhcnQoKS5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcyk7Ci0gICAgICAgICAgaWYgKGZDb21wb25lbnQuZ2V0U2NoZW1hKCkgPT0geHNkU2NoZW1hKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICAgIGlmIChlZGl0b3JQYXJ0IGluc3RhbmNlb2YgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICgoSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpIGVkaXRvclBhcnQpLm9wZW5Pbkdsb2JhbFJlZmVyZW5jZShmQ29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gSWYgdGhlIHNjaGVtYUZpbGUgZXhpc3RzIGluIHRoZSB3b3Jrc3BhY2UKLSAgICAgIGlmIChwYWdlICE9IG51bGwgJiYgc2NoZW1hRmlsZSAhPSBudWxsICYmIHNjaGVtYUZpbGUuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IGVkaXRvcidzIHNjaGVtYQotICAgICAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSAoWFNEU2NoZW1hKWdldFdvcmtiZW5jaFBhcnQoKS5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcyk7Ci0gICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG51bGw7Ci0gICAgICAgICAgLy8gVGhpcyBmaXJzdCBjaGVjayBpcyB0byBlbnN1cmUgdGhhdCB0aGUgc2NoZW1hIGlzIGFjdHVhbGx5Ci0gICAgICAgICAgLy8gZGlmZmVyZW50IHRoYW4gdGhlIGN1cnJlbnQgb25lIHdlIGFyZSBlZGl0aW5nIGFnYWluc3QgaW4gdGhlIGVkaXRvciwgYW5kIHRoYXQgd2UKLSAgICAgICAgICAvLyBhcmUgaW4gdGhlIHNhbWUgcmVzb3VyY2UgZmlsZS4uLi5oZW5jZSBtdWx0aXBsZSBzY2hlbWFzIGluIHRoZSBzYW1lIGZpbGUuCi0gICAgICAgICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsICYmIGZDb21wb25lbnQuZ2V0Um9vdENvbnRhaW5lcigpLmVSZXNvdXJjZSgpID09IHhzZFNjaGVtYS5lUmVzb3VyY2UoKSAmJiB4c2RTY2hlbWEgIT0gc2NoZW1hKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBlZGl0b3JOYW1lID0gbnVsbDsKLSAgICAgICAgICAgIFhTREZpbGVFZGl0b3JJbnB1dCB4c2RGaWxlRWRpdG9ySW5wdXQgPSBuZXcgWFNERmlsZUVkaXRvcklucHV0KHNjaGVtYUZpbGUsIGZDb21wb25lbnQuZ2V0U2NoZW1hKCkpOwotICAgICAgICAgICAgLy8gd2lsbCB1c2UgRmlsZUVkaXRvcklucHV0J3MgbmFtZSBpZiBzdGlsbCBudWxsCi0gICAgICAgICAgICAvLyBUcnkgdG8gdXNlIHRoZSBzYW1lIGVkaXRvciBuYW1lIGFzIHRoZSBjdXJyZW50IG9uZQotICAgICAgICAgICAgaWYgKGVkaXRvcklucHV0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVkaXRvck5hbWUgPSBlZGl0b3JJbnB1dC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgIHhzZEZpbGVFZGl0b3JJbnB1dC5zZXRFZGl0b3JOYW1lKGVkaXRvck5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWRpdG9yUGFydCA9IGdldEV4aXN0aW5nRWRpdG9yRm9ySW5saW5lU2NoZW1hKHBhZ2UsIHNjaGVtYUZpbGUsIHNjaGVtYSk7Ci0gICAgICAgICAgICBpZiAoZWRpdG9yUGFydCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlZGl0b3JQYXJ0ID0gcGFnZS5vcGVuRWRpdG9yKHhzZEZpbGVFZGl0b3JJbnB1dCwgWFNERWRpdG9yUGx1Z2luLkVESVRPUl9JRCwgdHJ1ZSwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlZGl0b3JQYXJ0ID0gcGFnZS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoc2NoZW1hRmlsZSksIFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICgoSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpIGVkaXRvclBhcnQpLm9wZW5Pbkdsb2JhbFJlZmVyZW5jZShmQ29tcG9uZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gb3BlbiB0aGUgeHNkIGV4dGVybmFsbHkKLSAgICAgICAgaWYgKHNjaGVtYUxvY2F0aW9uICE9IG51bGwpCi0gICAgICAgICAgb3BlbkV4dGVybmFsRmlsZXMocGFnZSwgc2NoZW1hTG9jYXRpb24sIGZDb21wb25lbnQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuWFNERWRpdG9yKElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCwgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcG9uZW50KQotICB7Ci0gICAgb3BlblhTREVkaXRvcihlZGl0b3JJbnB1dCwgeHNkQ29tcG9uZW50LmdldFNjaGVtYSgpLCB4c2RDb21wb25lbnQpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW5YU0RFZGl0b3IoSUVkaXRvcklucHV0IGVkaXRvcklucHV0LCBYU0RTY2hlbWEgc2NoZW1hLCBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wb25lbnQpCi0gIHsKLSAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IG51bGw7Ci0gICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotICAgIHsKLSAgICAgIHBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgIH0KLQotICAgIFN0cmluZyByZXNvdXJjZSA9IHNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgIAotICAgIGlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dCAmJiByZXNvdXJjZSAhPSBudWxsICYmICFyZXNvdXJjZS5zdGFydHNXaXRoKCJodHRwIikpCi0gICAgewotICAgICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gVVJJSGVscGVyLnJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChyZXNvdXJjZSk7Ci0gICAgICBvcGVuV29ya3NwYWNlRmlsZShwYWdlLCBzY2hlbWFMb2NhdGlvbiwgeHNkQ29tcG9uZW50KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG9wZW5FeHRlcm5hbEZpbGVzKHBhZ2UsIHJlc291cmNlLCB4c2RDb21wb25lbnQpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW5JbmxpbmVTY2hlbWEoSUVkaXRvcklucHV0IGVkaXRvcklucHV0LCBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wb25lbnQsIFhTRFNjaGVtYSBzY2hlbWEsIFN0cmluZyBlZGl0b3JOYW1lKQotICB7Ci0gICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBudWxsOwotICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGlzV29ya3NwYWNlRmlsZSA9IGZhbHNlOwotICAgIAotICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiA9IHNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgIFN0cmluZyB3b3Jrc3BhY2VGaWxlTG9jYXRpb24gPSBVUklIZWxwZXIucmVtb3ZlUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKHNjaGVtYUxvY2F0aW9uKTsKLSAgICBJUGF0aCB3b3Jrc3BhY2VGaWxlUGF0aCA9IG5ldyBQYXRoKHdvcmtzcGFjZUZpbGVMb2NhdGlvbik7Ci0gICAgSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZSh3b3Jrc3BhY2VGaWxlUGF0aCk7Ci0gICAgCi0gICAgaWYgKHBhZ2UgIT0gbnVsbCAmJiBmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkKLSAgICB7Ci0gICAgICBpc1dvcmtzcGFjZUZpbGUgPSB0cnVlOyAgCi0gICAgfQotCi0gICAgaWYgKGlzV29ya3NwYWNlRmlsZSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG51bGw7Ci0gICAgICAgIFhTREZpbGVFZGl0b3JJbnB1dCB4c2RGaWxlRWRpdG9ySW5wdXQgPSBuZXcgWFNERmlsZUVkaXRvcklucHV0KGZpbGUsIHNjaGVtYSk7Ci0gICAgICAgIHhzZEZpbGVFZGl0b3JJbnB1dC5zZXRFZGl0b3JOYW1lKGVkaXRvck5hbWUpOwotICAgICAgICBJRWRpdG9yUmVmZXJlbmNlW10gcmVmcyA9IHBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotICAgICAgICBpbnQgbGVuZ3RoID0gcmVmcy5sZW5ndGg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBJRWRpdG9ySW5wdXQgaW5wdXQgPSByZWZzW2ldLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNERmlsZUVkaXRvcklucHV0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElGaWxlIGFGaWxlID0gKChYU0RGaWxlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRGaWxlKCk7Ci0gICAgICAgICAgICBpZiAoYUZpbGUuZ2V0RnVsbFBhdGgoKS5lcXVhbHMoZmlsZS5nZXRGdWxsUGF0aCgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCgoWFNERmlsZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U2NoZW1hKCkgPT0gc2NoZW1hKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZWRpdG9yUGFydCA9IHJlZnNbaV0uZ2V0RWRpdG9yKHRydWUpOwotICAgICAgICAgICAgICAgIHBhZ2UuYWN0aXZhdGUocmVmc1tpXS5nZXRQYXJ0KHRydWUpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZWRpdG9yUGFydCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZWRpdG9yUGFydCA9IHBhZ2Uub3BlbkVkaXRvcih4c2RGaWxlRWRpdG9ySW5wdXQsIFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQsIHRydWUsIDApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikKLSAgICAgICAgewotICAgICAgICAgIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIHhzZEVkaXRvciA9IChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikgZWRpdG9yUGFydDsKLSAgICAgICAgICB4c2RFZGl0b3Iub3Blbk9uR2xvYmFsUmVmZXJlbmNlKHhzZENvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoc2NoZW1hTG9jYXRpb24gIT0gbnVsbCAmJiAhc2NoZW1hTG9jYXRpb24uc3RhcnRzV2l0aCgiaHR0cCIpKQotICAgICAgewotICAgICAgICBTdHJpbmcgZmlsZUxvY2F0aW9uID0gVVJJSGVscGVyLnJlbW92ZVByb3RvY29sKHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgSVBhdGggc2NoZW1hUGF0aCA9IG5ldyBQYXRoKGZpbGVMb2NhdGlvbik7Ci0gICAgICAgIElGaWxlU3RvcmUgZmlsZVN0b3JlID0gRUZTLmdldExvY2FsRmlsZVN5c3RlbSgpLmdldFN0b3JlKHNjaGVtYVBhdGgpOwotICAgICAgICBpZiAoIWZpbGVTdG9yZS5mZXRjaEluZm8oKS5pc0RpcmVjdG9yeSgpICYmIGZpbGVTdG9yZS5mZXRjaEluZm8oKS5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEFEVEZpbGVTdG9yZUVkaXRvcklucHV0IHhzZEZpbGVTdG9yZUVkaXRvcklucHV0ID0gbmV3IEFEVEZpbGVTdG9yZUVkaXRvcklucHV0KGZpbGVTdG9yZSwgc2NoZW1hKTsKLSAgICAgICAgICAgIHhzZEZpbGVTdG9yZUVkaXRvcklucHV0LnNldEVkaXRvck5hbWUoZWRpdG9yTmFtZSk7Ci0KLSAgICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBudWxsOwotICAgICAgICAgICAgSUVkaXRvclJlZmVyZW5jZVtdIHJlZnMgPSBwYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSByZWZzLmxlbmd0aDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIElFZGl0b3JJbnB1dCBpbnB1dCA9IHJlZnNbaV0uZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgQURURmlsZVN0b3JlRWRpdG9ySW5wdXQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBVUkkgdXJpID0gKChBRFRGaWxlU3RvcmVFZGl0b3JJbnB1dCkgaW5wdXQpLmdldFVSSSgpOwotICAgICAgICAgICAgICAgIGlmICh1cmkuZXF1YWxzKHhzZEZpbGVTdG9yZUVkaXRvcklucHV0LmdldFVSSSgpKSAmJiAoKEFEVEZpbGVTdG9yZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U2NoZW1hKCkgPT0geHNkRmlsZVN0b3JlRWRpdG9ySW5wdXQuZ2V0U2NoZW1hKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZWRpdG9yUGFydCA9IHJlZnNbaV0uZ2V0RWRpdG9yKHRydWUpOwotICAgICAgICAgICAgICAgICAgcGFnZS5hY3RpdmF0ZShyZWZzW2ldLmdldFBhcnQodHJ1ZSkpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYWdlICE9IG51bGwgJiYgZWRpdG9yUGFydCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlZGl0b3JQYXJ0ID0gcGFnZS5vcGVuRWRpdG9yKHhzZEZpbGVTdG9yZUVkaXRvcklucHV0LCBYU0RFZGl0b3JQbHVnaW4uRURJVE9SX0lELCB0cnVlLCAwKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IgeHNkRWRpdG9yID0gKEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKSBlZGl0b3JQYXJ0OwotICAgICAgICAgICAgICB4c2RFZGl0b3Iub3Blbk9uR2xvYmFsUmVmZXJlbmNlKHhzZENvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpCi0gICAgICAgICAgewotCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG51bGw7Ci0gICAgICAgICAgSUVkaXRvclJlZmVyZW5jZVtdIHJlZnMgPSBwYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLSAgICAgICAgICBpbnQgbGVuZ3RoID0gcmVmcy5sZW5ndGg7Ci0gICAgICAgICAgLy8gTmVlZCB0byBmaW5kIGlmIGFuIGVkaXRvciBvbiB0aGF0IHNjaGVtYSBoYXMgYWxyZWFkeSBiZWVuIG9wZW5lZAotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gcmVmc1tpXS5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0IHhzZEZpbGVTdG9yYWdlRWRpdG9ySW5wdXQgPSAoQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQpIGlucHV0OwotICAgICAgICAgICAgICBpZiAoeHNkRmlsZVN0b3JhZ2VFZGl0b3JJbnB1dC5nZXRVcmxTdHJpbmcoKS5lcXVhbHMoc2NoZW1hTG9jYXRpb24pCi0gICAgICAgICAgICAgICAgICAmJiB4c2RGaWxlU3RvcmFnZUVkaXRvcklucHV0LmdldEVkaXRvcklEKCkuZXF1YWxzKFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZWRpdG9yUGFydCA9IHJlZnNbaV0uZ2V0RWRpdG9yKHRydWUpOwotICAgICAgICAgICAgICAgIHBhZ2UuYWN0aXZhdGUocmVmc1tpXS5nZXRQYXJ0KHRydWUpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZWRpdG9yUGFydCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0IHhzZEZpbGVTdG9yYWdlRWRpdG9ySW5wdXQgPSBuZXcgQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQoc2NoZW1hTG9jYXRpb24pOwotICAgICAgICAgICAgeHNkRmlsZVN0b3JhZ2VFZGl0b3JJbnB1dC5zZXRTY2hlbWEoc2NoZW1hKTsKLSAgICAgICAgICAgIHhzZEZpbGVTdG9yYWdlRWRpdG9ySW5wdXQuc2V0RWRpdG9yTmFtZShlZGl0b3JOYW1lKTsKLSAgICAgICAgICAgIHhzZEZpbGVTdG9yYWdlRWRpdG9ySW5wdXQuc2V0RWRpdG9ySUQoWFNERWRpdG9yUGx1Z2luLkVESVRPUl9JRCk7Ci0gICAgICAgICAgICBlZGl0b3JQYXJ0ID0gcGFnZS5vcGVuRWRpdG9yKHhzZEZpbGVTdG9yYWdlRWRpdG9ySW5wdXQsIFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQsIHRydWUsIDApOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIHhzZEVkaXRvciA9IChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikgZWRpdG9yUGFydDsKLSAgICAgICAgICAgIHhzZEVkaXRvci5vcGVuT25HbG9iYWxSZWZlcmVuY2UoeHNkQ29tcG9uZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBJRWRpdG9yUGFydCBnZXRFeGlzdGluZ0VkaXRvckZvcklubGluZVNjaGVtYShJV29ya2JlbmNoUGFnZSBwYWdlLCBJRmlsZSBzY2hlbWFGaWxlLCBYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgSUVkaXRvclJlZmVyZW5jZSBbXSByZWZzID0gcGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0gICAgaW50IGxlbmd0aCA9IHJlZnMubGVuZ3RoOwotICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIElFZGl0b3JJbnB1dCBpbnB1dCA9IHJlZnNbaV0uZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNERmlsZUVkaXRvcklucHV0KQotICAgICAgICB7Ci0gICAgICAgICAgSUZpbGUgYUZpbGUgPSAoKFhTREZpbGVFZGl0b3JJbnB1dClpbnB1dCkuZ2V0RmlsZSgpOwotICAgICAgICAgIGlmIChhRmlsZS5nZXRGdWxsUGF0aCgpLmVxdWFscyhzY2hlbWFGaWxlLmdldEZ1bGxQYXRoKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoKFhTREZpbGVFZGl0b3JJbnB1dClpbnB1dCkuZ2V0U2NoZW1hKCkgPT0gc2NoZW1hKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlZGl0b3JQYXJ0ID0gcmVmc1tpXS5nZXRFZGl0b3IodHJ1ZSk7Ci0gICAgICAgICAgICAgIHBhZ2UuYWN0aXZhdGUocmVmc1tpXS5nZXRQYXJ0KHRydWUpKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIGVkaXRvclBhcnQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgb3BlbldvcmtzcGFjZUZpbGUoSVdvcmtiZW5jaFBhZ2UgcGFnZSwgU3RyaW5nIHNjaGVtYUxvY2F0aW9uLCBYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wb25lbnQpCi0gIHsKLSAgICBJUGF0aCBzY2hlbWFQYXRoID0gbmV3IFBhdGgoc2NoZW1hTG9jYXRpb24pOwotICAgIElGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoc2NoZW1hUGF0aCk7Ci0gICAgaWYgKHBhZ2UgIT0gbnVsbCAmJiBmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IElERS5vcGVuRWRpdG9yKHBhZ2UsIGZpbGUsIHRydWUpOwotICAgICAgICBpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IgeHNkRWRpdG9yID0gKEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKSBlZGl0b3JQYXJ0OwotICAgICAgICAgIHhzZEVkaXRvci5vcGVuT25HbG9iYWxSZWZlcmVuY2UoeHNkQ29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkKLSAgICAgIHsKLQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuRXh0ZXJuYWxGaWxlcyhJV29ya2JlbmNoUGFnZSBwYWdlLCBTdHJpbmcgc2NoZW1hTG9jYXRpb24sIFhTRENvbmNyZXRlQ29tcG9uZW50IGZDb21wb25lbnQpCi0gIHsKLSAgICBJUGF0aCBzY2hlbWFQYXRoID0gbmV3IFBhdGgoc2NoZW1hTG9jYXRpb24pOyAgLy8gVVJJSGVscGVyLnJlbW92ZVByb3RvY29sKHNjaGVtYUxvY2F0aW9uKSk7Ci0gICAgU3RyaW5nIGRldmljZSA9IHNjaGVtYVBhdGguZ2V0RGV2aWNlKCk7Ci0gICAgaWYgKCFkZXZpY2Uuc3RhcnRzV2l0aCgiaHR0cCIpKQotICAgIHsKLSAgICAgIHNjaGVtYVBhdGggPSBuZXcgUGF0aChVUklIZWxwZXIucmVtb3ZlUHJvdG9jb2woc2NoZW1hTG9jYXRpb24pKTsKLSAgICB9Ci0gICAgSUZpbGVTdG9yZSBmaWxlU3RvcmUgPSBFRlMuZ2V0TG9jYWxGaWxlU3lzdGVtKCkuZ2V0U3RvcmUoc2NoZW1hUGF0aCk7Ci0gICAgVVJJIHNjaGVtYVVSSSA9IFVSSS5jcmVhdGUoc2NoZW1hTG9jYXRpb24pOwotICAgIGlmICghZmlsZVN0b3JlLmZldGNoSW5mbygpLmlzRGlyZWN0b3J5KCkgJiYgZmlsZVN0b3JlLmZldGNoSW5mbygpLmV4aXN0cygpKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gbnVsbDsKLSAgICAgICAgSUVkaXRvclJlZmVyZW5jZVtdIHJlZnMgPSBwYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLSAgICAgICAgaW50IGxlbmd0aCA9IHJlZnMubGVuZ3RoOwotICAgICAgICAvLyBOZWVkIHRvIGZpbmQgaWYgYW4gZWRpdG9yIG9uIHRoYXQgc2NoZW1hIGhhcyBhbHJlYWR5IGJlZW4gb3BlbmVkCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBJRWRpdG9ySW5wdXQgaW5wdXQgPSByZWZzW2ldLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZVN0b3JlRWRpdG9ySW5wdXQpCi0gICAgICAgICAgewotICAgICAgICAgICAgVVJJIHVyaSA9ICgoRmlsZVN0b3JlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRVUkkoKTsKLSAgICAgICAgICAgIGlmICh1cmkuZXF1YWxzKHNjaGVtYVVSSSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVkaXRvclBhcnQgPSByZWZzW2ldLmdldEVkaXRvcih0cnVlKTsKLSAgICAgICAgICAgICAgcGFnZS5hY3RpdmF0ZShyZWZzW2ldLmdldFBhcnQodHJ1ZSkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVkaXRvclBhcnQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGVkaXRvclBhcnQgPSBJREUub3BlbkVkaXRvck9uRmlsZVN0b3JlKHBhZ2UsIGZpbGVTdG9yZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikKLSAgICAgICAgewotICAgICAgICAgIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yIHhzZEVkaXRvciA9IChJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvcikgZWRpdG9yUGFydDsKLSAgICAgICAgICB4c2RFZGl0b3Iub3Blbk9uR2xvYmFsUmVmZXJlbmNlKGZDb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGllKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmIChkZXZpY2Uuc3RhcnRzV2l0aCgiaHR0cCIpKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG51bGw7Ci0gICAgICAgICAgICBJRWRpdG9yUmVmZXJlbmNlW10gcmVmcyA9IHBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotICAgICAgICAgICAgaW50IGxlbmd0aCA9IHJlZnMubGVuZ3RoOwotICAgICAgICAgICAgLy8gTmVlZCB0byBmaW5kIGlmIGFuIGVkaXRvciBvbiB0aGF0IHNjaGVtYSBoYXMgYWxyZWFkeSBiZWVuIG9wZW5lZAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gcmVmc1tpXS5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBBRFRSZWFkT25seUZpbGVFZGl0b3JJbnB1dCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0IHJlYWRPbmx5RWRpdG9ySW5wdXQgPSAoQURUUmVhZE9ubHlGaWxlRWRpdG9ySW5wdXQpIGlucHV0OwotICAgICAgICAgICAgICAgIGlmIChyZWFkT25seUVkaXRvcklucHV0LmdldFVybFN0cmluZygpLmVxdWFscyhzY2hlbWFMb2NhdGlvbikgJiYKLSAgICAgICAgICAgICAgICAgICAgWFNERWRpdG9yUGx1Z2luLkVESVRPUl9JRC5lcXVhbHMocmVhZE9ubHlFZGl0b3JJbnB1dC5nZXRFZGl0b3JJRCgpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBlZGl0b3JQYXJ0ID0gcmVmc1tpXS5nZXRFZGl0b3IodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICBwYWdlLmFjdGl2YXRlKHJlZnNbaV0uZ2V0UGFydCh0cnVlKSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlZGl0b3JQYXJ0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0IHJlYWRPbmx5U3RvcmFnZUVkaXRvcklucHV0ID0gbmV3IEFEVFJlYWRPbmx5RmlsZUVkaXRvcklucHV0KHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgcmVhZE9ubHlTdG9yYWdlRWRpdG9ySW5wdXQuc2V0RWRpdG9ySUQoWFNERWRpdG9yUGx1Z2luLkVESVRPUl9JRCk7Ci0gICAgICAgICAgICAgIGVkaXRvclBhcnQgPSBwYWdlLm9wZW5FZGl0b3IocmVhZE9ubHlTdG9yYWdlRWRpdG9ySW5wdXQsIFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQsIHRydWUsIDApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIEludGVybmFsWFNETXVsdGlQYWdlRWRpdG9yKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBJbnRlcm5hbFhTRE11bHRpUGFnZUVkaXRvciB4c2RFZGl0b3IgPSAoSW50ZXJuYWxYU0RNdWx0aVBhZ2VFZGl0b3IpIGVkaXRvclBhcnQ7Ci0gICAgICAgICAgICAgIHhzZEVkaXRvci5vcGVuT25HbG9iYWxSZWZlcmVuY2UoZkNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIEZpbGVTdG9yZUVkaXRvcklucHV0IHhzZEZpbGVTdG9yZUVkaXRvcklucHV0ID0gbmV3IEZpbGVTdG9yZUVkaXRvcklucHV0KGZpbGVTdG9yZSk7ICAgICAgICAKLSAgICAgICAgICBwYWdlLm9wZW5FZGl0b3IoeHNkRmlsZVN0b3JlRWRpdG9ySW5wdXQsIFhTREVkaXRvclBsdWdpbi5FRElUT1JfSUQsIHRydWUsIDApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgfQotICAgICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9TZXRNdWx0aXBsaWNpdHlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvU2V0TXVsdGlwbGljaXR5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMzk5NmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9TZXRNdWx0aXBsaWNpdHlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlNldE11bHRpcGxpY2l0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgU2V0TXVsdGlwbGljaXR5QWN0aW9uIGV4dGVuZHMgWFNEQmFzZUFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRVFVSVJFRF9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLlNldE11bHRpcGxpY2l0eS5SRVFVSVJFRF9JRCI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgWkVST19PUl9PTkVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9ucy5TZXRNdWx0aXBsaWNpdHkuWkVST19PUl9PTkVfSUQiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFpFUk9fT1JfTU9SRV9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLlNldE11bHRpcGxpY2l0eS5aRVJPX09SX01PUkVfSUQiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ORV9PUl9NT1JFX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuU2V0TXVsdGlwbGljaXR5Lk9ORV9PUl9NT1JFX0lEIjsgLy8kTk9OLU5MUy0xJAotICAKLSAgU2V0TXVsdGlwbGljaXR5Q29tbWFuZCBjb21tYW5kOwotICAKLSAgcHVibGljIFNldE11bHRpcGxpY2l0eUFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0LCBTdHJpbmcgbGFiZWwsIFN0cmluZyBJRCkKLSAgewotICAgIHN1cGVyKHBhcnQpOwotICAgIHNldFRleHQobGFiZWwpOwotICAgIHNldElkKElEKTsKLSAgICBjb21tYW5kID0gbmV3IFNldE11bHRpcGxpY2l0eUNvbW1hbmQobGFiZWwpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNYXhPY2N1cnMoaW50IGkpCi0gIHsKLSAgICBjb21tYW5kLnNldE1heE9jY3VycyhpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1pbk9jY3VycyhpbnQgaSkKLSAgewotICAgIGNvbW1hbmQuc2V0TWluT2NjdXJzKGkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBjYWxjdWxhdGVFbmFibGVkKCkKLSAgewotICAgIGJvb2xlYW4gc3RhdGUgPSBzdXBlci5jYWxjdWxhdGVFbmFibGVkKCk7Ci0gICAgaWYgKHN0YXRlKQotICAgIHsKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbmNyZXRlQ29tcG9uZW50ID0gZ2V0WFNESW5wdXQoKTsKLSAgICAgIGlmICh4c2RDb25jcmV0ZUNvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICEoKFhTREVsZW1lbnREZWNsYXJhdGlvbil4c2RDb25jcmV0ZUNvbXBvbmVudCkuaXNHbG9iYWwoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHhzZENvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICEoKChYU0RNb2RlbEdyb3VwKXhzZENvbmNyZXRlQ29tcG9uZW50KS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0ZTsKLSAgfQotICAKLSAgcHJpdmF0ZSBYU0RDb25jcmV0ZUNvbXBvbmVudCBnZXRYU0RJbnB1dCgpCi0gIHsKLSAgICBPYmplY3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29uY3JldGVDb21wb25lbnQgPSBudWxsOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RCYXNlQWRhcHRlcikKLSAgICB7Ci0gICAgICB4c2RDb25jcmV0ZUNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkoKFhTREJhc2VBZGFwdGVyKSBzZWxlY3Rpb24pLmdldFRhcmdldCgpOwotICAgIH0KLSAgICByZXR1cm4geHNkQ29uY3JldGVDb21wb25lbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29uY3JldGVDb21wb25lbnQgPSBnZXRYU0RJbnB1dCgpOwotICAgIGlmICh4c2RDb25jcmV0ZUNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGNvbW1hbmQuc2V0WFNEQ29uY3JldGVDb21wb25lbnQoeHNkQ29uY3JldGVDb21wb25lbnQpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvU2V0VHlwZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9TZXRUeXBlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiODc5YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9TZXRUeXBlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5TZXRUeXBlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTZXRUeXBlQWN0aW9uIGV4dGVuZHMgWFNEQmFzZUFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfTkVXX1RZUEVfSUQgPSAiU2V0VHlwZUFjdGlvbl9BZGRUeXBlIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfRVhJU1RJTkdfVFlQRV9JRCA9ICJTZXRUeXBlQWN0aW9uX0V4aXN0aW5nVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotICBTZXRUeXBlQ29tbWFuZCBjb21tYW5kOwotCi0gIHB1YmxpYyBTZXRUeXBlQWN0aW9uKFN0cmluZyBsYWJlbCwgU3RyaW5nIElELCBJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgc3VwZXIocGFydCk7Ci0gICAgc2V0VGV4dChsYWJlbCk7Ci0gICAgc2V0SWQoSUQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIE9iamVjdCBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgewotICAgICAgT2JqZWN0IHRhcmdldCA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0KLSAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgY29tbWFuZCA9IG5ldyBTZXRUeXBlQ29tbWFuZChnZXRUZXh0KCksIGdldElkKCksIChYU0RDb25jcmV0ZUNvbXBvbmVudCkgdGFyZ2V0KTsKLSAgICAgICAgY29tbWFuZC5zZXRBZGFwdGVyKChYU0RCYXNlQWRhcHRlcikgc2VsZWN0aW9uKTsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2FjdGlvbnMvWFNEQmFzZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9YU0RCYXNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZGY0M2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vYWN0aW9ucy9YU0RCYXNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5hY3Rpb25zLkJhc2VTZWxlY3Rpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZGVzaWduLmVkaXRwYXJ0cy5CYXNlRmllbGRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRlc2lnbi5lZGl0cGFydHMuVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFhTREJhc2VBY3Rpb24gZXh0ZW5kcyBCYXNlU2VsZWN0aW9uQWN0aW9uCi17Ci0gIFhTRENvbmNyZXRlQ29tcG9uZW50IGFkZGVkQ29tcG9uZW50OwotCi0gIHB1YmxpYyBYU0RCYXNlQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJ0KTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGNhbGN1bGF0ZUVuYWJsZWQoKQotICB7Ci0gICAgaWYgKGdldFdvcmtiZW5jaFBhcnQoKSBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KQotICAgIHsKLSAgICAgIElFZGl0b3JQYXJ0IG93bmluZ0VkaXRvciA9IChJRWRpdG9yUGFydClnZXRXb3JrYmVuY2hQYXJ0KCk7Ci0gICAgICAKLSAgICAgIE9iamVjdCBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgWFNEQmFzZUFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvbiA9ICgoWFNEQmFzZUFkYXB0ZXIpIHNlbGVjdGlvbikuZ2V0VGFyZ2V0KCk7Ci0gICAgICB9Ci0gICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gbnVsbDsKLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgeHNkU2NoZW1hID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClzZWxlY3Rpb24pLmdldFNjaGVtYSgpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwgJiYgeHNkU2NoZW1hID09IG93bmluZ0VkaXRvci5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcykpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGRvRWRpdChPYmplY3Qgb2JqLCBJV29ya2JlbmNoUGFydCBwYXJ0KQotICB7Ci0gICAgaWYgKG9iaiBpbnN0YW5jZW9mIFRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQpCi0gICAgewotICAgICAgVG9wTGV2ZWxDb21wb25lbnRFZGl0UGFydCBlZGl0UGFydCA9IChUb3BMZXZlbENvbXBvbmVudEVkaXRQYXJ0KW9iajsKLSAgICAgIGlmIChhZGRlZENvbXBvbmVudCA9PSAoKFhTREJhc2VBZGFwdGVyKWVkaXRQYXJ0LmdldE1vZGVsKCkpLmdldFRhcmdldCgpKQotICAgICAgewotICAgICAgICBlZGl0UGFydC5zZXRTY3JvbGwodHJ1ZSk7Ci0gICAgICAgIGVkaXRQYXJ0LmFkZEZlZWRiYWNrKCk7Ci0gICAgICAgIGVkaXRQYXJ0LmRvRWRpdE5hbWUoIShwYXJ0IGluc3RhbmNlb2YgQ29udGVudE91dGxpbmUpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQmFzZUZpZWxkRWRpdFBhcnQpCi0gICAgewotICAgICAgQmFzZUZpZWxkRWRpdFBhcnQgZWRpdFBhcnQgPSAoQmFzZUZpZWxkRWRpdFBhcnQpb2JqOwotICAgICAgZWRpdFBhcnQuZG9FZGl0TmFtZSghKHBhcnQgaW5zdGFuY2VvZiBDb250ZW50T3V0bGluZSkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRG9jdW1lbnRhdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZERvY3VtZW50YXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NjJlY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRG9jdW1lbnRhdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEFkZERvY3VtZW50YXRpb25Db21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEQW5ub3RhdGlvbiB4c2RBbm5vdGF0aW9uOwotICBYU0RDb25jcmV0ZUNvbXBvbmVudCBpbnB1dDsKLSAgU3RyaW5nIG5ld1ZhbHVlLCBvbGRWYWx1ZTsKLSAgYm9vbGVhbiBkb2N1bWVudGF0aW9uRXhpc3RzOwotICBFbGVtZW50IGRvY3VtZW50YXRpb25FbGVtZW50OwotCi0gIHB1YmxpYyBBZGREb2N1bWVudGF0aW9uQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTREFubm90YXRpb24geHNkQW5ub3RhdGlvbiwgWFNEQ29uY3JldGVDb21wb25lbnQgaW5wdXQsIFN0cmluZyBuZXdWYWx1ZSwgU3RyaW5nIG9sZFZhbHVlKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkQW5ub3RhdGlvbiA9IHhzZEFubm90YXRpb247Ci0gICAgdGhpcy5pbnB1dCA9IGlucHV0OwotICAgIHRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTsKLSAgICB0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICB7Ci0gICAgICBlbnN1cmVTY2hlbWFFbGVtZW50KChYU0RTY2hlbWEpaW5wdXQpOwotICAgIH0KLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhpbnB1dC5nZXRFbGVtZW50KCkpOwotCi0gICAgICB4c2RBbm5vdGF0aW9uID0gWFNEQ29tbW9uVUlVdGlscy5nZXRJbnB1dFhTREFubm90YXRpb24oaW5wdXQsIHRydWUpOwotICAgICAgRWxlbWVudCBlbGVtZW50ID0geHNkQW5ub3RhdGlvbi5nZXRFbGVtZW50KCk7Ci0KLSAgICAgIExpc3QgZG9jdW1lbnRhdGlvbkxpc3QgPSB4c2RBbm5vdGF0aW9uLmdldFVzZXJJbmZvcm1hdGlvbigpOwotICAgICAgZG9jdW1lbnRhdGlvbkVsZW1lbnQgPSBudWxsOwotICAgICAgZG9jdW1lbnRhdGlvbkV4aXN0cyA9IGZhbHNlOwotICAgICAgaWYgKGRvY3VtZW50YXRpb25MaXN0LnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGRvY3VtZW50YXRpb25FeGlzdHMgPSB0cnVlOwotICAgICAgICBkb2N1bWVudGF0aW9uRWxlbWVudCA9IChFbGVtZW50KSBkb2N1bWVudGF0aW9uTGlzdC5nZXQoMCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkb2N1bWVudGF0aW9uRWxlbWVudCA9PSBudWxsKQotICAgICAgewotICAgICAgICBkb2N1bWVudGF0aW9uRWxlbWVudCA9IHhzZEFubm90YXRpb24uY3JlYXRlVXNlckluZm9ybWF0aW9uKG51bGwpOwotICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgICAgZm9ybWF0Q2hpbGQoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgICAvLyBEZWZlY3QgaW4gbW9kZWwuLi4uSSBjcmVhdGUgaXQgYnV0IHRoZSBtb2RlbCBvYmplY3QgZG9lc24ndCBhcHBlYXIKLSAgICAgICAgLy8gdG8gYmUgdXBkYXRlZAotICAgICAgICB4c2RBbm5vdGF0aW9uLnVwZGF0ZUVsZW1lbnQoKTsKLSAgICAgICAgeHNkQW5ub3RhdGlvbi5zZXRFbGVtZW50KGVsZW1lbnQpOwotICAgICAgfQotCi0gICAgICBpZiAoZG9jdW1lbnRhdGlvbkVsZW1lbnQuaGFzQ2hpbGROb2RlcygpKQotICAgICAgewotICAgICAgICBpZiAoZG9jdW1lbnRhdGlvbkVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIElET01FbGVtZW50IGRvbUVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIGRvY3VtZW50YXRpb25FbGVtZW50OwotCi0gICAgICAgICAgTm9kZSBmaXJzdENoaWxkID0gZG9jdW1lbnRhdGlvbkVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAgIE5vZGUgbGFzdENoaWxkID0gZG9jdW1lbnRhdGlvbkVsZW1lbnQuZ2V0TGFzdENoaWxkKCk7Ci0gICAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgICBpbnQgZW5kID0gMDsKLQotICAgICAgICAgIC8vIElET01Nb2RlbCBtb2RlbCA9IGRvbUVsZW1lbnQuZ2V0TW9kZWwoKTsKLSAgICAgICAgICAvLyBJRE9NRG9jdW1lbnQgZG9jID0gbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICBJRE9NTm9kZSBmaXJzdCA9IG51bGw7Ci0gICAgICAgICAgaWYgKGZpcnN0Q2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmaXJzdCA9IChJRE9NTm9kZSkgZmlyc3RDaGlsZDsKLSAgICAgICAgICAgIHN0YXJ0ID0gZmlyc3QuZ2V0U3RhcnRPZmZzZXQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGxhc3RDaGlsZCBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElET01Ob2RlIGxhc3QgPSAoSURPTU5vZGUpIGxhc3RDaGlsZDsKLSAgICAgICAgICAgIGVuZCA9IGxhc3QuZ2V0RW5kT2Zmc2V0KCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGRvbUVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBvbGRWYWx1ZSA9IGRvbUVsZW1lbnQuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXQoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLSAgICAgICAgICAgIGRvbUVsZW1lbnQuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dChkb2N1bWVudGF0aW9uRWxlbWVudCwgc3RhcnQsIGVuZCAtIHN0YXJ0LCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBvbGRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgTm9kZSBjaGlsZE5vZGUgPSBkb2N1bWVudGF0aW9uRWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUobmV3VmFsdWUpOwotICAgICAgICAgIGRvY3VtZW50YXRpb25FbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkTm9kZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLQotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdW5kbygpCi0gIHsKLSAgICBzdXBlci51bmRvKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZEVudW1lcmF0aW9uc0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZEVudW1lcmF0aW9uc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhjMmE1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRFbnVtZXJhdGlvbnNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERW51bWVyYXRpb25GYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hQnVpbGRpbmdUb29sczsKLQotcHVibGljIGNsYXNzIEFkZEVudW1lcmF0aW9uc0NvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlOwotICBTdHJpbmcgdmFsdWU7Ci0gIAotICBwdWJsaWMgQWRkRW51bWVyYXRpb25zQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGUpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5zaW1wbGVUeXBlID0gc2ltcGxlVHlwZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgdGhpcy52YWx1ZSA9IHZhbHVlOyAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoc2ltcGxlVHlwZS5nZXRFbGVtZW50KCkpOwotICAgICAgWFNERmFjdG9yeSBmYWN0b3J5ID0gWFNEU2NoZW1hQnVpbGRpbmdUb29scy5nZXRYU0RGYWN0b3J5KCk7Ci0gICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1lcmF0aW9uRmFjZXQgPSBmYWN0b3J5LmNyZWF0ZVhTREVudW1lcmF0aW9uRmFjZXQoKTsKLSAgICAgIGVudW1lcmF0aW9uRmFjZXQuc2V0TGV4aWNhbFZhbHVlKHZhbHVlKTsKLSAgICAgIHNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChlbnVtZXJhdGlvbkZhY2V0KTsKLSAgICAgIGZvcm1hdENoaWxkKHNpbXBsZVR5cGUuZ2V0RWxlbWVudCgpKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRFeHRlbnNpYmlsaXR5RWxlbWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0N2Y1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRFeHRlbnNpYmlsaXR5RWxlbWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5TcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRFeHRlbnNpYmlsaXR5RWxlbWVudENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBFbGVtZW50IGlucHV0LCBlbGVtZW50VG9BZGQ7Ci0gIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIGV4dGVuc2lvblNjaGVtYVNwZWM7Ci0KLSAgcHVibGljIEFkZEV4dGVuc2liaWxpdHlFbGVtZW50Q29tbWFuZChTdHJpbmcgbGFiZWwsIEVsZW1lbnQgaW5wdXQsIEVsZW1lbnQgZWxlbWVudFRvQWRkKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgICB0aGlzLmVsZW1lbnRUb0FkZCA9IGVsZW1lbnRUb0FkZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgc3VwZXIuZXhlY3V0ZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGlucHV0KTsKLSAgICAgIGFkZEVsZW1lbnQoKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVuZG8oKQotICB7Ci0gICAgc3VwZXIudW5kbygpOwotICAgIC8vIFRPRE8KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNjaGVtYVByb3BlcnRpZXMoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgYXBwSW5mb1NjaGVtYVNwZWMpCi0gIHsKLSAgICB0aGlzLmV4dGVuc2lvblNjaGVtYVNwZWMgPSBhcHBJbmZvU2NoZW1hU3BlYzsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhZGRFbGVtZW50KCkKLSAgewotICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIERvY3VtZW50IGRvYyA9IGlucHV0LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgIFN0cmluZyBuYW1lID0gZWxlbWVudFRvQWRkLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50TlMoZXh0ZW5zaW9uU2NoZW1hU3BlYy5nZXROYW1lc3BhY2VVUkkoKSwgbmFtZSk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBpbnB1dC5nZXRQcmVmaXgoKTsKLSAgICAgICAgcm9vdEVsZW1lbnQuc2V0UHJlZml4KHByZWZpeCk7Ci0gICAgICAgIFN0cmluZyB4bWxucyA9IChwcmVmaXggPT0gbnVsbCB8fCBwcmVmaXguZXF1YWxzKCIiKSkgPyAieG1sbnMiIDogInhtbG5zOiIgKyBwcmVmaXg7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgICAgIEF0dHIgbnNVUklBdHRyaWJ1dGUgPSBkb2MuY3JlYXRlQXR0cmlidXRlKHhtbG5zKTsKLSAgICAgICAgbnNVUklBdHRyaWJ1dGUuc2V0VmFsdWUoZXh0ZW5zaW9uU2NoZW1hU3BlYy5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUobnNVUklBdHRyaWJ1dGUpOwotICAgICAgICBpbnB1dC5hcHBlbmRDaGlsZChyb290RWxlbWVudCk7Ci0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLQotICAgICAgfQotCi0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZEV4dGVuc2lvbkF0dHJpYnV0ZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZEV4dGVuc2lvbkF0dHJpYnV0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU2NjE2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRFeHRlbnNpb25BdHRyaWJ1dGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUluZm9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEFkZEV4dGVuc2lvbkF0dHJpYnV0ZUNvbW1hbmQgZXh0ZW5kcyBBZGRFeHRlbnNpb25Db21tYW5kCi17Ci0gIHByaXZhdGUgc3RhdGljIERPTU5hbWVzcGFjZUluZm9NYW5hZ2VyIG1hbmFnZXIgPSBuZXcgRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIoKTsKLSAgcHJpdmF0ZSBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyaWJ1dGU7Ci0gIHByaXZhdGUgYm9vbGVhbiBhcHBJbmZvQXR0cmlidXRlQWRkZWQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBTdHJpbmcgYXR0cmlidXRlUU5hbWU7Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVByZWZpeDsKLQotICBwdWJsaWMgQWRkRXh0ZW5zaW9uQXR0cmlidXRlQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCwKLSAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKLSAgICB0aGlzLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoY29tcG9uZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBzdXBlci5leGVjdXRlKCk7Ci0gICAgICBuYW1lc3BhY2VQcmVmaXggPSBoYW5kbGVOYW1lc3BhY2VQcmVmaWNlcygpOwotCi0gICAgICBhdHRyaWJ1dGVRTmFtZSA9IG5hbWVzcGFjZVByZWZpeCArICI6IiArIGF0dHJpYnV0ZS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIFN0cmluZyB2YWx1ZSA9IGNvbXBvbmVudC5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZVFOYW1lKTsKLSAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBhcHBJbmZvQXR0cmlidXRlQWRkZWQgPSB0cnVlOwotICAgICAgICBjb21wb25lbnQuZ2V0RWxlbWVudCgpLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVRTmFtZSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1bmRvKCkKLSAgewotICAgIHN1cGVyLnVuZG8oKTsKLSAgICBpZiAoYXBwSW5mb0F0dHJpYnV0ZUFkZGVkKXsKLSAgICAgIGNvbXBvbmVudC5nZXRFbGVtZW50KCkucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZVFOYW1lKTsKLSAgICB9Ci0gIH0KLQotICAvKiogQ3JlYXRlIGEgbmFtZXNwYWNlIHByZWZpeCBpZiBuZWVkZWQsIG90aGVyIHdpc2UgcmV0cmlldmUgCi0gICAqIGEgcHJlZGVmaW5lZCBuYW1lc3BhY2UgcHJlZml4Ci0gICAqIEByZXR1cm4gICAqLwotICBwcml2YXRlIFN0cmluZyBoYW5kbGVOYW1lc3BhY2VQcmVmaWNlcygpCi0gIHsKLSAgICBFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSBjb21wb25lbnQuZ2V0U2NoZW1hKCkuZ2V0RWxlbWVudCgpOwotICAgIFN0cmluZyBwcmVmaXggPSBudWxsOwotICAgIAotICAgIC8vIElmIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIGF0dHJpYnV0ZSBhbHJlYWR5IGV4aXN0cwotICAgIExpc3QgbmFtZXNwYWNlUHJlZmljZXMgPSBtYW5hZ2VyLmdldE5hbWVzcGFjZUluZm9MaXN0KHNjaGVtYUVsZW1lbnQpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXNwYWNlUHJlZmljZXMuc2l6ZSgpOyBpKyspewotICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIG5hbWVzcGFjZVByZWZpY2VzLmdldChpKTsKLSAgICAgIGlmICggaW5mby51cmkuZXF1YWxzKGF0dHJpYnV0ZS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpIHsKLSAgICAgICAgcHJlZml4ID0gaW5mby5wcmVmaXg7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIENyZWF0ZSB1bnF1aWUgbmFtZXNwYWNlIHByZWZpeAotICAgIGlmICggcHJlZml4ID09IG51bGwpewotICAgICAgcHJlZml4ID0gY3JlYXRlVW5pcXVlUHJlZml4KGNvbXBvbmVudCk7Ci0gICAgfQotCi0gICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oYXR0cmlidXRlLmdldFRhcmdldE5hbWVzcGFjZSgpLCBwcmVmaXgsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIExpc3QgaW5mb0xpc3QgPSBuZXcgQXJyYXlMaXN0KDEpOwotICAgIGluZm9MaXN0LmFkZChpbmZvKTsKLSAgICBtYW5hZ2VyLmFkZE5hbWVzcGFjZUluZm8oc2NoZW1hRWxlbWVudCwgaW5mb0xpc3QsIGZhbHNlKTsKLSAgICByZXR1cm4gcHJlZml4OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZVVuaXF1ZVByZWZpeChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBTdHJpbmcgcHJlZml4ID0gInAiOyAvLyROT04tTkxTLTEkCi0gICAgTWFwIHByZWZNYXBwZXIgPSBjb21wb25lbnQuZ2V0U2NoZW1hKCkuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpOwotICAgIGlmICggcHJlZk1hcHBlci5nZXQocHJlZml4KSAhPSBudWxsKXsKLSAgICAgIGludCBpID0gMTsKLSAgICAgIHdoaWxlICggcHJlZk1hcHBlci5nZXQocHJlZml4ICsgaSkgIT0gbnVsbCkKLSAgICAgICAgaSsrOwotICAgICAgcHJlZml4ICs9IGk7Ci0gICAgfQotICAgIHJldHVybiBwcmVmaXg7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRXh0ZW5zaW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRXh0ZW5zaW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjcyMTA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZEV4dGVuc2lvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5TcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEFkZEV4dGVuc2lvbkNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBwcm90ZWN0ZWQgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgZXh0ZW5zaW9uc1NjaGVtYVNwZWM7Ci0gIHByb3RlY3RlZCBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQ7Ci0KLSAgcHJvdGVjdGVkIEFkZEV4dGVuc2lvbkNvbW1hbmQoU3RyaW5nIGxhYmVsKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2NoZW1hUHJvcGVydGllcyhTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBhcHBJbmZvU2NoZW1hU3BlYykKLSAgewotICAgIHRoaXMuZXh0ZW5zaW9uc1NjaGVtYVNwZWMgPSBhcHBJbmZvU2NoZW1hU3BlYzsKLSAgfQotICAKLSAgcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgewotICAgICAgZW5zdXJlU2NoZW1hRWxlbWVudCgoWFNEU2NoZW1hKWNvbXBvbmVudCk7Ci0gICAgfQotICAgIAotICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgfQotICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRFeHRlbnNpb25FbGVtZW50Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkRXh0ZW5zaW9uRWxlbWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYxYTIxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRFeHRlbnNpb25FbGVtZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5TcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQWRkRXh0ZW5zaW9uRWxlbWVudENvbW1hbmQgZXh0ZW5kcyBBZGRFeHRlbnNpb25Db21tYW5kCi17Ci0gIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50OwotICBFbGVtZW50IGFwcEluZm87Ci0gIEVsZW1lbnQgbmV3RWxlbWVudDsKLQotICBwdWJsaWMgQWRkRXh0ZW5zaW9uRWxlbWVudENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RDb25jcmV0ZUNvbXBvbmVudCBpbnB1dCwgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5jb21wb25lbnQgPSBpbnB1dDsKLSAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhjb21wb25lbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICAgIGFkZEFubm90YXRpb25TZXQoY29tcG9uZW50LmdldFNjaGVtYSgpLCBleHRlbnNpb25zU2NoZW1hU3BlYyk7Ci0gICAgICBmb3JtYXRDaGlsZChjb21wb25lbnQuZ2V0RWxlbWVudCgpKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVuZG8oKQotICB7Ci0gICAgc3VwZXIudW5kbygpOwotICAgIFhTREFubm90YXRpb24geHNkQW5ub3RhdGlvbiA9IFhTRENvbW1vblVJVXRpbHMuZ2V0SW5wdXRYU0RBbm5vdGF0aW9uKGNvbXBvbmVudCwgZmFsc2UpOwotICAgIHhzZEFubm90YXRpb24uZ2V0RWxlbWVudCgpLnJlbW92ZUNoaWxkKGFwcEluZm8pOwotICAgIExpc3QgYXBwSW5mb3MgPSB4c2RBbm5vdGF0aW9uLmdldEFwcGxpY2F0aW9uSW5mb3JtYXRpb24oKTsKLSAgICBhcHBJbmZvcy5yZW1vdmUoYXBwSW5mbyk7Ci0gICAgeHNkQW5ub3RhdGlvbi51cGRhdGVFbGVtZW50KCk7Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNjaGVtYVByb3BlcnRpZXMoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc3BlYykKLSAgewotICAgIHRoaXMuZXh0ZW5zaW9uc1NjaGVtYVNwZWMgPSBzcGVjOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkQW5ub3RhdGlvblNldChYU0RTY2hlbWEgeHNkU2NoZW1hLCBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzcGVjKQotICB7Ci0gICAgWFNEQW5ub3RhdGlvbiB4c2RBbm5vdGF0aW9uID0gWFNEQ29tbW9uVUlVdGlscy5nZXRJbnB1dFhTREFubm90YXRpb24oY29tcG9uZW50LCB0cnVlKTsKLSAgICBhZGRBbm5vdGF0aW9uU2V0KHNwZWMsIHhzZEFubm90YXRpb24pOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFkZEFubm90YXRpb25TZXQoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc3BlYywgWFNEQW5ub3RhdGlvbiB4c2RBbm5vdGF0aW9uKQotICB7ICAgICAKLSAgICBYU0RTY2hlbWEgc2NoZW1hPSB4c2RBbm5vdGF0aW9uLmdldFNjaGVtYSgpOwotICAgIEVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IHNjaGVtYS5nZXRFbGVtZW50KCk7Ci0KLSAgICBpZiAoeHNkQW5ub3RhdGlvbi5nZXRBcHBsaWNhdGlvbkluZm9ybWF0aW9uKCkuc2l6ZSgpID09IDApCi0gICAgewotICAgICAgYXBwSW5mbyA9IHhzZEFubm90YXRpb24uY3JlYXRlQXBwbGljYXRpb25JbmZvcm1hdGlvbihudWxsKTsKLSAgICAgIHhzZEFubm90YXRpb24uZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKGFwcEluZm8pOwotICAgICAgTGlzdCBhcHBJbmZvcyA9IHhzZEFubm90YXRpb24uZ2V0QXBwbGljYXRpb25JbmZvcm1hdGlvbigpOwotICAgICAgYXBwSW5mb3MuYWRkKGFwcEluZm8pOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gdXNlIHRoZSBmaXJzdCBhcHBJbmZvCi0gICAgICBhcHBJbmZvID0gKEVsZW1lbnQpeHNkQW5ub3RhdGlvbi5nZXRBcHBsaWNhdGlvbkluZm9ybWF0aW9uKCkuZ2V0KDApOwotICAgIH0KLQotICAgIFN0cmluZyBwcmVmaXggPSBhZGROYW1lc3BhY2VEZWNsYXJhdGlvbklmUmVxdWlyZWQoc2NoZW1hRWxlbWVudCwgInAiLCBzcGVjLmdldE5hbWVzcGFjZVVSSSgpKTsKLQotICAgIGlmIChhcHBJbmZvICE9IG51bGwpCi0gICAgewotICAgICAgRG9jdW1lbnQgZG9jID0gYXBwSW5mby5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgIAotICAgICAgbmV3RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50TlMoc3BlYy5nZXROYW1lc3BhY2VVUkkoKSwgZWxlbWVudC5nZXROYW1lKCkpOwotICAgICAgbmV3RWxlbWVudC5zZXRQcmVmaXgocHJlZml4KTsgICAKLSAgICAgIGFwcEluZm8uYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7Ci0KLSAgICAgIHhzZEFubm90YXRpb24udXBkYXRlRWxlbWVudCgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkKLSAgewotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci0gIAotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlVW5pcXVlUHJlZml4KFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgewotICAgIFN0cmluZyBwcmVmaXggPSAicCI7IC8vJE5PTi1OTFMtMSQKLSAgICBNYXAgcHJlZk1hcHBlciA9IGNvbXBvbmVudC5nZXRTY2hlbWEoKS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgaWYgKCBwcmVmTWFwcGVyLmdldChwcmVmaXgpICE9IG51bGwpewotICAgICAgaW50IGkgPSAxOwotICAgICAgd2hpbGUgKCBwcmVmTWFwcGVyLmdldChwcmVmaXggKyBpKSAhPSBudWxsKQotICAgICAgICBpKys7Ci0gICAgICBwcmVmaXggKz0gaTsKLSAgICB9Ci0gICAgcmV0dXJuIHByZWZpeDsKLSAgfSAgCi0gIAotICAvLyBUT0RPLi4uIGNvbW1vbiB0aGlzIHVwIHdpdGggd3NkbC51aQotICBwcml2YXRlIFN0cmluZyBhZGROYW1lc3BhY2VEZWNsYXJhdGlvbklmUmVxdWlyZWQoRWxlbWVudCBzY2hlbWFFbGVtZW50LCBTdHJpbmcgcHJlZml4SGludCwgU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIFN0cmluZyBwcmVmaXggPSBudWxsOyAgICAgIAotICAgIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlID0gbmV3IE5hbWVzcGFjZVRhYmxlKHNjaGVtYUVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgICBuYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50KHNjaGVtYUVsZW1lbnQpOwotICAgIHByZWZpeCA9IG5hbWVzcGFjZVRhYmxlLmdldFByZWZpeEZvclVSSShuYW1lc3BhY2UpOwotICAgIGlmIChwcmVmaXggPT0gbnVsbCkKLSAgICB7IAotICAgICAgU3RyaW5nIGJhc2VQcmVmaXggPSBwcmVmaXhIaW50OwotICAgICAgcHJlZml4ID0gYmFzZVByZWZpeDsKLSAgICAgIFN0cmluZyB4bWxuc0NvbG9uID0gInhtbG5zOiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0geG1sbnNDb2xvbiArIHByZWZpeDsKLSAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICB3aGlsZSAoc2NoZW1hRWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY291bnQrKzsKLSAgICAgICAgcHJlZml4ID0gYmFzZVByZWZpeCArIGNvdW50OwotICAgICAgICBhdHRyaWJ1dGVOYW1lID0geG1sbnNDb2xvbiArIHByZWZpeDsKLSAgICAgIH0gICAgICAKLSAgICAgIHNjaGVtYUVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIG5hbWVzcGFjZSk7ICAKLSAgICB9ICAgIAotICAgIHJldHVybiBwcmVmaXg7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREFueUF0dHJpYnV0ZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREFueUF0dHJpYnV0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExY2JjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RBbnlBdHRyaWJ1dGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLQotcHVibGljIGNsYXNzIEFkZFhTREFueUF0dHJpYnV0ZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uOwotICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24geHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotICBYU0RDb25jcmV0ZUNvbXBvbmVudCBpbnB1dDsKLQotICBwdWJsaWMgQWRkWFNEQW55QXR0cmlidXRlQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RDb21wbGV4VHlwZURlZmluaXRpb24gPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb247Ci0gICAgdGhpcy5pbnB1dCA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbjsgCi0gIH0KLSAgCi0gIHB1YmxpYyBBZGRYU0RBbnlBdHRyaWJ1dGVDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiA9IHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLSAgICB0aGlzLmlucHV0ID0geHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGlucHV0LmdldEVsZW1lbnQoKSk7Ci0KLSAgICAgIFhTRFdpbGRjYXJkIGFueUF0dHJpYnV0ZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFdpbGRjYXJkKCk7Ci0gICAgICBpZiAoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5zZXRBdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQoYW55QXR0cmlidXRlKTsKLSAgICAgICAgZm9ybWF0Q2hpbGQoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldEVsZW1lbnQoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgeHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLnNldEF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudChhbnlBdHRyaWJ1dGUpOwotICAgICAgICBmb3JtYXRDaGlsZCh4c2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICAgIH0KLSAgICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSBhbnlBdHRyaWJ1dGU7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQW55RWxlbWVudENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREFueUVsZW1lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiODhhNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQW55RWxlbWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9zaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUJ1aWxkaW5nVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RBbnlFbGVtZW50Q29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTRE1vZGVsR3JvdXAgcGFyZW50OwotICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGU7Ci0gIGJvb2xlYW4gZG9DcmVhdGVNb2RlbEdyb3VwRm9yQ29tcGxleFR5cGUgPSBmYWxzZTsKLQotICBwdWJsaWMgQWRkWFNEQW55RWxlbWVudENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RNb2RlbEdyb3VwIHBhcmVudCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q29tcGxleFR5cGUoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlKQotICB7Ci0gICAgdGhpcy5jb21wbGV4VHlwZSA9IGNvbXBsZXhUeXBlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXREb0NyZWF0ZU1vZGVsR3JvdXBGb3JDb21wbGV4VHlwZShib29sZWFuIGRvQ3JlYXRlKQotICB7Ci0gICAgdGhpcy5kb0NyZWF0ZU1vZGVsR3JvdXBGb3JDb21wbGV4VHlwZSA9IGRvQ3JlYXRlOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgY3JlYXRlTW9kZWxHcm91cCgpCi0gIHsKLSAgICBYU0RGYWN0b3J5IGZhY3RvcnkgPSBYU0RTY2hlbWFCdWlsZGluZ1Rvb2xzLmdldFhTREZhY3RvcnkoKTsKLSAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IGZhY3RvcnkuY3JlYXRlWFNEUGFydGljbGUoKTsKLSAgICBwYXJlbnQgPSBmYWN0b3J5LmNyZWF0ZVhTRE1vZGVsR3JvdXAoKTsKLSAgICBwYXJlbnQuc2V0Q29tcG9zaXRvcihYU0RDb21wb3NpdG9yLlNFUVVFTkNFX0xJVEVSQUwpOwotICAgIHBhcnRpY2xlLnNldENvbnRlbnQocGFyZW50KTsKLSAgICBjb21wbGV4VHlwZS5zZXRDb250ZW50KHBhcnRpY2xlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKGRvQ3JlYXRlTW9kZWxHcm91cEZvckNvbXBsZXhUeXBlKQotICAgICAgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGNvbXBsZXhUeXBlKTsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoY29tcGxleFR5cGUuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgY3JlYXRlTW9kZWxHcm91cCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyhwYXJlbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIH0KLSAgICAgIFhTRFdpbGRjYXJkIHdpbGRDYXJkID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEV2lsZGNhcmQoKTsKLSAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEUGFydGljbGUoKTsKLSAgICAgIHBhcnRpY2xlLnNldENvbnRlbnQod2lsZENhcmQpOwotICAgICAgcGFyZW50LmdldENvbnRlbnRzKCkuYWRkKHBhcnRpY2xlKTsKLSAgICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSB3aWxkQ2FyZDsKLSAgICAgIGZvcm1hdENoaWxkKHBhcmVudC5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjZhN2M2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGNsYXNzIEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZURlZmluaXRpb247Ci0gIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cDsKLSAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50OwotICBib29sZWFuIGlzUmVmZXJlbmNlOwotICBwcml2YXRlIFN0cmluZyBuYW1lVG9BZGQ7Ci0KLSAgcHVibGljIEFkZFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RDb21wbGV4VHlwZURlZmluaXRpb24gPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyBBZGRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbkNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKHBhcmVudCA9PSBudWxsKQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgaWYgKCFpc1JlZmVyZW5jZSkKLSAgICAgICAgewotICAgICAgICAgIGF0dHJpYnV0ZS5zZXROYW1lKGdldE5ld05hbWUobmFtZVRvQWRkID09IG51bGwgPyAiTmV3QXR0cmlidXRlIiA6IG5hbWVUb0FkZCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgYXR0cmlidXRlLnNldFR5cGVEZWZpbml0aW9uKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRTY2hlbWEoKS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oInN0cmluZyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGF0dHJpYnV0ZS5zZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKHNldEdsb2JhbEF0dHJpYnV0ZVJlZmVyZW5jZSh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0U2NoZW1hKCkpKTsKLSAgICAgICAgfQotICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgYXR0cmlidXRlVXNlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEQXR0cmlidXRlVXNlKCk7Ci0gICAgICAgIGF0dHJpYnV0ZVVzZS5zZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyaWJ1dGUpOwotICAgICAgICBhdHRyaWJ1dGVVc2Uuc2V0Q29udGVudChhdHRyaWJ1dGUpOwotCi0gICAgICAgIGlmICh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0QXR0cmlidXRlQ29udGVudHMoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuYWRkKGF0dHJpYnV0ZVVzZSk7Ci0gICAgICAgICAgZm9ybWF0Q2hpbGQoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gKFhTRFNjaGVtYSkgcGFyZW50OwotICAgICAgICAgIGF0dHJpYnV0ZSA9IGNyZWF0ZUdsb2JhbFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKHhzZFNjaGVtYSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc1JlZmVyZW5jZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGUuc2V0VHlwZURlZmluaXRpb24ocGFyZW50LmdldFNjaGVtYSgpLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbigic3RyaW5nIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSAoKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgcGFyZW50KS5nZXRSZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpLmdldEF0dHJpYnV0ZVVzZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RBdHRyaWJ1dGVVc2UgdXNlID0gKFhTREF0dHJpYnV0ZVVzZSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgIGxpc3QuYWRkKHVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF0dHJpYnV0ZS5zZXROYW1lKFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUoIk5ld0F0dHJpYnV0ZSIsIGxpc3QpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgYXR0cmlidXRlLnNldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oc2V0R2xvYmFsQXR0cmlidXRlUmVmZXJlbmNlKHBhcmVudC5nZXRTY2hlbWEoKSkpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIFhTREF0dHJpYnV0ZVVzZSBhdHRyaWJ1dGVVc2UgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RBdHRyaWJ1dGVVc2UoKTsKLSAgICAgICAgICBhdHRyaWJ1dGVVc2Uuc2V0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cmlidXRlKTsKLSAgICAgICAgICBhdHRyaWJ1dGVVc2Uuc2V0Q29udGVudChhdHRyaWJ1dGUpOwotCi0gICAgICAgICAgKChYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24pIHBhcmVudCkuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKS5nZXRDb250ZW50cygpLmFkZChhdHRyaWJ1dGVVc2UpOwotICAgICAgICAgIGZvcm1hdENoaWxkKHBhcmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IGF0dHJpYnV0ZTsKLSAgfQotCi0gIEFycmF5TGlzdCBuYW1lczsKLQotICBwdWJsaWMgdm9pZCBzZXROYW1lVG9BZGQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBuYW1lVG9BZGQgPSBuYW1lOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXROZXdOYW1lKFN0cmluZyBkZXNjcmlwdGlvbikKLSAgewotICAgIEFycmF5TGlzdCB1c2VkQXR0cmlidXRlTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgdXNlZEF0dHJpYnV0ZU5hbWVzLmFkZEFsbChYU0RDb21tb25VSVV0aWxzLmdldEFsbEF0dHJpYnV0ZXMoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKSk7Ci0gICAgdXNlZEF0dHJpYnV0ZU5hbWVzLmFkZEFsbChYU0RDb21tb25VSVV0aWxzLmdldEluaGVyaXRlZEF0dHJpYnV0ZXMoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKSk7Ci0gICAgcmV0dXJuIFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUoZGVzY3JpcHRpb24sIHVzZWRBdHRyaWJ1dGVOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlKGJvb2xlYW4gaXNSZWZlcmVuY2UpCi0gIHsKLSAgICB0aGlzLmlzUmVmZXJlbmNlID0gaXNSZWZlcmVuY2U7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBjcmVhdGVHbG9iYWxYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbihYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgZW5zdXJlU2NoZW1hRWxlbWVudCh4c2RTY2hlbWEpOwotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgYXR0cmlidXRlLnNldFR5cGVEZWZpbml0aW9uKHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oInN0cmluZyIpKTsgLy8kTk9OLU5MUy0xJAotICAgIGF0dHJpYnV0ZS5zZXROYW1lKFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUobmFtZVRvQWRkID09IG51bGwgPyAiTmV3QXR0cmlidXRlIiA6IG5hbWVUb0FkZCwgeHNkU2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBUZXh0IHRleHROb2RlID0geHNkU2NoZW1hLmdldERvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoIlxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKHRleHROb2RlKTsKLSAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQoYXR0cmlidXRlKTsKLSAgICByZXR1cm4gYXR0cmlidXRlOwotICB9Ci0KLSAgcHJvdGVjdGVkIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHNldEdsb2JhbEF0dHJpYnV0ZVJlZmVyZW5jZShYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgTGlzdCBsaXN0ID0geHNkU2NoZW1hLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucygpOwotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHJlZmVyZW5jZWRBdHRyaWJ1dGUgPSBudWxsOwotICAgIGJvb2xlYW4gaXNVc2VyRGVmaW5lZCA9IGZhbHNlOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0gICAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIG9iajsKLSAgICAgICAgaWYgKCFYU0RDb25zdGFudHMuU0NIRU1BX0lOU1RBTkNFX1VSSV8yMDAxLmVxdWFscyhhdHRyLmdldFRhcmdldE5hbWVzcGFjZSgpKSkKLSAgICAgICAgewotICAgICAgICAgIHJlZmVyZW5jZWRBdHRyaWJ1dGUgPSBhdHRyOwotICAgICAgICAgIGlzVXNlckRlZmluZWQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICghaXNVc2VyRGVmaW5lZCkKLSAgICB7Ci0gICAgICByZWZlcmVuY2VkQXR0cmlidXRlID0gY3JlYXRlR2xvYmFsWFNEQXR0cmlidXRlRGVjbGFyYXRpb24oeHNkU2NoZW1hKTsKLSAgICAgIFRleHQgdGV4dE5vZGUgPSB4c2RTY2hlbWEuZ2V0RG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZSgiXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgeHNkU2NoZW1hLmdldEVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7Ci0gICAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQocmVmZXJlbmNlZEF0dHJpYnV0ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlZmVyZW5jZWRBdHRyaWJ1dGU7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWU1NzVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuWFNEQ29tbW9uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25Db21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLSAgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLQotICBwdWJsaWMgQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RDb21wbGV4VHlwZURlZmluaXRpb24gPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb247Ci0gIH0KLQotICBwdWJsaWMgQWRkWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyaWJ1dGVHcm91cCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICh4c2RTY2hlbWEgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIGF0dHJpYnV0ZUdyb3VwLnNldE5hbWUoZ2V0TmV3TmFtZSgiQXR0cmlidXRlR3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBMaXN0IGxpc3QgPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0U2NoZW1hKCkuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpOwotICAgICAgICBpZiAobGlzdC5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgYXR0cmlidXRlR3JvdXAuc2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgbGlzdC5nZXQoMCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGF0dHJpYnV0ZUdyb3VwLnNldE5hbWUobnVsbCk7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwMiA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbigpOwotICAgICAgICAgIGF0dHJpYnV0ZUdyb3VwMi5zZXROYW1lKFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUoIk5ld0F0dHJpYnV0ZUdyb3VwIiwgeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldFNjaGVtYSgpLmdldEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMoKSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldFNjaGVtYSgpLmdldENvbnRlbnRzKCkuYWRkKGF0dHJpYnV0ZUdyb3VwMik7Ci0gICAgICAgICAgYXR0cmlidXRlR3JvdXAuc2V0UmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oYXR0cmlidXRlR3JvdXAyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0QXR0cmlidXRlQ29udGVudHMoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuYWRkKGF0dHJpYnV0ZUdyb3VwKTsKLSAgICAgICAgfQotICAgICAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gYXR0cmlidXRlR3JvdXA7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGVuc3VyZVNjaGVtYUVsZW1lbnQoeHNkU2NoZW1hKTsKLSAgICAgICAgLy8gcHV0IHRoaXMgYWZ0ZXIsIHNpbmNlIHdlIGRvbid0IGhhdmUgYSBET00gbm9kZSB5ZXQKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkU2NoZW1hLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIGF0dHJpYnV0ZUdyb3VwLnNldE5hbWUoWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZSgiTmV3QXR0cmlidXRlR3JvdXAiLCB4c2RTY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgVGV4dCB0ZXh0Tm9kZSA9IHhzZFNjaGVtYS5nZXREb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHhzZFNjaGVtYS5nZXRFbGVtZW50KCkuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOwotICAgICAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQoYXR0cmlidXRlR3JvdXApOwotICAgICAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gYXR0cmlidXRlR3JvdXA7Ci0gICAgICB9Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLQotICBBcnJheUxpc3QgbmFtZXM7Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXROZXdOYW1lKFN0cmluZyBkZXNjcmlwdGlvbikKLSAgewotICAgIFN0cmluZyBjYW5kaWRhdGVOYW1lID0gIk5ldyIgKyBkZXNjcmlwdGlvbjsgLy8kTk9OLU5MUy0xJAotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLSAgICBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpbnQgaSA9IDE7Ci0gICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBwYXJlbnQ7Ci0gICAgICB3YWxrVXBJbmhlcml0YW5jZShjdCk7Ci0KLSAgICAgIGJvb2xlYW4gcmVhZHkgPSBmYWxzZTsKLSAgICAgIHdoaWxlICghcmVhZHkpCi0gICAgICB7Ci0gICAgICAgIHJlYWR5ID0gdHJ1ZTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbmFtZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGNhbmRpZGF0ZU5hbWUuZXF1YWxzKGF0dHJOYW1lKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZWFkeSA9IGZhbHNlOwotICAgICAgICAgICAgY2FuZGlkYXRlTmFtZSA9ICJOZXciICsgZGVzY3JpcHRpb24gKyBTdHJpbmcudmFsdWVPZihpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaSsrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gY2FuZGlkYXRlTmFtZTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB3YWxrVXBJbmhlcml0YW5jZShYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QpCi0gIHsKLSAgICB1cGRhdGVOYW1lcyhjdCk7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZiA9IGN0LmdldEJhc2VUeXBlRGVmaW5pdGlvbigpOwotICAgIGlmIChjdCAhPSBjdC5nZXRSb290VHlwZSgpKQotICAgIHsKLSAgICAgIGlmICh0eXBlRGVmIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3QyID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgdHlwZURlZjsKLSAgICAgICAgd2Fsa1VwSW5oZXJpdGFuY2UoY3QyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdXBkYXRlTmFtZXMoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0KQotICB7Ci0gICAgSXRlcmF0b3IgaXRlciA9IGN0LmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZVVzZSkKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlVXNlIHVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpIG9iajsKLSAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IHVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKGF0dHJOYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lcy5hZGQoYXR0ck5hbWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTYzNmNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hQnVpbGRpbmdUb29sczsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIHByb3RlY3RlZCBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQ7Ci0gIHByb3RlY3RlZCBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3JlYXRlZENvbXBsZXhUeXBlOwotICBwcml2YXRlIFN0cmluZyBuYW1lVG9BZGQ7Ci0gIAotICBwdWJsaWMgQWRkWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmFtZVRvQWRkKFN0cmluZyBuYW1lVG9BZGQpCi0gIHsKLSAgICB0aGlzLm5hbWVUb0FkZCA9IG5hbWVUb0FkZDsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQjZXhlY3V0ZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKHBhcmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgWFNERmFjdG9yeSBmYWN0b3J5ID0gWFNEU2NoZW1hQnVpbGRpbmdUb29scy5nZXRYU0RGYWN0b3J5KCk7Ci0gICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSBmYWN0b3J5LmNyZWF0ZVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotICAgICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IGNvbXBsZXhUeXBlOwotICAgICAgU3RyaW5nIG5ld05hbWUgPSBnZXROZXdOYW1lKG5hbWVUb0FkZCA9PSBudWxsID8gIk5ld0NvbXBsZXhUeXBlIiA6IG5hbWVUb0FkZCwgcGFyZW50LmdldFNjaGVtYSgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgY29tcGxleFR5cGUuc2V0TmFtZShuZXdOYW1lKTsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IChYU0RTY2hlbWEpIHBhcmVudDsKLSAgICAgICAgICBlbnN1cmVTY2hlbWFFbGVtZW50KHhzZFNjaGVtYSk7Ci0gICAgICAgICAgVGV4dCB0ZXh0Tm9kZSA9IHhzZFNjaGVtYS5nZXREb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgeHNkU2NoZW1hLmdldEVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7Ci0gICAgICAgICAgeHNkU2NoZW1hLmdldENvbnRlbnRzKCkuYWRkKGNvbXBsZXhUeXBlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBwYXJlbnQpLnNldEFub255bW91c1R5cGVEZWZpbml0aW9uKGNvbXBsZXhUeXBlKTsKLSAgICAgICAgZm9ybWF0Q2hpbGQocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICB9Ci0gICAgICBjcmVhdGVkQ29tcGxleFR5cGUgPSBjb21wbGV4VHlwZTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0TmV3TmFtZShTdHJpbmcgZGVzY3JpcHRpb24sIFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBTdHJpbmcgY2FuZGlkYXRlTmFtZSA9IGRlc2NyaXB0aW9uOyAvLyROT04tTkxTLTEkCi0gICAgaW50IGkgPSAxOwotCi0gICAgTGlzdCBsaXN0ID0gc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpOwotICAgIExpc3QgbGlzdE9mTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZiA9IChYU0RUeXBlRGVmaW5pdGlvbikgaXRlci5uZXh0KCk7Ci0gICAgICBTdHJpbmcgbmFtZSA9IHR5cGVEZWYuZ2V0TmFtZSgpOwotICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAodHlwZURlZi5nZXRUYXJnZXROYW1lc3BhY2UoKSA9PSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpCi0gICAgICAgIGxpc3RPZk5hbWVzLmFkZChuYW1lKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGZsYWcgPSB0cnVlOwotICAgIHdoaWxlIChmbGFnKQotICAgIHsKLSAgICAgIGlmICghbGlzdE9mTmFtZXMuY29udGFpbnMoY2FuZGlkYXRlTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGZsYWcgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYW5kaWRhdGVOYW1lID0gZGVzY3JpcHRpb24gKyBTdHJpbmcudmFsdWVPZihpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaSsrOwotICAgIH0KLQotICAgIHJldHVybiBjYW5kaWRhdGVOYW1lOwotICB9Ci0KLSAgcHVibGljIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBnZXRDcmVhdGVkQ29tcGxleFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZWRDb21wbGV4VHlwZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNERWxlbWVudENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREVsZW1lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OGY3MzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNERWxlbWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9zaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUJ1aWxkaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGNsYXNzIEFkZFhTREVsZW1lbnRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLSAgWFNETW9kZWxHcm91cERlZmluaXRpb24geHNkTW9kZWxHcm91cERlZmluaXRpb247Ci0gIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cDsKLSAgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgYm9vbGVhbiBpc1JlZmVyZW5jZTsKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZVRvQWRkOwotCi0gIHB1YmxpYyBBZGRYU0RFbGVtZW50Q29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIEFkZFhTREVsZW1lbnRDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbiA9IHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLSAgICB4c2RNb2RlbEdyb3VwID0gZ2V0TW9kZWxHcm91cCh4c2RDb21wbGV4VHlwZURlZmluaXRpb24pOwotICB9Ci0KLSAgcHVibGljIEFkZFhTREVsZW1lbnRDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNETW9kZWxHcm91cERlZmluaXRpb24geHNkTW9kZWxHcm91cERlZmluaXRpb24pCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RNb2RlbEdyb3VwRGVmaW5pdGlvbiA9IHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uOwotICAgIHhzZE1vZGVsR3JvdXAgPSBnZXRNb2RlbEdyb3VwKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uKTsKLSAgfQotICAKLSAgcHVibGljIEFkZFhTREVsZW1lbnRDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwLCBYU0RDb21wbGV4VHlwZURlZmluaXRpb24geHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkTW9kZWxHcm91cCA9IHhzZE1vZGVsR3JvdXA7Ci0gICAgdGhpcy54c2RDb21wbGV4VHlwZURlZmluaXRpb24gPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb247Ci0gIH0KLQotICBwdWJsaWMgQWRkWFNERWxlbWVudENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXApCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RNb2RlbEdyb3VwID0geHNkTW9kZWxHcm91cDsKLSAgfQotCi0gIHB1YmxpYyBBZGRYU0RFbGVtZW50Q29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2UoYm9vbGVhbiBpc1JlZmVyZW5jZSkKLSAgewotICAgIHRoaXMuaXNSZWZlcmVuY2UgPSBpc1JlZmVyZW5jZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmFtZVRvQWRkKFN0cmluZyBuYW1lKXsKLQkgIG5hbWVUb0FkZCA9IG5hbWU7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQjZXhlY3V0ZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkU2NoZW1hLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gY3JlYXRlR2xvYmFsWFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgICAgIFRleHQgdGV4dE5vZGUgPSB4c2RTY2hlbWEuZ2V0RG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZSgiXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKHRleHROb2RlKTsKLSAgICAgICAgeHNkU2NoZW1hLmdldENvbnRlbnRzKCkuYWRkKGVsZW1lbnQpOwotICAgICAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gZWxlbWVudDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGJlZ2luUmVjb3JkaW5nKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIGlmICh4c2RNb2RlbEdyb3VwID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RGYWN0b3J5IGZhY3RvcnkgPSBYU0RTY2hlbWFCdWlsZGluZ1Rvb2xzLmdldFhTREZhY3RvcnkoKTsKLSAgICAgICAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IGZhY3RvcnkuY3JlYXRlWFNEUGFydGljbGUoKTsKLSAgICAgICAgICB4c2RNb2RlbEdyb3VwID0gZmFjdG9yeS5jcmVhdGVYU0RNb2RlbEdyb3VwKCk7Ci0gICAgICAgICAgeHNkTW9kZWxHcm91cC5zZXRDb21wb3NpdG9yKFhTRENvbXBvc2l0b3IuU0VRVUVOQ0VfTElURVJBTCk7Ci0gICAgICAgICAgcGFydGljbGUuc2V0Q29udGVudCh4c2RNb2RlbEdyb3VwKTsKLSAgICAgICAgICB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5zZXRNb2RlbEdyb3VwKHhzZE1vZGVsR3JvdXApOwotICAgICAgICB9Ci0gICAgICAgIHhzZFNjaGVtYSA9IHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldFNjaGVtYSgpOwotICAgICAgICBpZiAoIWlzUmVmZXJlbmNlKQotICAgICAgICB7Ci0gICAgICAgICAgeHNkTW9kZWxHcm91cC5nZXRDb250ZW50cygpLmFkZChjcmVhdGVYU0RFbGVtZW50RGVjbGFyYXRpb25Gb3JNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgeHNkTW9kZWxHcm91cC5nZXRDb250ZW50cygpLmFkZChjcmVhdGVYU0RFbGVtZW50UmVmZXJlbmNlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGZvcm1hdENoaWxkKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldEVsZW1lbnQoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh4c2RNb2RlbEdyb3VwICE9IG51bGwgJiYgKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbiA9PSBudWxsIHx8IHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uID09IG51bGwpICkKLSAgICAgIHsKLSAgICAgICAgeHNkU2NoZW1hID0geHNkTW9kZWxHcm91cC5nZXRTY2hlbWEoKTsKLSAgICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkU2NoZW1hLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIGlmICghaXNSZWZlcmVuY2UpCi0gICAgICAgIHsKLSAgICAgICAgICB4c2RNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGNyZWF0ZVhTREVsZW1lbnREZWNsYXJhdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB4c2RNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGNyZWF0ZVhTREVsZW1lbnRSZWZlcmVuY2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9ybWF0Q2hpbGQoeHNkTW9kZWxHcm91cC5nZXRFbGVtZW50KCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB4c2RTY2hlbWEgPSB4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0U2NoZW1hKCk7Ci0gICAgICAgIGJlZ2luUmVjb3JkaW5nKHhzZFNjaGVtYS5nZXRFbGVtZW50KCkpOwotICAgICAgICBpZiAoeHNkTW9kZWxHcm91cCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERmFjdG9yeSBmYWN0b3J5ID0gWFNEU2NoZW1hQnVpbGRpbmdUb29scy5nZXRYU0RGYWN0b3J5KCk7Ci0gICAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSBmYWN0b3J5LmNyZWF0ZVhTRFBhcnRpY2xlKCk7Ci0gICAgICAgICAgeHNkTW9kZWxHcm91cCA9IGZhY3RvcnkuY3JlYXRlWFNETW9kZWxHcm91cCgpOwotICAgICAgICAgIHhzZE1vZGVsR3JvdXAuc2V0Q29tcG9zaXRvcihYU0RDb21wb3NpdG9yLlNFUVVFTkNFX0xJVEVSQUwpOwotICAgICAgICAgIHBhcnRpY2xlLnNldENvbnRlbnQoeHNkTW9kZWxHcm91cCk7Ci0gICAgICAgICAgeHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLnNldENvbnRlbnQocGFydGljbGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghaXNSZWZlcmVuY2UpCi0gICAgICAgIHsKLSAgICAgICAgICB4c2RNb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGNyZWF0ZVhTREVsZW1lbnREZWNsYXJhdGlvbkZvckNvbXBsZXhUeXBlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHhzZE1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5hZGQoY3JlYXRlWFNERWxlbWVudFJlZmVyZW5jZSgpKTsKLSAgICAgICAgfQotICAgICAgICBmb3JtYXRDaGlsZCh4c2RDb21wbGV4VHlwZURlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIFhTRFBhcnRpY2xlIGNyZWF0ZVhTREVsZW1lbnREZWNsYXJhdGlvbigpCi0gIHsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlID0geHNkTW9kZWxHcm91cC5nZXRTY2hlbWEoKS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oInN0cmluZyIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREVsZW1lbnREZWNsYXJhdGlvbigpOwotCi0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcCA9IHhzZE1vZGVsR3JvdXAuZ2V0Q29udGFpbmVyKCk7Ci0gICAgQXJyYXlMaXN0IHVzZWRBdHRyaWJ1dGVOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB1c2VkQXR0cmlidXRlTmFtZXMuYWRkQWxsKFhTRENvbW1vblVJVXRpbHMuZ2V0Q2hpbGRFbGVtZW50cyh4c2RNb2RlbEdyb3VwKSk7ICAgIAotICAgIHdoaWxlIChjb21wICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgdXNlZEF0dHJpYnV0ZU5hbWVzLmFkZEFsbChYU0RDb21tb25VSVV0aWxzLmdldEFsbEF0dHJpYnV0ZXMoKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKWNvbXApKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjb21wIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICB1c2VkQXR0cmlidXRlTmFtZXMuYWRkQWxsKFhTRENvbW1vblVJVXRpbHMuZ2V0QWxsQXR0cmlidXRlcygoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKWNvbXApKTsKLSAgICAgICAgdXNlZEF0dHJpYnV0ZU5hbWVzLmFkZEFsbChYU0RDb21tb25VSVV0aWxzLmdldEluaGVyaXRlZEF0dHJpYnV0ZXMoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiljb21wKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY29tcCA9IGNvbXAuZ2V0Q29udGFpbmVyKCk7Ci0gICAgfQotICAgIGVsZW1lbnQuc2V0TmFtZShYU0RDb21tb25VSVV0aWxzLmNyZWF0ZVVuaXF1ZUVsZW1lbnROYW1lKAotICAgIAkJbmFtZVRvQWRkID09IG51bGwgPyAiTmV3RWxlbWVudCIgOiBuYW1lVG9BZGQgLCB1c2VkQXR0cmlidXRlTmFtZXMpKTsgLy8kTk9OLU5MUy0xJAotICAgIGVsZW1lbnQuc2V0VHlwZURlZmluaXRpb24odHlwZSk7Ci0KLSAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFBhcnRpY2xlKCk7Ci0gICAgcGFydGljbGUuc2V0Q29udGVudChlbGVtZW50KTsKLSAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gZWxlbWVudDsKLSAgICByZXR1cm4gcGFydGljbGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgWFNEUGFydGljbGUgY3JlYXRlWFNERWxlbWVudFJlZmVyZW5jZSgpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSB4c2RNb2RlbEdyb3VwLmdldFNjaGVtYSgpLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKTsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gcmVmZXJlbmNlZEVsZW1lbnQgPSBudWxsOwotICAgIGlmIChsaXN0LnNpemUoKSA+IDApCi0gICAgewotICAgICAgcmVmZXJlbmNlZEVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKWxpc3QuZ2V0KDApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVmZXJlbmNlZEVsZW1lbnQgPSBjcmVhdGVHbG9iYWxYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgIFRleHQgdGV4dE5vZGUgPSB4c2RTY2hlbWEuZ2V0RG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZSgiXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgeHNkU2NoZW1hLmdldEVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7Ci0gICAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQocmVmZXJlbmNlZEVsZW1lbnQpOwotICAgIH0KLQotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgCi0gICAgZWxlbWVudC5zZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbihyZWZlcmVuY2VkRWxlbWVudCk7Ci0gICAgWFNEUGFydGljbGUgcGFydGljbGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RQYXJ0aWNsZSgpOwotICAgIHBhcnRpY2xlLnNldENvbnRlbnQoZWxlbWVudCk7Ci0gICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IGVsZW1lbnQ7Ci0gICAgcmV0dXJuIHBhcnRpY2xlOwotICB9Ci0KLSAgcHJvdGVjdGVkIFhTRFBhcnRpY2xlIGNyZWF0ZVhTREVsZW1lbnREZWNsYXJhdGlvbkZvckNvbXBsZXhUeXBlKCkKLSAgewotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGUgPSB4c2RNb2RlbEdyb3VwLmdldFNjaGVtYSgpLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbigic3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0KLSAgICBBcnJheUxpc3QgdXNlZEF0dHJpYnV0ZU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHVzZWRBdHRyaWJ1dGVOYW1lcy5hZGRBbGwoWFNEQ29tbW9uVUlVdGlscy5nZXRBbGxBdHRyaWJ1dGVzKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbikpOwotICAgIHVzZWRBdHRyaWJ1dGVOYW1lcy5hZGRBbGwoWFNEQ29tbW9uVUlVdGlscy5nZXRJbmhlcml0ZWRBdHRyaWJ1dGVzKHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbikpOwotICAgIGVsZW1lbnQuc2V0TmFtZShYU0RDb21tb25VSVV0aWxzLmNyZWF0ZVVuaXF1ZUVsZW1lbnROYW1lKAotICAgIAkJbmFtZVRvQWRkID09IG51bGwgPyAiTmV3RWxlbWVudCIgOiBuYW1lVG9BZGQgLCB1c2VkQXR0cmlidXRlTmFtZXMpKTsgLy8kTk9OLU5MUy0xJAotICAgIGVsZW1lbnQuc2V0VHlwZURlZmluaXRpb24odHlwZSk7Ci0KLSAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFBhcnRpY2xlKCk7Ci0gICAgcGFydGljbGUuc2V0Q29udGVudChlbGVtZW50KTsKLSAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gZWxlbWVudDsKLSAgICByZXR1cm4gcGFydGljbGU7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBYU0RQYXJ0aWNsZSBjcmVhdGVYU0RFbGVtZW50RGVjbGFyYXRpb25Gb3JNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKQotICB7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZSA9IHhzZE1vZGVsR3JvdXAuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hRm9yU2NoZW1hKCkucmVzb2x2ZVNpbXBsZVR5cGVEZWZpbml0aW9uKCJzdHJpbmciKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLQotICAgIEFycmF5TGlzdCB1c2VkQXR0cmlidXRlTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgdXNlZEF0dHJpYnV0ZU5hbWVzLmFkZEFsbChYU0RDb21tb25VSVV0aWxzLmdldEFsbEF0dHJpYnV0ZXMoeHNkTW9kZWxHcm91cERlZmluaXRpb24pKTsKLSAgICBlbGVtZW50LnNldE5hbWUoWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZSgKLSAgICAgICAgbmFtZVRvQWRkID09IG51bGwgPyAiTmV3RWxlbWVudCIgOiBuYW1lVG9BZGQgLCB1c2VkQXR0cmlidXRlTmFtZXMpKTsgLy8kTk9OLU5MUy0xJAotICAgIGVsZW1lbnQuc2V0VHlwZURlZmluaXRpb24odHlwZSk7Ci0KLSAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFBhcnRpY2xlKCk7Ci0gICAgcGFydGljbGUuc2V0Q29udGVudChlbGVtZW50KTsKLSAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gZWxlbWVudDsKLSAgICByZXR1cm4gcGFydGljbGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgWFNERWxlbWVudERlY2xhcmF0aW9uIGNyZWF0ZUdsb2JhbFhTREVsZW1lbnREZWNsYXJhdGlvbigpCi0gIHsKLSAgICBlbnN1cmVTY2hlbWFFbGVtZW50KHhzZFNjaGVtYSk7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZSA9IHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oInN0cmluZyIpOyAvLyROT04tTkxTLTEkCi0gICAgWFNERmFjdG9yeSBmYWN0b3J5ID0gWFNEU2NoZW1hQnVpbGRpbmdUb29scy5nZXRYU0RGYWN0b3J5KCk7Ci0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZVhTREVsZW1lbnREZWNsYXJhdGlvbigpOwotCi0gICAgZWxlbWVudC5zZXROYW1lKFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUoCi0gICAgCQluYW1lVG9BZGQgPT0gbnVsbCA/ICJOZXdFbGVtZW50IiA6IG5hbWVUb0FkZCAsIHhzZFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkpKTsgLy8kTk9OLU5MUy0xJAotICAgIGVsZW1lbnQuc2V0VHlwZURlZmluaXRpb24odHlwZSk7Ci0KLSAgICByZXR1cm4gZWxlbWVudDsKLSAgfQotICAKLSAgcHVibGljIFhTRE1vZGVsR3JvdXAgZ2V0TW9kZWxHcm91cChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBtb2RlbEdyb3VwRGVmKQotICB7Ci0gICAgcmV0dXJuIG1vZGVsR3JvdXBEZWYuZ2V0TW9kZWxHcm91cCgpOwotICB9Ci0KLSAgLy9QT1JUCi0gIHB1YmxpYyBYU0RNb2RlbEdyb3VwIGdldE1vZGVsR3JvdXAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNUeXBlKQotICB7Ci0gICAgWFNEUGFydGljbGUgcGFydGljbGUgPSBudWxsOwotCi0gICAgWFNEQ29tcGxleFR5cGVDb250ZW50IHhzZENvbXBsZXhUeXBlQ29udGVudCA9IGNUeXBlLmdldENvbnRlbnQoKTsKLSAgICBpZiAoeHNkQ29tcGxleFR5cGVDb250ZW50IGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgewotICAgICAgcGFydGljbGUgPSAoWFNEUGFydGljbGUpeHNkQ29tcGxleFR5cGVDb250ZW50OwotICAgIH0KLSAgICAKLSAgICBpZiAocGFydGljbGUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgT2JqZWN0IHBhcnRpY2xlQ29udGVudCA9IHBhcnRpY2xlLmdldENvbnRlbnQoKTsKLSAgICBYU0RNb2RlbEdyb3VwIGdyb3VwID0gbnVsbDsKLQotICAgIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBncm91cCA9ICgoWFNETW9kZWxHcm91cERlZmluaXRpb24pIHBhcnRpY2xlQ29udGVudCkuZ2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbigpLmdldE1vZGVsR3JvdXAoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICB7Ci0gICAgICBncm91cCA9IChYU0RNb2RlbEdyb3VwKSBwYXJ0aWNsZUNvbnRlbnQ7Ci0gICAgfQotCi0gICAgaWYgKGdyb3VwID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0vLyAgICBpZiAoZ3JvdXAuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkgfHwgZ3JvdXAuZVJlc291cmNlKCkgIT0gY1R5cGUuZVJlc291cmNlKCkpCi0vLyAgICB7Ci0vLyAgICAgIGlmIChjVHlwZS5nZXRCYXNlVHlwZSgpICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgY29udGVudCA9IGNUeXBlLmdldENvbnRlbnQoKTsKLS8vICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIGdyb3VwID0gKFhTRE1vZGVsR3JvdXApICgoWFNEUGFydGljbGUpIGNvbnRlbnQpLmdldENvbnRlbnQoKTsKLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLS8vICAgIH0KLQotICAgIHJldHVybiBncm91cDsKLSAgfQotICAKLSAgcHVibGljIFhTRENvbmNyZXRlQ29tcG9uZW50IGdldEFkZGVkQ29tcG9uZW50KCkKLSAgewotICAgIHJldHVybiBzdXBlci5nZXRBZGRlZENvbXBvbmVudCgpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREltcG9ydENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTREltcG9ydENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkxZjg3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RJbXBvcnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RJbXBvcnRDb21tYW5kIGV4dGVuZHMgQWRkWFNEU2NoZW1hRGlyZWN0aXZlQ29tbWFuZAotewotICBwdWJsaWMgQWRkWFNESW1wb3J0Q29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSBzY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICAgIC8vIEFkZCB0aGlzIGFmdGVyIGlmIHdlIGRvbid0IGhhdmUgYSBET00gTm9kZSB5ZXQKLSAgICAgIGJlZ2luUmVjb3JkaW5nKHhzZFNjaGVtYS5nZXRFbGVtZW50KCkpOwotICAgICAgWFNESW1wb3J0IHhzZEltcG9ydCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREltcG9ydCgpOwotICAgICAgeHNkU2NoZW1hLmdldENvbnRlbnRzKCkuYWRkKGZpbmROZXh0UG9zaXRpb25Ub0luc2VydCgpLCB4c2RJbXBvcnQpOwotICAgICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IHhzZEltcG9ydDsKLSAgICAgIGZvcm1hdENoaWxkKHhzZFNjaGVtYS5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RJbmNsdWRlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNESW5jbHVkZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5YjMwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RJbmNsdWRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREluY2x1ZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEFkZFhTREluY2x1ZGVDb21tYW5kIGV4dGVuZHMgQWRkWFNEU2NoZW1hRGlyZWN0aXZlQ29tbWFuZAotewotICBwdWJsaWMgQWRkWFNESW5jbHVkZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkU2NoZW1hID0gc2NoZW1hOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBzdXBlci5leGVjdXRlKCk7Ci0gICAgICAvLyBBZGQgdGhpcyBhZnRlciBpZiB3ZSBkb24ndCBoYXZlIGEgRE9NIE5vZGUgeWV0Ci0gICAgICBiZWdpblJlY29yZGluZyh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpKTsKLSAgICAgIFhTREluY2x1ZGUgeHNkSW5jbHVkZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTREluY2x1ZGUoKTsKLSAgICAgIHhzZEluY2x1ZGUuc2V0U2NoZW1hTG9jYXRpb24oIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQoZmluZE5leHRQb3NpdGlvblRvSW5zZXJ0KCksIHhzZEluY2x1ZGUpOwotICAgICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IHhzZEluY2x1ZGU7Ci0gICAgICBmb3JtYXRDaGlsZCh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNETW9kZWxHcm91cENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRE1vZGVsR3JvdXBDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMTRiMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNETW9kZWxHcm91cENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb3NpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUJ1aWxkaW5nVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRYU0RNb2RlbEdyb3VwQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudDsKLSAgWFNEQ29tcG9zaXRvciB4c2RDb21wb3NpdG9yOwotICBYU0RNb2RlbEdyb3VwIG5ld01vZGVsR3JvdXA7Ci0KLSAgcHVibGljIEFkZFhTRE1vZGVsR3JvdXBDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50LCBYU0RDb21wb3NpdG9yIHhzZENvbXBvc2l0b3IpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgdGhpcy54c2RDb21wb3NpdG9yID0geHNkQ29tcG9zaXRvcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBvd25lciA9IGdldE93bmVyKCk7Ci0gICAgICBpZiAob3duZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RQYXJ0aWNsZSgpOwotICAgICAgICBuZXdNb2RlbEdyb3VwID0gY3JlYXRlTW9kZWxHcm91cCgpOwotICAgICAgICBwYXJ0aWNsZS5zZXRDb250ZW50KG5ld01vZGVsR3JvdXApOwotCi0gICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdGQgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBvd25lcjsKLSAgICAgICAgY3RkLnNldENvbnRlbnQocGFydGljbGUpOwotICAgICAgfQotICAgICAgZm9ybWF0Q2hpbGQocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHVuZG8oKQotICB7Ci0gICAgc3VwZXIudW5kbygpOwotICAgIAotICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXAgbW9kZWwgPSAoWFNETW9kZWxHcm91cCkgcGFyZW50OwotICAgICAgbW9kZWwuZ2V0Q29udGVudHMoKS5yZW1vdmUobmV3TW9kZWxHcm91cC5nZXRDb250YWluZXIoKSk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIFhTRENvbmNyZXRlQ29tcG9uZW50IGdldE93bmVyKCkKLSAgewotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IG93bmVyID0gbnVsbDsKLSAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pcGFyZW50OyAgICAgIAotICAgICAgaWYgKGVkLmdldFR5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIGlmIChlZC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBlZC5zZXRUeXBlRGVmaW5pdGlvbihudWxsKTsKLSAgICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdGQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICBlZC5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbih0ZCk7Ci0gICAgICAgICAgb3duZXIgPSBlZC5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0ZCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgIGVkLnNldEFub255bW91c1R5cGVEZWZpbml0aW9uKHRkKTsKLSAgICAgICAgICBvd25lciA9IHRkOyAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0gICAgICAgIAotICAgICAgZWxzZSBpZiAoZWQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSA9PSBudWxsKQotICAgICAgewotICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdGQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgZWQuc2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24odGQpOwotICAgICAgICBvd25lciA9IHRkOyAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlZC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBvd25lciA9IGVkLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlZC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0ZCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICBlZC5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbih0ZCk7Ci0gICAgICAgIG93bmVyID0gdGQ7ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICB7Ci0gICAgICBuZXdNb2RlbEdyb3VwID0gY3JlYXRlTW9kZWxHcm91cCgpOwotICAgICAgKChYU0RNb2RlbEdyb3VwKSBwYXJlbnQpLmdldENvbnRlbnRzKCkuYWRkKG5ld01vZGVsR3JvdXAuZ2V0Q29udGFpbmVyKCkpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0ID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbilwYXJlbnQ7Ci0gICAgICBvd25lciA9IHBhcmVudDsKLSAgICAgIGlmIChjdC5nZXRDb250ZW50KCkgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgIHsKLSAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSAoWFNEUGFydGljbGUpY3QuZ2V0Q29udGVudCgpOwotICAgICAgICBpZiAocGFydGljbGUuZ2V0Q29udGVudCgpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgICAgewotICAgICAgICAgIG93bmVyID0gbnVsbDsKLSAgICAgICAgICBuZXdNb2RlbEdyb3VwID0gY3JlYXRlTW9kZWxHcm91cCgpOwotICAgICAgICAgIFhTRE1vZGVsR3JvdXAgbmV3UGFyZW50ID0gKFhTRE1vZGVsR3JvdXApcGFydGljbGUuZ2V0Q29udGVudCgpOwotICAgICAgICAgIG5ld1BhcmVudC5nZXRDb250ZW50cygpLmFkZChuZXdNb2RlbEdyb3VwLmdldENvbnRhaW5lcigpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cERlZmluaXRpb24gPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pcGFyZW50OwotICAgICAgb3duZXIgPSBudWxsOwotICAgICAgbmV3TW9kZWxHcm91cCA9IGNyZWF0ZU1vZGVsR3JvdXAoKTsKLSAgICAgIGlmIChtb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRNb2RlbEdyb3VwKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgWFNETW9kZWxHcm91cCBuZXdQYXJlbnQgPSBtb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRNb2RlbEdyb3VwKCk7Ci0gICAgICAgIG5ld1BhcmVudC5nZXRDb250ZW50cygpLmFkZChuZXdNb2RlbEdyb3VwLmdldENvbnRhaW5lcigpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbW9kZWxHcm91cERlZmluaXRpb24uc2V0TW9kZWxHcm91cChuZXdNb2RlbEdyb3VwKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG93bmVyOwotICB9Ci0gIAotCi0gIHByb3RlY3RlZCBib29sZWFuIGFkb3B0KFhTRENvbmNyZXRlQ29tcG9uZW50IG1vZGVsKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgWFNETW9kZWxHcm91cCBjcmVhdGVNb2RlbEdyb3VwKCkKLSAgewotICAgIAotICAgIFhTREZhY3RvcnkgZmFjdG9yeSA9IFhTRFNjaGVtYUJ1aWxkaW5nVG9vbHMuZ2V0WFNERmFjdG9yeSgpOwotICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gZmFjdG9yeS5jcmVhdGVYU0RQYXJ0aWNsZSgpOwotICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IGZhY3RvcnkuY3JlYXRlWFNETW9kZWxHcm91cCgpOwotICAgIG1vZGVsR3JvdXAuc2V0Q29tcG9zaXRvcih4c2RDb21wb3NpdG9yKTsKLSAgICBwYXJ0aWNsZS5zZXRDb250ZW50KG1vZGVsR3JvdXApOwotICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSBtb2RlbEdyb3VwOwotICAgIHJldHVybiBtb2RlbEdyb3VwOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTc4MmQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb3NpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hQnVpbGRpbmdUb29sczsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1wdWJsaWMgY2xhc3MgQWRkWFNETW9kZWxHcm91cERlZmluaXRpb25Db21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50OwotICBib29sZWFuIGlzUmVmZXJlbmNlOwotCi0gIHB1YmxpYyBBZGRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQsIGJvb2xlYW4gaXNSZWZlcmVuY2UpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgdGhpcy5pc1JlZmVyZW5jZSA9IGlzUmVmZXJlbmNlOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCNleGVjdXRlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICB7Ci0gICAgICBlbnN1cmVTY2hlbWFFbGVtZW50KChYU0RTY2hlbWEpcGFyZW50KTsKLSAgICB9Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBpZiAoIWlzUmVmZXJlbmNlKQotICAgICAgewotICAgICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBkZWYgPSBjcmVhdGVYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpOwotICAgICAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0gZGVmOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBYU0RGYWN0b3J5IGZhY3RvcnkgPSBYU0RTY2hlbWFCdWlsZGluZ1Rvb2xzLmdldFhTREZhY3RvcnkoKTsKLSAgICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gZGVmID0gZmFjdG9yeS5jcmVhdGVYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpOwotICAgICAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFBhcnRpY2xlKCk7Ci0gICAgICAgIHBhcnRpY2xlLnNldENvbnRlbnQoZGVmKTsKLSAgICAgICAgTGlzdCBsaXN0ID0gcGFyZW50LmdldFNjaGVtYSgpLmdldE1vZGVsR3JvdXBEZWZpbml0aW9ucygpOwotICAgICAgICBpbnQgbGVuZ3RoID0gbGlzdC5zaXplKCk7Ci0gICAgICAgIGlmIChsZW5ndGggPiAxKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBnciA9IChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoZ3IuZ2V0TW9kZWxHcm91cCgpICE9IHBhcmVudCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZGVmLnNldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oZ3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChsZW5ndGggPD0gMSkKLSAgICAgICAgewotICAgICAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG5ld0dyb3VwRGVmID0gY3JlYXRlWFNETW9kZWxHcm91cERlZmluaXRpb24oKTsKLSAgICAgICAgICBkZWYuc2V0UmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbihuZXdHcm91cERlZik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgICAgewotICAgICAgICAgICgoWFNETW9kZWxHcm91cCkgcGFyZW50KS5nZXRDb250ZW50cygpLmFkZChwYXJ0aWNsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9ybWF0Q2hpbGQoZGVmLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQgPSBkZWY7Ci0gICAgICB9Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgWFNETW9kZWxHcm91cERlZmluaXRpb24gY3JlYXRlWFNETW9kZWxHcm91cERlZmluaXRpb24oKQotICB7Ci0gICAgWFNERmFjdG9yeSBmYWN0b3J5ID0gWFNEU2NoZW1hQnVpbGRpbmdUb29scy5nZXRYU0RGYWN0b3J5KCk7Ci0gICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gZGVmID0gZmFjdG9yeS5jcmVhdGVYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbigpOwotICAgIExpc3QgbGlzdCA9IHBhcmVudC5nZXRTY2hlbWEoKS5nZXRNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKTsKLSAgICBTdHJpbmcgbmV3TmFtZSA9IFhTRENvbW1vblVJVXRpbHMuY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUoIk5ld0dyb3VwRGVmaW5pdGlvbiIsIGxpc3QpOyAvLyROT04tTkxTLTEkCi0gICAgZGVmLnNldE5hbWUobmV3TmFtZSk7Ci0KLSAgICBYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSBjcmVhdGVNb2RlbEdyb3VwKCk7Ci0gICAgZGVmLnNldE1vZGVsR3JvdXAobW9kZWxHcm91cCk7Ci0gICAgVGV4dCB0ZXh0Tm9kZSA9IHBhcmVudC5nZXRTY2hlbWEoKS5nZXREb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgcGFyZW50LmdldFNjaGVtYSgpLmdldEVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7Ci0gICAgcGFyZW50LmdldFNjaGVtYSgpLmdldENvbnRlbnRzKCkuYWRkKGRlZik7Ci0gICAgZm9ybWF0Q2hpbGQoZGVmLmdldEVsZW1lbnQoKSk7Ci0gICAgcmV0dXJuIGRlZjsKLSAgfQotCi0gIHByb3RlY3RlZCBYU0RNb2RlbEdyb3VwIGNyZWF0ZU1vZGVsR3JvdXAoKQotICB7Ci0gICAgWFNERmFjdG9yeSBmYWN0b3J5ID0gWFNEU2NoZW1hQnVpbGRpbmdUb29scy5nZXRYU0RGYWN0b3J5KCk7Ci0gICAgWFNEUGFydGljbGUgcGFydGljbGUgPSBmYWN0b3J5LmNyZWF0ZVhTRFBhcnRpY2xlKCk7Ci0gICAgWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0gZmFjdG9yeS5jcmVhdGVYU0RNb2RlbEdyb3VwKCk7Ci0gICAgbW9kZWxHcm91cC5zZXRDb21wb3NpdG9yKFhTRENvbXBvc2l0b3IuU0VRVUVOQ0VfTElURVJBTCk7Ci0gICAgcGFydGljbGUuc2V0Q29udGVudChtb2RlbEdyb3VwKTsKLQotICAgIHJldHVybiBtb2RlbEdyb3VwOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRFJlZGVmaW5lQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEUmVkZWZpbmVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZmQzNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQWRkWFNEUmVkZWZpbmVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEFkZFhTRFJlZGVmaW5lQ29tbWFuZCBleHRlbmRzIEFkZFhTRFNjaGVtYURpcmVjdGl2ZUNvbW1hbmQKLXsKLSAgcHVibGljIEFkZFhTRFJlZGVmaW5lQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSBzY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBBZGQgdGhpcyBhZnRlciBpZiB3ZSBkb24ndCBoYXZlIGEgRE9NIE5vZGUgeWV0Ci0gICAgICBiZWdpblJlY29yZGluZyh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpKTsKLSAgICAgIFhTRFJlZGVmaW5lIHhzZFJlZGVmaW5lID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEUmVkZWZpbmUoKTsKLSAgICAgIHhzZFJlZGVmaW5lLnNldFNjaGVtYUxvY2F0aW9uKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgeHNkU2NoZW1hLmdldENvbnRlbnRzKCkuYWRkKGZpbmROZXh0UG9zaXRpb25Ub0luc2VydCgpLCB4c2RSZWRlZmluZSk7Ci0gICAgICBhZGRlZFhTRENvbmNyZXRlQ29tcG9uZW50ID0geHNkUmVkZWZpbmU7Ci0gICAgICBmb3JtYXRDaGlsZCh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRFNjaGVtYURpcmVjdGl2ZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRFNjaGVtYURpcmVjdGl2ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmOTAwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RTY2hlbWFEaXJlY3RpdmVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWRkWFNEU2NoZW1hRGlyZWN0aXZlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICAKLSAgcHVibGljIEFkZFhTRFNjaGVtYURpcmVjdGl2ZUNvbW1hbmQoU3RyaW5nIGxhYmVsKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdW5kbygpCi0gIHsKLSAgICBzdXBlci51bmRvKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBhZG9wdChYU0RDb25jcmV0ZUNvbXBvbmVudCBtb2RlbCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGludCBmaW5kTmV4dFBvc2l0aW9uVG9JbnNlcnQoKQotICB7Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZSkKLSAgICAgIHsKLSAgICAgICAgaW5kZXggKys7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gaW5kZXg7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIGVuc3VyZVNjaGVtYUVsZW1lbnQoeHNkU2NoZW1hKTsKLSB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9BZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2FiYmVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0FkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudDsKLSAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gY3JlYXRlZFNpbXBsZVR5cGU7Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWVUb0FkZDsKLSAgCi0gIHB1YmxpYyBBZGRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbkNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lVG9BZGQoU3RyaW5nIG5hbWVUb0FkZCkKLSAgewotICAgIHRoaXMubmFtZVRvQWRkID0gbmFtZVRvQWRkOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgewotICAgICAgZW5zdXJlU2NoZW1hRWxlbWVudCgoWFNEU2NoZW1hKXBhcmVudCk7Ci0gICAgfQotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKHBhcmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZURlZiA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICB0eXBlRGVmLnNldEJhc2VUeXBlRGVmaW5pdGlvbihwYXJlbnQuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hRm9yU2NoZW1hKCkucmVzb2x2ZVNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgInN0cmluZyIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgICAgewotICAgICAgICB0eXBlRGVmLnNldE5hbWUoWFNEQ29tbW9uVUlVdGlscy5jcmVhdGVVbmlxdWVFbGVtZW50TmFtZShuYW1lVG9BZGQgPT0gbnVsbCA/ICJOZXdTaW1wbGVUeXBlIiA6IG5hbWVUb0FkZCwgKChYU0RTY2hlbWEpIHBhcmVudCkuZ2V0VHlwZURlZmluaXRpb25zKCkpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjcmVhdGVkU2ltcGxlVHlwZSA9IHR5cGVEZWY7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IChYU0RTY2hlbWEpIHBhcmVudDsKLSAgICAgICAgICBUZXh0IHRleHROb2RlID0geHNkU2NoZW1hLmdldERvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoIlxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKHRleHROb2RlKTsKLSAgICAgICAgICB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKS5hZGQodHlwZURlZik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICAoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgcGFyZW50KS5zZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbih0eXBlRGVmKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICAoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBwYXJlbnQpLnNldEFub255bW91c1R5cGVEZWZpbml0aW9uKHR5cGVEZWYpOwotICAgICAgfQotICAgICAgZm9ybWF0Q2hpbGQoY3JlYXRlZFNpbXBsZVR5cGUuZ2V0RWxlbWVudCgpKTsKLQotICAgICAgYWRkZWRYU0RDb25jcmV0ZUNvbXBvbmVudCA9IGNyZWF0ZWRTaW1wbGVUeXBlOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGdldENyZWF0ZWRTaW1wbGVUeXBlKCkKLSAgewotICAgIHJldHVybiBjcmVhdGVkU2ltcGxlVHlwZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQmFzZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0Jhc2VDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMjMzNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQmFzZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1wdWJsaWMgY2xhc3MgQmFzZUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUwgPSAieG1sIjsgLy8kTk9OLU5MUy0xJAotCi0gIFhTRENvbmNyZXRlQ29tcG9uZW50IGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQ7Ci0KLSAgcHVibGljIEJhc2VDb21tYW5kKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgQmFzZUNvbW1hbmQoU3RyaW5nIGxhYmVsKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICB9Ci0gIAotICBwdWJsaWMgWFNEQ29uY3JldGVDb21wb25lbnQgZ2V0QWRkZWRDb21wb25lbnQoKQotICB7Ci0gICAgcmV0dXJuIGFkZGVkWFNEQ29uY3JldGVDb21wb25lbnQ7Ci0gIH0KLSAgCi0gIElET01Ob2RlIGRvbU5vZGU7Ci0gIHByb3RlY3RlZCB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICB7Ci0gICAgICBkb21Ob2RlID0gKElET01Ob2RlKSBlbGVtZW50OyAKLSAgICAgIGRvbU5vZGUuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBnZXRVbmRvRGVzY3JpcHRpb24oKSk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBlbmRSZWNvcmRpbmcoKQotICB7Ci0gICAgaWYgKGRvbU5vZGUgIT0gbnVsbCkKLSAgICAgIGRvbU5vZGUuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotICAgIHJldHVybiBnZXRMYWJlbCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZm9ybWF0Q2hpbGQoRWxlbWVudCBjaGlsZCkKLSAgewotICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgIElET01Nb2RlbCBtb2RlbCA9ICgoSURPTU5vZGUpY2hpbGQpLmdldE1vZGVsKCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gbWFrZSBhIGJpZyBtb2RlbCBjaGFuZ2UKLSAgICAgICAgbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0gICAgICAgIAotICAgICAgICBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0gICAgICAgIGZvcm1hdFByb2Nlc3Nvci5mb3JtYXROb2RlKGNoaWxkKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBiaWcgbW9kZWwgY2hhbmdlCi0gICAgICAgIG1vZGVsLmNoYW5nZWRNb2RlbCgpOyAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGVuc3VyZVNjaGVtYUVsZW1lbnQoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIERvY3VtZW50IGRvY3VtZW50ID0gc2NoZW1hLmdldERvY3VtZW50KCk7Ci0gICAgCi0gICAgRWxlbWVudCBzY2hlbWFFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLSAgICBpZiAoc2NoZW1hRWxlbWVudCA9PSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBnZXREZWZhdWx0TmFtZXNwYWNlKHNjaGVtYSk7Ci0gICAgICBzY2hlbWEuc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICBNYXAgcU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCA9IHNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgICBxTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwLnB1dCgidG5zIiwgdGFyZ2V0TmFtZXNwYWNlKTsgICAgICAKLSAgICAgIGlmIChYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzUXVhbGlmeVhNTFNjaGVtYUxhbmd1YWdlKCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFhNTFNjaGVtYVByZWZpeCgpOwotICAgICAgICBzY2hlbWEuc2V0U2NoZW1hRm9yU2NoZW1hUU5hbWVQcmVmaXgocHJlZml4KTsKLSAgICAgICAgcU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcC5wdXQocHJlZml4LCBYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpOyAgICAgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBxTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwLnB1dChudWxsLCBYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpOyAgICAgIAotICAgICAgfQotICAgICAgCi0gICAgICBzY2hlbWEudXBkYXRlRWxlbWVudCgpOwotICAgICAgZW5zdXJlWE1MRGlyZWN0aXZlKGRvY3VtZW50KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIGVuc3VyZVhNTERpcmVjdGl2ZShEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIGlmIChoYXNYTUxEaXJlY3RpdmUoZG9jdW1lbnQpKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgTm9kZSBmaXJzdENoaWxkID0gZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiB4bWxEZWNsYXJhdGlvbiA9IGdldFhNTERlY2xhcmF0aW9uKGRvY3VtZW50KTsKLSAgICBkb2N1bWVudC5pbnNlcnRCZWZvcmUoeG1sRGVjbGFyYXRpb24sIGZpcnN0Q2hpbGQpOwotICAgIFRleHQgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOwotICAgIGRvY3VtZW50Lmluc2VydEJlZm9yZSh0ZXh0Tm9kZSwgZmlyc3RDaGlsZCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzWE1MRGlyZWN0aXZlKERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgTm9kZSBmaXJzdENoaWxkID0gZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgCi0gICAgaWYgKGZpcnN0Q2hpbGQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlmIChmaXJzdENoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcHJvY2Vzc2luZ0luc3RydWN0aW9uICA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pZmlyc3RDaGlsZDsKLSAgICAKLSAgICBpZiAoIVhNTC5lcXVhbHMocHJvY2Vzc2luZ0luc3RydWN0aW9uLmdldFRhcmdldCgpKSkgCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBnZXRYTUxEZWNsYXJhdGlvbihEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIFByZWZlcmVuY2VzIHByZWZlcmVuY2UgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotICAgIFN0cmluZyBjaGFyU2V0ID0gcHJlZmVyZW5jZS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotICAgIGlmIChjaGFyU2V0ID09IG51bGwgfHwgY2hhclNldC50cmltKCkuZXF1YWxzKCIiKSkKLSAgICB7Ci0gICAgICBjaGFyU2V0ID0gIlVURi04IjsKLSAgICB9Ci0gICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uIHhtbERlY2xhcmF0aW9uID0gZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFhNTCwgInZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIiIgKyBjaGFyU2V0ICsgIlwiIik7Ci0gICAgcmV0dXJuIHhtbERlY2xhcmF0aW9uOwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWVzcGFjZShYU0RTY2hlbWEgc2NoZW1hKQotICB7Ci0gICAgU3RyaW5nIG5hbWVzcGFjZSA9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0WE1MU2NoZW1hVGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICBpZiAoIW5hbWVzcGFjZS5lbmRzV2l0aCgiLyIpKQotICAgIHsKLSAgICAgIG5hbWVzcGFjZSA9IG5hbWVzcGFjZS5jb25jYXQoIi8iKTsKLSAgICB9Ci0KLSAgICBuYW1lc3BhY2UgKz0gZ2V0RmlsZU5hbWUoc2NoZW1hKSArICIvIjsKLQotICAgIHJldHVybiBuYW1lc3BhY2U7Ci0KLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEZpbGVOYW1lKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICBVUkkgc2NoZW1hVVJJID0gc2NoZW1hLmVSZXNvdXJjZSgpLmdldFVSSSgpOwotICAgIElQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoc2NoZW1hVVJJLnRvU3RyaW5nKCkpOwotICAgIHJldHVybiBmaWxlUGF0aC5yZW1vdmVGaWxlRXh0ZW5zaW9uKCkubGFzdFNlZ21lbnQoKS50b1N0cmluZygpOwotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0NoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMTBkOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBDaGFuZ2VUb0xvY2FsU2ltcGxlVHlwZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RGZWF0dXJlIHBhcmVudDsKLSAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gYW5vbnltb3VzU2ltcGxlVHlwZTsKLSAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gY3VycmVudFR5cGU7Ci0KLSAgcHVibGljIENoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTREZlYXR1cmUgcGFyZW50KQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotCi0vLyAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotLy8gICAgewotLy8gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHBhcmVudDsKLS8vICAgICAgWFNEVHlwZURlZmluaXRpb24gYVR5cGUgPSBlbGVtZW50LmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLS8vCi0vLyAgICAgIGlmIChhVHlwZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotLy8gICAgICB7Ci0vLyAgICAgICAgY3VycmVudFR5cGUgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGFUeXBlOwotLy8gICAgICB9Ci0vLyAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotLy8gICAgYW5vbnltb3VzU2ltcGxlVHlwZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKCk7Ci0vLyAgICBhbm9ueW1vdXNTaW1wbGVUeXBlLnNldEJhc2VUeXBlRGVmaW5pdGlvbihjdXJyZW50VHlwZSk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0KLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBwYXJlbnQpLnNldEFub255bW91c1R5cGVEZWZpbml0aW9uKGFub255bW91c1NpbXBsZVR5cGUpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgICgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIHBhcmVudCkuc2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oYW5vbnltb3VzU2ltcGxlVHlwZSk7Ci0gICAgICB9Ci0gICAgICBmb3JtYXRDaGlsZChwYXJlbnQuZ2V0RWxlbWVudCgpKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEFub255bW91c1NpbXBsZVR5cGUoWFNEU2ltcGxlVHlwZURlZmluaXRpb24gYW5vbnltb3VzU2ltcGxlVHlwZSkKLSAgewotICAgIHRoaXMuYW5vbnltb3VzU2ltcGxlVHlwZSA9IGFub255bW91c1NpbXBsZVR5cGU7Ci0gIH0KLQotICBwdWJsaWMgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gZ2V0QW5vbnltb3VzVHlwZSgpCi0gIHsKLSAgICBpZiAoYW5vbnltb3VzU2ltcGxlVHlwZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGFub255bW91c1NpbXBsZVR5cGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbigpOwotICAgICAgYW5vbnltb3VzU2ltcGxlVHlwZS5zZXRCYXNlVHlwZURlZmluaXRpb24oY3VycmVudFR5cGUpOwotICAgIH0KLSAgICByZXR1cm4gYW5vbnltb3VzU2ltcGxlVHlwZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvRGVsZXRlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvRGVsZXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODZhY2VjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0RlbGV0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTRFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbnVtZXJhdGlvbkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdpbGRjYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIERlbGV0ZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RDb25jcmV0ZUNvbXBvbmVudCB0YXJnZXQ7Ci0KLSAgcHVibGljIERlbGV0ZUNvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RDb25jcmV0ZUNvbXBvbmVudCB0YXJnZXQpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIFhTRFZpc2l0b3IgdmlzaXRvciA9IG5ldyBYU0RWaXNpdG9yKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIGlmIChlbGVtZW50LmdldFR5cGVEZWZpbml0aW9uKCkgPT0gdGFyZ2V0KQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZSA9IHRhcmdldC5nZXRTY2hlbWEoKS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oInN0cmluZyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgZWxlbWVudC5zZXRUeXBlRGVmaW5pdGlvbih0eXBlKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci52aXNpdEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gdGFyZ2V0LmdldENvbnRhaW5lcigpOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0KLSAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwIHx8IHRhcmdldCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbiB8fCB0YXJnZXQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHBhcmVudC5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwID0gKFhTRE1vZGVsR3JvdXApICgoWFNEUGFydGljbGUpIHBhcmVudCkuZ2V0Q29udGFpbmVyKCk7Ci0KLSAgICAgICAgICAgIG1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5yZW1vdmUocGFyZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAocGFyZW50LmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHBhcmVudC5nZXRDb250YWluZXIoKTsKLSAgICAgICAgICAgIGNvbXBsZXhUeXBlLnNldENvbnRlbnQobnVsbCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0b3IudmlzaXRTY2hlbWEodGFyZ2V0LmdldFNjaGVtYSgpKTsKLSAgICAgICAgICAoKFhTRFNjaGVtYSkgcGFyZW50KS5nZXRDb250ZW50cygpLnJlbW92ZSh0YXJnZXQpOwotICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgICB7Ci0gICAgICAgICAgRU9iamVjdCBvYmogPSBwYXJlbnQuZUNvbnRhaW5lcigpOwotICAgICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IG51bGw7Ci0gICAgICAgICAgd2hpbGUgKG9iaiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNvbXBsZXhUeXBlID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgb2JqOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9iaiA9IG9iai5lQ29udGFpbmVyKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChjb21wbGV4VHlwZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbXBsZXhUeXBlLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkucmVtb3ZlKHBhcmVudCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKHBhcmVudC5nZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gYXR0ckdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgcGFyZW50LmdldENvbnRhaW5lcigpOwotCi0gICAgICAgICAgICBhdHRyR3JvdXAuZ2V0Q29udGVudHMoKS5yZW1vdmUocGFyZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRvci52aXNpdFNjaGVtYSh0YXJnZXQuZ2V0U2NoZW1hKCkpOwotICAgICAgICAgICgoWFNEU2NoZW1hKSBwYXJlbnQpLmdldENvbnRlbnRzKCkucmVtb3ZlKHRhcmdldCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiAmJiBwYXJlbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgICgoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBwYXJlbnQpLmdldEF0dHJpYnV0ZUNvbnRlbnRzKCkucmVtb3ZlKHRhcmdldCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotICAgICAgewotICAgICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1lcmF0aW9uRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldCkgdGFyZ2V0OwotICAgICAgICBlbnVtZXJhdGlvbkZhY2V0LmdldFNpbXBsZVR5cGVEZWZpbml0aW9uKCkuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShlbnVtZXJhdGlvbkZhY2V0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgICAgewotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocGFyZW50LmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSAoWFNETW9kZWxHcm91cCkgKChYU0RQYXJ0aWNsZSkgcGFyZW50KS5nZXRDb250YWluZXIoKTsKLSAgICAgICAgICAgIG1vZGVsR3JvdXAuZ2V0Q29udGVudHMoKS5yZW1vdmUocGFyZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHBhcmVudCkuc2V0QXR0cmlidXRlV2lsZGNhcmRDb250ZW50KG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgICgoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBwYXJlbnQpLnNldEF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudChudWxsKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uICYmIHBhcmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHBhcmVudCkuc2V0VHlwZURlZmluaXRpb24odGFyZ2V0LnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbihYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsICJzdHJpbmciKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdG9yLnZpc2l0U2NoZW1hKHRhcmdldC5nZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgKChYU0RTY2hlbWEpIHBhcmVudCkuZ2V0Q29udGVudHMoKS5yZW1vdmUodGFyZ2V0KTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0V4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9FeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTM3MTU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0V4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZCBleHRlbmRzIEFkZEV4dGVuc2lvbkNvbW1hbmQKLXsKLSAgcHJvdGVjdGVkIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50OwotICBwcm90ZWN0ZWQgRWxlbWVudCBhcHBJbmZvOwotICBwcm90ZWN0ZWQgRWxlbWVudCBuZXdFbGVtZW50OwotCi0gIHB1YmxpYyBFeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZChTdHJpbmcgbGFiZWwpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gIH0KLQotICBwdWJsaWMgWFNERWxlbWVudERlY2xhcmF0aW9uIGdldFhTREVsZW1lbnREZWNsYXJhdGlvbkVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGVsZW1lbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFbGVtZW50IGdldE5ld0VsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBnZXRBcHBJbmZvKCkKLSAgewotICAgIHJldHVybiBhcHBJbmZvOwotICB9Ci0gIAotICBwdWJsaWMgWFNEU2NoZW1hIGdldFhTRFNjaGVtYSgpCi0gIHsKLSAgICByZXR1cm4gY29tcG9uZW50LmdldFNjaGVtYSgpOyAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0cyhYU0RDb25jcmV0ZUNvbXBvbmVudCBpbnB1dCwgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gIHsKLSAgICB0aGlzLmNvbXBvbmVudCA9IGlucHV0OwotICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBYU0RBbm5vdGF0aW9uIGdldFhTREFubm90YXRpb24oKQotICB7Ci0gICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIFhTREFubm90YXRpb24geHNkQW5ub3RhdGlvbiA9IFhTRENvbW1vblVJVXRpbHMuZ2V0SW5wdXRYU0RBbm5vdGF0aW9uKGNvbXBvbmVudCwgZmFsc2UpOwotICAgICAgcmV0dXJuIHhzZEFubm90YXRpb247Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhjb21wb25lbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICAgIGRvUHJlcHJvY2Vzc2luZygpOwotICAgICAgYWRkRXh0ZW5zaW9uTm9kZSgpOwotICAgICAgZG9DdXN0b21pemVkQWN0aW9ucygpOwotICAgICAgCi0gICAgICBmb3JtYXRDaGlsZChjb21wb25lbnQuZ2V0RWxlbWVudCgpKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgZG9QcmVwcm9jZXNzaW5nKCkKLSAgewotICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBhZGRFeHRlbnNpb25Ob2RlKCkKLSAgewotICAgIFhTREFubm90YXRpb24geHNkQW5ub3RhdGlvbiA9IFhTRENvbW1vblVJVXRpbHMuZ2V0SW5wdXRYU0RBbm5vdGF0aW9uKGNvbXBvbmVudCwgdHJ1ZSk7Ci0gICAgWFNEU2NoZW1hIHNjaGVtYT0geHNkQW5ub3RhdGlvbi5nZXRTY2hlbWEoKTsKLSAgICBFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSBzY2hlbWEuZ2V0RWxlbWVudCgpOwotCi0gICAgaWYgKHhzZEFubm90YXRpb24uZ2V0QXBwbGljYXRpb25JbmZvcm1hdGlvbigpLnNpemUoKSA9PSAwKQotICAgIHsKLSAgICAgIGFwcEluZm8gPSB4c2RBbm5vdGF0aW9uLmNyZWF0ZUFwcGxpY2F0aW9uSW5mb3JtYXRpb24obnVsbCk7Ci0gICAgICB4c2RBbm5vdGF0aW9uLmdldEVsZW1lbnQoKS5hcHBlbmRDaGlsZChhcHBJbmZvKTsKLSAgICAgIExpc3QgYXBwSW5mb3MgPSB4c2RBbm5vdGF0aW9uLmdldEFwcGxpY2F0aW9uSW5mb3JtYXRpb24oKTsKLSAgICAgIGFwcEluZm9zLmFkZChhcHBJbmZvKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIHVzZSB0aGUgZmlyc3QgYXBwSW5mbwotICAgICAgYXBwSW5mbyA9IChFbGVtZW50KXhzZEFubm90YXRpb24uZ2V0QXBwbGljYXRpb25JbmZvcm1hdGlvbigpLmdldCgwKTsKLSAgICB9Ci0KLSAgICBpZiAoYXBwSW5mbyAhPSBudWxsKQotICAgIHsKLSAgICAgIERvY3VtZW50IGRvYyA9IGFwcEluZm8uZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgU3RyaW5nIHByZWZpeCA9IGFkZFRvTmFtZXNwYWNlVGFibGUoc2NoZW1hRWxlbWVudCk7Ci0gICAgICBuZXdFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhleHRlbnNpb25zU2NoZW1hU3BlYy5nZXROYW1lc3BhY2VVUkkoKSwgZWxlbWVudC5nZXROYW1lKCkpOwotICAgICAgbmV3RWxlbWVudC5zZXRQcmVmaXgocHJlZml4KTsgICAKLSAgICAgIGFwcEluZm8uYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7Ci0KLSAgICAgIHhzZEFubm90YXRpb24udXBkYXRlRWxlbWVudCgpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBhZGRUb05hbWVzcGFjZVRhYmxlKEVsZW1lbnQgc2NoZW1hRWxlbWVudCkKLSAgewotICAgIFN0cmluZyBwcmVmaXggPSBhZGROYW1lc3BhY2VEZWNsYXJhdGlvbklmUmVxdWlyZWQoc2NoZW1hRWxlbWVudCwgInAiLCBleHRlbnNpb25zU2NoZW1hU3BlYy5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgcmV0dXJuIHByZWZpeDsKLSAgfQotCi0gIAotICBwcm90ZWN0ZWQgdm9pZCBkb0N1c3RvbWl6ZWRBY3Rpb25zKCkKLSAgewotICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCB1bmRvKCkKLSAgewotICAgIHN1cGVyLnVuZG8oKTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkKLSAgewotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci0gIAotICAvLyBUT0RPLi4uIGNvbW1vbiB0aGlzIHVwIHdpdGggd3NkbC51aQotICBwcm90ZWN0ZWQgU3RyaW5nIGFkZE5hbWVzcGFjZURlY2xhcmF0aW9uSWZSZXF1aXJlZChFbGVtZW50IHNjaGVtYUVsZW1lbnQsIFN0cmluZyBwcmVmaXhIaW50LCBTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9IG51bGw7ICAgICAgCi0gICAgTmFtZXNwYWNlVGFibGUgbmFtZXNwYWNlVGFibGUgPSBuZXcgTmFtZXNwYWNlVGFibGUoc2NoZW1hRWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnQoc2NoZW1hRWxlbWVudCk7Ci0gICAgcHJlZml4ID0gbmFtZXNwYWNlVGFibGUuZ2V0UHJlZml4Rm9yVVJJKG5hbWVzcGFjZSk7Ci0gICAgaWYgKHByZWZpeCA9PSBudWxsKQotICAgIHsgCi0gICAgICBTdHJpbmcgYmFzZVByZWZpeCA9IHByZWZpeEhpbnQ7Ci0gICAgICBwcmVmaXggPSBiYXNlUHJlZml4OwotICAgICAgU3RyaW5nIHhtbG5zQ29sb24gPSAieG1sbnM6IjsgLy8kTk9OLU5MUy0xJAotICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSB4bWxuc0NvbG9uICsgcHJlZml4OwotICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgIHdoaWxlIChzY2hlbWFFbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBjb3VudCsrOwotICAgICAgICBwcmVmaXggPSBiYXNlUHJlZml4ICsgY291bnQ7Ci0gICAgICAgIGF0dHJpYnV0ZU5hbWUgPSB4bWxuc0NvbG9uICsgcHJlZml4OwotICAgICAgfSAgICAgIAotICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgbmFtZXNwYWNlKTsgIAotICAgIH0gICAgCi0gICAgcmV0dXJuIHByZWZpeDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgYWRkU2NoZW1hQXR0cmlidXRlKEVsZW1lbnQgc2NoZW1hRWxlbWVudCwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkKLSAgewotICAgIFN0cmluZyBwcmVmaXggPSBudWxsOwotICAgIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlID0gbmV3IE5hbWVzcGFjZVRhYmxlKHNjaGVtYUVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgICBuYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50KHNjaGVtYUVsZW1lbnQpOwotICAgIHByZWZpeCA9IG5hbWVzcGFjZVRhYmxlLmdldFByZWZpeEZvclVSSShuYW1lc3BhY2UpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHNjaGVtYUVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShwcmVmaXggKyAiOiIgKyBhdHRyaWJ1dGVOYW1lKSA9PSBudWxsKQotICAgICAgICAgIHNjaGVtYUVsZW1lbnQuc2V0QXR0cmlidXRlKHByZWZpeCArICI6IiArIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoc2NoZW1hRWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGF0dHJpYnV0ZU5hbWUpID09IG51bGwpCi0gICAgICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgCi0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkU291cmNlQXR0cmlidXRlVG9BcHBJbmZvKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICBpZiAoYXBwSW5mby5nZXRBdHRyaWJ1dGVOb2RlKFhTRENvbnN0YW50cy5TT1VSQ0VfQVRUUklCVVRFKSA9PSBudWxsKQotICAgICAgYXBwSW5mby5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlNPVVJDRV9BVFRSSUJVVEUsIG5hbWVzcGFjZSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQKLSAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUKLSAgICogQHBhcmFtIGF0dHJpYnV0ZVZhbHVlCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlKQotICB7Ci0gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9FeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0V4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjVmZjM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL0V4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIHByb3RlY3RlZCBOb2RlIG5vZGU7Ci0gIHByb3RlY3RlZCBYU0RDb25jcmV0ZUNvbXBvbmVudCBpbnB1dDsKLSAgCi0gIHB1YmxpYyBFeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQoU3RyaW5nIGxhYmVsKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXROb2RlKE5vZGUgbm9kZSkKLSAgewotICAgIHRoaXMubm9kZSA9IG5vZGU7Ci0gIH0KLQotICBwdWJsaWMgWFNEQ29uY3JldGVDb21wb25lbnQgZ2V0SW5wdXQoKQotICB7Ci0gICAgcmV0dXJuIGlucHV0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoWFNEQ29uY3JldGVDb21wb25lbnQgaW5wdXQpCi0gIHsKLSAgICB0aGlzLmlucHV0ID0gaW5wdXQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhub2RlKTsKLSAgICAgIAotICAgICAgZG9QcmVwcm9jZXNzaW5nKCk7Ci0gICAgICAKLSAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpIG5vZGU7Ci0gICAgICAgIGF0dHIuZ2V0T3duZXJFbGVtZW50KCkucmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKG5vZGUpOwotICAgICAgICAgIAotICAgICAgICAgIGlmIChYU0RET01IZWxwZXIuaGFzT25seVdoaXRlc3BhY2UocGFyZW50KSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoWFNEQ29uc3RhbnRzLkFQUElORk9fRUxFTUVOVF9UQUcuZXF1YWxzKHBhcmVudC5nZXRMb2NhbE5hbWUoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZShwYXJlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBkb0N1c3RvbWl6ZWRBY3Rpb25zKCk7Ci0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGRvUHJlcHJvY2Vzc2luZygpCi0gIHsKLSAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZG9DdXN0b21pemVkQWN0aW9ucygpCi0gIHsKLSAgIAotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlbW92ZUV4dGVuc2lvbkF0dHJpYnV0ZXJDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9SZW1vdmVFeHRlbnNpb25BdHRyaWJ1dGVyQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTczYTQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlbW92ZUV4dGVuc2lvbkF0dHJpYnV0ZXJDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZUV4dGVuc2lvbkF0dHJpYnV0ZXJDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCAKLXsKLQlFbGVtZW50IGhvc3RFbGVtZW50OwotCUF0dHIgYXR0cjsKLQkKLQlwdWJsaWMgUmVtb3ZlRXh0ZW5zaW9uQXR0cmlidXRlckNvbW1hbmQoU3RyaW5nIGxhYmVsLCBFbGVtZW50IGhvc3RFbGVtZW50LCBBdHRyIGF0dHIpCi0JewotCQlzdXBlcihsYWJlbCk7Ci0JCXRoaXMuaG9zdEVsZW1lbnQgPSBob3N0RWxlbWVudDsKLQkJdGhpcy5hdHRyID0gYXR0cjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0JewotCQlzdXBlci5leGVjdXRlKCk7Ci0JCWhvc3RFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVuZG8oKQotCXsKLQkJc3VwZXIudW5kbygpOwotCQkvL1RPRE8gaW1wbGVtZW50IG1lCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvUmVtb3ZlRXh0ZW5zaW9uRWxlbWVudENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlbW92ZUV4dGVuc2lvbkVsZW1lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzM2M3NTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvUmVtb3ZlRXh0ZW5zaW9uRWxlbWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZUV4dGVuc2lvbkVsZW1lbnRDb21tYW5kIGV4dGVuZHMgQ29tbWFuZAotewotICBYU0RBbm5vdGF0aW9uIHhzZEFubm90YXRpb247Ci0gIE5vZGUgYXBwSW5mbzsKLQotICBwdWJsaWMgUmVtb3ZlRXh0ZW5zaW9uRWxlbWVudENvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RBbm5vdGF0aW9uIHhzZEFubm90YXRpb24sIE5vZGUgYXBwSW5mbykKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZEFubm90YXRpb24gPSB4c2RBbm5vdGF0aW9uOwotICAgIHRoaXMuYXBwSW5mbyA9IGFwcEluZm87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICB4c2RBbm5vdGF0aW9uLmdldEFwcGxpY2F0aW9uSW5mb3JtYXRpb24oKS5yZW1vdmUoYXBwSW5mbyk7Ci0gICAgeHNkQW5ub3RhdGlvbi5nZXRFbGVtZW50KCkucmVtb3ZlQ2hpbGQoYXBwSW5mbyk7Ci0gICAgeHNkQW5ub3RhdGlvbi51cGRhdGVFbGVtZW50KCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1bmRvKCkKLSAgewotICAgIHN1cGVyLnVuZG8oKTsKLSAgICB4c2RBbm5vdGF0aW9uLmdldEFwcGxpY2F0aW9uSW5mb3JtYXRpb24oKS5hZGQoYXBwSW5mbyk7Ci0gICAgeHNkQW5ub3RhdGlvbi5nZXRFbGVtZW50KCkuYXBwZW5kQ2hpbGQoYXBwSW5mbyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9SZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDExNjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1JlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIE5vZGUgbm9kZTsKLSAgCi0gIHB1YmxpYyBSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZChTdHJpbmcgbGFiZWwsIE5vZGUgbm9kZSkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLm5vZGUgPSBub2RlOwotICB9ICAKLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhub2RlKTsKLSAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpIG5vZGU7Ci0gICAgICAgIGF0dHIuZ2V0T3duZXJFbGVtZW50KCkucmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKG5vZGUpOwotICAgICAgICAgIAotICAgICAgICAgIGlmIChYU0RET01IZWxwZXIuaGFzT25seVdoaXRlc3BhY2UocGFyZW50KSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoWFNEQ29uc3RhbnRzLkFQUElORk9fRUxFTUVOVF9UQUcuZXF1YWxzKHBhcmVudC5nZXRMb2NhbE5hbWUoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZShwYXJlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19ICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1NldEJhc2VUeXBlQW5kTWFuYWdlckRpcmVjdGl2ZXNDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9TZXRCYXNlVHlwZUFuZE1hbmFnZXJEaXJlY3RpdmVzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmI3OTY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1NldEJhc2VUeXBlQW5kTWFuYWdlckRpcmVjdGl2ZXNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgU2V0QmFzZVR5cGVBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQgZXh0ZW5kcyBVcGRhdGVUeXBlUmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQKLXsKLQotICBwdWJsaWMgU2V0QmFzZVR5cGVBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQoWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQsIFN0cmluZyBjb21wb25lbnROYW1lLCBTdHJpbmcgY29tcG9uZW50TmFtZXNwYWNlLCBJRmlsZSBmaWxlKQotICB7Ci0gICAgc3VwZXIoY29uY3JldGVDb21wb25lbnQsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWVzcGFjZSwgZmlsZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGNvbmNyZXRlQ29tcG9uZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBYU0RDb21wb25lbnQgdGQgPSBjb21wdXRlQ29tcG9uZW50KCk7Ci0gICAgICBpZiAodGQgIT0gbnVsbCAmJiB0ZCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBTZXRCYXNlVHlwZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBTZXRCYXNlVHlwZUNvbW1hbmQoY29uY3JldGVDb21wb25lbnQsIChYU0RUeXBlRGVmaW5pdGlvbikgdGQpOwotICAgICAgICBjb21tYW5kLmV4ZWN1dGUoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLQotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9TZXRCYXNlVHlwZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1NldEJhc2VUeXBlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTEwNmU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1NldEJhc2VUeXBlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0REZXJpdmF0aW9uTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFZhcmlldHk7Ci0KLXB1YmxpYyBjbGFzcyBTZXRCYXNlVHlwZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudDsKLSAgWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGU7Ci0gIFhTREJhc2VBZGFwdGVyIGFkYXB0ZXI7Ci0gIAotCi0gIHB1YmxpYyBTZXRCYXNlVHlwZUNvbW1hbmQoWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQsIFhTRFR5cGVEZWZpbml0aW9uIGJhc2VUeXBlKQotICB7Ci0gICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfQkFTRV9UWVBFKTsKLSAgICB0aGlzLmNvbmNyZXRlQ29tcG9uZW50ID0gY29uY3JldGVDb21wb25lbnQ7Ci0gICAgdGhpcy5iYXNlVHlwZSA9IGJhc2VUeXBlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhjb25jcmV0ZUNvbXBvbmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgaWYgKGNvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBjb25jcmV0ZUNvbXBvbmVudDsKLQotICAgICAgICBpZiAoYmFzZVR5cGUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGlmICghKGNvbXBsZXhUeXBlLmdldENvbnRlbnQoKSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVDb250ZW50ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICAgIGNvbXBsZXhUeXBlLnNldENvbnRlbnQoc2ltcGxlQ29udGVudCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY29tcGxleFR5cGUuc2V0QmFzZVR5cGVEZWZpbml0aW9uKGJhc2VUeXBlKTsKLSAgICAgICAgY29tcGxleFR5cGUuc2V0RGVyaXZhdGlvbk1ldGhvZChYU0REZXJpdmF0aW9uTWV0aG9kLkVYVEVOU0lPTl9MSVRFUkFMKTsKLSAgICAgICAgZm9ybWF0Q2hpbGQoY29tcGxleFR5cGUuZ2V0RWxlbWVudCgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGUgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGNvbmNyZXRlQ29tcG9uZW50OwotICAgICAgICBpZiAoYmFzZVR5cGUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIFhTRFZhcmlldHkgdmFyaWV0eSA9IHNpbXBsZVR5cGUuZ2V0VmFyaWV0eSgpOwotICAgICAgICAgIGlmICh2YXJpZXR5LmdldFZhbHVlKCkgPT0gWFNEVmFyaWV0eS5BVE9NSUMpCi0gICAgICAgICAgewotICAgICAgICAgICAgc2ltcGxlVHlwZS5zZXRCYXNlVHlwZURlZmluaXRpb24oKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBiYXNlVHlwZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHZhcmlldHkuZ2V0VmFsdWUoKSA9PSBYU0RWYXJpZXR5LlVOSU9OKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNpbXBsZVR5cGUuZ2V0TWVtYmVyVHlwZURlZmluaXRpb25zKCkuYWRkKGJhc2VUeXBlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAodmFyaWV0eS5nZXRWYWx1ZSgpID09IFhTRFZhcmlldHkuTElTVCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzaW1wbGVUeXBlLnNldEl0ZW1UeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGJhc2VUeXBlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvU2V0TXVsdGlwbGljaXR5Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvU2V0TXVsdGlwbGljaXR5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjc5ZmVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1NldE11bHRpcGxpY2l0eUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlQ29udGVudDsKLQotcHVibGljIGNsYXNzIFNldE11bHRpcGxpY2l0eUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQ7Ci0gIGludCBtYXhPY2N1cnMsIG1pbk9jY3VyczsKLQotICAvKioKLSAgICogQHBhcmFtIHBhcmVudAotICAgKi8KLSAgcHVibGljIFNldE11bHRpcGxpY2l0eUNvbW1hbmQoU3RyaW5nIGxhYmVsKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNYXhPY2N1cnMoaW50IGkpCi0gIHsKLSAgICBtYXhPY2N1cnM9aTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1pbk9jY3VycyhpbnQgaSkKLSAgewotICAgIG1pbk9jY3Vycz1pOyAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFhTRENvbmNyZXRlQ29tcG9uZW50KFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCkKLSAgewotICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kcy5BYnN0cmFjdENvbW1hbmQjcnVuKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEUGFydGljbGVDb250ZW50KQotICAgICAgewotICAgICAgICBYU0RQYXJ0aWNsZUNvbnRlbnQgeHNkUGFydGljbGVDb250ZW50ID0gKFhTRFBhcnRpY2xlQ29udGVudCkgcGFyZW50OwotICAgICAgICBYU0RQYXJ0aWNsZSB4c2RQYXJ0aWNsZSA9IChYU0RQYXJ0aWNsZSkgeHNkUGFydGljbGVDb250ZW50LmdldENvbnRhaW5lcigpOwotICAgICAgICBpZiAobWF4T2NjdXJzIDwgMCkKLSAgICAgICAgewotICAgICAgICAgIG1heE9jY3VycyA9IFhTRFBhcnRpY2xlLlVOQk9VTkRFRDsKLSAgICAgICAgfQotICAgICAgICB4c2RQYXJ0aWNsZS5zZXRNYXhPY2N1cnMobWF4T2NjdXJzKTsKLSAgICAgICAgeHNkUGFydGljbGUuc2V0TWluT2NjdXJzKG1pbk9jY3Vycyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1NldFR5cGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9TZXRUeXBlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTRjYjQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1NldFR5cGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RCYXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLlNldFR5cGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgU2V0VHlwZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQ7Ci0gIHByaXZhdGUgYm9vbGVhbiBjb250aW51ZUFwcGx5OwotICBYU0RCYXNlQWRhcHRlciBhZGFwdGVyOwotICBTdHJpbmcgYWN0aW9uOwotCi0gIHB1YmxpYyBTZXRUeXBlQ29tbWFuZChTdHJpbmcgbGFiZWwsIFN0cmluZyBJRCwgWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50KQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgIHRoaXMuYWN0aW9uID0gSUQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoWFNEQmFzZUFkYXB0ZXIgYWRhcHRlcikKLSAgewotICAgIHRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKHBhcmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgY29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgPSBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpOwotICAgICAgY29udGludWVBcHBseSA9IHRydWU7Ci0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBpZiAoYWN0aW9uLmVxdWFscyhTZXRUeXBlQWN0aW9uLlNFVF9ORVdfVFlQRV9JRCkpCi0gICAgICAgIHsKLSAgICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIG5ld1ZhbHVlID0gKENvbXBvbmVudFNwZWNpZmljYXRpb24pIGludm9rZURpYWxvZyhjb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5nZXROZXdEaWFsb2coKSk7Ci0gICAgICAgICAgaWYgKGNvbnRpbnVlQXBwbHkpCi0gICAgICAgICAgICBjb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlci5tb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoYWRhcHRlciwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gbmV3VmFsdWUgPSAoQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgaW52b2tlRGlhbG9nKGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLmdldEJyb3dzZURpYWxvZygpKTsKLSAgICAgICAgICBpZiAoY29udGludWVBcHBseSkKLSAgICAgICAgICAgIGNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShhZGFwdGVyLCBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9ybWF0Q2hpbGQocGFyZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIE9iamVjdCBpbnZva2VEaWFsb2coSUNvbXBvbmVudERpYWxvZyBkaWFsb2cpCi0gIHsKLSAgICBPYmplY3QgbmV3VmFsdWUgPSBudWxsOwotCi0gICAgaWYgKGRpYWxvZyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIGlmIChkaWFsb2cuY3JlYXRlQW5kT3BlbigpID09IFdpbmRvdy5PSykKLSAgICB7Ci0gICAgICBuZXdWYWx1ZSA9IGRpYWxvZy5nZXRTZWxlY3RlZENvbXBvbmVudCgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY29udGludWVBcHBseSA9IGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiBuZXdWYWx1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBnZXRDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcigpCi0gIHsKLSAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciByZXN1bHQgPSBudWxsOwotICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgIGlmIChlZGl0b3IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKTsKLSAgICB9ICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwcml2YXRlIElFZGl0b3JQYXJ0IGdldEFjdGl2ZUVkaXRvcigpCi0gIHsKLSAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgcmV0dXJuIGVkaXRvclBhcnQ7Ci0gIH0gICAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1NldFhTREZhY2V0VmFsdWVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9TZXRYU0RGYWNldFZhbHVlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDcxNzE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1NldFhTREZhY2V0VmFsdWVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjZXQ7Ci0KLXB1YmxpYyBjbGFzcyBTZXRYU0RGYWNldFZhbHVlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIHByb3RlY3RlZCBYU0RGYWNldCBmYWNldDsKLSAgcHJvdGVjdGVkIFN0cmluZyB2YWx1ZTsKLSAgCi0gIHB1YmxpYyBTZXRYU0RGYWNldFZhbHVlQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTREZhY2V0IGZhY2V0KQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMuZmFjZXQgPSBmYWNldDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgdGhpcy52YWx1ZSA9IHZhbHVlOyAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhmYWNldC5nZXRFbGVtZW50KCkpOwotICAgICAgZmFjZXQuc2V0TGV4aWNhbFZhbHVlKHZhbHVlKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQW5kTWFuYWdlckRpcmVjdGl2ZXNDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0MmE2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VBbmRNYW5hZ2VyRGlyZWN0aXZlc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQW5kTWFuYWdlckRpcmVjdGl2ZXNDb21tYW5kIGV4dGVuZHMgVXBkYXRlQ29tcG9uZW50UmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQKLXsKLQotICBwdWJsaWMgVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQW5kTWFuYWdlckRpcmVjdGl2ZXNDb21tYW5kKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50LCBTdHJpbmcgY29tcG9uZW50TmFtZSwgU3RyaW5nIGNvbXBvbmVudE5hbWVzcGFjZSwgSUZpbGUgZmlsZSkKLSAgewotICAgIHN1cGVyKGNvbmNyZXRlQ29tcG9uZW50LCBjb21wb25lbnROYW1lLCBjb21wb25lbnROYW1lc3BhY2UsIGZpbGUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFhTRENvbXBvbmVudCBnZXREZWZpbmVkQ29tcG9uZW50KFhTRFNjaGVtYSBzY2hlbWEsIFN0cmluZyBjb21wb25lbnROYW1lLCBTdHJpbmcgY29tcG9uZW50TmFtZXNwYWNlKQotICB7Ci0gICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gcmVzdWx0ID0gc2NoZW1hLnJlc29sdmVBdHRyaWJ1dGVEZWNsYXJhdGlvbihjb21wb25lbnROYW1lc3BhY2UsIGNvbXBvbmVudE5hbWUpOwotICAgIGlmIChyZXN1bHQuZUNvbnRhaW5lcigpID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoY29uY3JldGVDb21wb25lbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIFhTRENvbXBvbmVudCBjb21wb25lbnREZWYgPSBjb21wdXRlQ29tcG9uZW50KCk7Ci0gICAgICBpZiAoY29tcG9uZW50RGVmICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFVwZGF0ZUF0dHJpYnV0ZVJlZmVyZW5jZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VDb21tYW5kKG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzLl9VSV9BQ1RJT05fVVBEQVRFX0FUVFJJQlVURV9SRUZFUkVOQ0UsIChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgY29uY3JldGVDb21wb25lbnQsCi0gICAgICAgICAgICAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGNvbXBvbmVudERlZik7Ci0gICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZjYzNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlQXR0cmlidXRlUmVmZXJlbmNlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSwgcmVmOwotCi0gIHB1YmxpYyBVcGRhdGVBdHRyaWJ1dGVSZWZlcmVuY2VDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlLCBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiByZWYpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7Ci0gICAgdGhpcy5yZWYgPSByZWY7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGF0dHJpYnV0ZS5nZXRFbGVtZW50KCkpOwotICAgICAgYXR0cmlidXRlLnNldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24ocmVmKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M0NDNkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgZnJvbSB0aGUgZXh0ZW5zaW9uIHZpZXcgdG8gZWRpdCBleHRlbnNpb24gZWxlbWVudHMKLSAqIGFuZCBhdHRyaWJ1dGVzIHdoaWNoIGFyZSBpbXBsZW1lbnRlZCBhcyBET00gb2JqZWN0cyAobm90IHBhcnQgb2YgdGhlIEVNRiBtb2RlbCkKLSAqIAotICogKHRydW5nKSBhbHNvIHVzZWQgaW4gWFNEQ29tcGxleFR5cGVBZHZhbmNlZFNlY3Rpb24gdG8gY2hhbmdlIGF0dHJpYnV0ZSBvZgotICogc3BlY2ljYWwgYXR0cmlidXRlcyBsaWtlIGJsb2NrLCByZXN0cmljdGlvbiB3aGljaCBpcyBub3QgcGFydCBvZiBFTUYgTW9kZWwKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZCAgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBwcm90ZWN0ZWQgRWxlbWVudCBlbGVtZW50OwotICBwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZU5hbWU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gIAotICAvKiogV2hldGhlciB0aGUgYXR0cmlidXRlIHNob3VsZCBiZSBkZWxldGVkIGlmIHZhbHVlIHRvIAotICAgKiAgIGJlIHNldCBpcyBhbiBlbXB0eSBTdHJpbmcgb3IgbnVsbCAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZGVsZXRlSWZWYWx1ZUVtcHR5ID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSwgYm9vbGVhbiBkZWxldGVJZlZhbHVlRW1wdHkpCi0gIHsKLSAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICAgIHRoaXMuYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7Ci0gICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVZhbHVlOwotICAgIHRoaXMuZGVsZXRlSWZWYWx1ZUVtcHR5ID0gZGVsZXRlSWZWYWx1ZUVtcHR5OwotICB9Ci0KLSAgcHVibGljIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgYXR0cmlidXRlVmFsdWUsIFN0cmluZyBsYWJlbCkKLSAgewotICAgIHRoaXMoZWxlbWVudCwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUsIGZhbHNlKTsKLSAgICBzZXRMYWJlbChOTFMuYmluZChNZXNzYWdlcy5fVUlfQUNUSU9OX0NIQU5HRSwgbGFiZWwpKTsKLSAgfQotICAKLSAgcHVibGljIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgYXR0cmlidXRlVmFsdWUpCi0gIHsKLSAgICB0aGlzKGVsZW1lbnQsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlLCBmYWxzZSk7Ci0gICAgc2V0TGFiZWwoTkxTLmJpbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9DSEFOR0UsIGF0dHJpYnV0ZU5hbWUpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlbGV0ZUlmRW1wdHkoYm9vbGVhbiB2KQotICB7Ci0JICBkZWxldGVJZlZhbHVlRW1wdHkgPSB2OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVOYW1lKFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICB7Ci0gICAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgIGlmIChkZWxldGVJZlZhbHVlRW1wdHkgJiYgCi0gICAgCQkgIChhdHRyaWJ1dGVWYWx1ZSA9PSBudWxsIHx8IGF0dHJpYnV0ZVZhbHVlLmVxdWFscygiIikgKSApCi0gICAgICB7Ci0gICAgCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGRvUG9zdFByb2Nlc3NpbmcoKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgZG9Qb3N0UHJvY2Vzc2luZygpCi0gIHsKLSAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQ29tcGxleFR5cGVEZXJpdmF0aW9uQnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUNvbXBsZXhUeXBlRGVyaXZhdGlvbkJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMGJiYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQ29tcGxleFR5cGVEZXJpdmF0aW9uQnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0REZXJpdmF0aW9uTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFVwZGF0ZUNvbXBsZXhUeXBlRGVyaXZhdGlvbkJ5IGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGU7Ci0gIHByaXZhdGUgU3RyaW5nIGRlcml2YXRpb247Ci0KLSAgcHVibGljIFVwZGF0ZUNvbXBsZXhUeXBlRGVyaXZhdGlvbkJ5KFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSwgU3RyaW5nIGRlcml2YXRpb24pCi0gIHsKLSAgICB0aGlzLmNvbXBsZXhUeXBlID0gY29tcGxleFR5cGU7Ci0gICAgdGhpcy5kZXJpdmF0aW9uID0gZGVyaXZhdGlvbjsKLSAgICAvLyBUT0RPOiB1c2UgbmV3IE1lc3NhZ2UgYnVuZGxlIG1lY2hhbmlzbQotICAgIHNldExhYmVsKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9ERVJJVkVEQllfQ0hBTkdFIikpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICBzdXBlci5leGVjdXRlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoY29tcGxleFR5cGUuZ2V0RWxlbWVudCgpKTsKLSAgICAgIGlmIChkZXJpdmF0aW9uLmVxdWFscyhYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHKSkKLSAgICAgIHsKLSAgICAgICAgY29tcGxleFR5cGUuc2V0RGVyaXZhdGlvbk1ldGhvZChYU0REZXJpdmF0aW9uTWV0aG9kLkVYVEVOU0lPTl9MSVRFUkFMKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGRlcml2YXRpb24uZXF1YWxzKFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRykpCi0gICAgICB7Ci0gICAgICAgIGNvbXBsZXhUeXBlLnNldERlcml2YXRpb25NZXRob2QoWFNERGVyaXZhdGlvbk1ldGhvZC5SRVNUUklDVElPTl9MSVRFUkFMKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQ29tcG9uZW50UmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUNvbXBvbmVudFJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMjNmMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQ29tcG9uZW50UmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VJbXBsOwotcHVibGljIGFic3RyYWN0IGNsYXNzIFVwZGF0ZUNvbXBvbmVudFJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgcHJvdGVjdGVkIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50OwotICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXBvbmVudE5hbWU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgY29tcG9uZW50TmFtZXNwYWNlOwotICBwcm90ZWN0ZWQgSUZpbGUgZmlsZTsKLQotICBwdWJsaWMgVXBkYXRlQ29tcG9uZW50UmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQoWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQsIFN0cmluZyBjb21wb25lbnROYW1lLCBTdHJpbmcgY29tcG9uZW50TmFtZXNwYWNlLCBJRmlsZSBmaWxlKQotICB7Ci0gICAgdGhpcy5jb25jcmV0ZUNvbXBvbmVudCA9IGNvbmNyZXRlQ29tcG9uZW50OwotICAgIHRoaXMuY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWU7Ci0gICAgdGhpcy5jb21wb25lbnROYW1lc3BhY2UgPSBjb21wb25lbnROYW1lc3BhY2U7Ci0gICAgdGhpcy5maWxlID0gZmlsZTsKLSAgfQotCi0gIHByb3RlY3RlZCBYU0RDb21wb25lbnQgY29tcHV0ZUNvbXBvbmVudCgpCi0gIHsKLSAgICBYU0RDb21wb25lbnQgcmVzdWx0ID0gbnVsbDsKLSAgICBYU0RTY2hlbWEgc2NoZW1hID0gY29uY3JldGVDb21wb25lbnQuZ2V0U2NoZW1hKCk7Ci0gICAgWFNEU2NoZW1hRGlyZWN0aXZlIGRpcmVjdGl2ZSA9IG51bGw7Ci0KLSAgICAvLyBsZXRzIHNlZSBpZiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IHZpc2libGUgdG8gb3VyIHNjaGVtYQotICAgIHJlc3VsdCA9IGdldERlZmluZWRDb21wb25lbnQoc2NoZW1hLCBjb21wb25lbnROYW1lLCBjb21wb25lbnROYW1lc3BhY2UpOwotICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBUT0RPIChjcykgd2UgbmVlZCB0byBwcm92aWRlIGEgc2VwYXJhdGUgY29tbWFuZCB0byBkbyB0aGlzIHBhcnQKLSAgICAgIC8vCi0gICAgICAvLyBhcHBhcmVudGx5IHRoZSBlbGVtZW50IGlzIG5vdCB5ZXQgdmlzaWJsZSwgd2UgbmVlZCB0byBhZGQKLSAgICAgIC8vIGluY2x1ZGVzL2ltcG9ydHMgdG8gZ2V0IHRvIGl0Ci0gICAgICBpZiAoY29tcG9uZW50TmFtZXNwYWNlICE9IG51bGwgJiYgY29tcG9uZW50TmFtZXNwYWNlLmVxdWFscyhzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKQotICAgICAgewotICAgICAgICAvLyB3ZSBuZWVkIHRvIGFkZCBhbiBpbmNsdWRlCi0gICAgICAgIC8vIGlmIHRoZSBjb21wb25lbnQncyBuYW1lc3BhY2UgaXMgbm90IG51bGwgYW5kIG1hdGNoZXMgdGhlIHNjaGVtYSdzCi0gICAgICAgIC8vIHRhcmdldCBuYW1lc3BhY2UKLSAgICAgICAgZGlyZWN0aXZlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNESW5jbHVkZSgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29tcG9uZW50TmFtZXNwYWNlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIHdlIG5lZWQgdG8gYWRkIGFuIGluY2x1ZGUKLSAgICAgICAgLy8gaWYgdGhlIGNvbXBvbmVudCdzIG5hbWVzcGFjZSBpcyBudWxsLCB0aGVuIHdlIGNhbiBqdXN0IGFkZCBpdAotICAgICAgICAvLyBvbmx5IGlmIHRoZSBjdXJyZW50IG5hbWVzcGFjZSBpcyBub3QgbnVsbAotICAgICAgICBkaXJlY3RpdmUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RJbmNsdWRlKCk7Ci0KLSAgICAgICAgLy8gd2UgaGF2ZSB0byBlbnN1cmUgdGhlIHNjaGVtYSBmb3Igc2NoZW1hIHByZWZpeCBpcyBOT1QgbnVsbAotICAgICAgICBpZiAoc2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYVFOYW1lUHJlZml4KCkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyB0YXJnZXROUyA9IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICBpZiAodGFyZ2V0TlMgPT0gbnVsbCkKLSAgICAgICAgICAgIHRhcmdldE5TID0gIiI7Ci0gICAgICAgICAgLy8gdGhpcyB3aWxsIGp1c3QgdXBkYXRlIHRoZSBzY2hlbWEgZm9yIHNjaGVtYSBwcmVmaXggdG8gYmUsIHNheSwgeHNkCi0gICAgICAgICAgVXBkYXRlTmFtZXNwYWNlSW5mb3JtYXRpb25Db21tYW5kIGNvbW1hbmQgPSBuZXcgVXBkYXRlTmFtZXNwYWNlSW5mb3JtYXRpb25Db21tYW5kKCIiLCBzY2hlbWEsICIiLCB0YXJnZXROUyk7Ci0gICAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gd2UgbmVlZCB0byBhZGQgYW4gaW1wb3J0Ci0gICAgICAgIFhTREltcG9ydCB4c2RJbXBvcnQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RJbXBvcnQoKTsKLSAgICAgICAgeHNkSW1wb3J0LnNldE5hbWVzcGFjZShjb21wb25lbnROYW1lc3BhY2UpOwotICAgICAgICBkaXJlY3RpdmUgPSB4c2RJbXBvcnQ7Ci0gICAgICB9Ci0KLSAgICAgIFN0cmluZyBsb2NhdGlvbiA9IGNvbXB1dGVOaWNlTG9jYXRpb24oc2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uKCksIGZpbGUpOwotICAgICAgZGlyZWN0aXZlLnNldFNjaGVtYUxvY2F0aW9uKGxvY2F0aW9uKTsKLSAgICAgIC8vIFRPRE8gKGNzKSB3ZSBzaG91bGQgYXQgdGhlIGRpcmVjdGl2ZSAnbmV4dCcgaW4gdGhlIGxpc3Qgb2YgZGlyZWN0aXZlcwotICAgICAgLy8gZm9yIG5vdyBJJ20ganVzdCBhZGRpbmcgYXMgdGhlIGZpcnN0IHRoaW5nIGluIHRoZSBzY2hlbWEgOi0oCi0gICAgICAvLwotICAgICAgc2NoZW1hLmdldENvbnRlbnRzKCkuYWRkKDAsIGRpcmVjdGl2ZSk7Ci0gICAgICBYU0RTY2hlbWEgcmVzb2x2ZWRTY2hlbWEgPSBkaXJlY3RpdmUuZ2V0UmVzb2x2ZWRTY2hlbWEoKTsKLSAgICAgIGlmIChyZXNvbHZlZFNjaGVtYSA9PSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgcGxhdGZvcm1Mb2NhdGlvbiA9ICJwbGF0Zm9ybTovcmVzb3VyY2UiICsgZmlsZS5nZXRGdWxsUGF0aCgpOwotICAgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IGNvbmNyZXRlQ29tcG9uZW50LmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSShwbGF0Zm9ybUxvY2F0aW9uKSk7Ci0gICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIFhTRFJlc291cmNlSW1wbCkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc291cmNlLmxvYWQobnVsbCk7Ci0gICAgICAgICAgICBYU0RSZXNvdXJjZUltcGwgcmVzb3VyY2VJbXBsID0gKFhTRFJlc291cmNlSW1wbCkgcmVzb3VyY2U7Ci0gICAgICAgICAgICByZXNvbHZlZFNjaGVtYSA9IHJlc291cmNlSW1wbC5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlZFNjaGVtYSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBkaXJlY3RpdmUuc2V0UmVzb2x2ZWRTY2hlbWEocmVzb2x2ZWRTY2hlbWEpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHJlc29sdmVkU2NoZW1hICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldERlZmluZWRDb21wb25lbnQocmVzb2x2ZWRTY2hlbWEsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWVzcGFjZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFRPRE8gKGNzKSBjb25zaWRlciBzZXR0aW5nIHNvbWUgZXJyb3Igc3RhdGUgc28gdGhhdCB0aGUgY2xpZW50IGNhbgotICAgICAgICAvLyBwcm92aWRlIGEgcG9wLWRpYWxvZyBlcnJvcgotICAgICAgICAvLyB3ZSBzaG91bGQgYWxzbyByZW1vdmUgdGhlIGltcG9ydC9pbmNsdWRlIHNvIHNhdmUgZnJvbSBjbHV0dGVyaW5nCi0gICAgICAgIC8vIHRoZSBmaWxlIHdpdGggYm9ndXMgZGlyZWN0aXZlcwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQTEFURk9STV9SRVNPVVJDRV9QUkVGSVggPSAicGxhdGZvcm06L3Jlc291cmNlIjsKLSAgcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZU5pY2VMb2NhdGlvbihTdHJpbmcgYmFzZUxvY2F0aW9uLCBJRmlsZSBmaWxlKQotICB7ICAgICAKLSAgICBpZiAoYmFzZUxvY2F0aW9uLnN0YXJ0c1dpdGgoUExBVEZPUk1fUkVTT1VSQ0VfUFJFRklYKSkKLSAgICB7Ci0gICAgICBVUkkgYmFzZVVSSSA9IFVSSS5jcmVhdGVVUkkoYmFzZUxvY2F0aW9uKTsKLSAgICAgIFVSSSBmaWxlVVJJID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotICAgICAgVVJJIHJlbGF0aXZlID0gZmlsZVVSSS5kZXJlc29sdmUoYmFzZVVSSSwgZmFsc2UsIHRydWUsIHRydWUpOyAgICAgIAotICAgICAgcmV0dXJuIHJlbGF0aXZlLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBVUkkgYmFzZVVSSSA9IFVSSS5jcmVhdGVVUkkoYmFzZUxvY2F0aW9uKTsgICAgICAgICAgCi0gICAgICBVUkkgZmlsZVVSSSA9IFVSSS5jcmVhdGVGaWxlVVJJKGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotICAgICAgVVJJIHJlbGF0aXZlID0gZmlsZVVSSS5kZXJlc29sdmUoYmFzZVVSSSwgZmFsc2UsIHRydWUsIHRydWUpOyAgICAgCi0gICAgICByZXR1cm4gcmVsYXRpdmUudG9TdHJpbmcoKTsgICAgCi0gICAgfSAKLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBYU0RDb21wb25lbnQgZ2V0RGVmaW5lZENvbXBvbmVudChYU0RTY2hlbWEgc2NoZW1hLCBTdHJpbmcgY29tcG9uZW50TmFtZSwgU3RyaW5nIGNvbXBvbmVudE5hbWVzcGFjZSk7Ci0KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgZXhlY3V0ZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQ29udGVudE1vZGVsQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlQ29udGVudE1vZGVsQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2E1NjBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUNvbnRlbnRNb2RlbENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb3NpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlQ29udGVudE1vZGVsQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cDsKLSAgWFNEQ29tcG9zaXRvciBvbGRYU0RDb21wb3NpdG9yLCBuZXdYU0RDb21wb3NpdG9yOwotICAKLSAgCi0gIHB1YmxpYyBVcGRhdGVDb250ZW50TW9kZWxDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwLCBYU0RDb21wb3NpdG9yIHhzZENvbXBvc2l0b3IpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RNb2RlbEdyb3VwID0geHNkTW9kZWxHcm91cDsKLSAgICB0aGlzLm5ld1hTRENvbXBvc2l0b3IgPSB4c2RDb21wb3NpdG9yOwotICAgIHRoaXMub2xkWFNEQ29tcG9zaXRvciA9IHhzZE1vZGVsR3JvdXAuZ2V0Q29tcG9zaXRvcigpOwotICB9Ci0KLSAgCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgc3VwZXIuZXhlY3V0ZSgpOwotICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkTW9kZWxHcm91cC5nZXRFbGVtZW50KCkpOwotICAgICAgeHNkTW9kZWxHcm91cC5zZXRDb21wb3NpdG9yKG5ld1hTRENvbXBvc2l0b3IpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIHVuZG8oKQotICB7Ci0gICAgeHNkTW9kZWxHcm91cC5zZXRDb21wb3NpdG9yKG9sZFhTRENvbXBvc2l0b3IpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVFbGVtZW50UmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUVsZW1lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjgwMTgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUVsZW1lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlRWxlbWVudFJlZmVyZW5jZUFuZE1hbmFnZURpcmVjdGl2ZXNDb21tYW5kIGV4dGVuZHMgVXBkYXRlQ29tcG9uZW50UmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQKLXsKLSAgcHVibGljIFVwZGF0ZUVsZW1lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCwgU3RyaW5nIGNvbXBvbmVudE5hbWUsIFN0cmluZyBjb21wb25lbnROYW1lc3BhY2UsIElGaWxlIGZpbGUpCi0gIHsKLSAgICBzdXBlcihjb25jcmV0ZUNvbXBvbmVudCwgY29tcG9uZW50TmFtZSwgY29tcG9uZW50TmFtZXNwYWNlLCBmaWxlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBYU0RDb21wb25lbnQgZ2V0RGVmaW5lZENvbXBvbmVudChYU0RTY2hlbWEgc2NoZW1hLCBTdHJpbmcgY29tcG9uZW50TmFtZSwgU3RyaW5nIGNvbXBvbmVudE5hbWVzcGFjZSkKLSAgewotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBzY2hlbWEucmVzb2x2ZUVsZW1lbnREZWNsYXJhdGlvbihjb21wb25lbnROYW1lc3BhY2UsIGNvbXBvbmVudE5hbWUpOwotICAgIGlmIChyZXN1bHQuZUNvbnRhaW5lcigpID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoY29uY3JldGVDb21wb25lbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIFhTRENvbXBvbmVudCBlbGVtZW50RGVmID0gY29tcHV0ZUNvbXBvbmVudCgpOwotICAgICAgaWYgKGVsZW1lbnREZWYgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgVXBkYXRlRWxlbWVudFJlZmVyZW5jZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVFbGVtZW50UmVmZXJlbmNlQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9FTEVNRU5UX1JFRkVSRU5DRSwgKFhTREVsZW1lbnREZWNsYXJhdGlvbikgY29uY3JldGVDb21wb25lbnQsCi0gICAgICAgICAgICAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50RGVmKTsKLSAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUVsZW1lbnRSZWZlcmVuY2VDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVFbGVtZW50UmVmZXJlbmNlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGI1Mjc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZUVsZW1lbnRSZWZlcmVuY2VDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlRWxlbWVudFJlZmVyZW5jZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCwgcmVmOwotCi0gIHB1YmxpYyBVcGRhdGVFbGVtZW50UmVmZXJlbmNlQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50LCBYU0RFbGVtZW50RGVjbGFyYXRpb24gcmVmKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgdGhpcy5yZWYgPSByZWY7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGVsZW1lbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIGVsZW1lbnQuc2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24ocmVmKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZU1heE9jY3Vyc0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZU1heE9jY3Vyc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ5MDUxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVNYXhPY2N1cnNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVNYXhPY2N1cnNDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLQlwcml2YXRlIGludCBvbGRNYXhPY2N1cnM7Ci0JcHJpdmF0ZSBpbnQgbmV3TWF4T2NjdXJzOwotICBwcml2YXRlIGJvb2xlYW4gcmVtb3ZlTWF4T2NjdXJzQXR0cmlidXRlOwotCQotCVhTRFBhcnRpY2xlIHBhcnRpY2xlOwotCi0gIHB1YmxpYyBVcGRhdGVNYXhPY2N1cnNDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEUGFydGljbGUgcGFydGljbGUsIGludCBNYXhPY2N1cnMpCi0JewotCQlzdXBlcihsYWJlbCk7Ci0JCXRoaXMubmV3TWF4T2NjdXJzID0gTWF4T2NjdXJzOwotCQl0aGlzLnBhcnRpY2xlID0gcGFydGljbGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotCXsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBwYXJ0aWNsZS5nZXRFbGVtZW50KCk7Ci0gICAgICBiZWdpblJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgIFN0cmluZyBjdXJyZW50TWF4ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1BWE9DQ1VSU19BVFRSSUJVVEUpOwotICAgICAgcmVtb3ZlTWF4T2NjdXJzQXR0cmlidXRlID0gKGN1cnJlbnRNYXggPT0gbnVsbCk/IHRydWU6IGZhbHNlOwotCQkgIG9sZE1heE9jY3VycyA9IHBhcnRpY2xlLmdldE1heE9jY3VycygpOwotCQkgIHBhcnRpY2xlLnNldE1heE9jY3VycyhuZXdNYXhPY2N1cnMpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWRvKCkKLQl7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdW5kbygpCi0JewotICAgIGlmIChyZW1vdmVNYXhPY2N1cnNBdHRyaWJ1dGUpCi0gICAgewotICAgICAgcGFydGljbGUudW5zZXRNYXhPY2N1cnMoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQkJICBwYXJ0aWNsZS5zZXRNYXhPY2N1cnMob2xkTWF4T2NjdXJzKTsKLSAgICB9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlTWluT2NjdXJzQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlTWluT2NjdXJzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjQ1MjNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZU1pbk9jY3Vyc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlTWluT2NjdXJzQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIHByaXZhdGUgaW50IG9sZE1pbk9jY3VyczsKLSAgcHJpdmF0ZSBpbnQgbmV3TWluT2NjdXJzOwotICBwcml2YXRlIGJvb2xlYW4gcmVtb3ZlTWluT2NjdXJzQXR0cmlidXRlOwotCi0gIFhTRENvbXBvbmVudCBjb21wb25lbnQ7Ci0KLSAgcHVibGljIFVwZGF0ZU1pbk9jY3Vyc0NvbW1hbmQoU3RyaW5nIGxhYmVsLCBYU0RDb21wb25lbnQgY29tcG9uZW50LCBpbnQgbWluT2NjdXJzKQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMubmV3TWluT2NjdXJzID0gbWluT2NjdXJzOwotICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBjb21wb25lbnQuZ2V0RWxlbWVudCgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgU3RyaW5nIGN1cnJlbnRNaW4gPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTUlOT0NDVVJTX0FUVFJJQlVURSk7Ci0gICAgICByZW1vdmVNaW5PY2N1cnNBdHRyaWJ1dGUgPSAoY3VycmVudE1pbiA9PSBudWxsKSA/IHRydWUgOiBmYWxzZTsKLQotICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgewotICAgICAgICBvbGRNaW5PY2N1cnMgPSAoKFhTRFBhcnRpY2xlKSBjb21wb25lbnQpLmdldE1pbk9jY3VycygpOwotICAgICAgICAoKFhTRFBhcnRpY2xlKSBjb21wb25lbnQpLnNldE1pbk9jY3VycyhuZXdNaW5PY2N1cnMpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgewotICAgICAgICBvbGRNaW5PY2N1cnMgPSAoKChYU0RBdHRyaWJ1dGVVc2UpIGNvbXBvbmVudCkuZ2V0VXNlKCkgPT0gWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkuUkVRVUlSRURfTElURVJBTCA/IDEgOiAwKTsKLSAgICAgICAgaWYgKG5ld01pbk9jY3VycyA9PSAxKQotICAgICAgICAgICgoWFNEQXR0cmlidXRlVXNlKSBjb21wb25lbnQpLnNldFVzZShYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeS5SRVFVSVJFRF9MSVRFUkFMKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICgoWFNEQXR0cmlidXRlVXNlKSBjb21wb25lbnQpLnNldFVzZShYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeS5PUFRJT05BTF9MSVRFUkFMKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVuZG8oKQotICB7Ci0gICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgIHsKLSAgICAgIGlmIChyZW1vdmVNaW5PY2N1cnNBdHRyaWJ1dGUpCi0gICAgICB7Ci0gICAgICAgICgoWFNEUGFydGljbGUpIGNvbXBvbmVudCkudW5zZXRNaW5PY2N1cnMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgKChYU0RQYXJ0aWNsZSkgY29tcG9uZW50KS5zZXRNaW5PY2N1cnMob2xkTWluT2NjdXJzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgIHsKLSAgICAgIGlmIChyZW1vdmVNaW5PY2N1cnNBdHRyaWJ1dGUpCi0gICAgICB7Ci0gICAgICAgICgoWFNEUGFydGljbGUpIGNvbXBvbmVudCkudW5zZXRNaW5PY2N1cnMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKG9sZE1pbk9jY3VycyA9PSAxKQotICAgICAgICAgICgoWFNEQXR0cmlidXRlVXNlKSBjb21wb25lbnQpLnNldFVzZShYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeS5SRVFVSVJFRF9MSVRFUkFMKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICgoWFNEQXR0cmlidXRlVXNlKSBjb21wb25lbnQpLnNldFVzZShYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeS5PUFRJT05BTF9MSVRFUkFMKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZU5hbWVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVOYW1lQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzBhN2MyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZU5hbWVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVJlZmFjdG9yaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUGVyZm9ybVVuc2F2ZWRSZWZhY3RvcmluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuWE1MUmVmYWN0b3JpbmdDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWUuUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVOYW1lQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0vLyAgcHJpdmF0ZSBTdHJpbmcgb2xkTmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgbmV3TmFtZTsKLSAgcHJpdmF0ZSBYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQ7Ci0KLSAgcHVibGljIFVwZGF0ZU5hbWVDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgbmV3TmFtZSkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLQotICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gJiYgY29tcG9uZW50LmdldE5hbWUoKSA9PSBudWxsICYmIGNvbXBvbmVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCAmJiAoKFhTRE5hbWVkQ29tcG9uZW50KSBjb21wb25lbnQuZUNvbnRhaW5lcigpKS5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb21wb25lbnQgPSAoWFNETmFtZWRDb21wb25lbnQpIGNvbXBvbmVudC5lQ29udGFpbmVyKCk7Ci0gICAgfQotCi0gICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0gICAgdGhpcy5uZXdOYW1lID0gbmV3TmFtZTsKLS8vICAgIHRoaXMub2xkTmFtZSA9IGNvbXBvbmVudC5nZXROYW1lKCk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kI2V4ZWN1dGUoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhjb21wb25lbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgIHJlbmFtZUNvbXBvbmVudChuZXdOYW1lKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIFBlcmZvcm1zIGEgcmVuYW1lIHJlZmFjdG9yaW5nIHRvIHJlbmFtZSB0aGUgY29tcG9uZW50IGFuZCBhbGwgdGhlCi0gICAqIHJlZmVyZW5jZXMgdG8gaXQgd2l0aGluIHRoZSBjdXJyZW50IHNjaGVtYS4KLSAgICogCi0gICAqIEBwYXJhbSBuZXdOYW1lIHRoZSBuZXcgY29tcG9uZW50IG5hbWUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgcmVuYW1lQ29tcG9uZW50KFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgLy8gdGhpcyBpcyBhICdnbG9iYWxseScgZGVmaW5lZCBjb21wb25lbnQgKGUuZy4gZ2xvYmFsIGVsZW1lbnQpICAgIAotICAgIGlmIChjb21wb25lbnQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgIHsKLSAgICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgIGlmIChwYWdlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFJlZmFjdG9yaW5nQ29tcG9uZW50IHJlZmFjdG9yaW5nQ29tcG9uZW50ID0gbmV3IFhNTFJlZmFjdG9yaW5nQ29tcG9uZW50KAotICAgICAgICAgICAgICBjb21wb25lbnQsCi0gICAgICAgICAgICAgIChJRE9NRWxlbWVudCljb21wb25lbnQuZ2V0RWxlbWVudCgpLCAKLSAgICAgICAgICAgICAgY29tcG9uZW50LmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgY29tcG9uZW50LmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQotICAgICAgICAgICAgUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IocmVmYWN0b3JpbmdDb21wb25lbnQsIG5ld05hbWUsIHRydWUpOyAgICAKLSAgICAgICAgICAgIFJlbmFtZVJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nID0gbmV3IFJlbmFtZVJlZmFjdG9yaW5nKHByb2Nlc3Nvcik7Ci0gICAgICAgICAgICBQZXJmb3JtVW5zYXZlZFJlZmFjdG9yaW5nT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBQZXJmb3JtVW5zYXZlZFJlZmFjdG9yaW5nT3BlcmF0aW9uKHJlZmFjdG9yaW5nKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbi5ydW4obnVsbCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBXZSBjYW4ndCByZWZhY3RvciByZW5hbWUgZXh0ZXJuYWwgZmlsZXMKLSAgICAgICAgICAgIGNvbXBvbmVudC5zZXROYW1lKG5ld05hbWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gCi0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIHRoaXMgaXMgYSAnbG9jYWxseScgZGVmaW5lZCBjb21wb25lbnQgKGUuZy4gbG9jYWwgZWxlbWVudCkKLSAgICAgIC8vIG5vIG5lZWQgdG8gY2FsbCByZWZhY3RvcmluZyBzaW5jZSB0aGlzIGNvbXBvbmVudCBjYW4ndCBiZSByZWZlcmVuY2VkICAgICAgCi0gICAgICBjb21wb25lbnQuc2V0TmFtZShuZXdOYW1lKTsKLSAgICB9ICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlTmFtZXNwYWNlSW5mb3JtYXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVOYW1lc3BhY2VJbmZvcm1hdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA3OTFiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVOYW1lc3BhY2VJbmZvcm1hdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuWE1MQ2hhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5uc2VkaXQuVGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVHlwZXNIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIFVwZGF0ZU5hbWVzcGFjZUluZm9ybWF0aW9uQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIHByb3RlY3RlZCBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5ld1ByZWZpeCwgbmV3VGFyZ2V0TmFtZXNwYWNlOwotICAKLSAgcHVibGljIFVwZGF0ZU5hbWVzcGFjZUluZm9ybWF0aW9uQ29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRFNjaGVtYSB4c2RTY2hlbWEsIFN0cmluZyBuZXdQcmVmaXgsIFN0cmluZyBuZXdUYXJnZXROYW1lc3BhY2UpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gICAgdGhpcy5uZXdQcmVmaXggPSBuZXdQcmVmaXg7Ci0gICAgdGhpcy5uZXdUYXJnZXROYW1lc3BhY2UgPSBuZXdUYXJnZXROYW1lc3BhY2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIGVuc3VyZVNjaGVtYUVsZW1lbnQoeHNkU2NoZW1hKTsKLSAgICAKLSAgICBFbGVtZW50IGVsZW1lbnQgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIC8vRG9jdW1lbnRJbXBsIGRvYyA9IChEb2N1bWVudEltcGwpIGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCi0gICAgICBTdHJpbmcgbW9kZWxUYXJnZXROYW1lc3BhY2UgPSB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICBTdHJpbmcgb2xkTmFtZXNwYWNlID0geHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotCi0gICAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICAgIFN0cmluZyBvbGRQcmVmaXggPSBoZWxwZXIuZ2V0UHJlZml4KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5UQVJHRVROQU1FU1BBQ0VfQVRUUklCVVRFKSwgZmFsc2UpOwotCi0gICAgICBpZiAobW9kZWxUYXJnZXROYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbW9kZWxUYXJnZXROYW1lc3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotCi0gICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gbmV3VGFyZ2V0TmFtZXNwYWNlLnRyaW0oKTsKLSAgICAgIFN0cmluZyBwcmVmaXggPSBuZXdQcmVmaXgudHJpbSgpOwotCi0gICAgICBpZiAoIXZhbGlkYXRlUHJlZml4KHByZWZpeCkgfHwgIXZhbGlkYXRlVGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA+IDAgJiYgdGFyZ2V0TmFtZXNwYWNlLmxlbmd0aCgpID09IDApCi0gICAgICB7Ci0gICAgICAgIC8vIGNhbid0IGhhdmUgYmxhbmsgdGFyZ2V0bmFtZXNwYWNlIGFuZCB5ZXQgc3BlY2lmeSBhIHByZWZpeAotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIC8vZG9jLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1RBUkdFVE5BTUVTUEFDRV9DSEFOR0UiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGVsZW1lbnQpOwotICAgICAgCi0gICAgICBTdHJpbmcgeHNkRm9yWFNEUHJlZml4ID0geHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYVFOYW1lUHJlZml4KCk7Ci0gICAgICBNYXAgbWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLQotICAgICAgLy8gQ2hlY2sgaWYgcHJlZml4IGlzIGJsYW5rCi0gICAgICAvLyBpZiBpdCBpcywgdGhlbiBtYWtlIHN1cmUgd2UgaGF2ZSBhIHByZWZpeAotICAgICAgLy8gZm9yIHNjaGVtYSBmb3Igc2NoZW1hCi0gICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID09IDApCi0gICAgICB7Ci0gICAgICAgIC8vIGlmIHByZWZpeCBmb3Igc2NoZW1hIGZvciBzY2hlbWEgaXMgYmxhbmsKLSAgICAgICAgLy8gdGhlbiBzZXQgaXQgdG8gdmFsdWUgc3BlY2lmaWVkIGluIHByZWZlcmVuY2UKLSAgICAgICAgLy8gYW5kIHVwZGF0ZSBBTEwgbm9kZXMgd2l0aCB0aGlzIHByZWZpeAotICAgICAgICBpZiAoeHNkRm9yWFNEUHJlZml4ID09IG51bGwgfHwgKHhzZEZvclhTRFByZWZpeCAhPSBudWxsICYmIHhzZEZvclhTRFByZWZpeC50cmltKCkubGVuZ3RoKCkgPT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBnZXQgcHJlZmVyZW5jZSBwcmVmaXgKLSAgICAgICAgICB4c2RGb3JYU0RQcmVmaXggPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0WE1MU2NoZW1hUHJlZml4KCk7Ci0gICAgICAgICAgLy8gZ2V0IGEgdW5pcXVlIHByZWZpeCBieSBjaGVja2luZyB3aGF0J3MgaW4gdGhlIG1hcAotCi0gICAgICAgICAgeHNkRm9yWFNEUHJlZml4ID0gZ2V0VW5pcXVlU2NoZW1hRm9yU2NoZW1hUHJlZml4KHhzZEZvclhTRFByZWZpeCwgbWFwKTsKLSAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgieG1sbnM6IiArIHhzZEZvclhTRFByZWZpeCwgWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgdXBkYXRlQWxsTm9kZXMoZWxlbWVudCwgeHNkRm9yWFNEUHJlZml4KTsKLQotICAgICAgICAgIC8vIHJlbW92ZSB0aGUgb2xkIHhtbG5zIGF0dHJpYnV0ZSBmb3IgdGhlIHNjaGVtYSBmb3Igc2NoZW1hCi0gICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ4bWxucyIpICE9IG51bGwgJiYgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICBlbGVtZW50LmdldEF0dHJpYnV0ZSgieG1sbnMiKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJ4bWxucyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UubGVuZ3RoKCkgPiAwIHx8ICh0YXJnZXROYW1lc3BhY2UubGVuZ3RoKCkgPT0gMCAmJiBwcmVmaXgubGVuZ3RoKCkgPT0gMCkpCi0gICAgICB7Ci0gICAgICAgIC8vIGNsZWFuIHVwIHRoZSBvbGQgcHJlZml4IGZvciB0aGlzIHNjaGVtYQotICAgICAgICBpZiAob2xkUHJlZml4ICE9IG51bGwgJiYgb2xkUHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJ4bWxuczoiICsgb2xkUHJlZml4KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIC8vIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgcHJlZml4LCB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICAgIC8vIGphdmEudXRpbC5NYXAgcHJlZml4VG9OYW1lU3BhY2VNYXAgPQotICAgICAgICAgIC8vIHhzZFNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgICAgICAgLy8gcHJlZml4VG9OYW1lU3BhY2VNYXAucmVtb3ZlKG9sZFByZWZpeCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAvLyBpZiBubyBwcmVmaXgKLSAgICAgICAgewotICAgICAgICAgIGlmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgieG1sbnMiKSAhPSBudWxsKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCFlbGVtZW50LmdldEF0dHJpYnV0ZSgieG1sbnMiKS5lcXVhbHMoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgieG1sbnMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFtb2RlbFRhcmdldE5hbWVzcGFjZS5lcXVhbHModGFyZ2V0TmFtZXNwYWNlKSkKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5UQVJHRVROQU1FU1BBQ0VfQVRUUklCVVRFLCB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICB9Ci0gICAgICAgIC8vIG5vdyBzZXQgdGhlIG5ldyB4bWxuczpwcmVmaXggYXR0cmlidXRlCi0gICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyBwcmVmaXgsIHRhcmdldE5hbWVzcGFjZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgieG1sbnMiLCB0YXJnZXROYW1lc3BhY2UpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgLy8gc2V0IHRoZSB0YXJnZXROYW1lc3BhY2UgYXR0cmlidXRlCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAvLyBlbHNlIHRhcmdldE5hbWVzcGFjZSBpcyBibGFuawotICAgICAgewotICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuVEFSR0VUTkFNRVNQQUNFX0FUVFJJQlVURSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gZG8gb3VyIG93biByZWZlcmVudGlhbCBpbnRlZ3JpdHkKLSAgICAgIFRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIgdGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlciA9IG5ldyBUYXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyKHhzZFNjaGVtYSwgb2xkTmFtZXNwYWNlLCB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgdGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlci5yZXNvbHZlKCk7Ci0KLSAgICAgIHVwZGF0ZUVsZW1lbnQoeHNkU2NoZW1hKTsKLQotICAgICAgLy9kb2MuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIAotICAvLyBpc3N1ZSAoY3MpIEkgZG9uJ3QgaGF2ZSBhIGNsdWUgd2h5IHdlIG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZAotICAvLwotICBwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZUVsZW1lbnQoWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgY29uY3JldGVDb21wLnVwZGF0ZUVsZW1lbnQoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgY29udGFpbm1lbnRzID0gY29uY3JldGVDb21wLmVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgY29udGFpbm1lbnRzLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBFUmVmZXJlbmNlIGVSZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSljb250YWlubWVudHMubmV4dCgpOwotICAgICAgICBpZiAoZVJlZmVyZW5jZS5pc0NvbnRhaW5tZW50KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZVJlZmVyZW5jZS5pc01hbnkoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSAoKENvbGxlY3Rpb24pY29uY3JldGVDb21wLmVHZXQoZVJlZmVyZW5jZSkpLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbmNyZXRlQ29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KW9iamVjdHMubmV4dCgpOwotICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhzZENvbmNyZXRlQ29tcG9uZW50LnVwZGF0ZUVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7fQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29uY3JldGVDb21wb25lbnQgPSAoWFNEQ29uY3JldGVDb21wb25lbnQpY29uY3JldGVDb21wLmVHZXQoZVJlZmVyZW5jZSk7Ci0gICAgICAgICAgICBpZiAoeHNkQ29uY3JldGVDb21wb25lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4c2RDb25jcmV0ZUNvbXBvbmVudC51cGRhdGVFbGVtZW50KCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkge30KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0VW5pcXVlU2NoZW1hRm9yU2NoZW1hUHJlZml4KFN0cmluZyB4c2RGb3JYU0RQcmVmaXgsIE1hcCBtYXApCi0gIHsKLSAgICBpZiAoeHNkRm9yWFNEUHJlZml4ID09IG51bGwgfHwgKHhzZEZvclhTRFByZWZpeCAhPSBudWxsICYmIHhzZEZvclhTRFByZWZpeC50cmltKCkubGVuZ3RoKCkgPT0gMCkpCi0gICAgewotICAgICAgeHNkRm9yWFNEUHJlZml4ID0gInhzZCI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgLy8gZW5zdXJlIHByZWZpeCBpcyB1bmlxdWUKLSAgICBpbnQgcHJlZml4RXh0ZW5zaW9uID0gMTsKLSAgICB3aGlsZSAobWFwLmNvbnRhaW5zS2V5KHhzZEZvclhTRFByZWZpeCkgJiYgcHJlZml4RXh0ZW5zaW9uIDwgMTAwKQotICAgIHsKLSAgICAgIHhzZEZvclhTRFByZWZpeCA9IHhzZEZvclhTRFByZWZpeCArIFN0cmluZy52YWx1ZU9mKHByZWZpeEV4dGVuc2lvbik7Ci0gICAgICBwcmVmaXhFeHRlbnNpb24rKzsKLSAgICB9Ci0gICAgcmV0dXJuIHhzZEZvclhTRFByZWZpeDsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVBbGxOb2RlcyhFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBlbGVtZW50LnNldFByZWZpeChwcmVmaXgpOwotICAgIE5vZGVMaXN0IGxpc3QgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICBpZiAobGlzdCAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgewotICAgICAgICBOb2RlIGNoaWxkID0gbGlzdC5pdGVtKGkpOwotICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBjaGlsZC5zZXRQcmVmaXgocHJlZml4KTsKLSAgICAgICAgICBpZiAoY2hpbGQuaGFzQ2hpbGROb2RlcygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVwZGF0ZUFsbE5vZGVzKChFbGVtZW50KSBjaGlsZCwgcHJlZml4KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVUYXJnZXROYW1lc3BhY2UoU3RyaW5nIG5zKQotICB7Ci0gICAgLy8gd2lsbCBhbGxvdyBibGFuayBuYW1lc3BhY2UgISEKLSAgICBpZiAobnMuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIFVSSSB0ZXN0VVJJID0gbmV3IFVSSShucyk7Ci0gICAgICB0ZXN0VVJJLmlzQWJzb2x1dGUoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGVycm9yTWVzc2FnZSA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9XQVJOX0lOVkFMSURfVEFSR0VUX05BTUVTUEFDRSIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgaWYgKGVycm9yTWVzc2FnZSA9PSBudWxsIHx8IGVycm9yTWVzc2FnZS5sZW5ndGgoKSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUHJlZml4KFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4LmVxdWFscygiIikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBYTUxDaGFyLmlzVmFsaWROQ05hbWUocHJlZml4KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVkbygpCi0gIHsKLSAgICBleGVjdXRlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHVuZG8oKQotICB7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNWNlYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlTnVtZXJpY0JvdW5kc0ZhY2V0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNYXhFeGNsdXNpdmVGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWF4SW5jbHVzaXZlRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1pbkV4Y2x1c2l2ZUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNaW5JbmNsdXNpdmVGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZTsKLSAgU3RyaW5nIG1heCwgbWluOwotICBib29sZWFuIGluY2x1ZGVNaW4sIGluY2x1ZGVNYXg7Ci0gIHByaXZhdGUgYm9vbGVhbiBkb1VwZGF0ZU1heCA9IGZhbHNlLCBkb1VwZGF0ZU1pbiA9IGZhbHNlOwotICBYU0RNaW5JbmNsdXNpdmVGYWNldCBtaW5JbmNsdXNpdmVGYWNldDsKLSAgWFNETWluRXhjbHVzaXZlRmFjZXQgbWluRXhjbHVzaXZlRmFjZXQ7Ci0gIFhTRE1heEluY2x1c2l2ZUZhY2V0IG1heEluY2x1c2l2ZUZhY2V0OwotICBYU0RNYXhFeGNsdXNpdmVGYWNldCBtYXhFeGNsdXNpdmVGYWNldDsKLQotCi0gIHB1YmxpYyBVcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZSwgYm9vbGVhbiBpbmNsdWRlTWluLCBib29sZWFuIGluY2x1ZGVNYXgpCi0gIHsKLSAgICBzdXBlcihsYWJlbCk7Ci0gICAgdGhpcy54c2RTaW1wbGVUeXBlID0geHNkU2ltcGxlVHlwZTsKLSAgICB0aGlzLmluY2x1ZGVNaW4gPSBpbmNsdWRlTWluOwotICAgIHRoaXMuaW5jbHVkZU1heCA9IGluY2x1ZGVNYXg7Ci0gICAgCi0gICAgbWluSW5jbHVzaXZlRmFjZXQgPSB4c2RTaW1wbGVUeXBlLmdldE1pbkluY2x1c2l2ZUZhY2V0KCk7Ci0gICAgbWluRXhjbHVzaXZlRmFjZXQgPSB4c2RTaW1wbGVUeXBlLmdldE1pbkV4Y2x1c2l2ZUZhY2V0KCk7Ci0gICAgbWF4SW5jbHVzaXZlRmFjZXQgPSB4c2RTaW1wbGVUeXBlLmdldE1heEluY2x1c2l2ZUZhY2V0KCk7Ci0gICAgbWF4RXhjbHVzaXZlRmFjZXQgPSB4c2RTaW1wbGVUeXBlLmdldE1heEV4Y2x1c2l2ZUZhY2V0KCk7Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1pbihTdHJpbmcgbWluKQotICB7Ci0gICAgdGhpcy5taW4gPSBtaW47Ci0gICAgZG9VcGRhdGVNaW4gPSB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNYXgoU3RyaW5nIG1heCkKLSAgewotICAgIHRoaXMubWF4ID0gbWF4OwotICAgIGRvVXBkYXRlTWF4ID0gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkU2ltcGxlVHlwZS5nZXRFbGVtZW50KCkpOwotCi0gICAgICBpZiAoZG9VcGRhdGVNaW4pCi0gICAgICB7Ci0gICAgICAgIGlmIChpbmNsdWRlTWluKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG1pbkluY2x1c2l2ZUZhY2V0ID09IG51bGwgJiYgbWluICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWluSW5jbHVzaXZlRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RNaW5JbmNsdXNpdmVGYWNldCgpOwotICAgICAgICAgICAgbWluSW5jbHVzaXZlRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1pbik7Ci0gICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobWluSW5jbHVzaXZlRmFjZXQpOwotCi0gICAgICAgICAgICBpZiAobWluRXhjbHVzaXZlRmFjZXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKG1pbkV4Y2x1c2l2ZUZhY2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAobWluSW5jbHVzaXZlRmFjZXQgIT0gbnVsbCAmJiBtaW4gIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtaW5JbmNsdXNpdmVGYWNldC5zZXRMZXhpY2FsVmFsdWUobWluKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAobWluSW5jbHVzaXZlRmFjZXQgIT0gbnVsbCAmJiBtaW4gPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobWluSW5jbHVzaXZlRmFjZXQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIC8vICFpbmNsdWRlTWluCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobWluRXhjbHVzaXZlRmFjZXQgPT0gbnVsbCAmJiBtaW4gIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtaW5FeGNsdXNpdmVGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRE1pbkV4Y2x1c2l2ZUZhY2V0KCk7Ci0gICAgICAgICAgICBtaW5FeGNsdXNpdmVGYWNldC5zZXRMZXhpY2FsVmFsdWUobWluKTsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChtaW5FeGNsdXNpdmVGYWNldCk7Ci0KLSAgICAgICAgICAgIGlmIChtaW5JbmNsdXNpdmVGYWNldCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobWluSW5jbHVzaXZlRmFjZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChtaW5FeGNsdXNpdmVGYWNldCAhPSBudWxsICYmIG1pbiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1pbkV4Y2x1c2l2ZUZhY2V0LnNldExleGljYWxWYWx1ZShtaW4pOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChtaW5FeGNsdXNpdmVGYWNldCAhPSBudWxsICYmIG1pbiA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShtaW5FeGNsdXNpdmVGYWNldCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChkb1VwZGF0ZU1heCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGluY2x1ZGVNYXgpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobWF4SW5jbHVzaXZlRmFjZXQgPT0gbnVsbCAmJiBtYXggIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXhJbmNsdXNpdmVGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRE1heEluY2x1c2l2ZUZhY2V0KCk7Ci0gICAgICAgICAgICBtYXhJbmNsdXNpdmVGYWNldC5zZXRMZXhpY2FsVmFsdWUobWF4KTsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChtYXhJbmNsdXNpdmVGYWNldCk7Ci0KLSAgICAgICAgICAgIGlmIChtYXhFeGNsdXNpdmVGYWNldCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobWF4RXhjbHVzaXZlRmFjZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChtYXhJbmNsdXNpdmVGYWNldCAhPSBudWxsICYmIG1heCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1heEluY2x1c2l2ZUZhY2V0LnNldExleGljYWxWYWx1ZShtYXgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChtYXhJbmNsdXNpdmVGYWNldCAhPSBudWxsICYmIG1heCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShtYXhJbmNsdXNpdmVGYWNldCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgLy8gIWluY2x1ZGVNYXgKLSAgICAgICAgewotICAgICAgICAgIGlmIChtYXhFeGNsdXNpdmVGYWNldCA9PSBudWxsICYmIG1heCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1heEV4Y2x1c2l2ZUZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETWF4RXhjbHVzaXZlRmFjZXQoKTsKLSAgICAgICAgICAgIG1heEV4Y2x1c2l2ZUZhY2V0LnNldExleGljYWxWYWx1ZShtYXgpOwotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkuYWRkKG1heEV4Y2x1c2l2ZUZhY2V0KTsKLQotICAgICAgICAgICAgaWYgKG1heEluY2x1c2l2ZUZhY2V0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShtYXhJbmNsdXNpdmVGYWNldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKG1heEV4Y2x1c2l2ZUZhY2V0ICE9IG51bGwgJiYgbWF4ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWF4RXhjbHVzaXZlRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1heCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKG1heEV4Y2x1c2l2ZUZhY2V0ICE9IG51bGwgJiYgbWF4ID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKG1heEV4Y2x1c2l2ZUZhY2V0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZm9ybWF0Q2hpbGQoeHNkU2ltcGxlVHlwZS5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVN0cmluZ0xlbmd0aEZhY2V0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlU3RyaW5nTGVuZ3RoRmFjZXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZTc4ZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlU3RyaW5nTGVuZ3RoRmFjZXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRExlbmd0aEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNYXhMZW5ndGhGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWluTGVuZ3RoRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlU3RyaW5nTGVuZ3RoRmFjZXRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZTsKLSAgU3RyaW5nIG1heCwgbWluOwotICBwcml2YXRlIGJvb2xlYW4gZG9VcGRhdGVNYXggPSBmYWxzZSwgZG9VcGRhdGVNaW4gPSBmYWxzZTsKLQotICBwdWJsaWMgVXBkYXRlU3RyaW5nTGVuZ3RoRmFjZXRDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZSkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZFNpbXBsZVR5cGUgPSB4c2RTaW1wbGVUeXBlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNaW4oU3RyaW5nIG1pbikKLSAgewotICAgIHRoaXMubWluID0gbWluOwotICAgIGRvVXBkYXRlTWluID0gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TWF4KFN0cmluZyBtYXgpCi0gIHsKLSAgICB0aGlzLm1heCA9IG1heDsKLSAgICBkb1VwZGF0ZU1heCA9IHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkU2ltcGxlVHlwZS5nZXRFbGVtZW50KCkpOwotICAgICAgWFNETGVuZ3RoRmFjZXQgbGVuZ3RoRmFjZXQgPSB4c2RTaW1wbGVUeXBlLmdldEVmZmVjdGl2ZUxlbmd0aEZhY2V0KCk7Ci0gICAgICBYU0RNaW5MZW5ndGhGYWNldCBtaW5MZW5ndGhGYWNldCA9IHhzZFNpbXBsZVR5cGUuZ2V0RWZmZWN0aXZlTWluTGVuZ3RoRmFjZXQoKTsKLSAgICAgIFhTRE1heExlbmd0aEZhY2V0IG1heExlbmd0aEZhY2V0ID0geHNkU2ltcGxlVHlwZS5nZXRFZmZlY3RpdmVNYXhMZW5ndGhGYWNldCgpOwotCi0gICAgICBTdHJpbmcgY3VycmVudExlbmd0aCA9IG51bGwsIGN1cnJlbnRNaW4gPSBudWxsLCBjdXJyZW50TWF4ID0gbnVsbDsKLSAgICAgIGlmIChsZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgewotICAgICAgICBjdXJyZW50TGVuZ3RoID0gbGVuZ3RoRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgICB9Ci0gICAgICBpZiAobWluTGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY3VycmVudE1pbiA9IG1pbkxlbmd0aEZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgICAgfQotICAgICAgaWYgKG1heExlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGN1cnJlbnRNYXggPSBtYXhMZW5ndGhGYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRvVXBkYXRlTWF4ICYmICFkb1VwZGF0ZU1pbikKLSAgICAgIHsKLSAgICAgICAgaWYgKG1heExlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobWF4ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKG1heC5lcXVhbHMoY3VycmVudE1pbikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGxlbmd0aEZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETGVuZ3RoRmFjZXQoKTsKLSAgICAgICAgICAgICAgbGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1heCk7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChsZW5ndGhGYWNldCk7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShtYXhMZW5ndGhGYWNldCk7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShtaW5MZW5ndGhGYWNldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChsZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKGxlbmd0aEZhY2V0KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAobWluTGVuZ3RoRmFjZXQgPT0gbnVsbCAmJiBjdXJyZW50TGVuZ3RoICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtaW5MZW5ndGhGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRE1pbkxlbmd0aEZhY2V0KCk7Ci0gICAgICAgICAgICAgICAgbWluTGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKGN1cnJlbnRMZW5ndGgpOwotICAgICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChtaW5MZW5ndGhGYWNldCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgbWF4TGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1heCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobWF4TGVuZ3RoRmFjZXQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY3VycmVudE1pbiAhPSBudWxsICYmIGN1cnJlbnRNaW4uZXF1YWxzKG1heCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGxlbmd0aEZhY2V0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGxlbmd0aEZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETGVuZ3RoRmFjZXQoKTsKLSAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkuYWRkKGxlbmd0aEZhY2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxlbmd0aEZhY2V0LnNldExleGljYWxWYWx1ZShtYXgpOwotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKG1pbkxlbmd0aEZhY2V0KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoY3VycmVudExlbmd0aCAhPSBudWxsICYmICFjdXJyZW50TGVuZ3RoLmVxdWFscyhtYXgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShsZW5ndGhGYWNldCk7Ci0KLSAgICAgICAgICAgIGlmIChtYXggIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWF4TGVuZ3RoRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RNYXhMZW5ndGhGYWNldCgpOwotICAgICAgICAgICAgICBtYXhMZW5ndGhGYWNldC5zZXRMZXhpY2FsVmFsdWUobWF4KTsKLSAgICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkuYWRkKG1heExlbmd0aEZhY2V0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWluTGVuZ3RoRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RNaW5MZW5ndGhGYWNldCgpOwotICAgICAgICAgICAgbWluTGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKGN1cnJlbnRMZW5ndGgpOwotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkuYWRkKG1pbkxlbmd0aEZhY2V0KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChsZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobGVuZ3RoRmFjZXQpOwotCi0gICAgICAgICAgICAgIG1pbkxlbmd0aEZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETWluTGVuZ3RoRmFjZXQoKTsKLSAgICAgICAgICAgICAgbWluTGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKGN1cnJlbnRMZW5ndGgpOwotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobWluTGVuZ3RoRmFjZXQpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXhMZW5ndGhGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRE1heExlbmd0aEZhY2V0KCk7Ci0gICAgICAgICAgICBtYXhMZW5ndGhGYWNldC5zZXRMZXhpY2FsVmFsdWUobWF4KTsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChtYXhMZW5ndGhGYWNldCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICghZG9VcGRhdGVNYXggJiYgZG9VcGRhdGVNaW4pCi0gICAgICB7Ci0gICAgICAgIGlmIChtaW5MZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG1pbiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtaW4uZXF1YWxzKGN1cnJlbnRNYXgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsZW5ndGhGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRExlbmd0aEZhY2V0KCk7Ci0gICAgICAgICAgICAgIGxlbmd0aEZhY2V0LnNldExleGljYWxWYWx1ZShtaW4pOwotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobGVuZ3RoRmFjZXQpOwotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobWF4TGVuZ3RoRmFjZXQpOwotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobWluTGVuZ3RoRmFjZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAobGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShsZW5ndGhGYWNldCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKG1heExlbmd0aEZhY2V0ID09IG51bGwgJiYgY3VycmVudExlbmd0aCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWF4TGVuZ3RoRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RNYXhMZW5ndGhGYWNldCgpOwotICAgICAgICAgICAgICAgIG1heExlbmd0aEZhY2V0LnNldExleGljYWxWYWx1ZShjdXJyZW50TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobWF4TGVuZ3RoRmFjZXQpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIG1pbkxlbmd0aEZhY2V0LnNldExleGljYWxWYWx1ZShtaW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgeHNkU2ltcGxlVHlwZS5nZXRGYWNldENvbnRlbnRzKCkucmVtb3ZlKG1pbkxlbmd0aEZhY2V0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGN1cnJlbnRNYXggIT0gbnVsbCAmJiBjdXJyZW50TWF4LmVxdWFscyhtaW4pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChsZW5ndGhGYWNldCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsZW5ndGhGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRExlbmd0aEZhY2V0KCk7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChsZW5ndGhGYWNldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsZW5ndGhGYWNldC5zZXRMZXhpY2FsVmFsdWUobWluKTsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShtYXhMZW5ndGhGYWNldCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRMZW5ndGggIT0gbnVsbCAmJiAhY3VycmVudExlbmd0aC5lcXVhbHMobWluKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobGVuZ3RoRmFjZXQpOwotCi0gICAgICAgICAgICBpZiAobWluICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1pbkxlbmd0aEZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETWluTGVuZ3RoRmFjZXQoKTsKLSAgICAgICAgICAgICAgbWluTGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKG1pbik7Ci0gICAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChtaW5MZW5ndGhGYWNldCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1heExlbmd0aEZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETWF4TGVuZ3RoRmFjZXQoKTsKLSAgICAgICAgICAgIG1heExlbmd0aEZhY2V0LnNldExleGljYWxWYWx1ZShjdXJyZW50TGVuZ3RoKTsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChtYXhMZW5ndGhGYWNldCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtaW5MZW5ndGhGYWNldCA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRE1pbkxlbmd0aEZhY2V0KCk7Ci0gICAgICAgICAgICBtaW5MZW5ndGhGYWNldC5zZXRMZXhpY2FsVmFsdWUobWluKTsKLSAgICAgICAgICAgIHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpLmFkZChtaW5MZW5ndGhGYWNldCk7Ci0KLSAgICAgICAgICAgIGlmIChsZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5yZW1vdmUobGVuZ3RoRmFjZXQpOwotCi0gICAgICAgICAgICAgIG1heExlbmd0aEZhY2V0ID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNETWF4TGVuZ3RoRmFjZXQoKTsKLSAgICAgICAgICAgICAgbWF4TGVuZ3RoRmFjZXQuc2V0TGV4aWNhbFZhbHVlKGN1cnJlbnRMZW5ndGgpOwotICAgICAgICAgICAgICB4c2RTaW1wbGVUeXBlLmdldEZhY2V0Q29udGVudHMoKS5hZGQobWF4TGVuZ3RoRmFjZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZm9ybWF0Q2hpbGQoeHNkU2ltcGxlVHlwZS5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVRleHRWYWx1ZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVRleHRWYWx1ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY2MzY0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVUZXh0VmFsdWVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5UcmVlQ29udGVudEhlbHBlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCBmcm9tIHRoZSBleHRlbnNpb24gdmlldyB0byBlZGl0IGV4dGVuc2lvbiBlbGVtZW50cwotICogYW5kIHdoaWNoIGFyZSBpbXBsZW1lbnRlZCBhcyBET00gb2JqZWN0cyAobm90IHBhcnQgb2YgdGhlIEVNRiBtb2RlbCkKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVRleHRWYWx1ZUNvbW1hbmQgIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgRWxlbWVudCBlbGVtZW50OwotICBTdHJpbmcgdmFsdWU7Ci0gIAotICBwdWJsaWMgVXBkYXRlVGV4dFZhbHVlQ29tbWFuZChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICB9Ci0KLSAgCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoZWxlbWVudCk7ICAgICAgCi0gICAgICBOb2RlIHRleHROb2RlID0gbnVsbDsKLSAgICAgIFRyZWVDb250ZW50SGVscGVyIGhlbHBlciA9IG5ldyBUcmVlQ29udGVudEhlbHBlcigpOwotICAgICAgZm9yIChOb2RlIG5vZGUgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSAKLSAgICAgIHsKLSAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJgotICAgICAgICAgICAgIWhlbHBlci5pc0lnbm9yYWJsZVRleHQobm9kZSkpIAotICAgICAgICB7Ci0gICAgICAgICAgdGV4dE5vZGUgPSBub2RlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9ICAgICAgICAgCi0gICAgICB9ICAgICAgIAotICAgICAgaWYgKHRleHROb2RlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRleHROb2RlID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoIiIpOwotICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHRleHROb2RlKTsKLSAgICAgIH0gIAotICAgICAgaGVscGVyLnNldE5vZGVWYWx1ZSh0ZXh0Tm9kZSwgdmFsdWUpOyAgICAgICAgCi0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVUeXBlUmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVR5cGVSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTM0YmJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVR5cGVSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVUeXBlUmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQgZXh0ZW5kcyBVcGRhdGVDb21wb25lbnRSZWZlcmVuY2VBbmRNYW5hZ2VEaXJlY3RpdmVzQ29tbWFuZAotewotCi0gIHB1YmxpYyBVcGRhdGVUeXBlUmVmZXJlbmNlQW5kTWFuYWdlRGlyZWN0aXZlc0NvbW1hbmQoWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQsCi0JCSAgU3RyaW5nIGNvbXBvbmVudE5hbWUsIFN0cmluZyBjb21wb25lbnROYW1lc3BhY2UsIElGaWxlIGZpbGUpCi0gIHsKLQkgIHN1cGVyKGNvbmNyZXRlQ29tcG9uZW50LCBjb21wb25lbnROYW1lLCBjb21wb25lbnROYW1lc3BhY2UsIGZpbGUpOwotICB9Ci0KLSAgCi0gIHByb3RlY3RlZCBYU0RDb21wb25lbnQgZ2V0RGVmaW5lZENvbXBvbmVudChYU0RTY2hlbWEgc2NoZW1hLCBTdHJpbmcgY29tcG9uZW50TmFtZSwgU3RyaW5nIGNvbXBvbmVudE5hbWVzcGFjZSkKLSAgewotICAgIFhTRFR5cGVEZWZpbml0aW9uIHJlc3VsdCA9IHNjaGVtYS5yZXNvbHZlVHlwZURlZmluaXRpb24oY29tcG9uZW50TmFtZXNwYWNlLCBjb21wb25lbnROYW1lKTsKLSAgICBpZiAocmVzdWx0LmVDb250YWluZXIoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG51bGw7Ci0gICAgfSAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIAotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKGNvbmNyZXRlQ29tcG9uZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICBYU0RDb21wb25lbnQgdGQgPSBjb21wdXRlQ29tcG9uZW50KCk7Ci0gICAgICBpZiAodGQgIT0gbnVsbCAmJiB0ZCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBVcGRhdGVUeXBlUmVmZXJlbmNlQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZVR5cGVSZWZlcmVuY2VDb21tYW5kKGNvbmNyZXRlQ29tcG9uZW50LCAoWFNEVHlwZURlZmluaXRpb24pIHRkKTsKLSAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVR5cGVSZWZlcmVuY2VDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVUeXBlUmVmZXJlbmNlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGExMDZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVR5cGVSZWZlcmVuY2VDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlVHlwZVJlZmVyZW5jZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotewotICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudDsKLSAgWFNEVHlwZURlZmluaXRpb24gbmV3VHlwZTsKLSAgCi0gIHB1YmxpYyBVcGRhdGVUeXBlUmVmZXJlbmNlQ29tbWFuZChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCwgWFNEVHlwZURlZmluaXRpb24gbmV3VHlwZSkKLSAgewotICAgIHRoaXMuY29uY3JldGVDb21wb25lbnQgPSBjb25jcmV0ZUNvbXBvbmVudDsKLSAgICB0aGlzLm5ld1R5cGUgPSBuZXdUeXBlOwotICB9Ci0gICAKLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiZWdpblJlY29yZGluZyhjb25jcmV0ZUNvbXBvbmVudC5nZXRFbGVtZW50KCkpOwotCi0gICAgICBpZiAoY29uY3JldGVDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIHNldEVsZW1lbnRUeXBlKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGNvbmNyZXRlQ29tcG9uZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlVXNlKQotICAgICAgewotICAgICAgICBzZXRBdHRyaWJ1dGVUeXBlKChYU0RBdHRyaWJ1dGVVc2UpIGNvbmNyZXRlQ29tcG9uZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIHNldEF0dHJpYnV0ZVR5cGUoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjb25jcmV0ZUNvbXBvbmVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBlbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgc2V0RWxlbWVudFR5cGUoWFNERWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7Ci0gICAgZWQgPSBlZC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgIGlmIChlZCAhPSBudWxsKQotICAgIHsgIAotICAgICAgZWQuc2V0VHlwZURlZmluaXRpb24obmV3VHlwZSk7Ci0gICAgfSAgICAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzZXRBdHRyaWJ1dGVUeXBlKFhTREF0dHJpYnV0ZVVzZSBhdHRyaWJ1dGVVc2UpCi0gIHsKLSAgICBzZXRBdHRyaWJ1dGVUeXBlKGF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgc2V0QXR0cmlidXRlVHlwZShYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkKLSAgewotICAgIGFkID0gYWQuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgIGlmIChhZCAhPSBudWxsICYmIG5ld1R5cGUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBhZC5zZXRUeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pbmV3VHlwZSk7Ci0gICAgfSAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVhTRFBhdHRlcm5GYWNldENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL2NvbW1hbmRzL1VwZGF0ZVhTRFBhdHRlcm5GYWNldENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxYjZhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVYU0RQYXR0ZXJuRmFjZXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXR0ZXJuRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlWFNEUGF0dGVybkZhY2V0Q29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFTEVURSA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQREFURSA9IDI7Ci0gIAotICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLSAgU3RyaW5nIHZhbHVlOwotICBpbnQgYWN0aW9uVHlwZTsKLSAgWFNEUGF0dGVybkZhY2V0IHBhdHRlcm5Ub0VkaXQ7Ci0gIAotICBwdWJsaWMgVXBkYXRlWFNEUGF0dGVybkZhY2V0Q29tbWFuZChTdHJpbmcgbGFiZWwsIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLCBpbnQgYWN0aW9uVHlwZSkKLSAgewotICAgIHN1cGVyKGxhYmVsKTsKLSAgICB0aGlzLnhzZFNpbXBsZVR5cGVEZWZpbml0aW9uID0geHNkU2ltcGxlVHlwZURlZmluaXRpb247Ci0gICAgdGhpcy5hY3Rpb25UeXBlID0gYWN0aW9uVHlwZTsKLSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuVG9FZGl0KFhTRFBhdHRlcm5GYWNldCBwYXR0ZXJuVG9FZGl0KQotICB7Ci0gICAgdGhpcy5wYXR0ZXJuVG9FZGl0ID0gcGF0dGVyblRvRWRpdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICAgIGlmIChhY3Rpb25UeXBlID09IEFERCkKLSAgICAgIHsKLSAgICAgICAgWFNEUGF0dGVybkZhY2V0IHBhdHRlcm4gPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RQYXR0ZXJuRmFjZXQoKTsKLSAgICAgICAgcGF0dGVybi5zZXRMZXhpY2FsVmFsdWUodmFsdWUpOwotICAgICAgICB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRGYWNldENvbnRlbnRzKCkuYWRkKHBhdHRlcm4pOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYWN0aW9uVHlwZSA9PSBERUxFVEUpCi0gICAgICB7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwocGF0dGVyblRvRWRpdCk7Ci0gICAgICAgIGlmICh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRGYWNldENvbnRlbnRzKCkuY29udGFpbnMocGF0dGVyblRvRWRpdCkpCi0gICAgICAgICAgeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZShwYXR0ZXJuVG9FZGl0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGFjdGlvblR5cGUgPT0gVVBEQVRFKQotICAgICAgewotICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKHBhdHRlcm5Ub0VkaXQpOwotICAgICAgICBwYXR0ZXJuVG9FZGl0LnNldExleGljYWxWYWx1ZSh2YWx1ZSk7Ci0gICAgICB9Ci0gICAgICBmb3JtYXRDaGlsZCh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVYU0RXaGl0ZVNwYWNlRmFjZXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9jb21tYW5kcy9VcGRhdGVYU0RXaGl0ZVNwYWNlRmFjZXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkOTJjM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vY29tbWFuZHMvVXBkYXRlWFNEV2hpdGVTcGFjZUZhY2V0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaGl0ZVNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaGl0ZVNwYWNlRmFjZXQ7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVYU0RXaGl0ZVNwYWNlRmFjZXRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKLXsKLSAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZURlZmluaXRpb247Ci0gIGJvb2xlYW4gZG9BZGRGYWNldDsKLSAgCi0gIHB1YmxpYyBVcGRhdGVYU0RXaGl0ZVNwYWNlRmFjZXRDb21tYW5kKFN0cmluZyBsYWJlbCwgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZSwgYm9vbGVhbiBkb0FkZEZhY2V0KQotICB7Ci0gICAgc3VwZXIobGFiZWwpOwotICAgIHRoaXMueHNkU2ltcGxlVHlwZURlZmluaXRpb24gPSB4c2RTaW1wbGVUeXBlOwotICAgIHRoaXMuZG9BZGRGYWNldCA9IGRvQWRkRmFjZXQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGJlZ2luUmVjb3JkaW5nKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEVsZW1lbnQoKSk7Ci0gICAgICBYU0RXaGl0ZVNwYWNlRmFjZXQgd2hpdGVzcGFjZUZhY2V0ID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0V2hpdGVTcGFjZUZhY2V0KCk7Ci0KLSAgICAgIGlmIChkb0FkZEZhY2V0KQotICAgICAgewotICAgICAgICBpZiAod2hpdGVzcGFjZUZhY2V0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB3aGl0ZXNwYWNlRmFjZXQgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RXaGl0ZVNwYWNlRmFjZXQoKTsKLSAgICAgICAgICB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRGYWNldENvbnRlbnRzKCkuYWRkKHdoaXRlc3BhY2VGYWNldCk7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpdGVzcGFjZUZhY2V0LnNldExleGljYWxWYWx1ZShYU0RXaGl0ZVNwYWNlLkNPTExBUFNFX0xJVEVSQUwuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKHdoaXRlc3BhY2VGYWNldCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0RmFjZXRDb250ZW50cygpLnJlbW92ZSh3aGl0ZXNwYWNlRmFjZXQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmb3JtYXRDaGlsZCh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3Byb3ZpZGVycy9YU0RTZWN0aW9uTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9wcm92aWRlcnMvWFNEU2VjdGlvbkxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIxZTVmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3Byb3ZpZGVycy9YU0RTZWN0aW9uTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuRmlsZVN0b3JlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZGFwdGVycy5YU0RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkYXB0ZXJzLlhTREJhc2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0Lm91dGxpbmUuSVRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTZWN0aW9uTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLXsKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIFhTRFNlY3Rpb25MYWJlbFByb3ZpZGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIGlmIChvYmplY3QgPT0gbnVsbCB8fCBvYmplY3QuZXF1YWxzKFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBJbWFnZSByZXN1bHQgPSBudWxsOwotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIE9iamVjdCBzZWxlY3RlZCA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgb2JqZWN0KS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIFhTREJhc2VBZGFwdGVyIGFkYXB0ZXIgPSAoWFNEQmFzZUFkYXB0ZXIpWFNEQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5hZGFwdCgoWFNEQ29uY3JldGVDb21wb25lbnQpc2VsZWN0ZWQpOwotICAgICAgICByZXR1cm4gKChJVHJlZUVsZW1lbnQpYWRhcHRlcikuZ2V0SW1hZ2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBpZiAob2JqZWN0ID09IG51bGwgfHwgb2JqZWN0LmVxdWFscyhTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKSkKLSAgICB7Ci0gICAgICByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfTk9fSVRFTVNfU0VMRUNURUQ7Ci0gICAgfQotCi0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0KLSAgICBib29sZWFuIGlzUmVmZXJlbmNlID0gZmFsc2U7Ci0gICAgT2JqZWN0IHNlbGVjdGVkID0gbnVsbDsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBzZWxlY3RlZCA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgb2JqZWN0KS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgICAgewotICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBzZWxlY3RlZDsKLSAgICAgICAgICBpZiAoeHNkRWxlbWVudERlY2xhcmF0aW9uLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXNSZWZlcmVuY2UgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIHNlbGVjdGVkKS5pc0F0dHJpYnV0ZURlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXNSZWZlcmVuY2UgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCgoWFNETW9kZWxHcm91cERlZmluaXRpb24pIHNlbGVjdGVkKS5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXNSZWZlcmVuY2UgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpIHNlbGVjdGVkKS5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzYi5hcHBlbmQoKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgc2VsZWN0ZWQpLmdldEVsZW1lbnQoKS5nZXRMb2NhbE5hbWUoKSk7Ci0KLSAgICAgICAgICBpZiAoaXNSZWZlcmVuY2UpCi0gICAgICAgICAgewotICAgICAgICAgICAgc2IuYXBwZW5kKCIgcmVmIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgLy8gVGhpcyBzdHJpbmcgaXMgbm90IGVhc2lseSB0cmFuc2xhdGFibGUgdG8gb3RoZXIgbGFuZ3VhZ2VzLgotICAgICAgICAgICAgLy8gRm9yIG5vdywgbWFrZSBpdCBlbmdsaXNoLW9ubHkgc2luY2Ugd2UgdXNlIHRoZSBlbGVtZW50IHRhZyBhcyB0aGUgdGl0bGUgYW55d2F5Ci0vLyAgICAgICAgICAgIHNiLmFwcGVuZChNZXNzYWdlcy5VSV9QQUdFX0hFQURJTkdfUkVGRVJFTkNFKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgICAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBzZWxlY3RlZCkuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgIGlmICghKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCB8fCBlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIEZpbGVTdG9yZUVkaXRvcklucHV0KSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlzUmVhZE9ubHkgPSB0cnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChlZGl0b3JQYXJ0ICE9IG51bGwgJiYgeHNkU2NoZW1hICE9IGVkaXRvclBhcnQuZ2V0QWRhcHRlcihYU0RTY2hlbWEuY2xhc3MpIHx8IGlzUmVhZE9ubHkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAoIiArIE1lc3NhZ2VzLlVJX0xBQkVMX1JFQURfT05MWSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIG51bGwsIHRoZW4gbGV0J3MgdXNlIHRoZSBtb2RlbCBvYmplY3QgdG8gZmluZAotICAgICAgICAgIC8vIGFuIGFwcHJvcHJpYXRlIG5hbWUKLSAgICAgICAgICBpZiAoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBzZWxlY3RlZCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoKFhTRE5hbWVkQ29tcG9uZW50KXNlbGVjdGVkKS5nZXROYW1lKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgc2VsZWN0ZWQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFhTRENvbnN0YW50cy5TQ0hFTUFfRUxFTUVOVF9UQUc7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIGxhc3QgcmVzb3J0Li4uLgotICAgICAgICAgIHJldHVybiAiKCIgKyBNZXNzYWdlcy5VSV9MQUJFTF9SRUFEX09OTFkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICByZXR1cm4gKChFbGVtZW50KSBvYmplY3QpLmdldExvY2FsTmFtZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQWJzdHJhY3RFeHRlbnNpb25zU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9BYnN0cmFjdEV4dGVuc2lvbnNTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhODBhMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9BYnN0cmFjdEV4dGVuc2lvbnNTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRFeHRlbnNpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5BZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5ET01FeHRlbnNpb25EZXRhaWxzQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5ET01FeHRlbnNpb25JdGVtTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5FeHRlbnNpb25EZXRhaWxzVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5FeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5TcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEV4dGVuc2lvbnNTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIHByb3RlY3RlZCBFeHRlbnNpb25EZXRhaWxzVmlld2VyIGV4dGVuc2lvbkRldGFpbHNWaWV3ZXI7Ci0gIHByb3RlY3RlZCBUcmVlVmlld2VyIGV4dGVuc2lvblRyZWVWaWV3ZXI7Ci0gIHByb3RlY3RlZCBJVHJlZUNvbnRlbnRQcm92aWRlciBleHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyOwotICBwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgZXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBMYWJlbCBjb250ZW50TGFiZWw7Ci0gIHByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGVsZW1lbnRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci0gIHByb3RlY3RlZCBJRG9jdW1lbnRDaGFuZ2VkTm90aWZpZXIgZG9jdW1lbnRDaGFuZ2VOb3RpZmllcjsKLSAgcHJvdGVjdGVkIElOb2RlQWRhcHRlciBpbnRlcm5hbE5vZGVBZGFwdGVyID0gbmV3IEludGVybmFsTm9kZUFkYXB0ZXIoKTsKLQotICBwcml2YXRlIENvbXBvc2l0ZSBwYWdlOwotICBwcm90ZWN0ZWQgQnV0dG9uIGFkZEJ1dHRvbiwgcmVtb3ZlQnV0dG9uOwotICBwcml2YXRlIE9iamVjdCBwcmV2SW5wdXQ7Ci0gIHByaXZhdGUgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgcHJldkNhdGVnb3J5OwotCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBBYnN0cmFjdEV4dGVuc2lvbnNTZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHN1cGVyLnNldElucHV0KHBhcnQsIHNlbGVjdGlvbik7Ci0gICAgZXh0ZW5zaW9uRGV0YWlsc1ZpZXdlci5zZXRDb21tYW5kU3RhY2soZ2V0Q29tbWFuZFN0YWNrKCkpOwotICB9Ci0gIAotICBjbGFzcyBJbnRlcm5hbE5vZGVBZGFwdGVyIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyCi0gIHsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgLy8gdGhpcyBtZXRob2Qgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZAotICAgICAgLy8gd2UgZG9uJ3QgdXNlIG9iamVjdHMgb2YgdGhpcyBjbGFzcyBhcyAnc3RhbmRhcmQnIGFkYXB0ZXJzCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpCi0gICAgeyAgICAgCi0gICAgICBib29sZWFuIGlzUm9vdCA9IGZhbHNlOwotICAgICAgaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGlzVHJlZVZpZXdlcklucHV0RWxlbWVudCgoRWxlbWVudClub3RpZmllcikpLy8gVE9ETwotICAgICAgICB7Ci0gICAgICAgICAgaXNSb290ID0gdHJ1ZTsKLSAgICAgICAgICBleHRlbnNpb25UcmVlVmlld2VyLnJlZnJlc2goZXh0ZW5zaW9uVHJlZVZpZXdlci5nZXRJbnB1dCgpKTsKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgICBpZiAoIWlzUm9vdCkKLSAgICAgIHsgIAotICAgICAgICBleHRlbnNpb25UcmVlVmlld2VyLnJlZnJlc2gobm90aWZpZXIpOwotICAgICAgICBpZiAoIG5ld1ZhbHVlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIuZXhwYW5kVG9MZXZlbChub3RpZmllciwgMSk7Ci0gICAgICAgICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3VmFsdWUpKTsKLSAgICAgICAgfQotICAgICAgfSAgCi0gICAgfSAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNUcmVlVmlld2VySW5wdXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBUT0RPIChjcykgYWRkIGFzc2VydGlvbgotICAgIGlmIChleHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyID09IG51bGwpCi0gICAgICAgcmV0dXJuOwotICAgIAotICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgIGRvY3VtZW50Q2hhbmdlTm90aWZpZXIgPSAoSURvY3VtZW50Q2hhbmdlZE5vdGlmaWVyKWVkaXRvci5nZXRBZGFwdGVyKElEb2N1bWVudENoYW5nZWROb3RpZmllci5jbGFzcyk7Ci0gICAgCi0gICAgaWYgKGRvY3VtZW50Q2hhbmdlTm90aWZpZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkb2N1bWVudENoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKGludGVybmFsTm9kZUFkYXB0ZXIpOwotICAgIH0gIAotICAgIAotICAgIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0KLSAgICBwYWdlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShjb21wb3NpdGUpOwotICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBwYWdlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBwYWdlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgIAotICAgIFNhc2hGb3JtIHNhc2hGb3JtID0gbmV3IFNhc2hGb3JtKHBhZ2UsIFNXVC5IT1JJWk9OVEFMKTsKLSAgICAvLyBUcnkgdG8gbGltaXQgdGhlIGluaXRpYWwgd2lkdGggb2YgdGhlIHNlY3Rpb24KLSAgICAKLSAgICBpbnQgdyA9IFNXVC5ERUZBVUxUOwotICAgIHRyeQotICAgIHsKLSAgICAgIElXb3JrYmVuY2hQYXJ0IHBhcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0KLSAgICAgIC8vIEZpbmQgdGhlIHdpZHRoIG9mIHRoZSBUYWJiZWQgUHJvcGVydHkgU2hlZXQncyBjb21wb3NpdGUgZXhjbHVkaW5nIHRoZSB0YWIKLSAgICAgIGlmIChwYXJ0IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkKLSAgICAgIHsKLSAgICAgICAgUHJvcGVydHlTaGVldCBzaGVldCA9IChQcm9wZXJ0eVNoZWV0KXBhcnQ7Ci0gICAgICAgIGlmIChzaGVldC5nZXRDdXJyZW50UGFnZSgpIGluc3RhbmNlb2YgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQYWdlID0gKFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKXNoZWV0LmdldEN1cnJlbnRQYWdlKCk7Ci0gICAgICAgICAgQ29tcG9zaXRlIHRhcmdldENvbXBvc2l0ZSA9IG51bGw7Ci0gICAgICAgICAgaWYgKHRhYmJlZFBhZ2UuZ2V0Q29udHJvbCgpIGluc3RhbmNlb2YgQ29tcG9zaXRlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENvbXBvc2l0ZSBjID0gKENvbXBvc2l0ZSl0YWJiZWRQYWdlLmdldENvbnRyb2woKTsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSBjLmdldENoaWxkcmVuKCkubGVuZ3RoOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQ29udHJvbCBjdHJsID0gYy5nZXRDaGlsZHJlbigpW2ldOwotICAgICAgICAgICAgICBpbnQgbGVuZ3RoMiAgPSAoKChDb21wb3NpdGUpY3RybCkuZ2V0Q2hpbGRyZW4oKSkubGVuZ3RoOwotICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDI7IGorKyApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKCgoQ29tcG9zaXRlKWN0cmwpLmdldENoaWxkcmVuKCkpW2pdIGluc3RhbmNlb2YgU2Nyb2xsZWRDb21wb3NpdGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgdGFyZ2V0Q29tcG9zaXRlID0gKENvbXBvc2l0ZSkoKChDb21wb3NpdGUpY3RybCkuZ2V0Q2hpbGRyZW4oKSlbal07Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHRhcmdldENvbXBvc2l0ZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHcgPSB0YXJnZXRDb21wb3NpdGUuZ2V0U2l6ZSgpLnggLSAyMDsgIC8vIGVuc3VyZSBzY3JvbGxiYXJzIGRvbid0IHNob3cKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gVGhlIGFib3ZlIGNhbiBiZSBhY2NvbXBsaXNoZWQgYnkgdGhlIGZvbGxvd2luZyBjb2RlCi0gICAgICAgICAgLy8gYnV0IGJlY2F1c2UgVGFiYmVkUHJvcGVydHlDb21wb3NpdGUgaXMgaW4gYW4gaW50ZXJuYWwgcGFja2FnZSwgSSB3aWxsIGdldCBhIGRpc2NvdXJhZ2VkCi0gICAgICAgICAgLy8gYWNjZXNzIHdhcm5pbmcuCi0gICAgICAgICAgLy8gdyA9ICgoVGFiYmVkUHJvcGVydHlDb21wb3NpdGUpKHRhYmJlZFBhZ2UuZ2V0Q29udHJvbCgpKSkuZ2V0VGFiQ29tcG9zaXRlKCkuZ2V0U2l6ZSgpLng7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdyA9IFNXVC5ERUZBVUxUOwotICAgIH0KLSAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgLy8gVGhlIGluaXRpYWwgc2l6ZSBzaG91bGQgYmUgc2V0LCBub3QgdGhlIHdpZHRoSGludCwgd2hpY2ggZm9yY2VzIHRoZSB3aWR0aAotICAgIC8vIHRvIHJlbWFpbiBjb25zdGFudC4KLSAgICBzYXNoRm9ybS5zZXRTaXplKHcsIFNXVC5ERUZBVUxUKTsKLSAgICBzYXNoRm9ybS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICBzYXNoRm9ybS5zZXRGb3JlZ3JvdW5kKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLSAgICBzYXNoRm9ybS5zZXRCYWNrZ3JvdW5kKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLSAgICBDb250cm9sW10gY2hpbGRyZW4gPSBzYXNoRm9ybS5nZXRDaGlsZHJlbigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgY2hpbGRyZW5baV0uc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgfQotICAgIENvbXBvc2l0ZSBsZWZ0Q29udGVudCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUoc2FzaEZvcm0sIFNXVC5GTEFUKTsKLSAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIGxlZnRDb250ZW50LnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIFNlY3Rpb24gc2VjdGlvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVTZWN0aW9uKGxlZnRDb250ZW50LCBTV1QuRkxBVCB8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSKTsKLSAgICBzZWN0aW9uLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX0VYVEVOU0lPTlMpOwotICAgIHNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICBDb21wb3NpdGUgdGFibGVBbmRCdXR0b25Db21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKGxlZnRDb250ZW50LCBTV1QuRkxBVCk7Ci0gICAgdGFibGVBbmRCdXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICB0YWJsZUFuZEJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7ICAgIAotICAgIAotICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcih0YWJsZUFuZEJ1dHRvbkNvbXBvc2l0ZSwgU1dULkZMQVQgfCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkxJTkVfU09MSUQpOwotICAgIE1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCk7ICAgIAotICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldE1lbnUobWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUoZXh0ZW5zaW9uVHJlZVZpZXdlci5nZXRUcmVlKCkpKTsKLSAgICBtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIobmV3IERPTUV4dGVuc2lvbkl0ZW1NZW51TGlzdGVuZXIoZXh0ZW5zaW9uVHJlZVZpZXdlcikpOwotICAgIAotICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgIAotICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXIpOwotICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihleHRlbnNpb25UcmVlTGFiZWxQcm92aWRlcik7Ci0gICAgZWxlbWVudFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG5ldyBFbGVtZW50U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCk7Ci0gICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZWxlbWVudFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0gICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5nZXRUcmVlKCkuYWRkTW91c2VUcmFja0xpc3RlbmVyKG5ldyBNb3VzZVRyYWNrQWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgbW91c2VIb3ZlcihvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQgZSkKLSAgICAgIHsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBleHRlbnNpb25UcmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBvYmogPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG9iajsKLSAgICAgICAgICAgIEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5KCk7Ci0gICAgICAgICAgICAvLyBBcHBsaWNhdGlvblNwZWNpZmljU2NoZW1hUHJvcGVydGllc1tdIHByb3BlcnRpZXMgPQotICAgICAgICAgICAgLy8gcmVnaXN0cnkuZ2V0QWxsQXBwbGljYXRpb25TcGVjaWZpY1NjaGVtYVByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIC8vIEFwcGxpY2F0aW9uU3BlY2lmaWNTY2hlbWFQcm9wZXJ0aWVzW10gcHJvcGVydGllcyA9Ci0gICAgICAgICAgICAvLyAoQXBwbGljYXRpb25TcGVjaWZpY1NjaGVtYVByb3BlcnRpZXNbXSkKLSAgICAgICAgICAgIC8vIHJlZ2lzdHJ5LmdldEFsbEFwcGxpY2F0aW9uU3BlY2lmaWNTY2hlbWFQcm9wZXJ0aWVzKCkudG9BcnJheShuZXcKLSAgICAgICAgICAgIC8vIEFwcGxpY2F0aW9uU3BlY2lmaWNTY2hlbWFQcm9wZXJ0aWVzWzBdKTsKLSAgICAgICAgICAgIExpc3QgcHJvcGVydGllcyA9IHJlZ2lzdHJ5LmdldEFsbEV4dGVuc2lvbnNTY2hlbWFzQ29udHJpYnV0aW9uKCk7Ci0KLSAgICAgICAgICAgIGludCBsZW5ndGggPSBwcm9wZXJ0aWVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIGN1cnJlbnQgPSAoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEpIHByb3BlcnRpZXMuZ2V0KGkpOwotICAgICAgICAgICAgICBpZiAoY3VycmVudC5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleHRlbnNpb25UcmVlVmlld2VyLmdldFRyZWUoKS5zZXRUb29sVGlwVGV4dChjdXJyZW50LmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICB9KTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGV4dGVuc2lvblRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkVYVEVOU0lPTlNfVEFCX19FWFRFTlNJT05TKTsgCi0gICAgCi0gICAgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUodGFibGVBbmRCdXR0b25Db21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICAvL0NvbHVtbkxheW91dCBjb2x1bW5MYXlvdXQgPSBuZXcgQ29sdW1uTGF5b3V0KCk7Ci0gICAgLy9idXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGNvbHVtbkxheW91dCk7Ci0gICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBncmlkTGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0gICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAKLSAgICBhZGRCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfV0lUSF9ET1RTLCBTV1QuRkxBVCk7ICAgCi0gICAgYWRkQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotICAgIGFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBhZGRCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRVhURU5TSU9OX0NPTVBPTkVOVCk7Ci0gICAgLy9hZGRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgQ29sdW1uTGF5b3V0RGF0YShDb2x1bW5MYXlvdXREYXRhLkZJTEwpKTsKLSAgICBhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChhZGRCdXR0b24sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuRVhURU5TSU9OU19UQUJfX0FERCk7ICAgICAKLSAgICAKLSAgICByZW1vdmVCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0FDVElPTl9ERUxFVEUsIFNXVC5GTEFUKTsKLSAgICByZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0gICAgcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIHJlbW92ZUJ1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5fVUlfQUNUSU9OX0RFTEVURV9FWFRFTlNJT05fQ09NUE9ORU5UKTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJlbW92ZUJ1dHRvbiwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5FWFRFTlNJT05TX1RBQl9fREVMRVRFKTsgICAKLSAgICAKLSAgICAvL3JlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBDb2x1bW5MYXlvdXREYXRhKENvbHVtbkxheW91dERhdGEuRklMTCkpOwotCi0gICAgLy8gVE9ETyAoY3MpIHVuY29tbWVudCB0aGUgdXAvZG93biBidXR0b24gd2hlbiB3ZSBoYXZlIHRpbWUgdG8gaW1wbGVtZW50Ci0gICAgLy8KLSAgICAvL0J1dHRvbiB1cCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfVVAsIFNXVC5GTEFUKTsKLSAgICAvL3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIAotICAgIC8vQnV0dG9uIGRvd24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX0RPV04sIFNXVC5GTEFUKTsKLSAgICAvL2Rvd24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICBDb21wb3NpdGUgcmlnaHRDb250ZW50ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShzYXNoRm9ybSwgU1dULkZMQVQpOwotICAgIFNlY3Rpb24gc2VjdGlvbjIgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlU2VjdGlvbihyaWdodENvbnRlbnQsIFNXVC5GTEFUIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIpOwotICAgIHNlY3Rpb24yLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX0VYVEVOU0lPTl9ERVRBSUxTKTsKLSAgICBzZWN0aW9uMi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICAvL2NvbnRlbnRMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVMYWJlbChyaWdodENvbnRlbnQsICJDb250ZW50Iik7Ci0KLSAgICBDb21wb3NpdGUgdGVzdENvbXAgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHJpZ2h0Q29udGVudCwgU1dULkZMQVQpOwotCi0gICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAzOwotICAgIGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAzOwotICAgIHJpZ2h0Q29udGVudC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgcmlnaHRDb250ZW50LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMzsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMzsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIHRlc3RDb21wLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICB0ZXN0Q29tcC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgIGNyZWF0ZUVsZW1lbnRDb250ZW50V2lkZ2V0KHRlc3RDb21wKTsKLQotICAgIGludFtdIHdlaWdodHMgPSB7IDQwLCA2MCB9OwotICAgIHNhc2hGb3JtLnNldFdlaWdodHMod2VpZ2h0cyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFbGVtZW50Q29udGVudFdpZGdldChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgZXh0ZW5zaW9uRGV0YWlsc1ZpZXdlciA9IG5ldyBFeHRlbnNpb25EZXRhaWxzVmlld2VyKHBhcmVudCwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLSAgICBleHRlbnNpb25EZXRhaWxzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgRE9NRXh0ZW5zaW9uRGV0YWlsc0NvbnRlbnRQcm92aWRlcigpKTsgICAgCi0gICAgZXh0ZW5zaW9uRGV0YWlsc1ZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChleHRlbnNpb25EZXRhaWxzVmlld2VyLmdldENvbnRyb2woKSwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5FWFRFTlNJT05TX1RBQl9fRVhURU5TSU9OU19ERVRBSUxTKTsgICAKLSAgfQotICAKLQotICAvKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKCBwcmV2SW5wdXQgPT0gaW5wdXQpCi0gICAgCSAgcmV0dXJuOwotICAgICAgZWxzZQotICAgIAkgIHByZXZJbnB1dCA9IGlucHV0OwotICAgICAgCi0gICAgICBUcmVlIHRyZWUgPSBleHRlbnNpb25UcmVlVmlld2VyLmdldFRyZWUoKTsKLSAgICAgIGV4dGVuc2lvbkRldGFpbHNWaWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0gICAgICB0cmVlLnJlbW92ZUFsbCgpOwotICAgICAgCi0gICAgICBhZGRCdXR0b24uc2V0RW5hYmxlZCghaXNSZWFkT25seSk7Ci0gICAgICAKLSAgICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotICAgICAgaWYgKHRyZWUuZ2V0U2VsZWN0aW9uQ291bnQoKSA9PSAwICYmIHRyZWUuZ2V0SXRlbUNvdW50KCkgPiAwKQotICAgICAgeyAgICAgICAKLSAgICAgICAgVHJlZUl0ZW0gdHJlZUl0ZW0gPSB0cmVlLmdldEl0ZW0oMCk7ICAgICAKLSAgICAgICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odHJlZUl0ZW0uZ2V0RGF0YSgpKSk7Ci0gICAgICB9Ci0gICAgICByZW1vdmVCdXR0b24uc2V0RW5hYmxlZCh0cmVlLmdldFNlbGVjdGlvbkNvdW50KCkgPiAwICAmJiAhaXNSZWFkT25seSk7Ci0gICAgICAvLyBCdWd6aWxsYSAxOTczMTUuICBNYWtlIHRoaXMgYnVsbGV0cHJvb2YgZm9yIG1haW50ZW5hbmNlIHJlbGVhc2UuCi0gICAgICBDb250cm9sIGRldGFpbHNWaWV3ZXJDb250cm9sID0gZXh0ZW5zaW9uRGV0YWlsc1ZpZXdlci5nZXRDb250cm9sKCk7Ci0gICAgICBpZiAoZGV0YWlsc1ZpZXdlckNvbnRyb2wgIT0gbnVsbCAmJiAhZGV0YWlsc1ZpZXdlckNvbnRyb2wuaXNEaXNwb3NlZCgpKQotICAgICAgewotICAgICAgICBkZXRhaWxzVmlld2VyQ29udHJvbC5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICB9Ci0KLSAgcHVibGljIENvbXBvc2l0ZSBnZXRQYWdlKCkKLSAgewotICAgIHJldHVybiBwYWdlOwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IEFkZEV4dGVuc2lvbkNvbW1hbmQgZ2V0QWRkRXh0ZW5zaW9uQ29tbWFuZChPYmplY3Qgbyk7Ci0gIHByb3RlY3RlZCBhYnN0cmFjdCBDb21tYW5kIGdldFJlbW92ZUV4dGVuc2lvbkNvbW1hbmQoT2JqZWN0IG8pOyAgCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5IGdldEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkoKTsKLSAgCi0gIHByb3RlY3RlZCBBZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nIGNyZWF0ZUFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2coKQotICB7Ci0gICAgcmV0dXJuIG5ldyBBZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nKGNvbXBvc2l0ZS5nZXRTaGVsbCgpLCBnZXRFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5KCkpOwotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBhZGRCdXR0b24pCi0gICAgewotICAgICAgRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSByZWdpc3RyeSA9IGdldEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkoKTsKLSAgICAgIEFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2cgZGlhbG9nID0gY3JlYXRlQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZygpOwotCi0gICAgICBMaXN0IHByb3BlcnRpZXMgPSByZWdpc3RyeS5nZXRBbGxFeHRlbnNpb25zU2NoZW1hc0NvbnRyaWJ1dGlvbigpOwotCi0gICAgICBkaWFsb2cuc2V0SW5wdXQocHJvcGVydGllcyk7Ci0gICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICBkaWFsb2cuc2V0UHJlZlN0b3JlKCBnZXRQcmVmU3RvcmUoKSApOwotICAgICAgCi0gICAgICBpZiAocHJldkNhdGVnb3J5ICE9IG51bGwpCi0gICAgCSAgZGlhbG9nLnNldEluaXRpYWxDYXRlZ29yeVNlbGVjdGlvbihwcmV2Q2F0ZWdvcnkpOwotCi0gICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBuZXdTZWxlY3Rpb24gPSBudWxsOyAgICAgICAgICAKLSAgICAgICAgT2JqZWN0W10gcmVzdWx0ID0gZGlhbG9nLmdldFJlc3VsdCgpOyAgICAgIAotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBleHRlbnNpb25zU2NoZW1hU3BlYyA9IChTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSkgcmVzdWx0WzFdOwotICAgICAgICAgIEFkZEV4dGVuc2lvbkNvbW1hbmQgYWRkRXh0ZW5zaW9uQ29tbWFuZCA9IGdldEFkZEV4dGVuc2lvbkNvbW1hbmQocmVzdWx0WzBdKTsKLSAgICAgICAgICBpZiAoYWRkRXh0ZW5zaW9uQ29tbWFuZCAhPSBudWxsKQotICAgICAgICAgIHsgIAotICAgICAgICAgICAgYWRkRXh0ZW5zaW9uQ29tbWFuZC5zZXRTY2hlbWFQcm9wZXJ0aWVzKGV4dGVuc2lvbnNTY2hlbWFTcGVjKTsKLSAgICAgICAgICAgIGlmIChnZXRDb21tYW5kU3RhY2soKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGFkZEV4dGVuc2lvbkNvbW1hbmQpOwotICAgICAgICAgICAgICBuZXdTZWxlY3Rpb24gPSBhZGRFeHRlbnNpb25Db21tYW5kLmdldE5ld09iamVjdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL3JlZnJlc2goKTsKLSAgICAgICAgaWYgKG5ld1NlbGVjdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZXh0ZW5zaW9uVHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3U2VsZWN0aW9uKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcHJldkNhdGVnb3J5ID0gZGlhbG9nLmdldFNlbGVjdGVkQ2F0ZWdvcnkoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHJlbW92ZUJ1dHRvbikKLSAgICB7Ci0gICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV4dGVuc2lvblRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAKLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gZ2V0UmVtb3ZlRXh0ZW5zaW9uQ29tbWFuZChvKTsgICAgICAgICAgICAKLSAgICAgICAgaWYgKGdldENvbW1hbmRTdGFjaygpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBleHRlbnNpb25UcmVlVmlld2VyLmdldFRyZWUoKSkKLSAgICB7Ci0KLSAgICB9Ci0gIH0KLQotICAvLyBUT0RPIG1ha2UgdGhpcyBvbmUgYW4gYWJzdHJhY3QgbWV0aG9kLiBYU0RFZGl0b3IgYW5kIFdTRExFZGl0b3Igc2hvdWxkIHJldHVybgotICAvLyBkaWZlcmVudCBJcHJlZmVyZW5jZVN0b3JlIG9iamVjdHMKLSAgcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZlN0b3JlKCkgewotCXJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICB7Ci0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGlmIChkb2N1bWVudENoYW5nZU5vdGlmaWVyICE9IG51bGwpCi0gICAgICBkb2N1bWVudENoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKGludGVybmFsTm9kZUFkYXB0ZXIpOwotICB9Ci0gCi0KLSAgTm9kZSBzZWxlY3RlZE5vZGU7Ci0KLSAgY2xhc3MgRWxlbWVudFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICAgIHsgICAKLSAgICAgIGJvb2xlYW4gaXNEZWxldGVFbmFibGVkID0gZmFsc2U7Ci0gICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICB7Ci0gICAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgICAgaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpID4gMCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgT2JqZWN0IG9iaiA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgc2VsZWN0ZWROb2RlID0gKE5vZGUpIG9iajsKLSAgICAgICAgICAgIGV4dGVuc2lvbkRldGFpbHNWaWV3ZXIuc2V0SW5wdXQob2JqKTsKLSAgICAgICAgICAgIGlzRGVsZXRlRW5hYmxlZCA9IHRydWU7ICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICB9ICAKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gaWYgbm90aGluZyBpcyBzZWxlY3RlZCB0aGVuIGRvbid0IHNob3cgYW55IGRldGFpbHMKLSAgICAgICAgICAvLwotICAgICAgICAgIGV4dGVuc2lvbkRldGFpbHNWaWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVcG9uIGVsZW1lbnQgc2VsZWN0aW9uLCB0aGUgZGV0YWlscyB2aWV3IHBvcHVsYXRlcyBmaW5lLCBidXQgdGhlcmUgaXMgbm8gdmVydGljYWwgc2Nyb2xsYmFyLAotICAgICAgICAvLyBzbyBpdCBtaXNsZWFkcyB0aGUgdXNlciBpbnRvIHRoaW5raW5nIHRoZXJlIGFyZSBubyBvdGhlciBhdHRyaWJ1dGVzIGF2YWlsYWJsZQotICAgICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NDA3MwotICAgICAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCB0byBmb3JjZSBhIGxheW91dCBvZiB0aGUgdGFiIGNvbXBvc2l0ZQotICAgICAgICBJV29ya2JlbmNoUGFydCBwYXJ0ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlUGFydCgpOwotICAgICAgICBpZiAocGFydCBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXQpCi0gICAgICAgIHsKLSAgICAgICAgICBQcm9wZXJ0eVNoZWV0IHNoZWV0ID0gKFByb3BlcnR5U2hlZXQpcGFydDsKLSAgICAgICAgICBpZiAoc2hlZXQuZ2V0Q3VycmVudFBhZ2UoKSBpbnN0YW5jZW9mIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFBhZ2UgPSAoVGFiYmVkUHJvcGVydHlTaGVldFBhZ2Upc2hlZXQuZ2V0Q3VycmVudFBhZ2UoKTsKLSAgICAgICAgICAgIGlmICh0YWJiZWRQYWdlLmdldENvbnRyb2woKSBpbnN0YW5jZW9mIENvbXBvc2l0ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQ29tcG9zaXRlIGMgPSAoQ29tcG9zaXRlKXRhYmJlZFBhZ2UuZ2V0Q29udHJvbCgpOwotICAgICAgICAgICAgICBQb2ludCBwID0gYy5nZXRTaXplKCk7Ci0gICAgICAgICAgICAgIC8vIGMubGF5b3V0KHRydWUsIHRydWUpIGRvZXNuJ3QgYXBwZWFyIHRvIHdvcmsuCi0gICAgICAgICAgICAgIC8vIEJ1dCB0aGlzIGZvcmNlcyBhIHJlbGF5b3V0OgotICAgICAgICAgICAgICBjLnNldFNpemUocC54LCBwLnkgKyAxKTsKLSAgICAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBzaXplIGJhY2sgdG8gdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgIGMuc2V0U2l6ZShwLngsIHAueSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZW1vdmVCdXR0b24uc2V0RW5hYmxlZChpc0RlbGV0ZUVuYWJsZWQgJiYgIWlzUmVhZE9ubHkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBJVHJlZUNvbnRlbnRQcm92aWRlciBnZXRFeHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyKCkKLSAgewotICAgIHJldHVybiBleHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlcihJVHJlZUNvbnRlbnRQcm92aWRlciBleHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyKQotICB7Ci0gICAgdGhpcy5leHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyID0gZXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlcjsKLSAgfQotCi0gIHB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRFeHRlbnNpb25UcmVlTGFiZWxQcm92aWRlcigpCi0gIHsKLSAgICByZXR1cm4gZXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25UcmVlTGFiZWxQcm92aWRlcihJTGFiZWxQcm92aWRlciBleHRlbnNpb25UcmVlTGFiZWxQcm92aWRlcikKLSAgewotICAgIHRoaXMuZXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXIgPSBleHRlbnNpb25UcmVlTGFiZWxQcm92aWRlcjsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQWJzdHJhY3RTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0Fic3RyYWN0U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjhmOWMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQWJzdHJhY3RTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlN1YkNvbnRyaWJ1dGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlN1YlN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5Gb3JtQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5GaWxlU3RvcmVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5BYnN0cmFjdFByb3BlcnR5U2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlTZWN0aW9uIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIsIExpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBDb21wb3NpdGUgY29tcG9zaXRlOwotICBwcm90ZWN0ZWQgUGFpbnRMaXN0ZW5lciBwYWludGVyOwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgcHJvdGVjdGVkIE9iamVjdCBpbnB1dDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWFkT25seTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gbGlzdGVuZXJFbmFibGVkID0gdHJ1ZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTaW1wbGU7Ci0gIHByb3RlY3RlZCBDdXN0b21MaXN0ZW5lciBjdXN0b21MaXN0ZW5lciA9IG5ldyBDdXN0b21MaXN0ZW5lcigpOwotICBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgb3duaW5nRWRpdG9yOwotICBwcml2YXRlIElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJQ09OX0VSUk9SID0gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0VSUk9SX1RTSyk7Ci0gIAotICBwdWJsaWMgQWJzdHJhY3RTZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIGFUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLSAgewotICAgIHN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgYVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLSAgICBpc1NpbXBsZSA9IGdldElzU2ltcGxlKCk7Ci0gICAgY3JlYXRlQ29udGVudHMocGFyZW50KTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCk7Ci0KLSAgICBwcm90ZWN0ZWQgUGFpbnRMaXN0ZW5lciBjcmVhdGVQYWludGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLS8vICAgICAgICAgICAgICAgIFJlY3RhbmdsZSBib3VuZHMgPSBjb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICAgICAgICAgIEdDIGdjID0gZS5nYzsKLQotICAgICAgICAgICAgICAgIGdjLnNldEZvcmVncm91bmQoZ2MuZ2V0QmFja2dyb3VuZCgpKTsKLSAgICAgICAgICAgICAgICBnYy5zZXRCYWNrZ3JvdW5kKGdldFdpZGdldEZhY3RvcnkoKS5nZXRDb2xvcnMoKS5nZXRDb2xvcigKLSAgICAgICAgICAgICAgICAgICAgRm9ybUNvbG9ycy5UQl9CRykpOwotCi0vLyAgICAgICAgICAgICAgICBnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoNCArIGJvdW5kcy53aWR0aCAvIDIsIDAsCi0vLyAgICAgICAgICAgICAgICAgICAgYm91bmRzLndpZHRoIC8gMiAtIDksIGJvdW5kcy5oZWlnaHQsIGZhbHNlKTsKLQotICAgICAgICAgICAgICAgIGdjLnNldEZvcmVncm91bmQoZ2V0V2lkZ2V0RmFjdG9yeSgpLmdldENvbG9ycygpLmdldENvbG9yKAotICAgICAgICAgICAgICAgICAgICBGb3JtQ29sb3JzLlRCX0JPUkRFUikpOwotLy8gICAgICAgICAgICAgICAgZ2MuZHJhd0xpbmUoYm91bmRzLndpZHRoIC0gNSwgMCwgYm91bmRzLndpZHRoIC0gNSwKLS8vICAgICAgICAgICAgICAgICAgICBib3VuZHMuaGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9OwotCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICAgICAgaWYgKGNvbXBvc2l0ZSAhPSBudWxsICYmICEgY29tcG9zaXRlLmlzRGlzcG9zZWQoKSAmJiBwYWludGVyICE9IG51bGwpCi0gICAgICAgICAgICBjb21wb3NpdGUucmVtb3ZlUGFpbnRMaXN0ZW5lcihwYWludGVyKTsKLSAgICAgICAgCi0gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgICB7Ci0gICAgICAgIHN1cGVyLnNldElucHV0KHBhcnQsIHNlbGVjdGlvbik7Ci0gICAgICAgIGlzU2ltcGxlID0gZ2V0SXNTaW1wbGUoKTsKLSAgICAgICAgT2JqZWN0IGlucHV0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7Ci0gICAgICAgIAotICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgIHhzZFNjaGVtYSA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpaW5wdXQpLmdldFNjaGVtYSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBzZXQgb3duaW5nIGVkaXRvciBvZiB0aGlzIHNlY3Rpb24KLSAgICAgICAgaWYgKHBhcnQhPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwYXJ0IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3duaW5nRWRpdG9yID0gKElFZGl0b3JQYXJ0KXBhcnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3duaW5nRWRpdG9yID0gcGFydC5nZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh4c2RTY2hlbWEgPT0gb3duaW5nRWRpdG9yLmdldEFkYXB0ZXIoWFNEU2NoZW1hLmNsYXNzKSkKLSAgICAgICAgewotICAgICAgICAgIGlzUmVhZE9ubHkgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpc1JlYWRPbmx5ID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG93bmluZ0VkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICBpZiAoIShlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQgfHwgZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBGaWxlU3RvcmVFZGl0b3JJbnB1dCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpc1JlYWRPbmx5ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICAgIHsKLSAgICAgIHN1cGVyLnJlZnJlc2goKTsKLSAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBseUFsbExpc3RlbmVycyhDb250cm9sIGNvbnRyb2wpCi0gICAgewotICAgICAgY29udHJvbC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBjdXN0b21MaXN0ZW5lcik7Ci0gICAgICBjb250cm9sLmFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgY3VzdG9tTGlzdGVuZXIpOwotICAgICAgY29udHJvbC5hZGRMaXN0ZW5lcihTV1QuS2V5RG93biwgY3VzdG9tTGlzdGVuZXIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhcHBseU1vZGlmeUxpc3RlbmVycyhDb250cm9sIGNvbnRyb2wpCi0gICAgewotICAgICAgY29udHJvbC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBjdXN0b21MaXN0ZW5lcik7Ci0gICAgICBjb250cm9sLmFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgY3VzdG9tTGlzdGVuZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGx5S2V5TGlzdGVuZXIoQ29udHJvbCBjb250cm9sKQotICAgIHsKLSAgICAgIGNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULktleURvd24sIGN1c3RvbUxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcnMoQ29udHJvbCBjb250cm9sKQotICAgIHsKLSAgICAgIGNvbnRyb2wucmVtb3ZlTGlzdGVuZXIoU1dULk1vZGlmeSwgY3VzdG9tTGlzdGVuZXIpOwotICAgICAgY29udHJvbC5yZW1vdmVMaXN0ZW5lcihTV1QuRm9jdXNPdXQsIGN1c3RvbUxpc3RlbmVyKTsKLSAgICAgIGNvbnRyb2wucmVtb3ZlTGlzdGVuZXIoU1dULktleURvd24sIGN1c3RvbUxpc3RlbmVyKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZG9XaWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7fQotICAgIAotICAgIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7fQotCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSAmJgotICAgICAgICAgIGlucHV0ICE9IG51bGwgJiYKLSAgICAgICAgICAhaXNSZWFkT25seSkgCi0gICAgICB7Ci0gICAgICAgIGRvV2lkZ2V0U2VsZWN0ZWQoZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkgJiYKLSAgICAgICAgICBpbnB1dCAhPSBudWxsICYmCi0gICAgICAgICAgIWlzUmVhZE9ubHkpIAotICAgICAgewotICAgICAgICBkb1dpZGdldERlZmF1bHRTZWxlY3RlZChlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGxpc3RlbmVyRW5hYmxlZC4KLSAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIGxpc3RlbmVyRW5hYmxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xpc3RlbmVyRW5hYmxlZCgpIAotICAgIHsKLSAgICAgIHJldHVybiBsaXN0ZW5lckVuYWJsZWQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotICAgICAqIEBwYXJhbSB2ICBWYWx1ZSB0byBhc3NpZ24gdG8gbGlzdGVuZXJFbmFibGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExpc3RlbmVyRW5hYmxlZChib29sZWFuICB2KSAKLSAgICB7Ci0gICAgICB0aGlzLmxpc3RlbmVyRW5hYmxlZCA9IHY7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VudCB3aGVuIGFuIGV2ZW50IHRoYXQgdGhlIHJlY2VpdmVyIGhhcyByZWdpc3RlcmVkIGZvciBvY2N1cnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50IHdoaWNoIG9jY3VycmVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkgJiYgIWlzUmVhZE9ubHkpIAotICAgICAgewotICAgICAgICBkb0hhbmRsZUV2ZW50KGV2ZW50KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZQotICAgICAqIEBwYXJhbSBldmVudAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gICAgewotICAgIH0KLQotICAgIHByb3RlY3RlZCBJRWRpdG9yUGFydCBnZXRBY3RpdmVFZGl0b3IoKQotICAgIHsKLSAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLSAgICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICB0aGlzLm93bmluZ0VkaXRvciA9IGVkaXRvclBhcnQ7Ci0gICAgICByZXR1cm4gZWRpdG9yUGFydDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIENvbW1hbmRTdGFjayBnZXRDb21tYW5kU3RhY2soKQotICAgIHsKLSAgICAgIE9iamVjdCBjb21tYW5kU3RhY2sgPSBvd25pbmdFZGl0b3IuZ2V0QWRhcHRlcihDb21tYW5kU3RhY2suY2xhc3MpOyAKLSAgICAgICAgICAKLSAgICAgIGlmIChjb21tYW5kU3RhY2s9PW51bGwpCi0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICBlbHNlCi0gICAgICAgICAgcmV0dXJuIChDb21tYW5kU3RhY2spY29tbWFuZFN0YWNrOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRJc1NpbXBsZSgpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbnRlbmRlZCB0byBkaXNwbGF5IGVycm9yIG1lc3NhZ2VzLgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIElTdGF0dXNMaW5lTWFuYWdlciBnZXRTdGF0dXNMaW5lTWFuYWdlcigpCi0gICAgewotICAgICAgaWYgKHN0YXR1c0xpbmU9PW51bGwgJiYgZ2V0UGFydCgpIT1udWxsKQotICAgICAgewotICAgICAgICBpZihnZXRQYXJ0KCkuZ2V0U2l0ZSgpIGluc3RhbmNlb2YgSUVkaXRvclNpdGUpCi0gICAgICAgICAgc3RhdHVzTGluZSA9ICgoSUVkaXRvclNpdGUpZ2V0UGFydCgpLmdldFNpdGUoKSkuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0gICAgICAgIGVsc2UgaWYgKGdldFBhcnQoKS5nZXRTaXRlKCkgaW5zdGFuY2VvZiBJVmlld1NpdGUpCi0gICAgICAgICAgc3RhdHVzTGluZSA9ICgoSVZpZXdTaXRlKWdldFBhcnQoKS5nZXRTaXRlKCkpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotICAgICAgICAKLSAgICAgICAgLyogCi0gICAgICAgICAqIFdlIG11c3QgbWFudWFsbHkgc2V0IHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBzdGF0dXMgbGluZSBzaW5jZSB0aGUgYWN0aW9uIGJhcnMgYXJlIGZyb20gdGhlIGVkaXRvcgotICAgICAgICAgKiB3aGljaCBtZWFucyB0aGUgc3RhdHVzIGxpbmUgb25seSBzaG93cyB1cCB3aGVuIHRoZSBlZGl0b3IgaXMgaW4gZm9jdXMgKGJ5IGRlZmF1bHQpLgotICAgICAgICAgKiBOb3RlIG9ubHkgYSBTdWJTdGF0dXNMaW5lTWFuYWdlciBjYW4gc2V0IHRoZSB2aXNpYmlsaXR5LgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHN0YXR1c0xpbmUgaW5zdGFuY2VvZiBTdWJTdGF0dXNMaW5lTWFuYWdlcikKLSAgICAgICAgICAoKFN1YlN0YXR1c0xpbmVNYW5hZ2VyKXN0YXR1c0xpbmUpLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHJldHVybiBzdGF0dXNMaW5lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGUgc3RhdHVzIGxpbmUuCi0gICAgICogQ2FsbCBzZXRFcnJvck1lc3NhZ2UobnVsbCkgdG8gY2xlYXIgdGhlIHN0YXR1cyBsaW5lLgotICAgICAqIEBwYXJhbSB0ZXh0IAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgdGV4dCkKLSAgICB7Ci0gICAgICBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZSA9IGdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0KLSAgICAgIGlmIChzdGF0dXNMaW5lIT1udWxsKQotICAgICAgewotICAgICAgICBpZiAodGV4dD09bnVsbCB8fCB0ZXh0Lmxlbmd0aCgpPDEpCi0gICAgICAgICAgc3RhdHVzTGluZS5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBzdGF0dXNMaW5lLnNldEVycm9yTWVzc2FnZShJQ09OX0VSUk9SLCB0ZXh0KTsKLQotICAgICAgICAvLyBlbnN1cmUgb3VyIG1lc3NhZ2UgZ2V0cyBkaXNwbGF5ZWQKLSAgICAgICAgaWYgKHN0YXR1c0xpbmUgaW5zdGFuY2VvZiBTdWJDb250cmlidXRpb25NYW5hZ2VyKQotICAgICAgICAgICgoU3ViQ29udHJpYnV0aW9uTWFuYWdlcilzdGF0dXNMaW5lKS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAKLSAgICAgICAgc3RhdHVzTGluZS51cGRhdGUodHJ1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgCi0gICAgcHJvdGVjdGVkIEVPYmplY3QgZ2V0TW9kZWwoKQotICAgIHsKLSAgICAgIHJldHVybiAoWFNEQ29tcG9uZW50KWlucHV0OwotICAgIH0KLQotICAgIAotICAgIGNsYXNzIEN1c3RvbUxpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIKLSAgICB7Ci0gICAgICBib29sZWFuIGhhbmRsaW5nRXZlbnQgPSBmYWxzZTsKLSAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSAmJiAhaXNSZWFkT25seSkgCi0gICAgICAgIHsKLSAgICAgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBTV1QuS2V5RG93biA6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChldmVudC5jaGFyYWN0ZXIgPT0gU1dULkNSKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFoYW5kbGluZ0V2ZW50KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGhhbmRsaW5nRXZlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgZG9IYW5kbGVFdmVudChldmVudCk7Ci0gICAgICAgICAgICAgICAgICBoYW5kbGluZ0V2ZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBTV1QuRm9jdXNPdXQgOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoIWhhbmRsaW5nRXZlbnQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBoYW5kbGluZ0V2ZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBkb0hhbmRsZUV2ZW50KGV2ZW50KTsKLSAgICAgICAgICAgICAgICBoYW5kbGluZ0V2ZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0Fic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGIzM2JiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklTZWN0aW9uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEFic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IgaW1wbGVtZW50cyBJU2VjdGlvbkRlc2NyaXB0b3IKLXsKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIEFic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElkKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRGaWx0ZXIoKQotICAgKi8KLSAgcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SW5wdXRUeXBlcygpCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRJbnB1dFR5cGVzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChYU0RDb25jcmV0ZUNvbXBvbmVudC5jbGFzcyk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRTZWN0aW9uQ2xhc3MoKQotICAgKi8KLSAgcHVibGljIElTZWN0aW9uIGdldFNlY3Rpb25DbGFzcygpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFRhcmdldFRhYigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFRhYigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2FwcGxpZXNUbyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXBwbGllc1RvKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgb2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCB8fCBvYmplY3QgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0QWZ0ZXJTZWN0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWZ0ZXJTZWN0aW9uKCkKLSAgewotICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgCi0gIHB1YmxpYyBpbnQgZ2V0RW5hYmxlc0ZvcigpCi0gIHsKLQlyZXR1cm4gRU5BQkxFU19GT1JfQU5ZOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0Fubm90YXRpb25TZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0Fubm90YXRpb25TZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMTUzMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9Bbm5vdGF0aW9uU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkRG9jdW1lbnRhdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLlhTRENvbW1vblVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbgotewotICBUZXh0IHNpbXBsZVRleHQ7Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgc2ltcGxlVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7IC8vJE5PTi1OTFMtMSQKLSAgICBzaW1wbGVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2ltcGxlVGV4dCwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5ET0NVTUVOVEFUSU9OX1RBQl9fTk9fTEFCRUwpOyAKLSAgICAKLQotICAgIEZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMSk7Ci0gICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xKTsKLSAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxKTsKLSAgICBkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0xKTsKLSAgICBzaW1wbGVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gIH0KLQotICBwdWJsaWMgQW5ub3RhdGlvblNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotICAgIAotICAgIGlmIChzaW1wbGVUZXh0LmlzRm9jdXNDb250cm9sKCkpIHJldHVybjsKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIFhTREFubm90YXRpb24geHNkQW5ub3RhdGlvbiA9IFhTRENvbW1vblVJVXRpbHMuZ2V0SW5wdXRYU0RBbm5vdGF0aW9uKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgaW5wdXQsIGZhbHNlKTsKLSAgICAgIHNldEluaXRpYWxUZXh0KHhzZEFubm90YXRpb24pOwotICAgIH0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgewotICAgICAgaWYgKGV2ZW50LndpZGdldCA9PSBzaW1wbGVUZXh0KQotICAgICAgewotICAgICAgICBBZGREb2N1bWVudGF0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZERvY3VtZW50YXRpb25Db21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0RPQ1VNRU5UQVRJT04sIG51bGwsIChYU0RDb25jcmV0ZUNvbXBvbmVudCkgaW5wdXQsIHNpbXBsZVRleHQuZ2V0VGV4dCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotCi0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0SW5pdGlhbFRleHQoWFNEQW5ub3RhdGlvbiBhbikKLSAgewotICAgIGlmIChhbiAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBMaXN0IGRvY3VtZW50YXRpb25MaXN0ID0gYW4uZ2V0VXNlckluZm9ybWF0aW9uKCk7Ci0gICAgICAgIGlmIChkb2N1bWVudGF0aW9uTGlzdC5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCBkb2NFbGVtZW50ID0gKEVsZW1lbnQpIGRvY3VtZW50YXRpb25MaXN0LmdldCgwKTsKLSAgICAgICAgICBpZiAoZG9jRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNpbXBsZVRleHQuc2V0VGV4dChkb1NlcmlhbGl6ZShkb2NFbGVtZW50KSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNpbXBsZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBkb1NlcmlhbGl6ZShFbGVtZW50IGVsZW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHNvdXJjZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBOb2RlIGZpcnN0Q2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICBOb2RlIGxhc3RDaGlsZCA9IGVsZW1lbnQuZ2V0TGFzdENoaWxkKCk7Ci0gICAgaW50IHN0YXJ0ID0gMDsKLSAgICBpbnQgZW5kID0gMDsKLQotICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSURPTUVsZW1lbnQpCi0gICAgewotICAgICAgSURPTUVsZW1lbnQgZG9tRWxlbWVudCA9IChJRE9NRWxlbWVudCkgZWxlbWVudDsKLSAgICAgIElET01Nb2RlbCBtb2RlbCA9IGRvbUVsZW1lbnQuZ2V0TW9kZWwoKTsKLSAgICAgIElET01Eb2N1bWVudCBkb2MgPSBtb2RlbC5nZXREb2N1bWVudCgpOwotCi0gICAgICBpZiAoZmlyc3RDaGlsZCBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgICAgewotICAgICAgICBJRE9NTm9kZSBmaXJzdCA9IChJRE9NTm9kZSkgZmlyc3RDaGlsZDsKLSAgICAgICAgc3RhcnQgPSBmaXJzdC5nZXRTdGFydE9mZnNldCgpOwotICAgICAgfQotICAgICAgaWYgKGxhc3RDaGlsZCBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgICAgewotICAgICAgICBJRE9NTm9kZSBsYXN0ID0gKElET01Ob2RlKSBsYXN0Q2hpbGQ7Ci0gICAgICAgIGVuZCA9IGxhc3QuZ2V0RW5kT2Zmc2V0KCk7Ci0gICAgICB9Ci0gICAgICBzb3VyY2UgPSBkb2MuZ2V0U291cmNlKCkuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotICAgIH0KLQotICAgIHJldHVybiBzb3VyY2U7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9Db21tb25EaXJlY3RpdmVzU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9Db21tb25EaXJlY3RpdmVzU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzAxZWJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvQ29tbW9uRGlyZWN0aXZlc1NlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbmNsdWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RSZWRlZmluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFBhcnNlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbW1vbkRpcmVjdGl2ZXNTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIFRleHQgc2NoZW1hTG9jYXRpb25UZXh0OwotICBCdXR0b24gd2l6YXJkQnV0dG9uOwotICBTdHlsZWRUZXh0IGVycm9yVGV4dDsKLSAgQ29sb3IgcmVkOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkU2NoZW1hTG9jYXRpb24gPSB0cnVlOwotCi0gIC8vIFRPRE86IGNvbW1vbiB1cCBjb2RlIHdpdGggWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQKLSAgcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIGVycm9yVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBzY2hlbWFMb2NhdGlvblRleHQpCi0gICAgewotICAgICAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaXNWYWxpZFNjaGVtYUxvY2F0aW9uID0gdHJ1ZTsKLSAgICAgICAgU3RyaW5nIHhzZE1vZGVsRmlsZSA9IHNjaGVtYUxvY2F0aW9uVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBYU0RTY2hlbWEgZXh0ZXJuYWxTY2hlbWEgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYgKHhzZE1vZGVsRmlsZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgaGFuZGxlU2NoZW1hTG9jYXRpb25DaGFuZ2UoeHNkTW9kZWxGaWxlLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIElGaWxlIGN1cnJlbnRJRmlsZSA9IG51bGw7Ci0gICAgICAgICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgICBpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGN1cnJlbnRJRmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCllZGl0b3JJbnB1dCkuZ2V0RmlsZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICBVUkkgbmV3VVJJID0gVVJJLmNyZWF0ZVVSSSh4c2RNb2RlbEZpbGUpOwotICAgICAgICAgIFN0cmluZyB4c2RGaWxlID0gVVJJSGVscGVyLmdldFJlbGF0aXZlVVJJKG5ld1VSSS50b1N0cmluZygpLCBjdXJyZW50SUZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLSAgICAgICAgICBmaW5hbCBTdHJpbmcgbm9ybWFsaXplZFhTREZpbGUgPSBVUklIZWxwZXIubm9ybWFsaXplKHhzZEZpbGUsIGN1cnJlbnRJRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCksICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGZpbmFsIFN0cmluZyBub3JtYWxpemVkVVJJID0gVVJJLmVuY29kZUZyYWdtZW50KFVSSUhlbHBlci5hZGRJbXBsaWVkRmlsZVByb3RvY29sKG5vcm1hbGl6ZWRYU0RGaWxlKSwgdHJ1ZSkudG9TdHJpbmcoKTsKLSAgICAgICAgICBYU0RQYXJzZXIgcGFyc2VyID0gbmV3IFhTRFBhcnNlcihuZXcgSGFzaE1hcCgpKTsKLSAgICAgICAgICBwYXJzZXIucGFyc2Uobm9ybWFsaXplZFVSSSk7Ci0gICAgICAgICAgZXh0ZXJuYWxTY2hlbWEgPSBwYXJzZXIuZ2V0U2NoZW1hKCk7Ci0KLSAgICAgICAgICBpZiAoZXh0ZXJuYWxTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgZXh0TmFtZXNwYWNlID0gZXh0ZXJuYWxTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICBpZiAoZXh0TmFtZXNwYWNlID09IG51bGwpIGV4dE5hbWVzcGFjZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBuYW1lc3BhY2UgPSBleHROYW1lc3BhY2U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChleHRlcm5hbFNjaGVtYS5nZXREaWFnbm9zdGljcygpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBleHRlcm5hbFNjaGVtYS5nZXREaWFnbm9zdGljcygpLnNpemUoKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlzVmFsaWRTY2hlbWFMb2NhdGlvbiA9IGZhbHNlOwotICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9JTkNPUlJFQ1RfWE1MX1NDSEVNQSIsIHhzZE1vZGVsRmlsZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudE5hbWVTcGFjZSA9IHhzZFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNESW5jbHVkZSB8fCBpbnB1dCBpbnN0YW5jZW9mIFhTRFJlZGVmaW5lKQotICAgICAgICAgICAgICB7ICAKLSAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgbmFtZXNwYWNlIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSB0aGUgc2FtZSBhcyBjdXJyZW50IGZpbGUKLSAgICAgICAgICAgICAgICBpZiAoZXh0TmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROYW1lU3BhY2UgIT0gbnVsbCAmJiAhZXh0TmFtZXNwYWNlLmVxdWFscyhjdXJyZW50TmFtZVNwYWNlKSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfRElGRkVSRU5UX05BTUVfU1BBQ0UiLCB4c2RNb2RlbEZpbGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGlzVmFsaWRTY2hlbWFMb2NhdGlvbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBuYW1lc3BhY2UgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IGZpbGUKLSAgICAgICAgICAgICAgICBpZiAoZXh0TmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROYW1lU3BhY2UgIT0gbnVsbCAmJiBleHROYW1lc3BhY2UuZXF1YWxzKGN1cnJlbnROYW1lU3BhY2UpKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9TQU1FX05BTUVfU1BBQ0UiLCB4c2RNb2RlbEZpbGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGlzVmFsaWRTY2hlbWFMb2NhdGlvbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gTWVzc2FnZXMuX1VJX0VSUk9SX0lOVkFMSURfRklMRTsKLSAgICAgICAgICAgIGlzVmFsaWRTY2hlbWFMb2NhdGlvbiA9IGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yTWVzc2FnZSA9IE1lc3NhZ2VzLl9VSV9FUlJPUl9JTlZBTElEX0ZJTEU7Ci0gICAgICAgICAgaXNWYWxpZFNjaGVtYUxvY2F0aW9uID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc1ZhbGlkU2NoZW1hTG9jYXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgZXJyb3JUZXh0LnNldFRleHQoZXJyb3JNZXNzYWdlKTsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSBlcnJvclRleHQuZ2V0VGV4dCgpLmxlbmd0aCgpOwotICAgICAgICAgICAgcmVkID0gbmV3IENvbG9yKG51bGwsIDI1NSwgMCwgMCk7Ci0gICAgICAgICAgICBTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoMCwgbGVuZ3RoLCByZWQsIHNjaGVtYUxvY2F0aW9uVGV4dC5nZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICAgICAgZXJyb3JUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaGFuZGxlU2NoZW1hTG9jYXRpb25DaGFuZ2UoeHNkTW9kZWxGaWxlLCBuYW1lc3BhY2UsIGV4dGVybmFsU2NoZW1hKTsgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVNjaGVtYUxvY2F0aW9uQ2hhbmdlKFN0cmluZyBzY2hlbWFGaWxlU3RyaW5nLCBTdHJpbmcgbmFtZXNwYWNlLCBYU0RTY2hlbWEgZXh0ZXJuYWxTY2hlbWEpCi0gIHsKLSAgICAKLSAgfQotCi0gIAotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICBpZiAocmVkICE9IG51bGwpCi0gICAgewotICAgICAgcmVkLmRpc3Bvc2UoKTsKLSAgICAgIHJlZCA9IG51bGw7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvRW51bWVyYXRpb25zU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9FbnVtZXJhdGlvbnNTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzM2U0YTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9FbnVtZXJhdGlvbnNTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2Vycy5OYXZpZ2FibGVUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRFbnVtZXJhdGlvbnNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuU2V0WFNERmFjZXRWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1lcmF0aW9uc0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERW51bWVyYXRpb25GYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgRW51bWVyYXRpb25zU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbgotewotICBwcml2YXRlIEVudW1lcmF0aW9uc1RhYmxlVmlld2VyIGVudW1lcmF0aW9uc1RhYmxlOwotICBwcml2YXRlIEJ1dHRvbiBhZGRCdXR0b247Ci0gIHByaXZhdGUgQnV0dG9uIGFkZE1hbnlCdXR0b247Ci0gIHByaXZhdGUgQnV0dG9uIGRlbGV0ZUJ1dHRvbjsKLQotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgRW51bWVyYXRpb25zU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLQotICAgIGlmIChlLndpZGdldCA9PSBhZGRCdXR0b24pCi0gICAgewotICAgICAgTGlzdCBlbnVtTGlzdCA9IHN0LmdldEVudW1lcmF0aW9uRmFjZXRzKCk7Ci0gICAgICBTdHJpbmdCdWZmZXIgbmV3TmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoInZhbHVlMSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBpbnQgc3VmZml4ID0gMTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGVudW1MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldCkgaS5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGVudW1GYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKG5ld05hbWUudG9TdHJpbmcoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgc3VmZml4Kys7Ci0gICAgICAgICAgICBuZXdOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigidmFsdWUiICsgU3RyaW5nLnZhbHVlT2Yoc3VmZml4KSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgQWRkRW51bWVyYXRpb25zQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZEVudW1lcmF0aW9uc0NvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRU5VTUVSQVRJT04sIChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaW5wdXQpOwotICAgICAgY29tbWFuZC5zZXRWYWx1ZShuZXdOYW1lLnRvU3RyaW5nKCkpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQotICAgICAgZW51bWVyYXRpb25zVGFibGUucmVmcmVzaCgpOwotICAgICAgaW50IG5ld0l0ZW1JbmRleCA9IGVudW1lcmF0aW9uc1RhYmxlLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxOwotICAgICAgZW51bWVyYXRpb25zVGFibGUuZWRpdEVsZW1lbnQoZW51bWVyYXRpb25zVGFibGUuZ2V0RWxlbWVudEF0KG5ld0l0ZW1JbmRleCksIDApOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBhZGRNYW55QnV0dG9uKQotICAgIHsKLSAgICAgIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotICAgICAgLy8gaWYgaXQgaXMgbnVsbCwgZ2V0IHRoZSBkZWZhdWx0IG9uZQotICAgICAgZGlzcGxheSA9IGRpc3BsYXkgPT0gbnVsbCA/IERpc3BsYXkuZ2V0RGVmYXVsdCgpIDogZGlzcGxheTsKLSAgICAgIFNoZWxsIHBhcmVudFNoZWxsID0gZGlzcGxheS5nZXRBY3RpdmVTaGVsbCgpOwotICAgICAgRW51bWVyYXRpb25zRGlhbG9nIGRpYWxvZyA9IG5ldyBFbnVtZXJhdGlvbnNEaWFsb2cocGFyZW50U2hlbGwpOwotICAgICAgZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotICAgICAgaW50IHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0KLSAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotICAgICAgewotICAgICAgICBTdHJpbmcgdGV4dCA9IGRpYWxvZy5nZXRUZXh0KCk7Ci0gICAgICAgIFN0cmluZyBkZWxpbWl0ZXIgPSBkaWFsb2cuZ2V0RGVsaW1pdGVyKCk7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRleHQsIGRlbGltaXRlcik7Ci0gICAgICAgIENvbXBvdW5kQ29tbWFuZCBjb21wb3VuZENvbW1hbmQgPSBuZXcgQ29tcG91bmRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0VOVU1FUkFUSU9OUyk7Ci0gICAgICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICAgIGlmIChkaWFsb2cuaXNQcmVzZXJ2ZVdoaXRlc3BhY2UoKSA9PSBmYWxzZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0b2tlbiA9IHRva2VuLnRyaW0oKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgQWRkRW51bWVyYXRpb25zQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZEVudW1lcmF0aW9uc0NvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRU5VTUVSQVRJT05TLCAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGlucHV0KTsKLSAgICAgICAgICBjb21tYW5kLnNldFZhbHVlKHRva2VuKTsKLSAgICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKGNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tcG91bmRDb21tYW5kKTsKLSAgICAgIH0KLSAgICAgIGVudW1lcmF0aW9uc1RhYmxlLnJlZnJlc2goKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gZGVsZXRlQnV0dG9uKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGVudW1lcmF0aW9uc1RhYmxlLmdldFNlbGVjdGlvbigpOwotICAgICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBpID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0gICAgICAgIENvbXBvdW5kQ29tbWFuZCBjb21wb3VuZENvbW1hbmQgPSBuZXcgQ29tcG91bmRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fREVMRVRFX0VOVU1FUkFUSU9OKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgWFNERW51bWVyYXRpb25GYWNldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldCkgb2JqOwotCi0gICAgICAgICAgICAgIERlbGV0ZUNvbW1hbmQgZGVsZXRlQ29tbWFuZCA9IG5ldyBEZWxldGVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fREVMRVRFX0VOVU1FUkFUSU9OLCBlbnVtRmFjZXQpOwotICAgICAgICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKGRlbGV0ZUNvbW1hbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbXBvdW5kQ29tbWFuZCk7Ci0gICAgICAgIGVudW1lcmF0aW9uc1RhYmxlLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gZW51bWVyYXRpb25zVGFibGUuZ2V0VGFibGUoKSkKLSAgICB7Ci0gICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBlbnVtZXJhdGlvbnNUYWJsZS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIGlmIChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpOwotICAgIGNvbXBvc2l0ZSA9IGZhY3RvcnkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIGVudW1lcmF0aW9uc1RhYmxlID0gbmV3IEVudW1lcmF0aW9uc1RhYmxlVmlld2VyKGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUYWJsZShjb21wb3NpdGUsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTikpOwotICAgIGVudW1lcmF0aW9uc1RhYmxlLnNldElucHV0KGlucHV0KTsKLSAgICBUYWJsZSB0YWJsZSA9IGVudW1lcmF0aW9uc1RhYmxlLmdldFRhYmxlKCk7Ci0gICAgdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICBhZGRCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9BRERfQlVUVE9OX0xBQkVMIiksIFNXVC5QVVNIKTsgLy8kTk9OLU5MUy0xJAotICAgIGFkZE1hbnlCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1JFR0VYX1dJWkFSRF9BRERfQlVUVE9OX0xBQkVMIikgKyAiLi4uIiwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBkZWxldGVCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9ERUxFVEVfSU5DTFVERSIpLCBTV1QuUFVTSCk7IC8vJE5PTi1OTFMtMSQKLQotICAgIEZvcm1EYXRhIGRhdGEyID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgZGF0YTIudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgIGRhdGEyLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMTAwKTsKLSAgICBkYXRhMi5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgIC8vIGRhdGEyLndpZHRoID0gNTA7Ci0gICAgYWRkQnV0dG9uLnNldExheW91dERhdGEoZGF0YTIpOwotICAgIGFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIEZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLSAgICBkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYWRkQnV0dG9uLCAwLCBTV1QuTEVGVCk7Ci0gICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGFkZEJ1dHRvbiwgMCk7Ci0gICAgYWRkTWFueUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGFkZE1hbnlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGFkZEJ1dHRvbiwgMCwgU1dULkxFRlQpOwotICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLSAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChhZGRNYW55QnV0dG9uLCAwKTsKLSAgICBkZWxldGVCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBkZWxldGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgZGVsZXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLSAgICBkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGFkZEJ1dHRvbiwgMCk7Ci0gICAgZGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLSAgICBkYXRhLndpZHRoID0gNTA7Ci0gICAgdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICB0YWJsZS5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCB0aGlzKTsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgaWYgKGlzUmVhZE9ubHkpCi0gICAgewotICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLQotICAgIEl0ZXJhdG9yIHZhbGlkRmFjZXRzID0gc3QuZ2V0VmFsaWRGYWNldHMoKS5pdGVyYXRvcigpOwotCi0gICAgYm9vbGVhbiBpc0FwcGxpY2FibGUgPSBmYWxzZTsKLSAgICB3aGlsZSAodmFsaWRGYWNldHMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFN0cmluZyBhVmFsaWRGYWNldCA9IChTdHJpbmcpIHZhbGlkRmFjZXRzLm5leHQoKTsKLSAgICAgIGlmIChhVmFsaWRGYWNldC5lcXVhbHMoWFNEQ29uc3RhbnRzLkVOVU1FUkFUSU9OX0VMRU1FTlRfVEFHKSkKLSAgICAgIHsKLSAgICAgICAgaXNBcHBsaWNhYmxlID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaXNBcHBsaWNhYmxlKQotICAgIHsKLSAgICAgIGFkZEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgYWRkTWFueUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgYWRkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgYWRkTWFueUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgZW51bWVyYXRpb25zVGFibGUuc2V0SW5wdXQoaW5wdXQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBUYWJsZSB0YWJsZSA9IGVudW1lcmF0aW9uc1RhYmxlLmdldFRhYmxlKCk7Ci0gICAgaWYgKGV2ZW50LnR5cGUgPT0gU1dULlJlc2l6ZSAmJiBldmVudC53aWRnZXQgPT0gdGFibGUpCi0gICAgewotICAgICAgVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW4oMCk7Ci0gICAgICB0YWJsZUNvbHVtbi5zZXRXaWR0aCh0YWJsZS5nZXRTaXplKCkueCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBjbGFzcyBFbnVtZXJhdGlvbnNUYWJsZVZpZXdlciBleHRlbmRzIE5hdmlnYWJsZVRhYmxlVmlld2VyIGltcGxlbWVudHMgSUNlbGxNb2RpZmllcgotICB7Ci0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXMgPSB7IFhTRENvbnN0YW50cy5FTlVNRVJBVElPTl9FTEVNRU5UX1RBRyB9OwotCi0gICAgcHJvdGVjdGVkIENlbGxFZGl0b3JbXSBjZWxsRWRpdG9yczsKLQotICAgIFRhYmxlIHRhYmxlOwotCi0gICAgcHVibGljIEVudW1lcmF0aW9uc1RhYmxlVmlld2VyKFRhYmxlIHRhYmxlKQotICAgIHsKLSAgICAgIHN1cGVyKHRhYmxlKTsKLSAgICAgIHRhYmxlID0gZ2V0VGFibGUoKTsKLQotICAgICAgdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0gICAgICBzZXRDb250ZW50UHJvdmlkZXIobmV3IEVudW1lcmF0aW9uc1RhYmxlQ29udGVudFByb3ZpZGVyKCkpOwotICAgICAgc2V0TGFiZWxQcm92aWRlcihuZXcgRW51bWVyYXRpb25zVGFibGVMYWJlbFByb3ZpZGVyKCkpOwotICAgICAgc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5Qcm9wZXJ0aWVzKTsKLQotICAgICAgc2V0Q2VsbE1vZGlmaWVyKHRoaXMpOwotCi0gICAgICBUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FLCAwKTsKLSAgICAgIGNvbHVtbi5zZXRUZXh0KGNvbHVtblByb3BlcnRpZXNbMF0pOwotICAgICAgY29sdW1uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0gICAgICBjb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCi0gICAgICBjZWxsRWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yWzFdOwotCi0gICAgICBUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLSAgICAgIENvbHVtbldlaWdodERhdGEgZGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCk7Ci0KLSAgICAgIGxheW91dC5hZGRDb2x1bW5EYXRhKGRhdGEpOwotICAgICAgY2VsbEVkaXRvcnNbMF0gPSBuZXcgVGV4dENlbGxFZGl0b3IodGFibGUpOwotCi0gICAgICBnZXRUYWJsZSgpLnNldExheW91dChsYXlvdXQpOwotICAgICAgc2V0Q2VsbEVkaXRvcnMoY2VsbEVkaXRvcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYWJsZUl0ZW0gJiYgKHZhbHVlICE9IG51bGwpKQotICAgICAgewotICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGVsZW1lbnQ7Ci0KLSAgICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldCkgaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgIFNldFhTREZhY2V0VmFsdWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgU2V0WFNERmFjZXRWYWx1ZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfRU5VTUVSQVRJT05fVkFMVUUsIGVudW1GYWNldCk7Ci0gICAgICAgIGNvbW1hbmQuc2V0VmFsdWUoKFN0cmluZykgdmFsdWUpOwotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICBpdGVtLnNldERhdGEoZW51bUZhY2V0KTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KChTdHJpbmcpIHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotICAgICAgewotICAgICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KSBlbGVtZW50OwotICAgICAgICBTdHJpbmcgdmFsdWUgPSBlbnVtRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgIHZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfQotICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gIH0KLQotICBjbGFzcyBFbnVtZXJhdGlvbnNUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCBpbnB1dEVsZW1lbnQpCi0gICAgewotICAgICAgamF2YS51dGlsLkxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGlucHV0RWxlbWVudDsKLSAgICAgICAgcmV0dXJuIHN0LmdldEVudW1lcmF0aW9uRmFjZXRzKCkudG9BcnJheSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIGxpc3QudG9BcnJheSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICB9Ci0gIH0KLQotICBjbGFzcyBFbnVtZXJhdGlvbnNUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlcgotICB7Ci0gICAgcHVibGljIEVudW1lcmF0aW9uc1RhYmxlTGFiZWxQcm92aWRlcigpCi0gICAgewotCi0gICAgfQotCi0gICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEU2ltcGxlRW51bS5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgWFNERW51bWVyYXRpb25GYWNldCkKLSAgICAgIHsKLSAgICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldCkgZWxlbWVudDsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gZW51bUZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICB2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvRXh0ZW5zaW9uc1NlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvRXh0ZW5zaW9uc1NlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhZDUxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0V4dGVuc2lvbnNTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkFkZEV4dGVuc2lvbkF0dHJpYnV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkRXh0ZW5zaW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5BZGRFeHRlbnNpb25FbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5FeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5FeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLkFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLkNhdGVnb3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLkRPTUV4dGVuc2lvblRyZWVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5FeHRlbnNpb25JdGVtRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5FeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5TcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uWFNERXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tLk5vZGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC50ZXh0LlhTRE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuTW9kZWxSZWNvbmNpbGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25zU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0RXh0ZW5zaW9uc1NlY3Rpb24KLXsKLSAgWFNETW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOwotICAKLSAgcHVibGljIEV4dGVuc2lvbnNTZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgc2V0RXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXIobmV3IERPTUV4dGVuc2lvblRyZWVMYWJlbFByb3ZpZGVyKCkpOwotICAgIHNldEV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXIobmV3IFhTREV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXIoKSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBBZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nIGNyZWF0ZUFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2coKQotICB7Ci0gICAgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZyBkaWFsb2cgPSAgbmV3IEFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2coY29tcG9zaXRlLmdldFNoZWxsKCksIGdldEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkoKSkKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgZ2V0Q2F0ZWdvcnlDb250ZW50UHJvdmlkZXIoKQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFhTRENhdGVnb3J5Q29udGVudFByb3ZpZGVyKCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBkaWFsb2cuYWRkRWxlbWVudHNUYWJsZUZpbHRlcihuZXcgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZ0ZpbHRlcihpbnB1dCwgZGlhbG9nKSk7ICAgIAotICAgIHJldHVybiBkaWFsb2c7ICAgCi0gIH0KLSAgIAotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHN1cGVyLnNldElucHV0KHBhcnQsIHNlbGVjdGlvbik7IAotICAgIGlmIChhZGFwdGVyID09IG51bGwpCi0gICAgewotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvYmogPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClvYmopLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGFkYXB0ZXIgPSBYU0RNb2RlbEFkYXB0ZXIubG9va3VwT3JDcmVhdGVNb2RlbEFkYXB0ZXIoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTW9kZWxSZWNvbmNpbGVBZGFwdGVyIG1vZGVsUmVjb25jaWxlQWRhcHRlciA9IGFkYXB0ZXIuZ2V0TW9kZWxSZWNvbmNpbGVBZGFwdGVyKCk7Ci0gICAgICAgICAgICAgIGlmIChtb2RlbFJlY29uY2lsZUFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vZGVsUmVjb25jaWxlQWRhcHRlci5hZGRMaXN0ZW5lcihpbnRlcm5hbE5vZGVBZGFwdGVyKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGV4dGVuc2lvblRyZWVWaWV3ZXIuZXhwYW5kVG9MZXZlbCgyKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBNb2RlbFJlY29uY2lsZUFkYXB0ZXIgbW9kZWxSZWNvbmNpbGVBZGFwdGVyID0gYWRhcHRlci5nZXRNb2RlbFJlY29uY2lsZUFkYXB0ZXIoKTsKLSAgICAgIGlmIChtb2RlbFJlY29uY2lsZUFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbW9kZWxSZWNvbmNpbGVBZGFwdGVyLnJlbW92ZUxpc3RlbmVyKGludGVybmFsTm9kZUFkYXB0ZXIpOwotICAgICAgfQotICAgIH0gIAotICB9Ci0KLSAgcHJvdGVjdGVkIEFkZEV4dGVuc2lvbkNvbW1hbmQgZ2V0QWRkRXh0ZW5zaW9uQ29tbWFuZChPYmplY3QgbykKLSAgewotICAgIEFkZEV4dGVuc2lvbkNvbW1hbmQgYWRkRXh0ZW5zaW9uQ29tbWFuZCA9IG51bGw7Ci0gICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBvOwotICAgICAgRXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQgZXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQgPSBnZXRFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5KCkuZ2V0QWRkRXh0ZW5zaW9uQ29tbWFuZChlbGVtZW50LmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgIGlmIChleHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZCAhPSBudWxsKQotICAgICAgewotICAgICAgICBleHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZC5zZXRJbnB1dHMoKFhTRENvbmNyZXRlQ29tcG9uZW50KSBpbnB1dCwgZWxlbWVudCk7Ci0gICAgICAgIGFkZEV4dGVuc2lvbkNvbW1hbmQgPSBleHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYWRkRXh0ZW5zaW9uQ29tbWFuZCA9IG5ldyBBZGRFeHRlbnNpb25FbGVtZW50Q29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BUFBJTkZPX0VMRU1FTlQsIChYU0RDb25jcmV0ZUNvbXBvbmVudCkgaW5wdXQsIGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0cmlidXRlID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBvOwotICAgICAgYWRkRXh0ZW5zaW9uQ29tbWFuZCA9IG5ldyBBZGRFeHRlbnNpb25BdHRyaWJ1dGVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0FQUElORk9fQVRUUklCVVRFLCAoWFNEQ29uY3JldGVDb21wb25lbnQpIGlucHV0LCBhdHRyaWJ1dGUpOwotICAgIH0KLSAgICByZXR1cm4gYWRkRXh0ZW5zaW9uQ29tbWFuZDsKLSAgfQotCi0gIHByb3RlY3RlZCBDb21tYW5kIGdldFJlbW92ZUV4dGVuc2lvbkNvbW1hbmQoT2JqZWN0IG8pCi0gIHsKLSAgICBDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgTm9kZSkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpbzsKLSAgICAgICAgRXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kIHJlbW92ZUNvbW1hbmQgPSBnZXRFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5KCkuZ2V0UmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQobm9kZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIGlmIChyZW1vdmVDb21tYW5kICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZW1vdmVDb21tYW5kLnNldElucHV0KChYU0RDb25jcmV0ZUNvbXBvbmVudClpbnB1dCk7Ci0gICAgICAgICAgcmVtb3ZlQ29tbWFuZC5zZXROb2RlKG5vZGUpOwotICAgICAgICAgIHJldHVybiByZW1vdmVDb21tYW5kOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGNvbW1hbmQgPSBuZXcgUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9ERUxFVEVfQVBQSU5GT19FTEVNRU5ULCBub2RlKTsgIAotICAgICAgICAgIC8vIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBjb21tYW5kOwotICB9ICAKLSAgCi0gIHByb3RlY3RlZCBFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5IGdldEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkoKQotICB7Ci0gICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1RyZWVWaWV3ZXJJbnB1dEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7ICAgICAKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICB7ICAKLSAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudClpbnB1dDsKLSAgICAgIEVsZW1lbnQgY29tcG9uZW50RWxlbWVudCA9IGNvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0gICAgICBOb2RlIHBhcmVudCA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgTm9kZSBncmFuZFBhcmVudCA9IHBhcmVudCAhPSBudWxsID8gcGFyZW50LmdldFBhcmVudE5vZGUoKSA6IG51bGw7Ci0gICAgICByZXR1cm4gY29tcG9uZW50RWxlbWVudCA9PSBlbGVtZW50IHx8IGNvbXBvbmVudEVsZW1lbnQgPT0gcGFyZW50IHx8IGNvbXBvbmVudEVsZW1lbnQgPT0gZ3JhbmRQYXJlbnQ7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZlN0b3JlKCkKLSAgewotICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0gIH0KLSAgCi0gIHN0YXRpYyBjbGFzcyBYU0RDYXRlZ29yeUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gIHsKLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgICB7ICAgIAotICAgICAgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWFbXSBleHRlbnNpb25zU2NoZW1hU3BlY3MgPSBudWxsOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIExpc3QgaW5wdXRMaXN0ID0gKExpc3QpIGlucHV0RWxlbWVudDsKLSAgICAgICAgCi0gICAgICAgIExpc3QgdG90YWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRvdGFsLmFkZEFsbChpbnB1dExpc3QpOwotICAgICAgICAKLSAgICAgICAgTGlzdCBkeW5hbWljQ2F0ZWdvcmllcyA9IFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5KCkuZ2V0Q2F0ZWdvcnlQcm92aWRlcnMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZHluYW1pY0NhdGVnb3JpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgIENhdGVnb3J5UHJvdmlkZXIgY2F0ZWdvcnlQcm92aWRlciA9IChDYXRlZ29yeVByb3ZpZGVyKWl0ZXIubmV4dCgpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjYXRlZ29yeVByb3ZpZGVyLmdldENhdGVnb3JpZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzcCA9IChTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSlpdC5uZXh0KCk7Ci0gICAgICAgICAgICB0b3RhbC5hZGQoc3ApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGV4dGVuc2lvbnNTY2hlbWFTcGVjcyA9IChTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYVtdKSB0b3RhbC50b0FycmF5KG5ldyBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYVswXSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZXh0ZW5zaW9uc1NjaGVtYVNwZWNzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICAgIC8vIERvIG5vdGhpbmcKLQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLSAgICAgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotICAgIHsKLSAgICAgIC8vIERvIG5vdGhpbmcKLQotICAgIH0gICAgICAgICAgIAotICB9Ci0gIAotICAvKioKLSAgICogVGhpcyBmaWx0ZXIgaXMgdG8gYmUgdXNlZCBieSB0aGUgZGlhbG9nIGludm9rZWQgd2hlbiBhZGRCdXR0b24gaXMgcHJlc3NlZAotICAgKi8KLSAgcHJvdGVjdGVkIGNsYXNzIEFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2dGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIKLSAgewotICAgIHByaXZhdGUgT2JqZWN0IGlucHV0OwotICAgIHByaXZhdGUgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZyBkaWFsb2c7Ci0KLSAgICBwdWJsaWMgQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZ0ZpbHRlcihPYmplY3QgaW5wdXQsIEFkZEV4dGVuc2lvbnNDb21wb25lbnREaWFsb2cgZGlhbG9nKQotICAgIHsKLSAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgICAgIHRoaXMuZGlhbG9nID0gZGlhbG9nOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpCi0gICAgeyAgICAgIAotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQgJiYKLSAgICAgICAgICBlbGVtZW50IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICB7ICAgICAgICAgICAgICAKLSAgICAgICAgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc3BlYyA9IGRpYWxvZy5nZXRTZWxlY3RlZENhdGVnb3J5KCk7Ci0gICAgICAgIC8vIGhlcmUgd2Ugb2J0YWluIHRoZSBub2RlIGZpbHRlciB0aGF0IHdhcyByZWdpc3RlcmVkIGZvciB0aGUgYXBwbGljYWJsZSBuYW1lc3BhY2UKLSAgICAgICAgLy8gbm90aWVkCi0gICAgICAgIE5vZGVGaWx0ZXIgZmlsdGVyID0gWFNERWRpdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldE5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkoKS5nZXROb2RlRmlsdGVyKHNwZWMuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAKLSAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gQ2hlY2sgaWYgYSBub2RlIGZpbHRlciBoYXMgYmVlbiBzcGVjaWZpZWQsIGlmIHNvLCB0aGVuIHVzZSBpdAotICAgICAgICAgIGZpbHRlciA9IHNwZWMuZ2V0Tm9kZUZpbHRlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZpbHRlciBpbnN0YW5jZW9mIEV4dGVuc2lvbkl0ZW1GaWx0ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICBFeHRlbnNpb25JdGVtRmlsdGVyIGV4dGVuc2lvbkl0ZW1GaWx0ZXIgPSAoRXh0ZW5zaW9uSXRlbUZpbHRlcilmaWx0ZXI7Ci0gICAgICAgICAgcmV0dXJuIGV4dGVuc2lvbkl0ZW1GaWx0ZXIuaXNBcHBsaWNhYmxlQ29udGV4dCgoWFNEQ29uY3JldGVDb21wb25lbnQpaW5wdXQsIChYU0RDb25jcmV0ZUNvbXBvbmVudCllbGVtZW50KTsgICAgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBUT0RPIGNzOiBldmVuIGlmIGl0J3MganVzdCBhIHBsYWluIG9sZCBOb2RlRmlsdGVyIHdlIHNob3VsZCBzdGlsbCBiZSBhYmxlIHRvIHVzZSBpdCEgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfSAgCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0ZhY2V0Vmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0ZhY2V0Vmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxM2Q3NGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9GYWNldFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi0vL2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotLy9pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotLy9pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0vLwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tBZGFwdGVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2Vycy5OYXZpZ2FibGVUYWJsZVZpZXdlcjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5ET01BdHRyaWJ1dGU7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuWFNEQ29tYm9Cb3hQcm9wZXJ0eURlc2NyaXB0b3I7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbnN0cmFpbmluZ0ZhY2V0OwotLy9pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWF4RXhjbHVzaXZlRmFjZXQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWF4RmFjZXQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWF4SW5jbHVzaXZlRmFjZXQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWluRXhjbHVzaXZlRmFjZXQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWluRmFjZXQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWluSW5jbHVzaXZlRmFjZXQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFCdWlsZGluZ1Rvb2xzOwotLy9pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEZhY2V0Vmlld2VyIC8vZXh0ZW5kcyBOYXZpZ2FibGVUYWJsZVZpZXdlciBpbXBsZW1lbnRzIElDZWxsTW9kaWZpZXIKLXsKLS8vICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNFVF9OQU1FID0gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0ZBQ0VUX05BTUUiKTsgLy8gIk5hbWUiOwotLy8gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VUX1ZBTFVFID0gWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0ZBQ0VUX1ZBTFVFIik7IC8vICJWYWx1ZSI7Ci0vLyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDRVRfT1RIRVIgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfRkFDRVRfRklYRUQiKTsgLy8gIkZpeGVkIjsKLS8vCi0vLyAgcHJvdGVjdGVkIEZhY2V0c1RhYmxlTGFiZWxQcm92aWRlciBmYWNldHNUYWJsZUxhYmVsUHJvdmlkZXIgPSBuZXcgRmFjZXRzVGFibGVMYWJlbFByb3ZpZGVyKCk7Ci0vLyAgcHJvdGVjdGVkIEZhY2V0c1RhYmxlQ29udGVudFByb3ZpZGVyIGZhY2V0c1RhYmxlQ29udGVudFByb3ZpZGVyID0gbmV3IEZhY2V0c1RhYmxlQ29udGVudFByb3ZpZGVyKCk7Ci0vLyAgcHJvdGVjdGVkIFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXMgPSB7IEZBQ0VUX05BTUUsIEZBQ0VUX1ZBTFVFLCBGQUNFVF9PVEhFUiB9OwotLy8gIHByb3RlY3RlZCBDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnM7IC8vIHRoZXNlIGNlbGxFZGl0b3JzIGFyZSB1c2VkIHdoZW4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub24td2hpdGVzcGFjZSBmYWNldCBpcyBzZWxlY3RlZAotLy8gIHByb3RlY3RlZCBDZWxsRWRpdG9yW10gYWx0Q2VsbEVkaXRvcnM7IC8vIHRoZXNlIGNlbGxFZGl0b3JzIGFyZSB1c2VkIHdoZW4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpdGVzcGFjZSBmYWNldCBpcyBzZWxlY3RlZAotLy8KLS8vICBwcm90ZWN0ZWQgU3RyaW5nW10gd2hpdGVTcGFjZVZhbHVlcyA9IG5ldyBTdHJpbmdbXSB7ICIiLCAicHJlc2VydmUiLCAicmVwbGFjZSIsICJjb2xsYXBzZSIgfTsKLS8vICBwcm90ZWN0ZWQgU3RyaW5nW10gdHJ1ZUZhbHNlVmFsdWVzID0gbmV3IFN0cmluZ1tdIHsgIiIsICJmYWxzZSIsICJ0cnVlIiB9OwotLy8KLS8vICAvKioKLS8vICAgKiBAcGFyYW0gcGFyZW50Ci0vLyAgICovCi0vLyAgcHVibGljIEZhY2V0Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpCi0vLyAgewotLy8gICAgc3VwZXIobmV3IFRhYmxlKHBhcmVudCwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULlNJTkdMRSkpOwotLy8KLS8vICAgIGdldFRhYmxlKCkuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotLy8gICAgZ2V0VGFibGUoKS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotLy8KLS8vICAgIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkpOwotLy8gICAgZ2V0VGFibGUoKS5hZGRNb3VzZVRyYWNrTGlzdGVuZXIobmV3IE15TW91c2VUcmFja0xpc3RlbmVyKCkpOwotLy8KLS8vICAgIHNldENvbnRlbnRQcm92aWRlcihmYWNldHNUYWJsZUNvbnRlbnRQcm92aWRlcik7Ci0vLyAgICBzZXRMYWJlbFByb3ZpZGVyKGZhY2V0c1RhYmxlTGFiZWxQcm92aWRlcik7Ci0vLyAgICBzZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotLy8KLS8vICAgIHNldENlbGxNb2RpZmllcih0aGlzKTsKLS8vCi0vLyAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykKLS8vICAgIHsKLS8vICAgICAgVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKGdldFRhYmxlKCksIFNXVC5OT05FLCBpKTsKLS8vICAgICAgY29sdW1uLnNldFRleHQoY29sdW1uUHJvcGVydGllc1tpXSk7Ci0vLyAgICAgIGNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotLy8gICAgICBjb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotLy8gICAgfQotLy8KLS8vICAgIGNlbGxFZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbM107Ci0vLyAgICBhbHRDZWxsRWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yWzNdOwotLy8KLS8vICAgIFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotLy8gICAgQ29sdW1uV2VpZ2h0RGF0YSBkYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoNjAsIDgwLCB0cnVlKTsKLS8vICAgIGxheW91dC5hZGRDb2x1bW5EYXRhKGRhdGEpOwotLy8gICAgY2VsbEVkaXRvcnNbMF0gPSBudWxsOwotLy8KLS8vICAgIENvbHVtbldlaWdodERhdGEgZGF0YTIgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMjAsIDgwLCB0cnVlKTsKLS8vICAgIGxheW91dC5hZGRDb2x1bW5EYXRhKGRhdGEyKTsKLS8vCi0vLyAgICBjZWxsRWRpdG9yc1sxXSA9IG5ldyBUZXh0Q2VsbEVkaXRvcihnZXRUYWJsZSgpKTsKLS8vICAgIFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yIHBkID0gbmV3IFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yKCJjb21ibyIsICJ3aGl0ZXNwYWNlIiwgd2hpdGVTcGFjZVZhbHVlcyk7Ci0vLyAgICBhbHRDZWxsRWRpdG9yc1sxXSA9IHBkLmNyZWF0ZVByb3BlcnR5RWRpdG9yKGdldFRhYmxlKCkpOwotLy8KLS8vICAgIENvbHVtbldlaWdodERhdGEgZGF0YTMgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg2MCwgNjAsIHRydWUpOwotLy8gICAgbGF5b3V0LmFkZENvbHVtbkRhdGEoZGF0YTMpOwotLy8KLS8vICAgIFhTRENvbWJvQm94UHJvcGVydHlEZXNjcmlwdG9yIHBkMiA9IG5ldyBYU0RDb21ib0JveFByb3BlcnR5RGVzY3JpcHRvcigiY29tYm8iLCAib3RoZXIiLCB0cnVlRmFsc2VWYWx1ZXMpOwotLy8gICAgY2VsbEVkaXRvcnNbMl0gPSBwZDIuY3JlYXRlUHJvcGVydHlFZGl0b3IoZ2V0VGFibGUoKSk7Ci0vLyAgICBhbHRDZWxsRWRpdG9yc1syXSA9IHBkMi5jcmVhdGVQcm9wZXJ0eUVkaXRvcihnZXRUYWJsZSgpKTsKLS8vCi0vLyAgICBnZXRUYWJsZSgpLnNldExheW91dChsYXlvdXQpOwotLy8gICAgc2V0Q2VsbEVkaXRvcnMoY2VsbEVkaXRvcnMpOwotLy8KLS8vICB9Ci0vLwotLy8gIC8qCi0vLyAgICogKG5vbi1KYXZhZG9jKQotLy8gICAqIAotLy8gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyI2Nhbk1vZGlmeShqYXZhLmxhbmcuT2JqZWN0LAotLy8gICAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLS8vICAgKi8KLS8vICBwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLS8vICB7Ci0vLyAgICByZXR1cm4gcHJvcGVydHkuZXF1YWxzKEZBQ0VUX1ZBTFVFKSB8fCBwcm9wZXJ0eS5lcXVhbHMoRkFDRVRfT1RIRVIpOwotLy8gIH0KLS8vCi0vLyAgLyoKLS8vICAgKiAobm9uLUphdmFkb2MpCi0vLyAgICogCi0vLyAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXIjZ2V0VmFsdWUoamF2YS5sYW5nLk9iamVjdCwKLS8vICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0vLyAgICovCi0vLyAgcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotLy8gIHsKLS8vICAgIGludCBjb2x1bW4gPSAwOwotLy8gICAgaWYgKHByb3BlcnR5LmVxdWFscyhjb2x1bW5Qcm9wZXJ0aWVzWzBdKSkKLS8vICAgIHsKLS8vICAgICAgY29sdW1uID0gMDsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscyhjb2x1bW5Qcm9wZXJ0aWVzWzFdKSkKLS8vICAgIHsKLS8vICAgICAgY29sdW1uID0gMTsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscyhjb2x1bW5Qcm9wZXJ0aWVzWzJdKSkKLS8vICAgIHsKLS8vICAgICAgY29sdW1uID0gMjsKLS8vICAgIH0KLS8vCi0vLyAgICByZXR1cm4gZmFjZXRzVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQoZWxlbWVudCwgY29sdW1uKTsKLS8vICB9Ci0vLwotLy8gIC8qCi0vLyAgICogKG5vbi1KYXZhZG9jKQotLy8gICAqIAotLy8gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyI21vZGlmeShqYXZhLmxhbmcuT2JqZWN0LAotLy8gICAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLS8vICAgKi8KLS8vICBwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKQotLy8gIHsKLS8vICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGUgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGdldElucHV0KCk7Ci0vLyAgICBUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGVsZW1lbnQ7Ci0vLyAgICBpZiAoaXRlbSAhPSBudWxsKQotLy8gICAgewotLy8gICAgICBPYmplY3QgbyA9IGl0ZW0uZ2V0RGF0YSgpOwotLy8gICAgICBpZiAobyAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgU3RyaW5nIGZhY2V0ID0gKFN0cmluZykgbzsKLS8vCi0vLyAgICAgICAgICBFbGVtZW50IHNpbXBsZVR5cGVFbGVtZW50ID0geHNkU2ltcGxlVHlwZS5nZXRFbGVtZW50KCk7Ci0vLyAgICAgICAgICBYU0RET01IZWxwZXIgeHNkRE9NSGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotLy8gICAgICAgICAgRWxlbWVudCBkZXJpdmVkQnlFbGVtZW50ID0geHNkRE9NSGVscGVyLmdldERlcml2ZWRCeUVsZW1lbnQoc2ltcGxlVHlwZUVsZW1lbnQpOwotLy8KLS8vICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBzaW1wbGVUeXBlRWxlbWVudC5nZXRQcmVmaXgoKTsKLS8vICAgICAgICAgIHByZWZpeCA9IChwcmVmaXggPT0gbnVsbCkgPyAiIiA6IChwcmVmaXggKyAiOiIpOwotLy8KLS8vICAgICAgICAgIEVsZW1lbnQgY2hpbGROb2RlRWxlbWVudCA9IG51bGw7Ci0vLyAgICAgICAgICBET01BdHRyaWJ1dGUgdmFsdWVBdHRyID0gbnVsbDsKLS8vCi0vLyAgICAgICAgICBYU0RDb25zdHJhaW5pbmdGYWNldCB0YXJnZXRGYWNldCA9IGdldFhTRENvbnN0cmFpbmluZ0ZhY2V0KGZhY2V0KTsKLS8vCi0vLyAgICAgICAgICBTdHJpbmcgbmV3VmFsdWUgPSAiIjsKLS8vICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICBuZXdWYWx1ZSA9IChTdHJpbmcpIHZhbHVlOwotLy8gICAgICAgICAgfQotLy8KLS8vICAgICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoY29sdW1uUHJvcGVydGllc1sxXSkpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIGlmICh0YXJnZXRGYWNldCA9PSBudWxsICYmIG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIHRhcmdldEZhY2V0ID0gY3JlYXRlRmFjZXQoZmFjZXQpOwotLy8gICAgICAgICAgICAgIGNoaWxkTm9kZUVsZW1lbnQgPSAoZGVyaXZlZEJ5RWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpLmNyZWF0ZUVsZW1lbnROUyhYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsIHByZWZpeCArIGZhY2V0KTsKLS8vICAgICAgICAgICAgICB2YWx1ZUF0dHIgPSBuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5WQUxVRV9BVFRSSUJVVEUsIG5ld1ZhbHVlKTsKLS8vICAgICAgICAgICAgICBjaGlsZE5vZGVFbGVtZW50LnNldEF0dHJpYnV0ZSh2YWx1ZUF0dHIuZ2V0TmFtZSgpLCB2YWx1ZUF0dHIuZ2V0VmFsdWUoKSk7Ci0vLyAgICAgICAgICAgICAgLy8gYWRkIGFuZCBmb3JtYXQgY2hpbGQKLS8vICAgICAgICAgICAgICBkZXJpdmVkQnlFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkTm9kZUVsZW1lbnQpOwotLy8gICAgICAgICAgICAgIHRhcmdldEZhY2V0LnNldEVsZW1lbnQoY2hpbGROb2RlRWxlbWVudCk7Ci0vLyAgICAgICAgICAgICAgWFNERE9NSGVscGVyLmZvcm1hdENoaWxkKGNoaWxkTm9kZUVsZW1lbnQpOwotLy8KLS8vICAgICAgICAgICAgICAvLyBYU0RTY2hlbWFIZWxwZXIudXBkYXRlRWxlbWVudCh4c2RTaW1wbGVUeXBlKTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgICBpZiAodGFyZ2V0RmFjZXQgPT0gbnVsbCkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIHJldHVybjsKLS8vICAgICAgICAgICAgfQotLy8KLS8vICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIHRhcmdldEZhY2V0LnNldExleGljYWxWYWx1ZShuZXdWYWx1ZSk7Ci0vLwotLy8gICAgICAgICAgICAgIGlmICh0YXJnZXRGYWNldCBpbnN0YW5jZW9mIFhTRE1heEZhY2V0IHx8IHRhcmdldEZhY2V0IGluc3RhbmNlb2YgWFNETWluRmFjZXQpCi0vLyAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgaWYgKHRhcmdldEZhY2V0IGluc3RhbmNlb2YgWFNETWF4RmFjZXQpCi0vLyAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRGYWNldCBpbnN0YW5jZW9mIFhTRE1heEV4Y2x1c2l2ZUZhY2V0KQotLy8gICAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgICAgWFNETWF4SW5jbHVzaXZlRmFjZXQgeHNkTWF4SW5jbHVzaXZlRmFjZXQgPSB4c2RTaW1wbGVUeXBlLmdldE1heEluY2x1c2l2ZUZhY2V0KCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgaWYgKHhzZE1heEluY2x1c2l2ZUZhY2V0ICE9IG51bGwpCi0vLyAgICAgICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCB4c2RNYXhJbmNsdXNpdmVGYWNldEVsZW1lbnQgPSB4c2RNYXhJbmNsdXNpdmVGYWNldC5nZXRFbGVtZW50KCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UoeHNkTWF4SW5jbHVzaXZlRmFjZXRFbGVtZW50KTsKLS8vICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGFyZ2V0RmFjZXQgaW5zdGFuY2VvZiBYU0RNYXhJbmNsdXNpdmVGYWNldCkKLS8vICAgICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAgIFhTRE1heEV4Y2x1c2l2ZUZhY2V0IHhzZE1heEV4Y2x1c2l2ZUZhY2V0ID0geHNkU2ltcGxlVHlwZS5nZXRNYXhFeGNsdXNpdmVGYWNldCgpOwotLy8gICAgICAgICAgICAgICAgICAgIGlmICh4c2RNYXhFeGNsdXNpdmVGYWNldCAhPSBudWxsKQotLy8gICAgICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgeHNkTWF4RXhjbHVzaXZlRmFjZXRFbGVtZW50ID0geHNkTWF4RXhjbHVzaXZlRmFjZXQuZ2V0RWxlbWVudCgpOwotLy8gICAgICAgICAgICAgICAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKHhzZE1heEV4Y2x1c2l2ZUZhY2V0RWxlbWVudCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICBlbHNlIGlmICh0YXJnZXRGYWNldCBpbnN0YW5jZW9mIFhTRE1pbkZhY2V0KQotLy8gICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RmFjZXQgaW5zdGFuY2VvZiBYU0RNaW5FeGNsdXNpdmVGYWNldCkKLS8vICAgICAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgICAgIFhTRE1pbkluY2x1c2l2ZUZhY2V0IHhzZE1pbkluY2x1c2l2ZUZhY2V0ID0geHNkU2ltcGxlVHlwZS5nZXRNaW5JbmNsdXNpdmVGYWNldCgpOwotLy8gICAgICAgICAgICAgICAgICAgIGlmICh4c2RNaW5JbmNsdXNpdmVGYWNldCAhPSBudWxsKQotLy8gICAgICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgeHNkTWluSW5jbHVzaXZlRmFjZXRFbGVtZW50ID0geHNkTWluSW5jbHVzaXZlRmFjZXQuZ2V0RWxlbWVudCgpOwotLy8gICAgICAgICAgICAgICAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKHhzZE1pbkluY2x1c2l2ZUZhY2V0RWxlbWVudCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhcmdldEZhY2V0IGluc3RhbmNlb2YgWFNETWluSW5jbHVzaXZlRmFjZXQpCi0vLyAgICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgICBYU0RNaW5FeGNsdXNpdmVGYWNldCB4c2RNaW5FeGNsdXNpdmVGYWNldCA9IHhzZFNpbXBsZVR5cGUuZ2V0TWluRXhjbHVzaXZlRmFjZXQoKTsKLS8vICAgICAgICAgICAgICAgICAgICBpZiAoeHNkTWluRXhjbHVzaXZlRmFjZXQgIT0gbnVsbCkKLS8vICAgICAgICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHhzZE1pbkV4Y2x1c2l2ZUZhY2V0RWxlbWVudCA9IHhzZE1pbkV4Y2x1c2l2ZUZhY2V0LmdldEVsZW1lbnQoKTsKLS8vICAgICAgICAgICAgICAgICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZSh4c2RNaW5FeGNsdXNpdmVGYWNldEVsZW1lbnQpOwotLy8gICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgICBlbHNlCi0vLyAgICAgICAgICAgIC8vIG5ld1ZhbHVlLmxlbmd0aCA9PSAwCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICBFbGVtZW50IHRhcmdldEZhY2V0RWxlbWVudCA9IHRhcmdldEZhY2V0LmdldEVsZW1lbnQoKTsKLS8vICAgICAgICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UodGFyZ2V0RmFjZXRFbGVtZW50KTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgfQotLy8gICAgICAgICAgZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKGNvbHVtblByb3BlcnRpZXNbMl0pKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICBpZiAodGFyZ2V0RmFjZXQgIT0gbnVsbCkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA+IDApCi0vLyAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgdGFyZ2V0RmFjZXQuZ2V0RWxlbWVudCgpLnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFLCBuZXdWYWx1ZSk7Ci0vLyAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgIGVsc2UKLS8vICAgICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICB0YXJnZXRGYWNldC5nZXRFbGVtZW50KCkucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5GSVhFRF9BVFRSSUJVVEUpOwotLy8gICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgfQotLy8gICAgICAgICAgeHNkU2ltcGxlVHlwZS5zZXRFbGVtZW50KHNpbXBsZVR5cGVFbGVtZW50KTsKLS8vICAgICAgICAgIC8vIHhzZFNpbXBsZVR5cGUudXBkYXRlRWxlbWVudCgpOwotLy8gICAgICAgICAgcmVmcmVzaCgpOwotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8gICAgfQotLy8gIH0KLS8vCi0vLyAgcHJpdmF0ZSBYU0RDb25zdHJhaW5pbmdGYWNldCBnZXRYU0RDb25zdHJhaW5pbmdGYWNldChTdHJpbmcgZmFjZXRTdHJpbmcpCi0vLyAgewotLy8gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZSA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgZ2V0SW5wdXQoKTsKLS8vICAgIExpc3QgbGlzdCA9IHhzZFNpbXBsZVR5cGUuZ2V0RmFjZXRDb250ZW50cygpOwotLy8gICAgaWYgKGxpc3QgPT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgcmV0dXJuIG51bGw7Ci0vLyAgICB9Ci0vLyAgICBJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOwotLy8gICAgWFNEQ29uc3RyYWluaW5nRmFjZXQgdGFyZ2V0RmFjZXQgPSBudWxsOwotLy8KLS8vICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLS8vICAgIHsKLS8vICAgICAgWFNEQ29uc3RyYWluaW5nRmFjZXQgeHNkQ29uc3RyYWluaW5nRmFjZXQgPSAoWFNEQ29uc3RyYWluaW5nRmFjZXQpIGl0ZXIubmV4dCgpOwotLy8gICAgICBpZiAoeHNkQ29uc3RyYWluaW5nRmFjZXQuZ2V0RmFjZXROYW1lKCkuZXF1YWxzKGZhY2V0U3RyaW5nKSkKLS8vICAgICAgewotLy8gICAgICAgIHRhcmdldEZhY2V0ID0geHNkQ29uc3RyYWluaW5nRmFjZXQ7Ci0vLyAgICAgICAgYnJlYWs7Ci0vLyAgICAgIH0KLS8vICAgIH0KLS8vICAgIHJldHVybiB0YXJnZXRGYWNldDsKLS8vICB9Ci0vLwotLy8gIHByaXZhdGUgWFNEQ29uc3RyYWluaW5nRmFjZXQgY3JlYXRlRmFjZXQoU3RyaW5nIGZhY2V0KQotLy8gIHsKLS8vICAgIFhTREZhY3RvcnkgZmFjdG9yeSA9IFhTRFNjaGVtYUJ1aWxkaW5nVG9vbHMuZ2V0WFNERmFjdG9yeSgpOwotLy8gICAgWFNEQ29uc3RyYWluaW5nRmFjZXQgeHNkRmFjZXQgPSBudWxsOwotLy8gICAgaWYgKGZhY2V0LmVxdWFscygibGVuZ3RoIikpCi0vLyAgICB7Ci0vLyAgICAgIHhzZEZhY2V0ID0gZmFjdG9yeS5jcmVhdGVYU0RMZW5ndGhGYWNldCgpOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJtaW5MZW5ndGgiKSkKLS8vICAgIHsKLS8vICAgICAgeHNkRmFjZXQgPSBmYWN0b3J5LmNyZWF0ZVhTRE1pbkxlbmd0aEZhY2V0KCk7Ci0vLyAgICB9Ci0vLyAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIm1heExlbmd0aCIpKQotLy8gICAgewotLy8gICAgICB4c2RGYWNldCA9IGZhY3RvcnkuY3JlYXRlWFNETWF4TGVuZ3RoRmFjZXQoKTsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygibWluSW5jbHVzaXZlIikpCi0vLyAgICB7Ci0vLyAgICAgIHhzZEZhY2V0ID0gZmFjdG9yeS5jcmVhdGVYU0RNaW5JbmNsdXNpdmVGYWNldCgpOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJtaW5FeGNsdXNpdmUiKSkKLS8vICAgIHsKLS8vICAgICAgeHNkRmFjZXQgPSBmYWN0b3J5LmNyZWF0ZVhTRE1pbkV4Y2x1c2l2ZUZhY2V0KCk7Ci0vLyAgICB9Ci0vLyAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIm1heEluY2x1c2l2ZSIpKQotLy8gICAgewotLy8gICAgICB4c2RGYWNldCA9IGZhY3RvcnkuY3JlYXRlWFNETWF4SW5jbHVzaXZlRmFjZXQoKTsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygibWF4RXhjbHVzaXZlIikpCi0vLyAgICB7Ci0vLyAgICAgIHhzZEZhY2V0ID0gZmFjdG9yeS5jcmVhdGVYU0RNYXhFeGNsdXNpdmVGYWNldCgpOwotLy8gICAgfQotLy8KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygidG90YWxEaWdpdHMiKSkKLS8vICAgIHsKLS8vICAgICAgeHNkRmFjZXQgPSBmYWN0b3J5LmNyZWF0ZVhTRFRvdGFsRGlnaXRzRmFjZXQoKTsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygiZnJhY3Rpb25EaWdpdHMiKSkKLS8vICAgIHsKLS8vICAgICAgeHNkRmFjZXQgPSBmYWN0b3J5LmNyZWF0ZVhTREZyYWN0aW9uRGlnaXRzRmFjZXQoKTsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygid2hpdGVTcGFjZSIpKQotLy8gICAgewotLy8gICAgICB4c2RGYWNldCA9IGZhY3RvcnkuY3JlYXRlWFNEV2hpdGVTcGFjZUZhY2V0KCk7Ci0vLyAgICB9Ci0vLyAgICByZXR1cm4geHNkRmFjZXQ7Ci0vLyAgfQotLy8KLS8vICAvKioKLS8vICAgKiBHZXQgdGhlIHRvb2x0aXAgZm9yIHRoZSBmYWNldAotLy8gICAqLwotLy8gIHB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcChTdHJpbmcgZmFjZXQpCi0vLyAgewotLy8gICAgU3RyaW5nIGtleSA9ICIiOwotLy8gICAgaWYgKGZhY2V0LmVxdWFscygibGVuZ3RoIikpCi0vLyAgICB7Ci0vLyAgICAgIGtleSA9ICJfVUlfVE9PTFRJUF9MRU5HVEgiOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJtaW5MZW5ndGgiKSkKLS8vICAgIHsKLS8vICAgICAga2V5ID0gIl9VSV9UT09MVElQX01JTl9MRU4iOwotLy8gICAgfQotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJtYXhMZW5ndGgiKSkKLS8vICAgIHsKLS8vICAgICAga2V5ID0gIl9VSV9UT09MVElQX01BWF9MRU4iOwotLy8gICAgfQotLy8KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygibWluSW5jbHVzaXZlIikpCi0vLyAgICB7Ci0vLyAgICAgIGtleSA9ICJfVUlfVE9PTFRJUF9NSU5fSU5DTFVTSVZFIjsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygibWluRXhjbHVzaXZlIikpCi0vLyAgICB7Ci0vLyAgICAgIGtleSA9ICJfVUlfVE9PTFRJUF9NSU5fRVhDTFVTSVZFIjsKLS8vICAgIH0KLS8vCi0vLyAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIm1heEluY2x1c2l2ZSIpKQotLy8gICAgewotLy8gICAgICBrZXkgPSAiX1VJX1RPT0xUSVBfTUFYX0lOQ0xVU0lWRSI7Ci0vLyAgICB9Ci0vLyAgICBlbHNlIGlmIChmYWNldC5lcXVhbHMoIm1heEV4Y2x1c2l2ZSIpKQotLy8gICAgewotLy8gICAgICBrZXkgPSAiX1VJX1RPT0xUSVBfTUFYX0VYQ0xVU0lWRSI7Ci0vLyAgICB9Ci0vLwotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJ0b3RhbERpZ2l0cyIpKQotLy8gICAgewotLy8gICAgICBrZXkgPSAiX1VJX1RPT0xUSVBfVE9UQUxfRElHSVRTIjsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKGZhY2V0LmVxdWFscygiZnJhY3Rpb25EaWdpdHMiKSkKLS8vICAgIHsKLS8vICAgICAga2V5ID0gIl9VSV9UT09MVElQX0ZSQUNUSU9OX0RJR0lUUyI7Ci0vLyAgICB9Ci0vLwotLy8gICAgZWxzZSBpZiAoZmFjZXQuZXF1YWxzKCJ3aGl0ZVNwYWNlIikpCi0vLyAgICB7Ci0vLyAgICAgIGtleSA9ICJfVUlfVE9PTFRJUF9XSElURV9TUEFDRSI7Ci0vLyAgICB9Ci0vLwotLy8gICAgcmV0dXJuIChrZXkgIT0gbnVsbCkgPyBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKGtleSkgOiAiIjsKLS8vICB9Ci0vLwotLy8gIC8qKgotLy8gICAqIFRoaXMgbGlzdGVuZXIgZGV0ZWN0cyB3aGljaCByb3cgaXMgc2VsZWN0ZWQgYW5kIGFkZCBhIHRvb2wgdGlwIGZvciB0aGF0IHJvdwotLy8gICAqLwotLy8gIHB1YmxpYyBjbGFzcyBNeU1vdXNlVHJhY2tMaXN0ZW5lciBleHRlbmRzIE1vdXNlVHJhY2tBZGFwdGVyCi0vLyAgewotLy8gICAgcHVibGljIHZvaWQgbW91c2VIb3ZlcihNb3VzZUV2ZW50IGUpCi0vLyAgICB7Ci0vLyAgICAgIFRhYmxlSXRlbSBpdGVtID0gZ2V0VGFibGUoKS5nZXRJdGVtKG5ldyBQb2ludChlLngsIGUueSkpOwotLy8gICAgICBpZiAoaXRlbSAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgICAgT2JqZWN0IG8gPSBpdGVtLmdldERhdGEoKTsKLS8vICAgICAgICBpZiAobyAhPSBudWxsKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIFN0cmluZyBmYWNldE5hbWUgPSAoU3RyaW5nKSBvOwotLy8gICAgICAgICAgZ2V0VGFibGUoKS5zZXRUb29sVGlwVGV4dChnZXRUb29sVGlwKGZhY2V0TmFtZSkpOwotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8gICAgfQotLy8gIH0KLS8vCi0vLyAgLyoqCi0vLyAgICogQmFzZWQgb24gdGhlIHNlbGVjdGlvbiwgZGV0ZWN0cyBpZiBpdCBpcyBhIHdoaXRlIHNwYWNlIG9yIG5vdCwgYW5kIGFkZCB0aGUKLS8vICAgKiBjb3JyZXNwb25kaW5nIGNlbGwgZWRpdG9ycwotLy8gICAqLwotLy8gIHB1YmxpYyBjbGFzcyBTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0vLyAgewotLy8gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0vLyAgICB7Ci0vLyAgICAgIE9iamVjdCBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLS8vICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0vLyAgICAgIHsKLS8vICAgICAgICBPYmplY3QgbyA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLS8vICAgICAgICBpZiAobyAhPSBudWxsKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIFN0cmluZyBmYWNldCA9IChTdHJpbmcpIG87Ci0vLyAgICAgICAgICBpZiAoZmFjZXQuZXF1YWxzKCJ3aGl0ZVNwYWNlIikpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIHNldENlbGxFZGl0b3JzKGFsdENlbGxFZGl0b3JzKTsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgIGVsc2UKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgc2V0Q2VsbEVkaXRvcnMoY2VsbEVkaXRvcnMpOwotLy8gICAgICAgICAgfQotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8gICAgfQotLy8gIH0KLS8vCi0vLyAgY2xhc3MgRmFjZXRzVGFibGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotLy8gIHsKLS8vICAgIHByb3RlY3RlZCBTdHJpbmcgZmFjZXQ7Ci0vLwotLy8gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotLy8gICAgewotLy8gICAgfQotLy8KLS8vICAgIHB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCBpbnB1dEVsZW1lbnQpCi0vLyAgICB7Ci0vLyAgICAgIExpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLS8vICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gaW5wdXRYU0RTaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpbnB1dEVsZW1lbnQ7Ci0vLyAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGJhc2UgPSBpbnB1dFhTRFNpbXBsZVR5cGUuZ2V0UHJpbWl0aXZlVHlwZURlZmluaXRpb24oKTsKLS8vCi0vLyAgICAgIGlmIChiYXNlICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICBJdGVyYXRvciB2YWxpZEZhY2V0cyA9IGlucHV0WFNEU2ltcGxlVHlwZS5nZXRWYWxpZEZhY2V0cygpLml0ZXJhdG9yKCk7Ci0vLyAgICAgICAgd2hpbGUgKHZhbGlkRmFjZXRzLmhhc05leHQoKSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBTdHJpbmcgYVZhbGlkRmFjZXQgPSAoU3RyaW5nKSB2YWxpZEZhY2V0cy5uZXh0KCk7Ci0vLyAgICAgICAgICBpZiAoIShhVmFsaWRGYWNldC5lcXVhbHMoInBhdHRlcm4iKSB8fCBhVmFsaWRGYWNldC5lcXVhbHMoImVudW1lcmF0aW9uIikpKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICB2LmFkZChhVmFsaWRGYWNldCk7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICAgIHJldHVybiB2LnRvQXJyYXkoKTsKLS8vICAgIH0KLS8vCi0vLyAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLS8vICAgIHsKLS8vICAgIH0KLS8vICB9Ci0vLwotLy8gIGNsYXNzIEZhY2V0c1RhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyCi0vLyAgewotLy8gICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0vLyAgICB7Ci0vLyAgICAgIHJldHVybiBudWxsOwotLy8gICAgfQotLy8KLS8vICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotLy8gICAgewotLy8gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFN0cmluZykKLS8vICAgICAgewotLy8gICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7Ci0vLyAgICAgICAgWFNEQ29uc3RyYWluaW5nRmFjZXQgdGFyZ2V0RmFjZXQgPSBnZXRYU0RDb25zdHJhaW5pbmdGYWNldCgoU3RyaW5nKSBlbGVtZW50KTsKLS8vICAgICAgICBzd2l0Y2ggKGNvbHVtbkluZGV4KQotLy8gICAgICAgIHsKLS8vICAgICAgICBjYXNlIDA6Ci0vLyAgICAgICAgewotLy8gICAgICAgICAgdmFsdWUgPSAoU3RyaW5nKSBlbGVtZW50OwotLy8gICAgICAgICAgYnJlYWs7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGNhc2UgMToKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBpZiAodGFyZ2V0RmFjZXQgPT0gbnVsbCkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgdmFsdWUgPSAiIjsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgIGVsc2UKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgdmFsdWUgPSB0YXJnZXRGYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLS8vICAgICAgICAgIH0KLS8vCi0vLyAgICAgICAgICBicmVhazsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgY2FzZSAyOgotLy8gICAgICAgIHsKLS8vICAgICAgICAgIGlmICh0YXJnZXRGYWNldCA9PSBudWxsKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICB2YWx1ZSA9ICIiOwotLy8gICAgICAgICAgfQotLy8gICAgICAgICAgZWxzZQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICBFbGVtZW50IGVsZW0gPSB0YXJnZXRGYWNldC5nZXRFbGVtZW50KCk7Ci0vLyAgICAgICAgICAgIHZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZJWEVEX0FUVFJJQlVURSk7Ci0vLyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotLy8gICAgICAgICAgICAgIHZhbHVlID0gIiI7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICAgIH0KLS8vICAgICAgICByZXR1cm4gdmFsdWU7Ci0vLyAgICAgIH0KLS8vICAgICAgcmV0dXJuICIiOwotLy8gICAgfQotLy8gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvSURvY3VtZW50Q2hhbmdlZE5vdGlmaWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL0lEb2N1bWVudENoYW5nZWROb3RpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzJlNjMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvSURvY3VtZW50Q2hhbmdlZE5vdGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURvY3VtZW50Q2hhbmdlZE5vdGlmaWVyCi17Ci0gIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb2RlQWRhcHRlciBhZGFwdGVyKTsKLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vZGVBZGFwdGVyIGFkYXB0ZXIpOyAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL011bHRpcGxpY2l0eVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvTXVsdGlwbGljaXR5U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDU5M2Q0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvTXVsdGlwbGljaXR5U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlTWF4T2NjdXJzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVNaW5PY2N1cnNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBNdWx0aXBsaWNpdHlTZWN0aW9uIGV4dGVuZHMgUmVmYWN0b3JpbmdTZWN0aW9uCi17Ci0gIHByb3RlY3RlZCBDQ29tYm8gbWluQ29tYm8sIG1heENvbWJvOwotCi0gIHB1YmxpYyBNdWx0aXBsaWNpdHlTZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gIH0KLQotICAKLSAgcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIGlmIChldmVudC53aWRnZXQgPT0gbWluQ29tYm8pCi0gICAgewotICAgICAgdXBkYXRlTWluQXR0cmlidXRlKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBtYXhDb21ibykKLSAgICB7Ci0gICAgICB1cGRhdGVNYXhBdHRyaWJ1dGUoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gbWluQ29tYm8pCi0gICAgewotICAgICAgdXBkYXRlTWluQXR0cmlidXRlKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IG1heENvbWJvKQotICAgIHsKLSAgICAgIHVwZGF0ZU1heEF0dHJpYnV0ZSgpOwotICAgIH0KLSAgICBzdXBlci5kb1dpZGdldFNlbGVjdGVkKGUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlTWF4QXR0cmlidXRlKCkKLSAgewotICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IG51bGw7Ci0KLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZUNvbnRlbnQpCi0gICAgewotICAgICAgcGFydGljbGUgPSBnZXRBc3NvY2lhdGVkUGFydGljbGUoKFhTRFBhcnRpY2xlQ29udGVudCkgaW5wdXQpOwotICAgIH0KLSAgICBpZiAocGFydGljbGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbmV3VmFsdWUgPSBtYXhDb21iby5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgCi0gICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgcGFydGljbGUudW5zZXRNYXhPY2N1cnMoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGludCBuZXdNYXggPSAxOwotICAgICAgICBpZiAobmV3VmFsdWUuZXF1YWxzKCJ1bmJvdW5kZWQiKSB8fCBuZXdWYWx1ZS5lcXVhbHMoIioiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdNYXggPSBYU0RQYXJ0aWNsZS5VTkJPVU5ERUQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuZXdNYXggPSBJbnRlZ2VyLnBhcnNlSW50KG5ld1ZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgVXBkYXRlTWF4T2NjdXJzQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZU1heE9jY3Vyc0NvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9DSEFOR0VfTUFYSU1VTV9PQ0NVUlJFTkNFLCBwYXJ0aWNsZSwgbmV3TWF4KTsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCi0gICAgICB9Ci0gICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5fVUlfRVJST1JfSU5WQUxJRF9WQUxVRV9GT1JfTUFYSU1VTV9PQ0NVUlJFTkNFKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNaW5BdHRyaWJ1dGUoKQotICB7Ci0gICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gbnVsbDsKLQotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlQ29udGVudCkKLSAgICB7Ci0gICAgICBwYXJ0aWNsZSA9IGdldEFzc29jaWF0ZWRQYXJ0aWNsZSgoWFNEUGFydGljbGVDb250ZW50KSBpbnB1dCk7Ci0gICAgfQotICAgIGlmIChwYXJ0aWNsZSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IG1pbkNvbWJvLmdldFRleHQoKTsKLSAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA9PSAwKQotICAgICAgewotICAgICAgICBwYXJ0aWNsZS51bnNldE1pbk9jY3VycygpOwotICAgICAgfQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGludCBuZXdNaW4gPSAxOwotICAgICAgICBpZiAobmV3VmFsdWUuZXF1YWxzKCJ1bmJvdW5kZWQiKSB8fCBuZXdWYWx1ZS5lcXVhbHMoIioiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdNaW4gPSBYU0RQYXJ0aWNsZS5VTkJPVU5ERUQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmV3TWluID0gSW50ZWdlci5wYXJzZUludChuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgVXBkYXRlTWluT2NjdXJzQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZU1pbk9jY3Vyc0NvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9DSEFOR0VfTUlOSU1VTV9PQ0NVUlJFTkNFLCBwYXJ0aWNsZSwgbmV3TWluKTsKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICAgIHsKLQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaE1pbk1heCgpCi0gIHsKLSAgICBib29sZWFuIHJlZnJlc2hNaW5UZXh0ID0gdHJ1ZTsKLSAgICBib29sZWFuIHJlZnJlc2hNYXhUZXh0ID0gdHJ1ZTsKLSAgICBpZiAobWluQ29tYm8uaXNGb2N1c0NvbnRyb2woKSkKLSAgICB7Ci0gICAgICByZWZyZXNoTWluVGV4dCA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAobWF4Q29tYm8uaXNGb2N1c0NvbnRyb2woKSkKLSAgICB7Ci0gICAgICByZWZyZXNoTWF4VGV4dCA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAocmVmcmVzaE1pblRleHQpCi0gICAgewotICAgICAgbWluQ29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgaWYgKHJlZnJlc2hNYXhUZXh0KQotICAgIHsKLSAgICAgIG1heENvbWJvLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEUGFydGljbGVDb250ZW50KQotICAgICAgewotICAgICAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IGdldEFzc29jaWF0ZWRQYXJ0aWNsZSgoWFNEUGFydGljbGVDb250ZW50KSBpbnB1dCk7Ci0gICAgICAgIGlmIChwYXJ0aWNsZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gbWluVGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKHBhcnRpY2xlLmdldE1pbk9jY3VycygpKSk7Ci0gICAgICAgICAgLy8gbWF4VGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKHBhcnRpY2xlLmdldE1heE9jY3VycygpKSk7Ci0gICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gcGFydGljbGUuZ2V0RWxlbWVudCgpOwotICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG1pbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5NSU5PQ0NVUlNfQVRUUklCVVRFKTsKLSAgICAgICAgICAgIFN0cmluZyBtYXggPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTUFYT0NDVVJTX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICBpZiAobWluICE9IG51bGwgJiYgcmVmcmVzaE1pblRleHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1pbkNvbWJvLnNldFRleHQobWluKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtYXggIT0gbnVsbCAmJiByZWZyZXNoTWF4VGV4dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWF4Q29tYm8uc2V0VGV4dChtYXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBYU0RQYXJ0aWNsZSBnZXRBc3NvY2lhdGVkUGFydGljbGUoWFNEUGFydGljbGVDb250ZW50IHBhcnRpY2xlQ29udGVudCkKLSAgewotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IHhzZENvbXAgPSBwYXJ0aWNsZUNvbnRlbnQuZ2V0Q29udGFpbmVyKCk7Ci0gICAgaWYgKHhzZENvbXAgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICB7Ci0gICAgICByZXR1cm4gKFhTRFBhcnRpY2xlKSB4c2RDb21wOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBpZiAobWluQ29tYm8gIT0gbnVsbCAmJiAhbWluQ29tYm8uaXNEaXNwb3NlZCgpKQotICAgICAgcmVtb3ZlTGlzdGVuZXJzKG1pbkNvbWJvKTsKLSAgICBpZiAobWF4Q29tYm8gIT0gbnVsbCAmJiAhbWF4Q29tYm8uaXNEaXNwb3NlZCgpKQotICAgICAgcmVtb3ZlTGlzdGVuZXJzKG1heENvbWJvKTsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9SZWZhY3RvcmluZ1NlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvUmVmYWN0b3JpbmdTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOTE1YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9SZWZhY3RvcmluZ1NlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLklIeXBlcmxpbmtMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkltYWdlSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuSVNlbGVjdGlvbk1hcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zLlJlbmFtZUNvbXBvbmVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVmYWN0b3JpbmdTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIGltcGxlbWVudHMgSUh5cGVybGlua0xpc3RlbmVyCi17Ci0gIC8qKgotICAgKiBDbGlja2luZyBvbiBpdCBpbnZva2VzIHRoZSByZWZhY3Rvci0+cmVuYW1lIGFjdGlvbi4KLSAgICovCi0gIHByaXZhdGUgSW1hZ2VIeXBlcmxpbmsgcmVuYW1lSHlwZXJsaW5rOwotCi0gIC8qKgotICAgKiBJbnZva2VzIHRoZSByZWZhY3Rvci0+cmVuYW1lIGFjdGlvbiBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW52b2tlUmVuYW1lUmVmYWN0b3JpbmcoKQotICB7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpIGVkaXRvci5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcyk7Ci0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBlZGl0b3IuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgSVNlbGVjdGlvbk1hcHBlciBtYXBwZXIgPSAoSVNlbGVjdGlvbk1hcHBlcikgZWRpdG9yLmdldEFkYXB0ZXIoSVNlbGVjdGlvbk1hcHBlci5jbGFzcyk7Ci0gICAgc2VsZWN0aW9uID0gbWFwcGVyICE9IG51bGwgPyBtYXBwZXIubWFwU2VsZWN0aW9uKHNlbGVjdGlvbikgOiBzZWxlY3Rpb247Ci0gICAgUmVuYW1lQ29tcG9uZW50QWN0aW9uIGFjdGlvbiA9IG5ldyBSZW5hbWVDb21wb25lbnRBY3Rpb24oc2VsZWN0aW9uLCBzY2hlbWEpOwotICAgIGFjdGlvbi51cGRhdGUoc2VsZWN0aW9uKTsKLSAgICBhY3Rpb24ucnVuKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyB0aGUgcmVmYWN0b3IvcmVuYW1lIGh5cGVybGluayBzaG93biBiZXNpZGUgYSBjb21wb25lbnQgbmFtZS4KLSAgICogQ2xpY2tpbmcgb24gdGhlIGh5cGVybGluayBpbnZva2VzIHRoZSByZWZhY3Rvci9yZW5hbWUgYWN0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudAotICAgKiAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZS4gTXVzdCBub3QgYmUgbnVsbC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlbmFtZUh5cGVybGluayhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgcmVuYW1lSHlwZXJsaW5rID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUltYWdlSHlwZXJsaW5rKHBhcmVudCwgU1dULk5PTkUpOwotCi0gICAgcmVuYW1lSHlwZXJsaW5rLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvcXVpY2thc3Npc3QuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgcmVuYW1lSHlwZXJsaW5rLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLl9VSV9UT09MVElQX1JFTkFNRV9SRUZBQ1RPUik7Ci0gICAgcmVuYW1lSHlwZXJsaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKHRoaXMpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzZXRSZW5hbWVIeXBlcmxpbmtFbmFibGVkKGJvb2xlYW4gaXNFbmFibGVkKQotICB7Ci0gICAgcmVuYW1lSHlwZXJsaW5rLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLklIeXBlcmxpbmtMaXN0ZW5lciNsaW5rQWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkKLSAgewotICAgIGludm9rZVJlbmFtZVJlZmFjdG9yaW5nKCk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5JSHlwZXJsaW5rTGlzdGVuZXIjbGlua0VudGVyZWQob3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgbGlua0VudGVyZWQoSHlwZXJsaW5rRXZlbnQgZSkKLSAgewotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSUh5cGVybGlua0xpc3RlbmVyI2xpbmtFeGl0ZWQob3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgbGlua0V4aXRlZChIeXBlcmxpbmtFdmVudCBlKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvU2NoZW1hTG9jYXRpb25TZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1NjaGVtYUxvY2F0aW9uU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjA1OGI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvU2NoZW1hTG9jYXRpb25TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzLlJlc291cmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpemFyZHMuWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREluY2x1ZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNESW5jbHVkZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEUmVkZWZpbmVJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFMb2NhdGlvblNlY3Rpb24gZXh0ZW5kcyBDb21tb25EaXJlY3RpdmVzU2VjdGlvbgotewotCSAgSVdvcmtiZW5jaFBhcnQgcGFydDsKLQkgIAotCSAgLyoqCi0JICAgKiAKLQkgICAqLwotCSAgcHVibGljIFNjaGVtYUxvY2F0aW9uU2VjdGlvbigpCi0JICB7Ci0JICAgIHN1cGVyKCk7Ci0JICB9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotCQl7Ci0JCQljb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgCi0gICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0KLQkJCS8vIENyZWF0ZSBTY2hlbWEgTG9jYXRpb24gTGFiZWwKLQkJCUNMYWJlbCBzY2hlbWFMb2NhdGlvbkxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9TQ0hFTUFfTE9DQVRJT04iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgICBzY2hlbWFMb2NhdGlvbkxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkKLSAgICAgIC8vIENyZWF0ZSBTY2hlbWEgTG9jYXRpb24gVGV4dAotICAgICAgc2NoZW1hTG9jYXRpb25UZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0gICAgICBzY2hlbWFMb2NhdGlvblRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0gICAgICBhcHBseUFsbExpc3RlbmVycyhzY2hlbWFMb2NhdGlvblRleHQpOyAgICAgICAKLQotICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBzY2hlbWFMb2NhdGlvblRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgIAotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzY2hlbWFMb2NhdGlvblRleHQsCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fSU5DTFVERV9SRURFRklORV9fU0NIRU1BTE9DQVRJT04pOwotICAgICAgCi0JCQkvLyBDcmVhdGUgV2l6YXJkIEJ1dHRvbgotCQkJd2l6YXJkQnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHdpemFyZEJ1dHRvbi5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL2Jyb3dzZWJ1dHRvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCQl3aXphcmRCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCXdpemFyZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJCQotICAgICAgLy8gZXJyb3IgdGV4dAotICAgICAgZXJyb3JUZXh0ID0gbmV3IFN0eWxlZFRleHQoY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgICBlcnJvclRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgICAgZXJyb3JUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgZXJyb3JUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAKLSAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgICBkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBlcnJvclRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICAgIHsKLQkJCWlmIChldmVudC53aWRnZXQgPT0gd2l6YXJkQnV0dG9uKQotICAgICAgewotCQkJCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQotCQkJCUlGaWxlIGN1cnJlbnRJRmlsZSA9IG51bGw7Ci0gICAgICAgIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgIFZpZXdlckZpbHRlciBmaWx0ZXI7Ci0gICAgICAgIGlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpCi0gICAgICAgIHsKLSAgICAgICAgICBjdXJyZW50SUZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpZWRpdG9ySW5wdXQpLmdldEZpbGUoKTsKLSAgICAgICAgICBmaWx0ZXIgPSBuZXcgUmVzb3VyY2VGaWx0ZXIobmV3IFN0cmluZ1tdIHsgIi54c2QiIH0sIC8vJE5PTi1OTFMtMSQgCi0gICAgICAgICAgICAgIG5ldyBJRmlsZVtdIHsgY3VycmVudElGaWxlIH0sIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGZpbHRlciA9IG5ldyBSZXNvdXJjZUZpbHRlcihuZXcgU3RyaW5nW10geyAiLnhzZCIgfSwgLy8kTk9OLU5MUy0xJCAKLSAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLQkJCSAgICAgIAotCQkJICBYU0RTZWxlY3RJbmNsdWRlRmlsZVdpemFyZCBmaWxlU2VsZWN0V2l6YXJkID0gCi0JCQkgICAgICBuZXcgWFNEU2VsZWN0SW5jbHVkZUZpbGVXaXphcmQoeHNkU2NoZW1hLCB0cnVlLAotCQkJICAgICAgICAgIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9GSUxFRElBTE9HX1NFTEVDVF9YTUxfU0NIRU1BIiksIC8vJE5PTi1OTFMtMSQKLQkJCSAgICAgICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfRklMRURJQUxPR19TRUxFQ1RfWE1MX0RFU0MiKSwgLy8kTk9OLU5MUy0xJAotCQkJICAgICAgICAgIGZpbHRlciwKLQkJCSAgICAgICAgICAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpKTsKLQotCQkJICBXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgZmlsZVNlbGVjdFdpemFyZCk7Ci0JCQkgIHdpemFyZERpYWxvZy5jcmVhdGUoKTsKLQkJCSAgd2l6YXJkRGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJICBpbnQgcmVzdWx0ID0gd2l6YXJkRGlhbG9nLm9wZW4oKTsKLQkJCQkgIAotCSAgICAgIFN0cmluZyB2YWx1ZSA9IHNjaGVtYUxvY2F0aW9uVGV4dC5nZXRUZXh0KCk7Ci0JICAgICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spCi0JICAgICAgewotICAgICAgICAgIGVycm9yVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgSUZpbGUgc2VsZWN0ZWRJRmlsZSA9IGZpbGVTZWxlY3RXaXphcmQuZ2V0UmVzdWx0RmlsZSgpOwotCSAgICAgICAgU3RyaW5nIHNjaGVtYUZpbGVTdHJpbmcgPSB2YWx1ZTsKLQkgICAgICAgIGlmIChzZWxlY3RlZElGaWxlICE9IG51bGwgJiYgY3VycmVudElGaWxlICE9IG51bGwpCi0JICAgICAgICB7Ci0JICAgICAgICAgIHNjaGVtYUZpbGVTdHJpbmcgPSBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkoc2VsZWN0ZWRJRmlsZS5nZXRMb2NhdGlvbigpLCBjdXJyZW50SUZpbGUuZ2V0TG9jYXRpb24oKSk7Ci0JICAgICAgICB9Ci0JICAgICAgICBlbHNlIGlmIChzZWxlY3RlZElGaWxlICE9IG51bGwgJiYgY3VycmVudElGaWxlID09IG51bGwpCi0JICAgICAgICB7Ci0JICAgICAgICAgIHNjaGVtYUZpbGVTdHJpbmcgPSBzZWxlY3RlZElGaWxlLmdldExvY2F0aW9uVVJJKCkudG9TdHJpbmcoKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGVsc2UKLQkgICAgICAgIHsKLQkgICAgICAgICAgc2NoZW1hRmlsZVN0cmluZyA9IGZpbGVTZWxlY3RXaXphcmQuZ2V0VVJMKCk7Ci0JICAgICAgICB9Ci0KLSAgICAgICAgICBoYW5kbGVTY2hlbWFMb2NhdGlvbkNoYW5nZShzY2hlbWFGaWxlU3RyaW5nLCBmaWxlU2VsZWN0V2l6YXJkLmdldE5hbWVzcGFjZSgpLCBudWxsKTsKLQkgICAgICAgIHJlZnJlc2goKTsKLQkJCSAgfSAKLSAgICAgIH0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlZnJlc2goKQotCQl7Ci0JCQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQotCQkJCUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgWFNESW5jbHVkZSkKLSAgICAgICAgeyAKLQkJCQkJZWxlbWVudCA9ICgoWFNESW5jbHVkZUltcGwpIGlucHV0KS5nZXRFbGVtZW50KCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpCi0gICAgICAgIHsKLQkJCQkJZWxlbWVudCA9ICgoWFNEUmVkZWZpbmVJbXBsKSBpbnB1dCkuZ2V0RWxlbWVudCgpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0JCQkJCVN0cmluZyBsb2NhdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCWxvY2F0aW9uID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInNjaGVtYUxvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsb2NhdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotCQkJCQlzY2hlbWFMb2NhdGlvblRleHQuc2V0VGV4dChsb2NhdGlvbik7Ci0JCQkJfQotCi0gICAgICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQkJfQotCi0JICAvKiAobm9uLUphdmFkb2MpCi0JICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNzaG91bGRVc2VFeHRyYVNwYWNlKCkKLQkgICAqLwotCSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0JICB7Ci0JICAgIHJldHVybiB0cnVlOwotCSAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVNjaGVtYUxvY2F0aW9uQ2hhbmdlKFN0cmluZyBzY2hlbWFGaWxlU3RyaW5nLCBTdHJpbmcgbmFtZXNwYWNlLCBYU0RTY2hlbWEgZXh0ZXJuYWxTY2hlbWEpCi0gICAgewotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNESW5jbHVkZSkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChYU0RJbmNsdWRlSW1wbCkgaW5wdXQpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInNjaGVtYUxvY2F0aW9uIiwgc2NoZW1hRmlsZVN0cmluZyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEUmVkZWZpbmUpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9ICgoWFNEUmVkZWZpbmVJbXBsKSBpbnB1dCkuZ2V0RWxlbWVudCgpOwotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgic2NoZW1hTG9jYXRpb24iLCBzY2hlbWFGaWxlU3RyaW5nKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvU2ltcGxlQ29udGVudFVuaW9uTWVtYmVyVHlwZXNEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvU2ltcGxlQ29udGVudFVuaW9uTWVtYmVyVHlwZXNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5MGJlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1NpbXBsZUNvbnRlbnRVbmlvbk1lbWJlclR5cGVzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5UeXBlc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVmlld1V0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aWRnZXRzLlR5cGVTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29udGVudFVuaW9uTWVtYmVyVHlwZXNEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotewotICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlOwotICAvKioKLSAgICogQHBhcmFtIHBhcmVudFNoZWxsCi0gICAqLwotICBwdWJsaWMgU2ltcGxlQ29udGVudFVuaW9uTWVtYmVyVHlwZXNEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGUpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gICAgdGhpcy5zaW1wbGVUeXBlID0gc2ltcGxlVHlwZTsKLSAgfQotICAKLSAgVGFibGUgdGFibGU7Ci0gIFR5cGVTZWN0aW9uIHR5cGVTZWN0aW9uOwotICBCdXR0b24gYWRkQnV0dG9uLCByZW1vdmVCdXR0b247Ci0gIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QgbWVtYmVyVHlwZXNMaXN0OwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgcmVzdWx0OwotCi0gIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKQotICB7Ci0gICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpCi0gIHsKLSAgICBpZiAoYnV0dG9uSWQgPT0gV2luZG93Lk9LKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIGludCBsZW5ndGggPSBtZW1iZXJUeXBlc0xpc3QuZ2V0SXRlbUNvdW50KCk7Ci0gICAgICBmb3IgKGludCBpPTAgOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHNiLmFwcGVuZChtZW1iZXJUeXBlc0xpc3QuZ2V0SXRlbShpKSk7Ci0gICAgICAgIGlmIChpIDwgbGVuZ3RoIC0gMSkKLSAgICAgICAgewotICAgICAgICAgIHNiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJlc3VsdCA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIHN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZXN1bHQoKSB7IHJldHVybiByZXN1bHQ7IH0KLQotICAvLwotICAvLyBDcmVhdGUgdGhlIGNvbnRyb2xzCi0gIC8vCi0gIHB1YmxpYyBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBjbGllbnQgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICBnZXRTaGVsbCgpLnNldFRleHQoIlVuaW9uICIgKyBYU0RDb25zdGFudHMuTUVNQkVSVFlQRVNfQVRUUklCVVRFKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBMYWJlbCBpbnN0cnVjdGlvbnMgPSBuZXcgTGFiZWwoY2xpZW50LCBTV1QuTEVGVCB8IFNXVC5XUkFQKTsKLSAgICBpbnN0cnVjdGlvbnMuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfU0VMRUNUX01FTUJFUlRZUEVTIikpOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgQ29tcG9zaXRlIGNvbHVtbnNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNsaWVudCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgY2NHTCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgY2NHTC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotICAgIGNjR0wuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotICAgIGNjR0wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBjY0dMLm1hcmdpbldpZHRoID0gMDsKLSAgICBjY0dMLm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0gICAgY2NHTC5udW1Db2x1bW5zID0gMzsKLSAgICBjb2x1bW5zQ29tcG9zaXRlLnNldExheW91dChjY0dMKTsKLSAgICAKLSAgICBHcmlkRGF0YSBjY0dEID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgY2NHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBjY0dELmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGNvbHVtbnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShjY0dEKTsgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdHlwZVNlY3Rpb24gPSBuZXcgVHlwZVNlY3Rpb24oY29sdW1uc0NvbXBvc2l0ZSk7Ci0gICAgdHlwZVNlY3Rpb24uc2V0U2hvd1VzZXJDb21wbGV4VHlwZShmYWxzZSk7Ci0KLSAgICB0eXBlU2VjdGlvbi5jcmVhdGVDbGllbnQoY29sdW1uc0NvbXBvc2l0ZSk7Ci0gICAgdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIHR5cGVTZWN0aW9uLmdldFVzZXJTaW1wbGVUeXBlKCkuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgVmlld1V0aWxpdHkuY3JlYXRlSG9yaXpvbnRhbEZpbGxlcihjb2x1bW5zQ29tcG9zaXRlLCAxKTsKLSAgICAKLSAgICBMYWJlbCBtZW1iZXJMaXN0TGFiZWwgPSBuZXcgTGFiZWwoY29sdW1uc0NvbXBvc2l0ZSwgU1dULkxFRlQpOwotICAgIG1lbWJlckxpc3RMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9NRU1CRVJUWVBFU19WQUxVRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIENvbXBvc2l0ZSBkYXRhQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjbGllbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGRjR0wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGRjR0wudmVydGljYWxTcGFjaW5nID0gMDsKLSAgICBkY0dMLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgZGNHTC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgZGNHTC5udW1Db2x1bW5zID0gMzsKLSAgICBkYXRhQ29tcG9zaXRlLnNldExheW91dChkY0dMKTsKLSAgICAKLSAgICBHcmlkRGF0YSBkY0dEID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGNHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkY0dELmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhQ29tcG9zaXRlLnNldExheW91dERhdGEoZGNHRCk7Ci0gICAgCi0gICAgdGFibGUgPSBuZXcgVGFibGUoZGF0YUNvbXBvc2l0ZSwKLSAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOyAKLSAgICB0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLSAgICB0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgR3JpZERhdGEgZ2QyID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QyLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGdkMi5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZ2QyLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdkMi52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2QyLmhlaWdodEhpbnQgPSAyMDA7Ci0gICAgZ2QyLndpZHRoSGludCA9IDIwMDsKLSAgICB0YWJsZS5zZXRMYXlvdXREYXRhKGdkMik7Ci0KLSAgICAvLyBGaWxsIHRhYmxlCi0gICAgaGFuZGxlU2V0SW5wdXQoKTsKLSAgICB0YWJsZS5nZXRJdGVtQ291bnQoKTsKLQotICAgIFRhYmxlQ29sdW1uIHRjID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0gICAgdGMuc2V0V2lkdGgoMjAwKTsKLSAgICB0Yy5zZXRSZXNpemFibGUodHJ1ZSk7Ci0gICAgCi0gICAgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGF0YUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgYmNHTCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgYmNHTC5udW1Db2x1bW5zID0gMTsKLSAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGJjR0wpOwotICAgIGFkZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgYWRkQnV0dG9uLnNldFRleHQoIj4iKTsgLy8kTk9OLU5MUy0xJAotICAgIGFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICByZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgIHJlbW92ZUJ1dHRvbi5zZXRUZXh0KCI8Iik7IC8vJE5PTi1OTFMtMSQKLSAgICByZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgQ29tcG9zaXRlIGxpc3RDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRhdGFDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IG10R0wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIG10R0wubnVtQ29sdW1ucyA9IDE7Ci0gICAgbXRHTC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIG10R0wubWFyZ2luV2lkdGggPSAwOwotICAgIG10R0wuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotICAgIG10R0wudmVydGljYWxTcGFjaW5nID0gMDsKLSAgICBsaXN0Q29tcG9zaXRlLnNldExheW91dChtdEdMKTsKLQotICAgIEdyaWREYXRhIG10R0QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBtdEdELmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIG10R0QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIG10R0QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIG10R0QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgbGlzdENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG10R0QpOwotICAgIAotICAgIG1lbWJlclR5cGVzTGlzdCA9IG5ldyBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0KGxpc3RDb21wb3NpdGUsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotICAgIEdyaWREYXRhIG10bEdEID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgbXRsR0QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgbXRsR0QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIG10bEdELnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBtdGxHRC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBtdGxHRC5oZWlnaHRIaW50ID0gMjAwOwotICAgIG10bEdELndpZHRoSGludCA9IDIwMDsKLSAgICBtZW1iZXJUeXBlc0xpc3Quc2V0TGF5b3V0RGF0YShtdGxHRCk7Ci0gICAgCi0gICAgaW5pdGlhbGl6ZU1lbWJlckxpc3RDb250ZW50KCk7Ci0gICAgcmV0dXJuIGNsaWVudDsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbml0aWFsaXplTWVtYmVyTGlzdENvbnRlbnQoKQotICB7Ci0vLyAgICBTdHJpbmcgcmVzdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk1FTUJFUlRZUEVTX0FUVFJJQlVURSk7Ci0vLyAgICBpZiAocmVzdWx0ID09IG51bGwpCi0vLyAgICB7Ci0vLyAgICAgIHJldHVybjsKLS8vICAgIH0KLS8vICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbiA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocmVzdWx0KTsKLS8vICAgIHdoaWxlICh0b2tlbi5oYXNNb3JlVG9rZW5zKCkpCi0vLyAgICB7Ci0vLyAgICAgIG1lbWJlclR5cGVzTGlzdC5hZGQodG9rZW4ubmV4dFRva2VuKCkpOwotLy8gICAgfQotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBzaW1wbGVUeXBlLmdldFNjaGVtYSgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHNpbXBsZVR5cGUuZ2V0TWVtYmVyVHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBTdHJpbmcgbmFtZSA9ICgoWFNEU2ltcGxlVHlwZURlZmluaXRpb24paS5uZXh0KCkpLmdldFFOYW1lKHNjaGVtYSk7Ci0gICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgbWVtYmVyVHlwZXNMaXN0LmFkZChuYW1lKTsKLSAgICB9Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSB0eXBlU2VjdGlvbi5nZXRTaW1wbGVUeXBlKCkgJiYgdHlwZVNlY3Rpb24uZ2V0U2ltcGxlVHlwZSgpLmdldFNlbGVjdGlvbigpKQotICAgICB7Ci0gICAgICBwb3B1bGF0ZUJ1aWx0SW5UeXBlKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHR5cGVTZWN0aW9uLmdldFVzZXJTaW1wbGVUeXBlKCkgJiYgdHlwZVNlY3Rpb24uZ2V0VXNlclNpbXBsZVR5cGUoKS5nZXRTZWxlY3Rpb24oKSkKLSAgICAgewotICAgICAgcG9wdWxhdGVVc2VyU2ltcGxlVHlwZShmYWxzZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGFkZEJ1dHRvbikKLSAgICB7Ci0gICAgICBUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldEl0ZW1zKCk7Ci0gICAgICBpbnQgc2VsZWN0aW9uID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgIGlmIChpdGVtcyAhPSBudWxsICYmIGl0ZW1zLmxlbmd0aCA+IDAgJiYgc2VsZWN0aW9uID49IDApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0eXBlVG9BZGQgPSBpdGVtc1tzZWxlY3Rpb25dLmdldERhdGEoKS50b1N0cmluZygpOwotICAgICAgICBpZiAobWVtYmVyVHlwZXNMaXN0LmluZGV4T2YodHlwZVRvQWRkKSA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICBtZW1iZXJUeXBlc0xpc3QuYWRkKGl0ZW1zW3NlbGVjdGlvbl0uZ2V0RGF0YSgpLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHJlbW92ZUJ1dHRvbikKLSAgICB7Ci0gICAgICBTdHJpbmdbXSB0eXBlc1RvUmVtb3ZlID0gbWVtYmVyVHlwZXNMaXN0LmdldFNlbGVjdGlvbigpOwotICAgICAgZm9yIChpbnQgaT0wOyBpIDwgdHlwZXNUb1JlbW92ZS5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgbWVtYmVyVHlwZXNMaXN0LnJlbW92ZSh0eXBlc1RvUmVtb3ZlW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVNldElucHV0KCkKLSAgewotICAgIHBvcHVsYXRlQnVpbHRJblR5cGUoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcG9wdWxhdGVCdWlsdEluVHlwZSgpCi0gIHsKLSAgICB0YWJsZS5yZW1vdmVBbGwoKTsKLSAgICBMaXN0IGl0ZW1zID0gZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKQotICAgICB7Ci0gICAgICBUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLSAgICAgIGl0ZW0uc2V0VGV4dChpdGVtcy5nZXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgICBpdGVtLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEU2ltcGxlVHlwZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGl0ZW0uc2V0RGF0YShpdGVtcy5nZXQoaSkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBvcHVsYXRlVXNlclNpbXBsZVR5cGUoYm9vbGVhbiBzaG93QW5vbnltb3VzKQotICB7Ci0gICAgdGFibGUucmVtb3ZlQWxsKCk7Ci0gICAgaWYgKHNob3dBbm9ueW1vdXMpCi0gICAgIHsKLSAgICAgIFRhYmxlSXRlbSBhbm9ueW1vdXNJdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotICAgICAgYW5vbnltb3VzSXRlbS5zZXRUZXh0KCIqKmFub255bW91cyoqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGFub255bW91c0l0ZW0uc2V0RGF0YSgiKiphbm9ueW1vdXMqKiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIExpc3QgaXRlbXMgPSBnZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspCi0gICAgIHsKLSAgICAgIFRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotICAgICAgaXRlbS5zZXRUZXh0KGl0ZW1zLmdldChpKS50b1N0cmluZygpKTsKLSAgICAgIGl0ZW0uc2V0SW1hZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVUeXBlLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaXRlbS5zZXREYXRhKGl0ZW1zLmdldChpKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKQotICB7Ci0gICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKHNpbXBsZVR5cGUuZ2V0U2NoZW1hKCkpOwotICAgIHJldHVybiBoZWxwZXIuZ2V0QnVpbHRJblR5cGVOYW1lc0xpc3QoKTsKLSAgfQotCi0gIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCgpCi0gIHsKLSAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoc2ltcGxlVHlwZS5nZXRTY2hlbWEoKSk7Ci0gICAgcmV0dXJuIGhlbHBlci5nZXRVc2VyU2ltcGxlVHlwZU5hbWVzTGlzdCgpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvU3BlY2lmaWNDb25zdHJhaW50c1dpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9TcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOWJhYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9TcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuTmF2aWdhYmxlVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuQWRkRW51bWVyYXRpb25zQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5DaGFuZ2VUb0xvY2FsU2ltcGxlVHlwZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5TZXRYU0RGYWNldFZhbHVlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVYU0RQYXR0ZXJuRmFjZXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLndpZGdldHMuRW51bWVyYXRpb25zRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwud2l6YXJkcy5SZWdleFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERW51bWVyYXRpb25GYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhdHRlcm5GYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0IGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIsIExpc3RlbmVyCi17Ci0gIHB1YmxpYyBzdGF0aWMgaW50IEVOVU1FUkFUSU9OID0gMDsKLSAgcHVibGljIHN0YXRpYyBpbnQgUEFUVEVSTiA9IDE7Ci0gIAotICBpbnQga2luZDsKLSAgQ29uc3RyYWludHNUYWJsZVZpZXdlciBjb25zdHJhaW50c1RhYmxlVmlld2VyOwotICBCdXR0b24gYWRkQnV0dG9uOwotICBCdXR0b24gYWRkVXNpbmdEaWFsb2dCdXR0b247Ci0gIEJ1dHRvbiBkZWxldGVCdXR0b247Ci0gIEJ1dHRvbiBlZGl0QnV0dG9uOwotICBDb21wb3NpdGUgY29tcG9zaXRlOwotICBib29sZWFuIGlzRW5hYmxlZDsKLSAgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeTsKLSAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gaW5wdXQ7Ci0gIFhTREZlYXR1cmUgZmVhdHVyZTsKLSAgYm9vbGVhbiBpc1JlYWRPbmx5OwotICBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrOwotICBYU0RGYWNldFNlY3Rpb24gZmFjZXRTZWN0aW9uOwotCi0gIHB1YmxpYyBTcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnksIFhTREZlYXR1cmUgZmVhdHVyZSwgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gaW5wdXQsIFhTREZhY2V0U2VjdGlvbiBmYWNldFNlY3Rpb24pCi0gIHsKLSAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgICB0aGlzLmNvbXBvc2l0ZSA9IGNvbXBvc2l0ZTsKLSAgICB0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotICAgIHRoaXMuZmFjZXRTZWN0aW9uID0gZmFjZXRTZWN0aW9uOwotICAgIGNyZWF0ZUNvbnRyb2woY29tcG9zaXRlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENvbW1hbmRTdGFjayhDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKQotICB7Ci0gICAgdGhpcy5jb21tYW5kU3RhY2sgPSBjb21tYW5kU3RhY2s7IAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SXNSZWFkT25seShib29sZWFuIGlzUmVhZE9ubHkpCi0gIHsKLSAgICB0aGlzLmlzUmVhZE9ubHkgPSBpc1JlYWRPbmx5OwotICB9Ci0KLSAgcHVibGljIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGdldFdpZGdldEZhY3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIGZhY3Rvcnk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKQotICB7Ci0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGlzRW5hYmxlZCkKLSAgewotICAgIHRoaXMuaXNFbmFibGVkID0gaXNFbmFibGVkOwotICAgIGFkZEJ1dHRvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gICAgYWRkVXNpbmdEaWFsb2dCdXR0b24uc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICAgIGVkaXRCdXR0b24uc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICAgIGNvbnN0cmFpbnRzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gICAgY29tcG9zaXRlLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgfQotCi0gIHB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbXBvc2l0ZSA9IGZhY3RvcnkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0KLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgY29uc3RyYWludHNUYWJsZVZpZXdlciA9IG5ldyBDb25zdHJhaW50c1RhYmxlVmlld2VyKGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUYWJsZShjb21wb3NpdGUsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTikpOwotICAgIGNvbnN0cmFpbnRzVGFibGVWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotICAgIFRhYmxlIHRhYmxlID0gY29uc3RyYWludHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgIHRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLndpZHRoSGludCA9IDE1MDsKLSAgICBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICB0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHRhYmxlLmFkZExpc3RlbmVyKFNXVC5SZXNpemUsIHRoaXMpOwotICAgIAotICAgIENvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIEdyaWRMYXlvdXQgYnV0dG9uQ29tcG9zaXRlTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBidXR0b25Db21wb3NpdGVMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBidXR0b25Db21wb3NpdGVMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBidXR0b25Db21wb3NpdGVMYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChidXR0b25Db21wb3NpdGVMYXlvdXQpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgCi0gICAgYWRkQnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9BQ1RJT05fQURELCBTV1QuUFVTSCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotICAgIGFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICBhZGRVc2luZ0RpYWxvZ0J1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9XSVRIX0RPVFMsIFNXVC5QVVNIKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0gICAgYWRkVXNpbmdEaWFsb2dCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBhZGRVc2luZ0RpYWxvZ0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIGVkaXRCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0FDVElPTl9FRElUX1dJVEhfRE9UUywgU1dULlBVU0gpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICAKLSAgICBkZWxldGVCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0FDVElPTl9ERUxFVEUsIFNXVC5QVVNIKTsKLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGVsZXRlQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIGRlbGV0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCi0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgVGFibGUgdGFibGUgPSBjb25zdHJhaW50c1RhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0gICAgaWYgKGV2ZW50LnR5cGUgPT0gU1dULlJlc2l6ZSAmJiBldmVudC53aWRnZXQgPT0gdGFibGUpCi0gICAgewotICAgICAgVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW4oMCk7Ci0gICAgICB0YWJsZUNvbHVtbi5zZXRXaWR0aCh0YWJsZS5nZXRTaXplKCkueCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0KQotICB7Ci0gICAgY29uc3RyYWludHNUYWJsZVZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0gICAgaWYgKGlzUmVhZE9ubHkpCi0gICAgewotICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotLy8gICAgY29uc3RyYWludHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSBpbnB1dDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBzdC5nZXRFbGVtZW50KCk7Ci0KLSAgICBpZiAoZS53aWRnZXQgPT0gYWRkQnV0dG9uKQotICAgIHsKLSAgICAgIExpc3QgZW51bUxpc3QgPSBzdC5nZXRFbnVtZXJhdGlvbkZhY2V0cygpOwotICAgICAgU3RyaW5nQnVmZmVyIG5ld05hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCJ2YWx1ZTEiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaW50IHN1ZmZpeCA9IDE7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlbnVtTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFhTREVudW1lcmF0aW9uRmFjZXQgZW51bUZhY2V0ID0gKFhTREVudW1lcmF0aW9uRmFjZXQpIGkubmV4dCgpOwotICAgICAgICBTdHJpbmcgdmFsdWUgPSBlbnVtRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHZhbHVlLmVxdWFscyhuZXdOYW1lLnRvU3RyaW5nKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHN1ZmZpeCsrOwotICAgICAgICAgICAgbmV3TmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoInZhbHVlIiArIFN0cmluZy52YWx1ZU9mKHN1ZmZpeCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChraW5kID09IEVOVU1FUkFUSU9OKQotICAgICAgewotICAgICAgICBDb21wb3VuZENvbW1hbmQgY29tcG91bmRDb21tYW5kID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0YXJnZXRTaW1wbGVUeXBlID0gbnVsbDsKLSAgICAgICAgaWYgKGZlYXR1cmUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGFub255bW91c1NpbXBsZVR5cGUgPSBYU0RDb21tb25VSVV0aWxzLmdldEFub255bW91c1NpbXBsZVR5cGUoZmVhdHVyZSwgaW5wdXQpOwotICAgICAgICAgIGlmIChhbm9ueW1vdXNTaW1wbGVUeXBlID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgYW5vbnltb3VzU2ltcGxlVHlwZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICBhbm9ueW1vdXNTaW1wbGVUeXBlLnNldEJhc2VUeXBlRGVmaW5pdGlvbihpbnB1dCk7Ci0KLSAgICAgICAgICAgIENoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZCBjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQgPSBuZXcgQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ0hBTkdFX1BBVFRFUk4sIGZlYXR1cmUpOwotICAgICAgICAgICAgY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kLnNldEFub255bW91c1NpbXBsZVR5cGUoYW5vbnltb3VzU2ltcGxlVHlwZSk7Ci0gICAgICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKGNoYW5nZVRvQW5vbnltb3VzQ29tbWFuZCk7Ci0gICAgICAgICAgICBpbnB1dCA9IGFub255bW91c1NpbXBsZVR5cGU7Ci0gICAgICAgICAgfQotICAgICAgICAgIHRhcmdldFNpbXBsZVR5cGUgPSBhbm9ueW1vdXNTaW1wbGVUeXBlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHRhcmdldFNpbXBsZVR5cGUgPSBpbnB1dDsKLSAgICAgICAgfQotCi0gICAgICAgIEFkZEVudW1lcmF0aW9uc0NvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRFbnVtZXJhdGlvbnNDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0VOVU1FUkFUSU9OLCB0YXJnZXRTaW1wbGVUeXBlKTsKLSAgICAgICAgY29tbWFuZC5zZXRWYWx1ZShuZXdOYW1lLnRvU3RyaW5nKCkpOwotICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKGNvbW1hbmQpOwotICAgICAgICBjb21tYW5kU3RhY2suZXhlY3V0ZShjb21wb3VuZENvbW1hbmQpOwotICAgICAgICBzZXRJbnB1dChpbnB1dCk7Ci0gICAgICAgIGNvbnN0cmFpbnRzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICBpbnQgbmV3SXRlbUluZGV4ID0gY29uc3RyYWludHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMTsKLSAgICAgICAgY29uc3RyYWludHNUYWJsZVZpZXdlci5lZGl0RWxlbWVudChjb25zdHJhaW50c1RhYmxlVmlld2VyLmdldEVsZW1lbnRBdChuZXdJdGVtSW5kZXgpLCAwKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gYWRkVXNpbmdEaWFsb2dCdXR0b24pCi0gICAgewotICAgICAgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0gICAgICAvLyBpZiBpdCBpcyBudWxsLCBnZXQgdGhlIGRlZmF1bHQgb25lCi0gICAgICBkaXNwbGF5ID0gZGlzcGxheSA9PSBudWxsID8gRGlzcGxheS5nZXREZWZhdWx0KCkgOiBkaXNwbGF5OwotICAgICAgU2hlbGwgc2hlbGwgPSBkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCk7Ci0KLSAgICAgIGlmIChraW5kID09IFBBVFRFUk4pCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBpbml0aWFsVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBSZWdleFdpemFyZCB3aXphcmQgPSBuZXcgUmVnZXhXaXphcmQoaW5pdGlhbFZhbHVlKTsKLQotICAgICAgICBXaXphcmREaWFsb2cgd2l6YXJkRGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLSAgICAgICAgd2l6YXJkRGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotICAgICAgICB3aXphcmREaWFsb2cuY3JlYXRlKCk7Ci0KLSAgICAgICAgaW50IHJlc3VsdCA9IHdpemFyZERpYWxvZy5vcGVuKCk7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbmV3UGF0dGVybiA9IHdpemFyZC5nZXRQYXR0ZXJuKCk7Ci0gICAgICAgICAgQ29tcG91bmRDb21tYW5kIGNvbXBvdW5kQ29tbWFuZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLSAgICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0YXJnZXRTaW1wbGVUeXBlID0gbnVsbDsKLSAgICAgICAgICBpZiAoZmVhdHVyZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGFub255bW91c1NpbXBsZVR5cGUgPSBYU0RDb21tb25VSVV0aWxzLmdldEFub255bW91c1NpbXBsZVR5cGUoZmVhdHVyZSwgaW5wdXQpOwotICAgICAgICAgICAgaWYgKGFub255bW91c1NpbXBsZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYW5vbnltb3VzU2ltcGxlVHlwZSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgIGFub255bW91c1NpbXBsZVR5cGUuc2V0QmFzZVR5cGVEZWZpbml0aW9uKGlucHV0KTsKLQotICAgICAgICAgICAgICBDaGFuZ2VUb0xvY2FsU2ltcGxlVHlwZUNvbW1hbmQgY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kID0gbmV3IENoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0NIQU5HRV9QQVRURVJOLCBmZWF0dXJlKTsKLSAgICAgICAgICAgICAgY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kLnNldEFub255bW91c1NpbXBsZVR5cGUoYW5vbnltb3VzU2ltcGxlVHlwZSk7Ci0gICAgICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5hZGQoY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kKTsKLSAgICAgICAgICAgICAgaW5wdXQgPSBhbm9ueW1vdXNTaW1wbGVUeXBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGFyZ2V0U2ltcGxlVHlwZSA9IGFub255bW91c1NpbXBsZVR5cGU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRTaW1wbGVUeXBlID0gaW5wdXQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIFVwZGF0ZVhTRFBhdHRlcm5GYWNldENvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVYU0RQYXR0ZXJuRmFjZXRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX1BBVFRFUk4sIHRhcmdldFNpbXBsZVR5cGUsIFVwZGF0ZVhTRFBhdHRlcm5GYWNldENvbW1hbmQuQUREKTsKLSAgICAgICAgICBjb21tYW5kLnNldFZhbHVlKG5ld1BhdHRlcm4pOwotICAgICAgICAgIHNldElucHV0KGlucHV0KTsKLSAgICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKGNvbW1hbmQpOwotICAgICAgICAgIGNvbW1hbmRTdGFjay5leGVjdXRlKGNvbXBvdW5kQ29tbWFuZCk7Ci0gICAgICAgICAgZmFjZXRTZWN0aW9uLmRvU2V0SW5wdXQoKTsKLSAgICAgICAgfQotICAgICAgICBjb25zdHJhaW50c1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRW51bWVyYXRpb25zRGlhbG9nIGRpYWxvZyA9IG5ldyBFbnVtZXJhdGlvbnNEaWFsb2coc2hlbGwpOwotICAgICAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgICAgIGludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHRleHQgPSBkaWFsb2cuZ2V0VGV4dCgpOwotICAgICAgICAgIFN0cmluZyBkZWxpbWl0ZXIgPSBkaWFsb2cuZ2V0RGVsaW1pdGVyKCk7Ci0gICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGV4dCwgZGVsaW1pdGVyKTsKLSAgICAgICAgICBDb21wb3VuZENvbW1hbmQgY29tcG91bmRDb21tYW5kID0gbmV3IENvbXBvdW5kQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9FTlVNRVJBVElPTlMpOwotICAgICAgICAgIAotICAgICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHRhcmdldFNpbXBsZVR5cGUgPSBudWxsOwotICAgICAgICAgIGlmIChmZWF0dXJlICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gYW5vbnltb3VzU2ltcGxlVHlwZSA9IFhTRENvbW1vblVJVXRpbHMuZ2V0QW5vbnltb3VzU2ltcGxlVHlwZShmZWF0dXJlLCBpbnB1dCk7Ci0gICAgICAgICAgICBpZiAoYW5vbnltb3VzU2ltcGxlVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBhbm9ueW1vdXNTaW1wbGVUeXBlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgYW5vbnltb3VzU2ltcGxlVHlwZS5zZXRCYXNlVHlwZURlZmluaXRpb24oaW5wdXQpOwotCi0gICAgICAgICAgICAgIENoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZCBjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQgPSBuZXcgQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kKCIiLCBmZWF0dXJlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICBjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQuc2V0QW5vbnltb3VzU2ltcGxlVHlwZShhbm9ueW1vdXNTaW1wbGVUeXBlKTsKLSAgICAgICAgICAgICAgY29tcG91bmRDb21tYW5kLmFkZChjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQpOwotICAgICAgICAgICAgICBpbnB1dCA9IGFub255bW91c1NpbXBsZVR5cGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0YXJnZXRTaW1wbGVUeXBlID0gYW5vbnltb3VzU2ltcGxlVHlwZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRhcmdldFNpbXBsZVR5cGUgPSBpbnB1dDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBpZiAoZGlhbG9nLmlzUHJlc2VydmVXaGl0ZXNwYWNlKCkgPT0gZmFsc2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHRva2VuID0gdG9rZW4udHJpbSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQWRkRW51bWVyYXRpb25zQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZEVudW1lcmF0aW9uc0NvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRU5VTUVSQVRJT05TLCB0YXJnZXRTaW1wbGVUeXBlKTsKLSAgICAgICAgICAgIGNvbW1hbmQuc2V0VmFsdWUodG9rZW4pOwotICAgICAgICAgICAgY29tcG91bmRDb21tYW5kLmFkZChjb21tYW5kKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29tbWFuZFN0YWNrLmV4ZWN1dGUoY29tcG91bmRDb21tYW5kKTsKLSAgICAgICAgfQotICAgICAgICAvL3NldElucHV0KGlucHV0KTsKLSAgICAgICAgZmFjZXRTZWN0aW9uLmRvU2V0SW5wdXQoKTsKLSAgICAgICAgY29uc3RyYWludHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGRlbGV0ZUJ1dHRvbikKLSAgICB7Ci0gICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb25zdHJhaW50c1RhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgQ29tcG91bmRDb21tYW5kIGNvbXBvdW5kQ29tbWFuZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLSAgICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgaSA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotICAgICAgICBpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBjb21wb3VuZENvbW1hbmQuc2V0TGFiZWwoTWVzc2FnZXMuX1VJX0FDVElPTl9ERUxFVEVfQ09OU1RSQUlOVFMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5zZXRMYWJlbChNZXNzYWdlcy5fVUlfQUNUSU9OX0RFTEVURV9QQVRURVJOKTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKG9iaiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RQYXR0ZXJuRmFjZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFVwZGF0ZVhTRFBhdHRlcm5GYWNldENvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVYU0RQYXR0ZXJuRmFjZXRDb21tYW5kKCIiLCBpbnB1dCwgVXBkYXRlWFNEUGF0dGVybkZhY2V0Q29tbWFuZC5ERUxFVEUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGNvbW1hbmQuc2V0UGF0dGVyblRvRWRpdCgoWFNEUGF0dGVybkZhY2V0KW9iaik7Ci0gICAgICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5hZGQoY29tbWFuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBYU0RFbnVtZXJhdGlvbkZhY2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RFbnVtZXJhdGlvbkZhY2V0IGVudW1GYWNldCA9IChYU0RFbnVtZXJhdGlvbkZhY2V0KSBvYmo7Ci0gICAgICAgICAgICAgIERlbGV0ZUNvbW1hbmQgZGVsZXRlQ29tbWFuZCA9IG5ldyBEZWxldGVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fREVMRVRFX0VOVU1FUkFUSU9OLCBlbnVtRmFjZXQpOwotICAgICAgICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKGRlbGV0ZUNvbW1hbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb21tYW5kU3RhY2suZXhlY3V0ZShjb21wb3VuZENvbW1hbmQpOwotICAgICAgICBjb25zdHJhaW50c1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQotICAgICAgICBpZiAoY29uc3RyYWludHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICBlZGl0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgIGRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBlZGl0QnV0dG9uKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbnN0cmFpbnRzVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBYU0RQYXR0ZXJuRmFjZXQpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RQYXR0ZXJuRmFjZXQgcGF0dGVybiA9IChYU0RQYXR0ZXJuRmFjZXQpIG9iajsKLSAgICAgICAgICBTdHJpbmcgaW5pdGlhbFZhbHVlID0gcGF0dGVybi5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgICAgICBpZiAoaW5pdGlhbFZhbHVlID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0KLSAgICAgICAgICBSZWdleFdpemFyZCB3aXphcmQgPSBuZXcgUmVnZXhXaXphcmQoaW5pdGlhbFZhbHVlKTsKLQotICAgICAgICAgIFdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotICAgICAgICAgIHdpemFyZERpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICAgICAgICB3aXphcmREaWFsb2cuY3JlYXRlKCk7Ci0KLSAgICAgICAgICBpbnQgcmVzdWx0ID0gd2l6YXJkRGlhbG9nLm9wZW4oKTsKLQotICAgICAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBuZXdQYXR0ZXJuID0gd2l6YXJkLmdldFBhdHRlcm4oKTsKLSAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5WQUxVRV9BVFRSSUJVVEUsIG5ld1BhdHRlcm4pOwotICAgICAgICAgICAgcGF0dGVybi5zZXRMZXhpY2FsVmFsdWUobmV3UGF0dGVybik7Ci0gICAgICAgICAgICBjb25zdHJhaW50c1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gY29uc3RyYWludHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbnN0cmFpbnRzVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBpZiAoc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGVkaXRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0KLSAgfQotCi0gIAotICBwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50S2luZChpbnQga2luZCkKLSAgewotICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gICAgY29uc3RyYWludHNUYWJsZVZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0gICAgY29uc3RyYWludHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRvTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFibGVJdGVtICYmICh2YWx1ZSAhPSBudWxsKSkKLSAgICB7Ci0gICAgICBUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGVsZW1lbnQ7Ci0KLSAgICAgIGlmIChpdGVtLmdldERhdGEoKSBpbnN0YW5jZW9mIFhTRFBhdHRlcm5GYWNldCkKLSAgICAgIHsKLSAgICAgICAgWFNEUGF0dGVybkZhY2V0IHBhdHRlcm5GYWNldCA9IChYU0RQYXR0ZXJuRmFjZXQpIGl0ZW0uZ2V0RGF0YSgpOwotICAgICAgICBwYXR0ZXJuRmFjZXQuc2V0TGV4aWNhbFZhbHVlKChTdHJpbmcpIHZhbHVlKTsKLQotICAgICAgICBpdGVtLnNldERhdGEocGF0dGVybkZhY2V0KTsKLSAgICAgICAgaXRlbS5zZXRUZXh0KChTdHJpbmcpIHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGl0ZW0uZ2V0RGF0YSgpIGluc3RhbmNlb2YgWFNERW51bWVyYXRpb25GYWNldCkKLSAgICAgIHsKLSAgICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldCkgaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgIFNldFhTREZhY2V0VmFsdWVDb21tYW5kIGNvbW1hbmQgPSBuZXcgU2V0WFNERmFjZXRWYWx1ZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9TRVRfRU5VTUVSQVRJT05fVkFMVUUsIGVudW1GYWNldCk7Ci0gICAgICAgIGNvbW1hbmQuc2V0VmFsdWUoKFN0cmluZykgdmFsdWUpOwotICAgICAgICBjb21tYW5kU3RhY2suZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgaXRlbS5zZXREYXRhKGVudW1GYWNldCk7Ci0gICAgICAgIGl0ZW0uc2V0VGV4dCgoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGRvR2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgWFNEUGF0dGVybkZhY2V0KQotICAgIHsKLSAgICAgIFhTRFBhdHRlcm5GYWNldCBwYXR0ZXJuRmFjZXQgPSAoWFNEUGF0dGVybkZhY2V0KSBlbGVtZW50OwotICAgICAgU3RyaW5nIHZhbHVlID0gcGF0dGVybkZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgIHZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFhTREVudW1lcmF0aW9uRmFjZXQpCi0gICAgewotICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldCkgZWxlbWVudDsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IGVudW1GYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICB2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gIH0KLSAgCi0gIGNsYXNzIENvbnN0cmFpbnRzVGFibGVWaWV3ZXIgZXh0ZW5kcyBOYXZpZ2FibGVUYWJsZVZpZXdlciBpbXBsZW1lbnRzIElDZWxsTW9kaWZpZXIKLSAgewotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzID0geyBNZXNzYWdlcy5fVUlfTEFCRUxfUEFUVEVSTiB9OwotCi0gICAgcHJvdGVjdGVkIENlbGxFZGl0b3JbXSBjZWxsRWRpdG9yczsKLQotICAgIFRhYmxlIHRhYmxlOwotCi0gICAgcHVibGljIENvbnN0cmFpbnRzVGFibGVWaWV3ZXIoVGFibGUgdGFibGUpCi0gICAgewotICAgICAgc3VwZXIodGFibGUpOwotICAgICAgdGFibGUgPSBnZXRUYWJsZSgpOwotCi0gICAgICB0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLSAgICAgIHNldENvbnRlbnRQcm92aWRlcihuZXcgQ29uc3RyYWludHNDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICBzZXRMYWJlbFByb3ZpZGVyKG5ldyBDb25zdHJhaW50c1RhYmxlTGFiZWxQcm92aWRlcigpKTsKLSAgICAgIHNldENvbHVtblByb3BlcnRpZXMoY29sdW1uUHJvcGVydGllcyk7Ci0KLSAgICAgIHNldENlbGxNb2RpZmllcih0aGlzKTsKLQotICAgICAgVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgMCk7Ci0gICAgICBjb2x1bW4uc2V0VGV4dChjb2x1bW5Qcm9wZXJ0aWVzWzBdKTsKLSAgICAgIGNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotICAgICAgY29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQotICAgICAgY2VsbEVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvclsxXTsKLQotICAgICAgVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0gICAgICBDb2x1bW5XZWlnaHREYXRhIGRhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMDApOwotCi0gICAgICBsYXlvdXQuYWRkQ29sdW1uRGF0YShkYXRhKTsKLSAgICAgIGNlbGxFZGl0b3JzWzBdID0gbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKTsKLQotICAgICAgZ2V0VGFibGUoKS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgIHNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgICBkb01vZGlmeShlbGVtZW50LCBwcm9wZXJ0eSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICByZXR1cm4gZG9HZXRWYWx1ZShlbGVtZW50LCBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gIH0KLQotICBjbGFzcyBDb25zdHJhaW50c0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCBpbnB1dEVsZW1lbnQpCi0gICAgewotICAgICAgamF2YS51dGlsLkxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGlucHV0RWxlbWVudDsKLSAgICAgICAgYm9vbGVhbiBpc0RlZmluZWQgPSBmYWxzZTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcjsKLSAgICAgICAgaWYgKGtpbmQgPT0gUEFUVEVSTikKLSAgICAgICAgewotICAgICAgICAgIGl0ZXIgPSBzdC5nZXRQYXR0ZXJuRmFjZXRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpdGVyID0gc3QuZ2V0RW51bWVyYXRpb25GYWNldHMoKS5pdGVyYXRvcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgWFNERmFjZXQgZmFjZXQgPSAoWFNERmFjZXQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgIGlzRGVmaW5lZCA9IChmYWNldC5nZXRSb290Q29udGFpbmVyKCkgPT0gZmFjZXRTZWN0aW9uLnhzZFNjaGVtYSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoa2luZCA9PSBQQVRURVJOKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlzRGVmaW5lZCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3QuZ2V0UGF0dGVybkZhY2V0cygpLnRvQXJyYXkoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlzRGVmaW5lZCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3QuZ2V0RW51bWVyYXRpb25GYWNldHMoKS50b0FycmF5KCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgIH0KLSAgfQotCi0gIGNsYXNzIENvbnN0cmFpbnRzVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIKLSAgewotICAgIHB1YmxpYyBDb25zdHJhaW50c1RhYmxlTGFiZWxQcm92aWRlcigpCi0gICAgewotCi0gICAgfQotCi0gICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgaWYgKGtpbmQgPT0gUEFUVEVSTikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEU2ltcGxlUGF0dGVybi5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RTaW1wbGVFbnVtLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RQYXR0ZXJuRmFjZXQpCi0gICAgICB7Ci0gICAgICAgIFhTRFBhdHRlcm5GYWNldCBwYXR0ZXJuID0gKFhTRFBhdHRlcm5GYWNldCkgZWxlbWVudDsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gcGF0dGVybi5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgWFNERW51bWVyYXRpb25GYWNldCkKLSAgICAgIHsKLSAgICAgICAgWFNERW51bWVyYXRpb25GYWNldCBlbnVtRmFjZXQgPSAoWFNERW51bWVyYXRpb25GYWNldCkgZWxlbWVudDsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gZW51bUZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICB2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREFjdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzFmYTZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuRWRpdEF0dHJpYnV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlhNTE5vZGVBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFhTREFjdGlvbk1hbmFnZXIgZXh0ZW5kcyBYTUxOb2RlQWN0aW9uTWFuYWdlciB7Ci0KLSAgcHJpdmF0ZSBDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrOwotICAKLQlwdWJsaWMgWFNEQWN0aW9uTWFuYWdlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKG1vZGVsLCB2aWV3ZXIpOwotCX0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENvbW1hbmRTdGFjayhDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKSB7Ci0gICAgdGhpcy5jb21tYW5kU3RhY2sgPSBjb21tYW5kU3RhY2s7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZENEYXRhU2VjdGlvbkFjdGlvbihOb2RlIHBhcmVudCwgaW50IGluZGV4KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkUENEYXRhQWN0aW9uKE5vZGUgcGFyZW50LCBDTURhdGFUeXBlIGRhdGFUeXBlLCBpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZUFkZERvY3VtZW50Q2hpbGRBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBEb2N1bWVudCBkb2N1bWVudCwgaW50IGljLCBpbnQgdmMpIHsKLQl9Ci0gIAotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVFZGl0R3JhbW1hckluZm9ybWF0aW9uQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgTm9kZSBub2RlKSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVQSUFuZENvbW1lbnRBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBEb2N1bWVudCBkb2N1bWVudCwgaW50IGluZGV4KSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVQSUFuZENvbW1lbnRBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBFbGVtZW50IHBhcmVudEVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkLCBpbnQgaW5kZXgpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVRleHROb2RlQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgRWxlbWVudCBwYXJlbnRFbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFZCwgaW50IGluZGV4KSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUZXh0Tm9kZUFjdGlvbnMobWVudSwgcGFyZW50RWxlbWVudCwgcGFyZW50RWQsIGluZGV4KTsKLQl9Ci0gIAotICBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZEF0dHJpYnV0ZUFjdGlvbihFbGVtZW50IHBhcmVudCwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkgewotICAgIEFjdGlvbiBhY3Rpb24gPSBudWxsOwotICAgIGlmIChhZCA9PSBudWxsKSB7Ci0gICAgICBhY3Rpb24gPSBuZXcgRWRpdEF0dHJpYnV0ZUFjdGlvbih0aGlzLCBwYXJlbnQsIG51bGwsIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfTkVXX0FUVFJJQlVURSwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9ORVdfQVRUUklCVVRFX1RJVExFKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfSBlbHNlIHsKLSAgICAgIGFjdGlvbiA9IG5ldyBBZGROb2RlQWN0aW9uKGFkLCBwYXJlbnQsIC0xKTsKLSAgICB9Ci0gICAgCi0gICAgV3JhcHBlckNvbW1hbmQgY29tbWFuZCA9IG5ldyBXcmFwcGVyQ29tbWFuZChhY3Rpb24sIHBhcmVudCwgYWQpOwotICAgIFdyYXBwZXJBY3Rpb24gd3JhcHBlckFjdGlvbiA9IG5ldyBXcmFwcGVyQWN0aW9uKGNvbW1hbmQpOwotICAgIHJldHVybiB3cmFwcGVyQWN0aW9uOwotICB9Ci0gIAotICBjbGFzcyBXcmFwcGVyQWN0aW9uIGV4dGVuZHMgQWN0aW9uCi0gIHsKLSAgICBXcmFwcGVyQ29tbWFuZCBjb21tYW5kOwotICAgIAotICAgIHB1YmxpYyBXcmFwcGVyQWN0aW9uKFdyYXBwZXJDb21tYW5kIGNvbW1hbmQpCi0gICAgewotICAgICAgc3VwZXIoKTsKLSAgICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gICAgewotICAgICAgcmV0dXJuIGNvbW1hbmQuZ2V0QWN0aW9uKCkuZ2V0VGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgewotICAgICAgLy8gU29tZSBlZGl0b3JzIG1heSBub3QgdXNlIGEgY29tbWFuZCBzdGFjawotICAgICAgaWYgKGNvbW1hbmRTdGFjayAhPSBudWxsKQotICAgICAgewotICAgICAgICBjb21tYW5kU3RhY2suZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgY2xhc3MgV3JhcHBlckNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kCi0gIHsKLSAgICBBY3Rpb24gYWN0aW9uOwotICAgIEVsZW1lbnQgcGFyZW50OwotICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQ7Ci0gICAgcHVibGljIFdyYXBwZXJDb21tYW5kKEFjdGlvbiBhY3Rpb24sIEVsZW1lbnQgcGFyZW50LCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKQotICAgIHsKLSAgICAgIHN1cGVyKCk7Ci0gICAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjsKLSAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgdGhpcy5hZCA9IGFkOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7Ci0gICAgICByZXR1cm4gYWN0aW9uLmdldFRleHQoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEFjdGlvbiBnZXRBY3Rpb24oKQotICAgIHsKLSAgICAgIHJldHVybiBhY3Rpb247Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgIHsKLSAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdW5kbygpIHsKLSAgICAgIAotLy8gICAgICAoKEVsZW1lbnQpcGFyZW50KS5yZW1vdmVBdHRyaWJ1dGUoYWQuZ2V0QXR0ck5hbWUoKSk7Ci0KLSAgICAgIGdldE1vZGVsKCkuZ2V0VW5kb01hbmFnZXIoKS51bmRvKCk7Ci0KLSAgICB9IAotICAgICAgICAKLQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQW55RWxlbWVudENvbnRlbnRzU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RBbnlFbGVtZW50Q29udGVudHNTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZTQ4OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RBbnlFbGVtZW50Q29udGVudHNTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFByb2Nlc3NDb250ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgWFNEQW55RWxlbWVudENvbnRlbnRzU2VjdGlvbiBleHRlbmRzIE11bHRpcGxpY2l0eVNlY3Rpb24KLXsKLSAgQ0NvbWJvIG5hbWVzcGFjZUNvbWJvOwotICBDQ29tYm8gcHJvY2Vzc0NvbnRlbnRzQ29tYm87Ci0KLSAgcHJpdmF0ZSBTdHJpbmdbXSBuYW1lc3BhY2VDb21ib1ZhbHVlcyA9IHsgIiIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICIjI2FueSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICIjI290aGVyIiwgLy8kTk9OLU5MUy0xJAotICAgICAgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJAotICAgICAgIiMjbG9jYWwiIC8vJE5PTi1OTFMtMSQKLSAgfTsKLQotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgWFNEQW55RWxlbWVudENvbnRlbnRzU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCi0gICAgQ0xhYmVsIG5hbWVzcGFjZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFhTRENvbnN0YW50cy5OQU1FU1BBQ0VfQVRUUklCVVRFKTsKLSAgICBuYW1lc3BhY2VMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgbmFtZXNwYWNlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgbmFtZXNwYWNlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBuYW1lc3BhY2VDb21iby5zZXRJdGVtcyhuYW1lc3BhY2VDb21ib1ZhbHVlcyk7Ci0gICAgbmFtZXNwYWNlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChuYW1lc3BhY2VDb21ibywKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fQU5ZRUxFTUVOVF9fTkFNRVNQQUNFKTsKLQotICAgIENMYWJlbCBwcm9jZXNzQ29udGVudHNMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBYU0RDb25zdGFudHMuUFJPQ0VTU0NPTlRFTlRTX0FUVFJJQlVURSk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIHByb2Nlc3NDb250ZW50c0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBwcm9jZXNzQ29udGVudHNDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBwcm9jZXNzQ29udGVudHNDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIEl0ZXJhdG9yIGxpc3QgPSBYU0RQcm9jZXNzQ29udGVudHMuVkFMVUVTLml0ZXJhdG9yKCk7Ci0gICAgcHJvY2Vzc0NvbnRlbnRzQ29tYm8uYWRkKCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIHdoaWxlIChsaXN0Lmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBwcm9jZXNzQ29udGVudHNDb21iby5hZGQoKChYU0RQcm9jZXNzQ29udGVudHMpIGxpc3QubmV4dCgpKS5nZXROYW1lKCkpOwotICAgIH0KLSAgICBwcm9jZXNzQ29udGVudHNDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHByb2Nlc3NDb250ZW50c0NvbWJvLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19BTllFTEVNRU5UX19QUk9DRVNTQ09OVEVOVFMpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gbWluIHByb3BlcnR5Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuVUlfTEFCRUxfTUlOT0NDVVJTKTsKLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0KLSAgICBtaW5Db21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgbWluQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBtaW5Db21iby5hZGQoIjAiKTsgLy8kTk9OLU5MUy0xJAotICAgIG1pbkNvbWJvLmFkZCgiMSIpOyAvLyROT04tTkxTLTEkCi0gICAgYXBwbHlBbGxMaXN0ZW5lcnMobWluQ29tYm8pOwotICAgIG1pbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobWluQ29tYm8sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0FOWUVMRU1FTlRfX01JTl9PQ0NVUkVOQ0UpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gbWF4IHByb3BlcnR5Ci0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLlVJX0xBQkVMX01BWE9DQ1VSUyk7Ci0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCi0gICAgbWF4Q29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIG1heENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgbWF4Q29tYm8uYWRkKCIwIik7IC8vJE5PTi1OTFMtMSQKLSAgICBtYXhDb21iby5hZGQoIjEiKTsgLy8kTk9OLU5MUy0xJAotICAgIG1heENvbWJvLmFkZCgidW5ib3VuZGVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICBhcHBseUFsbExpc3RlbmVycyhtYXhDb21ibyk7Ci0gICAgbWF4Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChtYXhDb21ibywKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fQU5ZRUxFTUVOVF9fTUFYX09DQ1VSRU5DRSk7Ci0gIH0KLQotICAvKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0gICAgbmFtZXNwYWNlQ29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBwcm9jZXNzQ29udGVudHNDb21iby5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgICAgewotICAgICAgICBYU0RXaWxkY2FyZCB3aWxkY2FyZCA9IChYU0RXaWxkY2FyZCkgaW5wdXQ7Ci0gICAgICAgIGlmICh3aWxkY2FyZC5pc1NldExleGljYWxOYW1lc3BhY2VDb25zdHJhaW50KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lc3BhY2VDb21iby5zZXRUZXh0KHdpbGRjYXJkLmdldFN0cmluZ0xleGljYWxOYW1lc3BhY2VDb25zdHJhaW50KCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG5hbWVzcGFjZUNvbWJvLnNldFRleHQoIiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3aWxkY2FyZC5pc1NldFByb2Nlc3NDb250ZW50cygpKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEUHJvY2Vzc0NvbnRlbnRzIHBjID0gd2lsZGNhcmQuZ2V0UHJvY2Vzc0NvbnRlbnRzKCk7Ci0gICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzQ29tYm8uc2V0VGV4dChwYy5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAod2lsZGNhcmQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICAgIHsKLSAgICAgICAgICBtaW5Db21iby5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICAgICAgICBtYXhDb21iby5zZXRFbmFibGVkKCFpc1JlYWRPbmx5KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBtaW5Db21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICBtYXhDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZWZyZXNoTWluTWF4KCk7Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCA9IChYU0RDb25jcmV0ZUNvbXBvbmVudCkgaW5wdXQ7Ci0gICAgaWYgKGNvbmNyZXRlQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEV2lsZGNhcmQpCi0gICAgewotICAgICAgWFNEV2lsZGNhcmQgd2lsZGNhcmQgPSAoWFNEV2lsZGNhcmQpIGNvbmNyZXRlQ29tcG9uZW50OwotICAgICAgaWYgKGUud2lkZ2V0ID09IG5hbWVzcGFjZUNvbWJvKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmV3VmFsdWUgPSBuYW1lc3BhY2VDb21iby5nZXRUZXh0KCk7Ci0gICAgICAgIGJvb2xlYW4gcmVtb3ZlQXR0cmlidXRlID0gZmFsc2U7Ci0gICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgcmVtb3ZlQXR0cmlidXRlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPIHVzZSBjb21tYW5kcwotICAgICAgICAvLyBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTkFNRVNQQUNFX0NIQU5HRSIpLAotICAgICAgICAvLyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAocmVtb3ZlQXR0cmlidXRlKQotICAgICAgICB7Ci0gICAgICAgICAgd2lsZGNhcmQudW5zZXRMZXhpY2FsTmFtZXNwYWNlQ29uc3RyYWludCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHdpbGRjYXJkLnNldFN0cmluZ0xleGljYWxOYW1lc3BhY2VDb25zdHJhaW50KG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAvLyBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSBwcm9jZXNzQ29udGVudHNDb21ibykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gcHJvY2Vzc0NvbnRlbnRzQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgICBib29sZWFuIHJlbW92ZUF0dHJpYnV0ZSA9IGZhbHNlOwotICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIHJlbW92ZUF0dHJpYnV0ZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1BST0NFU1NDT05URU5UU19DSEFOR0UiKSwKLSAgICAgICAgLy8gZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKHJlbW92ZUF0dHJpYnV0ZSkKLSAgICAgICAgewotICAgICAgICAgIHdpbGRjYXJkLnVuc2V0UHJvY2Vzc0NvbnRlbnRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgd2lsZGNhcmQuc2V0UHJvY2Vzc0NvbnRlbnRzKFhTRFByb2Nlc3NDb250ZW50cy5nZXQocHJvY2Vzc0NvbnRlbnRzQ29tYm8uZ2V0SXRlbShwcm9jZXNzQ29udGVudHNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKSkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGVuZFJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIuZG9XaWRnZXRTZWxlY3RlZChlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgaWYgKG1pbkNvbWJvICE9IG51bGwgJiYgIW1pbkNvbWJvLmlzRGlzcG9zZWQoKSkKLSAgICAgIG1pbkNvbWJvLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGlmIChtYXhDb21ibyAhPSBudWxsICYmICFtYXhDb21iby5pc0Rpc3Bvc2VkKCkpCi0gICAgICBtYXhDb21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvblNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQXR0cmlidXRlRGVjbGFyYXRpb25TZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OTg3Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvblNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuWE1MQ2hhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuc2VhcmNoLmRpYWxvZ3MuQ29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LkNvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuSUNvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5CYXNlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlTmFtZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLk5ld1R5cGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNEQXR0cmlidXRlUmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoLlhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNEQXR0cmlidXRlRGVjbGFyYXRpb25TZWN0aW9uIGV4dGVuZHMgUmVmYWN0b3JpbmdTZWN0aW9uCi17Ci0gIHByb3RlY3RlZCBUZXh0IG5hbWVUZXh0LCBkZWZhdWx0T3JGaXhlZFRleHQ7Ci0gIHByb3RlY3RlZCBDQ29tYm8gY29tcG9uZW50TmFtZUNvbWJvLCB0eXBlQ29tYm8sIHVzYWdlQ29tYm8sIGZvcm1Db21ibzsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBkZWZhdWx0QnV0dG9uLCBmaXhlZEJ1dHRvbjsKLSAgcHJvdGVjdGVkIFN0cmluZyB0eXBlTmFtZSA9ICIiLCByZWZOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgYm9vbGVhbiBpc0F0dHJpYnV0ZVJlZmVyZW5jZTsKLSAgCi0gIHB1YmxpYyBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvblNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIFN0cmluZyB0eXBlTGFiZWwgPSBNZXNzYWdlcy5VSV9MQUJFTF9UWVBFOyAvLyROT04tTkxTLTEkCi0KLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE5hbWVMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBDTGFiZWwgbmFtZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX05BTUUpOwotICAgIG5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gTmFtZVRleHQKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIG5hbWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIG5hbWVUZXh0LnNldEVuYWJsZWQoIWlzQXR0cmlidXRlUmVmZXJlbmNlKTsKLSAgICBhcHBseUFsbExpc3RlbmVycyhuYW1lVGV4dCk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChuYW1lVGV4dCwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fQVRUUklCVVRFX19OQU1FKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFJlZmFjdG9yL3JlbmFtZSBoeXBlcmxpbmsKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBjcmVhdGVSZW5hbWVIeXBlcmxpbmsoY29tcG9zaXRlKTsKLSAgICBzZXRSZW5hbWVIeXBlcmxpbmtFbmFibGVkKCFpc0F0dHJpYnV0ZVJlZmVyZW5jZSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBSZWYgTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBpZiAoaXNBdHRyaWJ1dGVSZWZlcmVuY2UpCi0gICAgewotICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICAgIENMYWJlbCByZWZMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9SRUZFUkVOQ0UpOwotICAgICAgcmVmTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAvLyBSZWYgQ29tYm8KLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotICAgICAgY29tcG9uZW50TmFtZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgCi0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvbmVudE5hbWVDb21ibywKLSAgICAgICAgICBYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0FUVFJJQlVURV9fTkFNRSk7Ci0KLSAgICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gdHlwZUxhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIHR5cGVMYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIHR5cGVDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgdHlwZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIHR5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHR5cGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHR5cGVDb21ibywKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fQVRUUklCVVRFX19UWVBFKTsKLQotICAgIC8vIGR1bW15Ci0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFVzYWdlTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgQ0xhYmVsIHVzZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9VU0FHRSIpKTsKLSAgICB1c2VMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gVXNhZ2VDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgdXNhZ2VDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsKLSAgICB1c2FnZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgdXNhZ2VDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICB1c2FnZUNvbWJvLmFkZCgiIik7Ci0gICAgdXNhZ2VDb21iby5hZGQoInJlcXVpcmVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICB1c2FnZUNvbWJvLmFkZCgib3B0aW9uYWwiKTsgLy8kTk9OLU5MUy0xJAotICAgIHVzYWdlQ29tYm8uYWRkKCJwcm9oaWJpdGVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICB1c2FnZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIC8vIGR1bW15Ci0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIGRlZmF1bHRMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBDTGFiZWwgZGVmYXVsdExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX1ZBTFVFX0NPTE9OKTsKLSAgICBkZWZhdWx0TGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAKLSAgICBDb21wb3NpdGUgcmFkaW8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0gICAgcmFkaW8uc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0gICAgCi0gICAgZGVmYXVsdEJ1dHRvbiA9IG5ldyBCdXR0b24ocmFkaW8sIFNXVC5SQURJTyk7Ci0gICAgZGVmYXVsdEJ1dHRvbi5zZXRUZXh0KG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0RFRkFVTFQpOwotICAgIGRlZmF1bHRCdXR0b24uc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0QmFja2dyb3VuZCgpKTsKLSAgICBkZWZhdWx0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIGZpeGVkQnV0dG9uID0gbmV3IEJ1dHRvbihyYWRpbywgU1dULlJBRElPKTsKLSAgICBmaXhlZEJ1dHRvbi5zZXRUZXh0KG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0ZJWEVEKTsgIAotICAgIGZpeGVkQnV0dG9uLnNldEJhY2tncm91bmQocGFyZW50LmdldEJhY2tncm91bmQoKSk7Ci0gICAgZml4ZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgLy8gZHVtbXkKLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgLy8gZHVtbXkKLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBkZWZhdWx0VGV4dAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGVmYXVsdE9yRml4ZWRUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBkZWZhdWx0T3JGaXhlZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBhcHBseUFsbExpc3RlbmVycyhkZWZhdWx0T3JGaXhlZFRleHQpOwotICAgIAotICAgIC8vUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChuYW1lVGV4dCwKLSAgICAvLwkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19BVFRSSUJVVEVfX0RFRkFVTFQpOwotICAgIAotICAgIC8vIGR1bW15Ci0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEZvcm1MYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBDTGFiZWwgZm9ybUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0ZPUk0pOwotICAgIGZvcm1MYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gRm9ybUNvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBmb3JtQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0gICAgZm9ybUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgZm9ybUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGZvcm1Db21iby5hZGQoIiIpOwotICAgIGZvcm1Db21iby5hZGQoInF1YWxpZmllZCIpOyAvLyROT04tTkxTLTEkCi0gICAgZm9ybUNvbWJvLmFkZCgidW5xdWFsaWZpZWQiKTsgLy8kTk9OLU5MUy0xJAotICAgIGZvcm1Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICAvLyBkdW1teQotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBmaWxsVHlwZXNDb21ibygpCi0gIHsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLSAgICBYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIgbWFuYWdlciA9IChYU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKTsKLSAgICBpZiAobWFuYWdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBpdGVtcyA9IG1hbmFnZXIuZ2V0UXVpY2tQaWNrcygpOwotCi0gICAgICB0eXBlQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICB0eXBlQ29tYm8uYWRkKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQlJPV1NFKTsKLSAgICAgIHR5cGVDb21iby5hZGQoTWVzc2FnZXMuX1VJX0FDVElPTl9ORVcpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgdHlwZUNvbWJvLmFkZChpdGVtc1tpXS5nZXROYW1lKCkpOwotICAgICAgfQotCi0gICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBuYW1lZENvbXBvbmVudCA9ICgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGlucHV0KS5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiBuYW1lZENvbXBvbmVudFR5cGUgPSBuYW1lZENvbXBvbmVudC5nZXRUeXBlKCk7Ci0gICAgICBpZiAobmFtZWRDb21wb25lbnRUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBjdXJyZW50VHlwZU5hbWUgPSBuYW1lZENvbXBvbmVudFR5cGUuZ2V0UU5hbWUoeHNkU2NoZW1hKTsgLy8gbm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlZml4Ci0gICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gcmV0ID0gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShjdXJyZW50VHlwZU5hbWUsIG1hbmFnZXIpOwotICAgICAgICBpZiAocmV0ID09IG51bGwpIC8vIG5vdCBpbiBxdWlja1BpY2sKLSAgICAgICAgICB0eXBlQ29tYm8uYWRkKGN1cnJlbnRUeXBlTmFtZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIENvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShTdHJpbmcgdmFsdWUsIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGVkaXRNYW5hZ2VyKQotICB7Ci0gICAgaWYgKGVkaXRNYW5hZ2VyICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gcXVpY2tQaWNrcyA9IGVkaXRNYW5hZ2VyLmdldFF1aWNrUGlja3MoKTsKLSAgICAgIGlmIChxdWlja1BpY2tzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHF1aWNrUGlja3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPSBxdWlja1BpY2tzW2ldOwotICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMoY29tcG9uZW50U3BlY2lmaWNhdGlvbi5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRTcGVjaWZpY2F0aW9uOwotICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgIH0gIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQotICAgIC8vIHJlZnJlc2ggbmFtZQotCi0gICAgbmFtZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBuYW1lZENvbXBvbmVudCA9ICgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGlucHV0KS5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0KLSAgICAgIFN0cmluZyBuYW1lID0gbmFtZWRDb21wb25lbnQuZ2V0TmFtZSgpOwotICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmFtZVRleHQuc2V0VGV4dChuYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGlzQXR0cmlidXRlUmVmZXJlbmNlKQotICAgIHsKLSAgICAgIHJlZnJlc2hSZWZDb21ibygpOwotICAgIH0KLQotICAgIC8vIHJlZnJlc2ggdHlwZQotCi0gICAgdHlwZUNvbWJvLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHhzZEF0dHJpYnV0ZSA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgaW5wdXQ7Ci0gICAgICAgIGlzQXR0cmlidXRlUmVmZXJlbmNlID0gKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbilpbnB1dCkuaXNBdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSgpOwotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0geHNkQXR0cmlidXRlLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICBib29sZWFuIGlzQW5vbnltb3VzID0geHNkQXR0cmlidXRlLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgIT0gbnVsbDsKLQotICAgICAgICBpZiAoaXNBbm9ueW1vdXMpCi0gICAgICAgIHsKLSAgICAgICAgICB0eXBlQ29tYm8uc2V0VGV4dCgiKiphbm9ueW1vdXMqKiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZmlsbFR5cGVzQ29tYm8oKTsKLSAgICAgICAgICBpZiAodHlwZURlZiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHR5cGVOYW1lID0gdHlwZURlZi5nZXRRTmFtZSh4c2RTY2hlbWEpOwotICAgICAgICAgICAgaWYgKHR5cGVOYW1lID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHR5cGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHR5cGVDb21iby5zZXRUZXh0KHR5cGVOYW1lKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHR5cGVDb21iby5zZXRUZXh0KE1lc3NhZ2VzLlVJX05PX1RZUEUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdXNhZ2VDb21iby5zZXRUZXh0KCIiKTsKLSAgICAgICAgdXNhZ2VDb21iby5zZXRFbmFibGVkKCF4c2RBdHRyaWJ1dGUuaXNHbG9iYWwoKSk7Ci0gICAgICAgIAotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSB4c2RBdHRyaWJ1dGUuZ2V0RWxlbWVudCgpOwotICAgICAgICBib29sZWFuIGhhc1VzZUF0dHJpYnV0ZSA9IGZhbHNlOwotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaGFzVXNlQXR0cmlidXRlID0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlVTRV9BVFRSSUJVVEUpOwotICAgICAgICAgIGlmIChoYXNVc2VBdHRyaWJ1dGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHVzYWdlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlVTRV9BVFRSSUJVVEUpOwotICAgICAgICAgICAgdXNhZ2VDb21iby5zZXRUZXh0KHVzYWdlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGRlZmF1bHRPckZpeGVkVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIAotICAgICAgICBib29sZWFuIGhhc0RlZmF1bHRBdHRyaWJ1dGUgPSBmYWxzZSwgaGFzRml4ZWRBdHRyaWJ1dGUgPSBmYWxzZTsKLSAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGhhc0RlZmF1bHRBdHRyaWJ1dGUgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuREVGQVVMVF9BVFRSSUJVVEUpOwotICAgICAgICAgIGhhc0ZpeGVkQXR0cmlidXRlID0gZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZJWEVEX0FUVFJJQlVURSk7Ci0KLSAgICAgICAgICAvLyBDYXNlIHdoZXJlIG5vIGZpeGVkIG9yIGRlZmF1bHQgYXR0cmlidXRlcyBleGlzdCwgc28gZW5zdXJlIG9uZSBvZiB0aGUgcmFkaW8gYnV0dG9ucyBpcyBzZWxlY3RlZAotICAgICAgICAgIGlmICghaGFzRGVmYXVsdEF0dHJpYnV0ZSAmJiAhaGFzRml4ZWRBdHRyaWJ1dGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCFkZWZhdWx0QnV0dG9uLmdldFNlbGVjdGlvbigpICYmICFmaXhlZEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgLy8gaWYgbm9uZSBhcmUgc2VsZWN0ZWQgdGhlbiBwaWNrIGZpeGVkCi0gICAgICAgICAgICAgIGZpeGVkQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIGlmIGJvdGggYXJlIHByZXNlbnQgaW4gc291cmNlIChhbiBlcnJvciEpLCBhc3N1bWUgdGhhdCAqZml4ZWQqIHRha2VzICJwcmVjZWRlbmNlIgotICAgICAgICAgICAgZGVmYXVsdEJ1dHRvbi5zZXRTZWxlY3Rpb24oIWhhc0ZpeGVkQXR0cmlidXRlICYmIGhhc0RlZmF1bHRBdHRyaWJ1dGUpOwotICAgICAgICAgICAgZml4ZWRCdXR0b24uc2V0U2VsZWN0aW9uKGhhc0ZpeGVkQXR0cmlidXRlKTsKLSAgICAgICAgICAgIGlmIChoYXNEZWZhdWx0QXR0cmlidXRlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgdGhlRGVmYXVsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5ERUZBVUxUX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICAJZGVmYXVsdE9yRml4ZWRUZXh0LnNldFRleHQodGhlRGVmYXVsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaGFzRml4ZWRBdHRyaWJ1dGUpIC8vIHdpbGwgb3ZlcndyaXRlIGRlZmF1bHQgaWYgYm90aCBwcmVzZW50Ci0JICAgICAgICAgIHsKLSAgICAgICAgCSAgICBTdHJpbmcgZml4ZWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFKTsKLSAgICAgICAgCSAgICBkZWZhdWx0T3JGaXhlZFRleHQuc2V0VGV4dChmaXhlZCk7Ci0JICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvcm1Db21iby5zZXRUZXh0KCIiKTsgCi0gICAgICAgIGZvcm1Db21iby5zZXRFbmFibGVkKCF4c2RBdHRyaWJ1dGUuaXNHbG9iYWwoKSAmJiAhaXNBdHRyaWJ1dGVSZWZlcmVuY2UpOwotICAgICAgICBib29sZWFuIGhhc0Zvcm1BdHRyaWJ1dGUgPSBmYWxzZTsKLSAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGhhc0Zvcm1BdHRyaWJ1dGUgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuRk9STV9BVFRSSUJVVEUpOwotICAgICAgICAgIGlmIChoYXNGb3JtQXR0cmlidXRlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBmb3JtID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZPUk1fQVRUUklCVVRFKTsKLSAgICAgICAgICAgIGZvcm1Db21iby5zZXRUZXh0KGZvcm0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gdHlwZUNvbWJvKQotICAgIHsKLSAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgaWYgKGVkaXRvciA9PSBudWxsKSByZXR1cm47Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBtYW5hZ2VyID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcyk7ICAgIAotCi0gICAgICBTdHJpbmcgc2VsZWN0aW9uID0gdHlwZUNvbWJvLmdldFRleHQoKTsKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gbmV3VmFsdWU7Ci0gICAgICBJQ29tcG9uZW50RGlhbG9nIGRpYWxvZz0gbnVsbDsKLSAgICAgIGlmICggc2VsZWN0aW9uLmVxdWFscyhNZXNzYWdlcy5fVUlfQUNUSU9OX0JST1dTRSkpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0QnJvd3NlRGlhbG9nKCk7Ci0gICAgICAgICgoWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlKSBkaWFsb2cpLnNob3dDb21wbGV4VHlwZXMoZmFsc2UpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHNlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0FDVElPTl9ORVcpKQotICAgICAgewotICAgICAgICBkaWFsb2cgPSBtYW5hZ2VyLmdldE5ld0RpYWxvZygpOwotICAgICAgICAoKE5ld1R5cGVEaWFsb2cpIGRpYWxvZykuYWxsb3dDb21wbGV4VHlwZShmYWxzZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRpYWxvZy5jcmVhdGVBbmRPcGVuKCkgPT0gV2luZG93Lk9LKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3VmFsdWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLSAgICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB4c2RBdHRyaWJ1dGUgPSAoKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpbnB1dCkuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgICAgICAgIG1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKHhzZEF0dHJpYnV0ZSwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2V7Ci0gICAgICAgIAl0eXBlQ29tYm8uc2V0VGV4dCh0eXBlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgLy91c2UgdGhlIHZhbHVlIGZyb20gc2VsZWN0ZWQgcXVpY2tQaWNrIGl0ZW0KLSAgICAgIHsKLSAgICAgICAgbmV3VmFsdWUgPSBnZXRDb21wb25lbnRTcGVjRnJvbVF1aWNrUGlja0ZvclZhbHVlKHNlbGVjdGlvbiwgbWFuYWdlcik7Ci0gICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKQotICAgICAgICAgIG1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKGlucHV0LCBuZXdWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGNvbXBvbmVudE5hbWVDb21ibykKLSAgICB7Ci0gICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgIGlmIChlZGl0b3IgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgbWFuYWdlciA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RBdHRyaWJ1dGVSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcyk7ICAgIAotCi0gICAgICBTdHJpbmcgc2VsZWN0aW9uID0gY29tcG9uZW50TmFtZUNvbWJvLmdldFRleHQoKTsKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gbmV3VmFsdWU7Ci0gICAgICBJQ29tcG9uZW50RGlhbG9nIGRpYWxvZz0gbnVsbDsKLSAgICAgIGlmICggc2VsZWN0aW9uLmVxdWFscyhNZXNzYWdlcy5fVUlfQUNUSU9OX0JST1dTRSkpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0QnJvd3NlRGlhbG9nKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggc2VsZWN0aW9uLmVxdWFscyhNZXNzYWdlcy5fVUlfQUNUSU9OX05FVykpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0TmV3RGlhbG9nKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRpYWxvZy5jcmVhdGVBbmRPcGVuKCkgPT0gV2luZG93Lk9LKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3VmFsdWUgPSBkaWFsb2cuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLSAgICAgICAgICBtYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShpbnB1dCwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KHJlZk5hbWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIC8vdXNlIHRoZSB2YWx1ZSBmcm9tIHNlbGVjdGVkIHF1aWNrUGljayBpdGVtCi0gICAgICB7Ci0gICAgICAgIG5ld1ZhbHVlID0gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShzZWxlY3Rpb24sIG1hbmFnZXIpOwotICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICBtYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShpbnB1dCwgbmV3VmFsdWUpOwotICAgICAgfQotCi0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgIAlYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB4c2RBdHRyaWJ1dGUgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGlucHV0OwotICAgIAlFbGVtZW50IGVsZW1lbnQgPSB4c2RBdHRyaWJ1dGUuZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKGUud2lkZ2V0ID09IHVzYWdlQ29tYm8pCi0JICAgIHsJICAgICAgCi0JICAgICAgZmluYWwgU3RyaW5nIG5ld1ZhbHVlID0gdXNhZ2VDb21iby5nZXRUZXh0KCk7Ci0JICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLQkgICAgICB7Ci0gICAgICAgICAgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBQcm9wZXJ0aWVzQ2hhbmdlQ29tbWFuZChlbGVtZW50LCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9VU0FHRSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGVTdGVwcygpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5VU0VfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5VU0VfQVRUUklCVVRFLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfTsKLSAgICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCSAgICAgIH0KLQkgICAgfQotCSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBmb3JtQ29tYm8pCi0JICAgIHsKLQkgICAgICBmaW5hbCBTdHJpbmcgbmV3VmFsdWUgPSBmb3JtQ29tYm8uZ2V0VGV4dCgpOwotCSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0JICAgICAgewotICAgICAgICAgIFByb3BlcnRpZXNDaGFuZ2VDb21tYW5kIGNvbW1hbmQgPSBuZXcgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQoZWxlbWVudCwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfRk9STSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGVTdGVwcygpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5GT1JNX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuRk9STV9BVFRSSUJVVEUsIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9OwotICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JICAgICAgfQotCSAgICB9Ci0JICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGRlZmF1bHRCdXR0b24pCi0JICAgIHsKLQkgICAgCWJvb2xlYW4gbmV3VmFsdWUgPSBkZWZhdWx0QnV0dG9uLmdldFNlbGVjdGlvbigpOwotCSAgICAJaWYgKGVsZW1lbnQgIT0gbnVsbCkKLQkgICAgCXsKLQkgICAgCQlpZiAobmV3VmFsdWUpCi0JICAgIAkJewotCSAgICAJCQlpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkZJWEVEX0FUVFJJQlVURSkpCi0JICAgIAkJCXsKLQkgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIFByb3BlcnRpZXNDaGFuZ2VDb21tYW5kIGNvbW1hbmQgPSBuZXcgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQoZWxlbWVudCwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfREVGQVVMVCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZVN0ZXBzKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5ERUZBVUxUX0FUVFJJQlVURSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkgICAgCQkJfQotCSAgICAJCX0KLQkgICAgCX0KLQkgICAgfQotCSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBmaXhlZEJ1dHRvbikKLQkgICAgewotCSAgICAJYm9vbGVhbiBuZXdWYWx1ZSA9IGZpeGVkQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCSAgICAJaWYgKGVsZW1lbnQgIT0gbnVsbCkKLQkgICAgCXsKLQkgICAgCQlpZiAobmV3VmFsdWUpCi0JICAgIAkJewotCSAgICAJCQlpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkRFRkFVTFRfQVRUUklCVVRFKSkKLQkgICAgCQkJewotCSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5ERUZBVUxUX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICAgIFByb3BlcnRpZXNDaGFuZ2VDb21tYW5kIGNvbW1hbmQgPSBuZXcgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQoZWxlbWVudCwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfRklYRUQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGVTdGVwcygpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkRFRkFVTFRfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5GSVhFRF9BVFRSSUJVVEUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JICAgIAkJCX0KLQkgICAgCQl9Ci0JICAgIAl9Ci0JICAgIH0KLSAgICB9Ci0gICAgc3VwZXIuZG9XaWRnZXRTZWxlY3RlZChlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBzdXBlci5kb0hhbmRsZUV2ZW50KGV2ZW50KTsKLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IG5hbWVUZXh0KQotICAgIHsKLSAgICAgIGlmICghbmFtZVRleHQuZ2V0RWRpdGFibGUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBTdHJpbmcgbmV3VmFsdWUgPSBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIG5hbWVkQ29tcG9uZW50ID0gKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgaW5wdXQpLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLQotICAgICAgICBpZiAoIXZhbGlkYXRlU2VjdGlvbigpKQotICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSBhbiBhY3R1YWwgbmFtZSBjaGFuZ2UgaGFzIHRha2VuIHBsYWNlCi0gICAgICAgIFN0cmluZyBvbGROYW1lID0gbmFtZWRDb21wb25lbnQuZ2V0TmFtZSgpOwotICAgICAgICBpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGROYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIGNvbW1hbmQgPSBuZXcgVXBkYXRlTmFtZUNvbW1hbmQob3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfQUNUSU9OX1JFTkFNRSwgbmFtZWRDb21wb25lbnQsIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb21tYW5kICE9IG51bGwgJiYgZ2V0Q29tbWFuZFN0YWNrKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChpc0F0dHJpYnV0ZVJlZmVyZW5jZSkKLSAgICAgICAgewotICAgICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJSZWYgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24paW5wdXQ7Ci0gICAgICAgICAgU3RyaW5nIHFuYW1lID0gYXR0clJlZi5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0UU5hbWUoKTsKLSAgICAgICAgICBhdHRyUmVmLmdldEVsZW1lbnQoKS5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUsIHFuYW1lKTsKLSAgICAgICAgICAKLS8vICAgICAgICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotLy8gICAgICAgICAgTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vICAgICAgICAgIGl0ZW1zID0gaGVscGVyLmdldEdsb2JhbEVsZW1lbnRzKCk7Ci0vLyAgICAgICAgICBpdGVtcy5hZGQoMCwgIiIpOwotLy8gICAgICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnNldEl0ZW1zKChTdHJpbmcgW10paXRlbXMudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7Ci0vLwotLy8gICAgICAgICAgcmVmcmVzaFJlZkNvbWJvKCk7Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChldmVudC53aWRnZXQgPT0gZGVmYXVsdE9yRml4ZWRUZXh0KQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIHhzZEF0dHJpYnV0ZSA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgaW5wdXQ7Ci0gICAgICBTdHJpbmcgbmV3VmFsdWUgPSBkZWZhdWx0T3JGaXhlZFRleHQuZ2V0VGV4dCgpOwotICAgICAgRWxlbWVudCBlbGVtZW50ID0geHNkQXR0cmlidXRlLmdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBQcm9wZXJ0aWVzQ2hhbmdlQ29tbWFuZChlbGVtZW50LCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9WQUxVRSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGVTdGVwcygpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5GSVhFRF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuREVGQVVMVF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH07Ci0gICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0gICAgICAgICAgaWYgKGZpeGVkQnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbW1hbmQgPSBuZXcgVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kKGVsZW1lbnQsIFhTRENvbnN0YW50cy5GSVhFRF9BVFRSSUJVVEUsIG5ld1ZhbHVlLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9GSVhFRCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9Qb3N0UHJvY2Vzc2luZygpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuREVGQVVMVF9BVFRSSUJVVEUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoZWxlbWVudCwgWFNEQ29uc3RhbnRzLkRFRkFVTFRfQVRUUklCVVRFLCBuZXdWYWx1ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfREVGQVVMVCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9Qb3N0UHJvY2Vzc2luZygpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklYRURfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29tbWFuZC5zZXREZWxldGVJZkVtcHR5KHRydWUpOwotICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlU2VjdGlvbigpCi0gIHsKLSAgICBpZiAobmFtZVRleHQgPT0gbnVsbCB8fCBuYW1lVGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLQotICAgIFN0cmluZyBuYW1lID0gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQotICAgIC8vIHZhbGlkYXRlIGFnYWluc3QgTkNOYW1lCi0gICAgaWYgKG5hbWUubGVuZ3RoKCkgPCAxIHx8ICFYTUxDaGFyLmlzVmFsaWROQ05hbWUobmFtZSkpCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0VSUk9SX0lOVkFMSURfTkFNRSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgaWYgKGNvbXBvbmVudE5hbWVDb21ibyAhPSBudWxsICYmICFjb21wb25lbnROYW1lQ29tYm8uaXNEaXNwb3NlZCgpKQotICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGlmIChuYW1lVGV4dCAhPSBudWxsICYmICFuYW1lVGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZW1vdmVMaXN0ZW5lcnMobmFtZVRleHQpOwotICAgIGlmICh0eXBlQ29tYm8gIT0gbnVsbCAmJiAhdHlwZUNvbWJvLmlzRGlzcG9zZWQoKSkKLSAgICAgIHR5cGVDb21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHN1cGVyLnNldElucHV0KHBhcnQsIHNlbGVjdGlvbik7Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLSAgICBpbml0KCk7Ci0gICAgcmVsYXlvdXQoKTsKLSAgICAKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGluaXQoKQotICB7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24geHNkQXR0cmlidXRlID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpbnB1dDsKLSAgICAgIGlzQXR0cmlidXRlUmVmZXJlbmNlID0geHNkQXR0cmlidXRlLmlzQXR0cmlidXRlRGVjbGFyYXRpb25SZWZlcmVuY2UoKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWxheW91dCgpCi0gIHsKLSAgICBDb21wb3NpdGUgcGFyZW50Q29tcG9zaXRlID0gY29tcG9zaXRlLmdldFBhcmVudCgpOwotICAgIHBhcmVudENvbXBvc2l0ZS5nZXRQYXJlbnQoKS5zZXRSZWRyYXcoZmFsc2UpOwotCi0gICAgaWYgKHBhcmVudENvbXBvc2l0ZSAhPSBudWxsICYmICFwYXJlbnRDb21wb3NpdGUuaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIENvbnRyb2xbXSBjaGlsZHJlbiA9IHBhcmVudENvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgY2hpbGRyZW5baV0uZGlzcG9zZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIE5vdyBpbml0aWFsaXplIHRoZSBuZXcgaGFuZGxlcgotICAgIGNyZWF0ZUNvbnRlbnRzKHBhcmVudENvbXBvc2l0ZSk7Ci0gICAgcGFyZW50Q29tcG9zaXRlLmdldFBhcmVudCgpLmxheW91dCh0cnVlLCB0cnVlKTsKLQotICAgIC8vIE5vdyB0dXJuIHBhaW50aW5nIGJhY2sgb24KLSAgICBwYXJlbnRDb21wb3NpdGUuZ2V0UGFyZW50KCkuc2V0UmVkcmF3KHRydWUpOwotICAgIHJlZnJlc2goKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFJlZkNvbWJvKCkKLSAgewotICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIGZpbGxDb21wb25lbnROYW1lQ29tYm8oKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGZpbGxDb21wb25lbnROYW1lQ29tYm8oKQotICB7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgbWFuYWdlciA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RBdHRyaWJ1dGVSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcyk7ICAgIAotICAgIAotICAgIGNvbXBvbmVudE5hbWVDb21iby5yZW1vdmVBbGwoKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQlJPV1NFKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkKE1lc3NhZ2VzLl9VSV9BQ1RJT05fTkVXKTsKLSAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gcXVpY2tQaWNrcyA9IG1hbmFnZXIuZ2V0UXVpY2tQaWNrcygpOwotICAgIGlmIChxdWlja1BpY2tzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChpbnQgaT0wOyBpIDwgcXVpY2tQaWNrcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uID0gcXVpY2tQaWNrc1tpXTsKLSAgICAgICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZChjb21wb25lbnRTcGVjaWZpY2F0aW9uLmdldE5hbWUoKSk7Ci0gICAgICB9ICAKLSAgICB9Ci0gICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGhpc3RvcnkgPSBtYW5hZ2VyLmdldEhpc3RvcnkoKTsKLSAgICBpZiAoaGlzdG9yeSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoaW50IGk9MDsgaSA8IGhpc3RvcnkubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbiA9IGhpc3RvcnlbaV07Ci0gICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGQoY29tcG9uZW50U3BlY2lmaWNhdGlvbi5nZXROYW1lKCkpOwotICAgICAgfSAgCi0gICAgfQotICAgIAotICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIG5hbWVkQ29tcG9uZW50ID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpbnB1dDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBuYW1lZENvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgYXR0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUpOwotICAgICAgaWYgKGF0dHJWYWx1ZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBhdHRyVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZXQgPSBnZXRDb21wb25lbnRTcGVjRnJvbVF1aWNrUGlja0ZvclZhbHVlKGF0dHJWYWx1ZSwgbWFuYWdlcik7Ci0gICAgICBpZiAocmV0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGQoYXR0clZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KGF0dHJWYWx1ZSk7Ci0gICAgICByZWZOYW1lID0gYXR0clZhbHVlOwotICAgIH0gCi0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAotICB7Ci0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZWxlbWVudDsKLSAgICBwdWJsaWMgUHJvcGVydGllc0NoYW5nZUNvbW1hbmQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbGFiZWwpCi0gICAgewotICAgICAgc3VwZXIoTkxTLmJpbmQob3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfQUNUSU9OX0NIQU5HRSwgbGFiZWwpKTsKLSAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBiZWdpblJlY29yZGluZyhlbGVtZW50KTsKLSAgICAgICAgZG9FeGVjdXRlU3RlcHMoKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZVN0ZXBzKCkKLSAgICB7Ci0gICAgICAKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25TZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMDc3ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb25TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5YTUxDaGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5UeXBlc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblNlY3Rpb24gZXh0ZW5kcyBSZWZhY3RvcmluZ1NlY3Rpb24KLXsKLSAgcHJvdGVjdGVkIFRleHQgbmFtZVRleHQ7Ci0gIHByb3RlY3RlZCBDQ29tYm8gcmVmQ29tYm87Ci0gIGJvb2xlYW4gaXNSZWZlcmVuY2U7Ci0KLSAgcHVibGljIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvblNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgaWYgKGlzUmVmZXJlbmNlKQotICAgIHsKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gUmVmIExhYmVsCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgICBDTGFiZWwgcmVmTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUgKyAiOiIpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgcmVmTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAvLyBSZWYgQ29tYm8KLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotICAgICAgcmVmQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgICAgcmVmQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICByZWZDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgCi0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJlZkNvbWJvLAotICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0FUVFJJQlVURUdST1VQX1JFRlNfX1JFRik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIE5hbWVMYWJlbAotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgICAgQ0xhYmVsIG5hbWVMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfTkFNRSk7Ci0gICAgICBuYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAvLyBOYW1lVGV4dAotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIG5hbWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIG5hbWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICBhcHBseUFsbExpc3RlbmVycyhuYW1lVGV4dCk7Ci0gICAgICAKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobmFtZVRleHQsCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fQVRUUklCVVRFR1JPVVBfX05BTUUpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIFJlZmFjdG9yL3JlbmFtZSBoeXBlcmxpbmsgCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIGNyZWF0ZVJlbmFtZUh5cGVybGluayhjb21wb3NpdGUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotCi0gICAgaWYgKGlzUmVhZE9ubHkpCi0gICAgewotICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQotICAgIFhTRE5hbWVkQ29tcG9uZW50IG5hbWVkQ29tcG9uZW50ID0gKFhTRE5hbWVkQ29tcG9uZW50KWlucHV0OwotICAgIAotICAgIGlmIChpc1JlZmVyZW5jZSkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBuYW1lZENvbXBvbmVudC5nZXRFbGVtZW50KCk7Ci0gICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgYXR0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUpOwotICAgICAgICBpZiAoYXR0clZhbHVlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBhdHRyVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHJlZkNvbWJvLnNldFRleHQoYXR0clZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIHJlZnJlc2ggbmFtZQotICAgICAgbmFtZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lZENvbXBvbmVudC5nZXROYW1lKCk7Ci0gICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lVGV4dC5zZXRUZXh0KG5hbWUpOwotICAgICAgfQotICAgIH0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHN1cGVyLnNldElucHV0KHBhcnQsIHNlbGVjdGlvbik7Ci0gICAgaW5pdCgpOwotICAgIHJlbGF5b3V0KCk7Ci0gICAgCi0gICAgaWYgKGlzUmVmZXJlbmNlKQotICAgIHsKLSAgICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgICAgTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGl0ZW1zID0gaGVscGVyLmdldEdsb2JhbEF0dHJpYnV0ZUdyb3VwcygpOwotICAgICAgaXRlbXMuYWRkKDAsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgcmVmQ29tYm8uc2V0SXRlbXMoKFN0cmluZyBbXSlpdGVtcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlbGF5b3V0KCkKLSAgewotICAgIENvbXBvc2l0ZSBwYXJlbnRDb21wb3NpdGUgPSBjb21wb3NpdGUuZ2V0UGFyZW50KCk7Ci0gICAgcGFyZW50Q29tcG9zaXRlLmdldFBhcmVudCgpLnNldFJlZHJhdyhmYWxzZSk7Ci0KLSAgICBpZiAocGFyZW50Q29tcG9zaXRlICE9IG51bGwgJiYgIXBhcmVudENvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgQ29udHJvbFtdIGNoaWxkcmVuID0gcGFyZW50Q29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBjaGlsZHJlbltpXS5kaXNwb3NlKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm93IGluaXRpYWxpemUgdGhlIG5ldyBoYW5kbGVyCi0gICAgY3JlYXRlQ29udGVudHMocGFyZW50Q29tcG9zaXRlKTsKLSAgICBwYXJlbnRDb21wb3NpdGUuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUsIHRydWUpOwotCi0gICAgLy8gTm93IHR1cm4gcGFpbnRpbmcgYmFjayBvbgotICAgIHBhcmVudENvbXBvc2l0ZS5nZXRQYXJlbnQoKS5zZXRSZWRyYXcodHJ1ZSk7Ci0gICAgcmVmcmVzaCgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkKLSAgewotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gZ3JvdXAgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBpbnB1dDsKLSAgICAgIGlzUmVmZXJlbmNlID0gZ3JvdXAuaXNBdHRyaWJ1dGVHcm91cERlZmluaXRpb25SZWZlcmVuY2UoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBzdXBlci5kb0hhbmRsZUV2ZW50KGV2ZW50KTsKLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IG5hbWVUZXh0KQotICAgIHsKLSAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IG5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgWFNETmFtZWRDb21wb25lbnQgbmFtZWRDb21wb25lbnQgPSAoWFNETmFtZWRDb21wb25lbnQpIGlucHV0OwotICAgICAgICBpZiAoIXZhbGlkYXRlU2VjdGlvbigpKQotICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSBhbiBhY3R1YWwgbmFtZSBjaGFuZ2UgaGFzIHRha2VuIHBsYWNlCi0gICAgICAgIFN0cmluZyBvbGROYW1lID0gbmFtZWRDb21wb25lbnQuZ2V0TmFtZSgpOwotICAgICAgICBpZiAoIW5ld1ZhbHVlLmVxdWFscyhvbGROYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIGNvbW1hbmQgPSBuZXcgVXBkYXRlTmFtZUNvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9SRU5BTUUsIG5hbWVkQ29tcG9uZW50LCBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsICYmIGdldENvbW1hbmRTdGFjaygpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGRvUmVmZXJlbnRpYWxJbnRlZ3JpdHlDaGVjayhuYW1lZENvbXBvbmVudCwgbmV3VmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlU2VjdGlvbigpCi0gIHsKLSAgICBpZiAobmFtZVRleHQgPT0gbnVsbCB8fCBuYW1lVGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLQotICAgIFN0cmluZyBuYW1lID0gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQotICAgIC8vIHZhbGlkYXRlIGFnYWluc3QgTkNOYW1lCi0gICAgaWYgKG5hbWUubGVuZ3RoKCkgPCAxIHx8ICFYTUxDaGFyLmlzVmFsaWROQ05hbWUobmFtZSkpCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLl9VSV9FUlJPUl9JTlZBTElEX05BTUUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IHJlZkNvbWJvKQotICAgIHsKLSAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IHJlZkNvbWJvLmdldFRleHQoKTsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBYU0ROYW1lZENvbXBvbmVudCBuYW1lZENvbXBvbmVudCA9IChYU0ROYW1lZENvbXBvbmVudClpbnB1dDsKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gbmFtZWRDb21wb25lbnQuZ2V0RWxlbWVudCgpOwotCi0gICAgICAgIGlmIChuYW1lZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFLCBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIuZG9XaWRnZXRTZWxlY3RlZChlKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBpZiAobmFtZVRleHQgIT0gbnVsbCAmJiAhbmFtZVRleHQuaXNEaXNwb3NlZCgpKQotICAgICAgcmVtb3ZlTGlzdGVuZXJzKG5hbWVUZXh0KTsKLSAgICBzdXBlci5kaXNwb3NlKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RDb21wbGV4VHlwZUFkdmFuY2VkU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RDb21wbGV4VHlwZUFkdmFuY2VkU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTdhNzJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQ29tcGxleFR5cGVBZHZhbmNlZFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFhTRENvbXBsZXhUeXBlQWR2YW5jZWRTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWSA9ICIiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIENDb21ibyBibG9ja0NvbWJvOwotICBwcm90ZWN0ZWQgQ0NvbWJvIGZpbmFsQ29tYm87Ci0gIHByb3RlY3RlZCBDQ29tYm8gbWl4ZWRDb21ibzsKLSAgcHJvdGVjdGVkIENDb21ibyBhYnN0cmFjdENvbWJvOwotCi0gIHByaXZhdGUgU3RyaW5nIGZpbmFsVmFsdWVzW10gPSB7IEVNUFRZLCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsIC8vJE5PTi1OTFMtMSQKLSAgICAgIFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcsICIjIiArIFhTRENvbnN0YW50cy5BTExfRUxFTUVOVF9UQUcgfTsgLy8kTk9OLU5MUy0xJAotCi0gIHByaXZhdGUgU3RyaW5nIGJsb2NrVmFsdWVzW10gPSB7IEVNUFRZLCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsIC8vJE5PTi1OTFMtMSQKLSAgICAgIFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcsICIjIiArIFhTRENvbnN0YW50cy5BTExfRUxFTUVOVF9UQUcgfTsgLy8kTk9OLU5MUy0xJAotCi0gIHByaXZhdGUgU3RyaW5nIGJvb2xlYW5WYWx1ZXNbXSA9IHsgRU1QVFksIFRSVUUsIEZBTFNFIH07IC8vIFRPRE8gdXNlIHNvbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4dGVybmFsIHN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSBpbnN0ZWFkCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQWJzdHJhY3RMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQotICAgIENMYWJlbCBhYnN0cmFjdExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9BQlNUUkFDVCArICI6Iik7Ci0gICAgYWJzdHJhY3RMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQWJzdHJhY3RDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgYWJzdHJhY3RDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsKLSAgICBhYnN0cmFjdENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgYWJzdHJhY3RDb21iby5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLSAgICBhYnN0cmFjdENvbWJvLnNldEl0ZW1zKGJvb2xlYW5WYWx1ZXMpOwotICAgIGFic3RyYWN0Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBCbG9ja0xhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCi0gICAgQ0xhYmVsIGJsb2NrTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX0JMT0NLICsgIjoiKTsKLSAgICBibG9ja0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBCbG9ja0NvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBibG9ja0NvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIGJsb2NrQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBibG9ja0NvbWJvLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotICAgIGJsb2NrQ29tYm8uc2V0SXRlbXMoYmxvY2tWYWx1ZXMpOwotICAgIGJsb2NrQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBGaW5hbExhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCi0gICAgQ0xhYmVsIGZpbmFsTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX0ZJTkFMICsgIjoiKTsKLSAgICBmaW5hbExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBGaW5hbENvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBmaW5hbENvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIGZpbmFsQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBmaW5hbENvbWJvLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotICAgIGZpbmFsQ29tYm8uc2V0SXRlbXMoZmluYWxWYWx1ZXMpOwotICAgIGZpbmFsQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gTWl4ZWQgTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0KLSAgICBDTGFiZWwgbWl4ZWRMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfTUlYRUQgKyAiOiIpOwotICAgIG1peGVkTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE1peGVkIENvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBtaXhlZENvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIG1peGVkQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBtaXhlZENvbWJvLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotICAgIG1peGVkQ29tYm8uc2V0SXRlbXMoYm9vbGVhblZhbHVlcyk7Ci0gICAgbWl4ZWRDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgaWYgKGUud2lkZ2V0ID09IGJsb2NrQ29tYm8pCi0gICAgewotICAgICAgU3RyaW5nIHZhbHVlID0gYmxvY2tDb21iby5nZXRUZXh0KCk7Ci0gICAgICBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoY29tcGxleFR5cGUuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuQkxPQ0tfQVRUUklCVVRFLCB2YWx1ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX0JMT0NLKTsKLSAgICAgIGNvbW1hbmQuc2V0RGVsZXRlSWZFbXB0eSh0cnVlKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGZpbmFsQ29tYm8pCi0gICAgewotICAgICAgU3RyaW5nIHZhbHVlID0gZmluYWxDb21iby5nZXRUZXh0KCk7Ci0gICAgICBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoY29tcGxleFR5cGUuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuRklOQUxfQVRUUklCVVRFLCB2YWx1ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX0ZJTkFMKTsKLSAgICAgIGNvbW1hbmQuc2V0RGVsZXRlSWZFbXB0eSh0cnVlKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGFic3RyYWN0Q29tYm8pCi0gICAgewotICAgICAgU3RyaW5nIHZhbHVlID0gYWJzdHJhY3RDb21iby5nZXRUZXh0KCk7Ci0gICAgICBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoY29tcGxleFR5cGUuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuQUJTVFJBQ1RfQVRUUklCVVRFLCB2YWx1ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX0FCU1RSQUNUKTsKLSAgICAgIGNvbW1hbmQuc2V0RGVsZXRlSWZFbXB0eSh0cnVlKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IG1peGVkQ29tYm8pCi0gICAgewotICAgICAgU3RyaW5nIHZhbHVlID0gbWl4ZWRDb21iby5nZXRUZXh0KCk7Ci0gICAgICBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoY29tcGxleFR5cGUuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuTUlYRURfQVRUUklCVVRFLCB2YWx1ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX01JWEVEKTsKLSAgICAgIGNvbW1hbmQuc2V0RGVsZXRlSWZFbXB0eSh0cnVlKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIGVuYWJsZWQgPSB0cnVlOyAKLSAgICAgICAgaWYgKGNvbXBsZXhUeXBlLmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEU2NoZW1hKQotICAgICAgICB7Ci0gICAgICAgICAgZW5hYmxlZCA9ICFpc1JlYWRPbmx5OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGJsb2NrQXR0VmFsdWUgPSBjb21wbGV4VHlwZS5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5CTE9DS19BVFRSSUJVVEUpOwotICAgICAgICBpZiAoYmxvY2tBdHRWYWx1ZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYmxvY2tDb21iby5zZXRUZXh0KGJsb2NrQXR0VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGJsb2NrQ29tYm8uc2V0VGV4dChFTVBUWSk7Ci0gICAgICAgIH0KLSAgICAgICAgYmxvY2tDb21iby5zZXRFbmFibGVkKGVuYWJsZWQpOwotCi0gICAgICAgIFN0cmluZyBmaW5hbEF0dFZhbHVlID0gY29tcGxleFR5cGUuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklOQUxfQVRUUklCVVRFKTsKLSAgICAgICAgaWYgKGZpbmFsQXR0VmFsdWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGZpbmFsQ29tYm8uc2V0VGV4dChmaW5hbEF0dFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBmaW5hbENvbWJvLnNldFRleHQoRU1QVFkpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsQ29tYm8uc2V0RW5hYmxlZChlbmFibGVkKTsKLQotICAgICAgICBpZiAoY29tcGxleFR5cGUuZ2V0RWxlbWVudCgpLmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuQUJTVFJBQ1RfQVRUUklCVVRFKSkKLSAgICAgICAgewotICAgICAgICAgIGJvb2xlYW4gYWJzQXR0VmFsdWUgPSBjb21wbGV4VHlwZS5pc0Fic3RyYWN0KCk7Ci0gICAgICAgICAgaWYgKGFic0F0dFZhbHVlKQotICAgICAgICAgICAgYWJzdHJhY3RDb21iby5zZXRUZXh0KFRSVUUpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFic3RyYWN0Q29tYm8uc2V0VGV4dChGQUxTRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYWJzdHJhY3RDb21iby5zZXRUZXh0KEVNUFRZKTsKLSAgICAgICAgfQotICAgICAgICBhYnN0cmFjdENvbWJvLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY29tcGxleFR5cGUuZ2V0RWxlbWVudCgpLmhhc0F0dHJpYnV0ZShYU0RDb25zdGFudHMuTUlYRURfQVRUUklCVVRFKSkKLSAgICAgICAgewotICAgICAgICAgIGJvb2xlYW4gbWl4ZWRWYWx1ZSA9IGNvbXBsZXhUeXBlLmlzTWl4ZWQoKTsKLSAgICAgICAgICBpZiAobWl4ZWRWYWx1ZSkKLSAgICAgICAgICAgIG1peGVkQ29tYm8uc2V0VGV4dChUUlVFKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBtaXhlZENvbWJvLnNldFRleHQoRkFMU0UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG1peGVkQ29tYm8uc2V0VGV4dChFTVBUWSk7Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQ29tcGxleFR5cGVTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRENvbXBsZXhUeXBlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGEyZjUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEQ29tcGxleFR5cGVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlsLlhNTENoYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZUNvbXBsZXhUeXBlRGVyaXZhdGlvbkJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTRENvbXBsZXhUeXBlQmFzZVR5cGVFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERGVyaXZhdGlvbk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFhTRENvbXBsZXhUeXBlU2VjdGlvbiBleHRlbmRzIFJlZmFjdG9yaW5nU2VjdGlvbiBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBUZXh0IG5hbWVUZXh0OwotICBwcm90ZWN0ZWQgQ0NvbWJvIGJhc2VUeXBlQ29tYm87Ci0gIHByb3RlY3RlZCBDQ29tYm8gZGVyaXZlZEJ5Q29tYm87Ci0gIHByaXZhdGUgU3RyaW5nIGRlcml2ZWRCeUNob2ljZXNDb21ib1ZhbHVlc1tdID0geyAiIiwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHIH07IC8vJE5PTi1OTFMtMSQKLQotICBwdWJsaWMgWFNEQ29tcGxleFR5cGVTZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udGVudHMgb2YgdGhlIHByb3BlcnR5IHRhYgotICAgKiAKLSAgICogTmFtZUxhYmVsIE5hbWVUZXh0IER1bW15TGFiZWwgQmFzZVR5cGVMYWJlbCBCYXNlVHlwZUNvbWJvIEJhc2VUeXBlQnV0dG9uCi0gICAqIERlcml2ZWRCeUxhYmVsIERlcml2ZWRCeUNvbWJvCi0gICAqLwotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE5hbWVMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBDTGFiZWwgbmFtZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLlVJX0xBQkVMX05BTUUpOwotICAgIG5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gTmFtZVRleHQKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIG5hbWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGFwcGx5QWxsTGlzdGVuZXJzKG5hbWVUZXh0KTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG5hbWVUZXh0LAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19DT01QTEVYX1RZUEVfX05BTUUpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUmVmYWN0b3IvcmVuYW1lIGh5cGVybGluayAKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBjcmVhdGVSZW5hbWVIeXBlcmxpbmsoY29tcG9zaXRlKTsKLSAgICAKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBCYXNlVHlwZUxhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuVUlfTEFCRUxfSU5IRVJJVF9GUk9NKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQmFzZVR5cGVDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0KLSAgICBiYXNlVHlwZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIGJhc2VUeXBlQ29tYm8uc2V0RWRpdGFibGUoZmFsc2UpOwotICAgIGJhc2VUeXBlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBiYXNlVHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYmFzZVR5cGVDb21ibywKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fQ09NUExFWF9UWVBFX19JTkhFUklUX0ZST00pOwotCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBTcGFjZXIgbGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gRGVyaXZlZEJ5TGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0KLSAgICBDTGFiZWwgZGVyaXZlZEJ5TGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuVUlfTEFCRUxfSU5IRVJJVF9CWSk7IC8vJE5PTi1OTFMtMSQKLSAgICBkZXJpdmVkQnlMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gRGVyaXZlZEJ5Q29tYm8KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCi0gICAgZGVyaXZlZEJ5Q29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIGRlcml2ZWRCeUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgZGVyaXZlZEJ5Q29tYm8uc2V0SXRlbXMoZGVyaXZlZEJ5Q2hvaWNlc0NvbWJvVmFsdWVzKTsKLSAgICBkZXJpdmVkQnlDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRlcml2ZWRCeUNvbWJvLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19DT01QTEVYX1RZUEVfX0lOSEVSSVRfQlkpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gU3BhY2VyIGxhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotICAgIGlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKQotICAgICAgcmV0dXJuOwotCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIG5hbWVUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICBiYXNlVHlwZUNvbWJvLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICBmaWxsVHlwZXNDb21ibygpOwotCi0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIGlucHV0OwotICAgICAgICBTdHJpbmcgbmFtZSA9IGNvbXBsZXhUeXBlLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBib29sZWFuIGlzQW5vbnltb3VzVHlwZSA9IG5hbWUuZXF1YWxzKCIiKSA/IHRydWUgOiBmYWxzZTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoaXNBbm9ueW1vdXNUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZVRleHQuc2V0VGV4dCgiKiphbm9ueW1vdXMqKiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgbmFtZVRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG5hbWVUZXh0LnNldFRleHQobmFtZSk7Ci0gICAgICAgICAgbmFtZVRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiBiYXNlVHlwZURlZmluaXRpb24gPSBjb21wbGV4VHlwZS5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgU3RyaW5nIGJhc2VUeXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKGJhc2VUeXBlRGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYmFzZVR5cGUgPSBiYXNlVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpOwotICAgICAgICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJhc2VUeXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoYmFzZVR5cGUuZXF1YWxzKCJhbnlUeXBlIikpCi0gICAgICAgICAgewotICAgICAgICAgICAgYmFzZVR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBiYXNlVHlwZUNvbWJvLnNldFRleHQoYmFzZVR5cGUpOwotCi0gICAgICAgIGRlcml2ZWRCeUNvbWJvLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGludCBkZXJpdmF0aW9uTWV0aG9kID0gY29tcGxleFR5cGUuZ2V0RGVyaXZhdGlvbk1ldGhvZCgpLmdldFZhbHVlKCk7Ci0gICAgICAgIGlmIChkZXJpdmF0aW9uTWV0aG9kID09IFhTRERlcml2YXRpb25NZXRob2QuRVhURU5TSU9OKQotICAgICAgICB7Ci0gICAgICAgICAgZGVyaXZlZEJ5Q29tYm8uc2V0VGV4dChYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChkZXJpdmF0aW9uTWV0aG9kID09IFhTRERlcml2YXRpb25NZXRob2QuUkVTVFJJQ1RJT04pCi0gICAgICAgIHsKLSAgICAgICAgICBkZXJpdmVkQnlDb21iby5zZXRUZXh0KFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gYmFzZVR5cGVDb21ibykKLSAgICB7Ci0gICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgIGlmIChlZGl0b3IgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgbWFuYWdlciA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RDb21wbGV4VHlwZUJhc2VUeXBlRWRpdE1hbmFnZXIuY2xhc3MpOyAgICAKLQotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IGJhc2VUeXBlQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBuZXdWYWx1ZTsKLSAgICAgIElDb21wb25lbnREaWFsb2cgZGlhbG9nPSBudWxsOwotICAgICAgaWYgKCBzZWxlY3Rpb24uZXF1YWxzKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQlJPV1NFKSkKLSAgICAgIHsKLSAgICAgICAgZGlhbG9nID0gbWFuYWdlci5nZXRCcm93c2VEaWFsb2coKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBzZWxlY3Rpb24uZXF1YWxzKE1lc3NhZ2VzLl9VSV9BQ1RJT05fTkVXKSkKLSAgICAgIHsKLSAgICAgICAgZGlhbG9nID0gbWFuYWdlci5nZXROZXdEaWFsb2coKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRpYWxvZyAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKSA9PSBXaW5kb3cuT0spCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdWYWx1ZSA9IGRpYWxvZy5nZXRTZWxlY3RlZENvbXBvbmVudCgpOwotICAgICAgICAgIG1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKGlucHV0LCBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmVmcmVzaCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGRlcml2ZWRCeUNvbWJvKQotICAgIHsKLSAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIGlucHV0OwotICAgICAgU3RyaW5nIHZhbHVlID0gZGVyaXZlZEJ5Q29tYm8uZ2V0VGV4dCgpOwotICAgICAgQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUNvbXBsZXhUeXBlRGVyaXZhdGlvbkJ5KGNvbXBsZXhUeXBlLCB2YWx1ZSk7Ci0gICAgICAKLSAgICAgIGlmIChnZXRDb21tYW5kU3RhY2soKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5kb1dpZGdldFNlbGVjdGVkKGUpOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIHN1cGVyLmRvSGFuZGxlRXZlbnQoZXZlbnQpOwotICAgIGlmIChldmVudC53aWRnZXQgPT0gbmFtZVRleHQpCi0gICAgewotICAgICAgaWYgKCFuYW1lVGV4dC5nZXRFZGl0YWJsZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IG5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgWFNETmFtZWRDb21wb25lbnQgbmFtZWRDb21wb25lbnQgPSAoWFNETmFtZWRDb21wb25lbnQpIGlucHV0OwotCi0gICAgICAgIGlmICghdmFsaWRhdGVTZWN0aW9uKCkpCi0gICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIGFuIGFjdHVhbCBuYW1lIGNoYW5nZSBoYXMgdGFrZW4gcGxhY2UKLSAgICAgICAgU3RyaW5nIG9sZE5hbWUgPSBuYW1lZENvbXBvbmVudC5nZXROYW1lKCk7Ci0gICAgICAgIGlmICghbmV3VmFsdWUuZXF1YWxzKG9sZE5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgY29tbWFuZCA9IG5ldyBVcGRhdGVOYW1lQ29tbWFuZChvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9BQ1RJT05fUkVOQU1FLCBuYW1lZENvbXBvbmVudCwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCAmJiBnZXRDb21tYW5kU3RhY2soKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgfQotICAgICAgICAvLyBkb1JlZmVyZW50aWFsSW50ZWdyaXR5Q2hlY2sobmFtZWRDb21wb25lbnQsIG5ld1ZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVNlY3Rpb24oKQotICB7Ci0gICAgaWYgKG5hbWVUZXh0ID09IG51bGwgfHwgbmFtZVRleHQuaXNEaXNwb3NlZCgpKQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0KLSAgICBTdHJpbmcgbmFtZSA9IG5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0KLSAgICAvLyB2YWxpZGF0ZSBhZ2FpbnN0IE5DTmFtZQotICAgIGlmIChuYW1lLmxlbmd0aCgpIDwgMSB8fCAhWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKG5hbWUpKQotICAgIHsKLSAgICAgIHNldEVycm9yTWVzc2FnZShvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9FUlJPUl9JTlZBTElEX05BTUUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGZpbGxUeXBlc0NvbWJvKCkKLSAgewotICAgIGJhc2VUeXBlQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgYmFzZVR5cGVDb21iby5hZGQoTWVzc2FnZXMuX1VJX0FDVElPTl9CUk9XU0UpOwotICAgIGJhc2VUeXBlQ29tYm8uYWRkKE1lc3NhZ2VzLl9VSV9BQ1RJT05fTkVXKTsKLSAgICAvLyBBZGQgdGhlIGN1cnJlbnQgVHlwZSBvZiB0aGlzIGF0dHJpYnV0ZSBpZiBuZWVkZWQKLSAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiBiYXNlVHlwZSA9IGNvbXBsZXhUeXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgaWYgKGJhc2VUeXBlICE9IG51bGwgJiYgYmFzZVR5cGUuZ2V0UU5hbWUoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBjdXJyZW50VHlwZU5hbWUgPSBiYXNlVHlwZS5nZXRRTmFtZSh4c2RTY2hlbWEpOyAvL25vIHByZWZpeAotICAgICAgaWYgKGN1cnJlbnRUeXBlTmFtZSAhPSBudWxsICYmICFjdXJyZW50VHlwZU5hbWUuZXF1YWxzKCJhbnlUeXBlIikpCi0gICAgICAgIGJhc2VUeXBlQ29tYm8uYWRkKGN1cnJlbnRUeXBlTmFtZSk7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNERWxlbWVudERlY2xhcmF0aW9uQWR2YW5jZWRTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREVsZW1lbnREZWNsYXJhdGlvbkFkdmFuY2VkU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTVkYjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNERWxlbWVudERlY2xhcmF0aW9uQWR2YW5jZWRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIENhcnZlciAtIFNUQVIgLSBhZGRlZCBuaWxsYWJsZSBhZHZhbmNlZCB0YWIgb3B0aW9uLCBidWcgMjA5MzU2Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5kaWFsb2dzLkNvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlQXR0cmlidXRlVmFsdWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTRFN1YnN0aXR1dGlvbkdyb3VwRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNERWxlbWVudERlY2xhcmF0aW9uQWR2YW5jZWRTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWSA9ICIiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIENDb21ibyBibG9ja0NvbWJvOwotICBwcm90ZWN0ZWQgQ0NvbWJvIGZpbmFsQ29tYm87Ci0gIHByb3RlY3RlZCBDQ29tYm8gYWJzdHJhY3RDb21ibzsKLSAgcHJvdGVjdGVkIENDb21ibyBzdWJzdEdyb3VwQ29tYm87Ci0gIHByb3RlY3RlZCBDQ29tYm8gbmlsbGFibGVDb21ibzsKLQotICBwcml2YXRlIFN0cmluZyBibG9ja1ZhbHVlc1tdID0geyBFTVBUWSwgIiMiICsgWFNEQ29uc3RhbnRzLkFMTF9FTEVNRU5UX1RBRywgLy8kTk9OLU5MUy0xJAotICAgICAgWFNEQ29uc3RhbnRzLkVYVEVOU0lPTl9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLAotICAgICAgInN1YnN0aXR1dGlvbiIgfTsgLy8kTk9OLU5MUy0xJAotCi0gIHByaXZhdGUgU3RyaW5nIGZpbmFsVmFsdWVzW10gPSB7IEVNUFRZLCAiIyIgKyBYU0RDb25zdGFudHMuQUxMX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHLCAvLyROT04tTkxTLTEkCi0gICAgICBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcgfTsgLy8kTk9OLU5MUy0xJAotCi0gIHByaXZhdGUgU3RyaW5nIGJvb2xlYW5WYWx1ZXNbXSA9IHsgRU1QVFksIFRSVUUsIEZBTFNFIH07IAotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQWJzdHJhY3RMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQotICAgIENMYWJlbCBhYnN0cmFjdExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX0FCU1RSQUNUICsgIjoiKTsKLSAgICBhYnN0cmFjdExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBBYnN0cmFjdENvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBhYnN0cmFjdENvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIGFic3RyYWN0Q29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBhYnN0cmFjdENvbWJvLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotICAgIGFic3RyYWN0Q29tYm8uc2V0SXRlbXMoYm9vbGVhblZhbHVlcyk7Ci0gICAgYWJzdHJhY3RDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEJsb2NrTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0KLSAgICBDTGFiZWwgYmxvY2tMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9CTE9DSyArICI6Iik7Ci0gICAgYmxvY2tMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQmxvY2tDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgYmxvY2tDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsKLSAgICBibG9ja0NvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgYmxvY2tDb21iby5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLSAgICBibG9ja0NvbWJvLnNldEl0ZW1zKGJsb2NrVmFsdWVzKTsKLSAgICBibG9ja0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gRmluYWxMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQotICAgIENMYWJlbCBmaW5hbExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX0ZJTkFMICsgIjoiKTsKLSAgICBmaW5hbExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBGaW5hbENvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBmaW5hbENvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIGZpbmFsQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBmaW5hbENvbWJvLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotICAgIGZpbmFsQ29tYm8uc2V0SXRlbXMoZmluYWxWYWx1ZXMpOwotICAgIGZpbmFsQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBTdWJzdGl0dXRpb24gR3JvdXAgTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0KLSAgICBDTGFiZWwgc3ViR3JvdXBMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9TVUJTVElUVVRJT05fR1JPVVAgKyAiOiIpOwotICAgIHN1Ykdyb3VwTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFN1YnN0aXR1dGlvbiBHcm91cCBDb21ibwotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgc3Vic3RHcm91cENvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIHN1YnN0R3JvdXBDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHN1YnN0R3JvdXBDb21iby5zZXRFZGl0YWJsZSh0cnVlKTsKLSAgICBzdWJzdEdyb3VwQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgYXBwbHlBbGxMaXN0ZW5lcnMoc3Vic3RHcm91cENvbWJvKTsKLSAgICAKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBOaWxsYWJsZSBMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQotICAgIENMYWJlbCBuaWxsYWJsZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX05JTExBQkxFICsgIjoiKTsKLSAgICBuaWxsYWJsZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBOaWxsYWJsZUNvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBuaWxsYWJsZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUpOwotICAgIG5pbGxhYmxlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBuaWxsYWJsZUNvbWJvLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotICAgIG5pbGxhYmxlQ29tYm8uc2V0SXRlbXMoYm9vbGVhblZhbHVlcyk7Ci0gICAgbmlsbGFibGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBzdWJzdEdyb3VwQ29tYm8pCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZURlYyA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGlucHV0OwotICAgICAgU3RyaW5nIHZhbHVlID0gc3Vic3RHcm91cENvbWJvLmdldFRleHQoKTsKLSAgICAgIFN0cmluZyBvbGRWYWx1ZSA9IGVsZURlYy5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5TVUJTVElUVVRJT05HUk9VUF9BVFRSSUJVVEUpOwotICAgICAgaWYgKG9sZFZhbHVlID09IG51bGwpCi0gICAgICAgIG9sZFZhbHVlID0gRU1QVFk7Ci0gICAgICBpZiAodmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoZWxlRGVjLmdldEVsZW1lbnQoKSwgWFNEQ29uc3RhbnRzLlNVQlNUSVRVVElPTkdST1VQX0FUVFJJQlVURSwgdmFsdWUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX1NVQlNUSVRVVElPTl9HUk9VUCk7Ci0gICAgICBjb21tYW5kLnNldERlbGV0ZUlmRW1wdHkodHJ1ZSk7Ci0gICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBibG9ja0NvbWJvKQotICAgIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVEZWMgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpbnB1dDsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IGJsb2NrQ29tYm8uZ2V0VGV4dCgpOwotCi0gICAgICBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQoZWxlRGVjLmdldEVsZW1lbnQoKSwgWFNEQ29uc3RhbnRzLkJMT0NLX0FUVFJJQlVURSwgdmFsdWUsIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0xBQkVMX0JMT0NLKTsKLSAgICAgIGNvbW1hbmQuc2V0RGVsZXRlSWZFbXB0eSh0cnVlKTsKLSAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IGZpbmFsQ29tYm8pCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZURlYyA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGlucHV0OwotICAgICAgU3RyaW5nIHZhbHVlID0gZmluYWxDb21iby5nZXRUZXh0KCk7Ci0KLSAgICAgIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChlbGVEZWMuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuRklOQUxfQVRUUklCVVRFLCB2YWx1ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfRklOQUwpOwotICAgICAgY29tbWFuZC5zZXREZWxldGVJZkVtcHR5KHRydWUpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gYWJzdHJhY3RDb21ibykKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlRGVjID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaW5wdXQ7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBhYnN0cmFjdENvbWJvLmdldFRleHQoKTsKLSAgICAgIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChlbGVEZWMuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuQUJTVFJBQ1RfQVRUUklCVVRFLCB2YWx1ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfQUJTVFJBQ1QpOwotICAgICAgY29tbWFuZC5zZXREZWxldGVJZkVtcHR5KHRydWUpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gc3Vic3RHcm91cENvbWJvKQotICAgIHsKLSAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgaWYgKGVkaXRvciA9PSBudWxsKSByZXR1cm47Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBtYW5hZ2VyID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTRFN1YnN0aXR1dGlvbkdyb3VwRWRpdE1hbmFnZXIuY2xhc3MpOyAgICAKLQotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IHN1YnN0R3JvdXBDb21iby5nZXRUZXh0KCk7Ci0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIG5ld1ZhbHVlOwotICAgICAgSUNvbXBvbmVudERpYWxvZyBkaWFsb2c9IG51bGw7Ci0gICAgICBpZiAoIHNlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0FDVElPTl9CUk9XU0UpKQotICAgICAgewotICAgICAgICBkaWFsb2cgPSBtYW5hZ2VyLmdldEJyb3dzZURpYWxvZygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHNlbGVjdGlvbi5lcXVhbHMoTWVzc2FnZXMuX1VJX0FDVElPTl9ORVcpKQotICAgICAgewotICAgICAgICBkaWFsb2cgPSBtYW5hZ2VyLmdldE5ld0RpYWxvZygpOwotICAgICAgfQotCi0gICAgICBpZiAoZGlhbG9nICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChkaWFsb2cuY3JlYXRlQW5kT3BlbigpID09IFdpbmRvdy5PSykKLSAgICAgICAgewotICAgICAgICAgIG5ld1ZhbHVlID0gZGlhbG9nLmdldFNlbGVjdGVkQ29tcG9uZW50KCk7Ci0gICAgICAgICAgbWFuYWdlci5tb2RpZnlDb21wb25lbnRSZWZlcmVuY2UoaW5wdXQsIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzdWJzdEdyb3VwQ29tYm8uc2V0VGV4dCgiIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgLy91c2UgdGhlIHZhbHVlIGZyb20gc2VsZWN0ZWQgcXVpY2tQaWNrIGl0ZW0KLSAgICAgIHsKLSAgICAgICAgbmV3VmFsdWUgPSBnZXRDb21wb25lbnRTcGVjRnJvbVF1aWNrUGlja0ZvclZhbHVlKHNlbGVjdGlvbiwgbWFuYWdlcik7Ci0gICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKQotICAgICAgICAgIG1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKGlucHV0LCBuZXdWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IG5pbGxhYmxlQ29tYm8pCi0gICAgewotICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlRGVjID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaW5wdXQ7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IG5pbGxhYmxlQ29tYm8uZ2V0VGV4dCgpOwotCi0gICAgICAgIFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChlbGVEZWMuZ2V0RWxlbWVudCgpLCBYU0RDb25zdGFudHMuTklMTEFCTEVfQVRUUklCVVRFLCB2YWx1ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfTklMTEFCTEUpOwotICAgICAgICBjb21tYW5kLnNldERlbGV0ZUlmRW1wdHkodHJ1ZSk7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgfQotCi0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2goKTsKLSAgICBmaWxsU3Vic3RpdHV0aW9uR3JvdXBDb21ibygpOwotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlRGVjID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaW5wdXQ7Ci0KLSAgICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQoIWlzUmVhZE9ubHkpOwotICAgICAgICBpZiAoZWxlRGVjLmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNEU2NoZW1hKSAvLyBnbG9iYWwgZWxlbWVudAotICAgICAgICB7Ci0gICAgICAgICAgYWJzdHJhY3RDb21iby5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgIGZpbmFsQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICBzdWJzdEdyb3VwQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICBuaWxsYWJsZUNvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYWJzdHJhY3RDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICBmaW5hbENvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgIHN1YnN0R3JvdXBDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvLyBOaWxsYWJsZSB3aGVuIHVzZWQgaW4gYSBsb2NhbCBlbGVtZW50IGRlY2xhcmF0aW9uIGNhbid0IGJlIHNldCBvbgotICAgICAgICAgIC8vIG9uIGVsZW1lbnRzIHRoYXQgdXNlIEByZWYuCi0gICAgICAgCSAgbmlsbGFibGVDb21iby5zZXRFbmFibGVkKCFlbGVEZWMuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBlbGVEZWMuZ2V0RWxlbWVudCgpOwotICAgICAgICBTdHJpbmcgYmxvY2tBdHRWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5CTE9DS19BVFRSSUJVVEUpOwotICAgICAgICBpZiAoYmxvY2tBdHRWYWx1ZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYmxvY2tDb21iby5zZXRUZXh0KGJsb2NrQXR0VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGJsb2NrQ29tYm8uc2V0VGV4dChFTVBUWSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gV2Ugc2hvdWxkIHNob3cgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgcmVnYXJkbGVzcyBpZiBpdCBpcyBpbnZhbGlkCi0gICAgICAgIC8vIGllLiBhcyB0aGUgdXNlciBzdGFydHMgdHlwaW5nICd0cnVlJyBpbiB0aGUgc291cmNlLCB0aGUgcHJvcGVydGllcyB2aWV3Ci0gICAgICAgIC8vIHNob3VsZCBzaG93IHRoZSB2YWx1ZSBkeW5hbWljYWxseQotICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5JTExBQkxFX0FUVFJJQlVURSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgYXR0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5JTExBQkxFX0FUVFJJQlVURSk7Ci0gICAgICAgICAgbmlsbGFibGVDb21iby5zZXRUZXh0KGF0dHJWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmlsbGFibGVDb21iby5zZXRUZXh0KEVNUFRZKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgU3RyaW5nIGZpbmFsQXR0VmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuRklOQUxfQVRUUklCVVRFKTsKLSAgICAgICAgaWYgKGZpbmFsQXR0VmFsdWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGZpbmFsQ29tYm8uc2V0VGV4dChmaW5hbEF0dFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBmaW5hbENvbWJvLnNldFRleHQoRU1QVFkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFhTRENvbnN0YW50cy5BQlNUUkFDVF9BVFRSSUJVVEUpKQotICAgICAgICB7Ci0gICAgICAgICAgYWJzdHJhY3RDb21iby5zZXRUZXh0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5BQlNUUkFDVF9BVFRSSUJVVEUpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgYWJzdHJhY3RDb21iby5zZXRUZXh0KEVNUFRZKTsKLQotICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlNVQlNUSVRVVElPTkdST1VQX0FUVFJJQlVURSkpCi0gICAgICAgIHsKLSAgICAgICAgICBzdWJzdEdyb3VwQ29tYm8uc2V0VGV4dChlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuU1VCU1RJVFVUSU9OR1JPVVBfQVRUUklCVVRFKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgc3Vic3RHcm91cENvbWJvLnNldFRleHQoRU1QVFkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGZpbGxTdWJzdGl0dXRpb25Hcm91cENvbWJvKCkKLSAgewotICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIG1hbmFnZXIgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNEU3Vic3RpdHV0aW9uR3JvdXBFZGl0TWFuYWdlci5jbGFzcyk7Ci0gICAgaWYgKG1hbmFnZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gaXRlbXMgPSBtYW5hZ2VyLmdldFF1aWNrUGlja3MoKTsKLQotICAgICAgc3Vic3RHcm91cENvbWJvLnJlbW92ZUFsbCgpOwotICAgICAgc3Vic3RHcm91cENvbWJvLmFkZChNZXNzYWdlcy5fVUlfQUNUSU9OX0JST1dTRSk7Ci0gICAgICBzdWJzdEdyb3VwQ29tYm8uYWRkKE1lc3NhZ2VzLl9VSV9BQ1RJT05fTkVXKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHN1YnN0R3JvdXBDb21iby5hZGQoaXRlbXNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICAgIC8vIEFkZCB0aGUgY3VycmVudCBzdWJzdGl0dXRpb24gZ3JvdXAgaWYgbmVlZGVkCi0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gbmFtZWRDb21wb25lbnQgPSAoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaW5wdXQpLmdldFN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24oKTsKLSAgICAgIGlmIChuYW1lZENvbXBvbmVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHJldCA9IGdldENvbXBvbmVudFNwZWNGcm9tUXVpY2tQaWNrRm9yVmFsdWUobmFtZWRDb21wb25lbnQuZ2V0TmFtZSgpLCBtYW5hZ2VyKTsKLSAgICAgICAgaWYgKHJldCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc3Vic3RHcm91cENvbWJvLmFkZChuYW1lZENvbXBvbmVudC5nZXRRTmFtZSh4c2RTY2hlbWEpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGdldENvbXBvbmVudFNwZWNGcm9tUXVpY2tQaWNrRm9yVmFsdWUoU3RyaW5nIHZhbHVlLCBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBlZGl0TWFuYWdlcikKLSAgewotICAgIGlmIChlZGl0TWFuYWdlciAhPSBudWxsKQotICAgIHsgIAotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIHF1aWNrUGlja3MgPSBlZGl0TWFuYWdlci5nZXRRdWlja1BpY2tzKCk7Ci0gICAgICBpZiAocXVpY2tQaWNrcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBxdWlja1BpY2tzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uID0gcXVpY2tQaWNrc1tpXTsKLSAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHMoY29tcG9uZW50U3BlY2lmaWNhdGlvbi5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRTcGVjaWZpY2F0aW9uOwotICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgIH0gIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREVsZW1lbnREZWNsYXJhdGlvblNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNERWxlbWVudERlY2xhcmF0aW9uU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWJmZDM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNERWxlbWVudERlY2xhcmF0aW9uU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5YTUxDaGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWR0LmVkaXQuQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5JQ29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy5OZXdUeXBlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLnNlYXJjaC5YU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RFbGVtZW50RGVjbGFyYXRpb25TZWN0aW9uIGV4dGVuZHMgTXVsdGlwbGljaXR5U2VjdGlvbgotewotICBwcm90ZWN0ZWQgVGV4dCBuYW1lVGV4dDsKLSAgcHJvdGVjdGVkIENDb21ibyB0eXBlQ29tYm87Ci0gIHByb3RlY3RlZCBDQ29tYm8gY29tcG9uZW50TmFtZUNvbWJvOwotICBib29sZWFuIGlzRWxlbWVudFJlZmVyZW5jZTsKLSAgcHJvdGVjdGVkIFN0cmluZyB0eXBlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLSAgcHJpdmF0ZSBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbjsKLQotICBwdWJsaWMgWFNERWxlbWVudERlY2xhcmF0aW9uU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnRlbnRzIG9mIHRoZSBwcm9wZXJ0eSB0YWIKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLSAgICBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpOwotCi0gICAgU3RyaW5nIHR5cGVMYWJlbCA9IE1lc3NhZ2VzLlVJX0xBQkVMX1RZUEU7IC8vJE5PTi1OTFMtMSQKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIE5hbWVMYWJlbAotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgICBDTGFiZWwgbmFtZUxhYmVsID0gZmFjdG9yeS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi51dGlsLk1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FKTsKLSAgICAgIG5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIE5hbWVUZXh0Ci0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgbmFtZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgbmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgIG5hbWVUZXh0LnNldEVuYWJsZWQoIWlzRWxlbWVudFJlZmVyZW5jZSk7Ci0gICAgICBhcHBseUFsbExpc3RlbmVycyhuYW1lVGV4dCk7ICAgCi0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG5hbWVUZXh0LAotICAgICAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fRUxFTUVOVF9fTkFNRSk7Ci0gICAgIAotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAvLyBSZWZhY3Rvci9yZW5hbWUgaHlwZXJsaW5rIAotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICBjcmVhdGVSZW5hbWVIeXBlcmxpbmsoY29tcG9zaXRlKTsKLSAgICAgIHNldFJlbmFtZUh5cGVybGlua0VuYWJsZWQoIWlzRWxlbWVudFJlZmVyZW5jZSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBSZWYgTGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBpZiAoaXNFbGVtZW50UmVmZXJlbmNlKQotICAgIHsKLSAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgICBDTGFiZWwgcmVmTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfTEFCRUxfUkVGRVJFTkNFKTsKLSAgICAgIHJlZkxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gUmVmIENvbWJvCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0KLSAgICAgIGNvbXBvbmVudE5hbWVDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgIAotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb25lbnROYW1lQ29tYm8sCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fRUxFTUVOVF9fUkVGRVJFTkNFKTsKLQotICAgICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIHR5cGVMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCB0eXBlTGFiZWwpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gdHlwZUNvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotICAgIHR5cGVDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsgLy8kTk9OLU5MUy0xJAotICAgIHR5cGVDb21iby5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgdHlwZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgdHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodHlwZUNvbWJvLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19FTEVNRU5UX19UWVBFKTsKLSAgICAKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBEdW1teUxhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIG1pbiBwcm9wZXJ0eQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIE1lc3NhZ2VzLlVJX0xBQkVMX01JTk9DQ1VSUyk7Ci0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCi0gICAgbWluQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIG1pbkNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgbWluQ29tYm8uYWRkKCIwIik7IC8vJE5PTi1OTFMtMSQKLSAgICBtaW5Db21iby5hZGQoIjEiKTsgLy8kTk9OLU5MUy0xJAotICAgIGFwcGx5QWxsTGlzdGVuZXJzKG1pbkNvbWJvKTsKLSAgICBtaW5Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG1pbkNvbWJvLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19FTEVNRU5UX19NSU5fT0NDVVJFTkNFKTsgICAgCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBEdW1teUxhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIG1heCBwcm9wZXJ0eQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5VSV9MQUJFTF9NQVhPQ0NVUlMpOwotCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotICAgIG1heENvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICBtYXhDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIG1heENvbWJvLmFkZCgiMCIpOyAvLyROT04tTkxTLTEkCi0gICAgbWF4Q29tYm8uYWRkKCIxIik7IC8vJE5PTi1OTFMtMSQKLSAgICBtYXhDb21iby5hZGQoInVuYm91bmRlZCIpOyAvLyROT04tTkxTLTEkCi0gICAgYXBwbHlBbGxMaXN0ZW5lcnMobWF4Q29tYm8pOwotICAgIG1heENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobWF4Q29tYm8sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX0VMRU1FTlRfX01BWF9PQ0NVUkVOQ0UpOyAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc3VwZXIuc2V0SW5wdXQocGFydCwgc2VsZWN0aW9uKTsKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgIGluaXQoKTsKLSAgICByZWxheW91dCgpOwotICAgIAotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpCi0gIHsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGlucHV0OwotICAgICAgaXNFbGVtZW50UmVmZXJlbmNlID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCk7Ci0KLSAgICAgIHR5cGVEZWZpbml0aW9uID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBmaWxsVHlwZXNDb21ibygpCi0gIHsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLSAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBtYW5hZ2VyID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcyk7Ci0gICAgaWYgKG1hbmFnZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gaXRlbXMgPSBtYW5hZ2VyLmdldFF1aWNrUGlja3MoKTsKLQotICAgICAgdHlwZUNvbWJvLnJlbW92ZUFsbCgpOwotICAgICAgdHlwZUNvbWJvLmFkZChNZXNzYWdlcy5fVUlfQUNUSU9OX0JST1dTRSk7Ci0gICAgICB0eXBlQ29tYm8uYWRkKE1lc3NhZ2VzLl9VSV9BQ1RJT05fTkVXKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHR5cGVDb21iby5hZGQoaXRlbXNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICAgIC8vIEFkZCB0aGUgY3VycmVudCBUeXBlIG9mIHRoaXMgZWxlbWVudCBpZiBuZWVkZWQKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBuYW1lZENvbXBvbmVudCA9ICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpbnB1dCkuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0gbmFtZWRDb21wb25lbnQuZ2V0VHlwZSgpOwotICAgICAgaWYgKHRkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBjdXJyZW50VHlwZU5hbWUgPSB0ZC5nZXRRTmFtZSh4c2RTY2hlbWEpOwotICAgICAgICBpZiAoY3VycmVudFR5cGVOYW1lID09IG51bGwpIC8vIGFub255bW91cyB0eXBlCi0gICAgICAgICAgY3VycmVudFR5cGVOYW1lID0gIioqQW5vbnltb3VzKioiOwotICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIHJldCA9IGdldENvbXBvbmVudFNwZWNGcm9tUXVpY2tQaWNrRm9yVmFsdWUoY3VycmVudFR5cGVOYW1lLCBtYW5hZ2VyKTsKLSAgICAgICAgaWYgKHJldCA9PSBudWxsICYmIGN1cnJlbnRUeXBlTmFtZSAhPSBudWxsKSAvLyBub3QgaW4gcXVpY2tQaWNrCi0gICAgICAgIHsKLSAgICAgICAgICB0eXBlQ29tYm8uYWRkKGN1cnJlbnRUeXBlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBnZXRDb21wb25lbnRTcGVjRnJvbVF1aWNrUGlja0ZvclZhbHVlKFN0cmluZyB2YWx1ZSwgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgZWRpdE1hbmFnZXIpCi0gIHsKLSAgICBpZiAoZWRpdE1hbmFnZXIgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBxdWlja1BpY2tzID0gZWRpdE1hbmFnZXIuZ2V0UXVpY2tQaWNrcygpOwotICAgICAgaWYgKHF1aWNrUGlja3MgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgcXVpY2tQaWNrcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbiA9IHF1aWNrUGlja3NbaV07Ci0gICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzKGNvbXBvbmVudFNwZWNpZmljYXRpb24uZ2V0TmFtZSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50U3BlY2lmaWNhdGlvbjsKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQotICAgIHN1cGVyLnJlZnJlc2goKTsKLQotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb24gPSAoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaW5wdXQpLmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCk7Ci0KLSAgICAvLyByZWZyZXNoIG5hbWUKLSAgICBuYW1lVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIHR5cGVDb21iby5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBuYW1lID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldE5hbWUoKTsKLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIG5hbWVUZXh0LnNldFRleHQobmFtZSk7Ci0gICAgfQotICAgIAotICAgIGlmIChpc0VsZW1lbnRSZWZlcmVuY2UpCi0gICAgewotICAgICAgcmVmcmVzaFJlZkNvbWJvKCk7Ci0gICAgfQotCi0gICAgLy8gcmVmcmVzaCB0eXBlCi0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBib29sZWFuIGlzQW5vbnltb3VzID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkgIT0gbnVsbDsKLSAgICAgICAgLy9YU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gWFNEVXRpbHMuZ2V0UmVzb2x2ZWRUeXBlKHhzZEVsZW1lbnREZWNsYXJhdGlvbik7Ci0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgCi0gICAgICAgIGlmICh0eXBlRGVmICE9IG51bGwpCi0gICAgICAgICAgdHlwZU5hbWUgPSB0eXBlRGVmLmdldFFOYW1lKHhzZFNjaGVtYSk7Ci0KLSAgICAgICAgaWYgKHR5cGVOYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0eXBlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBmaWxsVHlwZXNDb21ibygpOwotICAgICAgICBpZiAoaXNBbm9ueW1vdXMpCi0gICAgICAgIHsKLSAgICAgICAgCXR5cGVDb21iby5zZXRUZXh0KCIqKkFub255bW91cyoqIik7Ci0gICAgICAgICAgdHlwZU5hbWUgPSAiKipBbm9ueW1vdXMqKiI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHR5cGVEZWZpbml0aW9uICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHlwZUNvbWJvLnNldFRleHQodHlwZU5hbWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgdHlwZUNvbWJvLnNldFRleHQoTWVzc2FnZXMuVUlfTk9fVFlQRSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtYXhDb21iby5zZXRFbmFibGVkKCF4c2RFbGVtZW50RGVjbGFyYXRpb24uaXNHbG9iYWwoKSB8fCBpc0VsZW1lbnRSZWZlcmVuY2UpOwotICAgICAgICBtaW5Db21iby5zZXRFbmFibGVkKCF4c2RFbGVtZW50RGVjbGFyYXRpb24uaXNHbG9iYWwoKSB8fCBpc0VsZW1lbnRSZWZlcmVuY2UpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIHJlZnJlc2ggbWluIG1heAotICAgIHJlZnJlc2hNaW5NYXgoKTsKLQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gdHlwZUNvbWJvKQotICAgIHsKLSAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgaWYgKGVkaXRvciA9PSBudWxsKSByZXR1cm47Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlciBtYW5hZ2VyID0gKENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyKWVkaXRvci5nZXRBZGFwdGVyKFhTRFR5cGVSZWZlcmVuY2VFZGl0TWFuYWdlci5jbGFzcyk7ICAgIAotCi0gICAgICBTdHJpbmcgc2VsZWN0aW9uID0gdHlwZUNvbWJvLmdldFRleHQoKTsKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gbmV3VmFsdWU7Ci0gICAgICBJQ29tcG9uZW50RGlhbG9nIGRpYWxvZz0gbnVsbDsKLSAgICAgIGlmICggc2VsZWN0aW9uLmVxdWFscyhNZXNzYWdlcy5fVUlfQUNUSU9OX0JST1dTRSkpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0QnJvd3NlRGlhbG9nKCk7Ci0gICAgICAgICgoWFNEU2VhcmNoTGlzdERpYWxvZ0RlbGVnYXRlKSBkaWFsb2cpLnNob3dDb21wbGV4VHlwZXModHJ1ZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggc2VsZWN0aW9uLmVxdWFscyhNZXNzYWdlcy5fVUlfQUNUSU9OX05FVykpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0TmV3RGlhbG9nKCk7Ci0gICAgICAgICgoTmV3VHlwZURpYWxvZykgZGlhbG9nKS5hbGxvd0NvbXBsZXhUeXBlKHRydWUpOwotICAgICAgfQotCi0gICAgICBpZiAoZGlhbG9nICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChkaWFsb2cuY3JlYXRlQW5kT3BlbigpID09IFdpbmRvdy5PSykKLSAgICAgICAgewotICAgICAgICAgIG5ld1ZhbHVlID0gZGlhbG9nLmdldFNlbGVjdGVkQ29tcG9uZW50KCk7Ci0gICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9ICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpbnB1dCkuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgICAgICBtYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShlbGVtZW50RGVjbGFyYXRpb24sIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB0eXBlQ29tYm8uc2V0VGV4dCh0eXBlTmFtZSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIC8vdXNlIHRoZSB2YWx1ZSBmcm9tIHNlbGVjdGVkIHF1aWNrUGljayBpdGVtCi0gICAgICB7Ci0gICAgICAgIG5ld1ZhbHVlID0gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShzZWxlY3Rpb24sIG1hbmFnZXIpOwotICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICBtYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShpbnB1dCwgbmV3VmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBjb21wb25lbnROYW1lQ29tYm8pCi0gICAgewotICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICBpZiAoZWRpdG9yID09IG51bGwpIHJldHVybjsKLSAgICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIG1hbmFnZXIgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNERWxlbWVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKTsgICAgCi0KLSAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSBjb21wb25lbnROYW1lQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBuZXdWYWx1ZTsKLSAgICAgIElDb21wb25lbnREaWFsb2cgZGlhbG9nPSBudWxsOwotICAgICAgaWYgKCBzZWxlY3Rpb24uZXF1YWxzKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQlJPV1NFKSkKLSAgICAgIHsKLSAgICAgICAgZGlhbG9nID0gbWFuYWdlci5nZXRCcm93c2VEaWFsb2coKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBzZWxlY3Rpb24uZXF1YWxzKE1lc3NhZ2VzLl9VSV9BQ1RJT05fTkVXKSkKLSAgICAgIHsKLSAgICAgICAgZGlhbG9nID0gbWFuYWdlci5nZXROZXdEaWFsb2coKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRpYWxvZyAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKSA9PSBXaW5kb3cuT0spCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdWYWx1ZSA9IGRpYWxvZy5nZXRTZWxlY3RlZENvbXBvbmVudCgpOwotICAgICAgICAgIG1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKGlucHV0LCBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnNldFRleHQoIiIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIC8vdXNlIHRoZSB2YWx1ZSBmcm9tIHNlbGVjdGVkIHF1aWNrUGljayBpdGVtCi0gICAgICB7Ci0gICAgICAgIG5ld1ZhbHVlID0gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShzZWxlY3Rpb24sIG1hbmFnZXIpOwotICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICBtYW5hZ2VyLm1vZGlmeUNvbXBvbmVudFJlZmVyZW5jZShpbnB1dCwgbmV3VmFsdWUpOwotICAgICAgfQotCi0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IG1heENvbWJvKQotICAgIHsKLSAgICAgIHVwZGF0ZU1heEF0dHJpYnV0ZSgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBtaW5Db21ibykKLSAgICB7Ci0gICAgICB1cGRhdGVNaW5BdHRyaWJ1dGUoKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWxheW91dCgpCi0gIHsKLSAgICBDb21wb3NpdGUgcGFyZW50Q29tcG9zaXRlID0gY29tcG9zaXRlLmdldFBhcmVudCgpOwotICAgIHBhcmVudENvbXBvc2l0ZS5nZXRQYXJlbnQoKS5zZXRSZWRyYXcoZmFsc2UpOwotCi0gICAgaWYgKHBhcmVudENvbXBvc2l0ZSAhPSBudWxsICYmICFwYXJlbnRDb21wb3NpdGUuaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIENvbnRyb2xbXSBjaGlsZHJlbiA9IHBhcmVudENvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgY2hpbGRyZW5baV0uZGlzcG9zZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIE5vdyBpbml0aWFsaXplIHRoZSBuZXcgaGFuZGxlcgotICAgIGNyZWF0ZUNvbnRlbnRzKHBhcmVudENvbXBvc2l0ZSk7Ci0gICAgcGFyZW50Q29tcG9zaXRlLmdldFBhcmVudCgpLmxheW91dCh0cnVlLCB0cnVlKTsKLQotICAgIC8vIE5vdyB0dXJuIHBhaW50aW5nIGJhY2sgb24KLSAgICBwYXJlbnRDb21wb3NpdGUuZ2V0UGFyZW50KCkuc2V0UmVkcmF3KHRydWUpOwotICAgIHJlZnJlc2goKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBzdXBlci5kb0hhbmRsZUV2ZW50KGV2ZW50KTsKLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IG5hbWVUZXh0KQotICAgIHsKLSAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IG5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBuYW1lZENvbXBvbmVudCA9ICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBpbnB1dCkuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgICAgaWYgKCF2YWxpZGF0ZVNlY3Rpb24oKSkKLSAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgYW4gYWN0dWFsIG5hbWUgY2hhbmdlIGhhcyB0YWtlbiBwbGFjZQotICAgICAgICBTdHJpbmcgb2xkTmFtZSA9IG5hbWVkQ29tcG9uZW50LmdldE5hbWUoKTsKLSAgICAgICAgaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb21tYW5kID0gbmV3IFVwZGF0ZU5hbWVDb21tYW5kKG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXMuX1VJX0FDVElPTl9SRU5BTUUsIG5hbWVkQ29tcG9uZW50LCBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsICYmIGdldENvbW1hbmRTdGFjaygpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZG9SZWZlcmVudGlhbEludGVncml0eUNoZWNrKG5hbWVkQ29tcG9uZW50LCBuZXdWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVTZWN0aW9uKCkKLSAgewotICAgIGlmIChuYW1lVGV4dCA9PSBudWxsIHx8IG5hbWVUZXh0LmlzRGlzcG9zZWQoKSkKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0gICAgU3RyaW5nIG5hbWUgPSBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCi0gICAgLy8gdmFsaWRhdGUgYWdhaW5zdCBOQ05hbWUKLSAgICBpZiAobmFtZS5sZW5ndGgoKSA8IDEgfHwgIVhNTENoYXIuaXNWYWxpZE5DTmFtZShuYW1lKSkKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2Uob3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfRVJST1JfSU5WQUxJRF9OQU1FKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgaWYgKGNvbXBvbmVudE5hbWVDb21ibyAhPSBudWxsICYmICFjb21wb25lbnROYW1lQ29tYm8uaXNEaXNwb3NlZCgpKQotICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGlmIChtaW5Db21ibyAhPSBudWxsICYmICFtaW5Db21iby5pc0Rpc3Bvc2VkKCkpCi0gICAgICBtaW5Db21iby5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBpZiAobWF4Q29tYm8gIT0gbnVsbCAmJiAhbWF4Q29tYm8uaXNEaXNwb3NlZCgpKQotICAgICAgbWF4Q29tYm8ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgaWYgKHR5cGVDb21ibyAhPSBudWxsICYmICF0eXBlQ29tYm8uaXNEaXNwb3NlZCgpKQotICAgICAgdHlwZUNvbWJvLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGlmIChuYW1lVGV4dCAhPSBudWxsICYmICFuYW1lVGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZW1vdmVMaXN0ZW5lcnMobmFtZVRleHQpOwotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hSZWZDb21ibygpCi0gIHsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBmaWxsRWxlbWVudHNDb21ibygpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgZmlsbEVsZW1lbnRzQ29tYm8oKQotICB7Ci0gICAgSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgbWFuYWdlciA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RFbGVtZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIuY2xhc3MpOyAgICAKLSAgICBpZiAobWFuYWdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5yZW1vdmVBbGwoKTsKLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGQoTWVzc2FnZXMuX1VJX0FDVElPTl9CUk9XU0UpOwotICAgICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZChNZXNzYWdlcy5fVUlfQUNUSU9OX05FVyk7Ci0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gcXVpY2tQaWNrcyA9IG1hbmFnZXIuZ2V0UXVpY2tQaWNrcygpOwotICAgICAgaWYgKHF1aWNrUGlja3MgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxdWlja1BpY2tzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBjb21wb25lbnRTcGVjaWZpY2F0aW9uID0gcXVpY2tQaWNrc1tpXTsKLSAgICAgICAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkKGNvbXBvbmVudFNwZWNpZmljYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbltdIGhpc3RvcnkgPSBtYW5hZ2VyLmdldEhpc3RvcnkoKTsKLSAgICAgIGlmIChoaXN0b3J5ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGlzdG9yeS5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gY29tcG9uZW50U3BlY2lmaWNhdGlvbiA9IGhpc3RvcnlbaV07Ci0gICAgICAgICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZChjb21wb25lbnRTcGVjaWZpY2F0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIG5hbWVkQ29tcG9uZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaW5wdXQ7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gbmFtZWRDb21wb25lbnQuZ2V0RWxlbWVudCgpOwotICAgIAotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGF0dHJWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFKTsKLSAgICAgIGlmIChhdHRyVmFsdWUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYXR0clZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb24gcmV0ID0gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShhdHRyVmFsdWUsIG1hbmFnZXIpOwotICAgICAgaWYgKHJldCA9PSBudWxsKQotICAgICAgewotICAgICAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkKGF0dHJWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0VGV4dChhdHRyVmFsdWUpOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREZhY2V0U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RGYWNldFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcyMDU0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREZhY2V0U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLkNoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZVN0cmluZ0xlbmd0aEZhY2V0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVYU0RXaGl0ZVNwYWNlRmFjZXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETGVuZ3RoRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1heEV4Y2x1c2l2ZUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNYXhGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWF4SW5jbHVzaXZlRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1heExlbmd0aEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNaW5FeGNsdXNpdmVGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWluRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1pbkluY2x1c2l2ZUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNaW5MZW5ndGhGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFZhcmlldHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdoaXRlU3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFdoaXRlU3BhY2VGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBYU0RGYWNldFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLSAgcHJpdmF0ZSBTdHJpbmcgbWluTGVuZ3RoU3RyaW5nLCBtYXhMZW5ndGhTdHJpbmcsIHRpdGxlU3RyaW5nOwotICBGb250IHRpdGxlRm9udDsKLSAgQ0xhYmVsIHRpdGxlOwotICBMYWJlbCBtaW5MZW5ndGhMYWJlbDsKLSAgVGV4dCBtaW5MZW5ndGhUZXh0OwotICBMYWJlbCBtYXhMZW5ndGhMYWJlbDsKLSAgVGV4dCBtYXhMZW5ndGhUZXh0OwotICBHcm91cCBzaW1wbGVUeXBlTW9kaWZpZXJHcm91cDsKLSAgU3RyaW5nIHNpbXBsZVR5cGVNb2RpZmllckdyb3VwVGl0bGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICBCdXR0b24gY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uOwotICBCdXR0b24gdXNlRW51bWVyYXRpb25zQnV0dG9uLCB1c2VQYXR0ZXJuc0J1dHRvbjsKLSAgQnV0dG9uIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveDsKLSAgQnV0dG9uIG1heGltdW1JbmNsdXNpdmVDaGVja2JveDsKLSAgYm9vbGVhbiBpc051bWVyaWNCYXNlVHlwZTsKLSAgYm9vbGVhbiBpc1NpbXBsZVR5cGVSZXN0cmljdGlvbjsKLSAgcHJpdmF0ZSBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbjsKLSAgcHJpdmF0ZSBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLSAgcHJpdmF0ZSBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBjdXJyZW50UHJpbWl0aXZlVHlwZSwgcHJldmlvdXNQcmltaXRpdmVUeXBlOwotICBwcml2YXRlIFhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50RGVjbGFyYXRpb247Ci0gIHByaXZhdGUgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24geHNkQXR0cmlidXRlRGVjbGFyYXRpb247Ci0gIHByaXZhdGUgWFNERmVhdHVyZSB4c2RGZWF0dXJlOwotICBib29sZWFuIGhhc01heE1pbkZhY2V0czsKLQotICBTcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0IGNvbnN0cmFpbnRzV2lkZ2V0OwotCi0gIHB1YmxpYyBYU0RGYWNldFNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpOwotICAgIGNvbXBvc2l0ZSA9IGZhY3RvcnkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICB0aXRsZSA9IGZhY3RvcnkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgRm9udERhdGEgZm9udERhdGEgPSBjb21wb3NpdGUuZ2V0Rm9udCgpLmdldEZvbnREYXRhKClbMF07Ci0gICAgdGl0bGUuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXRCb2xkKGZvbnREYXRhLmdldE5hbWUoKSkpOwotICAgIHRpdGxlLnNldFRleHQodGl0bGVTdHJpbmcgKyAoaXNSZWFkT25seSA/ICIgLSAiICsgTWVzc2FnZXMuX1VJX0xBQkVMX1JFQURPTkxZIDogIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICBDb21wb3NpdGUgZmFjZXRDb21wb3NpdGUgPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5GTEFUKTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgZmFjZXRDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBmYWNldENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0KLSAgICBzaW1wbGVUeXBlTW9kaWZpZXJHcm91cCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVHcm91cChmYWNldENvbXBvc2l0ZSwgc2ltcGxlVHlwZU1vZGlmaWVyR3JvdXBUaXRsZSk7Ci0gICAgR3JpZExheW91dCBncm91cEdyaWQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyb3VwR3JpZC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyb3VwR3JpZC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyb3VwR3JpZC5udW1Db2x1bW5zID0gMTsKLSAgICBzaW1wbGVUeXBlTW9kaWZpZXJHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHNpbXBsZVR5cGVNb2RpZmllckdyb3VwLnNldExheW91dChncm91cEdyaWQpOwotCi0gICAgQ29tcG9zaXRlIHNpbXBsZVR5cGVNb2RpZmllckNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShzaW1wbGVUeXBlTW9kaWZpZXJHcm91cCk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0KLSAgICBHcmlkTGF5b3V0IGdyaWQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkLm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZC5udW1Db2x1bW5zID0gMzsKLSAgICBzaW1wbGVUeXBlTW9kaWZpZXJDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWQpOwotICAgIHNpbXBsZVR5cGVNb2RpZmllckNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGlmIChoYXNNYXhNaW5GYWNldHMpCi0gICAgewotICAgICAgYm9vbGVhbiBpc0xpbnV4ID0gamF2YS5pby5GaWxlLnNlcGFyYXRvci5lcXVhbHMoIi8iKTsKLSAgICAgIG1pbkxlbmd0aExhYmVsID0gZmFjdG9yeS5jcmVhdGVMYWJlbChzaW1wbGVUeXBlTW9kaWZpZXJDb21wb3NpdGUsIG1pbkxlbmd0aFN0cmluZyk7Ci0gICAgICBtaW5MZW5ndGhUZXh0ID0gZmFjdG9yeS5jcmVhdGVUZXh0KHNpbXBsZVR5cGVNb2RpZmllckNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoaXNMaW51eCkKLSAgICAgIHsKLSAgICAgIAltaW5MZW5ndGhUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIGN1c3RvbUxpc3RlbmVyKTsKLSAgICAgIAltaW5MZW5ndGhUZXh0LmFkZExpc3RlbmVyKFNXVC5LZXlEb3duLCBjdXN0b21MaXN0ZW5lcik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGFwcGx5QWxsTGlzdGVuZXJzKG1pbkxlbmd0aFRleHQpOwotICAgICAgCi0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG1pbkxlbmd0aFRleHQsCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5DT05TVFJBSU5UU19UQUJfX01JTklNVU1fTEVOR1RIKTsKLQotICAgICAgR3JpZERhdGEgbWluR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIG1pbkdyaWREYXRhLndpZHRoSGludCA9IDEwMDsKLSAgICAgIG1pbkxlbmd0aFRleHQuc2V0TGF5b3V0RGF0YShtaW5HcmlkRGF0YSk7Ci0gICAgICBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3ggPSBmYWN0b3J5LmNyZWF0ZUJ1dHRvbihzaW1wbGVUeXBlTW9kaWZpZXJDb21wb3NpdGUsIE1lc3NhZ2VzLl9VSV9MQUJFTF9JTkNMVVNJVkUsIFNXVC5DSEVDSyk7Ci0gICAgICBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAgIG1heExlbmd0aExhYmVsID0gZmFjdG9yeS5jcmVhdGVMYWJlbChzaW1wbGVUeXBlTW9kaWZpZXJDb21wb3NpdGUsIG1heExlbmd0aFN0cmluZyk7Ci0gICAgICBtYXhMZW5ndGhUZXh0ID0gZmFjdG9yeS5jcmVhdGVUZXh0KHNpbXBsZVR5cGVNb2RpZmllckNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoaXNMaW51eCkKLSAgICAgIHsKLSAgICAJICBtYXhMZW5ndGhUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIGN1c3RvbUxpc3RlbmVyKTsKLSAgICAJICBtYXhMZW5ndGhUZXh0LmFkZExpc3RlbmVyKFNXVC5LZXlEb3duLCBjdXN0b21MaXN0ZW5lcik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGFwcGx5QWxsTGlzdGVuZXJzKG1heExlbmd0aFRleHQpOwotICAgICAgCi0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG1heExlbmd0aFRleHQsCi0gICAgICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkNPTlNUUkFJTlRTX1RBQl9fTUFYSU1VTV9MRU5HVEgpOwotCi0gICAgICBHcmlkRGF0YSBtYXhHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgbWF4R3JpZERhdGEud2lkdGhIaW50ID0gMTAwOwotICAgICAgbWF4TGVuZ3RoVGV4dC5zZXRMYXlvdXREYXRhKG1heEdyaWREYXRhKTsKLQotICAgICAgbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94ID0gZmFjdG9yeS5jcmVhdGVCdXR0b24oc2ltcGxlVHlwZU1vZGlmaWVyQ29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfSU5DTFVTSVZFLCBTV1QuQ0hFQ0spOwotICAgICAgbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgICBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guc2V0VmlzaWJsZShpc051bWVyaWNCYXNlVHlwZSk7Ci0gICAgICBtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guc2V0VmlzaWJsZShpc051bWVyaWNCYXNlVHlwZSk7Ci0gICAgfQotICAgIGNvbGxhcHNlV2hpdGVzcGFjZUJ1dHRvbiA9IGZhY3RvcnkuY3JlYXRlQnV0dG9uKHNpbXBsZVR5cGVNb2RpZmllckNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX0NPTExBUFNFX1dISVRFU1BBQ0UsIFNXVC5DSEVDSyk7Ci0gICAgY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uLAotICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuQ09OU1RSQUlOVFNfVEFCX19DT0xMQVBTRV9XSElURVNQQUNFKTsKLQotICAgIEdyb3VwIHNwZWNpZmljVmFsdWVDb25zdHJhaW50c0dyb3VwID0gZmFjdG9yeS5jcmVhdGVHcm91cChmYWNldENvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX1NQRUNJRklDX0NPTlNUUkFJTlRfVkFMVUVTKTsKLSAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgc3BlY2lmaWNWYWx1ZUNvbnN0cmFpbnRzR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgc3BlY2lmaWNWYWx1ZUNvbnN0cmFpbnRzR3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGVGb3JCdXR0b25zID0gZmFjdG9yeS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShzcGVjaWZpY1ZhbHVlQ29uc3RyYWludHNHcm91cCk7Ci0gICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAwOwotICAgIGdyaWRMYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBjb21wb3NpdGVGb3JCdXR0b25zLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLSAgICBjb21wb3NpdGVGb3JCdXR0b25zLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBmYWN0b3J5LmNyZWF0ZUNMYWJlbChjb21wb3NpdGVGb3JCdXR0b25zLCBNZXNzYWdlcy5fVUlfTEFCRUxfUkVTVFJJQ1RfVkFMVUVTX0JZKTsKLS8vICAgIHVzZURlZmluZWRWYWx1ZXNCdXR0b24gPSBmYWN0b3J5LmNyZWF0ZUJ1dHRvbihjb21wb3NpdGVGb3JCdXR0b25zLCAiT25seSBwZXJtaXQgY2VydGFpbiB2YWx1ZXMiLCBTV1QuQ0hFQ0spOwotLy8gICAgdXNlRGVmaW5lZFZhbHVlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGVGb3JSYWRpb0J1dHRvbnMgPSBmYWN0b3J5LmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKGNvbXBvc2l0ZUZvckJ1dHRvbnMpOwotICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotICAgIGdyaWRMYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIGNvbXBvc2l0ZUZvclJhZGlvQnV0dG9ucy5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgdXNlRW51bWVyYXRpb25zQnV0dG9uID0gZmFjdG9yeS5jcmVhdGVCdXR0b24oY29tcG9zaXRlRm9yUmFkaW9CdXR0b25zLCBNZXNzYWdlcy5fVUlfTEFCRUxfRU5VTUVSQVRJT05TLCBTV1QuUkFESU8pOwotICAgIHVzZUVudW1lcmF0aW9uc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVzZUVudW1lcmF0aW9uc0J1dHRvbiwKLSAgICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkNPTlNUUkFJTlRTX1RBQl9fRU5VTUVSQVRJT05TKTsKLSAgICB1c2VQYXR0ZXJuc0J1dHRvbiA9IGZhY3RvcnkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZUZvclJhZGlvQnV0dG9ucywgTWVzc2FnZXMuX1VJX0xBQkVMX1BBVFRFUk5TLCBTV1QuUkFESU8pOwotICAgIHVzZVBhdHRlcm5zQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodXNlUGF0dGVybnNCdXR0b24sCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5DT05TVFJBSU5UU19UQUJfX1BBVFRFUk5TKTsgICAgCi0gICAgCi0gICAgY29uc3RyYWludHNXaWRnZXQgPSBuZXcgU3BlY2lmaWNDb25zdHJhaW50c1dpZGdldChzcGVjaWZpY1ZhbHVlQ29uc3RyYWludHNHcm91cCwgZmFjdG9yeSwgKGlucHV0IGluc3RhbmNlb2YgWFNERmVhdHVyZSkgPyAoWFNERmVhdHVyZSlpbnB1dCA6IG51bGwsIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLCB0aGlzKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGNvbnN0cmFpbnRzV2lkZ2V0LmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29uc3RyYWludHNXaWRnZXQuZ2V0Q29udHJvbCgpLAotICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuQ09OU1RSQUlOVFNfVEFCX19OT19MQUJFTCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRvU2V0SW5wdXQoKQotICB7Ci0gICAgc2V0SW5wdXQoZ2V0UGFydCgpLCBnZXRTZWxlY3Rpb24oKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHN1cGVyLnNldElucHV0KHBhcnQsIHNlbGVjdGlvbik7Ci0gICAgaW5pdCgpOwotICAgIAotICAgIFhTRFNjaGVtYSBzY2hlbWFPZlR5cGUgPSBudWxsOwotCi0gICAgaWYgKCFpc1JlYWRPbmx5KQotICAgIHsKLSAgICAgIHNjaGVtYU9mVHlwZSA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldFNjaGVtYSgpOwotICAgIH0KLSAgICBpZiAoc2NoZW1hT2ZUeXBlID09IG93bmluZ0VkaXRvci5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcykpCi0gICAgewotICAgICAgaXNSZWFkT25seSA9IGZhbHNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCFYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEuZXF1YWxzKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKSkKLSAgICAgICAgaXNSZWFkT25seSA9IHRydWU7Ci0gICAgfQotICAgIGlmIChoYXNNYXhNaW5GYWNldHMpCi0gICAgewotICAgICAgdGl0bGUuc2V0VGV4dCh0aXRsZVN0cmluZyArIChpc1JlYWRPbmx5ID8gIiAtICIgKyBNZXNzYWdlcy5fVUlfTEFCRUxfUkVBRE9OTFkgOiAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB9Ci0gICAgcmVsYXlvdXQoKTsKLSAgICBjb25zdHJhaW50c1dpZGdldC5zZXRDb21tYW5kU3RhY2soZ2V0Q29tbWFuZFN0YWNrKCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpCi0gIHsKLSAgICBoYXNNYXhNaW5GYWNldHMgPSBmYWxzZTsKLSAgICB0cnkKLSAgICB7Ci0gICAgdXBkYXRlSW5wdXQoKTsKLSAgICAKLSAgICBpZiAoeHNkU2ltcGxlVHlwZURlZmluaXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpc1NpbXBsZVR5cGVSZXN0cmljdGlvbiA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldFZhcmlldHkoKS5nZXRWYWx1ZSgpID09IFhTRFZhcmlldHkuQVRPTUlDOwotICAgICAgCi0gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0YXJnZXRTVCA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uOwotICAgICAgCi0gICAgICB3aGlsZSAoIVhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMS5lcXVhbHModGFyZ2V0U1QuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpICYmIHRhcmdldFNUICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRhcmdldFNUID0gdGFyZ2V0U1QuZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIG1pbkxlbmd0aFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICBtYXhMZW5ndGhTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKHRhcmdldFNULmdldFZhbGlkRmFjZXRzKCkuY29udGFpbnMoImxlbmd0aCIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIG1pbkxlbmd0aFN0cmluZyA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9NSU5JTVVNX0xFTkdUSDsKLSAgICAgICAgbWF4TGVuZ3RoU3RyaW5nID0gTWVzc2FnZXMuX1VJX0xBQkVMX01BWElNVU1fTEVOR1RIOwotICAgICAgICBzaW1wbGVUeXBlTW9kaWZpZXJHcm91cFRpdGxlID0gTWVzc2FnZXMuX1VJX0xBQkVMX0NPTlNUUkFJTlRTX09OX0xFTkdUSF9PRiArIHRhcmdldFNULmdldE5hbWUoKTsKLSAgICAgICAgaXNOdW1lcmljQmFzZVR5cGUgPSBmYWxzZTsKLSAgICAgICAgaGFzTWF4TWluRmFjZXRzID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHRhcmdldFNULmdldFZhbGlkRmFjZXRzKCkuY29udGFpbnMoIm1heEluY2x1c2l2ZSIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIHNpbXBsZVR5cGVNb2RpZmllckdyb3VwVGl0bGUgPSBNZXNzYWdlcy5fVUlfTEFCRUxfQ09OU1RSQUlOVFNfT05fVkFMVUVfT0YgKyB0YXJnZXRTVC5nZXROYW1lKCk7Ci0gICAgICAgIG1pbkxlbmd0aFN0cmluZyA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9NSU5JTVVNX1ZBTFVFOwotICAgICAgICBtYXhMZW5ndGhTdHJpbmcgPSBNZXNzYWdlcy5fVUlfTEFCRUxfTUFYSU1VTV9WQUxVRTsKLSAgICAgICAgaXNOdW1lcmljQmFzZVR5cGUgPSB0cnVlOwotICAgICAgICBoYXNNYXhNaW5GYWNldHMgPSB0cnVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzaW1wbGVUeXBlTW9kaWZpZXJHcm91cFRpdGxlID0gTWVzc2FnZXMuX1VJX0xBQkVMX0NPTlRSQUlOVFNfT04gKyAodGFyZ2V0U1QgIT0gbnVsbCA/IHRhcmdldFNULmdldE5hbWUoKSA6ICJhbnlUeXBlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgfQotICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVJbnB1dCgpCi0gIHsKLSAgICBwcmV2aW91c1ByaW1pdGl2ZVR5cGUgPSBjdXJyZW50UHJpbWl0aXZlVHlwZTsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RGZWF0dXJlKQotICAgIHsKLSAgICAgIHhzZEZlYXR1cmUgPSAoWFNERmVhdHVyZSkgaW5wdXQ7Ci0gICAgICB0eXBlRGVmaW5pdGlvbiA9IHhzZEZlYXR1cmUuZ2V0UmVzb2x2ZWRGZWF0dXJlKCkuZ2V0VHlwZSgpOwotICAgICAgWFNEVHlwZURlZmluaXRpb24gYW5vbnltb3VzVHlwZURlZmluaXRpb24gPSBudWxsOwotICAgICAgaWYgKHhzZEZlYXR1cmUgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIHhzZEVsZW1lbnREZWNsYXJhdGlvbiA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24peHNkRmVhdHVyZTsKLSAgICAgICAgYW5vbnltb3VzVHlwZURlZmluaXRpb24gPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoeHNkRmVhdHVyZSBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICB4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbiA9IChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbil4c2RGZWF0dXJlOwotICAgICAgICBhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiA9IHhzZEF0dHJpYnV0ZURlY2xhcmF0aW9uLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAodHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgeHNkU2ltcGxlVHlwZURlZmluaXRpb24gPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHR5cGVEZWZpbml0aW9uOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoYW5vbnltb3VzVHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgeHNkU2ltcGxlVHlwZURlZmluaXRpb24gPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pYW5vbnltb3VzVHlwZURlZmluaXRpb247Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmICh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoIVhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMS5lcXVhbHMoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gYmFzZVByaW1pdGl2ZVR5cGUgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICBTdHJpbmcgYmFzZVByaW1pdGl2ZVR5cGVTdHJpbmcgPSBiYXNlUHJpbWl0aXZlVHlwZSAhPSBudWxsID8gYmFzZVByaW1pdGl2ZVR5cGUuZ2V0TmFtZSgpIDogIiI7Ci0gICAgICAgICAgY3VycmVudFByaW1pdGl2ZVR5cGUgPSBiYXNlUHJpbWl0aXZlVHlwZTsKLSAgICAgICAgICB0aXRsZVN0cmluZyA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9UWVBFICsgKGFub255bW91c1R5cGVEZWZpbml0aW9uICE9IG51bGwgPyAiKCIgKyB4c2RGZWF0dXJlLmdldFJlc29sdmVkRmVhdHVyZSgpLmdldE5hbWUoKSArICJUeXBlKSIgOiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkpICArICIgLCAiICsgTWVzc2FnZXMuX1VJX0xBQkVMX0JBU0UgKyAiOiAiICsgYmFzZVByaW1pdGl2ZVR5cGVTdHJpbmc7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBjdXJyZW50UHJpbWl0aXZlVHlwZSA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uOwotICAgICAgICAgIHRpdGxlU3RyaW5nID0gTWVzc2FnZXMuX1VJX0xBQkVMX1RZUEUgKyAoYW5vbnltb3VzVHlwZURlZmluaXRpb24gIT0gbnVsbCA/ICIoIiArIHhzZEZlYXR1cmUuZ2V0UmVzb2x2ZWRGZWF0dXJlKCkuZ2V0TmFtZSgpICsgIlR5cGUpIiA6IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICBjdXJyZW50UHJpbWl0aXZlVHlwZSA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uOwotICAgICAgdGl0bGVTdHJpbmcgPSBNZXNzYWdlcy5fVUlfTEFCRUxfVFlQRSArICh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkgPT0gbnVsbCA/ICIobG9jYWxUeXBlKSIgOiB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXROYW1lKCkpICsgIiAsICIgKyBNZXNzYWdlcy5fVUlfTEFCRUxfQkFTRSArICI6ICIgKyB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRCYXNlVHlwZURlZmluaXRpb24oKS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotICAgIGluaXQoKTsKLSAgICAKLSAgICBpZiAoY3VycmVudFByaW1pdGl2ZVR5cGUgIT0gcHJldmlvdXNQcmltaXRpdmVUeXBlKQotICAgIHsKLSAgICAgIHJlbGF5b3V0KCk7ICAgICAgCi0gICAgfQotICAgIAotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0gICAgCi0gICAgWFNEV2hpdGVTcGFjZUZhY2V0IHdoaXRlc3BhY2VGYWNldCA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldFdoaXRlU3BhY2VGYWNldCgpOwotICAgIGlmICh3aGl0ZXNwYWNlRmFjZXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoeHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0RmFjZXRDb250ZW50cygpLmNvbnRhaW5zKHdoaXRlc3BhY2VGYWNldCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChYU0RXaGl0ZVNwYWNlLkNPTExBUFNFX0xJVEVSQUwuZXF1YWxzKHdoaXRlc3BhY2VGYWNldC5nZXRWYWx1ZSgpKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLmVxdWFscyh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbGxhcHNlV2hpdGVzcGFjZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmIChoYXNNYXhNaW5GYWNldHMgJiYgIW1pbkxlbmd0aExhYmVsLmlzRGlzcG9zZWQoKSAmJiAhbWF4TGVuZ3RoTGFiZWwuaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIG1pbkxlbmd0aExhYmVsLnNldFRleHQobWluTGVuZ3RoU3RyaW5nKTsKLSAgICAgIG1heExlbmd0aExhYmVsLnNldFRleHQobWF4TGVuZ3RoU3RyaW5nKTsKLQotICAgICAgaWYgKCFpc051bWVyaWNCYXNlVHlwZSkKLSAgICAgICAgcmVmcmVzaFN0cmluZ0xlbmd0aCgpOwotICAgICAgZWxzZQotICAgICAgICByZWZyZXNoVmFsdWVMZW5ndGhzKCk7Ci0gICAgfQotCi0gICAgaWYgKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldEVudW1lcmF0aW9uRmFjZXRzKCkuc2l6ZSgpID4gMCkgCi0gICAgewotICAgICAgdXNlUGF0dGVybnNCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgIHVzZUVudW1lcmF0aW9uc0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICBjb25zdHJhaW50c1dpZGdldC5zZXRDb25zdHJhaW50S2luZChTcGVjaWZpY0NvbnN0cmFpbnRzV2lkZ2V0LkVOVU1FUkFUSU9OKTsKLSAgICAgIGNvbnN0cmFpbnRzV2lkZ2V0LmFkZEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgIH0KLSAgICBlbHNlIGlmICh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRQYXR0ZXJuRmFjZXRzKCkuc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICB1c2VQYXR0ZXJuc0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICB1c2VFbnVtZXJhdGlvbnNCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgIGNvbnN0cmFpbnRzV2lkZ2V0LnNldENvbnN0cmFpbnRLaW5kKFNwZWNpZmljQ29uc3RyYWludHNXaWRnZXQuUEFUVEVSTik7Ci0gICAgICBjb25zdHJhaW50c1dpZGdldC5hZGRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB1c2VQYXR0ZXJuc0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgdXNlRW51bWVyYXRpb25zQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgIGNvbnN0cmFpbnRzV2lkZ2V0LnNldENvbnN0cmFpbnRLaW5kKFNwZWNpZmljQ29uc3RyYWludHNXaWRnZXQuRU5VTUVSQVRJT04pOwotICAgICAgY29uc3RyYWludHNXaWRnZXQuYWRkQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICAgIGNvbnN0cmFpbnRzV2lkZ2V0LnNldElucHV0KHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKTsKLQotICAgIHNldFdpZGdldHNFbmFibGVkKGlzU2ltcGxlVHlwZVJlc3RyaWN0aW9uICYmICFpc1JlYWRPbmx5KTsKLSAgICBjb21wb3NpdGUuc2V0RW5hYmxlZChpc1NpbXBsZVR5cGVSZXN0cmljdGlvbiAmJiAhaXNSZWFkT25seSk7Ci0gICAgCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2V0V2lkZ2V0c0VuYWJsZWQoYm9vbGVhbiBpc0VuYWJsZWQpCi0gIHsKLSAgICBpZiAoY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uICE9IG51bGwgJiYgIWNvbGxhcHNlV2hpdGVzcGFjZUJ1dHRvbi5pc0Rpc3Bvc2VkKCkpCi0gICAgICBjb2xsYXBzZVdoaXRlc3BhY2VCdXR0b24uc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICAgIGlmICh1c2VFbnVtZXJhdGlvbnNCdXR0b24gIT0gbnVsbCAmJiAhdXNlRW51bWVyYXRpb25zQnV0dG9uLmlzRGlzcG9zZWQoKSkKLSAgICAgIHVzZUVudW1lcmF0aW9uc0J1dHRvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gICAgaWYgKHVzZVBhdHRlcm5zQnV0dG9uICE9IG51bGwgJiYgIXVzZVBhdHRlcm5zQnV0dG9uLmlzRGlzcG9zZWQoKSkKLSAgICAgIHVzZVBhdHRlcm5zQnV0dG9uLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICBpZiAobWluaW11bUluY2x1c2l2ZUNoZWNrYm94ICE9IG51bGwgJiYgIW1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5pc0Rpc3Bvc2VkKCkpCi0gICAgICBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICAgIGlmIChtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3ggIT0gbnVsbCAmJiAhbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LmlzRGlzcG9zZWQoKSkKLSAgICAgIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gICAgaWYgKGNvbnN0cmFpbnRzV2lkZ2V0ICE9IG51bGwgJiYgIWNvbnN0cmFpbnRzV2lkZ2V0LmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgY29uc3RyYWludHNXaWRnZXQuYWRkQnV0dG9uLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICAgIGNvbnN0cmFpbnRzV2lkZ2V0LmFkZFVzaW5nRGlhbG9nQnV0dG9uLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWxheW91dCgpCi0gIHsKLSAgICBDb21wb3NpdGUgcGFyZW50ID0gY29tcG9zaXRlLmdldFBhcmVudCgpOwotICAgIHBhcmVudC5nZXRQYXJlbnQoKS5zZXRSZWRyYXcoZmFsc2UpOwotCi0gICAgaWYgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIENvbnRyb2xbXSBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgY2hpbGRyZW5baV0uZGlzcG9zZSgpOwotICAgICAgfQotICAgIH0KLSAgICBjcmVhdGVDb250ZW50cyhwYXJlbnQpOwotICAgIHBhcmVudC5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0gICAgcGFyZW50LmdldFBhcmVudCgpLnNldFJlZHJhdyh0cnVlKTsKLSAgICByZWZyZXNoKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGlmICh0aXRsZUZvbnQgIT0gbnVsbCAmJiAhdGl0bGVGb250LmlzRGlzcG9zZWQoKSkKLSAgICAgIHRpdGxlRm9udC5kaXNwb3NlKCk7Ci0gICAgdGl0bGVGb250ID0gbnVsbDsKLSAgICAKLSAgICBpZiAobWluaW11bUluY2x1c2l2ZUNoZWNrYm94ICE9IG51bGwgJiYgIW1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5pc0Rpc3Bvc2VkKCkpCi0gICAgICBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3gucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgaWYgKG1heGltdW1JbmNsdXNpdmVDaGVja2JveCAhPSBudWxsICYmICFtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guaXNEaXNwb3NlZCgpKQotICAgICAgbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIGlmIChjb2xsYXBzZVdoaXRlc3BhY2VCdXR0b24gIT0gbnVsbCAmJiAhY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uLmlzRGlzcG9zZWQoKSkKLSAgICAgIGNvbGxhcHNlV2hpdGVzcGFjZUJ1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIGlmIChtYXhMZW5ndGhUZXh0ICE9IG51bGwgJiYgIW1heExlbmd0aFRleHQuaXNEaXNwb3NlZCgpKQotICAgICAgcmVtb3ZlTGlzdGVuZXJzKG1heExlbmd0aFRleHQpOwotICAgIGlmIChtaW5MZW5ndGhUZXh0ICE9IG51bGwgJiYgIW1pbkxlbmd0aFRleHQuaXNEaXNwb3NlZCgpKQotICAgICAgcmVtb3ZlTGlzdGVuZXJzKG1pbkxlbmd0aFRleHQpOwotICAgIAotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hTdHJpbmdMZW5ndGgoKQotICB7Ci0gICAgWFNETWluTGVuZ3RoRmFjZXQgbWluTGVuZ3RoRmFjZXQgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRNaW5MZW5ndGhGYWNldCgpOwotICAgIFhTRE1heExlbmd0aEZhY2V0IG1heExlbmd0aEZhY2V0ID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TWF4TGVuZ3RoRmFjZXQoKTsKLSAgICBYU0RMZW5ndGhGYWNldCBsZW5ndGhGYWNldCA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldExlbmd0aEZhY2V0KCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAobWluTGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW50IG1pbkxlbmd0aFZhbHVlID0gbWluTGVuZ3RoRmFjZXQuZ2V0VmFsdWUoKTsKLSAgICAgICAgaWYgKG1pbkxlbmd0aFZhbHVlID49IDAgJiYgbWluTGVuZ3RoRmFjZXQuZ2V0Um9vdENvbnRhaW5lcigpID09IHhzZFNjaGVtYSkKLSAgICAgICAgewotICAgICAgICAgIG1pbkxlbmd0aFRleHQuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKG1pbkxlbmd0aFZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbWluTGVuZ3RoVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobWF4TGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW50IG1heExlbmd0aCA9IG1heExlbmd0aEZhY2V0LmdldFZhbHVlKCk7Ci0gICAgICAgIGlmIChtYXhMZW5ndGggPj0gMCAmJiBtYXhMZW5ndGhGYWNldC5nZXRSb290Q29udGFpbmVyKCkgPT0geHNkU2NoZW1hKQotICAgICAgICB7Ci0gICAgICAgICAgbWF4TGVuZ3RoVGV4dC5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcobWF4TGVuZ3RoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbWF4TGVuZ3RoVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW50IGxlbmd0aCA9IGxlbmd0aEZhY2V0LmdldFZhbHVlKCk7Ci0gICAgICAgIGlmIChsZW5ndGggPj0gMCAmJiBsZW5ndGhGYWNldC5nZXRSb290Q29udGFpbmVyKCkgPT0geHNkU2NoZW1hKQotICAgICAgICB7Ci0gICAgICAgICAgbWluTGVuZ3RoVGV4dC5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcobGVuZ3RoKSk7Ci0gICAgICAgICAgbWF4TGVuZ3RoVGV4dC5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcobGVuZ3RoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLQotICAgIH0KLQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaFZhbHVlTGVuZ3RocygpCi0gIHsKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlID0geHNkU2ltcGxlVHlwZURlZmluaXRpb247Ci0gICAgWFNETWluRmFjZXQgbWluRmFjZXQgPSB0eXBlLmdldE1pbkZhY2V0KCk7Ci0gICAgWFNETWF4RmFjZXQgbWF4RmFjZXQgPSB0eXBlLmdldE1heEZhY2V0KCk7Ci0KLSAgICBpZiAobWluRmFjZXQgIT0gbnVsbCAmJiBtaW5GYWNldC5nZXRSb290Q29udGFpbmVyKCkgPT0geHNkU2NoZW1hKQotICAgIHsKLSAgICAgIGlmIChtaW5GYWNldC5nZXRFbGVtZW50KCkuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFhTRENvbnN0YW50cy5NSU5FWENMVVNJVkVfRUxFTUVOVF9UQUcpIHx8IG1pbkZhY2V0LmdldEVsZW1lbnQoKS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLk1JTklOQ0xVU0lWRV9FTEVNRU5UX1RBRykpCi0gICAgICB7Ci0gICAgICAgIG1pbkxlbmd0aFRleHQuc2V0VGV4dChtaW5GYWNldC5nZXRMZXhpY2FsVmFsdWUoKSk7Ci0gICAgICAgIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRTZWxlY3Rpb24obWluRmFjZXQuaXNJbmNsdXNpdmUoKSk7Ci0gICAgICAgIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBtaW5MZW5ndGhUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBpZiAobWF4RmFjZXQgIT0gbnVsbCAmJiBtYXhGYWNldC5nZXRSb290Q29udGFpbmVyKCkgPT0geHNkU2NoZW1hKQotICAgIHsKLSAgICAgIGlmIChtYXhGYWNldC5nZXRFbGVtZW50KCkuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFhTRENvbnN0YW50cy5NQVhFWENMVVNJVkVfRUxFTUVOVF9UQUcpIHx8IG1heEZhY2V0LmdldEVsZW1lbnQoKS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWFNEQ29uc3RhbnRzLk1BWElOQ0xVU0lWRV9FTEVNRU5UX1RBRykpCi0gICAgICB7Ci0gICAgICAgIG1heExlbmd0aFRleHQuc2V0VGV4dChtYXhGYWNldC5nZXRMZXhpY2FsVmFsdWUoKSk7Ci0gICAgICAgIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRTZWxlY3Rpb24obWF4RmFjZXQuaXNJbmNsdXNpdmUoKSk7Ci0gICAgICAgIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBtYXhMZW5ndGhUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgc3VwZXIuZG9IYW5kbGVFdmVudChldmVudCk7Ci0gICAgQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLSAgICBib29sZWFuIGRvVXBkYXRlTWF4ID0gZmFsc2UsIGRvVXBkYXRlTWluID0gZmFsc2U7Ci0gICAgYm9vbGVhbiBkb1NldElucHV0ID0gZmFsc2U7Ci0gICAgCi0gICAgU3RyaW5nIG1pblZhbHVlID0gbWluTGVuZ3RoVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgIFN0cmluZyBtYXhWYWx1ZSA9IG1heExlbmd0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQotICAgIFhTRExlbmd0aEZhY2V0IGxlbmd0aEZhY2V0ID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TGVuZ3RoRmFjZXQoKTsKLSAgICBYU0RNaW5MZW5ndGhGYWNldCBtaW5MZW5ndGhGYWNldCA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldE1pbkxlbmd0aEZhY2V0KCk7Ci0gICAgWFNETWF4TGVuZ3RoRmFjZXQgbWF4TGVuZ3RoRmFjZXQgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRNYXhMZW5ndGhGYWNldCgpOwotICAgIAotICAgIFhTRE1pbkluY2x1c2l2ZUZhY2V0IG1pbkluY2x1c2l2ZUZhY2V0ID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TWluSW5jbHVzaXZlRmFjZXQoKTsKLSAgICBYU0RNaW5FeGNsdXNpdmVGYWNldCBtaW5FeGNsdXNpdmVGYWNldCA9IHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldE1pbkV4Y2x1c2l2ZUZhY2V0KCk7Ci0gICAgWFNETWF4SW5jbHVzaXZlRmFjZXQgbWF4SW5jbHVzaXZlRmFjZXQgPSB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRNYXhJbmNsdXNpdmVGYWNldCgpOwotICAgIFhTRE1heEV4Y2x1c2l2ZUZhY2V0IG1heEV4Y2x1c2l2ZUZhY2V0ID0geHNkU2ltcGxlVHlwZURlZmluaXRpb24uZ2V0TWF4RXhjbHVzaXZlRmFjZXQoKTsKLQotICAgIFN0cmluZyBjdXJyZW50TWluSW5jbHVzaXZlID0gbnVsbCwgY3VycmVudE1pbkV4Y2x1c2l2ZSA9IG51bGwsIGN1cnJlbnRNYXhJbmNsdXNpdmUgPSBudWxsLCBjdXJyZW50TWF4RXhjbHVzaXZlID0gbnVsbDsKLSAgICBpZiAobWluSW5jbHVzaXZlRmFjZXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjdXJyZW50TWluSW5jbHVzaXZlID0gbWluSW5jbHVzaXZlRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgfQotICAgIGlmIChtaW5FeGNsdXNpdmVGYWNldCAhPSBudWxsKQotICAgIHsKLSAgICAgIGN1cnJlbnRNaW5FeGNsdXNpdmUgPSBtaW5FeGNsdXNpdmVGYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICB9Ci0gICAgaWYgKG1heEluY2x1c2l2ZUZhY2V0ICE9IG51bGwpCi0gICAgewotICAgICAgY3VycmVudE1heEluY2x1c2l2ZSA9IG1heEluY2x1c2l2ZUZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgIH0KLSAgICBpZiAobWF4RXhjbHVzaXZlRmFjZXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjdXJyZW50TWF4RXhjbHVzaXZlID0gbWF4RXhjbHVzaXZlRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgfQotICAgIAotICAgIAotICAgIFN0cmluZyBjdXJyZW50TGVuZ3RoID0gbnVsbCwgY3VycmVudE1pbiA9IG51bGwsIGN1cnJlbnRNYXggPSBudWxsOwotICAgIGlmIChsZW5ndGhGYWNldCAhPSBudWxsKQotICAgIHsKLSAgICAgIGN1cnJlbnRMZW5ndGggPSBsZW5ndGhGYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLSAgICB9Ci0gICAgaWYgKG1pbkxlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgewotICAgICAgY3VycmVudE1pbiA9IG1pbkxlbmd0aEZhY2V0LmdldExleGljYWxWYWx1ZSgpOwotICAgIH0KLSAgICBpZiAobWF4TGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjdXJyZW50TWF4ID0gbWF4TGVuZ3RoRmFjZXQuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgfQotICAgIAotICAgIGlmIChldmVudC53aWRnZXQgPT0gbWluTGVuZ3RoVGV4dCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaWYgKG1pblZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNOdW1lcmljQmFzZVR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgTnVtYmVyIGJpZyA9IG5ldyBCaWdJbnRlZ2VyKG1pblZhbHVlKTsKLSAgICAgICAgICAgIGJpZy50b1N0cmluZygpOwotICAgICAgICAgICAgaWYgKG1pbkxlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChtaW5WYWx1ZS5lcXVhbHMoY3VycmVudE1pbikgfHwgbWluVmFsdWUuZXF1YWxzKGN1cnJlbnRMZW5ndGgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKG1heFZhbHVlICE9IG51bGwgJiYgbWluVmFsdWUuZXF1YWxzKG1heFZhbHVlKSAmJiBsZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbigiZG91YmxlIikuZXF1YWxzKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKSB8fCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbigiZmxvYXQiKS5lcXVhbHMoeHNkU2ltcGxlVHlwZURlZmluaXRpb24pIHx8IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hKCkucmVzb2x2ZVNpbXBsZVR5cGVEZWZpbml0aW9uKCJkZWNpbWFsIikuZXF1YWxzKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBCaWdEZWNpbWFsIGJpZ0RlY2ltYWwgPSBuZXcgQmlnRGVjaW1hbChtaW5WYWx1ZSk7Ci0gICAgICAgICAgICAgIGJpZ0RlY2ltYWwudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgaWYgKCAoY3VycmVudE1pbkluY2x1c2l2ZSAhPSBudWxsICYmIG1pblZhbHVlLmVxdWFscyhjdXJyZW50TWluSW5jbHVzaXZlKSkgfHwKLSAgICAgICAgICAgICAgICAgICAoY3VycmVudE1pbkV4Y2x1c2l2ZSAhPSBudWxsICYmIG1pblZhbHVlLmVxdWFscyhjdXJyZW50TWluRXhjbHVzaXZlKSkgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE51bWJlciBiaWcgPSBuZXcgQmlnSW50ZWdlcihtaW5WYWx1ZSk7Ci0gICAgICAgICAgICAgIGJpZy50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNOdW1lcmljQmFzZVR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGN1cnJlbnRNaW4gPT0gbnVsbCAmJiBjdXJyZW50TGVuZ3RoID09IG51bGwpCi0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50TWluSW5jbHVzaXZlID09IG51bGwgJiYgbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LmdldFNlbGVjdGlvbigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50TWluRXhjbHVzaXZlID09IG51bGwgJiYgIW1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgbWluVmFsdWUgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGRvVXBkYXRlTWluID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy8gVE9ETyBzaG93IGVycm9yIG1lc3NhZ2UKLSAgICAgICAgZG9VcGRhdGVNaW4gPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBtYXhMZW5ndGhUZXh0KQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBpZiAobWF4VmFsdWUubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc051bWVyaWNCYXNlVHlwZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBOdW1iZXIgYmlnID0gbmV3IEJpZ0ludGVnZXIobWF4VmFsdWUpOwotICAgICAgICAgICAgYmlnLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAobWF4TGVuZ3RoRmFjZXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKG1heFZhbHVlLmVxdWFscyhjdXJyZW50TWF4KSB8fCBtYXhWYWx1ZS5lcXVhbHMoY3VycmVudExlbmd0aCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAobWluVmFsdWUgIT0gbnVsbCAmJiBtYXhWYWx1ZS5lcXVhbHMobWluVmFsdWUpICYmIGxlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hKCkucmVzb2x2ZVNpbXBsZVR5cGVEZWZpbml0aW9uKCJkb3VibGUiKS5lcXVhbHMoeHNkU2ltcGxlVHlwZURlZmluaXRpb24pIHx8IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hKCkucmVzb2x2ZVNpbXBsZVR5cGVEZWZpbml0aW9uKCJmbG9hdCIpLmVxdWFscyh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbikgfHwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHhzZFNjaGVtYS5nZXRTY2hlbWFGb3JTY2hlbWEoKS5yZXNvbHZlU2ltcGxlVHlwZURlZmluaXRpb24oImRlY2ltYWwiKS5lcXVhbHMoeHNkU2ltcGxlVHlwZURlZmluaXRpb24pKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEJpZ0RlY2ltYWwgYmlnRGVjaW1hbCA9IG5ldyBCaWdEZWNpbWFsKG1heFZhbHVlKTsKLSAgICAgICAgICAgICAgYmlnRGVjaW1hbC50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBOdW1iZXIgYmlnID0gbmV3IEJpZ0ludGVnZXIobWF4VmFsdWUpOwotICAgICAgICAgICAgICBiaWcudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzTnVtZXJpY0Jhc2VUeXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50TWF4ID09IG51bGwgJiYgY3VycmVudExlbmd0aCA9PSBudWxsKQotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY3VycmVudE1heEluY2x1c2l2ZSA9PSBudWxsICYmIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudE1heEV4Y2x1c2l2ZSA9PSBudWxsICYmICFtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbWF4VmFsdWUgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgZG9VcGRhdGVNYXggPSB0cnVlOwotICAgICAgfQotICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBkb1VwZGF0ZU1heCA9IGZhbHNlOwotICAgICAgICAvLyBUT0RPIHNob3cgZXJyb3IgbWVzc2FnZQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLmVxdWFscyh4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSkgJiYgKGRvVXBkYXRlTWF4IHx8IGRvVXBkYXRlTWluKSkKLSAgICB7Ci0gICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBhbm9ueW1vdXNTaW1wbGVUeXBlID0gbnVsbDsKLSAgICAgIENvbXBvdW5kQ29tbWFuZCBjb21wb3VuZENvbW1hbmQgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0gICAgICBDaGFuZ2VUb0xvY2FsU2ltcGxlVHlwZUNvbW1hbmQgY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kID0gbnVsbDsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREZlYXR1cmUpCi0gICAgICB7Ci0gICAgICAgIGFub255bW91c1NpbXBsZVR5cGUgPSBYU0RDb21tb25VSVV0aWxzLmdldEFub255bW91c1NpbXBsZVR5cGUoKFhTREZlYXR1cmUpaW5wdXQsIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKTsKLSAgICAgICAgaWYgKGFub255bW91c1NpbXBsZVR5cGUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGFub255bW91c1NpbXBsZVR5cGUgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgIGFub255bW91c1NpbXBsZVR5cGUuc2V0QmFzZVR5cGVEZWZpbml0aW9uKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKTsKLSAgICAgICAKLSAgICAgICAgICBjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQgPSBuZXcgQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ09OU1RSQUlOX0xFTkdUSCwgKFhTREZlYXR1cmUpaW5wdXQpOwotICAgICAgICAgIGNoYW5nZVRvQW5vbnltb3VzQ29tbWFuZC5zZXRBbm9ueW1vdXNTaW1wbGVUeXBlKGFub255bW91c1NpbXBsZVR5cGUpOwotICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5hZGQoY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kKTsKLSAgICAgICAgICBkb1NldElucHV0ID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNOdW1lcmljQmFzZVR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICBVcGRhdGVTdHJpbmdMZW5ndGhGYWNldENvbW1hbmQgdXBkYXRlQ29tbWFuZCA9IG5ldyBVcGRhdGVTdHJpbmdMZW5ndGhGYWNldENvbW1hbmQoIiIsIGFub255bW91c1NpbXBsZVR5cGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYgKGRvVXBkYXRlTWF4KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVwZGF0ZUNvbW1hbmQuc2V0TWF4KG1heFZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGRvVXBkYXRlTWluKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVwZGF0ZUNvbW1hbmQuc2V0TWluKG1pblZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29tcG91bmRDb21tYW5kLmFkZCh1cGRhdGVDb21tYW5kKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBVcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kIHVwZGF0ZUNvbW1hbmQgPSBuZXcgVXBkYXRlTnVtZXJpY0JvdW5kc0ZhY2V0Q29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9CT1VORFMsIGFub255bW91c1NpbXBsZVR5cGUsIG1pbmltdW1JbmNsdXNpdmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSwgbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94LmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICBpZiAoZG9VcGRhdGVNYXgpCi0gICAgICAgICAgewotICAgICAgICAgICAgdXBkYXRlQ29tbWFuZC5zZXRNYXgobWF4VmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZG9VcGRhdGVNaW4pCi0gICAgICAgICAgewotICAgICAgICAgICAgdXBkYXRlQ29tbWFuZC5zZXRNaW4obWluVmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjb21wb3VuZENvbW1hbmQuYWRkKHVwZGF0ZUNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICAgIGNvbW1hbmQgPSBjb21wb3VuZENvbW1hbmQ7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBpZiAoIWlzTnVtZXJpY0Jhc2VUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgVXBkYXRlU3RyaW5nTGVuZ3RoRmFjZXRDb21tYW5kIHVwZGF0ZUNvbW1hbmQgPSBuZXcgVXBkYXRlU3RyaW5nTGVuZ3RoRmFjZXRDb21tYW5kKCIiLCB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAoZG9VcGRhdGVNYXgpCi0gICAgICAgICAgewotICAgICAgICAgICAgdXBkYXRlQ29tbWFuZC5zZXRNYXgobWF4VmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZG9VcGRhdGVNaW4pCi0gICAgICAgICAgewotICAgICAgICAgICAgdXBkYXRlQ29tbWFuZC5zZXRNaW4obWluVmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjb21tYW5kID0gdXBkYXRlQ29tbWFuZDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBVcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kIHVwZGF0ZUNvbW1hbmQgPSBuZXcgVXBkYXRlTnVtZXJpY0JvdW5kc0ZhY2V0Q29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9CT1VORFMsIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLCBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCksIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgaWYgKGRvVXBkYXRlTWF4KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVwZGF0ZUNvbW1hbmQuc2V0TWF4KG1heFZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGRvVXBkYXRlTWluKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVwZGF0ZUNvbW1hbmQuc2V0TWluKG1pblZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29tbWFuZCA9IHVwZGF0ZUNvbW1hbmQ7Ci0gICAgICAgIH0KLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICghaXNOdW1lcmljQmFzZVR5cGUpCi0gICAgICB7Ci0gICAgICAgIFVwZGF0ZVN0cmluZ0xlbmd0aEZhY2V0Q29tbWFuZCB1cGRhdGVDb21tYW5kID0gbmV3IFVwZGF0ZVN0cmluZ0xlbmd0aEZhY2V0Q29tbWFuZCgiIiwgeHNkU2ltcGxlVHlwZURlZmluaXRpb24pOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChkb1VwZGF0ZU1heCkKLSAgICAgICAgewotICAgICAgICAgIHVwZGF0ZUNvbW1hbmQuc2V0TWF4KG1heFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZG9VcGRhdGVNaW4pCi0gICAgICAgIHsKLSAgICAgICAgICB1cGRhdGVDb21tYW5kLnNldE1pbihtaW5WYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh1cGRhdGVDb21tYW5kKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgVXBkYXRlTnVtZXJpY0JvdW5kc0ZhY2V0Q29tbWFuZCB1cGRhdGVDb21tYW5kID0gbmV3IFVwZGF0ZU51bWVyaWNCb3VuZHNGYWNldENvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfQk9VTkRTLCB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiwgbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LmdldFNlbGVjdGlvbigpLCBtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBpZiAoZG9VcGRhdGVNYXgpCi0gICAgICAgIHsKLSAgICAgICAgICB1cGRhdGVDb21tYW5kLnNldE1heChtYXhWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRvVXBkYXRlTWluKQotICAgICAgICB7Ci0gICAgICAgICAgdXBkYXRlQ29tbWFuZC5zZXRNaW4obWluVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUodXBkYXRlQ29tbWFuZCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICB9Ci0gICAgcmVmcmVzaCgpOwotICAgIGlmIChkb1NldElucHV0KQotICAgICAgc2V0SW5wdXQoZ2V0UGFydCgpLCBnZXRTZWxlY3Rpb24oKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uKQotICAgIHsKLSAgICAgICBDb21wb3VuZENvbW1hbmQgY29tcG91bmRDb21tYW5kID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIGFub255bW91c1NpbXBsZVR5cGUgPSBudWxsOwotICAgICAgIGlmIChYU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEuZXF1YWxzKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKSkKLSAgICAgICB7Ci0gICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RGZWF0dXJlKQotICAgICAgICAgewotICAgICAgICAgICBhbm9ueW1vdXNTaW1wbGVUeXBlID0gWFNEQ29tbW9uVUlVdGlscy5nZXRBbm9ueW1vdXNTaW1wbGVUeXBlKChYU0RGZWF0dXJlKWlucHV0LCB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbik7Ci0gICAgICAgICAgIGlmIChhbm9ueW1vdXNTaW1wbGVUeXBlID09IG51bGwpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBhbm9ueW1vdXNTaW1wbGVUeXBlID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2ltcGxlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICAgICBhbm9ueW1vdXNTaW1wbGVUeXBlLnNldEJhc2VUeXBlRGVmaW5pdGlvbih4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbik7Ci0gICAgICAgICAgIAotICAgICAgICAgICAgIENoYW5nZVRvTG9jYWxTaW1wbGVUeXBlQ29tbWFuZCBjaGFuZ2VUb0Fub255bW91c0NvbW1hbmQgPSBuZXcgQ2hhbmdlVG9Mb2NhbFNpbXBsZVR5cGVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ09OU1RSQUlOX0xFTkdUSCwgKFhTREZlYXR1cmUpaW5wdXQpOwotICAgICAgICAgICAgIGNoYW5nZVRvQW5vbnltb3VzQ29tbWFuZC5zZXRBbm9ueW1vdXNTaW1wbGVUeXBlKGFub255bW91c1NpbXBsZVR5cGUpOwotICAgICAgICAgICAgIGNvbXBvdW5kQ29tbWFuZC5hZGQoY2hhbmdlVG9Bbm9ueW1vdXNDb21tYW5kKTsKLSAgICAgICAgICAgfQotICAKLSAgICAgICAgICAgVXBkYXRlWFNEV2hpdGVTcGFjZUZhY2V0Q29tbWFuZCB3aGl0ZVNwYWNlQ29tbWFuZCA9IG5ldyBVcGRhdGVYU0RXaGl0ZVNwYWNlRmFjZXRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ09MTEFQU0VfV0hJVEVTUEFDRSwgYW5vbnltb3VzU2ltcGxlVHlwZSwgY29sbGFwc2VXaGl0ZXNwYWNlQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgY29tcG91bmRDb21tYW5kLmFkZCh3aGl0ZVNwYWNlQ29tbWFuZCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21wb3VuZENvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICAgICBzZXRJbnB1dChnZXRQYXJ0KCksIGdldFNlbGVjdGlvbigpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgVXBkYXRlWFNEV2hpdGVTcGFjZUZhY2V0Q29tbWFuZCB3aGl0ZVNwYWNlQ29tbWFuZCA9IG5ldyBVcGRhdGVYU0RXaGl0ZVNwYWNlRmFjZXRDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQ09MTEFQU0VfV0hJVEVTUEFDRSwgeHNkU2ltcGxlVHlwZURlZmluaXRpb24sIGNvbGxhcHNlV2hpdGVzcGFjZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUod2hpdGVTcGFjZUNvbW1hbmQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3gpCi0gICAgewotICAgICAgU3RyaW5nIG1pblZhbHVlID0gbWluTGVuZ3RoVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgaWYgKG1pblZhbHVlLmxlbmd0aCgpID09IDApIG1pblZhbHVlID0gbnVsbDsKLQotICAgICAgVXBkYXRlTnVtZXJpY0JvdW5kc0ZhY2V0Q29tbWFuZCB1cGRhdGVDb21tYW5kID0gbmV3IFVwZGF0ZU51bWVyaWNCb3VuZHNGYWNldENvbW1hbmQoTWVzc2FnZXMuX1VJX0FDVElPTl9VUERBVEVfQk9VTkRTLCB4c2RTaW1wbGVUeXBlRGVmaW5pdGlvbiwgbWluaW11bUluY2x1c2l2ZUNoZWNrYm94LmdldFNlbGVjdGlvbigpLCBtYXhpbXVtSW5jbHVzaXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgdXBkYXRlQ29tbWFuZC5zZXRNaW4obWluVmFsdWUpOwotICAgICAgCi0gICAgICBpZiAobWluVmFsdWUgIT0gbnVsbCkKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh1cGRhdGVDb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gbWF4aW11bUluY2x1c2l2ZUNoZWNrYm94KQotICAgIHsKLSAgICAgIFN0cmluZyBtYXhWYWx1ZSA9IG1heExlbmd0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgIGlmIChtYXhWYWx1ZS5sZW5ndGgoKSA9PSAwKSBtYXhWYWx1ZSA9IG51bGw7Ci0gICAgICBVcGRhdGVOdW1lcmljQm91bmRzRmFjZXRDb21tYW5kIHVwZGF0ZUNvbW1hbmQgPSBuZXcgVXBkYXRlTnVtZXJpY0JvdW5kc0ZhY2V0Q29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1VQREFURV9CT1VORFMsIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uLCBtaW5pbXVtSW5jbHVzaXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCksIG1heGltdW1JbmNsdXNpdmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICB1cGRhdGVDb21tYW5kLnNldE1heChtYXhWYWx1ZSk7Ci0gICAgICBpZiAobWF4VmFsdWUgIT0gbnVsbCkKLSAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZSh1cGRhdGVDb21tYW5kKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gdXNlRW51bWVyYXRpb25zQnV0dG9uKQotICAgIHsKLSAgICAgIGNvbnN0cmFpbnRzV2lkZ2V0LmFkZEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkpCi0gICAgICAgIGNvbnN0cmFpbnRzV2lkZ2V0LnNldENvbnN0cmFpbnRLaW5kKFNwZWNpZmljQ29uc3RyYWludHNXaWRnZXQuRU5VTUVSQVRJT04pOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSB1c2VQYXR0ZXJuc0J1dHRvbikKLSAgICB7Ci0gICAgICBjb25zdHJhaW50c1dpZGdldC5hZGRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSkKLSAgICAgICAgY29uc3RyYWludHNXaWRnZXQuc2V0Q29uc3RyYWludEtpbmQoU3BlY2lmaWNDb25zdHJhaW50c1dpZGdldC5QQVRURVJOKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RGYWNldFNlY3Rpb25GaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNERmFjZXRTZWN0aW9uRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYzU3YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RGYWNldFNlY3Rpb25GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFhTREZhY2V0U2VjdGlvbkZpbHRlciBpbXBsZW1lbnRzIElGaWx0ZXIKLXsKLSAgcHVibGljIGJvb2xlYW4gc2VsZWN0KE9iamVjdCB0b1Rlc3QpCi0gIHsKLSAgICBpZiAodG9UZXN0IGluc3RhbmNlb2YgWFNERmVhdHVyZSkKLSAgICB7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gKChYU0RGZWF0dXJlKXRvVGVzdCkuZ2V0UmVzb2x2ZWRGZWF0dXJlKCkuZ2V0VHlwZSgpOwotICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHRvVGVzdCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKXRvVGVzdDsKLSAgICAgIGlmIChzdC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RTY2hlbWEgfHwKLSAgICAgICAgICBzdC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBYU0RGZWF0dXJlKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTREltcG9ydFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNESW1wb3J0U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjJiZTkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNESW1wb3J0U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlsLlhNTENoYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC52aWV3ZXJzLlJlc291cmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuVHlwZXNIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC53aXphcmRzLlhTRFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RJbXBvcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNESW1wb3J0U2VjdGlvbiBleHRlbmRzIFNjaGVtYUxvY2F0aW9uU2VjdGlvbgotewotICBwcm90ZWN0ZWQgVGV4dCBuYW1lc3BhY2VUZXh0LCBwcmVmaXhUZXh0OwotICBwcm90ZWN0ZWQgU3RyaW5nIG9sZFByZWZpeFZhbHVlOwotCi0gIHB1YmxpYyBYU0RJbXBvcnRTZWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0gICAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotICAgKi8KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQotICAgIC8vIENyZWF0ZSBTY2hlbWEgTG9jYXRpb24gTGFiZWwKLSAgICBDTGFiZWwgbmFtZXNwYWNlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX05BTUVTUEFDRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIG5hbWVzcGFjZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBuYW1lc3BhY2VUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0gICAgbmFtZXNwYWNlVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBhcHBseUFsbExpc3RlbmVycyhuYW1lc3BhY2VUZXh0KTsKLSAgICBuYW1lc3BhY2VUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBEdW1teUxhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIENMYWJlbCBwcmVmaXhMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfUFJFRklYIikpOyAvLyROT04tTkxTLTEkCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIHByZWZpeExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBwcmVmaXhUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0gICAgcHJlZml4VGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLSAgICBhcHBseUFsbExpc3RlbmVycyhwcmVmaXhUZXh0KTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHByZWZpeFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIER1bW15TGFiZWwKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gQ3JlYXRlIFNjaGVtYSBMb2NhdGlvbiBMYWJlbAotICAgIENMYWJlbCBzY2hlbWFMb2NhdGlvbkxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9TQ0hFTUFfTE9DQVRJT04iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgc2NoZW1hTG9jYXRpb25MYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gQ3JlYXRlIFNjaGVtYSBMb2NhdGlvbiBUZXh0Ci0gICAgc2NoZW1hTG9jYXRpb25UZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0gICAgc2NoZW1hTG9jYXRpb25UZXh0LnNldEVkaXRhYmxlKHRydWUpOwotICAgIGFwcGx5QWxsTGlzdGVuZXJzKHNjaGVtYUxvY2F0aW9uVGV4dCk7Ci0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHNjaGVtYUxvY2F0aW9uVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gQ3JlYXRlIFdpemFyZCBCdXR0b24KLSAgICB3aXphcmRCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotICAgIHdpemFyZEJ1dHRvbi5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL2Jyb3dzZWJ1dHRvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgd2l6YXJkQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgd2l6YXJkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgLy8gZXJyb3IgdGV4dAotICAgIGVycm9yVGV4dCA9IG5ldyBTdHlsZWRUZXh0KGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIGVycm9yVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgZXJyb3JUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgIGVycm9yVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBlcnJvclRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2NoZW1hTG9jYXRpb25UZXh0LAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19JTVBPUlRfX1NDSEVNQUxPQ0FUSU9OKTsKLQotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobmFtZXNwYWNlVGV4dCwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fSU1QT1JUX19OQU1FU1BBQ0UpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocHJlZml4VGV4dCwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fSU1QT1JUX19QUkVGSVgpOwotCi0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0KLSAgICBlcnJvclRleHQuc2V0VGV4dCgiIik7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RJbXBvcnQpCi0gICAgewotICAgICAgZWxlbWVudCA9ICgoWFNESW1wb3J0KSBpbnB1dCkuZ2V0RWxlbWVudCgpOwotCi0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWVzcGFjZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBTdHJpbmcgc2NoZW1hTG9jYXRpb24gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgic2NoZW1hTG9jYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICAgIFN0cmluZyBwcmVmaXggPSBoZWxwZXIuZ2V0UHJlZml4KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FU1BBQ0VfQVRUUklCVVRFKSwgZmFsc2UpOwotCi0gICAgICBpZiAobmFtZXNwYWNlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5hbWVzcGFjZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0KLSAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLQotICAgICAgaWYgKHNjaGVtYUxvY2F0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNjaGVtYUxvY2F0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLQotICAgICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KG5hbWVzcGFjZSk7Ci0gICAgICBwcmVmaXhUZXh0LnNldFRleHQocHJlZml4KTsKLSAgICAgIHNjaGVtYUxvY2F0aW9uVGV4dC5zZXRUZXh0KHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgIG9sZFByZWZpeFZhbHVlID0gcHJlZml4VGV4dC5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoZXZlbnQud2lkZ2V0ID09IHdpemFyZEJ1dHRvbikKLSAgICB7Ci0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgICAgU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCi0gICAgICBJRmlsZSBjdXJyZW50SUZpbGUgPSBudWxsOwotICAgICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgIFZpZXdlckZpbHRlciBmaWx0ZXI7Ci0gICAgICBpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQotICAgICAgewotICAgICAgICBjdXJyZW50SUZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpZWRpdG9ySW5wdXQpLmdldEZpbGUoKTsKLSAgICAgICAgZmlsdGVyID0gbmV3IFJlc291cmNlRmlsdGVyKG5ldyBTdHJpbmdbXSB7ICIueHNkIiB9LCAvLyROT04tTkxTLTEkIAotICAgICAgICAgICAgbmV3IElGaWxlW10geyBjdXJyZW50SUZpbGUgfSwgbnVsbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZpbHRlciA9IG5ldyBSZXNvdXJjZUZpbHRlcihuZXcgU3RyaW5nW10geyAiLnhzZCIgfSwgLy8kTk9OLU5MUy0xJCAKLSAgICAgICAgICAgIG51bGwsIG51bGwpOwotICAgICAgfQotCi0gICAgICBYU0RTZWxlY3RJbmNsdWRlRmlsZVdpemFyZCBmaWxlU2VsZWN0V2l6YXJkID0gbmV3IFhTRFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkKHhzZFNjaGVtYSwgZmFsc2UsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9GSUxFRElBTE9HX1NFTEVDVF9YTUxfU0NIRU1BIiksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfRklMRURJQUxPR19TRUxFQ1RfWE1MX0RFU0MiKSwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGZpbHRlciwgKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKSk7Ci0KLSAgICAgIFdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCBmaWxlU2VsZWN0V2l6YXJkKTsKLSAgICAgIHdpemFyZERpYWxvZy5jcmVhdGUoKTsKLSAgICAgIHdpemFyZERpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICAgIGludCByZXN1bHQgPSB3aXphcmREaWFsb2cub3BlbigpOwotCi0gICAgICBTdHJpbmcgdmFsdWUgPSBzY2hlbWFMb2NhdGlvblRleHQuZ2V0VGV4dCgpOwotICAgICAgcHJlZml4VGV4dC5yZW1vdmVMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLSAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotICAgICAgewotICAgICAgICBlcnJvclRleHQuc2V0VGV4dCgiIik7Ci0gICAgICAgIElGaWxlIHNlbGVjdGVkSUZpbGUgPSBmaWxlU2VsZWN0V2l6YXJkLmdldFJlc3VsdEZpbGUoKTsKLSAgICAgICAgU3RyaW5nIHNjaGVtYUZpbGVTdHJpbmcgPSB2YWx1ZTsKLSAgICAgICAgaWYgKHNlbGVjdGVkSUZpbGUgIT0gbnVsbCAmJiBjdXJyZW50SUZpbGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNjaGVtYUZpbGVTdHJpbmcgPSBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkoc2VsZWN0ZWRJRmlsZS5nZXRMb2NhdGlvbigpLCBjdXJyZW50SUZpbGUuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2VsZWN0ZWRJRmlsZSAhPSBudWxsICYmIGN1cnJlbnRJRmlsZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc2NoZW1hRmlsZVN0cmluZyA9IHNlbGVjdGVkSUZpbGUuZ2V0TG9jYXRpb25VUkkoKS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHNjaGVtYUZpbGVTdHJpbmcgPSBmaWxlU2VsZWN0V2l6YXJkLmdldFVSTCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGZpbGVTZWxlY3RXaXphcmQuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgICAgICBuYW1lc3BhY2UgPSAiIjsKLQotICAgICAgICBYU0RTY2hlbWEgZXh0ZXJuYWxTY2hlbWEgPSBmaWxlU2VsZWN0V2l6YXJkLmdldEV4dGVybmFsU2NoZW1hKCk7Ci0gICAgICAgIGhhbmRsZVNjaGVtYUxvY2F0aW9uQ2hhbmdlKHNjaGVtYUZpbGVTdHJpbmcsIG5hbWVzcGFjZSwgZXh0ZXJuYWxTY2hlbWEpOwotICAgICAgfQotICAgICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICAgICAgcHJlZml4VGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLS8vICAgICAgfQotLy8gICAgICBlbHNlCi0vLyAgICAgIHsKLS8vICAgICAgICBCcm93c2VJbldvcmtzcGFjZUFjdGlvbiBicm93c2VJbldvcmtzcGFjZSA9IG5ldyBCcm93c2VJbldvcmtzcGFjZUFjdGlvbihzaGVsbCk7Ci0vLyAgICAgICAgYnJvd3NlSW5Xb3Jrc3BhY2UucnVuKCk7Ci0vLyAgICAgICAgSUZpbGUgc2VsZWN0ZWRJRmlsZSA9IGJyb3dzZUluV29ya3NwYWNlLmdldFNlbGVjdGVkRmlsZSgpOwotLy8gICAgICAgIFN0cmluZyB2YWx1ZSA9IHNjaGVtYUxvY2F0aW9uVGV4dC5nZXRUZXh0KCk7Ci0vLyAgICAgICAgU3RyaW5nIHNjaGVtYUZpbGVTdHJpbmcgPSB2YWx1ZTsKLS8vICAgICAgICBpZiAoc2VsZWN0ZWRJRmlsZSAhPSBudWxsKSAKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICAvL3NjaGVtYUZpbGVTdHJpbmcgPSBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkoc2VsZWN0ZWRJRmlsZS5nZXRMb2NhdGlvbigpLCBjdXJyZW50SUZpbGUuZ2V0TG9jYXRpb24oKSk7Ci0vLyAgICAgICAgICBzY2hlbWFGaWxlU3RyaW5nID0gc2VsZWN0ZWRJRmlsZS5nZXRMb2NhdGlvblVSSSgpLnRvU3RyaW5nKCk7Ci0vLyAgICAgICAgICBoYW5kbGVTY2hlbWFMb2NhdGlvbkNoYW5nZShzY2hlbWFGaWxlU3RyaW5nLCAiIiwgbnVsbCk7Ci0vLyAgICAgICAgICByZWZyZXNoKCk7Ci0vLyAgICAgICAgfQotLy8KLS8vICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVNjaGVtYUxvY2F0aW9uQ2hhbmdlKFN0cmluZyBzY2hlbWFGaWxlU3RyaW5nLCBTdHJpbmcgbmFtZXNwYWNlLCBYU0RTY2hlbWEgZXh0ZXJuYWxTY2hlbWEpCi0gIHsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RJbXBvcnQpCi0gICAgewotICAgICAgWFNESW1wb3J0IHhzZEltcG9ydCA9IChYU0RJbXBvcnQpIGlucHV0OwotCi0gICAgICB4c2RJbXBvcnQuc2V0TmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0gICAgICB4c2RJbXBvcnQuc2V0U2NoZW1hTG9jYXRpb24oc2NoZW1hRmlsZVN0cmluZyk7Ci0gICAgICB4c2RJbXBvcnQuc2V0UmVzb2x2ZWRTY2hlbWEoZXh0ZXJuYWxTY2hlbWEpOwotCi0gICAgICBqYXZhLnV0aWwuTWFwIG1hcCA9IHhzZFNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0KLSAgICAgIC8vIFJlZmVyZW50aWFsIGludGVncml0eSBvbiBvbGQgaW1wb3J0Ci0gICAgICAvLyBIb3cgY2FuIHdlIGJlIHN1cmUgdGhhdCBpZiB0aGUgbmV3bG9jYXRpb24gaXMgdGhlIHNhbWUgYXMgdGhlCi0gICAgICAvLyBvbGRsb2NhdGlvbgotICAgICAgLy8gdGhlIGZpbGUgaGFzbid0IGNoYW5nZWQKLQotLy8gICAgICBYU0RTY2hlbWEgcmVmZXJlbmNlZFNjaGVtYSA9IHhzZEltcG9ydC5nZXRSZXNvbHZlZFNjaGVtYSgpOwotLy8gICAgICBpZiAocmVmZXJlbmNlZFNjaGVtYSAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgICAgWFNERXh0ZXJuYWxGaWxlQ2xlYW51cCBjbGVhbkhlbHBlciA9IG5ldwotLy8gICAgICAgIFhTREV4dGVybmFsRmlsZUNsZWFudXAocmVmZXJlbmNlZFNjaGVtYSk7Ci0vLyAgICAgICAgY2xlYW5IZWxwZXIudmlzaXRTY2hlbWEoeHNkU2NoZW1hKTsKLS8vICAgICAgfQotCi0gICAgICBFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpOwotCi0gICAgICAvLyB1cGRhdGUgdGhlIHhtbG5zIGluIHRoZSBzY2hlbWEgZWxlbWVudCBmaXJzdCwgYW5kIHRoZW4gdXBkYXRlIHRoZQotICAgICAgLy8gaW1wb3J0IGVsZW1lbnQgbmV4dAotICAgICAgLy8gc28gdGhhdCB0aGUgbGFzdCBjaGFuZ2Ugd2lsbCBiZSBpbiB0aGUgaW1wb3J0IGVsZW1lbnQuIFRoaXMga2VlcHMgdGhlCi0gICAgICAvLyBzZWxlY3Rpb24KLSAgICAgIC8vIG9uIHRoZSBpbXBvcnQgZWxlbWVudAotICAgICAgVHlwZXNIZWxwZXIgaGVscGVyID0gbmV3IFR5cGVzSGVscGVyKGV4dGVybmFsU2NoZW1hKTsKLSAgICAgIFN0cmluZyBwcmVmaXggPSBoZWxwZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSwgZmFsc2UpOwotCi0gICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KHByZWZpeCkpCi0gICAgICB7Ci0gICAgICAgIHByZWZpeCA9IG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwcmVmaXggPT0gbnVsbCB8fCAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID09IDApKQotICAgICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgbmV3UHJlZml4ID0gbmV3IFN0cmluZ0J1ZmZlcigicHJlZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGludCBwcmVmaXhFeHRlbnNpb24gPSAxOwotICAgICAgICB3aGlsZSAobWFwLmNvbnRhaW5zS2V5KG5ld1ByZWZpeC50b1N0cmluZygpKSAmJiBwcmVmaXhFeHRlbnNpb24gPCAxMDApCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdQcmVmaXggPSBuZXcgU3RyaW5nQnVmZmVyKCJwcmVmIiArIFN0cmluZy52YWx1ZU9mKHByZWZpeEV4dGVuc2lvbikpOwotICAgICAgICAgIHByZWZpeEV4dGVuc2lvbisrOwotICAgICAgICB9Ci0gICAgICAgIHByZWZpeCA9IG5ld1ByZWZpeC50b1N0cmluZygpOwotICAgICAgfQotCi0gICAgICBpZiAobmFtZXNwYWNlLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgLy8gaWYgbnMgYWxyZWFkeSBpbiBtYXAsIHVzZSBpdHMgY29ycmVzcG9uZGluZyBwcmVmaXgKLSAgICAgICAgaWYgKG1hcC5jb250YWluc1ZhbHVlKG5hbWVzcGFjZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBUeXBlc0hlbHBlciB0eXBlc0hlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgICAgICAgIHByZWZpeCA9IHR5cGVzSGVscGVyLmdldFByZWZpeChuYW1lc3BhY2UsIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIC8vIG90aGVyd2lzZSBhZGQgdG8gdGhlIG1hcAotICAgICAgICB7Ci0gICAgICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyBwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJlZml4VGV4dC5zZXRUZXh0KHByZWZpeCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHByZWZpeFRleHQuc2V0VGV4dCgiIik7Ci0gICAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU1ODg1Ci0gICAgICAvLyBOZWVkIHRvIGltcG9ydCBvdGhlcndpc2UgdGhlIGV4dGVybmFsIHNjaGVtYSBpcyBuZXZlcgotICAgICAgLy8gcmVzb2x2ZWQuICBPbmUgcHJvYmxlbSBpcyB0aGF0IHRoZSBzY2hlbWEgbG9jYXRpb24gaXMgc3RpbGwgbnVsbCwKLSAgICAgIC8vIHNvIHRoZSBzZXQgdHlwZXMgZGlhbG9nIHdpbGwgc2hvdyB0eXBlcyB0aGF0IGJlbG9uZyB0byB0aGF0IHNjaGVtYQotICAgICAgLy8gd2l0aCBhIG51bGwgc2NoZW1hIGxvY2F0aW9uLiAgVGhpcyBzaG91bGQgbG9hZCByZXNvdXJjZSAKLSAgICAgIC8vIGludG8gdGhlIHJlc291cmNlIHNldAotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNESW1wb3J0SW1wbCkgIC8vIHJlZHVuZGFudAotICAgICAgewotICAgICAgICBYU0RJbXBvcnRJbXBsIHhzZEltcG9ydEltcGwgPSAoWFNESW1wb3J0SW1wbCkgaW5wdXQ7Ci0gICAgICAgIHhzZEltcG9ydEltcGwuaW1wb3J0U2NoZW1hKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJlZnJlc2goKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgc3VwZXIuZG9IYW5kbGVFdmVudChldmVudCk7Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBwcmVmaXhUZXh0KQotICAgIHsKLSAgICAgIFN0cmluZyBuZXdQcmVmaXggPSBwcmVmaXhUZXh0LmdldFRleHQoKTsKLSAgICAgIGlmIChvbGRQcmVmaXhWYWx1ZS5lcXVhbHMobmV3UHJlZml4KSB8fCAhaXNWYWxpZFNjaGVtYUxvY2F0aW9uKQotICAgICAgICByZXR1cm47Ci0gICAgICBNYXAgbWFwID0geHNkU2NoZW1hLmdldFFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAoKTsKLSAgICAgIFN0cmluZyBrZXkgPSBwcmVmaXhUZXh0LmdldFRleHQoKTsgICAgICAKLSAgICAgIGlmIChrZXkubGVuZ3RoKCkgPT0gMCkga2V5ID0gbnVsbDsKLSAgICAgIAotICAgICAgaWYgKHZhbGlkYXRlUHJlZml4KG5ld1ByZWZpeCkgJiYgc2NoZW1hTG9jYXRpb25UZXh0LmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KGtleSkpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX0VSUk9SX0xBQkVMX1BSRUZJWF9FWElTVFMiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCBzY2hlbWFFbGVtZW50ID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAKLSAgICAgICAgICBpZiAoa2V5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChvbGRQcmVmaXhWYWx1ZS5sZW5ndGgoKSA9PSAwKSAKLSAgICAgICAgICAgICAgc2NoZW1hRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoInhtbG5zIik7Ci0gICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICBzY2hlbWFFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgieG1sbnM6IitvbGRQcmVmaXhWYWx1ZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgbmV3UHJlZml4LCBuYW1lc3BhY2VUZXh0LmdldFRleHQoKSk7Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJ4bWxuczoiK29sZFByZWZpeFZhbHVlKTsKLSAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxucyIsIG5hbWVzcGFjZVRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgeHNkU2NoZW1hLnVwZGF0ZUVsZW1lbnQoKTsKLSAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgICAgb2xkUHJlZml4VmFsdWUgPSBuZXdQcmVmaXg7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9FUlJPUl9MQUJFTF9JTlZBTElEX1BSRUZJWCIpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhYm91dFRvQmVIaWRkZW4oKQotICB7Ci0gICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgIHN1cGVyLmFib3V0VG9CZUhpZGRlbigpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVByZWZpeChTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgaWYgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKHByZWZpeCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNETW9kZWxHcm91cERlZmluaXRpb25TZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRE1vZGVsR3JvdXBEZWZpbml0aW9uU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTY3ZWZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNETW9kZWxHcm91cERlZmluaXRpb25TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5YTUxDaGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZU5hbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5UeXBlc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uU2VjdGlvbiBleHRlbmRzIE11bHRpcGxpY2l0eVNlY3Rpb24KLXsKLSAgcHJvdGVjdGVkIFRleHQgbmFtZVRleHQ7Ci0gIHByb3RlY3RlZCBDQ29tYm8gY29tcG9uZW50TmFtZUNvbWJvOwotICBib29sZWFuIGlzUmVmZXJlbmNlOwotCi0gIHB1YmxpYyBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvblNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgaWYgKGlzUmVmZXJlbmNlKQotICAgIHsKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gUmVmIExhYmVsCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgICBDTGFiZWwgcmVmTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUgKyAiOiIpOyAvLyROT04tTkxTLTEkCi0gICAgICByZWZMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIFJlZiBDb21ibwotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLSAgICAgIGNvbXBvbmVudE5hbWVDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0gICAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgIAotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb25lbnROYW1lQ29tYm8sCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9SRUZTX19SRUYpOwotICAgICAgCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIG1pbiBwcm9wZXJ0eQotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgCi0gICAgCQkgIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzLlVJX0xBQkVMX01JTk9DQ1VSUyk7Ci0gICAgICAKLSAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLSAgICAgIG1pbkNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICAgIG1pbkNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICBtaW5Db21iby5hZGQoIjAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgbWluQ29tYm8uYWRkKCIxIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGFwcGx5QWxsTGlzdGVuZXJzKG1pbkNvbWJvKTsKLSAgICAgIG1pbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgCi0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG1pbkNvbWJvLAotICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX01PREVMR1JPVVBfX01JTl9PQ0NVUkVOQ0UpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIG1heCBwcm9wZXJ0eQotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgCi0gICAgCQkgIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzLlVJX0xBQkVMX01BWE9DQ1VSUyk7Ci0KLSAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLSAgICAgIG1heENvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICAgIG1heENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICBtYXhDb21iby5hZGQoIjAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgbWF4Q29tYm8uYWRkKCIxIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIG1heENvbWJvLmFkZCgidW5ib3VuZGVkIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGFwcGx5QWxsTGlzdGVuZXJzKG1heENvbWJvKTsKLSAgICAgIG1heENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgCi0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG1heENvbWJvLAotICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX01PREVMR1JPVVBfX01BWF9PQ0NVUkVOQ0UpOwotICAgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIE5hbWVMYWJlbAotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgICAgQ0xhYmVsIG5hbWVMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5fVUlfTEFCRUxfTkFNRSk7Ci0gICAgICBuYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAvLyBOYW1lVGV4dAotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIG5hbWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIG5hbWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICBhcHBseUFsbExpc3RlbmVycyhuYW1lVGV4dCk7Ci0gICAgICAKLSAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobmFtZVRleHQsCi0gICAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fTU9ERUxHUk9VUF9ERUZJTklUSU9OX19OQU1FKTsKLQotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAvLyBSZWZhY3Rvci9yZW5hbWUgaHlwZXJsaW5rIAotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICBjcmVhdGVSZW5hbWVIeXBlcmxpbmsoY29tcG9zaXRlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2goKTsKLQotICAgIGlmIChpc1JlYWRPbmx5KQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKHRydWUpOwotICAgIH0KLQotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0KLSAgICBYU0ROYW1lZENvbXBvbmVudCBuYW1lZENvbXBvbmVudCA9IChYU0ROYW1lZENvbXBvbmVudCkgaW5wdXQ7Ci0KLSAgICBpZiAoaXNSZWZlcmVuY2UpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gbmFtZWRDb21wb25lbnQuZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGF0dHJWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFKTsKLSAgICAgICAgaWYgKGF0dHJWYWx1ZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYXR0clZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0VGV4dChhdHRyVmFsdWUpOwotCi0gICAgICAgIC8vIHJlZnJlc2ggbWluIG1heAotICAgICAgICBpZiAobWluQ29tYm8gIT0gbnVsbCAmJiBtYXhDb21ibyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVmcmVzaE1pbk1heCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyByZWZyZXNoIG5hbWUKLSAgICAgIG5hbWVUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgIFN0cmluZyBuYW1lID0gbmFtZWRDb21wb25lbnQuZ2V0TmFtZSgpOwotICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmFtZVRleHQuc2V0VGV4dChuYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHN1cGVyLnNldElucHV0KHBhcnQsIHNlbGVjdGlvbik7Ci0gICAgaW5pdCgpOwotICAgIHJlbGF5b3V0KCk7Ci0gICAgCi0gICAgaWYgKGlzUmVmZXJlbmNlKQotICAgIHsKLSAgICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgICAgTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGl0ZW1zID0gaGVscGVyLmdldE1vZGVsR3JvdXBzKCk7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNETW9kZWxHcm91cERlZmluaXRpb24gZ3JvdXAgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIGlucHV0OwotICAgICAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSBncm91cC5nZXRDb250YWluZXIoKTsKLSAgICAgICAgd2hpbGUgKHBhcmVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGl0ZW1zLnJlbW92ZSgoKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKXBhcmVudCkuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldENvbnRhaW5lcigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpdGVtcy5hZGQoMCwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0SXRlbXMoKFN0cmluZyBbXSlpdGVtcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkKLSAgewotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIGdyb3VwID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBpbnB1dDsKLSAgICAgIGlzUmVmZXJlbmNlID0gZ3JvdXAuaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbGF5b3V0KCkKLSAgewotICAgIENvbXBvc2l0ZSBwYXJlbnRDb21wb3NpdGUgPSBjb21wb3NpdGUuZ2V0UGFyZW50KCk7Ci0gICAgcGFyZW50Q29tcG9zaXRlLmdldFBhcmVudCgpLnNldFJlZHJhdyhmYWxzZSk7Ci0KLSAgICBpZiAocGFyZW50Q29tcG9zaXRlICE9IG51bGwgJiYgIXBhcmVudENvbXBvc2l0ZS5pc0Rpc3Bvc2VkKCkpCi0gICAgewotICAgICAgQ29udHJvbFtdIGNoaWxkcmVuID0gcGFyZW50Q29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBjaGlsZHJlbltpXS5kaXNwb3NlKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm93IGluaXRpYWxpemUgdGhlIG5ldyBoYW5kbGVyCi0gICAgY3JlYXRlQ29udGVudHMocGFyZW50Q29tcG9zaXRlKTsKLSAgICBwYXJlbnRDb21wb3NpdGUuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUsIHRydWUpOwotCi0gICAgLy8gTm93IHR1cm4gcGFpbnRpbmcgYmFjayBvbgotICAgIHBhcmVudENvbXBvc2l0ZS5nZXRQYXJlbnQoKS5zZXRSZWRyYXcodHJ1ZSk7Ci0gICAgcmVmcmVzaCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIHN1cGVyLmRvSGFuZGxlRXZlbnQoZXZlbnQpOwotICAgIGlmIChldmVudC53aWRnZXQgPT0gbmFtZVRleHQpCi0gICAgewotICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBYU0ROYW1lZENvbXBvbmVudCBuYW1lZENvbXBvbmVudCA9IChYU0ROYW1lZENvbXBvbmVudCkgaW5wdXQ7Ci0gICAgICAgIGlmICghdmFsaWRhdGVTZWN0aW9uKCkpCi0gICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIENvbW1hbmQgY29tbWFuZCA9IG51bGw7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIGFuIGFjdHVhbCBuYW1lIGNoYW5nZSBoYXMgdGFrZW4gcGxhY2UKLSAgICAgICAgU3RyaW5nIG9sZE5hbWUgPSBuYW1lZENvbXBvbmVudC5nZXROYW1lKCk7Ci0gICAgICAgIGlmICghbmV3VmFsdWUuZXF1YWxzKG9sZE5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgY29tbWFuZCA9IG5ldyBVcGRhdGVOYW1lQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX1JFTkFNRSwgbmFtZWRDb21wb25lbnQsIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb21tYW5kICE9IG51bGwgJiYgZ2V0Q29tbWFuZFN0YWNrKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZG9SZWZlcmVudGlhbEludGVncml0eUNoZWNrKG5hbWVkQ29tcG9uZW50LCBuZXdWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVTZWN0aW9uKCkKLSAgewotICAgIGlmIChuYW1lVGV4dCA9PSBudWxsIHx8IG5hbWVUZXh0LmlzRGlzcG9zZWQoKSkKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0gICAgU3RyaW5nIG5hbWUgPSBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCi0gICAgLy8gdmFsaWRhdGUgYWdhaW5zdCBOQ05hbWUKLSAgICBpZiAobmFtZS5sZW5ndGgoKSA8IDEgfHwgIVhNTENoYXIuaXNWYWxpZE5DTmFtZShuYW1lKSkKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuX1VJX0VSUk9SX0lOVkFMSURfTkFNRSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBjb21wb25lbnROYW1lQ29tYm8pCi0gICAgewotICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gY29tcG9uZW50TmFtZUNvbWJvLmdldFRleHQoKTsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBYU0ROYW1lZENvbXBvbmVudCBuYW1lZENvbXBvbmVudCA9IChYU0ROYW1lZENvbXBvbmVudClpbnB1dDsKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gbmFtZWRDb21wb25lbnQuZ2V0RWxlbWVudCgpOwotCi0gICAgICAgIGlmIChuYW1lZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUsIG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5kb1dpZGdldFNlbGVjdGVkKGUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGlmIChuYW1lVGV4dCAhPSBudWxsICYmICFuYW1lVGV4dC5pc0Rpc3Bvc2VkKCkpCi0gICAgICByZW1vdmVMaXN0ZW5lcnMobmFtZVRleHQpOwotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RNb2RlbEdyb3VwU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RNb2RlbEdyb3VwU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjk1ZjdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNETW9kZWxHcm91cFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVDb250ZW50TW9kZWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvckNTSGVscElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9zaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBYU0RNb2RlbEdyb3VwU2VjdGlvbiBleHRlbmRzIE11bHRpcGxpY2l0eVNlY3Rpb24KLXsKLSAgcHJvdGVjdGVkIENDb21ibyBtb2RlbEdyb3VwQ29tYm87Ci0gIHByaXZhdGUgU3RyaW5nW10gbW9kZWxHcm91cENvbWJvVmFsdWVzID0geyAic2VxdWVuY2UiLCAiY2hvaWNlIiwgImFsbCIgfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotICBwdWJsaWMgWFNETW9kZWxHcm91cFNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gTmFtZUxhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIENMYWJlbCBuYW1lTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuVUlfTEFCRUxfS0lORCk7Ci0gICAgbmFtZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBOYW1lVGV4dAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgbW9kZWxHcm91cENvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICBtb2RlbEdyb3VwQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBtb2RlbEdyb3VwQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgbW9kZWxHcm91cENvbWJvLnNldEl0ZW1zKG1vZGVsR3JvdXBDb21ib1ZhbHVlcyk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChtb2RlbEdyb3VwQ29tYm8sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX01PREVMR1JPVVBfX0tJTkQpOwotCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBtaW4gcHJvcGVydHkKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuVUlfTEFCRUxfTUlOT0NDVVJTKTsKLSAgICAKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCi0gICAgbWluQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIG1pbkNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgbWluQ29tYm8uYWRkKCIwIik7IC8vJE5PTi1OTFMtMSQKLSAgICBtaW5Db21iby5hZGQoIjEiKTsgLy8kTk9OLU5MUy0xJAotICAgIGFwcGx5QWxsTGlzdGVuZXJzKG1pbkNvbWJvKTsKLSAgICBtaW5Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG1pbkNvbWJvLAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19NT0RFTEdST1VQX19NSU5fT0NDVVJFTkNFKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIG1heCBwcm9wZXJ0eQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNZXNzYWdlcy5VSV9MQUJFTF9NQVhPQ0NVUlMpOwotCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotICAgIG1heENvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICBtYXhDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIG1heENvbWJvLmFkZCgiMCIpOyAvLyROT04tTkxTLTEkCi0gICAgbWF4Q29tYm8uYWRkKCIxIik7IC8vJE5PTi1OTFMtMSQKLSAgICBtYXhDb21iby5hZGQoInVuYm91bmRlZCIpOyAvLyROT04tTkxTLTEkCi0gICAgYXBwbHlBbGxMaXN0ZW5lcnMobWF4Q29tYm8pOwotICAgIG1heENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobWF4Q29tYm8sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX01PREVMR1JPVVBfX01BWF9PQ0NVUkVOQ0UpOwotICB9Ci0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotCi0gICAgaWYgKGlzUmVhZE9ubHkpCi0gICAgewotICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY29tcG9zaXRlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQotICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICB7Ci0gICAgICAgIFhTRE1vZGVsR3JvdXAgcGFydGljbGUgPSAoWFNETW9kZWxHcm91cClpbnB1dDsKLSAgICAgICAgU3RyaW5nIG1vZGVsVHlwZSA9IHBhcnRpY2xlLmdldENvbXBvc2l0b3IoKS5nZXROYW1lKCk7Ci0gICAgICAgIG1vZGVsR3JvdXBDb21iby5zZXRUZXh0KG1vZGVsVHlwZSk7Ci0gICAgICAgIAotICAgICAgICBtaW5Db21iby5zZXRFbmFibGVkKCEocGFydGljbGUuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pKTsKLSAgICAgICAgbWF4Q29tYm8uc2V0RW5hYmxlZCghKHBhcnRpY2xlLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJlZnJlc2hNaW5NYXgoKTsKLQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZG9XaWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgWFNETW9kZWxHcm91cCBwYXJ0aWNsZSA9IChYU0RNb2RlbEdyb3VwKWlucHV0OwotICAgIGlmIChlLndpZGdldCA9PSBtb2RlbEdyb3VwQ29tYm8pCi0gICAgewotICAgICAgWFNEQ29tcG9zaXRvciBuZXdWYWx1ZSA9IFhTRENvbXBvc2l0b3IuZ2V0KG1vZGVsR3JvdXBDb21iby5nZXRUZXh0KCkpOwotICAgICAgVXBkYXRlQ29udGVudE1vZGVsQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZUNvbnRlbnRNb2RlbENvbW1hbmQob3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlcy5fVUlfQUNUSU9OX0NIQU5HRV9DT05URU5UX01PREVMLCBwYXJ0aWNsZSwgbmV3VmFsdWUpOwotICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICB9Ci0gICAgc3VwZXIuZG9XaWRnZXRTZWxlY3RlZChlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gIHsKLSAgICBpZiAobWluQ29tYm8gIT0gbnVsbCAmJiAhbWluQ29tYm8uaXNEaXNwb3NlZCgpKQotICAgICAgbWluQ29tYm8ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgaWYgKG1heENvbWJvICE9IG51bGwgJiYgIW1heENvbWJvLmlzRGlzcG9zZWQoKSkKLSAgICAgIG1heENvbWJvLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RTY2hlbWFTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFNjaGVtYVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjZGNmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFNjaGVtYVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgkgICBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLlRleHRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VJbmZvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5YU0RFZGl0TmFtZXNwYWNlc0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVOYW1lc3BhY2VJbmZvcm1hdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwubnNlZGl0LlRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbgotewotICBJV29ya2JlbmNoUGFydCBwYXJ0OwotICBUZXh0IHByZWZpeFRleHQ7Ci0gIFRleHQgdGFyZ2V0TmFtZXNwYWNlVGV4dDsKLSAgQnV0dG9uIGVkaXRCdXR0b247Ci0gIFN0eWxlZFRleHQgZXJyb3JUZXh0OwotICBDb2xvciByZWQ7Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIFhTRFNjaGVtYVNlY3Rpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLSAgICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luVG9wID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCi0gICAgLy8gQ3JlYXRlIFByZWZpeCBMYWJlbAotICAgIENMYWJlbCBwcmVmaXhMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfU0NIRU1BX1BSRUZJWCIpKTsgLy8kTk9OLU5MUy0xJAotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIHByZWZpeExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyBDcmVhdGUgUHJlZml4IFRleHQKLSAgICBwcmVmaXhUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBwcmVmaXhUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgYXBwbHlBbGxMaXN0ZW5lcnMocHJlZml4VGV4dCk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcmVmaXhUZXh0LAotICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX1NDSEVNQV9fUFJFRklYKTsKLQotICAgIC8vIENyZWF0ZSBUYXJnZXROYW1lc3BhY2UgTGFiZWwKLSAgICBDTGFiZWwgdGFyZ2V0TmFtZXNwYWNlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1RBUkdFVF9OQU1FX1NQQUNFIikpOyAvLyROT04tTkxTLTEkCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIHRhcmdldE5hbWVzcGFjZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyBDcmVhdGUgVGFyZ2V0TmFtZXNwYWNlIFRleHQKLSAgICB0YXJnZXROYW1lc3BhY2VUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICB0YXJnZXROYW1lc3BhY2VUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgYXBwbHlBbGxMaXN0ZW5lcnModGFyZ2V0TmFtZXNwYWNlVGV4dCk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0YXJnZXROYW1lc3BhY2VUZXh0LAotICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX1NDSEVNQV9fVEFSR0VUTkFNRVNQQUNFKTsKLQotICAgIC8vIEFkdmFuY2VkIEJ1dHRvbgotICAgIGVkaXRCdXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX1NFQ1RJT05fQURWQU5DRURfQVRUUklCVVRFUyIpICsgIi4uLiIsIFNXVC5QVVNIKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0gICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgZWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGVkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChlZGl0QnV0dG9uLAotICAgICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX1NDSEVNQV9fQURWQU5DRUQpOwotCi0gICAgLy8gZXJyb3IgdGV4dAotICAgIGVycm9yVGV4dCA9IG5ldyBTdHlsZWRUZXh0KGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIGVycm9yVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgZXJyb3JUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgIGVycm9yVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZXJyb3JUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQotICAgIEVsZW1lbnQgZWxlbWVudCA9IHhzZFNjaGVtYS5nZXRFbGVtZW50KCk7Ci0KLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIEhhbmRsZSBwcmVmaXhUZXh0Ci0gICAgICBUeXBlc0hlbHBlciBoZWxwZXIgPSBuZXcgVHlwZXNIZWxwZXIoeHNkU2NoZW1hKTsKLSAgICAgIFN0cmluZyBhUHJlZml4ID0gaGVscGVyLmdldFByZWZpeChlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVEFSR0VUTkFNRVNQQUNFX0FUVFJJQlVURSksIGZhbHNlKTsKLQotICAgICAgaWYgKGFQcmVmaXggIT0gbnVsbCAmJiBhUHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgcHJlZml4VGV4dC5zZXRUZXh0KGFQcmVmaXgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwcmVmaXhUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0KLSAgICAgIC8vIEhhbmRsZSBUYXJnZXROYW1lc3BhY2VUZXh0Ci0gICAgICBTdHJpbmcgdG5zID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRBUkdFVE5BTUVTUEFDRV9BVFRSSUJVVEUpOwotICAgICAgaWYgKHRucyAhPSBudWxsICYmIHRucy5sZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwcm9jZXNzZWRTdHJpbmcgPSBUZXh0UHJvY2Vzc29yLnByb2Nlc3ModG5zKTsKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlVGV4dC5zZXRUZXh0KHByb2Nlc3NlZFN0cmluZyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRhcmdldE5hbWVzcGFjZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVycm9yVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgZXJyb3JUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIHByZWZpeFZhbHVlID0gcHJlZml4VGV4dC5nZXRUZXh0KCk7Ci0gICAgU3RyaW5nIHRuc1ZhbHVlID0gdGFyZ2V0TmFtZXNwYWNlVGV4dC5nZXRUZXh0KCk7Ci0KLSAgICBFbGVtZW50IGVsZW1lbnQgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpOwotICAgIFR5cGVzSGVscGVyIGhlbHBlciA9IG5ldyBUeXBlc0hlbHBlcih4c2RTY2hlbWEpOwotICAgIFN0cmluZyBjdXJyZW50UHJlZml4ID0gaGVscGVyLmdldFByZWZpeChlbGVtZW50LmdldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuVEFSR0VUTkFNRVNQQUNFX0FUVFJJQlVURSksIGZhbHNlKTsKLSAgICBTdHJpbmcgY3VycmVudE5hbWVzcGFjZSA9IHhzZFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAKLSAgICBpZiAodG5zVmFsdWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0gICAgewotICAgICAgaWYgKHByZWZpeFZhbHVlLnRyaW0oKS5sZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGVycm9yVGV4dC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9FUlJPUl9UQVJHRVRfTkFNRVNQQUNFX0FORF9QUkVGSVgiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW50IGxlbmd0aCA9IGVycm9yVGV4dC5nZXRUZXh0KCkubGVuZ3RoKCk7Ci0gICAgICAgIHJlZCA9IG5ldyBDb2xvcihudWxsLCAyNTUsIDAsIDApOwotICAgICAgICBTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2UoMCwgbGVuZ3RoLCByZWQsIHRhcmdldE5hbWVzcGFjZVRleHQuZ2V0QmFja2dyb3VuZCgpKTsKLSAgICAgICAgZXJyb3JUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBwcmVmaXhUZXh0KQotICAgIHsKLSAgICAgIC8vIElmIHRoZSBwcmVmaXggaXMgdGhlIHNhbWUsIGp1c3QgcmV0dXJuLiAgIFRoaXMgbWF5IGhhcHBlbiBpZiB0aGUKLSAgICAgIC8vIHdpZGdldCBsb3NlcyBmb2N1cy4KLSAgICAgIGlmIChwcmVmaXhWYWx1ZS5lcXVhbHMoY3VycmVudFByZWZpeCkpIAotICAgICAgICByZXR1cm47Ci0gICAgICB1cGRhdGVOYW1lc3BhY2VJbmZvKHByZWZpeFZhbHVlLCB0bnNWYWx1ZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSB0YXJnZXROYW1lc3BhY2VUZXh0KQotICAgIHsKLSAgICAgIC8vIElmIHRoZSBucyBpcyB0aGUgc2FtZSwganVzdCByZXR1cm4uICAgVGhpcyBtYXkgaGFwcGVuIGlmIHRoZQotICAgICAgLy8gd2lkZ2V0IGxvc2VzIGZvY3VzLgotICAgICAgaWYgKHRuc1ZhbHVlLmVxdWFscyhjdXJyZW50TmFtZXNwYWNlKSkgCi0gICAgICAgIHJldHVybjsKLQotICAgICAgRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIgbmFtZXNwYWNlSW5mb01hbmFnZXIgPSBuZXcgRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIoKTsKLSAgICAgIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QgPSBuYW1lc3BhY2VJbmZvTWFuYWdlci5nZXROYW1lc3BhY2VJbmZvTGlzdCh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpKTsKLQotICAgICAgRWxlbWVudCB4c2RTY2hlbWFFbGVtZW50ID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAgIERvY3VtZW50SW1wbCBkb2MgPSAoRG9jdW1lbnRJbXBsKSB4c2RTY2hlbWFFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGRvYy5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9OQU1FU1BBQ0VfQ0hBTkdFIikpOwotICAgICAgICAKLSAgICAgICAgaWYgKHRuc1ZhbHVlLnRyaW0oKS5sZW5ndGgoKSA9PSAwICkgLy9yZW1vdmUgdGhlIHRhcmdldE5hbWVzcGFjZSBhdHRyaWJ1dGUKLSAgICAgICAgewotICAgICAgICAgIHhzZFNjaGVtYUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFhTRENvbnN0YW50cy5UQVJHRVROQU1FU1BBQ0VfQVRUUklCVVRFKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3cgcmVwbGFjZSB0aGUgbmFtZXNwYWNlIGZvciB0aGUgeG1sbnMgZW50cnkKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbmFtZXNwYWNlSW5mb0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotICAgICAgICAgIGlmIChpbmZvLnVyaS5lcXVhbHMoY3VycmVudE5hbWVzcGFjZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5mby51cmkgPSB0bnNWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB4c2RTY2hlbWEuc2V0SW5jcmVtZW50YWxVcGRhdGUoZmFsc2UpOwotICAgICAgICAvLyBzZXQgdGhlIG5ldyB4bWxucyBlbnRyaWVzCi0gICAgICAgIG5hbWVzcGFjZUluZm9NYW5hZ2VyLnJlbW92ZU5hbWVzcGFjZUluZm8oZWxlbWVudCk7Ci0gICAgICAgIG5hbWVzcGFjZUluZm9NYW5hZ2VyLmFkZE5hbWVzcGFjZUluZm8oZWxlbWVudCwgbmFtZXNwYWNlSW5mb0xpc3QsIGZhbHNlKTsKLSAgICAgICAgeHNkU2NoZW1hLnNldEluY3JlbWVudGFsVXBkYXRlKHRydWUpOwotCi0gICAgICAgIC8vIHNldCB0aGUgdGFyZ2V0TmFtZXNwYWNlIGF0dHJpYnV0ZQotICAgICAgICB4c2RTY2hlbWEuc2V0VGFyZ2V0TmFtZXNwYWNlKHRuc1ZhbHVlKTsKLSAgICAgICAgCi0gICAgICAgIFRhcmdldE5hbWVzcGFjZUNoYW5nZUhhbmRsZXIgdGFyZ2V0TmFtZXNwYWNlQ2hhbmdlSGFuZGxlciA9IG5ldyBUYXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyKHhzZFNjaGVtYSwgY3VycmVudE5hbWVzcGFjZSwgdG5zVmFsdWUpOwotICAgICAgICB0YXJnZXROYW1lc3BhY2VDaGFuZ2VIYW5kbGVyLnJlc29sdmUoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLQotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHhzZFNjaGVtYS51cGRhdGUoKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICBkb2MuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gZWRpdEJ1dHRvbikKLSAgICB7Ci0gICAgICBYU0RFZGl0TmFtZXNwYWNlc0FjdGlvbiBuc0FjdGlvbiA9IG5ldyBYU0RFZGl0TmFtZXNwYWNlc0FjdGlvbihYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0VESVRfTkFNRVNQQUNFUyIpLCB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpLCBudWxsLCB4c2RTY2hlbWEpOyAvLyROT04tTkxTLTEkIAotICAgICAgbnNBY3Rpb24ucnVuKCk7Ci0gICAgICByZWZyZXNoKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU5hbWVzcGFjZUluZm8oU3RyaW5nIG5ld1ByZWZpeCwgU3RyaW5nIG5ld1RhcmdldE5hbWVzcGFjZSkKLSAgewotICAgIFVwZGF0ZU5hbWVzcGFjZUluZm9ybWF0aW9uQ29tbWFuZCBjb21tYW5kID0gbmV3IFVwZGF0ZU5hbWVzcGFjZUluZm9ybWF0aW9uQ29tbWFuZChNZXNzYWdlcy5fVUlfQUNUSU9OX05BTUVTUEFDRV9JTkZPUk1BVElPTl9DSEFOR0UsIHhzZFNjaGVtYSwgbmV3UHJlZml4LCBuZXdUYXJnZXROYW1lc3BhY2UpOwotICAgIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIGlmIChwcmVmaXhUZXh0ICE9IG51bGwgJiYgIXByZWZpeFRleHQuaXNEaXNwb3NlZCgpKQotICAgICAgcmVtb3ZlTGlzdGVuZXJzKHByZWZpeFRleHQpOwotICAgIGlmICh0YXJnZXROYW1lc3BhY2VUZXh0ICE9IG51bGwgJiYgIXRhcmdldE5hbWVzcGFjZVRleHQuaXNEaXNwb3NlZCgpKQotICAgICAgcmVtb3ZlTGlzdGVuZXJzKHRhcmdldE5hbWVzcGFjZVRleHQpOwotICAgIAotICAgIGlmIChyZWQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZWQuZGlzcG9zZSgpOwotICAgICAgcmVkID0gbnVsbDsKLSAgICB9Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVByZWZpeChTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEU2ltcGxlVHlwZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEU2ltcGxlVHlwZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVlZjZhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL1hTRFNpbXBsZVR5cGVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuWE1MQ2hhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guZGlhbG9ncy5Db21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5DcmVhdGVFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5ET01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5hZHQuZWRpdC5Db21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0LklDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuVXBkYXRlTmFtZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MuTmV3VHlwZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RDb21wbGV4VHlwZUJhc2VUeXBlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RUeXBlUmVmZXJlbmNlRWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3Iuc2VhcmNoLlhTRFNlYXJjaExpc3REaWFsb2dEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RWYXJpZXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotcHVibGljIGNsYXNzIFhTRFNpbXBsZVR5cGVTZWN0aW9uIGV4dGVuZHMgUmVmYWN0b3JpbmdTZWN0aW9uCi17Ci0gIHByb3RlY3RlZCBUZXh0IG5hbWVUZXh0OwotICBDQ29tYm8gdmFyaWV0eUNvbWJvOwotICBDQ29tYm8gdHlwZXNDb21ibzsKLSAgQ0xhYmVsIHR5cGVzTGFiZWw7Ci0KLSAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gbWVtYmVyVHlwZURlZmluaXRpb24sIGl0ZW1UeXBlRGVmaW5pdGlvbiwgYmFzZVR5cGVEZWZpbml0aW9uOwotCi0gIHB1YmxpYyBYU0RTaW1wbGVUeXBlU2VjdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0gICAgY29tcG9zaXRlID0gZmFjdG9yeS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCi0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE5hbWVMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkc7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgQ0xhYmVsIG5hbWVMYWJlbCA9IGZhY3RvcnkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgTWVzc2FnZXMuX1VJX0xBQkVMX05BTUUpOwotICAgIG5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gTmFtZVRleHQKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIG5hbWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGFwcGx5QWxsTGlzdGVuZXJzKG5hbWVUZXh0KTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG5hbWVUZXh0LAotICAgIAkJWFNERWRpdG9yQ1NIZWxwSWRzLkdFTkVSQUxfVEFCX19TSU1QTEVfVFlQRV9fTkFNRSk7Ci0gICAgCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBSZWZhY3Rvci9yZW5hbWUgaHlwZXJsaW5rIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGNyZWF0ZVJlbmFtZUh5cGVybGluayhjb21wb3NpdGUpOwotCi0gICAgLy8gVmFyaWV0eSBMYWJlbAotICAgIENMYWJlbCBsYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfVkFSSUVUWSIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gVmFyaWV0eSBDb21ibwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORzsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgdmFyaWV0eUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCi0gICAgTGlzdCBsaXN0ID0gWFNEVmFyaWV0eS5WQUxVRVM7Ci0gICAgSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgdmFyaWV0eUNvbWJvLmFkZCgoKFhTRFZhcmlldHkpIGl0ZXIubmV4dCgpKS5nZXROYW1lKCkpOwotICAgIH0KLSAgICB2YXJpZXR5Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgdmFyaWV0eUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh2YXJpZXR5Q29tYm8sCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuR0VORVJBTF9UQUJfX1NJTVBMRV9UWVBFX19WQVJJRVRZKTsKLQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gRHVtbXlMYWJlbAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFR5cGVzIExhYmVsCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgdHlwZXNMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfTUVNQkVSVFlQRVMiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFR5cGVzIENvbWJvCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgdHlwZXNDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsKLSAgICB0eXBlc0NvbWJvLnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICB0eXBlc0NvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgdHlwZXNDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIAotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgdHlwZXNDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIAotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodHlwZXNDb21ibywKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5HRU5FUkFMX1RBQl9fU0lNUExFX1RZUEVfX0JBU0VfVFlQRSk7Ci0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBzdXBlci5zZXRJbnB1dChwYXJ0LCBzZWxlY3Rpb24pOwotICAgIHJlbGF5b3V0KCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWxheW91dCgpCi0gIHsKLSAgICBDb21wb3NpdGUgcGFyZW50Q29tcG9zaXRlID0gY29tcG9zaXRlLmdldFBhcmVudCgpOwotICAgIHBhcmVudENvbXBvc2l0ZS5nZXRQYXJlbnQoKS5zZXRSZWRyYXcoZmFsc2UpOwotCi0gICAgaWYgKHBhcmVudENvbXBvc2l0ZSAhPSBudWxsICYmICFwYXJlbnRDb21wb3NpdGUuaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIENvbnRyb2xbXSBjaGlsZHJlbiA9IHBhcmVudENvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgY2hpbGRyZW5baV0uZGlzcG9zZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIE5vdyBpbml0aWFsaXplIHRoZSBuZXcgaGFuZGxlcgotICAgIGNyZWF0ZUNvbnRlbnRzKHBhcmVudENvbXBvc2l0ZSk7Ci0gICAgcGFyZW50Q29tcG9zaXRlLmdldFBhcmVudCgpLmxheW91dCh0cnVlLCB0cnVlKTsKLQotICAgIC8vIE5vdyB0dXJuIHBhaW50aW5nIGJhY2sgb24KLSAgICBwYXJlbnRDb21wb3NpdGUuZ2V0UGFyZW50KCkuc2V0UmVkcmF3KHRydWUpOwotICAgIHJlZnJlc2goKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQotICAgIG5hbWVUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgdmFyaWV0eUNvbWJvLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgdHlwZXNDb21iby5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIGZpbGxUeXBlc0NvbWJvKCk7Ci0gICAgdHlwZXNMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9CQVNFX1RZUEVfV0lUSF9DT0xPTiIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGlucHV0OwotICAgICAgU3RyaW5nIHNpbXBsZVR5cGVOYW1lID0gc3QuZ2V0TmFtZSgpOwotICAgICAgaWYgKHNpbXBsZVR5cGVOYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5hbWVUZXh0LnNldFRleHQoc2ltcGxlVHlwZU5hbWUpOwotICAgICAgICBuYW1lVGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbmFtZVRleHQuc2V0VGV4dCgiKiphbm9ueW1vdXMqKiIpOyAvLyROT04tTkxTLTEkKTsKLSAgICAgICAgbmFtZVRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgICAgfQotICAgICAgCi0gICAgICBTdHJpbmcgdmFyaWV0eSA9IHN0LmdldFZhcmlldHkoKS5nZXROYW1lKCk7Ci0gICAgICBpbnQgaW50VmFyaWV0eSA9IHN0LmdldFZhcmlldHkoKS5nZXRWYWx1ZSgpOwotCi0gICAgICBpZiAodmFyaWV0eSAhPSBudWxsKQotICAgICAgewotICAgICAgICB2YXJpZXR5Q29tYm8uc2V0VGV4dCh2YXJpZXR5KTsKLSAgICAgICAgaWYgKGludFZhcmlldHkgPT0gWFNEVmFyaWV0eS5BVE9NSUMpCi0gICAgICAgIHsKLSAgICAgICAgICBiYXNlVHlwZURlZmluaXRpb24gPSBzdC5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICBTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYgKGJhc2VUeXBlRGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5hbWUgPSBiYXNlVHlwZURlZmluaXRpb24uZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgbmFtZSA9ICIiOwotICAgICAgICAgIH0KLSAgICAgICAgICB0eXBlc0NvbWJvLnNldFRleHQobmFtZSk7Ci0gICAgICAgICAgdHlwZXNMYWJlbC5zZXRUZXh0KFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9CQVNFX1RZUEVfV0lUSF9DT0xPTiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGludFZhcmlldHkgPT0gWFNEVmFyaWV0eS5MSVNUKQotICAgICAgICB7Ci0gICAgICAgICAgaXRlbVR5cGVEZWZpbml0aW9uID0gc3QuZ2V0SXRlbVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChpdGVtVHlwZURlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lID0gaXRlbVR5cGVEZWZpbml0aW9uLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIG5hbWUgPSAiIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgdHlwZXNDb21iby5zZXRUZXh0KG5hbWUpOwotICAgICAgICAgIHR5cGVzTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfSVRFTV9UWVBFIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaW50VmFyaWV0eSA9PSBYU0RWYXJpZXR5LlVOSU9OKQotICAgICAgICB7Ci0gICAgICAgICAgTGlzdCBtZW1iZXJUeXBlc0xpc3QgPSBzdC5nZXRNZW1iZXJUeXBlRGVmaW5pdGlvbnMoKTsKLSAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbWVtYmVyVHlwZXNMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0eXBlT2JqZWN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gdHlwZU9iamVjdC5nZXRRTmFtZSgpOwotICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2IuYXBwZW5kKG5hbWUpOwotICAgICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIFN0cmluZyBtZW1iZXJUeXBlcyA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgdHlwZXNDb21iby5zZXRUZXh0KG1lbWJlclR5cGVzKTsKLSAgICAgICAgICB0eXBlc0xhYmVsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX01FTUJFUlRZUEVTIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCi0gIH0KLQotICBwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gdHlwZXNDb21ibykKLSAgICB7Ci0gICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgIGlmIChlZGl0b3IgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIgbWFuYWdlciA9IChDb21wb25lbnRSZWZlcmVuY2VFZGl0TWFuYWdlcillZGl0b3IuZ2V0QWRhcHRlcihYU0RDb21wbGV4VHlwZUJhc2VUeXBlRWRpdE1hbmFnZXIuY2xhc3MpOyAgICAKLQotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IHR5cGVzQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBuZXdWYWx1ZTsKLSAgICAgIElDb21wb25lbnREaWFsb2cgZGlhbG9nPSBudWxsOwotICAgICAgaWYgKCBzZWxlY3Rpb24uZXF1YWxzKG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLk1lc3NhZ2VzLl9VSV9BQ1RJT05fQlJPV1NFKSkKLSAgICAgIHsKLSAgICAgICAgZGlhbG9nID0gbWFuYWdlci5nZXRCcm93c2VEaWFsb2coKTsKLSAgICAgICAgKChYU0RTZWFyY2hMaXN0RGlhbG9nRGVsZWdhdGUpIGRpYWxvZykuc2hvd0NvbXBsZXhUeXBlcyhmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggc2VsZWN0aW9uLmVxdWFscyhvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5NZXNzYWdlcy5fVUlfQUNUSU9OX05FVykpCi0gICAgICB7Ci0gICAgICAgIGRpYWxvZyA9IG1hbmFnZXIuZ2V0TmV3RGlhbG9nKCk7Ci0gICAgICAgICgoTmV3VHlwZURpYWxvZykgZGlhbG9nKS5hbGxvd0NvbXBsZXhUeXBlKGZhbHNlKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRpYWxvZyAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKSA9PSBXaW5kb3cuT0spCi0gICAgICAgIHsKLSAgICAgICAgICBuZXdWYWx1ZSA9IGRpYWxvZy5nZXRTZWxlY3RlZENvbXBvbmVudCgpOwotICAgICAgICAgIG1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKGlucHV0LCBuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgLy91c2UgdGhlIHZhbHVlIGZyb20gc2VsZWN0ZWQgcXVpY2tQaWNrIGl0ZW0KLSAgICAgIHsKLSAgICAgICAgbmV3VmFsdWUgPSBnZXRDb21wb25lbnRTcGVjRnJvbVF1aWNrUGlja0ZvclZhbHVlKHNlbGVjdGlvbiwgbWFuYWdlcik7Ci0gICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKQotICAgICAgICAgIG1hbmFnZXIubW9kaWZ5Q29tcG9uZW50UmVmZXJlbmNlKGlucHV0LCBuZXdWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IHZhcmlldHlDb21ibykKLSAgICB7Ci0gICAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICAgICAgRWxlbWVudCBwYXJlbnQgPSBzdC5nZXRFbGVtZW50KCk7Ci0KLSAgICAgICAgICBTdHJpbmcgdmFyaWV0eSA9IHZhcmlldHlDb21iby5nZXRUZXh0KCk7Ci0gICAgICAgICAgaWYgKHZhcmlldHkuZXF1YWxzKFhTRFZhcmlldHkuQVRPTUlDX0xJVEVSQUwuZ2V0TmFtZSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0eXBlc0xhYmVsLnNldFRleHQoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX0JBU0VfVFlQRV9XSVRIX0NPTE9OIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBzdC5zZXRWYXJpZXR5KFhTRFZhcmlldHkuQVRPTUlDX0xJVEVSQUwpOwotICAgICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbklmTm90RXhpc3QoWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9SRVNUUklDVElPTiIpLCBwYXJlbnQsIG51bGwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHZhcmlldHkuZXF1YWxzKFhTRFZhcmlldHkuVU5JT05fTElURVJBTC5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHR5cGVzTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfTUVNQkVSVFlQRVMiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHN0LnNldFZhcmlldHkoWFNEVmFyaWV0eS5VTklPTl9MSVRFUkFMKTsKLSAgICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KFhTRENvbnN0YW50cy5VTklPTl9FTEVNRU5UX1RBRywgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfVU5JT04iKSwgcGFyZW50LCBudWxsKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICh2YXJpZXR5LmVxdWFscyhYU0RWYXJpZXR5LkxJU1RfTElURVJBTC5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHR5cGVzTGFiZWwuc2V0VGV4dChYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfTEFCRUxfSVRFTV9UWVBFIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBzdC5zZXRWYXJpZXR5KFhTRFZhcmlldHkuTElTVF9MSVRFUkFMKTsKLSAgICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb25JZk5vdEV4aXN0KFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9MSVNUIiksIHBhcmVudCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0vLyAgICBlbHNlIGlmIChlLndpZGdldCA9PSBidXR0b24pCi0vLyAgICB7Ci0vLyAgICAgIFNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLS8vICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgaW5wdXQpLmdldEVsZW1lbnQoKTsKLS8vICAgICAgRGlhbG9nIGRpYWxvZyA9IG51bGw7Ci0vLyAgICAgIFN0cmluZyBwcm9wZXJ0eSA9ICIiOwotLy8gICAgICBFbGVtZW50IHNlY29uZGFyeUVsZW1lbnQgPSBudWxsOwotCi0vLyAgICAgIElGaWxlIGN1cnJlbnRJRmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpOwotICAgICAgCi0gICAgICAvLyBpc3N1ZSAoY3MpIG5lZWQgdG8gbW92ZSB0byBjb21tb24udWkncyBzZWxlY3Rpb24gZGlhbG9nCi0vKgotICAgICAgWFNEQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgWFNEQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIoY3VycmVudElGaWxlLCB4c2RTY2hlbWEpOwotICAgICAgZGlhbG9nID0gbmV3IFhTRENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZyhzaGVsbCwgWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX1NFVF9UWVBFIiksIHByb3ZpZGVyKTsKLSAgICAgIHByb3ZpZGVyLnNldERpYWxvZygoWFNEQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nKSBkaWFsb2cpOwotKi8KLS8vICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0vLyAgICAgIHsKLS8vICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdCA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgaW5wdXQ7Ci0vLyAgICAgICAgRWxlbWVudCBzaW1wbGVUeXBlRWxlbWVudCA9IHN0LmdldEVsZW1lbnQoKTsKLS8vICAgICAgICBpZiAoc3QuZ2V0VmFyaWV0eSgpID09IFhTRFZhcmlldHkuTElTVF9MSVRFUkFMKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoRWxlbWVudCkgaXRlbVR5cGVEZWZpbml0aW9uLmdldEVsZW1lbnQoKTsKLS8vICAgICAgICAgIC8vIGRpYWxvZyA9IG5ldyBUeXBlc0RpYWxvZyhzaGVsbCwgbGlzdEVsZW1lbnQsCi0vLyAgICAgICAgICAvLyBYU0RDb25zdGFudHMuSVRFTVRZUEVfQVRUUklCVVRFLCB4c2RTY2hlbWEpOwotLy8gICAgICAgICAgLy8gZGlhbG9nLnNob3dDb21wbGV4VHlwZXMgPSBmYWxzZTsKLS8vICAgICAgICAgIHByb3ZpZGVyLnNob3dDb21wbGV4VHlwZXMoZmFsc2UpOwotLy8KLS8vICAgICAgICAgIHNlY29uZGFyeUVsZW1lbnQgPSBsaXN0RWxlbWVudDsKLS8vICAgICAgICAgIHByb3BlcnR5ID0gWFNEQ29uc3RhbnRzLklURU1UWVBFX0FUVFJJQlVURTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgZWxzZSBpZiAoc3QuZ2V0VmFyaWV0eSgpID09IFhTRFZhcmlldHkuQVRPTUlDX0xJVEVSQUwpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgRWxlbWVudCBkZXJpdmVkQnlFbGVtZW50ID0gKEVsZW1lbnQpIGJhc2VUeXBlRGVmaW5pdGlvbi5nZXRFbGVtZW50KCk7Ci0vLyAgICAgICAgICBpZiAoZGVyaXZlZEJ5RWxlbWVudCAhPSBudWxsKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICAvLyBkaWFsb2cgPSBuZXcgVHlwZXNEaWFsb2coc2hlbGwsIGRlcml2ZWRCeUVsZW1lbnQsCi0vLyAgICAgICAgICAgIC8vIFhTRENvbnN0YW50cy5CQVNFX0FUVFJJQlVURSwgeHNkU2NoZW1hKTsKLS8vICAgICAgICAgICAgLy8gZGlhbG9nLnNob3dDb21wbGV4VHlwZXMgPSBmYWxzZTsKLS8vICAgICAgICAgICAgcHJvdmlkZXIuc2hvd0NvbXBsZXhUeXBlcyhmYWxzZSk7Ci0vLwotLy8gICAgICAgICAgICBzZWNvbmRhcnlFbGVtZW50ID0gZGVyaXZlZEJ5RWxlbWVudDsKLS8vICAgICAgICAgICAgcHJvcGVydHkgPSBYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEU7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgICBlbHNlCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIHJldHVybjsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgICAgaWYgKHN0LmdldFZhcmlldHkoKSA9PSBYU0RWYXJpZXR5LlVOSU9OX0xJVEVSQUwpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgU2ltcGxlQ29udGVudFVuaW9uTWVtYmVyVHlwZXNEaWFsb2cgdW5pb25EaWFsb2cgPSBuZXcgU2ltcGxlQ29udGVudFVuaW9uTWVtYmVyVHlwZXNEaWFsb2coc2hlbGwsIHN0KTsKLS8vICAgICAgICAgIHVuaW9uRGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotLy8gICAgICAgICAgdW5pb25EaWFsb2cuY3JlYXRlKCk7Ci0vLwotLy8gICAgICAgICAgaW50IHJlc3VsdCA9IHVuaW9uRGlhbG9nLm9wZW4oKTsKLS8vICAgICAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICBTdHJpbmcgbmV3VmFsdWUgPSB1bmlvbkRpYWxvZy5nZXRSZXN1bHQoKTsKLS8vICAgICAgICAgICAgLy8gYmVnaW5SZWNvcmRpbmcoWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0xBQkVMX01FTUJFUlRZUEVTX0NIQU5HRSIpLAotLy8gICAgICAgICAgICAvLyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotLy8gICAgICAgICAgICBFbGVtZW50IHVuaW9uRWxlbWVudCA9IG1lbWJlclR5cGVEZWZpbml0aW9uLmdldEVsZW1lbnQoKTsKLS8vICAgICAgICAgICAgdW5pb25FbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTUVNQkVSVFlQRVNfQVRUUklCVVRFLCBuZXdWYWx1ZSk7Ci0vLwotLy8gICAgICAgICAgICBpZiAobmV3VmFsdWUubGVuZ3RoKCkgPiAwKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgdW5pb25FbGVtZW50LnNldEF0dHJpYnV0ZShYU0RDb25zdGFudHMuTUVNQkVSVFlQRVNfQVRUUklCVVRFLCBuZXdWYWx1ZSk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgZWxzZQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgdW5pb25FbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTUVNQkVSVFlQRVNfQVRUUklCVVRFKTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAvLyBlbmRSZWNvcmRpbmcodW5pb25FbGVtZW50KTsKLS8vICAgICAgICAgICAgcmVmcmVzaCgpOwotLy8gICAgICAgICAgfQotLy8gICAgICAgICAgcmV0dXJuOwotLy8gICAgICAgIH0KLS8vICAgICAgICBlbHNlCi0vLyAgICAgICAgewotLy8gICAgICAgICAgcHJvcGVydHkgPSAidHlwZSI7Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UKLS8vICAgICAgewotLy8gICAgICAgIHByb3BlcnR5ID0gInR5cGUiOwotLy8gICAgICB9Ci0gICAgICAvLyBiZWdpblJlY29yZGluZyhYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfVFlQRV9DSEFOR0UiKSwKLSAgICAgIC8vIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0vLyAgICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLS8vICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotLy8gICAgICBpbnQgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLS8vCi0vLyAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotLy8gICAgICB7Ci0vLyAgICAgICAgaWYgKHNlY29uZGFyeUVsZW1lbnQgPT0gbnVsbCkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBzZWNvbmRhcnlFbGVtZW50ID0gZWxlbWVudDsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgWFNEU2V0VHlwZUhlbHBlciBoZWxwZXIgPSBuZXcgWFNEU2V0VHlwZUhlbHBlcihjdXJyZW50SUZpbGUsIHhzZFNjaGVtYSk7Ci0vLyAgICAgICAgaGVscGVyLnNldFR5cGUoc2Vjb25kYXJ5RWxlbWVudCwgcHJvcGVydHksICgoWFNEQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nKSBkaWFsb2cpLmdldFNlbGVjdGlvbigpKTsKLQotLy8gICAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLS8vICAgICAgICBzdC5zZXRFbGVtZW50KGVsZW1lbnQpOwotLy8gICAgICAgIHVwZGF0ZVNpbXBsZVR5cGVGYWNldHMoKTsqLwotLy8gICAgICB9Ci0gICAgICAvLyBlbmRSZWNvcmRpbmcoZWxlbWVudCk7Ci0vLyAgICB9ICAKLS8vICAgIHJlZnJlc2goKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gaXNzdWUgKGNzKSB0aGlzIG1ldGhvZCBzZWVtcyB0byBiZSB1dGlsaXppbmcgJ29sZCcgY2xhc3NlcywgY2FuIHdlIHJlaW1wbGVtZW50PwotICAvLyAoZS5nLiBDaGFuZ2VFbGVtZW50QWN0aW9uLCBYU0RET01IZWxwZXIsIGV0YykKLSAgcHJvdGVjdGVkIGJvb2xlYW4gYWRkQ3JlYXRlRWxlbWVudEFjdGlvbklmTm90RXhpc3QoU3RyaW5nIGVsZW1lbnRUYWcsIFN0cmluZyBsYWJlbCwgRWxlbWVudCBwYXJlbnQsIE5vZGUgcmVsYXRpdmVOb2RlKQotICB7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc3QgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGlucHV0OwotICAgIExpc3QgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBTdHJpbmcgcmV1c2VUeXBlID0gbnVsbDsKLQotICAgIC8vIGJlZ2luUmVjb3JkaW5nKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9MQUJFTF9WQVJJRVRZX0NIQU5HRSIpLAotICAgIC8vIHBhcmVudCk7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoZWxlbWVudFRhZy5lcXVhbHMoWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHKSkKLSAgICB7Ci0gICAgICBFbGVtZW50IGxpc3ROb2RlID0gZ2V0Rmlyc3RDaGlsZE5vZGVJZkV4aXN0cyhwYXJlbnQsIFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHLCBmYWxzZSk7Ci0gICAgICBpZiAobGlzdE5vZGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV1c2VUeXBlID0gbGlzdE5vZGUuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5JVEVNVFlQRV9BVFRSSUJVVEUpOwotICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UobGlzdE5vZGUpOwotICAgICAgfQotCi0gICAgICBFbGVtZW50IHVuaW9uTm9kZSA9IGdldEZpcnN0Q2hpbGROb2RlSWZFeGlzdHMocGFyZW50LCBYU0RDb25zdGFudHMuVU5JT05fRUxFTUVOVF9UQUcsIGZhbHNlKTsKLSAgICAgIGlmICh1bmlvbk5vZGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG1lbWJlckF0dHIgPSB1bmlvbk5vZGUuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUpOwotICAgICAgICBpZiAobWVtYmVyQXR0ciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobWVtYmVyQXR0cik7Ci0gICAgICAgICAgcmV1c2VUeXBlID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICB9Ci0gICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZSh1bmlvbk5vZGUpOwotICAgICAgfQotCi0gICAgICBpZiAocmV1c2VUeXBlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldXNlVHlwZSA9IGdldEJ1aWx0SW5TdHJpbmdRTmFtZSgpOwotICAgICAgfQotICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUsIHJldXNlVHlwZSkpOwotICAgICAgc3Quc2V0SXRlbVR5cGVEZWZpbml0aW9uKG51bGwpOwotICAgIH0KLSAgICBlbHNlIGlmIChlbGVtZW50VGFnLmVxdWFscyhYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRykpCi0gICAgewotICAgICAgRWxlbWVudCByZXN0cmljdGlvbk5vZGUgPSBnZXRGaXJzdENoaWxkTm9kZUlmRXhpc3RzKHBhcmVudCwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSk7Ci0gICAgICBpZiAocmVzdHJpY3Rpb25Ob2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldXNlVHlwZSA9IHJlc3RyaWN0aW9uTm9kZS5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFKTsKLSAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKHJlc3RyaWN0aW9uTm9kZSk7Ci0gICAgICB9Ci0gICAgICBFbGVtZW50IHVuaW9uTm9kZSA9IGdldEZpcnN0Q2hpbGROb2RlSWZFeGlzdHMocGFyZW50LCBYU0RDb25zdGFudHMuVU5JT05fRUxFTUVOVF9UQUcsIGZhbHNlKTsKLSAgICAgIGlmICh1bmlvbk5vZGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG1lbWJlckF0dHIgPSB1bmlvbk5vZGUuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUpOwotICAgICAgICBpZiAobWVtYmVyQXR0ciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobWVtYmVyQXR0cik7Ci0gICAgICAgICAgcmV1c2VUeXBlID0gc3RyaW5nVG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICB9Ci0gICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZSh1bmlvbk5vZGUpOwotICAgICAgfQotICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuSVRFTVRZUEVfQVRUUklCVVRFLCByZXVzZVR5cGUpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZWxlbWVudFRhZy5lcXVhbHMoWFNEQ29uc3RhbnRzLlVOSU9OX0VMRU1FTlRfVEFHKSkKLSAgICB7Ci0gICAgICBFbGVtZW50IGxpc3ROb2RlID0gZ2V0Rmlyc3RDaGlsZE5vZGVJZkV4aXN0cyhwYXJlbnQsIFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHLCBmYWxzZSk7Ci0gICAgICBpZiAobGlzdE5vZGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV1c2VUeXBlID0gbGlzdE5vZGUuZ2V0QXR0cmlidXRlKFhTRENvbnN0YW50cy5JVEVNVFlQRV9BVFRSSUJVVEUpOwotICAgICAgICBYU0RET01IZWxwZXIucmVtb3ZlTm9kZUFuZFdoaXRlc3BhY2UobGlzdE5vZGUpOwotICAgICAgfQotICAgICAgRWxlbWVudCByZXN0cmljdGlvbk5vZGUgPSBnZXRGaXJzdENoaWxkTm9kZUlmRXhpc3RzKHBhcmVudCwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSk7Ci0gICAgICBpZiAocmVzdHJpY3Rpb25Ob2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldXNlVHlwZSA9IHJlc3RyaWN0aW9uTm9kZS5nZXRBdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLkJBU0VfQVRUUklCVVRFKTsKLSAgICAgICAgWFNERE9NSGVscGVyLnJlbW92ZU5vZGVBbmRXaGl0ZXNwYWNlKHJlc3RyaWN0aW9uTm9kZSk7Ci0gICAgICB9Ci0gICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5NRU1CRVJUWVBFU19BVFRSSUJVVEUsIHJldXNlVHlwZSkpOwotICAgICAgc3Quc2V0SXRlbVR5cGVEZWZpbml0aW9uKG51bGwpOwotICAgIH0KLQotICAgIGlmIChnZXRGaXJzdENoaWxkTm9kZUlmRXhpc3RzKHBhcmVudCwgZWxlbWVudFRhZywgZmFsc2UpID09IG51bGwpCi0gICAgewotICAgICAgQWN0aW9uIGFjdGlvbiA9IGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24oZWxlbWVudFRhZywgbGFiZWwsIGF0dHJpYnV0ZXMsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICB9Ci0KLSAgICBzdC5zZXRFbGVtZW50KHBhcmVudCk7Ci0gICAgc3QudXBkYXRlRWxlbWVudCgpOwotICAgIC8vIGVuZFJlY29yZGluZyhwYXJlbnQpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIEFjdGlvbiBhZGRDcmVhdGVFbGVtZW50QWN0aW9uKFN0cmluZyBlbGVtZW50VGFnLCBTdHJpbmcgbGFiZWwsIExpc3QgYXR0cmlidXRlcywgRWxlbWVudCBwYXJlbnQsIE5vZGUgcmVsYXRpdmVOb2RlKQotICB7Ci0gICAgQ3JlYXRlRWxlbWVudEFjdGlvbiBhY3Rpb24gPSBuZXcgQ3JlYXRlRWxlbWVudEFjdGlvbihsYWJlbCk7Ci0gICAgYWN0aW9uLnNldEVsZW1lbnRUYWcoZWxlbWVudFRhZyk7Ci0gICAgYWN0aW9uLnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0gICAgYWN0aW9uLnNldFBhcmVudE5vZGUocGFyZW50KTsKLSAgICBhY3Rpb24uc2V0UmVsYXRpdmVOb2RlKHJlbGF0aXZlTm9kZSk7Ci0gICAgcmV0dXJuIGFjdGlvbjsKLSAgfQotCi0gIHByb3RlY3RlZCBFbGVtZW50IGdldEZpcnN0Q2hpbGROb2RlSWZFeGlzdHMoTm9kZSBwYXJlbnQsIFN0cmluZyBlbGVtZW50VGFnLCBib29sZWFuIGlzUmVmKQotICB7Ci0gICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIEVsZW1lbnQgdGFyZ2V0Tm9kZSA9IG51bGw7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAgIE5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotICAgICAgaWYgKGNoaWxkICE9IG51bGwgJiYgY2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICBpZiAoWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGNoaWxkLCBlbGVtZW50VGFnLCBpc1JlZikpCi0gICAgICAgIHsKLSAgICAgICAgICB0YXJnZXROb2RlID0gKEVsZW1lbnQpIGNoaWxkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0YXJnZXROb2RlOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRCdWlsdEluU3RyaW5nUU5hbWUoKQotICB7Ci0gICAgU3RyaW5nIHN0cmluZ05hbWUgPSAic3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBzY2hlbWFGb3JTY2hlbWFQcmVmaXggPSB4c2RTY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hUU5hbWVQcmVmaXgoKTsKLSAgICAgIGlmIChzY2hlbWFGb3JTY2hlbWFQcmVmaXggIT0gbnVsbCAmJiBzY2hlbWFGb3JTY2hlbWFQcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBTdHJpbmcgcHJlZml4ID0geHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYVFOYW1lUHJlZml4KCk7Ci0gICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgc3RyaW5nTmFtZSA9IHByZWZpeCArICI6IiArIHN0cmluZ05hbWU7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3RyaW5nTmFtZTsKLSAgfQotCi0vLyAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVNpbXBsZVR5cGVGYWNldHMoKQotLy8gIHsKLS8vICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHN0ID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLS8vICAgIEVsZW1lbnQgc2ltcGxlVHlwZUVsZW1lbnQgPSBzdC5nZXRFbGVtZW50KCk7Ci0vLyAgICBFbGVtZW50IGRlcml2ZWRCeUVsZW1lbnQgPSBiYXNlVHlwZURlZmluaXRpb24uZ2V0RWxlbWVudCgpOwotLy8gICAgaWYgKGRlcml2ZWRCeUVsZW1lbnQgIT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgTGlzdCBub2Rlc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotLy8gICAgICBOb2RlTGlzdCBjaGlsZExpc3QgPSBkZXJpdmVkQnlFbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLS8vICAgICAgaW50IGxlbmd0aCA9IGNoaWxkTGlzdC5nZXRMZW5ndGgoKTsKLS8vICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLS8vICAgICAgewotLy8gICAgICAgIE5vZGUgY2hpbGQgPSBjaGlsZExpc3QuaXRlbShpKTsKLS8vICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50KQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIEVsZW1lbnQgZWxlbWVudENoaWxkID0gKEVsZW1lbnQpIGNoaWxkOwotLy8gICAgICAgICAgaWYgKCEoZWxlbWVudENoaWxkLmdldExvY2FsTmFtZSgpLmVxdWFscygicGF0dGVybiIpIHx8IGVsZW1lbnRDaGlsZC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoImVudW1lcmF0aW9uIikgfHwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0vLyAgICAgICAgICAgICAgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnRDaGlsZCwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fCBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoZWxlbWVudENoaWxkLCBYU0RDb25zdGFudHMuQU5OT1RBVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpCi0vLyAgICAgICAgICAgICAgfHwgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnRDaGlsZCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8IFhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhlbGVtZW50Q2hpbGQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIHRydWUpCi0vLyAgICAgICAgICAgICAgfHwgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnRDaGlsZCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwgWFNERE9NSGVscGVyLmlucHV0RXF1YWxzKGVsZW1lbnRDaGlsZCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHLCB0cnVlKSB8fCBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoZWxlbWVudENoaWxkLAotLy8gICAgICAgICAgICAgIFhTRENvbnN0YW50cy5BTllBVFRSSUJVVEVfRUxFTUVOVF9UQUcsIGZhbHNlKSkpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIG5vZGVzVG9SZW1vdmUuYWRkKGNoaWxkKTsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLS8vICAgICAgSXRlcmF0b3IgaXRlciA9IG5vZGVzVG9SZW1vdmUuaXRlcmF0b3IoKTsKLS8vICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotLy8gICAgICB7Ci0vLyAgICAgICAgRWxlbWVudCBmYWNldFRvUmVtb3ZlID0gKEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotLy8gICAgICAgIFN0cmluZyBmYWNldE5hbWUgPSBmYWNldFRvUmVtb3ZlLmdldExvY2FsTmFtZSgpOwotLy8gICAgICAgIEl0ZXJhdG9yIGl0ID0gc3QuZ2V0VmFsaWRGYWNldHMoKS5pdGVyYXRvcigpOwotLy8gICAgICAgIGJvb2xlYW4gZG9SZW1vdmUgPSB0cnVlOwotLy8gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgU3RyaW5nIGFWYWxpZEZhY2V0ID0gKFN0cmluZykgaXQubmV4dCgpOwotLy8gICAgICAgICAgaWYgKGFWYWxpZEZhY2V0LmVxdWFscyhmYWNldE5hbWUpKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICBkb1JlbW92ZSA9IGZhbHNlOwotLy8gICAgICAgICAgICBicmVhazsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0vLyAgICAgICAgaWYgKGRvUmVtb3ZlKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZShmYWNldFRvUmVtb3ZlKTsKLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLS8vICAgIH0KLS8vICB9Ci0KLSAgLy8gVE9ETzogQ29tbW9uIHRoaXMgdXAgd2l0aCBlbGVtZW50IGRlY2xhcmF0aW9uCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIAotICB7Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBuYW1lVGV4dCkKLSAgICB7Ci0gICAgICBpZiAoIW5hbWVUZXh0LmdldEVkaXRhYmxlKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBYU0ROYW1lZENvbXBvbmVudCBuYW1lZENvbXBvbmVudCA9IChYU0ROYW1lZENvbXBvbmVudClpbnB1dDsKLSAgICAgICAgaWYgKCF2YWxpZGF0ZVNlY3Rpb24oKSkKLSAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgQ29tbWFuZCBjb21tYW5kID0gbnVsbDsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgYW4gYWN0dWFsIG5hbWUgY2hhbmdlIGhhcyB0YWtlbiBwbGFjZQotICAgICAgICBTdHJpbmcgb2xkTmFtZSA9IG5hbWVkQ29tcG9uZW50LmdldE5hbWUoKTsKLSAgICAgICAgaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb21tYW5kID0gbmV3IFVwZGF0ZU5hbWVDb21tYW5kKE1lc3NhZ2VzLl9VSV9BQ1RJT05fUkVOQU1FLCBuYW1lZENvbXBvbmVudCwgbmV3VmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCAmJiBnZXRDb21tYW5kU3RhY2soKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVNlY3Rpb24oKQotICB7Ci0gICAgaWYgKG5hbWVUZXh0ID09IG51bGwgfHwgbmFtZVRleHQuaXNEaXNwb3NlZCgpKQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0KLSAgICBTdHJpbmcgbmFtZSA9IG5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0KLSAgICAvLyB2YWxpZGF0ZSBhZ2FpbnN0IE5DTmFtZQotICAgIGlmIChuYW1lLmxlbmd0aCgpIDwgMSB8fCAhWE1MQ2hhci5pc1ZhbGlkTkNOYW1lKG5hbWUpKQotICAgIHsKLSAgICAgIHNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5fVUlfRVJST1JfSU5WQUxJRF9OQU1FKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgCi0gIHByaXZhdGUgdm9pZCBmaWxsVHlwZXNDb21ibygpCi0gIHsKLSAgICB0eXBlc0NvbWJvLnJlbW92ZUFsbCgpOwotICAgIAotICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldEFjdGl2ZUVkaXRvcigpOwotICAgIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIG1hbmFnZXIgPSAoQ29tcG9uZW50UmVmZXJlbmNlRWRpdE1hbmFnZXIpZWRpdG9yLmdldEFkYXB0ZXIoWFNEVHlwZVJlZmVyZW5jZUVkaXRNYW5hZ2VyLmNsYXNzKTsKLSAgICBpZiAobWFuYWdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIENvbXBvbmVudFNwZWNpZmljYXRpb25bXSBpdGVtcyA9IG1hbmFnZXIuZ2V0UXVpY2tQaWNrcygpOwotCi0gICAgICB0eXBlc0NvbWJvLmFkZChvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5lZGl0b3IuTWVzc2FnZXMuX1VJX0FDVElPTl9CUk9XU0UpOwotICAgICAgdHlwZXNDb21iby5hZGQob3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuTWVzc2FnZXMuX1VJX0FDVElPTl9ORVcpOwotCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICB0eXBlc0NvbWJvLmFkZChpdGVtc1tpXS5nZXROYW1lKCkpOwotICAgICAgfQotCi0gICAgICAvLyBBZGQgdGhlIGN1cnJlbnQgVHlwZSBvZiB0aGlzIGF0dHJpYnV0ZSBpZiBuZWVkZWQKLSAgICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGUgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGlucHV0OwotICAgICAgWFNEVHlwZURlZmluaXRpb24gYmFzZVR5cGUgPSBzaW1wbGVUeXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgICBpZiAoYmFzZVR5cGUgIT0gbnVsbCAmJiBiYXNlVHlwZS5nZXRRTmFtZSgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBjdXJyZW50VHlwZU5hbWUgPSBiYXNlVHlwZS5nZXRRTmFtZSh4c2RTY2hlbWEpOyAvLyBubyBwcmVmaXgKLSAgICAgICAgQ29tcG9uZW50U3BlY2lmaWNhdGlvbiByZXQgPSBnZXRDb21wb25lbnRTcGVjRnJvbVF1aWNrUGlja0ZvclZhbHVlKGN1cnJlbnRUeXBlTmFtZSwgbWFuYWdlcik7Ci0gICAgICAgIGlmIChyZXQgPT0gbnVsbCAmJiBjdXJyZW50VHlwZU5hbWUgIT0gbnVsbCkgLy8gbm90IGluIHF1aWNrUGljawotICAgICAgICB7Ci0gICAgICAgICAgdHlwZXNDb21iby5hZGQoY3VycmVudFR5cGVOYW1lKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIFRPRE86IGNvbW1vbiB0aGlzIHVwIHdpdGggWFNERWxlbWVudERlY2xhcmF0aW9uU2VjdGlvbgotICBwcml2YXRlIENvbXBvbmVudFNwZWNpZmljYXRpb24gZ2V0Q29tcG9uZW50U3BlY0Zyb21RdWlja1BpY2tGb3JWYWx1ZShTdHJpbmcgdmFsdWUsIENvbXBvbmVudFJlZmVyZW5jZUVkaXRNYW5hZ2VyIGVkaXRNYW5hZ2VyKQotICB7Ci0gICAgaWYgKGVkaXRNYW5hZ2VyICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uW10gcXVpY2tQaWNrcyA9IGVkaXRNYW5hZ2VyLmdldFF1aWNrUGlja3MoKTsKLSAgICAgIGlmIChxdWlja1BpY2tzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHF1aWNrUGlja3MubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBDb21wb25lbnRTcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNpZmljYXRpb24gPSBxdWlja1BpY2tzW2ldOwotICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFscyhjb21wb25lbnRTcGVjaWZpY2F0aW9uLmdldE5hbWUoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFNwZWNpZmljYXRpb247Ci0gICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RUYWJsZVRyZWVWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvWFNEVGFibGVUcmVlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMDRlN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9YU0RUYWJsZVRyZWVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5YTUxUYWJsZVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuWE1MVGFibGVUcmVlVmlld2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RUYWJsZVRyZWVWaWV3ZXIgZXh0ZW5kcyBYTUxUYWJsZVRyZWVWaWV3ZXIKLXsKLQotICBTdHJpbmcgZmlsdGVyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICBjbGFzcyBYU0RBY3Rpb25NZW51TGlzdGVuZXIgaW1wbGVtZW50cyBJTWVudUxpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKQotICAgIHsKLSAgICAgIC8vIHVzZWQgdG8gZGlzYWJsZSBOb2RlU2VsZWN0aW9uIGxpc3RlbmluZyB3aGlsZSBydW5uaW5nIE5vZGVBY3Rpb24KLSAgICAgIC8vIFhTREFjdGlvbk1hbmFnZXIgbm9kZUFjdGlvbk1hbmFnZXIgPSBuZXcgWFNEQWN0aW9uTWFuYWdlcihmTW9kZWwsCi0gICAgICAvLyBYU0RUYWJsZVRyZWVWaWV3ZXIudGhpcyk7Ci0gICAgICAvLyBub2RlQWN0aW9uTWFuYWdlci5zZXRDb21tYW5kU3RhY2soY29tbWFuZFN0YWNrKTsKLSAgICAgIC8vIG5vZGVBY3Rpb25NYW5hZ2VyLmZpbGxDb250ZXh0TWVudShtZW51TWFuYWdlciwgZ2V0U2VsZWN0aW9uKCkpOwotCi0gICAgICAvLyB1c2VkIHRvIGRpc2FibGUgTm9kZVNlbGVjdGlvbiBsaXN0ZW5pbmcgd2hpbGUgcnVubmluZyBOb2RlQWN0aW9uCi0gICAgICAvLyBYTUxOb2RlQWN0aW9uTWFuYWdlciBub2RlQWN0aW9uTWFuYWdlciA9IG5ldwotICAgICAgLy8gWE1MTm9kZUFjdGlvbk1hbmFnZXIoKChJRE9NRG9jdW1lbnQpIGdldElucHV0KCkpLmdldE1vZGVsKCksCi0gICAgICAvLyBYTUxUYWJsZVRyZWVWaWV3ZXIudGhpcykgewotICAgICAgaWYgKGdldElucHV0KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgWFNEQWN0aW9uTWFuYWdlciBub2RlQWN0aW9uTWFuYWdlciA9IG5ldyBYU0RBY3Rpb25NYW5hZ2VyKCgoSURPTURvY3VtZW50KSAoKChFbGVtZW50KSBnZXRJbnB1dCgpKS5nZXRPd25lckRvY3VtZW50KCkpKS5nZXRNb2RlbCgpLCBYU0RUYWJsZVRyZWVWaWV3ZXIudGhpcyk7Ci0gICAgICAgIC8vIG5vZGVBY3Rpb25NYW5hZ2VyLnNldENvbW1hbmRTdGFjayhjb21tYW5kU3RhY2spOwotICAgICAgICBub2RlQWN0aW9uTWFuYWdlci5maWxsQ29udGV4dE1lbnUobWVudU1hbmFnZXIsIGdldFNlbGVjdGlvbigpKTsKLSAgICAgIH0KLQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBYU0RUYWJsZVRyZWVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgLy8gdHJlZUV4dGVuc2lvbi5zZXRDZWxsTW9kaWZpZXIobnVsbCk7Ci0gICAgZ2V0VHJlZSgpLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotICAgIC8vIHRyZWVFeHRlbnNpb24gPSBuZXcgWE1MVHJlZUV4dGVuc2lvbihnZXRUcmVlKCkpOwotCi0gICAgLy8gUmVhc3NpZ24gdGhlIGNvbnRlbnQgcHJvdmlkZXIKLSAgICBYTUxUYWJsZVRyZWVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgTXlDb250ZW50UHJvdmlkZXIoKTsKLSAgICAvLyBwcm92aWRlci5hZGRWaWV3ZXIodGhpcyk7Ci0KLSAgICBzZXRDb250ZW50UHJvdmlkZXIocHJvdmlkZXIpOwotICAgIHNldExhYmVsUHJvdmlkZXIocHJvdmlkZXIpOwotCi0gICAgLy8gc2V0Vmlld2VyU2VsZWN0aW9uTWFuYWdlcihuZXcgVmlld2VyU2VsZWN0aW9uTWFuYWdlckltcGwobnVsbCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIE9iamVjdCBnZXRSb290KCkKLSAgewotICAgIHJldHVybiBzdXBlci5nZXRSb290KCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoU3RyaW5nIGZpbHRlcikKLSAgewotICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGV4dE1lbnUoKQotICB7Ci0gICAgLy8gVE9ETyBWZXJpZnkgaWYgdGhpcyBpcyBva2F5IHRvIG92ZXJyaWRlIHRoZSBNZW51TWFuYWdlcgotICAgIE1lbnVNYW5hZ2VyIGNvbnRleHRNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wVXAiKTsgLy8kTk9OLU5MUy0xJAotICAgIGNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBjb250ZXh0TWVudS5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0KLSAgICAvLyBUaGlzIGlzIHRoZSBsaW5lIHdlIGhhdmUgdG8gbW9kaWZ5Ci0gICAgY29udGV4dE1lbnUuYWRkTWVudUxpc3RlbmVyKG5ldyBYU0RBY3Rpb25NZW51TGlzdGVuZXIoKSk7Ci0gICAgTWVudSBtZW51ID0gY29udGV4dE1lbnUuY3JlYXRlQ29udGV4dE1lbnUoZ2V0Q29udHJvbCgpKTsKLSAgICBnZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKLSAgfQotCi0gIGJvb2xlYW4gYWRkZWQgPSBmYWxzZTsKLQotICBjbGFzcyBNeUNvbnRlbnRQcm92aWRlciBleHRlbmRzIFhNTFRhYmxlVHJlZUNvbnRlbnRQcm92aWRlcgotICB7Ci0KLSAgICAvLyBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAvLwkJCQotICAgIC8vIGlmICghYWRkZWQpIHsKLSAgICAvLyBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLSAgICAvLyBhZGRlZCA9IHRydWU7Ci0gICAgLy8gRWxlbWVudCBlbGVtID0gKEVsZW1lbnQpZWxlbWVudDsKLSAgICAvLyBpZiAoZWxlbSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLSAgICAvLyB2aWV3ZXJOb3RpZnlpbmdBZGFwdGVyRmFjdG9yeS5hZGFwdCgoSU5vZGVOb3RpZmllcikgZWxlbSk7Ci0gICAgLy8gfQotICAgIC8vIC8vIHJldHVybiBuZXcgT2JqZWN0W10ge2VsZW19OwotICAgIC8vIH0KLSAgICAvLyB9Ci0gICAgLy8gcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKGVsZW1lbnQpOwotICAgIC8vIH0KLQotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgICB7Ci0gICAgICBhZGRlZCA9IGZhbHNlOwotICAgICAgaWYgKG9sZElucHV0IGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgb2xkSW5wdXQgPSAoKEVsZW1lbnQpIG9sZElucHV0KS5nZXRPd25lckRvY3VtZW50KCk7Ci0KLSAgICAgIGlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIG5ld0lucHV0ID0gKChFbGVtZW50KSBuZXdJbnB1dCkuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgc3VwZXIuaW5wdXRDaGFuZ2VkKHZpZXdlciwgb2xkSW5wdXQsIG5ld0lucHV0KTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9BZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vQWRkRXh0ZW5zaW9uc0NvbXBvbmVudERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjMwOWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9BZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmRvbS5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVzc2FnZUJveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5YU0RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nIGV4dGVuZHMgU2VsZWN0aW9uRGlhbG9nIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbWFnZSBERUZBVUxUX0VMRU1FTlRfSUNPTiA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNERWxlbWVudC5naWYiKTsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEltYWdlIERFRkFVTFRfQVRUUklCVVRFX0lDT04gPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREF0dHJpYnV0ZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0gIC8qKiBBIHRlbXBvcmFyeSBEb2N1bWVudCBpbiB3aGljaCB3ZSBjcmVhdGUgdGVtcG9yYXJ5IERPTSBlbGVtZW50IGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlCi0gICAqIEVsZW1lbnQgdmlldy4gKHJlcXVpcmVkIGJ5IExhYmVsUHJvdmlkZXIpICAqLyAKLSAgcHJvdGVjdGVkIHN0YXRpYyBEb2N1bWVudCB0ZW1wRG9jID0gbmV3IERvY3VtZW50SW1wbCgpOwotICAKLSAgQnV0dG9uIGFkZEJ1dHRvbiwgcmVtb3ZlQnV0dG9uLCBlZGl0QnV0dG9uOwotCi0gIHB1YmxpYyBBZGRFeHRlbnNpb25zQ29tcG9uZW50RGlhbG9nKFNoZWxsIHBhcmVudCwgRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeSBzY2hlbWFSZWdpc3RyeSkKLSAgewotICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgc2V0VGl0bGUoTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRVhURU5TSU9OX0NPTVBPTkVOVFMpOwotICAgIHNldFNoZWxsU3R5bGUoU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULlJFU0laRSB8IFNXVC5DTE9TRSk7ICAgIAotICB9Ci0KLSAgcHJpdmF0ZSBMaXN0IGZJbnB1dDsKLQotICBwcml2YXRlIFRhYmxlVmlld2VyIGNhdGVnb3J5VGFibGVWaWV3ZXIsIGVsZW1lbnRUYWJsZVZpZXdlcjsKLSAgcHJpdmF0ZSBBcnJheUxpc3QgZXhpc3RpbmdOYW1lczsKLQotICBwcml2YXRlIFZpZXdlckZpbHRlciBlbGVtZW50VGFibGVWaWV3ZXJGaWx0ZXI7Ci0gIHByaXZhdGUgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgY3VycmVudEV4dENhdGVnb3J5OwotICBwcml2YXRlIEhhc2hNYXAgc3BlY1RvQ29tcG9uZW50c0xpc3QgPSBuZXcgSGFzaE1hcCgpOwotICBwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlOwotICAKLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoTGlzdCBpbnB1dCkKLSAgewotICAgIHRoaXMuZklucHV0ID0gaW5wdXQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBnZXRTZWxlY3RlZENhdGVnb3J5KCl7Ci0JcmV0dXJuIGN1cnJlbnRFeHRDYXRlZ29yeTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbENhdGVnb3J5U2VsZWN0aW9uKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwZWMpewotCSAgY3VycmVudEV4dENhdGVnb3J5ID0gc3BlYzsKLSAgfQotICAKLSAgcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGdldENhdGVnb3J5Q29udGVudFByb3ZpZGVyKCkKLSAgewotICAgIHJldHVybiBuZXcgQ2F0ZWdvcnlDb250ZW50UHJvdmlkZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIGNvbnRhaW5lcikKLSAgewotICAgIENvbXBvc2l0ZSBwYXJlbnQgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKGNvbnRhaW5lcik7Ci0KLSAgICBDb21wb3NpdGUgY2F0ZWdvcnlDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm51bUNvbHVtbnMgPSAyOwotICAgIGdsLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgZ2wubWFyZ2luV2lkdGggPSAwOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBjYXRlZ29yeUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGNhdGVnb3J5Q29tcG9zaXRlLnNldExheW91dChnbCk7Ci0KLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjYXRlZ29yeUNvbXBvc2l0ZSwgU1dULkxFRlQpOwotICAgIGxhYmVsLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX0VYVEVOU0lPTl9DQVRFR09SSUVTKTsKLQotICAgIG5ldyBMYWJlbChjYXRlZ29yeUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0gICAgY2F0ZWdvcnlUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjYXRlZ29yeUNvbXBvc2l0ZSwgZ2V0VGFibGVTdHlsZSgpKTsKLSAgICBjYXRlZ29yeVRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihnZXRDYXRlZ29yeUNvbnRlbnRQcm92aWRlcigpKTsKLSAgICBjYXRlZ29yeVRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IENhdGVnb3J5TGFiZWxQcm92aWRlcigpKTsKLSAgICBjYXRlZ29yeVRhYmxlVmlld2VyLnNldElucHV0KGZJbnB1dCk7Ci0gICAgY2F0ZWdvcnlUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjYXRlZ29yeVRhYmxlVmlld2VyLmdldENvbnRyb2woKSwgWFNERWRpdG9yQ1NIZWxwSWRzLkFERF9FWFRFTlNJT05TX0NPTVBPTkVOVFNfX0VYVEVOU0lPTl9DQVRFR09SSUVTKTsKLQotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgVGFibGUgdGFibGUgPSBjYXRlZ29yeVRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0gICAgdGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgdGFibGUuc2V0Rm9udChjb250YWluZXIuZ2V0Rm9udCgpKTsKLQotICAgIENvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNhdGVnb3J5Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDE7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotCi0gICAgYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICBhZGRCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfQUREX1dJVEhfRE9UUyk7Ci0gICAgYWRkQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotICAgIGFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGFkZEJ1dHRvbiwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5BRERfRVhURU5TSU9OU19DT01QT05FTlRTX19BREQpOyAgICAKLQotICAgIHJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgcmVtb3ZlQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuX1VJX0xBQkVMX0RFTEVURSk7Ci0gICAgcmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotICAgIHJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJlbW92ZUJ1dHRvbiwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5BRERfRVhURU5TSU9OU19DT01QT05FTlRTX19ERUxFVEUpOyAgICAKLQotICAgIAotICAgIGVkaXRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgIGVkaXRCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5fVUlfTEFCRUxfRURJVCk7Ci0gICAgZWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLSAgICBlZGl0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZWRpdEJ1dHRvbiwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5BRERfRVhURU5TSU9OU19DT01QT05FTlRTX19FRElUKTsgICAgCi0gICAgCi0gICAgCi0gICAgTGlzdCBpbml0aWFsU2VsZWN0aW9uID0gZ2V0SW5pdGlhbEVsZW1lbnRTZWxlY3Rpb25zKCk7Ci0gICAgaWYgKGluaXRpYWxTZWxlY3Rpb24gIT0gbnVsbCkKLSAgICAgIGNhdGVnb3J5VGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGluaXRpYWxTZWxlY3Rpb24pKTsKLQotICAgIExhYmVsIGVsZW1lbnRMYWJlbCA9IG5ldyBMYWJlbChjYXRlZ29yeUNvbXBvc2l0ZSwgU1dULkxFRlQpOwotICAgIGVsZW1lbnRMYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9MQUJFTF9BVkFJTEFCTEVfQ09NUE9ORU5UU19UT19BREQpOwotCi0gICAgbmV3IExhYmVsKGNhdGVnb3J5Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLSAgICBlbGVtZW50VGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY2F0ZWdvcnlDb21wb3NpdGUsIGdldFRhYmxlU3R5bGUoKSk7Ci0gICAgZWxlbWVudFRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgRWxlbWVudENvbnRlbnRQcm92aWRlcigpKTsKLSAgICBlbGVtZW50VGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgRWxlbWVudExhYmVsUHJvdmlkZXIoKSk7Ci0gICAgZWxlbWVudFRhYmxlVmlld2VyLnNldElucHV0KG51bGwpOwotICAgIGVsZW1lbnRUYWJsZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgICAgb2tQcmVzc2VkKCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgaWYgKCBlbGVtZW50VGFibGVWaWV3ZXJGaWx0ZXIgIT0gbnVsbCl7Ci0gICAgICBlbGVtZW50VGFibGVWaWV3ZXIuYWRkRmlsdGVyKGVsZW1lbnRUYWJsZVZpZXdlckZpbHRlcik7Ci0gICAgfQotICAgIAotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgdGFibGUgPSBlbGVtZW50VGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLSAgICB0YWJsZS5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICB0YWJsZS5zZXRGb250KGNvbnRhaW5lci5nZXRGb250KCkpOwotCi0gICAgZWxlbWVudFRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkgICAgICAgICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQodHJ1ZSk7CQkJCi0JICAgIH0gICAgICAgIAkgIAotICAgICAgfSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChlbGVtZW50VGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLCBYU0RFZGl0b3JDU0hlbHBJZHMuQUREX0VYVEVOU0lPTlNfQ09NUE9ORU5UU19fQVZBSUxBQkxFX0NPTVBPTkVOVFNfVE9fQUREKTsKLSAgICAKLSAgICByZXR1cm4gcGFyZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlKCkKLSAgewotICAgIHN1cGVyLmNyZWF0ZSgpOwotICAgIGlmIChjYXRlZ29yeVRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgPiAwKQotICAgIHsKLSAgICAgIGNhdGVnb3J5VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5zZWxlY3QoMCk7Ci0gICAgICAKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbjsKLSAgICAgIGlmIChjdXJyZW50RXh0Q2F0ZWdvcnkgIT0gbnVsbCl7Ci0gICAgCSAgc3RydWN0dXJlZFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGN1cnJlbnRFeHRDYXRlZ29yeSk7Ci0gICAgICB9Ci0gICAgICBlbHNlewotICAgIAkgIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAKLSAgICAJCSAgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY2F0ZWdvcnlUYWJsZVZpZXdlci5nZXRFbGVtZW50QXQoMCkpOwotICAgICAgfQotICAgICAgCi0JICBjYXRlZ29yeVRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gU2V0dXAgdGhlIGxpc3Qgb2YgY2F0ZWdvcnkgbmFtZXMgdGhhdCBhbHJlYWR5IGV4aXN0Ci0gICAgLy8gYW5kIGNvbnRydWN0cyB0aGUgWFNEU2NoZW1hIGZvciBlYWNoIGNhdGVnb3J5Ci0JZXhpc3RpbmdOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlUYWJsZUl0ZW1bXSBjYXRlZ29yaWVzID0gY2F0ZWdvcnlUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yaWVzLmxlbmd0aDsgaSsrICl7Ci0JCWV4aXN0aW5nTmFtZXMuYWRkKGNhdGVnb3JpZXNbaV0uZ2V0VGV4dCgpKTsKLQotCQlTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzcGVjID0gCi0JCQkoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEpIGNhdGVnb3JpZXNbaV0uZ2V0RGF0YSgpOwotCQlYU0RTY2hlbWEgc2NoZW1hID0gZ2V0QVNJU2NoZW1hTW9kZWwoc3BlYyk7Ci0JCQotCQlpZiAoc2NoZW1hID09IG51bGwpCi0JCXsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJTGlzdCBjb21wb25lbnRzID0gYnVpbGRJbnB1dChzY2hlbWEpOwotCQlzcGVjVG9Db21wb25lbnRzTGlzdC5wdXQoc3BlYywgY29tcG9uZW50cyk7Ci0KLQkJLy8gbWFyayBjYXRlZ29yeSBhcyBncmF5L2VtcHR5IGlmIGFwcGxpY2FibGUKLQkJT2JqZWN0W10gcmVtYWlucyA9IGNvbXBvbmVudHMudG9BcnJheSgpOwotCQlpZiAoIGVsZW1lbnRUYWJsZVZpZXdlckZpbHRlciAhPSBudWxsKQotCQkJcmVtYWlucyA9IGVsZW1lbnRUYWJsZVZpZXdlckZpbHRlci5maWx0ZXIoZWxlbWVudFRhYmxlVmlld2VyLCAKLQkJCQkJZWxlbWVudFRhYmxlVmlld2VyLmdldFRhYmxlKCksIHJlbWFpbnMpOwotCQlpZiAoIHJlbWFpbnMubGVuZ3RoID09IDApCi0JCXsKLQkJICBjYXRlZ29yaWVzW2ldLnNldEZvcmVncm91bmQoCi0JCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JBWSkpOwotCQl9Ci0JfQotCQotCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkRWxlbWVudHNUYWJsZUZpbHRlcihWaWV3ZXJGaWx0ZXIgZmlsdGVyKXsKLQllbGVtZW50VGFibGVWaWV3ZXJGaWx0ZXIgPSBmaWx0ZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByZWZTdG9yZShJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSkKLSAgewotICAgIHRoaXMucHJlZlN0b3JlID0gcHJlZlN0b3JlOwotICB9Ci0KLSAgcHJvdGVjdGVkIFBvaW50IGdldEluaXRpYWxTaXplKCkKLSAgewotICAgIHJldHVybiBnZXRTaGVsbCgpLmNvbXB1dGVTaXplKDQwMCwgMzAwKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHN0eWxlIGZsYWdzIGZvciB0aGUgdGFibGUgdmlld2VyLgotICAgKiAKLSAgICogQHJldHVybiBpbnQKLSAgICovCi0gIHByb3RlY3RlZCBpbnQgZ2V0VGFibGVTdHlsZSgpCi0gIHsKLSAgICByZXR1cm4gU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVI7Ci0gIH0KLQotICAvKgotICAgKiBPdmVycmlkZXMgbWV0aG9kIGZyb20gRGlhbG9nCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKQotICB7Ci0gICAgLy8gQnVpbGQgYSBsaXN0IG9mIHNlbGVjdGVkIGNoaWxkcmVuLgotICAgIGdldFNoZWxsKCkuc2V0Q3Vyc29yKG5ldyBDdXJzb3IoZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIFNXVC5DVVJTT1JfV0FJVCkpOwotICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGVsZW1lbnRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGVsZW1lbnRUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBjYXRlZ29yeVNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY2F0ZWdvcnlUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICByZXN1bHQuYWRkKGVsZW1lbnRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgIHJlc3VsdC5hZGQoY2F0ZWdvcnlTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgIGlmIChlbGVtZW50U2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpICE9IG51bGwpCi0gICAgewotICAgICAgc2V0UmVzdWx0KHJlc3VsdCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRSZXN1bHQobnVsbCk7Ci0gICAgfQotICAgIHN1cGVyLm9rUHJlc3NlZCgpOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IGFkZEJ1dHRvbikKLSAgICB7Ci0gICAgCUFkZE5ld0NhdGVnb3J5RGlhbG9nIGFkZE5ld0NhdGVnb3J5RGlhbG9nCi0gICAgCQk9IG5ldyBBZGROZXdDYXRlZ29yeURpYWxvZyhnZXRTaGVsbCgpKTsKLSAgICAJCi0gICAgCWFkZE5ld0NhdGVnb3J5RGlhbG9nLnNldFVuYXZhaWxhYmxlQ2F0ZWdvcnlOYW1lcyhleGlzdGluZ05hbWVzKTsKLSAgICAJCi0gICAgCWlmICggYWRkTmV3Q2F0ZWdvcnlEaWFsb2cub3BlbigpID09IFdpbmRvdy5PSyApeyAgICAJCQotICAgIAkJU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc2NoZW1hU3BlYyA9IAotICAgIAkJCW5ldyBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSgpOwotICAgIAkJc2NoZW1hU3BlYy5zZXREaXNwbGF5TmFtZShhZGROZXdDYXRlZ29yeURpYWxvZy5nZXROZXdDYXRlZ29yeU5hbWUoKSApOwotICAgIAkJc2NoZW1hU3BlYy5zZXRMb2NhdGlvbihhZGROZXdDYXRlZ29yeURpYWxvZy5nZXRDYXRlZ29yeUxvY2F0aW9uKCkgKTsKLSAgICAJCXNjaGVtYVNwZWMuc2V0U291cmNlSGludChhZGROZXdDYXRlZ29yeURpYWxvZy5nZXRTb3VyY2UoKSk7Ci0gICAgCQlzY2hlbWFTcGVjLnNldEZyb21DYXRhbG9nKGFkZE5ld0NhdGVnb3J5RGlhbG9nLmdldEZyb21DYXRhbG9nKCkgKTsKLQotICAgIAkJZklucHV0LmFkZChzY2hlbWFTcGVjKTsKLSAgICAJCWV4aXN0aW5nTmFtZXMuYWRkKHNjaGVtYVNwZWMuZ2V0RGlzcGxheU5hbWUoKSk7Ci0KLSAgICAJCS8vIHJlZnJlc2ggd2l0aG91dCB1cGRhdGluZyBsYWJlbHMgb2YgZXhpc3RpbmcgVGFibGVJdGVtcyAgICAJCQotICAgIAkJY2F0ZWdvcnlUYWJsZVZpZXdlci5yZWZyZXNoKGZhbHNlKTsKLQotICAgIAkJY2F0ZWdvcnlUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2NoZW1hU3BlYykpOwotICAgIAkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIAkJCi0gICAgCQlzdG9yZVNwZWNJblByZWYoc2NoZW1hU3BlYyk7ICAvLyBtdXN0IHN0b3JlIGFmdGVyIHNlbGVjdGlvbiBjaGFuZ2VkIGlzIGNhbGxlZCBpZS4gMiBsaW5lcyBhYm92ZSAodHJ1bmcpCi0gICAgCX0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gcmVtb3ZlQnV0dG9uKQotICAgIHsKLSAgICAJVGFibGVJdGVtW10gc2VsZWN0aW9ucyA9IGNhdGVnb3J5VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAJZm9yIChpbnQgaSA9MDsgaSA8IHNlbGVjdGlvbnMubGVuZ3RoOyBpKyspewotICAgIAkJU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc3BlYyA9IAotICAgIAkJCShTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSkgc2VsZWN0aW9uc1tpXS5nZXREYXRhKCk7Ci0KLQkJCWZJbnB1dC5yZW1vdmUoc3BlYyApOwotICAgIAkJZXhpc3RpbmdOYW1lcy5yZW1vdmUoc3BlYy5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAJCXNwZWNUb0NvbXBvbmVudHNMaXN0LnJlbW92ZShzcGVjKTsKLSAgICAJCQotICAgIAkJcmVtb3ZlRnJvbVByZWYoc3BlYyk7Ci0gICAgCX0KLSAgICAJY2F0ZWdvcnlUYWJsZVZpZXdlci5yZWZyZXNoKGZhbHNlKTsKLQotICAgIAllbGVtZW50VGFibGVWaWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0gICAgCWVsZW1lbnRUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0KLSAgICAgICAgLy8gVE9ETyBhdXRvIHNlbGVjdCBlaXRoZXIgdGhlIHByZXYgY2F0ZWdvcnksIHRoZSBuZXh0IGNhdGVnb3J5IG9yIHRoZSBmaXJzdCBjYXRlZ29yeSBpbiB0aGUgVGFibGUKLSAgICAJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBlZGl0QnV0dG9uKQotICAgIHsKLSAgICAgICAgLy8gdXNlIHRoaXMgZGlhbG9nIG5vdCBmb3IgYWRkaW5nIGJ1dCBmb3IgZWRpdGluZyBwdXJwb3NlLgotICAgICAgICBBZGROZXdDYXRlZ29yeURpYWxvZyBkaWFsb2cgPSBuZXcgQWRkTmV3Q2F0ZWdvcnlEaWFsb2coZ2V0U2hlbGwoKSwgTWVzc2FnZXMuX1VJX0xBQkVMX0VESVRfQ0FURUdPUlkpOwotICAgICAgICAKLSAgICAJVGFibGVJdGVtW10gc2VsZWN0aW9ucyA9IGNhdGVnb3J5VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAJaWYgKHNlbGVjdGlvbnMubGVuZ3RoID09IDApCi0gICAgCQlyZXR1cm47Ci0KLSAgICAJU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc3BlYyA9IChTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSkgc2VsZWN0aW9uc1swXS5nZXREYXRhKCk7Ci0gICAgICAgIAotICAgIAlTdHJpbmcgZGlzcGxheU5hbWUgPSBzcGVjLmdldERpc3BsYXlOYW1lKCk7Ci0KLQkJZGlhbG9nLnNldENhdGVnb3J5TmFtZShkaXNwbGF5TmFtZSApOwotICAgIAlkaWFsb2cuc2V0RnJvbUNhdGFsb2coc3BlYy5pc0Zyb21DYXRhbG9nKCkgKTsKLSAgICAJZGlhbG9nLnNldFNvdXJjZShzcGVjLmdldFNvdXJjZUhpbnQoKSApOwotICAgIAlkaWFsb2cuc2V0Q2F0ZWdvcnlMb2NhdGlvbihzcGVjLmdldExvY2F0aW9uKCkgKTsKLQotICAgIAlzcGVjVG9Db21wb25lbnRzTGlzdC5yZW1vdmUoc3BlYyk7Ci0gICAgCWRpYWxvZy5zZXRVbmF2YWlsYWJsZUNhdGVnb3J5TmFtZXMoZXhpc3RpbmdOYW1lcyk7Ci0gICAgICAgIAotICAgICAgICBpZiAoIGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKXsKLSAgICAgICAgCWV4aXN0aW5nTmFtZXMucmVtb3ZlKGRpc3BsYXlOYW1lKTsKLQkJCVN0cmluZyBuZXdEaXNwbGF5TmFtZSA9IGRpYWxvZy5nZXROZXdDYXRlZ29yeU5hbWUoKTsKLQotCQkJc3BlYy5zZXREaXNwbGF5TmFtZShuZXdEaXNwbGF5TmFtZSk7Ci0gICAgICAgIAlzcGVjLnNldExvY2F0aW9uKGRpYWxvZy5nZXRDYXRlZ29yeUxvY2F0aW9uKCkpOwotICAgICAgICAJc3BlYy5zZXRTb3VyY2VIaW50KGRpYWxvZy5nZXRTb3VyY2UoKSk7Ci0gICAgICAgIAlzcGVjLnNldEZyb21DYXRhbG9nKGRpYWxvZy5nZXRGcm9tQ2F0YWxvZygpKTsKLSAgICAgICAgCXNwZWMuc2V0TmFtZXNwYWNlVVJJKG51bGwpOwotICAgICAgICAJCi0gICAgICAgIAlleGlzdGluZ05hbWVzLmFkZChuZXdEaXNwbGF5TmFtZSk7Ci0KLSAgICAgICAgCWNhdGVnb3J5VGFibGVWaWV3ZXIudXBkYXRlKHNwZWMsIG51bGwpOwotICAgICAgICAJcmVmcmVzaEVsZW1lbnRzVmlld2VyKHNwZWMpOwotICAgICAgICAJCi0gICAgICAgIAllZGl0U3BlY0luUHJlZihkaXNwbGF5TmFtZSwgc3BlYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldERlZmF1bHRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICB7Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKGV2ZW50LmdldFNvdXJjZSgpID09IGNhdGVnb3J5VGFibGVWaWV3ZXIpCi0gICAgewotICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEpCi0gICAgICAgIHsKLSAgICAgICAgICBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzcGVjID0gKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKSBvYmo7Ci0gICAgICAgICAgY3VycmVudEV4dENhdGVnb3J5ID0gc3BlYzsKLSAgICAgICAgICByZWZyZXNoRWxlbWVudHNWaWV3ZXIoc3BlYyk7Ci0KLSAgICAgICAgICBpZiAoIHNwZWMuaXNEZWZhdXRTY2hlbWEoKSApewotICAgICAgICAJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZXsKLSAgICAgICAgCWVkaXRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hFbGVtZW50c1ZpZXdlcihTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzcGVjKSB7Ci0JICBMaXN0IGNvbXBvbmVudHMgPSAoTGlzdCkgc3BlY1RvQ29tcG9uZW50c0xpc3QuZ2V0KHNwZWMpOwotCSAgaWYgKCBjb21wb25lbnRzICE9IG51bGwpewotCQllbGVtZW50VGFibGVWaWV3ZXIuc2V0SW5wdXQoY29tcG9uZW50cyk7Ci0JCXJldHVybjsKLQkgIH0KLQkgIAotCSAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IGdldEFTSVNjaGVtYU1vZGVsKHNwZWMpOwotCi0JICBpZiAoeHNkU2NoZW1hID09IG51bGwpewotCQkgIE1lc3NhZ2VCb3ggZXJyRGlhbG9nID0gbmV3IE1lc3NhZ2VCb3goZ2V0U2hlbGwoKSwgU1dULklDT05fRVJST1IpOwotCQkgIGVyckRpYWxvZy5zZXRUZXh0KE1lc3NhZ2VzLl9VSV9FUlJPUl9JTlZBTElEX0NBVEVHT1JZKTsKLQkJICAvLyBUT0RPICh0cnVuZykgSSB3YXMgZm9yY2VkIHRvIHVzZSBhIFN0cmluZyBpbiBNZXNzYWdlcyB0byBtYWtlIHRoZSBlcnJvciBjbGVhcmVyCi0JCSAgLy8gV2hlbiB3ZSBhcmUgYmFjayB0byBkZXZlbG9wbWVudCBwaGFzZSwgdXNlIGFub3RoZXIgc3RyaW5nOiAiRXh0ZW5zaW9uIENhdGVnb3J5OiAiCi0JCSAgLy8gbm90ICJFeHRlbnNpb24gQ2F0ZWdvcmllczoiICsgIiAiIGxpa2Ugd2UgYXJlIHVzaW5nIGhlcmUKLQkJICBlcnJEaWFsb2cuc2V0TWVzc2FnZShNZXNzYWdlcy5fVUlfTEFCRUxfRVhURU5TSU9OX0NBVEVHT1JJRVMgKyAiICIgKyBzcGVjLmdldERpc3BsYXlOYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCSAgKyAiXG4iICAgLy8kTk9OLU5MUy0xJAotCQkJCSAgKyBNZXNzYWdlcy5fVUlfRVJST1JfRklMRV9DQU5OT1RfQkVfUEFSU0VECi0JCQkJICArICJcbiIgKyBNZXNzYWdlcy5fVUlfRVJST1JfVkFMSURBVEVfVEhFX0ZJTEUpOyAgIC8vJE5PTi1OTFMtMSQKLQkJICBlcnJEaWFsb2cub3BlbigpOwotCQkgIAotCQkgIGVsZW1lbnRUYWJsZVZpZXdlci5zZXRJbnB1dChuZXcgQXJyYXlMaXN0KDApKTsKLQkJICByZXR1cm47Ci0JICB9Ci0JICAKLQkgIGNvbXBvbmVudHMgPSBidWlsZElucHV0KHhzZFNjaGVtYSk7Ci0gICAgICBzcGVjVG9Db21wb25lbnRzTGlzdC5wdXQoc3BlYywgY29tcG9uZW50cyk7CSAgCi0JICAKLQkgIExpc3QgYWxsSXRlbXMgPSBidWlsZElucHV0KHhzZFNjaGVtYSk7Ci0JICBpZiAoIGFsbEl0ZW1zID09IG51bGwgKQotCQkgIHJldHVybjsKLQkgIGVsZW1lbnRUYWJsZVZpZXdlci5zZXRJbnB1dChhbGxJdGVtcyk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIExpc3QgYnVpbGRJbnB1dChYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0JaWYgKCB4c2RTY2hlbWEgPT1udWxsICkKLQkJcmV0dXJuIG51bGw7Ci0KLSAgICBMaXN0IGVsZW1lbnRzID0geHNkU2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKTsKLSAgICBMaXN0IGF0dHJpYnV0ZXMgPSB4c2RTY2hlbWEuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb25zKCk7Ci0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHhzZFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQotICAgIC8vIEZvciBzYWZldHkgcHVycG9zZTogV2UgZG9uJ3QgYXBwZW5kICdhdHRyaWJ1dGVzJyB0byAnZWxlbWVudHMnCi0gICAgLy8gQXJyYXlTdG9yZUV4Y2VwdGlvbihvciBzaW1pbGFyIG9uZSkgbWF5IG9jY3VyCi0gICAgTGlzdCBhbGxJdGVtcyA9IG5ldyBBcnJheUxpc3QoYXR0cmlidXRlcy5zaXplKCkgKyBlbGVtZW50cy5zaXplKCkpOwotICAgIAotICAgIHsKLSAgICAgIC8vIGdldEVsZW1lbnREZWNsYXJhdGlvbnMgcmV0dXJucyBhIGxvdCBvZiBlbGVtZW50cyBmcm9tIGltcG9ydAotICAgICAgLy8gc3RhdGVtZW50LCB3ZQotICAgICAgLy8gb25seSBhZGQgbm9uLWltcG9ydGVkIGVsZW1lbnRzIGhlcmUuICh0cnVuZykKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBjdXJyZW50RWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRzLmdldChpKTsKLSAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKHRhcmdldE5hbWVzcGFjZSkpCi0gICAgICAgICAgICBhbGxJdGVtcy5hZGQoY3VycmVudEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIGFsbEl0ZW1zLmFkZChjdXJyZW50RWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIGdldEF0dHJpYnV0ZURlY2xhcmF0aW9ucyBhbHNvIHJldHVybnMgYSBsb3Qgb2YgZWxlbWVudHMgZnJvbQotICAgICAgLy8gaW1wb3J0IHN0YXRlbWVudCwgd2UKLSAgICAgIC8vIG9ubHkgYWRkIG5vbi1pbXBvcnRlZCBlbGVtZW50cyBoZXJlLiAodHJ1bmcpCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGN1cnJlbnRBdHRyaWJ1dGUgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJpYnV0ZXMuZ2V0KGkpOwotICAgICAgICBpZiAoY3VycmVudEF0dHJpYnV0ZS5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGN1cnJlbnRBdHRyaWJ1dGUuaXNHbG9iYWwoKSAmJiBjdXJyZW50QXR0cmlidXRlLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyh0YXJnZXROYW1lc3BhY2UpKQotICAgICAgICAgICAgYWxsSXRlbXMuYWRkKGN1cnJlbnRBdHRyaWJ1dGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIGFsbEl0ZW1zLmFkZChjdXJyZW50QXR0cmlidXRlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYWxsSXRlbXM7Ci0gIH0KLQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgWFNEU2NoZW1hIGdldEFTSVNjaGVtYU1vZGVsKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIGV4dGVuc2lvbnNTY2hlbWFTcGVjKQotICB7Ci0gICAgU3RyaW5nIGxvY2F0aW9uID0gZXh0ZW5zaW9uc1NjaGVtYVNwZWMuZ2V0TG9jYXRpb24oKTsKLSAgICBpZiAoIGxvY2F0aW9uID09IG51bGwpCi0gICAgCXJldHVybiBudWxsOwotCVhTRFNjaGVtYSB4c2RTY2hlbWEgPSBYU0RJbXBsLmJ1aWxkWFNETW9kZWwobG9jYXRpb24pOwotICAgIAotICAgIC8vIG5vdyB0aGF0IHRoZSAueHNkIGZpbGUgaXMgcmVhZCwgd2UgY2FuIHJldHJpZXZlIHRoZSBuYW1lc3BhY2Ugb2YgdGhpcyB4c2QgZmlsZQotICAgIC8vIGFuZCBzZXQgdGhlIG5hbWVzcGFjZSBmb3IgJ3Byb3BlcnRpZXMnCi0gICAgaWYgKCBleHRlbnNpb25zU2NoZW1hU3BlYy5nZXROYW1lc3BhY2VVUkkoKSA9PSBudWxsKXsKLSAgICAJZXh0ZW5zaW9uc1NjaGVtYVNwZWMuc2V0TmFtZXNwYWNlVVJJKCB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4geHNkU2NoZW1hOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHN0b3JlU3BlY0luUHJlZihTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzY2hlbWFTcGVjKSB7Ci0JaWYgKHByZWZTdG9yZSA9PSBudWxsKQotCQlyZXR1cm47Ci0JCi0JU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IHByZWZTdG9yZS5nZXRTdHJpbmcoRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeS5VU0VSX0FEREVEX0VYVF9TQ0hFTUFTKTsKLQlTdHJpbmcgc3BlY0Rlc2MgPSAiICAiICsgIlx0IiArIHNjaGVtYVNwZWMuZ2V0RGlzcGxheU5hbWUoKSArICJcdCIrCi0JCXNjaGVtYVNwZWMuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiXHQiICsgc2NoZW1hU3BlYy5nZXRMb2NhdGlvbigpICsgIlx0IiArCi0JCXNjaGVtYVNwZWMuaXNEZWZhdXRTY2hlbWEoKSArICJcdCIgKyBzY2hlbWFTcGVjLmdldFNvdXJjZUhpbnQoKSArICJcdCIgKwotCQlzY2hlbWFTcGVjLmlzRnJvbUNhdGFsb2coKTsKLQljdXJyZW50VmFsdWUgKz0gc3BlY0Rlc2MgKyAiXG4iOwotCi0JcHJlZlN0b3JlLnNldFZhbHVlKEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkuVVNFUl9BRERFRF9FWFRfU0NIRU1BUywKLQkJCWN1cnJlbnRWYWx1ZSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZWRpdFNwZWNJblByZWYoU3RyaW5nIGRpc3BsYXlOYW1lLCBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBuZXdTcGVjKSB7Ci0JaWYgKHByZWZTdG9yZSA9PSBudWxsKQotCSAgcmV0dXJuOwotCQotCVN0cmluZyBuZXdWYWx1ZSA9ICIiOwotCVN0cmluZyBjdXJyZW50VmFsdWUgPSBwcmVmU3RvcmUuZ2V0U3RyaW5nKEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkuVVNFUl9BRERFRF9FWFRfU0NIRU1BUyk7Ci0JU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY3VycmVudFZhbHVlLCAiXG4iKTsKLQotCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotCXsKLQkgIFN0cmluZyBvbmVTcGVjRGVzYyA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkgIC8vIGdldCB0aGUgRGlzcGxheSBuYW1lCi0JICBTdHJpbmdUb2tlbml6ZXIgX3Rva2VuaXplcl8yID0gbmV3IFN0cmluZ1Rva2VuaXplcihvbmVTcGVjRGVzYywgIlx0Iik7Ci0JICBfdG9rZW5pemVyXzIubmV4dFRva2VuKCk7Ci0JICBTdHJpbmcgZE5hbWUgPSBfdG9rZW5pemVyXzIubmV4dFRva2VuKCk7Ci0KLQkgIGlmICggZE5hbWUuZXF1YWxzKGRpc3BsYXlOYW1lICkgKQotCSAgewotCQlvbmVTcGVjRGVzYyA9ICIgICIgKyAiXHQiICsgbmV3U3BlYy5nZXREaXNwbGF5TmFtZSgpICsgIlx0IisKLQkJCW5ld1NwZWMuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiXHQiICsgbmV3U3BlYy5nZXRMb2NhdGlvbigpICsgIlx0IiArCi0JCQluZXdTcGVjLmlzRGVmYXV0U2NoZW1hKCkgKyAiXHQiICsgbmV3U3BlYy5nZXRTb3VyY2VIaW50KCkgKyAiXHQiICsKLQkJCW5ld1NwZWMuaXNGcm9tQ2F0YWxvZygpOwkJICAKLQkgIH0KLQotCSAgbmV3VmFsdWUgKz0gb25lU3BlY0Rlc2MgKyAiXG4iOwotCX0KLQlwcmVmU3RvcmUuc2V0VmFsdWUoRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeS5VU0VSX0FEREVEX0VYVF9TQ0hFTUFTLCBuZXdWYWx1ZSk7Ci0JCi0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVtb3ZlRnJvbVByZWYoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc3BlYykgewotCWlmIChwcmVmU3RvcmUgPT0gbnVsbCkKLQkgIHJldHVybjsJICAKLQkgIAotCVN0cmluZyBuZXdWYWx1ZSA9ICIiOwotCVN0cmluZyBjdXJyZW50VmFsdWUgPSBwcmVmU3RvcmUuZ2V0U3RyaW5nKEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkuVVNFUl9BRERFRF9FWFRfU0NIRU1BUyk7Ci0JU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY3VycmVudFZhbHVlLCAiXG4iKTsKLQotCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotCXsKLQkgIFN0cmluZyBvbmVTcGVjRGVzYyA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkgIC8vIGdldCB0aGUgRGlzcGxheSBuYW1lCi0JICBTdHJpbmdUb2tlbml6ZXIgX3Rva2VuaXplcl8yID0gbmV3IFN0cmluZ1Rva2VuaXplcihvbmVTcGVjRGVzYywgIlx0Iik7Ci0JICBfdG9rZW5pemVyXzIubmV4dFRva2VuKCk7Ci0JICBTdHJpbmcgZE5hbWUgPSBfdG9rZW5pemVyXzIubmV4dFRva2VuKCk7Ci0KLQkgIGlmICggZE5hbWUuZXF1YWxzKHNwZWMuZ2V0RGlzcGxheU5hbWUoKSApICkKLQkJY29udGludWU7Ci0JICBuZXdWYWx1ZSArPSBvbmVTcGVjRGVzYyArICJcbiI7Ci0JfQotCXByZWZTdG9yZS5zZXRWYWx1ZShFeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5LlVTRVJfQURERURfRVhUX1NDSEVNQVMsIG5ld1ZhbHVlKTsKLSAgfQotCi1zdGF0aWMgY2xhc3MgQ2F0ZWdvcnlDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotICB7Ci0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0gICAgeyAgICAKLSAgICAgIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hW10gZXh0ZW5zaW9uc1NjaGVtYVNwZWNzID0gbnVsbDsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBMaXN0IGlucHV0TGlzdCA9IChMaXN0KSBpbnB1dEVsZW1lbnQ7Ci0gICAgICAgIGV4dGVuc2lvbnNTY2hlbWFTcGVjcyA9IChTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYVtdKSBpbnB1dExpc3QudG9BcnJheShuZXcgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWFbMF0pOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgICAgcmV0dXJuIGV4dGVuc2lvbnNTY2hlbWFTcGVjczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgICAvLyBEbyBub3RoaW5nCi0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCi0gICAgICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgICB7Ci0gICAgICAvLyBEbyBub3RoaW5nCi0KLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgY2xhc3MgQ2F0ZWdvcnlMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotICB7Ci0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIHJldHVybiBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL2FwcGluZm9fY2F0ZWdvcnkuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKQotICAgICAgICByZXR1cm4gKChTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSkgZWxlbWVudCkuZ2V0RGlzcGxheU5hbWUoKTsKLQotICAgICAgcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIGNsYXNzIEVsZW1lbnRDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotICB7Ci0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0gICAgewotICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIExpc3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoKExpc3QpIGlucHV0RWxlbWVudCkudG9BcnJheSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgICAgLy8gRG8gbm90aGluZwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotICAgICAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gICAgewotICAgICAgLy8gRG8gbm90aGluZwotCi0gICAgfQotICB9Ci0KLSAgY2xhc3MgRWxlbWVudExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0gIHsgICAgCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIGlmICggZWxlbWVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbil7Ci0gICAgCSAgCi0gICAgCSAgLy8gV29ya2Fyb3VuZCB0cmljazogKHRydW5nKSB3ZSBjcmVhdGUgYSB0ZW1wb3JhcnkgRG9tIGVsZW1lbnQgYW5kIHB1dCBpdCBpbiB0aGUgbGFiZWwgcHJvdmlkZXIKLSAgICAJICAvLyB0byBnZXQgdGhlIGltYWdlLgotICAgIAkgIFN0cmluZyBuYW1lc3BhY2UgPSAoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudCkuZ2V0U2NoZW1hKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgCSAgU3RyaW5nIG5hbWUgPSAoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudCkuZ2V0TmFtZSgpOwotICAgIAkgIEVsZW1lbnQgdGVtcEVsZW1lbnQgPSB0ZW1wRG9jLmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2UsIG5hbWUpOwotICAgICAgICAgIElMYWJlbFByb3ZpZGVyIGxwID0gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXROb2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5KCkuZ2V0TGFiZWxQcm92aWRlcihuYW1lc3BhY2UpOwotICAgIAkgIGlmIChscCAhPSBudWxsKXsKLSAgICAJCSAgSW1hZ2UgaW1nID0gbHAuZ2V0SW1hZ2UodGVtcEVsZW1lbnQpOwotICAgIAkJICAKLSAgICAJCSAgaWYgKGltZyAhPSBudWxsKXsKLSAgICAJCQkgIHJldHVybiBpbWc7Ci0gICAgCQkgIH0KLSAgICAJICB9Ci0gICAgCSAgcmV0dXJuIERFRkFVTFRfRUxFTUVOVF9JQ09OOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbil7Ci0gICAgCSAgcmV0dXJuIERFRkFVTFRfQVRUUklCVVRFX0lDT047Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgICAgcmV0dXJuICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uICkKLSAgICAgICAgcmV0dXJuICgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIGVsZW1lbnQpLmdldE5hbWUoKTsKLSAgICAgIHJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGNsb3NlKCkKLSAgewotICAgIHJldHVybiBzdXBlci5jbG9zZSgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBlbmFibGVCdXR0b25zKGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICBlZGl0QnV0dG9uLnNldEVuYWJsZWQodmFsdWUpOwotICAgIGFkZEJ1dHRvbi5zZXRFbmFibGVkKHZhbHVlKTsKLSAgICByZW1vdmVCdXR0b24uc2V0RW5hYmxlZCh2YWx1ZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9BZGROZXdDYXRlZ29yeURpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0FkZE5ld0NhdGVnb3J5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNWQzYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0FkZE5ld0NhdGVnb3J5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZGlhbG9ncy5TZWxlY3RTaW5nbGVGaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yQ1NIZWxwSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIEFkZE5ld0NhdGVnb3J5RGlhbG9nIGV4dGVuZHMgRGlhbG9nCi17Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9MQUJFTCA9IE1lc3NhZ2VzLl9VSV9MQUJFTF9TQ0hFTUE7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0xBQkVMID0gTWVzc2FnZXMuX1VJX0xBQkVMX05BTUU7Ci0gIHByaXZhdGUgU3RyaW5nIGRpYWxvZ1RpdGxlID0gTWVzc2FnZXMuX1VJX0xBQkVMX0FERF9DQVRFR09SWTsKLSAgCi0gIHByb3RlY3RlZCBNZW51TWFuYWdlciBicm93c2VNZW51OwotICBwcm90ZWN0ZWQgTGFiZWwgbmFtZTsKLSAgcHJvdGVjdGVkIFRleHQgbmFtZVRleHQ7Ci0gIHByb3RlY3RlZCBMYWJlbCBzY2hlbWE7Ci0gIHByb3RlY3RlZCBDTGFiZWwgc2NoZW1hRGlzcGxheWVyOwotICBwcm90ZWN0ZWQgVG9vbEJhciBicm93c2VUb29sQmFyOwotICBwcm90ZWN0ZWQgVG9vbEl0ZW0gYnJvd3NlSXRlbTsKLQotICBwcm90ZWN0ZWQgTGlzdCBpbnZhbGlkTmFtZXM7Ci0gIAotICAvLyBUT0RPIChjcykgcmVuYW1lIHRoaXMgZmllbGQgdG8gZXh0ZW5zaW9uU2NoZW1hTG9jYXRpb24gaW4gV1RQIDIuMAotICBwcm90ZWN0ZWQgU3RyaW5nIGFwcEluZm9TY2hlbWFMb2NhdGlvbjsKLSAgcHJvdGVjdGVkIFN0cmluZyBjYXRlZ29yeU5hbWU7Ci0gIHByb3RlY3RlZCBDTGFiZWwgZXJyRGlzcGxheWVyOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NhdGVnb3J5TmFtZVZhbGlkOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBmcm9tQ2F0YWxvZzsKLSAgCi0gIHByaXZhdGUgYm9vbGVhbiBjYW5PSyA9ZmFsc2U7IAotICAKLSAgLyoqIEVpdGhlciB0aGUgbG9jYXRpb24gaWYgY29tZSBmcm9tIHdvcmtzcGFjZSBvciBuYW1lc3BhY2UgaWYgY29tZSBmcm9tCi0gICAqIAlYTUwgQ2F0YWxvZyAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBzb3VyY2U7Ci0KLSAgcHVibGljIEFkZE5ld0NhdGVnb3J5RGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwpOwotICB9Ci0KLSAgcHVibGljIEFkZE5ld0NhdGVnb3J5RGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgZGlhbG9nVGl0bGUpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gICAgdGhpcy5kaWFsb2dUaXRsZSA9IGRpYWxvZ1RpdGxlOwotICB9Ci0gIAotICAvKioKLSAgICogcmVjZWl2ZSBhIExpc3Qgb2YgbmFtZXMgd2hpY2ggaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIGNhdGVnb3J5IGxpc3QKLSAgICogCi0gICAqIEBwYXJhbSB1bmF2YWlsTmFtZXMKLSAgICogICAgICAgICAgQXJyYXkgb2YgdW52YWlsYWJsZSBuYW1lcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VW5hdmFpbGFibGVDYXRlZ29yeU5hbWVzKExpc3QgdW5hdmFpbE5hbWVzKQotICB7Ci0gICAgaW52YWxpZE5hbWVzID0gdW5hdmFpbE5hbWVzOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROZXdDYXRlZ29yeU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGNhdGVnb3J5TmFtZS50cmltKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5TG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGFwcEluZm9TY2hlbWFMb2NhdGlvbjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnlMb2NhdGlvbihTdHJpbmcgcyl7Ci0JICBhcHBJbmZvU2NoZW1hTG9jYXRpb24gPSBzOwotICB9Ci0gIAotICAvKiogQGRlcHJlY2F0ZWQgKi8KLSAgcHVibGljIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIGdldEV4dGVuc2lvbnNTY2hlbWFTcGVjKCl7Ci0JU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc2NoZW1hU3BlYyA9IG5ldyBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSgpOwotCXNjaGVtYVNwZWMuc2V0RGlzcGxheU5hbWUoZ2V0TmV3Q2F0ZWdvcnlOYW1lKCkpOwotCXNjaGVtYVNwZWMuc2V0TG9jYXRpb24oZ2V0Q2F0ZWdvcnlMb2NhdGlvbigpKTsKLQkKLQlyZXR1cm4gc2NoZW1hU3BlYzsKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeU5hbWUoU3RyaW5nIGNhdGVnb3J5TmFtZSkgewotCXRoaXMuY2F0ZWdvcnlOYW1lID0gY2F0ZWdvcnlOYW1lOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0RnJvbUNhdGFsb2coKSB7Ci0JcmV0dXJuIGZyb21DYXRhbG9nOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRGcm9tQ2F0YWxvZyhib29sZWFuIGIpewotCWZyb21DYXRhbG9nID0gYjsJCi0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpCi0gIHsKLQlyZXR1cm4gc291cmNlOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNvdXJjZShTdHJpbmcgc291cmNlKSB7Ci0JdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbnRyb2wgcmVzdWx0ID0gc3VwZXIuY3JlYXRlQnV0dG9uQmFyKHBhcmVudCk7Ci0gICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoY2FuT0spOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvLyByZWR1ZGFudCBtZXRob2QgdG8gaW1wcm92ZSBzcGVlZCAoYWNjb3JkaW5nIHRvIHRoZSBjb21waWxlcikKLSAgcHJvdGVjdGVkIEJ1dHRvbiBnZXRCdXR0b24oaW50IGlkKSB7Ci0gICAgcmV0dXJuIHN1cGVyLmdldEJ1dHRvbihpZCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGdldFNoZWxsKCkuc2V0VGV4dChkaWFsb2dUaXRsZSk7Ci0KLSAgICBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICBsYXlvdXQubWFyZ2luVG9wID0gMTA7Ci0gICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBtYWluQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLndpZHRoSGludCA9IDQwMDsKLQotICAgIG1haW5Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIExpbmUgMSwgbmFtZQotICAgIG5hbWUgPSBuZXcgTGFiZWwobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIG5hbWUuc2V0VGV4dChOQU1FX0xBQkVMKTsKLQotICAgIG5hbWVUZXh0ID0gbmV3IFRleHQobWFpbkNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOwotICAgIG5hbWVUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIGlmIChjYXRlZ29yeU5hbWUgIT0gbnVsbCkKLSAgICAJbmFtZVRleHQuc2V0VGV4dChjYXRlZ29yeU5hbWUpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobmFtZVRleHQsCi0gICAgCQlYU0RFZGl0b3JDU0hlbHBJZHMuQUREX0NBVEVHT1JZX19OQU1FKTsgICAgIAotCi0gICAgQnV0dG9uIGhpZGRlbiA9IG5ldyBCdXR0b24obWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGhpZGRlbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQotICAgIC8vIExpbmUgMiwgc2NoZW1hCi0gICAgc2NoZW1hID0gbmV3IExhYmVsKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBzY2hlbWEuc2V0VGV4dChTQ0hFTUFfTEFCRUwpOwotCi0gICAgc2NoZW1hRGlzcGxheWVyID0gbmV3IENMYWJlbChtYWluQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSk7Ci0gICAgc2NoZW1hRGlzcGxheWVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIGlmIChzb3VyY2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgCWlmIChmcm9tQ2F0YWxvZykKLSAgICAJCXNjaGVtYURpc3BsYXllci5zZXRJbWFnZSgKLSAgICAJCQkJWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy94bWxjYXRhbG9nX29iai5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAJZWxzZQotICAgIAkJc2NoZW1hRGlzcGxheWVyLnNldEltYWdlKAotICAgIAkJCQlYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREZpbGUuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgCXNjaGVtYURpc3BsYXllci5zZXRUZXh0KHNvdXJjZSk7Ci0gICAgCQotICAgIH0KLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNjaGVtYURpc3BsYXllciwKLSAgICAJCVhTREVkaXRvckNTSGVscElkcy5BRERfQ0FURUdPUllfX1NDSEVNQSk7IAotICAgIAotICAgIGlmIChjYXRlZ29yeU5hbWUgIT0gbnVsbCAmJiBzb3VyY2UgIT0gbnVsbCkKLSAgICAJY2FuT0sgPSB0cnVlOwotCi0gICAgYnJvd3NlVG9vbEJhciA9IG5ldyBUb29sQmFyKG1haW5Db21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICBicm93c2VJdGVtID0gbmV3IFRvb2xJdGVtKGJyb3dzZVRvb2xCYXIsIFNXVC5OT05FKTsKLSAgICAvLyBUT0RPOiBTaG91bGQgYmUgYWJsZSB0byBnZXQgdGhlIGltYWdlIGZyb20gdGhlIFhNTCBwbHVnaW4uIERvbid0IG5lZWQKLSAgICAvLyB0byBjb3B5IHRvIFhTREVkaXRvciBpY29ucyBmb2xkZXIgbGlrZSB0aGlzLgotICAgIGJyb3dzZUl0ZW0uc2V0SW1hZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9hcHBpbmZvX2Jyb3dzZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIGJyb3dzZU1lbnUgPSBuZXcgTWVudU1hbmFnZXIoKTsKLQotICAgIEJyb3dzZUluV29ya3NwYWNlQWN0aW9uIGJyb3dzZUluV29ya3NwYWNlID0gbmV3IEJyb3dzZUluV29ya3NwYWNlQWN0aW9uKCk7Ci0gICAgYnJvd3NlTWVudS5hZGQoYnJvd3NlSW5Xb3Jrc3BhY2UpOwotCi0gICAgQnJvd3NlQ2F0YWxvZ0FjdGlvbiBicm93c2VDYXRhbG9nID0gbmV3IEJyb3dzZUNhdGFsb2dBY3Rpb24oKTsKLSAgICBicm93c2VNZW51LmFkZChicm93c2VDYXRhbG9nKTsKLQotICAgIGJyb3dzZUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICB7Ci0gICAgICAgIE1lbnUgbWVudSA9IGJyb3dzZU1lbnUuY3JlYXRlQ29udGV4dE1lbnUoZ2V0U2hlbGwoKSk7Ci0gICAgICAgIFJlY3RhbmdsZSBib3VuZHMgPSBicm93c2VJdGVtLmdldEJvdW5kcygpOwotICAgICAgICBQb2ludCB0b3BMZWZ0ID0gbmV3IFBvaW50KGJvdW5kcy54LCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQpOwotICAgICAgICB0b3BMZWZ0ID0gYnJvd3NlVG9vbEJhci50b0Rpc3BsYXkodG9wTGVmdCk7Ci0gICAgICAgIG1lbnUuc2V0TG9jYXRpb24odG9wTGVmdC54LCB0b3BMZWZ0LnkpOwotICAgICAgICBtZW51LnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICAvLyBDb21wb3NpdGUgZXJyQ29tcCA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIC8vIGVyckNvbXAuc2V0QmFja2dyb3VuZChvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMud2hpdGUpOwotICAgIC8vIGVyckNvbXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgIGVyckRpc3BsYXllciA9IG5ldyBDTGFiZWwobWFpbkNvbXBvc2l0ZSwgU1dULkZMQVQpOwotICAgIC8vIGVyckRpc3BsYXllci5zZXRUZXh0KCJhYmQiKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGdkLmhvcml6b250YWxTcGFuID0gMzsKLSAgICBlcnJEaXNwbGF5ZXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICAvLyBlcnJDb21wLnNldExheW91dERhdGEoZ2QpOwotICAgIC8vIGVyckRpc3BsYXllci5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAvLyBlcnJNc2dDb250YWluZXIuc2V0Q29udGVudChlcnJEaXNwbGF5ZXIpOwotCi0gICAgbmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkKLSAgICB7Ci0gICAgICAvLyB0cmFjayB0aGUgbmFtZVRleHQgYW5kIGVuYWJsZS9kaXNhYmxlIHRoZSBPSyBidXR0b24gYWNjb3JkaW5nbHkKLSAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkKLSAgICAgIHsKLSAgICAgICAgY2F0ZWdvcnlOYW1lID0gbmFtZVRleHQuZ2V0VGV4dCgpOwotCi0gICAgICAgIC8vIG5hbWUgaXMgaW4gdGhlIGludmFsaWQgTGlzdAotICAgICAgICBpZiAoaW52YWxpZE5hbWVzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaW52YWxpZE5hbWVzLmNvbnRhaW5zKGNhdGVnb3J5TmFtZS50cmltKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzQ2F0ZWdvcnlOYW1lVmFsaWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgZXJyRGlzcGxheWVyLnNldFRleHQoTWVzc2FnZXMuX1VJX0VSUk9SX05BTUVfQUxSRUFEWV9VU0VEKTsKLSAgICAgICAgICAgIGVyckRpc3BsYXllci5zZXRJbWFnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL2Vycm9yX3N0X29iai5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gbmFtZSBpcyBlbXB0eSBzdHJpbmcKLSAgICAgICAgaWYgKGNhdGVnb3J5TmFtZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICBpc0NhdGVnb3J5TmFtZVZhbGlkID0gZmFsc2U7Ci0KLSAgICAgICAgICBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgZXJyRGlzcGxheWVyLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgZXJyRGlzcGxheWVyLnNldEltYWdlKG51bGwpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEVuYWJsZSB0aGUgT2sgYnV0dG9uIGlmIHRoZSBsb2NhdGlvbiBmaWVsZCBBTkQgdGhlIG5hbWUgZmllbGQgYXJlIG5vdAotICAgICAgICAgKiBlbXB0eQotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCFjYXRlZ29yeU5hbWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgaXNDYXRlZ29yeU5hbWVWYWxpZCA9IHRydWU7Ci0gICAgICAgICAgZXJyRGlzcGxheWVyLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgZXJyRGlzcGxheWVyLnNldEltYWdlKG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhcHBJbmZvU2NoZW1hTG9jYXRpb24gIT0gbnVsbCAmJiAhYXBwSW5mb1NjaGVtYUxvY2F0aW9uLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICByZXR1cm4gcGFyZW50OwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkKLSAgewotICAgIHN1cGVyLm9rUHJlc3NlZCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIEJyb3dzZUluV29ya3NwYWNlQWN0aW9uIGV4dGVuZHMgQWN0aW9uCi0gIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEX0ZJTEVfRVhURU5TSU9OID0gIi54c2QiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgQnJvd3NlSW5Xb3Jrc3BhY2VBY3Rpb24oKQotICAgIHsKLSAgICAgIHN1cGVyKE1lc3NhZ2VzLl9VSV9BQ1RJT05fQlJPV1NFX1dPUktTUEFDRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICBTZWxlY3RTaW5nbGVGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBTZWxlY3RTaW5nbGVGaWxlRGlhbG9nKGdldFNoZWxsKCksIG51bGwsIHRydWUpOwotICAgICAgZGlhbG9nLmFkZEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsgWFNEX0ZJTEVfRVhURU5TSU9OIH0pOwotICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgZGlhbG9nLnNldFRpdGxlKE1lc3NhZ2VzLl9VSV9MQUJFTF9TRUxFQ1RfWFNEX0ZJTEUpOwotICAgICAgZGlhbG9nLnNldE1lc3NhZ2UoTWVzc2FnZXMuX1VJX0RFU0NSSVBUSU9OX0NIT09TRV9YU0RfRklMRSk7Ci0KLSAgICAgIGlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykKLSAgICAgIHsKLSAgICAgICAgSUZpbGUgYXBwSW5mb1NjaGVtYUZpbGUgPSBkaWFsb2cuZ2V0RmlsZSgpOwotICAgICAgICBpZiAoYXBwSW5mb1NjaGVtYUZpbGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vIHJlbW92ZSBsZWFkaW5nIHNsYXNoIGZyb20gdGhlIHZhbHVlIHRvIGF2b2lkIHRoZQotICAgICAgICAgIC8vIHdob2xlIGxlYWRpbmcgc2xhc2ggYW1iaWd1aXR5IHByb2JsZW0KLSAgICAgICAgICBTdHJpbmcgdXJpID0gYXBwSW5mb1NjaGVtYUZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgICAgICAgIHdoaWxlICh1cmkuc3RhcnRzV2l0aCgiLyIpIHx8IHVyaS5zdGFydHNXaXRoKCJcXCIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgdXJpID0gdXJpLnN1YnN0cmluZygxKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYXBwSW5mb1NjaGVtYUxvY2F0aW9uID0gdXJpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgc291cmNlID0gdXJpOwotICAgICAgICAgIGZyb21DYXRhbG9nID0gZmFsc2U7Ci0KLSAgICAgICAgICBhcHBJbmZvU2NoZW1hTG9jYXRpb24gPSAiZmlsZTovLyIgKyBQbGF0Zm9ybS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkgKyAiLyIgKyBhcHBJbmZvU2NoZW1hTG9jYXRpb247IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgIC8vIFRPRE8uLi4gYmUgY2FyZWZ1bCBob3cgd2UgY29uc3RydWN0IHRoZSBsb2NhdGlvbgotICAgICAgICAgIC8vIFVOSVggcmVsYXRlZCBpc3N1ZXMgaGVyZQotCi0gICAgICAgICAgc2NoZW1hRGlzcGxheWVyLnNldEltYWdlKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNERmlsZS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBzY2hlbWFEaXNwbGF5ZXIuc2V0VGV4dCh1cmkpOwotCi0gICAgICAgICAgLy8gRW5hYmxlIHRoZSBPSyBidXR0b24gaWYgd2Ugc2hvdWxkLi4KLSAgICAgICAgICBpZiAoaXNDYXRlZ29yeU5hbWVWYWxpZCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIGVyckRpc3BsYXllci5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgZXJyRGlzcGxheWVyLnNldEltYWdlKG51bGwpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBCcm93c2VDYXRhbG9nQWN0aW9uIGV4dGVuZHMgQWN0aW9uCi0gIHsKLSAgICBwdWJsaWMgQnJvd3NlQ2F0YWxvZ0FjdGlvbigpCi0gICAgewotICAgICAgc3VwZXIoTWVzc2FnZXMuX1VJX0FDVElPTl9CUk9XU0VfQ0FUQUxPRyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICBTZWxlY3RGcm9tQ2F0YWxvZ0RpYWxvZyBkaWFsb2cgPSBuZXcgU2VsZWN0RnJvbUNhdGFsb2dEaWFsb2coZ2V0U2hlbGwoKSk7Ci0gICAgICAvLyBkaWFsb2cub3BlbigpOwotICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKQotICAgICAgewotICAgICAgICBhcHBJbmZvU2NoZW1hTG9jYXRpb24gPSBkaWFsb2cuZ2V0Q3VycmVudFNlbGVjdGlvbkxvY2F0aW9uKCk7Ci0gICAgICAgIHNvdXJjZSA9IGRpYWxvZy5nZXRDdXJyZW50U2VsZWN0aW9uTmFtZXNwYWNlKCk7Ci0gICAgICAgIGZyb21DYXRhbG9nID0gdHJ1ZTsKLQotICAgICAgICBzY2hlbWFEaXNwbGF5ZXIuc2V0SW1hZ2UoWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy94bWxjYXRhbG9nX29iai5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2NoZW1hRGlzcGxheWVyLnNldFRleHQoZGlhbG9nLmdldEN1cnJlbnRTZWxlY3Rpb25OYW1lc3BhY2UoKSk7Ci0KLSAgICAgICAgLy8gRW5hYmxlIHRoZSBPSyBidXR0b24gaWYgd2Ugc2hvdWxkLi4KLSAgICAgICAgaWYgKGlzQ2F0ZWdvcnlOYW1lVmFsaWQgJiYgIWFwcEluZm9TY2hlbWFMb2NhdGlvbi5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICBlcnJEaXNwbGF5ZXIuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBlcnJEaXNwbGF5ZXIuc2V0SW1hZ2UobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0NhdGVnb3J5UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9DYXRlZ29yeVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZWI2NGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0NhdGVnb3J5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeVByb3ZpZGVyCi17Ci0gIHByaXZhdGUgSUNhdGFsb2cgc3lzdGVtQ2F0YWxvZzsKLQotICBwdWJsaWMgQ2F0ZWdvcnlQcm92aWRlcigpCi0gIHsKLSAgICAKLSAgfQotICAKLSAgLyoqCi0gICAqIEV4dGVuZGVycyBzaG91bGQgaW1wbGVtZW50IGFuZCByZXR1cm4gYSBsaXN0IG9mIAotICAgKiBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYQotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRDYXRlZ29yaWVzKCkKLSAgewotICAgIHJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBIZWxwZXIgbWV0aG9kIHRvIGZpbmQgdGhlIHBoeXNpY2FsIGxvY2F0aW9uIG9mIHRoZSBzY2hlbWEKLSAgICogaW4gdGhlIFhNTCBDYXRhbG9nCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkKLSAgICogQHJldHVybiBwaHlzaWNhbCBsb2NhdGlvbiBvZiB0aGUgc2NoZW1hCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGxvY2F0ZUZpbGVVc2luZ0NhdGFsb2coU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgewotICAgIHJldHJpZXZlQ2F0YWxvZygpOwotCi0gICAgSUNhdGFsb2dFbnRyeVtdIGVudHJpZXMgPSBzeXN0ZW1DYXRhbG9nLmdldENhdGFsb2dFbnRyaWVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChlbnRyaWVzW2ldLmdldEtleSgpLmVxdWFscyhuYW1lc3BhY2VVUkkpKQotICAgICAgICByZXR1cm4gZW50cmllc1tpXS5nZXRVUkkoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCByZXRyaWV2ZUNhdGFsb2coKQotICB7Ci0gICAgaWYgKHN5c3RlbUNhdGFsb2cgIT0gbnVsbCkKLSAgICAgIHJldHVybjsKLQotICAgIElDYXRhbG9nIGRlZmF1bHRDYXRhbG9nID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLSAgICBJTmV4dENhdGFsb2dbXSBuZXh0Q2F0YWxvZ3MgPSBkZWZhdWx0Q2F0YWxvZy5nZXROZXh0Q2F0YWxvZ3MoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5leHRDYXRhbG9ncy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJTmV4dENhdGFsb2cgY2F0YWxvZyA9IG5leHRDYXRhbG9nc1tpXTsKLSAgICAgIElDYXRhbG9nIHJlZmVyZW5jZWRDYXRhbG9nID0gY2F0YWxvZy5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotICAgICAgaWYgKHJlZmVyZW5jZWRDYXRhbG9nICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChYTUxDb3JlUGx1Z2luLlNZU1RFTV9DQVRBTE9HX0lELmVxdWFscyhyZWZlcmVuY2VkQ2F0YWxvZy5nZXRJZCgpKSkKLSAgICAgICAgewotICAgICAgICAgIHN5c3RlbUNhdGFsb2cgPSByZWZlcmVuY2VkQ2F0YWxvZzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uRGV0YWlsc0NvbnRlbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvbkRldGFpbHNDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI4ZTE4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uRGV0YWlsc0NvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlRyZWVDb250ZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b20uRGVmYXVsdExpc3ROb2RlRWRpdG9yQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tLk5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbS5Ob2RlRWRpdG9yQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tLk5vZGVFZGl0b3JQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLQotcHVibGljIGNsYXNzIERPTUV4dGVuc2lvbkRldGFpbHNDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBFeHRlbnNpb25EZXRhaWxzQ29udGVudFByb3ZpZGVyCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX0FSUkFZID0ge307Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX1NUUklOR19BUlJBWSA9IHt9OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlMgPSAieG1sbnMiOyAvLyROT04tTkxTCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX05PREVfS0VZID0gInRleHQoKSI7IC8vJE5PTi1OTFMKLQotICBwdWJsaWMgT2JqZWN0W10gZ2V0SXRlbXMoT2JqZWN0IGlucHV0KQotICB7Ci0gICAgSGFzaE1hcCByZXN1bHRNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIGlucHV0OwotICAgICAgCi0gICAgICAvLyBoZXJlIHdlIGNvbXB1dGUgaXRlbXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHRoYXQgcGh5c2ljYWxseSBpbiB0aGUgZG9jdW1lbnQgCi0gICAgICAvLwotICAgICAgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgewotICAgICAgICBBdHRyIGF0dHIgPSAoQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotICAgICAgICBpZiAoIVhNTE5TLmVxdWFscyhhdHRyLmdldE5hbWUoKSkgJiYgIVhNTE5TLmVxdWFscyhhdHRyLmdldFByZWZpeCgpKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHRNYXAucHV0KGF0dHIuZ2V0TmFtZSgpLCBET01FeHRlbnNpb25JdGVtLmNyZWF0ZUl0ZW1Gb3JFbGVtZW50QXR0cmlidXRlKGVsZW1lbnQsIGF0dHIpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAKLSAgICAgIC8vIGhlcmUgd2UgY29tcHV0ZSBhbiBpdGVtIGZvciB0aGUgdGV4dCBub2RlIHRoYXQgaXMgcGh5c2ljYWxseSBpbiB0aGUgZG9jdW1lbnQgCi0gICAgICAvLyAgICAgIAotICAgICAgU3RyaW5nIHRleHROb2RlVmFsdWUgPSBuZXcgVHJlZUNvbnRlbnRIZWxwZXIoKS5nZXROb2RlVmFsdWUoZWxlbWVudCk7Ci0gICAgICBpZiAodGV4dE5vZGVWYWx1ZSAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIHJlc3VsdE1hcC5wdXQoVEVYVF9OT0RFX0tFWSwgRE9NRXh0ZW5zaW9uSXRlbS5jcmVhdGVJdGVtRm9yRWxlbWVudFRleHQoZWxlbWVudCkpOwotICAgICAgfSAgCi0gICAgICAKLSAgICAgIE1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgICAgICBpZiAoZWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vIGhlcmUgd2UgY29tcHV0ZSBpdGVtcyBmb3IgdGhlIGF0dHJpYnV0ZXMgdGhhdCBtYXkgYmUgYWRkZWQgdG8gdGhlIGRvY3VtZW50IGFjY29yZGluZyB0byB0aGUgZ3JhbW1hciAKLSAgICAgICAgICAvLyAgICAgICAgICAgCi0gICAgICAgICAgTGlzdCBsaXN0ID0gbW9kZWxRdWVyeS5nZXRBdmFpbGFibGVDb250ZW50KGVsZW1lbnQsIGVkLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQVRUUklCVVRFUyk7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgIHsgIAotICAgICAgICAgICAgICBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24paS5uZXh0KCk7Ci0gICAgICAgICAgICAgIGlmIChhZCAhPSBudWxsICYmIHJlc3VsdE1hcC5nZXQoYWQuZ2V0Tm9kZU5hbWUoKSkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdE1hcC5wdXQoYWQuZ2V0Tm9kZU5hbWUoKSwgRE9NRXh0ZW5zaW9uSXRlbS5jcmVhdGVJdGVtRm9yRWxlbWVudEF0dHJpYnV0ZShlbGVtZW50LCBhZCkpOwotICAgICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICAgIGlmIChyZXN1bHRNYXAuZ2V0KFRFWFRfTk9ERV9LRVkpID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gaGVyZSB3ZSBjb21wdXRlIGFuIGl0ZW0gZm9yIHRoZSB0ZXh0IG5vZGUgdGhhdCBtYXkgYmUgYWRkZWQgdG8gdGhlIGRvY3VtZW50IGFjY29yZGluZyB0byB0aGUgZ3JhbW1hciAKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgY29udGVudFR5cGUgPSBlZC5nZXRDb250ZW50VHlwZSgpOwotICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQSB8fCBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0TWFwLnB1dChURVhUX05PREVfS0VZLCBET01FeHRlbnNpb25JdGVtLmNyZWF0ZUl0ZW1Gb3JFbGVtZW50VGV4dChlbGVtZW50KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIENvbGxlY3Rpb24gY29sbGVjdGlvbiA9IHJlc3VsdE1hcC52YWx1ZXMoKTsKLSAgICAgIC8vIGluaXRpYWxpemUgdGhlIGVkaXRvciBpbmZvcm1hdGlvbiBmb3IgZWFjaCBpdGVtCi0gICAgICAvLwotICAgICAgZm9yIChJdGVyYXRvciBpID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIGluaXRQcm9wZXJ0eUVkaXRvckNvbmZpZ3VyYXRpb24oKERPTUV4dGVuc2lvbkl0ZW0pIGkubmV4dCgpKTsKLSAgICAgIH0KLSAgICAgIERPTUV4dGVuc2lvbkl0ZW1bXSBpdGVtcyA9IG5ldyBET01FeHRlbnNpb25JdGVtW2NvbGxlY3Rpb24uc2l6ZSgpXTsKLSAgICAgIHJlc3VsdE1hcC52YWx1ZXMoKS50b0FycmF5KGl0ZW1zKTsKLSAgICAgIAotICAgICAgLy8gaGVyZSB3ZSBzb3J0IHRoZSBsaXN0IGFscGhhYmV0aWNhbGx5Ci0gICAgICAvLwotICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDApCi0gICAgICB7ICAKLSAgICAgICAgQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkKLSAgICAgICAgICB7ICAgICAgICAgCi0gICAgICAgICAgICBET01FeHRlbnNpb25JdGVtIGEgPSAoRE9NRXh0ZW5zaW9uSXRlbSlhcmcwOwotICAgICAgICAgICAgRE9NRXh0ZW5zaW9uSXRlbSBiID0gKERPTUV4dGVuc2lvbkl0ZW0pYXJnMTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gYmVnaW4gc3BlY2lhbCBjYXNlIHRvIGVuc3VyZSAndGV4dCBub2RlcycgY29tZSBsYXN0Ci0gICAgICAgICAgICBpZiAoYS5pc1RleHRWYWx1ZSgpICYmICFiLmlzVGV4dFZhbHVlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJldHVybiAxOyAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoYi5pc1RleHRWYWx1ZSgpICYmICFhLmlzVGV4dFZhbHVlKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgLy8gZW5kIHNwZWNpYWwgY2FzZQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgeyAgICAgICAgICAKLSAgICAgICAgICAgICAgcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShhLmdldE5hbWUoKSwgYi5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSAgCi0gICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBBcnJheXMuc29ydChpdGVtcywgY29tcGFyYXRvcik7Ci0gICAgICB9ICAKLSAgICAgIHJldHVybiBpdGVtczsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBBdHRyKQotICAgIHsKLSAgICAgIEF0dHIgYXR0ciA9IChBdHRyKSBpbnB1dDsKLSAgICAgIERPTUV4dGVuc2lvbkl0ZW0gaXRlbSA9IERPTUV4dGVuc2lvbkl0ZW0uY3JlYXRlSXRlbUZvckF0dHJpYnV0ZVRleHQoYXR0ci5nZXRPd25lckVsZW1lbnQoKSwgYXR0cik7Ci0gICAgICBET01FeHRlbnNpb25JdGVtW10gaXRlbXMgPSB7aXRlbX07Ci0gICAgICByZXR1cm4gaXRlbXM7Ci0gICAgfQotICAgIHJldHVybiBFTVBUWV9BUlJBWTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZShPYmplY3QgaXRlbSkKLSAgewotICAgIGlmIChpdGVtIGluc3RhbmNlb2YgRE9NRXh0ZW5zaW9uSXRlbSkKLSAgICB7Ci0gICAgICByZXR1cm4gKChET01FeHRlbnNpb25JdGVtKSBpdGVtKS5nZXROYW1lKCk7Ci0gICAgfQotICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZShPYmplY3QgaXRlbSkKLSAgewotICAgIGlmIChpdGVtIGluc3RhbmNlb2YgRE9NRXh0ZW5zaW9uSXRlbSkKLSAgICB7Ci0gICAgICByZXR1cm4gKChET01FeHRlbnNpb25JdGVtKSBpdGVtKS5nZXRWYWx1ZSgpOwotICAgIH0KLSAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRQb3NzaWJsZVZhbHVlcyhPYmplY3QgaXRlbSkKLSAgewotICAgIGlmIChpdGVtIGluc3RhbmNlb2YgRE9NRXh0ZW5zaW9uSXRlbSkKLSAgICB7Ci0gICAgICByZXR1cm4gKChET01FeHRlbnNpb25JdGVtKSBpdGVtKS5nZXRQb3NzaWJsZVZhbHVlcygpOwotICAgIH0KLSAgICByZXR1cm4gRU1QVFlfU1RSSU5HX0FSUkFZOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdFByb3BlcnR5RWRpdG9yQ29uZmlndXJhdGlvbihET01FeHRlbnNpb25JdGVtIGl0ZW0pCi0gIHsKLSAgICBTdHJpbmcgbmFtZXNwYWNlID0gaXRlbS5nZXROYW1lc3BhY2UoKTsKLSAgICBTdHJpbmcgbmFtZSA9IGl0ZW0uZ2V0TmFtZSgpOwotICAgIFN0cmluZyBwYXJlbnROYW1lID0gaXRlbS5nZXRQYXJlbnROYW1lKCk7Ci0gICAgTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG51bGw7Ci0gICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIFRPRE8gKGNzKSByZW1vdmUgcmVmZXJlbmNlIHRvIFhTREVkaXRvclBsdWdpbi4uLiBtYWtlIGdlbmVyaWMKLSAgICAgIC8vIHBlcmhhcHMgcHVzaCBkb3duIHRoZSB4bWwudWkgPwotICAgICAgLy8KLSAgICAgIE5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkoKTsKLSAgICAgIE5vZGVFZGl0b3JQcm92aWRlciBwcm92aWRlcj0gcmVnaXN0cnkuZ2V0Tm9kZUVkaXRvclByb3ZpZGVyKG5hbWVzcGFjZSk7ICAgICAgCi0gICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29uZmlndXJhdGlvbiA9IHByb3ZpZGVyLmdldE5vZGVFZGl0b3JDb25maWd1cmF0aW9uKHBhcmVudE5hbWUsIG5hbWUpOwotICAgICAgICBpZiAoY29uZmlndXJhdGlvbiAhPSBudWxsKQotICAgICAgICB7ICAKLSAgICAgICAgICBjb25maWd1cmF0aW9uLnNldFBhcmVudE5vZGUoaXRlbS5nZXRQYXJlbnROb2RlKCkpOwotICAgICAgICAgIGlmIChpdGVtLmdldE5vZGUoKSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0Tm9kZShpdGVtLmdldE5vZGUoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICB9Ci0gICAgU3RyaW5nW10gdmFsdWVzID0gaXRlbS5nZXRQb3NzaWJsZVZhbHVlcygpOwotICAgIGlmICh2YWx1ZXMgIT0gbnVsbCAmJiB2YWx1ZXMubGVuZ3RoID4gMSkKLSAgICB7Ci0gICAgICBjb25maWd1cmF0aW9uID0gbmV3IERlZmF1bHRMaXN0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24odmFsdWVzKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gTm90ZSB0aGF0IGl0IElTIGV4cGVjdGVkIHRoYXQgdGhlIGNvbmZpZ2FyYXRpb24gbWF5IGJlIG51bGwKLSAgICAvLwotICAgIGl0ZW0uc2V0UHJvcGVydHlFZGl0b3JDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uSXRlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvbkl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI1MDUyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlRyZWVDb250ZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLmNvbW1hbmRzLlVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5VcGRhdGVUZXh0VmFsdWVDb21tYW5kOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotY2xhc3MgRE9NRXh0ZW5zaW9uSXRlbSBleHRlbmRzIEV4dGVuc2lvbkl0ZW0KLXsKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEtJTkRfRUxFTUVOVF9BVFRSID0gMTsKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEtJTkRfRUxFTUVOVF9URVhUID0gMjsKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEtJTkRfRUxFTUVOVF9DTUFUVFJJQlVURSA9IDM7Ci0gIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBLSU5EX0FUVFJfVEVYVCA9IDQ7Ci0gIGludCBraW5kOwotICBBdHRyIGF0dHJpYnV0ZTsKLSAgRWxlbWVudCBwYXJlbnQ7Ci0gIENNTm9kZSBjbU5vZGU7Ci0KLSAgcHJpdmF0ZSBET01FeHRlbnNpb25JdGVtKGludCBraW5kLCBFbGVtZW50IHBhcmVudCwgQXR0ciBub2RlLCBDTU5vZGUgY21Ob2RlKQotICB7Ci0gICAgdGhpcy5raW5kID0ga2luZDsKLSAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB0aGlzLmF0dHJpYnV0ZSA9IG5vZGU7Ci0gICAgdGhpcy5jbU5vZGUgPSBjbU5vZGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzVGV4dFZhbHVlKCkKLSAgewotICAgIHJldHVybiBraW5kID09IEtJTkRfRUxFTUVOVF9URVhUIHx8IGtpbmQgPT0gS0lORF9BVFRSX1RFWFQ7Ci0gIH0KLQotICBzdGF0aWMgRE9NRXh0ZW5zaW9uSXRlbSBjcmVhdGVJdGVtRm9yRWxlbWVudFRleHQoRWxlbWVudCBwYXJlbnQpCi0gIHsKLSAgICByZXR1cm4gbmV3IERPTUV4dGVuc2lvbkl0ZW0oS0lORF9FTEVNRU5UX1RFWFQsIHBhcmVudCwgbnVsbCwgbnVsbCk7Ci0gIH0KLQotICBzdGF0aWMgRE9NRXh0ZW5zaW9uSXRlbSBjcmVhdGVJdGVtRm9yRWxlbWVudEF0dHJpYnV0ZShFbGVtZW50IHBhcmVudCwgQXR0ciBhdHRyaWJ1dGUpCi0gIHsKLSAgICByZXR1cm4gbmV3IERPTUV4dGVuc2lvbkl0ZW0oS0lORF9FTEVNRU5UX0FUVFIsIHBhcmVudCwgYXR0cmlidXRlLCBudWxsKTsKLSAgfQotCi0gIHN0YXRpYyBET01FeHRlbnNpb25JdGVtIGNyZWF0ZUl0ZW1Gb3JFbGVtZW50QXR0cmlidXRlKEVsZW1lbnQgcGFyZW50LCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKQotICB7Ci0gICAgaWYgKGFkID09IG51bGwpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJudWxsISIpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IERPTUV4dGVuc2lvbkl0ZW0oS0lORF9FTEVNRU5UX0NNQVRUUklCVVRFLCBwYXJlbnQsIG51bGwsIGFkKTsKLSAgfQotCi0gIHN0YXRpYyBET01FeHRlbnNpb25JdGVtIGNyZWF0ZUl0ZW1Gb3JBdHRyaWJ1dGVUZXh0KEVsZW1lbnQgcGFyZW50LCBBdHRyIGF0dHJpYnV0ZSkKLSAgewotICAgIHJldHVybiBuZXcgRE9NRXh0ZW5zaW9uSXRlbShLSU5EX0FUVFJfVEVYVCwgcGFyZW50LCBhdHRyaWJ1dGUsIG51bGwpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIHN3aXRjaCAoa2luZCkKLSAgICB7Ci0gICAgICBjYXNlIEtJTkRfQVRUUl9URVhUIDogewotICAgICAgICByZXN1bHQgPSAidmFsdWUiOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgS0lORF9FTEVNRU5UX0FUVFIgOiB7Ci0gICAgICAgIHJlc3VsdCA9IGF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBLSU5EX0VMRU1FTlRfQ01BVFRSSUJVVEUgOiB7Ci0gICAgICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgY21Ob2RlOwotICAgICAgICByZXN1bHQgPSBhZC5nZXROb2RlTmFtZSgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgS0lORF9FTEVNRU5UX1RFWFQgOiB7Ci0gICAgICAgIHJlc3VsdCA9ICJ0ZXh0IHZhbHVlIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6ICIiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpCi0gIHsKLSAgICBzd2l0Y2ggKGtpbmQpCi0gICAgewotICAgICAgY2FzZSBLSU5EX0FUVFJfVEVYVCA6Ci0gICAgICBjYXNlIEtJTkRfRUxFTUVOVF9BVFRSIDogewotICAgICAgICAvLyBub3RlIGludGVudGlvbmFsIGZhbGwtdGhydSEhCi0gICAgICAgIHJldHVybiBhdHRyaWJ1dGUuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICB9Ci0gICAgICBjYXNlIEtJTkRfRUxFTUVOVF9DTUFUVFJJQlVURSA6IHsKLSAgICAgICAgLy8gQ1MgOiBvbmUgd291bGQgdGhpbmsgdGhhdCB3ZSdkIGp1c3QgbmVlZCB0byByZXR1cm4gIiIgaGVyZQotICAgICAgICAvLyBidXQgYWZ0ZXIgZWRpdGluZyBhIGl0ZW0gb2YgdGhpcyBraW5kIGFuZCBnaXZpbmcgaXQgdmFsdWUKLSAgICAgICAgLy8gdGhlIGxpc3Qgb2YgaXRlbSdzIGRvZXNuJ3QgZ2V0IHJlY29tcHV0ZWQuLiBzbyB3ZSBuZWVkIHRvIHRyaWNrCi0gICAgICAgIC8vIG9uZSBvZiB0aGVzZSBpdGVtcyB0byBiZWhhdmUgbGlrZSB0aGUgS0lORF9FTEVNRU5UX0FUVFIgY2FzZQotICAgICAgICAvLwotICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXJlbnQuZ2V0QXR0cmlidXRlKGNtTm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgcmV0dXJuICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlIDogIiI7Ci0gICAgICB9Ci0gICAgICBjYXNlIEtJTkRfRUxFTUVOVF9URVhUIDogewotICAgICAgICByZXR1cm4gbmV3IFRyZWVDb250ZW50SGVscGVyKCkuZ2V0RWxlbWVudFRleHRWYWx1ZShwYXJlbnQpOyAgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgCi0KLSAgcHVibGljIFN0cmluZ1tdIGdldFBvc3NpYmxlVmFsdWVzKCkKLSAgewotICAgIFN0cmluZ1tdIHJlc3VsdCA9IHt9OwotICAgICAKLSAgICBzd2l0Y2ggKGtpbmQpCi0gICAgewotICAgICAgY2FzZSBLSU5EX0FUVFJfVEVYVCA6Ci0gICAgICBjYXNlIEtJTkRfRUxFTUVOVF9BVFRSIDogewotICAgICAgICAvLyBub3RlIGludGVudGlvbmFsIGZhbGwtdGhydSEhCi0gICAgICAgIE1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkocGFyZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgICAgIGlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpCi0gICAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgICBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkID0gbW9kZWxRdWVyeS5nZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHJpYnV0ZSk7ICAgICAgICAKLSAgICAgICAgICBpZiAoYWQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBtb2RlbFF1ZXJ5LmdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMocGFyZW50LCBhZCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBLSU5EX0VMRU1FTlRfQ01BVFRSSUJVVEUgOiB7Ci0gICAgICAgIE1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkocGFyZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgICAgIGlmIChtb2RlbFF1ZXJ5ICE9IG51bGwgJiYgY21Ob2RlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBtb2RlbFF1ZXJ5LmdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMocGFyZW50LCBjbU5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBLSU5EX0VMRU1FTlRfVEVYVCA6IHsKLSAgICAgICAgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgICAgICAgaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnQpOwotICAgICAgICAgIGlmIChlZCAhPSBudWxsKQotICAgICAgICAgIHsgCi0gICAgICAgICAgICByZXN1bHQgPSBtb2RlbFF1ZXJ5LmdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMocGFyZW50LCBlZCk7ICAgICAgICAgICAgIAotICAgICAgICAgIH0gIAotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIENvbW1hbmQgZ2V0VXBkYXRlVmFsdWVDb21tYW5kKFN0cmluZyBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoa2luZCkKLSAgICB7Ci0gICAgICBjYXNlIEtJTkRfQVRUUl9URVhUIDoKLSAgICAgIGNhc2UgS0lORF9FTEVNRU5UX0FUVFIgOiB7Ci0gICAgICAgIC8vIG5vdGUgaW50ZW50aW9uYWwgZmFsbC10aHJ1ISEgICAgICAgICAgICAgICAKLSAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVBdHRyaWJ1dGVWYWx1ZUNvbW1hbmQocGFyZW50LCBhdHRyaWJ1dGUuZ2V0Tm9kZU5hbWUoKSwgbmV3VmFsdWUsIHRydWUpOwotICAgICAgfQotICAgICAgY2FzZSBLSU5EX0VMRU1FTlRfQ01BVFRSSUJVVEUgOiB7Ci0gICAgICAgIGZpbmFsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgY21Ob2RlOwotICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZUF0dHJpYnV0ZVZhbHVlQ29tbWFuZChwYXJlbnQsIGFkLmdldEF0dHJOYW1lKCksIG5ld1ZhbHVlLCB0cnVlKTsKLSAgICAgIH0KLSAgICAgIGNhc2UgS0lORF9FTEVNRU5UX1RFWFQgOiB7Ci0gICAgICAgIHJldHVybiBuZXcgVXBkYXRlVGV4dFZhbHVlQ29tbWFuZChwYXJlbnQsIG5ld1ZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpCi0gIHsKLSAgICBTdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICBpZiAoa2luZCA9PSBLSU5EX0FUVFJfVEVYVCkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSBhdHRyaWJ1dGUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIG5hbWVzcGFjZSA9IHBhcmVudC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgfQotCi0gIHB1YmxpYyBOb2RlIGdldFBhcmVudE5vZGUoKQotICB7Ci0gICAgTm9kZSBwYXJlbnROb2RlID0gbnVsbDsKLSAgICBpZiAoYXR0cmlidXRlICE9IG51bGwpCi0gICAgewotICAgICAgcGFyZW50Tm9kZSA9IGF0dHJpYnV0ZS5nZXRPd25lckVsZW1lbnQoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgewotICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudDsKLSAgICB9Ci0gICAgcmV0dXJuIHBhcmVudE5vZGU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudE5hbWUoKQotICB7Ci0gICAgTm9kZSBwYXJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZSgpOwotICAgIHJldHVybiBwYXJlbnROb2RlICE9IG51bGwgPyBwYXJlbnROb2RlLmdldExvY2FsTmFtZSgpIDogIiI7Ci0gIH0KLQotICBwdWJsaWMgTm9kZSBnZXROb2RlKCkKLSAgewotICAgIHJldHVybiBhdHRyaWJ1dGU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25JdGVtRWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25JdGVtRWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFjNzBlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uSXRlbUVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBET01FeHRlbnNpb25JdGVtRWRpdE1hbmFnZXIgaW1wbGVtZW50cyBFeHRlbnNpb25JdGVtRWRpdE1hbmFnZXIKLXsKLSAgcHVibGljIHZvaWQgaGFuZGxlRWRpdChPYmplY3QgaXRlbSwgV2lkZ2V0IHdpZGdldCkKLSAgeyAgIAotICB9Ci0KLSAgcHVibGljIENvbnRyb2wgY3JlYXRlQ3VzdG9tQnV0dG9uQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlLCBPYmplY3QgaXRlbSkKLSAgewotICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGJ1dHRvbi5zZXRUZXh0KCIuLi4iKTsgLy8kTk9OLU5MUy0xJAotICAgIHJldHVybiBidXR0b247Ci0gIH0KLQotICBwdWJsaWMgQ29udHJvbCBjcmVhdGVDdXN0b21UZXh0Q29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlLCBPYmplY3QgaXRlbSkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRCdXR0b25Db250cm9sU3R5bGUoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBFeHRlbnNpb25JdGVtRWRpdE1hbmFnZXIuU1RZTEVfTk9ORTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dENvbnRyb2xTdHlsZShPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIEV4dGVuc2lvbkl0ZW1FZGl0TWFuYWdlci5TVFlMRV9OT05FOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uSXRlbU1lbnVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvbkl0ZW1NZW51TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMzMGM5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uSXRlbU1lbnVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5YTUxOb2RlQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBET01FeHRlbnNpb25JdGVtTWVudUxpc3RlbmVyIGltcGxlbWVudHMgSU1lbnVMaXN0ZW5lcgotewotICBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLSAgcHVibGljIERPTUV4dGVuc2lvbkl0ZW1NZW51TGlzdGVuZXIoVHJlZVZpZXdlciB0cmVlVmlld2VyKQotICB7Ci0gICAgdGhpcy50cmVlVmlld2VyID0gdHJlZVZpZXdlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikKLSAgewotICAgIG1hbmFnZXIucmVtb3ZlQWxsKCk7Ci0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICBpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIEVsZW1lbnRJbXBsKQotICAgICAgewotICAgICAgICBFbGVtZW50SW1wbCBlbGVtZW50SW1wbCA9IChFbGVtZW50SW1wbCkgc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgSURPTURvY3VtZW50IGRvbURvY3VtZW50ID0gKElET01Eb2N1bWVudCkgZWxlbWVudEltcGwuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgICBJbnRlcm5hbE5vZGVBY3Rpb25NYW5hZ2VyIGFjdGlvbk1hbmFnZXIgPSBuZXcgSW50ZXJuYWxOb2RlQWN0aW9uTWFuYWdlcihkb21Eb2N1bWVudC5nZXRNb2RlbCgpLCB0cmVlVmlld2VyKTsKLSAgICAgICAgYWN0aW9uTWFuYWdlci5maWxsQ29udGV4dE1lbnUobWFuYWdlciwgc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAKLSAgY2xhc3MgSW50ZXJuYWxOb2RlQWN0aW9uTWFuYWdlciBleHRlbmRzIFhNTE5vZGVBY3Rpb25NYW5hZ2VyCi0gIHsKLSAgICBwdWJsaWMgSW50ZXJuYWxOb2RlQWN0aW9uTWFuYWdlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBWaWV3ZXIgdmlld2VyKQotICAgIHsKLSAgICAgIHN1cGVyKG1vZGVsLCB2aWV3ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBMaXN0IHNlbGVjdGlvbikKLSAgICB7Ci0gICAgICAvL21lbnUuYWRkKG5ldyBBY3Rpb24oInRoZXJlIil7fSk7ICAgICAKLSAgICAgIHRyeQotICAgICAgewotICAgICAgaW50IGVkaXRNb2RlID0gbW9kZWxRdWVyeS5nZXRFZGl0TW9kZSgpOwotICAgICAgaW50IGljID0gTW9kZWxRdWVyeS5JTkNMVURFX0NISUxEX05PREVTOwotICAgICAgaW50IHZjID0gKGVkaXRNb2RlID09IE1vZGVsUXVlcnkuRURJVF9NT0RFX0NPTlNUUkFJTkVEX1NUUklDVCkgPyBNb2RlbFF1ZXJ5LlZBTElESVRZX1NUUklDVCA6IE1vZGVsUXVlcnkuVkFMSURJVFlfTk9ORTsKLSAgICAgIExpc3QgaW1wbGljaXRseVNlbGVjdGVkTm9kZUxpc3QgPSBudWxsOwotCi0gICAgICBpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKQotICAgICAgewotICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgc2VsZWN0aW9uLmdldCgwKTsKLSAgICAgICAgLy8gY29udHJpYnV0ZSBhZGQgY2hpbGQgYWN0aW9ucwotICAgICAgICBjb250cmlidXRlQWRkQ2hpbGRBY3Rpb25zKG1lbnUsIG5vZGUsIGljLCB2Yyk7Ci0gICAgICB9Ci0gICAgICBpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGltcGxpY2l0bHlTZWxlY3RlZE5vZGVMaXN0ID0gZ2V0U2VsZWN0ZWROb2RlcyhzZWxlY3Rpb24sIHRydWUpOwotICAgICAgICAvLyBjb250cmlidXRlIGRlbGV0ZSBhY3Rpb25zCi0gICAgICAgIGNvbnRyaWJ1dGVEZWxldGVBY3Rpb25zKG1lbnUsIGltcGxpY2l0bHlTZWxlY3RlZE5vZGVMaXN0LCBpYywgdmMpOwotICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIG1lbnUuYWRkKG5ldyBBY3Rpb24oZS5nZXRNZXNzYWdlKCkpe30pOwotICAgICAgfQotICAgICAgLyoKLSAgICAgIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgLy8gY29udHJpYnV0ZSByZXBsYWNlIGFjdGlvbnMKLSAgICAgICAgY29udHJpYnV0ZVJlcGxhY2VBY3Rpb25zKG1lbnUsIGltcGxpY2l0bHlTZWxlY3RlZE5vZGVMaXN0LCBpYywgdmMpOwotICAgICAgfSovCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZUFkZENoaWxkQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgTm9kZSBub2RlLCBpbnQgaWMsIGludCB2YykKLSAgICB7Ci0gICAgICBpbnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0gICAgICBpZiAobm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0gICAgICAgIC8vICdBZGQgQ2hpbGQuLi4nIGFuZCAnQWRkIEF0dHJpYnV0ZS4uLicgYWN0aW9ucwotICAgICAgICAvLwotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLSAgICAgICAgTXlNZW51TWFuYWdlciBuZXdNZW51ID0gbmV3IE15TWVudU1hbmFnZXIoIk5ldyIpewotICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsgcmV0dXJuIHRydWU7IH0gICAgICAgICAgCi0gICAgICAgIH07Ly8kTk9OLU5MUy0xJAotICAgICAgICBuZXdNZW51LnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIG1lbnUuYWRkKG5ld01lbnUpOwotICAgICAgICAKLSAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgICAgICBpZiAoZWQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIExpc3QgbW9kZWxRdWVyeUFjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgLy8gYWRkIGluc2VydCBjaGlsZCBub2RlIGFjdGlvbnMKLSAgICAgICAgICAvLwotICAgICAgICAgIG1vZGVsUXVlcnlBY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgIG1vZGVsUXVlcnkuZ2V0SW5zZXJ0QWN0aW9ucyhlbGVtZW50LCBlZCwgLTEsIGljLCB2YywgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotICAgICAgICAgIGFkZEFjdGlvbkhlbHBlcihuZXdNZW51LCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRE9NRXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzkwMjkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBET01FeHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIsIElOb2RlQWRhcHRlcgotewotICBwcm90ZWN0ZWQgU3RyaW5nIGZhY2V0OwotICBwcm90ZWN0ZWQgVmlld2VyIHZpZXdlcjsKLSAgCi0gIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkKLSAgewotICAgIHRoaXMudmlld2VyID0gdmlld2VyOwotICB9Ci0gICAgCi0gIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkKLSAgewotICAgIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudClwYXJlbnRFbGVtZW50OyAgICAgICAgCi0gICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGZvciAoTm9kZSBub2RlID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKG5vZGUpOwotICAgICAgICB9ICAKLSAgICAgIH0gIAotICAgICAgcmV0dXJuIGxpc3QudG9BcnJheSgpOyAgICAgIAotICAgIH0KLSAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC50b0FycmF5KCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihlbGVtZW50KTsKLSAgICByZXR1cm4gY2hpbGRyZW4ubGVuZ3RoID4gMDsKLSAgfQotICAKLSAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0W10gZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCBpbnB1dEVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykKLSAgewotICAgIGlmICh2aWV3ZXIgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIHZpZXdlci5yZWZyZXNoKCk7Ci0gICAgfSAgCi0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpCi0gIHsKLSAgICAvLyB0aGlzIG1ldGhvZCBpcyBub3QgdXNlZAotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9ET01FeHRlbnNpb25UcmVlTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvblRyZWVMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNzM1NDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0RPTUV4dGVuc2lvblRyZWVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tLk5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1wdWJsaWMgY2xhc3MgRE9NRXh0ZW5zaW9uVHJlZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW1hZ2UgREVGQVVMVF9FTEVNRU5UX0lDT04gPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTREVsZW1lbnQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbWFnZSBERUZBVUxUX0FUVFJfSUNPTiA9IFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEQXR0cmlidXRlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgCi0gIHB1YmxpYyBET01FeHRlbnNpb25UcmVlTGFiZWxQcm92aWRlcigpCi0gIHsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkKLSAgewotICAgIE5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE5vZGVDdXN0b21pemF0aW9uUmVnaXN0cnkoKTsKLSAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgewotICAgICAgRWxlbWVudCBkb21FbGVtZW50ID0gKEVsZW1lbnQpIGVsZW1lbnQ7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZG9tRWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBJTGFiZWxQcm92aWRlciBscCA9IHJlZ2lzdHJ5LmdldExhYmVsUHJvdmlkZXIobmFtZXNwYWNlKTsKLSAgICAgICAgaWYgKGxwICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJbWFnZSBpbWcgPSBscC5nZXRJbWFnZShkb21FbGVtZW50KTsKLSAgICAgICAgICBpZiAoaW1nICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gaW1nOwotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICAgIHJldHVybiBERUZBVUxUX0VMRU1FTlRfSUNPTjsKLSAgICB9Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBdHRyKQotICAgIHJldHVybiBERUZBVUxUX0FUVFJfSUNPTjsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgaW5wdXQpCi0gIHsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgIHsKLSAgICAgIEVsZW1lbnQgZG9tRWxlbWVudCA9IChFbGVtZW50KSBpbnB1dDsKLSAgICAgIFN0cmluZyB0ZXh0VmFsID0gIiI7Ci0KLSAgICAgIGlmIChkb21FbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gZG9tRWxlbWVudC5nZXRDaGlsZE5vZGVzKCkuaXRlbSgwKTsKLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBUZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgVGV4dCB0ZXh0Tm9kZSA9IChUZXh0KSBub2RlOwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghdGV4dE5vZGUuZ2V0Tm9kZVZhbHVlKCkuY29udGFpbnMoIlxuIikpCi0gICAgICAgICAgICAgIHRleHRWYWwgPSAiIFsiICsgdGV4dE5vZGUuZ2V0Tm9kZVZhbHVlKCkgKyAiXSI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChET01FeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0ZXh0VmFsID0gIiI7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZG9tRWxlbWVudC5nZXRMb2NhbE5hbWUoKSArIHRleHRWYWw7Ci0gICAgfQotICAgIGlmICggaW5wdXQgaW5zdGFuY2VvZiBBdHRyKXsKLSAgICAgIHJldHVybiAoKEF0dHIpIGlucHV0KS5nZXRMb2NhbE5hbWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25EZXRhaWxzQ29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uRGV0YWlsc0NvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2ZhYWMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25EZXRhaWxzQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotcHVibGljIGludGVyZmFjZSBFeHRlbnNpb25EZXRhaWxzQ29udGVudFByb3ZpZGVyCi17Ci0gIE9iamVjdFtdIGdldEl0ZW1zKE9iamVjdCBpbnB1dCk7Ci0gIFN0cmluZyBnZXROYW1lKE9iamVjdCBpdGVtKTsKLSAgU3RyaW5nIGdldFZhbHVlKE9iamVjdCBpdGVtKTsKLSAgU3RyaW5nW10gZ2V0UG9zc2libGVWYWx1ZXMoT2JqZWN0IGl0ZW0pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbkRldGFpbHNWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25EZXRhaWxzVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNjQxYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbkRldGFpbHNWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b20uRGlhbG9nTm9kZUVkaXRvckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbS5MaXN0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbS5Ob2RlRWRpdG9yQ29uZmlndXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEV4dGVuc2lvbkRldGFpbHNWaWV3ZXIgZXh0ZW5kcyBWaWV3ZXIKLXsKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIElURU1fREFUQSA9ICJJVEVNX0RBVEEiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBFRElUT1JfQ09ORklHVVJBVElPTl9EQVRBID0gIkVESVRPUl9DT05GSUdVUkFUSU9OX0RBVEEiOyAvLyROT04tTkxTLTEkCi0gIAotICBDb21wb3NpdGUgY29udHJvbDsgIAotICBDb21wb3NpdGUgY29tcG9zaXRlOwotICBFeHRlbnNpb25EZXRhaWxzQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLSAgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeTsgIAotICBJbnRlcm5hbENvbnRyb2xMaXN0ZW5lciBpbnRlcm5hbENvbnRyb2xMaXN0ZW5lcjsKLSAgQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjazsKLSAgCi0gIHB1YmxpYyBFeHRlbnNpb25EZXRhaWxzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpCi0gIHsKLSAgICB0aGlzLndpZGdldEZhY3RvcnkgPSB3aWRnZXRGYWN0b3J5OyAgICAKLSAgICBjb250cm9sID0gIHdpZGdldEZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0gICAgaW50ZXJuYWxDb250cm9sTGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxDb250cm9sTGlzdGVuZXIoKTsKLSAgICBjb250cm9sLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsgICAgCi0gIH0KLSAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q29tbWFuZFN0YWNrKENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2spCi0gIHsKLSAgICB0aGlzLmNvbW1hbmRTdGFjayA9IGNvbW1hbmRTdGFjazsKLSAgfQotICAKLSAgcHVibGljIE9iamVjdCBnZXRJbnB1dCgpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgICBDb250cm9sW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBDb250cm9sIGNvbnRyb2wgPSBjaGlsZHJlbltpXTsKLSAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGV4dCkKLSAgICAgIHsKLSAgICAgICAgIEV4dGVuc2lvbkl0ZW0gaXRlbSA9IChFeHRlbnNpb25JdGVtKWNvbnRyb2wuZ2V0RGF0YShJVEVNX0RBVEEpOwotICAgICAgICAgU3RyaW5nIHZhbHVlID0gY29udGVudFByb3ZpZGVyLmdldFZhbHVlKGl0ZW0pOyAgICAgICAgCi0gICAgICAgICgoVGV4dCljb250cm9sKS5zZXRUZXh0KHZhbHVlKTsgCi0gICAgICB9ICAKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY3JlYXRlVGV4dE9yQ29tYm9Db250cm9sKEV4dGVuc2lvbkl0ZW0gaXRlbSwgQ29tcG9zaXRlIGNvbXBvc2l0ZSkKLSAgewotICAgIENvbnRyb2wgY29udHJvbCA9IG51bGw7Ci0gICAgU3RyaW5nIHZhbHVlID0gY29udGVudFByb3ZpZGVyLmdldFZhbHVlKGl0ZW0pOwotICAgIE5vZGVFZGl0b3JDb25maWd1cmF0aW9uIGVkaXRvckNvbmZpZ3VyYXRpb24gPSBpdGVtLmdldFByb3BlcnR5RWRpdG9yQ29uZmlndXJhdGlvbigpOwotCi0gICAgaWYgKGVkaXRvckNvbmZpZ3VyYXRpb24gIT0gbnVsbCAmJiBoYXNTdHlsZShlZGl0b3JDb25maWd1cmF0aW9uLCBOb2RlRWRpdG9yQ29uZmlndXJhdGlvbi5TVFlMRV9DT01CTykpCi0gICAgeyAgICAgICAgICAKLSAgICAgIExpc3ROb2RlRWRpdG9yQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gKExpc3ROb2RlRWRpdG9yQ29uZmlndXJhdGlvbillZGl0b3JDb25maWd1cmF0aW9uOwotICAgICAgQ0NvbWJvIGNvbWJvID0gd2lkZ2V0RmFjdG9yeS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsKLSAgICAgIGNvbWJvLnNldFRleHQodmFsdWUpOwotICAgICAgT2JqZWN0W10gdmFsdWVzID0gY29uZmlndXJhdGlvbi5nZXRWYWx1ZXMoaXRlbSk7Ci0gICAgICBMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBjb25maWd1cmF0aW9uLmdldExhYmVsUHJvdmlkZXIoKTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdmFsdWVzLmxlbmd0aDsgaisrKQotICAgICAgeyAgICAgICAgICAgIAotICAgICAgICBPYmplY3QgbyA9IHZhbHVlc1tqXTsKLSAgICAgICAgU3RyaW5nIGRpc3BsYXlOYW1lID0gbGFiZWxQcm92aWRlciAhPSBudWxsID8KLSAgICAgICAgICAgIGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChvKSA6Ci0gICAgICAgICAgICAgIG8udG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGNvbWJvLmFkZChkaXNwbGF5TmFtZSk7Ci0gICAgICB9Ci0gICAgICBjb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihpbnRlcm5hbENvbnRyb2xMaXN0ZW5lcik7Ci0gICAgICBjb250cm9sID0gY29tYm87Ci0gICAgfQotICAgIGlmIChjb250cm9sID09IG51bGwpCi0gICAgewotICAgICAgVGV4dCB0ZXh0ID0gd2lkZ2V0RmFjdG9yeS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSx2YWx1ZSk7Ci0gICAgICB0ZXh0LmFkZEtleUxpc3RlbmVyKGludGVybmFsQ29udHJvbExpc3RlbmVyKTsKLSAgICAgIGNvbnRyb2wgPSB0ZXh0OyAKLSAgICB9IAotICAgIGNvbnRyb2wuc2V0RGF0YShJVEVNX0RBVEEsIGl0ZW0pOwotICAgIGNvbnRyb2wuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgY29udHJvbC5hZGRGb2N1c0xpc3RlbmVyKGludGVybmFsQ29udHJvbExpc3RlbmVyKTsgICAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUJ1dHRvbkNvbnRyb2woRXh0ZW5zaW9uSXRlbSBpdGVtLCBDb21wb3NpdGUgY29tcG9zaXRlKQotICB7Ci0gICAgTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gZWRpdG9yQ29uZmlndXJhdGlvbiA9IGl0ZW0uZ2V0UHJvcGVydHlFZGl0b3JDb25maWd1cmF0aW9uKCk7Ci0gICAgaWYgKGVkaXRvckNvbmZpZ3VyYXRpb24gIT0gbnVsbCAmJiBoYXNTdHlsZShlZGl0b3JDb25maWd1cmF0aW9uLCBOb2RlRWRpdG9yQ29uZmlndXJhdGlvbi5TVFlMRV9ESUFMT0cpKQotICAgIHsgICAgCi0gICAgICBEaWFsb2dOb2RlRWRpdG9yQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gKERpYWxvZ05vZGVFZGl0b3JDb25maWd1cmF0aW9uKWVkaXRvckNvbmZpZ3VyYXRpb247ICAgICAgICAgICAgCi0gICAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgICBncmlkRGF0YS5oZWlnaHRIaW50ID0gMTc7Ci0gICAgICBidXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICBidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoaW50ZXJuYWxDb250cm9sTGlzdGVuZXIpOwotICAgICAgYnV0dG9uLnNldERhdGEoSVRFTV9EQVRBLCBpdGVtKTsKLSAgICAgIGJ1dHRvbi5zZXREYXRhKEVESVRPUl9DT05GSUdVUkFUSU9OX0RBVEEsIGNvbmZpZ3VyYXRpb24pOwotICAgICAgU3RyaW5nIHRleHQgPSBjb25maWd1cmF0aW9uLmdldEJ1dG9uVGV4dCgpOwotICAgICAgaWYgKHRleHQgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBidXR0b24uc2V0VGV4dCh0ZXh0KTsgLy8kTk9OLU5MUy0xJAotICAgICAgfSAgCi0gICAgICBidXR0b24uc2V0SW1hZ2UoY29uZmlndXJhdGlvbi5nZXRCdXR0b25JbWFnZSgpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIENvbnRyb2wgcGxhY2VIb2xkZXIgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICBwbGFjZUhvbGRlci5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgIHBsYWNlSG9sZGVyLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgcGxhY2VIb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7IAotICAgIH0gICAgICAKLSAgfSAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBpbnB1dCkKLSAgeyAKLSAgICAvLyBUT0RPIChjcykgYWRkIGFzc2VydGlvbnMKLSAgICAvLwotICAgIGlmIChjb250ZW50UHJvdmlkZXIgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICAKLSAgICBpZiAoY29tcG9zaXRlICE9IG51bGwpCi0gICAgey8qCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb250cm9sc1RoYXRXZUFyZUxpc3RlbmluZ1RvLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIENvbnRyb2wgY29udHJvbCA9IChDb250cm9sKWkubmV4dCgpOyAgICAgICAKLSAgICAgICAgaWYgKGNvbnRyb2wgIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgY29udHJvbC5yZW1vdmVGb2N1c0xpc3RlbmVyKGludGVybmFsRm9jdXNMaXN0ZW5lcik7Ci0gICAgICAgIH0gIAotICAgICAgfSAqLyAKLSAgICAgIHJlbW92ZUxpc3RlbmVycygpOwotICAgICAgY29tcG9zaXRlLmRpc3Bvc2UoKTsgICAgICAgCi0gICAgfSAgIAotCi0gICAgY29tcG9zaXRlID0gd2lkZ2V0RmFjdG9yeS5jcmVhdGVDb21wb3NpdGUoY29udHJvbCk7Ci0gICAgY29tcG9zaXRlLnNldEJhY2tncm91bmQoQ29sb3JDb25zdGFudHMud2hpdGUpOwotICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgIE9iamVjdFtdIGl0ZW1zID0gY29udGVudFByb3ZpZGVyLmdldEl0ZW1zKGlucHV0KTsgICAgICAKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgRXh0ZW5zaW9uSXRlbSBpdGVtID0gKEV4dGVuc2lvbkl0ZW0paXRlbXNbaV07Ci0gICAgICBTdHJpbmcgbmFtZSA9IGNvbnRlbnRQcm92aWRlci5nZXROYW1lKGl0ZW0pOwotICAgICAgTGFiZWwgbGFiZWwgPSB3aWRnZXRGYWN0b3J5LmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgbmFtZSArICI6Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotICAgICAgY3JlYXRlVGV4dE9yQ29tYm9Db250cm9sKGl0ZW0sIGNvbXBvc2l0ZSk7Ci0gICAgICBjcmVhdGVCdXR0b25Db250cm9sKGl0ZW0sIGNvbXBvc2l0ZSk7Ci0gICAgfSAgCi0gICAgY29udHJvbC5sYXlvdXQodHJ1ZSk7ICAgIAotICB9Ci0gICAgCi0gIHByaXZhdGUgYm9vbGVhbiBoYXNTdHlsZShOb2RlRWRpdG9yQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBpbnQgc3R5bGUpCi0gIHsKLSAgICByZXR1cm4gKGNvbmZpZ3VyYXRpb24uZ2V0U3R5bGUoKSAmIHN0eWxlKSAhPSAwOwotICB9Ci0gIAotICAKLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIHJldmVhbCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAKLSAgfQotICBwdWJsaWMgRXh0ZW5zaW9uRGV0YWlsc0NvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRlbnRQcm92aWRlcjsKLSAgfQotICBwdWJsaWMgdm9pZCBzZXRDb250ZW50UHJvdmlkZXIoRXh0ZW5zaW9uRGV0YWlsc0NvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIpCi0gIHsKLSAgICB0aGlzLmNvbnRlbnRQcm92aWRlciA9IGNvbnRlbnRQcm92aWRlcjsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGFwcGx5RWRpdChFeHRlbnNpb25JdGVtIGl0ZW0sIFdpZGdldCB3aWRnZXQpCi0gIHsKLSAgICBpZiAoaXRlbSAhPSBudWxsKQotICAgIHsgICAgCi0gICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOwotICAgICAgaWYgKHdpZGdldCBpbnN0YW5jZW9mIFRleHQpCi0gICAgICB7Ci0gICAgICAgIFRleHQgdGV4dCA9IChUZXh0KXdpZGdldDsKLSAgICAgICAgdmFsdWUgPSB0ZXh0LmdldFRleHQoKTsgICAgCi0gICAgICB9Ci0gICAgICBlbHNlIGlmICh3aWRnZXQgaW5zdGFuY2VvZiBDQ29tYm8pCi0gICAgICB7Ci0gICAgICAgIENDb21ibyBjb21ibyA9IChDQ29tYm8pd2lkZ2V0OwotICAgICAgICBpbnQgaW5kZXggPSBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICAgIHsgIAotICAgICAgICAgIHZhbHVlID0gY29tYm8uZ2V0SXRlbShpbmRleCk7Ci0gICAgICAgIH0gIAotICAgICAgfSAgICAgICAKLSAgICAgIGlmICh2YWx1ZSAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIENvbW1hbmQgY29tbWFuZCA9IGl0ZW0uZ2V0VXBkYXRlVmFsdWVDb21tYW5kKHZhbHVlKTsKLSAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChjb21tYW5kU3RhY2sgIT0gbnVsbCkKLSAgICAgICAgICAgIGNvbW1hbmRTdGFjay5leGVjdXRlKGNvbW1hbmQpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZSgpOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAKLSAgICB9ICAgICAgICAgICAgICAKLSAgfQotICAKLSAgY2xhc3MgSW50ZXJuYWxDb250cm9sTGlzdGVuZXIgaW1wbGVtZW50cyBGb2N1c0xpc3RlbmVyLCBTZWxlY3Rpb25MaXN0ZW5lciwgS2V5TGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgLy8gZm9yIGJ1dHRvbiBjb250cm9scyB3ZSBoYW5kbGUgc2VsZWN0aW9uIGV2ZW50cwotICAgICAgLy8gICAgICAgIAotICAgICAgT2JqZWN0IGl0ZW0gPSBlLndpZGdldC5nZXREYXRhKEVESVRPUl9DT05GSUdVUkFUSU9OX0RBVEEpOwotICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkKLSAgICAgICAgaXRlbSA9IGUud2lkZ2V0LmdldERhdGEoSVRFTV9EQVRBKTsgICAgCi0gICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIERpYWxvZ05vZGVFZGl0b3JDb25maWd1cmF0aW9uKQotICAgICAgewotICAgICAgICBEaWFsb2dOb2RlRWRpdG9yQ29uZmlndXJhdGlvbiBkaWFsb2dOb2RlRWRpdG9yQ29uZmlndXJhdGlvbiA9IChEaWFsb2dOb2RlRWRpdG9yQ29uZmlndXJhdGlvbilpdGVtOyAgICAgICAgCi0gICAgICAgIGRpYWxvZ05vZGVFZGl0b3JDb25maWd1cmF0aW9uLmludm9rZURpYWxvZygpOyAgICAgICAgICAgICAgIAotICAgICAgfQotICAgICAgZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4dGVuc2lvbkl0ZW0pCi0gICAgICB7Ci0gICAgICAgIGFwcGx5RWRpdCgoRXh0ZW5zaW9uSXRlbSlpdGVtLCBlLndpZGdldCk7Ci0gICAgICB9ICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIC8vIGRvIG5vdGhpbmcgICAgICAKLSAgICB9IAotICAgIAotICAgIHB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkKLSAgICB7Ci0gICAgfSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKQotICAgIHsKLSAgICAgIC8vIGFwcGx5IGVkaXRzIGZvciB0ZXh0IGFuZCBjb21ibyBib3ggY29udHJvbHMKLSAgICAgIC8vIHZpYSB0aGUgZm9jdXNMb3N0IGV2ZW50Ci0gICAgICBPYmplY3QgaXRlbSA9IGUud2lkZ2V0LmdldERhdGEoSVRFTV9EQVRBKTsKLSAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgRXh0ZW5zaW9uSXRlbSkKLSAgICAgIHsKLSAgICAgICAgYXBwbHlFZGl0KChFeHRlbnNpb25JdGVtKWl0ZW0sIGUud2lkZ2V0KTsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpCi0gICAgewotICAgICAgLy8gaGFuZGxlIGV4cGxpY3QgRU5URVIga2V5Ci0gICAgICBPYmplY3QgaXRlbSA9IGUud2lkZ2V0LmdldERhdGEoSVRFTV9EQVRBKTsKLSAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgRXh0ZW5zaW9uSXRlbSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGUuY2hhcmFjdGVyID09IFNXVC5DUikKLSAgICAgICAgICBhcHBseUVkaXQoKEV4dGVuc2lvbkl0ZW0paXRlbSwgZS53aWRnZXQpOwotICAgICAgfSAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpCi0gICAgewotICAgICAgLy8gSWdub3JlIHRoZXNlIGV2ZW50cwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXJzKCkKLSAgewotICAgIGlmIChjb21wb3NpdGUgIT0gbnVsbCAmJiAhY29tcG9zaXRlLmlzRGlzcG9zZWQoKSkKLSAgICB7Ci0gICAgICBDb250cm9sIFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0gICAgICBpbnQgbGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQ29udHJvbCBvID0gY2hpbGRyZW5baV07Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgQ0NvbWJvKQotICAgICAgICB7Ci0gICAgICAgICAgKChDQ29tYm8pbykucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoaW50ZXJuYWxDb250cm9sTGlzdGVuZXIpOwotICAgICAgICAgIG8ucmVtb3ZlRm9jdXNMaXN0ZW5lcihpbnRlcm5hbENvbnRyb2xMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIFRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAoKFRleHQpbykucmVtb3ZlS2V5TGlzdGVuZXIoaW50ZXJuYWxDb250cm9sTGlzdGVuZXIpOwotICAgICAgICAgIG8ucmVtb3ZlRm9jdXNMaXN0ZW5lcihpbnRlcm5hbENvbnRyb2xMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25JdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjY3ODA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25JdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b20uTm9kZUVkaXRvckNvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHRlbnNpb25JdGVtCi17Ci0gIE5vZGVFZGl0b3JDb25maWd1cmF0aW9uIHByb3BlcnR5RWRpdG9yQ29uZmlndXJhdGlvbjsKLQotICBwdWJsaWMgTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gZ2V0UHJvcGVydHlFZGl0b3JDb25maWd1cmF0aW9uKCkKLSAgewotICAgIHJldHVybiBwcm9wZXJ0eUVkaXRvckNvbmZpZ3VyYXRpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eUVkaXRvckNvbmZpZ3VyYXRpb24oTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gcHJvcGVydHlFZGl0b3JDb25maWd1cmF0aW9uKQotICB7Ci0gICAgdGhpcy5wcm9wZXJ0eUVkaXRvckNvbmZpZ3VyYXRpb24gPSBwcm9wZXJ0eUVkaXRvckNvbmZpZ3VyYXRpb247Ci0gIH0gIAotICAKLSAgcHVibGljIGFic3RyYWN0IENvbW1hbmQgZ2V0VXBkYXRlVmFsdWVDb21tYW5kKFN0cmluZyBuZXdWYWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uSXRlbUVkaXRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vRXh0ZW5zaW9uSXRlbUVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NGFkMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbkl0ZW1FZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0gCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKi8gCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuc2lvbkl0ZW1FZGl0TWFuYWdlcgoteyAgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUWUxFX05PTkUgPSAibm9uZSI7ICAgLy8kTk9OLU5MUy0xJCAgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUWUxFX1RFWFQgPSAidGV4dCI7IC8vJE5PTi1OTFMtMSQgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVFlMRV9DT01CTyA9ICJjb21ibyI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RZTEVfQ1VTVE9NID0gImN1c3RvbSI7ICAgICAvLyROT04tTkxTLTEkCi0gIAotICB2b2lkIGhhbmRsZUVkaXQoT2JqZWN0IGl0ZW0sIFdpZGdldCB3aWRnZXQpOwotICBTdHJpbmcgZ2V0VGV4dENvbnRyb2xTdHlsZShPYmplY3QgaXRlbSk7Ci0gIFN0cmluZyBnZXRCdXR0b25Db250cm9sU3R5bGUoT2JqZWN0IGl0ZW0pOwotICBDb250cm9sIGNyZWF0ZUN1c3RvbVRleHRDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUsIE9iamVjdCBpdGVtKTsKLSAgQ29udHJvbCBjcmVhdGVDdXN0b21CdXR0b25Db250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUsIE9iamVjdCBpdGVtKTsgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbkl0ZW1GaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25JdGVtRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOTljMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbkl0ZW1GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotCi0vLyBjczogVGhpcyBpbnRlcmZhY2UgaXMgaW50ZW5kZWQgdG8gc3VwcGxpbWVudCB0aGUgTm9kZUZpbHRlciBjbGFzcwotLy8gdGhhdCBjYW4gYmUgc3BlY2lmaWVkIHZpYSB0aGUgY3VzdG9taXphdGlvbiBleHRlbnNpb25zIHBvaW50LgotLy8gV2hlbiB0aGUgaW5pdGlhbCBsaXN0IG9mIGEgY2F0ZWdvcnkncyBvYmplY3RzIGlzIGRpc3BsYXllZCAKLS8vIHdlJ2xsIHVzZSBhIE5vZGVGaWx0ZXIgdG8gcHJ1bmUgdGhlIGxpc3QuICBJZiB0aGUgTm9kZUZpbHRlcgotLy8gaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSB3ZSdsbCBjYWxsIHRoaXMgaW50ZXJmYWNlJ3MgaXNBcHBsaWNhYmxlQ29udGV4dAotLy8gbWV0aG9kIGluc3RlYWQgb2YgdGhlIE5vZGVGaWx0ZXIncyBET00gbm9kZSBiYXNlZCBtZXRob2QuICBUaGlzIHByb3ZpZGVzIAotLy8gYXJlIGEgbW9yZSBjb252ZW5pZW50IGludGVyZmFjZSBmb3IgY2xpZW50cyB3aG8gYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiAKLS8vIGZpbHRlciB0aGUgbGlzdCBwcmVzZW50ZWQgdmlhIHRoZSBBZGRFeHRlbnNpb25Db21wb25lbnREaWFsb2cuCi0vLyBTZWUgdGhlIGNsYXNzIEV4dGVuc2lvbnNTZWN0aW9uIGZvciBtb3JlIGRldGFpbHMuCi0vLwotcHVibGljIGludGVyZmFjZSBFeHRlbnNpb25JdGVtRmlsdGVyCi17Ci0gIHB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZUNvbnRleHQoWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50LCBYU0RDb25jcmV0ZUNvbXBvbmVudCBjYW5kaWRhdGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9FeHRlbnNpb25zU2NoZW1hc1JlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzNhZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL0V4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5FeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5jb21tYW5kcy5FeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEV4dGVuc2lvbnNTY2hlbWFzUmVnaXN0cnkKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9BRERFRF9FWFRfU0NIRU1BUyA9ICJVU0VSLUFEREVELUVYVC1TQ0hFTUFTIjsgIC8vIFRPRE8gZXh0ZXJuYWxpemUKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OX1BSRUZJWCA9ICJwbGF0Zm9ybTovcGx1Z2luLyI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU1BMQVlOQU1FID0gImRpc3BsYXlOYW1lIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VVUkkgPSAibmFtZXNwYWNlVVJJIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RGSUxFVVJMID0gInhzZEZpbGVVUkwiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMUFJPVklERVIgPSAibGFiZWxQcm92aWRlckNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfQ09NTUFORF9DTEFTUyA9ICJhZGRDb21tYW5kQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9DT01NQU5EX0NMQVNTID0gImRlbGV0ZUNvbW1hbmRDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfUFJPVklERVJfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0gIAotICBwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZXh0ZW5zaW9uSWQ7Ci0KLSAgcHJvdGVjdGVkIEFycmF5TGlzdCBuc1VSSVByb3BlcnRpZXMsIGNhdGVnb3J5UHJvdmlkZXJMaXN0OwotICBwcml2YXRlIFN0cmluZyBkZXByZWNhdGVkRXh0ZW5zaW9uSWQ7Ci0gIAotICBwdWJsaWMgRXh0ZW5zaW9uc1NjaGVtYXNSZWdpc3RyeShTdHJpbmcgYXBwaW5mb19leHRlbnNpb25pZCkKLSAgewotICAgIGV4dGVuc2lvbklkID0gYXBwaW5mb19leHRlbnNpb25pZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgX19pbnRlcm5hbFNldERlcHJlY2F0ZWRFeHRlbnNpb25JZChTdHJpbmcgZGVwcmVjYXRlZElkKQotICB7Ci0gICAgZGVwcmVjYXRlZEV4dGVuc2lvbklkID0gZGVwcmVjYXRlZElkOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRQcmVmU3RvcmUoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkKLSAgewotCSAgcHJlZlN0b3JlID0gc3RvcmU7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRBbGxFeHRlbnNpb25zU2NoZW1hc0NvbnRyaWJ1dGlvbigpCi0gIHsgIAotICAgIC8vIElmIHdlIHJlYWQgdGhlIHJlZ2lzdHJ5LCB0aGVuIGxldCdzIG5vdCBkbyBpdCBhZ2Fpbi4KLSAgICBpZiAobnNVUklQcm9wZXJ0aWVzICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG5zVVJJUHJvcGVydGllczsKLSAgICB9Ci0gCi0gICAgbnNVUklQcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGNhdGVnb3J5UHJvdmlkZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgZ2V0QWxsRXh0ZW5zaW9uc1NjaGVtYXNDb250cmlidXRpb24oZXh0ZW5zaW9uSWQpOwotICAgIGlmIChkZXByZWNhdGVkRXh0ZW5zaW9uSWQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBnZXRBbGxFeHRlbnNpb25zU2NoZW1hc0NvbnRyaWJ1dGlvbihkZXByZWNhdGVkRXh0ZW5zaW9uSWQpOyAgICAgCi0gICAgfSAgCi0gICAgCi0gICAgLy8gZ2V0IHVzZXItYWRkZWQgc2NoZW1hcyBzdG9yZWQgaW4gcHJlZmVyZW5jZQotICAgIGlmIChwcmVmU3RvcmUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSBwcmVmU3RvcmUuZ2V0U3RyaW5nKFVTRVJfQURERURfRVhUX1NDSEVNQVMpOwotICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsICJcbiIpOwotICAgCi0gICAgICB3aGlsZSAoIHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkgKQotICAgICAgewotICAgICAgICBuc1VSSVByb3BlcnRpZXMuYWRkKCBuZXcgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEoIHRva2VuaXplci5uZXh0VG9rZW4oKSApICk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBuc1VSSVByb3BlcnRpZXM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgTGlzdCBnZXRBbGxFeHRlbnNpb25zU2NoZW1hc0NvbnRyaWJ1dGlvbihTdHJpbmcgaWQpCi0gIHsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBhc2lQcm9wZXJ0aWVzTGlzdCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKGlkKTsKLQotICAgIGJvb2xlYW4gaGFzQVNJUHJvcGVydGllcyA9IChhc2lQcm9wZXJ0aWVzTGlzdCAhPSBudWxsKSAmJiAoYXNpUHJvcGVydGllc0xpc3QubGVuZ3RoID4gMCk7Ci0KLSAgICBpZiAoaGFzQVNJUHJvcGVydGllcykKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFzaVByb3BlcnRpZXNMaXN0Lmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgYXNpUHJvcGVydGllc0VsZW1lbnQgPSBhc2lQcm9wZXJ0aWVzTGlzdFtpXTsKLSAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lID0gYXNpUHJvcGVydGllc0VsZW1lbnQuZ2V0TmFtZSgpOwotCi0gICAgICAgIGlmICgiY2F0ZWdvcnkiLmVxdWFscyhlbGVtZW50TmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBhc2lQcm9wZXJ0aWVzRWxlbWVudC5nZXRBdHRyaWJ1dGUoREVTQ1JJUFRJT04pOwotICAgICAgICAgIFN0cmluZyBkaXNwbGF5TmFtZSA9IGFzaVByb3BlcnRpZXNFbGVtZW50LmdldEF0dHJpYnV0ZShESVNQTEFZTkFNRSk7Ci0gICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IGFzaVByb3BlcnRpZXNFbGVtZW50LmdldEF0dHJpYnV0ZShOQU1FU1BBQ0VVUkkpOwotICAgICAgICAgIFN0cmluZyB4c2RGaWxlVVJMID0gYXNpUHJvcGVydGllc0VsZW1lbnQuZ2V0QXR0cmlidXRlKFhTREZJTEVVUkwpOwotICAgICAgICAgIFN0cmluZyBsYWJlbFByb3ZpZGVyQ2xhc3MgPSBhc2lQcm9wZXJ0aWVzRWxlbWVudC5nZXRBdHRyaWJ1dGUoTEFCRUxQUk9WSURFUik7Ci0gICAgICAgICAgU3RyaW5nIGFkZENvbW1hbmRDbGFzcyA9IGFzaVByb3BlcnRpZXNFbGVtZW50LmdldEF0dHJpYnV0ZShBRERfQ09NTUFORF9DTEFTUyk7Ci0gICAgICAgICAgU3RyaW5nIGRlbGV0ZUNvbW1hbmRDbGFzcyA9IGFzaVByb3BlcnRpZXNFbGVtZW50LmdldEF0dHJpYnV0ZShERUxFVEVfQ09NTUFORF9DTEFTUyk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKGRpc3BsYXlOYW1lID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gZGlzcGxheSBuYW1lLCBmb3JjZSB0aGUgdXNlcgotICAgICAgICAgICAgLy8gdG8gbWFudWFsbHkgY3JlYXRlIGEgbmFtZS4gVGhlcmVmb3JlLCB3ZSBpZ25vcmUgZW50cnkgd2l0aG91dAotICAgICAgICAgICAgLy8gYSBkaXNwbGF5IG5hbWUuCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoeHNkRmlsZVVSTCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHhzZEZpbGVVUkwgPSBsb2NhdGVGaWxlVXNpbmdDYXRhbG9nKG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgZXh0ZW5zaW9uc1NjaGVtYVNwZWMgPSBjcmVhdGVFbnRyeSgpOwotICAgICAgICAgIGV4dGVuc2lvbnNTY2hlbWFTcGVjLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLSAgICAgICAgICBleHRlbnNpb25zU2NoZW1hU3BlYy5zZXREaXNwbGF5TmFtZShkaXNwbGF5TmFtZSk7Ci0gICAgICAgICAgZXh0ZW5zaW9uc1NjaGVtYVNwZWMuc2V0TmFtZXNwYWNlVVJJKG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgZXh0ZW5zaW9uc1NjaGVtYVNwZWMuc2V0RGVmYXV0U2NoZW1hKCk7Ci0KLSAgICAgICAgICBTdHJpbmcgcGx1Z2luSWQgPSBhc2lQcm9wZXJ0aWVzRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLQotICAgICAgICAgIGlmIChsYWJlbFByb3ZpZGVyQ2xhc3MgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBDbGFzcyB0aGVDbGFzcyA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCkubG9hZENsYXNzKGxhYmVsUHJvdmlkZXJDbGFzcyk7Ci0gICAgICAgICAgICAgIGlmICh0aGVDbGFzcyAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGFiZWxQcm92aWRlciA9IChJTGFiZWxQcm92aWRlcikgdGhlQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNTY2hlbWFTcGVjLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKGFkZENvbW1hbmRDbGFzcyAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBFeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZCBhZGRDb21tYW5kID0gKEV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kKWFzaVByb3BlcnRpZXNFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQUREX0NPTU1BTkRfQ0xBU1MpOwotICAgICAgICAgICAgICBpZiAoYWRkQ29tbWFuZCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uc1NjaGVtYVNwZWMuc2V0RXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQoYWRkQ29tbWFuZCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoZGVsZXRlQ29tbWFuZENsYXNzICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZCBkZWxldGVDb21tYW5kID0gKEV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZClhc2lQcm9wZXJ0aWVzRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKERFTEVURV9DT01NQU5EX0NMQVNTKTsKLSAgICAgICAgICAgICAgaWYgKGRlbGV0ZUNvbW1hbmQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNTY2hlbWFTcGVjLnNldEV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZChkZWxldGVDb21tYW5kKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGV4dGVuc2lvbnNTY2hlbWFTcGVjLnNldExvY2F0aW9uKExPQ0FUSU9OX1BSRUZJWCArIHBsdWdpbklkICsgIi8iICsgeHNkRmlsZVVSTCk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgIG5zVVJJUHJvcGVydGllcy5hZGQoZXh0ZW5zaW9uc1NjaGVtYVNwZWMpOwotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoImNhdGVnb3J5UHJvdmlkZXIiLmVxdWFscyhlbGVtZW50TmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgY2F0ZWdvcnlQcm92aWRlckNsYXNzID0gYXNpUHJvcGVydGllc0VsZW1lbnQuZ2V0QXR0cmlidXRlKENBVEVHT1JZX1BST1ZJREVSX0NMQVNTKTsKLSAgICAgICAgICAKLSAgICAgICAgICBpZiAoY2F0ZWdvcnlQcm92aWRlckNsYXNzICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIENhdGVnb3J5UHJvdmlkZXIgY2F0ZWdvcnlQcm92aWRlciA9IChDYXRlZ29yeVByb3ZpZGVyKWFzaVByb3BlcnRpZXNFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQ0FURUdPUllfUFJPVklERVJfQ0xBU1MpOwotICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnlQcm92aWRlciAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2F0ZWdvcnlQcm92aWRlckxpc3QuYWRkKGNhdGVnb3J5UHJvdmlkZXIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotCi0gICAgfQotICAgIAotICAgIHJldHVybiBuc1VSSVByb3BlcnRpZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZCBnZXRBZGRFeHRlbnNpb25Db21tYW5kKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICAvLyBEaWRuJ3QgcmV0cmlldmUgdGhlIGNvbmZpZyBlbGVtZW50cyB5ZXQuCi0gICAgaWYgKG5zVVJJUHJvcGVydGllcyA9PSBudWxsKQotICAgIHsKLSAgICAgIGdldEFsbEV4dGVuc2lvbnNTY2hlbWFzQ29udHJpYnV0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIGZvciAoSXRlcmF0b3IgaSA9IG5zVVJJUHJvcGVydGllcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwZWMgPSAoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEpaS5uZXh0KCk7Ci0gICAgICBTdHJpbmcgbnNVUkkgPSBzcGVjLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgaWYgKG5zVVJJICE9IG51bGwgJiYgbnNVUkkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBzcGVjLmdldEV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChJdGVyYXRvciBpID0gY2F0ZWdvcnlQcm92aWRlckxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBDYXRlZ29yeVByb3ZpZGVyIGNhdGVnb3J5UHJvdmlkZXIgPSAoQ2F0ZWdvcnlQcm92aWRlcilpLm5leHQoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaiA9IGNhdGVnb3J5UHJvdmlkZXIuZ2V0Q2F0ZWdvcmllcygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hIHNwZWMgPSAoU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEpIGoubmV4dCgpOwotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gc3BlYy5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsICYmIG5hbWVzcGFjZVVSSS5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBzcGVjLmdldEV4dGVuc2libGVBZGRFeHRlbnNpb25Db21tYW5kKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBFeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQgZ2V0UmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIC8vIERpZG4ndCByZXRyaWV2ZSB0aGUgY29uZmlnIGVsZW1lbnRzIHlldC4KLSAgICBpZiAobnNVUklQcm9wZXJ0aWVzID09IG51bGwpCi0gICAgewotICAgICAgZ2V0QWxsRXh0ZW5zaW9uc1NjaGVtYXNDb250cmlidXRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgZm9yIChJdGVyYXRvciBpID0gbnNVUklQcm9wZXJ0aWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgc3BlYyA9IChTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSlpLm5leHQoKTsKLSAgICAgIFN0cmluZyBuc1VSSSA9IHNwZWMuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBpZiAobnNVUkkgIT0gbnVsbCAmJiBuc1VSSS5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHNwZWMuZ2V0RXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGZvciAoSXRlcmF0b3IgaSA9IGNhdGVnb3J5UHJvdmlkZXJMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQ2F0ZWdvcnlQcm92aWRlciBjYXRlZ29yeVByb3ZpZGVyID0gKENhdGVnb3J5UHJvdmlkZXIpaS5uZXh0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSBjYXRlZ29yeVByb3ZpZGVyLmdldENhdGVnb3JpZXMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSBzcGVjID0gKFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKSBqLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHNwZWMuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCAmJiBuYW1lc3BhY2VVUkkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gc3BlYy5nZXRFeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0Q2F0ZWdvcnlQcm92aWRlcnMoKQotICB7Ci0gICAgaWYgKG5zVVJJUHJvcGVydGllcyA9PSBudWxsKQotICAgIHsKLSAgICAgIGdldEFsbEV4dGVuc2lvbnNTY2hlbWFzQ29udHJpYnV0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBjYXRlZ29yeVByb3ZpZGVyTGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEgY3JlYXRlRW50cnkoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFN0cmluZyBsb2NhdGlvbiBmb3IgdGhlIHNjaGVtYSB3aXRoIHRoZSBnaXZlbiBuYW1lc3BhY2VVUkkgYnkKLSAgICogbG9va2luZyBhdCB0aGUgWE1MIGNhdGFsb2cuIFdlIGxvb2sgb25seSBpbiB0aGUgcGx1Z2luIHNwZWNpZmllZCBlbnRyaWVzIG9mCi0gICAqIHRoZSBjYXRhbG9nLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZVVSSQotICAgKiBAcmV0dXJuIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBzY2hlbWEuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBsb2NhdGVGaWxlVXNpbmdDYXRhbG9nKFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gIHsKLSAgICBVUklSZXNvbHZlciByZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IHJlc29sdmVyLnJlc29sdmUoIiIsIG5hbWVzcGFjZVVSSSwgIiIpOwotICAgIHJldHVybiByZXNvbHZlci5yZXNvbHZlUGh5c2ljYWxMb2NhdGlvbigiIiwgbmFtZXNwYWNlVVJJLCByZXN1bHQpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9TZWxlY3RGcm9tQ2F0YWxvZ0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL1NlbGVjdEZyb21DYXRhbG9nRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMjczN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL1NlbGVjdEZyb21DYXRhbG9nRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLkNhdGFsb2dTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nLlhNTENhdGFsb2dFbnRyaWVzVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2cuWE1MQ2F0YWxvZ0VudHJ5RGV0YWlsc1ZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nLlhNTENhdGFsb2dNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2cuWE1MQ2F0YWxvZ1RyZWVWaWV3ZXI7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3RGcm9tQ2F0YWxvZ0RpYWxvZyBleHRlbmRzIERpYWxvZwotewotCi0gIHByaXZhdGUgSUNhdGFsb2cgd29ya2luZ1VzZXJDYXRhbG9nOwotICBwcml2YXRlIElDYXRhbG9nIHVzZXJDYXRhbG9nOwotICBwcml2YXRlIElDYXRhbG9nIGRlZmF1bHRDYXRhbG9nOwotICBwcml2YXRlIFhNTENhdGFsb2dFbnRyaWVzVmlldyBjYXRhbG9nRW50cmllc1ZpZXc7Ci0gIHByaXZhdGUgSUNhdGFsb2cgc3lzdGVtQ2F0YWxvZzsKLQotICBwcml2YXRlIFN0cmluZyBjdXJyZW50U2VsZWN0aW9uTG9jYXRpb247Ci0gIHByaXZhdGUgU3RyaW5nIGN1cnJlbnRTZWxlY3Rpb25OYW1lc3BhY2U7Ci0KLSAgcHVibGljIFNlbGVjdEZyb21DYXRhbG9nRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwpOwotCi0gICAgZGVmYXVsdENhdGFsb2cgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotICAgIElOZXh0Q2F0YWxvZ1tdIG5leHRDYXRhbG9ncyA9IGRlZmF1bHRDYXRhbG9nLmdldE5leHRDYXRhbG9ncygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElOZXh0Q2F0YWxvZyBjYXRhbG9nID0gbmV4dENhdGFsb2dzW2ldOwotICAgICAgSUNhdGFsb2cgcmVmZXJlbmNlZENhdGFsb2cgPSBjYXRhbG9nLmdldFJlZmVyZW5jZWRDYXRhbG9nKCk7Ci0gICAgICBpZiAocmVmZXJlbmNlZENhdGFsb2cgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKFhNTENvcmVQbHVnaW4uU1lTVEVNX0NBVEFMT0dfSUQuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgc3lzdGVtQ2F0YWxvZyA9IHJlZmVyZW5jZWRDYXRhbG9nOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKFhNTENvcmVQbHVnaW4uVVNFUl9DQVRBTE9HX0lELmVxdWFscyhyZWZlcmVuY2VkQ2F0YWxvZy5nZXRJZCgpKSkKLSAgICAgICAgewotICAgICAgICAgIHVzZXJDYXRhbG9nID0gcmVmZXJlbmNlZENhdGFsb2c7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyB3ZSBjcmVhdGUgYSB3b3JraW5nIGNvcHkgb2YgdGhlICdVc2VyIFNldHRpbmdzJyBmb3IgdGhlIENhdGFsb2cKLSAgICAvLyB0aGF0IHdlIGNhbiBtb2RpZnkKLSAgICBDYXRhbG9nU2V0IHRlbXBDYXRhbG9nU2V0ID0gbmV3IENhdGFsb2dTZXQoKTsKLSAgICB3b3JraW5nVXNlckNhdGFsb2cgPSB0ZW1wQ2F0YWxvZ1NldC5sb29rdXBPckNyZWF0ZUNhdGFsb2coIndvcmtpbmciLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgLy8gVE9ETzogYWRkIGVudHJpZXMgZnJvbSB0aGUgbmVzdGVkIGNhdGFsb2dzIGFzIHdlbGwKLSAgICB3b3JraW5nVXNlckNhdGFsb2cuYWRkRW50cmllc0Zyb21DYXRhbG9nKHVzZXJDYXRhbG9nKTsKLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBncmlkRGF0YS5oZWlnaHRIaW50ID0gNTAwOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICBjcmVhdGVDYXRhbG9nRW50cmllc1ZpZXcoY29tcG9zaXRlKTsKLSAgICBjcmVhdGVDYXRhbG9nRGV0YWlsc1ZpZXcoY29tcG9zaXRlKTsKLQotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDYXRhbG9nRW50cmllc1ZpZXcoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotICAgIGdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIGdyaWREYXRhLndpZHRoSGludCA9IDM3MDsKLSAgICBncm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICBncm91cC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9VU0VSX0VOVFJJRVMpOwotICAgIGdyb3VwLnNldFRvb2xUaXBUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9VU0VSX0VOVFJJRVNfVE9PTF9USVApOwotCi0gICAgLyoKLSAgICAgKiBjcmVhdGUgYSBzdWJjbGFzcyBvZiBYTUxDYXRhbG9nRW50cmllc1ZpZXcgd2hpY2ggc3VwcHJlc3NlcyAtIHRoZQotICAgICAqIGNyZWF0aW9uIG9mICdBZGQnLCAnRWRpdCcsICdEZWxldGUnIGJ1dHRvbnMgLSBhbnkgbWV0aG9kIGludm9sdmluZyB0aGUKLSAgICAgKiBhYm92ZSBidXR0b25zCi0gICAgICovCi0gICAgY2F0YWxvZ0VudHJpZXNWaWV3ID0gbmV3IFhNTENhdGFsb2dFbnRyaWVzVmlldyhncm91cCwgd29ya2luZ1VzZXJDYXRhbG9nLCBzeXN0ZW1DYXRhbG9nKQotICAgIHsKLSAgICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnMoQ29tcG9zaXRlIHBhcmVudCkKLSAgICAgIHsKLSAgICAgIH0KLQotICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlV2lkZ2V0RW5hYmxlZFN0YXRlKCkKLSAgICAgIHsKLSAgICAgIH0KLQotICAgIH07Ci0KLSAgICAvLyBPbmx5IFhNTCBTY2hlbWEgZW50cnkgaXMgc2VsZWN0YWJsZQotICAgIGNhdGFsb2dFbnRyaWVzVmlldy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICBYTUxDYXRhbG9nVHJlZVZpZXdlciBjYXRhbG9nVHJlZVZpZXdlciA9ICgoWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIpIGNhdGFsb2dFbnRyaWVzVmlldy5nZXRWaWV3ZXIoKSk7Ci0gICAgY2F0YWxvZ1RyZWVWaWV3ZXIucmVzZXRGaWx0ZXJzKCk7Ci0KLSAgICBjYXRhbG9nVHJlZVZpZXdlci5hZGRGaWx0ZXIobmV3IFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlcihuZXcgU3RyaW5nW10geyAiLnhzZCIgfSkpOwotICB9Ci0KLSAgLy8gQnVnIGluIHRoZSBmaWx0ZXIgb2YgdGhlIFhNTCBwbHVnaW4sIGhhdmUgdG8gZ2l2ZSBhIGNvcnJlY3QgdmVyc2lvbiBoZXJlCi0gIC8vIFRPRE86IFdhaXRpbmcgZm9yIHRoZSBmaXggdG8gYmUgY29tbWl0ZWQgdG8gWE1MIHBsdWdpbiBhbmQKLSAgLy8gYmUgdXNlZCBieSBjb25zdGVsbGF0aW9uCi0gIHByaXZhdGUgY2xhc3MgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyCi0gIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVzNfWE1MU0NIRU1BX05BTUVTUEFDRSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxLyI7Ci0gICAgcHJvdGVjdGVkIFN0cmluZ1tdIGV4dGVuc2lvbnM7Ci0KLSAgICBwdWJsaWMgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyRmlsdGVyKFN0cmluZ1tdIGV4dGVuc2lvbnMxKQotICAgIHsKLSAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnMxOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRmlsdGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpCi0gICAgICB7Ci0gICAgICAgIElDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5ID0gKElDYXRhbG9nRW50cnkpIGVsZW1lbnQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIC8vIGlmIHRoZSBleHRlbnNpb24gaXMgY29ycmVjdCBhbmQgdGhlIG5hbWVzcGFjZSBpbmRpY2F0ZXMKLSAgICAgICAgICAvLyB0aGF0IHRoaXMgZW50cnkgaXMgbm90IHRoZSBXMyBYTUwgU2NoZW1hCi0gICAgICAgICAgaWYgKGNhdGFsb2dFbnRyeS5nZXRVUkkoKS5lbmRzV2l0aChleHRlbnNpb25zW2ldKSAmJiAhY2F0YWxvZ0VudHJ5LmdldEtleSgpLnN0YXJ0c1dpdGgoVzNfWE1MU0NIRU1BX05BTUVTUEFDRSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoZWxlbWVudC5lcXVhbHMoWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIuUExVR0lOX1NQRUNJRklFRF9FTlRSSUVTX09CSkVDVCkgfHwgZWxlbWVudC5lcXVhbHMoWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIuVVNFUl9TUEVDSUZJRURfRU5UUklFU19PQkpFQ1QpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2F0YWxvZ0RldGFpbHNWaWV3KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBHcm91cCBkZXRhaWxzR3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgZGV0YWlsc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgIGRldGFpbHNHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgZGV0YWlsc0dyb3VwLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0RFVEFJTFMpOwotICAgIGZpbmFsIFhNTENhdGFsb2dFbnRyeURldGFpbHNWaWV3IGRldGFpbHNWaWV3ID0gbmV3IFhNTENhdGFsb2dFbnRyeURldGFpbHNWaWV3KGRldGFpbHNHcm91cCk7Ci0gICAgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSA/ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkgOiBudWxsOwotICAgICAgICBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KQotICAgICAgICB7Ci0gICAgICAgICAgSUNhdGFsb2dFbnRyeSBlbnRyeSA9IChJQ2F0YWxvZ0VudHJ5KSBzZWxlY3RlZE9iamVjdDsKLSAgICAgICAgICBkZXRhaWxzVmlldy5zZXRDYXRhbG9nRWxlbWVudChlbnRyeSk7Ci0gICAgICAgICAgY3VycmVudFNlbGVjdGlvbkxvY2F0aW9uID0gZW50cnkuZ2V0VVJJKCk7Ci0gICAgICAgICAgY3VycmVudFNlbGVjdGlvbk5hbWVzcGFjZSA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGRldGFpbHNWaWV3LnNldENhdGFsb2dFbGVtZW50KChJQ2F0YWxvZ0VudHJ5KSBudWxsKTsKLSAgICAgICAgICBjdXJyZW50U2VsZWN0aW9uTG9jYXRpb24gPSAiIjsKLSAgICAgICAgICBjdXJyZW50U2VsZWN0aW9uTmFtZXNwYWNlID0gIiI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotICAgIGNhdGFsb2dFbnRyaWVzVmlldy5nZXRWaWV3ZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRDdXJyZW50U2VsZWN0aW9uTG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGN1cnJlbnRTZWxlY3Rpb25Mb2NhdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudFNlbGVjdGlvbk5hbWVzcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gY3VycmVudFNlbGVjdGlvbk5hbWVzcGFjZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL1NwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0YTlhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vU3BlY2lmaWNhdGlvbkZvckV4dGVuc2lvbnNTY2hlbWEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvOwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24uY29tbWFuZHMuRXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b20uTm9kZUZpbHRlcjsKLQotcHVibGljIGNsYXNzIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hCi17Ci0gIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotICBwcml2YXRlIFN0cmluZyBkaXNwbGF5TmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlVVJJOwotICBwcml2YXRlIFN0cmluZyBsb2NhdGlvbjsKLSAgcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotICBwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0U2NoZW1hID0gZmFsc2U7Ci0gIHByaXZhdGUgRXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQgYWRkQ29tbWFuZDsKLSAgcHJpdmF0ZSBFeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQgcmVtb3ZlQ29tbWFuZDsKLSAgcHJpdmF0ZSBOb2RlRmlsdGVyIG5vZGVGaWx0ZXI7Ci0gIHByaXZhdGUgU3RyaW5nIGNsYXNzaWZpY2F0aW9uOwotICAKLSAgLyoqCi0gICAqIEVpdGhlciB0aGUgd29ya3NwYWNlLXJlbGF0aXZlIHBhdGggb2YgdGhlIHhzZCBmaWxlIG9yIHRoZSBuYW1lc3BhY2UKLSAgICogb2YgdGhlIHhzZCBmaWxlIChpZiBpdCBjb21lIGZyb20gdGhlIENhdGFsb2cpIAotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgc291cmNlSGludDsKLSAgcHJpdmF0ZSBib29sZWFuIGZyb21DYXRhbG9nOwotCi0gIHB1YmxpYyBTcGVjaWZpY2F0aW9uRm9yRXh0ZW5zaW9uc1NjaGVtYSgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIFNwZWNpZmljYXRpb25Gb3JFeHRlbnNpb25zU2NoZW1hKFN0cmluZyBkZXNjKSB7Ci0JU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZGVzYywgIlx0Iik7Ci0JCi0JLy8gd2UgbXVzdCBiZSBzdXJlIHRoYXQgZWFjaCAnZGVzYycgY29udGFpbnMgaW5mbyBpbiBjb3JyZWN0IGZvcm1hdAotCS8vIG5vIGVycm9yIGNoZWNraW5nIGhlcmUKLQlkZXNjcmlwdGlvbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQlkaXNwbGF5TmFtZSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQluYW1lc3BhY2VVUkkgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JbG9jYXRpb24gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JaXNEZWZhdWx0U2NoZW1hID0gdG9rZW5pemVyLm5leHRUb2tlbigpLmVxdWFscygidHJ1ZSIpOwotCXNvdXJjZUhpbnQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JZnJvbUNhdGFsb2cgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkuZXF1YWxzKCJ0cnVlIik7Ci0gIH0KLQotLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVzY3JpcHRpb24uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLSAgewotICAgIHJldHVybiBkZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gZGVzY3JpcHRpb24KLSAgICogICAgICAgICAgVGhlIGRlc2NyaXB0aW9uIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikKLSAgewotICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRpc3BsYXlOYW1lLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZGlzcGxheU5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIG5hbWUKLSAgICogICAgICAgICAgVGhlIGRpc3BsYXlOYW1lIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBkaXNwbGF5TmFtZSkKLSAgewotICAgIHRoaXMuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5hbWVzcGFjZVVSSS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkKLSAgewotICAgIHJldHVybiBuYW1lc3BhY2VVUkk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIG5hbWVzcGFjZVVSSQotICAgKiAgICAgICAgICBUaGUgbmFtZXNwYWNlVVJJIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgbmFtZXNwYWNlVVJJKQotICB7Ci0gICAgdGhpcy5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgeHNkIGZpbGUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBsb2NhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICogICAgICAgICAgVGhlIGxvY2F0aW9uIHRvIGJlIHNldAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKQotICB7Ci0gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICB9Ci0KLSAgcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKQotICB7Ci0gICAgcmV0dXJuIGxhYmVsUHJvdmlkZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldExhYmVsUHJvdmlkZXIoSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikKLSAgewotICAgIHRoaXMubGFiZWxQcm92aWRlciA9IGxhYmVsUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgRXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQgZ2V0RXh0ZW5zaWJsZUFkZEV4dGVuc2lvbkNvbW1hbmQoKQotICB7Ci0gICAgcmV0dXJuIGFkZENvbW1hbmQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZChFeHRlbnNpYmxlQWRkRXh0ZW5zaW9uQ29tbWFuZCBhZGRDb21tYW5kKQotICB7Ci0gICAgdGhpcy5hZGRDb21tYW5kID0gYWRkQ29tbWFuZDsKLSAgfQotCi0gIHB1YmxpYyBFeHRlbnNpYmxlUmVtb3ZlRXh0ZW5zaW9uTm9kZUNvbW1hbmQgZ2V0RXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kKCkKLSAgewotICAgIHJldHVybiByZW1vdmVDb21tYW5kOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaWJsZVJlbW92ZUV4dGVuc2lvbk5vZGVDb21tYW5kKEV4dGVuc2libGVSZW1vdmVFeHRlbnNpb25Ob2RlQ29tbWFuZCByZW1vdmVDb21tYW5kKQotICB7Ci0gICAgdGhpcy5yZW1vdmVDb21tYW5kID0gcmVtb3ZlQ29tbWFuZDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRGVmYXV0U2NoZW1hKCl7Ci0JICByZXR1cm4gaXNEZWZhdWx0U2NoZW1hIDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlZmF1dFNjaGVtYSgpewotCSAgaXNEZWZhdWx0U2NoZW1hID0gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U291cmNlSGludChTdHJpbmcgcyl7Ci0JICBzb3VyY2VIaW50ID0gczsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VIaW50KCl7Ci0JICByZXR1cm4gc291cmNlSGludDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRnJvbUNhdGFsb2coKSB7Ci0JcmV0dXJuIGZyb21DYXRhbG9nOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RnJvbUNhdGFsb2coYm9vbGVhbiBmcm9tQ2F0YWxvZykgewotCXRoaXMuZnJvbUNhdGFsb2cgPSBmcm9tQ2F0YWxvZzsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHNldHRpbmcgdGhpcyB2aWEgdGhlIGV4dGVuc2lvbiBwb2ludCBkZWZpbmVkIGluIHRoZSBwbHVnaW4ueG1sCi0gICAqIFRoaXMgYWxsb3dzIGV4dGVuZGVycyB0byBwcm92aWRlIGEgZmlsdGVyIGZvciBhIGNhdGVnb3J5IHRoYXQgaGFzIGJlZW4gYWRkZWQgCi0gICAqIGR5bmFtaWNhbGx5IChwcm9ncmFtbWF0aWNhbGx5KQotICAgKiBAcGFyYW0gbm9kZUZpbHRlcgotICAgKi8gCi0gIHB1YmxpYyB2b2lkIHNldE5vZGVGaWx0ZXIoTm9kZUZpbHRlciBub2RlRmlsdGVyKQotICB7Ci0gICAgdGhpcy5ub2RlRmlsdGVyID0gbm9kZUZpbHRlcjsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgbm9kZSBmaWx0ZXIKLSAgICogQHJldHVybiBOb2RlRmlsdGVyCi0gICAqLwotICBwdWJsaWMgTm9kZUZpbHRlciBnZXROb2RlRmlsdGVyKCkKLSAgewotICAgIHJldHVybiBub2RlRmlsdGVyOwotICB9Ci0gIAotICAvKioKLSAgICogVGhlcmUgaXMgbm8gc3VwcG9ydCBmb3Igc2V0dGluZyB0aGlzIHZpYSB0aGUgZXh0ZW5zaW9uIHBvaW50IGRlZmluZWQgaW4gdGhlIHBsdWdpbi54bWwKLSAgICogVGhpcyBhbGxvd3MgZXh0ZW5kZXJzIHRvIGdyb3VwIGNhdGVnb3JpZXMgaW50byBncm91cHMgb3IgY2xhc3NpZmljYXRpb25zcyAgCi0gICAqIEBwYXJhbSBjbGFzc2lmaWNhdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q2xhc3NpZmljYXRpb24oU3RyaW5nIGNsYXNzaWZpY2F0aW9uKQotICB7Ci0gICAgdGhpcy5jbGFzc2lmaWNhdGlvbiA9IGNsYXNzaWZpY2F0aW9uOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBjbGFzc2lmaWNhdGlvbgotICAgKiBAcmV0dXJuIFN0cmluZwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDbGFzc2lmaWNhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gY2xhc3NpZmljYXRpb247Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9YU0RFeHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vWFNERXh0ZW5zaW9uVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGU0MjU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9YU0RFeHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm87Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5YU0RDb21tb25VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIFhTREV4dGVuc2lvblRyZWVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBET01FeHRlbnNpb25UcmVlQ29udGVudFByb3ZpZGVyCi17ICAKLSAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpCi0gIHsKLSAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgewotICAgICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSBpbnB1dEVsZW1lbnQ7Ci0gICAgICBMaXN0IGVsZW1lbnRzQW5kQXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIFhTREFubm90YXRpb24geHNkQW5ub3RhdGlvbiA9IFhTRENvbW1vblVJVXRpbHMuZ2V0SW5wdXRYU0RBbm5vdGF0aW9uKGNvbXBvbmVudCwgZmFsc2UpOwotICAgICAgaWYgKHhzZEFubm90YXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gQnVnIDEzNzg1NiAtIEV4dGVuc2lvbiBwYWdlIG9mIHByb3BlcnRpZXMgc2hvdWxkbid0IGRpc3BsYXkgaW1wb3J0ZWQgZWxlbWVudHMKLSAgICAgICAgLy8gQWRkZWQgdGhpcyBpZiBzdGF0ZW1lbnQKLSAgICAgICAgaWYgKHhzZEFubm90YXRpb24uZ2V0U2NoZW1hKCkgPT0gY29tcG9uZW50LmdldFNjaGVtYSgpKQotICAgICAgICB7Ci0gICAgICAgICAgTGlzdCBhcHBJbmZvTGlzdCA9IHhzZEFubm90YXRpb24uZ2V0QXBwbGljYXRpb25JbmZvcm1hdGlvbigpOwotICAgICAgICAgIEVsZW1lbnQgYXBwSW5mb0VsZW1lbnQgPSBudWxsOwotICAgICAgICAgIGlmIChhcHBJbmZvTGlzdC5zaXplKCkgPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGFwcEluZm9FbGVtZW50ID0gKEVsZW1lbnQpIGFwcEluZm9MaXN0LmdldCgwKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGFwcEluZm9FbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGFwcEluZm9MaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBhcHBJbmZvID0gKEVsZW1lbnQpIG9iajsKLSAgICAgICAgICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGFwcEluZm8uZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIE5vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzQW5kQXR0cmlidXRlcy5hZGQobm9kZSk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKiBDb25zdHJ1Y3QgYXR0cmlidXRlcyBsaXN0ICovCi0gICAgICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGFwcEluZm9FbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIFN0cmluZyBkZWZhdWx0TmFtZXNwYWNlID0KLSAgICAgICAgICAgICAgLy8gKFN0cmluZyljb21wb25lbnQuZ2V0U2NoZW1hKCkuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpLmdldCgiIik7Ci0gICAgICAgICAgICAgIGludCBsZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTm9kZSBvbmVBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc1htbG5zQXR0cmlidXRlKG9uZUF0dHJpYnV0ZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IG9uZUF0dHJpYnV0ZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNFeHRlbnNpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsICYmIG9uZUF0dHJpYnV0ZS5nZXRQcmVmaXgoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpc0V4dGVuc2lvbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIVhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMS5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaXNFeHRlbnNpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgaWYgKGlzRXh0ZW5zaW9uKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbGVtZW50c0FuZEF0dHJpYnV0ZXMuYWRkKG9uZUF0dHJpYnV0ZSk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZWxlbWVudHNBbmRBdHRyaWJ1dGVzLnRvQXJyYXkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QudG9BcnJheSgpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1htbG5zQXR0cmlidXRlKE5vZGUgYXR0cmlidXRlKQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9IGF0dHJpYnV0ZS5nZXRQcmVmaXgoKTsKLSAgICBpZiAocHJlZml4ICE9IG51bGwpCi0gICAgewotICAgICAgLy8gdGhpcyBoYW5kbGUgdGhlIHhtbG5zOmZvbz0iYmxhaCIgY2FzZQotICAgICAgcmV0dXJuICJ4bWxucyIuZXF1YWxzKHByZWZpeCk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIHRoaXMgaGFuZGxlcyB0aGUgeG1sbnM9ImJsYWgiIGNhc2UKLSAgICAgIHJldHVybiAieG1sbnMiLmVxdWFscyhhdHRyaWJ1dGUuZ2V0Tm9kZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vRGVmYXVsdExpc3ROb2RlRWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9EZWZhdWx0TGlzdE5vZGVFZGl0b3JDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NGFkNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9EZWZhdWx0TGlzdE5vZGVFZGl0b3JDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b207Ci0KLQotcHVibGljIGNsYXNzIERlZmF1bHRMaXN0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBMaXN0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24KLXsKLSAgcHJpdmF0ZSBTdHJpbmdbXSB2YWx1ZXM7Ci0gIAotICBwdWJsaWMgRGVmYXVsdExpc3ROb2RlRWRpdG9yQ29uZmlndXJhdGlvbihTdHJpbmdbXSB2YWx1ZXMpCi0gIHsKLSAgICB0aGlzLnZhbHVlcyA9IHZhbHVlczsgCi0gIH0KLSAKLSAgcHVibGljIE9iamVjdFtdIGdldFZhbHVlcyhPYmplY3QgcHJvcGVydHlPYmplY3QpCi0gIHsKLSAgICByZXR1cm4gdmFsdWVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL0RpYWxvZ05vZGVFZGl0b3JDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL0RpYWxvZ05vZGVFZGl0b3JDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDUzMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9EaWFsb2dOb2RlRWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlhbG9nTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBOb2RlRWRpdG9yQ29uZmlndXJhdGlvbgotewotICBwdWJsaWMgaW50IGdldFN0eWxlKCkKLSAgeyAgICAgICAgCi0gICAgcmV0dXJuIFNUWUxFX0RJQUxPRzsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRCdXRvblRleHQoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJbWFnZSBnZXRCdXR0b25JbWFnZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIGFic3RyYWN0IHZvaWQgaW52b2tlRGlhbG9nKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL0xpc3ROb2RlRWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9MaXN0Tm9kZUVkaXRvckNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmYmNlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL0xpc3ROb2RlRWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGlzdE5vZGVFZGl0b3JDb25maWd1cmF0aW9uIGV4dGVuZHMgTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24KLXsKLSAgcHJpdmF0ZSBMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0gCi0gIHB1YmxpYyBMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKQotICB7Ci0gICAgcmV0dXJuIGxhYmVsUHJvdmlkZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBpbnQgZ2V0U3R5bGUoKQotICB7Ci0gICAgcmV0dXJuIFNUWUxFX0NPTUJPOwotICB9ICAgIAotCi0gIHB1YmxpYyB2b2lkIHNldExhYmVsUHJvdmlkZXIoTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKQotICB7Ci0gICAgdGhpcy5sYWJlbFByb3ZpZGVyID0gbGFiZWxQcm92aWRlcjsKLSAgfQotCi0gIHB1YmxpYyBhYnN0cmFjdCBPYmplY3RbXSBnZXRWYWx1ZXMoT2JqZWN0IHByb3BlcnR5T2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vTm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9Ob2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MWIyZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9Ob2RlQ3VzdG9taXphdGlvblJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnByb3BlcnRpZXMuc2VjdGlvbnMuYXBwaW5mby5jdXN0b207Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgTm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeQotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7IC8vJE5PTi1OTFMtMSQgIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUxfUFJPVklERVJfQ0xBU1NfQVRUUklCVVRFX05BTUUgPSAibGFiZWxQcm92aWRlckNsYXNzIjsgICAgIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9FRElUT1JfUFJPVklERVJfQ0xBU1NfQVRUUklCVVRFX05BTUUgPSAibm9kZUVkaXRvclByb3ZpZGVyQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVJfQ0xBU1NfQVRUUklCVVRFX05BTUUgPSAiZmlsdGVyQ2xhc3MiOyAKLQotCi0gIHByb3RlY3RlZCBTdHJpbmcgZXh0ZW5zaW9uSWQ7Ci0gIHByb3RlY3RlZCBIYXNoTWFwIG1hcDsKLQotICBwdWJsaWMgTm9kZUN1c3RvbWl6YXRpb25SZWdpc3RyeShTdHJpbmcgcHJvcGVydHlFZGl0b3JFeHRlbnNpb25JZCkKLSAgewotICAgIGV4dGVuc2lvbklkID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuZXh0ZW5zaWJpbGl0eU5vZGVDdXN0b21pemF0aW9ucyI7Ly9wcm9wZXJ0eUVkaXRvckV4dGVuc2lvbklkOwotICB9ICAKLSAgCi0gIHByaXZhdGUgY2xhc3MgRGVzY3JpcHRvcgotICB7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50OwotICAgIE5vZGVFZGl0b3JQcm92aWRlciBub2RlRWRpdG9yUHJvdmlkZXI7Ci0gICAgTm9kZUZpbHRlciBub2RlRmlsdGVyOyAgICAKLSAgICBib29sZWFuIG5vZGVFZGl0b3JQcm92aWRlckZhaWxlZFRvTG9hZCA9IGZhbHNlOwotICAgIGJvb2xlYW4gbGFiZWxQcm92aWRlckZhaWxlZFRvTG9hZCA9IGZhbHNlOwotICAgIGJvb2xlYW4gbm9kZUZpbHRlckZhaWxlZFRvTG9hZCA9IGZhbHNlOyAgICAKLSAgICAKLSAgICBEZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotICAgIHsKLSAgICAgIHRoaXMuY29uZmlndXJhdGlvbkVsZW1lbnQgPSBlbGVtZW50OwotICAgIH0KLSAgICAKLSAgICBOb2RlRWRpdG9yUHJvdmlkZXIgbG9va3VwT3JDcmVhdGVOb2RlRWRpdG9yUHJvdmlkZXIoKQotICAgIHsKLSAgICAgIGlmIChub2RlRWRpdG9yUHJvdmlkZXIgPT0gbnVsbCAmJiAhbm9kZUVkaXRvclByb3ZpZGVyRmFpbGVkVG9Mb2FkKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIG5vZGVFZGl0b3JQcm92aWRlciA9IChOb2RlRWRpdG9yUHJvdmlkZXIpY29uZmlndXJhdGlvbkVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihOT0RFX0VESVRPUl9QUk9WSURFUl9DTEFTU19BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSAKLSAgICAgICAgewotICAgICAgICAgIG5vZGVFZGl0b3JQcm92aWRlckZhaWxlZFRvTG9hZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0gCi0gICAgICByZXR1cm4gbm9kZUVkaXRvclByb3ZpZGVyOwotICAgIH0KLSAgICAKLSAgICBJTGFiZWxQcm92aWRlciBjcmVhdGVMYWJlbFByb3ZpZGVyKCkKLSAgICB7Ci0gICAgICBpZiAoIWxhYmVsUHJvdmlkZXJGYWlsZWRUb0xvYWQpCi0gICAgICB7ICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gKElMYWJlbFByb3ZpZGVyKWNvbmZpZ3VyYXRpb25FbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oTEFCRUxfUFJPVklERVJfQ0xBU1NfQVRUUklCVVRFX05BTUUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgCi0gICAgICAgIHsKLSAgICAgICAgICBsYWJlbFByb3ZpZGVyRmFpbGVkVG9Mb2FkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGVGaWx0ZXIgZ2V0Tm9kZUZpbHRlcigpCi0gICAgewotICAgICAgaWYgKCFub2RlRWRpdG9yUHJvdmlkZXJGYWlsZWRUb0xvYWQpCi0gICAgICB7ICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBub2RlRmlsdGVyID0gKE5vZGVGaWx0ZXIpY29uZmlndXJhdGlvbkVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihGSUxURVJfQ0xBU1NfQVRUUklCVVRFX05BTUUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgCi0gICAgICAgIHsKLSAgICAgICAgICBub2RlRWRpdG9yUHJvdmlkZXJGYWlsZWRUb0xvYWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbm9kZUZpbHRlcjsKLSAgICB9Ci0gIH0KLQotICAKLSAgcHJpdmF0ZSBIYXNoTWFwIGluaXRNYXAoKQotICB7Ci0gICAgSGFzaE1hcCB0aGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGV4dGVuc2lvbnMgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0Zvcigib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5leHRlbnNpYmlsaXR5Tm9kZUN1c3RvbWl6YXRpb25zIik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCA9IGV4dGVuc2lvbnNbaV07Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKE5BTUVTUEFDRSk7Ci0gICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRoZU1hcC5wdXQobmFtZXNwYWNlLCBuZXcgRGVzY3JpcHRvcihjb25maWd1cmF0aW9uRWxlbWVudCkpOwotICAgICAgfSAgICAgCi0gICAgfSAgICAKLSAgICByZXR1cm4gdGhlTWFwOwotICB9Ci0KLSAgcHJpdmF0ZSBEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIG1hcCA9IG51bGw7Ci0gICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotICAgIHsgCi0gICAgICBpZiAobWFwID09IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgbWFwID0gaW5pdE1hcCgpOwotICAgICAgfSAgCi0gICAgICByZXR1cm4gKERlc2NyaXB0b3IpbWFwLmdldChuYW1lc3BhY2UpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgIAotICB9Ci0gIAotICBwdWJsaWMgTm9kZUVkaXRvclByb3ZpZGVyIGdldE5vZGVFZGl0b3JQcm92aWRlcihTdHJpbmcgbmFtZXNwYWNlKQotICB7ICAgICAKLSAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKG5hbWVzcGFjZSk7Ci0gICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIHJldHVybiBkZXNjcmlwdG9yLmxvb2t1cE9yQ3JlYXRlTm9kZUVkaXRvclByb3ZpZGVyKCk7ICAgICAgIAotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IobmFtZXNwYWNlKTsKLSAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKQotICAgIHsgIAotICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuY3JlYXRlTGFiZWxQcm92aWRlcigpOyAgICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgTm9kZUZpbHRlciBnZXROb2RlRmlsdGVyKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKG5hbWVzcGFjZSk7Ci0gICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIHJldHVybiBkZXNjcmlwdG9yLmdldE5vZGVGaWx0ZXIoKTsgICAgICAgCi0gICAgfQotICAgIHJldHVybiBudWxsOyAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9Ob2RlRWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9Ob2RlRWRpdG9yQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTA2YWQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vTm9kZUVkaXRvckNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb2RlRWRpdG9yQ29uZmlndXJhdGlvbgoteyAgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUWUxFX05PTkUgPSAwOyAgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVFlMRV9URVhUID0gMTsgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUWUxFX0NPTUJPID0gMjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RZTEVfRElBTE9HID0gNDsgICAKLSAgCi0gIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0U3R5bGUoKTsKLSAgCi0gIHByaXZhdGUgTm9kZSBub2RlOwotICBwcml2YXRlIE5vZGUgcGFyZW50Tm9kZTsKLQotICBwdWJsaWMgTm9kZSBnZXROb2RlKCkKLSAgewotICAgIHJldHVybiBub2RlOwotICB9Ci0gIHB1YmxpYyB2b2lkIHNldE5vZGUoTm9kZSBub2RlKQotICB7Ci0gICAgdGhpcy5ub2RlID0gbm9kZTsKLSAgfQotICBwdWJsaWMgTm9kZSBnZXRQYXJlbnROb2RlKCkKLSAgewotICAgIHJldHVybiBwYXJlbnROb2RlOwotICB9Ci0gIHB1YmxpYyB2b2lkIHNldFBhcmVudE5vZGUoTm9kZSBwYXJlbnROb2RlKQotICB7Ci0gICAgdGhpcy5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9Ob2RlRWRpdG9yUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vTm9kZUVkaXRvclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZDFjNjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vcHJvcGVydGllcy9zZWN0aW9ucy9hcHBpbmZvL2N1c3RvbS9Ob2RlRWRpdG9yUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24ucHJvcGVydGllcy5zZWN0aW9ucy5hcHBpbmZvLmN1c3RvbTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9kZUVkaXRvclByb3ZpZGVyCi17Ci0gIHB1YmxpYyBhYnN0cmFjdCBOb2RlRWRpdG9yQ29uZmlndXJhdGlvbiBnZXROb2RlRWRpdG9yQ29uZmlndXJhdGlvbihTdHJpbmcgcGFyZW50TmFtZSwgU3RyaW5nIG5vZGVOYW1lKTsgCi0gIC8vcHVibGljIGFic3RyYWN0IE5vZGVFZGl0b3JDb25maWd1cmF0aW9uIGdldE5vZGVFZGl0b3JDb25maWd1cmF0aW9uKE5vZGUgbm9kZSk7ICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi9wcm9wZXJ0aWVzL3NlY3Rpb25zL2FwcGluZm8vY3VzdG9tL05vZGVGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vTm9kZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2FiYmM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3Byb3BlcnRpZXMvc2VjdGlvbnMvYXBwaW5mby9jdXN0b20vTm9kZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmNvbW1vbi5wcm9wZXJ0aWVzLnNlY3Rpb25zLmFwcGluZm8uY3VzdG9tOwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIE5vZGVGaWx0ZXIKLXsgIAotICBwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGVDb250ZXh0KE5vZGUgcGFyZW50Tm9kZSwgaW50IG5vZGVUeXBlLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSkKLSAgeyAgCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3V0aWwvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3V0aWwvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA4YzRmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi91dGlsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMKLXsKLSAgc3RhdGljIAotICB7Ci0gICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcygib3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tb24udXRpbC5tZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHVibGljIE1lc3NhZ2VzKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fT1BFTl9JTl9ORVdfRURJVE9SOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVA7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUF9SRUY7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUF9ERUZJTklUSU9OOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9HUk9VUF9SRUY7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0dST1VQOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0RFTEVURTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfQ09NUExFWF9UWVBFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX1NJTVBMRV9UWVBFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1VQREFURV9FTEVNRU5UX1JFRkVSRU5DRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05PX0lURU1TX1NFTEVDVEVEOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfV0lUSF9ET1RTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0VESVRfV0lUSF9ET1RTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0NIQU5HRV9QQVRURVJOOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9FTlVNRVJBVElPTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfUEFUVEVSTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRU5VTUVSQVRJT05TOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0RFTEVURV9DT05TVFJBSU5UUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9ERUxFVEVfUEFUVEVSTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9ERUxFVEVfRU5VTUVSQVRJT047Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fU0VUX0VOVU1FUkFUSU9OX1ZBTFVFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUEFUVEVSTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9DSEFOR0VfTUFYSU1VTV9PQ0NVUlJFTkNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfSU5WQUxJRF9WQUxVRV9GT1JfTUFYSU1VTV9PQ0NVUlJFTkNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0NIQU5HRV9NSU5JTVVNX09DQ1VSUkVOQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0FQUElORk9fRUxFTUVOVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfQVBQSU5GT19BVFRSSUJVVEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fREVMRVRFX0FQUElORk9fRUxFTUVOVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9ERUxFVEVfQVBQSU5GT19BVFRSSUJVVEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQ0hBTkdFX0NPTlRFTlRfTU9ERUw7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fUkVOQU1FOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfSU5WQUxJRF9OQU1FOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTkFNRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1JFRkVSRU5DRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9VUERBVEVfTUFYSU1VTV9PQ0NVUlJFTkNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1VQREFURV9NSU5JTVVNX09DQ1VSUkVOQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9SRUFET05MWTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0lOQ0xVU0lWRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NPTExBUFNFX1dISVRFU1BBQ0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TUEVDSUZJQ19DT05TVFJBSU5UX1ZBTFVFUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1JFU1RSSUNUX1ZBTFVFU19CWTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VOVU1FUkFUSU9OUzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1BBVFRFUk5TOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTUlOSU1VTV9MRU5HVEg7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9NQVhJTVVNX0xFTkdUSDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NPTlNUUkFJTlRTX09OX0xFTkdUSF9PRjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NPTlNUUkFJTlRTX09OX1ZBTFVFX09GOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTUlOSU1VTV9WQUxVRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX01BWElNVU1fVkFMVUU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DT05UUkFJTlRTX09OOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfVFlQRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9DT05TVFJBSU5fTEVOR1RIOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX1VQREFURV9CT1VORFM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQ09MTEFQU0VfV0hJVEVTUEFDRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0JBU0U7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUl9JTlZBTElEX0ZJTEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FWFRFTlNJT05TOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9FWFRFTlNJT05fQ09NUE9ORU5UOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0RFTEVURV9FWFRFTlNJT05fQ09NUE9ORU5UOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfVVA7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9ET1dOOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRVhURU5TSU9OX0RFVEFJTFM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0RPQ1VNRU5UQVRJT047Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0VYVEVOU0lPTl9DT01QT05FTlRTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRVhURU5TSU9OX0NBVEVHT1JJRVM7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BRERfV0lUSF9ET1RTOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfREVMRVRFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRURJVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0FWQUlMQUJMRV9DT01QT05FTlRTX1RPX0FERDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VESVRfQ0FURUdPUlk7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUl9JTlZBTElEX0NBVEVHT1JZOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfRklMRV9DQU5OT1RfQkVfUEFSU0VEOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JfVkFMSURBVEVfVEhFX0ZJTEU7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9TQ0hFTUE7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BRERfQ0FURUdPUlk7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FUlJPUl9OQU1FX0FMUkVBRFlfVVNFRDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9CUk9XU0VfV09SS1NQQUNFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU0VMRUNUX1hTRF9GSUxFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfREVTQ1JJUFRJT05fQ0hPT1NFX1hTRF9GSUxFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0JST1dTRV9DQVRBTE9HOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9BTllfRUxFTUVOVDsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfQU5ZX0FUVFJJQlVURTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9TRVRfQkFTRV9UWVBFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVE9PTFRJUF9SRU5BTUVfUkVGQUNUT1I7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9WQUxVRV9DT0xPTjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0lEOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkVGOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRklYRUQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9ERUZBVUxUOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRk9STTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1VTQUdFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0NIQU5HRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9OQU1FU1BBQ0VfSU5GT1JNQVRJT05fQ0hBTkdFOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQUJTVFJBQ1Q7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9CTE9DSzsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0ZJTkFMOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU1VCU1RJVFVUSU9OX0dST1VQOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTUlYRUQ7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9WQUxVRTsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0ZPUk07Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OSUxMQUJMRTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtY29tbW9uL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvY29tbW9uL3V0aWwvWFNEQ29tbW9uVUlVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vdXRpbC9YU0RDb21tb25VSVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOTE5NWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vdXRpbC9YU0RDb21tb25VSVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbW9uLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW9uT3ZlcmxheUljb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFkdC5kZXNpZ24uSW1hZ2VPdmVybGF5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREluY2x1ZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETm90YXRpb25EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFJlZGVmaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFhQYXRoRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWFNEQ29tbW9uVUlVdGlscwotewotICBwdWJsaWMgWFNEQ29tbW9uVUlVdGlscygpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIEltYWdlIGdldFVwZGF0ZWRJbWFnZShYU0RDb25jcmV0ZUNvbXBvbmVudCBpbnB1dCwgSW1hZ2UgYmFzZUltYWdlLCBib29sZWFuIGlzUmVhZE9ubHkpCi0gIHsKLSAgICBYU0RBbm5vdGF0aW9uIHhzZEFubm90YXRpb24gPSBnZXRJbnB1dFhTREFubm90YXRpb24oaW5wdXQsIGZhbHNlKTsKLSAgICAKLSAgICBpZiAoeHNkQW5ub3RhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmICh4c2RBbm5vdGF0aW9uLmdldEFwcGxpY2F0aW9uSW5mb3JtYXRpb24oKS5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICAvLyBXaWxsIHVzZSB0aGUgY2xhc3MgbmFtZSBhcHBlbmRlZCBieSB0aGUgcmVhZCBvbmx5IHN0YXRlIGFzIHRoZSBuYW1lIG9mIHRoZSBpbWFnZS4KLSAgICAgICAgLy8gVGhlcmUgaXMgYSBkaXNhYmxlZCBhbmQgYW4gZW5hYmxlZCB2ZXJzaW9uIG9mIGVhY2ggYmFzZUltYWdlLCBzbyB3ZSBjYW4ndCBzaW1wbHkKLSAgICAgICAgLy8gdXNlIHRoZSBjb21wb25lbnQgbmFtZSBhcyB0aGUgbmFtZSBvZiB0aGUgaW1hZ2UKLSAgICAgICAgU3RyaW5nIGltYWdlTmFtZSA9IGlucHV0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgaXNSZWFkT25seTsKLSAgICAgICAgSW1hZ2UgbmV3SW1hZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlUmVnaXN0cnkoKS5nZXQoaW1hZ2VOYW1lKTsKLSAgICAgICAgaWYgKG5ld0ltYWdlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJbWFnZU92ZXJsYXlEZXNjcmlwdG9yIG92ciA9IG5ldyBJbWFnZU92ZXJsYXlEZXNjcmlwdG9yKGJhc2VJbWFnZSwgaXNSZWFkT25seSk7Ci0gICAgICAgICAgbmV3SW1hZ2UgPSBvdnIuZ2V0SW1hZ2UoKTsKLSAgICAgICAgICBYU0RFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlUmVnaXN0cnkoKS5wdXQoaW1hZ2VOYW1lLCBuZXdJbWFnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ld0ltYWdlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYmFzZUltYWdlOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBYU0RBbm5vdGF0aW9uIGdldElucHV0WFNEQW5ub3RhdGlvbihYU0RDb25jcmV0ZUNvbXBvbmVudCBpbnB1dCwgYm9vbGVhbiBjcmVhdGVJZk5vdEV4aXN0KQotICB7Ci0gICAgWFNEQW5ub3RhdGlvbiB4c2RBbm5vdGF0aW9uID0gbnVsbDsKLSAgICBYU0RGYWN0b3J5IGZhY3RvcnkgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRTsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB4c2RDb21wID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpbnB1dDsKLSAgICAgIHhzZEFubm90YXRpb24gPSB4c2RDb21wLmdldEFubm90YXRpb24oKTsKLSAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgeHNkQW5ub3RhdGlvbiA9IGZhY3RvcnkuY3JlYXRlWFNEQW5ub3RhdGlvbigpOwotICAgICAgICB4c2RDb21wLnNldEFubm90YXRpb24oeHNkQW5ub3RhdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiB4c2RDb21wID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkQ29tcCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGlucHV0OwotICAgICAgeHNkQW5ub3RhdGlvbiA9IHhzZENvbXAuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QgJiYgeHNkQW5ub3RhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gZmFjdG9yeS5jcmVhdGVYU0RBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHhzZENvbXAuc2V0QW5ub3RhdGlvbih4c2RBbm5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0ROb3RhdGlvbkRlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIFhTRE5vdGF0aW9uRGVjbGFyYXRpb24geHNkQ29tcCA9IChYU0ROb3RhdGlvbkRlY2xhcmF0aW9uKSBpbnB1dDsKLSAgICAgIHhzZEFubm90YXRpb24gPSB4c2RDb21wLmdldEFubm90YXRpb24oKTsKLSAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgeHNkQW5ub3RhdGlvbiA9IGZhY3RvcnkuY3JlYXRlWFNEQW5ub3RhdGlvbigpOwotICAgICAgICB4c2RDb21wLnNldEFubm90YXRpb24oeHNkQW5ub3RhdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEWFBhdGhEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIFhTRFhQYXRoRGVmaW5pdGlvbiB4c2RDb21wID0gKFhTRFhQYXRoRGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgewotICAgICAgWFNETW9kZWxHcm91cCB4c2RDb21wID0gKFhTRE1vZGVsR3JvdXApIGlucHV0OwotICAgICAgeHNkQW5ub3RhdGlvbiA9IHhzZENvbXAuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QgJiYgeHNkQW5ub3RhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gZmFjdG9yeS5jcmVhdGVYU0RBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHhzZENvbXAuc2V0QW5ub3RhdGlvbih4c2RBbm5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RDb21wID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBpbnB1dDsKLSAgICAgIHhzZEFubm90YXRpb24gPSB4c2RDb21wLmdldEFubm90YXRpb24oKTsKLSAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgeHNkQW5ub3RhdGlvbiA9IGZhY3RvcnkuY3JlYXRlWFNEQW5ub3RhdGlvbigpOwotICAgICAgICB4c2RDb21wLnNldEFubm90YXRpb24oeHNkQW5ub3RhdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIHhzZENvbXAgPSAoWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbikgaW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTRFdpbGRjYXJkKQotICAgIHsKLSAgICAgIFhTRFdpbGRjYXJkIHhzZENvbXAgPSAoWFNEV2lsZGNhcmQpIGlucHV0OwotICAgICAgeHNkQW5ub3RhdGlvbiA9IHhzZENvbXAuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QgJiYgeHNkQW5ub3RhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gZmFjdG9yeS5jcmVhdGVYU0RBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHhzZENvbXAuc2V0QW5ub3RhdGlvbih4c2RBbm5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0gICAgewotICAgICAgWFNEU2NoZW1hIHhzZENvbXAgPSAoWFNEU2NoZW1hKSBpbnB1dDsKLSAgICAgIExpc3QgbGlzdCA9IHhzZENvbXAuZ2V0QW5ub3RhdGlvbnMoKTsKLSAgICAgIGlmIChsaXN0LnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSAoWFNEQW5ub3RhdGlvbikgbGlzdC5nZXQoMCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgICBpZiAoeHNkQ29tcC5nZXRDb250ZW50cygpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgeHNkQ29tcC5nZXRDb250ZW50cygpLmFkZCgwLCB4c2RBbm5vdGF0aW9uKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB4c2RBbm5vdGF0aW9uOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREZhY2V0KQotICAgIHsKLSAgICAgIFhTREZhY2V0IHhzZENvbXAgPSAoWFNERmFjZXQpIGlucHV0OwotICAgICAgeHNkQW5ub3RhdGlvbiA9IHhzZENvbXAuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QgJiYgeHNkQW5ub3RhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gZmFjdG9yeS5jcmVhdGVYU0RBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHhzZENvbXAuc2V0QW5ub3RhdGlvbih4c2RBbm5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBYU0RUeXBlRGVmaW5pdGlvbiB4c2RDb21wID0gKFhTRFR5cGVEZWZpbml0aW9uKSBpbnB1dDsKLSAgICAgIHhzZEFubm90YXRpb24gPSB4c2RDb21wLmdldEFubm90YXRpb24oKTsKLSAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgeHNkQW5ub3RhdGlvbiA9IGZhY3RvcnkuY3JlYXRlWFNEQW5ub3RhdGlvbigpOwotICAgICAgICB4c2RDb21wLnNldEFubm90YXRpb24oeHNkQW5ub3RhdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNESW5jbHVkZSkKLSAgICB7Ci0gICAgICBYU0RJbmNsdWRlIHhzZENvbXAgPSAoWFNESW5jbHVkZSkgaW5wdXQ7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0geHNkQ29tcC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICBpZiAoY3JlYXRlSWZOb3RFeGlzdCAmJiB4c2RBbm5vdGF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSBmYWN0b3J5LmNyZWF0ZVhTREFubm90YXRpb24oKTsKLSAgICAgICAgeHNkQ29tcC5zZXRBbm5vdGF0aW9uKHhzZEFubm90YXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREltcG9ydCkKLSAgICB7Ci0gICAgICBYU0RJbXBvcnQgeHNkQ29tcCA9IChYU0RJbXBvcnQpIGlucHV0OwotICAgICAgeHNkQW5ub3RhdGlvbiA9IHhzZENvbXAuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgaWYgKGNyZWF0ZUlmTm90RXhpc3QgJiYgeHNkQW5ub3RhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB4c2RBbm5vdGF0aW9uID0gZmFjdG9yeS5jcmVhdGVYU0RBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHhzZENvbXAuc2V0QW5ub3RhdGlvbih4c2RBbm5vdGF0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICB7Ci0gICAgICBYU0RSZWRlZmluZSB4c2RDb21wID0gKFhTRFJlZGVmaW5lKSBpbnB1dDsKLSAgICAgIExpc3QgbGlzdCA9IHhzZENvbXAuZ2V0QW5ub3RhdGlvbnMoKTsKLSAgICAgIGlmIChsaXN0LnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIHhzZEFubm90YXRpb24gPSAoWFNEQW5ub3RhdGlvbikgbGlzdC5nZXQoMCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0ICYmIHhzZEFubm90YXRpb24gPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vID8KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHhzZEFubm90YXRpb247Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQW5ub3RhdGlvbikKLSAgICB7Ci0gICAgICB4c2RBbm5vdGF0aW9uID0gKFhTREFubm90YXRpb24pIGlucHV0OwotICAgIH0KLQotICAgIGlmIChjcmVhdGVJZk5vdEV4aXN0KQotICAgIHsKLSAgICAgIGZvcm1hdEFubm90YXRpb24oeHNkQW5ub3RhdGlvbik7Ci0gICAgfQotCi0gICAgcmV0dXJuIHhzZEFubm90YXRpb247Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIGZvcm1hdEFubm90YXRpb24oWFNEQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gYW5ub3RhdGlvbi5nZXRFbGVtZW50KCk7Ci0gICAgZm9ybWF0Q2hpbGQoZWxlbWVudCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgZm9ybWF0Q2hpbGQoTm9kZSBjaGlsZCkKLSAgewotICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgIElET01Nb2RlbCBtb2RlbCA9ICgoSURPTU5vZGUpIGNoaWxkKS5nZXRNb2RlbCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcgbW9kZWwgY2hhbmdlCi0gICAgICAgIG1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0gICAgICAgIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvciA9IG5ldyBGb3JtYXRQcm9jZXNzb3JYTUwoKTsKLSAgICAgICAgZm9ybWF0UHJvY2Vzc29yLmZvcm1hdE5vZGUoY2hpbGQpOwotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICAvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZyBtb2RlbCBjaGFuZ2UKLSAgICAgICAgbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlVW5pcXVlRWxlbWVudE5hbWUoU3RyaW5nIHByZWZpeCwgTGlzdCBlbGVtZW50cykKLSAgewotICAgIEFycmF5TGlzdCB1c2VkTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIHVzZWROYW1lcy5hZGQoZ2V0RGlzcGxheU5hbWUoKFhTRE5hbWVkQ29tcG9uZW50KSBpLm5leHQoKSkpOwotICAgIH0KLQotICAgIGludCBpID0gMTsKLSAgICBTdHJpbmcgdGVzdE5hbWUgPSBwcmVmaXg7Ci0gICAgd2hpbGUgKHVzZWROYW1lcy5jb250YWlucyh0ZXN0TmFtZSkpCi0gICAgewotICAgICAgdGVzdE5hbWUgPSBwcmVmaXggKyBpKys7Ci0gICAgfQotICAgIHJldHVybiB0ZXN0TmFtZTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKFhTRE5hbWVkQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgewotICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbikKLSAgICAgIHJldHVybiBnZXREaXNwbGF5TmFtZUZyb21YU0RUeXBlKChYU0RUeXBlRGVmaW5pdGlvbikgY29tcG9uZW50KTsKLQotICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RGZWF0dXJlKQotICAgIHsKLSAgICAgIFhTREZlYXR1cmUgZmVhdHVyZSA9IChYU0RGZWF0dXJlKSBjb21wb25lbnQ7Ci0gICAgICBpZiAoZmVhdHVyZS5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIGZlYXR1cmUuZ2V0TmFtZSgpOwotICAgICAgZWxzZSBpZiAoZmVhdHVyZS5nZXRSZXNvbHZlZEZlYXR1cmUoKSAhPSBudWxsICYmIGZlYXR1cmUuZ2V0UmVzb2x2ZWRGZWF0dXJlKCkuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgIHJldHVybiBmZWF0dXJlLmdldFJlc29sdmVkRmVhdHVyZSgpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY29tcG9uZW50LmdldE5hbWUoKTsKLQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWVGcm9tWFNEVHlwZShYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgcmV0dXJuIGdldERpc3BsYXlOYW1lRnJvbVhTRFR5cGUodHlwZSwgdHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREaXNwbGF5TmFtZUZyb21YU0RUeXBlKFhTRFR5cGVEZWZpbml0aW9uIHR5cGUsIGJvb2xlYW4gcmV0dXJuUHJpbWl0aXZlUGFyZW50cykKLSAgewotICAgIGlmICh0eXBlID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLQotICAgIGlmICh0eXBlLmdldE5hbWUoKSA9PSBudWxsIHx8IHR5cGUuZ2V0TmFtZSgpLmxlbmd0aCgpID09IDApCi0gICAgewotICAgICAgaWYgKHJldHVyblByaW1pdGl2ZVBhcmVudHMgJiYgaXNQcmltaXRpdmVUeXBlKHR5cGUpKQotICAgICAgewotICAgICAgICByZXR1cm4gZ2V0RGlzcGxheU5hbWVGcm9tWFNEVHlwZSh0eXBlLmdldEJhc2VUeXBlKCkpOwotICAgICAgfQotCi0gICAgICBFT2JqZWN0IGNvbnRhaW5lciA9IHR5cGUuZUNvbnRhaW5lcigpOwotCi0gICAgICB3aGlsZSAoY29udGFpbmVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCAmJiAoKFhTRE5hbWVkQ29tcG9uZW50KSBjb250YWluZXIpLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuICgoWFNETmFtZWRDb21wb25lbnQpIGNvbnRhaW5lcikuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHR5cGUuZ2V0TmFtZSgpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlVHlwZShYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBYU0RUeXBlRGVmaW5pdGlvbiBiYXNlVHlwZSA9IG51bGw7Ci0gICAgaWYgKHR5cGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBiYXNlVHlwZSA9IHR5cGUuZ2V0QmFzZVR5cGUoKTsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIG9yaWdUeXBlID0gYmFzZVR5cGU7IC8vIEtDOiBhbHRob3VnaCBpbnZhbGlkLCB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgY3ljbGVzIGFuZCB0byBhdm9pZCBhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZpbml0ZSBsb29wCi0gICAgICB3aGlsZSAoYmFzZVR5cGUgIT0gbnVsbCAmJiAhWFNEQ29uc3RhbnRzLmlzQW55U2ltcGxlVHlwZShiYXNlVHlwZSkgJiYgIVhTRENvbnN0YW50cy5pc0FueVR5cGUoYmFzZVR5cGUpICYmIG9yaWdUeXBlICE9IGJhc2VUeXBlKQotICAgICAgewotICAgICAgICB0eXBlID0gYmFzZVR5cGU7Ci0gICAgICAgIGJhc2VUeXBlID0gdHlwZS5nZXRCYXNlVHlwZSgpOwotICAgICAgfQotICAgICAgYmFzZVR5cGUgPSB0eXBlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiAoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLmVxdWFscyhiYXNlVHlwZS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBnZXRBbm9ueW1vdXNTaW1wbGVUeXBlKFhTREZlYXR1cmUgaW5wdXQsIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICB7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24gYW5vbnltb3VzU2ltcGxlVHlwZSA9IG51bGw7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gbG9jYWxUeXBlID0gbnVsbDsKLQotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBsb2NhbFR5cGUgPSAoKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaW5wdXQpLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pCi0gICAgewotICAgICAgbG9jYWxUeXBlID0gKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgaW5wdXQpLmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCk7Ci0gICAgfQotCi0gICAgaWYgKGxvY2FsVHlwZSBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGFub255bW91c1NpbXBsZVR5cGUgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGxvY2FsVHlwZTsKLSAgICB9Ci0gICAgcmV0dXJuIGFub255bW91c1NpbXBsZVR5cGU7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q2hpbGRFbGVtZW50cyhYU0RNb2RlbEdyb3VwIGdyb3VwKQotICB7Ci0gICAgTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoZ3JvdXAgPT0gbnVsbCkgcmV0dXJuIGNoaWxkcmVuOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdyb3VwLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFBhcnRpY2xlIG5leHQgPSAoWFNEUGFydGljbGUpIGkubmV4dCgpOwotICAgICAgaWYgKG5leHQuZ2V0Q29udGVudCgpIGluc3RhbmNlb2YgWFNERmVhdHVyZSkKLSAgICAgIHsKLSAgICAgICAgY2hpbGRyZW4uYWRkKG5leHQuZ2V0Q29udGVudCgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG5leHQuZ2V0VGVybSgpIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgIHsKLSAgICAgICAgY2hpbGRyZW4uYWRkQWxsKGdldENoaWxkRWxlbWVudHMoKFhTRE1vZGVsR3JvdXApIG5leHQuZ2V0VGVybSgpKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjaGlsZHJlbjsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxBdHRyaWJ1dGVzKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c2RDb21wbGV4VHlwZSkKLSAgewotICAgIExpc3QgYXR0cmlidXRlcyA9IGdldENoaWxkRWxlbWVudHMoeHNkQ29tcGxleFR5cGUpOwotICAgIGF0dHJpYnV0ZXMuYWRkQWxsKGdldENoaWxkQXR0cmlidXRlcyh4c2RDb21wbGV4VHlwZSkpOwotCi0gICAgcmV0dXJuIGF0dHJpYnV0ZXM7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsQXR0cmlidXRlcyhYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgewotICAgIExpc3QgYXR0cmlidXRlcyA9IGdldENoaWxkRWxlbWVudHMoeHNkTW9kZWxHcm91cERlZmluaXRpb24pOwotCi0gICAgcmV0dXJuIGF0dHJpYnV0ZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRJbmhlcml0ZWRBdHRyaWJ1dGVzKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjdCkKLSAgewotICAgIExpc3QgYXR0cnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gcGFyZW50ID0gY3QuZ2V0QmFzZVR5cGVEZWZpbml0aW9uKCk7Ci0gICAgaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiAmJiBjdC5pc1NldERlcml2YXRpb25NZXRob2QoKSkKLSAgICB7Ci0gICAgICBhdHRycy5hZGRBbGwoZ2V0QWxsQXR0cmlidXRlcygoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSBwYXJlbnQpKTsKLSAgICAgIGlmICghIGN0LmlzQ2lyY3VsYXIoKSkgYXR0cnMuYWRkQWxsKGdldEluaGVyaXRlZEF0dHJpYnV0ZXMoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgcGFyZW50KSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGF0dHJzOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldENoaWxkRWxlbWVudHMoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0KQotICB7Ci0gICAgcmV0dXJuIGdldENoaWxkRWxlbWVudHMoZ2V0TW9kZWxHcm91cChjdCkpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q2hpbGRFbGVtZW50cyhYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgewotICAgIHJldHVybiBnZXRDaGlsZEVsZW1lbnRzKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldE1vZGVsR3JvdXAoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgWFNETW9kZWxHcm91cCBnZXRNb2RlbEdyb3VwKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjVHlwZSkKLSAgewotICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gY1R5cGUuZ2V0Q29tcGxleFR5cGUoKTsKLQotICAgIGlmIChwYXJ0aWNsZSA9PSBudWxsIHx8IHBhcnRpY2xlLmVDb250YWluZXIoKSAhPSBjVHlwZSkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgT2JqZWN0IHBhcnRpY2xlQ29udGVudCA9IHBhcnRpY2xlLmdldENvbnRlbnQoKTsKLSAgICBYU0RNb2RlbEdyb3VwIGdyb3VwID0gbnVsbDsKLQotICAgIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICAgIGdyb3VwID0gKChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbikgcGFydGljbGVDb250ZW50KS5nZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKCkuZ2V0TW9kZWxHcm91cCgpOwotICAgIGVsc2UgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICBncm91cCA9IChYU0RNb2RlbEdyb3VwKSBwYXJ0aWNsZUNvbnRlbnQ7Ci0KLSAgICBpZiAoZ3JvdXAgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgaWYgKGdyb3VwLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpIHx8IGdyb3VwLmVSZXNvdXJjZSgpICE9IGNUeXBlLmVSZXNvdXJjZSgpKQotICAgIHsKLSAgICAgIFhTRENvbXBsZXhUeXBlQ29udGVudCBjb250ZW50ID0gY1R5cGUuZ2V0Q29udGVudCgpOwotICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgICAgZ3JvdXAgPSAoWFNETW9kZWxHcm91cCkgKChYU0RQYXJ0aWNsZSkgY29udGVudCkuZ2V0Q29udGVudCgpOwotICAgIH0KLQotICAgIHJldHVybiBncm91cDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDaGlsZEF0dHJpYnV0ZXMoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGN0KQotICB7Ci0gICAgRUxpc3QgYXR0ckNvbnRlbnRzID0gY3QuZ2V0QXR0cmlidXRlQ29udGVudHMoKTsKLSAgICBMaXN0IGF0dHJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0ckNvbnRlbnRzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIE9iamVjdCBuZXh0ID0gYXR0ckNvbnRlbnRzLmdldChpKTsKLQotICAgICAgaWYgKG5leHQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVVc2UpCi0gICAgICB7Ci0gICAgICAgIGF0dHJzLmFkZCgoKFhTREF0dHJpYnV0ZVVzZSkgbmV4dCkuZ2V0Q29udGVudCgpLmdldFJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24oKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChuZXh0IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICAvL1hTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBhdHRyR3JvdXAgPSAoWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSBuZXh0OwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYXR0cnM7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlV2l0aEVycm9yT3ZlcmxheShYU0RDb25jcmV0ZUNvbXBvbmVudCBpbnB1dCwgSW1hZ2UgYmFzZUltYWdlLCBib29sZWFuIGlzUmVhZE9ubHkpCi0gIHsKLSAgICBJbWFnZSBleHRlbnNpb25JbWFnZSA9IGdldFVwZGF0ZWRJbWFnZShpbnB1dCwgYmFzZUltYWdlLCBpc1JlYWRPbmx5KTsKLSAgICBJbWFnZURlc2NyaXB0b3IgZXJyb3JPdmVybGF5ID0gWFNERWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvb3ZyMTYvZXJyb3Jfb3ZyLmdpZiIpOyAgLy8kTk9OLU5MUy0xJAotICAgIGlmIChiYXNlSW1hZ2UgPT0gZXh0ZW5zaW9uSW1hZ2UpCi0gICAgewotICAgICAgU3RyaW5nIGltYWdlTmFtZSA9IGlucHV0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl9lcnJvcl8iICsgaXNSZWFkT25seTsKLSAgICAgIEltYWdlIG5ld0ltYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGltYWdlTmFtZSk7Ci0gICAgICBpZiAobmV3SW1hZ2UgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgRGVjb3JhdGlvbk92ZXJsYXlJY29uIG92ciA9IG5ldyBEZWNvcmF0aW9uT3ZlcmxheUljb24oYmFzZUltYWdlLCBlcnJvck92ZXJsYXksIElEZWNvcmF0aW9uLlRPUF9MRUZUKTsKLSAgICAgICAgbmV3SW1hZ2UgPSBvdnIuY3JlYXRlSW1hZ2UoKTsKLSAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KGltYWdlTmFtZSwgbmV3SW1hZ2UpOwotICAgICAgfQotICAgICAgcmV0dXJuIG5ld0ltYWdlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3RyaW5nIGltYWdlTmFtZSA9IGlucHV0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl9leHRlbnNpb25fZXJyb3JfIiArIGlzUmVhZE9ubHk7Ci0gICAgICBJbWFnZSBuZXdJbWFnZSA9IFhTREVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChpbWFnZU5hbWUpOwotICAgICAgaWYgKG5ld0ltYWdlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIERlY29yYXRpb25PdmVybGF5SWNvbiBvdnIgPSBuZXcgRGVjb3JhdGlvbk92ZXJsYXlJY29uKGV4dGVuc2lvbkltYWdlLCBlcnJvck92ZXJsYXksIElEZWNvcmF0aW9uLlRPUF9MRUZUKTsKLSAgICAgICAgbmV3SW1hZ2UgPSBvdnIuY3JlYXRlSW1hZ2UoKTsKLSAgICAgICAgWFNERWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KGltYWdlTmFtZSwgbmV3SW1hZ2UpOwotICAgICAgfQotICAgICAgcmV0dXJuIG5ld0ltYWdlOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi91dGlsL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLWNvbW1vbi9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL2NvbW1vbi91dGlsL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmM2Y2MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1jb21tb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9jb21tb24vdXRpbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLV9VSV9BQ1RJT05fT1BFTl9JTl9ORVdfRURJVE9SPU9wZW4gSW4gTmV3IEVkaXRvcgotX1VJX0FDVElPTl9ERUxFVEVfQ09OU1RSQUlOVFM9RGVsZXRlIENvbnN0cmFpbnRzCi1fVUlfQUNUSU9OX0RFTEVURV9FTlVNRVJBVElPTj1EZWxldGUgRW51bWVyYXRpb24KLV9VSV9BQ1RJT05fREVMRVRFX0FQUElORk9fRUxFTUVOVD1EZWxldGUgQXBwSW5mbyBFbGVtZW50Ci1fVUlfQUNUSU9OX0RFTEVURV9BUFBJTkZPX0FUVFJJQlVURT1EZWxldGUgQXBwSW5mbyBBdHRyaWJ1dGUKLV9VSV9BQ1RJT05fREVMRVRFX0VYVEVOU0lPTl9DT01QT05FTlQ9RGVsZXRlIEV4dGVuc2lvbiBDb21wb25lbnQKLV9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUD1BZGQgQXR0cmlidXRlIEdyb3VwCi1fVUlfQUNUSU9OX0FERF9BUFBJTkZPX0VMRU1FTlQ9QWRkIEFwcEluZm8gRWxlbWVudAotX1VJX0FDVElPTl9BRERfQVRUUklCVVRFPUFkZCBBdHRyaWJ1dGUKLV9VSV9BQ1RJT05fQUREX0dST1VQX1JFRj1BZGQgR3JvdXAgUmVmCi1fVUlfQUNUSU9OX0FERF9BTllfRUxFTUVOVD1BZGQgQW4meQotX1VJX0FDVElPTl9BRERfQU5ZX0FUVFJJQlVURT1BZGQgQW55IEF0dHJpYnV0ZQotX1VJX0FDVElPTl9BRERfV0lUSF9ET1RTPUFkZC4uLgotX1VJX0FDVElPTl9VUERBVEVfQk9VTkRTPVVwZGF0ZSBib3VuZHMKLV9VSV9BQ1RJT05fQUREX0NPTVBMRVhfVFlQRT1BZGQgQ29tcGxleCBUeXBlCi1fVUlfQUNUSU9OX0FERF9FTlVNRVJBVElPTlM9QWRkIEVudW1lcmF0aW9ucwotX1VJX0FDVElPTl9BRERfRE9DVU1FTlRBVElPTj1BZGQgRG9jdW1lbnRhdGlvbgotX1VJX0FDVElPTl9DT05TVFJBSU5fTEVOR1RIPUNvbnN0cmFpbiBsZW5ndGgKLV9VSV9BQ1RJT05fQlJPV1NFX1dPUktTUEFDRT1Xb3Jrc3BhY2UKLV9VSV9MQUJFTF9OT19JVEVNU19TRUxFQ1RFRD1ObyBpdGVtcyBzZWxlY3RlZAotX1VJX0xBQkVMX0VYVEVOU0lPTl9ERVRBSUxTPUV4dGVuc2lvbiBEZXRhaWxzCi1fVUlfTEFCRUxfRVhURU5TSU9OX0NBVEVHT1JJRVM9RXh0ZW5zaW9uIENhdGVnb3JpZXM6Ci1fVUlfTEFCRUxfQ09MTEFQU0VfV0hJVEVTUEFDRT1Db2xsYXBzZSB3aGl0ZXNwYWNlCi1fVUlfTEFCRUxfUkVTVFJJQ1RfVkFMVUVTX0JZPVJlc3RyaWN0IHZhbHVlcyBieToKLV9VSV9MQUJFTF9NSU5JTVVNX0xFTkdUSD1NaW5pbXVtIGxlbmd0aDoKLV9VSV9MQUJFTF9NQVhJTVVNX0xFTkdUSD1NYXhpbXVtIGxlbmd0aDoKLV9VSV9MQUJFTF9TRUxFQ1RfWFNEX0ZJTEU9U2VsZWN0IFhTRCBmaWxlCi1fVUlfTEFCRUxfQ09OU1RSQUlOVFNfT05fVkFMVUVfT0Y9Q29uc3RyYWludHMgb24gdmFsdWUgb2YgCi1fVUlfQUNUSU9OX0FERF9TSU1QTEVfVFlQRT1BZGQgU2ltcGxlIFR5cGUKLV9VSV9BQ1RJT05fRURJVF9XSVRIX0RPVFM9RWRpdC4uLgotX1VJX0FDVElPTl9DSEFOR0VfUEFUVEVSTj1DaGFuZ2UgcGF0dGVybgotX1VJX0FDVElPTl9BRERfRU5VTUVSQVRJT049QWRkIEVudW1lcmF0aW9uCi1fVUlfQUNUSU9OX0RFTEVURV9QQVRURVJOPURlbGV0ZSBQYXR0ZXJuCi1fVUlfQUNUSU9OX0JST1dTRV9DQVRBTE9HPUNhdGFsb2cKLV9VSV9BQ1RJT05fQUREX0dST1VQPUFkZCBHcm91cAotX1VJX0FDVElPTl9BRERfUEFUVEVSTj1BZGQgcGF0dGVybgotX1VJX0FDVElPTl9TRVRfQkFTRV9UWVBFPVNldCBCYXNlIFR5cGUKLV9VSV9FUlJPUl9JTlZBTElEX05BTUU9SW52YWxpZCBuYW1lCi1fVUlfRVJST1JfSU5WQUxJRF9GSUxFPUludmFsaWQgZmlsZQotX1VJX0VSUk9SX0lOVkFMSURfQ0FURUdPUlk9SW52YWxpZCBDYXRlZ29yeQotX1VJX0FDVElPTl9ERUxFVEU9RGVsZXRlCi1fVUlfQUNUSU9OX0FERD1BZGQKLV9VSV9BQ1RJT05fUkVOQU1FPVJlbmFtZQotX1VJX0xBQkVMX1BBVFRFUk49UGF0dGVybgotX1VJX0xBQkVMX1BBVFRFUk5TPVBhdHRlcm5zCi1fVUlfTEFCRUxfTkFNRT1OYW1lOgotX1VJX0xBQkVMX1RZUEU9VHlwZTogCi1fVUlfTEFCRUxfQkFTRT1CYXNlCi1fVUlfTEFCRUxfVVA9VXAKLV9VSV9MQUJFTF9ET1dOPURvd24KLV9VSV9MQUJFTF9ERUxFVEU9RGVsZXRlCi1fVUlfTEFCRUxfU0NIRU1BPVNjaGVtYToKLV9VSV9MQUJFTF9FRElUPUVkaXQKLV9VSV9MQUJFTF9SRUZFUkVOQ0U9UmVmZXJlbmNlOgotX1VJX0xBQkVMX1JFQURPTkxZPVJlYWRPbmx5Ci1fVUlfTEFCRUxfSU5DTFVTSVZFPUluY2x1c2l2ZQotX1VJX0xBQkVMX0VOVU1FUkFUSU9OUz1FbnVtZXJhdGlvbnMKLV9VSV9MQUJFTF9FWFRFTlNJT05TPUV4dGVuc2lvbnMKLV9VSV9MQUJFTF9NSU5JTVVNX1ZBTFVFPU1pbmltdW0gdmFsdWU6Ci1fVUlfTEFCRUxfTUFYSU1VTV9WQUxVRT1NYXhpbXVtIHZhbHVlOgotX1VJX0xBQkVMX0NPTlRSQUlOVFNfT049Q29uc3RyYWludHMgb24gCi1fVUlfTEFCRUxfQUREX1dJVEhfRE9UUz1BZGQuLi4KLV9VSV9MQUJFTF9BRERfQ0FURUdPUlk9QWRkIENhdGVnb3J5Ci1fVUlfTEFCRUxfRURJVF9DQVRFR09SWT1FZGl0IENhdGVnb3J5Ci1fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVBfUkVGPUFkZCBBdHRyaWJ1dGUgR3JvdXAgUmVmCi1fVUlfQUNUSU9OX0FERF9FWFRFTlNJT05fQ09NUE9ORU5UPUFkZCBFeHRlbnNpb24gQ29tcG9uZW50Ci1fVUlfQUNUSU9OX0FERF9FWFRFTlNJT05fQ09NUE9ORU5UUz1BZGQgRXh0ZW5zaW9uIENvbXBvbmVudHMKLV9VSV9MQUJFTF9DT05TVFJBSU5UU19PTl9MRU5HVEhfT0Y9Q29uc3RyYWludHMgb24gbGVuZ3RoIG9mIAotX1VJX0FDVElPTl9BRERfQVBQSU5GT19BVFRSSUJVVEU9QWRkIEFwcEluZm8gQXR0cmlidXRlCi1fVUlfQUNUSU9OX1NFVF9FTlVNRVJBVElPTl9WQUxVRT1TZXQgRW51bWVyYXRpb24gVmFsdWUKLV9VSV9BQ1RJT05fVVBEQVRFX0VMRU1FTlRfUkVGRVJFTkNFPVVwZGF0ZSBFbGVtZW50IFJlZmVyZW5jZQotX1VJX0FDVElPTl9VUERBVEVfTUFYSU1VTV9PQ0NVUlJFTkNFPVVwZGF0ZSBNYXhpbXVtIE9jY3VycmVuY2UKLV9VSV9BQ1RJT05fVVBEQVRFX01JTklNVU1fT0NDVVJSRU5DRT1VcGRhdGUgTWluaW11bSBPY2N1cnJlbmNlCi1fVUlfQUNUSU9OX0NIQU5HRV9NQVhJTVVNX09DQ1VSUkVOQ0U9TWF4aW11bSBPY2N1cnJlbmNlIENoYW5nZSAKLV9VSV9BQ1RJT05fQ0hBTkdFX01JTklNVU1fT0NDVVJSRU5DRT1NaW5pbXVtIE9jY3VycmVuY2UgQ2hhbmdlCi1fVUlfTEFCRUxfU1BFQ0lGSUNfQ09OU1RSQUlOVF9WQUxVRVM9U3BlY2lmaWMgY29uc3RyYWludCB2YWx1ZXMKLV9VSV9MQUJFTF9BVkFJTEFCTEVfQ09NUE9ORU5UU19UT19BREQ9QXZhaWxhYmxlIGNvbXBvbmVudHMgdG8gQWRkOgotX1VJX0FDVElPTl9DSEFOR0VfQ09OVEVOVF9NT0RFTD1DaGFuZ2UgQ29udGVudCBNb2RlbAotX1VJX0VSUk9SX0ZJTEVfQ0FOTk9UX0JFX1BBUlNFRD1UaGUgeHNkIGZpbGUgb2YgdGhlIHNlbGVjdGVkIGNhdGVnb3J5IGNhbm5vdCBiZSBwYXJzZWQuCi1fVUlfREVTQ1JJUFRJT05fQ0hPT1NFX1hTRF9GSUxFPUNob29zZSBhbiBYU0QgZmlsZSBjb250YWluaW5nIHNjaGVtYSBmb3IgeW91ciBleHRlbnNpYmxlIGNvbXBvbmVudHMKLV9VSV9FUlJPUl9WQUxJREFURV9USEVfRklMRT1QbGVhc2UgdmFsaWRhdGUgdGhlIGZpbGUuCi1fVUlfRVJST1JfTkFNRV9BTFJFQURZX1VTRUQ9VGhlIG5hbWUgaXMgYWxyZWFkeSBiZWluZyB1c2VkLgotX1VJX0FDVElPTl9DT0xMQVBTRV9XSElURVNQQUNFPUNvbGxhcHNlIHdoaXRlc3BhY2UKLV9VSV9BQ1RJT05fQUREX0FUVFJJQlVURV9HUk9VUF9ERUZJTklUSU9OPUFkZCBBdHRyaWJ1dGUgR3JvdXAgRGVmaW5pdGlvbgotX1VJX0VSUk9SX0lOVkFMSURfVkFMVUVfRk9SX01BWElNVU1fT0NDVVJSRU5DRT1JbnZhbGlkIHZhbHVlIGZvciBtYXhpbXVtIG9jY3VycmVuY2UKLV9VSV9UT09MVElQX1JFTkFNRV9SRUZBQ1RPUj1DbGljayBoZXJlIHRvIGludm9rZSB0aGUgUmVuYW1lIHJlZmFjdG9yaW5nLgotX1VJX1ZBTFVFX0NPTE9OPVZhbHVlOgotX1VJX0lEPUlEOgotX1VJX1JFRj1SZWZlcmVuY2U6Ci1fVUlfRklYRUQ9Rml4ZWQKLV9VSV9ERUZBVUxUPURlZmF1bHQKLV9VSV9GT1JNPUZvcm0gcXVhbGlmaWNhdGlvbjoKLSMgVGhlIGZvbGxvd2luZyBzdHJpbmcgd2lsbCBiZSB1c2VkIGZvciB0aGUgdW5kbyBhY3Rpb24uICBBbgotIyBleGFtcGxlIGxhYmVsIGlzOiBVbmRvIEFic3RyYWN0IENoYW5nZQotX1VJX0FDVElPTl9DSEFOR0U9ezB9IENoYW5nZQotX1VJX0FDVElPTl9OQU1FU1BBQ0VfSU5GT1JNQVRJT05fQ0hBTkdFPU5hbWVzcGFjZSBJbmZvcm1hdGlvbiBDaGFuZ2UKLV9VSV9MQUJFTF9BQlNUUkFDVD1BYnN0cmFjdAotX1VJX0xBQkVMX0JMT0NLPUJsb2NrCi1fVUlfTEFCRUxfRklOQUw9RmluYWwKLV9VSV9MQUJFTF9TVUJTVElUVVRJT05fR1JPVVA9U3Vic3RpdHV0aW9uIEdyb3VwCi1fVUlfTEFCRUxfTUlYRUQ9TWl4ZWQKLV9VSV9MQUJFTF9WQUxVRT1WYWx1ZQotX1VJX1VTQUdFPVVzYWdlCi1fVUlfTEFCRUxfRk9STT1Gb3JtCi1fVUlfTEFCRUxfTklMTEFCTEU9TmlsbGFibGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9DaGVja3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9DaGVja3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIwMjgwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvQ2hlY2tzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuTmFtZVZhbGlkYXRvcjsKLQotcHVibGljIGNsYXNzIENoZWNrcyB7Ci0JCi0JcHVibGljIHN0YXRpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJUmVmYWN0b3JpbmdTdGF0dXMgcmVzdWx0PSBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQkJaWYgKCIiLmVxdWFscyhuYW1lKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIFJlZmFjdG9yaW5nU3RhdHVzLmNyZWF0ZUZhdGFsRXJyb3JTdGF0dXMoIlJlZmFjdG9yaW5nTWVzc2FnZXMuQ2hlY2tzX0Nob29zZV9uYW1lIik7ICAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FscmVhZHlOYW1lZChSZWZhY3RvcmluZ0NvbXBvbmVudCBlbGVtZW50LCBTdHJpbmcgbmFtZSl7Ci0JCXJldHVybiBuYW1lLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb21wb25lbnROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVJlZmFjdG9yaW5nU3RhdHVzIHJlc3VsdD0gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JCWlmICghTmFtZVZhbGlkYXRvci5pc1ZhbGlkKG5hbWUpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gUmVmYWN0b3JpbmdTdGF0dXMuY3JlYXRlRmF0YWxFcnJvclN0YXR1cygiUmVmYWN0b3JpbmdNZXNzYWdlcy5DaGVja3NfQ2hvb3NlX25hbWUiKTsgIC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL0lOYW1lVXBkYXRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9JTmFtZVVwZGF0aW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmODk2NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL0lOYW1lVXBkYXRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotCi0vKioKLSAqIEBhdXRob3IgZWJlbGlzYXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJTmFtZVVwZGF0aW5nIHsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE5ld0VsZW1lbnROYW1lKFN0cmluZyBuZXdOYW1lKTsKLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE5ld0VsZW1lbnROYW1lKCk7Ci0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRDdXJyZW50RWxlbWVudE5hbWUoKTsKLSAgICBwdWJsaWMgYWJzdHJhY3QgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tOZXdFbGVtZW50TmFtZShTdHJpbmcgbmV3TmFtZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL0lSZWZlcmVuY2VVcGRhdGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL0lSZWZlcmVuY2VVcGRhdGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmY0OGZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9JUmVmZXJlbmNlVXBkYXRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3RvcjsKLQotcHVibGljIGludGVyZmFjZSBJUmVmZXJlbmNlVXBkYXRpbmcgewotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoaXMgcmVmYWN0b3Jpbmcgb2JqZWN0IGlzIGNhcGFibGUgb2YgdXBkYXRpbmcgcmVmZXJlbmNlcyB0byB0aGUgcmVuYW1lZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkVuYWJsZVVwZGF0ZVJlZmVyZW5jZXMoKTsKLQotCS8qKgotCSAqIElmIDxjb2RlPmNhblVwZGF0ZVJlZmVyZW5jZXM8L2NvZGU+IHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZW4gdGhpcyBtZXRob2QgaXMgdXNlZCB0bwotCSAqIGluZm9ybSB0aGUgcmVmYWN0b3Jpbmcgb2JqZWN0IHdoZXRoZXIgcmVmZXJlbmNlcyBzaG91bGQgYmUgdXBkYXRlZC4KLQkgKiBUaGlzIGNhbGwgY2FuIGJlIGlnbm9yZWQgaWYgIDxjb2RlPmNhblVwZGF0ZVJlZmVyZW5jZXM8L2NvZGU+IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqLwkKLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVSZWZlcmVuY2VzKGJvb2xlYW4gdXBkYXRlKTsKLQotCS8qKgotCSAqIElmIDxjb2RlPmNhblVwZGF0ZVJlZmVyZW5jZXM8L2NvZGU+IHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZW4gdGhpcyBtZXRob2QgaXMgdXNlZCB0bwotCSAqIGFzayB0aGUgcmVmYWN0b3Jpbmcgb2JqZWN0IHdoZXRoZXIgcmVmZXJlbmNlcyBzaG91bGQgYmUgdXBkYXRlZC4KLQkgKiBUaGlzIGNhbGwgY2FuIGJlIGlnbm9yZWQgaWYgIDxjb2RlPmNhblVwZGF0ZVJlZmVyZW5jZXM8L2NvZGU+IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqLwkJCi0JcHVibGljIGJvb2xlYW4gZ2V0VXBkYXRlUmVmZXJlbmNlcygpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1BlcmZvcm1VbnNhdmVkUmVmYWN0b3JpbmdPcGVyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9QZXJmb3JtVW5zYXZlZFJlZmFjdG9yaW5nT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNzM5ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1BlcmZvcm1VbnNhdmVkUmVmYWN0b3JpbmdPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5Qcm9jZXNzb3JCYXNlZFJlZmFjdG9yaW5nOwotCi1wdWJsaWMgY2xhc3MgUGVyZm9ybVVuc2F2ZWRSZWZhY3RvcmluZ09wZXJhdGlvbiBpbXBsZW1lbnRzIElXb3Jrc3BhY2VSdW5uYWJsZSAKLXsgCi0gIHByaXZhdGUgUHJvY2Vzc29yQmFzZWRSZWZhY3RvcmluZyByZWZhY3RvcmluZzsKLSAgCi0gIHB1YmxpYyBQZXJmb3JtVW5zYXZlZFJlZmFjdG9yaW5nT3BlcmF0aW9uKFByb2Nlc3NvckJhc2VkUmVmYWN0b3JpbmcgcmVmYWN0b3JpbmcpCi0gIHsKLSAgICB0aGlzLnJlZmFjdG9yaW5nID0gcmVmYWN0b3Jpbmc7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHBtKQotICB7Ci0gICAgaWYgKHBtID09IG51bGwpCi0gICAgewotICAgICAgcG0gPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotICAgIH0gIAotICAgIHRyeQotICAgIHsgCi0gICAgICByZWZhY3RvcmluZy5jaGVja0FsbENvbmRpdGlvbnMocG0pOwotICAgICAgQ2hhbmdlIGNoYW5nZSA9IHJlZmFjdG9yaW5nLmNyZWF0ZUNoYW5nZShwbSk7ICAgCi0gICAgICBpZiAoY2hhbmdlIGluc3RhbmNlb2YgQ29tcG9zaXRlQ2hhbmdlKQotICAgICAgewotICAgICAgICBDb21wb3NpdGVDaGFuZ2UgY29tcG9zaXRlQ2hhbmdlID0gKENvbXBvc2l0ZUNoYW5nZSljaGFuZ2U7Ci0gICAgICAgIHNldFNhdmVNb2RlKGNvbXBvc2l0ZUNoYW5nZSk7ICAgICAgICAgICAgICAKLSAgICAgIH0gIAotICAgICAgY2hhbmdlLnBlcmZvcm0ocG0pOyAgICAgICAgIAotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0U2F2ZU1vZGUoQ29tcG9zaXRlQ2hhbmdlIGNvbXBvc2l0ZSkKLSAgewotICAgIENoYW5nZVtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBDaGFuZ2UgY2hpbGQgPSBjaGlsZHJlbltpXTsKLSAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFRleHRGaWxlQ2hhbmdlKQotICAgICAgewotICAgICAgICAoKFRleHRGaWxlQ2hhbmdlKWNoaWxkKS5zZXRTYXZlTW9kZShUZXh0RmlsZUNoYW5nZS5MRUFWRV9ESVJUWSk7Ci0gICAgICB9IAotICAgICAgZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBDb21wb3NpdGVDaGFuZ2UpCi0gICAgICB7Ci0gICAgICAgIHNldFNhdmVNb2RlKChDb21wb3NpdGVDaGFuZ2UpY2hpbGQpOwotICAgICAgfSAgCi0gICAgfSAgCi0gIH0KLX0gIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9SZWZhY3RvcmluZ0NvbXBvbmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1JlZmFjdG9yaW5nQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NGJjOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL1JlZmFjdG9yaW5nQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci0KLQotcHVibGljIGludGVyZmFjZSBSZWZhY3RvcmluZ0NvbXBvbmVudAotewotCS8qKgotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCB0aGF0IGlzIHJlZmFjdG9yZWQuICBFLmcuICJmb28iCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBjb21wb25lbnQgdGhhdCBpcyByZWZhY3RvcmVkLiAgRS5nLiAiaHR0cDovL2ZvbyIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpOwotCQotCS8qKgotCSAqIFRoZSBiYXNpYyBET00gZWxlbWVudCBpcyB1c2VkIGJ5IHRoZSByZWZhY3RvcmluZyBwcm9jZXNzb3IvcGFydGljaXBhbnQgdG8gZ2V0IAotCSAqIGFjY2VzcyB0byB0aGUgZmlsZSBsb2NhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBTdHJ1Y3R1cmVkIFNvdXJjZSBFZGl0b3IgWE1MIERPTSBlbGVtZW50IG9iamVjdCB0aGF0IHVuZGVybGluZXMgdGhlIAotCSAqIGNvbWJvbmVudCBiZWluZyByZWZhY3RvcmUuCi0JICogCi0JICogQHNlZSBJRE9NRWxlbWVudCAKLQkgKi8KLQlwdWJsaWMgSURPTUVsZW1lbnQgZ2V0RWxlbWVudCgpOwotCQotCS8qKiAKLQkgKiBAcmV0dXJuIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdHlwZSBvZiB0aGUgcmVmYWN0b3JlZCBjb21wb25lbnQuIAotCSAqIAotCSAqIDxwPgotCSAqIEEgcXVhbGlmaWVkIG5hbWUgY29uc2lzdHMgb2YgYSBsb2NhbCBuYW1lIGFuZCBhIG5hbWVzcGFjZS4gIAotCSAqIEUuZy4gImNvbXBsZXhUeXBlIi1sb2NhbCBuYW1lLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLW5hbWVzcGFjZQotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIFF1YWxpZmllZE5hbWUKLQkgKi8KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZSBnZXRUeXBlUU5hbWUoKTsKLQkJCi0JLyoqIAotCSAqIFRoZSBtb2RlbCBvYmplY3QgbWF5IGJlIHJlcXVpcmVkIHRvIGJlIGdpdmVuIHRvIHRoZSByZWZhY3RvcmVkIHBhcnRpY2lwYW50cyBhcyBpcyBvciAKLQkgKiBvdGhlciBvYmplY3RzIGNvdWxkIGJlIGRlcml2ZWQgZnJvbSBpdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcmluY2lwYWwgb2JqZWN0IGJlaW5nIHJlZmFjdG9yZWQsIHN1Y2ggYXMgYW4gaW5zdGFuY2Ugb2YgV1NETEVsZW1lbnQgb3IgCi0JICogWFNETmFtZWRDb21wb25lbnQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9SZWZhY3RvcmluZ01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvUmVmYWN0b3JpbmdNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGVkNGIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9SZWZhY3RvcmluZ01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3I7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIFJlZmFjdG9yaW5nTWVzc2FnZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0JVTkRMRT0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZnUmVzb3VyY2VCdW5kbGU9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShSRVNPVVJDRV9CVU5ETEUpOwotCi0JcHJpdmF0ZSBSZWZhY3RvcmluZ01lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRTdHJpbmdzKFN0cmluZyBrZXlzW10pIHsKLQkJU3RyaW5nW10gcmVzdWx0PSBuZXcgU3RyaW5nW2tleXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXT0gZ2V0U3RyaW5nKGtleXNbaV0pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvcm1hdHRlZFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgYXJnKSB7Ci0JCXJldHVybiBnZXRGb3JtYXR0ZWRTdHJpbmcoa2V5LCBuZXcgT2JqZWN0W10geyBhcmcgfSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvcm1hdHRlZFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJncyk7CQotCX0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvVGV4dENoYW5nZU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9UZXh0Q2hhbmdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWM1M2U4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9UZXh0Q2hhbmdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3RvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0Q2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotCi0vKioKLSAqIEEgPGNvZGU+VGV4dENoYW5nZU1hbmFnZXI8L2NvZGU+IG1hbmFnZXMgYXNzb2NpYXRpb25zIGJldHdlZW4gPGNvZGU+SUZpbGU8L2NvZGU+IGFuZCA8Y29kZT5UZXh0Q2hhbmdlPC9jb2RlPiBvYmplY3RzLgotICovCi1wdWJsaWMgY2xhc3MgVGV4dENoYW5nZU1hbmFnZXIgewotCQotCXByaXZhdGUgTWFwIGZNYXA9IG5ldyBIYXNoTWFwKDEwKTsgLy8gSUZpbGUgLT4gVGV4dENoYW5nZQotCQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBmS2VlcEV4ZWN1dGVkVGV4dEVkaXRzOwotCQotCXB1YmxpYyBUZXh0Q2hhbmdlTWFuYWdlcigpIHsKLQkJdGhpcyhmYWxzZSk7Ci0JfQotCi0JcHVibGljIFRleHRDaGFuZ2VNYW5hZ2VyKGJvb2xlYW4ga2VlcEV4ZWN1dGVkVGV4dEVkaXRzKSB7Ci0JCWZLZWVwRXhlY3V0ZWRUZXh0RWRpdHM9IGtlZXBFeGVjdXRlZFRleHRFZGl0czsKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBnaXZlbiBmaWxlIGFuZCB0aGUgcGFzc2VkCi0JICogY2hhbmdlIHRvIHRoaXMgbWFuYWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSAoa2V5KQotCSAqIEBwYXJhbSBjaGFuZ2UgdGhlIGNoYW5nZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBtYW5hZ2UoSUZpbGUgZmlsZSwgVGV4dENoYW5nZSBjaGFuZ2UpIHsKLQkJZk1hcC5wdXQoZmlsZSwgY2hhbmdlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+VGV4dENoYW5nZTwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmaWxlLgotCSAqIElmIHRoZSBtYW5hZ2VyIGRvZXMgbm90IGFscmVhZHkgbWFuYWdlIGFuIGFzc29jaWF0aW9uIGl0IGNyZWF0ZXMgYSBvbmUuCi0JICogCi0JICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgZm9yIHdoaWNoIHRoZSB0ZXh0IGJ1ZmZlciBjaGFuZ2UgaXMgcmVxdWVzdGVkCi0JICogQHJldHVybiB0aGUgdGV4dCBjaGFuZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmaWxlLiAKLQkgKi8KLQlwdWJsaWMgVGV4dENoYW5nZSBnZXQoSUZpbGUgZmlsZSkgewotCQlUZXh0Q2hhbmdlIHJlc3VsdD0gKFRleHRDaGFuZ2UpZk1hcC5nZXQoZmlsZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0PSBuZXcgVGV4dEZpbGVDaGFuZ2UoZmlsZS50b1N0cmluZygpLCBmaWxlKTsKLQkJCXJlc3VsdC5zZXRLZWVwUHJldmlld0VkaXRzKGZLZWVwRXhlY3V0ZWRUZXh0RWRpdHMpOwotCQkJcmVzdWx0LmluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCWZNYXAucHV0KGZpbGUsIHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgPHR0PlRleHRDaGFuZ2U8L3R0PiBtYW5hZ2VkIHVuZGVyIHRoZSBnaXZlbiBrZXkKLQkgKiA8Y29kZT51bml0PGNvZGU+LgotCSAqIAotCSAqIEBwYXJhbSB1bml0IHRoZSBrZXkgZGV0ZXJtaW5pbmcgdGhlIDx0dD5UZXh0Q2hhbmdlPC90dD4gdG8gYmUgcmVtb3ZlZC4KLQkgKiBAcmV0dXJuIHRoZSByZW1vdmVkIDx0dD5UZXh0Q2hhbmdlPC90dD4uCi0JICovCi0JcHVibGljIFRleHRDaGFuZ2UgcmVtb3ZlKElGaWxlIHVuaXQpIHsKLQkJcmV0dXJuIChUZXh0Q2hhbmdlKWZNYXAucmVtb3ZlKHVuaXQpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0ZXh0IGNoYW5nZXMgbWFuYWdlZCBieSB0aGlzIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYWxsIHRleHQgY2hhbmdlcyBtYW5hZ2VkIGJ5IHRoaXMgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgVGV4dENoYW5nZVtdIGdldEFsbENoYW5nZXMoKXsKLQkJcmV0dXJuIChUZXh0Q2hhbmdlW10pZk1hcC52YWx1ZXMoKS50b0FycmF5KG5ldyBUZXh0Q2hhbmdlW2ZNYXAudmFsdWVzKCkuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgZmlsZXMgbWFuYWdlZCBieSB0aGlzIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYWxsIGZpbGVzIG1hbmFnZWQgYnkgdGhpcyBpbnN0YW5jZQotCSAqLwkKLQlwdWJsaWMgSUZpbGVbXSBnZXRBbGxDb21waWxhdGlvblVuaXRzKCl7Ci0JCXJldHVybiAoSUZpbGVbXSkgZk1hcC5rZXlTZXQoKS50b0FycmF5KG5ldyBJRmlsZVtmTWFwLmtleVNldCgpLnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBDbGVhcnMgYWxsIGFzc29jaWF0aW9ucyBiZXR3ZWVuIHJlc291cmNlcyBhbmQgdGV4dCBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlmTWFwLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpZiBhbnkgdGV4dCBjaGFuZ2VzIGFyZSBtYW5hZ2VkIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGZpbGUgdGhlIGZpbGUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFueSB0ZXh0IGNoYW5nZXMgYXJlIG1hbmFnZWQgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZSBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwkJCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNDaGFuZ2VzSW4oSUZpbGUgZmlsZSl7Ci0JCXJldHVybiBmTWFwLmNvbnRhaW5zS2V5KGZpbGUpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvWE1MUmVmYWN0b3JpbmdDb21wb25lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9YTUxSZWZhY3RvcmluZ0NvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDc3OWIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9YTUxSZWZhY3RvcmluZ0NvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBYTUxSZWZhY3RvcmluZ0NvbXBvbmVudCBpbXBsZW1lbnRzIFJlZmFjdG9yaW5nQ29tcG9uZW50Ci17Ci0JLy8gVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBiZWluZyByZWZhY3RvcmVkCi0JU3RyaW5nIG5hbWU7Ci0JCi0JLy8gVGhlIG5hbWVzcGFjZSBpbiB3aGljaCBjb21wb25lbnQgaXMgZGVmaW5lZCwgZS5nLiBYTUwgb3IgV1NETCB0YXJnZXQgbmFtZXNwYWNlCi0JU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLQkKLQkvLyBPcHRpb25hbCBtb2RlbCBvYmplY3QgdGhhdCBpcyByZWZhY3RvcmVkCi0JT2JqZWN0IG1vZGVsOwotCQotCS8vIFNFRCBET00gb2JqZWN0IHRoYXQgdW5kZXJsaW5lcyB0aGUgY29tcG9uZW50IGJlaW5nIHJlZmFjdG9yZWQKLQlJRE9NRWxlbWVudCBkb21FbGVtZW50OwotCi0JcHVibGljIFhNTFJlZmFjdG9yaW5nQ29tcG9uZW50KE9iamVjdCBtb2RlbE9iamVjdCwgSURPTUVsZW1lbnQgZG9tRWxlbWVudCwgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lc3BhY2UpCi0JewotCQlzdXBlcigpOwotCQl0aGlzLm1vZGVsID0gbW9kZWxPYmplY3Q7Ci0JCXRoaXMuZG9tRWxlbWVudCA9IGRvbUVsZW1lbnQ7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMudGFyZ2V0TmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQkKLQkJCi0JfQotCQotCXB1YmxpYyBYTUxSZWZhY3RvcmluZ0NvbXBvbmVudChJRE9NRWxlbWVudCBkb21FbGVtZW50LCBTdHJpbmcgbmFtZSwgU3RyaW5nIG5hbWVzcGFjZSkKLQl7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZG9tRWxlbWVudCA9IGRvbUVsZW1lbnQ7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMudGFyZ2V0TmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kZWxPYmplY3QoKQotCXsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBJRE9NRWxlbWVudCBnZXRFbGVtZW50KCkKLQl7Ci0JCXJldHVybiBkb21FbGVtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQkKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotCXsKLQkJcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLQl9Ci0KLQkKLQlwdWJsaWMgUXVhbGlmaWVkTmFtZSBnZXRUeXBlUU5hbWUoKQotCXsKLQkJcmV0dXJuIG5ldyBRdWFsaWZpZWROYW1lKGRvbUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCksIGRvbUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL01ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9NYWtlQW5vbnltb3VzVHlwZUdsb2JhbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjNmM2JmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL01ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVJlZmFjdG9yaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iuc3RydWN0dXJlLk1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnN0cnVjdHVyZS5NYWtlVHlwZUdsb2JhbFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZC5SZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLlJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgTWFrZUFub255bW91c1R5cGVHbG9iYWxBY3Rpb24gZXh0ZW5kcyBYU0RTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiB7Ci0KLQlwcml2YXRlIFN0cmluZyBmUGFyZW50TmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNDb21wbGV4VHlwZSA9IHRydWU7Ci0JcHJpdmF0ZSBYU0RUeXBlRGVmaW5pdGlvbiBmU2VsZWN0ZWRDb21wb25lbnQ7Ci0JCi0JcHVibGljIE1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBYU0RTY2hlbWEgc2NoZW1hKSB7Ci0JCXN1cGVyKHNlbGVjdGlvbiwgc2NoZW1hKTsKLQkJc2V0VGV4dChSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLk1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQWN0aW9uX3RleHQpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhblJ1bigpIHsKLQotCQlyZXR1cm4gZlNlbGVjdGVkQ29tcG9uZW50ICE9IG51bGw7Ci0JfQotCQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmV3RGVmYXVsdE5hbWUoKXsKLQkJaWYoZlBhcmVudE5hbWUgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKGZQYXJlbnROYW1lKSl7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKGlzQ29tcGxleFR5cGUpewotCQkJCXJldHVybiBmUGFyZW50TmFtZSArICJDb21wbGV4VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2V7Ci0JCQkJcmV0dXJuIGZQYXJlbnROYW1lICsgIlNpbXBsZVR5cGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZXsKLQkJCWlmKGlzQ29tcGxleFR5cGUpewotCQkJCXJldHVybiAiTmV3Q29tcGxleFR5cGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlewotCQkJCXJldHVybiAiTmV3U2ltcGxlVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkKLQl9Ci0JcHJpdmF0ZSBib29sZWFuIGNhbkVuYWJsZShYU0RDb25jcmV0ZUNvbXBvbmVudCB4c2RDb21wb25lbnQpewotCQlpZiAoeHNkQ29tcG9uZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB7Ci0JCQlmU2VsZWN0ZWRDb21wb25lbnQgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKXhzZENvbXBvbmVudDsKLQkJCWlzQ29tcGxleFR5cGUgPSB0cnVlOwotCQkJWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB4c2RDb21wb25lbnQ7Ci0JCQlYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSB0eXBlRGVmLmdldENvbnRhaW5lcigpOwotCQkJaWYocGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKXsKLQkJCQlmUGFyZW50TmFtZSA9ICgoWFNERWxlbWVudERlY2xhcmF0aW9uKXBhcmVudCkuZ2V0TmFtZSgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IAotCQllbHNlIGlmICh4c2RDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbil7Ci0JCQlmU2VsZWN0ZWRDb21wb25lbnQgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24peHNkQ29tcG9uZW50OwotCQkJaXNDb21wbGV4VHlwZSA9IGZhbHNlOwotCQkJWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZURlZiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgeHNkQ29tcG9uZW50OwotCQkJWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gdHlwZURlZi5nZXRDb250YWluZXIoKTsKLQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbil7Ci0JCQkJZlBhcmVudE5hbWUgPSAoKFhTREVsZW1lbnREZWNsYXJhdGlvbilwYXJlbnQpLmdldE5hbWUoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pewotCQkJCWZQYXJlbnROYW1lID0gKChYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbilwYXJlbnQpLmdldE5hbWUoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FbmFibGUoT2JqZWN0IHNlbGVjdGVkT2JqZWN0KSB7Ci0JCQotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkgewotCQkJcmV0dXJuIGNhbkVuYWJsZSgoWFNEQ29uY3JldGVDb21wb25lbnQpc2VsZWN0ZWRPYmplY3QpICYmIHN1cGVyLmNhbkVuYWJsZShzZWxlY3RlZE9iamVjdCk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgc2VsZWN0ZWRPYmplY3Q7Ci0JCQlYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCA9IGdldFNjaGVtYSgpLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQobm9kZSk7Ci0JCQlyZXR1cm4gY2FuRW5hYmxlKGNvbmNyZXRlQ29tcG9uZW50KSAmJiBzdXBlci5jYW5FbmFibGUoY29uY3JldGVDb21wb25lbnQpOwotCQkKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bjEoKSB7Ci0JCQotCQlpZihmU2VsZWN0ZWRDb21wb25lbnQgPT0gbnVsbCl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmKGZTZWxlY3RlZENvbXBvbmVudC5nZXRTY2hlbWEoKSA9PSBudWxsKXsKLQkJCWdldFNjaGVtYSgpLnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0JCX0KLQkJTWFrZVR5cGVHbG9iYWxQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IE1ha2VUeXBlR2xvYmFsUHJvY2Vzc29yKGZTZWxlY3RlZENvbXBvbmVudCwgZ2V0TmV3RGVmYXVsdE5hbWUoKSk7Ci0JCVJlbmFtZVJlZmFjdG9yaW5nIHJlZmFjdG9yaW5nID0gbmV3IFJlbmFtZVJlZmFjdG9yaW5nKHByb2Nlc3Nvcik7Ci0JCXRyeSB7Ci0JCQlSZWZhY3RvcmluZ1dpemFyZCB3aXphcmQgPSBuZXcgUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQoCi0JCQkJCXJlZmFjdG9yaW5nLAotCQkJCQlSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlbmFtZUNvbXBvbmVudFdpemFyZF9kZWZhdWx0UGFnZVRpdGxlLCAvLyBUT0RPOiBwcm92aWRlIGNvcnJlY3Qgc3RyaW5ncwotCQkJCQlSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlbmFtZUNvbXBvbmVudFdpemFyZF9pbnB1dFBhZ2VfZGVzY3JpcHRpb24sIG51bGwpOwotCQkJUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uIG9wPSBuZXcgUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uKHdpemFyZCk7Ci0JCQlvcC5ydW4oWFNERWRpdG9yUGx1Z2luLmdldFNoZWxsKCksIHdpemFyZC5nZXREZWZhdWx0UGFnZVRpdGxlKCkpOwotCQkJLy90cmlnZ2VyQnVpbGQoKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gZG8gbm90aGluZy4gVXNlciBhY3Rpb24gZ290IGNhbmNlbGxlZAotCQl9Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJaWYoZlNlbGVjdGVkQ29tcG9uZW50ID09IG51bGwpewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZihmU2VsZWN0ZWRDb21wb25lbnQuZ2V0U2NoZW1hKCkgPT0gbnVsbCl7Ci0JCQlnZXRTY2hlbWEoKS51cGRhdGVFbGVtZW50KHRydWUpOwotCQl9Ci0JCURvY3VtZW50SW1wbCBkb2MgPSAoRG9jdW1lbnRJbXBsKSBmU2VsZWN0ZWRDb21wb25lbnQuZ2V0RWxlbWVudCgpLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJZG9jLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcoCi0JCQkJCQl0aGlzLAotCQkJCQkJUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5NYWtlQW5vbnltb3VzVHlwZUdsb2JhbEFjdGlvbl90ZXh0KTsKLQkJTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kKAotCQkJCWZTZWxlY3RlZENvbXBvbmVudCwgZ2V0TmV3RGVmYXVsdE5hbWUoKSk7Ci0JCWNvbW1hbmQucnVuKCk7Ci0JCWRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0JCi0JCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL01ha2VMb2NhbEVsZW1lbnRHbG9iYWxBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL01ha2VMb2NhbEVsZW1lbnRHbG9iYWxBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ3YjEyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9NYWtlTG9jYWxFbGVtZW50R2xvYmFsQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnN0cnVjdHVyZS5NYWtlTG9jYWxFbGVtZW50R2xvYmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBNYWtlTG9jYWxFbGVtZW50R2xvYmFsQWN0aW9uIGV4dGVuZHMgWFNEU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gewotCi0JWFNERWxlbWVudERlY2xhcmF0aW9uIGZTZWxlY3RlZENvbXBvbmVudDsKLQotCXB1YmxpYyBNYWtlTG9jYWxFbGVtZW50R2xvYmFsQWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBYU0RTY2hlbWEgc2NoZW1hKSB7Ci0JCXN1cGVyKHNlbGVjdGlvbiwgc2NoZW1hKTsKLQkJc2V0VGV4dChSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiTWFrZUxvY2FsRWxlbWVudEdsb2JhbEFjdGlvbi50ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhblJ1bigpIHsKLQotCQlyZXR1cm4gZlNlbGVjdGVkQ29tcG9uZW50ICE9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuRW5hYmxlKFhTRENvbmNyZXRlQ29tcG9uZW50IHNlbGVjdGVkT2JqZWN0KSB7Ci0KLQkJZlNlbGVjdGVkQ29tcG9uZW50ID0gbnVsbDsKLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQlYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHNlbGVjdGVkT2JqZWN0OwotCQkJaWYgKCFlbGVtZW50LmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkgJiYgIWVsZW1lbnQuaXNHbG9iYWwoKSkgewotCQkJCWZTZWxlY3RlZENvbXBvbmVudCA9IGVsZW1lbnQ7Ci0JCQl9Ci0JCX0gCi0JCXJldHVybiBjYW5SdW4oKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuRW5hYmxlKE9iamVjdCBzZWxlY3RlZE9iamVjdCkgewotCQkKLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpIHsKLQkJCXJldHVybiBjYW5FbmFibGUoKFhTRENvbmNyZXRlQ29tcG9uZW50KXNlbGVjdGVkT2JqZWN0KSAmJiBzdXBlci5jYW5FbmFibGUoc2VsZWN0ZWRPYmplY3QpOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIHNlbGVjdGVkT2JqZWN0OwotCQkJWFNEQ29uY3JldGVDb21wb25lbnQgY29uY3JldGVDb21wb25lbnQgPSBnZXRTY2hlbWEoKQotCQkJCQkuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChub2RlKTsKLQkJCXJldHVybiBjYW5FbmFibGUoY29uY3JldGVDb21wb25lbnQpICYmIHN1cGVyLmNhbkVuYWJsZShjb25jcmV0ZUNvbXBvbmVudCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCQkKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJRG9jdW1lbnRJbXBsIGRvYyA9IChEb2N1bWVudEltcGwpIGZTZWxlY3RlZENvbXBvbmVudC5nZXRFbGVtZW50KCkKLQkJCQkuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlkb2MuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBnZXRUZXh0KCkpOwotCQlNYWtlTG9jYWxFbGVtZW50R2xvYmFsQ29tbWFuZCBjb21tYW5kID0gbmV3IE1ha2VMb2NhbEVsZW1lbnRHbG9iYWxDb21tYW5kKAotCQkJCWZTZWxlY3RlZENvbXBvbmVudCk7Ci0JCWNvbW1hbmQucnVuKCk7Ci0JCWRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1JlbmFtZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZDJmYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZC5SZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzOwotCi0KLQotLyoqCi0qIFJlbmFtZXMgYSBYTUwgU2NoZW1hIGVsZW1lbnQgb3Igd29ya2JlbmNoIHJlc291cmNlLgotKiA8cD4KLSogQWN0aW9uIGlzIGFwcGxpY2FibGUgdG8gc2VsZWN0aW9ucyBjb250YWluaW5nIGVsZW1lbnRzIG9mIHR5cGUKLSogPGNvZGU+PC9jb2RlPiBvciA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+LgotKiAKLSogPHA+Ci0qIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZDsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0qIDwvcD4KLQotKi8KLXB1YmxpYyBjbGFzcyBSZW5hbWVBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiAgewotCi0JcHJpdmF0ZSBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiByZW5hbWVDb21wb25lbnRBY3Rpb247Ci0JcHJpdmF0ZSBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiByZW5hbWVSZXNvdXJjZUFjdGlvbjsKLQkKLQkKLQlwdWJsaWMgUmVuYW1lQWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKHNlbGVjdGlvbik7Ci0JCXNldFRleHQoUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5SZW5hbWVBY3Rpb25fdGV4dCk7IAotCQlyZW5hbWVSZXNvdXJjZUFjdGlvbj0gbmV3IFJlbmFtZVJlc291cmNlQWN0aW9uKHNlbGVjdGlvbik7Ci0JCXJlbmFtZVJlc291cmNlQWN0aW9uLnNldFRleHQoZ2V0VGV4dCgpKTsKLQkJCi0JfQotCXB1YmxpYyBSZW5hbWVBY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24sIE9iamVjdCBtb2RlbCkgewotCQlzdXBlcihzZWxlY3Rpb24pOwotCQlzZXRUZXh0KFJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuUmVuYW1lQWN0aW9uX3RleHQpOwotCQlyZW5hbWVDb21wb25lbnRBY3Rpb249IG5ldyBSZW5hbWVDb21wb25lbnRBY3Rpb24oc2VsZWN0aW9uLCBtb2RlbCk7Ci0JCXJlbmFtZUNvbXBvbmVudEFjdGlvbi5zZXRUZXh0KGdldFRleHQoKSk7Ci0JCXJlbmFtZVJlc291cmNlQWN0aW9uPSBuZXcgUmVuYW1lUmVzb3VyY2VBY3Rpb24oc2VsZWN0aW9uKTsKLQkJcmVuYW1lUmVzb3VyY2VBY3Rpb24uc2V0VGV4dChnZXRUZXh0KCkpOwotCQkKLQl9Ci0JCi0KLQkKLQkvKgotCSAqIEBzZWUgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlyZW5hbWVDb21wb25lbnRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCWlmIChyZW5hbWVSZXNvdXJjZUFjdGlvbiAhPSBudWxsKQotCQkJcmVuYW1lUmVzb3VyY2VBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCXNldEVuYWJsZWQoY29tcHV0ZUVuYWJsZWRTdGF0ZSgpKTsJCQotCX0KLQotCS8qCi0JICogQHNlZSBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiN1cGRhdGUoSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYocmVuYW1lQ29tcG9uZW50QWN0aW9uICE9IG51bGwpewotCQkJcmVuYW1lQ29tcG9uZW50QWN0aW9uLnVwZGF0ZShzZWxlY3Rpb24pOwotCQl9Ci0JCWlmIChyZW5hbWVSZXNvdXJjZUFjdGlvbiAhPSBudWxsKQotCQkJcmVuYW1lUmVzb3VyY2VBY3Rpb24udXBkYXRlKHNlbGVjdGlvbik7Ci0JCXNldEVuYWJsZWQoY29tcHV0ZUVuYWJsZWRTdGF0ZSgpKTsJCQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY29tcHV0ZUVuYWJsZWRTdGF0ZSgpewotCQlpZiAocmVuYW1lUmVzb3VyY2VBY3Rpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlbmFtZUNvbXBvbmVudEFjdGlvbi5pc0VuYWJsZWQoKSB8fCByZW5hbWVSZXNvdXJjZUFjdGlvbi5pc0VuYWJsZWQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiByZW5hbWVDb21wb25lbnRBY3Rpb24uaXNFbmFibGVkKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAocmVuYW1lQ29tcG9uZW50QWN0aW9uICE9IG51bGwgJiYgcmVuYW1lQ29tcG9uZW50QWN0aW9uLmlzRW5hYmxlZCgpKQotCQkJcmVuYW1lQ29tcG9uZW50QWN0aW9uLnJ1bihzZWxlY3Rpb24pOwotCQlpZiAocmVuYW1lUmVzb3VyY2VBY3Rpb24gIT0gbnVsbCAmJiByZW5hbWVSZXNvdXJjZUFjdGlvbi5pc0VuYWJsZWQoKSkKLQkJCXJlbmFtZVJlc291cmNlQWN0aW9uLnJ1bihzZWxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHJlbmFtZUNvbXBvbmVudEFjdGlvbiAhPSBudWxsICYmIHJlbmFtZUNvbXBvbmVudEFjdGlvbi5jYW5SdW4oKSkKLQkJCXJlbmFtZUNvbXBvbmVudEFjdGlvbi5ydW4oc2VsZWN0aW9uKTsKLQkJZWxzZQotCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oWFNERWRpdG9yUGx1Z2luLmdldFNoZWxsKCksIFJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuUmVuYW1lQWN0aW9uX3JlbmFtZSwgUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5SZW5hbWVBY3Rpb25fdW5hdmFpbGFibGUpOyAgCi0JfQotCXB1YmxpYyB2b2lkIHJ1bihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCSAgICBpZihzZWxlY3Rpb24gPT0gbnVsbCl7Ci0JICAgIAlzdXBlci5ydW4oKTsKLQkgICAgfQotCSAgICBlbHNlewotCSAgICAJc3VwZXIucnVuKHNlbGVjdGlvbik7Ci0JICAgIH0KLQkJCi0JfQotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFJlbmFtZUNvbXBvbmVudEFjdGlvbigKLQkJCVNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIHJlbmFtZUNvbXBvbmVudEFjdGlvbikKLQl7Ci0JCXRoaXMucmVuYW1lQ29tcG9uZW50QWN0aW9uID0gcmVuYW1lQ29tcG9uZW50QWN0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1JlbmFtZUNvbXBvbmVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lQ29tcG9uZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmY2EzNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lQ29tcG9uZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVJlZmFjdG9yaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuR2xvYmFsQnVpbGRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kaWFsb2dzLlNhdmVEaXJ0eUZpbGVzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlhNTFJlZmFjdG9yaW5nQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lLlJlbmFtZUNvbXBvbmVudFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZC5SZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLlJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBSZW5hbWVDb21wb25lbnRBY3Rpb24gZXh0ZW5kcyBYU0RTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiB7Ci0KLQlwcml2YXRlIFhTRE5hbWVkQ29tcG9uZW50IHNlbGVjdGVkQ29tcG9uZW50OwotCi0JcHVibGljIFJlbmFtZUNvbXBvbmVudEFjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbiwKLQkJCU9iamVjdCBhTW9kZWwpIHsKLQkJc3VwZXIoc2VsZWN0aW9uLCBhTW9kZWwpOwotCQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNhbkVuYWJsZShYU0RDb25jcmV0ZUNvbXBvbmVudCBzZWxlY3RlZE9iamVjdCkgewotCi0JCXNlbGVjdGVkQ29tcG9uZW50ID0gbnVsbDsKLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpIHsKLQkJCXNlbGVjdGVkQ29tcG9uZW50ID0gKFhTRE5hbWVkQ29tcG9uZW50KSBzZWxlY3RlZE9iamVjdDsKLQotCQkJLy8gaWYgaXQncyBlbGVtZW50IHJlZmVyZW5jZSwgdGhlbiB0aGlzIGFjdGlvbiBpcyBub3QgYXBwcm9wcmlhdGUKLQkJCWlmIChzZWxlY3RlZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCVhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgc2VsZWN0ZWRDb21wb25lbnQ7Ci0JCQkJaWYgKGVsZW1lbnQuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkgewotCQkJCQlzZWxlY3RlZENvbXBvbmVudCA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQkJaWYoc2VsZWN0ZWRDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbil7Ci0JCQkJWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IChYU0RUeXBlRGVmaW5pdGlvbikgc2VsZWN0ZWRDb21wb25lbnQ7Ci0JCQkJWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gdHlwZS5nZXRDb250YWluZXIoKTsKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJCVhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgcGFyZW50OwotCQkJCQlpZihlbGVtZW50LmdldEFub255bW91c1R5cGVEZWZpbml0aW9uKCkuZXF1YWxzKHR5cGUpKXsKLQkJCQkJCXNlbGVjdGVkQ29tcG9uZW50ID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmKHBhcmVudCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSB7Ci0JCQkJCVhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIHBhcmVudDsKLQkJCQkJaWYoZWxlbWVudC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpLmVxdWFscyh0eXBlKSl7Ci0JCQkJCQlzZWxlY3RlZENvbXBvbmVudCA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2FuUnVuKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuRW5hYmxlKE9iamVjdCBzZWxlY3RlZE9iamVjdCkgewotCi0JCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KSAKLQkJewotCQkJcmV0dXJuIGNhbkVuYWJsZSgoWFNEQ29uY3JldGVDb21wb25lbnQpIHNlbGVjdGVkT2JqZWN0KSAmJiBzdXBlci5jYW5FbmFibGUoc2VsZWN0ZWRPYmplY3QpOwotCQl9IGVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgCi0JCXsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBzZWxlY3RlZE9iamVjdDsKLQkJCWlmIChnZXRTY2hlbWEoKSAhPSBudWxsKSAKLQkJCXsKLQkJCQlYU0RDb25jcmV0ZUNvbXBvbmVudCBjb25jcmV0ZUNvbXBvbmVudCA9IGdldFNjaGVtYSgpCi0JCQkJCQkuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChub2RlKTsKLQkJCQlyZXR1cm4gY2FuRW5hYmxlKGNvbmNyZXRlQ29tcG9uZW50KSAmJiBzdXBlci5jYW5FbmFibGUoY29uY3JldGVDb21wb25lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblJ1bigpIHsKLQotCQlyZXR1cm4gc2VsZWN0ZWRDb21wb25lbnQgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGVkQ29tcG9uZW50LmdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlzZWxlY3RlZENvbXBvbmVudC5zZXROYW1lKG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaWYgKHNlbGVjdGVkQ29tcG9uZW50LmdldFNjaGVtYSgpID09IG51bGwpIHsKLQkJCWlmIChnZXRTY2hlbWEoKSAhPSBudWxsKSB7Ci0JCQkJZ2V0U2NoZW1hKCkudXBkYXRlRWxlbWVudCh0cnVlKTsKLQkJCX0KLQotCQl9Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIHJjID0gU2F2ZURpcnR5RmlsZXNEaWFsb2cuc2F2ZURpcnR5RmlsZXMoKTsKLSAgICAgICAgaWYgKCFyYykKLSAgICAgICAgewotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSAgCi0gICAgICAgIFJlZmFjdG9yaW5nQ29tcG9uZW50IGNvbXBvbmVudCA9IG5ldyBYTUxSZWZhY3RvcmluZ0NvbXBvbmVudCgKLQkJCQlzZWxlY3RlZENvbXBvbmVudCwKLQkJCQkoSURPTUVsZW1lbnQpc2VsZWN0ZWRDb21wb25lbnQuZ2V0RWxlbWVudCgpLCAKLQkJCQlzZWxlY3RlZENvbXBvbmVudC5nZXROYW1lKCksCi0JCQkJc2VsZWN0ZWRDb21wb25lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotCQkKLQkJUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IoCi0JCQkJY29tcG9uZW50LCBzZWxlY3RlZENvbXBvbmVudC5nZXROYW1lKCkpOwotCQlSZW5hbWVSZWZhY3RvcmluZyByZWZhY3RvcmluZyA9IG5ldyBSZW5hbWVSZWZhY3RvcmluZyhwcm9jZXNzb3IpOwotCQl0cnkgewotCQkJUmVmYWN0b3JpbmdXaXphcmQgd2l6YXJkID0gbmV3IFJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkKAotCQkJCQlyZWZhY3RvcmluZywKLQkJCQkJUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5SZW5hbWVDb21wb25lbnRXaXphcmRfZGVmYXVsdFBhZ2VUaXRsZSwgCi0JCQkJCVJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMKLQkJCQkJCQkuUmVuYW1lQ29tcG9uZW50V2l6YXJkX2lucHV0UGFnZV9kZXNjcmlwdGlvbiwgCi0JCQkJCW51bGwpOwotCQkJUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uIG9wID0gbmV3IFJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbigKLQkJCQkJd2l6YXJkKTsKLQkJCW9wLnJ1bihYU0RFZGl0b3JQbHVnaW4uZ2V0U2hlbGwoKSwgd2l6YXJkCi0JCQkJCS5nZXREZWZhdWx0UGFnZVRpdGxlKCkpOwotCQkJCi0JCQkvLyBUT0RPIChjcykgSSdtIG5vdCBzdXJlIHdoeSB3ZSBuZWVkIHRvIGRvIHRoaXMuICBTZWUgYnVnIDE0NTcwMAotCQkJLy90cmlnZ2VyQnVpbGQoKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gZG8gbm90aGluZy4gVXNlciBhY3Rpb24gZ290IGNhbmNlbGxlZAotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJpZ2dlckJ1aWxkKCkgewotCQlpZiAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCkuaXNBdXRvQnVpbGRpbmcoKSkgewotCQkJbmV3IEdsb2JhbEJ1aWxkQWN0aW9uKFhTREVkaXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCksCi0JCQkJCUluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQpLnJ1bigpOwotCQl9Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1JlbmFtZVJlc291cmNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVSZXNvdXJjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2Q3ZDlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1JlbmFtZVJlc291cmNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUmVmYWN0b3Jpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5lZGl0b3IuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lLlJlbmFtZVJlc291cmNlUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLlJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQuUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgUmVuYW1lUmVzb3VyY2VBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiB7Ci0KLQotCi0JCi0JcHVibGljIFJlbmFtZVJlc291cmNlQWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKQotCXsKLQkJc3VwZXIoc2VsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJUmVzb3VyY2UgZWxlbWVudD0gZ2V0UmVzb3VyY2Uoc2VsZWN0aW9uKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlSZW5hbWVSZXNvdXJjZVByb2Nlc3NvciBwcm9jZXNzb3I9IG5ldyBSZW5hbWVSZXNvdXJjZVByb2Nlc3NvcihlbGVtZW50KTsKLQkJCXNldEVuYWJsZWQocHJvY2Vzc29yLmlzQXBwbGljYWJsZSgpKTsKLQkJCQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShzZWxlY3Rpb24pOwotCQlSZW5hbWVSZXNvdXJjZVByb2Nlc3NvciBwcm9jZXNzb3I9IG5ldyBSZW5hbWVSZXNvdXJjZVByb2Nlc3NvcihyZXNvdXJjZSk7Ci0KLQkJCWlmKCFwcm9jZXNzb3IuaXNBcHBsaWNhYmxlKCkpCi0JCQkJcmV0dXJuOwotCQkJUmVuYW1lUmVmYWN0b3JpbmcgcmVmYWN0b3Jpbmc9IG5ldyBSZW5hbWVSZWZhY3RvcmluZyhwcm9jZXNzb3IpOwotCQkJdHJ5IHsKLQkJCQlSZWZhY3RvcmluZ1dpemFyZCB3aXphcmQgPSBuZXcgUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQoCi0JCQkJCQlyZWZhY3RvcmluZywKLQkJCQkJCVJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuUmVuYW1lQ29tcG9uZW50V2l6YXJkX2RlZmF1bHRQYWdlVGl0bGUsIC8vVE9ETzogcHJvdmlkZSBjb3JyZWN0IHN0cmluZ3MKLQkJCQkJCVJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuUmVuYW1lQ29tcG9uZW50V2l6YXJkX2lucHV0UGFnZV9kZXNjcmlwdGlvbiwgCi0JCQkJCQludWxsKTsKLQkJCQlSZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb24gb3A9IG5ldyBSZWZhY3RvcmluZ1dpemFyZE9wZW5PcGVyYXRpb24od2l6YXJkKTsKLQkJCQlvcC5ydW4oWFNERWRpdG9yUGx1Z2luLmdldFNoZWxsKCksIHdpemFyZC5nZXREZWZhdWx0UGFnZVRpdGxlKCkpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCS8vIGRvIG5vdGhpbmcuIFVzZXIgYWN0aW9uIGdvdCBjYW5jZWxsZWQKLQkJCX0KLQkJCQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpICE9IDEpCi0JCQlyZXR1cm4gbnVsbDsKLQkJT2JqZWN0IGZpcnN0PSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmICghIChmaXJzdCBpbnN0YW5jZW9mIElSZXNvdXJjZSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChJUmVzb3VyY2UpZmlyc3Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVSZXNvdXJjZUFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVSZXNvdXJjZUFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NGE1YWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lUmVzb3VyY2VBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogQGF1dGhvciBlYmVsaXNhckBjYS5pYm0uY29tCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW5hbWVSZXNvdXJjZUFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQkKLQlwcml2YXRlIElTZWxlY3Rpb24gZkN1cnJlbnRTZWxlY3Rpb247Ci0KLS8vCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgZlBhcnQ7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotLy8JCWZQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGZDdXJyZW50U2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb249IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZkN1cnJlbnRTZWxlY3Rpb247Ci0JCQlPYmplY3QgZmlyc3Q9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoZmlyc3QgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCVJlbmFtZVJlc291cmNlQWN0aW9uIHJlbmFtZUFjdGlvbiA9IG5ldyBSZW5hbWVSZXNvdXJjZUFjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJCQlyZW5hbWVBY3Rpb24ucnVuKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlmQ3VycmVudFNlbGVjdGlvbj0gc2VsZWN0aW9uOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvUmVuYW1lVGFyZ2V0TmFtZXNwYWNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVUYXJnZXROYW1lc3BhY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThjZWVkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9SZW5hbWVUYXJnZXROYW1lc3BhY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVSZWZhY3RvcmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkdsb2JhbEJ1aWxkQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZS5SZW5hbWVUYXJnZXROYW1lc3BhY2VQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQuUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZC5SZW5hbWVSZWZhY3RvcmluZ1dpemFyZDsKLQotcHVibGljIGNsYXNzIFJlbmFtZVRhcmdldE5hbWVzcGFjZUFjdGlvbiBleHRlbmRzIFhTRFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIHsKLQotCXB1YmxpYyBSZW5hbWVUYXJnZXROYW1lc3BhY2VBY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24sCi0JCQlPYmplY3QgYU1vZGVsKSB7Ci0JCXN1cGVyKHNlbGVjdGlvbiwgYU1vZGVsKTsKLQkJc2V0VGV4dChSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlbmFtZVRhcmdldE5hbWVzcGFjZV90ZXh0KTsKLQotCX0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuRW5hYmxlKE9iamVjdCBzZWxlY3RlZE9iamVjdCkgewotCi0JCXJldHVybiBzdXBlci5jYW5FbmFibGUoc2VsZWN0ZWRPYmplY3QpOwotCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhblJ1bigpIHsKLQotCQlyZXR1cm4gZ2V0U2NoZW1hKCkgIT0gbnVsbDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHJ1bihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCi0JCQotCQlSZW5hbWVUYXJnZXROYW1lc3BhY2VQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFJlbmFtZVRhcmdldE5hbWVzcGFjZVByb2Nlc3NvcihnZXRTY2hlbWEoKSwgZ2V0U2NoZW1hKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotCQlSZW5hbWVSZWZhY3RvcmluZyByZWZhY3RvcmluZyA9IG5ldyBSZW5hbWVSZWZhY3RvcmluZyhwcm9jZXNzb3IpOwotCQl0cnkgewotCQkJUmVmYWN0b3JpbmdXaXphcmQgd2l6YXJkID0gbmV3IFJlbmFtZVJlZmFjdG9yaW5nV2l6YXJkKAotCQkJCQlyZWZhY3RvcmluZywKLQkJCQkJUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5SZW5hbWVDb21wb25lbnRXaXphcmRfZGVmYXVsdFBhZ2VUaXRsZSwvL1RPRE86IHByb3ZpZGUgY29ycmVjdCBzdHJpbmdzCi0JCQkJCVJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuUmVuYW1lQ29tcG9uZW50V2l6YXJkX2lucHV0UGFnZV9kZXNjcmlwdGlvbiwgCi0JCQkJCW51bGwpOwotCQkJUmVmYWN0b3JpbmdXaXphcmRPcGVuT3BlcmF0aW9uIG9wID0gbmV3IFJlZmFjdG9yaW5nV2l6YXJkT3Blbk9wZXJhdGlvbigKLQkJCQkJd2l6YXJkKTsKLQkJCW9wLnJ1bihYU0RFZGl0b3JQbHVnaW4uZ2V0U2hlbGwoKSwgd2l6YXJkCi0JCQkJCS5nZXREZWZhdWx0UGFnZVRpdGxlKCkpOwotCQkJdHJpZ2dlckJ1aWxkKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcuIFVzZXIgYWN0aW9uIGdvdCBjYW5jZWxsZWQKLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyaWdnZXJCdWlsZCgpIHsKLQkJaWYgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXREZXNjcmlwdGlvbigpLmlzQXV0b0J1aWxkaW5nKCkpIHsKLQkJCW5ldyBHbG9iYWxCdWlsZEFjdGlvbihYU0RFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLAotCQkJCQlJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxEKS5ydW4oKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1NlbGVjdGlvbkRpc3BhdGNoQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMmFhY2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci0KLQotCi0vKioKLSAqIEFjdGlvbiB0aGF0IGRpc3BhdGNoZXMgdGhlIDxjb2RlPklBY3Rpb24jcnVuKCk8L2NvZGU+IGFuZCB0aGUgCi0gKiA8Y29kZT5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQ8L2NvZGU+IAotICogYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mIHRoZSBzZWxlY3Rpb24uIAotICogCi0gKiA8dWw+Ci0gKiAJPGxpPmlmIHNlbGVjdGlvbiBpcyBvZiB0eXBlIDxjb2RlPklUZXh0U2VsZWN0aW9uPC9jb2RlPiB0aGVuCi0gKiAJPGNvZGU+cnVuKElUZXh0U2VsZWN0aW9uKTwvY29kZT4gYW5kIDxjb2RlPnNlbGVjdGlvbkNoYW5nZWQoSVRleHRTZWxlY3Rpb24pPC9jb2RlPgotICogCWlzIGNhbGxlZC48L2xpPiAKLSAqIAk8bGk+aWYgc2VsZWN0aW9uIGlzIG9mIHR5cGUgPGNvZGU+SVN0cnVjdHVyZWRTZWxlY3Rpb248L2NvZGU+IHRoZW4KLSAqIAk8Y29kZT5ydW4oSVN0cnVjdHVyZWRTZWxlY3Rpb24pPC9jb2RlPiBhbmQgPGNvZGU+Ci0gKiAJc2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbik8L2NvZGU+IGlzIGNhbGxlZC48L2xpPgotICogCTxsaT5kZWZhdWx0IGlzIHRvIGNhbGwgPGNvZGU+cnVuKElTZWxlY3Rpb24pPC9jb2RlPiBhbmQgPGNvZGU+Ci0gKiAJc2VsZWN0aW9uQ2hhbmdlZChJU2VsZWN0aW9uKTwvY29kZT4uPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIDxwPgotICogYWRhcHRlZCBmcm9tIDxjb2RlPm9yZy5lY2xpcHNlLmpkdC51aS5hY3Rpb25zLlNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uPC9jb2RlPgotICogPC9wPgotICogICAKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQkKLQlwcml2YXRlIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotCQotCXByaXZhdGUgT2JqZWN0IG1vZGVsOwotCQotCXByb3RlY3RlZCBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlBc3NlcnQuaXNOb3ROdWxsKHNlbGVjdGlvbik7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24gcHJvdmlkZWQgYnkgdGhlIHNpdGUgb3duaW5nIHRoaXMgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpdGUncyBzZWxlY3Rpb24KLQkgKi8JCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBhY3Rpb24ncyBlbmFibGVtZW50IHN0YXRlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gc2VsZWN0aW9uLiBUaGlzCi0JICogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYWxscyBvbmUgb2YgdGhlIDxjb2RlPnNlbGVjdGlvbkNoYW5nZWQ8L2NvZGU+Ci0JICogbWV0aG9kcyBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgdGhlIHBhc3NlZCBzZWxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgc2VsZWN0aW9uIHRoaXMgYWN0aW9uIGlzIHdvcmtpbmcgb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZGlzcGF0Y2hTZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBhY3Rpb24gdGhhdCB0aGUgZ2l2ZW4gc3RydWN0dXJlZCBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuIFRoaXMgZGVmYXVsdAotCSAqIGltcGxlbWVudGF0aW9uIGNhbGxzIDxjb2RlPnNlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIHRoZSBuZXcgc2VsZWN0aW9uCi0gCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdCBvYmplY3QgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlzZXRFbmFibGVkKGNhbkVuYWJsZShvYmplY3QpKTsKLQkJfQotCQllbHNlewotCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuRW5hYmxlKE9iamVjdCBzZWxlY3RlZE9iamVjdCl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGlzIGFjdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RydWN0dXJlZCBzZWxlY3Rpb24uIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotCSAqIGNhbGxzIDxjb2RlPnJ1bihJU2VsZWN0aW9uIHNlbGVjdGlvbik8L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcnVuKChJU2VsZWN0aW9uKXNlbGVjdGlvbik7Ci0JfQotCi0JCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBhY3Rpb24gdGhhdCB0aGUgZ2l2ZW4gdGV4dCBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuICBUaGlzIGRlZmF1bHQKLQkgKiBpbXBsZW1lbnRhdGlvbiBjYWxscyA8Y29kZT5zZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24gc2VsZWN0aW9uKTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgbmV3IHNlbGVjdGlvbgotIAkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZWxlY3Rpb25DaGFuZ2VkKChJU2VsZWN0aW9uKXNlbGVjdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoaXMgYWN0aW9ucyB3aXRoIHRoZSBnaXZlbiB0ZXh0IHNlbGVjdGlvbi4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0JICogY2FsbHMgPGNvZGU+cnVuKElTZWxlY3Rpb24gc2VsZWN0aW9uKTwvY29kZT4uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlydW4oKElTZWxlY3Rpb24pc2VsZWN0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBhY3Rpb24gdGhhdCB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGhhcyBjaGFuZ2VkLiAgVGhpcyBkZWZhdWx0Ci0JICogaW1wbGVtZW50YXRpb24gc2V0cyB0aGUgYWN0aW9uJ3MgZW5hYmxlbWVudCBzdGF0ZSB0byA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgbmV3IHNlbGVjdGlvbgotIAkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlcyB0aGlzIGFjdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc2VsZWN0aW9uLiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLQkgKiBkb2VzIG5vdGhpbmcuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIElBY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlkaXNwYXRjaFJ1bihnZXRTZWxlY3Rpb24oKSk7Ci0JCQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJZGlzcGF0Y2hTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzcGF0Y2hTZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJc2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKTsKLQkJfSBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJc2VsZWN0aW9uQ2hhbmdlZCgoSVRleHRTZWxlY3Rpb24pc2VsZWN0aW9uKTsKLQkJfSBlbHNlIHsKLQkJCXNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc3BhdGNoUnVuKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJcnVuKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pOwotCQl9ICBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJcnVuKChJVGV4dFNlbGVjdGlvbilzZWxlY3Rpb24pOwotCQl9IGVsc2UgewotCQkJcnVuKHNlbGVjdGlvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0IGdldE1vZGVsKCkKLQl7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRNb2RlbChPYmplY3QgbW9kZWwpCi0JewotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhblJ1bigpIHsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1hTRFJlZmFjdG9yQWN0aW9uR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1hTRFJlZmFjdG9yQWN0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE2OWYyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvYWN0aW9ucy9YU0RSZWZhY3RvckFjdGlvbkdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLlJlZmFjdG9yQWN0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFhTRFJlZmFjdG9yQWN0aW9uR3JvdXAgZXh0ZW5kcyBSZWZhY3RvckFjdGlvbkdyb3VwIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQUtFX0VMRU1FTlRfR0xPQkFMID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IubWFrZUVsZW1lbnRHbG9iYWwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFLRV9UWVBFX0dMT0JBTCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yLm1ha2VUeXBlR2xvYmFsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTkFNRV9FTEVNRU5UID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IucmVuYW1lLmVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRU5BTUVfVEFSR0VUX05BTUVTUENFID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3IucmVuYW1lVGFyZ2V0TmFtZXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiBmTWFrZUxvY2FsRWxlbWVudEdsb2JhbDsKLQotCXByaXZhdGUgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gZk1ha2VMb2NhbFR5cGVHbG9iYWw7Ci0KLQlwdWJsaWMgWFNEUmVmYWN0b3JBY3Rpb25Hcm91cChJU2VsZWN0aW9uIHNlbGVjdGlvbiwKLQkJCVhTRFNjaGVtYSBzY2hlbWEpIHsKLQkJc3VwZXIoc2VsZWN0aW9uKTsKLQkJZkVkaXRvckFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZSZW5hbWVBY3Rpb24gPSBuZXcgUmVuYW1lQWN0aW9uKHNlbGVjdGlvbiwgc2NoZW1hKTsKLQkJZlJlbmFtZUFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoUkVOQU1FX0VMRU1FTlQpOwotCQlmRWRpdG9yQWN0aW9ucy5hZGQoZlJlbmFtZUFjdGlvbik7Ci0KLQkJLy9mUmVuYW1lVGFyZ2V0TmFtZXNwYWNlID0gbmV3IFJlbmFtZVRhcmdldE5hbWVzcGFjZUFjdGlvbigKLQkJLy8JCXNlbGVjdGlvbiwgc2NoZW1hKTsKLQkJLy9mUmVuYW1lVGFyZ2V0TmFtZXNwYWNlLnNldEFjdGlvbkRlZmluaXRpb25JZChSRU5BTUVfVEFSR0VUX05BTUVTUENFKTsKLQkJLy9mRWRpdG9yQWN0aW9ucy5hZGQoZlJlbmFtZVRhcmdldE5hbWVzcGFjZSk7Ci0KLQkJZk1ha2VMb2NhbEVsZW1lbnRHbG9iYWwgPSBuZXcgTWFrZUxvY2FsRWxlbWVudEdsb2JhbEFjdGlvbigKLQkJCQlzZWxlY3Rpb24sIHNjaGVtYSk7Ci0JCWZNYWtlTG9jYWxFbGVtZW50R2xvYmFsLnNldEFjdGlvbkRlZmluaXRpb25JZChNQUtFX0VMRU1FTlRfR0xPQkFMKTsKLQkJZkVkaXRvckFjdGlvbnMuYWRkKGZNYWtlTG9jYWxFbGVtZW50R2xvYmFsKTsKLQotCQlmTWFrZUxvY2FsVHlwZUdsb2JhbCA9IG5ldyBNYWtlQW5vbnltb3VzVHlwZUdsb2JhbEFjdGlvbigKLQkJCQlzZWxlY3Rpb24sIHNjaGVtYSk7Ci0JCWZNYWtlTG9jYWxUeXBlR2xvYmFsLnNldEFjdGlvbkRlZmluaXRpb25JZChNQUtFX1RZUEVfR0xPQkFMKTsKLQkJZkVkaXRvckFjdGlvbnMuYWRkKGZNYWtlTG9jYWxUeXBlR2xvYmFsKTsKLQotCQlpbml0QWN0aW9uKGZSZW5hbWVBY3Rpb24sIHNlbGVjdGlvbik7Ci0JCS8vaW5pdEFjdGlvbihmUmVuYW1lVGFyZ2V0TmFtZXNwYWNlLCBzZWxlY3Rpb24pOwotCQlpbml0QWN0aW9uKGZNYWtlTG9jYWxFbGVtZW50R2xvYmFsLCBzZWxlY3Rpb24pOwotCQlpbml0QWN0aW9uKGZNYWtlTG9jYWxUeXBlR2xvYmFsLCBzZWxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0vLwkJZGlzcG9zZUFjdGlvbihmUmVuYW1lQWN0aW9uLCBzZWxlY3Rpb24pOwotLy8JCWRpc3Bvc2VBY3Rpb24oZk1ha2VMb2NhbEVsZW1lbnRHbG9iYWwsIHNlbGVjdGlvbik7Ci0vLwkJZGlzcG9zZUFjdGlvbihmTWFrZUxvY2FsVHlwZUdsb2JhbCwgc2VsZWN0aW9uKTsKLS8vCQlkaXNwb3NlQWN0aW9uKGZSZW5hbWVUYXJnZXROYW1lc3BhY2UsIHNlbGVjdGlvbik7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1hTRFJlZmFjdG9yR3JvdXBBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvWFNEUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwODczZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvWFNEUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuYWN0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLklTZWxlY3Rpb25NYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zLlhTRFJlZmFjdG9yQWN0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQuUmVmYWN0b3JBY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZC5SZWZhY3Rvckdyb3VwQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQuUmVmYWN0b3JHcm91cFN1Yk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFhTRFJlZmFjdG9yR3JvdXBBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIFJlZmFjdG9yR3JvdXBBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwdWJsaWMgWFNEUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEZpbGxzIHRoZSBtZW51IHdpdGggYXBwbGljYWJsZSByZWZhY3RvciBzdWItbWVudWVzCi0JICogQHBhcmFtIG1lbnUgVGhlIG1lbnUgdG8gZmlsbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxNZW51KE1lbnUgbWVudSkgewotCQlpZiAoZlNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHdvcmtiZW5jaFBhcnQgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhcnRTaXRlIHNpdGUgPSB3b3JrYmVuY2hQYXJ0LmdldFNpdGUoKTsKLQkJCWlmIChzaXRlID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gc2l0ZS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKWVkaXRvci5nZXRBZGFwdGVyKFhTRFNjaGVtYS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgSVNlbGVjdGlvbk1hcHBlciBtYXBwZXIgPSAoSVNlbGVjdGlvbk1hcHBlcillZGl0b3IuZ2V0QWRhcHRlcihJU2VsZWN0aW9uTWFwcGVyLmNsYXNzKTsKLQkJCSAgICBpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBtYXBwZXIgIT0gbnVsbCA/IG1hcHBlci5tYXBTZWxlY3Rpb24oZlNlbGVjdGlvbikgOiBmU2VsZWN0aW9uOyAgICAgICAgICAgICAgICAgICAgCi0JCQkJCVJlZmFjdG9yQWN0aW9uR3JvdXAgcmVmYWN0b3JNZW51R3JvdXAgPSBuZXcgWFNEUmVmYWN0b3JBY3Rpb25Hcm91cChzZWxlY3Rpb24sIHNjaGVtYSk7Ci0JCQkJCVJlZmFjdG9yR3JvdXBTdWJNZW51IHN1Yk1lbnUgPSBuZXcgUmVmYWN0b3JHcm91cFN1Yk1lbnUocmVmYWN0b3JNZW51R3JvdXApOwotCQkJCQlzdWJNZW51LmZpbGwobWVudSwgLTEpOwotCQkJCX0JCQkJCi0JCQl9Ci0JCQotCQl9Ci0JCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvWFNEU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9hY3Rpb25zL1hTRFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMjhkZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL2FjdGlvbnMvWFNEU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgY2xhc3MgWFNEU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbgotewotCi0JCi0JCi0JcHVibGljIFhTRFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBPYmplY3QgbW9kZWwpCi0JewotCQlzdXBlcihzZWxlY3Rpb24pOwotCQlzZXRNb2RlbChtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhTRFNjaGVtYSBnZXRTY2hlbWEoKXsKLQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYobW9kZWwgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0JCXsKLQkJCXJldHVybiAoWFNEU2NoZW1hKSBtb2RlbDsKLQkJfQotCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuRW5hYmxlKE9iamVjdCBzZWxlY3RlZENvbXBvbmVudCkKLQl7Ci0JCVhTRFNjaGVtYSBzZWxlY3RlZENvbXBvbmVudFNjaGVtYSA9IG51bGw7Ci0JCWlmIChzZWxlY3RlZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotCQl7Ci0JCQlzZWxlY3RlZENvbXBvbmVudFNjaGVtYSA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpc2VsZWN0ZWRDb21wb25lbnQpLmdldFNjaGVtYSgpOwotCQl9Ci0JCQotCQlpZiAoc2VsZWN0ZWRDb21wb25lbnRTY2hlbWEgIT0gbnVsbCAmJiBzZWxlY3RlZENvbXBvbmVudFNjaGVtYSA9PSBnZXRTY2hlbWEoKSApCi0JCXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDUxODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotUmVmYWN0b3JNZW51LmxhYmVsPVJlZmFjdG9yCi1SZWZhY3RvckFjdGlvbkdyb3VwLm5vX3JlZmFjdG9yaW5nX2F2YWlsYWJsZT08bm8gcmVmYWN0b3JpbmcgYXZhaWxhYmxlPgotCi1SZW5hbWVBY3Rpb24ucmVuYW1lPVJlbmFtZQotUmVuYW1lQWN0aW9uLnVuYXZhaWxhYmxlPU9wZXJhdGlvbiB1bmF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uXG5TZWxlY3QgYSAuLi4uCi1SZW5hbWVBY3Rpb24udGV4dD1SZSZuYW1lLi4uCi0KLVJlbmFtZUlucHV0V2l6YXJkUGFnZS5uZXdfbmFtZT0gJk5ldyBuYW1lOgotUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQuaW50ZXJuYWxfZXJyb3I9IEludGVybmFsIGVycm9yIGR1cmluZyBuYW1lIGNoZWNraW5nOiB7MH0KLQotCi1SZW5hbWVYU0RFbGVtZW50QWN0aW9uLmV4Y2VwdGlvbj1VbmV4cGVjdGVkIGV4Y2VwdGlvbiBvY2N1cnJlZC4gU2VlIGxvZyBmb3IgZGV0YWlscwotUmVuYW1lWFNERWxlbWVudEFjdGlvbi5ub3RfYXZhaWxhYmxlPU9wZXJhdGlvbiB1bmF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uXG5TZWxlY3QgYSBYU0QgcHJvamVjdCwgZm9sZGVyLCByZXNvdXJjZSwgZmlsZSwgYXR0cmlidXRlIGRlY2xhcmF0aW9ucywgIGF0dHJpYnV0ZSBncm91cCBkZWZpbml0aW9ucywgY29tcGxleCB0eXBlIGRlZmluaXRpb25zLCBlbGVtZW50IGRlY2xhcmF0aW9ucywgaWRlbnRpdHkgY29uc3RyYWludCBkZWZpbml0aW9ucywgbW9kZWwgZ3JvdXBzIGRlZmluaXRpb25zLCBub3RhdGlvbiBkZWNsYXJhdGlvbnMsIG9yIHNpbXBsZSB0eXBlIGRlZmluaXRpb25zLgotUmVuYW1lWFNERWxlbWVudEFjdGlvbi5uYW1lPVJlbmFtZQotCi0KLVJlbmFtZVN1cHBvcnQuZGlhbG9nLnRpdGxlPVJlbmFtZQotUmVuYW1lU3VwcG9ydC5ub3RfYXZhaWxhYmxlPVJlbmFtZSBzdXBwb3J0IG5vdCBhdmFpbGFibGUKLQotUmVuYW1lQ29tcG9uZW50V2l6YXJkLmRlZmF1bHRQYWdlVGl0bGU9UmVuYW1lIHdpemFyZAotUmVuYW1lQ29tcG9uZW50V2l6YXJkLmlucHV0UGFnZS5kZXNjcmlwdGlvbj1SZW5hbWUgWE1MIFNjaGVtYSBjb21wb25lbnQKLQotUmVuYW1lSW5wdXRXaXphcmRQYWdlLnVwZGF0ZV9yZWZlcmVuY2VzPVVwZGF0ZSByZWZlcmVuY2VzCi1YU0RDb21wb25lbnRSZW5hbWVDaGFuZ2UubmFtZT1YTUwgU2NoZW1hIGNvbXBvbmVudCByZW5hbWluZyBpbiB7MH06IHsxfSB0byB7Mn0KLVhTRENvbXBvbmVudFJlbmFtZUNoYW5nZS5SZW5hbWluZz1SZW5hbWluZy4uLgotUmVzb3VyY2VSZW5hbWVQYXJ0aWNpcGFudC5jb21wb3NpdGVDaGFuZ2VOYW1lPVhTRCBmaWxlIHJlbmFtZSByZWZlcmVuY2VzIHVwZGF0aW5nIGNoYW5nZXMKLVJlbmFtZVJlc291cmNlQ2hhbmdlLnJlbmFtZV9yZXNvdXJjZV9yZWZlcmVuY2VfY2hhbmdlPVJlbmFtaW5nIHJlc291cmNlIG5hbWUgcmVmZXJlbmNlcwotWFNEUmVuYW1lUmVzb3VyY2VDaGFuZ2UubmFtZT1SZXNvdXJjZSByZW5hbWU6IHswfSB0byB7MX0KLVJlbmFtZVJlc291cmNlUmVmYWN0b3JpbmcuSW50ZXJuYWxfRXJyb3I9SW50ZXJuYWwgZXJyb3IKLVJlbmFtZVJlc291cmNlUmVmYWN0b3JpbmcuYWxyZWFkX2V4aXN0cz1SZXNvdXJjZSBhbHJlYWR5IGV4aXN0Ci1SZW5hbWVSZXNvdXJjZVJlZmFjdG9yaW5nLmludmFsaWROYW1lPUludmFsaWQgcmVzb3VyY2UgbmFtZQotUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3IubmFtZT1SZXNvdXJjZSByZW5hbWluZwotTWFrZUxvY2FsRWxlbWVudEdsb2JhbEFjdGlvbi50ZXh0PU1ha2UgTG9jYWwgRWxlbWVudCBHbG9iYWwKLVhTRENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50LkNvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVzPVhNTCBTY2hlbWEgcmVmYWN0b3JpbmcgY2hhbmdlcwotV1NETENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50LkNvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVzPVdTREwgcmVmYWN0b3JpbmcgY2hhbmdlcwotUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yLkNvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVzPUNvbXBvbmVudCBuYW1lIHJlZmFjdG9yaW5nIGNoYW5nZXMKLVJlbmFtZUNvbXBvbmVudFByb2Nlc3Nvci5Db21wb25lbnRfUmVmYWN0b3JpbmdfdXBkYXRlX2RlY2xhdGF0aW9uPVVwZGF0ZSBjb21wb25lbnQgZGVjbGFyYXRpb24vZGVmaW5pdGlvbgotUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yLkNvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVfcmVmZXJlbmNlPVVwZGF0ZSBjb21wb25lbnQgcmVmZXJlbmNlCi1YU0RDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudC54c2RfY29tcG9uZW50X3JlbmFtZV9wYXJ0aWNpcGFudD1YU0QgY29tcG9uZW50IHJlbmFtZSBwYXJ0aWNpcGFudAotV1NETENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50LndzZGxfY29tcG9uZW50X3JlbmFtZV9wYXJ0aWNpcGFudD1XU0RMIGNvbXBvbmVudCByZW5hbWUgcGFydGljaXBhbnQKLVJlc291cmNlUmVuYW1lUGFydGljaXBhbnQuRmlsZV9SZW5hbWVfdXBkYXRlX3JlZmVyZW5jZT1GaWxlIHJlbmFtZSByZWZhY3RvcmluZyBjaGFuZ2VzCi1SZW5hbWVDb21wb25lbnRSZWZhY3RvcmluZ19jaGVja2luZz1DaGVja2luZy4uLgotUmVuYW1lQ29tcG9uZW50UmVmYWN0b3Jpbmdfc2VhcmNoaW5nPVNlYXJjaGluZy4uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvQ29tcG9uZW50UmVuYW1lQXJndW1lbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL0NvbXBvbmVudFJlbmFtZUFyZ3VtZW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmRmM2QwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvQ29tcG9uZW50UmVuYW1lQXJndW1lbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lQXJndW1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuVGV4dENoYW5nZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRSZW5hbWVBcmd1bWVudHMgZXh0ZW5kcyBSZW5hbWVBcmd1bWVudHMgewotCQotCVRleHRDaGFuZ2VNYW5hZ2VyIGNoYW5nZU1hbmFnZXI7Ci0JTWFwIG1hdGNoZXM7Ci0JU3RyaW5nIHF1YWxpZmllcjsKLQotCXB1YmxpYyBDb21wb25lbnRSZW5hbWVBcmd1bWVudHMoU3RyaW5nIG5ld05hbWUsIGJvb2xlYW4gdXBkYXRlUmVmZXJlbmNlcykgewotCQlzdXBlcihuZXdOYW1lLCB1cGRhdGVSZWZlcmVuY2VzKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dENoYW5nZU1hbmFnZXIgZ2V0Q2hhbmdlTWFuYWdlcigpIHsKLQkJcmV0dXJuIGNoYW5nZU1hbmFnZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlTWFuYWdlcihUZXh0Q2hhbmdlTWFuYWdlciBjaGFuZ2VNYW5hZ2VyKSB7Ci0JCXRoaXMuY2hhbmdlTWFuYWdlciA9IGNoYW5nZU1hbmFnZXI7Ci0JfQotCi0JcHVibGljIE1hcCBnZXRNYXRjaGVzKCkgewotCQlyZXR1cm4gbWF0Y2hlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXRjaGVzKE1hcCBtYXRjaGVzKSB7Ci0JCXRoaXMubWF0Y2hlcyA9IG1hdGNoZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZXIoKSB7Ci0JCXJldHVybiBxdWFsaWZpZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UXVhbGlmaWVyKFN0cmluZyBxdWFsaWZpZXIpIHsKLQkJdGhpcy5xdWFsaWZpZXIgPSBxdWFsaWZpZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1JlbmFtZUNvbXBvbmVudFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZW5hbWVDb21wb25lbnRQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBkY2Y2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1JlbmFtZUNvbXBvbmVudFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWU7Ci0KLS8vaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotLy9pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNvbXBvc2l0ZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0Q2hhbmdlOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlBhcnRpY2lwYW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lQXJndW1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5TaGFyYWJsZVBhcnRpY2lwYW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5TZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlbGVjdGlvblNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuV29ya3NwYWNlU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC51dGlsLkNvbGxlY3RpbmdTZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5YTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5YTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuQ2hlY2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuSU5hbWVVcGRhdGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLklSZWZlcmVuY2VVcGRhdGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlRleHRDaGFuZ2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IudXRpbC5UZXh0Q2hhbmdlQ29tcGF0aWJpbGl0eTsKLQotCi0KLXB1YmxpYyBjbGFzcyBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IgZXh0ZW5kcyBSZW5hbWVQcm9jZXNzb3IgaW1wbGVtZW50cyBJTmFtZVVwZGF0aW5nLCBJUmVmZXJlbmNlVXBkYXRpbmcgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USUZJRVIgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5yZWZhY3Rvci5yZW5hbWVDb21wb25lbnRQcm9jZXNzb3IiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBib29sZWFuIHNpbmdsZUZpbGVPbmx5ID0gZmFsc2U7Ci0gICAgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcXVvdGVTdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCXZhbHVlID0gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWU7Ci0KLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAoIXZhbHVlLnN0YXJ0c1dpdGgoIlwiIikpIHsKLQkJCXNiLmFwcGVuZCgiXCIiKTsKLQkJfQotCQlzYi5hcHBlbmQodmFsdWUpOwotCQlpZiAoIXZhbHVlLmVuZHNXaXRoKCJcIiIpKSB7Ci0JCQlzYi5hcHBlbmQoIlwiIik7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0Q2hhbmdlTWFuYWdlciBjaGFuZ2VNYW5hZ2VyOwotCi0JcHJpdmF0ZSBTdHJpbmcgbmV3TmFtZTsKLQotCXByaXZhdGUgUmVmYWN0b3JpbmdDb21wb25lbnQgc2VsZWN0ZWRDb21wb25lbnQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRlUmVmZXJlbmNlcyA9IHRydWU7Ci0KLQlwcml2YXRlIE1hcCByZWZlcmVuY2VzID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IoUmVmYWN0b3JpbmdDb21wb25lbnQgc2VsZWN0ZWRDb21wb25lbnQpIHsKLQkJdGhpcy5zZWxlY3RlZENvbXBvbmVudCA9IHNlbGVjdGVkQ29tcG9uZW50OwotCX0KLQotCXB1YmxpYyBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IoUmVmYWN0b3JpbmdDb21wb25lbnQgc2VsZWN0ZWRDb21wb25lbnQsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMoc2VsZWN0ZWRDb21wb25lbnQsIG5ld05hbWUsIGZhbHNlKTsKLQl9Ci0gICAgCi0gICAgcHVibGljIFJlbmFtZUNvbXBvbmVudFByb2Nlc3NvcihSZWZhY3RvcmluZ0NvbXBvbmVudCBzZWxlY3RlZENvbXBvbmVudCwgU3RyaW5nIG5ld05hbWUsIGJvb2xlYW4gc2luZ2xlRmlsZU9ubHkpIHsKLSAgICAgICAgdGhpcy5uZXdOYW1lID0gbmV3TmFtZTsKLSAgICAgICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudCA9IHNlbGVjdGVkQ29tcG9uZW50OwotICAgICAgICB0aGlzLnNpbmdsZUZpbGVPbmx5ID0gc2luZ2xlRmlsZU9ubHk7Ci0gICAgfSAgICAKLQotCXByaXZhdGUgdm9pZCBhZGREZWNsYXJhdGlvblVwZGF0ZShUZXh0Q2hhbmdlTWFuYWdlciBtYW5hZ2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmaWxlU3RyID0gc2VsZWN0ZWRDb21wb25lbnQuZ2V0RWxlbWVudCgpLmdldE1vZGVsKCkuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoZmlsZVN0cikpOwotCQlhZGREZWNsYXJhdGlvblVwZGF0ZShtYW5hZ2VyLCBmaWxlKTsKLQl9Ci0KLQlmaW5hbCB2b2lkIGFkZERlY2xhcmF0aW9uVXBkYXRlKFRleHRDaGFuZ2VNYW5hZ2VyIG1hbmFnZXIsIElGaWxlIGZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgY29tcG9uZW50TmFtZSA9IHNlbGVjdGVkQ29tcG9uZW50LmdldE5hbWUoKTsKLQkJU3RyaW5nIGNvbXBvbmVudE5hbWVzcGFjZSA9IHNlbGVjdGVkQ29tcG9uZW50LmdldE5hbWVzcGFjZVVSSSgpOwotCQlRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSA9IG5ldyBRdWFsaWZpZWROYW1lKGNvbXBvbmVudE5hbWVzcGFjZSwgY29tcG9uZW50TmFtZSk7Ci0JCVF1YWxpZmllZE5hbWUgdHlwZVFOYW1lID0gc2VsZWN0ZWRDb21wb25lbnQuZ2V0VHlwZVFOYW1lKCk7Ci0KLQotCi0JCVNlYXJjaFNjb3BlIHNjb3BlID0gbmV3IFdvcmtzcGFjZVNlYXJjaFNjb3BlKCk7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCXNjb3BlID0gbmV3IFNlbGVjdGlvblNlYXJjaFNjb3BlKG5ldyBJUmVzb3VyY2VbXXtmaWxlfSk7Ci0JCX0KLQkJQ29sbGVjdGluZ1NlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgQ29sbGVjdGluZ1NlYXJjaFJlcXVlc3RvcigpOwotCQlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSBuZXcgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuKGZpbGUsIGVsZW1lbnRRTmFtZSwgdHlwZVFOYW1lKTsKLQkJU2VhcmNoRW5naW5lIHNlYXJjaEVuZ2luZSA9IG5ldyBTZWFyY2hFbmdpbmUoKTsKLSAgICAgICAgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBpZiAoc2luZ2xlRmlsZU9ubHkpCi0gICAgICAgIHsKLSAgICAgICAgICBtYXAucHV0KCJzZWFyY2hEaXJ0eUNvbnRlbnQiLCBCb29sZWFuLlRSVUUpOwotICAgICAgICB9ICAKLQkJc2VhcmNoRW5naW5lLnNlYXJjaChwYXR0ZXJuLCByZXF1ZXN0b3IsIHNjb3BlLCBtYXAsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlMaXN0IHJlc3VsdHMgPSByZXF1ZXN0b3IuZ2V0UmVzdWx0cygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXN1bHRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU2VhcmNoTWF0Y2ggbWF0Y2ggPSAoU2VhcmNoTWF0Y2gpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG1hdGNoICE9IG51bGwpIHsKLQkJCQlUZXh0Q2hhbmdlIHRleHRDaGFuZ2UgPSBtYW5hZ2VyLmdldChtYXRjaC5nZXRGaWxlKCkpOwotCQkJCVN0cmluZyBuZXdOYW1lID0gZ2V0TmV3RWxlbWVudE5hbWUoKTsKLQkJCQluZXdOYW1lID0gcXVvdGVTdHJpbmcobmV3TmFtZSk7Ci0KLQkJCQlSZXBsYWNlRWRpdCByZXBsYWNlRWRpdCA9IG5ldyBSZXBsYWNlRWRpdChtYXRjaC5nZXRPZmZzZXQoKSwgbWF0Y2guZ2V0TGVuZ3RoKCksIG5ld05hbWUpOwotCQkJCVN0cmluZyBlZGl0TmFtZSA9IFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IuQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZV9kZWNsYXRhdGlvbiIpOwotCQkJCVRleHRDaGFuZ2VDb21wYXRpYmlsaXR5LmFkZFRleHRFZGl0KHRleHRDaGFuZ2UsIGVkaXROYW1lLCByZXBsYWNlRWRpdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIGFkZE9jY3VycmVuY2VzKFRleHRDaGFuZ2VNYW5hZ2VyIG1hbmFnZXIsIElQcm9ncmVzc01vbml0b3IgcG0sIFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCVN0cmluZyBmaWxlU3RyID0gc2VsZWN0ZWRDb21wb25lbnQuZ2V0RWxlbWVudCgpLmdldE1vZGVsKCkuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoZmlsZVN0cikpOwotCi0JCVN0cmluZyBjb21wb25lbnROYW1lID0gc2VsZWN0ZWRDb21wb25lbnQuZ2V0TmFtZSgpOwotCQlTdHJpbmcgY29tcG9uZW50TmFtZXNwYWNlID0gc2VsZWN0ZWRDb21wb25lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCVF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lID0gbmV3IFF1YWxpZmllZE5hbWUoY29tcG9uZW50TmFtZXNwYWNlLCBjb21wb25lbnROYW1lKTsKLQkJUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUgPSBzZWxlY3RlZENvbXBvbmVudC5nZXRUeXBlUU5hbWUoKTsKLQotCQlTZWFyY2hFbmdpbmUgc2VhcmNoRW5naW5lID0gbmV3IFNlYXJjaEVuZ2luZSgpOwotICAgICAgICBTZWFyY2hTY29wZSBzY29wZSA9IG51bGw7Ci0gICAgICAgIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgaWYgKHNpbmdsZUZpbGVPbmx5KQotICAgICAgICB7Ci0gICAgICAgICAgbWFwLnB1dCgic2VhcmNoRGlydHlDb250ZW50IiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICBzY29wZSA9IG5ldyBTZWxlY3Rpb25TZWFyY2hTY29wZShuZXcgSVJlc291cmNlW117ZmlsZX0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeyAgCi0gICAgICAgICAgc2NvcGUgPSBuZXcgV29ya3NwYWNlU2VhcmNoU2NvcGUoKTsKLSAgICAgICAgfSAKLQkJU29ydGluZ1NlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgU29ydGluZ1NlYXJjaFJlcXVlc3RvcigpOwotCQlTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSBuZXcgWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybihmaWxlLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSk7Ci0gICAgICAgIAotCQlzZWFyY2hFbmdpbmUuc2VhcmNoKHBhdHRlcm4sIHJlcXVlc3Rvciwgc2NvcGUsIG1hcCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCXJlZmVyZW5jZXMgPSByZXF1ZXN0b3IuZ2V0UmVzdWx0cygpOwotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBTZWFyY2hNYXRjaCBtYXRjaCA9IChTZWFyY2hNYXRjaCkgaXRlci5uZXh0KCk7Ci0KLQkJLy8gVGV4dENoYW5nZSB0ZXh0Q2hhbmdlID0gbWFuYWdlci5nZXQobWF0Y2guZ2V0RmlsZSgpKTsKLQkJLy8gU3RyaW5nIG5ld05hbWUgPSBnZXROZXdFbGVtZW50TmFtZSgpOwotCQkvLyBpZihtYXRjaC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIE5vZGUpewotCQkvLyBOb2RlIG5vZGUgPSAoTm9kZSltYXRjaC5nZXRPYmplY3QoKTsKLQkJLy8gaWYobm9kZSBpbnN0YW5jZW9mIElET01BdHRyKXsKLQkJLy8gSURPTUF0dHIgYXR0ciA9IChJRE9NQXR0cilub2RlOwotCQkvLyBJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KWF0dHIuZ2V0T3duZXJFbGVtZW50KCkgOwotCQkvLyBuZXdOYW1lID0gZ2V0TmV3UU5hbWUoZWxlbWVudCwgY29tcG9uZW50TmFtZXNwYWNlLCBuZXdOYW1lKTsKLQkJLy8gfQotCQkvLyBuZXdOYW1lID0gcXVvdGVTdHJpbmcobmV3TmFtZSk7Ci0JCS8vIH0KLQkJLy8JCQkJCi0JCS8vIFJlcGxhY2VFZGl0IHJlcGxhY2VFZGl0ID0gbmV3IFJlcGxhY2VFZGl0KG1hdGNoLmdldE9mZnNldCgpLAotCQkvLyBtYXRjaC5nZXRMZW5ndGgoKSwgbmV3TmFtZSApOwotCQkvLyBTdHJpbmcgZWRpdE5hbWUgPQotCQkvLyBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yLkNvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVfcmVmZXJlbmNlIik7Ci0JCS8vIFRleHRDaGFuZ2VDb21wYXRpYmlsaXR5LmFkZFRleHRFZGl0KHRleHRDaGFuZ2UsIGVkaXROYW1lLAotCQkvLyByZXBsYWNlRWRpdCk7Ci0KLQkJLy8gfQotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnJlZmFjdG9yaW5nLnRhZ2dpbmcuSVRleHRVcGRhdGluZyNjYW5FbmFibGVUZXh0VXBkYXRpbmcoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkVuYWJsZVRleHRVcGRhdGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRW5hYmxlVXBkYXRlUmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNjaGVja0ZpbmFsQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0KQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0ZpbmFsQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChtb25pdG9yKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChjb250ZXh0KTsKLQkJZmluYWwgUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzID0gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JCXRyeSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMik7IC8vJE5PTi1OTFMtMSQKLQkJCW1vbml0b3Iuc2V0VGFza05hbWUoUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZUNvbXBvbmVudFJlZmFjdG9yaW5nX2NoZWNraW5nIikpOyAvLyROT04tTkxTLTEkCi0JCQlzdGF0dXMubWVyZ2UoY2hlY2tOZXdFbGVtZW50TmFtZShnZXROZXdFbGVtZW50TmFtZSgpKSk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCW1vbml0b3Iuc2V0VGFza05hbWUoUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZUNvbXBvbmVudFJlZmFjdG9yaW5nX3NlYXJjaGluZyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJc3RhdHVzLm1lcmdlKGNyZWF0ZVJlbmFtZUNoYW5nZXMobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2NoZWNrSW5pdGlhbENvbmRpdGlvbnMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrSW5pdGlhbENvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBhZGQgY29kZSB0byBjaGVjayBpbml0aWFsIGNvbmRpdGlvbnMgZm9yIGNvbXBvbmVudCByZW5hbWUKLQkJQXNzZXJ0LmlzTm90TnVsbChwbSk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlwbS5kb25lKCk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBmaW5hbCBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja05ld0VsZW1lbnROYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobmFtZSk7Ci0JCWZpbmFsIFJlZmFjdG9yaW5nU3RhdHVzIHJlc3VsdCA9IENoZWNrcy5jaGVja05hbWUobmFtZSk7Ci0JCXJlc3VsdC5tZXJnZShDaGVja3MuY2hlY2tDb21wb25lbnROYW1lKG5hbWUpKTsKLQkJaWYgKENoZWNrcy5pc0FscmVhZHlOYW1lZChzZWxlY3RlZENvbXBvbmVudCwgbmFtZSkpCi0JCQlyZXN1bHQuYWRkRmF0YWxFcnJvcigiUmVmYWN0b3JpbmdNZXNzYWdlcy5SZW5hbWVDb21wb25lbnRSZWZhY3RvcmluZ19hbm90aGVyX25hbWUiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGNvbXB1dGVEZXJpdmVkRWxlbWVudHMoKSB7Ci0KLQkJT2JqZWN0W10gZWxlbWVudHMgPSBnZXRFbGVtZW50cygpOwotCQkvLyBPYmplY3RbXSByZXN1bHRzID0gbmV3IE9iamVjdFtlbGVtZW50cy5sZW5ndGhdOwotCQkvLyBmb3IoaW50IGk9MDsgaTwgZWxlbWVudHMubGVuZ3RoOyBpKyspewotCQkvLyBSZWZhY3RvcmluZ0NvbXBvbmVudCBjb21wb25lbnQgPSAoUmVmYWN0b3JpbmdDb21wb25lbnQpZWxlbWVudHNbaV07Ci0JCS8vIHJlc3VsdHNbaV0gPSBjb21wb25lbnQuZ2V0QWRhcHRlZSgpOwotCQkvLwkJCQotCQkvLyB9Ci0JCXJldHVybiBlbGVtZW50czsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2NyZWF0ZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQkvLyBkb24ndCBjcmVhdGUgYW55IGNoYW5nZSBub3csIGFsbCB0aGUgY2hhbmdlcyBhcmUgaW4gY2hhbmdlTWFuZ2VyCi0JCS8vIHZhcmlhYmxlIGFuZCB3aWxsIGJlIGNvbWJpbmVkIGluIHBvc3RDcmVhdGVDaGFuZ2UgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgVGV4dENoYW5nZU1hbmFnZXIgdXBkYXRlQ2hhbmdlTWFuYWdlcihJUHJvZ3Jlc3NNb25pdG9yIHBtLCBSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGV4dENoYW5nZU1hbmFnZXIgbWFuYWdlciA9IGdldENoYW5nZU1hbmFnZXIoKTsKLQkJLy8gb25seSBvbmUgZGVjbGFyYXRpb24gZ2V0cyB1cGRhdGVkCi0JCWFkZERlY2xhcmF0aW9uVXBkYXRlKG1hbmFnZXIpOwotCQlpZiAoZ2V0VXBkYXRlUmVmZXJlbmNlcygpKSB7Ci0JCQlhZGRPY2N1cnJlbmNlcyhtYW5hZ2VyLCBwbSwgc3RhdHVzKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQlwcml2YXRlIFJlZmFjdG9yaW5nU3RhdHVzIGNyZWF0ZVJlbmFtZUNoYW5nZXMoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwobW9uaXRvcik7Ci0JCWZpbmFsIFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cyA9IG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCQl0cnkgewotCQkJbW9uaXRvci5iZWdpblRhc2soUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZUNvbXBvbmVudFJlZmFjdG9yaW5nX3NlYXJjaGluZyIpLCAxKTsgLy8kTk9OLU5MUy0xJAotCQkJdXBkYXRlQ2hhbmdlTWFuYWdlcihuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpLCBzdGF0dXMpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwdWJsaWMgVGV4dENoYW5nZU1hbmFnZXIgZ2V0Q2hhbmdlTWFuYWdlcigpIHsKLQotCQlpZiAoY2hhbmdlTWFuYWdlciA9PSBudWxsKSB7Ci0JCQljaGFuZ2VNYW5hZ2VyID0gbmV3IFRleHRDaGFuZ2VNYW5hZ2VyKGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gY2hhbmdlTWFuYWdlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QuaW50ZXJuYWwucmVmYWN0b3JpbmcucmVuYW1lLlhTRFJlbmFtZVByb2Nlc3NvciNnZXRBZmZlY3RlZFByb2plY3ROYXR1cmVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0QWZmZWN0ZWRQcm9qZWN0TmF0dXJlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETzogZmluZCBwcm9qZWN0IG5hdHVyZXMgb2YgdGhlIGZpbGVzIHRoYXQgYXJlIGdvaW5nIHRvIGJlCi0JCS8vIHJlZmFjdG9yZWQKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSJ9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC5yZWZhY3RvcmluZy50YWdnaW5nLklUZXh0VXBkYXRpbmcjZ2V0Q3VycmVudEVsZW1lbnROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRFbGVtZW50TmFtZSgpIHsKLQkJLy8KLQkJcmV0dXJuIHNlbGVjdGVkQ29tcG9uZW50LmdldE5hbWUoKTsKLQl9Ci0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjZ2V0RWxlbWVudHMoKQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cygpIHsKLQkJT2JqZWN0IG1vZGVsID0gc2VsZWN0ZWRDb21wb25lbnQuZ2V0TW9kZWxPYmplY3QoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgT2JqZWN0W117bW9kZWx9OwotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2dldElkZW50aWZpZXIoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIElERU5USUZJRVI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXdFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIG5ld05hbWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjZ2V0UHJvY2Vzc29yTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9jZXNzb3JOYW1lKCkgewotCQlyZXR1cm4gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRGb3JtYXR0ZWRTdHJpbmcoIlJlbmFtZUNvbXBvbmVudFJlZmFjdG9yaW5nLm5hbWUiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBTdHJpbmdbXXtzZWxlY3RlZENvbXBvbmVudC5nZXROYW1lc3BhY2VVUkkoKSArICI6IiArIHNlbGVjdGVkQ29tcG9uZW50LmdldE5hbWUoKSwgbmV3TmFtZX0pOwotCi0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBnZXRVcGRhdGVSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gdXBkYXRlUmVmZXJlbmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNpc0FwcGxpY2FibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHNlbGVjdGVkQ29tcG9uZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIFRPRE8gaW1wbGVtZW50IGlzQXBwbGljYWJsZSBsb2dpYyBmb3IgdGhlIG5hbWVkIGNvbXBvbmVudCwKLQkJLy8gdmVyaWZ5IGhvdyBpdCBpcyBkaWZmZXJlbnQgZnJvbSBvdGhlciBjb25kaXRpb24gY2hlY2tzCi0JCS8vIGlmIChmTmFtZWRDb21wb25lbnQuaXNBbm9ueW1vdXMoKSkKLQkJLy8gcmV0dXJuIGZhbHNlOwotCQkvLyBpZiAoISBDaGVja3MuaXNBdmFpbGFibGUoZlR5cGUpKQotCQkvLyByZXR1cm4gZmFsc2U7Ci0JCS8vIGlmIChpc1NwZWNpYWxDYXNlKGZUeXBlKSkKLQkJLy8gcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGVyaXZlZFBhcnRpY2lwYW50cyhSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMsIExpc3QgcmVzdWx0LCBPYmplY3RbXSBkZXJpdmVkRWxlbWVudHMsIENvbXBvbmVudFJlbmFtZUFyZ3VtZW50cyBhcmd1bWVudHMsIFN0cmluZ1tdIG5hdHVyZXMsIFNoYXJhYmxlUGFydGljaXBhbnRzIHNoYXJlZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZGVyaXZlZEVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVyaXZlZEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUmVuYW1lUGFydGljaXBhbnRbXSBwYXJ0aWNpcGFudHMgPSBQYXJ0aWNpcGFudE1hbmFnZXIubG9hZFJlbmFtZVBhcnRpY2lwYW50cyhzdGF0dXMsIHRoaXMsIGRlcml2ZWRFbGVtZW50c1tpXSwgYXJndW1lbnRzLCBuYXR1cmVzLCBzaGFyZWQpOwotCQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChwYXJ0aWNpcGFudHMpKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLmludGVybmFsLnJlZmFjdG9yaW5nLnJlbmFtZS5YU0RSZW5hbWVQcm9jZXNzb3IjbG9hZERlcml2ZWRQYXJ0aWNpcGFudHMob3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXMsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCwgamF2YS5sYW5nLlN0cmluZ1tdLAotCSAqICAgICAgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlNoYXJhYmxlUGFydGljaXBhbnRzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWREZXJpdmVkUGFydGljaXBhbnRzKFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cywgTGlzdCByZXN1bHQsIFN0cmluZ1tdIG5hdHVyZXMsIFNoYXJhYmxlUGFydGljaXBhbnRzIHNoYXJlZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlDb21wb25lbnRSZW5hbWVBcmd1bWVudHMgYXJndW1lbnRzID0gbmV3IENvbXBvbmVudFJlbmFtZUFyZ3VtZW50cyhnZXROZXdFbGVtZW50TmFtZSgpLCBnZXRVcGRhdGVSZWZlcmVuY2VzKCkpOwotCQlhcmd1bWVudHMuc2V0TWF0Y2hlcyhyZWZlcmVuY2VzKTsKLQkJYXJndW1lbnRzLnNldFF1YWxpZmllcihzZWxlY3RlZENvbXBvbmVudC5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCS8vIHBhc3MgaW4gY2hhbmdlTWFuZ2VyIHRvIHRoZSBwYXJ0aWNpcGFudHMgc28gdGhhdCBpdCBjYW4gY29sbGVjdCBhbGwKLQkJLy8gY2hhbmdlcy9wZXIgZmlsZXMKLQkJYXJndW1lbnRzLnNldENoYW5nZU1hbmFnZXIoZ2V0Q2hhbmdlTWFuYWdlcigpKTsKLQkJbG9hZERlcml2ZWRQYXJ0aWNpcGFudHMoc3RhdHVzLCByZXN1bHQsIGNvbXB1dGVEZXJpdmVkRWxlbWVudHMoKSwgYXJndW1lbnRzLCBuYXR1cmVzLCBzaGFyZWQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRFbGVtZW50UGFydGljaXBhbnRzKFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cywgTGlzdCByZXN1bHQsIFJlbmFtZUFyZ3VtZW50cyBhcmd1bWVudHMsIFN0cmluZ1tdIG5hdHVyZXMsIFNoYXJhYmxlUGFydGljaXBhbnRzIHNoYXJlZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlPYmplY3RbXSBlbGVtZW50cyA9IG5ldyBPYmplY3RbMF07Ly8gZ2V0RWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KFBhcnRpY2lwYW50TWFuYWdlci5sb2FkUmVuYW1lUGFydGljaXBhbnRzKHN0YXR1cywgdGhpcywgZWxlbWVudHNbaV0sIGFyZ3VtZW50cywgbmF0dXJlcywgc2hhcmVkKSkpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgZmluYWwgUmVmYWN0b3JpbmdQYXJ0aWNpcGFudFtdIGxvYWRQYXJ0aWNpcGFudHMoUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzLCBTaGFyYWJsZVBhcnRpY2lwYW50cyBzaGFyZWRQYXJ0aWNpcGFudHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVuYW1lQXJndW1lbnRzIGFyZ3VtZW50cyA9IG5ldyBSZW5hbWVBcmd1bWVudHMoZ2V0TmV3RWxlbWVudE5hbWUoKSwgZ2V0VXBkYXRlUmVmZXJlbmNlcygpKTsKLQkJU3RyaW5nW10gbmF0dXJlcyA9IGdldEFmZmVjdGVkUHJvamVjdE5hdHVyZXMoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWxvYWRFbGVtZW50UGFydGljaXBhbnRzKHN0YXR1cywgcmVzdWx0LCBhcmd1bWVudHMsIG5hdHVyZXMsIHNoYXJlZFBhcnRpY2lwYW50cyk7Ci0JCWxvYWREZXJpdmVkUGFydGljaXBhbnRzKHN0YXR1cywgcmVzdWx0LCBuYXR1cmVzLCBzaGFyZWRQYXJ0aWNpcGFudHMpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSByZXN1bHQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IGkubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBYTUxDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudCkgewotCQkJCVhNTENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50IHAgPSAoWE1MQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQpIG87Ci0JCQkJLy8gZ2V0Q2hhbmdlTWFuYWdlcigpCi0JCQkJcC5zZXRDaGFuZ2VNYW5hZ2VyKGdldENoYW5nZU1hbmFnZXIoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKFJlZmFjdG9yaW5nUGFydGljaXBhbnRbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFJlZmFjdG9yaW5nUGFydGljaXBhbnRbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5ld0VsZW1lbnROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobmV3TmFtZSk7Ci0JCXRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlUmVmZXJlbmNlcyhib29sZWFuIHVwZGF0ZSkgewotCQl1cGRhdGVSZWZlcmVuY2VzID0gdXBkYXRlOwotCi0JfQotCi0JcHVibGljIENoYW5nZSBwb3N0Q3JlYXRlQ2hhbmdlKENoYW5nZVtdIHBhcnRpY2lwYW50Q2hhbmdlcywgSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChwbSk7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgY2hhbmdlTmFtZSA9IFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IuQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZXMiKTsKLQkJCVRleHRDaGFuZ2VbXSBjaGFuZ2VzID0gY2hhbmdlTWFuYWdlci5nZXRBbGxDaGFuZ2VzKCk7Ci0vLwkJCUNvbXBhcmF0b3IgYyA9IG5ldyBDb21wYXJhdG9yKCkgewotLy8JCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0vLwkJCQkJVGV4dEZpbGVDaGFuZ2UgYzEgPSAoVGV4dEZpbGVDaGFuZ2UpIG8xOwotLy8JCQkJCVRleHRGaWxlQ2hhbmdlIGMyID0gKFRleHRGaWxlQ2hhbmdlKSBvMjsKLS8vCQkJCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKGMxLmdldEZpbGUoKS5nZXRGdWxsUGF0aCgpLCBjMi5nZXRGaWxlKCkuZ2V0RnVsbFBhdGgoKSk7Ci0vLwkJCQl9Ci0vLwkJCX07Ci0JCQlpZiAoY2hhbmdlcy5sZW5ndGggPiAwKSB7Ci0JCQkJLy8gQXJyYXlzLnNvcnQoY2hhbmdlcywgYyk7Ci0JCQkJQ29tcG9zaXRlQ2hhbmdlIGNvbXBvc2l0ZUNoYW5nZSA9IG5ldyBDb21wb3NpdGVDaGFuZ2UoIiEiICsgY2hhbmdlTmFtZSwgY2hhbmdlcyk7Ci0JCQkJY29tcG9zaXRlQ2hhbmdlLm1hcmtBc1N5bnRoZXRpYygpOwotCQkJCXJldHVybiBjb21wb3NpdGVDaGFuZ2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQl9Ci0JCWZpbmFsbHkgewotCQkJcG0uZG9uZSgpOwotCQl9Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZW5hbWVSZXNvdXJjZVByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZW5hbWVSZXNvdXJjZVByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODE3MDgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlICBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUGFydGljaXBhbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVBcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuU2hhcmFibGVQYXJ0aWNpcGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5JTmFtZVVwZGF0aW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFJlbmFtZVJlc291cmNlUHJvY2Vzc29yIGV4dGVuZHMgUmVuYW1lUHJvY2Vzc29yIGltcGxlbWVudHMgSU5hbWVVcGRhdGluZyB7Ci0KLQlwcml2YXRlIElSZXNvdXJjZSBmUmVzb3VyY2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZk5ld0VsZW1lbnROYW1lOwotCQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElGSUVSPSAib3JnLmVjbGlwc2Uud3N0LnVpLnhzZC5yZW5hbWVSZXNvdXJjZVByb2Nlc3NvciI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3IoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWZSZXNvdXJjZT0gcmVzb3VyY2U7Ci0JCWlmIChmUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJc2V0TmV3RWxlbWVudE5hbWUoZlJlc291cmNlLmdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQkvLy0tLS0gSU5hbWVVcGRhdGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkKLQlwdWJsaWMgdm9pZCBzZXROZXdFbGVtZW50TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5ld05hbWUpOwotCQlmTmV3RWxlbWVudE5hbWU9IG5ld05hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXdFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIGZOZXdFbGVtZW50TmFtZTsKLQl9Ci0JCi0JLy8tLS0tIElSZW5hbWVQcm9jZXNzb3IgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgewotCQlyZXR1cm4gSURFTlRJRklFUjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhYmxlKCkgIHsKLQkJaWYgKGZSZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoISBmUmVzb3VyY2UuZXhpc3RzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghIGZSZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkJCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwkJCQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByb2Nlc3Nvck5hbWUoKSB7Ci0JCVN0cmluZyBtZXNzYWdlPSBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldEZvcm1hdHRlZFN0cmluZygiUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3IubmFtZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQluZXcgU3RyaW5nW117Z2V0Q3VycmVudEVsZW1lbnROYW1lKCksIGdldE5ld0VsZW1lbnROYW1lKCl9KTsKLQkJcmV0dXJuIG1lc3NhZ2U7Ci0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cygpIHsKLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7ZlJlc291cmNlfTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBmUmVzb3VyY2UuZ2V0TmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0QWZmZWN0ZWRQcm9qZWN0TmF0dXJlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXROZXdFbGVtZW50KCkgewotCQkKLQkJCQotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKGNyZWF0ZU5ld1BhdGgoZ2V0TmV3RWxlbWVudE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldFVwZGF0ZVJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgUmVmYWN0b3JpbmdQYXJ0aWNpcGFudFtdIGxvYWRQYXJ0aWNpcGFudHMoUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzLCBTaGFyYWJsZVBhcnRpY2lwYW50cyBzaGFyZWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJT2JqZWN0W10gZWxlbWVudHM9IGdldEVsZW1lbnRzKCk7Ci0JCVN0cmluZ1tdIG5hdHVyZXM9IGdldEFmZmVjdGVkUHJvamVjdE5hdHVyZXMoKTsKLQkJTGlzdCByZXN1bHQ9IG5ldyBBcnJheUxpc3QoKTsKLQkJUmVuYW1lQXJndW1lbnRzIGFyZ3VtZW50cz0gbmV3IFJlbmFtZUFyZ3VtZW50cyhnZXROZXdFbGVtZW50TmFtZSgpLCBnZXRVcGRhdGVSZWZlcmVuY2VzKCkpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChQYXJ0aWNpcGFudE1hbmFnZXIubG9hZFJlbmFtZVBhcnRpY2lwYW50cyhzdGF0dXMsIAotCQkJCXRoaXMsIGVsZW1lbnRzW2ldLAotCQkJCWFyZ3VtZW50cywgbmF0dXJlcywgc2hhcmVkKSkpOwotCQl9Ci0JCXJldHVybiAoUmVmYWN0b3JpbmdQYXJ0aWNpcGFudFtdKXJlc3VsdC50b0FycmF5KG5ldyBSZWZhY3RvcmluZ1BhcnRpY2lwYW50W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0JCi0JLy8tLS0gQ29uZGl0aW9uIGNoZWNraW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tJbml0aWFsQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0JCi0JLyogbm9uIGphdmEtZG9jCi0JICogQHNlZSBJUmVuYW1lUmVmYWN0b3JpbmcjY2hlY2tOZXdOYW1lKCkKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tOZXdFbGVtZW50TmFtZShTdHJpbmcgbmV3TmFtZSkgIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChuZXdOYW1lLCAibmV3IG5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQlJQ29udGFpbmVyIGM9IGZSZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQkJaWYgKGMgPT0gbnVsbCkKLQkJCXJldHVybiBSZWZhY3RvcmluZ1N0YXR1cy5jcmVhdGVGYXRhbEVycm9yU3RhdHVzKFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVSZXNvdXJjZVJlZmFjdG9yaW5nLkludGVybmFsX0Vycm9yIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkKLQkJaWYgKGMuZmluZE1lbWJlcihuZXdOYW1lKSAhPSBudWxsKQotCQkJcmV0dXJuIFJlZmFjdG9yaW5nU3RhdHVzLmNyZWF0ZUZhdGFsRXJyb3JTdGF0dXMoUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZVJlc291cmNlUmVmYWN0b3JpbmcuYWxyZWFkX2V4aXN0cyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCWlmICghYy5nZXRGdWxsUGF0aCgpLmlzVmFsaWRTZWdtZW50KG5ld05hbWUpKQotCQkJcmV0dXJuIFJlZmFjdG9yaW5nU3RhdHVzLmNyZWF0ZUZhdGFsRXJyb3JTdGF0dXMoUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZVJlc291cmNlUmVmYWN0b3JpbmcuaW52YWxpZE5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkKLQkJUmVmYWN0b3JpbmdTdGF0dXMgcmVzdWx0PSBSZWZhY3RvcmluZ1N0YXR1cy5jcmVhdGUoYy5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZU5hbWUobmV3TmFtZSwgZlJlc291cmNlLmdldFR5cGUoKSkpOwotCQlpZiAoISByZXN1bHQuaGFzRmF0YWxFcnJvcigpKQotCQkJcmVzdWx0Lm1lcmdlKFJlZmFjdG9yaW5nU3RhdHVzLmNyZWF0ZShjLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlUGF0aChjcmVhdGVOZXdQYXRoKG5ld05hbWUpLCBmUmVzb3VyY2UuZ2V0VHlwZSgpKSkpOwkJCi0JCXJldHVybiByZXN1bHQ7CQkKLQl9Ci0JCi0JLyogbm9uIGphdmEtZG9jCi0JICogQHNlZSBSZWZhY3RvcmluZyNjaGVja0lucHV0KElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrRmluYWxDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgIHsKLQkJcG0uYmVnaW5UYXNrKCIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQl0cnl7Ci0JCQlyZXR1cm4gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JCX0gZmluYWxseXsKLQkJCXBtLmRvbmUoKTsKLQkJfQkKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBjcmVhdGVOZXdQYXRoKFN0cmluZyBuZXdOYW1lKXsKLQkJcmV0dXJuIGZSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hcHBlbmQobmV3TmFtZSkudG9TdHJpbmcoKTsKLQl9Ci0JCQotCS8vLS0tIGNoYW5nZXMgCi0JCi0JLyogbm9uIGphdmEtZG9jIAotCSAqIEBzZWUgSVJlZmFjdG9yaW5nI2NyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJcG0uYmVnaW5UYXNrKCIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQl0cnl7Ci0JCQlyZXR1cm4gbmV3IFJlc291cmNlUmVuYW1lQ2hhbmdlKGZSZXNvdXJjZSwgZ2V0TmV3RWxlbWVudE5hbWUoKSk7Ci0JCX0gZmluYWxseXsKLQkJCXBtLmRvbmUoKTsKLQkJfQkKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVuYW1lVGFyZ2V0TmFtZXNwYWNlUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1JlbmFtZVRhcmdldE5hbWVzcGFjZVByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2QzYzg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvUmVuYW1lVGFyZ2V0TmFtZXNwYWNlUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlBhcnRpY2lwYW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lQXJndW1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5TaGFyYWJsZVBhcnRpY2lwYW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLklOYW1lVXBkYXRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5JUmVmZXJlbmNlVXBkYXRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5UZXh0Q2hhbmdlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi0KLXB1YmxpYyBjbGFzcyBSZW5hbWVUYXJnZXROYW1lc3BhY2VQcm9jZXNzb3IgZXh0ZW5kcyBSZW5hbWVQcm9jZXNzb3IgaW1wbGVtZW50cyBJTmFtZVVwZGF0aW5nLCBJUmVmZXJlbmNlVXBkYXRpbmcKLXsKLQlwcml2YXRlIFN0cmluZyBuZXdOYW1lc3BhY2U7Ci0JcHJpdmF0ZSBib29sZWFuIHVwZGF0ZVJlZmVyZW5jZXMgPSB0cnVlOwotCXByaXZhdGUgVGV4dENoYW5nZU1hbmFnZXIgY2hhbmdlTWFuYWdlcjsKLQlwcml2YXRlIFhTRFNjaGVtYSBtb2RlbDsKLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURFTlRJRklFUiA9ICJvcmcuZWNsaXBzZS53c3QudWkueHNkLnJlbmFtZUNvbXBvbmVudFByb2Nlc3NvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBSZW5hbWVUYXJnZXROYW1lc3BhY2VQcm9jZXNzb3IoWFNEU2NoZW1hIG1vZGVsLCBTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5uZXdOYW1lc3BhY2UgPSBuZXdOYW1lOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC5yZWZhY3RvcmluZy50YWdnaW5nLklUZXh0VXBkYXRpbmcjY2FuRW5hYmxlVGV4dFVwZGF0aW5nKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FbmFibGVUZXh0VXBkYXRpbmcoKQotCXsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnJlZmFjdG9yaW5nLnRhZ2dpbmcuSVRleHRVcGRhdGluZyNnZXRDdXJyZW50RWxlbWVudE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudEVsZW1lbnROYW1lKCkKLQl7Ci0JCS8vCi0JCXJldHVybiBtb2RlbC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QuaW50ZXJuYWwucmVmYWN0b3JpbmcucmVuYW1lLlhTRFJlbmFtZVByb2Nlc3NvciNnZXRBZmZlY3RlZFByb2plY3ROYXR1cmVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0QWZmZWN0ZWRQcm9qZWN0TmF0dXJlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQkvLyBUT0RPOiBmaW5kIHByb2plY3QgbmF0dXJlcyBvZiB0aGUgZmlsZXMgdGhhdCBhcmUgZ29pbmcgdG8gYmUKLQkJLy8gcmVmYWN0b3JlZAotCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIn07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueHNkLmludGVybmFsLnJlZmFjdG9yaW5nLnJlbmFtZS5YU0RSZW5hbWVQcm9jZXNzb3IjbG9hZERlcml2ZWRQYXJ0aWNpcGFudHMob3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXMsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCwgamF2YS5sYW5nLlN0cmluZ1tdLAotCSAqICAgICAgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlNoYXJhYmxlUGFydGljaXBhbnRzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWREZXJpdmVkUGFydGljaXBhbnRzKFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cywKLQkJCUxpc3QgcmVzdWx0LCBTdHJpbmdbXSBuYXR1cmVzLCBTaGFyYWJsZVBhcnRpY2lwYW50cyBzaGFyZWQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJU3RyaW5nIG5ld0NVTmFtZT0gZ2V0TmV3RWxlbWVudE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQlSZW5hbWVBcmd1bWVudHMgYXJndW1lbnRzPSBuZXcgUmVuYW1lQXJndW1lbnRzKG5ld0NVTmFtZSwgZ2V0VXBkYXRlUmVmZXJlbmNlcygpKTsKLQkJbG9hZERlcml2ZWRQYXJ0aWNpcGFudHMoc3RhdHVzLCByZXN1bHQsIAotCQkJY29tcHV0ZURlcml2ZWRFbGVtZW50cygpLCBhcmd1bWVudHMsIAotCQkJIG5hdHVyZXMsIHNoYXJlZCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxvYWREZXJpdmVkUGFydGljaXBhbnRzKFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cywgTGlzdCByZXN1bHQsIE9iamVjdFtdIGRlcml2ZWRFbGVtZW50cywgCi0JCQlSZW5hbWVBcmd1bWVudHMgYXJndW1lbnRzLCAgU3RyaW5nW10gbmF0dXJlcywgU2hhcmFibGVQYXJ0aWNpcGFudHMgc2hhcmVkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZXJpdmVkRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGRlcml2ZWRFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCVJlbmFtZVBhcnRpY2lwYW50W10gcGFydGljaXBhbnRzPSBQYXJ0aWNpcGFudE1hbmFnZXIubG9hZFJlbmFtZVBhcnRpY2lwYW50cyhzdGF0dXMsIAotCQkJCQl0aGlzLCBkZXJpdmVkRWxlbWVudHNbaV0sIAotCQkJCQlhcmd1bWVudHMsIG5hdHVyZXMsIHNoYXJlZCk7Ci0JCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KHBhcnRpY2lwYW50cykpOwotCQkJfQotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIE9iamVjdFtdIGNvbXB1dGVEZXJpdmVkRWxlbWVudHMoKSB7Ci0KLQkJT2JqZWN0W10gZWxlbWVudHMgPSBnZXRFbGVtZW50cygpOwotCQlPYmplY3RbXSByZXN1bHRzID0gbmV3IE9iamVjdFtlbGVtZW50cy5sZW5ndGhdOwotCQlmb3IoaW50IGk9MDsgaTwgZWxlbWVudHMubGVuZ3RoOyBpKyspewotCQkJUmVmYWN0b3JpbmdDb21wb25lbnQgY29tcG9uZW50ID0gKFJlZmFjdG9yaW5nQ29tcG9uZW50KWVsZW1lbnRzW2ldOwotCQkJcmVzdWx0c1tpXSA9IGNvbXBvbmVudC5nZXRNb2RlbE9iamVjdCgpOwotCQkJCi0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JCQotCX0KLQkKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2NoZWNrRmluYWxDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrRmluYWxDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sCi0JCQlDaGVja0NvbmRpdGlvbnNDb250ZXh0IGNvbnRleHQpIHRocm93cyBDb3JlRXhjZXB0aW9uLAotCQkJT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24KLQl7Ci0JCXRyeQotCQl7Ci0JCQlSZWZhY3RvcmluZ1N0YXR1cyByZXN1bHQgPSBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQkJCXBtLmJlZ2luVGFzaygiIiwgOSk7IC8vJE5PTi1OTFMtMSQKLQkJCWNoYW5nZU1hbmFnZXIgPSBjcmVhdGVDaGFuZ2VNYW5hZ2VyKG5ldyBTdWJQcm9ncmVzc01vbml0b3IocG0sIDEpLAotCQkJCQlyZXN1bHQpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBmaW5hbGx5Ci0JCXsKLQkJCXBtLmRvbmUoKTsKLQkJfQotCQkKLQotCX0KLQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2NoZWNrSW5pdGlhbENvbmRpdGlvbnMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrSW5pdGlhbENvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgotCXsKLQkJLy8gVE9ETyBhZGQgY29kZSB0byBjaGVjayBpbml0aWFsIGNvbmRpdGlvbnMgZm9yIGNvbXBvbmVudCByZW5hbWUKLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2NyZWF0ZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwKLQkJCU9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uCi0JewotCQl0cnkKLQkJewotCQkJU3RyaW5nIGNoYW5nZU5hbWUgPSBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yLkNvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVzIik7Ci0JCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUNoYW5nZShjaGFuZ2VOYW1lLCBjaGFuZ2VNYW5hZ2VyLmdldEFsbENoYW5nZXMoKSk7Ci0JCX0gZmluYWxseQotCQl7Ci0JCQlwbS5kb25lKCk7Ci0JCX0KLQotCQkvLyBDaGFuZ2VbXSBjaGFuZ2VzID0gQ29tcG9uZW50UmVuYW1lQ2hhbmdlLmNyZWF0ZUNoYW5nZXNGb3IoCi0JCS8vIHRoaXMuZk5hbWVkQ29tcG9uZW50LCBnZXROZXdFbGVtZW50TmFtZSgpKTsKLQkJLy8KLQkJLy8gaWYgKGNoYW5nZXMubGVuZ3RoID4gMCkKLQkJLy8gewotCQkvLyBDb21wb3NpdGVDaGFuZ2UgbXVsdGlDaGFuZ2UgPSBudWxsOwotCQkvLyBtdWx0aUNoYW5nZSA9IG5ldyBDb21wb3NpdGVDaGFuZ2UoCi0JCS8vICJYU0QgY29tcG9uZW50IHJlbmFtZSBwYXJ0aWNpcGFudCBjaGFuZ2VzIiwgY2hhbmdlcyk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gVE9ETzogZXh0ZXJuYWxpemUgc3RyaW5nCi0JCS8vIHJldHVybiBtdWx0aUNoYW5nZTsKLQkJLy8gfSBlbHNlCi0JCS8vIHsKLQkJLy8KLQkJLy8gcmV0dXJuIG5ldyBDb21wb25lbnRSZW5hbWVDaGFuZ2UoCi0JCS8vIGZOYW1lZENvbXBvbmVudCwKLQkJLy8gZk5hbWVkQ29tcG9uZW50LmdldE5hbWUoKSwKLQkJLy8gZ2V0TmV3RWxlbWVudE5hbWUoKSwKLQkJLy8gZk5hbWVkQ29tcG9uZW50LmdldFNjaGVtYSgpKTsKLQkJLy8gfQotCQkKLQkJCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjZ2V0RWxlbWVudHMoKQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cygpCi0JewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgbW9kZWwgfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNnZXRJZGVudGlmaWVyKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKQotCXsKLQkJcmV0dXJuIElERU5USUZJRVI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjZ2V0UHJvY2Vzc29yTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9jZXNzb3JOYW1lKCkKLQl7Ci0JCXJldHVybiBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldEZvcm1hdHRlZFN0cmluZygKLQkJCQkiUmVuYW1lQ29tcG9uZW50UmVmYWN0b3JpbmcubmFtZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQluZXcgU3RyaW5nW10KLQkJCQl7Ci0JCQkJCQlnZXRDdXJyZW50RWxlbWVudE5hbWUoKSwKLQkJCQkJCWdldE5ld0VsZW1lbnROYW1lKCkgfSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNpc0FwcGxpY2FibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlpZiAoZ2V0TW9kZWwoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBUT0RPIGltcGxlbWVudCBpc0FwcGxpY2FibGUgbG9naWMgZm9yIHRoZSBuYW1lZCBjb21wb25lbnQsCi0JCS8vIHZlcmlmeSBob3cgaXQgaXMgZGlmZmVyZW50IGZyb20gb3RoZXIgY29uZGl0aW9uIGNoZWNrcwotCQkvLyBpZiAoZk5hbWVkQ29tcG9uZW50LmlzQW5vbnltb3VzKCkpCi0JCS8vIHJldHVybiBmYWxzZTsKLQkJLy8gaWYgKCEgQ2hlY2tzLmlzQXZhaWxhYmxlKGZUeXBlKSkKLQkJLy8gcmV0dXJuIGZhbHNlOwotCQkvLyBpZiAoaXNTcGVjaWFsQ2FzZShmVHlwZSkpCi0JCS8vIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnJlZmFjdG9yaW5nLnRhZ2dpbmcuSU5hbWVVcGRhdGluZyNjaGVja05ld0VsZW1lbnROYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrTmV3RWxlbWVudE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlBc3NlcnQuaXNOb3ROdWxsKG5ld05hbWUsICJuZXcgbmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCS8vIFRPRE86IGltcGxlbWVudCBuZXcgbmFtZSBjaGVja2luZwotCQkvLyBSZWZhY3RvcmluZ1N0YXR1cyByZXN1bHQgPSBDaGVja3MuY2hlY2tUeXBlTmFtZShuZXdOYW1lKTsKLQkJLy8gaWYgKENoZWNrcy5pc0FscmVhZHlOYW1lZChmVHlwZSwgbmV3TmFtZSkpCi0JCS8vIHJlc3VsdC5hZGRGYXRhbEVycm9yKFJlZmFjdG9yaW5nQ29yZU1lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lVHlwZVJlZmFjdG9yaW5nLmNob29zZV9hbm90aGVyX25hbWUiKSk7Ci0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBSZWZhY3RvcmluZ1BhcnRpY2lwYW50W10gbG9hZFBhcnRpY2lwYW50cygKLQkJCVJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cywgU2hhcmFibGVQYXJ0aWNpcGFudHMgc2hhcmVkUGFydGljaXBhbnRzKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCVJlbmFtZUFyZ3VtZW50cyBhcmd1bWVudHMgPSBuZXcgUmVuYW1lQXJndW1lbnRzKGdldE5ld0VsZW1lbnROYW1lKCksCi0JCQkJdHJ1ZSk7Ci0JCVN0cmluZ1tdIG5hdHVyZXMgPSBnZXRBZmZlY3RlZFByb2plY3ROYXR1cmVzKCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlsb2FkRWxlbWVudFBhcnRpY2lwYW50cyhzdGF0dXMsIHJlc3VsdCwgYXJndW1lbnRzLCBuYXR1cmVzLAotCQkJCXNoYXJlZFBhcnRpY2lwYW50cyk7Ci0JCWxvYWREZXJpdmVkUGFydGljaXBhbnRzKHN0YXR1cywgcmVzdWx0LCBuYXR1cmVzLCBzaGFyZWRQYXJ0aWNpcGFudHMpOwotCQlyZXR1cm4gKFJlZmFjdG9yaW5nUGFydGljaXBhbnRbXSkgcmVzdWx0Ci0JCQkJLnRvQXJyYXkobmV3IFJlZmFjdG9yaW5nUGFydGljaXBhbnRbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRFbGVtZW50UGFydGljaXBhbnRzKFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cywKLQkJCUxpc3QgcmVzdWx0LCBSZW5hbWVBcmd1bWVudHMgYXJndW1lbnRzLCBTdHJpbmdbXSBuYXR1cmVzLAotCQkJU2hhcmFibGVQYXJ0aWNpcGFudHMgc2hhcmVkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJT2JqZWN0W10gZWxlbWVudHMgPSBnZXRFbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QoUGFydGljaXBhbnRNYW5hZ2VyCi0JCQkJCS5sb2FkUmVuYW1lUGFydGljaXBhbnRzKHN0YXR1cywgdGhpcywgZWxlbWVudHNbaV0sCi0JCQkJCQkJYXJndW1lbnRzLCBuYXR1cmVzLCBzaGFyZWQpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBUZXh0Q2hhbmdlTWFuYWdlciBjcmVhdGVDaGFuZ2VNYW5hZ2VyKElQcm9ncmVzc01vbml0b3IgcG0sCi0JCQlSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlUZXh0Q2hhbmdlTWFuYWdlciBtYW5hZ2VyID0gbmV3IFRleHRDaGFuZ2VNYW5hZ2VyKGZhbHNlKTsKLQkJLy8gb25seSBvbmUgZGVjbGFyYXRpb24gZ2V0cyB1cGRhdGVkCi0JCWFkZERlY2xhcmF0aW9uVXBkYXRlKG1hbmFnZXIpOwotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRGVjbGFyYXRpb25VcGRhdGUoVGV4dENoYW5nZU1hbmFnZXIgbWFuYWdlcikKLQotCXsKLQkJU3RyaW5nIGZpbGVTdHIgPSBnZXRNb2RlbCgpLmdldFNjaGVtYUxvY2F0aW9uKCk7Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlU3RyKTsKLQkJdHJ5Ci0JCXsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKHVyaS50b1N0cmluZygpKTsKLQkJCXVybCA9IFBsYXRmb3JtLnJlc29sdmUodXJsKTsKLQkJCWlmKHVybCAhPSBudWxsKXsKLQkJCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCQlJRmlsZSBmaWxlID0gcm9vdC5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgodXJsLmdldEZpbGUoKSkpOwotCQkJCWlmKGZpbGUgIT0gbnVsbCApewotCQkJCQlUZXh0Q2hhbmdlIGNoYW5nZSA9IG1hbmFnZXIuZ2V0KGZpbGUpOwotCQkJCQlhZGREZWNsYXJhdGlvblVwZGF0ZShjaGFuZ2UpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0JCXsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCXsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCQotCX0KLQkKLQkKLQotCWZpbmFsIHZvaWQgYWRkRGVjbGFyYXRpb25VcGRhdGUoVGV4dENoYW5nZSBjaGFuZ2UpIAotCXsKLS8vCQlTdHJpbmcgZWRpdE5hbWUgPSBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yLkNvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVfZGVjbGF0YXRpb24iKTs7Ci0vLwkgIAotLy8JCU5hbWVkQ29tcG9uZW50UmVuYW1lciByZW5hbWVyID0gbmV3IE5hbWVkQ29tcG9uZW50UmVuYW1lcigKLS8vCQkJCXNlbGVjdGVkQ29tcG9uZW50LmdldEVsZW1lbnQoKSwgbmV3TmFtZXNwYWNlKTsKLS8vCQlyZW5hbWVyLnJlbmFtZUNvbXBvbmVudCgpOwotLy8JCUxpc3QgdGV4dEVkaXRzID0gcmVuYW1lci5nZXRUZXh0RWRpdHMoKTsKLS8vCQlmb3IgKGludCBqID0gMDsgaiA8IHRleHRFZGl0cy5zaXplKCk7IGorKykKLS8vCQl7Ci0vLwkJCVJlcGxhY2VFZGl0IHJlcGxhY2VFZGl0ID0gKFJlcGxhY2VFZGl0KSB0ZXh0RWRpdHMKLS8vCQkJCQkuZ2V0KGopOwotLy8JCQlUZXh0Q2hhbmdlQ29tcGF0aWJpbGl0eS5hZGRUZXh0RWRpdChjaGFuZ2UsCi0vLwkJCQkJZWRpdE5hbWUsIHJlcGxhY2VFZGl0KTsKLS8vCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmV3RWxlbWVudE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQl0aGlzLm5ld05hbWVzcGFjZSA9IG5ld05hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXdFbGVtZW50TmFtZSgpCi0JewotCQlyZXR1cm4gbmV3TmFtZXNwYWNlOwotCX0KLQotCQotCi0JcHVibGljIGJvb2xlYW4gY2FuRW5hYmxlVXBkYXRlUmVmZXJlbmNlcygpCi0JewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRVcGRhdGVSZWZlcmVuY2VzKCkKLQl7Ci0JCXJldHVybiB1cGRhdGVSZWZlcmVuY2VzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVwZGF0ZVJlZmVyZW5jZXMoYm9vbGVhbiB1cGRhdGUpCi0JewotCQl1cGRhdGVSZWZlcmVuY2VzID0gdXBkYXRlOwotCQkKLQl9Ci0KLQlwdWJsaWMgZmluYWwgVGV4dENoYW5nZU1hbmFnZXIgZ2V0Q2hhbmdlTWFuYWdlcigpCi0JewotCQlyZXR1cm4gY2hhbmdlTWFuYWdlcjsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgWFNEU2NoZW1hIGdldE1vZGVsKCkKLQl7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1Jlc291cmNlUmVuYW1lQ2hhbmdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1Jlc291cmNlUmVuYW1lQ2hhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3OTZiOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZXNvdXJjZVJlbmFtZUNoYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ01lc3NhZ2VzOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBjaGFuZ2UgdGhhdCByZW5hbWVzIGEgZ2l2ZW4gcmVzb3VyY2UKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlUmVuYW1lQ2hhbmdlIGV4dGVuZHMgQ2hhbmdlIHsKLQotCS8qCi0JICogd2UgY2Fubm90IHVzZSBoYW5kbGVzIGJlY2F1c2UgdGhleSBiZWNhbWUgaW52YWxpZCB3aGVuIHlvdSByZW5hbWUgdGhlIHJlc291cmNlLgotCSAqIHBhdGhzIGRvIG5vdC4KLQkgKi8KLQlwcml2YXRlIElQYXRoIGZSZXNvdXJjZVBhdGg7Ci0KLQlwcml2YXRlIFN0cmluZyBmTmV3TmFtZTsKLQotCS8qKgotCSAqIEBwYXJhbSBuZXdOYW1lIGluY2x1ZGVzIHRoZSBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VSZW5hbWVDaGFuZ2UoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgbmV3TmFtZSkgewotCQl0aGlzKHJlc291cmNlLmdldEZ1bGxQYXRoKCksIG5ld05hbWUpOwotCX0KLQotCXByaXZhdGUgUmVzb3VyY2VSZW5hbWVDaGFuZ2UoSVBhdGggcmVzb3VyY2VQYXRoLCBTdHJpbmcgbmV3TmFtZSkgewotCQlmUmVzb3VyY2VQYXRoPSByZXNvdXJjZVBhdGg7Ci0JCWZOZXdOYW1lPSBuZXdOYW1lOwotCX0KLQotCXByaXZhdGUgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKGZSZXNvdXJjZVBhdGgpOwotCX0KLQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBpc1ZhbGlkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCS8vIFRPRE86IGltcGxlbWVudCBmaWxlIHZhbGlkYXRpb24sIHNlZSBKRFRDaGFuZ2UKLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQkKLQkvKgotCSAqIHRvIGF2b2lkIHRoZSBleGNlcHRpb24gc2VuZGVycyBzaG91bGQgY2hlY2sgaWYgYSByZXNvdXJjZSB3aXRoIHRoZSBuZXcgbmFtZQotCSAqIGFscmVhZHkgZXhpc3RzCi0JICovCi0JcHVibGljIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWlmIChmYWxzZSkKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCXBtLmJlZ2luVGFzayhSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiWFNEUmVuYW1lUmVzb3VyY2VDaGFuZ2UucmVuYW1lX3Jlc291cmNlIiksIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJCWdldFJlc291cmNlKCkubW92ZShyZW5hbWVkUmVzb3VyY2VQYXRoKGZSZXNvdXJjZVBhdGgsIGZOZXdOYW1lKSwgZ2V0Q29yZVJlbmFtZUZsYWdzKCksIHBtKTsKLQotCQkJU3RyaW5nIG9sZE5hbWU9IGZSZXNvdXJjZVBhdGgubGFzdFNlZ21lbnQoKTsKLQkJCUlQYXRoIG5ld1BhdGg9IHJlbmFtZWRSZXNvdXJjZVBhdGgoZlJlc291cmNlUGF0aCwgZk5ld05hbWUpOwotCQkJcmV0dXJuIG5ldyBSZXNvdXJjZVJlbmFtZUNoYW5nZShuZXdQYXRoLCBvbGROYW1lKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXBtLmRvbmUoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGdldENvcmVSZW5hbWVGbGFncygpIHsKLQkJaWYgKGdldFJlc291cmNlKCkuaXNMaW5rZWQoKSkKLQkJCXJldHVybiBJUmVzb3VyY2UuU0hBTExPVzsKLQkJZWxzZQotCQkJcmV0dXJuIElSZXNvdXJjZS5OT05FOwotCX0KLQotCS8qCi0JICogY2hhbmdlcyByZXNvdXJjZSBuYW1lcyAvcy9wL0EuamF2YSByZW5hbWVkIHRvIEIuamF2YSBiZWNvbWVzIC9zL3AvQi5qYXZhCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCByZW5hbWVkUmVzb3VyY2VQYXRoKElQYXRoIHBhdGgsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBwYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hcHBlbmQobmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRGb3JtYXR0ZWRTdHJpbmcoCi0JCQkiWFNEUmVuYW1lUmVzb3VyY2VDaGFuZ2UubmFtZSIsIG5ldyBTdHJpbmdbXXtmUmVzb3VyY2VQYXRoLnRvU3RyaW5nKCksIC8vJE5PTi1OTFMtMSQKLQkJCXJlbmFtZWRSZXNvdXJjZVBhdGgoZlJlc291cmNlUGF0aCwgZk5ld05hbWUpLnRvU3RyaW5nKCl9KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZSNpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKElQcm9ncmVzc01vbml0b3IgcG0pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9SZXNvdXJjZVJlbmFtZVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1Jlc291cmNlUmVuYW1lUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMyYmY4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1Jlc291cmNlUmVuYW1lUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IucmVuYW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Db21wb3NpdGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dENoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuVGV4dENoYW5nZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLS8qKgotICogVGhpcyByZW5hbWUgcGFydGljaXBhbnQgY3JlYXRlcyB0ZXh0IGNoYW5nZXMgZm9yIHRoZSByZWZlcmVuY2VzIG9mIHRoZSBYU0QgYW5kIFdTREwgZmlsZXMKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlUmVuYW1lUGFydGljaXBhbnQgZXh0ZW5kcyBSZW5hbWVQYXJ0aWNpcGFudCB7Ci0JCi0vLwlwcml2YXRlIElGaWxlIGZpbGUgPSBudWxsOwotCXByaXZhdGUgVGV4dENoYW5nZU1hbmFnZXIgY2hhbmdlTWFuYWdlcjsKLQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBYU0RfQ09OVEVOVF9UWVBFX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBXU0RMX0NPTlRFTlRfVFlQRV9JRCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC53c2Rsc291cmNlIjsKLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkvLyBjaGVjayBpZiBmaWxlIGhhcyBYU0Qgb3IgV1NETCBjb250ZW50Ci0JCQlJRmlsZSBhRmlsZSA9IChJRmlsZSkgZWxlbWVudDsKLQkJCXRyeSB7Ci0JCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGFGaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJCWlmICggZGVzY3JpcHRpb24gPT0gbnVsbCApCi0gIAkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gZGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCQlpZihjb250ZW50VHlwZSAhPSBudWxsKXsKLQkJCQkJaWYoWFNEX0NPTlRFTlRfVFlQRV9JRC5lcXVhbHMoY29udGVudFR5cGUuZ2V0SWQoKSkgfHwKLQkJCQkJCQlXU0RMX0NPTlRFTlRfVFlQRV9JRC5lcXVhbHMoY29udGVudFR5cGUuZ2V0SWQoKSkpewotLy8JCQkJCQlmaWxlID0gYUZpbGU7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlc291cmNlUmVuYW1lUGFydGljaXBhbnQuY29tcG9zaXRlQ2hhbmdlTmFtZSIpOwotCX0KLQkKLS8vCXByaXZhdGUgSVBhdGggZ2V0TmV3RmlsZVBhdGgoKSB7Ci0vLwkJCi0vLwkJSVBhdGggb2xkUGF0aCA9IGZpbGUuZ2V0UmF3TG9jYXRpb24oKTsKLS8vCQlJUGF0aCBuZXdQYXRoID0gb2xkUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkuYXBwZW5kKGdldEFyZ3VtZW50cygpLmdldE5ld05hbWUoKSk7Ci0vLwkJcmV0dXJuIG5ld1BhdGg7Ci0vLwl9Ci0KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sCi0JCQlDaGVja0NvbmRpdGlvbnNDb250ZXh0IGNvbnRleHQpIHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgotCXsKLQkJUmVmYWN0b3JpbmdTdGF0dXMgcmVzdWx0ID0gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0JCXRyeQotCQl7Ci0JCQlwbS5iZWdpblRhc2soIiIsIDkpOyAvLyROT04tTkxTLTEkCi0JCQljaGFuZ2VNYW5hZ2VyID0gY3JlYXRlQ2hhbmdlTWFuYWdlcihuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHBtLCAxKSwKLQkJCQkJcmVzdWx0KTsKLQkJCQotCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gZSl7Ci0JCQlyZXN1bHQuYWRkRmF0YWxFcnJvcihlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWZpbmFsbHkKLQkJewotCQkJcG0uZG9uZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0JCi0JCi0KLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwKLQkJCU9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uCi0JewotCQl0cnkKLQkJewotCQkJU3RyaW5nIGNoYW5nZU5hbWUgPSBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lUmVzb3VyY2VDaGFuZ2UucmVuYW1lX3Jlc291cmNlX3JlZmVyZW5jZV9jaGFuZ2UiKTsKLQkJCVRleHRDaGFuZ2VbXSBjaGFuZ2VzID0gIGNoYW5nZU1hbmFnZXIuZ2V0QWxsQ2hhbmdlcygpOwotCQkJaWYoY2hhbmdlcy5sZW5ndGggPiAwKXsKLQkJCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUNoYW5nZShjaGFuZ2VOYW1lLCBjaGFuZ2VzKTsKLQkJCX0KLQkJCWVsc2V7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJfSBmaW5hbGx5Ci0JCXsKLQkJCXBtLmRvbmUoKTsKLQkJfQotCi0JfQotCQotCQotCXByaXZhdGUgVGV4dENoYW5nZU1hbmFnZXIgY3JlYXRlQ2hhbmdlTWFuYWdlcihJUHJvZ3Jlc3NNb25pdG9yIHBtLAotCQkJUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJVGV4dENoYW5nZU1hbmFnZXIgbWFuYWdlciA9IG5ldyBUZXh0Q2hhbmdlTWFuYWdlcihmYWxzZSk7Ci0JCS8vIG9ubHkgb25lIGRlY2xhcmF0aW9uIGdldHMgdXBkYXRlZAotCQkvL2FkZERlY2xhcmF0aW9uVXBkYXRlKG1hbmFnZXIpOwotCQlpZiAoZ2V0QXJndW1lbnRzKCkuZ2V0VXBkYXRlUmVmZXJlbmNlcygpKQotCQkJYWRkT2NjdXJyZW5jZXMobWFuYWdlciwgcG0sIHN0YXR1cyk7Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCi0KLQl2b2lkIGFkZE9jY3VycmVuY2VzKFRleHRDaGFuZ2VNYW5hZ2VyIG1hbmFnZXIsIElQcm9ncmVzc01vbml0b3IgcG0sCi0JCQlSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotLy8JCQotLy8JCU9iamVjdFtdIG9jY3VycmVuY2VzID0gU2VhcmNoVG9vbHMuZ2V0RmlsZURlcGVuZGVuY2llcyhmaWxlKTsKLS8vCQlwbS5iZWdpblRhc2soIiIsIG9jY3VycmVuY2VzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLS8vCQkKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IG9jY3VycmVuY2VzLmxlbmd0aDsgaSsrKQotLy8JCXsKLS8vCQkJT2JqZWN0IG9iamVjdCA9IG9jY3VycmVuY2VzW2ldOwotLy8KLS8vCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdEdyb3VwKQotLy8JCQl7Ci0vLwkJCQlTZWFyY2hSZXN1bHRHcm91cCBzZWFyY2hSZXN1bHQgPSAoU2VhcmNoUmVzdWx0R3JvdXApIG9iamVjdDsKLS8vCQkJCWlmIChzZWFyY2hSZXN1bHQgPT0gbnVsbCkKLS8vCQkJCQljb250aW51ZTsKLS8vCQkJCQotLy8JCQkJSUZpbGUgcmVmZXJlbmNpbmdGaWxlID0gKElGaWxlKXNlYXJjaFJlc3VsdC5nZXRSZXNvdXJjZSgpOwotLy8JCQkJCQotLy8JCQkJcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0vLwkJCQkvLyBmb3IgZWFjaCByZXN1bHQgZmlsZSBjcmVhdGUgWFNEIG1vZGVsIGFuZCBnZXQgY29tcG9uZW50IGZyb20gdGhhdCBtb2RlbAotLy8JCQkJcmVzb3VyY2VTZXQuZ2V0QWRhcHRlckZhY3RvcmllcygpLmFkZCgKLS8vCQkJCQkJbmV3IFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeSgpKTsKLS8vCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlRmlsZVVSSShyZWZlcmVuY2luZ0ZpbGUuZ2V0TG9jYXRpb24oKS50b1BvcnRhYmxlU3RyaW5nKCkpOwotLy8JCQkJdHJ5Ci0vLwkJCQl7Ci0vLwkJCQkJWFNEU2NoZW1hIHNjaGVtYSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNjaGVtYSgpOwotLy8JCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQocmVmZXJlbmNpbmdGaWxlKTsKLS8vCQkJCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWw7Ci0vLwkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgWFNEUmVzb3VyY2VJbXBsKCk7Ci0vLwkJCQkJcmVzb3VyY2Uuc2V0VVJJKHVyaSk7Ci0vLwkJCQkJc2NoZW1hID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2NoZW1hKCk7Ci0vLwkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoc2NoZW1hKTsKLS8vCQkJCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQocmVzb3VyY2UpOwotLy8JCQkJCXNjaGVtYS5zZXRFbGVtZW50KGRvbU1vZGVsLmdldERvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotLy8JCQkJCS8vIGdldCB0YXJnZXQgbmFtZXNwYWNlIAotLy8JCQkJCVN0cmluZyBzdHJpbmdQYXRoID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0vLwkJCQkJU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IFhNTFF1aWNrU2Nhbi5nZXRUYXJnZXROYW1lc3BhY2Uoc3RyaW5nUGF0aCk7Ci0vLwkJCQkJdGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlID09IG51bGwgPyAiIiA6IHRhcmdldE5hbWVzcGFjZTsKLS8vCi0vLwkJCQkJTGlzdCB0ZXh0RWRpdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCQkJU2VhcmNoTWF0Y2hbXSBtYXRjaGVzID0gc2VhcmNoUmVzdWx0LmdldFNlYXJjaFJlc3VsdHMoKTsKLS8vCQkJCQkKLS8vCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1hdGNoZXMubGVuZ3RoOyBqKyspIHsKLS8vCQkJCQkJU2VhcmNoTWF0Y2ggbWF0Y2ggPSBtYXRjaGVzW2pdOwotLy8JCQkJCQkKLS8vCQkJCQkJRmlsZVJlZmVyZW5jZVJlbmFtZXIgcmVuYW1lciA9IG5ldyBGaWxlUmVmZXJlbmNlUmVuYW1lcigKLS8vCQkJCQkJCQltYXRjaC5nZXRBdHRyVmFsdWUoKSwgdGFyZ2V0TmFtZXNwYWNlLCBnZXROZXdGaWxlUGF0aCgpLnRvU3RyaW5nKCksIHNjaGVtYSk7Ci0vLwkJCQkJCXJlbmFtZXIudmlzaXRTY2hlbWEoc2NoZW1hKTsKLS8vCQkJCQkgICAgdGV4dEVkaXRzLmFkZEFsbChyZW5hbWVyLmdldFRleHRFZGl0cygpKTsKLS8vCQkJCQl9Ci0vLwkJCQkJCi0vLwkJCQkJCi0vLwkJCQkJaWYoIXRleHRFZGl0cy5pc0VtcHR5KCkpewotLy8JCQkJCQlUZXh0Q2hhbmdlIHRleHRDaGFuZ2UgPSBtYW5hZ2VyLmdldChyZWZlcmVuY2luZ0ZpbGUpOwotLy8JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHRleHRFZGl0cy5zaXplKCk7IGorKykKLS8vCQkJCQkJewotLy8JCQkJCQkJUmVwbGFjZUVkaXQgcmVwbGFjZUVkaXQgPSAoUmVwbGFjZUVkaXQpIHRleHRFZGl0cwotLy8JCQkJCQkJCQkuZ2V0KGopOwotLy8JCQkJCQkJU3RyaW5nIGVkaXROYW1lID0gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRTdHJpbmcoIlJlc291cmNlUmVuYW1lUGFydGljaXBhbnQuRmlsZV9SZW5hbWVfdXBkYXRlX3JlZmVyZW5jZSIpOwotLy8JCQkJCQkJVGV4dENoYW5nZUNvbXBhdGliaWxpdHkuYWRkVGV4dEVkaXQodGV4dENoYW5nZSwKLS8vCQkJCQkJCQkJZWRpdE5hbWUsIHJlcGxhY2VFZGl0KTsKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCQkKLS8vCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotLy8JCQkJewotLy8JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJCQl9IGZpbmFsbHkKLS8vCQkJCXsKLS8vCi0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0JfQotCQotCQotCXB1YmxpYyAgY2xhc3MgUmVmZXJlbmNlTG9jYXRpb25GaW5kZXIKLQl7Ci0JCXByb3RlY3RlZCBYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQ7Ci0JCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQkJcHJvdGVjdGVkIFhTRFNjaGVtYSByZWZlcmVuY2luZ1NjaGVtYTsKLQkJcHJvdGVjdGVkIExpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgUmVmZXJlbmNlTG9jYXRpb25GaW5kZXIoWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50LAotCQkJCVN0cmluZyBuYW1lLCBYU0RTY2hlbWEgcmVmZXJlbmNpbmdTY2hlbWEpCi0JCXsKLQkJCXRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMucmVmZXJlbmNpbmdTY2hlbWEgPSByZWZlcmVuY2luZ1NjaGVtYTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpCi0JCXsKLQkJCQotCQkJLy9YU0RTd2l0Y2ggeHNkU3dpdGNoID0gbmV3IFhTRFN3aXRjaCgpCi0vLwkJCXsKLS8vCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTRFR5cGVEZWZpbml0aW9uKFhTRFR5cGVEZWZpbml0aW9uIG9iamVjdCkKLS8vCQkJCXsKLS8vCQkJCQlHbG9iYWxUeXBlUmVmZXJlbmNlUmVuYW1lciByZW5hbWVyID0gbmV3IEdsb2JhbFR5cGVSZWZlcmVuY2VSZW5hbWVyKAotLy8JCQkJCQkJb2JqZWN0LmdldE5hbWUoKSwgb2JqZWN0LmdldFRhcmdldE5hbWVzcGFjZSgpLCBuYW1lLCByZWZlcmVuY2luZ1NjaGVtYSk7Ci0vLwkJCQkJcmVuYW1lci52aXNpdFNjaGVtYShyZWZlcmVuY2luZ1NjaGVtYSk7Ci0vLwkJCQkJcmVzdWx0cy5hZGRBbGwocmVuYW1lci5nZXRUZXh0RWRpdHMoKSk7Ci0vLwkJCQkJcmV0dXJuIG51bGw7Ci0vLwkJCQl9Ci0vLwotLy8JCQkJcHVibGljIE9iamVjdCBjYXNlWFNERWxlbWVudERlY2xhcmF0aW9uKAotLy8JCQkJCQlYU0RFbGVtZW50RGVjbGFyYXRpb24gb2JqZWN0KQotLy8JCQkJewotLy8JCQkJCWlmIChvYmplY3QuaXNHbG9iYWwoKSkKLS8vCQkJCQl7Ci0vLwkJCQkJCUdsb2JhbEVsZW1lbnRSZW5hbWVyIHJlbmFtZXIgPSBuZXcgR2xvYmFsRWxlbWVudFJlbmFtZXIoCi0vLwkJCQkJCQkJb2JqZWN0LmdldE5hbWUoKSwgb2JqZWN0LmdldFRhcmdldE5hbWVzcGFjZSgpLCBuYW1lLCByZWZlcmVuY2luZ1NjaGVtYSk7Ci0vLwkJCQkJCXJlbmFtZXIudmlzaXRTY2hlbWEocmVmZXJlbmNpbmdTY2hlbWEpOwotLy8JCQkJCQlyZXN1bHRzLmFkZEFsbChyZW5hbWVyLmdldFRleHRFZGl0cygpKTsKLS8vCQkJCQl9Ci0vLwkJCQkJcmV0dXJuIG51bGw7Ci0vLwkJCQl9Ci0vLwotLy8JCQkJcHVibGljIE9iamVjdCBjYXNlWFNETW9kZWxHcm91cERlZmluaXRpb24oCi0vLwkJCQkJCVhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG9iamVjdCkKLS8vCQkJCXsKLS8vCQkJCQlHbG9iYWxHcm91cFJlbmFtZXIgcmVuYW1lciA9IG5ldyBHbG9iYWxHcm91cFJlbmFtZXIoCi0vLwkJCQkJCQlvYmplY3QuZ2V0TmFtZSgpLCBvYmplY3QuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIG5hbWUsIHJlZmVyZW5jaW5nU2NoZW1hKTsKLS8vCQkJCQlyZW5hbWVyLnZpc2l0U2NoZW1hKHJlZmVyZW5jaW5nU2NoZW1hKTsKLS8vCQkJCQlyZXR1cm4gbnVsbDsKLS8vCQkJCX0KLS8vCQkJfTsKLQkJCS8veHNkU3dpdGNoLmRvU3dpdGNoKGNvbXBvbmVudCk7Ci0vLwkJCWNvbXBvbmVudC5zZXROYW1lKG5hbWUpOwotLy8JCQl0cnkKLS8vCQkJewotLy8JCQkJcmVmZXJlbmNpbmdTY2hlbWEuZVJlc291cmNlKCkuc2F2ZShuZXcgSGFzaE1hcCgpKTsKLS8vCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLS8vCQkJewotLy8JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQkJfQotCi0JCX0KLQotCQlwdWJsaWMgZmluYWwgTGlzdCBnZXRSZXN1bHRzKCkKLQkJewotCQkJcmV0dXJuIHJlc3VsdHM7Ci0JCX0KLQl9Ci0JCi0JCi0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1NvcnRpbmdTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvU29ydGluZ1NlYXJjaFJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTQwYThjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9yZW5hbWUvU29ydGluZ1NlYXJjaFJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgU29ydGluZ1NlYXJjaFJlcXVlc3RvciBleHRlbmRzIFNlYXJjaFJlcXVlc3RvciB7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTk9OQU1FU1BBQ0UgPSAibm9uYW1lc3BhY2UiOwotCi0JCi0JCXByaXZhdGUgTWFwIGZGb3VuZDsKLQotCQlwdWJsaWMgU29ydGluZ1NlYXJjaFJlcXVlc3RvcigpIHsKLQkJCWZGb3VuZD0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQkKLQotCQkKLQkJLyoqCi0JCSAqIEByZXR1cm4gYSBMaXN0IG9mIHtAbGluayBTZWFyY2hNYXRjaH1lcyAoc29ydGVkIGJ5IG5hbWVzcGFjZSkKLQkJICovCi0JCXB1YmxpYyBNYXAvKiBuYW1lc3BhY2UgLSA8U2VhcmNoTWF0Y2g+Ki8gZ2V0UmVzdWx0cygpIHsKLQkJCXJldHVybiBmRm91bmQ7Ci0JCX0KLQotCi0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guaW50ZXJuYWwucHJvdmlzaW9uYWwuU2VhcmNoUmVxdWVzdG9yI2FjY2VwdFNlYXJjaE1hdGNoKG9yZy5lY2xpcHNlLndzdC5jb21tb24uc2VhcmNoLmludGVybmFsLnByb3Zpc2lvbmFsLlNlYXJjaE1hdGNoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWNjZXB0U2VhcmNoTWF0Y2goU2VhcmNoTWF0Y2ggbWF0Y2gpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkJCi0JCQlpZihtYXRjaCAhPSBudWxsICYmIG1hdGNoLmdldE9iamVjdCgpIGluc3RhbmNlb2YgTm9kZSl7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpbWF0Y2guZ2V0T2JqZWN0KCk7Ci0JCQkJRWxlbWVudCBkb21FbGVtZW50ID0gbnVsbDsKLQkJCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJCWNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERToKLQkJCQkJZG9tRWxlbWVudCA9ICgoQXR0cilub2RlKS5nZXRPd25lckVsZW1lbnQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKLQkJCQkJZG9tRWxlbWVudCA9ICgoRWxlbWVudClub2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCVN0cmluZyBuYW1lc3BhY2UgPSBkb21FbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotCQkJCWlmKG5hbWVzcGFjZSA9PSBudWxsIHx8IG5hbWVzcGFjZS5lcXVhbHMoIiIpKXsKLQkJCQkJbmFtZXNwYWNlID0gTk9OQU1FU1BBQ0U7Ci0JCQkJfQotCQkJCUxpc3QgbWF0Y2hlcyA9IGdldE1hdGNoZXMobmFtZXNwYWNlKTsKLQkJCQltYXRjaGVzLmFkZChtYXRjaCk7CQkJCi0JCQl9Ci0JCQkKLQkJfQotCQkKLQkJcHJpdmF0ZSBMaXN0IGdldE1hdGNoZXMoU3RyaW5nIG5hbWVzcGFjZSl7Ci0JCQlPYmplY3QgbWF0Y2hlcyA9IGZGb3VuZC5nZXQobmFtZXNwYWNlKTsKLQkJCWlmKCEobWF0Y2hlcyBpbnN0YW5jZW9mIExpc3QpKXsKLQkJCQltYXRjaGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZGb3VuZC5wdXQobmFtZXNwYWNlLCBtYXRjaGVzKTsKLQkJCX0KLQkJCXJldHVybiAoTGlzdCltYXRjaGVzOwotCQkJCi0JCX0KLQkJCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1hNTENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1hNTENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYmEzMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9YTUxDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5yZW5hbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dENoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuVGV4dENoYW5nZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci51dGlsLlRleHRDaGFuZ2VDb21wYXRpYmlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWE1MQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnQgZXh0ZW5kcyBSZW5hbWVQYXJ0aWNpcGFudCB7Ci0JCi0JcHJvdGVjdGVkIFNlYXJjaE1hdGNoIG1hdGNoOwotCi0JcHJvdGVjdGVkIFRleHRDaGFuZ2VNYW5hZ2VyIGNoYW5nZU1hbmFnZXI7Ci0JcHJvdGVjdGVkIExpc3QgbWF0Y2hlczsKLQotICAgIAotICAgIAotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCi0JCWlmKGdldEFyZ3VtZW50cygpIGluc3RhbmNlb2YgQ29tcG9uZW50UmVuYW1lQXJndW1lbnRzKXsKLQkJCS8vIGNoYW5nZU1hbmdlciBpcyBwYXNzZWQgaW4gZnJvbSB0aGUgUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yIHRvIGNvbGxlY3QgYWxsIHRoZSBjaGFuZ2VzCi0JCQljaGFuZ2VNYW5hZ2VyID0gKChDb21wb25lbnRSZW5hbWVBcmd1bWVudHMpZ2V0QXJndW1lbnRzKCkpLmdldENoYW5nZU1hbmFnZXIoKTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAiWE1MIENvbXBvbmVudCBSZW5hbWUgUGFydGljaXBhbnQiOwotCX0KLQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0NvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFRleHRDaGFuZ2VNYW5hZ2VyIGdldENoYW5nZU1hbmFnZXIoKXsKLQkJCi0JCWlmKGNoYW5nZU1hbmFnZXIgPT0gbnVsbCl7Ci0JCQkJY2hhbmdlTWFuYWdlciA9IG5ldyBUZXh0Q2hhbmdlTWFuYWdlcihmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIGNoYW5nZU1hbmFnZXI7Ci0JCQotCX0KLQkKLS8vCXByaXZhdGUgUmVmYWN0b3JpbmdTdGF0dXMgY3JlYXRlUmVuYW1lQ2hhbmdlcyhmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLS8vCQlBc3NlcnQuaXNOb3ROdWxsKG1vbml0b3IpOwotLy8JCWZpbmFsIFJlZmFjdG9yaW5nU3RhdHVzIHN0YXR1cz0gbmV3IFJlZmFjdG9yaW5nU3RhdHVzKCk7Ci0vLwkJdHJ5IHsKLS8vCQkJbW9uaXRvci5iZWdpblRhc2soIlJlZmFjdG9yaW5nTWVzc2FnZXMuUmVuYW1lQ29tcG9uZW50UmVmYWN0b3Jpbmdfc2VhcmNoaW5nIiwgMSk7IAotLy8JCQljcmVhdGVSZW5hbWVDaGFuZ2VzKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotLy8JCQkvL3VwZGF0ZUNoYW5nZU1hbmFnZXIobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSwgc3RhdHVzKTsKLS8vCQl9IGZpbmFsbHkgewotLy8JCQltb25pdG9yLmRvbmUoKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIHN0YXR1czsKLS8vCX0KLQotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uLAotCQkJT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYXRjaGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU2VhcmNoTWF0Y2ggbWF0Y2ggPSAoU2VhcmNoTWF0Y2gpIGl0ZXIubmV4dCgpOwotCQkJVGV4dENoYW5nZSB0ZXh0Q2hhbmdlID0gZ2V0Q2hhbmdlTWFuYWdlcigpLmdldChtYXRjaC5nZXRGaWxlKCkpOwotCQkJU3RyaW5nIG5ld05hbWUgPSBnZXRBcmd1bWVudHMoKS5nZXROZXdOYW1lKCk7Ci0JCQlTdHJpbmcgcXVhbGlmaWVyID0gIiI7Ci0JCQlpZihnZXRBcmd1bWVudHMoKSBpbnN0YW5jZW9mIENvbXBvbmVudFJlbmFtZUFyZ3VtZW50cyl7Ci0JCQkJcXVhbGlmaWVyID0gKChDb21wb25lbnRSZW5hbWVBcmd1bWVudHMpZ2V0QXJndW1lbnRzKCkpLmdldFF1YWxpZmllcigpOwotCQkJfQotCQkJaWYobWF0Y2guZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBOb2RlKXsKLQkJCQlOb2RlIG5vZGUgPSAoTm9kZSltYXRjaC5nZXRPYmplY3QoKTsKLQkJCQlpZihub2RlIGluc3RhbmNlb2YgSURPTUF0dHIpewotCQkJCQlJRE9NQXR0ciBhdHRyID0gKElET01BdHRyKW5vZGU7Ci0JCQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpYXR0ci5nZXRPd25lckVsZW1lbnQoKSA7Ci0JCQkJCW5ld05hbWUgPSBnZXROZXdRTmFtZShlbGVtZW50LCBxdWFsaWZpZXIsIG5ld05hbWUpOwotCQkJCX0KLQkJCQluZXdOYW1lID0gUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yLnF1b3RlU3RyaW5nKG5ld05hbWUpOwotCQkJfQotCQkJCi0JCQlSZXBsYWNlRWRpdCByZXBsYWNlRWRpdCA9IG5ldyBSZXBsYWNlRWRpdChtYXRjaC5nZXRPZmZzZXQoKSwgbWF0Y2guZ2V0TGVuZ3RoKCksIG5ld05hbWUgKTsKLQkJCVN0cmluZyBlZGl0TmFtZSA9IFJlZmFjdG9yaW5nTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IuQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZV9yZWZlcmVuY2UiKTsKLQkJCVRleHRDaGFuZ2VDb21wYXRpYmlsaXR5LmFkZFRleHRFZGl0KHRleHRDaGFuZ2UsIGVkaXROYW1lLCByZXBsYWNlRWRpdCk7Ci0gICAJCX0KLQkJLy8gZG9uJ3QgY3JlYXRlIGFueSBjaGFuZ2Ugbm93LCBhbGwgdGhlIGNoYW5nZXMgYXJlIGluIGNoYW5nZU1hbmdlciB2YXJpYWJsZSBhbmQgd2lsbCBiZSBjb21iaW5lZCBpbiBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3IucG9zdENyZWF0ZUNoYW5nZSBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXROZXdRTmFtZShOb2RlIG5vZGUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5ld05hbWUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByZWZpeCA9IFhTRENvbnN0YW50cy5sb29rdXBRdWFsaWZpZXIobm9kZSwgdGFyZ2V0TmFtZXNwYWNlKTsKLQkJCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJc2IuYXBwZW5kKHByZWZpeCk7Ci0JCQkJc2IuYXBwZW5kKCI6Iik7Ci0JCQkJc2IuYXBwZW5kKG5ld05hbWUpOwotCQkJfSBlbHNlIHsKLQkJCQlzYi5hcHBlbmQobmV3TmFtZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQobmV3TmFtZSk7Ci0JCX0KLQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2hhbmdlTWFuYWdlcihUZXh0Q2hhbmdlTWFuYWdlciBjaGFuZ2VNYW5hZ2VyKQotICB7Ci0gICAgdGhpcy5jaGFuZ2VNYW5hZ2VyID0gY2hhbmdlTWFuYWdlcjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1hTRENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvcmVuYW1lL1hTRENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMTY5ZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3JlbmFtZS9YU0RDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnJlbmFtZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLklYU0RTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotCi0vKioKLSAqIFRoaXMgcGFydGljaXBhbnQgdGFrZXMgY2FzZSBvZiByZW5hbWluZyBtYXRjaGVzIHRoYXQgYXJlIFhTRCBjb21wb25lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudCBleHRlbmRzIFhNTENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50IHsKLQotcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZShPYmplY3QgZWxlbWVudCkgewotCQlzdXBlci5pbml0aWFsaXplKGVsZW1lbnQpOwotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgWFNETmFtZWRDb21wb25lbnQpewotCQkJaWYoZ2V0QXJndW1lbnRzKCkgaW5zdGFuY2VvZiBDb21wb25lbnRSZW5hbWVBcmd1bWVudHMpewotCQkJCW1hdGNoZXMgPSAoTGlzdCkoKENvbXBvbmVudFJlbmFtZUFyZ3VtZW50cylnZXRBcmd1bWVudHMoKSkuZ2V0TWF0Y2hlcygpLmdldChJWFNEU2VhcmNoQ29uc3RhbnRzLlhNTFNDSEVNQV9OQU1FU1BBQ0UpOwotCQkJfQotCQkJaWYobWF0Y2hlcyAhPSBudWxsKXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkKLQkJcmV0dXJuICJYU0QgY29tcG9uZW50IHJlbmFtZSBwYXJ0aWNpcGFudCI7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9BYnN0cmFjdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvQWJzdHJhY3RDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOWViYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9BYnN0cmFjdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb21tYW5kIAotewotICBwcml2YXRlIFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudDsKLSAgcHJpdmF0ZSBYU0RDb25jcmV0ZUNvbXBvbmVudCBtb2RlbDsKLQotICBwcm90ZWN0ZWQgQWJzdHJhY3RDb21tYW5kKFhTRENvbmNyZXRlQ29tcG9uZW50IHBhcmVudCkKLSAgewotICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICB9Ci0gIAotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBydW4oKTsKLQotICBwcm90ZWN0ZWQgWFNEQ29uY3JldGVDb21wb25lbnQgZ2V0UGFyZW50KCkKLSAgewotICAgIHJldHVybiBwYXJlbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBYU0RDb25jcmV0ZUNvbXBvbmVudCBnZXRNb2RlbE9iamVjdCgpCi0gIHsKLSAgICByZXR1cm4gbW9kZWw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHNldE1vZGVsT2JqZWN0KFhTRENvbmNyZXRlQ29tcG9uZW50IG1vZGVsKQotICB7Ci0gICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICB9Ci0gIAotICAvLyBFc3RhYmxpc2ggcGFydC13aG9sZSByZWxhdGlvbnNoaXAKLSAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gYWRvcHQoWFNEQ29uY3JldGVDb21wb25lbnQgbW9kZWwpOwotCi0gIHByb3RlY3RlZCB2b2lkIGZvcm1hdENoaWxkKEVsZW1lbnQgY2hpbGQpCi0gIHsKLSAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICB7Ci0gICAgICBJRE9NTW9kZWwgbW9kZWwgPSAoKElET01Ob2RlKWNoaWxkKS5nZXRNb2RlbCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcgbW9kZWwgY2hhbmdlCi0gICAgICAgIG1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotICAgICAgICAKLSAgICAgICAgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotICAgICAgICBmb3JtYXRQcm9jZXNzb3IuZm9ybWF0Tm9kZShjaGlsZCk7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIC8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnIG1vZGVsIGNoYW5nZQotICAgICAgICBtb2RlbC5jaGFuZ2VkTW9kZWwoKTsgCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivc3RydWN0dXJlL01ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWZjMWIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iuc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIE1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0KLQlTdHJpbmcgZk5ld05hbWU7Ci0KLQlwdWJsaWMgTWFrZUFub255bW91c1R5cGVHbG9iYWxDb21tYW5kKFhTRENvbmNyZXRlQ29tcG9uZW50IGVsZW1lbnQsCi0JCQlTdHJpbmcgbmV3TmFtZSkgewotCQlzdXBlcihlbGVtZW50LmdldENvbnRhaW5lcigpKTsKLQkJc2V0TW9kZWxPYmplY3QoZWxlbWVudCk7Ci0JCWZOZXdOYW1lID0gbmV3TmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCVhTRENvbmNyZXRlQ29tcG9uZW50IG1vZGVsID0gZ2V0TW9kZWxPYmplY3QoKTsKLQkJWFNEQ29uY3JldGVDb21wb25lbnQgcGFyZW50ID0gbW9kZWwuZ2V0Q29udGFpbmVyKCk7Ci0JCVhTRFR5cGVEZWZpbml0aW9uIGdsb2JhbFR5cGVEZWYgPSBudWxsOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCQkvLyBjbG9uZSB0eXBlZGVmIHdpdGggaXQncyBjb250ZW50IGFuZCBzZXQgaXQgZ2xvYmFsCi0JCQkJZ2xvYmFsVHlwZURlZiA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIG1vZGVsCi0JCQkJCQkuY2xvbmVDb25jcmV0ZUNvbXBvbmVudCh0cnVlLCBmYWxzZSk7Ci0JCQkJZ2xvYmFsVHlwZURlZi5zZXROYW1lKGZOZXdOYW1lKTsKLQkJCQlwYXJlbnQuZ2V0U2NoZW1hKCkuZ2V0Q29udGVudHMoKS5hZGQoZ2xvYmFsVHlwZURlZik7Ci0JCQkJKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHBhcmVudCkKLQkJCQkJCS5zZXRUeXBlRGVmaW5pdGlvbihnbG9iYWxUeXBlRGVmKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB7Ci0KLQkJCVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIG1vZGVsOwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCS8vIGNsb25lIHR5cGVkZWYgd2l0aCBpdCdzIGNvbnRlbnQgYW5kIHNldCBpdCBnbG9iYWwKLQkJCQlnbG9iYWxUeXBlRGVmID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKSB0eXBlRGVmCi0JCQkJCQkuY2xvbmVDb25jcmV0ZUNvbXBvbmVudCh0cnVlLCBmYWxzZSk7Ci0JCQkJZ2xvYmFsVHlwZURlZi5zZXROYW1lKGZOZXdOYW1lKTsKLQkJCQlwYXJlbnQuZ2V0U2NoZW1hKCkuZ2V0Q29udGVudHMoKS5hZGQoZ2xvYmFsVHlwZURlZik7Ci0JCQkJKChYU0RFbGVtZW50RGVjbGFyYXRpb24pIHBhcmVudCkKLQkJCQkJCS5zZXRUeXBlRGVmaW5pdGlvbihnbG9iYWxUeXBlRGVmKTsKLQkJCQlmb3JtYXRDaGlsZChnbG9iYWxUeXBlRGVmLmdldEVsZW1lbnQoKSk7Ci0KLQkJCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIHsKLQkJCQkvLyBjbG9uZSB0eXBlZGVmIHdpdGggaXQncyBjb250ZW50IGFuZCBzZXQgaXQgZ2xvYmFsCi0JCQkJZ2xvYmFsVHlwZURlZiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdHlwZURlZgotCQkJCQkJLmNsb25lQ29uY3JldGVDb21wb25lbnQodHJ1ZSwgZmFsc2UpOwotCQkJCWdsb2JhbFR5cGVEZWYuc2V0TmFtZShmTmV3TmFtZSk7Ci0JCQkJcGFyZW50LmdldFNjaGVtYSgpLmdldENvbnRlbnRzKCkuYWRkKGdsb2JhbFR5cGVEZWYpOwotCQkJCSgoWFNEQXR0cmlidXRlRGVjbGFyYXRpb24pIHBhcmVudCkKLQkJCQkJCS5zZXRUeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIGdsb2JhbFR5cGVEZWYpOwotCi0JCQl9Ci0KLQkJfQotCi0JCWZvcm1hdENoaWxkKGdsb2JhbFR5cGVEZWYuZ2V0RWxlbWVudCgpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5jb21tYW5kcy5BYnN0cmFjdENvbW1hbmQjYWRvcHQob3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkb3B0KFhTRENvbmNyZXRlQ29tcG9uZW50IG1vZGVsKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9NYWtlTG9jYWxFbGVtZW50R2xvYmFsQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9NYWtlTG9jYWxFbGVtZW50R2xvYmFsQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzUyYWQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvTWFrZUxvY2FsRWxlbWVudEdsb2JhbENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBNYWtlTG9jYWxFbGVtZW50R2xvYmFsQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZAotewotCQotICBwdWJsaWMgTWFrZUxvY2FsRWxlbWVudEdsb2JhbENvbW1hbmQKLSAgICAoWFNEQ29uY3JldGVDb21wb25lbnQgZWxlbWVudCkKLSAgewotICAgIHN1cGVyKGVsZW1lbnQuZ2V0Q29udGFpbmVyKCkpOwotICAgIHNldE1vZGVsT2JqZWN0KGVsZW1lbnQpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgCi0gICBpZihnZXRNb2RlbE9iamVjdCgpIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKXsKLSAgIAotCSAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbilnZXRNb2RlbE9iamVjdCgpOwotIAlYU0RDb25jcmV0ZUNvbXBvbmVudCBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKLSAJWFNEQ29uY3JldGVDb21wb25lbnQgY29udGFpbmVyID0gcGFyZW50LmdldENvbnRhaW5lcigpOwotIAkKLSAJLy8gY2xvbmUgZWxlbWVudCB3aXRoIGl0J3MgY29udGVudCBhbmQgc2V0IGl0IGdsb2JhbAotCVhTRENvbmNyZXRlQ29tcG9uZW50ICBlbGVtZW50RGVjbCA9ICgoWFNERWxlbWVudERlY2xhcmF0aW9uKWdldE1vZGVsT2JqZWN0KCkpLmNsb25lQ29uY3JldGVDb21wb25lbnQodHJ1ZSwgdHJ1ZSk7Ci0gCWNvbnRhaW5lci5nZXRTY2hlbWEoKS5nZXRDb250ZW50cygpLmFkZChlbGVtZW50RGVjbCk7Ci0gCQotIAkvLyBjcmVhdGUgbG9jYWwgZWxlbWVudCBhbmQgc2V0IGl0J3MgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb25lCi0gCVhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50UmVmID0gCi0JICAgICAgWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0JZWxlbWVudFJlZi5zZXRWYWx1ZShlbGVtZW50LmdldFZhbHVlKCkpOwotICAgIGVsZW1lbnRSZWYuc2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKFhTREVsZW1lbnREZWNsYXJhdGlvbillbGVtZW50RGVjbCk7IAotICAgIAotICAgIC8vIG5vdyBzZXQgY29udGVudCBtb2RlbHMKLSAJaWYocGFyZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVDb250ZW50KXsKLSAJCWlmKGNvbnRhaW5lciBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApewotIAkJCVhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IChYU0RNb2RlbEdyb3VwKWNvbnRhaW5lcjsKLSAJCQkvLyBkaXNjb25uZWN0IHBhcmVudCBmcm9tIGl0cyBjb250YWluZXIKLSAJCQlpbnQgaW5kZXggPSBtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuaW5kZXhPZihwYXJlbnQpOwotIAkJCSBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IAotIAkJCSAgICAgIFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFBhcnRpY2xlKCk7Ci0gCQkgICAgcGFydGljbGUuc2V0Q29udGVudChlbGVtZW50UmVmKTsKLSAJCSAgICBtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkuYWRkKGluZGV4LCBwYXJ0aWNsZSk7IAotICAgICAgICAgICAgLy8gQ29weSBvdmVyIHRoZSBtYXgvbWluT2NjdXJzIGZyb20gdGhlIG9sZCBsb2NhbCB0byB0aGUgZWxlbWVudCByZWYKLSAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkgewotICAgICAgICAgICAgICBYU0RQYXJ0aWNsZSBwYXJlbnRQYXJ0aWNsZSA9IChYU0RQYXJ0aWNsZSlwYXJlbnQ7Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBpZiAocGFyZW50UGFydGljbGUuaXNTZXRNaW5PY2N1cnMoKSkgewotICAgICAgICAgICAgICAgIHBhcnRpY2xlLnNldE1pbk9jY3VycyhwYXJlbnRQYXJ0aWNsZS5nZXRNaW5PY2N1cnMoKSk7Ci0gICAgICAgICAgICAgICAgcGFyZW50UGFydGljbGUudW5zZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaWYgKHBhcmVudFBhcnRpY2xlLmlzU2V0TWF4T2NjdXJzKCkpIHsKLSAgICAgICAgICAgICAgICBwYXJ0aWNsZS5zZXRNYXhPY2N1cnMocGFyZW50UGFydGljbGUuZ2V0TWF4T2NjdXJzKCkpOwotICAgICAgICAgICAgICAgIHBhcmVudFBhcnRpY2xlLnVuc2V0TWF4T2NjdXJzKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgICAgICBlbGVtZW50LnVuc2V0Rm9ybSgpOwotIAkJICAgCi0gCQkJbW9kZWxHcm91cC5nZXRDb250ZW50cygpLnJlbW92ZShwYXJlbnQpOwotIAkJICAgIG1vZGVsR3JvdXAudXBkYXRlRWxlbWVudCh0cnVlKTsKLSAgCQkgICAgZm9ybWF0Q2hpbGQobW9kZWxHcm91cC5nZXRFbGVtZW50KCkpOwotIAkJfQotIAl9Ci0gCWVsc2UgaWYocGFyZW50IGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pewotCQkgCQkKLSAJfQotIAkKLSAJY29udGFpbmVyLmdldFNjaGVtYSgpLnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0gICAgZm9ybWF0Q2hpbGQoZWxlbWVudERlY2wuZ2V0RWxlbWVudCgpKTsKLSAgCi0gICB9Ci0KLSAgfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuY29tbWFuZHMuQWJzdHJhY3RDb21tYW5kI2Fkb3B0KG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZG9wdChYU0RDb25jcmV0ZUNvbXBvbmVudCBtb2RlbCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvTWFrZVR5cGVHbG9iYWxDaGFuZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci9zdHJ1Y3R1cmUvTWFrZVR5cGVHbG9iYWxDaGFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiMWQyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivc3RydWN0dXJlL01ha2VUeXBlR2xvYmFsQ2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLnN0cnVjdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLlJlZmFjdG9yaW5nTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgZWJlbGlzYXIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTWFrZVR5cGVHbG9iYWxDaGFuZ2UgZXh0ZW5kcyBDaGFuZ2UgewotCi0JcHJpdmF0ZSBNYXAgZkNoYW5nZXM7Ci0KLQlwcml2YXRlIFN0cmluZyBmTmV3TmFtZTsKLQotCXByaXZhdGUgWFNEVHlwZURlZmluaXRpb24gZlR5cGVDb21wb25lbnQ7Ci0KLQlwdWJsaWMgTWFrZVR5cGVHbG9iYWxDaGFuZ2UoWFNEVHlwZURlZmluaXRpb24gY29tcG9uZW50LCAKLQkJCVN0cmluZyBuZXdOYW1lKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobmV3TmFtZSwgIm5ldyBuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQotCQlmVHlwZUNvbXBvbmVudCA9IGNvbXBvbmVudDsKLQkJZk5ld05hbWUgPSBuZXdOYW1lOwotCX0KLQotCS8vIHB1YmxpYyBzdGF0aWMgQ2hhbmdlW10gY3JlYXRlQ2hhbmdlc0ZvcihYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQsCi0JLy8gU3RyaW5nIG5ld05hbWUpIHsKLQkvLyAvLyBUT0RPOiBQMSBpbXBsZW1lbnQgc2VhcmNoIG9mIFhTRCBmaWxlcwotCS8vIFhTRFNlYXJjaFN1cHBvcnQgc3VwcG9ydCA9IFhTRFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkvLyBSZWZhY3RvclNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcKLQkvLyBSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcihjb21wb25lbnQsIG5ld05hbWUpOwotCS8vIHN1cHBvcnQuc2VhcmNoUnVubmFibGUoY29tcG9uZW50LCBJWFNEU2VhcmNoQ29uc3RhbnRzLldPUktTUEFDRV9TQ09QRSwKLQkvLyByZXF1ZXN0b3IpOwotCS8vCi0JLy8gcmV0dXJuIHJlcXVlc3Rvci5nZXRDaGFuZ2VzKCk7Ci0JLy8KLQkvLyB9Ci0KLQlwcm90ZWN0ZWQgQ2hhbmdlIGNyZWF0ZVVuZG9DaGFuZ2UoKSB7Ci0JCXJldHVybiBuZXcgTWFrZVR5cGVHbG9iYWxDaGFuZ2UoZlR5cGVDb21wb25lbnQsIGdldE5ld05hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9SZW5hbWUoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIFAxIGNoYW5nZSB0ZW1wb3JhcnkgcmVuYW1lIG9mIFhTRCBtb2RlbCBjb21wb25lbnRzCi0JCXBlcmZvcm1Nb2RpZnkoZ2V0TmV3TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtTW9kaWZ5KGZpbmFsIFN0cmluZyB2YWx1ZSkgewotLy8JCQlEZWxheWVkUmVuYW1lUnVubmFibGUgcnVubmFibGUgPSBuZXcgRGVsYXllZFJlbmFtZVJ1bm5hYmxlKAotLy8JCQkJCWZUeXBlQ29tcG9uZW50LCB2YWx1ZSk7Ci0JCQkvLyBUT0RPOiByZW1vdmUgRGlzcGxheQotCQkJLy9EaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMocnVubmFibGUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgRGVsYXllZFJlbmFtZVJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgewotCQlwcm90ZWN0ZWQgWFNEVHlwZURlZmluaXRpb24gY29tcG9uZW50OwotCi0JCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotCQlwdWJsaWMgRGVsYXllZFJlbmFtZVJ1bm5hYmxlKFhTRFR5cGVEZWZpbml0aW9uIGNvbXBvbmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCURvY3VtZW50SW1wbCBkb2MgPSAoRG9jdW1lbnRJbXBsKSBjb21wb25lbnQuZ2V0RWxlbWVudCgpLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCWRvYy5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJUmVmYWN0b3JpbmdNZXNzYWdlcwotCQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0FDVElPTl9NQUtFX0FOT05ZTU9VU19UWVBFX0dMT0JBTCIpKTsKLQkJCU1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQ29tbWFuZCBjb21tYW5kID0gbmV3IE1ha2VBbm9ueW1vdXNUeXBlR2xvYmFsQ29tbWFuZCgKLQkJCQkJY29tcG9uZW50LCBuYW1lKTsKLQkJCWNvbW1hbmQucnVuKCk7Ci0JCQlkb2MuZ2V0TW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dENoYW5nZSBnZXRDaGFuZ2UoSUZpbGUgZmlsZSkgewotCQlUZXh0Q2hhbmdlIHJlc3VsdCA9IChUZXh0Q2hhbmdlKSBmQ2hhbmdlcy5nZXQoZmlsZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gbmV3IFRleHRGaWxlQ2hhbmdlKGZpbGUuZ2V0TmFtZSgpLCBmaWxlKTsKLQkJCWZDaGFuZ2VzLnB1dChmaWxlLCByZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gUmVmYWN0b3JpbmdNZXNzYWdlcwotCQkJCS5nZXRGb3JtYXR0ZWRTdHJpbmcoCi0JCQkJCQkiTWFrZVR5cGVHbG9iYWxDaGFuZ2UubmFtZSIsIG5ldyBTdHJpbmdbXSB7Z2V0TmV3TmFtZSgpIH0pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGZpbmFsIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXBtLmJlZ2luVGFzayhSZWZhY3RvcmluZ01lc3NhZ2VzCi0JCQkJCS5nZXRTdHJpbmcoIlhTRENvbXBvbmVudFJlbmFtZUNoYW5nZS5SZW5hbWluZyIpLCAxKTsgLy8kTk9OLU5MUy0xJAotCQkJQ2hhbmdlIHJlc3VsdCA9IGNyZWF0ZVVuZG9DaGFuZ2UoKTsKLQkJCWRvUmVuYW1lKG5ldyBTdWJQcm9ncmVzc01vbml0b3IocG0sIDEpKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gZmluYWxseSB7Ci0JCQlwbS5kb25lKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuZXdOYW1lLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmV3TmFtZSgpIHsKLQkJcmV0dXJuIGZOZXdOYW1lOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2UjZ2V0TW9kaWZpZWRFbGVtZW50KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZlR5cGVDb21wb25lbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2UjaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlI2lzVmFsaWQob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24sCi0JCQlPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gaW1wbGVtZW50IGNoYW5nZSB2YWxpZGF0aW9uCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivc3RydWN0dXJlL01ha2VUeXBlR2xvYmFsUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivc3RydWN0dXJlL01ha2VUeXBlR2xvYmFsUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNzkzZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3N0cnVjdHVyZS9NYWtlVHlwZUdsb2JhbFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5zdHJ1Y3R1cmU7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUGFydGljaXBhbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVBcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuU2hhcmFibGVQYXJ0aWNpcGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5JTmFtZVVwZGF0aW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IuUmVmYWN0b3JpbmdNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBNYWtlVHlwZUdsb2JhbFByb2Nlc3NvciBleHRlbmRzIFJlbmFtZVByb2Nlc3NvciBpbXBsZW1lbnRzIElOYW1lVXBkYXRpbmd7Ci0JCi0JcHJpdmF0ZSBYU0RUeXBlRGVmaW5pdGlvbiBmVHlwZUNvbXBvbmVudDsKLQlwcml2YXRlIFN0cmluZyBmTmV3RWxlbWVudE5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElGSUVSPSAib3JnLmVjbGlwc2Uud3N0LnVpLnhzZC5tYWtlVHlwZUdsb2JhbFByb2Nlc3NvciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vcHJpdmF0ZSBRdWFsaWZpZWROYW1lU2VhcmNoUmVzdWx0IGZOYW1lU2VhcmNoUmVzdWx0OwotCQotCXB1YmxpYyBNYWtlVHlwZUdsb2JhbFByb2Nlc3NvcihYU0RUeXBlRGVmaW5pdGlvbiBlbGVtZW50LCBTdHJpbmcgbmV3TmFtZSkgewotCQlmVHlwZUNvbXBvbmVudD0gZWxlbWVudDsKLQkJZk5ld0VsZW1lbnROYW1lID0gbmV3TmFtZTsKLQkJCi0JfQotCQotCXB1YmxpYyBYU0RUeXBlRGVmaW5pdGlvbiBnZXRUeXBlQ29tcG9uZW50KCkgewotCQlyZXR1cm4gZlR5cGVDb21wb25lbnQ7Ci0JfQotCi0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC5yZWZhY3RvcmluZy50YWdnaW5nLklUZXh0VXBkYXRpbmcjY2FuRW5hYmxlVGV4dFVwZGF0aW5nKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FbmFibGVUZXh0VXBkYXRpbmcoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRBZmZlY3RlZFByb2plY3ROYXR1cmVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvL1RPRE86IGZpbmQgcHJvamVjdCBuYXR1cmVzIG9mIHRoZSBmaWxlcyB0aGF0IGFyZSBnb2luZyB0byBiZSByZWZhY3RvcmVkCi0JCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGVyaXZlZFBhcnRpY2lwYW50cyhSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMsCi0JCQlMaXN0IHJlc3VsdCwgU3RyaW5nW10gbmF0dXJlcywgU2hhcmFibGVQYXJ0aWNpcGFudHMgc2hhcmVkKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPOiBwcm92aWRlIGEgd2F5IHRvIGxvYWQgcmVuYW1lIHBhcnRpY2lwYW50cwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjY2hlY2tGaW5hbENvbmRpdGlvbnMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0KQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0ZpbmFsQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtLAotCQkJQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwKLQkJCU9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBhZGQgY29kZSB0byBjaGVjayBmaW5hbCBjb25kaXRpb25zIGZvciBjb21wb25lbnQgcmVuYW1lCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2NoZWNrSW5pdGlhbENvbmRpdGlvbnMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrSW5pdGlhbENvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0vLwkJIFRPRE8gYWRkIGNvZGUgdG8gY2hlY2sgaW5pdGlhbCBjb25kaXRpb25zIGZvciBjb21wb25lbnQgcmVuYW1lCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2NyZWF0ZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwKLQkJCU9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBQMSBhZGQgY2hhbmdlIGNyZWF0aW9uCi0vLwkJQ2hhbmdlW10gY2hhbmdlcyA9IFhTRENvbXBvbmVudFJlbmFtZUNoYW5nZS5jcmVhdGVDaGFuZ2VzRm9yKHRoaXMuZk5hbWVkQ29tcG9uZW50LCBnZXROZXdFbGVtZW50TmFtZSgpKTsKLS8vCQlDb21wb3NpdGVDaGFuZ2UgbXVsdGlDaGFuZ2UgPSBudWxsOyAKLS8vCQkJaWYoY2hhbmdlcy5sZW5ndGggPiAwKQotLy8JCQkJbXVsdGlDaGFuZ2UgID0gbmV3IENvbXBvc2l0ZUNoYW5nZSgiWFNEIGNvbXBvbmVudCByZW5hbWUgcGFydGljaXBhbnQgY2hhbmdlcyIsIGNoYW5nZXMpOyAvLyROT04tTkxTLTEkIFRPRE86IGV4dGVybmFsaXplIHN0cmluZwotLy8JCXJldHVybiBtdWx0aUNoYW5nZTsKLQkJCi0vLwkJY29tcHV0ZU5hbWVNYXRjaGVzKHBtKTsJCi0vLwkJQ2hhbmdlW10gY2hhbmdlcyA9IGZOYW1lU2VhcmNoUmVzdWx0LmdldEFsbENoYW5nZXMoKTsKLS8vCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUNoYW5nZSgiWFNEIGZpbGUgcmVuYW1lIHBhcnRpY2lwYW50IGNoYW5nZXMiLCBjaGFuZ2VzKTsgLy9UT0RPOiBleHRlcm5hbGl6ZSBzdHJpbmcKLQkJcG0uYmVnaW5UYXNrKCIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQl0cnl7Ci0JCQlyZXR1cm4gbmV3IE1ha2VUeXBlR2xvYmFsQ2hhbmdlKGZUeXBlQ29tcG9uZW50LCBnZXROZXdFbGVtZW50TmFtZSgpKTsKLQkJfSBmaW5hbGx5ewotCQkJcG0uZG9uZSgpOwotCQl9CSAKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUHJvY2Vzc29yI2dldEVsZW1lbnRzKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoKSB7Ci0JCQotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHtmVHlwZUNvbXBvbmVudH07Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNnZXRJZGVudGlmaWVyKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBJREVOVElGSUVSOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQcm9jZXNzb3IjZ2V0UHJvY2Vzc29yTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9jZXNzb3JOYW1lKCkgewotCQlyZXR1cm4gUmVmYWN0b3JpbmdNZXNzYWdlcy5nZXRGb3JtYXR0ZWRTdHJpbmcoCi0JCQkJIk1ha2VMb2NhbFR5cGVHbG9iYWxSZWZhY3RvcmluZy5uYW1lIiwgIC8vJE5PTi1OTFMtMSQKLQkJCQluZXcgU3RyaW5nW117Z2V0TmV3RWxlbWVudE5hbWUoKX0pOwotCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvciNpc0FwcGxpY2FibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZUeXBlQ29tcG9uZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIFRPRE8gaW1wbGVtZW50IGlzQXBwbGljYWJsZSBsb2dpYyBmb3IgdGhlIG5hbWVkIGNvbXBvbmVudCwgCi0JCS8vIHZlcmlmeSBob3cgaXQgaXMgZGlmZmVyZW50IGZyb20gb3RoZXIgY29uZGl0aW9uIGNoZWNrcwotLy8JCWlmIChmTmFtZWRDb21wb25lbnQuaXNBbm9ueW1vdXMoKSkKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCWlmICghIENoZWNrcy5pc0F2YWlsYWJsZShmVHlwZSkpCi0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQlpZiAoaXNTcGVjaWFsQ2FzZShmVHlwZSkpCi0vLwkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQucmVmYWN0b3JpbmcudGFnZ2luZy5JTmFtZVVwZGF0aW5nI2NoZWNrTmV3RWxlbWVudE5hbWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tOZXdFbGVtZW50TmFtZShTdHJpbmcgbmV3TmFtZSl7Ci0JCUFzc2VydC5pc05vdE51bGwobmV3TmFtZSwgIm5ldyBuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gVE9ETzogaW1wbGVtZW50IG5ldyBuYW1lIGNoZWNraW5nCi0vLwkJUmVmYWN0b3JpbmdTdGF0dXMgcmVzdWx0ID0gQ2hlY2tzLmNoZWNrVHlwZU5hbWUobmV3TmFtZSk7Ci0vLwkJaWYgKENoZWNrcy5pc0FscmVhZHlOYW1lZChmVHlwZSwgbmV3TmFtZSkpCi0vLwkJCXJlc3VsdC5hZGRGYXRhbEVycm9yKFJlZmFjdG9yaW5nQ29yZU1lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lVHlwZVJlZmFjdG9yaW5nLmNob29zZV9hbm90aGVyX25hbWUiKSk7CSAvLyROT04tTkxTLTEkCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC5yZWZhY3RvcmluZy50YWdnaW5nLklOYW1lVXBkYXRpbmcjZ2V0TmV3RWxlbWVudCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXROZXdFbGVtZW50KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIGltcGxlbWVudCB0aGlzIG1ldGhvZCwgaXQncyB1c2VkIGZvciB1cGRhdGluZyBzZWxlY3Rpb24gb24gbmV3IGVsZW1lbnQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotLy8JcHJpdmF0ZSB2b2lkIGNvbXB1dGVOYW1lTWF0Y2hlcyhJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0vLwkKLS8vCSAgICBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLS8vCSAgICB0cnkgewotLy8JCQlVUkwgZmlsZVVSTCA9IFBsYXRmb3JtLnJlc29sdmUobmV3IFVSTChmTmFtZWRDb21wb25lbnQuZ2V0U2NoZW1hKCkuZ2V0U2NoZW1hTG9jYXRpb24oKSkpOwotLy8JCQlJRmlsZSBmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgoZmlsZVVSTC5nZXRQYXRoKCkpKTsKLS8vCQkJaWYgKGZOYW1lU2VhcmNoUmVzdWx0ID09IG51bGwpCi0vLwkJCQlmTmFtZVNlYXJjaFJlc3VsdD0gbmV3IFF1YWxpZmllZE5hbWVTZWFyY2hSZXN1bHQoKTsKLS8vCQkJUXVhbGlmaWVkTmFtZUZpbmRlci5wcm9jZXNzKGZOYW1lU2VhcmNoUmVzdWx0LCBnZXROYW1lZENvbXBvbmVudCgpLmdldE5hbWUoKSwgIAotLy8JCQkJZ2V0TmV3RWxlbWVudE5hbWUoKSwgCi0vLwkJCQkiKi54c2QiLCBmaWxlLmdldFByb2plY3QoKSwgcG0pOwotLy8JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLS8vCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotLy8JCQllLnByaW50U3RhY2tUcmFjZSgpOwotLy8JCX0KLS8vCX0KLQkKLQlwdWJsaWMgZmluYWwgUmVmYWN0b3JpbmdQYXJ0aWNpcGFudFtdIGxvYWRQYXJ0aWNpcGFudHMoUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzLCBTaGFyYWJsZVBhcnRpY2lwYW50cyBzaGFyZWRQYXJ0aWNpcGFudHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVuYW1lQXJndW1lbnRzIGFyZ3VtZW50cz0gbmV3IFJlbmFtZUFyZ3VtZW50cyhnZXROZXdFbGVtZW50TmFtZSgpLCB0cnVlKTsKLQkJU3RyaW5nW10gbmF0dXJlcz0gZ2V0QWZmZWN0ZWRQcm9qZWN0TmF0dXJlcygpOwotCQlMaXN0IHJlc3VsdD0gbmV3IEFycmF5TGlzdCgpOwotCQlsb2FkRWxlbWVudFBhcnRpY2lwYW50cyhzdGF0dXMsIHJlc3VsdCwgYXJndW1lbnRzLCBuYXR1cmVzLCBzaGFyZWRQYXJ0aWNpcGFudHMpOwotCQlsb2FkRGVyaXZlZFBhcnRpY2lwYW50cyhzdGF0dXMsIHJlc3VsdCwgbmF0dXJlcywgc2hhcmVkUGFydGljaXBhbnRzKTsKLQkJcmV0dXJuIChSZWZhY3RvcmluZ1BhcnRpY2lwYW50W10pcmVzdWx0LnRvQXJyYXkobmV3IFJlZmFjdG9yaW5nUGFydGljaXBhbnRbcmVzdWx0LnNpemUoKV0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRWxlbWVudFBhcnRpY2lwYW50cyhSZWZhY3RvcmluZ1N0YXR1cyBzdGF0dXMsIExpc3QgcmVzdWx0LCBSZW5hbWVBcmd1bWVudHMgYXJndW1lbnRzLCBTdHJpbmdbXSBuYXR1cmVzLCBTaGFyYWJsZVBhcnRpY2lwYW50cyBzaGFyZWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJT2JqZWN0W10gZWxlbWVudHM9IGdldEVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KFBhcnRpY2lwYW50TWFuYWdlci5sb2FkUmVuYW1lUGFydGljaXBhbnRzKHN0YXR1cywgCi0JCQkJdGhpcywgIGVsZW1lbnRzW2ldLAotCQkJCWFyZ3VtZW50cywgbmF0dXJlcywgc2hhcmVkKSkpOwotCQl9Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHNldE5ld0VsZW1lbnROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCQotCQlmTmV3RWxlbWVudE5hbWU9IG5ld05hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXdFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIGZOZXdFbGVtZW50TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRFbGVtZW50TmFtZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZk5ld0VsZW1lbnROYW1lOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci91dGlsL1RleHRDaGFuZ2VDb21wYXRpYmlsaXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3IvdXRpbC9UZXh0Q2hhbmdlQ29tcGF0aWJpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGE3NWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci91dGlsL1RleHRDaGFuZ2VDb21wYXRpYmlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3IudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dENoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0R3JvdXA7Ci0KLS8qKgotICogQSB1dGlsaXR5IGNsYXNzIHRvIHByb3ZpZGUgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBvbGQKLSAqIHRleHQgY2hhbmdlIEFQSSBvZiBhZGRpbmcgdGV4dCBlZGl0cyBkaXJlY3RseSBhbmQgYXV0bwotICogaW5zZXJ0aW5nIHRoZW0gaW50byB0aGUgdHJlZS4KLSAqLwotcHVibGljIGNsYXNzIFRleHRDaGFuZ2VDb21wYXRpYmlsaXR5IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUZXh0RWRpdChUZXh0Q2hhbmdlIGNoYW5nZSwgU3RyaW5nIG5hbWUsIFRleHRFZGl0IGVkaXQpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChjaGFuZ2UpOwotCQlBc3NlcnQuaXNOb3ROdWxsKG5hbWUpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGVkaXQpOwotCQlUZXh0RWRpdCByb290PSBjaGFuZ2UuZ2V0RWRpdCgpOwotCQlpZiAocm9vdCA9PSBudWxsKSB7Ci0JCQlyb290PSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQkJY2hhbmdlLnNldEVkaXQocm9vdCk7Ci0JCX0KLQkJaW5zZXJ0KHJvb3QsIGVkaXQpOwotCQljaGFuZ2UuYWRkVGV4dEVkaXRHcm91cChuZXcgVGV4dEVkaXRHcm91cChuYW1lLCBlZGl0KSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUZXh0RWRpdChUZXh0Q2hhbmdlIGNoYW5nZSwgU3RyaW5nIG5hbWUsIFRleHRFZGl0W10gZWRpdHMpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChjaGFuZ2UpOwotCQlBc3NlcnQuaXNOb3ROdWxsKG5hbWUpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGVkaXRzKTsKLQkJVGV4dEVkaXQgcm9vdD0gY2hhbmdlLmdldEVkaXQoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkgewotCQkJcm9vdD0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJCWNoYW5nZS5zZXRFZGl0KHJvb3QpOwotCQl9Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBlZGl0cy5sZW5ndGg7IGkrKykgewotCQkJaW5zZXJ0KHJvb3QsIGVkaXRzW2ldKTsKLQkJfQotCQljaGFuZ2UuYWRkVGV4dEVkaXRHcm91cChuZXcgVGV4dEVkaXRHcm91cChuYW1lLCBlZGl0cykpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0KFRleHRFZGl0IHBhcmVudCwgVGV4dEVkaXQgZWRpdCkgewotCQlpZiAoIXBhcmVudC5oYXNDaGlsZHJlbigpKSB7Ci0JCQlwYXJlbnQuYWRkQ2hpbGQoZWRpdCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJVGV4dEVkaXRbXSBjaGlsZHJlbj0gcGFyZW50LmdldENoaWxkcmVuKCk7Ci0JCS8vIEZpcnN0IGRpdmUgZG93biB0byBmaW5kIHRoZSByaWdodCBwYXJlbnQuCi0JCWZvciAoaW50IGk9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJVGV4dEVkaXQgY2hpbGQ9IGNoaWxkcmVuW2ldOwotCQkJaWYgKGNvdmVycyhjaGlsZCwgZWRpdCkpIHsKLQkJCQlpbnNlcnQoY2hpbGQsIGVkaXQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkvLyBXZSBoYXZlIHRoZSByaWdodCBwYXJlbnQuIE5vdyBjaGVjayBpZiBzb21lIG9mIHRoZSBjaGlsZHJlbiBoYXZlIHRvCi0JCS8vIGJlIG1vdmVkIHVuZGVyIHRoZSBuZXcgZWRpdCBzaW5jZSBpdCBpcyBjb3ZlcmluZyBpdC4KLQkJZm9yIChpbnQgaT0gY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCVRleHRFZGl0IGNoaWxkPSBjaGlsZHJlbltpXTsKLQkJCWlmIChjb3ZlcnMoZWRpdCwgY2hpbGQpKSB7Ci0JCQkJcGFyZW50LnJlbW92ZUNoaWxkKGkpOwotCQkJCWVkaXQuYWRkQ2hpbGQoY2hpbGQpOwotCQkJfQotCQl9Ci0JCXBhcmVudC5hZGRDaGlsZChlZGl0KTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb3ZlcnMoVGV4dEVkaXQgdGhpc0VkaXQsIFRleHRFZGl0IG90aGVyRWRpdCkgewotCQlpZiAodGhpc0VkaXQuZ2V0TGVuZ3RoKCkgPT0gMCkJLy8gYW4gaW5zZXJ0aW9uIHBvaW50IGNhbid0IGNvdmVyIGFueXRoaW5nCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpbnQgdGhpc09mZnNldD0gdGhpc0VkaXQuZ2V0T2Zmc2V0KCk7Ci0JCWludCB0aGlzRW5kPSB0aGlzRWRpdC5nZXRFeGNsdXNpdmVFbmQoKTsJCi0JCWlmIChvdGhlckVkaXQuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJaW50IG90aGVyT2Zmc2V0PSBvdGhlckVkaXQuZ2V0T2Zmc2V0KCk7Ci0JCQlyZXR1cm4gdGhpc09mZnNldCA8IG90aGVyT2Zmc2V0ICYmIG90aGVyT2Zmc2V0IDwgdGhpc0VuZDsKLQkJfSBlbHNlIHsKLQkJCWludCBvdGhlck9mZnNldD0gb3RoZXJFZGl0LmdldE9mZnNldCgpOwotCQkJaW50IG90aGVyRW5kPSBvdGhlckVkaXQuZ2V0RXhjbHVzaXZlRW5kKCk7Ci0JCQlyZXR1cm4gdGhpc09mZnNldCA8PSBvdGhlck9mZnNldCAmJiBvdGhlckVuZCA8PSB0aGlzRW5kOwotCQl9Ci0JfQkJCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlZmFjdG9yQWN0aW9uR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvUmVmYWN0b3JBY3Rpb25Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzE4ZDA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvUmVmYWN0b3JBY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5hY3Rpb25zLlJlbmFtZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLmFjdGlvbnMuU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb247Ci0KLS8qKgotICogQWN0aW9uIGdyb3VwIHRoYXQgYWRkcyByZWZhY3RvciBhY3Rpb25zIChmb3IgZXhhbXBsZSAnUmVuYW1lJywgJ01vdmUnKSB0byBhCi0gKiBjb250ZXh0IG1lbnUgYW5kIHRoZSBnbG9iYWwgbWVudSBiYXIuCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZmFjdG9yQWN0aW9uR3JvdXAgZXh0ZW5kcyBBY3Rpb25Hcm91cCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9BY3Rpb25BdmFpbGFibGUgZXh0ZW5kcyBBY3Rpb24gewotCQlwdWJsaWMgTm9BY3Rpb25BdmFpbGFibGUoKSB7Ci0JCQlzZXRFbmFibGVkKHRydWUpOwotCQkJc2V0VGV4dChSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlZmFjdG9yQWN0aW9uR3JvdXBfbm9fcmVmYWN0b3JpbmdfYXZhaWxhYmxlKTsgCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQb3AtdXAgbWVudTogbmFtZSBvZiBncm91cCBmb3IgcmVvcmdhbml6ZSBhY3Rpb25zICh2YWx1ZQotCSAqIDxjb2RlPiJncm91cC5yZW9yZ2FuaXplIjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX1JFT1JHQU5JWkUgPSBJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkdST1VQX1JFT1JHQU5JWkU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRU5VX0lEID0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkucmVmYWN0b3JpbmcubWVudSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLnJlZmFjdG9yaW5nLmFjdGlvbnMuUmVuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW5pdEFjdGlvbihTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiBhY3Rpb24sCi0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCi0JCUFzc2VydC5pc05vdE51bGwoc2VsZWN0aW9uKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChhY3Rpb24pOwotCQlhY3Rpb24udXBkYXRlKHNlbGVjdGlvbik7Ci0JCS8vcHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZkVkaXRvckFjdGlvbnM7Ci0KLQlwcml2YXRlIFN0cmluZyBmR3JvdXBOYW1lID0gR1JPVVBfUkVPUkdBTklaRTsKLQkKLQlwcml2YXRlIEFjdGlvbiBmTm9BY3Rpb25BdmFpbGFibGUgPSBuZXcgTm9BY3Rpb25BdmFpbGFibGUoKTsKLQotCXByb3RlY3RlZCBSZW5hbWVBY3Rpb24gZlJlbmFtZUFjdGlvbjsKLQotCXByb3RlY3RlZCBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiBmUmVuYW1lVGFyZ2V0TmFtZXNwYWNlOwotCi0JcHJvdGVjdGVkIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotCQotCXB1YmxpYyBSZWZhY3RvckFjdGlvbkdyb3VwKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJCQotCX0KLQotCXB1YmxpYyBpbnQgYWRkQWN0aW9uKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCAmJiBhY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCWZFZGl0b3JBY3Rpb25zLmFkZChhY3Rpb24pOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFJlZmFjdG9yU3VibWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCi0JCUlNZW51TWFuYWdlciByZWZhY3RvclN1Ym1lbnUgPSBuZXcgTWVudU1hbmFnZXIoUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5SZWZhY3Rvck1lbnVfbGFiZWwsIE1FTlVfSUQpOwotCQlyZWZhY3RvclN1Ym1lbnUuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQkJCQlyZWZhY3Rvck1lbnVTaG93bihtYW5hZ2VyKTsKLQkJCQl9Ci0JCQl9KTsKLQkJcmVmYWN0b3JTdWJtZW51LmFkZChmTm9BY3Rpb25BdmFpbGFibGUpOwotCQkJaWYgKG1lbnUuZmluZChyZWZhY3RvclN1Ym1lbnUuZ2V0SWQoKSkgPT0gbnVsbCkgewotCQkJCWlmIChtZW51LmZpbmQoZkdyb3VwTmFtZSkgPT0gbnVsbCkgewotCQkJCQltZW51LmFkZChyZWZhY3RvclN1Ym1lbnUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1lbnUuYXBwZW5kVG9Hcm91cChmR3JvdXBOYW1lLCByZWZhY3RvclN1Ym1lbnUpOwotCQkJCX0KLQkJCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlQWN0aW9uKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgYWN0aW9uLAotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkKLQkJCXByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihhY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgaW4gQWN0aW9uR3JvdXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCXN1cGVyLmZpbGxBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoUkVOQU1FLCBmUmVuYW1lQWN0aW9uKTsKLQkJcmV0YXJnZXRGaWxlTWVudUFjdGlvbnMoYWN0aW9uQmFycyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZmlsbEFjdGlvbnMoTGlzdCBlbmFibGVkQWN0aW9ucykgewotCQkKLQkJaWYoc2VsZWN0aW9uICE9IG51bGwgJiYgZkVkaXRvckFjdGlvbnMgIT0gbnVsbCl7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmRWRpdG9yQWN0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpb24gYWN0aW9uID0gKEFjdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uKSB7Ci0JCQkJCVNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIHNlbGVjdGlvbkFjdGlvbiA9IChTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbikgYWN0aW9uOwotCQkJCQlzZWxlY3Rpb25BY3Rpb24udXBkYXRlKHNlbGVjdGlvbik7Ci0JCQkJfQotCi0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmRWRpdG9yQWN0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpb24gYWN0aW9uID0gKEFjdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQkJCWVuYWJsZWRBY3Rpb25zLmFkZChhY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIGluIEFjdGlvbkdyb3VwCi0JICovCi0JcHVibGljIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCXN1cGVyLmZpbGxDb250ZXh0TWVudShtZW51KTsKLQkJYWRkUmVmYWN0b3JTdWJtZW51KG1lbnUpOwotCX0KLQotCXByaXZhdGUgaW50IGZpbGxSZWZhY3Rvck1lbnUoSU1lbnVNYW5hZ2VyIHJlZmFjdG9yU3VibWVudSkgewotCQlpbnQgYWRkZWQgPSAwOwotCQlyZWZhY3RvclN1Ym1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoR1JPVVBfUkVPUkdBTklaRSkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmRWRpdG9yQWN0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFjdGlvbiBhY3Rpb24gPSAoQWN0aW9uKSBpdGVyLm5leHQoKTsKLQkJCWlmIChhY3Rpb24gIT0gbnVsbCAmJiBhY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCQlmRWRpdG9yQWN0aW9ucy5hZGQoYWN0aW9uKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWRkZWQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZmFjdG9yTWVudUhpZGRlbihJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZFZGl0b3JBY3Rpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWN0aW9uIGFjdGlvbiA9IChBY3Rpb24pIGl0ZXIubmV4dCgpOwotCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uKSB7Ci0JCQkJU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24gc2VsZWN0aW9uQWN0aW9uID0gKFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uKSBhY3Rpb247Ci0JCQkJc2VsZWN0aW9uQWN0aW9uLnVwZGF0ZShzZWxlY3Rpb24pOwotCQkJfQotCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmYWN0b3JNZW51U2hvd24oZmluYWwgSU1lbnVNYW5hZ2VyIHJlZmFjdG9yU3VibWVudSkgewotCQkvLyB3ZSBrbm93IHRoYXQgd2UgaGF2ZSBhbiBNZW51TWFuYWdlciBzaW5jZSB3ZSBjcmVhdGVkIGl0IGluCi0JCS8vIGFkZFJlZmFjdG9yU3VibWVudS4KLQkJTWVudSBtZW51ID0gKChNZW51TWFuYWdlcikgcmVmYWN0b3JTdWJtZW51KS5nZXRNZW51KCk7Ci0JCW1lbnUuYWRkTWVudUxpc3RlbmVyKG5ldyBNZW51QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1lbnVIaWRkZW4oTWVudUV2ZW50IGUpIHsKLQkJCQlyZWZhY3Rvck1lbnVIaWRkZW4ocmVmYWN0b3JTdWJtZW51KTsKLQkJCX0KLQkJfSk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZkVkaXRvckFjdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpb24gYWN0aW9uID0gKEFjdGlvbikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24pIHsKLQkJCQlTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiBzZWxlY3Rpb25BY3Rpb24gPSAoU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24pIGFjdGlvbjsKLQkJCQlzZWxlY3Rpb25BY3Rpb24udXBkYXRlKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQkJcmVmYWN0b3JTdWJtZW51LnJlbW92ZUFsbCgpOwotCQlpZiAoZmlsbFJlZmFjdG9yTWVudShyZWZhY3RvclN1Ym1lbnUpID09IDApCi0JCQlyZWZhY3RvclN1Ym1lbnUuYWRkKGZOb0FjdGlvbkF2YWlsYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0YXJnZXRzIHRoZSBGaWxlIGFjdGlvbnMgd2l0aCB0aGUgY29ycmVzcG9uZGluZyByZWZhY3RvcmluZyBhY3Rpb25zLgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25CYXJzCi0JICogICAgICAgICAgICB0aGUgYWN0aW9uIGJhciB0byByZWdpc3RlciB0aGUgbW92ZSBhbmQgcmVuYW1lIGFjdGlvbiB3aXRoCi0JICovCi0JcHVibGljIHZvaWQgcmV0YXJnZXRGaWxlTWVudUFjdGlvbnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5SRU5BTUUuZ2V0SWQoKSwKLQkJCQlmUmVuYW1lQWN0aW9uKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZWZhY3Rvckdyb3VwQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvUmVmYWN0b3JHcm91cEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YzU2NzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZWZhY3Rvckdyb3VwQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZmFjdG9yR3JvdXBBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSwgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJTWVudUNyZWF0b3IgewotCi0JcHJvdGVjdGVkIElTZWxlY3Rpb24gZlNlbGVjdGlvbjsKLQlwcml2YXRlIElBY3Rpb24gZkRlbGVnYXRlQWN0aW9uOwotCS8vIHdoZXRoZXIgdG8gcmUtZmlsbCB0aGUgbWVudSAocmVzZXQgb24gc2VsZWN0aW9uIGNoYW5nZSkKLQlwcml2YXRlIGJvb2xlYW4gZkZpbGxNZW51ID0gdHJ1ZTsKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhcnQgd29ya2JlbmNoUGFydDsgCi0JcHJvdGVjdGVkIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotCQotCi0JcHVibGljIFJlZmFjdG9yR3JvdXBBY3Rpb25EZWxlZ2F0ZSgpIHsKLQotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlI3NldEFjdGl2ZVBhcnQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJd29ya2JlbmNoUGFydCA9IHRhcmdldFBhcnQ7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3IjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yI2dldE1lbnUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCkKLQkgKi8KLQlwdWJsaWMgTWVudSBnZXRNZW51KENvbnRyb2wgcGFyZW50KSB7Ci0JCS8vIG5ldmVyIGNhbGxlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvciNnZXRNZW51KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnUpCi0JICovCi0JcHVibGljIE1lbnUgZ2V0TWVudShNZW51IHBhcmVudCkgewotCQkvL0NyZWF0ZSB0aGUgbmV3IG1lbnUuIFRoZSBtZW51IHdpbGwgZ2V0IGZpbGxlZCB3aGVuIGl0IGlzIGFib3V0IHRvIGJlIHNob3duLiBzZWUgZmlsbE1lbnUoTWVudSkuCi0JCU1lbnUgbWVudSA9IG5ldyBNZW51KHBhcmVudCk7Ci0JCS8qKgotCQkgKiBBZGQgbGlzdGVuZXIgdG8gcmVwb3B1bGF0ZSB0aGUgbWVudSBlYWNoIHRpbWUKLQkJICogaXQgaXMgc2hvd24gYmVjYXVzZSBNZW51TWFuYWdlci51cGRhdGUoYm9vbGVhbiwgYm9vbGVhbikgCi0JCSAqIGRvZXNuJ3QgZGlzcG9zZSBwdWxsZG93biBBY3Rpb25Db250cmlidXRpb24gaXRlbXMgZm9yIGVhY2ggcG9wdXAgbWVudS4KLQkJICovCi0JCW1lbnUuYWRkTWVudUxpc3RlbmVyKG5ldyBNZW51QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1lbnVTaG93bihNZW51RXZlbnQgZSkgewotCQkJCWlmIChmRmlsbE1lbnUpIHsKLQkJCQkJTWVudSBtID0gKE1lbnUpZS53aWRnZXQ7Ci0JCQkJCU1lbnVJdGVtW10gaXRlbXMgPSBtLmdldEl0ZW1zKCk7Ci0JCQkJCWZvciAoaW50IGk9MDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpdGVtc1tpXS5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQkJZmlsbE1lbnUobSk7Ci0JCQkJCWZGaWxsTWVudSA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBtZW51OwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQkvLyBOZXZlciBjYWxsZWQgYmVjYXVzZSB3ZSBiZWNvbWUgYSBtZW51LgotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlmRGVsZWdhdGVBY3Rpb24gPSBhY3Rpb247Ci0JCXVwZGF0ZVdpdGgoc2VsZWN0aW9uKTsKLQkJCi0JfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJd29ya2JlbmNoUGFydCA9IHRhcmdldEVkaXRvcjsKLQkJZkRlbGVnYXRlQWN0aW9uID0gYWN0aW9uOwotCQlpZiAodGFyZ2V0RWRpdG9yICE9IG51bGwgJiYgdGFyZ2V0RWRpdG9yLmdldEVkaXRvclNpdGUoKSAhPSBudWxsICYmIHRhcmdldEVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSAhPSBudWxsKSB7Ci0JCQl1cGRhdGVXaXRoKHRhcmdldEVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQkJCi0JfQotICAgIAotCXB1YmxpYyB2b2lkIHVwZGF0ZVdpdGgoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZlNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJaWYgKGZEZWxlZ2F0ZUFjdGlvbiAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGVuYWJsZSA9IGZhbHNlOwotCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQkJCS8vaWYgKCgoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQllbmFibGUgPSB0cnVlOwotCQkJCQkvL30KLQkJCQl9Ci0JCQkJZWxzZSBpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiApewotCQkJCQllbmFibGUgPSAhc2VsZWN0aW9uLmlzRW1wdHkoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBlbmFibGUgYWN0aW9uCi0JCQlmRGVsZWdhdGVBY3Rpb24uc2V0RW5hYmxlZChlbmFibGUpOwotCQkJCi0JCQkvLyBmaWxsIHN1Ym1lbnUKLQkJCWZGaWxsTWVudSA9IHRydWU7Ci0JCQlmRGVsZWdhdGVBY3Rpb24uc2V0TWVudUNyZWF0b3IodGhpcyk7Ci0JCQkKLQkJCQotCQl9Ci0JCQotCX0KLQkKLQkKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmaWxsTWVudShNZW51IG1lbnUpOwotCQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZWZhY3Rvckdyb3VwU3ViTWVudS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZWZhY3Rvckdyb3VwU3ViTWVudS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Nzc4MGUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvUmVmYWN0b3JHcm91cFN1Yk1lbnUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkNvbXBvdW5kQ29udHJpYnV0aW9uSXRlbTsKLQotcHVibGljIGNsYXNzIFJlZmFjdG9yR3JvdXBTdWJNZW51IGV4dGVuZHMgQ29tcG91bmRDb250cmlidXRpb25JdGVtIHsKLQotCVJlZmFjdG9yQWN0aW9uR3JvdXAgZlJlZmFjdG9yTWVudUdyb3VwOwotCQotCi0JcHVibGljIFJlZmFjdG9yR3JvdXBTdWJNZW51KFJlZmFjdG9yQWN0aW9uR3JvdXAgcmVmYWN0b3JNZW51R3JvdXApIHsKLQkJc3VwZXIoKTsKLQkJZlJlZmFjdG9yTWVudUdyb3VwID0gcmVmYWN0b3JNZW51R3JvdXA7Ci0JfQotCi0JcHVibGljIFJlZmFjdG9yR3JvdXBTdWJNZW51KFN0cmluZyBpZCkgewotCQlzdXBlcihpZCk7Ci0JfQotCi0JcHJvdGVjdGVkIElDb250cmlidXRpb25JdGVtW10gZ2V0Q29udHJpYnV0aW9uSXRlbXMoKSB7Ci0JCSAgQXJyYXlMaXN0IGFjdGlvbnNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkgIEFycmF5TGlzdCBjb250cmliTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJICBmUmVmYWN0b3JNZW51R3JvdXAuZmlsbEFjdGlvbnMoYWN0aW9uc0xpc3QpOwotCSAgICAgICAgIAotCSAgICAgICAgaWYgKGFjdGlvbnNMaXN0ICE9IG51bGwgJiYgIWFjdGlvbnNMaXN0LmlzRW1wdHkoKSkgewotCSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGlvbnNMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCSAgICAgCQkJSUFjdGlvbiBhY3Rpb24gPSAoSUFjdGlvbikgaXRlci5uZXh0KCk7Ci0JICAgICAJCQljb250cmliTGlzdC5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKSk7Ci0JICAgICAJCX0KLQkgICAgICAgIH0gZWxzZSB7Ci0JICAgICAgICAgICAgQWN0aW9uIGR1bW15QWN0aW9uID0gbmV3IEFjdGlvbihSZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLlJlZmFjdG9yQWN0aW9uR3JvdXBfbm9fcmVmYWN0b3JpbmdfYXZhaWxhYmxlKSB7Ci0JICAgICAgICAgICAgICAgIC8vIGR1bW15IGlubmVyIGNsYXNzOyBubyBtZXRob2RzCi0JICAgICAgICAgICAgfTsKLQkgICAgICAgICAgICBkdW1teUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkgICAgICAgICAgICBjb250cmliTGlzdC5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oZHVtbXlBY3Rpb24pKTsKLQkgICAgICAgIH0KLQkgICAgICAgIHJldHVybiAoSUNvbnRyaWJ1dGlvbkl0ZW1bXSkgY29udHJpYkxpc3QudG9BcnJheShuZXcgSUNvbnRyaWJ1dGlvbkl0ZW1bY29udHJpYkxpc3Quc2l6ZSgpXSk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvUmVmYWN0b3JpbmdXaXphcmRNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYWM1NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9SZWZhY3RvcmluZ1dpemFyZE1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIFJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMgIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRT0gIm9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkLm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWZhY3Rvck1lbnVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVmYWN0b3JBY3Rpb25Hcm91cF9ub19yZWZhY3RvcmluZ19hdmFpbGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVBY3Rpb25fcmVuYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUFjdGlvbl91bmF2YWlsYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVBY3Rpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZUlucHV0V2l6YXJkUGFnZV9uZXdfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVSZWZhY3RvcmluZ1dpemFyZF9pbnRlcm5hbF9lcnJvcjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVUYXJnZXROYW1lc3BhY2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVhTREVsZW1lbnRBY3Rpb25fZXhjZXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVhTREVsZW1lbnRBY3Rpb25fbm90X2F2YWlsYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVYU0RFbGVtZW50QWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVTdXBwb3J0X2RpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVTdXBwb3J0X25vdF9hdmFpbGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVDb21wb25lbnRXaXphcmRfZGVmYXVsdFBhZ2VUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVDb21wb25lbnRXaXphcmRfaW5wdXRQYWdlX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lSW5wdXRXaXphcmRQYWdlX3VwZGF0ZV9yZWZlcmVuY2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTRENvbXBvbmVudFJlbmFtZUNoYW5nZV9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTRENvbXBvbmVudFJlbmFtZUNoYW5nZV9SZW5hbWluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZVJlbmFtZVBhcnRpY2lwYW50X2NvbXBvc2l0ZUNoYW5nZU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lUmVzb3VyY2VDaGFuZ2VfcmVuYW1lX3Jlc291cmNlX3JlZmVyZW5jZV9jaGFuZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNEUmVuYW1lUmVzb3VyY2VDaGFuZ2VfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVSZXNvdXJjZVJlZmFjdG9yaW5nX0ludGVybmFsX0Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVJlc291cmNlUmVmYWN0b3JpbmdfYWxyZWFkX2V4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVSZXNvdXJjZVJlZmFjdG9yaW5nX2ludmFsaWROYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbmFtZVJlc291cmNlUHJvY2Vzc29yX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFrZUFub255bW91c1R5cGVHbG9iYWxBY3Rpb25fdGV4dDsgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFrZUxvY2FsRWxlbWVudEdsb2JhbEFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTRENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50X0NvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudF9Db21wb25lbnRfUmVmYWN0b3JpbmdfdXBkYXRlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVDb21wb25lbnRQcm9jZXNzb3JfQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yX0NvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVfZGVjbGF0YXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yX0NvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVfcmVmZXJlbmNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhTRENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50X3hzZF9jb21wb25lbnRfcmVuYW1lX3BhcnRpY2lwYW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTRExDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudF93c2RsX2NvbXBvbmVudF9yZW5hbWVfcGFydGljaXBhbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzb3VyY2VSZW5hbWVQYXJ0aWNpcGFudF9GaWxlX1JlbmFtZV91cGRhdGVfcmVmZXJlbmNlOwotCi0KLQlwcml2YXRlIFJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFJlZmFjdG9yaW5nV2l6YXJkTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvUmVuYW1lSW5wdXRXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlbmFtZUlucHV0V2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGJmMzA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvUmVuYW1lSW5wdXRXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLndpemFyZDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3JpbmcuVXNlcklucHV0V2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5YU0RFZGl0b3JDU0hlbHBJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5JUmVmZXJlbmNlVXBkYXRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5SZWZhY3RvcmluZ01lc3NhZ2VzOwotCi0vKioKLSAqIEBhdXRob3IgZWJlbGlzYXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW5hbWVJbnB1dFdpemFyZFBhZ2UgIGV4dGVuZHMgVXNlcklucHV0V2l6YXJkUGFnZXsKLQlwcml2YXRlIFN0cmluZyBmSW5pdGlhbFZhbHVlOwotCXByaXZhdGUgVGV4dCBmVGV4dEZpZWxkOwotCXByaXZhdGUgQnV0dG9uIGZVcGRhdGVSZWZlcmVuY2VzOwotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdGV4dCBpbnB1dCBwYWdlLgotCSAqIEBwYXJhbSBpc0xhc3RVc2VyUGFnZSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHBhZ2UgaXMgdGhlIHdpemFyZCdzIGxhc3QKLQkgKiAgdXNlciBpbnB1dCBwYWdlLiBPdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBSZW5hbWVJbnB1dFdpemFyZFBhZ2UoU3RyaW5nIGRlc2NyaXB0aW9uLCBib29sZWFuIGlzTGFzdFVzZXJQYWdlKSB7Ci0JCXRoaXMoZGVzY3JpcHRpb24sIGlzTGFzdFVzZXJQYWdlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB0ZXh0IGlucHV0IHBhZ2UuCi0JICogQHBhcmFtIGlzTGFzdFVzZXJQYWdlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcGFnZSBpcyB0aGUgd2l6YXJkJ3MgbGFzdAotCSAqICB1c2VyIGlucHV0IHBhZ2UuIE90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBAcGFyYW0gaW5pdGlhbFZhbHVlIHRoZSBpbml0aWFsIHZhbHVlCi0JICovCi0JcHVibGljIFJlbmFtZUlucHV0V2l6YXJkUGFnZShTdHJpbmcgZGVzY3JpcHRpb24sIGJvb2xlYW4gaXNMYXN0VXNlclBhZ2UsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkgICAgc3VwZXIoIlJlbmFtZUlucHV0V2l6YXJkUGFnZSIpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGluaXRpYWxWYWx1ZSk7Ci0JCXNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJZkluaXRpYWxWYWx1ZT0gaW5pdGlhbFZhbHVlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGluaXRpYWwgaW5wdXQgaXMgdmFsaWQuIFR5cGljYWxseSBpdCBpcyBub3QsIGJlY2F1c2UgdGhlIAotCSAqIHVzZXIgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGUuZy4gYSBuZXcgdHlwZSBuYW1lIGV0Yy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGUgaW5wdXQgcHJvdmlkZWQgYXQgaW5pdGlhbGl6YXRpb24gaXMgdmFsaWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luaXRpYWxJbnB1dFZhbGlkKCl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIGFuIGVtcHR5IHN0cmluZyBpcyBhIHZhbGlkIGlucHV0LiBUeXBpY2FsbHkgaXQgaXMgbm90LCBiZWNhdXNlIAotCSAqIHRoZSB1c2VyIGlzIHJlcXVpcmVkIHRvIHByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBlLmcuIGEgbmV3IHR5cGUgbmFtZSBldGMuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZmYgYW4gZW1wdHkgc3RyaW5nIGlzIHZhbGlkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbXB0eUlucHV0VmFsaWQoKXsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IG9mIHRoZSB0ZXh0IGlucHV0IGZpZWxkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgb2YgdGhlIHRleHQgaW5wdXQgZmllbGQuIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiBub3QgdGV4dCBpbnB1dCBmaWVsZCBoYXMgYmVlbiBjcmVhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUZXh0KCkgewotCQlpZiAoZlRleHRGaWVsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBmVGV4dEZpZWxkLmdldFRleHQoKTsJCi0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIG5ldyB0ZXh0IGZvciB0aGUgdGV4dCBmaWVsZC4gRG9lcyBub3RoaW5nIGlmIHRoZSB0ZXh0IGZpZWxkIGhhcyBub3QgYmVlbiBjcmVhdGVkLgotCSAqIEBwYXJhbSB0ZXh0IHRoZSBuZXcgdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmVGV4dEZpZWxkID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZUZXh0RmllbGQuc2V0VGV4dCh0ZXh0KTsKLQl9Ci0JCi0JLyoqCi0JICogUGVyZm9ybXMgaW5wdXQgdmFsaWRhdGlvbi4gUmV0dXJucyBhIDxjb2RlPlJlZmFjdG9yaW5nU3RhdHVzPC9jb2RlPiB3aGljaAotCSAqIGRlc2NyaWJlcyB0aGUgcmVzdWx0IG9mIGlucHV0IHZhbGlkYXRpb24uIDxjb2RlPk51bGw8Y29kZT4gaXMgaW50ZXJwcmV0ZWQKLQkgKiBhcyBubyBlcnJvci4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVmYWN0b3JpbmdTdGF0dXMgdmFsaWRhdGVUZXh0RmllbGQoU3RyaW5nIHRleHQpewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRleHQgY3JlYXRlVGV4dElucHV0RmllbGQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlVGV4dElucHV0RmllbGQocGFyZW50LCBTV1QuQk9SREVSKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRleHQgY3JlYXRlVGV4dElucHV0RmllbGQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCWZUZXh0RmllbGQ9IG5ldyBUZXh0KHBhcmVudCwgc3R5bGUpOwotCQlmVGV4dEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXRleHRNb2RpZmllZChnZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGZUZXh0RmllbGQsIFhTREVkaXRvckNTSGVscElkcy5SRU5BTUVfTkVXX05BTUUpOwotCQlmVGV4dEZpZWxkLnNldFRleHQoZkluaXRpYWxWYWx1ZSk7Ci0JCXJldHVybiBmVGV4dEZpZWxkOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgdGhlIHBhZ2UncyBzdGF0ZSBhbmQgaXNzdWVzIGEgY29ycmVzcG9uZGluZyBlcnJvciBtZXNzYWdlLiBUaGUgcGFnZSB2YWxpZGF0aW9uCi0JICogaXMgY29tcHV0ZWQgYnkgY2FsbGluZyA8Y29kZT52YWxpZGF0ZVBhZ2U8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRleHRNb2RpZmllZChTdHJpbmcgdGV4dCkgewkKLQkJaWYgKCEgaXNFbXB0eUlucHV0VmFsaWQoKSAmJiB0ZXh0LmVxdWFscygiIikpeyAvLyROT04tTkxTLTEkCi0JCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJcmVzdG9yZU1lc3NhZ2UoKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKCEgaXNJbml0aWFsSW5wdXRWYWxpZCgpKSAmJiB0ZXh0LmVxdWFscyhmSW5pdGlhbFZhbHVlKSl7Ci0JCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJcmVzdG9yZU1lc3NhZ2UoKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlVGV4dEZpZWxkKHRleHQpKTsKLQkJCi0vLwkJIFRPRE86IGVuYWJsZSBwcmV2aWV3IGluIE00Ci0JCWdldFJlZmFjdG9yaW5nV2l6YXJkKCkuc2V0Rm9yY2VQcmV2aWV3UmV2aWV3KGZhbHNlKTsKLQkJZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQotCX0KLQkKLQkvKioKLQkgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBpZiB0aGV5IHdhbnQgdG8gcmVzdG9yZSB0aGUgbWVzc2FnZSBkaWZmZXJlbnRseS4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGNhbGxzIDxjb2RlPnNldE1lc3NhZ2UobnVsbCk8L2NvZGU+LCB3aGljaCBjbGVhcnMgdGhlIG1lc3NhZ2UgCi0JICogdGh1cyBleHBvc2luZyB0aGUgZGVzY3JpcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZU1lc3NhZ2UoKXsKLQkJc2V0TWVzc2FnZShudWxsKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBpbiBJRGlhbG9nUGFnZQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZUZXh0RmllbGQ9IG51bGw7CQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIGluIFdpemFyZFBhZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlpZiAodmlzaWJsZSkgewotCQkJdGV4dE1vZGlmaWVkKGdldFRleHQoKSk7Ci0JCX0KLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJaWYgKHZpc2libGUgJiYgZlRleHRGaWVsZCAhPSBudWxsKSB7Ci0JCQlmVGV4dEZpZWxkLnNldEZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgc3VwZXJDb21wb3NpdGU9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXNldENvbnRyb2woc3VwZXJDb21wb3NpdGUpOwotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMoc3VwZXJDb21wb3NpdGUpOwotCQkKLQkJc3VwZXJDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlPSBuZXcgQ29tcG9zaXRlKHN1cGVyQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsJCi0JCQotCQlHcmlkTGF5b3V0IGxheW91dD0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnM9IDI7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmc9IDg7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCQotCQlMYWJlbCBsYWJlbD0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KGdldExhYmVsVGV4dCgpKTsKLQkJCi0JCVRleHQgdGV4dD0gY3JlYXRlVGV4dElucHV0RmllbGQoY29tcG9zaXRlKTsKLQkJdGV4dC5zZWxlY3RBbGwoKTsKLQkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQ9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyNSk7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0ZXh0LCBYU0RFZGl0b3JDU0hlbHBJZHMuUkVOQU1FX05FV19OQU1FKTsKLSAgICAKLQkJYWRkT3B0aW9uYWxVcGRhdGVSZWZlcmVuY2VzQ2hlY2tib3goc3VwZXJDb21wb3NpdGUpOwotCQlnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlnZXRSZWZhY3RvcmluZ1dpemFyZCgpLnNldEZvcmNlUHJldmlld1JldmlldyhmYWxzZSk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHN1cGVyQ29tcG9zaXRlKTsKLQkJLy9Xb3JrYmVuY2hIZWxwLnNldEhlbHAoZ2V0Q29udHJvbCgpLCBmSGVscENvbnRleHRJRCk7Ci0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQnV0dG9uIGNyZWF0ZUNoZWNrYm94KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0aXRsZSwgYm9vbGVhbiB2YWx1ZSkgewotCQlCdXR0b24gY2hlY2tCb3g9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQljaGVja0JveC5zZXRUZXh0KHRpdGxlKTsKLQkJY2hlY2tCb3guc2V0U2VsZWN0aW9uKHZhbHVlKTsKLQkJcmV0dXJuIGNoZWNrQm94OwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRPcHRpb25hbFVwZGF0ZVJlZmVyZW5jZXNDaGVja2JveChDb21wb3NpdGUgcmVzdWx0KSB7Ci0KLQkJZmluYWwgSVJlZmVyZW5jZVVwZGF0aW5nIHJlZj0gKElSZWZlcmVuY2VVcGRhdGluZylnZXRSZWZhY3RvcmluZygpLmdldEFkYXB0ZXIoSVJlZmVyZW5jZVVwZGF0aW5nLmNsYXNzKTsKLQkJaWYgKHJlZiA9PSBudWxsIHx8ICFyZWYuY2FuRW5hYmxlVXBkYXRlUmVmZXJlbmNlcygpKQkKLQkJCXJldHVybjsKLQkJU3RyaW5nIHRpdGxlPSBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lSW5wdXRXaXphcmRQYWdlLnVwZGF0ZV9yZWZlcmVuY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBkZWZhdWx0VmFsdWU9IHRydWU7IAotCQlmVXBkYXRlUmVmZXJlbmNlcz0gY3JlYXRlQ2hlY2tib3gocmVzdWx0LCB0aXRsZSwgZGVmYXVsdFZhbHVlKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGZVcGRhdGVSZWZlcmVuY2VzLCBYU0RFZGl0b3JDU0hlbHBJZHMuUkVOQU1FX1VQREFURV9SRUZFUkVOQ0VTKTsKLQkJcmVmLnNldFVwZGF0ZVJlZmVyZW5jZXMoZlVwZGF0ZVJlZmVyZW5jZXMuZ2V0U2VsZWN0aW9uKCkpOwotCQlmVXBkYXRlUmVmZXJlbmNlcy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgIAkJcmVmLnNldFVwZGF0ZVJlZmVyZW5jZXMoZlVwZGF0ZVJlZmVyZW5jZXMuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsJCQkJCi0JCWZVcGRhdGVSZWZlcmVuY2VzLnNldEVuYWJsZWQodHJ1ZSk7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCXJldHVybiBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lSW5wdXRXaXphcmRQYWdlLm5ld19uYW1lIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtcmVmYWN0b3Ivb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9yZWZhY3Rvci93aXphcmQvUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI0OTc3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL1JlbmFtZVJlZmFjdG9yaW5nV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucmVmYWN0b3Iud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnJlZmFjdG9yLklOYW1lVXBkYXRpbmc7Ci0KLXB1YmxpYyBjbGFzcyBSZW5hbWVSZWZhY3RvcmluZ1dpemFyZCBleHRlbmRzIFJlZmFjdG9yaW5nV2l6YXJkIHsKLQkKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBmSW5wdXRQYWdlRGVzY3JpcHRpb247Ci0KLQlwcml2YXRlIGZpbmFsIEltYWdlRGVzY3JpcHRvciBmSW5wdXRQYWdlSW1hZ2VEZXNjcmlwdG9yOwotCQotCXB1YmxpYyBSZW5hbWVSZWZhY3RvcmluZ1dpemFyZChSZWZhY3RvcmluZyByZWZhY3RvcmluZywgU3RyaW5nIGRlZmF1bHRQYWdlVGl0bGUsIFN0cmluZyBpbnB1dFBhZ2VEZXNjcmlwdGlvbiwgCi0JCQlJbWFnZURlc2NyaXB0b3IgaW5wdXRQYWdlSW1hZ2VEZXNjcmlwdG9yKSB7Ci0JCXN1cGVyKHJlZmFjdG9yaW5nLCBESUFMT0dfQkFTRURfVVNFUl9JTlRFUkZBQ0UpOwotCQlzZXREZWZhdWx0UGFnZVRpdGxlKGRlZmF1bHRQYWdlVGl0bGUpOwotICAgIAlmSW5wdXRQYWdlRGVzY3JpcHRpb249IGlucHV0UGFnZURlc2NyaXB0aW9uOwotCQlmSW5wdXRQYWdlSW1hZ2VEZXNjcmlwdG9yPSBpbnB1dFBhZ2VJbWFnZURlc2NyaXB0b3I7Ci0KLQl9Ci0KLQkvKiBub24gamF2YS1kb2MKLQkgKiBAc2VlIFJlZmFjdG9yaW5nV2l6YXJkI2FkZFVzZXJJbnB1dFBhZ2VzCi0JICovIAotCXByb3RlY3RlZCB2b2lkIGFkZFVzZXJJbnB1dFBhZ2VzKCkgewotCQlTdHJpbmcgaW5pdGlhbFNldHRpbmc9IGdldFByb2Nlc3NvcigpLmdldEN1cnJlbnRFbGVtZW50TmFtZSgpOwotCQlSZW5hbWVJbnB1dFdpemFyZFBhZ2UgaW5wdXRQYWdlPSBjcmVhdGVJbnB1dFBhZ2UoZklucHV0UGFnZURlc2NyaXB0aW9uLCBpbml0aWFsU2V0dGluZyk7Ci0JCWlucHV0UGFnZS5zZXRJbWFnZURlc2NyaXB0b3IoZklucHV0UGFnZUltYWdlRGVzY3JpcHRvcik7Ci0JCWFkZFBhZ2UoaW5wdXRQYWdlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU5hbWVVcGRhdGluZyBnZXRQcm9jZXNzb3IoKSB7Ci0JCQotCQlyZXR1cm4gKElOYW1lVXBkYXRpbmcpZ2V0UmVmYWN0b3JpbmcoKS5nZXRBZGFwdGVyKElOYW1lVXBkYXRpbmcuY2xhc3MpOwkKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIFJlbmFtZUlucHV0V2l6YXJkUGFnZSBjcmVhdGVJbnB1dFBhZ2UoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBpbml0aWFsU2V0dGluZykgewotCQlyZXR1cm4gbmV3IFJlbmFtZUlucHV0V2l6YXJkUGFnZShtZXNzYWdlLCB0cnVlLCBpbml0aWFsU2V0dGluZykgewotCQkJcHJvdGVjdGVkIFJlZmFjdG9yaW5nU3RhdHVzIHZhbGlkYXRlVGV4dEZpZWxkKFN0cmluZyB0ZXh0KSB7Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTmV3TmFtZSh0ZXh0KTsKLQkJCX0JCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBSZWZhY3RvcmluZ1N0YXR1cyB2YWxpZGF0ZU5ld05hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJSU5hbWVVcGRhdGluZyByZWY9IGdldFByb2Nlc3NvcigpOwotCQlyZWYuc2V0TmV3RWxlbWVudE5hbWUobmV3TmFtZSk7Ci0vLwkJdHJ5ewotCQkJcmV0dXJuIHJlZi5jaGVja05ld0VsZW1lbnROYW1lKG5ld05hbWUpOwotLy8JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7Ci0vLwkJCS8vWFhYOiBzaG91bGQgbG9nIHRoZSBleGNlcHRpb24KLS8vCQkJU3RyaW5nIG1zZz0gZS5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/ICIiOiBlLmdldE1lc3NhZ2UoKTsgLy8kTk9OLU5MUy0xJAotLy8JCQlyZXR1cm4gUmVmYWN0b3JpbmdTdGF0dXMuY3JlYXRlRmF0YWxFcnJvclN0YXR1cyhSZWZhY3RvcmluZ01lc3NhZ2VzLmdldEZvcm1hdHRlZFN0cmluZygiUmVuYW1lUmVmYWN0b3JpbmdXaXphcmQuaW50ZXJuYWxfZXJyb3IiLCBtc2cpKTsvLyROT04tTkxTLTEkCi0vLwkJfQkKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXJlZmFjdG9yL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvcmVmYWN0b3Ivd2l6YXJkL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NmYyOWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1yZWZhY3Rvci9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3JlZmFjdG9yL3dpemFyZC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotUmVmYWN0b3JNZW51X2xhYmVsPVJlZmFjdG9yCi1SZWZhY3RvckFjdGlvbkdyb3VwX25vX3JlZmFjdG9yaW5nX2F2YWlsYWJsZT08bm8gcmVmYWN0b3JpbmcgYXZhaWxhYmxlPgotCi1SZW5hbWVBY3Rpb25fcmVuYW1lPVJlbmFtZQotUmVuYW1lQWN0aW9uX3VuYXZhaWxhYmxlPU9wZXJhdGlvbiB1bmF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uXG5TZWxlY3QgYSAuLi4uCi1SZW5hbWVBY3Rpb25fdGV4dD1SZSZuYW1lLi4uCi0KLVJlbmFtZUlucHV0V2l6YXJkUGFnZV9uZXdfbmFtZT0gJk5ldyBuYW1lOgotUmVuYW1lUmVmYWN0b3JpbmdXaXphcmRfaW50ZXJuYWxfZXJyb3I9IEludGVybmFsIGVycm9yIGR1cmluZyBuYW1lIGNoZWNraW5nOiB7MH0KLQotCi1SZW5hbWVYU0RFbGVtZW50QWN0aW9uX2V4Y2VwdGlvbj1VbmV4cGVjdGVkIGV4Y2VwdGlvbiBvY2N1cnJlZC4gU2VlIGxvZyBmb3IgZGV0YWlscwotUmVuYW1lWFNERWxlbWVudEFjdGlvbl9ub3RfYXZhaWxhYmxlPU9wZXJhdGlvbiB1bmF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24uXG5TZWxlY3QgYSBYU0QgcHJvamVjdCwgZm9sZGVyLCByZXNvdXJjZSwgZmlsZSwgYXR0cmlidXRlIGRlY2xhcmF0aW9ucywgIGF0dHJpYnV0ZSBncm91cCBkZWZpbml0aW9ucywgY29tcGxleCB0eXBlIGRlZmluaXRpb25zLCBlbGVtZW50IGRlY2xhcmF0aW9ucywgaWRlbnRpdHkgY29uc3RyYWludCBkZWZpbml0aW9ucywgbW9kZWwgZ3JvdXBzIGRlZmluaXRpb25zLCBub3RhdGlvbiBkZWNsYXJhdGlvbnMsIG9yIHNpbXBsZSB0eXBlIGRlZmluaXRpb25zLgotUmVuYW1lWFNERWxlbWVudEFjdGlvbl9uYW1lPVJlbmFtZQotCi0KLVJlbmFtZVN1cHBvcnRfZGlhbG9nX3RpdGxlPVJlbmFtZQotUmVuYW1lU3VwcG9ydF9ub3RfYXZhaWxhYmxlPVJlbmFtZSBzdXBwb3J0IG5vdCBhdmFpbGFibGUKLQotUmVuYW1lQ29tcG9uZW50V2l6YXJkX2RlZmF1bHRQYWdlVGl0bGU9UmVuYW1lIHdpemFyZAotUmVuYW1lQ29tcG9uZW50V2l6YXJkX2lucHV0UGFnZV9kZXNjcmlwdGlvbj1SZW5hbWUgWE1MIFNjaGVtYSBjb21wb25lbnQKLQotUmVuYW1lSW5wdXRXaXphcmRQYWdlX3VwZGF0ZV9yZWZlcmVuY2VzPVVwZGF0ZSByZWZlcmVuY2VzCi1YU0RDb21wb25lbnRSZW5hbWVDaGFuZ2VfbmFtZT1YTUwgU2NoZW1hIGNvbXBvbmVudCByZW5hbWluZyBpbiB7MH06IHsxfSB0byB7Mn0KLVhTRENvbXBvbmVudFJlbmFtZUNoYW5nZV9SZW5hbWluZz1SZW5hbWluZy4uLgotUmVzb3VyY2VSZW5hbWVQYXJ0aWNpcGFudF9jb21wb3NpdGVDaGFuZ2VOYW1lPVhTRCBmaWxlIHJlbmFtZSByZWZlcmVuY2VzIHVwZGF0aW5nIGNoYW5nZXMKLVJlbmFtZVJlc291cmNlQ2hhbmdlX3JlbmFtZV9yZXNvdXJjZV9yZWZlcmVuY2VfY2hhbmdlPVJlbmFtaW5nIHJlc291cmNlIG5hbWUgcmVmZXJlbmNlcwotWFNEUmVuYW1lUmVzb3VyY2VDaGFuZ2VfbmFtZT1SZXNvdXJjZSByZW5hbWU6IHswfSB0byB7MX0KLVJlbmFtZVJlc291cmNlUmVmYWN0b3JpbmdfSW50ZXJuYWxfRXJyb3I9SW50ZXJuYWwgZXJyb3IKLVJlbmFtZVJlc291cmNlUmVmYWN0b3JpbmdfYWxyZWFkX2V4aXN0cz1SZXNvdXJjZSBhbHJlYWR5IGV4aXN0Ci1SZW5hbWVSZXNvdXJjZVJlZmFjdG9yaW5nX2ludmFsaWROYW1lPUludmFsaWQgcmVzb3VyY2UgbmFtZQotUmVuYW1lUmVzb3VyY2VQcm9jZXNzb3JfbmFtZT1SZXNvdXJjZSByZW5hbWluZwotTWFrZUFub255bW91c1R5cGVHbG9iYWxBY3Rpb25fdGV4dD1NYWtlIEFub255bW91cyBUeXBlIEdsb2JhbCAKLU1ha2VMb2NhbEVsZW1lbnRHbG9iYWxBY3Rpb25fdGV4dD1NYWtlIExvY2FsIEVsZW1lbnQgR2xvYmFsCi1YU0RDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudF9Db21wb25lbnRfUmVmYWN0b3JpbmdfdXBkYXRlcz1YTUwgU2NoZW1hIHJlZmFjdG9yaW5nIGNoYW5nZXMKLVdTRExDb21wb25lbnRSZW5hbWVQYXJ0aWNpcGFudF9Db21wb25lbnRfUmVmYWN0b3JpbmdfdXBkYXRlcz1XU0RMIFNjaGVtYSByZWZhY3RvcmluZyBjaGFuZ2VzCi1SZW5hbWVDb21wb25lbnRQcm9jZXNzb3JfQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZXM9Q29tcG9uZW50IG5hbWUgcmVmYWN0b3JpbmcgY2hhbmdlcwotUmVuYW1lQ29tcG9uZW50UHJvY2Vzc29yX0NvbXBvbmVudF9SZWZhY3RvcmluZ191cGRhdGVfZGVjbGF0YXRpb249VXBkYXRlIGNvbXBvbmVudCBkZWNsYXJhdGlvbi9kZWZpbml0aW9uCi1SZW5hbWVDb21wb25lbnRQcm9jZXNzb3JfQ29tcG9uZW50X1JlZmFjdG9yaW5nX3VwZGF0ZV9yZWZlcmVuY2U9VXBkYXRlIGNvbXBvbmVudCByZWZlcmVuY2UKLVhTRENvbXBvbmVudFJlbmFtZVBhcnRpY2lwYW50X3hzZF9jb21wb25lbnRfcmVuYW1lX3BhcnRpY2lwYW50PVhTRCBjb21wb25lbnQgcmVuYW1lIHBhcnRpY2lwYW50Ci1XU0RMQ29tcG9uZW50UmVuYW1lUGFydGljaXBhbnRfd3NkbF9jb21wb25lbnRfcmVuYW1lX3BhcnRpY2lwYW50PVdTREwgY29tcG9uZW50IHJlbmFtZSBwYXJ0aWNpcGFudAotUmVzb3VyY2VSZW5hbWVQYXJ0aWNpcGFudF9GaWxlX1JlbmFtZV91cGRhdGVfcmVmZXJlbmNlPUZpbGUgcmVuYW1lIHJlZmFjdG9yaW5nIGNoYW5nZXMKLQotUmVuYW1lVGFyZ2V0TmFtZXNwYWNlX3RleHQ9UmVuYW1lIFRhcmdldCBOYW1lc3BhY2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL0lYU0RTZWFyY2hDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL0lYU0RTZWFyY2hDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM0NjViMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9JWFNEU2VhcmNoQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVhTRFNlYXJjaENvbnN0YW50cyB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MU0NIRU1BX05BTUVTUEFDRSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWFNEX0NPTlRFTlRfVFlQRV9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUueHNkc291cmNlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSAgIFRZUEVfTUVUQV9OQU1FID0gIG5ldyBRdWFsaWZpZWROYW1lIChYTUxTQ0hFTUFfTkFNRVNQQUNFLCAidHlwZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSAgIENPTVBMRVhfVFlQRV9NRVRBX05BTUUgPSAgbmV3IFF1YWxpZmllZE5hbWUgKFhNTFNDSEVNQV9OQU1FU1BBQ0UsICJjb21wbGV4VHlwZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSAgIFNJTVBMRV9UWVBFX01FVEFfTkFNRSA9ICBuZXcgUXVhbGlmaWVkTmFtZSAoWE1MU0NIRU1BX05BTUVTUEFDRSwgInNpbXBsZVR5cGUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFF1YWxpZmllZE5hbWUgICBFTEVNRU5UX01FVEFfTkFNRSA9ICBuZXcgUXVhbGlmaWVkTmFtZSAoWE1MU0NIRU1BX05BTUVTUEFDRSwgImVsZW1lbnQiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFF1YWxpZmllZE5hbWUgICBBVFRSSUJVVEVfTUVUQV9OQU1FID0gIG5ldyBRdWFsaWZpZWROYW1lIChYTUxTQ0hFTUFfTkFNRVNQQUNFLCAiYXR0cmlidXRlIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lICAgQVRUUklCVVRFX0dST1VQX01FVEFfTkFNRSA9ICBuZXcgUXVhbGlmaWVkTmFtZSAoWE1MU0NIRU1BX05BTUVTUEFDRSwgImF0dHJpYnV0ZUdyb3VwIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lICAgR1JPVVBfTUVUQV9OQU1FID0gIG5ldyBRdWFsaWZpZWROYW1lIChYTUxTQ0hFTUFfTkFNRVNQQUNFLCAiZ3JvdXAiKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL1NlYXJjaE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MDc3YTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvU2VhcmNoTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTZWFyY2hNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUU9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnNlYXJjaC5TZWFyY2hNZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTZWFyY2hNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3JvdXBfcmVmZXJlbmNlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfRmluZERlY2xhcmF0aW9uQWN0aW9uX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kRGVjbGFyYXRpb25zSW5Qcm9qZWN0QWN0aW9uX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9GaW5kRGVjbGFyYXRpb25zSW5Xb3JraW5nU2V0QWN0aW9uX2xhYmVsOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgU2VhcmNoTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL1hTRFNlYXJjaENvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9YU0RTZWFyY2hDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTg5YjU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL1hTRFNlYXJjaENvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guQ29tcG9uZW50U2VhcmNoQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5YTUxTZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFhTRFNlYXJjaENvbnRyaWJ1dG9yIGV4dGVuZHMgQ29tcG9uZW50U2VhcmNoQ29udHJpYnV0b3IgIHsKLSAKLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUmVmZXJlbmNlcygpIHsKLQkJcmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCVN0cmluZyBucyA9IElYU0RTZWFyY2hDb25zdGFudHMuWE1MU0NIRU1BX05BTUVTUEFDRTsKLQotCQlMaXN0IHBhdHRlcm5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlwYXR0ZXJucy5hZGQobmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLlJFRl9BVFRSSUJVVEUpKTsKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCBucywgWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5TVUJTVElUVVRJT05HUk9VUF9BVFRSSUJVVEUpKTsKLQkJcmVmZXJlbmNlcy5wdXQoSVhTRFNlYXJjaENvbnN0YW50cy5FTEVNRU5UX01FVEFfTkFNRSwgcGF0dGVybnMpOwotCi0JCXBhdHRlcm5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlwYXR0ZXJucy5hZGQobmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5CQVNFX0FUVFJJQlVURSkpOwotCQlwYXR0ZXJucy5hZGQobmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUpKTsKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCBucywgWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSkpOwotCQlyZWZlcmVuY2VzLnB1dChJWFNEU2VhcmNoQ29uc3RhbnRzLkNPTVBMRVhfVFlQRV9NRVRBX05BTUUsIHBhdHRlcm5zKTsKLQotCQlwYXR0ZXJucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCBucywgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuQkFTRV9BVFRSSUJVVEUpKTsKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCBucywgWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSkpOwotCQlwYXR0ZXJucy5hZGQobmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpKTsKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCBucywgWFNEQ29uc3RhbnRzLlVOSU9OX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuTUVNQkVSVFlQRVNfQVRUUklCVVRFKSk7Ci0JCXBhdHRlcm5zLmFkZChuZXcgWE1MU2VhcmNoUGF0dGVybiggbnMsIFhTRENvbnN0YW50cy5MSVNUX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuSVRFTVRZUEVfQVRUUklCVVRFKSk7Ci0KLQkJcmVmZXJlbmNlcy5wdXQoSVhTRFNlYXJjaENvbnN0YW50cy5TSU1QTEVfVFlQRV9NRVRBX05BTUUsIHBhdHRlcm5zKTsKLQotCQlwYXR0ZXJucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcGF0dGVybnMuYWRkKG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCBucywgWFNEQ29uc3RhbnRzLkdST1VQX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSkpOwotCQlyZWZlcmVuY2VzLnB1dChJWFNEU2VhcmNoQ29uc3RhbnRzLkdST1VQX01FVEFfTkFNRSwgcGF0dGVybnMpOwotCi0JCXBhdHRlcm5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlwYXR0ZXJucy5hZGQobmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCBYU0RDb25zdGFudHMuQVRUUklCVVRFR1JPVVBfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5SRUZfQVRUUklCVVRFKSk7Ci0JCXJlZmVyZW5jZXMucHV0KElYU0RTZWFyY2hDb25zdGFudHMuQVRUUklCVVRFX0dST1VQX01FVEFfTkFNRSwgcGF0dGVybnMpOwotCi0JCXBhdHRlcm5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlwYXR0ZXJucy5hZGQobmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuUkVGX0FUVFJJQlVURSkpOwotCQlyZWZlcmVuY2VzLnB1dChJWFNEU2VhcmNoQ29uc3RhbnRzLkFUVFJJQlVURV9NRVRBX05BTUUsIHBhdHRlcm5zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVjbGFyYXRpb25zKCl7Ci0JCQotCQlkZWNsYXJhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQlTdHJpbmcgbnMgPSBJWFNEU2VhcmNoQ29uc3RhbnRzLlhNTFNDSEVNQV9OQU1FU1BBQ0U7Ci0KLQkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gbmV3IFhNTFNlYXJjaFBhdHRlcm4oIG5zLCBYU0RDb25zdGFudHMuU0NIRU1BX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFKTsKLQkJZGVjbGFyYXRpb25zLnB1dChJWFNEU2VhcmNoQ29uc3RhbnRzLkVMRU1FTlRfTUVUQV9OQU1FLCBwYXR0ZXJuKTsKLQotCQlwYXR0ZXJuID0gbmV3IFhNTFNlYXJjaFBhdHRlcm4obnMsIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFKTsKLQkJZGVjbGFyYXRpb25zLnB1dChJWFNEU2VhcmNoQ29uc3RhbnRzLkNPTVBMRVhfVFlQRV9NRVRBX05BTUUsIHBhdHRlcm4pOwotCi0JCXBhdHRlcm4gPSBuZXcgWE1MU2VhcmNoUGF0dGVybihucywgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSk7Ci0JCWRlY2xhcmF0aW9ucy5wdXQoSVhTRFNlYXJjaENvbnN0YW50cy5TSU1QTEVfVFlQRV9NRVRBX05BTUUsIHBhdHRlcm4pOwotCi0JCXBhdHRlcm4gPSBuZXcgWE1MU2VhcmNoUGF0dGVybihucywgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFKTsKLQkJZGVjbGFyYXRpb25zLnB1dChJWFNEU2VhcmNoQ29uc3RhbnRzLkFUVFJJQlVURV9NRVRBX05BTUUsIHBhdHRlcm4pOwotCi0JCXBhdHRlcm4gPSBuZXcgWE1MU2VhcmNoUGF0dGVybihucywgWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHLCBYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUpOwotCQlkZWNsYXJhdGlvbnMucHV0KElYU0RTZWFyY2hDb25zdGFudHMuQVRUUklCVVRFX0dST1VQX01FVEFfTkFNRSwgcGF0dGVybik7Ci0KLQkJcGF0dGVybiA9IG5ldyBYTUxTZWFyY2hQYXR0ZXJuKG5zLCBYU0RDb25zdGFudHMuR1JPVVBfRUxFTUVOVF9UQUcsIFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSk7Ci0JCWRlY2xhcmF0aW9ucy5wdXQoSVhTRFNlYXJjaENvbnN0YW50cy5HUk9VUF9NRVRBX05BTUUsIHBhdHRlcm4pOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVN1cHBvcnRlZE5hbWVzcGFjZXMoKSB7Ci0JCW5hbWVzcGFjZXMgPSBuZXcgU3RyaW5nW117IElYU0RTZWFyY2hDb25zdGFudHMuWE1MU0NIRU1BX05BTUVTUEFDRX07Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL1hTRFNlYXJjaFBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9YU0RTZWFyY2hQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDUxODA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL1hTRFNlYXJjaFBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLkNvbXBvbmVudFNlYXJjaENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLlhNTFNlYXJjaFBhcnRpY2lwYW50OwotCi1wdWJsaWMgY2xhc3MgWFNEU2VhcmNoUGFydGljaXBhbnQgZXh0ZW5kcyBYTUxTZWFyY2hQYXJ0aWNpcGFudCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzZC5zZWFyY2guWFNEU2VhcmNoUGFydGljaXBhbnQiOwotCi0JcHVibGljIFhTRFNlYXJjaFBhcnRpY2lwYW50KCkKLQl7Ci0JICBzdXBlcigpOwotICAgICAgaWQgPSBJRDsKLQl9CQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWRDb250ZW50VHlwZXMoKQotCXsKLQkgIFN0cmluZ1tdIHJlc3VsdCA9IHsgIm9yZy5lY2xpcHNlLndzdC54c2QuY29yZS54c2Rzb3VyY2UiIH07Ci0JICByZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGUoU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBNYXAgc2VhcmNoT3B0aW9ucykKLQl7Ci0JCWlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuICl7Ci0JCQlYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuIGNvbXBvbmVudFBhdHRlcm4gPSAoWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybilwYXR0ZXJuOwotCQkJU3RyaW5nIG5hbWVzcGFjZSA9IGNvbXBvbmVudFBhdHRlcm4uZ2V0TWV0YU5hbWUoKS5nZXROYW1lc3BhY2UoKTsKLQkJCWlmKElYU0RTZWFyY2hDb25zdGFudHMuWE1MU0NIRU1BX05BTUVTUEFDRS5lcXVhbHMobmFtZXNwYWNlKSl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkJCi0JcHVibGljIENvbXBvbmVudFNlYXJjaENvbnRyaWJ1dG9yIGdldFNlYXJjaENvbnRyaWJ1dG9yKCkgewkJCi0JCXJldHVybiBuZXcgWFNEU2VhcmNoQ29udHJpYnV0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9YU0RTZWFyY2hRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvWFNEU2VhcmNoUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRmZWZiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9YU0RTZWFyY2hRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5zZWFyY2guQWJzdHJhY3RTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLlhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLlhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm47Ci0KLXB1YmxpYyBjbGFzcyBYU0RTZWFyY2hRdWVyeSBleHRlbmRzIEFic3RyYWN0U2VhcmNoUXVlcnkKLXsgICAKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTElNSVRfVE9fREVDTEFSQVRJT05TID0gMTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTElNSVRfVE9fUkVGRVJFTkNFUyAgID0gMjsgIAotICAKLSAgaW50IGZMaW1pdFRvID0gMDsKLSAgSUZpbGUgZkNvbnRleHRGaWxlOwotICBRdWFsaWZpZWROYW1lIGZFbGVtZW50UU5hbWU7Ci0gIFF1YWxpZmllZE5hbWUgZlR5cGVOYW1lOwotICAKLSAgcHVibGljIFhTRFNlYXJjaFF1ZXJ5KFN0cmluZyBwYXR0ZXJuLCBJRmlsZSBmaWxlLCBRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwgUXVhbGlmaWVkTmFtZSB0eXBlTmFtZSwgaW50IGxpbWl0VG8sIFNlYXJjaFNjb3BlIHNjb3BlLCBTdHJpbmcgc2NvcGVEZXNjcmlwdGlvbikKLSAgewotICAgIHN1cGVyKHBhdHRlcm4sIHNjb3BlLCBzY29wZURlc2NyaXB0aW9uKTsKLSAgICBmTGltaXRUbyA9IGxpbWl0VG87Ci0gICAgZkNvbnRleHRGaWxlID0gZmlsZTsKLSAgICBmRWxlbWVudFFOYW1lID0gZWxlbWVudFFOYW1lOwotICAgIGZUeXBlTmFtZSA9IHR5cGVOYW1lOwotICB9Ci0KLSAgcHJvdGVjdGVkIFNlYXJjaFBhdHRlcm4gY3JlYXRlU2VhcmNoUGF0dGVybihRdWFsaWZpZWROYW1lIHR5cGVOYW1lKQotICB7Ci0gICAgaWYgKGZMaW1pdFRvID09IExJTUlUX1RPX0RFQ0xBUkFUSU9OUykKLSAgICB7ICAKLSAgICAgIHJldHVybiBuZXcgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuKGZDb250ZXh0RmlsZSwgZkVsZW1lbnRRTmFtZSwgZlR5cGVOYW1lKTsKLSAgICB9ICAKLSAgICBlbHNlIGlmIChmTGltaXRUbyA9PSBMSU1JVF9UT19SRUZFUkVOQ0VTKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybihmQ29udGV4dEZpbGUsIGZFbGVtZW50UU5hbWUsIGZUeXBlTmFtZSk7Ci0gICAgfSAgCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9CYXNlR3JvdXBBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9CYXNlR3JvdXBBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWM2NjhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvQmFzZUdyb3VwQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5NZW51QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLy9UT0RPICh0cnVuZykgc2hvdWxkIGJlIGluIGNvbW1vbi51aSB0aGlzIG9uZSA/PwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VHcm91cEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlLCBJRWRpdG9yQWN0aW9uRGVsZWdhdGUsIElNZW51Q3JlYXRvcgotewotICAgIHByb3RlY3RlZCBJU2VsZWN0aW9uIGZTZWxlY3Rpb247Ci0gICAgcHJpdmF0ZSBJQWN0aW9uIGZEZWxlZ2F0ZUFjdGlvbjsKLSAgICAvLyB3aGV0aGVyIHRvIHJlLWZpbGwgdGhlIG1lbnUgKHJlc2V0IG9uIHNlbGVjdGlvbiBjaGFuZ2UpCi0gICAgcHJpdmF0ZSBib29sZWFuIGZGaWxsTWVudSA9IHRydWU7Ci0gICAgcHJvdGVjdGVkIElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaFBhcnQ7IAotICAgIAotCi0gICAgcHVibGljIEJhc2VHcm91cEFjdGlvbkRlbGVnYXRlKCkgCi0gICAgewotCi0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotICAgICAgICB3b3JrYmVuY2hQYXJ0ID0gdGFyZ2V0UGFydDsKLSAgICB9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvciNkaXNwb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAvLyBub3RoaW5nIHRvIGRvCi0gICAgfQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3IjZ2V0TWVudShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sKQotICAgICAqLwotICAgIHB1YmxpYyBNZW51IGdldE1lbnUoQ29udHJvbCBwYXJlbnQpIHsKLSAgICAgICAgLy8gbmV2ZXIgY2FsbGVkCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yI2dldE1lbnUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudSkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVudSBnZXRNZW51KE1lbnUgcGFyZW50KSB7Ci0gICAgICAgIC8vQ3JlYXRlIHRoZSBuZXcgbWVudS4gVGhlIG1lbnUgd2lsbCBnZXQgZmlsbGVkIHdoZW4gaXQgaXMgYWJvdXQgdG8gYmUgc2hvd24uIHNlZSBmaWxsTWVudShNZW51KS4KLSAgICAgICAgTWVudSBtZW51ID0gbmV3IE1lbnUocGFyZW50KTsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZCBsaXN0ZW5lciB0byByZXBvcHVsYXRlIHRoZSBtZW51IGVhY2ggdGltZQotICAgICAgICAgKiBpdCBpcyBzaG93biBiZWNhdXNlIE1lbnVNYW5hZ2VyLnVwZGF0ZShib29sZWFuLCBib29sZWFuKSAKLSAgICAgICAgICogZG9lc24ndCBkaXNwb3NlIHB1bGxkb3duIEFjdGlvbkNvbnRyaWJ1dGlvbiBpdGVtcyBmb3IgZWFjaCBwb3B1cCBtZW51LgotICAgICAgICAgKi8KLSAgICAgICAgbWVudS5hZGRNZW51TGlzdGVuZXIobmV3IE1lbnVBZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbWVudVNob3duKE1lbnVFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZGaWxsTWVudSkgewotICAgICAgICAgICAgICAgICAgICBNZW51IG0gPSAoTWVudSllLndpZGdldDsKLSAgICAgICAgICAgICAgICAgICAgTWVudUl0ZW1bXSBpdGVtcyA9IG0uZ2V0SXRlbXMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaWxsTWVudShtKTsKLSAgICAgICAgICAgICAgICAgICAgZkZpbGxNZW51ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIG1lbnU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0gICAgICAgIC8vIE5ldmVyIGNhbGxlZCBiZWNhdXNlIHdlIGJlY29tZSBhIG1lbnUuCi0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIGZEZWxlZ2F0ZUFjdGlvbiA9IGFjdGlvbjsKLSAgICAgICAgdXBkYXRlV2l0aChzZWxlY3Rpb24pOwotICAgICAgICAKLSAgICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLSAgICAgICAgd29ya2JlbmNoUGFydCA9IHRhcmdldEVkaXRvcjsKLSAgICAgICAgZkRlbGVnYXRlQWN0aW9uID0gYWN0aW9uOwotICAgICAgICBpZiAodGFyZ2V0RWRpdG9yICE9IG51bGwgJiYgdGFyZ2V0RWRpdG9yLmdldEVkaXRvclNpdGUoKSAhPSBudWxsICYmIHRhcmdldEVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB1cGRhdGVXaXRoKHRhcmdldEVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVXaXRoKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIGZTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gICAgICAgIGlmIChmRGVsZWdhdGVBY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgYm9vbGVhbiBlbmFibGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAvL2lmICgoKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldExlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gKXsKLSAgICAgICAgICAgICAgICAgICAgZW5hYmxlID0gIXNlbGVjdGlvbi5pc0VtcHR5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZW5hYmxlIGFjdGlvbgotICAgICAgICAgICAgZkRlbGVnYXRlQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gZmlsbCBzdWJtZW51Ci0gICAgICAgICAgICBmRmlsbE1lbnUgPSB0cnVlOwotICAgICAgICAgICAgZkRlbGVnYXRlQWN0aW9uLnNldE1lbnVDcmVhdG9yKHRoaXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZpbGxNZW51KE1lbnUgbWVudSk7Ci0gICAgCi0gICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0NvbXBvc2l0ZUFjdGlvbkdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0NvbXBvc2l0ZUFjdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZjkzNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9Db21wb3NpdGVBY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vLyBUT0RPLi4uIG9wZW4gYSBidWd6aWxsYSB0byBnZXQgdGhlIEpEVCBjbGFzcyBtb3ZlZCB0byBub24gaW50ZXJuYWwgcGxhdGZvcm0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Hcm91cDsKLQotcHVibGljIGNsYXNzIENvbXBvc2l0ZUFjdGlvbkdyb3VwIGV4dGVuZHMgQWN0aW9uR3JvdXAgewotCi0gICAgcHJpdmF0ZSBBY3Rpb25Hcm91cFtdIGZHcm91cHM7Ci0gICAgCi0gICAgcHVibGljIENvbXBvc2l0ZUFjdGlvbkdyb3VwKCkgewotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQ29tcG9zaXRlQWN0aW9uR3JvdXAoQWN0aW9uR3JvdXBbXSBncm91cHMpIHsKLSAgICAgICAgc2V0R3JvdXBzKGdyb3Vwcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0R3JvdXBzKEFjdGlvbkdyb3VwW10gZ3JvdXBzKSB7Ci0gICAgICAgIEFzc2VydC5pc1RydWUoZkdyb3VwcyA9PSBudWxsKTsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChncm91cHMpOwotICAgICAgICBmR3JvdXBzPSBncm91cHM7ICAgICAgICAKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBBY3Rpb25Hcm91cCBnZXQoaW50IGluZGV4KSB7Ci0gICAgICAgIGlmIChmR3JvdXBzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgcmV0dXJuIGZHcm91cHNbaW5kZXhdOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRHcm91cChBY3Rpb25Hcm91cCBncm91cCkgewotICAgICAgICBpZiAoZkdyb3VwcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmR3JvdXBzPSBuZXcgQWN0aW9uR3JvdXBbXSB7IGdyb3VwIH07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBY3Rpb25Hcm91cFtdIG5ld0dyb3Vwcz0gbmV3IEFjdGlvbkdyb3VwW2ZHcm91cHMubGVuZ3RoICsgMV07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGZHcm91cHMsIDAsIG5ld0dyb3VwcywgMCwgZkdyb3Vwcy5sZW5ndGgpOwotICAgICAgICAgICAgbmV3R3JvdXBzW2ZHcm91cHMubGVuZ3RoXT0gZ3JvdXA7Ci0gICAgICAgICAgICBmR3JvdXBzPSBuZXdHcm91cHM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgICAgICBpZiAoZkdyb3VwcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBmb3IgKGludCBpPSAwOyBpIDwgZkdyb3Vwcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZkdyb3Vwc1tpXS5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0gICAgICAgIHN1cGVyLmZpbGxBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOwotICAgICAgICBpZiAoZkdyb3VwcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBmb3IgKGludCBpPSAwOyBpIDwgZkdyb3Vwcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZkdyb3Vwc1tpXS5maWxsQWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotICAgICAgICBzdXBlci5maWxsQ29udGV4dE1lbnUobWVudSk7Ci0gICAgICAgIGlmIChmR3JvdXBzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGZvciAoaW50IGk9IDA7IGkgPCBmR3JvdXBzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmR3JvdXBzW2ldLmZpbGxDb250ZXh0TWVudShtZW51KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHQoQWN0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyLnNldENvbnRleHQoY29udGV4dCk7Ci0gICAgICAgIGlmIChmR3JvdXBzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGZvciAoaW50IGk9IDA7IGkgPCBmR3JvdXBzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmR3JvdXBzW2ldLnNldENvbnRleHQoY29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVBY3Rpb25CYXJzKCkgewotICAgICAgICBzdXBlci51cGRhdGVBY3Rpb25CYXJzKCk7Ci0gICAgICAgIGlmIChmR3JvdXBzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGZvciAoaW50IGk9IDA7IGkgPCBmR3JvdXBzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmR3JvdXBzW2ldLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvRGVjbGFyYXRpb25zU2VhcmNoR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvRGVjbGFyYXRpb25zU2VhcmNoR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzMDhlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0RlY2xhcmF0aW9uc1NlYXJjaEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci0KLS8vIFRPRE8uLiBmaWxsIGluIHRoZSBjb250ZW50Ci1wdWJsaWMgY2xhc3MgRGVjbGFyYXRpb25zU2VhcmNoR3JvdXAKLXsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvRmluZEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9GaW5kQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNWExNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9GaW5kQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1wdWJsaWMgY2xhc3MgRmluZEFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGVkaXRvcjsKLQotICBwcm90ZWN0ZWQgRmluZEFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3IpCi0gIHsKLSAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9GaW5kUmVmZXJlbmNlc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9GaW5kUmVmZXJlbmNlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDUzMzUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvRmluZFJlZmVyZW5jZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLk5ld1NlYXJjaFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5zY29wZS5Xb3Jrc3BhY2VTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmVkaXRvci5JU2VsZWN0aW9uTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLklYU0RTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guWFNEU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotcHVibGljIGNsYXNzIEZpbmRSZWZlcmVuY2VzQWN0aW9uIGV4dGVuZHMgRmluZEFjdGlvbgotewotICBwdWJsaWMgRmluZFJlZmVyZW5jZXNBY3Rpb24oSUVkaXRvclBhcnQgZWRpdG9yKQotICB7Ci0gICAgc3VwZXIoZWRpdG9yKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEFjdGlvbkRlZmluaXRpb25JZChTdHJpbmcgc3RyaW5nKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogVG8gYmUgdXNlZCBieSBzdWJjbGFzcyBpbiBpdHMgcnVuKCkgUmV0dXJucyB0aGUgZmlsZSB3aGVyZSB0aGUgc2VsZWN0aW9uIG9mCi0gICAqIGEgY29tcG9uZW50IChmcm9tIHRoZSB1c2VyKSBvY2N1cnMgaWUuIFJldHVybnMgdGhlIGZpbGUgdGhhdCB0aGUgdXNlciBpcwotICAgKiBjdXJyZW50bHkgd29ya2luZyBvbi4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIElGaWxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHdvcmtpbmcgZmlsZS4KLSAgICovCi0gIHByb3RlY3RlZCBJRmlsZSBnZXRDdXJyZW50RmlsZSgpCi0gIHsKLSAgICBpZiAoZWRpdG9yICE9IG51bGwpCi0gICAgewotICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQotICAgICAgewotICAgICAgICBJRmlsZUVkaXRvcklucHV0IGZpbGVFZGl0b3JJbnB1dCA9IChJRmlsZUVkaXRvcklucHV0KSBpbnB1dDsKLSAgICAgICAgcmV0dXJuIGZpbGVFZGl0b3JJbnB1dC5nZXRGaWxlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFRvIGJlIHVzZWQgYnkgc3ViY2xhc3MgaW4gaXRzIHJ1bigpLi4gRGV0ZXJtaW5lcyB0aGUgbWV0YU5hbWUgb2YgdGhlIFhTRAotICAgKiBjb21wb25lbnQgZ2l2ZW4gdG8gdGhpcyBtZXRob2QuCi0gICAqIAotICAgKiBAcGFyYW0gY29tcG9uZW50Ci0gICAqICAgICAgICAgIFRoZSBjb21wb25lbnQgb2Ygd2hpY2ggd2Ugd2FudCB0byBkZXRlcm1pbmUgdGhlIG5hbWUKLSAgICogQHJldHVybgotICAgKi8KLSAgcHJvdGVjdGVkIFF1YWxpZmllZE5hbWUgZGV0ZXJtaW5lTWV0YU5hbWUoWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgUXVhbGlmaWVkTmFtZSBtZXRhTmFtZSA9IG51bGw7Ci0gICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICBtZXRhTmFtZSA9IElYU0RTZWFyY2hDb25zdGFudHMuQ09NUExFWF9UWVBFX01FVEFfTkFNRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgbWV0YU5hbWUgPSBJWFNEU2VhcmNoQ29uc3RhbnRzLlNJTVBMRV9UWVBFX01FVEFfTkFNRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIG1ldGFOYW1lID0gSVhTRFNlYXJjaENvbnN0YW50cy5FTEVNRU5UX01FVEFfTkFNRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgewotICAgICAgbWV0YU5hbWUgPSBJWFNEU2VhcmNoQ29uc3RhbnRzLkdST1VQX01FVEFfTkFNRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIG1ldGFOYW1lID0gSVhTRFNlYXJjaENvbnN0YW50cy5BVFRSSUJVVEVfR1JPVVBfTUVUQV9OQU1FOwotICAgIH0KLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICBtZXRhTmFtZSA9IElYU0RTZWFyY2hDb25zdGFudHMuQVRUUklCVVRFX01FVEFfTkFNRTsKLSAgICB9Ci0gICAgcmV0dXJuIG1ldGFOYW1lOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgWFNETmFtZWRDb21wb25lbnQgZ2V0WFNETmFtZWRDb21wb25lbnQoKQotICB7Ci0gICAgaWYgKGVkaXRvciAhPSBudWxsKQotICAgIHsKLSAgICAgIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IChJU2VsZWN0aW9uUHJvdmlkZXIpIGVkaXRvci5nZXRBZGFwdGVyKElTZWxlY3Rpb25Qcm92aWRlci5jbGFzcyk7Ci0gICAgICBJU2VsZWN0aW9uTWFwcGVyIG1hcHBlciA9IChJU2VsZWN0aW9uTWFwcGVyKSBlZGl0b3IuZ2V0QWRhcHRlcihJU2VsZWN0aW9uTWFwcGVyLmNsYXNzKTsKLSAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKQotICAgICAgewotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAobWFwcGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzZWxlY3Rpb24gPSBtYXBwZXIubWFwU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgICAgIE9iamVjdCBvID0gcy5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICBpZiAobyAhPSBudWxsICYmIG8gaW5zdGFuY2VvZiBYU0ROYW1lZENvbXBvbmVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKFhTRE5hbWVkQ29tcG9uZW50KSBvOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBUaGUgZXhwZWN0ZWQgY29tcG9uZW50IHdlIGdldCBmcm9tIHRoZSBlZGl0b3IgZG9lcyBub3QgbWVldAotICAgIC8vIG91ciBleHBlY3RhdGlvbgotICAgIHJldHVybiBudWxsOwotICB9ICAKLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgU3RyaW5nIHBhdHRlcm4gPSAiIjsKLSAgICBYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQgPSBnZXRYU0ROYW1lZENvbXBvbmVudCgpOwotICAgIElGaWxlIGZpbGUgPSBnZXRDdXJyZW50RmlsZSgpOwotICAgIGlmIChmaWxlICE9IG51bGwgJiYgY29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgUXVhbGlmaWVkTmFtZSBtZXRhTmFtZSA9IGRldGVybWluZU1ldGFOYW1lKGNvbXBvbmVudCk7Ci0gICAgICBRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSA9IG5ldyBRdWFsaWZpZWROYW1lKGNvbXBvbmVudC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgY29tcG9uZW50LmdldE5hbWUoKSk7Ci0gICAgICBTZWFyY2hTY29wZSBzY29wZSA9IG5ldyBXb3Jrc3BhY2VTZWFyY2hTY29wZSgpOwotICAgICAgU3RyaW5nIHNjb3BlRGVzY3JpcHRpb24gPSAiV29ya3NwYWNlIjsKLSAgICAgIFhTRFNlYXJjaFF1ZXJ5IHNlYXJjaFF1ZXJ5ID0gbmV3IFhTRFNlYXJjaFF1ZXJ5KHBhdHRlcm4sIGZpbGUsIGVsZW1lbnRRTmFtZSwgbWV0YU5hbWUsIFhTRFNlYXJjaFF1ZXJ5LkxJTUlUX1RPX1JFRkVSRU5DRVMsIHNjb3BlLCBzY29wZURlc2NyaXB0aW9uKTsKLSAgICAgIE5ld1NlYXJjaFVJLmFjdGl2YXRlU2VhcmNoUmVzdWx0VmlldygpOwotICAgICAgTmV3U2VhcmNoVUkucnVuUXVlcnlJbkJhY2tncm91bmQoc2VhcmNoUXVlcnkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9GaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9GaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTRmMjU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLk5ld1NlYXJjaFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuUHJvamVjdFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLlhTRFNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLXB1YmxpYyBjbGFzcyBGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbiBleHRlbmRzIEZpbmRSZWZlcmVuY2VzQWN0aW9uCi17Ci0gIHB1YmxpYyBGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3IpCi0gIHsKLSAgICBzdXBlcihlZGl0b3IpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIFN0cmluZyBwYXR0ZXJuID0gIiI7Ci0gICAgWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50ID0gZ2V0WFNETmFtZWRDb21wb25lbnQoKTsKLSAgICBJRmlsZSBmaWxlID0gZ2V0Q3VycmVudEZpbGUoKTsKLSAgICBpZiAoZmlsZSAhPSBudWxsICYmIGNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIFF1YWxpZmllZE5hbWUgbWV0YU5hbWUgPSBkZXRlcm1pbmVNZXRhTmFtZShjb21wb25lbnQpOwotICAgICAgUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZShjb21wb25lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGNvbXBvbmVudC5nZXROYW1lKCkpOwotICAgICAgSVBhdGggZnVsbFBhdGggPSBmaWxlLmdldEZ1bGxQYXRoKCk7Ci0gICAgICBQcm9qZWN0U2VhcmNoU2NvcGUgc2NvcGUgPSBuZXcgUHJvamVjdFNlYXJjaFNjb3BlKGZ1bGxQYXRoKTsKLSAgICAgIFN0cmluZyBzY29wZURlc2NyaXB0aW9uID0gIlByb2plY3QiOwotICAgICAgWFNEU2VhcmNoUXVlcnkgc2VhcmNoUXVlcnkgPSBuZXcgWFNEU2VhcmNoUXVlcnkocGF0dGVybiwgZmlsZSwgZWxlbWVudFFOYW1lLCBtZXRhTmFtZSwgWFNEU2VhcmNoUXVlcnkuTElNSVRfVE9fUkVGRVJFTkNFUywgc2NvcGUsIHNjb3BlRGVzY3JpcHRpb24pOwotICAgICAgTmV3U2VhcmNoVUkuYWN0aXZhdGVTZWFyY2hSZXN1bHRWaWV3KCk7Ci0gICAgICBOZXdTZWFyY2hVSS5ydW5RdWVyeUluQmFja2dyb3VuZChzZWFyY2hRdWVyeSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0ZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0ZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNzEwZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9GaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuTmV3U2VhcmNoVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtpbmdTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklXb3JraW5nU2V0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuV29ya2luZ1NldFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZWRpdG9yLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5YU0RTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbiBleHRlbmRzIEZpbmRSZWZlcmVuY2VzQWN0aW9uewotCi0JcHVibGljIEZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uKElFZGl0b3JQYXJ0IGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25EZWZpbml0aW9uSWQoU3RyaW5nIHN0cmluZykKLQl7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpewotCQlJV29ya2luZ1NldFtdIHdvcmtpbmdTZXRzID0gcXVlcnlXb3JraW5nU2V0cygpOwotCQlpZiAoIHdvcmtpbmdTZXRzID09IG51bGwgfHwgd29ya2luZ1NldHMubGVuZ3RoID09IDApCi0JCQkvLyBUaGUgdXNlciBjaG9vc2VzIG5vdGhpbmcsIG5vIHBvaW50IHRvIGNvbnRpbnVlLgotCQkJcmV0dXJuOwotCQlTdHJpbmcgcGF0dGVybiA9ICIiOwotCi0JCVhTRE5hbWVkQ29tcG9uZW50IGNvbXBvbmVudCA9IGdldFhTRE5hbWVkQ29tcG9uZW50KCk7Ci0JCUlGaWxlIGZpbGUgPSBnZXRDdXJyZW50RmlsZSgpOwotCQlpZiAoIGZpbGUgIT0gbnVsbCAmJiBjb21wb25lbnQgIT0gbnVsbCl7Ci0JCQlRdWFsaWZpZWROYW1lIG1ldGFOYW1lID0gZGV0ZXJtaW5lTWV0YU5hbWUoY29tcG9uZW50KTsKLQotCQkJUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUgPSAKLQkJCQluZXcgUXVhbGlmaWVkTmFtZShjb21wb25lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGNvbXBvbmVudC5nZXROYW1lKCkpOwotCi0JCQkvLyBDcmVhdGUgYSBzY29wZSBmcm9tIHRoZSBzZWxlY3RlZCB3b3JraW5nIHNldHMKLQkJCVdvcmtpbmdTZXRTZWFyY2hTY29wZSBzY29wZSA9IG5ldyBXb3JraW5nU2V0U2VhcmNoU2NvcGUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgd29ya2luZ1NldHMubGVuZ3RoOyBpKyspewotCQkJCUlBZGFwdGFibGVbXSBlbGVtZW50cyA9IHdvcmtpbmdTZXRzW2ldLmdldEVsZW1lbnRzKCk7Ci0JCQkJc2NvcGUuYWRkQVdvcmtpbmdTZXRUb1Njb3BlKGVsZW1lbnRzKTsKLQkJCX0KLQotCQkJU3RyaW5nIHNjb3BlRGVzY3JpcHRpb24gPSAiV29ya2luZyBTZXQiOyAgICAKLQkJCVhTRFNlYXJjaFF1ZXJ5IHNlYXJjaFF1ZXJ5ID0gCi0JCQkJbmV3IFhTRFNlYXJjaFF1ZXJ5KHBhdHRlcm4sIGZpbGUsIGVsZW1lbnRRTmFtZSwgbWV0YU5hbWUsIFhTRFNlYXJjaFF1ZXJ5LkxJTUlUX1RPX1JFRkVSRU5DRVMsIHNjb3BlLCBzY29wZURlc2NyaXB0aW9uKTsgICAgCi0JCQlOZXdTZWFyY2hVSS5hY3RpdmF0ZVNlYXJjaFJlc3VsdFZpZXcoKTsKLQkJCU5ld1NlYXJjaFVJLnJ1blF1ZXJ5SW5CYWNrZ3JvdW5kKHNlYXJjaFF1ZXJ5KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIGEgZGlhbG9nIGFza2luZyB0aGUgdXNlciB0byBjaG9vc2UgdGhlIHdvcmtpbmcgU2V0cyBoZSB3YW50cwotCSAqIHRvIGRvIHRoZSBzZWFyY2ggb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya2luZ1NldFtdIHF1ZXJ5V29ya2luZ1NldHMoKXsKLQkJU2hlbGwgc2hlbGw9IFhTREVkaXRvclBsdWdpbi5nZXRTaGVsbCgpOwotCQlpZiAoc2hlbGwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJV29ya2luZ1NldFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPQotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRXb3JraW5nU2V0TWFuYWdlcigpLmNyZWF0ZVdvcmtpbmdTZXRTZWxlY3Rpb25EaWFsb2coc2hlbGwsIHRydWUpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCUlXb3JraW5nU2V0W10gd29ya2luZ1NldHM9IGRpYWxvZy5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmICh3b3JraW5nU2V0cy5sZW5ndGggPiAwKQotCQkJCXJldHVybiB3b3JraW5nU2V0czsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0ltcGxlbWVudG9yc1NlYXJjaEdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL0ltcGxlbWVudG9yc1NlYXJjaEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZmM4ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9JbXBsZW1lbnRvcnNTZWFyY2hHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zOwotCi0vLyBUT0RPLi4uIGZpbGwgaW4gdGhlIGNvbnRlbnQKLXB1YmxpYyBjbGFzcyBJbXBsZW1lbnRvcnNTZWFyY2hHcm91cAotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9PY2N1cnJlbmNlc1NlYXJjaEdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL09jY3VycmVuY2VzU2VhcmNoR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYzZTI0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL09jY3VycmVuY2VzU2VhcmNoR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczsKLQotLy8gVE9ETy4uLiBmaWxsIGluIHRoZSBjb250ZW50Ci1wdWJsaWMgY2xhc3MgT2NjdXJyZW5jZXNTZWFyY2hHcm91cAotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9SZWZlcmVuY2VzU2VhcmNoR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvUmVmZXJlbmNlc1NlYXJjaEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OTg0YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9SZWZlcmVuY2VzU2VhcmNoR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guU2VhcmNoTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VzU2VhcmNoR3JvdXAgZXh0ZW5kcyBTZWFyY2hHcm91cCAgewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTlVfVEVYVD0gU2VhcmNoTWVzc2FnZXMuZ3JvdXBfcmVmZXJlbmNlczsgCi0KLSAgICBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZkVkaXRvcjsKLSAgICBwcml2YXRlIElXb3JrYmVuY2hTaXRlIGZTaXRlOwotICAgIHByaXZhdGUgSUFjdGlvbkJhcnMgZkFjdGlvbkJhcnM7Ci0gICAgCi0vLyAgICBwcml2YXRlIFN0cmluZyBmR3JvdXBJZDsKLSAgICAKLSAgICBwcm90ZWN0ZWQgRmluZEFjdGlvbiBmRmluZFJlZmVyZW5jZXNBY3Rpb247Ci0gICAgcHJvdGVjdGVkIEZpbmRBY3Rpb24gZkZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uOwotICAgIHByb3RlY3RlZCBGaW5kQWN0aW9uIGZGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbjsKLQotCi0gICAgLyoqCi0gICAgICogTm90ZTogVGhpcyBjb25zdHJ1Y3RvciBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgY29uc3RydWN0b3IuCi0gICAgICogQHBhcmFtIGVkaXRvcgotICAgICAqLwotICAgIHB1YmxpYyBSZWZlcmVuY2VzU2VhcmNoR3JvdXAoSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0gICAgICAgIEFzc2VydC5pc05vdE51bGwoZWRpdG9yKTsKLSAgICAgICAgZkVkaXRvcj0gZWRpdG9yOwotICAgICAgICBmU2l0ZT0gZkVkaXRvci5nZXRTaXRlKCk7Ci0gICAgICAgIAotICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0vLyAgICAgIGZHcm91cElkPSBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9GSU5EOwotCi0gICAgICAgIGZGaW5kUmVmZXJlbmNlc0FjdGlvbj0gbmV3IEZpbmRSZWZlcmVuY2VzQWN0aW9uKGZFZGl0b3IpOwotICAgICAgICBmRmluZFJlZmVyZW5jZXNBY3Rpb24uc2V0VGV4dChTZWFyY2hNZXNzYWdlcy5TZWFyY2hfRmluZERlY2xhcmF0aW9uQWN0aW9uX2xhYmVsKTsKLSAgICAgICAgZkZpbmRSZWZlcmVuY2VzQWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZCgiU0VBUkNIX1JFRkVSRU5DRVNfSU5fV09SS1NQQUNFIik7Ci0gICAgICAgIC8vZkVkaXRvci5zZXRBY3Rpb24oIlNlYXJjaFJlZmVyZW5jZXNJbldvcmtzcGFjZSIsIGZGaW5kUmVmZXJlbmNlc0FjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBmRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb249IG5ldyBGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbihmRWRpdG9yKTsKLSAgICAgICAgZkZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uLnNldFRleHQoU2VhcmNoTWVzc2FnZXMuU2VhcmNoX0ZpbmREZWNsYXJhdGlvbnNJblByb2plY3RBY3Rpb25fbGFiZWwpOyAgICAgICAgCi0gICAgICAgIGZGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoIlNFQVJDSF9SRUZFUkVOQ0VTX0lOX1BST0pFQ1QiKTsKLSAgICAgICAgLy9mRWRpdG9yLnNldEFjdGlvbigiU2VhcmNoUmVmZXJlbmNlc0luUHJvamVjdCIsIGZGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAgICAgZkZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uPSBuZXcgRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24oZkVkaXRvcik7Ci0gICAgICAgIGZGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbi5zZXRUZXh0KFNlYXJjaE1lc3NhZ2VzLlNlYXJjaF9GaW5kRGVjbGFyYXRpb25zSW5Xb3JraW5nU2V0QWN0aW9uX2xhYmVsKTsgICAgICAgICAKLSAgICAgICAgZkZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZCgiLlNFQVJDSF9SRUZFUkVOQ0VTX0lOX1dPUktJTkdfU0VUIik7Ci0gICAgICAgIC8vZkVkaXRvci5zZXRBY3Rpb24oIlNlYXJjaFJlZmVyZW5jZXNJbldvcmtpbmdTZXQiLCBmRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24pOyAvLyROT04tTkxTLTEkICAgIAkKLSAgICB9Ci0KLSAgICAvKgotICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckFjdGlvbihTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgYWN0aW9uLnVwZGF0ZShzZWxlY3Rpb24pOwotICAgICAgICBwcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoYWN0aW9uKTsKLSAgICB9Ki8KLQotICAgIC8qKgotICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWVudSBsYWJlbAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIE1FTlVfVEVYVDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZmlsbEFjdGlvbnMoTGlzdCBsaXN0KQotICAgIHsKLSAgICAgIGxpc3QuYWRkKGZGaW5kUmVmZXJlbmNlc0FjdGlvbik7Ci0gICAgICAvL2xpc3QuYWRkKGZGaW5kUmVmZXJlbmNlc0luSGllcmFyY2h5QWN0aW9uKTsKLSAgICAgIGxpc3QuYWRkKGZGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbik7Ci0gICAgICBsaXN0LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgbGlzdC5hZGQoZkZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBpbiBBY3Rpb25Hcm91cAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGxBY3Rpb25CYXJzKElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChhY3Rpb25CYXJzKTsKLSAgICAgICAgc3VwZXIuZmlsbEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7Ci0gICAgICAgIGZBY3Rpb25CYXJzPSBhY3Rpb25CYXJzOwotICAgICAgICB1cGRhdGVHbG9iYWxBY3Rpb25IYW5kbGVycygpOwotICAgIH0KLQotICAgIAotLy8gICAgcHJpdmF0ZSB2b2lkIGFkZEFjdGlvbihJQWN0aW9uIGFjdGlvbiwgSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLS8vICAgICAgICBpZiAoYWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0vLyAgICAgICAgICAgIG1hbmFnZXIuYWRkKGFjdGlvbik7Ci0vLyAgICAgICAgfQotLy8gICAgfQotCi0gICAgLyoKLSAgICBwcml2YXRlIHZvaWQgYWRkV29ya2luZ1NldEFjdGlvbihJV29ya2luZ1NldFtdIHdvcmtpbmdTZXRzLCBJTWVudU1hbmFnZXIgbWFuYWdlcikgewotICAgICAgICBGaW5kQWN0aW9uIGFjdGlvbjsKLSAgICAgICAgaWYgKGZFZGl0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgIGFjdGlvbj0gbmV3IFdvcmtpbmdTZXRGaW5kQWN0aW9uKGZFZGl0b3IsIG5ldyBGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbihmRWRpdG9yLCB3b3JraW5nU2V0cyksIFNlYXJjaFV0aWwudG9TdHJpbmcod29ya2luZ1NldHMpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYWN0aW9uPSBuZXcgV29ya2luZ1NldEZpbmRBY3Rpb24oZlNpdGUsIG5ldyBGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbihmU2l0ZSwgd29ya2luZ1NldHMpLCBTZWFyY2hVdGlsLnRvU3RyaW5nKHdvcmtpbmdTZXRzKSk7Ci0gICAgICAgIGFjdGlvbi51cGRhdGUoZ2V0Q29udGV4dCgpLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgYWRkQWN0aW9uKGFjdGlvbiwgbWFuYWdlcik7Ci0gICAgfQotICAgICovCi0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBBY3Rpb25Hcm91cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICAgIC8qCi0gICAgICAgIE1lbnVNYW5hZ2VyIGphdmFTZWFyY2hNTT0gbmV3IE1lbnVNYW5hZ2VyKGdldE5hbWUoKSwgSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX1NFQVJDSCk7Ci0gICAgICAgIGFkZEFjdGlvbihmRmluZFJlZmVyZW5jZXNBY3Rpb24sIGphdmFTZWFyY2hNTSk7Ci0gICAgICAgIGFkZEFjdGlvbihmRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb24sIGphdmFTZWFyY2hNTSk7Ci0gICAgICAgIGFkZEFjdGlvbihmRmluZFJlZmVyZW5jZXNJbkhpZXJhcmNoeUFjdGlvbiwgamF2YVNlYXJjaE1NKTsKLSAgICAgICAgCi0gICAgICAgIGphdmFTZWFyY2hNTS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgCi0gICAgICAgIEl0ZXJhdG9yIGl0ZXI9IFNlYXJjaFV0aWwuZ2V0TFJVV29ya2luZ1NldHMoKS5zb3J0ZWRJdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGFkZFdvcmtpbmdTZXRBY3Rpb24oKElXb3JraW5nU2V0W10pIGl0ZXIubmV4dCgpLCBqYXZhU2VhcmNoTU0pOwotICAgICAgICB9Ci0gICAgICAgIGFkZEFjdGlvbihmRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb24sIGphdmFTZWFyY2hNTSk7Ci0KLSAgICAgICAgaWYgKCFqYXZhU2VhcmNoTU0uaXNFbXB0eSgpKQotICAgICAgICAgICAgbWFuYWdlci5hcHBlbmRUb0dyb3VwKGZHcm91cElkLCBqYXZhU2VhcmNoTU0pOwotICAgICAgICAqLyAgICAKLSAgICB9Ci0gICAgCi0gICAgLyogCi0gICAgICogT3ZlcnJpZGVzIG1ldGhvZCBkZWNsYXJlZCBpbiBBY3Rpb25Hcm91cAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlcj0gZlNpdGUuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLSAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRpc3Bvc2VBY3Rpb24oZkZpbmRSZWZlcmVuY2VzQWN0aW9uLCBwcm92aWRlcik7Ci0gICAgICAgICAgICBkaXNwb3NlQWN0aW9uKGZGaW5kUmVmZXJlbmNlc0luUHJvamVjdEFjdGlvbiwgcHJvdmlkZXIpOwotICAgICAgICAgIC8vICBkaXNwb3NlQWN0aW9uKGZGaW5kUmVmZXJlbmNlc0luSGllcmFyY2h5QWN0aW9uLCBwcm92aWRlcik7Ci0gICAgICAgICAgICBkaXNwb3NlQWN0aW9uKGZGaW5kUmVmZXJlbmNlc0luV29ya2luZ1NldEFjdGlvbiwgcHJvdmlkZXIpOwotICAgICAgICB9Ci0gICAgICAgIGZGaW5kUmVmZXJlbmNlc0FjdGlvbj0gbnVsbDsKLSAgICAgICAgZkZpbmRSZWZlcmVuY2VzSW5Qcm9qZWN0QWN0aW9uPSBudWxsOwotICAgICAgICAvL2ZGaW5kUmVmZXJlbmNlc0luSGllcmFyY2h5QWN0aW9uPSBudWxsOwotICAgICAgICBmRmluZFJlZmVyZW5jZXNJbldvcmtpbmdTZXRBY3Rpb249IG51bGw7Ci0gICAgICAgIHVwZGF0ZUdsb2JhbEFjdGlvbkhhbmRsZXJzKCk7Ci0gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlR2xvYmFsQWN0aW9uSGFuZGxlcnMoKSB7Ci0gICAgICAgIGlmIChmQWN0aW9uQmFycyAhPSBudWxsKSB7Ci0vLyAgICAgICAgICAgIGZBY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSmR0QWN0aW9uQ29uc3RhbnRzLkZJTkRfUkVGRVJFTkNFU19JTl9XT1JLU1BBQ0UsIGZGaW5kUmVmZXJlbmNlc0FjdGlvbik7Ci0vLyAgICAgICAgICAgIGZBY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSmR0QWN0aW9uQ29uc3RhbnRzLkZJTkRfUkVGRVJFTkNFU19JTl9QUk9KRUNULCBmRmluZFJlZmVyZW5jZXNJblByb2plY3RBY3Rpb24pOwotLy8gICAgICAgICAgICBmQWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEpkdEFjdGlvbkNvbnN0YW50cy5GSU5EX1JFRkVSRU5DRVNfSU5fSElFUkFSQ0hZLCBmRmluZFJlZmVyZW5jZXNJbkhpZXJhcmNoeUFjdGlvbik7Ci0vLyAgICAgICAgICAgIGZBY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSmR0QWN0aW9uQ29uc3RhbnRzLkZJTkRfUkVGRVJFTkNFU19JTl9XT1JLSU5HX1NFVCwgZkZpbmRSZWZlcmVuY2VzSW5Xb3JraW5nU2V0QWN0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkaXNwb3NlQWN0aW9uKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgYWN0aW9uLCBJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLSAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgcHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGFjdGlvbik7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvU2VhcmNoR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvU2VhcmNoR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgwNzFiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1NlYXJjaEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkdyb3VwOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VhcmNoR3JvdXAgZXh0ZW5kcyBBY3Rpb25Hcm91cAotewotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmaWxsQWN0aW9ucyhMaXN0IGxpc3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9YU0RTZWFyY2hBY3Rpb25Hcm91cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9YU0RTZWFyY2hBY3Rpb25Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzY4NDZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvWFNEU2VhcmNoQWN0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5zZWFyY2guYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uR3JvdXA7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTZWFyY2hBY3Rpb25Hcm91cCBleHRlbmRzIEFjdGlvbkdyb3VwCi17Ci0vLyAgcHJpdmF0ZSBSZWZlcmVuY2VzU2VhcmNoR3JvdXAgZlJlZmVyZW5jZXNHcm91cDsKLS8vICBwcml2YXRlIERlY2xhcmF0aW9uc1NlYXJjaEdyb3VwIGZEZWNsYXJhdGlvbnNHcm91cDsKLS8vICBwcml2YXRlIEltcGxlbWVudG9yc1NlYXJjaEdyb3VwIGZJbXBsZW1lbnRvcnNHcm91cDsKLS8vICBwcml2YXRlIE9jY3VycmVuY2VzU2VhcmNoR3JvdXAgZk9jY3VycmVuY2VzR3JvdXA7Ci0vLyAgcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yOwotCi0gIHB1YmxpYyBYU0RTZWFyY2hBY3Rpb25Hcm91cChJRWRpdG9yUGFydCBlZGl0b3IpCi0gIHsKLSAgICBBc3NlcnQuaXNOb3ROdWxsKGVkaXRvcik7Ci0vLyAgICBmRWRpdG9yID0gZWRpdG9yOwotLy8gICAgZlJlZmVyZW5jZXNHcm91cCA9IG5ldyBSZWZlcmVuY2VzU2VhcmNoR3JvdXAoZWRpdG9yKTsKLS8vICAgIGZEZWNsYXJhdGlvbnNHcm91cCA9IG5ldyBEZWNsYXJhdGlvbnNTZWFyY2hHcm91cCgpOwotLy8gICAgZkltcGxlbWVudG9yc0dyb3VwID0gbmV3IEltcGxlbWVudG9yc1NlYXJjaEdyb3VwKCk7Ci0vLyAgICBmT2NjdXJyZW5jZXNHcm91cCA9IG5ldyBPY2N1cnJlbmNlc1NlYXJjaEdyb3VwKCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1hTRFNlYXJjaERlY2xhcmF0aW9uc0dyb3VwQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvWFNEU2VhcmNoRGVjbGFyYXRpb25zR3JvdXBBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWM1NWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvWFNEU2VhcmNoRGVjbGFyYXRpb25zR3JvdXBBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLQotLy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zLlhTRFNlYXJjaEdyb3VwQWN0aW9uRGVsZWdhdGUKLXB1YmxpYyBjbGFzcyBYU0RTZWFyY2hEZWNsYXJhdGlvbnNHcm91cEFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgQmFzZUdyb3VwQWN0aW9uRGVsZWdhdGUKLXsKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaWxsTWVudShNZW51IG1lbnUpIHsKLQotICAgIH0gICAgICAgICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1hTRFNlYXJjaEdyb3VwU3ViTWVudS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLnVpL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3hzZC91aS9pbnRlcm5hbC9zZWFyY2gvYWN0aW9ucy9YU0RTZWFyY2hHcm91cFN1Yk1lbnUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVjMzU5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1hTRFNlYXJjaEdyb3VwU3ViTWVudS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkNvbXBvdW5kQ29udHJpYnV0aW9uSXRlbTsKLQotLy8gVE9ETyBzaG91bGQgYmUgaW4gY29tbW9uLnVpCi1wdWJsaWMgY2xhc3MgWFNEU2VhcmNoR3JvdXBTdWJNZW51IGV4dGVuZHMgQ29tcG91bmRDb250cmlidXRpb25JdGVtCi17Ci0gIFNlYXJjaEdyb3VwIHNlYXJjaEFjdGlvbkdyb3VwOwotCi0gIHB1YmxpYyBYU0RTZWFyY2hHcm91cFN1Yk1lbnUoU2VhcmNoR3JvdXAgcmVmYWN0b3JNZW51R3JvdXApCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHNlYXJjaEFjdGlvbkdyb3VwID0gcmVmYWN0b3JNZW51R3JvdXA7Ci0gIH0KLQotICBwdWJsaWMgWFNEU2VhcmNoR3JvdXBTdWJNZW51KFN0cmluZyBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJQ29udHJpYnV0aW9uSXRlbVtdIGdldENvbnRyaWJ1dGlvbkl0ZW1zKCkKLSAgewotICAgIEFycmF5TGlzdCBhY3Rpb25zTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBBcnJheUxpc3QgY29udHJpYkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgc2VhcmNoQWN0aW9uR3JvdXAuZmlsbEFjdGlvbnMoYWN0aW9uc0xpc3QpOwotICAgIGlmIChhY3Rpb25zTGlzdCAhPSBudWxsICYmICFhY3Rpb25zTGlzdC5pc0VtcHR5KCkpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aW9uc0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIElBY3Rpb24pCi0gICAgICAgIHsgIAotICAgICAgICAgIElBY3Rpb24gYWN0aW9uID0gKElBY3Rpb24pbzsKLSAgICAgICAgICBjb250cmliTGlzdC5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobyBpbnN0YW5jZW9mIFNlcGFyYXRvcikKLSAgICAgICAgewotICAgICAgICAgIFNlcGFyYXRvciBzZXBhcmF0b3IgPSAoU2VwYXJhdG9yKW87Ci0gICAgICAgICAgY29udHJpYkxpc3QuYWRkKHNlcGFyYXRvcik7Ci0gICAgICAgIH0gIAotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgQWN0aW9uIGR1bW15QWN0aW9uID0gbmV3IEFjdGlvbigiWFNEU2VhY2hBY3Rpb25Hcm91cF9ub19yZWZhY3RvcmluZ19hdmFpbGFibGUiKSAvL1RPRE8gd3Jvbmcgc3RyaW5nIGhlcmUgPz8KLSAgICAgIHsKLSAgICAgICAgLy8gZHVtbXkgaW5uZXIgY2xhc3M7IG5vIG1ldGhvZHMKLSAgICAgIH07Ci0gICAgICBkdW1teUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIGNvbnRyaWJMaXN0LmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShkdW1teUFjdGlvbikpOwotICAgIH0KLSAgICByZXR1cm4gKElDb250cmlidXRpb25JdGVtW10pIGNvbnRyaWJMaXN0LnRvQXJyYXkobmV3IElDb250cmlidXRpb25JdGVtW2NvbnRyaWJMaXN0LnNpemUoKV0pOyAgICAgICAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvWFNEU2VhcmNoUmVmZXJlbmNlc0dyb3VwQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC51aS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94c2QvdWkvaW50ZXJuYWwvc2VhcmNoL2FjdGlvbnMvWFNEU2VhcmNoUmVmZXJlbmNlc0dyb3VwQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5NDdiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QudWkvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveHNkL3VpL2ludGVybmFsL3NlYXJjaC9hY3Rpb25zL1hTRFNlYXJjaFJlZmVyZW5jZXNHcm91cEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuc2VhcmNoLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0U2l0ZTsKLQotLy9vcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnNlYXJjaC5hY3Rpb25zLlhTRFNlYXJjaEdyb3VwQWN0aW9uRGVsZWdhdGUKLXB1YmxpYyBjbGFzcyBYU0RTZWFyY2hSZWZlcmVuY2VzR3JvdXBBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIEJhc2VHcm91cEFjdGlvbkRlbGVnYXRlCi17Ci0gICAgcHJvdGVjdGVkIHZvaWQgZmlsbE1lbnUoTWVudSBtZW51KSB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaWYgKGZTZWxlY3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3b3JrYmVuY2hQYXJ0ICE9IG51bGwpCi0gICAgICAgIHsKLQkJICBJV29ya2JlbmNoUGFydFNpdGUgc2l0ZSA9IHdvcmtiZW5jaFBhcnQuZ2V0U2l0ZSgpOwotCQkJaWYgKHNpdGUgPT0gbnVsbCkKLQkJCSAgcmV0dXJuOwotCQotCQkgIElFZGl0b3JQYXJ0IGVkaXRvciA9IHNpdGUuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICAgIGlmICggZWRpdG9yICE9IG51bGwgKXsKLSAgICAgICAgICAgIFJlZmVyZW5jZXNTZWFyY2hHcm91cCByZWZlcmVuY2VzR3JvdXAgPSBuZXcgUmVmZXJlbmNlc1NlYXJjaEdyb3VwKGVkaXRvcik7Ci0gICAgICAgICAgICBYU0RTZWFyY2hHcm91cFN1Yk1lbnUgc3ViTWVudSA9IG5ldyBYU0RTZWFyY2hHcm91cFN1Yk1lbnUocmVmZXJlbmNlc0dyb3VwKTsKLSAgICAgICAgICAgIHN1Yk1lbnUuZmlsbChtZW51LCAtMSk7Ci0gICAgICAgICAgfQotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0KLSAgICB9ICAKLX0KZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5jbGFzc3BhdGggYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmIzMzUzLi4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIiBraW5kPSJjb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLmN2c2lnbm9yZSBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYzljYjAuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXNzZWp1bml0LmphcgotdGVtcC5mb2xkZXIKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5wcm9qZWN0IGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZjUxMDkuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDhiNWMuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6Mzc6MjEgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJhYzY1Li4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjQ5NTguLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjA1OjI5IEVEVCAyMDA2Ci1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL1NTRSBNYXN0ZXIgTGlzdCBUZXN0IFN1aXRlLmxhdW5jaCBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL1NTRSBNYXN0ZXIgTGlzdCBUZXN0IFN1aXRlLmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1MzVjMC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9TU0UgTWFzdGVyIExpc3QgVGVzdCBTdWl0ZS5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkp1bml0TGF1bmNoQ29uZmlnIj4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXBwZW5kLmFyZ3MiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFza2NsZWFyIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljQWRkIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNWYWxpZGF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY2hlY2tlZCIgdmFsdWU9IltOT05FXSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJ3cyIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJ3c2xvZyIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY29uZmlnTG9jYXRpb24iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2N9Ly5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZS9wZGUtanVuaXQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iZGVmYXVsdCIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iaW5jbHVkZU9wdGlvbmFsIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImxvY2F0aW9uIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jfS8uLi9qdW5pdC13b3Jrc3BhY2UiLz4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfUEFUSFMiPgotPGxpc3RFbnRyeSB2YWx1ZT0iL29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9NYXN0ZXJMaXN0VGVzdFN1aXRlLmphdmEiLz4KLTwvbGlzdEF0dHJpYnV0ZT4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfVFlQRVMiPgotPGxpc3RFbnRyeSB2YWx1ZT0iMSIvPgotPC9saXN0QXR0cmlidXRlPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5DT05UQUlORVIiIHZhbHVlPSIiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LktFRVBSVU5OSU5HX0FUVFIiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5URVNUTkFNRSIgdmFsdWU9IiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5URVNUX0tJTkQiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuanVuaXQubG9hZGVyLmp1bml0MyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLk1BSU5fVFlQRSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLk1hc3Rlckxpc3RUZXN0U3VpdGUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0dSQU1fQVJHVU1FTlRTIiB2YWx1ZT0iLW9zICR7dGFyZ2V0Lm9zfSAtd3MgJHt0YXJnZXQud3N9IC1hcmNoICR7dGFyZ2V0LmFyY2h9IC1ubCAke3RhcmdldC5ubH0iLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0pFQ1RfQVRUUiIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TT1VSQ0VfUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS51aS53b3JrYmVuY2hDbGFzc3BhdGhQcm92aWRlciIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuVk1fQVJHVU1FTlRTIiB2YWx1ZT0iLVhteDYwME0gLVhYOk1heFBlcm1TaXplPTE5Mk0iLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwZGUudmVyc2lvbiIgdmFsdWU9IjMuMyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InByb2R1Y3QiIHZhbHVlPSJvcmcuZWNsaXBzZS5zZGsuaWRlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InNob3dfc2VsZWN0ZWRfb25seSIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InRyYWNpbmciIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnQXJlYSIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZVByb2R1Y3QiIHZhbHVlPSJ0cnVlIi8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRlMTQ1NC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNvdXJjZS4uID0gc3JjLwpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvaWNvbnMvc291cmNlRWRpdG9yLmdpZiBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL2ljb25zL3NvdXJjZUVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZWJkYjguLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvaWNvbnMvc291cmNlRWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNDM3MGIuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1YTUxfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWU9WE1MIFNvdXJjZSBQYWdlIEVkaXRvcgotSmF2YVNjcmlwdF9Tb3VyY2VfUGFnZV9FZGl0b3IubmFtZT1KYXZhU2NyaXB0IFNvdXJjZSBQYWdlIEVkaXRvcgotCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwotQnVuZGxlLU5hbWUuMCA9IFVuaXQgVGVzdHMKLWFkZGl0aW9uYWxUZXN0cz1BZGRpdGlvbmFsIFRlc3RDYXNlcyBhbmQgVGVzdFN1aXRlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3BsdWdpbi54bWwgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGQ0OTE3Li4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgICAgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0gICAgICAgICAgICAgICAgPGVkaXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iJVhNTF9Tb3VyY2VfUGFnZV9FZGl0b3IubmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIGljb249Imljb25zL3NvdXJjZUVkaXRvci5naWYiCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuQWN0aW9uQ29udHJpYnV0b3JYTUwiCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciIKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbGljRm9udE5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbnRlbnRUeXBlQmluZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbnRlbnRUeXBlQmluZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotICAgICAgICAgICAgICAgIDwvZWRpdG9yPgotICAgICAgICA8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24tcG9pbnQgaWQ9ImFkZGl0aW9uYWxUZXN0cyIgbmFtZT0iJWFkZGl0aW9uYWxUZXN0cyIgc2NoZW1hPSJzY2hlbWEvYWRkaXRpb25hbFRlc3RzLmV4c2QiLz4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zY2hlbWEvYWRkaXRpb25hbFRlc3RzLmV4c2QgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zY2hlbWEvYWRkaXRpb25hbFRlc3RzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZTU4OTMuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc2NoZW1hL2FkZGl0aW9uYWxUZXN0cy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cyIgaWQ9ImFkZGl0aW9uYWxUZXN0cyIgbmFtZT0iJWFkZGl0aW9uYWxUZXN0cyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBwcm92aWRlcyBhIHdheSB0byBhZGQgZXh0cmEgdGVzdCBjYXNlcyBhbmQgc3VpdGVzIHRvIHRoZSBhbHJlYWR5IHJ1bm5pbmcgbGlzdCB3aXRob3V0IGRlY2xhcmluZyBhIHJ1bnRpbWUgZGVwZW5kZW5jeSBpbiB0aGlzIHBsdWctaW4uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ0ZXN0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InN1aXRlIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ0ZXN0Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBZGRzIGFuIGluZGl2aWR1YWwgVGVzdCBjYXNlIHRvIHJ1bi4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIFRlc3QgY2xhc3MgbmFtZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Imp1bml0LmZyYW1ld29yay5UZXN0OiIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzdWl0ZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQWRkcyBhIFRlc3RTdWl0ZSB0byBydW4uCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBUZXN0U3VpdGUgY2xhc3MgbmFtZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Imp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU6Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvTWFzdGVyUGVyZm9ybWFuY2VUZXN0U3VpdGUuamF2YSBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9NYXN0ZXJQZXJmb3JtYW5jZVRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDkxMDE0Li4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9NYXN0ZXJQZXJmb3JtYW5jZVRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVzdHMucGVyZm9ybWFuY2UuSlNQVUlQZXJmb3JtYW5jZVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkudGVzdHMucGVyZm9ybWFuY2UuQ1NTVUlQZXJmb3JtYW5jZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZXN0cy5wZXJmb3JtYW5jZS5IVE1MVUlQZXJmb3JtYW5jZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlc3RzLnBlcmZvcm1hbmNlLlNTRVVJUGVyZm9ybWFuY2VUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS50ZXN0cy5wZXJmb3JtYW5jZS5YTUxVSVBlcmZvcm1hbmNlVGVzdFN1aXRlOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXB1YmxpYyBjbGFzcyBNYXN0ZXJQZXJmb3JtYW5jZVRlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLQlwdWJsaWMgTWFzdGVyUGVyZm9ybWFuY2VUZXN0U3VpdGUoKSB7Ci0JCXN1cGVyKCJBbGwgVGVzdHMiKTsKLQotCQlhZGRUZXN0KEpTUFVJUGVyZm9ybWFuY2VUZXN0cy5zdWl0ZSgpKTsKLQkJYWRkVGVzdChDU1NVSVBlcmZvcm1hbmNlVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KEhUTUxVSVBlcmZvcm1hbmNlVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KFNTRVVJUGVyZm9ybWFuY2VUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoWE1MVUlQZXJmb3JtYW5jZVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbCgpIHsKLQkJLy8gdGhpcyBtZXRob2QgbmVlZHMgdG8gZXhpc3QsIGJ1dCBkb2Vzbid0IHJlYWxseSBkbyBhbnl0aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL1Rlc3RUdXJraXNoLmphdmEgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvVGVzdFR1cmtpc2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM5YzU0NC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvVGVzdFR1cmtpc2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoqCi0gKiBUZXN0VHVya2lzaAotICogU2VlIGh0dHA6Ly93d3cuaTE4bmd1eS5jb20vdW5pY29kZS90dXJraXNoLWkxOG4uaHRtbAotICovCi0KLXB1YmxpYyBjbGFzcyBUZXN0VHVya2lzaCB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlTdHJpbmcgdHVya2lzaExvd2VyQ2FzZSA9ICJcdTAxMzEiICsgIlx1MDA2OSI7Ci0JCVN0cmluZyB0dXJraXNoVXBwZXJDYXNlID0gIlx1MDEzMCIgKyAiXHUwMDQ5IjsKLQkJTG9jYWxlW10gbG9jYWxlcyA9IExvY2FsZS5nZXRBdmFpbGFibGVMb2NhbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxlcy5sZW5ndGg7IGkrKykgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGxvY2FsZXNbaV0pOwotCQl9Ci0JCUxvY2FsZSB0dXJraXNoTG9jYWxlID0gbmV3IExvY2FsZSgiVFIiKTsKLQkJU3RyaW5nIHRlc3RVcHBlcmNhc2UgPSB0dXJraXNoTG93ZXJDYXNlLnRvVXBwZXJDYXNlKHR1cmtpc2hMb2NhbGUpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4odHVya2lzaFVwcGVyQ2FzZS5lcXVhbHModGVzdFVwcGVyY2FzZSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9taW5vcnRvb2xzL1Rlc3RTdHJpbmcuamF2YSBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9taW5vcnRvb2xzL1Rlc3RTdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4ZmM0Ni4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvbWlub3J0b29scy9UZXN0U3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy5taW5vcnRvb2xzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogVGVzdFN0cmluZwotICovCi0KLXB1YmxpYyBjbGFzcyBUZXN0U3RyaW5nIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQotCi0JCVN0cmluZyB4bWwgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLTE2XCI/PjxtZXNzYWdlPjxzb3VyY2VVcmk+PC9zb3VyY2VVcmk+PGJvZHk+PC9ib2R5PjwvbWVzc2FnZT4iOwotCi0KLQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQlmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKGZhbHNlKTsKLQkJZmFjdG9yeS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQkJdHJ5IHsKLQkJCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCURvY3VtZW50IGRvY3VtZW50ID0gYnVpbGRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcih4bWwpKSk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnQoZG9jdW1lbnQuaGFzQ2hpbGROb2RlcygpKTsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihkb2N1bWVudCk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQljYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL21pbm9ydG9vbHMvVGVzdFN0cmluZ1V0aWxzLmphdmEgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvbWlub3J0b29scy9UZXN0U3RyaW5nVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyZTIzOC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvbWlub3J0b29scy9UZXN0U3RyaW5nVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy5taW5vcnRvb2xzOwotCi0KLQotcHVibGljIGNsYXNzIFRlc3RTdHJpbmdVdGlscyB7Ci0KLQkvKioKLQkgKiBUZXN0U3RyaW5nVXRpbHMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFRlc3RTdHJpbmdVdGlscygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIG1hdGNoaW5nIGxpdGVyYWwgcG9ydGlvbnMgb2YgYSBzdHJpbmcgd2l0aCBhbm90aGVyIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2UoU3RyaW5nIGFTdHJpbmcsIFN0cmluZyBzb3VyY2UsIFN0cmluZyB0YXJnZXQpIHsKLQkJaWYgKGFTdHJpbmcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgbm9ybWFsU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGxlbmd0aCA9IGFTdHJpbmcubGVuZ3RoKCk7Ci0JCWludCBwb3NpdGlvbiA9IDA7Ci0JCWludCBwcmV2aW91cyA9IDA7Ci0JCWludCBzcGFjZXIgPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCXdoaWxlIChwb3NpdGlvbiArIHNwYWNlciAtIDEgPCBsZW5ndGggJiYgYVN0cmluZy5pbmRleE9mKHNvdXJjZSwgcG9zaXRpb24pID4gLTEpIHsKLQkJCXBvc2l0aW9uID0gYVN0cmluZy5pbmRleE9mKHNvdXJjZSwgcHJldmlvdXMpOwotCQkJbm9ybWFsU3RyaW5nID0gbm9ybWFsU3RyaW5nICsgYVN0cmluZy5zdWJzdHJpbmcocHJldmlvdXMsIHBvc2l0aW9uKSArIHRhcmdldDsKLQkJCXBvc2l0aW9uICs9IHNwYWNlcjsKLQkJCXByZXZpb3VzID0gcG9zaXRpb247Ci0JCX0KLQkJbm9ybWFsU3RyaW5nID0gbm9ybWFsU3RyaW5nICsgYVN0cmluZy5zdWJzdHJpbmcocG9zaXRpb24sIGFTdHJpbmcubGVuZ3RoKCkpOwotCi0JCXJldHVybiBub3JtYWxTdHJpbmc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvbWlub3J0b29scy9WZXJzaW9uUmVtb3Zlci5qYXZhIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL21pbm9ydG9vbHMvVmVyc2lvblJlbW92ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlZDljNS4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvbWlub3J0b29scy9WZXJzaW9uUmVtb3Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy5taW5vcnRvb2xzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRlc3RzLnV0aWwuQ29tbW9uWE1MOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0KLQotLyoqCi0gKiBNb2RpZmllcyBwbHVnaW4ueG1sIGFuZCBmcmFnbWVudC54bWwgZmlsZXMgdG8gbm90IHJlcXVpcmUgc3BlY2lmaWMgdmVyc2lvbnMKLSAqIG9mIHRoZWlyIHBsdWdpbiBkZXBlbmRlbmNpZXMuCi0gKiAKLSAqIEBhdXRob3Igbml0aW4KLSAqLwotcHVibGljIGNsYXNzIFZlcnNpb25SZW1vdmVyIHsKLQotCWNoYXJbXSBjaGFyYnVmZiA9IG5ldyBjaGFyWzIwNDhdOwotCVN0cmluZ0J1ZmZlciBzID0gbnVsbDsKLQotCXB1YmxpYyBWZXJzaW9uUmVtb3ZlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpZiAoYXJncy5sZW5ndGggPCAxKQotCQkJbmV3IFZlcnNpb25SZW1vdmVyKCkudmlzaXQobmV3IEZpbGUoImQ6L3RhcmdldCIpKTsKLQkJZWxzZQotCQkJbmV3IFZlcnNpb25SZW1vdmVyKCkudmlzaXQobmV3IEZpbGUoYXJnc1swXSkpOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdChGaWxlIGZpbGUpIHsKLQkJLy8gU2tpcCBkaXJlY3RvcmllcyBsaWtlIG9yZy5lY2xpcHNlLiosIG9yZy5hcGFjaGUuKiwgYW5kIG9yZy5qdW5pdC4qCi0JCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkgJiYgIWZpbGUuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIm9yZy5lY2xpcHNlLiIpICYmICFmaWxlLmdldE5hbWUoKS5zdGFydHNXaXRoKCJvcmcuYXBhY2hlIikgJiYgIWZpbGUuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIm9yZy5qdW5pdCIpKSB7Ci0JCQlTdHJpbmdbXSBjb250ZW50cyA9IGZpbGUubGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50cy5sZW5ndGg7IGkrKykKLQkJCQl2aXNpdChuZXcgRmlsZShmaWxlLmdldEFic29sdXRlUGF0aCgpICsgJy8nICsgY29udGVudHNbaV0pKTsKLQkJfQotCQllbHNlIHsKLQkJCWZpeHVwRmlsZShmaWxlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpeHVwRmlsZShGaWxlIGZpbGUpIHsKLQkJLy8gb25seSBsb2FkIGFuZCBmaXh1cCBmaWxlcyBuYW1lZCBwbHVnaW4ueG1sIG9yIGZyYWdtZW50LnhtbCB1bmRlciBlY2xpcHNlXHBsdWdpbnNcWFhYWFhYWC4qCi0JCWlmICghKGZpbGUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoInBsdWdpbi54bWwiKSB8fCBmaWxlLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJmcmFnbWVudC54bWwiKSkgfHwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5pbmRleE9mKCJlY2xpcHNlXFxwbHVnaW5zXFxYWFhYWFhYLiIpID09IC0xKQotCQkJcmV0dXJuOwotCQkvLwkJU3lzdGVtLm91dC5wcmludGxuKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl0cnkgewotCQkJRG9jdW1lbnQgZG9jID0gQ29tbW9uWE1MLmdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKGZpbGUpOwotCQkJTm9kZUxpc3QgaW1wb3J0cyA9IG51bGw7Ci0JCQlpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgicGx1Z2luLnhtbCIpKQotCQkJCWltcG9ydHMgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImltcG9ydCIpOwotCQkJZWxzZSBpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiZnJhZ21lbnQueG1sIikpCi0JCQkJaW1wb3J0cyA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZnJhZ21lbnQiKTsKLQkJCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlOb2RlIGltcG9ydE5vZGUgPSBpbXBvcnRzLml0ZW0oaSk7Ci0JCQkJaWYgKGltcG9ydE5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJpbXBvcnQiKSAmJiBpbXBvcnROb2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oInZlcnNpb24iKSAhPSBudWxsKSB7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCQlpbXBvcnROb2RlLmdldEF0dHJpYnV0ZXMoKS5yZW1vdmVOYW1lZEl0ZW0oInZlcnNpb24iKTsKLQkJCQl9Ci0JCQkJaWYgKGltcG9ydE5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbSgicGx1Z2luLXZlcnNpb24iKSAhPSBudWxsKSB7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCQlpbXBvcnROb2RlLmdldEF0dHJpYnV0ZXMoKS5yZW1vdmVOYW1lZEl0ZW0oInBsdWdpbi12ZXJzaW9uIik7Ci0JCQkJfQotCQkJCWlmIChpbXBvcnROb2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oIm1hdGNoIikgIT0gbnVsbCkgewotCQkJCQlpbXBvcnROb2RlLmdldEF0dHJpYnV0ZXMoKS5yZW1vdmVOYW1lZEl0ZW0oIm1hdGNoIik7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjaGFuZ2VkKSB7Ci0JCQkJRmlsZU91dHB1dFN0cmVhbSBvc3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJQ29tbW9uWE1MLnNlcmlhbGl6ZShkb2MsIG9zdHJlYW0pOwotCQkJCW9zdHJlYW0uY2xvc2UoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1vZGlmaWVkICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihmaWxlLmdldFBhdGgoKSArICI6ICIgKyBlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGZpbGUuZ2V0UGF0aCgpICsgIjogIiArIGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL3Rlc3RTdHJpbmdYTUwuanBhZ2UgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvdGVzdFN0cmluZ1hNTC5qcGFnZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxZWFhMC4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvdGVzdFN0cmluZ1hNTC5qcGFnZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3RldC5qc3AgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy90ZXQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTFiMjFlLi4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3RldC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCINCi0JcGFnZUVuY29kaW5nPSJVVEYtOCIlPg0KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4NCi08dGl0bGU+Y29udGVudCBvZiBsb3dlcmNhc2UgdGl0bGUgdGFnczwvdGl0bGU+DQotPHTEsXRsZT5jb250ZW50IG9mIGxvd2VyY2FzZSB0aXRsZSB0YWdzIChubyBkaWFyZXNpcyBvdmVyIGkpPC90xLF0bGU+DQotPHRpdGxlPmNvbnRlbnQgb2YgdXBwZXJjYXNlIHRhZ3M8L3RpdGxlPg0KLTx0aXRsZT48L3RpdGxlPg0KLTx0aXRsZT48L3RpdGxlPg0KLTx0aXRsZT48L3RpdGxlPg0KLTx0aXRsZT48L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aT48L2k+DQotPGk+PC9pPg0KLTxpPjwvaT4NCi08aT48L2k+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy90dXJraXNoQ2FzZS5qcGFnZSBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3R1cmtpc2hDYXNlLmpwYWdlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTk2ZTYxLi4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3R1cmtpc2hDYXNlLmpwYWdlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLVN0cmluZyBzID0gIlx1MDEzMSIrIlx1MDA2OSI7Ci1zLnRvVXBwZXJDYXNlKCk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUzMjk4ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyXzEuMC4wLmphcgotYmFrCi10ZW1wCi1EaXRhTGluay5jYXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMzNhZjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ4YjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNDozNzoyMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWM2NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI0OTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6MDU6MjkgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL0RvY0J1aWxkLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9Eb2NCdWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjODllOWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL0RvY0J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLSAKLQotCVRoaXMgc2NyaXB0IGJ1aWxkIHRoZSBIZWxwIHBsdWctaW4gYnkgdHJhbnNmb3JtaW5nIHRoZSBESVRBIHNvdXJjZSBmaWxlcyBpbnRvIEhUTUwuCi0JCi0JVG8gdXNlIHRoaXMgc2NyaXB0LCB5b3UgbXVzdCBpbnN0YWxsIERJVEEtT1Qgb24geW91ciBtYWNoaW5lIGluIHRoZSBkaXJlY3RvcnkKLQlkZWZpbmVkIGJ5IHRoZSBkaXRhLm90LmRpciBwcm9wZXJ0eS4KLQkKLQlSdW4gdGhlIGRlZmF1bHQgdGFyZ2V0IGFmdGVyIHlvdSBlZGl0IHRoZSBESVRBIHNvdXJjZSBmaWxlcyB0byByZWdlbmVyYXRlIHRoZSBIVE1MLgotCQotCVRvIGN1c3RvbWl6ZSB0aGlzIHNjcmlwdCBmb3Igb3RoZXIgSGVscCBwbHVnLWlucywgbW9kaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgYXJncy5pbnB1dCBwcm9wZXJ0eQotCXRvIGJlIHRoZSBESVRBIG1hcCBmaWxlIGZvciB0aGUgcGx1Zy1pbi4KLQkKLQlOT1RFOiBUaGlzIHNjcmlwdCBhc3N1bWVzIHRoYXQgbGlua3MgdG8gc2libGluZyBIZWxwIHBsdWctaW5zIGhhdmUgc2NvcGU9InBlZXIiLCBvdGhlcndpc2UgdGhlCi0Jb3V0cHV0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUgd2lsbCBiZSBzaGlmdGVkIGluY29ycmVjdGx5LgotCQotCU5PVEU6IFRoaXMgc2NyaXB0IGFzc3VtZXMgdGhhdCB5b3UgaGFuZCBjb2RlIHlvdXIgcGx1Z2luLnhtbCBmaWxlIGluIG15cGx1Z2luLnhtbC4gVGhpcyBmaWxlCi0Jd2lsbCBiZSBjb3BpZWQgb3ZlciB0aGUgZ2VuZXJhdGVkIHBsdWdpbi54bWwgd2hpY2ggaXMgY3VycmVudGx5IG5vdCBiZWluZyBnZW5lcmF0ZWQgY29ycmVjdGx5Ci0JYnkgRElUQS1PVC4KLQkKLQlDaGFuZ2VMb2c6Ci0JMjAwNi0wNC0wNSBBcnRodXIgUnltYW4gPHJ5bWFuQGNhLmlibS5jb20+Ci0JLSBDcmVhdGVkLgotCTIwMDgtMDEtMDkgS2F0ZSBQcmljZSA8a2F0ZXBAY2EuaWJtLmNvbT4KLQktIG1vZGlmaWVkIGZvciBuZXcgRElUQS1PVCB2ZXJzaW9uCi0JMjAwOC0wNS0wNSBLYXRlIFByaWNlIDxrYXRlcEBjYS5pYm0uY29tPgotCS0gbW9kaWZpZWQgdG8gYWRkIGdlbmVyYXRpb24gb2YgcHJlLWJ1aWx0IGhlbHAgaW5kZXguIAotCS0gTXVzdCBkZWxldGUgL2luZGV4IGZvbGRlciBiZWZvcmUgcnVubmluZyBidWlsZAotLS0+Ci08cHJvamVjdCBuYW1lPSJlY2xpcHNlaGVscCIgZGVmYXVsdD0iYWxsIj4KLQotCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLm90LmRpciIgbG9jYXRpb249IkM6L0RJVEEtT1QxLjIuMiIgLz4KLQotCTxwYXRoIGlkPSJkb3N0LmNsYXNzLnBhdGgiPgotCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7ZGl0YS5vdC5kaXJ9JHtmaWxlLnNlcGFyYXRvcn1saWIke2ZpbGUuc2VwYXJhdG9yfWRvc3QuamFyIiAvPgotCTwvcGF0aD4KLQotCTx0YXNrZGVmIG5hbWU9ImludGVncmF0ZSIgY2xhc3NuYW1lPSJvcmcuZGl0YS5kb3N0LnBsYXRmb3JtLkludGVncmF0b3JUYXNrIj4KLQkJPGNsYXNzcGF0aCByZWZpZD0iZG9zdC5jbGFzcy5wYXRoIiAvPgotCTwvdGFza2RlZj4KLQk8dGFyZ2V0IG5hbWU9ImFsbCIgZGVwZW5kcz0iaW50ZWdyYXRlLCBlY2xpcHNlaGVscCI+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJpbnRlZ3JhdGUiPgotCQk8aW50ZWdyYXRlIGRpdGFkaXI9IiR7ZGl0YS5vdC5kaXJ9IiAvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSByZXZpc2UgYmVsb3cgaGVyZSAtLT4KLQk8dGFyZ2V0IG5hbWU9ImVjbGlwc2VoZWxwIj4KLQkJPGFudCBhbnRmaWxlPSIke2RpdGEub3QuZGlyfSR7ZmlsZS5zZXBhcmF0b3J9Y29uZHVjdG9yLnhtbCIgdGFyZ2V0PSJpbml0IiBkaXI9IiR7ZGl0YS5vdC5kaXJ9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmNvcHljc3MiIHZhbHVlPSJubyIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmNzc3BhdGgiIHZhbHVlPSIuLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIiIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5lY2xpcHNlLnByb3ZpZGVyIiB2YWx1ZT0iRWNsaXBzZS5vcmciIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJncy5lY2xpcHNlLnZlcnNpb24iIHZhbHVlPSIzLjMuMCIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmdzLmlucHV0IiBsb2NhdGlvbj0iWE1MQnVpbGRlcm1hcF90b2MuZGl0YW1hcCIgLz4gICAgCQkKLQkJCTxwcm9wZXJ0eSBuYW1lPSJjbGVhbi50ZW1wIiB2YWx1ZT0idHJ1ZSIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLmV4dG5hbWUiIHZhbHVlPSIuZGl0YSIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJkaXRhLnRlbXAuZGlyIiBsb2NhdGlvbj0idGVtcCIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQuZGlyIiBsb2NhdGlvbj0iIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9InRyYW5zdHlwZSIgdmFsdWU9ImVjbGlwc2VoZWxwIiAvPgotCQk8L2FudD4KLQkJPGNvcHkgZmlsZT0ibXlwbHVnaW4ueG1sIiB0b2ZpbGU9InBsdWdpbi54bWwiIG92ZXJ3cml0ZT0ieWVzIiAvPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iYnVpbGQuaW5kZXgiIGRlc2NyaXB0aW9uPSJCdWlsZHMgc2VhcmNoIGluZGV4IGZvciB0aGUgcGx1Zy1pbiIgaWY9ImVjbGlwc2UucnVubmluZyI+Ci0JICAgICA8aGVscC5idWlsZEhlbHBJbmRleCBtYW5pZmVzdD0icGx1Z2luLnhtbCIgZGVzdGluYXRpb249Ii4iLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFiYzQ5Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuNDAwLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJtYXBfdG9jLmRpdGFtYXAgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvWE1MQnVpbGRlcm1hcF90b2MuZGl0YW1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNmMzJkNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvWE1MQnVpbGRlcm1hcF90b2MuZGl0YW1hcAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgbWFwIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIE1hcC8vRU4iDQotICJtYXAuZHRkIj4NCi08bWFwIGNvbGxlY3Rpb24tdHlwZT0ic2VxdWVuY2UiIGlkPSJ4bWxlZGl0b3Jkb2N1bWVudGF0aW9uIiB0aXRsZT0iRGV2ZWxvcGluZyBYTUwgZmlsZXMiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dvcmtYTUwuZGl0YSIgbGlua2luZz0ic291cmNlb25seSIgbmF2dGl0bGU9Ildvcmtpbmcgd2l0aCBYTUwgZmlsZXMiPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X2N3b3JrWE1MIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3JlYXR4bS5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgWE1MIGZpbGVzIj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF9jY3JlYXR4bSIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGNyZXR4bWwuZGl0YSIgaWQ9InhtbGNyZXR4bWwiIG5hdnRpdGxlPSJDcmVhdGluZyBlbXB0eSBYTUwgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdGNyZXR4bWwiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV4ZHRkLmRpdGEiIG5hdnRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdGNyZXhkdGQiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV4eHNkLmRpdGEiIG5hdnRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3RjcmV4eHNkIi8+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhNTC5kaXRhIiBuYXZ0aXRsZT0iTGltaXRhdGlvbnMgb2YgWE1MIEVkaXRvciINCi10b2M9Im5vIj48L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3JsaW1pdGF0aW9uc19zbHVzaFhNTCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHR0YWcuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgWE1MIGZpbGVzIj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eGVkdHRhZyIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuZGl0YSIgbmF2dGl0bGU9IlhNTCBlZGl0b3IiPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X2N3eG1sZWR0Ii8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eHByZWZzLmRpdGEiIG5hdnRpdGxlPSJEZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzIj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eHByZWZzIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90dGFnaGlsdC5kaXRhIiBpZD0idGFnaGlsdCIgbmF2dGl0bGU9IlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHRhZ2hpbHQiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRlbmMuZGl0YSIgbmF2dGl0bGU9IlNwZWNpZnlpbmcgWE1MIGRlZmF1bHQgZW5jb2RpbmcgbGluZSBkZWxpbWl0ZXJzIj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90ZWR0ZW5jIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sZW5jLmRpdGEiIG5hdnRpdGxlPSJYTUwgYW5kIEhUTUwgZW5jb2RpbmdzIj48L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X2N4bWxlbmMiLz48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHN1Z3N0cmF0LmRpdGEiIG5hdnRpdGxlPSJTZXR0aW5nIHRoZSBYTUwgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgdXNlZCBieSBjb250ZW50IGFzc2lzdCI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90c3Vnc3RyYXQiLz48L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdGRlcy5kaXRhIiBpZD0idHhlZHRkZXMiIGxpbmtpbmc9Im5vbmUiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyI+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHhlZHRkZXMiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRkb2MuZGl0YSIgaWQ9InRlZHRkb2MiIG5hdnRpdGxlPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3RlZHRkb2MiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRzY2guZGl0YSIgaWQ9InRlZHRzY2giIG5hdnRpdGxlPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90ZWR0c2NoIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0cHJvYy5kaXRhIiBpZD0idGVkdHByb2MiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90ZWR0cHJvYyIvPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdHNyYy5kaXRhIiBpZD0idHhlZHNyYyIgbGlua2luZz0ibm9uZSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3Ij4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eGVkdHNyYyIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjZGFzdC5kaXRhIiBuYXZ0aXRsZT0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0Ij4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3R3Y2Rhc3QiLz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3bWFjcm8uZGl0YSIgaWQ9InR3bWFjcm8iIG5hdnRpdGxlPSJXb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlcyI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90d21hY3JvIi8+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRjbnN0LmRpdGEiIGlkPSJ0ZWR0Y250IiBuYXZ0aXRsZT0iRWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3RlZHRjbnN0Ii8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eHNpdHlwLmRpdGEiIG5hdnRpdGxlPSJVc2luZyB4c2k6dHlwZSI+PC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eHNpdHlwIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9yZXh0Y3RuLmRpdGEiIGlkPSJyZXh0Y3RuIiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgZG9jdW1lbnRzIHdpdGggbXVsdGlwbGUgbmFtZXNwYWNlcyI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF9yZXh0Y3RuIi8+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3eHZhbGlkLmRpdGEiIGlkPSJ4bWx2YWxpZCIgbmF2dGl0bGU9IlZhbGlkYXRpbmcgWE1MIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3R3eHZhbGlkIi8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sY2F0LmRpdGEiIGxpbmtpbmc9Im5vbmUiIG5hdnRpdGxlPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyI+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfY3htbGNhdCIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhtbGNhdC5kaXRhIiBpZD0idHhtbGNhdCIgbmF2dGl0bGU9IkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZyI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eG1sY2F0Ii8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0Z3JhbS5kaXRhIiBpZD0idGVkdGdyYW0iIG5hdnRpdGxlPSJVcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3J4bWxjYXRrZXkuZGl0YSIgaWQ9InJ4bWxjYXRrZXkiIG5hdnRpdGxlPSJYTUwgQ2F0YWxvZyBrZXlib2FyZCBzaG9ydGN1dHMiPg0KLTwvdG9waWNyZWY+DQotPGFuY2hvciBpZD0ieG1sX3Bvc3RfcnhtbGNhdGtleSIvPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvcnhtbHRvb2xza2V5LmRpdGEiIG5hdnRpdGxlPSJYTUwgZWRpdG9yIGtleWJvYXJkIHNob3J0Y3V0cyI+DQotPC90b3BpY3JlZj4NCi08YW5jaG9yIGlkPSJ4bWxfcG9zdF90ZWR0Z3JhbSIvPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9yeG1sYmljb25zLmRpdGEiIGlkPSJyaWNvbnMiIG5hdnRpdGxlPSJJY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yIj4NCi08L3RvcGljcmVmPg0KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3J4bWxiaWNvbnMiLz48L3RvcGljcmVmPg0KLTwvbWFwPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVybWFwX3RvYy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvWE1MQnVpbGRlcm1hcF90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjljODA5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVybWFwX3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJEZXZlbG9waW5nIFhNTCBmaWxlcyIgdG9waWM9InRvcGljcy9jd29ya1hNTC5odG1sIj4KLTx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIFhNTCBmaWxlcyIgaHJlZj0idG9waWNzL2N3b3JrWE1MLmh0bWwiPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfY3dvcmtYTUwiLz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgWE1MIGZpbGVzIiBocmVmPSJ0b3BpY3MvY2NyZWF0eG0uaHRtbCI+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF9jY3JlYXR4bSIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBYTUwgZmlsZXMiIGhyZWY9InRvcGljcy90Y3JldHhtbC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90Y3JldHhtbCIvPgotPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiIGhyZWY9InRvcGljcy90Y3JleGR0ZC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90Y3JleGR0ZCIvPgotPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGNyZXh4c2QuaHRtbCIvPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdGNyZXh4c2QiLz4KLTwvdG9waWM+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF9ybGltaXRhdGlvbnNfc2x1c2hYTUwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBYTUwgZmlsZXMiIGhyZWY9InRvcGljcy90eGVkdHRhZy5odG1sIj4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3R4ZWR0dGFnIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBlZGl0b3IiIGhyZWY9InRvcGljcy9jd3htbGVkdC5odG1sIj4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X2N3eG1sZWR0Ii8+Ci08dG9waWMgbGFiZWw9IkRlZmluaW5nIFhNTCBlZGl0b3IgcHJlZmVyZW5jZXMiIGhyZWY9InRvcGljcy90eHByZWZzLmh0bWwiPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHhwcmVmcyIvPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIiBocmVmPSJ0b3BpY3MvdHRhZ2hpbHQuaHRtbCIvPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHRhZ2hpbHQiLz4KLTx0b3BpYyBsYWJlbD0iU3BlY2lmeWluZyBYTUwgZGVmYXVsdCBlbmNvZGluZyBsaW5lIGRlbGltaXRlcnMiIGhyZWY9InRvcGljcy90ZWR0ZW5jLmh0bWwiPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdGVkdGVuYyIvPgotPHRvcGljIGxhYmVsPSJYTUwgYW5kIEhUTUwgZW5jb2RpbmdzIiBocmVmPSJ0b3BpY3MvY3htbGVuYy5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF9jeG1sZW5jIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHRoZSBYTUwgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgdXNlZCBieSBjb250ZW50IGFzc2lzdCIgaHJlZj0idG9waWNzL3RzdWdzdHJhdC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90c3Vnc3RyYXQiLz4KLTwvdG9waWM+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmh0bWwiPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHhlZHRkZXMiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9ucyIgaHJlZj0idG9waWNzL3RlZHRkb2MuaHRtbCIvPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdGVkdGRvYyIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiIgaHJlZj0idG9waWNzL3RlZHRzY2guaHRtbCIvPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdGVkdHNjaCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyIgaHJlZj0idG9waWNzL3RlZHRwcm9jLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3RlZHRwcm9jIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmh0bWwiPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHhlZHRzcmMiLz4KLTx0b3BpYyBsYWJlbD0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0IiBocmVmPSJ0b3BpY3MvdHdjZGFzdC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90d2NkYXN0Ii8+Ci08dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzIiBocmVmPSJ0b3BpY3MvdHdtYWNyby5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90d21hY3JvIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiIGhyZWY9InRvcGljcy90ZWR0Y25zdC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90ZWR0Y25zdCIvPgotPHRvcGljIGxhYmVsPSJVc2luZyB4c2k6dHlwZSIgaHJlZj0idG9waWNzL3R4c2l0eXAuaHRtbCIvPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfdHhzaXR5cCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBkb2N1bWVudHMgd2l0aCBtdWx0aXBsZSBuYW1lc3BhY2VzIiBocmVmPSJ0b3BpY3MvcmV4dGN0bi5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF9yZXh0Y3RuIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJWYWxpZGF0aW5nIFhNTCBmaWxlcyIgaHJlZj0idG9waWNzL3R3eHZhbGlkLmh0bWwiLz4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3R3eHZhbGlkIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvY3htbGNhdC5odG1sIj4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X2N4bWxjYXQiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nIiBocmVmPSJ0b3BpY3MvdHhtbGNhdC5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90eG1sY2F0Ii8+Ci08dG9waWMgbGFiZWw9IlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGVkdGdyYW0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgQ2F0YWxvZyBrZXlib2FyZCBzaG9ydGN1dHMiIGhyZWY9InRvcGljcy9yeG1sY2F0a2V5Lmh0bWwiLz4KLTxhbmNob3IgaWQ9InhtbF9wb3N0X3J4bWxjYXRrZXkiLz4KLTx0b3BpYyBsYWJlbD0iU291cmNlIGVkaXRvciBhbmQgWE1MIHRvb2xzIGtleWJvYXJkIHNob3J0Y3V0cyIgaHJlZj0idG9waWNzL3J4bWx0b29sc2tleS5odG1sIi8+Ci08YW5jaG9yIGlkPSJ4bWxfcG9zdF90ZWR0Z3JhbSIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iSWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvciIgaHJlZj0idG9waWNzL3J4bWxiaWNvbnMuaHRtbCIvPgotPGFuY2hvciBpZD0ieG1sX3Bvc3RfcnhtbGJpY29ucyIvPgotPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJyZWwuZGl0YW1hcCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVycmVsLmRpdGFtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYWJhMDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJyZWwuZGl0YW1hcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIG1hcCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBNYXAvL0VOIg0KLSAibWFwLmR0ZCI+DQotPG1hcCBpZD0ieG1sZWRpdG9ycmVsdGFibGUiPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV0eG1sLmRpdGEiIGlkPSJ4bWxjcmV0eG1sIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgZW1wdHkgWE1MIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGNyZXhkdGQuZGl0YSIgbmF2dGl0bGU9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV4eHNkLmRpdGEiIG5hdnRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHR0YWcuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkVkaXRpbmcgWE1MIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuZGl0YSIgbmF2dGl0bGU9IlhNTCBlZGl0b3IiPjwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0dGFnLmRpdGEiIGxpbmtpbmc9InNvdXJjZW9ubHkiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3eG1sZWR0LmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJYTUwgZWRpdG9yIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sY2F0LmRpdGEiIG5hdnRpdGxlPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRjbnN0LmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0ZG9jLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhtbGNhdC5kaXRhIiBpZD0idHhtbGNhdCIgbmF2dGl0bGU9IkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRncmFtLmRpdGEiIGlkPSJ0ZWR0Z3JhbSIgbmF2dGl0bGU9IlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sY2F0LmRpdGEiIG5hdnRpdGxlPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRjbnN0LmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0c2NoLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4bWxjYXQuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRncmFtLmRpdGEiIG5hdnRpdGxlPSJVcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiIGxpbmtpbmc9Im5vcm1hbCI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0cHJvYy5kaXRhIiBpZD0idGVkdHByb2MiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N4bWxjYXQuZGl0YSIgbmF2dGl0bGU9IlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSIgbGlua2luZz0ibm9ybWFsIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3eG1sZWR0LmRpdGEiIG5hdnRpdGxlPSJYTUwgZWRpdG9yIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3htbGNhdC5kaXRhIiBuYXZ0aXRsZT0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5IiBsaW5raW5nPSJub3JtYWwiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHd4dmFsaWQuZGl0YSIgbmF2dGl0bGU9IlZhbGlkYXRpbmcgWE1MIGZpbGVzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuZGl0YSIgbmF2dGl0bGU9IlhNTCBlZGl0b3IiPjwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV4eHNkLmRpdGEiIG5hdnRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuZGl0YSINCi1saW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iWE1MIG5hbWVzcGFjZXMiIHNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0c2NoLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmRpdGEiDQotbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IlhNTCBuYW1lc3BhY2VzIiBzY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuZGl0YSIgaWQ9InR4ZWRzcmMiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y2Rhc3QuZGl0YSIgbmF2dGl0bGU9IlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdCI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdtYWNyby5kaXRhIiBuYXZ0aXRsZT0iV29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R0YWdoaWx0LmRpdGEiIG5hdnRpdGxlPSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NkYXN0LmRpdGEiIG5hdnRpdGxlPSJVc2luZyBYTUwgY29udGVudCBhc3Npc3QiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d21hY3JvLmRpdGEiIG5hdnRpdGxlPSJXb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjZGFzdC5kaXRhIiBuYXZ0aXRsZT0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHN1Z3N0cmF0LmRpdGEiIG5hdnRpdGxlPSJYTUwgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRkb2MuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRzY2guZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdGRlcy5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0cHJvYy5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3J4bWxiaWNvbnMuZGl0YSIgbmF2dGl0bGU9Ikljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3IiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTwvbWFwPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVycmVsLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVycmVsLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwYWI1MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvWE1MQnVpbGRlcnJlbC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIHRvcGljPSJ0b3BpY3MvdGNyZXR4bWwuaHRtbCI+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIFhNTCBmaWxlcyIgaHJlZj0idG9waWNzL3RjcmV0eG1sLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzIiBocmVmPSJ0b3BpY3MvdGNyZXhkdGQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGNyZXh4c2QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBmaWxlcyIgaHJlZj0idG9waWNzL3R4ZWR0dGFnLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIGVkaXRvciIgaHJlZj0idG9waWNzL2N3eG1sZWR0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBYTUwgZmlsZXMiIGhyZWY9InRvcGljcy90eGVkdHRhZy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBlZGl0b3IiIGhyZWY9InRvcGljcy9jd3htbGVkdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy9jeG1sY2F0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzIiBocmVmPSJ0b3BpY3MvdGVkdGNuc3QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIiBocmVmPSJ0b3BpY3MvdGVkdGRvYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZyIgaHJlZj0idG9waWNzL3R4bWxjYXQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJVcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hcyIgaHJlZj0idG9waWNzL3RlZHRncmFtLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy9jeG1sY2F0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzIiBocmVmPSJ0b3BpY3MvdGVkdGNuc3QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiIgaHJlZj0idG9waWNzL3RlZHRzY2guaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2ciIGhyZWY9InRvcGljcy90eG1sY2F0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iVXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXMiIGhyZWY9InRvcGljcy90ZWR0Z3JhbS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIiBocmVmPSJ0b3BpY3MvdGVkdHByb2MuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL2N4bWxjYXQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgZWRpdG9yIiBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciIGhyZWY9InRvcGljcy90eGVkdHNyYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvY3htbGNhdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlZhbGlkYXRpbmcgWE1MIGZpbGVzIiBocmVmPSJ0b3BpY3MvdHd4dmFsaWQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgZWRpdG9yIiBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGNyZXh4c2QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgbmFtZXNwYWNlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb24iIGhyZWY9InRvcGljcy90ZWR0c2NoLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIG5hbWVzcGFjZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJVc2luZyBYTUwgY29udGVudCBhc3Npc3QiIGhyZWY9InRvcGljcy90d2NkYXN0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciIGhyZWY9InRvcGljcy90eGVkdHNyYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzIiBocmVmPSJ0b3BpY3MvdHdtYWNyby5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIiBocmVmPSJ0b3BpY3MvdHRhZ2hpbHQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJVc2luZyBYTUwgY29udGVudCBhc3Npc3QiIGhyZWY9InRvcGljcy90d2NkYXN0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXMiIGhyZWY9InRvcGljcy90d21hY3JvLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0IiBocmVmPSJ0b3BpY3MvdHdjZGFzdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgdGhlIFhNTCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0IiBocmVmPSJ0b3BpY3MvdHN1Z3N0cmF0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIGhyZWY9InRvcGljcy90eGVkdGRlcy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiIGhyZWY9InRvcGljcy90ZWR0ZG9jLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIGhyZWY9InRvcGljcy90eGVkdGRlcy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIiBocmVmPSJ0b3BpY3MvdGVkdHNjaC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyIgaHJlZj0idG9waWNzL3RlZHRwcm9jLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIGhyZWY9InRvcGljcy90eGVkdGRlcy5odG1sIi8+Ci08dG9waWMgbGFiZWw9Ikljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3IiIGhyZWY9InRvcGljcy9yeG1sYmljb25zLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1MWQ1NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IFhNTEJ1aWxkZXJtYXBfdG9jLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8sXAotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlcmluZGV4LnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRvcGljcy8qLmh0bSosXAotICAgICAgICAgICAgICAgaW5kZXgvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcyxcCi0JCSAgICAgICAqLm1hcGxpc3QsXAotICAgICAgICAgICAgICAgKi5kaXRhbWFwLFwKLQkJICAgICAgIHRvcGljcy8qLmRpdGEKLWJpbi5leGNsdWRlcyA9IERvY0J1aWxkLnhtbCxcCi0gICAgICAgICAgICAgICBteVBsdWdpbioueG1sClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9jZGF0YXNlY3Rpb24uZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9jZGF0YXNlY3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjA4NzJjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY2RhdGFzZWN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjMGRlNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2NvbGxhcHNlX2FsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2NvbW1lbnRfb2JqLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY29tbWVudF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGMyY2NiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY29tbWVudF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9kb2N0eXBlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvZG9jdHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMDBmODIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9kb2N0eXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvZXhwYW5kX2FsbC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2V4cGFuZF9hbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTJjMTRmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvZXhwYW5kX2FsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25hdHRyaWIuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uYXR0cmliLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhOTk3NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25hdHRyaWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uZWxlbS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25lbGVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhYmRkYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25lbGVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvbnJzdHJ2YWwuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9ucnN0cnZhbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NDJiOGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9ucnN0cnZhbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL3Byb2luc3Rfb2JqLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvcHJvaW5zdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDQzNmQ4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvcHJvaW5zdF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9ybGRncm1yLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvcmxkZ3Jtci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OWNhYzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9ybGRncm1yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvc3VnZ2VzdGlvbi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL3N1Z2dlc3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGVhODQ5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvc3VnZ2VzdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvX3cuY2ZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2luZGV4L193LmNmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAyODg5OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvX3cuY2ZzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2luZGV4L2RlbGV0YWJsZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9kZWxldGFibGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5M2Y0NzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2luZGV4L2RlbGV0YWJsZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2NvbnRyaWJ1dGlvbnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9jb250cmlidXRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTUyY2NmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2NvbnRyaWJ1dGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUaGlzIGlzIGEgZ2VuZXJhdGVkIGZpbGU7IGRvIG5vdCBlZGl0Lg0KLSNUdWUgTWF5IDIwIDExOjEzOjA1IEVEVCAyMDA4DQotb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlcj1vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyXG4xLjAuNDAwLnF1YWxpZmllcg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2RlcGVuZGVuY2llcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbmRleC9pbmRleGVkX2RlcGVuZGVuY2llcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQwOWQ0ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kZXBlbmRlbmNpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNUaGlzIGlzIGEgZ2VuZXJhdGVkIGZpbGU7IGRvIG5vdCBlZGl0Lg0KLSNUdWUgTWF5IDIwIDExOjEzOjA1IEVEVCAyMDA4DQotbHVjZW5lPTEuOS4xLnYyMDA4MDMwNjE4MTENCi1hbmFseXplcj1vcmcuZWNsaXBzZS5oZWxwLmJhc2VcIzMuMy4xMDAudjIwMDgwNDI1P2xvY2FsZVw9ZW4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kb2NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2luZGV4L2luZGV4ZWRfZG9jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQyMGRlMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvaW5kZXhlZF9kb2NzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotI1RoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZTsgZG8gbm90IGVkaXQuDQotI1R1ZSBNYXkgMjAgMTE6MTM6MDUgRURUIDIwMDgNCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtYTUwuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0dGFnLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Y25zdC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGNhdC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGNhdGtleS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGVuYy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3d4bWxlZHQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4cHJlZnMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3eHZhbGlkLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJvYy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY2NyZWF0eG0uaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4bWxjYXQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0c3JjLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZXh0Y3RuLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dGFnaGlsdC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGVuYy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGRvYy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGJpY29ucy5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdjZGFzdC5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0eG1sLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sdG9vbHNrZXkuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d21hY3JvLmh0bWw9MA0KLS9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Z3JhbS5odG1sPTANCi0vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4c2l0eXAuaHRtbD0wDQotL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RzdWdzdHJhdC5odG1sPTANCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvc2VnbWVudHMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW5kZXgvc2VnbWVudHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YTY5MmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2luZGV4L3NlZ21lbnRzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL215cGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9teXBsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNWZhZmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL215cGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUaGlzIGlzIHRoZSBwbHVnaW4gZm9yIGRlY2xhcmluZyB0aGUgaGVscCAgICAgICAgIC0tPgotPCEtLSBjb250cmlidXRpb25zIGZvciB1c2luZyB0aGUgdG9vbC4gICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgPHRvYyBmaWxlPSJYTUxCdWlsZGVybWFwX3RvYy54bWwiLz4KLSAgICAgICA8aW5kZXggcGF0aD0iaW5kZXgvIi8+Ci0gICAgICAKLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgICAgPGluZGV4IGZpbGU9Im9yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwiLz4gICAgIAotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5iYXNlLmx1Y2VuZVNlYXJjaFBhcnRpY2lwYW50cyI+Ci0gICAgICA8YmluZGluZyBwYXJ0aWNpcGFudElkPSJvcmcuZWNsaXBzZS5oZWxwLmJhc2UueGh0bWwiLz4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIubWFwbGlzdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLm1hcGxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjM2UyNDguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIubWFwbGlzdAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPG1hcGxpc3QgdmVyc2lvbj0iMy42LjIiPg0KLSAgPG5hdj4NCi0gICAgPG1hcCBmaWxlPSJYTUxCdWlsZGVybWFwX3RvYy5kaXRhbWFwIi8+DQotICA8L25hdj4NCi0gIDxsaW5rPg0KLSAgICA8bWFwIGZpbGU9IlhNTEJ1aWxkZXJyZWwuZGl0YW1hcCIvPg0KLSAgPC9saW5rPg0KLTwvbWFwbGlzdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlcmluZGV4LnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjE4YmEwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08aW5kZXg+Ci0gIDxlbnRyeSBrZXl3b3JkPSJYTUwgZmlsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RjcmV0eG1sLmh0bWwjdGNyZXR4bWwiIHRpdGxlPSJDcmVhdGluZyBYTUwgZmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0aW5nIGZyb20gRFREcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RjcmV4ZHRkLmh0bWwjdGNyZXhkdGQiIHRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0aW5nIGZyb20gWE1MIHNjaGVtYXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90Y3JleHhzZC5odG1sI3RjcmV4eHNkIiB0aXRsZT0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNjaGVtYXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90Y3JleHhzZC5odG1sI3RjcmV4eHNkIiB0aXRsZT0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90eGVkdHRhZy5odG1sI3R4ZWR0dGFnIiB0aXRsZT0iRWRpdGluZyBYTUwgZmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzcGVjaWZ5aW5nIGxpbmUgZGVsaW1pdGVycyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRlbmMuaHRtbCN0ZWR0ZW5jIiB0aXRsZT0iU3BlY2lmeWluZyBYTUwgZGVmYXVsdCBlbmNvZGluZyBsaW5lIGRlbGltaXRlcnMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJuYW1lc3BhY2UgaW5mb3JtYXRpb24iPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0c2NoLmh0bWwjdGVkdHNjaCIgdGl0bGU9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0cHJvYy5odG1sI3RlZHRwcm9jIiB0aXRsZT0iRWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb250ZW50IGFzc2lzdCI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3Y2Rhc3QuaHRtbCN0d2NkYXN0IiB0aXRsZT0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idGVtcGxhdGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdtYWNyby5odG1sI3R3bWFjcm8iIHRpdGxlPSJXb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmcgd2l0aCBjb25zdHJhaW50cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRjbnN0Lmh0bWwjdGVkdGNuc3QiIHRpdGxlPSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJ2YWxpZGF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHd4dmFsaWQuaHRtbCN0d3h2YWxpZCIgdGl0bGU9IlZhbGlkYXRpbmcgWE1MIGZpbGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYXNzb2NpYXRpb25zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3htbGNhdC5odG1sI2N4bWxjYXQiIHRpdGxlPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InVwZGF0aW5nIHdpdGggYXNzb2NpYXRlZCBjaGFuZ2VzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdGdyYW0uaHRtbCN0ZWR0Z3JhbSIgdGl0bGU9IlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkRURHMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0aW5nIFhNTCBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RjcmV4ZHRkLmh0bWwjdGNyZXhkdGQiIHRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic2NoZW1hcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImdlbmVyYXRpbmcgWE1MIGZpbGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGNyZXh4c2QuaHRtbCN0Y3JleHhzZCIgdGl0bGU9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iWE1MIGVkaXRvciI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlhNTCBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R4ZWR0dGFnLmh0bWwjdHhlZHR0YWciIHRpdGxlPSJFZGl0aW5nIFhNTCBmaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuaHRtbCNjd3htbGVkdCIgdGl0bGU9IlhNTCBlZGl0b3IiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwcmVmZXJlbmNlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R4cHJlZnMuaHRtbCN0eHByZWZzIiB0aXRsZT0iRGVmaW5pbmcgWE1MIGVkaXRvciBwcmVmZXJlbmNlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90dGFnaGlsdC5odG1sI3R0YWdoaWx0IiB0aXRsZT0iU2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHN1Z3N0cmF0Lmh0bWwjeG1sc291cmNlc3VnZ2VzdGlvbnN0cmF0ZWd5IiB0aXRsZT0iU2V0dGluZyB0aGUgWE1MIHNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHVzZWQgYnkgY29udGVudCBhc3Npc3QiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJEZXNpZ24gdmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmh0bWwjdHhlZHRkZXMiIHRpdGxlPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkRPQ1RZUEUgZGVjbGFyYXRpb25zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdGRvYy5odG1sI3RlZHRkb2MiIHRpdGxlPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ibmFtZXNwYWNlIGluZm9ybWF0aW9uIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdHNjaC5odG1sI3RlZHRzY2giIHRpdGxlPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdHByb2MuaHRtbCN0ZWR0cHJvYyIgdGl0bGU9IkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iU291cmNlIHZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90eGVkdHNyYy5odG1sI3R4ZWR0c3JjIiB0aXRsZT0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb250ZW50IGFzc2lzdCI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3Y2Rhc3QuaHRtbCN0d2NkYXN0IiB0aXRsZT0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyB3aXRoIGNvbnN0cmFpbnRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdGNuc3QuaHRtbCN0ZWR0Y25zdCIgdGl0bGU9IkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InVwZGF0aW5nIFhNTCBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRncmFtLmh0bWwjdGVkdGdyYW0iIHRpdGxlPSJVcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFjY2Vzc2liaWxpdHkiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9yeG1sY2F0a2V5Lmh0bWwjeG1sY2F0YWxvZ2tleWJvYXJkc2hvcnRjdXRzIiB0aXRsZT0iWE1MIENhdGFsb2cga2V5Ym9hcmQgc2hvcnRjdXRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ia2V5Ym9hcmQgc2hvcnRjdXRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvcnhtbGNhdGtleS5odG1sI3htbGNhdGFsb2drZXlib2FyZHNob3J0Y3V0cyIgdGl0bGU9IlhNTCBDYXRhbG9nIGtleWJvYXJkIHNob3J0Y3V0cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Imljb25zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvcnhtbGJpY29ucy5odG1sI3JpY29ucyIgdGl0bGU9Ikljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3IiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icHJlZmVyZW5jZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJYTUwgZWRpdG9yIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHhwcmVmcy5odG1sI3R4cHJlZnMiIHRpdGxlPSJEZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImxpbmUgZGVsaW1pdGVycyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlhNTCBmaWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRlbmMuaHRtbCN0ZWR0ZW5jIiB0aXRsZT0iU3BlY2lmeWluZyBYTUwgZGVmYXVsdCBlbmNvZGluZyBsaW5lIGRlbGltaXRlcnMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iY2hhcmFjdGVyIGVuY29kaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0ic3VwcG9ydGVkIGNoYXJhY3RlciBzZXRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3htbGVuYy5odG1sI2N4bWxlbmMiIHRpdGxlPSJYTUwgYW5kIEhUTUwgZW5jb2RpbmdzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkRPQ1RZUEUgZGVjbGFyYXRpb25zIj4KLSAgICA8ZW50cnkga2V5d29yZD0iWE1MIGVkaXRvciI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRkb2MuaHRtbCN0ZWR0ZG9jIiB0aXRsZT0iRWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9ucyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ0ZW1wbGF0ZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJ3b3JraW5nIHdpdGggcHJlZGVmaW5lZCBYTUwgY29kZSI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3bWFjcm8uaHRtbCN0d21hY3JvIiB0aXRsZT0iV29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iWE1MIGNhdGFsb2ciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N4bWxjYXQuaHRtbCNjeG1sY2F0IiB0aXRsZT0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmcgZW50cmllcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R4bWxjYXQuaHRtbCN0eG1sY2F0IiB0aXRsZT0iQWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImFjY2Vzc2liaWxpdHkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJrZXlib2FyZCBzaG9ydGN1dHMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlhNTCBlZGl0b3IiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3J4bWxjYXRrZXkuaHRtbCN4bWxjYXRhbG9na2V5Ym9hcmRzaG9ydGN1dHMiIHRpdGxlPSJYTUwgQ2F0YWxvZyBrZXlib2FyZCBzaG9ydGN1dHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImtleWJvYXJkIHNob3J0Y3V0cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlhNTCBlZGl0b3IiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9yeG1sY2F0a2V5Lmh0bWwjeG1sY2F0YWxvZ2tleWJvYXJkc2hvcnRjdXRzIiB0aXRsZT0iWE1MIENhdGFsb2cga2V5Ym9hcmQgc2hvcnRjdXRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InNob3J0Y3V0cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImtleWJvYXJkIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJYTUwgZWRpdG9yIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9yeG1sY2F0a2V5Lmh0bWwjeG1sY2F0YWxvZ2tleWJvYXJkc2hvcnRjdXRzIiB0aXRsZT0iWE1MIENhdGFsb2cga2V5Ym9hcmQgc2hvcnRjdXRzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci08L2luZGV4PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNlZDFlZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lICAgICA9IFhNTCBlZGl0b3IKLXBsdWdpblByb3ZpZGVyID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNWZhZmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gVGhpcyBpcyB0aGUgcGx1Z2luIGZvciBkZWNsYXJpbmcgdGhlIGhlbHAgICAgICAgICAtLT4KLTwhLS0gY29udHJpYnV0aW9ucyBmb3IgdXNpbmcgdGhlIHRvb2wuICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotPHBsdWdpbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgIDx0b2MgZmlsZT0iWE1MQnVpbGRlcm1hcF90b2MueG1sIi8+Ci0gICAgICAgPGluZGV4IHBhdGg9ImluZGV4LyIvPgotICAgICAgCi08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5pbmRleCI+Ci0gICAgICAgIDxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sIi8+ICAgICAKLSAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS5sdWNlbmVTZWFyY2hQYXJ0aWNpcGFudHMiPgotICAgICAgPGJpbmRpbmcgcGFydGljaXBhbnRJZD0ib3JnLmVjbGlwc2UuaGVscC5iYXNlLnhodG1sIi8+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY2NyZWF0eG0uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY2NyZWF0eG0uZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAxOTA0OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2NjcmVhdHhtLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iICAiY29uY2VwdC5kdGQiPg0KLTw/UHViIEluYz8+DQotPGNvbmNlcHQgaWQ9ImNyZWF0aW5neG1sZmlsZXMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNyZWF0aW5nIFhNTCBmaWxlczwvdGl0bGU+DQotPHNob3J0ZGVzYz5UaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gY3JlYXRpbmcgWE1MIGZpbGVzOjwvc2hvcnRkZXNjPg0KLTxjb25ib2R5PjwvY29uYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua2xpc3Q+DQotPGxpbmsgaHJlZj0idGNyZXR4bWwuZGl0YSI+PGxpbmt0ZXh0PkNyZWF0aW5nIGVtcHR5IFhNTCBmaWxlczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRjcmV4ZHRkLmRpdGEiPjxsaW5rdGV4dD5HZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIGEgRFREczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRjcmV4eHNkLmRpdGEiPjxsaW5rdGV4dD5HZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTA0KLXNjaGVtYXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtsaXN0Pg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L2NvbmNlcHQ+DQotPD9QdWIgKjAwMDAwMDA3MTg/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY2NyZWF0eG0uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY2NyZWF0eG0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY0OTA1Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2NjcmVhdHhtLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGluZyBYTUwgZmlsZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGNyZWF0aW5nIFhNTCBmaWxlczoiIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGNyZWF0aW5nIFhNTCBmaWxlczoiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRjcmV0eG1sLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRjcmV4ZHRkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRjcmV4eHNkLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3JlYXRpbmd4bWxmaWxlcyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIFhNTCBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRpbmd4bWxmaWxlcyI+PGEgbmFtZT0iY3JlYXRpbmd4bWxmaWxlcyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgWE1MIGZpbGVzPC9oMT4KLQotCi08ZGl2PjxwPlRoaXMgc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBjcmVhdGluZyBYTUwgZmlsZXM6PC9wPgotPC9kaXY+Ci0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJsaW5rbGlzdCI+Ci08ZGl2PjxhIGhyZWY9InRjcmV0eG1sLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGNyZWF0ZSBhIG5ldyBYTUwgZmlsZSB3aGljaCB5b3UgY2FuIHRoZW4gZWRpdCBpbiB0aGUgWE1MIGVkaXRvci4gWW91IGNyZWF0ZSBhIG5ldyBYTUwgZmlsZSB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLCBzbyB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoZSBraW5kIG9mIGNvbnRlbnQgaXQgY2FuIGNvbnRhaW4uIj5DcmVhdGluZyBlbXB0eSBYTUwgZmlsZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRjcmV4ZHRkLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgaWYgeW91IHdhbnQgdG8gcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBEVEQgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggeW91ciBEVEQsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyIERURC4iPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gYSBEVERzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0Y3JleHhzZC5odG1sIiB0aXRsZT0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS4iPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MCi1zY2hlbWFzPC9hPjwvZGl2PjwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWE1MLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWE1MLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NzVkYTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya1hNTC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV29ya2luZyB3aXRoIFhNTCBmaWxlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzoiIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6IiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjY3JlYXR4bS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0eGVkdHRhZy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0d3h2YWxpZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InJ4bWxiaWNvbnMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ3b3JraW5nd2l0aHhtbGZpbGVzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+V29ya2luZyB3aXRoIFhNTCBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0id29ya2luZ3dpdGh4bWxmaWxlcyI+PGEgbmFtZT0id29ya2luZ3dpdGh4bWxmaWxlcyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V29ya2luZyB3aXRoIFhNTCBmaWxlczwvaDE+Ci0KLQotPGRpdj48cD5UaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzo8L3A+Ci08L2Rpdj4KLQotPGRpdj4KLTxkaXYgY2xhc3M9ImxpbmtsaXN0Ij4KLTxkaXY+PGEgaHJlZj0iY2NyZWF0eG0uaHRtbCIgdGl0bGU9IlRoaXMgc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBjcmVhdGluZyBYTUwgZmlsZXM6Ij5DcmVhdGluZyBYTUwgZmlsZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InR4ZWR0dGFnLmh0bWwiIHRpdGxlPSJUaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZWRpdGluZyBYTUwgZmlsZXMuIj5FZGl0aW5nIFhNTCBmaWxlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHd4dmFsaWQuaHRtbCIgdGl0bGU9IldoZW4geW91IHZhbGlkYXRlIHlvdXIgWE1MIGZpbGUsIHRoZSBYTUwgdmFsaWRhdG9yIHdpbGwgY2hlY2sgdG8gc2VlIHRoYXQgeW91ciBmaWxlIGlzIHZhbGlkIGFuZCB3ZWxsLWZvcm1lZC4iPlZhbGlkYXRpbmcgWE1MIGZpbGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjeG1sY2F0Lmh0bWwiIHRpdGxlPSJXaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcyBib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLiI+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MCi1zY2hlbWE8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InJ4bWxiaWNvbnMuaHRtbCIgdGl0bGU9IlRoZSBmb2xsb3dpbmcgWE1MIGVkaXRvciBpY29ucyBhcHBlYXIgaW4gdGhlIE91dGxpbmUgYW5kIERlc2lnbiB2aWV3LiI+SWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvcjwvYT48L2Rpdj48L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya3htbC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya3htbC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmZhM2UxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmt4bWwuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiIgICJjb25jZXB0LmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08Y29uY2VwdCBpZD0id29ya2luZ3dpdGh4bWxmaWxlcyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+V29ya2luZyB3aXRoIFhNTCBmaWxlczwvdGl0bGU+DQotPHNob3J0ZGVzYz5UaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzo8L3Nob3J0ZGVzYz4NCi08Y29uYm9keT48L2NvbmJvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtsaXN0Pg0KLTxsaW5rIGhyZWY9ImNjcmVhdHhtLmRpdGEiPjxsaW5rdGV4dD5DcmVhdGluZyBYTUwgZmlsZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0eGVkdHRhZy5kaXRhIj48bGlua3RleHQ+RWRpdGluZyBYTUwgZmlsZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0d3h2YWxpZC5kaXRhIj48bGlua3RleHQ+VmFsaWRhdGluZyBYTUwgZmlsZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJjeG1sY2F0LmRpdGEiPjxsaW5rdGV4dD5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwNCi1zY2hlbWE8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJyeG1sYmljb25zLmRpdGEiPjxsaW5rdGV4dD5JY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yPC9saW5rdGV4dD4NCi08L2xpbms+DQotPC9saW5rbGlzdD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC9jb25jZXB0Pg0KLTw/UHViICowMDAwMDAwODcxPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxjYXQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGNhdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGVmYTRmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGNhdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3htbGNhdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzDQotYm91bmQgYnkgYW55IHN0cnVjdHVyYWwgcnVsZXMgY29udGFpbmVkIGluIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS4gVG8gYmUgY29uc2lkZXJlZA0KLWEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLA0KLWFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGNhdGFsb2c8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPmFzc29jaWF0aW9uczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5UaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB3YXlzIHRvIGFzc29jaWF0ZSBYTUwgZmlsZXMgd2l0aCBEVERzIG9yIFhNTCBzY2hlbWFzLjwvcD4NCi08b2w+DQotPGxpPkRpcmVjdCBhc3NvY2lhdGlvbiAtIFRoZSBYTUwgZmlsZSBjb250YWlucyBlaXRoZXIgdGhlIG5hbWUgb2YgYSBEVEQgaW4NCi1pdHMgZG9jdHlwZSBkZWNsYXJhdGlvbiAoZm9yIGV4YW1wbGUsICZsdDshRE9DVFlQRSByb290LWVsZW1lbnQgU1lTVEVNICI8dmFybmFtZT5kdGRmaWxlLmR0ZDwvdmFybmFtZT4iDQotPiwgd2hlcmUgPHZhcm5hbWU+ZHRkZmlsZS5kdGQ8L3Zhcm5hbWU+IGlzIHRoZSBuYW1lIG9mIHRoZSBEVEQgZmlsZSkgb3IgaXQNCi1jb250YWlucyB0aGUgcGF0aCBvZiBhbiBYTUwgc2NoZW1hIGluIHRoZSBzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgb2YgdGhlDQotWE1MIGZpbGUgcm9vdCBlbGVtZW50IChmb3IgZXhhbXBsZSwgJmx0O3hzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tLzx2YXJuYW1lPnNjaGVtYS54c2Q8L3Zhcm5hbWU+Ij4sDQotd2hlcmUgIDx2YXJuYW1lPnNjaGVtYS54c2Q8L3Zhcm5hbWU+IGlzIHRoZSBuYW1lIG9mIHRoZSBYTUwgc2NoZW1hLjwvbGk+DQotPGxpPlhNTCBDYXRhbG9nIGVudHJ5IC0gWW91IGNhbiByZWdpc3RlciBEVEQgYW5kIFhNTCBzY2hlbWEgZmlsZXMgaW4gdGhlIFhNTA0KLUNhdGFsb2cgYW5kIGFzc29jaWF0ZSB0aGVtIHdpdGggYSAgS2V5IHRoYXQgcmVwcmVzZW50cyB0aGVtLiBZb3UgY2FuIHRoZW4NCi1yZWZlciB0byBhIERURCBvciBYTUwgc2NoZW1hIGZpbGUgS2V5IGZyb20gYW4gWE1MIGZpbGUgaW5zdGVhZCBvZiByZWZlcnJpbmcNCi1kaXJlY3RseSB0byB0aGUgRFREIG9yIFhNTCBzY2hlbWEgZmlsZS4gQW4gWE1MIENhdGFsb2cgZW50cnkgY29udGFpbnMgdHdvDQotcGFydHMgLSB0aGUgS2V5ICh3aGljaCByZXByZXNlbnRzIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSkgYW5kIGEgVVJJICh3aGljaA0KLWNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBsb2NhdGlvbikuPC9saT4NCi08L29sPg0KLTxzZWN0aW9uPjx0aXRsZT5Ib3cgYW4gYXNzb2NpYXRpb24gd29ya3M8L3RpdGxlPjxiPkFzc29jaWF0aW5nIGFuIFhNTCBmaWxlDQotd2l0aCBhIERURCA8L2I+PHA+SWYgYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFRELCBhIERPQ1RZUEUgdGFnIHN1Y2gNCi1hcyB0aGUgZm9sbG93aW5nIG9uZSBpcyBpbmNsdWRlZCBpbiB0aGUgWE1MIGZpbGU6PGNvZGVibG9jaz4mbHQ7IURPQ1RZUEUgcm9vdC1uYW1lIFBVQkxJQyAiPHZhcm5hbWU+SW52b2ljZUlkPC92YXJuYW1lPiIgIjx2YXJuYW1lPkM6XG15ZHRkc1xJbnZvaWNlLmR0ZDwvdmFybmFtZQ0KLT4iPg0KLTwvY29kZWJsb2NrPjwvcD48cD5JbnZvaWNlSWQgaXMgdGhlIHB1YmxpYyBpZGVudGlmaWVyIG9mIHRoZSBEVEQgZmlsZS4gSXQNCi1pcyB1c2VkIHRvIGFzc29jaWF0ZSB0aGUgWE1MIGZpbGUgd2l0aCBhIERURCBmaWxlIChpbiB0aGlzIGNhc2UsIHRoZSBEVEQgZmlsZQ0KLWlzIEludm9pY2UuZHRkKS4gSWYgdGhlIHB1YmxpYyBpZGVudGlmaWVyIEludm9pY2VJZCBjb3JyZXNwb25kcyB0byB0aGUgS2V5DQotb2YgdGhlIFhNTCBDYXRhbG9nIGVudHJ5IGZvciBJbnZvaWNlLmR0ZCwgdGhlbiB0aGUgVTw/UHViIENhcmV0Pz5SSSBvZiB0aGUNCi1YTUwgQ2F0YWxvZyBlbnRyeSAod2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvY2F0aW9uIG9mIEludm9pY2UuZHRkKQ0KLWlzIHVzZWQgdG8gbG9jYXRlIHRoZSBEVEQuIE90aGVyd2lzZSwgdGhlIERPQ1RZUEUncyBzeXN0ZW0gaWRlbnRpZmllciAoIkM6XG15ZHRkc1xJbnZvaWNlLmR0ZCIpLA0KLXdoaWNoIHJlZmVycyBkaXJlY3RseSB0byB0aGUgZmlsZSBzeXN0ZW0gbG9jYXRpb24gb2YgdGhlIERURCwgaXMgdXNlZCB0byBsb2NhdGUNCi10aGUgRFRELjwvcD48bm90ZT5Zb3UgY2FuIGFsc28gdXNlIGEgc3lzdGVtIGlkZW50aWZpZXIgYXMgYSBLZXkgaW4gYW4gWE1MDQotQ2F0YWxvZyBlbnRyeS4gSWYgeW91IHVzZSBhIHN5c3RlbSBpZGVudGlmaWVyIGFzIGEgS2V5LCBhIERPQ1RZUEUgdGFnIHN1Y2gNCi1hcyB0aGUgZm9sbG93aW5nIG9uZSBpcyBpbmNsdWRlZCBpbiBhbiBYTUwgZmlsZTo8L25vdGU+PGNvZGVibG9jaz4mbHQ7IURPQ1RZUEUgUm9vdC1uYW1lIFNZU1RFTSAiTXlEVEQuZHRkIj4gPC9jb2RlYmxvY2s+PHA+d2hlcmUNCi1NeURURC5kdGQgaXMgdGhlIHN5c3RlbSBpZGVudGlmaWVyIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIEtleSBvZiBhbiBYTUwgQ2F0YWxvZw0KLWVudHJ5LjwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PGI+QXNzb2NpYXRpbmcgYW4gWE1MIGZpbGUgd2l0aCBhbiBYTUwgc2NoZW1hPC9iPjxwPklmIGFuIFhNTCBmaWxlDQotaXMgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBzY2hlbWEsIG9uZSBvciBtb3JlIHNjaGVtYSBsb2NhdGlvbiBhdHRyaWJ1dGVzIGFyZQ0KLWluY2x1ZGVkIGluIHRoZSBYTUwgZmlsZS4gVGhlIGluZm9ybWF0aW9uIGluIHRoZSBzY2hlbWFMb2NhdGlvbiBpcyBwcm92aWRlZA0KLWFzIGEgImhpbnQiIHRvIHRoZSBYTUwgcHJvY2Vzc29yLiBUaGUgZm9sbG93aW5nIGV4YW1wbGVzIHNob3cgc2NoZW1hTG9jYXRpb24NCi1hdHRyaWJ1dGVzOjwvcD48cD4gPGI+RXhhbXBsZSAxIDwvYj48Y29kZWJsb2NrPiZsdDtwdXJjaGFzZU9yZGVyIHhtbG5zPSJodHRwOi8vd3d3LmlibS5jb20iDQoteHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20gQzpcbXlzY2hlbWFzXFB1cmNoYXNlT3JkZXIueHNkIj4NCi0mbHQ7c2hpcFRvIGNvdW50cnk9IlVTIj4NCi0uLi48L2NvZGVibG9jaz4gICAgPC9wPjxwPjxiPkV4YW1wbGUgMiA8L2I+PGNvZGVibG9jaz4mbHQ7cHVyY2hhc2VPcmRlciB4bWxucz0iaHR0cDovL3d3dy5pYm0uY29tIg0KLXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIFBPLnhzZCI+DQotJmx0O3NoaXBUbyBjb3VudHJ5PSJVUyI+DQotLi4uLjwvY29kZWJsb2NrPiAgPC9wPjxwPkluIEV4YW1wbGUgMSwgdGhlIHNjaGVtYUxvY2F0aW9uICdoaW50JyAoJ0M6XG15c2NoZW1hc1xQdXJjaGFzZU9yZGVyLnhzZCcpDQotcmVmZXJzIGRpcmVjdGx5IHRvIHRoZSBmaWxlIHN5c3RlbSBsb2NhdGlvbiBvciBVUkkgb2YgdGhlIFhNTCBzY2hlbWEuIEluIHRoaXMNCi1jYXNlLCB0aGUgc2NoZW1hIGZpbGUgd2lsbCBiZSBsb2NhdGVkIGJ5IHRoZSBYTUwgcHJvY2Vzc29yIGRpcmVjdGx5LjwvcD48cD5Jbg0KLUV4YW1wbGUgMiwgdGhlIHNjaGVtYUxvY2F0aW9uICdoaW50JyAoJ1BPLnhzZCcpIHJlZmVycyB0byBhbiBYTUwgQ2F0YWxvZyBlbnRyeS4NCi1QTy54c2QgY29ycmVzcG9uZHMgdG8gdGhlICA8dmFybmFtZT5LZXk8L3Zhcm5hbWU+IG9mIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeQ0KLWZvciBQdXJjaGFzZU9yZGVyLnhzZCwgYW5kIHRoZSBVUkkgb2YgdGhlIFhNTCBDYXRhbG9nIGVudHJ5ICh3aGljaCBjb250YWlucw0KLWluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhdGlvbiBvZiBQdXJjaGFzZU9yZGVyLnhzZCkgd2lsbCBiZSB1c2VkIHRvIGxvY2F0ZWQNCi10aGUgWE1MIHNjaGVtYS48L3A+PHA+SW4gYm90aCBleGFtcGxlcywgPGNvZGVwaD5odHRwOi8vd3d3LmlibS5jb208L2NvZGVwaD4gaW4NCi10aGUgPGNvZGVwaD54c2k6c2NoZW1hTG9jYXRpb248L2NvZGVwaD4gdGFnIGlzIGEgVVJJIHRoYXQgaWRlbnRpZmllcyB0aGUgbmFtZXNwYWNlDQotZm9yIHRoZSBYTUwgc2NoZW1hLjwvcD48cD5Zb3UgY2FuIGFsc28gdXNlIGEgbmFtZXNwYWNlIGFzIGEgS2V5IGZvciBhbiBYTUwNCi1DYXRhbG9nIGVudHJ5LiBJZiB5b3UgdXNlIGEgbmFtZXNwYWNlIGFzIGEgS2V5LCBhIHNjaGVtYUxvY2F0aW9uIHRhZyBzdWNoDQotYXMgdGhlIGZvbGxvd2luZyBvbmUgaXMgaW5jbHVkZWQgaW4gYW4gWE1MIGZpbGU6PGNvZGVibG9jaz4mbHQ7cHVyY2hhc2VPcmRlciB4bWxuczo9Ind3dy5pYm0uY29tIg0KLXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIHBvL3hzZC9QdXJjaGFzZU9yZGVyLnhzZCAiPjwvY29kZWJsb2NrPjwvcD48cD5UaGUNCi1zY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgcG9pbnRzIHRvIGJvdGggdGhlIEtleSBhbmQgdGhlIGFjdHVhbCBsb2NhdGlvbiBvZg0KLXRoZSBzY2hlbWEuPC9wPjxwPjxiPkRURCBvciBYTUwgc2NoZW1hIHJlc2lkZXMgb24gYSByZW1vdGUgc2VydmVyPC9iPjwvcD48cD5TZXZlcmFsDQotZnVuY3Rpb25zIGluIHRoZSBYTUwgZWRpdG9yLCBzdWNoIGFzIHZhbGlkYXRpb24gYW5kIGNvbnRlbnQgYXNzaXN0LCByZXF1aXJlDQotdGhlIGF2YWlsYWJpbGl0eSBvZiBhIERURCBvciBhbiBYTUwgc2NoZW1hLiBUaGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHByb3ZpZGVzDQotdXNhZ2UgaW5mb3JtYXRpb24gZm9yIGNhc2VzIHdoZW4gdGhlIERURCBvciBYTUwgc2NoZW1hIHJlc2lkZXMgb24geW91ciBsb2NhbA0KLW1hY2hpbmUuIEhvd2V2ZXIsIGluIG1hbnkgY2FzZXMsIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBjYW4gcmVzaWRlIG9uIGEgcmVtb3RlDQotc2VydmVyLCBmb3IgZXhhbXBsZTo8L3A+PHA+PGNvZGVwaD4mbHQ7IURPQ1RZUEUgQ2F0YWxvZyBQVUJMSUMgImFiYy9DYXRhbG9nIg0KLSJodHRwOi8veHl6LmFiYy5vcmcvZHRkcy9jYXRhbG9nLmR0ZCI+PC9jb2RlcGg+PC9wPjxwPk5vcm1hbGx5LCB0aGlzIGNhc2UNCi1wb3NlcyBubyBwcm9ibGVtLCBiZWNhdXNlIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlDQotcmVtb3RlIHNlcnZlci4gSG93ZXZlciwgaWYgeW91IGFyZSBiZWhpbmQgYSBmaXJld2FsbCwgYW5kIGRvIG5vdCBoYXZlIGEgU09DS1NpZmllZA0KLXN5c3RlbSwgdGhlIHdvcmtiZW5jaCBjdXJyZW50bHkgZG9lcyBub3QgcHJvdmlkZSBhIHdheSBmb3IgeW91IHRvIHNwZWNpZnkNCi1hIHNvY2tzIHNlcnZlciBmb3IgcmV0cmlldmluZyBhIERURCBvciBYTUwgc2NoZW1hLiBJZiB5b3UgYXJlIHVuYWJsZSB0byBTT0NLU2lmeQ0KLXlvdXIgc3lzdGVtLCB0aGUgd29ya2Fyb3VuZCBmb3IgdGhpcyBwcm9ibGVtIGlzIHRvIHJldHJpZXZlIGEgY29weSBvZiB0aGUNCi1EVEQgb3IgWE1MIHNjaGVtYSAodXNpbmcgYSBXZWIgYnJvd3NlciwgZm9yIGV4YW1wbGUpIGFuZCBzYXZlIHRoYXQgY29weSBvbg0KLXlvdXIgbG9jYWwgbWFjaGluZS4gVGhlbiwgeW91IGNhbiBlaXRoZXIgcGxhY2UgYSBsb2NhbCBjb3B5IGluIHRoZSBzYW1lIHByb2plY3QNCi1hcyB5b3VyIFhNTCBmaWxlLCBvciB1c2UgdGhlIFhNTCBDYXRhbG9nIHRvIGFzc29jaWF0ZSBhIHB1YmxpYyBpZGVudGlmaWVyDQotd2l0aCB0aGUgRFREJ3MgKGxvY2FsKSBsb2NhdGlvbi48L3A+PG5vdGU+SWYgeW91IGhhdmUgYW4gWE1MIGZpbGUgYXNzb2NpYXRlZA0KLXdpdGggYW4gWE1MIHNjaGVtYSBvciBEVEQgdGhhdCBpcyBlbHNld2hlcmUgaW4gdGhlIG5ldHdvcmssIGFuZCB5b3UgYXJlIHdvcmtpbmcNCi1vbiBhIG1hY2hpbmUgZGlzY29ubmVjdGVkIGZyb20gdGhlIG5ldHdvcmssIHlvdSBjYW4gZm9sbG93IHRoZSBzdGVwcyBkZXNjcmliZWQNCi1wcmV2aW91c2x5IGlmIHlvdSB3YW50IHRvIHVzZSBjb250ZW50IGFzc2lzdCBvciB2YWxpZGF0ZSB5b3VyIFhNTCBmaWxlLiAgPC9ub3RlPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+QWR2YW50YWdlcyBvZiBYTUwgQ2F0YWxvZyBlbnRyeSBhc3NvY2lhdGlvbnM8L3RpdGxlPjxwPklmDQoteW91IGNyZWF0ZSBhIGRpcmVjdCBhc3NvY2lhdGlvbiBiZXR3ZWVuIGFuIFhNTCBmaWxlIGFuZCBhbiBYTUwgc2NoZW1hIG9yIERURA0KLWZpbGUsIGFueSB0aW1lIHlvdSBjaGFuZ2UgdGhlIGxvY2F0aW9uIG9mIHRoZSBzY2hlbWEgb3IgRFREIHlvdSBoYXZlIHRvIHRyYWNrDQotZG93biBhbmQgdXBkYXRlIGFsbCBvZiB0aGUgcmVmZXJlbmNpbmcgWE1MIGZpbGVzIHdpdGggdGhlIG5ldyBsb2NhdGlvbiBvZg0KLXRoZSBEVEQgb3Igc2NoZW1hLiBJZiwgaG93ZXZlciwgeW91IGFzc29jaWF0ZSBhbiBYTUwgZmlsZSB3aXRoIGFuIFhNTCBzY2hlbWENCi1vciBEVEQgS2V5LCB0aGVuLCB3aGVuIHlvdSBjaGFuZ2UgdGhlIGxvY2F0aW9uIG9mIHRoZSBzY2hlbWEgb3IgRFRELCB5b3Ugb25seQ0KLWhhdmUgdG8gdXBkYXRlIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeSwgaW5zdGVhZCBvZiBlYWNoIGluZGl2aWR1YWwgWE1MIGZpbGUuPC9wPjxwPkZvcg0KLWV4YW1wbGUsIHlvdSBoYXZlIGEgRFREIGNhbGxlZCBCdWlsZGluZy5kdGQsIHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCBmaXZlDQotWE1MIGZpbGVzIC0gT2ZmaWNlLnhtbCwgSG91c2UueG1sLCBBcGFydG1lbnQueG1sLCBCYW5rLnhtbCwgYW5kIFBvc3RPZmZpY2UueG1sLg0KLVlvdSBtb3ZlIHRoZSBEVEQgZmlsZSBCdWlsZGluZy5kdGQgdG8gYSBuZXcgbG9jYXRpb24uIElmIHlvdSBoYXZlIGEgZGlyZWN0aW9uDQotYXNzb2NpYXRpb24gYmV0d2VlbiBCdWlsZGluZy5kdGQgYW5kIGFsbCB0aGUgWE1MIGZpbGVzLCB5b3Ugd2lsbCBoYXZlIHRvIHVwZGF0ZQ0KLXRoZSAmbHQ7RE9DVFRZUEU+IGRlY2xhcmF0aW9uIGluIGVhY2ggWE1MIGZpbGUgdG8gcmVmbGVjdCB0aGUgbmV3IGxvY2F0aW9uDQotb2YgQnVpbGRpbmcuZHRkLiBJZiwgaG93ZXZlciwgeW91IGhhdmUgYW4gWE1MIENhdGFsb2cgYXNzb2NpYXRpb24sIGFuZCBhbGwNCi10aGUgWE1MIGZpbGVzIGp1c3QgcmVmZXIgdG8gdGhlIEtleSBvZiBCdWlsZGluZy5kdGQsIHRoZW4geW91IG9ubHkgaGF2ZSB0bw0KLXVwZGF0ZSB0aGUgVVJJIGFuZCBhbGwgdGhlIFhNTCBmaWxlcyB3aWxsIHBvaW50IHRvIHRoZSBuZXcgbG9jYXRpb24gb2YgQnVpbGRpbmcuZHRkLjwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPlVwZGF0aW5nIGFuIGVudHJ5IGluIHRoZSBYTUwgQ2F0YWxvZzwvdGl0bGU+PHA+QWZ0ZXIgeW91IGhhdmUNCi11cGRhdGVkIGFuIGVudHJ5IGluIHRoZSBYTUwgQ2F0YWxvZywgeW91IG1pZ2h0IG5lZWQgdG8gcmVmcmVzaCB0aGUgWE1MIGVkaXRvcg0KLXZpZXcgc28gdGhhdCBpdCB1c2VzIHRoZSBuZXcgaW5mb3JtYXRpb24uIFRvIGRvIHRoaXMsIGNsaWNrIHRoZSA8dWljb250cm9sPlJlbG9hZA0KLURlcGVuZGVuY2llczwvdWljb250cm9sPiB0b29sYmFyIGJ1dHRvbiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL3JsZGdybXIuZ2lmIj4NCi08YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgUmVsb2FkIERlcGVuZGVuY2llcyB0b29sYmFyIGJ1dHRvbjwvYWx0PjwvaW1hZ2U+IGFuZA0KLXRoZSB2aWV3IHdpbGwgYmUgdXBkYXRlZCB1c2luZyB0aGUgY3VycmVudCBYTUwgQ2F0YWxvZyBzZXR0aW5ncy4gWW91IG9ubHkNCi1uZWVkIHRvIHJlZnJlc2ggdGhlIFhNTCBlZGl0b3IgdmlldyB3aGVuIHlvdSBoYXZlIGFuIFhNTCBmaWxlIG9wZW4gdGhhdCByZWZlcmVuY2VzDQotdGhlIFhNTCBDYXRhbG9nIGVudHJ5IHRoYXQgd2FzIHVwZGF0ZWQuPC9wPjxwPkZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlcg0KLXRvIHRoZSByZWxhdGVkIHRhc2tzLjwvcD48L3NlY3Rpb24+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCi08P1B1YiAqMDAwMDAwODM1OT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sZW5jLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxlbmMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVmNzRkOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxlbmMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImN4bWxlbmMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlhNTCBhbmQgSFRNTCBlbmNvZGluZ3M8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlhNTCBhbmQgSFRNTCBlbmNvZGluZ3M8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+RW5jb2RpbmdzIGVuYWJsZSB5b3UgdG8gc3BlY2lmeSB3aGF0IGNoYXJhY3RlciBlbmNvZGluZyB5b3VyIHRleHQNCi1pcyBpbi48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9ImN4bWxlbmN8MXxjaGFyYWN0ZXJlbmNvZGluZ3RleHRpbmZpbGVzIiBzdGF0dXM9ImNoYW5nZWQiPmNoYXJhY3Rlcg0KLWVuY29kaW5nPGluZGV4dGVybT5zdXBwb3J0ZWQgY2hhcmFjdGVyIHNldHM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+VGhlIElBTkEgbmFtZSBpcyB1c2VkIGluIHRoZSBlbmNvZGluZyBzdGF0ZW1lbnQgb2YgYW4gWE1MIGZpbGUsIG9yIGNoYXJzZXQNCi1kaXJlY3RpdmUgaW4gYW4gSFRNTCBmaWxlLjwvcD4NCi08cD5UaGUgSFRNTCBhbmQgWE1MIGVkaXRvcnMgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGVuY29kaW5nczo8L3A+DQotPHRhYmxlIHJvd2hlYWRlcj0iZmlyc3Rjb2wiPg0KLTx0Z3JvdXAgY29scz0iMiI+PGNvbHNwZWMgY29sbmFtZT0iQ09MU1BFQzAiLz48Y29sc3BlYyBjb2xuYW1lPSJDT0xTUEVDMSIvPg0KLTx0aGVhZD4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCIgdmFsaWduPSJ0b3AiPiA8cD48Yj5YTUwgRW5jb2RpbmcgKElBTkEgTmFtZSk8L2I+PC9wPiA8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMSIgdmFsaWduPSJ0b3AiPiA8cD48Yj5EZXNjcmlwdGlvbjwvYj48L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPC90aGVhZD4NCi08dGJvZHk+DQotPHJvdz4NCi08ZW50cnk+IDxwPkJJRzU8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5CaWc1LCBUcmFkaXRpb25hbCBDaGluZXNlPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5FVUMtSlA8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5FVUMgZW5jb2RpbmcsIEphcGFuZXNlPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5FVUMtS1I8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5FVUMgZW5jb2RpbmcsIEtvcmVhbjwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT5HQjE4MDMwPC9lbnRyeT4NCi08ZW50cnk+TmF0aW9uYWwgU3RhbmRhcmQsIENoaW5lc2U8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5JU08tMjAyMi1KUDwvcD4gPC9lbnRyeT4NCi08ZW50cnk+IDxwPklTTyAyMDIyLCBKYXBhbmVzZTwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+SVNPLTIwMjItS1I8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5JU08gMjAyMiwgS29yZWFuPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5JU08tODg1OS0xPC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+SVNPIExhdGluLTE8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+SVNPLTg4NTktMjwvZW50cnk+DQotPGVudHJ5PkNlbnRyYWwvRWFzdCBFdXJvcGVhbiAoU2xhdmljKTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+SVNPLTg4NTktMzwvZW50cnk+DQotPGVudHJ5PlNvdXRoZXJuIEV1cm9wZWFuPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT5JU08tODg1OS00PC9lbnRyeT4NCi08ZW50cnk+SVNPIDg4NTktNCwgQ3lyaWxsaWM8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PklTTy04ODU5LTU8L2VudHJ5Pg0KLTxlbnRyeT5JU08gODg1OS01LCBDeXJpbGxpYzwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPklTTy04ODU5LTY8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5BcmFiaWMgKExvZ2ljYWwpPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PklTTy04ODU5LTc8L2VudHJ5Pg0KLTxlbnRyeT5HcmVlazwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPklTTy04ODU5LTg8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5IZWJyZXcgKFZpc3VhbCkgKGVuY29kaW5nIHN1cHBvcnRlZCwgYnV0IG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFBhZ2UNCi1EZXNpZ25lciBEZXNpZ24gcGFnZSk8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+SVNPLTg4NTktOTwvZW50cnk+DQotPGVudHJ5PlR1cmtpc2g8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5TSElGVF9KSVM8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5TaGlmdC1KSVMsIEphcGFuZXNlPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PlRJUy02MjA8L2VudHJ5Pg0KLTxlbnRyeT5USVNJLCBUaGFpPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+VVMtQVNDSUk8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5VUyBBU0NJSTwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+VVRGLTg8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5JU08gMTA2NDYvVW5pY29kZSwgb25lLWJ5dGUgZW5jb2Rpbmc8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPlVURi0xNjwvcD4gPC9lbnRyeT4NCi08ZW50cnk+IDxwPklTTyAxMDY0Ni9Vbmljb2RlLCB0d28tYnl0ZSBlbmNvZGluZzwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+VVRGLTE2QkU8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5Vbmljb2RlIEJpZ0VuZGlhbjwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+VVRGLTE2TEU8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5Vbmljb2RlIExpdHRsZUVuZGlhbjwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCI+PHA+V0lORE9XUy0zMUo8L3A+PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzEiPjxwPkphcGFuZXNlLCBXaW5kb3dzLTMxSjwvcD48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5XSU5ET1dTLTEyNTU8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5IZWJyZXc8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPldJTkRPV1MtMTI1NjwvcD4gPC9lbnRyeT4NCi08ZW50cnk+IDxwPkFyYWJpYzwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08L3Rib2R5Pg0KLTwvdGdyb3VwPg0KLTwvdGFibGU+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxlbmMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGVuYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmE1Nzc0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGVuYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlhNTCBhbmQgSFRNTCBlbmNvZGluZ3MiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iRW5jb2RpbmdzIGVuYWJsZSB5b3UgdG8gc3BlY2lmeSB3aGF0IGNoYXJhY3RlciBlbmNvZGluZyB5b3VyIHRleHQgaXMgaW4uIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkVuY29kaW5ncyBlbmFibGUgeW91IHRvIHNwZWNpZnkgd2hhdCBjaGFyYWN0ZXIgZW5jb2RpbmcgeW91ciB0ZXh0IGlzIGluLiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNoYXJhY3RlciBlbmNvZGluZywgc3VwcG9ydGVkIGNoYXJhY3RlciBzZXRzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iY2hhcmFjdGVyIGVuY29kaW5nLCBzdXBwb3J0ZWQgY2hhcmFjdGVyIHNldHMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImN4bWxlbmMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5YTUwgYW5kIEhUTUwgZW5jb2RpbmdzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjeG1sZW5jIj48YSBuYW1lPSJjeG1sZW5jIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5YTUwgYW5kIEhUTUwgZW5jb2RpbmdzPC9oMT4KLQotCi0KLQotPGRpdj48cD5FbmNvZGluZ3MgZW5hYmxlIHlvdSB0byBzcGVjaWZ5IHdoYXQgY2hhcmFjdGVyIGVuY29kaW5nIHlvdXIgdGV4dAotaXMgaW4uPC9wPgotCi08cD5UaGUgSUFOQSBuYW1lIGlzIHVzZWQgaW4gdGhlIGVuY29kaW5nIHN0YXRlbWVudCBvZiBhbiBYTUwgZmlsZSwgb3IgY2hhcnNldAotZGlyZWN0aXZlIGluIGFuIEhUTUwgZmlsZS48L3A+Ci0KLTxwPlRoZSBIVE1MIGFuZCBYTUwgZWRpdG9ycyBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgZW5jb2RpbmdzOjwvcD4KLQotCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+Ci08dGhlYWQgYWxpZ249ImxlZnQiPgotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAwNzIiPiA8cD48c3Ryb25nPlhNTCBFbmNvZGluZyAoSUFOQSBOYW1lKTwvc3Ryb25nPjwvcD4KLSA8L3RoPgotCi08dGggdmFsaWduPSJ0b3AiIGlkPSJOMTAwODQiPiA8cD48c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+PC9wPgotIDwvdGg+Ci0KLTwvdHI+Ci0KLTwvdGhlYWQ+Ci0KLTx0Ym9keT4KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMEEyIiBoZWFkZXJzPSJOMTAwNzIgIj4gPHA+QklHNTwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBBMiBOMTAwODQgIj4gPHA+QmlnNSwgVHJhZGl0aW9uYWwgQ2hpbmVzZTwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDBDMiIgaGVhZGVycz0iTjEwMDcyICI+IDxwPkVVQy1KUDwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBDMiBOMTAwODQgIj4gPHA+RVVDIGVuY29kaW5nLCBKYXBhbmVzZTwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDBFMiIgaGVhZGVycz0iTjEwMDcyICI+IDxwPkVVQy1LUjwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBFMiBOMTAwODQgIj4gPHA+RVVDIGVuY29kaW5nLCBLb3JlYW48L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAxMDIiIGhlYWRlcnM9Ik4xMDA3MiAiPkdCMTgwMzA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDEwMiBOMTAwODQgIj5OYXRpb25hbCBTdGFuZGFyZCwgQ2hpbmVzZTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMTE2IiBoZWFkZXJzPSJOMTAwNzIgIj4gPHA+SVNPLTIwMjItSlA8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxMTYgTjEwMDg0ICI+IDxwPklTTyAyMDIyLCBKYXBhbmVzZTwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDEzNiIgaGVhZGVycz0iTjEwMDcyICI+IDxwPklTTy0yMDIyLUtSPC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTM2IE4xMDA4NCAiPiA8cD5JU08gMjAyMiwgS29yZWFuPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMTU2IiBoZWFkZXJzPSJOMTAwNzIgIj4gPHA+SVNPLTg4NTktMTwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE1NiBOMTAwODQgIj4gPHA+SVNPIExhdGluLTE8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAxNzYiIGhlYWRlcnM9Ik4xMDA3MiAiPklTTy04ODU5LTI8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE3NiBOMTAwODQgIj5DZW50cmFsL0Vhc3QgRXVyb3BlYW4gKFNsYXZpYyk8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDE4QSIgaGVhZGVycz0iTjEwMDcyICI+SVNPLTg4NTktMzwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMThBIE4xMDA4NCAiPlNvdXRoZXJuIEV1cm9wZWFuPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAxOUUiIGhlYWRlcnM9Ik4xMDA3MiAiPklTTy04ODU5LTQ8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5RSBOMTAwODQgIj5JU08gODg1OS00LCBDeXJpbGxpYzwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMUIyIiBoZWFkZXJzPSJOMTAwNzIgIj5JU08tODg1OS01PC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxQjIgTjEwMDg0ICI+SVNPIDg4NTktNSwgQ3lyaWxsaWM8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDFDNiIgaGVhZGVycz0iTjEwMDcyICI+IDxwPklTTy04ODU5LTY8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxQzYgTjEwMDg0ICI+IDxwPkFyYWJpYyAoTG9naWNhbCk8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAxRTYiIGhlYWRlcnM9Ik4xMDA3MiAiPklTTy04ODU5LTc8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDFFNiBOMTAwODQgIj5HcmVlazwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMUZBIiBoZWFkZXJzPSJOMTAwNzIgIj4gPHA+SVNPLTg4NTktODwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDFGQSBOMTAwODQgIj4gPHA+SGVicmV3IChWaXN1YWwpIChlbmNvZGluZyBzdXBwb3J0ZWQsIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBQYWdlCi1EZXNpZ25lciBEZXNpZ24gcGFnZSk8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyMUEiIGhlYWRlcnM9Ik4xMDA3MiAiPklTTy04ODU5LTk8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDIxQSBOMTAwODQgIj5UdXJraXNoPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyMkUiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5TSElGVF9KSVM8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAyMkUgTjEwMDg0ICI+IDxwPlNoaWZ0LUpJUywgSmFwYW5lc2U8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyNEUiIGhlYWRlcnM9Ik4xMDA3MiAiPlRJUy02MjA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI0RSBOMTAwODQgIj5USVNJLCBUaGFpPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyNjIiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5VUy1BU0NJSTwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI2MiBOMTAwODQgIj4gPHA+VVMgQVNDSUk8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyODIiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5VVEYtODwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI4MiBOMTAwODQgIj4gPHA+SVNPIDEwNjQ2L1VuaWNvZGUsIG9uZS1ieXRlIGVuY29kaW5nPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMkEyIiBoZWFkZXJzPSJOMTAwNzIgIj4gPHA+VVRGLTE2PC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMkEyIE4xMDA4NCAiPiA8cD5JU08gMTA2NDYvVW5pY29kZSwgdHdvLWJ5dGUgZW5jb2Rpbmc8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyQzIiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5VVEYtMTZCRTwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDJDMiBOMTAwODQgIj4gPHA+VW5pY29kZSBCaWdFbmRpYW48L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyRTIiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5VVEYtMTZMRTwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDJFMiBOMTAwODQgIj4gPHA+VW5pY29kZSBMaXR0bGVFbmRpYW48L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAzMDIiIGhlYWRlcnM9Ik4xMDA3MiAiPjxwPldJTkRPV1MtMzFKPC9wPgotPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAzMDIgTjEwMDg0ICI+PHA+SmFwYW5lc2UsIFdpbmRvd3MtMzFKPC9wPgotPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAzMUUiIGhlYWRlcnM9Ik4xMDA3MiAiPiA8cD5XSU5ET1dTLTEyNTU8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAzMUUgTjEwMDg0ICI+IDxwPkhlYnJldzwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDMzRSIgaGVhZGVycz0iTjEwMDcyICI+IDxwPldJTkRPV1MtMTI1NjwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDMzRSBOMTAwODQgIj4gPHA+QXJhYmljPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGJvZHk+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXYgLz4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHRvb2wuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHRvb2wuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmYzViMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWx0b29sLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iICAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjeG1sdG9vbCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+WE1MIHRvb2xzIC0gb3ZlcnZpZXc8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlhNTCB0b29scyAtIG92ZXJ2aWV3PC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoaXMgcHJvZHVjdCBwcm92aWRlcyBhIGNvbXByZWhlbnNpdmUgdmlzdWFsIFhNTCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4NCi1UaGUgdG9vbCBzZXQgaW5jbHVkZXMgY29tcG9uZW50cyBmb3IgYnVpbGRpbmcgRFREcywgWE1MIHNjaGVtYXMsIGFuZCBYTUwgZmlsZXMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHRvb2xzPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5UaGUgZm9sbG93aW5nIFhNTCB0b29scyBhcmUgYXZhaWxhYmxlLiA8L3A+DQotPHA+VGhlIDxiPlhNTCBlZGl0b3I8L2I+IGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiBZb3UNCi1jYW4gdXNlIGl0IHRvIGNyZWF0ZSBuZXcgWE1MIGZpbGVzLCBlaXRoZXIgZnJvbSBzY3JhdGNoLCBleGlzdGluZyBEVERzLCBvcg0KLWV4aXN0aW5nIFhNTCBzY2hlbWFzLiBZb3UgY2FuIGFsc28gdXNlIGl0IHRvIGVkaXQgWE1MIGZpbGVzLCBhc3NvY2lhdGUgdGhlbQ0KLXdpdGggRFREcyBvciBzY2hlbWFzLCBhbmQgdmFsaWRhdGUgdGhlbS4gPC9wPg0KLTxwPiBUaGUgPGI+RFREIGVkaXRvcjwvYj4gaXMgYSB0b29sIGZvciBjcmVhdGluZyBhbmQgdmlld2luZyBEVERzLiAgIDwvcD4NCi08cD5UaGUgPGI+WE1MIHNjaGVtYSBlZGl0b3I8L2I+IGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcsIHZpZXdpbmcsIGFuZCB2YWxpZGF0aW5nDQotWE1MIHNjaGVtYXMuIFlvdSBjYW4gdXNlIHRoZSBYTUwgc2NoZW1hIGVkaXRvciB0byBwZXJmb3JtIHRhc2tzIHN1Y2ggYXMgY3JlYXRpbmcNCi1YTUwgc2NoZW1hIGNvbXBvbmVudHMgYW5kIGltcG9ydGluZyBhbmQgdmlld2luZyBYTUwgc2NoZW1hcy4gPC9wPg0KLTxwPjxiPk5vdGVzOjwvYj48L3A+DQotPHNlY3Rpb24+RXhlcmNpc2UgY2F1dGlvbiB3aGVuIG9wZW5pbmcgbGFyZ2UgZmlsZXMgd2l0aCBhbnkgb2YgdGhlIFhNTCBlZGl0b3JzLg0KLUlmIHRoZSBtZW1vcnkgbGltaXRzIG9mIHRoZSB3b3JrYmVuY2ggYXJlIGV4Y2VlZGVkLCBpdCB3aWxsIGFicnVwdGx5IGNsb3NlDQotd2l0aG91dCBzYXZpbmcgYW55IGRhdGEgKGFuZCB3aXRob3V0IHdhcm5pbmcgb3IgZXJyb3IgbWVzc2FnZXMpLiBUaGUgbnVtYmVyDQotb2YgZWxlbWVudHMgaW4gYW4gWE1MIGZpbGUsIG5vdCBpdHMgc2l6ZSwgaXMgdGhlIGJlc3QgaW5kaWNhdG9yIG9mIGhvdyBtdWNoDQotbWVtb3J5IHdpbGwgYmUgcmVxdWlyZWQuIE1lbW9yeSByZXF1aXJlbWVudHMgYWxzbyBkZXBlbmQgb24gd2hhdCBlbHNlIGlzIG9wZW4NCi1pbiB0aGUgd29ya2JlbmNoIC0gaW4gc29tZSBjYXNlcyB5b3UgY2FuIG9wZW4gYSBmaWZ0ZWVuIG1lZ2FieXRlcyBmaWxlLCBidXQNCi1pbiBvdGhlciBjYXNlcyBhIG9uZSBtZWdhYnl0ZSBmaWxlIG1pZ2h0IGNhdXNlIHByb2JsZW1zLiBUaGVyZWZvcmUsIHdlIHJlY29tbWVuZA0KLXlvdSBzYXZlIGFsbCBkYXRhIGluIHRoZSB3b3JrYmVuY2ggYmVmb3JlIG9wZW5pbmcgbGFyZ2UgWE1MIGZpbGVzLiBUaGlzIGlzDQotYSBwZXJtYW5lbnQgcmVzdHJpY3Rpb24uPC9zZWN0aW9uPg0KLTxzZWN0aW9uIGNvbnJlZj0icmxpbWl0YXRpb25zX3NsdXNoWE1MLmRpdGEjcmxpbWl0YXRpb25zX3NsdXNoWE1ML3VucmVzb2x2X1VSSSI+PC9zZWN0aW9uPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQotPD9QdWIgKjAwMDAwMDIwNjQ/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHRvb2wuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHRvb2wuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2OTYzMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWx0b29sLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotPHRpdGxlPlhNTCB0b29scyAtIG92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjeG1sdG9vbCI+PGEgbmFtZT0iY3htbHRvb2wiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5YTUwgdG9vbHMgLSBvdmVydmlldzwvaDE+Ci08ZGl2PjxwPlRoaXMgcHJvZHVjdCBwcm92aWRlcyBhIGNvbXByZWhlbnNpdmUgdmlzdWFsIFhNTCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4KLVRoZSB0b29sIHNldCBpbmNsdWRlcyBjb21wb25lbnRzIGZvciBidWlsZGluZyBEVERzLCBYTUwgc2NoZW1hcywgYW5kIFhNTCBmaWxlcy48L3A+PHA+VGhlIGZvbGxvd2luZyBYTUwgdG9vbHMgYXJlIGF2YWlsYWJsZTo8L3A+Ci08cD5UaGUgPGI+WE1MIGVkaXRvcjwvYj4gaXMgYSB0b29sIGZvciBjcmVhdGluZyBhbmQgdmlld2luZyBYTUwgZmlsZXMuIFlvdQotY2FuIHVzZSBpdCB0byBjcmVhdGUgbmV3IFhNTCBmaWxlcywgZWl0aGVyIGZyb20gc2NyYXRjaCwgZXhpc3RpbmcgRFREcywgb3IKLWV4aXN0aW5nIFhNTCBzY2hlbWFzLiBZb3UgY2FuIGFsc28gdXNlIGl0IHRvIGVkaXQgWE1MIGZpbGVzLCBhc3NvY2lhdGUgdGhlbQotd2l0aCBEVERzIG9yIHNjaGVtYXMsIGFuZCB2YWxpZGF0ZSB0aGVtLjwvcD4KLTxwPlRoZSA8Yj5EVEQgZWRpdG9yPC9iPiBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIERURHMuIDwvcD4KLTxwPlRoZSA8Yj5YTUwgc2NoZW1hIGVkaXRvcjwvYj4gaXMgYSB0b29sIGZvciBjcmVhdGluZywgdmlld2luZywgYW5kIHZhbGlkYXRpbmcgCi1YTUwgc2NoZW1hcy4gWW91IGNhbiB1c2UgdGhlIFhNTCBzY2hlbWEgZWRpdG9yIHRvIHBlcmZvcm0gdGFza3Mgc3VjaCBhcyBjcmVhdGluZyAKLVhNTCBzY2hlbWEgY29tcG9uZW50cyBhbmQgaW1wb3J0aW5nIGFuZCB2aWV3aW5nIFhNTCBzY2hlbWFzLiA8L3A+Ci08ZGl2IGNsYXNzPSJza2lwc3BhY2UiPkV4ZXJjaXNlIGNhdXRpb24gd2hlbiBvcGVuaW5nIGxhcmdlIGZpbGVzIHdpdGggYW55IG9mIHRoZSBYTUwgZWRpdG9ycy4KLUlmIHRoZSBtZW1vcnkgbGltaXRzIG9mIHRoZSB3b3JrYmVuY2ggYXJlIGV4Y2VlZGVkLCBpdCB3aWxsIGFicnVwdGx5IGNsb3NlCi13aXRob3V0IHNhdmluZyBhbnkgZGF0YSAoYW5kIHdpdGhvdXQgd2FybmluZyBvciBlcnJvciBtZXNzYWdlcykuIFRoZSBudW1iZXIKLW9mIGVsZW1lbnRzIGluIGFuIFhNTCBmaWxlLCBub3QgaXRzIHNpemUsIGlzIHRoZSBiZXN0IGluZGljYXRvciBvZiBob3cgbXVjaAotbWVtb3J5IHdpbGwgYmUgcmVxdWlyZWQuIE1lbW9yeSByZXF1aXJlbWVudHMgYWxzbyBkZXBlbmQgb24gd2hhdCBlbHNlIGlzIG9wZW4KLWluIHRoZSB3b3JrYmVuY2ggLSBpbiBzb21lIGNhc2VzIHlvdSBjYW4gb3BlbiBhIDE1IG1lZ2FieXRlcyBmaWxlLCBidXQgaW4KLW90aGVyIGNhc2VzIGEgb25lLW1lZ2FieXRlIGZpbGUgbWF5IGNhdXNlIHByb2JsZW1zLiBUaGVyZWZvcmUsIHdlIHJlY29tbWVuZAoteW91IHNhdmUgYWxsIGRhdGEgaW4gdGhlIHdvcmtiZW5jaCBiZWZvcmUgb3BlbmluZyBsYXJnZSBYTUwgZmlsZXMuIFRoaXMgaXMKLWEgcGVybWFuZW50IHJlc3RyaWN0aW9uLjwvZGl2PgotPGRpdiBjbGFzcz0ic2tpcHNwYWNlIj48cD5UaGUKLWJlaGF2aW9yIG9mIHRoZSBYTUwgcGFyc2VyIHdoZW4gZW5jb3VudGVyaW5nIGFuIHVucmVzb2x2YWJsZSBVUkkgKGZvciBleGFtcGxlLAotaW4gYSBET0NUWVBFIGRlY2xhcmF0aW9uKSBpcyB0byByZXBvcnQgYSBmYXRhbCBJTyBlcnJvciBhbmQgc3RvcCBhbnkgZnVydGhlcgotcHJvY2Vzc2luZy4gQW4gdW5yZXNvbHZlZCBVUkkgaXMgc2VlbiBuZWl0aGVyIGFzIGEgc3ludGFjdGljIG5vciBhIHNlbWFudGljCi1lcnJvciBhbmQgYXMgc3VjaCwgdGhlIHBhcnNlciBkb2VzIG5vdCBhdHRlbXB0IHRvIGhhbmRsZSBpdC4gRXNzZW50aWFsbHksCi10aGUgZG9jdW1lbnQgcmVtYWlucyB1bmNoZWNrZWQuIFRoaXMgaXMgYSBrbm93biBwcm9ibGVtLjwvcD4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZXh0Y3RuLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JleHRjdG4uZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJiZTcxNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JleHRjdG4uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgcmVmZXJlbmNlICBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBSZWZlcmVuY2UvL0VOIiAicmVmZXJlbmNlLmR0ZCI+DQotPHJlZmVyZW5jZSBpZD0icmV4dGN0biIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyBYTUwgZG9jdW1lbnRzIHdpdGggbXVsdGlwbGUgbmFtZXNwYWNlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RWRpdGluZyBYTUwgZG9jdW1lbnRzIHdpdGggbXVsdGlwbGUgbmFtZXNwYWNlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIHVzZSB0aGUgWE1MIHNjaGVtYSA8Y29kZXBoPmFueTwvY29kZXBoPiBlbGVtZW50IHRvIGV4dGVuZA0KLXRoZSBjb250ZW50IG1vZGVsIG9mIGFuIFhNTCBkb2N1bWVudC48L3Nob3J0ZGVzYz4NCi08cmVmYm9keT4NCi08c2VjdGlvbj48cD5Gb3IgZXhhbXBsZSwgeW91IGhhdmUgYW4gWE1MIHNjaGVtYSBmaWxlIGNhbGxlZCBCb29rLnhzZCB0aGF0DQotY29udGFpbnMgYSBjb21wbGV4IHR5cGUgY2FsbGVkIEJvb2tUeXBlLiBCb29rVHlwZSBjb250YWlucyA0IGVsZW1lbnRzICh0aXRsZSwNCi1hdXRob3IsIHllYXIsIGFuZCBJU0JOKSBhbmQgb25lICA8Y29kZXBoPmFueTwvY29kZXBoPiBlbGVtZW50LiBUaGUgbmFtZXNwYWNlDQotZm9yIHRoZSA8Y29kZXBoPmFueTwvY29kZXBoPiAgZWxlbWVudCBpcyAgPGNvZGVwaD4jI2FueTwvY29kZXBoPi4gVGhpcyBtZWFucw0KLXRoYXQgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQsIHlvdSBjYW4gaW5zZXJ0IGFueSBYTUwgZWxlbWVudCB0byBleHRlbmQgdGhlDQotZGVmaW5pdGlvbiBvZiB0aGUgQm9va1R5cGUuPC9wPjxwPllvdSBjYW4gYWxzbyBwcm92aWRlIGEgbW9yZSBzcGVjaWZpYyBuYW1lc3BhY2UuDQotRm9yIGV4YW1wbGUsIHlvdSBoYXZlIGFub3RoZXIgc2NoZW1hIGNhbGxlZCBNeV9Cb29rLnhzZCwgd2hpY2ggY29udGFpbnMgYQ0KLWNvbXBsZXggdHlwZSBjYWxsZWQgTXlfQm9va1R5cGUuIE15X0Jvb2tUeXBlIGNvbnRhaW5zIDQgZWxlbWVudHMgKHRpdGxlLCBhdXRob3IsDQoteWVhciwgYW5kIElTQk4pIGFuZCBvbmUgIDxjb2RlcGg+YW55PC9jb2RlcGg+IGVsZW1lbnQsIGJ1dCBpbiB0aGlzIGNhc2UgdGhlDQotbmFtZXNwYWNlIGZvciB0aGUgIEJvb2tUeXBlIGVsZW1lbnQgaXMgd3d3Lndlc2xleS5jb20uIFRoaXMgbWVhbnMgdGhhdCBpbg0KLWFuIGluc3RhbmNlIGRvY3VtZW50LCB5b3UgY2FuIGluc2VydCBhbnkgWE1MIGVsZW1lbnQgdG8gZXh0ZW5kIHRoZSBkZWZpbml0aW9uDQotb2YgdGhlIEJvb2tUeXBlLCBwcm92aWRlZCB0aGF0IHRoZXkgYmVsb25nIHRvIHRoZSBuYW1lc3BhY2UgaHR0cDovL3d3dy53ZXNsZXkuY29tLjwvcD48L3NlY3Rpb24+DQotPC9yZWZib2R5Pg0KLTwvcmVmZXJlbmNlPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcmV4dGN0bi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZXh0Y3RuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiN2ZmNWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZXh0Y3RuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0icmVmZXJlbmNlIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgWE1MIGRvY3VtZW50cyB3aXRoIG11bHRpcGxlIG5hbWVzcGFjZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIFhNTCBzY2hlbWEgYW55IGVsZW1lbnQgdG8gZXh0ZW5kIHRoZSBjb250ZW50IG1vZGVsIG9mIGFuIFhNTCBkb2N1bWVudC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIFhNTCBzY2hlbWEgYW55IGVsZW1lbnQgdG8gZXh0ZW5kIHRoZSBjb250ZW50IG1vZGVsIG9mIGFuIFhNTCBkb2N1bWVudC4iIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0icmV4dGN0biIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVkaXRpbmcgWE1MIGRvY3VtZW50cyB3aXRoIG11bHRpcGxlIG5hbWVzcGFjZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJleHRjdG4iPjxhIG5hbWU9InJleHRjdG4iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVkaXRpbmcgWE1MIGRvY3VtZW50cyB3aXRoIG11bHRpcGxlIG5hbWVzcGFjZXM8L2gxPgotCi0KLQotPGRpdj48cD5Zb3UgY2FuIHVzZSB0aGUgWE1MIHNjaGVtYSA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQgdG8gZXh0ZW5kCi10aGUgY29udGVudCBtb2RlbCBvZiBhbiBYTUwgZG9jdW1lbnQuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5Gb3IgZXhhbXBsZSwgeW91IGhhdmUgYW4gWE1MIHNjaGVtYSBmaWxlIGNhbGxlZCBCb29rLnhzZCB0aGF0Ci1jb250YWlucyBhIGNvbXBsZXggdHlwZSBjYWxsZWQgQm9va1R5cGUuIEJvb2tUeXBlIGNvbnRhaW5zIDQgZWxlbWVudHMgKHRpdGxlLAotYXV0aG9yLCB5ZWFyLCBhbmQgSVNCTikgYW5kIG9uZSAgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50LiBUaGUgbmFtZXNwYWNlCi1mb3IgdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gIGVsZW1lbnQgaXMgIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiMjYW55PC9zYW1wPi4gVGhpcyBtZWFucwotdGhhdCBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudCwgeW91IGNhbiBpbnNlcnQgYW55IFhNTCBlbGVtZW50IHRvIGV4dGVuZCB0aGUKLWRlZmluaXRpb24gb2YgdGhlIEJvb2tUeXBlLjwvcD4KLTxwPllvdSBjYW4gYWxzbyBwcm92aWRlIGEgbW9yZSBzcGVjaWZpYyBuYW1lc3BhY2UuCi1Gb3IgZXhhbXBsZSwgeW91IGhhdmUgYW5vdGhlciBzY2hlbWEgY2FsbGVkIE15X0Jvb2sueHNkLCB3aGljaCBjb250YWlucyBhCi1jb21wbGV4IHR5cGUgY2FsbGVkIE15X0Jvb2tUeXBlLiBNeV9Cb29rVHlwZSBjb250YWlucyA0IGVsZW1lbnRzICh0aXRsZSwgYXV0aG9yLAoteWVhciwgYW5kIElTQk4pIGFuZCBvbmUgIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gZWxlbWVudCwgYnV0IGluIHRoaXMgY2FzZSB0aGUKLW5hbWVzcGFjZSBmb3IgdGhlICBCb29rVHlwZSBlbGVtZW50IGlzIHd3dy53ZXNsZXkuY29tLiBUaGlzIG1lYW5zIHRoYXQgaW4KLWFuIGluc3RhbmNlIGRvY3VtZW50LCB5b3UgY2FuIGluc2VydCBhbnkgWE1MIGVsZW1lbnQgdG8gZXh0ZW5kIHRoZSBkZWZpbml0aW9uCi1vZiB0aGUgQm9va1R5cGUsIHByb3ZpZGVkIHRoYXQgdGhleSBiZWxvbmcgdG8gdGhlIG5hbWVzcGFjZSBodHRwOi8vd3d3Lndlc2xleS5jb20uPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2IC8+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhNTC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYTUwuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdlZTRiMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhNTC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSByZWZlcmVuY2UgIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFJlZmVyZW5jZS8vRU4iICJyZWZlcmVuY2UuZHRkIj4NCi08cmVmZXJlbmNlIGlkPSJybGltaXRhdGlvbnNfc2x1c2hYTUwiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkxpbWl0YXRpb25zIG9mIFhNTCBFZGl0b3I8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkxpbWl0YXRpb25zIG9mIFhNTCBFZGl0b3I8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBrbm93biBwcm9kdWN0IGFzcGVjdCBsaW1pdGF0aW9ucyBhbmQgd29ya2Fyb3VuZHMuPC9zaG9ydGRlc2M+DQotPHJlZmJvZHk+DQotPCEtLVVzZSB0aGlzIHRlbXBsYXRlIHRvIHNpbmdsZSBzb3VyY2UgdGhlIHJlYWRtZSBpbmZvcm1hdGlvbi4gIFRoZSBjb250ZW50IGZvciB0aGUgcmVhZG1lIGluZm9ybWF0aW9uIGlzIG1haW50YWluZWQgaW4gdGhpcyB0b3BpYyBhbmQgaXMgaW5zZXJ0ZWQgaW50byB0aGUgcmVsYXRlZCB0b3BpYyB1c2luZyB0aGUgY29ucmVmIGF0dHJpYnV0ZS4gVGhpcyBmaWxlIHdpbGwgbm90IGJlIHN1cmZhY2VkIGluIHlvdXIgbmF2aWdhdGlvbi4tLT4NCi08c2VjdGlvbiBpZD0idW5yZXNvbHZfVVJJIj48IS0tTm8gZGVmZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzLiBJdCBpcyBmcm9tIHRoZSA1LjEuIHJlYWRtZS4tLT48cD5UaGUNCi1iZWhhdmlvciBvZiB0aGUgWE1MIHBhcnNlciB3aGVuIGVuY291bnRlcmluZyBhbiB1bnJlc29sdmFibGUgVVJJIChmb3IgZXhhbXBsZSwNCi1pbiBhIERPQ1RZUEUgZGVjbGFyYXRpb24pIGlzIHRvIHJlcG9ydCBhIGZhdGFsIElPIGVycm9yIGFuZCBzdG9wIGFueSBmdXJ0aGVyDQotcHJvY2Vzc2luZy4gQW4gdW5yZXNvbHZlZCBVUkkgaXMgc2VlbiBuZWl0aGVyIGFzIGEgc3ludGFjdGljIG5vciBhIHNlbWFudGljDQotZXJyb3IgYW5kIGFzIHN1Y2gsIHRoZSBwYXJzZXIgZG9lcyBub3QgYXR0ZW1wdCB0byBoYW5kbGUgaXQuIEVzc2VudGlhbGx5LA0KLXRoZSBkb2N1bWVudCByZW1haW5zIHVuY2hlY2tlZC4gVGhpcyBpcyBhIGtub3duIHByb2JsZW0uPC9wPjwvc2VjdGlvbj4NCi08L3JlZmJvZHk+DQotPC9yZWZlcmVuY2U+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYTUwuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWE1MLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YjIzZjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYTUwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTGltaXRhdGlvbnMgb2YgWE1MIEVkaXRvciIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGtub3duIHByb2R1Y3QgYXNwZWN0IGxpbWl0YXRpb25zIGFuZCB3b3JrYXJvdW5kcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBrbm93biBwcm9kdWN0IGFzcGVjdCBsaW1pdGF0aW9ucyBhbmQgd29ya2Fyb3VuZHMuIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InJsaW1pdGF0aW9uc19zbHVzaFhNTCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkxpbWl0YXRpb25zIG9mIFhNTCBFZGl0b3I8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJsaW1pdGF0aW9uc19zbHVzaFhNTCI+PGEgbmFtZT0icmxpbWl0YXRpb25zX3NsdXNoWE1MIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5MaW1pdGF0aW9ucyBvZiBYTUwgRWRpdG9yPC9oMT4KLQotCi0KLTxkaXY+PHA+VGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBrbm93biBwcm9kdWN0IGFzcGVjdCBsaW1pdGF0aW9ucyBhbmQgd29ya2Fyb3VuZHMuPC9wPgotCi0KLTxkaXYgY2xhc3M9InNlY3Rpb24iIGlkPSJybGltaXRhdGlvbnNfc2x1c2hYTUxfX3VucmVzb2x2X1VSSSI+PGEgbmFtZT0icmxpbWl0YXRpb25zX3NsdXNoWE1MX191bnJlc29sdl9VUkkiPjwhLS0gLS0+PC9hPjxwPlRoZQotYmVoYXZpb3Igb2YgdGhlIFhNTCBwYXJzZXIgd2hlbiBlbmNvdW50ZXJpbmcgYW4gdW5yZXNvbHZhYmxlIFVSSSAoZm9yIGV4YW1wbGUsCi1pbiBhIERPQ1RZUEUgZGVjbGFyYXRpb24pIGlzIHRvIHJlcG9ydCBhIGZhdGFsIElPIGVycm9yIGFuZCBzdG9wIGFueSBmdXJ0aGVyCi1wcm9jZXNzaW5nLiBBbiB1bnJlc29sdmVkIFVSSSBpcyBzZWVuIG5laXRoZXIgYXMgYSBzeW50YWN0aWMgbm9yIGEgc2VtYW50aWMKLWVycm9yIGFuZCBhcyBzdWNoLCB0aGUgcGFyc2VyIGRvZXMgbm90IGF0dGVtcHQgdG8gaGFuZGxlIGl0LiBFc3NlbnRpYWxseSwKLXRoZSBkb2N1bWVudCByZW1haW5zIHVuY2hlY2tlZC4gVGhpcyBpcyBhIGtub3duIHByb2JsZW0uPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2IC8+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWxiaWNvbnMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGJpY29ucy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzk4YjA3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGJpY29ucy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSByZWZlcmVuY2UgIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFJlZmVyZW5jZS8vRU4iICJyZWZlcmVuY2UuZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTxyZWZlcmVuY2UgaWQ9InJpY29ucyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+SWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvcjwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+SWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvcjwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGUgZm9sbG93aW5nIFhNTCBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lIGFuZCBEZXNpZ24NCi12aWV3Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPmljb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxyZWZib2R5Pg0KLTx0YWJsZT4NCi08dGdyb3VwIGNvbHM9IjIiPjxjb2xzcGVjIGNvbG5hbWU9IkNPTFNQRUMwIi8+PGNvbHNwZWMgY29sbmFtZT0iQ09MU1BFQzEiLz4NCi08dGJvZHk+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiIHZhbGlnbj0iYm90dG9tIj48Yj5JY29uPC9iPjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMxIiB2YWxpZ249ImJvdHRvbSI+PGI+RGVzY3JpcHRpb248L2I+PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9uYXR0cmliLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGF0dHJpYnV0ZQ0KLWljb248L2FsdD48L2ltYWdlPiA8L2VudHJ5Pg0KLTxlbnRyeT5hdHRyaWJ1dGU8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL2NkYXRhc2VjdGlvbi5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZQ0KLWNoYXJhY3RlciBkYXRhIGljb248L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmNoYXJhY3RlciBkYXRhIChDREFUQSkgc2VjdGlvbjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvY29tbWVudF9vYmouZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgY29tbWVudA0KLWljb248L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmNvbW1lbnQ8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL2RvY3R5cGUuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgRE9DVFlQRQ0KLWljb248L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PkRPQ1RZUEUgZGVjbGFyYXRpb248L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL25lbGVtLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGVsZW1lbnQNCi1pY29uPC9hbHQ+PC9pbWFnZT4gPC9lbnRyeT4NCi08ZW50cnk+ZWxlbWVudDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvcHJvaW5zdF9vYmouZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgcHJvY2Vzc2luZw0KLWluc3RydWN0aW9ucyBpY29uPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5wcm9jZXNzaW5nIGluc3RydWN0aW9uczwvZW50cnk+DQotPC9yb3c+DQotPC90Ym9keT4NCi08L3Rncm91cD4NCi08L3RhYmxlPg0KLTwvcmVmYm9keT4NCi08L3JlZmVyZW5jZT4NCi08P1B1YiAqMDAwMDAwMTgyND8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sYmljb25zLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWxiaWNvbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYwNTQzYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWxiaWNvbnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iSWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvciIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgZm9sbG93aW5nIFhNTCBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lIGFuZCBEZXNpZ24gdmlldy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIGZvbGxvd2luZyBYTUwgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSBhbmQgRGVzaWduIHZpZXcuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgaWNvbnMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBpY29ucyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InJpY29ucyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3I8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJpY29ucyI+PGEgbmFtZT0icmljb25zIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5JY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yPC9oMT4KLQotCi0KLQotPGRpdj48cD5UaGUgZm9sbG93aW5nIFhNTCBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lIGFuZCBEZXNpZ24KLXZpZXcuPC9wPgotCi0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCB2YWxpZ249ImJvdHRvbSI+PHN0cm9uZz5JY29uPC9zdHJvbmc+PC90ZD4KLQotPHRkIHZhbGlnbj0iYm90dG9tIj48c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9uYXR0cmliLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGF0dHJpYnV0ZSYjMTA7aWNvbiIgLz4gPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5hdHRyaWJ1dGU8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL2NkYXRhc2VjdGlvbi5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSYjMTA7Y2hhcmFjdGVyIGRhdGEgaWNvbiIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmNoYXJhY3RlciBkYXRhIChDREFUQSkgc2VjdGlvbjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+IDxpbWcgc3JjPSIuLi9pbWFnZXMvY29tbWVudF9vYmouZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgY29tbWVudCYjMTA7aWNvbiIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmNvbW1lbnQ8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL2RvY3R5cGUuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgRE9DVFlQRSYjMTA7aWNvbiIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPkRPQ1RZUEUgZGVjbGFyYXRpb248L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL25lbGVtLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGVsZW1lbnQmIzEwO2ljb24iIC8+IDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+ZWxlbWVudDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+IDxpbWcgc3JjPSIuLi9pbWFnZXMvcHJvaW5zdF9vYmouZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgcHJvY2Vzc2luZyYjMTA7aW5zdHJ1Y3Rpb25zIGljb24iIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5wcm9jZXNzaW5nIGluc3RydWN0aW9uczwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGJvZHk+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIGFuZCBhIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci4gQ29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywgd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGF0IHBhcnRpY3VsYXIgZWxlbWVudC4iPkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGNhdGtleS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sY2F0a2V5LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NTJjOGQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sY2F0a2V5LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHJlZmVyZW5jZSBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBSZWZlcmVuY2UvL0VOIg0KLSAicmVmZXJlbmNlLmR0ZCI+DQotPHJlZmVyZW5jZSBpZD0ieG1sY2F0YWxvZ2tleWJvYXJkc2hvcnRjdXRzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZSBvdXRwdXRjbGFzcz0iaWRfdGl0bGUiPlhNTCBDYXRhbG9nIGtleWJvYXJkIHNob3J0Y3V0czwvdGl0bGU+DQotPHNob3J0ZGVzYyBvdXRwdXRjbGFzcz0iaWRfc2hvcnRkZXNjIj5BY2NlbGVyYXRvciBrZXlzIGNhbiBiZSB1c2VkIGluIHRoZQ0KLWNhdGFsb2cgdHJlZSBzdHJ1Y3R1cmUgYW5kIGNhdGFsb2cgZW50cnkgd2l6YXJkIGJ5IGZpcnN0IHByZXNzaW5nIGFuZCBob2xkaW5nDQotdGhlIEFsdCBrZXkuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+YWNjZXNzaWJpbGl0eTxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPGluZGV4dGVybT5YTUwNCi1jYXRhbG9nIHdpemFyZDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPGluZGV4dGVybT5YTUwNCi1jYXRhbG9nIHdpemFyZDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+c2hvcnRjdXRzPGluZGV4dGVybT5rZXlib2FyZDxpbmRleHRlcm0+WE1MDQotY2F0YWxvZyB3aXphcmQ8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTCBjYXRhbG9nIHdpemFyZDxpbmRleHRlcm0+YWNjZXNzaWJpbGl0eTwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIGNhdGFsb2cgd2l6YXJkPGluZGV4dGVybT5rZXlib2FyZCBzaG9ydGN1dHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHJlZmJvZHk+DQotPHRhYmxlIGZyYW1lPSJhbGwiPg0KLTx0Z3JvdXAgY29scz0iMiI+PGNvbHNwZWMgY29sbmFtZT0iY29sMSIgY29sd2lkdGg9Ijg0KiIvPjxjb2xzcGVjIGNvbG5hbWU9ImNvbDMiDQotY29sd2lkdGg9IjkzKiIvPg0KLTx0aGVhZD4NCi08cm93IHZhbGlnbj0iYm90dG9tIj4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+S2V5IENvbWJpbmF0aW9uPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMyI+RnVuY3Rpb248L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGhlYWQ+DQotPHRib2R5Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkFsdCtBPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMyI+QWRkIGNhdGFsb2cgZW50cnk8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkFsdCtFPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMyI+RWRpdCBzZWxlY3RlZCBjYXRhbG9nIGVudHJ5PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5BbHQrUjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDMiPlJlbW92ZSBzZWxlY3RlZCBjYXRhbG9nIGVudHJ5PC9lbnRyeT4NCi08L3Jvdz4NCi08L3Rib2R5Pg0KLTwvdGdyb3VwPg0KLTwvdGFibGU+DQotPC9yZWZib2R5Pg0KLTwvcmVmZXJlbmNlPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGNhdGtleS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sY2F0a2V5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ODRmOWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sY2F0a2V5Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0icmVmZXJlbmNlIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlhNTCBDYXRhbG9nIGtleWJvYXJkIHNob3J0Y3V0cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBY2NlbGVyYXRvciBrZXlzIGNhbiBiZSB1c2VkIGluIHRoZSBjYXRhbG9nIHRyZWUgc3RydWN0dXJlIGFuZCBjYXRhbG9nIGVudHJ5IHdpemFyZCBieSBmaXJzdCBwcmVzc2luZyBhbmQgaG9sZGluZyB0aGUgQWx0IGtleS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQWNjZWxlcmF0b3Iga2V5cyBjYW4gYmUgdXNlZCBpbiB0aGUgY2F0YWxvZyB0cmVlIHN0cnVjdHVyZSBhbmQgY2F0YWxvZyBlbnRyeSB3aXphcmQgYnkgZmlyc3QgcHJlc3NpbmcgYW5kIGhvbGRpbmcgdGhlIEFsdCBrZXkuIiAvPgotPG1ldGEgY29udGVudD0iYWNjZXNzaWJpbGl0eSwga2V5Ym9hcmQgc2hvcnRjdXRzLCBYTUwgY2F0YWxvZyB3aXphcmQsIHNob3J0Y3V0cywga2V5Ym9hcmQsIFhNTCBjYXRhbG9nIHdpemFyZCIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImFjY2Vzc2liaWxpdHksIGtleWJvYXJkIHNob3J0Y3V0cywgWE1MIGNhdGFsb2cgd2l6YXJkLCBzaG9ydGN1dHMsIGtleWJvYXJkLCBYTUwgY2F0YWxvZyB3aXphcmQiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InhtbGNhdGFsb2drZXlib2FyZHNob3J0Y3V0cyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlhNTCBDYXRhbG9nIGtleWJvYXJkIHNob3J0Y3V0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ieG1sY2F0YWxvZ2tleWJvYXJkc2hvcnRjdXRzIj48YSBuYW1lPSJ4bWxjYXRhbG9na2V5Ym9hcmRzaG9ydGN1dHMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0iaWRfdGl0bGUiPlhNTCBDYXRhbG9nIGtleWJvYXJkIHNob3J0Y3V0czwvaDE+Ci0KLQotCi08ZGl2PjxwIGNsYXNzPSJpZF9zaG9ydGRlc2MiPkFjY2VsZXJhdG9yIGtleXMgY2FuIGJlIHVzZWQgaW4gdGhlCi1jYXRhbG9nIHRyZWUgc3RydWN0dXJlIGFuZCBjYXRhbG9nIGVudHJ5IHdpemFyZCBieSBmaXJzdCBwcmVzc2luZyBhbmQgaG9sZGluZwotdGhlIEFsdCBrZXkuPC9wPgotCi0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj4KLTx0aGVhZCBhbGlnbj0ibGVmdCI+Ci08dHIgdmFsaWduPSJib3R0b20iPgotPHRoIHZhbGlnbj0iYm90dG9tIiB3aWR0aD0iNDcuNDU3NjI3MTE4NjQ0MDclIiBpZD0iTjEwMDkxIj5LZXkgQ29tYmluYXRpb248L3RoPgotCi08dGggdmFsaWduPSJib3R0b20iIHdpZHRoPSI1Mi41NDIzNzI4ODEzNTU5NCUiIGlkPSJOMTAwOTgiPkZ1bmN0aW9uPC90aD4KLQotPC90cj4KLQotPC90aGVhZD4KLQotPHRib2R5PgotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDcuNDU3NjI3MTE4NjQ0MDclIiBoZWFkZXJzPSJOMTAwOTEgIj5BbHQrQTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjUyLjU0MjM3Mjg4MTM1NTk0JSIgaGVhZGVycz0iTjEwMDk4ICI+QWRkIGNhdGFsb2cgZW50cnk8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI0Ny40NTc2MjcxMTg2NDQwNyUiIGhlYWRlcnM9Ik4xMDA5MSAiPkFsdCtFPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTIuNTQyMzcyODgxMzU1OTQlIiBoZWFkZXJzPSJOMTAwOTggIj5FZGl0IHNlbGVjdGVkIGNhdGFsb2cgZW50cnk8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI0Ny40NTc2MjcxMTg2NDQwNyUiIGhlYWRlcnM9Ik4xMDA5MSAiPkFsdCtSPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNTIuNTQyMzcyODgxMzU1OTQlIiBoZWFkZXJzPSJOMTAwOTggIj5SZW1vdmUgc2VsZWN0ZWQgY2F0YWxvZyBlbnRyeTwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGJvZHk+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbHRvb2xza2V5LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWx0b29sc2tleS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGVkYzNmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbHRvb2xza2V5LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSByZWZlcmVuY2UgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgUmVmZXJlbmNlLy9FTiINCi0gInJlZmVyZW5jZS5kdGQiPg0KLTxyZWZlcmVuY2UgaWQ9InhtbHRvb2xza2V5Ym9hcmRzaG9ydGN1dHMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNvdXJjZSBlZGl0b3IgYW5kIFhNTCB0b29scyBrZXlib2FyZCBzaG9ydGN1dHM8L3RpdGxlPg0KLTxzaG9ydGRlc2M+VGhlIGZvbGxvd2luZyBrZXlib2FyZCBzaG9ydGN1dHMgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIFhNTCwgWFNELA0KLVdTREwsIEhUTUwsIEpTUCwgQ1NTIGFuZCBEVEQgZWRpdG9ycy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5hY2Nlc3NpYmlsaXR5PGluZGV4dGVybT5rZXlib2FyZCBzaG9ydGN1dHM8aW5kZXh0ZXJtPlhNTA0KLWVkaXRvcjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+YWNjZXNzaWJpbGl0eTxpbmRleHRlcm0+a2V5Ym9hcmQNCi1zaG9ydGN1dHM8aW5kZXh0ZXJtPnNvdXJjZSBlZGl0b3I8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPmtleWJvYXJkDQotc2hvcnRjdXRzPGluZGV4dGVybT5YTUwgZWRpdG9yPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5zaG9ydGN1dHM8aW5kZXh0ZXJtPmtleWJvYXJkPGluZGV4dGVybT5YTUwNCi1lZGl0b3I8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPmFjY2Vzc2liaWxpdHk8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPmtleWJvYXJkIHNob3J0Y3V0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WFNEIGVkaXRvcjxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5XU0RMIGVkaXRvcjxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5IVE1MIGVkaXRvcjxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5KU1AgZWRpdG9yPGluZGV4dGVybT5rZXlib2FyZCBzaG9ydGN1dHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPkNTUyBlZGl0b3I8aW5kZXh0ZXJtPmtleWJvYXJkIHNob3J0Y3V0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+RFREIGVkaXRvcjxpbmRleHRlcm0+a2V5Ym9hcmQgc2hvcnRjdXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxyZWZib2R5Pg0KLTxzZWN0aW9uPjx0aXRsZT5TaG9ydGN1dHMgYXZhaWxhYmxlIGluIGFsbCBzb3VyY2UgZWRpdG9yczwvdGl0bGU+PHNpbXBsZXRhYmxlPg0KLTxzdGhlYWQ+DQotPHN0ZW50cnk+Q29tbWFuZDwvc3RlbnRyeT4NCi08c3RlbnRyeT5TaG9ydGN1dDwvc3RlbnRyeT4NCi08L3N0aGVhZD4NCi08c3Ryb3c+DQotPHN0ZW50cnk+R28gVG8gTWF0Y2hpbmcgQnJhY2tldDwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK1NoaWZ0K1A8L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+UmVzdG9yZSBMYXN0IFNlbGVjdGlvbjwvc3RlbnRyeT4NCi08c3RlbnRyeT5BdGwrU2hpZnQrRG93bjwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTxzdHJvdz4NCi08c3RlbnRyeT5TZWxlY3QgRW5jbG9zaW5nIEVsZW1lbnQ8L3N0ZW50cnk+DQotPHN0ZW50cnk+QWx0K1NoaWZ0K1VwPC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5PlNlbGVjdCBOZXh0IEVsZW1lbnQ8L3N0ZW50cnk+DQotPHN0ZW50cnk+QWx0K1NoaWZ0K1JpZ2h0PC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5PlNlbGVjdCBQcmV2aW91cyBFbGVtZW50PC9zdGVudHJ5Pg0KLTxzdGVudHJ5PkFsdCtTaGlmdCtMZWZ0PC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPC9zaW1wbGV0YWJsZT48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPlNob3J0Y3V0cyBhdmFpbGFibGUgaW4gdGhlIFhNTCwgWFNELCBXU0RMLCBIVE1MLCBKU1AsIGFuZA0KLUNTUyBlZGl0b3JzIChleGNsdWRlcyB0aGUgRFREIGVkaXRvcik8L3RpdGxlPjxzaW1wbGV0YWJsZT4NCi08c3RoZWFkPg0KLTxzdGVudHJ5PkNvbW1hbmQ8L3N0ZW50cnk+DQotPHN0ZW50cnk+U2hvcnRjdXQ8L3N0ZW50cnk+DQotPC9zdGhlYWQ+DQotPHN0cm93Pg0KLTxzdGVudHJ5PkZvcm1hdDwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK1NoaWZ0K0Y8L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+Rm9ybWF0IEFjdGl2ZSBFbGVtZW50czwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK0k8L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08L3NpbXBsZXRhYmxlPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+U2hvcnRjdXRzIGF2YWlsYWJsZSBpbiB0aGUgWE1MLCBYU0QsIFdTREwsIEhUTUwsIGFuZCBKU1AgZWRpdG9ycw0KLShleGNsdWRlcyB0aGUgRFREIGFuZCBDU1MgZWRpdG9ycyk8L3RpdGxlPjxzaW1wbGV0YWJsZT4NCi08c3RoZWFkPg0KLTxzdGVudHJ5PkNvbW1hbmQ8L3N0ZW50cnk+DQotPHN0ZW50cnk+U2hvcnRjdXQ8L3N0ZW50cnk+DQotPC9zdGhlYWQ+DQotPHN0cm93Pg0KLTxzdGVudHJ5PkFkZCBCbG9jayBDb21tZW50PC9zdGVudHJ5Pg0KLTxzdGVudHJ5PkN0cmwrU2hpZnQrLzwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTxzdHJvdz4NCi08c3RlbnRyeT5HbyBUbyBNYXRjaGluZyBUYWc8L3N0ZW50cnk+DQotPHN0ZW50cnk+Q3RybCtTaGlmdCs+PC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5PkdvIFRvIE5leHQgU2libGluZzwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK1NoaWZ0K0Rvd248L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+T2NjdXJyZW5jZXMgaW4gRmlsZTwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK1NoaWZ0K0E8L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+T3BlbiBTZWxlY3Rpb248L3N0ZW50cnk+DQotPHN0ZW50cnk+RjM8L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+R28gVG8gUHJldmlvdXMgU2libGluZzwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK1NoaWZ0K1VwPC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5PlJlbW92ZSBCbG9jayBDb21tZW50PC9zdGVudHJ5Pg0KLTxzdGVudHJ5PkN0cmwrU2hpZnQrXDwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTxzdHJvdz4NCi08c3RlbnRyeT5Ub2dnbGUgQ29tbWVudDwvc3RlbnRyeT4NCi08c3RlbnRyeT5DdHJsK1NoaWZ0K0M8L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08L3NpbXBsZXRhYmxlPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+U2hvcnRjdXRzIGF2YWlsYWJsZSBpbiB0aGUgZGVzaWduIHZpZXcgb2YgdGhlIFhTRCBhbmQgV1NETA0KLWVkaXRvcnM8L3RpdGxlPjxzaW1wbGV0YWJsZT4NCi08c3RoZWFkPg0KLTxzdGVudHJ5PkNvbW1hbmQ8L3N0ZW50cnk+DQotPHN0ZW50cnk+U2hvcnRjdXQ8L3N0ZW50cnk+DQotPC9zdGhlYWQ+DQotPHN0cm93Pg0KLTxzdGVudHJ5Plpvb20gSW48L3N0ZW50cnk+DQotPHN0ZW50cnk+Q3RybCs9PC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5Plpvb20gT3V0PC9zdGVudHJ5Pg0KLTxzdGVudHJ5PkN0cmwrLTwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTwvc2ltcGxldGFibGU+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5TaG9ydGN1dHMgYXZhaWxhYmxlIGluIHRoZSBkZXNpZ24gdmlldyBvZiB0aGUgV1NETCBlZGl0b3I8L3RpdGxlPjxzaW1wbGV0YWJsZT4NCi08c3RoZWFkPg0KLTxzdGVudHJ5PkNvbW1hbmQ8L3N0ZW50cnk+DQotPHN0ZW50cnk+U2hvcnRjdXQ8L3N0ZW50cnk+DQotPC9zdGhlYWQ+DQotPHN0cm93Pg0KLTxzdGVudHJ5PkV4cG9ydCBEaWFncmFtIGFzIEltYWdlPC9zdGVudHJ5Pg0KLTxzdGVudHJ5PkN0cmwrU2hpZnQrWDwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTwvc2ltcGxldGFibGU+PC9zZWN0aW9uPg0KLTwvcmVmYm9keT4NCi08L3JlZmVyZW5jZT4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWx0b29sc2tleS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sdG9vbHNrZXkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzNmYxOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4bWx0b29sc2tleS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU291cmNlIGVkaXRvciBhbmQgWE1MIHRvb2xzIGtleWJvYXJkIHNob3J0Y3V0cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgZm9sbG93aW5nIGtleWJvYXJkIHNob3J0Y3V0cyBhcmUgYXZhaWxhYmxlIGZvciB0aGUgWE1MLCBYU0QsIFdTREwsIEhUTUwsIEpTUCwgQ1NTIGFuZCBEVEQgZWRpdG9ycy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIGZvbGxvd2luZyBrZXlib2FyZCBzaG9ydGN1dHMgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIFhNTCwgWFNELCBXU0RMLCBIVE1MLCBKU1AsIENTUyBhbmQgRFREIGVkaXRvcnMuIiAvPgotPG1ldGEgY29udGVudD0iYWNjZXNzaWJpbGl0eSwga2V5Ym9hcmQgc2hvcnRjdXRzLCBYTUwgZWRpdG9yLCBrZXlib2FyZCBzaG9ydGN1dHMsIHNvdXJjZSBlZGl0b3IsIFhNTCBlZGl0b3IsIHNob3J0Y3V0cywga2V5Ym9hcmQsIFhTRCBlZGl0b3IsIFdTREwgZWRpdG9yLCBIVE1MIGVkaXRvciwgSlNQIGVkaXRvciwgQ1NTIGVkaXRvciwgRFREIGVkaXRvciIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImFjY2Vzc2liaWxpdHksIGtleWJvYXJkIHNob3J0Y3V0cywgWE1MIGVkaXRvciwga2V5Ym9hcmQgc2hvcnRjdXRzLCBzb3VyY2UgZWRpdG9yLCBYTUwgZWRpdG9yLCBzaG9ydGN1dHMsIGtleWJvYXJkLCBYU0QgZWRpdG9yLCBXU0RMIGVkaXRvciwgSFRNTCBlZGl0b3IsIEpTUCBlZGl0b3IsIENTUyBlZGl0b3IsIERURCBlZGl0b3IiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InhtbHRvb2xza2V5Ym9hcmRzaG9ydGN1dHMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Tb3VyY2UgZWRpdG9yIGFuZCBYTUwgdG9vbHMga2V5Ym9hcmQgc2hvcnRjdXRzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ4bWx0b29sc2tleWJvYXJkc2hvcnRjdXRzIj48YSBuYW1lPSJ4bWx0b29sc2tleWJvYXJkc2hvcnRjdXRzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Tb3VyY2UgZWRpdG9yIGFuZCBYTUwgdG9vbHMga2V5Ym9hcmQgc2hvcnRjdXRzPC9oMT4KLQotCi0KLTxkaXY+PHA+VGhlIGZvbGxvd2luZyBrZXlib2FyZCBzaG9ydGN1dHMgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIFhNTCwgWFNELAotV1NETCwgSFRNTCwgSlNQLCBDU1MgYW5kIERURCBlZGl0b3JzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlNob3J0Y3V0cyBhdmFpbGFibGUgaW4gYWxsIHNvdXJjZSBlZGl0b3JzPC9oND48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGJvcmRlcj0iMSIgY2xhc3M9InNpbXBsZXRhYmxlYm9yZGVyIj4KLTx0cj4KLTx0aCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIGlkPSJOMTAwRDAiPkNvbW1hbmQ8L3RoPgotCi08dGggdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBpZD0iTjEwMEQ2Ij5TaG9ydGN1dDwvdGg+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEQwIj5HbyBUbyBNYXRjaGluZyBCcmFja2V0PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRDYiPkN0cmwrU2hpZnQrUDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEQwIj5SZXN0b3JlIExhc3QgU2VsZWN0aW9uPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRDYiPkF0bCtTaGlmdCtEb3duPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRDAiPlNlbGVjdCBFbmNsb3NpbmcgRWxlbWVudDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEQ2Ij5BbHQrU2hpZnQrVXA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBEMCI+U2VsZWN0IE5leHQgRWxlbWVudDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEQ2Ij5BbHQrU2hpZnQrUmlnaHQ8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBEMCI+U2VsZWN0IFByZXZpb3VzIEVsZW1lbnQ8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBENiI+QWx0K1NoaWZ0K0xlZnQ8L3RkPgotCi08L3RyPgotCi08L3RhYmxlPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TaG9ydGN1dHMgYXZhaWxhYmxlIGluIHRoZSBYTUwsIFhTRCwgV1NETCwgSFRNTCwgSlNQLCBhbmQKLUNTUyBlZGl0b3JzIChleGNsdWRlcyB0aGUgRFREIGVkaXRvcik8L2g0Pjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgYm9yZGVyPSIxIiBjbGFzcz0ic2ltcGxldGFibGVib3JkZXIiPgotPHRyPgotPHRoIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgaWQ9Ik4xMDE0QiI+Q29tbWFuZDwvdGg+Ci0KLTx0aCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIGlkPSJOMTAxNTEiPlNob3J0Y3V0PC90aD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxNEIiPkZvcm1hdDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTUxIj5DdHJsK1NoaWZ0K0Y8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE0QiI+Rm9ybWF0IEFjdGl2ZSBFbGVtZW50czwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTUxIj5DdHJsK0k8L3RkPgotCi08L3RyPgotCi08L3RhYmxlPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TaG9ydGN1dHMgYXZhaWxhYmxlIGluIHRoZSBYTUwsIFhTRCwgV1NETCwgSFRNTCwgYW5kIEpTUCBlZGl0b3JzCi0oZXhjbHVkZXMgdGhlIERURCBhbmQgQ1NTIGVkaXRvcnMpPC9oND48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGJvcmRlcj0iMSIgY2xhc3M9InNpbXBsZXRhYmxlYm9yZGVyIj4KLTx0cj4KLTx0aCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIGlkPSJOMTAxOTAiPkNvbW1hbmQ8L3RoPgotCi08dGggdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBpZD0iTjEwMTk2Ij5TaG9ydGN1dDwvdGg+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTkwIj5BZGQgQmxvY2sgQ29tbWVudDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTk2Ij5DdHJsK1NoaWZ0Ky88L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5MCI+R28gVG8gTWF0Y2hpbmcgVGFnPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTYiPkN0cmwrU2hpZnQrJmd0OzwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTkwIj5HbyBUbyBOZXh0IFNpYmxpbmc8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5NiI+Q3RybCtTaGlmdCtEb3duPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTAiPk9jY3VycmVuY2VzIGluIEZpbGU8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5NiI+Q3RybCtTaGlmdCtBPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTAiPk9wZW4gU2VsZWN0aW9uPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTYiPkYzPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxOTAiPkdvIFRvIFByZXZpb3VzIFNpYmxpbmc8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5NiI+Q3RybCtTaGlmdCtVcDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTkwIj5SZW1vdmUgQmxvY2sgQ29tbWVudDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTk2Ij5DdHJsK1NoaWZ0K1w8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5MCI+VG9nZ2xlIENvbW1lbnQ8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5NiI+Q3RybCtTaGlmdCtDPC90ZD4KLQotPC90cj4KLQotPC90YWJsZT4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U2hvcnRjdXRzIGF2YWlsYWJsZSBpbiB0aGUgZGVzaWduIHZpZXcgb2YgdGhlIFhTRCBhbmQgV1NETAotZWRpdG9yczwvaDQ+PHRhYmxlIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0IiBib3JkZXI9IjEiIGNsYXNzPSJzaW1wbGV0YWJsZWJvcmRlciI+Ci08dHI+Ci08dGggdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBpZD0iTjEwMjQxIj5Db21tYW5kPC90aD4KLQotPHRoIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgaWQ9Ik4xMDI0NyI+U2hvcnRjdXQ8L3RoPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI0MSI+Wm9vbSBJbjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMjQ3Ij5DdHJsKz08L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI0MSI+Wm9vbSBPdXQ8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI0NyI+Q3RybCstPC90ZD4KLQotPC90cj4KLQotPC90YWJsZT4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U2hvcnRjdXRzIGF2YWlsYWJsZSBpbiB0aGUgZGVzaWduIHZpZXcgb2YgdGhlIFdTREwgZWRpdG9yPC9oND48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGJvcmRlcj0iMSIgY2xhc3M9InNpbXBsZXRhYmxlYm9yZGVyIj4KLTx0cj4KLTx0aCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIGlkPSJOMTAyODYiPkNvbW1hbmQ8L3RoPgotCi08dGggdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBpZD0iTjEwMjhDIj5TaG9ydGN1dDwvdGg+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMjg2Ij5FeHBvcnQgRGlhZ3JhbSBhcyBJbWFnZTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMjhDIj5DdHJsK1NoaWZ0K1g8L3RkPgotCi08L3RyPgotCi08L3RhYmxlPgotPC9kaXY+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0eG1sLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0eG1sLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Yzc2YWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldHhtbC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRjcmV0eG1sIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5DcmVhdGluZyBYTUwgZmlsZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkNyZWF0aW5nIFhNTCBmaWxlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIGNyZWF0ZSBhIG5ldyBYTUwgZmlsZSB3aGljaCB5b3UgY2FuIHRoZW4gZWRpdCBpbiB0aGUgWE1MDQotZWRpdG9yLiBZb3UgY3JlYXRlIGEgbmV3IFhNTCBmaWxlIHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwNCi1zY2hlbWEgZmlsZSwgc28gdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB0aGUga2luZCBvZiBjb250ZW50IGl0IGNhbiBjb250YWluLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+Y3JlYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBjcmVhdGUgYSBuZXcNCi1YTUwgZmlsZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNyZWF0ZSBhIHByb2plY3QgdG8gY29udGFpbiB0aGUgWE1MIGZpbGUgaWYgb25lIGRvZXMgbm90IGV4aXN0DQotYWxyZWFkeS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgd29ya2JlbmNoLCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5GaWxlPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5OZXc8L3VpY29udHJvbD48dWljb250cm9sPk90aGVyPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5YTUw8L3VpY29udHJvbD48dWljb250cm9sPlhNTDwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LiBDbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSBwcm9qZWN0IG9yIGZvbGRlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgWE1MIGZpbGUuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+RmlsZSBuYW1lPC91aWNvbnRyb2w+IGZpZWxkLCB0eXBlIHRoZSBuYW1lIG9mDQotdGhlIFhNTCBmaWxlIGFuZCBjbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uIFRoZSBuYW1lIG9mIHlvdXIgWE1MIGZpbGUNCi1tdXN0IGVuZCBpbiA8dXNlcmlucHV0Pi54bWw8L3VzZXJpbnB1dD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSA8dWljb250cm9sPkNyZWF0ZSBYTUwgZmlsZSBmcm9tIGFuIFhNTCB0ZW1wbGF0ZTwvdWljb250cm9sPiByYWRpbw0KLWJ1dHRvbiBhbmQgY2xpY2sgPHVpY29udHJvbD5OZXh0LjwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXAgaW1wb3J0YW5jZT0ib3B0aW9uYWwiPjxjbWQ+WW91IG1heSBjaG9vc2UgdG8gdmlldyBhbmQgZWRpdCB0aGUgWE1MIHRlbXBsYXRlcw0KLXRoYXQgd2lsbCBiZSB1c2VkIGluIHlvdXIgbmV3IFhNTCBmaWxlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrICA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT48P1B1YiBDYXJldD8+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyMDA0Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZWZkZTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0Y3JleGR0ZCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5HZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIGEgRFREPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBpZiB5b3Ugd2FudCB0byBxdWlja2x5DQotY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgRFREIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyDQotRFREIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGgNCi15b3VyIERURCwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXINCi1EVEQuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0ga2V5cmVmPSJ0Y3JleGR0ZHwxfFhNTGZpbGVzZ2VuZXJhdGluZ2Zyb21EVERzIiBzdGF0dXM9Im5ldyI+WE1MDQotZmlsZXM8aW5kZXh0ZXJtPmdlbmVyYXRpbmcgZnJvbSBEVERzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybSBrZXlyZWY9InRjcmV4ZHRkfDJ8RFREZ2VuZXJhdGluZ1hNTGZpbGVzIg0KLXN0YXR1cz0iY2hhbmdlZCI+RFREczxpbmRleHRlcm0+Z2VuZXJhdGluZyBYTUwgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPkFmdGVyIHlvdSBoYXZlIGdlbmVyYXRlZCB5b3VyIFhNTCBmaWxlLCB5b3UgY2FuIGZ1cnRoZXIgY3VzdG9taXplDQotaXQgaW4gdGhlIFhNTCBlZGl0b3IuPC9wPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlDQotUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5Ubw0KLWNyZWF0ZSBhbiBYTUwgZmlsZSBmcm9tIGEgRFREIGZpbGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JbiB0aGUgTmF2aWdhdG9yIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBEVEQgZmlsZSB0aGF0IHlvdSB3YW50IHRvDQotd29yayB3aXRoIGFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+R2VuZXJhdGU8L3VpY29udHJvbD48dWljb250cm9sPlhNTA0KLUZpbGU8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgYSBwcm9qZWN0IG9yIGZvbGRlciB0byBjb250YWluIHRoZSBYTUwgZmlsZSBhbmQgdHlwZSBhIG5hbWUNCi1mb3IgdGhlIGZpbGUgaW4gdGhlIDx1aWNvbnRyb2w+RmlsZSBOYW1lPC91aWNvbnRyb2w+IGZpZWxkLCB0aGVuIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD4NCi08aW5mbz5UaGUgbmFtZSBvZiB0aGUgZmlsZSBtdXN0IGVuZCBpbiA8dXNlcmlucHV0Pi54bWw8L3VzZXJpbnB1dD4uPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgPHVpY29udHJvbD5Sb290IGVsZW1lbnQ8L3VpY29udHJvbD4gb2YgdGhlIFhNTCBmaWxlLjwvY21kPg0KLTxpbmZvPlRoZSByb290IGVsZW1lbnQgb2YgYW4gWE1MIGZpbGUgaXMgdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyBhbGwgb3RoZXINCi1lbGVtZW50cyBpbiB0aGF0IGZpbGUuIEFsbCB0aGUgZWxlbWVudHMgdGhhdCB5b3UgaGF2ZSBkZWZpbmVkIGluIHRoZSBEVEQgd2lsbA0KLWJlIHNob3duIGluIHRoZSA8dWljb250cm9sPlJvb3QgZWxlbWVudDwvdWljb250cm9sPiBsaXN0LjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgZnJvbSB0aGUgZm9sbG93aW5nIGNvbnRlbnQgb3B0aW9uczogIDwvY21kPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+PHVpY29udHJvbD5DcmVhdGUgb3B0aW9uYWwgYXR0cmlidXRlczwvdWljb250cm9sPjogYm90aCBtYW5kYXRvcnkNCi1hbmQgb3B0aW9uYWwgYXR0cmlidXRlcyB3aWxsIGJlIGdlbmVyYXRlZC48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+Q3JlYXRlIG9wdGlvbmFsIGVsZW1lbnRzPC91aWNvbnRyb2w+OiBib3RoIG1hbmRhdG9yeSBhbmQNCi1vcHRpb25hbCBlbGVtZW50cyB3aWxsIGJlIGdlbmVyYXRlZC48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+Q3JlYXRlIGZpcnN0IGNob2ljZSBvZiByZXF1aXJlZCBjaG9pY2U8L3VpY29udHJvbD46IHRoZQ0KLWZpcnN0IG9wdGlvbiBvZiBhIHJlcXVpcmVkIGNob2ljZSB3aWxsIGJlIGdlbmVyYXRlZCBpbiB5b3VyIFhNTCBmaWxlLjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5GaWxsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIHdpdGggZGF0YTwvdWljb250cm9sPjogYW55DQotZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgZ2VuZXJhdGVkIHdpbGwgYmUgZmlsbGVkIHdpdGggc2FtcGxlIGRhdGEuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTxpbmZvPiBJZiB5b3UgZG8gbm90IHNlbGVjdCBhbnkgb2YgdGhlc2Ugb3B0aW9ucywgdGhlbiBvbmx5IHRoZSBtaW5pbXVtIGFtb3VudA0KLW9mIGNvbnRlbnQgcmVxdWlyZWQgZm9yIHRoZSBYTUwgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlNwZWNpZnkgdGhlIDx1aWNvbnRyb2w+UHVibGljIElEPC91aWNvbnRyb2w+IG9yIDx1aWNvbnRyb2w+U3lzdGVtDQotSUQ8L3VpY29udHJvbD4uPC9jbWQ+PGluZm8+WW91IGRvIG5vdCBuZWVkIHRvIHNwZWNpZnkgYm90aC4gSWYgeW91IGRvLCB0aGUNCi1QdWJsaWMgSUQgd2lsbCBiZSB1c2VkIGJlZm9yZSB0aGUgU3lzdGVtIElELiA8L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48cD5UaGUgWE1MIGZpbGUgd2lsbCBvbmx5IGNvbnRhaW4gdGhlIHNlbGVjdGVkIHJvb3QgZWxlbWVudCBhbmQgYW55DQotZWxlbWVudHMgb3IgYXR0cmlidXRlcyBjb250YWluZWQgaW4gdGhlIHJvb3QgZWxlbWVudC4gWW91IGNhbiBub3cgYWRkIGVsZW1lbnRzLA0KLWF0dHJpYnV0ZXMsIGVudGl0aWVzLCBhbmQgbm90YXRpb25zIHRvIHRoZSBYTUwgZmlsZSwgaG93ZXZlciwgdGhleSBtdXN0IGZvbGxvdw0KLXRoZSBydWxlcyBlc3RhYmxpc2hlZCBpbiB0aGUgRFREIHRoYXQgeW91IHVzZWQgdG8gY3JlYXRlIHRoZSBYTUwgZmlsZS48L3A+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTQ0Y2Y0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIGlmIHlvdSB3YW50IHRvIHF1aWNrbHkgY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgRFREIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgRFRELCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4geW91ciBEVEQuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIERURCBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB5b3VyIERURCwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgRFRELiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBmaWxlcywgZ2VuZXJhdGluZyBmcm9tIERURHMsIERURHMsIGdlbmVyYXRpbmcgWE1MIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGZpbGVzLCBnZW5lcmF0aW5nIGZyb20gRFREcywgRFREcywgZ2VuZXJhdGluZyBYTUwgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGNyZXR4bWwuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjcmV4eHNkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdHRhZy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0Y3JleGR0ZCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20gYSBEVEQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRjcmV4ZHRkIj48YSBuYW1lPSJ0Y3JleGR0ZCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzPC9oMT4KLQotCi0KLQotPGRpdj48cD5Zb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgaWYgeW91IHdhbnQgdG8gcXVpY2tseQotY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgRFREIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyCi1EVEQgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aAoteW91ciBEVEQsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyCi1EVEQuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5BZnRlciB5b3UgaGF2ZSBnZW5lcmF0ZWQgeW91ciBYTUwgZmlsZSwgeW91IGNhbiBmdXJ0aGVyIGN1c3RvbWl6ZQotaXQgaW4gdGhlIFhNTCBlZGl0b3IuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUKLVJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbwotY3JlYXRlIGFuIFhNTCBmaWxlIGZyb20gYSBEVEQgZmlsZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgTmF2aWdhdG9yIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBEVEQgZmlsZSB0aGF0IHlvdSB3YW50IHRvCi13b3JrIHdpdGggYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYXRlPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotRmlsZTwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCBhIHByb2plY3Qgb3IgZm9sZGVyIHRvIGNvbnRhaW4gdGhlIFhNTCBmaWxlIGFuZCB0eXBlIGEgbmFtZQotZm9yIHRoZSBmaWxlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlIE5hbWU8L3NwYW4+IGZpZWxkLCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj4KLSBUaGUgbmFtZSBvZiB0aGUgZmlsZSBtdXN0IGVuZCBpbiA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPi54bWw8L2tiZD4uCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Um9vdCBlbGVtZW50PC9zcGFuPiBvZiB0aGUgWE1MIGZpbGUuPC9zcGFuPgotIFRoZSByb290IGVsZW1lbnQgb2YgYW4gWE1MIGZpbGUgaXMgdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyBhbGwgb3RoZXIKLWVsZW1lbnRzIGluIHRoYXQgZmlsZS4gQWxsIHRoZSBlbGVtZW50cyB0aGF0IHlvdSBoYXZlIGRlZmluZWQgaW4gdGhlIERURCB3aWxsCi1iZSBzaG93biBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Um9vdCBlbGVtZW50PC9zcGFuPiBsaXN0LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IGZyb20gdGhlIGZvbGxvd2luZyBjb250ZW50IG9wdGlvbnM6ICA8L3NwYW4+Ci08dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3JlYXRlIG9wdGlvbmFsIGF0dHJpYnV0ZXM8L3NwYW4+OiBib3RoIG1hbmRhdG9yeQotYW5kIG9wdGlvbmFsIGF0dHJpYnV0ZXMgd2lsbCBiZSBnZW5lcmF0ZWQuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZSBvcHRpb25hbCBlbGVtZW50czwvc3Bhbj46IGJvdGggbWFuZGF0b3J5IGFuZAotb3B0aW9uYWwgZWxlbWVudHMgd2lsbCBiZSBnZW5lcmF0ZWQuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZSBmaXJzdCBjaG9pY2Ugb2YgcmVxdWlyZWQgY2hvaWNlPC9zcGFuPjogdGhlCi1maXJzdCBvcHRpb24gb2YgYSByZXF1aXJlZCBjaG9pY2Ugd2lsbCBiZSBnZW5lcmF0ZWQgaW4geW91ciBYTUwgZmlsZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyB3aXRoIGRhdGE8L3NwYW4+OiBhbnkKLWVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGdlbmVyYXRlZCB3aWxsIGJlIGZpbGxlZCB3aXRoIHNhbXBsZSBkYXRhLjwvbGk+Ci0KLTwvdWw+Ci0KLSAgSWYgeW91IGRvIG5vdCBzZWxlY3QgYW55IG9mIHRoZXNlIG9wdGlvbnMsIHRoZW4gb25seSB0aGUgbWluaW11bSBhbW91bnQKLW9mIGNvbnRlbnQgcmVxdWlyZWQgZm9yIHRoZSBYTUwgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TcGVjaWZ5IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QdWJsaWMgSUQ8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN5c3RlbQotSUQ8L3NwYW4+Ljwvc3Bhbj4gWW91IGRvIG5vdCBuZWVkIHRvIHNwZWNpZnkgYm90aC4gSWYgeW91IGRvLCB0aGUKLVB1YmxpYyBJRCB3aWxsIGJlIHVzZWQgYmVmb3JlIHRoZSBTeXN0ZW0gSUQuIDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIFhNTCBmaWxlIHdpbGwgb25seSBjb250YWluIHRoZSBzZWxlY3RlZCByb290IGVsZW1lbnQgYW5kIGFueQotZWxlbWVudHMgb3IgYXR0cmlidXRlcyBjb250YWluZWQgaW4gdGhlIHJvb3QgZWxlbWVudC4gWW91IGNhbiBub3cgYWRkIGVsZW1lbnRzLAotYXR0cmlidXRlcywgZW50aXRpZXMsIGFuZCBub3RhdGlvbnMgdG8gdGhlIFhNTCBmaWxlLCBob3dldmVyLCB0aGV5IG11c3QgZm9sbG93Ci10aGUgcnVsZXMgZXN0YWJsaXNoZWQgaW4gdGhlIERURCB0aGF0IHlvdSB1c2VkIHRvIGNyZWF0ZSB0aGUgWE1MIGZpbGUuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iPlhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RjcmV0eG1sLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGNyZWF0ZSBhIG5ldyBYTUwgZmlsZSB3aGljaCB5b3UgY2FuIHRoZW4gZWRpdCBpbiB0aGUgWE1MIGVkaXRvci4gWW91IGNyZWF0ZSBhIG5ldyBYTUwgZmlsZSB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLCBzbyB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoZSBraW5kIG9mIGNvbnRlbnQgaXQgY2FuIGNvbnRhaW4uIj5DcmVhdGluZyBYTUwgZmlsZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90Y3JleHhzZC5odG1sIiB0aXRsZT0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS4iPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdHRhZy5odG1sIiB0aXRsZT0iVGhpcyBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGVkaXRpbmcgWE1MIGZpbGVzLiI+RWRpdGluZyBYTUwgZmlsZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmEzODczLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXh4c2QuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGNyZXh4c2QiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSBhbiBYTUwgc2NoZW1hPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgaWYgeW91IHdhbnQgdG8NCi1xdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwNCi1maWxlIGZyb20geW91ciBYTUwgc2NoZW1hIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeQ0KLWFzc29jaWF0ZWQgd2l0aCB5b3VyIFhNTCBzY2hlbWEsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cw0KLWFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9InRjcmV4eHNkfDF8WE1MZmlsZXNnZW5lcmF0aW5nZnJvbVhNTHNjaGVtYXMiDQotc3RhdHVzPSJuZXciPlhNTCBmaWxlczxpbmRleHRlcm0+Z2VuZXJhdGluZyBmcm9tIFhNTCBzY2hlbWFzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybSBrZXlyZWY9InRjcmV4eHNkfDJ8WE1Mc2NoZW1hc2dlbmVyYXRpbmdYTUxmaWxlcyIgc3RhdHVzPSJjaGFuZ2VkIj5zY2hlbWFzPGluZGV4dGVybT5nZW5lcmF0aW5nDQotWE1MIGZpbGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9InRjcmV4eHNkfDExfFhNTGZpbGVzc2NoZW1hcyIgc3RhdHVzPSJuZXciPlhNTA0KLWZpbGVzPGluZGV4dGVybT5zY2hlbWFzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5BZnRlciB5b3UgaGF2ZSBnZW5lcmF0ZWQgeW91ciBYTUwgZmlsZSwgeW91IGNhbiBmdXJ0aGVyIGN1c3RvbWl6ZQ0KLWl0IGluIHRoZSBYTUwgZWRpdG9yLjwvcD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZQ0KLVJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8NCi1nZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIGEgc2NoZW1hIGZpbGUgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE5hdmlnYXRvciB2aWV3LCByaWdodC1jbGljayB0aGUgWE1MIHNjaGVtYSBmaWxlIHRoYXQgeW91DQotd2FudCB0byB3b3JrIHdpdGggYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5HZW5lcmF0ZTwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+WE1MIEZpbGU8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgYSBwcm9qZWN0IG9yIGZvbGRlciB0byBjb250YWluIHRoZSBYTUwgZmlsZSBhbmQgdHlwZSBhIG5hbWUNCi1mb3IgdGhlIGZpbGUgaW4gdGhlIDx1aWNvbnRyb2w+RmlsZSBOYW1lPC91aWNvbnRyb2w+IGZpZWxkLCB0aGVuIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD4NCi08aW5mbz5UaGUgbmFtZSBvZiB0aGUgZmlsZSBtdXN0IGVuZCBpbiA8dXNlcmlucHV0Pi54bWw8L3VzZXJpbnB1dD4uPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgPHVpY29udHJvbD5Sb290IGVsZW1lbnQ8L3VpY29udHJvbD4gb2YgdGhlIFhNTCBmaWxlLjwvY21kPg0KLTxpbmZvPlRoZSByb290IGVsZW1lbnQgb2YgYW4gWE1MIGZpbGUgaXMgdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyBhbGwgb3RoZXINCi1lbGVtZW50cyBpbiB0aGF0IGZpbGUuIEFsbCBvZiB0aGUgZ2xvYmFsIGVsZW1lbnRzIHlvdSBoYXZlIGRlZmluZWQgaW4gdGhlDQotWE1MIHNjaGVtYSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBSb290IGVsZW1lbnQgbGlzdC4gSWYgeW91IGRvIG5vdCBoYXZlIGFueQ0KLWdsb2JhbCBlbGVtZW50cyBpbiB5b3VyIFhNTCBzY2hlbWEsIHlvdSBjYW5ub3QgY3JlYXRlIGFuIFhNTCBmaWxlIGZyb20gaXQuPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCBmcm9tIHRoZSBmb2xsb3dpbmcgY29udGVudCBvcHRpb25zOjwvY21kPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+PHVpY29udHJvbD5DcmVhdGUgb3B0aW9uYWwgYXR0cmlidXRlczwvdWljb250cm9sPjogYm90aCBtYW5kYXRvcnkNCi1hbmQgb3B0aW9uYWwgYXR0cmlidXRlcyB3aWxsIGJlIGdlbmVyYXRlZC48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+Q3JlYXRlIG9wdGlvbmFsIGVsZW1lbnRzPC91aWNvbnRyb2w+OiBib3RoIG1hbmRhdG9yeSBhbmQNCi1vcHRpb25hbCBlbGVtZW50cyB3aWxsIGJlIGdlbmVyYXRlZC48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+Q3JlYXRlIGZpcnN0IGNob2ljZSBvZiByZXF1aXJlZCBjaG9pY2U8L3VpY29udHJvbD46IHRoZQ0KLWZpcnN0IG9wdGlvbiBvZiBhIHJlcXVpcmVkIGNob2ljZSB3aWxsIGJlIGdlbmVyYXRlZCBpbiB5b3VyIFhNTCBmaWxlLjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5GaWxsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIHdpdGggZGF0YTwvdWljb250cm9sPjogYW55DQotZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgZ2VuZXJhdGVkIHdpbGwgYmUgZmlsbGVkIHdpdGggc2FtcGxlIGRhdGEuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTxpbmZvPklmIHlvdSBkbyBub3Qgc2VsZWN0IGFueSBvZiB0aGVzZSBvcHRpb25zLCB0aGVuIG9ubHkgdGhlIG1pbmltdW0gYW1vdW50DQotb2YgY29udGVudCByZXF1aXJlZCBmb3IgdGhlIFhNTCBmaWxlIHdpbGwgYmUgY3JlYXRlZC48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VGhlIE5hbWVzcGFjZSBJbmZvcm1hdGlvbiBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZQ0KLXRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIFhNTCBzY2hlbWEsIGl0cyBwcmVmaXgsIGFuZCB0aGUgc2NoZW1hIGxvY2F0aW9uLiBTZWxlY3QNCi10aGUgZW50cnkgeW91IHdhbnQgdG8gZWRpdCBhbmQgY2xpY2sgPHVpY29udHJvbD5FZGl0PC91aWNvbnRyb2w+LjwvY21kPjxpbmZvPjx1bD4NCi08bGk+VGhlIHZhbHVlIGluIHRoZSA8dWljb250cm9sPk5hbWVzcGFjZSBOYW1lPC91aWNvbnRyb2w+IGZpZWxkIGlzIHRoZSB0YXJnZXQNCi1uYW1lc3BhY2Ugb2YgdGhlIFhNTCBzY2hlbWEuIFlvdXIgWE1MIGZpbGUgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtZQ0KLW5hbWVzcGFjZSBhcyBpdHMgWE1MIHNjaGVtYSBpcyBhc3NvY2lhdGVkIHdpdGguPC9saT4NCi08bGk+QWxsIHF1YWxpZmllZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB0aGUgWE1MIGZpbGUgYXNzb2NpYXRlZCB3aXRoDQotdGhlIG5hbWVzcGFjZSB3aWxsIGJlIHByZWZpeGVkIHdpdGggdGhlIDx1aWNvbnRyb2w+UHJlZml4PC91aWNvbnRyb2w+IHZhbHVlLjwvbGk+DQotPGxpPlRoZSAgPHVpY29udHJvbD5Mb2NhdGlvbiBIaW50PC91aWNvbnRyb2w+IGZpZWxkIGNvbnRhaW5zIHRoZSBsb2NhdGlvbg0KLW9mIHRoZSBYTUwgc2NoZW1hLjwvbGk+DQotPC91bD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBuYW1lc3BhY2VzIGFuZCBuYW1lc3BhY2UgcHJlZml4ZXMsIHJlZmVyIHRvDQotdGhlIHJlbGF0ZWQgcmVmZXJlbmNlcy48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiBhbmQgdGhlbiA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjxwPlRoZSBYTUwgZmlsZSB3aWxsIGNvbnRhaW4gdGhlIHNlbGVjdGVkIHJvb3QgZWxlbWVudCBhbmQgYW55IGVsZW1lbnRzDQotb3IgYXR0cmlidXRlcyBjb250YWluZWQgaW4gdGhlIHJvb3QgZWxlbWVudC4gSXQgYWxzbyBjb250YWlucyBpbmZvcm1hdGlvbg0KLWFib3V0IHRoZSBYTUwgZmlsZSBuYW1lc3BhY2UgYW5kIGxvY2F0aW9uLiBZb3UgY2FuIG5vdyBhZGQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMNCi10byB0aGUgWE1MIGZpbGUuPC9wPjxub3RlPkluIGNlcnRhaW4gY2FzZXMsIHdoZW4gYW4gWE1MIGZpbGUgaXMgZ2VuZXJhdGVkDQotZnJvbSBhIGNvbXBsZXggWE1MIHNjaGVtYSBmaWxlLCB0aGUgWE1MIGZpbGUgbWlnaHQgbm90IGJlIHZhbGlkLiBJZiB0aGlzIG9jY3VycywNCi15b3UgY2FuIG9wZW4gdGhlIGdlbmVyYXRlZCBmaWxlIGluIHRoZSBYTUwgZWRpdG9yIGFuZCBjb3JyZWN0IGFueSBlcnJvcnMgdGhhdA0KLW9jY3VyLiBVc3VhbGx5LCBvbmx5IGEgZmV3IGVycm9ycyBuZWVkIHRvIGJlIGZpeGVkLiBUaGUgZm9sbG93aW5nIFhNTCBzY2hlbWENCi1jb25zdHJ1Y3RzIG1pZ2h0IHByZXNlbnQgcHJvYmxlbXM6PC9ub3RlPjx1bD4NCi08bGk+UmVzdHJpY3Rpb25zOiBzb21ldGltZXMgcmVzdHJpY3RlZCBlbGVtZW50cyBhcmUgZXJyb25lb3VzbHkgZ2VuZXJhdGVkLiA8L2xpPg0KLTxsaT5GYWNldHM6IGRlZmF1bHQgZ2VuZXJhdGVkIGRhdGEgdmFsdWVzIG1pZ2h0IG5vdCBjb25mb3JtIHRvIGNvbXBsZXggZmFjZXRzDQotKGZvciBleGFtcGxlLCBwYXR0ZXJucykuPC9saT4NCi08bGk+QWJzdHJhY3QgZWxlbWVudHM6IGFic3RyYWN0IGVsZW1lbnRzIGFyZSBzb21ldGltZXMgZXJyb25lb3VzbHkgZ2VuZXJhdGVkLjwvbGk+DQotPC91bD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNTMzYWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIGdlbmVyYXRpbmcgZnJvbSBYTUwgc2NoZW1hcywgc2NoZW1hcywgZ2VuZXJhdGluZyBYTUwgZmlsZXMsIFhNTCBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBmaWxlcywgZ2VuZXJhdGluZyBmcm9tIFhNTCBzY2hlbWFzLCBzY2hlbWFzLCBnZW5lcmF0aW5nIFhNTCBmaWxlcywgWE1MIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjcmV0eG1sLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y3JleGR0ZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHR0YWcuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRjcmV4eHNkIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+R2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIGFuIFhNTCBzY2hlbWE8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRjcmV4eHNkIj48YSBuYW1lPSJ0Y3JleHhzZCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0bwotcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBYTUwgc2NoZW1hIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MCi1maWxlIGZyb20geW91ciBYTUwgc2NoZW1hIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeQotYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzCi1hbmQgYXR0cmlidXRlcyBpbiB5b3VyIFhNTCBzY2hlbWEuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5BZnRlciB5b3UgaGF2ZSBnZW5lcmF0ZWQgeW91ciBYTUwgZmlsZSwgeW91IGNhbiBmdXJ0aGVyIGN1c3RvbWl6ZQotaXQgaW4gdGhlIFhNTCBlZGl0b3IuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUKLVJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbwotZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSBhIHNjaGVtYSBmaWxlIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgTmF2aWdhdG9yIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBYTUwgc2NoZW1hIGZpbGUgdGhhdCB5b3UKLXdhbnQgdG8gd29yayB3aXRoIGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5HZW5lcmF0ZTwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBGaWxlPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IGEgcHJvamVjdCBvciBmb2xkZXIgdG8gY29udGFpbiB0aGUgWE1MIGZpbGUgYW5kIHR5cGUgYSBuYW1lCi1mb3IgdGhlIGZpbGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGUgTmFtZTwvc3Bhbj4gZmllbGQsIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPgotIFRoZSBuYW1lIG9mIHRoZSBmaWxlIG11c3QgZW5kIGluIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+LnhtbDwva2JkPi4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Sb290IGVsZW1lbnQ8L3NwYW4+IG9mIHRoZSBYTUwgZmlsZS48L3NwYW4+Ci0gVGhlIHJvb3QgZWxlbWVudCBvZiBhbiBYTUwgZmlsZSBpcyB0aGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGFsbCBvdGhlcgotZWxlbWVudHMgaW4gdGhhdCBmaWxlLiBBbGwgb2YgdGhlIGdsb2JhbCBlbGVtZW50cyB5b3UgaGF2ZSBkZWZpbmVkIGluIHRoZQotWE1MIHNjaGVtYSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBSb290IGVsZW1lbnQgbGlzdC4gSWYgeW91IGRvIG5vdCBoYXZlIGFueQotZ2xvYmFsIGVsZW1lbnRzIGluIHlvdXIgWE1MIHNjaGVtYSwgeW91IGNhbm5vdCBjcmVhdGUgYW4gWE1MIGZpbGUgZnJvbSBpdC4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IGZyb20gdGhlIGZvbGxvd2luZyBjb250ZW50IG9wdGlvbnM6PC9zcGFuPgotPHVsPgotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZSBvcHRpb25hbCBhdHRyaWJ1dGVzPC9zcGFuPjogYm90aCBtYW5kYXRvcnkKLWFuZCBvcHRpb25hbCBhdHRyaWJ1dGVzIHdpbGwgYmUgZ2VuZXJhdGVkLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5DcmVhdGUgb3B0aW9uYWwgZWxlbWVudHM8L3NwYW4+OiBib3RoIG1hbmRhdG9yeSBhbmQKLW9wdGlvbmFsIGVsZW1lbnRzIHdpbGwgYmUgZ2VuZXJhdGVkLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5DcmVhdGUgZmlyc3QgY2hvaWNlIG9mIHJlcXVpcmVkIGNob2ljZTwvc3Bhbj46IHRoZQotZmlyc3Qgb3B0aW9uIG9mIGEgcmVxdWlyZWQgY2hvaWNlIHdpbGwgYmUgZ2VuZXJhdGVkIGluIHlvdXIgWE1MIGZpbGUuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgd2l0aCBkYXRhPC9zcGFuPjogYW55Ci1lbGVtZW50cyBhbmQgYXR0cmlidXRlcyBnZW5lcmF0ZWQgd2lsbCBiZSBmaWxsZWQgd2l0aCBzYW1wbGUgZGF0YS48L2xpPgotCi08L3VsPgotCi0gSWYgeW91IGRvIG5vdCBzZWxlY3QgYW55IG9mIHRoZXNlIG9wdGlvbnMsIHRoZW4gb25seSB0aGUgbWluaW11bSBhbW91bnQKLW9mIGNvbnRlbnQgcmVxdWlyZWQgZm9yIHRoZSBYTUwgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgTmFtZXNwYWNlIEluZm9ybWF0aW9uIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi10YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBYTUwgc2NoZW1hLCBpdHMgcHJlZml4LCBhbmQgdGhlIHNjaGVtYSBsb2NhdGlvbi4gU2VsZWN0Ci10aGUgZW50cnkgeW91IHdhbnQgdG8gZWRpdCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdDwvc3Bhbj4uPC9zcGFuPiA8dWw+Ci08bGk+VGhlIHZhbHVlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lc3BhY2UgTmFtZTwvc3Bhbj4gZmllbGQgaXMgdGhlIHRhcmdldAotbmFtZXNwYWNlIG9mIHRoZSBYTUwgc2NoZW1hLiBZb3VyIFhNTCBmaWxlIHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbWUKLW5hbWVzcGFjZSBhcyBpdHMgWE1MIHNjaGVtYSBpcyBhc3NvY2lhdGVkIHdpdGguPC9saT4KLQotPGxpPkFsbCBxdWFsaWZpZWQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4gdGhlIFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aAotdGhlIG5hbWVzcGFjZSB3aWxsIGJlIHByZWZpeGVkIHdpdGggdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZpeDwvc3Bhbj4gdmFsdWUuPC9saT4KLQotPGxpPlRoZSAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TG9jYXRpb24gSGludDwvc3Bhbj4gZmllbGQgY29udGFpbnMgdGhlIGxvY2F0aW9uCi1vZiB0aGUgWE1MIHNjaGVtYS48L2xpPgotCi08L3VsPgotRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgbmFtZXNwYWNlcyBhbmQgbmFtZXNwYWNlIHByZWZpeGVzLCByZWZlciB0bwotdGhlIHJlbGF0ZWQgcmVmZXJlbmNlcy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiBhbmQgdGhlbiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBYTUwgZmlsZSB3aWxsIGNvbnRhaW4gdGhlIHNlbGVjdGVkIHJvb3QgZWxlbWVudCBhbmQgYW55IGVsZW1lbnRzCi1vciBhdHRyaWJ1dGVzIGNvbnRhaW5lZCBpbiB0aGUgcm9vdCBlbGVtZW50LiBJdCBhbHNvIGNvbnRhaW5zIGluZm9ybWF0aW9uCi1hYm91dCB0aGUgWE1MIGZpbGUgbmFtZXNwYWNlIGFuZCBsb2NhdGlvbi4gWW91IGNhbiBub3cgYWRkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzCi10byB0aGUgWE1MIGZpbGUuPC9wPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEluIGNlcnRhaW4gY2FzZXMsIHdoZW4gYW4gWE1MIGZpbGUgaXMgZ2VuZXJhdGVkCi1mcm9tIGEgY29tcGxleCBYTUwgc2NoZW1hIGZpbGUsIHRoZSBYTUwgZmlsZSBtaWdodCBub3QgYmUgdmFsaWQuIElmIHRoaXMgb2NjdXJzLAoteW91IGNhbiBvcGVuIHRoZSBnZW5lcmF0ZWQgZmlsZSBpbiB0aGUgWE1MIGVkaXRvciBhbmQgY29ycmVjdCBhbnkgZXJyb3JzIHRoYXQKLW9jY3VyLiBVc3VhbGx5LCBvbmx5IGEgZmV3IGVycm9ycyBuZWVkIHRvIGJlIGZpeGVkLiBUaGUgZm9sbG93aW5nIFhNTCBzY2hlbWEKLWNvbnN0cnVjdHMgbWlnaHQgcHJlc2VudCBwcm9ibGVtczo8L2Rpdj4KLTx1bD4KLTxsaT5SZXN0cmljdGlvbnM6IHNvbWV0aW1lcyByZXN0cmljdGVkIGVsZW1lbnRzIGFyZSBlcnJvbmVvdXNseSBnZW5lcmF0ZWQuIDwvbGk+Ci0KLTxsaT5GYWNldHM6IGRlZmF1bHQgZ2VuZXJhdGVkIGRhdGEgdmFsdWVzIG1pZ2h0IG5vdCBjb25mb3JtIHRvIGNvbXBsZXggZmFjZXRzCi0oZm9yIGV4YW1wbGUsIHBhdHRlcm5zKS48L2xpPgotCi08bGk+QWJzdHJhY3QgZWxlbWVudHM6IGFic3RyYWN0IGVsZW1lbnRzIGFyZSBzb21ldGltZXMgZXJyb25lb3VzbHkgZ2VuZXJhdGVkLjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiI+WE1MIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGNyZXR4bWwuaHRtbCIgdGl0bGU9IllvdSBjYW4gY3JlYXRlIGEgbmV3IFhNTCBmaWxlIHdoaWNoIHlvdSBjYW4gdGhlbiBlZGl0IGluIHRoZSBYTUwgZWRpdG9yLiBZb3UgY3JlYXRlIGEgbmV3IFhNTCBmaWxlIHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hIGZpbGUsIHNvIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhlIGtpbmQgb2YgY29udGVudCBpdCBjYW4gY29udGFpbi4iPkNyZWF0aW5nIFhNTCBmaWxlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RjcmV4ZHRkLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgaWYgeW91IHdhbnQgdG8gcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBEVEQgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggeW91ciBEVEQsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyIERURC4iPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0dGFnLmh0bWwiIHRpdGxlPSJUaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZWRpdGluZyBYTUwgZmlsZXMuIj5FZGl0aW5nIFhNTCBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsaW5mbyI+PHN0cm9uZz5SZWxhdGVkIGluZm9ybWF0aW9uPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5odG1sIj5YTUwgbmFtZXNwYWNlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRjbnN0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRjbnN0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZDQzY2UuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Y25zdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0ZWR0Y25zdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5FZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+SW4gdGhlIERlc2lnbiB2aWV3LCB3aGVuIHlvdSBlZGl0IGFuIFhNTCBmaWxlIHRoYXQgaGFzIGEgc2V0IG9mDQotY29uc3RyYWludHMgb3IgcnVsZXMgZGVmaW5lZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIHR1cm4gdGhlIGNvbnN0cmFpbnRzDQotb24gYW5kIG9mZiB0byBwcm92aWRlIGZsZXhpYmlsaXR5IGluIHRoZSB3YXkgeW91IGVkaXQsIGJ1dCBzdGlsbCBtYWludGFpbg0KLXRoZSB2YWxpZGl0eSBvZiB0aGUgZG9jdW1lbnQgcGVyaW9kaWNhbGx5Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPmVkaXRpbmcgd2l0aCBjb25zdHJhaW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIGZpbGVzPGluZGV4dGVybT5lZGl0aW5nIHdpdGggY29uc3RyYWludHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPiBXaGVuIHRoZSBjb25zdHJhaW50cyBhcmUgdHVybmVkIG9uLCBhbmQgeW91IGFyZSB3b3JraW5nIGluIHRoZQ0KLURlc2lnbiB2aWV3LCB0aGUgWE1MIGVkaXRvciBwcmV2ZW50cyB5b3UgZnJvbSBpbnNlcnRpbmcgZWxlbWVudHMsIGF0dHJpYnV0ZXMsDQotb3IgYXR0cmlidXRlIHZhbHVlcyBub3QgcGVybWl0dGVkIGJ5IHRoZSBydWxlcyBvZiB0aGUgWE1MIHNjaGVtYSBvciBEVEQsIGFuZA0KLWZyb20gcmVtb3ZpbmcgbmVjZXNzYXJ5IG9yIHByZWRlZmluZWQgc2V0cyBvZiB0YWdzIGFuZCB2YWx1ZXMuIEluIHRoaXMgbW9kZSwNCi1hbiBlbGVtZW50J3MgY29udGVudCBtdXN0IGJlIHZhbGlkIHRvIHVzZSB0aGUgWE1MIGVkaXRvcidzIGd1aWRlZCBlZGl0aW5nDQotb3B0aW9ucy48L3A+PHA+WW91IG1pZ2h0IHdhbnQgdG8gdHVybiB0aGUgY29uc3RyYWludHMgb2ZmIGZvciBhbiBYTUwgZmlsZQ0KLWlmIHlvdSBuZWVkIG1vcmUgZmxleGliaWxpdHkuIEZvciBleGFtcGxlLCB5b3Ugd2FudCB0byB0cnkgd29ya2luZyB3aXRoIGVsZW1lbnRzDQotb3IgYXR0cmlidXRlcyBub3QgcGVybWl0dGVkIGJ5IHRoZSBhc3NvY2lhdGVkIERURCBvciBYTUwgc2NoZW1hLCB3aXRob3V0IGFjdHVhbGx5DQotcmVtb3ZpbmcgdGhlIGFzc29jaWF0aW9uIHdpdGggdGhlIERURCBvciBYTUwgc2NoZW1hLjwvcD48cD5UbyB0dXJuIHRoZSBjb25zdHJhaW50cw0KLWZvciBhbiBYTUwgZmlsZSBvZmYsIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPlhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+VHVybg0KLUdyYW1tYXIgQ29uc3RyYWludHMgT2ZmPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gaW4gdGhlIHRvb2xiYXIuIEFmdGVyIHlvdQ0KLWhhdmUgdHVybmVkIHRoZSBjb25zdHJhaW50cyBvZmYgZm9yIGEgZmlsZSwgeW91IGNhbiBpbnNlcnQgb3IgZGVsZXRlIGFueSBlbGVtZW50DQotb3IgYXR0cmlidXRlIHJlZ2FyZGxlc3Mgb2YgdGhlIERURCBvciBYTUwgc2NoZW1hIHJ1bGVzLiBZb3UgY2FuIGNyZWF0ZSBuZXcNCi1lbGVtZW50cyBvciBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vdCBpbiB0aGUgRFREIG9yIHNjaGVtYSAtIHRoZXNlIERlc2lnbiB2aWV3DQotcHJvbXB0cyB3aWxsIG9ubHkgYXBwZWFyIHdoZW4geW91IGhhdmUgdHVybmVkIGNvbnN0cmFpbnRzIG9mZi4gVGhlIGZpbGUgbWlnaHQNCi1ub3QgYmUgdmFsaWQsIGhvd2V2ZXIsIGlmIHlvdSBkbyB0aGlzLiA8L3A+PHA+VGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzDQotd2hhdCB5b3UgY2FuIGRvIGlmIHlvdSB0dXJuIHRoZSBjb25zdHJhaW50cyBvZiBhIERURCBvZmY6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHRoZSBYTUwgZmlsZSBpbiB0aGUgWE1MIGVkaXRvciAocmlnaHQtY2xpY2sgdGhlIGZpbGUgaW4gdGhlDQotTmF2aWdhdG9yIHZpZXcgYW5kIGNsaWNrIDx1aWNvbnRyb2w+T3BlbiBXaXRoID4gWE1MIEVkaXRvcjwvdWljb250cm9sPikuIDwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPllvdSBoYXZlIGEgRFREIHRoYXQgc3BlY2lmaWVzIHRoYXQgYW4gZWxlbWVudCByZXF1aXJlcyBhdCBsZWFzdA0KLW9uZSBvZiBhIHNwZWNpZmljIGNoaWxkIGVsZW1lbnQ6ICA8L2NtZD48aW5mbz48Y29kZWJsb2NrPiZsdDshRUxFTUVOVCBwYXJlbnRFbGVtZW50IChjaGlsZEVsZW1lbnQrKT4NCi08L2NvZGVibG9jaz48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYsIGluIGFuIFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aCB5b3VyIERURCwgeW91IGF0dGVtcHQgdG8gcmVtb3ZlDQotdGhlIGZpbmFsIGNoaWxkIGVsZW1lbnQgb2YgdGhlIGVsZW1lbnQgd2l0aCB0aGUgRFREIGNvbnN0cmFpbnRzIHR1cm5lZCBvbiwNCi10aGUgZWRpdG9yIHdpbGwgbm90IGFsbG93IHlvdSB0byBkbyB0aGlzLCBhcyBpdCB3aWxsIG1ha2UgdGhlIGRvY3VtZW50IGludmFsaWQuPC9jbWQ+DQotPGluZm8+WW91IGNhbiBjb25maXJtIHRoaXMgYnkgdXNpbmcgdGhlIGVsZW1lbnQncyBwb3AtdXAgbWVudSB0byB2ZXJpZnkgdGhhdA0KLXRoZSA8dWljb250cm9sPlJlbW92ZTwvdWljb250cm9sPiBvcHRpb24gaXMgZ3JheWVkIG91dC48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VG8gdHVybiB0aGUgRFREIGNvbnN0cmFpbnRzIG9mZiwgY2xpY2sgPHVpY29udHJvbD5YTUwgPiBUdXJuIEdyYW1tYXINCi1Db25zdHJhaW50cyBPZmY8L3VpY29udHJvbD4uIDwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSBhdHRlbXB0IHRvIHJlbW92ZSB0aGUgc2FtZSBjaGlsZCBlbGVtZW50IHdpdGggY29uc3RyYWludHMNCi1vZmYsIHRoZSBlZGl0b3Igd2lsbCBhbGxvdyB5b3UgdG8uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VG8gY29ycmVjdCB0aGUgaW52YWxpZCBkb2N1bWVudCwgeW91IHdpbGwgaGF2ZSB0byByZS1hZGQgdGhlIG5lY2Vzc2FyeQ0KLWVsZW1lbnQsIG9yIHJlbW92ZSB0aGUgaW52YWxpZCB0YWdnaW5nIG9yIHZhbHVlLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PD9QdWIgQ2FyZXQ/PjxwPklmIHlvdSBpbnRyb2R1Y2UgZXJyb3JzIGludG8geW91ciBmaWxlcywgeW91IG11c3QNCi1zYXZlIGFuZCB2YWxpZGF0ZSB0aGUgZmlsZSBpbiBvcmRlciB0byBzZWUgYSBsaXN0IG9mIHRoZSBlcnJvcnMgeW91IGhhdmUgaW50cm9kdWNlZC4NCi1UaGV5IHdpbGwgYmUgbGlzdGVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiBBZnRlciB5b3UgZml4IHRoZSBlcnJvcnMsIHlvdSBtdXN0DQotc2F2ZSBhbmQgdmFsaWRhdGUgeW91ciBmaWxlIGFnYWluIHRvIHNlZSBpZiB0aGUgZmlsZSBpcyBub3cgdmFsaWQuPC9wPjxwPlRoZXNlDQotaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28NCi13b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMzgxND8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Y25zdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Y25zdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTc0YjQ5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGNuc3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSW4gdGhlIERlc2lnbiB2aWV3LCB3aGVuIHlvdSBlZGl0IGFuIFhNTCBmaWxlIHRoYXQgaGFzIGEgc2V0IG9mIGNvbnN0cmFpbnRzIG9yIHJ1bGVzIGRlZmluZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiB0dXJuIHRoZSBjb25zdHJhaW50cyBvbiBhbmQgb2ZmIHRvIHByb3ZpZGUgZmxleGliaWxpdHkgaW4gdGhlIHdheSB5b3UgZWRpdCwgYnV0IHN0aWxsIG1haW50YWluIHRoZSB2YWxpZGl0eSBvZiB0aGUgZG9jdW1lbnQgcGVyaW9kaWNhbGx5LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJbiB0aGUgRGVzaWduIHZpZXcsIHdoZW4geW91IGVkaXQgYW4gWE1MIGZpbGUgdGhhdCBoYXMgYSBzZXQgb2YgY29uc3RyYWludHMgb3IgcnVsZXMgZGVmaW5lZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIHR1cm4gdGhlIGNvbnN0cmFpbnRzIG9uIGFuZCBvZmYgdG8gcHJvdmlkZSBmbGV4aWJpbGl0eSBpbiB0aGUgd2F5IHlvdSBlZGl0LCBidXQgc3RpbGwgbWFpbnRhaW4gdGhlIHZhbGlkaXR5IG9mIHRoZSBkb2N1bWVudCBwZXJpb2RpY2FsbHkuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgZWRpdGluZyB3aXRoIGNvbnN0cmFpbnRzLCBYTUwgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBlZGl0aW5nIHdpdGggY29uc3RyYWludHMsIFhNTCBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0ZG9jLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Z3JhbS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdHNjaC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0ZWR0Y25zdCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGVkdGNuc3QiPjxhIG5hbWU9InRlZHRjbnN0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkluIHRoZSBEZXNpZ24gdmlldywgd2hlbiB5b3UgZWRpdCBhbiBYTUwgZmlsZSB0aGF0IGhhcyBhIHNldCBvZgotY29uc3RyYWludHMgb3IgcnVsZXMgZGVmaW5lZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIHR1cm4gdGhlIGNvbnN0cmFpbnRzCi1vbiBhbmQgb2ZmIHRvIHByb3ZpZGUgZmxleGliaWxpdHkgaW4gdGhlIHdheSB5b3UgZWRpdCwgYnV0IHN0aWxsIG1haW50YWluCi10aGUgdmFsaWRpdHkgb2YgdGhlIGRvY3VtZW50IHBlcmlvZGljYWxseS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPiBXaGVuIHRoZSBjb25zdHJhaW50cyBhcmUgdHVybmVkIG9uLCBhbmQgeW91IGFyZSB3b3JraW5nIGluIHRoZQotRGVzaWduIHZpZXcsIHRoZSBYTUwgZWRpdG9yIHByZXZlbnRzIHlvdSBmcm9tIGluc2VydGluZyBlbGVtZW50cywgYXR0cmlidXRlcywKLW9yIGF0dHJpYnV0ZSB2YWx1ZXMgbm90IHBlcm1pdHRlZCBieSB0aGUgcnVsZXMgb2YgdGhlIFhNTCBzY2hlbWEgb3IgRFRELCBhbmQKLWZyb20gcmVtb3ZpbmcgbmVjZXNzYXJ5IG9yIHByZWRlZmluZWQgc2V0cyBvZiB0YWdzIGFuZCB2YWx1ZXMuIEluIHRoaXMgbW9kZSwKLWFuIGVsZW1lbnQncyBjb250ZW50IG11c3QgYmUgdmFsaWQgdG8gdXNlIHRoZSBYTUwgZWRpdG9yJ3MgZ3VpZGVkIGVkaXRpbmcKLW9wdGlvbnMuPC9wPgotPHA+WW91IG1pZ2h0IHdhbnQgdG8gdHVybiB0aGUgY29uc3RyYWludHMgb2ZmIGZvciBhbiBYTUwgZmlsZQotaWYgeW91IG5lZWQgbW9yZSBmbGV4aWJpbGl0eS4gRm9yIGV4YW1wbGUsIHlvdSB3YW50IHRvIHRyeSB3b3JraW5nIHdpdGggZWxlbWVudHMKLW9yIGF0dHJpYnV0ZXMgbm90IHBlcm1pdHRlZCBieSB0aGUgYXNzb2NpYXRlZCBEVEQgb3IgWE1MIHNjaGVtYSwgd2l0aG91dCBhY3R1YWxseQotcmVtb3ZpbmcgdGhlIGFzc29jaWF0aW9uIHdpdGggdGhlIERURCBvciBYTUwgc2NoZW1hLjwvcD4KLTxwPlRvIHR1cm4gdGhlIGNvbnN0cmFpbnRzCi1mb3IgYW4gWE1MIGZpbGUgb2ZmLCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UdXJuCi1HcmFtbWFyIENvbnN0cmFpbnRzIE9mZjwvc3Bhbj48L3NwYW4+IGluIHRoZSB0b29sYmFyLiBBZnRlciB5b3UKLWhhdmUgdHVybmVkIHRoZSBjb25zdHJhaW50cyBvZmYgZm9yIGEgZmlsZSwgeW91IGNhbiBpbnNlcnQgb3IgZGVsZXRlIGFueSBlbGVtZW50Ci1vciBhdHRyaWJ1dGUgcmVnYXJkbGVzcyBvZiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgcnVsZXMuIFlvdSBjYW4gY3JlYXRlIG5ldwotZWxlbWVudHMgb3IgYXR0cmlidXRlcyB0aGF0IGFyZSBub3QgaW4gdGhlIERURCBvciBzY2hlbWEgLSB0aGVzZSBEZXNpZ24gdmlldwotcHJvbXB0cyB3aWxsIG9ubHkgYXBwZWFyIHdoZW4geW91IGhhdmUgdHVybmVkIGNvbnN0cmFpbnRzIG9mZi4gVGhlIGZpbGUgbWlnaHQKLW5vdCBiZSB2YWxpZCwgaG93ZXZlciwgaWYgeW91IGRvIHRoaXMuIDwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cwotd2hhdCB5b3UgY2FuIGRvIGlmIHlvdSB0dXJuIHRoZSBjb25zdHJhaW50cyBvZiBhIERURCBvZmY6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB0aGUgWE1MIGZpbGUgaW4gdGhlIFhNTCBlZGl0b3IgKHJpZ2h0LWNsaWNrIHRoZSBmaWxlIGluIHRoZQotTmF2aWdhdG9yIHZpZXcgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9wZW4gV2l0aCAmZ3Q7IFhNTCBFZGl0b3I8L3NwYW4+KS4gPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Zb3UgaGF2ZSBhIERURCB0aGF0IHNwZWNpZmllcyB0aGF0IGFuIGVsZW1lbnQgcmVxdWlyZXMgYXQgbGVhc3QKLW9uZSBvZiBhIHNwZWNpZmljIGNoaWxkIGVsZW1lbnQ6ICA8L3NwYW4+IDxwcmU+Jmx0OyFFTEVNRU5UIHBhcmVudEVsZW1lbnQgKGNoaWxkRWxlbWVudCspJmd0OwotPC9wcmU+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmLCBpbiBhbiBYTUwgZmlsZSBhc3NvY2lhdGVkIHdpdGggeW91ciBEVEQsIHlvdSBhdHRlbXB0IHRvIHJlbW92ZQotdGhlIGZpbmFsIGNoaWxkIGVsZW1lbnQgb2YgdGhlIGVsZW1lbnQgd2l0aCB0aGUgRFREIGNvbnN0cmFpbnRzIHR1cm5lZCBvbiwKLXRoZSBlZGl0b3Igd2lsbCBub3QgYWxsb3cgeW91IHRvIGRvIHRoaXMsIGFzIGl0IHdpbGwgbWFrZSB0aGUgZG9jdW1lbnQgaW52YWxpZC48L3NwYW4+Ci0gWW91IGNhbiBjb25maXJtIHRoaXMgYnkgdXNpbmcgdGhlIGVsZW1lbnQncyBwb3AtdXAgbWVudSB0byB2ZXJpZnkgdGhhdAotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlbW92ZTwvc3Bhbj4gb3B0aW9uIGlzIGdyYXllZCBvdXQuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyB0dXJuIHRoZSBEVEQgY29uc3RyYWludHMgb2ZmLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgJmd0OyBUdXJuIEdyYW1tYXIKLUNvbnN0cmFpbnRzIE9mZjwvc3Bhbj4uIDwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSBhdHRlbXB0IHRvIHJlbW92ZSB0aGUgc2FtZSBjaGlsZCBlbGVtZW50IHdpdGggY29uc3RyYWludHMKLW9mZiwgdGhlIGVkaXRvciB3aWxsIGFsbG93IHlvdSB0by48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBjb3JyZWN0IHRoZSBpbnZhbGlkIGRvY3VtZW50LCB5b3Ugd2lsbCBoYXZlIHRvIHJlLWFkZCB0aGUgbmVjZXNzYXJ5Ci1lbGVtZW50LCBvciByZW1vdmUgdGhlIGludmFsaWQgdGFnZ2luZyBvciB2YWx1ZS48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+SWYgeW91IGludHJvZHVjZSBlcnJvcnMgaW50byB5b3VyIGZpbGVzLCB5b3UgbXVzdAotc2F2ZSBhbmQgdmFsaWRhdGUgdGhlIGZpbGUgaW4gb3JkZXIgdG8gc2VlIGEgbGlzdCBvZiB0aGUgZXJyb3JzIHlvdSBoYXZlIGludHJvZHVjZWQuCi1UaGV5IHdpbGwgYmUgbGlzdGVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiBBZnRlciB5b3UgZml4IHRoZSBlcnJvcnMsIHlvdSBtdXN0Ci1zYXZlIGFuZCB2YWxpZGF0ZSB5b3VyIGZpbGUgYWdhaW4gdG8gc2VlIGlmIHRoZSBmaWxlIGlzIG5vdyB2YWxpZC48L3A+Ci08cD5UaGVzZQotaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28KLXdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgdGl0bGU9IldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzIGJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuIj5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGRvYy5odG1sIiB0aXRsZT0iVGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4gYW4gWE1MIGZpbGUgaXMgdXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0IHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgRFREIGZpbGUuIFlvdSBjYW4gZWRpdCB5b3VyIERPQ1RZUEUgZGVjbGFyYXRpb24gdG8gY2hhbmdlIHRoZSBEVEQgZmlsZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4iPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eG1sY2F0Lmh0bWwiIHRpdGxlPSJBbiBYTUwgQ2F0YWxvZyBlbnRyeSBjb250YWlucyB0d28gcGFydHMgLSBhIEtleSAod2hpY2ggcmVwcmVzZW50cyBhIERURCBvciBYTUwgc2NoZW1hKSBhbmQgYSBMb2NhdGlvbiAoc2ltaWxhciB0byBhIFVSSSwgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBEVEQgb3IgWE1MIHNjaGVtYSdzIGxvY2F0aW9uKS4gWW91IGNhbiBwbGFjZSB0aGUgS2V5IGluIGFuIFhNTCBmaWxlLiBXaGVuIHRoZSBYTUwgcHJvY2Vzc29yIGVuY291bnRlcnMgaXQsIGl0IHdpbGwgdXNlIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeSB0byBmaW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIHRoZSBLZXkiPkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRncmFtLmh0bWwiIHRpdGxlPSJJZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIGEgRFREIGZpbGUgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIGZpbGUgKHRoYXQgaXMgY3VycmVudGx5IG9wZW4pLCBjbGljayBYTUwgJmd0OyBSZWxvYWQgRGVwZW5kZW5jaWVzIHRvIHVwZGF0ZSB0aGUgWE1MIGZpbGUgd2l0aCB0aGVzZSBjaGFuZ2VzLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgZ3VpZGVkIGVkaXRpbmcgbWVjaGFuaXNtcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvciwgc3VjaCBhcyBjb250ZW50IGFzc2lzdC4iPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaC5odG1sIiB0aXRsZT0iWW91ciBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcm92aWRlIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFhNTCBmaWxlLCBzdWNoIGFzIHRoZSBYTUwgc2NoZW1hIGFuZCBuYW1lc3BhY2UgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggb3IgYWRkIGEgbmV3IGFzc29jaWF0aW9uLiBNb2RpZnlpbmcgYW55IGFzc29jaWF0aW9ucyBjYW4gaW1wYWN0IHdoYXQgY29udGVudCBpcyBhbGxvd2VkIGluIHRoZSBYTUwgZmlsZS4iPkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGVuYy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZW5jLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYmVlMWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZW5jLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGVkdGVuYyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U3BlY2lmeWluZyBYTUwgZGVmYXVsdCBlbmNvZGluZyBsaW5lIGRlbGltaXRlcnM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlNwZWNpZnlpbmcgbGluZSBkZWxpbWl0ZXJzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoaXMgcGFnZSBsZXRzIHlvdSBzcGVjaWZ5IHRoZSBsaW5lIGRlbGltaXRlciBhbmQgdGhlIHRleHQgZW5jb2RpbmcNCi10aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBjcmVhdGUgb3Igc2F2ZSBhbiBYTUwgcmVsYXRlZCBmaWxlLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+c3BlY2lmeWluZyBsaW5lIGRlbGltaXRlcnM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPmxpbmUgZGVsaW1pdGVyczxpbmRleHRlcm0+WE1MIGZpbGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08a2V5d29yZHM+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UbyBzcGVjaWZ5IHRoZSBsaW5lIGRlbGltaXRlciB5b3Ugd2FudCB0byB1c2UsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcNCi1zdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPlhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+WE1MDQotRmlsZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Gcm9tIHRoZSA8dWljb250cm9sPkVuY29kaW5nPC91aWNvbnRyb2w+IGZpZWxkLCBzcGVjaWZ5IHRoZSBkZWZhdWx0DQotY2hhcmFjdGVyIGVuY29kaW5nIHNldCB0aGF0IGlzIHVzZWQgd2hlbiBjcmVhdGluZyBYTUwgcmVsYXRlZCBmaWxlcyAoRFREcywNCi1YTUwgZmlsZXMsIFhNTCBzY2hlbWFzKS4gQ2hhbmdpbmcgdGhlIGVuY29kaW5nIGNhdXNlcyBhbnkgbmV3LCBYTUwgcmVsYXRlZA0KLWZpbGVzIHRoYXQgYXJlIGNyZWF0ZWQgZnJvbSBzY3JhdGNoIHRvIHVzZSB0aGUgc2VsZWN0ZWQgZW5jb2RpbmcuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPkdlbmVyYWw8L3VpY29udHJvbD48dWljb250cm9sPldvcmtzcGFjZTwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IGluIHRoZSBsZWZ0IHBhbmUgb2YgdGhlIFByZWZlcmVuY2VzIHdpbmRvdyBhbmQgY2hvc2UgZWl0aGVyIDx1aWNvbnRyb2w+RGVmYXVsdDwvdWljb250cm9sPiBvciA8dWljb250cm9sPk90aGVyPC91aWNvbnRyb2w+IGluDQotdGhlIDx1aWNvbnRyb2w+TmV3IHRleHQgZmlsZSBsaW5lIGRlbGltaXRlciA8L3VpY29udHJvbD5zZWN0aW9uLiBTZWxlY3QgdGhlDQotb3BlcmF0aW5nIHN5c3RlbSB0aGF0IGFwcGxpZXMgdG8geW91ciBkZXZlbG9wbWVudCBvciBkZXBsb3ltZW50IHBsYXRmb3JtIGZyb20NCi10aGUgPHVpY29udHJvbD5PdGhlcjwvdWljb250cm9sPiBkcm9wIGRvd24gbGlzdC48L2NtZD48L3N0ZXA+PD9QdWIgQ2FyZXQ/Pg0KLTxzdGVwPjxjbWQ+Q2xpY2sgIDx1aWNvbnRyb2w+QXBwbHk8L3VpY29udHJvbD4sIHRoZW4gPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyMDAyPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRlbmMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGVuYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWE2Yzk4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGVuYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU3BlY2lmeWluZyBYTUwgZGVmYXVsdCBlbmNvZGluZyBsaW5lIGRlbGltaXRlcnMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyBwYWdlIGxldHMgeW91IHNwZWNpZnkgdGhlIGxpbmUgZGVsaW1pdGVyIGFuZCB0aGUgdGV4dCBlbmNvZGluZyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBjcmVhdGUgb3Igc2F2ZSBhbiBYTUwgcmVsYXRlZCBmaWxlLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGlzIHBhZ2UgbGV0cyB5b3Ugc3BlY2lmeSB0aGUgbGluZSBkZWxpbWl0ZXIgYW5kIHRoZSB0ZXh0IGVuY29kaW5nIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4geW91IGNyZWF0ZSBvciBzYXZlIGFuIFhNTCByZWxhdGVkIGZpbGUuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGZpbGVzLCBzcGVjaWZ5aW5nIGxpbmUgZGVsaW1pdGVycywgbGluZSBkZWxpbWl0ZXJzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGZpbGVzLCBzcGVjaWZ5aW5nIGxpbmUgZGVsaW1pdGVycywgbGluZSBkZWxpbWl0ZXJzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0ZWR0ZW5jIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U3BlY2lmeWluZyBsaW5lIGRlbGltaXRlcnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRlZHRlbmMiPjxhIG5hbWU9InRlZHRlbmMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNwZWNpZnlpbmcgWE1MIGRlZmF1bHQgZW5jb2RpbmcgbGluZSBkZWxpbWl0ZXJzPC9oMT4KLQotCi0KLQotPGRpdj48cD5UaGlzIHBhZ2UgbGV0cyB5b3Ugc3BlY2lmeSB0aGUgbGluZSBkZWxpbWl0ZXIgYW5kIHRoZSB0ZXh0IGVuY29kaW5nCi10aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBjcmVhdGUgb3Igc2F2ZSBhbiBYTUwgcmVsYXRlZCBmaWxlLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VG8gc3BlY2lmeSB0aGUgbGluZSBkZWxpbWl0ZXIgeW91IHdhbnQgdG8gdXNlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nCi1zdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotRmlsZXM8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVuY29kaW5nPC9zcGFuPiBmaWVsZCwgc3BlY2lmeSB0aGUgZGVmYXVsdAotY2hhcmFjdGVyIGVuY29kaW5nIHNldCB0aGF0IGlzIHVzZWQgd2hlbiBjcmVhdGluZyBYTUwgcmVsYXRlZCBmaWxlcyAoRFREcywKLVhNTCBmaWxlcywgWE1MIHNjaGVtYXMpLiBDaGFuZ2luZyB0aGUgZW5jb2RpbmcgY2F1c2VzIGFueSBuZXcsIFhNTCByZWxhdGVkCi1maWxlcyB0aGF0IGFyZSBjcmVhdGVkIGZyb20gc2NyYXRjaCB0byB1c2UgdGhlIHNlbGVjdGVkIGVuY29kaW5nLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+U2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3Jrc3BhY2U8L3NwYW4+Ci08L3NwYW4+IGluIHRoZSBsZWZ0IHBhbmUgb2YgdGhlIFByZWZlcmVuY2VzIHdpbmRvdyBhbmQgY2hvc2UgZWl0aGVyIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlZmF1bHQ8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk90aGVyPC9zcGFuPiBpbgotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldyB0ZXh0IGZpbGUgbGluZSBkZWxpbWl0ZXIgPC9zcGFuPnNlY3Rpb24uIFNlbGVjdCB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gdGhhdCBhcHBsaWVzIHRvIHlvdXIgZGV2ZWxvcG1lbnQgb3IgZGVwbG95bWVudCBwbGF0Zm9ybSBmcm9tCi10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3RoZXI8L3NwYW4+IGRyb3AgZG93biBsaXN0Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGx5PC9zcGFuPiwgdGhlbiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiIgLz4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGdyYW0uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGdyYW0uZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4ODE1Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRncmFtLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRlZHRncmFtIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5VcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+VXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+SWYgeW91IG1ha2UgY2hhbmdlcyB0byBhIERURCBmaWxlIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoDQotYW4gWE1MIGZpbGUgKHRoYXQgaXMgY3VycmVudGx5IG9wZW4pLCBjbGljayA8dWljb250cm9sPlhNTCA+IFJlbG9hZCBEZXBlbmRlbmNpZXM8L3VpY29udHJvbD4gdG8NCi11cGRhdGUgdGhlIFhNTCBmaWxlIHdpdGggdGhlc2UgY2hhbmdlcy4gVGhlIGNoYW5nZXMgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlDQotZ3VpZGVkIGVkaXRpbmcgbWVjaGFuaXNtcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvciwgc3VjaCBhcyBjb250ZW50IGFzc2lzdC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT51cGRhdGluZyBYTUwgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+dXBkYXRpbmcgd2l0aCBhc3NvY2lhdGVkIGNoYW5nZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPkZvciBleGFtcGxlLCB5b3UgaGF2ZSBhIERURCBmaWxlIGNhbGxlZCAiQ29udGFjdC5kdGQiIGFuZCBhbiBYTUwNCi1maWxlIGNhbGxlZCAiQ29udGFjdC54bWwiIGFzc29jaWF0ZWQgd2l0aCBpdC4gQ29udGFjdC5kdGQgY29udGFpbnMgYSByb290DQotZWxlbWVudCBjYWxsZWQgPHVzZXJpbnB1dD5Db250YWN0PC91c2VyaW5wdXQ+IHRoYXQgY2FuIGNvbnRhaW4gYW55IG9mIHRoZQ0KLWZvbGxvd2luZyBjaGlsZHJlbiBlbGVtZW50czogIDx1c2VyaW5wdXQ+TmFtZTwvdXNlcmlucHV0PiwgPHVzZXJpbnB1dD5Qb3N0YWxBZGRyZXNzPC91c2VyaW5wdXQ+LDw/UHViIENhcmV0Pz4gPHVzZXJpbnB1dD5FbWFpbDwvdXNlcmlucHV0Pi4NCi1JZiB5b3UgcmVtb3ZlIHRoZSBjaGlsZCBlbGVtZW50ICA8dXNlcmlucHV0PkVtYWlsPC91c2VyaW5wdXQ+IGZyb20gdGhlIERURCwNCi15b3Ugd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byBhZGQgYW4gIDx1c2VyaW5wdXQ+RW1haWw8L3VzZXJpbnB1dD4gY2hpbGQgZWxlbWVudA0KLXRvIHlvdXIgcm9vdCBlbGVtZW50IENvbnRhY3QgaW4geW91ciBDb250YWN0LnhtbCBmaWxlLiBUaGlzIGNoYW5nZSwgaG93ZXZlciwNCi13aWxsIG5vdCBjb21lIGludG8gZWZmZWN0IHVudGlsIHlvdSBzYXZlIHlvdXIgY2hhbmdlcyBpbiB0aGUgRFREIGFuZCBjbGljayA8dWljb250cm9sPlhNTA0KLT4gUmVsb2FkIERlcGVuZGVuY2llczwvdWljb250cm9sPiBpbiB0aGUgWE1MIGVkaXRvci4gVW50aWwgeW91IGNsaWNrIGl0LCB5b3UNCi13aWxsIHN0aWxsIGJlIGFibGUgdG8gYWRkIDx1c2VyaW5wdXQ+RW1haWw8L3VzZXJpbnB1dD4gZWxlbWVudHMgdG8gQ29udGFjdC54bWwuPC9wPjxwPlRoaXMNCi1mZWF0dXJlIGlzIHZlcnkgaGFuZHkgd2hlbiB5b3UgYXJlIG1ha2luZyB1cGRhdGVzIHRvIGJvdGggRFREcyBhbmQgWE1MIHNjaGVtYXMNCi1hbmQgWE1MIGZpbGVzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcy48L3A+PC9jb250ZXh0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAxOTg3Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRncmFtLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRncmFtLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NmUyM2IuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Z3JhbS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSWYgeW91IG1ha2UgY2hhbmdlcyB0byBhIERURCBmaWxlIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBmaWxlICh0aGF0IGlzIGN1cnJlbnRseSBvcGVuKSwgY2xpY2sgWE1MICZndDsgUmVsb2FkIERlcGVuZGVuY2llcyB0byB1cGRhdGUgdGhlIFhNTCBmaWxlIHdpdGggdGhlc2UgY2hhbmdlcy4gVGhlIGNoYW5nZXMgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIGd1aWRlZCBlZGl0aW5nIG1lY2hhbmlzbXMgYXZhaWxhYmxlIGluIHRoZSBlZGl0b3IsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IklmIHlvdSBtYWtlIGNoYW5nZXMgdG8gYSBEVEQgZmlsZSBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgZmlsZSAodGhhdCBpcyBjdXJyZW50bHkgb3BlbiksIGNsaWNrIFhNTCAmZ3Q7IFJlbG9hZCBEZXBlbmRlbmNpZXMgdG8gdXBkYXRlIHRoZSBYTUwgZmlsZSB3aXRoIHRoZXNlIGNoYW5nZXMuIFRoZSBjaGFuZ2VzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBndWlkZWQgZWRpdGluZyBtZWNoYW5pc21zIGF2YWlsYWJsZSBpbiB0aGUgZWRpdG9yLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIHVwZGF0aW5nIFhNTCBmaWxlcywgWE1MIGZpbGVzLCB1cGRhdGluZyB3aXRoIGFzc29jaWF0ZWQgY2hhbmdlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIHVwZGF0aW5nIFhNTCBmaWxlcywgWE1MIGZpbGVzLCB1cGRhdGluZyB3aXRoIGFzc29jaWF0ZWQgY2hhbmdlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGRvYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGNuc3QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRzY2guaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0ZWR0Z3JhbSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0ZWR0Z3JhbSI+PGEgbmFtZT0idGVkdGdyYW0iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC9oMT4KLQotCi0KLQotPGRpdj48cD5JZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIGEgRFREIGZpbGUgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGgKLWFuIFhNTCBmaWxlICh0aGF0IGlzIGN1cnJlbnRseSBvcGVuKSwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MICZndDsgUmVsb2FkIERlcGVuZGVuY2llczwvc3Bhbj4gdG8KLXVwZGF0ZSB0aGUgWE1MIGZpbGUgd2l0aCB0aGVzZSBjaGFuZ2VzLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUKLWd1aWRlZCBlZGl0aW5nIG1lY2hhbmlzbXMgYXZhaWxhYmxlIGluIHRoZSBlZGl0b3IsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5Gb3IgZXhhbXBsZSwgeW91IGhhdmUgYSBEVEQgZmlsZSBjYWxsZWQgIkNvbnRhY3QuZHRkIiBhbmQgYW4gWE1MCi1maWxlIGNhbGxlZCAiQ29udGFjdC54bWwiIGFzc29jaWF0ZWQgd2l0aCBpdC4gQ29udGFjdC5kdGQgY29udGFpbnMgYSByb290Ci1lbGVtZW50IGNhbGxlZCA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkNvbnRhY3Q8L2tiZD4gdGhhdCBjYW4gY29udGFpbiBhbnkgb2YgdGhlCi1mb2xsb3dpbmcgY2hpbGRyZW4gZWxlbWVudHM6ICA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPk5hbWU8L2tiZD4sIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+UG9zdGFsQWRkcmVzczwva2JkPiwgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5FbWFpbDwva2JkPi4KLUlmIHlvdSByZW1vdmUgdGhlIGNoaWxkIGVsZW1lbnQgIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+RW1haWw8L2tiZD4gZnJvbSB0aGUgRFRELAoteW91IHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gYWRkIGFuICA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkVtYWlsPC9rYmQ+IGNoaWxkIGVsZW1lbnQKLXRvIHlvdXIgcm9vdCBlbGVtZW50IENvbnRhY3QgaW4geW91ciBDb250YWN0LnhtbCBmaWxlLiBUaGlzIGNoYW5nZSwgaG93ZXZlciwKLXdpbGwgbm90IGNvbWUgaW50byBlZmZlY3QgdW50aWwgeW91IHNhdmUgeW91ciBjaGFuZ2VzIGluIHRoZSBEVEQgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotJmd0OyBSZWxvYWQgRGVwZW5kZW5jaWVzPC9zcGFuPiBpbiB0aGUgWE1MIGVkaXRvci4gVW50aWwgeW91IGNsaWNrIGl0LCB5b3UKLXdpbGwgc3RpbGwgYmUgYWJsZSB0byBhZGQgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5FbWFpbDwva2JkPiBlbGVtZW50cyB0byBDb250YWN0LnhtbC48L3A+Ci08cD5UaGlzCi1mZWF0dXJlIGlzIHZlcnkgaGFuZHkgd2hlbiB5b3UgYXJlIG1ha2luZyB1cGRhdGVzIHRvIGJvdGggRFREcyBhbmQgWE1MIHNjaGVtYXMKLWFuZCBYTUwgZmlsZXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzLjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIHRpdGxlPSJXaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcyBib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLiI+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRjbnN0Lmh0bWwiIHRpdGxlPSJJbiB0aGUgRGVzaWduIHZpZXcsIHdoZW4geW91IGVkaXQgYW4gWE1MIGZpbGUgdGhhdCBoYXMgYSBzZXQgb2YgY29uc3RyYWludHMgb3IgcnVsZXMgZGVmaW5lZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIHR1cm4gdGhlIGNvbnN0cmFpbnRzIG9uIGFuZCBvZmYgdG8gcHJvdmlkZSBmbGV4aWJpbGl0eSBpbiB0aGUgd2F5IHlvdSBlZGl0LCBidXQgc3RpbGwgbWFpbnRhaW4gdGhlIHZhbGlkaXR5IG9mIHRoZSBkb2N1bWVudCBwZXJpb2RpY2FsbHkuIj5FZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0ZG9jLmh0bWwiIHRpdGxlPSJUaGUgRE9DVFlQRSBkZWNsYXJhdGlvbiBpbiBhbiBYTUwgZmlsZSBpcyB1c2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXQgdG8gYXNzb2NpYXRlIGl0IHdpdGggYSBEVEQgZmlsZS4gWW91IGNhbiBlZGl0IHlvdXIgRE9DVFlQRSBkZWNsYXJhdGlvbiB0byBjaGFuZ2UgdGhlIERURCBmaWxlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLiI+RWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9uczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4bWxjYXQuaHRtbCIgdGl0bGU9IkFuIFhNTCBDYXRhbG9nIGVudHJ5IGNvbnRhaW5zIHR3byBwYXJ0cyAtIGEgS2V5ICh3aGljaCByZXByZXNlbnRzIGEgRFREIG9yIFhNTCBzY2hlbWEpIGFuZCBhIExvY2F0aW9uIChzaW1pbGFyIHRvIGEgVVJJLCB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIERURCBvciBYTUwgc2NoZW1hJ3MgbG9jYXRpb24pLiBZb3UgY2FuIHBsYWNlIHRoZSBLZXkgaW4gYW4gWE1MIGZpbGUuIFdoZW4gdGhlIFhNTCBwcm9jZXNzb3IgZW5jb3VudGVycyBpdCwgaXQgd2lsbCB1c2UgdGhlIFhNTCBDYXRhbG9nIGVudHJ5IHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIEtleSI+QWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaC5odG1sIiB0aXRsZT0iWW91ciBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcm92aWRlIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFhNTCBmaWxlLCBzdWNoIGFzIHRoZSBYTUwgc2NoZW1hIGFuZCBuYW1lc3BhY2UgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggb3IgYWRkIGEgbmV3IGFzc29jaWF0aW9uLiBNb2RpZnlpbmcgYW55IGFzc29jaWF0aW9ucyBjYW4gaW1wYWN0IHdoYXQgY29udGVudCBpcyBhbGxvd2VkIGluIHRoZSBYTUwgZmlsZS4iPkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByb2MuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByb2MuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc5OWQxMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcm9jLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRlZHRwcm9jIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+SWYgeW91IGhhdmUgaW5zdHJ1Y3Rpb25zIHlvdSB3YW50IHRvIHNlbmQgdG8gYW4gYXBwbGljYXRpb24gdXNpbmcNCi1hbiBYTUwgZG9jdW1lbnQsIHlvdSBjYW4gdXNlIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4gPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+cHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+cHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRvIGNyZWF0ZSBhIG5ldyBwcm9jZXNzaW5nIGluc3RydWN0aW9uLCByaWdodC1jbGljayBpbiB0aGUgRGVzaWduDQotdmlldywgYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkIENoaWxkPC91aWNvbnRyb2w+LCA8dWljb250cm9sPkFkZCBCZWZvcmU8L3VpY29udHJvbD4gb3IgPHVpY29udHJvbD5BZGQNCi1BZnRlcjwvdWljb250cm9sPiwgdGhlbiBjbGljayA8dWljb250cm9sPkFkZCBQcm9jZXNzaW5nIEluc3RydWN0aW9uPC91aWNvbnRyb2w+LjwvcD48cD5Ubw0KLWVkaXQgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGluIHRoZSBYTUwgZWRpdG9yIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB5b3VyDQotcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiwgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RWRpdCBQcm9jZXNzaW5nIEluc3RydWN0aW9uPC91aWNvbnRyb2w+Lg0KLVlvdSBjYW4gY2hhbmdlIHRoZSB2YWx1ZXMgaW4gdGhlIGZvbGxvd2luZyBmaWVsZHM6PC9wPjx1bD4NCi08bGk+VGhlIDx1aWNvbnRyb2w+VGFyZ2V0PC91aWNvbnRyb2w+IGZpZWxkIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGFwcGxpY2F0aW9uDQotdGhlIGluc3RydWN0aW9ucyBiZWxvbmdzIHRvLjwvbGk+DQotPGxpPlRoZSA8dWljb250cm9sPkRhdGE8L3VpY29udHJvbD4gZmllbGQgY29udGFpbnMgdGhlIGluc3RydWN0aW9ucy48L2xpPg0KLTwvdWw+PC9jb250ZXh0Pg0KLTxwb3N0cmVxPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4gdG8gc2F2ZSB5b3VyIHNldHRpbmdzLjxub3RlPlRoZXNlPD9QdWIgQ2FyZXQ/Pg0KLWluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvDQotd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L25vdGU+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAxNjUwPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcm9jLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcm9jLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZGU4NjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJvYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSWYgeW91IGhhdmUgaW5zdHJ1Y3Rpb25zIHlvdSB3YW50IHRvIHNlbmQgdG8gYW4gYXBwbGljYXRpb24gdXNpbmcgYW4gWE1MIGRvY3VtZW50LCB5b3UgY2FuIHVzZSBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IklmIHlvdSBoYXZlIGluc3RydWN0aW9ucyB5b3Ugd2FudCB0byBzZW5kIHRvIGFuIGFwcGxpY2F0aW9uIHVzaW5nIGFuIFhNTCBkb2N1bWVudCwgeW91IGNhbiB1c2UgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCBYTUwgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucywgWE1MIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGVkdHByb2MiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGVkdHByb2MiPjxhIG5hbWU9InRlZHRwcm9jIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+SWYgeW91IGhhdmUgaW5zdHJ1Y3Rpb25zIHlvdSB3YW50IHRvIHNlbmQgdG8gYW4gYXBwbGljYXRpb24gdXNpbmcKLWFuIFhNTCBkb2N1bWVudCwgeW91IGNhbiB1c2UgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLiA8L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIGNyZWF0ZSBhIG5ldyBwcm9jZXNzaW5nIGluc3RydWN0aW9uLCByaWdodC1jbGljayBpbiB0aGUgRGVzaWduCi12aWV3LCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIENoaWxkPC9zcGFuPiwgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEJlZm9yZTwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkCi1BZnRlcjwvc3Bhbj4sIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb248L3NwYW4+LjwvcD4KLTxwPlRvCi1lZGl0IGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBpbiB0aGUgWE1MIGVkaXRvciBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgeW91cgotcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiwgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXQgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbjwvc3Bhbj4uCi1Zb3UgY2FuIGNoYW5nZSB0aGUgdmFsdWVzIGluIHRoZSBmb2xsb3dpbmcgZmllbGRzOjwvcD4KLTx1bD4KLTxsaT5UaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VGFyZ2V0PC9zcGFuPiBmaWVsZCBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBhcHBsaWNhdGlvbgotdGhlIGluc3RydWN0aW9ucyBiZWxvbmdzIHRvLjwvbGk+Ci0KLTxsaT5UaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGF0YTwvc3Bhbj4gZmllbGQgY29udGFpbnMgdGhlIGluc3RydWN0aW9ucy48L2xpPgotCi08L3VsPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0byBzYXZlIHlvdXIgc2V0dGluZ3MuPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFRoZXNlCi1pbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbwotd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L2Rpdj4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiB0aXRsZT0iVGhlIFhNTCBlZGl0b3IgaGFzIGEgRGVzaWduIHZpZXcsIHdoaWNoIHJlcHJlc2VudHMgdGhlIFhNTCBmaWxlIHNpbXVsdGFuZW91c2x5IGFzIGEgdGFibGUgYW5kIGEgdHJlZS4gVGhpcyBoZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcgZWFzaWVyLiBDb250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLCB3aGlsZSBwb3AtdXAgbWVudXMgb24gdGhlIHRyZWUgZWxlbWVudHMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoYXQgcGFydGljdWxhciBlbGVtZW50LiI+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90c3Vnc3RyYXQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHN1Z3N0cmF0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYjhmMjguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90c3Vnc3RyYXQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0ieG1sc291cmNlc3VnZ2VzdGlvbnN0cmF0ZWd5IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TZXR0aW5nIHRoZSBYTUwgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgdXNlZCBieSBjb250ZW50IGFzc2lzdDwvdGl0bGU+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIGN1c3RvbWl6ZSB0aGUgZm9ybWF0dGluZyBvZiB0aGUgc3VnZ2VzdGlvbnMgZ2l2ZW4gYnkgY29udGVudA0KLWFzc2lzdCBieSBjaG9vc2luZyBhIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgcHJlZmVyZW5jZS4gV2hlbiB0aGUgc3VnZ2VzdGlvbiBzdHJhdGVneQ0KLWlzIHNldCB0byBTdHJpY3QsIHN1Z2dlc3Rpb25zIHRoYXQgYXJlIGdyYW1tYXRpY2FsbHkgdmFsaWQgd2lsbCBiZSBkaXNwbGF5ZWQNCi1maXJzdCBpbiB0aGUgbGlzdCBvZiBvcHRpb25zIGFuZCBoaWdobGlnaHRlZCBieSBib2xkIGljb25zLiBPdGhlciBzdWdnZXN0aW9ucw0KLXRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhpcyBlbGVtZW50J3Mgc2NvcGUgYnV0IGFyZSBub3QgZ3JhbW1hdGljYWxseSB2YWxpZA0KLXdpbGwgYmUgZGlzcGxheWVkIGxvd2VyIGluIHRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZCBpY29ucy4gV2hlbiB0aGUgc3VnZ2VzdGlvbg0KLXN0cmF0ZWd5IGlzIHNldCB0byBMYXgsIGFsbCBzdWdnZXN0aW9ucyB3aWxsIGRpc3BsYXllZCBpbiB0aGUgbGlzdCB3aXRoIGRlLWVtcGhhc2l6ZWQNCi1pY29ucy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5zb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneTwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+VG8gc2V0IHRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHVzZWQgYnkgY29udGVudCBhc3Npc3QsIGNvbXBsZXRlIHRoZQ0KLWZvbGxvd2luZyBzdGVwczo8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IGFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+WE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwNCi1GaWxlczwvdWljb250cm9sPjx1aWNvbnRyb2w+RWRpdG9yPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5CZXNpZGUgPHVpY29udHJvbD5TdWdnZXN0aW9uIHN0cmF0ZWd5PC91aWNvbnRyb2w+IGluIHRoZSBDb250ZW50DQotYXNzaXN0IHNlY3Rpb24sIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgc2V0dGluZyAoU3RyaWN0IG9yIExheCkuPC9jbWQ+PC9zdGVwPjw/UHViIENhcmV0Pz4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+QXBwbHk8L3VpY29udHJvbD4sIHRoZW4gPHVpY29udHJvbD5PSzwvdWljb250cm9sPiB0bw0KLXNhdmUgeW91ciBzZXR0aW5nczwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxleGFtcGxlPjxwPlRoZSBmb2xsb3dpbmcgc2NyZWVuIGNhcHR1cmUgZGVtb25zdHJhdGVzIGNvbnRlbnQgYXNzaXN0IHdpdGgNCi10aGUgc3VnZ2VzdGlvbiBzdHJhdGVneSBzZXQgdG8gIlN0cmljdCI6PC9wPjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvc3VnZ2VzdGlvbi5naWYiDQotcGxhY2VtZW50PSJicmVhayI+PGFsdD5FeGFtcGxlIG9mIFN0cmljdCBTdWdnZXN0aW9uIFN0cmF0ZWd5PC9hbHQ+PC9pbWFnZT48L2V4YW1wbGU+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDE5NTA/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHN1Z3N0cmF0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RzdWdzdHJhdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGE4MDU1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHN1Z3N0cmF0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTZXR0aW5nIHRoZSBYTUwgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgdXNlZCBieSBjb250ZW50IGFzc2lzdCIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIGN1c3RvbWl6ZSB0aGUgZm9ybWF0dGluZyBvZiB0aGUgc3VnZ2VzdGlvbnMgZ2l2ZW4gYnkgY29udGVudCBhc3Npc3QgYnkgY2hvb3NpbmcgYSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHByZWZlcmVuY2UuIFdoZW4gdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgaXMgc2V0IHRvIFN0cmljdCwgc3VnZ2VzdGlvbnMgdGhhdCBhcmUgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsIGJlIGRpc3BsYXllZCBmaXJzdCBpbiB0aGUgbGlzdCBvZiBvcHRpb25zIGFuZCBoaWdobGlnaHRlZCBieSBib2xkIGljb25zLiBPdGhlciBzdWdnZXN0aW9ucyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoaXMgZWxlbWVudCdzIHNjb3BlIGJ1dCBhcmUgbm90IGdyYW1tYXRpY2FsbHkgdmFsaWQgd2lsbCBiZSBkaXNwbGF5ZWQgbG93ZXIgaW4gdGhlIGxpc3Qgd2l0aCBkZS1lbXBoYXNpemVkIGljb25zLiBXaGVuIHRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IGlzIHNldCB0byBMYXgsIGFsbCBzdWdnZXN0aW9ucyB3aWxsIGRpc3BsYXllZCBpbiB0aGUgbGlzdCB3aXRoIGRlLWVtcGhhc2l6ZWQgaWNvbnMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gY3VzdG9taXplIHRoZSBmb3JtYXR0aW5nIG9mIHRoZSBzdWdnZXN0aW9ucyBnaXZlbiBieSBjb250ZW50IGFzc2lzdCBieSBjaG9vc2luZyBhIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgcHJlZmVyZW5jZS4gV2hlbiB0aGUgc3VnZ2VzdGlvbiBzdHJhdGVneSBpcyBzZXQgdG8gU3RyaWN0LCBzdWdnZXN0aW9ucyB0aGF0IGFyZSBncmFtbWF0aWNhbGx5IHZhbGlkIHdpbGwgYmUgZGlzcGxheWVkIGZpcnN0IGluIHRoZSBsaXN0IG9mIG9wdGlvbnMgYW5kIGhpZ2hsaWdodGVkIGJ5IGJvbGQgaWNvbnMuIE90aGVyIHN1Z2dlc3Rpb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhpcyBlbGVtZW50J3Mgc2NvcGUgYnV0IGFyZSBub3QgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsIGJlIGRpc3BsYXllZCBsb3dlciBpbiB0aGUgbGlzdCB3aXRoIGRlLWVtcGhhc2l6ZWQgaWNvbnMuIFdoZW4gdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgaXMgc2V0IHRvIExheCwgYWxsIHN1Z2dlc3Rpb25zIHdpbGwgZGlzcGxheWVkIGluIHRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZCBpY29ucy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIHNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3Y2Rhc3QuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ4bWxzb3VyY2VzdWdnZXN0aW9uc3RyYXRlZ3kiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TZXR0aW5nIHRoZSBYTUwgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgdXNlZCBieSBjb250ZW50IGFzc2lzdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ieG1sc291cmNlc3VnZ2VzdGlvbnN0cmF0ZWd5Ij48YSBuYW1lPSJ4bWxzb3VyY2VzdWdnZXN0aW9uc3RyYXRlZ3kiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNldHRpbmcgdGhlIFhNTCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0PC9oMT4KLQotCi0KLTxkaXY+PHA+WW91IGNhbiBjdXN0b21pemUgdGhlIGZvcm1hdHRpbmcgb2YgdGhlIHN1Z2dlc3Rpb25zIGdpdmVuIGJ5IGNvbnRlbnQKLWFzc2lzdCBieSBjaG9vc2luZyBhIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgcHJlZmVyZW5jZS4gV2hlbiB0aGUgc3VnZ2VzdGlvbiBzdHJhdGVneQotaXMgc2V0IHRvIFN0cmljdCwgc3VnZ2VzdGlvbnMgdGhhdCBhcmUgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsIGJlIGRpc3BsYXllZAotZmlyc3QgaW4gdGhlIGxpc3Qgb2Ygb3B0aW9ucyBhbmQgaGlnaGxpZ2h0ZWQgYnkgYm9sZCBpY29ucy4gT3RoZXIgc3VnZ2VzdGlvbnMKLXRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhpcyBlbGVtZW50J3Mgc2NvcGUgYnV0IGFyZSBub3QgZ3JhbW1hdGljYWxseSB2YWxpZAotd2lsbCBiZSBkaXNwbGF5ZWQgbG93ZXIgaW4gdGhlIGxpc3Qgd2l0aCBkZS1lbXBoYXNpemVkIGljb25zLiBXaGVuIHRoZSBzdWdnZXN0aW9uCi1zdHJhdGVneSBpcyBzZXQgdG8gTGF4LCBhbGwgc3VnZ2VzdGlvbnMgd2lsbCBkaXNwbGF5ZWQgaW4gdGhlIGxpc3Qgd2l0aCBkZS1lbXBoYXNpemVkCi1pY29ucy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIHNldCB0aGUgc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0LCBjb21wbGV0ZSB0aGUKLWZvbGxvd2luZyBzdGVwczo8L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdG9yPC9zcGFuPjwvc3Bhbj48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkJlc2lkZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TdWdnZXN0aW9uIHN0cmF0ZWd5PC9zcGFuPiBpbiB0aGUgQ29udGVudAotYXNzaXN0IHNlY3Rpb24sIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgc2V0dGluZyAoU3RyaWN0IG9yIExheCkuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBseTwvc3Bhbj4sIHRoZW4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IHRvCi1zYXZlIHlvdXIgc2V0dGluZ3M8L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0iZXhhbXBsZSI+PHA+VGhlIGZvbGxvd2luZyBzY3JlZW4gY2FwdHVyZSBkZW1vbnN0cmF0ZXMgY29udGVudCBhc3Npc3Qgd2l0aAotdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgc2V0IHRvICJTdHJpY3QiOjwvcD4KLTxiciAvPjxpbWcgc3JjPSIuLi9pbWFnZXMvc3VnZ2VzdGlvbi5naWYiIGFsdD0iRXhhbXBsZSBvZiBTdHJpY3QgU3VnZ2VzdGlvbiBTdHJhdGVneSIgLz48YnIgLz48L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdjZGFzdC5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgdG8gaGVscCB5b3UgZmluaXNoIGEgdGFnIG9yIGxpbmUgb2YgY29kZSBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IuIFlvdSBjYW4gYWxzbyB1c2UgY29udGVudCBhc3Npc3QgdG8gaW5zZXJ0IHRlbXBsYXRlcyBpbnRvIHlvdXIgWE1MIGNvZGUuIj5Vc2luZyBYTUwgY29udGVudCBhc3Npc3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dGFnaGlsdC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dGFnaGlsdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWE4OTE0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHRhZ2hpbHQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0dGFnaGlsdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+U2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5JZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB2YXJpb3VzIGFzcGVjdHMgb2YgaG93IHRoZSBYTUwgc291cmNlDQotY29kZSBpcyBkaXNwbGF5ZWQgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLCBzdWNoIGFzIHRoZSBjb2xvcnMNCi10aGUgdGFncyB3aWxsIGJlIGRpc3BsYXllZCBpbi48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5zZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UbyBzZXQgaGlnaGxpZ2h0aW5nIHN0eWxlcyBmb3IgdGhlIFhNTCBjb2RlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nDQotc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5YTUw8L3VpY29udHJvbD48dWljb250cm9sPlhNTA0KLUZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD4gU3ludGF4IENvbG9yaW5nPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+U3ludGF4IEVsZW1lbnQ8L3VpY29udHJvbD4gbGlzdCwgc2VsZWN0IHRoZSBzb3VyY2UNCi10YWcgdHlwZSB0aGF0IHlvdSB3aXNoIHRvIHNldCBhIGhpZ2hsaWdodGluZyBzdHlsZSBmb3IuIFlvdSBjYW4gYWxzbyBjbGljaw0KLXRleHQgaW4gdGhlIDx1aWNvbnRyb2w+U2FtcGxlIHRleHQ8L3VpY29udHJvbD4gYm94IHRvIHNwZWNpZnkgdGhlIHNvdXJjZSB0YWcNCi10eXBlIHRoYXQgeW91IHdpc2ggdG8gc2V0IGEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Gb3JlZ3JvdW5kPC91aWNvbnRyb2w+IGJveCwgc2VsZWN0IHRoZSBjb2xvcg0KLXRoYXQgeW91IHdhbnQgdGhlIHRleHQgb2YgdGhlIHRhZyB0byBhcHBlYXIgaW4sIGFuZCBjbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkJhY2tncm91bmQ8L3VpY29udHJvbD4gYm94LCBzZWxlY3QgdGhlIGNvbG9yDQotdGhhdCB5b3Ugd2FudCB0byBhcHBlYXIgYmVoaW5kIHRoZSB0YWcsIGFuZCBjbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgPHVpY29udHJvbD5Cb2xkPC91aWNvbnRyb2w+IGNoZWNrIGJveCBpZiB5b3Ugd2FudCB0bw0KLW1ha2UgdGhlIHR5cGUgYm9sZC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD4gPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiB0byBzYXZlIHlvdXIgY2hhbmdlcy48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PlRvIHNldCB0aGUgaGlnaGxpZ2h0PD9QdWIgQ2FyZXQ/PmluZyBzdHlsZXMgYmFjayB0byB0aGVpciBkZWZhdWx0DQotdmFsdWVzLCBjbGljayA8dWljb250cm9sPlJlc3RvcmUgRGVmYXVsdDwvdWljb250cm9sPi4gSWYgeW91IG9ubHkgd2FudCB0bw0KLXJlc2V0IHRoZSB2YWx1ZSBmb3IgYSBwYXJ0aWN1bGFyIGNvbnRlbnQgdHlwZSwgc2VsZWN0IGl0IGluIHRoZSA8dWljb250cm9sPlN5bnRheA0KLUVsZW1lbnQ8L3VpY29udHJvbD4gZmllbGQsIHRoZW4gY2xpY2sgdGhlIDx1aWNvbnRyb2w+UmVzdG9yZSBEZWZhdWx0PC91aWNvbnRyb2w+IGJ1dHRvbi48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMjI5MD8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dGFnaGlsdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dGFnaGlsdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDYxY2ZiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHRhZ2hpbHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdmFyaW91cyBhc3BlY3RzIG9mIGhvdyB0aGUgWE1MIHNvdXJjZSBjb2RlIGlzIGRpc3BsYXllZCBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IsIHN1Y2ggYXMgdGhlIGNvbG9ycyB0aGUgdGFncyB3aWxsIGJlIGRpc3BsYXllZCBpbi4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iSWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdmFyaW91cyBhc3BlY3RzIG9mIGhvdyB0aGUgWE1MIHNvdXJjZSBjb2RlIGlzIGRpc3BsYXllZCBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IsIHN1Y2ggYXMgdGhlIGNvbG9ycyB0aGUgdGFncyB3aWxsIGJlIGRpc3BsYXllZCBpbi4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBzZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgc2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdHNyYy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR0YWdoaWx0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHRhZ2hpbHQiPjxhIG5hbWU9InR0YWdoaWx0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzPC9oMT4KLQotCi0KLQotPGRpdj48cD5JZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB2YXJpb3VzIGFzcGVjdHMgb2YgaG93IHRoZSBYTUwgc291cmNlCi1jb2RlIGlzIGRpc3BsYXllZCBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IsIHN1Y2ggYXMgdGhlIGNvbG9ycwotdGhlIHRhZ3Mgd2lsbCBiZSBkaXNwbGF5ZWQgaW4uPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBzZXQgaGlnaGxpZ2h0aW5nIHN0eWxlcyBmb3IgdGhlIFhNTCBjb2RlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nCi1zdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+IFN5bnRheCBDb2xvcmluZzwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3ludGF4IEVsZW1lbnQ8L3NwYW4+IGxpc3QsIHNlbGVjdCB0aGUgc291cmNlCi10YWcgdHlwZSB0aGF0IHlvdSB3aXNoIHRvIHNldCBhIGhpZ2hsaWdodGluZyBzdHlsZSBmb3IuIFlvdSBjYW4gYWxzbyBjbGljawotdGV4dCBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2FtcGxlIHRleHQ8L3NwYW4+IGJveCB0byBzcGVjaWZ5IHRoZSBzb3VyY2UgdGFnCi10eXBlIHRoYXQgeW91IHdpc2ggdG8gc2V0IGEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Gb3JlZ3JvdW5kPC9zcGFuPiBib3gsIHNlbGVjdCB0aGUgY29sb3IKLXRoYXQgeW91IHdhbnQgdGhlIHRleHQgb2YgdGhlIHRhZyB0byBhcHBlYXIgaW4sIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5CYWNrZ3JvdW5kPC9zcGFuPiBib3gsIHNlbGVjdCB0aGUgY29sb3IKLXRoYXQgeW91IHdhbnQgdG8gYXBwZWFyIGJlaGluZCB0aGUgdGFnLCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJvbGQ8L3NwYW4+IGNoZWNrIGJveCBpZiB5b3Ugd2FudCB0bwotbWFrZSB0aGUgdHlwZSBib2xkLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+IDwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IHRvIHNhdmUgeW91ciBjaGFuZ2VzLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBzZXQgdGhlIGhpZ2hsaWdodGluZyBzdHlsZXMgYmFjayB0byB0aGVpciBkZWZhdWx0Ci12YWx1ZXMsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlc3RvcmUgRGVmYXVsdDwvc3Bhbj4uIElmIHlvdSBvbmx5IHdhbnQgdG8KLXJlc2V0IHRoZSB2YWx1ZSBmb3IgYSBwYXJ0aWN1bGFyIGNvbnRlbnQgdHlwZSwgc2VsZWN0IGl0IGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TeW50YXgKLUVsZW1lbnQ8L3NwYW4+IGZpZWxkLCB0aGVuIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZXN0b3JlIERlZmF1bHQ8L3NwYW4+IGJ1dHRvbi48L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlIGNvZGUgZGlyZWN0bHkuIj5FZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3Y2Rhc3QuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdjZGFzdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTk0NzU0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdjZGFzdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InR3Y2Rhc3QiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdDwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+VXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0PC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGhlbHAgeW91IGZpbmlzaCBhIHRhZyBvciBsaW5lIG9mDQotY29kZSBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IuIFlvdSBjYW4gYWxzbyB1c2UgY29udGVudCBhc3Npc3QNCi10byBpbnNlcnQgdGVtcGxhdGVzIGludG8geW91ciBYTUwgY29kZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5jb250ZW50IGFzc2lzdDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIGZpbGVzPGluZGV4dGVybT5jb250ZW50IGFzc2lzdDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIHBsYWNlbWVudCBvZiB0aGUgY3Vyc29yIGluIHlvdXIgc291cmNlIGZpbGUgcHJvdmlkZXMgdGhlIGNvbnRleHQNCi1mb3IgdGhlIGNvbnRlbnQgYXNzaXN0IHRvIG9mZmVyIHN1Z2dlc3Rpb25zIGZvciBjb21wbGV0aW9uLjwvcD48cD5Zb3UgY2FuDQotbGF1bmNoIGNvbnRlbnQgYXNzaXN0IGluIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIHdheXM6PC9wPjx1bD4NCi08bGk+RnJvbSB0aGUgPHVpY29udHJvbD5FZGl0PC91aWNvbnRyb2w+IG1lbnUsIGNsaWNrIDx1aWNvbnRyb2w+Q29udGVudCBBc3Npc3Q8L3VpY29udHJvbD4sDQotb3I8L2xpPg0KLTxsaT5QcmVzcyBDdHJsK1NwYWNlPC9saT4NCi08L3VsPjxwPkluIGFkZGl0aW9uLCB5b3UgY2FuIHNldCB1cCBhbiBvcHRpb24gdGhhdCBjYXVzZXMgY29udGVudCBhc3Npc3QgdG8NCi1wb3AgdXAgYXV0b21hdGljYWxseSB3aGVuIGNlcnRhaW4gY2hhcmFjdGVycyBhcmUgdHlwZWQuIFRvIHNldCB1cCB0aGlzIG9wdGlvbiwNCi1jbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPiBQcmVmZXJlbmNlczwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IHRvIG9wZW4gdGhlIFByZWZlcmVuY2VzIHdpbmRvdywgdGhlbiBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+WE1MPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5YTUwgRmlsZXMgPC91aWNvbnRyb2w+PHVpY29udHJvbD5FZGl0b3I8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiAuDQotSW4gdGhlIDx1aWNvbnRyb2w+Q29udGVudCBhc3Npc3Q8L3VpY29udHJvbD4gZ3JvdXAgYm94LCBzZWxlY3QgdGhlIDx1aWNvbnRyb2w+QXV0b21hdGljYWxseQ0KLW1ha2Ugc3VnZ2VzdGlvbnM8L3VpY29udHJvbD4gY2hlY2sgYm94LCBhbmQgc3VwcGx5IGFueSBhZGRpdGlvbmFsIGNoYXJhY3RlcnMNCi10aGF0IHNob3VsZCB0cmlnZ2VyIGNvbnRlbnQgYXNzaXN0LjwvcD48cD5JZiB5b3VyIGN1cnNvciBpcyBpbiBhIHBvc2l0aW9uDQotd2hlcmUgY29udGVudCBhc3Npc3QgaXMgYXZhaWxhYmxlLCBhIHBvcC11cCBsaXN0IG9mIGF2YWlsYWJsZSBjaG9pY2VzIGlzIGRpc3BsYXllZA0KLXdoZW4geW91IGxhdW5jaCBjb250ZW50IGFzc2lzdC4gVGhlIGxpc3QgaXMgYmFzZWQgb24gdGhlIGNvbnRleHQgYW5kIHdoZXRoZXINCi1hIERURCBvciBYTUwgc2NoZW1hIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgWE1MIGZpbGUgYmVpbmcgZWRpdGVkLiBGb3IgZXhhbXBsZSwNCi1pZiB5b3UgaGF2ZSBhbiBBZGRyZXNzIGVsZW1lbnQgdGhhdCBjYW4gY29udGFpbiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjaGlsZHJlbg0KLWVsZW1lbnRzOiBOYW1lLCBTdHJlZXQsIENpdHksIFppcCBDb2RlLCBDb3VudHJ5LCBhbmQgUHJvdmluY2UsIGFuZCB5b3UgcGxhY2UNCi15b3VyIGN1cnNvciBhZnRlciBhbnkgb2YgdGhlbSBhbmQgbGF1bmNoIGNvbnRlbnQgYXNzaXN0LCBhbGwgb2YgdGhlIGNoaWxkDQotZWxlbWVudHMgd2lsbCBiZSBsaXN0ZWQgaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QuPC9wPjxwPlRoZSBjb250ZW50IGFzc2lzdA0KLWxpc3QgZGlzcGxheXMgYWxsIHZhbGlkIHRhZ3MgZm9yIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiwgaW5jbHVkaW5nIHRlbXBsYXRlcy4NCi1JZiB5b3VyIGdyYW1tYXIgY29uc3RyYWludHMgYXJlIHR1cm5lZCBvZmYsIGFsbCBhdmFpbGFibGUgdGFncywgbm90IGp1c3QgdmFsaWQNCi1vbmVzLCBhcmUgZGlzcGxheWVkLiA8L3A+PHA+QXMgeW91IHR5cGUgdGhlIGZpcnN0IG9uZSBvciB0d28gbGV0dGVycyBvZiB0aGUNCi10YWcgdGhhdCB5b3Ugd2FudCwgdGhlIGxpc3QgYXV0b21hdGljYWxseSByZWZyZXNoZXMgd2l0aCBhbHBoYWJldGl6ZWQgY2hvaWNlcw0KLXRoYXQgbWF0Y2ggeW91ciBpbnB1dC4gU2Nyb2xsIGRvd24gYW5kIHNlbGVjdCB0aGUgdGFnIHRoYXQgeW91IHdhbnQgdG8gdXNlDQotYnkgZG91YmxlLWNsaWNraW5nIG9uIGl0Ljw/UHViIENhcmV0Pz48L3A+PG5vdGU+VGhlIGxpc3Qgb25seSByZWZyZXNoZXMgYXMNCi1kZXNjcmliZWQgaWYgeW91IGZpcnN0IHR5cGUgPHVzZXJpbnB1dD4mbHQ7PC91c2VyaW5wdXQ+IGJlZm9yZSBwcm9tcHRpbmcgZm9yDQotY29udGVudCBhc3Npc3QuPC9ub3RlPjwvY29udGV4dD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMjg5MT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d2NkYXN0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3Y2Rhc3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiZTUyNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3Y2Rhc3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdCIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdCB0byBoZWxwIHlvdSBmaW5pc2ggYSB0YWcgb3IgbGluZSBvZiBjb2RlIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvci4gWW91IGNhbiBhbHNvIHVzZSBjb250ZW50IGFzc2lzdCB0byBpbnNlcnQgdGVtcGxhdGVzIGludG8geW91ciBYTUwgY29kZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgdG8gaGVscCB5b3UgZmluaXNoIGEgdGFnIG9yIGxpbmUgb2YgY29kZSBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IuIFlvdSBjYW4gYWxzbyB1c2UgY29udGVudCBhc3Npc3QgdG8gaW5zZXJ0IHRlbXBsYXRlcyBpbnRvIHlvdXIgWE1MIGNvZGUuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgY29udGVudCBhc3Npc3QsIFhNTCBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIGNvbnRlbnQgYXNzaXN0LCBYTUwgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3bWFjcm8uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RzdWdzdHJhdC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3Y2Rhc3QiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Vc2luZyBYTUwgY29udGVudCBhc3Npc3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3Y2Rhc3QiPjxhIG5hbWU9InR3Y2Rhc3QiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdDwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgdG8gaGVscCB5b3UgZmluaXNoIGEgdGFnIG9yIGxpbmUgb2YKLWNvZGUgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLiBZb3UgY2FuIGFsc28gdXNlIGNvbnRlbnQgYXNzaXN0Ci10byBpbnNlcnQgdGVtcGxhdGVzIGludG8geW91ciBYTUwgY29kZS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBwbGFjZW1lbnQgb2YgdGhlIGN1cnNvciBpbiB5b3VyIHNvdXJjZSBmaWxlIHByb3ZpZGVzIHRoZSBjb250ZXh0Ci1mb3IgdGhlIGNvbnRlbnQgYXNzaXN0IHRvIG9mZmVyIHN1Z2dlc3Rpb25zIGZvciBjb21wbGV0aW9uLjwvcD4KLTxwPllvdSBjYW4KLWxhdW5jaCBjb250ZW50IGFzc2lzdCBpbiBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyB3YXlzOjwvcD4KLTx1bD4KLTxsaT5Gcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0PC9zcGFuPiBtZW51LCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZW50IEFzc2lzdDwvc3Bhbj4sCi1vcjwvbGk+Ci0KLTxsaT5QcmVzcyBDdHJsK1NwYWNlPC9saT4KLQotPC91bD4KLTxwPkluIGFkZGl0aW9uLCB5b3UgY2FuIHNldCB1cCBhbiBvcHRpb24gdGhhdCBjYXVzZXMgY29udGVudCBhc3Npc3QgdG8KLXBvcCB1cCBhdXRvbWF0aWNhbGx5IHdoZW4gY2VydGFpbiBjaGFyYWN0ZXJzIGFyZSB0eXBlZC4gVG8gc2V0IHVwIHRoaXMgb3B0aW9uLAotY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+IFByZWZlcmVuY2VzPC9zcGFuPgotPC9zcGFuPiB0byBvcGVuIHRoZSBQcmVmZXJlbmNlcyB3aW5kb3csIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIEZpbGVzIDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0b3I8L3NwYW4+PC9zcGFuPiAuCi1JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29udGVudCBhc3Npc3Q8L3NwYW4+IGdyb3VwIGJveCwgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BdXRvbWF0aWNhbGx5Ci1tYWtlIHN1Z2dlc3Rpb25zPC9zcGFuPiBjaGVjayBib3gsIGFuZCBzdXBwbHkgYW55IGFkZGl0aW9uYWwgY2hhcmFjdGVycwotdGhhdCBzaG91bGQgdHJpZ2dlciBjb250ZW50IGFzc2lzdC48L3A+Ci08cD5JZiB5b3VyIGN1cnNvciBpcyBpbiBhIHBvc2l0aW9uCi13aGVyZSBjb250ZW50IGFzc2lzdCBpcyBhdmFpbGFibGUsIGEgcG9wLXVwIGxpc3Qgb2YgYXZhaWxhYmxlIGNob2ljZXMgaXMgZGlzcGxheWVkCi13aGVuIHlvdSBsYXVuY2ggY29udGVudCBhc3Npc3QuIFRoZSBsaXN0IGlzIGJhc2VkIG9uIHRoZSBjb250ZXh0IGFuZCB3aGV0aGVyCi1hIERURCBvciBYTUwgc2NoZW1hIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgWE1MIGZpbGUgYmVpbmcgZWRpdGVkLiBGb3IgZXhhbXBsZSwKLWlmIHlvdSBoYXZlIGFuIEFkZHJlc3MgZWxlbWVudCB0aGF0IGNhbiBjb250YWluIGFueSBvZiB0aGUgZm9sbG93aW5nIGNoaWxkcmVuCi1lbGVtZW50czogTmFtZSwgU3RyZWV0LCBDaXR5LCBaaXAgQ29kZSwgQ291bnRyeSwgYW5kIFByb3ZpbmNlLCBhbmQgeW91IHBsYWNlCi15b3VyIGN1cnNvciBhZnRlciBhbnkgb2YgdGhlbSBhbmQgbGF1bmNoIGNvbnRlbnQgYXNzaXN0LCBhbGwgb2YgdGhlIGNoaWxkCi1lbGVtZW50cyB3aWxsIGJlIGxpc3RlZCBpbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdC48L3A+Ci08cD5UaGUgY29udGVudCBhc3Npc3QKLWxpc3QgZGlzcGxheXMgYWxsIHZhbGlkIHRhZ3MgZm9yIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiwgaW5jbHVkaW5nIHRlbXBsYXRlcy4KLUlmIHlvdXIgZ3JhbW1hciBjb25zdHJhaW50cyBhcmUgdHVybmVkIG9mZiwgYWxsIGF2YWlsYWJsZSB0YWdzLCBub3QganVzdCB2YWxpZAotb25lcywgYXJlIGRpc3BsYXllZC4gPC9wPgotPHA+QXMgeW91IHR5cGUgdGhlIGZpcnN0IG9uZSBvciB0d28gbGV0dGVycyBvZiB0aGUKLXRhZyB0aGF0IHlvdSB3YW50LCB0aGUgbGlzdCBhdXRvbWF0aWNhbGx5IHJlZnJlc2hlcyB3aXRoIGFscGhhYmV0aXplZCBjaG9pY2VzCi10aGF0IG1hdGNoIHlvdXIgaW5wdXQuIFNjcm9sbCBkb3duIGFuZCBzZWxlY3QgdGhlIHRhZyB0aGF0IHlvdSB3YW50IHRvIHVzZQotYnkgZG91YmxlLWNsaWNraW5nIG9uIGl0LjwvcD4KLTxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBUaGUgbGlzdCBvbmx5IHJlZnJlc2hlcyBhcwotZGVzY3JpYmVkIGlmIHlvdSBmaXJzdCB0eXBlIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+Jmx0Ozwva2JkPiBiZWZvcmUgcHJvbXB0aW5nIGZvcgotY29udGVudCBhc3Npc3QuPC9kaXY+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlIGNvZGUgZGlyZWN0bHkuIj5FZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3bWFjcm8uaHRtbCIgdGl0bGU9IlhNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBhIGNvbW1lbnQgdGVtcGxhdGUsIGEgc2VjdGlvbiBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IG1heSBmaW5kIGEgdGVtcGxhdGUgdXNlZnVsIHdoZW4geW91IGhhdmUgYSBjZXJ0YWluIHBpZWNlIG9mIGNvZGUgeW91IHdhbnQgdG8gcmV1c2Ugc2V2ZXJhbCB0aW1lcywgYW5kIHlvdSBkbyBub3Qgd2FudCB0byB3cml0ZSBpdCBvdXQgZXZlcnkgdGltZS4iPldvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHN1Z3N0cmF0Lmh0bWwiIHRpdGxlPSJZb3UgY2FuIGN1c3RvbWl6ZSB0aGUgZm9ybWF0dGluZyBvZiB0aGUgc3VnZ2VzdGlvbnMgZ2l2ZW4gYnkgY29udGVudCBhc3Npc3QgYnkgY2hvb3NpbmcgYSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHByZWZlcmVuY2UuIFdoZW4gdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgaXMgc2V0IHRvIFN0cmljdCwgc3VnZ2VzdGlvbnMgdGhhdCBhcmUgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsIGJlIGRpc3BsYXllZCBmaXJzdCBpbiB0aGUgbGlzdCBvZiBvcHRpb25zIGFuZCBoaWdobGlnaHRlZCBieSBib2xkIGljb25zLiBPdGhlciBzdWdnZXN0aW9ucyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoaXMgZWxlbWVudCdzIHNjb3BlIGJ1dCBhcmUgbm90IGdyYW1tYXRpY2FsbHkgdmFsaWQgd2lsbCBiZSBkaXNwbGF5ZWQgbG93ZXIgaW4gdGhlIGxpc3Qgd2l0aCBkZS1lbXBoYXNpemVkIGljb25zLiBXaGVuIHRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IGlzIHNldCB0byBMYXgsIGFsbCBzdWdnZXN0aW9ucyB3aWxsIGRpc3BsYXllZCBpbiB0aGUgbGlzdCB3aXRoIGRlLWVtcGhhc2l6ZWQgaWNvbnMuIj5TZXR0aW5nIHRoZSBYTUwgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgdXNlZCBieSBjb250ZW50IGFzc2lzdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3bWFjcm8uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdtYWNyby5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTFiNGM1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdtYWNyby5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0d21hY3JvIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Xb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+V29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBzZWN0aW9uIG9mIHByZWRlZmluZWQNCi1jb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBtYXkgZmluZCBhIHRlbXBsYXRlIHVzZWZ1bCB3aGVuDQoteW91IGhhdmUgYSBjZXJ0YWluIHBpZWNlIG9mIGNvZGUgeW91IHdhbnQgdG8gcmV1c2Ugc2V2ZXJhbCB0aW1lcywgYW5kIHlvdQ0KLWRvIG5vdCB3YW50IHRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtIGtleXJlZj0idHdtYWNyb3wxfFhNTHRlbXBsYXRlc3dvcmtpbmd3aXRocHJlZGVmaW5lZGNvZGUiDQotc3RhdHVzPSJjaGFuZ2VkIj50ZW1wbGF0ZXM8aW5kZXh0ZXJtPndvcmtpbmcgd2l0aCBwcmVkZWZpbmVkIFhNTCBjb2RlPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybSBrZXlyZWY9InR3bWFjcm98MTB8WE1MZmlsZXN0ZW1wbGF0ZXMiIHN0YXR1cz0ibmV3Ij5YTUwNCi1maWxlczxpbmRleHRlcm0+dGVtcGxhdGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5Zb3UgY2FuIHVzZSBhIGRlZmF1bHQgdGVtcGxhdGUgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGF0IHRlbXBsYXRlLA0KLW9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuPC9wPjxwPkZvciBleGFtcGxlLCB5b3UgY2FuIHdvcmsgb24gYSBncm91cCBvZg0KLVhNTCBwYWdlcyB0aGF0IHNob3VsZCBhbGwgY29udGFpbiBhIHRhYmxlIHdpdGggYSBzcGVjaWZpYyBhcHBlYXJhbmNlLiBDcmVhdGUNCi1hIHRlbXBsYXRlIHRoYXQgY29udGFpbnMgdGhlIHRhZ3MgZm9yIHRoYXQgdGFibGUsIGluY2x1ZGluZyB0aGUgYXBwcm9wcmlhdGUNCi1hdHRyaWJ1dGVzIGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGZvciBlYWNoIHRhZy4gKFlvdSBjYW4gY29weSBhbmQgcGFzdGUgdGhlDQotdGFncyBmcm9tIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpbnRvIHRoZSB0ZW1wbGF0ZSdzIDx1aWNvbnRyb2w+UGF0dGVybjwvdWljb250cm9sPiBmaWVsZC4pDQotVGhlbiBzZWxlY3QgdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIGZyb20gYSBjb250ZW50IGFzc2lzdCBwcm9wb3NhbCBsaXN0IHdoZW5ldmVyDQoteW91IHdhbnQgdG8gaW5zZXJ0IHlvdXIgY3VzdG9tIHRhYmxlIGludG8gYW4gWE1MIGZpbGUuPC9wPjxwPlRvIGNyZWF0ZSBhIG5ldw0KLVhNTCB0ZW1wbGF0ZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiBhbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPlhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+WE1MDQotRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPlRlbXBsYXRlczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+IGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGNvbXBsZXRlbHkNCi1uZXcgdGVtcGxhdGUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U3VwcGx5IGEgbmV3IHRlbXBsYXRlIDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPiBhbmQgPHVpY29udHJvbD5EZXNjcmlwdGlvbjwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5TcGVjaWZ5IHRoZSA8dWljb250cm9sPkNvbnRleHQ8L3VpY29udHJvbD4gZm9yIHRoZSB0ZW1wbGF0ZS48L2NtZD4NCi08aW5mbz5UaGlzIGlzIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsDQotbGlzdCB3aGVuIGNvbnRlbnQgYXNzaXN0IGlzIHJlcXVlc3RlZC4gPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlNwZWNpZnkgdGhlIDx1aWNvbnRyb2w+UGF0dGVybjwvdWljb250cm9sPiBmb3IgeW91ciB0ZW1wbGF0ZSB1c2luZw0KLXRoZSBhcHByb3ByaWF0ZSB0YWdzLCBhdHRyaWJ1dGVzLCBvciBhdHRyaWJ1dGUgdmFsdWVzIHRvIGJlIGluc2VydGVkIGJ5IGNvbnRlbnQNCi1hc3Npc3QuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHdhbnQgdG8gaW5zZXJ0IGEgdmFyaWFibGUsIGNsaWNrIHRoZSA8dWljb250cm9sPkluc2VydCBWYXJpYWJsZTwvdWljb250cm9sPiBidXR0b24NCi1hbmQgc2VsZWN0IHRoZSB2YXJpYWJsZSB0byBiZSBpbnNlcnRlZC4gPC9jbWQ+PGluZm8+Rm9yIGV4YW1wbGUsIHRoZSA8Yj5kYXRlPC9iPiB2YXJpYWJsZQ0KLWluZGljYXRlcyB0aGUgY3VycmVudCBkYXRlIHdpbGwgYmUgaW5zZXJ0ZWQuIDwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IGFuZCB0aGVuIDx1aWNvbnRyb2w+QXBwbHk8L3VpY29udHJvbD4gdG8NCi1zYXZlIHlvdXIgY2hhbmdlcy48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT5Zb3UgY2FuIGVkaXQsIHJlbW92ZSwgaW1wb3J0LCBvciBleHBvcnQgYSB0ZW1wbGF0ZSBieSB1c2luZyB0aGUgc2FtZQ0KLXByZWZlcmVuY2VzIHBhZ2UuIElmIHlvdSBoYXZlIG1vZGlmaWVkIGEgZGVmYXVsdCB0ZW1wbGF0ZSwgeW91IGNhbiByZXN0b3JlDQotaXQgdG8gaXRzIGRlZmF1bHQgdmFsdWUuIFlvdSBjYW4gYWxzbyByZXN0b3JlIGEgcmVtb3ZlZCB0ZW1wbGF0ZSBpZiB5b3UgaGF2ZQ0KLW5vdCBleGl0ZWQgZnJvbSB0aGUgd29ya2JlbmNoIHNpbmNlIGl0IHdhcyByZW1vdmVkLiA8cD5JZiB5b3UgaGF2ZSBhIHRlbXBsYXRlDQotdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gcmVtb3ZlIGJ1dCB5b3Ugbm8gbG9uZ2VyIHdhbnQgaXQgdG8gYXBwZWFyIGluIHRoZQ0KLWNvbnRlbnQgYXNzaXN0IGxpc3QsIGNsZWFyIGl0cyBjaGVjayBib3ggaW4gdGhlIHRhYmxlIG9uIHRoZSBUZW1wbGF0ZXMgcHJlZmVyZW5jZXMNCi1wYWdlLjwvcD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d21hY3JvLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3bWFjcm8uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE5NTNjMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3bWFjcm8uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA4IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ildvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlhNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBhIGNvbW1lbnQgdGVtcGxhdGUsIGEgc2VjdGlvbiBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IG1heSBmaW5kIGEgdGVtcGxhdGUgdXNlZnVsIHdoZW4geW91IGhhdmUgYSBjZXJ0YWluIHBpZWNlIG9mIGNvZGUgeW91IHdhbnQgdG8gcmV1c2Ugc2V2ZXJhbCB0aW1lcywgYW5kIHlvdSBkbyBub3Qgd2FudCB0byB3cml0ZSBpdCBvdXQgZXZlcnkgdGltZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBzZWN0aW9uIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgbWF5IGZpbmQgYSB0ZW1wbGF0ZSB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBhIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91IGRvIG5vdCB3YW50IHRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLiIgLz4KLTxtZXRhIGNvbnRlbnQ9InRlbXBsYXRlcywgd29ya2luZyB3aXRoIHByZWRlZmluZWQgWE1MIGNvZGUsIFhNTCBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRlbXBsYXRlcywgd29ya2luZyB3aXRoIHByZWRlZmluZWQgWE1MIGNvZGUsIFhNTCBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdHNyYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdjZGFzdC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3bWFjcm8iIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Xb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHdtYWNybyI+PGEgbmFtZT0idHdtYWNybyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPlhNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBhIGNvbW1lbnQgdGVtcGxhdGUsIGEgc2VjdGlvbiBvZiBwcmVkZWZpbmVkCi1jb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBtYXkgZmluZCBhIHRlbXBsYXRlIHVzZWZ1bCB3aGVuCi15b3UgaGF2ZSBhIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91Ci1kbyBub3Qgd2FudCB0byB3cml0ZSBpdCBvdXQgZXZlcnkgdGltZS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPllvdSBjYW4gdXNlIGEgZGVmYXVsdCB0ZW1wbGF0ZSBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoYXQgdGVtcGxhdGUsCi1vciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLjwvcD4KLTxwPkZvciBleGFtcGxlLCB5b3UgY2FuIHdvcmsgb24gYSBncm91cCBvZgotWE1MIHBhZ2VzIHRoYXQgc2hvdWxkIGFsbCBjb250YWluIGEgdGFibGUgd2l0aCBhIHNwZWNpZmljIGFwcGVhcmFuY2UuIENyZWF0ZQotYSB0ZW1wbGF0ZSB0aGF0IGNvbnRhaW5zIHRoZSB0YWdzIGZvciB0aGF0IHRhYmxlLCBpbmNsdWRpbmcgdGhlIGFwcHJvcHJpYXRlCi1hdHRyaWJ1dGVzIGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGZvciBlYWNoIHRhZy4gKFlvdSBjYW4gY29weSBhbmQgcGFzdGUgdGhlCi10YWdzIGZyb20gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGludG8gdGhlIHRlbXBsYXRlJ3MgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGF0dGVybjwvc3Bhbj4gZmllbGQuKQotVGhlbiBzZWxlY3QgdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIGZyb20gYSBjb250ZW50IGFzc2lzdCBwcm9wb3NhbCBsaXN0IHdoZW5ldmVyCi15b3Ugd2FudCB0byBpbnNlcnQgeW91ciBjdXN0b20gdGFibGUgaW50byBhbiBYTUwgZmlsZS48L3A+Ci08cD5UbyBjcmVhdGUgYSBuZXcKLVhNTCB0ZW1wbGF0ZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLTwvc3Bhbj4gYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwKLUZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlRlbXBsYXRlczwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gaWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgY29tcGxldGVseQotbmV3IHRlbXBsYXRlLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlN1cHBseSBhIG5ldyB0ZW1wbGF0ZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVzY3JpcHRpb248L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U3BlY2lmeSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29udGV4dDwvc3Bhbj4gZm9yIHRoZSB0ZW1wbGF0ZS48L3NwYW4+Ci0gVGhpcyBpcyB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgdGVtcGxhdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBwcm9wb3NhbAotbGlzdCB3aGVuIGNvbnRlbnQgYXNzaXN0IGlzIHJlcXVlc3RlZC4gPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TcGVjaWZ5IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXR0ZXJuPC9zcGFuPiBmb3IgeW91ciB0ZW1wbGF0ZSB1c2luZwotdGhlIGFwcHJvcHJpYXRlIHRhZ3MsIGF0dHJpYnV0ZXMsIG9yIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gYmUgaW5zZXJ0ZWQgYnkgY29udGVudAotYXNzaXN0Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSB3YW50IHRvIGluc2VydCBhIHZhcmlhYmxlLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW5zZXJ0IFZhcmlhYmxlPC9zcGFuPiBidXR0b24KLWFuZCBzZWxlY3QgdGhlIHZhcmlhYmxlIHRvIGJlIGluc2VydGVkLiA8L3NwYW4+IEZvciBleGFtcGxlLCB0aGUgPHN0cm9uZz5kYXRlPC9zdHJvbmc+IHZhcmlhYmxlCi1pbmRpY2F0ZXMgdGhlIGN1cnJlbnQgZGF0ZSB3aWxsIGJlIGluc2VydGVkLiA8L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiBhbmQgdGhlbiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBseTwvc3Bhbj4gdG8KLXNhdmUgeW91ciBjaGFuZ2VzLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Zb3UgY2FuIGVkaXQsIHJlbW92ZSwgaW1wb3J0LCBvciBleHBvcnQgYSB0ZW1wbGF0ZSBieSB1c2luZyB0aGUgc2FtZQotcHJlZmVyZW5jZXMgcGFnZS4gSWYgeW91IGhhdmUgbW9kaWZpZWQgYSBkZWZhdWx0IHRlbXBsYXRlLCB5b3UgY2FuIHJlc3RvcmUKLWl0IHRvIGl0cyBkZWZhdWx0IHZhbHVlLiBZb3UgY2FuIGFsc28gcmVzdG9yZSBhIHJlbW92ZWQgdGVtcGxhdGUgaWYgeW91IGhhdmUKLW5vdCBleGl0ZWQgZnJvbSB0aGUgd29ya2JlbmNoIHNpbmNlIGl0IHdhcyByZW1vdmVkLiA8cD5JZiB5b3UgaGF2ZSBhIHRlbXBsYXRlCi10aGF0IHlvdSBkbyBub3Qgd2FudCB0byByZW1vdmUgYnV0IHlvdSBubyBsb25nZXIgd2FudCBpdCB0byBhcHBlYXIgaW4gdGhlCi1jb250ZW50IGFzc2lzdCBsaXN0LCBjbGVhciBpdHMgY2hlY2sgYm94IGluIHRoZSB0YWJsZSBvbiB0aGUgVGVtcGxhdGVzIHByZWZlcmVuY2VzCi1wYWdlLjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdHNyYy5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgdGhlIFNvdXJjZSB2aWV3IHRvIHZpZXcgYW5kIHdvcmsgd2l0aCBhIGZpbGUncyBzb3VyY2UgY29kZSBkaXJlY3RseS4iPkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdjZGFzdC5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgdG8gaGVscCB5b3UgZmluaXNoIGEgdGFnIG9yIGxpbmUgb2YgY29kZSBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IuIFlvdSBjYW4gYWxzbyB1c2UgY29udGVudCBhc3Npc3QgdG8gaW5zZXJ0IHRlbXBsYXRlcyBpbnRvIHlvdXIgWE1MIGNvZGUuIj5Vc2luZyBYTUwgY29udGVudCBhc3Npc3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d3h2YWxpZC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d3h2YWxpZC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWRmZWMyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHd4dmFsaWQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idHd4dmFsaWQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlZhbGlkYXRpbmcgWE1MIGZpbGVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5WYWxpZGF0aW5nIFhNTCBmaWxlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5XaGVuIHlvdSB2YWxpZGF0ZSB5b3VyIFhNTCBmaWxlLCB0aGUgWE1MIHZhbGlkYXRvciB3aWxsIGNoZWNrIHRvDQotc2VlIHRoYXQgeW91ciBmaWxlIGlzIHZhbGlkIGFuZCB3ZWxsLWZvcm1lZC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPnZhbGlkYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBYTUwgZWRpdG9yIHdpbGwgcHJvY2VzcyBYTUwgZmlsZXMgdGhhdCBhcmUgaW52YWxpZCBvciBub3QNCi13ZWxsLWZvcm1lZC4gVGhlIGVkaXRvciB1c2VzIGhldXJpc3RpY3MgdG8gb3BlbiBhIGZpbGUgdXNpbmcgdGhlIGJlc3QgaW50ZXJwcmV0YXRpb24NCi1vZiB0aGUgdGFnZ2luZyB0aGF0IGl0IGNhbi4gRm9yIGV4YW1wbGUsIGFuIGVsZW1lbnQgd2l0aCBhIG1pc3NpbmcgZW5kIHRhZw0KLWlzIHNpbXBseSBhc3N1bWVkIHRvIGVuZCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC4gQXMgeW91IG1ha2UgdXBkYXRlcyB0bw0KLWEgZmlsZSwgdGhlIGVkaXRvciBpbmNyZW1lbnRhbGx5IHJlaW50ZXJwcmV0cyB5b3VyIGRvY3VtZW50LCBjaGFuZ2luZyB0aGUNCi1oaWdobGlnaHRpbmcsIHRyZWUgdmlldywgYW5kIHNvIG9uLiBNYW55IGZvcm1hdGlvbiBlcnJvcnMgYXJlIGVhc3kgdG8gc3BvdA0KLWluIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nLCBzbyB5b3UgY2FuIGVhc2lseSBjb3JyZWN0IG9idmlvdXMgZXJyb3JzIG9uLXRoZS1mbHkuDQotSG93ZXZlciwgdGhlcmUgd2lsbCBiZSBvdGhlciBjYXNlcyB3aGVuIGl0IHdpbGwgYmUgYmVuZWZpY2lhbCB0byBwZXJmb3JtIGZvcm1hbA0KLXZhbGlkYXRpb24gb24geW91ciBkb2N1bWVudHMuPC9wPjxwPllvdSBjYW4gdmFsaWRhdGUgeW91ciBmaWxlIGJ5IHNlbGVjdGluZw0KLWl0IGluIHRoZSBOYXZpZ2F0b3IgdmlldywgcmlnaHQtY2xpY2tpbmcgaXQsIGFuZCBjbGlja2luZyA8dWljb250cm9sPlZhbGlkYXRlPC91aWNvbnRyb2w+Lg0KLUFueSB2YWxpZGF0aW9uIHByb2JsZW1zIGFyZSBpbmRpY2F0ZWQgaW4gdGhlIFByb2JsZW1zIHZpZXcuIFlvdSBjYW4gZG91YmxlLWNsaWNrDQotb24gaW5kaXZpZHVhbCBlcnJvcnMsIGFuZCB5b3Ugd2lsbCBiZSB0YWtlbiB0byB0aGUgaW52YWxpZCB0YWcgaW4gdGhlIGZpbGUsDQotc28gdGhhdCB5b3UgY2FuIG1ha2UgY29ycmVjdGlvbnMuPC9wPjwvY29udGV4dD4NCi08cG9zdHJlcT48bm90ZT4gSWYgeW91IHJlY2VpdmUgYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIFByb2JsZW1zDQotdmlldyBpcyBmdWxsLCB5b3UgY2FuIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMgYWxsb3dlZCBieSBjbGlja2luZyA8bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gYW5kDQotc2VsZWN0aW5nIDxtZW51Y2FzY2FkZT48dWljb250cm9sPkdlbmVyYWw8L3VpY29udHJvbD48dWljb250cm9sPk1hcmtlcnM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPi4gU2VsZWN0IHRoZSA8dWljb250cm9sPlVzZSBtYXJrZXIgbGltaXRzPC91aWNvbnRyb2w+IGNoZWNrDQotYm94IGFuZCBjaGFuZ2UgdGhlIG51bWJlciBpbiB0aGUgPHVpY29udHJvbD5MaW1pdCB2aXNpYmxlIGl0ZW1zIHBlciBncm91cDwvdWljb250cm9sPiA8P1B1YiBDYXJldD8+ZmllbGQuPC9ub3RlPjxwPllvdQ0KLWNhbiBzZXQgdXAgYSBwcm9qZWN0J3MgcHJvcGVydGllcyBzbyB0aGF0IGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0IHJlc291cmNlcw0KLWFyZSBhdXRvbWF0aWNhbGx5IHZhbGlkYXRlZCB3aGVuIHlvdSBzYXZlIHRoZW0uIEZyb20gYSBwcm9qZWN0J3MgcG9wLXVwIG1lbnUsDQotY2xpY2sgPHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+LCB0aGVuIHNlbGVjdCA8dWljb250cm9sPlZhbGlkYXRpb248L3VpY29udHJvbD4uDQotQW55IHZhbGlkYXRvcnMgeW91IGNhbiBydW4gYWdhaW5zdCB5b3VyIHByb2plY3Qgd2lsbCBiZSBsaXN0ZWQgaW4gdGhlIFZhbGlkYXRpb24NCi1wYWdlLjwvcD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWwuZGl0YSIgc2NvcGU9InBlZXIiPg0KLTxsaW5rdGV4dD5WYWxpZGF0aW5nIGNvZGUgaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbnM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyNjU4Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3eHZhbGlkLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3eHZhbGlkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMjJhMWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d3h2YWxpZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVmFsaWRhdGluZyBYTUwgZmlsZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iV2hlbiB5b3UgdmFsaWRhdGUgeW91ciBYTUwgZmlsZSwgdGhlIFhNTCB2YWxpZGF0b3Igd2lsbCBjaGVjayB0byBzZWUgdGhhdCB5b3VyIGZpbGUgaXMgdmFsaWQgYW5kIHdlbGwtZm9ybWVkLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJXaGVuIHlvdSB2YWxpZGF0ZSB5b3VyIFhNTCBmaWxlLCB0aGUgWE1MIHZhbGlkYXRvciB3aWxsIGNoZWNrIHRvIHNlZSB0aGF0IHlvdXIgZmlsZSBpcyB2YWxpZCBhbmQgd2VsbC1mb3JtZWQuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGZpbGVzLCB2YWxpZGF0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGZpbGVzLCB2YWxpZGF0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3eHZhbGlkIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+VmFsaWRhdGluZyBYTUwgZmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3eHZhbGlkIj48YSBuYW1lPSJ0d3h2YWxpZCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VmFsaWRhdGluZyBYTUwgZmlsZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPldoZW4geW91IHZhbGlkYXRlIHlvdXIgWE1MIGZpbGUsIHRoZSBYTUwgdmFsaWRhdG9yIHdpbGwgY2hlY2sgdG8KLXNlZSB0aGF0IHlvdXIgZmlsZSBpcyB2YWxpZCBhbmQgd2VsbC1mb3JtZWQuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgWE1MIGVkaXRvciB3aWxsIHByb2Nlc3MgWE1MIGZpbGVzIHRoYXQgYXJlIGludmFsaWQgb3Igbm90Ci13ZWxsLWZvcm1lZC4gVGhlIGVkaXRvciB1c2VzIGhldXJpc3RpY3MgdG8gb3BlbiBhIGZpbGUgdXNpbmcgdGhlIGJlc3QgaW50ZXJwcmV0YXRpb24KLW9mIHRoZSB0YWdnaW5nIHRoYXQgaXQgY2FuLiBGb3IgZXhhbXBsZSwgYW4gZWxlbWVudCB3aXRoIGEgbWlzc2luZyBlbmQgdGFnCi1pcyBzaW1wbHkgYXNzdW1lZCB0byBlbmQgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuIEFzIHlvdSBtYWtlIHVwZGF0ZXMgdG8KLWEgZmlsZSwgdGhlIGVkaXRvciBpbmNyZW1lbnRhbGx5IHJlaW50ZXJwcmV0cyB5b3VyIGRvY3VtZW50LCBjaGFuZ2luZyB0aGUKLWhpZ2hsaWdodGluZywgdHJlZSB2aWV3LCBhbmQgc28gb24uIE1hbnkgZm9ybWF0aW9uIGVycm9ycyBhcmUgZWFzeSB0byBzcG90Ci1pbiB0aGUgc3ludGF4IGhpZ2hsaWdodGluZywgc28geW91IGNhbiBlYXNpbHkgY29ycmVjdCBvYnZpb3VzIGVycm9ycyBvbi10aGUtZmx5LgotSG93ZXZlciwgdGhlcmUgd2lsbCBiZSBvdGhlciBjYXNlcyB3aGVuIGl0IHdpbGwgYmUgYmVuZWZpY2lhbCB0byBwZXJmb3JtIGZvcm1hbAotdmFsaWRhdGlvbiBvbiB5b3VyIGRvY3VtZW50cy48L3A+Ci08cD5Zb3UgY2FuIHZhbGlkYXRlIHlvdXIgZmlsZSBieSBzZWxlY3RpbmcKLWl0IGluIHRoZSBOYXZpZ2F0b3IgdmlldywgcmlnaHQtY2xpY2tpbmcgaXQsIGFuZCBjbGlja2luZyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0ZTwvc3Bhbj4uCi1BbnkgdmFsaWRhdGlvbiBwcm9ibGVtcyBhcmUgaW5kaWNhdGVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiBZb3UgY2FuIGRvdWJsZS1jbGljawotb24gaW5kaXZpZHVhbCBlcnJvcnMsIGFuZCB5b3Ugd2lsbCBiZSB0YWtlbiB0byB0aGUgaW52YWxpZCB0YWcgaW4gdGhlIGZpbGUsCi1zbyB0aGF0IHlvdSBjYW4gbWFrZSBjb3JyZWN0aW9ucy48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+ICBJZiB5b3UgcmVjZWl2ZSBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgUHJvYmxlbXMKLXZpZXcgaXMgZnVsbCwgeW91IGNhbiBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGVycm9yIG1lc3NhZ2VzIGFsbG93ZWQgYnkgY2xpY2tpbmcgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj4KLTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj48L3NwYW4+IGFuZAotc2VsZWN0aW5nIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NYXJrZXJzPC9zcGFuPgotPC9zcGFuPi4gU2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Vc2UgbWFya2VyIGxpbWl0czwvc3Bhbj4gY2hlY2sKLWJveCBhbmQgY2hhbmdlIHRoZSBudW1iZXIgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkxpbWl0IHZpc2libGUgaXRlbXMgcGVyIGdyb3VwPC9zcGFuPiBmaWVsZC48L2Rpdj4KLTxwPllvdQotY2FuIHNldCB1cCBhIHByb2plY3QncyBwcm9wZXJ0aWVzIHNvIHRoYXQgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3QgcmVzb3VyY2VzCi1hcmUgYXV0b21hdGljYWxseSB2YWxpZGF0ZWQgd2hlbiB5b3Ugc2F2ZSB0aGVtLiBGcm9tIGEgcHJvamVjdCdzIHBvcC11cCBtZW51LAotY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllczwvc3Bhbj4sIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRpb248L3NwYW4+LgotQW55IHZhbGlkYXRvcnMgeW91IGNhbiBydW4gYWdhaW5zdCB5b3VyIHByb2plY3Qgd2lsbCBiZSBsaXN0ZWQgaW4gdGhlIFZhbGlkYXRpb24KLXBhZ2UuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iPlhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGluZm8iPjxzdHJvbmc+UmVsYXRlZCBpbmZvcm1hdGlvbjwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWwuaHRtbCI+VmFsaWRhdGluZyBjb2RlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb25zPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFjMWQxZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIFhNTCBlZGl0b3IgaGFzIGEgRGVzaWduIHZpZXcsIHdoaWNoIHJlcHJlc2VudHMgdGhlIFhNTCBmaWxlIHNpbXVsdGFuZW91c2x5IGFzIGEgdGFibGUgYW5kIGEgdHJlZS4gVGhpcyBoZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcgZWFzaWVyLiBDb250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLCB3aGlsZSBwb3AtdXAgbWVudXMgb24gdGhlIHRyZWUgZWxlbWVudHMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoYXQgcGFydGljdWxhciBlbGVtZW50LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGUgWE1MIGVkaXRvciBoYXMgYSBEZXNpZ24gdmlldywgd2hpY2ggcmVwcmVzZW50cyB0aGUgWE1MIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsIHdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgRGVzaWduIHZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBEZXNpZ24gdmlldyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3htbGVkdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRkb2MuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRzY2guaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRwcm9jLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9yeG1sYmljb25zLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHhlZHRkZXMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHhlZHRkZXMiPjxhIG5hbWU9InR4ZWR0ZGVzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VGhlIFhNTCBlZGl0b3IgaGFzIGEgRGVzaWduIHZpZXcsIHdoaWNoIHJlcHJlc2VudHMgdGhlIFhNTCBmaWxlCi1zaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIGFuZCBhIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nCi1lYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsCi13aGlsZSBwb3AtdXAgbWVudXMgb24gdGhlIHRyZWUgZWxlbWVudHMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQgZm9yCi10aGF0IHBhcnRpY3VsYXIgZWxlbWVudC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPkZvciBleGFtcGxlLCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIGNoaWxkPC9zcGFuPiBtZW51IGl0ZW0gd2lsbAotbGlzdCBvbmx5IHRob3NlIGVsZW1lbnRzIGZyb20gYSBEVEQgb3IgWE1MIHNjaGVtYSB3aGljaCB3b3VsZCBiZSB2YWxpZCBjaGlsZHJlbgotYXQgdGhhdCBwb2ludC48L3A+Ci08cD5XaGVuIHlvdSBoYXZlIGFuIFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgc2NoZW1hCi1vciBEVEQgZmlsZSwgY2VydGFpbiB0YWdzIGFuZCBydWxlcyBmb3IgdGhhdCBmaWxlIGhhdmUgYWxyZWFkeSBiZWVuIGVzdGFibGlzaGVkLAotd2hpY2ggaXMgd2h5IHRoZSBEZXNpZ24gdmlldyBjYW4gcHJvdmlkZSBwcm9tcHRzICh2aWEgYSBwb3AtdXAgbWVudSkgZm9yIHRob3NlCi10YWdzLiBXaGVuIHlvdSBjcmVhdGUgYW4gWE1MIGZpbGUgdGhhdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBzY2hlbWEKLW9yIERURCBmaWxlLCBpdCBoYXMgbm8gdGFncyBvciBydWxlcyBhc3NvY2lhdGVkIHdpdGggaXQsIHNvIHRoZSBEZXNpZ24gdmlldwotY2Fubm90IHByb3ZpZGUgcHJvbXB0cyBmb3Igc3BlY2lmaWMgdGFncywgYnV0IGl0IGNhbiBwcm92aWRlIHByb21wdHMgdG8gY3JlYXRlCi1uZXcgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMuPC9wPgotPHA+Rm9yIGFueSBYTUwgZmlsZSBhc3NvY2lhdGVkIHdpdGggYW4gWE1MCi1zY2hlbWEgb3IgRFREIGZpbGUsIHlvdSBjYW4gdXNlIHRoZSBEZXNpZ24gdmlldyB0byBhZGQgYW55IGl0ZW1zIGRlZmluZWQgaW4KLXRoZSBYTUwgc2NoZW1hIG9yIERURCAoc3VjaCBhcyBlbGVtZW50cyBhbmQgYXR0cmlidXRlcykgdG8gdGhlIFhNTCBmaWxlLiBZb3UKLWNhbiBhbHNvIHVzZSBpdCB0byBhZGQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgYW5kIGNvbW1lbnRzIHRvIGFsbCBYTUwgZmlsZXMuPC9wPgotPHA+VG8KLW9wZW4gYW5kIGVkaXQgYSBYTUwgZmlsZSBpbiB0aGUgWE1MIGVkaXRvciwgcmlnaHQtY2xpY2sgdGhlIGZpbGUgaW4gdGhlIE5hdmlnYXRvcgotdmlldyBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3BlbiBXaXRoICZndDsgWE1MIEVkaXRvcjwvc3Bhbj4uIElmIG5lY2Vzc2FyeSwKLWNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZXNpZ248L3NwYW4+IHRhYiB0byBvcGVuIHRoZSBEZXNpZ24gdmlldy48L3A+Ci08cD5UbwotZXhwYW5kIGFsbCB0aGUgaXRlbXMgaW4geW91ciBYTUwgZmlsZSwgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUw8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHBhbmQgQWxsPC9zcGFuPjwvc3Bhbj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9leHBhbmRfYWxsLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIEV4cGFuZCBBbGwgdG9vbGJhciBidXR0b24iIC8+IG9uIHRoZSB0b29sYmFyLgotVG8gY29sbGFwc2UgdGhlbSwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbGxhcHNlCi1BbGw8L3NwYW4+PC9zcGFuPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL2NvbGxhcHNlX2FsbC5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBDb2xsYXBzZSBBbGwgdG9vbGJhciBidXR0b24iIC8+IG9uIHRoZQotdG9vbGJhci48L3A+Ci08cD5JZiB5b3UgcmlnaHQtY2xpY2sgdGhlIGl0ZW0gdGhhdCB5b3Ugd2FudCB0byB3b3JrIHdpdGgsIHNvbWUKLW9yIGFsbCBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnMgKGFzIGFwcGxpY2FibGUpIHdpbGwgYmUgYXZhaWxhYmxlIGZyb20gdGhlCi1wb3AtdXAgbWVudSB0aGF0IGFwcGVhcnM6PC9wPgotPHAgLz4KLQotPGRpdiBjbGFzcz0idGFibGVub2JvcmRlciI+PHRhYmxlIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0IiBmcmFtZT0iYm9yZGVyIiBib3JkZXI9IjEiIHJ1bGVzPSJhbGwiPgotPHRoZWFkIGFsaWduPSJsZWZ0Ij4KLTx0ciB2YWxpZ249ImJvdHRvbSI+Ci08dGggdmFsaWduPSJib3R0b20iIHdpZHRoPSIyNC4yNDI0MjQyNDI0MjQyNDIlIiBpZD0iTjEwMEQ4Ij5TZWxlY3QgdGhpczwvdGg+Ci0KLTx0aCB2YWxpZ249ImJvdHRvbSIgd2lkdGg9Ijc1Ljc1NzU3NTc1NzU3NTc1JSIgaWQ9Ik4xMDBERiI+SWYgeW91IHdhbnQgdG8gZG8gdGhpczwvdGg+Ci0KLTwvdHI+Ci0KLTwvdGhlYWQ+Ci0KLTx0Ym9keT4KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjI0MjQyNDI0MjQyNDI0MiUiIGhlYWRlcnM9Ik4xMDBEOCAiPkFkZCBEVEQgSW5mb3JtYXRpb248L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI3NS43NTc1NzU3NTc1NzU3NSUiIGhlYWRlcnM9Ik4xMDBERiAiPkFzc29jaWF0ZSB0aGUgWE1MIGZpbGUgd2l0aCBhIERURC48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4yNDI0MjQyNDI0MjQyNDIlIiBoZWFkZXJzPSJOMTAwRDggIj5FZGl0IERPQ1RZUEU8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI3NS43NTc1NzU3NTc1NzU3NSUiIGhlYWRlcnM9Ik4xMDBERiAiPkVkaXQgdGhlIERPQ1RZUEUgZGVjbGFyYXRpb24uIFJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2sKLWZvciBtb3JlIGRldGFpbHMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0idGVkdGRvYy5kaXRhIj5FZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zPC9hPi48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4yNDI0MjQyNDI0MjQyNDIlIiBoZWFkZXJzPSJOMTAwRDggIj5FZGl0IE5hbWVzcGFjZXM8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI3NS43NTc1NzU3NTc1NzU3NSUiIGhlYWRlcnM9Ik4xMDBERiAiPkVkaXQgdGhlIGV4aXN0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBvciBjcmVhdGUgYQotbmV3IGFzc29jaWF0aW9uIHdpdGggYSBuYW1lc3BhY2UuIFJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2sgZm9yIG1vcmUgZGV0YWlscy4KLUZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0idGVkdHNjaC5kaXRhIj5FZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvYT4uPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMjQyNDI0MjQyNDI0MjQyJSIgaGVhZGVycz0iTjEwMEQ4ICI+RWRpdCBQcm9jZXNzaW5nIEluc3RydWN0aW9uPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNzUuNzU3NTc1NzU3NTc1NzUlIiBoZWFkZXJzPSJOMTAwREYgIj5FZGl0IHRoZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLiBSZWZlciB0byB0aGUgcmVsYXRlZAotdGFzayBmb3IgbW9yZSBkZXRhaWxzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9InRlZHRwcm9jLmRpdGEiPkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPC9hPi48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4yNDI0MjQyNDI0MjQyNDIlIiBoZWFkZXJzPSJOMTAwRDggIj5SZW1vdmU8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI3NS43NTc1NzU3NTc1NzU3NSUiIGhlYWRlcnM9Ik4xMDBERiAiPlJlbW92ZSB0aGUgaXRlbSB0aGF0IHlvdSBoYXZlIHNlbGVjdGVkIGZyb20gdGhlIFhNTAotZmlsZS4gSWYgdGhlIHNlbGVjdGVkIGl0ZW0gb3IgcmVsYXRlZCBpdGVtcyBhcmUgZGVmaW5lZCBzbyB0aGF0IHRoZSBpdGVtIG11c3QKLWV4aXN0IGluIHRoZSBmaWxlLCB0aGlzIG9wdGlvbiB3aWxsIG5vdCBiZSBhdmFpbGFibGUuIEZvciBleGFtcGxlLCBpbiB5b3VyCi1EVEQsIGlmIHlvdSBoYXZlIGRlY2xhcmVkIHRoYXQgIk9uZSBvciBtb3JlIiBvZiB0aGUgaXRlbSBtdXN0IGFsd2F5cyBleGlzdAotaW4geW91ciBYTUwgZmlsZSwgYW5kIHRoZSBpdGVtIHlvdSBoYXZlIHNlbGVjdGVkIGlzIHRoZSBvbmx5IG9uZSB0aGF0IGV4aXN0cwotaW4geW91ciBYTUwgZmlsZS48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyNC4yNDI0MjQyNDI0MjQyNDIlIiBoZWFkZXJzPSJOMTAwRDggIj5BZGQgQXR0cmlidXRlPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNzUuNzU3NTc1NzU3NTc1NzUlIiBoZWFkZXJzPSJOMTAwREYgIj5BZGQgYW4gYXR0cmlidXRlIHRvIHRoZSBlbGVtZW50IHRoYXQgeW91IHNlbGVjdGVkLiBBbnkKLWF0dHJpYnV0ZXMgeW91IGFyZSBhbGxvd2VkIHRvIGFkZCB0byB0aGUgZWxlbWVudCB3aWxsIGJlIGxpc3RlZC4gQWZ0ZXIgeW91Ci1oYXZlIGFkZGVkIHRoZSBhdHRyaWJ1dGUgdG8gdGhlIFhNTCBmaWxlLCB5b3UgY2FuIGNsaWNrIGluIHRoZSByaWdodC1oYW5kCi1jb2x1bW4gdG8gY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLiBJZiB0aGUgYXR0cmlidXRlIGhhcyBzZXQgdmFsdWVzLAotdGhleSB3aWxsIGFwcGVhciBpbiBhIGxpc3QuPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMjQyNDI0MjQyNDI0MjQyJSIgaGVhZGVycz0iTjEwMEQ4ICI+QWRkIENoaWxkPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNzUuNzU3NTc1NzU3NTc1NzUlIiBoZWFkZXJzPSJOMTAwREYgIj5BZGQgYW5vdGhlciBlbGVtZW50LCBhIGNvbW1lbnQsIG9yIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbgotYXMgYSBjaGlsZCBvZiB0aGUgcGFyZW50IGVsZW1lbnQuPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQuMjQyNDI0MjQyNDI0MjQyJSIgaGVhZGVycz0iTjEwMEQ4ICI+QWRkIEJlZm9yZTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9Ijc1Ljc1NzU3NTc1NzU3NTc1JSIgaGVhZGVycz0iTjEwMERGICI+QWRkIGEgY2hpbGQgZWxlbWVudCwgY29tbWVudCwgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbgotdGhhdCBjYW4gZ28gYmVmb3JlIHRoZSBpdGVtIHlvdSBoYXZlIHNlbGVjdGVkLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYQotcGFyZW50IGVsZW1lbnQgY2FsbGVkIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+Q0QgQ29sbGVjdGlvbnM8L2tiZD4gdGhhdCBjYW4gY29udGFpbgotYW4gdW5saW1pdGVkIGFtb3VudCBvZiBjaGlsZHJlbiBjYWxsZWQgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5DRDwva2JkPiwgeW91IGNvdWxkCi1jbGljayBhIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+Q0Q8L2tiZD4gZWxlbWVudCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQKLUJlZm9yZTwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj4gQ0Q8L3NwYW4+PC9zcGFuPiAsIGFzIGEgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5DRDwva2JkPiBlbGVtZW50Ci1jYW4gZ28gYmVmb3JlIGFub3RoZXIgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5DRDwva2JkPiBlbGVtZW50LjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjI0MjQyNDI0MjQyNDI0MiUiIGhlYWRlcnM9Ik4xMDBEOCAiPkFkZCBBZnRlcjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9Ijc1Ljc1NzU3NTc1NzU3NTc1JSIgaGVhZGVycz0iTjEwMERGICI+QWRkIGEgY2hpbGQgZWxlbWVudCwgY29tbWVudCwgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbgotdGhhdCBjYW4gZ28gYWZ0ZXIgdGhlIGl0ZW0geW91IGhhdmUgc2VsZWN0ZWQuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIHBhcmVudAotZWxlbWVudCBjYWxsZWQgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5DRCBDb2xsZWN0aW9uczwva2JkPiB0aGF0IGNhbiBjb250YWluIGFuIHVubGltaXRlZAotYW1vdW50IG9mIGNoaWxkcmVuIGNhbGxlZCA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkNEPC9rYmQ+LCB5b3UgY291bGQgY2xpY2sgYSA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkNEPC9rYmQ+IGVsZW1lbnQKLWFuZCBjbGljayAgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQWZ0ZXI8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+IENEPC9zcGFuPgotPC9zcGFuPiwgYXMgYSA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkNEPC9rYmQ+IGVsZW1lbnQgY2FuIGdvIGFmdGVyIGFub3RoZXIgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5DRDwva2JkPiBlbGVtZW50LjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0LjI0MjQyNDI0MjQyNDI0MiUiIGhlYWRlcnM9Ik4xMDBEOCAiPlJlcGxhY2UgV2l0aDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9Ijc1Ljc1NzU3NTc1NzU3NTc1JSIgaGVhZGVycz0iTjEwMERGICI+UmVwbGFjZSBvbmUgaXRlbSB3aXRoIGFub3RoZXIuIFRoaXMgb3B0aW9uIGlzIG5vdCBhdmFpbGFibGUKLWlmIHlvdSB0dXJuIGdyYW1tYXIgY29uc3RyYWludHMgb2ZmIG9yIGlmIHRoZXJlIGFyZSBubyB2YWxpZCBhbHRlcm5hdGl2ZXMKLWZvciB5b3UgdG8gcmVwbGFjZSB0aGUgaXRlbSB3aXRoLjwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGJvZHk+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5BbnkgY2hhbmdlcyB5b3UgbWFrZSBpbiB0aGUgRGVzaWduIHZpZXcgYXJlIGFsc28gcmVmbGVjdGVkIGluIHRoZQotU291cmNlIHZpZXcgYW5kIHRoZSBPdXRsaW5lIHZpZXcuPC9wPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFRoZXNlIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4KLWZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvZGl2PgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iPlhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIHRpdGxlPSJXaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcyBib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLiI+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSB0aGUgU291cmNlIHZpZXcgdG8gdmlldyBhbmQgd29yayB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlIGRpcmVjdGx5LiI+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0ZG9jLmh0bWwiIHRpdGxlPSJUaGUgRE9DVFlQRSBkZWNsYXJhdGlvbiBpbiBhbiBYTUwgZmlsZSBpcyB1c2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXQgdG8gYXNzb2NpYXRlIGl0IHdpdGggYSBEVEQgZmlsZS4gWW91IGNhbiBlZGl0IHlvdXIgRE9DVFlQRSBkZWNsYXJhdGlvbiB0byBjaGFuZ2UgdGhlIERURCBmaWxlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLiI+RWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9uczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRzY2guaHRtbCIgdGl0bGU9IllvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSB2YXJpb3VzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBYTUwgZmlsZSwgc3VjaCBhcyB0aGUgWE1MIHNjaGVtYSBhbmQgbmFtZXNwYWNlIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gSWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdGhlIHNjaGVtYSBhbmQgbmFtZXNwYWNlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIG9yIGFkZCBhIG5ldyBhc3NvY2lhdGlvbi4gTW9kaWZ5aW5nIGFueSBhc3NvY2lhdGlvbnMgY2FuIGltcGFjdCB3aGF0IGNvbnRlbnQgaXMgYWxsb3dlZCBpbiB0aGUgWE1MIGZpbGUuIj5FZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRwcm9jLmh0bWwiIHRpdGxlPSJJZiB5b3UgaGF2ZSBpbnN0cnVjdGlvbnMgeW91IHdhbnQgdG8gc2VuZCB0byBhbiBhcHBsaWNhdGlvbiB1c2luZyBhbiBYTUwgZG9jdW1lbnQsIHlvdSBjYW4gdXNlIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4iPkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxyZWYiPjxzdHJvbmc+UmVsYXRlZCByZWZlcmVuY2U8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3J4bWxiaWNvbnMuaHRtbCIgdGl0bGU9IlRoZSBmb2xsb3dpbmcgWE1MIGVkaXRvciBpY29ucyBhcHBlYXIgaW4gdGhlIE91dGxpbmUgYW5kIERlc2lnbiB2aWV3LiI+SWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0c3JjLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0c3JjLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYThmYWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdHNyYy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0eGVkdHNyYyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3PC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlDQotY29kZSBkaXJlY3RseS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5Tb3VyY2UgdmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+IFRoZSBTb3VyY2UgdmlldyBoYXMgbWFueSB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMsIHN1Y2ggYXM6PC9wPjxkbD4NCi08ZGxlbnRyeT4NCi08ZHQ+U3ludGF4IGhpZ2hsaWdodGluZzwvZHQ+DQotPGRkPkVhY2ggdGFnIHR5cGUgaXMgaGlnaGxpZ2h0ZWQgZGlmZmVyZW50bHksIGVuYWJsaW5nIHlvdSB0byBlYXNpbHkgZmluZA0KLWEgY2VydGFpbiBraW5kIG9mIHRhZyBmb3IgZWRpdGluZy4gSW4gYWRkaXRpb24sIHN5bnRheCBoaWdobGlnaHRpbmcgaXMgdmFsdWFibGUNCi1pbiBsb2NhdGluZyBzeW50YXggZXJyb3JzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGJlZ2luIGEgY29tbWVudCBpbiB0aGUgbWlkZGxlDQotb2YgdGhlIGRvY3VtZW50IHdpdGggPGNvZGVwaD4mbHQ7IS0tPC9jb2RlcGg+IGV2ZXJ5dGhpbmcgdW50aWwgdGhlIG5leHQgPGNvZGVwaD4tLT48L2NvZGVwaD4gaXMNCi1jb25zaWRlcmVkIGEgY29tbWVudCwgYW5kIHdpbGwgYmUgaGlnaGxpZ2h0ZWQgYWNjb3JkaW5nbHkuIFRoZSBsYXJnZSBoaWdobGlnaHRlZA0KLWFyZWEgd2lsbCBpbmRpY2F0ZSB0aGF0IHlvdSBuZWVkIHRvIGFkZCA8Y29kZXBoPi0tPjwvY29kZXBoPiB0byBjbG9zZSB0aGUNCi1jb21tZW50LjxwPllvdSBjYW4gY3VzdG9taXplIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nLiBSZWZlciB0byB0aGUgcmVsYXRlZA0KLXRhc2tzIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD48L2RkPg0KLTwvZGxlbnRyeT48L2RsPjxkbD48ZGxlbnRyeT4NCi08ZHQ+VW5saW1pdGVkIHVuZG8gYW5kIHJlZG88L2R0Pg0KLTxkZD5UaGVzZSBvcHRpb25zIGFsbG93IHlvdSB0byBpbmNyZW1lbnRhbGx5IHVuZG8gYW5kIHJlZG8gZXZlcnkgY2hhbmdlIG1hZGUNCi10byBhIGZpbGUgZm9yIHRoZSBlbnRpcmUgZWRpdGluZyBzZXNzaW9uLiBGb3IgdGV4dCwgY2hhbmdlcyBhcmUgaW5jcmVtZW50ZWQNCi1vbmUgY2hhcmFjdGVyIG9yIHNldCBvZiBzZWxlY3RlZCBjaGFyYWN0ZXJzIGF0IGEgdGltZS48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+Q29udGVudCBhc3Npc3Q8L2R0Pg0KLTxkZD5Db250ZW50IGFzc2lzdCBoZWxwcyB5b3UgZmluaXNoIHRhZ3MgYW5kIGluc2VydCBtYWNyb3MuIFJlZmVyIHRvIHRoZSByZWxhdGVkDQotdGFzayBmb3IgbW9yZSBkZXRhaWxzLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5UZW1wbGF0ZTwvZHQ+DQotPGRkPllvdSBjYW4gYWNjZXNzIHRlbXBsYXRlcyAodXNpbmcgY29udGVudCBhc3Npc3QpIHRvIGhlbHAgeW91IHF1aWNrbHkgYWRkDQotcmVndWxhcmx5LXVzZWQgdGFnZ2luZyBjb21iaW5hdGlvbnMuIFJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2sgZm9yIG1vcmUgZGV0YWlscy48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+Tm9kZSBzZWxlY3Rpb248L2R0Pg0KLTxkZD5CYXNlZCBvbiB0aGUgbG9jYXRpb24gb2YgeW91ciBjdXJzb3IgKG9yIHNlbGVjdGlvbiBpbiB0aGUgT3V0bGluZSB2aWV3KSwNCi10aGUgbm9kZSBzZWxlY3Rpb24gaW5kaWNhdG9yIGhpZ2hsaWdodHMgdGhlIGxpbmUgbnVtYmVycyB0aGF0IGluY2x1ZGUgYSBub2RlDQotKGZvciBleGFtcGxlLCBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZSksIGluIHRoZSB2ZXJ0aWNhbCBydWxlciBpbiB0aGUgbGVmdA0KLWFyZWEgb2YgdGhlIFNvdXJjZSB2aWV3LjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5Qb3AtdXAgbWVudSBvcHRpb25zPC9kdD4NCi08ZGQ+RnJvbSB0aGUgZWRpdG9yJ3MgcG9wLXVwIG1lbnUsIHlvdSBoYXZlIG1hbnkgb2YgdGhlIHNhbWUgZWRpdGluZyBvcHRpb25zDQotYXZhaWxhYmxlIGFzIHlvdSBkbyBmcm9tIHRoZSB3b3JrYmVuY2ggIDxiPkVkaXQ8L2I+IG1lbnUuIFlvdSBjYW4gc2VsZWN0IG1lbnUNCi1vcHRpb25zIHN1Y2ggYXM6IDx1aWNvbnRyb2w+Q2xlYW51cCBEb2N1bWVudCw8L3VpY29udHJvbD4gdG8gb3BlbiB0aGUgPHVpY29udHJvbD5DbGVhbnVwPC91aWNvbnRyb2w+IA0KLWRpYWxvZywgd2hpY2ggY29udGFpbnMgc2V0dGluZ3MgdG8gdXBkYXRlIGEgZG9jdW1lbnQgc28gdGhhdCBpdCBpcyB3ZWxsLWZvcm1lZA0KLWFuZCBmb3JtYXR0ZWQgYW5kIDx1aWNvbnRyb2w+Rm9ybWF0LDwvdWljb250cm9sPiB3aGljaCBmb3JtYXRzIGVpdGhlciB0aGUNCi1lbnRpcmUgZG9jdW1lbnQgb3Igc2VsZWN0ZWQgZWxlbWVudHMuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PiJTbWFydCIgZG91YmxlIGNsaWNraW5nPC9kdD4NCi08ZGQ+WW91IGNhbiB1c2UgZG91YmxlLWNsaWNrIHRvIHNlbGVjdCBhdHRyaWJ1dGUgdmFsdWVzLCBhdHRyaWJ1dGUtdmFsdWUgcGFpcnMsDQotYW5kIGVudGlyZSB0YWcgc2V0cyB0byBxdWlja2x5IHVwZGF0ZSwgY29weSwgb3IgcmVtb3ZlIGNvbnRlbnQuPC9kZD4NCi08L2RsZW50cnk+PC9kbD48cD5UbyBvcGVuIGFuIFhNTCBmaWxlIHRvIGVkaXQsIHJpZ2h0LWNsaWNrIHRoZSBmaWxlIGluIHRoZQ0KLU5hdmlnYXRvciB2aWV3IGFuZCBzZWxlY3QgPHVpY29udHJvbD5PcGVuIFdpdGggPiBYTUwgRWRpdG9yPC91aWNvbnRyb2w+LiBDbGljaw0KLXRoZSA8dWljb250cm9sPlNvdXJjZTwvdWljb250cm9sPiB0byBzZWUgdGhlIFNvdXJjZSB2aWV3LjwvcD48cD5FZGl0IHRoZSBjb2RlDQotYXMgbmVjZXNzYXJ5LCB1c2luZyBhbnkgb2YgdGhlIGF2YWlsYWJsZSBmZWF0dXJlcy4gQXMgeW91IG1vdmUgdGhlIGN1cnNvcg0KLXdpdGhpbiB5b3VyIFhNTCBmaWxlIChvciBzZWxlY3QgaXRlbXMgZnJvbSB0aGUgT3V0bGluZSB2aWV3KSwgdGhlIG5vZGUgc2VsZWN0aW9uDQotaW5kaWNhdG9yIHdpbGwgaGlnaGxpZ2h0IHRoZSBsaW5lIG51bWJlcnMgdGhhdCBlbmNvbXBhc3MgdGhlIG5vZGUgKGZvciBleGFtcGxlLA0KLWFuIGVsZW1lbnQgb3IgYXR0cmlidXRlKS4gWW91IGNhbiB1c2Ugc21hcnQgZG91YmxlLWNsaWNraW5nIGJlaGF2aW9yIHRvIHNlbGVjdA0KLWF0dHJpYnV0ZSB2YWx1ZXMsIGF0dHJpYnV0ZS12YWx1ZSBwYWlycywgYW5kIGVudGlyZSB0YWcgc2V0cyB0byBxdWlja2x5IHVwZGF0ZSwNCi1jb3B5LCBvciByZW1vdmUgY29udGVudC4gPD9QdWIgQ2FyZXQ/PklmIGRlc2lyZWQsIHZhbGlkYXRlIGFuZCBzYXZlIHRoZSBYTUwNCi1maWxlLjwvcD48L2NvbnRleHQ+DQotPHJlc3VsdD48cD5BbnkgY2hhbmdlcyB5b3UgbWFrZSBpbiB0aGUgU291cmNlIHZpZXcgYXJlIGFsc28gcmVmbGVjdGVkIGluIHRoZQ0KLURlc2lnbiB2aWV3IGFuZCB0aGUgT3V0bGluZSB2aWV3LjwvcD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMzc4MT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdHNyYy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdHNyYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDk1MjYwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRzcmMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIHVzZSB0aGUgU291cmNlIHZpZXcgdG8gdmlldyBhbmQgd29yayB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlIGRpcmVjdGx5LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJZb3UgY2FuIHVzZSB0aGUgU291cmNlIHZpZXcgdG8gdmlldyBhbmQgd29yayB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlIGRpcmVjdGx5LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIFNvdXJjZSB2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgU291cmNlIHZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2NkYXN0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d21hY3JvLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90dGFnaGlsdC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR4ZWR0c3JjIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR4ZWR0c3JjIj48YSBuYW1lPSJ0eGVkdHNyYyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L2gxPgotCi0KLQotCi08ZGl2PjxwPllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlCi1jb2RlIGRpcmVjdGx5LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+IFRoZSBTb3VyY2UgdmlldyBoYXMgbWFueSB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMsIHN1Y2ggYXM6PC9wPgotPGRsPgotCi08ZHQgY2xhc3M9ImRsdGVybSI+U3ludGF4IGhpZ2hsaWdodGluZzwvZHQ+Ci0KLTxkZD5FYWNoIHRhZyB0eXBlIGlzIGhpZ2hsaWdodGVkIGRpZmZlcmVudGx5LCBlbmFibGluZyB5b3UgdG8gZWFzaWx5IGZpbmQKLWEgY2VydGFpbiBraW5kIG9mIHRhZyBmb3IgZWRpdGluZy4gSW4gYWRkaXRpb24sIHN5bnRheCBoaWdobGlnaHRpbmcgaXMgdmFsdWFibGUKLWluIGxvY2F0aW5nIHN5bnRheCBlcnJvcnMuIEZvciBleGFtcGxlLCBpZiB5b3UgYmVnaW4gYSBjb21tZW50IGluIHRoZSBtaWRkbGUKLW9mIHRoZSBkb2N1bWVudCB3aXRoIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDshLS08L3NhbXA+IGV2ZXJ5dGhpbmcgdW50aWwgdGhlIG5leHQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+LS0mZ3Q7PC9zYW1wPiBpcwotY29uc2lkZXJlZCBhIGNvbW1lbnQsIGFuZCB3aWxsIGJlIGhpZ2hsaWdodGVkIGFjY29yZGluZ2x5LiBUaGUgbGFyZ2UgaGlnaGxpZ2h0ZWQKLWFyZWEgd2lsbCBpbmRpY2F0ZSB0aGF0IHlvdSBuZWVkIHRvIGFkZCA8c2FtcCBjbGFzcz0iY29kZXBoIj4tLSZndDs8L3NhbXA+IHRvIGNsb3NlIHRoZQotY29tbWVudC48cD5Zb3UgY2FuIGN1c3RvbWl6ZSB0aGUgc3ludGF4IGhpZ2hsaWdodGluZy4gUmVmZXIgdG8gdGhlIHJlbGF0ZWQKLXRhc2tzIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTwvZGQ+Ci0KLTwvZGw+Ci08ZGw+Ci08ZHQgY2xhc3M9ImRsdGVybSI+VW5saW1pdGVkIHVuZG8gYW5kIHJlZG88L2R0PgotCi08ZGQ+VGhlc2Ugb3B0aW9ucyBhbGxvdyB5b3UgdG8gaW5jcmVtZW50YWxseSB1bmRvIGFuZCByZWRvIGV2ZXJ5IGNoYW5nZSBtYWRlCi10byBhIGZpbGUgZm9yIHRoZSBlbnRpcmUgZWRpdGluZyBzZXNzaW9uLiBGb3IgdGV4dCwgY2hhbmdlcyBhcmUgaW5jcmVtZW50ZWQKLW9uZSBjaGFyYWN0ZXIgb3Igc2V0IG9mIHNlbGVjdGVkIGNoYXJhY3RlcnMgYXQgYSB0aW1lLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkNvbnRlbnQgYXNzaXN0PC9kdD4KLQotPGRkPkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBmaW5pc2ggdGFncyBhbmQgaW5zZXJ0IG1hY3Jvcy4gUmVmZXIgdG8gdGhlIHJlbGF0ZWQKLXRhc2sgZm9yIG1vcmUgZGV0YWlscy48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5UZW1wbGF0ZTwvZHQ+Ci0KLTxkZD5Zb3UgY2FuIGFjY2VzcyB0ZW1wbGF0ZXMgKHVzaW5nIGNvbnRlbnQgYXNzaXN0KSB0byBoZWxwIHlvdSBxdWlja2x5IGFkZAotcmVndWxhcmx5LXVzZWQgdGFnZ2luZyBjb21iaW5hdGlvbnMuIFJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2sgZm9yIG1vcmUgZGV0YWlscy48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5Ob2RlIHNlbGVjdGlvbjwvZHQ+Ci0KLTxkZD5CYXNlZCBvbiB0aGUgbG9jYXRpb24gb2YgeW91ciBjdXJzb3IgKG9yIHNlbGVjdGlvbiBpbiB0aGUgT3V0bGluZSB2aWV3KSwKLXRoZSBub2RlIHNlbGVjdGlvbiBpbmRpY2F0b3IgaGlnaGxpZ2h0cyB0aGUgbGluZSBudW1iZXJzIHRoYXQgaW5jbHVkZSBhIG5vZGUKLShmb3IgZXhhbXBsZSwgYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUpLCBpbiB0aGUgdmVydGljYWwgcnVsZXIgaW4gdGhlIGxlZnQKLWFyZWEgb2YgdGhlIFNvdXJjZSB2aWV3LjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPlBvcC11cCBtZW51IG9wdGlvbnM8L2R0PgotCi08ZGQ+RnJvbSB0aGUgZWRpdG9yJ3MgcG9wLXVwIG1lbnUsIHlvdSBoYXZlIG1hbnkgb2YgdGhlIHNhbWUgZWRpdGluZyBvcHRpb25zCi1hdmFpbGFibGUgYXMgeW91IGRvIGZyb20gdGhlIHdvcmtiZW5jaCAgPHN0cm9uZz5FZGl0PC9zdHJvbmc+IG1lbnUuIFlvdSBjYW4gc2VsZWN0IG1lbnUKLW9wdGlvbnMgc3VjaCBhczogPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q2xlYW51cCBEb2N1bWVudCw8L3NwYW4+IHRvIG9wZW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNsZWFudXA8L3NwYW4+IAotZGlhbG9nLCB3aGljaCBjb250YWlucyBzZXR0aW5ncyB0byB1cGRhdGUgYSBkb2N1bWVudCBzbyB0aGF0IGl0IGlzIHdlbGwtZm9ybWVkCi1hbmQgZm9ybWF0dGVkIGFuZCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Gb3JtYXQsPC9zcGFuPiB3aGljaCBmb3JtYXRzIGVpdGhlciB0aGUKLWVudGlyZSBkb2N1bWVudCBvciBzZWxlY3RlZCBlbGVtZW50cy48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj4iU21hcnQiIGRvdWJsZSBjbGlja2luZzwvZHQ+Ci0KLTxkZD5Zb3UgY2FuIHVzZSBkb3VibGUtY2xpY2sgdG8gc2VsZWN0IGF0dHJpYnV0ZSB2YWx1ZXMsIGF0dHJpYnV0ZS12YWx1ZSBwYWlycywKLWFuZCBlbnRpcmUgdGFnIHNldHMgdG8gcXVpY2tseSB1cGRhdGUsIGNvcHksIG9yIHJlbW92ZSBjb250ZW50LjwvZGQ+Ci0KLTwvZGw+Ci08cD5UbyBvcGVuIGFuIFhNTCBmaWxlIHRvIGVkaXQsIHJpZ2h0LWNsaWNrIHRoZSBmaWxlIGluIHRoZQotTmF2aWdhdG9yIHZpZXcgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PcGVuIFdpdGggJmd0OyBYTUwgRWRpdG9yPC9zcGFuPi4gQ2xpY2sKLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Tb3VyY2U8L3NwYW4+IHRvIHNlZSB0aGUgU291cmNlIHZpZXcuPC9wPgotPHA+RWRpdCB0aGUgY29kZQotYXMgbmVjZXNzYXJ5LCB1c2luZyBhbnkgb2YgdGhlIGF2YWlsYWJsZSBmZWF0dXJlcy4gQXMgeW91IG1vdmUgdGhlIGN1cnNvcgotd2l0aGluIHlvdXIgWE1MIGZpbGUgKG9yIHNlbGVjdCBpdGVtcyBmcm9tIHRoZSBPdXRsaW5lIHZpZXcpLCB0aGUgbm9kZSBzZWxlY3Rpb24KLWluZGljYXRvciB3aWxsIGhpZ2hsaWdodCB0aGUgbGluZSBudW1iZXJzIHRoYXQgZW5jb21wYXNzIHRoZSBub2RlIChmb3IgZXhhbXBsZSwKLWFuIGVsZW1lbnQgb3IgYXR0cmlidXRlKS4gWW91IGNhbiB1c2Ugc21hcnQgZG91YmxlLWNsaWNraW5nIGJlaGF2aW9yIHRvIHNlbGVjdAotYXR0cmlidXRlIHZhbHVlcywgYXR0cmlidXRlLXZhbHVlIHBhaXJzLCBhbmQgZW50aXJlIHRhZyBzZXRzIHRvIHF1aWNrbHkgdXBkYXRlLAotY29weSwgb3IgcmVtb3ZlIGNvbnRlbnQuIElmIGRlc2lyZWQsIHZhbGlkYXRlIGFuZCBzYXZlIHRoZSBYTUwKLWZpbGUuPC9wPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPkFueSBjaGFuZ2VzIHlvdSBtYWtlIGluIHRoZSBTb3VyY2UgdmlldyBhcmUgYWxzbyByZWZsZWN0ZWQgaW4gdGhlCi1EZXNpZ24gdmlldyBhbmQgdGhlIE91dGxpbmUgdmlldy48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiI+WE1MIGVkaXRvcjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgdGl0bGU9IldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzIGJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuIj5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIGFuZCBhIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci4gQ29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywgd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGF0IHBhcnRpY3VsYXIgZWxlbWVudC4iPkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdjZGFzdC5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgdG8gaGVscCB5b3UgZmluaXNoIGEgdGFnIG9yIGxpbmUgb2YgY29kZSBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IuIFlvdSBjYW4gYWxzbyB1c2UgY29udGVudCBhc3Npc3QgdG8gaW5zZXJ0IHRlbXBsYXRlcyBpbnRvIHlvdXIgWE1MIGNvZGUuIj5Vc2luZyBYTUwgY29udGVudCBhc3Npc3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d21hY3JvLmh0bWwiIHRpdGxlPSJYTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIHNlY3Rpb24gb2YgcHJlZGVmaW5lZCBjb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBtYXkgZmluZCBhIHRlbXBsYXRlIHVzZWZ1bCB3aGVuIHlvdSBoYXZlIGEgY2VydGFpbiBwaWVjZSBvZiBjb2RlIHlvdSB3YW50IHRvIHJldXNlIHNldmVyYWwgdGltZXMsIGFuZCB5b3UgZG8gbm90IHdhbnQgdG8gd3JpdGUgaXQgb3V0IGV2ZXJ5IHRpbWUuIj5Xb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R0YWdoaWx0Lmh0bWwiIHRpdGxlPSJJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB2YXJpb3VzIGFzcGVjdHMgb2YgaG93IHRoZSBYTUwgc291cmNlIGNvZGUgaXMgZGlzcGxheWVkIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgc3VjaCBhcyB0aGUgY29sb3JzIHRoZSB0YWdzIHdpbGwgYmUgZGlzcGxheWVkIGluLiI+U2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0dGFnLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0dGFnLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNjVmZjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdHRhZy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0eGVkdHRhZyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyBYTUwgZmlsZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkVkaXRpbmcgWE1MIGZpbGVzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlZGl0aW5nIFhNTCBmaWxlcy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5YTUwgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+ZWRpdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VG8gb3BlbiBhbiBYTUwgZmlsZSBpbiB0aGUgWE1MIGVkaXRvciwgcmlnaHQtY2xpY2sgaXQgaW4gdGhlIE5hdmlnYXRvcg0KLXZpZXcgYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5PcGVuIFdpdGg8L3VpY29udHJvbD48dWljb250cm9sPlhNTA0KLUVkaXRvcjwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LiA8L3A+PHA+V2UgcmVjb21tZW5kIHdvcmtpbmcgaW4gdGhlIFJlc291cmNlDQotcGVyc3BlY3RpdmUgd2hlbiB5b3UgYXJlIGRldmVsb3BpbmcgWE1MIGZpbGVzLiBUaGUgdmlld3MgdGhhdCBhcHBlYXIgYnkgZGVmYXVsdA0KLWluIHRoaXMgcGVyc3BlY3RpdmUgKHN1Y2ggYXMgdGhlIE91dGxpbmUgdmlldykgaGVscCBmYWNpbGl0YXRlIFhNTCBkZXZlbG9wbWVudC48L3A+PHA+VGhlDQotWE1MIGVkaXRvciBlbmFibGVzIHlvdSB0byBkaXJlY3RseSBlZGl0IFhNTCBmaWxlcy4gVGhlcmUgYXJlIHNldmVyYWwgZGlmZmVyZW50DQotdmlld3MgeW91IGNhbiB1c2UgdG8gZWRpdCB5b3VyIGZpbGVzOjwvcD48dWw+DQotPGxpPjxiPlNvdXJjZSB2aWV3PC9iPjogeW91IGNhbiBtYW51YWxseSBpbnNlcnQsIGVkaXQsIGFuZCBkZWxldGUgZWxlbWVudHMNCi1hbmQgYXR0cmlidXRlcyBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IuIFRvIGZhY2lsaXRhdGUgdGhpcyBlZmZvcnQsDQoteW91IGNhbiB1c2UgY29udGVudCBhc3Npc3Qgd2hpbGUgeW91IGFyZSBpbiB0aGUgU291cmNlIHZpZXcuPC9saT4NCi08bGk+PGI+RGVzaWduIHZpZXc8L2I+OiB5b3UgY2FuIGluc2VydCwgZGVsZXRlLCBhbmQgZWRpdCBlbGVtZW50cywgYXR0cmlidXRlcywNCi1jb21tZW50cywgYW5kIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIGluIHRoaXMgdmlldy48L2xpPg0KLTxsaT48Yj5PdXRsaW5lIHZpZXc8L2I+OiB5b3UgY2FuIGluc2VydCBhbmQgZGVsZXRlIGVsZW1lbnRzIGF0dHJpYnV0ZXMsIGNvbW1lbnRzLA0KLWFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBpbiB0aGlzIHZpZXcuPC9saT4NCi08L3VsPjxwPk9mdGVuLCB5b3UgbWF5IGZpbmQgdGhhdCB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIHdheSB0byBwZXJmb3JtIGEgc3BlY2lmaWMNCi10YXNrLiBGb3IgZXhhbXBsZSwgeW91IGhhdmUgYW4gWE1MIGZpbGUgIk15U2Nob29sU3ViamVjdHMueG1sIiBhc3NvY2lhdGVkDQotd2l0aCBhbiBYTUwgc2NoZW1hIGZpbGUgIlNjaG9vbFN1YmplY3RzLnhzZCIsIHdoaWNoIGxpc3QgYWxsIHRoZSBzdWJqZWN0cw0KLXRhdWdodCBpbiBhIHNjaG9vbC4gWW91IHdhbnQgdG8gaW5zZXJ0IGEgbmV3IGVsZW1lbnQgIk1hdGgiIGludG8geW91ciBmaWxlLg0KLVlvdSBjYW4gZG8gc28gaW4gdGhlIGZvbGxvd2luZyB3YXlzOjwvcD48dWw+DQotPGxpPkluIHRoZSBPdXRsaW5lIG9yIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB0aGUgYXBwcm9wcmlhdGUgcGFyZW50IGVsZW1lbnQNCi1hbmQgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPkFkZCBDaGlsZDwvdWljb250cm9sPjx1aWNvbnRyb2w+TWF0aDwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IG9yIDx1aWNvbnRyb2w+TmV3IEVsZW1lbnQ8L3VpY29udHJvbD4gYW5kIGVudGVyIHRoZSBuYW1lIG9mDQotdGhlIGNoaWxkIGVsZW1lbnQ8P1B1YiBDYXJldD8+LjwvbGk+DQotPGxpPkluIHRoZSBTb3VyY2UgdmlldywgdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGhlbHAgeW91IGZpbmQgdGhlIGFwcHJvcHJpYXRlDQotbG9jYXRpb24gYW5kIGNvZGUgZm9yIHRoZSA8dWljb250cm9sPk1hdGg8L3VpY29udHJvbD4gZWxlbWVudC48L2xpPg0KLTxsaT5JbiB0aGUgU291cmNlIHZpZXcsIHR5cGUgdGhlIGNvZGUgZm9yIHRoZSA8dWljb250cm9sPk1hdGg8L3VpY29udHJvbD4gZWxlbWVudA0KLWluIHRoZSBmaWxlLjwvbGk+DQotPC91bD48L2NvbnRleHQ+DQotPHBvc3RyZXE+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyNTMwPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0dGFnLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0dGFnLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OGExYWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdHRhZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRWRpdGluZyBYTUwgZmlsZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhpcyBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGVkaXRpbmcgWE1MIGZpbGVzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZWRpdGluZyBYTUwgZmlsZXMuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgWE1MIGZpbGVzLCBlZGl0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgWE1MIGZpbGVzLCBlZGl0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0eGVkdHRhZyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVkaXRpbmcgWE1MIGZpbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0eGVkdHRhZyI+PGEgbmFtZT0idHhlZHR0YWciPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVkaXRpbmcgWE1MIGZpbGVzPC9oMT4KLQotCi0KLQotPGRpdj48cD5UaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZWRpdGluZyBYTUwgZmlsZXMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBvcGVuIGFuIFhNTCBmaWxlIGluIHRoZSBYTUwgZWRpdG9yLCByaWdodC1jbGljayBpdCBpbiB0aGUgTmF2aWdhdG9yCi12aWV3IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5PcGVuIFdpdGg8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MCi1FZGl0b3I8L3NwYW4+PC9zcGFuPi4gPC9wPgotPHA+V2UgcmVjb21tZW5kIHdvcmtpbmcgaW4gdGhlIFJlc291cmNlCi1wZXJzcGVjdGl2ZSB3aGVuIHlvdSBhcmUgZGV2ZWxvcGluZyBYTUwgZmlsZXMuIFRoZSB2aWV3cyB0aGF0IGFwcGVhciBieSBkZWZhdWx0Ci1pbiB0aGlzIHBlcnNwZWN0aXZlIChzdWNoIGFzIHRoZSBPdXRsaW5lIHZpZXcpIGhlbHAgZmFjaWxpdGF0ZSBYTUwgZGV2ZWxvcG1lbnQuPC9wPgotPHA+VGhlCi1YTUwgZWRpdG9yIGVuYWJsZXMgeW91IHRvIGRpcmVjdGx5IGVkaXQgWE1MIGZpbGVzLiBUaGVyZSBhcmUgc2V2ZXJhbCBkaWZmZXJlbnQKLXZpZXdzIHlvdSBjYW4gdXNlIHRvIGVkaXQgeW91ciBmaWxlczo8L3A+Ci08dWw+Ci08bGk+PHN0cm9uZz5Tb3VyY2Ugdmlldzwvc3Ryb25nPjogeW91IGNhbiBtYW51YWxseSBpbnNlcnQsIGVkaXQsIGFuZCBkZWxldGUgZWxlbWVudHMKLWFuZCBhdHRyaWJ1dGVzIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvci4gVG8gZmFjaWxpdGF0ZSB0aGlzIGVmZm9ydCwKLXlvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IHdoaWxlIHlvdSBhcmUgaW4gdGhlIFNvdXJjZSB2aWV3LjwvbGk+Ci0KLTxsaT48c3Ryb25nPkRlc2lnbiB2aWV3PC9zdHJvbmc+OiB5b3UgY2FuIGluc2VydCwgZGVsZXRlLCBhbmQgZWRpdCBlbGVtZW50cywgYXR0cmlidXRlcywKLWNvbW1lbnRzLCBhbmQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgaW4gdGhpcyB2aWV3LjwvbGk+Ci0KLTxsaT48c3Ryb25nPk91dGxpbmUgdmlldzwvc3Ryb25nPjogeW91IGNhbiBpbnNlcnQgYW5kIGRlbGV0ZSBlbGVtZW50cyBhdHRyaWJ1dGVzLCBjb21tZW50cywKLWFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBpbiB0aGlzIHZpZXcuPC9saT4KLQotPC91bD4KLTxwPk9mdGVuLCB5b3UgbWF5IGZpbmQgdGhhdCB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIHdheSB0byBwZXJmb3JtIGEgc3BlY2lmaWMKLXRhc2suIEZvciBleGFtcGxlLCB5b3UgaGF2ZSBhbiBYTUwgZmlsZSAiTXlTY2hvb2xTdWJqZWN0cy54bWwiIGFzc29jaWF0ZWQKLXdpdGggYW4gWE1MIHNjaGVtYSBmaWxlICJTY2hvb2xTdWJqZWN0cy54c2QiLCB3aGljaCBsaXN0IGFsbCB0aGUgc3ViamVjdHMKLXRhdWdodCBpbiBhIHNjaG9vbC4gWW91IHdhbnQgdG8gaW5zZXJ0IGEgbmV3IGVsZW1lbnQgIk1hdGgiIGludG8geW91ciBmaWxlLgotWW91IGNhbiBkbyBzbyBpbiB0aGUgZm9sbG93aW5nIHdheXM6PC9wPgotPHVsPgotPGxpPkluIHRoZSBPdXRsaW5lIG9yIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB0aGUgYXBwcm9wcmlhdGUgcGFyZW50IGVsZW1lbnQKLWFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQ2hpbGQ8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWF0aDwvc3Bhbj4KLTwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3IEVsZW1lbnQ8L3NwYW4+IGFuZCBlbnRlciB0aGUgbmFtZSBvZgotdGhlIGNoaWxkIGVsZW1lbnQuPC9saT4KLQotPGxpPkluIHRoZSBTb3VyY2UgdmlldywgdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGhlbHAgeW91IGZpbmQgdGhlIGFwcHJvcHJpYXRlCi1sb2NhdGlvbiBhbmQgY29kZSBmb3IgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1hdGg8L3NwYW4+IGVsZW1lbnQuPC9saT4KLQotPGxpPkluIHRoZSBTb3VyY2UgdmlldywgdHlwZSB0aGUgY29kZSBmb3IgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1hdGg8L3NwYW4+IGVsZW1lbnQKLWluIHRoZSBmaWxlLjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiIgLz4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiI+WE1MIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIGFuZCBhIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci4gQ29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywgd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGF0IHBhcnRpY3VsYXIgZWxlbWVudC4iPkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlIGNvZGUgZGlyZWN0bHkuIj5FZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4bWxjYXQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhtbGNhdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTU2NzNmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhtbGNhdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0eG1sY2F0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2c8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZzwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BbiBYTUwgQ2F0YWxvZyBlbnRyeSBjb250YWlucyB0d28gcGFydHMgLSBhIEtleSAod2hpY2ggcmVwcmVzZW50cw0KLWEgRFREIG9yIFhNTCBzY2hlbWEpIGFuZCBhIExvY2F0aW9uIChzaW1pbGFyIHRvIGEgVVJJLCB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbg0KLWFib3V0IGEgRFREIG9yIFhNTCBzY2hlbWEncyBsb2NhdGlvbikuIFlvdSBjYW4gcGxhY2UgdGhlIEtleSBpbiBhbiBYTUwgZmlsZS4NCi1XaGVuIHRoZSBYTUwgcHJvY2Vzc29yIGVuY291bnRlcnMgaXQsIGl0IHdpbGwgdXNlIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeSB0bw0KLWZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIEtleTwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBjYXRhbG9nPGluZGV4dGVybT5hZGRpbmcgZW50cmllczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+WE1MIENhdGFsb2cgZW50cmllcyBjYW4gYmUgdXNlZCBpbiB2YXJpb3VzIHNpdHVhdGlvbnMuIEZvciBleGFtcGxlLA0KLXlvdSBhcmUgd29ya2luZyBvbiBhbiBYTUwgZmlsZSBvbiB5b3VyIG1haW4gZGVza3RvcCBjb21wdXRlciBhbmQgcG9pbnQgaXRzIDxjb2RlcGg+c2NoZW1hTG9jYXRpb248L2NvZGVwaD4gdG93YXJkcw0KLWEgc2NoZW1hIGNhbGxlZCA8Y29kZXBoPmM6XE15U2NoZW1hLnhzZDwvY29kZXBoPi4gWW91IHRoZW4gc2F2ZSBpdCB0byB5b3VyDQotbGFwdG9wIGNvbXB1dGVyIHNvIHlvdSBjYW4gd29yayBvbiBpdCBsYXRlci4gV2hlbiB5b3Ugb3BlbiB0aGUgZmlsZSBvbiB5b3VyDQotbGFwdG9wLCBob3dldmVyLCB5b3UgZW5jb3VudGVyIGEgcHJvYmxlbSAtIHRoZSBYTUwgZWRpdG9yIGNhbm5vdCBmaW5kIHRoZSA8Y29kZXBoPk15U2NoZW1hLnhzZDwvY29kZXBoPiBzY2hlbWENCi1iZWNhdXNlIGl0IGlzIGFjdHVhbGx5IGluc3RhbGxlZCBvbiB5b3VyIEQgZHJpdmUuIFlvdSB3aWxsIGhhdmUgdG8gZWRpdCB0aGUgPGNvZGVwaD5zY2hlbWFMb2NhdGlvbjwvY29kZXBoPiB0bw0KLXBvaW50IHRvIDxjb2RlcGg+ZDpcTXlTY2hlbWEueHNkPC9jb2RlcGg+LiBXaGVuIHlvdSBoYXZlIGZpbmlzaGVkIGVkaXRpbmcNCi10aGUgWE1MIGZpbGUgYW5kIGFyZSByZWFkeSB0byBwdWJsaXNoIGl0IG9uIHRoZSBXZWIsIHlvdSB3aWxsIG5lZWQgdG8gZWRpdA0KLXRoZSBVUkkgYWdhaW4gc28gdGhhdCBpdCBwb2ludHMgdG8gYSByZXNvdXJjZSB0aGF0IGlzIGFjY2Vzc2libGUgb24gdGhlIFdlYi4NCi1CeSBub3csIHRoZSBwcm9ibGVtIGlzIG9idmlvdXMuIEEgVVJJIHVzZWQgd2l0aGluIGFuIFhNTCBmaWxlIGlzIG5vdCBhcyBwb3J0YWJsZQ0KLWFzIHlvdSB3b3VsZCBsaWtlIGl0IHRvIGJlLiBUbyBhdm9pZCBtYWtpbmcgZnJlcXVlbnQgY2hhbmdlcyB0byB5b3VyIFhNTCBkb2N1bWVudCwNCi15b3UgY2FuIHVzZSB0aGUgWE1MIENhdGFsb2cuPC9wPjxwPkFuIFhNTCBDYXRhbG9nIGVudHJ5IGlzIHVzZWQgYnkgYW4gWE1MDQotcHJvY2Vzc29yIHdoZW4gcmVzb2x2aW5nIGVudGl0eSByZWZlcmVuY2VzLiBZb3UgY2FuIHByb3ZpZGUgcnVsZXMgdG8gdGhlIGNhdGFsb2cNCi10byBzcGVjaWZ5IGhvdyBlbnRpdGllcyBzaG91bGQgYmUgcmVzb2x2ZWQuIElmIHlvdSBjb25zaWRlciB0aGUgcHJlY2VkaW5nDQotZXhhbXBsZSwgeW91IGNvdWxkIHNwZWNpZnkgYSBydWxlIHRoYXQgcmVkaXJlY3RzIGFuIEludGVybmV0IHJlc291cmNlIHJlZmVyZW5jZQ0KLShmb3IgZXhhbXBsZSwgIDxjb2RlcGg+Imh0dHA6Ly93d3cuaWJtLmNvbS9wdWJsaXNoZWQtc2NoZW1hcy9NeVNjaGVtYS54c2QiPC9jb2RlcGg+KQ0KLXNvIHRoYXQgaXQgcG9pbnRzIHRvIGEgcmVzb3VyY2Ugb24gdGhlIGRldmVsb3BlcidzIGxvY2FsIG1hY2hpbmUgKGZvciBleGFtcGxlLA0KLSA8Y29kZXBoPiJmaWxlOi8vL0M6L015U2NoZW1hLnhzZCI8L2NvZGVwaD4pLiBOb3csIGluc3RlYWQgb2YgZnJlcXVlbnRseSBlZGl0aW5nDQotWE1MIGRvY3VtZW50cyB0byB1cGRhdGUgdGhlIFVSSXMgb3IgbG9jYXRpb25zIChlc3BlY2lhbGx5IHdoZW4gdGhlcmUgYXJlIG1hbnkNCi1kb2N1bWVudHMgaW4geW91ciBwcm9qZWN0KSwgeW91IG9ubHkgbmVlZCB0byB1cGRhdGUgYSBzaW5nbGUgcnVsZSBpbiB5b3VyDQotWE1MIENhdGFsb2cuPC9wPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlDQotcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5Ubw0KLWFkZCBhbiBlbnRyeSB0byB0aGUgWE1MIENhdGFsb2csIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4gdGhlIFhNTCBmaWxlIHRoYXQgeW91IHdhbnQgdG8gYXNzb2NpYXRlIHdpdGggYSBEVEQgb3IgWE1MDQotc2NoZW1hLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrICA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5YTUw8L3VpY29udHJvbD48dWljb250cm9sPlhNTA0KLUNhdGFsb2c8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48aW5mbz5UaGUgIDx1aWNvbnRyb2w+WE1MIENhdGFsb2cNCi1FbnRyaWVzPC91aWNvbnRyb2w+IHNlY3Rpb24gY29udGFpbnMgYSBsaXN0IG9mIGFueSB1c2VyLWRlZmluZWQgYW5kIHBsdWctaW4NCi1kZWZpbmVkIGNhdGFsb2cgZW50cmllcy4gU2VsZWN0IGFueSBlbnRyeSB0byBzZWUgaW5mb3JtYXRpb24gYWJvdXQgaXQgaW4gdGhlIDx1aWNvbnRyb2w+RGV0YWlsczwvdWljb250cm9sPiBzZWN0aW9uLjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkFkZDwvdWljb250cm9sPiB0byBjcmVhdGUgYSBuZXcgY2F0YWxvZyBlbnRyeS48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5Mb2NhdGlvbjwvdWljb250cm9sPiBmaWVsZCwgZW50ZXIgb3IgYnJvd3NlIGZvcg0KLXRoZSBsb2NhdGlvbiBvciBVUkkgb2YgdGhlIERURCBvciBYTUwgc2NoZW1hIGZpbGUuIFRoaXMgdXNlcyB5b3VyIGNvbXB1dGVyJ3MNCi1wYXRoIHN0eWxlIHRvIGRlc2NyaWJlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgYSBrZXkgdHlwZSBmb3IgdGhlIGNhdGFsb2cgZW50cnkgZnJvbSB0aGUgPHVpY29udHJvbD5LZXkNCi1UeXBlPC91aWNvbnRyb2w+IGRyb3AgZG93bi48L2NtZD48aW5mbz5UaGUgdmFsdWVzIGluIHRoaXMgbGlzdCB3aWxsIGNoYW5nZQ0KLWRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBmaWxlIHlvdSBzcGVjaWZpZWQgaW4gdGhlIDx1aWNvbnRyb2w+TG9jYXRpb248L3VpY29udHJvbD4gZmllbGQ6PHVsPg0KLTxsaT5JZiB5b3Ugc3BlY2lmaWVkIGEgRFREOiBzZWxlY3QgPHVpY29udHJvbD5QdWJsaWMgSUQ8L3VpY29udHJvbD4sIDx1aWNvbnRyb2w+U3lzdGVtDQotSUQ8L3VpY29udHJvbD4sIG9yIDx1aWNvbnRyb2w+VVJJPC91aWNvbnRyb2w+IGZyb20gdGhlIDx1aWNvbnRyb2w+S2V5IFR5cGU8L3VpY29udHJvbD4gZmllbGQuDQotSWYgeW91IHNlbGVjdCA8dWljb250cm9sPlB1YmxpYyBJRCw8L3VpY29udHJvbD4gdGhlIHZhbHVlIHlvdSBlbnRlciBpbiB0aGUgPHVpY29udHJvbD5LZXk8L3VpY29udHJvbD4gZmllbGQNCi1zaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIFB1YmxpYyBJRCBpbiB0aGUgWE1MIGZpbGUncyBET0NUWVBFIGRlY2xhcmF0aW9uLg0KLUlmIHlvdSBzZWxlY3QgPHVpY29udHJvbD5TeXN0ZW0gSUQ8L3VpY29udHJvbD4sIHRoZSB2YWx1ZSB5b3UgZW50ZXIgc2hvdWxkDQotY29ycmVzcG9uZCB0byB0aGUgU3lzdGVtIElEIGluIGFuIFhNTCBmaWxlJ3MgRE9DVFlQRSBkZWNsYXJhdGlvbi4gSWYgeW91IHNlbGVjdCA8dWljb250cm9sPlVSSTwvdWljb250cm9sPiwNCi10aGUgdmFsdWUgeW91IGVudGVyIG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgVVJJLjwvbGk+DQotPGxpPklmIHlvdSBzcGVjaWZpZWQgYW4gWE1MIHNjaGVtYTogc2VsZWN0IGVpdGhlciA8dWljb250cm9sPk5hbWVzcGFjZSBOYW1lPC91aWNvbnRyb2w+IG9yDQotIDx1aWNvbnRyb2w+U2NoZW1hIExvY2F0aW9uPC91aWNvbnRyb2w+IGZyb20gdGhlIDx1aWNvbnRyb2w+S2V5IFR5cGU8L3VpY29udHJvbD4gZmllbGQuDQotSWYgdGhlIHNjaGVtYSBkZWZpbmVzIGEgdGFyZ2V0IG5hbWVzcGFjZSwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGFwcGVhciBpbg0KLXRoZSA8dWljb250cm9sPktleTwvdWljb250cm9sPiBmaWVsZC4gT3RoZXJ3aXNlLCB5b3UgY2FuIGVudGVyIHRoZSBzY2hlbWENCi1sb2NhdGlvbiBpbiB0aGUgPHVpY29udHJvbD5LZXk8L3VpY29udHJvbD4gZmllbGQuPC9saT4NCi08L3VsPjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIDx1aWNvbnRyb2w+U3BlY2lmeSBhbHRlcm5hdGl2ZSBXZWIgYWRkcmVzczwvdWljb250cm9sPiBjaGVjaw0KLWJveCBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHNwZWNpZnkgYW4gYWx0ZXJuYXRlIFdlYiBhZGRyZXNzIGZvciB0aGUgcmVzb3VyY2UuPC9jbWQ+DQotPGluZm8+VGhpcyBXZWIgYWRkcmVzcyBpcyB1c2VkIHdoZW4gYW4gWE1MIGluc3RhbmNlIGlzIGdlbmVyYXRlZCBmcm9tIHRoaXMNCi1jYXRhbG9nIGVudHJ5Ljxub3RlPlRoaXMgb3B0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIGlmIHlvdSBzZWxlY3QgPHVpY29udHJvbD5QdWJsaWMNCi1JRDwvdWljb250cm9sPiAoZm9yIGEgRFREKSBvciAgPHVpY29udHJvbD5OYW1lc3BhY2UgTmFtZTwvdWljb250cm9sPiAoZm9yDQotYSBzY2hlbWEpIGluIHRoZSAgPHVpY29udHJvbD5LZXkgdHlwZTwvdWljb250cm9sPiBmaWVsZC48L25vdGU+PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSB3YW50IHRvIHJlZmVyIHRvIGFub3RoZXIgY2F0YWxvZyB3aXRob3V0IGltcG9ydGluZyBpdCBpbnRvDQotdGhlIHdvcmtiZW5jaCwgY2xpY2sgPHVpY29udHJvbD5OZXh0IENhdGFsb2c8L3VpY29udHJvbD4uIFR5cGUgb3IgYnJvd3NlIGZvcg0KLXRoZSBYTUwgY2F0YWxvZyB5b3Ugd2FudCB0byByZWZlciB0by4gPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+V2hlbiB5b3UgYXJlIGRvbmUgY3JlYXRpbmcgY2F0YWxvZyBlbnRyaWVzLCBjbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvDQotY2xvc2UgdGhlIEFkZCBYTUwgQ2F0YWxvZyBFbnRyeSBkaWFsb2cuIENsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4gYWdhaW4NCi10byBzYXZlIHlvdXIgc2V0dGluZ3MuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+TWFrZSBzdXJlIHRoZSBYTUwgZmlsZSBpcyBpbiBmb2N1cyBhbmQgY2xpY2sgdGhlIDx1aWNvbnRyb2w+UmVsb2FkDQotZGVwZW5kZW5jaWVzPC91aWNvbnRyb2w+IHRvb2xiYXIgYnV0dG9uLiA8L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PlRoZSBYTUwgZmlsZSBpcyBub3cgYXNzb2NpYXRlZCB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgWE1MDQotc2NoZW1hIG9yIERURC48L3Jlc3VsdD4NCi08cG9zdHJlcT48cD5Zb3UgY2FuIGFsc28gZXhwb3J0IGFuZCBpbXBvcnQgWE1MIENhdGFsb2cgaW5mb3JtYXRpb246PD9QdWIgQ2FyZXQ/PiA8L3A+PHA+VG8NCi1leHBvcnQsIGNsaWNrIDx1aWNvbnRyb2w+RmlsZSA+IEV4cG9ydDwvdWljb250cm9sPiBhbmQgc2VsZWN0IDx1aWNvbnRyb2w+WE1MDQotPiBYTUwgQ2F0YWxvZzwvdWljb250cm9sPi4gWW91IHdpbGwgYmUgcHJvbXB0ZWQgdG8gc2VsZWN0IGEgcHJvamVjdCBhbmQgcHJvdmlkZQ0KLWEgZmlsZSBuYW1lIHRvIHN0b3JlIHlvdXIgY2F0YWxvZyBlbnRyaWVzIGluIGFuIC54bWxjYXRhbG9nIGZpbGUsIHdoaWNoIGNhbg0KLWJlIG9wZW5lZCBmcm9tIHRoZSBOYXZpZ2F0b3Igdmlldy4gU2luY2UgeW91ciBjYXRhbG9nIGVudHJpZXMgYXJlIHN0b3JlZCBpbg0KLWFuIC54bWxjYXRhbG9nIGZpbGUsIHlvdSBjYW4gY2hlY2sgdGhlbSBpbiBhbmQgb3V0IGFuZCBzaGFyZSB0aGVtIGxpa2UgYW55DQotb3RoZXIgcHJvamVjdCByZXNvdXJjZS48L3A+PHA+VG8gaW1wb3J0LCBjbGljayA8dWljb250cm9sPkZpbGUgPiBJbXBvcnQ8L3VpY29udHJvbD4gYW5kDQotc2VsZWN0IDx1aWNvbnRyb2w+WE1MID4gWE1MIENhdGFsb2c8L3VpY29udHJvbD4uIFRoZW4gc3BlY2lmeSB0aGUgZmlsZSB0aGF0DQotd2lsbCBiZSB1c2VkIHRvIGxvYWQgdGhlIFhNTCBDYXRhbG9nIHNldHRpbmdzLiBXaGVuIHlvdSBpbXBvcnQgYSAueG1sY2F0YWxvZw0KLWZpbGUsIGFueSBlbnRyaWVzIGluIGl0IHdpbGwgYmUgbG9hZGVkIGludG8gdGhlIFhNTCBDYXRhbG9nIChhbmQgYW55IGV4aXN0aW5nDQotZW50cmllcyB3aWxsIGJlIG92ZXJ3cml0dGVuKS4gPC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwNjg2OD8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eG1sY2F0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4bWxjYXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI1MDE1Yi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4bWxjYXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2ciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQW4gWE1MIENhdGFsb2cgZW50cnkgY29udGFpbnMgdHdvIHBhcnRzIC0gYSBLZXkgKHdoaWNoIHJlcHJlc2VudHMgYSBEVEQgb3IgWE1MIHNjaGVtYSkgYW5kIGEgTG9jYXRpb24gKHNpbWlsYXIgdG8gYSBVUkksIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgRFREIG9yIFhNTCBzY2hlbWEncyBsb2NhdGlvbikuIFlvdSBjYW4gcGxhY2UgdGhlIEtleSBpbiBhbiBYTUwgZmlsZS4gV2hlbiB0aGUgWE1MIHByb2Nlc3NvciBlbmNvdW50ZXJzIGl0LCBpdCB3aWxsIHVzZSB0aGUgWE1MIENhdGFsb2cgZW50cnkgdG8gZmluZCB0aGUgbG9jYXRpb24gb2YgdGhlIERURCBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCB0aGUgS2V5IiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkFuIFhNTCBDYXRhbG9nIGVudHJ5IGNvbnRhaW5zIHR3byBwYXJ0cyAtIGEgS2V5ICh3aGljaCByZXByZXNlbnRzIGEgRFREIG9yIFhNTCBzY2hlbWEpIGFuZCBhIExvY2F0aW9uIChzaW1pbGFyIHRvIGEgVVJJLCB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIERURCBvciBYTUwgc2NoZW1hJ3MgbG9jYXRpb24pLiBZb3UgY2FuIHBsYWNlIHRoZSBLZXkgaW4gYW4gWE1MIGZpbGUuIFdoZW4gdGhlIFhNTCBwcm9jZXNzb3IgZW5jb3VudGVycyBpdCwgaXQgd2lsbCB1c2UgdGhlIFhNTCBDYXRhbG9nIGVudHJ5IHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIEtleSIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBjYXRhbG9nLCBhZGRpbmcgZW50cmllcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBjYXRhbG9nLCBhZGRpbmcgZW50cmllcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGRvYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRjbnN0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0c2NoLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Z3JhbS5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR4bWxjYXQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2c8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR4bWxjYXQiPjxhIG5hbWU9InR4bWxjYXQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZzwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QW4gWE1MIENhdGFsb2cgZW50cnkgY29udGFpbnMgdHdvIHBhcnRzIC0gYSBLZXkgKHdoaWNoIHJlcHJlc2VudHMKLWEgRFREIG9yIFhNTCBzY2hlbWEpIGFuZCBhIExvY2F0aW9uIChzaW1pbGFyIHRvIGEgVVJJLCB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbgotYWJvdXQgYSBEVEQgb3IgWE1MIHNjaGVtYSdzIGxvY2F0aW9uKS4gWW91IGNhbiBwbGFjZSB0aGUgS2V5IGluIGFuIFhNTCBmaWxlLgotV2hlbiB0aGUgWE1MIHByb2Nlc3NvciBlbmNvdW50ZXJzIGl0LCBpdCB3aWxsIHVzZSB0aGUgWE1MIENhdGFsb2cgZW50cnkgdG8KLWZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIEtleTwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+WE1MIENhdGFsb2cgZW50cmllcyBjYW4gYmUgdXNlZCBpbiB2YXJpb3VzIHNpdHVhdGlvbnMuIEZvciBleGFtcGxlLAoteW91IGFyZSB3b3JraW5nIG9uIGFuIFhNTCBmaWxlIG9uIHlvdXIgbWFpbiBkZXNrdG9wIGNvbXB1dGVyIGFuZCBwb2ludCBpdHMgPHNhbXAgY2xhc3M9ImNvZGVwaCI+c2NoZW1hTG9jYXRpb248L3NhbXA+IHRvd2FyZHMKLWEgc2NoZW1hIGNhbGxlZCA8c2FtcCBjbGFzcz0iY29kZXBoIj5jOlxNeVNjaGVtYS54c2Q8L3NhbXA+LiBZb3UgdGhlbiBzYXZlIGl0IHRvIHlvdXIKLWxhcHRvcCBjb21wdXRlciBzbyB5b3UgY2FuIHdvcmsgb24gaXQgbGF0ZXIuIFdoZW4geW91IG9wZW4gdGhlIGZpbGUgb24geW91cgotbGFwdG9wLCBob3dldmVyLCB5b3UgZW5jb3VudGVyIGEgcHJvYmxlbSAtIHRoZSBYTUwgZWRpdG9yIGNhbm5vdCBmaW5kIHRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5NeVNjaGVtYS54c2Q8L3NhbXA+IHNjaGVtYQotYmVjYXVzZSBpdCBpcyBhY3R1YWxseSBpbnN0YWxsZWQgb24geW91ciBEIGRyaXZlLiBZb3Ugd2lsbCBoYXZlIHRvIGVkaXQgdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPnNjaGVtYUxvY2F0aW9uPC9zYW1wPiB0bwotcG9pbnQgdG8gPHNhbXAgY2xhc3M9ImNvZGVwaCI+ZDpcTXlTY2hlbWEueHNkPC9zYW1wPi4gV2hlbiB5b3UgaGF2ZSBmaW5pc2hlZCBlZGl0aW5nCi10aGUgWE1MIGZpbGUgYW5kIGFyZSByZWFkeSB0byBwdWJsaXNoIGl0IG9uIHRoZSBXZWIsIHlvdSB3aWxsIG5lZWQgdG8gZWRpdAotdGhlIFVSSSBhZ2FpbiBzbyB0aGF0IGl0IHBvaW50cyB0byBhIHJlc291cmNlIHRoYXQgaXMgYWNjZXNzaWJsZSBvbiB0aGUgV2ViLgotQnkgbm93LCB0aGUgcHJvYmxlbSBpcyBvYnZpb3VzLiBBIFVSSSB1c2VkIHdpdGhpbiBhbiBYTUwgZmlsZSBpcyBub3QgYXMgcG9ydGFibGUKLWFzIHlvdSB3b3VsZCBsaWtlIGl0IHRvIGJlLiBUbyBhdm9pZCBtYWtpbmcgZnJlcXVlbnQgY2hhbmdlcyB0byB5b3VyIFhNTCBkb2N1bWVudCwKLXlvdSBjYW4gdXNlIHRoZSBYTUwgQ2F0YWxvZy48L3A+Ci08cD5BbiBYTUwgQ2F0YWxvZyBlbnRyeSBpcyB1c2VkIGJ5IGFuIFhNTAotcHJvY2Vzc29yIHdoZW4gcmVzb2x2aW5nIGVudGl0eSByZWZlcmVuY2VzLiBZb3UgY2FuIHByb3ZpZGUgcnVsZXMgdG8gdGhlIGNhdGFsb2cKLXRvIHNwZWNpZnkgaG93IGVudGl0aWVzIHNob3VsZCBiZSByZXNvbHZlZC4gSWYgeW91IGNvbnNpZGVyIHRoZSBwcmVjZWRpbmcKLWV4YW1wbGUsIHlvdSBjb3VsZCBzcGVjaWZ5IGEgcnVsZSB0aGF0IHJlZGlyZWN0cyBhbiBJbnRlcm5ldCByZXNvdXJjZSByZWZlcmVuY2UKLShmb3IgZXhhbXBsZSwgIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiJodHRwOi8vd3d3LmlibS5jb20vcHVibGlzaGVkLXNjaGVtYXMvTXlTY2hlbWEueHNkIjwvc2FtcD4pCi1zbyB0aGF0IGl0IHBvaW50cyB0byBhIHJlc291cmNlIG9uIHRoZSBkZXZlbG9wZXIncyBsb2NhbCBtYWNoaW5lIChmb3IgZXhhbXBsZSwKLSA8c2FtcCBjbGFzcz0iY29kZXBoIj4iZmlsZTovLy9DOi9NeVNjaGVtYS54c2QiPC9zYW1wPikuIE5vdywgaW5zdGVhZCBvZiBmcmVxdWVudGx5IGVkaXRpbmcKLVhNTCBkb2N1bWVudHMgdG8gdXBkYXRlIHRoZSBVUklzIG9yIGxvY2F0aW9ucyAoZXNwZWNpYWxseSB3aGVuIHRoZXJlIGFyZSBtYW55Ci1kb2N1bWVudHMgaW4geW91ciBwcm9qZWN0KSwgeW91IG9ubHkgbmVlZCB0byB1cGRhdGUgYSBzaW5nbGUgcnVsZSBpbiB5b3VyCi1YTUwgQ2F0YWxvZy48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZQotcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvCi1hZGQgYW4gZW50cnkgdG8gdGhlIFhNTCBDYXRhbG9nLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB0aGUgWE1MIGZpbGUgdGhhdCB5b3Ugd2FudCB0byBhc3NvY2lhdGUgd2l0aCBhIERURCBvciBYTUwKLXNjaGVtYS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayAgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ci08L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MCi1DYXRhbG9nPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPiBUaGUgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBDYXRhbG9nCi1FbnRyaWVzPC9zcGFuPiBzZWN0aW9uIGNvbnRhaW5zIGEgbGlzdCBvZiBhbnkgdXNlci1kZWZpbmVkIGFuZCBwbHVnLWluCi1kZWZpbmVkIGNhdGFsb2cgZW50cmllcy4gU2VsZWN0IGFueSBlbnRyeSB0byBzZWUgaW5mb3JtYXRpb24gYWJvdXQgaXQgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRldGFpbHM8L3NwYW4+IHNlY3Rpb24uCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZDwvc3Bhbj4gdG8gY3JlYXRlIGEgbmV3IGNhdGFsb2cgZW50cnkuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TG9jYXRpb248L3NwYW4+IGZpZWxkLCBlbnRlciBvciBicm93c2UgZm9yCi10aGUgbG9jYXRpb24gb3IgVVJJIG9mIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLiBUaGlzIHVzZXMgeW91ciBjb21wdXRlcidzCi1wYXRoIHN0eWxlIHRvIGRlc2NyaWJlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgYSBrZXkgdHlwZSBmb3IgdGhlIGNhdGFsb2cgZW50cnkgZnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5Ci1UeXBlPC9zcGFuPiBkcm9wIGRvd24uPC9zcGFuPiBUaGUgdmFsdWVzIGluIHRoaXMgbGlzdCB3aWxsIGNoYW5nZQotZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGZpbGUgeW91IHNwZWNpZmllZCBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TG9jYXRpb248L3NwYW4+IGZpZWxkOjx1bD4KLTxsaT5JZiB5b3Ugc3BlY2lmaWVkIGEgRFREOiBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHVibGljIElEPC9zcGFuPiwgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3lzdGVtCi1JRDwvc3Bhbj4sIG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVSSTwvc3Bhbj4gZnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5IFR5cGU8L3NwYW4+IGZpZWxkLgotSWYgeW91IHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QdWJsaWMgSUQsPC9zcGFuPiB0aGUgdmFsdWUgeW91IGVudGVyIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5LZXk8L3NwYW4+IGZpZWxkCi1zaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIFB1YmxpYyBJRCBpbiB0aGUgWE1MIGZpbGUncyBET0NUWVBFIGRlY2xhcmF0aW9uLgotSWYgeW91IHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TeXN0ZW0gSUQ8L3NwYW4+LCB0aGUgdmFsdWUgeW91IGVudGVyIHNob3VsZAotY29ycmVzcG9uZCB0byB0aGUgU3lzdGVtIElEIGluIGFuIFhNTCBmaWxlJ3MgRE9DVFlQRSBkZWNsYXJhdGlvbi4gSWYgeW91IHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5VUkk8L3NwYW4+LAotdGhlIHZhbHVlIHlvdSBlbnRlciBtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIFVSSS48L2xpPgotCi08bGk+SWYgeW91IHNwZWNpZmllZCBhbiBYTUwgc2NoZW1hOiBzZWxlY3QgZWl0aGVyIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWVzcGFjZSBOYW1lPC9zcGFuPiBvcgotIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNjaGVtYSBMb2NhdGlvbjwvc3Bhbj4gZnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5IFR5cGU8L3NwYW4+IGZpZWxkLgotSWYgdGhlIHNjaGVtYSBkZWZpbmVzIGEgdGFyZ2V0IG5hbWVzcGFjZSwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGFwcGVhciBpbgotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktleTwvc3Bhbj4gZmllbGQuIE90aGVyd2lzZSwgeW91IGNhbiBlbnRlciB0aGUgc2NoZW1hCi1sb2NhdGlvbiBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5PC9zcGFuPiBmaWVsZC48L2xpPgotCi08L3VsPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNwZWNpZnkgYWx0ZXJuYXRpdmUgV2ViIGFkZHJlc3M8L3NwYW4+IGNoZWNrCi1ib3ggaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5IGFuIGFsdGVybmF0ZSBXZWIgYWRkcmVzcyBmb3IgdGhlIHJlc291cmNlLjwvc3Bhbj4KLSBUaGlzIFdlYiBhZGRyZXNzIGlzIHVzZWQgd2hlbiBhbiBYTUwgaW5zdGFuY2UgaXMgZ2VuZXJhdGVkIGZyb20gdGhpcwotY2F0YWxvZyBlbnRyeS48ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVGhpcyBvcHRpb24gaXMgb25seSBhdmFpbGFibGUgaWYgeW91IHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QdWJsaWMKLUlEPC9zcGFuPiAoZm9yIGEgRFREKSBvciAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZXNwYWNlIE5hbWU8L3NwYW4+IChmb3IKLWEgc2NoZW1hKSBpbiB0aGUgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktleSB0eXBlPC9zcGFuPiBmaWVsZC48L2Rpdj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHdhbnQgdG8gcmVmZXIgdG8gYW5vdGhlciBjYXRhbG9nIHdpdGhvdXQgaW1wb3J0aW5nIGl0IGludG8KLXRoZSB3b3JrYmVuY2gsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQgQ2F0YWxvZzwvc3Bhbj4uIFR5cGUgb3IgYnJvd3NlIGZvcgotdGhlIFhNTCBjYXRhbG9nIHlvdSB3YW50IHRvIHJlZmVyIHRvLiA8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5XaGVuIHlvdSBhcmUgZG9uZSBjcmVhdGluZyBjYXRhbG9nIGVudHJpZXMsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0bwotY2xvc2UgdGhlIEFkZCBYTUwgQ2F0YWxvZyBFbnRyeSBkaWFsb2cuIENsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiBhZ2FpbgotdG8gc2F2ZSB5b3VyIHNldHRpbmdzLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk1ha2Ugc3VyZSB0aGUgWE1MIGZpbGUgaXMgaW4gZm9jdXMgYW5kIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZWxvYWQKLWRlcGVuZGVuY2llczwvc3Bhbj4gdG9vbGJhciBidXR0b24uIDwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UaGUgWE1MIGZpbGUgaXMgbm93IGFzc29jaWF0ZWQgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIFhNTAotc2NoZW1hIG9yIERURC48L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+WW91IGNhbiBhbHNvIGV4cG9ydCBhbmQgaW1wb3J0IFhNTCBDYXRhbG9nIGluZm9ybWF0aW9uOiA8L3A+Ci08cD5UbwotZXhwb3J0LCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlICZndDsgRXhwb3J0PC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotJmd0OyBYTUwgQ2F0YWxvZzwvc3Bhbj4uIFlvdSB3aWxsIGJlIHByb21wdGVkIHRvIHNlbGVjdCBhIHByb2plY3QgYW5kIHByb3ZpZGUKLWEgZmlsZSBuYW1lIHRvIHN0b3JlIHlvdXIgY2F0YWxvZyBlbnRyaWVzIGluIGFuIC54bWxjYXRhbG9nIGZpbGUsIHdoaWNoIGNhbgotYmUgb3BlbmVkIGZyb20gdGhlIE5hdmlnYXRvciB2aWV3LiBTaW5jZSB5b3VyIGNhdGFsb2cgZW50cmllcyBhcmUgc3RvcmVkIGluCi1hbiAueG1sY2F0YWxvZyBmaWxlLCB5b3UgY2FuIGNoZWNrIHRoZW0gaW4gYW5kIG91dCBhbmQgc2hhcmUgdGhlbSBsaWtlIGFueQotb3RoZXIgcHJvamVjdCByZXNvdXJjZS48L3A+Ci08cD5UbyBpbXBvcnQsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGUgJmd0OyBJbXBvcnQ8L3NwYW4+IGFuZAotc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCAmZ3Q7IFhNTCBDYXRhbG9nPC9zcGFuPi4gVGhlbiBzcGVjaWZ5IHRoZSBmaWxlIHRoYXQKLXdpbGwgYmUgdXNlZCB0byBsb2FkIHRoZSBYTUwgQ2F0YWxvZyBzZXR0aW5ncy4gV2hlbiB5b3UgaW1wb3J0IGEgLnhtbGNhdGFsb2cKLWZpbGUsIGFueSBlbnRyaWVzIGluIGl0IHdpbGwgYmUgbG9hZGVkIGludG8gdGhlIFhNTCBDYXRhbG9nIChhbmQgYW55IGV4aXN0aW5nCi1lbnRyaWVzIHdpbGwgYmUgb3ZlcndyaXR0ZW4pLiA8L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiB0aXRsZT0iV2hlbiBhbiBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgaXQgaXMgYm91bmQgYnkgYW55IHN0cnVjdHVyYWwgcnVsZXMgY29udGFpbmVkIGluIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS4gVG8gYmUgY29uc2lkZXJlZCBhIHZhbGlkIFhNTCBmaWxlLCBhIGRvY3VtZW50IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURCBvciB0aGUgWE1MIHNjaGVtYS4iPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiB0aXRsZT0iSW4gdGhlIERlc2lnbiB2aWV3LCB3aGVuIHlvdSBlZGl0IGFuIFhNTCBmaWxlIHRoYXQgaGFzIGEgc2V0IG9mIGNvbnN0cmFpbnRzIG9yIHJ1bGVzIGRlZmluZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiB0dXJuIHRoZSBjb25zdHJhaW50cyBvbiBhbmQgb2ZmIHRvIHByb3ZpZGUgZmxleGliaWxpdHkgaW4gdGhlIHdheSB5b3UgZWRpdCwgYnV0IHN0aWxsIG1haW50YWluIHRoZSB2YWxpZGl0eSBvZiB0aGUgZG9jdW1lbnQgcGVyaW9kaWNhbGx5LiI+RWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGRvYy5odG1sIiB0aXRsZT0iVGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4gYW4gWE1MIGZpbGUgaXMgdXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0IHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgRFREIGZpbGUuIFlvdSBjYW4gZWRpdCB5b3VyIERPQ1RZUEUgZGVjbGFyYXRpb24gdG8gY2hhbmdlIHRoZSBEVEQgZmlsZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4iPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0Z3JhbS5odG1sIiB0aXRsZT0iSWYgeW91IG1ha2UgY2hhbmdlcyB0byBhIERURCBmaWxlIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBmaWxlICh0aGF0IGlzIGN1cnJlbnRseSBvcGVuKSwgY2xpY2sgWE1MICZndDsgUmVsb2FkIERlcGVuZGVuY2llcyB0byB1cGRhdGUgdGhlIFhNTCBmaWxlIHdpdGggdGhlc2UgY2hhbmdlcy4gVGhlIGNoYW5nZXMgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIGd1aWRlZCBlZGl0aW5nIG1lY2hhbmlzbXMgYXZhaWxhYmxlIGluIHRoZSBlZGl0b3IsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QuIj5VcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRzY2guaHRtbCIgdGl0bGU9IllvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSB2YXJpb3VzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBYTUwgZmlsZSwgc3VjaCBhcyB0aGUgWE1MIHNjaGVtYSBhbmQgbmFtZXNwYWNlIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gSWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdGhlIHNjaGVtYSBhbmQgbmFtZXNwYWNlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIG9yIGFkZCBhIG5ldyBhc3NvY2lhdGlvbi4gTW9kaWZ5aW5nIGFueSBhc3NvY2lhdGlvbnMgY2FuIGltcGFjdCB3aGF0IGNvbnRlbnQgaXMgYWxsb3dlZCBpbiB0aGUgWE1MIGZpbGUuIj5FZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4cHJlZnMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhwcmVmcy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWQ5ZmZkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhwcmVmcy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0eHByZWZzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5EZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5EZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gc2V0IHZhcmlvdXMgcHJlZmVyZW5jZXMgZm9yIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MDQotZWRpdG9yIHN1Y2ggYXMgdGhlIGZvcm1hdHRlciBpbmRlbnRhdGlvbiBzdHlsZSwgbGluZSB3cmFwcGluZyBydWxlcywgYW5kIGNvbnRlbnQNCi1hc3Npc3QgcnVsZXMuIFRvIGFwcGx5IHRoZSBmb3JtYXR0aW5nIHN0eWxlcywgcmlnaHQtY2xpY2sgaW4gdGhlIFNvdXJjZSB2aWV3DQotZm9yIHlvdXIgWE1MIGRvY3VtZW50LCBhbmQgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+Rm9ybWF0PC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5Eb2N1bWVudDwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPnByZWZlcmVuY2VzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5wcmVmZXJlbmNlczxpbmRleHRlcm0+WE1MIGVkaXRvcjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VG8gZGVmaW5lIFhNTCBwcmVmZXJlbmNlcywgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNsaWNrICA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5YTUw8L3VpY29udHJvbD48dWljb250cm9sPlhNTA0KLUZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5FZGl0b3I8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5FbnRlciBhIG1heGltdW0gd2lkdGggZm9yIGZvcm1hdHRlZCBsaW5lcyBpbiB0aGUgPHVpY29udHJvbD5MaW5lDQotd2lkdGg8L3VpY29udHJvbD4gZmllbGQ8L2NtZD48aW5mbz5UaGUgZGVmYXVsdCB2YWx1ZSBpcyA3Mi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IDx1aWNvbnRyb2w+U3BsaXQgbXVsdGlwbGUgYXR0cmlidXRlcyBlYWNoIG9uIGEgbmV3IGxpbmU8L3VpY29udHJvbD4gdG8NCi1zdGFydCBldmVyeSBhdHRyaWJ1dGUgb24gYSBuZXcgbGluZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgPHVpY29udHJvbD5QcmVzZXJ2ZSB3aGl0ZXNwYWNlIGluIHRhZ3Mgd2l0aCBQQ0RBVEEgY29udGVudDwvdWljb250cm9sPiB0bw0KLXByZXZlbnQgdGhlIGVkaXRvciBmcm9tIGRlbGV0aW5nIHdoaXRlc3BhY2UgaW4gZWxlbWVudHMgdGhhdCBjb250YWluIHBhcnNlZA0KLWNoYXJhY3RlciBkYXRhLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSB3YW50IGJsYW5rIGxpbmVzIHRvIGJlIHJlbW92ZWQgd2hlbiB0aGUgZG9jdW1lbnQgaXMgZm9ybWF0dGVkLA0KLXNlbGVjdCB0aGUgPHVpY29udHJvbD5DbGVhciBhbGwgYmxhbmsgbGluZXM8L3VpY29udHJvbD4gY2hlY2sgYm94LiA8L2NtZD4NCi08aW5mbz5CeSBkZWZhdWx0LCBibGFuayBsaW5lcyBhcmUgcHJlc2VydmVkIGluIGEgZm9ybWF0dGVkIGRvY3VtZW50LjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgPHVpY29udHJvbD5JbmRlbnQgdXNpbmcgdGFiczwvdWljb250cm9sPiBpZiB5b3Ugd2FudCB0bw0KLXVzZSB0YWIgY2hhcmFjdGVycyAoXHQpIGFzIHRoZSBzdGFuZGFyZCBmb3JtYXR0aW5nIGluZGVudGF0aW9uLCBvciwgaWYgeW91DQotcHJlZmVyIHRvIHVzZSBzcGFjZXMsIHNlbGVjdCA8dWljb250cm9sPkluZGVudCB1c2luZyBzcGFjZXM8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+WW91IGNhbiBhbHNvIHNwZWNpZnkgdGhlIDx1aWNvbnRyb2w+SW5kZW50YXRpb24gc2l6ZTwvdWljb250cm9sPiB3aGljaA0KLWlzIHRoZSBudW1iZXIgb2YgdGFicyBvciBzcGFjZSBjaGFyYWN0ZXJzIHVzZWQgZm9yIGZvcm1hdHRpbmcgaW5kZW50YXRpb24uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+WW91IGNhbiBzcGVjaWZ5IGNlcnRhaW4gY2hhcmFjdGVycyAodGhlIGRlZmF1bHQgY29tbWFuZDw/UHViIENhcmV0Pz4NCi1pcyAmbHQ7PSkgdGhhdCB3aWxsIGNhdXNlIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0IHRvIHBvcCB1cCBhdXRvbWF0aWNhbGx5Lg0KLUVuc3VyZSB0aGUgPHVpY29udHJvbD5BdXRvbWF0aWNhbGx5IG1ha2Ugc3VnZ2VzdGlvbnM8L3VpY29udHJvbD4gY2hlY2sgYm94DQotaXMgc2VsZWN0ZWQgYW5kIHNwZWNpZnkgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIDx1aWNvbnRyb2w+UHJvbXB0IHdoZW4gdGhlc2UNCi1jaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZDwvdWljb250cm9sPiBmaWVsZC4gPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHNlbGVjdCA8Yj5TdHJpY3Q8L2I+IGZyb20gdGhlIDxiPlN1Z2dlc3Rpb24gc3RyYXRlZ3k8L2I+IGxpc3QsDQotc3VnZ2VzdGlvbnMgdGhhdCBhcmUgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsIGJlIHNob3duIGZpcnN0ICh3aXRoIGJvbGQgaWNvbnMpDQotaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QuIE90aGVyIHN1Z2dlc3Rpb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGVsZW1lbnQNCi1zY29wZSwgYnV0IG5vdCBncmFtbWF0aWNhbGx5IHZhbGlkLCB3aWxsIGJlIHNob3duIGJlbG93IHRoZW0gd2l0aCBhIGRlLWVtcGhhc2l6ZWQNCi1pY29uLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcyA8Yj5TdHJpY3Q8L2I+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSA8dWljb250cm9sPlVzZSBpbmZlcnJlZCBncmFtbWFyIGluIGFic2VuY2Ugb2YgRFREL1NjaGVtYTwvdWljb250cm9sPiBjaGVjaw0KLWJveCBpcyBzZWxlY3RlZCBieSBkZWZhdWx0LiA8L2NtZD48aW5mbz5JZiB0aGlzIGJveCBpcyBzZWxlY3RlZCwgd2hlbiB5b3UNCi1oYXZlIGFuIFhNTCBmaWxlIHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCB5b3Ugd2lsbA0KLXN0aWxsIGJlIGFibGUgdG8gZ2V0IGNvbnRlbnQgYXNzaXN0IC0gdGhlIHRvb2wgd2lsbCBpbmZlciB3aGF0IHNob3VsZCBjb21lDQotbmV4dCBpbiB5b3VyIGZpbGUgYmFzZWQgb24gdGhlIGV4aXN0aW5nIGNvbnRlbnQuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+QXBwbHk8L3VpY29udHJvbD4gYW5kIHRoZW4gPHVpY29udHJvbD5PSzwvdWljb250cm9sPiB0bw0KLXNhdmUgeW91ciBjaGFuZ2VzLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAzNjU5Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4cHJlZnMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhwcmVmcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjZlYWFhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhwcmVmcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDgiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRGVmaW5pbmcgWE1MIGVkaXRvciBwcmVmZXJlbmNlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIHNldCB2YXJpb3VzIHByZWZlcmVuY2VzIGZvciB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3Igc3VjaCBhcyB0aGUgZm9ybWF0dGVyIGluZGVudGF0aW9uIHN0eWxlLCBsaW5lIHdyYXBwaW5nIHJ1bGVzLCBhbmQgY29udGVudCBhc3Npc3QgcnVsZXMuIFRvIGFwcGx5IHRoZSBmb3JtYXR0aW5nIHN0eWxlcywgcmlnaHQtY2xpY2sgaW4gdGhlIFNvdXJjZSB2aWV3IGZvciB5b3VyIFhNTCBkb2N1bWVudCwgYW5kIGNsaWNrIEZvcm1hdCAmZ3Q7IERvY3VtZW50LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJZb3UgY2FuIHNldCB2YXJpb3VzIHByZWZlcmVuY2VzIGZvciB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3Igc3VjaCBhcyB0aGUgZm9ybWF0dGVyIGluZGVudGF0aW9uIHN0eWxlLCBsaW5lIHdyYXBwaW5nIHJ1bGVzLCBhbmQgY29udGVudCBhc3Npc3QgcnVsZXMuIFRvIGFwcGx5IHRoZSBmb3JtYXR0aW5nIHN0eWxlcywgcmlnaHQtY2xpY2sgaW4gdGhlIFNvdXJjZSB2aWV3IGZvciB5b3VyIFhNTCBkb2N1bWVudCwgYW5kIGNsaWNrIEZvcm1hdCAmZ3Q7IERvY3VtZW50LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIHByZWZlcmVuY2VzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgcHJlZmVyZW5jZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR4cHJlZnMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5EZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0eHByZWZzIj48YSBuYW1lPSJ0eHByZWZzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5EZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzPC9oMT4KLQotCi0KLQotPGRpdj48cD5Zb3UgY2FuIHNldCB2YXJpb3VzIHByZWZlcmVuY2VzIGZvciB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTAotZWRpdG9yIHN1Y2ggYXMgdGhlIGZvcm1hdHRlciBpbmRlbnRhdGlvbiBzdHlsZSwgbGluZSB3cmFwcGluZyBydWxlcywgYW5kIGNvbnRlbnQKLWFzc2lzdCBydWxlcy4gVG8gYXBwbHkgdGhlIGZvcm1hdHRpbmcgc3R5bGVzLCByaWdodC1jbGljayBpbiB0aGUgU291cmNlIHZpZXcKLWZvciB5b3VyIFhNTCBkb2N1bWVudCwgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+Rm9ybWF0PC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnQ8L3NwYW4+PC9zcGFuPi48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIGRlZmluZSBYTUwgcHJlZmVyZW5jZXMsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdG9yPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RW50ZXIgYSBtYXhpbXVtIHdpZHRoIGZvciBmb3JtYXR0ZWQgbGluZXMgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkxpbmUKLXdpZHRoPC9zcGFuPiBmaWVsZDwvc3Bhbj4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgNzIuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3BsaXQgbXVsdGlwbGUgYXR0cmlidXRlcyBlYWNoIG9uIGEgbmV3IGxpbmU8L3NwYW4+IHRvCi1zdGFydCBldmVyeSBhdHRyaWJ1dGUgb24gYSBuZXcgbGluZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlc2VydmUgd2hpdGVzcGFjZSBpbiB0YWdzIHdpdGggUENEQVRBIGNvbnRlbnQ8L3NwYW4+IHRvCi1wcmV2ZW50IHRoZSBlZGl0b3IgZnJvbSBkZWxldGluZyB3aGl0ZXNwYWNlIGluIGVsZW1lbnRzIHRoYXQgY29udGFpbiBwYXJzZWQKLWNoYXJhY3RlciBkYXRhLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSB3YW50IGJsYW5rIGxpbmVzIHRvIGJlIHJlbW92ZWQgd2hlbiB0aGUgZG9jdW1lbnQgaXMgZm9ybWF0dGVkLAotc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DbGVhciBhbGwgYmxhbmsgbGluZXM8L3NwYW4+IGNoZWNrIGJveC4gPC9zcGFuPgotIEJ5IGRlZmF1bHQsIGJsYW5rIGxpbmVzIGFyZSBwcmVzZXJ2ZWQgaW4gYSBmb3JtYXR0ZWQgZG9jdW1lbnQuCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbmRlbnQgdXNpbmcgdGFiczwvc3Bhbj4gaWYgeW91IHdhbnQgdG8KLXVzZSB0YWIgY2hhcmFjdGVycyAoXHQpIGFzIHRoZSBzdGFuZGFyZCBmb3JtYXR0aW5nIGluZGVudGF0aW9uLCBvciwgaWYgeW91Ci1wcmVmZXIgdG8gdXNlIHNwYWNlcywgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluZGVudCB1c2luZyBzcGFjZXM8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91IGNhbiBhbHNvIHNwZWNpZnkgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluZGVudGF0aW9uIHNpemU8L3NwYW4+IHdoaWNoCi1pcyB0aGUgbnVtYmVyIG9mIHRhYnMgb3Igc3BhY2UgY2hhcmFjdGVycyB1c2VkIGZvciBmb3JtYXR0aW5nIGluZGVudGF0aW9uLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91IGNhbiBzcGVjaWZ5IGNlcnRhaW4gY2hhcmFjdGVycyAodGhlIGRlZmF1bHQgY29tbWFuZAotaXMgJmx0Oz0pIHRoYXQgd2lsbCBjYXVzZSB0aGUgY29udGVudCBhc3Npc3QgbGlzdCB0byBwb3AgdXAgYXV0b21hdGljYWxseS4KLUVuc3VyZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXV0b21hdGljYWxseSBtYWtlIHN1Z2dlc3Rpb25zPC9zcGFuPiBjaGVjayBib3gKLWlzIHNlbGVjdGVkIGFuZCBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXJzIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9tcHQgd2hlbiB0aGVzZQotY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQ8L3NwYW4+IGZpZWxkLiA8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugc2VsZWN0IDxzdHJvbmc+U3RyaWN0PC9zdHJvbmc+IGZyb20gdGhlIDxzdHJvbmc+U3VnZ2VzdGlvbiBzdHJhdGVneTwvc3Ryb25nPiBsaXN0LAotc3VnZ2VzdGlvbnMgdGhhdCBhcmUgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsIGJlIHNob3duIGZpcnN0ICh3aXRoIGJvbGQgaWNvbnMpCi1pbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdC4gT3RoZXIgc3VnZ2VzdGlvbnMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGUgZWxlbWVudAotc2NvcGUsIGJ1dCBub3QgZ3JhbW1hdGljYWxseSB2YWxpZCwgd2lsbCBiZSBzaG93biBiZWxvdyB0aGVtIHdpdGggYSBkZS1lbXBoYXNpemVkCi1pY29uLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBmaWVsZCBpcyA8c3Ryb25nPlN0cmljdDwvc3Ryb25nPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VXNlIGluZmVycmVkIGdyYW1tYXIgaW4gYWJzZW5jZSBvZiBEVEQvU2NoZW1hPC9zcGFuPiBjaGVjawotYm94IGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQuIDwvc3Bhbj4gSWYgdGhpcyBib3ggaXMgc2VsZWN0ZWQsIHdoZW4geW91Ci1oYXZlIGFuIFhNTCBmaWxlIHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCB5b3Ugd2lsbAotc3RpbGwgYmUgYWJsZSB0byBnZXQgY29udGVudCBhc3Npc3QgLSB0aGUgdG9vbCB3aWxsIGluZmVyIHdoYXQgc2hvdWxkIGNvbWUKLW5leHQgaW4geW91ciBmaWxlIGJhc2VkIG9uIHRoZSBleGlzdGluZyBjb250ZW50LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXBwbHk8L3NwYW4+IGFuZCB0aGVuIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0bwotc2F2ZSB5b3VyIGNoYW5nZXMuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4c2l0eXAuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhzaXR5cC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmVkOTczLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhzaXR5cC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0eHNpdHlwIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Vc2luZyB4c2k6dHlwZTwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+VXNpbmcgeHNpOnR5cGU8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+SWYgeW91IGhhdmUgZWxlbWVudHMgaW4geW91ciBYTUwgZmlsZSB3aG9zZSB0eXBlIGlzIGEgY29tcGxleCB0eXBlLA0KLXhzaTp0eXBlIHN1cHBvcnQgaW4gdGhlIFhNTCBlZGl0b3IgbGV0cyB5b3UgY2hvb3NlIGJldHdlZW4gdGhlIGNvbXBsZXggdHlwZQ0KLWFuZCBhbnkgb3RoZXIgY29tcGxleCB0eXBlcyBkZXJpdmVkIGZyb20gaXQuPC9zaG9ydGRlc2M+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb24gYWxsb3dzIHlvdSB0byBkZXJpdmUgdHlwZXMgYnkgZXh0ZW5zaW9uLg0KLVNlZSB0aGUgZm9sbG93aW5nIHN0ZXBzIGFzIGFuIGV4YW1wbGU8P1B1YiBDYXJldD8+OjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q3JlYXRlIGFuIFhNTCBzY2hlbWEgYW5kIGNyZWF0ZSBhIGNvbXBsZXggdHlwZSBmb3IgaXQgY2FsbGVkICA8dXNlcmlucHV0PkFkZHJlc3M8L3VzZXJpbnB1dD4uIDwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkFkZCBzb21lIGJhc2ljIGVsZW1lbnRzIHRvIDx1c2VyaW5wdXQ+QWRkcmVzczwvdXNlcmlucHV0Piwgc3VjaA0KLWFzIDx1c2VyaW5wdXQ+c3RyZWV0TmFtZTwvdXNlcmlucHV0PiBhbmQgPHVzZXJpbnB1dD5jaXR5PC91c2VyaW5wdXQ+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkRlcml2ZSAoYnkgZXh0ZW5zaW9uKSB0d28gbmV3IGNvbXBsZXggdHlwZXMgZnJvbSA8dXNlcmlucHV0PkFkZHJlc3M8L3VzZXJpbnB1dD46IDx1c2VyaW5wdXQ+VVNBZGRyZXNzPC91c2VyaW5wdXQ+IGFuZCA8dXNlcmlucHV0PlVLQWRkcmVzczwvdXNlcmlucHV0DQotPi4gPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+QWRkIGEgbmV3IGVsZW1lbnQgdG8gPHVzZXJpbnB1dD5VU0FkZHJlc3M8L3VzZXJpbnB1dD4gY2FsbGVkICA8dXNlcmlucHV0PnN0YXRlPC91c2VyaW5wdXQ+LA0KLWFuZCBhbHNvIGEgbmV3IGVsZW1lbnQgdG8gPHVzZXJpbnB1dD5VS0FkZHJlc3M8L3VzZXJpbnB1dD4gY2FsbGVkIDx1c2VyaW5wdXQ+cG9zdGNvZGU8L3VzZXJpbnB1dD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q3JlYXRlIHR3byBtb3JlIGVsZW1lbnRzOiA8dXNlcmlucHV0PmJpbGxUbzwvdXNlcmlucHV0PiBhbmQgPHVzZXJpbnB1dD5zaGlwVG88L3VzZXJpbnB1dD4sDQotYXMgIDxzeXN0ZW1vdXRwdXQ+QWRkcmVzczwvc3lzdGVtb3V0cHV0PiB0eXBlcy48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5XaGVuIHlvdSBjcmVhdGUgYW4gWE1MIGluc3RhbmNlIGRvY3VtZW50IGZvciBhbiBlbGVtZW50IHN1Y2ggYXMNCi0gPHN5c3RlbW91dHB1dD5iaWxsVG88L3N5c3RlbW91dHB1dD4gb3IgIDx1c2VyaW5wdXQ+QWRkcmVzczwvdXNlcmlucHV0PiwgYW4NCi14c2k6dHlwZSBhdHRyaWJ1dGUgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGFkZGVkIHRvIGl0LjwvY21kPjxpbmZvPkZvciBleGFtcGxlLCA8Y29kZWJsb2NrPiZsdDtiaWxsVG8geHNpOnR5cGU9ImlwbzpBZGRyZXNzIj48L2NvZGVibG9jaz5UaGUNCi14c2k6dHlwZSBhdHRyaWJ1dGUgaXMgdXNlZCB0byBpZGVudGlmeSBkZXJpdmVkIGNvbXBsZXggdHlwZXMgKGFzIHdlbGwgYXMgY29tcGxleA0KLXR5cGVzIHRoYXQgaGF2ZSBiZWVuIGRlcml2ZWQgZnJvbSkuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgYSBsaXN0IHdpbGwgYmUgYXZhaWxhYmxlLA0KLWxldHRpbmcgeW91IHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdHlwZSBkZWZpbml0aW9uICg8dWljb250cm9sPkFkZHJlc3M8L3VpY29udHJvbD4sIDx1aWNvbnRyb2w+VVNBZGRyZXNzPC91aWNvbnRyb2w+LA0KLW9yICA8dWljb250cm9sPlVLQWRkcmVzczwvdWljb250cm9sPikuIFRoZSBndWlkZWQgZWRpdGluZyBmb3IgdGhlIGNvbnRlbnQNCi1tb2RlbCB3aWxsIHJlZmxlY3QgdGhlIHR5cGUgZGVmaW5pdGlvbiB0aGF0IHlvdSBjaG9vc2UuIEZvciBleGFtcGxlLCBpZiB5b3UNCi1zZWxlY3QgIDx1aWNvbnRyb2w+VVNBZGRyZXNzPC91aWNvbnRyb2w+ICwgeW91ciA8Y29kZXBoPmJpbGxUbzwvY29kZXBoPiBlbGVtZW50DQotY2FuIGNvbnRhaW4gYSA8Y29kZXBoPnN0YXRlPC9jb2RlcGg+IGVsZW1lbnQsIGJ1dCBpdCBjYW5ub3QgY29udGFpbiBhIDxjb2RlcGg+cG9zdGNvZGU8L2NvZGVwaD4gZWxlbWVudC48L2NtZD4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT48cD5UaGUgWE1MIGV4YW1wbGUgIkVkaXRpbmcgYW5kIHZhbGlkYXRpbmcgWE1MIGZpbGVzIiBkZW1vbnN0cmF0ZXMgPGI+eHNpOnR5cGU8L2I+IHN1cHBvcnQuPC9wPjxwPkZvcg0KLW1vcmUgaW5mb3JtYXRpb24gYWJvdXQgeHNpOnR5cGUsIHJlZmVyIHRvIHRoZSA8Yj5Vc2luZyBEZXJpdmVkIFR5cGVzIGluIEluc3RhbmNlDQotRG9jdW1lbnRzPC9iPiBzZWN0aW9uIGluIDx4cmVmIGZvcm1hdD0iaHRtbCIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTAvI1VzZURlcml2SW5JbnN0RG9jcyINCi1zY29wZT0iZXh0ZXJuYWwiPlhNTCBTY2hlbWEgUGFydCAwOiBQcmltZXIuPC94cmVmPjwvcD48cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbg0KLWFib3V0IHZhbGlkYXRpb24gc2VtYW50aWNzIHdoZW4geHNpOnR5cGUgaXMgdXNlZCwgcmVmZXIgdG8gdGhlIDxiPlNjaGVtYS1SZWxhdGVkDQotTWFya3VwIGluIERvY3VtZW50cyBCZWluZyBWYWxpZGF0ZWQ8L2I+IHNlY3Rpb24gaW4gIDx4cmVmIGZvcm1hdD0iaHRtbCIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI3hzaV90eXBlIg0KLXNjb3BlPSJleHRlcm5hbCI+WE1MIFNjaGVtYSBQYXJ0IDE6IFN0cnVjdHVyZXM8L3hyZWY+IDwvcD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDMxNTQ/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhzaXR5cC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHNpdHlwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYzQ2NDEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHNpdHlwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwOCIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJVc2luZyB4c2k6dHlwZSIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJJZiB5b3UgaGF2ZSBlbGVtZW50cyBpbiB5b3VyIFhNTCBmaWxlIHdob3NlIHR5cGUgaXMgYSBjb21wbGV4IHR5cGUsIHhzaTp0eXBlIHN1cHBvcnQgaW4gdGhlIFhNTCBlZGl0b3IgbGV0cyB5b3UgY2hvb3NlIGJldHdlZW4gdGhlIGNvbXBsZXggdHlwZSBhbmQgYW55IG90aGVyIGNvbXBsZXggdHlwZXMgZGVyaXZlZCBmcm9tIGl0LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJZiB5b3UgaGF2ZSBlbGVtZW50cyBpbiB5b3VyIFhNTCBmaWxlIHdob3NlIHR5cGUgaXMgYSBjb21wbGV4IHR5cGUsIHhzaTp0eXBlIHN1cHBvcnQgaW4gdGhlIFhNTCBlZGl0b3IgbGV0cyB5b3UgY2hvb3NlIGJldHdlZW4gdGhlIGNvbXBsZXggdHlwZSBhbmQgYW55IG90aGVyIGNvbXBsZXggdHlwZXMgZGVyaXZlZCBmcm9tIGl0LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0eHNpdHlwIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+VXNpbmcgeHNpOnR5cGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR4c2l0eXAiPjxhIG5hbWU9InR4c2l0eXAiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlVzaW5nIHhzaTp0eXBlPC9oMT4KLQotCi0KLTxkaXY+PHA+SWYgeW91IGhhdmUgZWxlbWVudHMgaW4geW91ciBYTUwgZmlsZSB3aG9zZSB0eXBlIGlzIGEgY29tcGxleCB0eXBlLAoteHNpOnR5cGUgc3VwcG9ydCBpbiB0aGUgWE1MIGVkaXRvciBsZXRzIHlvdSBjaG9vc2UgYmV0d2VlbiB0aGUgY29tcGxleCB0eXBlCi1hbmQgYW55IG90aGVyIGNvbXBsZXggdHlwZXMgZGVyaXZlZCBmcm9tIGl0LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbiBhbGxvd3MgeW91IHRvIGRlcml2ZSB0eXBlcyBieSBleHRlbnNpb24uCi1TZWUgdGhlIGZvbGxvd2luZyBzdGVwcyBhcyBhbiBleGFtcGxlOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNyZWF0ZSBhbiBYTUwgc2NoZW1hIGFuZCBjcmVhdGUgYSBjb21wbGV4IHR5cGUgZm9yIGl0IGNhbGxlZCAgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5BZGRyZXNzPC9rYmQ+LiA8L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkFkZCBzb21lIGJhc2ljIGVsZW1lbnRzIHRvIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+QWRkcmVzczwva2JkPiwgc3VjaAotYXMgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5zdHJlZXROYW1lPC9rYmQ+IGFuZCA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPmNpdHk8L2tiZD4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5EZXJpdmUgKGJ5IGV4dGVuc2lvbikgdHdvIG5ldyBjb21wbGV4IHR5cGVzIGZyb20gPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5BZGRyZXNzPC9rYmQ+OiA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPlVTQWRkcmVzczwva2JkPiBhbmQgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5VS0FkZHJlc3M8L2tiZD4uIDwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkFkZCBhIG5ldyBlbGVtZW50IHRvIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+VVNBZGRyZXNzPC9rYmQ+IGNhbGxlZCAgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5zdGF0ZTwva2JkPiwKLWFuZCBhbHNvIGEgbmV3IGVsZW1lbnQgdG8gPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5VS0FkZHJlc3M8L2tiZD4gY2FsbGVkIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+cG9zdGNvZGU8L2tiZD4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DcmVhdGUgdHdvIG1vcmUgZWxlbWVudHM6IDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+YmlsbFRvPC9rYmQ+IGFuZCA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPnNoaXBUbzwva2JkPiwKLWFzICA8dHQgY2xhc3M9InN5c291dCI+QWRkcmVzczwvdHQ+IHR5cGVzLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPldoZW4geW91IGNyZWF0ZSBhbiBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgZm9yIGFuIGVsZW1lbnQgc3VjaCBhcwotIDx0dCBjbGFzcz0ic3lzb3V0Ij5iaWxsVG88L3R0PiBvciAgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5BZGRyZXNzPC9rYmQ+LCBhbgoteHNpOnR5cGUgYXR0cmlidXRlIHdpbGwgYXV0b21hdGljYWxseSBiZSBhZGRlZCB0byBpdC48L3NwYW4+IEZvciBleGFtcGxlLCA8cHJlPiZsdDtiaWxsVG8geHNpOnR5cGU9ImlwbzpBZGRyZXNzIiZndDs8L3ByZT4KLVRoZQoteHNpOnR5cGUgYXR0cmlidXRlIGlzIHVzZWQgdG8gaWRlbnRpZnkgZGVyaXZlZCBjb21wbGV4IHR5cGVzIChhcyB3ZWxsIGFzIGNvbXBsZXgKLXR5cGVzIHRoYXQgaGF2ZSBiZWVuIGRlcml2ZWQgZnJvbSkuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgRGVzaWduIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IsIGEgbGlzdCB3aWxsIGJlIGF2YWlsYWJsZSwKLWxldHRpbmcgeW91IHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdHlwZSBkZWZpbml0aW9uICg8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGRyZXNzPC9zcGFuPiwgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VVNBZGRyZXNzPC9zcGFuPiwKLW9yICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5VS0FkZHJlc3M8L3NwYW4+KS4gVGhlIGd1aWRlZCBlZGl0aW5nIGZvciB0aGUgY29udGVudAotbW9kZWwgd2lsbCByZWZsZWN0IHRoZSB0eXBlIGRlZmluaXRpb24gdGhhdCB5b3UgY2hvb3NlLiBGb3IgZXhhbXBsZSwgaWYgeW91Ci1zZWxlY3QgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVTQWRkcmVzczwvc3Bhbj4gLCB5b3VyIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmJpbGxUbzwvc2FtcD4gZWxlbWVudAotY2FuIGNvbnRhaW4gYSA8c2FtcCBjbGFzcz0iY29kZXBoIj5zdGF0ZTwvc2FtcD4gZWxlbWVudCwgYnV0IGl0IGNhbm5vdCBjb250YWluIGEgPHNhbXAgY2xhc3M9ImNvZGVwaCI+cG9zdGNvZGU8L3NhbXA+IGVsZW1lbnQuPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIFhNTCBleGFtcGxlICJFZGl0aW5nIGFuZCB2YWxpZGF0aW5nIFhNTCBmaWxlcyIgZGVtb25zdHJhdGVzIDxzdHJvbmc+eHNpOnR5cGU8L3N0cm9uZz4gc3VwcG9ydC48L3A+Ci08cD5Gb3IKLW1vcmUgaW5mb3JtYXRpb24gYWJvdXQgeHNpOnR5cGUsIHJlZmVyIHRvIHRoZSA8c3Ryb25nPlVzaW5nIERlcml2ZWQgVHlwZXMgaW4gSW5zdGFuY2UKLURvY3VtZW50czwvc3Ryb25nPiBzZWN0aW9uIGluIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0wLyNVc2VEZXJpdkluSW5zdERvY3MiIHRhcmdldD0iX2JsYW5rIj5YTUwgU2NoZW1hIFBhcnQgMDogUHJpbWVyLjwvYT48L3A+Ci08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbgotYWJvdXQgdmFsaWRhdGlvbiBzZW1hbnRpY3Mgd2hlbiB4c2k6dHlwZSBpcyB1c2VkLCByZWZlciB0byB0aGUgPHN0cm9uZz5TY2hlbWEtUmVsYXRlZAotTWFya3VwIGluIERvY3VtZW50cyBCZWluZyBWYWxpZGF0ZWQ8L3N0cm9uZz4gc2VjdGlvbiBpbiAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI3hzaV90eXBlIiB0YXJnZXQ9Il9ibGFuayI+WE1MIFNjaGVtYSBQYXJ0IDE6IFN0cnVjdHVyZXM8L2E+IDwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOWIwNjUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZV8xLjAuMC5iaW4uZGlzdC56aXAKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMGNlMWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNiZWQ1Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgV2ViIENvcmUKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1XZWIgdG9vbHMgY29yZS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ0NTk4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFmMWU2ZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdlYiBTdGFuZGFyZCBUb29scyAtIFdlYiBDb3JlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkNTEyZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWQzOGQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gV2ViIENvcmUgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI0OWU5Zi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPVwKLWVwbC12MTAuaHRtbCxcCi1lY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLWZlYXR1cmUueG1sLFwKLWZlYXR1cmUucHJvcGVydGllcyxcCi1saWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MjYwYTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBXZWIgQ29yZSBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgV1NUIFdlYiBjb3JlLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjNGE0OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5KdW5lIDA2LCAyMDA3PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MWQ0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE1YTQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmYjczNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncw0KLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLg0KLQ0KLTA9QGJ1aWxkQA0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWYxZTZlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9V2ViIFN0YW5kYXJkIFRvb2xzIC0gV2ViIENvcmVcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWQ1MTJkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZDM4ZDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1XZWIgU3RhbmRhcmQgVG9vbHMgLSBXZWIgQ29yZSBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZDMwMmUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1idWlsZC54bWwKLWZlYXR1cmVzCi1wbHVnaW5zCi1vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlXzEuMC4wLmJpbi5kaXN0LnppcApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3OWY4NGIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMjQ0YTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUsIGZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUuc291cmNlCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZTJlZjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgV2ViIFBsdWctaW4gRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIHRoZSBXU1Qgd2ViIHRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+Ci0gICAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0YjQ3Ny4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0ODI5Yi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFdlYiBVSQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVdlYiBVSSB0b29scy4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NDQ1OTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MWQ0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE1YTQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTk1YzBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdlYiBTdGFuZGFyZCBUb29scyAtIFdlYiBVSVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhNTc1Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NTZmYjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gV2ViIFVJIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4YTYxOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUuc291cmNlID0gb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDkyZjEyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFdlYiBVSSBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgV1NUIFdlYiBVSS4KLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWM0YTQ4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5KdW5lIDA2LCAyMDA3PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGZiNzM1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncw0KLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLg0KLQ0KLTA9QGJ1aWxkQA0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxOTVjMGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9V2ViIFN0YW5kYXJkIFRvb2xzIC0gV2ViIFVJXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGE1NzVjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1NmZiOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1XZWIgU3RhbmRhcmQgVG9vbHMgLSBXZWIgVUkgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjQ0YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2VhYjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZmUxNzQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZV8xLjAuMC5qYXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNWViMzEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVhMTIxNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgV2ViIFVzZXIgRG9jdW1lbnRhdGlvbgotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVdTVCBXZWIgdXNlciBkb2N1bWVudGF0aW9uCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkODJkYjguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ0NTk4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgICAKLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMzVhZTEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZV8xLjUuMC4yMDA2MDUwODAxMDQuYmluLmRpc3QuemlwCi1kZXYucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhZTI0OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDA5Mjc2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBNYXkgMDggMDk6MTA6MjcgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NDQ4MGIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NDRmNTkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFhNTCBDb3JlCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249V1NUIFhNTCBjb3JlLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2Q3ZTlmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIgdmVyc2lvbj0iMy40LjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbiIgdmVyc2lvbj0iMi40LjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlIiB2ZXJzaW9uPSIyLjQuMCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS54c2QiIHZlcnNpb249IjIuNC4wIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iamF2YXgueG1sIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMTkwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIxOTAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjMuNC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLnhtbC5yZXNvbHZlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9Ijk2IgotICAgICAgICAgaW5zdGFsbC1zaXplPSI5NiIKLSAgICAgICAgIHZlcnNpb249IjEuMi4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIyNzAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjI3MCIKLSAgICAgICAgIHZlcnNpb249IjIuNy4xLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUueGVyY2VzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMTIwMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMTIwMCIKLSAgICAgICAgIHZlcnNpb249IjIuOS4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5zdGFuZGFyZC5zY2hlbWFzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwM2U2NjUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikKLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLSAgCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgPC9MST4KLSAgCi0gIDxsaT5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTgxZDQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTVhNDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYzI3MTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBYTUwgQ29yZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZDUxMmQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY0Mzc3Ny4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIFhNTCBDb3JlIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNDllOWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTI4MmFhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgWE1MIENvcmUgRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIFdTVCBYTUwgY29yZS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzRhNDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+SnVuZSAwNiwgMjAwNzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmI3MzUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MNCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4NCi0NCi0wPUBidWlsZEANCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFjMjcxNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdlYiBTdGFuZGFyZCBUb29scyAtIFhNTCBDb3JlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkNTEyZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjQzNzc3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gWE1MIENvcmUgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Nzc0OTUyLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotZmVhdHVyZXMKLXBsdWdpbnMKLWJ1aWxkLnhtbAotZGV2LnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc1ZmE2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjQwNTBlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZSwgZmVhdHVyZUBvcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS5zb3VyY2UgCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzZmNTM1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBYTUwgRWRpdG9ycyBhbmQgVG9vbHMgU0RLCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgdGhlIFdTVCBYTUwgdG9vbHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSwgMjAwOFxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZTAwMTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzIAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb25fc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIgLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0gCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDNlNjY1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikKLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLSAgCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgPC9MST4KLSAgCi0gIDxsaT5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkzMThjNy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2FmZmM1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRmMzQxYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBYTUwgRWRpdG9ycyBhbmQgVG9vbHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1YTUwsIERURCBhbmQgWE1MIFNjaGVtYSBFZGl0b3JzLCB2YWxpZGF0b3JzLCBhbmQgWE1MIENhdGFsb2cgc3VwcG9ydAotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1KdW5lIDA2LCAyMDA3XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotICAgIC0gQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmM2VhNTcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIgdmVyc2lvbj0iMy40LjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbiIgdmVyc2lvbj0iMi40LjAudjIwMDgwNjAyMTY0MyIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdCIgdmVyc2lvbj0iMi40LjAudjIwMDgwNjAyMTY0MyIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSIgdmVyc2lvbj0iMi40LjAudjIwMDgwNjAyMTY0MyIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5nZWYiIHZlcnNpb249IjMuNC4wLnYyMDA4MDExNS02NzctODA4MkE1Njk2SDI3NDgiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UueHNkLmVkaXQiIHZlcnNpb249IjIuNC4wLnYyMDA4MDYwMjE2NDMiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNkLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzZTY2NS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KdW5lIDA2LCAyMDA3PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikKLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLSAgCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgPC9MST4KLSAgCi0gIDxsaT5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODFkNDYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08UD5KdW5lLCAyMDA4PC9QPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhNWE0MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT13dHBfcHJvZDMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlMTBlYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBYTUwgVUlcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYTU3NWMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgd3RwX3Byb2QzMi5wbmcsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWI1ZjRkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIFhNTCBVSSBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZiNDRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjZWFiMy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNzM3YWYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9XAotZXBsLXYxMC5odG1sLFwKLWVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotZmVhdHVyZS54bWwsXAotZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLWxpY2Vuc2UuaHRtbAotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDYwOWE5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFhNTCBVSSBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgV1NUIFhNTCBVSS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjNGE0OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+SnVuZSAwNiwgMjAwNzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLSAgPExJPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MWQ0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGE1YTQwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPXd0cF9wcm9kMzIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmYjczNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MNCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4NCi0NCi0wPUBidWlsZEANCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGUxMGVhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdlYiBTdGFuZGFyZCBUb29scyAtIFhNTCBVSVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhNTc1Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCB3dHBfcHJvZDMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YjVmNGQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gWE1MIFVJIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMzkxYjIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjliMzYzOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgWE1MIFVzZXIgRG9jdW1lbnRhdGlvbgotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVdTVCBYTUwgdXNlciBkb2N1bWVudGF0aW9uCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3M2Y3OTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzZTY2NS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KQotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotICAKLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSA8L0xJPgotICAKLSAgPGxpPkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCI+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKTwvQT4KLSAgPC9MST4KLTwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgo=